From 6459045aef610e18f71a787085c10d2c0ecdb576 Mon Sep 17 00:00:00 2001 From: Luya Tshimbalanga Date: Mon, 28 Mar 2022 23:27:27 -0700 Subject: [PATCH] New upstream release 6.9.12.44 --- .gitignore | 13 + ImageMagick-6.9.12-44/AUTHORS.txt | 157 + ImageMagick-6.9.12-44/ChangeLog.md | 904 + ImageMagick-6.9.12-44/ImageMagick.spec.in | 295 + ImageMagick-6.9.12-44/Install-mac.txt | 98 + ImageMagick-6.9.12-44/Install-unix.txt | 658 + ImageMagick-6.9.12-44/Install-vms.txt | 33 + ImageMagick-6.9.12-44/Install-windows.txt | 2 + ImageMagick-6.9.12-44/LICENSE | 103 + ImageMagick-6.9.12-44/Magick++/AUTHORS | 19 + ImageMagick-6.9.12-44/Magick++/ChangeLog | 1544 + ImageMagick-6.9.12-44/Magick++/INSTALL | 164 + ImageMagick-6.9.12-44/Magick++/LICENSE | 24 + ImageMagick-6.9.12-44/Magick++/Makefile.am | 266 + ImageMagick-6.9.12-44/Magick++/NEWS | 383 + ImageMagick-6.9.12-44/Magick++/README | 55 + .../Magick++/bin/Magick++-config.1 | 99 + .../Magick++/bin/Magick++-config.in | 65 + .../Magick++/demo/analyze.cpp | 71 + .../Magick++/demo/button.cpp | 102 + ImageMagick-6.9.12-44/Magick++/demo/demo.cpp | 516 + ImageMagick-6.9.12-44/Magick++/demo/demos.tap | 29 + .../Magick++/demo/detrans.cpp | 60 + ImageMagick-6.9.12-44/Magick++/demo/flip.cpp | 60 + .../Magick++/demo/gravity.cpp | 83 + .../Magick++/demo/model.miff | Bin 0 -> 25564 bytes .../Magick++/demo/piddle.cpp | 182 + .../Magick++/demo/shapes.cpp | 121 + .../Magick++/demo/smile.miff | Bin 0 -> 4814 bytes .../Magick++/demo/smile_anim.miff | Bin 0 -> 15448 bytes ImageMagick-6.9.12-44/Magick++/demo/tile.miff | Bin 0 -> 6025 bytes ImageMagick-6.9.12-44/Magick++/demo/zoom.cpp | 191 + .../Magick++/examples/analyze.cpp | 71 + .../Magick++/examples/button.cpp | 102 + .../Magick++/examples/demo.cpp | 516 + .../Magick++/examples/detrans.cpp | 60 + .../Magick++/examples/flip.cpp | 60 + .../Magick++/examples/gravity.cpp | 83 + .../Magick++/examples/model.miff | Bin 0 -> 25564 bytes .../Magick++/examples/piddle.cpp | 182 + .../Magick++/examples/shapes.cpp | 121 + .../Magick++/examples/smile.miff | Bin 0 -> 4814 bytes .../Magick++/examples/smile_anim.miff | Bin 0 -> 15448 bytes .../Magick++/examples/tile.miff | Bin 0 -> 6025 bytes .../Magick++/examples/zoom.cpp | 191 + ImageMagick-6.9.12-44/Magick++/lib/Blob.cpp | 170 + .../Magick++/lib/BlobRef.cpp | 44 + .../Magick++/lib/ChannelMoments.cpp | 187 + .../Magick++/lib/CoderInfo.cpp | 129 + ImageMagick-6.9.12-44/Magick++/lib/Color.cpp | 619 + .../Magick++/lib/Drawable.cpp | 2311 + .../Magick++/lib/Exception.cpp | 984 + .../Magick++/lib/Functions.cpp | 73 + .../Magick++/lib/Geometry.cpp | 488 + ImageMagick-6.9.12-44/Magick++/lib/Image.cpp | 5206 +++ .../Magick++/lib/ImageMagick++.pc.in | 14 + .../Magick++/lib/ImageRef.cpp | 70 + ImageMagick-6.9.12-44/Magick++/lib/Magick++.h | 23 + .../Magick++/lib/Magick++.pc.in | 14 + .../Magick++/lib/Magick++/Blob.h | 80 + .../Magick++/lib/Magick++/BlobRef.h | 44 + .../Magick++/lib/Magick++/ChannelMoments.h | 103 + .../Magick++/lib/Magick++/CoderInfo.h | 81 + .../Magick++/lib/Magick++/Color.h | 524 + .../Magick++/lib/Magick++/Drawable.h | 3041 ++ .../Magick++/lib/Magick++/Exception.h | 425 + .../Magick++/lib/Magick++/Functions.h | 37 + .../Magick++/lib/Magick++/Geometry.h | 344 + .../Magick++/lib/Magick++/Image.h | 1647 + .../Magick++/lib/Magick++/ImageRef.h | 77 + .../Magick++/lib/Magick++/Include.h | 1537 + .../Magick++/lib/Magick++/Montage.h | 373 + .../Magick++/lib/Magick++/Options.h | 352 + .../Magick++/lib/Magick++/Pixels.h | 149 + .../Magick++/lib/Magick++/ResourceLimits.h | 76 + .../Magick++/lib/Magick++/STL.h | 2855 ++ .../Magick++/lib/Magick++/Thread.h | 100 + .../Magick++/lib/Magick++/TypeMetric.h | 59 + .../Magick++/lib/Montage.cpp | 119 + .../Magick++/lib/Options.cpp | 1053 + ImageMagick-6.9.12-44/Magick++/lib/Pixels.cpp | 194 + .../Magick++/lib/ResourceLimits.cpp | 115 + ImageMagick-6.9.12-44/Magick++/lib/STL.cpp | 1728 + ImageMagick-6.9.12-44/Magick++/lib/Thread.cpp | 102 + .../Magick++/lib/TypeMetric.cpp | 59 + .../Magick++/lib/libMagick++.map | 4 + .../Magick++/tests/appendImages.cpp | 93 + .../Magick++/tests/attributes.cpp | 1517 + .../Magick++/tests/averageImages.cpp | 75 + .../Magick++/tests/coalesceImages.cpp | 62 + .../Magick++/tests/coderInfo.cpp | 134 + .../Magick++/tests/color.cpp | 154 + .../Magick++/tests/colorHistogram.cpp | 101 + .../Magick++/tests/exceptions.cpp | 102 + .../Magick++/tests/montageImages.cpp | 140 + .../Magick++/tests/morphImages.cpp | 71 + .../Magick++/tests/readWriteBlob.cpp | 255 + .../Magick++/tests/readWriteImages.cpp | 178 + .../Magick++/tests/test_image.miff | Bin 0 -> 44083 bytes .../Magick++/tests/test_image_anim.miff | Bin 0 -> 15229 bytes .../Magick++/tests/tests.tap | 22 + ImageMagick-6.9.12-44/Magickshr.opt | 252 + ImageMagick-6.9.12-44/Makefile.am | 390 + ImageMagick-6.9.12-44/Makefile.in | 13040 ++++++ ImageMagick-6.9.12-44/NEWS.txt | 33 + ImageMagick-6.9.12-44/NOTICE | 240 + ImageMagick-6.9.12-44/PerlMagick/Changelog | 122 + ImageMagick-6.9.12-44/PerlMagick/MANIFEST | 552 + .../PerlMagick/MANIFEST.SKIP | 16 + ImageMagick-6.9.12-44/PerlMagick/Makefile.PL | 271 + .../PerlMagick/Makefile.PL.in | 271 + ImageMagick-6.9.12-44/PerlMagick/Makefile.am | 138 + ImageMagick-6.9.12-44/PerlMagick/Makefile.nt | 169 + ImageMagick-6.9.12-44/PerlMagick/README.txt | 137 + ImageMagick-6.9.12-44/PerlMagick/check.sh | 52 + ImageMagick-6.9.12-44/PerlMagick/check.sh.in | 52 + .../PerlMagick/default/Magick.pm | 69 + .../PerlMagick/default/Magick.pm.in | 69 + .../PerlMagick/default/Makefile.PL | 271 + .../PerlMagick/default/Makefile.PL.in | 271 + .../PerlMagick/demo/Generic.ttf | Bin 0 -> 18444 bytes .../PerlMagick/demo/Makefile | 17 + ImageMagick-6.9.12-44/PerlMagick/demo/README | 6 + .../PerlMagick/demo/Turtle.pm | 57 + .../PerlMagick/demo/annotate.pl | 41 + .../PerlMagick/demo/annotate_words.pl | 71 + .../PerlMagick/demo/button.pl | 15 + .../PerlMagick/demo/compose-specials.pl | 252 + .../PerlMagick/demo/composite.pl | 39 + ImageMagick-6.9.12-44/PerlMagick/demo/demo.pl | 519 + ImageMagick-6.9.12-44/PerlMagick/demo/dst.png | Bin 0 -> 437 bytes ImageMagick-6.9.12-44/PerlMagick/demo/lsys.pl | 83 + .../PerlMagick/demo/model.gif | Bin 0 -> 23433 bytes .../PerlMagick/demo/piddle.pl | 66 + .../PerlMagick/demo/pink-flower.gif | Bin 0 -> 544 bytes .../PerlMagick/demo/pixel-fx.pl | 53 + .../PerlMagick/demo/red-flower.gif | Bin 0 -> 694 bytes .../PerlMagick/demo/settings.pl | 32 + .../PerlMagick/demo/shadow-text.pl | 15 + .../PerlMagick/demo/shapes.pl | 40 + .../PerlMagick/demo/single-pixels.pl | 48 + .../PerlMagick/demo/smile.gif | Bin 0 -> 1349 bytes ImageMagick-6.9.12-44/PerlMagick/demo/src.png | Bin 0 -> 400 bytes .../PerlMagick/demo/steganography.pl | 26 + .../PerlMagick/demo/tile.gif | Bin 0 -> 1566 bytes ImageMagick-6.9.12-44/PerlMagick/demo/tree.pl | 35 + .../PerlMagick/demo/yellow-flower.gif | Bin 0 -> 565 bytes .../PerlMagick/quantum/Makefile.PL | 270 + .../PerlMagick/quantum/Makefile.PL.in | 270 + .../PerlMagick/quantum/quantum.pm | 144 + .../PerlMagick/quantum/quantum.pm.in | 144 + .../PerlMagick/quantum/quantum.xs | 14586 ++++++ .../PerlMagick/quantum/quantum.xs.in | 14586 ++++++ .../PerlMagick/quantum/typemap | 1 + .../PerlMagick/quantum/typemap.in | 1 + .../PerlMagick/t/MasterImage_70x46.ppm | 4 + ImageMagick-6.9.12-44/PerlMagick/t/blob.t | 39 + .../PerlMagick/t/bzlib/input.miff | 9 + .../PerlMagick/t/bzlib/input.miff.bz2 | Bin 0 -> 9093 bytes .../PerlMagick/t/bzlib/read.t | 30 + .../PerlMagick/t/bzlib/write.t | 27 + .../PerlMagick/t/cgm/input.cgm | 1 + ImageMagick-6.9.12-44/PerlMagick/t/cgm/read.t | 20 + .../PerlMagick/t/composite.t | 167 + ImageMagick-6.9.12-44/PerlMagick/t/filter.t | 207 + .../PerlMagick/t/fpx/input_256.fpx | Bin 0 -> 80384 bytes .../PerlMagick/t/fpx/input_bw.fpx | Bin 0 -> 33792 bytes .../PerlMagick/t/fpx/input_grayscale.fpx | Bin 0 -> 33792 bytes .../PerlMagick/t/fpx/input_jpeg.fpx | Bin 0 -> 45056 bytes .../PerlMagick/t/fpx/input_truecolor.fpx | Bin 0 -> 80384 bytes ImageMagick-6.9.12-44/PerlMagick/t/fpx/read.t | 55 + .../PerlMagick/t/fpx/write.t | 49 + .../PerlMagick/t/getattribute.t | 103 + .../PerlMagick/t/hdf/input_256.hdf | Bin 0 -> 4189 bytes .../PerlMagick/t/hdf/input_truecolor.hdf | Bin 0 -> 9987 bytes ImageMagick-6.9.12-44/PerlMagick/t/hdf/read.t | 28 + .../PerlMagick/t/hdf/write.t | 32 + .../PerlMagick/t/hpgl/input.hpgl | 1 + .../PerlMagick/t/hpgl/read.t | 29 + ImageMagick-6.9.12-44/PerlMagick/t/input.avs | Bin 0 -> 12888 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.bie | Bin 0 -> 280 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.bmp | Bin 0 -> 6414 bytes .../PerlMagick/t/input.bmp24 | Bin 0 -> 9806 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.dcx | Bin 0 -> 15713 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.dib | Bin 0 -> 9792 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.fits | Bin 0 -> 8640 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.gif | Bin 0 -> 4037 bytes .../PerlMagick/t/input.gif87 | Bin 0 -> 4133 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.ico | Bin 0 -> 766 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.im1 | Bin 0 -> 492 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.im24 | Bin 0 -> 9692 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.im8 | Bin 0 -> 4020 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.mat | Bin 0 -> 65720 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.miff | 14 + ImageMagick-6.9.12-44/PerlMagick/t/input.mtv | 2 + ImageMagick-6.9.12-44/PerlMagick/t/input.p7 | Bin 0 -> 3254 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.pcx | Bin 0 -> 11613 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.pict | Bin 0 -> 10428 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.psd | Bin 0 -> 9700 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.rle | Bin 0 -> 10516 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.sgi | Bin 0 -> 11683 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.tga | Bin 0 -> 9678 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.tim | Bin 0 -> 1088 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.viff | Bin 0 -> 5012 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.wbmp | Bin 0 -> 418 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.wpg | Bin 0 -> 4625 bytes ImageMagick-6.9.12-44/PerlMagick/t/input.xbm | 38 + ImageMagick-6.9.12-44/PerlMagick/t/input.xpm | 308 + .../PerlMagick/t/input_16.miff | 9 + .../PerlMagick/t/input_70x46.cmyk | Bin 0 -> 12880 bytes .../PerlMagick/t/input_70x46.gray | 1 + .../PerlMagick/t/input_70x46.rgb | 1 + .../PerlMagick/t/input_70x46.rgba | 1 + .../PerlMagick/t/input_70x46.uyvy | 1 + .../PerlMagick/t/input_70x46.yuv | 1 + .../PerlMagick/t/input_gray_lsb_08bit.mat | Bin 0 -> 3456 bytes .../PerlMagick/t/input_gray_lsb_double.mat | Bin 0 -> 26312 bytes .../PerlMagick/t/input_gray_msb_08bit.mat | Bin 0 -> 20560 bytes .../PerlMagick/t/input_p1.pbm | 92 + .../PerlMagick/t/input_p2.pgm | 127 + .../PerlMagick/t/input_p3.ppm | 809 + .../PerlMagick/t/input_p4.pbm | Bin 0 -> 423 bytes .../PerlMagick/t/input_p5.pgm | 79 + .../PerlMagick/t/input_p6.ppm | 4 + .../PerlMagick/t/input_p7.p7 | Bin 0 -> 3254 bytes .../PerlMagick/t/input_rgb_lsb_08bit.mat | Bin 0 -> 9992 bytes .../PerlMagick/t/jbig/input.jbig | Bin 0 -> 281 bytes .../PerlMagick/t/jbig/read.t | 17 + .../PerlMagick/t/jbig/write.t | 22 + .../PerlMagick/t/jng/input_gray.jng | Bin 0 -> 996 bytes .../PerlMagick/t/jng/input_gray_idat.jng | Bin 0 -> 3874 bytes .../PerlMagick/t/jng/input_gray_jdaa.jng | Bin 0 -> 1946 bytes .../PerlMagick/t/jng/input_gray_prog.jng | Bin 0 -> 1110 bytes .../PerlMagick/t/jng/input_gray_prog_idat.jng | Bin 0 -> 3988 bytes .../PerlMagick/t/jng/input_gray_prog_jdaa.jng | Bin 0 -> 2178 bytes .../PerlMagick/t/jng/input_idat.jng | Bin 0 -> 4441 bytes .../PerlMagick/t/jng/input_jdaa.jng | Bin 0 -> 2278 bytes .../PerlMagick/t/jng/input_prog.jng | Bin 0 -> 1550 bytes .../PerlMagick/t/jng/input_prog_idat.jng | Bin 0 -> 4666 bytes .../PerlMagick/t/jng/input_prog_jdaa.jng | Bin 0 -> 2619 bytes .../PerlMagick/t/jng/input_rose.jng | Bin 0 -> 1325 bytes ImageMagick-6.9.12-44/PerlMagick/t/jng/read.t | 69 + .../PerlMagick/t/jng/write.t | 38 + .../PerlMagick/t/jpeg/input.jpg | Bin 0 -> 1564 bytes .../PerlMagick/t/jpeg/input_plane.jpg | Bin 0 -> 1805 bytes .../PerlMagick/t/jpeg/read.t | 29 + .../PerlMagick/t/jpeg/write.t | 33 + ImageMagick-6.9.12-44/PerlMagick/t/montage.t | 235 + .../PerlMagick/t/mpeg/input.m2v | Bin 0 -> 15924 bytes .../PerlMagick/t/mpeg/input.mpg | Bin 0 -> 11473 bytes .../PerlMagick/t/mpeg/read.t | 30 + .../PerlMagick/t/openjp2/input.j2k | Bin 0 -> 6350 bytes .../PerlMagick/t/openjp2/input.jp2 | Bin 0 -> 6410 bytes .../PerlMagick/t/openjp2/input.jpc | Bin 0 -> 6410 bytes .../PerlMagick/t/openjp2/read.t | 34 + ImageMagick-6.9.12-44/PerlMagick/t/ping.t | 63 + .../PerlMagick/t/png/input.mng | Bin 0 -> 12920 bytes .../PerlMagick/t/png/input_16.png | Bin 0 -> 2440 bytes .../PerlMagick/t/png/input_256.png | Bin 0 -> 3841 bytes .../PerlMagick/t/png/input_bw.png | Bin 0 -> 112 bytes .../PerlMagick/t/png/input_mono.png | Bin 0 -> 616 bytes .../PerlMagick/t/png/input_truecolor.png | Bin 0 -> 6967 bytes .../PerlMagick/t/png/read-16.t | 52 + ImageMagick-6.9.12-44/PerlMagick/t/png/read.t | 64 + .../PerlMagick/t/png/write-16.t | 61 + .../PerlMagick/t/png/write.t | 68 + .../PerlMagick/t/ps/input.eps | 132 + .../PerlMagick/t/ps/input.miff | 9 + .../PerlMagick/t/ps/input.ps | 134 + ImageMagick-6.9.12-44/PerlMagick/t/ps/read.t | 73 + ImageMagick-6.9.12-44/PerlMagick/t/ps/write.t | 30 + .../PerlMagick/t/rad/input.rad | Bin 0 -> 20051 bytes ImageMagick-6.9.12-44/PerlMagick/t/rad/read.t | 18 + .../PerlMagick/t/rad/write.t | 25 + ImageMagick-6.9.12-44/PerlMagick/t/read.t | 222 + .../PerlMagick/t/reference/cgm/read.miff | Bin 0 -> 107110 bytes .../PerlMagick/t/reference/composite/Add.miff | Bin 0 -> 24408 bytes .../t/reference/composite/Atop.miff | 16 + .../t/reference/composite/Bumpmap.miff | 298 + .../t/reference/composite/Clear.miff | Bin 0 -> 24408 bytes .../t/reference/composite/Copy.miff | 16 + .../t/reference/composite/CopyBlue.miff | 16 + .../t/reference/composite/CopyGreen.miff | 16 + .../t/reference/composite/CopyOpacity.miff | Bin 0 -> 32407 bytes .../t/reference/composite/CopyRed.miff | 16 + .../t/reference/composite/Difference.miff | 40 + .../PerlMagick/t/reference/composite/In.miff | 16 + .../t/reference/composite/Minus.miff | Bin 0 -> 24408 bytes .../t/reference/composite/Multiply.miff | 16 + .../PerlMagick/t/reference/composite/Out.miff | Bin 0 -> 24408 bytes .../t/reference/composite/Over.miff | 16 + .../t/reference/composite/Plus.miff | 16 + .../t/reference/composite/Rotate.miff | 12 + .../t/reference/composite/Subtract.miff | 30 + .../PerlMagick/t/reference/composite/Xor.miff | Bin 0 -> 24408 bytes .../t/reference/filter/AdaptiveThreshold.miff | Bin 0 -> 10051 bytes .../t/reference/filter/Annotate.miff | Bin 0 -> 13270 bytes .../PerlMagick/t/reference/filter/Blur.miff | 15 + .../PerlMagick/t/reference/filter/Border.miff | Bin 0 -> 14659 bytes .../t/reference/filter/Channel.miff | 106 + .../t/reference/filter/Charcoal.miff | Bin 0 -> 3482 bytes .../PerlMagick/t/reference/filter/Chop.miff | 15 + .../t/reference/filter/ColorFloodfill.miff | 15 + .../t/reference/filter/Colorize.miff | 15 + .../t/reference/filter/Contrast.miff | 15 + .../t/reference/filter/Convolve.miff | 15 + .../PerlMagick/t/reference/filter/Crop.miff | 15 + .../t/reference/filter/Despeckle.miff | 15 + .../PerlMagick/t/reference/filter/Draw.miff | 15 + .../PerlMagick/t/reference/filter/Edge.miff | Bin 0 -> 10051 bytes .../PerlMagick/t/reference/filter/Emboss.miff | Bin 0 -> 10006 bytes .../t/reference/filter/Equalize.miff | Bin 0 -> 10006 bytes .../PerlMagick/t/reference/filter/Flip.miff | 15 + .../PerlMagick/t/reference/filter/Flop.miff | 15 + .../PerlMagick/t/reference/filter/Frame.miff | 15 + .../PerlMagick/t/reference/filter/Gamma.miff | 15 + .../t/reference/filter/GaussianBlur.miff | 15 + .../t/reference/filter/Implode.miff | 15 + .../PerlMagick/t/reference/filter/Level.miff | Bin 0 -> 10051 bytes .../t/reference/filter/Magnify.miff | 15 + .../t/reference/filter/MatteFloodfill.miff | 15 + .../t/reference/filter/MedianFilter.miff | 15 + .../PerlMagick/t/reference/filter/Minify.miff | 15 + .../t/reference/filter/Modulate.miff | Bin 0 -> 10051 bytes .../t/reference/filter/MotionBlur.miff | 15 + .../PerlMagick/t/reference/filter/Negate.miff | Bin 0 -> 10051 bytes .../t/reference/filter/Normalize.miff | 15 + .../t/reference/filter/OilPaint.miff | 15 + .../PerlMagick/t/reference/filter/Opaque.miff | Bin 0 -> 10051 bytes .../t/reference/filter/Quantize.miff | Bin 0 -> 4381 bytes .../t/reference/filter/QuantizeMono.miff | Bin 0 -> 10051 bytes .../t/reference/filter/RadialBlur.miff | 15 + .../PerlMagick/t/reference/filter/Raise.miff | 15 + .../t/reference/filter/ReduceNoise.miff | 15 + .../PerlMagick/t/reference/filter/Resize.miff | 15 + .../PerlMagick/t/reference/filter/Roll.miff | 15 + .../PerlMagick/t/reference/filter/Rotate.miff | 15 + .../PerlMagick/t/reference/filter/Sample.miff | 15 + .../PerlMagick/t/reference/filter/Scale.miff | 15 + .../t/reference/filter/Segment.miff | Bin 0 -> 3589 bytes .../PerlMagick/t/reference/filter/Set.miff | 14 + .../PerlMagick/t/reference/filter/Shade.miff | Bin 0 -> 10051 bytes .../t/reference/filter/Sharpen.miff | Bin 0 -> 10051 bytes .../PerlMagick/t/reference/filter/Shave.miff | 15 + .../PerlMagick/t/reference/filter/Shear.miff | 14 + .../t/reference/filter/SigmoidalContrast.miff | 15 + .../t/reference/filter/Solarize.miff | Bin 0 -> 10051 bytes .../PerlMagick/t/reference/filter/Swirl.miff | 15 + .../t/reference/filter/Threshold.miff | 15 + .../PerlMagick/t/reference/filter/Trim.miff | 15 + .../t/reference/filter/UnsharpMask.miff | Bin 0 -> 10051 bytes .../PerlMagick/t/reference/filter/Wave.miff | 15 + .../t/reference/jng/gray_idat_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/jng/gray_jdaa_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/jng/gray_prog_idat_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/jng/gray_prog_jdaa_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/jng/gray_prog_tmp.miff | 11 + .../PerlMagick/t/reference/jng/gray_tmp.miff | 11 + .../PerlMagick/t/reference/jng/idat_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/jng/input_gray.miff | 11 + .../t/reference/jng/input_gray_idat.miff | Bin 0 -> 26037 bytes .../t/reference/jng/input_gray_jdaa.miff | Bin 0 -> 26037 bytes .../t/reference/jng/input_gray_prog.miff | 11 + .../t/reference/jng/input_gray_prog_idat.miff | Bin 0 -> 26037 bytes .../t/reference/jng/input_gray_prog_jdaa.miff | Bin 0 -> 26037 bytes .../t/reference/jng/input_idat.miff | Bin 0 -> 26037 bytes .../t/reference/jng/input_jdaa.miff | Bin 0 -> 26037 bytes .../t/reference/jng/input_prog.miff | 11 + .../t/reference/jng/input_prog_idat.miff | Bin 0 -> 26037 bytes .../t/reference/jng/input_prog_jdaa.miff | Bin 0 -> 26037 bytes .../t/reference/jng/input_rose.miff | 11 + .../PerlMagick/t/reference/jng/jdaa_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/jng/prog_idat_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/jng/prog_jdaa_tmp.miff | Bin 0 -> 26037 bytes .../PerlMagick/t/reference/jng/prog_tmp.miff | 11 + .../PerlMagick/t/reference/jng/read_gray.miff | 15 + .../t/reference/jng/read_gray_idat.miff | Bin 0 -> 26149 bytes .../t/reference/jng/read_gray_jdaa.miff | Bin 0 -> 26149 bytes .../t/reference/jng/read_gray_prog.miff | 15 + .../t/reference/jng/read_gray_prog_idat.miff | Bin 0 -> 26149 bytes .../t/reference/jng/read_gray_prog_jdaa.miff | Bin 0 -> 26149 bytes .../PerlMagick/t/reference/jng/read_idat.miff | Bin 0 -> 26149 bytes .../PerlMagick/t/reference/jng/read_jdaa.miff | Bin 0 -> 26149 bytes .../PerlMagick/t/reference/jng/read_prog.miff | 15 + .../t/reference/jng/read_prog_idat.miff | Bin 0 -> 26149 bytes .../t/reference/jng/read_prog_jdaa.miff | Bin 0 -> 26149 bytes .../t/reference/jng/write_gray.miff | 15 + .../t/reference/jng/write_gray_idat.miff | Bin 0 -> 26149 bytes .../t/reference/jng/write_gray_jdaa.miff | Bin 0 -> 26149 bytes .../t/reference/jng/write_gray_prog.miff | 15 + .../t/reference/jng/write_gray_prog_idat.miff | Bin 0 -> 26149 bytes .../t/reference/jng/write_gray_prog_jdaa.miff | Bin 0 -> 26149 bytes .../t/reference/jng/write_idat.miff | Bin 0 -> 26149 bytes .../t/reference/jng/write_jdaa.miff | Bin 0 -> 26149 bytes .../t/reference/jng/write_prog.miff | 15 + .../t/reference/jng/write_prog_idat.miff | Bin 0 -> 26149 bytes .../t/reference/jng/write_prog_jdaa.miff | Bin 0 -> 26149 bytes .../t/reference/jpeg/read_non_interlaced.miff | 17 + .../reference/jpeg/read_plane_interlaced.miff | 17 + .../reference/jpeg/write_non_interlaced.miff | 18 + .../jpeg/write_plane_interlaced.miff | 18 + .../t/reference/openjp2/read_j2k.miff | Bin 0 -> 12962 bytes .../t/reference/openjp2/read_jp2.miff | Bin 0 -> 12962 bytes .../t/reference/openjp2/read_jpc.miff | Bin 0 -> 12962 bytes .../PerlMagick/t/reference/read/gradient.miff | Bin 0 -> 19712 bytes .../PerlMagick/t/reference/read/granite.miff | Bin 0 -> 16893 bytes .../t/reference/read/input_avs.miff | 15 + .../t/reference/read/input_bmp.miff | Bin 0 -> 4413 bytes .../t/reference/read/input_bmp24.miff | 16 + .../t/reference/read/input_cmyk.miff | Bin 0 -> 13163 bytes .../t/reference/read/input_dcx.miff | 16 + .../t/reference/read/input_dib.miff | 16 + .../t/reference/read/input_fits.miff | 97 + .../t/reference/read/input_gif.miff | Bin 0 -> 4394 bytes .../t/reference/read/input_gif87.miff | Bin 0 -> 4394 bytes .../t/reference/read/input_gray.miff | 12 + .../read/input_gray_lsb_08bit_mat.miff | Bin 0 -> 4298 bytes .../read/input_gray_lsb_double_mat.miff | Bin 0 -> 26391 bytes .../read/input_gray_msb_08bit_mat.miff | Bin 0 -> 21828 bytes .../t/reference/read/input_ico.miff | Bin 0 -> 4487 bytes .../t/reference/read/input_im1.miff | Bin 0 -> 3617 bytes .../t/reference/read/input_im24.miff | 15 + .../t/reference/read/input_im8.miff | Bin 0 -> 4381 bytes .../t/reference/read/input_mat.miff | Bin 0 -> 132764 bytes .../t/reference/read/input_miff.miff | 16 + .../t/reference/read/input_mtv.miff | 15 + .../reference/read/input_null_DarkOrange.miff | Bin 0 -> 26151 bytes .../t/reference/read/input_null_black.miff | Bin 0 -> 26151 bytes .../t/reference/read/input_null_white.miff | Bin 0 -> 26151 bytes .../PerlMagick/t/reference/read/input_p7.miff | Bin 0 -> 4164 bytes .../t/reference/read/input_pbm_p1.miff | Bin 0 -> 3482 bytes .../t/reference/read/input_pbm_p4.miff | Bin 0 -> 3482 bytes .../t/reference/read/input_pcx.miff | 16 + .../t/reference/read/input_pgm_p2.miff | 87 + .../t/reference/read/input_pgm_p5.miff | 87 + .../t/reference/read/input_pict.miff | 15 + .../t/reference/read/input_ppm_p3.miff | 15 + .../t/reference/read/input_ppm_p6.miff | 15 + .../t/reference/read/input_psd.miff | 15 + .../t/reference/read/input_rgb.miff | 16 + .../read/input_rgb_lsb_08bit_mat.miff | Bin 0 -> 10191 bytes .../t/reference/read/input_rgba.miff | 16 + .../t/reference/read/input_rle.miff | 17 + .../t/reference/read/input_sgi.miff | 15 + .../t/reference/read/input_tga.miff | 15 + .../t/reference/read/input_tile.miff | 15 + .../t/reference/read/input_tim.miff | Bin 0 -> 2443 bytes .../t/reference/read/input_uyvy.miff | 12 + .../t/reference/read/input_viff.miff | Bin 0 -> 4336 bytes .../t/reference/read/input_wbmp.miff | Bin 0 -> 3572 bytes .../t/reference/read/input_wpg.miff | Bin 0 -> 5113 bytes .../t/reference/read/input_xbm.miff | Bin 0 -> 3617 bytes .../t/reference/read/input_xc_black.miff | Bin 0 -> 10051 bytes .../t/reference/read/input_xpm.miff | Bin 0 -> 4336 bytes .../t/reference/read/input_xwd.miff | 9 + .../PerlMagick/t/reference/ttf/annotate.miff | Bin 0 -> 20150 bytes .../PerlMagick/t/reference/ttf/label.miff | Bin 0 -> 15830 bytes .../PerlMagick/t/reference/ttf/read.miff | 950 + .../PerlMagick/t/reference/wmf/clock.miff | Bin 0 -> 511645 bytes .../PerlMagick/t/reference/wmf/wizard.miff | Bin 0 -> 632921 bytes .../t/reference/write/cgm/read.miff | Bin 0 -> 107110 bytes .../t/reference/write/composite/Add.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Atop.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Bumpmap.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Clear.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Copy.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/CopyBlue.miff | Bin 0 -> 35311 bytes .../reference/write/composite/CopyGreen.miff | Bin 0 -> 35311 bytes .../write/composite/CopyOpacity.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/CopyRed.miff | Bin 0 -> 35311 bytes .../reference/write/composite/Difference.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/In.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Minus.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Multiply.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Out.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Over.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Plus.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Rotate.miff | 12 + .../t/reference/write/composite/Subtract.miff | Bin 0 -> 35311 bytes .../t/reference/write/composite/Xor.miff | Bin 0 -> 35311 bytes .../write/filter/AdaptiveThreshold.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Annotate.miff | Bin 0 -> 16232 bytes .../t/reference/write/filter/Blur.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Border.miff | Bin 0 -> 17621 bytes .../t/reference/write/filter/Channel.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Charcoal.miff | Bin 0 -> 13014 bytes .../t/reference/write/filter/Chop.miff | Bin 0 -> 3501 bytes .../write/filter/ColorFloodfill.miff | Bin 0 -> 16232 bytes .../t/reference/write/filter/Colorize.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Contrast.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Convolve.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Crop.miff | Bin 0 -> 10374 bytes .../t/reference/write/filter/Despeckle.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Draw.miff | Bin 0 -> 16232 bytes .../t/reference/write/filter/Edge.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Emboss.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Equalize.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Flip.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Flop.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Frame.miff | Bin 0 -> 26155 bytes .../t/reference/write/filter/Gamma.miff | Bin 0 -> 13013 bytes .../reference/write/filter/GaussianBlur.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Implode.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Level.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Magnify.miff | Bin 0 -> 41995 bytes .../write/filter/MatteFloodfill.miff | Bin 0 -> 16232 bytes .../reference/write/filter/MedianFilter.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Minify.miff | Bin 0 -> 5768 bytes .../t/reference/write/filter/Modulate.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/MotionBlur.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Negate.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Normalize.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/OilPaint.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Opaque.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Quantize.miff | Bin 0 -> 7343 bytes .../t/reference/write/filter/RadialBlur.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Raise.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/ReduceNoise.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Resize.miff | Bin 0 -> 6881 bytes .../t/reference/write/filter/Roll.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Rotate.miff | Bin 0 -> 30233 bytes .../t/reference/write/filter/Sample.miff | Bin 0 -> 6881 bytes .../t/reference/write/filter/Scale.miff | Bin 0 -> 6881 bytes .../t/reference/write/filter/Segment.miff | Bin 0 -> 6576 bytes .../t/reference/write/filter/Set.miff | Bin 0 -> 12998 bytes .../t/reference/write/filter/Shade.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Sharpen.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Shave.miff | Bin 0 -> 7253 bytes .../t/reference/write/filter/Shear.miff | Bin 0 -> 30169 bytes .../write/filter/SigmoidalContrast.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Solarize.miff | Bin 0 -> 15932 bytes .../t/reference/write/filter/Swirl.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Threshold.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Trim.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/UnsharpMask.miff | Bin 0 -> 13013 bytes .../t/reference/write/filter/Wave.miff | Bin 0 -> 23513 bytes .../t/reference/write/jng/gray_idat_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/write/jng/gray_jdaa_tmp.miff | Bin 0 -> 26037 bytes .../write/jng/gray_prog_idat_tmp.miff | Bin 0 -> 26037 bytes .../write/jng/gray_prog_jdaa_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/write/jng/gray_prog_tmp.miff | 11 + .../t/reference/write/jng/gray_tmp.miff | 11 + .../t/reference/write/jng/idat_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/write/jng/input_gray.miff | 11 + .../reference/write/jng/input_gray_idat.miff | Bin 0 -> 26037 bytes .../reference/write/jng/input_gray_jdaa.miff | Bin 0 -> 26037 bytes .../reference/write/jng/input_gray_prog.miff | 11 + .../write/jng/input_gray_prog_idat.miff | Bin 0 -> 26037 bytes .../write/jng/input_gray_prog_jdaa.miff | Bin 0 -> 26037 bytes .../t/reference/write/jng/input_idat.miff | Bin 0 -> 26037 bytes .../t/reference/write/jng/input_jdaa.miff | Bin 0 -> 26037 bytes .../t/reference/write/jng/input_prog.miff | 11 + .../reference/write/jng/input_prog_idat.miff | Bin 0 -> 26037 bytes .../reference/write/jng/input_prog_jdaa.miff | Bin 0 -> 26037 bytes .../t/reference/write/jng/input_rose.miff | 11 + .../t/reference/write/jng/jdaa_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/write/jng/prog_idat_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/write/jng/prog_jdaa_tmp.miff | Bin 0 -> 26037 bytes .../t/reference/write/jng/prog_tmp.miff | 11 + .../t/reference/write/jng/read_gray.miff | 13 + .../t/reference/write/jng/read_gray_idat.miff | Bin 0 -> 13192 bytes .../t/reference/write/jng/read_gray_jdaa.miff | Bin 0 -> 13192 bytes .../t/reference/write/jng/read_gray_prog.miff | 13 + .../write/jng/read_gray_prog_idat.miff | Bin 0 -> 13192 bytes .../write/jng/read_gray_prog_jdaa.miff | Bin 0 -> 13192 bytes .../t/reference/write/jng/read_idat.miff | Bin 0 -> 13192 bytes .../t/reference/write/jng/read_jdaa.miff | Bin 0 -> 13192 bytes .../t/reference/write/jng/read_prog.miff | 13 + .../t/reference/write/jng/read_prog_idat.miff | Bin 0 -> 13192 bytes .../t/reference/write/jng/read_prog_jdaa.miff | Bin 0 -> 13192 bytes .../t/reference/write/jng/write_gray.miff | 12 + .../reference/write/jng/write_gray_idat.miff | Bin 0 -> 26045 bytes .../reference/write/jng/write_gray_jdaa.miff | Bin 0 -> 26045 bytes .../reference/write/jng/write_gray_prog.miff | 12 + .../write/jng/write_gray_prog_idat.miff | Bin 0 -> 26045 bytes .../write/jng/write_gray_prog_jdaa.miff | Bin 0 -> 26045 bytes .../t/reference/write/jng/write_idat.miff | Bin 0 -> 26045 bytes .../t/reference/write/jng/write_jdaa.miff | Bin 0 -> 26045 bytes .../t/reference/write/jng/write_prog.miff | 12 + .../reference/write/jng/write_prog_idat.miff | Bin 0 -> 26045 bytes .../reference/write/jng/write_prog_jdaa.miff | Bin 0 -> 26045 bytes .../t/reference/write/jp2/read_jp2.miff | Bin 0 -> 16011 bytes .../t/reference/write/jp2/read_jpc.miff | Bin 0 -> 16011 bytes .../t/reference/write/jp2/read_pgx.miff | Bin 0 -> 7710 bytes .../write/jpeg/read_non_interlaced.miff | Bin 0 -> 13055 bytes .../write/jpeg/read_plane_interlaced.miff | Bin 0 -> 13055 bytes .../write/jpeg/write_non_interlaced.miff | Bin 0 -> 13075 bytes .../write/jpeg/write_plane_interlaced.miff | Bin 0 -> 13075 bytes .../t/reference/write/output_p7.miff | Bin 0 -> 4198 bytes .../t/reference/write/read/gradient.miff | Bin 0 -> 16189 bytes .../t/reference/write/read/granite.miff | Bin 0 -> 13380 bytes .../t/reference/write/read/input_avs.miff | Bin 0 -> 12970 bytes .../t/reference/write/read/input_bmp.miff | Bin 0 -> 7332 bytes .../t/reference/write/read/input_bmp24.miff | Bin 0 -> 13002 bytes .../t/reference/write/read/input_cmyk.miff | Bin 0 -> 16191 bytes .../t/reference/write/read/input_dcx.miff | Bin 0 -> 12991 bytes .../t/reference/write/read/input_dib.miff | Bin 0 -> 13002 bytes .../t/reference/write/read/input_fits.miff | Bin 0 -> 7382 bytes .../t/reference/write/read/input_gif.miff | Bin 0 -> 7515 bytes .../t/reference/write/read/input_gif87.miff | Bin 0 -> 7515 bytes .../t/reference/write/read/input_gray.miff | Bin 0 -> 12970 bytes .../t/reference/write/read/input_ico.miff | Bin 0 -> 7406 bytes .../t/reference/write/read/input_im1.miff | Bin 0 -> 6536 bytes .../t/reference/write/read/input_im24.miff | Bin 0 -> 12970 bytes .../t/reference/write/read/input_im8.miff | Bin 0 -> 7300 bytes .../t/reference/write/read/input_mat.miff | Bin 0 -> 69620 bytes .../t/reference/write/read/input_miff.miff | Bin 0 -> 13013 bytes .../t/reference/write/read/input_mtv.miff | Bin 0 -> 12970 bytes .../write/read/input_null_DarkOrange.miff | Bin 0 -> 16189 bytes .../write/read/input_null_black.miff | Bin 0 -> 16189 bytes .../write/read/input_null_white.miff | Bin 0 -> 16189 bytes .../t/reference/write/read/input_p7.miff | Bin 0 -> 4164 bytes .../t/reference/write/read/input_pbm_p1.miff | Bin 0 -> 6536 bytes .../t/reference/write/read/input_pbm_p4.miff | Bin 0 -> 6536 bytes .../t/reference/write/read/input_pcx.miff | Bin 0 -> 12991 bytes .../t/reference/write/read/input_pgm_p2.miff | Bin 0 -> 7300 bytes .../t/reference/write/read/input_pgm_p5.miff | Bin 0 -> 7300 bytes .../t/reference/write/read/input_pict.miff | Bin 0 -> 12970 bytes .../t/reference/write/read/input_ppm_p3.miff | Bin 0 -> 12970 bytes .../t/reference/write/read/input_ppm_p6.miff | Bin 0 -> 12970 bytes .../t/reference/write/read/input_psd.miff | Bin 0 -> 12970 bytes .../t/reference/write/read/input_rgb.miff | Bin 0 -> 12970 bytes .../t/reference/write/read/input_rgba.miff | Bin 0 -> 16189 bytes .../t/reference/write/read/input_rle.miff | Bin 0 -> 13075 bytes .../t/reference/write/read/input_sgi.miff | Bin 0 -> 15917 bytes .../t/reference/write/read/input_tga.miff | Bin 0 -> 12998 bytes .../t/reference/write/read/input_tile.miff | Bin 0 -> 41952 bytes .../t/reference/write/read/input_tim.miff | Bin 0 -> 5407 bytes .../t/reference/write/read/input_uyvy.miff | Bin 0 -> 12970 bytes .../t/reference/write/read/input_viff.miff | Bin 0 -> 7300 bytes .../t/reference/write/read/input_wbmp.miff | Bin 0 -> 6536 bytes .../t/reference/write/read/input_wpg.miff | Bin 0 -> 5113 bytes .../t/reference/write/read/input_xbm.miff | Bin 0 -> 6536 bytes .../reference/write/read/input_xc_black.miff | Bin 0 -> 6533 bytes .../t/reference/write/read/input_xpm.miff | Bin 0 -> 7300 bytes .../t/reference/write/read/input_xwd.miff | Bin 0 -> 12990 bytes .../t/reference/write/ttf/annotate.miff | Bin 0 -> 20150 bytes .../t/reference/write/ttf/label.miff | Bin 0 -> 15830 bytes .../t/reference/write/ttf/read.miff | 950 + .../t/reference/write/wmf/clock.miff | Bin 0 -> 547732 bytes .../t/reference/write/wmf/wizard.miff | Bin 0 -> 709652 bytes .../PerlMagick/t/setattribute.t | 243 + .../PerlMagick/t/subroutines.pl | 1269 + .../PerlMagick/t/tiff/input_16.tiff | Bin 0 -> 1902 bytes .../PerlMagick/t/tiff/input_16_matte.tiff | Bin 0 -> 2030 bytes .../PerlMagick/t/tiff/input_256.tiff | Bin 0 -> 5004 bytes .../PerlMagick/t/tiff/input_256_matte.tiff | Bin 0 -> 8402 bytes .../t/tiff/input_256_planar_contig.tiff | Bin 0 -> 5018 bytes .../t/tiff/input_256_planar_separate.tiff | Bin 0 -> 5020 bytes .../PerlMagick/t/tiff/input_gray_12bit.tiff | Bin 0 -> 164260 bytes .../PerlMagick/t/tiff/input_gray_16bit.tiff | Bin 0 -> 6684 bytes .../PerlMagick/t/tiff/input_gray_4bit.tiff | Bin 0 -> 1800 bytes .../t/tiff/input_gray_4bit_matte.tiff | Bin 0 -> 3640 bytes .../PerlMagick/t/tiff/input_gray_8bit.tiff | Bin 0 -> 3462 bytes .../t/tiff/input_gray_8bit_matte.tiff | Bin 0 -> 6860 bytes .../PerlMagick/t/tiff/input_mono.tiff | Bin 0 -> 1267 bytes .../PerlMagick/t/tiff/input_truecolor.tiff | Bin 0 -> 9924 bytes .../PerlMagick/t/tiff/input_truecolor_16.tiff | Bin 0 -> 19596 bytes .../t/tiff/input_truecolor_stripped.tiff | Bin 0 -> 9934 bytes .../t/tiff/input_truecolor_tiled32x32.tiff | Bin 0 -> 9936 bytes .../PerlMagick/t/tiff/read.t | 147 + .../PerlMagick/t/tiff/write.t | 114 + .../PerlMagick/t/ttf/input.ttf | Bin 0 -> 18444 bytes ImageMagick-6.9.12-44/PerlMagick/t/ttf/read.t | 51 + .../PerlMagick/t/wmf/clock.wmf | Bin 0 -> 12406 bytes ImageMagick-6.9.12-44/PerlMagick/t/wmf/read.t | 22 + .../PerlMagick/t/wmf/wizard.wmf | Bin 0 -> 14578 bytes ImageMagick-6.9.12-44/PerlMagick/t/write.t | 267 + .../PerlMagick/t/x11/congrats.fig | 18 + .../PerlMagick/t/x11/congrats.miff | 17 + .../PerlMagick/t/x11/input.xwd | Bin 0 -> 9862 bytes ImageMagick-6.9.12-44/PerlMagick/t/x11/read.t | 56 + .../PerlMagick/t/x11/write.t | 45 + .../PerlMagick/t/xfig/input.fig | 69 + .../PerlMagick/t/xfig/read.t | 28 + .../PerlMagick/t/zlib/input.miff | 9 + .../PerlMagick/t/zlib/input.miff.gz | Bin 0 -> 8792 bytes .../PerlMagick/t/zlib/read.t | 31 + .../PerlMagick/t/zlib/write.t | 27 + ImageMagick-6.9.12-44/PerlMagick/typemap | 1 + ImageMagick-6.9.12-44/QuickStart.txt | 136 + ImageMagick-6.9.12-44/README.txt | 132 + ImageMagick-6.9.12-44/aclocal.m4 | 1281 + ImageMagick-6.9.12-44/coders/Makefile.am | 1123 + ImageMagick-6.9.12-44/coders/aai.c | 426 + ImageMagick-6.9.12-44/coders/art.c | 371 + ImageMagick-6.9.12-44/coders/avs.c | 431 + ImageMagick-6.9.12-44/coders/bgr.c | 1475 + ImageMagick-6.9.12-44/coders/bmp.c | 2456 + ImageMagick-6.9.12-44/coders/braille.c | 384 + .../coders/bytebuffer-private.h | 128 + ImageMagick-6.9.12-44/coders/cals.c | 588 + ImageMagick-6.9.12-44/coders/caption.c | 402 + ImageMagick-6.9.12-44/coders/cin.c | 1231 + ImageMagick-6.9.12-44/coders/cip.c | 288 + ImageMagick-6.9.12-44/coders/clip.c | 249 + ImageMagick-6.9.12-44/coders/clipboard.c | 378 + ImageMagick-6.9.12-44/coders/cmyk.c | 1676 + ImageMagick-6.9.12-44/coders/cut.c | 741 + ImageMagick-6.9.12-44/coders/dcm.c | 4457 ++ ImageMagick-6.9.12-44/coders/dds.c | 3108 ++ ImageMagick-6.9.12-44/coders/debug.c | 274 + ImageMagick-6.9.12-44/coders/dib.c | 1431 + ImageMagick-6.9.12-44/coders/djvu.c | 995 + ImageMagick-6.9.12-44/coders/dng.c | 825 + ImageMagick-6.9.12-44/coders/dot.c | 253 + ImageMagick-6.9.12-44/coders/dps.c | 597 + ImageMagick-6.9.12-44/coders/dpx.c | 2087 + ImageMagick-6.9.12-44/coders/emf.c | 900 + ImageMagick-6.9.12-44/coders/ept.c | 502 + ImageMagick-6.9.12-44/coders/exr.c | 623 + ImageMagick-6.9.12-44/coders/fax.c | 407 + ImageMagick-6.9.12-44/coders/fits.c | 876 + ImageMagick-6.9.12-44/coders/flif.c | 544 + ImageMagick-6.9.12-44/coders/fpx.c | 1123 + .../coders/ghostscript-private.h | 271 + ImageMagick-6.9.12-44/coders/gif.c | 1974 + ImageMagick-6.9.12-44/coders/gradient.c | 331 + ImageMagick-6.9.12-44/coders/gray.c | 1135 + ImageMagick-6.9.12-44/coders/hald.c | 244 + ImageMagick-6.9.12-44/coders/hdr.c | 833 + ImageMagick-6.9.12-44/coders/heic.c | 787 + ImageMagick-6.9.12-44/coders/histogram.c | 397 + ImageMagick-6.9.12-44/coders/hrz.c | 352 + ImageMagick-6.9.12-44/coders/html.c | 471 + ImageMagick-6.9.12-44/coders/icon.c | 1392 + ImageMagick-6.9.12-44/coders/info.c | 220 + ImageMagick-6.9.12-44/coders/inline.c | 363 + ImageMagick-6.9.12-44/coders/ipl.c | 712 + ImageMagick-6.9.12-44/coders/jbig.c | 576 + ImageMagick-6.9.12-44/coders/jnx.c | 398 + ImageMagick-6.9.12-44/coders/jp2.c | 1156 + ImageMagick-6.9.12-44/coders/jpeg.c | 3106 ++ ImageMagick-6.9.12-44/coders/json.c | 1798 + ImageMagick-6.9.12-44/coders/label.c | 359 + ImageMagick-6.9.12-44/coders/mac.c | 320 + ImageMagick-6.9.12-44/coders/magick.c | 13329 ++++++ ImageMagick-6.9.12-44/coders/map.c | 463 + ImageMagick-6.9.12-44/coders/mask.c | 245 + ImageMagick-6.9.12-44/coders/mat.c | 1756 + ImageMagick-6.9.12-44/coders/matte.c | 224 + ImageMagick-6.9.12-44/coders/meta.c | 2476 + ImageMagick-6.9.12-44/coders/miff.c | 2802 ++ ImageMagick-6.9.12-44/coders/mono.c | 364 + ImageMagick-6.9.12-44/coders/mpc.c | 1536 + ImageMagick-6.9.12-44/coders/mpr.c | 228 + ImageMagick-6.9.12-44/coders/msl.c | 8333 ++++ ImageMagick-6.9.12-44/coders/mtv.c | 426 + ImageMagick-6.9.12-44/coders/mvg.c | 365 + ImageMagick-6.9.12-44/coders/null.c | 263 + ImageMagick-6.9.12-44/coders/otb.c | 395 + ImageMagick-6.9.12-44/coders/palm.c | 1043 + ImageMagick-6.9.12-44/coders/pango.c | 558 + ImageMagick-6.9.12-44/coders/pattern.c | 1054 + ImageMagick-6.9.12-44/coders/pcd.c | 1186 + ImageMagick-6.9.12-44/coders/pcl.c | 1004 + ImageMagick-6.9.12-44/coders/pcx.c | 1220 + ImageMagick-6.9.12-44/coders/pdb.c | 1017 + ImageMagick-6.9.12-44/coders/pdf.c | 3102 ++ ImageMagick-6.9.12-44/coders/pes.c | 747 + ImageMagick-6.9.12-44/coders/pgx.c | 399 + ImageMagick-6.9.12-44/coders/pict.c | 2125 + ImageMagick-6.9.12-44/coders/pix.c | 330 + ImageMagick-6.9.12-44/coders/plasma.c | 292 + ImageMagick-6.9.12-44/coders/png.c | 14145 ++++++ ImageMagick-6.9.12-44/coders/pnm.c | 2487 + ImageMagick-6.9.12-44/coders/preview.c | 201 + ImageMagick-6.9.12-44/coders/ps.c | 2230 + ImageMagick-6.9.12-44/coders/ps2.c | 1134 + ImageMagick-6.9.12-44/coders/ps3.c | 1618 + ImageMagick-6.9.12-44/coders/psd-private.h | 53 + ImageMagick-6.9.12-44/coders/psd.c | 3705 ++ ImageMagick-6.9.12-44/coders/pwp.c | 352 + ImageMagick-6.9.12-44/coders/raw.c | 623 + ImageMagick-6.9.12-44/coders/rgb.c | 1484 + ImageMagick-6.9.12-44/coders/rgf.c | 402 + ImageMagick-6.9.12-44/coders/rla.c | 481 + ImageMagick-6.9.12-44/coders/rle.c | 786 + ImageMagick-6.9.12-44/coders/scr.c | 314 + ImageMagick-6.9.12-44/coders/screenshot.c | 336 + ImageMagick-6.9.12-44/coders/sct.c | 371 + ImageMagick-6.9.12-44/coders/sfw.c | 441 + ImageMagick-6.9.12-44/coders/sgi.c | 1199 + ImageMagick-6.9.12-44/coders/sixel.c | 1365 + ImageMagick-6.9.12-44/coders/stegano.c | 289 + ImageMagick-6.9.12-44/coders/sun.c | 1039 + ImageMagick-6.9.12-44/coders/svg.c | 5279 +++ ImageMagick-6.9.12-44/coders/tga.c | 1020 + ImageMagick-6.9.12-44/coders/thumbnail.c | 222 + ImageMagick-6.9.12-44/coders/tiff.c | 3999 ++ ImageMagick-6.9.12-44/coders/tile.c | 208 + ImageMagick-6.9.12-44/coders/tim.c | 499 + ImageMagick-6.9.12-44/coders/ttf.c | 432 + ImageMagick-6.9.12-44/coders/txt.c | 889 + ImageMagick-6.9.12-44/coders/uil.c | 385 + ImageMagick-6.9.12-44/coders/url.c | 381 + ImageMagick-6.9.12-44/coders/uyvy.c | 370 + ImageMagick-6.9.12-44/coders/vicar.c | 509 + ImageMagick-6.9.12-44/coders/vid.c | 360 + ImageMagick-6.9.12-44/coders/video.c | 657 + ImageMagick-6.9.12-44/coders/viff.c | 1277 + ImageMagick-6.9.12-44/coders/vips.c | 766 + ImageMagick-6.9.12-44/coders/wbmp.c | 427 + ImageMagick-6.9.12-44/coders/webp.c | 1228 + ImageMagick-6.9.12-44/coders/wmf.c | 3010 ++ ImageMagick-6.9.12-44/coders/wpg.c | 1713 + ImageMagick-6.9.12-44/coders/x.c | 209 + ImageMagick-6.9.12-44/coders/xbm.c | 631 + ImageMagick-6.9.12-44/coders/xc.c | 244 + ImageMagick-6.9.12-44/coders/xcf.c | 1553 + ImageMagick-6.9.12-44/coders/xpm.c | 1182 + ImageMagick-6.9.12-44/coders/xps.c | 476 + ImageMagick-6.9.12-44/coders/xwd.c | 960 + ImageMagick-6.9.12-44/coders/ycbcr.c | 1422 + ImageMagick-6.9.12-44/coders/yuv.c | 874 + ImageMagick-6.9.12-44/common.shi.in | 26 + ImageMagick-6.9.12-44/config/ImageMagick.rc | 71 + .../config/ImageMagick.rdf.in | 165 + ImageMagick-6.9.12-44/config/Magick++.dox.in | 2419 + .../config/MagickCore.dox.in | 2418 + .../config/MagickWand.dox.in | 2418 + ImageMagick-6.9.12-44/config/Makefile.am | 77 + ImageMagick-6.9.12-44/config/ar-lib | 271 + ImageMagick-6.9.12-44/config/cmyk.icm | Bin 0 -> 961644 bytes ImageMagick-6.9.12-44/config/coder.xml | 23 + ImageMagick-6.9.12-44/config/colors.xml | 28 + ImageMagick-6.9.12-44/config/compile | 348 + ImageMagick-6.9.12-44/config/config.guess | 1486 + ImageMagick-6.9.12-44/config/config.h.in | 1181 + ImageMagick-6.9.12-44/config/config.sub | 1790 + ImageMagick-6.9.12-44/config/configure.xml.in | 50 + ImageMagick-6.9.12-44/config/delegates.xml.in | 121 + ImageMagick-6.9.12-44/config/depcomp | 791 + ImageMagick-6.9.12-44/config/english.xml | 1636 + ImageMagick-6.9.12-44/config/francais.xml | 1612 + ImageMagick-6.9.12-44/config/install-sh | 529 + ImageMagick-6.9.12-44/config/lndir.sh | 96 + ImageMagick-6.9.12-44/config/locale.md | 16 + ImageMagick-6.9.12-44/config/locale.xml | 48 + ImageMagick-6.9.12-44/config/log.xml | 80 + ImageMagick-6.9.12-44/config/ltmain.sh | 11140 +++++ ImageMagick-6.9.12-44/config/magic.xml | 23 + ImageMagick-6.9.12-44/config/mime.xml | 1146 + ImageMagick-6.9.12-44/config/missing | 215 + ImageMagick-6.9.12-44/config/mkinstalldirs | 162 + ImageMagick-6.9.12-44/config/policy.xml | 82 + .../config/quantization-table.xml | 68 + ImageMagick-6.9.12-44/config/sRGB.icm | Bin 0 -> 3212 bytes ImageMagick-6.9.12-44/config/tap-driver.sh | 651 + ImageMagick-6.9.12-44/config/test-driver | 148 + ImageMagick-6.9.12-44/config/thresholds.xml | 336 + .../config/type-apple.xml.in | 1367 + .../config/type-dejavu.xml.in | 58 + .../config/type-ghostscript.xml.in | 50 + .../config/type-urw-base35.xml.in | 50 + .../config/type-windows.xml.in | 105 + ImageMagick-6.9.12-44/config/type.xml.in | 17 + ImageMagick-6.9.12-44/configure | 38967 ++++++++++++++++ ImageMagick-6.9.12-44/configure.ac | 4085 ++ ImageMagick-6.9.12-44/filters/Makefile.am | 36 + ImageMagick-6.9.12-44/filters/analyze.c | 284 + ImageMagick-6.9.12-44/images/ImageMagick.ico | Bin 0 -> 22382 bytes ImageMagick-6.9.12-44/images/affine.png | Bin 0 -> 2975 bytes ImageMagick-6.9.12-44/images/annotate.png | Bin 0 -> 3003 bytes ImageMagick-6.9.12-44/images/arc.png | Bin 0 -> 3672 bytes ImageMagick-6.9.12-44/images/atop.gif | Bin 0 -> 1219 bytes ImageMagick-6.9.12-44/images/background.jpg | Bin 0 -> 556 bytes ImageMagick-6.9.12-44/images/bitcoin.svg | 10 + ImageMagick-6.9.12-44/images/black.png | Bin 0 -> 128 bytes .../images/bluebells_clipped.jpg | Bin 0 -> 23762 bytes .../images/bluebells_darker.jpg | Bin 0 -> 26788 bytes .../images/bluebells_lin.jpg | Bin 0 -> 32192 bytes .../images/bluebells_log.jpg | Bin 0 -> 15808 bytes ImageMagick-6.9.12-44/images/button.gif | Bin 0 -> 1887 bytes ImageMagick-6.9.12-44/images/configure.jpg | Bin 0 -> 153423 bytes .../images/cylinder_shaded.png | Bin 0 -> 90419 bytes ImageMagick-6.9.12-44/images/difference.png | Bin 0 -> 15552 bytes ImageMagick-6.9.12-44/images/donate.png | Bin 0 -> 1423 bytes ImageMagick-6.9.12-44/images/examples.jpg | Bin 0 -> 963758 bytes ImageMagick-6.9.12-44/images/frame.jpg | Bin 0 -> 6067 bytes ImageMagick-6.9.12-44/images/fuzzy-magick.png | Bin 0 -> 62734 bytes .../images/gaussian-blur.png | Bin 0 -> 1363 bytes .../images/gradients/linear_gradient.png | Bin 0 -> 891 bytes .../gradients/linear_gradient_default.png | Bin 0 -> 823 bytes .../images/gradients/linear_gradient_east.png | Bin 0 -> 750 bytes .../images/gradients/radial_gradient.png | Bin 0 -> 81379 bytes .../gradients/radial_gradient_diagonal.png | Bin 0 -> 46933 bytes .../gradients/radial_gradient_ellipse.png | Bin 0 -> 34780 bytes .../radial_gradient_ellipse_angle45.png | Bin 0 -> 50041 bytes .../gradients/radial_gradient_maximum.png | Bin 0 -> 44685 bytes .../gradients/radial_gradient_minimum.png | Bin 0 -> 17957 bytes ImageMagick-6.9.12-44/images/granite.png | Bin 0 -> 15221 bytes ImageMagick-6.9.12-44/images/imade_art2.jpg | Bin 0 -> 1808 bytes ImageMagick-6.9.12-44/images/julia-set.png | Bin 0 -> 229592 bytes ImageMagick-6.9.12-44/images/label.gif | Bin 0 -> 1392 bytes ImageMagick-6.9.12-44/images/logo-sm-flop.png | Bin 0 -> 8950 bytes ImageMagick-6.9.12-44/images/logo-sm-fx.png | Bin 0 -> 11656 bytes ImageMagick-6.9.12-44/images/logo-sm.png | Bin 0 -> 9009 bytes ImageMagick-6.9.12-44/images/logo.jpg | Bin 0 -> 18749 bytes ImageMagick-6.9.12-44/images/logo.png | Bin 0 -> 395648 bytes ImageMagick-6.9.12-44/images/montage.jpg | Bin 0 -> 2594 bytes ImageMagick-6.9.12-44/images/navy.png | Bin 0 -> 265 bytes ImageMagick-6.9.12-44/images/networkredux.png | Bin 0 -> 3233 bytes ImageMagick-6.9.12-44/images/objects.gif | Bin 0 -> 1013 bytes ImageMagick-6.9.12-44/images/objects.jpg | Bin 0 -> 3518 bytes ImageMagick-6.9.12-44/images/objects.png | Bin 0 -> 808 bytes ImageMagick-6.9.12-44/images/over.gif | Bin 0 -> 771 bytes .../images/patterns/bricks.png | Bin 0 -> 158 bytes .../images/patterns/checkerboard.png | Bin 0 -> 202 bytes .../images/patterns/circles.png | Bin 0 -> 222 bytes .../images/patterns/crosshatch.png | Bin 0 -> 157 bytes .../images/patterns/crosshatch30.png | Bin 0 -> 168 bytes .../images/patterns/crosshatch45.png | Bin 0 -> 193 bytes .../images/patterns/fishscales.png | Bin 0 -> 223 bytes .../images/patterns/gray0.png | Bin 0 -> 89 bytes .../images/patterns/gray10.png | Bin 0 -> 181 bytes .../images/patterns/gray100.png | Bin 0 -> 153 bytes .../images/patterns/gray15.png | Bin 0 -> 189 bytes .../images/patterns/gray20.png | Bin 0 -> 182 bytes .../images/patterns/gray25.png | Bin 0 -> 158 bytes .../images/patterns/gray30.png | Bin 0 -> 198 bytes .../images/patterns/gray35.png | Bin 0 -> 217 bytes .../images/patterns/gray40.png | Bin 0 -> 229 bytes .../images/patterns/gray45.png | Bin 0 -> 202 bytes .../images/patterns/gray5.png | Bin 0 -> 137 bytes .../images/patterns/gray50.png | Bin 0 -> 157 bytes .../images/patterns/gray55.png | Bin 0 -> 202 bytes .../images/patterns/gray60.png | Bin 0 -> 213 bytes .../images/patterns/gray65.png | Bin 0 -> 218 bytes .../images/patterns/gray70.png | Bin 0 -> 211 bytes .../images/patterns/gray75.png | Bin 0 -> 182 bytes .../images/patterns/gray80.png | Bin 0 -> 206 bytes .../images/patterns/gray85.png | Bin 0 -> 197 bytes .../images/patterns/gray90.png | Bin 0 -> 200 bytes .../images/patterns/gray95.png | Bin 0 -> 185 bytes .../images/patterns/hexagons.png | Bin 0 -> 228 bytes .../images/patterns/horizontal.png | Bin 0 -> 142 bytes .../images/patterns/horizontal2.png | Bin 0 -> 232 bytes .../images/patterns/horizontal3.png | Bin 0 -> 571 bytes .../images/patterns/horizontalsaw.png | Bin 0 -> 186 bytes .../images/patterns/hs_bdiagonal.png | Bin 0 -> 179 bytes .../images/patterns/hs_cross.png | Bin 0 -> 155 bytes .../images/patterns/hs_diagcross.png | Bin 0 -> 193 bytes .../images/patterns/hs_fdiagonal.png | Bin 0 -> 189 bytes .../images/patterns/hs_horizontal.png | Bin 0 -> 145 bytes .../images/patterns/hs_vertical.png | Bin 0 -> 148 bytes .../images/patterns/left30.png | Bin 0 -> 167 bytes .../images/patterns/left45.png | Bin 0 -> 189 bytes .../images/patterns/leftshingle.png | Bin 0 -> 204 bytes .../images/patterns/octagons.png | Bin 0 -> 219 bytes .../images/patterns/right30.png | Bin 0 -> 170 bytes .../images/patterns/right45.png | Bin 0 -> 179 bytes .../images/patterns/rightshingle.png | Bin 0 -> 217 bytes .../images/patterns/smallfishscales.png | Bin 0 -> 190 bytes .../images/patterns/vertical.png | Bin 0 -> 143 bytes .../images/patterns/vertical2.png | Bin 0 -> 228 bytes .../images/patterns/vertical3.png | Bin 0 -> 231 bytes .../images/patterns/verticalbricks.png | Bin 0 -> 177 bytes .../images/patterns/verticalleftshingle.png | Bin 0 -> 235 bytes .../images/patterns/verticalrightshingle.png | Bin 0 -> 232 bytes .../images/patterns/verticalsaw.png | Bin 0 -> 194 bytes ImageMagick-6.9.12-44/images/piechart.png | Bin 0 -> 51008 bytes .../images/radial-gradient.png | Bin 0 -> 14338 bytes ImageMagick-6.9.12-44/images/reconstruct.jpg | Bin 0 -> 4419 bytes ImageMagick-6.9.12-44/images/red-ball.png | Bin 0 -> 8117 bytes ImageMagick-6.9.12-44/images/red-circle.png | Bin 0 -> 1464 bytes ImageMagick-6.9.12-44/images/right.gif | Bin 0 -> 82 bytes ImageMagick-6.9.12-44/images/rose-over.png | Bin 0 -> 7533 bytes .../images/rose-sigmoidal.png | Bin 0 -> 16733 bytes ImageMagick-6.9.12-44/images/rose.jpg | Bin 0 -> 4069 bytes ImageMagick-6.9.12-44/images/rose.png | Bin 0 -> 6939 bytes ImageMagick-6.9.12-44/images/rose.pnm | 4 + ImageMagick-6.9.12-44/images/script.png | Bin 0 -> 18496 bytes ImageMagick-6.9.12-44/images/smile.gif | Bin 0 -> 1349 bytes ImageMagick-6.9.12-44/images/sponsor.jpg | Bin 0 -> 3071 bytes ImageMagick-6.9.12-44/images/sprite.jpg | Bin 0 -> 13288 bytes ImageMagick-6.9.12-44/images/t-shirt.png | Bin 0 -> 276684 bytes ImageMagick-6.9.12-44/images/transloadit.png | Bin 0 -> 5569 bytes ImageMagick-6.9.12-44/images/wand.ico | Bin 0 -> 22382 bytes ImageMagick-6.9.12-44/images/wand.png | Bin 0 -> 2441 bytes .../images/white-highlight.png | Bin 0 -> 434 bytes ImageMagick-6.9.12-44/images/wizard.jpg | Bin 0 -> 23367 bytes ImageMagick-6.9.12-44/images/wizard.png | Bin 0 -> 1363471 bytes ImageMagick-6.9.12-44/index.html | 276 + ImageMagick-6.9.12-44/m4/Makefile.am | 43 + ImageMagick-6.9.12-44/m4/ac_func_fseeko.m4 | 72 + .../m4/ax_c___attribute__.m4 | 66 + .../m4/ax_cflags_warn_all.m4 | 158 + .../m4/ax_check_compile_flag.m4 | 53 + .../m4/ax_check_framework.m4 | 36 + .../m4/ax_compare_version.m4 | 177 + .../m4/ax_compiler_vendor.m4 | 117 + ImageMagick-6.9.12-44/m4/ax_cxx_bool.m4 | 45 + .../m4/ax_cxx_namespace_std.m4 | 38 + ImageMagick-6.9.12-44/m4/ax_cxx_namespaces.m4 | 40 + ImageMagick-6.9.12-44/m4/ax_gcc_archflag.m4 | 267 + ImageMagick-6.9.12-44/m4/ax_gcc_x86_cpuid.m4 | 89 + ImageMagick-6.9.12-44/m4/ax_have_opencl.m4 | 149 + .../m4/ax_prefix_config_h.m4 | 203 + ImageMagick-6.9.12-44/m4/ax_prepend_flag.m4 | 51 + .../m4/ax_prog_perl_version.m4 | 70 + ImageMagick-6.9.12-44/m4/ax_pthread.m4 | 507 + .../m4/ax_require_defined.m4 | 37 + ImageMagick-6.9.12-44/m4/cxx_have_std_libs.m4 | 32 + ImageMagick-6.9.12-44/m4/framework.m4 | 217 + ImageMagick-6.9.12-44/m4/ld-version-script.m4 | 48 + ImageMagick-6.9.12-44/m4/libtool.m4 | 8372 ++++ ImageMagick-6.9.12-44/m4/ltoptions.m4 | 437 + ImageMagick-6.9.12-44/m4/ltsugar.m4 | 124 + ImageMagick-6.9.12-44/m4/ltversion.m4 | 23 + ImageMagick-6.9.12-44/m4/lt~obsolete.m4 | 99 + ImageMagick-6.9.12-44/m4/pkg.m4 | 275 + ImageMagick-6.9.12-44/m4/version.m4 | 60 + ImageMagick-6.9.12-44/magick.sh.in | 43 + ImageMagick-6.9.12-44/magick/ImageMagick.h | 34 + .../magick/ImageMagick.pc.in | 14 + ImageMagick-6.9.12-44/magick/Magick-config.1 | 69 + ImageMagick-6.9.12-44/magick/Magick-config.in | 61 + .../magick/MagickCore-config.1 | 73 + .../magick/MagickCore-config.in | 61 + ImageMagick-6.9.12-44/magick/MagickCore.h | 171 + ImageMagick-6.9.12-44/magick/MagickCore.pc.in | 15 + ImageMagick-6.9.12-44/magick/Makefile.am | 498 + .../magick/accelerate-kernels-private.h | 3428 ++ .../magick/accelerate-private.h | 73 + ImageMagick-6.9.12-44/magick/accelerate.c | 5255 +++ .../magick/animate-private.h | 41 + ImageMagick-6.9.12-44/magick/animate.c | 3050 ++ ImageMagick-6.9.12-44/magick/animate.h | 32 + ImageMagick-6.9.12-44/magick/annotate.c | 2254 + ImageMagick-6.9.12-44/magick/annotate.h | 44 + ImageMagick-6.9.12-44/magick/api.h | 34 + ImageMagick-6.9.12-44/magick/artifact.c | 461 + ImageMagick-6.9.12-44/magick/artifact.h | 46 + ImageMagick-6.9.12-44/magick/attribute.c | 1678 + ImageMagick-6.9.12-44/magick/attribute.h | 54 + ImageMagick-6.9.12-44/magick/blob-private.h | 156 + ImageMagick-6.9.12-44/magick/blob.c | 5619 +++ ImageMagick-6.9.12-44/magick/blob.h | 78 + ImageMagick-6.9.12-44/magick/cache-private.h | 327 + ImageMagick-6.9.12-44/magick/cache-view.c | 1011 + ImageMagick-6.9.12-44/magick/cache-view.h | 111 + ImageMagick-6.9.12-44/magick/cache.c | 6025 +++ ImageMagick-6.9.12-44/magick/cache.h | 93 + ImageMagick-6.9.12-44/magick/channel.c | 1001 + ImageMagick-6.9.12-44/magick/channel.h | 41 + ImageMagick-6.9.12-44/magick/cipher.c | 1190 + ImageMagick-6.9.12-44/magick/cipher.h | 35 + ImageMagick-6.9.12-44/magick/client.c | 163 + ImageMagick-6.9.12-44/magick/client.h | 35 + ImageMagick-6.9.12-44/magick/coder.c | 977 + ImageMagick-6.9.12-44/magick/coder.h | 62 + ImageMagick-6.9.12-44/magick/color-private.h | 157 + ImageMagick-6.9.12-44/magick/color.c | 3121 ++ ImageMagick-6.9.12-44/magick/color.h | 108 + .../magick/colormap-private.h | 61 + ImageMagick-6.9.12-44/magick/colormap.c | 381 + ImageMagick-6.9.12-44/magick/colormap.h | 34 + .../magick/colorspace-private.h | 157 + ImageMagick-6.9.12-44/magick/colorspace.c | 2853 ++ ImageMagick-6.9.12-44/magick/colorspace.h | 80 + ImageMagick-6.9.12-44/magick/compare.c | 2240 + ImageMagick-6.9.12-44/magick/compare.h | 68 + .../magick/composite-private.h | 164 + ImageMagick-6.9.12-44/magick/composite.c | 3075 ++ ImageMagick-6.9.12-44/magick/composite.h | 122 + ImageMagick-6.9.12-44/magick/compress.c | 1303 + ImageMagick-6.9.12-44/magick/compress.h | 72 + ImageMagick-6.9.12-44/magick/config.h_vms | 289 + ImageMagick-6.9.12-44/magick/configure.c | 1298 + ImageMagick-6.9.12-44/magick/configure.h | 73 + ImageMagick-6.9.12-44/magick/constitute.c | 1479 + ImageMagick-6.9.12-44/magick/constitute.h | 54 + ImageMagick-6.9.12-44/magick/decorate.c | 921 + ImageMagick-6.9.12-44/magick/decorate.h | 49 + .../magick/delegate-private.h | 114 + ImageMagick-6.9.12-44/magick/delegate.c | 2358 + ImageMagick-6.9.12-44/magick/delegate.h | 87 + ImageMagick-6.9.12-44/magick/deprecate.c | 7997 ++++ ImageMagick-6.9.12-44/magick/deprecate.h | 395 + .../magick/display-private.h | 41 + ImageMagick-6.9.12-44/magick/display.c | 16110 +++++++ ImageMagick-6.9.12-44/magick/display.h | 34 + ImageMagick-6.9.12-44/magick/distort.c | 3310 ++ ImageMagick-6.9.12-44/magick/distort.h | 86 + .../magick/distribute-cache-private.h | 78 + .../magick/distribute-cache.c | 1496 + .../magick/distribute-cache.h | 34 + ImageMagick-6.9.12-44/magick/draw-private.h | 84 + ImageMagick-6.9.12-44/magick/draw.c | 7647 +++ ImageMagick-6.9.12-44/magick/draw.h | 422 + ImageMagick-6.9.12-44/magick/effect.c | 4762 ++ ImageMagick-6.9.12-44/magick/effect.h | 115 + ImageMagick-6.9.12-44/magick/enhance.c | 4522 ++ ImageMagick-6.9.12-44/magick/enhance.h | 76 + .../magick/exception-private.h | 110 + ImageMagick-6.9.12-44/magick/exception.c | 1164 + ImageMagick-6.9.12-44/magick/exception.h | 178 + ImageMagick-6.9.12-44/magick/feature.c | 2373 + ImageMagick-6.9.12-44/magick/feature.h | 62 + ImageMagick-6.9.12-44/magick/fourier.c | 1724 + ImageMagick-6.9.12-44/magick/fourier.h | 48 + ImageMagick-6.9.12-44/magick/fx-private.h | 41 + ImageMagick-6.9.12-44/magick/fx.c | 2938 ++ ImageMagick-6.9.12-44/magick/fx.h | 35 + ImageMagick-6.9.12-44/magick/gem-private.h | 177 + ImageMagick-6.9.12-44/magick/gem.c | 1708 + ImageMagick-6.9.12-44/magick/gem.h | 80 + ImageMagick-6.9.12-44/magick/geometry.c | 1724 + ImageMagick-6.9.12-44/magick/geometry.h | 163 + ImageMagick-6.9.12-44/magick/hashmap.c | 1928 + ImageMagick-6.9.12-44/magick/hashmap.h | 83 + ImageMagick-6.9.12-44/magick/histogram.c | 1416 + ImageMagick-6.9.12-44/magick/histogram.h | 56 + ImageMagick-6.9.12-44/magick/identify.c | 1462 + ImageMagick-6.9.12-44/magick/identify.h | 32 + ImageMagick-6.9.12-44/magick/image-private.h | 111 + ImageMagick-6.9.12-44/magick/image-view.c | 1270 + ImageMagick-6.9.12-44/magick/image-view.h | 83 + ImageMagick-6.9.12-44/magick/image.c | 4045 ++ ImageMagick-6.9.12-44/magick/image.h | 582 + ImageMagick-6.9.12-44/magick/layer.c | 2098 + ImageMagick-6.9.12-44/magick/layer.h | 75 + .../magick/libMagickCore.map | 4 + ImageMagick-6.9.12-44/magick/list.c | 1490 + ImageMagick-6.9.12-44/magick/list.h | 65 + ImageMagick-6.9.12-44/magick/locale-private.h | 51 + ImageMagick-6.9.12-44/magick/locale.c | 1720 + ImageMagick-6.9.12-44/magick/locale_.h | 94 + ImageMagick-6.9.12-44/magick/log.c | 1902 + ImageMagick-6.9.12-44/magick/log.h | 98 + ImageMagick-6.9.12-44/magick/mac.c | 1606 + ImageMagick-6.9.12-44/magick/mac.h | 111 + ImageMagick-6.9.12-44/magick/magic.c | 1089 + ImageMagick-6.9.12-44/magick/magic.h | 74 + .../magick/magick-baseconfig.h | 1687 + ImageMagick-6.9.12-44/magick/magick-config.h | 202 + ImageMagick-6.9.12-44/magick/magick-type.h | 239 + ImageMagick-6.9.12-44/magick/magick.c | 1629 + ImageMagick-6.9.12-44/magick/magick.h | 159 + ImageMagick-6.9.12-44/magick/matrix.c | 1132 + ImageMagick-6.9.12-44/magick/matrix.h | 57 + ImageMagick-6.9.12-44/magick/memory-private.h | 68 + ImageMagick-6.9.12-44/magick/memory.c | 1556 + ImageMagick-6.9.12-44/magick/memory_.h | 106 + .../magick/method-attribute.h | 129 + ImageMagick-6.9.12-44/magick/methods.h | 1674 + ImageMagick-6.9.12-44/magick/mime-private.h | 38 + ImageMagick-6.9.12-44/magick/mime.c | 1104 + ImageMagick-6.9.12-44/magick/mime.h | 51 + ImageMagick-6.9.12-44/magick/module.c | 1726 + ImageMagick-6.9.12-44/magick/module.h | 94 + .../magick/monitor-private.h | 35 + ImageMagick-6.9.12-44/magick/monitor.c | 254 + ImageMagick-6.9.12-44/magick/monitor.h | 53 + ImageMagick-6.9.12-44/magick/montage.c | 896 + ImageMagick-6.9.12-44/magick/montage.h | 88 + .../magick/morphology-private.h | 39 + ImageMagick-6.9.12-44/magick/morphology.c | 5002 ++ ImageMagick-6.9.12-44/magick/morphology.h | 152 + ImageMagick-6.9.12-44/magick/mutex.h | 112 + .../magick/nt-base-private.h | 144 + ImageMagick-6.9.12-44/magick/nt-base.c | 2647 ++ ImageMagick-6.9.12-44/magick/nt-base.h | 330 + ImageMagick-6.9.12-44/magick/nt-feature.c | 386 + ImageMagick-6.9.12-44/magick/nt-feature.h | 41 + ImageMagick-6.9.12-44/magick/opencl-private.h | 447 + ImageMagick-6.9.12-44/magick/opencl.c | 3101 ++ ImageMagick-6.9.12-44/magick/opencl.h | 69 + ImageMagick-6.9.12-44/magick/option-private.h | 29 + ImageMagick-6.9.12-44/magick/option.c | 2856 ++ ImageMagick-6.9.12-44/magick/option.h | 188 + ImageMagick-6.9.12-44/magick/paint.c | 1331 + ImageMagick-6.9.12-44/magick/paint.h | 50 + ImageMagick-6.9.12-44/magick/pixel-accessor.h | 246 + ImageMagick-6.9.12-44/magick/pixel-private.h | 119 + ImageMagick-6.9.12-44/magick/pixel.c | 4942 ++ ImageMagick-6.9.12-44/magick/pixel.h | 195 + ImageMagick-6.9.12-44/magick/policy-private.h | 40 + ImageMagick-6.9.12-44/magick/policy.c | 1118 + ImageMagick-6.9.12-44/magick/policy.h | 74 + ImageMagick-6.9.12-44/magick/prepress.c | 158 + ImageMagick-6.9.12-44/magick/prepress.h | 32 + ImageMagick-6.9.12-44/magick/profile.c | 2258 + ImageMagick-6.9.12-44/magick/profile.h | 75 + ImageMagick-6.9.12-44/magick/property.c | 4517 ++ ImageMagick-6.9.12-44/magick/property.h | 50 + ImageMagick-6.9.12-44/magick/quantize.c | 3417 ++ ImageMagick-6.9.12-44/magick/quantize.h | 82 + ImageMagick-6.9.12-44/magick/quantum-export.c | 4043 ++ ImageMagick-6.9.12-44/magick/quantum-import.c | 4589 ++ .../magick/quantum-private.h | 710 + ImageMagick-6.9.12-44/magick/quantum.c | 1022 + ImageMagick-6.9.12-44/magick/quantum.h | 198 + ImageMagick-6.9.12-44/magick/random-private.h | 71 + ImageMagick-6.9.12-44/magick/random.c | 980 + ImageMagick-6.9.12-44/magick/random_.h | 64 + ImageMagick-6.9.12-44/magick/registry.c | 530 + ImageMagick-6.9.12-44/magick/registry.h | 53 + .../magick/resample-private.h | 75 + ImageMagick-6.9.12-44/magick/resample.c | 1470 + ImageMagick-6.9.12-44/magick/resample.h | 99 + ImageMagick-6.9.12-44/magick/resize-private.h | 67 + ImageMagick-6.9.12-44/magick/resize.c | 3809 ++ ImageMagick-6.9.12-44/magick/resize.h | 48 + ImageMagick-6.9.12-44/magick/resource.c | 1677 + ImageMagick-6.9.12-44/magick/resource_.h | 67 + ImageMagick-6.9.12-44/magick/segment.c | 1934 + ImageMagick-6.9.12-44/magick/segment.h | 35 + .../magick/semaphore-private.h | 29 + ImageMagick-6.9.12-44/magick/semaphore.c | 482 + ImageMagick-6.9.12-44/magick/semaphore.h | 48 + ImageMagick-6.9.12-44/magick/shear.c | 1842 + ImageMagick-6.9.12-44/magick/shear.h | 35 + .../magick/signature-private.h | 56 + ImageMagick-6.9.12-44/magick/signature.c | 801 + ImageMagick-6.9.12-44/magick/signature.h | 32 + ImageMagick-6.9.12-44/magick/splay-tree.c | 1635 + ImageMagick-6.9.12-44/magick/splay-tree.h | 62 + ImageMagick-6.9.12-44/magick/static.c | 544 + ImageMagick-6.9.12-44/magick/static.h | 368 + ImageMagick-6.9.12-44/magick/statistic.c | 3830 ++ ImageMagick-6.9.12-44/magick/statistic.h | 183 + ImageMagick-6.9.12-44/magick/stream-private.h | 50 + ImageMagick-6.9.12-44/magick/stream.c | 2797 ++ ImageMagick-6.9.12-44/magick/stream.h | 38 + ImageMagick-6.9.12-44/magick/string-private.h | 134 + ImageMagick-6.9.12-44/magick/string.c | 2610 ++ ImageMagick-6.9.12-44/magick/string_.h | 118 + ImageMagick-6.9.12-44/magick/studio.h | 394 + ImageMagick-6.9.12-44/magick/thread-private.h | 164 + ImageMagick-6.9.12-44/magick/thread.c | 303 + ImageMagick-6.9.12-44/magick/thread_.h | 66 + ImageMagick-6.9.12-44/magick/threshold.c | 2752 ++ ImageMagick-6.9.12-44/magick/threshold.h | 72 + ImageMagick-6.9.12-44/magick/timer-private.h | 64 + ImageMagick-6.9.12-44/magick/timer.c | 570 + ImageMagick-6.9.12-44/magick/timer.h | 76 + ImageMagick-6.9.12-44/magick/token-private.h | 197 + ImageMagick-6.9.12-44/magick/token.c | 1035 + ImageMagick-6.9.12-44/magick/token.h | 53 + ImageMagick-6.9.12-44/magick/transform.c | 2504 + ImageMagick-6.9.12-44/magick/transform.h | 50 + ImageMagick-6.9.12-44/magick/type.c | 1383 + ImageMagick-6.9.12-44/magick/type.h | 108 + .../magick/utility-private.h | 287 + ImageMagick-6.9.12-44/magick/utility.c | 1946 + ImageMagick-6.9.12-44/magick/utility.h | 73 + .../magick/version-private.h | 34 + ImageMagick-6.9.12-44/magick/version.c | 655 + ImageMagick-6.9.12-44/magick/version.h | 95 + ImageMagick-6.9.12-44/magick/version.h.in | 95 + ImageMagick-6.9.12-44/magick/vision.c | 868 + ImageMagick-6.9.12-44/magick/vision.h | 32 + ImageMagick-6.9.12-44/magick/visual-effects.c | 3753 ++ ImageMagick-6.9.12-44/magick/visual-effects.h | 75 + ImageMagick-6.9.12-44/magick/vms.c | 271 + ImageMagick-6.9.12-44/magick/vms.h | 985 + ImageMagick-6.9.12-44/magick/widget.c | 9653 ++++ ImageMagick-6.9.12-44/magick/widget.h | 79 + .../magick/xml-tree-private.h | 32 + ImageMagick-6.9.12-44/magick/xml-tree.c | 2865 ++ ImageMagick-6.9.12-44/magick/xml-tree.h | 65 + ImageMagick-6.9.12-44/magick/xwdfile.h_vms | 109 + .../magick/xwindow-private.h | 592 + ImageMagick-6.9.12-44/magick/xwindow.c | 9917 ++++ ImageMagick-6.9.12-44/magick/xwindow.h | 45 + ImageMagick-6.9.12-44/scripts/Makefile.am | 250 + .../scripts/format_c_api_docs | 647 + ImageMagick-6.9.12-44/scripts/txt2html | 969 + ImageMagick-6.9.12-44/scripts/xsnap | 606 + ImageMagick-6.9.12-44/tests/Makefile.am | 69 + .../tests/cli-colorspace.tap | 116 + ImageMagick-6.9.12-44/tests/cli-pipe.tap | 31 + ImageMagick-6.9.12-44/tests/common.shi | 11 + ImageMagick-6.9.12-44/tests/drawtest.c | 464 + ImageMagick-6.9.12-44/tests/drawtest.tap | 13 + ImageMagick-6.9.12-44/tests/input_256c.miff | Bin 0 -> 4120 bytes .../tests/input_bilevel.miff | Bin 0 -> 3328 bytes ImageMagick-6.9.12-44/tests/input_gray.miff | Bin 0 -> 4092 bytes .../tests/input_truecolor.miff | 5 + ImageMagick-6.9.12-44/tests/rose.pnm | 4 + ImageMagick-6.9.12-44/tests/sequence.miff | Bin 0 -> 185750 bytes .../tests/validate-colorspace.tap | 24 + .../tests/validate-compare.tap | 24 + .../tests/validate-composite.tap | 24 + .../tests/validate-convert.tap | 24 + .../tests/validate-formats-disk.tap | 24 + .../tests/validate-formats-map.tap | 24 + .../tests/validate-formats-memory.tap | 24 + .../tests/validate-identify.tap | 24 + .../tests/validate-import.tap | 24 + .../tests/validate-montage.tap | 24 + .../tests/validate-stream.tap | 24 + ImageMagick-6.9.12-44/tests/validate.c | 2531 + ImageMagick-6.9.12-44/tests/validate.h | 516 + ImageMagick-6.9.12-44/tests/wandtest.c | 5500 +++ ImageMagick-6.9.12-44/tests/wandtest.tap | 15 + ImageMagick-6.9.12-44/utilities/ImageMagick.1 | 83 + .../utilities/ImageMagick.1.in | 83 + ImageMagick-6.9.12-44/utilities/Makefile.am | 110 + ImageMagick-6.9.12-44/utilities/animate.1 | 101 + ImageMagick-6.9.12-44/utilities/animate.1.in | 101 + ImageMagick-6.9.12-44/utilities/animate.c | 118 + ImageMagick-6.9.12-44/utilities/compare.1 | 103 + ImageMagick-6.9.12-44/utilities/compare.1.in | 103 + ImageMagick-6.9.12-44/utilities/compare.c | 124 + ImageMagick-6.9.12-44/utilities/composite.1 | 116 + .../utilities/composite.1.in | 116 + ImageMagick-6.9.12-44/utilities/composite.c | 109 + ImageMagick-6.9.12-44/utilities/conjure.1 | 34 + ImageMagick-6.9.12-44/utilities/conjure.1.in | 34 + ImageMagick-6.9.12-44/utilities/conjure.c | 128 + ImageMagick-6.9.12-44/utilities/convert.1 | 323 + ImageMagick-6.9.12-44/utilities/convert.1.in | 323 + ImageMagick-6.9.12-44/utilities/convert.c | 115 + ImageMagick-6.9.12-44/utilities/display.1 | 139 + ImageMagick-6.9.12-44/utilities/display.1.in | 139 + ImageMagick-6.9.12-44/utilities/display.c | 123 + ImageMagick-6.9.12-44/utilities/identify.1 | 81 + ImageMagick-6.9.12-44/utilities/identify.1.in | 81 + ImageMagick-6.9.12-44/utilities/identify.c | 116 + ImageMagick-6.9.12-44/utilities/import.1 | 99 + ImageMagick-6.9.12-44/utilities/import.1.in | 99 + ImageMagick-6.9.12-44/utilities/import.c | 115 + ImageMagick-6.9.12-44/utilities/mogrify.1 | 327 + ImageMagick-6.9.12-44/utilities/mogrify.1.in | 327 + ImageMagick-6.9.12-44/utilities/mogrify.c | 111 + ImageMagick-6.9.12-44/utilities/montage.1 | 148 + ImageMagick-6.9.12-44/utilities/montage.1.in | 148 + ImageMagick-6.9.12-44/utilities/montage.c | 111 + ImageMagick-6.9.12-44/utilities/stream.1 | 59 + ImageMagick-6.9.12-44/utilities/stream.1.in | 59 + ImageMagick-6.9.12-44/utilities/stream.c | 111 + ImageMagick-6.9.12-44/wand/ChangeLog | 351 + .../wand/MagickWand-config.1 | 69 + .../wand/MagickWand-config.in | 62 + ImageMagick-6.9.12-44/wand/MagickWand.h | 131 + ImageMagick-6.9.12-44/wand/MagickWand.pc.in | 15 + ImageMagick-6.9.12-44/wand/Makefile.am | 146 + ImageMagick-6.9.12-44/wand/Wand-config.1 | 69 + ImageMagick-6.9.12-44/wand/Wand-config.in | 62 + ImageMagick-6.9.12-44/wand/Wand.pc.in | 15 + ImageMagick-6.9.12-44/wand/animate.c | 1443 + ImageMagick-6.9.12-44/wand/animate.h | 32 + ImageMagick-6.9.12-44/wand/compare.c | 1463 + ImageMagick-6.9.12-44/wand/compare.h | 32 + ImageMagick-6.9.12-44/wand/composite.c | 1657 + ImageMagick-6.9.12-44/wand/composite.h | 32 + ImageMagick-6.9.12-44/wand/conjure.c | 302 + ImageMagick-6.9.12-44/wand/conjure.h | 32 + ImageMagick-6.9.12-44/wand/convert.c | 3250 ++ ImageMagick-6.9.12-44/wand/convert.h | 32 + ImageMagick-6.9.12-44/wand/deprecate.c | 3161 ++ ImageMagick-6.9.12-44/wand/deprecate.h | 183 + ImageMagick-6.9.12-44/wand/display.c | 1891 + ImageMagick-6.9.12-44/wand/display.h | 32 + ImageMagick-6.9.12-44/wand/drawing-wand.c | 6899 +++ ImageMagick-6.9.12-44/wand/drawing-wand.h | 224 + ImageMagick-6.9.12-44/wand/identify.c | 919 + ImageMagick-6.9.12-44/wand/identify.h | 32 + ImageMagick-6.9.12-44/wand/import.c | 1290 + ImageMagick-6.9.12-44/wand/import.h | 32 + ImageMagick-6.9.12-44/wand/libMagickWand.map | 4 + ImageMagick-6.9.12-44/wand/magick-image.c | 13539 ++++++ ImageMagick-6.9.12-44/wand/magick-image.h | 464 + ImageMagick-6.9.12-44/wand/magick-property.c | 2986 ++ ImageMagick-6.9.12-44/wand/magick-property.h | 143 + .../wand/magick-wand-private.h | 83 + ImageMagick-6.9.12-44/wand/magick-wand.c | 1147 + ImageMagick-6.9.12-44/wand/magick-wand.h | 24 + ImageMagick-6.9.12-44/wand/magick_wand.h | 24 + ImageMagick-6.9.12-44/wand/method-attribute.h | 118 + ImageMagick-6.9.12-44/wand/mogrify-private.h | 129 + ImageMagick-6.9.12-44/wand/mogrify.c | 8972 ++++ ImageMagick-6.9.12-44/wand/mogrify.h | 43 + ImageMagick-6.9.12-44/wand/montage.c | 1841 + ImageMagick-6.9.12-44/wand/montage.h | 32 + ImageMagick-6.9.12-44/wand/pixel-iterator.c | 996 + ImageMagick-6.9.12-44/wand/pixel-iterator.h | 68 + .../wand/pixel-wand-private.h | 29 + ImageMagick-6.9.12-44/wand/pixel-wand.c | 2324 + ImageMagick-6.9.12-44/wand/pixel-wand.h | 114 + ImageMagick-6.9.12-44/wand/stream.c | 753 + ImageMagick-6.9.12-44/wand/stream.h | 32 + ImageMagick-6.9.12-44/wand/studio.h | 366 + ImageMagick-6.9.12-44/wand/wand-view.c | 1401 + ImageMagick-6.9.12-44/wand/wand-view.h | 73 + ImageMagick-6.9.12-44/wand/wand.c | 156 + ImageMagick-6.9.12-44/wand/wand.h | 36 + ImageMagick-6.9.12-44/winpath.sh | 71 + ImageMagick-6.9.12-44/www/Magick++/Blob.html | 93 + ImageMagick-6.9.12-44/www/Magick++/COPYING | 22 + ImageMagick-6.9.12-44/www/Magick++/Cache.fig | 35 + ImageMagick-6.9.12-44/www/Magick++/Cache.png | Bin 0 -> 1838 bytes ImageMagick-6.9.12-44/www/Magick++/Cache.svg | 37 + .../www/Magick++/ChangeLog.html | 10 + .../www/Magick++/CoderInfo.html | 104 + ImageMagick-6.9.12-44/www/Magick++/Color.html | 260 + .../www/Magick++/Documentation.html | 67 + .../www/Magick++/Drawable.html | 798 + .../www/Magick++/Drawable_example_1.png | Bin 0 -> 1438 bytes .../www/Magick++/Enumerations.html | 2523 + .../www/Magick++/Exception.html | 465 + .../www/Magick++/FormatCharacters.html | 96 + .../www/Magick++/Future.html | 10 + .../www/Magick++/Geometry.html | 820 + .../www/Magick++/Image++.html | 3145 ++ ImageMagick-6.9.12-44/www/Magick++/Image.fig | 98 + ImageMagick-6.9.12-44/www/Magick++/Image.html | 3145 ++ ImageMagick-6.9.12-44/www/Magick++/Image.png | Bin 0 -> 23923 bytes .../www/Magick++/ImageDesign.html | 17 + .../www/Magick++/ImageMagick.png | Bin 0 -> 305589 bytes .../www/Magick++/Install.html | 268 + .../www/Magick++/Magick++.png | Bin 0 -> 10111 bytes .../www/Magick++/Montage.html | 332 + ImageMagick-6.9.12-44/www/Magick++/NEWS.html | 10 + .../www/Magick++/PixelPacket.html | 111 + .../www/Magick++/Pixels.html | 259 + ImageMagick-6.9.12-44/www/Magick++/README.txt | 5 + ImageMagick-6.9.12-44/www/Magick++/STL.html | 1908 + .../www/Magick++/TypeMetric.html | 91 + ImageMagick-6.9.12-44/www/Magick++/index.html | 92 + ImageMagick-6.9.12-44/www/Magick++/magick.css | 798 + .../www/Magick++/montage-sample-framed.jpg | Bin 0 -> 20198 bytes .../www/Magick++/right_triangle.png | Bin 0 -> 150 bytes .../www/Magick++/thumbnail-anatomy-framed.fig | 40 + .../www/Magick++/thumbnail-anatomy-framed.jpg | Bin 0 -> 14968 bytes .../www/Magick++/thumbnail-anatomy-plain.fig | 35 + .../www/Magick++/thumbnail-anatomy-plain.jpg | Bin 0 -> 12609 bytes .../www/Magick++/thumbnail-sample-framed.jpg | Bin 0 -> 9315 bytes .../www/Magick++/thumbnail-sample-plain.jpg | Bin 0 -> 7387 bytes .../www/advanced-linux-installation.html | 658 + .../www/advanced-unix-installation.html | 659 + .../www/advanced-windows-installation.html | 159 + ImageMagick-6.9.12-44/www/animate.html | 576 + ImageMagick-6.9.12-44/www/api/Image++.html | 3245 ++ ImageMagick-6.9.12-44/www/api/animate.html | 124 + ImageMagick-6.9.12-44/www/api/annotate.html | 278 + ImageMagick-6.9.12-44/www/api/attribute.html | 419 + ImageMagick-6.9.12-44/www/api/blob.html | 433 + ImageMagick-6.9.12-44/www/api/cache-view.html | 686 + ImageMagick-6.9.12-44/www/api/cache.html | 577 + ImageMagick-6.9.12-44/www/api/channel.html | 258 + ImageMagick-6.9.12-44/www/api/cipher.html | 357 + ImageMagick-6.9.12-44/www/api/color.html | 423 + ImageMagick-6.9.12-44/www/api/colormap.html | 176 + ImageMagick-6.9.12-44/www/api/colorspace.html | 266 + ImageMagick-6.9.12-44/www/api/compare.html | 163 + ImageMagick-6.9.12-44/www/api/composite.html | 163 + ImageMagick-6.9.12-44/www/api/constitute.html | 337 + ImageMagick-6.9.12-44/www/api/decorate.html | 217 + ImageMagick-6.9.12-44/www/api/deprecate.html | 1738 + ImageMagick-6.9.12-44/www/api/display.html | 124 + ImageMagick-6.9.12-44/www/api/distort.html | 291 + ImageMagick-6.9.12-44/www/api/draw.html | 464 + .../www/api/drawing-wand.html | 3867 ++ ImageMagick-6.9.12-44/www/api/effect.html | 826 + ImageMagick-6.9.12-44/www/api/enhance.html | 842 + ImageMagick-6.9.12-44/www/api/exception.html | 514 + ImageMagick-6.9.12-44/www/api/feature.html | 277 + ImageMagick-6.9.12-44/www/api/fourier.html | 222 + ImageMagick-6.9.12-44/www/api/fx.html | 161 + ImageMagick-6.9.12-44/www/api/histogram.html | 283 + ImageMagick-6.9.12-44/www/api/image-view.html | 698 + ImageMagick-6.9.12-44/www/api/image.html | 1192 + ImageMagick-6.9.12-44/www/api/layer.html | 472 + ImageMagick-6.9.12-44/www/api/list.html | 783 + .../www/api/magick++-classes.html | 174 + .../www/api/magick-deprecate.html | 1735 + .../www/api/magick-image.html | 8207 ++++ .../www/api/magick-property.html | 1963 + .../www/api/magick-wand.html | 708 + ImageMagick-6.9.12-44/www/api/magick.html | 207 + ImageMagick-6.9.12-44/www/api/memory.html | 556 + ImageMagick-6.9.12-44/www/api/mime.html | 275 + ImageMagick-6.9.12-44/www/api/module.html | 547 + ImageMagick-6.9.12-44/www/api/mogrify.html | 168 + ImageMagick-6.9.12-44/www/api/monitor.html | 237 + ImageMagick-6.9.12-44/www/api/montage.html | 124 + ImageMagick-6.9.12-44/www/api/morphology.html | 487 + ImageMagick-6.9.12-44/www/api/paint.html | 327 + .../www/api/pixel-iterator.html | 547 + ImageMagick-6.9.12-44/www/api/pixel-wand.html | 1664 + ImageMagick-6.9.12-44/www/api/profile.html | 389 + ImageMagick-6.9.12-44/www/api/property.html | 422 + ImageMagick-6.9.12-44/www/api/quantize.html | 497 + ImageMagick-6.9.12-44/www/api/registry.html | 295 + ImageMagick-6.9.12-44/www/api/resize.html | 490 + ImageMagick-6.9.12-44/www/api/resource.html | 312 + ImageMagick-6.9.12-44/www/api/segment.html | 153 + ImageMagick-6.9.12-44/www/api/shear.html | 230 + ImageMagick-6.9.12-44/www/api/signature.html | 146 + ImageMagick-6.9.12-44/www/api/statistic.html | 545 + ImageMagick-6.9.12-44/www/api/stream.html | 163 + ImageMagick-6.9.12-44/www/api/transform.html | 604 + ImageMagick-6.9.12-44/www/api/version.html | 312 + ImageMagick-6.9.12-44/www/api/wand-view.html | 630 + ImageMagick-6.9.12-44/www/architecture.html | 1507 + ImageMagick-6.9.12-44/www/assets/magick.css | 64 + ImageMagick-6.9.12-44/www/assets/magick.js | 7 + ImageMagick-6.9.12-44/www/changelog.html | 5356 +++ ImageMagick-6.9.12-44/www/cipher.html | 183 + ImageMagick-6.9.12-44/www/cite.html | 140 + .../www/color-management.html | 178 + ImageMagick-6.9.12-44/www/color.html | 4993 ++ .../www/command-line-options.html | 7473 +++ .../www/command-line-processing.html | 662 + .../www/command-line-tools.html | 145 + ImageMagick-6.9.12-44/www/compare.html | 476 + ImageMagick-6.9.12-44/www/compose.html | 691 + ImageMagick-6.9.12-44/www/composite.html | 570 + ImageMagick-6.9.12-44/www/conjure.html | 1183 + .../www/connected-components.html | 164 + ImageMagick-6.9.12-44/www/contact.html | 180 + .../www/contrib/color-converter.html | 10 + .../www/contrib/color-swatch.html | 10 + ImageMagick-6.9.12-44/www/convert.html | 1358 + ImageMagick-6.9.12-44/www/defines.html | 1494 + ImageMagick-6.9.12-44/www/develop.html | 236 + ImageMagick-6.9.12-44/www/display.html | 611 + .../www/distribute-pixel-cache.html | 139 + ImageMagick-6.9.12-44/www/download.html | 482 + ImageMagick-6.9.12-44/www/escape.html | 953 + ImageMagick-6.9.12-44/www/examples.html | 126 + ImageMagick-6.9.12-44/www/exception.html | 315 + ImageMagick-6.9.12-44/www/export.html | 126 + ImageMagick-6.9.12-44/www/favicon.ico | Bin 0 -> 99254 bytes ImageMagick-6.9.12-44/www/formats.html | 2140 + ImageMagick-6.9.12-44/www/fx.html | 491 + ImageMagick-6.9.12-44/www/gradient.html | 286 + .../www/high-dynamic-range.html | 150 + ImageMagick-6.9.12-44/www/history.html | 143 + ImageMagick-6.9.12-44/www/identify.html | 492 + ImageMagick-6.9.12-44/www/import.html | 471 + ImageMagick-6.9.12-44/www/index.html | 275 + ImageMagick-6.9.12-44/www/install-source.html | 203 + ImageMagick-6.9.12-44/www/jp2.html | 202 + ImageMagick-6.9.12-44/www/license.html | 248 + ImageMagick-6.9.12-44/www/links.html | 206 + ImageMagick-6.9.12-44/www/magick++.html | 229 + ImageMagick-6.9.12-44/www/magick-core.html | 376 + ImageMagick-6.9.12-44/www/magick-script.html | 1323 + .../www/magick-vector-graphics.html | 929 + ImageMagick-6.9.12-44/www/magick-wand.html | 424 + ImageMagick-6.9.12-44/www/magick.html | 1361 + ImageMagick-6.9.12-44/www/miff.html | 290 + ImageMagick-6.9.12-44/www/mirror.html | 148 + ImageMagick-6.9.12-44/www/mogrify.html | 1340 + ImageMagick-6.9.12-44/www/montage.html | 686 + ImageMagick-6.9.12-44/www/motion-picture.html | 236 + ImageMagick-6.9.12-44/www/news.html | 150 + ImageMagick-6.9.12-44/www/opencl.html | 152 + ImageMagick-6.9.12-44/www/openmp.html | 143 + ImageMagick-6.9.12-44/www/perl-magick.html | 2657 ++ ImageMagick-6.9.12-44/www/porting.html | 694 + ImageMagick-6.9.12-44/www/quantize.html | 244 + ImageMagick-6.9.12-44/www/resources.html | 417 + ImageMagick-6.9.12-44/www/search.html | 157 + .../www/security-policy.html | 294 + ImageMagick-6.9.12-44/www/sitemap.html | 279 + ImageMagick-6.9.12-44/www/source/analyze.c | 237 + ImageMagick-6.9.12-44/www/source/coder.xml | 23 + ImageMagick-6.9.12-44/www/source/colors.xml | 28 + .../www/source/configure.xml | 50 + ImageMagick-6.9.12-44/www/source/contrast.c | 106 + ImageMagick-6.9.12-44/www/source/core.c | 63 + .../www/source/core/sigmoidal-contrast.c | 116 + .../www/source/delegates.xml | 122 + ImageMagick-6.9.12-44/www/source/english.xml | 1682 + ImageMagick-6.9.12-44/www/source/examples.pl | 460 + ImageMagick-6.9.12-44/www/source/francais.xml | 1664 + .../www/source/incantation.msl | 9 + ImageMagick-6.9.12-44/www/source/locale.xml | 48 + ImageMagick-6.9.12-44/www/source/log.xml | 80 + ImageMagick-6.9.12-44/www/source/magic.xml | 23 + ImageMagick-6.9.12-44/www/source/mgk.c | 450 + ImageMagick-6.9.12-44/www/source/mime.xml | 1145 + ImageMagick-6.9.12-44/www/source/piechart.mvg | 150 + ImageMagick-6.9.12-44/www/source/piechart.svg | 32 + ImageMagick-6.9.12-44/www/source/policy.xml | 80 + .../www/source/quantization-table.xml | 68 + .../www/source/thresholds.xml | 336 + .../www/source/type-apple.xml | 1367 + .../www/source/type-dejavu.xml | 58 + .../www/source/type-ghostscript.xml | 50 + .../www/source/type-urw-base35.xml | 50 + .../www/source/type-windows.xml | 105 + ImageMagick-6.9.12-44/www/source/type.xml | 17 + ImageMagick-6.9.12-44/www/source/wand.c | 55 + .../www/source/wand/sigmoidal-contrast.c | 106 + ImageMagick-6.9.12-44/www/stream.html | 320 + ImageMagick-6.9.12-44/www/support.html | 185 + ImageMagick-6.9.12-44/www/wand.png | Bin 0 -> 1511 bytes ImageMagick-6.9.12-44/www/webp.html | 236 + ImageMagick.spec | 113 +- sources | 2 +- 1597 files changed, 805439 insertions(+), 9 deletions(-) create mode 100644 ImageMagick-6.9.12-44/AUTHORS.txt create mode 100644 ImageMagick-6.9.12-44/ChangeLog.md create mode 100644 ImageMagick-6.9.12-44/ImageMagick.spec.in create mode 100644 ImageMagick-6.9.12-44/Install-mac.txt create mode 100644 ImageMagick-6.9.12-44/Install-unix.txt create mode 100644 ImageMagick-6.9.12-44/Install-vms.txt create mode 100644 ImageMagick-6.9.12-44/Install-windows.txt create mode 100644 ImageMagick-6.9.12-44/LICENSE create mode 100644 ImageMagick-6.9.12-44/Magick++/AUTHORS create mode 100644 ImageMagick-6.9.12-44/Magick++/ChangeLog create mode 100644 ImageMagick-6.9.12-44/Magick++/INSTALL create mode 100644 ImageMagick-6.9.12-44/Magick++/LICENSE create mode 100644 ImageMagick-6.9.12-44/Magick++/Makefile.am create mode 100644 ImageMagick-6.9.12-44/Magick++/NEWS create mode 100644 ImageMagick-6.9.12-44/Magick++/README create mode 100644 ImageMagick-6.9.12-44/Magick++/bin/Magick++-config.1 create mode 100755 ImageMagick-6.9.12-44/Magick++/bin/Magick++-config.in create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/analyze.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/button.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/demo.cpp create mode 100755 ImageMagick-6.9.12-44/Magick++/demo/demos.tap create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/detrans.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/flip.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/gravity.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/model.miff create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/piddle.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/shapes.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/smile.miff create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/smile_anim.miff create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/tile.miff create mode 100644 ImageMagick-6.9.12-44/Magick++/demo/zoom.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/analyze.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/button.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/demo.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/detrans.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/flip.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/gravity.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/model.miff create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/piddle.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/shapes.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/smile.miff create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/smile_anim.miff create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/tile.miff create mode 100644 ImageMagick-6.9.12-44/Magick++/examples/zoom.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Blob.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/BlobRef.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/ChannelMoments.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/CoderInfo.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Color.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Drawable.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Exception.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Functions.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Geometry.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Image.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/ImageMagick++.pc.in create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/ImageRef.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++.pc.in create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Blob.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/BlobRef.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/ChannelMoments.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/CoderInfo.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Color.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Drawable.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Exception.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Functions.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Geometry.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Image.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/ImageRef.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Include.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Montage.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Options.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Pixels.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/ResourceLimits.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/STL.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/Thread.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Magick++/TypeMetric.h create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Montage.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Options.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Pixels.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/ResourceLimits.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/STL.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/Thread.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/TypeMetric.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/lib/libMagick++.map create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/appendImages.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/attributes.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/averageImages.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/coalesceImages.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/coderInfo.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/color.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/colorHistogram.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/exceptions.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/montageImages.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/morphImages.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/readWriteBlob.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/readWriteImages.cpp create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/test_image.miff create mode 100644 ImageMagick-6.9.12-44/Magick++/tests/test_image_anim.miff create mode 100755 ImageMagick-6.9.12-44/Magick++/tests/tests.tap create mode 100755 ImageMagick-6.9.12-44/Magickshr.opt create mode 100644 ImageMagick-6.9.12-44/Makefile.am create mode 100644 ImageMagick-6.9.12-44/Makefile.in create mode 100644 ImageMagick-6.9.12-44/NEWS.txt create mode 100644 ImageMagick-6.9.12-44/NOTICE create mode 100644 ImageMagick-6.9.12-44/PerlMagick/Changelog create mode 100644 ImageMagick-6.9.12-44/PerlMagick/MANIFEST create mode 100644 ImageMagick-6.9.12-44/PerlMagick/MANIFEST.SKIP create mode 100644 ImageMagick-6.9.12-44/PerlMagick/Makefile.PL create mode 100644 ImageMagick-6.9.12-44/PerlMagick/Makefile.PL.in create mode 100644 ImageMagick-6.9.12-44/PerlMagick/Makefile.am create mode 100644 ImageMagick-6.9.12-44/PerlMagick/Makefile.nt create mode 100644 ImageMagick-6.9.12-44/PerlMagick/README.txt create mode 100755 ImageMagick-6.9.12-44/PerlMagick/check.sh create mode 100644 ImageMagick-6.9.12-44/PerlMagick/check.sh.in create mode 100644 ImageMagick-6.9.12-44/PerlMagick/default/Magick.pm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/default/Magick.pm.in create mode 100644 ImageMagick-6.9.12-44/PerlMagick/default/Makefile.PL create mode 100644 ImageMagick-6.9.12-44/PerlMagick/default/Makefile.PL.in create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/Generic.ttf create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/Makefile create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/README create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/Turtle.pm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/annotate.pl create mode 100755 ImageMagick-6.9.12-44/PerlMagick/demo/annotate_words.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/button.pl create mode 100755 ImageMagick-6.9.12-44/PerlMagick/demo/compose-specials.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/composite.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/demo.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/dst.png create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/lsys.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/model.gif create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/piddle.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/pink-flower.gif create mode 100755 ImageMagick-6.9.12-44/PerlMagick/demo/pixel-fx.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/red-flower.gif create mode 100755 ImageMagick-6.9.12-44/PerlMagick/demo/settings.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/shadow-text.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/shapes.pl create mode 100755 ImageMagick-6.9.12-44/PerlMagick/demo/single-pixels.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/smile.gif create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/src.png create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/steganography.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/tile.gif create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/tree.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/demo/yellow-flower.gif create mode 100644 ImageMagick-6.9.12-44/PerlMagick/quantum/Makefile.PL create mode 100644 ImageMagick-6.9.12-44/PerlMagick/quantum/Makefile.PL.in create mode 100644 ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.pm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.pm.in create mode 100644 ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.xs create mode 100644 ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.xs.in create mode 100644 ImageMagick-6.9.12-44/PerlMagick/quantum/typemap create mode 100644 ImageMagick-6.9.12-44/PerlMagick/quantum/typemap.in create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/MasterImage_70x46.ppm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/blob.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/bzlib/input.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/bzlib/input.miff.bz2 create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/bzlib/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/bzlib/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/cgm/input.cgm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/cgm/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/composite.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/filter.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_256.fpx create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_bw.fpx create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_grayscale.fpx create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_jpeg.fpx create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_truecolor.fpx create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/fpx/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/fpx/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/getattribute.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/hdf/input_256.hdf create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/hdf/input_truecolor.hdf create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/hdf/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/hdf/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/hpgl/input.hpgl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/hpgl/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.avs create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.bie create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.bmp create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.bmp24 create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.dcx create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.dib create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.fits create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.gif create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.gif87 create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.ico create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.im1 create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.im24 create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.im8 create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.mat create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.mtv create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.p7 create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.pcx create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.pict create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.psd create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.rle create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.sgi create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.tga create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.tim create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.viff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.wbmp create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.wpg create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.xbm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input.xpm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_16.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.cmyk create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.gray create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.rgb create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.rgba create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.uyvy create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.yuv create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_gray_lsb_08bit.mat create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_gray_lsb_double.mat create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_gray_msb_08bit.mat create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_p1.pbm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_p2.pgm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_p3.ppm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_p4.pbm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_p5.pgm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_p6.ppm create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_p7.p7 create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/input_rgb_lsb_08bit.mat create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jbig/input.jbig create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jbig/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jbig/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_idat.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_jdaa.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog_idat.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog_jdaa.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_idat.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_jdaa.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog_idat.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog_jdaa.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/input_rose.jng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jng/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jpeg/input.jpg create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jpeg/input_plane.jpg create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jpeg/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/jpeg/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/montage.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/mpeg/input.m2v create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/mpeg/input.mpg create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/mpeg/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.j2k create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.jp2 create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.jpc create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/openjp2/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/ping.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/png/input.mng create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/png/input_16.png create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/png/input_256.png create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/png/input_bw.png create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/png/input_mono.png create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/png/input_truecolor.png create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/png/read-16.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/png/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/png/write-16.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/png/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/ps/input.eps create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/ps/input.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/ps/input.ps create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/ps/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/ps/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/rad/input.rad create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/rad/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/rad/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/cgm/read.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Add.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Atop.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Bumpmap.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Clear.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Copy.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/CopyBlue.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/CopyGreen.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/CopyOpacity.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/CopyRed.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Difference.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/In.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Minus.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Multiply.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Out.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Over.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Plus.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Rotate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Subtract.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Xor.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/AdaptiveThreshold.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Annotate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Blur.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Border.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Channel.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Charcoal.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Chop.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/ColorFloodfill.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Colorize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Contrast.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Convolve.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Crop.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Despeckle.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Draw.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Edge.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Emboss.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Equalize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Flip.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Flop.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Frame.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Gamma.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/GaussianBlur.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Implode.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Level.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Magnify.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/MatteFloodfill.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/MedianFilter.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Minify.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Modulate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/MotionBlur.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Negate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Normalize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/OilPaint.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Opaque.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Quantize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/QuantizeMono.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/RadialBlur.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Raise.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/ReduceNoise.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Resize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Roll.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Rotate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Sample.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Scale.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Segment.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Set.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Shade.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Sharpen.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Shave.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Shear.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/SigmoidalContrast.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Solarize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Swirl.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Threshold.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Trim.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/UnsharpMask.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Wave.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_idat_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_jdaa_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_prog_idat_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_prog_jdaa_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_prog_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/idat_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_rose.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/jdaa_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_idat_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_jdaa_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_gray.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_gray_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_gray_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_gray_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_gray_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_gray_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/read_non_interlaced.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/read_plane_interlaced.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/write_non_interlaced.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/write_plane_interlaced.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_j2k.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_jp2.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_jpc.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/gradient.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/granite.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_avs.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_bmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_bmp24.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_cmyk.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_dcx.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_dib.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_fits.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gif.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gif87.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_lsb_08bit_mat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_lsb_double_mat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_msb_08bit_mat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_ico.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_im1.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_im24.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_im8.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_mat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_miff.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_mtv.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_null_DarkOrange.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_null_black.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_null_white.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_p7.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pbm_p1.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pbm_p4.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pcx.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pgm_p2.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pgm_p5.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pict.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_ppm_p3.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_ppm_p6.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_psd.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_rgb.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_rgb_lsb_08bit_mat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_rgba.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_rle.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_sgi.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_tga.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_tile.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_tim.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_uyvy.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_viff.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_wbmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_wpg.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xbm.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xc_black.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xpm.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xwd.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/ttf/annotate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/ttf/label.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/ttf/read.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/wmf/clock.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/wmf/wizard.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/cgm/read.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Add.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Atop.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Bumpmap.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Clear.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Copy.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyBlue.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyGreen.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyOpacity.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyRed.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Difference.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/In.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Minus.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Multiply.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Out.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Over.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Plus.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Rotate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Subtract.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Xor.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/AdaptiveThreshold.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Annotate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Blur.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Border.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Channel.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Charcoal.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Chop.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/ColorFloodfill.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Colorize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Contrast.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Convolve.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Crop.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Despeckle.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Draw.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Edge.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Emboss.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Equalize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Flip.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Flop.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Frame.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Gamma.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/GaussianBlur.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Implode.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Level.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Magnify.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/MatteFloodfill.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/MedianFilter.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Minify.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Modulate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/MotionBlur.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Negate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Normalize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/OilPaint.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Opaque.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Quantize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/RadialBlur.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Raise.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/ReduceNoise.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Resize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Roll.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Rotate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Sample.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Scale.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Segment.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Set.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Shade.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Sharpen.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Shave.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Shear.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/SigmoidalContrast.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Solarize.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Swirl.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Threshold.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Trim.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/UnsharpMask.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Wave.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_idat_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_jdaa_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_prog_idat_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_prog_jdaa_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_prog_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/idat_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_rose.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/jdaa_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_idat_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_jdaa_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_tmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog_idat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog_jdaa.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_jp2.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_jpc.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_pgx.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/read_non_interlaced.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/read_plane_interlaced.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/write_non_interlaced.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/write_plane_interlaced.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/output_p7.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/gradient.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/granite.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_avs.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_bmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_bmp24.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_cmyk.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_dcx.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_dib.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_fits.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gif.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gif87.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gray.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ico.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im1.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im24.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im8.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_mat.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_miff.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_mtv.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_DarkOrange.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_black.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_white.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_p7.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pbm_p1.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pbm_p4.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pcx.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pgm_p2.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pgm_p5.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pict.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ppm_p3.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ppm_p6.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_psd.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rgb.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rgba.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rle.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_sgi.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tga.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tile.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tim.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_uyvy.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_viff.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_wbmp.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_wpg.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xbm.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xc_black.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xpm.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xwd.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/annotate.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/label.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/read.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/wmf/clock.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/reference/write/wmf/wizard.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/setattribute.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/subroutines.pl create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_16.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_16_matte.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_matte.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_planar_contig.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_planar_separate.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_12bit.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_16bit.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_4bit.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_4bit_matte.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_8bit.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_8bit_matte.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_mono.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_16.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_stripped.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_tiled32x32.tiff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/tiff/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/ttf/input.ttf create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/ttf/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/wmf/clock.wmf create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/wmf/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/wmf/wizard.wmf create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/x11/congrats.fig create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/x11/congrats.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/x11/input.xwd create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/x11/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/x11/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/xfig/input.fig create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/xfig/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/zlib/input.miff create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/zlib/input.miff.gz create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/zlib/read.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/t/zlib/write.t create mode 100644 ImageMagick-6.9.12-44/PerlMagick/typemap create mode 100644 ImageMagick-6.9.12-44/QuickStart.txt create mode 100644 ImageMagick-6.9.12-44/README.txt create mode 100644 ImageMagick-6.9.12-44/aclocal.m4 create mode 100644 ImageMagick-6.9.12-44/coders/Makefile.am create mode 100644 ImageMagick-6.9.12-44/coders/aai.c create mode 100644 ImageMagick-6.9.12-44/coders/art.c create mode 100644 ImageMagick-6.9.12-44/coders/avs.c create mode 100644 ImageMagick-6.9.12-44/coders/bgr.c create mode 100644 ImageMagick-6.9.12-44/coders/bmp.c create mode 100644 ImageMagick-6.9.12-44/coders/braille.c create mode 100644 ImageMagick-6.9.12-44/coders/bytebuffer-private.h create mode 100644 ImageMagick-6.9.12-44/coders/cals.c create mode 100644 ImageMagick-6.9.12-44/coders/caption.c create mode 100644 ImageMagick-6.9.12-44/coders/cin.c create mode 100644 ImageMagick-6.9.12-44/coders/cip.c create mode 100644 ImageMagick-6.9.12-44/coders/clip.c create mode 100644 ImageMagick-6.9.12-44/coders/clipboard.c create mode 100644 ImageMagick-6.9.12-44/coders/cmyk.c create mode 100644 ImageMagick-6.9.12-44/coders/cut.c create mode 100644 ImageMagick-6.9.12-44/coders/dcm.c create mode 100644 ImageMagick-6.9.12-44/coders/dds.c create mode 100644 ImageMagick-6.9.12-44/coders/debug.c create mode 100644 ImageMagick-6.9.12-44/coders/dib.c create mode 100644 ImageMagick-6.9.12-44/coders/djvu.c create mode 100644 ImageMagick-6.9.12-44/coders/dng.c create mode 100644 ImageMagick-6.9.12-44/coders/dot.c create mode 100644 ImageMagick-6.9.12-44/coders/dps.c create mode 100644 ImageMagick-6.9.12-44/coders/dpx.c create mode 100644 ImageMagick-6.9.12-44/coders/emf.c create mode 100644 ImageMagick-6.9.12-44/coders/ept.c create mode 100644 ImageMagick-6.9.12-44/coders/exr.c create mode 100644 ImageMagick-6.9.12-44/coders/fax.c create mode 100644 ImageMagick-6.9.12-44/coders/fits.c create mode 100644 ImageMagick-6.9.12-44/coders/flif.c create mode 100644 ImageMagick-6.9.12-44/coders/fpx.c create mode 100644 ImageMagick-6.9.12-44/coders/ghostscript-private.h create mode 100644 ImageMagick-6.9.12-44/coders/gif.c create mode 100644 ImageMagick-6.9.12-44/coders/gradient.c create mode 100644 ImageMagick-6.9.12-44/coders/gray.c create mode 100644 ImageMagick-6.9.12-44/coders/hald.c create mode 100644 ImageMagick-6.9.12-44/coders/hdr.c create mode 100644 ImageMagick-6.9.12-44/coders/heic.c create mode 100644 ImageMagick-6.9.12-44/coders/histogram.c create mode 100644 ImageMagick-6.9.12-44/coders/hrz.c create mode 100644 ImageMagick-6.9.12-44/coders/html.c create mode 100644 ImageMagick-6.9.12-44/coders/icon.c create mode 100644 ImageMagick-6.9.12-44/coders/info.c create mode 100644 ImageMagick-6.9.12-44/coders/inline.c create mode 100644 ImageMagick-6.9.12-44/coders/ipl.c create mode 100644 ImageMagick-6.9.12-44/coders/jbig.c create mode 100644 ImageMagick-6.9.12-44/coders/jnx.c create mode 100644 ImageMagick-6.9.12-44/coders/jp2.c create mode 100644 ImageMagick-6.9.12-44/coders/jpeg.c create mode 100644 ImageMagick-6.9.12-44/coders/json.c create mode 100644 ImageMagick-6.9.12-44/coders/label.c create mode 100644 ImageMagick-6.9.12-44/coders/mac.c create mode 100644 ImageMagick-6.9.12-44/coders/magick.c create mode 100644 ImageMagick-6.9.12-44/coders/map.c create mode 100644 ImageMagick-6.9.12-44/coders/mask.c create mode 100644 ImageMagick-6.9.12-44/coders/mat.c create mode 100644 ImageMagick-6.9.12-44/coders/matte.c create mode 100644 ImageMagick-6.9.12-44/coders/meta.c create mode 100644 ImageMagick-6.9.12-44/coders/miff.c create mode 100644 ImageMagick-6.9.12-44/coders/mono.c create mode 100644 ImageMagick-6.9.12-44/coders/mpc.c create mode 100644 ImageMagick-6.9.12-44/coders/mpr.c create mode 100644 ImageMagick-6.9.12-44/coders/msl.c create mode 100644 ImageMagick-6.9.12-44/coders/mtv.c create mode 100644 ImageMagick-6.9.12-44/coders/mvg.c create mode 100644 ImageMagick-6.9.12-44/coders/null.c create mode 100644 ImageMagick-6.9.12-44/coders/otb.c create mode 100644 ImageMagick-6.9.12-44/coders/palm.c create mode 100644 ImageMagick-6.9.12-44/coders/pango.c create mode 100644 ImageMagick-6.9.12-44/coders/pattern.c create mode 100644 ImageMagick-6.9.12-44/coders/pcd.c create mode 100644 ImageMagick-6.9.12-44/coders/pcl.c create mode 100644 ImageMagick-6.9.12-44/coders/pcx.c create mode 100644 ImageMagick-6.9.12-44/coders/pdb.c create mode 100644 ImageMagick-6.9.12-44/coders/pdf.c create mode 100644 ImageMagick-6.9.12-44/coders/pes.c create mode 100644 ImageMagick-6.9.12-44/coders/pgx.c create mode 100644 ImageMagick-6.9.12-44/coders/pict.c create mode 100644 ImageMagick-6.9.12-44/coders/pix.c create mode 100644 ImageMagick-6.9.12-44/coders/plasma.c create mode 100644 ImageMagick-6.9.12-44/coders/png.c create mode 100644 ImageMagick-6.9.12-44/coders/pnm.c create mode 100644 ImageMagick-6.9.12-44/coders/preview.c create mode 100644 ImageMagick-6.9.12-44/coders/ps.c create mode 100644 ImageMagick-6.9.12-44/coders/ps2.c create mode 100644 ImageMagick-6.9.12-44/coders/ps3.c create mode 100644 ImageMagick-6.9.12-44/coders/psd-private.h create mode 100644 ImageMagick-6.9.12-44/coders/psd.c create mode 100644 ImageMagick-6.9.12-44/coders/pwp.c create mode 100644 ImageMagick-6.9.12-44/coders/raw.c create mode 100644 ImageMagick-6.9.12-44/coders/rgb.c create mode 100644 ImageMagick-6.9.12-44/coders/rgf.c create mode 100644 ImageMagick-6.9.12-44/coders/rla.c create mode 100644 ImageMagick-6.9.12-44/coders/rle.c create mode 100644 ImageMagick-6.9.12-44/coders/scr.c create mode 100644 ImageMagick-6.9.12-44/coders/screenshot.c create mode 100644 ImageMagick-6.9.12-44/coders/sct.c create mode 100644 ImageMagick-6.9.12-44/coders/sfw.c create mode 100644 ImageMagick-6.9.12-44/coders/sgi.c create mode 100644 ImageMagick-6.9.12-44/coders/sixel.c create mode 100644 ImageMagick-6.9.12-44/coders/stegano.c create mode 100644 ImageMagick-6.9.12-44/coders/sun.c create mode 100644 ImageMagick-6.9.12-44/coders/svg.c create mode 100644 ImageMagick-6.9.12-44/coders/tga.c create mode 100644 ImageMagick-6.9.12-44/coders/thumbnail.c create mode 100644 ImageMagick-6.9.12-44/coders/tiff.c create mode 100644 ImageMagick-6.9.12-44/coders/tile.c create mode 100644 ImageMagick-6.9.12-44/coders/tim.c create mode 100644 ImageMagick-6.9.12-44/coders/ttf.c create mode 100644 ImageMagick-6.9.12-44/coders/txt.c create mode 100644 ImageMagick-6.9.12-44/coders/uil.c create mode 100644 ImageMagick-6.9.12-44/coders/url.c create mode 100644 ImageMagick-6.9.12-44/coders/uyvy.c create mode 100644 ImageMagick-6.9.12-44/coders/vicar.c create mode 100644 ImageMagick-6.9.12-44/coders/vid.c create mode 100644 ImageMagick-6.9.12-44/coders/video.c create mode 100644 ImageMagick-6.9.12-44/coders/viff.c create mode 100644 ImageMagick-6.9.12-44/coders/vips.c create mode 100644 ImageMagick-6.9.12-44/coders/wbmp.c create mode 100644 ImageMagick-6.9.12-44/coders/webp.c create mode 100644 ImageMagick-6.9.12-44/coders/wmf.c create mode 100644 ImageMagick-6.9.12-44/coders/wpg.c create mode 100644 ImageMagick-6.9.12-44/coders/x.c create mode 100644 ImageMagick-6.9.12-44/coders/xbm.c create mode 100644 ImageMagick-6.9.12-44/coders/xc.c create mode 100644 ImageMagick-6.9.12-44/coders/xcf.c create mode 100644 ImageMagick-6.9.12-44/coders/xpm.c create mode 100644 ImageMagick-6.9.12-44/coders/xps.c create mode 100644 ImageMagick-6.9.12-44/coders/xwd.c create mode 100644 ImageMagick-6.9.12-44/coders/ycbcr.c create mode 100644 ImageMagick-6.9.12-44/coders/yuv.c create mode 100644 ImageMagick-6.9.12-44/common.shi.in create mode 100644 ImageMagick-6.9.12-44/config/ImageMagick.rc create mode 100644 ImageMagick-6.9.12-44/config/ImageMagick.rdf.in create mode 100644 ImageMagick-6.9.12-44/config/Magick++.dox.in create mode 100644 ImageMagick-6.9.12-44/config/MagickCore.dox.in create mode 100644 ImageMagick-6.9.12-44/config/MagickWand.dox.in create mode 100644 ImageMagick-6.9.12-44/config/Makefile.am create mode 100755 ImageMagick-6.9.12-44/config/ar-lib create mode 100644 ImageMagick-6.9.12-44/config/cmyk.icm create mode 100644 ImageMagick-6.9.12-44/config/coder.xml create mode 100644 ImageMagick-6.9.12-44/config/colors.xml create mode 100755 ImageMagick-6.9.12-44/config/compile create mode 100755 ImageMagick-6.9.12-44/config/config.guess create mode 100644 ImageMagick-6.9.12-44/config/config.h.in create mode 100755 ImageMagick-6.9.12-44/config/config.sub create mode 100644 ImageMagick-6.9.12-44/config/configure.xml.in create mode 100644 ImageMagick-6.9.12-44/config/delegates.xml.in create mode 100755 ImageMagick-6.9.12-44/config/depcomp create mode 100644 ImageMagick-6.9.12-44/config/english.xml create mode 100644 ImageMagick-6.9.12-44/config/francais.xml create mode 100755 ImageMagick-6.9.12-44/config/install-sh create mode 100755 ImageMagick-6.9.12-44/config/lndir.sh create mode 100644 ImageMagick-6.9.12-44/config/locale.md create mode 100644 ImageMagick-6.9.12-44/config/locale.xml create mode 100644 ImageMagick-6.9.12-44/config/log.xml create mode 100644 ImageMagick-6.9.12-44/config/ltmain.sh create mode 100644 ImageMagick-6.9.12-44/config/magic.xml create mode 100644 ImageMagick-6.9.12-44/config/mime.xml create mode 100755 ImageMagick-6.9.12-44/config/missing create mode 100755 ImageMagick-6.9.12-44/config/mkinstalldirs create mode 100644 ImageMagick-6.9.12-44/config/policy.xml create mode 100644 ImageMagick-6.9.12-44/config/quantization-table.xml create mode 100644 ImageMagick-6.9.12-44/config/sRGB.icm create mode 100755 ImageMagick-6.9.12-44/config/tap-driver.sh create mode 100755 ImageMagick-6.9.12-44/config/test-driver create mode 100644 ImageMagick-6.9.12-44/config/thresholds.xml create mode 100644 ImageMagick-6.9.12-44/config/type-apple.xml.in create mode 100644 ImageMagick-6.9.12-44/config/type-dejavu.xml.in create mode 100644 ImageMagick-6.9.12-44/config/type-ghostscript.xml.in create mode 100644 ImageMagick-6.9.12-44/config/type-urw-base35.xml.in create mode 100644 ImageMagick-6.9.12-44/config/type-windows.xml.in create mode 100644 ImageMagick-6.9.12-44/config/type.xml.in create mode 100755 ImageMagick-6.9.12-44/configure create mode 100644 ImageMagick-6.9.12-44/configure.ac create mode 100644 ImageMagick-6.9.12-44/filters/Makefile.am create mode 100644 ImageMagick-6.9.12-44/filters/analyze.c create mode 100644 ImageMagick-6.9.12-44/images/ImageMagick.ico create mode 100644 ImageMagick-6.9.12-44/images/affine.png create mode 100644 ImageMagick-6.9.12-44/images/annotate.png create mode 100644 ImageMagick-6.9.12-44/images/arc.png create mode 100644 ImageMagick-6.9.12-44/images/atop.gif create mode 100644 ImageMagick-6.9.12-44/images/background.jpg create mode 100644 ImageMagick-6.9.12-44/images/bitcoin.svg create mode 100644 ImageMagick-6.9.12-44/images/black.png create mode 100644 ImageMagick-6.9.12-44/images/bluebells_clipped.jpg create mode 100644 ImageMagick-6.9.12-44/images/bluebells_darker.jpg create mode 100644 ImageMagick-6.9.12-44/images/bluebells_lin.jpg create mode 100644 ImageMagick-6.9.12-44/images/bluebells_log.jpg create mode 100644 ImageMagick-6.9.12-44/images/button.gif create mode 100644 ImageMagick-6.9.12-44/images/configure.jpg create mode 100644 ImageMagick-6.9.12-44/images/cylinder_shaded.png create mode 100644 ImageMagick-6.9.12-44/images/difference.png create mode 100644 ImageMagick-6.9.12-44/images/donate.png create mode 100644 ImageMagick-6.9.12-44/images/examples.jpg create mode 100644 ImageMagick-6.9.12-44/images/frame.jpg create mode 100644 ImageMagick-6.9.12-44/images/fuzzy-magick.png create mode 100644 ImageMagick-6.9.12-44/images/gaussian-blur.png create mode 100644 ImageMagick-6.9.12-44/images/gradients/linear_gradient.png create mode 100644 ImageMagick-6.9.12-44/images/gradients/linear_gradient_default.png create mode 100644 ImageMagick-6.9.12-44/images/gradients/linear_gradient_east.png create mode 100644 ImageMagick-6.9.12-44/images/gradients/radial_gradient.png create mode 100644 ImageMagick-6.9.12-44/images/gradients/radial_gradient_diagonal.png create mode 100644 ImageMagick-6.9.12-44/images/gradients/radial_gradient_ellipse.png create mode 100644 ImageMagick-6.9.12-44/images/gradients/radial_gradient_ellipse_angle45.png create mode 100644 ImageMagick-6.9.12-44/images/gradients/radial_gradient_maximum.png create mode 100644 ImageMagick-6.9.12-44/images/gradients/radial_gradient_minimum.png create mode 100644 ImageMagick-6.9.12-44/images/granite.png create mode 100644 ImageMagick-6.9.12-44/images/imade_art2.jpg create mode 100644 ImageMagick-6.9.12-44/images/julia-set.png create mode 100644 ImageMagick-6.9.12-44/images/label.gif create mode 100644 ImageMagick-6.9.12-44/images/logo-sm-flop.png create mode 100644 ImageMagick-6.9.12-44/images/logo-sm-fx.png create mode 100644 ImageMagick-6.9.12-44/images/logo-sm.png create mode 100644 ImageMagick-6.9.12-44/images/logo.jpg create mode 100644 ImageMagick-6.9.12-44/images/logo.png create mode 100644 ImageMagick-6.9.12-44/images/montage.jpg create mode 100644 ImageMagick-6.9.12-44/images/navy.png create mode 100644 ImageMagick-6.9.12-44/images/networkredux.png create mode 100644 ImageMagick-6.9.12-44/images/objects.gif create mode 100644 ImageMagick-6.9.12-44/images/objects.jpg create mode 100644 ImageMagick-6.9.12-44/images/objects.png create mode 100644 ImageMagick-6.9.12-44/images/over.gif create mode 100644 ImageMagick-6.9.12-44/images/patterns/bricks.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/checkerboard.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/circles.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/crosshatch.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/crosshatch30.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/crosshatch45.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/fishscales.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray0.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray10.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray100.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray15.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray20.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray25.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray30.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray35.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray40.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray45.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray5.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray50.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray55.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray60.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray65.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray70.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray75.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray80.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray85.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray90.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/gray95.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/hexagons.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/horizontal.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/horizontal2.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/horizontal3.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/horizontalsaw.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/hs_bdiagonal.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/hs_cross.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/hs_diagcross.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/hs_fdiagonal.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/hs_horizontal.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/hs_vertical.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/left30.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/left45.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/leftshingle.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/octagons.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/right30.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/right45.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/rightshingle.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/smallfishscales.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/vertical.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/vertical2.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/vertical3.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/verticalbricks.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/verticalleftshingle.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/verticalrightshingle.png create mode 100644 ImageMagick-6.9.12-44/images/patterns/verticalsaw.png create mode 100644 ImageMagick-6.9.12-44/images/piechart.png create mode 100644 ImageMagick-6.9.12-44/images/radial-gradient.png create mode 100644 ImageMagick-6.9.12-44/images/reconstruct.jpg create mode 100644 ImageMagick-6.9.12-44/images/red-ball.png create mode 100644 ImageMagick-6.9.12-44/images/red-circle.png create mode 100644 ImageMagick-6.9.12-44/images/right.gif create mode 100644 ImageMagick-6.9.12-44/images/rose-over.png create mode 100644 ImageMagick-6.9.12-44/images/rose-sigmoidal.png create mode 100644 ImageMagick-6.9.12-44/images/rose.jpg create mode 100644 ImageMagick-6.9.12-44/images/rose.png create mode 100644 ImageMagick-6.9.12-44/images/rose.pnm create mode 100644 ImageMagick-6.9.12-44/images/script.png create mode 100644 ImageMagick-6.9.12-44/images/smile.gif create mode 100644 ImageMagick-6.9.12-44/images/sponsor.jpg create mode 100644 ImageMagick-6.9.12-44/images/sprite.jpg create mode 100644 ImageMagick-6.9.12-44/images/t-shirt.png create mode 100644 ImageMagick-6.9.12-44/images/transloadit.png create mode 100644 ImageMagick-6.9.12-44/images/wand.ico create mode 100644 ImageMagick-6.9.12-44/images/wand.png create mode 100644 ImageMagick-6.9.12-44/images/white-highlight.png create mode 100644 ImageMagick-6.9.12-44/images/wizard.jpg create mode 100644 ImageMagick-6.9.12-44/images/wizard.png create mode 100644 ImageMagick-6.9.12-44/index.html create mode 100644 ImageMagick-6.9.12-44/m4/Makefile.am create mode 100644 ImageMagick-6.9.12-44/m4/ac_func_fseeko.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_c___attribute__.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_cflags_warn_all.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_check_compile_flag.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_check_framework.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_compare_version.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_compiler_vendor.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_cxx_bool.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_cxx_namespace_std.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_cxx_namespaces.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_gcc_archflag.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_gcc_x86_cpuid.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_have_opencl.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_prefix_config_h.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_prepend_flag.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_prog_perl_version.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_pthread.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ax_require_defined.m4 create mode 100644 ImageMagick-6.9.12-44/m4/cxx_have_std_libs.m4 create mode 100644 ImageMagick-6.9.12-44/m4/framework.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ld-version-script.m4 create mode 100644 ImageMagick-6.9.12-44/m4/libtool.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ltoptions.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ltsugar.m4 create mode 100644 ImageMagick-6.9.12-44/m4/ltversion.m4 create mode 100644 ImageMagick-6.9.12-44/m4/lt~obsolete.m4 create mode 100644 ImageMagick-6.9.12-44/m4/pkg.m4 create mode 100644 ImageMagick-6.9.12-44/m4/version.m4 create mode 100755 ImageMagick-6.9.12-44/magick.sh.in create mode 100644 ImageMagick-6.9.12-44/magick/ImageMagick.h create mode 100644 ImageMagick-6.9.12-44/magick/ImageMagick.pc.in create mode 100644 ImageMagick-6.9.12-44/magick/Magick-config.1 create mode 100644 ImageMagick-6.9.12-44/magick/Magick-config.in create mode 100644 ImageMagick-6.9.12-44/magick/MagickCore-config.1 create mode 100644 ImageMagick-6.9.12-44/magick/MagickCore-config.in create mode 100644 ImageMagick-6.9.12-44/magick/MagickCore.h create mode 100644 ImageMagick-6.9.12-44/magick/MagickCore.pc.in create mode 100644 ImageMagick-6.9.12-44/magick/Makefile.am create mode 100644 ImageMagick-6.9.12-44/magick/accelerate-kernels-private.h create mode 100644 ImageMagick-6.9.12-44/magick/accelerate-private.h create mode 100644 ImageMagick-6.9.12-44/magick/accelerate.c create mode 100644 ImageMagick-6.9.12-44/magick/animate-private.h create mode 100644 ImageMagick-6.9.12-44/magick/animate.c create mode 100644 ImageMagick-6.9.12-44/magick/animate.h create mode 100644 ImageMagick-6.9.12-44/magick/annotate.c create mode 100644 ImageMagick-6.9.12-44/magick/annotate.h create mode 100644 ImageMagick-6.9.12-44/magick/api.h create mode 100644 ImageMagick-6.9.12-44/magick/artifact.c create mode 100644 ImageMagick-6.9.12-44/magick/artifact.h create mode 100644 ImageMagick-6.9.12-44/magick/attribute.c create mode 100644 ImageMagick-6.9.12-44/magick/attribute.h create mode 100644 ImageMagick-6.9.12-44/magick/blob-private.h create mode 100644 ImageMagick-6.9.12-44/magick/blob.c create mode 100644 ImageMagick-6.9.12-44/magick/blob.h create mode 100644 ImageMagick-6.9.12-44/magick/cache-private.h create mode 100644 ImageMagick-6.9.12-44/magick/cache-view.c create mode 100644 ImageMagick-6.9.12-44/magick/cache-view.h create mode 100644 ImageMagick-6.9.12-44/magick/cache.c create mode 100644 ImageMagick-6.9.12-44/magick/cache.h create mode 100644 ImageMagick-6.9.12-44/magick/channel.c create mode 100644 ImageMagick-6.9.12-44/magick/channel.h create mode 100644 ImageMagick-6.9.12-44/magick/cipher.c create mode 100644 ImageMagick-6.9.12-44/magick/cipher.h create mode 100644 ImageMagick-6.9.12-44/magick/client.c create mode 100644 ImageMagick-6.9.12-44/magick/client.h create mode 100644 ImageMagick-6.9.12-44/magick/coder.c create mode 100644 ImageMagick-6.9.12-44/magick/coder.h create mode 100644 ImageMagick-6.9.12-44/magick/color-private.h create mode 100644 ImageMagick-6.9.12-44/magick/color.c create mode 100644 ImageMagick-6.9.12-44/magick/color.h create mode 100644 ImageMagick-6.9.12-44/magick/colormap-private.h create mode 100644 ImageMagick-6.9.12-44/magick/colormap.c create mode 100644 ImageMagick-6.9.12-44/magick/colormap.h create mode 100644 ImageMagick-6.9.12-44/magick/colorspace-private.h create mode 100644 ImageMagick-6.9.12-44/magick/colorspace.c create mode 100644 ImageMagick-6.9.12-44/magick/colorspace.h create mode 100644 ImageMagick-6.9.12-44/magick/compare.c create mode 100644 ImageMagick-6.9.12-44/magick/compare.h create mode 100644 ImageMagick-6.9.12-44/magick/composite-private.h create mode 100644 ImageMagick-6.9.12-44/magick/composite.c create mode 100644 ImageMagick-6.9.12-44/magick/composite.h create mode 100644 ImageMagick-6.9.12-44/magick/compress.c create mode 100644 ImageMagick-6.9.12-44/magick/compress.h create mode 100755 ImageMagick-6.9.12-44/magick/config.h_vms create mode 100644 ImageMagick-6.9.12-44/magick/configure.c create mode 100644 ImageMagick-6.9.12-44/magick/configure.h create mode 100644 ImageMagick-6.9.12-44/magick/constitute.c create mode 100644 ImageMagick-6.9.12-44/magick/constitute.h create mode 100644 ImageMagick-6.9.12-44/magick/decorate.c create mode 100644 ImageMagick-6.9.12-44/magick/decorate.h create mode 100644 ImageMagick-6.9.12-44/magick/delegate-private.h create mode 100644 ImageMagick-6.9.12-44/magick/delegate.c create mode 100644 ImageMagick-6.9.12-44/magick/delegate.h create mode 100644 ImageMagick-6.9.12-44/magick/deprecate.c create mode 100644 ImageMagick-6.9.12-44/magick/deprecate.h create mode 100644 ImageMagick-6.9.12-44/magick/display-private.h create mode 100644 ImageMagick-6.9.12-44/magick/display.c create mode 100644 ImageMagick-6.9.12-44/magick/display.h create mode 100644 ImageMagick-6.9.12-44/magick/distort.c create mode 100644 ImageMagick-6.9.12-44/magick/distort.h create mode 100644 ImageMagick-6.9.12-44/magick/distribute-cache-private.h create mode 100755 ImageMagick-6.9.12-44/magick/distribute-cache.c create mode 100644 ImageMagick-6.9.12-44/magick/distribute-cache.h create mode 100644 ImageMagick-6.9.12-44/magick/draw-private.h create mode 100644 ImageMagick-6.9.12-44/magick/draw.c create mode 100644 ImageMagick-6.9.12-44/magick/draw.h create mode 100644 ImageMagick-6.9.12-44/magick/effect.c create mode 100644 ImageMagick-6.9.12-44/magick/effect.h create mode 100644 ImageMagick-6.9.12-44/magick/enhance.c create mode 100644 ImageMagick-6.9.12-44/magick/enhance.h create mode 100644 ImageMagick-6.9.12-44/magick/exception-private.h create mode 100644 ImageMagick-6.9.12-44/magick/exception.c create mode 100644 ImageMagick-6.9.12-44/magick/exception.h create mode 100644 ImageMagick-6.9.12-44/magick/feature.c create mode 100644 ImageMagick-6.9.12-44/magick/feature.h create mode 100644 ImageMagick-6.9.12-44/magick/fourier.c create mode 100644 ImageMagick-6.9.12-44/magick/fourier.h create mode 100644 ImageMagick-6.9.12-44/magick/fx-private.h create mode 100644 ImageMagick-6.9.12-44/magick/fx.c create mode 100644 ImageMagick-6.9.12-44/magick/fx.h create mode 100644 ImageMagick-6.9.12-44/magick/gem-private.h create mode 100644 ImageMagick-6.9.12-44/magick/gem.c create mode 100644 ImageMagick-6.9.12-44/magick/gem.h create mode 100644 ImageMagick-6.9.12-44/magick/geometry.c create mode 100644 ImageMagick-6.9.12-44/magick/geometry.h create mode 100644 ImageMagick-6.9.12-44/magick/hashmap.c create mode 100644 ImageMagick-6.9.12-44/magick/hashmap.h create mode 100644 ImageMagick-6.9.12-44/magick/histogram.c create mode 100644 ImageMagick-6.9.12-44/magick/histogram.h create mode 100644 ImageMagick-6.9.12-44/magick/identify.c create mode 100644 ImageMagick-6.9.12-44/magick/identify.h create mode 100644 ImageMagick-6.9.12-44/magick/image-private.h create mode 100644 ImageMagick-6.9.12-44/magick/image-view.c create mode 100644 ImageMagick-6.9.12-44/magick/image-view.h create mode 100644 ImageMagick-6.9.12-44/magick/image.c create mode 100644 ImageMagick-6.9.12-44/magick/image.h create mode 100644 ImageMagick-6.9.12-44/magick/layer.c create mode 100644 ImageMagick-6.9.12-44/magick/layer.h create mode 100644 ImageMagick-6.9.12-44/magick/libMagickCore.map create mode 100644 ImageMagick-6.9.12-44/magick/list.c create mode 100644 ImageMagick-6.9.12-44/magick/list.h create mode 100644 ImageMagick-6.9.12-44/magick/locale-private.h create mode 100644 ImageMagick-6.9.12-44/magick/locale.c create mode 100644 ImageMagick-6.9.12-44/magick/locale_.h create mode 100644 ImageMagick-6.9.12-44/magick/log.c create mode 100644 ImageMagick-6.9.12-44/magick/log.h create mode 100644 ImageMagick-6.9.12-44/magick/mac.c create mode 100644 ImageMagick-6.9.12-44/magick/mac.h create mode 100644 ImageMagick-6.9.12-44/magick/magic.c create mode 100644 ImageMagick-6.9.12-44/magick/magic.h create mode 100644 ImageMagick-6.9.12-44/magick/magick-baseconfig.h create mode 100644 ImageMagick-6.9.12-44/magick/magick-config.h create mode 100644 ImageMagick-6.9.12-44/magick/magick-type.h create mode 100644 ImageMagick-6.9.12-44/magick/magick.c create mode 100644 ImageMagick-6.9.12-44/magick/magick.h create mode 100644 ImageMagick-6.9.12-44/magick/matrix.c create mode 100644 ImageMagick-6.9.12-44/magick/matrix.h create mode 100644 ImageMagick-6.9.12-44/magick/memory-private.h create mode 100644 ImageMagick-6.9.12-44/magick/memory.c create mode 100644 ImageMagick-6.9.12-44/magick/memory_.h create mode 100644 ImageMagick-6.9.12-44/magick/method-attribute.h create mode 100644 ImageMagick-6.9.12-44/magick/methods.h create mode 100644 ImageMagick-6.9.12-44/magick/mime-private.h create mode 100644 ImageMagick-6.9.12-44/magick/mime.c create mode 100644 ImageMagick-6.9.12-44/magick/mime.h create mode 100644 ImageMagick-6.9.12-44/magick/module.c create mode 100644 ImageMagick-6.9.12-44/magick/module.h create mode 100644 ImageMagick-6.9.12-44/magick/monitor-private.h create mode 100644 ImageMagick-6.9.12-44/magick/monitor.c create mode 100644 ImageMagick-6.9.12-44/magick/monitor.h create mode 100644 ImageMagick-6.9.12-44/magick/montage.c create mode 100644 ImageMagick-6.9.12-44/magick/montage.h create mode 100644 ImageMagick-6.9.12-44/magick/morphology-private.h create mode 100644 ImageMagick-6.9.12-44/magick/morphology.c create mode 100644 ImageMagick-6.9.12-44/magick/morphology.h create mode 100644 ImageMagick-6.9.12-44/magick/mutex.h create mode 100644 ImageMagick-6.9.12-44/magick/nt-base-private.h create mode 100644 ImageMagick-6.9.12-44/magick/nt-base.c create mode 100644 ImageMagick-6.9.12-44/magick/nt-base.h create mode 100644 ImageMagick-6.9.12-44/magick/nt-feature.c create mode 100644 ImageMagick-6.9.12-44/magick/nt-feature.h create mode 100644 ImageMagick-6.9.12-44/magick/opencl-private.h create mode 100644 ImageMagick-6.9.12-44/magick/opencl.c create mode 100644 ImageMagick-6.9.12-44/magick/opencl.h create mode 100644 ImageMagick-6.9.12-44/magick/option-private.h create mode 100644 ImageMagick-6.9.12-44/magick/option.c create mode 100644 ImageMagick-6.9.12-44/magick/option.h create mode 100644 ImageMagick-6.9.12-44/magick/paint.c create mode 100644 ImageMagick-6.9.12-44/magick/paint.h create mode 100644 ImageMagick-6.9.12-44/magick/pixel-accessor.h create mode 100644 ImageMagick-6.9.12-44/magick/pixel-private.h create mode 100644 ImageMagick-6.9.12-44/magick/pixel.c create mode 100644 ImageMagick-6.9.12-44/magick/pixel.h create mode 100644 ImageMagick-6.9.12-44/magick/policy-private.h create mode 100644 ImageMagick-6.9.12-44/magick/policy.c create mode 100644 ImageMagick-6.9.12-44/magick/policy.h create mode 100644 ImageMagick-6.9.12-44/magick/prepress.c create mode 100644 ImageMagick-6.9.12-44/magick/prepress.h create mode 100644 ImageMagick-6.9.12-44/magick/profile.c create mode 100644 ImageMagick-6.9.12-44/magick/profile.h create mode 100644 ImageMagick-6.9.12-44/magick/property.c create mode 100644 ImageMagick-6.9.12-44/magick/property.h create mode 100644 ImageMagick-6.9.12-44/magick/quantize.c create mode 100644 ImageMagick-6.9.12-44/magick/quantize.h create mode 100644 ImageMagick-6.9.12-44/magick/quantum-export.c create mode 100644 ImageMagick-6.9.12-44/magick/quantum-import.c create mode 100644 ImageMagick-6.9.12-44/magick/quantum-private.h create mode 100644 ImageMagick-6.9.12-44/magick/quantum.c create mode 100644 ImageMagick-6.9.12-44/magick/quantum.h create mode 100644 ImageMagick-6.9.12-44/magick/random-private.h create mode 100644 ImageMagick-6.9.12-44/magick/random.c create mode 100644 ImageMagick-6.9.12-44/magick/random_.h create mode 100644 ImageMagick-6.9.12-44/magick/registry.c create mode 100644 ImageMagick-6.9.12-44/magick/registry.h create mode 100644 ImageMagick-6.9.12-44/magick/resample-private.h create mode 100644 ImageMagick-6.9.12-44/magick/resample.c create mode 100644 ImageMagick-6.9.12-44/magick/resample.h create mode 100644 ImageMagick-6.9.12-44/magick/resize-private.h create mode 100644 ImageMagick-6.9.12-44/magick/resize.c create mode 100644 ImageMagick-6.9.12-44/magick/resize.h create mode 100644 ImageMagick-6.9.12-44/magick/resource.c create mode 100644 ImageMagick-6.9.12-44/magick/resource_.h create mode 100644 ImageMagick-6.9.12-44/magick/segment.c create mode 100644 ImageMagick-6.9.12-44/magick/segment.h create mode 100644 ImageMagick-6.9.12-44/magick/semaphore-private.h create mode 100644 ImageMagick-6.9.12-44/magick/semaphore.c create mode 100644 ImageMagick-6.9.12-44/magick/semaphore.h create mode 100644 ImageMagick-6.9.12-44/magick/shear.c create mode 100644 ImageMagick-6.9.12-44/magick/shear.h create mode 100644 ImageMagick-6.9.12-44/magick/signature-private.h create mode 100644 ImageMagick-6.9.12-44/magick/signature.c create mode 100644 ImageMagick-6.9.12-44/magick/signature.h create mode 100644 ImageMagick-6.9.12-44/magick/splay-tree.c create mode 100644 ImageMagick-6.9.12-44/magick/splay-tree.h create mode 100644 ImageMagick-6.9.12-44/magick/static.c create mode 100644 ImageMagick-6.9.12-44/magick/static.h create mode 100644 ImageMagick-6.9.12-44/magick/statistic.c create mode 100644 ImageMagick-6.9.12-44/magick/statistic.h create mode 100644 ImageMagick-6.9.12-44/magick/stream-private.h create mode 100644 ImageMagick-6.9.12-44/magick/stream.c create mode 100644 ImageMagick-6.9.12-44/magick/stream.h create mode 100644 ImageMagick-6.9.12-44/magick/string-private.h create mode 100644 ImageMagick-6.9.12-44/magick/string.c create mode 100644 ImageMagick-6.9.12-44/magick/string_.h create mode 100644 ImageMagick-6.9.12-44/magick/studio.h create mode 100644 ImageMagick-6.9.12-44/magick/thread-private.h create mode 100644 ImageMagick-6.9.12-44/magick/thread.c create mode 100644 ImageMagick-6.9.12-44/magick/thread_.h create mode 100644 ImageMagick-6.9.12-44/magick/threshold.c create mode 100644 ImageMagick-6.9.12-44/magick/threshold.h create mode 100644 ImageMagick-6.9.12-44/magick/timer-private.h create mode 100644 ImageMagick-6.9.12-44/magick/timer.c create mode 100644 ImageMagick-6.9.12-44/magick/timer.h create mode 100644 ImageMagick-6.9.12-44/magick/token-private.h create mode 100644 ImageMagick-6.9.12-44/magick/token.c create mode 100644 ImageMagick-6.9.12-44/magick/token.h create mode 100644 ImageMagick-6.9.12-44/magick/transform.c create mode 100644 ImageMagick-6.9.12-44/magick/transform.h create mode 100644 ImageMagick-6.9.12-44/magick/type.c create mode 100644 ImageMagick-6.9.12-44/magick/type.h create mode 100644 ImageMagick-6.9.12-44/magick/utility-private.h create mode 100644 ImageMagick-6.9.12-44/magick/utility.c create mode 100644 ImageMagick-6.9.12-44/magick/utility.h create mode 100644 ImageMagick-6.9.12-44/magick/version-private.h create mode 100644 ImageMagick-6.9.12-44/magick/version.c create mode 100644 ImageMagick-6.9.12-44/magick/version.h create mode 100644 ImageMagick-6.9.12-44/magick/version.h.in create mode 100644 ImageMagick-6.9.12-44/magick/vision.c create mode 100644 ImageMagick-6.9.12-44/magick/vision.h create mode 100644 ImageMagick-6.9.12-44/magick/visual-effects.c create mode 100644 ImageMagick-6.9.12-44/magick/visual-effects.h create mode 100644 ImageMagick-6.9.12-44/magick/vms.c create mode 100644 ImageMagick-6.9.12-44/magick/vms.h create mode 100644 ImageMagick-6.9.12-44/magick/widget.c create mode 100644 ImageMagick-6.9.12-44/magick/widget.h create mode 100644 ImageMagick-6.9.12-44/magick/xml-tree-private.h create mode 100644 ImageMagick-6.9.12-44/magick/xml-tree.c create mode 100644 ImageMagick-6.9.12-44/magick/xml-tree.h create mode 100644 ImageMagick-6.9.12-44/magick/xwdfile.h_vms create mode 100644 ImageMagick-6.9.12-44/magick/xwindow-private.h create mode 100644 ImageMagick-6.9.12-44/magick/xwindow.c create mode 100644 ImageMagick-6.9.12-44/magick/xwindow.h create mode 100644 ImageMagick-6.9.12-44/scripts/Makefile.am create mode 100755 ImageMagick-6.9.12-44/scripts/format_c_api_docs create mode 100755 ImageMagick-6.9.12-44/scripts/txt2html create mode 100644 ImageMagick-6.9.12-44/scripts/xsnap create mode 100644 ImageMagick-6.9.12-44/tests/Makefile.am create mode 100755 ImageMagick-6.9.12-44/tests/cli-colorspace.tap create mode 100755 ImageMagick-6.9.12-44/tests/cli-pipe.tap create mode 100644 ImageMagick-6.9.12-44/tests/common.shi create mode 100644 ImageMagick-6.9.12-44/tests/drawtest.c create mode 100755 ImageMagick-6.9.12-44/tests/drawtest.tap create mode 100644 ImageMagick-6.9.12-44/tests/input_256c.miff create mode 100644 ImageMagick-6.9.12-44/tests/input_bilevel.miff create mode 100644 ImageMagick-6.9.12-44/tests/input_gray.miff create mode 100644 ImageMagick-6.9.12-44/tests/input_truecolor.miff create mode 100644 ImageMagick-6.9.12-44/tests/rose.pnm create mode 100644 ImageMagick-6.9.12-44/tests/sequence.miff create mode 100755 ImageMagick-6.9.12-44/tests/validate-colorspace.tap create mode 100755 ImageMagick-6.9.12-44/tests/validate-compare.tap create mode 100755 ImageMagick-6.9.12-44/tests/validate-composite.tap create mode 100755 ImageMagick-6.9.12-44/tests/validate-convert.tap create mode 100755 ImageMagick-6.9.12-44/tests/validate-formats-disk.tap create mode 100755 ImageMagick-6.9.12-44/tests/validate-formats-map.tap create mode 100755 ImageMagick-6.9.12-44/tests/validate-formats-memory.tap create mode 100755 ImageMagick-6.9.12-44/tests/validate-identify.tap create mode 100755 ImageMagick-6.9.12-44/tests/validate-import.tap create mode 100755 ImageMagick-6.9.12-44/tests/validate-montage.tap create mode 100755 ImageMagick-6.9.12-44/tests/validate-stream.tap create mode 100644 ImageMagick-6.9.12-44/tests/validate.c create mode 100644 ImageMagick-6.9.12-44/tests/validate.h create mode 100644 ImageMagick-6.9.12-44/tests/wandtest.c create mode 100755 ImageMagick-6.9.12-44/tests/wandtest.tap create mode 100644 ImageMagick-6.9.12-44/utilities/ImageMagick.1 create mode 100644 ImageMagick-6.9.12-44/utilities/ImageMagick.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/Makefile.am create mode 100644 ImageMagick-6.9.12-44/utilities/animate.1 create mode 100644 ImageMagick-6.9.12-44/utilities/animate.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/animate.c create mode 100644 ImageMagick-6.9.12-44/utilities/compare.1 create mode 100644 ImageMagick-6.9.12-44/utilities/compare.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/compare.c create mode 100644 ImageMagick-6.9.12-44/utilities/composite.1 create mode 100644 ImageMagick-6.9.12-44/utilities/composite.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/composite.c create mode 100644 ImageMagick-6.9.12-44/utilities/conjure.1 create mode 100644 ImageMagick-6.9.12-44/utilities/conjure.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/conjure.c create mode 100644 ImageMagick-6.9.12-44/utilities/convert.1 create mode 100644 ImageMagick-6.9.12-44/utilities/convert.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/convert.c create mode 100644 ImageMagick-6.9.12-44/utilities/display.1 create mode 100644 ImageMagick-6.9.12-44/utilities/display.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/display.c create mode 100644 ImageMagick-6.9.12-44/utilities/identify.1 create mode 100644 ImageMagick-6.9.12-44/utilities/identify.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/identify.c create mode 100644 ImageMagick-6.9.12-44/utilities/import.1 create mode 100644 ImageMagick-6.9.12-44/utilities/import.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/import.c create mode 100644 ImageMagick-6.9.12-44/utilities/mogrify.1 create mode 100644 ImageMagick-6.9.12-44/utilities/mogrify.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/mogrify.c create mode 100644 ImageMagick-6.9.12-44/utilities/montage.1 create mode 100644 ImageMagick-6.9.12-44/utilities/montage.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/montage.c create mode 100644 ImageMagick-6.9.12-44/utilities/stream.1 create mode 100644 ImageMagick-6.9.12-44/utilities/stream.1.in create mode 100644 ImageMagick-6.9.12-44/utilities/stream.c create mode 100644 ImageMagick-6.9.12-44/wand/ChangeLog create mode 100644 ImageMagick-6.9.12-44/wand/MagickWand-config.1 create mode 100644 ImageMagick-6.9.12-44/wand/MagickWand-config.in create mode 100644 ImageMagick-6.9.12-44/wand/MagickWand.h create mode 100644 ImageMagick-6.9.12-44/wand/MagickWand.pc.in create mode 100644 ImageMagick-6.9.12-44/wand/Makefile.am create mode 100644 ImageMagick-6.9.12-44/wand/Wand-config.1 create mode 100644 ImageMagick-6.9.12-44/wand/Wand-config.in create mode 100644 ImageMagick-6.9.12-44/wand/Wand.pc.in create mode 100644 ImageMagick-6.9.12-44/wand/animate.c create mode 100644 ImageMagick-6.9.12-44/wand/animate.h create mode 100644 ImageMagick-6.9.12-44/wand/compare.c create mode 100644 ImageMagick-6.9.12-44/wand/compare.h create mode 100644 ImageMagick-6.9.12-44/wand/composite.c create mode 100644 ImageMagick-6.9.12-44/wand/composite.h create mode 100644 ImageMagick-6.9.12-44/wand/conjure.c create mode 100644 ImageMagick-6.9.12-44/wand/conjure.h create mode 100644 ImageMagick-6.9.12-44/wand/convert.c create mode 100644 ImageMagick-6.9.12-44/wand/convert.h create mode 100644 ImageMagick-6.9.12-44/wand/deprecate.c create mode 100644 ImageMagick-6.9.12-44/wand/deprecate.h create mode 100644 ImageMagick-6.9.12-44/wand/display.c create mode 100644 ImageMagick-6.9.12-44/wand/display.h create mode 100644 ImageMagick-6.9.12-44/wand/drawing-wand.c create mode 100644 ImageMagick-6.9.12-44/wand/drawing-wand.h create mode 100644 ImageMagick-6.9.12-44/wand/identify.c create mode 100644 ImageMagick-6.9.12-44/wand/identify.h create mode 100644 ImageMagick-6.9.12-44/wand/import.c create mode 100644 ImageMagick-6.9.12-44/wand/import.h create mode 100644 ImageMagick-6.9.12-44/wand/libMagickWand.map create mode 100644 ImageMagick-6.9.12-44/wand/magick-image.c create mode 100644 ImageMagick-6.9.12-44/wand/magick-image.h create mode 100644 ImageMagick-6.9.12-44/wand/magick-property.c create mode 100644 ImageMagick-6.9.12-44/wand/magick-property.h create mode 100644 ImageMagick-6.9.12-44/wand/magick-wand-private.h create mode 100644 ImageMagick-6.9.12-44/wand/magick-wand.c create mode 100644 ImageMagick-6.9.12-44/wand/magick-wand.h create mode 100644 ImageMagick-6.9.12-44/wand/magick_wand.h create mode 100644 ImageMagick-6.9.12-44/wand/method-attribute.h create mode 100644 ImageMagick-6.9.12-44/wand/mogrify-private.h create mode 100644 ImageMagick-6.9.12-44/wand/mogrify.c create mode 100644 ImageMagick-6.9.12-44/wand/mogrify.h create mode 100644 ImageMagick-6.9.12-44/wand/montage.c create mode 100644 ImageMagick-6.9.12-44/wand/montage.h create mode 100644 ImageMagick-6.9.12-44/wand/pixel-iterator.c create mode 100644 ImageMagick-6.9.12-44/wand/pixel-iterator.h create mode 100644 ImageMagick-6.9.12-44/wand/pixel-wand-private.h create mode 100644 ImageMagick-6.9.12-44/wand/pixel-wand.c create mode 100644 ImageMagick-6.9.12-44/wand/pixel-wand.h create mode 100644 ImageMagick-6.9.12-44/wand/stream.c create mode 100644 ImageMagick-6.9.12-44/wand/stream.h create mode 100644 ImageMagick-6.9.12-44/wand/studio.h create mode 100644 ImageMagick-6.9.12-44/wand/wand-view.c create mode 100644 ImageMagick-6.9.12-44/wand/wand-view.h create mode 100644 ImageMagick-6.9.12-44/wand/wand.c create mode 100644 ImageMagick-6.9.12-44/wand/wand.h create mode 100644 ImageMagick-6.9.12-44/winpath.sh create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Blob.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/COPYING create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Cache.fig create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Cache.png create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Cache.svg create mode 100644 ImageMagick-6.9.12-44/www/Magick++/ChangeLog.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/CoderInfo.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Color.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Documentation.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Drawable.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Drawable_example_1.png create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Enumerations.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Exception.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/FormatCharacters.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Future.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Geometry.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Image++.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Image.fig create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Image.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Image.png create mode 100644 ImageMagick-6.9.12-44/www/Magick++/ImageDesign.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/ImageMagick.png create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Install.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Magick++.png create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Montage.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/NEWS.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/PixelPacket.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/Pixels.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/README.txt create mode 100644 ImageMagick-6.9.12-44/www/Magick++/STL.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/TypeMetric.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/index.html create mode 100644 ImageMagick-6.9.12-44/www/Magick++/magick.css create mode 100644 ImageMagick-6.9.12-44/www/Magick++/montage-sample-framed.jpg create mode 100644 ImageMagick-6.9.12-44/www/Magick++/right_triangle.png create mode 100644 ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-framed.fig create mode 100644 ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-framed.jpg create mode 100644 ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-plain.fig create mode 100644 ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-plain.jpg create mode 100644 ImageMagick-6.9.12-44/www/Magick++/thumbnail-sample-framed.jpg create mode 100644 ImageMagick-6.9.12-44/www/Magick++/thumbnail-sample-plain.jpg create mode 100644 ImageMagick-6.9.12-44/www/advanced-linux-installation.html create mode 100644 ImageMagick-6.9.12-44/www/advanced-unix-installation.html create mode 100644 ImageMagick-6.9.12-44/www/advanced-windows-installation.html create mode 100644 ImageMagick-6.9.12-44/www/animate.html create mode 100644 ImageMagick-6.9.12-44/www/api/Image++.html create mode 100644 ImageMagick-6.9.12-44/www/api/animate.html create mode 100644 ImageMagick-6.9.12-44/www/api/annotate.html create mode 100644 ImageMagick-6.9.12-44/www/api/attribute.html create mode 100644 ImageMagick-6.9.12-44/www/api/blob.html create mode 100644 ImageMagick-6.9.12-44/www/api/cache-view.html create mode 100644 ImageMagick-6.9.12-44/www/api/cache.html create mode 100644 ImageMagick-6.9.12-44/www/api/channel.html create mode 100644 ImageMagick-6.9.12-44/www/api/cipher.html create mode 100644 ImageMagick-6.9.12-44/www/api/color.html create mode 100644 ImageMagick-6.9.12-44/www/api/colormap.html create mode 100644 ImageMagick-6.9.12-44/www/api/colorspace.html create mode 100644 ImageMagick-6.9.12-44/www/api/compare.html create mode 100644 ImageMagick-6.9.12-44/www/api/composite.html create mode 100644 ImageMagick-6.9.12-44/www/api/constitute.html create mode 100644 ImageMagick-6.9.12-44/www/api/decorate.html create mode 100644 ImageMagick-6.9.12-44/www/api/deprecate.html create mode 100644 ImageMagick-6.9.12-44/www/api/display.html create mode 100644 ImageMagick-6.9.12-44/www/api/distort.html create mode 100644 ImageMagick-6.9.12-44/www/api/draw.html create mode 100644 ImageMagick-6.9.12-44/www/api/drawing-wand.html create mode 100644 ImageMagick-6.9.12-44/www/api/effect.html create mode 100644 ImageMagick-6.9.12-44/www/api/enhance.html create mode 100644 ImageMagick-6.9.12-44/www/api/exception.html create mode 100644 ImageMagick-6.9.12-44/www/api/feature.html create mode 100644 ImageMagick-6.9.12-44/www/api/fourier.html create mode 100644 ImageMagick-6.9.12-44/www/api/fx.html create mode 100644 ImageMagick-6.9.12-44/www/api/histogram.html create mode 100644 ImageMagick-6.9.12-44/www/api/image-view.html create mode 100644 ImageMagick-6.9.12-44/www/api/image.html create mode 100644 ImageMagick-6.9.12-44/www/api/layer.html create mode 100644 ImageMagick-6.9.12-44/www/api/list.html create mode 100644 ImageMagick-6.9.12-44/www/api/magick++-classes.html create mode 100644 ImageMagick-6.9.12-44/www/api/magick-deprecate.html create mode 100644 ImageMagick-6.9.12-44/www/api/magick-image.html create mode 100644 ImageMagick-6.9.12-44/www/api/magick-property.html create mode 100644 ImageMagick-6.9.12-44/www/api/magick-wand.html create mode 100644 ImageMagick-6.9.12-44/www/api/magick.html create mode 100644 ImageMagick-6.9.12-44/www/api/memory.html create mode 100644 ImageMagick-6.9.12-44/www/api/mime.html create mode 100644 ImageMagick-6.9.12-44/www/api/module.html create mode 100644 ImageMagick-6.9.12-44/www/api/mogrify.html create mode 100644 ImageMagick-6.9.12-44/www/api/monitor.html create mode 100644 ImageMagick-6.9.12-44/www/api/montage.html create mode 100644 ImageMagick-6.9.12-44/www/api/morphology.html create mode 100644 ImageMagick-6.9.12-44/www/api/paint.html create mode 100644 ImageMagick-6.9.12-44/www/api/pixel-iterator.html create mode 100644 ImageMagick-6.9.12-44/www/api/pixel-wand.html create mode 100644 ImageMagick-6.9.12-44/www/api/profile.html create mode 100644 ImageMagick-6.9.12-44/www/api/property.html create mode 100644 ImageMagick-6.9.12-44/www/api/quantize.html create mode 100644 ImageMagick-6.9.12-44/www/api/registry.html create mode 100644 ImageMagick-6.9.12-44/www/api/resize.html create mode 100644 ImageMagick-6.9.12-44/www/api/resource.html create mode 100644 ImageMagick-6.9.12-44/www/api/segment.html create mode 100644 ImageMagick-6.9.12-44/www/api/shear.html create mode 100644 ImageMagick-6.9.12-44/www/api/signature.html create mode 100644 ImageMagick-6.9.12-44/www/api/statistic.html create mode 100644 ImageMagick-6.9.12-44/www/api/stream.html create mode 100644 ImageMagick-6.9.12-44/www/api/transform.html create mode 100644 ImageMagick-6.9.12-44/www/api/version.html create mode 100644 ImageMagick-6.9.12-44/www/api/wand-view.html create mode 100644 ImageMagick-6.9.12-44/www/architecture.html create mode 100644 ImageMagick-6.9.12-44/www/assets/magick.css create mode 100644 ImageMagick-6.9.12-44/www/assets/magick.js create mode 100644 ImageMagick-6.9.12-44/www/changelog.html create mode 100644 ImageMagick-6.9.12-44/www/cipher.html create mode 100644 ImageMagick-6.9.12-44/www/cite.html create mode 100644 ImageMagick-6.9.12-44/www/color-management.html create mode 100644 ImageMagick-6.9.12-44/www/color.html create mode 100644 ImageMagick-6.9.12-44/www/command-line-options.html create mode 100644 ImageMagick-6.9.12-44/www/command-line-processing.html create mode 100644 ImageMagick-6.9.12-44/www/command-line-tools.html create mode 100644 ImageMagick-6.9.12-44/www/compare.html create mode 100644 ImageMagick-6.9.12-44/www/compose.html create mode 100644 ImageMagick-6.9.12-44/www/composite.html create mode 100644 ImageMagick-6.9.12-44/www/conjure.html create mode 100644 ImageMagick-6.9.12-44/www/connected-components.html create mode 100644 ImageMagick-6.9.12-44/www/contact.html create mode 100644 ImageMagick-6.9.12-44/www/contrib/color-converter.html create mode 100644 ImageMagick-6.9.12-44/www/contrib/color-swatch.html create mode 100644 ImageMagick-6.9.12-44/www/convert.html create mode 100644 ImageMagick-6.9.12-44/www/defines.html create mode 100644 ImageMagick-6.9.12-44/www/develop.html create mode 100644 ImageMagick-6.9.12-44/www/display.html create mode 100644 ImageMagick-6.9.12-44/www/distribute-pixel-cache.html create mode 100644 ImageMagick-6.9.12-44/www/download.html create mode 100644 ImageMagick-6.9.12-44/www/escape.html create mode 100644 ImageMagick-6.9.12-44/www/examples.html create mode 100644 ImageMagick-6.9.12-44/www/exception.html create mode 100644 ImageMagick-6.9.12-44/www/export.html create mode 100644 ImageMagick-6.9.12-44/www/favicon.ico create mode 100644 ImageMagick-6.9.12-44/www/formats.html create mode 100644 ImageMagick-6.9.12-44/www/fx.html create mode 100644 ImageMagick-6.9.12-44/www/gradient.html create mode 100644 ImageMagick-6.9.12-44/www/high-dynamic-range.html create mode 100644 ImageMagick-6.9.12-44/www/history.html create mode 100644 ImageMagick-6.9.12-44/www/identify.html create mode 100644 ImageMagick-6.9.12-44/www/import.html create mode 100644 ImageMagick-6.9.12-44/www/index.html create mode 100644 ImageMagick-6.9.12-44/www/install-source.html create mode 100644 ImageMagick-6.9.12-44/www/jp2.html create mode 100644 ImageMagick-6.9.12-44/www/license.html create mode 100644 ImageMagick-6.9.12-44/www/links.html create mode 100644 ImageMagick-6.9.12-44/www/magick++.html create mode 100644 ImageMagick-6.9.12-44/www/magick-core.html create mode 100644 ImageMagick-6.9.12-44/www/magick-script.html create mode 100644 ImageMagick-6.9.12-44/www/magick-vector-graphics.html create mode 100644 ImageMagick-6.9.12-44/www/magick-wand.html create mode 100644 ImageMagick-6.9.12-44/www/magick.html create mode 100644 ImageMagick-6.9.12-44/www/miff.html create mode 100644 ImageMagick-6.9.12-44/www/mirror.html create mode 100644 ImageMagick-6.9.12-44/www/mogrify.html create mode 100644 ImageMagick-6.9.12-44/www/montage.html create mode 100644 ImageMagick-6.9.12-44/www/motion-picture.html create mode 100644 ImageMagick-6.9.12-44/www/news.html create mode 100644 ImageMagick-6.9.12-44/www/opencl.html create mode 100644 ImageMagick-6.9.12-44/www/openmp.html create mode 100644 ImageMagick-6.9.12-44/www/perl-magick.html create mode 100644 ImageMagick-6.9.12-44/www/porting.html create mode 100644 ImageMagick-6.9.12-44/www/quantize.html create mode 100644 ImageMagick-6.9.12-44/www/resources.html create mode 100644 ImageMagick-6.9.12-44/www/search.html create mode 100644 ImageMagick-6.9.12-44/www/security-policy.html create mode 100644 ImageMagick-6.9.12-44/www/sitemap.html create mode 100644 ImageMagick-6.9.12-44/www/source/analyze.c create mode 100644 ImageMagick-6.9.12-44/www/source/coder.xml create mode 100644 ImageMagick-6.9.12-44/www/source/colors.xml create mode 100644 ImageMagick-6.9.12-44/www/source/configure.xml create mode 100644 ImageMagick-6.9.12-44/www/source/contrast.c create mode 100644 ImageMagick-6.9.12-44/www/source/core.c create mode 100644 ImageMagick-6.9.12-44/www/source/core/sigmoidal-contrast.c create mode 100644 ImageMagick-6.9.12-44/www/source/delegates.xml create mode 100644 ImageMagick-6.9.12-44/www/source/english.xml create mode 100644 ImageMagick-6.9.12-44/www/source/examples.pl create mode 100644 ImageMagick-6.9.12-44/www/source/francais.xml create mode 100644 ImageMagick-6.9.12-44/www/source/incantation.msl create mode 100644 ImageMagick-6.9.12-44/www/source/locale.xml create mode 100644 ImageMagick-6.9.12-44/www/source/log.xml create mode 100644 ImageMagick-6.9.12-44/www/source/magic.xml create mode 100644 ImageMagick-6.9.12-44/www/source/mgk.c create mode 100644 ImageMagick-6.9.12-44/www/source/mime.xml create mode 100644 ImageMagick-6.9.12-44/www/source/piechart.mvg create mode 100644 ImageMagick-6.9.12-44/www/source/piechart.svg create mode 100644 ImageMagick-6.9.12-44/www/source/policy.xml create mode 100644 ImageMagick-6.9.12-44/www/source/quantization-table.xml create mode 100644 ImageMagick-6.9.12-44/www/source/thresholds.xml create mode 100644 ImageMagick-6.9.12-44/www/source/type-apple.xml create mode 100644 ImageMagick-6.9.12-44/www/source/type-dejavu.xml create mode 100644 ImageMagick-6.9.12-44/www/source/type-ghostscript.xml create mode 100644 ImageMagick-6.9.12-44/www/source/type-urw-base35.xml create mode 100644 ImageMagick-6.9.12-44/www/source/type-windows.xml create mode 100644 ImageMagick-6.9.12-44/www/source/type.xml create mode 100644 ImageMagick-6.9.12-44/www/source/wand.c create mode 100644 ImageMagick-6.9.12-44/www/source/wand/sigmoidal-contrast.c create mode 100644 ImageMagick-6.9.12-44/www/stream.html create mode 100644 ImageMagick-6.9.12-44/www/support.html create mode 100644 ImageMagick-6.9.12-44/www/wand.png create mode 100644 ImageMagick-6.9.12-44/www/webp.html diff --git a/.gitignore b/.gitignore index cac28cd..467c992 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,14 @@ /ImageMagick-6.9.10-86.tar.xz +/ImageMagick-6.9.11-27.tar.xz +/ImageMagick-7.1.0-10.tar.xz +/ImageMagick-6.9.12-25.tar.xz +/ImageMagick-6.9.12-27.tar.xz +/ImageMagick-6.9.12-28.tar.xz +/ImageMagick-6.9.12-30.tar.xz +/ImageMagick-6.9.12-31.tar.xz +/ImageMagick-6.9.12-32.tar.xz +/ImageMagick-6.9.12-37.tar.xz +/ImageMagick-6.9.12-40.tar.xz +/ImageMagick-6.9.12-42.tar.xz +/ImageMagick-6.9.12-43.tar.xz +/ImageMagick-6.9.12-44.tar.xz diff --git a/ImageMagick-6.9.12-44/AUTHORS.txt b/ImageMagick-6.9.12-44/AUTHORS.txt new file mode 100644 index 0000000..7cba059 --- /dev/null +++ b/ImageMagick-6.9.12-44/AUTHORS.txt @@ -0,0 +1,157 @@ +These active developers and have made source code contributions to the +ImageMagick project in the last few years: + +Cristy + Principal architect of ImageMagick and still maintains the ImageMagick + distribution. + +Dirk Lemstra + Contributor to and maintainer of Magick++, OpenCL acceleration, and + the Windows build (configure, ImageMagickObject, etc.). + +Bastien ROUCARIÈS + Various patches from Debian downstream. + +Fred Weinhaus + Contributed support and documentation for the discrete Fourier transform, + connected component labeling, perceptual hash, kuwahara filter and others. + Also provides scripts that perform some out-of-the ordinary image + processing operations @ http://www.fmwconcepts.com/imagemagick/. He + utilized his scripts as unit tests for ImageMagick version 7 to ensure + version 6 compatibility before its release. + + +These individuals have made source code contributions to the ImageMagick +project in the past but are no longer active developers: + +Glenn Randers-Pehrson + Contributed significantly to the utilities. Authored support for JNG, + MNG, and PNG formats. Provided significant support for the BMP format. + Made significant improvements to the documentation. + +Kelly Bergougnoux + Authored the Cineon image coder (based on the existing DPX source). + +Nathan Brown + Original author of the JP2 coder. + +Siu Chi Chan + Accelerate numerous image filters with OpenCL under AMD, Intel, + and NVidia. Adapted from MulticoreWare OpenCL contribution. + +Mike Chiarappa + Created a Borland C++ Builder 6.0 build environment for ImageMagick. + +Troy Edwards + Authored the source RPM spec file for ImageMagick. + +Jaroslav Fojtik + Authored the CUT, ART, and MATLAB coder modules. + +Francis J. Franklin + Ported the WMF coder to the libwmf 0.2 API. + +Markus Friedl + Original author of Base64 encode/decode sources. + +Bob Friesenhahn + Author of Magick++ (C++ API to ImageMagick). Author of module loader + facility, automatic file identification (magic) support, Unix/Cygwin/MinGW + configure/make facility, Windows setup.exe style installer, WMF renderer, + C API documentation formatter, and the C, C++, and Perl test suites + used by ImageMagick. + +David Harr + Contributed (with Leonard Rosenthol) dash pattern, linecap stroking + algorithm, and minor rendering improvements. + +Christopher R. Hawks + Authored the PALM coder. + +Rick Mabry + Contributed code to support filling drawn objects using a pattern image + and major improvements to the web page (both content and appearance). + +Catalin Mihaila + Contributed a ZX-Spectrum SCREEN$ reader. + +Chantal Racette, Laurentian University + Sped up Sinc and Blackman filter kernels. EWA resampling code + verification. + +William Radcliffe + Author of the VisualMagick project configure facility for Visual C++. + Author of FlashPix module. Author of the EMF, and META coders. + Significant contributions to the MSL, JPEG, TIFF, SVG, and URL coders. + Authored "process" module support. Wrote the micro-timer facility used + by 'identify'. Ported module loader support to Windows. Significantly + improved polygon rendering performance. + +Nicolas Robidoux, Laurentian University + New ellipse clamping method and vertical/horizontal line preserving + filters for EWA resampling. Sped up resampling filter kernels. + +Leonard Rosenthol + Authored the 'conjure' utility and associated MSL execution environment. + Provided MacOS support. Authored the CLIPBOARD, XCF, and PSD coders. + Postscript and PDF expertise. Significant drawing enhancements including + support for dash patterns, linecap stroking, clipping masks and a + mask image. + +Kyle Shorter + Original author of PerlMagick. Author of the LOCALE coder. + +Lars Ruben Skyum + Contributed the -clippath functionality, improved color profile support, + and re-wrote the PS3 coder. + +Anthony Thyssen + Designed the ImageMagick 6.0 command line processing with parenthesis, + image sequence operators, and GIF animation processing. Wrote the + image perspective distortions (-distort) and resampling methods. + Maintains a comprehensive set of examples of using ImageMagick at + https://legacy.imagemagick.org/Usage/. + +Milan Votava + Contributed support for Wireless BitMap, used in WAP - Wireless Access + Protocol. + + +We acknowledge these non-developer contributors to the ImageMagick project: + +Rod Bogart and John W. Peterson, University of Utah + Image compositing is loosely based on rlecomp of the Utah Raster Toolkit. + +Hanno Böck + Contributed numerous fuzzed-images that revealed program flaws in + ImageMagick. Additional checks were added to guard against nefarious + image files. + +Thomas R Crimmins + Inventor of the eight hull algorithm used for speckle reduction. + +Michael Halle, Spatial Imaging Group at MIT + Contributed the initial implementation of Alan Paeth's image rotation + algorithm. + +Paul Heckbert, Carnegie Mellon University + Image resizing is loosely based on Paul Heckbert's Zoom program. + +Peder Langlo, Hewlett Packard + Made hundreds of suggestions and bug reports. Without Peder, this + software would not be nearly as useful as it is today. + +David Pensak, E. I. du Pont de Nemours and Company + For providing the computing environment that made developing ImageMagick + possible. + +Paul Raveling, USC Information Sciences Institute + The spatial subdivision color reduction algorithm is based on his + Img software. + +Alvy Ray Smith and Eric Ray Lyons + HWB color transform and algorithm. + +Alexander Zimmermann + Responsible for the ImageMagick Linux binary distributions for many years. + His efforts are very much appreciated. diff --git a/ImageMagick-6.9.12-44/ChangeLog.md b/ImageMagick-6.9.12-44/ChangeLog.md new file mode 100644 index 0000000..937dba8 --- /dev/null +++ b/ImageMagick-6.9.12-44/ChangeLog.md @@ -0,0 +1,904 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [6.9.12-43](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-42...6.9.12-43) - 2022-03-20 + +### Commits + +- magick: support getentropy() [`d29a057`](https://github.com/ImageMagick/ImageMagick6/commit/d29a057a3689f7b944b879dee92e7d39a33bf3cc) +- ... [`96d197f`](https://github.com/ImageMagick/ImageMagick6/commit/96d197f14932d4ba8a116e06fe306403ea1e32f1) +- Coders: eliminate compiler warnings [`ee332c5`](https://github.com/ImageMagick/ImageMagick6/commit/ee332c511445a1fb2934f40246c3c958aefd73e9) +- Pull request: https://github.com/ImageMagick/ImageMagick/pull/4963 [`450949e`](https://github.com/ImageMagick/ImageMagick6/commit/450949ed017f009b399c937cf362f0058eacc5fa) +- Coders: https://github.com/ImageMagick/ImageMagick/issues/4947 [`78f03b6`](https://github.com/ImageMagick/ImageMagick6/commit/78f03b619d08d7c2e0fcaccab407e3ac93c2ee8f) +- Coders: PS and EPS %%BoundingBox not being parsed #4961 [`2a67214`](https://github.com/ImageMagick/ImageMagick6/commit/2a67214abc2410931064b1f4e2c01f177d768edf) +- Changed the format of MAGICK_GIT_REVISION and use this in -version. [`bd49573`](https://github.com/ImageMagick/ImageMagick6/commit/bd495730646575af3c867ed09adc8588061079ab) +- https://github.com/ImageMagick/ImageMagick/issues/4927 [`932cf02`](https://github.com/ImageMagick/ImageMagick6/commit/932cf023db383394c4ec304c95730aed631c57d2) +- Coders: proper check for out of bounds per https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=45640 [`5468786`](https://github.com/ImageMagick/ImageMagick6/commit/5468786406b323fef6a5fe50bc56dabde3da4130) +- https://github.com/ImageMagick/ImageMagick/issues/4927 [`594366f`](https://github.com/ImageMagick/ImageMagick6/commit/594366fd3a5268d0456c4f60c5746a9f586ab035) +- correct date format [`625ff11`](https://github.com/ImageMagick/ImageMagick6/commit/625ff113cc9acf864c56c266471829bb19439299) +- getentropy() requires sys/random.h include [`005bac2`](https://github.com/ImageMagick/ImageMagick6/commit/005bac2904c18bc6f03a2ac31bdda51005411355) +- no need to check for < 0 [`dead6a8`](https://github.com/ImageMagick/ImageMagick6/commit/dead6a806786eb2712dd76c38e3ff75c2f94997b) +- Coders: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=42549 [`de6ada9`](https://github.com/ImageMagick/ImageMagick6/commit/de6ada9a068b01494bfb848024ed46942da9d238) +- build: release [`2d5e8e3`](https://github.com/ImageMagick/ImageMagick6/commit/2d5e8e387e1c6daaf45f8efd1c24ee6a53e70e01) +- build: pending release [`775c781`](https://github.com/ImageMagick/ImageMagick6/commit/775c7817f3700514173e0655776e0d9465e93d6c) + +## [6.9.12-42](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-41...6.9.12-42) - 2022-03-04 + +### Commits + +- auto-generate the change log from git commit [`553ca1b`](https://github.com/ImageMagick/ImageMagick6/commit/553ca1b6e5bcc7d89af226cecfa6b6197a90a98c) +- https://github.com/ImageMagick/ImageMagick/issues/4876 [`52e5cc1`](https://github.com/ImageMagick/ImageMagick6/commit/52e5cc1988b15b9a6f3d7e9e3b7b72e3a346cfc9) +- https://github.com/ImageMagick/ImageMagick/issues/966 [`d9544e7`](https://github.com/ImageMagick/ImageMagick6/commit/d9544e78bfe55361b7768ddb00eb24b7f33f2137) +- ... [`8f1f6c3`](https://github.com/ImageMagick/ImageMagick6/commit/8f1f6c32bfb13ac1e8b8a7ce2f59a28ef06cb18b) +- pending release [`4f420a4`](https://github.com/ImageMagick/ImageMagick6/commit/4f420a43ce112948baa8de9a1ba56ee7b17afb0f) +- https://github.com/ImageMagick/ImageMagick/issues/4870 [`8b7b17c`](https://github.com/ImageMagick/ImageMagick6/commit/8b7b17c8fef72dab479e6ca676676d8c5e395dd6) +- https://github.com/ImageMagick/ImageMagick/issues/966 [`2db42a9`](https://github.com/ImageMagick/ImageMagick6/commit/2db42a9e1dde7e88dc370deb04a3be48c01dedf5) +- escape \n character [`32a4bf3`](https://github.com/ImageMagick/ImageMagick6/commit/32a4bf395e8201896c0a21f95661766bed41e470) +- throw exception on reserved filename character (\xff) [`8215fc2`](https://github.com/ImageMagick/ImageMagick6/commit/8215fc2e71513877d3040fbddfd1f16ca54499a7) +- https://github.com/ImageMagick/ImageMagick/issues/4888 [`2eb8b86`](https://github.com/ImageMagick/ImageMagick6/commit/2eb8b8660dac0d647a7045a6af7f3e8fcca1d8f8) +- ... [`4c2da37`](https://github.com/ImageMagick/ImageMagick6/commit/4c2da37f2bcc98059f44cecf304e8b3c53664bfd) +- https://github.com/ImageMagick/ImageMagick/issues/4888 [`ba2242d`](https://github.com/ImageMagick/ImageMagick6/commit/ba2242da46bfbd2cc4890486ff147a0113e08735) +- https://github.com/ImageMagick/ImageMagick/issues/966 [`bb79523`](https://github.com/ImageMagick/ImageMagick6/commit/bb795235696e2ace0f3d0b5703065a4b9a882f04) +- canonical copyright notice [`1e5a283`](https://github.com/ImageMagick/ImageMagick6/commit/1e5a28310d73e9c8c29fad113c872351340595a3) +- Changed trigger for release. [`552bddd`](https://github.com/ImageMagick/ImageMagick6/commit/552bddd79749d8195cf5a1871929076adf9a479e) +- ChangeLog => ChangeLog.md [`8a6726a`](https://github.com/ImageMagick/ImageMagick6/commit/8a6726af81ac40b41e962cafa8fd014d2659d432) +- pending release [`dad876f`](https://github.com/ImageMagick/ImageMagick6/commit/dad876ff6b5e873bc59e0661d40e157eb599fcc1) +- Fixed memory leak in ThumbnailImage. [`161f49b`](https://github.com/ImageMagick/ImageMagick6/commit/161f49b3b6a7d3121a566654f12916700d7f2d07) + +## [6.9.12-41](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-40...6.9.12-41) - 2022-02-21 + +### Commits + +- ... [`757c88c`](https://github.com/ImageMagick/ImageMagick6/commit/757c88cfe941df0cff8f2fef4681bd2b665c091c) +- Removed the xtrn coder. [`768f648`](https://github.com/ImageMagick/ImageMagick6/commit/768f648cce36a641b54092d78117435996c74a9a) +- rename method to TLS-moniker, thread local storage [`8860c28`](https://github.com/ImageMagick/ImageMagick6/commit/8860c28c64ae2cf5717e309325592c1ccb7cb969) +- Removed NTGhostscriptDLL and NTGhostscriptLoadDLL from the private header. [`70b7dfa`](https://github.com/ImageMagick/ImageMagick6/commit/70b7dfaf4d2f75af8b649d542d49374d6f447c11) +- remove reference to ImageMagickObject [`d64a152`](https://github.com/ImageMagick/ImageMagick6/commit/d64a15289a17a9d1d9856758f2ba82b75325f370) +- Fixes for installation in a folder that contains non ASCII characters. [`e3d32a2`](https://github.com/ImageMagick/ImageMagick6/commit/e3d32a2bdb9e50ddb2fd5966c847f0726e128815) +- ... [`695af8d`](https://github.com/ImageMagick/ImageMagick6/commit/695af8d4be0d25b36129d7b3fdf5a1b991216784) +- https://github.com/ImageMagick/ImageMagick/issues/4843 [`b24793c`](https://github.com/ImageMagick/ImageMagick6/commit/b24793c396083176cbf019a09847ad3ab427e240) +- https://github.com/ImageMagick/ImageMagick/issues/4761 [`77d68d3`](https://github.com/ImageMagick/ImageMagick6/commit/77d68d3e554ecd0e38ceb6a3f1decf65a69362c5) +- don't over-allocate thread-specific data [`b61069a`](https://github.com/ImageMagick/ImageMagick6/commit/b61069a33bab43a022992b3f7c81a50e06a7b45a) +- ... [`45d3733`](https://github.com/ImageMagick/ImageMagick6/commit/45d37331ef1a38712740e9bd7090fb855557b7cb) +- Removed the xtrn coder. [`854e7be`](https://github.com/ImageMagick/ImageMagick6/commit/854e7be5f0ce94c0a431d49a1c82a9eb50916be4) +- cosmetic [`6831beb`](https://github.com/ImageMagick/ImageMagick6/commit/6831bebd3067bddc10e954fe09bc98a3e6947be7) +- fix compiler exception under Cygwin [`32315c9`](https://github.com/ImageMagick/ImageMagick6/commit/32315c92a4e31c0b75fb88548c0bf40242f0e5f1) +- https://github.com/ImageMagick/ImageMagick/issues/4867 [`8c1bf89`](https://github.com/ImageMagick/ImageMagick6/commit/8c1bf8917a7a23daa6aaa03bb4293fd9ff7859a2) +- remove references to ImageMagickObject [`1e63c5c`](https://github.com/ImageMagick/ImageMagick6/commit/1e63c5c2d7f2c1d5c6aba0e8935ee855656cbb46) +- ... [`ba6e51f`](https://github.com/ImageMagick/ImageMagick6/commit/ba6e51f8e3b49c3d5015df5c4d152e07a37007aa) +- cosmetic [`c02d827`](https://github.com/ImageMagick/ImageMagick6/commit/c02d827078d59950e19e169ffeb3d988d0e1185c) +- pending release [`8a8673a`](https://github.com/ImageMagick/ImageMagick6/commit/8a8673a9bc1a7b915252645f305a65f0c990b491) +- pending release [`9b99699`](https://github.com/ImageMagick/ImageMagick6/commit/9b9969944c92ccaf4fa7d34c1c258a794a1e23b9) +- pending release [`9ce4eba`](https://github.com/ImageMagick/ImageMagick6/commit/9ce4ebad1337a10bc9d6b74bddd57ad7dc3cde70) +- https://github.com/ImageMagick/ImageMagick/issues/4865 [`e6d7f78`](https://github.com/ImageMagick/ImageMagick6/commit/e6d7f782fc1b6484c52fe7fb987c06559b489726) +- pending release [`fd143dc`](https://github.com/ImageMagick/ImageMagick6/commit/fd143dc849b6c191464f40e581b0abe344b6e41e) +- Raise exception when image could not be read but no exception was raised. [`3e15c68`](https://github.com/ImageMagick/ImageMagick6/commit/3e15c68efcb1e6383c93e7dfe38ba6c37e614d1b) +- off-by-one fix [`d0a2bc4`](https://github.com/ImageMagick/ImageMagick6/commit/d0a2bc44117217a7619d6ade90af0f40d9321c6e) +- no need for conditional compile [`d5fe059`](https://github.com/ImageMagick/ImageMagick6/commit/d5fe0590573b15208f302d57e0b1c97a60e3d16d) +- pending release [`b855d8e`](https://github.com/ImageMagick/ImageMagick6/commit/b855d8ec0bb360deb7d80a14b5c1a5a1ffc47ee1) +- ... [`cecdf6f`](https://github.com/ImageMagick/ImageMagick6/commit/cecdf6f89642589221edc543144d45c5bde71b77) +- https://github.com/ImageMagick/ImageMagick/discussions/4755 [`1e86532`](https://github.com/ImageMagick/ImageMagick6/commit/1e8653229aeea1a6731ca3632bf5963b417312ed) +- pending release [`e7418d5`](https://github.com/ImageMagick/ImageMagick6/commit/e7418d54c54b4646505ba95ce6458f352a94debf) +- Whitespace. [`b36de79`](https://github.com/ImageMagick/ImageMagick6/commit/b36de79c6cb913f4423f7eb71901d9f07946f573) + +## [6.9.12-40](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-39...6.9.12-40) - 2022-02-15 + +### Commits + +- cosmetic [`1da04da`](https://github.com/ImageMagick/ImageMagick6/commit/1da04dabe110e22954b33927567544b33e97b7a7) +- https://github.com/ImageMagick/ImageMagick/issues/4841 [`f5aeb09`](https://github.com/ImageMagick/ImageMagick6/commit/f5aeb0989d9889d85b2d66a106a670386872a8c6) +- ... [`4fd78b8`](https://github.com/ImageMagick/ImageMagick6/commit/4fd78b838c09c88ff3acf43a0799a002d2f873cf) +- fix unitialized value [`ce4d5cb`](https://github.com/ImageMagick/ImageMagick6/commit/ce4d5cb663cb3d701d63515edbeee561b71eae39) +- off-by-one fix [`409d6db`](https://github.com/ImageMagick/ImageMagick6/commit/409d6db86bae76c8f7401dc1c09c4349b8ca8352) +- display last debugging character [`e6a76f8`](https://github.com/ImageMagick/ImageMagick6/commit/e6a76f8bfb9a8edfbd4cdc44e79eb080f164cf71) +- https://github.com/ImageMagick/ImageMagick/issues/4837 [`a339e1f`](https://github.com/ImageMagick/ImageMagick6/commit/a339e1f47dd09d1765e971f7e104d34a2e50785c) +- https://github.com/ImageMagick/ImageMagick/issues/4837 [`00e5d3a`](https://github.com/ImageMagick/ImageMagick6/commit/00e5d3a9a033182fcf704e4b1eae9e569fb85244) +- off-by-one fix [`e41e298`](https://github.com/ImageMagick/ImageMagick6/commit/e41e29898936ca76b0def5126771733e0954191e) +- https://github.com/ImageMagick/ImageMagick/issues/4822 [`5a76293`](https://github.com/ImageMagick/ImageMagick6/commit/5a7629343bb280a1a177818e6e40776c7484d649) +- pending release [`3264d72`](https://github.com/ImageMagick/ImageMagick6/commit/3264d72944d6f2df8f80ecb3d837da1431db37a6) +- one off when debugging [`cb6374d`](https://github.com/ImageMagick/ImageMagick6/commit/cb6374d6fe7fec6651b1d1dd4ee7ec97c662c610) +- revert [`dc25885`](https://github.com/ImageMagick/ImageMagick6/commit/dc25885dfb4d516d6ef58ba77bfc47e8799acfed) +- alpha is never zero [`ff04a51`](https://github.com/ImageMagick/ImageMagick6/commit/ff04a51f4f89813c319f157c0aa993f36b944815) + +## [6.9.12-39](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-38...6.9.12-39) - 2022-02-12 + +### Commits + +- possible performance optimization [`1e04814`](https://github.com/ImageMagick/ImageMagick6/commit/1e04814e2e28c9a22f082b5c87cc5cf20642ad0d) +- https://github.com/ImageMagick/ImageMagick/discussions/4813 [`666ab9a`](https://github.com/ImageMagick/ImageMagick6/commit/666ab9ad9552fac12f92d2cf53173bea3d848255) +- ... [`e5ab86b`](https://github.com/ImageMagick/ImageMagick6/commit/e5ab86b9f52a8452fb00099f29a51763a5b114ff) +- https://github.com/ImageMagick/ImageMagick/issues/4830 [`409d422`](https://github.com/ImageMagick/ImageMagick6/commit/409d42205927c98cbb852ca96e109716f38f04ab) +- optimize reading of XPM properties [`cd103b8`](https://github.com/ImageMagick/ImageMagick6/commit/cd103b81ca7814533192f340053b388c6825ec83) +- correct copyright year [`99ef124`](https://github.com/ImageMagick/ImageMagick6/commit/99ef124d080560a9df5a0c177a82c3ccc2ca6ca9) +- ... [`bcf9658`](https://github.com/ImageMagick/ImageMagick6/commit/bcf9658a637a7c6993c7203382235fd3fabb7015) +- cosmetic [`5683607`](https://github.com/ImageMagick/ImageMagick6/commit/56836073a8cc42127b265280dfb0d5dcb4bc915b) +- Removed IsAVI check. [`6eb9f96`](https://github.com/ImageMagick/ImageMagick6/commit/6eb9f96e781996b71ead9d25182be0e84bfdb89f) +- Corrected UTF-16 big endian encoding. [`71e590e`](https://github.com/ImageMagick/ImageMagick6/commit/71e590ed3885ef5e2d48918809d8a3a8cfefccba) +- prevent integer overflow [`a69648d`](https://github.com/ImageMagick/ImageMagick6/commit/a69648d9d3eb9855eeb6089a692c689581d85cff) +- https://github.com/ImageMagick/ImageMagick/issues/4822 [`0977428`](https://github.com/ImageMagick/ImageMagick6/commit/097742836e252be7aba65c00877722f5eae8e851) +- ... [`fb8b7d6`](https://github.com/ImageMagick/ImageMagick6/commit/fb8b7d60e6469c38b9c16436a7a472d57d9b8562) +- pending release [`002c3d7`](https://github.com/ImageMagick/ImageMagick6/commit/002c3d7c493de002eaa605ade574830e7e8d1693) +- ... [`e29fbed`](https://github.com/ImageMagick/ImageMagick6/commit/e29fbed480a847fd70671ffb445769cc07f87b40) +- Removed methods that have been renamed. [`88f63de`](https://github.com/ImageMagick/ImageMagick6/commit/88f63de88c6242bfdbb669b90f44c1827f71aebf) +- update copyright year [`f5cb4ce`](https://github.com/ImageMagick/ImageMagick6/commit/f5cb4ce9319066b5b4740f725d9f0f8a52368be8) +- Fixed build error. [`8cb3ec3`](https://github.com/ImageMagick/ImageMagick6/commit/8cb3ec3f676b7b566f0590536894f11fac6cf8b4) +- https://github.com/ImageMagick/ImageMagick/issues/4828 [`37ac2f0`](https://github.com/ImageMagick/ImageMagick6/commit/37ac2f0185a2afc88de705937f1e1e57004aa6ba) + +## [6.9.12-38](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-37...6.9.12-38) - 2022-02-05 + +### Commits + +- ... [`0ec8137`](https://github.com/ImageMagick/ImageMagick6/commit/0ec813759359a1a9f4e37a1696bb2f967c917776) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=44424 [`bbf05a3`](https://github.com/ImageMagick/ImageMagick6/commit/bbf05a3449db3555cc05f4f3cacf172d6a0d35cc) +- https://github.com/ImageMagick/ImageMagick/issues/4793 [`dd65574`](https://github.com/ImageMagick/ImageMagick6/commit/dd655741bb71f7a129757fc0676e8aa328b44dad) +- ... [`c726d86`](https://github.com/ImageMagick/ImageMagick6/commit/c726d861a67aadf697eb35b8847f6431b47dec1e) +- release [`b5bb28a`](https://github.com/ImageMagick/ImageMagick6/commit/b5bb28a0ca2e53b668e4057a0cb04166ef781793) +- pending release [`fa0b758`](https://github.com/ImageMagick/ImageMagick6/commit/fa0b758566ef994436fc9d9c14b68b433e2dd513) +- avoid deep recursion [`513854d`](https://github.com/ImageMagick/ImageMagick6/commit/513854d34c8e505207c4c4a4cb0932ef7770fa05) +- Corrected setting delay. [`bd7f6d7`](https://github.com/ImageMagick/ImageMagick6/commit/bd7f6d781953b415e7d5f4830feebbe87a54e62f) +- VID images not permitted when compositing [`f4529c0`](https://github.com/ImageMagick/ImageMagick6/commit/f4529c0dcf3a8f96c438086b28fbef8338cda0b1) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=44401 [`e94e616`](https://github.com/ImageMagick/ImageMagick6/commit/e94e616aff39358e09d6ae3180baf3cb59923690) +- https://github.com/ImageMagick/ImageMagick/issues/4807 [`bcbcfeb`](https://github.com/ImageMagick/ImageMagick6/commit/bcbcfeb3b697e8ec1a105dc7c7099f5f9191f172) +- reference https://github.com/ImageMagick/ImageMagick/issues/4807 [`f2ee9a7`](https://github.com/ImageMagick/ImageMagick6/commit/f2ee9a74d52794b4ef9e62e71d4906d5cab9ef27) +- check if image extent is NaN [`0608714`](https://github.com/ImageMagick/ImageMagick6/commit/0608714e4b8df32180359ba502990693ccfe3115) + +## [6.9.12-37](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-36...6.9.12-37) - 2022-01-29 + +### Commits + +- permit compositing MPRI images [`4dd4d0d`](https://github.com/ImageMagick/ImageMagick6/commit/4dd4d0df449acb13fb859041b4996af58243e352) +- bump patch level version [`e662b69`](https://github.com/ImageMagick/ImageMagick6/commit/e662b69dd2cb3209339aff3c277493ef18f72a92) +- pending release [`f0b31c1`](https://github.com/ImageMagick/ImageMagick6/commit/f0b31c169c00ad9e688b89e6a17e2678cc91c733) +- check for excessive color name length [`1025a9b`](https://github.com/ImageMagick/ImageMagick6/commit/1025a9b0373dd194fc4529424e80396f35b1bbf4) +- pending release [`f1e0995`](https://github.com/ImageMagick/ImageMagick6/commit/f1e09958774501f6e39e4b06deed0c351b8158ca) +- restore MPRI URI [`d624f7f`](https://github.com/ImageMagick/ImageMagick6/commit/d624f7f008450eded4f006517e3275647eb69864) + +## [6.9.12-36](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-35...6.9.12-36) - 2022-01-28 + +### Commits + +- check for excessive memory request when drawing [`50aeffe`](https://github.com/ImageMagick/ImageMagick6/commit/50aeffee5b880716bc3fbca6edf990a853b04a4d) +- https://github.com/ImageMagick/ImageMagick/issues/4766 [`77fc0b9`](https://github.com/ImageMagick/ImageMagick6/commit/77fc0b952bf505ff10b5abb94b33206f31056e06) +- It's a new dawn; It's a new day; It's a new life; For ImageMagick [`49ea804`](https://github.com/ImageMagick/ImageMagick6/commit/49ea804be9295c12b457843271042e2e3521750e) +- promote blocksize from int to ssize_t [`ba2e0ef`](https://github.com/ImageMagick/ImageMagick6/commit/ba2e0efa42a0ac656fa4b01beb6500915ee11bcd) +- pending release [`fca98f0`](https://github.com/ImageMagick/ImageMagick6/commit/fca98f0ad524641afd5f0c4bf42852ebaf8c1c27) +- pending release [`fee44f7`](https://github.com/ImageMagick/ImageMagick6/commit/fee44f7b445cdca56a5ec19a2878608a511098c9) +- ... [`1ac7d3d`](https://github.com/ImageMagick/ImageMagick6/commit/1ac7d3da9c45ee15ef7421d3ae62943f72f3cdab) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=43967 [`f5f594a`](https://github.com/ImageMagick/ImageMagick6/commit/f5f594abe588bcc6ee870998bc801ede67e5b8b5) +- pending release [`44065d3`](https://github.com/ImageMagick/ImageMagick6/commit/44065d3e7ede7012ab32bb560d838eed9507720d) +- https://github.com/ImageMagick/ImageMagick/issues/4771 [`8e326c6`](https://github.com/ImageMagick/ImageMagick6/commit/8e326c63f27c544e1dbbb1a329256306e93f1a70) +- PDF unicode title [`bf36be4`](https://github.com/ImageMagick/ImageMagick6/commit/bf36be46887cdc65c8add8c6bfed20a0c4ae290d) +- Added missing version check. [`9cfea23`](https://github.com/ImageMagick/ImageMagick6/commit/9cfea235600550f02b2df61c276c438ab031441e) + +## [6.9.12-35](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-34...6.9.12-35) - 2022-01-22 + +### Commits + +- https://github.com/ImageMagick/ImageMagick/issues/4629 [`dea9fb3`](https://github.com/ImageMagick/ImageMagick6/commit/dea9fb319c9f4564662e0f1705856854aec01605) +- Build ImageMagick on Windows with VisualStudio 2022 instead. [`a9b405b`](https://github.com/ImageMagick/ImageMagick6/commit/a9b405b9e1bd219351d8961c9ccfddbc2a299d3a) +- Use same checks as in IM7. [`a93c000`](https://github.com/ImageMagick/ImageMagick6/commit/a93c000f4585e9ef3b0a8a8f55bdcc25575e21b7) +- permit 4GB blocks [`23b4299`](https://github.com/ImageMagick/ImageMagick6/commit/23b42998f5b3345d1915d4222cc2e858badca639) +- ... [`e8b78e7`](https://github.com/ImageMagick/ImageMagick6/commit/e8b78e7bae67150667f3037932d0b3f1bc00434d) +- improved fix for possible DoS for certain SVG constructs [`84ec305`](https://github.com/ImageMagick/ImageMagick6/commit/84ec30550c3146f525383f18a786a6bbd5028a93) +- https://github.com/ImageMagick/ImageMagick/issues/4704 [`25c9e4d`](https://github.com/ImageMagick/ImageMagick6/commit/25c9e4df716f34519d346369892b030ee5155312) +- https://github.com/ImageMagick/ImageMagick/issues/4704 [`9002280`](https://github.com/ImageMagick/ImageMagick6/commit/90022807243230deea06b9dcc874d2a41c611631) +- AVIF is supported by the HEIC coder [`2287dca`](https://github.com/ImageMagick/ImageMagick6/commit/2287dca493099e423ca751bf55a3f114fc848a96) +- https://github.com/ImageMagick/ImageMagick/issues/4639 [`2318bfb`](https://github.com/ImageMagick/ImageMagick6/commit/2318bfb4009f8742b4c09007f3c8ba72bac7bf89) +- Removed comment. [`f5bac9b`](https://github.com/ImageMagick/ImageMagick6/commit/f5bac9b20849fc7c540550e15f3ae839faf506fb) +- eliminate C++ compiler warnings [`08dd651`](https://github.com/ImageMagick/ImageMagick6/commit/08dd6515f47bf4276797b46b9c81e016c7c46993) +- https://github.com/ImageMagick/ImageMagick/issues/4681 [`21bddc2`](https://github.com/ImageMagick/ImageMagick6/commit/21bddc28dcc31dde7d23b25009e1efbedcbae174) +- Added checks for invalid PSD channel size. [`e26d718`](https://github.com/ImageMagick/ImageMagick6/commit/e26d718edaf73793c7a0f2f609ecf662fcccd562) +- eliminate rare memory leak [`cf21bd4`](https://github.com/ImageMagick/ImageMagick6/commit/cf21bd4a4dd173a156c529082b6eb074c6aced71) +- revert [`dada640`](https://github.com/ImageMagick/ImageMagick6/commit/dada640f2732a4ae8e524ac95c1b998cf0102a80) +- https://github.com/ImageMagick/ImageMagick/issues/4654 [`aee3f00`](https://github.com/ImageMagick/ImageMagick6/commit/aee3f004aa62bafb20dcb7c7c0675ee7d5bf9255) +- Changed the build of configure to 64-bit. [`f5cb4bb`](https://github.com/ImageMagick/ImageMagick6/commit/f5cb4bb894806c595b08591f7ff755caed117fe6) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=43390 [`2ff94fa`](https://github.com/ImageMagick/ImageMagick6/commit/2ff94fab76c89707ed241d3a85e3881d88d1b032) +- ... [`bbb86a2`](https://github.com/ImageMagick/ImageMagick6/commit/bbb86a2c59fabc73d0262c70ae71ce80a89b4c5e) +- zero papersize geometry [`4382359`](https://github.com/ImageMagick/ImageMagick6/commit/4382359ee5d87266c25646f68da20d4229d771bd) +- https://github.com/ImageMagick/ImageMagick/issues/4679 [`8854349`](https://github.com/ImageMagick/ImageMagick6/commit/88543494464bf94ef3430ba33bb34c62ba5050d6) +- pending release [`aff974e`](https://github.com/ImageMagick/ImageMagick6/commit/aff974eb0da8eaee7edf3acbe945a2d8bb4a4c8e) +- https://github.com/ImageMagick/ImageMagick/issues/4660 [`fd1df0b`](https://github.com/ImageMagick/ImageMagick6/commit/fd1df0b69806c4d820c277759b5171795502dd70) +- Fixed possible memory leak. [`e5bee23`](https://github.com/ImageMagick/ImageMagick6/commit/e5bee2335ec13cff0171e9517f862298bb7f0c0a) +- ... [`f7a43f3`](https://github.com/ImageMagick/ImageMagick6/commit/f7a43f3552a6f47a1258a524ec8ed33250601839) +- Fixed Windows build. [`e838900`](https://github.com/ImageMagick/ImageMagick6/commit/e838900d9380feba6900adc7537eea852cd478d5) +- cosmetic [`623e681`](https://github.com/ImageMagick/ImageMagick6/commit/623e6813fcfe68729d78cc27b4d9bc77a678c760) +- ... [`a4d1e39`](https://github.com/ImageMagick/ImageMagick6/commit/a4d1e399130e50698cb1210e95224f7cd301ba8d) +- revert [`46859fd`](https://github.com/ImageMagick/ImageMagick6/commit/46859fda719f814ec7e1fbbc37ed66b6706d4094) +- fuzzy equality check [`0256b55`](https://github.com/ImageMagick/ImageMagick6/commit/0256b550e7fd2bcec82802f4c349f6e64ad1d06a) +- pending release [`d02bc00`](https://github.com/ImageMagick/ImageMagick6/commit/d02bc0072070ef2f33ee6d8acca436a720b9861b) +- Added move to use the installed version of Strawberry Perl instead. [`d68e6fa`](https://github.com/ImageMagick/ImageMagick6/commit/d68e6faf1d817c9b4db97b1643226dfce2a90dfc) +- Allow workflow dispatch. [`809c4ce`](https://github.com/ImageMagick/ImageMagick6/commit/809c4cefefea926887e17f63093a98223c62d857) + +## [6.9.12-34](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-33...6.9.12-34) - 2021-12-22 + +### Commits + +- ... [`39b8934`](https://github.com/ImageMagick/ImageMagick6/commit/39b8934f42179a4a79b41d3fa141b8fac7064ea2) +- Set the colorspace after the width and height of the image have been checked. [`3fd8496`](https://github.com/ImageMagick/ImageMagick6/commit/3fd8496d027b4b03e622cbf093e0b28d1e30d4ac) +- https://github.com/ImageMagick/ImageMagick/issues/4626 [`c10351c`](https://github.com/ImageMagick/ImageMagick6/commit/c10351c16b8d2cabd11d2627a02de522570f6ceb) +- ... [`8093989`](https://github.com/ImageMagick/ImageMagick6/commit/8093989a6bf0ea36a2e81d61400e47c9cdba3032) +- check for unbalanced parenthesis [`6fdd03b`](https://github.com/ImageMagick/ImageMagick6/commit/6fdd03b7fef68cfdb1c0f87d5e0e72a29f2d0336) +- pending release [`0b0cbf7`](https://github.com/ImageMagick/ImageMagick6/commit/0b0cbf7b0f5c2ddcd41c85fc2da64d4771f80018) +- Corrected method call. [`05259b5`](https://github.com/ImageMagick/ImageMagick6/commit/05259b51165aa26f9ec265e201315391a5a958b4) + +## [6.9.12-33](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-32...6.9.12-33) - 2021-12-18 + +### Commits + +- Swapped the Sync8BimProfile and the SyncExifProfile methods. [`77b718c`](https://github.com/ImageMagick/ImageMagick6/commit/77b718c3f5d5e39710d227f2bb6a7fb65abd4c57) +- ... [`3deb899`](https://github.com/ImageMagick/ImageMagick6/commit/3deb89958f6787deca910570ff5fb8d27210b554) +- Improved adjustment of page offset when resizing an image. [`accf336`](https://github.com/ImageMagick/ImageMagick6/commit/accf33670091ef833b45ef5bb913812e16469333) +- https://github.com/ImageMagick/ImageMagick/issues/4558 [`fb428af`](https://github.com/ImageMagick/ImageMagick6/commit/fb428af466701e487cfd0f657c78e1f74da4c12b) +- Also sync the exif profile inside the 8bim profile. [`3be80bc`](https://github.com/ImageMagick/ImageMagick6/commit/3be80bc9c9b5e49a6266b680e38d39d5ecaeaadb) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=42504 [`9f7310b`](https://github.com/ImageMagick/ImageMagick6/commit/9f7310b7a3c80f132c548ffb8f29eea7dabae8c2) +- https://github.com/ImageMagick/ImageMagick/issues/4587 [`526a3d1`](https://github.com/ImageMagick/ImageMagick6/commit/526a3d19790b753e4d7f63515dc667a3472f9eda) +- https://github.com/ImageMagick/ImageMagick/security/code-scanning/31 [`094e143`](https://github.com/ImageMagick/ImageMagick6/commit/094e143714873a2903093ea6c128af267ef8c997) +- revert [`7cbce51`](https://github.com/ImageMagick/ImageMagick6/commit/7cbce514e6a0f530b5f50b960f6d95c62c9416f5) +- improved adjustment of page offset when resizing an image [`c8bb427`](https://github.com/ImageMagick/ImageMagick6/commit/c8bb4278eb7be195cc45ba08e617987cf34dad1e) +- pending release [`a518f31`](https://github.com/ImageMagick/ImageMagick6/commit/a518f310bc77991712a53f6984f9f0edce706174) +- Corrected the built-in video encoder and decoder. [`91320cc`](https://github.com/ImageMagick/ImageMagick6/commit/91320cc53f6c5e8b59b5e22e0042d62b230344ba) +- Corrected method name. [`15aadb7`](https://github.com/ImageMagick/ImageMagick6/commit/15aadb7691a3a8cd47cbbae9ca3ec58c01acc3c3) +- Restored debug message. [`2ab41fb`](https://github.com/ImageMagick/ImageMagick6/commit/2ab41fbf336faf0fbb9d3217b72c6f6336b7767b) +- ... [`add9cb1`](https://github.com/ImageMagick/ImageMagick6/commit/add9cb14e14eef02806715d97abcf5d04a3e55dd) +- Corrected typecast. [`87ce0d8`](https://github.com/ImageMagick/ImageMagick6/commit/87ce0d8fa8446b142938f1be63cf3e6b866697cf) + +## [6.9.12-32](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-31...6.9.12-32) - 2021-12-04 + +### Commits + +- ... [`60be1a6`](https://github.com/ImageMagick/ImageMagick6/commit/60be1a6c9698fc970c087b5384da19829b8fb386) +- https://github.com/ImageMagick/ImageMagick/issues/4501 [`936332e`](https://github.com/ImageMagick/ImageMagick6/commit/936332e6b6a5e6105f02b2d9232bcbeafa681eb3) +- revert memory leak patch [`e735d88`](https://github.com/ImageMagick/ImageMagick6/commit/e735d88c251a4c7ef60c39ae3322fc7b4cbb50f9) +- https://github.com/ImageMagick/ImageMagick/issues/4501 [`fa5c3aa`](https://github.com/ImageMagick/ImageMagick6/commit/fa5c3aa6c111b8c4c83d945e992da95200dbdba6) +- https://github.com/ImageMagick/ImageMagick/issues/4512 [`4c0fcf3`](https://github.com/ImageMagick/ImageMagick6/commit/4c0fcf39fd51f2c89832767e1befaeda7ff86097) +- Added missing checks for the return value of the exr methods. [`5beeab8`](https://github.com/ImageMagick/ImageMagick6/commit/5beeab8a1297dbae1f05f88aeffe26278b744a6f) +- ASAN returns false positives for OMP [`976dba6`](https://github.com/ImageMagick/ImageMagick6/commit/976dba67f1a4352d838a2a9f823812892f8230b5) +- ... [`c611e8f`](https://github.com/ImageMagick/ImageMagick6/commit/c611e8f5102bbcf20ac0a4fd3e7e719779c60fd9) +- Added check for invalid size. [`94f76dd`](https://github.com/ImageMagick/ImageMagick6/commit/94f76dd2f760241bec51e7d66873e77a58d812ba) +- https://github.com/ImageMagick/ImageMagick/issues/4501 [`2a29e35`](https://github.com/ImageMagick/ImageMagick6/commit/2a29e35480271e14a0961492867e9d246e64cc05) +- pending release [`be1bc1d`](https://github.com/ImageMagick/ImageMagick6/commit/be1bc1d9650b4530a037d7c2d58d1a5a4b73f04e) +- pending release [`b5525d6`](https://github.com/ImageMagick/ImageMagick6/commit/b5525d640ea48befa9cfb4e154672d4076f06aec) +- pending release [`3bf73bf`](https://github.com/ImageMagick/ImageMagick6/commit/3bf73bf7e3f846dd6d3e20b843e8a34e8f4f7589) +- https://github.com/ImageMagick/ImageMagick/issues/4535 [`9a7d07d`](https://github.com/ImageMagick/ImageMagick6/commit/9a7d07d8b22098210a47cabb99cb58de599bb5ba) +- eliminate compiler warning [`63f5b43`](https://github.com/ImageMagick/ImageMagick6/commit/63f5b4329181e70cff1a646229dc3b3ba5a40d69) +- pending release [`9e8e460`](https://github.com/ImageMagick/ImageMagick6/commit/9e8e460e7ef26ab6f5666c7292f7b82752a09b7d) +- pending release [`1832b1d`](https://github.com/ImageMagick/ImageMagick6/commit/1832b1d334ca00e66ad6ff5f115750692cb6b3b7) +- https://github.com/ImageMagick/ImageMagick/discussions/4529 [`e35c98c`](https://github.com/ImageMagick/ImageMagick6/commit/e35c98c5ab111284b198d0022ed479d0e6ecef3c) +- close input file if early exit on exception [`fd51385`](https://github.com/ImageMagick/ImageMagick6/commit/fd513853ac20e6ae784a795fff41cacfe8b54e73) + +## [6.9.12-31](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-30...6.9.12-31) - 2021-11-21 + +### Commits + +- ... [`9e6a637`](https://github.com/ImageMagick/ImageMagick6/commit/9e6a63782e4d22786b82b1db6575181724fdb4f1) +- Corrected OpenCL define checks. [`149fb8a`](https://github.com/ImageMagick/ImageMagick6/commit/149fb8a345ccb58cc70d3252be5d0f7cf6850d64) +- pending release [`4976493`](https://github.com/ImageMagick/ImageMagick6/commit/49764932cdb7e0ac966828ce15a819d85ccbeae3) +- Removed unnecessary define. [`6722a79`](https://github.com/ImageMagick/ImageMagick6/commit/6722a798f2b4385a293555675be8967890448b38) +- eliminate possible divide by zero [`8c80027`](https://github.com/ImageMagick/ImageMagick6/commit/8c80027ca8d6c84c3ed815059bbf353eb8dc2d58) + +## [6.9.12-30](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-29...6.9.12-30) - 2021-11-20 + +### Commits + +- https://github.com/ImageMagick/ImageMagick6/issues/168 [`9a70911`](https://github.com/ImageMagick/ImageMagick6/commit/9a70911bc8b3c6f3a49bb54766cfba0e69f2a2fe) +- ... [`3b2a005`](https://github.com/ImageMagick/ImageMagick6/commit/3b2a005a5a58698d9cb99e48d46ce19d19abfd39) +- mitigate UBSAN alerts [`1219eac`](https://github.com/ImageMagick/ImageMagick6/commit/1219eac5d3bfb796753597f37412df567f629c08) +- check for NULL index channel [`f63a211`](https://github.com/ImageMagick/ImageMagick6/commit/f63a2117ba05da426d996c0aee92e5b0c7b1f852) +- eliminate compiler warning [`7864d48`](https://github.com/ImageMagick/ImageMagick6/commit/7864d48ddb52c490484a890eea21717cab01c61c) +- check if indexes are null [`23bd057`](https://github.com/ImageMagick/ImageMagick6/commit/23bd0570ebb0b845aa62e0c66dd7d822594201ea) +- https://github.com/ImageMagick/ImageMagick6/issues/168 [`7599dd9`](https://github.com/ImageMagick/ImageMagick6/commit/7599dd92e8ad19993a2eb27a2b5103d853bce57f) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=41172 [`5f77de4`](https://github.com/ImageMagick/ImageMagick6/commit/5f77de42c37c184e6db6bbbad52a34070c5a7a2d) +- check for NULL indexes [`e008625`](https://github.com/ImageMagick/ImageMagick6/commit/e00862551327e0b2c4362d6d8f1b78bb4f3496af) +- check for NULL indexes [`3644f40`](https://github.com/ImageMagick/ImageMagick6/commit/3644f40f41d1bf1134e1d6fcd1f227436d045945) +- pending release [`1864067`](https://github.com/ImageMagick/ImageMagick6/commit/1864067f7083a965bc4c4f3ac36ab6976d80a831) +- mitigate UBSAN alerts [`a4dec0c`](https://github.com/ImageMagick/ImageMagick6/commit/a4dec0cbdeb1ed2acf79e8efe664cdb2348e524b) +- mitigate UBSAN alerts [`99841ed`](https://github.com/ImageMagick/ImageMagick6/commit/99841edc96458bad24754b587de79693da67224b) +- destroy image list rather than just the first image [`c42cd7c`](https://github.com/ImageMagick/ImageMagick6/commit/c42cd7c143e501aff4d624a2591e7f26ee5d5ce9) +- less aggressive sanity check [`dda7d0b`](https://github.com/ImageMagick/ImageMagick6/commit/dda7d0bb7d4f675f652fea20dff66778fb2bc88b) +- https://github.com/ImageMagick/ImageMagick/issues/4495 [`d46d0c6`](https://github.com/ImageMagick/ImageMagick6/commit/d46d0c647aa67bcfffec5dbd456c24b9c66de66e) +- pending release [`506ae2c`](https://github.com/ImageMagick/ImageMagick6/commit/506ae2c2e2d4bbb07d4ba4075d06aadccbc675fd) + +## [6.9.12-29](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-28...6.9.12-29) - 2021-11-14 + +### Commits + +- latest docs [`f624d40`](https://github.com/ImageMagick/ImageMagick6/commit/f624d406e79ce1d5f600a1ff569bf02d6eccf4b2) +- Use CheckMergedImageAlpha when layer size is zero. [`b614db7`](https://github.com/ImageMagick/ImageMagick6/commit/b614db76102d0f4c38149d2b6c63e091bc975b6b) +- early exit on exception [`b272aca`](https://github.com/ImageMagick/ImageMagick6/commit/b272acab91444f2115099fe51ee6c91bb4db5d50) +- Improved detection of %%. [`cddc5be`](https://github.com/ImageMagick/ImageMagick6/commit/cddc5be6a7150e9c47fd155b402fc896e1d9d0b6) +- ... [`c66229f`](https://github.com/ImageMagick/ImageMagick6/commit/c66229fb1a73213f392752050d49084d32032aec) +- ... [`8867bad`](https://github.com/ImageMagick/ImageMagick6/commit/8867bada8703071aa5356240d677b2ac1069ff3e) +- Corrected detection of the CMYK colorspace. [`af56076`](https://github.com/ImageMagick/ImageMagick6/commit/af56076082b5703d65f754a501876d082743a0ab) +- https://github.com/ImageMagick/ImageMagick/issues/4452 [`ba084f6`](https://github.com/ImageMagick/ImageMagick6/commit/ba084f6bda2edbacf1df824bb214728234ffaa86) +- pending release [`4dbdd3b`](https://github.com/ImageMagick/ImageMagick6/commit/4dbdd3bd7d4cb95bc883010d70d0e31d69308536) +- pending release [`efe0cae`](https://github.com/ImageMagick/ImageMagick6/commit/efe0caec013e87837c29a83e57e5ea7397ce8645) +- ... [`4efb23e`](https://github.com/ImageMagick/ImageMagick6/commit/4efb23ee93a2026434e5b0253ddb9c3622c1b1ab) +- ... [`04c02b3`](https://github.com/ImageMagick/ImageMagick6/commit/04c02b3ad4ae57a28c87a094fd72f153b6dc49bb) + +## [6.9.12-28](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-27...6.9.12-28) - 2021-10-29 + +### Commits + +- pending release [`0ca0004`](https://github.com/ImageMagick/ImageMagick6/commit/0ca000449de02d87e3fccba10255472417a4d3dc) +- ... [`4b5c30c`](https://github.com/ImageMagick/ImageMagick6/commit/4b5c30c0b879dc4c670c27f53721df60896724c2) +- ... [`dd1dc33`](https://github.com/ImageMagick/ImageMagick6/commit/dd1dc3392ee1ec775f9d53d2fe306e458dadaef2) +- ... [`e10fc76`](https://github.com/ImageMagick/ImageMagick6/commit/e10fc76ab4c7850547271a73d1b1c7ebebb691be) +- pending release [`af2ee30`](https://github.com/ImageMagick/ImageMagick6/commit/af2ee30d2201829812864d7d8aadee0e46cd5d91) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=40451 [`ba7e11c`](https://github.com/ImageMagick/ImageMagick6/commit/ba7e11c5ea554317c28977ff6e5afc4f050a7ae1) +- Fix stack overflow when parsing malicious ps image file. [`f74b2b1`](https://github.com/ImageMagick/ImageMagick6/commit/f74b2b19d13df6b61b5ede33aa7249dcb0f496a5) +- pending release [`1898d52`](https://github.com/ImageMagick/ImageMagick6/commit/1898d52023601f8ea5bdb583f9dd2b3a435572cb) +- pending release [`f59af4f`](https://github.com/ImageMagick/ImageMagick6/commit/f59af4f713acf87b7279e68c01ac9579fea8793a) +- cosmetic [`d480691`](https://github.com/ImageMagick/ImageMagick6/commit/d480691c7d0ad3f16ff94148e781cbaff05ed1be) + +## [6.9.12-27](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-26...6.9.12-27) - 2021-10-25 + +### Commits + +- ... [`60fcc24`](https://github.com/ImageMagick/ImageMagick6/commit/60fcc24991c45628286b8a88ccd5983d4979626d) +- pending release [`b6fe79f`](https://github.com/ImageMagick/ImageMagick6/commit/b6fe79f95ebd91a0439cbb7adb4602c4d4aa154e) + +## [6.9.12-26](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-25...6.9.12-26) - 2021-10-24 + +### Commits + +- https://github.com/ImageMagick/ImageMagick/issues/4379 [`199a858`](https://github.com/ImageMagick/ImageMagick6/commit/199a8586fd1ab273b25dae3f75ff131f4b302ceb) +- https://github.com/ImageMagick/ImageMagick/issues/4378 [`c661299`](https://github.com/ImageMagick/ImageMagick6/commit/c661299cd1ff36d8783641cb4cffdffb0fd9041d) +- adjust metrics is no longer sensitive to gravity [`6dc9251`](https://github.com/ImageMagick/ImageMagick6/commit/6dc9251f0dcc11d29dbb90f430431b553df46f35) +- :1 [`cc76510`](https://github.com/ImageMagick/ImageMagick6/commit/cc765107a9c7e19607e7fd18feb89a22a563ebb4) +- Revert adjustment of the y1 value [`122366e`](https://github.com/ImageMagick/ImageMagick6/commit/122366e570731f71c90e82f219c43d78864597a3) +- Corrected versions in ChangeLog. [`7e972cc`](https://github.com/ImageMagick/ImageMagick6/commit/7e972cc7157ddaf638c8301945058970af0c114f) +- https://oss-fuzz.com/testcase-detail/6308942275805184 [`5c82207`](https://github.com/ImageMagick/ImageMagick6/commit/5c822075c884a488242d8d5558964a087cc9db99) +- eliminate compiler warning [`8afbdbc`](https://github.com/ImageMagick/ImageMagick6/commit/8afbdbc36fe128383b4fce3374c080ac34177b15) +- fix stack overflow when parsing malicious tiff image [`85a370c`](https://github.com/ImageMagick/ImageMagick6/commit/85a370c79afeb45a97842b0959366af5236e9023) +- https://github.com/ImageMagick/ImageMagick/issues/4372 [`2466e9a`](https://github.com/ImageMagick/ImageMagick6/commit/2466e9a94e42b2511ef7016259a72a714808f9fe) +- ... [`c4b9474`](https://github.com/ImageMagick/ImageMagick6/commit/c4b94746cb97fc81b0b552e14f4e462449e567b5) +- pending release [`fd247de`](https://github.com/ImageMagick/ImageMagick6/commit/fd247de75a1f271474294cc97c09f291e58f2be3) +- ... [`7671137`](https://github.com/ImageMagick/ImageMagick6/commit/76711376db504e9c786426e9381021889b00590e) +- pending release [`adf4467`](https://github.com/ImageMagick/ImageMagick6/commit/adf446722724ea7cad8ebc6046e87df82aae4f05) +- slight performance optimization [`627cf43`](https://github.com/ImageMagick/ImageMagick6/commit/627cf4307b93d5185fe877db8ebb51236043f350) +- revert optimization [`07c8384`](https://github.com/ImageMagick/ImageMagick6/commit/07c838431ab2cd620daf1d43e35f8a3f0b23b7a5) +- Correct more version numbers. [`b0a8b26`](https://github.com/ImageMagick/ImageMagick6/commit/b0a8b2655487ee5b6248897e5c955b8a44bfc790) +- pending release [`a85dee3`](https://github.com/ImageMagick/ImageMagick6/commit/a85dee3187419ab8c8dc1385b0be9bd9c51c731c) +- pending release [`175f33e`](https://github.com/ImageMagick/ImageMagick6/commit/175f33e13311562f51ae7b1631af65bb0ee29676) +- ... [`6fe9741`](https://github.com/ImageMagick/ImageMagick6/commit/6fe9741ec186b9893bc87d39e83d0d705fe0fad5) +- pending release [`3430fb8`](https://github.com/ImageMagick/ImageMagick6/commit/3430fb87b5714e3d50717497be71a0531600da76) +- test release [`01e79c2`](https://github.com/ImageMagick/ImageMagick6/commit/01e79c207608bb7eacd4b6710663213773684dcd) + +## [6.9.12-25](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-24...6.9.12-25) - 2021-10-10 + +### Commits + +- https://github.com/ImageMagick/ImageMagick/discussions/4311 [`f6fdd03`](https://github.com/ImageMagick/ImageMagick6/commit/f6fdd03216d401b7e3b558218f7805b61d2cecc5) +- don't adjust metrics if gravity is undefined [`79c537c`](https://github.com/ImageMagick/ImageMagick6/commit/79c537c7bdfe0f71b4354ace4d9c9976c29b4c4a) +- ... [`cfcd23e`](https://github.com/ImageMagick/ImageMagick6/commit/cfcd23ee92152228ba36ac12d6fc0a6ec34d41c0) +- Moved using namespace std after ImageMagick header files to fix issues when enabling ISO C++ 17 and ISO C17 [`2c96ab5`](https://github.com/ImageMagick/ImageMagick6/commit/2c96ab5d098fcf3d2002378355bc2ad3eaccaddf) +- ... [`24961a9`](https://github.com/ImageMagick/ImageMagick6/commit/24961a9e25ac31b7ddd42eb8f1c130717971da16) +- fix ANSI compiler error [`94119fe`](https://github.com/ImageMagick/ImageMagick6/commit/94119febc83c74913017289e5060e1e5ccf378d4) +- https://github.com/ImageMagick/ImageMagick/issues/4314 [`c8bba5b`](https://github.com/ImageMagick/ImageMagick6/commit/c8bba5bf458c63486417c6f0084ce383c89d78b1) +- pending release [`af67f12`](https://github.com/ImageMagick/ImageMagick6/commit/af67f1234b95fcad2fc28560fb8136defc16108a) +- ... [`48e52d0`](https://github.com/ImageMagick/ImageMagick6/commit/48e52d0ef0ce365a5a6e7c4d20cff582be835786) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=39708 [`5569c6c`](https://github.com/ImageMagick/ImageMagick6/commit/5569c6cc38ea99d9cba667deaddf09ba1ec42005) + +## [6.9.12-24](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-23...6.9.12-24) - 2021-10-03 + +### Commits + +- Adjust the x1 offset of the bounds to make sure a font is rendered inside the canvas. [`1746362`](https://github.com/ImageMagick/ImageMagick6/commit/17463624f35b293f5e1689b8039bcdae96bdd8d1) +- ignore zero-length profiles [`94cc6fd`](https://github.com/ImageMagick/ImageMagick6/commit/94cc6fd1c2f3ad739903726ec7e63d31a2b3d747) +- Correct replacement of spaces that use more than one octet. [`1d59719`](https://github.com/ImageMagick/ImageMagick6/commit/1d597191bd1f45d05ff041c89b7e3f8759e9eaf5) +- ... [`f4277c4`](https://github.com/ImageMagick/ImageMagick6/commit/f4277c460e804659535de8e2d8dd9507ab50bb2f) +- https://github.com/ImageMagick/ImageMagick/discussions/4227 [`1c5e41a`](https://github.com/ImageMagick/ImageMagick6/commit/1c5e41a934fd40ce86f37ecee6b54a6940183f1e) +- Revert patch because this breaks font rendering for other fonts. [`c55ddb1`](https://github.com/ImageMagick/ImageMagick6/commit/c55ddb1d646b1540afafd918be89eef69d83b467) +- https://github.com/ImageMagick/ImageMagick/issues/4278 [`4748ccc`](https://github.com/ImageMagick/ImageMagick6/commit/4748ccc31888db1e8610084b611710e7e2dadbfe) +- Correction of the bounds measurements. [`fd9443b`](https://github.com/ImageMagick/ImageMagick6/commit/fd9443b46cb0254f1a6908be2738950d402169ab) +- pending release [`c15d3ae`](https://github.com/ImageMagick/ImageMagick6/commit/c15d3aef8ffe50174763ef00c5780e3d6c774232) +- Added extra check to prevent replacing a non-breaking space with a newline. [`6e82f6f`](https://github.com/ImageMagick/ImageMagick6/commit/6e82f6f182f585ecc1cc70cd3fe7c5adb6c6c5ea) +- Silence warning. [`32bda8b`](https://github.com/ImageMagick/ImageMagick6/commit/32bda8bb2132fad29eb6e175d3da92e45f9c25af) +- cosmetic [`d2b4807`](https://github.com/ImageMagick/ImageMagick6/commit/d2b4807f8eefb98f150901f941f6a1eea892f867) +- Use same code as IM7. [`770902f`](https://github.com/ImageMagick/ImageMagick6/commit/770902feba3806065e77e477d3b796a185e23a82) +- Space pointer was still pointing to the old string. [`96f65f4`](https://github.com/ImageMagick/ImageMagick6/commit/96f65f410afee03d45563c5a5fe01f4496d9b581) +- argument is const [`4137ebc`](https://github.com/ImageMagick/ImageMagick6/commit/4137ebce1e559a483bb50c6aab283a30a938d63d) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=39091 [`a96f221`](https://github.com/ImageMagick/ImageMagick6/commit/a96f221bfa150943d0f63b6b44910c9abd8988b2) +- check return status [`cca5a6a`](https://github.com/ImageMagick/ImageMagick6/commit/cca5a6a3f9eacd6c5db570f90dcd3b73a30b2f59) +- Fixed build error. [`78e0310`](https://github.com/ImageMagick/ImageMagick6/commit/78e03105e90cd4ac5cbe2970a31a13f66c1270bf) +- Cosmetic. [`7467737`](https://github.com/ImageMagick/ImageMagick6/commit/74677375e48303e8d3355a1cd63bdd5ee0e90269) +- ... [`92194b2`](https://github.com/ImageMagick/ImageMagick6/commit/92194b2ac097619013e2be312b0121c0f75911a9) +- Whitespace. [`d338817`](https://github.com/ImageMagick/ImageMagick6/commit/d3388174b0603040fd78d681fa85cf1080bef493) + +## [6.9.12-23](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-22...6.9.12-23) - 2021-09-18 + +### Commits + +- ... [`a9b45b4`](https://github.com/ImageMagick/ImageMagick6/commit/a9b45b47282987cd0df488ed597e7b95179960c9) +- Don't set the resolution when the cropbox is used. [`de18836`](https://github.com/ImageMagick/ImageMagick6/commit/de18836f1e1ded1395df589e5977c1aa762b486c) +- pending release [`54a7092`](https://github.com/ImageMagick/ImageMagick6/commit/54a70929c2ad8df2321d4b3fc9c7d1b986ddaa2b) +- Added missing null checks. [`c7039d2`](https://github.com/ImageMagick/ImageMagick6/commit/c7039d20a2fe018f041e40459d722188293012c5) +- Give the buffer a proper size instead of "over allocating". [`ecd4719`](https://github.com/ImageMagick/ImageMagick6/commit/ecd4719848da7562d3724e6f1b7bf24d1b72f1fc) +- Added link to advisory. [`bd43241`](https://github.com/ImageMagick/ImageMagick6/commit/bd432413b03d7eb01ad5dcb14127910b7f80ff4c) +- pending release [`4230c6e`](https://github.com/ImageMagick/ImageMagick6/commit/4230c6e6ab33f8ccaff98529284a6285dc10ec61) +- Added missing bom. [`bd9fb58`](https://github.com/ImageMagick/ImageMagick6/commit/bd9fb58de3d9e3847054ccc7ff5caba72cd5877d) +- https://github.com/ImageMagick/ImageMagick/issues/4235 [`eef08cc`](https://github.com/ImageMagick/ImageMagick6/commit/eef08ccf4da69848a6f475806f23711577f62c9e) + +## [6.9.12-22](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-21...6.9.12-22) - 2021-09-12 + +### Commits + +- Moved RSVG rendering to a separate method. [`1dc463e`](https://github.com/ImageMagick/ImageMagick6/commit/1dc463eb50f48b9bd4f06530021f4fe52376e5d4) +- Moved MSVG rendering to a separate method. [`a39da2b`](https://github.com/ImageMagick/ImageMagick6/commit/a39da2b112d2f36d78c5d79a821216385be7f8f3) +- Use yaml template instead. [`edf63d3`](https://github.com/ImageMagick/ImageMagick6/commit/edf63d36a7af9468aa07ca2a4c7b9a98db67c1ec) +- Clean up the remaining PDF files if reading one of the files fails. [`3177df6`](https://github.com/ImageMagick/ImageMagick6/commit/3177df671ee3904bdfe09c05d297fa1580253e98) +- https://github.com/ImageMagick/ImageMagick/issues/4059 [`9d97e95`](https://github.com/ImageMagick/ImageMagick6/commit/9d97e95150ed3cd7ddfc478248e48b9c0d40f56b) +- Fixed incorrect check when module is used as the domain in policy.xml that would allow the use of a disabled module. [`8cd2fcd`](https://github.com/ImageMagick/ImageMagick6/commit/8cd2fcd33460826628a7590dc3ce74d7785e1598) +- ... [`75e8372`](https://github.com/ImageMagick/ImageMagick6/commit/75e83721e27b60c7354cb3ec58205a9458999dd5) +- check for EOF [`ae88f07`](https://github.com/ImageMagick/ImageMagick6/commit/ae88f07cd31bdbb671270349abdc48d9ca6463fb) +- ... [`a6f6ee2`](https://github.com/ImageMagick/ImageMagick6/commit/a6f6ee269de56892b35ffbc03ab1accb4f593be9) +- Use the correct rights. [`428e685`](https://github.com/ImageMagick/ImageMagick6/commit/428e68597fa904d0bdc133d878e12acd7dc60fa3) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=38401 [`61c3f46`](https://github.com/ImageMagick/ImageMagick6/commit/61c3f4697b2915b10123c11b09f6cf58abe0c07e) +- Added yml to the .editorconfig [`06c089b`](https://github.com/ImageMagick/ImageMagick6/commit/06c089b3fe5438882d54cc2ad4dbc7394b852643) +- check for EOF [`b3bc44a`](https://github.com/ImageMagick/ImageMagick6/commit/b3bc44a3211edfa701075e3a178bb434050bb785) +- Added extra policy check. [`899d06f`](https://github.com/ImageMagick/ImageMagick6/commit/899d06fb1a97083bddda51cc88abc0f79841667e) +- Added early exists. [`005af2a`](https://github.com/ImageMagick/ImageMagick6/commit/005af2a1557c8b49bf1116c380435c8064f9f70c) +- Revert break to make it possible to use and allow list. [`10c0f5b`](https://github.com/ImageMagick/ImageMagick6/commit/10c0f5b31bbea82ebd219a0da201a99a2e874c52) +- pending release [`83b8cb1`](https://github.com/ImageMagick/ImageMagick6/commit/83b8cb1d99f0f842be50007572c7ecdb588e292d) +- Added missing policy checks in RegisterStaticModules. [`69ea558`](https://github.com/ImageMagick/ImageMagick6/commit/69ea5587de17ef89476be47a3cb7f855c0355a74) +- Minor optimization when nothing will change. [`bfbf998`](https://github.com/ImageMagick/ImageMagick6/commit/bfbf9988fd9350a6a4da03daa011539204eecdee) +- pending release [`be2ebac`](https://github.com/ImageMagick/ImageMagick6/commit/be2ebac260ba43ede0b3beb5820a5d6492c35481) +- Use AllPolicyRights instead. [`b60e171`](https://github.com/ImageMagick/ImageMagick6/commit/b60e17133b982d28816386b83174c2bc06dd39bd) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=38573 [`c4bdacf`](https://github.com/ImageMagick/ImageMagick6/commit/c4bdacff93e145dc1dd282cca3b04127ceb71bf4) +- pending release [`f48b623`](https://github.com/ImageMagick/ImageMagick6/commit/f48b6233e976f56a499a49c55b5f3f26c11451f5) +- Added missing call to ConstrainColormapIndex. [`02ce9e1`](https://github.com/ImageMagick/ImageMagick6/commit/02ce9e1bbba067b2ebcc18d07456a22570cbf5f2) +- pending release [`9146746`](https://github.com/ImageMagick/ImageMagick6/commit/9146746f54a24775225e541edc58364ab13e0126) +- Changed build status link [`412d49b`](https://github.com/ImageMagick/ImageMagick6/commit/412d49b2b2a733401a469b7e658a1113e720c550) +- https://github.com/ImageMagick/ImageMagick/issues/2579 [`843fd11`](https://github.com/ImageMagick/ImageMagick6/commit/843fd110d7d3b0fa5e00c553290739fde2778ab1) +- Removed travis CI link. [`c3b1c13`](https://github.com/ImageMagick/ImageMagick6/commit/c3b1c1334809ad132dddbdfac91618b144fce796) +- Also set RGB channels when reading the image (#167). [`4282b98`](https://github.com/ImageMagick/ImageMagick6/commit/4282b98eb645351ddf122faa67c94610718595dc) +- Removed newline. [`8cc488a`](https://github.com/ImageMagick/ImageMagick6/commit/8cc488aaca954aa26406678a0032f40561a3c9b4) +- Added donate badge. [`a3d7d3f`](https://github.com/ImageMagick/ImageMagick6/commit/a3d7d3f1926d060f8acb4417deed015a01efad01) + +## [6.9.12-21](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-20...6.9.12-21) - 2021-09-04 + +### Commits + +- Use different values per channel for scale and translate. [`109e236`](https://github.com/ImageMagick/ImageMagick6/commit/109e236860e35212a90b5eb6b93a6662ca208233) +- Use link for the Windows build instructions instead. [`d8da2c5`](https://github.com/ImageMagick/ImageMagick6/commit/d8da2c53bdc4a738017a8ba346ab523935878faa) +- ./configure --help no longer lists -disable-assert twice [`0aab306`](https://github.com/ImageMagick/ImageMagick6/commit/0aab3061aad8211bcec1eb0f4e479414c8a9a3f1) +- ... [`397b5c3`](https://github.com/ImageMagick/ImageMagick6/commit/397b5c32487efdc5eb7daf206c6317fb670bad16) +- https://github.com/ImageMagick/ImageMagick/issues/4105 [`3afc3bc`](https://github.com/ImageMagick/ImageMagick6/commit/3afc3bc9d97ec424bd92ab5c74f090586d91fa0b) +- initialize buffer before calling TIFFGetField() [`ce2f067`](https://github.com/ImageMagick/ImageMagick6/commit/ce2f0676f8766343ae2322ace7311a53c7ae6d97) +- Added .editorconfig [`afad655`](https://github.com/ImageMagick/ImageMagick6/commit/afad65584be6d6d25902599b44f4c20c9a747692) +- Add -HDRI to the quantum in the version string when HDRI is enabled. [`423a801`](https://github.com/ImageMagick/ImageMagick6/commit/423a8014dfa4705ebd8ec057ea78d99c224871d7) +- pending release [`c4ed7a2`](https://github.com/ImageMagick/ImageMagick6/commit/c4ed7a29cf8695a67341175a329532947bc50b54) +- Use UTC date as requested in #166. [`e0967ea`](https://github.com/ImageMagick/ImageMagick6/commit/e0967eae28b4594f08c0a443ee53ac15390cff4a) +- Minor changes to the formatting of the parentheses. [`278a93e`](https://github.com/ImageMagick/ImageMagick6/commit/278a93e8940eff474a083b42dde39a0c7da1c85e) +- https://github.com/ImageMagick/ImageMagick/issues/4121 [`6ba45df`](https://github.com/ImageMagick/ImageMagick6/commit/6ba45df1e4c67d9897262a7ff5706eb404f2ea7f) +- pending release [`9eb3b4e`](https://github.com/ImageMagick/ImageMagick6/commit/9eb3b4ea7b66e515283c0f9b5158c0c2f368c324) +- tweak the bilevel image type [`473c7cd`](https://github.com/ImageMagick/ImageMagick6/commit/473c7cd850bdc40c2d1e8e72c4d3b073f1079138) +- https://oss-fuzz.com/testcase-detail/6502669439598592 [`995de33`](https://github.com/ImageMagick/ImageMagick6/commit/995de330310dd35531165d9471fe4d31e0fa79ae) +- Add -dPrinted=false to the Ghostscript options (#4019) [`5f82ea4`](https://github.com/ImageMagick/ImageMagick6/commit/5f82ea411e7e1190f2f7aed8a0b1c97a42b6bd58) + +## [6.9.12-20](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-19...6.9.12-20) - 2021-08-22 + +### Commits + +- check if colorspace is incompatible before transforming it to sRGB [`fdf7e64`](https://github.com/ImageMagick/ImageMagick6/commit/fdf7e64ed09666a0c8f3588b47d302b01a7cdeaa) +- the -format option now respects the -channel argument [`6dc7e94`](https://github.com/ImageMagick/ImageMagick6/commit/6dc7e946ad28bc74f0385f32409382d2c290f6c2) +- mean is already computed, don't compute it again [`b1a8609`](https://github.com/ImageMagick/ImageMagick6/commit/b1a86095382b696ffef5a286b3cdb2ecf1599683) +- ... [`aebaac6`](https://github.com/ImageMagick/ImageMagick6/commit/aebaac62a29393e35d3c20715056cb74f6792e13) +- optimize on grayscale detection [`e38fce1`](https://github.com/ImageMagick/ImageMagick6/commit/e38fce1ef0f7b569ec664a4b228335e34e037ae0) +- heap-based buffer overflow in TIFF coder (alert from Hunter Mitchell) [`e1fbcdf`](https://github.com/ImageMagick/ImageMagick6/commit/e1fbcdf3aad96d51db65c1601117396eac665a6d) +- timeb.h is deprecated [`827ba53`](https://github.com/ImageMagick/ImageMagick6/commit/827ba5310372558385feb91a03afda829928a25e) +- Use new solution that is already upgrade to VS2019. [`b9ca6d9`](https://github.com/ImageMagick/ImageMagick6/commit/b9ca6d96820f7f2278515f6bfb26b72c42e1338b) +- eliminate improper assertion [`78c72ee`](https://github.com/ImageMagick/ImageMagick6/commit/78c72ee91c93c4d10f89de781a711bf4e53dfcd9) +- grayscale images were not being written properly [`84e8b18`](https://github.com/ImageMagick/ImageMagick6/commit/84e8b18294907a1232b216d89a60008341dfbc5a) +- heap-based buffer overflow in TIFF coder (alert from Hunter Mitchell) [`f90a091`](https://github.com/ImageMagick/ImageMagick6/commit/f90a091c7dd12cc53b0999bf49d1c80651534eea) +- reset image structure magick member [`e2045ec`](https://github.com/ImageMagick/ImageMagick6/commit/e2045ec83b5f709decf50c762ceac843e749d52e) +- https://github.com/ImageMagick/ImageMagick/issues/4059 [`63037e7`](https://github.com/ImageMagick/ImageMagick6/commit/63037e7bbf33574513126f5aef0acf3416146a93) +- https://github.com/ImageMagick/ImageMagick/issues/4059 [`37b4985`](https://github.com/ImageMagick/ImageMagick6/commit/37b49851335e9df91de7cdf763d27768c85c69e3) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=36990 [`9aa9170`](https://github.com/ImageMagick/ImageMagick6/commit/9aa91709d2b9ec1b98398e081e2fb67bb7e1718e) +- ... [`92a2023`](https://github.com/ImageMagick/ImageMagick6/commit/92a2023362cf5b2e31df3b9331015a3093deb65f) +- heap-based buffer overflow in TIFF coder (alert from Hunter Mitchell) [`35b88c9`](https://github.com/ImageMagick/ImageMagick6/commit/35b88c9166bc1b3ce8893f52217bae00d8e2c532) +- eliminate compiler warning [`1c9bcc6`](https://github.com/ImageMagick/ImageMagick6/commit/1c9bcc67803f7130afda8f2caa8bd8a5f1999dde) +- pending release [`4e5510e`](https://github.com/ImageMagick/ImageMagick6/commit/4e5510e020300678a4ea20a4e35348444981cba5) +- Whitespace [`4d1d0a6`](https://github.com/ImageMagick/ImageMagick6/commit/4d1d0a6a6adc8433126ec912c87336c797f92735) +- https://github.com/ImageMagick/ImageMagick/issues/4059 [`54df923`](https://github.com/ImageMagick/ImageMagick6/commit/54df923634871204a7a371b9523ab63d67cc37d1) +- pending release [`bf9a427`](https://github.com/ImageMagick/ImageMagick6/commit/bf9a4278c183d2713894d0ff1d4e97232cd2d70e) +- pending release [`1e43b29`](https://github.com/ImageMagick/ImageMagick6/commit/1e43b291a5825520860b92acb3f7b52ba6145805) +- reduce memory moves [`0132164`](https://github.com/ImageMagick/ImageMagick6/commit/0132164f33ea82daf732f3923c2fb141cb834dcc) +- pending release [`d49be7f`](https://github.com/ImageMagick/ImageMagick6/commit/d49be7fbb7667ec214cd00a16145d7f4e3f1606e) +- Only run the OpenCL benchmark when OpenCL is enabled. [`a04e6c4`](https://github.com/ImageMagick/ImageMagick6/commit/a04e6c49bdc19d9918d5a588ea3fd95f39dcd379) +- https://github.com/ImageMagick/ImageMagick/issues/4059 [`41c9434`](https://github.com/ImageMagick/ImageMagick6/commit/41c9434f427bcbba9163f4550cd034a6d8363fb9) +- Use & instead. [`8a23eb2`](https://github.com/ImageMagick/ImageMagick6/commit/8a23eb2603186c704f30d4b2f17bdefa5d6822d3) +- stop parsing after exception [`44c3bfc`](https://github.com/ImageMagick/ImageMagick6/commit/44c3bfc788dd4c94682093d480c514ab38543a2f) +- pending release [`0f1b20c`](https://github.com/ImageMagick/ImageMagick6/commit/0f1b20cf7eaa687847c1da3356961eb44e807911) +- stop parsing on exception [`b915afb`](https://github.com/ImageMagick/ImageMagick6/commit/b915afb73148a8da5bca4a018a43c0432873d7fc) + +## [6.9.12-19](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-18...6.9.12-19) - 2021-07-18 + +### Commits + +- revert; keep CoreGenesis/CoreTerminus pairs; destroy wand ids [`2f3cc2c`](https://github.com/ImageMagick/ImageMagick6/commit/2f3cc2cf8339f1defd4215efcb320119de6ac1df) +- call MagickWandGenesis()/MagickWandTerminus() [`64aef14`](https://github.com/ImageMagick/ImageMagick6/commit/64aef14cc75b3bc0af31bc417060d79dfb6194e0) +- call wand genesis / terminus rather than core [`c4f26fb`](https://github.com/ImageMagick/ImageMagick6/commit/c4f26fbfd50bdb47397977758dc770f92b35a4bd) +- ... [`45df407`](https://github.com/ImageMagick/ImageMagick6/commit/45df407647856e7b5750767e49885b2f32a29c36) +- Fixed writing the iptc information when it is not stored as long. [`f4feb3e`](https://github.com/ImageMagick/ImageMagick6/commit/f4feb3eef7d1013f90babd21dee51736a21be1b2) +- install wand.h header that defines DestroyWandIDs() [`c2d788c`](https://github.com/ImageMagick/ImageMagick6/commit/c2d788c52ab9824c938af0a85ae83281d4c9c0a4) +- https://github.com/ImageMagick/ImageMagick/issues/3896 [`f939ee0`](https://github.com/ImageMagick/ImageMagick6/commit/f939ee00031464bd30cc69dcab8777f39ee8fbb8) +- ... [`3b491b8`](https://github.com/ImageMagick/ImageMagick6/commit/3b491b852a6f692ebc3ace6fee8ceb7ceb0adde9) +- pending release [`c0e73a4`](https://github.com/ImageMagick/ImageMagick6/commit/c0e73a46b330d6f58dd0f5bb5ecf7c9287812acb) +- pending release [`e28afaa`](https://github.com/ImageMagick/ImageMagick6/commit/e28afaa4eb6f184689c218debe9ba4874b9f727b) +- ... [`d881b80`](https://github.com/ImageMagick/ImageMagick6/commit/d881b800c7f768bb5926e0ad730401bd866865cc) +- ... [`d09e86f`](https://github.com/ImageMagick/ImageMagick6/commit/d09e86f7d23784a2e8156ad7341a4221f0034d83) +- pending release [`5b9a9db`](https://github.com/ImageMagick/ImageMagick6/commit/5b9a9dbbe0c5b1654ff3185dee96fae0f0514295) +- pending release [`1015767`](https://github.com/ImageMagick/ImageMagick6/commit/1015767a1429e3fa67b63853dc67d625171812c1) +- https://github.com/ImageMagick/ImageMagick/issues/3951 [`e924a55`](https://github.com/ImageMagick/ImageMagick6/commit/e924a55afa85eff1780ad78d875f6429a50c4c11) +- remove virtual canvas offset from similarity image [`1f974fd`](https://github.com/ImageMagick/ImageMagick6/commit/1f974fd9eb285da31989e97d51fca67648643ef2) +- ... [`b847557`](https://github.com/ImageMagick/ImageMagick6/commit/b847557488c072763c2a0ecf62d0cfac5748353b) + +## [6.9.12-18](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-17...6.9.12-18) - 2021-07-17 + +### Merged + +- uses the PerceptibleReciprocal() to prevent the divide-by-zero from occurring [`#3194`](https://github.com/ImageMagick/ImageMagick6/pull/3194) + +### Commits + +- Use the new issue templates. [`7c853af`](https://github.com/ImageMagick/ImageMagick6/commit/7c853afa3be12dfff22b34f0d2ddaf15180e66d9) +- optimize grayscale detection [`ec9feab`](https://github.com/ImageMagick/ImageMagick6/commit/ec9feabc987df9781c4e89f2ce014b75b02bfd0d) +- Corrected getting the image dimensions when identifying a postscript file. [`d624b59`](https://github.com/ImageMagick/ImageMagick6/commit/d624b590d2b1a4dd2d9f6794d6c388ca7b9069db) +- Fixed parsing the spot colors of a postscript document. [`ce84a88`](https://github.com/ImageMagick/ImageMagick6/commit/ce84a88592408d25533cd63a58ba7ee1b2b7c4cd) +- ... [`74f450e`](https://github.com/ImageMagick/ImageMagick6/commit/74f450e153dccb64bc254fca89318b00f6dd0eda) +- system() is not supported under IOS [`b9f3577`](https://github.com/ImageMagick/ImageMagick6/commit/b9f3577b509808187fcb9b4a8955d6327bcd0e09) +- The predictor tag should only be set for specific compression types. [`96c9b70`](https://github.com/ImageMagick/ImageMagick6/commit/96c9b7032d4b5cc3703cc32a1d59ab8c64a6a289) +- Added option to peek in the byte buffer. [`63bc851`](https://github.com/ImageMagick/ImageMagick6/commit/63bc85166df5b0c14562687252d8050cee1a73fb) +- Removed checklist. [`bc06359`](https://github.com/ImageMagick/ImageMagick6/commit/bc06359cf59e33b88ba0199f01ed4b5f1bbe8f6b) +- set imaginary component of the complex conjugate to -Ai [`f6b610f`](https://github.com/ImageMagick/ImageMagick6/commit/f6b610f6370b5140b86e50854a0b72dfc4d0dff0) +- check for zero demoninator [`e110b81`](https://github.com/ImageMagick/ImageMagick6/commit/e110b81fd38b2e15dc7495699de53df51f4ade91) +- Added raqm to the autolinking list. [`756685f`](https://github.com/ImageMagick/ImageMagick6/commit/756685f4111943499a530c4bcf84b55964b8ba00) +- Make it more clear that no memory is leaking. [`7f0b16c`](https://github.com/ImageMagick/ImageMagick6/commit/7f0b16c0578766a578cdaa686e891b4812d17848) +- Fixed copy paste mistake. [`0416173`](https://github.com/ImageMagick/ImageMagick6/commit/0416173677748e027ac772fa2094174a0a91b6d3) +- prevent blow up when standard deviation is 0 [`033df67`](https://github.com/ImageMagick/ImageMagick6/commit/033df67ae2d4ef2dc13952bfc48cbc5bef4b1686) +- pending release [`83e0280`](https://github.com/ImageMagick/ImageMagick6/commit/83e0280d488f14cf73f1e85cbf6857a56438f2db) +- proper cast [`4ce1321`](https://github.com/ImageMagick/ImageMagick6/commit/4ce1321c497e76e07d6c785840a2c6a0d2c6dbd8) +- https://github.com/ImageMagick/ImageMagick/issues/3925 [`cd274e4`](https://github.com/ImageMagick/ImageMagick6/commit/cd274e439e7bb49d18b1be7617d89f3be91b3188) + +## [6.9.12-17](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-16...6.9.12-17) - 2021-06-25 + +### Commits + +- ... [`801ffbd`](https://github.com/ImageMagick/ImageMagick6/commit/801ffbdc1a221e7a9947d22efb81101ce7fb2289) +- ... [`c1cb4d2`](https://github.com/ImageMagick/ImageMagick6/commit/c1cb4d26d533aa137cc5280aa6370f8d61150a1c) +- pending release [`fdb4ff6`](https://github.com/ImageMagick/ImageMagick6/commit/fdb4ff6575cb1012397a9a9e03f45924d56fd8fa) +- fix memory corruption in ConcatenateStringInfo [`7b5d5d9`](https://github.com/ImageMagick/ImageMagick6/commit/7b5d5d943fec12ccd167a6fed11758c609cb3275) +- ... [`8c99db4`](https://github.com/ImageMagick/ImageMagick6/commit/8c99db4d683f3fd1a4a89b85b3dc5c4b2c7295f4) + +## [6.9.12-16](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-15...6.9.12-16) - 2021-06-20 + +### Commits + +- ver allocate memory, typically used when concatentating strings [`73a59dc`](https://github.com/ImageMagick/ImageMagick6/commit/73a59dcd4eaae3a0cec565abda9c0dcb070c734a) +- ... [`dafa983`](https://github.com/ImageMagick/ImageMagick6/commit/dafa983fea7c9b0160c375435c53e83bc436b3c8) +- ... [`8aea6ca`](https://github.com/ImageMagick/ImageMagick6/commit/8aea6ca9f5363b4f5d6caaaa1df2c87a4bc43c82) +- https://github.com/ImageMagick/ImageMagick/issues/3844 [`fdf3836`](https://github.com/ImageMagick/ImageMagick6/commit/fdf38365635ec2e31d1c5294f1fb22a34917f2d4) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=35322 [`40f9bcd`](https://github.com/ImageMagick/ImageMagick6/commit/40f9bcd0f47d24eae4a9c3d542273af586938695) +- Revert patch that automatically changes the image orientation. [`086c8ee`](https://github.com/ImageMagick/ImageMagick6/commit/086c8eebf8df72086f2370b1e5c9ec72becaf89a) +- Use the same typecast as in ImageMagick 7. [`d02e016`](https://github.com/ImageMagick/ImageMagick6/commit/d02e016daae2768e7abfc034c4b81d8fb3863617) +- pending release [`25aa96d`](https://github.com/ImageMagick/ImageMagick6/commit/25aa96dee935a052bd0b0893780bb5ea6bc4ecb4) +- pending release [`17d7b4b`](https://github.com/ImageMagick/ImageMagick6/commit/17d7b4bad2ca7fc7374164f1c40cb6f8282c4afb) +- pending release [`46762e1`](https://github.com/ImageMagick/ImageMagick6/commit/46762e1b539aba1bfc7f39f6027a23a7cf84d276) +- ... [`d259da5`](https://github.com/ImageMagick/ImageMagick6/commit/d259da5de84df842780e79b5994a8d95b16c488c) + +## [6.9.12-15](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-14...6.9.12-15) - 2021-06-12 + +### Commits + +- Corrected writing the icc profile in a PDF file. [`5a73bdc`](https://github.com/ImageMagick/ImageMagick6/commit/5a73bdcc68d2b1a1a14df1324e0178778f7b9030) +- Write the number of channels of the color profile instead of the image (#2070). [`af88978`](https://github.com/ImageMagick/ImageMagick6/commit/af88978d2d35a047e1d7daa5a24df69e032db65a) +- https://github.com/ImageMagick/ImageMagick/issues/3786 [`ed858f9`](https://github.com/ImageMagick/ImageMagick6/commit/ed858f9af9797ddd07c818c0c84cfe1121d7fd9b) +- ... [`ece4978`](https://github.com/ImageMagick/ImageMagick6/commit/ece4978c35d73eee4eda064b8f429a6ad42a3bec) +- https://github.com/ImageMagick/ImageMagick/discussions/3813 [`dabbe44`](https://github.com/ImageMagick/ImageMagick6/commit/dabbe4450429779f526b9eb3ba29df9ff0653689) +- https://github.com/ImageMagick/ImageMagick/issues/3765 [`a8c277e`](https://github.com/ImageMagick/ImageMagick6/commit/a8c277e07d1a0c92179f830e9399ee7b8cc15931) +- Fixed memory leak when it failed to apply ICC color profile [`1d4b8f4`](https://github.com/ImageMagick/ImageMagick6/commit/1d4b8f499985f5b576b53b7b478a9c5ab82116d1) +- ... [`637a850`](https://github.com/ImageMagick/ImageMagick6/commit/637a850cf7f3d87e35041b82ee6305503b996ea6) +- https://github.com/ImageMagick/ImageMagick/issues/3818 [`b21457a`](https://github.com/ImageMagick/ImageMagick6/commit/b21457a7eb9cb4c2f7c497b36a8efdab71beb4e6) +- When the compression is OJPEG the colorspace should not be changed to YCbCr. [`24fa0a8`](https://github.com/ImageMagick/ImageMagick6/commit/24fa0a82bdde4bec9d85ba9a59aebc5d83f17743) +- pending release [`15126f0`](https://github.com/ImageMagick/ImageMagick6/commit/15126f081300bac271947eb5dc21ecda6e85b070) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=35024 [`cde1733`](https://github.com/ImageMagick/ImageMagick6/commit/cde173361e901f957e56640fe03f59e78d92168b) +- https://github.com/ImageMagick/ImageMagick/issues/3818 [`4512ff0`](https://github.com/ImageMagick/ImageMagick6/commit/4512ff04e3bb51874129d4857734e235f52b974d) +- pending release [`f1893ff`](https://github.com/ImageMagick/ImageMagick6/commit/f1893ff113904f1062fbec74345e01fc708d0dba) + +## [6.9.12-14](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-12...6.9.12-14) - 2021-05-31 + +### Commits + +- update copyright [`e65639e`](https://github.com/ImageMagick/ImageMagick6/commit/e65639eace3619b600881c0722a9f5f28b2d0f46) +- ... [`14ea894`](https://github.com/ImageMagick/ImageMagick6/commit/14ea8946956a0b2be3c2c4acc73442ddfddee95a) +- ... [`abd606b`](https://github.com/ImageMagick/ImageMagick6/commit/abd606b33eae106296b660e047adfc1e933ef900) +- https://github.com/ImageMagick/ImageMagick/issues/3687 [`274d848`](https://github.com/ImageMagick/ImageMagick6/commit/274d8481b11054b0c15c3b118e0fd2bb57919119) +- Removed travis build. [`bdff671`](https://github.com/ImageMagick/ImageMagick6/commit/bdff671dc524e5faae69fa9dfe53b6af7d7d6ffc) +- update CSS [`502d738`](https://github.com/ImageMagick/ImageMagick6/commit/502d73855661295eec94519ea83a1c31a1804d1a) +- Always use a wildcard in NTOpenDirectory. [`8305ee3`](https://github.com/ImageMagick/ImageMagick6/commit/8305ee3125b1d6cb9e6fb6978fae5a6ee6cb19f6) +- Added missing status checks. [`7b2c55c`](https://github.com/ImageMagick/ImageMagick6/commit/7b2c55c2280323956b7c70909775fc81cecf98bd) +- The path should not end in a backslash according to the MSDN documentation. [`8533847`](https://github.com/ImageMagick/ImageMagick6/commit/8533847ff7cfd9fb7de549d383179a65a7019ae9) +- ... [`e53f1fd`](https://github.com/ImageMagick/ImageMagick6/commit/e53f1fd02a97f521c4b26faf439b7b4bb55af58c) +- ... [`a792ea6`](https://github.com/ImageMagick/ImageMagick6/commit/a792ea62e0d72b86c2bb8502dec17f6e6d15c227) +- https://github.com/ImageMagick/ImageMagick/issues/3653 [`8e9b75e`](https://github.com/ImageMagick/ImageMagick6/commit/8e9b75ea13bf007724d5e6dd5625f9af7d6098fa) +- ... [`5e392ec`](https://github.com/ImageMagick/ImageMagick6/commit/5e392ec12363fdfd8fe9b5d98bbead89f560dd78) +- Fixed reading and writing the XMP chunk in a WebP image. [`62b736a`](https://github.com/ImageMagick/ImageMagick6/commit/62b736a9a6d7e736fabaaf728c8ecaaacadc2c7d) +- https://github.com/ImageMagick/ImageMagick/issues/3676 [`9d8e861`](https://github.com/ImageMagick/ImageMagick6/commit/9d8e86156f0f2c949623bfbd5c78d6c89a7c5467) +- Removed unused variable. [`5b44db7`](https://github.com/ImageMagick/ImageMagick6/commit/5b44db70ca28b8f88ab5f9104570e85c4e16e74f) +- https://github.com/ImageMagick/ImageMagick/pull/3749 [`6ba4b42`](https://github.com/ImageMagick/ImageMagick6/commit/6ba4b42dc9269f301952c1ec2dd0fb782834e00d) +- https://github.com/ImageMagick/ImageMagick/discussions/3583 [`d780ce0`](https://github.com/ImageMagick/ImageMagick6/commit/d780ce0a931d809e4452b7b3c8181806baeb1e8c) +- ... [`1b85287`](https://github.com/ImageMagick/ImageMagick6/commit/1b85287582cd72bcb128800d50878dd33a37ae65) +- pending release [`6f1745f`](https://github.com/ImageMagick/ImageMagick6/commit/6f1745f5d593df4c3b98ec763c6b690abc1dec97) +- pending release [`f4efad9`](https://github.com/ImageMagick/ImageMagick6/commit/f4efad954ad505c71d17fa40f94af691d1492555) +- Silence mingw warnings. [`a4ec89d`](https://github.com/ImageMagick/ImageMagick6/commit/a4ec89d233d6d5e03d558b14989322db7ec5f413) +- pending release [`7f8bf2f`](https://github.com/ImageMagick/ImageMagick6/commit/7f8bf2fe0325f577ab518fda227d068237065ac6) +- The image type should not be changed when the image already has the correct type. [`8f74220`](https://github.com/ImageMagick/ImageMagick6/commit/8f74220f4f1dfdb0841f055402f19e219348af56) +- NULL color name is acceptable [`d5a3cf7`](https://github.com/ImageMagick/ImageMagick6/commit/d5a3cf7270d1ef509ef61a55f51e33c1e894854b) +- https://github.com/ImageMagick/ImageMagick/pull/3749 [`3233cab`](https://github.com/ImageMagick/ImageMagick6/commit/3233cab9b2a623626fe6d414b49dbe1a5b732a2d) +- ... [`c75ae77`](https://github.com/ImageMagick/ImageMagick6/commit/c75ae771a00c38b757c5ef4b424b51e761b02552) +- pending release [`8947663`](https://github.com/ImageMagick/ImageMagick6/commit/89476634dafdafdf86573f75c6a34743d5805641) +- https://github.com/ImageMagick/ImageMagick/issues/3690 [`2f1c004`](https://github.com/ImageMagick/ImageMagick6/commit/2f1c00490617ce067d8319866c8022411d17f2a4) +- eliminate heap buffer overflow vulnerability, thanks to ZhangJiaxing (@r0fm1a) from Codesafe Team of Legendsec at Qi'anxin Group [`b307bca`](https://github.com/ImageMagick/ImageMagick6/commit/b307bcadcdf6ea6819951ac1786b7904f27b25c6) +- Moved definition of the define to this header file. [`5e2af4c`](https://github.com/ImageMagick/ImageMagick6/commit/5e2af4c542d0fee760eb9e2e0e3acd333156da0f) +- https://github.com/ImageMagick/ImageMagick/pull/3685/ [`2ac82aa`](https://github.com/ImageMagick/ImageMagick6/commit/2ac82aa7f502c779cbabd7f7c06d39eedcbfb042) + +## [6.9.12-12](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-11...6.9.12-12) - 2021-05-09 + +### Commits + +- improve exception testing [`94026fb`](https://github.com/ImageMagick/ImageMagick6/commit/94026fbfb045d27576799d84ee63320ba7cbc7aa) +- https://github.com/ImageMagick/ImageMagick/issues/3520 [`ed78be2`](https://github.com/ImageMagick/ImageMagick6/commit/ed78be2e62accb8ac0747fd2a72c9c52758b2f3a) +- support dither:diffusion-amount define for Riemersma dithering [`0d0f402`](https://github.com/ImageMagick/ImageMagick6/commit/0d0f402452dda40667926548882d18d2d336e141) +- ... [`5ec7ae6`](https://github.com/ImageMagick/ImageMagick6/commit/5ec7ae6d969667bb78d238649dd422e8f8441436) +- ... [`dd9b62d`](https://github.com/ImageMagick/ImageMagick6/commit/dd9b62d7ca80ffe5eebb34befc727ab3e59dc10b) +- https://github.com/ImageMagick/ImageMagick/issues/3520 [`8aa401e`](https://github.com/ImageMagick/ImageMagick6/commit/8aa401e00e229f0cb55ac733b9aa03c8bab884f5) +- pending release [`0d11539`](https://github.com/ImageMagick/ImageMagick6/commit/0d11539c266133971246eb2d0d49e626a43bcdf0) +- ... [`a5fec66`](https://github.com/ImageMagick/ImageMagick6/commit/a5fec668b59d0a725d96d56fae1b4864073f5b86) + +## [6.9.12-11](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-10...6.9.12-11) - 2021-05-04 + +### Commits + +- ... [`c46cd9f`](https://github.com/ImageMagick/ImageMagick6/commit/c46cd9fe551b567fb7b40bba052d3502d00f0f30) +- Replace tabs with spaces. [`b9d006e`](https://github.com/ImageMagick/ImageMagick6/commit/b9d006e0089fad6afab71528d34f00aa401e4023) +- Generate threshold-map.h instead. [`d4c3361`](https://github.com/ImageMagick/ImageMagick6/commit/d4c33614def7874b55607238f8fd83c8bbddea48) +- Add full threshold map [`c9753f9`](https://github.com/ImageMagick/ImageMagick6/commit/c9753f9113014a3d0283e8e4332447e7d1e5ed52) +- improve method name [`5d112e0`](https://github.com/ImageMagick/ImageMagick6/commit/5d112e0673ccc6f1632f6ff63c62d5a0bf6225e7) +- ... [`2316ca6`](https://github.com/ImageMagick/ImageMagick6/commit/2316ca67f6a6997b131aef292d33a1c38ee5cccf) +- ... [`3df3254`](https://github.com/ImageMagick/ImageMagick6/commit/3df32542e617b7df3291dded38a4825e926d8335) +- Use ExceptionInfo instead of letting libraw print to stderr. [`8462661`](https://github.com/ImageMagick/ImageMagick6/commit/8462661321389bab113b76bc74e0c27448914792) +- Corrected check in the TIFF decoder. [`a260de2`](https://github.com/ImageMagick/ImageMagick6/commit/a260de22e0676d0497ff780f0ccdbb795c05141b) +- https://github.com/ImageMagick/ImageMagick/issues/3520 [`caee165`](https://github.com/ImageMagick/ImageMagick6/commit/caee16574b1cce8f45cf01f63ea7a8988cbfe5fd) +- revert comments [`7d8a3b7`](https://github.com/ImageMagick/ImageMagick6/commit/7d8a3b762f3a9b1171d904da52293fe43cd8e0cb) +- pending release [`1ba0774`](https://github.com/ImageMagick/ImageMagick6/commit/1ba077420bd1a69c5dd5daed2c4a8736240ef256) +- ... [`e670f7f`](https://github.com/ImageMagick/ImageMagick6/commit/e670f7fc527eafe79134eb81786179f1760d9ec7) +- fix Makefile separator exception [`0d00ae7`](https://github.com/ImageMagick/ImageMagick6/commit/0d00ae7e3afb9e5022bb00ba042b5e5ee71c6bc3) +- https://github.com/ImageMagick/ImageMagick/issues/3468 [`5c22ac6`](https://github.com/ImageMagick/ImageMagick6/commit/5c22ac68a5077995db1ce40ddf37ea6ba14e3e29) +- Use magick instead of MagickCore. [`38f6779`](https://github.com/ImageMagick/ImageMagick6/commit/38f67793a6c37263e4aaffd8b9ef3c2510859836) +- Another attempt. [`816071e`](https://github.com/ImageMagick/ImageMagick6/commit/816071e70ea0dff2ec939dcb8a6b818f25e83d4f) +- fix names [`fbb8139`](https://github.com/ImageMagick/ImageMagick6/commit/fbb8139444e7d2debede07ceec91295243fb7619) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=33831 [`307f11e`](https://github.com/ImageMagick/ImageMagick6/commit/307f11e997b452a2a0a24abcf52eff16f4e11119) +- cosmetic [`f944c0e`](https://github.com/ImageMagick/ImageMagick6/commit/f944c0efc98c5c6f7d6858666d6e3b207ad73e03) +- Corrected typo. [`3d0d0e0`](https://github.com/ImageMagick/ImageMagick6/commit/3d0d0e0564339cf93da53852fa50005b55890e87) +- ... [`b3f69a1`](https://github.com/ImageMagick/ImageMagick6/commit/b3f69a17a508788164a973ed8b9f10264b776f8b) +- pending release [`930161d`](https://github.com/ImageMagick/ImageMagick6/commit/930161d603e2b65f363a10ba142e2ac732e28302) + +## [6.9.12-10](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-9...6.9.12-10) - 2021-04-28 + +### Merged + +- Fix line endings in Geometry.h to LF. [`#149`](https://github.com/ImageMagick/ImageMagick6/pull/149) +- Fix incorrect client_data pointer being set in libjpeg context. [`#152`](https://github.com/ImageMagick/ImageMagick6/pull/152) + +### Fixed + +- Fix incorrect client_data pointer being set in libjpeg context. (#152) [`#150`](https://github.com/ImageMagick/ImageMagick6/issues/150) [`#151`](https://github.com/ImageMagick/ImageMagick6/issues/151) + +### Commits + +- ... [`c770f50`](https://github.com/ImageMagick/ImageMagick6/commit/c770f508dea2e72791845e745696092f3e794a58) +- check image is not NULL before dereferencing [`5ee7e3e`](https://github.com/ImageMagick/ImageMagick6/commit/5ee7e3eae5a0f4c06969c5b99a0a605901c0eac1) +- ... [`99cbc9f`](https://github.com/ImageMagick/ImageMagick6/commit/99cbc9f2542b9857c8abe580870b2b7a59e60731) +- pending release [`fea001e`](https://github.com/ImageMagick/ImageMagick6/commit/fea001e31a471c1e6605aa6e6ae97fb554a0e784) +- pending release [`370ce4c`](https://github.com/ImageMagick/ImageMagick6/commit/370ce4c7e2f6c04a672ca0b5ebb05acb490e31e9) + +## [6.9.12-9](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-8...6.9.12-9) - 2021-04-24 + +### Commits + +- cosmetic [`3832fa1`](https://github.com/ImageMagick/ImageMagick6/commit/3832fa11c51785a611e7a7cc9c57073221ed7833) +- ... [`878f631`](https://github.com/ImageMagick/ImageMagick6/commit/878f6315caa7d8b9f0c616147e71a2f2b25b1756) +- cosmetic [`47e1eab`](https://github.com/ImageMagick/ImageMagick6/commit/47e1eabbc7736a08aed1ec225a07357f65d19ede) +- ... [`99b82fe`](https://github.com/ImageMagick/ImageMagick6/commit/99b82feded146a666b808c977db248c0e78bc757) +- https://github.com/ImageMagick/ImageMagick/issues/3571 [`68a0f3f`](https://github.com/ImageMagick/ImageMagick6/commit/68a0f3f8b8e90190c78bc65403fc81192fb3da59) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=33466 [`6cf7fd8`](https://github.com/ImageMagick/ImageMagick6/commit/6cf7fd8e84aedcdfb125120b230f5a1dcf781169) +- ... [`181125f`](https://github.com/ImageMagick/ImageMagick6/commit/181125f67ecf9ac57adef1db861181d8d6adbe70) +- ... [`969b02d`](https://github.com/ImageMagick/ImageMagick6/commit/969b02d7a66e0d74a5290183e334995586e4a3dd) +- Corrected ChangeLog. [`165f89f`](https://github.com/ImageMagick/ImageMagick6/commit/165f89f5c3cdd05a49c08c001187c8ccfb5d6e58) +- ... [`fb64736`](https://github.com/ImageMagick/ImageMagick6/commit/fb647360465898972581c5a44d92f05040c61bbf) +- pending release [`e9740ab`](https://github.com/ImageMagick/ImageMagick6/commit/e9740ab2ea9ce835003966551ceebcae4ce16ff1) +- ... [`6fd9c48`](https://github.com/ImageMagick/ImageMagick6/commit/6fd9c48d18522fc739988c635b4f230f5a9553a9) +- Corrected typo. [`c8c3cf8`](https://github.com/ImageMagick/ImageMagick6/commit/c8c3cf8a1d7f93de7127606e5ccc0f2068216322) + +## [6.9.12-8](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-7...6.9.12-8) - 2021-04-17 + +### Commits + +- latest automake/autoconf [`1fb5916`](https://github.com/ImageMagick/ImageMagick6/commit/1fb5916a9010c993a6e77613310828e950c8959f) +- ... [`24030ed`](https://github.com/ImageMagick/ImageMagick6/commit/24030ed4a3009bac808989e4142942074308bd33) +- https://github.com/ImageMagick/ImageMagick/issues/3549 [`0962d40`](https://github.com/ImageMagick/ImageMagick6/commit/0962d402b0af0d31d7267bb82f5460c53c54518e) +- https://github.com/ImageMagick/ImageMagick/issues/3520 [`0fcebd3`](https://github.com/ImageMagick/ImageMagick6/commit/0fcebd3e7a382830a8e56b98b3f67e06b4beadb3) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=33350 [`0eccd35`](https://github.com/ImageMagick/ImageMagick6/commit/0eccd3556a8c456239a49f9064381ddc3e28476e) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=33232 [`e699f55`](https://github.com/ImageMagick/ImageMagick6/commit/e699f559dfa912cf979893ab2cde9a0695218c30) +- https://github.com/ImageMagick/ImageMagick/issues/3540 [`cd7f9fb`](https://github.com/ImageMagick/ImageMagick6/commit/cd7f9fb7751b0d59d5a74b12d971155caad5a792) +- pending release [`e65db11`](https://github.com/ImageMagick/ImageMagick6/commit/e65db11090a270d7200adac080f623a7e75b1e96) +- pending release [`e06e7ff`](https://github.com/ImageMagick/ImageMagick6/commit/e06e7ffbf1fa16039754558eac75a917bd827393) +- https://github.com/ImageMagick/ImageMagick/issues/3537 [`5b0acdb`](https://github.com/ImageMagick/ImageMagick6/commit/5b0acdb5047fd322ea9ba3cbf7fe0718e3cda0af) +- write tiff colormapped images with an alpha channel as PHOTOMETRIC_RGB [`270494f`](https://github.com/ImageMagick/ImageMagick6/commit/270494f4ba392f230b2e816667416e5ac638e275) + +## [6.9.12-7](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-6...6.9.12-7) - 2021-04-11 + +### Merged + +- fix perl syntax [`#144`](https://github.com/ImageMagick/ImageMagick6/pull/144) + +### Commits + +- ... [`b9a79ba`](https://github.com/ImageMagick/ImageMagick6/commit/b9a79ba19226ea0d5f81b61bb06b4b84f1bb7bcd) +- add a nonce to the signature generation [`d9600ec`](https://github.com/ImageMagick/ImageMagick6/commit/d9600ec25644b74d8be1bd432f280b2467c5e175) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=33137 [`d94de13`](https://github.com/ImageMagick/ImageMagick6/commit/d94de132dce98a02dce3451dfc014d2286fa0d43) +- constrain sub-image list [`c4392ae`](https://github.com/ImageMagick/ImageMagick6/commit/c4392aee303fba6d5e813f8c2ae1b67c19b438cb) +- https://github.com/ImageMagick/ImageMagick/issues/3520 [`bec4e2d`](https://github.com/ImageMagick/ImageMagick6/commit/bec4e2dabf96dd93ef0ca7bb384521acdcb4be1e) +- https://github.com/ImageMagick/ImageMagick/issues/3520 [`d4f04b4`](https://github.com/ImageMagick/ImageMagick6/commit/d4f04b4dfb783996b8f48c28d64c04ca8b8cd542) +- revert patch [`3415a1d`](https://github.com/ImageMagick/ImageMagick6/commit/3415a1db1c4dfd8dc096f45c80f647e047da0cd8) +- pending release [`e183af8`](https://github.com/ImageMagick/ImageMagick6/commit/e183af8ec3d8ce2d36e55beda63535052ff429ed) +- ... [`e3ad231`](https://github.com/ImageMagick/ImageMagick6/commit/e3ad2313517d78a96b5bcfce1cd4ce37c9df8dba) +- https://github.com/ImageMagick/ImageMagick6/security/code-scanning/5?query=ref%3Arefs%2Fheads%2Fmain [`822e476`](https://github.com/ImageMagick/ImageMagick6/commit/822e4768034198ff0bcc41b551462295ca5baec6) +- https://github.com/ImageMagick/ImageMagick6/issues/145 [`bc7f4f5`](https://github.com/ImageMagick/ImageMagick6/commit/bc7f4f54206f2053a45959e07704c7fc657e07aa) +- ... [`0dbacf8`](https://github.com/ImageMagick/ImageMagick6/commit/0dbacf8c67e2788f3d13b6d9b442b72bfad2d055) +- https://github.com/ImageMagick/ImageMagick/issues/3520 [`4c0a1d5`](https://github.com/ImageMagick/ImageMagick6/commit/4c0a1d5b7a230b84e2d420c592ce7bc355ebd785) +- pending release [`8608fb1`](https://github.com/ImageMagick/ImageMagick6/commit/8608fb14228480364cda4080c1b2d3ed118d8b8d) +- https://github.com/ImageMagick/ImageMagick/issues/3469 [`75c05e1`](https://github.com/ImageMagick/ImageMagick6/commit/75c05e1a2b1763712a6d9ca9de237c0d9198647e) +- https://github.com/ImageMagick/ImageMagick/issues/3469 [`89f9691`](https://github.com/ImageMagick/ImageMagick6/commit/89f9691ab4fdfbb8cacbe6718a0e3b911982b0ff) +- pending release [`a14972b`](https://github.com/ImageMagick/ImageMagick6/commit/a14972b0323163a8a41e4e34213da2b277bce372) +- pending release [`b37dd2c`](https://github.com/ImageMagick/ImageMagick6/commit/b37dd2c732634c98c0beef253f3e03216cdb3fc0) + +## [6.9.12-6](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-5...6.9.12-6) - 2021-04-03 + +### Commits + +- ... [`312df44`](https://github.com/ImageMagick/ImageMagick6/commit/312df44858c91c2b43c07f7bd7b61cea7332d31f) +- revert patch [`7703d3b`](https://github.com/ImageMagick/ImageMagick6/commit/7703d3b2c13e56cc7fe7ca004228e4e2d9b8067f) +- prevent undefined-behavior issue reported by Hardik [`798838f`](https://github.com/ImageMagick/ImageMagick6/commit/798838f31c0112c10491bf2cf2a4d084be90e26f) +- ... [`f2a5d86`](https://github.com/ImageMagick/ImageMagick6/commit/f2a5d8646472e4bc5cd0a18546db0a29d3b7795c) +- pending release [`328bd1a`](https://github.com/ImageMagick/ImageMagick6/commit/328bd1a082a497239938910b4bff8b9bcc2cf768) +- pending release [`0f40ca2`](https://github.com/ImageMagick/ImageMagick6/commit/0f40ca207b30abfdd9e7c8868e6005c137c032b7) +- https://github.com/ImageMagick/ImageMagick/security/code-scanning/30 [`cbc076e`](https://github.com/ImageMagick/ImageMagick6/commit/cbc076e95697faed2cfb1abcd60693b859135330) +- ... [`6c4bc78`](https://github.com/ImageMagick/ImageMagick6/commit/6c4bc786e900ef6ac08483d1cbe963ed3210eddf) +- Added missing null check. [`3f8f861`](https://github.com/ImageMagick/ImageMagick6/commit/3f8f8611b5cc7ba945eacc17ad801840b423c2c6) +- https://github.com/ImageMagick/ImageMagick/issues/3469 [`fbecaf0`](https://github.com/ImageMagick/ImageMagick6/commit/fbecaf01e52c45465d2cfad8272bc578e469c953) +- pending release [`fd23993`](https://github.com/ImageMagick/ImageMagick6/commit/fd23993f35fbfb48353bdcf16da1767f13eb4e71) +- https://github.com/ImageMagick/ImageMagick/issues/3469 [`f8e4322`](https://github.com/ImageMagick/ImageMagick6/commit/f8e4322d169b0db00ca438c68bed0f4b5c5cabb5) +- pending release [`7aab092`](https://github.com/ImageMagick/ImageMagick6/commit/7aab092ac4e77ec6d96fcfe74c53eaf3e6cf159d) +- pending release [`0e74340`](https://github.com/ImageMagick/ImageMagick6/commit/0e74340c0adaa4370e971079c654fe405b57e607) + +## [6.9.12-5](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-4...6.9.12-5) - 2021-03-28 + +### Commits + +- https://github.com/ImageMagick/ImageMagick/issues/3428 [`4f47d5f`](https://github.com/ImageMagick/ImageMagick6/commit/4f47d5f43e7a776cb615433867945f86a556ae51) +- ... [`9a4bc34`](https://github.com/ImageMagick/ImageMagick6/commit/9a4bc34b4b985e7cf604dc58691e64c576d8c3bd) +- eliminate C++ compile exception [`adda0fe`](https://github.com/ImageMagick/ImageMagick6/commit/adda0fe816d5098691aeec1b690d5178d4fe2a17) +- fix handling of non-square images with -fft option [`ffa0d49`](https://github.com/ImageMagick/ImageMagick6/commit/ffa0d49a7556be8f5e9ebf9c14096e5a6102bff8) +- Disable OpenCL by default. [`9a5b074`](https://github.com/ImageMagick/ImageMagick6/commit/9a5b07493a639c063caaac334b2e664c2484df7d) +- latest beta release [`4981820`](https://github.com/ImageMagick/ImageMagick6/commit/498182048b243c1a20891edb69545832c8d17d80) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=32322 [`c8f2595`](https://github.com/ImageMagick/ImageMagick6/commit/c8f25953ad1dd38a8b2d92738f0f742ad7e0bce7) +- ... [`3e34aa8`](https://github.com/ImageMagick/ImageMagick6/commit/3e34aa8bdf295e0a9d1630eab6c45cbdc2d90d4f) +- pending release [`8dc8e09`](https://github.com/ImageMagick/ImageMagick6/commit/8dc8e090e29c15161de42b62935b706a11e53477) +- Throw exception when no exception was raised but status was false (#3432). [`512668d`](https://github.com/ImageMagick/ImageMagick6/commit/512668dfd92b20d0d08b91d62b422d8262573281) +- fix c++ compiler exception [`0ec46fc`](https://github.com/ImageMagick/ImageMagick6/commit/0ec46fc805a5e7a4056b9614c7a994bfb39e53b0) +- eliminate compiler warning [`6a5d357`](https://github.com/ImageMagick/ImageMagick6/commit/6a5d3575487487f2703383338bd17c8c25068f19) +- pending release [`0be2e6a`](https://github.com/ImageMagick/ImageMagick6/commit/0be2e6a5063613c1ed795a863916ccc4481514ce) + +## [6.9.12-4](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-3...6.9.12-4) - 2021-03-20 + +### Commits + +- ... [`8a98e9f`](https://github.com/ImageMagick/ImageMagick6/commit/8a98e9ff9ee7455551aff6981b5d8503c507bfbc) +- ... [`b7ed95d`](https://github.com/ImageMagick/ImageMagick6/commit/b7ed95d47f9a22fac2ab45769d7144fa988429ed) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=31872 [`2a56e44`](https://github.com/ImageMagick/ImageMagick6/commit/2a56e447a4a60a4b89fc8be0410a6db39d5e3de3) +- ... [`06d7298`](https://github.com/ImageMagick/ImageMagick6/commit/06d729858570caa124a24887cf723fe9679881d4) +- ... [`b13e1a8`](https://github.com/ImageMagick/ImageMagick6/commit/b13e1a86fdfc92aa7aa04bedbfa2e43f8c216667) +- pending release [`9b40562`](https://github.com/ImageMagick/ImageMagick6/commit/9b405621909fa2e67170178f795a115ddbe9e1db) +- ... [`fa69ed6`](https://github.com/ImageMagick/ImageMagick6/commit/fa69ed6f43ca120d9dfb5570330602de6badcf90) +- ... [`21991f7`](https://github.com/ImageMagick/ImageMagick6/commit/21991f726e6a7505bf14f593033cc75533c8b783) +- https://github.com/ImageMagick/ImageMagick/discussions/3389 [`df6b526`](https://github.com/ImageMagick/ImageMagick6/commit/df6b5268be37616ab479b833fa78951a3bd4e8a1) +- ... [`2204eb5`](https://github.com/ImageMagick/ImageMagick6/commit/2204eb57ae00b005b39165a47b8984eac01600a5) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=28891 [`f940ecb`](https://github.com/ImageMagick/ImageMagick6/commit/f940ecb921b7ab83da320334349f0cde1ff7f3e6) +- avoid omp deadlock [`99ac197`](https://github.com/ImageMagick/ImageMagick6/commit/99ac1977da0883b78cd4e9b763f267e8bce389e8) +- pending release [`4ef5c73`](https://github.com/ImageMagick/ImageMagick6/commit/4ef5c73c83203e93b60a092e3bc74697a3310c7f) +- ... [`6d5f5d8`](https://github.com/ImageMagick/ImageMagick6/commit/6d5f5d8892fa316aad710521792d23fc7c783734) + +## [6.9.12-3](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-2...6.9.12-3) - 2021-03-06 + +### Commits + +- ... [`0370b8e`](https://github.com/ImageMagick/ImageMagick6/commit/0370b8e16fd3d7900005040d1663d676268ab1b3) +- https://github.com/ImageMagick/ImageMagick/issues/3332 [`072d7b1`](https://github.com/ImageMagick/ImageMagick6/commit/072d7b10dbe74d1cf4ec0d008990c1a28c076f9e) +- https://github.com/ImageMagick/ImageMagick/issues/3334 [`1b3585f`](https://github.com/ImageMagick/ImageMagick6/commit/1b3585fb7adb4ced6609d58ce9c9feb43dffeaaf) +- ... [`c51b249`](https://github.com/ImageMagick/ImageMagick6/commit/c51b2495fcfddc4b77908e2034ca1877c3b4a8bf) +- pending release [`4a83315`](https://github.com/ImageMagick/ImageMagick6/commit/4a833158dd16e127e3ca042baed6b449630ec5e2) +- https://github.com/ImageMagick/ImageMagick/issues/3331 [`4eafab8`](https://github.com/ImageMagick/ImageMagick6/commit/4eafab89a2742865d770857a9d7434993f65ae6b) +- slight adjustment to D65 illuminant [`1df11cf`](https://github.com/ImageMagick/ImageMagick6/commit/1df11cf4efb748e55d7366f46c6e3a847a742487) +- https://github.com/ImageMagick/ImageMagick/issues/3340 [`448f927`](https://github.com/ImageMagick/ImageMagick6/commit/448f9271ef479569fc46583b9aa4ddc5c962d867) +- https://github.com/ImageMagick/ImageMagick/issues/3333 [`366c970`](https://github.com/ImageMagick/ImageMagick6/commit/366c9708a7ca1256ee03d0d4addb2690ed42273f) +- ... [`aa77b65`](https://github.com/ImageMagick/ImageMagick6/commit/aa77b657b123bf92843f96c610b85e1a389e8226) +- https://github.com/ImageMagick/ImageMagick/issues/3337 [`4bf64fd`](https://github.com/ImageMagick/ImageMagick6/commit/4bf64fdd786728f372e8a701a663caa2774e7a23) +- ... [`522b4a3`](https://github.com/ImageMagick/ImageMagick6/commit/522b4a3e5bd272873cdc81aa5fdffdc4c520d588) +- https://github.com/ImageMagick/ImageMagick/issues/3335 [`ad492c7`](https://github.com/ImageMagick/ImageMagick6/commit/ad492c7ed4cf1cf285a7f6e2ee5a1e7cf24e73b2) +- https://github.com/ImageMagick/ImageMagick/issues/3336 [`5d33b8d`](https://github.com/ImageMagick/ImageMagick6/commit/5d33b8df73b0b1e40ee3fb7a334d28d929ae903c) +- ... [`c498edc`](https://github.com/ImageMagick/ImageMagick6/commit/c498edcef55dea47d6c3c4f2636c467343299ec2) +- https://github.com/ImageMagick/ImageMagick/issues/3338 [`4b5e026`](https://github.com/ImageMagick/ImageMagick6/commit/4b5e026c704d777efe9c2ead5dd68ca4fe3b2aa1) +- https://github.com/ImageMagick/ImageMagick/issues/3339 [`9a94877`](https://github.com/ImageMagick/ImageMagick6/commit/9a94877f7823b0b8a41d50638dd105229d91fa89) + +## [6.9.12-2](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-1...6.9.12-2) - 2021-02-27 + +### Commits + +- ... [`c8d0040`](https://github.com/ImageMagick/ImageMagick6/commit/c8d0040f8505ee16266dd57b3abda80d7f19fead) +- possible divide by zero + clear buffers [`e53e24b`](https://github.com/ImageMagick/ImageMagick6/commit/e53e24b078f7fa586f9cc910491b8910f5bdad2e) +- ... [`d945f43`](https://github.com/ImageMagick/ImageMagick6/commit/d945f43d0a103ec4af50816aab54ab3d3b574543) +- check that image exists before we destroy it [`3418473`](https://github.com/ImageMagick/ImageMagick6/commit/34184739956fd739735d364ec5b15c2ee89568cf) +- https://github.com/ImageMagick/ImageMagick/issues/3317 [`bbb2dff`](https://github.com/ImageMagick/ImageMagick6/commit/bbb2dff98d0e97a0fe3f7e187855476c4590eed2) +- https://github.com/ImageMagick/ImageMagick/issues/3297 [`841138c`](https://github.com/ImageMagick/ImageMagick6/commit/841138cc282722a80e06977d683405a0cf1d78ef) +- cosmetic [`63d4768`](https://github.com/ImageMagick/ImageMagick6/commit/63d47686efceeeb4ee68daa01614aab76eecf07c) +- https://github.com/ImageMagick/ImageMagick/issues/3321 [`64c0cc2`](https://github.com/ImageMagick/ImageMagick6/commit/64c0cc234280544dabacc2b28017521851deebde) +- pending release [`309cf43`](https://github.com/ImageMagick/ImageMagick6/commit/309cf4397c0d3d9963af04aa9a56fe406446c656) +- pending release [`a9c2639`](https://github.com/ImageMagick/ImageMagick6/commit/a9c26392e18cf38d50621ab1719539cb7bf79a61) +- fix compiler exception [`2e0bf51`](https://github.com/ImageMagick/ImageMagick6/commit/2e0bf51d81f5b9e5669699ace345330270991d00) +- pending release [`627cbd7`](https://github.com/ImageMagick/ImageMagick6/commit/627cbd7ea1e15ea2c9c0b7789e71b4e3a4aba962) +- pending release [`588d323`](https://github.com/ImageMagick/ImageMagick6/commit/588d3230ca82c14f2de6e1e894311d9d4fcdb05d) +- pending release [`c5e7a8b`](https://github.com/ImageMagick/ImageMagick6/commit/c5e7a8bbe66dd101d81f2bb16be232bfdb2d6d45) +- https://github.com/ImageMagick/ImageMagick/issues/3296 [`f1e68d2`](https://github.com/ImageMagick/ImageMagick6/commit/f1e68d22d1b35459421710587a0dcbab6900b51f) +- pending release [`7d56434`](https://github.com/ImageMagick/ImageMagick6/commit/7d564341fe48bcab733188573e0e7d41674ad80c) +- ... [`4c08b0d`](https://github.com/ImageMagick/ImageMagick6/commit/4c08b0d598c753b5e0e5cc99be5c47c62323c6e0) +- https://github.com/ImageMagick/ImageMagick/issues/3320 [`b365302`](https://github.com/ImageMagick/ImageMagick6/commit/b3653027e9dc93d03917db602b83d15e70fee575) +- pending release [`abad074`](https://github.com/ImageMagick/ImageMagick6/commit/abad074de78b7a71afe8785b046885e0d16d75ce) +- pending release [`eb69a8a`](https://github.com/ImageMagick/ImageMagick6/commit/eb69a8adc86a9b6a43d81f39b20a33f6a74d0013) + +## [6.9.12-1](https://github.com/ImageMagick/ImageMagick6/compare/6.9.12-0...6.9.12-1) - 2021-02-21 + +### Commits + +- ... [`ea03af8`](https://github.com/ImageMagick/ImageMagick6/commit/ea03af8be5183f7a2fda2afad06e4e9a0a75893b) +- ... [`7854805`](https://github.com/ImageMagick/ImageMagick6/commit/7854805a0e012213dad5b813e0de78799348f255) +- ... [`268dc9f`](https://github.com/ImageMagick/ImageMagick6/commit/268dc9f87749044cc2de2e384128e6a4aed06669) +- https://github.com/ImageMagick/ImageMagick/issues/3258 [`d285259`](https://github.com/ImageMagick/ImageMagick6/commit/d2852597c575cad62a65ed6edeeb8f5a36077add) +- ... [`f27cfb1`](https://github.com/ImageMagick/ImageMagick6/commit/f27cfb112338057f8fac5d6b016b3c69fb119b84) +- pending release [`05fc76c`](https://github.com/ImageMagick/ImageMagick6/commit/05fc76c3de140ab0ee5438b6be2d52bd5d8c323a) +- https://github.com/ImageMagick/ImageMagick/issues/3259 [`e6a300e`](https://github.com/ImageMagick/ImageMagick6/commit/e6a300ef2da27bcf767fdc9f43aea9bb73054b33) +- https://github.com/ImageMagick/ImageMagick/pull/3241 [`a19d95d`](https://github.com/ImageMagick/ImageMagick6/commit/a19d95d36f92b4266364fa6bbcea3e2cc0da712d) +- https://github.com/ImageMagick/ImageMagick/issues/3242 [`68ce241`](https://github.com/ImageMagick/ImageMagick6/commit/68ce2418726f566e43624f2ef1906d86746c8c2e) +- ... [`90510e0`](https://github.com/ImageMagick/ImageMagick6/commit/90510e0d208d498650ff6400fd405bdf1711e082) + +## [6.9.12-0](https://github.com/ImageMagick/ImageMagick6/compare/6.9.11-62...6.9.12-0) - 2021-02-13 + +### Commits + +- update docs [`dab48ba`](https://github.com/ImageMagick/ImageMagick6/commit/dab48bafd2924a7349df9bdc1ce8c36fab893bc2) +- bump minor release [`9f1d23f`](https://github.com/ImageMagick/ImageMagick6/commit/9f1d23fa325165a3426ba401b552e65397384e96) +- ... [`5d2e553`](https://github.com/ImageMagick/ImageMagick6/commit/5d2e553ff197322676b36c32da7079d2f6e41633) +- ... [`efb5ce8`](https://github.com/ImageMagick/ImageMagick6/commit/efb5ce8710604e7b86014a70e91d0372a3930b5b) +- ... [`d886aa5`](https://github.com/ImageMagick/ImageMagick6/commit/d886aa509b6258e5312d28d4c106803491f31d92) +- ... [`dfd1d7f`](https://github.com/ImageMagick/ImageMagick6/commit/dfd1d7f43c68c4449a1e8666ea6087ff4ff17a05) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=30839 [`6f604e9`](https://github.com/ImageMagick/ImageMagick6/commit/6f604e9cc06ea1291b6932fa7786c3a01306c424) +- ... [`0824c17`](https://github.com/ImageMagick/ImageMagick6/commit/0824c17ef4405641322bab4c9d717a30b6c80162) +- cosmetic [`c8922ae`](https://github.com/ImageMagick/ImageMagick6/commit/c8922ae40e995f93654eeeeb90266867e4a00154) +- ... [`37d7edf`](https://github.com/ImageMagick/ImageMagick6/commit/37d7edfc6b4f7270a9539c14541a7d1d7358b6f2) +- pending release [`769536d`](https://github.com/ImageMagick/ImageMagick6/commit/769536d06c3dc2171aac1ddd36a01edfa16b1977) +- https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=30896 [`b322ab0`](https://github.com/ImageMagick/ImageMagick6/commit/b322ab0074a86cc62073a2b577ef21907f3111d7) diff --git a/ImageMagick-6.9.12-44/ImageMagick.spec.in b/ImageMagick-6.9.12-44/ImageMagick.spec.in new file mode 100644 index 0000000..f97ce24 --- /dev/null +++ b/ImageMagick-6.9.12-44/ImageMagick.spec.in @@ -0,0 +1,295 @@ +%global VERSION @PACKAGE_BASE_VERSION@ +%global Patchlevel @MAGICK_PATCHLEVEL_VERSION@ + +Name: @PACKAGE_NAME@ +Version: %{VERSION} +Release: %{Patchlevel} +Summary: Use ImageMagick to convert, edit, or compose bitmap images in a variety of formats. In addition resize, rotate, shear, distort and transform images. +License: https://imagemagick.org/script/license.php +Url: https://imagemagick.org/ +Source0: https://imagemagick.org/download/%{name}/%{name}-%{VERSION}-%{Patchlevel}.tar.bz2 + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildRequires: bzip2-devel, freetype-devel, libjpeg-devel, libpng-devel +BuildRequires: libtiff-devel, giflib-devel, zlib-devel, perl-devel >= 5.8.1 +BuildRequires: perl-generators +BuildRequires: ghostscript-devel +BuildRequires: djvulibre-devel +BuildRequires: libwmf-devel, jasper-devel, libtool-ltdl-devel +BuildRequires: libX11-devel, libXext-devel, libXt-devel +BuildRequires: lcms2-devel, libxml2-devel, librsvg2-devel +BuildRequires: fftw-devel, ilmbase-devel, OpenEXR-devel, libwebp-devel +BuildRequires: jbigkit-devel +BuildRequires: openjpeg2-devel >= 2.1.0 +BuildRequires: graphviz-devel >= 2.9.0 +BuildRequires: libraqm-devel +BuildRequires: liblqr-1-devel +BuildRequires: LibRaw-devel >= 0.14.8 +BuildRequires: autoconf automake gcc gcc-c++ +BuildRequires: make + +Requires: %{name}-libs%{?_isa} = %{version}-%{release} + +%description +ImageMagick® is a software suite to create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, JPEG-2000, GIF, TIFF, DPX, EXR, WebP, Postscript, PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves. + +The functionality of ImageMagick is typically utilized from the command-line or you can use the features from programs written in your favorite language. Choose from these interfaces: G2F (Ada), MagickCore (C), MagickWand (C), ChMagick (Ch), Magick++ (C++), JMagick (Java), L-Magick (Lisp), Lua (LuaJIT), NMagick (Neko/haXe), Magick.NET (.NET), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP (PHP), IMagick (PHP), PythonMagick (Python), RMagick (Ruby), or TclMagick (Tcl/TK). With a language interface, use ImageMagick to modify or create images dynamically and automagically. + +ImageMagick utilizes multiple computational threads to increase performance and can read, process, or write mega-, giga-, or tera-pixel image sizes. + +ImageMagick is free software delivered as a ready-to-run binary distribution or as source code that you may use, copy, modify, and distribute in both open and proprietary applications. It is distributed under the Apache 2.0 license. + +The ImageMagick development process ensures a stable API and ABI. Before each ImageMagick release, we perform a comprehensive security assessment that includes memory error and thread data race detection to prevent security vulnerabilities. + +The authoritative ImageMagick web site is https://imagemagick.org. The authoritative source code repository is http://git.imagemagick.org/repos/ImageMagick. We maintain a source code mirror at GitHub. + +%package devel +Summary: Library links and header files for ImageMagick application development +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name}-libs%{?_isa} = %{version}-%{release} + +%description devel +ImageMagick-devel contains the library links and header files you'll +need to develop ImageMagick applications. ImageMagick is an image +manipulation program. + +If you want to create applications that will use ImageMagick code or +APIs, you need to install ImageMagick-devel as well as ImageMagick. +You do not need to install it if you just want to use ImageMagick, +however. + +%package libs +Summary: ImageMagick libraries to link with + +%description libs +This packages contains a shared libraries to use within other applications. + + +%package djvu +Summary: DjVu plugin for ImageMagick +Requires: %{name}-libs%{?_isa} = %{version}-%{release} + +%description djvu +This packages contains a plugin for ImageMagick which makes it possible to +save and load DjvU files from ImageMagick and libMagickCore using applications. + + +%package doc +Summary: ImageMagick HTML documentation + + +%description doc +ImageMagick documentation, this package contains usage (for the +commandline tools) and API (for the libraries) documentation in HTML format. +Note this documentation can also be found on the ImageMagick website: +https://imagemagick.org/. + + +%package perl +Summary: ImageMagick perl bindings +Requires: %{name}-libs%{?_isa} = %{version}-%{release} +Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) + + +%description perl +Perl bindings to ImageMagick. + +Install ImageMagick-perl if you want to use any perl scripts that use +ImageMagick. + + +%package c++ +Summary: ImageMagick Magick++ library (C++ bindings) +Requires: %{name}-libs%{?_isa} = %{version}-%{release} + +%description c++ +This package contains the Magick++ library, a C++ binding to the ImageMagick +graphics manipulation library. + +Install ImageMagick-c++ if you want to use any applications that use Magick++. + + +%package c++-devel +Summary: C++ bindings for the ImageMagick library +Requires: %{name}-c++%{?_isa} = %{version}-%{release} +Requires: %{name}-devel%{?_isa} = %{version}-%{release} + +%description c++-devel +ImageMagick-devel contains the static libraries and header files you'll +need to develop ImageMagick applications using the Magick++ C++ bindings. +ImageMagick is an image manipulation program. + +If you want to create applications that will use Magick++ code +or APIs, you'll need to install ImageMagick-c++-devel, ImageMagick-devel and +ImageMagick. + +You don't need to install it if you just want to use ImageMagick, or if you +want to develop/compile applications using the ImageMagick C interface, +however. + + +%prep +%setup -q -n %{name}-%{VERSION}-%{Patchlevel} + +# for %%doc +mkdir Magick++/examples +cp -p Magick++/demo/*.cpp Magick++/demo/*.miff Magick++/examples + +%build +autoconf -f -i +export CFLAGS="%{optflags} -DIMPNG_SETJMP_IS_THREAD_SAFE" +%configure --enable-shared \ + --disable-static \ + --with-modules \ + --with-perl \ + --with-x \ + --with-threads \ + --with-magick_plus_plus \ + --with-gslib \ + --with-wmf \ + --with-webp \ + --with-openexr \ + --with-rsvg \ + --with-xml \ + --with-perl-options="INSTALLDIRS=vendor %{?perl_prefix} CC='%__cc -L$PWD/magick/.libs' LDDLFLAGS='-shared -L$PWD/magick/.libs'" \ + --without-dps \ + --without-gcc-arch \ + --with-jbig \ + --with-openjp2 \ + --with-raw \ + --with-lqr \ + --with-raqm + +# Do *NOT* use %%{?_smp_mflags}, this causes PerlMagick to be silently misbuild +make + + +%install +make %{?_smp_mflags} install DESTDIR=%{buildroot} INSTALL="install -p" +cp -a www/source %{buildroot}%{_datadir}/doc/%{name}-%{VERSION} +rm %{buildroot}%{_libdir}/*.la + +# perlmagick: fix perl path of demo files +%{__perl} -MExtUtils::MakeMaker -e 'MY->fixin(@ARGV)' PerlMagick/demo/*.pl + +# perlmagick: cleanup various perl tempfiles from the build which get installed +find %{buildroot} -name "*.bs" |xargs rm -f +find %{buildroot} -name ".packlist" |xargs rm -f +find %{buildroot} -name "perllocal.pod" |xargs rm -f + +# perlmagick: build files list +echo "%defattr(-,root,root,-)" > perl-pkg-files +find %{buildroot}/%{_libdir}/perl* -type f -print \ + | sed "s@^%{buildroot}@@g" > perl-pkg-files +find %{buildroot}%{perl_vendorarch} -type d -print \ + | sed "s@^%{buildroot}@%dir @g" \ + | grep -v '^%dir %{perl_vendorarch}$' \ + | grep -v '/auto$' >> perl-pkg-files +if [ -z perl-pkg-files ] ; then + echo "ERROR: EMPTY FILE LIST" + exit -1 +fi + +# fix multilib issues: Rename provided file with platform-bits in name. +# Create platform independant file inplace of provided and conditionally include required. +# $1 - filename.h to process. +function multilibFileVersions(){ +mv $1 ${1%%.h}-%{__isa_bits}.h + +local basename=$(basename $1) + +cat >$1 < + +#if __WORDSIZE == 32 +# include "${basename%%.h}-32.h" +#elif __WORDSIZE == 64 +# include "${basename%%.h}-64.h" +#else +# error "unexpected value for __WORDSIZE macro" +#endif +EOF +} + +multilibFileVersions %{buildroot}%{_includedir}/%{name}-6/magick/magick-config.h +multilibFileVersions %{buildroot}%{_includedir}/%{name}-6/magick/magick-baseconfig.h +multilibFileVersions %{buildroot}%{_includedir}/%{name}-6/magick/version.h + +%check +export LD_LIBRARY_PATH=%{buildroot}/%{_libdir} +%make_build check + +%ldconfig_scriptlets libs +%ldconfig_scriptlets c++ + +%files +%doc README.txt LICENSE NOTICE AUTHORS.txt NEWS.txt ChangeLog.md +%{_bindir}/[a-z]* +%{_mandir}/man[145]/[a-z]* +%{_mandir}/man1/%{name}.* + +%files libs +%doc LICENSE NOTICE AUTHORS.txt QuickStart.txt +%{_libdir}/libMagickCore-6.Q16.so* +%{_libdir}/libMagickWand-6.Q16.so* +%{_libdir}/%{name}-%{VERSION} +%{_datadir}/%{name}-6 +%exclude %{_libdir}/%{name}-%{VERSION}/modules-Q16/coders/djvu.* +%dir %{_sysconfdir}/%{name}-6 +%config(noreplace) %{_sysconfdir}/%{name}-6/*.xml + +%files devel +%{_bindir}/MagickCore-config +%{_bindir}/Magick-config +%{_bindir}/MagickWand-config +%{_bindir}/Wand-config +%{_libdir}/libMagickCore-6.Q16.so +%{_libdir}/libMagickWand-6.Q16.so +%{_libdir}/pkgconfig/MagickCore.pc +%{_libdir}/pkgconfig/MagickCore-6.Q16.pc +%{_libdir}/pkgconfig/ImageMagick.pc +%{_libdir}/pkgconfig/ImageMagick-6.Q16.pc +%{_libdir}/pkgconfig/MagickWand.pc +%{_libdir}/pkgconfig/MagickWand-6.Q16.pc +%{_libdir}/pkgconfig/Wand.pc +%{_libdir}/pkgconfig/Wand-6.Q16.pc +%dir %{_includedir}/%{name}-6 +%{_includedir}/%{name}-6/magick +%{_includedir}/%{name}-6/wand +%{_mandir}/man1/Magick-config.* +%{_mandir}/man1/MagickCore-config.* +%{_mandir}/man1/Wand-config.* +%{_mandir}/man1/MagickWand-config.* + +%files djvu +%{_libdir}/%{name}-%{VERSION}/modules-Q16/coders/djvu.* + +%files doc +%doc %{_datadir}/doc/%{name}-6 +%doc %{_datadir}/doc/%{name}-%{VERSION} +%doc LICENSE + +%files c++ +%doc Magick++/AUTHORS Magick++/ChangeLog Magick++/NEWS Magick++/README +%doc www/Magick++/COPYING +%{_libdir}/libMagick++-6.Q16.so.* + +%files c++-devel +%doc Magick++/examples +%{_bindir}/Magick++-config +%{_includedir}/%{name}-6/Magick++ +%{_includedir}/%{name}-6/Magick++.h +%{_libdir}/libMagick++-6.Q16.so +%{_libdir}/pkgconfig/Magick++.pc +%{_libdir}/pkgconfig/Magick++-6.Q16.pc +%{_libdir}/pkgconfig/ImageMagick++.pc +%{_libdir}/pkgconfig/ImageMagick++-6.Q16.pc +%{_mandir}/man1/Magick++-config.* + +%files perl -f perl-pkg-files +%{_mandir}/man3/* +%doc PerlMagick/demo/ PerlMagick/Changelog PerlMagick/README.txt + +%changelog +* Sun May 01 2005 Cristy 1.0-0 +- Port of Redhat's RPM script to support ImageMagick. diff --git a/ImageMagick-6.9.12-44/Install-mac.txt b/ImageMagick-6.9.12-44/Install-mac.txt new file mode 100644 index 0000000..1b83d7e --- /dev/null +++ b/ImageMagick-6.9.12-44/Install-mac.txt @@ -0,0 +1,98 @@ +Mac OS X-specific Build instructions + +In order to install ImageMagick on OSX, you will first need Apple's "Xcode", +which you can get by going to the AppStore and searching for "Xcode" and +installing it. + +Next, you will need to install the "Xcode Command Line Tools" which includes +the compiler. You can install those by running the following command in the +Terminal: + + xcode-select --install + +Now that you have the necessary tools, you have a choice of how to install +ImageMagick. The simplest method is to use "homebrew", and that method is shown +first below. The alternative method is to install from source, which is shown +afterwards. + +################################################################################ +Method 1: Using "homebrew" +################################################################################ + +Go to http://brew.sh and copy the one-liner that installs "homebrew". + +Paste that into the Terminal and run it. + +For the very simplest, fastest, most basic ImageMagick installation, run: + + brew install imagemagick + +Test your installation by running: + + identify -version + +If you want to add support for extra features, such as HDRI, Perl, JPEG2000, +pango,fftw, TIFF or rsvg etc. you can configure the necessary options by running: + + brew edit imagemagick + +then find the options you need and apply them like this: + + brew reinstall -s imagemagick + +If you have any problems with "homebrew", simply run: + + brew doctor + +and follow the doctor's advice. + + +################################################################################ +Method 2: Compile from source - not necessary if you used "homebrew" method +################################################################################ + + +Perform these steps as an administrator or with the sudo command: + +Install MacPorts. Download and install http://www.macports.org/ and type the +following commands: + + $magick> sudo port -v install freetype +bytecode + $magick> sudo port -v install librsvg + $magick> sudo port -v install graphviz +gs +wmf +jbig +jpeg2 +lcms + +This installs many of the delegate libraries ImageMagick will utilize such as +JPEG and FreeType. + +Use the port command to install any delegate libraries you require, for example: + + $magick> sudo port install jpeg + +Now let's build ImageMagick: + +Download the ImageMagick source distribution and verify the distribution +against its message digest. + +Unpack and change into the top-level ImageMagick directory: + + $magick> tar xvfz ImageMagick-6.5.9-0.tar.gz + $magick> cd ImageMagick-6.5.9 + +Configure ImageMagick: + + $magick> ./configure --prefix=/opt --with-quantum-depth=16 \ + --disable-dependency-tracking --without-perl + +Build ImageMagick: + + $magick> make + +Install ImageMagick: + + $magick> sudo make install + +To verify your install, type + + $magick> /opt/local/bin/identify -list font + +to list all the fonts ImageMagick knows about. diff --git a/ImageMagick-6.9.12-44/Install-unix.txt b/ImageMagick-6.9.12-44/Install-unix.txt new file mode 100644 index 0000000..96024c5 --- /dev/null +++ b/ImageMagick-6.9.12-44/Install-unix.txt @@ -0,0 +1,658 @@ +Download & Unpack + + ImageMagick builds on a variety of Unix and Unix-like operating systems + including Linux, Solaris, FreeBSD, Mac OS X, and others. A compiler is + required and fortunately almost all modern Unix systems have one. Download + ImageMagick.tar.gz from ftp.imagemagick.org or its mirrors and verify the + distribution against its message digest. + + Unpack the distribution with this command: + + $magick> tar xvfz ImageMagick.tar.gz + + Now that you have the ImageMagick Unix/Linux source distribution unpacked, + let's configure it. + +Configure + + The configure script looks at your environment and decides what it can cobble + together to get ImageMagick compiled and installed on your system. This + includes finding a compiler, where your compiler header files are located + (e.g. stdlib.h), and if any delegate libraries are available for ImageMagick + to use (e.g. JPEG, PNG, TIFF, etc.). If you are willing to accept configure's + default options, and build from within the source directory, you can simply + type: + + $magick> cd ImageMagick-6.9.6 + $magick> ./configure + + Watch the configure script output to verify that it finds everything that + you think it should. Pay particular attention to the last lines of the script + output. For example, here is a recent report from our system: + + ImageMagick is configured as follows. Please verify that this configuration + matches your expectations. + + Host system type: x86_64-unknown-linux-gnu + Build system type: x86_64-unknown-linux-gnu + + Option Value + ---------------------------------------------------------------------------- + Shared libraries --enable-shared=yes yes + Static libraries --enable-static=yes yes + Module support --with-modules=yes yes + GNU ld --with-gnu-ld=yes yes + Quantum depth --with-quantum-depth=16 16 + High Dynamic Range Imagery + --enable-hdri=no no + + Delegate Configuration: + BZLIB --with-bzlib=yes yes + Autotrace --with-autotrace=yes yes + DJVU --with-djvu=yes no + DPS --with-dps=yes no + FlashPIX --with-fpx=yes no + FontConfig --with-fontconfig=yes yes + FreeType --with-freetype=yes yes + GhostPCL None pcl6 (unknown) + GhostXPS None gxps (unknown) + Ghostscript None gs (8.63) + result_ghostscript_font_dir='none' + Ghostscript fonts --with-gs-font-dir=default + Ghostscript lib --with-gslib=yes no (failed tests) + Graphviz --with-gvc=yes yes + JBIG --with-jbig= no + JPEG v1 --with-jpeg=yes yes + JPEG-2000 --with-jp2=yes yes + LCMS v1 --with-lcms=yes yes + LCMS v2 --with-lcms2=yes yes + LQR --with-lqr=yes no + Magick++ --with-magick-plus-plus=yes yes + OpenEXR --with-openexr=yes yes + PERL --with-perl=yes /usr/bin/perl + PNG --with-png=yes yes + RSVG --with-rsvg=yes yes + TIFF --with-tiff=yes yes + result_windows_font_dir='none' + Windows fonts --with-windows-font-dir= + WMF --with-wmf=yes yes + X11 --with-x= yes + XML --with-xml=yes yes + ZLIB --with-zlib=yes yes + + X11 Configuration: + X_CFLAGS = + X_PRE_LIBS = -lSM -lICE + X_LIBS = + X_EXTRA_LIBS = + + Options used to compile and link: + PREFIX = /usr/local + EXEC-PREFIX = /usr/local + VERSION = 6.4.8 + CC = gcc -std=gnu99 + CFLAGS = -fopenmp -g -O2 -Wall -W -pthread + MAGICK_CFLAGS = -fopenmp -g -O2 -Wall -W -pthread + CPPFLAGS = -I/usr/local/include/ImageMagick + PCFLAGS = -fopenmp + DEFS = -DHAVE_CONFIG_H + LDFLAGS = -lfreetype + MAGICK_LDFLAGS = -L/usr/local/lib -lfreetype + LIBS = -lMagickCore -llcms -ltiff -lfreetype -ljpeg + -lfontconfig -lXext -lSM -lICE -lX11 -lXt -lbz2 -lz + -lm -lgomp -lpthread -lltdl + CXX = g++ + CXXFLAGS = -g -O2 -Wall -W -pthread + + You can influence the choice of compiler, compilation flags, or libraries of + the configure script by setting initial values for variables in the configure + command line. These include, among others: + + CC + Name of C compiler (e.g. cc -Xa) to use. + + CXX + Name of C++ compiler to use (e.g. CC). + + CFLAGS + Compiler flags (e.g. -g -O2) to compile C code. + + CXXFLAGS + Compiler flags (e.g. -g -O2) to compile C++ code. + + CPPFLAGS + Include paths (.e.g. -I/usr/local) to look for header files. + + LDFLAGS + Library paths (.e.g. -L/usr/local) to look for libraries systems that + support the notion of a library run-path may require an additional + argument in order to find shared libraries at run time. For example, + the Solaris linker requires an argument of the form -R/path. Some + Linux systems will work with -rpath /usr/local/lib, while some other + Linux systems who's gcc does not pass -rpath to the linker require + an argument of the form -Wl,-rpath,/usr/local/lib. + + LIBS + Extra libraries (.e.g. -l/usr/local/lib) required to link. + + Here is an example of setting configure variables from the command line: + + $magick> ./configure CC=c99 CFLAGS=-O2 LIBS=-lposix + + Any variable (e.g. CPPFLAGS or LDFLAGS) which requires a directory path must + specify an absolute path rather than a relative path. + + Configure can usually find the X include and library files automagically, + but if it doesn't, you can use the --x-includes=path and --x-libraries=path + options to specify their locations. + + The configure script provides a number of ImageMagick specific + options. When disabling an option --disable-something is equivalent to + specifying --enable-something=no and --without-something is equivalent to + --with-something=no. The configure options are as follows (execute configure + --help to see all options). + + ImageMagick options represent either features to be enabled, disabled, + or packages to be included in the build. When a feature is enabled (via + --enable-something), it enables code already present in ImageMagick. When a + package is enabled (via --with-something), the configure script will search + for it, and if is properly installed and ready to use (headers and built + libraries are found by compiler) it will be included in the build. The + configure script is delivered with all features disabled and all packages + enabled. In general, the only reason to disable a package is if a package + exists but it is unsuitable for the build (perhaps an old version or not + compiled with the right compilation flags). + + Here are the optional features you can configure: + + --enable-shared + build the shared libraries and support for loading coder and process + modules. Shared libraries are preferred because they allow programs + to share common code, making the individual programs much smaller. In + addition shared libraries are required in order for PerlMagick to be + dynamically loaded by an installed PERL (otherwise an additional PERL + (PerlMagick) must be installed. + + ImageMagick built with delegates (see MAGICK PLUG-INS below) can pose + additional challenges. If ImageMagick is built using static libraries (the + default without --enable-shared) then delegate libraries may be built as + either static libraries or shared libraries. However, if ImageMagick is + built using shared libraries, then all delegate libraries must also be + built as shared libraries. Static libraries usually have the extension + .a, while shared libraries typically have extensions like .so, .sa, or + .dll. Code in shared libraries normally must compiled using a special + compiler option to produce Position Independent Code (PIC). The only + time this not necessary is if the platform compiles code as PIC by + default. + + PIC compilation flags differ from vendor to vendor (gcc's is + -fPIC). However, you must compile all shared library source with the + same flag (for gcc use -fPIC rather than -fpic). While static libraries + are normally created using an archive tool like ar, shared libraries + are built using special linker or compiler options (e.g. -shared for gcc). + + If --enable-shared is not specified, a new PERL interpreter (PerlMagick) + is built which is statically linked against the PerlMagick extension. This + new interpreter is installed into the same directory as the ImageMagick + utilities. If --enable-shared is specified, the PerlMagick extension is + built as a dynamically loadable object which is loaded into your current + PERL interpreter at run-time. Use of dynamically-loaded extensions is + preferable over statically linked extensions so use --enable-shared if + possible (note that all libraries used with ImageMagick must be shared + libraries!). + + --disable-static + static archive libraries (with extension .a) are not built. If you + are building shared libraries, there is little value to building static + libraries. Reasons to build static libraries include: 1) they can be + easier to debug; 2) clients do not have external dependencies (i.e. + libMagick.so); 3) building PIC versions of the delegate libraries may + take additional expertise and effort; 4) you are unable to build shared + libraries. + + --disable-installed + disable building an installed ImageMagick (default enabled). + + By default the ImageMagick build is configured to formally install + into a directory tree. This the most secure and reliable way to install + ImageMagick. Use this option to configure ImageMagick so that it doesn't + use hard-coded paths and locates support files by computing an offset path + from the executable (or from the location specified by the MAGICK_HOME + environment variable. The uninstalled configuration is ideal for binary + distributions which are expected to extract and run in any location. + + --enable-ccmalloc + enable 'ccmalloc' memory debug support (default disabled). + + --enable-prof + enable 'prof' profiling support (default disabled). + + --enable-gprof + enable 'gprof' profiling support (default disabled). + + --enable-gcov + enable 'gcov' profiling support (default disabled). + + --disable-openmp + disable OpenMP (default enabled). + + Certain ImageMagick algorithms, for example convolution, can achieve + a significant speed-up with the assistance of the OpenMP API when + running on modern dual and quad-core processors. + + --disable-largefile + disable support for large (64 bit) file offsets. + + By default, ImageMagick is compiled with support for large files (> + 2GB on a 32-bit CPU) if the operating system supports large files. Some + applications which use the ImageMagick library may also require support + for large files. By disabling support for large files via + --disable-largefile, dependent applications do not require special + compilation options for large files in order to use the library. + + Here are the optional packages you can configure: + + --with-quantum-depth + number of bits in a pixel quantum (default 16). + + Use this option to specify the number of bits to use per pixel quantum + (the size of the red, green, blue, and alpha pixel components). For + example, --with-quantum-depth=8 builds ImageMagick using 8-bit quantums. + Most computer display adapters use 8-bit quantums. Currently supported + arguments are 8, 16, or 32. We recommend the default of 16 because + some image formats support 16 bits-per-pixel. However, this option is + important in determining the overall run-time performance of ImageMagick. + + The number of bits in a quantum determines how many values it may + contain. Each quantum level supports 256 times as many values as the + previous level. The following table shows the range available for various + quantum sizes. + + Quantum Depth Valid Range (Decimal) Valid Range (Hex) + 8 0-255 00-FF + 16 0-65535 0000-FFFF + 32 0-4294967295 00000000-FFFFFFFF + + Larger pixel quantums can cause ImageMagick to run more slowly and to + require more memory. For example, using sixteen-bit pixel quantums can + cause ImageMagick to run 15% to 50% slower (and take twice as much memory) + than when it is built to support eight-bit pixel quantums. + + The amount of virtual memory consumed by an image can be computed by + the equation (5 * Quantum Depth * Rows * Columns) / 8. This an important + consideration when resources are limited, particularly since processing + an image may require several images to be in memory at one time. The + following table shows memory consumption values for a 1024x768 image: + + Quantum Depth Virtual Memory + 8 3MB + 16 8MB + 32 15MB + + --enable-hdri + accurately represent the wide range of intensity levels (experimental). + + --enable-osx-universal-binary + build a universal binary on OS X. + + --without-modules + disable support for dynamically loadable modules. + + Image coders and process modules are built as loadable modules which are + installed under the directory [prefix]/lib/ImageMagick-X.X.X/modules-QN + (where 'N' equals 8, 16, or 32 depending on the quantum depth) in the + subdirectories coders and filters respectively. The modules build option + is only available in conjunction with --enable-shared. If --enable-shared + is not also specified, support for building modules is disabled. Note that + if --enable-shared and --disable-modules are specified, the module loader + is active (allowing extending an installed ImageMagick by simply copying + a module into place) but ImageMagick itself is not built using modules. + + --with-cache + set pixel cache threshold (defaults to available memory). + + Specify a different image pixel cache threshold with this option. This + sets the maximum amount of heap memory that ImageMagick is allowed to + consume before switching to using memory-mapped temporary files to store + raw pixel data. + + --without-threads + disable threads support. + + By default, the ImageMagick library is compiled with multi-thread + support. If this undesirable, specify --without-threads. + + --with-frozenpaths + enable frozen delegate paths. + + Normally, external program names are substituted into the delegates.xml + configuration file without full paths. Specify this option to enable + saving full paths to programs using locations determined by configure. + This useful for environments where programs are stored under multiple + paths, and users may use different PATH settings than the person who + builds ImageMagick. + + --without-magick-plus-plus + disable build/install of Magick++. + + Disable building Magick++, the C++ application programming interface + to ImageMagick. A suitable C++ compiler is required in order to build + Magick++. Specify the CXX configure variable to select the C++ compiler + to use (default g++), and CXXFLAGS to select the desired compiler + optimization and debug flags (default -g -O2). Antique C++ compilers + will normally be rejected by configure tests so specifying this option + should only be necessary if Magick++ fails to compile. + + --with-package-release-name + encode this name into the shared library name (see libtools -release + option). + + --without-perl + disable build/install of PerlMagick, or + + By default, PerlMagick is conveniently compiled and installed as part + of ImageMagick's normal configure, make, sudo make install process. When + --without-perl is specified, you must first install ImageMagick, change to + the PerlMagick subdirectory, build, and finally install PerlMagick. Note, + PerlMagick is configured even if --without-perl is specified. If the + argument --with-perl=/path/to/perl is supplied, /../path/to/perl is be + taken as the PERL interpreter to use. This important in case the perl + executable in your PATH is not PERL5, or is not the PERL you want to use. + + --with-perl=PERL + use specified Perl binary to configure PerlMagick. + + --with-perl-options=OPTIONS + options to pass on command-line when generating PerlMagick's Makefile + from Makefile.PL. + + The PerlMagick module is normally installed using the Perl interpreter's + installation PREFIX, rather than ImageMagick's. If ImageMagick's + installation prefix is not the same as PERL's PREFIX, then you + may find that PerlMagick's sudo make install step tries to install + into a directory tree that you don't have write permissions to. This + common when PERL is delivered with the operating system or on Internet + Service Provider (ISP) web servers. If you want PerlMagick to install + elsewhere, then provide a PREFIX option to PERL's configuration step + via "--with-perl-options=PREFIX=/some/place". Other options accepted by + MakeMaker are 'LIB', 'LIBPERL_A', 'LINKTYPE', and 'OPTIMIZE'. See the + ExtUtils::MakeMaker(3) manual page for more information on configuring + PERL extensions. + + --without-bzlib + disable BZLIB support. + + --without-dps + disable Display Postscript support. + + --with-fpx + enable FlashPIX support. + + --without-freetype + disable TrueType support. + + --with-gslib + enable Ghostscript library support. + + --without-jbig + disable JBIG support. + + --without-jpeg + disable JPEG support. + + --without-jp2 + disable JPEG v2 support. + + --without-lcms + disable lcms (v1.1X) support + + --without-lcms2 + disable lcms (v2.X) support + + --without-lzma + disable LZMA support. + + --without-png + disable PNG support. + + --without-tiff + disable TIFF support. + + --without-wmf + disable WMF support. + + --with-fontpath + prepend to default font search path. + + --with-gs-font-dir + directory containing Ghostscript fonts. + + Specify the directory containing the Ghostscript Postscript Type 1 font + files (e.g. n022003l.pfb) so that they can be rendered using the FreeType + library. If the font files are installed using the default Ghostscript + installation paths (${prefix}/share/ghostscript/fonts), they should + be discovered automagically by configure and specifying this option is + not necessary. Specify this option if the Ghostscript fonts fail to be + located automagically, or the location needs to be overridden. + + --with-windows-font-dir + directory containing MS-Windows fonts. + + Specify the directory containing MS-Windows-compatible fonts. This not + necessary when ImageMagick is running under MS-Windows. + + --without-xml + disable XML support. + + --without-zlib + disable ZLIB support. + + --without-x + don't use the X Window System. + + By default, ImageMagick uses the X11 delegate libraries if they are + available. When --without-x is specified, use of X11 is disabled. The + display, animate, and import sub-commands are not included. The remaining + sub-commands have reduced functionality such as no access to X11 fonts + (consider using Postscript or TrueType fonts instead). + + --with-share-path=DIR + Alternate path to share directory (default share/ImageMagick). + + --with-libstdc=DIR + use libstdc++ in DIR (for GNU C++). + + While configure is designed to ease installation of ImageMagick, it often + discovers problems that would otherwise be encountered later when compiling + ImageMagick. The configure script tests for headers and libraries by + executing the compiler (CC) with the specified compilation flags (CFLAGS), + pre-processor flags (CPPFLAGS), and linker flags (LDFLAGS). Any errors are + logged to the file config.log. If configure fails to discover a header or + library please review this log file to determine why, however, please be + aware that *errors in the config.log are normal* because configure works by + trying something and seeing if it fails. An error in config.log is only a + problem if the test should have passed on your system. + + Common causes of configure failures are: 1) a delegate header is not in the + header include path (CPPFLAGS -I option); 2) a delegate library is not in + the linker search/run path (LDFLAGS -L/-R option); 3) a delegate library is + missing a function (old version?); or 4) compilation environment is faulty. + + If all reasonable corrective actions have been tried and the problem appears + be due to a flaw in the configure script, please send a bug report to the + ImageMagick Defect Support Forum. All bug reports should contain the operating + system type (as reported by uname -a) and the compiler/compiler-version. A + copy of the configure script output and/or the relevant portion of config.log + file may be valuable in order to find the problem. If you post portions + of config.log, please also send a script of the configure output and a + description of what you expected to see (and why) so the failure you are + observing can be identified and resolved. + + ImageMagick is now configured and ready to build + +Build + + Once ImageMagick is configured, these standard build targets are available + from the generated make files: + + make + build ImageMagick. + + sudo make install + install ImageMagick. + + make check + Run tests using the installed ImageMagick (sudo make install must be + done first). Ghostscript is a prerequisite, otherwise the EPS, PS, + and PDF tests will fail. + + make clean + Remove everything in the build directory created by make. + + make distclean + remove everything in the build directory created by configure and + make. This useful if you want to start over from scratch. + + make uninstall + Remove all files from the system which are (or would be) installed by sudo + make install using the current configuration. Note that this target is + imperfect for PerlMagick since Perl no longer supports an uninstall + target. + + In most cases you will simply want to compile ImageMagick with this command: + + $magick> make + + Once built, you can optionally install ImageMagick on your system as + discussed below. + +Install + + Now that ImageMagick is configured and built, type: + + $magick> make install + + to install it. + + By default, ImageMagick is installs binaries in /../usr/local/bin, libraries + in /../usr/local/lib, header files in /../usr/local/include and documentation + in /../usr/local/share. You can specify an alternative installation prefix + other than /../usr/local by giving configure the option --prefix=PATH. This + valuable in case you don't have privileges to install under the default + paths or if you want to install in the system directories instead. + + To confirm your installation of the ImageMagick distribution was successful, + ensure that the installation directory is in your executable search path + and type: + + $magick> display + + The ImageMagick logo is displayed on your X11 display. + + To verify the ImageMagick build configuration, type: + + $magick> identify -list configure + + To list which image formats are supported , type: + + $magick> identify -list format + + For a more comprehensive test, you run the ImageMagick test suite by typing: + + $magick> make check + + Ghostscript is a prerequisite, otherwise the EPS, PS, and PDF tests will + fail. Note that due to differences between the developer's environment and + your own it is possible that a few tests may fail even though the results are + ok. Differences between the developer's environment environment and your own + may include the compiler, the CPU type, and the library versions used. The + ImageMagick developers use the current release of all dependent libraries. + +Linux-specific Build instructions + + Download ImageMagick.src.rpm from ftp.imagemagick.org or its mirrors and + verify the distribution against its message digest. + + Build ImageMagick with this command: + + $magick> rpmbuild --rebuild ImageMagick.src.rpm + + After the build you, locate the RPMS folder and install the ImageMagick + binary RPM distribution: + + $magick> rpm -ivh ImageMagick-6.8.2-?.*.rpm + +MinGW-specific Build instructions + + Although you can download and install delegate libraries yourself, many + are already available in the GnuWin32 distribution. Download and install + whichever delegate libraries you require such as JPEG, PNG, TIFF, etc. Make + sure you specify the development headers when you install a package. Next + type, + + $magick> tar jxvf ImageMagick-6.8.2-?.tar.bz2 + $magick> cd ImageMagick-6.8.2 + $magick> export CPPFLAGS="-Ic:/Progra~1/GnuWin32/include" + $magick> export LDFLAGS="-Lc:/Progra~1/GnuWin32/lib" + $magick> ./configure --without-perl + $magick> make $magick> sudo make install + +Dealing with Unexpected Problems + + Chances are the download, configure, build, and install of ImageMagick went + flawlessly as it is intended, however, certain systems and environments may + cause one or more steps to fail. We discuss a few problems we've run across + and how to take corrective action to ensure you have a working release + of ImageMagick + + Build Problems + + If the build complains about missing dependencies (e.g. .deps/source.PLO), + add --disable-dependency-tracking to your configure command line. + + Some systems may fail to link at build time due to unresolved symbols. Try + adding the LDFLAGS to the configure command line: + + $magick> configure LDFLAGS='-L/usr/local/lib -R/usr/local/lib' + + Dynamic Linker Run-time Bindings + + On some systems, ImageMagick may not find its shared library, libMagick.so. Try + running the ldconfig with the library path: + + $magick> /sbin/ldconfig /usr/local/lib + + Solaris and Linux systems have the ldd command which is useful to track which + libraries ImageMagick depends on: + + $magick> ldd `which convert` + + Delegate Libraries + + On occasion you may receive these warnings: + + no decode delegate for this image format + no encode delegate for this image format + + This exception indicates that an external delegate library or its headers + were not available when ImageMagick was built. To add support for the image + format, download and install the requisite delegate library and its header + files and reconfigure, rebuild, and reinstall ImageMagick. As an example, + lets add support for the JPEG image format. First we install the JPEG RPMS: + + $magick> yum install libjpeg libjpeg-devel + + Now reconfigure, rebuild, and reinstall ImageMagick. To verify JPEG is now + properly supported within ImageMagick, use this command: + + $magick> identify -list format + + You should see a mode of rw- associated with the JPEG tag. This mode means + the image can be read or written and can only support one image per image + file. + +PerlMagick + + If PerlMagick fails to link with a message similar to libperl.a is not found, + rerun configure with the --enable-shared or --enable-shared --with-modules + options. diff --git a/ImageMagick-6.9.12-44/Install-vms.txt b/ImageMagick-6.9.12-44/Install-vms.txt new file mode 100644 index 0000000..dbc5127 --- /dev/null +++ b/ImageMagick-6.9.12-44/Install-vms.txt @@ -0,0 +1,33 @@ +VMS COMPILATION + + You might want to check the values of certain program definitions + before compiling. Verify the definitions in delegates.xml to suit + your local requirements. Next, type. + + Type + + unzip ImageMagick-6.7.4-0.zip + set default [.imagemagick] + @make + set display/create/node=node_name:: + + where node_name is the DECNET X server to contact. + + Note : the MAKE.COM files compile every thing with /name=(as_is,short). all + the requested graphical lib's should be compiled with this qualifier (see + http://nchrem.tnw.tudelft/openvms for details on additional libraries + needed). All the .olb files of the libs are expected to be in SYS$LIBRARY. + + Edit the MAKE.COM in the top directory and [.MAGICK]CONFIG.H_VMS to + add/remove optional graphical support. + + Finally type: + + display + + Thanks to pmoreau@cenaath.cena.dgac.fr for supplying invaluable help + as well as the VMS versions of the JPEG, PNG, TTF, and TIFF libraries. + + Thanks to Joukj@hrem.stm.tudelft.{nl} for providing a patches to get + ImageMagick working under OpenVMS. See + http://nchrem.tnw.tudelft.nl/openvms/software2.html#Magick. diff --git a/ImageMagick-6.9.12-44/Install-windows.txt b/ImageMagick-6.9.12-44/Install-windows.txt new file mode 100644 index 0000000..d003b6f --- /dev/null +++ b/ImageMagick-6.9.12-44/Install-windows.txt @@ -0,0 +1,2 @@ +Instructions on how to build ImageMagick on Windows can be found here: +https://github.com/ImageMagick/ImageMagick-Windows6 diff --git a/ImageMagick-6.9.12-44/LICENSE b/ImageMagick-6.9.12-44/LICENSE new file mode 100644 index 0000000..ad5c338 --- /dev/null +++ b/ImageMagick-6.9.12-44/LICENSE @@ -0,0 +1,103 @@ +Before we get to the text of the license, lets just review what the license says in simple terms: + +It allows you to: + + * freely download and use ImageMagick software, in whole or in part, for personal, company internal, or commercial purposes; + * use ImageMagick software in packages or distributions that you create; + * link against a library under a different license; + * link code under a different license against a library under this license; + * merge code into a work under a different license; + * extend patent grants to any code using code under this license; + * and extend patent protection. + +It forbids you to: + + * redistribute any piece of ImageMagick-originated software without proper attribution; + * use any marks owned by ImageMagick Studio LLC in any way that might state or imply that ImageMagick Studio LLC endorses your distribution; + * use any marks owned by ImageMagick Studio LLC in any way that might state or imply that you created the ImageMagick software in question. + +It requires you to: + + * include a copy of the license in any redistribution you may make that includes ImageMagick software; + * provide clear attribution to ImageMagick Studio LLC for any distributions that include ImageMagick software. + +It does not require you to: + + * include the source of the ImageMagick software itself, or of any modifications you may have made to it, in any redistribution you may assemble that includes it; + * submit changes that you make to the software back to the ImageMagick Studio LLC (though such feedback is encouraged). + +A few other clarifications include: + + * ImageMagick is freely available without charge; + * you may include ImageMagick on a DVD as long as you comply with the terms of the license; + * you can give modified code away for free or sell it under the terms of the ImageMagick license or distribute the result under a different license, but you need to acknowledge the use of the ImageMagick software; + * the license is compatible with the GPL V3. + * when exporting the ImageMagick software, review its export classification. + +Terms and Conditions for Use, Reproduction, and Distribution + +The legally binding and authoritative terms and conditions for use, reproduction, and distribution of ImageMagick follow: + +Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization dedicated to making software imaging solutions freely available. + +1. Definitions. + +License shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +Licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +Legal Entity shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, control means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +You (or Your) shall mean an individual or Legal Entity exercising permissions granted by this License. + +Source form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +Object form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +Work shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +Derivative Works shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +Contribution shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as Not a Contribution. + +Contributor shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + * You must give any other recipients of the Work or Derivative Works a copy of this License; and + * You must cause any modified files to carry prominent notices stating that You changed the files; and + * You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + * If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +How to Apply the License to your Work + +To apply the ImageMagick License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information (don't include the brackets). The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the ImageMagick License (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy + of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. diff --git a/ImageMagick-6.9.12-44/Magick++/AUTHORS b/ImageMagick-6.9.12-44/Magick++/AUTHORS new file mode 100644 index 0000000..051068c --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/AUTHORS @@ -0,0 +1,19 @@ +The author and maintainer of Magick++ is Bob Friesenhan +. + +Many thanks to Cristy for developing the powerful ImageMagick +package that Magick++ is based on and for enhancing ImageMagick API +features in order to allow a cleaner implementation. + +Thanks to Bill Radcliffe for his assistance with +getting Magick++ to compile under Visual C++, and for maintaining the +Windows build environment. + +Thanks to Albert Chin-A-Young for assisting +with compilation issues related to the SGI C++ compiler, for providing +access to the Sun C++ compiler, and for assistance with the configure +script. + +Thanks to Leonard Rosenthol for ensuring that +Magick++ compiles on the Mac. + diff --git a/ImageMagick-6.9.12-44/Magick++/ChangeLog b/ImageMagick-6.9.12-44/Magick++/ChangeLog new file mode 100644 index 0000000..43fbf97 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/ChangeLog @@ -0,0 +1,1544 @@ +2017-07-12 6.9.9-0 Dirk Lemstra + * For portability, Color() arguments must be Magick::Quantum (reference + https://github.com/ImageMagick/ImageMagick/issues/510). + +2013-07-09 6.8.6-4 Dirk Lemstra + * Added combineImages, evaluateImages, mergeImageLayers, optimizeImageLayers + optimizePlusImageLayers and separateImages to STL.h (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=2&t=23699). + * Added support for the fill area flag ('^') and the pixel area + count limit flag ('@') to the Geometry class of Magick++ (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=2&t=23704). + +2012-08-23 6.7.9-2 Cristy + * On rare occasions, PNG warnings triggered an assertion (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=23&t=21737). + +2012-05-12 6.7.6-10 Cristy + * GravityType argument no longer ignored in Magick::Image::extent (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=3&t=21000). + +2011-02-12 6.6.7-7 Cristy + * Add support for the strip() and stripImage() STL methods. + +2011-02-01 6.6.7-2 Cristy + * Remove extra '+' in the geometry operator. + +2010-06-16 6.6.2-2 Cristy + * Patch for compile problem in mapImages of the STL header. + +2010-02-21 6.5.9-10 Cristy + * Add extent() to extend the image as defined by the geometry, gravity, and + image background color. + +2009-11-14 6.5.7-8 Cristy + * Add forwardFourierTransform(), inverseFourierTransform(), and + inverseFourierTransformImage() methods to implement forward and inverse + discrete Fourier transform (DFT / IFT). + +2009-09-28 6.5.6-6 Cristy + * Add splice() method to splice the background color into the image. + +2009-04-01 6.5.1-1 Cristy + * Add virtualPixelMethod() method for image and options, required for + distort(). + +2008-09-09 6.4.3-7 Cristy + * Use ImagesToBlob() rather than ImageToBlob() for writeImages(). + +2007-10-02 6.3.6-7 Cristy + * Define USE_MAP for Magick++/tests/colorHistogram.cpp (patch provided by + albert chin ). + +2007-04-10 6.3.3-7 Cristy + * Add colorspaceType(RGBColorspace) to set RGB colorspace before an + image read (useful to convert CMYK Potscript to RGB). + +2006-02-05 6.3.2-3 Cristy + * Clear exception in throwException() method. + +2006-01-16 6.3.2-0 Cristy + * Add extent() method to extend the image as defined by the geometry. + +2003-12-04 Bob Friesenhahn + + * demo/analyze.cpp (main): New program to demonstrate using the + 'analyze' process module. + * demo/Makefile.am: Add rules to build analyze program. + * lib/Image.cpp (process): New method to execute process modules. + * lib/Image.cpp (attribute): New method to get and set named image + attributes. + +2003-10-01 Bob Friesenhahn + + * lib/Color.cpp: Ensure that all non-default constructors set + opacity to opaque. + +2003-09-17 Bob Friesenhahn + + * lib/Magick++/STL.h (colorHistogram): If map key is not const, + then implicit type conversion occurs. Sun's C++ compiler doesn't + seem to handle that. The map key is now defined as const in + the insert arguments. + +2003-09-01 Bob Friesenhahn + + * tests/Makefile.am: Add build support for colorHistogram.cpp. + * tests/colorHistogram.cpp: New test program to test retrieving + color histograms from the image using colorHistogram(). + * lib/Magick++/STL.h (colorHistogram): Added new template function + to retrieve a color histogram into a user-provided container. + Verified to work when using STL and as the target + container types. When is used, a user-specified color may + be used to perform lookups in the map to obtain the usage count for + that color. + * lib/Color.cpp (operator >=): Insufficient resolution was being + provided in order to reliably sort color objects in STL + containers. The updated algorithm should be fail-safe. + +2003-08-31 Bob Friesenhahn + + * lib/Image.cpp (channelDepth): New method to set or get the + modulus depth for a specified channel. + +2003-08-29 Bob Friesenhahn + + * lib/Magick++/Include.h (Magick): Added support for + CopyCyanCompositeOp, CopyMagentaCompositeOp, + CopyYellowCompositeOp, and CopyBlackCompositeOp, composition + operators. + +2003-08-12 Bob Friesenhahn + + * lib/Image.cpp (depth): Method now only updates the + Image/ImageInfo depth member and retrieves the value of the Image + depth member. + (modulusDepth): New method to inspect the pixels for actual + modulus depth, or update/reduce the pixels to a specified modulus + depth. The depth method was performing this function so any code + which depended on the depth method to compute or set the modulus + depth should be updated to use modulusDepth() instead. + +2003-08-03 Bob Friesenhahn + + * lib/Image.cpp (matte): If a new matte channel is created, + initialize it to opaque. Likewise, if the matte channel is + eliminated, initialize the unused channel to opaque. + +2003-07-09 Bob Friesenhahn + + * demo/demo.cpp (main): Don't crop logo image. * + * *.h, *.cpp: Include "Magick++/Include.h" before including any + compiler or system header in order to ensure that LFS defines are + properly applied. Inspired by patch from Albert Chin-A-Young. + +2003-06-29 Bob Friesenhahn + + * lib/Magick++/Include.h: Needed to import ThrowLoggedException. + * lib/Exception.cpp (throwException): Add originating source + module, source line, and function name (if available) to exception + report. This is useful in order to determine the exact conditions + that lead to the exception being thrown. + * lib/Magick++/Exception.h: Added ErrorCoder, WarningCoder, + ErrorConfigure, WarningConfigure, ErrorDraw, WarningDraw, + ErrorImage, WarningImage, ErrorMonitor, WarningMonitor, + ErrorRegistry, WarningRegistry, ErrorStream, WarningStream, + ErrorType, and WarningType, exception classes to support the full + set of exceptions that ImageMagick can throw. + +2003-06-22 Bob Friesenhahn + + * lib/CoderInfo.cpp (CoderInfo): Applied compilation fix from + Mike Chiarappa to compile using Borland C++. + +2003-06-06 Bob Friesenhahn + + * lib/Geometry.cpp (string): Throw an exception if a string is + requested from an invalid geometry object. + +2003-06-05 Bob Friesenhahn + + * lib/Geometry.cpp (operator =): If GetGeometry returns NoValue, + then assign an invalid geometry object to cause an exception if + the geometry is then used. + +2003-06-04 Bob Friesenhahn + + * lib/Magick++/Exception.h (ErrorModule): Added class to handle + module errors. + * lib/Magick++/Exception.h (WarningModule) Added class to handle + module warnings. + +2003-05-30 Bob Friesenhahn + + * lib/Magick++/STL.h (coderInfoList): Use GetMagickInfoArray to + access coder list. + +2003-05-22 Bob Friesenhahn + + * lib/Magick++/STL.h (affineTransformImage): Add function object + contributed by Vladimir Lukianov to apply an affine transform to + the image. + * lib/Image.cpp (affineTransform): Added method contributed by + Vladimir Lukianov to apply an affine transform to the image. + +2003-05-16 Bob Friesenhahn + + * lib/Magick++/Include.h: Decided to back out change + which used the _VISUALC_ define to trigger inclusion of + . + +2003-05-14 Bob Friesenhahn + + * lib/Magick++/Include.h: If _VISUALC_ is defined, + include . This ensures that this necessary + header is included even if HAVE_SYS_TYPES_H is not defined + in magick-config.h. + +2003-05-04 Bob Friesenhahn + + * lib/Image.cpp (InitializeMagick): InitializeMagick is + now a C++ function rather than a namespace inclusion. + An atexit() handler is registered to invoke DestroyMagick + when the program exits. Relying on static deconstruction + to invoke DestroyMagick proved to be unreliable due to + translation unit destruction uncertainty. + +2003-04-15 Bob Friesenhahn + + * lib/Image.cpp (Image::Image (MagickCore::Image* image_)): + Incorporated recommended fix from Jukka Manner to avoid + a scenario which leaks an Options object. + * tests/coalesceImages.cpp: Updated to use modified + coalesceImages() interface. + * lib/Magick++/STL.h (coalesceImages): Replaced implementation + with one from Felix Heimbrecht. The template signature has + changed to return a new image sequence. This template API + silently ceased to funtion due to an ImageMagick CoalesceImages + API change. + +2003-03-30 Bob Friesenhahn + + * tests/readWriteBlob.cpp (main): Added check for + stream read failure when reading blob data. + (class myBlob): Use get rather than read. + +2003-03-20 Bob Friesenhahn + + * tests/attributes.cpp : Change in the way that Magick++ + retrieves density caused tests to fail. Density now defaults + to 72x72 (ImageMagick default) rather than invalid. + +2003-03-15 Bob Friesenhahn + + * demo/Makefile.am (CLEANFILES): Fix clean target to remove + *_out.mvg output files as well. + * demo/zoom.cpp: Added a command-line parser for dash + arguments as well as an image "resample" capability. + * lib/Image.cpp (density): Obtain density from Image + rather than ImageInfo if the Image is valid. + +2003-03-01 Bob Friesenhahn + + * lib/Makefile.am : Added rules to install ImageMagick++.pc. + * lib/ImageMagick++.pc.in : Added pkgconfig file for + -lImageMagick++. + +2003-02-11 Bob Friesenhahn + + * lib/Image.cpp (colorSpace): Pass image->colorspace to + TransformRGBColorspace. + +2003-01-22 Bob Friesenhahn + + * lib/Magick++/STL.h (writeImages): Should have been invoking + WriteImages rather than WriteImage! + +2003-01-18 Bob Friesenhahn + + * lib/Magick++/Include.h: Add HSL and HWB colorspace + transformation support. + +2003-01-13 Bob Friesenhahn + + * lib/Image.cpp (colorSpace): Support colorspace transforms + other than to and from RGB by translating to RGB as an intermediate + step. + +2002-11-24 Bob Friesenhahn + + * lib/Drawable.cpp: Added DrawablePushClipPath, + DrawablePopClipPath, and DrawableClipPath. Implementation + contributed by Vladimir . + +2002-11-10 Bob Friesenhahn + + * lib/Image.cpp (colorMapSize): New method to set, or return + the colormap size. + +2002-11-08 Bob Friesenhahn + + * lib/Image.cpp (adaptiveThreshold): New method. + +2002-10-01 Bob Friesenhahn + + * lib/Magick++/STL.h (coderInfoList): Intentionally ignore missing + delegate exceptions. + +2002-09-24 Bob Friesenhahn + + * lib/Options.cpp (textEncoding): Had forgotten to implement + textEncoding! + +2002-09-16 Bob Friesenhahn + + * lib/Color.cpp (Color): Use of 'new' and 'delete' in inlines was + causing memory allocation/deallocation problems for users of the + DLL build. Problem was identified by Marc Iwan. + +2002-09-02 Bob Friesenhahn + + * lib/Image.cpp (compare): New method to compare current image + with a reference image. + +2002-08-19 Bob Friesenhahn + + * lib/Image.cpp (textEncoding): New method to allow setting the + default text encoding (e.g. "UTF-8"). + + * lib/Drawable.cpp (DrawableText): Added an alternate constructor + to allow specifying the text encoding (e.g. "UTF-8"). + +2002-08-02 Bob Friesenhahn + + * Overall: Now compiles as a DLL using Visual C++. + +2002-07-24 Bob Friesenhahn + + * lib/Image.cpp (profile): Added method to store, delete, or + retrieve named application profiles. + +2002-07-17 Bob Friesenhahn + + * lib/Image.cpp (type): Set the ImageInfo type attribute when + setting the image type. If the type attribute is set to something + other than UndefinedType (implying that the user has set a desired + output image type), then return that as the image type, otherwise + use GetImageType() to evaluate the image type. + +2002-05-20 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableTextUnderColor): New class to set the + text undercolor. When text undercolor is set, a rectangle of the + specified color is rendered under text annotations. + +2002-05-19 Bob Friesenhahn + + * Magick++ library no longer depends on iostreams at all. + +2002-04-28 Bob Friesenhahn + + * lib/Image.cpp (throwImageException): ExceptionInfo was not being + properly initialized. This could cause some errors to cause an + abort in error.c rather than throwing an exception. + +2002-04-26 Bob Friesenhahn + + * lib/Image.cpp (draw): Use draw.h drawing APIs to draw on image. + This means that MVG output no longer comes from code in + Drawable.cpp. + +2002-04-25 Bob Friesenhahn + + * lib/STL.cpp: Moved function object implementations from STL.h to + STL.cpp. + +2002-04-20 Bob Friesenhahn + + * lib/Image.cpp (getConstPixels): Changed offset parameter type + from 'unsigned int' to 'int'. + (getPixels): Changed offset parameter type from 'unsigned int' to + 'int'. + (setPixels): Changed offset parameter type from 'unsigned int' to + 'int'. + (cacheThreshold): Changed argument type from 'const long' to + 'const int'. + (matteFloodfill): Changed offset parameter type from 'const long' to + 'const int'. + + * lib/Pixels.cpp (getConst): New method to return read-only pixels. + (get): Offset parameter types changed from 'unsigned int' to 'int'. + +2002-04-19 Bob Friesenhahn + + * lib/Magick++/Drawable.h (DrawableDashOffset): Change dashoffset + type to 'double' rather than 'unsigned int' in order to match + ImageMagick. + + * lib/Drawable.cpp (DrawableDashArray): Change dasharray type to + 'double' rather than 'unsigned int' in order to match + ImageMagick. Previous 'unsigned int' methods remain for + compatability reasons. + +2002-04-14 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableCompositeImage): Always output + composite images as inlined Base64. + +2002-04-13 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableCompositeImage): If magick attribute + string is specified, then composite image is supplied to + ImageMagick as inlined Base64 rather than by MPRI reference. + + * lib/Blob.cpp (base64): Added methods to update Blob with data + from Base64-encoded string, or to return a Base64-encoded string + from Blob. Still needs documentation. + +2002-04-09 Dom Lachowicz + + * lib/Image.cpp (Image::ping): Added PingBlob function + +2002-04-07 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableDashArray::operator=): Added missing + assignment operator (fixes a bug). + (DrawableDashArray::DrawableDashArray): Added missing copy + constructor (fixes a bug). + + * lib/Image.cpp (oilPaint): Changed argument type from unsigned + int to double. + (chromaBluePrimary): Changed argument type from float to double. + (chromaGreenPrimary): Changed argument type from float to double. + (chromaRedPrimary): Changed argument type from float to double. + (chromaWhitePoint): Changed argument type from float to double. + (getConstPixels): Changed argument type of x_ & _y from 'int' to + 'unsigned int'. + (getPixels): Changed argument type of x_ & _y from 'int' to + 'unsigned int'. + +2002-04-05 Bob Friesenhahn + + * lib/Image.cpp (debug): Added method to set ImageMagick debug + flag so that it prints debugging information while it runs. + +2002-04-03 Bob Friesenhahn + + * lib/Drawable.cpp: Fixed a bunch of bugs related to + DrawableCompositeImage, DrawableFont, and inconsistencies + discovered by Gimpel lint. + +2002-04-02 Bob Friesenhahn + + * lib/Image.cpp (draw): Properly delimit individual drawing + commands so that MVG output is correct. + +2002-03-30 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableViewbox): MVG syntax wasn't correct. + + * lib/Image.cpp (draw): Fix algorithm used to append newlines to + MVG commands so that draw() may be invoked multiple times while + still producing valid MVG. + +2002-03-29 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableViewbox): New class to allow setting + the MVG output size. + +2002-03-26 Bob Friesenhahn + + * lib/Drawable.cpp (print): Changed "mpr:" to "mpri:" in order to + *finally* get DrawableCompositeImage to work as intended. + + * lib/Image.cpp (registerId): Bugfix. Register using + sizeof(MagickCore::Image) rather than sizeof(Image). + +2002-03-26 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableCompositeImage): Had failed to + initialize width and height in object to image width and height. + +2002-02-28 Bob Friesenhahn + + * lib/Magick++/STL.h (endianImage): New class to specify the + endian option for formats which support this notion (e.g. TIFF). + + * lib/Image.cpp (endian): New method to specify the endian option + for formats which support this notion (e.g. TIFF). + +2002-02-11 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableFont): Support specifying a font via + font-family, font-style, font-weight, and font-stretch. Wildcard + matches are supported. + +2002-02-06 Bob Friesenhahn + + * lib/Image.cpp (charcoal): Replace Magick++'s charcoal effect + with the output of ImageMagick's CharcoalImage function in order + to ensure consistency. + + * lib/Magick++/CoderInfo.h (MatchType): Scope the MatchType + enumeration to the CoderInfo class so these enumeration names can + be re-used elsewhere without conflict. This results in a minor + API change to the coderInfoList() templated function since + enumerations must be specified like "CoderInfo::TrueMatch" rather + than just "TrueMatch". Hopefully not a problem since this + function and class were not documented outside of the headers + until this release. + +2002-02-05 Bob Friesenhahn + + * lib/Magick++/STL.h (coderInfoList): Finally wrote some + documentation. + +2002-01-26 Bob Friesenhahn + + * lib/Options.cpp : Use DestroyImageList() rather than DestroyImage(). + + * lib/Geometry.cpp (operator =): Use GetPageGeometry() rather than + PostscriptGeometry() to parse geometry specifications containing a + page size. + +2002-01-21 Bob Friesenhahn + + * Remove bogus cast of blob data in readImages(). + +2002-01-20 Bob Friesenhahn + + * lib/Image.cpp (throwImageException): Throwing exceptions was + leaking memory. + + * lib/Exception.cpp (throwException): Throwing exceptions was + leaking memory. + + * lib/Image.cpp (replaceImage): Updated to properly handle + registration ids. + (modifyImage): Updated to properly handle registration ids. + +2002-01-15 Bob Friesenhahn + + * lib/Drawable.cpp (Magick::DrawableGravity::print): + Bugfix. Remove "Gravity" from the end of each gravity + specification string. Reported as PR#1084 by stefan@dotify.com. + +2002-01-12 Bob Friesenhahn + + * lib/Image.cpp, Magick++/Include.h: Use DestroyImageList() rather + than DestroyImages(). + +2002-01-10 Bob Friesenhahn + + * lib/Magick++/Options.h (antiAlias): Bugfix, set + drawInfo->text_antialias to control text antialiasing. + +2002-01-02 Bob Friesenhahn + + * lib/Magick++/Include.h : Imported new composition operators to + namespace: NoCompositeOp, DarkenCompositeOp, LightenCompositeOp, + HueCompositeOp, SaturateCompositeOp, ValueCompositeOp, + ColorizeCompositeOp, LuminizeCompositeOp, ScreenCompositeOp, + OverlayCompositeOp. + +2001-12-27 Bob Friesenhahn + + * lib/Image.cpp (strokePattern): New method to specify image to + use as pattern while drawing stroked-outlines of drawn objects. + (fillPattern): New method to specify image to use as pattern while + filling drawn objects. + (penTexture): Method is officially deprecated. Don't use anymore. + (penColor): Method is officially deprecated. Don't use anymore. + + * lib/Drawable.cpp (DrawablePushPattern): Support pushing + (starting) pattern definition. + (DrawablePopPattern): Support popping (terminating) pattern + definition. + +2001-12-26 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableCompositeImage): Read image + immediately if provided by filename, register with peristent + registry, and pass as perisistant image type. + (DrawableCompositeImage): Support specifying Image in memory. + Passed as perisistant image type. + +2001-12-24 Bob Friesenhahn + + * lib/Color.cpp (operator std::string): Color string buffer was + one character too short! + +2001-12-20 Bob Friesenhahn + + * lib/TypeMetric.cpp (characterWidth): Eliminate method. + (characterHeight): Eliminate method. + (all remaining methods): Change return type to 'double'. Fix + documentation in source files to reflect that units are in pixels + rather than points. + (descent): Renamed method from 'decent' to 'descent'. + +2001-11-22 Bob Friesenhahn + + * lib/Image.cpp (Magick): Invoke DestroyMagick() to clean up + ImageMagick allocations. + + * lib/Magick++/Include.h (ImageType): Added some missing enums to + Magick namespace. + +2001-11-20 Bob Friesenhahn + + * lib/Magick++/CoderInfo.h (CoderInfo): Syntax fix. + ImageMagick bug #975. + + * lib/Image.cpp (draw): Delete ostrstream data when it is no + longer needed. ImageMagick bug #988. + +2001-11-07 Bob Friesenhahn + + * lib/Image.cpp (pixelColor): Implementation didn't handle pixels + indexes correctly. Now it does. + +2001-11-04 Bob Friesenhahn + + * lib/Image.cpp (matteFloodfill): Coordinates are long values. + (floodFillOpacity): New method to floodfill opacity across pixels + matching color (within fuzz-factor) at point. Similar to + matteFloodfill except that color is selected from starting point. + +2001-10-29 Bob Friesenhahn + + * lib/Image.cpp (strokeDashArray): Change to type double. + (strokeDashOffset): Change to type double. + +2001-10-24 Bob Friesenhahn + + * lib/Geometry.cpp (Geometry): Add constructor from + MagickCore::RectangleInfo. + + * lib/Image.cpp (boundingBox): Method to return smallest bounding + box enclosing non-border pixels. + +2001-10-20 Bob Friesenhahn + + * lib/Image.cpp (getConstIndexes): Add method to obtain read-only + pixel indexes. + (getIndexes): Add method to obtain read-write pixel indexes. + (Image::Image): Send warnings from Image constructor to cerr + rather than throwing. + + * lib/Color.cpp (Color(PixelPacket&)): Change argument to const + PixelPacket& as it should have been from the beginning. + + * lib/Image.cpp (pixelColor): Reimplemented to be a const method. + +2001-10-13 Bob Friesenhahn + + * lib/Image.cpp (getConstPixels): New method for returning a + read-only pixel view. Still requires documentation. + + * lib/Magick++/STL.h (coderInfoList): Fixed compilation problem + when compiling with Visual C++. + +2001-10-06 Bob Friesenhahn + + * lib/Magick++/Color.h (scaleQuantumToDouble): Add polymorphic + version that accepts double to avoid downconversion error. + +2001-10-05 Bob Friesenhahn + + * lib/Magick++/Color.h (scaleQuantumToDouble): Cast Quantum to + double prior to division. Hopefully fix bug. + +2001-10-01 Bob Friesenhahn + + * lib/Magick++/Color.h (Color(const std::string)): Pass argument by reference. + * (operator=): Pass argument by const reference. + +2001-09-23 Bob Friesenhahn + + * lib/Magick++/STL.h (coderInfoList): New function to support + obtaining format coder information (as a list of type CoderInfo). + + * lib/CoderInfo.cpp (CoderInfo): New class to support obtaining + format coder information. + +2001-09-15 Bob Friesenhahn + + * lib/Image.cpp (depth): Use GetImageDepth and SetImageDepth + rather than just getting/setting depth attributes. + + * lib/Magick++/STL.h (opacityImage): New unary function object to + set, or attenuate, image pixel opacity throughout the image. + + * lib/Image.cpp (opacity): New method to set, or attenuate, image + pixel opacity throughout the image. + + * lib/Magick++/STL.h (typeImage): New unary function object to set + image type. + + * lib/Image.cpp (type): Added ability to set image type. + +2001-09-12 Bob Friesenhahn + + * lib/Image.cpp (write(Blob)): Tell blob to use malloc allocator. + + * lib/Blob.cpp (updateNoCopy): Added parameter so that user can + specify the allocation system (malloc or new) the memory came + from. Defaults to C++ memory allocator. + +2001-09-09 Bob Friesenhahn + + * lib/Image.cpp (fileSize): Decided to change return type to off_t + for increased range and portability. + +2001-09-08 Bob Friesenhahn + + * lib/Image.cpp (fileSize): Changed return value to double. + +2001-09-05 Bob Friesenhahn + + * lib/Image.cpp (colorMap): Allocate a colormap if it does not + already exist. + + * lib/Pixels.cpp (indexes): Don't attempt to validate image type. + + * lib/Image.cpp (colorMap): Optimized more for performance. + +2001-09-03 Bob Friesenhahn + + * lib/Image.cpp (fontTypeMetrics): New method to support + retrieving font metrics. + + * lib/TypeMetric.cpp : New class to support font metrics + information. + +2001-09-02 Bob Friesenhahn + + * lib/Magick++/Color.h (scaleDoubleToQuantum): Inline static + method made from previous ScaleDoubleToQuantum #define. + (scaleQuantumToDouble): Inline static method made from previous + ScaleQuantumToDouble #define. Helps avoid possibility of clash + with user code. + +2001-08-25 Bob Friesenhahn + + * lib/Image.cpp (colorMap): Automagically extend colormap if + specified index is past end of current colormap. Colormap is + limited to a maximum depth of QuantumRange entries. + +2001-08-19 Bob Friesenhahn + + * lib/Image.cpp (clipMask): New method to add a clip mask to the + image. Adds clipping to any image operation wherever the clip + mask image is tranparent. + +2001-08-15 Bob Friesenhahn + + * lib/Drawable.cpp (print): Add single quotes around file names + and font specifications. + +2001-07-07 Bob Friesenhahn + + * lib/Image.cpp (read): Ensure that only a single image frame is read. + +2001-07-05 Bob Friesenhahn + + * lib/Magick++/STL.h (flattenImages): New function to flatten a + layered image. + + * lib/Montage.cpp (Montage): Montage initial defaults are no + longer drawn from ImageInfo. MontageInfo structure is entirely + filled out by updateMontageInfo(); + +2001-07-03 Bob Friesenhahn + + * lib/Montage.cpp (updateMontageInfo): Bugfix; colors which were + intentionally specified as invalid (unset) were being ignored. + This produced unattractive label text when doing a montage. + +2001-07-01 Bob Friesenhahn + + * lib/Magick++/STL.h (medianFilterImage): Changed argument from + unsigned int to const double. + (fillColorImage): New method. + (strokeColorImage): New method. + (isValidImage): New method. + + * lib/Magick++/Image.h (edge): Change argument from unsigned int to double. + (medianFilter): Changed argument from unsigned int to const double. + + * lib/Magick++/STL.h (edgeImage): Change argument from unsigned int to double. + + * demo/demo.cpp (main): Updated to match PerlMagick demo. + +2001-06-23 Bob Friesenhahn + + * lib/Magick++/STL.h (shaveImage): New function to shave edges from image. + + * lib/Image.cpp (shave): New method to shave edges from image. + +2001-06-22 Bob Friesenhahn + + * lib/Image.cpp (quantize): Remove conditions on whether + quantization should be done. Now quantization is always done. + +2001-06-14 Bob Friesenhahn + + * lib/Magick++/Image.h (blur,charcoal,emboss,sharpen): Changed + radius and sigma parameters to match current ImageMagick defaults. + +2001-02-22 Bob Friesenhahn + + * lib/Options.cpp (updateDrawInfo): The updateDrawInfo() method + was no longer needed. Due to ImageMagick changes, calling it was + causing some options to be lost. + +2001-01-31 Bob Friesenhahn + + * lib/Image.cpp (fillRule): New method to specify the rule to use when filling drawn objects. + +2001-01-25 Bob Friesenhahn + + * lib/Image.cpp (erase): New method to reset image to background + color. + (strokeAntiAlias): New method to control antialiasing of stroked + objects. + +2001-01-24 Bob Friesenhahn + + * lib/Image.cpp (channel): Renamed method from 'layer' to match + equivalent change in ImageMagick (ChannelImage). Enumeration + names *Layer renamed to *Channel. + +2001-01-13 Bob Friesenhahn + + * lib/Magick++/Montage.h (strokeColor): New method. + (fillColor): New method. + + * lib/Image.cpp (replaceImage): Revised logic so that an inValid + image should be returned if a NULL pointer is passed. Before this + change the existing image was preserved. + (label): Work-around ImageMagick SetImageAttribute bug. + +2001-01-10 Bob Friesenhahn + + * lib/Image.cpp : Adjusted to ImageMagick animation parameter API change. + +2000-12-31 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableCompositeImage): Support specifying + composition rule. + +2000-12-27 Bob Friesenhahn + + * lib/Image.cpp (draw): Bugfix - the primitive string was not + properly null terminated. It is a wonder that the code usually + worked at all. Thanks to afatela@marktest.pt for reporting it. + +2000-12-24 Bob Friesenhahn + + * lib/Magick++/STL.h (deconstructImages): New STL function for + deconstructing an image list to assist with creating an animation. + (mosaicImages): New STL function for inlaying an image list to + form a single coherent picture. + +2000-12-17 Bob Friesenhahn + + * lib/Image.cpp (convolve): New method to convolve image using + user-supplied convolution matrix. + (unsharpmask): New method to replace image with a sharpened + version of the original image using the unsharp mask algorithm. + +2000-12-14 Bob Friesenhahn + + * : Adapted to ImageMagick API change which eliminates AnnotateInfo. + +2000-12-10 Bob Friesenhahn + + * lib/Magick++/STL.h (annotateImage): Brought into sync with + annotate methods in Image. + +2000-12-09 Bob Friesenhahn + + * lib/Image.cpp (annotate): Usage of Geometry parameter was + incorrect. Geometry parameter is used to specify bounding area. + This changes the interpretation for two of the annotate methods + (which probably weren't usable before). + +2000-11-29 Bob Friesenhahn + + * lib/Magick++/Color.h (alphaQuantum): Bugfix. Due to change in + treatment of opacity member, alphaQuantum() was not allowing value + to be set. + +2000-11-25 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableFillRule): New class to specify fill + rule (see SVG's fill-rule). + (DrawableDashOffset): New class to specify initial offset in dash + array. + (DrawableDashArray): New class to specify a stroke dash pattern. + (DrawableStrokeLineCap): New class to specify the shape to be used + at the end of open subpaths when they are stroked. + (DrawableStrokeLineJoin): New class to specify the shape to be + used at the corners of paths (or other vector shapes) when they + are stroked. + (DrawableMiterLimit): New class to specify extension limit for + miter joins. + +2000-11-24 Bob Friesenhahn + + * lib/Image.cpp (annotate): Reimplement text rotation using affine + member of AnnotateInfo. + (strokeDashOffset): New method for specifying the dash offset to use for + drawing vector objects. Similar to SVG stroke-dashoffset. + (strokeDashArray): New method for specifying the dash pattern to use + for drawing vector objects. Similar to SVG stroke-dasharray + (strokeLineCap): New method to specify the shape to be used at the end + of open subpaths when they are stroked. Similar to SVG + stroke-linecap. + (strokLineJoin): New method to specify the shape to be used at the + corners of paths (or other vector shapes) when they are + stroked. Similar to SVG stroke-linejoin. + (strokeMiterLimit): New method to specify the miter limit when joining + lines using MiterJoin. Similar to SVG stroke-miterlimit. + (strokeWidth): Renamed lineWidth method to strokeWidth. + +2000-10-26 Bob Friesenhahn + + * lib/Magick++/Drawable.h (DrawableCompositeImage): Add a + short-form constructor to support specifying image location and + name, but without specifying rendered size (use existing image + size). + +2000-10-16 Bob Friesenhahn + + * lib/Magick++/Drawable.h (DrawablePopGraphicContext): New class + to pop graphic context. + (DrawablePushGraphicContext): New class to push graphic context. + + * lib/Drawable.cpp (DrawableStrokeAntialias): New class to set + stroke antialiasing. + (DrawableTextAntialias): New class to set text antialiasing. + +2000-10-15 Bob Friesenhahn + + * lib/Image.cpp (transformOrigin): New method to set origin of + coordinate system for use when annotating with text or drawing + (transformRotation): New method to set rotation for use when + annotating with text or drawing + (transformScale): New method to set scale for use when annotating + with text or drawing. + (transformSkewX): New method to set skew for use in X axis when + annotating with text or drawing. + (transformSkewY): New method to set skew for use in Y axis when + annotating with text or drawing. + (transformReset): New method to reset transformation to default. + + * lib/Drawable.cpp (DrawablePath): New class for drawing SVG-style + vector paths. + (PathArcArgs): New class. Argument for PathArcArgs & PathArcAbs. + (PathArcAbs): New class. Draw arc using absolute coordinates. + (PathArcRel): New class. Draw arc using relative coordinates. + (PathClosePath): New class. Close drawing path. + (PathCurvetoArgs): New class. Argument class for PathCurvetoAbs & + PathCurvetoRel. + (PathCurvetoAbs): New class. Cubic bezier, absolute coordinates + (PathCurvetoRel): New class. Cubic bezier, relative coordinates + (PathSmoothCurvetoAbs): New class. Cubic bezier, absolute + coordinates + (PathSmoothCurvetoRel): New class. Cubic bezier, relative + coordinates + (PathQuadraticCurvetoArgs): New class. Argument class for + PathQuadraticCurvetoAbs and PathQuadraticCurvetoRel. + (PathQuadraticCurvetoAbs): New class. Quadratic bezier, absolute + coordinates + (PathQuadraticCurvetoRel): New class. Quadratic bezier, relative + coordinates + (PathSmoothQuadraticCurvetoAbs): New class. Quadratic bezier, + absolute coordinates + (PathSmoothQuadraticCurvetoRel): New class. Quadratic bezier, + relative coordinates + (PathLinetoAbs): New class. Line to, absolute coordinates + (PathLinetoRel): New class. Line to, relative coordinates + (PathLinetoHorizontalAbs): New class. Horizontal lineto, absolute + coordinates + (PathLinetoHorizontalRel): New class. Horizontal lineto, relative + coordinates + (PathLinetoVerticalAbs): New class. Veritical lineto, absolute + coordinates. + (PathLinetoVerticalRel): New class. Vertical lineto, relative + coordinates. + (PathMovetoAbs): New class. Moveto, absolute coordinates + (PathMovetoRel): New class. Moveto, relative coordinates + +2000-10-10 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableSkewX): New object to apply skew in X direction. + (DrawableSkewY): New object to apply skew in Y direction. + +2000-10-09 Bob Friesenhahn + + * lib/Image.cpp (edge): Change argument from 'unsigned int' to + 'double' in order to match ImageMagick API. + +2000-10-08 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableCompositeImage): Renamed from + DrawableImage. + (DrawableTextDecoration): Renamed form DrawableDecoration. + (all-classes): Complete re-write to write the drawing command to a + stream when draw() is invoked rather than at object construction + time. This may be somewhat slower for individual draw operations + but should be at least as fast for lists of drawing commands, + and is more flexible going into the future. Drawable classes now + inherit from DrawableBase but are passed into STL lists and Image + draw() methods via the surrogate class Drawable. The upshot of + all this is that the existing published API has not been altered + but things work much differently under the covers. + +2000-10-05 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableStrokeColor): Renamed from DrawableStroke + (DrawableFillColor): Renamed from DrawableFill + (DrawableRotation): New class to influence object rotation. + (DrawableScaling): New class to influence object scaling. + (DrawableTranslation): New class to influence object translation. + +2000-10-04 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableAffine): New class to influence object + scaling, rotation, and translation (as defined by SVG XML). + (DrawableAngle): New class to influence drawing angle. + (DrawableDecoration): New class to influence text decoration such + as underline. + (DrawableFill): New class to set object filling color. + (DrawableFillOpacity): New class to set opacity to use when + filling object. + (DrawableFont::): New class to set font. + (DrawableGravity): New class to set text placement gravity. + (DrawablePointSize): New class to set font point size. + (DrawableStroke): New class to set drawing stroke color. + (DrawableStrokeOpacity): New class to set drawing stroke opacity. + (DrawableStrokeWidth): New class to set drawing stroke width. + +2000-10-03 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableImage): Added width and height + parameters to specify size to scale rendered image to. This is + actually a bug-fix since it seems that the correct drawing command + was no longer being generated. + +2000-09-30 Bob Friesenhahn + + * lib/Image.cpp (read): New overloaded method to read an image + based on an array of raw pixels, of specified type and mapping, in + memory. + (write): New overloaded method to write image to an array of + pixels, of specified type and mapping. + (Image): New overloaded constructor to construct an image based on + an array of raw pixels, of specified type and mapping, in memory. + +2000-09-27 Bob Friesenhahn + + * lib/Image.cpp (colorize): API change to match change in + ImageMagick. Now accepts percentage of red, green, and blue to + colorize with using specified pen color. + +2000-09-20 Bob Friesenhahn + + * lib/Magick++/Drawable.h: Reverted Coordinate implemenation back + from and STL pair based implementation to a simple class. Maybe + this will improve portability. It is more understandable anyway. + +2000-09-18 Bob Friesenhahn + + * lib/Options.cpp : Bugfix. Some DrawInfo attributes were not + being updated. This lead to options like fontPointsize not + changing the font. + +2000-08-26 Bob Friesenhahn + + * lib/Magick++/STL.h (blurImage, charcoalImage, embossImage, + sharpenImage): Expand order_ argument to radius_ & sigma_ + arguments for more control (matches ImageMagick API change). + + * lib/Image.cpp (blur, charcoal, emboss, sharpen): Expand order_ + argument to radius_ & sigma_ arguments for more control (matches + ImageMagick API change). + +2000-08-24 Bob Friesenhahn + + * lib/Image.cpp (read): Check returned Image for embedded + exception, as well as the existing parameter check. This fixes + the bug that warnings are not reported. + +2000-07-26 Bob Friesenhahn + + * test/*.cpp demo/*.cpp: Added call to MagickIncarnate() to set + ImageMagick install location for Windows. Hopefully this hack can + be removed someday. + +2000-07-20 Bob Friesenhahn + + * lib/Image.cpp (colorFuzz): Changed type to 'double' from + 'unsigned int' to match change in ImageMagick. + + * lib/Color.cpp (Color*): Added copy constructor from base class. + (operator =): Added assignment operator from base class. + +2000-06-28 Bob Friesenhahn + + * lib/Magick++/Include.h : Changed enumeration FilterType to + FilterTypes, and QuantumTypes to QuantumType in order to match + last-minute API change in ImageMagick. + +2000-06-22 Bob Friesenhahn + + * lib/Magick++/Pixels.cpp (indexes): Bugfix, use GetCacheViewIndexes() + rather than GetIndexes(). + +2000-05-23 Bob Friesenhahn + + * lib/Magick++/Montage.h (gravity): Type of gravity_ argument, and + return value changed from 'unsigned int' to GravityType. + +2000-04-17 Bob Friesenhahn + + * lib/Drawable.cpp (DrawableArc, DrawableBezier, DrawablePolyline, + RoundRectangle): Added support for new drawing objects. + +2000-04-16 Bob Friesenhahn + + * lib/Drawable.cpp: Removed all public methods which accept + Coordinate arguments except those that accept lists of + Coordinates. Converted remaining drawable object methods into + individual classes which inherit from Drawable (e.g. "circle" + becomes "DrawableCircle"). The constructor for each class is + compatible with the original method. This results in annoying + changes to user code but provides more implementation flexibility. + +2000-04-09 Bob Friesenhahn + + * lib/Drawable.cpp + (fillEllipse,fillRectangle,fillCircle,fillPolygon): Removed + methods. Object filling is now based on whether fillColor or + penTexture are valid or not. This reflects ImageMagick internal + changes. + + * lib/Image.cpp (fillColor): New method to specify fill color when + drawing objects. + (strokeColor): New method to specify outline color when drawing + objects. + (penColor): Setting penColor now sets fillColor and + strokeColor. Getting penColor retrieves the value of + strokeColor. This supports backwards compatability. + +2000-03-28 Bob Friesenhahn + + * lib/Image.cpp (lineWidth): Type changed from unsigned int to double. + +2000-03-08 Bob Friesenhahn + + * lib/Magick++/STL.h (Magick): + +2000-03-07 Bob Friesenhahn + + * lib/Magick++/STL.h (blurImage,charcoalImage,edgeImage,embossImage, + reduceNoiseImage,sharpenImage): Modified to support order of the + pixel neighborhood. Backward compatable function objects constructors + are provided for embossImage, and reduceNoiseImage. + + * lib/Image.cpp (blur,charcoal,edge,emboss,reduceNoise,sharpen): + Now accept unsigned int argument which represents the order of the + pixel neighborhood (e.g. 3). This is not a backwards compatable + change, however, backward compatable methods are provided for emboss, + and reduceNoise. + +2000-03-02 Bob Friesenhahn + + * lib/Magick++/Pixels.h (Pixels): Moved Image pixel methods to + Pixels class. + +2000-02-29 Bob Friesenhahn + + * lib/Image.cpp (annotate): Re-wrote to improve performance. + (draw): Re-wrote to improve performance. + +2000-02-26 Bob Friesenhahn + + * lib/Drawable.cpp (text): Bugfix: support spaces in annotation text. + +2000-02-23 Bob Friesenhahn + + * lib/Magick++/STL.h (gaussianBlurImage): New function object to + Gaussian blur image. + + * lib/Image.cpp (gaussianBlur): New method to Gaussian blur image. + +2000-02-16 Bob Friesenhahn + + * lib/Image.cpp : Call-back based LastError class is eliminated in + favor of ImageMagick 5.2's re-entrant ExceptionInfo reporting. + This should make Magick++ thread safe under Win32. + +2000-02-08 Bob Friesenhahn + + * lib/Image.cpp (floodFillTexture): Fixed bug due to pixel pointer + becoming invalid in ImageMagick function. + +2000-01-24 Bob Friesenhahn + + * lib/Image.cpp : Added locking to reference counting to ensure + thread (pthread) safety. + + * lib/Blob.cpp : Added locking to reference counting to ensure + thread (pthread) safety. + + * lib/LastError.cpp: Added support for thread specific data + (pthreads) so that error reporting is thread safe. + + * lib/Magick++/Thread.h: Added thread wrapper class to provide + thread-safe locking (pthreads) to Magick++. + +2000-01-19 Bob Friesenhahn + + * lib/Image.cpp: Added methods getPixels, setPixels, syncPixels, + readPixels, and writePixels, in order to provide low-level access + to Image pixels. This approach (direct wrapper around ImageMagick + functions) does not mean that the planned object-oriented wrapper + has been forgotten, only that this wrapper is not ready yet, and + users need to manipulate pixels *now*. + +2000-01-16 Bob Friesenhahn + + * lib/LastError.cpp: Complete re-implementation of LastError so + that it hides its implementation. Also assures that all memory is + explicitly deallocated at program exit to avoid the appearance of + a leak. + +2000-01-11 Bob Friesenhahn + + * lib/Image.cpp (size): Bug-fix. Set image columns and rows as + well as image options columns and rows. + + * lib/Image.cpp :Depth parameters are now all unsigned in for consistency. + + * lib/Image.cpp (write): Parameters for writing Blobs re-arranged + again to hopefully be more sensible. + + * lib/Magick++/STL.h: Bug-fix. Re-number scenes from zero when linking + image range in container into a list. This provides expected results. + +1999-12-31 Bob Friesenhahn + + * lib/Image.cpp + (write): Additional overloaded methods for BLOBs. + (read): Additional overloaded methods for BLOBs. Re-ordered + parameters for one existing method. + (Image): Additional overloaded methods for BLOBs. Re-ordered + parameters for one existing method. + +1999-12-28 Bob Friesenhahn + + * lib/Image.cpp (floodFillTexture): Changed coordinates to unsigned. + +1999-12-21 Bob Friesenhahn + + * lib/Image.cpp (medianFilter): New method. + +1999-12-18 Bob Friesenhahn + + * lib/Image.cpp (density): Bug fix. Was not setting image x & y density. + +1999-11-30 Bob Friesenhahn + + * lib/Image.cpp (page): psPageSize() is renamed to page() and now + properly returns the attribute from the image. + +1999-11-25 Bob Friesenhahn + + * lib/Image.cpp: Rename transformColorSpace() to colorSpace(). + Added colorSpace() accessor method. + +1999-11-24 Bob Friesenhahn + + * lib/Color.cpp: Re-implemented PixelPacket pointer so that it is + never NULL and added a 'valid' field for tracking object validity. + +1999-11-13 Bob Friesenhahn + + * lib/Image.cpp (quantizeError): Eliminated method. + +1999-11-10 Bob Friesenhahn + + * lib/Image.cpp (annotate & draw): Changed implementation to + reflect change to the way AnnotateInfo is managed by ImageMagick. + +1999-11-07 Bob Friesenhahn + + * lib/Image.cpp (cacheThreshold): New method to set the pixel + cache threshold. + + * lib/Magick++/Include.h (Magick): Added new enumerations from + classify.h. + +1999-10-28 Bob Friesenhahn + + * lib/Magick++/Options.h (fontPointsize): Argument is now a double + to match change in ImageMagick. + + * lib/Image.cpp (fontPointsize): Argument is now a double to match + change in ImageMagick. + +1999-10-21 Bob Friesenhahn + + * lib/Blob.cpp (BlobRef): Bugfix -- start blob reference count at + one rather than zero. + +1999-10-19 Bob Friesenhahn + + * lib/Image.cpp (Image): Fixed Image constructors from Blob. The + image reference was not being instantiated as it should have been, + causing a crash. + +1999-10-05 Bob Friesenhahn + + * lib/Blob.cpp: All blob length parameters are now of type size_t. + + * lib/Image.cpp (write): Length estimate is now of type size_t. + +1999-09-20 Bob Friesenhahn + + * lib/Image.cpp (rotate): No longer accepts a crop option since + ImageMagick no longer supports this. + (shear): No longer accepts a crop option since ImageMagick no + longer supports this. + +1999-09-18 Bob Friesenhahn + + * lib/Image.cpp: + (rotate): No longer accepts sharpen argument. + User must sharpen separately if desired. This change is due to a + similar change in ImageMagick 5.0. + (condense): Removed method. + (uncondense): Removed method. + (condensed): Removed method. + (pixelColor): Adapted to 5.0. + + * lib/Magick++/Color.h : Rewrote to efficiently use ImageMagick + 5.0's PixelPacket color representation. + + * lib/Color.cpp : Rewrote to efficiently use ImageMagick 5.0's + PixelPacket color representation. + +1999-09-12 Bob Friesenhahn + + * lib/Image.cpp (condensed): Bug fix. The condensed() method was returning the opposite bool value than it should. Oops! + +1999-09-07 Bob Friesenhahn + + * lib/Magick++/Include.h (MagickCore): Eliminated requirement for + including . + +1999-08-07 Bob Friesenhahn + + * lib/Image.cpp: Added accessor methods for other key ImageMagick + structs. + + * lib/Options.cpp (penTexture): Fixed bug with removing texture + caused by change in Image constructor. + + * lib/Image.cpp: Changed strategy such that an Image containing a + null MagickCore::Image pointer is never constructed except for + under error conditions. Removed existing checks for null image + pointer on attribute methods. + + Use image() and constImage() accessor methods as part of Image + implementation in order to clean-up code and ensure + const-correctness. + +1999-08-03 Bob Friesenhahn + + * lib/Magick++/STL.h (Magick): Added STL function readImages(). + Not tested yet. + (Magick): Added STL function writeImages(). Not tested yet. + + * lib/Image.cpp: Removed support for 'text' attribute as this is + no longer present in ImageMagick as of 4.2.8. + +1999-07-21 Bob Friesenhahn + + * lib/Image.cpp (condense): Skip condensing image if already + condensed. + (uncondense): Skip uncondensing image if not condensed. + (condensed): New method to test if image is condensed. + (classType): New method which supports conversion of the image + storage class. May result in loss of color information + (quantization is used) if a DirectClass image is converted to + PseudoClass. + +1999-07-18 Bob Friesenhahn + + * lib/Magick++/Color.h (Magick::Color): Color parameters are now + stored in a MagickCore::RunlengthPacket structure which is + referenced via a pointer. This structure is either allocated by a + Magick::Color constructor or passed as an argument to a + Magick::Color constructor so that it may refer to a + MagickCore::Image pixel. The owner of the structure is managed so + that the structure is only deleted if it was allocated by + Magick::Color. + +1999-07-09 Bob Friesenhahn + + * overall : Removed 'Magick' prefix from all source file + names. Moved class headers to Magick++ subdirectory. This should + not break any code using the documented interface (via + Magick++.h). + +1999-07-08 Bob Friesenhahn + + * lib/MagickImage.cpp (composite): Support composition placement + by gravity like PerlMagick does. + +1999-07-07 Bob Friesenhahn + + * lib/MagickImage.cpp (Image): Added constructors to construct an + Image from a BLOB. + +1999-07-06 Bob Friesenhahn + + * tests/manipulate.cpp (main): Wrote a basic sanity test for + reading and writing BLOBS. + +1999-06-21 Bob Friesenhahn + + * lib/MagickImage.cpp (read): Added support for reading an encoded + image stored in a BLOB. Uses new ImageMagick APIs introduced on + July 21, 1999. + (write): Added support for writing an encoded image to a BLOB. + +1999-06-16 Bob Friesenhahn + + * lib/MagickInclude.h : Use new interface to + ImageMagick to avoid namespace-induced problems. + + * configure.in : CPPFLAGS and LDFLAGS specified via the + environment take precidence over flags from Magick-config. + +1999-05-31 Bob Friesenhahn + + * lib/MagickSTL.h (mapImages): New algorithm to map the sequence + of images to the color map of a provided image. + (quantizeImages): New algorithm to quantize a sequence of images + to a common color map. + +1999-05-24 Bob Friesenhahn + + * lib/MagickBlob.cpp (updateNoCopy): New method to allow derived + classes to insert data into the base class without making a copy + of the data. This represents a transfer of ownership of the data + from the derived class to the base class. + +1999-05-23 Bob Friesenhahn + + * lib/MagickColor.cpp (operator =): Adapted to new ImageMagick + 4.2.6 as of 5/23/99 which removes X11 compatability functions. + + * lib/MagickGeometry.cpp (operator =): Adapted to new ImageMagick + 4.2.6 as of 5/23/99 which removes X11 compatability functions. + +1999-05-17 Bob Friesenhahn + + * lib/MagickBlob.cpp (Blob): Support default constructor for Blob. + +1999-05-16 Bob Friesenhahn + + * lib/MagickSTL.h (transformColorSpaceImage): New unary function object + to invoke transformColorSpace on STL container object. + + * lib/MagickImage.cpp (transformColorSpace): New method to + transform the image data to a new colorspace. + +1999-05-15 Bob Friesenhahn + + * lib/MagickImage.cpp (ping): Re-implemented to match (requested) + API change in ImageMagick 4.2.5. Method signature has changed to + be like 'read'. + (annotate): Added two new overloaded methods for text annotation + in order to support the new rotated text capability in ImageMagick + 4.2.5. To accomplish this, the default for gravity had to be + removed from several methods. This may impact existing code. + Still not sure if this is the best set of method signatures. + +1999-05-13 Bob Friesenhahn + + * lib/MagickImage.cpp (ping): New method to obtain image size in + bytes and geometry without the overhead of reading the complete + image. + (uncondense): New method to uncompress run-length encoded pixels + into a simple array to make them easy to operate on. + +1999-05-12 Bob Friesenhahn + + * lib/MagickImage.cpp (comment): Passing an empty string as the + comment results in no comment at all rather than a comment with no + data. + +1999-05-11 Bob Friesenhahn + + * lib/MagickImage.cpp (iccColorProfile): Implemented method to set + ICC color profile from opaque object in memory (must be formatted + outside of Magick++). + (iptcProfile): Implemented method to set IPTC profile from opaque + object in memory (must be formatted outside of Magick++). + + * lib/MagickBlob.cpp: New class to support managing user-supplied + opaque Binary Large OBjects (BLOBS) in the API. Reference counted + to improve semantics and to possibly reduce memory consumption. + +1999-05-01 Bob Friesenhahn + + * lib/Makefile.am (libMagick): Updated to use libtool 1.3 so that + shared library can be built. + +1999-04-25 Bob Friesenhahn + + * lib/MagickImage.cpp (montageGeometry): Return Magick::Geometry + rather than std::string. + +1999-04-19 Bob Friesenhahn + + * lib/MagickColor.cpp (alpha): Added support for setting alpha via + scaled-double to the Color class. The new method name is 'alpha'. + +1999-04-13 Bob Friesenhahn + + * lib/MagickColor.cpp: Added support for setting an alpha value + (unscaled Quantum only) for use on DirectColor images that have + matte enabled. This requires ImageMagick 4.2.2 dated April 13, + 1999 or later to compile since Cristy added a special flag to + allow testing to see if the user has specified an opacity value: + "I added XColorFlags to magick/classify.h. If DoMatte is set in + color->flags then the opacity value is valid in color->pixel." + +1999-04-11 Bob Friesenhahn + + * demo/flip.cpp (main): New file. Demonstrates use of flipImage + function object as well as morphImages algorithm. + +1999-04-10 Bob Friesenhahn + + * tests/color.cpp : New file to support testing the Magick::Color + classes. + + * lib/MagickOptions.cpp: The ImageInfo filter member is now + ignored by ImageMagick (as of ImageMagick 4.2.2 April 10, 1998) so + support for setting it is removed. The Image filter member is + still updated. According to Cristy, this ImageMagick version + removes automatic sharpening of resized images. The blur member + is added to the Image structure. A blur value < 1 causes the image + to be sharpened when resizing while a value > 1 leaves the image + blurry. Magick++ does not yet support the blur member. + + diff --git a/ImageMagick-6.9.12-44/Magick++/INSTALL b/ImageMagick-6.9.12-44/Magick++/INSTALL new file mode 100644 index 0000000..aac5654 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/INSTALL @@ -0,0 +1,164 @@ + + + Installing Magick++ + +General + +In order to compile Magick++ you must have access to a standard C++ +implementation. The author uses gcc 3.1 (GNU C++) which is available under +UNIX and under the Cygwin UNIX-emulation environment for Windows. Standards +compliant commercial C++ compilers should also work fine. Most modern C++ +compilers for Microsoft Windows or the Mac should work (project files are +provided for Microsoft Visual C++ 6.0). + +It was decided that Magick++ will be around for the long-haul, so its API +definition depends on valuable C++ features which should be common in all +current and future C++ compilers. The compiler must support the following +C++ standard features: + + * templates + * static constructors + * C++-style casts (e.g. static_cast) + * bool type + * string class () + * exceptions () + * namespaces + * Standard Template Library (STL) (e.g. , ) + +The author has personally verified that Magick++ compiles and runs using the +following compiler/platform combinations: + + Tested Configurations + + Operating System Architecture Compiler + SunOS 5.6, 5.7, 5.8 + ("Solaris 2.6, 7, & 8) SPARC GCC 3.0.4 + SunOS 5.7 ("Solaris 7") SPARC Sun Workshop 5.0 C++ + + SunOS 5.8 ("Solaris 8") SPARC Sun WorkShop 6 update 2 C++ + 5.3 + FreeBSD 4.0 Intel Pentium II GCC 2.95 + + Windows NT 4.0 SP6a Intel Pentium II Visual C++ 6.0 Standard + Edition + + Windows XP Intel Pentium IV Visual C++ 6.0 Standard + Edition Service Pack 5 + Windows '98 + Cygwin 1.3.10 Intel Pentium III GCC 2.95.3-5 + Windows NT 4.0 SP6a Intel Pentium II GCC 2.95.3-5 + Windows XP + Cygwin 1.3.10 Intel Pentium IV GCC 2.95.3-5 + +Users of Magick++ have reported that the following configurations work with +Magick++: + + Other Known Working Configurations + + Operating + System Architecture Compiler Reported By + Red Hat i386 & alpha EGCS 1.1.2 Dr. Alexander Zimmermann + Linux 6.0 + Red Hat i386 GCC 2.95.2 Dr. Alexander Zimmermann + Linux 7.0 + Red Hat i386 GCC "2.96" ??? + Linux 7.0 snapshot + Red Hat Dr. Alexander Zimmermann + Linux 7.Xi386 & alpha GCC 3.0 + SGI IRIX MIPS IRIX C++ Albert Chin-A-Young + 6.2, 6.5 7.3.1.2m + SunOS Sun WorkShop Albert Chin-A-Young + 5.5.1 SPARC CC 5.0 + SunOS + 5.6, 5.7,SPARC Sun Forte CC Albert Chin-A-Young + 5.8 5.3 + HP-UX PA-RISC HP-UX aCC Albert Chin-A-Young + 11.00 A.03.30 + Mac OS 9 PowerPC CodeWarrior Leonard Rosenthol + Professional + Release 6 + Mac OS X GCC 2.95.2 + 10.1 PowerPC (apple gcc Cristy + "Darwin" -926) + +Please let me know if you have successfully built and executed Magick++ +using a different configuration so that I can add to the table of verified +configurations. + + ------------------------------------------------------------------------ + + Unix/Linux + +Building From Source + +Magick++ is now built using the ImageMagick configure script and Makefiles. +Please follow the installation instructions provided by its README.txt file. +The following instructions pertain to the Magick++ specific configuration +and build options. + +To install ImageMagick plus Magick++ under Unix, installation should be +similar to + +./configure [ --prefix=/prefix ] +make +make install + +The library is currently named similar to 'libMagick++.a' (and/or +libMagick++.so.5.0.39) and is installed under prefix/lib while the headers +are installed with Magick++.h being installed in prefix/include and the +remaining headers in prefix/include/Magick++. + +To influence the options the configure script chooses, you may specify +'make' option variables when running the configure script. For example, the +command + + + ./configure CXX=CC CXXFLAGS=-O2 LIBS=-lposix + +specifies additional options to the configure script. The following table +shows the available options. + + Environment Variables That Effect Configure + + Make Option + Variable Description + + CXX Name of C++ compiler (e.g. 'CC -Xa') to use + compiler 'CC -Xa' + CXXFLAGS Compiler flags (e.g. '-g -O2') to compile with + + CPPFLAGS Include paths (-I/somedir) to look for header + files + Library paths (-L/somedir) to look for + libraries. Systems that support the notion of a + LDFLAGS library run-path may additionally require + -R/somedir or '-rpath /somedir' in order to + find shared libraries at run time. + LIBS Extra libraries (-lsomelib) required to link + +Installing Linux RPMs + +Please note that the default version of the C++ compiler delivered with the +system may not be sufficient to support Magick++. Use of GCC 2.95 or later is +strongly recommended under Linux. + ------------------------------------------------------------------------ + + Windows '9X, NT, 2000, ME, & XP + +Visual C++ + +Windows '95 through Windows XP are supported by the ImageMagick source +package for NT available in the 'win2k' subdirectory of the ImageMagick ftp +site (and mirrors). The ImageMagick source package for NT provides sources +to ImageMagick, Magick++, add-on libraries (e.g. JPEG), and a ready-made +Visual C++ 6.0 build environment. Please read the configuration and build +instructions in README.txt (under the heading "Windows Win2K/95 VISUAL C++ +6.0 COMPILATION") in order to build Magick++. + +Cygwin & GCC + +It is possible to build both ImageMagick and Magick++ under the Cygwin +Unix-emulation environment for Windows NT. Obtain and install Cgywin from +http://www.cygwin.com/ . An X11R6 environment for Cygwin is available +from http://www.cygwin.com/xfree/ .To build using Cygwin and GCC, follow +the instructions for building under Unix. ImageMagick and Magick++ do not +yet include support for building Windows DLLs under Cygwin so do not enable +dynamic libraries when building ImageMagick. diff --git a/ImageMagick-6.9.12-44/Magick++/LICENSE b/ImageMagick-6.9.12-44/Magick++/LICENSE new file mode 100644 index 0000000..6f3b522 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/LICENSE @@ -0,0 +1,24 @@ + +Copyright 1999 - 2002 Bob Friesenhahn + +Permission is hereby granted, free of charge, to any person +obtaining a copy of the source files and associated documentation +files ("Magick++"), to deal in Magick++ without restriction, +including without limitation of the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of +Magick++, and to permit persons to whom the Magick++ is furnished +to do so, subject to the following conditions: + +This copyright notice shall be included in all copies or +substantial portions of Magick++. The copyright to Magick++ is +retained by its author and shall not be subsumed or replaced by any +other copyright. + +The software is provided "as is", without warranty of any kind, +express or implied, including but not limited to the warranties of +merchantability, fitness for a particular purpose and +noninfringement. In no event shall Bob Friesenhahn be liable for +any claim, damages or other liability, whether in an action of +contract, tort or otherwise, arising from, out of or in connection +with Magick++ or the use or other dealings in Magick++. + diff --git a/ImageMagick-6.9.12-44/Magick++/Makefile.am b/ImageMagick-6.9.12-44/Magick++/Makefile.am new file mode 100644 index 0000000..9a8c575 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/Makefile.am @@ -0,0 +1,266 @@ +# +# Top Makefile for Magick++ +# +# Copyright Bob Friesenhahn, 1999, 2000, 2002, 2004, 2008 +# + +# AM_CPPFLAGS += -I$(top_srcdir)/Magick++/lib + +MAGICKPP_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/Magick++/lib + +if WITH_MAGICK_PLUS_PLUS +MAGICKPP_LIBS = Magick++/lib/libMagick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la +MAGICKPP_LDADD = $(MAGICKPP_LIBS) $(top_builddir)/magick/libMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la $(top_builddir)/wand/libMagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la +MAGICKPP_CHECK_PGRMS = $(MAGICKPP_CHECK_PGRMS_OPT) +MAGICKPP_MANS = $(MAGICKPP_MANS_OPT) +MAGICKPP_PKGCONFIG = $(MAGICKPP_PKGCONFIG_OPT) +MAGICKPP_SCRPTS = $(MAGICKPP_SCRPTS_OPT) +MAGICKPP_TESTS = $(MAGICKPP_TEST_SCRPTS_OPT) +MAGICKPP_TOP_INCHEADERS = $(MAGICKPP_TOP_INCHEADERS_OPT) +MAGICKPP_INCHEADERS = $(MAGICKPP_INCHEADERS_OPT) +else +MAGICKPP_LIBS = +MAGICKPP_LDADD = +MAGICKPP_CHECK_PGRMS = +MAGICKPP_MANS = +MAGICKPP_PKGCONFIG = +MAGICKPP_SCRPTS = +MAGICKPP_TESTS = +MAGICKPP_TOP_INCHEADERS = +MAGICKPP_INCHEADERS = +endif + +MAGICKPP_SCRPTS_OPT = \ + Magick++/bin/Magick++-config + +MAGICKPP_MANS_OPT = \ + Magick++/bin/Magick++-config.1 + +MAGICKPP_PKGCONFIG_OPT = \ + Magick++/lib/Magick++.pc \ + Magick++/lib/ImageMagick++.pc \ + Magick++/lib/Magick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc \ + Magick++/lib/ImageMagick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc + +MAGICKPP_TEST_SCRPTS_OPT = \ + Magick++/tests/tests.tap \ + Magick++/demo/demos.tap + +MAGICKPP_EXTRA_DIST = \ + Magick++/AUTHORS \ + Magick++/ChangeLog \ + Magick++/INSTALL \ + Magick++/LICENSE \ + Magick++/NEWS \ + Magick++/README \ + Magick++/bin/Magick++-config.1 \ + Magick++/bin/Magick++-config.in \ + Magick++/lib/ImageMagick++.pc.in \ + Magick++/lib/libMagick++.map \ + Magick++/lib/Magick++.pc.in \ + Magick++/demo/model.miff \ + Magick++/demo/smile.miff \ + Magick++/demo/smile_anim.miff \ + Magick++/demo/tile.miff \ + $(MAGICKPP_TEST_SCRPTS_OPT) \ + Magick++/tests/test_image.miff \ + Magick++/tests/test_image_anim.miff + +MAGICKPP_CLEANFILES = \ + Magick++/demo/*_out* \ + Magick++/demo/ir.out \ + Magick++/tests/colorHistogram.txt \ + Magick++/tests/testmagick_anim_out.miff \ + Magick++/tests/ir.out + +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES = \ + Magick++/lib/Blob.cpp \ + Magick++/lib/BlobRef.cpp \ + Magick++/lib/ChannelMoments.cpp \ + Magick++/lib/CoderInfo.cpp \ + Magick++/lib/Color.cpp \ + Magick++/lib/Drawable.cpp \ + Magick++/lib/Exception.cpp \ + Magick++/lib/Functions.cpp \ + Magick++/lib/Geometry.cpp \ + Magick++/lib/Image.cpp \ + Magick++/lib/ImageRef.cpp \ + Magick++/lib/Montage.cpp \ + Magick++/lib/Options.cpp \ + Magick++/lib/Pixels.cpp \ + Magick++/lib/ResourceLimits.cpp \ + Magick++/lib/STL.cpp \ + Magick++/lib/Thread.cpp \ + Magick++/lib/TypeMetric.cpp \ + Magick++/lib/Magick++.h \ + Magick++/lib/Magick++/Blob.h \ + Magick++/lib/Magick++/BlobRef.h \ + Magick++/lib/Magick++/ChannelMoments.h \ + Magick++/lib/Magick++/CoderInfo.h \ + Magick++/lib/Magick++/Color.h \ + Magick++/lib/Magick++/Drawable.h \ + Magick++/lib/Magick++/Exception.h \ + Magick++/lib/Magick++/Functions.h \ + Magick++/lib/Magick++/Geometry.h \ + Magick++/lib/Magick++/Image.h \ + Magick++/lib/Magick++/ImageRef.h \ + Magick++/lib/Magick++/Include.h \ + Magick++/lib/Magick++/Montage.h \ + Magick++/lib/Magick++/Options.h \ + Magick++/lib/Magick++/Pixels.h \ + Magick++/lib/Magick++/ResourceLimits.h \ + Magick++/lib/Magick++/STL.h \ + Magick++/lib/Magick++/Thread.h \ + Magick++/lib/Magick++/TypeMetric.h + +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS = \ + $(MAGICKPP_CPPFLAGS) $(LIBRARY_EXTRA_CPPFLAGS) + +magickpptopincdir = $(INCLUDE_PATH) + +magickpptopinc_HEADERS = $(MAGICKPP_TOP_INCHEADERS) + +MAGICKPP_TOP_INCHEADERS_OPT = \ + Magick++/lib/Magick++.h + +magickppincdir = $(INCLUDE_PATH)/Magick++ + +magickppinc_HEADERS = $(MAGICKPP_INCHEADERS) + +MAGICKPP_INCHEADERS_OPT = \ + Magick++/lib/Magick++/Blob.h \ + Magick++/lib/Magick++/ChannelMoments.h \ + Magick++/lib/Magick++/CoderInfo.h \ + Magick++/lib/Magick++/Color.h \ + Magick++/lib/Magick++/Drawable.h \ + Magick++/lib/Magick++/Exception.h \ + Magick++/lib/Magick++/Functions.h \ + Magick++/lib/Magick++/Geometry.h \ + Magick++/lib/Magick++/Image.h \ + Magick++/lib/Magick++/Include.h \ + Magick++/lib/Magick++/Montage.h \ + Magick++/lib/Magick++/Pixels.h \ + Magick++/lib/Magick++/ResourceLimits.h \ + Magick++/lib/Magick++/STL.h \ + Magick++/lib/Magick++/TypeMetric.h + +if HAVE_LD_VERSION_SCRIPT +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -Wl,--version-script=$(top_srcdir)/Magick++/lib/libMagick++.map +else +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -export-symbols-regex ".*" +endif + +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS = -no-undefined \ + $(Magick___lib_libMagick___la_LDFLAGS_VERSION) $(MAGICK_LT_RELEASE_OPTS) \ + -version-info \ + $(MAGICKPP_LIBRARY_CURRENT):$(MAGICKPP_LIBRARY_REVISION):$(MAGICKPP_LIBRARY_AGE) +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) + +MAGICKPP_CHECK_PGRMS_OPT = \ + Magick++/demo/analyze \ + Magick++/demo/button \ + Magick++/demo/demo \ + Magick++/demo/detrans \ + Magick++/demo/flip \ + Magick++/demo/gravity \ + Magick++/demo/piddle \ + Magick++/demo/shapes \ + Magick++/demo/zoom \ + Magick++/tests/appendImages \ + Magick++/tests/attributes \ + Magick++/tests/averageImages \ + Magick++/tests/coalesceImages \ + Magick++/tests/coderInfo \ + Magick++/tests/color \ + Magick++/tests/colorHistogram \ + Magick++/tests/exceptions \ + Magick++/tests/montageImages \ + Magick++/tests/morphImages \ + Magick++/tests/readWriteBlob \ + Magick++/tests/readWriteImages + +Magick___demo_analyze_SOURCES = Magick++/demo/analyze.cpp +Magick___demo_analyze_LDADD = $(MAGICKPP_LDADD) +Magick___demo_analyze_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___demo_button_SOURCES = Magick++/demo/button.cpp +Magick___demo_button_LDADD = $(MAGICKPP_LDADD) +Magick___demo_button_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___demo_demo_SOURCES = Magick++/demo/demo.cpp +Magick___demo_demo_LDADD = $(MAGICKPP_LDADD) +Magick___demo_demo_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___demo_detrans_SOURCES = Magick++/demo/detrans.cpp +Magick___demo_detrans_LDADD = $(MAGICKPP_LDADD) +Magick___demo_detrans_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___demo_flip_SOURCES = Magick++/demo/flip.cpp +Magick___demo_flip_LDADD = $(MAGICKPP_LDADD) +Magick___demo_flip_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___demo_gravity_SOURCES = Magick++/demo/gravity.cpp +Magick___demo_gravity_LDADD = $(MAGICKPP_LDADD) +Magick___demo_gravity_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___demo_piddle_SOURCES = Magick++/demo/piddle.cpp +Magick___demo_piddle_LDADD = $(MAGICKPP_LDADD) +Magick___demo_piddle_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___demo_shapes_SOURCES = Magick++/demo/shapes.cpp +Magick___demo_shapes_LDADD = $(MAGICKPP_LDADD) +Magick___demo_shapes_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___demo_zoom_SOURCES = Magick++/demo/zoom.cpp +Magick___demo_zoom_LDADD = $(MAGICKPP_LDADD) +Magick___demo_zoom_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___tests_appendImages_SOURCES = Magick++/tests/appendImages.cpp +Magick___tests_appendImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_appendImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___tests_attributes_SOURCES = Magick++/tests/attributes.cpp +Magick___tests_attributes_LDADD = $(MAGICKPP_LDADD) +Magick___tests_attributes_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___tests_averageImages_SOURCES = Magick++/tests/averageImages.cpp +Magick___tests_averageImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_averageImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___tests_coalesceImages_SOURCES = Magick++/tests/coalesceImages.cpp +Magick___tests_coalesceImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_coalesceImages_CPPFLAGS= $(MAGICKPP_CPPFLAGS) + +Magick___tests_coderInfo_SOURCES = Magick++/tests/coderInfo.cpp +Magick___tests_coderInfo_LDADD = $(MAGICKPP_LDADD) +Magick___tests_coderInfo_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___tests_color_SOURCES = Magick++/tests/color.cpp +Magick___tests_color_LDADD = $(MAGICKPP_LDADD) +Magick___tests_color_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___tests_colorHistogram_SOURCES = Magick++/tests/colorHistogram.cpp +Magick___tests_colorHistogram_LDADD = $(MAGICKPP_LDADD) +Magick___tests_colorHistogram_CPPFLAGS= $(MAGICKPP_CPPFLAGS) + +Magick___tests_exceptions_SOURCES = Magick++/tests/exceptions.cpp +Magick___tests_exceptions_LDADD = $(MAGICKPP_LDADD) +Magick___tests_exceptions_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___tests_montageImages_SOURCES = Magick++/tests/montageImages.cpp +Magick___tests_montageImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_montageImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___tests_morphImages_SOURCES = Magick++/tests/morphImages.cpp +Magick___tests_morphImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_morphImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___tests_readWriteBlob_SOURCES = Magick++/tests/readWriteBlob.cpp +Magick___tests_readWriteBlob_LDADD = $(MAGICKPP_LDADD) +Magick___tests_readWriteBlob_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +Magick___tests_readWriteImages_SOURCES = Magick++/tests/readWriteImages.cpp +Magick___tests_readWriteImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_readWriteImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) + +MAGICKPP_LOCAL_TARGETS = www/Magick++/NEWS.html www/Magick++/ChangeLog.html diff --git a/ImageMagick-6.9.12-44/Magick++/NEWS b/ImageMagick-6.9.12-44/Magick++/NEWS new file mode 100644 index 0000000..e60cefb --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/NEWS @@ -0,0 +1,383 @@ +This file records noteworthy changes in Magick++. + +(5.5.2) + * Added adaptiveThreshold() method. + * Added colorMapSize() method. + * Added DrawablePushClipPath, DrawablePopClipPath, and DrawableClipPath. + +(5.5.1) + * Fixed a Color memory allocation problem which became evident when + using the Magick++ DLL. + * Completed implementation of Image textEncoding() method. Oops! + +(5.4.9) + * Added the Image textEncoding() method and an encoding option to + DrawableText to support specifying "UTF-8" (Unicode) text encoding. + * Added the Image compare() method to support comparing two similar + images and obtaining error values. + * Magick++ compiles as a DLL under Visual C++ 7.0. + +(5.4.8) + * The image type() method now also specifies the output image type + to use while writing. + * Added a profile() method to Image to support adding, removing, + and retrieving named embedded application profiles. + * Magick++ compiles as a DLL under Visual C++ 6.0. + +(5.4.7) + * No changes to report. + +(5.4.6) + * Magick++ library no longer depends on C++ iostreams APIs. + * Added DrawableTextUnderColor class to set text underbox color. + +(5.4.5) + * Drawable classes have been re-written to use ImageMagick's draw.h + APIs. + * Fixed a nasty bug when reporting some forms of errors. The bug + was causing an exception in error.c. + * Template API implementation cleanup. + * Rationalized some parameter types. + * New method, Pixels::getConst() to obtain read-only pixels. + * DrawableDashArray() prefers an array of type 'double' rather than + 'unsigned int'. Please use the new form. + * Composite images are output as embedded inlined Base64 when + preparing MVG data. + * Blob class supports encoding and decoding Base64 data. + * New method, Image::ping to ping a Blob. + +(5.4.4) + * Fixed a bug in DrawableDashArray. + * Numerous consistency improvements based on findings from Gimpel lint. + * Added endian method to Image, and endianImage class to STL.h in + order to support setting endian option for formats which support + the notion (e.g. TIFF). + * DrawableCompositeImage was not working. Now it does. + +(5.4.3) + * Support selecting fonts via font-family, font-style, font-weight, + and font-stretch via the DrawableFont class. + * CoderInfo API change. MatchType is scoped to CoderInfo class. + * Bugfix for Magick::Exception memory leak. + * Bugfix for DrawableGravity class (had stopped working). + * Bugfix for Image antiAlias() method (wasn't working). + * Reimplemented image registration code (which passes image via + DrawableCompositeImage). + +(5.4.2) + * TypeMetric class revamped to match current ImageMagick type metrics + definition. + * Fixed possible stack corruption on some architectures when returning + Color as a string. + * DrawableCompositeImage can be constructed based on an Image in memory + rather than just a filename. + * Added Drawable objects (DrawablePushPattern & DrawablePopPattern) + for definining arbitrary named patterns to be used for stroke and fill. + * Added Image strokePattern() and fillPattern() methods for specifying + image to use while drawing stroked object outlines and while filling + objects, respectively. + +(5.4.1) + * Fixed memory leak in Image::draw(). + + * Automagically cleans up ImageMagick allocations prior to process + exit to avoid annoying memory leak tools. + +(5.4.0) + * Fixed bug when scaling from Quantum to double in derived Color classes. + + * Pass all input parameter strings as 'const std::string &' in Color class. + + * Added support for obtaining pixel indexes. + + * Implemented support for read-only pixels and pixel indexes. + + * Added Image boundingBox() method to return smallest bounding box + enclosing non-border pixels. + +(5.3.9) + * New class, CoderInfo, to return information for a specified image + format as well as the coderInfoList() template function to return + the list of coders which match a specification. + + * User now may tell Blob updateNoCopy() what memory system (C or C++) + the memory was allocated from. Used to assume the C++ allocator. + This resolves a bug on some platforms (e.g. Windows). + + * Added Image 'opacity' method (and STL opacityImage()) to set, or + attenuate, image opacity. + + * Added Image 'type' method (and STL typeImage()) to set image + representation type. + + * Image depth method now adjusts pixels to match specified image depth, + and reports depth based on current image pixels. + +(5.3.8) + * New class 'TypeMetric' to contain font type metrics. + + * New Image method 'fontTypeMetrics()' to obtain font type metrics. + + * Image colorMap method automatically extends the colormap if index + is past the end of the current colormap. + + * Added clipMask method to add a clip mask to the current + image. Prevents modification to image pixels wherever the + associated clip mask image is tranparent. + + * Documented methods which were added previously, but left + undocumented. + +(5.3.7) + * No changes. + +(5.3.6) + * Adjusted parameters to 'edge' and 'medianFilter' to match + equivalent libMagick functions. + * Fixed a Montage bug which was not allowing color options to be unset. + * Montage defaults are no longer taken from first Image in list. + * Magick++ demo output looks like PerlMagick demo output again. + +(5.3.5) + * Default radius and sigma parameters were changed on the blur, + charcoal, emboss, and sharpen methods to match ImageMagick defaults. + * Fixes to Magick++ demos to restore appearance. + * Added shave method for shaving edges from image (a form of crop). + +(5.3.1-5.3.4) + * No changes. + +(5.3.0) + * Released with ImageMagick 5.3.0 + * Bug fix. Under certain conditions, several annotation options + were being reset. + +(5.2.9) + * Released with ImageMagick 5.2.9 + * Added fillRule method to Image class. + +(5.2.8) + * Released with ImageMagick 5.2.8 + * Added 'fill' and 'stroke' methods to Montage class. + * Added 'erase' and 'strokeAntiAlias' methods to Image class. + * Renamed Image class 'layer' method to 'channel'. + * Support supplying composition rule to DrawableCompositeImage. + +(5.2.7) + * Released with ImageMagick 5.2.7 + * Added convolve and unsharpmask methods to Image. + * Added deconstructImages and mosaicImages template functions. + * Fixed handling of geometry parameter to annotate method. + +(5.2.6) + * Released with ImageMagick 5.2.6. + * Added support for a SVG-style dash array and dash offset + parameters (for drawing dashed lines). + * Added support for setting the shape to be used at the end of open + subpaths when they are stroked. + * Added support for setting the shape to be used at the corners of + paths (or other vector shapes) when they are stroked. + * Added support for setting extension limit for miter joins. + * Rotate text the proper way using an affine transform. + +(5.2.5) + * Released with ImageMagick 5.2.5. + * Completely re-wrote drawable object classes in order to support + all current ImageMagick drawing capabilities using a list-based paradigm. + New drawing capabilities include coordinate transformations and the + currently undocumented (but quite powerful) path capabilities. + +(5.2.4) + * Released with ImageMagick 5.2.4. + * Magick++ is now built by the regular ImageMagick build process. + when --with-magick_plus_plus is specified to configure. + * Fixed bug with setting text drawing options. + * Fixed API bug with colorize. Options adjusted to match ImageMagick + API change (API change was long ago). + * Library compiles using Sun Workshop 5.0 compiler. Linkage problems with + some demos/tests due to libtool-related compiler/linker bug. + * Compiles using Sun Forte 6.0 compiler. + +(5.2.3) + * Switched to new release numbering (match ImageMagick release number) + * Released with ImageMagick 5.2.3. + * Fixed bug in which the Image read method was not reporting + warnings (only errors). + * Parameter changes to blur, charcoal, emboss, and sharpen methods + of the Image class to match equivalent ImageMagick API changes. + * Parameter changes to blurImage, charcoalImage, embossImage, and + sharpenImage STL functions in order to match equivalent ImageMagick + API changes. + +(0.9.5) + * Released with ImageMagick 5.2.2. + +(0.9.4) + * Released with ImageMagick 5.2.1. + * Bugfix to the Pixels GetIndexes() method. + * Adapted to ImageMagick 5.2.1's revised matte channel interpretation. + +(0.9.3) + * Released with ImageMagick 5.2 + * New class 'Pixels' to support low-level pixel access in image. New + API supports multiple pixel views into the same image. Number of + available pixel views limited to the number of image rows + 1. + * Dramatically improved performance for text annotation and drawing. + * Fix text annotation bug which did not allow spaces in annotation text. + * Added gaussianBlurImage() method. + * Fixed bug in floodFillTexture(). + * Re-worked error reporting methodology to use re-entrant error + reporting rather than the previous method (based on call-backs) + which required thread specific data. + * Should be thread-safe under Win32 now. + +(0.9.2) + * Released with ImageMagick 5.1.1 + * Should be thread-safe when used with POSIX threads (pthreads). + * Added methods getPixels, setPixels, syncPixels, readPixels, and + writePixels, in order to provide low-level access to Image pixels. + * Bugfix: size method was setting Options size, but not Image rows + and columns. + +(0.9.1) + * Released with ImageMagick 5.1.0 + * Added additional constructors, read, and write methods for BLOBs + to make BLOBs easier to use. + * Added the medianFilter() method to Image. + * Renamed transformColorSpace() to colorSpace() and added a + colorSpace() accessor method. + * Renamed psPageSize() to page(), which now properly returns the + actual attribute from the image, rather than the image options. + This is important in order to manipulate GIF animations. + * Bug fixes. + +(0.9) + * Ported to ImageMagick 5.0. + * BLOB sizes are now specified using size_t type. + * Rotate() no longer accepts sharpen or crop options. + * Shear() No longer accepts a crop option. + * FontPointsize() now takes a double. + * The condense, uncondense, and condensed methods have been removed + since ImageMagick 5.0 no longer uses run-length encoding. + * The quantizeError method has been removed since it never worked. + * The cacheThreshold method is added to set the threshold of + ImageMagick's image cache. + +(0.8.9) + * Released with ImageMagick 4.2.9 + * Blob reference counting was totally broken, leading to a memory + leak if it was used. Fixed by starting reference count from one + rather than zero. + +(0.8.8) + * Fixed a Image constructor bug when constructing from a Blob + +(0.8.7) + * Bugfix: condensed() was returning wrong state. + +(0.8.6) + * Color is now based on ImageMagick's RunlengthPacket structure (via a + pointer) so that it may eventually be used to represent an image + pixel. This is currently a work in progress. + +(0.8.5) + * Headers are now installed under prefix/include/Magick++ on Unix + systems with the exception that Magick++.h is installed under + prefix/include as it was before. Programs which include Magick++.h + (the documented approach) should not be impacted. + * Image constructors to construct an image from a BLOB. + * Image read and write methods to decode and encode images stored in a + BLOB. This allows reading/writing image "files" from/to memory rather + than a traditional file. + +(0.8.4) + * New mapImages algorithm maps a sequence of images to the colormap of + a provided image. + * New quantizeImages algorithm computes and applies a common colormap + to a sequence of images. + +(0.8.3) + * Ported to ImageMagick 4.2.6. + * Blob supports default constructor. + * New Blob method updateNoCopy() to support efficient initialization by + derived class. + +(0.8.2) + * Uses libtool 1.3 to build library under Unix and Cygwin (static lib only). + * Added Blob class to support supplying formatted binary data to methods. + * Added support for setting ICC and IPTC profiles from a binary BLOB. + * Added support for transformations of image data to/from alternate + colorspace (e.g. CYMK). + * Added support for 'pinging' an image (get image dimensions/size quickly). + * Added 'uncondense' method to de-compress in-memory image data. + * Added support for annotation using rotated text. + +(0.8.1) + * Added support for setting alpha in Magick::Color + * Set/get color alpha in Magick::Image::pixelColor() for DirectClass images. + +(0.8) + * Transitioned to Beta + * Improved Microsoft Visual C++ build environment. + +(0.7.4) + * Added animateImages() and displayImages() to MagickSTL.h. + * Added function objects to support setting image attributes. + +(0.7.3) + * Image::penTexture() now takes Image reference rather than + Image pointer. Set Image to invalid using isValid(false) + to unset texture. + * Attribute methods that take Color, Geometry, Image, or string + arguments may now unset the attribute by setting the state of + the object to invalid using isValid(false), or the empty string + (in the case of string). This allows full control over ImageMagick + attributes which are stored as C strings which may be set to NULL. + * Updated for ImageMagick 4.2.1 + +(0.7.2) + * Added STL function object support for all Image manipulation + methods to support operating on all or part of the images + stored in an STL container. + +(0.7.1) + * Added Coordinate class and methods in Drawable to support x,y + coordinates. + * Changed coordinate parameters from unsigned int to double in Drawable. + * Changed polygon methods in Drawable to use STL list argument. + * Added STL list based draw method to Image. + * Changed Exception heirarchy to support Warning and Error sub-classes. + Most exception class names have changed. + +(0.7) + * Updated for ImageMagick 4.2.0 + * Added support for flood-filling and drawing with texture. + * Montage supported. + * Oodles of bugs fixed. + * Implemented image attribute tests. + * Implemented PerlMagick 'demo' and 'shapes' demo programs in Magick++. + * Some parameters re-ordered due to experience from writing demo programs. + +(0.6) + * Initial support for integrating image-list oriented operations with + STL containers. + +(0.5) + * Compiles and runs under Unix using egcs release 1.1 or later. + * Compiles and runs under Windows using Visual C++ 5.X or later. + * Users of Magick++ API are not exposed to ImageMagick headers. + * Magick++ API is namespaced under "Magick". + * "Magick" prefix removed from object names. + * User options are now completely contained within Image object. + There is no longer a MagickOptions parameter to some methods. + +(0.1) + * All ImageMagick operations which operate on individual images are + supported. + * Image objects have value semantics, avoid unnecessary image + copies through the use of reference counting, and may be compared + via standard operators. + * Geometry, color, annotations, and user-options are supported by + separate classes. + * Errors are reported synchronously via C++ exceptions. + diff --git a/ImageMagick-6.9.12-44/Magick++/README b/ImageMagick-6.9.12-44/Magick++/README new file mode 100644 index 0000000..74cb4e9 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/README @@ -0,0 +1,55 @@ +This is Magick++, the object-oriented C++ API to the ImageMagick +image-processing library, the most comprehensive open-source image processing +solution available. Read the release notes for Magick++. + +Magick++ supports an object model which is inspired by PerlMagick. Magick++ +executes faster than PerlMagick since it is accessed from a compiled language +rather than from a scripting language. This makes it more suitable for Web CGI +programs which must start-up and execute quickly. Images support implicit +reference counting so that copy constructors and assignment incur almost no +cost. The cost of actually copying an image (if necessary) is done just before +modification and this copy is managed automatically by Magick++. De-referenced +copies are automatically deleted. The image objects support value (rather than +pointer) semantics so it is trivial to support multiple generations of an +image in memory at one time. + +Magick++ provides integrated support for the Standard Template Library (STL) so +that the powerful containers available (e.g. deque, vector, list, and map) can +be used to write programs similar to those possible with PERL & PerlMagick. +STL-compatable template versions of ImageMagick's list-style operations are +provided so that operations may be performed on multiple images stored in STL +containers. + +Documentation + +Detailed documentation are provided for all Magick++ classes, class methods, +and template functions which comprise the API. + +Obtaining Magick++ + +Magick++ is included as part of ImageMagick source releases and may be +retrieved via ftp or Subversion. + +Installation + +Once you have the sources available, follow these detailed installation +instructions for UNIX and Windows. + +Usage + +A helper script named Magick++-config is installed under Unix which assists +with recalling compilation options required to compile and link programs which +use Magick++. For example, the following command will compile and link the +source file example.cpp to produce the executable example (notice that quotes +are backward quotes): + + c++ `Magick++-config --cxxflags --cppflags --ldflags --libs` \ + -o example example.cpp + +Windows users may get started by manually editing a project file for one of the +Magick++ demo programs. + +Reporting Bugs + +Please report any bugs via the Magick++ Bug Tracking System at +https://imagemagick.org/discourse-server/. diff --git a/ImageMagick-6.9.12-44/Magick++/bin/Magick++-config.1 b/ImageMagick-6.9.12-44/Magick++/bin/Magick++-config.1 new file mode 100644 index 0000000..0df7258 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/bin/Magick++-config.1 @@ -0,0 +1,99 @@ +.ad l +.nh +.TH Magick++-Config 1 "2 May 2002" "ImageMagick" +.SH NAME +Magick++-config \- get information about the installed version of Magick++ +.SH SYNOPSIS +.B Magick++-config +.B [--cppflags] +.B [--cxxflags] +.B [--exec-prefix] +.B [--ldflags] +.B [--libs] +.B [--prefix] +.B [--version] +.SH DESCRIPTION +.B Magick++-config +prints the compiler and linker flags required to compile and link programs +that use the +.BR ImageMagick +C++ Application Programmer Interface (known as +.BR Magick++ +). +.SH EXAMPLES +To print the version of the installed distribution of +.BR Magick++ , +use: + +.nf + Magick++-config \-\-version +.fi + +To compile a program that calls the +.BR ImageMagick +C++ Application Programmer Interface, use: + +.nf + c++ `Magick++-config \-\-cxxflags \-\-cppflags \-\-ldflags \-\-libs` program.cpp +.fi + +.SH OPTIONS +.TP +.B \-\-cppflags +Print the preprocessor flags that are needed to find the +.B ImageMagick +C and C++ include files and defines to ensures that the ImageMagick data structures match between +your program and the installed libraries. +.TP +.B \-\-cxxflags +Print the compiler flags that were used to compile +.BR libMagick++ . +.TP +.B \-\-exec-prefix +Print the directory under which target specific binaries and executables are installed. +.TP +.B \-\-ldflags +Print the linker flags that are needed to link with the +.B libMagick++ +library. +.TP +.B \-\-libs +Print the linker flags that are needed to link a program with +.BR libMagick++ . +.TP +.B \-\-prefix +Print the directory under which the package is installed. +.TP +.B \-\-version +Print the version of the +.B ImageMagick +distribution to standard output. +.SH COPYRIGHT +Copyright (C) 2000 ImageMagick Studio LLC, a non-profit organization dedicated +to making software imaging solutions freely available. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files ("ImageMagick"), +to deal in ImageMagick without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of ImageMagick, and to permit persons to whom the +ImageMagick is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of ImageMagick. + +The software is provided "as is", without warranty of any kind, express or +implied, including but not limited to the warranties of merchantability, +fitness for a particular purpose and noninfringement. In no event shall +ImageMagick Studio be liable for any claim, damages or other liability, +whether in an action of contract, tort or otherwise, arising from, out of +or in connection with ImageMagick or the use or other dealings in +ImageMagick. + +Except as contained in this notice, the name of the ImageMagick Studio +shall not be used in advertising or otherwise to promote the sale, use or +other dealings in ImageMagick without prior written authorization from the +ImageMagick Studio. +.SH AUTHORS +Bob Friesenhahn, ImageMagick Studio + diff --git a/ImageMagick-6.9.12-44/Magick++/bin/Magick++-config.in b/ImageMagick-6.9.12-44/Magick++/bin/Magick++-config.in new file mode 100755 index 0000000..67aa72d --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/bin/Magick++-config.in @@ -0,0 +1,65 @@ +#!/bin/sh +# +# Configure options script for re-calling Magick+ compilation options +# required to use the Magick++ library. +# +# + +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +usage='Usage: Magick++-config [--cppflags] [--cxxflags] [--exec-prefix] [--ldflags] [--libs] [--prefix] [--version] + + For example, "magick.cpp" may be compiled to produce "magick" as follows: + + "c++ -o magick magick.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs`"' + +if test $# -eq 0; then + echo "${usage}" 1>&2 + exit 1 +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + case $1 in + --prefix=*) + prefix=$optarg + ;; + --prefix) + echo $prefix + ;; + --exec-prefix=*) + exec_prefix=$optarg + ;; + --exec-prefix) + echo $exec_prefix + ;; + --version) + echo '@PACKAGE_BASEVERSION@ Q@QUANTUM_DEPTH@ @MAGICK_HDRI@' + ;; + --cflags) + @PKG_CONFIG@ --cflags Magick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --cxxflags) + @PKG_CONFIG@ --cflags Magick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --cppflags) + @PKG_CONFIG@ --cflags Magick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --ldflags) + @PKG_CONFIG@ --libs Magick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --libs) + @PKG_CONFIG@ --libs Magick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + *) + echo "${usage}" 1>&2 + exit 1 + ;; + esac + shift +done + diff --git a/ImageMagick-6.9.12-44/Magick++/demo/analyze.cpp b/ImageMagick-6.9.12-44/Magick++/demo/analyze.cpp new file mode 100644 index 0000000..50f82e2 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/demo/analyze.cpp @@ -0,0 +1,71 @@ +// +// Demonstrate using the 'analyze' process module to compute +// image statistics. +// +// Copyright Bob Friesenhahn, 2003, 2004 +// +// Usage: analyze file... +// + +#include +#include +#include +#include +using namespace std; +using namespace Magick; +int main(int argc,char **argv) +{ + if ( argc < 2 ) + { + cout << "Usage: " << argv[0] << " file..." << endl; + exit( 1 ); + } + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + { + std::list attributes; + + attributes.push_back("TopLeftColor"); + attributes.push_back("TopRightColor"); + attributes.push_back("BottomLeftColor"); + attributes.push_back("BottomRightColor"); + attributes.push_back("filter:brightness:mean"); + attributes.push_back("filter:brightness:standard-deviation"); + attributes.push_back("filter:brightness:kurtosis"); + attributes.push_back("filter:brightness:skewness"); + attributes.push_back("filter:saturation:mean"); + attributes.push_back("filter:saturation:standard-deviation"); + attributes.push_back("filter:saturation:kurtosis"); + attributes.push_back("filter:saturation:skewness"); + + char **arg = &argv[1]; + while ( *arg ) + { + string fname(*arg); + try { + cout << "File: " << fname << endl; + Image image( fname ); + + /* Analyze module does not require an argument list */ + image.process("analyze",0,0); + + list::iterator pos = attributes.begin(); + while(pos != attributes.end()) + { + cout << " " << setw(16) << setfill(' ') << setiosflags(ios::left) + << *pos << " = " << image.attribute(*pos) << endl; + pos++; + } + } + catch( Exception &error_ ) + { + cout << error_.what() << endl; + } + ++arg; + } + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/demo/button.cpp b/ImageMagick-6.9.12-44/Magick++/demo/button.cpp new file mode 100644 index 0000000..88db625 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/demo/button.cpp @@ -0,0 +1,102 @@ +// +// Magick++ demo to generate a simple text button +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2003 +// + +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Options + // + + string backGround = "xc:#CCCCCC"; // A solid color + + // Color to use for decorative border + Color border = "#D4DCF3"; + + // Button size + string buttonSize = "120x20"; + + // Button background texture + string buttonTexture = "granite:"; + + // Button text + string text = "Button Text"; + + // Button text color + string textColor = "red"; + + // Font point size + int fontPointSize = 16; + + // + // Magick++ operations + // + + Image button; + + // Set button size + button.size( buttonSize ); + + // Read background image + button.read( backGround ); + + // Set background to buttonTexture + Image backgroundTexture( buttonTexture ); + button.texture( backgroundTexture ); + + // Add some text + button.fillColor( textColor ); + button.fontPointsize( fontPointSize ); + if (getenv("MAGICK_FONT") != 0) + button.font(string(getenv("MAGICK_FONT"))); + button.annotate( text, CenterGravity ); + + // Add a decorative frame + button.borderColor( border ); + button.frame( "6x6+3+3" ); + + button.depth( 8 ); + + // Quantize to desired colors + // button.quantizeTreeDepth(8); + button.quantizeDither(false); + button.quantizeColors(64); + button.quantize(); + + // Save to file + cout << "Writing to \"button_out.miff\" ..." << endl; + button.compressType( RLECompression ); + button.write("button_out.miff"); + + // Display on screen + // button.display(); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/demo/demo.cpp b/ImageMagick-6.9.12-44/Magick++/demo/demo.cpp new file mode 100644 index 0000000..164e0ab --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/demo/demo.cpp @@ -0,0 +1,516 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// +// Simple demo program for Magick++ +// +// Concept and algorithms lifted from PerlMagick demo script written +// by John Christy. +// +// Max run-time size 60MB (as compared with 95MB for PerlMagick) under SPARC Solaris +// + +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + list montage; + + { + // + // Read model & smile image. + // + cout << "Read images ..." << endl; + + Image model( srcdir + "model.miff" ); + model.label( "Magick++" ); + model.borderColor( "black" ); + model.backgroundColor( "black" ); + + Image smile( srcdir + "smile.miff" ); + smile.label( "Smile" ); + smile.borderColor( "black" ); + + // + // Create image stack. + // + cout << "Creating thumbnails..." << endl; + + // Construct initial list containing seven copies of a null image + Image null; + null.size( Geometry(70,70) ); + null.read( "NULL:black" ); + list images( 7, null ); + + Image example = model; + + // Each of the following follow the pattern + // 1. obtain reference to (own copy of) image + // 2. apply label to image + // 3. apply operation to image + // 4. append image to container + + cout << " add noise ..." << endl; + example.label( "Add Noise" ); + example.addNoise( LaplacianNoise ); + images.push_back( example ); + + cout << " add noise (blue) ..." << endl; + example.label( "Add Noise\n(Blue Channel)" ); + example.addNoiseChannel( BlueChannel, PoissonNoise ); + images.push_back( example ); + + cout << " annotate ..." << endl; + example = model; + example.label( "Annotate" ); + example.density( "72x72" ); + example.fontPointsize( 18 ); + if (getenv("MAGICK_FONT") != 0) + example.font(string(getenv("MAGICK_FONT"))); + example.strokeColor( Color() ); + example.fillColor( "gold" ); + example.annotate( "Magick++", "+0+20", NorthGravity ); + images.push_back( example ); + + cout << " blur ..." << endl; + example = model; + example.label( "Blur" ); + example.blur( 0, 1.5 ); + images.push_back( example ); + + cout << " blur red channel ..." << endl; + example = model; + example.label( "Blur Channel\n(Red Channel)" ); + example.blurChannel( RedChannel, 0, 3.0 ); + images.push_back( example ); + + cout << " border ..." << endl; + example = model; + example.label( "Border" ); + example.borderColor( "gold" ); + example.border( Geometry(6,6) ); + images.push_back( example ); + + cout << " channel ..." << endl; + example = model; + example.label( "Channel\n(Red Channel)" ); + example.channel( RedChannel ); + images.push_back( example ); + + cout << " charcoal ..." << endl; + example = model; + example.label( "Charcoal" ); + example.charcoal( ); + images.push_back( example ); + + cout << " composite ..." << endl; + example = model; + example.label( "Composite" ); + example.composite( smile, "+35+65", OverCompositeOp); + images.push_back( example ); + + cout << " contrast ..." << endl; + example = model; + example.label( "Contrast" ); + example.contrast( false ); + images.push_back( example ); + + cout << " convolve ..." << endl; + example = model; + example.label( "Convolve" ); + { + // 3x3 matrix + const double kernel[] = { 1, 1, 1, 1, 4, 1, 1, 1, 1 }; + example.convolve( 3, kernel ); + } + images.push_back( example ); + + cout << " crop ..." << endl; + example = model; + example.label( "Crop" ); + example.crop( "80x80+25+50" ); + images.push_back( example ); + + cout << " despeckle ..." << endl; + example = model; + example.label( "Despeckle" ); + example.despeckle( ); + images.push_back( example ); + + cout << " draw ..." << endl; + example = model; + example.label( "Draw" ); + example.fillColor(Color()); + example.strokeColor( "gold" ); + example.strokeWidth( 2 ); + example.draw( DrawableCircle( 60,90, 60,120 ) ); + images.push_back( example ); + + cout << " edge ..." << endl; + example = model; + example.label( "Detect Edges" ); + example.edge( ); + images.push_back( example ); + + cout << " emboss ..." << endl; + example = model; + example.label( "Emboss" ); + example.emboss( ); + images.push_back( example ); + + cout << " equalize ..." << endl; + example = model; + example.label( "Equalize" ); + example.equalize( ); + images.push_back( example ); + + cout << " explode ..." << endl; + example = model; + example.label( "Explode" ); + example.backgroundColor( "#000000FF" ); + example.implode( -1 ); + images.push_back( example ); + + cout << " flip ..." << endl; + example = model; + example.label( "Flip" ); + example.flip( ); + images.push_back( example ); + + cout << " flop ..." << endl; + example = model; + example.label( "Flop" ); + example.flop(); + images.push_back( example ); + + cout << " frame ..." << endl; + example = model; + example.label( "Frame" ); + example.frame( ); + images.push_back( example ); + + cout << " gamma ..." << endl; + example = model; + example.label( "Gamma" ); + example.gamma( 1.6 ); + images.push_back( example ); + + cout << " gaussian blur ..." << endl; + example = model; + example.label( "Gaussian Blur" ); + example.gaussianBlur( 0.0, 1.5 ); + images.push_back( example ); + + cout << " gaussian blur channel ..." << endl; + example = model; + example.label( "Gaussian Blur\n(Green Channel)" ); + example.gaussianBlurChannel( GreenChannel, 0.0, 1.5 ); + images.push_back( example ); + + cout << " gradient ..." << endl; + Image gradient; + gradient.size( "130x194" ); + gradient.read( "gradient:#20a0ff-#ffff00" ); + gradient.label( "Gradient" ); + images.push_back( gradient ); + + cout << " grayscale ..." << endl; + example = model; + example.label( "Grayscale" ); + example.quantizeColorSpace( GRAYColorspace ); + example.quantize( ); + images.push_back( example ); + + cout << " implode ..." << endl; + example = model; + example.label( "Implode" ); + example.implode( 0.5 ); + images.push_back( example ); + + cout << " level ..." << endl; + example = model; + example.label( "Level" ); + example.level( 0.20*QuantumRange, 0.90*QuantumRange, 1.20 ); + images.push_back( example ); + + cout << " level red channel ..." << endl; + example = model; + example.label( "Level Channel\n(Red Channel)" ); + example.levelChannel( RedChannel, 0.20*QuantumRange, 0.90*QuantumRange, 1.20 ); + images.push_back( example ); + + cout << " median filter ..." << endl; + example = model; + example.label( "Median Filter" ); + example.medianFilter( ); + images.push_back( example ); + + cout << " modulate ..." << endl; + example = model; + example.label( "Modulate" ); + example.modulate( 110, 110, 110 ); + images.push_back( example ); + + cout << " monochrome ..." << endl; + example = model; + example.label( "Monochrome" ); + example.quantizeColorSpace( GRAYColorspace ); + example.quantizeColors( 2 ); + example.quantizeDither( false ); + example.quantize( ); + images.push_back( example ); + + cout << " motion blur ..." << endl; + example = model; + example.label( "Motion Blur" ); + example.motionBlur( 0.0, 7.0,45 ); + images.push_back( example ); + + cout << " negate ..." << endl; + example = model; + example.label( "Negate" ); + example.negate( ); + images.push_back( example ); + + cout << " normalize ..." << endl; + example = model; + example.label( "Normalize" ); + example.normalize( ); + images.push_back( example ); + + cout << " oil paint ..." << endl; + example = model; + example.label( "Oil Paint" ); + example.oilPaint( ); + images.push_back( example ); + + cout << " ordered dither 2x2 ..." << endl; + example = model; + example.label( "Ordered Dither\n(2x2)" ); + example.randomThreshold( Geometry(2,2) ); + images.push_back( example ); + + cout << " ordered dither 3x3..." << endl; + example = model; + example.label( "Ordered Dither\n(3x3)" ); + example.randomThreshold( Geometry(3,3) ); + images.push_back( example ); + + cout << " ordered dither 4x4..." << endl; + example = model; + example.label( "Ordered Dither\n(4x4)" ); + example.randomThreshold( Geometry(4,4) ); + images.push_back( example ); + + cout << " ordered dither red 4x4..." << endl; + example = model; + example.label( "Ordered Dither\n(Red 4x4)" ); + example.randomThresholdChannel( Geometry(4,4), RedChannel); + images.push_back( example ); + + cout << " plasma ..." << endl; + Image plasma; + plasma.size( "130x194" ); + plasma.read( "plasma:fractal" ); + plasma.label( "Plasma" ); + images.push_back( plasma ); + + cout << " quantize ..." << endl; + example = model; + example.label( "Quantize" ); + example.quantize( ); + images.push_back( example ); + + cout << " quantum operator ..." << endl; + example = model; + example.label( "Quantum Operator\nRed * 0.4" ); + example.quantumOperator( RedChannel,MultiplyEvaluateOperator,0.40 ); + images.push_back( example ); + + cout << " raise ..." << endl; + example = model; + example.label( "Raise" ); + example.raise( ); + images.push_back( example ); + + cout << " reduce noise ..." << endl; + example = model; + example.label( "Reduce Noise" ); + example.reduceNoise( 1.0 ); + images.push_back( example ); + + cout << " resize ..." << endl; + example = model; + example.label( "Resize" ); + example.zoom( "50%" ); + images.push_back( example ); + + cout << " roll ..." << endl; + example = model; + example.label( "Roll" ); + example.roll( "+20+10" ); + images.push_back( example ); + + cout << " rotate ..." << endl; + example = model; + example.label( "Rotate" ); + example.rotate( 45 ); + example.transparent( "black" ); + images.push_back( example ); + + cout << " scale ..." << endl; + example = model; + example.label( "Scale" ); + example.scale( "60%" ); + images.push_back( example ); + + cout << " segment ..." << endl; + example = model; + example.label( "Segment" ); + example.segment( 0.5, 0.25 ); + images.push_back( example ); + + cout << " shade ..." << endl; + example = model; + example.label( "Shade" ); + example.shade( 30, 30, false ); + images.push_back( example ); + + cout << " sharpen ..." << endl; + example = model; + example.label("Sharpen"); + example.sharpen( 0.0, 1.0 ); + images.push_back( example ); + + cout << " shave ..." << endl; + example = model; + example.label("Shave"); + example.shave( Geometry( 10, 10) ); + images.push_back( example ); + + cout << " shear ..." << endl; + example = model; + example.label( "Shear" ); + example.shear( 45, 45 ); + example.transparent( "black" ); + images.push_back( example ); + + cout << " spread ..." << endl; + example = model; + example.label( "Spread" ); + example.spread( 3 ); + images.push_back( example ); + + cout << " solarize ..." << endl; + example = model; + example.label( "Solarize" ); + example.solarize( ); + images.push_back( example ); + + cout << " swirl ..." << endl; + example = model; + example.backgroundColor( "#000000FF" ); + example.label( "Swirl" ); + example.swirl( 90 ); + images.push_back( example ); + + cout << " threshold ..." << endl; + example = model; + example.label( "Threshold" ); + example.threshold( QuantumRange/2.0 ); + images.push_back( example ); + + cout << " threshold random ..." << endl; + example = model; + example.label( "Random\nThreshold" ); + example.randomThreshold( Geometry((size_t) (0.3*QuantumRange), + (size_t) (0.85*QuantumRange)) ); + images.push_back( example ); + + cout << " unsharp mask ..." << endl; + example = model; + example.label( "Unsharp Mask" ); + // radius_, sigma_, amount_, threshold_ + example.unsharpmask( 0.0, 1.0, 1.0, 0.05); + images.push_back( example ); + + cout << " wave ..." << endl; + example = model; + example.label( "Wave" ); + example.matte( true ); + example.backgroundColor( "#000000FF" ); + example.wave( 25, 150 ); + images.push_back( example ); + + // + // Create image montage. + // + cout << "Montage images..." << endl; + + for_each( images.begin(), images.end(), strokeColorImage( Color("#600") ) ); + + MontageFramed montageOpts; + montageOpts.geometry( "130x194+10+5>" ); + montageOpts.gravity( CenterGravity ); + montageOpts.borderColor( "green" ); + montageOpts.borderWidth( 1 ); + montageOpts.tile( "7x4" ); + montageOpts.compose( OverCompositeOp ); + montageOpts.backgroundColor( "#ffffff" ); + montageOpts.pointSize( 18 ); + montageOpts.fillColor( "#600" ); + montageOpts.strokeColor( Color() ); + montageOpts.compose(OverCompositeOp); + montageOpts.fileName( "Magick++ Demo" ); + montageImages( &montage, images.begin(), images.end(), montageOpts ); + } + + Image& montage_image = montage.front(); + { + // Create logo image + cout << "Adding logo image ..." << endl; + Image logo( "logo:" ); + logo.zoom( "45%" ); + + // Composite logo into montage image + Geometry placement(0,0,(montage_image.columns()/2)-(logo.columns()/2),0); + montage_image.composite( logo, placement, OverCompositeOp ); + } + + for_each( montage.begin(), montage.end(), depthImage(8) ); + for_each( montage.begin(), montage.end(), matteImage( false ) ); + for_each( montage.begin(), montage.end(), compressTypeImage( RLECompression) ); + + cout << "Writing image \"demo_out.miff\" ..." << endl; + writeImages(montage.begin(),montage.end(),"demo_out_%d.miff"); + + // Uncomment following lines to display image to screen + // cout << "Display image..." << endl; + // montage_image.display(); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/demo/demos.tap b/ImageMagick-6.9.12-44/Magick++/demo/demos.tap new file mode 100755 index 0000000..b4d679c --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/demo/demos.tap @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Copyright 2004 Bob Friesenhahn +# +# This file is part of Magick++, the C++ API for ImageMagick and +# ImageMagick. Please see the file "COPYING" included with Magick++ +# for usage and copying restrictions. +# +subdir=Magick++/demo +. ./common.shi +echo "1..24" + +SRCDIR=${top_srcdir}/${subdir}/ +export SRCDIR + +cd ${subdir} || exit 1 + +./analyze "$SRCDIR/model.miff" && echo "ok" || echo "not ok" + +for demo in button demo flip gravity piddle shapes +do + ./${demo} && echo "ok" || echo "not ok" +done + +for filter in bessel blackman box catrom cubic gaussian hamming hanning hermite lanczos mitchell point quadratic sample scale sinc triangle +do + ./zoom -filter $filter -geometry 600x600 ${SRCDIR}/model.miff zoom_${filter}_out.miff && echo "ok" || echo "not ok" +done +: diff --git a/ImageMagick-6.9.12-44/Magick++/demo/detrans.cpp b/ImageMagick-6.9.12-44/Magick++/demo/detrans.cpp new file mode 100644 index 0000000..65932d6 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/demo/detrans.cpp @@ -0,0 +1,60 @@ +// +// Replace transparency in an image with a solid color using Magick++ +// +// Useful to see how a transparent image looks on a particular +// background color, or to create a similar looking effect without +// transparency. +// +// Copyright Bob Friesenhahn, 2000 +// +// Usage: detrans color file... +// + +#include +#include +using namespace std; +using namespace Magick; +int main(int argc,char **argv) +{ + if ( argc < 3 ) + { + cout << "Usage: " << argv[0] << " background_color file..." << endl; + exit( 1 ); + } + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + { + Color color; + try { + color = Color(argv[1]); + } + catch ( Exception &error_ ) + { + cout << error_.what() << endl; + cout.flush(); + exit(1); + } + + char **arg = &argv[2]; + while ( *arg ) + { + string fname(*arg); + try { + Image overlay( fname ); + Image base( overlay.size(), color ); + base.composite( overlay, 0, 0, OverCompositeOp ); + base.matte( false ); + base.write( fname ); + } + catch( Exception &error_ ) + { + cout << error_.what() << endl; + } + ++arg; + } + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/demo/flip.cpp b/ImageMagick-6.9.12-44/Magick++/demo/flip.cpp new file mode 100644 index 0000000..61dae19 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/demo/flip.cpp @@ -0,0 +1,60 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2003 +// +// Demonstration of unary function-object based operations +// +// Reads the multi-frame file "smile_anim.miff" and writes a +// flipped and morphed version to "flip_out.miff". +// + +#include +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // Read images into STL list + list imageList; + readImages( &imageList, srcdir + "smile_anim.miff" ); + + // cout << "Total scenes: " << imageList.size() << endl; + + // Flip images + for_each( imageList.begin(), imageList.end(), flipImage() ); + + // Create a morphed version, adding three frames between each + // existing frame. + list morphed; + morphImages( &morphed, imageList.begin(), imageList.end(), 3 ); + + // Write out images + cout << "Writing image \"flip_out.miff\" ..." << endl; + writeImages( morphed.begin(), morphed.end(), "flip_out.miff" ); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/demo/gravity.cpp b/ImageMagick-6.9.12-44/Magick++/demo/gravity.cpp new file mode 100644 index 0000000..c262515 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/demo/gravity.cpp @@ -0,0 +1,83 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 2000, 2001, 2003 +// +// Demo of text annotation with gravity. Produces an animation showing +// the effect of rotated text assize_t with various gravity specifications. +// +// After running demo program, run 'animate gravity_out.miff' if you +// are using X-Windows to see an animated result. +// +// Concept and algorithms lifted from PerlMagick demo script written +// by John Christy. +// + +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + int x = 100; + int y = 100; + + list animation; + + Image base( Geometry(600,600), Color("white") ); + base.depth(8); + base.strokeColor("#600"); + base.fillColor(Color()); + base.draw( DrawableLine( 300,100, 300,500 ) ); + base.draw( DrawableLine( 100,300, 500,300 ) ); + base.draw( DrawableRectangle( 100,100, 500,500 ) ); + base.density( Geometry(72,72) ); + base.strokeColor(Color()); + base.fillColor("#600"); + base.fontPointsize( 30 ); + base.boxColor( "red" ); + base.animationDelay( 20 ); + base.compressType( RLECompression ); + + for ( int angle = 0; angle < 360; angle += 30 ) + { + cout << "angle " << angle << endl; + Image pic = base; + pic.annotate( "NorthWest", Geometry(0,0,x,y), NorthWestGravity, angle ); + pic.annotate( "North", Geometry(0,0,0,y), NorthGravity, angle ); + pic.annotate( "NorthEast", Geometry(0,0,x,y), NorthEastGravity, angle ); + pic.annotate( "East", Geometry(0,0,x,0), EastGravity, angle ); + pic.annotate( "Center", Geometry(0,0,0,0), CenterGravity, angle ); + pic.annotate( "SouthEast", Geometry(0,0,x,y), SouthEastGravity, angle ); + pic.annotate( "South", Geometry(0,0,0,y), SouthGravity, angle ); + pic.annotate( "SouthWest", Geometry(0,0,x,y), SouthWestGravity, angle ); + pic.annotate( "West", Geometry(0,0,x,0), WestGravity, angle ); + animation.push_back( pic ); + } + cout << "Writing image \"gravity_out.miff\" ..." << endl; + writeImages( animation.begin(), animation.end(), "gravity_out.miff" ); + // system( "animate gravity_out.miff" ); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/demo/model.miff b/ImageMagick-6.9.12-44/Magick++/demo/model.miff new file mode 100644 index 0000000000000000000000000000000000000000..daa77871b715968ea2170070e0688e20b0af1d3e GIT binary patch literal 25564 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 +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Create a 300x300 white canvas. + // + Image image( "300x300", "white" ); + + // Drawing list + std::list drawList; + + // Start drawing by pushing a drawing context with specified + // viewbox size + drawList.push_back(DrawablePushGraphicContext()); + drawList.push_back(DrawableViewbox(0,0,image.columns(),image.rows())); + + // + // Draw blue grid + // + drawList.push_back(DrawableStrokeColor("#ccf")); + for ( int i=0; i < 300; i += 10 ) + { + drawList.push_back(DrawableLine(i,0, i,300)); + drawList.push_back(DrawableLine(0,i, 300,i)); + } + + // + // Draw rounded rectangle. + // + drawList.push_back(DrawableFillColor("blue")); + drawList.push_back(DrawableStrokeColor("red")); + drawList.push_back(DrawableRoundRectangle(15,15, 70,70, 10,10)); + + drawList.push_back(DrawableFillColor("blue")); + drawList.push_back(DrawableStrokeColor("maroon")); + drawList.push_back(DrawableStrokeWidth(4)); + drawList.push_back(DrawableRoundRectangle(15,15, 70,70, 10,10)); + + // + // Draw curve. + // + { + drawList.push_back(DrawableStrokeColor("black")); + drawList.push_back(DrawableStrokeWidth(4)); + drawList.push_back(DrawableFillColor(Color())); + + std::list points; + points.push_back(Coordinate(20,20)); + points.push_back(Coordinate(100,50)); + points.push_back(Coordinate(50,100)); + points.push_back(Coordinate(160,160)); + drawList.push_back(DrawableBezier(points)); + } + + // + // Draw line + // + { + const double dash_array[] = {4.0, 3.0, 0.0}; + drawList.push_back(DrawableDashArray(dash_array)); + drawList.push_back(DrawableStrokeColor("red")); + drawList.push_back(DrawableStrokeWidth(1)); + drawList.push_back(DrawableLine(10,200, 54,182)); + drawList.push_back(DrawableDashArray((double *) 0)); + } + + // + // Draw arc within a circle. + // + drawList.push_back(DrawableStrokeColor("black")); + drawList.push_back(DrawableFillColor("yellow")); + drawList.push_back(DrawableStrokeWidth(4)); + drawList.push_back(DrawableCircle(160,70, 200,70)); + + drawList.push_back(DrawableStrokeColor("black")); + drawList.push_back(DrawableFillColor("blue")); + drawList.push_back(DrawableStrokeWidth(4)); + { + std::list path; + path.push_back(PathMovetoAbs(Coordinate(160,70))); + path.push_back(PathLinetoVerticalRel(-40)); + path.push_back(PathArcRel(PathArcArgs(40,40, 0, 0, 0, -40,40))); + path.push_back(PathClosePath()); + drawList.push_back(DrawablePath(path)); + } + + // + // Draw pentogram. + // + { + drawList.push_back(DrawableStrokeColor("red")); + drawList.push_back(DrawableFillColor("LimeGreen")); + drawList.push_back(DrawableStrokeWidth(3)); + + std::list points; + points.push_back(Coordinate(160,120)); + points.push_back(Coordinate(130,190)); + points.push_back(Coordinate(210,145)); + points.push_back(Coordinate(110,145)); + points.push_back(Coordinate(190,190)); + points.push_back(Coordinate(160,120)); + drawList.push_back(DrawablePolygon(points)); + } + + // + // Draw rectangle. + // + drawList.push_back(DrawableStrokeWidth(5)); + drawList.push_back(DrawableFillColor(Color())); // No fill + drawList.push_back(DrawableStrokeColor("yellow")); + drawList.push_back(DrawableLine(200,260, 200,200)); + drawList.push_back(DrawableLine(200,200, 260,200)); + drawList.push_back(DrawableStrokeColor("red")); + drawList.push_back(DrawableLine(260,200, 260,260)); + drawList.push_back(DrawableStrokeColor("green")); + drawList.push_back(DrawableLine(200,260, 260,260)); + + // + // Draw text. + // + if (getenv("MAGICK_FONT") != 0) + drawList.push_back(DrawableFont(string(getenv("MAGICK_FONT")))); + drawList.push_back(DrawableFillColor("green")); + drawList.push_back(DrawableStrokeColor(Color())); // unset color + drawList.push_back(DrawablePointSize(24)); + drawList.push_back(DrawableTranslation(30,140)); + drawList.push_back(DrawableRotation(45.0)); + drawList.push_back(DrawableText(0,0,"This is a test!")); + + // Finish drawing by popping back to base context. + drawList.push_back(DrawablePopGraphicContext()); + + // Draw everything using completed drawing list + // image.debug(true); + image.draw(drawList); + + // image.write( "piddle.mvg" ); + + cout << "Writing image \"piddle_out.miff\" ..." << endl; + image.depth( 8 ); + image.compressType( RLECompression ); + image.write( "piddle_out.miff" ); + cout << "Writing MVG metafile \"piddle_out.mvg\" ..." << endl; + image.write( "piddle_out.mvg" ); + + // cout << "Display image..." << endl; + // image.display( ); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/demo/shapes.cpp b/ImageMagick-6.9.12-44/Magick++/demo/shapes.cpp new file mode 100644 index 0000000..dde7469 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/demo/shapes.cpp @@ -0,0 +1,121 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2002, 2003 +// +// GD/PerlMagick example using Magick++ methods. +// +// Concept and algorithms lifted from PerlMagick demo script +// + +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Create a 300x300 white canvas. + // + Image image( "300x300", "white" ); + + // + // Draw texture-filled polygon + // + // Polygon list + std::list poly_coord; + poly_coord.push_back( Coordinate(30,30) ); + poly_coord.push_back( Coordinate(100,10) ); + poly_coord.push_back( Coordinate(190,290) ); + poly_coord.push_back( Coordinate(30,290) ); + + Image texture( srcdir + "tile.miff" ); + image.penTexture( texture ); + image.draw( DrawablePolygon( poly_coord ) ); + texture.isValid( false ); + image.penTexture( texture ); // Unset texture + + // + // Draw filled ellipse with black border, and red fill color + // + image.strokeColor( "black" ); + image.fillColor( "red" ); + image.strokeWidth( 5 ); + image.draw( DrawableEllipse( 100,100, 50,75, 0,360 ) ); + image.fillColor( Color() ); // Clear out fill color + + // + // Draw ellipse, and polygon, with black stroke, strokeWidth of 5 + // + image.strokeColor( "black" ); + image.strokeWidth( 5 ); + list drawlist; + + // Add polygon to list + poly_coord.clear(); + poly_coord.push_back( Coordinate(30,30) ); + poly_coord.push_back( Coordinate(100,10) ); + poly_coord.push_back( Coordinate(190,290) ); + poly_coord.push_back( Coordinate(30,290) ); + drawlist.push_back( DrawablePolygon( poly_coord ) ); + image.draw( drawlist ); + + // + // Floodfill object with blue + // + image.colorFuzz( 0.5*QuantumRange ); + image.floodFillColor( "+132+62", "blue" ); + + // + // Draw text + // + image.strokeColor(Color()); + image.fillColor( "red" ); + if (getenv("MAGICK_FONT") != 0) + image.font(string(getenv("MAGICK_FONT"))); + image.fontPointsize( 18 ); + image.annotate( "Hello world!", "+150+20" ); + + image.fillColor( "blue" ); + image.fontPointsize( 14 ); + image.annotate( "Goodbye cruel world!", "+150+38" ); + + image.fillColor( "black" ); + image.fontPointsize( 14 ); + image.annotate( "I'm climbing the wall!", "+280+120", + NorthWestGravity, 90.0 ); + //image.display(); + // + // Write image. + // + + cout << "Writing image \"shapes_out.miff\" ..." << endl; + image.depth( 8 ); + image.compressType( RLECompression ); + image.write( "shapes_out.miff" ); + + // cout << "Display image..." << endl; + // image.display( ); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/demo/smile.miff b/ImageMagick-6.9.12-44/Magick++/demo/smile.miff new file mode 100644 index 0000000000000000000000000000000000000000..0d7cb53b4c6eb5e5d06a50538067f1de7afec585 GIT binary patch literal 4814 zcmeH{y-ve05XS=&LPR_PQ}!# zfEXZ=>hpd4{=SRV1f#1}ydc-{BAGq;vt>*vx}l`N*(JAwV3sYj4Mme6SjBlx(EX+$ zK64hUl%g;Sf=%`;3{2MfBZ~Z6LRmOZvJ^$rZ8QynB299NiWHN1k`nB%nIal(M}y&D z=wq^sU(kpd30-HDpoxE%EYdhHHUyFId`eD-@!7+8j>iO(VKl*Kr?WW;=TR79|Jc7c z@jUPK=uUU7%vxCa~6RX+<%XVu!H z*T|izR>o~-(D1-~ID_*|x34L#^Wh0e1xQ0^Ly?_w6>sQ3DC~W8BAI*@zH(B!Rl_rf zo>A^NtEwP8WsYt^bTgm#znhaNh`E~_Wqv5NY@Wu&=?#t=x)2Qx@cowMUw%^<6 xJl3A5Ry5K3DY($PE4b1{p4xS@-Ht7@o4GtgW_Mfd8r_&sm97J2{QJ60;1hF8=xG1| literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/Magick++/demo/smile_anim.miff b/ImageMagick-6.9.12-44/Magick++/demo/smile_anim.miff new file mode 100644 index 0000000000000000000000000000000000000000..281894d46c78f5c034975b4d0183f16acab3201c GIT binary patch literal 15448 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/Magick++/demo/zoom.cpp b/ImageMagick-6.9.12-44/Magick++/demo/zoom.cpp new file mode 100644 index 0000000..8db2c8e --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/demo/zoom.cpp @@ -0,0 +1,191 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 2001, 2002, 2003 +// +// Resize image using specified resize algorithm with Magick++ API +// +// Usage: zoom [-density resolution] [-filter algorithm] [-geometry geometry] +// [-resample resolution] input_file output_file +// + +#include +#include +#include +using namespace std; +using namespace Magick; + +static void Usage ( char **argv ) +{ + cout << "Usage: " << argv[0] + << " [-density resolution] [-filter algorithm] [-geometry geometry]" + << " [-resample resolution] input_file output_file" << endl + << " algorithm - bessel blackman box catrom cubic gaussian hamming hanning" << endl + << " hermite lanczos mitchell point quadratic sample scale sinc triangle" << endl; + exit(1); +} + +static void ParseError (int position, char **argv) +{ + cout << "Argument \"" << argv[position] << "\" at position" << position + << "incorrect" << endl; + Usage(argv); +} + +int main(int argc,char **argv) +{ + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + if ( argc < 2 ) + Usage(argv); + + enum ResizeAlgorithm + { + Zoom, + Scale, + Sample + }; + + { + Geometry density; + Geometry geometry; + Geometry resample; + Magick::FilterTypes filter(LanczosFilter); + ResizeAlgorithm resize_algorithm=Zoom; + + int argv_index=1; + while ((argv_index < argc - 2) && (*argv[argv_index] == '-')) + { + std::string command(argv[argv_index]); + if (command.compare("-density") == 0) + { + argv_index++; + try { + density=Geometry(argv[argv_index]); + } + catch( exception &/* error_ */) + { + ParseError(argv_index,argv); + } + argv_index++; + continue; + } + else if (command.compare("-filter") == 0) + { + argv_index++; + std::string algorithm(argv[argv_index]); + if (algorithm.compare("point") == 0) + filter=PointFilter; + else if (algorithm.compare("box") == 0) + filter=BoxFilter; + else if (algorithm.compare("triangle") == 0) + filter=TriangleFilter; + else if (algorithm.compare("hermite") == 0) + filter=HermiteFilter; + else if (algorithm.compare("hanning") == 0) + filter=HanningFilter; + else if (algorithm.compare("hamming") == 0) + filter=HammingFilter; + else if (algorithm.compare("blackman") == 0) + filter=BlackmanFilter; + else if (algorithm.compare("gaussian") == 0) + filter=GaussianFilter; + else if (algorithm.compare("quadratic") == 0) + filter=QuadraticFilter; + else if (algorithm.compare("cubic") == 0) + filter=CubicFilter; + else if (algorithm.compare("catrom") == 0) + filter=CatromFilter; + else if (algorithm.compare("mitchell") == 0) + filter=MitchellFilter; + else if (algorithm.compare("lanczos") == 0) + filter=LanczosFilter; + else if (algorithm.compare("bessel") == 0) + filter=BesselFilter; + else if (algorithm.compare("sinc") == 0) + filter=SincFilter; + else if (algorithm.compare("sample") == 0) + resize_algorithm=Sample; + else if (algorithm.compare("scale") == 0) + resize_algorithm=Scale; + else + ParseError(argv_index,argv); + argv_index++; + continue; + } + else if (command.compare("-geometry") == 0) + { + argv_index++; + try { + geometry=Geometry(argv[argv_index]); + } + catch( exception &/* error_ */) + { + ParseError(argv_index,argv); + } + argv_index++; + continue; + } + else if (command.compare("-resample") == 0) + { + argv_index++; + try { + resample=Geometry(argv[argv_index]); + } + catch( exception &/* error_ */) + { + ParseError(argv_index,argv); + } + argv_index++; + continue; + } + ParseError(argv_index,argv); + } + + if (argv_index>argc-1) + ParseError(argv_index,argv); + std::string input_file(argv[argv_index]); + argv_index++; + if (argv_index>argc) + ParseError(argv_index,argv); + std::string output_file(argv[argv_index]); + + try { + Image image(input_file); + if (density.isValid()) + image.density(density); + density=image.density(); + + if (resample.isValid()) + { + geometry = + Geometry(static_cast + (image.columns()*((double)resample.width()/density.width())+0.5), + static_cast + (image.rows()*((double)resample.height()/density.height())+0.5)); + image.density(resample); + } + switch (resize_algorithm) + { + case Sample: + image.sample(geometry); + break; + case Scale: + image.scale(geometry); + break; + case Zoom: + image.filterType(filter); + image.zoom(geometry); + break; + } + image.write(output_file); + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/examples/analyze.cpp b/ImageMagick-6.9.12-44/Magick++/examples/analyze.cpp new file mode 100644 index 0000000..50f82e2 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/examples/analyze.cpp @@ -0,0 +1,71 @@ +// +// Demonstrate using the 'analyze' process module to compute +// image statistics. +// +// Copyright Bob Friesenhahn, 2003, 2004 +// +// Usage: analyze file... +// + +#include +#include +#include +#include +using namespace std; +using namespace Magick; +int main(int argc,char **argv) +{ + if ( argc < 2 ) + { + cout << "Usage: " << argv[0] << " file..." << endl; + exit( 1 ); + } + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + { + std::list attributes; + + attributes.push_back("TopLeftColor"); + attributes.push_back("TopRightColor"); + attributes.push_back("BottomLeftColor"); + attributes.push_back("BottomRightColor"); + attributes.push_back("filter:brightness:mean"); + attributes.push_back("filter:brightness:standard-deviation"); + attributes.push_back("filter:brightness:kurtosis"); + attributes.push_back("filter:brightness:skewness"); + attributes.push_back("filter:saturation:mean"); + attributes.push_back("filter:saturation:standard-deviation"); + attributes.push_back("filter:saturation:kurtosis"); + attributes.push_back("filter:saturation:skewness"); + + char **arg = &argv[1]; + while ( *arg ) + { + string fname(*arg); + try { + cout << "File: " << fname << endl; + Image image( fname ); + + /* Analyze module does not require an argument list */ + image.process("analyze",0,0); + + list::iterator pos = attributes.begin(); + while(pos != attributes.end()) + { + cout << " " << setw(16) << setfill(' ') << setiosflags(ios::left) + << *pos << " = " << image.attribute(*pos) << endl; + pos++; + } + } + catch( Exception &error_ ) + { + cout << error_.what() << endl; + } + ++arg; + } + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/examples/button.cpp b/ImageMagick-6.9.12-44/Magick++/examples/button.cpp new file mode 100644 index 0000000..88db625 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/examples/button.cpp @@ -0,0 +1,102 @@ +// +// Magick++ demo to generate a simple text button +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2003 +// + +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Options + // + + string backGround = "xc:#CCCCCC"; // A solid color + + // Color to use for decorative border + Color border = "#D4DCF3"; + + // Button size + string buttonSize = "120x20"; + + // Button background texture + string buttonTexture = "granite:"; + + // Button text + string text = "Button Text"; + + // Button text color + string textColor = "red"; + + // Font point size + int fontPointSize = 16; + + // + // Magick++ operations + // + + Image button; + + // Set button size + button.size( buttonSize ); + + // Read background image + button.read( backGround ); + + // Set background to buttonTexture + Image backgroundTexture( buttonTexture ); + button.texture( backgroundTexture ); + + // Add some text + button.fillColor( textColor ); + button.fontPointsize( fontPointSize ); + if (getenv("MAGICK_FONT") != 0) + button.font(string(getenv("MAGICK_FONT"))); + button.annotate( text, CenterGravity ); + + // Add a decorative frame + button.borderColor( border ); + button.frame( "6x6+3+3" ); + + button.depth( 8 ); + + // Quantize to desired colors + // button.quantizeTreeDepth(8); + button.quantizeDither(false); + button.quantizeColors(64); + button.quantize(); + + // Save to file + cout << "Writing to \"button_out.miff\" ..." << endl; + button.compressType( RLECompression ); + button.write("button_out.miff"); + + // Display on screen + // button.display(); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/examples/demo.cpp b/ImageMagick-6.9.12-44/Magick++/examples/demo.cpp new file mode 100644 index 0000000..164e0ab --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/examples/demo.cpp @@ -0,0 +1,516 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// +// Simple demo program for Magick++ +// +// Concept and algorithms lifted from PerlMagick demo script written +// by John Christy. +// +// Max run-time size 60MB (as compared with 95MB for PerlMagick) under SPARC Solaris +// + +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + list montage; + + { + // + // Read model & smile image. + // + cout << "Read images ..." << endl; + + Image model( srcdir + "model.miff" ); + model.label( "Magick++" ); + model.borderColor( "black" ); + model.backgroundColor( "black" ); + + Image smile( srcdir + "smile.miff" ); + smile.label( "Smile" ); + smile.borderColor( "black" ); + + // + // Create image stack. + // + cout << "Creating thumbnails..." << endl; + + // Construct initial list containing seven copies of a null image + Image null; + null.size( Geometry(70,70) ); + null.read( "NULL:black" ); + list images( 7, null ); + + Image example = model; + + // Each of the following follow the pattern + // 1. obtain reference to (own copy of) image + // 2. apply label to image + // 3. apply operation to image + // 4. append image to container + + cout << " add noise ..." << endl; + example.label( "Add Noise" ); + example.addNoise( LaplacianNoise ); + images.push_back( example ); + + cout << " add noise (blue) ..." << endl; + example.label( "Add Noise\n(Blue Channel)" ); + example.addNoiseChannel( BlueChannel, PoissonNoise ); + images.push_back( example ); + + cout << " annotate ..." << endl; + example = model; + example.label( "Annotate" ); + example.density( "72x72" ); + example.fontPointsize( 18 ); + if (getenv("MAGICK_FONT") != 0) + example.font(string(getenv("MAGICK_FONT"))); + example.strokeColor( Color() ); + example.fillColor( "gold" ); + example.annotate( "Magick++", "+0+20", NorthGravity ); + images.push_back( example ); + + cout << " blur ..." << endl; + example = model; + example.label( "Blur" ); + example.blur( 0, 1.5 ); + images.push_back( example ); + + cout << " blur red channel ..." << endl; + example = model; + example.label( "Blur Channel\n(Red Channel)" ); + example.blurChannel( RedChannel, 0, 3.0 ); + images.push_back( example ); + + cout << " border ..." << endl; + example = model; + example.label( "Border" ); + example.borderColor( "gold" ); + example.border( Geometry(6,6) ); + images.push_back( example ); + + cout << " channel ..." << endl; + example = model; + example.label( "Channel\n(Red Channel)" ); + example.channel( RedChannel ); + images.push_back( example ); + + cout << " charcoal ..." << endl; + example = model; + example.label( "Charcoal" ); + example.charcoal( ); + images.push_back( example ); + + cout << " composite ..." << endl; + example = model; + example.label( "Composite" ); + example.composite( smile, "+35+65", OverCompositeOp); + images.push_back( example ); + + cout << " contrast ..." << endl; + example = model; + example.label( "Contrast" ); + example.contrast( false ); + images.push_back( example ); + + cout << " convolve ..." << endl; + example = model; + example.label( "Convolve" ); + { + // 3x3 matrix + const double kernel[] = { 1, 1, 1, 1, 4, 1, 1, 1, 1 }; + example.convolve( 3, kernel ); + } + images.push_back( example ); + + cout << " crop ..." << endl; + example = model; + example.label( "Crop" ); + example.crop( "80x80+25+50" ); + images.push_back( example ); + + cout << " despeckle ..." << endl; + example = model; + example.label( "Despeckle" ); + example.despeckle( ); + images.push_back( example ); + + cout << " draw ..." << endl; + example = model; + example.label( "Draw" ); + example.fillColor(Color()); + example.strokeColor( "gold" ); + example.strokeWidth( 2 ); + example.draw( DrawableCircle( 60,90, 60,120 ) ); + images.push_back( example ); + + cout << " edge ..." << endl; + example = model; + example.label( "Detect Edges" ); + example.edge( ); + images.push_back( example ); + + cout << " emboss ..." << endl; + example = model; + example.label( "Emboss" ); + example.emboss( ); + images.push_back( example ); + + cout << " equalize ..." << endl; + example = model; + example.label( "Equalize" ); + example.equalize( ); + images.push_back( example ); + + cout << " explode ..." << endl; + example = model; + example.label( "Explode" ); + example.backgroundColor( "#000000FF" ); + example.implode( -1 ); + images.push_back( example ); + + cout << " flip ..." << endl; + example = model; + example.label( "Flip" ); + example.flip( ); + images.push_back( example ); + + cout << " flop ..." << endl; + example = model; + example.label( "Flop" ); + example.flop(); + images.push_back( example ); + + cout << " frame ..." << endl; + example = model; + example.label( "Frame" ); + example.frame( ); + images.push_back( example ); + + cout << " gamma ..." << endl; + example = model; + example.label( "Gamma" ); + example.gamma( 1.6 ); + images.push_back( example ); + + cout << " gaussian blur ..." << endl; + example = model; + example.label( "Gaussian Blur" ); + example.gaussianBlur( 0.0, 1.5 ); + images.push_back( example ); + + cout << " gaussian blur channel ..." << endl; + example = model; + example.label( "Gaussian Blur\n(Green Channel)" ); + example.gaussianBlurChannel( GreenChannel, 0.0, 1.5 ); + images.push_back( example ); + + cout << " gradient ..." << endl; + Image gradient; + gradient.size( "130x194" ); + gradient.read( "gradient:#20a0ff-#ffff00" ); + gradient.label( "Gradient" ); + images.push_back( gradient ); + + cout << " grayscale ..." << endl; + example = model; + example.label( "Grayscale" ); + example.quantizeColorSpace( GRAYColorspace ); + example.quantize( ); + images.push_back( example ); + + cout << " implode ..." << endl; + example = model; + example.label( "Implode" ); + example.implode( 0.5 ); + images.push_back( example ); + + cout << " level ..." << endl; + example = model; + example.label( "Level" ); + example.level( 0.20*QuantumRange, 0.90*QuantumRange, 1.20 ); + images.push_back( example ); + + cout << " level red channel ..." << endl; + example = model; + example.label( "Level Channel\n(Red Channel)" ); + example.levelChannel( RedChannel, 0.20*QuantumRange, 0.90*QuantumRange, 1.20 ); + images.push_back( example ); + + cout << " median filter ..." << endl; + example = model; + example.label( "Median Filter" ); + example.medianFilter( ); + images.push_back( example ); + + cout << " modulate ..." << endl; + example = model; + example.label( "Modulate" ); + example.modulate( 110, 110, 110 ); + images.push_back( example ); + + cout << " monochrome ..." << endl; + example = model; + example.label( "Monochrome" ); + example.quantizeColorSpace( GRAYColorspace ); + example.quantizeColors( 2 ); + example.quantizeDither( false ); + example.quantize( ); + images.push_back( example ); + + cout << " motion blur ..." << endl; + example = model; + example.label( "Motion Blur" ); + example.motionBlur( 0.0, 7.0,45 ); + images.push_back( example ); + + cout << " negate ..." << endl; + example = model; + example.label( "Negate" ); + example.negate( ); + images.push_back( example ); + + cout << " normalize ..." << endl; + example = model; + example.label( "Normalize" ); + example.normalize( ); + images.push_back( example ); + + cout << " oil paint ..." << endl; + example = model; + example.label( "Oil Paint" ); + example.oilPaint( ); + images.push_back( example ); + + cout << " ordered dither 2x2 ..." << endl; + example = model; + example.label( "Ordered Dither\n(2x2)" ); + example.randomThreshold( Geometry(2,2) ); + images.push_back( example ); + + cout << " ordered dither 3x3..." << endl; + example = model; + example.label( "Ordered Dither\n(3x3)" ); + example.randomThreshold( Geometry(3,3) ); + images.push_back( example ); + + cout << " ordered dither 4x4..." << endl; + example = model; + example.label( "Ordered Dither\n(4x4)" ); + example.randomThreshold( Geometry(4,4) ); + images.push_back( example ); + + cout << " ordered dither red 4x4..." << endl; + example = model; + example.label( "Ordered Dither\n(Red 4x4)" ); + example.randomThresholdChannel( Geometry(4,4), RedChannel); + images.push_back( example ); + + cout << " plasma ..." << endl; + Image plasma; + plasma.size( "130x194" ); + plasma.read( "plasma:fractal" ); + plasma.label( "Plasma" ); + images.push_back( plasma ); + + cout << " quantize ..." << endl; + example = model; + example.label( "Quantize" ); + example.quantize( ); + images.push_back( example ); + + cout << " quantum operator ..." << endl; + example = model; + example.label( "Quantum Operator\nRed * 0.4" ); + example.quantumOperator( RedChannel,MultiplyEvaluateOperator,0.40 ); + images.push_back( example ); + + cout << " raise ..." << endl; + example = model; + example.label( "Raise" ); + example.raise( ); + images.push_back( example ); + + cout << " reduce noise ..." << endl; + example = model; + example.label( "Reduce Noise" ); + example.reduceNoise( 1.0 ); + images.push_back( example ); + + cout << " resize ..." << endl; + example = model; + example.label( "Resize" ); + example.zoom( "50%" ); + images.push_back( example ); + + cout << " roll ..." << endl; + example = model; + example.label( "Roll" ); + example.roll( "+20+10" ); + images.push_back( example ); + + cout << " rotate ..." << endl; + example = model; + example.label( "Rotate" ); + example.rotate( 45 ); + example.transparent( "black" ); + images.push_back( example ); + + cout << " scale ..." << endl; + example = model; + example.label( "Scale" ); + example.scale( "60%" ); + images.push_back( example ); + + cout << " segment ..." << endl; + example = model; + example.label( "Segment" ); + example.segment( 0.5, 0.25 ); + images.push_back( example ); + + cout << " shade ..." << endl; + example = model; + example.label( "Shade" ); + example.shade( 30, 30, false ); + images.push_back( example ); + + cout << " sharpen ..." << endl; + example = model; + example.label("Sharpen"); + example.sharpen( 0.0, 1.0 ); + images.push_back( example ); + + cout << " shave ..." << endl; + example = model; + example.label("Shave"); + example.shave( Geometry( 10, 10) ); + images.push_back( example ); + + cout << " shear ..." << endl; + example = model; + example.label( "Shear" ); + example.shear( 45, 45 ); + example.transparent( "black" ); + images.push_back( example ); + + cout << " spread ..." << endl; + example = model; + example.label( "Spread" ); + example.spread( 3 ); + images.push_back( example ); + + cout << " solarize ..." << endl; + example = model; + example.label( "Solarize" ); + example.solarize( ); + images.push_back( example ); + + cout << " swirl ..." << endl; + example = model; + example.backgroundColor( "#000000FF" ); + example.label( "Swirl" ); + example.swirl( 90 ); + images.push_back( example ); + + cout << " threshold ..." << endl; + example = model; + example.label( "Threshold" ); + example.threshold( QuantumRange/2.0 ); + images.push_back( example ); + + cout << " threshold random ..." << endl; + example = model; + example.label( "Random\nThreshold" ); + example.randomThreshold( Geometry((size_t) (0.3*QuantumRange), + (size_t) (0.85*QuantumRange)) ); + images.push_back( example ); + + cout << " unsharp mask ..." << endl; + example = model; + example.label( "Unsharp Mask" ); + // radius_, sigma_, amount_, threshold_ + example.unsharpmask( 0.0, 1.0, 1.0, 0.05); + images.push_back( example ); + + cout << " wave ..." << endl; + example = model; + example.label( "Wave" ); + example.matte( true ); + example.backgroundColor( "#000000FF" ); + example.wave( 25, 150 ); + images.push_back( example ); + + // + // Create image montage. + // + cout << "Montage images..." << endl; + + for_each( images.begin(), images.end(), strokeColorImage( Color("#600") ) ); + + MontageFramed montageOpts; + montageOpts.geometry( "130x194+10+5>" ); + montageOpts.gravity( CenterGravity ); + montageOpts.borderColor( "green" ); + montageOpts.borderWidth( 1 ); + montageOpts.tile( "7x4" ); + montageOpts.compose( OverCompositeOp ); + montageOpts.backgroundColor( "#ffffff" ); + montageOpts.pointSize( 18 ); + montageOpts.fillColor( "#600" ); + montageOpts.strokeColor( Color() ); + montageOpts.compose(OverCompositeOp); + montageOpts.fileName( "Magick++ Demo" ); + montageImages( &montage, images.begin(), images.end(), montageOpts ); + } + + Image& montage_image = montage.front(); + { + // Create logo image + cout << "Adding logo image ..." << endl; + Image logo( "logo:" ); + logo.zoom( "45%" ); + + // Composite logo into montage image + Geometry placement(0,0,(montage_image.columns()/2)-(logo.columns()/2),0); + montage_image.composite( logo, placement, OverCompositeOp ); + } + + for_each( montage.begin(), montage.end(), depthImage(8) ); + for_each( montage.begin(), montage.end(), matteImage( false ) ); + for_each( montage.begin(), montage.end(), compressTypeImage( RLECompression) ); + + cout << "Writing image \"demo_out.miff\" ..." << endl; + writeImages(montage.begin(),montage.end(),"demo_out_%d.miff"); + + // Uncomment following lines to display image to screen + // cout << "Display image..." << endl; + // montage_image.display(); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/examples/detrans.cpp b/ImageMagick-6.9.12-44/Magick++/examples/detrans.cpp new file mode 100644 index 0000000..65932d6 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/examples/detrans.cpp @@ -0,0 +1,60 @@ +// +// Replace transparency in an image with a solid color using Magick++ +// +// Useful to see how a transparent image looks on a particular +// background color, or to create a similar looking effect without +// transparency. +// +// Copyright Bob Friesenhahn, 2000 +// +// Usage: detrans color file... +// + +#include +#include +using namespace std; +using namespace Magick; +int main(int argc,char **argv) +{ + if ( argc < 3 ) + { + cout << "Usage: " << argv[0] << " background_color file..." << endl; + exit( 1 ); + } + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + { + Color color; + try { + color = Color(argv[1]); + } + catch ( Exception &error_ ) + { + cout << error_.what() << endl; + cout.flush(); + exit(1); + } + + char **arg = &argv[2]; + while ( *arg ) + { + string fname(*arg); + try { + Image overlay( fname ); + Image base( overlay.size(), color ); + base.composite( overlay, 0, 0, OverCompositeOp ); + base.matte( false ); + base.write( fname ); + } + catch( Exception &error_ ) + { + cout << error_.what() << endl; + } + ++arg; + } + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/examples/flip.cpp b/ImageMagick-6.9.12-44/Magick++/examples/flip.cpp new file mode 100644 index 0000000..61dae19 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/examples/flip.cpp @@ -0,0 +1,60 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2003 +// +// Demonstration of unary function-object based operations +// +// Reads the multi-frame file "smile_anim.miff" and writes a +// flipped and morphed version to "flip_out.miff". +// + +#include +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // Read images into STL list + list imageList; + readImages( &imageList, srcdir + "smile_anim.miff" ); + + // cout << "Total scenes: " << imageList.size() << endl; + + // Flip images + for_each( imageList.begin(), imageList.end(), flipImage() ); + + // Create a morphed version, adding three frames between each + // existing frame. + list morphed; + morphImages( &morphed, imageList.begin(), imageList.end(), 3 ); + + // Write out images + cout << "Writing image \"flip_out.miff\" ..." << endl; + writeImages( morphed.begin(), morphed.end(), "flip_out.miff" ); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/examples/gravity.cpp b/ImageMagick-6.9.12-44/Magick++/examples/gravity.cpp new file mode 100644 index 0000000..c262515 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/examples/gravity.cpp @@ -0,0 +1,83 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 2000, 2001, 2003 +// +// Demo of text annotation with gravity. Produces an animation showing +// the effect of rotated text assize_t with various gravity specifications. +// +// After running demo program, run 'animate gravity_out.miff' if you +// are using X-Windows to see an animated result. +// +// Concept and algorithms lifted from PerlMagick demo script written +// by John Christy. +// + +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + int x = 100; + int y = 100; + + list animation; + + Image base( Geometry(600,600), Color("white") ); + base.depth(8); + base.strokeColor("#600"); + base.fillColor(Color()); + base.draw( DrawableLine( 300,100, 300,500 ) ); + base.draw( DrawableLine( 100,300, 500,300 ) ); + base.draw( DrawableRectangle( 100,100, 500,500 ) ); + base.density( Geometry(72,72) ); + base.strokeColor(Color()); + base.fillColor("#600"); + base.fontPointsize( 30 ); + base.boxColor( "red" ); + base.animationDelay( 20 ); + base.compressType( RLECompression ); + + for ( int angle = 0; angle < 360; angle += 30 ) + { + cout << "angle " << angle << endl; + Image pic = base; + pic.annotate( "NorthWest", Geometry(0,0,x,y), NorthWestGravity, angle ); + pic.annotate( "North", Geometry(0,0,0,y), NorthGravity, angle ); + pic.annotate( "NorthEast", Geometry(0,0,x,y), NorthEastGravity, angle ); + pic.annotate( "East", Geometry(0,0,x,0), EastGravity, angle ); + pic.annotate( "Center", Geometry(0,0,0,0), CenterGravity, angle ); + pic.annotate( "SouthEast", Geometry(0,0,x,y), SouthEastGravity, angle ); + pic.annotate( "South", Geometry(0,0,0,y), SouthGravity, angle ); + pic.annotate( "SouthWest", Geometry(0,0,x,y), SouthWestGravity, angle ); + pic.annotate( "West", Geometry(0,0,x,0), WestGravity, angle ); + animation.push_back( pic ); + } + cout << "Writing image \"gravity_out.miff\" ..." << endl; + writeImages( animation.begin(), animation.end(), "gravity_out.miff" ); + // system( "animate gravity_out.miff" ); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/examples/model.miff b/ImageMagick-6.9.12-44/Magick++/examples/model.miff new file mode 100644 index 0000000000000000000000000000000000000000..daa77871b715968ea2170070e0688e20b0af1d3e GIT binary patch literal 25564 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 +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Create a 300x300 white canvas. + // + Image image( "300x300", "white" ); + + // Drawing list + std::list drawList; + + // Start drawing by pushing a drawing context with specified + // viewbox size + drawList.push_back(DrawablePushGraphicContext()); + drawList.push_back(DrawableViewbox(0,0,image.columns(),image.rows())); + + // + // Draw blue grid + // + drawList.push_back(DrawableStrokeColor("#ccf")); + for ( int i=0; i < 300; i += 10 ) + { + drawList.push_back(DrawableLine(i,0, i,300)); + drawList.push_back(DrawableLine(0,i, 300,i)); + } + + // + // Draw rounded rectangle. + // + drawList.push_back(DrawableFillColor("blue")); + drawList.push_back(DrawableStrokeColor("red")); + drawList.push_back(DrawableRoundRectangle(15,15, 70,70, 10,10)); + + drawList.push_back(DrawableFillColor("blue")); + drawList.push_back(DrawableStrokeColor("maroon")); + drawList.push_back(DrawableStrokeWidth(4)); + drawList.push_back(DrawableRoundRectangle(15,15, 70,70, 10,10)); + + // + // Draw curve. + // + { + drawList.push_back(DrawableStrokeColor("black")); + drawList.push_back(DrawableStrokeWidth(4)); + drawList.push_back(DrawableFillColor(Color())); + + std::list points; + points.push_back(Coordinate(20,20)); + points.push_back(Coordinate(100,50)); + points.push_back(Coordinate(50,100)); + points.push_back(Coordinate(160,160)); + drawList.push_back(DrawableBezier(points)); + } + + // + // Draw line + // + { + const double dash_array[] = {4.0, 3.0, 0.0}; + drawList.push_back(DrawableDashArray(dash_array)); + drawList.push_back(DrawableStrokeColor("red")); + drawList.push_back(DrawableStrokeWidth(1)); + drawList.push_back(DrawableLine(10,200, 54,182)); + drawList.push_back(DrawableDashArray((double *) 0)); + } + + // + // Draw arc within a circle. + // + drawList.push_back(DrawableStrokeColor("black")); + drawList.push_back(DrawableFillColor("yellow")); + drawList.push_back(DrawableStrokeWidth(4)); + drawList.push_back(DrawableCircle(160,70, 200,70)); + + drawList.push_back(DrawableStrokeColor("black")); + drawList.push_back(DrawableFillColor("blue")); + drawList.push_back(DrawableStrokeWidth(4)); + { + std::list path; + path.push_back(PathMovetoAbs(Coordinate(160,70))); + path.push_back(PathLinetoVerticalRel(-40)); + path.push_back(PathArcRel(PathArcArgs(40,40, 0, 0, 0, -40,40))); + path.push_back(PathClosePath()); + drawList.push_back(DrawablePath(path)); + } + + // + // Draw pentogram. + // + { + drawList.push_back(DrawableStrokeColor("red")); + drawList.push_back(DrawableFillColor("LimeGreen")); + drawList.push_back(DrawableStrokeWidth(3)); + + std::list points; + points.push_back(Coordinate(160,120)); + points.push_back(Coordinate(130,190)); + points.push_back(Coordinate(210,145)); + points.push_back(Coordinate(110,145)); + points.push_back(Coordinate(190,190)); + points.push_back(Coordinate(160,120)); + drawList.push_back(DrawablePolygon(points)); + } + + // + // Draw rectangle. + // + drawList.push_back(DrawableStrokeWidth(5)); + drawList.push_back(DrawableFillColor(Color())); // No fill + drawList.push_back(DrawableStrokeColor("yellow")); + drawList.push_back(DrawableLine(200,260, 200,200)); + drawList.push_back(DrawableLine(200,200, 260,200)); + drawList.push_back(DrawableStrokeColor("red")); + drawList.push_back(DrawableLine(260,200, 260,260)); + drawList.push_back(DrawableStrokeColor("green")); + drawList.push_back(DrawableLine(200,260, 260,260)); + + // + // Draw text. + // + if (getenv("MAGICK_FONT") != 0) + drawList.push_back(DrawableFont(string(getenv("MAGICK_FONT")))); + drawList.push_back(DrawableFillColor("green")); + drawList.push_back(DrawableStrokeColor(Color())); // unset color + drawList.push_back(DrawablePointSize(24)); + drawList.push_back(DrawableTranslation(30,140)); + drawList.push_back(DrawableRotation(45.0)); + drawList.push_back(DrawableText(0,0,"This is a test!")); + + // Finish drawing by popping back to base context. + drawList.push_back(DrawablePopGraphicContext()); + + // Draw everything using completed drawing list + // image.debug(true); + image.draw(drawList); + + // image.write( "piddle.mvg" ); + + cout << "Writing image \"piddle_out.miff\" ..." << endl; + image.depth( 8 ); + image.compressType( RLECompression ); + image.write( "piddle_out.miff" ); + cout << "Writing MVG metafile \"piddle_out.mvg\" ..." << endl; + image.write( "piddle_out.mvg" ); + + // cout << "Display image..." << endl; + // image.display( ); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/examples/shapes.cpp b/ImageMagick-6.9.12-44/Magick++/examples/shapes.cpp new file mode 100644 index 0000000..dde7469 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/examples/shapes.cpp @@ -0,0 +1,121 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2002, 2003 +// +// GD/PerlMagick example using Magick++ methods. +// +// Concept and algorithms lifted from PerlMagick demo script +// + +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Create a 300x300 white canvas. + // + Image image( "300x300", "white" ); + + // + // Draw texture-filled polygon + // + // Polygon list + std::list poly_coord; + poly_coord.push_back( Coordinate(30,30) ); + poly_coord.push_back( Coordinate(100,10) ); + poly_coord.push_back( Coordinate(190,290) ); + poly_coord.push_back( Coordinate(30,290) ); + + Image texture( srcdir + "tile.miff" ); + image.penTexture( texture ); + image.draw( DrawablePolygon( poly_coord ) ); + texture.isValid( false ); + image.penTexture( texture ); // Unset texture + + // + // Draw filled ellipse with black border, and red fill color + // + image.strokeColor( "black" ); + image.fillColor( "red" ); + image.strokeWidth( 5 ); + image.draw( DrawableEllipse( 100,100, 50,75, 0,360 ) ); + image.fillColor( Color() ); // Clear out fill color + + // + // Draw ellipse, and polygon, with black stroke, strokeWidth of 5 + // + image.strokeColor( "black" ); + image.strokeWidth( 5 ); + list drawlist; + + // Add polygon to list + poly_coord.clear(); + poly_coord.push_back( Coordinate(30,30) ); + poly_coord.push_back( Coordinate(100,10) ); + poly_coord.push_back( Coordinate(190,290) ); + poly_coord.push_back( Coordinate(30,290) ); + drawlist.push_back( DrawablePolygon( poly_coord ) ); + image.draw( drawlist ); + + // + // Floodfill object with blue + // + image.colorFuzz( 0.5*QuantumRange ); + image.floodFillColor( "+132+62", "blue" ); + + // + // Draw text + // + image.strokeColor(Color()); + image.fillColor( "red" ); + if (getenv("MAGICK_FONT") != 0) + image.font(string(getenv("MAGICK_FONT"))); + image.fontPointsize( 18 ); + image.annotate( "Hello world!", "+150+20" ); + + image.fillColor( "blue" ); + image.fontPointsize( 14 ); + image.annotate( "Goodbye cruel world!", "+150+38" ); + + image.fillColor( "black" ); + image.fontPointsize( 14 ); + image.annotate( "I'm climbing the wall!", "+280+120", + NorthWestGravity, 90.0 ); + //image.display(); + // + // Write image. + // + + cout << "Writing image \"shapes_out.miff\" ..." << endl; + image.depth( 8 ); + image.compressType( RLECompression ); + image.write( "shapes_out.miff" ); + + // cout << "Display image..." << endl; + // image.display( ); + + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/examples/smile.miff b/ImageMagick-6.9.12-44/Magick++/examples/smile.miff new file mode 100644 index 0000000000000000000000000000000000000000..0d7cb53b4c6eb5e5d06a50538067f1de7afec585 GIT binary patch literal 4814 zcmeH{y-ve05XS=&LPR_PQ}!# zfEXZ=>hpd4{=SRV1f#1}ydc-{BAGq;vt>*vx}l`N*(JAwV3sYj4Mme6SjBlx(EX+$ zK64hUl%g;Sf=%`;3{2MfBZ~Z6LRmOZvJ^$rZ8QynB299NiWHN1k`nB%nIal(M}y&D z=wq^sU(kpd30-HDpoxE%EYdhHHUyFId`eD-@!7+8j>iO(VKl*Kr?WW;=TR79|Jc7c z@jUPK=uUU7%vxCa~6RX+<%XVu!H z*T|izR>o~-(D1-~ID_*|x34L#^Wh0e1xQ0^Ly?_w6>sQ3DC~W8BAI*@zH(B!Rl_rf zo>A^NtEwP8WsYt^bTgm#znhaNh`E~_Wqv5NY@Wu&=?#t=x)2Qx@cowMUw%^<6 xJl3A5Ry5K3DY($PE4b1{p4xS@-Ht7@o4GtgW_Mfd8r_&sm97J2{QJ60;1hF8=xG1| literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/Magick++/examples/smile_anim.miff b/ImageMagick-6.9.12-44/Magick++/examples/smile_anim.miff new file mode 100644 index 0000000000000000000000000000000000000000..281894d46c78f5c034975b4d0183f16acab3201c GIT binary patch literal 15448 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/Magick++/examples/zoom.cpp b/ImageMagick-6.9.12-44/Magick++/examples/zoom.cpp new file mode 100644 index 0000000..8db2c8e --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/examples/zoom.cpp @@ -0,0 +1,191 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 2001, 2002, 2003 +// +// Resize image using specified resize algorithm with Magick++ API +// +// Usage: zoom [-density resolution] [-filter algorithm] [-geometry geometry] +// [-resample resolution] input_file output_file +// + +#include +#include +#include +using namespace std; +using namespace Magick; + +static void Usage ( char **argv ) +{ + cout << "Usage: " << argv[0] + << " [-density resolution] [-filter algorithm] [-geometry geometry]" + << " [-resample resolution] input_file output_file" << endl + << " algorithm - bessel blackman box catrom cubic gaussian hamming hanning" << endl + << " hermite lanczos mitchell point quadratic sample scale sinc triangle" << endl; + exit(1); +} + +static void ParseError (int position, char **argv) +{ + cout << "Argument \"" << argv[position] << "\" at position" << position + << "incorrect" << endl; + Usage(argv); +} + +int main(int argc,char **argv) +{ + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + if ( argc < 2 ) + Usage(argv); + + enum ResizeAlgorithm + { + Zoom, + Scale, + Sample + }; + + { + Geometry density; + Geometry geometry; + Geometry resample; + Magick::FilterTypes filter(LanczosFilter); + ResizeAlgorithm resize_algorithm=Zoom; + + int argv_index=1; + while ((argv_index < argc - 2) && (*argv[argv_index] == '-')) + { + std::string command(argv[argv_index]); + if (command.compare("-density") == 0) + { + argv_index++; + try { + density=Geometry(argv[argv_index]); + } + catch( exception &/* error_ */) + { + ParseError(argv_index,argv); + } + argv_index++; + continue; + } + else if (command.compare("-filter") == 0) + { + argv_index++; + std::string algorithm(argv[argv_index]); + if (algorithm.compare("point") == 0) + filter=PointFilter; + else if (algorithm.compare("box") == 0) + filter=BoxFilter; + else if (algorithm.compare("triangle") == 0) + filter=TriangleFilter; + else if (algorithm.compare("hermite") == 0) + filter=HermiteFilter; + else if (algorithm.compare("hanning") == 0) + filter=HanningFilter; + else if (algorithm.compare("hamming") == 0) + filter=HammingFilter; + else if (algorithm.compare("blackman") == 0) + filter=BlackmanFilter; + else if (algorithm.compare("gaussian") == 0) + filter=GaussianFilter; + else if (algorithm.compare("quadratic") == 0) + filter=QuadraticFilter; + else if (algorithm.compare("cubic") == 0) + filter=CubicFilter; + else if (algorithm.compare("catrom") == 0) + filter=CatromFilter; + else if (algorithm.compare("mitchell") == 0) + filter=MitchellFilter; + else if (algorithm.compare("lanczos") == 0) + filter=LanczosFilter; + else if (algorithm.compare("bessel") == 0) + filter=BesselFilter; + else if (algorithm.compare("sinc") == 0) + filter=SincFilter; + else if (algorithm.compare("sample") == 0) + resize_algorithm=Sample; + else if (algorithm.compare("scale") == 0) + resize_algorithm=Scale; + else + ParseError(argv_index,argv); + argv_index++; + continue; + } + else if (command.compare("-geometry") == 0) + { + argv_index++; + try { + geometry=Geometry(argv[argv_index]); + } + catch( exception &/* error_ */) + { + ParseError(argv_index,argv); + } + argv_index++; + continue; + } + else if (command.compare("-resample") == 0) + { + argv_index++; + try { + resample=Geometry(argv[argv_index]); + } + catch( exception &/* error_ */) + { + ParseError(argv_index,argv); + } + argv_index++; + continue; + } + ParseError(argv_index,argv); + } + + if (argv_index>argc-1) + ParseError(argv_index,argv); + std::string input_file(argv[argv_index]); + argv_index++; + if (argv_index>argc) + ParseError(argv_index,argv); + std::string output_file(argv[argv_index]); + + try { + Image image(input_file); + if (density.isValid()) + image.density(density); + density=image.density(); + + if (resample.isValid()) + { + geometry = + Geometry(static_cast + (image.columns()*((double)resample.width()/density.width())+0.5), + static_cast + (image.rows()*((double)resample.height()/density.height())+0.5)); + image.density(resample); + } + switch (resize_algorithm) + { + case Sample: + image.sample(geometry); + break; + case Scale: + image.scale(geometry); + break; + case Zoom: + image.filterType(filter); + image.zoom(geometry); + break; + } + image.write(output_file); + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Blob.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Blob.cpp new file mode 100644 index 0000000..2e5e5a2 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Blob.cpp @@ -0,0 +1,170 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2004 +// Copyright Dirk Lemstra 2015 +// +// Implementation of Blob +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include "Magick++/Blob.h" +#include "Magick++/BlobRef.h" + +#include + +Magick::Blob::Blob(void) + : _blobRef(new Magick::BlobRef(0,0)) +{ +} + +Magick::Blob::Blob(const void* data_,const size_t length_) + : _blobRef(new Magick::BlobRef(data_,length_)) +{ +} + +Magick::Blob::Blob(const Magick::Blob& blob_) + : _blobRef(blob_._blobRef) +{ + // Increase reference count + Lock lock(&_blobRef->_mutexLock); + ++_blobRef->_refCount; +} + +Magick::Blob::~Blob () +{ + bool doDelete=false; + { + Lock lock(&_blobRef->_mutexLock); + if (--_blobRef->_refCount == 0) + doDelete=true; + } + + if (doDelete) + { + // Delete old blob reference with associated data + delete _blobRef; + } + _blobRef=0; +} + +Magick::Blob& Magick::Blob::operator=(const Magick::Blob& blob_) +{ + bool + doDelete; + + if (this != &blob_) + { + { + Lock lock(&blob_._blobRef->_mutexLock); + ++blob_._blobRef->_refCount; + } + doDelete=false; + { + Lock lock(&_blobRef->_mutexLock); + if (--_blobRef->_refCount == 0) + doDelete=true; + } + if (doDelete) + { + delete _blobRef; + } + _blobRef=blob_._blobRef; + } + return(*this); +} + +void Magick::Blob::base64(const std::string base64_) +{ + size_t + length; + + unsigned char + *decoded; + + decoded=Base64Decode(base64_.c_str(),&length); + if (decoded) + updateNoCopy(static_cast(decoded),length, + Magick::Blob::MallocAllocator); +} + +std::string Magick::Blob::base64(void) +{ + char + *encoded; + + size_t + encoded_length; + + std::string + result; + + encoded_length=0; + encoded=Base64Encode(static_cast(data()),length(), + &encoded_length); + + if (encoded) + { + result=std::string(encoded,encoded_length); + encoded=(char *) RelinquishMagickMemory(encoded); + return result; + } + + return(std::string()); +} + +const void* Magick::Blob::data(void) const +{ + return(_blobRef->_data); +} + +size_t Magick::Blob::length(void) const +{ + return(_blobRef->_length); +} + +void Magick::Blob::update(const void* data_,const size_t length_) +{ + bool + doDelete; + + doDelete=false; + { + Lock lock( &_blobRef->_mutexLock ); + if (--_blobRef->_refCount == 0) + doDelete=true; + } + if (doDelete) + { + // Delete old blob reference with associated data + delete _blobRef; + } + + _blobRef=new Magick::BlobRef(data_,length_); +} + +void Magick::Blob::updateNoCopy(void* data_,const size_t length_, + Magick::Blob::Allocator allocator_) +{ + bool + doDelete; + + doDelete=false; + { + Lock lock(&_blobRef->_mutexLock); + if (--_blobRef->_refCount == 0) + doDelete=true; + } + + if (doDelete) + { + // Delete old blob reference with associated data + delete _blobRef; + } + _blobRef=new Magick::BlobRef(0,0); + _blobRef->_data=data_; + _blobRef->_length=length_; + _blobRef->_allocator=allocator_; +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/BlobRef.cpp b/ImageMagick-6.9.12-44/Magick++/lib/BlobRef.cpp new file mode 100644 index 0000000..317d9fe --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/BlobRef.cpp @@ -0,0 +1,44 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2004 +// Copyright Dirk Lemstra 2015 +// +// Implementation of Blob +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include "Magick++/Thread.h" +#include "Magick++/BlobRef.h" + +#include + +Magick::BlobRef::BlobRef(const void* data_,const size_t length_) + : _data(0), + _length(length_), + _allocator(Magick::Blob::NewAllocator), + _refCount(1), + _mutexLock() +{ + if (data_) + { + _data=new unsigned char[length_]; + memcpy(_data,data_,length_); + } +} + +// Destructor (actually destroys data) +Magick::BlobRef::~BlobRef(void) +{ + if (_allocator == Magick::Blob::NewAllocator) + { + delete[] static_cast(_data); + _data=0; + } + else if (_allocator == Magick::Blob::MallocAllocator) + { + _data=(void *) RelinquishMagickMemory(_data); + } +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/ChannelMoments.cpp b/ImageMagick-6.9.12-44/Magick++/lib/ChannelMoments.cpp new file mode 100644 index 0000000..5289c62 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/ChannelMoments.cpp @@ -0,0 +1,187 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Dirk Lemstra 2014-2015 +// +// Implementation of channel moments. +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include "Magick++/ChannelMoments.h" +#include "Magick++/Exception.h" +#include "Magick++/Image.h" + +using namespace std; + +Magick::ChannelMoments::ChannelMoments(void) + : _huInvariants(8), + _channel(UndefinedChannel), + _centroidX(0.0), + _centroidY(0.0), + _ellipseAxisX(0.0), + _ellipseAxisY(0.0), + _ellipseAngle(0.0), + _ellipseEccentricity(0.0), + _ellipseIntensity(0.0) +{ +} + +Magick::ChannelMoments::ChannelMoments(const ChannelMoments &channelMoments_) + : _huInvariants(channelMoments_._huInvariants), + _channel(channelMoments_._channel), + _centroidX(channelMoments_._centroidX), + _centroidY(channelMoments_._centroidY), + _ellipseAxisX(channelMoments_._ellipseAxisX), + _ellipseAxisY(channelMoments_._ellipseAxisY), + _ellipseAngle(channelMoments_._ellipseAngle), + _ellipseEccentricity(channelMoments_._ellipseEccentricity), + _ellipseIntensity(channelMoments_._ellipseIntensity) +{ +} + +Magick::ChannelMoments::~ChannelMoments(void) +{ +} + +Magick::ChannelMoments::ChannelMoments(const ChannelType channel_, + const MagickCore::ChannelMoments *channelMoments_) + : _huInvariants(), + _channel(channel_), + _centroidX(channelMoments_->centroid.x), + _centroidY(channelMoments_->centroid.y), + _ellipseAxisX(channelMoments_->ellipse_axis.x), + _ellipseAxisY(channelMoments_->ellipse_axis.y), + _ellipseAngle(channelMoments_->ellipse_angle), + _ellipseEccentricity(channelMoments_->ellipse_eccentricity), + _ellipseIntensity(channelMoments_->ellipse_intensity) +{ + size_t + i; + + for (i=0; i<8; i++) + _huInvariants.push_back(channelMoments_->I[i]); +} + +double Magick::ChannelMoments::centroidX(void) const +{ + return(_centroidX); +} + +double Magick::ChannelMoments::centroidY(void) const +{ + return(_centroidY); +} + +Magick::ChannelType Magick::ChannelMoments::channel(void) const +{ + return(_channel); +} + +double Magick::ChannelMoments::ellipseAxisX(void) const +{ + return(_ellipseAxisX); +} + +double Magick::ChannelMoments::ellipseAxisY(void) const +{ + return(_ellipseAxisY); +} + +double Magick::ChannelMoments::ellipseAngle(void) const +{ + return(_ellipseAngle); +} + +double Magick::ChannelMoments::ellipseEccentricity(void) const +{ + return(_ellipseEccentricity); +} + +double Magick::ChannelMoments::ellipseIntensity(void) const +{ + return(_ellipseIntensity); +} + +double Magick::ChannelMoments::huInvariants(const size_t index_) const +{ + if (index_ > 7) + throw ErrorOption("Valid range for index is 0-7"); + + return(_huInvariants.at(index_)); +} + +Magick::ImageMoments::ImageMoments(void) + : _channels() +{ +} + +Magick::ImageMoments::ImageMoments(const ImageMoments &imageMoments_) + : _channels(imageMoments_._channels) +{ +} + +Magick::ImageMoments::~ImageMoments(void) +{ +} + +Magick::ChannelMoments Magick::ImageMoments::channel( + const ChannelType channel_) const +{ + for (std::vector::const_iterator it = _channels.begin(); + it != _channels.end(); ++it) + { + if (it->channel() == channel_) + return(*it); + } + return(ChannelMoments()); +} + +Magick::ImageMoments::ImageMoments(const Image &image_) + : _channels() +{ + MagickCore::ChannelMoments* + channel_moments; + + GetPPException; + channel_moments=GetImageChannelMoments(image_.constImage(),exceptionInfo); + if (channel_moments != (MagickCore::ChannelMoments *) NULL) + { + switch(image_.constImage()->colorspace) + { + case RGBColorspace: + default: + _channels.push_back(Magick::ChannelMoments(RedChannel, + &channel_moments[RedChannel])); + _channels.push_back(Magick::ChannelMoments(GreenChannel, + &channel_moments[GreenChannel])); + _channels.push_back(Magick::ChannelMoments(BlueChannel, + &channel_moments[BlueChannel])); + break; + case CMYKColorspace: + _channels.push_back(Magick::ChannelMoments(CyanChannel, + &channel_moments[CyanChannel])); + _channels.push_back(Magick::ChannelMoments(MagentaChannel, + &channel_moments[MagentaChannel])); + _channels.push_back(Magick::ChannelMoments(YellowChannel, + &channel_moments[YellowChannel])); + _channels.push_back(Magick::ChannelMoments(BlackChannel, + &channel_moments[BlackChannel])); + break; + case GRAYColorspace: + _channels.push_back(Magick::ChannelMoments(GrayChannel, + &channel_moments[GrayChannel])); + break; + } + if (image_.constImage()->matte != MagickFalse) + _channels.push_back(Magick::ChannelMoments(AlphaChannel, + &channel_moments[AlphaChannel])); + if (image_.constImage()->colorspace != GRAYColorspace) + _channels.push_back(Magick::ChannelMoments(CompositeChannels, + &channel_moments[CompositeChannels])); + channel_moments=(MagickCore::ChannelMoments *) RelinquishMagickMemory( + channel_moments); + } + ThrowPPException(image_.quiet()); +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/CoderInfo.cpp b/ImageMagick-6.9.12-44/Magick++/lib/CoderInfo.cpp new file mode 100644 index 0000000..7e14c17 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/CoderInfo.cpp @@ -0,0 +1,129 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 2001, 2002 +// Copyright Dirk Lemstra 2013-2015 +// +// CoderInfo implementation +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include "Magick++/CoderInfo.h" +#include "Magick++/Exception.h" + +using namespace std; + +Magick::CoderInfo::CoderInfo(void) + : _name(), + _description(), + _mimeType(), + _isReadable(false), + _isWritable(false), + _isMultiFrame(false) +{ +} + +Magick::CoderInfo::CoderInfo(const Magick::CoderInfo &coder_) +{ + _name=coder_._name; + _description=coder_._description; + _mimeType=coder_._mimeType; + _isReadable=coder_._isReadable; + _isWritable=coder_._isWritable; + _isMultiFrame=coder_._isMultiFrame; +} + +Magick::CoderInfo::CoderInfo(const std::string &name_) + : _name(), + _description(), + _mimeType(), + _isReadable(false), + _isWritable(false), + _isMultiFrame(false) +{ + const Magick::MagickInfo + *magickInfo; + + GetPPException; + magickInfo=GetMagickInfo(name_.c_str(),exceptionInfo); + ThrowPPException(false); + if (magickInfo == 0) + { + throwExceptionExplicit(OptionError,"Coder not found",name_.c_str()); + } + else + { + _name=std::string(magickInfo->name); + _description=std::string(magickInfo->description); + _mimeType=std::string(magickInfo->mime_type ? magickInfo->mime_type : ""); + _isReadable=((magickInfo->decoder == 0) ? false : true); + _isWritable=((magickInfo->encoder == 0) ? false : true); + _isMultiFrame=((magickInfo->adjoin == 0) ? false : true); + } +} + +Magick::CoderInfo::~CoderInfo(void) +{ +} + +Magick::CoderInfo& Magick::CoderInfo::operator=(const CoderInfo &coder_) +{ + // If not being set to ourself + if (this != &coder_) + { + _name=coder_._name; + _description=coder_._description; + _mimeType=coder_._mimeType; + _isReadable=coder_._isReadable; + _isWritable=coder_._isWritable; + _isMultiFrame=coder_._isMultiFrame; + } + return(*this); +} + +std::string Magick::CoderInfo::description(void) const +{ + return(_description); +} + +bool Magick::CoderInfo::isReadable(void) const +{ + return(_isReadable); +} + +bool Magick::CoderInfo::isWritable(void) const +{ + return(_isWritable); +} + +bool Magick::CoderInfo::isMultiFrame(void) const +{ + return(_isMultiFrame); +} + +std::string Magick::CoderInfo::mimeType(void) const +{ + return(_mimeType); +} + +std::string Magick::CoderInfo::name(void) const +{ + return(_name); +} + +bool Magick::CoderInfo::unregister(void) const +{ + return(UnregisterMagickInfo(_name.c_str()) != MagickFalse); +} + +Magick::CoderInfo::CoderInfo(const MagickCore::MagickInfo *magickInfo_) + : _name(std::string(magickInfo_->name ? magickInfo_->name : "")), + _description(std::string(magickInfo_->description ? magickInfo_->description : "")), + _mimeType(std::string(magickInfo_->mime_type ? magickInfo_->mime_type : "")), + _isReadable(magickInfo_->decoder ? true : false), + _isWritable(magickInfo_->encoder ? true : false), + _isMultiFrame(magickInfo_->adjoin ? true : false) +{ +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Color.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Color.cpp new file mode 100644 index 0000000..2497eb9 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Color.cpp @@ -0,0 +1,619 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2014-2018 +// +// Color Implementation +// + +#define MAGICKCORE_IMPLEMENTATION +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include + +#include "Magick++/Color.h" +#include "Magick++/Exception.h" + +using namespace std; + +MagickPPExport int Magick::operator == (const Magick::Color &left_, + const Magick::Color &right_) +{ +#if defined(MAGICKCORE_HDRI_SUPPORT) + return((left_.isValid() == right_.isValid()) && + (fabs(left_.redQuantum()-right_.redQuantum()) < MagickEpsilon) && + (fabs(left_.greenQuantum()-right_.greenQuantum()) < MagickEpsilon) && + (fabs(left_.blueQuantum()-right_.blueQuantum()) < MagickEpsilon)); +#else + return((left_.isValid() == right_.isValid()) && + (left_.redQuantum() == right_.redQuantum()) && + (left_.greenQuantum() == right_.greenQuantum()) && + (left_.blueQuantum() == right_.blueQuantum())); +#endif +} + +MagickPPExport int Magick::operator != (const Magick::Color &left_, + const Magick::Color &right_) +{ + return(!(left_ == right_)); +} + +MagickPPExport int Magick::operator > (const Magick::Color &left_, + const Magick::Color &right_) +{ + return(!(left_ < right_ ) && (left_ != right_ )); +} + +MagickPPExport int Magick::operator < (const Magick::Color &left_, + const Magick::Color &right_) +{ + if(left_.redQuantum() < right_.redQuantum()) + return(true); + if(left_.redQuantum() > right_.redQuantum()) + return(false); + if(left_.greenQuantum() < right_.greenQuantum()) + return(true); + if(left_.greenQuantum() > right_.greenQuantum()) + return(false); + if(left_.blueQuantum() < right_.blueQuantum()) + return(true); + return(false); +} + +MagickPPExport int Magick::operator >= (const Magick::Color &left_, + const Magick::Color &right_) +{ + return((left_ > right_) || (left_ == right_)); +} + +MagickPPExport int Magick::operator <= (const Magick::Color &left_, + const Magick::Color &right_) +{ + return((left_ < right_) || (left_ == right_)); +} + +Magick::Color::Color(void) + : _pixel(new PixelPacket), + _isValid(false), + _pixelOwn(true), + _pixelType(RGBAPixel) +{ + initPixel(); + + _pixel->opacity=TransparentOpacity; +} + +Magick::Color::Color(Magick::Quantum red_,Magick::Quantum green_, + Magick::Quantum blue_) + : _pixel(new PixelPacket), + _isValid(true), + _pixelOwn(true), + _pixelType(RGBPixel) +{ + redQuantum(red_); + greenQuantum(green_); + blueQuantum(blue_); + alphaQuantum(OpaqueOpacity); +} + +Magick::Color::Color(Magick::Quantum red_,Magick::Quantum green_, + Magick::Quantum blue_,Magick::Quantum alpha_) + : _pixel(new PixelPacket), + _isValid(true), + _pixelOwn(true), + _pixelType(RGBAPixel) +{ + redQuantum(red_); + greenQuantum(green_); + blueQuantum(blue_); + alphaQuantum(alpha_); +} + +Magick::Color::Color(const char *x11color_) + : _pixel(new PixelPacket), + _isValid(true), + _pixelOwn(true), + _pixelType(RGBPixel) +{ + initPixel(); + + // Use operator = implementation + *this=x11color_; +} + +Magick::Color::Color(const Magick::Color &color_) + : _pixel(new PixelPacket), + _isValid(color_._isValid), + _pixelOwn(true), + _pixelType(color_._pixelType) +{ + *_pixel=*color_._pixel; +} + +Magick::Color::Color(const PixelPacket &color_) + : _pixel(new PixelPacket), + _isValid(true), + _pixelOwn(true), + _pixelType(RGBPixel) +{ + *_pixel=color_; + + if (color_.opacity != OpaqueOpacity) + _pixelType=RGBAPixel; +} + +Magick::Color::Color(const std::string &x11color_) + : _pixel(new PixelPacket), + _isValid(true), + _pixelOwn(true), + _pixelType(RGBPixel) +{ + initPixel(); + + // Use operator = implementation + *this=x11color_; +} + +Magick::Color::~Color(void) +{ + if (_pixelOwn) + delete _pixel; + + _pixel=(PixelPacket *)NULL; +} + +const Magick::Color& Magick::Color::operator=(const char *x11color_) +{ + *this=std::string(x11color_); + return(*this); +} + +Magick::Color& Magick::Color::operator=(const Magick::Color& color_) +{ + // If not being set to ourself + if (this != &color_) + { + // Copy pixel value + *_pixel=*color_._pixel; + + // Validity + _isValid=color_._isValid; + + // Copy pixel type + _pixelType=color_._pixelType; + } + return(*this); +} + +const Magick::Color& Magick::Color::operator= + (const MagickCore::PixelPacket &color_) +{ + *_pixel=color_; + if (color_.opacity != OpaqueOpacity) + _pixelType=RGBAPixel; + else + _pixelType=RGBPixel; + + return(*this); +} + +// Set color via X11 color specification string +const Magick::Color& Magick::Color::operator=(const std::string &x11color_) +{ + PixelPacket + target_color; + + initPixel(); + GetPPException; + if (QueryColorDatabase(x11color_.c_str(),&target_color,exceptionInfo)) + { + redQuantum( target_color.red ); + greenQuantum( target_color.green ); + blueQuantum( target_color.blue ); + alphaQuantum( target_color.opacity ); + + if (target_color.opacity > OpaqueOpacity) + _pixelType=RGBAPixel; + else + _pixelType=RGBPixel; + } + else + _isValid=false; + ThrowPPException(false); + + return(*this); +} + +Magick::Color::operator std::string() const +{ + char + colorbuf[MaxTextExtent]; + + MagickPixelPacket + pixel; + + if (!isValid()) + return std::string("none"); + + pixel.colorspace=sRGBColorspace; + pixel.matte=_pixelType == RGBAPixel ? MagickTrue : MagickFalse; + pixel.depth=MAGICKCORE_QUANTUM_DEPTH; + pixel.red=_pixel->red; + pixel.green=_pixel->green; + pixel.blue=_pixel->blue; + pixel.opacity=_pixel->opacity; + GetColorTuple(&pixel,MagickTrue,colorbuf); + + return(std::string(colorbuf)); +} + +bool Magick::Color::isValid(void) const +{ + return(_isValid); +} + +void Magick::Color::isValid(bool valid_) +{ + if (bool(valid_) == bool(isValid())) + return; + + if (!_pixelOwn) + { + _pixel=new PixelPacket; + _pixelOwn=true; + } + + _isValid=valid_; + + initPixel(); +} + +Magick::Color::Color(PixelPacket *rep_,PixelType pixelType_) + : _pixel(rep_), + _isValid(true), + _pixelOwn(false), + _pixelType(pixelType_) +{ +} + +void Magick::Color::pixel(PixelPacket *rep_,PixelType pixelType_) +{ + if (_pixelOwn) + delete _pixel; + + _pixel=rep_; + _pixelOwn=false; + _isValid=true; + _pixelType=pixelType_; +} + +Magick::ColorGray::ColorGray(void) + : Color() +{ +} + +Magick::ColorGray::ColorGray(const Magick::Color & color_) + : Color(color_) +{ +} + +Magick::ColorGray::ColorGray(double shade_) + : Color(scaleDoubleToQuantum(shade_),scaleDoubleToQuantum(shade_), + scaleDoubleToQuantum(shade_)) +{ + alphaQuantum(OpaqueOpacity); +} + +Magick::ColorGray::~ColorGray() +{ +} + +void Magick::ColorGray::shade(double shade_) +{ + Quantum gray=scaleDoubleToQuantum(shade_); + redQuantum(gray); + greenQuantum(gray); + blueQuantum(gray); +} + +double Magick::ColorGray::shade(void) const +{ + return(scaleQuantumToDouble(greenQuantum())); +} + +Magick::ColorGray& Magick::ColorGray::operator = ( const Magick::Color& color_ ) +{ + *static_cast(this)=color_; + return(*this); +} + +Magick::ColorHSL::ColorHSL(void) + : Color() +{ +} + +Magick::ColorHSL::ColorHSL(const Magick::Color & color_) + : Color( color_ ) +{ +} + +Magick::ColorHSL::ColorHSL(double hue_,double saturation_,double luminosity_) + : Color() +{ + Quantum + blue, + green, + red; + + ConvertHSLToRGB(hue_,saturation_,luminosity_,&red,&green,&blue); + + redQuantum(red); + greenQuantum(green); + blueQuantum(blue); + alphaQuantum(OpaqueOpacity); +} + +Magick::ColorHSL::~ColorHSL() +{ +} + +Magick::ColorHSL& Magick::ColorHSL::operator=(const Magick::Color &color_) +{ + *static_cast(this)=color_; + return (*this); +} + +void Magick::ColorHSL::hue(double hue_) +{ + double + hue, + luminosity, + saturation; + + Quantum + blue, + green, + red; + + ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation, + &luminosity); + + hue=hue_; + + ConvertHSLToRGB(hue,saturation,luminosity,&red,&green,&blue); + + redQuantum(red); + greenQuantum(green); + blueQuantum(blue); +} + +double Magick::ColorHSL::hue(void) const +{ + double + hue, + luminosity, + saturation; + + ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation, + &luminosity); + + return(hue); +} + +void Magick::ColorHSL::luminosity(double luminosity_) +{ + double + hue, + luminosity, + saturation; + + Quantum + blue, + green, + red; + + ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation, + &luminosity); + + luminosity=luminosity_; + + ConvertHSLToRGB(hue,saturation,luminosity,&red,&green,&blue); + + redQuantum(red); + greenQuantum(green); + blueQuantum(blue); +} + +double Magick::ColorHSL::luminosity(void) const +{ + double + hue, + saturation, + luminosity; + + ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation, + &luminosity); + + return(luminosity); +} + +void Magick::ColorHSL::saturation(double saturation_) +{ + double + hue, + luminosity, + saturation; + + Quantum + blue, + green, + red; + + ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation, + &luminosity); + + saturation=saturation_; + + ConvertHSLToRGB(hue,saturation,luminosity,&red,&green,&blue); + + redQuantum(red); + greenQuantum(green); + blueQuantum(blue); +} + +double Magick::ColorHSL::saturation(void) const +{ + double + hue, + luminosity, + saturation; + + ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation, + &luminosity); + + return(saturation); +} + +Magick::ColorMono::ColorMono(void) + : Color() +{ +} + +Magick::ColorMono::ColorMono(bool mono_) + : Color((mono_ ? QuantumRange : 0), + (mono_ ? QuantumRange : 0), + (mono_ ? QuantumRange : 0)) +{ + alphaQuantum(OpaqueOpacity); +} + +Magick::ColorMono::ColorMono(const Magick::Color &color_) + : Color(color_) +{ +} + +Magick::ColorMono::~ColorMono() +{ +} + +Magick::ColorMono& Magick::ColorMono::operator=(const Magick::Color &color_) +{ + *static_cast(this)=color_; + return(*this); +} + +void Magick::ColorMono::mono(bool mono_) +{ + redQuantum(mono_ ? QuantumRange : 0); + greenQuantum(mono_ ? QuantumRange : 0); + blueQuantum(mono_ ? QuantumRange : 0); +} + +bool Magick::ColorMono::mono(void) const +{ + return(greenQuantum() == 0); +} + +Magick::ColorRGB::ColorRGB(void) + : Color() +{ +} + +Magick::ColorRGB::ColorRGB(const Magick::Color & color_) + : Color(color_) +{ +} + +Magick::ColorRGB::ColorRGB(double red_,double green_,double blue_) + : Color(scaleDoubleToQuantum(red_),scaleDoubleToQuantum(green_), + scaleDoubleToQuantum(blue_)) +{ + alphaQuantum(OpaqueOpacity); +} + +Magick::ColorRGB::~ColorRGB(void) +{ +} + +Magick::ColorRGB& Magick::ColorRGB::operator=(const Magick::Color& color_) +{ + *static_cast(this)=color_; + return(*this); +} + +Magick::ColorYUV::ColorYUV(void) + : Color() +{ +} + +Magick::ColorYUV::ColorYUV(const Magick::Color &color_) + : Color(color_) +{ +} + +Magick::ColorYUV::ColorYUV(double y_,double u_,double v_) + : Color(scaleDoubleToQuantum(y_ + 1.13980 * v_), + scaleDoubleToQuantum(y_ - (0.39380 * u_) - (0.58050 * v_)), + scaleDoubleToQuantum(y_ + 2.02790 * u_)) +{ + alphaQuantum(OpaqueOpacity); +} + +Magick::ColorYUV::~ColorYUV(void) +{ +} + +Magick::ColorYUV& Magick::ColorYUV::operator=(const Magick::Color &color_) +{ + *static_cast(this)=color_; + return(*this); +} + +void Magick::ColorYUV::u(double u_) +{ + double V = v(); + double Y = y(); + + redQuantum(scaleDoubleToQuantum(Y + 1.13980 * V )); + greenQuantum(scaleDoubleToQuantum( Y - (0.39380 * u_) - (0.58050 * V))); + blueQuantum(scaleDoubleToQuantum( Y + 2.02790 * u_)); +} + +double Magick::ColorYUV::u(void) const +{ + return scaleQuantumToDouble((-0.14740 * redQuantum()) - (0.28950 * + greenQuantum()) + (0.43690 * blueQuantum())); +} + +void Magick::ColorYUV::v(double v_) +{ + double U = u(); + double Y = y(); + + redQuantum(scaleDoubleToQuantum( Y + 1.13980 * v_ )); + greenQuantum(scaleDoubleToQuantum( Y - (0.39380 * U) - (0.58050 * v_) )); + blueQuantum(scaleDoubleToQuantum( Y + 2.02790 * U )); +} + +double Magick::ColorYUV::v(void) const +{ + return scaleQuantumToDouble((0.61500 * redQuantum()) - (0.51500 * + greenQuantum()) - (0.10000 * blueQuantum())); +} + +void Magick::ColorYUV::y(double y_) +{ + double U = u(); + double V = v(); + + redQuantum(scaleDoubleToQuantum(y_ + 1.13980 * V)); + greenQuantum(scaleDoubleToQuantum(y_ - (0.39380 * U) - (0.58050 * V))); + blueQuantum(scaleDoubleToQuantum(y_ + 2.02790 * U)); +} + +double Magick::ColorYUV::y(void) const +{ + return scaleQuantumToDouble((0.29900 * redQuantum()) + (0.58700 * + greenQuantum()) + (0.11400 * blueQuantum())); +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Drawable.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Drawable.cpp new file mode 100644 index 0000000..b30e621 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Drawable.cpp @@ -0,0 +1,2311 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2014-2017 +// +// Implementation of Drawable (Graphic objects) +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 +#define MAGICK_DRAWABLE_IMPLEMENTATION + +#include "Magick++/Include.h" +#include +#include + +#include "Magick++/Drawable.h" +#include "Magick++/Image.h" + +using namespace std; + +MagickPPExport int Magick::operator == ( const Magick::Coordinate& left_, + const Magick::Coordinate& right_ ) +{ + return ( ( left_.x() == right_.x() ) && ( left_.y() == right_.y() ) ); +} +MagickPPExport int Magick::operator != ( const Magick::Coordinate& left_, + const Magick::Coordinate& right_ ) +{ + return ( ! (left_ == right_) ); +} +MagickPPExport int Magick::operator > ( const Magick::Coordinate& left_, + const Magick::Coordinate& right_ ) +{ + return ( !( left_ < right_ ) && ( left_ != right_ ) ); +} +MagickPPExport int Magick::operator < ( const Magick::Coordinate& left_, + const Magick::Coordinate& right_ ) +{ + // Based on distance from origin + return ( (sqrt(left_.x()*left_.x() + left_.y()*left_.y())) < + (sqrt(right_.x()*right_.x() + right_.y()*right_.y())) ); +} +MagickPPExport int Magick::operator >= ( const Magick::Coordinate& left_, + const Magick::Coordinate& right_ ) +{ + return ( ( left_ > right_ ) || ( left_ == right_ ) ); +} +MagickPPExport int Magick::operator <= ( const Magick::Coordinate& left_, + const Magick::Coordinate& right_ ) +{ + return ( ( left_ < right_ ) || ( left_ == right_ ) ); +} + +/*virtual*/ +Magick::DrawableBase::~DrawableBase ( void ) +{ +} + +// Constructor +Magick::Drawable::Drawable ( void ) + : dp(0) +{ +} + +// Construct from DrawableBase +Magick::Drawable::Drawable ( const Magick::DrawableBase& original_ ) + : dp(original_.copy()) +{ +} + +// Destructor +Magick::Drawable::~Drawable ( void ) +{ + delete dp; + dp = 0; +} + +// Copy constructor +Magick::Drawable::Drawable ( const Magick::Drawable& original_ ) + : dp(original_.dp? original_.dp->copy(): 0) +{ +} + +// Assignment operator +Magick::Drawable& Magick::Drawable::operator= (const Magick::Drawable& original_ ) +{ + if (this != &original_) + { + DrawableBase* temp_dp = (original_.dp ? original_.dp->copy() : 0); + delete dp; + dp = temp_dp; + } + return *this; +} + +// Operator to invoke contained object +void Magick::Drawable::operator()( MagickCore::DrawingWand * context_ ) const +{ + if(dp) + dp->operator()( context_ ); +} + +MagickPPExport int Magick::operator == ( const Magick::Drawable& /*left_*/, + const Magick::Drawable& /*right_*/ ) +{ + return ( 1 ); +} +MagickPPExport int Magick::operator != ( const Magick::Drawable& /*left_*/, + const Magick::Drawable& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator > ( const Magick::Drawable& /*left_*/, + const Magick::Drawable& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator < ( const Magick::Drawable& /*left_*/, + const Magick::Drawable& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator >= ( const Magick::Drawable& left_, + const Magick::Drawable& right_ ) +{ + return ( ( left_ > right_ ) || ( left_ == right_ ) ); +} +MagickPPExport int Magick::operator <= ( const Magick::Drawable& left_, + const Magick::Drawable& right_ ) +{ + return ( ( left_ < right_ ) || ( left_ == right_ ) ); +} + +/*virtual*/ +Magick::VPathBase::~VPathBase ( void ) +{ +} + +// Constructor +Magick::VPath::VPath ( void ) + : dp(0) +{ +} + +// Construct from VPathBase +Magick::VPath::VPath ( const Magick::VPathBase& original_ ) + : dp(original_.copy()) +{ +} + +// Destructor +/* virtual */ Magick::VPath::~VPath ( void ) +{ + delete dp; + dp = 0; +} + +// Copy constructor +Magick::VPath::VPath ( const Magick::VPath& original_ ) + : dp(original_.dp? original_.dp->copy(): 0) +{ +} + +// Assignment operator +Magick::VPath& Magick::VPath::operator= (const Magick::VPath& original_ ) +{ + if (this != &original_) + { + VPathBase* temp_dp = (original_.dp ? original_.dp->copy() : 0); + delete dp; + dp = temp_dp; + } + return *this; +} + +// Operator to invoke contained object +void Magick::VPath::operator()( MagickCore::DrawingWand * context_ ) const +{ + if(dp) + dp->operator()( context_ ); +} + +MagickPPExport int Magick::operator == ( const Magick::VPath& /*left_*/, + const Magick::VPath& /*right_*/ ) +{ + return ( 1 ); +} +MagickPPExport int Magick::operator != ( const Magick::VPath& /*left_*/, + const Magick::VPath& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator > ( const Magick::VPath& /*left_*/, + const Magick::VPath& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator < ( const Magick::VPath& /*left_*/, + const Magick::VPath& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator >= ( const Magick::VPath& left_, + const Magick::VPath& right_ ) +{ + return ( ( left_ > right_ ) || ( left_ == right_ ) ); +} +MagickPPExport int Magick::operator <= ( const Magick::VPath& left_, + const Magick::VPath& right_ ) +{ + return ( ( left_ < right_ ) || ( left_ == right_ ) ); +} + +// +// Drawable Objects +// + +// Affine (scaling, rotation, and translation) +Magick::DrawableAffine::DrawableAffine( double sx_, double sy_, + double rx_, double ry_, + double tx_, double ty_ ) +{ + _affine.sx = sx_; + _affine.rx = rx_; + _affine.ry = ry_; + _affine.sy = sy_; + _affine.tx = tx_; + _affine.ty = ty_; +} +Magick::DrawableAffine::DrawableAffine( void ) +{ + GetAffineMatrix(&_affine); +} +Magick::DrawableAffine::~DrawableAffine( void ) +{ +} +void Magick::DrawableAffine::operator()( MagickCore::DrawingWand * context_ ) const +{ + DrawAffine( context_, &_affine ); +} +Magick::DrawableBase* Magick::DrawableAffine::copy() const +{ + return new DrawableAffine(*this); +} + +// Arc +Magick::DrawableArc::~DrawableArc( void ) +{ +} +void Magick::DrawableArc::operator()( MagickCore::DrawingWand * context_ ) const +{ + DrawArc( context_, _startX, _startY, _endX, _endY, _startDegrees, _endDegrees ); +} +Magick::DrawableBase* Magick::DrawableArc::copy() const +{ + return new DrawableArc(*this); +} + +// +// Bezier curve +// +// Construct from coordinates (Coordinate list must contain at least three members) +Magick::DrawableBezier::DrawableBezier ( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +// Copy constructor +Magick::DrawableBezier::DrawableBezier( const Magick::DrawableBezier& original_ ) + : DrawableBase (original_), + _coordinates(original_._coordinates) +{ +} +// Destructor +Magick::DrawableBezier::~DrawableBezier( void ) +{ +} +void Magick::DrawableBezier::operator()( MagickCore::DrawingWand * context_ ) const +{ + size_t num_coords = (size_t) _coordinates.size(); + PointInfo *coordinates = new PointInfo[num_coords]; + + PointInfo *q = coordinates; + CoordinateList::const_iterator p = _coordinates.begin(); + + while( p != _coordinates.end() ) + { + q->x = p->x(); + q->y = p->y(); + q++; + p++; + } + + DrawBezier( context_, num_coords, coordinates ); + delete [] coordinates; +} +Magick::DrawableBase* Magick::DrawableBezier::copy() const +{ + return new DrawableBezier(*this); +} + +// +//Clip Path +// + +// Pop (terminate) Clip path definition +Magick::DrawablePopClipPath::~DrawablePopClipPath ( void ) +{ +} +void Magick::DrawablePopClipPath::operator() ( MagickCore::DrawingWand * context_ ) const +{ + DrawPopClipPath( context_ ); + DrawPopDefs(context_); +} +Magick::DrawableBase* Magick::DrawablePopClipPath::copy() const +{ + return new DrawablePopClipPath(*this); +} + +// Push clip path definition +Magick::DrawablePushClipPath::DrawablePushClipPath( const std::string &id_) + : _id(id_.c_str()) //multithread safe const char* +{ +} +Magick::DrawablePushClipPath::DrawablePushClipPath +( const Magick::DrawablePushClipPath& original_ ) //multithread safe const char* + : DrawableBase (original_), + _id(original_._id.c_str()) +{ +} +Magick::DrawablePushClipPath::~DrawablePushClipPath( void ) +{ +} +void Magick::DrawablePushClipPath::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawPushDefs(context_); + DrawPushClipPath( context_, _id.c_str()); +} +Magick::DrawableBase* Magick::DrawablePushClipPath::copy() const +{ + return new DrawablePushClipPath(*this); +} +// +// ClipPath +// +Magick::DrawableClipPath::DrawableClipPath( const std::string &id_ ) +:_id(id_.c_str()) +{ +} + +Magick::DrawableClipPath::DrawableClipPath ( const Magick::DrawableClipPath& original_ ) + : DrawableBase (original_), + _id(original_._id.c_str()) +{ +} +Magick::DrawableClipPath::~DrawableClipPath( void ) +{ +} +void Magick::DrawableClipPath::operator()( MagickCore::DrawingWand * context_ ) const +{ + (void) DrawSetClipPath( context_, _id.c_str()); +} +Magick::DrawableBase* Magick::DrawableClipPath::copy() const +{ + return new DrawableClipPath(*this); +} + +// Circle +Magick::DrawableCircle::~DrawableCircle ( void ) +{ +} +void Magick::DrawableCircle::operator()( MagickCore::DrawingWand * context_ ) const +{ + DrawCircle( context_, _originX, _originY, _perimX, _perimY ); +} +Magick::DrawableBase* Magick::DrawableCircle::copy() const +{ + return new DrawableCircle(*this); +} + +// Colorize at point using PaintMethod +Magick::DrawableColor::~DrawableColor( void ) +{ +} +void Magick::DrawableColor::operator()( MagickCore::DrawingWand * context_ ) const +{ + DrawColor( context_, _x, _y, _paintMethod ); +} +Magick::DrawableBase* Magick::DrawableColor::copy() const +{ + return new DrawableColor(*this); +} + +// Draw image at point +Magick::DrawableCompositeImage::DrawableCompositeImage +( double x_, double y_, + double width_, double height_, + const std::string &filename_, + Magick::CompositeOperator composition_ ) + : _composition(composition_), + _x(x_), + _y(y_), + _width(width_), + _height(height_), + _image(new Image(filename_)) +{ +} +Magick::DrawableCompositeImage::DrawableCompositeImage +( double x_, double y_, + double width_, double height_, + const Magick::Image &image_, + Magick::CompositeOperator composition_ ) + : _composition(composition_), + _x(x_), + _y(y_), + _width(width_), + _height(height_), + _image(new Image(image_)) +{ +} +Magick::DrawableCompositeImage::DrawableCompositeImage +( double x_, double y_, + double width_, double height_, + const std::string &filename_ ) + :_composition(CopyCompositeOp), + _x(x_), + _y(y_), + _width(width_), + _height(height_), + _image(new Image(filename_)) +{ +} +Magick::DrawableCompositeImage::DrawableCompositeImage +( double x_, double y_, + double width_, double height_, + const Magick::Image &image_ ) + :_composition(CopyCompositeOp), + _x(x_), + _y(y_), + _width(width_), + _height(height_), + _image(new Image(image_)) +{ +} +Magick::DrawableCompositeImage::DrawableCompositeImage +( double x_, double y_, + const std::string &filename_ ) + : _composition(CopyCompositeOp), + _x(x_), + _y(y_), + _width(0), + _height(0), + _image(new Image(filename_)) +{ + _width=_image->columns(); + _height=_image->rows(); +} +Magick::DrawableCompositeImage::DrawableCompositeImage +( double x_, double y_, + const Magick::Image &image_ ) + : _composition(CopyCompositeOp), + _x(x_), + _y(y_), + _width(0), + _height(0), + _image(new Image(image_)) +{ + _width=_image->columns(); + _height=_image->rows(); +} +// Copy constructor +Magick::DrawableCompositeImage::DrawableCompositeImage +( const Magick::DrawableCompositeImage& original_ ) + : Magick::DrawableBase(original_), + _composition(original_._composition), + _x(original_._x), + _y(original_._y), + _width(original_._width), + _height(original_._height), + _image(new Image(*original_._image)) +{ +} +Magick::DrawableCompositeImage::~DrawableCompositeImage( void ) +{ + delete _image; +} +// Assignment operator +Magick::DrawableCompositeImage& Magick::DrawableCompositeImage::operator= +(const Magick::DrawableCompositeImage& original_ ) +{ + // If not being set to ourself + if ( this != &original_ ) + { + _composition = original_._composition; + _x = original_._x; + _y = original_._y; + _width = original_._width; + _height = original_._height; + Image* temp_image = new Image(*original_._image); + delete _image; + _image = temp_image; + } + return *this; +} +void Magick::DrawableCompositeImage::filename( const std::string &filename_ ) +{ + Image* temp_image = new Image(filename_); + delete _image; + _image = temp_image; +} +std::string Magick::DrawableCompositeImage::filename( void ) const +{ + return _image->fileName(); +} + +void Magick::DrawableCompositeImage::image( const Magick::Image &image_ ) +{ + Image* temp_image = new Image(image_); + delete _image; + _image = temp_image; +} +Magick::Image Magick::DrawableCompositeImage::image( void ) const +{ + return *_image; +} + +// Specify image format used to output Base64 inlined image data. +void Magick::DrawableCompositeImage::magick( std::string magick_ ) +{ + _image->magick( magick_ ); +} +std::string Magick::DrawableCompositeImage::magick( void ) +{ + return _image->magick(); +} + +void Magick::DrawableCompositeImage::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + MagickWand + *magick_wand; + + magick_wand=NewMagickWandFromImage(_image->constImage()); + (void) DrawComposite( context_, _composition, _x, _y, _width, _height, + magick_wand ); + magick_wand=DestroyMagickWand(magick_wand); +} + +Magick::DrawableBase* Magick::DrawableCompositeImage::copy() const +{ + return new DrawableCompositeImage(*this); +} + +Magick::DrawableDensity::DrawableDensity(const std::string &density_) + : _density(density_) +{ +} + +Magick::DrawableDensity::~DrawableDensity(void) +{ +} + +void Magick::DrawableDensity::operator()( + MagickCore::DrawingWand *context_) const +{ + DrawSetDensity(context_,_density.c_str()); +} + +Magick::DrawableBase* Magick::DrawableDensity::copy() const +{ + return(new DrawableDensity(*this)); +} + +// Ellipse +Magick::DrawableEllipse::~DrawableEllipse( void ) +{ +} +void Magick::DrawableEllipse::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawEllipse( context_, _originX, _originY, _radiusX, _radiusY, + _arcStart, _arcEnd ); +} +Magick::DrawableBase* Magick::DrawableEllipse::copy() const +{ + return new DrawableEllipse(*this); +} + +// Specify drawing fill color +Magick::DrawableFillColor::DrawableFillColor( const Magick::Color &color_ ) + : _color(color_) +{ +} +Magick::DrawableFillColor::DrawableFillColor +( const Magick::DrawableFillColor& original_ ) + : DrawableBase (original_), + _color(original_._color) +{ +} +Magick::DrawableFillColor::~DrawableFillColor( void ) +{ +} +void Magick::DrawableFillColor::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + PixelPacket color = static_cast(_color); + PixelWand *pixel_wand=NewPixelWand(); + PixelSetQuantumColor(pixel_wand,&color); + DrawSetFillColor(context_,pixel_wand); + pixel_wand=DestroyPixelWand(pixel_wand); +} +Magick::DrawableBase* Magick::DrawableFillColor::copy() const +{ + return new DrawableFillColor(*this); +} + +// Specify drawing fill fule +Magick::DrawableFillRule::~DrawableFillRule ( void ) +{ +} +void Magick::DrawableFillRule::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetFillRule( context_, _fillRule ); +} +Magick::DrawableBase* Magick::DrawableFillRule::copy() const +{ + return new DrawableFillRule(*this); +} + +// Specify drawing fill opacity +Magick::DrawableFillOpacity::~DrawableFillOpacity ( void ) +{ +} +void Magick::DrawableFillOpacity::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetFillOpacity( context_, _opacity ); +} +Magick::DrawableBase* Magick::DrawableFillOpacity::copy() const +{ + return new DrawableFillOpacity(*this); +} + +// Specify text font +Magick::DrawableFont::DrawableFont ( const std::string &font_ ) + : _font(font_), + _family(), + _style(Magick::AnyStyle), + _weight(400), + _stretch(Magick::NormalStretch) +{ +} +Magick::DrawableFont::DrawableFont ( const std::string &family_, + Magick::StyleType style_, + const unsigned int weight_, + Magick::StretchType stretch_ ) + : _font(), + _family(family_), + _style(style_), + _weight(weight_), + _stretch(stretch_) +{ +} +Magick::DrawableFont::DrawableFont ( const Magick::DrawableFont& original_ ) + : DrawableBase (original_), + _font(original_._font), + _family(original_._family), + _style(original_._style), + _weight(original_._weight), + _stretch(original_._stretch) +{ +} +Magick::DrawableFont::~DrawableFont ( void ) +{ +} +void Magick::DrawableFont::operator()( MagickCore::DrawingWand * context_ ) const +{ + // font + if(_font.length()) + { + (void) DrawSetFont( context_, _font.c_str() ); + } + + if(_family.length()) + { + // font-family + (void) DrawSetFontFamily( context_, _family.c_str() ); + + // font-style + DrawSetFontStyle( context_, _style ); + + // font-weight + DrawSetFontWeight( context_, _weight ); + + // font-stretch + DrawSetFontStretch( context_, _stretch ); + } +} +Magick::DrawableBase* Magick::DrawableFont::copy() const +{ + return new DrawableFont(*this); +} + +// Specify text positioning gravity +Magick::DrawableGravity::~DrawableGravity ( void ) +{ +} +void Magick::DrawableGravity::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetGravity( context_, _gravity ); +} +Magick::DrawableBase* Magick::DrawableGravity::copy() const +{ + return new DrawableGravity(*this); +} + +// Line +Magick::DrawableLine::~DrawableLine ( void ) +{ +} +void Magick::DrawableLine::operator()( MagickCore::DrawingWand * context_ ) const +{ + DrawLine( context_, _startX, _startY, _endX, _endY ); +} +Magick::DrawableBase* Magick::DrawableLine::copy() const +{ + return new DrawableLine(*this); +} + +// Change pixel matte value to transparent using PaintMethod +Magick::DrawableMatte::~DrawableMatte ( void ) +{ +} +void Magick::DrawableMatte::operator()( MagickCore::DrawingWand * context_ ) const +{ + DrawMatte( context_, _x, _y, _paintMethod ); +} +Magick::DrawableBase* Magick::DrawableMatte::copy() const +{ + return new DrawableMatte(*this); +} + +// Drawable Path +Magick::DrawablePath::DrawablePath ( const VPathList &path_ ) + : _path(path_) +{ +} +Magick::DrawablePath::DrawablePath ( const Magick::DrawablePath& original_ ) + : DrawableBase (original_), + _path(original_._path) +{ +} +Magick::DrawablePath::~DrawablePath ( void ) +{ +} +void Magick::DrawablePath::operator()( MagickCore::DrawingWand * context_ ) const +{ + DrawPathStart( context_ ); + + for( VPathList::const_iterator p = _path.begin(); + p != _path.end(); p++ ) + p->operator()( context_ ); // FIXME, how to quit loop on error? + + DrawPathFinish( context_ ); +} +Magick::DrawableBase* Magick::DrawablePath::copy() const +{ + return new DrawablePath(*this); +} + +// Point +Magick::DrawablePoint::~DrawablePoint ( void ) +{ +} +void Magick::DrawablePoint::operator()( MagickCore::DrawingWand * context_ ) const +{ + DrawPoint( context_, _x, _y ); +} +Magick::DrawableBase* Magick::DrawablePoint::copy() const +{ + return new DrawablePoint(*this); +} + +// Text pointsize +Magick::DrawablePointSize::~DrawablePointSize ( void ) +{ +} +void Magick::DrawablePointSize::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetFontSize( context_, _pointSize ); +} +Magick::DrawableBase* Magick::DrawablePointSize::copy() const +{ + return new DrawablePointSize(*this); +} + +// Polygon (Coordinate list must contain at least three members) +Magick::DrawablePolygon::DrawablePolygon ( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::DrawablePolygon::DrawablePolygon +( const Magick::DrawablePolygon& original_ ) + : DrawableBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::DrawablePolygon::~DrawablePolygon ( void ) +{ +} +void Magick::DrawablePolygon::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + size_t num_coords = (size_t) _coordinates.size(); + PointInfo *coordinates = new PointInfo[num_coords]; + + PointInfo *q = coordinates; + CoordinateList::const_iterator p = _coordinates.begin(); + + while( p != _coordinates.end() ) + { + q->x = p->x(); + q->y = p->y(); + q++; + p++; + } + + DrawPolygon( context_, num_coords, coordinates ); + delete [] coordinates; +} +Magick::DrawableBase* Magick::DrawablePolygon::copy() const +{ + return new DrawablePolygon(*this); +} + +// Polyline (Coordinate list must contain at least three members) +Magick::DrawablePolyline::DrawablePolyline +( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::DrawablePolyline::DrawablePolyline +( const Magick::DrawablePolyline& original_ ) + : DrawableBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::DrawablePolyline::~DrawablePolyline ( void ) +{ +} +void Magick::DrawablePolyline::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + size_t num_coords = (size_t) _coordinates.size(); + PointInfo *coordinates = new PointInfo[num_coords]; + + PointInfo *q = coordinates; + CoordinateList::const_iterator p = _coordinates.begin(); + + while( p != _coordinates.end() ) + { + q->x = p->x(); + q->y = p->y(); + q++; + p++; + } + + DrawPolyline( context_, num_coords, coordinates ); + delete [] coordinates; +} +Magick::DrawableBase* Magick::DrawablePolyline::copy() const +{ + return new DrawablePolyline(*this); +} + +// Pop Graphic Context +Magick::DrawablePopGraphicContext::~DrawablePopGraphicContext ( void ) +{ +} +void Magick::DrawablePopGraphicContext::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + PopDrawingWand( context_ ); +} +Magick::DrawableBase* Magick::DrawablePopGraphicContext::copy() const +{ + return new DrawablePopGraphicContext(*this); +} + +// Push Graphic Context +Magick::DrawablePushGraphicContext::~DrawablePushGraphicContext ( void ) +{ +} +void Magick::DrawablePushGraphicContext::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + PushDrawingWand( context_ ); +} +Magick::DrawableBase* Magick::DrawablePushGraphicContext::copy() const +{ + return new DrawablePushGraphicContext(*this); +} + +// Pop (terminate) Pattern definition +Magick::DrawablePopPattern::~DrawablePopPattern ( void ) +{ +} +void Magick::DrawablePopPattern::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + (void) DrawPopPattern( context_ ); +} +Magick::DrawableBase* Magick::DrawablePopPattern::copy() const +{ + return new DrawablePopPattern(*this); +} + +// Push Pattern definition +Magick::DrawablePushPattern::DrawablePushPattern +( const std::string &id_, ssize_t x_, ssize_t y_, + size_t width_, size_t height_ ) + : _id(id_), + _x(x_), + _y(y_), + _width(width_), + _height(height_) +{ +} +Magick::DrawablePushPattern::DrawablePushPattern +( const Magick::DrawablePushPattern& original_ ) + : DrawableBase (original_), + _id(original_._id), + _x(original_._x), + _y(original_._y), + _width(original_._width), + _height(original_._height) +{ +} +Magick::DrawablePushPattern::~DrawablePushPattern ( void ) +{ +} +void Magick::DrawablePushPattern::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + (void) DrawPushPattern( context_, _id.c_str(), _x, _y, _width, _height ); +} +Magick::DrawableBase* Magick::DrawablePushPattern::copy() const +{ + return new DrawablePushPattern(*this); +} + +// Rectangle +Magick::DrawableRectangle::~DrawableRectangle ( void ) +{ +} +void Magick::DrawableRectangle::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawRectangle( context_, _upperLeftX, _upperLeftY, + _lowerRightX, _lowerRightY ); +} +Magick::DrawableBase* Magick::DrawableRectangle::copy() const +{ + return new DrawableRectangle(*this); +} + +// Apply Rotation +Magick::DrawableRotation::~DrawableRotation ( void ) +{ +} +void Magick::DrawableRotation::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawRotate( context_, _angle ); +} +Magick::DrawableBase* Magick::DrawableRotation::copy() const +{ + return new DrawableRotation(*this); +} + +// Round Rectangle +Magick::DrawableRoundRectangle::~DrawableRoundRectangle ( void ) +{ +} +void Magick::DrawableRoundRectangle::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawRoundRectangle(context_,_upperLeftX,_upperLeftY,_lowerRightX, + _lowerRightY,_cornerWidth, _cornerHeight); +} +Magick::DrawableBase* Magick::DrawableRoundRectangle::copy() const +{ + return new DrawableRoundRectangle(*this); +} + +// Apply Scaling +Magick::DrawableScaling::~DrawableScaling ( void ) +{ +} +void Magick::DrawableScaling::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawScale( context_, _x, _y ); +} +Magick::DrawableBase* Magick::DrawableScaling::copy() const +{ + return new DrawableScaling(*this); +} + +// Apply Skew in the X direction +Magick::DrawableSkewX::~DrawableSkewX ( void ) +{ +} +void Magick::DrawableSkewX::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSkewX( context_, _angle ); +} +Magick::DrawableBase* Magick::DrawableSkewX::copy() const +{ + return new DrawableSkewX(*this); +} + +// Apply Skew in the Y direction +Magick::DrawableSkewY::~DrawableSkewY ( void ) +{ +} +void Magick::DrawableSkewY::operator()( MagickCore::DrawingWand * context_ ) const +{ + DrawSkewY( context_, _angle ); +} +Magick::DrawableBase* Magick::DrawableSkewY::copy() const +{ + return new DrawableSkewY(*this); +} + +// Stroke dasharray +Magick::DrawableDashArray::DrawableDashArray( const double* dasharray_ ) + : _size(0), + _dasharray(0) +{ + dasharray( dasharray_ ); +} +// Deprecated, do not use for new code, and migrate existing code to +// using double* +Magick::DrawableDashArray::DrawableDashArray( const size_t* dasharray_ ) + : _size(0), + _dasharray(0) +{ + dasharray( dasharray_ ); +} +Magick::DrawableDashArray::DrawableDashArray +(const Magick::DrawableDashArray& original_) + : DrawableBase (original_), + _size(original_._size), + _dasharray(new double[_size+1]) +{ + // Copy elements + { + for (size_t i=0; i < _size; i++) + _dasharray[i]=original_._dasharray[i]; + _dasharray[_size]=0.0; + } +} +Magick::DrawableDashArray::~DrawableDashArray( void ) +{ + delete [] _dasharray; + _size = 0; + _dasharray = 0; +} +Magick::DrawableDashArray& Magick::DrawableDashArray::operator= +(const Magick::DrawableDashArray &original_) +{ + if( this != &original_ ) + { + delete [] _dasharray; + _size=original_._size; + _dasharray = new double[_size+1]; + // Copy elements + { + for (size_t i=0; i < _size; i++) + _dasharray[i]=original_._dasharray[i]; + _dasharray[_size]=0.0; + } + } + return *this; +} +// Invoke object +void Magick::DrawableDashArray::operator() + ( MagickCore::DrawingWand *context_ ) const +{ + (void) DrawSetStrokeDashArray( context_, (const unsigned long) _size, _dasharray ); +} +Magick::DrawableBase* Magick::DrawableDashArray::copy() const +{ + return new DrawableDashArray(*this); +} +void Magick::DrawableDashArray::dasharray ( const double* dasharray_ ) +{ + delete [] _dasharray; + _size = 0; + _dasharray = 0; + + if(dasharray_) + { + // Count elements in dash array + size_t n = 0; + { + const double *p = dasharray_; + while(*p++ != 0.0) + n++; + } + _size = n; + + // Allocate elements + _dasharray=new double[_size+1]; + // Copy elements + { + for (size_t i=0; i < _size; i++) + _dasharray[i]=dasharray_[i]; + _dasharray[_size]=0.0; + } + } +} +// This method is deprecated. Don't use for new code, and migrate existing +// code to the const double* version. +void Magick::DrawableDashArray::dasharray( const size_t* dasharray_ ) +{ + if (_dasharray) + delete [] _dasharray; + _size = 0; + _dasharray = 0; + + if(dasharray_) + { + // Count elements in dash array + size_t n = 0; + { + const size_t *p = dasharray_; + while(*p++ != 0) + n++; + } + _size = n; + + // Allocate elements + _dasharray=new double[_size+1]; + // Copy elements + { + for (size_t i=0; i < _size; i++) + _dasharray[i]=dasharray_[i]; + _dasharray[_size]=0; + } + } +} + +// Stroke dashoffset +Magick::DrawableDashOffset::~DrawableDashOffset ( void ) +{ +} +void Magick::DrawableDashOffset::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetStrokeDashOffset( context_, _offset ); +} +Magick::DrawableBase* Magick::DrawableDashOffset::copy() const +{ + return new DrawableDashOffset(*this); +} + +// Stroke linecap +Magick::DrawableStrokeLineCap::~DrawableStrokeLineCap ( void ) +{ +} +void Magick::DrawableStrokeLineCap::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetStrokeLineCap( context_, _linecap ); +} +Magick::DrawableBase* Magick::DrawableStrokeLineCap::copy() const +{ + return new DrawableStrokeLineCap(*this); +} + +// Stroke linejoin +Magick::DrawableStrokeLineJoin::~DrawableStrokeLineJoin ( void ) +{ +} +void Magick::DrawableStrokeLineJoin::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetStrokeLineJoin( context_, _linejoin ); +} +Magick::DrawableBase* Magick::DrawableStrokeLineJoin::copy() const +{ + return new DrawableStrokeLineJoin(*this); +} + +// Stroke miterlimit +Magick::DrawableMiterLimit::~DrawableMiterLimit ( void ) +{ +} +void Magick::DrawableMiterLimit::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetStrokeMiterLimit( context_, _miterlimit ); +} +Magick::DrawableBase* Magick::DrawableMiterLimit::copy() const +{ + return new DrawableMiterLimit(*this); +} + +// Stroke antialias +Magick::DrawableStrokeAntialias::~DrawableStrokeAntialias ( void ) +{ +} +void Magick::DrawableStrokeAntialias::operator() +( MagickCore::DrawingWand * context_ ) const +{ + DrawSetStrokeAntialias( context_, static_cast + (_flag ? MagickTrue : MagickFalse) ); +} +Magick::DrawableBase* Magick::DrawableStrokeAntialias::copy() const +{ + return new DrawableStrokeAntialias(*this); +} + +// Stroke color +Magick::DrawableStrokeColor::DrawableStrokeColor +( const Magick::Color &color_ ) + : _color(color_) +{ +} +Magick::DrawableStrokeColor::DrawableStrokeColor +( const Magick::DrawableStrokeColor& original_ ) + : DrawableBase (original_), + _color(original_._color) +{ +} +Magick::DrawableStrokeColor::~DrawableStrokeColor ( void ) +{ +} +void Magick::DrawableStrokeColor::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + PixelPacket color = static_cast(_color); + PixelWand *pixel_wand=NewPixelWand(); + PixelSetQuantumColor(pixel_wand,&color); + DrawSetStrokeColor(context_,pixel_wand); + pixel_wand=DestroyPixelWand(pixel_wand); +} +Magick::DrawableBase* Magick::DrawableStrokeColor::copy() const +{ + return new DrawableStrokeColor(*this); +} + +// Stroke opacity +Magick::DrawableStrokeOpacity::~DrawableStrokeOpacity ( void ) +{ +} +void Magick::DrawableStrokeOpacity::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetStrokeOpacity( context_, _opacity ); +} +Magick::DrawableBase* Magick::DrawableStrokeOpacity::copy() const +{ + return new DrawableStrokeOpacity(*this); +} + +// Stroke width +Magick::DrawableStrokeWidth::~DrawableStrokeWidth ( void ) +{ +} +void Magick::DrawableStrokeWidth::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetStrokeWidth( context_, _width ); +} +Magick::DrawableBase* Magick::DrawableStrokeWidth::copy() const +{ + return new DrawableStrokeWidth(*this); +} + +// Draw text at point +Magick::DrawableText::DrawableText ( const double x_, const double y_, + const std::string &text_ ) + : _x(x_), + _y(y_), + _text(text_), + _encoding() +{ +} +Magick::DrawableText::DrawableText ( const double x_, const double y_, + const std::string &text_, const std::string &encoding_) + : _x(x_), + _y(y_), + _text(text_), + _encoding(encoding_) +{ +} +Magick::DrawableText::DrawableText( const Magick::DrawableText& original_ ) + : DrawableBase (original_), + _x(original_._x), + _y(original_._y), + _text(original_._text), + _encoding(original_._encoding) +{ +} +Magick::DrawableText::~DrawableText ( void ) +{ +} +void Magick::DrawableText::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetTextEncoding( context_, _encoding.c_str() ); + DrawAnnotation( context_, _x, _y, + reinterpret_cast(_text.c_str()) ); +} +Magick::DrawableBase* Magick::DrawableText::copy() const +{ + return new DrawableText(*this); +} + +// Text antialias +Magick::DrawableTextAntialias::DrawableTextAntialias ( bool flag_ ) + : _flag(flag_) +{ +} +Magick::DrawableTextAntialias::DrawableTextAntialias( const Magick::DrawableTextAntialias &original_ ) + : DrawableBase (original_), + _flag(original_._flag) +{ +} +Magick::DrawableTextAntialias::~DrawableTextAntialias ( void ) +{ +} +void Magick::DrawableTextAntialias::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetTextAntialias( context_, static_cast + (_flag ? MagickTrue : MagickFalse) ); +} +Magick::DrawableBase* Magick::DrawableTextAntialias::copy() const +{ + return new DrawableTextAntialias(*this); +} + +// Decoration (text decoration) +Magick::DrawableTextDecoration::DrawableTextDecoration + ( Magick::DecorationType decoration_ ) + : _decoration(decoration_) +{ +} +Magick::DrawableTextDecoration::DrawableTextDecoration + ( const Magick::DrawableTextDecoration &original_ ) + : DrawableBase (original_), + _decoration(original_._decoration) +{ +} +Magick::DrawableTextDecoration::~DrawableTextDecoration( void ) +{ +} +void Magick::DrawableTextDecoration::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetTextDecoration( context_, _decoration ); +} +Magick::DrawableBase* Magick::DrawableTextDecoration::copy() const +{ + return new DrawableTextDecoration(*this); +} + +// DrawableTextDirection +Magick::DrawableTextDirection::DrawableTextDirection( + DirectionType direction_) + : _direction(direction_) +{ +} + +Magick::DrawableTextDirection::~DrawableTextDirection(void) +{ +} + +void Magick::DrawableTextDirection::operator()( + MagickCore::DrawingWand *context_) const +{ + DrawSetTextDirection(context_,_direction); +} + +void Magick::DrawableTextDirection::direction(DirectionType direction_) +{ + _direction=direction_; +} + +Magick::DirectionType Magick::DrawableTextDirection::direction(void) const +{ + return(_direction); +} + +Magick::DrawableBase *Magick::DrawableTextDirection::copy() const +{ + return new DrawableTextDirection(*this); +} + +// DrawableTextInterlineSpacing +Magick::DrawableTextInterlineSpacing::DrawableTextInterlineSpacing( + double spacing_) + : _spacing(spacing_) +{ +} + +Magick::DrawableTextInterlineSpacing::~DrawableTextInterlineSpacing(void) +{ +} + +void Magick::DrawableTextInterlineSpacing::operator()( + MagickCore::DrawingWand *context_) const +{ + DrawSetTextInterlineSpacing(context_,_spacing); +} + +void Magick::DrawableTextInterlineSpacing::spacing(double spacing_) +{ + _spacing=spacing_; +} + +double Magick::DrawableTextInterlineSpacing::spacing(void) const +{ + return(_spacing); +} + +Magick::DrawableBase *Magick::DrawableTextInterlineSpacing::copy() const +{ + return new DrawableTextInterlineSpacing(*this); +} + +// DrawableTextInterwordSpacing +Magick::DrawableTextInterwordSpacing::DrawableTextInterwordSpacing( + double spacing_) + : _spacing(spacing_) +{ +} + +Magick::DrawableTextInterwordSpacing::~DrawableTextInterwordSpacing(void) +{ +} + +void Magick::DrawableTextInterwordSpacing::operator()( + MagickCore::DrawingWand *context_) const +{ + DrawSetTextInterwordSpacing(context_,_spacing); +} + +void Magick::DrawableTextInterwordSpacing::spacing(double spacing_) +{ + _spacing=spacing_; +} + +double Magick::DrawableTextInterwordSpacing::spacing(void) const +{ + return(_spacing); +} + +Magick::DrawableBase *Magick::DrawableTextInterwordSpacing::copy() const +{ + return new DrawableTextInterwordSpacing(*this); +} + +// DrawableTextKerning +Magick::DrawableTextKerning::DrawableTextKerning( + double kerning_) + : _kerning(kerning_) +{ +} + +Magick::DrawableTextKerning::~DrawableTextKerning(void) +{ +} + +void Magick::DrawableTextKerning::operator()( + MagickCore::DrawingWand *context_) const +{ + DrawSetTextKerning(context_,_kerning); +} + +void Magick::DrawableTextKerning::kerning(double kerning_) +{ + _kerning=kerning_; +} + +double Magick::DrawableTextKerning::kerning(void) const +{ + return(_kerning); +} + +Magick::DrawableBase *Magick::DrawableTextKerning::copy() const +{ + return new DrawableTextKerning(*this); +} + +// Set text undercolor +Magick::DrawableTextUnderColor::DrawableTextUnderColor +( const Magick::Color &color_ ) + : _color(color_) +{ +} +Magick::DrawableTextUnderColor::DrawableTextUnderColor +( const Magick::DrawableTextUnderColor& original_ ) + : DrawableBase (original_), + _color(original_._color) +{ +} +Magick::DrawableTextUnderColor::~DrawableTextUnderColor ( void ) +{ +} +void Magick::DrawableTextUnderColor::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + PixelPacket color = static_cast(_color); + PixelWand *pixel_wand=NewPixelWand(); + PixelSetQuantumColor(pixel_wand,&color); + DrawSetTextUnderColor(context_,pixel_wand); + pixel_wand=DestroyPixelWand(pixel_wand); +} +Magick::DrawableBase* Magick::DrawableTextUnderColor::copy() const +{ + return new DrawableTextUnderColor(*this); +} + +// Apply Translation +Magick::DrawableTranslation::~DrawableTranslation ( void ) +{ +} +void Magick::DrawableTranslation::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawTranslate( context_, _x, _y ); +} +Magick::DrawableBase* Magick::DrawableTranslation::copy() const +{ + return new DrawableTranslation(*this); +} + +// Set the size of the viewbox +Magick::DrawableViewbox::~DrawableViewbox ( void ) +{ +} +void Magick::DrawableViewbox::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawSetViewbox( context_, _x1, _y1, _x2, _y2 ); +} +Magick::DrawableBase* Magick::DrawableViewbox::copy() const +{ + return new DrawableViewbox(*this); +} + +// +// Path Classes +// + +// +// PathArcArgs +// +MagickPPExport int Magick::operator == ( const Magick::PathArcArgs& /*left_*/, + const Magick::PathArcArgs& /*right_*/ ) +{ + return ( 1 ); +} +MagickPPExport int Magick::operator != ( const Magick::PathArcArgs& /*left_*/, + const Magick::PathArcArgs& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator > ( const Magick::PathArcArgs& /*left_*/, + const Magick::PathArcArgs& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator < ( const Magick::PathArcArgs& /*left_*/, + const Magick::PathArcArgs& /*right_*/ ) +{ + return ( false ); +} +MagickPPExport int Magick::operator >= ( const Magick::PathArcArgs& left_, + const Magick::PathArcArgs& right_ ) +{ + return ( ( left_ > right_ ) || ( left_ == right_ ) ); +} +MagickPPExport int Magick::operator <= ( const Magick::PathArcArgs& left_, + const Magick::PathArcArgs& right_ ) +{ + return ( ( left_ < right_ ) || ( left_ == right_ ) ); +} +// Default constructor +Magick::PathArcArgs::PathArcArgs( void ) + : _radiusX(0), + _radiusY(0), + _xAxisRotation(0), + _largeArcFlag(false), + _sweepFlag(false), + _x(0), + _y(0) +{ +} +// Normal constructor +Magick::PathArcArgs::PathArcArgs( double radiusX_, double radiusY_, + double xAxisRotation_, bool largeArcFlag_, + bool sweepFlag_, double x_, double y_ ) + : _radiusX(radiusX_), + _radiusY(radiusY_), + _xAxisRotation(xAxisRotation_), + _largeArcFlag(largeArcFlag_), + _sweepFlag(sweepFlag_), + _x(x_), + _y(y_) +{ +} +// Copy constructor +Magick::PathArcArgs::PathArcArgs( const Magick::PathArcArgs &original_ ) + : _radiusX(original_._radiusX), + _radiusY(original_._radiusY), + _xAxisRotation(original_._xAxisRotation), + _largeArcFlag(original_._largeArcFlag), + _sweepFlag(original_._sweepFlag), + _x(original_._x), + _y(original_._y) +{ +} +// Destructor +Magick::PathArcArgs::~PathArcArgs ( void ) +{ +} + +// Path Arc +Magick::PathArcAbs::PathArcAbs ( const Magick::PathArcArgs &coordinates_ ) + : _coordinates(1,coordinates_) +{ +} +Magick::PathArcAbs::PathArcAbs ( const PathArcArgsList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::PathArcAbs::PathArcAbs ( const Magick::PathArcAbs& original_ ) + : VPathBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::PathArcAbs::~PathArcAbs ( void ) +{ +} +void Magick::PathArcAbs::operator()( MagickCore::DrawingWand * context_ ) const +{ + for( PathArcArgsList::const_iterator p = _coordinates.begin(); + p != _coordinates.end(); p++ ) + { + DrawPathEllipticArcAbsolute( context_, p->radiusX(), p->radiusY(), + p->xAxisRotation(), (MagickBooleanType) p->largeArcFlag(), + (MagickBooleanType) p->sweepFlag(), p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathArcAbs::copy() const +{ + return new PathArcAbs(*this); +} + +Magick::PathArcRel::PathArcRel ( const Magick::PathArcArgs &coordinates_ ) + : _coordinates(1,coordinates_) +{ +} +Magick::PathArcRel::PathArcRel ( const PathArcArgsList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::PathArcRel::PathArcRel ( const Magick::PathArcRel& original_ ) + : VPathBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::PathArcRel::~PathArcRel ( void ) +{ +} +void Magick::PathArcRel::operator()( MagickCore::DrawingWand * context_ ) const +{ + for( PathArcArgsList::const_iterator p = _coordinates.begin(); + p != _coordinates.end(); p++ ) + { + DrawPathEllipticArcRelative( context_, p->radiusX(), p->radiusY(), + p->xAxisRotation(), (MagickBooleanType) p->largeArcFlag(), + (MagickBooleanType) p->sweepFlag(), p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathArcRel::copy() const +{ + return new PathArcRel(*this); +} + +// +// Path Closepath +// +Magick::PathClosePath::~PathClosePath ( void ) +{ +} +void Magick::PathClosePath::operator()( MagickCore::DrawingWand * context_ ) const +{ + DrawPathClose( context_ ); +} +Magick::VPathBase* Magick::PathClosePath::copy() const +{ + return new PathClosePath(*this); +} + +// +// Path Curveto (Cubic Bezier) +// +MagickPPExport int Magick::operator == ( const Magick::PathCurvetoArgs& /*left_*/, + const Magick::PathCurvetoArgs& /*right_*/ ) +{ + return ( 1 ); +} +MagickPPExport int Magick::operator != ( const Magick::PathCurvetoArgs& /*left_*/, + const Magick::PathCurvetoArgs& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator > ( const Magick::PathCurvetoArgs& /*left_*/, + const Magick::PathCurvetoArgs& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator < ( const Magick::PathCurvetoArgs& /*left_*/, + const Magick::PathCurvetoArgs& /*right_*/ ) +{ + return ( false ); +} +MagickPPExport int Magick::operator >= ( const Magick::PathCurvetoArgs& left_, + const Magick::PathCurvetoArgs& right_ ) +{ + return ( ( left_ > right_ ) || ( left_ == right_ ) ); +} +MagickPPExport int Magick::operator <= ( const Magick::PathCurvetoArgs& left_, + const Magick::PathCurvetoArgs& right_ ) +{ + return ( ( left_ < right_ ) || ( left_ == right_ ) ); +} +// Default constructor +Magick::PathCurvetoArgs::PathCurvetoArgs( void ) + : _x1(0), + _y1(0), + _x2(0), + _y2(0), + _x(0), + _y(0) +{ +} +// Normal constructor +Magick::PathCurvetoArgs::PathCurvetoArgs( double x1_, double y1_, + double x2_, double y2_, + double x_, double y_ ) + : _x1(x1_), + _y1(y1_), + _x2(x2_), + _y2(y2_), + _x(x_), + _y(y_) +{ +} +// Copy constructor +Magick::PathCurvetoArgs::PathCurvetoArgs( const PathCurvetoArgs &original_ ) + : _x1(original_._x1), + _y1(original_._y1), + _x2(original_._x2), + _y2(original_._y2), + _x(original_._x), + _y(original_._y) +{ +} +// Destructor +Magick::PathCurvetoArgs::~PathCurvetoArgs ( void ) +{ +} + +Magick::PathCurvetoAbs::PathCurvetoAbs ( const Magick::PathCurvetoArgs &args_ ) + : _args(1,args_) +{ +} +Magick::PathCurvetoAbs::PathCurvetoAbs ( const PathCurveToArgsList &args_ ) + : _args(args_) +{ +} +Magick::PathCurvetoAbs::PathCurvetoAbs + ( const Magick::PathCurvetoAbs& original_ ) + : VPathBase (original_), + _args(original_._args) +{ +} +Magick::PathCurvetoAbs::~PathCurvetoAbs ( void ) +{ +} +void Magick::PathCurvetoAbs::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + for( PathCurveToArgsList::const_iterator p = _args.begin(); + p != _args.end(); p++ ) + { + DrawPathCurveToAbsolute( context_, p->x1(), p->y1(), p->x2(), p->y2(), + p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathCurvetoAbs::copy() const +{ + return new PathCurvetoAbs(*this); +} +Magick::PathCurvetoRel::PathCurvetoRel ( const Magick::PathCurvetoArgs &args_ ) + : _args(1,args_) +{ +} +Magick::PathCurvetoRel::PathCurvetoRel ( const PathCurveToArgsList &args_ ) + : _args(args_) +{ +} +Magick::PathCurvetoRel::PathCurvetoRel +( const Magick::PathCurvetoRel& original_ ) + : VPathBase (original_), + _args(original_._args) +{ +} +Magick::PathCurvetoRel::~PathCurvetoRel ( void ) +{ +} +void Magick::PathCurvetoRel::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + for( PathCurveToArgsList::const_iterator p = _args.begin(); + p != _args.end(); p++ ) + { + DrawPathCurveToRelative( context_, p->x1(), p->y1(), p->x2(), p->y2(), + p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathCurvetoRel::copy() const +{ + return new PathCurvetoRel(*this); +} +Magick::PathSmoothCurvetoAbs::PathSmoothCurvetoAbs +( const Magick::Coordinate &coordinates_ ) + : _coordinates(1,coordinates_) +{ +} +Magick::PathSmoothCurvetoAbs::PathSmoothCurvetoAbs +( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::PathSmoothCurvetoAbs::PathSmoothCurvetoAbs +( const Magick::PathSmoothCurvetoAbs& original_ ) + : VPathBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::PathSmoothCurvetoAbs::~PathSmoothCurvetoAbs ( void ) +{ +} +void Magick::PathSmoothCurvetoAbs::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + for( CoordinateList::const_iterator p = _coordinates.begin(); + p != _coordinates.end(); p++ ) + { + double x2 = p->x(); + double y2 = p->y(); + p++; + if (p == _coordinates.end() ) + break; + DrawPathCurveToSmoothAbsolute( context_, x2, y2, p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathSmoothCurvetoAbs::copy() const +{ + return new PathSmoothCurvetoAbs(*this); +} +Magick::PathSmoothCurvetoRel::PathSmoothCurvetoRel +( const Magick::Coordinate &coordinates_ ) + : _coordinates(1,coordinates_) +{ +} +Magick::PathSmoothCurvetoRel::PathSmoothCurvetoRel +( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::PathSmoothCurvetoRel::PathSmoothCurvetoRel +( const Magick::PathSmoothCurvetoRel& original_ ) + : VPathBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::PathSmoothCurvetoRel::~PathSmoothCurvetoRel ( void ) +{ +} +void Magick::PathSmoothCurvetoRel::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + for( CoordinateList::const_iterator p = _coordinates.begin(); + p != _coordinates.end(); p++ ) + { + double x2 = p->x(); + double y2 = p->y(); + p++; + if (p == _coordinates.end() ) + break; + DrawPathCurveToSmoothRelative( context_, x2, y2, p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathSmoothCurvetoRel::copy() const +{ + return new PathSmoothCurvetoRel(*this); +} + +// +// Quadratic Curveto (Quadratic Bezier) +// +MagickPPExport int Magick::operator == +( const Magick::PathQuadraticCurvetoArgs& /*left_*/, + const Magick::PathQuadraticCurvetoArgs& /*right_*/ ) +{ + return ( 1 ); +} +MagickPPExport int Magick::operator != +( const Magick::PathQuadraticCurvetoArgs& /*left_*/, + const Magick::PathQuadraticCurvetoArgs& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator > +( const Magick::PathQuadraticCurvetoArgs& /*left_*/, + const Magick::PathQuadraticCurvetoArgs& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator < +( const Magick::PathQuadraticCurvetoArgs& /*left_*/, + const Magick::PathQuadraticCurvetoArgs& /*right_*/ ) +{ + return ( 0 ); +} +MagickPPExport int Magick::operator >= +( const Magick::PathQuadraticCurvetoArgs& left_, + const Magick::PathQuadraticCurvetoArgs& right_ ) +{ + return ( ( left_ > right_ ) || ( left_ == right_ ) ); +} +MagickPPExport int Magick::operator <= +( const Magick::PathQuadraticCurvetoArgs& left_, + const Magick::PathQuadraticCurvetoArgs& right_ ) +{ + return ( ( left_ < right_ ) || ( left_ == right_ ) ); +} +// Default Constructor +Magick::PathQuadraticCurvetoArgs::PathQuadraticCurvetoArgs( void ) + : _x1(0), + _y1(0), + _x(0), + _y(0) +{ +} +// Normal Constructor +Magick::PathQuadraticCurvetoArgs::PathQuadraticCurvetoArgs( double x1_, + double y1_, + double x_, + double y_ ) + : _x1(x1_), + _y1(y1_), + _x(x_), + _y(y_) +{ +} +// Copy Constructor +Magick::PathQuadraticCurvetoArgs::PathQuadraticCurvetoArgs( const PathQuadraticCurvetoArgs &original_ ) + : _x1(original_._x1), + _y1(original_._y1), + _x(original_._x), + _y(original_._y) +{ +} +// Destructor +Magick::PathQuadraticCurvetoArgs::~PathQuadraticCurvetoArgs ( void ) +{ +} + +Magick::PathQuadraticCurvetoAbs::PathQuadraticCurvetoAbs +( const Magick::PathQuadraticCurvetoArgs &args_ ) + : _args(1,args_) +{ +} +Magick::PathQuadraticCurvetoAbs::PathQuadraticCurvetoAbs +( const PathQuadraticCurvetoArgsList &args_ ) + : _args(args_) +{ +} +Magick::PathQuadraticCurvetoAbs::PathQuadraticCurvetoAbs +( const Magick::PathQuadraticCurvetoAbs& original_ ) + : VPathBase (original_), + _args(original_._args) +{ +} +Magick::PathQuadraticCurvetoAbs::~PathQuadraticCurvetoAbs ( void ) +{ +} +void Magick::PathQuadraticCurvetoAbs::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + for( PathQuadraticCurvetoArgsList::const_iterator p = _args.begin(); + p != _args.end(); p++ ) + { + DrawPathCurveToQuadraticBezierAbsolute( context_, p->x1(), p->y1(), + p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathQuadraticCurvetoAbs::copy() const +{ + return new PathQuadraticCurvetoAbs(*this); +} +Magick::PathQuadraticCurvetoRel::PathQuadraticCurvetoRel +( const Magick::PathQuadraticCurvetoArgs &args_ ) + : _args(1,args_) +{ +} +Magick::PathQuadraticCurvetoRel::PathQuadraticCurvetoRel +( const PathQuadraticCurvetoArgsList &args_ ) + : _args(args_) +{ +} +Magick::PathQuadraticCurvetoRel::PathQuadraticCurvetoRel +( const Magick::PathQuadraticCurvetoRel& original_ ) + : VPathBase (original_), + _args(original_._args) +{ +} +Magick::PathQuadraticCurvetoRel::~PathQuadraticCurvetoRel ( void ) +{ +} +void Magick::PathQuadraticCurvetoRel::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + for( PathQuadraticCurvetoArgsList::const_iterator p = _args.begin(); + p != _args.end(); p++ ) + { + DrawPathCurveToQuadraticBezierRelative( context_, p->x1(), p->y1(), + p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathQuadraticCurvetoRel::copy() const +{ + return new PathQuadraticCurvetoRel(*this); +} +Magick::PathSmoothQuadraticCurvetoAbs::PathSmoothQuadraticCurvetoAbs +( const Magick::Coordinate &coordinate_ ) + : _coordinates(1,coordinate_) +{ +} +Magick::PathSmoothQuadraticCurvetoAbs::PathSmoothQuadraticCurvetoAbs +( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::PathSmoothQuadraticCurvetoAbs::PathSmoothQuadraticCurvetoAbs +( const Magick::PathSmoothQuadraticCurvetoAbs& original_ ) + : VPathBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::PathSmoothQuadraticCurvetoAbs::~PathSmoothQuadraticCurvetoAbs ( void ) +{ +} +void Magick::PathSmoothQuadraticCurvetoAbs::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + for( CoordinateList::const_iterator p = _coordinates.begin(); + p != _coordinates.end(); p++ ) + { + DrawPathCurveToQuadraticBezierSmoothAbsolute( context_, p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathSmoothQuadraticCurvetoAbs::copy() const +{ + return new PathSmoothQuadraticCurvetoAbs(*this); +} +Magick::PathSmoothQuadraticCurvetoRel::PathSmoothQuadraticCurvetoRel +( const Magick::Coordinate &coordinate_ ) + : _coordinates(1,coordinate_) +{ +} +Magick::PathSmoothQuadraticCurvetoRel::PathSmoothQuadraticCurvetoRel +( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::PathSmoothQuadraticCurvetoRel::PathSmoothQuadraticCurvetoRel +( const PathSmoothQuadraticCurvetoRel& original_ ) + : VPathBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::PathSmoothQuadraticCurvetoRel::~PathSmoothQuadraticCurvetoRel ( void ) +{ +} +void Magick::PathSmoothQuadraticCurvetoRel::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + for( CoordinateList::const_iterator p = _coordinates.begin(); + p != _coordinates.end(); p++ ) + { + DrawPathCurveToQuadraticBezierSmoothRelative( context_, p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathSmoothQuadraticCurvetoRel::copy() const +{ + return new PathSmoothQuadraticCurvetoRel(*this); +} + +// +// Path Lineto +// +Magick::PathLinetoAbs::PathLinetoAbs ( const Magick::Coordinate& coordinate_ ) + : _coordinates(1,coordinate_) +{ +} +Magick::PathLinetoAbs::PathLinetoAbs ( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::PathLinetoAbs::PathLinetoAbs ( const Magick::PathLinetoAbs& original_ ) + : VPathBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::PathLinetoAbs::~PathLinetoAbs ( void ) +{ +} +void Magick::PathLinetoAbs::operator()( MagickCore::DrawingWand * context_ ) const +{ + for( CoordinateList::const_iterator p = _coordinates.begin(); + p != _coordinates.end(); p++ ) + { + DrawPathLineToAbsolute( context_, p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathLinetoAbs::copy() const +{ + return new PathLinetoAbs(*this); +} +Magick::PathLinetoRel::PathLinetoRel ( const Magick::Coordinate& coordinate_ ) + : _coordinates(1,coordinate_) +{ +} +Magick::PathLinetoRel::PathLinetoRel ( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::PathLinetoRel::PathLinetoRel ( const Magick::PathLinetoRel& original_ ) + : VPathBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::PathLinetoRel::~PathLinetoRel ( void ) +{ +} +void Magick::PathLinetoRel::operator()( MagickCore::DrawingWand * context_ ) const +{ + for( CoordinateList::const_iterator p = _coordinates.begin(); + p != _coordinates.end(); p++ ) + { + DrawPathLineToRelative( context_, p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathLinetoRel::copy() const +{ + return new PathLinetoRel(*this); +} + +// +// Path Horizontal Lineto +// + +Magick::PathLinetoHorizontalAbs::~PathLinetoHorizontalAbs ( void ) +{ +} +void Magick::PathLinetoHorizontalAbs::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawPathLineToHorizontalAbsolute( context_, _x ); +} +Magick::VPathBase* Magick::PathLinetoHorizontalAbs::copy() const +{ + return new PathLinetoHorizontalAbs(*this); +} +Magick::PathLinetoHorizontalRel::~PathLinetoHorizontalRel ( void ) +{ +} +void Magick::PathLinetoHorizontalRel::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawPathLineToHorizontalRelative( context_, _x ); +} +Magick::VPathBase* Magick::PathLinetoHorizontalRel::copy() const +{ + return new PathLinetoHorizontalRel(*this); +} + +// +// Path Vertical Lineto +// +Magick::PathLinetoVerticalAbs::~PathLinetoVerticalAbs ( void ) +{ +} +void Magick::PathLinetoVerticalAbs::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawPathLineToVerticalAbsolute( context_, _y ); +} +Magick::VPathBase* Magick::PathLinetoVerticalAbs::copy() const +{ + return new PathLinetoVerticalAbs(*this); +} +Magick::PathLinetoVerticalRel::~PathLinetoVerticalRel ( void ) +{ +} +void Magick::PathLinetoVerticalRel::operator() + ( MagickCore::DrawingWand * context_ ) const +{ + DrawPathLineToVerticalRelative( context_, _y ); +} +Magick::VPathBase* Magick::PathLinetoVerticalRel::copy() const +{ + return new PathLinetoVerticalRel(*this); +} + +// +// Path Moveto +// + +Magick::PathMovetoAbs::PathMovetoAbs ( const Magick::Coordinate &coordinate_ ) + : _coordinates(1,coordinate_) +{ +} +Magick::PathMovetoAbs::PathMovetoAbs ( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::PathMovetoAbs::PathMovetoAbs ( const Magick::PathMovetoAbs& original_ ) + : VPathBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::PathMovetoAbs::~PathMovetoAbs ( void ) +{ +} +void Magick::PathMovetoAbs::operator()( MagickCore::DrawingWand * context_ ) const +{ + for( CoordinateList::const_iterator p = _coordinates.begin(); + p != _coordinates.end(); p++ ) + { + DrawPathMoveToAbsolute( context_, p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathMovetoAbs::copy() const +{ + return new PathMovetoAbs(*this); +} +Magick::PathMovetoRel::PathMovetoRel ( const Magick::Coordinate &coordinate_ ) + : _coordinates(1,coordinate_) +{ +} +Magick::PathMovetoRel::PathMovetoRel ( const CoordinateList &coordinates_ ) + : _coordinates(coordinates_) +{ +} +Magick::PathMovetoRel::PathMovetoRel ( const Magick::PathMovetoRel& original_ ) + : VPathBase (original_), + _coordinates(original_._coordinates) +{ +} +Magick::PathMovetoRel::~PathMovetoRel ( void ) +{ +} +void Magick::PathMovetoRel::operator()( MagickCore::DrawingWand * context_ ) const +{ + for( CoordinateList::const_iterator p = _coordinates.begin(); + p != _coordinates.end(); p++ ) + { + DrawPathMoveToRelative( context_, p->x(), p->y() ); + } +} +Magick::VPathBase* Magick::PathMovetoRel::copy() const +{ + return new PathMovetoRel(*this); +} + +#if defined(EXPLICIT_TEMPLATE_INSTANTIATION) +// template class std::list; +// template class std::list; +// template class std::list; +// template class std::list; +// template class std::list; +// template class std::list; +#endif diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Exception.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Exception.cpp new file mode 100644 index 0000000..635e85b --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Exception.cpp @@ -0,0 +1,984 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2014-2017 +// +// Implementation of Exception and derived classes +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include +#include +#include + +#include "Magick++/Exception.h" + +using namespace std; + +Magick::Exception::Exception(const std::string& what_) + : std::exception(), + _what(what_), + _nested((Exception *) NULL) +{ +} + +Magick::Exception::Exception(const std::string& what_, + Exception* nested_) + : std::exception(), + _what(what_), + _nested(nested_) +{ +} + +Magick::Exception::Exception(const Magick::Exception& original_) + : exception(original_), + _what(original_._what), + _nested((Exception *) NULL) +{ +} + +Magick::Exception::~Exception() throw() +{ + if (_nested != (Exception *) NULL) + delete _nested; +} + +Magick::Exception& Magick::Exception::operator=( + const Magick::Exception& original_) +{ + if (this != &original_) + this->_what=original_._what; + return(*this); +} + +const char* Magick::Exception::what() const throw() +{ + return(_what.c_str()); +} + +const Magick::Exception* Magick::Exception::nested() const throw() +{ + return(_nested); +} + +void Magick::Exception::nested(Exception* nested_) throw() +{ + _nested=nested_; +} + +Magick::Error::Error(const std::string& what_) + : Exception(what_) +{ +} + +Magick::Error::Error(const std::string& what_,Exception *nested_) + : Exception(what_,nested_) +{ +} + +Magick::Error::~Error() throw() +{ +} + +Magick::ErrorBlob::ErrorBlob(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorBlob::ErrorBlob(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorBlob::~ErrorBlob() throw() +{ +} + +Magick::ErrorCache::ErrorCache(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorCache::ErrorCache(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorCache::~ErrorCache() throw() +{ +} + +Magick::ErrorCoder::ErrorCoder(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorCoder::ErrorCoder(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorCoder::~ErrorCoder() throw() +{ +} + +Magick::ErrorConfigure::ErrorConfigure(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorConfigure::ErrorConfigure(const std::string& what_, + Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorConfigure::~ErrorConfigure() throw() +{ +} + +Magick::ErrorCorruptImage::ErrorCorruptImage(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorCorruptImage::ErrorCorruptImage(const std::string& what_, + Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorCorruptImage::~ErrorCorruptImage() throw() +{ +} + +Magick::ErrorDelegate::ErrorDelegate(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorDelegate::ErrorDelegate(const std::string& what_, + Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorDelegate::~ErrorDelegate()throw() +{ +} + +Magick::ErrorDraw::ErrorDraw(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorDraw::ErrorDraw(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorDraw::~ErrorDraw() throw() +{ +} + +Magick::ErrorFileOpen::ErrorFileOpen(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorFileOpen::~ErrorFileOpen() throw() +{ +} + +Magick::ErrorFileOpen::ErrorFileOpen(const std::string& what_, + Exception *nested_) + : Error(what_,nested_) +{ +} + + +Magick::ErrorImage::ErrorImage(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorImage::ErrorImage(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorImage::~ErrorImage() throw() +{ +} + +Magick::ErrorMissingDelegate::ErrorMissingDelegate(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorMissingDelegate::ErrorMissingDelegate(const std::string& what_, + Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorMissingDelegate::~ErrorMissingDelegate() throw () +{ +} + +Magick::ErrorModule::ErrorModule(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorModule::ErrorModule(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorModule::~ErrorModule() throw() +{ +} + +Magick::ErrorMonitor::ErrorMonitor(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorMonitor::ErrorMonitor(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorMonitor::~ErrorMonitor() throw() +{ +} + +Magick::ErrorOption::ErrorOption(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorOption::ErrorOption(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorOption::~ErrorOption() throw() +{ +} + +Magick::ErrorPolicy::ErrorPolicy(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorPolicy::ErrorPolicy(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorPolicy::~ErrorPolicy() throw() +{ +} + + +Magick::ErrorRegistry::ErrorRegistry(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorRegistry::ErrorRegistry(const std::string& what_, + Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorRegistry::~ErrorRegistry() throw() +{ +} + +Magick::ErrorResourceLimit::ErrorResourceLimit(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorResourceLimit::ErrorResourceLimit(const std::string& what_, + Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorResourceLimit::~ErrorResourceLimit() throw() +{ +} + +Magick::ErrorStream::ErrorStream(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorStream::ErrorStream(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorStream::~ErrorStream() throw() +{ +} + +Magick::ErrorType::ErrorType(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorType::ErrorType(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorType::~ErrorType() throw() +{ +} + +Magick::ErrorUndefined::ErrorUndefined(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorUndefined::ErrorUndefined(const std::string& what_, + Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorUndefined::~ErrorUndefined() throw() +{ +} + +Magick::ErrorXServer::ErrorXServer(const std::string& what_) + : Error(what_) +{ +} + +Magick::ErrorXServer::ErrorXServer(const std::string& what_,Exception *nested_) + : Error(what_,nested_) +{ +} + +Magick::ErrorXServer::~ErrorXServer() throw () +{ +} + +Magick::Warning::Warning(const std::string& what_) + : Exception(what_) +{ +} + +Magick::Warning::Warning(const std::string& what_,Exception *nested_) + : Exception(what_,nested_) +{ +} + +Magick::Warning::~Warning() throw() +{ +} + +Magick::WarningBlob::WarningBlob(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningBlob::WarningBlob(const std::string& what_,Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningBlob::~WarningBlob() throw() +{ +} + +Magick::WarningCache::WarningCache(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningCache::WarningCache(const std::string& what_,Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningCache::~WarningCache() throw() +{ +} + +Magick::WarningCoder::WarningCoder(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningCoder::WarningCoder(const std::string& what_,Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningCoder::~WarningCoder() throw() +{ +} + +Magick::WarningConfigure::WarningConfigure(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningConfigure::WarningConfigure(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningConfigure::~WarningConfigure() throw() +{ +} + +Magick::WarningCorruptImage::WarningCorruptImage(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningCorruptImage::WarningCorruptImage(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningCorruptImage::~WarningCorruptImage() throw() +{ +} + +Magick::WarningDelegate::WarningDelegate(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningDelegate::WarningDelegate(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningDelegate::~WarningDelegate() throw() +{ +} + +Magick::WarningDraw::WarningDraw(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningDraw::WarningDraw(const std::string& what_,Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningDraw::~WarningDraw() throw() +{ +} + +Magick::WarningFileOpen::WarningFileOpen(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningFileOpen::WarningFileOpen(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningFileOpen::~WarningFileOpen() throw() +{ +} + +Magick::WarningImage::WarningImage(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningImage::WarningImage(const std::string& what_,Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningImage::~WarningImage() throw() +{ +} + +Magick::WarningMissingDelegate::WarningMissingDelegate( + const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningMissingDelegate::WarningMissingDelegate( + const std::string& what_,Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningMissingDelegate::~WarningMissingDelegate() throw() +{ +} + +Magick::WarningModule::WarningModule(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningModule::WarningModule(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + + +Magick::WarningModule::~WarningModule() throw() +{ +} + +Magick::WarningMonitor::WarningMonitor(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningMonitor::WarningMonitor(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningMonitor::~WarningMonitor() throw() +{ +} + +Magick::WarningOption::WarningOption(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningOption::WarningOption(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningOption::~WarningOption() throw() +{ +} + +Magick::WarningRegistry::WarningRegistry(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningRegistry::WarningRegistry(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningRegistry::~WarningRegistry() throw() +{ +} + +Magick::WarningPolicy::WarningPolicy(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningPolicy::WarningPolicy(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningPolicy::~WarningPolicy() throw() +{ +} + +Magick::WarningResourceLimit::WarningResourceLimit(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningResourceLimit::WarningResourceLimit(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningResourceLimit::~WarningResourceLimit() throw() +{ +} + +Magick::WarningStream::WarningStream(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningStream::WarningStream(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningStream::~WarningStream() throw() +{ +} + +Magick::WarningType::WarningType(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningType::WarningType(const std::string& what_,Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningType::~WarningType() throw() +{ +} + +Magick::WarningUndefined::WarningUndefined(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningUndefined::WarningUndefined(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningUndefined::~WarningUndefined() throw() +{ +} + +Magick::WarningXServer::WarningXServer(const std::string& what_) + : Warning(what_) +{ +} + +Magick::WarningXServer::WarningXServer(const std::string& what_, + Exception *nested_) + : Warning(what_,nested_) +{ +} + +Magick::WarningXServer::~WarningXServer() throw() +{ +} + +std::string Magick::formatExceptionMessage(const MagickCore::ExceptionInfo *exception_) +{ + // Format error message ImageMagick-style + std::string message=GetClientName(); + if (exception_->reason != (char *) NULL) + { + message+=std::string(": "); + message+=std::string(exception_->reason); + } + + if (exception_->description != (char *) NULL) + message += " (" + std::string(exception_->description) + ")"; + return(message); +} + +Magick::Exception* Magick::createException(const MagickCore::ExceptionInfo *exception_) +{ + std::string message=formatExceptionMessage(exception_); + switch (exception_->severity) + { + case BlobError: + case BlobFatalError: + return new ErrorBlob(message); + case BlobWarning: + return new WarningBlob(message); + case CacheError: + case CacheFatalError: + return new ErrorCache(message); + case CacheWarning: + return new WarningCache(message); + case CoderError: + case CoderFatalError: + return new ErrorCoder(message); + case CoderWarning: + return new WarningCoder(message); + case ConfigureError: + case ConfigureFatalError: + return new ErrorConfigure(message); + case ConfigureWarning: + return new WarningConfigure(message); + case CorruptImageError: + case CorruptImageFatalError: + return new ErrorCorruptImage(message); + case CorruptImageWarning: + return new WarningCorruptImage(message); + case DelegateError: + case DelegateFatalError: + return new ErrorDelegate(message); + case DelegateWarning: + return new WarningDelegate(message); + case DrawError: + case DrawFatalError: + return new ErrorDraw(message); + case DrawWarning: + return new WarningDraw(message); + case FileOpenError: + case FileOpenFatalError: + return new ErrorFileOpen(message); + case FileOpenWarning: + return new WarningFileOpen(message); + case ImageError: + case ImageFatalError: + return new ErrorImage(message); + case ImageWarning: + return new WarningImage(message); + case MissingDelegateError: + case MissingDelegateFatalError: + return new ErrorMissingDelegate(message); + case MissingDelegateWarning: + return new WarningMissingDelegate(message); + case ModuleError: + case ModuleFatalError: + return new ErrorModule(message); + case ModuleWarning: + return new WarningModule(message); + case MonitorError: + case MonitorFatalError: + return new ErrorMonitor(message); + case MonitorWarning: + return new WarningMonitor(message); + case OptionError: + case OptionFatalError: + return new ErrorOption(message); + case OptionWarning: + return new WarningOption(message); + case PolicyWarning: + return new WarningPolicy(message); + case PolicyError: + case PolicyFatalError: + return new ErrorPolicy(message); + case RegistryError: + case RegistryFatalError: + return new ErrorRegistry(message); + case RegistryWarning: + return new WarningRegistry(message); + case ResourceLimitError: + case ResourceLimitFatalError: + return new ErrorResourceLimit(message); + case ResourceLimitWarning: + return new WarningResourceLimit(message); + case StreamError: + case StreamFatalError: + return new ErrorStream(message); + case StreamWarning: + return new WarningStream(message); + case TypeError: + case TypeFatalError: + return new ErrorType(message); + case TypeWarning: + return new WarningType(message); + case UndefinedException: + default: + return new ErrorUndefined(message); + case XServerError: + case XServerFatalError: + return new ErrorXServer(message); + case XServerWarning: + return new WarningXServer(message); + } +} + +MagickPPExport void Magick::throwExceptionExplicit( + const ExceptionType severity_,const char* reason_,const char* description_) +{ + // Just return if there is no reported error + if (severity_ == UndefinedException) + return; + + GetPPException; + ThrowException(exceptionInfo,severity_,reason_, description_); + ThrowPPException(false); +} + +MagickPPExport void Magick::throwException(ExceptionInfo *exception_, + const bool quiet_) +{ + const ExceptionInfo + *p; + + Exception + *nestedException, + *q; + + ExceptionType + severity; + + size_t + index; + + // Just return if there is no reported error + if (exception_->severity == UndefinedException) + return; + + std::string message=formatExceptionMessage(exception_); + nestedException=(Exception *) NULL; + q=(Exception *) NULL; + LockSemaphoreInfo(exception_->semaphore); + if (exception_->exceptions != (void *) NULL) + { + index=GetNumberOfElementsInLinkedList((LinkedListInfo *) + exception_->exceptions); + while(index > 0) + { + p=(const ExceptionInfo *) GetValueFromLinkedList((LinkedListInfo *) + exception_->exceptions,--index); + if ((p->severity != exception_->severity) || (LocaleCompare(p->reason, + exception_->reason) != 0) || (LocaleCompare(p->description, + exception_->description) != 0)) + { + if (nestedException == (Exception *) NULL) + { + nestedException=createException(p); + q=nestedException; + } + else + { + Exception + *r; + + r=createException(p); + q->nested(r); + q=r; + } + } + } + } + severity=exception_->severity; + UnlockSemaphoreInfo(exception_->semaphore); + + if ((quiet_) && (severity < MagickCore::ErrorException)) + { + delete nestedException; + return; + } + + DestroyExceptionInfo(exception_); + + switch (severity) + { + case BlobError: + case BlobFatalError: + throw ErrorBlob(message,nestedException); + case BlobWarning: + throw WarningBlob(message,nestedException); + case CacheError: + case CacheFatalError: + throw ErrorCache(message,nestedException); + case CacheWarning: + throw WarningCache(message,nestedException); + case CoderError: + case CoderFatalError: + throw ErrorCoder(message,nestedException); + case CoderWarning: + throw WarningCoder(message,nestedException); + case ConfigureError: + case ConfigureFatalError: + throw ErrorConfigure(message,nestedException); + case ConfigureWarning: + throw WarningConfigure(message,nestedException); + case CorruptImageError: + case CorruptImageFatalError: + throw ErrorCorruptImage(message,nestedException); + case CorruptImageWarning: + throw WarningCorruptImage(message,nestedException); + case DelegateError: + case DelegateFatalError: + throw ErrorDelegate(message,nestedException); + case DelegateWarning: + throw WarningDelegate(message,nestedException); + case DrawError: + case DrawFatalError: + throw ErrorDraw(message,nestedException); + case DrawWarning: + throw WarningDraw(message,nestedException); + case FileOpenError: + case FileOpenFatalError: + throw ErrorFileOpen(message,nestedException); + case FileOpenWarning: + throw WarningFileOpen(message,nestedException); + case ImageError: + case ImageFatalError: + throw ErrorImage(message,nestedException); + case ImageWarning: + throw WarningImage(message,nestedException); + case MissingDelegateError: + case MissingDelegateFatalError: + throw ErrorMissingDelegate(message,nestedException); + case MissingDelegateWarning: + throw WarningMissingDelegate(message,nestedException); + case ModuleError: + case ModuleFatalError: + throw ErrorModule(message,nestedException); + case ModuleWarning: + throw WarningModule(message,nestedException); + case MonitorError: + case MonitorFatalError: + throw ErrorMonitor(message,nestedException); + case MonitorWarning: + throw WarningMonitor(message,nestedException); + case OptionError: + case OptionFatalError: + throw ErrorOption(message,nestedException); + case OptionWarning: + throw WarningOption(message,nestedException); + case PolicyWarning: + throw WarningPolicy(message,nestedException); + case PolicyError: + case PolicyFatalError: + throw ErrorPolicy(message,nestedException); + case RegistryError: + case RegistryFatalError: + throw ErrorRegistry(message,nestedException); + case RegistryWarning: + throw WarningRegistry(message,nestedException); + case ResourceLimitError: + case ResourceLimitFatalError: + throw ErrorResourceLimit(message,nestedException); + case ResourceLimitWarning: + throw WarningResourceLimit(message,nestedException); + case StreamError: + case StreamFatalError: + throw ErrorStream(message,nestedException); + case StreamWarning: + throw WarningStream(message,nestedException); + case TypeError: + case TypeFatalError: + throw ErrorType(message,nestedException); + case TypeWarning: + throw WarningType(message,nestedException); + case UndefinedException: + default: + throw ErrorUndefined(message,nestedException); + case XServerError: + case XServerFatalError: + throw ErrorXServer(message,nestedException); + case XServerWarning: + throw WarningXServer(message,nestedException); + } +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Functions.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Functions.cpp new file mode 100644 index 0000000..343b476 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Functions.cpp @@ -0,0 +1,73 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2002, 2003 +// Copyright Dirk Lemstra 2014-2016 +// +// Simple C++ function wrappers for ImageMagick equivalents +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include + +#include "Magick++/Functions.h" +#include "Magick++/Exception.h" + +using namespace std; + +static bool magick_initialized=false; + +MagickPPExport void Magick::CloneString(char **destination_, + const std::string &source_) +{ + MagickCore::CloneString(destination_,source_.c_str()); +} + +MagickPPExport void Magick::DisableOpenCL(void) +{ + GetPPException; + MagickCore::InitImageMagickOpenCL(MagickCore::MAGICK_OPENCL_OFF,NULL,NULL, + exceptionInfo); + ThrowPPException(false); +} + +MagickPPExport bool Magick::EnableOpenCL(const bool useCache_) +{ + bool + status; + + GetPPException; + if (useCache_) + status=MagickCore::InitImageMagickOpenCL( + MagickCore::MAGICK_OPENCL_DEVICE_SELECT_AUTO,NULL,NULL,exceptionInfo) == + MagickTrue; + else + status=MagickCore::InitImageMagickOpenCL( + MagickCore::MAGICK_OPENCL_DEVICE_SELECT_AUTO_CLEAR_CACHE,NULL,NULL, + exceptionInfo) == MagickTrue; + ThrowPPException(false); + return(status); +} + +MagickPPExport void Magick::InitializeMagick(const char *path_) +{ + MagickCore::MagickCoreGenesis(path_,MagickFalse); + if (!magick_initialized) + magick_initialized=true; +} + +MagickPPExport void Magick::SetRandomSeed(const unsigned long seed) +{ + MagickCore::SetRandomSecretKey(seed); +} + +MagickPPExport void Magick::TerminateMagick(void) +{ + if (magick_initialized) + { + magick_initialized=false; + MagickCore::MagickCoreTerminus(); + } +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Geometry.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Geometry.cpp new file mode 100644 index 0000000..3583939 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Geometry.cpp @@ -0,0 +1,488 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2014 +// +// Geometry implementation +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include +#include // for isdigit +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) +#include +#endif + +#include "Magick++/Geometry.h" +#include "Magick++/Exception.h" + +using namespace std; + +MagickPPExport int Magick::operator == (const Magick::Geometry& left_, + const Magick::Geometry& right_) +{ + return((left_.aspect() == right_.aspect()) && + (left_.fillArea() == right_.fillArea()) && + (left_.greater() == right_.greater()) && + (left_.height() == right_.height()) && + (left_.isValid() == right_.isValid()) && + (left_.less() == right_.less()) && + (left_.limitPixels() == right_.limitPixels()) && + (left_.percent() == right_.percent()) && + (left_.width() == right_.width()) && + (left_.xNegative() == right_.xNegative()) && + (left_.xOff() == right_.xOff()) && + (left_.yNegative() == right_.yNegative()) && + (left_.yOff() == right_.yOff())); +} + +MagickPPExport int Magick::operator != (const Magick::Geometry& left_, + const Magick::Geometry& right_) +{ + return(!(left_ == right_)); +} + +MagickPPExport int Magick::operator > (const Magick::Geometry& left_, + const Magick::Geometry& right_) +{ + return(!(left_ < right_) && (left_ != right_)); +} + +MagickPPExport int Magick::operator < (const Magick::Geometry& left_, + const Magick::Geometry& right_) +{ + return((left_.width()*left_.height()) < (right_.width()*right_.height())); +} + +MagickPPExport int Magick::operator >= (const Magick::Geometry& left_, + const Magick::Geometry& right_) +{ + return((left_ > right_) || (left_ == right_)); +} + +MagickPPExport int Magick::operator <= (const Magick::Geometry& left_, + const Magick::Geometry& right_ ) +{ + return((left_ < right_) || (left_ == right_)); +} + +Magick::Geometry::Geometry(void) + : _width(0), + _height(0), + _xOff(0), + _yOff(0), + _xNegative(false), + _yNegative(false), + _isValid(false), + _percent(false), + _aspect(false), + _greater(false), + _less(false), + _fillArea(false), + _limitPixels(false) +{ +} + +Magick::Geometry::Geometry(const char *geometry_) + : _width(0), + _height(0), + _xOff(0), + _yOff(0), + _xNegative(false), + _yNegative(false), + _isValid(false), + _percent(false), + _aspect(false), + _greater(false), + _less(false), + _fillArea(false), + _limitPixels(false) +{ + *this=geometry_; // Use assignment operator +} + +Magick::Geometry::Geometry(const Geometry &geometry_) + : _width(geometry_._width), + _height(geometry_._height), + _xOff(geometry_._xOff), + _yOff(geometry_._yOff), + _xNegative(geometry_._xNegative), + _yNegative(geometry_._yNegative), + _isValid(geometry_._isValid), + _percent(geometry_._percent), + _aspect(geometry_._aspect), + _greater(geometry_._greater), + _less(geometry_._less), + _fillArea(geometry_._fillArea), + _limitPixels(geometry_._limitPixels) +{ +} + +Magick::Geometry::Geometry(const std::string &geometry_) + : _width(0), + _height(0), + _xOff(0), + _yOff(0), + _xNegative(false), + _yNegative(false), + _isValid(false), + _percent(false), + _aspect(false), + _greater(false), + _less(false), + _fillArea(false), + _limitPixels(false) +{ + *this=geometry_; // Use assignment operator +} + +Magick::Geometry::Geometry(size_t width_,size_t height_,ssize_t xOff_, + ssize_t yOff_,bool xNegative_,bool yNegative_) + : _width(width_), + _height(height_), + _xOff(xOff_), + _yOff(yOff_), + _xNegative(xNegative_), + _yNegative(yNegative_), + _isValid(true), + _percent(false), + _aspect(false), + _greater(false), + _less(false), + _fillArea(false), + _limitPixels(false) +{ +} + +Magick::Geometry::~Geometry(void) +{ +} + +const Magick::Geometry& Magick::Geometry::operator=(const char * geometry_) +{ + *this=std::string(geometry_); + return(*this); +} + +Magick::Geometry& Magick::Geometry::operator=(const Geometry& geometry_) +{ + // If not being set to ourself + if (this != &geometry_) + { + _width=geometry_._width; + _height=geometry_._height; + _xOff=geometry_._xOff; + _yOff=geometry_._yOff; + _xNegative=geometry_._xNegative; + _yNegative=geometry_._yNegative; + _isValid=geometry_._isValid; + _percent=geometry_._percent; + _aspect=geometry_._aspect; + _greater=geometry_._greater; + _less=geometry_._less; + _fillArea=geometry_._fillArea; + _limitPixels=geometry_._limitPixels; + } + return(*this); +} + +const Magick::Geometry& Magick::Geometry::operator=( + const std::string &geometry_) +{ + char + geom[MaxTextExtent]; + + char + *pageptr; + + ssize_t + flags, + x = 0, + y = 0; + + size_t + height_val=0, + width_val=0; + + // If argument does not start with digit, presume that it is a + // page-size specification that needs to be converted to an + // equivalent geometry specification using PostscriptGeometry() + (void) CopyMagickString(geom,geometry_.c_str(),MaxTextExtent); + if (geom[0] != '-' && geom[0] != '+' && geom[0] != 'x' && + !isdigit(static_cast(geom[0]))) + { + pageptr=GetPageGeometry(geom); + if (pageptr != 0) + { + (void) CopyMagickString(geom,pageptr,MaxTextExtent); + pageptr=(char *) RelinquishMagickMemory(pageptr); + } + } + + flags=GetGeometry(geom,&x,&y,&width_val,&height_val); + + if (flags == NoValue) + { + // Total failure! + *this=Geometry(); + isValid(false); + return(*this); + } + + if ((flags & WidthValue) != 0) + { + _width=width_val; + isValid(true); + } + + if ((flags & HeightValue) != 0) + { + _height=height_val; + isValid(true); + } + + if ((flags & XValue) != 0) + { + _xOff=static_cast(x); + isValid(true); + } + + if ((flags & YValue) != 0) + { + _yOff=static_cast(y); + isValid(true); + } + + if ((flags & XNegative) != 0) + _xNegative=true; + + if ((flags & YNegative) != 0) + _yNegative=true; + + if ((flags & PercentValue) != 0) + _percent=true; + + if ((flags & AspectValue) != 0) + _aspect=true; + + if ((flags & LessValue) != 0) + _less=true; + + if ((flags & GreaterValue) != 0) + _greater=true; + + if ((flags & MinimumValue) != 0) + _fillArea=true; + + if ((flags & AreaValue) != 0) + _limitPixels=true; + + return(*this); +} + +Magick::Geometry::operator std::string() const +{ + char + buffer[MaxTextExtent]; + + std::string + geometry; + + if (!isValid()) + throwExceptionExplicit(OptionError,"Invalid geometry argument"); + + if (_width) + { + FormatLocaleString(buffer,MaxTextExtent,"%.20g",(double) _width); + geometry+=buffer; + } + + if (_height) + { + FormatLocaleString(buffer,MaxTextExtent,"%.20g",(double) _height); + geometry+='x'; + geometry+=buffer; + } + + if (_xOff || _yOff) + { + if (_xNegative) + geometry+='-'; + else + geometry+='+'; + + FormatLocaleString(buffer,MaxTextExtent,"%.20g",(double) _xOff); + geometry+=buffer; + + if (_yNegative) + geometry+='-'; + else + geometry+='+'; + + FormatLocaleString(buffer,MaxTextExtent,"%.20g",(double) _yOff); + geometry+=buffer; + } + + if (_percent) + geometry+='%'; + + if (_aspect) + geometry+='!'; + + if (_greater) + geometry+='>'; + + if (_less) + geometry+='<'; + + if (_fillArea) + geometry+='^'; + + if (_limitPixels) + geometry+='@'; + + return(geometry); +} + +Magick::Geometry::Geometry(const MagickCore::RectangleInfo &rectangle_) + : _width(static_cast(rectangle_.width)), + _height(static_cast(rectangle_.height)), + _xOff(static_cast(rectangle_.x)), + _yOff(static_cast(rectangle_.y)), + _xNegative(rectangle_.x < 0 ? true : false), + _yNegative(rectangle_.y < 0 ? true : false), + _isValid(true), + _percent(false), + _aspect(false), + _greater(false), + _less(false), + _fillArea(false), + _limitPixels(false) +{ +} + +const Magick::Geometry& Magick::Geometry::operator=( + const MagickCore::RectangleInfo &rectangle_) +{ + _width=static_cast(rectangle_.width), + _height=static_cast(rectangle_.height), + _xOff=static_cast(rectangle_.x), + _yOff=static_cast(rectangle_.y), + _xNegative=rectangle_.x < 0 ? true : false, + _yNegative=rectangle_.y < 0 ? true : false, + _isValid=true; + return(*this); +} + +Magick::Geometry::operator MagickCore::RectangleInfo() const +{ + RectangleInfo rectangle; + rectangle.width=_width; + rectangle.height=_height; + rectangle.x=_xOff; + rectangle.y=_yOff; + return(rectangle); +} + +MagickPPExport int Magick::operator == (const Magick::Offset& left_, + const Magick::Offset& right_) +{ + return((left_.x() == right_.x()) && + (left_.y() == right_.y())); +} + +MagickPPExport int Magick::operator != (const Magick::Offset& left_, + const Magick::Offset& right_) +{ + return(!(left_ == right_)); +} + +Magick::Offset::Offset(void) + : _x(0), + _y(0) +{ +} + +Magick::Offset::Offset(const char *offset_) + : _x(0), + _y(0) +{ + *this=offset_; // Use assignment operator +} + +Magick::Offset::Offset(const Offset &offset_) + : _x(offset_._x), + _y(offset_._y) +{ +} + +Magick::Offset::Offset(const std::string &offset_) + : _x(0), + _y(0) +{ + *this=offset_; // Use assignment operator +} + +Magick::Offset::Offset(ssize_t x_,ssize_t y_) + : _x(x_), + _y(y_) +{ +} + +Magick::Offset::~Offset(void) +{ +} + +const Magick::Offset& Magick::Offset::operator=(const char *offset_) +{ + MagickCore::GeometryInfo + geometry_info; + + MagickCore::MagickStatusType + flags; + + flags=ParseGeometry(offset_,&geometry_info); + _x=(ssize_t) geometry_info.rho; + _y=(ssize_t) geometry_info.sigma; + if ((flags & MagickCore::SigmaValue) == 0) + _y=_x; + return(*this); +} + +Magick::Offset& Magick::Offset::operator=(const Offset &offset_) +{ + // If not being set to ourself + if (this != &offset_) + { + _x=offset_._x; + _y=offset_._y; + } + return(*this); +} + +const Magick::Offset& Magick::Offset::operator=(const std::string &offset_) +{ + *this=offset_.c_str(); + return(*this); +} + +ssize_t Magick::Offset::x(void) const +{ + return(_x); +} + +ssize_t Magick::Offset::y(void) const +{ + return(_y); +} + +Magick::Offset::operator MagickCore::OffsetInfo() const +{ + OffsetInfo offset; + offset.x=_x; + offset.y=_y; + return(offset); +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Image.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Image.cpp new file mode 100644 index 0000000..db28e9e --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Image.cpp @@ -0,0 +1,5206 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2013-2015 +// +// Implementation of Image +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include +#include +#include +#include +#include + +#include "Magick++/Image.h" +#include "Magick++/Functions.h" +#include "Magick++/Pixels.h" +#include "Magick++/Options.h" +#include "Magick++/ImageRef.h" +#include "Magick++/ResourceLimits.h" + +using namespace std; + +#define AbsoluteValue(x) ((x) < 0 ? -(x) : (x)) +#define MagickPI 3.14159265358979323846264338327950288419716939937510 +#define DegreesToRadians(x) (MagickPI*(x)/180.0) +#define ThrowImageException ThrowPPException(quiet()) + +MagickPPExport const char *Magick::borderGeometryDefault="6x6+0+0"; +MagickPPExport const char *Magick::frameGeometryDefault="25x25+6+6"; +MagickPPExport const char *Magick::raiseGeometryDefault="6x6+0+0"; + +MagickPPExport int Magick::operator == (const Magick::Image &left_, + const Magick::Image &right_) +{ + // If image pixels and signature are the same, then the image is identical + return((left_.rows() == right_.rows()) && + (left_.columns() == right_.columns()) && + (left_.signature() == right_.signature())); +} + +MagickPPExport int Magick::operator != (const Magick::Image &left_, + const Magick::Image &right_) +{ + return(!(left_ == right_)); +} + +MagickPPExport int Magick::operator > (const Magick::Image &left_, + const Magick::Image &right_) +{ + return(!(left_ < right_) && (left_ != right_)); +} + +MagickPPExport int Magick::operator < (const Magick::Image &left_, + const Magick::Image &right_) +{ + // If image pixels are less, then image is smaller + return((left_.rows() * left_.columns()) < (right_.rows() * + right_.columns())); +} + +MagickPPExport int Magick::operator >= (const Magick::Image &left_, + const Magick::Image &right_) +{ + return((left_ > right_) || (left_ == right_)); +} + +MagickPPExport int Magick::operator <= (const Magick::Image &left_, + const Magick::Image &right_) +{ + return((left_ < right_) || (left_ == right_)); +} + +Magick::Image::Image(void) + : _imgRef(new ImageRef) +{ +} + +Magick::Image::Image(const Blob &blob_) + : _imgRef(new ImageRef) +{ + try + { + // Initialize, Allocate and Read images + quiet(true); + read(blob_); + quiet(false); + } + catch(const Error&) + { + // Release resources + delete _imgRef; + throw; + } +} + +Magick::Image::Image(const Blob &blob_,const Geometry &size_) + : _imgRef(new ImageRef) +{ + try + { + // Read from Blob + quiet(true); + read(blob_,size_); + quiet(false); + } + catch(const Error&) + { + // Release resources + delete _imgRef; + throw; + } +} + +Magick::Image::Image(const Blob &blob_,const Geometry &size_, + const size_t depth_) + : _imgRef(new ImageRef) +{ + try + { + // Read from Blob + quiet(true); + read(blob_,size_,depth_); + quiet(false); + } + catch(const Error&) + { + // Release resources + delete _imgRef; + throw; + } +} + +Magick::Image::Image(const Blob &blob_,const Geometry &size_, + const size_t depth_,const std::string &magick_) + : _imgRef(new ImageRef) +{ + try + { + // Read from Blob + quiet(true); + read(blob_,size_,depth_,magick_); + quiet(false); + } + catch(const Error&) + { + // Release resources + delete _imgRef; + throw; + } +} + +Magick::Image::Image(const Blob &blob_,const Geometry &size_, + const std::string &magick_) + : _imgRef(new ImageRef) +{ + try + { + // Read from Blob + quiet(true); + read(blob_,size_,magick_); + quiet(false); + } + catch(const Error&) + { + // Release resources + delete _imgRef; + throw; + } +} + +Magick::Image::Image(const Geometry &size_,const Color &color_) + : _imgRef(new ImageRef) +{ + // xc: prefix specifies an X11 color string + std::string imageSpec("xc:"); + imageSpec+=color_; + + try + { + quiet(true); + // Set image size + size(size_); + + // Initialize, Allocate and Read images + read(imageSpec); + quiet(false); + } + catch(const Error&) + { + // Release resources + delete _imgRef; + throw; + } +} + +Magick::Image::Image(const Image &image_) + : _imgRef(image_._imgRef) +{ + Lock lock(&_imgRef->_mutexLock); + + // Increase reference count + ++_imgRef->_refCount; +} + +Magick::Image::Image(const Image &image_,const Geometry &geometry_) + : _imgRef(new ImageRef) +{ + const RectangleInfo + geometry=geometry_; + + OffsetInfo + offset; + + MagickCore::Image + *image; + + GetPPException; + image=CloneImage(image_.constImage(),geometry_.width(),geometry_.height(), + MagickTrue,exceptionInfo); + replaceImage(image); + _imgRef->options(new Options(*image_.constOptions())); + offset.x=0; + offset.y=0; + (void) CopyImagePixels(image,image_.constImage(),&geometry,&offset, + exceptionInfo); + ThrowImageException; +} + +Magick::Image::Image(const size_t width_,const size_t height_, + const std::string &map_,const StorageType type_,const void *pixels_) + : _imgRef(new ImageRef) +{ + try + { + quiet(true); + read(width_,height_,map_,type_,pixels_); + quiet(false); + } + catch(const Error&) + { + // Release resources + delete _imgRef; + throw; + } +} + +Magick::Image::Image(const std::string &imageSpec_) + : _imgRef(new ImageRef) +{ + try + { + // Initialize, Allocate and Read images + quiet(true); + read(imageSpec_); + quiet(false); + } + catch(const Error&) + { + // Release resources + delete _imgRef; + throw; + } +} + +Magick::Image::~Image() +{ + bool + doDelete=false; + + { + Lock lock(&_imgRef->_mutexLock); + if (--_imgRef->_refCount == 0) + doDelete=true; + } + + if (doDelete) + delete _imgRef; + + _imgRef=0; +} + +Magick::Image& Magick::Image::operator=(const Magick::Image &image_) +{ + if (this != &image_) + { + bool + doDelete=false; + + { + Lock lock(&image_._imgRef->_mutexLock); + ++image_._imgRef->_refCount; + } + + { + Lock lock(&_imgRef->_mutexLock); + if (--_imgRef->_refCount == 0) + doDelete=true; + } + + if (doDelete) + { + // Delete old image reference with associated image and options. + delete _imgRef; + _imgRef=0; + } + + // Use new image reference + _imgRef=image_._imgRef; + } + + return(*this); +} + +void Magick::Image::adjoin(const bool flag_) +{ + modifyImage(); + options()->adjoin(flag_); +} + +bool Magick::Image::adjoin(void) const +{ + return(constOptions()->adjoin()); +} + +void Magick::Image::antiAlias(const bool flag_) +{ + modifyImage(); + options()->antiAlias(flag_); +} + +bool Magick::Image::antiAlias(void) const +{ + return(constOptions()->antiAlias()); +} + +void Magick::Image::animationDelay(const size_t delay_) +{ + modifyImage(); + image()->delay=delay_; +} + +size_t Magick::Image::animationDelay(void) const +{ + return(constImage()->delay); +} + +void Magick::Image::animationIterations(const size_t iterations_) +{ + modifyImage(); + image()->iterations=iterations_; +} + +size_t Magick::Image::animationIterations(void) const +{ + return(constImage()->iterations); +} + +void Magick::Image::attenuate(const double attenuate_) +{ + char + value[MaxTextExtent]; + + modifyImage(); + FormatLocaleString(value,MaxTextExtent,"%.20g",attenuate_); + (void) SetImageArtifact(image(),"attenuate",value); +} + +void Magick::Image::backgroundColor(const Color &backgroundColor_) +{ + modifyImage(); + + if (backgroundColor_.isValid()) + image()->background_color=backgroundColor_; + else + image()->background_color=Color(); + + options()->backgroundColor(backgroundColor_); +} + +Magick::Color Magick::Image::backgroundColor(void) const +{ + return(constOptions()->backgroundColor()); +} + +void Magick::Image::backgroundTexture(const std::string &backgroundTexture_) +{ + modifyImage(); + options()->backgroundTexture(backgroundTexture_); +} + +std::string Magick::Image::backgroundTexture(void) const +{ + return(constOptions()->backgroundTexture()); +} + +size_t Magick::Image::baseColumns(void) const +{ + return(constImage()->magick_columns); +} + +std::string Magick::Image::baseFilename(void) const +{ + return(std::string(constImage()->magick_filename)); +} + +size_t Magick::Image::baseRows(void) const +{ + return(constImage()->magick_rows); +} + +void Magick::Image::blackPointCompensation(const bool flag_) +{ + image()->black_point_compensation=(MagickBooleanType) flag_; +} + +bool Magick::Image::blackPointCompensation(void) const +{ + return(static_cast(constImage()->black_point_compensation)); +} + +void Magick::Image::borderColor(const Color &borderColor_) +{ + modifyImage(); + + if (borderColor_.isValid()) + image()->border_color=borderColor_; + else + image()->border_color=Color(); + + options()->borderColor(borderColor_); +} + +Magick::Color Magick::Image::borderColor(void) const +{ + return(constOptions()->borderColor()); +} + +Magick::Geometry Magick::Image::boundingBox(void) const +{ + RectangleInfo + bbox; + + GetPPException; + bbox=GetImageBoundingBox(constImage(),exceptionInfo); + ThrowImageException; + return(Geometry(bbox)); +} + +void Magick::Image::boxColor(const Color &boxColor_) +{ + modifyImage(); + options()->boxColor(boxColor_); +} + +Magick::Color Magick::Image::boxColor(void) const +{ + return(constOptions()->boxColor()); +} + +void Magick::Image::cacheThreshold(const size_t threshold_) +{ + ResourceLimits::memory((MagickSizeType) threshold_); +} + +void Magick::Image::classType(const ClassType class_) +{ + if (classType() == PseudoClass && class_ == DirectClass) + { + // Use SyncImage to synchronize the DirectClass pixels with the + // color map and then set to DirectClass type. + modifyImage(); + SyncImage(image()); + image()->colormap=(PixelPacket *)RelinquishMagickMemory( + image()->colormap); + image()->storage_class=static_cast(DirectClass); + } + else if (classType() == DirectClass && class_ == PseudoClass) + { + // Quantize to create PseudoClass color map + modifyImage(); + quantizeColors(MaxColormapSize); + quantize(); + image()->storage_class=static_cast(PseudoClass); + } +} + +void Magick::Image::clipMask(const Magick::Image &clipMask_) +{ + modifyImage(); + + if (clipMask_.isValid()) + SetImageClipMask(image(),clipMask_.constImage()); + else + SetImageClipMask(image(),0); +} + +Magick::Image Magick::Image::clipMask(void) const +{ + MagickCore::Image + *image; + + GetPPException; + image=GetImageClipMask(constImage(),exceptionInfo); + ThrowImageException; + + if (image == (MagickCore::Image *) NULL) + return(Magick::Image()); + else + return(Magick::Image(image)); +} + +void Magick::Image::colorFuzz(const double fuzz_) +{ + modifyImage(); + image()->fuzz=fuzz_; + options()->colorFuzz(fuzz_); +} + +double Magick::Image::colorFuzz(void) const +{ + return(constOptions()->colorFuzz()); +} + +void Magick::Image::colorMapSize(const size_t entries_) +{ + if (entries_ > MaxColormapSize) + throwExceptionExplicit(OptionError, + "Colormap entries must not exceed MaxColormapSize"); + + modifyImage(); + (void) AcquireImageColormap(image(),entries_); +} + +size_t Magick::Image::colorMapSize(void) const +{ + if (!constImage()->colormap) + throwExceptionExplicit(OptionError,"Image does not contain a colormap"); + + return(constImage()->colors); +} + +void Magick::Image::colorSpace(const ColorspaceType colorSpace_) +{ + if (image()->colorspace == colorSpace_) + return; + + modifyImage(); + TransformImageColorspace(image(),colorSpace_); + throwImageException(); +} + +Magick::ColorspaceType Magick::Image::colorSpace(void) const +{ + return(constImage()->colorspace); +} + +void Magick::Image::colorspaceType(const ColorspaceType colorSpace_) +{ + modifyImage(); + SetImageColorspace(image(),colorSpace_); + throwImageException(); + options()->colorspaceType(colorSpace_); +} + +Magick::ColorspaceType Magick::Image::colorspaceType(void) const +{ + return(constOptions()->colorspaceType()); +} + +void Magick::Image::comment(const std::string &comment_) +{ + modifyImage(); + SetImageProperty(image(),"Comment",NULL); + if (comment_.length() > 0) + SetImageProperty(image(),"Comment",comment_.c_str()); + throwImageException(); +} + +std::string Magick::Image::comment(void) const +{ + const char + *value; + + value=GetImageProperty(constImage(),"Comment"); + + if (value) + return(std::string(value)); + + return(std::string()); // Intentionally no exception +} + +void Magick::Image::compose(const CompositeOperator compose_) +{ + image()->compose=compose_; +} + +Magick::CompositeOperator Magick::Image::compose(void) const +{ + return(constImage()->compose); +} + +void Magick::Image::compressType(const CompressionType compressType_) +{ + modifyImage(); + image()->compression=compressType_; + options()->compressType(compressType_); +} + +Magick::CompressionType Magick::Image::compressType(void) const +{ + return(constImage()->compression); +} + +void Magick::Image::debug(const bool flag_) +{ + modifyImage(); + options()->debug(flag_); +} + +bool Magick::Image::debug(void) const +{ + return(constOptions()->debug()); +} + +void Magick::Image::density(const Geometry &density_) +{ + modifyImage(); + options()->density(density_); + if (density_.isValid()) + { + image()->x_resolution=density_.width(); + if (density_.height() != 0) + image()->y_resolution=density_.height(); + else + image()->y_resolution=density_.width(); + } + else + { + // Reset to default + image()->x_resolution=0; + image()->y_resolution=0; + } +} + +Magick::Geometry Magick::Image::density(void) const +{ + if (isValid()) + { + ssize_t + x_resolution=72, + y_resolution=72; + + if (constImage()->x_resolution > 0.0) + x_resolution=static_cast(constImage()->x_resolution + 0.5); + + if (constImage()->y_resolution > 0.0) + y_resolution=static_cast(constImage()->y_resolution + 0.5); + + return(Geometry(x_resolution,y_resolution)); + } + + return(constOptions()->density()); +} + +void Magick::Image::depth(const size_t depth_) +{ + modifyImage(); + image()->depth=depth_; + options()->depth(depth_); +} + +size_t Magick::Image::depth(void) const +{ + return(constImage()->depth); +} + +std::string Magick::Image::directory(void) const +{ + if (constImage()->directory) + return(std::string(constImage()->directory)); + + throwExceptionExplicit(CorruptImageWarning, + "Image does not contain a directory"); + + return(std::string()); +} + +void Magick::Image::endian(const Magick::EndianType endian_) +{ + modifyImage(); + options()->endian(endian_); + image()->endian=endian_; +} + +Magick::EndianType Magick::Image::endian(void) const +{ + return(constImage()->endian); +} + +void Magick::Image::exifProfile(const Magick::Blob &exifProfile_) +{ + if (exifProfile_.data() != 0) + { + StringInfo + *exif_profile; + + modifyImage(); + exif_profile=AcquireStringInfo(exifProfile_.length()); + SetStringInfoDatum(exif_profile,(unsigned char *) exifProfile_.data()); + (void) SetImageProfile(image(),"exif",exif_profile); + exif_profile=DestroyStringInfo(exif_profile); + } +} + +Magick::Blob Magick::Image::exifProfile(void) const +{ + const StringInfo + *exif_profile; + + exif_profile=GetImageProfile(constImage(),"exif"); + if (exif_profile == (StringInfo *) NULL) + return(Blob()); + + return(Blob(GetStringInfoDatum(exif_profile),GetStringInfoLength( + exif_profile))); +} + +void Magick::Image::fileName(const std::string &fileName_) +{ + ssize_t + max_length; + + modifyImage(); + + max_length=sizeof(image()->filename)-1; + fileName_.copy(image()->filename,max_length); + if ((ssize_t) fileName_.length() > max_length) + image()->filename[max_length]=0; + else + image()->filename[fileName_.length()]=0; + + options()->fileName(fileName_); +} + +std::string Magick::Image::fileName(void) const +{ + return(constOptions()->fileName()); +} + +off_t Magick::Image::fileSize(void) const +{ + return((off_t) GetBlobSize(constImage())); +} + +void Magick::Image::fillColor(const Magick::Color &fillColor_) +{ + modifyImage(); + options()->fillColor(fillColor_); +} + +Magick::Color Magick::Image::fillColor(void) const +{ + return(constOptions()->fillColor()); +} + +void Magick::Image::fillRule(const Magick::FillRule &fillRule_) +{ + modifyImage(); + options()->fillRule(fillRule_); +} + +Magick::FillRule Magick::Image::fillRule(void) const +{ + return(constOptions()->fillRule()); +} + +void Magick::Image::fillPattern(const Image &fillPattern_) +{ + modifyImage(); + if(fillPattern_.isValid()) + options()->fillPattern(fillPattern_.constImage()); + else + options()->fillPattern(static_cast(NULL)); +} + +Magick::Image Magick::Image::fillPattern(void) const +{ + // FIXME: This is inordinately innefficient + const MagickCore::Image + *tmpTexture; + + Image + texture; + + tmpTexture=constOptions()->fillPattern(); + + if(tmpTexture) + { + MagickCore::Image + *image; + + GetPPException; + image=CloneImage(tmpTexture,0,0,MagickTrue,exceptionInfo); + texture.replaceImage(image); + ThrowImageException; + } + + return(texture); +} + +void Magick::Image::filterType(const Magick::FilterTypes filterType_) +{ + modifyImage(); + image()->filter=filterType_; +} + +Magick::FilterTypes Magick::Image::filterType(void) const +{ + return(constImage()->filter); +} + +void Magick::Image::font(const std::string &font_) +{ + modifyImage(); + options()->font(font_); +} + +std::string Magick::Image::font(void) const +{ + return(constOptions()->font()); +} + +void Magick::Image::fontFamily(const std::string &family_) +{ + modifyImage(); + options()->fontFamily(family_); +} + +std::string Magick::Image::fontFamily(void) const +{ + return(constOptions()->fontFamily()); +} + + +void Magick::Image::fontPointsize(const double pointSize_) +{ + modifyImage(); + options()->fontPointsize(pointSize_); +} + +double Magick::Image::fontPointsize(void) const +{ + return(constOptions()->fontPointsize()); +} + +std::string Magick::Image::format(void) const +{ + const MagickInfo + *magick_info; + + GetPPException; + magick_info=GetMagickInfo(constImage()->magick,exceptionInfo); + ThrowImageException; + + if ((magick_info != 0) && (*magick_info->description != '\0')) + return(std::string(magick_info->description)); + + throwExceptionExplicit(CorruptImageWarning,"Unrecognized image magick type"); + return(std::string()); +} + +void Magick::Image::fontStyle(const StyleType pointSize_) +{ + modifyImage(); + options()->fontStyle(pointSize_); +} + +Magick::StyleType Magick::Image::fontStyle(void) const +{ + return(constOptions()->fontStyle()); +} + +void Magick::Image::fontWeight(const size_t weight_) +{ + modifyImage(); + options()->fontWeight(weight_); +} + +size_t Magick::Image::fontWeight(void) const +{ + return(constOptions()->fontWeight()); +} + + +std::string Magick::Image::formatExpression(const std::string expression) +{ + char + *text; + + std::string + text_string; + + modifyImage(); + text=InterpretImageProperties(constImageInfo(),image(),expression.c_str()); + if (text != (char *) NULL) + { + text_string=std::string(text); + text=DestroyString(text); + } + throwImageException(); + return(text_string); +} + +double Magick::Image::gamma(void) const +{ + return(constImage()->gamma); +} + +Magick::Geometry Magick::Image::geometry(void) const +{ + if (constImage()->geometry) + return(Geometry(constImage()->geometry)); + + throwExceptionExplicit(OptionWarning,"Image does not contain a geometry"); + + return(Geometry()); +} + +void Magick::Image::gifDisposeMethod(const size_t disposeMethod_) +{ + modifyImage(); + image()->dispose=(DisposeType) disposeMethod_; +} + +size_t Magick::Image::gifDisposeMethod(void) const +{ + // FIXME: It would be better to return an enumeration + return ((size_t) constImage()->dispose); +} + +void Magick::Image::highlightColor(const Color color_) +{ + std::string + value; + + value=color_; + artifact("highlight-color",value); +} + +void Magick::Image::iccColorProfile(const Magick::Blob &colorProfile_) +{ + profile("icc",colorProfile_); +} + +Magick::Blob Magick::Image::iccColorProfile(void) const +{ + const StringInfo + *color_profile; + + color_profile=GetImageProfile(constImage(),"icc"); + if (color_profile == (StringInfo *) NULL) + return Blob(); + + return(Blob(GetStringInfoDatum(color_profile),GetStringInfoLength( + color_profile))); +} + +void Magick::Image::interlaceType(const InterlaceType interlace_) +{ + modifyImage(); + image()->interlace=interlace_; + options()->interlaceType(interlace_); +} + +Magick::InterlaceType Magick::Image::interlaceType(void) const +{ + return constImage()->interlace; +} + +void Magick::Image::interpolate(const InterpolatePixelMethod interpolate_) +{ + modifyImage(); + image()->interpolate=interpolate_; +} + +Magick::InterpolatePixelMethod Magick::Image::interpolate(void) const +{ + return constImage()->interpolate; +} + +void Magick::Image::iptcProfile(const Magick::Blob &iptcProfile_) +{ + modifyImage(); + if (iptcProfile_.data() != 0) + { + StringInfo + *iptc_profile; + + iptc_profile=AcquireStringInfo(iptcProfile_.length()); + SetStringInfoDatum(iptc_profile,(unsigned char *) iptcProfile_.data()); + (void) SetImageProfile(image(),"iptc",iptc_profile); + iptc_profile=DestroyStringInfo(iptc_profile ); + } +} + +Magick::Blob Magick::Image::iptcProfile(void) const +{ + const StringInfo + *iptc_profile; + + iptc_profile=GetImageProfile(constImage(),"iptc"); + if (iptc_profile == (StringInfo *) NULL) + return(Blob()); + return(Blob(GetStringInfoDatum(iptc_profile),GetStringInfoLength( + iptc_profile))); +} + +bool Magick::Image::isOpaque(void) const +{ + MagickBooleanType + result; + + GetPPException; + result=IsOpaqueImage(constImage(),exceptionInfo); + ThrowImageException; + return(result != MagickFalse ? true : false); +} + +void Magick::Image::isValid(const bool isValid_) +{ + if (!isValid_) + { + delete _imgRef; + _imgRef = new ImageRef; + } + else if (!isValid()) + { + // Construct with single-pixel black image to make + // image valid. This is an obvious hack. + size(Geometry(1,1)); + read("xc:black"); + } +} + +bool Magick::Image::isValid(void) const +{ + return(rows() && columns()); +} + +void Magick::Image::label(const std::string &label_) +{ + modifyImage(); + (void) SetImageProperty(image(),"Label",NULL); + if (label_.length() > 0) + (void) SetImageProperty(image(),"Label",label_.c_str()); + throwImageException(); +} + +std::string Magick::Image::label(void) const +{ + const char + *value; + + value=GetImageProperty(constImage(),"Label"); + + if (value) + return(std::string(value)); + + return(std::string()); +} + +void Magick::Image::lowlightColor(const Color color_) +{ + std::string + value; + + value=color_; + artifact("lowlight-color",value); +} + +void Magick::Image::magick(const std::string &magick_) +{ + size_t + length; + + modifyImage(); + + length=sizeof(image()->magick)-1; + if (magick_.length() < length) + length=magick_.length(); + + if (!magick_.empty()) + magick_.copy(image()->magick,length); + image()->magick[length]=0; + + options()->magick(magick_); +} + +std::string Magick::Image::magick(void) const +{ + if (*(constImage()->magick) != '\0') + return(std::string(constImage()->magick)); + + return(constOptions()->magick()); +} + +void Magick::Image::mask(const Magick::Image &mask_) +{ + modifyImage(); + + if (mask_.isValid()) + SetImageMask(image(),mask_.constImage()); + else + SetImageMask(image(),0); +} + +Magick::Image Magick::Image::mask(void) const +{ + MagickCore::Image + *image; + + GetPPException; + image=GetImageMask(constImage(),exceptionInfo); + ThrowImageException; + + if (image == (MagickCore::Image *) NULL) + return(Magick::Image()); + else + return(Magick::Image(image)); +} + +void Magick::Image::matte(const bool matteFlag_) +{ + modifyImage(); + + // If matte channel is requested, but image doesn't already have a + // matte channel, then create an opaque matte channel. Likewise, if + // the image already has a matte channel but a matte channel is not + // desired, then set the matte channel to opaque. + if (bool(matteFlag_) != bool(constImage()->matte)) + SetImageOpacity(image(),OpaqueOpacity); + + image()->matte=(MagickBooleanType) matteFlag_; +} + +bool Magick::Image::matte(void) const +{ + if (constImage()->matte) + return true; + else + return false; +} + +void Magick::Image::matteColor(const Color &matteColor_) +{ + modifyImage(); + + if (matteColor_.isValid()) + { + image()->matte_color=matteColor_; + options()->matteColor(matteColor_); + } + else + { + // Set to default matte color + Color + tmpColor("#BDBDBD"); + + image()->matte_color=tmpColor; + options()->matteColor(tmpColor); + } +} + +Magick::Color Magick::Image::matteColor(void) const +{ + return(Color(constImage()->matte_color.red,constImage()->matte_color.green, + constImage()->matte_color.blue)); +} + +double Magick::Image::meanErrorPerPixel(void) const +{ + return(constImage()->error.mean_error_per_pixel); +} + +void Magick::Image::modulusDepth(const size_t depth_) +{ + modifyImage(); + SetImageDepth(image(),depth_); + options()->depth(depth_); +} + +size_t Magick::Image::modulusDepth(void) const +{ + size_t + depth; + + GetPPException; + depth=GetImageDepth(constImage(),exceptionInfo); + ThrowImageException; + return(depth); +} + +void Magick::Image::monochrome(const bool monochromeFlag_) +{ + modifyImage(); + options()->monochrome(monochromeFlag_); +} + +bool Magick::Image::monochrome(void) const +{ + return(constOptions()->monochrome()); +} + +Magick::Geometry Magick::Image::montageGeometry(void) const +{ + if (constImage()->montage) + return(Magick::Geometry(constImage()->montage)); + + throwExceptionExplicit(CorruptImageWarning, + "Image does not contain a montage"); + + return(Magick::Geometry()); +} + +double Magick::Image::normalizedMaxError(void) const +{ + return(constImage()->error.normalized_maximum_error); +} + +double Magick::Image::normalizedMeanError(void) const +{ + return (constImage()->error.normalized_mean_error); +} + +void Magick::Image::orientation(const Magick::OrientationType orientation_) +{ + modifyImage(); + image()->orientation=orientation_; +} + +Magick::OrientationType Magick::Image::orientation(void) const +{ + return(constImage()->orientation); +} + +void Magick::Image::page(const Magick::Geometry &pageSize_) +{ + modifyImage(); + options()->page(pageSize_); + image()->page=pageSize_; +} + +Magick::Geometry Magick::Image::page(void) const +{ + return(Geometry(constImage()->page.width,constImage()->page.height, + AbsoluteValue(constImage()->page.x),AbsoluteValue(constImage()->page.y), + constImage()->page.x < 0 ? true : false, + constImage()->page.y < 0 ? true : false)); +} + +void Magick::Image::penColor(const Color &penColor_) +{ + modifyImage(); + options()->fillColor(penColor_); + options()->strokeColor(penColor_); +} + +Magick::Color Magick::Image::penColor(void) const +{ + return(constOptions()->fillColor()); +} + +void Magick::Image::penTexture(const Image &penTexture_) +{ + modifyImage(); + if(penTexture_.isValid()) + options()->fillPattern(penTexture_.constImage()); + else + options()->fillPattern(static_cast(NULL)); +} + +Magick::Image Magick::Image::penTexture(void) const +{ + // FIXME: This is inordinately innefficient + const MagickCore::Image + *tmpTexture; + + Image + texture; + + tmpTexture=constOptions()->fillPattern(); + + if (tmpTexture) + { + MagickCore::Image + *image; + + GetPPException; + image=CloneImage(tmpTexture,0,0,MagickTrue,exceptionInfo); + texture.replaceImage(image); + ThrowImageException; + } + return(texture); +} + +void Magick::Image::quality(const size_t quality_) +{ + modifyImage(); + image()->quality=quality_; + options()->quality(quality_); +} + +size_t Magick::Image::quality(void) const +{ + return(constImage()->quality); +} + +void Magick::Image::quantizeColors(const size_t colors_) +{ + modifyImage(); + options()->quantizeColors(colors_); +} + +size_t Magick::Image::quantizeColors(void) const +{ + return(constOptions()->quantizeColors()); +} + +void Magick::Image::quantizeColorSpace( + const Magick::ColorspaceType colorSpace_) +{ + modifyImage(); + options()->quantizeColorSpace(colorSpace_); +} + +Magick::ColorspaceType Magick::Image::quantizeColorSpace(void) const +{ + return(constOptions()->quantizeColorSpace()); +} + +void Magick::Image::quantizeDither(const bool ditherFlag_) +{ + modifyImage(); + options()->quantizeDither(ditherFlag_); +} + +bool Magick::Image::quantizeDither(void) const +{ + return(constOptions()->quantizeDither()); +} + +void Magick::Image::quantizeDitherMethod(const DitherMethod ditherMethod_) +{ + modifyImage(); + options()->quantizeDitherMethod(ditherMethod_); +} + +MagickCore::DitherMethod Magick::Image::quantizeDitherMethod(void) const +{ + return(constOptions()->quantizeDitherMethod()); +} + +void Magick::Image::quantizeTreeDepth(const size_t treeDepth_) +{ + modifyImage(); + options()->quantizeTreeDepth(treeDepth_); +} + +size_t Magick::Image::quantizeTreeDepth(void) const +{ + return(constOptions()->quantizeTreeDepth()); +} + +void Magick::Image::quiet(const bool quiet_) +{ + modifyImage(); + options()->quiet(quiet_); +} + +bool Magick::Image::quiet(void) const +{ + return(constOptions()->quiet()); +} + +void Magick::Image::renderingIntent( + const Magick::RenderingIntent renderingIntent_) +{ + modifyImage(); + image()->rendering_intent=renderingIntent_; +} + +Magick::RenderingIntent Magick::Image::renderingIntent(void) const +{ + return(static_cast( + constImage()->rendering_intent)); +} + +void Magick::Image::resolutionUnits( + const Magick::ResolutionType resolutionUnits_) +{ + modifyImage(); + image()->units=resolutionUnits_; + options()->resolutionUnits(resolutionUnits_); +} + +Magick::ResolutionType Magick::Image::resolutionUnits(void) const +{ + return(static_cast(constImage()->units)); +} + +void Magick::Image::scene(const size_t scene_) +{ + modifyImage(); + image()->scene=scene_; +} + +size_t Magick::Image::scene(void) const +{ + return(constImage()->scene); +} + +void Magick::Image::size(const Geometry &geometry_) +{ + modifyImage(); + options()->size(geometry_); + image()->rows=geometry_.height(); + image()->columns=geometry_.width(); +} + +Magick::Geometry Magick::Image::size(void) const +{ + return(Magick::Geometry(constImage()->columns,constImage()->rows)); +} + +void Magick::Image::strokeAntiAlias(const bool flag_) +{ + modifyImage(); + options()->strokeAntiAlias(flag_); +} + +bool Magick::Image::strokeAntiAlias(void) const +{ + return(constOptions()->strokeAntiAlias()); +} + +void Magick::Image::strokeColor(const Magick::Color &strokeColor_) +{ + std::string + value; + + modifyImage(); + options()->strokeColor(strokeColor_); + value=strokeColor_; + artifact("stroke",value); +} + +Magick::Color Magick::Image::strokeColor(void) const +{ + return(constOptions()->strokeColor()); +} + +void Magick::Image::strokeDashArray(const double *strokeDashArray_) +{ + modifyImage(); + options()->strokeDashArray(strokeDashArray_); +} + +const double *Magick::Image::strokeDashArray(void) const +{ + return(constOptions()->strokeDashArray()); +} + +void Magick::Image::strokeDashOffset(const double strokeDashOffset_) +{ + modifyImage(); + options()->strokeDashOffset(strokeDashOffset_); +} + +double Magick::Image::strokeDashOffset(void) const +{ + return(constOptions()->strokeDashOffset()); +} + +void Magick::Image::strokeLineCap(const Magick::LineCap lineCap_) +{ + modifyImage(); + options()->strokeLineCap(lineCap_); +} + +Magick::LineCap Magick::Image::strokeLineCap(void) const +{ + return(constOptions()->strokeLineCap()); +} + +void Magick::Image::strokeLineJoin(const Magick::LineJoin lineJoin_) +{ + modifyImage(); + options()->strokeLineJoin(lineJoin_); +} + +Magick::LineJoin Magick::Image::strokeLineJoin(void) const +{ + return(constOptions()->strokeLineJoin()); +} + +void Magick::Image::strokeMiterLimit(const size_t strokeMiterLimit_) +{ + modifyImage(); + options()->strokeMiterLimit(strokeMiterLimit_); +} + +size_t Magick::Image::strokeMiterLimit(void) const +{ + return constOptions()->strokeMiterLimit(); +} + +void Magick::Image::strokePattern(const Image &strokePattern_) +{ + modifyImage(); + if(strokePattern_.isValid()) + options()->strokePattern(strokePattern_.constImage()); + else + options()->strokePattern(static_cast(NULL)); +} + +Magick::Image Magick::Image::strokePattern(void) const +{ + const MagickCore::Image + *tmpTexture; + + Image + texture; + + tmpTexture=constOptions()->strokePattern(); + + if (tmpTexture) + { + MagickCore::Image + *image; + + GetPPException; + image=CloneImage(tmpTexture,0,0,MagickTrue,exceptionInfo); + texture.replaceImage(image); + ThrowImageException; + } + return(texture); +} + +void Magick::Image::strokeWidth(const double strokeWidth_) +{ + char + value[MaxTextExtent]; + + modifyImage(); + options()->strokeWidth(strokeWidth_); + FormatLocaleString(value,MaxTextExtent,"%.20g",strokeWidth_); + (void) SetImageArtifact(image(),"strokewidth",value); +} + +double Magick::Image::strokeWidth(void) const +{ + return(constOptions()->strokeWidth()); +} + +void Magick::Image::subImage(const size_t subImage_) +{ + modifyImage(); + options()->subImage(subImage_); +} + +size_t Magick::Image::subImage(void) const +{ + return(constOptions()->subImage()); +} + +void Magick::Image::subRange(const size_t subRange_) +{ + modifyImage(); + options()->subRange(subRange_); +} + +size_t Magick::Image::subRange(void) const +{ + return(constOptions()->subRange()); +} + +void Magick::Image::textDirection(DirectionType direction_) +{ + modifyImage(); + options()->textDirection(direction_); +} + +Magick::DirectionType Magick::Image::textDirection(void) const +{ + return(constOptions()->textDirection()); +} + +void Magick::Image::textEncoding(const std::string &encoding_) +{ + modifyImage(); + options()->textEncoding(encoding_); +} + +std::string Magick::Image::textEncoding(void) const +{ + return(constOptions()->textEncoding()); +} + +void Magick::Image::textGravity(GravityType gravity_) +{ + modifyImage(); + options()->textGravity(gravity_); +} + +Magick::GravityType Magick::Image::textGravity(void) const +{ + return(constOptions()->textGravity()); +} + +void Magick::Image::textInterlineSpacing(double spacing_) +{ + modifyImage(); + options()->textInterlineSpacing(spacing_); +} + +double Magick::Image::textInterlineSpacing(void) const +{ + return(constOptions()->textInterlineSpacing()); +} + +void Magick::Image::textInterwordSpacing(double spacing_) +{ + modifyImage(); + options()->textInterwordSpacing(spacing_); +} + +double Magick::Image::textInterwordSpacing(void) const +{ + return(constOptions()->textInterwordSpacing()); +} + +void Magick::Image::textKerning(double kerning_) +{ + modifyImage(); + options()->textKerning(kerning_); +} + +double Magick::Image::textKerning(void) const +{ + return(constOptions()->textKerning()); +} + +void Magick::Image::textUnderColor(const Color &underColor_) +{ + modifyImage(); + options()->textUnderColor(underColor_); +} + +Magick::Color Magick::Image::textUnderColor(void) const +{ + return(constOptions()->textUnderColor()); +} + +void Magick::Image::tileName(const std::string &tileName_) +{ + modifyImage(); + options()->tileName(tileName_); +} + +std::string Magick::Image::tileName(void) const +{ + return(constOptions()->tileName()); +} + +size_t Magick::Image::totalColors(void) const +{ + size_t + colors; + + GetPPException; + colors=GetNumberColors(constImage(),0,exceptionInfo); + ThrowImageException; + return(colors); +} + +void Magick::Image::transformRotation(const double angle_) +{ + modifyImage(); + options()->transformRotation(angle_); +} + +void Magick::Image::transformSkewX(const double skewx_) +{ + modifyImage(); + options()->transformSkewX(skewx_); +} + +void Magick::Image::transformSkewY(const double skewy_) +{ + modifyImage(); + options()->transformSkewY(skewy_); +} + +void Magick::Image::type(const Magick::ImageType type_) +{ + modifyImage(); + options()->type(type_); + SetImageType(image(),type_); +} + +Magick::ImageType Magick::Image::type(void) const +{ + if (constOptions()->type() != UndefinedType) + return(constOptions()->type()); + else if (constImage()->type != UndefinedType) + return(constImage()->type); + else + return(determineType()); +} + +void Magick::Image::verbose(const bool verboseFlag_) +{ + modifyImage(); + options()->verbose(verboseFlag_); +} + +bool Magick::Image::verbose(void) const +{ + return(constOptions()->verbose()); +} + +void Magick::Image::view(const std::string &view_) +{ + modifyImage(); + options()->view(view_); +} + +std::string Magick::Image::view(void) const +{ + return(constOptions()->view()); +} + +void Magick::Image::virtualPixelMethod( + const VirtualPixelMethod virtual_pixel_method_) +{ + modifyImage(); + SetImageVirtualPixelMethod(image(),virtual_pixel_method_); + options()->virtualPixelMethod(virtual_pixel_method_); +} + +Magick::VirtualPixelMethod Magick::Image::virtualPixelMethod(void) const +{ + return(GetImageVirtualPixelMethod(constImage())); +} + +void Magick::Image::x11Display(const std::string &display_) +{ + modifyImage(); + options()->x11Display(display_); +} + +std::string Magick::Image::x11Display(void) const +{ + return(constOptions()->x11Display()); +} + +double Magick::Image::xResolution(void) const +{ + return(constImage()->x_resolution); +} + +double Magick::Image::yResolution(void) const +{ + return(constImage()->y_resolution); +} + +void Magick::Image::adaptiveBlur(const double radius_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=AdaptiveBlurImage(constImage(),radius_,sigma_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::adaptiveResize(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + size_t + width=columns(), + height=rows(); + + ssize_t + x=0, + y=0; + + ParseMetaGeometry(static_cast(geometry_).c_str(),&x,&y,&width, + &height); + + GetPPException; + newImage=AdaptiveResizeImage(constImage(),width,height,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::adaptiveSharpen(const double radius_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=AdaptiveSharpenImage(constImage(),radius_,sigma_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::adaptiveSharpenChannel(const ChannelType channel_, + const double radius_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=AdaptiveSharpenImageChannel(constImage(),channel_,radius_,sigma_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::adaptiveThreshold(const size_t width_,const size_t height_, + const ssize_t offset_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=AdaptiveThresholdImage(constImage(),width_,height_,offset_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::addNoise(const NoiseType noiseType_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=AddNoiseImage(constImage(),noiseType_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::addNoiseChannel(const ChannelType channel_, + const NoiseType noiseType_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=AddNoiseImageChannel(constImage(),channel_,noiseType_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::affineTransform(const DrawableAffine &affine_ ) +{ + AffineMatrix + _affine; + + MagickCore::Image + *newImage; + + _affine.sx = affine_.sx(); + _affine.sy = affine_.sy(); + _affine.rx = affine_.rx(); + _affine.ry = affine_.ry(); + _affine.tx = affine_.tx(); + _affine.ty = affine_.ty(); + + GetPPException; + newImage=AffineTransformImage(constImage(),&_affine,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::alphaChannel(AlphaChannelType alphaType_) +{ + modifyImage(); + SetImageAlphaChannel(image(), alphaType_); + throwImageException(); +} + +void Magick::Image::annotate(const std::string &text_, + const Geometry &location_) +{ + annotate(text_,location_,NorthWestGravity,0.0); +} + +void Magick::Image::annotate(const std::string &text_, + const Geometry &boundingArea_,const GravityType gravity_) +{ + annotate(text_,boundingArea_,gravity_,0.0); +} + +void Magick::Image::annotate(const std::string &text_, + const Geometry &boundingArea_,const GravityType gravity_, + const double degrees_) +{ + AffineMatrix + oaffine; + + char + boundingArea[MaxTextExtent]; + + DrawInfo + *drawInfo; + + modifyImage(); + + drawInfo=options()->drawInfo(); + drawInfo->text=DestroyString(drawInfo->text); + drawInfo->text=const_cast(text_.c_str()); + drawInfo->geometry=DestroyString(drawInfo->geometry); + + if (boundingArea_.isValid()) + { + if (boundingArea_.width() == 0 || boundingArea_.height() == 0) + { + FormatLocaleString(boundingArea,MaxTextExtent,"%+.20g%+.20g", + (double) boundingArea_.xOff(),(double) boundingArea_.yOff()); + } + else + { + (void) CopyMagickString(boundingArea, + std::string(boundingArea_).c_str(), MaxTextExtent); + } + drawInfo->geometry=boundingArea; + } + + drawInfo->gravity=gravity_; + + oaffine=drawInfo->affine; + if (degrees_ != 0.0) + { + AffineMatrix + affine, + current; + + affine.sx=1.0; + affine.rx=0.0; + affine.ry=0.0; + affine.sy=1.0; + affine.tx=0.0; + affine.ty=0.0; + + current=drawInfo->affine; + affine.sx=cos(DegreesToRadians(fmod(degrees_,360.0))); + affine.rx=sin(DegreesToRadians(fmod(degrees_,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(degrees_,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(degrees_,360.0))); + + drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty + +current.tx; + } + + AnnotateImage(image(),drawInfo); + + // Restore original values + drawInfo->affine=oaffine; + drawInfo->text=(char *) NULL; + drawInfo->geometry=(char *) NULL; + + throwImageException(); +} + +void Magick::Image::annotate(const std::string &text_, + const GravityType gravity_) +{ + DrawInfo + *drawInfo; + + modifyImage(); + + drawInfo=options()->drawInfo(); + drawInfo->text=DestroyString(drawInfo->text); + drawInfo->text=const_cast(text_.c_str()); + drawInfo->gravity=gravity_; + + AnnotateImage(image(),drawInfo); + + drawInfo->gravity=NorthWestGravity; + drawInfo->text=(char *) NULL; + + throwImageException(); +} + +void Magick::Image::artifact(const std::string &name_, + const std::string &value_) +{ + modifyImage(); + (void) SetImageArtifact(image(),name_.c_str(),value_.c_str()); +} + +std::string Magick::Image::artifact(const std::string &name_) const +{ + const char + *value; + + value=GetImageArtifact(constImage(),name_.c_str()); + if (value) + return(std::string(value)); + return(std::string()); +} + +void Magick::Image::attribute(const std::string name_,const char *value_) +{ + modifyImage(); + SetImageProperty(image(),name_.c_str(),value_); +} + +void Magick::Image::attribute(const std::string name_,const std::string value_) +{ + modifyImage(); + SetImageProperty(image(),name_.c_str(),value_.c_str()); +} + +std::string Magick::Image::attribute(const std::string name_) const +{ + const char + *value; + + value=GetImageProperty(constImage(),name_.c_str()); + + if (value) + return(std::string(value)); + + return(std::string()); // Intentionally no exception +} + +void Magick::Image::autoGamma(void) +{ + modifyImage(); + (void) AutoGammaImage(image()); + throwImageException(); +} + +void Magick::Image::autoGammaChannel(const ChannelType channel_) +{ + modifyImage(); + (void) AutoGammaImageChannel(image(),channel_); + throwImageException(); +} + +void Magick::Image::autoLevel(void) +{ + modifyImage(); + (void) AutoLevelImage(image()); + throwImageException(); +} + +void Magick::Image::autoLevelChannel(const ChannelType channel_) +{ + modifyImage(); + (void) AutoLevelImageChannel(image(),channel_); + throwImageException(); +} + +void Magick::Image::autoOrient(void) +{ + MagickCore::Image + *newImage; + + if (image()->orientation == UndefinedOrientation || + image()->orientation == TopLeftOrientation) + return; + + GetPPException; + newImage=AutoOrientImage(constImage(),image()->orientation,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::blackThreshold(const std::string &threshold_) +{ + modifyImage(); + BlackThresholdImage(image(),threshold_.c_str()); + throwImageException(); +} + +void Magick::Image::blackThresholdChannel(const ChannelType channel_, + const std::string &threshold_) +{ + modifyImage(); + GetPPException; + BlackThresholdImageChannel(image(),channel_,threshold_.c_str(), + exceptionInfo); + ThrowImageException; +} + +void Magick::Image::blueShift(const double factor_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=BlueShiftImage(constImage(),factor_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +// Blur image +void Magick::Image::blur(const double radius_, const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=BlurImage(constImage(),radius_,sigma_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::blurChannel(const ChannelType channel_, + const double radius_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=BlurImageChannel(constImage(),channel_,radius_,sigma_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::border(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + RectangleInfo + borderInfo=geometry_; + + GetPPException; + newImage=BorderImage(constImage(),&borderInfo,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::brightnessContrast(const double brightness_, + const double contrast_) +{ + modifyImage(); + BrightnessContrastImage(image(),brightness_,contrast_); + throwImageException(); +} + +void Magick::Image::brightnessContrastChannel(const ChannelType channel_, + const double brightness_,const double contrast_) +{ + modifyImage(); + BrightnessContrastImageChannel(image(),channel_,brightness_,contrast_); + throwImageException(); +} + +void Magick::Image::cannyEdge(const double radius_,const double sigma_, + const double lowerPercent_,const double upperPercent_) +{ + MagickCore::Image + *newImage; + + modifyImage(); + GetPPException; + newImage=CannyEdgeImage(constImage(),radius_,sigma_,lowerPercent_, + upperPercent_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::cdl(const std::string &cdl_) +{ + modifyImage(); + (void) ColorDecisionListImage(image(),cdl_.c_str()); + throwImageException(); +} + +void Magick::Image::channel(const ChannelType channel_) +{ + modifyImage(); + SeparateImageChannel(image(),channel_); + throwImageException(); +} + +void Magick::Image::channelDepth(const ChannelType channel_, + const size_t depth_) +{ + modifyImage(); + SetImageChannelDepth(image(),channel_,depth_); + throwImageException(); +} + +size_t Magick::Image::channelDepth(const ChannelType channel_) +{ + size_t + channel_depth; + + GetPPException; + channel_depth=GetImageChannelDepth(constImage(), channel_,exceptionInfo); + ThrowImageException; + return channel_depth; +} + +void Magick::Image::charcoal(const double radius_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=CharcoalImage(constImage(),radius_,sigma_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::chop(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + RectangleInfo + chopInfo=geometry_; + + GetPPException; + newImage=ChopImage(constImage(),&chopInfo,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::chromaBluePrimary(const double x_,const double y_) +{ + modifyImage(); + image()->chromaticity.blue_primary.x=x_; + image()->chromaticity.blue_primary.y=y_; +} + +void Magick::Image::chromaBluePrimary(double *x_,double *y_) const +{ + *x_=constImage()->chromaticity.blue_primary.x; + *y_=constImage()->chromaticity.blue_primary.y; +} + +void Magick::Image::chromaGreenPrimary(const double x_,const double y_) +{ + modifyImage(); + image()->chromaticity.green_primary.x=x_; + image()->chromaticity.green_primary.y=y_; +} + +void Magick::Image::chromaGreenPrimary(double *x_,double *y_) const +{ + *x_=constImage()->chromaticity.green_primary.x; + *y_=constImage()->chromaticity.green_primary.y; +} + +void Magick::Image::chromaRedPrimary(const double x_,const double y_) +{ + modifyImage(); + image()->chromaticity.red_primary.x=x_; + image()->chromaticity.red_primary.y=y_; +} + +void Magick::Image::chromaRedPrimary(double *x_,double *y_) const +{ + *x_=constImage()->chromaticity.red_primary.x; + *y_=constImage()->chromaticity.red_primary.y; +} + +void Magick::Image::chromaWhitePoint(const double x_,const double y_) +{ + modifyImage(); + image()->chromaticity.white_point.x=x_; + image()->chromaticity.white_point.y=y_; +} + +void Magick::Image::chromaWhitePoint(double *x_,double *y_) const +{ + *x_=constImage()->chromaticity.white_point.x; + *y_=constImage()->chromaticity.white_point.y; +} + +void Magick::Image::clamp(void) +{ + modifyImage(); + ClampImage(image()); + throwImageException(); +} + +void Magick::Image::clampChannel(const ChannelType channel_) +{ + modifyImage(); + ClampImageChannel(image(),channel_); + throwImageException(); +} + +void Magick::Image::clip(void ) +{ + modifyImage(); + ClipImage(image()); + throwImageException(); +} + +void Magick::Image::clipPath(const std::string pathname_,const bool inside_) +{ + modifyImage(); + ClipImagePath(image(),pathname_.c_str(),(MagickBooleanType) inside_); + throwImageException(); +} + +void Magick::Image::clut(const Image &clutImage_) +{ + modifyImage(); + ClutImage(image(),clutImage_.constImage()); + throwImageException(); +} + +void Magick::Image::clutChannel(const ChannelType channel_, + const Image &clutImage_) +{ + modifyImage(); + ClutImageChannel(image(),channel_,clutImage_.constImage()); + throwImageException(); +} + +void Magick::Image::colorize(const unsigned int opacityRed_, + const unsigned int opacityGreen_,const unsigned int opacityBlue_, + const Color &penColor_) +{ + char + opacity[MaxTextExtent]; + + MagickCore::Image + *newImage; + + if (!penColor_.isValid()) + throwExceptionExplicit( OptionError, "Pen color argument is invalid" ); + + FormatLocaleString(opacity,MaxTextExtent,"%u/%u/%u",opacityRed_, + opacityGreen_,opacityBlue_); + + GetPPException; + newImage=ColorizeImage(image(),opacity,penColor_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::colorize(const unsigned int opacity_, + const Color &penColor_) +{ + colorize(opacity_,opacity_,opacity_,penColor_); +} + +void Magick::Image::colorMap(const size_t index_,const Color &color_) +{ + if (index_ > (MaxColormapSize-1) ) + throwExceptionExplicit(OptionError, + "Colormap index must be less than MaxColormapSize"); + + if (!color_.isValid()) + throwExceptionExplicit(OptionError,"Color argument is invalid"); + + modifyImage(); + + // Ensure that colormap size is large enough + if (colorMapSize() < (index_+1)) + colorMapSize(index_+1); + + // Set color at index in colormap + (image()->colormap)[index_]=color_; +} + +Magick::Color Magick::Image::colorMap(const size_t index_) const +{ + if (!constImage()->colormap) + { + throwExceptionExplicit(OptionError,"Image does not contain a colormap"); + return(Color()); + } + + if (index_ > constImage()->colors-1) + throwExceptionExplicit(OptionError,"Index out of range"); + + return(Color((constImage()->colormap)[index_])); +} + +void Magick::Image::colorMatrix(const size_t order_, + const double *color_matrix_) +{ + KernelInfo + *kernel_info; + + MagickCore::Image + *newImage; + + GetPPException; + + kernel_info=AcquireKernelInfo("1"); + if (kernel_info != (KernelInfo *) NULL) + { + kernel_info->width=order_; + kernel_info->height=order_; + kernel_info->values=(double *) color_matrix_; + newImage=ColorMatrixImage(constImage(),kernel_info,exceptionInfo); + kernel_info->values=(double *) NULL; + kernel_info=DestroyKernelInfo(kernel_info); + replaceImage(newImage); + ThrowImageException; + } +} + +bool Magick::Image::compare(const Image &reference_) +{ + bool + status; + + Image + ref=reference_; + + modifyImage(); + ref.modifyImage(); + status=static_cast(IsImagesEqual(image(),ref.constImage())); + throwImageException(); + return(status); +} + +double Magick::Image::compare(const Image &reference_,const MetricType metric_) +{ + double + distortion=0.0; + + GetPPException; + GetImageDistortion(image(),reference_.constImage(),metric_,&distortion, + exceptionInfo); + ThrowImageException; + return(distortion); +} + +double Magick::Image::compareChannel(const ChannelType channel_, + const Image &reference_,const MetricType metric_) +{ + double + distortion=0.0; + + GetPPException; + GetImageChannelDistortion(image(),reference_.constImage(),channel_,metric_, + &distortion,exceptionInfo); + ThrowImageException; + return(distortion); +} + +Magick::Image Magick::Image::compare(const Image &reference_, + const MetricType metric_,double *distortion) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=CompareImages(image(),reference_.constImage(),metric_,distortion, + exceptionInfo); + ThrowImageException; + if (newImage == (MagickCore::Image *) NULL) + return(Magick::Image()); + else + return(Magick::Image(newImage)); +} + +Magick::Image Magick::Image::compareChannel(const ChannelType channel_, + const Image &reference_,const MetricType metric_,double *distortion) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=CompareImageChannels(image(),reference_.constImage(),channel_, + metric_,distortion,exceptionInfo); + ThrowImageException; + if (newImage == (MagickCore::Image *) NULL) + return(Magick::Image()); + else + return(Magick::Image(newImage)); +} + +void Magick::Image::composite(const Image &compositeImage_, + const Geometry &offset_,const CompositeOperator compose_) +{ + size_t + height=rows(), + width=columns(); + + ssize_t + x=offset_.xOff(), + y=offset_.yOff(); + + modifyImage(); + ParseMetaGeometry(static_cast(offset_).c_str(),&x,&y,&width, + &height); + + CompositeImage(image(),compose_,compositeImage_.constImage(),x,y); + throwImageException(); +} + +void Magick::Image::composite(const Image &compositeImage_, + const GravityType gravity_,const CompositeOperator compose_) +{ + RectangleInfo + geometry; + + modifyImage(); + + SetGeometry(compositeImage_.constImage(),&geometry); + GravityAdjustGeometry(columns(),rows(),gravity_,&geometry); + + CompositeImage(image(),compose_,compositeImage_.constImage(),geometry.x, + geometry.y); + throwImageException(); +} + +void Magick::Image::composite(const Image &compositeImage_, + const ssize_t xOffset_,const ssize_t yOffset_, + const CompositeOperator compose_) +{ + // Image supplied as compositeImage is composited with current image and + // results in updating current image. + modifyImage(); + + CompositeImage(image(),compose_,compositeImage_.constImage(),xOffset_, + yOffset_); + throwImageException(); +} + +void Magick::Image::connectedComponents(const size_t connectivity_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=ConnectedComponentsImage(constImage(),connectivity_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::contrast(const size_t sharpen_) +{ + modifyImage(); + ContrastImage(image(),(MagickBooleanType) sharpen_); + throwImageException(); +} + +void Magick::Image::contrastStretch(const double black_point_, + const double white_point_) +{ + modifyImage(); + ContrastStretchImageChannel(image(),DefaultChannels,black_point_, + white_point_); + throwImageException(); +} + +void Magick::Image::contrastStretchChannel(const ChannelType channel_, + const double black_point_,const double white_point_) +{ + modifyImage(); + ContrastStretchImageChannel(image(),channel_,black_point_,white_point_); + throwImageException(); +} + +void Magick::Image::convolve(const size_t order_,const double *kernel_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=ConvolveImage(constImage(),order_,kernel_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::copyPixels(const Image &source_,const Geometry &geometry_, + const Offset &offset_) +{ + const OffsetInfo + offset=offset_; + + const RectangleInfo + geometry=geometry_; + + GetPPException; + (void) CopyImagePixels(image(),source_.constImage(),&geometry,&offset, + exceptionInfo); + ThrowImageException; +} + + +void Magick::Image::crop(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + RectangleInfo + cropInfo=geometry_; + + GetPPException; + newImage=CropImage(constImage(),&cropInfo,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::cycleColormap(const ssize_t amount_) +{ + modifyImage(); + CycleColormapImage(image(),amount_); + throwImageException(); +} + +void Magick::Image::decipher(const std::string &passphrase_) +{ + modifyImage(); + GetPPException; + DecipherImage(image(),passphrase_.c_str(),exceptionInfo); + ThrowImageException; +} + +void Magick::Image::defineSet(const std::string &magick_, + const std::string &key_,bool flag_) +{ + std::string + definition; + + modifyImage(); + definition=magick_ + ":" + key_; + if (flag_) + (void) SetImageOption(imageInfo(),definition.c_str(),""); + else + DeleteImageOption(imageInfo(),definition.c_str()); +} + +bool Magick::Image::defineSet(const std::string &magick_, + const std::string &key_) const +{ + const char + *option; + + std::string + key; + + key=magick_ + ":" + key_; + option=GetImageOption(constImageInfo(),key.c_str()); + if (option) + return(true); + return(false); +} + +void Magick::Image::defineValue(const std::string &magick_, + const std::string &key_,const std::string &value_) +{ + std::string + format; + + modifyImage(); + format=magick_ + ":" + key_; + (void) SetImageOption(imageInfo(),format.c_str(),value_.c_str()); +} + +std::string Magick::Image::defineValue(const std::string &magick_, + const std::string &key_) const +{ + const char + *option; + + std::string + definition; + + definition=magick_ + ":" + key_; + option=GetImageOption(constImageInfo(),definition.c_str()); + if (option) + return(std::string(option)); + return(std::string()); +} + +void Magick::Image::deskew(const double threshold_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=DeskewImage(constImage(),threshold_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::despeckle(void) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=DespeckleImage(constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +Magick::ImageType Magick::Image::determineType(void) const +{ + ImageType + image_type; + + GetPPException; + image_type=GetImageType(constImage(),exceptionInfo); + ThrowImageException; + return(image_type); +} + +void Magick::Image::display(void) +{ + DisplayImages(imageInfo(),image()); +} + +void Magick::Image::distort(const DistortImageMethod method_, + const size_t number_arguments_,const double *arguments_,const bool bestfit_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=DistortImage(constImage(),method_,number_arguments_,arguments_, + bestfit_ == true ? MagickTrue : MagickFalse,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::draw(const Magick::Drawable &drawable_) +{ + DrawingWand + *wand; + + modifyImage(); + + wand=AcquireDrawingWand(options()->drawInfo(),image()); + + if(wand) + { + drawable_.operator()(wand); + + if (constImage()->exception.severity == UndefinedException) + DrawRender(wand); + + wand=DestroyDrawingWand(wand); + } + + throwImageException(); +} + +void Magick::Image::draw(const std::list &drawable_) +{ + DrawingWand + *wand; + + modifyImage(); + + wand=AcquireDrawingWand(options()->drawInfo(),image()); + + if(wand) + { + for (std::list::const_iterator p = drawable_.begin(); + p != drawable_.end(); p++) + { + p->operator()(wand); + if (constImage()->exception.severity != UndefinedException) + break; + } + + if (constImage()->exception.severity == UndefinedException) + DrawRender(wand); + + wand=DestroyDrawingWand(wand); + } + + throwImageException(); +} + +void Magick::Image::edge(const double radius_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=EdgeImage(constImage(),radius_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::emboss(const double radius_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=EmbossImage(constImage(),radius_,sigma_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::encipher(const std::string &passphrase_) +{ + modifyImage(); + GetPPException; + EncipherImage(image(),passphrase_.c_str(),exceptionInfo); + ThrowImageException; +} + +void Magick::Image::enhance(void) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=EnhanceImage(constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::equalize(void) +{ + modifyImage(); + EqualizeImage(image()); + throwImageException(); +} + +void Magick::Image::erase(void) +{ + modifyImage(); + (void) SetImageBackgroundColor(image()); + throwImageException(); +} + +void Magick::Image::extent(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + RectangleInfo + extentInfo; + + modifyImage(); + + GetPPException; + extentInfo=geometry_; + extentInfo.x=geometry_.xOff(); + extentInfo.y=geometry_.yOff(); + newImage=ExtentImage(constImage(),&extentInfo,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::extent(const Geometry &geometry_, + const Color &backgroundColor_) +{ + backgroundColor(backgroundColor_); + extent(geometry_); +} + +void Magick::Image::extent(const Geometry &geometry_, + const Color &backgroundColor_,const GravityType gravity_) +{ + image()->gravity=gravity_; + backgroundColor(backgroundColor_); + extent(geometry_,gravity_); +} + +void Magick::Image::extent(const Geometry &geometry_, + const GravityType gravity_) +{ + RectangleInfo + geometry; + + SetGeometry(image(),&geometry); + geometry.width=geometry_.width(); + geometry.height=geometry_.height(); + GravityAdjustGeometry(image()->columns,image()->rows,gravity_,&geometry); + extent(geometry); +} + +void Magick::Image::flip(void) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=FlipImage(constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::floodFillColor(const Geometry &point_, + const Magick::Color &fillColor_) +{ + floodFillColor(point_.xOff(),point_.yOff(),fillColor_,false); +} + +void Magick::Image::floodFillColor(const Geometry &point_, + const Magick::Color &fillColor_,const bool invert_) +{ + floodFillColor(point_.xOff(),point_.yOff(),fillColor_,invert_); +} + +void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_, + const Magick::Color &fillColor_) +{ + floodFillColor(x_,y_,fillColor_,false); +} + +void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_, + const Magick::Color &fillColor_,const bool invert_) +{ + PixelPacket + pixel; + + modifyImage(); + + pixel=pixelColor(x_,y_); + floodFill(x_,y_,(Magick::Image *)NULL,fillColor_,&pixel,invert_); +} + +void Magick::Image::floodFillColor(const Geometry &point_, + const Magick::Color &fillColor_,const Magick::Color &borderColor_) +{ + floodFillColor(point_.xOff(),point_.yOff(),fillColor_,borderColor_,false); +} + +void Magick::Image::floodFillColor(const Geometry &point_, + const Magick::Color &fillColor_,const Magick::Color &borderColor_, + const bool invert_) +{ + floodFillColor(point_.xOff(),point_.yOff(),fillColor_,borderColor_,invert_); +} + +void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_, + const Magick::Color &fillColor_,const Magick::Color &borderColor_) +{ + floodFillColor(x_,y_,fillColor_,borderColor_,false); +} + +void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_, + const Magick::Color &fillColor_,const Magick::Color &borderColor_, + const bool invert_) +{ + PixelPacket + pixel; + + modifyImage(); + + pixel=static_cast(borderColor_); + floodFill(x_,y_,(Magick::Image *)NULL,fillColor_,&pixel,invert_); +} + +void Magick::Image::floodFillOpacity(const ssize_t x_,const ssize_t y_, + const unsigned int opacity_,const bool invert_) +{ + MagickPixelPacket + target; + + PixelPacket + pixel; + + modifyImage(); + + GetMagickPixelPacket(constImage(),&target); + pixel=static_cast(pixelColor(x_,y_)); + target.red=pixel.red; + target.green=pixel.green; + target.blue=pixel.blue; + target.opacity=opacity_; + (void) FloodfillPaintImage(image(),OpacityChannel,options()->drawInfo(), + &target,x_,y_,(MagickBooleanType)invert_); + throwImageException(); +} + +void Magick::Image::floodFillOpacity(const ssize_t x_,const ssize_t y_, + const unsigned int opacity_,const PaintMethod method_) +{ + floodFillOpacity(x_,y_,opacity_,method_ == FloodfillMethod ? false : true); +} + +void Magick::Image::floodFillOpacity(const ::ssize_t x_,const ::ssize_t y_, + const unsigned int opacity_,const Color &target_,const bool invert_) +{ + MagickPixelPacket + target; + + PixelPacket + pixel; + + modifyImage(); + + GetMagickPixelPacket(constImage(),&target); + pixel=static_cast(target_); + target.red=pixel.red; + target.green=pixel.green; + target.blue=pixel.blue; + target.opacity=opacity_; + (void) FloodfillPaintImage(image(),OpacityChannel,options()->drawInfo(), + &target,x_,y_,(MagickBooleanType)invert_); + throwImageException(); +} + +void Magick::Image::floodFillTexture(const Magick::Geometry &point_, + const Magick::Image &texture_) +{ + floodFillTexture(point_.xOff(),point_.yOff(),texture_,false); +} + +void Magick::Image::floodFillTexture(const Magick::Geometry &point_, + const Magick::Image &texture_,const bool invert_) +{ + floodFillTexture(point_.xOff(),point_.yOff(),texture_,invert_); +} + +void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_, + const Magick::Image &texture_) +{ + floodFillTexture(x_,y_,texture_,false); +} + +void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_, + const Magick::Image &texture_,const bool invert_) +{ + PixelPacket + pixel; + + modifyImage(); + + pixel=static_cast(pixelColor(x_,y_)); + floodFill(x_,y_,&texture_,Magick::Color(),&pixel,invert_); +} + +void Magick::Image::floodFillTexture(const Magick::Geometry &point_, + const Magick::Image &texture_,const Magick::Color &borderColor_) +{ + floodFillTexture(point_.xOff(),point_.yOff(),texture_,borderColor_,false); +} + +void Magick::Image::floodFillTexture(const Magick::Geometry &point_, + const Magick::Image &texture_,const Magick::Color &borderColor_, + const bool invert_) +{ + floodFillTexture(point_.xOff(),point_.yOff(),texture_,borderColor_,invert_); +} + +void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_, + const Magick::Image &texture_,const Magick::Color &borderColor_) +{ + floodFillTexture(x_,y_,texture_,borderColor_,false); +} + +void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_, + const Magick::Image &texture_,const Magick::Color &borderColor_, + const bool invert_) +{ + PixelPacket + pixel; + + modifyImage(); + + pixel=static_cast(borderColor_); + floodFill(x_,y_,&texture_,Magick::Color(),&pixel,invert_); +} + +void Magick::Image::flop(void) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=FlopImage(constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::fontTypeMetrics(const std::string &text_, + TypeMetric *metrics) +{ + DrawInfo + *drawInfo; + + drawInfo=options()->drawInfo(); + drawInfo->text=const_cast(text_.c_str()); + if (GetTypeMetrics(image(),drawInfo,&(metrics->_typeMetric)) == MagickFalse) + throwImageException(); + drawInfo->text=0; +} + +void Magick::Image::fontTypeMetricsMultiline(const std::string &text_, + TypeMetric *metrics) +{ + DrawInfo + *drawInfo; + + drawInfo=options()->drawInfo(); + drawInfo->text=const_cast(text_.c_str()); + GetMultilineTypeMetrics(image(),drawInfo,&(metrics->_typeMetric)); + drawInfo->text=0; +} + +void Magick::Image::frame(const Geometry &geometry_) +{ + FrameInfo + info; + + MagickCore::Image + *newImage; + + info.x=static_cast(geometry_.width()); + info.y=static_cast(geometry_.height()); + info.width=columns() + ( static_cast(info.x) << 1 ); + info.height=rows() + ( static_cast(info.y) << 1 ); + info.outer_bevel=geometry_.xOff(); + info.inner_bevel=geometry_.yOff(); + + GetPPException; + newImage=FrameImage(constImage(),&info,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::frame(const size_t width_,const size_t height_, + const ssize_t innerBevel_,const ssize_t outerBevel_) +{ + FrameInfo + info; + + MagickCore::Image + *newImage; + + info.x=static_cast(width_); + info.y=static_cast(height_); + info.width=columns() + ( static_cast(info.x) << 1 ); + info.height=rows() + ( static_cast(info.y) << 1 ); + info.outer_bevel=static_cast(outerBevel_); + info.inner_bevel=static_cast(innerBevel_); + + GetPPException; + newImage=FrameImage(constImage(),&info,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::fx(const std::string expression) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=FxImageChannel(constImage(),DefaultChannels,expression.c_str(), + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::fx(const std::string expression, + const Magick::ChannelType channel) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=FxImageChannel(constImage(),channel,expression.c_str(), + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::gamma(const double gamma_) +{ + char + gamma[MaxTextExtent + 1]; + + FormatLocaleString(gamma,MaxTextExtent,"%3.6f",gamma_); + + modifyImage(); + GammaImage(image(),gamma); +} + +void Magick::Image::gamma(const double gammaRed_,const double gammaGreen_, + const double gammaBlue_) +{ + char + gamma[MaxTextExtent + 1]; + + FormatLocaleString(gamma,MaxTextExtent,"%3.6f/%3.6f/%3.6f/",gammaRed_, + gammaGreen_,gammaBlue_); + + modifyImage(); + GammaImage(image(),gamma); + throwImageException(); +} + +void Magick::Image::gaussianBlur(const double width_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=GaussianBlurImage(constImage(),width_,sigma_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::gaussianBlurChannel(const ChannelType channel_, + const double width_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=GaussianBlurImageChannel(constImage(),channel_,width_,sigma_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +const Magick::IndexPacket* Magick::Image::getConstIndexes(void) const +{ + const Magick::IndexPacket + *result; + + result=GetVirtualIndexQueue(constImage()); + if (!result) + throwImageException(); + + return(result); +} + +const Magick::PixelPacket* Magick::Image::getConstPixels(const ssize_t x_, + const ssize_t y_,const size_t columns_,const size_t rows_) const +{ + const PixelPacket + *result; + + GetPPException; + result=GetVirtualPixels(constImage(),x_,y_,columns_,rows_,exceptionInfo); + ThrowImageException; + return(result); +} + +Magick::IndexPacket *Magick::Image::getIndexes(void) +{ + Magick::IndexPacket + *result; + + result=GetAuthenticIndexQueue(image()); + + if(!result) + throwImageException(); + + return(result); +} + +Magick::PixelPacket *Magick::Image::getPixels(const ssize_t x_, + const ssize_t y_,const size_t columns_,const size_t rows_) +{ + PixelPacket + *result; + + modifyImage(); + GetPPException; + result=GetAuthenticPixels(image(),x_,y_,columns_,rows_,exceptionInfo); + ThrowImageException; + return(result); +} + +void Magick::Image::grayscale(const PixelIntensityMethod method_) +{ + modifyImage(); + (void) GrayscaleImage(image(),method_); + throwImageException(); +} + +void Magick::Image::haldClut(const Image &clutImage_) +{ + modifyImage(); + (void) HaldClutImage(image(),clutImage_.constImage()); + throwImageException(); +} + +void Magick::Image::houghLine(const size_t width_,const size_t height_, + const size_t threshold_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=HoughLineImage(constImage(),width_,height_,threshold_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::implode(const double factor_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=ImplodeImage(constImage(),factor_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::inverseFourierTransform(const Image &phase_) +{ + inverseFourierTransform(phase_,true); +} + +void Magick::Image::inverseFourierTransform(const Image &phase_, + const bool magnitude_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=InverseFourierTransformImage(constImage(),phase_.constImage(), + magnitude_ == true ? MagickTrue : MagickFalse,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::kuwahara(const double radius_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=KuwaharaImage(constImage(),radius_,sigma_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::kuwaharaChannel(const ChannelType channel_, + const double radius_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=KuwaharaImageChannel(constImage(),channel_,radius_,sigma_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::level(const double black_point,const double white_point, + const double gamma) +{ + char + levels[MaxTextExtent]; + + modifyImage(); + FormatLocaleString(levels,MaxTextExtent,"%g,%g,%g",black_point,white_point, + gamma); + (void) LevelImage(image(),levels); + throwImageException(); +} + +void Magick::Image::levelChannel(const Magick::ChannelType channel, + const double black_point,const double white_point,const double gamma) +{ + modifyImage(); + (void) LevelImageChannel(image(),channel,black_point,white_point,gamma); + throwImageException(); +} + +void Magick::Image::levelColors(const Color &blackColor_, + const Color &whiteColor_,const bool invert_) +{ + MagickPixelPacket + black, + white; + + PixelPacket + pixel; + + modifyImage(); + + GetMagickPixelPacket(image(),&black); + pixel=static_cast(blackColor_); + black.red=pixel.red; + black.green=pixel.green; + black.blue=pixel.blue; + black.opacity=pixel.opacity; + + GetMagickPixelPacket(image(),&white); + pixel=static_cast(whiteColor_); + white.red=pixel.red; + white.green=pixel.green; + white.blue=pixel.blue; + white.opacity=pixel.opacity; + + (void) LevelColorsImage(image(),&black,&white, + invert_ == true ? MagickTrue : MagickFalse); + throwImageException(); +} + +void Magick::Image::levelColorsChannel(const ChannelType channel_, + const Color &blackColor_,const Color &whiteColor_,const bool invert_) +{ + MagickPixelPacket + black, + white; + + PixelPacket + pixel; + + modifyImage(); + + GetMagickPixelPacket(image(),&black); + pixel=static_cast(blackColor_); + black.red=pixel.red; + black.green=pixel.green; + black.blue=pixel.blue; + black.opacity=pixel.opacity; + + GetMagickPixelPacket(image(),&white); + pixel=static_cast(whiteColor_); + white.red=pixel.red; + white.green=pixel.green; + white.blue=pixel.blue; + white.opacity=pixel.opacity; + + (void) LevelColorsImageChannel(image(),channel_,&black,&white, + invert_ == true ? MagickTrue : MagickFalse); + throwImageException(); +} + +void Magick::Image::levelize(const double blackPoint_,const double whitePoint_, + const double gamma_) +{ + modifyImage(); + (void) LevelizeImage(image(),blackPoint_,whitePoint_,gamma_); + throwImageException(); +} + +void Magick::Image::levelizeChannel(const ChannelType channel_, + const double blackPoint_,const double whitePoint_,const double gamma_) +{ + modifyImage(); + (void) LevelizeImageChannel(image(),channel_,blackPoint_,whitePoint_,gamma_); + throwImageException(); +} + +void Magick::Image::linearStretch(const double blackPoint_, + const double whitePoint_) +{ + modifyImage(); + LinearStretchImage(image(),blackPoint_,whitePoint_); + throwImageException(); +} + +void Magick::Image::liquidRescale(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + size_t + height=rows(), + width=columns(); + + ssize_t + x=0, + y=0; + + ParseMetaGeometry(static_cast(geometry_).c_str(),&x,&y,&width, + &height); + + GetPPException; + newImage=LiquidRescaleImage(constImage(),width,height,x,y,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::localContrast(const double radius_,const double strength_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=LocalContrastImage(constImage(),radius_,strength_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::magnify(void) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=MagnifyImage(constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::map(const Image &mapImage_,const bool dither_) +{ + modifyImage(); + options()->quantizeDither(dither_); + RemapImage(options()->quantizeInfo(),image(),mapImage_.constImage()); + throwImageException(); +} + +void Magick::Image::matteFloodfill(const Color &target_, + const unsigned int opacity_,const ssize_t x_,const ssize_t y_, + const Magick::PaintMethod method_) +{ + floodFillOpacity(x_,y_,opacity_,target_, + method_ == FloodfillMethod ? false : true); +} + +void Magick::Image::medianFilter(const double radius_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=StatisticImage(constImage(),MedianStatistic,(size_t) radius_, + (size_t) radius_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::mergeLayers(const ImageLayerMethod layerMethod_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=MergeImageLayers(image(),layerMethod_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::minify(void) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=MinifyImage(constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::modulate(const double brightness_,const double saturation_, + const double hue_) +{ + char + modulate[MaxTextExtent + 1]; + + FormatLocaleString(modulate,MaxTextExtent,"%3.6f,%3.6f,%3.6f",brightness_, + saturation_,hue_); + + modifyImage(); + ModulateImage(image(),modulate); + throwImageException(); +} + +Magick::ImageMoments Magick::Image::moments(void) const +{ + return(ImageMoments(*this)); +} + +void Magick::Image::morphology(const MorphologyMethod method_, + const std::string kernel_,const ssize_t iterations_) +{ + KernelInfo + *kernel; + + MagickCore::Image + *newImage; + + kernel=AcquireKernelInfo(kernel_.c_str()); + if (kernel == (KernelInfo *)NULL) + throwExceptionExplicit(OptionError,"Unable to parse kernel."); + + GetPPException; + newImage=MorphologyImage(constImage(),method_,iterations_,kernel, + exceptionInfo); + replaceImage(newImage); + kernel=DestroyKernelInfo(kernel); + ThrowImageException; +} + +void Magick::Image::morphology(const MorphologyMethod method_, + const KernelInfoType kernel_,const std::string arguments_, + const ssize_t iterations_) +{ + const char + *option; + + std::string + kernel; + + option=CommandOptionToMnemonic(MagickKernelOptions,kernel_); + if (option == (const char *)NULL) + { + throwExceptionExplicit(OptionError,"Unable to determine kernel type."); + return; + } + + kernel=std::string(option); + if (!arguments_.empty()) + kernel+=":"+arguments_; + + morphology(method_,kernel,iterations_); +} + +void Magick::Image::morphologyChannel(const ChannelType channel_, + const MorphologyMethod method_,const std::string kernel_, + const ssize_t iterations_) +{ + KernelInfo + *kernel; + + MagickCore::Image + *newImage; + + kernel=AcquireKernelInfo(kernel_.c_str()); + if (kernel == (KernelInfo *)NULL) + { + throwExceptionExplicit(OptionError,"Unable to parse kernel."); + return; + } + + GetPPException; + newImage=MorphologyImageChannel(constImage(),channel_,method_,iterations_, + kernel,exceptionInfo); + replaceImage(newImage); + kernel=DestroyKernelInfo(kernel); + ThrowImageException; +} + +void Magick::Image::morphologyChannel(const ChannelType channel_, + const MorphologyMethod method_,const KernelInfoType kernel_, + const std::string arguments_,const ssize_t iterations_) +{ + const char + *option; + + std::string + kernel; + + option=CommandOptionToMnemonic(MagickKernelOptions,kernel_); + if (option == (const char *)NULL) + { + throwExceptionExplicit(OptionError,"Unable to determine kernel type."); + return; + } + + kernel=std::string(option); + if (!arguments_.empty()) + kernel+=":"+arguments_; + + morphologyChannel(channel_,method_,kernel,iterations_); +} + +void Magick::Image::motionBlur(const double radius_,const double sigma_, + const double angle_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=MotionBlurImage(constImage(),radius_,sigma_,angle_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::negate(const bool grayscale_) +{ + modifyImage(); + NegateImage(image(),(MagickBooleanType) grayscale_); + throwImageException(); +} + +void Magick::Image::negateChannel(const ChannelType channel_, + const bool grayscale_) +{ + modifyImage(); + NegateImageChannel(image(),channel_,(MagickBooleanType) grayscale_); + throwImageException(); +} + +void Magick::Image::normalize(void) +{ + modifyImage(); + NormalizeImage(image()); + throwImageException(); +} + +void Magick::Image::oilPaint(const double radius_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=OilPaintImage(constImage(),radius_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::opacity(const unsigned int opacity_) +{ + modifyImage(); + SetImageOpacity(image(),opacity_); +} +void Magick::Image::opaque(const Color &opaqueColor_,const Color &penColor_, + const bool invert_) +{ + MagickPixelPacket + opaque, + pen; + + std::string + opaqueColor, + penColor; + + if (!opaqueColor_.isValid()) + throwExceptionExplicit(OptionError,"Opaque color argument is invalid"); + + if (!penColor_.isValid()) + throwExceptionExplicit(OptionError,"Pen color argument is invalid"); + + opaqueColor=opaqueColor_; + penColor=penColor_; + + (void) QueryMagickColor(opaqueColor.c_str(),&opaque,&image()->exception); + (void) QueryMagickColor(penColor.c_str(),&pen,&image()->exception); + modifyImage(); + OpaquePaintImage(image(),&opaque,&pen,invert_ ? MagickTrue : MagickFalse); + throwImageException(); +} + +void Magick::Image::orderedDither(std::string thresholdMap_) +{ + modifyImage(); + GetPPException; + (void) OrderedPosterizeImage(image(),thresholdMap_.c_str(),exceptionInfo); + ThrowImageException; +} + +void Magick::Image::orderedDitherChannel(const ChannelType channel_, + std::string thresholdMap_) +{ + modifyImage(); + GetPPException; + (void) OrderedPosterizeImageChannel(image(),channel_,thresholdMap_.c_str(), + exceptionInfo); + ThrowImageException; +} + +void Magick::Image::perceptible(const double epsilon_) +{ + modifyImage(); + PerceptibleImage(image(),epsilon_); + throwImageException(); +} + +void Magick::Image::perceptibleChannel(const ChannelType channel_, + const double epsilon_) +{ + modifyImage(); + PerceptibleImageChannel(image(),channel_,epsilon_); + throwImageException(); +} + +void Magick::Image::ping(const Blob& blob_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=PingBlob(imageInfo(),blob_.data(),blob_.length(),exceptionInfo); + read(newImage,exceptionInfo); +} + +void Magick::Image::ping(const std::string &imageSpec_) +{ + MagickCore::Image + *newImage; + + GetPPException; + options()->fileName(imageSpec_); + newImage=PingImage(imageInfo(),exceptionInfo); + read(newImage,exceptionInfo); +} + +void Magick::Image::pixelColor(const ssize_t x_,const ssize_t y_, + const Color &color_) +{ + // Test arguments to ensure they are within the image. + if (y_ > (ssize_t) rows() || x_ > (ssize_t) columns()) + throwExceptionExplicit(OptionError,"Access outside of image boundary"); + + modifyImage(); + + // Set image to DirectClass + classType(DirectClass); + + // Get pixel view + Pixels pixels(*this); + // Set pixel value + *(pixels.get(x_,y_,1,1))=color_; + // Tell ImageMagick that pixels have been updated + pixels.sync(); +} + +Magick::Color Magick::Image::pixelColor(const ssize_t x_, + const ssize_t y_) const +{ + ClassType + storage_class; + + storage_class=classType(); + if (storage_class == DirectClass) + { + const PixelPacket + *pixel; + + pixel=getConstPixels(x_,y_,1,1); + if (pixel) + return(Color(*pixel)); + } + else if (storage_class == PseudoClass) + { + const IndexPacket + *indexes; + + indexes=getConstIndexes(); + if(indexes) + return(colorMap((size_t) *indexes)); + } + + return(Color()); // invalid +} + +void Magick::Image::polaroid(const std::string &caption_,const double angle_) +{ + MagickCore::Image + *newImage; + + GetPPException; + (void) SetImageProperty(image(),"Caption",caption_.c_str()); + newImage=PolaroidImage(constImage(),options()->drawInfo(),angle_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::posterize(const size_t levels_,const bool dither_) +{ + modifyImage(); + PosterizeImage(image(),levels_,(MagickBooleanType) dither_); + throwImageException(); +} + +void Magick::Image::posterizeChannel(const ChannelType channel_, + const size_t levels_,const bool dither_) +{ + modifyImage(); + PosterizeImageChannel(image(),channel_,levels_, + (MagickBooleanType) dither_); + throwImageException(); +} + +void Magick::Image::process(std::string name_,const ssize_t argc, + const char **argv) +{ + size_t + status; + + modifyImage(); + + status=InvokeDynamicImageFilter(name_.c_str(),&image(),argc, argv, + &image()->exception); + + if (status == false) + throwImageException(); +} + +void Magick::Image::profile(const std::string name_, + const Magick::Blob &profile_) +{ + ssize_t + result; + + modifyImage(); + result=ProfileImage(image(),name_.c_str(),(unsigned char *)profile_.data(), + profile_.length(),MagickTrue); + + if (!result) + throwImageException(); +} + +Magick::Blob Magick::Image::profile(const std::string name_) const +{ + const StringInfo + *profile; + + profile=GetImageProfile(constImage(),name_.c_str()); + + if (profile == (StringInfo *) NULL) + return(Blob()); + return(Blob((void*) GetStringInfoDatum(profile),GetStringInfoLength( + profile))); +} + +void Magick::Image::quantize(const bool measureError_) +{ + modifyImage(); + + if (measureError_) + options()->quantizeInfo()->measure_error=MagickTrue; + else + options()->quantizeInfo()->measure_error=MagickFalse; + + QuantizeImage(options()->quantizeInfo(),image()); + + throwImageException(); +} + +void Magick::Image::quantumOperator(const ChannelType channel_, + const MagickEvaluateOperator operator_,double rvalue_) +{ + GetPPException; + EvaluateImageChannel(image(),channel_,operator_,rvalue_,exceptionInfo); + ThrowImageException; +} + +void Magick::Image::quantumOperator(const ChannelType channel_, + const MagickFunction function_,const size_t number_parameters_, + const double *parameters_) +{ + GetPPException; + FunctionImageChannel(image(),channel_,function_,number_parameters_, + parameters_,exceptionInfo); + ThrowImageException; +} + +void Magick::Image::quantumOperator(const ssize_t x_,const ssize_t y_, + const size_t columns_,const size_t rows_,const ChannelType channel_, + const MagickEvaluateOperator operator_,const double rvalue_) +{ + MagickCore::Image + *cropImage; + + RectangleInfo + geometry; + + GetPPException; + geometry.width=columns_; + geometry.height=rows_; + geometry.x=x_; + geometry.y=y_; + cropImage=CropImage(image(),&geometry,exceptionInfo); + EvaluateImageChannel(cropImage,channel_,operator_,rvalue_,exceptionInfo); + (void) CompositeImage(image(),image()->matte != MagickFalse ? + OverCompositeOp : CopyCompositeOp,cropImage,geometry.x, geometry.y); + cropImage=DestroyImageList(cropImage); + ThrowImageException; +} + +void Magick::Image::raise(const Geometry &geometry_,const bool raisedFlag_) +{ + RectangleInfo + raiseInfo; + + raiseInfo=geometry_; + modifyImage(); + RaiseImage(image(),&raiseInfo,raisedFlag_ == true ? + MagickTrue : MagickFalse); + throwImageException(); +} + +void Magick::Image::randomThreshold( const Geometry &thresholds_ ) +{ + GetPPException; + modifyImage(); + (void) RandomThresholdImage(image(),static_cast( + thresholds_).c_str(),exceptionInfo); + ThrowImageException; +} + +void Magick::Image::randomThresholdChannel(const Geometry &thresholds_, + const ChannelType channel_) +{ + GetPPException; + modifyImage(); + (void) RandomThresholdImageChannel(image(),channel_,static_cast( + thresholds_).c_str(),exceptionInfo); + ThrowImageException; +} + +void Magick::Image::read(const Blob &blob_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=BlobToImage(imageInfo(),static_cast(blob_.data()), + blob_.length(),exceptionInfo); + read(newImage,exceptionInfo); +} + +void Magick::Image::read(const Blob &blob_,const Geometry &size_) +{ + size(size_); + read(blob_); +} + +void Magick::Image::read(const Blob &blob_,const Geometry &size_, + const size_t depth_) +{ + size(size_); + depth(depth_); + read(blob_); +} + +void Magick::Image::read(const Blob &blob_,const Geometry &size_, + const size_t depth_,const std::string &magick_) +{ + size(size_); + depth(depth_); + magick(magick_); + fileName(magick_ + ':'); + read(blob_); +} + +void Magick::Image::read(const Blob &blob_,const Geometry &size_, + const std::string &magick_) +{ + size(size_); + magick(magick_); + fileName(magick_ + ':'); + read(blob_); +} + +void Magick::Image::read(const Geometry &size_,const std::string &imageSpec_) +{ + size(size_); + read(imageSpec_); +} + +void Magick::Image::read(const size_t width_,const size_t height_, + const std::string &map_,const StorageType type_,const void *pixels_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=ConstituteImage(width_,height_,map_.c_str(),type_,pixels_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; + if (newImage) + throwException(&newImage->exception,quiet()); +} + +void Magick::Image::read(const std::string &imageSpec_) +{ + MagickCore::Image + *newImage; + + options()->fileName(imageSpec_); + + GetPPException; + newImage=ReadImage(imageInfo(),exceptionInfo); + read(newImage,exceptionInfo); +} + +void Magick::Image::readPixels(const Magick::QuantumType quantum_, + const unsigned char *source_) +{ + QuantumInfo + *quantum_info; + + GetPPException; + quantum_info=AcquireQuantumInfo(imageInfo(),image()); + ImportQuantumPixels(image(),(MagickCore::CacheView *) NULL,quantum_info, + quantum_,source_,exceptionInfo); + quantum_info=DestroyQuantumInfo(quantum_info); + ThrowImageException; +} + +void Magick::Image::reduceNoise(const double order_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=StatisticImage(constImage(),NonpeakStatistic,(size_t) order_, + (size_t) order_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::repage() +{ + modifyImage(); + options()->page(Geometry()); + image()->page.width = 0; + image()->page.height = 0; + image()->page.x = 0; + image()->page.y = 0; +} + +void Magick::Image::resample(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + size_t + width=columns(), + height=rows(); + + ssize_t + x=0, + y=0; + + ParseMetaGeometry(static_cast(geometry_).c_str(),&x, &y,&width, + &height); + + GetPPException; + newImage=ResampleImage(constImage(),width,height,image()->filter,1.0, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::resize(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + size_t + width=columns(), + height=rows(); + + ssize_t + x=0, + y=0; + + ParseMetaGeometry(static_cast(geometry_).c_str(),&x, &y,&width, + &height); + + GetPPException; + newImage=ResizeImage(constImage(),width,height,image()->filter,1.0, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::roll(const Geometry &roll_) +{ + MagickCore::Image + *newImage; + + ssize_t + xOff=roll_.xOff(), + yOff=roll_.yOff(); + + if (roll_.xNegative()) + xOff=0-xOff; + if (roll_.yNegative()) + yOff=0-yOff; + + GetPPException; + newImage=RollImage(constImage(),xOff,yOff,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::roll(const size_t columns_,const size_t rows_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=RollImage(constImage(),static_cast(columns_), + static_cast(rows_),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::rotate(const double degrees_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=RotateImage(constImage(),degrees_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::rotationalBlur(const double angle_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=RotationalBlurImage(constImage(),angle_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::rotationalBlurChannel(const ChannelType channel_, + const double angle_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=RotationalBlurImageChannel(constImage(),channel_,angle_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::sample(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + size_t + height=rows(), + width=columns(); + + ssize_t + x=0, + y=0; + + ParseMetaGeometry(static_cast(geometry_).c_str(),&x,&y,&width, + &height); + + GetPPException; + newImage=SampleImage(constImage(),width,height,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::scale(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + size_t + height=rows(), + width=columns(); + + ssize_t + x=0, + y=0; + + ParseMetaGeometry(static_cast(geometry_).c_str(),&x,&y,&width, + &height); + + GetPPException; + newImage=ScaleImage(constImage(),width,height,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::segment(const double clusterThreshold_, + const double smoothingThreshold_) +{ + modifyImage(); + SegmentImage(image(),options()->quantizeColorSpace(), + (MagickBooleanType) options()->verbose(),clusterThreshold_, + smoothingThreshold_); + throwImageException(); + SyncImage(image()); + throwImageException(); +} + +void Magick::Image::selectiveBlur(const double radius_,const double sigma_, + const double threshold_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=SelectiveBlurImage(constImage(),radius_,sigma_,threshold_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::selectiveBlurChannel(const ChannelType channel_, + const double radius_,const double sigma_,const double threshold_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=SelectiveBlurImageChannel(constImage(),channel_,radius_,sigma_, + threshold_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +Magick::Image Magick::Image::separate(const ChannelType channel_) const +{ + MagickCore::Image + *image; + + GetPPException; + image=SeparateImage(constImage(),channel_,exceptionInfo); + ThrowImageException; + if (image == (MagickCore::Image *) NULL) + return(Magick::Image()); + else + return(Magick::Image(image)); +} + +void Magick::Image::sepiaTone(const double threshold_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=SepiaToneImage(constImage(),threshold_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +Magick::PixelPacket *Magick::Image::setPixels(const ssize_t x_, + const ssize_t y_,const size_t columns_,const size_t rows_) +{ + PixelPacket + *result; + + modifyImage(); + GetPPException; + result=QueueAuthenticPixels(image(),x_, y_,columns_,rows_,exceptionInfo); + ThrowImageException; + return(result); +} + +void Magick::Image::shade(const double azimuth_,const double elevation_, + const bool colorShading_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=ShadeImage(constImage(),colorShading_ == true ? + MagickTrue : MagickFalse,azimuth_,elevation_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::shadow(const double percent_opacity_,const double sigma_, + const ssize_t x_,const ssize_t y_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=ShadowImage(constImage(),percent_opacity_,sigma_,x_,y_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::sharpen(const double radius_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=SharpenImage(constImage(),radius_,sigma_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::sharpenChannel(const ChannelType channel_, + const double radius_,const double sigma_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=SharpenImageChannel(constImage(),channel_,radius_,sigma_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::shave(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + RectangleInfo + shaveInfo=geometry_; + + GetPPException; + newImage=ShaveImage(constImage(),&shaveInfo,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::shear(const double xShearAngle_,const double yShearAngle_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=ShearImage(constImage(),xShearAngle_,yShearAngle_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::sigmoidalContrast(const size_t sharpen_, + const double contrast,const double midpoint) +{ + modifyImage(); + (void) SigmoidalContrastImageChannel(image(),DefaultChannels, + (MagickBooleanType) sharpen_,contrast,midpoint); + throwImageException(); +} + +std::string Magick::Image::signature(const bool force_) const +{ + const char + *property; + + Lock lock(&_imgRef->_mutexLock); + + // Re-calculate image signature if necessary + if (force_ || !GetImageProperty(constImage(), "Signature") || + constImage()->taint) + SignatureImage(const_cast(constImage())); + + property=GetImageProperty(constImage(),"Signature"); + + return(std::string(property)); +} + +void Magick::Image::sketch(const double radius_,const double sigma_, + const double angle_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=SketchImage(constImage(),radius_,sigma_,angle_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::solarize(const double factor_) +{ + modifyImage(); + SolarizeImage(image(),factor_); + throwImageException(); +} + +void Magick::Image::sparseColor(const ChannelType channel, + const SparseColorMethod method,const size_t number_arguments, + const double *arguments) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=SparseColorImage(constImage(),channel,method,number_arguments, + arguments,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::splice(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + RectangleInfo + spliceInfo=geometry_; + + GetPPException; + newImage=SpliceImage(constImage(),&spliceInfo,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::splice(const Geometry &geometry_, + const Color &backgroundColor_) +{ + backgroundColor(backgroundColor_); + splice(geometry_); +} + +void Magick::Image::splice(const Geometry &geometry_, + const Color &backgroundColor_,const GravityType gravity_) +{ + backgroundColor(backgroundColor_); + image()->gravity=gravity_; + splice(geometry_); +} + +void Magick::Image::spread(const size_t amount_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=SpreadImage(constImage(),amount_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::statistics(ImageStatistics *statistics) const +{ + double + maximum, + minimum; + + GetPPException; + (void) GetImageChannelRange(constImage(),RedChannel,&minimum,&maximum, + exceptionInfo); + statistics->red.minimum=minimum; + statistics->red.maximum=maximum; + (void) GetImageChannelMean(constImage(),RedChannel,&statistics->red.mean, + &statistics->red.standard_deviation,exceptionInfo); + (void) GetImageChannelKurtosis(constImage(),RedChannel, + &statistics->red.kurtosis,&statistics->red.skewness,exceptionInfo); + (void) GetImageChannelRange(constImage(),GreenChannel,&minimum,&maximum, + exceptionInfo); + statistics->green.minimum=minimum; + statistics->green.maximum=maximum; + (void) GetImageChannelMean(constImage(),GreenChannel,&statistics->green.mean, + &statistics->green.standard_deviation,exceptionInfo); + (void) GetImageChannelKurtosis(constImage(),GreenChannel, + &statistics->green.kurtosis,&statistics->green.skewness,exceptionInfo); + (void) GetImageChannelRange(constImage(),BlueChannel,&minimum,&maximum, + exceptionInfo); + statistics->blue.minimum=minimum; + statistics->blue.maximum=maximum; + (void) GetImageChannelMean(constImage(),BlueChannel,&statistics->blue.mean, + &statistics->blue.standard_deviation,exceptionInfo); + (void) GetImageChannelKurtosis(constImage(),BlueChannel, + &statistics->blue.kurtosis,&statistics->blue.skewness,exceptionInfo); + (void) GetImageChannelRange(constImage(),OpacityChannel,&minimum,&maximum, + exceptionInfo); + statistics->opacity.minimum=minimum; + statistics->opacity.maximum=maximum; + (void) GetImageChannelMean(constImage(),OpacityChannel, + &statistics->opacity.mean,&statistics->opacity.standard_deviation, + exceptionInfo); + (void) GetImageChannelKurtosis(constImage(),OpacityChannel, + &statistics->opacity.kurtosis,&statistics->opacity.skewness, + exceptionInfo); + ThrowImageException; +} + +void Magick::Image::stegano(const Image &watermark_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=SteganoImage(constImage(),watermark_.constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::stereo(const Image &rightImage_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=StereoImage(constImage(),rightImage_.constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::strip(void) +{ + modifyImage(); + StripImage(image()); + throwImageException(); +} + +Magick::Image Magick::Image::subImageSearch(const Image &reference_, + const MetricType metric_,Geometry *offset_,double *similarityMetric_, + const double similarityThreshold) +{ + char + artifact[MaxTextExtent]; + + MagickCore::Image + *newImage; + + RectangleInfo + offset; + + modifyImage(); + (void) FormatLocaleString(artifact,MaxTextExtent,"%g",similarityThreshold); + (void) SetImageArtifact(image(),"compare:similarity-threshold",artifact); + + GetPPException; + newImage=SimilarityMetricImage(image(),reference_.constImage(),metric_, + &offset,similarityMetric_,exceptionInfo); + ThrowImageException; + if (offset_ != (Geometry *) NULL) + *offset_=offset; + if (newImage == (MagickCore::Image *) NULL) + return(Magick::Image()); + else + return(Magick::Image(newImage)); +} + +void Magick::Image::swirl(const double degrees_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=SwirlImage(constImage(),degrees_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::syncPixels(void) +{ + GetPPException; + (void) SyncAuthenticPixels(image(),exceptionInfo); + ThrowImageException; +} + +void Magick::Image::texture(const Image &texture_) +{ + modifyImage(); + TextureImage(image(),texture_.constImage()); + throwImageException(); +} + +void Magick::Image::threshold(const double threshold_) +{ + modifyImage(); + BilevelImage(image(),threshold_); + throwImageException(); +} + +void Magick::Image::thumbnail(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + size_t + height=rows(), + width=columns(); + + ssize_t + x=0, + y=0; + + ParseMetaGeometry(static_cast(geometry_).c_str(),&x,&y,&width, + &height); + + GetPPException; + newImage=ThumbnailImage(constImage(),width,height,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::tint(const std::string opacity_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=TintImage(constImage(),opacity_.c_str(),constOptions()->fillColor(), + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::transform(const Geometry &imageGeometry_) +{ + modifyImage(); + TransformImage(&(image()),0,std::string(imageGeometry_).c_str()); + throwImageException(); +} + +void Magick::Image::transform(const Geometry &imageGeometry_, + const Geometry &cropGeometry_) +{ + modifyImage(); + TransformImage(&(image()),std::string(cropGeometry_).c_str(), + std::string(imageGeometry_).c_str()); + throwImageException(); +} + +void Magick::Image::transformOrigin(const double x_,const double y_) +{ + modifyImage(); + options()->transformOrigin(x_,y_); +} + +void Magick::Image::transformReset(void) +{ + modifyImage(); + options()->transformReset(); +} + +void Magick::Image::transformScale(const double sx_,const double sy_) +{ + modifyImage(); + options()->transformScale(sx_,sy_); +} + +void Magick::Image::transparent(const Color &color_) +{ + MagickPixelPacket + target; + + std::string + color; + + if (!color_.isValid()) + throwExceptionExplicit(OptionError,"Color argument is invalid"); + + color=color_; + + (void) QueryMagickColor(std::string(color_).c_str(),&target, + &image()->exception); + modifyImage(); + TransparentPaintImage(image(),&target,TransparentOpacity,MagickFalse); + throwImageException(); +} + +void Magick::Image::transparentChroma(const Color &colorLow_, + const Color &colorHigh_) +{ + MagickPixelPacket + targetHigh, + targetLow; + + std::string + colorHigh, + colorLow; + + if (!colorLow_.isValid() || !colorHigh_.isValid()) + throwExceptionExplicit(OptionError,"Color argument is invalid"); + + colorLow=colorLow_; + colorHigh=colorHigh_; + + (void) QueryMagickColor(colorLow.c_str(),&targetLow,&image()->exception); + (void) QueryMagickColor(colorHigh.c_str(),&targetHigh,&image()->exception); + modifyImage(); + TransparentPaintImageChroma(image(),&targetLow,&targetHigh, + TransparentOpacity,MagickFalse); + throwImageException(); +} + +void Magick::Image::transpose(void) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=TransposeImage(constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::transverse(void) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=TransverseImage(constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::trim(void) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=TrimImage(constImage(),exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +Magick::Image Magick::Image::uniqueColors(void) const +{ + MagickCore::Image + *image; + + GetPPException; + image=UniqueImageColors(constImage(),exceptionInfo); + ThrowImageException; + if (image == (MagickCore::Image *) NULL) + return(Magick::Image()); + else + return(Magick::Image(image)); +} + +void Magick::Image::unsharpmask(const double radius_,const double sigma_, + const double amount_,const double threshold_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=UnsharpMaskImage(constImage(),radius_,sigma_,amount_,threshold_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::unsharpmaskChannel(const ChannelType channel_, + const double radius_,const double sigma_,const double amount_, + const double threshold_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=UnsharpMaskImageChannel(constImage(),channel_,radius_,sigma_, + amount_,threshold_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::vignette(const double radius_,const double sigma_, + const ssize_t x_,const ssize_t y_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=VignetteImage(constImage(),radius_,sigma_,x_,y_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::wave(const double amplitude_,const double wavelength_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=WaveImage(constImage(),amplitude_,wavelength_,exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::waveletDenoise(const double threshold_, + const double softness_) +{ + MagickCore::Image + *newImage; + + GetPPException; + newImage=WaveletDenoiseImage(constImage(),threshold_,softness_, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +void Magick::Image::whiteThreshold(const std::string &threshold_) +{ + modifyImage(); + WhiteThresholdImage(image(),threshold_.c_str()); + throwImageException(); +} + +void Magick::Image::whiteThresholdChannel(const ChannelType channel_, + const std::string &threshold_) +{ + modifyImage(); + GetPPException; + WhiteThresholdImageChannel(image(),channel_,threshold_.c_str(), + exceptionInfo); + ThrowImageException; +} + +void Magick::Image::write(Blob *blob_) +{ + size_t + length=0; + + void + *data; + + modifyImage(); + GetPPException; + data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo); + if (length > 0) + blob_->updateNoCopy(data,length,Blob::MallocAllocator); + else + data=RelinquishMagickMemory(data); + ThrowImageException; + throwImageException(); +} + +void Magick::Image::write(Blob *blob_,const std::string &magick_) +{ + size_t + length=0; + + void + *data; + + modifyImage(); + magick(magick_); + GetPPException; + data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo); + if (length > 0) + blob_->updateNoCopy(data,length,Blob::MallocAllocator); + else + data=RelinquishMagickMemory(data); + ThrowImageException; + throwImageException(); +} + +void Magick::Image::write(Blob *blob_,const std::string &magick_, + const size_t depth_) +{ + size_t + length=0; + + void + *data; + + modifyImage(); + magick(magick_); + depth(depth_); + GetPPException; + data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo); + if (length > 0) + blob_->updateNoCopy(data,length,Blob::MallocAllocator); + else + data=RelinquishMagickMemory(data); + ThrowImageException; + throwImageException(); +} + +void Magick::Image::write(const ssize_t x_,const ssize_t y_, + const size_t columns_,const size_t rows_,const std::string &map_, + const StorageType type_,void *pixels_) +{ + GetPPException; + ExportImagePixels(constImage(),x_,y_,columns_,rows_,map_.c_str(),type_, + pixels_,exceptionInfo); + ThrowImageException; +} + +void Magick::Image::write(const std::string &imageSpec_) +{ + modifyImage(); + fileName(imageSpec_); + WriteImage(constImageInfo(),image()); + throwImageException(); +} + +void Magick::Image::writePixels(const Magick::QuantumType quantum_, + unsigned char *destination_) +{ + QuantumInfo + *quantum_info; + + quantum_info=AcquireQuantumInfo(imageInfo(),image()); + GetPPException; + ExportQuantumPixels(constImage(),(MagickCore::CacheView *) NULL,quantum_info, + quantum_,destination_,exceptionInfo); + quantum_info=DestroyQuantumInfo(quantum_info); + ThrowImageException; +} + +void Magick::Image::zoom(const Geometry &geometry_) +{ + MagickCore::Image + *newImage; + + size_t + height=rows(), + width=columns(); + + ssize_t + x=0, + y=0; + + ParseMetaGeometry(static_cast(geometry_).c_str(),&x,&y,&width, + &height); + + GetPPException; + newImage=ResizeImage(constImage(),width,height,image()->filter,image()->blur, + exceptionInfo); + replaceImage(newImage); + ThrowImageException; +} + +Magick::Image::Image(MagickCore::Image *image_) + : _imgRef(new ImageRef(image_)) +{ +} + +MagickCore::Image *&Magick::Image::image(void) +{ + return(_imgRef->image()); +} + +const MagickCore::Image *Magick::Image::constImage(void) const +{ + return(_imgRef->image()); +} + +MagickCore::ImageInfo *Magick::Image::imageInfo(void) +{ + return(_imgRef->options()->imageInfo()); +} + +const MagickCore::ImageInfo *Magick::Image::constImageInfo(void) const +{ + return(_imgRef->options()->imageInfo()); +} + +Magick::Options *Magick::Image::options(void) +{ + return(_imgRef->options()); +} + +const Magick::Options *Magick::Image::constOptions(void) const +{ + return(_imgRef->options()); +} + +MagickCore::QuantizeInfo *Magick::Image::quantizeInfo(void) +{ + return(_imgRef->options()->quantizeInfo()); +} + +const MagickCore::QuantizeInfo *Magick::Image::constQuantizeInfo(void) const +{ + return(_imgRef->options()->quantizeInfo()); +} + +void Magick::Image::modifyImage(void) +{ + { + Lock lock(&_imgRef->_mutexLock); + if (_imgRef->_refCount == 1) + return; + } + + GetPPException; + replaceImage(CloneImage(constImage(),0,0,MagickTrue,exceptionInfo)); + ThrowImageException; + return; +} + +MagickCore::Image *Magick::Image::replaceImage(MagickCore::Image *replacement_) +{ + MagickCore::Image + *image; + + if (replacement_) + image=replacement_; + else + image=AcquireImage(constImageInfo()); + + { + Lock lock(&_imgRef->_mutexLock); + + if (_imgRef->_refCount == 1) + { + // We own the image, just replace it, and de-register + _imgRef->image(image); + } + else + { + // We don't own the image, dereference and replace with copy + --_imgRef->_refCount; + _imgRef=new ImageRef(image,constOptions()); + } + } + + return(_imgRef->_image); +} + +void Magick::Image::throwImageException(void) const +{ + // Throw C++ exception while resetting Image exception to default state + throwException(&const_cast(constImage())->exception, + quiet()); +} + +void Magick::Image::read(MagickCore::Image *image, + MagickCore::ExceptionInfo *exceptionInfo) +{ + // Ensure that multiple image frames were not read. + if (image != (MagickCore::Image *) NULL && + image->next != (MagickCore::Image *) NULL) + { + MagickCore::Image + *next; + + // Destroy any extra image frames + next=image->next; + image->next=(MagickCore::Image *) NULL; + next->previous=(MagickCore::Image *) NULL; + DestroyImageList(next); + } + replaceImage(image); + if (exceptionInfo->severity == MagickCore::UndefinedException && + image == (MagickCore::Image *) NULL) + { + (void) MagickCore::DestroyExceptionInfo(exceptionInfo); + if (!quiet()) + throwExceptionExplicit(MagickCore::ImageWarning, + "No image was loaded."); + return; + } + else + { + ThrowImageException; + } + if (image != (MagickCore::Image *) NULL) + throwException(&image->exception,quiet()); +} + +void Magick::Image::floodFill(const ssize_t x_,const ssize_t y_, + const Magick::Image *fillPattern_,const Magick::Color &fill_, + const MagickCore::PixelPacket *target_,const bool invert_) +{ + Magick::Color + fillColor; + + MagickCore::Image + *fillPattern; + + MagickPixelPacket + target; + + // Set drawing fill pattern or fill color + fillColor=options()->fillColor(); + fillPattern=(MagickCore::Image *)NULL; + if (options()->fillPattern() != (MagickCore::Image *)NULL) + { + GetPPException; + fillPattern=CloneImage(options()->fillPattern(),0,0,MagickTrue, + exceptionInfo); + ThrowImageException; + } + + if (fillPattern_ == (Magick::Image *)NULL) + { + options()->fillPattern((MagickCore::Image *)NULL); + options()->fillColor(fill_); + } + else + options()->fillPattern(fillPattern_->constImage()); + + GetMagickPixelPacket(image(),&target); + target.red=target_->red; + target.green=target_->green; + target.blue=target_->blue; + + (void) FloodfillPaintImage(image(),DefaultChannels,options()->drawInfo(), + &target,static_cast(x_),static_cast(y_), + (MagickBooleanType) invert_); + + options()->fillColor(fillColor); + options()->fillPattern(fillPattern); + throwImageException(); +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/ImageMagick++.pc.in b/ImageMagick-6.9.12-44/Magick++/lib/ImageMagick++.pc.in new file mode 100644 index 0000000..18e3221 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/ImageMagick++.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/ImageMagick-@MAGICK_MAJOR_VERSION@ +includearchdir=@INCLUDEARCH_DIR@/ImageMagick-@MAGICK_MAJOR_VERSION@ +libname=Magick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + +Name: ImageMagick++ +Description: Magick++ - C++ API for ImageMagick (ABI @MAGICK_ABI_SUFFIX@) +Version: @PACKAGE_VERSION@ +Requires: MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ +Libs: -L${libdir} -l${libname} +Libs.private: -L${libdir} -l${libname} @MAGICK_LIBS@ @MATH_LIBS@ +Cflags: -I${includearchdir} -I${includedir} @MAGICK_PCFLAGS@ diff --git a/ImageMagick-6.9.12-44/Magick++/lib/ImageRef.cpp b/ImageMagick-6.9.12-44/Magick++/lib/ImageRef.cpp new file mode 100644 index 0000000..089bfa0 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/ImageRef.cpp @@ -0,0 +1,70 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 +// Copyright Dirk Lemstra 2015 +// +// Implementation of ImageRef +// +// This is an internal implementation class. +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/ImageRef.h" +#include "Magick++/Exception.h" +#include "Magick++/Options.h" + +Magick::ImageRef::ImageRef(void) + : _image(0), + _options(new Options), + _refCount(1), + _mutexLock() +{ + _image=AcquireImage(_options->imageInfo()); + throwException(&_image->exception); +} + +Magick::ImageRef::ImageRef(MagickCore::Image *image_) + : _image(image_), + _options(new Options), + _refCount(1), + _mutexLock() +{ +} + +Magick::ImageRef::ImageRef(MagickCore::Image *image_,const Options *options_) + : _image(image_), + _options(0), + _refCount(1), + _mutexLock() +{ + _options=new Options(*options_); +} + +Magick::ImageRef::~ImageRef(void) +{ + // Deallocate image + if (_image != (MagickCore::Image*) NULL) + { + DestroyImageList(_image); + _image=(MagickCore::Image*) NULL; + } + + // Deallocate image options + delete _options; + _options=(Options *) NULL; +} + +void Magick::ImageRef::image(MagickCore::Image * image_) +{ + if (_image != (MagickCore::Image*) NULL) + DestroyImageList(_image); + _image=image_; +} + +void Magick::ImageRef::options(Magick::Options *options_) +{ + delete _options; + _options=options_; +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++.h new file mode 100644 index 0000000..40f24db --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++.h @@ -0,0 +1,23 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000 +// Copyright Dirk Lemstra 2014 +// +// Simplified includes for Magick++. +// Inclusion of this header is sufficient to use all Magick++ APIs. +// +#ifndef MagickPlusPlus_Header +#include +#include +#include +#include +#include +#include + +// Don't leak our definition of the 'restrict' keyword. 'restrict' is a valid +// identifier in C++, and leaking it could cause extraneous build failures. +#ifdef restrict +#undef restrict +#endif +#define MagickPlusPlus_Header +#endif // MagickPlusPlus_Header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++.pc.in b/ImageMagick-6.9.12-44/Magick++/lib/Magick++.pc.in new file mode 100644 index 0000000..b4889cf --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/ImageMagick-@MAGICK_MAJOR_VERSION@ +includearchdir=@INCLUDEARCH_DIR@/ImageMagick-@MAGICK_MAJOR_VERSION@ +libname=Magick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + +Name: Magick++ +Description: Magick++ - C++ API for ImageMagick (ABI @MAGICK_ABI_SUFFIX@) +Version: @PACKAGE_BASE_VERSION@ +Requires: MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ +Libs: -L${libdir} -l${libname} +Libs.private: -L${libdir} -l${libname} @MAGICK_LIBS@ @MATH_LIBS@ +Cflags: -I${includearchdir} -I${includedir} @MAGICK_PCFLAGS@ diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Blob.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Blob.h new file mode 100644 index 0000000..7f3f5d3 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Blob.h @@ -0,0 +1,80 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 +// Copyright Dirk Lemstra 2015 +// +// Reference counted container class for Binary Large Objects (BLOBs) +// + +#if !defined(Magick_BlobRef_header) +#define Magick_BlobRef_header + +#include "Magick++/Include.h" +#include + +namespace Magick +{ + // Forward decl + class BlobRef; + + class MagickPPExport Blob + { + public: + + enum Allocator + { + MallocAllocator, + NewAllocator + }; + + // Default constructor + Blob(void); + + // Construct object with data, making a copy of the supplied data. + Blob(const void* data_,const size_t length_); + + // Copy constructor (reference counted) + Blob(const Blob& blob_); + + // Destructor (reference counted) + virtual ~Blob(); + + // Assignment operator (reference counted) + Blob& operator=(const Blob& blob_ ); + + // Update object contents from Base64-encoded string representation. + void base64(const std::string base64_); + // Return Base64-encoded string representation. + std::string base64(void); + + // Obtain pointer to data. The user should never try to modify or + // free this data since the Blob class manages its own data. The + // user must be finished with the data before allowing the Blob to + // be destroyed since the pointer is invalid once the Blob is + // destroyed. + const void* data(void) const; + + // Obtain data length + size_t length(void) const; + + // Update object contents, making a copy of the supplied data. + // Any existing data in the object is deallocated. + void update(const void* data_,const size_t length_); + + // Update object contents, using supplied pointer directly (no + // copy). Any existing data in the object is deallocated. The user + // must ensure that the pointer supplied is not deleted or + // otherwise modified after it has been supplied to this method. + // Specify allocator_ as "MallocAllocator" if memory is allocated + // via the C language malloc() function, or "NewAllocator" if + // memory is allocated via C++ 'new'. + void updateNoCopy(void* data_,const size_t length_, + Allocator allocator_=NewAllocator); + + private: + BlobRef *_blobRef; + }; + +} // namespace Magick + +#endif // Magick_BlobRef_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/BlobRef.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/BlobRef.h new file mode 100644 index 0000000..6d6247a --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/BlobRef.h @@ -0,0 +1,44 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 +// Copyright Dirk Lemstra 2015 +// +// Blob reference class +// +// This is an internal implementation class that should not be +// accessed by users. +// + +#if !defined(Magick_Blob_header) +#define Magick_Blob_header + +#include "Magick++/Include.h" +#include "Magick++/Thread.h" +#include "Magick++/Blob.h" + +namespace Magick +{ + class BlobRef + { + public: + // Construct with data, making private copy of data + BlobRef(const void* data_,const size_t length_); + + // Destructor (actually destroys data) + ~BlobRef(void); + + void* _data; // Blob data + size_t _length; // Blob length + Blob::Allocator _allocator; // Memory allocation system in use + ::ssize_t _refCount; // Reference count + MutexLock _mutexLock; // Mutex lock + + private: + // Copy constructor and assignment are not supported + BlobRef(const BlobRef&); + BlobRef& operator=(const BlobRef&); + }; + +} // namespace Magick + +#endif // Magick_Blob_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/ChannelMoments.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/ChannelMoments.h new file mode 100644 index 0000000..876e8c6 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/ChannelMoments.h @@ -0,0 +1,103 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Dirk Lemstra 2014-2015 +// +// Definition of channel moments. +// + +#if !defined (Magick_ChannelMoments_header) +#define Magick_ChannelMoments_header + +#include "Magick++/Include.h" +#include + +namespace Magick +{ + class Image; + + class MagickPPExport ChannelMoments + { + public: + + // Default constructor + ChannelMoments(void); + + // Copy constructor + ChannelMoments(const ChannelMoments &channelMoments_); + + // Destroy channel moments + ~ChannelMoments(void); + + // + // Implemementation methods + // + + ChannelMoments(const ChannelType channel_, + const MagickCore::ChannelMoments *channelMoments_); + + // X position of centroid + double centroidX(void) const; + + // Y position of centroid + double centroidY(void) const; + + // The channel + ChannelType channel(void) const; + + // X position of ellipse axis + double ellipseAxisX(void) const; + + // Y position of ellipse axis + double ellipseAxisY(void) const; + + // Ellipse angle + double ellipseAngle(void) const; + + // Ellipse eccentricity + double ellipseEccentricity(void) const; + + // Ellipse intensity + double ellipseIntensity(void) const; + + // Hu invariants (valid range for index is 0-7) + double huInvariants(const size_t index_) const; + + private: + std::vector _huInvariants; + ChannelType _channel; + double _centroidX; + double _centroidY; + double _ellipseAxisX; + double _ellipseAxisY; + double _ellipseAngle; + double _ellipseEccentricity; + double _ellipseIntensity; + }; + + class MagickPPExport ImageMoments + { + public: + + // Default constructor + ImageMoments(void); + + // Copy constructor + ImageMoments(const ImageMoments &imageMoments_); + + // Destroy image moments + ~ImageMoments(void); + + // Returns the moments for the specified channel + ChannelMoments channel(const ChannelType channel_=CompositeChannels) const; + + // + // Implemementation methods + // + ImageMoments(const Image &image_); + + private: + std::vector _channels; + }; +} + +#endif // Magick_ChannelMoments_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/CoderInfo.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/CoderInfo.h new file mode 100644 index 0000000..d77b3eb --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/CoderInfo.h @@ -0,0 +1,81 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 2001, 2002 +// Copyright Dirk Lemstra 2013-2014 +// +// CoderInfo Definition +// +// Container for image format support information. +// + +#if !defined (Magick_CoderInfo_header) +#define Magick_CoderInfo_header 1 + +#include "Magick++/Include.h" +#include + +namespace Magick +{ + class MagickPPExport CoderInfo + { + public: + + enum MatchType { + AnyMatch, // match any coder + TrueMatch, // match coder if true + FalseMatch // match coder if false + }; + + // Default constructor + CoderInfo(void); + + // Copy constructor + CoderInfo(const CoderInfo &coder_); + + // Construct with coder name + CoderInfo(const std::string &name_); + + // Destructor + ~CoderInfo(void); + + // Assignment operator + CoderInfo& operator=(const CoderInfo &coder_); + + // Format description + std::string description(void) const; + + // Format supports multiple frames + bool isMultiFrame(void) const; + + // Format is readable + bool isReadable(void) const; + + // Format is writeable + bool isWritable(void) const; + + // Format mime type + std::string mimeType(void) const; + + // Format name + std::string name(void) const; + + // Unregisters this coder + bool unregister(void) const; + + // + // Implemementation methods + // + CoderInfo(const MagickCore::MagickInfo *magickInfo_); + + private: + std::string _name; + std::string _description; + std::string _mimeType; + bool _isReadable; + bool _isWritable; + bool _isMultiFrame; + }; + +} // namespace Magick + +#endif // Magick_CoderInfo_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Color.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Color.h new file mode 100644 index 0000000..25cae8f --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Color.h @@ -0,0 +1,524 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003, 2008 +// +// Color Implementation +// +#if !defined (Magick_Color_header) +#define Magick_Color_header + +#include "Magick++/Include.h" +#include + +namespace Magick +{ + class MagickPPExport Color; + + // Compare two Color objects regardless of LHS/RHS + MagickPPExport int operator == + (const Magick::Color &left_,const Magick::Color &right_); + MagickPPExport int operator != + (const Magick::Color &left_,const Magick::Color &right_); + MagickPPExport int operator > + (const Magick::Color &left_,const Magick::Color &right_); + MagickPPExport int operator < + (const Magick::Color &left_,const Magick::Color &right_); + MagickPPExport int operator >= + (const Magick::Color &left_,const Magick::Color &right_); + MagickPPExport int operator <= + (const Magick::Color &left_,const Magick::Color &right_); + + // Base color class stores RGB components scaled to fit Quantum + class MagickPPExport Color + { + public: + + // Default constructor + Color(void); + + // Construct Color using the specified RGB values + Color(Magick::Quantum red_,Magick::Quantum green_,Magick::Quantum blue_); + + // Construct Color using the specified RGBA values + Color(Magick::Quantum red_,Magick::Quantum green_,Magick::Quantum blue_,Magick::Quantum alpha_); + + // Construct Color using the specified color string + Color(const char *x11color_); + + // Copy constructor + Color(const Color &color_); + + // Construct color via ImageMagick PixelPacket + Color(const PixelPacket &color_); + + // Constructor Color using the specified color string + Color(const std::string &x11color_); + + // Destructor + virtual ~Color(void); + + // Assignment operator + Color& operator=(const Color& color_); + + // Set color via X11 color specification string + const Color& operator=(const char *x11color); + + // Set color via X11 color specification string + const Color& operator=(const std::string &x11color_); + + // Set color via ImageMagick PixelPacket + const Color& operator=(const PixelPacket &color_); + + // Return ImageMagick PixelPacket + operator PixelPacket() const; + + // Return X11 color specification string + operator std::string() const; + + // Scaled (to 1.0) version of alpha for use in sub-classes + // (range opaque=0 to transparent=1.0) + void alpha(double alpha_); + double alpha(void) const; + + // Alpha level (range OpaqueOpacity=0 to TransparentOpacity=QuantumRange) + void alphaQuantum(Quantum alpha_); + Quantum alphaQuantum(void) const; + + // Blue color (range 0 to QuantumRange) + void blueQuantum(Quantum blue_); + Quantum blueQuantum (void) const; + + // Green color (range 0 to QuantumRange) + void greenQuantum(Quantum green_); + Quantum greenQuantum(void) const; + + // Does object contain valid color? + void isValid(bool valid_); + bool isValid(void) const; + + // Red color (range 0 to QuantumRange) + void redQuantum(Quantum red_); + Quantum redQuantum (void) const; + + // + // Public methods beyond this point are for Magick++ use only. + // + + // Obtain pixel intensity as a double + double intensity(void) const + { + return (0.299*(_pixel->red)+0.587*(_pixel->green)+0.114*(_pixel->blue)); + } + + // Scale a value expressed as a double (0-1) to Quantum range (0-QuantumRange) + static Quantum scaleDoubleToQuantum(const double double_) + { + return (static_cast(double_*QuantumRange)); + } + + // Scale a value expressed as a Quantum (0-QuantumRange) to double range (0-1) +#if (MAGICKCORE_QUANTUM_DEPTH < 32) && (MAGICKCORE_SIZEOF_FLOAT_T != MAGICKCORE_SIZEOF_DOUBLE || !defined(MAGICKCORE_HDRI_SUPPORT)) + static double scaleQuantumToDouble(const Quantum quantum_) + { + return (static_cast(quantum_)/QuantumRange); + } +#else + static double scaleQuantumToDouble(const double quantum_) + { + return (quantum_/QuantumRange); + } +#endif + + protected: + + // PixelType specifies the interpretation of PixelPacket members + // RGBPixel: + // Red = red; + // Green = green; + // Blue = blue; + // RGBAPixel: + // Red = red; + // Green = green; + // Blue = blue; + // Alpha = opacity; + // CYMKPixel: + // Cyan = red + // Yellow = green + // Magenta = blue + // Black(K) = opacity + enum PixelType + { + RGBPixel, + RGBAPixel, + CYMKPixel + }; + + // Constructor to construct with PixelPacket* + // Used to point Color at a pixel in an image + Color(PixelPacket *rep_,PixelType pixelType_); + + // Set pixel + // Used to point Color at a pixel in an image + void pixel(PixelPacket *rep_,PixelType pixelType_); + + // PixelPacket represents a color pixel: + // red = red (range 0 to QuantumRange) + // green = green (range 0 to QuantumRange) + // blue = blue (range 0 to QuantumRange) + // opacity = alpha (range OpaqueOpacity=0 to TransparentOpacity=QuantumRange) + // index = PseudoColor colormap index + PixelPacket *_pixel; + + private: + + bool _isValid; // Set true if pixel is "valid" + bool _pixelOwn; // Set true if we allocated pixel + PixelType _pixelType; // Color type supported by _pixel + + // Common initializer for PixelPacket representation + void initPixel(); + }; + + // + // Grayscale RGB color + // + // Grayscale is simply RGB with equal parts of red, green, and blue + // All double arguments have a valid range of 0.0 - 1.0. + class MagickPPExport ColorGray : public Color + { + public: + + // Default constructor + ColorGray(void); + + // Copy constructor + ColorGray(const Color & color_); + + // Construct ColorGray using the specified shade + ColorGray(double shade_); + + // Destructor + ~ColorGray(); + + void shade(double shade_); + double shade(void) const; + + // Assignment operator from base class + ColorGray& operator=(const Color& color_); + + protected: + + // Constructor to construct with PixelPacket* + ColorGray(PixelPacket *rep_,PixelType pixelType_); + }; + + // + // HSL Colorspace colors + // + class MagickPPExport ColorHSL: public Color + { + public: + + // Default constructor + ColorHSL(void); + + // Copy constructor + ColorHSL(const Color &color_); + + // Construct ColorHSL using the specified HSL values + ColorHSL(double hue_,double saturation_,double luminosity_); + + // Destructor + ~ColorHSL(); + + // Assignment operator from base class + ColorHSL& operator=(const Color& color_); + + // Hue color + void hue(double hue_); + double hue(void) const; + + // Luminosity color + void luminosity(double luminosity_); + double luminosity(void) const; + + // Saturation color + void saturation(double saturation_); + double saturation(void) const; + + protected: + + // Constructor to construct with PixelPacket* + ColorHSL(PixelPacket *rep_,PixelType pixelType_); + }; + + // + // Monochrome color + // + // Color arguments are constrained to 'false' (black pixel) and 'true' + // (white pixel) + class MagickPPExport ColorMono : public Color + { + public: + + // Default constructor + ColorMono(void); + + // Construct ColorMono (false=black, true=white) + ColorMono(bool mono_); + + // Copy constructor + ColorMono(const Color & color_); + + // Destructor + ~ColorMono(); + + // Assignment operator from base class + ColorMono& operator=(const Color& color_); + + // Mono color + void mono(bool mono_); + bool mono(void) const; + + protected: + // Constructor to construct with PixelPacket* + ColorMono(PixelPacket *rep_,PixelType pixelType_); + }; + + // + // RGB color + // + // All color arguments have a valid range of 0.0 - 1.0. + class MagickPPExport ColorRGB: public Color + { + public: + + // Default constructor + ColorRGB(void); + + // Copy constructor + ColorRGB(const Color &color_); + + // Construct ColorRGB using the specified RGB values + ColorRGB(double red_,double green_,double blue_); + + // Destructor + ~ColorRGB(void); + + // Assignment operator from base class + ColorRGB& operator=(const Color& color_); + + // Blue color + void blue(double blue_); + double blue(void) const; + + // Green color + void green(double green_); + double green(void) const; + + // Red color + void red(double red_); + double red(void) const; + + protected: + + // Constructor to construct with PixelPacket* + ColorRGB(PixelPacket *rep_,PixelType pixelType_); + }; + + // + // YUV Colorspace color + // + // Argument ranges: + // Y: 0.0 through 1.0 + // U: -0.5 through 0.5 + // V: -0.5 through 0.5 + class MagickPPExport ColorYUV: public Color + { + public: + + // Default constructor + ColorYUV(void); + + // Copy constructor + ColorYUV(const Color &color_); + + // Construct ColorYUV using the specified YUV values + ColorYUV(double y_,double u_,double v_); + + // Destructor + ~ColorYUV(void); + + // Assignment operator from base class + ColorYUV& operator=(const Color& color_); + + // Color U (0.0 through 1.0) + void u(double u_); + double u(void) const; + + // Color V (-0.5 through 0.5) + void v(double v_); + double v(void) const; + + // Color Y (-0.5 through 0.5) + void y(double y_); + double y(void) const; + + protected: + + // Constructor to construct with PixelInfo* + ColorYUV(PixelPacket *rep_,PixelType pixelType_); + }; +} // namespace Magick + +// +// Inlines +// + +// +// Color +// + +inline void Magick::Color::alpha(double alpha_) +{ + alphaQuantum(scaleDoubleToQuantum(alpha_)); +} +inline double Magick::Color::alpha(void) const +{ + return scaleQuantumToDouble(alphaQuantum()); +} + +inline void Magick::Color::alphaQuantum(Magick::Quantum alpha_) +{ + _pixel->opacity=alpha_; + _isValid=true ; +} + +inline Magick::Quantum Magick::Color::alphaQuantum(void) const +{ + return _pixel->opacity; +} + +inline void Magick::Color::blueQuantum(Magick::Quantum blue_) +{ + _pixel->blue=blue_; + _isValid=true; +} + +inline Magick::Quantum Magick::Color::blueQuantum(void) const +{ + return _pixel->blue; +} + +inline void Magick::Color::greenQuantum(Magick::Quantum green_) +{ + _pixel->green=green_; + _isValid=true; +} + +inline Magick::Quantum Magick::Color::greenQuantum(void) const +{ + return _pixel->green; +} + +inline void Magick::Color::redQuantum(Magick::Quantum red_) +{ + _pixel->red=red_; + _isValid=true; +} + +inline Magick::Quantum Magick::Color::redQuantum(void) const +{ + return _pixel->red; +} + +inline void Magick::Color::initPixel() +{ + _pixel->red=0; + _pixel->green=0; + _pixel->blue=0; + _pixel->opacity=TransparentOpacity; +} + +inline Magick::Color::operator MagickCore::PixelPacket() const +{ + return *_pixel; +} + +// +// ColorGray +// +inline Magick::ColorGray::ColorGray(Magick::PixelPacket *rep_, + Magick::Color::PixelType pixelType_) +: Color(rep_,pixelType_) +{ +} + +// +// ColorHSL +// +inline Magick::ColorHSL::ColorHSL(Magick::PixelPacket *rep_, + Magick::Color::PixelType pixelType_) +: Color(rep_,pixelType_) +{ +} + +// +// ColorMono +// +inline Magick::ColorMono::ColorMono(Magick::PixelPacket *rep_, + Magick::Color::PixelType pixelType_) + : Color(rep_,pixelType_) +{ +} + +// +// ColorRGB +// +inline Magick::ColorRGB::ColorRGB(Magick::PixelPacket *rep_, + Magick::Color::PixelType pixelType_) + : Color(rep_,pixelType_) +{ +} + +inline void Magick::ColorRGB::blue(double blue_) +{ + blueQuantum(scaleDoubleToQuantum(blue_)); +} + +inline double Magick::ColorRGB::blue(void) const +{ + return scaleQuantumToDouble(blueQuantum()); +} + +inline void Magick::ColorRGB::green(double green_) +{ + greenQuantum(scaleDoubleToQuantum(green_)); +} + +inline double Magick::ColorRGB::green(void) const +{ + return scaleQuantumToDouble(greenQuantum()); +} + +inline void Magick::ColorRGB::red(double red_) +{ + redQuantum(scaleDoubleToQuantum(red_)); +} + +inline double Magick::ColorRGB::red(void) const +{ + return scaleQuantumToDouble(redQuantum()); +} + +// +// ColorYUV +// + +inline Magick::ColorYUV::ColorYUV(Magick::PixelPacket *rep_, + Magick::Color::PixelType pixelType_) + : Color(rep_,pixelType_) +{ +} + +#endif // Magick_Color_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Drawable.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Drawable.h new file mode 100644 index 0000000..432fadd --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Drawable.h @@ -0,0 +1,3041 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 +// Copyright Dirk Lemstra 2014-2017 +// +// Definition of Drawable (Graphic objects) +// +// The technique used for instantiating classes which derive from STL +// templates is described in Microsoft MSDN Article ID: Q168958 +// "HOWTO: Exporting STL Components Inside & Outside of a Class". +// "http://support.microsoft.com/kb/168958" +// +// Note that version 3.0 of this article says that that only STL +// container template which supports DLL export is and we are +// not using as part of the Drawable implementation. +// + +#if !defined(Magick_Drawable_header) +#define Magick_Drawable_header + +#include "Magick++/Include.h" + +#include +#include +#include +#include +#include "Magick++/Color.h" +#include "Magick++/Geometry.h" + +#if defined(MagickDLLExplicitTemplate) +# if defined(MAGICK_PLUSPLUS_IMPLEMENTATION) +# define MagickDrawableExtern +# else +# pragma warning( disable: 4231 ) // Disable warning regarding using extern +# define MagickDrawableExtern extern +# endif // MAGICK_PLUSPLUS_IMPLEMENTATION +#else +# define MagickDrawableExtern +#endif // MagickDLLExplicitTemplate + +namespace Magick +{ + + // + // Representation of an x,y coordinate + // + class MagickPPExport Coordinate + { + public: + Coordinate ( void ) + : _x(0), + _y(0) + { } + Coordinate ( double x_, double y_ ) + : _x(x_), + _y(y_) + { } + virtual ~Coordinate () + { } + + void x ( double x_ ) + { + _x = x_; + } + double x ( void ) const + { + return _x; + } + + void y ( double y_ ) + { + _y = y_; + } + double y ( void ) const + { + return _y; + } + + private: + double _x; + double _y; + }; + + typedef std::list CoordinateList; + +#if defined(MagickDLLExplicitTemplate) + + MagickDrawableExtern template class MagickPPExport + std::allocator; + +#endif // MagickDLLExplicitTemplate + + // Compare two Coordinate objects regardless of LHS/RHS + MagickPPExport int operator == ( const Coordinate& left_, + const Coordinate& right_ ); + MagickPPExport int operator != ( const Coordinate& left_, + const Coordinate& right_ ); + MagickPPExport int operator > ( const Coordinate& left_, + const Coordinate& right_ ); + MagickPPExport int operator < ( const Coordinate& left_, + const Coordinate& right_ ); + MagickPPExport int operator >= ( const Coordinate& left_, + const Coordinate& right_ ); + MagickPPExport int operator <= ( const Coordinate& left_, + const Coordinate& right_ ); + + // + // Base class for all drawable objects + // + class MagickPPExport DrawableBase + { + public: + // Constructor + DrawableBase ( void ) + { } + + // Destructor + virtual ~DrawableBase ( void ); + + // Operator to invoke equivalent draw API call + virtual void operator()( MagickCore::DrawingWand *) const = 0; + + // Return polymorphic copy of object + virtual DrawableBase* copy() const = 0; + + private: + }; + + // + // Representation of a drawable surrogate object to manage drawable objects + // +#undef Drawable // Conflict with + class MagickPPExport Drawable + { + public: + + // Constructor + Drawable ( void ); + + // Construct from DrawableBase + Drawable ( const DrawableBase& original_ ); + + // Destructor + ~Drawable ( void ); + + // Copy constructor + Drawable ( const Drawable& original_ ); + + // Assignment operator + Drawable& operator= (const Drawable& original_ ); + + // Operator to invoke contained object + void operator()( MagickCore::DrawingWand *context_ ) const; + + private: + DrawableBase* dp; + }; + + // Compare two Drawable objects regardless of LHS/RHS + MagickPPExport int operator == ( const Drawable& left_, + const Drawable& right_ ); + MagickPPExport int operator != ( const Drawable& left_, + const Drawable& right_ ); + MagickPPExport int operator > ( const Drawable& left_, + const Drawable& right_ ); + MagickPPExport int operator < ( const Drawable& left_, + const Drawable& right_ ); + MagickPPExport int operator >= ( const Drawable& left_, + const Drawable& right_ ); + MagickPPExport int operator <= ( const Drawable& left_, + const Drawable& right_ ); + + typedef std::list DrawableList; + +#if defined(MagickDLLExplicitTemplate) + + MagickDrawableExtern template class MagickPPExport + std::allocator; + +// MagickDrawableExtern template class MagickPPExport +// std::list >; + +#endif // MagickDLLExplicitTemplate + +// +// Base class for all drawable path elements for use with +// DrawablePath +// +class MagickPPExport VPathBase +{ +public: + // Constructor + VPathBase ( void ) + { } + + // Destructor + virtual ~VPathBase ( void ); + + // Assignment operator + // const VPathBase& operator= (const VPathBase& original_ ); + + // Operator to invoke equivalent draw API call + virtual void operator()( MagickCore::DrawingWand *context_ ) const = 0; + + // Return polymorphic copy of object + virtual VPathBase* copy() const = 0; +}; + +// +// Representation of a drawable path element surrogate object to +// manage drawable path elements so they may be passed as a list to +// DrawablePath. +// +class MagickPPExport VPath +{ +public: + // Constructor + VPath ( void ); + + // Construct from VPathBase + VPath ( const VPathBase& original_ ); + + // Destructor + virtual ~VPath ( void ); + + // Copy constructor + VPath ( const VPath& original_ ); + + // Assignment operator + VPath& operator= (const VPath& original_ ); + + // Operator to invoke contained object + void operator()( MagickCore::DrawingWand *context_ ) const; + +private: + VPathBase* dp; +}; + +// Compare two VPath objects regardless of LHS/RHS +MagickPPExport int operator == ( const VPath& left_, + const VPath& right_ ); +MagickPPExport int operator != ( const VPath& left_, + const VPath& right_ ); +MagickPPExport int operator > ( const VPath& left_, + const VPath& right_ ); +MagickPPExport int operator < ( const VPath& left_, + const VPath& right_ ); +MagickPPExport int operator >= ( const VPath& left_, + const VPath& right_ ); +MagickPPExport int operator <= ( const VPath& left_, + const VPath& right_ ); + +typedef std::list VPathList; + +#if defined(MagickDLLExplicitTemplate) + +MagickDrawableExtern template class MagickPPExport +std::allocator; + +// MagickDrawableExtern template class MagickPPExport +// std::list >; + +#endif // MagickDLLExplicitTemplate + +// +// Drawable Objects +// + +// Affine (scaling, rotation, and translation) +class MagickPPExport DrawableAffine : public DrawableBase +{ +public: + DrawableAffine ( double sx_, double sy_, + double rx_, double ry_, + double tx_, double ty_ ); + + DrawableAffine ( void ); + + /*virtual*/ ~DrawableAffine( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ + DrawableBase* copy() const; + + void sx( const double sx_ ) + { + _affine.sx = sx_; + } + double sx( void ) const + { + return _affine.sx; + } + + void sy( const double sy_ ) + { + _affine.sy = sy_; + } + double sy( void ) const + { + return _affine.sy; + } + + void rx( const double rx_ ) + { + _affine.rx = rx_; + } + double rx( void ) const + { + return _affine.rx; + } + + void ry( const double ry_ ) + { + _affine.ry = ry_; + } + double ry( void ) const + { + return _affine.ry; + } + + void tx( const double tx_ ) + { + _affine.tx = tx_; + } + double tx( void ) const + { + return _affine.tx; + } + + void ty( const double ty_ ) + { + _affine.ty = ty_; + } + double ty( void ) const + { + return _affine.ty; + } + +private: + MagickCore::AffineMatrix _affine; +}; + +// Arc +class MagickPPExport DrawableArc : public DrawableBase +{ +public: + DrawableArc ( double startX_, double startY_, + double endX_, double endY_, + double startDegrees_, double endDegrees_ ) + : _startX(startX_), + _startY(startY_), + _endX(endX_), + _endY(endY_), + _startDegrees(startDegrees_), + _endDegrees(endDegrees_) + { } + + /*virtual*/ ~DrawableArc( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void startX( double startX_ ) + { + _startX = startX_; + } + double startX( void ) const + { + return _startX; + } + + void startY( double startY_ ) + { + _startY = startY_; + } + double startY( void ) const + { + return _startY; + } + + void endX( double endX_ ) + { + _endX = endX_; + } + double endX( void ) const + { + return _endX; + } + + void endY( double endY_ ) + { + _endY = endY_; + } + double endY( void ) const + { + return _endY; + } + + void startDegrees( double startDegrees_ ) + { + _startDegrees = startDegrees_; + } + double startDegrees( void ) const + { + return _startDegrees; + } + + void endDegrees( double endDegrees_ ) + { + _endDegrees = endDegrees_; + } + double endDegrees( void ) const + { + return _endDegrees; + } + +private: + double _startX; + double _startY; + double _endX; + double _endY; + double _startDegrees; + double _endDegrees; +}; + +// Bezier curve (Coordinate list must contain at least three members) +class MagickPPExport DrawableBezier : public DrawableBase +{ +public: + // Construct from coordinates + DrawableBezier ( const CoordinateList &coordinates_ ); + + // Copy constructor + DrawableBezier ( const DrawableBezier& original_ ); + + // Destructor + /*virtual*/ ~DrawableBezier ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +private: + CoordinateList _coordinates; +}; + + +// Pop (terminate) clip path definition +class MagickPPExport DrawablePopClipPath : public DrawableBase +{ +public: + DrawablePopClipPath ( void ) + : _dummy(0) + { + } + + /*virtual*/ ~DrawablePopClipPath ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +private: + ::ssize_t _dummy; +}; + +// Push (create) Clip path definition +class MagickPPExport DrawablePushClipPath : public DrawableBase +{ +public: + DrawablePushClipPath ( const std::string &id_); + + DrawablePushClipPath ( const DrawablePushClipPath& original_ ); + + /*virtual*/ ~DrawablePushClipPath ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +private: + std::string _id; +}; + +// Named Clip Path +class MagickPPExport DrawableClipPath : public DrawableBase +{ +public: + DrawableClipPath ( const std::string &id_ ); + DrawableClipPath ( const DrawableClipPath& original_ ); + + /*virtual*/ ~DrawableClipPath ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void clip_path( const std::string &id_ ) + { + _id = id_.c_str(); //multithread safe + } + std::string clip_path( void ) const + { + return _id; + } + +private: + std::string _id; +}; + +// Circle +class MagickPPExport DrawableCircle : public DrawableBase +{ +public: + DrawableCircle ( double originX_, double originY_, + double perimX_, double perimY_ ) + : _originX(originX_), + _originY(originY_), + _perimX(perimX_), + _perimY(perimY_) + { + } + + /*virtual*/ ~DrawableCircle ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void originX( double originX_ ) + { + _originX = originX_; + } + double originX( void ) const + { + return _originX; + } + + void originY( double originY_ ) + { + _originY = originY_; + } + double originY( void ) const + { + return _originY; + } + + void perimX( double perimX_ ) + { + _perimX = perimX_; + } + double perimX( void ) const + { + return _perimX; + } + + void perimY( double perimY_ ) + { + _perimY = perimY_; + } + double perimY( void ) const + { + return _perimY; + } + +private: + double _originX; + double _originY; + double _perimX; + double _perimY; +}; + +// Colorize at point using PaintMethod +class MagickPPExport DrawableColor : public DrawableBase +{ +public: + DrawableColor ( double x_, double y_, + PaintMethod paintMethod_ ) + : _x(x_), + _y(y_), + _paintMethod(paintMethod_) + { } + + /*virtual*/ ~DrawableColor ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + + void paintMethod( PaintMethod paintMethod_ ) + { + _paintMethod = paintMethod_; + } + PaintMethod paintMethod( void ) const + { + return _paintMethod; + } + +private: + double _x; + double _y; + PaintMethod _paintMethod; +}; + +// Draw image at point, scaled to size specified by width and height +class MagickPPExport Image; +class MagickPPExport DrawableCompositeImage : public DrawableBase +{ +public: + DrawableCompositeImage ( double x_, double y_, + const std::string &filename_ ); + + DrawableCompositeImage ( double x_, double y_, + const Image &image_ ); + + DrawableCompositeImage ( double x_, double y_, + double width_, double height_, + const std::string &filename_ ); + + DrawableCompositeImage ( double x_, double y_, + double width_, double height_, + const Image &image_ ); + + DrawableCompositeImage ( double x_, double y_, + double width_, double height_, + const std::string &filename_, + CompositeOperator composition_ ); + + DrawableCompositeImage ( double x_, double y_, + double width_, double height_, + const Image &image_, + CompositeOperator composition_ ); + + // Copy constructor + DrawableCompositeImage ( const DrawableCompositeImage& original_ ); + + // Destructor + /*virtual*/ ~DrawableCompositeImage( void ); + + // Assignment operator + DrawableCompositeImage& operator= + (const DrawableCompositeImage& original_ ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void composition( CompositeOperator composition_ ) + { + _composition = composition_; + } + CompositeOperator composition( void ) const + { + return _composition; + } + + void filename( const std::string &image_ ); + std::string filename( void ) const; + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + + void width( double width_ ) + { + _width = width_; + } + double width( void ) const + { + return _width; + } + + void height( double height_ ) + { + _height = height_; + } + double height( void ) const + { + return _height; + } + + void image( const Image &image_ ); + Magick::Image image( void ) const; + + // Specify image format used to output Base64 inlined image data. + void magick( std::string magick_ ); + std::string magick( void ); + +private: + CompositeOperator _composition; + double _x; + double _y; + double _width; + double _height; + Image* _image; +}; + +// Density +class MagickPPExport DrawableDensity : public DrawableBase +{ +public: + + DrawableDensity(const std::string &density_); + + ~DrawableDensity(void); + + void operator()(MagickCore::DrawingWand *context_) const; + + DrawableBase* copy() const; + +private: + std::string _density; +}; + +// Ellipse +class MagickPPExport DrawableEllipse : public DrawableBase +{ +public: + DrawableEllipse ( double originX_, double originY_, + double radiusX_, double radiusY_, + double arcStart_, double arcEnd_ ) + : _originX(originX_), + _originY(originY_), + _radiusX(radiusX_), + _radiusY(radiusY_), + _arcStart(arcStart_), + _arcEnd(arcEnd_) + { } + + /*virtual*/ ~DrawableEllipse( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void originX( double originX_ ) + { + _originX = originX_; + } + double originX( void ) const + { + return _originX; + } + + void originY( double originY_ ) + { + _originY = originY_; + } + double originY( void ) const + { + return _originY; + } + + void radiusX( double radiusX_ ) + { + _radiusX = radiusX_; + } + double radiusX( void ) const + { + return _radiusX; + } + + void radiusY( double radiusY_ ) + { + _radiusY = radiusY_; + } + double radiusY( void ) const + { + return _radiusY; + } + + void arcStart( double arcStart_ ) + { + _arcStart = arcStart_; + } + double arcStart( void ) const + { + return _arcStart; + } + + void arcEnd( double arcEnd_ ) + { + _arcEnd = arcEnd_; + } + double arcEnd( void ) const + { + return _arcEnd; + } + +private: + double _originX; + double _originY; + double _radiusX; + double _radiusY; + double _arcStart; + double _arcEnd; +}; + +// Specify drawing fill color +class MagickPPExport DrawableFillColor : public DrawableBase +{ +public: + DrawableFillColor ( const Color &color_ ); + + DrawableFillColor ( const DrawableFillColor& original_ ); + + /*virtual*/ ~DrawableFillColor( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void color( const Color &color_ ) + { + _color = color_; + } + Color color( void ) const + { + return _color; + } + +private: + Color _color; +}; + +// Specify fill rule (fill-rule) +class MagickPPExport DrawableFillRule : public DrawableBase +{ +public: + DrawableFillRule ( const FillRule fillRule_ ) + : _fillRule(fillRule_) + { + } + + /*virtual*/ ~DrawableFillRule ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void fillRule( const FillRule fillRule_ ) + { + _fillRule = fillRule_; + } + FillRule fillRule( void ) const + { + return _fillRule; + } + +private: + FillRule _fillRule; +}; + +// Specify drawing fill opacity +class MagickPPExport DrawableFillOpacity : public DrawableBase +{ +public: + DrawableFillOpacity ( double opacity_ ) + : _opacity(opacity_) + { + } + + /*virtual*/ ~DrawableFillOpacity ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void opacity( double opacity_ ) + { + _opacity = opacity_; + } + double opacity( void ) const + { + return _opacity; + } + +private: + double _opacity; +}; + +// Specify text font +class MagickPPExport DrawableFont : public DrawableBase +{ +public: + DrawableFont ( const std::string &font_ ); + + DrawableFont ( const std::string &family_, + StyleType style_, + const unsigned int weight_, + StretchType stretch_ ); + DrawableFont ( const DrawableFont& original_ ); + + /*virtual*/ ~DrawableFont ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void font( const std::string &font_ ) + { + _font = font_; + } + std::string font( void ) const + { + return _font; + } + +private: + std::string _font; + std::string _family; + StyleType _style; + unsigned int _weight; + StretchType _stretch; +}; + +// Specify text positioning gravity +class MagickPPExport DrawableGravity : public DrawableBase +{ +public: + DrawableGravity ( GravityType gravity_ ) + : _gravity(gravity_) + { + } + + /*virtual*/ ~DrawableGravity ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void gravity( GravityType gravity_ ) + { + _gravity = gravity_; + } + GravityType gravity( void ) const + { + return _gravity; + } + +private: + GravityType _gravity; +}; + +// Line +class MagickPPExport DrawableLine : public DrawableBase +{ +public: + DrawableLine ( double startX_, double startY_, + double endX_, double endY_ ) + : _startX(startX_), + _startY(startY_), + _endX(endX_), + _endY(endY_) + { } + + /*virtual*/ ~DrawableLine ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void startX( double startX_ ) + { + _startX = startX_; + } + double startX( void ) const + { + return _startX; + } + + void startY( double startY_ ) + { + _startY = startY_; + } + double startY( void ) const + { + return _startY; + } + + void endX( double endX_ ) + { + _endX = endX_; + } + double endX( void ) const + { + return _endX; + } + + void endY( double endY_ ) + { + _endY = endY_; + } + double endY( void ) const + { + return _endY; + } + +private: + double _startX; + double _startY; + double _endX; + double _endY; +}; + +// Change pixel matte value to transparent using PaintMethod +class MagickPPExport DrawableMatte : public DrawableBase +{ +public: + DrawableMatte ( double x_, double y_, + PaintMethod paintMethod_ ) + : _x(x_), + _y(y_), + _paintMethod(paintMethod_) + { } + + /*virtual*/ ~DrawableMatte ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + + void paintMethod( PaintMethod paintMethod_ ) + { + _paintMethod = paintMethod_; + } + PaintMethod paintMethod( void ) const + { + return _paintMethod; + } + +private: + double _x; + double _y; + PaintMethod _paintMethod; +}; + +// Drawable Path +class MagickPPExport DrawablePath : public DrawableBase +{ +public: + DrawablePath ( const VPathList &path_ ); + + DrawablePath ( const DrawablePath& original_ ); + + /*virtual*/ ~DrawablePath ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +private: + VPathList _path; +}; + +// Point +class MagickPPExport DrawablePoint : public DrawableBase +{ +public: + DrawablePoint ( double x_, double y_ ) + : _x(x_), + _y(y_) + { } + + /*virtual*/ ~DrawablePoint ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + +private: + double _x; + double _y; +}; + +// Text pointsize +class MagickPPExport DrawablePointSize : public DrawableBase +{ +public: + DrawablePointSize ( double pointSize_ ) + : _pointSize(pointSize_) + { } + + /*virtual*/ ~DrawablePointSize ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void pointSize( double pointSize_ ) + { + _pointSize = pointSize_; + } + double pointSize( void ) const + { + return _pointSize; + } + +private: + double _pointSize; +}; + +// Polygon (Coordinate list must contain at least three members) +class MagickPPExport DrawablePolygon : public DrawableBase +{ +public: + DrawablePolygon ( const CoordinateList &coordinates_ ); + + DrawablePolygon ( const DrawablePolygon& original_ ); + + /*virtual*/ ~DrawablePolygon ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +private: + CoordinateList _coordinates; +}; + +// Polyline (Coordinate list must contain at least three members) +class MagickPPExport DrawablePolyline : public DrawableBase +{ +public: + DrawablePolyline ( const CoordinateList &coordinates_ ); + + DrawablePolyline ( const DrawablePolyline& original_ ); + + /*virtual*/ ~DrawablePolyline ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +private: + CoordinateList _coordinates; +}; + +// Pop Graphic Context +class MagickPPExport DrawablePopGraphicContext : public DrawableBase +{ +public: + DrawablePopGraphicContext ( void ) + : _dummy(0) + { + } + + /*virtual*/ ~DrawablePopGraphicContext ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +private: + ::ssize_t _dummy; +}; + +// Push Graphic Context +class MagickPPExport DrawablePushGraphicContext : public DrawableBase +{ +public: + DrawablePushGraphicContext ( void ) + : _dummy(0) + { + } + + /*virtual*/ ~DrawablePushGraphicContext ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +private: + ::ssize_t _dummy; +}; + +// Pop (terminate) Pattern definition +class MagickPPExport DrawablePopPattern : public DrawableBase +{ +public: + DrawablePopPattern ( void ) + : _dummy(0) + { + } + + /*virtual*/ ~DrawablePopPattern ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +private: + ::ssize_t _dummy; +}; + +// Push (create) Pattern definition +class MagickPPExport DrawablePushPattern : public DrawableBase +{ +public: + DrawablePushPattern ( const std::string &id_, ::ssize_t x_, ::ssize_t y_, + size_t width_, size_t height_ ); + + DrawablePushPattern ( const DrawablePushPattern& original_ ); + + /*virtual*/ ~DrawablePushPattern ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +private: + std::string _id; + ::ssize_t _x; + ::ssize_t _y; + size_t _width; + size_t _height; +}; + +// Rectangle +class MagickPPExport DrawableRectangle : public DrawableBase +{ +public: + DrawableRectangle ( double upperLeftX_, double upperLeftY_, + double lowerRightX_, double lowerRightY_ ) + : _upperLeftX(upperLeftX_), + _upperLeftY(upperLeftY_), + _lowerRightX(lowerRightX_), + _lowerRightY(lowerRightY_) + { } + + /*virtual*/ ~DrawableRectangle ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void upperLeftX( double upperLeftX_ ) + { + _upperLeftX = upperLeftX_; + } + double upperLeftX( void ) const + { + return _upperLeftX; + } + + void upperLeftY( double upperLeftY_ ) + { + _upperLeftY = upperLeftY_; + } + double upperLeftY( void ) const + { + return _upperLeftY; + } + + void lowerRightX( double lowerRightX_ ) + { + _lowerRightX = lowerRightX_; + } + double lowerRightX( void ) const + { + return _lowerRightX; + } + + void lowerRightY( double lowerRightY_ ) + { + _lowerRightY = lowerRightY_; + } + double lowerRightY( void ) const + { + return _lowerRightY; + } + +private: + double _upperLeftX; + double _upperLeftY; + double _lowerRightX; + double _lowerRightY; +}; + +// Apply Rotation +class MagickPPExport DrawableRotation : public DrawableBase +{ +public: + DrawableRotation ( double angle_ ) + : _angle( angle_ ) + { } + + /*virtual*/ ~DrawableRotation ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void angle( double angle_ ) + { + _angle = angle_; + } + double angle( void ) const + { + return _angle; + } + +private: + double _angle; +}; + +// Round Rectangle +class MagickPPExport DrawableRoundRectangle : public DrawableBase +{ +public: + DrawableRoundRectangle ( double upperLeftX_, double upperLeftY_, + double lowerRightX_, double lowerRightY_, + double cornerWidth_, double cornerHeight_ ) + : _upperLeftX(upperLeftX_), + _upperLeftY(upperLeftY_), + _lowerRightX(lowerRightX_), + _lowerRightY(lowerRightY_), + _cornerWidth(cornerWidth_), + _cornerHeight(cornerHeight_) + { } + + /*virtual*/ ~DrawableRoundRectangle ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + +#if !defined(MAGICKCORE_EXCLUDE_DEPRECATED) + + void centerX( double centerX_ ) + { + _upperLeftX = centerX_; + } + double centerX( void ) const + { + return _upperLeftX; + } + + void centerY( double centerY_ ) + { + _upperLeftY = centerY_; + } + double centerY( void ) const + { + return _upperLeftY; + } + + void width( double width_ ) + { + _lowerRightX = width_; + } + double width( void ) const + { + return _lowerRightX; + } + + void hight( double hight_ ) + { + _lowerRightY = hight_; + } + double hight( void ) const + { + return _lowerRightY; + } + +#endif + + void upperLeftX( double upperLeftX_ ) + { + _upperLeftX = upperLeftX_; + } + double upperLeftX( void ) const + { + return _upperLeftX; + } + + void upperLeftY( double upperLeftY_ ) + { + _upperLeftY = upperLeftY_; + } + double upperLeftY( void ) const + { + return _upperLeftY; + } + + void lowerRightX( double lowerRightX_ ) + { + _lowerRightX = lowerRightX_; + } + double lowerRightX( void ) const + { + return _lowerRightX; + } + + void lowerRightY( double lowerRightY_ ) + { + _lowerRightY = lowerRightY_; + } + double lowerRightY( void ) const + { + return _lowerRightY; + } + + void cornerWidth( double cornerWidth_ ) + { + _cornerWidth = cornerWidth_; + } + double cornerWidth( void ) const + { + return _cornerWidth; + } + + void cornerHeight( double cornerHeight_ ) + { + _cornerHeight = cornerHeight_; + } + double cornerHeight( void ) const + { + return _cornerHeight; + } + +private: + double _upperLeftX; + double _upperLeftY; + double _lowerRightX; + double _lowerRightY; + double _cornerWidth; + double _cornerHeight; +}; + +// Apply Scaling +class MagickPPExport DrawableScaling : public DrawableBase +{ +public: + DrawableScaling ( double x_, double y_ ) + : _x(x_), + _y(y_) + { } + + /*virtual*/ ~DrawableScaling ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + +private: + double _x; + double _y; +}; + +// Apply Skew in X direction +class MagickPPExport DrawableSkewX : public DrawableBase +{ +public: + DrawableSkewX ( double angle_ ) + : _angle(angle_) + { } + + /*virtual*/ ~DrawableSkewX ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void angle( double angle_ ) + { + _angle = angle_; + } + double angle( void ) const + { + return _angle; + } + +private: + double _angle; +}; + +// Apply Skew in Y direction +class MagickPPExport DrawableSkewY : public DrawableBase +{ +public: + DrawableSkewY ( double angle_ ) + : _angle(angle_) + { } + + /*virtual*/ ~DrawableSkewY ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void angle( double angle_ ) + { + _angle = angle_; + } + double angle( void ) const + { + return _angle; + } + +private: + double _angle; +}; + +// Stroke dasharray +// +// dasharray_ is an allocated array terminated by value 0.0 or 0. +// The array is copied so the original does not need to be preserved. +// Pass a null pointer to clear an existing dash array setting. +class MagickPPExport DrawableDashArray : public DrawableBase +{ +public: + DrawableDashArray( const double* dasharray_ ); + DrawableDashArray( const size_t* dasharray_ ); // Deprecated + DrawableDashArray( const Magick::DrawableDashArray &original_ ); + + /*virtual*/ ~DrawableDashArray( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void dasharray( const double* dasharray_ ); + void dasharray( const size_t* dasharray_ ); // Deprecated + + const double* dasharray( void ) const + { + return _dasharray; + } + + DrawableDashArray& operator=(const Magick::DrawableDashArray &original_); + +private: + size_t _size; + double *_dasharray; +}; + +// Stroke dashoffset +class MagickPPExport DrawableDashOffset : public DrawableBase +{ +public: + DrawableDashOffset ( const double offset_ ) + : _offset(offset_) + { } + + /*virtual*/ ~DrawableDashOffset ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void offset( const double offset_ ) + { + _offset = offset_; + } + double offset( void ) const + { + return _offset; + } + +private: + double _offset; +}; + +// Stroke linecap +class MagickPPExport DrawableStrokeLineCap : public DrawableBase +{ +public: + DrawableStrokeLineCap ( LineCap linecap_ ) + : _linecap(linecap_) + { } + + /*virtual*/ ~DrawableStrokeLineCap ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void linecap( LineCap linecap_ ) + { + _linecap = linecap_; + } + LineCap linecap( void ) const + { + return _linecap; + } + +private: + LineCap _linecap; +}; + +// Stroke linejoin +class MagickPPExport DrawableStrokeLineJoin : public DrawableBase +{ +public: + DrawableStrokeLineJoin ( LineJoin linejoin_ ) + : _linejoin(linejoin_) + { } + + /*virtual*/ ~DrawableStrokeLineJoin ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void linejoin( LineJoin linejoin_ ) + { + _linejoin = linejoin_; + } + LineJoin linejoin( void ) const + { + return _linejoin; + } + +private: + LineJoin _linejoin; +}; + +// Stroke miterlimit +class MagickPPExport DrawableMiterLimit : public DrawableBase +{ +public: + DrawableMiterLimit ( size_t miterlimit_ ) + : _miterlimit(miterlimit_) + { } + + /*virtual*/ ~DrawableMiterLimit ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void miterlimit( size_t miterlimit_ ) + { + _miterlimit = miterlimit_; + } + size_t miterlimit( void ) const + { + return _miterlimit; + } + +private: + size_t _miterlimit; +}; + + +// Stroke antialias +class MagickPPExport DrawableStrokeAntialias : public DrawableBase +{ +public: + DrawableStrokeAntialias ( bool flag_ ) + : _flag(flag_) + { } + + /*virtual*/ ~DrawableStrokeAntialias ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void flag( bool flag_ ) + { + _flag = flag_; + } + bool flag( void ) const + { + return _flag; + } + +private: + bool _flag; +}; + +// Stroke color +class MagickPPExport DrawableStrokeColor : public DrawableBase +{ +public: + DrawableStrokeColor ( const Color &color_ ); + + DrawableStrokeColor ( const DrawableStrokeColor& original_ ); + + /*virtual*/ ~DrawableStrokeColor ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void color( const Color& color_ ) + { + _color = color_; + } + Color color( void ) const + { + return _color; + } + +private: + Color _color; +}; + +// Stroke opacity +class MagickPPExport DrawableStrokeOpacity : public DrawableBase +{ +public: + DrawableStrokeOpacity ( double opacity_ ) + : _opacity(opacity_) + { + } + + /*virtual*/ ~DrawableStrokeOpacity ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void opacity( double opacity_ ) + { + _opacity = opacity_; + } + double opacity( void ) const + { + return _opacity; + } + +private: + double _opacity; +}; + +// Stroke width +class MagickPPExport DrawableStrokeWidth : public DrawableBase +{ +public: + DrawableStrokeWidth ( double width_ ) + : _width(width_) + { } + + /*virtual*/ ~DrawableStrokeWidth ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void width( double width_ ) + { + _width = width_; + } + double width( void ) const + { + return _width; + } + +private: + double _width; +}; + +// Draw text at point +class MagickPPExport DrawableText : public DrawableBase +{ +public: + DrawableText ( const double x_, const double y_, + const std::string &text_ ); + DrawableText ( const double x_, const double y_, + const std::string &text_, const std::string &encoding_); + + DrawableText ( const DrawableText& original_ ); + + /*virtual*/ ~DrawableText ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void encoding(const std::string &encoding_) + { + _encoding = encoding_; + } + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + + void text( const std::string &text_ ) + { + _text = text_; + } + std::string text( void ) const + { + return _text; + } + +private: + double _x; + double _y; + std::string _text; + std::string _encoding; +}; + +// Text antialias +class MagickPPExport DrawableTextAntialias : public DrawableBase +{ +public: + DrawableTextAntialias ( bool flag_ ); + + DrawableTextAntialias( const DrawableTextAntialias &original_ ); + + /*virtual*/ ~DrawableTextAntialias ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void flag( bool flag_ ) + { + _flag = flag_; + } + bool flag( void ) const + { + return _flag; + } + +private: + bool _flag; +}; + +// Decoration (text decoration) +class MagickPPExport DrawableTextDecoration : public DrawableBase +{ +public: + DrawableTextDecoration ( DecorationType decoration_ ); + + DrawableTextDecoration ( const DrawableTextDecoration& original_ ); + + /*virtual*/ ~DrawableTextDecoration( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void decoration( DecorationType decoration_ ) + { + _decoration = decoration_; + } + DecorationType decoration( void ) const + { + return _decoration; + } + +private: + DecorationType _decoration; +}; + + // Render text right-to-left or left-to-right. + class MagickPPExport DrawableTextDirection : public DrawableBase + { + public: + + DrawableTextDirection(DirectionType direction_); + + ~DrawableTextDirection(void); + + void operator()(MagickCore::DrawingWand *context_) const; + + void direction(DirectionType direction_); + DirectionType direction(void) const; + + DrawableBase* copy() const; + + private: + DirectionType _direction; + }; + + // Specify text inter-line spacing + class MagickPPExport DrawableTextInterlineSpacing : public DrawableBase + { + public: + + DrawableTextInterlineSpacing(double spacing_); + + ~DrawableTextInterlineSpacing(void); + + void operator()(MagickCore::DrawingWand *context_) const; + + void spacing(double spacing_); + double spacing(void) const; + + DrawableBase* copy() const; + + private: + double _spacing; + }; + + // Specify text inter-word spacing + class MagickPPExport DrawableTextInterwordSpacing : public DrawableBase + { + public: + + DrawableTextInterwordSpacing(double spacing_); + + ~DrawableTextInterwordSpacing(void); + + void operator()(MagickCore::DrawingWand *context_) const; + + void spacing(double spacing_); + double spacing(void) const; + + DrawableBase *copy() const; + + private: + double _spacing; + }; + + // Specify text kerning + class MagickPPExport DrawableTextKerning : public DrawableBase + { + public: + + DrawableTextKerning(double kerning_); + + ~DrawableTextKerning(void); + + void operator()(MagickCore::DrawingWand *context_) const; + + void kerning(double kerning_); + double kerning(void) const; + + DrawableBase *copy() const; + + private: + double _kerning; + }; + +// Text undercolor box +class MagickPPExport DrawableTextUnderColor : public DrawableBase +{ +public: + DrawableTextUnderColor ( const Color &color_ ); + + DrawableTextUnderColor ( const DrawableTextUnderColor& original_ ); + + /*virtual*/ ~DrawableTextUnderColor ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void color( const Color& color_ ) + { + _color = color_; + } + Color color( void ) const + { + return _color; + } + +private: + Color _color; +}; + +// Apply Translation +class MagickPPExport DrawableTranslation : public DrawableBase +{ +public: + DrawableTranslation ( double x_, double y_ ) + : _x(x_), + _y(y_) + { } + + /*virtual*/ ~DrawableTranslation ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ DrawableBase* copy() const; + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + +private: + double _x; + double _y; +}; + +// Set the size of the viewbox +class MagickPPExport DrawableViewbox : public DrawableBase +{ +public: + DrawableViewbox(::ssize_t x1_, ::ssize_t y1_, + ::ssize_t x2_, ::ssize_t y2_) + : _x1(x1_), + _y1(y1_), + _x2(x2_), + _y2(y2_) { } + + /*virtual*/ ~DrawableViewbox ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ + DrawableBase* copy() const; + + void x1( ::ssize_t x1_ ) + { + _x1 = x1_; + } + ::ssize_t x1( void ) const + { + return _x1; + } + + void y1( ::ssize_t y1_ ) + { + _y1 = y1_; + } + ::ssize_t y1( void ) const + { + return _y1; + } + + void x2( ::ssize_t x2_ ) + { + _x2 = x2_; + } + ::ssize_t x2( void ) const + { + return _x2; + } + + void y2( ::ssize_t y2_ ) + { + _y2 = y2_; + } + ::ssize_t y2( void ) const + { + return _y2; + } + +private: + ::ssize_t _x1; + ::ssize_t _y1; + ::ssize_t _x2; + ::ssize_t _y2; +}; + +// +// Path Element Classes To Support DrawablePath +// +class MagickPPExport PathArcArgs +{ +public: + PathArcArgs( void ); + + PathArcArgs( double radiusX_, double radiusY_, + double xAxisRotation_, bool largeArcFlag_, + bool sweepFlag_, double x_, double y_ ); + + PathArcArgs( const PathArcArgs &original_ ); + + ~PathArcArgs ( void ); + + void radiusX( double radiusX_ ) + { + _radiusX = radiusX_; + } + double radiusX( void ) const + { + return _radiusX; + } + + void radiusY( double radiusY_ ) + { + _radiusY = radiusY_; + } + double radiusY( void ) const + { + return _radiusY; + } + + void xAxisRotation( double xAxisRotation_ ) + { + _xAxisRotation = xAxisRotation_; + } + double xAxisRotation( void ) const + { + return _xAxisRotation; + } + + void largeArcFlag( bool largeArcFlag_ ) + { + _largeArcFlag = largeArcFlag_; + } + bool largeArcFlag( void ) const + { + return _largeArcFlag; + } + + void sweepFlag( bool sweepFlag_ ) + { + _sweepFlag = sweepFlag_; + } + bool sweepFlag( void ) const + { + return _sweepFlag; + } + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + +private: + double _radiusX; // X radius + double _radiusY; // Y radius + double _xAxisRotation; // Rotation relative to X axis + bool _largeArcFlag; // Draw longer of the two matching arcs + bool _sweepFlag; // Draw arc matching clock-wise rotation + double _x; // End-point X + double _y; // End-point Y +}; + +// Compare two PathArcArgs objects regardless of LHS/RHS +MagickPPExport int operator == ( const PathArcArgs& left_, + const PathArcArgs& right_ ); +MagickPPExport int operator != ( const PathArcArgs& left_, + const PathArcArgs& right_ ); +MagickPPExport int operator > ( const PathArcArgs& left_, + const PathArcArgs& right_ ); +MagickPPExport int operator < ( const PathArcArgs& left_, + const PathArcArgs& right_ ); +MagickPPExport int operator >= ( const PathArcArgs& left_, + const PathArcArgs& right_ ); +MagickPPExport int operator <= ( const PathArcArgs& left_, + const PathArcArgs& right_ ); + +typedef std::list PathArcArgsList; + +#if defined(MagickDLLExplicitTemplate) + +MagickDrawableExtern template class MagickPPExport +std::allocator; + +// MagickDrawableExtern template class MagickPPExport +// std::list >; + +#endif // MagickDLLExplicitTemplate + +// Path Arc (Elliptical Arc) +class MagickPPExport PathArcAbs : public VPathBase +{ +public: + // Draw a single arc segment + PathArcAbs ( const PathArcArgs &coordinates_ ); + + // Draw multiple arc segments + PathArcAbs ( const PathArcArgsList &coordinates_ ); + + // Copy constructor + PathArcAbs ( const PathArcAbs& original_ ); + + // Destructor + /*virtual*/ ~PathArcAbs ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + PathArcArgsList _coordinates; +}; +class MagickPPExport PathArcRel : public VPathBase +{ +public: + // Draw a single arc segment + PathArcRel ( const PathArcArgs &coordinates_ ); + + // Draw multiple arc segments + PathArcRel ( const PathArcArgsList &coordinates_ ); + + PathArcRel ( const PathArcRel& original_ ); + + /*virtual*/ ~PathArcRel ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + PathArcArgsList _coordinates; +}; + +// Path Closepath +class MagickPPExport PathClosePath : public VPathBase +{ +public: + PathClosePath ( void ) + : _dummy(0) + { + } + + /*virtual*/ ~PathClosePath ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + ::ssize_t _dummy; +}; + +// +// Curveto (Cubic Bezier) +// +class MagickPPExport PathCurvetoArgs +{ +public: + PathCurvetoArgs( void ); + + PathCurvetoArgs( double x1_, double y1_, + double x2_, double y2_, + double x_, double y_ ); + + PathCurvetoArgs( const PathCurvetoArgs &original_ ); + + ~PathCurvetoArgs ( void ); + + void x1( double x1_ ) + { + _x1 = x1_; + } +double x1( void ) const +{ + return _x1; +} + +void y1( double y1_ ) +{ + _y1 = y1_; +} +double y1( void ) const +{ + return _y1; +} + +void x2( double x2_ ) +{ + _x2 = x2_; +} +double x2( void ) const +{ + return _x2; +} + +void y2( double y2_ ) +{ + _y2 = y2_; +} +double y2( void ) const +{ + return _y2; +} + +void x( double x_ ) +{ + _x = x_; +} +double x( void ) const +{ + return _x; +} + +void y( double y_ ) +{ + _y = y_; +} +double y( void ) const +{ + return _y; +} + +private: +double _x1; +double _y1; +double _x2; +double _y2; +double _x; +double _y; +}; + +// Compare two PathCurvetoArgs objects regardless of LHS/RHS +MagickPPExport int operator == ( const PathCurvetoArgs& left_, + const PathCurvetoArgs& right_ ); +MagickPPExport int operator != ( const PathCurvetoArgs& left_, + const PathCurvetoArgs& right_ ); +MagickPPExport int operator > ( const PathCurvetoArgs& left_, + const PathCurvetoArgs& right_ ); +MagickPPExport int operator < ( const PathCurvetoArgs& left_, + const PathCurvetoArgs& right_ ); +MagickPPExport int operator >= ( const PathCurvetoArgs& left_, + const PathCurvetoArgs& right_ ); +MagickPPExport int operator <= ( const PathCurvetoArgs& left_, + const PathCurvetoArgs& right_ ); + +typedef std::list PathCurveToArgsList; + +#if defined(MagickDLLExplicitTemplate) + +MagickDrawableExtern template class MagickPPExport +std::allocator; + +// MagickDrawableExtern template class MagickPPExport +// std::list >; + +#endif // MagickDLLExplicitTemplate + +class MagickPPExport PathCurvetoAbs : public VPathBase +{ +public: + // Draw a single curve + PathCurvetoAbs ( const PathCurvetoArgs &args_ ); + + // Draw multiple curves + PathCurvetoAbs ( const PathCurveToArgsList &args_ ); + + // Copy constructor + PathCurvetoAbs ( const PathCurvetoAbs& original_ ); + + // Destructor + /*virtual*/ ~PathCurvetoAbs ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + PathCurveToArgsList _args; +}; +class MagickPPExport PathCurvetoRel : public VPathBase +{ +public: + // Draw a single curve + PathCurvetoRel ( const PathCurvetoArgs &args_ ); + + // Draw multiple curves + PathCurvetoRel ( const PathCurveToArgsList &args_ ); + + // Copy constructor + PathCurvetoRel ( const PathCurvetoRel& original_ ); + + /*virtual*/ ~PathCurvetoRel ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + PathCurveToArgsList _args; +}; +class MagickPPExport PathSmoothCurvetoAbs : public VPathBase +{ +public: + // Draw a single curve + PathSmoothCurvetoAbs ( const Magick::Coordinate &coordinates_ ); + + // Draw multiple curves + PathSmoothCurvetoAbs ( const CoordinateList &coordinates_ ); + + // Copy constructor + PathSmoothCurvetoAbs ( const PathSmoothCurvetoAbs& original_ ); + + /*virtual*/ ~PathSmoothCurvetoAbs ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ + VPathBase* copy() const; + +private: + CoordinateList _coordinates; +}; +class MagickPPExport PathSmoothCurvetoRel : public VPathBase +{ +public: + // Draw a single curve + PathSmoothCurvetoRel ( const Coordinate &coordinates_ ); + + // Draw multiple curves + PathSmoothCurvetoRel ( const CoordinateList &coordinates_ ); + + // Copy constructor + PathSmoothCurvetoRel ( const PathSmoothCurvetoRel& original_ ); + + // Destructor + /*virtual*/ ~PathSmoothCurvetoRel ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ + VPathBase* copy() const; + +private: + CoordinateList _coordinates; +}; + +// +// Quadratic Curveto (Quadratic Bezier) +// +class MagickPPExport PathQuadraticCurvetoArgs +{ +public: + PathQuadraticCurvetoArgs( void ); + + PathQuadraticCurvetoArgs( double x1_, double y1_, + double x_, double y_ ); + + PathQuadraticCurvetoArgs( const PathQuadraticCurvetoArgs &original_ ); + + ~PathQuadraticCurvetoArgs ( void ); + + void x1( double x1_ ) + { + _x1 = x1_; + } + double x1( void ) const + { + return _x1; + } + + void y1( double y1_ ) + { + _y1 = y1_; + } + double y1( void ) const + { + return _y1; + } + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + +private: + double _x1; + double _y1; + double _x; + double _y; +}; + +// Compare two PathQuadraticCurvetoArgs objects regardless of LHS/RHS +MagickPPExport int operator == ( const PathQuadraticCurvetoArgs& left_, + const PathQuadraticCurvetoArgs& right_ ); +MagickPPExport int operator != ( const PathQuadraticCurvetoArgs& left_, + const PathQuadraticCurvetoArgs& right_); +MagickPPExport int operator > ( const PathQuadraticCurvetoArgs& left_, + const PathQuadraticCurvetoArgs& right_); +MagickPPExport int operator < ( const PathQuadraticCurvetoArgs& left_, + const PathQuadraticCurvetoArgs& right_); +MagickPPExport int operator >= ( const PathQuadraticCurvetoArgs& left_, + const PathQuadraticCurvetoArgs& right_ ); +MagickPPExport int operator <= ( const PathQuadraticCurvetoArgs& left_, + const PathQuadraticCurvetoArgs& right_ ); + +typedef std::list PathQuadraticCurvetoArgsList; + +#if defined(MagickDLLExplicitTemplate) + +MagickDrawableExtern template class MagickPPExport +std::allocator; + +// MagickDrawableExtern template class MagickPPExport +// std::list >; + +#endif // MagickDLLExplicitTemplate + +class MagickPPExport PathQuadraticCurvetoAbs : public VPathBase +{ +public: + // Draw a single curve + PathQuadraticCurvetoAbs ( const Magick::PathQuadraticCurvetoArgs &args_ ); + + // Draw multiple curves + PathQuadraticCurvetoAbs ( const PathQuadraticCurvetoArgsList &args_ ); + + // Copy constructor + PathQuadraticCurvetoAbs ( const PathQuadraticCurvetoAbs& original_ ); + + // Destructor + /*virtual*/ ~PathQuadraticCurvetoAbs ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + PathQuadraticCurvetoArgsList _args; +}; +class MagickPPExport PathQuadraticCurvetoRel : public VPathBase +{ +public: + // Draw a single curve + PathQuadraticCurvetoRel ( const Magick::PathQuadraticCurvetoArgs &args_ ); + + // Draw multiple curves + PathQuadraticCurvetoRel ( const PathQuadraticCurvetoArgsList &args_ ); + + // Copy constructor + PathQuadraticCurvetoRel ( const PathQuadraticCurvetoRel& original_ ); + + // Destructor + /*virtual*/ ~PathQuadraticCurvetoRel ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + PathQuadraticCurvetoArgsList _args; +}; +class MagickPPExport PathSmoothQuadraticCurvetoAbs : public VPathBase +{ +public: + // Draw a single curve + PathSmoothQuadraticCurvetoAbs ( const Magick::Coordinate &coordinate_ ); + + // Draw multiple curves + PathSmoothQuadraticCurvetoAbs ( const CoordinateList &coordinates_ ); + + // Copy constructor + PathSmoothQuadraticCurvetoAbs ( const PathSmoothQuadraticCurvetoAbs& original_ ); + + // Destructor + /*virtual*/ ~PathSmoothQuadraticCurvetoAbs ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + CoordinateList _coordinates; +}; +class MagickPPExport PathSmoothQuadraticCurvetoRel : public VPathBase +{ +public: + // Draw a single curve + PathSmoothQuadraticCurvetoRel ( const Magick::Coordinate &coordinate_ ); + + // Draw multiple curves + PathSmoothQuadraticCurvetoRel ( const CoordinateList &coordinates_ ); + + // Copy constructor + PathSmoothQuadraticCurvetoRel ( const PathSmoothQuadraticCurvetoRel& original_ ); + + // Destructor + /*virtual*/ ~PathSmoothQuadraticCurvetoRel ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + CoordinateList _coordinates; +}; + +// +// Path Lineto +// +class MagickPPExport PathLinetoAbs : public VPathBase +{ +public: + // Draw to a single point + PathLinetoAbs ( const Magick::Coordinate& coordinate_ ); + + // Draw to multiple points + PathLinetoAbs ( const CoordinateList &coordinates_ ); + + // Copy constructor + PathLinetoAbs ( const PathLinetoAbs& original_ ); + + // Destructor + /*virtual*/ ~PathLinetoAbs ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + CoordinateList _coordinates; +}; +class MagickPPExport PathLinetoRel : public VPathBase +{ +public: + // Draw to a single point + PathLinetoRel ( const Magick::Coordinate& coordinate_ ); + + // Draw to multiple points + PathLinetoRel ( const CoordinateList &coordinates_ ); + + // Copy constructor + PathLinetoRel ( const PathLinetoRel& original_ ); + + // Destructor + /*virtual*/ ~PathLinetoRel ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + CoordinateList _coordinates; +}; + +// Path Horizontal Lineto +class MagickPPExport PathLinetoHorizontalAbs : public VPathBase +{ +public: + PathLinetoHorizontalAbs ( double x_ ) + : _x(x_) + { + } + + /*virtual*/ ~PathLinetoHorizontalAbs ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + +private: + double _x; +}; +class MagickPPExport PathLinetoHorizontalRel : public VPathBase +{ +public: + PathLinetoHorizontalRel ( double x_ ) + : _x(x_) + { + } + + /*virtual*/ ~PathLinetoHorizontalRel ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + + void x( double x_ ) + { + _x = x_; + } + double x( void ) const + { + return _x; + } + +private: + double _x; +}; + +// Path Vertical Lineto +class MagickPPExport PathLinetoVerticalAbs : public VPathBase +{ +public: + PathLinetoVerticalAbs ( double y_ ) + : _y(y_) + { + } + + /*virtual*/ ~PathLinetoVerticalAbs ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + +private: + double _y; +}; +class MagickPPExport PathLinetoVerticalRel : public VPathBase +{ +public: + PathLinetoVerticalRel ( double y_ ) + : _y(y_) + { + } + + /*virtual*/ ~PathLinetoVerticalRel ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + + void y( double y_ ) + { + _y = y_; + } + double y( void ) const + { + return _y; + } + +private: + double _y; +}; + +// Path Moveto +class MagickPPExport PathMovetoAbs : public VPathBase +{ +public: + // Simple moveto + PathMovetoAbs ( const Magick::Coordinate &coordinate_ ); + + // Moveto followed by implicit linetos + PathMovetoAbs ( const CoordinateList &coordinates_ ); + + // Copy constructor + PathMovetoAbs ( const PathMovetoAbs& original_ ); + + // Destructor + /*virtual*/ ~PathMovetoAbs ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + CoordinateList _coordinates; +}; +class MagickPPExport PathMovetoRel : public VPathBase +{ +public: + // Simple moveto + PathMovetoRel ( const Magick::Coordinate &coordinate_ ); + + // Moveto followed by implicit linetos + PathMovetoRel ( const CoordinateList &coordinates_ ); + + // Copy constructor + PathMovetoRel ( const PathMovetoRel& original_ ); + + // Destructor + /*virtual*/ ~PathMovetoRel ( void ); + + // Operator to invoke equivalent draw API call + /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const; + + // Return polymorphic copy of object + /*virtual*/ VPathBase* copy() const; + +private: + CoordinateList _coordinates; +}; + +} // namespace Magick + +#endif // Magick_Drawable_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Exception.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Exception.h new file mode 100644 index 0000000..eb77f40 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Exception.h @@ -0,0 +1,425 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2014-2015 +// +// Definition of Magick::Exception and derived classes +// Magick::Warning* and Magick::Error*. Derived from C++ STD +// 'exception' class for convenience. +// +// These classes form part of the Magick++ user interface. +// + +#if !defined(Magick_Exception_header) +#define Magick_Exception_header + +#include "Magick++/Include.h" +#include +#include + +namespace Magick +{ + class MagickPPExport Exception: public std::exception + { + public: + + // Construct with message string + Exception(const std::string& what_); + + // Construct with message string and nested exception + Exception(const std::string& what_, Exception* nested_); + + // Copy constructor + Exception(const Exception& original_); + + // Destructor + virtual ~Exception() throw(); + + // Assignment operator + Exception& operator=(const Exception& original_); + + // Get string identifying exception + virtual const char* what() const throw(); + + // Get nested exception + const Exception* nested() const throw(); + + ////////////////////////////////////////////////////////////////////// + // + // No user-serviceable parts beyond this point + // + ////////////////////////////////////////////////////////////////////// + + void nested(Exception* nested_) throw(); + + private: + std::string _what; + Exception* _nested; + }; + + // + // Error exceptions + // + + class MagickPPExport Error: public Exception + { + public: + explicit Error(const std::string& what_); + explicit Error(const std::string& what_,Exception *nested_); + ~Error() throw(); + }; + + class MagickPPExport ErrorBlob: public Error + { + public: + explicit ErrorBlob(const std::string& what_); + explicit ErrorBlob(const std::string& what_,Exception *nested_); + ~ErrorBlob() throw(); + }; + + class MagickPPExport ErrorCache: public Error + { + public: + explicit ErrorCache(const std::string& what_); + explicit ErrorCache(const std::string& what_,Exception *nested_); + ~ErrorCache() throw(); + }; + + class MagickPPExport ErrorCoder: public Error + { + public: + explicit ErrorCoder(const std::string& what_); + explicit ErrorCoder(const std::string& what_,Exception *nested_); + ~ErrorCoder() throw(); + }; + + class MagickPPExport ErrorConfigure: public Error + { + public: + explicit ErrorConfigure(const std::string& what_); + explicit ErrorConfigure(const std::string& what_,Exception *nested_); + ~ErrorConfigure() throw(); + }; + + class MagickPPExport ErrorCorruptImage: public Error + { + public: + explicit ErrorCorruptImage(const std::string& what_); + explicit ErrorCorruptImage(const std::string& what_,Exception *nested_); + ~ErrorCorruptImage() throw(); + }; + + class MagickPPExport ErrorDelegate: public Error + { + public: + explicit ErrorDelegate(const std::string& what_); + explicit ErrorDelegate(const std::string& what_,Exception *nested_); + ~ErrorDelegate() throw(); + }; + + class MagickPPExport ErrorDraw: public Error + { + public: + explicit ErrorDraw(const std::string& what_); + explicit ErrorDraw(const std::string& what_,Exception *nested_); + ~ErrorDraw() throw(); + }; + + class MagickPPExport ErrorFileOpen: public Error + { + public: + explicit ErrorFileOpen(const std::string& what_); + explicit ErrorFileOpen(const std::string& what_,Exception *nested_); + ~ErrorFileOpen() throw(); + }; + + class MagickPPExport ErrorImage: public Error + { + public: + explicit ErrorImage(const std::string& what_); + explicit ErrorImage(const std::string& what_,Exception *nested_); + ~ErrorImage() throw(); + }; + + class MagickPPExport ErrorMissingDelegate: public Error + { + public: + explicit ErrorMissingDelegate(const std::string& what_); + explicit ErrorMissingDelegate(const std::string& what_,Exception *nested_); + ~ErrorMissingDelegate() throw(); + }; + + class MagickPPExport ErrorModule: public Error + { + public: + explicit ErrorModule(const std::string& what_); + explicit ErrorModule(const std::string& what_,Exception *nested_); + ~ErrorModule() throw(); + }; + + class MagickPPExport ErrorMonitor: public Error + { + public: + explicit ErrorMonitor(const std::string& what_); + explicit ErrorMonitor(const std::string& what_,Exception *nested_); + ~ErrorMonitor() throw(); + }; + + class MagickPPExport ErrorOption: public Error + { + public: + explicit ErrorOption(const std::string& what_); + explicit ErrorOption(const std::string& what_,Exception *nested_); + ~ErrorOption() throw(); + }; + + class MagickPPExport ErrorPolicy: public Error + { + public: + explicit ErrorPolicy(const std::string& what_); + explicit ErrorPolicy(const std::string& what_,Exception *nested_); + ~ErrorPolicy() throw(); + }; + + class MagickPPExport ErrorRegistry: public Error + { + public: + explicit ErrorRegistry(const std::string& what_); + explicit ErrorRegistry(const std::string& what_,Exception *nested_); + ~ErrorRegistry() throw(); + }; + + class MagickPPExport ErrorResourceLimit: public Error + { + public: + explicit ErrorResourceLimit(const std::string& what_); + explicit ErrorResourceLimit(const std::string& what_,Exception *nested_); + ~ErrorResourceLimit() throw(); + }; + + class MagickPPExport ErrorStream: public Error + { + public: + explicit ErrorStream(const std::string& what_); + explicit ErrorStream(const std::string& what_,Exception *nested_); + ~ErrorStream() throw(); + }; + + class MagickPPExport ErrorType: public Error + { + public: + explicit ErrorType(const std::string& what_); + explicit ErrorType(const std::string& what_,Exception *nested_); + ~ErrorType() throw(); + }; + + class MagickPPExport ErrorUndefined: public Error + { + public: + explicit ErrorUndefined(const std::string& what_); + explicit ErrorUndefined(const std::string& what_,Exception *nested_); + ~ErrorUndefined() throw(); + }; + + class MagickPPExport ErrorXServer: public Error + { + public: + explicit ErrorXServer(const std::string& what_); + explicit ErrorXServer(const std::string& what_,Exception *nested_); + ~ErrorXServer() throw(); + }; + + // + // Warnings + // + + class MagickPPExport Warning: public Exception + { + public: + explicit Warning(const std::string& what_); + explicit Warning(const std::string& what_,Exception *nested_); + ~Warning() throw(); + }; + + class MagickPPExport WarningBlob: public Warning + { + public: + explicit WarningBlob(const std::string& what_); + explicit WarningBlob(const std::string& what_,Exception *nested_); + ~WarningBlob() throw(); + }; + + class MagickPPExport WarningCache: public Warning + { + public: + explicit WarningCache(const std::string& what_); + explicit WarningCache(const std::string& what_,Exception *nested_); + ~WarningCache() throw(); + }; + + class MagickPPExport WarningCoder: public Warning + { + public: + explicit WarningCoder(const std::string& what_); + explicit WarningCoder(const std::string& what_,Exception *nested_); + ~WarningCoder() throw(); + }; + + class MagickPPExport WarningConfigure: public Warning + { + public: + explicit WarningConfigure(const std::string& what_); + explicit WarningConfigure(const std::string& what_,Exception *nested_); + ~WarningConfigure() throw(); + }; + + class MagickPPExport WarningCorruptImage: public Warning + { + public: + explicit WarningCorruptImage(const std::string& what_); + explicit WarningCorruptImage(const std::string& what_,Exception *nested_); + ~WarningCorruptImage() throw(); + }; + + class MagickPPExport WarningDelegate: public Warning + { + public: + explicit WarningDelegate(const std::string& what_); + explicit WarningDelegate(const std::string& what_,Exception *nested_); + ~WarningDelegate() throw(); + }; + + class MagickPPExport WarningDraw : public Warning + { + public: + explicit WarningDraw(const std::string& what_); + explicit WarningDraw(const std::string& what_,Exception *nested_); + ~WarningDraw() throw(); + }; + + class MagickPPExport WarningFileOpen: public Warning + { + public: + explicit WarningFileOpen(const std::string& what_); + explicit WarningFileOpen(const std::string& what_,Exception *nested_); + ~WarningFileOpen() throw(); + }; + + class MagickPPExport WarningImage: public Warning + { + public: + explicit WarningImage(const std::string& what_); + explicit WarningImage(const std::string& what_,Exception *nested_); + ~WarningImage() throw(); + }; + + class MagickPPExport WarningMissingDelegate: public Warning + { + public: + explicit WarningMissingDelegate(const std::string& what_); + explicit WarningMissingDelegate(const std::string& what_, + Exception *nested_); + ~WarningMissingDelegate() throw(); + }; + + class MagickPPExport WarningModule: public Warning + { + public: + explicit WarningModule(const std::string& what_); + explicit WarningModule(const std::string& what_,Exception *nested_); + ~WarningModule() throw(); + }; + + class MagickPPExport WarningMonitor: public Warning + { + public: + explicit WarningMonitor(const std::string& what_); + explicit WarningMonitor(const std::string& what_,Exception *nested_); + ~WarningMonitor() throw(); + }; + + class MagickPPExport WarningOption: public Warning + { + public: + explicit WarningOption(const std::string& what_); + explicit WarningOption(const std::string& what_,Exception *nested_); + ~WarningOption() throw(); + }; + + class MagickPPExport WarningPolicy: public Warning + { + public: + explicit WarningPolicy(const std::string& what_); + explicit WarningPolicy(const std::string& what_,Exception *nested_); + ~WarningPolicy() throw(); + }; + + class MagickPPExport WarningRegistry: public Warning + { + public: + explicit WarningRegistry(const std::string& what_); + explicit WarningRegistry(const std::string& what_,Exception *nested_); + ~WarningRegistry() throw(); + }; + + class MagickPPExport WarningResourceLimit: public Warning + { + public: + explicit WarningResourceLimit(const std::string& what_); + explicit WarningResourceLimit(const std::string& what_,Exception *nested_); + ~WarningResourceLimit() throw(); + }; + + class MagickPPExport WarningStream: public Warning + { + public: + explicit WarningStream(const std::string& what_); + explicit WarningStream(const std::string& what_,Exception *nested_); + ~WarningStream() throw(); + }; + + class MagickPPExport WarningType: public Warning + { + public: + explicit WarningType(const std::string& what_); + explicit WarningType(const std::string& what_,Exception *nested_); + ~WarningType() throw(); + }; + + class MagickPPExport WarningUndefined: public Warning + { + public: + explicit WarningUndefined(const std::string& what_); + explicit WarningUndefined(const std::string& what_,Exception *nested_); + ~WarningUndefined() throw(); + }; + + class MagickPPExport WarningXServer: public Warning + { + public: + explicit WarningXServer(const std::string& what_); + explicit WarningXServer(const std::string& what_,Exception *nested_); + ~WarningXServer() throw(); + }; + + // + // No user-serviceable components beyond this point. + // + + std::string formatExceptionMessage( + const MagickCore::ExceptionInfo *exception_); + + Exception* createException(const MagickCore::ExceptionInfo *exception_); + + // Throw exception based on raw data + extern MagickPPExport void throwExceptionExplicit( + const MagickCore::ExceptionType severity_,const char* reason_, + const char* description_=(char *) NULL); + + // Thow exception based on ImageMagick's ExceptionInfo + extern MagickPPExport void throwException( + MagickCore::ExceptionInfo *exception_,const bool quiet_=false); + +} // namespace Magick + +#endif // Magick_Exception_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Functions.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Functions.h new file mode 100644 index 0000000..f109f9d --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Functions.h @@ -0,0 +1,37 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2003 +// Copyright Dirk Lemstra 2014 +// +// Simple C++ function wrappers for often used or otherwise +// inconvenient ImageMagick equivalents +// + +#if !defined(Magick_Functions_header) +#define Magick_Functions_header + +#include "Magick++/Include.h" +#include + +namespace Magick +{ + // Clone C++ string as allocated C string, de-allocating any existing string + MagickPPExport void CloneString(char **destination_, + const std::string &source_); + + // Disable OpenCL acceleration (only works when build with OpenCL support) + MagickPPExport void DisableOpenCL(void); + + // Enable OpenCL acceleration (only works when build with OpenCL support) + MagickPPExport bool EnableOpenCL(const bool useCache_=true); + + // C library initialization routine + MagickPPExport void InitializeMagick(const char *path_); + + // Seed a new sequence of pseudo-random numbers + MagickPPExport void SetRandomSeed(const unsigned long seed); + + // C library initialization routine + MagickPPExport void TerminateMagick(); +} +#endif // Magick_Functions_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Geometry.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Geometry.h new file mode 100644 index 0000000..7cd64db --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Geometry.h @@ -0,0 +1,344 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 +// Copyright Dirk Lemstra 2014 +// +// Geometry Definition +// +// Representation of an ImageMagick geometry specification +// X11 geometry specification plus hints + +#if !defined (Magick_Geometry_header) +#define Magick_Geometry_header + +#include "Magick++/Include.h" +#include + +namespace Magick +{ + class MagickPPExport Geometry; + + // Compare two Geometry objects regardless of LHS/RHS + MagickPPExport int operator == + (const Magick::Geometry& left_,const Magick::Geometry& right_); + MagickPPExport int operator != + (const Magick::Geometry& left_,const Magick::Geometry& right_); + MagickPPExport int operator > + (const Magick::Geometry& left_,const Magick::Geometry& right_); + MagickPPExport int operator < + (const Magick::Geometry& left_,const Magick::Geometry& right_); + MagickPPExport int operator >= + (const Magick::Geometry& left_,const Magick::Geometry& right_); + MagickPPExport int operator <= + (const Magick::Geometry& left_,const Magick::Geometry& right_); + + class MagickPPExport Geometry + { + public: + + // Default constructor + Geometry(); + + // Construct Geometry from specified string + Geometry(const char *geometry_); + + // Copy constructor + Geometry(const Geometry &geometry_); + + // Construct Geometry from specified string + Geometry(const std::string &geometry_); + + // Construct Geometry from specified dimensions + Geometry(size_t width_,size_t height_,::ssize_t xOff_=0, + ::ssize_t yOff_=0,bool xNegative_=false,bool yNegative_=false); + + // Destructor + ~Geometry(void); + + // Set via geometry string + const Geometry& operator=(const char *geometry_); + + // Assignment operator + Geometry& operator=(const Geometry& Geometry_); + + // Set via geometry string + const Geometry& operator=(const std::string &geometry_ ); + + // Return geometry string + operator std::string() const; + + // Resize without preserving aspect ratio (!) + void aspect(bool aspect_); + bool aspect(void) const; + + // Resize the image based on the smallest fitting dimension (^) + void fillArea(bool fillArea_); + bool fillArea(void) const; + + // Resize if image is greater than size (>) + void greater(bool greater_); + bool greater(void) const; + + // Height + void height(size_t height_); + size_t height(void) const; + + // Does object contain valid geometry? + void isValid(bool isValid_); + bool isValid(void) const; + + // Resize if image is less than size (<) + void less(bool less_); + bool less(void) const; + + // Resize using a pixel area count limit (@) + void limitPixels(bool limitPixels_); + bool limitPixels(void) const; + + // Width and height are expressed as percentages + void percent(bool percent_); + bool percent(void) const; + + // Width + void width(size_t width_); + size_t width(void) const; + + // Sign of X offset negative? (X origin at right) + void xNegative(bool xNegative_); + bool xNegative(void) const; + + // X offset from origin + void xOff(::ssize_t xOff_); + ::ssize_t xOff(void) const; + + // Sign of Y offset negative? (Y origin at bottom) + void yNegative(bool yNegative_); + bool yNegative(void) const; + + // Y offset from origin + void yOff(::ssize_t yOff_); + ::ssize_t yOff(void) const; + + // + // Public methods below this point are for Magick++ use only. + // + + // Construct from RectangleInfo + Geometry(const MagickCore::RectangleInfo &rectangle_); + + // Set via RectangleInfo + const Geometry& operator=(const MagickCore::RectangleInfo &rectangle_); + + // Return an ImageMagick RectangleInfo struct + operator MagickCore::RectangleInfo() const; + + private: + size_t _width; + size_t _height; + ::ssize_t _xOff; + ::ssize_t _yOff; + bool _xNegative; + bool _yNegative; + bool _isValid; + bool _percent; // Interpret width & height as percentages (%) + bool _aspect; // Force exact size (!) + bool _greater; // Resize only if larger than geometry (>) + bool _less; // Resize only if smaller than geometry (<) + bool _fillArea; // Resize the image based on the smallest fitting dimension (^) + bool _limitPixels; // Resize using a pixel area count limit (@) + }; + + class MagickPPExport Offset; + + // Compare two Offset objects + MagickPPExport int operator == + (const Magick::Offset& left_,const Magick::Offset& right_); + MagickPPExport int operator != + (const Magick::Offset& left_,const Magick::Offset& right_); + + class MagickPPExport Offset + { + public: + + // Default constructor + Offset(); + + // Construct Offset from specified string + Offset(const char *offset_); + + // Copy constructor + Offset(const Offset &offset_); + + // Construct Offset from specified string + Offset(const std::string &offset_); + + // Construct Offset from specified x and y + Offset(ssize_t x_,ssize_t y_); + + // Destructor + ~Offset(void); + + // Set via offset string + const Offset& operator=(const char *offset_); + + // Assignment operator + Offset& operator=(const Offset& offset_); + + // Set via offset string + const Offset& operator=(const std::string &offset_); + + // X offset from origin + ssize_t x(void) const; + + // Y offset from origin + ssize_t y(void) const; + + // + // Public methods below this point are for Magick++ use only. + // + + // Return an ImageMagick OffsetInfo struct + operator MagickCore::OffsetInfo() const; + + private: + ssize_t _x; + ssize_t _y; + }; +} // namespace Magick + +// +// Inlines +// + +inline void Magick::Geometry::aspect(bool aspect_) +{ + _aspect=aspect_; +} + +inline bool Magick::Geometry::aspect(void) const +{ + return(_aspect); +} + +inline void Magick::Geometry::fillArea(bool fillArea_) +{ + _fillArea=fillArea_; +} + +inline bool Magick::Geometry::fillArea(void) const +{ + return(_fillArea); +} + +inline void Magick::Geometry::greater(bool greater_) +{ + _greater=greater_; +} + +inline bool Magick::Geometry::greater(void) const +{ + return(_greater); +} + +inline void Magick::Geometry::height(size_t height_) +{ + _height=height_; +} + +inline size_t Magick::Geometry::height(void) const +{ + return(_height); +} + +inline void Magick::Geometry::isValid(bool isValid_) +{ + _isValid=isValid_; +} + +inline bool Magick::Geometry::isValid(void) const +{ + return(_isValid); +} + +inline void Magick::Geometry::less(bool less_) +{ + _less=less_; +} + +inline bool Magick::Geometry::less(void) const +{ + return(_less); +} + +inline void Magick::Geometry::limitPixels(bool limitPixels_) +{ + _limitPixels=limitPixels_; +} + +inline bool Magick::Geometry::limitPixels(void) const +{ + return(_limitPixels); +} + +inline void Magick::Geometry::width(size_t width_) +{ + _width=width_; + isValid(true); +} + +inline void Magick::Geometry::percent(bool percent_) +{ + _percent = percent_; +} + +inline bool Magick::Geometry::percent(void) const +{ + return(_percent); +} + +inline size_t Magick::Geometry::width(void) const +{ + return(_width); +} + +inline void Magick::Geometry::xNegative(bool xNegative_) +{ + _xNegative=xNegative_; +} + +inline bool Magick::Geometry::xNegative(void) const +{ + return(_xNegative); +} + +inline void Magick::Geometry::xOff(::ssize_t xOff_) +{ + _xOff=xOff_; +} + +inline ::ssize_t Magick::Geometry::xOff(void) const +{ + return(_xOff); +} + +inline void Magick::Geometry::yNegative(bool yNegative_) +{ + _yNegative=yNegative_; +} + +inline bool Magick::Geometry::yNegative(void) const +{ + return(_yNegative); +} + +inline void Magick::Geometry::yOff(::ssize_t yOff_) +{ + _yOff=yOff_; +} + +inline ::ssize_t Magick::Geometry::yOff(void) const +{ + return(_yOff); +} + +#endif // Magick_Geometry_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Image.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Image.h new file mode 100644 index 0000000..f28366d --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Image.h @@ -0,0 +1,1647 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2013-2015 +// +// Definition of Image, the representation of a single image in Magick++ +// + +#if !defined(Magick_Image_header) +#define Magick_Image_header + +#include "Magick++/Include.h" +#include +#include +#include "Magick++/Blob.h" +#include "Magick++/ChannelMoments.h" +#include "Magick++/Color.h" +#include "Magick++/Drawable.h" +#include "Magick++/Exception.h" +#include "Magick++/Geometry.h" +#include "Magick++/TypeMetric.h" + +namespace Magick +{ + // Forward declarations + class Options; + class ImageRef; + + extern MagickPPExport const char *borderGeometryDefault; + extern MagickPPExport const char *frameGeometryDefault; + extern MagickPPExport const char *raiseGeometryDefault; + + // Compare two Image objects regardless of LHS/RHS + // Image sizes and signatures are used as basis of comparison + MagickPPExport int operator == + (const Magick::Image &left_,const Magick::Image &right_); + MagickPPExport int operator != + (const Magick::Image &left_,const Magick::Image &right_); + MagickPPExport int operator > + (const Magick::Image &left_,const Magick::Image &right_); + MagickPPExport int operator < + (const Magick::Image &left_,const Magick::Image &right_); + MagickPPExport int operator >= + (const Magick::Image &left_,const Magick::Image &right_); + MagickPPExport int operator <= + (const Magick::Image &left_,const Magick::Image &right_); + + // + // Image is the representation of an image. In reality, it actually + // a handle object which contains a pointer to a shared reference + // object (ImageRef). As such, this object is extremely space efficient. + // + class MagickPPExport Image + { + public: + + // Obtain image statistics. Statistics are normalized to the range + // of 0.0 to 1.0 and are output to the specified ImageStatistics + // structure. + typedef struct _ImageChannelStatistics + { + /* Minimum value observed */ + double maximum; + /* Maximum value observed */ + double minimum; + /* Average (mean) value observed */ + double mean; + /* Standard deviation, sqrt(variance) */ + double standard_deviation; + /* Variance */ + double variance; + /* Kurtosis */ + double kurtosis; + /* Skewness */ + double skewness; + } ImageChannelStatistics; + + typedef struct _ImageStatistics + { + ImageChannelStatistics red; + ImageChannelStatistics green; + ImageChannelStatistics blue; + ImageChannelStatistics opacity; + } ImageStatistics; + + // Default constructor + Image(void); + + // Construct Image from in-memory BLOB + Image(const Blob &blob_); + + // Construct Image of specified size from in-memory BLOB + Image(const Blob &blob_,const Geometry &size_); + + // Construct Image of specified size and depth from in-memory BLOB + Image(const Blob &blob_,const Geometry &size_,const size_t depth_); + + // Construct Image of specified size, depth, and format from + // in-memory BLOB + Image(const Blob &blob_,const Geometry &size_,const size_t depth_, + const std::string &magick_); + + // Construct Image of specified size, and format from in-memory BLOB + Image(const Blob &blob_,const Geometry &size_,const std::string &magick_); + + // Construct a blank image canvas of specified size and color + Image(const Geometry &size_,const Color &color_); + + // Copy constructor + Image(const Image &image_); + + // Copy constructor to copy part of the image + Image(const Image &image_,const Geometry &geometry_); + + // Construct an image based on an array of raw pixels, of + // specified type and mapping, in memory + Image(const size_t width_,const size_t height_,const std::string &map_, + const StorageType type_,const void *pixels_); + + // Construct from image file or image specification + Image(const std::string &imageSpec_); + + // Destructor + virtual ~Image(); + + // Assignment operator + Image& operator=(const Image &image_); + + // Join images into a single multi-image file + void adjoin(const bool flag_); + bool adjoin(void) const; + + // Anti-alias Postscript and TrueType fonts (default true) + void antiAlias(const bool flag_); + bool antiAlias(void) const; + + // Time in 1/100ths of a second which must expire before + // displaying the next image in an animated sequence. + void animationDelay(const size_t delay_); + size_t animationDelay(void) const; + + // Number of iterations to loop an animation (e.g. Netscape loop + // extension) for. + void animationIterations(const size_t iterations_); + size_t animationIterations(void) const; + + // Lessen (or intensify) when adding noise to an image. + void attenuate(const double attenuate_); + + // Image background color + void backgroundColor(const Color &color_); + Color backgroundColor(void) const; + + // Name of texture image to tile onto the image background + void backgroundTexture(const std::string &backgroundTexture_); + std::string backgroundTexture(void) const; + + // Base image width (before transformations) + size_t baseColumns(void) const; + + // Base image filename (before transformations) + std::string baseFilename(void) const; + + // Base image height (before transformations) + size_t baseRows(void) const; + + // Use black point compensation. + void blackPointCompensation(const bool flag_); + bool blackPointCompensation(void) const; + + // Image border color + void borderColor(const Color &color_); + Color borderColor(void) const; + + // Return smallest bounding box enclosing non-border pixels. The + // current fuzz value is used when discriminating between pixels. + // This is the crop bounding box used by crop(Geometry(0,0)); + Geometry boundingBox(void) const; + + // Text bounding-box base color (default none) + void boxColor(const Color &boxColor_); + Color boxColor(void) const; + + // This method is now deprecated. Please use ResourceLimits instead. + static void cacheThreshold(const size_t threshold_); + + // Image class (DirectClass or PseudoClass) + // NOTE: setting a DirectClass image to PseudoClass will result in + // the loss of color information if the number of colors in the + // image is greater than the maximum palette size (either 256 or + // 65536 entries depending on the value of MAGICKCORE_QUANTUM_DEPTH when + // ImageMagick was built). + void classType(const ClassType class_); + ClassType classType(void) const; + + // Associate a clip mask with the image. The clip mask must be the + // same dimensions as the image. Pass an invalid image to unset an + // existing clip mask. + void clipMask(const Image &clipMask_); + Image clipMask(void) const; + + // Colors within this distance are considered equal + void colorFuzz(const double fuzz_); + double colorFuzz(void) const; + + // Colormap size (number of colormap entries) + void colorMapSize(const size_t entries_); + size_t colorMapSize(void) const; + + // Image Color Space + void colorSpace(const ColorspaceType colorSpace_); + ColorspaceType colorSpace(void) const; + + void colorspaceType(const ColorspaceType colorSpace_); + ColorspaceType colorspaceType(void) const; + + // Image width + size_t columns(void) const; + + // Comment image (add comment string to image) + void comment(const std::string &comment_); + std::string comment(void) const; + + // Composition operator to be used when composition is implicitly + // used (such as for image flattening). + void compose(const CompositeOperator compose_); + CompositeOperator compose(void) const; + + // Compression type + void compressType(const CompressionType compressType_); + CompressionType compressType(void) const; + + // Enable printing of debug messages from ImageMagick + void debug(const bool flag_); + bool debug(void) const; + + // Vertical and horizontal resolution in pixels of the image + void density(const Geometry &geomery_); + Geometry density(void) const; + + // Image depth (bits allocated to red/green/blue components) + void depth(const size_t depth_); + size_t depth(void) const; + + // Tile names from within an image montage + std::string directory(void) const; + + // Endianness (little like Intel or big like SPARC) for image + // formats which support endian-specific options. + void endian(const EndianType endian_); + EndianType endian(void) const; + + // Exif profile (BLOB) + void exifProfile(const Blob &exifProfile_); + Blob exifProfile(void) const; + + // Image file name + void fileName(const std::string &fileName_); + std::string fileName(void) const; + + // Number of bytes of the image on disk + off_t fileSize(void) const; + + // Color to use when filling drawn objects + void fillColor(const Color &fillColor_); + Color fillColor(void) const; + + // Rule to use when filling drawn objects + void fillRule(const FillRule &fillRule_); + FillRule fillRule(void) const; + + // Pattern to use while filling drawn objects. + void fillPattern(const Image &fillPattern_); + Image fillPattern(void) const; + + // Filter to use when resizing image + void filterType(const FilterTypes filterType_); + FilterTypes filterType(void) const; + + // Text rendering font + void font(const std::string &font_); + std::string font(void) const; + + // Font family + void fontFamily(const std::string &family_); + std::string fontFamily(void) const; + + // Font point size + void fontPointsize(const double pointSize_); + double fontPointsize(void) const; + + // Font style + void fontStyle(const StyleType style_); + StyleType fontStyle(void) const; + + // Font weight + void fontWeight(const size_t weight_); + size_t fontWeight(void) const; + + + // Long image format description + std::string format(void) const; + + // Formats the specified expression + // More info here: https://imagemagick.org/script/escape.php + std::string formatExpression(const std::string expression); + + // Gamma level of the image + double gamma(void) const; + + // Preferred size of the image when encoding + Geometry geometry(void) const; + + // GIF disposal method + void gifDisposeMethod(const size_t disposeMethod_); + size_t gifDisposeMethod(void) const; + + // When comparing images, emphasize pixel differences with this color. + void highlightColor(const Color color_); + + // ICC color profile (BLOB) + void iccColorProfile(const Blob &colorProfile_); + Blob iccColorProfile(void) const; + + // Type of interlacing to use + void interlaceType(const InterlaceType interlace_); + InterlaceType interlaceType(void) const; + + // Pixel color interpolation method to use + void interpolate(const InterpolatePixelMethod interpolate_); + InterpolatePixelMethod interpolate(void) const; + + // IPTC profile (BLOB) + void iptcProfile(const Blob &iptcProfile_); + Blob iptcProfile(void) const; + + // Returns true if none of the pixels in the image have an alpha value + // other than OpaqueAlpha (QuantumRange). + bool isOpaque(void) const; + + // Does object contain valid image? + void isValid(const bool isValid_); + bool isValid(void) const; + + // Image label + void label(const std::string &label_); + std::string label(void) const; + + // Stroke width for drawing vector objects (default one) + // This method is now deprecated. Please use strokeWidth instead. + void lineWidth(const double lineWidth_); + double lineWidth(void) const; + + // When comparing images, de-emphasize pixel differences with this color. + void lowlightColor(const Color color_); + + // File type magick identifier (.e.g "GIF") + void magick(const std::string &magick_); + std::string magick(void) const; + + // Associate a mask with the image. The mask must be the same dimensions + // as the image. Pass an invalid image to unset an existing clip mask. + void mask(const Image &mask_); + Image mask(void) const; + + // Image supports transparency (matte channel) + void matte(const bool matteFlag_); + bool matte(void) const; + + // Transparent color + void matteColor(const Color &matteColor_); + Color matteColor(void) const; + + // The mean error per pixel computed when an image is color reduced + double meanErrorPerPixel(void) const; + + // Image modulus depth (minimum number of bits required to support + // red/green/blue components without loss of accuracy) + void modulusDepth(const size_t modulusDepth_); + size_t modulusDepth(void) const; + + // Transform image to black and white + void monochrome(const bool monochromeFlag_); + bool monochrome(void) const; + + // Tile size and offset within an image montage + Geometry montageGeometry(void) const; + + // The normalized max error per pixel computed when an image is + // color reduced. + double normalizedMaxError(void) const; + + // The normalized mean error per pixel computed when an image is + // color reduced. + double normalizedMeanError(void) const; + + // Image orientation + void orientation(const OrientationType orientation_); + OrientationType orientation(void) const; + + // Preferred size and location of an image canvas. + void page(const Geometry &pageSize_); + Geometry page(void) const; + + // Pen color (deprecated, don't use any more) + void penColor(const Color &penColor_); + Color penColor(void) const; + + // Pen texture image (deprecated, don't use any more) + void penTexture(const Image &penTexture_); + Image penTexture(void) const; + + // JPEG/MIFF/PNG compression level (default 75). + void quality(const size_t quality_); + size_t quality(void) const; + + // Maximum number of colors to quantize to + void quantizeColors(const size_t colors_); + size_t quantizeColors(void) const; + + // Colorspace to quantize in. + void quantizeColorSpace(const ColorspaceType colorSpace_); + ColorspaceType quantizeColorSpace(void) const; + + // Dither image during quantization (default true). + void quantizeDither(const bool ditherFlag_); + bool quantizeDither(void) const; + + // Dither method + void quantizeDitherMethod(const DitherMethod ditherMethod_); + DitherMethod quantizeDitherMethod(void) const; + + // Quantization tree-depth + void quantizeTreeDepth(const size_t treeDepth_); + size_t quantizeTreeDepth(void) const; + + // Suppress all warning messages. Error messages are still reported. + void quiet(const bool quiet_); + bool quiet(void) const; + + // The type of rendering intent + void renderingIntent(const RenderingIntent renderingIntent_); + RenderingIntent renderingIntent(void) const; + + // Units of image resolution + void resolutionUnits(const ResolutionType resolutionUnits_); + ResolutionType resolutionUnits(void) const; + + // The number of pixel rows in the image + size_t rows(void) const; + + // Image scene number + void scene(const size_t scene_); + size_t scene(void) const; + + // Width and height of a raw image + void size(const Geometry &geometry_); + Geometry size(void) const; + + // enabled/disable stroke anti-aliasing + void strokeAntiAlias(const bool flag_); + bool strokeAntiAlias(void) const; + + // Color to use when drawing object outlines + void strokeColor(const Color &strokeColor_); + Color strokeColor(void) const; + + // Specify the pattern of dashes and gaps used to stroke + // paths. The strokeDashArray represents a zero-terminated array + // of numbers that specify the lengths of alternating dashes and + // gaps in pixels. If an odd number of values is provided, then + // the list of values is repeated to yield an even number of + // values. A typical strokeDashArray_ array might contain the + // members 5 3 2 0, where the zero value indicates the end of the + // pattern array. + void strokeDashArray(const double *strokeDashArray_); + const double *strokeDashArray(void) const; + + // While drawing using a dash pattern, specify distance into the + // dash pattern to start the dash (default 0). + void strokeDashOffset(const double strokeDashOffset_); + double strokeDashOffset(void) const; + + // Specify the shape to be used at the end of open subpaths when + // they are stroked. Values of LineCap are UndefinedCap, ButtCap, + // RoundCap, and SquareCap. + void strokeLineCap(const LineCap lineCap_); + LineCap strokeLineCap(void) const; + + // Specify the shape to be used at the corners of paths (or other + // vector shapes) when they are stroked. Values of LineJoin are + // UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin. + void strokeLineJoin(const LineJoin lineJoin_); + LineJoin strokeLineJoin(void) const; + + // Specify miter limit. When two line segments meet at a sharp + // angle and miter joins have been specified for 'lineJoin', it is + // possible for the miter to extend far beyond the thickness of + // the line stroking the path. The miterLimit' imposes a limit on + // the ratio of the miter length to the 'lineWidth'. The default + // value of this parameter is 4. + void strokeMiterLimit(const size_t miterLimit_); + size_t strokeMiterLimit(void) const; + + // Pattern image to use while stroking object outlines. + void strokePattern(const Image &strokePattern_); + Image strokePattern(void) const; + + // Stroke width for drawing vector objects (default one) + void strokeWidth(const double strokeWidth_); + double strokeWidth(void) const; + + // Subimage of an image sequence + void subImage(const size_t subImage_); + size_t subImage(void) const; + + // Number of images relative to the base image + void subRange(const size_t subRange_); + size_t subRange(void) const; + + // Render text right-to-left or left-to-right. + void textDirection(DirectionType direction_); + DirectionType textDirection() const; + + // Annotation text encoding (e.g. "UTF-16") + void textEncoding(const std::string &encoding_); + std::string textEncoding(void) const; + + // Text gravity. + void textGravity(GravityType gravity_); + GravityType textGravity() const; + + // Text inter-line spacing + void textInterlineSpacing(double spacing_); + double textInterlineSpacing(void) const; + + // Text inter-word spacing + void textInterwordSpacing(double spacing_); + double textInterwordSpacing(void) const; + + // Text inter-character kerning + void textKerning(double kerning_); + double textKerning(void) const; + + // Text undercolor box + void textUnderColor(const Color &underColor_); + Color textUnderColor(void) const; + + // Tile name + void tileName(const std::string &tileName_); + std::string tileName(void) const; + + // Number of colors in the image + size_t totalColors(void) const; + + // Rotation to use when annotating with text or drawing + void transformRotation(const double angle_); + + // Skew to use in X axis when annotating with text or drawing + void transformSkewX(const double skewx_); + + // Skew to use in Y axis when annotating with text or drawing + void transformSkewY(const double skewy_); + + // Image representation type (also see type operation) + // Available types: + // Bilevel Grayscale GrayscaleMatte + // Palette PaletteMatte TrueColor + // TrueColorMatte ColorSeparation ColorSeparationMatte + void type(const ImageType type_); + ImageType type(void) const; + + // Print detailed information about the image + void verbose(const bool verboseFlag_); + bool verbose(void) const; + + // FlashPix viewing parameters + void view(const std::string &view_); + std::string view(void) const; + + // Virtual pixel method + void virtualPixelMethod(const VirtualPixelMethod virtual_pixel_method_); + VirtualPixelMethod virtualPixelMethod(void) const; + + // X11 display to display to, obtain fonts from, or to capture + // image from + void x11Display(const std::string &display_); + std::string x11Display(void) const; + + // x resolution of the image + double xResolution(void) const; + + // y resolution of the image + double yResolution(void) const; + + // Adaptive-blur image with specified blur factor + // The radius_ parameter specifies the radius of the Gaussian, in + // pixels, not counting the center pixel. The sigma_ parameter + // specifies the standard deviation of the Laplacian, in pixels. + void adaptiveBlur(const double radius_=0.0,const double sigma_=1.0); + + // This is shortcut function for a fast interpolative resize using mesh + // interpolation. It works well for small resizes of less than +/- 50% + // of the original image size. For larger resizing on images a full + // filtered and slower resize function should be used instead. + void adaptiveResize(const Geometry &geometry_); + + // Adaptively sharpens the image by sharpening more intensely near image + // edges and less intensely far from edges. We sharpen the image with a + // Gaussian operator of the given radius and standard deviation (sigma). + // For reasonable results, radius should be larger than sigma. + void adaptiveSharpen(const double radius_=0.0,const double sigma_=1.0); + void adaptiveSharpenChannel(const ChannelType channel_, + const double radius_=0.0,const double sigma_=1.0); + + // Local adaptive threshold image + // http://www.dai.ed.ac.uk/HIPR2/adpthrsh.htm + // Width x height define the size of the pixel neighborhood + // offset = constant to subtract from pixel neighborhood mean + void adaptiveThreshold(const size_t width,const size_t height, + const ::ssize_t offset=0); + + // Add noise to image with specified noise type + void addNoise(const NoiseType noiseType_); + void addNoiseChannel(const ChannelType channel_, + const NoiseType noiseType_); + + // Transform image by specified affine (or free transform) matrix. + void affineTransform(const DrawableAffine &affine); + + // Activates, deactivates, resets, or sets the alpha channel. + void alphaChannel(AlphaChannelType alphaType_); + + // + // Annotate image (draw text on image) + // + // Gravity effects text placement in bounding area according to rules: + // NorthWestGravity text bottom-left corner placed at top-left + // NorthGravity text bottom-center placed at top-center + // NorthEastGravity text bottom-right corner placed at top-right + // WestGravity text left-center placed at left-center + // CenterGravity text center placed at center + // EastGravity text right-center placed at right-center + // SouthWestGravity text top-left placed at bottom-left + // SouthGravity text top-center placed at bottom-center + // SouthEastGravity text top-right placed at bottom-right + + // Annotate using specified text, and placement location + void annotate(const std::string &text_,const Geometry &location_); + + // Annotate using specified text, bounding area, and placement + // gravity + void annotate(const std::string &text_,const Geometry &boundingArea_, + const GravityType gravity_); + + // Annotate with text using specified text, bounding area, + // placement gravity, and rotation. + void annotate(const std::string &text_,const Geometry &boundingArea_, + const GravityType gravity_,const double degrees_); + + // Annotate with text (bounding area is entire image) and placement + // gravity. + void annotate(const std::string &text_,const GravityType gravity_); + + // Inserts the artifact with the specified name and value into + // the artifact tree of the image. + void artifact(const std::string &name_,const std::string &value_); + + // Returns the value of the artifact with the specified name. + std::string artifact(const std::string &name_) const; + + // Access/Update a named image attribute + void attribute(const std::string name_,const char *value_); + void attribute(const std::string name_,const std::string value_); + std::string attribute(const std::string name_ ) const; + + // Extracts the 'mean' from the image and adjust the image to try + // make set its gamma appropriatally. + void autoGamma(void); + void autoGammaChannel(const ChannelType channel_); + + // Adjusts the levels of a particular image channel by scaling the + // minimum and maximum values to the full quantum range. + void autoLevel(void); + void autoLevelChannel(const ChannelType channel_); + + // Adjusts an image so that its orientation is suitable for viewing. + void autoOrient(void); + + // Forces all pixels below the threshold into black while leaving all + // pixels at or above the threshold unchanged. + void blackThreshold(const std::string &threshold_); + void blackThresholdChannel(const ChannelType channel_, + const std::string &threshold_); + + // Simulate a scene at nighttime in the moonlight. + void blueShift(const double factor_=1.5); + + // Blur image with specified blur factor + // The radius_ parameter specifies the radius of the Gaussian, in + // pixels, not counting the center pixel. The sigma_ parameter + // specifies the standard deviation of the Laplacian, in pixels. + void blur(const double radius_=0.0,const double sigma_=1.0); + void blurChannel(const ChannelType channel_,const double radius_=0.0, + const double sigma_=1.0); + + // Border image (add border to image) + void border(const Geometry &geometry_=borderGeometryDefault); + + // Changes the brightness and/or contrast of an image. It converts the + // brightness and contrast parameters into slope and intercept and calls + // a polynomical function to apply to the image. + void brightnessContrast(const double brightness_=0.0, + const double contrast_=0.0); + void brightnessContrastChannel(const ChannelType channel_, + const double brightness_=0.0,const double contrast_=0.0); + + // Uses a multi-stage algorithm to detect a wide range of edges in images. + void cannyEdge(const double radius_=0.0,const double sigma_=1.0, + const double lowerPercent_=0.1,const double upperPercent_=0.3); + + // Accepts a lightweight Color Correction Collection + // (CCC) file which solely contains one or more color corrections and + // applies the correction to the image. + void cdl(const std::string &cdl_); + + // Extract channel from image + void channel(const ChannelType channel_); + + // Set or obtain modulus channel depth + void channelDepth(const ChannelType channel_,const size_t depth_); + size_t channelDepth(const ChannelType channel_); + + // Charcoal effect image (looks like charcoal sketch) + // The radius_ parameter specifies the radius of the Gaussian, in + // pixels, not counting the center pixel. The sigma_ parameter + // specifies the standard deviation of the Laplacian, in pixels. + void charcoal(const double radius_=0.0,const double sigma_=1.0); + + // Chop image (remove vertical or horizontal subregion of image) + // FIXME: describe how geometry argument is used to select either + // horizontal or vertical subregion of image. + void chop(const Geometry &geometry_); + + // Chromaticity blue primary point (e.g. x=0.15, y=0.06) + void chromaBluePrimary(const double x_,const double y_); + void chromaBluePrimary(double *x_, double *y_) const; + + // Chromaticity green primary point (e.g. x=0.3, y=0.6) + void chromaGreenPrimary(const double x_,const double y_); + void chromaGreenPrimary(double *x_,double *y_) const; + + // Chromaticity red primary point (e.g. x=0.64, y=0.33) + void chromaRedPrimary(const double x_,const double y_); + void chromaRedPrimary(double *x_,double *y_) const; + + // Chromaticity white point (e.g. x=0.3127, y=0.329) + void chromaWhitePoint(const double x_,const double y_); + void chromaWhitePoint(double *x_,double *y_) const; + + // Set each pixel whose value is below zero to zero and any the + // pixel whose value is above the quantum range to the quantum range (e.g. + // 65535) otherwise the pixel value remains unchanged. + void clamp(void); + void clampChannel(const ChannelType channel_); + + // Sets the image clip mask based on any clipping path information + // if it exists. + void clip(void); + + void clipPath(const std::string pathname_,const bool inside_); + + // Apply a color lookup table (CLUT) to the image. + void clut(const Image &clutImage_); + void clutChannel(const ChannelType channel_,const Image &clutImage_); + + // Colorize image with pen color, using specified percent opacity. + void colorize(const unsigned int opacity_,const Color &penColor_); + + // Colorize image with pen color, using specified percent opacity + // for red, green, and blue quantums + void colorize(const unsigned int opacityRed_, + const unsigned int opacityGreen_,const unsigned int opacityBlue_, + const Color &penColor_); + + // Color at colormap position index_ + void colorMap(const size_t index_,const Color &color_); + Color colorMap(const size_t index_) const; + + // Apply a color matrix to the image channels. The user supplied + // matrix may be of order 1 to 5 (1x1 through 5x5). + void colorMatrix(const size_t order_,const double *color_matrix_); + + // Compare current image with another image + // Sets meanErrorPerPixel, normalizedMaxError, and normalizedMeanError + // in the current image. False is returned if the images are identical. + bool compare(const Image &reference_); + + // Compare current image with another image + // Returns the distortion based on the specified metric. + double compare(const Image &reference_,const MetricType metric_); + double compareChannel(const ChannelType channel_,const Image &reference_, + const MetricType metric_); + + // Compare current image with another image + // Sets the distortion and returns the difference image. + Image compare(const Image &reference_,const MetricType metric_, + double *distortion); + Image compareChannel(const ChannelType channel_,const Image &reference_, + const MetricType metric_,double *distortion ); + + // Compose an image onto another at specified offset and using + // specified algorithm + void composite(const Image &compositeImage_,const Geometry &offset_, + const CompositeOperator compose_=InCompositeOp); + void composite(const Image &compositeImage_,const GravityType gravity_, + const CompositeOperator compose_=InCompositeOp); + void composite(const Image &compositeImage_,const ::ssize_t xOffset_, + const ::ssize_t yOffset_,const CompositeOperator compose_=InCompositeOp); + + // Determines the connected-components of the image + void connectedComponents(const size_t connectivity_); + + // Contrast image (enhance intensity differences in image) + void contrast(const size_t sharpen_); + + // A simple image enhancement technique that attempts to improve the + // contrast in an image by 'stretching' the range of intensity values + // it contains to span a desired range of values. It differs from the + // more sophisticated histogram equalization in that it can only apply a + // linear scaling function to the image pixel values. As a result the + // 'enhancement' is less harsh. + void contrastStretch(const double black_point_,const double white_point_); + void contrastStretchChannel(const ChannelType channel_, + const double black_point_,const double white_point_); + + // Convolve image. Applies a user-specified convolution to the image. + // order_ represents the number of columns and rows in the filter kernel. + // kernel_ is an array of doubles representing the convolution kernel. + void convolve(const size_t order_,const double *kernel_); + + // Copies pixels from the source image as defined by the geometry the + // destination image at the specified offset. + void copyPixels(const Image &source_,const Geometry &geometry_, + const Offset &offset_); + + // Crop image (subregion of original image) + void crop(const Geometry &geometry_); + + // Cycle image colormap + void cycleColormap(const ::ssize_t amount_); + + // Converts cipher pixels to plain pixels. + void decipher(const std::string &passphrase_); + + // Tagged image format define. Similar to the defineValue() method + // except that passing the flag_ value 'true' creates a value-less + // define with that format and key. Passing the flag_ value 'false' + // removes any existing matching definition. The method returns 'true' + // if a matching key exists, and 'false' if no matching key exists. + void defineSet(const std::string &magick_,const std::string &key_, + bool flag_); + bool defineSet(const std::string &magick_,const std::string &key_) const; + + // Tagged image format define (set/access coder-specific option) The + // magick_ option specifies the coder the define applies to. The key_ + // option provides the key specific to that coder. The value_ option + // provides the value to set (if any). See the defineSet() method if the + // key must be removed entirely. + void defineValue(const std::string &magick_,const std::string &key_, + const std::string &value_); + std::string defineValue(const std::string &magick_, + const std::string &key_) const; + + // Removes skew from the image. Skew is an artifact that occurs in scanned + // images because of the camera being misaligned, imperfections in the + // scanning or surface, or simply because the paper was not placed + // completely flat when scanned. The value of threshold_ ranges from 0 + // to QuantumRange. + void deskew(const double threshold_); + + // Despeckle image (reduce speckle noise) + void despeckle(void); + + // Determines the color type of the image. This method can be used to + // automaticly make the type GrayScale. + ImageType determineType(void) const; + + // Display image on screen + void display(void); + + // Distort image. distorts an image using various distortion methods, by + // mapping color lookups of the source image to a new destination image + // usally of the same size as the source image, unless 'bestfit' is set to + // true. + void distort(const DistortImageMethod method_, + const size_t number_arguments_,const double *arguments_, + const bool bestfit_=false); + + // Draw on image using a single drawable + void draw(const Drawable &drawable_); + + // Draw on image using a drawable list + void draw(const std::list &drawable_); + + // Edge image (hilight edges in image) + void edge(const double radius_=0.0); + + // Emboss image (hilight edges with 3D effect) + // The radius_ parameter specifies the radius of the Gaussian, in + // pixels, not counting the center pixel. The sigma_ parameter + // specifies the standard deviation of the Laplacian, in pixels. + void emboss(const double radius_=0.0,const double sigma_=1.0); + + // Converts pixels to cipher-pixels. + void encipher(const std::string &passphrase_); + + // Enhance image (minimize noise) + void enhance(void); + + // Equalize image (histogram equalization) + void equalize(void); + + // Erase image to current "background color" + void erase(void); + + // Extend the image as defined by the geometry. + void extent(const Geometry &geometry_); + void extent(const Geometry &geometry_,const Color &backgroundColor); + void extent(const Geometry &geometry_,const Color &backgroundColor, + const GravityType gravity_ ); + void extent(const Geometry &geometry_,const GravityType gravity_); + + // Flip image (reflect each scanline in the vertical direction) + void flip(void); + + // Flood-fill color across pixels that match the color of the + // target pixel and are neighbors of the target pixel. + // Uses current fuzz setting when determining color match. + void floodFillColor(const Geometry &point_,const Color &fillColor_); + void floodFillColor(const Geometry &point_,const Color &fillColor_, + const bool invert_); + void floodFillColor(const ::ssize_t x_,const ::ssize_t y_, + const Color &fillColor_); + void floodFillColor(const ::ssize_t x_,const ::ssize_t y_, + const Color &fillColor_,const bool invert_); + + // Flood-fill color across pixels starting at target-pixel and + // stopping at pixels matching specified border color. + // Uses current fuzz setting when determining color match. + void floodFillColor(const Geometry &point_,const Color &fillColor_, + const Color &borderColor_); + void floodFillColor(const Geometry &point_,const Color &fillColor_, + const Color &borderColor_,const bool invert_); + void floodFillColor(const ::ssize_t x_,const ::ssize_t y_, + const Color &fillColor_,const Color &borderColor_); + void floodFillColor(const ::ssize_t x_,const ::ssize_t y_, + const Color &fillColor_,const Color &borderColor_,const bool invert_); + + // Floodfill pixels matching color (within fuzz factor) of target + // pixel(x,y) with replacement opacity value using method. + void floodFillOpacity(const ::ssize_t x_,const ::ssize_t y_, + const unsigned int opacity_,const bool invert_=false); + void floodFillOpacity(const ::ssize_t x_,const ::ssize_t y_, + const unsigned int opacity_,const PaintMethod method_); + void floodFillOpacity(const ::ssize_t x_,const ::ssize_t y_, + const unsigned int opacity_,const Color &target_, + const bool invert_=false); + + // Flood-fill texture across pixels that match the color of the + // target pixel and are neighbors of the target pixel. + // Uses current fuzz setting when determining color match. + void floodFillTexture(const Geometry &point_,const Image &texture_); + void floodFillTexture(const Geometry &point_,const Image &texture_, + const bool invert_); + void floodFillTexture(const ::ssize_t x_,const ::ssize_t y_, + const Image &texture_); + void floodFillTexture(const ::ssize_t x_,const ::ssize_t y_, + const Image &texture_,const bool invert_); + + // Flood-fill texture across pixels starting at target-pixel and + // stopping at pixels matching specified border color. + // Uses current fuzz setting when determining color match. + void floodFillTexture(const Geometry &point_,const Image &texture_, + const Color &borderColor_); + void floodFillTexture(const Geometry &point_,const Image &texture_, + const Color &borderColor_,const bool invert_); + void floodFillTexture(const ::ssize_t x_,const ::ssize_t y_, + const Image &texture_,const Color &borderColor_); + void floodFillTexture(const ::ssize_t x_,const ::ssize_t y_, + const Image &texture_,const Color &borderColor_,const bool invert_); + + // Flop image (reflect each scanline in the horizontal direction) + void flop(void); + + // Obtain font metrics for text string given current font, + // pointsize, and density settings. + void fontTypeMetrics(const std::string &text_,TypeMetric *metrics); + + // Obtain multi line font metrics for text string given current font, + // pointsize, and density settings. + void fontTypeMetricsMultiline(const std::string &text_, + TypeMetric *metrics); + + // Frame image + void frame(const Geometry &geometry_=frameGeometryDefault); + void frame(const size_t width_,const size_t height_, + const ::ssize_t innerBevel_=6, const ::ssize_t outerBevel_=6); + + // Applies a mathematical expression to the image. + void fx(const std::string expression); + void fx(const std::string expression,const Magick::ChannelType channel); + + // Gamma correct image + void gamma(const double gamma_); + void gamma(const double gammaRed_,const double gammaGreen_, + const double gammaBlue_); + + // Gaussian blur image + // The number of neighbor pixels to be included in the convolution + // mask is specified by 'width_'. The standard deviation of the + // gaussian bell curve is specified by 'sigma_'. + void gaussianBlur(const double width_,const double sigma_); + void gaussianBlurChannel(const ChannelType channel_,const double width_, + const double sigma_); + + // Obtain immutable image pixel indexes (valid for PseudoClass images) + const IndexPacket *getConstIndexes(void) const; + + // Transfers read-only pixels from the image to the pixel cache as + // defined by the specified region + const PixelPacket *getConstPixels(const ::ssize_t x_,const ::ssize_t y_, + const size_t columns_,const size_t rows_) const; + + // Obtain mutable image pixel indexes (valid for PseudoClass images) + IndexPacket *getIndexes(void); + + // Transfers pixels from the image to the pixel cache as defined + // by the specified region. Modified pixels may be subsequently + // transferred back to the image via syncPixels. This method is + // valid for DirectClass images. + PixelPacket *getPixels(const ::ssize_t x_,const ::ssize_t y_, + const size_t columns_,const size_t rows_); + + // Converts the colors in the image to gray. + void grayscale(const PixelIntensityMethod method_); + + // Apply a color lookup table (Hald CLUT) to the image. + void haldClut(const Image &clutImage_); + + // Identifies lines in the image. + void houghLine(const size_t width_,const size_t height_, + const size_t threshold_=40); + + // Implode image (special effect) + void implode(const double factor_); + + // Implements the inverse discrete Fourier transform (DFT) of the image + // either as a magnitude / phase or real / imaginary image pair. + void inverseFourierTransform(const Image &phase_); + void inverseFourierTransform(const Image &phase_,const bool magnitude_); + + // An edge preserving noise reduction filter. + void kuwahara(const double radius_=0.0,const double sigma_=1.0); + void kuwaharaChannel(const ChannelType channel_,const double radius_=0.0, + const double sigma_=1.0); + + // Level image. Adjust the levels of the image by scaling the + // colors falling between specified white and black points to the + // full available quantum range. The parameters provided represent + // the black, mid (gamma), and white points. The black point + // specifies the darkest color in the image. Colors darker than + // the black point are set to zero. Mid point (gamma) specifies a + // gamma correction to apply to the image. White point specifies + // the lightest color in the image. Colors brighter than the + // white point are set to the maximum quantum value. The black and + // white point have the valid range 0 to QuantumRange while mid (gamma) + // has a useful range of 0 to ten. + void level(const double black_point,const double white_point, + const double mid_point=1.0); + void levelChannel(const ChannelType channel,const double black_point, + const double white_point,const double mid_point=1.0); + + // Maps the given color to "black" and "white" values, linearly spreading + // out the colors, and level values on a channel by channel bases, as + // per level(). The given colors allows you to specify different level + // ranges for each of the color channels separately. + void levelColors(const Color &blackColor_,const Color &whiteColor_, + const bool invert_=true); + void levelColorsChannel(const ChannelType channel_, + const Color &blackColor_,const Color &whiteColor_, + const bool invert_=true); + + // Levelize applies the reversed level operation to just the specific + // channels specified.It compresses the full range of color values, so + // that they lie between the given black and white points. Gamma is + // applied before the values are mapped. + void levelize(const double blackPoint_,const double whitePoint_, + const double gamma_=1.0); + void levelizeChannel(const ChannelType channel_,const double blackPoint_, + const double whitePoint_,const double gamma_=1.0); + + // Discards any pixels below the black point and above the white point and + // levels the remaining pixels. + void linearStretch(const double blackPoint_,const double whitePoint_); + + // Rescales image with seam carving. + void liquidRescale(const Geometry &geometry_); + + // Local contrast enhancement + void localContrast(const double radius_,const double strength_); + + // Magnify image by integral size + void magnify(void); + + // Remap image colors with closest color from reference image + void map(const Image &mapImage_,const bool dither_=false); + + // Floodfill designated area with replacement opacity value + void matteFloodfill(const Color &target_,const unsigned int opacity_, + const ::ssize_t x_,const ::ssize_t y_,const PaintMethod method_); + + // Filter image by replacing each pixel component with the median + // color in a circular neighborhood + void medianFilter(const double radius_=0.0); + + // Merge image layers (deprecated, don't use any more) + void mergeLayers(const ImageLayerMethod layerType_); + + // Reduce image by integral size + void minify(void); + + // Modulate percent hue, saturation, and brightness of an image + void modulate(const double brightness_,const double saturation_, + const double hue_); + + // Returns the normalized moments of one or more image channels. + ImageMoments moments(void) const; + + // Applies a kernel to the image according to the given mophology method. + void morphology(const MorphologyMethod method_,const std::string kernel_, + const ssize_t iterations_=1); + void morphology(const MorphologyMethod method_, + const KernelInfoType kernel_,const std::string arguments_, + const ssize_t iterations_=1); + void morphologyChannel(const ChannelType channel_, + const MorphologyMethod method_,const std::string kernel_, + const ssize_t iterations_=1); + void morphologyChannel(const ChannelType channel_, + const MorphologyMethod method_,const KernelInfoType kernel_, + const std::string arguments_,const ssize_t iterations_=1); + + // Motion blur image with specified blur factor + // The radius_ parameter specifies the radius of the Gaussian, in + // pixels, not counting the center pixel. The sigma_ parameter + // specifies the standard deviation of the Laplacian, in pixels. + // The angle_ parameter specifies the angle the object appears + // to be comming from (zero degrees is from the right). + void motionBlur(const double radius_,const double sigma_, + const double angle_); + + // Negate colors in image. Set grayscale to only negate grayscale + // values in image. + void negate(const bool grayscale_=false); + void negateChannel(const ChannelType channel_,const bool grayscale_=false); + + // Normalize image (increase contrast by normalizing the pixel + // values to span the full range of color values) + void normalize(void); + + // Oilpaint image (image looks like oil painting) + void oilPaint(const double radius_=3.0); + + // Set or attenuate the opacity channel in the image. If the image + // pixels are opaque then they are set to the specified opacity + // value, otherwise they are blended with the supplied opacity + // value. The value of opacity_ ranges from 0 (completely opaque) + // to QuantumRange. The defines OpaqueOpacity and TransparentOpacity are + // available to specify completely opaque or completely + // transparent, respectively. + void opacity(const unsigned int opacity_); + + // Change color of opaque pixel to specified pen color. + void opaque(const Color &opaqueColor_,const Color &penColor_, + const bool invert_=MagickFalse); + + // Perform a ordered dither based on a number of pre-defined dithering + // threshold maps, but over multiple intensity levels. + void orderedDither(std::string thresholdMap_); + void orderedDitherChannel(const ChannelType channel_, + std::string thresholdMap_); + + // Set each pixel whose value is less than epsilon to epsilon or + // -epsilon (whichever is closer) otherwise the pixel value remains + // unchanged. + void perceptible(const double epsilon_); + void perceptibleChannel(const ChannelType channel_,const double epsilon_); + + // Ping is similar to read except only enough of the image is read + // to determine the image columns, rows, and filesize. Access the + // columns(), rows(), and fileSize() attributes after invoking + // ping. The image data is not valid after calling ping. + void ping(const Blob &blob_); + + // Ping is similar to read except only enough of the image is read + // to determine the image columns, rows, and filesize. Access the + // columns(), rows(), and fileSize() attributes after invoking + // ping. The image data is not valid after calling ping. + void ping(const std::string &imageSpec_); + + // Get/set pixel color at location x & y. + void pixelColor(const ::ssize_t x_,const ::ssize_t y_,const Color &color_); + Color pixelColor(const ::ssize_t x_,const ::ssize_t y_ ) const; + + // Simulates a Polaroid picture. + void polaroid(const std::string &caption_,const double angle_); + + // Reduces the image to a limited number of colors for a "poster" effect. + void posterize(const size_t levels_,const bool dither_=false); + void posterizeChannel(const ChannelType channel_, const size_t levels_, + const bool dither_=false); + + // Execute a named process module using an argc/argv syntax similar to + // that accepted by a C 'main' routine. An exception is thrown if the + // requested process module doesn't exist, fails to load, or fails during + // execution. + void process(std::string name_,const ::ssize_t argc_,const char **argv_); + + // Add or remove a named profile to/from the image. Remove the + // profile by passing an empty Blob (e.g. Blob()). Valid names are + // "*", "8BIM", "ICM", "IPTC", or a user/format-defined profile name. + void profile(const std::string name_,const Blob &colorProfile_); + + // Retrieve a named profile from the image. Valid names are: + // "8BIM", "8BIMTEXT", "APP1", "APP1JPEG", "ICC", "ICM", & "IPTC" + // or an existing user/format-defined profile name. + Blob profile(const std::string name_) const; + + // Quantize image (reduce number of colors) + void quantize(const bool measureError_=false); + + // Apply a value with an arithmetic, relational, or logical operator. + void quantumOperator(const ChannelType channel_, + const MagickEvaluateOperator operator_,double rvalue_); + + // Apply a value with an arithmetic, relational, or logical operator. + void quantumOperator(const ChannelType channel_, + const MagickFunction function_,const size_t number_parameters_, + const double *parameters_); + + // Apply a value with an arithmetic, relational, or logical operator. + void quantumOperator(const ::ssize_t x_,const ::ssize_t y_, + const size_t columns_,const size_t rows_,const ChannelType channel_, + const MagickEvaluateOperator operator_,const double rvalue_); + + // Raise image (lighten or darken the edges of an image to give a + // 3-D raised or lowered effect) + void raise(const Geometry &geometry_=raiseGeometryDefault, + const bool raisedFlag_=false); + + // Random threshold image. + // + // Changes the value of individual pixels based on the intensity + // of each pixel compared to a random threshold. The result is a + // low-contrast, two color image. The thresholds_ argument is a + // geometry containing LOWxHIGH thresholds. If the string + // contains 2x2, 3x3, or 4x4, then an ordered dither of order 2, + // 3, or 4 will be performed instead. If a channel_ argument is + // specified then only the specified channel is altered. This is + // a very fast alternative to 'quantize' based dithering. + void randomThreshold(const Geometry &thresholds_); + void randomThresholdChannel(const Geometry &thresholds_, + const ChannelType channel_); + + // Read single image frame from in-memory BLOB + void read(const Blob &blob_); + + // Read single image frame of specified size from in-memory BLOB + void read(const Blob &blob_,const Geometry &size_); + + // Read single image frame of specified size and depth from + // in-memory BLOB + void read(const Blob &blob_,const Geometry &size_,const size_t depth_); + + // Read single image frame of specified size, depth, and format + // from in-memory BLOB + void read(const Blob &blob_,const Geometry &size_,const size_t depth_, + const std::string &magick_); + + // Read single image frame of specified size, and format from + // in-memory BLOB + void read(const Blob &blob_,const Geometry &size_, + const std::string &magick_); + + // Read single image frame of specified size into current object + void read(const Geometry &size_,const std::string &imageSpec_); + + // Read single image frame from an array of raw pixels, with + // specified storage type (ConstituteImage), e.g. + // image.read( 640, 480, "RGB", 0, pixels ); + void read(const size_t width_,const size_t height_,const std::string &map_, + const StorageType type_,const void *pixels_); + + // Read single image frame into current object + void read(const std::string &imageSpec_); + + // Transfers one or more pixel components from a buffer or file + // into the image pixel cache of an image. + // Used to support image decoders. + void readPixels(const QuantumType quantum_,const unsigned char *source_); + + // Reduce noise in image using a noise peak elimination filter + void reduceNoise(void); + void reduceNoise(const double order_); + + // Resets the image page canvas and position. + void repage(); + + // Resize image in terms of its pixel size. + void resample(const Geometry &geometry_); + + // Resize image to specified size. + void resize(const Geometry &geometry_); + + // Roll image (rolls image vertically and horizontally) by specified + // number of columnms and rows) + void roll(const Geometry &roll_); + void roll(const size_t columns_,const size_t rows_); + + // Rotate image clockwise by specified number of degrees. Specify a + // negative number for degrees to rotate counter-clockwise. + void rotate(const double degrees_); + + // Rotational blur image. + void rotationalBlur(const double angle_); + void rotationalBlurChannel(const ChannelType channel_, + const double angle_); + + // Resize image by using pixel sampling algorithm + void sample(const Geometry &geometry_); + + // Resize image by using simple ratio algorithm + void scale(const Geometry &geometry_); + + // Segment (coalesce similar image components) by analyzing the + // histograms of the color components and identifying units that + // are homogeneous with the fuzzy c-means technique. Also uses + // QuantizeColorSpace and Verbose image attributes + void segment(const double clusterThreshold_=1.0, + const double smoothingThreshold_=1.5); + + // Selectively blur pixels within a contrast threshold. It is similar to + // the unsharpen mask that sharpens everything with contrast above a + // certain threshold. + void selectiveBlur(const double radius_,const double sigma_, + const double threshold_); + void selectiveBlurChannel(const ChannelType channel_,const double radius_, + const double sigma_,const double threshold_); + + // Separates a channel from the image and returns it as a grayscale image. + Image separate(const ChannelType channel_) const; + + // Applies a special effect to the image, similar to the effect achieved in + // a photo darkroom by sepia toning. Threshold ranges from 0 to + // QuantumRange and is a measure of the extent of the sepia toning. + // A threshold of 80% is a good starting point for a reasonable tone. + void sepiaTone(const double threshold_); + + // Allocates a pixel cache region to store image pixels as defined + // by the region rectangle. This area is subsequently transferred + // from the pixel cache to the image via syncPixels. + PixelPacket *setPixels(const ::ssize_t x_,const ::ssize_t y_, + const size_t columns_,const size_t rows_); + + // Shade image using distant light source + void shade(const double azimuth_=30,const double elevation_=30, + const bool colorShading_=false); + + // Simulate an image shadow + void shadow(const double percent_opacity_=80.0,const double sigma_=0.5, + const ssize_t x_=5,const ssize_t y_=5); + + // Sharpen pixels in image + // The radius_ parameter specifies the radius of the Gaussian, in + // pixels, not counting the center pixel. The sigma_ parameter + // specifies the standard deviation of the Laplacian, in pixels. + void sharpen(const double radius_=0.0,const double sigma_=1.0); + void sharpenChannel(const ChannelType channel_,const double radius_=0.0, + const double sigma_=1.0); + + // Shave pixels from image edges. + void shave(const Geometry &geometry_); + + // Shear image (create parallelogram by sliding image by X or Y axis) + void shear(const double xShearAngle_,const double yShearAngle_); + + // adjust the image contrast with a non-linear sigmoidal contrast algorithm + void sigmoidalContrast(const size_t sharpen_,const double contrast, + const double midpoint=QuantumRange/2.0); + + // Image signature. Set force_ to true in order to re-calculate + // the signature regardless of whether the image data has been + // modified. + std::string signature(const bool force_=false) const; + + // Simulates a pencil sketch. We convolve the image with a Gaussian + // operator of the given radius and standard deviation (sigma). For + // reasonable results, radius should be larger than sigma. Use a + // radius of 0 and SketchImage() selects a suitable radius for you. + void sketch(const double radius_=0.0,const double sigma_=1.0, + const double angle_=0.0); + + // Solarize image (similar to effect seen when exposing a + // photographic film to light during the development process) + void solarize(const double factor_=50.0); + + // Sparse color image, given a set of coordinates, interpolates the colors + // found at those coordinates, across the whole image, using various + // methods. + void sparseColor(const ChannelType channel,const SparseColorMethod method, + const size_t number_arguments,const double *arguments); + + // Splice the background color into the image. + void splice(const Geometry &geometry_); + void splice(const Geometry &geometry_,const Color &backgroundColor_); + void splice(const Geometry &geometry_,const Color &backgroundColor_, + const GravityType gravity_); + + // Spread pixels randomly within image by specified ammount + void spread(const size_t amount_=3); + + void statistics(ImageStatistics *statistics) const; + + // Add a digital watermark to the image (based on second image) + void stegano(const Image &watermark_); + + // Create an image which appears in stereo when viewed with + // red-blue glasses (Red image on left, blue on right) + void stereo(const Image &rightImage_); + + // Strip strips an image of all profiles and comments. + void strip(void); + + // Search for the specified image at EVERY possible location in this image. + // This is slow! very very slow.. It returns a similarity image such that + // an exact match location is completely white and if none of the pixels + // match, black, otherwise some gray level in-between. + Image subImageSearch(const Image &reference_,const MetricType metric_, + Geometry *offset_,double *similarityMetric_, + const double similarityThreshold=(-1.0)); + + // Swirl image (image pixels are rotated by degrees) + void swirl(const double degrees_); + + // Transfers the image cache pixels to the image. + void syncPixels(void); + + // Channel a texture on image background + void texture(const Image &texture_); + + // Threshold image + void threshold(const double threshold_); + + // Resize image to thumbnail size + void thumbnail(const Geometry &geometry_); + + // Applies a color vector to each pixel in the image. The length of the + // vector is 0 for black and white and at its maximum for the midtones. + // The vector weighting function is f(x)=(1-(4.0*((x-0.5)*(x-0.5)))) + void tint(const std::string opacity_); + + // Transform image based on image and crop geometries + // Crop geometry is optional + void transform(const Geometry &imageGeometry_); + void transform(const Geometry &imageGeometry_, + const Geometry &cropGeometry_); + + // Origin of coordinate system to use when annotating with text or drawing + void transformOrigin(const double x_,const double y_); + + // Reset transformation parameters to default + void transformReset(void); + + // Scale to use when annotating with text or drawing + void transformScale(const double sx_,const double sy_); + + // Add matte image to image, setting pixels matching color to + // transparent + void transparent(const Color &color_); + + // Add matte image to image, for all the pixels that lies in between + // the given two color + void transparentChroma(const Color &colorLow_,const Color &colorHigh_); + + // Creates a horizontal mirror image by reflecting the pixels around the + // central y-axis while rotating them by 90 degrees. + void transpose(void); + + // Creates a vertical mirror image by reflecting the pixels around the + // central x-axis while rotating them by 270 degrees. + void transverse(void); + + // Trim edges that are the background color from the image + void trim(void); + + // Returns the unique colors of an image. + Image uniqueColors(void) const; + + // Replace image with a sharpened version of the original image + // using the unsharp mask algorithm. + // radius_ + // the radius of the Gaussian, in pixels, not counting the + // center pixel. + // sigma_ + // the standard deviation of the Gaussian, in pixels. + // amount_ + // the percentage of the difference between the original and + // the blur image that is added back into the original. + // threshold_ + // the threshold in pixels needed to apply the diffence amount. + void unsharpmask(const double radius_,const double sigma_, + const double amount_,const double threshold_); + void unsharpmaskChannel(const ChannelType channel_,const double radius_, + const double sigma_,const double amount_,const double threshold_); + + // Softens the edges of the image in vignette style. + void vignette(const double radius_=0.0,const double sigma_=1.0, + const ssize_t x_=0,const ssize_t y_=0); + + // Map image pixels to a sine wave + void wave(const double amplitude_=25.0,const double wavelength_=150.0); + + // Removes noise from the image using a wavelet transform. + void waveletDenoise(const double threshold_,const double softness_); + + // Forces all pixels above the threshold into white while leaving all + // pixels at or below the threshold unchanged. + void whiteThreshold(const std::string &threshold_); + void whiteThresholdChannel(const ChannelType channel_, + const std::string &threshold_); + + // Write single image frame to in-memory BLOB, with optional + // format and adjoin parameters. + void write(Blob *blob_); + void write(Blob *blob_,const std::string &magick_); + void write(Blob *blob_,const std::string &magick_,const size_t depth_); + + // Write single image frame to an array of pixels with storage + // type specified by user (DispatchImage), e.g. + // image.write( 0, 0, 640, 1, "RGB", 0, pixels ); + void write(const ::ssize_t x_,const ::ssize_t y_,const size_t columns_, + const size_t rows_,const std::string& map_,const StorageType type_, + void *pixels_); + + // Write single image frame to a file + void write(const std::string &imageSpec_); + + // Transfers one or more pixel components from the image pixel + // cache to a buffer or file. + // Used to support image encoders. + void writePixels(const QuantumType quantum_,unsigned char *destination_); + + // Zoom image to specified size. + void zoom(const Geometry &geometry_); + + ////////////////////////////////////////////////////////////////////// + // + // No user-serviceable parts beyond this point + // + ////////////////////////////////////////////////////////////////////// + + // Construct with MagickCore::Image and default options + Image(MagickCore::Image *image_); + + // Retrieve Image* + MagickCore::Image *&image(void); + const MagickCore::Image *constImage(void) const; + + // Retrieve ImageInfo* + MagickCore::ImageInfo *imageInfo(void); + const MagickCore::ImageInfo *constImageInfo(void) const; + + // Retrieve Options* + Options *options(void); + const Options *constOptions(void) const; + + // Retrieve QuantizeInfo* + MagickCore::QuantizeInfo *quantizeInfo(void); + const MagickCore::QuantizeInfo *constQuantizeInfo(void) const; + + // Prepare to update image (copy if reference > 1) + void modifyImage(void); + + // Replace current image (reference counted) + MagickCore::Image *replaceImage(MagickCore::Image *replacement_); + + // Test for ImageMagick error and throw exception if error + void throwImageException(void) const; + + private: + + void read(MagickCore::Image *image, + MagickCore::ExceptionInfo *exceptionInfo); + + void floodFill(const ssize_t x_,const ssize_t y_, + const Magick::Image *fillPattern_,const Color &fill_, + const MagickCore::PixelPacket *target,const bool invert_); + + ImageRef *_imgRef; + }; + +} // end of namespace Magick + +// +// Inlines +// + +inline Magick::ClassType Magick::Image::classType(void) const +{ + return static_cast(constImage()->storage_class); +} + +inline size_t Magick::Image::columns(void) const +{ + return constImage()->columns; +} + +inline void Magick::Image::lineWidth(const double lineWidth_) +{ + strokeWidth(lineWidth_); +} +inline double Magick::Image::lineWidth(void) const +{ + return strokeWidth(); +} + +inline void Magick::Image::reduceNoise(void) +{ + reduceNoise(3.0); +} + +inline size_t Magick::Image::rows(void) const +{ + return constImage()->rows; +} + +#endif // Magick_Image_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/ImageRef.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/ImageRef.h new file mode 100644 index 0000000..bb18299 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/ImageRef.h @@ -0,0 +1,77 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 +// Copyright Dirk Lemstra 2015 +// +// Definition of an Image reference +// +// This is a private implementation class which should never be +// referenced by any user code. +// + +#if !defined(Magick_ImageRef_header) +#define Magick_ImageRef_header + +#include "Magick++/Include.h" +#include "Magick++/Thread.h" + +namespace Magick +{ + class Options; + + // + // Reference counted access to Image * + // + class MagickPPExport ImageRef + { + friend class Image; + + private: + + // Construct with null image and default options + ImageRef(void); + + // Construct with an image pointer and default options + ImageRef(MagickCore::Image *image_); + + // Construct with an image pointer and options + ImageRef(MagickCore::Image *image_,const Options *options_); + + // Destroy image and options + ~ImageRef(void); + + // Copy constructor and assignment are not supported + ImageRef(const ImageRef&); + ImageRef& operator=(const ImageRef&); + + // Retrieve image from reference + void image(MagickCore::Image *image_); + MagickCore::Image *&image(void); + + // Retrieve Options from reference + void options(Options *options_); + Options *options(void); + + MagickCore::Image *_image; // ImageMagick Image + Options *_options; // User-specified options + ::ssize_t _refCount; // Reference count + MutexLock _mutexLock; // Mutex lock + }; + +} // end of namespace Magick + +// +// Inlines +// + +inline MagickCore::Image *&Magick::ImageRef::image(void) +{ + return(_image); +} + +inline Magick::Options *Magick::ImageRef::options(void) +{ + return(_options); +} + +#endif // Magick_ImageRef_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Include.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Include.h new file mode 100644 index 0000000..420f14e --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Include.h @@ -0,0 +1,1537 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 +// Copyright Dirk Lemstra 2013-2017 +// +// Inclusion of ImageMagick headers (with namespace magic) + +#ifndef Magick_Include_header +#define Magick_Include_header + +#if !defined(_MAGICK_CONFIG_H) +# define _MAGICK_CONFIG_H +# if !defined(vms) && !defined(macintosh) +# include "magick/magick-config.h" +# else +# include "magick-config.h" +# endif +# undef inline // Remove possible definition from config.h +# undef class +#endif + +// Needed for stdio FILE +#include +#include +#include +#include +#include +#include + +#include +#include + +#if defined(__BORLANDC__) +# include /* Borland C++ Builder 4.0 requirement */ +#endif // defined(__BORLANDC__) + +// +// Include ImageMagick headers into namespace "MagickCore". If +// MAGICKCORE_IMPLEMENTATION is defined, include ImageMagick development +// headers. This scheme minimizes the possibility of conflict with +// user code. +// +namespace MagickCore +{ +#include +#include +#undef inline // Remove possible definition from config.h + +#undef class +} + +// +// Provide appropriate DLL imports/exports for Visual C++, +// Borland C++Builder and MinGW builds. +// +#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__MINGW32__) +# define MagickCplusPlusDLLSupported +#endif +#if defined(MagickCplusPlusDLLSupported) +# if defined(_MT) && defined(_DLL) && !defined(_LIB) && !defined(STATIC_MAGICK) +// +// In a native Windows build, the following defines are used: +// +// _MT = Multithreaded +// _DLL = Using code is part of a DLL +// _LIB = Using code is being built as a library. +// _MAGICKMOD_ = Build uses loadable modules (Magick++ does not care about this) +// +// In the case where ImageMagick is built as a static library but the +// using code is dynamic, STATIC_MAGICK may be defined in the project to +// override triggering dynamic library behavior. +// +# if defined(_VISUALC_) +# define MagickDLLExplicitTemplate +# pragma warning( disable: 4273 ) /* Disable the stupid dll linkage warnings */ +# pragma warning( disable: 4251 ) +# endif +# if !defined(MAGICKCORE_IMPLEMENTATION) +# if defined(__GNUC__) +# define MagickPPExport __attribute__ ((dllimport)) +# else +# define MagickPPExport __declspec(dllimport) +# endif +# define MagickPPPrivate extern __declspec(dllimport) +# else +# if defined(__BORLANDC__) || defined(__MINGW32__) +# define MagickPPExport __declspec(dllexport) +# define MagickPPPrivate __declspec(dllexport) +# else +# if defined(__GNUC__) +# define MagickPPExport __attribute__ ((dllexport)) +# else +# define MagickPPExport __declspec(dllexport) +# endif +# define MagickPPPrivate extern __declspec(dllexport) +# endif +# endif +# else +# define MagickPPExport +# define MagickPPPrivate +# if defined(_MSC_VER) && defined(STATIC_MAGICK) && !defined(NOAUTOLINK_MAGICK) +# if defined(_DEBUG) +# if defined(MAGICKCORE_BZLIB_DELEGATE) +# pragma comment(lib, "CORE_DB_bzlib_.lib") +# endif +# if defined(MAGICKCORE_CAIRO_DELEGATE) +# pragma comment(lib, "CORE_DB_cairo_.lib") +# endif +# if defined(MAGICKCORE_OPENEXR_DELEGATE) +# pragma comment(lib, "CORE_DB_exr_.lib") +# endif +# if defined(MAGICKCORE_FLIF_DELEGATE) +# pragma comment(lib, "CORE_DB_flif_.lib") +# endif +# if defined(MAGICKCORE_JBIG_DELEGATE) +# pragma comment(lib, "CORE_DB_jbig_.lib") +# endif +# if defined(MAGICKCORE_JP2_DELEGATE) +# pragma comment(lib, "CORE_DB_jp2_.lib") +# endif +# if defined(MAGICKCORE_JPEG_DELEGATE) +# pragma comment(lib, "CORE_DB_jpeg-turbo_.lib") +# endif +# if defined(MAGICKCORE_LCMS_DELEGATE) +# pragma comment(lib, "CORE_DB_lcms_.lib") +# endif +# if defined(MAGICKCORE_HEIC_DELEGATE) +# pragma comment(lib, "CORE_DB_libde265_.lib") +# pragma comment(lib, "CORE_DB_libheif_.lib") +# endif +# if defined(MAGICKCORE_LZMA_DELEGATE) +# pragma comment(lib, "CORE_DB_lzma_.lib") +# endif +# if defined(MAGICKCORE_RAW_R_DELEGATE) +# pragma comment(lib, "CORE_DB_libraw_.lib") +# endif +# if defined(MAGICKCORE_RSVG_DELEGATE) +# pragma comment(lib, "CORE_DB_librsvg_.lib") +# endif +# if defined(MAGICKCORE_XML_DELEGATE) +# pragma comment(lib, "CORE_DB_libxml_.lib") +# endif +# if defined(MAGICKCORE_LQR_DELEGATE) +# pragma comment(lib, "CORE_DB_ffi_.lib") +# pragma comment(lib, "CORE_DB_glib_.lib") +# pragma comment(lib, "CORE_DB_lqr_.lib") +# pragma comment(lib, "winmm.lib") +# endif +# if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) +# pragma comment(lib, "CORE_DB_openjpeg_.lib") +# endif +# if defined(MAGICKCORE_PANGOCAIRO_DELEGATE) +# pragma comment(lib, "CORE_DB_pango_.lib") +# pragma comment(lib, "CORE_DB_pixman_.lib") +# endif +# if defined(MAGICKCORE_PNG_DELEGATE) +# pragma comment(lib, "CORE_DB_png_.lib") +# endif +# if defined(MAGICKCORE_RAQM_DELEGATE) +# pragma comment(lib, "CORE_DB_raqm_.lib") +# endif +# if defined(MAGICKCORE_TIFF_DELEGATE) +# pragma comment(lib, "CORE_DB_tiff_.lib") +# endif +# if defined(MAGICKCORE_FREETYPE_DELEGATE) +# pragma comment(lib, "CORE_DB_ttf_.lib") +# endif +# if defined(MAGICKCORE_WEBP_DELEGATE) +# pragma comment(lib, "CORE_DB_webp_.lib") +# endif +# if defined(MAGICKCORE_ZLIB_DELEGATE) +# pragma comment(lib, "CORE_DB_zlib_.lib") +# endif +# pragma comment(lib, "CORE_DB_coders_.lib") +# pragma comment(lib, "CORE_DB_filters_.lib") +# pragma comment(lib, "CORE_DB_Magick++_.lib") +# pragma comment(lib, "CORE_DB_MagickCore_.lib") +# pragma comment(lib, "CORE_DB_MagickWand_.lib") +# else +# if defined(MAGICKCORE_BZLIB_DELEGATE) +# pragma comment(lib, "CORE_RL_bzlib_.lib") +# endif +# if defined(MAGICKCORE_CAIRO_DELEGATE) +# pragma comment(lib, "CORE_RL_cairo_.lib") +# endif +# if defined(MAGICKCORE_OPENEXR_DELEGATE) +# pragma comment(lib, "CORE_RL_exr_.lib") +# endif +# if defined(MAGICKCORE_FLIF_DELEGATE) +# pragma comment(lib, "CORE_RL_flif_.lib") +# endif +# if defined(MAGICKCORE_JBIG_DELEGATE) +# pragma comment(lib, "CORE_RL_jbig_.lib") +# endif +# if defined(MAGICKCORE_JP2_DELEGATE) +# pragma comment(lib, "CORE_RL_jp2_.lib") +# endif +# if defined(MAGICKCORE_JPEG_DELEGATE) +# pragma comment(lib, "CORE_RL_jpeg-turbo_.lib") +# endif +# if defined(MAGICKCORE_LCMS_DELEGATE) +# pragma comment(lib, "CORE_RL_lcms_.lib") +# endif +# if defined(MAGICKCORE_HEIC_DELEGATE) +# pragma comment(lib, "CORE_RL_libde265_.lib") +# pragma comment(lib, "CORE_RL_libheif_.lib") +# endif +# if defined(MAGICKCORE_LZMA_DELEGATE) +# pragma comment(lib, "CORE_RL_lzma_.lib") +# endif +# if defined(MAGICKCORE_RAW_R_DELEGATE) +# pragma comment(lib, "CORE_RL_libraw_.lib") +# endif +# if defined(MAGICKCORE_RSVG_DELEGATE) +# pragma comment(lib, "CORE_RL_librsvg_.lib") +# endif +# if defined(MAGICKCORE_XML_DELEGATE) +# pragma comment(lib, "CORE_RL_libxml_.lib") +# endif +# if defined(MAGICKCORE_LQR_DELEGATE) +# pragma comment(lib, "CORE_RL_ffi_.lib") +# pragma comment(lib, "CORE_RL_glib_.lib") +# pragma comment(lib, "CORE_RL_lqr_.lib") +# pragma comment(lib, "winmm.lib") +# endif +# if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) +# pragma comment(lib, "CORE_RL_openjpeg_.lib") +# endif +# if defined(MAGICKCORE_PANGOCAIRO_DELEGATE) +# pragma comment(lib, "CORE_RL_pango_.lib") +# pragma comment(lib, "CORE_RL_pixman_.lib") +# endif +# if defined(MAGICKCORE_PNG_DELEGATE) +# pragma comment(lib, "CORE_RL_png_.lib") +# endif +# if defined(MAGICKCORE_RAQM_DELEGATE) +# pragma comment(lib, "CORE_RL_raqm_.lib") +# endif +# if defined(MAGICKCORE_TIFF_DELEGATE) +# pragma comment(lib, "CORE_RL_tiff_.lib") +# endif +# if defined(MAGICKCORE_FREETYPE_DELEGATE) +# pragma comment(lib, "CORE_RL_ttf_.lib") +# endif +# if defined(MAGICKCORE_WEBP_DELEGATE) +# pragma comment(lib, "CORE_RL_webp_.lib") +# endif +# if defined(MAGICKCORE_ZLIB_DELEGATE) +# pragma comment(lib, "CORE_RL_zlib_.lib") +# endif +# pragma comment(lib, "CORE_RL_coders_.lib") +# pragma comment(lib, "CORE_RL_filters_.lib") +# pragma comment(lib, "CORE_RL_Magick++_.lib") +# pragma comment(lib, "CORE_RL_magick_.lib") +# pragma comment(lib, "CORE_RL_wand_.lib") +# endif +# if defined(_WIN32_WCE) +# pragma comment(lib, "wsock32.lib") +# else +# pragma comment(lib, "ws2_32.lib") +# endif +# pragma comment(lib, "urlmon.lib") +# endif +# endif +#else +# if __GNUC__ >= 4 +# define MagickPPExport __attribute__ ((visibility ("default"))) +# define MagickPPPrivate __attribute__ ((visibility ("hidden"))) +# else +# define MagickPPExport +# define MagickPPPrivate +# endif +#endif + +#if (defined(WIN32) || defined(WIN64)) && defined(_VISUALC_) +# pragma warning(disable : 4996) /* function deprecation warnings */ +#endif + +// +// Import ImageMagick symbols and types which are used as part of the +// Magick++ API definition into namespace "Magick". +// +namespace Magick +{ + // The datatype for an RGB component + using MagickCore::Quantum; + using MagickCore::MagickRealType; + using MagickCore::MagickSizeType; + + // Boolean types + using MagickCore::MagickBooleanType; + using MagickCore::MagickFalse; + using MagickCore::MagickTrue; + + // Alpha channel types + using MagickCore::AlphaChannelType; + using MagickCore::UndefinedAlphaChannel; + using MagickCore::ActivateAlphaChannel; + using MagickCore::BackgroundAlphaChannel; + using MagickCore::CopyAlphaChannel; + using MagickCore::DeactivateAlphaChannel; + using MagickCore::ExtractAlphaChannel; + using MagickCore::OpaqueAlphaChannel; + using MagickCore::SetAlphaChannel; + using MagickCore::ShapeAlphaChannel; + using MagickCore::TransparentAlphaChannel; + using MagickCore::FlattenAlphaChannel; + using MagickCore::RemoveAlphaChannel; + using MagickCore::AssociateAlphaChannel; + using MagickCore::DisassociateAlphaChannel; + + // Image class types + using MagickCore::ClassType; + using MagickCore::UndefinedClass; + using MagickCore::DirectClass; + using MagickCore::PseudoClass; + + // Channel types + using MagickCore::ChannelType; + using MagickCore::UndefinedChannel; + using MagickCore::RedChannel; + using MagickCore::GrayChannel; + using MagickCore::CyanChannel; + using MagickCore::GreenChannel; + using MagickCore::MagentaChannel; + using MagickCore::BlueChannel; + using MagickCore::YellowChannel; + using MagickCore::AlphaChannel; + using MagickCore::OpacityChannel; + using MagickCore::MatteChannel; /* deprecated */ + using MagickCore::BlackChannel; + using MagickCore::IndexChannel; + using MagickCore::CompositeChannels; + using MagickCore::AllChannels; + using MagickCore::TrueAlphaChannel; + using MagickCore::RGBChannels; + using MagickCore::GrayChannels; + using MagickCore::SyncChannels; + using MagickCore::DefaultChannels; + + // Color-space types + using MagickCore::ColorspaceType; + using MagickCore::UndefinedColorspace; + using MagickCore::CMYColorspace; + using MagickCore::CMYKColorspace; + using MagickCore::GRAYColorspace; + using MagickCore::HCLColorspace; + using MagickCore::HCLpColorspace; + using MagickCore::HSBColorspace; + using MagickCore::HSIColorspace; + using MagickCore::HSLColorspace; + using MagickCore::HSVColorspace; + using MagickCore::HWBColorspace; + using MagickCore::LabColorspace; + using MagickCore::LCHColorspace; + using MagickCore::LCHabColorspace; + using MagickCore::LCHuvColorspace; + using MagickCore::LogColorspace; + using MagickCore::LMSColorspace; + using MagickCore::LuvColorspace; + using MagickCore::OHTAColorspace; + using MagickCore::Rec601LumaColorspace; + using MagickCore::Rec601YCbCrColorspace; + using MagickCore::Rec709LumaColorspace; + using MagickCore::Rec709YCbCrColorspace; + using MagickCore::RGBColorspace; + using MagickCore::scRGBColorspace; + using MagickCore::sRGBColorspace; + using MagickCore::TransparentColorspace; + using MagickCore::XYZColorspace; + using MagickCore::YCbCrColorspace; + using MagickCore::YCCColorspace; + using MagickCore::YDbDrColorspace; + using MagickCore::YIQColorspace; + using MagickCore::YPbPrColorspace; + using MagickCore::YUVColorspace; + using MagickCore::xyYColorspace; + + // Command options + using MagickCore::CommandOption; + using MagickCore::MagickDirectionOptions; + using MagickCore::MagickGravityOptions; + using MagickCore::MagickKernelOptions; + using MagickCore::MagickStyleOptions; + + // Composition operations + using MagickCore::CompositeOperator; + using MagickCore::UndefinedCompositeOp; + using MagickCore::NoCompositeOp; + using MagickCore::ModulusAddCompositeOp; + using MagickCore::AtopCompositeOp; + using MagickCore::BlendCompositeOp; + using MagickCore::BumpmapCompositeOp; + using MagickCore::ChangeMaskCompositeOp; + using MagickCore::ClearCompositeOp; + using MagickCore::ColorBurnCompositeOp; + using MagickCore::ColorDodgeCompositeOp; + using MagickCore::ColorizeCompositeOp; + using MagickCore::CopyBlackCompositeOp; + using MagickCore::CopyBlueCompositeOp; + using MagickCore::CopyCompositeOp; + using MagickCore::CopyCyanCompositeOp; + using MagickCore::CopyGreenCompositeOp; + using MagickCore::CopyMagentaCompositeOp; + using MagickCore::CopyOpacityCompositeOp; + using MagickCore::CopyRedCompositeOp; + using MagickCore::CopyYellowCompositeOp; + using MagickCore::DarkenCompositeOp; + using MagickCore::DstAtopCompositeOp; + using MagickCore::DstCompositeOp; + using MagickCore::DstInCompositeOp; + using MagickCore::DstOutCompositeOp; + using MagickCore::DstOverCompositeOp; + using MagickCore::DifferenceCompositeOp; + using MagickCore::DisplaceCompositeOp; + using MagickCore::DissolveCompositeOp; + using MagickCore::ExclusionCompositeOp; + using MagickCore::HardLightCompositeOp; + using MagickCore::HardMixCompositeOp; + using MagickCore::HueCompositeOp; + using MagickCore::InCompositeOp; + using MagickCore::LightenCompositeOp; + using MagickCore::LinearLightCompositeOp; + using MagickCore::LuminizeCompositeOp; + using MagickCore::MinusDstCompositeOp; + using MagickCore::ModulateCompositeOp; + using MagickCore::MultiplyCompositeOp; + using MagickCore::OutCompositeOp; + using MagickCore::OverCompositeOp; + using MagickCore::OverlayCompositeOp; + using MagickCore::PlusCompositeOp; + using MagickCore::ReplaceCompositeOp; + using MagickCore::SaturateCompositeOp; + using MagickCore::ScreenCompositeOp; + using MagickCore::SoftLightCompositeOp; + using MagickCore::SrcAtopCompositeOp; + using MagickCore::SrcCompositeOp; + using MagickCore::SrcInCompositeOp; + using MagickCore::SrcOutCompositeOp; + using MagickCore::SrcOverCompositeOp; + using MagickCore::ModulusSubtractCompositeOp; + using MagickCore::ThresholdCompositeOp; + using MagickCore::XorCompositeOp; + using MagickCore::DivideDstCompositeOp; + using MagickCore::DistortCompositeOp; + using MagickCore::BlurCompositeOp; + using MagickCore::PegtopLightCompositeOp; + using MagickCore::VividLightCompositeOp; + using MagickCore::PinLightCompositeOp; + using MagickCore::LinearDodgeCompositeOp; + using MagickCore::LinearBurnCompositeOp; + using MagickCore::MathematicsCompositeOp; + using MagickCore::DivideSrcCompositeOp; + using MagickCore::MinusSrcCompositeOp; + using MagickCore::DarkenIntensityCompositeOp; + using MagickCore::LightenIntensityCompositeOp; + using MagickCore::AddCompositeOp; + using MagickCore::SubtractCompositeOp; + using MagickCore::MinusCompositeOp; + using MagickCore::DivideCompositeOp; + + // Compression algorithms + using MagickCore::CompressionType; + using MagickCore::UndefinedCompression; + using MagickCore::NoCompression; + using MagickCore::B44ACompression; + using MagickCore::B44Compression; + using MagickCore::BZipCompression; + using MagickCore::DXT1Compression; + using MagickCore::DXT3Compression; + using MagickCore::DXT5Compression; + using MagickCore::FaxCompression; + using MagickCore::Group4Compression; + using MagickCore::JBIG1Compression; + using MagickCore::JBIG2Compression; + using MagickCore::JPEG2000Compression; + using MagickCore::JPEGCompression; + using MagickCore::LosslessJPEGCompression; + using MagickCore::LZMACompression; + using MagickCore::LZWCompression; + using MagickCore::PizCompression; + using MagickCore::Pxr24Compression; + using MagickCore::RLECompression; + using MagickCore::WebPCompression; + using MagickCore::ZipCompression; + using MagickCore::ZipSCompression; + using MagickCore::ZstdCompression; + + // Decoration types + using MagickCore::DecorationType; + using MagickCore::UndefinedDecoration; + using MagickCore::NoDecoration; + using MagickCore::UnderlineDecoration; + using MagickCore::OverlineDecoration; + using MagickCore::LineThroughDecoration; + + // Direction types + using MagickCore::DirectionType; + using MagickCore::UndefinedDirection; + using MagickCore::RightToLeftDirection; + using MagickCore::LeftToRightDirection; + + // Dispose methods + using MagickCore::DisposeType; + using MagickCore::UndefinedDispose; + using MagickCore::NoneDispose; + using MagickCore::BackgroundDispose; + using MagickCore::PreviousDispose; + + // Distort methods + using MagickCore::DistortImageMethod; + using MagickCore::UndefinedDistortion; + using MagickCore::AffineDistortion; + using MagickCore::AffineProjectionDistortion; + using MagickCore::ScaleRotateTranslateDistortion; + using MagickCore::PerspectiveDistortion; + using MagickCore::PerspectiveProjectionDistortion; + using MagickCore::BilinearForwardDistortion; + using MagickCore::BilinearDistortion; + using MagickCore::BilinearReverseDistortion; + using MagickCore::PolynomialDistortion; + using MagickCore::ArcDistortion; + using MagickCore::PolarDistortion; + using MagickCore::DePolarDistortion; + using MagickCore::Cylinder2PlaneDistortion; + using MagickCore::Plane2CylinderDistortion; + using MagickCore::BarrelDistortion; + using MagickCore::BarrelInverseDistortion; + using MagickCore::ShepardsDistortion; + using MagickCore::ResizeDistortion; + using MagickCore::SentinelDistortion; + + // Dither methods + using MagickCore::DitherMethod; + using MagickCore::UndefinedDitherMethod; + using MagickCore::NoDitherMethod; + using MagickCore::RiemersmaDitherMethod; + using MagickCore::FloydSteinbergDitherMethod; + + // Endian options + using MagickCore::EndianType; + using MagickCore::UndefinedEndian; + using MagickCore::LSBEndian; + using MagickCore::MSBEndian; + + // Evaluate options + using MagickCore::MagickEvaluateOperator; + using MagickCore::UndefinedEvaluateOperator; + using MagickCore::AddEvaluateOperator; + using MagickCore::AndEvaluateOperator; + using MagickCore::DivideEvaluateOperator; + using MagickCore::LeftShiftEvaluateOperator; + using MagickCore::MaxEvaluateOperator; + using MagickCore::MinEvaluateOperator; + using MagickCore::MultiplyEvaluateOperator; + using MagickCore::OrEvaluateOperator; + using MagickCore::RightShiftEvaluateOperator; + using MagickCore::SetEvaluateOperator; + using MagickCore::SubtractEvaluateOperator; + using MagickCore::XorEvaluateOperator; + using MagickCore::PowEvaluateOperator; + using MagickCore::LogEvaluateOperator; + using MagickCore::ThresholdEvaluateOperator; + using MagickCore::ThresholdBlackEvaluateOperator; + using MagickCore::ThresholdWhiteEvaluateOperator; + using MagickCore::GaussianNoiseEvaluateOperator; + using MagickCore::ImpulseNoiseEvaluateOperator; + using MagickCore::LaplacianNoiseEvaluateOperator; + using MagickCore::MultiplicativeNoiseEvaluateOperator; + using MagickCore::PoissonNoiseEvaluateOperator; + using MagickCore::UniformNoiseEvaluateOperator; + using MagickCore::CosineEvaluateOperator; + using MagickCore::SineEvaluateOperator; + using MagickCore::AddModulusEvaluateOperator; + using MagickCore::MeanEvaluateOperator; + using MagickCore::AbsEvaluateOperator; + using MagickCore::ExponentialEvaluateOperator; + using MagickCore::MedianEvaluateOperator; + using MagickCore::SumEvaluateOperator; + using MagickCore::RootMeanSquareEvaluateOperator; + + // Fill rules + using MagickCore::FillRule; + using MagickCore::UndefinedRule; + using MagickCore::EvenOddRule; + using MagickCore::NonZeroRule; + + // Filter types + using MagickCore::FilterTypes; + using MagickCore::UndefinedFilter; + using MagickCore::PointFilter; + using MagickCore::BoxFilter; + using MagickCore::TriangleFilter; + using MagickCore::HermiteFilter; + using MagickCore::HanningFilter; + using MagickCore::HammingFilter; + using MagickCore::BlackmanFilter; + using MagickCore::GaussianFilter; + using MagickCore::QuadraticFilter; + using MagickCore::CubicFilter; + using MagickCore::CatromFilter; + using MagickCore::MitchellFilter; + using MagickCore::JincFilter; + using MagickCore::SincFilter; + using MagickCore::SincFastFilter; + using MagickCore::KaiserFilter; + using MagickCore::WelshFilter; + using MagickCore::ParzenFilter; + using MagickCore::BohmanFilter; + using MagickCore::BartlettFilter; + using MagickCore::LagrangeFilter; + using MagickCore::LanczosFilter; + using MagickCore::LanczosSharpFilter; + using MagickCore::Lanczos2Filter; + using MagickCore::Lanczos2SharpFilter; + using MagickCore::RobidouxFilter; + using MagickCore::RobidouxSharpFilter; + using MagickCore::CosineFilter; + using MagickCore::SplineFilter; + using MagickCore::LanczosRadiusFilter; + using MagickCore::SentinelFilter; + + // Bit gravity + using MagickCore::GravityType; + using MagickCore::UndefinedGravity; + using MagickCore::ForgetGravity; + using MagickCore::NorthWestGravity; + using MagickCore::NorthGravity; + using MagickCore::NorthEastGravity; + using MagickCore::WestGravity; + using MagickCore::CenterGravity; + using MagickCore::EastGravity; + using MagickCore::SouthWestGravity; + using MagickCore::SouthGravity; + using MagickCore::SouthEastGravity; + using MagickCore::StaticGravity; + + // Image types + using MagickCore::ImageType; + using MagickCore::UndefinedType; + using MagickCore::BilevelType; + using MagickCore::GrayscaleType; + using MagickCore::GrayscaleMatteType; + using MagickCore::PaletteType; + using MagickCore::PaletteMatteType; + using MagickCore::TrueColorType; + using MagickCore::TrueColorMatteType; + using MagickCore::ColorSeparationType; + using MagickCore::ColorSeparationMatteType; + using MagickCore::OptimizeType; + using MagickCore::PaletteBilevelMatteType; + + // Interlace types + using MagickCore::InterlaceType; + using MagickCore::UndefinedInterlace; + using MagickCore::NoInterlace; + using MagickCore::LineInterlace; + using MagickCore::PlaneInterlace; + using MagickCore::PartitionInterlace; + using MagickCore::GIFInterlace; + using MagickCore::JPEGInterlace; + using MagickCore::PNGInterlace; + + // Pixel interpolation methods + using MagickCore::InterpolatePixelMethod; + using MagickCore::UndefinedInterpolatePixel; + using MagickCore::AverageInterpolatePixel; + using MagickCore::BicubicInterpolatePixel; + using MagickCore::BilinearInterpolatePixel; + using MagickCore::FilterInterpolatePixel; + using MagickCore::IntegerInterpolatePixel; + using MagickCore::MeshInterpolatePixel; + using MagickCore::NearestNeighborInterpolatePixel; + using MagickCore::SplineInterpolatePixel; + using MagickCore::Average9InterpolatePixel; + using MagickCore::Average16InterpolatePixel; + using MagickCore::BlendInterpolatePixel; + using MagickCore::BackgroundInterpolatePixel; + using MagickCore::CatromInterpolatePixel; + + // Layer method + using MagickCore::ImageLayerMethod; + using MagickCore::UndefinedLayer; + using MagickCore::CoalesceLayer; + using MagickCore::CompareAnyLayer; + using MagickCore::CompareClearLayer; + using MagickCore::CompareOverlayLayer; + using MagickCore::DisposeLayer; + using MagickCore::OptimizeLayer; + using MagickCore::OptimizeImageLayer; + using MagickCore::OptimizePlusLayer; + using MagickCore::OptimizeTransLayer; + using MagickCore::RemoveDupsLayer; + using MagickCore::RemoveZeroLayer; + using MagickCore::CompositeLayer; + using MagickCore::MergeLayer; + using MagickCore::FlattenLayer; + using MagickCore::MosaicLayer; + using MagickCore::TrimBoundsLayer; + + // Built-in kernels + using MagickCore::KernelInfoType; + using MagickCore::UndefinedKernel; + using MagickCore::UnityKernel; + using MagickCore::GaussianKernel; + using MagickCore::DoGKernel; + using MagickCore::LoGKernel; + using MagickCore::BlurKernel; + using MagickCore::CometKernel; + using MagickCore::LaplacianKernel; + using MagickCore::SobelKernel; + using MagickCore::FreiChenKernel; + using MagickCore::RobertsKernel; + using MagickCore::PrewittKernel; + using MagickCore::CompassKernel; + using MagickCore::KirschKernel; + using MagickCore::DiamondKernel; + using MagickCore::SquareKernel; + using MagickCore::RectangleKernel; + using MagickCore::OctagonKernel; + using MagickCore::DiskKernel; + using MagickCore::PlusKernel; + using MagickCore::CrossKernel; + using MagickCore::RingKernel; + using MagickCore::PeaksKernel; + using MagickCore::EdgesKernel; + using MagickCore::CornersKernel; + using MagickCore::DiagonalsKernel; + using MagickCore::LineEndsKernel; + using MagickCore::LineJunctionsKernel; + using MagickCore::RidgesKernel; + using MagickCore::ConvexHullKernel; + using MagickCore::ThinSEKernel; + using MagickCore::SkeletonKernel; + using MagickCore::ChebyshevKernel; + using MagickCore::ManhattanKernel; + using MagickCore::OctagonalKernel; + using MagickCore::EuclideanKernel; + using MagickCore::UserDefinedKernel; + using MagickCore::BinomialKernel; + + // Line cap types + using MagickCore::LineCap; + using MagickCore::UndefinedCap; + using MagickCore::ButtCap; + using MagickCore::RoundCap; + using MagickCore::SquareCap; + + // Line join types + using MagickCore::LineJoin; + using MagickCore::UndefinedJoin; + using MagickCore::MiterJoin; + using MagickCore::RoundJoin; + using MagickCore::BevelJoin; + + // Log event types + using MagickCore::LogEventType; + using MagickCore::UndefinedEvents; + using MagickCore::NoEvents; + using MagickCore::TraceEvent; + using MagickCore::AnnotateEvent; + using MagickCore::BlobEvent; + using MagickCore::CacheEvent; + using MagickCore::CoderEvent; + using MagickCore::ConfigureEvent; + using MagickCore::DeprecateEvent; + using MagickCore::DrawEvent; + using MagickCore::ExceptionEvent; + using MagickCore::ImageEvent; + using MagickCore::LocaleEvent; + using MagickCore::ModuleEvent; + using MagickCore::PolicyEvent; + using MagickCore::ResourceEvent; + using MagickCore::TransformEvent; + using MagickCore::UserEvent; + using MagickCore::WandEvent; + using MagickCore::X11Event; + using MagickCore::AccelerateEvent; + using MagickCore::AllEvents; + + // Magick functions + using MagickCore::MagickFunction; + using MagickCore::UndefinedFunction; + using MagickCore::ArcsinFunction; + using MagickCore::ArctanFunction; + using MagickCore::PolynomialFunction; + using MagickCore::SinusoidFunction; + + // Metric types + using MagickCore::MetricType; + using MagickCore::UndefinedMetric; + using MagickCore::AbsoluteErrorMetric; + using MagickCore::MeanAbsoluteErrorMetric; + using MagickCore::MeanErrorPerPixelMetric; + using MagickCore::MeanSquaredErrorMetric; + using MagickCore::PeakAbsoluteErrorMetric; + using MagickCore::PeakSignalToNoiseRatioMetric; + using MagickCore::RootMeanSquaredErrorMetric; + using MagickCore::NormalizedCrossCorrelationErrorMetric; + using MagickCore::FuzzErrorMetric; + using MagickCore::UndefinedErrorMetric; + using MagickCore::PerceptualHashErrorMetric; + + // Morphology methods + using MagickCore::MorphologyMethod; + using MagickCore::UndefinedMorphology; + using MagickCore::ConvolveMorphology; + using MagickCore::CorrelateMorphology; + using MagickCore::ErodeMorphology; + using MagickCore::DilateMorphology; + using MagickCore::ErodeIntensityMorphology; + using MagickCore::DilateIntensityMorphology; + using MagickCore::DistanceMorphology; + using MagickCore::OpenMorphology; + using MagickCore::CloseMorphology; + using MagickCore::OpenIntensityMorphology; + using MagickCore::CloseIntensityMorphology; + using MagickCore::SmoothMorphology; + using MagickCore::EdgeInMorphology; + using MagickCore::EdgeOutMorphology; + using MagickCore::EdgeMorphology; + using MagickCore::TopHatMorphology; + using MagickCore::BottomHatMorphology; + using MagickCore::HitAndMissMorphology; + using MagickCore::ThinningMorphology; + using MagickCore::ThickenMorphology; + using MagickCore::VoronoiMorphology; + using MagickCore::IterativeDistanceMorphology; + + // Noise types + using MagickCore::NoiseType; + using MagickCore::UndefinedNoise; + using MagickCore::UniformNoise; + using MagickCore::GaussianNoise; + using MagickCore::MultiplicativeGaussianNoise; + using MagickCore::ImpulseNoise; + using MagickCore::LaplacianNoise; + using MagickCore::PoissonNoise; + + // Orientation types + using MagickCore::OrientationType; + using MagickCore::UndefinedOrientation; + using MagickCore::TopLeftOrientation; + using MagickCore::TopRightOrientation; + using MagickCore::BottomRightOrientation; + using MagickCore::BottomLeftOrientation; + using MagickCore::LeftTopOrientation; + using MagickCore::RightTopOrientation; + using MagickCore::RightBottomOrientation; + using MagickCore::LeftBottomOrientation; + + // Paint methods + using MagickCore::PaintMethod; + using MagickCore::UndefinedMethod; + using MagickCore::PointMethod; + using MagickCore::ReplaceMethod; + using MagickCore::FloodfillMethod; + using MagickCore::FillToBorderMethod; + using MagickCore::ResetMethod; + + // Pixel intensity method + using MagickCore::PixelIntensityMethod; + using MagickCore::UndefinedPixelIntensityMethod; + using MagickCore::AveragePixelIntensityMethod; + using MagickCore::BrightnessPixelIntensityMethod; + using MagickCore::LightnessPixelIntensityMethod; + using MagickCore::Rec601LumaPixelIntensityMethod; + using MagickCore::Rec601LuminancePixelIntensityMethod; + using MagickCore::Rec709LumaPixelIntensityMethod; + using MagickCore::Rec709LuminancePixelIntensityMethod; + using MagickCore::RMSPixelIntensityMethod; + using MagickCore::MSPixelIntensityMethod; + + // PixelPacket structure + using MagickCore::PixelPacket; + + // Preview types. Not currently used by Magick++ + using MagickCore::PreviewType; + using MagickCore::UndefinedPreview; + using MagickCore::RotatePreview; + using MagickCore::ShearPreview; + using MagickCore::RollPreview; + using MagickCore::HuePreview; + using MagickCore::SaturationPreview; + using MagickCore::BrightnessPreview; + using MagickCore::GammaPreview; + using MagickCore::SpiffPreview; + using MagickCore::DullPreview; + using MagickCore::GrayscalePreview; + using MagickCore::QuantizePreview; + using MagickCore::DespecklePreview; + using MagickCore::ReduceNoisePreview; + using MagickCore::AddNoisePreview; + using MagickCore::SharpenPreview; + using MagickCore::BlurPreview; + using MagickCore::ThresholdPreview; + using MagickCore::EdgeDetectPreview; + using MagickCore::SpreadPreview; + using MagickCore::SolarizePreview; + using MagickCore::ShadePreview; + using MagickCore::RaisePreview; + using MagickCore::SegmentPreview; + using MagickCore::SwirlPreview; + using MagickCore::ImplodePreview; + using MagickCore::WavePreview; + using MagickCore::OilPaintPreview; + using MagickCore::CharcoalDrawingPreview; + using MagickCore::JPEGPreview; + + // Quantum types + using MagickCore::QuantumType; + using MagickCore::IndexQuantum; + using MagickCore::GrayQuantum; + using MagickCore::IndexAlphaQuantum; + using MagickCore::GrayAlphaQuantum; + using MagickCore::RedQuantum; + using MagickCore::CyanQuantum; + using MagickCore::GreenQuantum; + using MagickCore::YellowQuantum; + using MagickCore::BlueQuantum; + using MagickCore::MagentaQuantum; + using MagickCore::AlphaQuantum; + using MagickCore::BlackQuantum; + using MagickCore::RGBQuantum; + using MagickCore::RGBAQuantum; + using MagickCore::CMYKQuantum; + + // Rendering intents + using MagickCore::RenderingIntent; + using MagickCore::UndefinedIntent; + using MagickCore::SaturationIntent; + using MagickCore::PerceptualIntent; + using MagickCore::AbsoluteIntent; + using MagickCore::RelativeIntent; + + // Resource types + using MagickCore::ResourceType; + using MagickCore::AreaResource; + using MagickCore::DiskResource; + using MagickCore::FileResource; + using MagickCore::MapResource; + using MagickCore::MemoryResource; + using MagickCore::ThreadResource; + using MagickCore::TimeResource; + using MagickCore::ThrottleResource; + using MagickCore::WidthResource; + using MagickCore::HeightResource; + using MagickCore::ListLengthResource; + + // Resolution units + using MagickCore::ResolutionType; + using MagickCore::UndefinedResolution; + using MagickCore::PixelsPerInchResolution; + using MagickCore::PixelsPerCentimeterResolution; + + // IndexPacket type + using MagickCore::IndexPacket; + + // Sparse Color methods + using MagickCore::SparseColorMethod; + using MagickCore::UndefinedColorInterpolate; + using MagickCore::BarycentricColorInterpolate; + using MagickCore::BilinearColorInterpolate; + using MagickCore::PolynomialColorInterpolate; + using MagickCore::ShepardsColorInterpolate; + using MagickCore::VoronoiColorInterpolate; + using MagickCore::InverseColorInterpolate; + using MagickCore::ManhattanColorInterpolate; + + // Statistic type + using MagickCore::MedianStatistic; + using MagickCore::NonpeakStatistic; + + // StorageType type + using MagickCore::StorageType; + using MagickCore::UndefinedPixel; + using MagickCore::CharPixel; + using MagickCore::DoublePixel; + using MagickCore::FloatPixel; + using MagickCore::IntegerPixel; + using MagickCore::LongPixel; + using MagickCore::QuantumPixel; + using MagickCore::ShortPixel; + + // StretchType type + using MagickCore::StretchType; + using MagickCore::UndefinedStretch; + using MagickCore::NormalStretch; + using MagickCore::UltraCondensedStretch; + using MagickCore::ExtraCondensedStretch; + using MagickCore::CondensedStretch; + using MagickCore::SemiCondensedStretch; + using MagickCore::SemiExpandedStretch; + using MagickCore::ExpandedStretch; + using MagickCore::ExtraExpandedStretch; + using MagickCore::UltraExpandedStretch; + using MagickCore::AnyStretch; + + // StyleType type + using MagickCore::StyleType; + using MagickCore::UndefinedStyle; + using MagickCore::NormalStyle; + using MagickCore::ItalicStyle; + using MagickCore::ObliqueStyle; + using MagickCore::AnyStyle; + + // Virtual pixel methods + using MagickCore::VirtualPixelMethod; + using MagickCore::UndefinedVirtualPixelMethod; + using MagickCore::BackgroundVirtualPixelMethod; + using MagickCore::DitherVirtualPixelMethod; + using MagickCore::EdgeVirtualPixelMethod; + using MagickCore::MirrorVirtualPixelMethod; + using MagickCore::RandomVirtualPixelMethod; + using MagickCore::TileVirtualPixelMethod; + using MagickCore::TransparentVirtualPixelMethod; + using MagickCore::MaskVirtualPixelMethod; + using MagickCore::BlackVirtualPixelMethod; + using MagickCore::GrayVirtualPixelMethod; + using MagickCore::WhiteVirtualPixelMethod; + using MagickCore::HorizontalTileVirtualPixelMethod; + using MagickCore::VerticalTileVirtualPixelMethod; + using MagickCore::HorizontalTileEdgeVirtualPixelMethod; + using MagickCore::VerticalTileEdgeVirtualPixelMethod; + using MagickCore::CheckerTileVirtualPixelMethod; + +#if defined(MAGICKCORE_IMPLEMENTATION) + // + // ImageMagick symbols used in implementation code + // + using MagickCore::AcquireExceptionInfo; + using MagickCore::AcquireCacheView; + using MagickCore::AcquireDrawingWand; + using MagickCore::AcquireImage; + using MagickCore::AcquireKernelInfo; + using MagickCore::AcquireMagickMemory; + using MagickCore::AcquireQuantumInfo; + using MagickCore::AcquireString; + using MagickCore::AcquireStringInfo; + using MagickCore::AcquireVirtualCacheView; + using MagickCore::AdaptiveBlurImage; + using MagickCore::AdaptiveResizeImage; + using MagickCore::AdaptiveSharpenImage; + using MagickCore::AdaptiveSharpenImageChannel; + using MagickCore::AdaptiveThresholdImage; + using MagickCore::AddNoiseImage; + using MagickCore::AddNoiseImageChannel; + using MagickCore::AffineMatrix; + using MagickCore::AffineTransformImage; + using MagickCore::AnnotateImage; + using MagickCore::AreaValue; + using MagickCore::AspectValue; + using MagickCore::AutoGammaImage; + using MagickCore::AutoGammaImageChannel; + using MagickCore::AutoLevelImage; + using MagickCore::AutoLevelImageChannel; + using MagickCore::AutoOrientImage; + using MagickCore::Base64Decode; + using MagickCore::Base64Encode; + using MagickCore::BilevelImage; + using MagickCore::BlackThresholdImage; + using MagickCore::BlackThresholdImageChannel; + using MagickCore::BlobError; + using MagickCore::BlobFatalError; + using MagickCore::BlobToImage; + using MagickCore::BlobWarning; + using MagickCore::BlueShiftImage; + using MagickCore::BlurImage; + using MagickCore::BlurImageChannel; + using MagickCore::BorderImage; + using MagickCore::BrightnessContrastImage; + using MagickCore::BrightnessContrastImageChannel; + using MagickCore::CacheError; + using MagickCore::CacheFatalError; + using MagickCore::CacheWarning; + using MagickCore::CannyEdgeImage; + using MagickCore::CharcoalImage; + using MagickCore::ChopImage; + using MagickCore::ClampImage; + using MagickCore::ClampImageChannel; + using MagickCore::ClearMagickException; + using MagickCore::CloneDrawInfo; + using MagickCore::CloneImage; + using MagickCore::CloneImageInfo; + using MagickCore::CloneQuantizeInfo; + using MagickCore::ClutImage; + using MagickCore::ClutImageChannel; + using MagickCore::CoderError; + using MagickCore::CoderFatalError; + using MagickCore::CoderWarning; + using MagickCore::CopyImagePixels; + using MagickCore::ColorDecisionListImage; + using MagickCore::ColorizeImage; + using MagickCore::ColorMatrixImage; + using MagickCore::ColorPacket; + using MagickCore::CommandOptionToMnemonic; + using MagickCore::CompareImageChannels; + using MagickCore::CompareImages; + using MagickCore::CompositeImage; + using MagickCore::ConfigureError; + using MagickCore::ConfigureFatalError; + using MagickCore::ConfigureWarning; + using MagickCore::ConnectedComponentsImage; + using MagickCore::ConstituteImage; + using MagickCore::ContrastImage; + using MagickCore::ContrastStretchImageChannel; + using MagickCore::ConvertHSLToRGB; + using MagickCore::ConvertRGBToHSL; + using MagickCore::ConvolveImage; + using MagickCore::CopyMagickString; + using MagickCore::CorruptImageError; + using MagickCore::CorruptImageFatalError; + using MagickCore::CorruptImageWarning; + using MagickCore::CropImage; + using MagickCore::CropImageToTiles; + using MagickCore::CycleColormapImage; + using MagickCore::DeconstructImages; + using MagickCore::DecipherImage; + using MagickCore::DelegateError; + using MagickCore::DelegateFatalError; + using MagickCore::DelegateWarning; + using MagickCore::DeleteImageOption; + using MagickCore::DeleteImageRegistry; + using MagickCore::DeskewImage; + using MagickCore::DespeckleImage; + using MagickCore::DestroyCacheView; + using MagickCore::DestroyDrawInfo; + using MagickCore::DestroyDrawingWand; + using MagickCore::DestroyExceptionInfo; + using MagickCore::DestroyImageInfo; + using MagickCore::DestroyImageList; + using MagickCore::DestroyKernelInfo; + using MagickCore::DestroyMagickWand; + using MagickCore::DestroyPixelWand; + using MagickCore::DestroyQuantizeInfo; + using MagickCore::DestroyQuantumInfo; + using MagickCore::DestroyString; + using MagickCore::DestroyStringInfo; + using MagickCore::DisplayImages; + using MagickCore::DistortImage; + using MagickCore::DrawAffine; + using MagickCore::DrawAnnotation; + using MagickCore::DrawArc; + using MagickCore::DrawBezier; + using MagickCore::DrawCircle; + using MagickCore::DrawColor; + using MagickCore::DrawComment; + using MagickCore::DrawComposite; + using MagickCore::DrawEllipse; + using MagickCore::DrawError; + using MagickCore::DrawFatalError; + using MagickCore::DrawImage; + using MagickCore::DrawInfo; + using MagickCore::DrawingWand; + using MagickCore::DrawLine; + using MagickCore::DrawMatte; + using MagickCore::DrawPathClose; + using MagickCore::DrawPathCurveToAbsolute; + using MagickCore::DrawPathCurveToQuadraticBezierAbsolute; + using MagickCore::DrawPathCurveToQuadraticBezierRelative; + using MagickCore::DrawPathCurveToQuadraticBezierSmoothAbsolute; + using MagickCore::DrawPathCurveToQuadraticBezierSmoothRelative; + using MagickCore::DrawPathCurveToRelative; + using MagickCore::DrawPathCurveToSmoothAbsolute; + using MagickCore::DrawPathCurveToSmoothRelative; + using MagickCore::DrawPathEllipticArcAbsolute; + using MagickCore::DrawPathEllipticArcRelative; + using MagickCore::DrawPathFinish; + using MagickCore::DrawPathLineToAbsolute; + using MagickCore::DrawPathLineToHorizontalAbsolute; + using MagickCore::DrawPathLineToHorizontalRelative; + using MagickCore::DrawPathLineToRelative; + using MagickCore::DrawPathLineToVerticalAbsolute; + using MagickCore::DrawPathLineToVerticalRelative; + using MagickCore::DrawPathMoveToAbsolute; + using MagickCore::DrawPathMoveToRelative; + using MagickCore::DrawPathStart; + using MagickCore::DrawPoint; + using MagickCore::DrawPolygon; + using MagickCore::DrawPolyline; + using MagickCore::DrawPopClipPath; + using MagickCore::DrawPopDefs; + using MagickCore::DrawPopPattern; + using MagickCore::DrawPushClipPath; + using MagickCore::DrawPushDefs; + using MagickCore::DrawPushPattern; + using MagickCore::DrawRectangle; + using MagickCore::DrawRender; + using MagickCore::DrawRotate; + using MagickCore::DrawRoundRectangle; + using MagickCore::DrawScale; + using MagickCore::DrawSetClipPath; + using MagickCore::DrawSetClipRule; + using MagickCore::DrawSetClipUnits; + using MagickCore::DrawSetFillColor; + using MagickCore::DrawSetFillOpacity; + using MagickCore::DrawSetFillPatternURL; + using MagickCore::DrawSetFillRule; + using MagickCore::DrawSetFont; + using MagickCore::DrawSetFontFamily; + using MagickCore::DrawSetFontSize; + using MagickCore::DrawSetFontStretch; + using MagickCore::DrawSetFontStyle; + using MagickCore::DrawSetFontWeight; + using MagickCore::DrawSetGravity; + using MagickCore::DrawSetStrokeAntialias; + using MagickCore::DrawSetStrokeColor; + using MagickCore::DrawSetStrokeDashArray; + using MagickCore::DrawSetStrokeDashOffset; + using MagickCore::DrawSetStrokeLineCap; + using MagickCore::DrawSetStrokeLineJoin; + using MagickCore::DrawSetStrokeMiterLimit; + using MagickCore::DrawSetStrokeOpacity; + using MagickCore::DrawSetStrokePatternURL; + using MagickCore::DrawSetStrokeWidth; + using MagickCore::DrawSetTextAntialias; + using MagickCore::DrawSetTextDecoration; + using MagickCore::DrawSetTextEncoding; + using MagickCore::DrawSetTextInterlineSpacing; + using MagickCore::DrawSetTextInterwordSpacing; + using MagickCore::DrawSetTextKerning; + using MagickCore::DrawSetTextUnderColor; + using MagickCore::DrawSetViewbox; + using MagickCore::DrawSkewX; + using MagickCore::DrawSkewY; + using MagickCore::DrawTranslate; + using MagickCore::DrawWarning; + using MagickCore::EdgeImage; + using MagickCore::EmbossImage; + using MagickCore::EncipherImage; + using MagickCore::EnhanceImage; + using MagickCore::EqualizeImage; + using MagickCore::EvaluateImage; + using MagickCore::EvaluateImageChannel; + using MagickCore::ExceptionInfo; + using MagickCore::ExceptionType; + using MagickCore::ExportImagePixels; + using MagickCore::ExportQuantumPixels; + using MagickCore::ExtentImage; + using MagickCore::FileOpenError; + using MagickCore::FileOpenFatalError; + using MagickCore::FileOpenWarning; + using MagickCore::FlipImage; + using MagickCore::FloodfillPaintImage; + using MagickCore::FlopImage; + using MagickCore::FormatLocaleString; + using MagickCore::ForwardFourierTransformImage; + using MagickCore::FrameImage; + using MagickCore::FrameInfo; + using MagickCore::FxImageChannel; + using MagickCore::GammaImage; + using MagickCore::GammaImage; + using MagickCore::GaussianBlurImage; + using MagickCore::GaussianBlurImageChannel; + using MagickCore::GetAffineMatrix; + using MagickCore::GetAuthenticIndexQueue; + using MagickCore::GetBlobSize; + using MagickCore::GetCacheViewException; + using MagickCore::GetCacheViewAuthenticIndexQueue; + using MagickCore::GetCacheViewAuthenticPixels; + using MagickCore::GetCacheViewVirtualPixels; + using MagickCore::GetClientName; + using MagickCore::GetColorTuple; + using MagickCore::GetDrawInfo; + using MagickCore::GetGeometry; + using MagickCore::GetImageArtifact; + using MagickCore::GetImageBoundingBox; + using MagickCore::GetImageChannelDistortion; + using MagickCore::GetImageChannelDepth; + using MagickCore::GetImageChannelMean; + using MagickCore::GetImageChannelKurtosis; + using MagickCore::GetImageChannelMoments; + using MagickCore::GetImageChannelRange; + using MagickCore::GetImageClipMask; + using MagickCore::GetImageDepth; + using MagickCore::GetImageDistortion; + using MagickCore::GetImageInfo; + using MagickCore::GetImageInfoFile; + using MagickCore::GetImageMask; + using MagickCore::GetImageOption; + using MagickCore::GetAuthenticPixels; + using MagickCore::GetImageProfile; + using MagickCore::GetImageProperty; + using MagickCore::GetImageQuantizeError; + using MagickCore::GetImageType; + using MagickCore::GetMagickInfo; + using MagickCore::GetMagickPixelPacket; + using MagickCore::GetMultilineTypeMetrics; + using MagickCore::GetNextValueInLinkedList; + using MagickCore::GetNumberColors; + using MagickCore::GetNumberOfElementsInLinkedList; + using MagickCore::GetPageGeometry; + using MagickCore::GetQuantizeInfo; + using MagickCore::GetStringInfoDatum; + using MagickCore::GetStringInfoLength; + using MagickCore::GetTypeMetrics; + using MagickCore::GetValueFromLinkedList; + using MagickCore::GetVirtualIndexQueue; + using MagickCore::GetVirtualPixels; + using MagickCore::GetImageVirtualPixelMethod; + using MagickCore::GlobExpression; + using MagickCore::GravityAdjustGeometry; + using MagickCore::GrayscaleImage; + using MagickCore::GreaterValue; + using MagickCore::HaldClutImage; + using MagickCore::HeightValue; + using MagickCore::HoughLineImage; + using MagickCore::ImageError; + using MagickCore::ImageFatalError; + using MagickCore::ImageInfo; + using MagickCore::ImageRegistryType; + using MagickCore::ImageToBlob; + using MagickCore::ImagesToBlob; + using MagickCore::ImageWarning; + using MagickCore::ImplodeImage; + using MagickCore::ImportQuantumPixels; + using MagickCore::InterpretImageProperties; + using MagickCore::InverseFourierTransformImage; + using MagickCore::InvokeDynamicImageFilter; + using MagickCore::IsEventLogging; + using MagickCore::IsGeometry; + using MagickCore::IsImagesEqual; + using MagickCore::IsOpaqueImage; + using MagickCore::KernelInfo; + using MagickCore::KuwaharaImage; + using MagickCore::LessValue; + using MagickCore::LevelImage; + using MagickCore::LevelImageChannel; + using MagickCore::LevelColorsImageChannel; + using MagickCore::LevelizeImage; + using MagickCore::LevelizeImageChannel; + using MagickCore::LinearStretchImage; + using MagickCore::LinkedListInfo; + using MagickCore::LiquidRescaleImage; + using MagickCore::LocaleCompare; + using MagickCore::LocalContrastImage; + using MagickCore::LockSemaphoreInfo; + using MagickCore::LogMagickEvent; + using MagickCore::MagickCoreTerminus; + using MagickCore::MagickInfo; + using MagickCore::MagickPixelPacket; + using MagickCore::MagickToMime; + using MagickCore::MagickWand; + using MagickCore::MagnifyImage; + using MagickCore::MergeImageLayers; + using MagickCore::MinifyImage; + using MagickCore::MinimumValue; + using MagickCore::MissingDelegateError; + using MagickCore::MissingDelegateFatalError; + using MagickCore::MissingDelegateWarning; + using MagickCore::ModulateImage; + using MagickCore::ModuleError; + using MagickCore::ModuleFatalError; + using MagickCore::ModuleWarning; + using MagickCore::MonitorError; + using MagickCore::MonitorFatalError; + using MagickCore::MonitorWarning; + using MagickCore::MontageInfo; + using MagickCore::MorphologyImage; + using MagickCore::MorphologyImageChannel; + using MagickCore::MotionBlurImage; + using MagickCore::NegateImage; + using MagickCore::NegateImageChannel; + using MagickCore::NewMagickWandFromImage; + using MagickCore::NewPixelWand; + using MagickCore::NoiseType; + using MagickCore::NormalizeImage; + using MagickCore::NoValue; + using MagickCore::OffsetInfo; + using MagickCore::OilPaintImage; + using MagickCore::OpaquePaintImage; + using MagickCore::OrderedPosterizeImage; + using MagickCore::OptionError; + using MagickCore::OptionFatalError; + using MagickCore::OptionWarning; + using MagickCore::OptimizeImageLayers; + using MagickCore::OptimizeImageTransparency; + using MagickCore::OptimizePlusImageLayers; + using MagickCore::ParseMetaGeometry; + using MagickCore::PercentValue; + using MagickCore::PerceptibleImage; + using MagickCore::PerceptibleImageChannel; + using MagickCore::PingBlob; + using MagickCore::PingImage; + using MagickCore::PixelSetQuantumColor; + using MagickCore::PixelWand; + using MagickCore::PointInfo; + using MagickCore::PopDrawingWand; + using MagickCore::PolaroidImage; + using MagickCore::PolicyWarning; + using MagickCore::PolicyError; + using MagickCore::PolicyFatalError; + using MagickCore::PosterizeImage; + using MagickCore::PosterizeImageChannel; + using MagickCore::ProfileImage; + using MagickCore::ProfileInfo; + using MagickCore::PushDrawingWand; + using MagickCore::QuantizeImage; + using MagickCore::QuantizeInfo; + using MagickCore::QuantumInfo; + using MagickCore::QueryColorDatabase; + using MagickCore::QueryMagickColor; + using MagickCore::QueueAuthenticPixels; + using MagickCore::QueueCacheViewAuthenticPixels; + using MagickCore::RaiseImage; + using MagickCore::RandomThresholdImageChannel; + using MagickCore::ReadImage; + using MagickCore::RectangleInfo; + using MagickCore::RegisterMagickInfo; + using MagickCore::RegistryError; + using MagickCore::RegistryFatalError; + using MagickCore::RegistryType; + using MagickCore::RegistryWarning; + using MagickCore::RelinquishMagickMemory; + using MagickCore::RemapImage; + using MagickCore::ResampleImage; + using MagickCore::ResetLinkedListIterator; + using MagickCore::ResizeImage; + using MagickCore::ResizeMagickMemory; + using MagickCore::ResourceLimitError; + using MagickCore::ResourceLimitFatalError; + using MagickCore::ResourceLimitWarning; + using MagickCore::RollImage; + using MagickCore::RotateImage; + using MagickCore::RotationalBlurImage; + using MagickCore::RotationalBlurImageChannel; + using MagickCore::SampleImage; + using MagickCore::ScaleImage; + using MagickCore::SegmentImage; + using MagickCore::SelectiveBlurImage; + using MagickCore::SelectiveBlurImageChannel; + using MagickCore::SeparateImageChannel; + using MagickCore::SepiaToneImage; + using MagickCore::SetGeometry; + using MagickCore::SetImageAlphaChannel; + using MagickCore::SetImageArtifact; + using MagickCore::SetImageBackgroundColor; + using MagickCore::SetImageChannelDepth; + using MagickCore::SetImageClipMask; + using MagickCore::SetImageColorspace; + using MagickCore::SetImageDepth; + using MagickCore::SetImageExtent; + using MagickCore::SetImageInfo; + using MagickCore::SetImageInfoFile; + using MagickCore::SetImageMask; + using MagickCore::SetImageOpacity; + using MagickCore::SetImageOption; + using MagickCore::SetImageProfile; + using MagickCore::SetImageProperty; + using MagickCore::SetImageRegistry; + using MagickCore::SetImageType; + using MagickCore::SetLogEventMask; + using MagickCore::SetMagickInfo; + using MagickCore::SetMagickResourceLimit; + using MagickCore::SetStringInfoDatum; + using MagickCore::SetImageVirtualPixelMethod; + using MagickCore::ShadeImage; + using MagickCore::ShadowImage; + using MagickCore::SharpenImage; + using MagickCore::SharpenImageChannel; + using MagickCore::ShaveImage; + using MagickCore::ShearImage; + using MagickCore::SimilarityMetricImage; + using MagickCore::SigmoidalContrastImageChannel; + using MagickCore::SignatureImage; + using MagickCore::SketchImage; + using MagickCore::SmushImages; + using MagickCore::SolarizeImage; + using MagickCore::SparseColorImage; + using MagickCore::SpliceImage; + using MagickCore::SpreadImage; + using MagickCore::StatisticImage; + using MagickCore::SteganoImage; + using MagickCore::StereoImage; + using MagickCore::StreamError; + using MagickCore::StreamFatalError; + using MagickCore::StreamWarning; + using MagickCore::StringInfo; + using MagickCore::StripImage; + using MagickCore::SwirlImage; + using MagickCore::SyncCacheViewAuthenticPixels; + using MagickCore::SyncImage; + using MagickCore::SyncAuthenticPixels; + using MagickCore::TextureImage; + using MagickCore::ThrowException; + using MagickCore::TintImage; + using MagickCore::TransformImage; + using MagickCore::TransformImageColorspace; + using MagickCore::TransparentPaintImage; + using MagickCore::TransparentPaintImageChroma; + using MagickCore::TransposeImage; + using MagickCore::TransverseImage; + using MagickCore::TrimImage; + using MagickCore::TypeError; + using MagickCore::TypeFatalError; + using MagickCore::TypeWarning; + using MagickCore::UndefinedException; + using MagickCore::UndefinedRegistryType; + using MagickCore::UniqueImageColors; + using MagickCore::UnlockSemaphoreInfo; + using MagickCore::UnregisterMagickInfo; + using MagickCore::UnsharpMaskImage; + using MagickCore::UnsharpMaskImageChannel; + using MagickCore::VignetteImage; + using MagickCore::CacheView; + using MagickCore::WaveImage; + using MagickCore::WaveletDenoiseImage; + using MagickCore::WhiteThresholdImage; + using MagickCore::WhiteThresholdImageChannel; + using MagickCore::WidthValue; + using MagickCore::WriteImage; + using MagickCore::XNegative; + using MagickCore::XServerError; + using MagickCore::XServerFatalError; + using MagickCore::XServerWarning; + using MagickCore::XValue; + using MagickCore::YNegative; + using MagickCore::YValue; + +#endif // MAGICKCORE_IMPLEMENTATION + +} + +////////////////////////////////////////////////////////////////////// +// +// No user-serviceable parts beyond this point +// +////////////////////////////////////////////////////////////////////// +#define GetPPException \ + MagickCore::ExceptionInfo \ + *exceptionInfo; \ + exceptionInfo=MagickCore::AcquireExceptionInfo() +#define ThrowPPException(quiet) \ + throwException(exceptionInfo,quiet); \ + (void) MagickCore::DestroyExceptionInfo(exceptionInfo) + +#endif // Magick_Include_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Montage.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Montage.h new file mode 100644 index 0000000..8aabbf9 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Montage.h @@ -0,0 +1,373 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// +// Definition of Montage class used to specify montage options. +// + +#if !defined(Magick_Montage_header) +#define Magick_Montage_header + +#include "Magick++/Include.h" +#include +#include "Magick++/Color.h" +#include "Magick++/Geometry.h" + +// +// Basic (Un-framed) Montage +// +namespace Magick +{ + class MagickPPExport Montage + { + public: + + Montage(void); + virtual ~Montage(void); + + // Color that thumbnails are composed on + void backgroundColor(const Color &backgroundColor_); + Color backgroundColor(void) const; + + // Composition algorithm to use (e.g. ReplaceCompositeOp) + void compose(CompositeOperator compose_); + CompositeOperator compose(void) const; + + // Filename to save montages to + void fileName(const std::string &fileName_); + std::string fileName(void) const; + + // Fill color + void fillColor(const Color &fill_); + Color fillColor(void) const; + + // Label font + void font(const std::string &font_); + std::string font(void) const; + + // Thumbnail width & height plus border width & height + void geometry(const Geometry &geometry_); + Geometry geometry(void) const; + + // Thumbnail position (e.g. SouthWestGravity) + void gravity(GravityType gravity_); + GravityType gravity(void) const; + + // Thumbnail label (applied to image prior to montage) + void label(const std::string &label_); + std::string label(void) const; + + // Same as fill color + void penColor(const Color &pen_); + Color penColor(void) const; + + // Font point size + void pointSize(size_t pointSize_); + size_t pointSize(void) const; + + // Enable drop-shadows on thumbnails + void shadow(bool shadow_); + bool shadow(void) const; + + // Outline color + void strokeColor(const Color &stroke_); + Color strokeColor(void) const; + + // Background texture image + void texture(const std::string &texture_); + std::string texture(void) const; + + // Thumbnail rows and colmns + void tile(const Geometry &tile_); + Geometry tile(void) const; + + // Montage title + void title(const std::string &title_); + std::string title(void) const; + + // Transparent color + void transparentColor(const Color &transparentColor_); + Color transparentColor(void) const; + + // + // Implementation methods/members + // + + // Update elements in existing MontageInfo structure + virtual void updateMontageInfo(MagickCore::MontageInfo &montageInfo_) const; + + private: + + Color _backgroundColor; + CompositeOperator _compose; + std::string _fileName; + Color _fill; + std::string _font; + Geometry _geometry; + GravityType _gravity; + std::string _label; + size_t _pointSize; + bool _shadow; + Color _stroke; + std::string _texture; + Geometry _tile; + std::string _title; + Color _transparentColor; + }; + + // + // Montage With Frames (Extends Basic Montage) + // + class MagickPPExport MontageFramed : public Montage + { + public: + + MontageFramed(void); + ~MontageFramed(void); + + // Frame border color + void borderColor(const Color &borderColor_); + Color borderColor(void) const; + + // Pixels between thumbnail and surrounding frame + void borderWidth(size_t borderWidth_); + size_t borderWidth(void) const; + + // Frame geometry (width & height frame thickness) + void frameGeometry(const Geometry &frame_); + Geometry frameGeometry(void) const; + + // Frame foreground color + void matteColor(const Color &matteColor_); + Color matteColor(void) const; + + // + // Implementation methods/members + // + + // Update elements in existing MontageInfo structure + void updateMontageInfo(MagickCore::MontageInfo &montageInfo_) const; + + private: + + Color _borderColor; + size_t _borderWidth; + Geometry _frame; + Color _matteColor; + }; +} // namespace Magick + +// +// Inlines +// + +// +// Implementation of Montage +// + +inline void Magick::Montage::backgroundColor(const Magick::Color &backgroundColor_) +{ + _backgroundColor=backgroundColor_; +} + +inline Magick::Color Magick::Montage::backgroundColor(void) const +{ + return(_backgroundColor); +} + +inline void Magick::Montage::compose(Magick::CompositeOperator compose_) +{ + _compose=compose_; +} + +inline Magick::CompositeOperator Magick::Montage::compose(void) const +{ + return(_compose); +} + +inline void Magick::Montage::fileName(const std::string &fileName_) +{ + _fileName=fileName_; +} + +inline std::string Magick::Montage::fileName(void) const +{ + return(_fileName); +} + +inline void Magick::Montage::fillColor(const Color &fill_) +{ + _fill=fill_; +} + +inline Magick::Color Magick::Montage::fillColor(void) const +{ + return(_fill); +} + +inline void Magick::Montage::font(const std::string &font_) +{ + _font=font_; +} + +inline std::string Magick::Montage::font(void) const +{ + return(_font); +} + +inline void Magick::Montage::geometry(const Magick::Geometry &geometry_) +{ + _geometry=geometry_; +} + +inline Magick::Geometry Magick::Montage::geometry(void) const +{ + return(_geometry); +} + +inline void Magick::Montage::gravity(Magick::GravityType gravity_) +{ + _gravity=gravity_; +} + +inline Magick::GravityType Magick::Montage::gravity(void) const +{ + return(_gravity); +} + +inline void Magick::Montage::label(const std::string &label_) +{ + _label=label_; +} + +inline std::string Magick::Montage::label(void) const +{ + return(_label); +} + +inline void Magick::Montage::penColor(const Color &pen_) +{ + _fill=pen_; + _stroke=Color("none"); +} + +inline Magick::Color Magick::Montage::penColor(void) const +{ + return _fill; +} + +inline void Magick::Montage::pointSize(size_t pointSize_) +{ + _pointSize=pointSize_; +} + +inline size_t Magick::Montage::pointSize(void) const +{ + return(_pointSize); +} + +inline void Magick::Montage::shadow(bool shadow_) +{ + _shadow=shadow_; +} + +inline bool Magick::Montage::shadow(void) const +{ + return(_shadow); +} + +inline void Magick::Montage::strokeColor(const Color &stroke_) +{ + _stroke=stroke_; +} + +inline Magick::Color Magick::Montage::strokeColor(void) const +{ + return(_stroke); +} + +inline void Magick::Montage::texture(const std::string &texture_) +{ + _texture=texture_; +} + +inline std::string Magick::Montage::texture(void) const +{ + return(_texture); +} + +inline void Magick::Montage::tile(const Geometry &tile_) +{ + _tile=tile_; +} + +inline Magick::Geometry Magick::Montage::tile(void) const +{ + return(_tile); +} + +inline void Magick::Montage::title(const std::string &title_) +{ + _title=title_; +} + +inline std::string Magick::Montage::title(void) const +{ + return(_title); +} + +inline void Magick::Montage::transparentColor(const Magick::Color &transparentColor_) +{ + _transparentColor=transparentColor_; +} + +inline Magick::Color Magick::Montage::transparentColor(void) const +{ + return(_transparentColor); +} + +// +// Implementation of MontageFramed +// + +inline void Magick::MontageFramed::borderColor(const Magick::Color &borderColor_) +{ + _borderColor=borderColor_; +} + +inline Magick::Color Magick::MontageFramed::borderColor(void) const +{ + return(_borderColor); +} + +inline void Magick::MontageFramed::borderWidth(size_t borderWidth_) +{ + _borderWidth=borderWidth_; +} + +inline size_t Magick::MontageFramed::borderWidth(void) const +{ + return(_borderWidth); +} + +inline void Magick::MontageFramed::frameGeometry(const Magick::Geometry &frame_) +{ + _frame=frame_; +} + +inline Magick::Geometry Magick::MontageFramed::frameGeometry(void) const +{ + return(_frame); +} + +inline void Magick::MontageFramed::matteColor(const Magick::Color &matteColor_) +{ + _matteColor=matteColor_; +} + +inline Magick::Color Magick::MontageFramed::matteColor(void) const +{ + return(_matteColor); +} + +#endif // Magick_Montage_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Options.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Options.h new file mode 100644 index 0000000..6619aaa --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Options.h @@ -0,0 +1,352 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2014-2015 +// +// Definition of Options +// +// Options which may be applied to an image. These options are the +// equivalent of options supplied to ImageMagick utilities. +// +// This is an internal implementation class and is not part of the +// Magick++ API +// + +#if !defined(Magick_Options_header) +#define Magick_Options_header + +#include "Magick++/Include.h" +#include +#include "Magick++/Color.h" +#include "Magick++/Geometry.h" +#include "Magick++/Drawable.h" + +namespace Magick +{ + class Image; + + class Options + { + public: + + // Default constructor + Options(void); + + // Copy constructor + Options(const Options& options_); + + // Destructor + ~Options(); + + // Remove pixel aliasing + void antiAlias(bool flag_); + bool antiAlias(void) const; + + // Join images into a single multi-image file + void adjoin(bool flag_); + bool adjoin(void) const; + + // Image background color + void backgroundColor(const Color &color_); + Color backgroundColor(void) const; + + // Name of texture image to tile onto the image background + void backgroundTexture(const std::string &backgroundTexture_); + std::string backgroundTexture(void) const; + + // Image border color + void borderColor(const Color &color_); + Color borderColor(void) const; + + // Text bounding-box base color (default none) + void boxColor(const Color &boxColor_); + Color boxColor(void) const; + + // Colors within this distance are considered equal + void colorFuzz(double fuzz_); + double colorFuzz(void) const; + + // Image colorspace scheme + void colorspaceType(ColorspaceType colorspace_); + ColorspaceType colorspaceType(void) const; + + // Compression type ( NoCompression, BZipCompression, + // FaxCompression, JPEGCompression, LZWCompression, + // RLECompression, or ZipCompression ) + void compressType(CompressionType compressType_); + CompressionType compressType(void) const; + + // Enable printing of debug messages from ImageMagick + void debug(bool flag_); + bool debug(void) const; + + // Vertical and horizontal resolution in pixels of the image + void density(const Geometry &geomery_); + Geometry density(void) const; + + // Image depth (8 or 16) + void depth(size_t depth_); + size_t depth(void) const; + + // Endianness (little like Intel or big like SPARC) for image + // formats which support endian-specific options. + void endian(EndianType endian_); + EndianType endian(void) const; + + // Image filename to read or write + void file(FILE *file_); + FILE *file(void) const; + + // Image filename to read or write + void fileName(const std::string &fileName_); + std::string fileName(void) const; + + // Color to use when filling drawn objects + void fillColor(const Color &fillColor_); + Color fillColor(void) const; + + // Fill pattern + void fillPattern(const MagickCore::Image *fillPattern_); + const MagickCore::Image *fillPattern(void) const; + + // Rule to use when filling drawn objects + void fillRule(const FillRule &fillRule_); + FillRule fillRule(void) const; + + // Font name + void font(const std::string &font_); + std::string font(void) const; + + // Font name + void fontFamily(const std::string &family_); + std::string fontFamily(void) const; + + // Font point size + void fontPointsize(double pointSize_); + double fontPointsize(void) const; + + // Font style + void fontStyle(const StyleType style_); + StyleType fontStyle(void) const; + + // Font weight + void fontWeight(const size_t weight_); + size_t fontWeight(void) const; + + std::string format(void) const; + + // Image interlace scheme + void interlaceType(InterlaceType interlace_); + InterlaceType interlaceType(void) const; + + // Image format to write or read + void magick(const std::string &magick_); + std::string magick(void) const; + + // Transparent color + void matteColor(const Color &matteColor_); + Color matteColor(void) const; + + // Write as a monochrome image + void monochrome(bool monochromeFlag_); + bool monochrome(void) const; + + // Preferred size and location of an image canvas. + void page(const Geometry &pageSize_); + Geometry page(void) const; + + // Desired image quality factor + void quality(size_t quality_); + size_t quality(void) const; + + // Maximum number of colors to quantize to + void quantizeColors(size_t colors_); + size_t quantizeColors(void) const; + + // Colorspace to quantize in. + void quantizeColorSpace(ColorspaceType colorSpace_); + ColorspaceType quantizeColorSpace(void) const; + + // Dither image during quantization. + void quantizeDither(bool ditherFlag_); + bool quantizeDither(void) const; + + // Dither method + void quantizeDitherMethod(DitherMethod ditherMethod_); + DitherMethod quantizeDitherMethod(void) const; + + // Quantization tree-depth + void quantizeTreeDepth(size_t treeDepth_); + size_t quantizeTreeDepth(void) const; + + // Suppress all warning messages. Error messages are still reported. + void quiet(const bool quiet_); + bool quiet(void) const; + + // Units of resolution to interpret density + void resolutionUnits(ResolutionType resolutionUnits_); + ResolutionType resolutionUnits(void) const; + + // Image sampling factor + void samplingFactor(const std::string &samplingFactor_); + std::string samplingFactor(void) const; + + // Image size (required for raw formats) + void size(const Geometry &geometry_); + Geometry size(void) const; + + // enabled/disable stroke anti-aliasing + void strokeAntiAlias(bool flag_); + bool strokeAntiAlias(void) const ; + + // Color to use when drawing object outlines + void strokeColor(const Color &strokeColor_); + Color strokeColor(void) const; + + // Control the pattern of dashes and gaps used to stroke + // paths. The strokeDashArray represents a list of numbers that + // specify the lengths of alternating dashes and gaps in user + // units. If an odd number of values is provided, then the list of + // values is repeated to yield an even number of values. + void strokeDashArray(const double *strokeDashArray_); + const double *strokeDashArray(void) const; + + // While drawing using strokeDashArray, specify distance into the dash + // pattern to start the dash (default 0). + void strokeDashOffset(double strokeDashOffset_); + double strokeDashOffset(void) const; + + // Specify the shape to be used at the end of open subpaths when + // they are stroked. Values of LineCap are UndefinedCap, ButtCap, + // RoundCap, and SquareCap. + void strokeLineCap(LineCap lineCap_); + LineCap strokeLineCap(void) const; + + // Specify the shape to be used at the corners of paths (or other + // vector shapes) when they are stroked. Values of LineJoin are + // UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin. + void strokeLineJoin(LineJoin lineJoin_); + LineJoin strokeLineJoin(void) const; + + // Specify miter limit. When two line segments meet at a sharp + // angle and miter joins have been specified for 'lineJoin', it is + // possible for the miter to extend far beyond the thickness of + // the line stroking the path. The miterLimit' imposes a limit on + // the ratio of the miter length to the 'stroke_width'. The default + // value of this parameter is 4. + void strokeMiterLimit(size_t miterLimit_); + size_t strokeMiterLimit(void) const; + + // Pattern image to use for stroked outlines + void strokePattern(const MagickCore::Image *strokePattern_); + const MagickCore::Image *strokePattern(void) const; + + // Stroke width for drawing vector objects (default one) + void strokeWidth(double strokeWidth_); + double strokeWidth(void) const; + + void subImage(size_t subImage_); + size_t subImage(void) const; + + // Sub-frame number to return + void subRange(size_t subRange_); + size_t subRange(void) const; + + // Render text right-to-left or left-to-right. + void textDirection(DirectionType direction_); + DirectionType textDirection() const; + + // Annotation text encoding (e.g. "UTF-16") + void textEncoding(const std::string &encoding_); + std::string textEncoding(void) const; + + // Text gravity. + void textGravity(GravityType gravity_); + GravityType textGravity() const; + + // Text inter-line spacing + void textInterlineSpacing(double spacing_); + double textInterlineSpacing(void) const; + + // Text inter-word spacing + void textInterwordSpacing(double spacing_); + double textInterwordSpacing(void) const; + + // Text inter-character kerning + void textKerning(double kerning_); + double textKerning(void) const; + + // Text undercolor box + void textUnderColor(const Color &underColor_); + Color textUnderColor(void) const; + + void tileName(const std::string &tileName_); + std::string tileName(void) const; + + // Origin of coordinate system to use when annotating with text or drawing + void transformOrigin(double tx_,double ty_); + + // Reset transformation parameters to default + void transformReset(void); + + // Rotation to use when annotating with text or drawing + void transformRotation(double angle_); + + // Scale to use when annotating with text or drawing + void transformScale(double sx_,double sy_); + + // Skew to use in X axis when annotating with text or drawing + void transformSkewX(double skewx_); + + // Skew to use in Y axis when annotating with text or drawing + void transformSkewY(double skewy_); + + // Image representation type + void type(const ImageType type_); + ImageType type(void) const; + + // Return verbose information about an image, or an operation + void verbose(bool verboseFlag_); + bool verbose(void) const; + + void view(const std::string &view_); + std::string view(void) const; + + // Virtual pixel method. + void virtualPixelMethod(VirtualPixelMethod virtual_pixel_method_); + VirtualPixelMethod virtualPixelMethod(void) const; + + // X11 display name + void x11Display(const std::string &display_); + std::string x11Display(void) const; + + // + // Internal implementation methods. Please do not use. + // + + MagickCore::DrawInfo *drawInfo(void); + MagickCore::ImageInfo *imageInfo(void); + MagickCore::QuantizeInfo *quantizeInfo(void); + + // Construct using raw structures + Options(const MagickCore::ImageInfo *imageInfo_, + const MagickCore::QuantizeInfo *quantizeInfo_, + const MagickCore::DrawInfo *drawInfo_); + + private: + + // Assignment not supported + Options& operator=(const Options&); + + void setOption(const char *name,const Color &value_); + + void setOption(const char *name,const double value_); + + MagickCore::ImageInfo *_imageInfo; + MagickCore::QuantizeInfo *_quantizeInfo; + MagickCore::DrawInfo *_drawInfo; + bool _quiet; + }; +} // namespace Magick + +#endif // Magick_Options_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Pixels.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Pixels.h new file mode 100644 index 0000000..757c93e --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Pixels.h @@ -0,0 +1,149 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 +// Copyright Dirk Lemstra 2014 +// +// Representation of a pixel view. +// + +#if !defined(Magick_Pixels_header) +#define Magick_Pixels_header + +#include "Magick++/Include.h" +#include "Magick++/Color.h" +#include "Magick++/Image.h" + +namespace Magick +{ + class MagickPPExport Pixels + { + public: + + // Construct pixel view using specified image. + Pixels(Magick::Image &image_); + + // Destroy pixel view + ~Pixels(void); + + // Transfer pixels from the image to the pixel view as defined by + // the specified region. Modified pixels may be subsequently + // transferred back to the image via sync. + PixelPacket *get(const ::ssize_t x_, const ::ssize_t y_, + const size_t columns_,const size_t rows_ ); + + // Transfer read-only pixels from the image to the pixel view as + // defined by the specified region. + const PixelPacket *getConst(const ::ssize_t x_,const ::ssize_t y_, + const size_t columns_,const size_t rows_); + + // Allocate a pixel view region to store image pixels as defined + // by the region rectangle. This area is subsequently transferred + // from the pixel view to the image via sync. + PixelPacket *set(const ::ssize_t x_,const ::ssize_t y_, + const size_t columns_,const size_t rows_); + + // Transfers the image view pixels to the image. + void sync(void); + + // Width of view + size_t columns(void) const; + + // Return pixel colormap index array + IndexPacket *indexes(void); + + // Height of view + size_t rows (void) const; + + // Left ordinate of view + ::ssize_t x(void) const; + + // Top ordinate of view + ::ssize_t y(void) const; + + private: + + // Copying and assigning Pixels is not supported. + Pixels(const Pixels& pixels_); + const Pixels& operator=(const Pixels& pixels_); + + Magick::Image _image; // Image reference + MagickCore::CacheView *_view; // Image view handle + ::ssize_t _x; // Left ordinate of view + ::ssize_t _y; // Top ordinate of view + size_t _columns; // Width of view + size_t _rows; // Height of view + + }; // class Pixels + + class MagickPPExport PixelData + { + public: + + // Construct pixel data using specified image + PixelData(Magick::Image &image_,std::string map_,const StorageType type_); + + // Construct pixel data using specified image + PixelData(Magick::Image &image_,const ::ssize_t x_,const ::ssize_t y_, + const size_t width_,const size_t height_,std::string map_, + const StorageType type_); + + // Destroy pixel data + ~PixelData(void); + + // Pixel data buffer + const void *data(void) const; + + // Length of the buffer + ::ssize_t length(void) const; + + // Size of the buffer in bytes + ::ssize_t size(void) const; + + private: + + // Copying and assigning PixelData is not supported + PixelData(const PixelData& pixels_); + const PixelData& operator=(const PixelData& pixels_); + + void init(Magick::Image &image_,const ::ssize_t x_,const ::ssize_t y_, + const size_t width_,const size_t height_,std::string map_, + const StorageType type_); + + void relinquish(void) throw(); + + void *_data; // The pixel data + ::ssize_t _length; // Length of the data + ::ssize_t _size; // Size of the data + }; // class PixelData + +} // Magick namespace + +// +// Inline methods +// + +// Left ordinate of view +inline ::ssize_t Magick::Pixels::x(void) const +{ + return _x; +} + +// Top ordinate of view +inline ::ssize_t Magick::Pixels::y(void) const +{ + return _y; +} + +// Width of view +inline size_t Magick::Pixels::columns(void) const +{ + return _columns; +} + +// Height of view +inline size_t Magick::Pixels::rows(void) const +{ + return _rows; +} + +#endif // Magick_Pixels_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/ResourceLimits.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/ResourceLimits.h new file mode 100644 index 0000000..3643bc3 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/ResourceLimits.h @@ -0,0 +1,76 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Dirk Lemstra 2014-2018 +// +// Definition of resource limits. +// + +#if !defined(Magick_ResourceLimits_header) +#define Magick_ResourceLimits_header + +#include "Magick++/Include.h" + +namespace Magick +{ + class MagickPPExport ResourceLimits + { + public: + + // Pixel cache limit in bytes. Requests for memory above this limit + // are automagically allocated on disk. + static void area(const MagickSizeType limit_); + static MagickSizeType area(void); + + // Pixel cache limit in bytes. Requests for memory above this limit + // will fail. + static void disk(const MagickSizeType limit_); + static MagickSizeType disk(void); + + // The maximum number of open pixel cache files. When this limit is + // exceeded, any subsequent pixels cached to disk are closed and reopened + // on demand. This behavior permits a large number of images to be accessed + // simultaneously on disk, but with a speed penalty due to repeated + // open/close calls. + static void file(const MagickSizeType limit_); + static MagickSizeType file(void); + + // The maximum height of an image. + static void height(const MagickSizeType limit_); + static MagickSizeType height(void); + + // The maximum number of images in an image list. + static void listLength(const MagickSizeType limit_); + static MagickSizeType listLength(); + + // Pixel cache limit in bytes. Once this memory limit is exceeded, + // all subsequent pixels cache operations are to/from disk. + static void map(const MagickSizeType limit_); + static MagickSizeType map(void); + + // Pixel cache limit in bytes. Once this memory limit is exceeded, + // all subsequent pixels cache operations are to/from disk or to/from + // memory mapped files. + static void memory(const MagickSizeType limit_); + static MagickSizeType memory(void); + + // Limits the number of threads used in multithreaded operations. + static void thread(const MagickSizeType limit_); + static MagickSizeType thread(void); + + // Periodically yield the CPU for at least the time specified in + // milliseconds. + static void throttle(const MagickSizeType limit_); + static MagickSizeType throttle(void); + + // The maximum width of an image. + static void width(const MagickSizeType limit_); + static MagickSizeType width(void); + + private: + ResourceLimits(void); + + }; // class ResourceLimits + +} // Magick namespace + +#endif // Magick_ResourceLimits_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/STL.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/STL.h new file mode 100644 index 0000000..434022b --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/STL.h @@ -0,0 +1,2855 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2013-2014 +// +// Definition and implementation of template functions for using +// Magick::Image with STL containers. +// + +#ifndef Magick_STL_header +#define Magick_STL_header + +#include "Magick++/Include.h" +#include +#include +#include +#include +#include + +#include "Magick++/CoderInfo.h" +#include "Magick++/Drawable.h" +#include "Magick++/Exception.h" +#include "Magick++/Montage.h" + +namespace Magick +{ + // + // STL function object declarations/definitions + // + + // Function objects provide the means to invoke an operation on one + // or more image objects in an STL-compatable container. The + // arguments to the function object constructor(s) are compatable + // with the arguments to the equivalent Image class method and + // provide the means to supply these options when the function + // object is invoked. + + // For example, to read a GIF animation, set the color red to + // transparent for all frames, and write back out: + // + // list images; + // readImages( &images, "animation.gif" ); + // for_each( images.begin(), images.end(), transparentImage( "red" ) ); + // writeImages( images.begin(), images.end(), "animation.gif" ); + + // Adaptive-blur image with specified blur factor + class MagickPPExport adaptiveBlurImage + { + public: + adaptiveBlurImage( const double radius_ = 1, const double sigma_ = 0.5 ); + + void operator()( Image &image_ ) const; + + private: + double _radius; + double _sigma; + }; + + // Local adaptive threshold image + // http://www.dai.ed.ac.uk/HIPR2/adpthrsh.htm + // Width x height define the size of the pixel neighborhood + // offset = constant to subtract from pixel neighborhood mean + class MagickPPExport adaptiveThresholdImage + { + public: + adaptiveThresholdImage( const size_t width_, + const size_t height_, + const ::ssize_t offset_ = 0 ); + + void operator()( Image &image_ ) const; + + private: + size_t _width; + size_t _height; + ::ssize_t _offset; + }; + + // Add noise to image with specified noise type + class MagickPPExport addNoiseImage + { + public: + addNoiseImage ( NoiseType noiseType_ ); + + void operator()( Image &image_ ) const; + + private: + NoiseType _noiseType; + }; + + // Transform image by specified affine (or free transform) matrix. + class MagickPPExport affineTransformImage + { + public: + affineTransformImage( const DrawableAffine &affine_ ); + + void operator()( Image &image_ ) const; + + private: + DrawableAffine _affine; + }; + + // Annotate image (draw text on image) + class MagickPPExport annotateImage + { + public: + // Annotate using specified text, and placement location + annotateImage ( const std::string &text_, + const Geometry &geometry_ ); + + // Annotate using specified text, bounding area, and placement + // gravity + annotateImage ( const std::string &text_, + const Geometry &geometry_, + const GravityType gravity_ ); + + // Annotate with text using specified text, bounding area, + // placement gravity, and rotation. + annotateImage ( const std::string &text_, + const Geometry &geometry_, + const GravityType gravity_, + const double degrees_ ); + + // Annotate with text (bounding area is entire image) and + // placement gravity. + annotateImage ( const std::string &text_, + const GravityType gravity_ ); + + void operator()( Image &image_ ) const; + + private: + const std::string _text; + const Geometry _geometry; + const GravityType _gravity; + const double _degrees; + }; + + // Blur image with specified blur factor + class MagickPPExport blurImage + { + public: + blurImage( const double radius_ = 1, const double sigma_ = 0.5 ); + + void operator()( Image &image_ ) const; + + private: + double _radius; + double _sigma; + }; + + // Border image (add border to image) + class MagickPPExport borderImage + { + public: + borderImage( const Geometry &geometry_ = borderGeometryDefault ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + }; + + // Extract channel from image + class MagickPPExport channelImage + { + public: + channelImage( const ChannelType channel_ ); + + void operator()( Image &image_ ) const; + + private: + ChannelType _channel; + }; + + // Charcoal effect image (looks like charcoal sketch) + class MagickPPExport charcoalImage + { + public: + charcoalImage( const double radius_ = 1, const double sigma_ = 0.5 ); + + void operator()( Image &image_ ) const; + + private: + double _radius; + double _sigma; + }; + + // Chop image (remove vertical or horizontal subregion of image) + class MagickPPExport chopImage + { + public: + chopImage( const Geometry &geometry_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + }; + + // Accepts a lightweight Color Correction Collection (CCC) file which solely + // contains one or more color corrections and applies the correction to the + // image. + class MagickPPExport cdlImage + { + public: + cdlImage( const std::string &cdl_ ); + + void operator()( Image &image_ ) const; + + private: + std::string _cdl; + }; + + // Colorize image using pen color at specified percent opacity + class MagickPPExport colorizeImage + { + public: + colorizeImage( const unsigned int opacityRed_, + const unsigned int opacityGreen_, + const unsigned int opacityBlue_, + const Color &penColor_ ); + + colorizeImage( const unsigned int opacity_, + const Color &penColor_ ); + + void operator()( Image &image_ ) const; + + private: + unsigned int _opacityRed; + unsigned int _opacityGreen; + unsigned int _opacityBlue; + Color _penColor; + }; + + // Apply a color matrix to the image channels. The user supplied + // matrix may be of order 1 to 5 (1x1 through 5x5). + class MagickPPExport colorMatrixImage + { + public: + colorMatrixImage( const size_t order_, + const double *color_matrix_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _order; + const double *_color_matrix; + }; + + // Convert the image colorspace representation + class MagickPPExport colorSpaceImage + { + public: + colorSpaceImage( ColorspaceType colorSpace_ ); + + void operator()( Image &image_ ) const; + + private: + ColorspaceType _colorSpace; + }; + + // Comment image (add comment string to image) + class MagickPPExport commentImage + { + public: + commentImage( const std::string &comment_ ); + + void operator()( Image &image_ ) const; + + private: + std::string _comment; + }; + + // Compose an image onto another at specified offset and using + // specified algorithm + class MagickPPExport compositeImage + { + public: + compositeImage( const Image &compositeImage_, + ::ssize_t xOffset_, + ::ssize_t yOffset_, + CompositeOperator compose_ = InCompositeOp ); + + compositeImage( const Image &compositeImage_, + const Geometry &offset_, + CompositeOperator compose_ = InCompositeOp ); + + void operator()( Image &image_ ) const; + + private: + Image _compositeImage; + ::ssize_t _xOffset; + ::ssize_t _yOffset; + CompositeOperator _compose; + }; + + // Contrast image (enhance intensity differences in image) + class MagickPPExport contrastImage + { + public: + contrastImage( const size_t sharpen_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _sharpen; + }; + + // Crop image (subregion of original image) + class MagickPPExport cropImage + { + public: + cropImage( const Geometry &geometry_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + }; + + // Cycle image colormap + class MagickPPExport cycleColormapImage + { + public: + cycleColormapImage( const ::ssize_t amount_ ); + + void operator()( Image &image_ ) const; + + private: + ::ssize_t _amount; + }; + + // Despeckle image (reduce speckle noise) + class MagickPPExport despeckleImage + { + public: + despeckleImage( void ); + + void operator()( Image &image_ ) const; + + private: + }; + + // Distort image. distorts an image using various distortion methods, by + // mapping color lookups of the source image to a new destination image + // usally of the same size as the source image, unless 'bestfit' is set to + // true. + class MagickPPExport distortImage + { + public: + distortImage( const Magick::DistortImageMethod method_, + const size_t number_arguments_, + const double *arguments_, + const bool bestfit_ ); + + distortImage( const Magick::DistortImageMethod method_, + const size_t number_arguments_, + const double *arguments_ ); + + void operator()( Image &image_ ) const; + + private: + DistortImageMethod _method; + size_t _number_arguments; + const double *_arguments; + bool _bestfit; + }; + + // Draw on image + class MagickPPExport drawImage + { + public: + // Draw on image using a single drawable + // Store in list to make implementation easier + drawImage( const Drawable &drawable_ ); + + // Draw on image using a drawable list + drawImage( const DrawableList &drawable_ ); + + void operator()( Image &image_ ) const; + + private: + DrawableList _drawableList; + }; + + // Edge image (hilight edges in image) + class MagickPPExport edgeImage + { + public: + edgeImage( const double radius_ = 0.0 ); + + void operator()( Image &image_ ) const; + + private: + double _radius; + }; + + // Emboss image (hilight edges with 3D effect) + class MagickPPExport embossImage + { + public: + embossImage( void ); + embossImage( const double radius_, const double sigma_ ); + + void operator()( Image &image_ ) const; + + private: + double _radius; + double _sigma; + }; + + // Enhance image (minimize noise) + class MagickPPExport enhanceImage + { + public: + enhanceImage( void ); + + void operator()( Image &image_ ) const; + + private: + }; + + // Equalize image (histogram equalization) + class MagickPPExport equalizeImage + { + public: + equalizeImage( void ); + + void operator()( Image &image_ ) const; + + private: + }; + + // Color to use when filling drawn objects + class MagickPPExport fillColorImage + { + public: + fillColorImage( const Color &fillColor_ ); + + void operator()( Image &image_ ) const; + + private: + Color _fillColor; + }; + + // Flip image (reflect each scanline in the vertical direction) + class MagickPPExport flipImage + { + public: + flipImage( void ); + + void operator()( Image &image_ ) const; + + private: + }; + + // Flood-fill image with color + class MagickPPExport floodFillColorImage + { + public: + // Flood-fill color across pixels starting at target-pixel and + // stopping at pixels matching specified border color. + // Uses current fuzz setting when determining color match. + floodFillColorImage( const ::ssize_t x_, + const ::ssize_t y_, + const Color &fillColor_ ); + + floodFillColorImage( const Geometry &point_, + const Color &fillColor_ ); + + // Flood-fill color across pixels starting at target-pixel and + // stopping at pixels matching specified border color. + // Uses current fuzz setting when determining color match. + floodFillColorImage( const ::ssize_t x_, + const ::ssize_t y_, + const Color &fillColor_, + const Color &borderColor_ ); + + floodFillColorImage( const Geometry &point_, + const Color &fillColor_, + const Color &borderColor_ ); + + void operator()( Image &image_ ) const; + + private: + ::ssize_t _x; + ::ssize_t _y; + Color _fillColor; + Color _borderColor; + }; + + // Flood-fill image with texture + class MagickPPExport floodFillTextureImage + { + public: + // Flood-fill texture across pixels that match the color of the + // target pixel and are neighbors of the target pixel. + // Uses current fuzz setting when determining color match. + floodFillTextureImage( const ::ssize_t x_, + const ::ssize_t y_, + const Image &texture_ ); + + floodFillTextureImage( const Geometry &point_, + const Image &texture_ ); + + // Flood-fill texture across pixels starting at target-pixel and + // stopping at pixels matching specified border color. + // Uses current fuzz setting when determining color match. + floodFillTextureImage( const ::ssize_t x_, + const ::ssize_t y_, + const Image &texture_, + const Color &borderColor_ ); + + floodFillTextureImage( const Geometry &point_, + const Image &texture_, + const Color &borderColor_ ); + + void operator()( Image &image_ ) const; + + private: + ::ssize_t _x; + ::ssize_t _y; + Image _texture; + Color _borderColor; + }; + + // Flop image (reflect each scanline in the horizontal direction) + class MagickPPExport flopImage + { + public: + flopImage( void ); + + void operator()( Image &image_ ) const; + + private: + }; + + // Frame image + class MagickPPExport frameImage + { + public: + frameImage( const Geometry &geometry_ = frameGeometryDefault ); + + frameImage( const size_t width_, const size_t height_, + const ::ssize_t innerBevel_ = 6, const ::ssize_t outerBevel_ = 6 ); + + void operator()( Image &image_ ) const; + + private: + size_t _width; + size_t _height; + ::ssize_t _outerBevel; + ::ssize_t _innerBevel; + }; + + // Gamma correct image + class MagickPPExport gammaImage + { + public: + gammaImage( const double gamma_ ); + + gammaImage ( const double gammaRed_, + const double gammaGreen_, + const double gammaBlue_ ); + + void operator()( Image &image_ ) const; + + private: + double _gammaRed; + double _gammaGreen; + double _gammaBlue; + }; + + // Gaussian blur image + // The number of neighbor pixels to be included in the convolution + // mask is specified by 'width_'. The standard deviation of the + // gaussian bell curve is specified by 'sigma_'. + class MagickPPExport gaussianBlurImage + { + public: + gaussianBlurImage( const double width_, const double sigma_ ); + + void operator()( Image &image_ ) const; + + private: + double _width; + double _sigma; + }; + + // Apply a color lookup table (Hald CLUT) to the image. + class MagickPPExport haldClutImage + { + public: + haldClutImage( const Image &haldClutImage_ ); + + void operator()( Image &image_ ) const; + + private: + Image _haldClutImage; + }; + + // Implode image (special effect) + class MagickPPExport implodeImage + { + public: + implodeImage( const double factor_ = 50 ); + + void operator()( Image &image_ ) const; + + private: + double _factor; + }; + + // implements the inverse discrete Fourier transform (IFT) of the image + // either as a magnitude / phase or real / imaginary image pair. + class MagickPPExport inverseFourierTransformImage + { + public: + inverseFourierTransformImage( const Image &phaseImage_ ); + + void operator()( Image &image_ ) const; + + private: + Image _phaseImage; + }; + + // Set image validity. Valid images become empty (inValid) if + // argument is false. + class MagickPPExport isValidImage + { + public: + isValidImage( const bool isValid_ ); + + void operator()( Image &image_ ) const; + + private: + bool _isValid; + }; + + // Label image + class MagickPPExport labelImage + { + public: + labelImage( const std::string &label_ ); + + void operator()( Image &image_ ) const; + + private: + std::string _label; + }; + + + // Level image + class MagickPPExport levelImage + { + public: + levelImage( const double black_point, + const double white_point, + const double mid_point=1.0 ); + + void operator()( Image &image_ ) const; + + private: + double _black_point; + double _white_point; + double _mid_point; + }; + + // Level image channel + class MagickPPExport levelChannelImage + { + public: + levelChannelImage( const Magick::ChannelType channel, + const double black_point, + const double white_point, + const double mid_point=1.0 ); + + void operator()( Image &image_ ) const; + + private: + Magick::ChannelType _channel; + double _black_point; + double _white_point; + double _mid_point; + }; + + // Magnify image by integral size + class MagickPPExport magnifyImage + { + public: + magnifyImage( void ); + + void operator()( Image &image_ ) const; + + private: + }; + + // Remap image colors with closest color from reference image + class MagickPPExport mapImage + { + public: + mapImage( const Image &mapImage_ , + const bool dither_ = false ); + + void operator()( Image &image_ ) const; + + private: + Image _mapImage; + bool _dither; + }; + + // Floodfill designated area with a matte value + class MagickPPExport matteFloodfillImage + { + public: + matteFloodfillImage( const Color &target_ , + const unsigned int matte_, + const ::ssize_t x_, const ::ssize_t y_, + const PaintMethod method_ ); + + void operator()( Image &image_ ) const; + + private: + Color _target; + unsigned int _matte; + ::ssize_t _x; + ::ssize_t _y; + PaintMethod _method; + }; + + // Filter image by replacing each pixel component with the median + // color in a circular neighborhood + class MagickPPExport medianFilterImage + { + public: + medianFilterImage( const double radius_ = 0.0 ); + + void operator()( Image &image_ ) const; + + private: + double _radius; + }; + + // Merge image layers + class MagickPPExport mergeLayersImage + { + public: + mergeLayersImage ( ImageLayerMethod layerMethod_ ); + + void operator()( Image &image_ ) const; + + private: + ImageLayerMethod _layerMethod; + }; + + // Reduce image by integral size + class MagickPPExport minifyImage + { + public: + minifyImage( void ); + + void operator()( Image &image_ ) const; + + private: + }; + + // Modulate percent hue, saturation, and brightness of an image + class MagickPPExport modulateImage + { + public: + modulateImage( const double brightness_, + const double saturation_, + const double hue_ ); + + void operator()( Image &image_ ) const; + + private: + double _brightness; + double _saturation; + double _hue; + }; + + // Negate colors in image. Set grayscale to only negate grayscale + // values in image. + class MagickPPExport negateImage + { + public: + negateImage( const bool grayscale_ = false ); + + void operator()( Image &image_ ) const; + + private: + bool _grayscale; + }; + + // Normalize image (increase contrast by normalizing the pixel + // values to span the full range of color values) + class MagickPPExport normalizeImage + { + public: + normalizeImage( void ); + + void operator()( Image &image_ ) const; + + private: + }; + + // Oilpaint image (image looks like oil painting) + class MagickPPExport oilPaintImage + { + public: + oilPaintImage( const double radius_ = 3 ); + + void operator()( Image &image_ ) const; + + private: + double _radius; + }; + + // Set or attenuate the image opacity channel. If the image pixels + // are opaque then they are set to the specified opacity value, + // otherwise they are blended with the supplied opacity value. The + // value of opacity_ ranges from 0 (completely opaque) to + // QuantumRange. The defines OpaqueOpacity and TransparentOpacity are + // available to specify completely opaque or completely transparent, + // respectively. + class MagickPPExport opacityImage + { + public: + opacityImage( const unsigned int opacity_ ); + + void operator()( Image &image_ ) const; + + private: + unsigned int _opacity; + }; + + // Change color of opaque pixel to specified pen color. + class MagickPPExport opaqueImage + { + public: + opaqueImage( const Color &opaqueColor_, + const Color &penColor_ ); + + void operator()( Image &image_ ) const; + + private: + Color _opaqueColor; + Color _penColor; + }; + + // Quantize image (reduce number of colors) + class MagickPPExport quantizeImage + { + public: + quantizeImage( const bool measureError_ = false ); + + void operator()( Image &image_ ) const; + + private: + bool _measureError; + }; + + // Raise image (lighten or darken the edges of an image to give a + // 3-D raised or lowered effect) + class MagickPPExport raiseImage + { + public: + raiseImage( const Geometry &geometry_ = raiseGeometryDefault, + const bool raisedFlag_ = false ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + bool _raisedFlag; + }; + + class MagickPPExport ReadOptions + { + public: + + // Default constructor + ReadOptions(void); + + // Copy constructor + ReadOptions(const ReadOptions& options_); + + // Destructor + ~ReadOptions(); + + // Vertical and horizontal resolution in pixels of the image + void density(const Geometry &geomery_); + Geometry density(void) const; + + // Image depth (8 or 16) + void depth(size_t depth_); + size_t depth(void) const; + + // Suppress all warning messages. Error messages are still reported. + void quiet(const bool quiet_); + bool quiet(void) const; + + // Image size (required for raw formats) + void size(const Geometry &geometry_); + Geometry size(void) const; + + // + // Internal implementation methods. Please do not use. + // + + MagickCore::ImageInfo *imageInfo(void); + + private: + + // Assignment not supported + ReadOptions& operator=(const ReadOptions&); + + MagickCore::ImageInfo *_imageInfo; + bool _quiet; + }; + + // Reduce noise in image using a noise peak elimination filter + class MagickPPExport reduceNoiseImage + { + public: + reduceNoiseImage( void ); + + reduceNoiseImage (const size_t order_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _order; + }; + + // Resize image to specified size. + class MagickPPExport resizeImage + { + public: + resizeImage( const Geometry &geometry_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + }; + + // Roll image (rolls image vertically and horizontally) by specified + // number of columnms and rows) + class MagickPPExport rollImage + { + public: + rollImage( const Geometry &roll_ ); + + rollImage( const ::ssize_t columns_, const ::ssize_t rows_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _columns; + size_t _rows; + }; + + // Rotate image counter-clockwise by specified number of degrees. + class MagickPPExport rotateImage + { + public: + rotateImage( const double degrees_ ); + + void operator()( Image &image_ ) const; + + private: + double _degrees; + }; + + // Resize image by using pixel sampling algorithm + class MagickPPExport sampleImage + { + public: + sampleImage( const Geometry &geometry_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + }; + + // Resize image by using simple ratio algorithm + class MagickPPExport scaleImage + { + public: + scaleImage( const Geometry &geometry_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + }; + + // Segment (coalesce similar image components) by analyzing the + // histograms of the color components and identifying units that are + // homogeneous with the fuzzy c-means technique. + // Also uses QuantizeColorSpace and Verbose image attributes + class MagickPPExport segmentImage + { + public: + segmentImage( const double clusterThreshold_ = 1.0, + const double smoothingThreshold_ = 1.5 ); + + void operator()( Image &image_ ) const; + + private: + double _clusterThreshold; + double _smoothingThreshold; + }; + + // Shade image using distant light source + class MagickPPExport shadeImage + { + public: + shadeImage( const double azimuth_ = 30, + const double elevation_ = 30, + const bool colorShading_ = false ); + + void operator()( Image &image_ ) const; + + private: + double _azimuth; + double _elevation; + bool _colorShading; + }; + + // Shadow effect image (simulate an image shadow) + class MagickPPExport shadowImage + { + public: + shadowImage( const double percent_opacity_ = 80, const double sigma_ = 0.5, + const ssize_t x_ = 5, const ssize_t y_ = 5 ); + + void operator()( Image &image_ ) const; + + private: + double _percent_opacity; + double _sigma; + ssize_t _x; + ssize_t _y; + }; + + // Sharpen pixels in image + class MagickPPExport sharpenImage + { + public: + sharpenImage( const double radius_ = 1, const double sigma_ = 0.5 ); + + void operator()( Image &image_ ) const; + + private: + double _radius; + double _sigma; + }; + + // Shave pixels from image edges. + class MagickPPExport shaveImage + { + public: + shaveImage( const Geometry &geometry_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + }; + + + // Shear image (create parallelogram by sliding image by X or Y axis) + class MagickPPExport shearImage + { + public: + shearImage( const double xShearAngle_, + const double yShearAngle_ ); + + void operator()( Image &image_ ) const; + + private: + double _xShearAngle; + double _yShearAngle; + }; + + // Solarize image (similar to effect seen when exposing a + // photographic film to light during the development process) + class MagickPPExport solarizeImage + { + public: + solarizeImage( const double factor_ ); + + void operator()( Image &image_ ) const; + + private: + double _factor; + }; + + // Splice the background color into the image. + class MagickPPExport spliceImage + { + public: + spliceImage( const Geometry &geometry_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + }; + + // Spread pixels randomly within image by specified ammount + class MagickPPExport spreadImage + { + public: + spreadImage( const size_t amount_ = 3 ); + + void operator()( Image &image_ ) const; + + private: + size_t _amount; + }; + + // Add a digital watermark to the image (based on second image) + class MagickPPExport steganoImage + { + public: + steganoImage( const Image &waterMark_ ); + + void operator()( Image &image_ ) const; + + private: + Image _waterMark; + }; + + // Create an image which appears in stereo when viewed with red-blue glasses + // (Red image on left, blue on right) + class MagickPPExport stereoImage + { + public: + stereoImage( const Image &rightImage_ ); + + void operator()( Image &image_ ) const; + + private: + Image _rightImage; + }; + + // Color to use when drawing object outlines + class MagickPPExport strokeColorImage + { + public: + strokeColorImage( const Color &strokeColor_ ); + + void operator()( Image &image_ ) const; + + private: + Color _strokeColor; + }; + + // Swirl image (image pixels are rotated by degrees) + class MagickPPExport swirlImage + { + public: + swirlImage( const double degrees_ ); + + void operator()( Image &image_ ) const; + + private: + double _degrees; + }; + + // Channel a texture on image background + class MagickPPExport textureImage + { + public: + textureImage( const Image &texture_ ); + + void operator()( Image &image_ ) const; + + private: + Image _texture; + }; + + // Threshold image + class MagickPPExport thresholdImage + { + public: + thresholdImage( const double threshold_ ); + + void operator()( Image &image_ ) const; + + private: + double _threshold; + }; + + // Transform image based on image and crop geometries + class MagickPPExport transformImage + { + public: + transformImage( const Geometry &imageGeometry_ ); + + transformImage( const Geometry &imageGeometry_, + const Geometry &cropGeometry_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _imageGeometry; + Geometry _cropGeometry; + }; + + // Set image color to transparent + class MagickPPExport transparentImage + { + public: + transparentImage( const Color& color_ ); + + void operator()( Image &image_ ) const; + + private: + Color _color; + }; + + // Trim edges that are the background color from the image + class MagickPPExport trimImage + { + public: + trimImage( void ); + + void operator()( Image &image_ ) const; + + private: + }; + + // Map image pixels to a sine wave + class MagickPPExport waveImage + { + public: + waveImage( const double amplitude_ = 25.0, + const double wavelength_ = 150.0 ); + + void operator()( Image &image_ ) const; + + private: + double _amplitude; + double _wavelength; + }; + + // Zoom image to specified size. + class MagickPPExport zoomImage + { + public: + zoomImage( const Geometry &geometry_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + }; + + // + // Function object image attribute accessors + // + + // Anti-alias Postscript and TrueType fonts (default true) + class MagickPPExport antiAliasImage + { + public: + antiAliasImage( const bool flag_ ); + + void operator()( Image &image_ ) const; + + private: + bool _flag; + }; + + // Join images into a single multi-image file + class MagickPPExport adjoinImage + { + public: + adjoinImage( const bool flag_ ); + + void operator()( Image &image_ ) const; + + private: + bool _flag; + }; + + // Time in 1/100ths of a second which must expire before displaying + // the next image in an animated sequence. + class MagickPPExport animationDelayImage + { + public: + animationDelayImage( const size_t delay_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _delay; + }; + + // Number of iterations to loop an animation (e.g. Netscape loop + // extension) for. + class MagickPPExport animationIterationsImage + { + public: + animationIterationsImage( const size_t iterations_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _iterations; + }; + + // Image background color + class MagickPPExport backgroundColorImage + { + public: + backgroundColorImage( const Color &color_ ); + + void operator()( Image &image_ ) const; + + private: + Color _color; + }; + + // Name of texture image to tile onto the image background + class MagickPPExport backgroundTextureImage + { + public: + backgroundTextureImage( const std::string &backgroundTexture_ ); + + void operator()( Image &image_ ) const; + + private: + std::string _backgroundTexture; + }; + + // Image border color + class MagickPPExport borderColorImage + { + public: + borderColorImage( const Color &color_ ); + + void operator()( Image &image_ ) const; + + private: + Color _color; + }; + + // Text bounding-box base color (default none) + class MagickPPExport boxColorImage + { + public: + boxColorImage( const Color &boxColor_ ); + + void operator()( Image &image_ ) const; + + private: + Color _boxColor; + }; + + // Chromaticity blue primary point (e.g. x=0.15, y=0.06) + class MagickPPExport chromaBluePrimaryImage + { + public: + chromaBluePrimaryImage( const double x_, const double y_ ); + + void operator()( Image &image_ ) const; + + private: + double _x; + double _y; + }; + + // Chromaticity green primary point (e.g. x=0.3, y=0.6) + class MagickPPExport chromaGreenPrimaryImage + { + public: + chromaGreenPrimaryImage( const double x_, const double y_ ); + + void operator()( Image &image_ ) const; + + private: + double _x; + double _y; + }; + + // Chromaticity red primary point (e.g. x=0.64, y=0.33) + class MagickPPExport chromaRedPrimaryImage + { + public: + chromaRedPrimaryImage( const double x_, const double y_ ); + + void operator()( Image &image_ ) const; + + private: + double _x; + double _y; + }; + + // Chromaticity white point (e.g. x=0.3127, y=0.329) + class MagickPPExport chromaWhitePointImage + { + public: + chromaWhitePointImage( const double x_, const double y_ ); + + void operator()( Image &image_ ) const; + + private: + double _x; + double _y; + }; + + // Colors within this distance are considered equal + class MagickPPExport colorFuzzImage + { + public: + colorFuzzImage( const double fuzz_ ); + + void operator()( Image &image_ ) const; + + private: + double _fuzz; + }; + + // Color at colormap position index_ + class MagickPPExport colorMapImage + { + public: + colorMapImage( const size_t index_, const Color &color_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _index; + Color _color; + }; + + // Composition operator to be used when composition is implicitly used + // (such as for image flattening). + class MagickPPExport composeImage + { + public: + composeImage( const CompositeOperator compose_ ); + + void operator()( Image &image_ ) const; + + private: + CompositeOperator _compose; + }; + + // Compression type + class MagickPPExport compressTypeImage + { + public: + compressTypeImage( const CompressionType compressType_ ); + + void operator()( Image &image_ ) const; + + private: + CompressionType _compressType; + }; + + // Vertical and horizontal resolution in pixels of the image + class MagickPPExport densityImage + { + public: + densityImage( const Geometry &geomery_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geomery; + }; + + // Image depth (bits allocated to red/green/blue components) + class MagickPPExport depthImage + { + public: + depthImage( const size_t depth_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _depth; + }; + + // Endianness (LSBEndian like Intel or MSBEndian like SPARC) for image + // formats which support endian-specific options. + class MagickPPExport endianImage + { + public: + endianImage( const EndianType endian_ ); + + void operator()( Image &image_ ) const; + + private: + EndianType _endian; + }; + + // Image file name + class MagickPPExport fileNameImage + { + public: + fileNameImage( const std::string &fileName_ ); + + void operator()( Image &image_ ) const; + + private: + std::string _fileName; + }; + + // Filter to use when resizing image + class MagickPPExport filterTypeImage + { + public: + filterTypeImage( const FilterTypes filterType_ ); + + void operator()( Image &image_ ) const; + + private: + FilterTypes _filterType; + }; + + // Text rendering font + class MagickPPExport fontImage + { + public: + fontImage( const std::string &font_ ); + + void operator()( Image &image_ ) const; + + private: + std::string _font; + }; + + // Font point size + class MagickPPExport fontPointsizeImage + { + public: + fontPointsizeImage( const size_t pointsize_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _pointsize; + }; + + // GIF disposal method + class MagickPPExport gifDisposeMethodImage + { + public: + gifDisposeMethodImage( const size_t disposeMethod_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _disposeMethod; + }; + + // Type of interlacing to use + class MagickPPExport interlaceTypeImage + { + public: + interlaceTypeImage( const InterlaceType interlace_ ); + + void operator()( Image &image_ ) const; + + private: + InterlaceType _interlace; + }; + + // Linewidth for drawing vector objects (default one) + class MagickPPExport lineWidthImage + { + public: + lineWidthImage( const double lineWidth_ ); + + void operator()( Image &image_ ) const; + + private: + double _lineWidth; + }; + + // File type magick identifier (.e.g "GIF") + class MagickPPExport magickImage + { + public: + magickImage( const std::string &magick_ ); + + void operator()( Image &image_ ) const; + + private: + std::string _magick; + }; + + // Image supports transparent color + class MagickPPExport matteImage + { + public: + matteImage( const bool matteFlag_ ); + + void operator()( Image &image_ ) const; + + private: + bool _matteFlag; + }; + + // Transparent color + class MagickPPExport matteColorImage + { + public: + matteColorImage( const Color &matteColor_ ); + + void operator()( Image &image_ ) const; + + private: + Color _matteColor; + }; + + // Indicate that image is black and white + class MagickPPExport monochromeImage + { + public: + monochromeImage( const bool monochromeFlag_ ); + + void operator()( Image &image_ ) const; + + private: + bool _monochromeFlag; + }; + + // Pen color + class MagickPPExport penColorImage + { + public: + penColorImage( const Color &penColor_ ); + + void operator()( Image &image_ ) const; + + private: + Color _penColor; + }; + + // Pen texture image. + class MagickPPExport penTextureImage + { + public: + penTextureImage( const Image &penTexture_ ); + + void operator()( Image &image_ ) const; + + private: + Image _penTexture; + }; + + // Set pixel color at location x & y. + class MagickPPExport pixelColorImage + { + public: + pixelColorImage( const ::ssize_t x_, + const ::ssize_t y_, + const Color &color_); + + void operator()( Image &image_ ) const; + + private: + ::ssize_t _x; + ::ssize_t _y; + Color _color; + }; + + // Postscript page size. + class MagickPPExport pageImage + { + public: + pageImage( const Geometry &pageSize_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _pageSize; + }; + + // JPEG/MIFF/PNG compression level (default 75). + class MagickPPExport qualityImage + { + public: + qualityImage( const size_t quality_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _quality; + }; + + // Maximum number of colors to quantize to + class MagickPPExport quantizeColorsImage + { + public: + quantizeColorsImage( const size_t colors_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _colors; + }; + + // Colorspace to quantize in. + class MagickPPExport quantizeColorSpaceImage + { + public: + quantizeColorSpaceImage( const ColorspaceType colorSpace_ ); + + void operator()( Image &image_ ) const; + + private: + ColorspaceType _colorSpace; + }; + + // Dither image during quantization (default true). + class MagickPPExport quantizeDitherImage + { + public: + quantizeDitherImage( const bool ditherFlag_ ); + + void operator()( Image &image_ ) const; + + private: + bool _ditherFlag; + }; + + // Quantization tree-depth + class MagickPPExport quantizeTreeDepthImage + { + public: + quantizeTreeDepthImage( const size_t treeDepth_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _treeDepth; + }; + + // The type of rendering intent + class MagickPPExport renderingIntentImage + { + public: + renderingIntentImage( const RenderingIntent renderingIntent_ ); + + void operator()( Image &image_ ) const; + + private: + RenderingIntent _renderingIntent; + }; + + // Units of image resolution + class MagickPPExport resolutionUnitsImage + { + public: + resolutionUnitsImage( const ResolutionType resolutionUnits_ ); + + void operator()( Image &image_ ) const; + + private: + ResolutionType _resolutionUnits; + }; + + // Image scene number + class MagickPPExport sceneImage + { + public: + sceneImage( const size_t scene_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _scene; + }; + + // adjust the image contrast with a non-linear sigmoidal contrast algorithm + class MagickPPExport sigmoidalContrastImage + { + public: + sigmoidalContrastImage( const size_t sharpen_, + const double contrast, + const double midpoint = QuantumRange / 2.0 ); + + void operator()( Image &image_ ) const; + + private: + size_t _sharpen; + double contrast; + double midpoint; + }; + + // Width and height of a raw image + class MagickPPExport sizeImage + { + public: + sizeImage( const Geometry &geometry_ ); + + void operator()( Image &image_ ) const; + + private: + Geometry _geometry; + }; + + // stripImage strips an image of all profiles and comments. + class MagickPPExport stripImage + { + public: + stripImage( void ); + + void operator()( Image &image_ ) const; + + private: + }; + + // Subimage of an image sequence + class MagickPPExport subImageImage + { + public: + subImageImage( const size_t subImage_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _subImage; + }; + + // Number of images relative to the base image + class MagickPPExport subRangeImage + { + public: + subRangeImage( const size_t subRange_ ); + + void operator()( Image &image_ ) const; + + private: + size_t _subRange; + }; + + // Tile name + class MagickPPExport tileNameImage + { + public: + tileNameImage( const std::string &tileName_ ); + + void operator()( Image &image_ ) const; + + private: + std::string _tileName; + }; + + // Image storage type + class MagickPPExport typeImage + { + public: + typeImage( const ImageType type_ ); + + void operator()( Image &image_ ) const; + + private: + Magick::ImageType _type; + }; + + + // Print detailed information about the image + class MagickPPExport verboseImage + { + public: + verboseImage( const bool verbose_ ); + + void operator()( Image &image_ ) const; + + private: + bool _verbose; + }; + + // FlashPix viewing parameters + class MagickPPExport viewImage + { + public: + viewImage( const std::string &view_ ); + + void operator()( Image &image_ ) const; + + private: + std::string _view; + }; + + // X11 display to display to, obtain fonts from, or to capture + // image from + class MagickPPExport x11DisplayImage + { + public: + x11DisplayImage( const std::string &display_ ); + + void operator()( Image &image_ ) const; + + private: + std::string _display; + }; + + ////////////////////////////////////////////////////////// + // + // Implementation template definitions. Not for end-use. + // + ////////////////////////////////////////////////////////// + + // Link images together into an image list based on the ordering of + // the container implied by the iterator. This step is done in + // preparation for use with ImageMagick functions which operate on + // lists of images. + // Images are selected by range, first_ to last_ so that a subset of + // the container may be selected. Specify first_ via the + // container's begin() method and last_ via the container's end() + // method in order to specify the entire container. + template + bool linkImages( InputIterator first_, + InputIterator last_ ) { + + MagickCore::Image* previous = 0; + ::ssize_t scene = 0; + for ( InputIterator iter = first_; iter != last_; ++iter ) + { + // Unless we reduce the reference count to one, the same image + // structure may occur more than once in the container, causing + // the linked list to fail. + iter->modifyImage(); + + MagickCore::Image* current = iter->image(); + + current->previous = previous; + current->next = 0; + current->scene = scene++; + + if ( previous != 0) + previous->next = current; + + previous = current; + } + return(scene > 0 ? true : false); + } + + // Remove links added by linkImages. This should be called after the + // ImageMagick function call has completed to reset the image list + // back to its pristine un-linked state. + template + void unlinkImages( InputIterator first_, + InputIterator last_ ) { + for( InputIterator iter = first_; iter != last_; ++iter ) + { + MagickCore::Image* image = iter->image(); + image->previous = 0; + image->next = 0; + } + } + + // Insert images in image list into existing container (appending to container) + // The images should not be deleted since only the image ownership is passed. + // The options are copied into the object. + template + void insertImages( Container *sequence_, + MagickCore::Image* images_ ) { + MagickCore::Image *image = images_; + if ( image ) + { + do + { + MagickCore::Image* next_image = image->next; + image->next = 0; + + if (next_image != 0) + next_image->previous=0; + + sequence_->push_back( Magick::Image( image ) ); + + image=next_image; + } while( image ); + + return; + } + } + + /////////////////////////////////////////////////////////////////// + // + // Template definitions for documented API + // + /////////////////////////////////////////////////////////////////// + + template + void animateImages( InputIterator first_, + InputIterator last_ ) { + if (linkImages(first_,last_) == false) + return; + GetPPException; + MagickCore::AnimateImages( first_->imageInfo(), first_->image() ); + MagickCore::GetImageException( first_->image(), exceptionInfo ); + unlinkImages( first_, last_ ); + ThrowPPException(first_->quiet()); + } + + // Append images from list into single image in either horizontal or + // vertical direction. + template + void appendImages( Image *appendedImage_, + InputIterator first_, + InputIterator last_, + bool stack_ = false) { + if (linkImages(first_,last_) == false) + return; + GetPPException; + MagickCore::Image* image = MagickCore::AppendImages( first_->image(), + (MagickBooleanType) stack_, + exceptionInfo ); + unlinkImages( first_, last_ ); + appendedImage_->replaceImage( image ); + ThrowPPException(appendedImage_->quiet()); + } + + // Adds the names of the artifacts of the image to the container. + template + void artifactNames(Container *names_,const Image* image_) + { + char* + name; + + names_->clear(); + + MagickCore::ResetImageArtifactIterator(image_->constImage()); + name=MagickCore::GetNextImageArtifact(image_->constImage()); + while (name != (char *) NULL) + { + names_->push_back(std::string(name)); + name=MagickCore::GetNextImageArtifact(image_->constImage()); + } + } + + // Adds the names of the attributes of the image to the container. + template + void attributeNames(Container *names_,const Image* image_) + { + char* + name; + + names_->clear(); + + MagickCore::ResetImagePropertyIterator(image_->constImage()); + name=MagickCore::GetNextImageProperty(image_->constImage()); + while (name != (char *) NULL) + { + names_->push_back(std::string(name)); + name=MagickCore::GetNextImageProperty(image_->constImage()); + } + } + + // Average a set of images. + // All the input images must be the same size in pixels. + template + void averageImages( Image *averagedImage_, + InputIterator first_, + InputIterator last_ ) { + GetPPException; + linkImages( first_, last_ ); + MagickCore::Image* image = MagickCore::EvaluateImages( first_->image(), + MagickCore::MeanEvaluateOperator, exceptionInfo ); + unlinkImages( first_, last_ ); + averagedImage_->replaceImage( image ); + ThrowPPException(averagedImage_->quiet()); + } + + // Merge a sequence of images. + // This is useful for GIF animation sequences that have page + // offsets and disposal methods. A container to contain + // the updated image sequence is passed via the coalescedImages_ + // option. + template + void coalesceImages(Container *coalescedImages_,InputIterator first_, + InputIterator last_) + { + bool + quiet; + + MagickCore::Image + *images; + + if (linkImages(first_,last_) == false) + return; + + GetPPException; + quiet=first_->quiet(); + images=MagickCore::CoalesceImages( first_->image(),exceptionInfo); + + // Unlink image list + unlinkImages(first_,last_); + + // Ensure container is empty + coalescedImages_->clear(); + + // Move images to container + insertImages(coalescedImages_,images); + + // Report any error + ThrowPPException(quiet); + } + + // Return format coders matching specified conditions. + // + // The default (if no match terms are supplied) is to return all + // available format coders. + // + // For example, to return all readable formats: + // list coderList; + // coderInfoList( &coderList, CoderInfo::TrueMatch, CoderInfo::AnyMatch, CoderInfo::AnyMatch) + // + template + void coderInfoList( Container *container_, + CoderInfo::MatchType isReadable_ = CoderInfo::AnyMatch, + CoderInfo::MatchType isWritable_ = CoderInfo::AnyMatch, + CoderInfo::MatchType isMultiFrame_ = CoderInfo::AnyMatch + ) { + // Obtain first entry in MagickInfo list + size_t number_formats; + GetPPException; + char **coder_list = + MagickCore::GetMagickList( "*", &number_formats, exceptionInfo ); + if( !coder_list ) + { + throwException(exceptionInfo); + throwExceptionExplicit(MagickCore::MissingDelegateError, + "Coder array not returned!", 0 ); + } + + // Clear out container + container_->clear(); + + for ( ::ssize_t i=0; i < (::ssize_t) number_formats; i++) + { + const MagickCore::MagickInfo *magick_info = + MagickCore::GetMagickInfo( coder_list[i], exceptionInfo ); + coder_list[i]=(char *) + MagickCore::RelinquishMagickMemory( coder_list[i] ); + + // Skip stealth coders + if ( magick_info->stealth ) + continue; + + try { + CoderInfo coderInfo( magick_info->name ); + + // Test isReadable_ + if ( isReadable_ != CoderInfo::AnyMatch && + (( coderInfo.isReadable() && isReadable_ != CoderInfo::TrueMatch ) || + ( !coderInfo.isReadable() && isReadable_ != CoderInfo::FalseMatch )) ) + continue; + + // Test isWritable_ + if ( isWritable_ != CoderInfo::AnyMatch && + (( coderInfo.isWritable() && isWritable_ != CoderInfo::TrueMatch ) || + ( !coderInfo.isWritable() && isWritable_ != CoderInfo::FalseMatch )) ) + continue; + + // Test isMultiFrame_ + if ( isMultiFrame_ != CoderInfo::AnyMatch && + (( coderInfo.isMultiFrame() && isMultiFrame_ != CoderInfo::TrueMatch ) || + ( !coderInfo.isMultiFrame() && isMultiFrame_ != CoderInfo::FalseMatch )) ) + continue; + + // Append matches to container + container_->push_back( coderInfo ); + } + // Intentionally ignore missing module errors + catch (Magick::ErrorModule&) + { + continue; + } + } + coder_list=(char **) MagickCore::RelinquishMagickMemory( coder_list ); + ThrowPPException(false); + } + + // + // Fill container with color histogram. + // Entries are of type "std::pair". Use the pair + // "first" member to access the Color and the "second" member to access + // the number of times the color occurs in the image. + // + // For example: + // + // Using : + // + // Image image("image.miff"); + // map histogram; + // colorHistogram( &histogram, image ); + // std::map::const_iterator p=histogram.begin(); + // while (p != histogram.end()) + // { + // cout << setw(10) << (int)p->second << ": (" + // << setw(quantum_width) << (int)p->first.redQuantum() << "," + // << setw(quantum_width) << (int)p->first.greenQuantum() << "," + // << setw(quantum_width) << (int)p->first.blueQuantum() << ")" + // << endl; + // p++; + // } + // + // Using : + // + // Image image("image.miff"); + // std::vector > histogram; + // colorHistogram( &histogram, image ); + // std::vector >::const_iterator p=histogram.begin(); + // while (p != histogram.end()) + // { + // cout << setw(10) << (int)p->second << ": (" + // << setw(quantum_width) << (int)p->first.redQuantum() << "," + // << setw(quantum_width) << (int)p->first.greenQuantum() << "," + // << setw(quantum_width) << (int)p->first.blueQuantum() << ")" + // << endl; + // p++; + // } + + template + void colorHistogram( Container *histogram_, const Image image) + { + GetPPException; + + // Obtain histogram array + size_t colors; + MagickCore::ColorPacket *histogram_array = + MagickCore::GetImageHistogram( image.constImage(), &colors, exceptionInfo ); + ThrowPPException(image.quiet()); + + // Clear out container + histogram_->clear(); + + // Transfer histogram array to container + for ( size_t i=0; i < colors; i++) + { + histogram_->insert( histogram_->end(), std::pair + ( Color(histogram_array[i].pixel), (size_t) histogram_array[i].count) ); + } + + // Deallocate histogram array + histogram_array=(MagickCore::ColorPacket *) + MagickCore::RelinquishMagickMemory(histogram_array); + } + + // Combines one or more images into a single image. The grayscale value of + // the pixels of each image in the sequence is assigned in order to the + // specified channels of the combined image. The typical ordering would be + // image 1 => Red, 2 => Green, 3 => Blue, etc. + template + void combineImages( Image *combinedImage_, + InputIterator first_, + InputIterator last_, + const ChannelType channel_ ) { + if (linkImages(first_,last_) == false) + return; + GetPPException; + MagickCore::Image* image = CombineImages( first_->image(), channel_, exceptionInfo ); + unlinkImages( first_, last_ ); + combinedImage_->replaceImage( image ); + ThrowPPException(combinedImage_->quiet()); + } + + template + void cropToTiles(Container *tiledImages_,const Image image_, + const Geometry &geometry_) + { + GetPPException; + MagickCore::Image* images=CropImageToTiles(image_.constImage(), + static_cast(geometry_).c_str(),exceptionInfo); + tiledImages_->clear(); + insertImages(tiledImages_,images); + ThrowPPException(image_.quiet()); + } + + // Break down an image sequence into constituent parts. This is + // useful for creating GIF or MNG animation sequences. + template + void deconstructImages(Container *deconstructedImages_,InputIterator first_, + InputIterator last_) + { + bool + quiet; + + MagickCore::Image + *images; + + if (linkImages(first_,last_) == false) + return; + + GetPPException; + quiet=first_->quiet(); + images=DeconstructImages(first_->image(),exceptionInfo); + + // Unlink image list + unlinkImages(first_,last_); + + // Ensure container is empty + deconstructedImages_->clear(); + + // Move images to container + insertImages(deconstructedImages_,images); + + // Report any error + ThrowPPException(quiet); + } + + // + // Display an image sequence + // + template + void displayImages( InputIterator first_, + InputIterator last_ ) { + if (linkImages(first_,last_) == false) + return; + GetPPException; + MagickCore::DisplayImages( first_->imageInfo(), first_->image() ); + MagickCore::GetImageException( first_->image(), exceptionInfo ); + unlinkImages( first_, last_ ); + ThrowPPException(first_->quiet()); + } + + // Applies a value to the image with an arithmetic, relational, + // or logical operator to an image. Use these operations to lighten or darken + // an image, to increase or decrease contrast in an image, or to produce the + // "negative" of an image. + template + void evaluateImages( Image *evaluatedImage_, + InputIterator first_, + InputIterator last_, + const MagickEvaluateOperator operator_ ) { + if (linkImages(first_,last_) == false) + return; + GetPPException; + MagickCore::Image* image = EvaluateImages( first_->image(), operator_, exceptionInfo ); + unlinkImages( first_, last_ ); + evaluatedImage_->replaceImage( image ); + ThrowPPException(evaluatedImage_->quiet()); + } + + // Merge a sequence of image frames which represent image layers. + // This is useful for combining Photoshop layers into a single image. + template + void flattenImages( Image *flattendImage_, + InputIterator first_, + InputIterator last_ ) { + if (linkImages(first_,last_) == false) + return; + GetPPException; + MagickCore::Image* image = MagickCore::MergeImageLayers( first_->image(), + FlattenLayer,exceptionInfo ); + unlinkImages( first_, last_ ); + flattendImage_->replaceImage( image ); + ThrowPPException(flattendImage_->quiet()); + } + + // Implements the discrete Fourier transform (DFT) of the image either as a + // magnitude / phase or real / imaginary image pair. + template + void forwardFourierTransformImage( Container *fourierImages_, + const Image &image_ ) { + GetPPException; + + // Build image list + MagickCore::Image* images = ForwardFourierTransformImage( + image_.constImage(), MagickTrue, exceptionInfo); + + // Ensure container is empty + fourierImages_->clear(); + + // Move images to container + insertImages( fourierImages_, images ); + + // Report any error + ThrowPPException(image_.quiet()); + } + template + void forwardFourierTransformImage( Container *fourierImages_, + const Image &image_, const bool magnitude_ ) { + GetPPException; + + // Build image list + MagickCore::Image* images = ForwardFourierTransformImage( + image_.constImage(), magnitude_ == true ? MagickTrue : MagickFalse, + exceptionInfo); + + // Ensure container is empty + fourierImages_->clear(); + + // Move images to container + insertImages( fourierImages_, images ); + + // Report any error + ThrowPPException(image_.quiet()); + } + + // Applies a mathematical expression to a sequence of images. + template + void fxImages(Image *fxImage_,InputIterator first_,InputIterator last_, + const std::string expression) + { + MagickCore::Image + *image; + + if (linkImages(first_,last_) == false) + return; + GetPPException; + image=FxImageChannel(first_->constImage(),DefaultChannels, + expression.c_str(),exceptionInfo); + unlinkImages(first_,last_); + fxImage_->replaceImage(image); + ThrowPPException(fxImage_->quiet()); + } + + // Replace the colors of a sequence of images with the closest color + // from a reference image. + // Set dither_ to true to enable dithering. Set measureError_ to + // true in order to evaluate quantization error. + template + void mapImages( InputIterator first_, + InputIterator last_, + const Image& mapImage_, + bool dither_ = false, + bool measureError_ = false ) { + + if (linkImages(first_,last_) == false) + return; + GetPPException; + MagickCore::QuantizeInfo quantizeInfo; + MagickCore::GetQuantizeInfo( &quantizeInfo ); + quantizeInfo.dither = dither_ ? MagickCore::MagickTrue : MagickCore::MagickFalse; + MagickCore::RemapImages( &quantizeInfo, first_->image(), + (mapImage_.isValid() ? mapImage_.constImage() : (const MagickCore::Image*) NULL)); + MagickCore::GetImageException( first_->image(), exceptionInfo ); + if ( exceptionInfo->severity != MagickCore::UndefinedException ) + { + unlinkImages( first_, last_ ); + throwException(exceptionInfo,mapImage_.quiet()); + } + + MagickCore::Image* image = first_->image(); + while( image ) + { + // Calculate quantization error + if ( measureError_ ) + { + MagickCore::GetImageQuantizeError( image ); + if ( image->exception.severity > MagickCore::UndefinedException ) + { + unlinkImages( first_, last_ ); + throwException(exceptionInfo,mapImage_.quiet()); + } + } + + // Udate DirectClass representation of pixels + MagickCore::SyncImage( image ); + if ( image->exception.severity > MagickCore::UndefinedException ) + { + unlinkImages( first_, last_ ); + throwException(exceptionInfo,mapImage_.quiet()); + } + + // Next image + image=image->next; + } + + unlinkImages( first_, last_ ); + (void) MagickCore::DestroyExceptionInfo( exceptionInfo ); + } + + // Composes all the image layers from the current given + // image onward to produce a single image of the merged layers. + template + void mergeImageLayers( Image *mergedImage_, + InputIterator first_, + InputIterator last_, + const ImageLayerMethod method_ ) { + if (linkImages(first_,last_) == false) + return; + GetPPException; + MagickCore::Image* image = MergeImageLayers( first_->image(), method_, exceptionInfo ); + unlinkImages( first_, last_ ); + mergedImage_->replaceImage( image ); + ThrowPPException(mergedImage_->quiet()); + } + + // Create a composite image by combining several separate images. + template + void montageImages(Container *montageImages_,InputIterator first_, + InputIterator last_,const Montage &options_) + { + bool + quiet; + + MagickCore::Image + *images; + + MagickCore::MontageInfo + *montageInfo; + + if (linkImages(first_,last_) == false) + return; + + montageInfo=static_cast( + MagickCore::AcquireMagickMemory(sizeof(MagickCore::MontageInfo))); + + // Update montage options with those set in montageOpts_ + options_.updateMontageInfo(*montageInfo); + + // Update options which must transfer to image options + if (options_.label().length() != 0) + first_->label(options_.label()); + + // Do montage + GetPPException; + quiet=first_->quiet(); + images=MagickCore::MontageImages(first_->image(),montageInfo, + exceptionInfo); + + // Unlink linked image list + unlinkImages(first_,last_); + + // Reset output container to pristine state + montageImages_->clear(); + + if (images != (MagickCore::Image *) NULL) + insertImages(montageImages_,images); + + // Clean up any allocated data in montageInfo + MagickCore::DestroyMontageInfo(montageInfo); + + // Report any montage error + ThrowPPException(quiet); + + // Apply transparency to montage images + if (montageImages_->size() > 0 && options_.transparentColor().isValid()) + for_each(montageImages_->begin(),montageImages_->end(),transparentImage( + options_.transparentColor())); + } + + // Morph a set of images + template + void morphImages(Container *morphedImages_,InputIterator first_, + InputIterator last_,size_t frames_) + { + bool + quiet; + + MagickCore::Image + *images; + + if (linkImages(first_,last_) == false) + return; + GetPPException; + quiet=first_->quiet(); + images=MagickCore::MorphImages(first_->image(),frames_,exceptionInfo); + + // Unlink image list + unlinkImages(first_,last_); + + // Ensure container is empty + morphedImages_->clear(); + + // Move images to container + insertImages(morphedImages_,images); + + // Report any error + ThrowPPException(quiet); + } + + // Inlay a number of images to form a single coherent picture. + template + void mosaicImages( Image *mosaicImage_, + InputIterator first_, + InputIterator last_ ) { + if (linkImages(first_,last_) == false) + return; + GetPPException; + MagickCore::Image* image = MagickCore::MergeImageLayers( first_->image(), + MosaicLayer,exceptionInfo ); + unlinkImages( first_, last_ ); + mosaicImage_->replaceImage( image ); + ThrowPPException(mosaicImage_->quiet()); + } + + // Compares each image the GIF disposed forms of the previous image in + // the sequence. From this it attempts to select the smallest cropped + // image to replace each frame, while preserving the results of the + // GIF animation. + template + void optimizeImageLayers(Container *optimizedImages_,InputIterator first_, + InputIterator last_) + { + bool + quiet; + + MagickCore::Image + *images; + + if (linkImages(first_,last_) == false) + return; + GetPPException; + quiet=first_->quiet(); + images=OptimizeImageLayers(first_->image(),exceptionInfo); + + unlinkImages(first_,last_); + + optimizedImages_->clear(); + + insertImages(optimizedImages_,images); + + ThrowPPException(quiet); + } + + // optimizeImagePlusLayers is exactly as optimizeImageLayers, but may + // also add or even remove extra frames in the animation, if it improves + // the total number of pixels in the resulting GIF animation. + template + void optimizePlusImageLayers(Container *optimizedImages_, + InputIterator first_,InputIterator last_) + { + bool + quiet; + + MagickCore::Image + *images; + + if (linkImages(first_,last_) == false) + return; + GetPPException; + quiet=first_->quiet(); + images=OptimizePlusImageLayers(first_->image(),exceptionInfo); + + unlinkImages(first_,last_); + + optimizedImages_->clear(); + + insertImages(optimizedImages_,images); + + ThrowPPException(quiet); + } + + // Compares each image the GIF disposed forms of the previous image in the + // sequence. Any pixel that does not change the displayed result is replaced + // with transparency. + template + void optimizeTransparency(InputIterator first_,InputIterator last_) + { + if (linkImages(first_,last_) == false) + return; + GetPPException; + OptimizeImageTransparency(first_->image(),exceptionInfo); + unlinkImages(first_,last_ ); + + ThrowPPException(first_->quiet()); + } + + // Adds the names of the profiles from the image to the container. + template + void profileNames(Container *names_,const Image* image_) + { + const char + *name; + + names_->clear(); + + MagickCore::ResetImageProfileIterator(image_->constImage()); + name=MagickCore::GetNextImageProfile(image_->constImage()); + while (name != (const char *) NULL) + { + names_->push_back(std::string(name)); + name=MagickCore::GetNextImageProfile(image_->constImage()); + } + } + + // Quantize colors in images using current quantization settings + // Set measureError_ to true in order to measure quantization error + template + void quantizeImages( InputIterator first_, + InputIterator last_, + bool measureError_ = false ) { + if (linkImages(first_,last_) == false) + return; + GetPPException; + + MagickCore::QuantizeImages( first_->quantizeInfo(), + first_->image() ); + MagickCore::GetImageException( first_->image(), exceptionInfo ); + if ( exceptionInfo->severity > MagickCore::UndefinedException ) + { + unlinkImages( first_, last_ ); + throwException(exceptionInfo,first_->quiet()); + } + + MagickCore::Image* image = first_->image(); + while( image != 0 ) + { + // Calculate quantization error + if ( measureError_ ) + MagickCore::GetImageQuantizeError( image ); + + // Update DirectClass representation of pixels + MagickCore::SyncImage( image ); + + // Next image + image=image->next; + } + + unlinkImages( first_, last_ ); + (void) MagickCore::DestroyExceptionInfo( exceptionInfo ); + } + + // Read images into existing container (appending to container) + template + void readImages(Container *sequence_,const std::string &imageSpec_, + ReadOptions &options) + { + MagickCore::Image + *images; + + MagickCore::ImageInfo + *imageInfo; + + imageInfo=options.imageInfo(); + imageSpec_.copy(imageInfo->filename,MaxTextExtent-1); + imageInfo->filename[imageSpec_.length()] = 0; + GetPPException; + images=MagickCore::ReadImage(imageInfo,exceptionInfo); + insertImages(sequence_,images); + ThrowPPException(options.quiet()); + } + + template + void readImages(Container *sequence_,const std::string &imageSpec_) + { + ReadOptions options; + readImages(sequence_,imageSpec_,options); + } + + template + void readImages(Container *sequence_,const Blob &blob_,ReadOptions &options) + { + MagickCore::Image + *images; + + GetPPException; + images=MagickCore::BlobToImage(options.imageInfo(),blob_.data(), + blob_.length(),exceptionInfo); + insertImages(sequence_,images); + ThrowPPException(options.quiet()); + } + + template + void readImages(Container *sequence_,const Blob &blob_) + { + ReadOptions options; + readImages(sequence_,blob_,options); + } + + // Returns a separate grayscale image for each channel specified. + template + void separateImages( Container *separatedImages_, + const Image &image_, + const ChannelType channel_ ) { + GetPPException; + + MagickCore::Image* images = MagickCore::SeparateImages( image_.constImage(), channel_, exceptionInfo ); + + separatedImages_->clear(); + + insertImages( separatedImages_, images ); + + ThrowPPException(image_.quiet()); + } + + // Smush images from list into single image in either horizontal or + // vertical direction. + template + void smushImages(Image *smushedImage_,InputIterator first_, + InputIterator last_,const ssize_t offset_,bool stack_=false) + { + MagickCore::Image + *newImage; + + if (linkImages(first_,last_) == false) + return; + GetPPException; + newImage=MagickCore::SmushImages(first_->constImage(), + (MagickBooleanType) stack_,offset_,exceptionInfo); + unlinkImages(first_,last_); + smushedImage_->replaceImage(newImage); + ThrowPPException(smushedImage_->quiet()); + } + + // Write Images + template + void writeImages( InputIterator first_, + InputIterator last_, + const std::string &imageSpec_, + bool adjoin_ = true ) { + if (linkImages(first_,last_) == false) + return; + + first_->adjoin( adjoin_ ); + + GetPPException; + ::ssize_t errorStat = MagickCore::WriteImages( first_->constImageInfo(), + first_->image(), + imageSpec_.c_str(), + exceptionInfo ); + unlinkImages( first_, last_ ); + + if ( errorStat != false ) + { + (void) MagickCore::DestroyExceptionInfo( exceptionInfo ); + return; + } + + ThrowPPException(first_->quiet()); + } + // Write images to BLOB + template + void writeImages( InputIterator first_, + InputIterator last_, + Blob *blob_, + bool adjoin_ = true) { + if (linkImages(first_,last_) == false) + return; + + first_->adjoin( adjoin_ ); + + GetPPException; + size_t length = 2048; // Efficient size for small images + void* data = MagickCore::ImagesToBlob( first_->imageInfo(), + first_->image(), + &length, + exceptionInfo); + blob_->updateNoCopy( data, length, Magick::Blob::MallocAllocator ); + + unlinkImages( first_, last_ ); + + ThrowPPException(first_->quiet()); + } + +} // namespace Magick + +#endif // Magick_STL_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Thread.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Thread.h new file mode 100644 index 0000000..f646364 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/Thread.h @@ -0,0 +1,100 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2003 +// +// Definition of types and classes to support threads +// +// This class is a Magick++ implementation class and is not intended +// for use by end-users. +// +#if !defined (Magick_Thread_header) +#define Magick_Thread_header + +#include "Magick++/Include.h" + +#if defined(_VISUALC_) +#include +#if defined(_MT) +struct win32_mutex { + HANDLE id; +}; + +// This is a binary semphore -- increase for a counting semaphore +#define MAXSEMLEN 1 +#endif // defined(_MT) +#endif // defined(_VISUALC_) + +#if defined(MAGICKCORE_HAVE_PTHREAD) +# include +#endif // defined(MAGICKCORE_HAVE_PTHREAD) + +namespace Magick +{ + // Mutex lock wrapper + class MagickPPExport MutexLock + { + public: + // Default constructor + MutexLock(void); + + // Destructor + ~MutexLock(void); + + // Lock mutex + void lock(void); + + // Unlock mutex + void unlock(void); + + private: + + // Don't support copy constructor + MutexLock ( const MutexLock& original_ ); + + // Don't support assignment + MutexLock& operator = ( const MutexLock& original_ ); + +#if defined(MAGICKCORE_HAVE_PTHREAD) + pthread_mutex_t _mutex; +#endif +#if defined(_MT) && defined(_VISUALC_) + win32_mutex _mutex; +#endif + }; + + // Lock mutex while object is in scope + class MagickPPExport Lock + { + public: + // Construct with mutex lock (locks mutex) + Lock( MutexLock *mutexLock_ ); + + // Destrutor (unlocks mutex) + ~Lock( void ); + private: + + // Don't support copy constructor + Lock ( const Lock& original_ ); + + // Don't support assignment + Lock& operator = ( const Lock& original_ ); + + MutexLock* _mutexLock; + }; +} + +// Construct with mutex lock (locks mutex) +inline Magick::Lock::Lock( MutexLock *mutexLock_ ) + : _mutexLock(mutexLock_) +{ + _mutexLock->lock(); +} + +// Destrutor (unlocks mutex) +inline Magick::Lock::~Lock( void ) +{ + _mutexLock->unlock(); + _mutexLock=0; +} + +#endif // Magick_Thread_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Magick++/TypeMetric.h b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/TypeMetric.h new file mode 100644 index 0000000..338616b --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Magick++/TypeMetric.h @@ -0,0 +1,59 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 2001, 2002 +// Copyright Dirk Lemstra 2014 +// +// TypeMetric Definition +// +// Container for font type metrics +// + +#if !defined (Magick_TypeMetric_header) +#define Magick_TypeMetric_header + +#include "Magick++/Include.h" + +namespace Magick +{ + class MagickPPExport TypeMetric + { + friend class Image; + + public: + + // Default constructor + TypeMetric(void); + + // Destructor + ~TypeMetric(void); + + // Ascent, the distance in pixels from the text baseline to the + // highest/upper grid coordinate used to place an outline point. + double ascent(void) const; + + // Descent, the distance in pixels from the baseline to the lowest + // grid coordinate used to place an outline point. Always a + // negative value. + double descent(void) const; + + // Maximum horizontal advance in pixels. + double maxHorizontalAdvance(void) const; + + // Text height in pixels. + double textHeight(void) const; + + // Text width in pixels. + double textWidth(void) const; + + // Underline position. + double underlinePosition(void) const; + + // Underline thickness. + double underlineThickness(void) const; + + private: + MagickCore::TypeMetric _typeMetric; + }; +} // namespace Magick + +#endif // Magick_TypeMetric_header diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Montage.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Montage.cpp new file mode 100644 index 0000000..b209dc7 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Montage.cpp @@ -0,0 +1,119 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// +// Implementation of Montage +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include +#include + +#include "Magick++/Montage.h" +#include "Magick++/Functions.h" + +Magick::Montage::Montage(void) + : _backgroundColor("#ffffff"), + _compose(OverCompositeOp), + _fileName(), + _fill("#000000ff"), + _font(), + _geometry("120x120+4+3>"), + _gravity(CenterGravity), + _label(), + _pointSize(12), + _shadow(false), + _stroke(), + _texture(), + _tile("6x4"), + _title(), + _transparentColor() +{ +} + +Magick::Montage::~Montage(void) +{ +} + +void Magick::Montage::updateMontageInfo(MontageInfo &montageInfo_) const +{ + (void) memset(&montageInfo_,0,sizeof(montageInfo_)); + + // background_color + montageInfo_.background_color=_backgroundColor; + // border_color + montageInfo_.border_color=Color(); + // border_width + montageInfo_.border_width=0; + // filename + if (_fileName.length() != 0) + { + _fileName.copy(montageInfo_.filename,MaxTextExtent-1); + montageInfo_.filename[_fileName.length()]=0; // null terminate + } + // fill + montageInfo_.fill=_fill; + // font + if (_font.length() != 0) + Magick::CloneString(&montageInfo_.font,_font); + // geometry + if (_geometry.isValid()) + Magick::CloneString(&montageInfo_.geometry,_geometry); + // gravity + montageInfo_.gravity=_gravity; + // matte_color + montageInfo_.matte_color=Color(); + // pointsize + montageInfo_.pointsize=_pointSize; + // shadow + montageInfo_.shadow=static_cast(_shadow ? MagickTrue : + MagickFalse); + // signature (validity stamp) + montageInfo_.signature=MagickSignature; + // stroke + montageInfo_.stroke=_stroke; + // texture + if (_texture.length() != 0) + Magick::CloneString(&montageInfo_.texture,_texture); + // tile + if (_tile.isValid()) + Magick::CloneString( &montageInfo_.tile, _tile ); + // title + if (_title.length() != 0) + Magick::CloneString(&montageInfo_.title,_title); +} + +// +// Implementation of MontageFramed +// + +Magick::MontageFramed::MontageFramed(void) + : _borderColor("#dfdfdf"), + _borderWidth(0), + _frame(), + _matteColor("#bdbdbd") +{ +} + +Magick::MontageFramed::~MontageFramed(void) +{ +} + +void Magick::MontageFramed::updateMontageInfo(MontageInfo &montageInfo_) const +{ + // Do base updates + Montage::updateMontageInfo(montageInfo_); + + // border_color + montageInfo_.border_color=_borderColor; + // border_width + montageInfo_.border_width=_borderWidth; + // frame + if (_frame.isValid()) + Magick::CloneString(&montageInfo_.frame,_frame); + // matte_color + montageInfo_.matte_color=_matteColor; +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Options.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Options.cpp new file mode 100644 index 0000000..3d943e4 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Options.cpp @@ -0,0 +1,1053 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2014-2015 +// +// Implementation of Options +// +// A wrapper around DrawInfo, ImageInfo, and QuantizeInfo +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include +#include +#include +#include + +#include "Magick++/Options.h" +#include "Magick++/Functions.h" +#include "Magick++/Exception.h" + +#define MagickPI 3.14159265358979323846264338327950288419716939937510 +#define DegreesToRadians(x) (MagickPI*(x)/180.0) + +Magick::Options::Options(void) + : _imageInfo(static_cast(AcquireMagickMemory( + sizeof(ImageInfo)))), + _quantizeInfo(static_cast(AcquireMagickMemory( + sizeof(QuantizeInfo)))), + _drawInfo(static_cast(AcquireMagickMemory(sizeof(DrawInfo)))), + _quiet(false) +{ + // Initialize image info with defaults + GetImageInfo(_imageInfo); + + // Initialize quantization info + GetQuantizeInfo(_quantizeInfo); + + // Initialize drawing info + GetDrawInfo(_imageInfo,_drawInfo); +} + +Magick::Options::Options(const Magick::Options& options_) + : _imageInfo(CloneImageInfo(options_._imageInfo)), + _quantizeInfo(CloneQuantizeInfo(options_._quantizeInfo)), + _drawInfo(CloneDrawInfo(_imageInfo,options_._drawInfo)), + _quiet(false) +{ +} + +Magick::Options::~Options() +{ + // Destroy image info + _imageInfo=DestroyImageInfo(_imageInfo); + + // Destroy quantization info + _quantizeInfo=DestroyQuantizeInfo(_quantizeInfo); + + // Destroy drawing info + _drawInfo=DestroyDrawInfo(_drawInfo); +} + +void Magick::Options::antiAlias(bool flag_) +{ + _drawInfo->text_antialias=static_cast( + flag_ ? MagickTrue : MagickFalse); +} + +bool Magick::Options::antiAlias(void) const +{ + return(static_cast(_drawInfo->text_antialias)); +} + +void Magick::Options::adjoin(bool flag_) +{ + _imageInfo->adjoin=static_cast( + flag_ ? MagickTrue : MagickFalse); +} + +bool Magick::Options::adjoin(void) const +{ + return(static_cast(_imageInfo->adjoin)); +} + +void Magick::Options::backgroundColor(const Magick::Color &color_) +{ + _imageInfo->background_color=color_; +} + +Magick::Color Magick::Options::backgroundColor(void) const +{ + return(Magick::Color(_imageInfo->background_color)); +} + +void Magick::Options::backgroundTexture(const std::string &backgroundTexture_) +{ + if (backgroundTexture_.length() == 0) + _imageInfo->texture=(char *) RelinquishMagickMemory(_imageInfo->texture); + else + Magick::CloneString(&_imageInfo->texture,backgroundTexture_); +} + +std::string Magick::Options::backgroundTexture(void) const +{ + if (_imageInfo->texture) + return(std::string(_imageInfo->texture)); + else + return(std::string()); +} + +void Magick::Options::borderColor(const Color &color_) +{ + _imageInfo->border_color=color_; + _drawInfo->border_color=color_; +} + +Magick::Color Magick::Options::borderColor(void) const +{ + return(Magick::Color(_imageInfo->border_color)); +} + +void Magick::Options::boxColor(const Magick::Color &boxColor_) +{ + _drawInfo->undercolor=boxColor_; +} + +Magick::Color Magick::Options::boxColor(void) const +{ + return(Magick::Color(_drawInfo->undercolor)); +} + +void Magick::Options::colorspaceType(Magick::ColorspaceType colorspace_) +{ + _imageInfo->colorspace=colorspace_; +} + +Magick::ColorspaceType Magick::Options::colorspaceType(void) const +{ + return(static_cast(_imageInfo->colorspace)); +} + +void Magick::Options::compressType(CompressionType compressType_) +{ + _imageInfo->compression=compressType_; +} + +Magick::CompressionType Magick::Options::compressType(void) const +{ + return(static_cast(_imageInfo->compression)); +} + +void Magick::Options::colorFuzz(double fuzz_) +{ + _imageInfo->fuzz=fuzz_; +} + +double Magick::Options::colorFuzz(void) const +{ + return(_imageInfo->fuzz); +} + +void Magick::Options::debug(bool flag_) +{ + if (flag_) + SetLogEventMask("All"); + else + SetLogEventMask("None"); +} + +bool Magick::Options::debug(void) const +{ + if (IsEventLogging()) + return(true); + + return(false); +} + +void Magick::Options::density(const Magick::Geometry &density_) +{ + if (!density_.isValid()) + _imageInfo->density=(char *) RelinquishMagickMemory(_imageInfo->density); + else + Magick::CloneString(&_imageInfo->density,density_); +} + +Magick::Geometry Magick::Options::density(void) const +{ + if (_imageInfo->density) + return(Geometry(_imageInfo->density)); + + return(Geometry()); +} + +void Magick::Options::depth(size_t depth_) +{ + _imageInfo->depth=depth_; +} + +size_t Magick::Options::depth(void) const +{ + return(_imageInfo->depth); +} + +void Magick::Options::endian(Magick::EndianType endian_) +{ + _imageInfo->endian=endian_; +} + +Magick::EndianType Magick::Options::endian(void) const +{ + return(_imageInfo->endian); +} + +void Magick::Options::file(FILE *file_) +{ + SetImageInfoFile(_imageInfo,file_); +} + +FILE *Magick::Options::file(void) const +{ + return(GetImageInfoFile(_imageInfo)); +} + +void Magick::Options::fileName(const std::string &fileName_) +{ + ssize_t + max_length; + + max_length=sizeof(_imageInfo->filename)-1; + fileName_.copy(_imageInfo->filename,max_length); + if ((ssize_t) fileName_.length() > max_length) + _imageInfo->filename[max_length]=0; + else + _imageInfo->filename[fileName_.length()]=0; +} + +std::string Magick::Options::fileName(void) const +{ + return(std::string(_imageInfo->filename)); +} + +void Magick::Options::fillColor(const Magick::Color &fillColor_) +{ + _drawInfo->fill=fillColor_; + if (fillColor_ == Magick::Color()) + fillPattern((const MagickCore::Image*) NULL); + setOption("fill",fillColor_); +} + +Magick::Color Magick::Options::fillColor(void) const +{ + return(_drawInfo->fill); +} + +void Magick::Options::fillPattern(const MagickCore::Image *fillPattern_) +{ + if (_drawInfo->fill_pattern) + { + DestroyImageList(_drawInfo->fill_pattern); + _drawInfo->fill_pattern=0; + } + if (fillPattern_) + { + GetPPException; + _drawInfo->fill_pattern=CloneImage(const_cast( + fillPattern_),0,0,static_cast(MagickTrue), + exceptionInfo); + ThrowPPException(_quiet); + } +} + +const MagickCore::Image *Magick::Options::fillPattern(void) const +{ + return(_drawInfo->fill_pattern); +} + +void Magick::Options::fillRule(const Magick::FillRule &fillRule_) +{ + _drawInfo->fill_rule=fillRule_; +} + +Magick::FillRule Magick::Options::fillRule(void) const +{ + return(_drawInfo->fill_rule); +} + +void Magick::Options::font(const std::string &font_) +{ + if (font_.length() == 0) + { + _imageInfo->font=(char *) RelinquishMagickMemory(_imageInfo->font); + _drawInfo->font=(char *) RelinquishMagickMemory(_drawInfo->font); + } + else + { + Magick::CloneString(&_imageInfo->font,font_); + Magick::CloneString(&_drawInfo->font,font_); + } +} + +std::string Magick::Options::font(void) const +{ + if (_imageInfo->font) + return(std::string(_imageInfo->font)); + + return(std::string()); +} + +void Magick::Options::fontFamily(const std::string &family_) +{ + if (family_.length() == 0) + { + _drawInfo->family=(char *) RelinquishMagickMemory(_drawInfo->font); + DestroyString(RemoveImageOption(imageInfo(),"family")); + } + else + { + Magick::CloneString(&_drawInfo->family,family_); + (void) SetImageOption(imageInfo(),"family",family_.c_str()); + } +} + +std::string Magick::Options::fontFamily(void) const +{ + if (_drawInfo->family) + return(std::string(_drawInfo->family)); + + return(std::string()); +} + +void Magick::Options::fontPointsize(double pointSize_) +{ + _imageInfo->pointsize=pointSize_; + _drawInfo->pointsize=pointSize_; +} + +double Magick::Options::fontPointsize(void) const +{ + return(_imageInfo->pointsize); +} + +void Magick::Options::fontStyle(const StyleType style_) +{ + _drawInfo->style=style_; + (void) SetImageOption(_imageInfo,"style",CommandOptionToMnemonic( + MagickStyleOptions,(ssize_t) style_)); +} + +Magick::StyleType Magick::Options::fontStyle(void) const +{ + return(_drawInfo->style); +} + +void Magick::Options::fontWeight(const size_t weight_) +{ + _drawInfo->weight=weight_; + setOption("weight",(double) weight_); +} + +size_t Magick::Options::fontWeight(void) const +{ + return(_drawInfo->weight); +} + + +std::string Magick::Options::format(void) const +{ + const MagickInfo + *magick_info=0; + + GetPPException; + if (*_imageInfo->magick != '\0') + magick_info=GetMagickInfo(_imageInfo->magick,exceptionInfo); + ThrowPPException(_quiet); + + if ((magick_info != 0) && (*magick_info->description != '\0')) + return(std::string(magick_info->description)); + + return(std::string()); +} + +void Magick::Options::interlaceType(Magick::InterlaceType interlace_) +{ + _imageInfo->interlace=interlace_; +} + +Magick::InterlaceType Magick::Options::interlaceType(void) const +{ + return(static_cast(_imageInfo->interlace)); +} + +void Magick::Options::magick(const std::string &magick_) +{ + if (magick_.empty()) + { + _imageInfo->magick[0] = '\0'; + return; + } + + FormatLocaleString(_imageInfo->filename,MaxTextExtent,"%.1024s:", + magick_.c_str()); + GetPPException; + SetImageInfo(_imageInfo,1,exceptionInfo); + ThrowPPException(_quiet); + if ( _imageInfo->magick[0] == '\0' ) + throwExceptionExplicit(OptionWarning,"Unrecognized image format", + magick_.c_str()); +} + +std::string Magick::Options::magick(void) const +{ + if ( _imageInfo->magick[0] != '\0' ) + return(std::string(_imageInfo->magick)); + + return(std::string()); +} + +void Magick::Options::matteColor(const Magick::Color &matteColor_) +{ + _imageInfo->matte_color=matteColor_; +} + +Magick::Color Magick::Options::matteColor(void) const +{ + return(Magick::Color(_imageInfo->matte_color)); +} + +void Magick::Options::monochrome(bool monochromeFlag_) +{ + _imageInfo->monochrome=(MagickBooleanType) monochromeFlag_; +} + +bool Magick::Options::monochrome(void) const +{ + return(static_cast(_imageInfo->monochrome)); +} + +void Magick::Options::page(const Magick::Geometry &pageSize_) +{ + if (!pageSize_.isValid()) + _imageInfo->page=(char *) RelinquishMagickMemory(_imageInfo->page); + else + Magick::CloneString(&_imageInfo->page,pageSize_); +} + +Magick::Geometry Magick::Options::page(void) const +{ + if (_imageInfo->page) + return(Geometry(_imageInfo->page)); + + return(Geometry()); +} + +void Magick::Options::quality(size_t quality_) +{ + _imageInfo->quality=quality_; +} + +size_t Magick::Options::quality(void) const +{ + return(_imageInfo->quality); +} + +void Magick::Options::quantizeColors(size_t colors_) +{ + _quantizeInfo->number_colors=colors_; +} + +size_t Magick::Options::quantizeColors(void) const +{ + return(_quantizeInfo->number_colors); +} + +void Magick::Options::quantizeColorSpace(Magick::ColorspaceType colorSpace_) +{ + _quantizeInfo->colorspace=colorSpace_; +} + +Magick::ColorspaceType Magick::Options::quantizeColorSpace(void) const +{ + return(static_cast(_quantizeInfo->colorspace)); +} + +void Magick::Options::quantizeDither(bool ditherFlag_) +{ + _imageInfo->dither=(MagickBooleanType) ditherFlag_; + _quantizeInfo->dither=(MagickBooleanType) ditherFlag_; +} + +bool Magick::Options::quantizeDither(void) const +{ + return(static_cast(_imageInfo->dither)); +} + +void Magick::Options::quantizeDitherMethod(DitherMethod ditherMethod_) +{ + _quantizeInfo->dither_method=ditherMethod_; +} + +MagickCore::DitherMethod Magick::Options::quantizeDitherMethod(void) const +{ + return(_quantizeInfo->dither_method); +} + +void Magick::Options::quantizeTreeDepth(size_t treeDepth_) +{ + _quantizeInfo->tree_depth=treeDepth_; +} + +size_t Magick::Options::quantizeTreeDepth(void) const +{ + return(_quantizeInfo->tree_depth); +} + +void Magick::Options::quiet(const bool quiet_) +{ + _quiet=quiet_; +} + +bool Magick::Options::quiet(void) const +{ + return(_quiet); +} + +void Magick::Options::resolutionUnits(Magick::ResolutionType resolutionUnits_) +{ + _imageInfo->units=resolutionUnits_; +} + +Magick::ResolutionType Magick::Options::resolutionUnits(void) const +{ + return(_imageInfo->units); +} + +void Magick::Options::samplingFactor(const std::string &samplingFactor_) +{ + if (samplingFactor_.length() == 0) + _imageInfo->sampling_factor=(char *) RelinquishMagickMemory( + _imageInfo->sampling_factor); + else + Magick::CloneString(&_imageInfo->sampling_factor, samplingFactor_); +} + +std::string Magick::Options::samplingFactor(void) const +{ + if (_imageInfo->sampling_factor) + return(std::string(_imageInfo->sampling_factor)); + + return(std::string()); +} + +void Magick::Options::size(const Geometry &geometry_) +{ + _imageInfo->size=(char *) RelinquishMagickMemory(_imageInfo->size); + + if ( geometry_.isValid() ) + Magick::CloneString(&_imageInfo->size,geometry_); +} + +Magick::Geometry Magick::Options::size(void) const +{ + if (_imageInfo->size) + return(Geometry(_imageInfo->size)); + + return(Geometry()); +} + +void Magick::Options::strokeAntiAlias(bool flag_) +{ + flag_ ? _drawInfo->stroke_antialias=MagickTrue : + _drawInfo->stroke_antialias=MagickFalse; +} + +bool Magick::Options::strokeAntiAlias(void) const +{ + return(_drawInfo->stroke_antialias != 0 ? true : false); +} + +void Magick::Options::strokeColor(const Magick::Color &strokeColor_) +{ + _drawInfo->stroke=strokeColor_; + if (strokeColor_ == Magick::Color()) + strokePattern((const MagickCore::Image*) NULL); + setOption("stroke",strokeColor_); +} + +Magick::Color Magick::Options::strokeColor(void) const +{ + return(_drawInfo->stroke); +} + +void Magick::Options::strokeDashArray(const double *strokeDashArray_) +{ + _drawInfo->dash_pattern=(double *) RelinquishMagickMemory( + _drawInfo->dash_pattern); + + if(strokeDashArray_) + { + size_t + x; + + // Count elements in dash array + for (x=0; strokeDashArray_[x]; x++) ; + // Allocate elements + _drawInfo->dash_pattern=static_cast(AcquireMagickMemory((x+1)* + sizeof(double))); + if (!_drawInfo->dash_pattern) + throwExceptionExplicit(MagickCore::ResourceLimitError, + "Unable to allocate dash-pattern memory"); + // Copy elements + memcpy(_drawInfo->dash_pattern,strokeDashArray_,(x+1)*sizeof(double)); + _drawInfo->dash_pattern[x]=0.0; + } +} + +const double *Magick::Options::strokeDashArray(void) const +{ + return(_drawInfo->dash_pattern); +} + +void Magick::Options::strokeDashOffset(double strokeDashOffset_) +{ + _drawInfo->dash_offset=strokeDashOffset_; +} + +double Magick::Options::strokeDashOffset(void) const +{ + return(_drawInfo->dash_offset); +} + +void Magick::Options::strokeLineCap(Magick::LineCap lineCap_) +{ + _drawInfo->linecap=lineCap_; +} + +Magick::LineCap Magick::Options::strokeLineCap(void) const +{ + return(_drawInfo->linecap); +} + +void Magick::Options::strokeLineJoin(Magick::LineJoin lineJoin_) +{ + _drawInfo->linejoin=lineJoin_; +} + +Magick::LineJoin Magick::Options::strokeLineJoin(void) const +{ + return(_drawInfo->linejoin); +} + +void Magick::Options::strokeMiterLimit(size_t miterLimit_) +{ + _drawInfo->miterlimit=miterLimit_; +} + +size_t Magick::Options::strokeMiterLimit(void) const +{ + return(_drawInfo->miterlimit); +} + +void Magick::Options::strokePattern(const MagickCore::Image *strokePattern_) +{ + if (_drawInfo->stroke_pattern) + _drawInfo->stroke_pattern=DestroyImageList(_drawInfo->stroke_pattern); + + if (strokePattern_) + { + GetPPException; + _drawInfo->stroke_pattern=CloneImage(const_cast( + strokePattern_),0,0,MagickTrue,exceptionInfo); + ThrowPPException(_quiet); + } +} + +const MagickCore::Image *Magick::Options::strokePattern(void) const +{ + return(_drawInfo->stroke_pattern); +} + +void Magick::Options::strokeWidth(double strokeWidth_) +{ + _drawInfo->stroke_width=strokeWidth_; +} + +double Magick::Options::strokeWidth(void) const +{ + return(_drawInfo->stroke_width); +} + +void Magick::Options::subImage(size_t subImage_) +{ + _imageInfo->scene=subImage_; +} + +size_t Magick::Options::subImage(void) const +{ + return(_imageInfo->scene); +} + +void Magick::Options::subRange(size_t subRange_) +{ + _imageInfo->number_scenes=subRange_; +} + +size_t Magick::Options::subRange(void) const +{ + return(_imageInfo->number_scenes); +} + +void Magick::Options::textDirection(DirectionType direction_) +{ + _drawInfo->direction=direction_; + (void) SetImageOption(_imageInfo,"direction",CommandOptionToMnemonic( + MagickDirectionOptions,(ssize_t) direction_)); +} + +Magick::DirectionType Magick::Options::textDirection() const +{ + return(_drawInfo->direction); +} + +void Magick::Options::textEncoding(const std::string &encoding_) +{ + CloneString(&_drawInfo->encoding,encoding_.c_str()); + (void) SetImageOption(imageInfo(),"encoding",encoding_.c_str()); +} + +std::string Magick::Options::textEncoding(void) const +{ + if (_drawInfo->encoding && *_drawInfo->encoding) + return(std::string(_drawInfo->encoding)); + + return(std::string()); +} + +void Magick::Options::textGravity(GravityType gravity_) +{ + _drawInfo->gravity=gravity_; + (void) SetImageOption(_imageInfo,"gravity",CommandOptionToMnemonic( + MagickGravityOptions,(ssize_t) gravity_)); +} + +Magick::GravityType Magick::Options::textGravity() const +{ + return(_drawInfo->gravity); +} + +void Magick::Options::textInterlineSpacing(double spacing_) +{ + _drawInfo->interline_spacing=spacing_; + setOption("interline-spacing",spacing_); +} + +double Magick::Options::textInterlineSpacing(void) const +{ + return(_drawInfo->interline_spacing); +} + +void Magick::Options::textInterwordSpacing(double spacing_) +{ + _drawInfo->interword_spacing=spacing_; + setOption("interword-spacing",spacing_); +} + +double Magick::Options::textInterwordSpacing(void) const +{ + return(_drawInfo->interword_spacing); +} + +void Magick::Options::textKerning(double kerning_) +{ + _drawInfo->kerning=kerning_; + setOption("kerning",kerning_); +} + +double Magick::Options::textKerning(void) const +{ + return(_drawInfo->kerning); +} + +void Magick::Options::textUnderColor(const Magick::Color &undercolor_) +{ + _drawInfo->undercolor=undercolor_; + setOption("undercolor",undercolor_); +} + +Magick::Color Magick::Options::textUnderColor(void) const +{ + return(_drawInfo->undercolor); +} + + +void Magick::Options::tileName(const std::string &tileName_) +{ + if (tileName_.length() == 0) + _imageInfo->tile=(char *) RelinquishMagickMemory(_imageInfo->tile); + else + Magick::CloneString(&_imageInfo->tile,tileName_); +} + +std::string Magick::Options::tileName(void) const +{ + if (_imageInfo->tile) + return(std::string(_imageInfo->tile)); + return(std::string()); +} + +void Magick::Options::transformOrigin(double tx_,double ty_) +{ + AffineMatrix + affine, + current=_drawInfo->affine; + + affine.sx=1.0; + affine.rx=0.0; + affine.ry=0.0; + affine.sy=1.0; + affine.tx=0.0; + affine.ty=0.0; + + affine.tx=tx_; + affine.ty=ty_; + + _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; + _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; +} + +void Magick::Options::transformReset(void) +{ + _drawInfo->affine.sx=1.0; + _drawInfo->affine.rx=0.0; + _drawInfo->affine.ry=0.0; + _drawInfo->affine.sy=1.0; + _drawInfo->affine.tx=0.0; + _drawInfo->affine.ty=0.0; +} + +void Magick::Options::transformRotation(double angle_) +{ + AffineMatrix + affine, + current=_drawInfo->affine; + + affine.sx=1.0; + affine.rx=0.0; + affine.ry=0.0; + affine.sy=1.0; + affine.tx=0.0; + affine.ty=0.0; + + affine.sx=cos(DegreesToRadians(fmod(angle_,360.0))); + affine.rx=(-sin(DegreesToRadians(fmod(angle_,360.0)))); + affine.ry=sin(DegreesToRadians(fmod(angle_,360.0))); + affine.sy=cos(DegreesToRadians(fmod(angle_,360.0))); + + _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; + _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; +} + +void Magick::Options::transformScale(double sx_,double sy_) +{ + AffineMatrix + affine, + current=_drawInfo->affine; + + affine.sx=1.0; + affine.rx=0.0; + affine.ry=0.0; + affine.sy=1.0; + affine.tx=0.0; + affine.ty=0.0; + + affine.sx=sx_; + affine.sy=sy_; + + _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; + _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; +} + +void Magick::Options::transformSkewX(double skewx_) +{ + AffineMatrix + affine, + current=_drawInfo->affine; + + affine.sx=1.0; + affine.rx=0.0; + affine.ry=0.0; + affine.sy=1.0; + affine.tx=0.0; + affine.ty=0.0; + + affine.sx=1.0; + affine.ry=tan(DegreesToRadians(fmod(skewx_,360.0))); + affine.sy=1.0; + + _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; + _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; +} + +void Magick::Options::transformSkewY(double skewy_) +{ + AffineMatrix + affine, + current=_drawInfo->affine; + + affine.sx=1.0; + affine.rx=0.0; + affine.ry=0.0; + affine.sy=1.0; + affine.tx=0.0; + affine.ty=0.0; + + affine.sx=1.0; + affine.rx=tan(DegreesToRadians(fmod(skewy_,360.0))); + affine.sy=1.0; + + _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; + _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; +} + +void Magick::Options::type(const Magick::ImageType type_) +{ + _imageInfo->type=type_; +} + +Magick::ImageType Magick::Options::type(void) const +{ + return(_imageInfo->type); +} + +void Magick::Options::verbose(bool verboseFlag_) +{ + _imageInfo->verbose=(MagickBooleanType) verboseFlag_; +} + +bool Magick::Options::verbose(void) const +{ + return(static_cast(_imageInfo->verbose)); +} + +void Magick::Options::virtualPixelMethod( + VirtualPixelMethod virtual_pixel_method_) +{ + _imageInfo->virtual_pixel_method=virtual_pixel_method_; +} + +Magick::VirtualPixelMethod Magick::Options::virtualPixelMethod(void) const +{ + return(static_cast( + _imageInfo->virtual_pixel_method)); +} + +void Magick::Options::view(const std::string &view_) +{ + if (view_.length() == 0) + _imageInfo->view=(char *) RelinquishMagickMemory(_imageInfo->view); + else + Magick::CloneString(&_imageInfo->view,view_); +} + +std::string Magick::Options::view(void) const +{ + if (_imageInfo->view) + return(std::string(_imageInfo->view)); + + return(std::string()); +} + +void Magick::Options::x11Display(const std::string &display_) +{ + if (display_.length() == 0) + _imageInfo->server_name=(char *) RelinquishMagickMemory( + _imageInfo->server_name); + else + Magick::CloneString(&_imageInfo->server_name,display_); +} + +std::string Magick::Options::x11Display(void) const +{ + if (_imageInfo->server_name) + return(std::string(_imageInfo->server_name)); + + return(std::string()); +} + +MagickCore::DrawInfo *Magick::Options::drawInfo(void) +{ + return(_drawInfo); +} + +MagickCore::ImageInfo *Magick::Options::imageInfo(void) +{ + return(_imageInfo); +} + +MagickCore::QuantizeInfo *Magick::Options::quantizeInfo( void ) +{ + return(_quantizeInfo); +} + +Magick::Options::Options(const MagickCore::ImageInfo *imageInfo_, + const MagickCore::QuantizeInfo *quantizeInfo_, + const MagickCore::DrawInfo *drawInfo_) +: _imageInfo((MagickCore::ImageInfo* ) NULL), + _quantizeInfo((MagickCore::QuantizeInfo* ) NULL), + _drawInfo((MagickCore::DrawInfo* ) NULL), + _quiet(false) +{ + _imageInfo=CloneImageInfo(imageInfo_); + _quantizeInfo=CloneQuantizeInfo(quantizeInfo_); + _drawInfo=CloneDrawInfo(imageInfo_,drawInfo_); +} + +void Magick::Options::setOption(const char *name,const Color &value_) +{ + std::string + option; + + option=value_; + (void) SetImageOption(imageInfo(),name,option.c_str()); +} + +void Magick::Options::setOption(const char *name,const double value_) +{ + char + option[MaxTextExtent]; + + (void) FormatLocaleString(option,MaxTextExtent,"%.20g",value_); + (void) SetImageOption(_imageInfo,name,option); +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Pixels.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Pixels.cpp new file mode 100644 index 0000000..ae312dc --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Pixels.cpp @@ -0,0 +1,194 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// Copyright Dirk Lemstra 2014 +// +// Pixels Implementation +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Include.h" +#include // This is here to compile with Visual C++ +#include "Magick++/Thread.h" +#include "Magick++/Exception.h" +#include "Magick++/Pixels.h" + +Magick::Pixels::Pixels(Magick::Image &image_) + : _image(image_), + _x(0), + _y(0), + _columns(0), + _rows(0) +{ + GetPPException; + _view=AcquireVirtualCacheView(image_.image(),exceptionInfo); + ThrowPPException(image_.quiet()); +} + +Magick::Pixels::~Pixels(void) +{ + if (_view != (MagickCore::CacheView *) NULL) + _view=DestroyCacheView(_view); +} + +Magick::PixelPacket* Magick::Pixels::get(const ssize_t x_,const ssize_t y_, + const size_t columns_,const size_t rows_) +{ + _x=x_; + _y=y_; + _columns=columns_; + _rows=rows_; + + GetPPException; + PixelPacket* pixels=GetCacheViewAuthenticPixels(_view,x_,y_,columns_,rows_, + exceptionInfo); + ThrowPPException(_image.quiet()); + + return pixels; +} + +const Magick::PixelPacket* Magick::Pixels::getConst(const ssize_t x_, + const ssize_t y_,const size_t columns_,const size_t rows_) +{ + _x=x_; + _y=y_; + _columns=columns_; + _rows=rows_; + + GetPPException; + const PixelPacket* pixels=GetCacheViewVirtualPixels(_view,x_,y_,columns_, + rows_,exceptionInfo); + ThrowPPException(_image.quiet()); + + return pixels; +} + +Magick::PixelPacket* Magick::Pixels::set(const ssize_t x_,const ssize_t y_, + const size_t columns_,const size_t rows_) +{ + _x=x_; + _y=y_; + _columns=columns_; + _rows=rows_; + + GetPPException; + PixelPacket* pixels=QueueCacheViewAuthenticPixels(_view,x_,y_,columns_,rows_, + exceptionInfo); + ThrowPPException(_image.quiet()); + + return pixels; +} + +void Magick::Pixels::sync(void) +{ + GetPPException; + (void) SyncCacheViewAuthenticPixels(_view,exceptionInfo); + ThrowPPException(_image.quiet()); +} + +Magick::IndexPacket* Magick::Pixels::indexes (void) +{ + IndexPacket* pixel_indexes=GetCacheViewAuthenticIndexQueue(_view); + + if (!pixel_indexes) + _image.throwImageException(); + + return pixel_indexes; +} + +Magick::PixelData::PixelData(Magick::Image &image_,std::string map_, + const StorageType type_) +{ + init(image_,0,0,image_.columns(),image_.rows(),map_,type_); +} + +Magick::PixelData::PixelData(Magick::Image &image_,const ::ssize_t x_, + const ::ssize_t y_,const size_t width_,const size_t height_,std::string map_, + const StorageType type_) +{ + init(image_,x_,y_,width_,height_,map_,type_); +} + +Magick::PixelData::~PixelData(void) +{ + relinquish(); +} + +const void *Magick::PixelData::data(void) const +{ + return(_data); +} + +::ssize_t Magick::PixelData::length(void) const +{ + return(_length); +} + +::ssize_t Magick::PixelData::size(void) const +{ + return(_size); +} + +void Magick::PixelData::init(Magick::Image &image_,const ::ssize_t x_, + const ::ssize_t y_,const size_t width_,const size_t height_, + std::string map_,const StorageType type_) +{ + size_t + size; + + _data=(void *) NULL; + _length=0; + _size=0; + if ((x_ < 0) || (width_ == 0) || (y_ < 0) || (height_ == 0) || + (x_ > (ssize_t) image_.columns()) || ((width_ + x_) > image_.columns()) + || (y_ > (ssize_t) image_.rows()) || ((height_ + y_) > image_.rows()) + || (map_.length() == 0)) + return; + + switch(type_) + { + case CharPixel: + size=sizeof(unsigned char); + break; + case DoublePixel: + size=sizeof(double); + break; + case FloatPixel: + size=sizeof(float); + break; + case IntegerPixel: + case LongPixel: + size=sizeof(unsigned int); + break; + case QuantumPixel: + size=sizeof(Quantum); + break; + case ShortPixel: + size=sizeof(unsigned short); + break; + default: + throwExceptionExplicit(OptionError,"Invalid type"); + return; + } + + _length=width_*height_*map_.length(); + _size=_length*size; + _data=AcquireMagickMemory(_size); + + GetPPException; + MagickCore::ExportImagePixels(image_.constImage(),x_,y_,width_,height_, + map_.c_str(),type_,_data,exceptionInfo); + if (exceptionInfo->severity != UndefinedException) + relinquish(); + ThrowPPException(image_.quiet()); +} + +void Magick::PixelData::relinquish(void) throw() +{ + if (_data != (void *)NULL) + _data=RelinquishMagickMemory(_data); + _length=0; + _size=0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/ResourceLimits.cpp b/ImageMagick-6.9.12-44/Magick++/lib/ResourceLimits.cpp new file mode 100644 index 0000000..ac7d59e --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/ResourceLimits.cpp @@ -0,0 +1,115 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Dirk Lemstra 2014-2018 +// +// Implementation of ResourceLimits +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/ResourceLimits.h" + +void Magick::ResourceLimits::area(const MagickSizeType limit_) +{ + (void) SetMagickResourceLimit(AreaResource,limit_); +} + +MagickCore::MagickSizeType Magick::ResourceLimits::area(void) +{ + return(GetMagickResourceLimit(AreaResource)); +} + +void Magick::ResourceLimits::disk(const MagickSizeType limit_) +{ + (void) SetMagickResourceLimit(DiskResource,limit_); +} + +MagickCore::MagickSizeType Magick::ResourceLimits::disk(void) +{ + return(GetMagickResourceLimit(DiskResource)); +} + +void Magick::ResourceLimits::file(const MagickSizeType limit_) +{ + (void) SetMagickResourceLimit(FileResource,limit_); +} + +MagickCore::MagickSizeType Magick::ResourceLimits::file(void) +{ + return(GetMagickResourceLimit(FileResource)); +} + +void Magick::ResourceLimits::height(const MagickSizeType limit_) +{ + (void) SetMagickResourceLimit(HeightResource,limit_); +} + +MagickCore::MagickSizeType Magick::ResourceLimits::height(void) +{ + return(GetMagickResourceLimit(HeightResource)); +} + +void Magick::ResourceLimits::listLength(const MagickSizeType limit_) +{ + (void) SetMagickResourceLimit(ListLengthResource,limit_); +} + +MagickCore::MagickSizeType Magick::ResourceLimits::listLength(void) +{ + return(GetMagickResourceLimit(ListLengthResource)); +} + +void Magick::ResourceLimits::map(const MagickSizeType limit_) +{ + (void) SetMagickResourceLimit(MapResource,limit_); +} + +MagickCore::MagickSizeType Magick::ResourceLimits::map(void) +{ + return(GetMagickResourceLimit(MapResource)); +} + +void Magick::ResourceLimits::memory(const MagickSizeType limit_) +{ + (void) SetMagickResourceLimit(MemoryResource,limit_); +} + +MagickCore::MagickSizeType Magick::ResourceLimits::memory(void) +{ + return(GetMagickResourceLimit(MemoryResource)); +} + +void Magick::ResourceLimits::thread(const MagickSizeType limit_) +{ + (void) SetMagickResourceLimit(ThreadResource,limit_); +} + +MagickCore::MagickSizeType Magick::ResourceLimits::thread(void) +{ + return(GetMagickResourceLimit(ThreadResource)); +} + +void Magick::ResourceLimits::throttle(const MagickSizeType limit_) +{ + (void) SetMagickResourceLimit(ThrottleResource,limit_); +} + +MagickCore::MagickSizeType Magick::ResourceLimits::throttle(void) +{ + return(GetMagickResourceLimit(ThrottleResource)); +} + +void Magick::ResourceLimits::width(const MagickSizeType limit_) +{ + (void) SetMagickResourceLimit(WidthResource,limit_); +} + +MagickCore::MagickSizeType Magick::ResourceLimits::width(void) +{ + return(GetMagickResourceLimit(WidthResource)); +} + +Magick::ResourceLimits::ResourceLimits() +{ +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/STL.cpp b/ImageMagick-6.9.12-44/Magick++/lib/STL.cpp new file mode 100644 index 0000000..08ae27f --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/STL.cpp @@ -0,0 +1,1728 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2002 +// Copyright Dirk Lemstra 2013-2014 +// +// Implementation of STL classes and functions +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include +#include +#include + +// Adaptive-blur image with specified blur factor +Magick::adaptiveBlurImage::adaptiveBlurImage( const double radius_, + const double sigma_ ) + : _radius( radius_ ), + _sigma( sigma_ ) +{ +} +void Magick::adaptiveBlurImage::operator()( Magick::Image &image_ ) const +{ + image_.adaptiveBlur( _radius, _sigma ); +} + +// Local adaptive threshold image +Magick::adaptiveThresholdImage::adaptiveThresholdImage( const size_t width_, + const size_t height_, + const ssize_t offset_ ) + : _width(width_), + _height(height_), + _offset(offset_) +{ +} +void Magick::adaptiveThresholdImage::operator()( Magick::Image &image_ ) const +{ + image_.adaptiveThreshold( _width, _height, _offset ); +} + +// Add noise to image with specified noise type +Magick::addNoiseImage::addNoiseImage( Magick::NoiseType noiseType_ ) + : _noiseType( noiseType_ ) +{ +} +void Magick::addNoiseImage::operator()( Magick::Image &image_ ) const +{ + image_.addNoise( _noiseType ); +} + +// Transform image by specified affine (or free transform) matrix. +Magick::affineTransformImage::affineTransformImage( const DrawableAffine &affine_ ) + : _affine( affine_ ) +{ +} +void Magick::affineTransformImage::operator()( Magick::Image &image_ ) const +{ + image_.affineTransform( _affine ); +} + +// Annotate image (draw text on image) + +// Annotate using specified text, and placement location +Magick::annotateImage::annotateImage ( const std::string &text_, + const Magick::Geometry &geometry_ ) + : _text( text_ ), + _geometry( geometry_ ), + _gravity( Magick::NorthWestGravity ), + _degrees( 0 ) +{ +} +// Annotate using specified text, bounding area, and placement gravity +Magick::annotateImage::annotateImage ( const std::string &text_, + const Magick::Geometry &geometry_, + const Magick::GravityType gravity_ ) + : _text( text_ ), + _geometry( geometry_ ), + _gravity( gravity_ ), + _degrees( 0 ) +{ +} +// Annotate with text using specified text, bounding area, placement +// gravity, and rotation. +Magick::annotateImage::annotateImage ( const std::string &text_, + const Magick::Geometry &geometry_, + const Magick::GravityType gravity_, + const double degrees_ ) + : _text( text_ ), + _geometry( geometry_ ), + _gravity( gravity_ ), + _degrees( degrees_ ) +{ +} +// Annotate with text (bounding area is entire image) and placement +// gravity. +Magick::annotateImage::annotateImage ( const std::string &text_, + const Magick::GravityType gravity_ ) + : _text( text_ ), + _geometry( ), + _gravity( gravity_ ), + _degrees( 0 ) +{ +} +void Magick::annotateImage::operator()( Magick::Image &image_ ) const +{ + image_.annotate( _text, _geometry, _gravity, _degrees ); +} + +// Blur image with specified blur factor +Magick::blurImage::blurImage( const double radius_, const double sigma_ ) + : _radius( radius_ ), + _sigma( sigma_ ) +{ +} +void Magick::blurImage::operator()( Magick::Image &image_ ) const +{ + image_.blur( _radius, _sigma ); +} + +// Border image (add border to image) +Magick::borderImage::borderImage( const Magick::Geometry &geometry_ ) + : _geometry( geometry_ ) +{ +} +void Magick::borderImage::operator()( Magick::Image &image_ ) const +{ + image_.border( _geometry ); +} + +// Extract channel from image +Magick::channelImage::channelImage( const Magick::ChannelType channel_ ) + : _channel( channel_ ) +{ +} +void Magick::channelImage::operator()( Magick::Image &image_ ) const +{ + image_.channel( _channel ); +} + +// Charcoal effect image (looks like charcoal sketch) +Magick::charcoalImage::charcoalImage( const double radius_, const double sigma_ ) + : _radius( radius_ ), + _sigma( sigma_ ) +{ +} +void Magick::charcoalImage::operator()( Magick::Image &image_ ) const +{ + image_.charcoal( _radius, _sigma ); +} + +// Chop image (remove vertical or horizontal subregion of image) +Magick::chopImage::chopImage( const Magick::Geometry &geometry_ ) + : _geometry( geometry_ ) +{ +} +void Magick::chopImage::operator()( Magick::Image &image_ ) const +{ + image_.chop( _geometry ); +} + +// accepts a lightweight Color Correction Collection (CCC) file which solely +// contains one or more color corrections and applies the correction to the +// image. +Magick::cdlImage::cdlImage( const std::string &cdl_ ) + : _cdl ( cdl_ ) +{ +} +void Magick::cdlImage::operator()( Image &image_ ) const +{ + image_.cdl( _cdl.c_str() ); +} + +// Colorize image using pen color at specified percent opacity +Magick::colorizeImage::colorizeImage( const unsigned int opacityRed_, + const unsigned int opacityGreen_, + const unsigned int opacityBlue_, + const Magick::Color &penColor_ ) + : _opacityRed ( opacityRed_ ), + _opacityGreen ( opacityGreen_ ), + _opacityBlue ( opacityBlue_ ), + _penColor( penColor_ ) +{ +} +Magick::colorizeImage::colorizeImage( const unsigned int opacity_, + const Magick::Color &penColor_ ) + : _opacityRed ( opacity_ ), + _opacityGreen ( opacity_ ), + _opacityBlue ( opacity_ ), + _penColor( penColor_ ) +{ +} +void Magick::colorizeImage::operator()( Magick::Image &image_ ) const +{ + image_.colorize( _opacityRed, _opacityGreen, _opacityBlue, _penColor ); +} + +// Apply a color matrix to the image channels. The user supplied +// matrix may be of order 1 to 5 (1x1 through 5x5). +Magick::colorMatrixImage::colorMatrixImage( const size_t order_, + const double *color_matrix_ ) + : _order( order_ ), + _color_matrix( color_matrix_ ) +{ +} +void Magick::colorMatrixImage::operator()( Image &image_ ) const +{ + image_.colorMatrix( _order, _color_matrix ); +} + +// Convert the image colorspace representation +Magick::colorSpaceImage::colorSpaceImage( Magick::ColorspaceType colorSpace_ ) + : _colorSpace( colorSpace_ ) +{ +} +void Magick::colorSpaceImage::operator()( Magick::Image &image_ ) const +{ + image_.colorSpace( _colorSpace ); +} + +// Comment image (add comment string to image) +Magick::commentImage::commentImage( const std::string &comment_ ) + : _comment( comment_ ) +{ +} +void Magick::commentImage::operator()( Magick::Image &image_ ) const +{ + image_.comment( _comment ); +} + +// Compose an image onto another at specified offset and using +// specified algorithm +Magick::compositeImage::compositeImage( const Magick::Image &compositeImage_, + ssize_t xOffset_, + ssize_t yOffset_, + Magick::CompositeOperator compose_ ) + : _compositeImage( compositeImage_ ), + _xOffset ( xOffset_ ), + _yOffset ( yOffset_ ), + _compose ( compose_ ) +{ +} +Magick::compositeImage::compositeImage( const Magick::Image &compositeImage_, + const Magick::Geometry &offset_, + Magick::CompositeOperator compose_ ) + : _compositeImage( compositeImage_ ), + _xOffset ( offset_.xOff() ), + _yOffset ( offset_.yOff() ), + _compose ( compose_ ) +{ +} +void Magick::compositeImage::operator()( Image &image_ ) const +{ + image_.composite( _compositeImage, _xOffset, _yOffset, _compose ); +} + +// Contrast image (enhance intensity differences in image) +Magick::contrastImage::contrastImage( const size_t sharpen_ ) + : _sharpen( sharpen_ ) +{ +} +void Magick::contrastImage::operator()( Magick::Image &image_ ) const +{ + image_.contrast( _sharpen ); +} + +// Crop image (subregion of original image) +Magick::cropImage::cropImage( const Magick::Geometry &geometry_ ) + : _geometry( geometry_ ) +{ +} +void Magick::cropImage::operator()( Magick::Image &image_ ) const +{ + image_.crop( _geometry ); +} + +// Cycle image colormap +Magick::cycleColormapImage::cycleColormapImage( const ssize_t amount_ ) + : _amount( amount_ ) +{ +} +void Magick::cycleColormapImage::operator()( Magick::Image &image_ ) const +{ + image_.cycleColormap( _amount ); +} + +// Despeckle image (reduce speckle noise) +Magick::despeckleImage::despeckleImage( void ) +{ +} +void Magick::despeckleImage::operator()( Magick::Image &image_ ) const +{ + image_.despeckle( ); +} + +// Distort image. distorts an image using various distortion methods, by +// mapping color lookups of the source image to a new destination image +// usally of the same size as the source image, unless 'bestfit' is set to +// true. +Magick::distortImage::distortImage( const Magick::DistortImageMethod method_, + const size_t number_arguments_, + const double *arguments_, + const bool bestfit_ ) + : _method ( method_ ), + _number_arguments ( number_arguments_ ), + _arguments ( arguments_ ), + _bestfit( bestfit_ ) +{ +} +Magick::distortImage::distortImage( const Magick::DistortImageMethod method_, + const size_t number_arguments_, + const double *arguments_ ) + : _method ( method_ ), + _number_arguments ( number_arguments_ ), + _arguments ( arguments_ ), + _bestfit( false ) +{ +} +void Magick::distortImage::operator()( Magick::Image &image_ ) const +{ + image_.distort( _method, _number_arguments, _arguments, _bestfit ); +} + +// Draw on image +Magick::drawImage::drawImage( const Magick::Drawable &drawable_ ) + : _drawableList() +{ + _drawableList.push_back( drawable_ ); +} +Magick::drawImage::drawImage( const std::list &drawable_ ) + : _drawableList( drawable_ ) +{ +} +void Magick::drawImage::operator()( Magick::Image &image_ ) const +{ + image_.draw( _drawableList ); +} + +// Edge image (hilight edges in image) +Magick::edgeImage::edgeImage( const double radius_ ) + : _radius( radius_ ) +{ +} +void Magick::edgeImage::operator()( Magick::Image &image_ ) const +{ + image_.edge( _radius ); +} + +// Emboss image (hilight edges with 3D effect) +Magick::embossImage::embossImage( void ) + : _radius( 1 ), + _sigma( 0.5 ) +{ +} +Magick::embossImage::embossImage( const double radius_, const double sigma_ ) + : _radius( radius_ ), + _sigma( sigma_ ) +{ +} +void Magick::embossImage::operator()( Magick::Image &image_ ) const +{ + image_.emboss( _radius, _sigma ); +} + +// Enhance image (minimize noise) +Magick::enhanceImage::enhanceImage( void ) +{ +} +void Magick::enhanceImage::operator()( Magick::Image &image_ ) const +{ + image_.enhance( ); +} + +// Equalize image (histogram equalization) +Magick::equalizeImage::equalizeImage( void ) +{ +} +void Magick::equalizeImage::operator()( Magick::Image &image_ ) const +{ + image_.equalize( ); +} + +// Color to use when filling drawn objects +Magick::fillColorImage::fillColorImage( const Magick::Color &fillColor_ ) + : _fillColor( fillColor_ ) +{ +} +void Magick::fillColorImage::operator()( Magick::Image &image_ ) const +{ + image_.fillColor( _fillColor ); +} + +// Flip image (reflect each scanline in the vertical direction) +Magick::flipImage::flipImage( void ) +{ +} +void Magick::flipImage::operator()( Magick::Image &image_ ) const +{ + image_.flip( ); +} + +// Flood-fill image with color +// Flood-fill color across pixels starting at target-pixel and +// stopping at pixels matching specified border color. Uses current +// fuzz setting when determining color match. +Magick::floodFillColorImage::floodFillColorImage( const ssize_t x_, + const ssize_t y_, + const Magick::Color &fillColor_ ) + : _x(x_), + _y(y_), + _fillColor(fillColor_), + _borderColor() +{ +} +Magick::floodFillColorImage::floodFillColorImage( const Magick::Geometry &point_, + const Magick::Color &fillColor_ ) + : _x(point_.xOff()), + _y(point_.yOff()), + _fillColor(fillColor_), + _borderColor() +{ +} +// Flood-fill color across pixels starting at target-pixel and +// stopping at pixels matching specified border color. Uses current +// fuzz setting when determining color match. +Magick::floodFillColorImage::floodFillColorImage( const ssize_t x_, + const ssize_t y_, + const Magick::Color &fillColor_, + const Magick::Color &borderColor_ ) + : _x(x_), + _y(y_), + _fillColor(fillColor_), + _borderColor(borderColor_) +{ +} +Magick::floodFillColorImage::floodFillColorImage( const Geometry &point_, + const Color &fillColor_, + const Color &borderColor_ ) + : _x(point_.xOff()), + _y(point_.yOff()), + _fillColor(fillColor_), + _borderColor(borderColor_) +{ +} +void Magick::floodFillColorImage::operator()( Magick::Image &image_ ) const +{ + if ( _borderColor.isValid() ) + { + image_.floodFillColor( _x, _y, _fillColor, _borderColor ); + } + else + { + image_.floodFillColor( _x, _y, _fillColor ); + } +} + +// Flood-fill image with texture + +// Flood-fill texture across pixels that match the color of the target +// pixel and are neighbors of the target pixel. Uses current fuzz +// setting when determining color match. +Magick::floodFillTextureImage::floodFillTextureImage( const ssize_t x_, + const ssize_t y_, + const Magick::Image &texture_ ) + : _x(x_), + _y(y_), + _texture(texture_), + _borderColor() +{ +} +Magick::floodFillTextureImage::floodFillTextureImage( const Magick::Geometry &point_, + const Magick::Image &texture_ ) + : _x(point_.xOff()), + _y(point_.yOff()), + _texture(texture_), + _borderColor() +{ +} +// Flood-fill texture across pixels starting at target-pixel and +// stopping at pixels matching specified border color. Uses current +// fuzz setting when determining color match. +Magick::floodFillTextureImage::floodFillTextureImage( const ssize_t x_, + const ssize_t y_, + const Magick::Image &texture_, + const Magick::Color &borderColor_ ) + : _x(x_), + _y(y_), + _texture(texture_), + _borderColor(borderColor_) +{ +} +Magick::floodFillTextureImage::floodFillTextureImage( const Magick::Geometry &point_, + const Magick::Image &texture_, + const Magick::Color &borderColor_ ) + : _x(point_.xOff()), + _y(point_.yOff()), + _texture(texture_), + _borderColor(borderColor_) +{ +} +void Magick::floodFillTextureImage::operator()( Magick::Image &image_ ) const +{ + if ( _borderColor.isValid() ) + { + image_.floodFillTexture( _x, _y, _texture, _borderColor ); + } + else + { + image_.floodFillTexture( _x, _y, _texture ); + } +} + +// Flop image (reflect each scanline in the horizontal direction) +Magick::flopImage::flopImage( void ) +{ +} +void Magick::flopImage::operator()( Magick::Image &image_ ) const +{ + image_.flop( ); +} + +// Frame image +Magick::frameImage::frameImage( const Magick::Geometry &geometry_ ) + : _width( geometry_.width() ), + _height( geometry_.height() ), + _outerBevel( geometry_.xOff() ), + _innerBevel( geometry_.yOff() ) +{ +} +Magick::frameImage::frameImage( const size_t width_, const size_t height_, + const ssize_t innerBevel_, const ssize_t outerBevel_ ) + : _width( width_ ), + _height( height_ ), + _outerBevel( outerBevel_ ), + _innerBevel( innerBevel_ ) +{ +} +void Magick::frameImage::operator()( Magick::Image &image_ ) const +{ + image_.frame( _width, _height, _innerBevel, _outerBevel ); +} + +// Gamma correct image +Magick::gammaImage::gammaImage( const double gamma_ ) + : _gammaRed( gamma_ ), + _gammaGreen( gamma_ ), + _gammaBlue( gamma_ ) +{ +} +Magick::gammaImage::gammaImage ( const double gammaRed_, + const double gammaGreen_, + const double gammaBlue_ ) + : _gammaRed( gammaRed_ ), + _gammaGreen( gammaGreen_ ), + _gammaBlue( gammaBlue_ ) +{ +} +void Magick::gammaImage::operator()( Magick::Image &image_ ) const +{ + image_.gamma( _gammaRed, _gammaGreen, _gammaBlue ); +} + +// Gaussian blur image +// The number of neighbor pixels to be included in the convolution +// mask is specified by 'width_'. The standard deviation of the +// gaussian bell curve is specified by 'sigma_'. +Magick::gaussianBlurImage::gaussianBlurImage( const double width_, + const double sigma_ ) + : _width( width_ ), + _sigma( sigma_ ) +{ +} +void Magick::gaussianBlurImage::operator()( Magick::Image &image_ ) const +{ + image_.gaussianBlur( _width, _sigma ); +} + +// Apply a color lookup table (Hald CLUT) to the image. +Magick::haldClutImage::haldClutImage( const Image &haldClutImage_ ) + : _haldClutImage ( haldClutImage_ ) +{ +} +void Magick::haldClutImage::operator()( Image &image_ ) const +{ + image_.haldClut( _haldClutImage ); +} + +// Implode image (special effect) +Magick::implodeImage::implodeImage( const double factor_ ) + : _factor( factor_ ) +{ +} +void Magick::implodeImage::operator()( Magick::Image &image_ ) const +{ + image_.implode( _factor ); +} + +// Implements the inverse discrete Fourier transform (IFT) of the image +// either as a magnitude / phase or real / imaginary image pair. +Magick::inverseFourierTransformImage::inverseFourierTransformImage( const Magick::Image &phaseImage_ ) + : _phaseImage( phaseImage_ ) +{ +} +void Magick::inverseFourierTransformImage::operator()( Magick::Image &image_ ) const +{ + image_.inverseFourierTransform( _phaseImage ); +} + +// Set image validity. Valid images become empty (inValid) if argument +// is false. +Magick::isValidImage::isValidImage( const bool isValid_ ) + : _isValid( isValid_ ) +{ +} +void Magick::isValidImage::operator()( Magick::Image &image_ ) const +{ + image_.isValid( _isValid ); +} + +// Label image +Magick::labelImage::labelImage( const std::string &label_ ) + : _label( label_ ) +{ +} +void Magick::labelImage::operator()( Magick::Image &image_ ) const +{ + image_.label( _label ); +} + +// Level image +Magick::levelImage::levelImage( const double black_point, + const double white_point, + const double mid_point ) + : _black_point(black_point), + _white_point(white_point), + _mid_point(mid_point) +{ +} +void Magick::levelImage::operator()( Magick::Image &image_ ) const +{ + image_.level( _black_point, _white_point, _mid_point ); +} + +// Level image channel +Magick::levelChannelImage::levelChannelImage( const Magick::ChannelType channel, const double black_point, + const double white_point, + const double mid_point ) + : _channel(channel), + _black_point(black_point), + _white_point(white_point), + _mid_point(mid_point) +{ +} + +void Magick::levelChannelImage::operator()( Magick::Image &image_ ) const +{ + image_.levelChannel( _channel, _black_point, _white_point, _mid_point ); +} + +// Magnify image by integral size +Magick::magnifyImage::magnifyImage( void ) +{ +} +void Magick::magnifyImage::operator()( Magick::Image &image_ ) const +{ + image_.magnify( ); +} + +// Remap image colors with closest color from reference image +Magick::mapImage::mapImage( const Magick::Image &mapImage_ , + const bool dither_ ) + : _mapImage( mapImage_ ), + _dither( dither_ ) +{ +} +void Magick::mapImage::operator()( Magick::Image &image_ ) const +{ + image_.map( _mapImage, _dither ); +} + +// Floodfill designated area with a matte value +Magick::matteFloodfillImage::matteFloodfillImage( const Color &target_ , + const unsigned int matte_, + const ssize_t x_, const ssize_t y_, + const PaintMethod method_ ) + : _target( target_ ), + _matte( matte_ ), + _x( x_ ), + _y( y_ ), + _method( method_ ) +{ +} +void Magick::matteFloodfillImage::operator()( Magick::Image &image_ ) const +{ + image_.matteFloodfill( _target, _matte, _x, _y, _method ); +} + +// Filter image by replacing each pixel component with the median +// color in a circular neighborhood +Magick::medianFilterImage::medianFilterImage( const double radius_ ) + : _radius( radius_ ) +{ +} +void Magick::medianFilterImage::operator()( Magick::Image &image_ ) const +{ + image_.medianFilter( _radius ); +} + +// Merge image layers +Magick::mergeLayersImage::mergeLayersImage( + Magick::ImageLayerMethod layerMethod_ ) + : _layerMethod( layerMethod_ ) +{ +} +void Magick::mergeLayersImage::operator()( Magick::Image &image_ ) const +{ + image_.mergeLayers( _layerMethod ); +} + +// Reduce image by integral size +Magick::minifyImage::minifyImage( void ) +{ +} +void Magick::minifyImage::operator()( Magick::Image &image_ ) const +{ + image_.minify( ); +} + +// Modulate percent hue, saturation, and brightness of an image +Magick::modulateImage::modulateImage( const double brightness_, + const double saturation_, + const double hue_ ) + : _brightness( brightness_ ), + _saturation( saturation_ ), + _hue( hue_ ) +{ +} +void Magick::modulateImage::operator()( Magick::Image &image_ ) const +{ + image_.modulate( _brightness, _saturation, _hue ); +} + +// Negate colors in image. Set grayscale to only negate grayscale +// values in image. +Magick::negateImage::negateImage( const bool grayscale_ ) + : _grayscale( grayscale_ ) +{ +} +void Magick::negateImage::operator()( Magick::Image &image_ ) const +{ + image_.negate( _grayscale ); +} + +// Normalize image (increase contrast by normalizing the pixel values +// to span the full range of color values) +Magick::normalizeImage::normalizeImage( void ) +{ +} +void Magick::normalizeImage::operator()( Magick::Image &image_ ) const +{ + image_.normalize( ); +} + +// Oilpaint image (image looks like oil painting) +Magick::oilPaintImage::oilPaintImage( const double radius_ ) + : _radius( radius_ ) +{ +} +void Magick::oilPaintImage::operator()( Magick::Image &image_ ) const +{ + image_.oilPaint( _radius ); +} + +// Set or attenuate the image opacity channel. If the image pixels are +// opaque then they are set to the specified opacity value, otherwise +// they are blended with the supplied opacity value. The value of +// opacity_ ranges from 0 (completely opaque) to QuantumRange. The defines +// OpaqueOpacity and TransparentOpacity are available to specify +// completely opaque or completely transparent, respectively. +Magick::opacityImage::opacityImage( const unsigned int opacity_ ) + : _opacity( opacity_ ) +{ +} +void Magick::opacityImage::operator()( Magick::Image &image_ ) const +{ + image_.opacity( _opacity ); +} + +// Change color of opaque pixel to specified pen color. +Magick::opaqueImage::opaqueImage( const Magick::Color &opaqueColor_, + const Magick::Color &penColor_ ) + : _opaqueColor( opaqueColor_ ), + _penColor( penColor_ ) +{ +} +void Magick::opaqueImage::operator()( Magick::Image &image_ ) const +{ + image_.opaque( _opaqueColor, _penColor ); +} + +// Quantize image (reduce number of colors) +Magick::quantizeImage::quantizeImage( const bool measureError_ ) + : _measureError( measureError_ ) +{ +} +void Magick::quantizeImage::operator()( Image &image_ ) const +{ + image_.quantize( _measureError ); +} + +// Raise image (lighten or darken the edges of an image to give a 3-D +// raised or lowered effect) +Magick::raiseImage::raiseImage( const Magick::Geometry &geometry_ , + const bool raisedFlag_ ) + : _geometry( geometry_ ), + _raisedFlag( raisedFlag_ ) +{ +} +void Magick::raiseImage::operator()( Magick::Image &image_ ) const +{ + image_.raise( _geometry, _raisedFlag ); +} + +Magick::ReadOptions::ReadOptions(void) + : _imageInfo(static_cast(AcquireMagickMemory( + sizeof(ImageInfo)))), + _quiet(false) +{ + GetImageInfo(_imageInfo); +} + +Magick::ReadOptions::ReadOptions(const Magick::ReadOptions& options_) + : _imageInfo(CloneImageInfo(options_._imageInfo)), + _quiet(false) +{ +} + +Magick::ReadOptions::~ReadOptions() +{ + _imageInfo=DestroyImageInfo(_imageInfo); +} + +void Magick::ReadOptions::density(const Magick::Geometry &density_) +{ + if (!density_.isValid()) + _imageInfo->density=(char *) RelinquishMagickMemory(_imageInfo->density); + else + Magick::CloneString(&_imageInfo->density,density_); +} + +Magick::Geometry Magick::ReadOptions::density(void) const +{ + if (_imageInfo->density) + return(Geometry(_imageInfo->density)); + + return(Geometry()); +} + +void Magick::ReadOptions::depth(size_t depth_) +{ + _imageInfo->depth=depth_; +} + +size_t Magick::ReadOptions::depth(void) const +{ + return(_imageInfo->depth); +} + +void Magick::ReadOptions::quiet(const bool quiet_) +{ + _quiet=quiet_; +} + +bool Magick::ReadOptions::quiet(void) const +{ + return(_quiet); +} + +void Magick::ReadOptions::size(const Geometry &geometry_) +{ + _imageInfo->size=(char *) RelinquishMagickMemory(_imageInfo->size); + + if ( geometry_.isValid() ) + Magick::CloneString(&_imageInfo->size,geometry_); +} + +Magick::Geometry Magick::ReadOptions::size(void) const +{ + if (_imageInfo->size) + return(Geometry(_imageInfo->size)); + + return(Geometry()); +} + +MagickCore::ImageInfo *Magick::ReadOptions::imageInfo(void) +{ + return(_imageInfo); +} + +// Reduce noise in image using a noise peak elimination filter +Magick::reduceNoiseImage::reduceNoiseImage( void ) + : _order(3) +{ +} +Magick::reduceNoiseImage::reduceNoiseImage ( const size_t order_ ) + : _order(order_) +{ +} +void Magick::reduceNoiseImage::operator()( Image &image_ ) const +{ + image_.reduceNoise( _order ); +} + +// Roll image (rolls image vertically and horizontally) by specified +// number of columnms and rows) +Magick::rollImage::rollImage( const Magick::Geometry &roll_ ) + : _columns( roll_.width() ), + _rows( roll_.height() ) +{ +} +Magick::rollImage::rollImage( const ssize_t columns_, + const ssize_t rows_ ) + : _columns( columns_ ), + _rows( rows_ ) +{ +} +void Magick::rollImage::operator()( Magick::Image &image_ ) const +{ + image_.roll( _columns, _rows ); +} + +// Rotate image counter-clockwise by specified number of degrees. +Magick::rotateImage::rotateImage( const double degrees_ ) + : _degrees( degrees_ ) +{ +} +void Magick::rotateImage::operator()( Magick::Image &image_ ) const +{ + image_.rotate( _degrees ); +} + +// Resize image by using pixel sampling algorithm +Magick::sampleImage::sampleImage( const Magick::Geometry &geometry_ ) + : _geometry( geometry_ ) +{ +} +void Magick::sampleImage::operator()( Magick::Image &image_ ) const +{ + image_.sample( _geometry ); +} + +// Resize image by using simple ratio algorithm +Magick::scaleImage::scaleImage( const Magick::Geometry &geometry_ ) + : _geometry( geometry_ ) +{ +} +void Magick::scaleImage::operator()( Magick::Image &image_ ) const +{ + image_.scale( _geometry ); +} + +// Segment (coalesce similar image components) by analyzing the +// histograms of the color components and identifying units that are +// homogeneous with the fuzzy c-means technique. Also uses +// QuantizeColorSpace and Verbose image attributes +Magick::segmentImage::segmentImage( const double clusterThreshold_ , + const double smoothingThreshold_ ) + : _clusterThreshold( clusterThreshold_ ), + _smoothingThreshold( smoothingThreshold_ ) +{ +} +void Magick::segmentImage::operator()( Magick::Image &image_ ) const +{ + image_.segment( _clusterThreshold, _smoothingThreshold ); +} + +// Shade image using distant light source +Magick::shadeImage::shadeImage( const double azimuth_, + const double elevation_, + const bool colorShading_) + : _azimuth( azimuth_ ), + _elevation( elevation_ ), + _colorShading (colorShading_) +{ +} +void Magick::shadeImage::operator()( Magick::Image &image_ ) const +{ + image_.shade( _azimuth, _elevation, _colorShading ); +} + +// Simulate an image shadow +Magick::shadowImage::shadowImage( const double percent_opacity_, + const double sigma_, + const ssize_t x_, const ssize_t y_ ) + : _percent_opacity( percent_opacity_ ), + _sigma( sigma_ ), + _x ( x_ ), + _y ( y_ ) +{ +} +void Magick::shadowImage::operator()( Magick::Image &image_ ) const +{ + image_.shadow( _percent_opacity, _sigma, _x, _y ); +} + +// Sharpen pixels in image +Magick::sharpenImage::sharpenImage( const double radius_, const double sigma_ ) + : _radius( radius_ ), + _sigma( sigma_ ) +{ +} +void Magick::sharpenImage::operator()( Magick::Image &image_ ) const +{ + image_.sharpen( _radius, _sigma ); +} + +// Shave pixels from image edges. +Magick::shaveImage::shaveImage( const Magick::Geometry &geometry_ ) + : _geometry( geometry_ ) +{ +} +void Magick::shaveImage::operator()( Magick::Image &image_ ) const +{ + image_.shave( _geometry ); +} + +// Shear image (create parallelogram by sliding image by X or Y axis) +Magick::shearImage::shearImage( const double xShearAngle_, + const double yShearAngle_ ) + : _xShearAngle( xShearAngle_ ), + _yShearAngle( yShearAngle_ ) +{ +} +void Magick::shearImage::operator()( Magick::Image &image_ ) const +{ + image_.shear( _xShearAngle, _yShearAngle ); +} + +// Solarize image (similar to effect seen when exposing a photographic +// film to light during the development process) +Magick::solarizeImage::solarizeImage( const double factor_ ) + : _factor( factor_ ) +{ +} +void Magick::solarizeImage::operator()( Magick::Image &image_ ) const +{ + image_.solarize( _factor ); +} + +// Spread pixels randomly within image by specified ammount +Magick::spreadImage::spreadImage( const size_t amount_ ) + : _amount( amount_ ) +{ +} +void Magick::spreadImage::operator()( Magick::Image &image_ ) const +{ + image_.spread( _amount ); +} + +// Add a digital watermark to the image (based on second image) +Magick::steganoImage::steganoImage( const Magick::Image &waterMark_ ) + : _waterMark( waterMark_ ) +{ +} +void Magick::steganoImage::operator()( Magick::Image &image_ ) const +{ + image_.stegano( _waterMark ); +} + +// Create an image which appears in stereo when viewed with red-blue +// glasses (Red image on left, blue on right) +Magick::stereoImage::stereoImage( const Magick::Image &rightImage_ ) + : _rightImage( rightImage_ ) +{ +} +void Magick::stereoImage::operator()( Magick::Image &image_ ) const +{ + image_.stereo( _rightImage ); +} + +// Color to use when drawing object outlines +Magick::strokeColorImage::strokeColorImage( const Magick::Color &strokeColor_ ) + : _strokeColor( strokeColor_ ) +{ +} +void Magick::strokeColorImage::operator()( Magick::Image &image_ ) const +{ + image_.strokeColor( _strokeColor ); +} + +// Swirl image (image pixels are rotated by degrees) +Magick::swirlImage::swirlImage( const double degrees_ ) + : _degrees( degrees_ ) +{ +} +void Magick::swirlImage::operator()( Magick::Image &image_ ) const +{ + image_.swirl( _degrees ); +} + +// Channel a texture on image background +Magick::textureImage::textureImage( const Magick::Image &texture_ ) + : _texture( texture_ ) +{ +} +void Magick::textureImage::operator()( Magick::Image &image_ ) const +{ + image_.texture( _texture ); +} + +// Threshold image +Magick::thresholdImage::thresholdImage( const double threshold_ ) + : _threshold( threshold_ ) +{ +} +void Magick::thresholdImage::operator()( Magick::Image &image_ ) const +{ + image_.threshold( _threshold ); +} + +// Transform image based on image and crop geometries +Magick::transformImage::transformImage( const Magick::Geometry &imageGeometry_ ) + : _imageGeometry( imageGeometry_ ), + _cropGeometry( ) +{ +} +Magick::transformImage::transformImage( const Magick::Geometry &imageGeometry_, + const Geometry &cropGeometry_ ) + : _imageGeometry( imageGeometry_ ), + _cropGeometry( cropGeometry_ ) +{ +} +void Magick::transformImage::operator()( Magick::Image &image_ ) const +{ + if ( _cropGeometry.isValid() ) + image_.transform( _imageGeometry, _cropGeometry ); + else + image_.transform( _imageGeometry ); +} + +// Set image color to transparent +Magick::transparentImage::transparentImage( const Magick::Color& color_ ) + : _color( color_ ) +{ +} +void Magick::transparentImage::operator()( Magick::Image &image_ ) const +{ + image_.transparent( _color ); +} + +// Trim edges that are the background color from the image +Magick::trimImage::trimImage( void ) +{ +} +void Magick::trimImage::operator()( Magick::Image &image_ ) const +{ + image_.trim( ); +} + +// Map image pixels to a sine wave +Magick::waveImage::waveImage( const double amplitude_, + const double wavelength_ ) + : _amplitude( amplitude_ ), + _wavelength( wavelength_ ) +{ +} +void Magick::waveImage::operator()( Magick::Image &image_ ) const +{ + image_.wave( _amplitude, _wavelength ); +} + +// resize image to specified size. +Magick::resizeImage::resizeImage( const Magick::Geometry &geometry_ ) + : _geometry( geometry_ ) +{ +} +void Magick::resizeImage::operator()( Magick::Image &image_ ) const +{ + image_.resize( _geometry ); +} + +// Zoom image to specified size. +Magick::zoomImage::zoomImage( const Magick::Geometry &geometry_ ) + : _geometry( geometry_ ) +{ +} +void Magick::zoomImage::operator()( Magick::Image &image_ ) const +{ + image_.zoom( _geometry ); +} + +// +// Function object image attribute accessors +// + +// Anti-alias Postscript and TrueType fonts (default true) +Magick::antiAliasImage::antiAliasImage( const bool flag_ ) + : _flag( flag_ ) +{ +} +void Magick::antiAliasImage::operator()( Magick::Image &image_ ) const +{ + image_.antiAlias( _flag ); +} + +// Join images into a single multi-image file +Magick::adjoinImage::adjoinImage( const bool flag_ ) + : _flag( flag_ ) +{ +} +void Magick::adjoinImage::operator()( Magick::Image &image_ ) const +{ + image_.adjoin( _flag ); +} + +// Time in 1/100ths of a second which must expire before displaying +// the next image in an animated sequence. +Magick::animationDelayImage::animationDelayImage( const size_t delay_ ) + : _delay( delay_ ) +{ +} +void Magick::animationDelayImage::operator()( Magick::Image &image_ ) const +{ + image_.animationDelay( _delay ); +} + +// Number of iterations to loop an animation (e.g. Netscape loop +// extension) for. +Magick::animationIterationsImage::animationIterationsImage( const size_t iterations_ ) + : _iterations( iterations_ ) +{ +} +void Magick::animationIterationsImage::operator()( Magick::Image &image_ ) const +{ + image_.animationIterations( _iterations ); +} + +// Image background color +Magick::backgroundColorImage::backgroundColorImage( const Magick::Color &color_ ) + : _color( color_ ) +{ +} +void Magick::backgroundColorImage::operator()( Magick::Image &image_ ) const +{ + image_.backgroundColor( _color ); +} + +// Name of texture image to tile onto the image background +Magick::backgroundTextureImage::backgroundTextureImage( const std::string &backgroundTexture_ ) + : _backgroundTexture( backgroundTexture_ ) +{ +} +void Magick::backgroundTextureImage::operator()( Magick::Image &image_ ) const +{ + image_.backgroundTexture( _backgroundTexture ); +} + +// Image border color +Magick::borderColorImage::borderColorImage( const Magick::Color &color_ ) + : _color( color_ ) +{ +} +void Magick::borderColorImage::operator()( Magick::Image &image_ ) const +{ + image_.borderColor( _color ); +} + +// Text bounding-box base color (default none) +Magick::boxColorImage::boxColorImage( const Magick::Color &boxColor_ ) + : _boxColor( boxColor_ ) { } + +void Magick::boxColorImage::operator()( Magick::Image &image_ ) const +{ + image_.boxColor( _boxColor ); +} + +// Chromaticity blue primary point (e.g. x=0.15, y=0.06) +Magick::chromaBluePrimaryImage::chromaBluePrimaryImage( const double x_, + const double y_ ) + : _x( x_ ), + _y( y_ ) +{ +} +void Magick::chromaBluePrimaryImage::operator()( Magick::Image &image_ ) const +{ + image_.chromaBluePrimary( _x, _y ); +} + +// Chromaticity green primary point (e.g. x=0.3, y=0.6) +Magick::chromaGreenPrimaryImage::chromaGreenPrimaryImage( const double x_, + const double y_ ) + : _x( x_ ), + _y( y_ ) +{ +} +void Magick::chromaGreenPrimaryImage::operator()( Magick::Image &image_ ) const +{ + image_.chromaGreenPrimary( _x, _y ); +} + +// Chromaticity red primary point (e.g. x=0.64, y=0.33) +Magick::chromaRedPrimaryImage::chromaRedPrimaryImage( const double x_, + const double y_ ) + : _x( x_ ), + _y( y_ ) +{ +} +void Magick::chromaRedPrimaryImage::operator()( Magick::Image &image_ ) const +{ + image_.chromaRedPrimary( _x, _y ); +} + +// Chromaticity white point (e.g. x=0.3127, y=0.329) +Magick::chromaWhitePointImage::chromaWhitePointImage( const double x_, + const double y_ ) + : _x( x_ ), + _y( y_ ) +{ +} +void Magick::chromaWhitePointImage::operator()( Magick::Image &image_ ) const +{ + image_.chromaWhitePoint( _x, _y ); +} + +// Colors within this distance are considered equal +Magick::colorFuzzImage::colorFuzzImage( const double fuzz_ ) + : _fuzz( fuzz_ ) +{ +} +void Magick::colorFuzzImage::operator()( Magick::Image &image_ ) const +{ + image_.colorFuzz( _fuzz ); +} + +// Color at colormap position index_ +Magick::colorMapImage::colorMapImage( const size_t index_, + const Color &color_ ) + : _index( index_ ), + _color( color_ ) +{ +} +void Magick::colorMapImage::operator()( Magick::Image &image_ ) const +{ + image_.colorMap( _index, _color ); +} + +// Composition operator to be used when composition is implicitly used +// (such as for image flattening). +Magick::composeImage::composeImage( const CompositeOperator compose_ ) + : _compose( compose_ ) +{ +} +void Magick::composeImage::operator()( Magick::Image &image_ ) const +{ + image_.compose( _compose ); +} + +// Compression type +Magick::compressTypeImage::compressTypeImage( const CompressionType compressType_ ) + : _compressType( compressType_ ) +{ +} +void Magick::compressTypeImage::operator()( Magick::Image &image_ ) const +{ + image_.compressType( _compressType ); +} + +// Vertical and horizontal resolution in pixels of the image +Magick::densityImage::densityImage( const Geometry &geomery_ ) + : _geomery( geomery_ ) +{ +} +void Magick::densityImage::operator()( Magick::Image &image_ ) const +{ + image_.density( _geomery ); +} + +// Image depth (bits allocated to red/green/blue components) +Magick::depthImage::depthImage( const size_t depth_ ) + : _depth( depth_ ) +{ +} +void Magick::depthImage::operator()( Magick::Image &image_ ) const +{ + image_.depth( _depth ); +} + +// Endianness (LSBEndian like Intel or MSBEndian like SPARC) for image +// formats which support endian-specific options. +Magick::endianImage::endianImage( const Magick::EndianType endian_ ) + : _endian( endian_ ) +{ +} +void Magick::endianImage::operator()( Magick::Image &image_ ) const +{ + image_.endian( _endian ); +} + +// Image file name +Magick::fileNameImage::fileNameImage( const std::string &fileName_ ) + : _fileName( fileName_ ) +{ +} +void Magick::fileNameImage::operator()( Magick::Image &image_ ) const +{ + image_.fileName( _fileName ); +} + +// Filter to use when resizing image +Magick::filterTypeImage::filterTypeImage( const FilterTypes filterType_ ) + : _filterType( filterType_ ) +{ +} +void Magick::filterTypeImage::operator()( Magick::Image &image_ ) const +{ + image_.filterType( _filterType ); +} + +// Text rendering font +Magick::fontImage::fontImage( const std::string &font_ ) + : _font( font_ ) +{ +} +void Magick::fontImage::operator()( Magick::Image &image_ ) const +{ + image_.font( _font ); +} + +// Font point size +Magick::fontPointsizeImage::fontPointsizeImage( const size_t pointsize_ ) + : _pointsize( pointsize_ ) +{ +} +void Magick::fontPointsizeImage::operator()( Magick::Image &image_ ) const +{ + image_.fontPointsize( _pointsize ); +} + +// GIF disposal method +Magick::gifDisposeMethodImage::gifDisposeMethodImage( const size_t disposeMethod_ ) + : _disposeMethod( disposeMethod_ ) +{ +} +void Magick::gifDisposeMethodImage::operator()( Magick::Image &image_ ) const +{ + image_.gifDisposeMethod( _disposeMethod ); +} + +// Type of interlacing to use +Magick::interlaceTypeImage::interlaceTypeImage( const InterlaceType interlace_ ) + : _interlace( interlace_ ) +{ +} +void Magick::interlaceTypeImage::operator()( Magick::Image &image_ ) const +{ + image_.interlaceType( _interlace ); +} + +// Linewidth for drawing vector objects (default one) +Magick::lineWidthImage::lineWidthImage( const double lineWidth_ ) + : _lineWidth( lineWidth_ ) +{ +} +void Magick::lineWidthImage::operator()( Magick::Image &image_ ) const +{ + image_.lineWidth( _lineWidth ); +} + +// File type magick identifier (.e.g "GIF") +Magick::magickImage::magickImage( const std::string &magick_ ) + : _magick( magick_ ) +{ +} +void Magick::magickImage::operator()( Magick::Image &image_ ) const +{ + image_.magick( _magick ); +} + +// Image supports transparent color +Magick::matteImage::matteImage( const bool matteFlag_ ) + : _matteFlag( matteFlag_ ) +{ +} +void Magick::matteImage::operator()( Magick::Image &image_ ) const +{ + image_.matte( _matteFlag ); +} + +// Transparent color +Magick::matteColorImage::matteColorImage( const Color &matteColor_ ) + : _matteColor( matteColor_ ) +{ +} +void Magick::matteColorImage::operator()( Magick::Image &image_ ) const +{ + image_.matteColor( _matteColor ); +} + +// Indicate that image is black and white +Magick::monochromeImage::monochromeImage( const bool monochromeFlag_ ) + : _monochromeFlag( monochromeFlag_ ) +{ +} +void Magick::monochromeImage::operator()( Magick::Image &image_ ) const +{ + image_.monochrome( _monochromeFlag ); +} + +// Pen color +Magick::penColorImage::penColorImage( const Color &penColor_ ) + : _penColor( penColor_ ) +{ +} +void Magick::penColorImage::operator()( Magick::Image &image_ ) const +{ + image_.penColor( _penColor ); +} + +// Pen texture image. +Magick::penTextureImage::penTextureImage( const Image &penTexture_ ) + : _penTexture( penTexture_ ) +{ +} +void Magick::penTextureImage::operator()( Magick::Image &image_ ) const +{ + image_.penTexture( _penTexture ); +} + +// Set pixel color at location x & y. +Magick::pixelColorImage::pixelColorImage( const ssize_t x_, + const ssize_t y_, + const Color &color_) + : _x( x_ ), + _y( y_ ), + _color( color_ ) { } + +void Magick::pixelColorImage::operator()( Magick::Image &image_ ) const +{ + image_.pixelColor( _x, _y, _color ); +} + +// Postscript page size. +Magick::pageImage::pageImage( const Geometry &pageSize_ ) + : _pageSize( pageSize_ ) +{ +} +void Magick::pageImage::operator()( Magick::Image &image_ ) const +{ + image_.page( _pageSize ); +} + +// JPEG/MIFF/PNG compression level (default 75). +Magick::qualityImage::qualityImage( const size_t quality_ ) + : _quality( quality_ ) +{ +} +void Magick::qualityImage::operator()( Magick::Image &image_ ) const +{ + image_.quality( _quality ); +} + +// Maximum number of colors to quantize to +Magick::quantizeColorsImage::quantizeColorsImage( const size_t colors_ ) + : _colors( colors_ ) +{ +} +void Magick::quantizeColorsImage::operator()( Magick::Image &image_ ) const +{ + image_.quantizeColors( _colors ); +} + +// Colorspace to quantize in. +Magick::quantizeColorSpaceImage::quantizeColorSpaceImage( const ColorspaceType colorSpace_ ) + : _colorSpace( colorSpace_ ) +{ +} +void Magick::quantizeColorSpaceImage::operator()( Magick::Image &image_ ) const +{ + image_.quantizeColorSpace( _colorSpace ); +} + +// Dither image during quantization (default true). +Magick::quantizeDitherImage::quantizeDitherImage( const bool ditherFlag_ ) + : _ditherFlag( ditherFlag_ ) +{ +} +void Magick::quantizeDitherImage::operator()( Magick::Image &image_ ) const +{ + image_.quantizeDither( _ditherFlag ); +} + +// Quantization tree-depth +Magick::quantizeTreeDepthImage::quantizeTreeDepthImage( const size_t treeDepth_ ) + : _treeDepth( treeDepth_ ) { } + +void Magick::quantizeTreeDepthImage::operator()( Magick::Image &image_ ) const +{ + image_.quantizeTreeDepth( _treeDepth ); +} + +// The type of rendering intent +Magick::renderingIntentImage::renderingIntentImage( const Magick::RenderingIntent renderingIntent_ ) + : _renderingIntent( renderingIntent_ ) +{ +} +void Magick::renderingIntentImage::operator()( Magick::Image &image_ ) const +{ + image_.renderingIntent( _renderingIntent ); +} + +// Units of image resolution +Magick::resolutionUnitsImage::resolutionUnitsImage( const Magick::ResolutionType resolutionUnits_ ) + : _resolutionUnits( resolutionUnits_ ) +{ +} +void Magick::resolutionUnitsImage::operator()( Magick::Image &image_ ) const +{ + image_.resolutionUnits( _resolutionUnits ); +} + +// Image scene number +Magick::sceneImage::sceneImage( const size_t scene_ ) + : _scene( scene_ ) +{ +} +void Magick::sceneImage::operator()( Magick::Image &image_ ) const +{ + image_.scene( _scene ); +} + +// Width and height of a raw image +Magick::sizeImage::sizeImage( const Magick::Geometry &geometry_ ) + : _geometry( geometry_ ) +{ +} +void Magick::sizeImage::operator()( Magick::Image &image_ ) const +{ + image_.size( _geometry ); +} + +// Splice the background color into the image. +Magick::spliceImage::spliceImage( const Magick::Geometry &geometry_ ) + : _geometry( geometry_ ) +{ +} +void Magick::spliceImage::operator()( Magick::Image &image_ ) const +{ + image_.splice( _geometry ); +} + +// stripImage strips an image of all profiles and comments. +Magick::stripImage::stripImage( void ) +{ +} +void Magick::stripImage::operator()( Magick::Image &image_ ) const +{ + image_.strip( ); +} + +// Subimage of an image sequence +Magick::subImageImage::subImageImage( const size_t subImage_ ) + : _subImage( subImage_ ) +{ +} +void Magick::subImageImage::operator()( Magick::Image &image_ ) const +{ + image_.subImage( _subImage ); +} + +// Number of images relative to the base image +Magick::subRangeImage::subRangeImage( const size_t subRange_ ) + : _subRange( subRange_ ) +{ +} +void Magick::subRangeImage::operator()( Magick::Image &image_ ) const +{ + image_.subRange( _subRange ); +} + +// Tile name +Magick::tileNameImage::tileNameImage( const std::string &tileName_ ) + : _tileName( tileName_ ) +{ +} +void Magick::tileNameImage::operator()( Magick::Image &image_ ) const +{ + image_.tileName( _tileName ); +} + +// Image storage type +Magick::typeImage::typeImage( const Magick::ImageType type_ ) + : _type( type_ ) +{ +} +void Magick::typeImage::operator()( Magick::Image &image_ ) const +{ + image_.type( _type ); +} + +// Print detailed information about the image +Magick::verboseImage::verboseImage( const bool verbose_ ) + : _verbose( verbose_ ) +{ +} +void Magick::verboseImage::operator()( Magick::Image &image_ ) const +{ + image_.verbose( _verbose ); +} + +// FlashPix viewing parameters +Magick::viewImage::viewImage( const std::string &view_ ) + : _view( view_ ) { } + +void Magick::viewImage::operator()( Magick::Image &image_ ) const +{ + image_.view( _view ); +} + +// X11 display to display to, obtain fonts from, or to capture image +// from +Magick::x11DisplayImage::x11DisplayImage( const std::string &display_ ) + : _display( display_ ) +{ +} +void Magick::x11DisplayImage::operator()( Magick::Image &image_ ) const +{ + image_.x11Display( _display ); +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/Thread.cpp b/ImageMagick-6.9.12-44/Magick++/lib/Thread.cpp new file mode 100644 index 0000000..08a7eac --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/Thread.cpp @@ -0,0 +1,102 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 +// Copyright Dirk Lemstra 2017 +// +// Implementation of thread support +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/Thread.h" +#include "Magick++/Exception.h" + +#include + +// Default constructor +Magick::MutexLock::MutexLock(void) +#if defined(MAGICKCORE_HAVE_PTHREAD) + // POSIX threads + : _mutex() +{ + ::pthread_mutexattr_t attr; + int sysError; + if ( (sysError = ::pthread_mutexattr_init( &attr )) == 0 ) + if ( (sysError = ::pthread_mutex_init( &_mutex, &attr )) == 0 ) + { + ::pthread_mutexattr_destroy( &attr ); + return; + } + throwExceptionExplicit( OptionError, "mutex initialization failed", + strerror(sysError) ); +} +#else +#if defined(_VISUALC_) && defined(_MT) +// Win32 threads + : _mutex() +{ + SECURITY_ATTRIBUTES security; + + /* Allow the semaphore to be inherited */ + security.nLength = sizeof(security); + security.lpSecurityDescriptor = NULL; + security.bInheritHandle = TRUE; + + /* Create the semaphore, with initial value signaled */ + _mutex.id = ::CreateSemaphore(&security, 1, MAXSEMLEN, NULL); + if ( _mutex.id != NULL ) + return; + throwExceptionExplicit( OptionError, "mutex initialization failed" ); +} +#else +// Threads not supported +{ +} +#endif +#endif + +// Destructor +Magick::MutexLock::~MutexLock(void) +{ +#if defined(MAGICKCORE_HAVE_PTHREAD) + (void) ::pthread_mutex_destroy(&_mutex); +#endif +#if defined(_MT) && defined(_VISUALC_) + (void) ::CloseHandle(_mutex.id); +#endif +} + +// Lock mutex +void Magick::MutexLock::lock(void) +{ +#if defined(MAGICKCORE_HAVE_PTHREAD) + int sysError; + if ( (sysError = ::pthread_mutex_lock( &_mutex )) == 0) + return; + throwExceptionExplicit( OptionError, "mutex lock failed", + strerror(sysError)); +#endif +#if defined(_MT) && defined(_VISUALC_) + if (WaitForSingleObject(_mutex.id,INFINITE) != WAIT_FAILED) + return; + throwExceptionExplicit( OptionError, "mutex lock failed" ); +#endif +} + +// Unlock mutex +void Magick::MutexLock::unlock(void) +{ +#if defined(MAGICKCORE_HAVE_PTHREAD) + int sysError; + if ( (sysError = ::pthread_mutex_unlock( &_mutex )) == 0) + return; + throwExceptionExplicit( OptionError, "mutex unlock failed", + strerror(sysError) ); +#endif +#if defined(_MT) && defined(_VISUALC_) + if ( ReleaseSemaphore(_mutex.id, 1, NULL) == TRUE ) + return; + throwExceptionExplicit( OptionError, "mutex unlock failed" ); +#endif +} diff --git a/ImageMagick-6.9.12-44/Magick++/lib/TypeMetric.cpp b/ImageMagick-6.9.12-44/Magick++/lib/TypeMetric.cpp new file mode 100644 index 0000000..74b7feb --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/TypeMetric.cpp @@ -0,0 +1,59 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 2001 +// Copyright Dirk Lemstra 2014 +// +// TypeMetric implementation +// + +#define MAGICKCORE_IMPLEMENTATION 1 +#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 + +#include "Magick++/TypeMetric.h" +#include + + +Magick::TypeMetric::TypeMetric(void) +{ + memset(&_typeMetric,0,sizeof(_typeMetric)); +} + +Magick::TypeMetric::~TypeMetric(void) +{ +} + +double Magick::TypeMetric::ascent(void) const +{ + return(_typeMetric.ascent); +} + +double Magick::TypeMetric::descent(void) const +{ + return(_typeMetric.descent); +} + +double Magick::TypeMetric::maxHorizontalAdvance(void) const +{ + return(_typeMetric.max_advance); +} + +double Magick::TypeMetric::textHeight(void) const +{ + return(_typeMetric.height); +} + +double Magick::TypeMetric::textWidth(void) const +{ + return(_typeMetric.width); +} + +double Magick::TypeMetric::underlinePosition(void) const +{ + return(_typeMetric.underline_position); +} + +double Magick::TypeMetric::underlineThickness(void) const +{ + return(_typeMetric.underline_thickness); +} + diff --git a/ImageMagick-6.9.12-44/Magick++/lib/libMagick++.map b/ImageMagick-6.9.12-44/Magick++/lib/libMagick++.map new file mode 100644 index 0000000..b30c88b --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/lib/libMagick++.map @@ -0,0 +1,4 @@ + VERS_9.0 { + global: + *; + }; diff --git a/ImageMagick-6.9.12-44/Magick++/tests/appendImages.cpp b/ImageMagick-6.9.12-44/Magick++/tests/appendImages.cpp new file mode 100644 index 0000000..8ad480c --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/appendImages.cpp @@ -0,0 +1,93 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2003 +// +// Test STL appendImages function +// + +#include +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + int failures=0; + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Test appendImages + // + + list imageList; + readImages( &imageList, srcdir + "test_image_anim.miff" ); + + Image appended; + + // Horizontal + appendImages( &appended, imageList.begin(), imageList.end() ); + // appended.display(); + if (( appended.signature() != "3a90bb0bb8f69f6788ab99e9e25598a0d6c5cdbbb797f77ad68011e0a8b1689d" ) && + ( appended.signature() != "c15fcd1e739b73638dc4e36837bdb53f7087359544664caf7b1763928129f3c7" ) && + ( appended.signature() != "229ff72f812e5f536245dc3b4502a0bc2ab2363f67c545863a85ab91ebfbfb83" ) && + ( appended.signature() != "b98c42c55fc4e661cb3684154256809c03c0c6b53da2738b6ce8066e1b6ddef0" )) + { + ++failures; + cout << "Line: " << __LINE__ + << " Horizontal append failed, signature = " + << appended.signature() << endl; + appended.write("appendImages_horizontal_out.miff"); + // appended.display(); + } + + // Vertical + appendImages( &appended, imageList.begin(), imageList.end(), true ); + if (( appended.signature() != "d73d25ccd6011936d08b6d0d89183b7a61790544c2195269aff4db2f782ffc08" ) && + ( appended.signature() != "0909f7ffa7c6ea410fb2ebfdbcb19d61b19c4bd271851ce3bd51662519dc2b58" ) && + ( appended.signature() != "11b97ba6ac1664aa1c2faed4c86195472ae9cce2ed75402d975bb4ffcf1de751" ) && + ( appended.signature() != "cae4815eeb3cb689e73b94d897a9957d3414d1d4f513e8b5e52579b05d164bfe" )) + { + ++failures; + cout << "Line: " << __LINE__ + << " Vertical append failed, signature = " + << appended.signature() << endl; + appended.write("appendImages_vertical_out.miff"); + // appended.display(); + } + + } + + catch( Exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} + diff --git a/ImageMagick-6.9.12-44/Magick++/tests/attributes.cpp b/ImageMagick-6.9.12-44/Magick++/tests/attributes.cpp new file mode 100644 index 0000000..36285cb --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/attributes.cpp @@ -0,0 +1,1517 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// +// Tests for setting/getting Magick::Image attributes +// + +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + volatile int failures=0; + + try { + + size_t columns = 640; + size_t rows = 480; + Geometry geometry(columns,rows); + Color canvasColor( "red" ); + Image image( geometry, canvasColor); + + // + // antiAlias + // + + // Test default value + if ( image.antiAlias() != true ) + { + ++failures; + cout << "Line: " << __LINE__ << ", antiAlias default not true" << endl; + } + + // Test setting false + image.antiAlias( false ); + if ( image.antiAlias() != false ) + { + ++failures; + cout << "Line: " << __LINE__ << ", antiAlias not false" << endl; + } + + // Test setting true + image.antiAlias( true ); + if ( image.antiAlias() != true ) + { + ++failures; + cout << "Line: " << __LINE__ << ", antiAlias not true" << endl; + } + + // + // adjoin + // + + // Test default value + if ( image.adjoin() != true ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", adjoin default not 'true' as expected" << endl; + } + + // Test setting false + image.adjoin( false ); + if ( image.adjoin() != false ) + { + ++failures; + cout << "Line: " << __LINE__ << ", adjoin failed set to 'false'" << endl; + } + + // Test setting true + image.adjoin( true ); + if ( image.adjoin() != true ) + { + ++failures; + cout << "Line: " << __LINE__ << ", adjoin failed set to 'true'" << endl; + } + + // + // animationDelay + // + + // Test default value + if ( image.animationDelay() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", animationDelay default (" + << image.animationDelay() + << ") not 0 as expected" << endl; + } + + // Test setting to 0 + image.animationDelay( 0 ); + if ( image.animationDelay() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", failed to set animationDelay to 0" << endl; + } + + // Test setting to 100 + image.animationDelay( 100 ); + if ( image.animationDelay() != 100 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", failed to set animationDelay to 100" << endl; + } + image.animationDelay(0); + + // + // animationIterations + // + + // Test default value + if ( image.animationIterations() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", animationIterations default (" + << image.animationIterations() + << ") not 0 as expected" << endl; + } + + // Test setting to 0 + image.animationIterations( 0 ); + if ( image.animationIterations() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", failed to set animationIterations to 0" << endl; + } + + // Test setting to 100 + image.animationIterations( 100 ); + if ( image.animationIterations() != 100 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", failed to set animationIterations to 100" << endl; + } + image.animationIterations( 0 ); + + // + // backgroundColor + // + + // Test default value. + if (image.backgroundColor() != string(ColorRGB("white"))) + { + ++failures; + cout << "Line: " << __LINE__ << ", backgroundColor default (" + << string(image.backgroundColor()) + << ") is incorrect" << endl; + } + + // Test setting to blue + image.backgroundColor("blue"); + if ( !image.backgroundColor().isValid() ) + { + ++failures; + cout << "Line: " << __LINE__ << ", backgroundColor (" + << string(image.backgroundColor()) + << ") failed set to 'blue'" << endl; + } + else + if ( string(image.backgroundColor()) != "#0000FF" && + string(image.backgroundColor()) != "#00000000FFFF" && + string(image.backgroundColor()) != "#0000000000000000FFFFFFFF" ) + { + ++failures; + cout << "Line: " << __LINE__ << ", backgroundColor (" + << string(image.backgroundColor()) << ") is incorrect" + << endl; + } + + // Test setting using hex color + image.backgroundColor("#00AAFF"); + if ( !image.backgroundColor().isValid() ) + { + ++failures; + cout << "Line: " << __LINE__ << ", backgroundColor (" + << string(image.backgroundColor()) + << ") is incorrectly invalid" << endl; + } + else + if ( string(image.backgroundColor()) != "#00AAFF" && + string(image.backgroundColor()) != "#0000AAAAFFFF" && + string(image.backgroundColor()) != "#00000000AAAAAAAAFFFFFFFF" ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", backgroundColor (" + << string(image.backgroundColor()) + << ") is incorrect" + << endl; + } + + // + // backgroundTexture + // + + // Test default value + if ( image.backgroundTexture() != "" ) + { + ++failures; + cout << "Line: " << __LINE__ << ", backgroundTexture default (" + << image.backgroundTexture() + << ") is incorrect" << endl; + } + + // Test setting/getting value + image.backgroundTexture("afile.jpg"); + if ( image.backgroundTexture() != "afile.jpg" ) + { + ++failures; + cout << "Line: " << __LINE__ << ", backgroundTexture (" + << image.backgroundTexture() + << ") is incorrect" << endl; + } + + // Test setting back to default + image.backgroundTexture(""); + if ( image.backgroundTexture() != "" ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", backgroundTexture (" + << image.backgroundTexture() + << ") failed to set to \"\"" << endl; + } + + // + // baseColumns + // + if ( image.baseColumns() != columns ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", baseColumns (" + << image.baseColumns() + << ") is not equal to " + << columns + << " as expected" + << endl; + } + + + // + // baseFilename + // + // Base filename is color for xc images + if ( image.baseFilename() != "xc:#FF0000" && + image.baseFilename() != "xc:#FFFF00000000" && + image.baseFilename() != "xc:#FFFFFFFF0000000000000000") + { + ++failures; + cout << "Line: " << __LINE__ + << ", baseFilename (" + << image.baseFilename() + << ") is incorrect" + << endl; + } + + // + // baseRows + // + if ( image.baseRows() != rows ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", baseRows (" + << image.baseRows() + << ") != rows (" + << rows + << ")" + << endl; + } + + // + // borderColor + // + if ( image.borderColor() != ColorRGB("#dfdfdf") ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", borderColor default (" + << string(image.borderColor()) + << ") is incorrect" << endl; + } + + image.borderColor("#FF0000"); + if ( image.borderColor() != Color("#FF0000") ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", failed to set borderColor (" + << string(image.borderColor()) + << ")" << endl; + } + + image.borderColor("black"); + if ( image.borderColor() != Color("#000000") ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", failed to set borderColor (" + << string(image.borderColor()) + << ")" + << endl; + } + + // + // boxColor + // + image.boxColor("#FF0000"); + if ( image.boxColor() != Color("#FF0000") ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", failed to set boxColor (" + << string(image.boxColor()) + << ")" + << endl; + } + + image.boxColor("black"); + if ( image.boxColor() != Color("#000000") ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", failed to set boxColor (" + << string(image.boxColor()) + << ") to #000000" + << endl; + } + + // + // chromaBluePrimary + // + { + // Test default setting + double x, y; + image.chromaBluePrimary( &x, &y ); + if ( x == 0.0f || y == 0.0f ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", chromaBluePrimary x/y defaults are zero" + << endl; + } + + // Test set/get + image.chromaBluePrimary( 50, 100 ); + image.chromaBluePrimary( &x, &y ); + if ( x != 50 || y != 100 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", chromaBluePrimary x/y failed set/get" << endl; + } + } + + // + // chromaGreenPrimary + // + { + // Test default setting + double x, y; + image.chromaGreenPrimary( &x, &y ); + if ( x == 0.0f || y == 0.0f ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", chromaGreenPrimary x/y defaults are zero" << endl; + } + + // Test set/get + image.chromaGreenPrimary( 50, 100 ); + image.chromaGreenPrimary( &x, &y ); + if ( x != 50 || y != 100 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", chromaGreenPrimary x/y failed set/get" << endl; + } + } + + // + // chromaRedPrimary + // + { + // Test default setting + double x, y; + image.chromaRedPrimary( &x, &y ); + if ( x == 0.0f || y == 0.0f ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", chromaRedPrimary x/y defaults are zero" << endl; + } + + // Test set/get + image.chromaRedPrimary( 50, 100 ); + image.chromaRedPrimary( &x, &y ); + if ( x != 50 || y != 100 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", chromaRedPrimary x/y failed set/get" << endl; + } + } + + // + // chromaWhitePoint + // + { + // Test default setting + double x, y; + image.chromaWhitePoint( &x, &y ); + if ( x == 0.0f || y == 0.0f ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", chromaWhitePoint x/y defaults are zero" << endl; + } + + // Test set/get + image.chromaWhitePoint( 50, 100 ); + image.chromaWhitePoint( &x, &y ); + if ( x != 50 || y != 100 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", chromaWhitePoint x/y failed set/get" << endl; + } + } + + // + // classType + // + if ( image.classType() != DirectClass ) + { + ++failures; + cout << "Line: " << __LINE__ << ", classType is not DirectClass" << endl; + } + + // + // colorFuzz + // + + // Test default + if ( image.colorFuzz() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", colorFuzz default is non-zero" << endl; + } + + // Test set/get + image.colorFuzz( 2 ); + if ( image.colorFuzz() != 2 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", colorFuzz failed to set/get" << endl; + } + image.colorFuzz( 0 ); + + // + // columns + // + if ( image.columns() != columns ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", columns is not equal to canvas image columns" << endl; + } + + // + // comment + // + // Test default + if ( image.comment().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", comment default non-zero length" << endl; + } + + // Test set/get + { + std::string comment("This is a comment."); + image.comment( comment ); + if ( image.comment() != comment ) + { + ++failures; + cout << "Line: " << __LINE__ << ", comment set/get failed" << endl; + } + } + + // Test resetting comment + image.comment( string() ); + if ( image.comment().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", comment failed to reset" << endl; + } + + // + // compressType + // + // Test default + if ( image.compressType() != UndefinedCompression ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", compressType default is incorrect" << endl; + } + + // Test set/get + image.compressType(RLECompression); + if ( image.compressType() != RLECompression ) + { + ++failures; + cout << "Line: " << __LINE__ << ", compressType set/get failed" << endl; + } + image.compressType(UndefinedCompression); + + // + // density + // + { + // Test defaults + if ( image.density() != Geometry(72,72) ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", density default is not 72x72 as expected" << endl; + } + + // Test set/get + Geometry density(150,75); + image.density(density); + if ( image.density() != density ) + { + ++failures; + cout << "Line: " << __LINE__ << ", density set/get failed" << endl; + } + + + if ( image.xResolution() != 150 || + image.yResolution() != 75 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", density set/get failed" << endl; + } + + image.density("72x72"); + + } + + // + // Format specific defines + // + if (image.defineSet("foo","bar")) + { + ++failures; + cout << "Line: " << __LINE__ + << ", define for foo:bar incorrectly reports set." + << endl; + } + + image.defineSet("foo","bar",true); + if (!image.defineSet("foo","bar")) + { + ++failures; + cout << "Line: " << __LINE__ + << ", define for foo:bar incorrectly reports not set." + << endl; + } + + image.defineSet("foo","bar",false); + if (image.defineSet("foo","bar")) + { + ++failures; + cout << "Line: " << __LINE__ + << ", define for foo:bar incorrectly reports set." + << endl; + } + + image.defineValue("foo","bar","value"); + std::string value = image.defineValue("foo","bar"); + if (image.defineValue("foo","bar") != "value") + { + ++failures; + cout << "Line: " << __LINE__ + << ", define for foo:bar incorrectly reports value \"" + << value << "\"" + << endl; + } + + image.defineSet("foo","bar",false); + if (image.defineSet("foo","bar")) + { + ++failures; + cout << "Line: " << __LINE__ + << ", define for foo:bar incorrectly reports set." + << endl; + } + + // + // depth + // + if ( image.depth() != MAGICKCORE_QUANTUM_DEPTH ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", depth (" + << image.depth() + << ") is not equal to " << MAGICKCORE_QUANTUM_DEPTH << endl; + } + + // + // Directory + // + { + // Since this is not a montage image, simply verify error report + bool caughtException = false; + cout << "Testing throwing and catching exceptions. A program crash or a message" << endl + << "that the exception was not caught indicates a test failure. A properly" << endl + << "formatted exception message indicates success:" << endl; + try + { + //image.directory(); + Magick::Image bad_image("foo"); + } + catch ( Exception &exception_) + { + cout << "Caught exception, good!:" << endl + << " \"" << exception_.what() << "\"" << endl; + caughtException = true; + } + if ( caughtException != true ) + { + ++failures; + cout << "failed to catch exception!" << endl; + } + } + + // + // fileName + // + // Test default + if ( image.fileName() != string("xc:") + string(canvasColor) ) + { + ++failures; + cout << "Line: " + << __LINE__ + << ", fileName (" + << image.fileName() + << ") is not canvas color (" + << string(canvasColor) + <<") as expected" << endl; + } + + // Set/get value + image.fileName("filename.jpg"); + if ( image.fileName() != "filename.jpg" ) + { + ++failures; + cout << "Line: " + << __LINE__ + << ", fileName (" + << image.fileName() + << ") failed to set/get" << endl; + } + image.fileName(canvasColor); + + // + // fileSize + // + // Test default + if ( image.fileSize() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", fileSize (" + << static_cast(image.fileSize()) + << ") is not zero as expected" << endl; + } + + // + // filterType + // + // Test default + if ( image.filterType() != UndefinedFilter ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", filterType default (" + << (int)image.filterType() + << ") is incorrect" << endl; + } + + // Test set/get + image.filterType( TriangleFilter ); + if ( image.filterType() != TriangleFilter ) + { + ++failures; + cout << "Line: " << __LINE__ << ", filterType set/get failed" + << endl; + } + + // + // font + // + + // Test set/get + image.font("helvetica"); + if ( image.font() != "helvetica" ) + { + ++failures; + cout << "Line: " << __LINE__ << ", font set/get failed" << endl; + } + // Test set to null font + image.font( string() ); + if ( image.font().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", font failed to unset" << endl; + } + + // + // fontPointsize + // + // Test default + if ( image.fontPointsize() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", fontPointsize (" + << image.fontPointsize() + << ") is not default of 0 as expected" + << endl; + } + + // Test set/get + image.fontPointsize(10); + if ( image.fontPointsize() != 10 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", fontPointsize set/get failed" << endl; + } + image.fontPointsize(12); + + // + // format + // + if ( image.format() != "Constant image uniform color" ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", format (" << image.format() << ") is not expected value" << endl; + } + + // + // gamma + // + if ( image.gamma() == 1.0f) + { + ++failures; + cout << "Line: " << __LINE__ + << ", gamma correction is unity as expected" << endl; + } + + // + // geometry + // + { + bool caughtException = false; + try + { + image.geometry(); + } + catch ( Exception& ) + { + caughtException = true; + } + if ( caughtException != true ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", geometry failed to report missing image geometry"; + } + } + + // + // gifDisposeMethod + // + // Test default + if ( image.gifDisposeMethod() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", gifDisposeMethod default is not zero as expected" << endl; + } + + // Test set/get + image.gifDisposeMethod(4); + if ( image.gifDisposeMethod() != 4 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", gifDisposeMethod set/get failed" << endl; + } + image.gifDisposeMethod(0); + + // + // interlaceType + // + // Test default + if ( image.interlaceType() != NoInterlace ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", interlaceType default is not NoInterlace as expected" << endl; + } + + // Test set/get + image.interlaceType( PlaneInterlace ); + if ( image.interlaceType() != PlaneInterlace ) + { + ++failures; + cout << "Line: " << __LINE__ << ", interlaceType set/get failed" << endl; + } + image.interlaceType(NoInterlace); + + // + // label + // + // Test default + if ( image.label().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", label default is not empty string as expected" << endl; + } + + // Test set/get + image.label("How now brown cow?"); + if ( image.label() != "How now brown cow?" ) + { + ++failures; + cout << "Line: " << __LINE__ << ", label set/get failed" << endl; + } + // Test set to default + image.label( string() ); + if ( image.label().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", label failed to unset" << endl; + } + + // + // lineWidth + // + // Test default + if ( image.lineWidth() != 1 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", lineWidth default is not 1 as expected" << endl; + } + + // Test set/get + image.lineWidth(2); + if ( image.lineWidth() != 2 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", lineWidth set/get failed" << endl; + } + image.lineWidth(1); + + // + // magick + // + // Test canvas default + if ( image.magick() != "XC" ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", magick canvas default is not XC as expected" << endl; + } + + // Test set/get + image.magick("GIF"); + if ( image.magick() != "GIF" ) + { + ++failures; + cout << "Line: " << __LINE__ << ", magick set/get failed" << endl; + } + + image.magick("XC"); + + // + // matte + // + // Test default + if ( image.matte() != false ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", matte default is not false as expected" << endl; + } + + // Test set/get + image.matte(true); + if ( image.matte() != true ) + { + ++failures; + cout << "Line: " << __LINE__ << ", matte set/get failed" << endl; + } + image.matte(false); + + // + // matteColor + // + // Test default + if ( image.matteColor() != Color("#BDBDBD") ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", matteColor default is not #BDBDBD as expected" << endl; + } + + // Test set/get + image.matteColor(ColorRGB(0.5,0.5,1)); + if ( image.matteColor() != ColorRGB(0.5,0.5,1) ) + { + ++failures; + cout << "Line: " << __LINE__ << ", matteColor set/get failed" << endl; + } + + // Test unset + image.matteColor( Color() ); + + image.matteColor("#BDBDBD"); + + // + // meanErrorPerPixel + // + if ( image.meanErrorPerPixel() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", meanErrorPerPixel is not zero as expected" << endl; + } + + // + // montageGeometry + // + { + bool caughtException = false; + try + { + image.montageGeometry(); + } + catch ( Exception& ) + { + caughtException = true; + } + if ( caughtException != true ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", montageGeometry failed to report missing montage geometry"; + } + } + + // + // monochrome + // + // Test default + if ( image.monochrome() != false ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", monochrome is not false as expected" << endl; + } + + // Test set/get + image.monochrome(true); + if ( image.monochrome() != true ) + { + ++failures; + cout << "Line: " << __LINE__ << ", monochrome get/set failed" << endl; + } + image.monochrome(false); + + // + // normalizedMaxError + // + if ( image.normalizedMaxError() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ",normalizedMaxError is not zero as expected" << endl; + } + + // + // normalizedMeanError + // + if ( image.normalizedMeanError() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", normalizedMeanError is not zero as expected" << endl; + } + + // + // penColor + // + + image.penColor(ColorRGB(0.5,0.5,1)); + if ( image.penColor() != ColorRGB(0.5,0.5,1) ) + { + ++failures; + cout << "Line: " << __LINE__ << ", penColor (" + << string(image.penColor()) + << ") set/get failed" << endl; + } + + // + // strokeColor + // + + image.strokeColor(ColorRGB(0.5,0.5,1)); + if ( image.strokeColor() != ColorRGB(0.5,0.5,1) ) + { + ++failures; + cout << "Line: " << __LINE__ << ", strokeColor (" + << string(image.strokeColor()) + << ") set/get failed" << endl; + } + + + // + // fillColor + // + + image.fillColor(ColorRGB(0.5,0.5,1)); + if ( image.fillColor() != ColorRGB(0.5,0.5,1) ) + { + ++failures; + cout << "Line: " << __LINE__ << ", fillColor (" + << string(image.fillColor()) + << ") set/get failed" << endl; + } + + // + // pixelColor + // + // Test default + if (image.pixelColor(40,60) != string(canvasColor)) + { + ++failures; + cout << "Line: " << __LINE__ << ", pixelColor default (" + << string(image.pixelColor(40,60)) + << ") is not canvas color (" + << string(canvasColor) + << ") as expected" << endl; + } + + // Test set/get + image.pixelColor(40,60, ColorRGB(0.5,1,1)); + if ( image.pixelColor(40,60) != ColorRGB(0.5,1,1) ) + { + ++failures; + cout << "Line: " << __LINE__ << ", pixelColor set/get failed" << endl; + } + + // + // page + // + // Test default + if ( image.page() != Geometry(640,480,0,0) ) + { + ++failures; + cout << "Line: " << __LINE__ << ", page default " + << "(" << string(image.page()) << ")" + << " is not 640x480 as expected" << endl; + } + + // Test set/get + image.page("letter+43+43>"); + if ( image.page() != "612x792+43+43" ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", page set/get failed (" << string(image.page()) << ")" << endl; + } + + // + // quality + // + // Test default + if ( image.quality() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", quality default is not 0 as expected" << endl; + } + + // Test set/get + image.quality(65); + if ( image.quality() != 65 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", quality set/get failed" << endl; + } + image.quality(0); + + // + // quantizeColors + // + // Test default + if ( image.quantizeColors() != 256 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", quantizeColors is not 256 as expected" << endl; + } + + // Test set/get + image.quantizeColors(200); + if ( image.quantizeColors() != 200 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", quantizeColors set/get failed" << endl; + } + image.quantizeColors(0); + + // + // quantizeColorSpace + // + // Test default + if ( image.quantizeColorSpace() != UndefinedColorspace ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", quantizeColorSpace is not RGBColorspace as expected" << endl; + } + + // Test set/get + image.quantizeColorSpace(YIQColorspace); + if ( image.quantizeColorSpace() != YIQColorspace ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", quantizeColorSpace set/get failed" << endl; + } + image.quantizeColorSpace(RGBColorspace); + + // + // quantizeDither + // + // Test default + if ( image.quantizeDither() == false ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", quantizeDither is not false as expected" << endl; + } + + // Test set/get + image.quantizeDither(false); + if ( image.quantizeDither() != false ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", quantizeDither get/set failed" << endl; + } + image.quantizeDither(true); + + // + // quantizeTreeDepth + // + if ( image.quantizeTreeDepth() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", quantizeTreeDepth default is " + << image.quantizeTreeDepth() + << " rather than zero as expected" << endl; + } + + image.quantizeTreeDepth(7); + if ( image.quantizeTreeDepth() != 7 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", quantizeTreeDepth set/get failed" << endl; + } + image.quantizeTreeDepth(8); + + // + // renderingIntent + // + if ( image.renderingIntent() == UndefinedIntent ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", renderingIntent default is UndefinedIntent as expected" + << endl; + } + + image.renderingIntent(PerceptualIntent); + if ( image.renderingIntent() != PerceptualIntent ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", renderingIntent set/get failed" << endl; + } + image.renderingIntent(UndefinedIntent); + + // + // resolutionUnits + // + if ( image.resolutionUnits() != UndefinedResolution ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", resolutionUnits default is not UndefinedResolution as expected" + << endl; + } + + image.resolutionUnits(PixelsPerCentimeterResolution); + if ( image.resolutionUnits() != PixelsPerCentimeterResolution ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", resolutionUnits set/get failed" << endl; + } + image.resolutionUnits(UndefinedResolution); + + // + // rows + // + if ( image.rows() != rows ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", rows is canvas rows as expected" << endl; + } + + // + // scene + // + if ( image.scene() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", scene default is not zero as expected" << endl; + } + + image.scene(5); + if ( image.scene() != 5 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", scene set/get failed" << endl; + } + image.scene(0); + + // + // signature + // + + if ( image.signature() != "c7ac1ef7b47015c6ea6c1fb1d736eba4f8c3fe81dbfe511fbce104cedfce7588" && + image.signature() != "d9464cd4d0c02f25166909726d6548db51d25fa91bd3cff642813f8a464bcfc7" && + image.signature() != "e073572dfa4ad28f2f8dd3c6d37dfb14585e60c94cfae910149e97eff2fd895f" && + image.signature() != "ed06047a79b5b298515538db3fb8186d79e94758ed07a9b411637ba3a79fb4a0" && + image.signature() != "e12b9781b3a5025628567a4eabf970d16d42560e1b86189caceb03ec358dd8e6" && + image.signature() != "ea9aaf29023c4c1c801e05483423a4a4266918e3a464b6a5155f11a0c581dedb" && + image.signature() != "6a989010d8ea958934ff8be44a42e0848f7c5e7e46cd53e04c4a90452c15d34c" && + image.signature() != "7e5977b8bce5c40b858c84344803dae61feae0ef7a21739b2d068c9cdb72f95b" && + image.signature() != "c8aed4b60d666e449f5c29d0fb32f089e3257422a1f11a4712451c5340362df0" && + image.signature() != "bc272b75794971f4a3ade1bf524c0aee375765e9fb15d65278a8b9452b551ea6" && + image.signature() != "482690062c78a9e78c9f5f3db514197a067028e9f1bec577b787fb9e9b044567" && + image.signature() != "8610fd1c5ef905c05bf75438aaab8729d3e1277b8ec1e86927777bd3382702e5" && + image.signature() != "b891ddb1d32cd45c6329180e5bd733eebb8dd06c401a9c721841ec43e4a662f8") + { + ++failures; + cout << "Line: " << __LINE__ << ", signature (" + << image.signature() + << ") is incorrect" << endl; + image.display(); + } + + // + // size + // + if ( image.size() != geometry ) + { + ++failures; + cout << "Line: " << __LINE__ << ", size (" + << string(image.size()) + << ") is not equal to geometry (" + << string(geometry) + << ")" + << endl; + } + + image.size("800x600"); + if ( image.size() != Geometry("800x600") ) + { + ++failures; + cout << "Line: " << __LINE__ << ", size set/get failed" << endl; + } + image.size( geometry ); + + // + // subImage + // + if ( image.subImage() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", subImage default is not zero as expected" << endl; + } + + image.subImage(5); + if ( image.subImage() != 5 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", subImage set/get failed" << endl; + } + image.subImage(0); + + // + // subRange + // + if ( image.subRange() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", subRange default is not zero as expected" << endl; + } + + image.subRange(5); + if ( image.subRange() != 5 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", subRange set/get failed" << endl; + } + image.subRange(0); + + // + // tileName + // + if ( image.tileName().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", tileName default is not empty string as expected" << endl; + } + + image.tileName("How now brown cow?"); + if ( image.tileName() != "How now brown cow?" ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", tileName set/get failed" << endl; + } + + image.tileName( string() ); + if ( image.tileName().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", tileName failed to unset" << endl; + } + + // + // totalColors + // + if ( image.totalColors() != 2 ) + { + ++failures; + cout << "Line: " << __LINE__ << ", totalColors is " << image.totalColors() + << " rather than 2 as expected" << endl; + } + + // + // type + // + image.type(PaletteType); + if ( image.type() != PaletteType ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", type is not PaletteType as expected. Reported type " + << (int) image.type() << endl; + + } + + // + // verbose + // + if ( image.verbose() != false ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", verbose is not false as expected" << endl; + } + + // + // view + // + if ( image.view().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", view default is not empty string as expected" << endl; + } + + image.view("How now brown cow?"); + if ( image.view() != "How now brown cow?" ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", view set/get failed" << endl; + } + + image.view( string() ); + if ( image.view().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", view failed to unset" << endl; + } + + // + // x11Display + // + if ( image.x11Display().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", x11Display default is not empty string as expected" << endl; + } + + image.x11Display(":0.0"); + if ( image.x11Display() != ":0.0" ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", x11Display set/get failed" << endl; + } + + image.x11Display( string() ); + if ( image.x11Display().length() != 0 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", x11Display failed to unset" << endl; + } + + // + // xResolution + // + if ( image.xResolution() != 72 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", xResolution default (" << image.xResolution() + << ") is not zero as expected" << endl; + } + + // + // yResolution + // + if ( image.yResolution() != 72 ) + { + ++failures; + cout << "Line: " << __LINE__ + << ", yResolution default (" << image.yResolution() + << ") is not zero as expected" << endl; + } + } + catch( Exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/tests/averageImages.cpp b/ImageMagick-6.9.12-44/Magick++/tests/averageImages.cpp new file mode 100644 index 0000000..0c94ee8 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/averageImages.cpp @@ -0,0 +1,75 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2003 +// +// Test STL averageImages function +// + +#include +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + int failures=0; + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Test averageImages + // + + list imageList; + readImages( &imageList, srcdir + "test_image_anim.miff" ); + + Image averaged; + averageImages( &averaged, imageList.begin(), imageList.end() ); + // averaged.display(); + if ( 0 && averaged.signature() != "d4b4ffb8b70c4e9b0e50445542deb26fbcdf8c393c793123cbc92fb35341e44d" && + averaged.signature() != "62d46d6d239b9fbd3b8ff2271aed1b5dde6303e0d5228dd8d833f61a7b012a79" && + averaged.signature() != "fdc76a2689d19061e1f7f6adfd79a2c04bc4608125a2cd2a1bce0d981774e13f" && + averaged.signature() != "66dfb88c21405a6bf582c9a542d87fd14db176aae1f34bc30b0b3e2443b49aa8" && + averaged.signature() != "f3bc318abc0b842c656b6545d1d7159eedb61f559a95fc5df671db7d0c0639de") + { + cout << "Line: " << __LINE__ + << " Averaging image failed, signature = " + << averaged.signature() << endl; + averaged.display(); + ++failures; + } + } + + catch( Exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} + diff --git a/ImageMagick-6.9.12-44/Magick++/tests/coalesceImages.cpp b/ImageMagick-6.9.12-44/Magick++/tests/coalesceImages.cpp new file mode 100644 index 0000000..4db76f9 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/coalesceImages.cpp @@ -0,0 +1,62 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2003 +// +// Test STL coalesceImages function +// + +#include +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + int failures=0; + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Test coalesceImages + // + + list imageList; + readImages( &imageList, srcdir + "test_image_anim.miff" ); + + list coalescedList; + coalesceImages( &coalescedList, imageList.begin(), imageList.end() ); + } + + catch( Exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} + diff --git a/ImageMagick-6.9.12-44/Magick++/tests/coderInfo.cpp b/ImageMagick-6.9.12-44/Magick++/tests/coderInfo.cpp new file mode 100644 index 0000000..e5c5df0 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/coderInfo.cpp @@ -0,0 +1,134 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 2001, 2002, 2003 +// +// Test Magick::CoderInfo class and Magick::coderInfoList +// + +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int test( CoderInfo::MatchType isReadable_, + CoderInfo::MatchType isWritable_, + CoderInfo::MatchType isMultiFrame_ ) +{ + int result = 0; + list coderList; + coderInfoList( &coderList, isReadable_, isWritable_, isMultiFrame_ ); + list::iterator entry = coderList.begin(); + while( entry != coderList.end() ) + { + // Readable + if ( isReadable_ != CoderInfo::AnyMatch && + (( entry->isReadable() && isReadable_ != CoderInfo::TrueMatch ) || + ( !entry->isReadable() && isReadable_ != CoderInfo::FalseMatch )) ) + { + cout << "Entry \"" + << entry->name() + << "\" has unexpected readablity state (" + << static_cast(entry->isReadable()) + << ")" + << endl; + ++result; + } + + // Writable + if ( isWritable_ != CoderInfo::AnyMatch && + (( entry->isWritable() && isWritable_ != CoderInfo::TrueMatch ) || + ( !entry->isWritable() && isWritable_ != CoderInfo::FalseMatch )) ) + { + cout << "Entry \"" + << entry->name() + << "\" has unexpected writablity state (" + << static_cast(entry->isWritable()) + << ")" + << endl; + ++result; + } + + // MultiFrame + if ( isMultiFrame_ != CoderInfo::AnyMatch && + (( entry->isMultiFrame() && isMultiFrame_ != CoderInfo::TrueMatch ) || + ( !entry->isMultiFrame() && isMultiFrame_ != CoderInfo::FalseMatch )) ) + { + cout << "Entry \"" + << entry->name() + << "\" has unexpected multiframe state (" + << static_cast(entry->isMultiFrame()) + << ")" + << endl; + ++result; + } + + entry++; + } + + return result; +} + +int main( int /*argc*/, char **argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + int failures=0; + + try { + + CoderInfo coderInfo("GIF"); + if ( coderInfo.name() != string("GIF") ) + { + cout << "Unexpected coder name \"" + << coderInfo.name() + << "\"" + << endl; + ++failures; + } + + if( coderInfo.description() != string("CompuServe graphics interchange format") ) + { + cout << "Unexpected coder description \"" + << coderInfo.description() + << "\"" + << endl; + ++failures; + } + + failures += test(CoderInfo::AnyMatch,CoderInfo::AnyMatch,CoderInfo::AnyMatch); + failures += test(CoderInfo::FalseMatch,CoderInfo::FalseMatch,CoderInfo::FalseMatch); + + failures += test(CoderInfo::TrueMatch,CoderInfo::AnyMatch,CoderInfo::AnyMatch); + failures += test(CoderInfo::FalseMatch,CoderInfo::AnyMatch,CoderInfo::AnyMatch); + + failures += test(CoderInfo::AnyMatch,CoderInfo::TrueMatch,CoderInfo::AnyMatch); + failures += test(CoderInfo::AnyMatch,CoderInfo::FalseMatch,CoderInfo::AnyMatch); + + failures += test(CoderInfo::AnyMatch,CoderInfo::AnyMatch,CoderInfo::TrueMatch); + failures += test(CoderInfo::AnyMatch,CoderInfo::AnyMatch,CoderInfo::FalseMatch); + } + catch( Exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/tests/color.cpp b/ImageMagick-6.9.12-44/Magick++/tests/color.cpp new file mode 100644 index 0000000..138ed21 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/color.cpp @@ -0,0 +1,154 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// +// Test Magick::Color classes +// + +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char **argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + int failures=0; + + try { + + // + // Verify conversion from named colors as well as ColorRGB constructor + // + + { + struct colorStr + { + const char* color; + double red; + double green; + double blue; + }; + + // Convert ratios from rgb.txt via value/255 + struct colorStr colorMap [] = + { + { "red", 1,0,0 }, + { "lime", 0,1,0 }, + { "blue", 0,0,1 }, + { "black", 0,0,0 }, + { "white", 1,1,1 }, + { "cyan", 0,1,1 }, + { "magenta", 1,0,1 }, + { "yellow", 1,1,0 }, + { NULL, 0,0,0 } + }; + + for ( int i = 0; colorMap[i].color != NULL; i++ ) + { + { + Color color( colorMap[i].color ); + ColorRGB colorMatch( colorMap[i].red, + colorMap[i].green, + colorMap[i].blue ); + if ( color != colorMatch ) + { + ++failures; + cout << "Line: " << __LINE__ << " Color(\"" + << colorMap[i].color << "\") is " + << string(color) + << " rather than " + << string(colorMatch) + << endl; + // printf ("Green: %10.16f\n", color.green()); + } + } + } + } + + // Test conversion to/from X11-style color specifications + { + const char * colorStrings[] = + { + "#ABC", + "#AABBCC", + "#AAAABBBBCCCC", + NULL + }; + +#if MAGICKCORE_QUANTUM_DEPTH == 8 + string expectedString = "#AABBCC"; +#elif MAGICKCORE_QUANTUM_DEPTH == 16 + string expectedString = "#AAAABBBBCCCC"; +#elif MAGICKCORE_QUANTUM_DEPTH == 32 + string expectedString = "#AAAAAAAABBBBBBBBCCCCCCCC"; +#elif MAGICKCORE_QUANTUM_DEPTH == 64 + string expectedString = "#AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCC"; +#else +# error Quantum depth not supported! +#endif + + for ( int i = 0; colorStrings[i] != NULL; ++i ) + { + if ( string(Color(colorStrings[i])) != expectedString ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Conversion from " << colorStrings[i] + << " is " + << string(Color(colorStrings[i])) << " rather than " + << expectedString + << endl; + } + } + } + + // Test ColorGray + { + double resolution = 1.0/QuantumRange; + if ( resolution < 0.0000001 ) + resolution = 0.0000001; + double max_error = resolution + MagickEpsilon; + + for( double value = 0; value < 1.0 + MagickEpsilon; value += resolution ) + { + ColorGray gray(value); + if ( gray.shade() < value - max_error || gray.shade() > value + max_error ) + { + ++failures; + cout << "Line: " << __LINE__ + << " shade is " + << gray.shade() + << " rather than nominal " + << value + << endl; + } + } + } + + } + catch( Exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/tests/colorHistogram.cpp b/ImageMagick-6.9.12-44/Magick++/tests/colorHistogram.cpp new file mode 100644 index 0000000..4418eac --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/colorHistogram.cpp @@ -0,0 +1,101 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 2003 +// +// Test STL colorHistogram function +// + +#undef USE_VECTOR +#define USE_MAP + +#include +#include +#include +#include +#if defined(USE_VECTOR) +# include +# include +#endif +#if defined(USE_MAP) +# include +#endif + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + int failures=0; + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // Read image + Image image; + image.read( srcdir + "test_image.miff" ); + + // Create histogram vector +#if defined(USE_MAP) + std::map histogram; +#elif defined(USE_VECTOR) + std::vector > histogram; +#endif + + colorHistogram( &histogram, image ); + + // Print out histogram +#if (MAGICKCORE_QUANTUM_DEPTH == 8) + int quantum_width=3; +#elif (MAGICKCORE_QUANTUM_DEPTH == 16) + int quantum_width=5; +#else + int quantum_width=10; +#endif + + cout << "Histogram for file \"" << image.fileName() << "\"" << endl + << histogram.size() << " entries:" << endl; + +#if defined(USE_MAP) + std::map::const_iterator p=histogram.begin(); +#elif defined(USE_VECTOR) + std::vector >::const_iterator p=histogram.begin(); +#endif + while (p != histogram.end()) + { + cout << setw(10) << (int)p->second << ": (" + << setw(quantum_width) << (int)p->first.redQuantum() << "," + << setw(quantum_width) << (int)p->first.greenQuantum() << "," + << setw(quantum_width) << (int)p->first.blueQuantum() << ")" + << endl; + p++; + } + } + + catch( Exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} + diff --git a/ImageMagick-6.9.12-44/Magick++/tests/exceptions.cpp b/ImageMagick-6.9.12-44/Magick++/tests/exceptions.cpp new file mode 100644 index 0000000..608c588 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/exceptions.cpp @@ -0,0 +1,102 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 +// +// Tests for throwing exceptions +// + +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** argv) +{ + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + volatile int failures=0; + + cout << "Checking for working exceptions (may crash) ... "; + cout.flush(); + + { + // Basic exception test + try + { + failures++; + throw int(100); + } + catch ( int /*value_*/ ) + { + failures--; + } + + // Throw a Magick++ exception class. + try + { + failures++; + cout << "Throwing 'Magick::WarningResourceLimit' exception" << endl; + cout.flush(); + throw WarningResourceLimit("How now brown cow?"); + } + catch( Exception & /*error_*/ ) + { + cout << "Successfully caught 'Magick::WarningResourceLimit' exception" << endl; + cout.flush(); + failures--; + } + + // A more complex test + try + { + size_t columns = 640; + size_t rows = 480; + Geometry geometry(columns,rows); + Color canvasColor( "red" ); + Image image( geometry, canvasColor); + + { + try + { + failures++; + cout << "Throwing library 'Magick::Exception' exception" << endl; + cout.flush(); + image.directory(); + } + catch ( Exception& /*error_*/ ) + { + cout << "Successfully caught library 'Magick::Exception' exception" << endl; + cout.flush(); + failures--; + } + } + + } + catch( Exception &error_ ) + { + cout << "Bogus catch: Caught exception: " << error_.what() << endl; + cout.flush(); + return 1; + } + catch( exception &error_ ) + { + cout << "Bogus catch: Caught exception: " << error_.what() << endl; + cout.flush(); + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + cout.flush(); + return 1; + } + cout << "Exception testing passed!" << endl; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/tests/montageImages.cpp b/ImageMagick-6.9.12-44/Magick++/tests/montageImages.cpp new file mode 100644 index 0000000..482f14b --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/montageImages.cpp @@ -0,0 +1,140 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2002, 2003 +// +// Test STL montageImages function +// + +#include +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char ** /*argv*/) +{ + + // Initialize ImageMagick install location for Windows + // InitializeMagick(*argv); + InitializeMagick(""); + + int failures=0; + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Test montageImages + // + + list imageList; + readImages( &imageList, srcdir + "test_image_anim.miff" ); + + vector montage; + MontageFramed montageOpts; + + // Default montage + montageImages( &montage, imageList.begin(), imageList.end(), montageOpts ); + + { + Geometry targetGeometry(128, 126 ); + if ( montage[0].montageGeometry() != targetGeometry ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Montage geometry (" + << string(montage[0].montageGeometry()) + << ") is incorrect (expected " + << string(targetGeometry) + << ")" + << endl; + } + } + + if ( montage[0].columns() != 768 || montage[0].rows() != 504 ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Montage columns/rows (" + << montage[0].columns() << "x" + << montage[0].rows() + << ") incorrect. (expected 768x504)" << endl; + } + + // Montage with options set + montage.clear(); + montageOpts.borderColor( "green" ); + montageOpts.borderWidth( 1 ); + montageOpts.compose( OverCompositeOp ); + montageOpts.fileName( "Montage" ); + montageOpts.frameGeometry( "6x6+3+3" ); + montageOpts.geometry("50x50+2+2>"); + montageOpts.gravity( CenterGravity ); + montageOpts.penColor( "yellow" ); + montageOpts.shadow( true ); + montageOpts.texture( "granite:" ); + montageOpts.tile("2x1"); + montageImages( &montage, imageList.begin(), imageList.end(), montageOpts ); + + if ( montage.size() != 3 ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Montage images failed, number of montage frames is " + << montage.size() + << " rather than 3 as expected." << endl; + } + + { + Geometry targetGeometry( 66, 70 ); + if ( montage[0].montageGeometry() != targetGeometry ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Montage geometry (" + << string(montage[0].montageGeometry()) + << ") is incorrect (expected " + << string(targetGeometry) + << ")." + << endl; + } + } + + if ( montage[0].columns() != 136 || montage[0].rows() != 70 ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Montage columns/rows (" + << montage[0].columns() << "x" + << montage[0].rows() + << ") incorrect. (expected 136x70)" << endl; + } + } + + catch( Exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} + diff --git a/ImageMagick-6.9.12-44/Magick++/tests/morphImages.cpp b/ImageMagick-6.9.12-44/Magick++/tests/morphImages.cpp new file mode 100644 index 0000000..00a0c82 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/morphImages.cpp @@ -0,0 +1,71 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2003 +// +// Test STL morphImages function +// + +#include +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main( int /*argc*/, char **argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + int failures=0; + + try { + + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + // + // Test morphImages + // + + list imageList; + readImages( &imageList, srcdir + "test_image_anim.miff" ); + + list morphed; + morphImages( &morphed, imageList.begin(), imageList.end(), 3 ); + + if ( morphed.size() != 21 ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Morph images failed, number of frames is " + << morphed.size() + << " rather than 21 as expected." << endl; + } + } + + catch( Exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} + diff --git a/ImageMagick-6.9.12-44/Magick++/tests/readWriteBlob.cpp b/ImageMagick-6.9.12-44/Magick++/tests/readWriteBlob.cpp new file mode 100644 index 0000000..a15f046 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/readWriteBlob.cpp @@ -0,0 +1,255 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2003 +// +// Test reading/writing BLOBs using Magick++ +// + +#include +#include +#include +#include + +#if defined(MISSING_STD_IOS_BINARY) +# define IOS_IN_BINARY ios::in +#else +# define IOS_IN_BINARY ios::in | ios::binary +#endif + +using namespace std; + +using namespace Magick; + +// A derived Blob class to exercise updateNoCopy() +class myBlob : public Blob +{ +public: + // Construct from open binary stream + myBlob( ifstream &stream_ ) + : Blob() + { + unsigned char* blobData = new unsigned char[100000]; + char* c= reinterpret_cast(blobData); + size_t blobLen=0; + while( (blobLen< 100000) && stream_.get(*c) ) + { + c++; + blobLen++; + } + if ((!stream_.eof()) || (blobLen == 0)) + { + cout << "Failed to stream into blob!" << endl; + exit(1); + } + + // Insert data into blob + updateNoCopy( reinterpret_cast(blobData), blobLen, + Blob::NewAllocator ); + } +}; + + +int main( int /*argc*/, char ** argv) +{ + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + int failures=0; + + try + { + string srcdir(""); + if(getenv("SRCDIR") != 0) + srcdir = getenv("SRCDIR"); + + string testimage; + + // + // Test reading BLOBs + // + { + string signature(""); + { + Image image(srcdir + "test_image.miff"); + signature = image.signature(); + } + + // Read raw data from file into BLOB + testimage = srcdir + "test_image.miff"; + ifstream in( testimage.c_str(), ios::in | IOS_IN_BINARY ); + if( !in ) + { + cout << "Failed to open file " << testimage << " for input!" << endl; + exit(1); + } + unsigned char* blobData = new unsigned char[100000]; + char* c=reinterpret_cast(blobData); + size_t blobLen=0; + while( (blobLen< 100000) && in.get(*c) ) + { + c++; + blobLen++; + } + if ((!in.eof()) || (blobLen == 0)) + { + cout << "Failed to read file " << testimage << " for input!" << endl; + exit(1); + } + in.close(); + + // Construct Magick++ Blob + Blob blob(static_cast(blobData), blobLen); + delete [] blobData; + + // If construction of image fails, an exception should be thrown + { + // Construct with blob data only + Image image( blob ); + if ( image.signature() != signature ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Image signature " + << image.signature() + << " != " + << signature << endl; + } + } + + { + // Construct with image geometry and blob data + Image image( blob, Geometry(148,99)); + if ( image.signature() != signature ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Image signature " + << image.signature() + << " != " + << signature << endl; + } + } + + { + // Construct default image, and then read in blob data + Image image; + image.read( blob ); + if ( image.signature() != signature ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Image signature " + << image.signature() + << " != " + << signature << endl; + } + } + + { + // Construct default image, and then read in blob data with + // image geometry + Image image; + image.read( blob, Geometry(148,99) ); + if ( image.signature() != signature ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Image signature " + << image.signature() + << " != " + << signature << endl; + } + } + + } + + // Test writing BLOBs + { + Blob blob; + string signature(""); + { + Image image(srcdir + "test_image.miff"); + image.magick("MIFF"); + image.write( &blob ); + signature = image.signature(); + } + { + Image image(blob); + if ( image.signature() != signature ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Image signature " + << image.signature() + << " != " + << signature << endl; + image.display(); + } + } + + } + // Test writing BLOBs via STL writeImages + { + Blob blob; + + list first; + readImages( &first, srcdir + "test_image_anim.miff" ); + writeImages( first.begin(), first.end(), &blob, true ); + } + + // Test constructing a BLOB from a derived class + { + + string signature(""); + { + Image image(srcdir + "test_image.miff"); + signature = image.signature(); + } + + // Read raw data from file into BLOB + testimage = srcdir + "test_image.miff"; + ifstream in( testimage.c_str(), ios::in | IOS_IN_BINARY ); + if( !in ) + { + cout << "Failed to open file for input!" << endl; + exit(1); + } + + myBlob blob( in ); + in.close(); + + Image image( blob ); + if ( image.signature() != signature ) + { + ++failures; + cout << "Line: " << __LINE__ + << " Image signature " + << image.signature() + << " != " + << signature << endl; + } + } + } + + catch( Exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch( exception &error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if ( failures ) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} + + diff --git a/ImageMagick-6.9.12-44/Magick++/tests/readWriteImages.cpp b/ImageMagick-6.9.12-44/Magick++/tests/readWriteImages.cpp new file mode 100644 index 0000000..c340588 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/readWriteImages.cpp @@ -0,0 +1,178 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2003 +// Copyright Dirk Lemstra 2014 +// +// Test STL readImages and writeImages functions and test +// image format when reading/writing. +// + +#include +#include +#include +#include +#include + +using namespace std; + +using namespace Magick; + +int main(int,char ** argv) +{ + int + failures=0; + + string + srcdir(""); + + + // Initialize ImageMagick install location for Windows + InitializeMagick(*argv); + + try + { + if (getenv("SRCDIR") != 0) + srcdir=getenv("SRCDIR"); + + // + // Test readImages and writeImages + // + list first; + readImages(&first,srcdir + "test_image_anim.miff"); + + if (first.size() != 6) + { + ++failures; + cout << "Line: " << __LINE__ + << " Read images failed, number of frames is " + << first.size() + << " rather than 6 as expected." << endl; + } + + writeImages(first.begin(),first.end(),"testmagick_anim_out.miff"); + + list second; + readImages(&second,"testmagick_anim_out.miff"); + + list::iterator firstIter = first.begin(); + list::iterator secondIter = second.begin(); + while (firstIter != first.end() && secondIter != second.end()) + { + if (firstIter->scene() != secondIter->scene()) + { + ++failures; + cout << "Line: " << __LINE__ + << " Image scene: " << secondIter->scene() + << " is not equal to original " + << firstIter->scene() + << endl; + } + + if (firstIter->rows() != secondIter->rows()) + { + ++failures; + cout << "Line: " << __LINE__ + << " Image rows " << secondIter->rows() + << " are not equal to original " + << firstIter->rows() + << endl; + } + + if (firstIter->columns() != secondIter->columns()) + { + ++failures; + cout << "Line: " << __LINE__ + << " Image columns " << secondIter->columns() + << " are not equal to original " + << firstIter->rows() + << endl; + } + + firstIter++; + secondIter++; + } + + Image third(*first.begin()); + third.write("testmagick_anim_out"); + + Image fourth; + fourth.read("testmagick_anim_out"); + + if (fourth.magick() != "MIFF") + { + ++failures; + cout << "Line: " << __LINE__ + << " Image magick: " << fourth.magick() + << " is not equal to MIFF" + << endl; + } + + third.write("testmagick_anim_out.ico"); + fourth.read("testmagick_anim_out.ico"); + + if (fourth.magick() != "ICO") + { + ++failures; + cout << "Line: " << __LINE__ + << " Image magick: " << fourth.magick() + << " is not equal to ICO" + << endl; + } + + third.magick("BMP"); + third.write("testmagick_anim_out.ico"); + fourth.read("testmagick_anim_out.ico"); + + if (fourth.magick() != "BMP") + { + ++failures; + cout << "Line: " << __LINE__ + << " Image magick: " << fourth.magick() + << " is not equal to BMP" + << endl; + } + + third.write("PDB:testmagick_anim_out.ico"); + fourth.read("testmagick_anim_out.ico"); + + if (fourth.magick() != "PDB") + { + ++failures; + cout << "Line: " << __LINE__ + << " Image magick: " << fourth.magick() + << " is not equal to PDB" + << endl; + } + + third.magick(""); + third.write("testmagick_anim_out.ico"); + fourth.read("testmagick_anim_out.ico"); + + if (fourth.magick() != "ICO") + { + ++failures; + cout << "Line: " << __LINE__ + << " Image magick: " << fourth.magick() + << " is not equal to ICO" + << endl; + } + } + catch(Exception &error_) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + catch(exception &error_) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + if (failures) + { + cout << failures << " failures" << endl; + return 1; + } + + return 0; +} diff --git a/ImageMagick-6.9.12-44/Magick++/tests/test_image.miff b/ImageMagick-6.9.12-44/Magick++/tests/test_image.miff new file mode 100644 index 0000000000000000000000000000000000000000..328281b2c279b1a76d38bada55edc760a41a8ca1 GIT binary patch literal 44083 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 WEoC%g2qUz|F+;1eZhaQ})X=~7$JHMI literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/Magick++/tests/tests.tap b/ImageMagick-6.9.12-44/Magick++/tests/tests.tap new file mode 100755 index 0000000..459aa40 --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/tests/tests.tap @@ -0,0 +1,22 @@ +#!/bin/sh +# +# Copyright 2004 Bob Friesenhahn +# +# This file is part of Magick++, the C++ API for ImageMagick and +# ImageMagick. Please see the file "COPYING" included with Magick++ +# for usage and copying restrictions. +# +subdir=Magick++/tests +. ./common.shi +echo "1..12" + +SRCDIR=${top_srcdir}/${subdir}/ +export SRCDIR + +cd ${subdir} || exit 1 + +for mytest in appendImages attributes averageImages coalesceImages coderInfo color colorHistogram exceptions montageImages morphImages readWriteBlob readWriteImages +do + ./${mytest} && echo "ok" || echo "not ok" +done +: diff --git a/ImageMagick-6.9.12-44/Magickshr.opt b/ImageMagick-6.9.12-44/Magickshr.opt new file mode 100755 index 0000000..87629bf --- /dev/null +++ b/ImageMagick-6.9.12-44/Magickshr.opt @@ -0,0 +1,252 @@ +IDENTIFICATION="Magick V6.9" +GSMATCH=LEQUAL,6,9 +case_sensitive=YES +symbol_vector=(AcquireImageInfo=PROCEDURE) +symbol_vector=(AcquireMemory=PROCEDURE) +symbol_vector=(AddNoiseImage=PROCEDURE) +symbol_vector=(AllocateImage=PROCEDURE) +symbol_vector=(AllocateString=PROCEDURE) +symbol_vector=(AnnotateImage=PROCEDURE) +symbol_vector=(AppendImageFormat=PROCEDURE) +symbol_vector=(AppendImages=PROCEDURE) +symbol_vector=(Ascii85Encode=PROCEDURE) +symbol_vector=(Ascii85Flush=PROCEDURE) +symbol_vector=(Ascii85Initialize=PROCEDURE) +symbol_vector=(AverageImages=PROCEDURE) +symbol_vector=(BlobToImage=PROCEDURE) +symbol_vector=(BlurImage=PROCEDURE) +symbol_vector=(BorderImage=PROCEDURE) +symbol_vector=(CatchImageException=PROCEDURE) +symbol_vector=(ChopImage=PROCEDURE) +symbol_vector=(CloneImage=PROCEDURE) +symbol_vector=(CloneImageInfo=PROCEDURE) +symbol_vector=(CloneMontageInfo=PROCEDURE) +symbol_vector=(CloneString=PROCEDURE) +symbol_vector=(CloseBlob=PROCEDURE) +symbol_vector=(CoalesceImages=PROCEDURE) +symbol_vector=(ColorFloodfillImage=PROCEDURE) +symbol_vector=(CompositeImage=PROCEDURE) +symbol_vector=(ContrastImage=PROCEDURE) +symbol_vector=(CropImage=PROCEDURE) +symbol_vector=(CycleColormapImage=PROCEDURE) +symbol_vector=(DeconstructImages=PROCEDURE) +symbol_vector=(DescribeImage=PROCEDURE) +symbol_vector=(DespeckleImage=PROCEDURE) +symbol_vector=(DestroyImage=PROCEDURE) +symbol_vector=(DestroyImageInfo=PROCEDURE) +symbol_vector=(DestroyImages=PROCEDURE) +symbol_vector=(DestroyMontageInfo=PROCEDURE) +symbol_vector=(DrawImage=PROCEDURE) +symbol_vector=(EdgeImage=PROCEDURE) +symbol_vector=(EmbossImage=PROCEDURE) +symbol_vector=(EnhanceImage=PROCEDURE) +symbol_vector=(EOFBlob=PROCEDURE) +symbol_vector=(EqualizeImage=PROCEDURE) +symbol_vector=(ExpandFilename=PROCEDURE) +symbol_vector=(ExpandFilenames=PROCEDURE) +symbol_vector=(FlipImage=PROCEDURE) +symbol_vector=(FlopImage=PROCEDURE) +symbol_vector=(FormatMagickString=PROCEDURE) +symbol_vector=(FrameImage=PROCEDURE) +symbol_vector=(GammaImage=PROCEDURE) +symbol_vector=(GetBlobInfo=PROCEDURE) +symbol_vector=(GetExceptionInfo=PROCEDURE) +symbol_vector=(GetImageInfo=PROCEDURE) +symbol_vector=(GetImagePixels=PROCEDURE) +symbol_vector=(GetOnePixel=PROCEDURE) +symbol_vector=(GetMontageInfo=PROCEDURE) +symbol_vector=(GetQuantizeInfo=PROCEDURE) +symbol_vector=(GlobExpression=PROCEDURE) +symbol_vector=(HuffmanDecodeImage=PROCEDURE) +symbol_vector=(HuffmanEncodeImage=PROCEDURE) +symbol_vector=(ImageToBlob=PROCEDURE) +symbol_vector=(ImplodeImage=PROCEDURE) +symbol_vector=(IsGeometry=PROCEDURE) +symbol_vector=(IsGrayImage=PROCEDURE) +symbol_vector=(LiberateMemory=PROCEDURE) +symbol_vector=(ListDelegateInfo=PROCEDURE) +symbol_vector=(ListFiles=PROCEDURE) +symbol_vector=(ListMagickInfo=PROCEDURE) +symbol_vector=(LocaleCompare=PROCEDURE) +symbol_vector=(LocaleNCompare=PROCEDURE) +symbol_vector=(LZWEncodeImage=PROCEDURE) +symbol_vector=(MagickError=PROCEDURE) +symbol_vector=(MagickWarning=PROCEDURE) +symbol_vector=(MagnifyImage=PROCEDURE) +symbol_vector=(MapImage=PROCEDURE) +symbol_vector=(MapImages=PROCEDURE) +symbol_vector=(MatteFloodfillImage=PROCEDURE) +symbol_vector=(MinifyImage=PROCEDURE) +symbol_vector=(ModulateImage=PROCEDURE) +symbol_vector=(MogrifyImage=PROCEDURE) +symbol_vector=(MogrifyImages=PROCEDURE) +symbol_vector=(MontageImages=PROCEDURE) +symbol_vector=(MorphImages=PROCEDURE) +symbol_vector=(MosaicImages=PROCEDURE) +symbol_vector=(MultilineCensus=PROCEDURE) +symbol_vector=(NegateImage=PROCEDURE) +symbol_vector=(NormalizeImage=PROCEDURE) +symbol_vector=(OilPaintImage=PROCEDURE) +symbol_vector=(OpaqueImage=PROCEDURE) +symbol_vector=(OpenBlob=PROCEDURE) +symbol_vector=(PackbitsEncodeImage=PROCEDURE) +symbol_vector=(ParseImageGeometry=PROCEDURE) +symbol_vector=(PingImage=PROCEDURE) +symbol_vector=(PostscriptGeometry=PROCEDURE) +symbol_vector=(QuantizationError=PROCEDURE) +symbol_vector=(QuantizeImage=PROCEDURE) +symbol_vector=(QuantizeImages=PROCEDURE) +symbol_vector=(QueryColorDatabase=PROCEDURE) +symbol_vector=(RaiseImage=PROCEDURE) +symbol_vector=(ReadBlob=PROCEDURE) +symbol_vector=(ReadImage=PROCEDURE) +symbol_vector=(ReduceNoiseImage=PROCEDURE) +symbol_vector=(RGBTransformImage=PROCEDURE) +symbol_vector=(RollImage=PROCEDURE) +symbol_vector=(RotateImage=PROCEDURE) +symbol_vector=(SampleImage=PROCEDURE) +symbol_vector=(ScaleImage=PROCEDURE) +symbol_vector=(SeekBlob=PROCEDURE) +symbol_vector=(SegmentImage=PROCEDURE) +symbol_vector=(SetCacheThreshold=PROCEDURE) +symbol_vector=(SetClientName=PROCEDURE) +symbol_vector=(SetErrorHandler=PROCEDURE) +symbol_vector=(SetImageInfo=PROCEDURE) +symbol_vector=(SetMonitorHandler=PROCEDURE) +symbol_vector=(SetWarningHandler=PROCEDURE) +symbol_vector=(ShadeImage=PROCEDURE) +symbol_vector=(SharpenImage=PROCEDURE) +symbol_vector=(ShearImage=PROCEDURE) +symbol_vector=(SignatureImage=PROCEDURE) +symbol_vector=(SolarizeImage=PROCEDURE) +symbol_vector=(SortColormapByIntensity=PROCEDURE) +symbol_vector=(SpreadImage=PROCEDURE) +symbol_vector=(SteganoImage=PROCEDURE) +symbol_vector=(StereoImage=PROCEDURE) +symbol_vector=(StringToList=PROCEDURE) +symbol_vector=(Strip=PROCEDURE) +symbol_vector=(SwirlImage=PROCEDURE) +symbol_vector=(SyncImage=PROCEDURE) +symbol_vector=(SyncImagePixels=PROCEDURE) +symbol_vector=(TellBlob=PROCEDURE) +symbol_vector=(TemporaryFilename=PROCEDURE) +symbol_vector=(TextureImage=PROCEDURE) +symbol_vector=(TransformImage=PROCEDURE) +symbol_vector=(TransformRGBImage=PROCEDURE) +symbol_vector=(TranslateText=PROCEDURE) +symbol_vector=(TransparentImage=PROCEDURE) +symbol_vector=(WriteBlob=PROCEDURE) +symbol_vector=(WriteImage=PROCEDURE) +symbol_vector=(XAnnotateImage=PROCEDURE) +symbol_vector=(XBestFont=PROCEDURE) +symbol_vector=(XBestIconSize=PROCEDURE) +symbol_vector=(XBestPixel=PROCEDURE) +symbol_vector=(XBestVisualInfo=PROCEDURE) +symbol_vector=(XCheckRefreshWindows=PROCEDURE) +symbol_vector=(XClientMessage=PROCEDURE) +symbol_vector=(XColorBrowserWidget=PROCEDURE) +symbol_vector=(XCommandWidget=PROCEDURE) +symbol_vector=(XConfirmWidget=PROCEDURE) +symbol_vector=(XConstrainWindowPosition=PROCEDURE) +symbol_vector=(XDelay=PROCEDURE) +symbol_vector=(XDestroyWindowColors=PROCEDURE) +symbol_vector=(XDialogWidget=PROCEDURE) +symbol_vector=(XDisplayImageInfo=PROCEDURE) +symbol_vector=(XDrawImage=PROCEDURE) +symbol_vector=(XError=PROCEDURE) +symbol_vector=(XFileBrowserWidget=PROCEDURE) +symbol_vector=(XFontBrowserWidget=PROCEDURE) +symbol_vector=(XFreeResources=PROCEDURE) +symbol_vector=(XFreeStandardColormap=PROCEDURE) +symbol_vector=(XGetAnnotateInfo=PROCEDURE) +symbol_vector=(XGetImportInfo=PROCEDURE) +symbol_vector=(XGetMapInfo=PROCEDURE) +symbol_vector=(XGetResourceClass=PROCEDURE) +symbol_vector=(XGetResourceDatabase=PROCEDURE) +symbol_vector=(XGetResourceInfo=PROCEDURE) +symbol_vector=(XGetResourceInstance=PROCEDURE) +symbol_vector=(XGetScreenDensity=PROCEDURE) +symbol_vector=(XGetWindowColor=PROCEDURE) +symbol_vector=(XGetWindowInfo=PROCEDURE) +symbol_vector=(XHighlightEllipse=PROCEDURE) +symbol_vector=(XHighlightLine=PROCEDURE) +symbol_vector=(XHighlightRectangle=PROCEDURE) +symbol_vector=(XImportImage=PROCEDURE) +symbol_vector=(XInfoWidget=PROCEDURE) +symbol_vector=(XListBrowserWidget=PROCEDURE) +symbol_vector=(XMakeCursor=PROCEDURE) +symbol_vector=(XMakeImage=PROCEDURE) +symbol_vector=(XMakeMagnifyImage=PROCEDURE) +symbol_vector=(XMakeStandardColormap=PROCEDURE) +symbol_vector=(XMakeWindow=PROCEDURE) +symbol_vector=(XMenuWidget=PROCEDURE) +symbol_vector=(XNoticeWidget=PROCEDURE) +symbol_vector=(XPreferencesWidget=PROCEDURE) +symbol_vector=(XQueryColorDatabase=PROCEDURE) +symbol_vector=(XQueryPosition=PROCEDURE) +symbol_vector=(XRefreshWindow=PROCEDURE) +symbol_vector=(XRemoteCommand=PROCEDURE) +symbol_vector=(XRetainWindowColors=PROCEDURE) +symbol_vector=(XSetCursorState=PROCEDURE) +symbol_vector=(XTextViewWidget=PROCEDURE) +symbol_vector=(XUserPreferences=PROCEDURE) +symbol_vector=(XWindowByID=PROCEDURE) +symbol_vector=(XWindowByName=PROCEDURE) +symbol_vector=(XWindowByProperty=PROCEDURE) +symbol_vector=(ZoomImage=PROCEDURE) +symbol_vector=(AllocateImageColormap=PROCEDURE) +symbol_vector=(GetIndexes=PROCEDURE) +symbol_vector=(GetNumberColors=PROCEDURE) +symbol_vector=(GetImageException=PROCEDURE) +symbol_vector=(ThrowException=PROCEDURE) +symbol_vector=(GetMagickVersion=PROCEDURE) +symbol_vector=(GetExecutionPath=PROCEDURE) +symbol_vector=(FlattenImages=PROCEDURE) +symbol_vector=(GetImageAttribute=PROCEDURE) +symbol_vector=(ListColorInfo=PROCEDURE) +symbol_vector=(ListMagicInfo=PROCEDURE) +symbol_vector=(DestroyMagick=PROCEDURE) +symbol_vector=(InitializeMagick=PROCEDURE) +symbol_vector=(ListTypeInfo=PROCEDURE) +symbol_vector=(SetImageClipMask=PROCEDURE) +symbol_vector=(SetImageType=PROCEDURE) +symbol_vector=(SetImageOpacity=PROCEDURE) +symbol_vector=(DestroyImageList=PROCEDURE) +symbol_vector=(GetPageGeometry=PROCEDURE) +symbol_vector=(WriteImages=PROCEDURE) +symbol_vector=(PushImageList=PROCEDURE) +symbol_vector=(GetGeometry=PROCEDURE) +symbol_vector=(GetImageGeometry=PROCEDURE) +symbol_vector=(CatchException=PROCEDURE) +symbol_vector=(MagickFatalError=PROCEDURE) +symbol_vector=(DestroyExceptionInfo=PROCEDURE) +symbol_vector=(MontageImageCommand=PROCEDURE) +symbol_vector=(MogrifyImageCommand=PROCEDURE) +symbol_vector=(ConvertImageCommand=PROCEDURE) +symbol_vector=(IdentifyImageCommand=PROCEDURE) +symbol_vector=(CompositeImageCommand=PROCEDURE) +symbol_vector=(GetMagickCopyright=PROCEDURE) +symbol_vector=(SetLogEventMask=PROCEDURE) +symbol_vector=(SetMagickResourceLimit=PROCEDURE) +symbol_vector=(AppendImageToList=PROCEDURE) +symbol_vector=(GetImageTotalInkDensity=PROCEDURE) +symbol_vector=(SetLogFormat=PROCEDURE) +symbol_vector=(ListMagickResourceInfo=PROCEDURE) +symbol_vector=(DisplayImageCommand=PROCEDURE) +symbol_vector=(ImportImageCommand=PROCEDURE) +symbol_vector=(AnimateImageCommand=PROCEDURE) +symbol_vector=(RelinquishMagickMemory=PROCEDURE) +symbol_vector=(CompareImageCommand=PROCEDURE) +symbol_vector=(DestroyString=PROCEDURE) +symbol_vector=(AcquireExceptionInfo=PROCEDURE) +symbol_vector=(MagickCoreGenesis=PROCEDURE) +symbol_vector=(MagickCoreTerminus=PROCEDURE) +symbol_vector=(GetElapsedTime=PROCEDURE) +symbol_vector=(GetTimerInfo=PROCEDURE) +symbol_vector=(GetUserTime=PROCEDURE) +symbol_vector=(AcquireTimerInfo=PROCEDURE) +symbol_vector=(DestroyTimerInfo=PROCEDURE) +symbol_vector=(MagickCommandGenesis=PROCEDURE) +symbol_vector=(GetImageOption=PROCEDURE) +symbol_vector=(IsMagickTrue=PROCEDURE) +sys$share:decw$xlibshr.exe/share diff --git a/ImageMagick-6.9.12-44/Makefile.am b/ImageMagick-6.9.12-44/Makefile.am new file mode 100644 index 0000000..40d473e --- /dev/null +++ b/ImageMagick-6.9.12-44/Makefile.am @@ -0,0 +1,390 @@ +# Copyright © 1999 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright (C) 2003 - 2008 GraphicsMagick Group +# +# Top-Level Makefile for building ImageMagick. +# + +topincludedir = @includedir@/magick + +AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) + +ACLOCAL_AMFLAGS = -I m4 + +MODULECOMMONFLAGS = -no-undefined -export-symbols-regex ".*" -shared -module -avoid-version +MODULECOMMONCPPFLAGS = $(AM_CPPFLAGS) + +# Options to pass when running configure in the distcheck target. +# +# We want to preserve user-provided option variables so the same +# compiler, headers, and libraries are used as for a normal build. +DISTCHECK_CONFIGURE_FLAGS=$(DISTCHECK_CONFIG_FLAGS) + +DISTCLEANFILES = _configs.sed magick/magick-baseconfig.h + +## Make sure these will be cleaned even when they're not built by default. +CLEANFILES = \ + $(WAND_CLEANFILES) \ + $(MAGICKPP_CLEANFILES) \ + $(UTILITIES_CLEANFILES) \ + $(TESTS_CLEANFILES) + +bin_PROGRAMS = \ + $(UTILITIES_PGMS) + +# Binary scripts +bin_SCRIPTS = \ + $(MAGICK_BIN_SCRPTS) \ + $(WAND_BIN_SCRPTS) \ + $(MAGICKPP_SCRPTS) + +include_HEADERS = + +# Headers which are not installed but which are distributed +noinst_HEADERS = \ + $(MAGICK_NOINST_HDRS) + +if WIN32_NATIVE_BUILD +SRCDIR='$(shell @WinPathScript@ $(srcdir)/)' +else +SRCDIR="$(srcdir)/" +endif + +# Tests with .tap extensions use the TAP protocol and TAP driver +LOG_COMPILER = $(SHELL) + +SH_LOG_COMPILER = $(LOG_COMPILER) +TAP_LOG_COMPILER = $(LOG_COMPILER) + +# Test extensions +TEST_EXTENSIONS = .sh .tap + +TAP_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \ + $(top_srcdir)/config/tap-driver.sh + +# Environment parameters to be used during tests +TESTS_ENVIRONMENT = \ + MAKE="$(MAKE)" \ + MAKEFLAGS="$(MAKEFLAGS)" \ + MEMCHECK="$(MEMCHECK)" + +# Tests to run +TESTS = \ + $(TESTS_TESTS) \ + $(MAGICKPP_TESTS) \ + $(WAND_TESTS) \ + $(UTILITIES_TESTS) + +# Tests which are expected to fail +XFAIL_TESTS = \ + $(TESTS_XFAIL_TESTS) \ + $(UTILITIES_XFAIL_TESTS) + +TOP_EXTRA_DIST = \ + AUTHORS.txt \ + ChangeLog.md \ + LICENSE \ + QuickStart.txt \ + NOTICE \ + Install-mac.txt \ + Install-unix.txt \ + Install-vms.txt \ + Install-windows.txt \ + magick.sh.in \ + Magickshr.opt \ + NEWS.txt \ + README.txt \ + index.html \ + winpath.sh + +# Additional files to distribute +EXTRA_DIST = \ + $(TOP_EXTRA_DIST) \ + $(CONFIG_EXTRA_DIST) \ + $(MAGICK_EXTRA_DIST) \ + $(WAND_EXTRA_DIST) \ + $(MAGICKPP_EXTRA_DIST) \ + $(UTILITIES_EXTRA_DIST) \ + $(TESTS_EXTRA_DIST) + +lib_LTLIBRARIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(MAGICKPP_LIBS) +AM_LDFLAGS = +noinst_LTLIBRARIES = +EXTRA_LTLIBRARIES = +BUILT_SOURCES = +MOSTLYCLEANFILES = + +check_PROGRAMS = \ + $(TESTS_CHECK_PGRMS) \ + $(MAGICKPP_CHECK_PGRMS) \ + $(WAND_CHECK_PGRMS) + +include m4/Makefile.am +include config/Makefile.am +include coders/Makefile.am +include magick/Makefile.am +include filters/Makefile.am +include wand/Makefile.am +include Magick++/Makefile.am +include utilities/Makefile.am +include tests/Makefile.am +include PerlMagick/Makefile.am + +# Pkgconfig directory +pkgconfigdir = $(libdir)/pkgconfig + +# Files to install in Pkgconfig directory +pkgconfig_DATA = \ + $(MAGICK_PKGCONFIG) \ + $(WAND_PKGCONFIG) \ + $(MAGICKPP_PKGCONFIG) + +# create a copy for pc file (ideally the non abi should be symlinked) +%-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc: %.pc + cp -f $^ $@ + +# Architecture independent data files installed in the package's data directory +docdir = $(DOCUMENTATION_PATH) + +# Manual pages to install +if INSTALL_DOC +man_MANS = \ + $(MAGICK_MANS) \ + $(WAND_MANS) \ + $(MAGICKPP_MANS) \ + $(UTILITIES_MANS) + +doc_DATA = \ + LICENSE \ + ChangeLog.md \ + NEWS.txt +endif + +if MAINTAINER_MODE +MAINTAINER_TARGETS = \ + magick-version \ + ImageMagick.spec \ + $(PERLMAGICK_MAINTAINER_TARGETS) +endif + +all-local: $(MAGICKPP_LOCAL_TARGETS) $(PERLMAGICK_ALL_LOCAL_TARGETS) $(MAINTAINER_TARGETS) + +install-exec-local: $(PERLMAGICK_INSTALL_EXEC_LOCAL_TARGETS) + +install-data-local: $(PERLMAGICK_INSTALL_DATA_LOCAL_TARGETS) $(HTML_INSTALL_DATA_TARGETS) + +uninstall-local: $(PERLMAGICK_UNINSTALL_LOCAL_TARGETS) $(HTML_UNINSTALL_DATA_TARGETS) + +clean-local: $(PERLMAGICK_CLEAN_LOCAL_TARGETS) + +distclean-local: $(PERLMAGICK_DISTCLEAN_LOCAL_TARGETS) + +maintainer-clean-local: $(PERLMAGICK_MAINTAINER_CLEAN_LOCAL_TARGETS) + +check-local: $(PERLMAGICK_CHECK_LOCAL_TARGETS) + +# drd: valgrind's newer thread error detector +drd: + $(MAKE) MEMCHECK='valgrind --tool=drd --check-stack-var=yes --var-info=yes \ + --quiet $(VALGRIND_EXTRA_OPTS)' check + +# helgrind: valgrind's older thread error detector +helgrind: + $(MAKE) MEMCHECK='valgrind --tool=helgrind --error-exitcode=2 --quiet \ + $(VALGRIND_EXTRA_OPTS)' check + +# memcheck: valgrind's memory access checker +memcheck: + $(MAKE) MEMCHECK='valgrind --tool=memcheck --leak-check=full --read-var-info=yes \ + --error-exitcode=2 --track-origins=yes --num-callers=12 \ + --quiet $(VALGRIND_EXTRA_OPTS)' check + +# ptrcheck: valgrind's experimental pointer checking tool. +ptrcheck: + $(MAKE) MEMCHECK='valgrind --tool=exp-ptrcheck --quiet $(VALGRIND_EXTRA_OPTS)' check + +# Non-Automake subdirectories to distribute +DISTDIRS = images scripts www PerlMagick +dist-hook: + ( \ + builddir=`pwd` ; \ + cd $(srcdir) && \ + ( \ + for dir in $(DISTDIRS) ; do \ + find $$dir -depth -print | egrep -v '(~$$)|(/.git)|(/\.#)|(/\.deps)|(/\.git)' \ + | cpio -pdum $$builddir/$(distdir) 2> /dev/null ; \ + done \ + ) \ + ) + +# +# Additional install rules +# + +# Install HTML files +pkgdocdir = $(DOCUMENTATION_PATH) +DOCDIRSDOXYGEN = www/api/MagickCore www/api/MagickWand +DOCDIRSMANUAL = images images/patterns www www/assets www/api www/source www/Magick++ +DOCDIRS= $(DOCDIRSMANUAL) $(DOCDIRSDOXYGEN) + +if INSTALL_DOC +HTML_INSTALL_DATA_TARGETS = install-data-html +endif + +install-data-html: + $(mkinstalldirs) $(DESTDIR)$(pkgdocdir) + $(INSTALL_DATA) $(srcdir)/index.html $(DESTDIR)$(pkgdocdir) + for dir in $(DOCDIRS) ; do \ + $(mkinstalldirs) $(DESTDIR)$(pkgdocdir)/$$dir && \ + if test -d $(builddir)/$$dir ; then \ + docsrcdir=$(builddir)/$$dir; \ + else \ + docsrcdir=$(srcdir)/$$dir; \ + fi; \ + if test -d $$docsrcdir; then \ + for file in $$docsrcdir/*.* ; do \ + echo "$(INSTALL_DATA) $$file $(DESTDIR)$(pkgdocdir)/$$dir" ; \ + $(INSTALL_DATA) "$$file" $(DESTDIR)$(pkgdocdir)/$$dir ; \ + done ; \ + fi; \ + done + +# Uninstall HTML files +HTML_UNINSTALL_DATA_TARGETS = uninstall-data-html +uninstall-data-html: + rm -f $(DESTDIR)$(pkgdocdir)/index.html + for dir in $(DOCDIRS) ; do \ + rm -f -r $(DESTDIR)$(pkgdocdir)/$$dir ; \ + done + +# Ensure that version.h at $(srcdir)/magick/version.h is kept up to date. +magick-version: magick/version.h + @if test -f "$(srcdir)/VisualMagick/installer/inc/version.isx.in" ; then \ + ./config.status --file="$(srcdir)/../VisualMagick/installer/inc/version.isx" 2> /dev/null ; \ + fi + @if test -n "$(VPATH)" ; then \ + cmp magick/version.h $(srcdir)/magick/version.h > /dev/null ; \ + if test $$? -eq 1 ; then \ + echo "Updating $(srcdir)/magick/version.h ..."; \ + cp magick/version.h $(srcdir)/magick/version.h ; \ + fi ; \ + fi ; \ + touch magick-version + +magick/version.h: $(top_srcdir)/ChangeLog.md $(top_srcdir)/m4/version.m4 + +# Automagically reconfigure libtool +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +libtool: $(LIBTOOL_DEPS) + $(SHELL) ./config.status --recheck + +# Format C API documentation +html-local: +# copy static file + for dir in $(DOCDIRSMANUAL) ; do \ + $(mkinstalldirs) $(top_builddir)/$$dir ;\ + for file in $$dir/*.* ; do \ + if ! test -f $(top_builddir)/$$file; then \ + cp -p -f $(top_srcdir)/$$file $(top_builddir)/$$dir ; \ + fi; \ + done ; \ + done; +# remove old doxygen files + for dir in $(DOCDIRDOXYGEN) ; do \ + rm -rf $$dir || true; \ + done; +# make doxygen doc + $(mkinstalldirs) $(top_builddir)/www/api + cd config && doxygen MagickCore.dox + cd config && doxygen MagickWand.dox + cd config && doxygen Magick++.dox + +# +# Build Windows source Zip and 7Zip balls +# +if ZIP_DELEGATE +DIST_WINDOWS_SRC_ZIP=$(PACKAGE_NAME)-$(PACKAGE_VERSION)-windows.zip +else +DIST_WINDOWS_SRC_ZIP= +endif +if P7ZIP_DELEGATE +DIST_WINDOWS_SRC_7ZIP=$(PACKAGE_NAME)-$(PACKAGE_VERSION)-windows.7z +else +DIST_WINDOWS_SRC_7ZIP= +endif +$(DIST_WINDOWS_SRC_ZIP) $(DIST_WINDOWS_SRC_7ZIP) windows-dist: + if test -d $(PACKAGE_NAME)-$(PACKAGE_VERSION) ; then \ + chmod -R u+w $(PACKAGE_NAME)-$(PACKAGE_VERSION) ; \ + rm -rf $(PACKAGE_NAME)-$(PACKAGE_VERSION) ; \ + fi + git clone -b main https://github.com/ImageMagick/ImageMagick6.git $(PACKAGE_NAME)-$(PACKAGE_VERSION) +if ZIP_DELEGATE + rm -f $(DIST_WINDOWS_SRC_ZIP) + $(ZIP) -r -9 -q $(DIST_WINDOWS_SRC_ZIP) $(PACKAGE_NAME)-$(PACKAGE_VERSION) +endif # ZIP_DELEGATE +if P7ZIP_DELEGATE + rm -f $(DIST_WINDOWS_SRC_7ZIP) + $(P7ZIP) a -t7z -mx=9 $(DIST_WINDOWS_SRC_7ZIP) $(PACKAGE_NAME)-$(PACKAGE_VERSION) + chmod 644 $(DIST_WINDOWS_SRC_7ZIP) +endif # P7ZIP_DELEGATE + rm -rf $(PACKAGE_NAME)-$(PACKAGE_VERSION) + +# +# RPM build support +# +if RPM_DELEGATE + +DIST_ARCHIVE_SRPM=$(distdir).src.rpm +.PHONY: srpm +$(DIST_ARCHIVE_SRPM) srpm: dist-bzip2 + rm -f $(DIST_ARCHIVE_SRPM) + $(RPM) --define="_sourcedir `pwd`" --define="_srcrpmdir `pwd`" --nodeps --bs ImageMagick.spec + @echo ============================================================== + @echo $(DIST_ARCHIVE_SRPM) is ready for distribution. + @echo ============================================================== + +RPMDIR=rpmbuild +RPMARCH=$(MAGICK_TARGET_CPU) + +DIST_ARCHIVE_RPM= \ + $(RPMDIR)/$(RPMARCH)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)-$(PACKAGE_PATCHLEVEL_VERSION).$(RPMARCH).rpm \ + $(RPMDIR)/$(RPMARCH)/$(PACKAGE_NAME)-c++-$(PACKAGE_VERSION)-$(PACKAGE_PATCHLEVEL_VERSION).$(RPMARCH).rpm \ + $(RPMDIR)/$(RPMARCH)/$(PACKAGE_NAME)-c++-devel-$(PACKAGE_VERSION)-$(PACKAGE_PATCHLEVEL_VERSION).$(RPMARCH).rpm \ + $(RPMDIR)/$(RPMARCH)/$(PACKAGE_NAME)-devel-$(PACKAGE_VERSION)-$(PACKAGE_PATCHLEVEL_VERSION).$(RPMARCH).rpm \ + $(RPMDIR)/$(RPMARCH)/$(PACKAGE_NAME)-perl-$(PACKAGE_VERSION)-$(PACKAGE_PATCHLEVEL_VERSION).$(RPMARCH).rpm + +.PHONY: rpm +rpm: dist + rm -rf $(RPMDIR) + $(mkinstalldirs) $(RPMDIR) + $(mkinstalldirs) $(RPMDIR)/BUILD + $(mkinstalldirs) $(RPMDIR)/RPMS + $(RPM) --define="_sourcedir `pwd`" --define="_rpmdir `pwd`/$(RPMDIR)/RPMS" --define="_builddir `pwd`/$(RPMDIR)/BUILD" --nodeps -bb ImageMagick.spec + @echo ============================================================== + @echo $(DIST_ARCHIVE_RPM) is ready for distribution. + @echo ============================================================== + +else +DIST_ARCHIVE_RPM= +endif # RPM_DELEGATE + +# +# Build a validated snapshot release and move to the snapshots directory. +# +snapshot: distcheck + $(MAKE) $(DIST_ARCHIVE_SRPM) + $(MAKE) $(DIST_WINDOWS_SRC_ZIP) + $(MAKE) $(DIST_WINDOWS_SRC_7ZIP) + mv $(DIST_ARCHIVES) $(DIST_WINDOWS_SRC_ZIP) $(DIST_WINDOWS_SRC_7ZIP) $(DIST_ARCHIVE_SRPM) /var/ftp/pub/ImageMagick/beta/ diff --git a/ImageMagick-6.9.12-44/Makefile.in b/ImageMagick-6.9.12-44/Makefile.in new file mode 100644 index 0000000..dc2ad14 --- /dev/null +++ b/ImageMagick-6.9.12-44/Makefile.in @@ -0,0 +1,13040 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Copyright © 1999 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright (C) 2003 - 2008 GraphicsMagick Group +# +# Top-Level Makefile for building ImageMagick. +# + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building ImageMagick m4 macros. + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for Magick ImageMagick configuration files. + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building ImageMagick Coder library. + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# http://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building the MagickCore API. +# + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building ImageMagick filter modules. + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# http://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building MagickWand API. +# + +# +# Top Makefile for Magick++ +# +# Copyright Bob Friesenhahn, 1999, 2000, 2002, 2004, 2008 +# + +# AM_CPPFLAGS += -I$(top_srcdir)/Magick++/lib + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# http://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building ImageMagick utilities. + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright (C) 2003 - 2008 GraphicsMagick Group +# +# Makefile for building PerlMagick. + +# If source files missing, see if they can be obtained via VPATH + + + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +bin_PROGRAMS = $(am__EXEEXT_1) +TESTS = $(TESTS_TESTS) $(am__EXEEXT_5) +XFAIL_TESTS = $(am__EXEEXT_6) $(am__EXEEXT_6) +check_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_4) +@MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE@am__append_1 = magick/threshold-map.h +@MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE@am__append_2 = magick/threshold-map.h +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_func_fseeko.m4 \ + $(top_srcdir)/m4/ax_c___attribute__.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_framework.m4 \ + $(top_srcdir)/m4/ax_compare_version.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_cxx_bool.m4 \ + $(top_srcdir)/m4/ax_cxx_namespace_std.m4 \ + $(top_srcdir)/m4/ax_cxx_namespaces.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/ax_have_opencl.m4 \ + $(top_srcdir)/m4/ax_prefix_config_h.m4 \ + $(top_srcdir)/m4/ax_prepend_flag.m4 \ + $(top_srcdir)/m4/ax_prog_perl_version.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/cxx_have_std_libs.m4 \ + $(top_srcdir)/m4/framework.m4 \ + $(top_srcdir)/m4/ld-version-script.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ + $(top_srcdir)/m4/version.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(include_HEADERS) $(magickinc_HEADERS) \ + $(magickincarch_HEADERS) $(am__magickppinc_HEADERS_DIST) \ + $(am__magickpptopinc_HEADERS_DIST) $(noinst_HEADERS) \ + $(wandinc_HEADERS) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config/config.h +CONFIG_CLEAN_FILES = common.shi config/configure.xml \ + config/delegates.xml config/ImageMagick.rdf \ + config/MagickCore.dox config/MagickWand.dox \ + config/Magick++.dox config/type-apple.xml \ + config/type-dejavu.xml config/type-ghostscript.xml \ + config/type-urw-base35.xml config/type-windows.xml \ + config/type.xml ImageMagick.spec Magick++/bin/Magick++-config \ + magick/ImageMagick.pc Magick++/lib/ImageMagick++.pc \ + Magick++/lib/Magick++.pc magick/Magick-config \ + magick/MagickCore-config magick/MagickCore.pc magick/version.h \ + magick.sh PerlMagick/check.sh PerlMagick/default/Magick.pm \ + PerlMagick/Makefile.PL PerlMagick/default/Makefile.PL \ + PerlMagick/quantum/Makefile.PL PerlMagick/quantum/quantum.pm \ + PerlMagick/quantum/quantum.xs PerlMagick/quantum/typemap \ + utilities/animate.1 utilities/compare.1 utilities/composite.1 \ + utilities/conjure.1 utilities/convert.1 utilities/display.1 \ + utilities/identify.1 utilities/ImageMagick.1 \ + utilities/import.1 utilities/mogrify.1 utilities/montage.1 \ + utilities/stream.1 wand/MagickWand-config wand/MagickWand.pc \ + wand/Wand-config wand/Wand.pc +CONFIG_CLEAN_VPATH_FILES = +am__EXEEXT_1 = utilities/animate$(EXEEXT) utilities/compare$(EXEEXT) \ + utilities/composite$(EXEEXT) utilities/conjure$(EXEEXT) \ + utilities/convert$(EXEEXT) utilities/display$(EXEEXT) \ + utilities/identify$(EXEEXT) utilities/import$(EXEEXT) \ + utilities/mogrify$(EXEEXT) utilities/montage$(EXEEXT) \ + utilities/stream$(EXEEXT) +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(codersdir)" \ + "$(DESTDIR)$(filtersdir)" "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ + "$(DESTDIR)$(configlibdir)" "$(DESTDIR)$(configsharedir)" \ + "$(DESTDIR)$(configsharearchdir)" "$(DESTDIR)$(docdir)" \ + "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" \ + "$(DESTDIR)$(magickincdir)" "$(DESTDIR)$(magickincarchdir)" \ + "$(DESTDIR)$(magickppincdir)" "$(DESTDIR)$(magickpptopincdir)" \ + "$(DESTDIR)$(wandincdir)" +am__EXEEXT_2 = tests/validate$(EXEEXT) tests/drawtest$(EXEEXT) \ + tests/wandtest$(EXEEXT) +am__EXEEXT_3 = Magick++/demo/analyze$(EXEEXT) \ + Magick++/demo/button$(EXEEXT) Magick++/demo/demo$(EXEEXT) \ + Magick++/demo/detrans$(EXEEXT) Magick++/demo/flip$(EXEEXT) \ + Magick++/demo/gravity$(EXEEXT) Magick++/demo/piddle$(EXEEXT) \ + Magick++/demo/shapes$(EXEEXT) Magick++/demo/zoom$(EXEEXT) \ + Magick++/tests/appendImages$(EXEEXT) \ + Magick++/tests/attributes$(EXEEXT) \ + Magick++/tests/averageImages$(EXEEXT) \ + Magick++/tests/coalesceImages$(EXEEXT) \ + Magick++/tests/coderInfo$(EXEEXT) \ + Magick++/tests/color$(EXEEXT) \ + Magick++/tests/colorHistogram$(EXEEXT) \ + Magick++/tests/exceptions$(EXEEXT) \ + Magick++/tests/montageImages$(EXEEXT) \ + Magick++/tests/morphImages$(EXEEXT) \ + Magick++/tests/readWriteBlob$(EXEEXT) \ + Magick++/tests/readWriteImages$(EXEEXT) +@WITH_MAGICK_PLUS_PLUS_TRUE@am__EXEEXT_4 = $(am__EXEEXT_3) +PROGRAMS = $(bin_PROGRAMS) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +LTLIBRARIES = $(coders_LTLIBRARIES) $(filters_LTLIBRARIES) \ + $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_DEPENDENCIES = \ + $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +am__dirstamp = $(am__leading_dot)dirstamp +am_Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS = Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.lo \ + Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.lo +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS = $(am_Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LINK = \ + $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) \ + $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@WITH_MAGICK_PLUS_PLUS_TRUE@am_Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_rpath = \ +@WITH_MAGICK_PLUS_PLUS_TRUE@ -rpath $(libdir) +coders_aai_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_aai_la_OBJECTS = coders/aai_la-aai.lo +coders_aai_la_OBJECTS = $(am_coders_aai_la_OBJECTS) +coders_aai_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_aai_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_aai_la_rpath = -rpath $(codersdir) +coders_art_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_art_la_OBJECTS = coders/art_la-art.lo +coders_art_la_OBJECTS = $(am_coders_art_la_OBJECTS) +coders_art_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_art_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_art_la_rpath = -rpath $(codersdir) +coders_avs_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_avs_la_OBJECTS = coders/avs_la-avs.lo +coders_avs_la_OBJECTS = $(am_coders_avs_la_OBJECTS) +coders_avs_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_avs_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_avs_la_rpath = -rpath $(codersdir) +coders_bgr_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_bgr_la_OBJECTS = coders/bgr_la-bgr.lo +coders_bgr_la_OBJECTS = $(am_coders_bgr_la_OBJECTS) +coders_bgr_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_bgr_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_bgr_la_rpath = -rpath $(codersdir) +coders_bmp_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_bmp_la_OBJECTS = coders/bmp_la-bmp.lo +coders_bmp_la_OBJECTS = $(am_coders_bmp_la_OBJECTS) +coders_bmp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_bmp_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_bmp_la_rpath = -rpath $(codersdir) +coders_braille_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_braille_la_OBJECTS = coders/braille_la-braille.lo +coders_braille_la_OBJECTS = $(am_coders_braille_la_OBJECTS) +coders_braille_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_braille_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_braille_la_rpath = -rpath $(codersdir) +am__DEPENDENCIES_1 = +coders_cals_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_cals_la_OBJECTS = coders/cals_la-cals.lo +coders_cals_la_OBJECTS = $(am_coders_cals_la_OBJECTS) +coders_cals_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_cals_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_cals_la_rpath = -rpath $(codersdir) +coders_caption_la_DEPENDENCIES = $(MAGICKCORE_LIBS) \ + $(am__DEPENDENCIES_1) +am_coders_caption_la_OBJECTS = coders/caption_la-caption.lo +coders_caption_la_OBJECTS = $(am_coders_caption_la_OBJECTS) +coders_caption_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_caption_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_caption_la_rpath = -rpath $(codersdir) +coders_cin_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_cin_la_OBJECTS = coders/cin_la-cin.lo +coders_cin_la_OBJECTS = $(am_coders_cin_la_OBJECTS) +coders_cin_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_cin_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_cin_la_rpath = -rpath $(codersdir) +coders_cip_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_cip_la_OBJECTS = coders/cip_la-cip.lo +coders_cip_la_OBJECTS = $(am_coders_cip_la_OBJECTS) +coders_cip_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_cip_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_cip_la_rpath = -rpath $(codersdir) +coders_clip_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_clip_la_OBJECTS = coders/clip_la-clip.lo +coders_clip_la_OBJECTS = $(am_coders_clip_la_OBJECTS) +coders_clip_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_clip_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_clip_la_rpath = -rpath $(codersdir) +coders_clipboard_la_DEPENDENCIES = $(MAGICKCORE_LIBS) \ + $(am__DEPENDENCIES_1) +am_coders_clipboard_la_OBJECTS = coders/clipboard_la-clipboard.lo +coders_clipboard_la_OBJECTS = $(am_coders_clipboard_la_OBJECTS) +coders_clipboard_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_clipboard_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@WINGDI32_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_clipboard_la_rpath = \ +@WINGDI32_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_cmyk_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_cmyk_la_OBJECTS = coders/cmyk_la-cmyk.lo +coders_cmyk_la_OBJECTS = $(am_coders_cmyk_la_OBJECTS) +coders_cmyk_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_cmyk_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_cmyk_la_rpath = -rpath $(codersdir) +coders_cut_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_cut_la_OBJECTS = coders/cut_la-cut.lo +coders_cut_la_OBJECTS = $(am_coders_cut_la_OBJECTS) +coders_cut_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_cut_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_cut_la_rpath = -rpath $(codersdir) +coders_dcm_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_dcm_la_OBJECTS = coders/dcm_la-dcm.lo +coders_dcm_la_OBJECTS = $(am_coders_dcm_la_OBJECTS) +coders_dcm_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_dcm_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_dcm_la_rpath = -rpath $(codersdir) +coders_dds_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_dds_la_OBJECTS = coders/dds_la-dds.lo +coders_dds_la_OBJECTS = $(am_coders_dds_la_OBJECTS) +coders_dds_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_dds_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_dds_la_rpath = -rpath $(codersdir) +coders_debug_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_debug_la_OBJECTS = coders/debug_la-debug.lo +coders_debug_la_OBJECTS = $(am_coders_debug_la_OBJECTS) +coders_debug_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_debug_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_debug_la_rpath = -rpath $(codersdir) +coders_dib_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_dib_la_OBJECTS = coders/dib_la-dib.lo +coders_dib_la_OBJECTS = $(am_coders_dib_la_OBJECTS) +coders_dib_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_dib_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_dib_la_rpath = -rpath $(codersdir) +coders_djvu_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_coders_djvu_la_OBJECTS = coders/djvu_la-djvu.lo +coders_djvu_la_OBJECTS = $(am_coders_djvu_la_OBJECTS) +coders_djvu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_djvu_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@DJVU_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_djvu_la_rpath = \ +@DJVU_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_dng_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_dng_la_OBJECTS = coders/dng_la-dng.lo +coders_dng_la_OBJECTS = $(am_coders_dng_la_OBJECTS) +coders_dng_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_dng_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_dng_la_rpath = -rpath $(codersdir) +coders_dot_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_dot_la_OBJECTS = coders/dot_la-dot.lo +coders_dot_la_OBJECTS = $(am_coders_dot_la_OBJECTS) +coders_dot_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_dot_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_dot_la_rpath = -rpath $(codersdir) +coders_dps_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_coders_dps_la_OBJECTS = coders/dps_la-dps.lo +coders_dps_la_OBJECTS = $(am_coders_dps_la_OBJECTS) +coders_dps_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_dps_la_LDFLAGS) $(LDFLAGS) -o $@ +@DPS_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_dps_la_rpath = -rpath \ +@DPS_DELEGATE_TRUE@@WITH_MODULES_TRUE@ $(codersdir) +coders_dpx_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_dpx_la_OBJECTS = coders/dpx_la-dpx.lo +coders_dpx_la_OBJECTS = $(am_coders_dpx_la_OBJECTS) +coders_dpx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_dpx_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_dpx_la_rpath = -rpath $(codersdir) +coders_emf_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_emf_la_OBJECTS = coders/emf_la-emf.lo +coders_emf_la_OBJECTS = $(am_coders_emf_la_OBJECTS) +coders_emf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_emf_la_LDFLAGS) $(LDFLAGS) -o $@ +@WINGDI32_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_emf_la_rpath = \ +@WINGDI32_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_ept_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_ept_la_OBJECTS = coders/ept_la-ept.lo +coders_ept_la_OBJECTS = $(am_coders_ept_la_OBJECTS) +coders_ept_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_ept_la_LDFLAGS) $(LDFLAGS) -o $@ +@TIFF_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_ept_la_rpath = \ +@TIFF_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_exr_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_exr_la_OBJECTS = coders/exr_la-exr.lo +coders_exr_la_OBJECTS = $(am_coders_exr_la_OBJECTS) +coders_exr_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_exr_la_LDFLAGS) $(LDFLAGS) -o $@ +@OPENEXR_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_exr_la_rpath = \ +@OPENEXR_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_fax_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_fax_la_OBJECTS = coders/fax_la-fax.lo +coders_fax_la_OBJECTS = $(am_coders_fax_la_OBJECTS) +coders_fax_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_fax_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_fax_la_rpath = -rpath $(codersdir) +coders_fits_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_fits_la_OBJECTS = coders/fits_la-fits.lo +coders_fits_la_OBJECTS = $(am_coders_fits_la_OBJECTS) +coders_fits_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_fits_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_fits_la_rpath = -rpath $(codersdir) +coders_flif_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_flif_la_OBJECTS = coders/flif_la-flif.lo +coders_flif_la_OBJECTS = $(am_coders_flif_la_OBJECTS) +coders_flif_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_flif_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@FLIF_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_flif_la_rpath = \ +@FLIF_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_fpx_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_fpx_la_OBJECTS = coders/fpx_la-fpx.lo +coders_fpx_la_OBJECTS = $(am_coders_fpx_la_OBJECTS) +coders_fpx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_fpx_la_LDFLAGS) $(LDFLAGS) -o $@ +@FPX_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_fpx_la_rpath = -rpath \ +@FPX_DELEGATE_TRUE@@WITH_MODULES_TRUE@ $(codersdir) +coders_gif_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_gif_la_OBJECTS = coders/gif_la-gif.lo +coders_gif_la_OBJECTS = $(am_coders_gif_la_OBJECTS) +coders_gif_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_gif_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_gif_la_rpath = -rpath $(codersdir) +coders_gradient_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_gradient_la_OBJECTS = coders/gradient_la-gradient.lo +coders_gradient_la_OBJECTS = $(am_coders_gradient_la_OBJECTS) +coders_gradient_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_gradient_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_gradient_la_rpath = -rpath $(codersdir) +coders_gray_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_gray_la_OBJECTS = coders/gray_la-gray.lo +coders_gray_la_OBJECTS = $(am_coders_gray_la_OBJECTS) +coders_gray_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_gray_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_gray_la_rpath = -rpath $(codersdir) +coders_hald_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_hald_la_OBJECTS = coders/hald_la-hald.lo +coders_hald_la_OBJECTS = $(am_coders_hald_la_OBJECTS) +coders_hald_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_hald_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_hald_la_rpath = -rpath $(codersdir) +coders_hdr_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_hdr_la_OBJECTS = coders/hdr_la-hdr.lo +coders_hdr_la_OBJECTS = $(am_coders_hdr_la_OBJECTS) +coders_hdr_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_hdr_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_hdr_la_rpath = -rpath $(codersdir) +coders_heic_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_heic_la_OBJECTS = coders/heic_la-heic.lo +coders_heic_la_OBJECTS = $(am_coders_heic_la_OBJECTS) +coders_heic_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_heic_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@HEIC_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_heic_la_rpath = \ +@HEIC_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_histogram_la_DEPENDENCIES = $(MAGICKCORE_LIBS) \ + $(am__DEPENDENCIES_1) +am_coders_histogram_la_OBJECTS = coders/histogram_la-histogram.lo +coders_histogram_la_OBJECTS = $(am_coders_histogram_la_OBJECTS) +coders_histogram_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_histogram_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_histogram_la_rpath = -rpath $(codersdir) +coders_hrz_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_hrz_la_OBJECTS = coders/hrz_la-hrz.lo +coders_hrz_la_OBJECTS = $(am_coders_hrz_la_OBJECTS) +coders_hrz_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_hrz_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_hrz_la_rpath = -rpath $(codersdir) +coders_html_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_html_la_OBJECTS = coders/html_la-html.lo +coders_html_la_OBJECTS = $(am_coders_html_la_OBJECTS) +coders_html_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_html_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_html_la_rpath = -rpath $(codersdir) +coders_icon_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_icon_la_OBJECTS = coders/icon_la-icon.lo +coders_icon_la_OBJECTS = $(am_coders_icon_la_OBJECTS) +coders_icon_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_icon_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_icon_la_rpath = -rpath $(codersdir) +coders_info_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_info_la_OBJECTS = coders/info_la-info.lo +coders_info_la_OBJECTS = $(am_coders_info_la_OBJECTS) +coders_info_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_info_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_info_la_rpath = -rpath $(codersdir) +coders_inline_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_inline_la_OBJECTS = coders/inline_la-inline.lo +coders_inline_la_OBJECTS = $(am_coders_inline_la_OBJECTS) +coders_inline_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_inline_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_inline_la_rpath = -rpath $(codersdir) +coders_ipl_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_ipl_la_OBJECTS = coders/ipl_la-ipl.lo +coders_ipl_la_OBJECTS = $(am_coders_ipl_la_OBJECTS) +coders_ipl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_ipl_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_ipl_la_rpath = -rpath $(codersdir) +coders_jbig_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_jbig_la_OBJECTS = coders/jbig_la-jbig.lo +coders_jbig_la_OBJECTS = $(am_coders_jbig_la_OBJECTS) +coders_jbig_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_jbig_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@JBIG_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_jbig_la_rpath = \ +@JBIG_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_jnx_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_jnx_la_OBJECTS = coders/jnx_la-jnx.lo +coders_jnx_la_OBJECTS = $(am_coders_jnx_la_OBJECTS) +coders_jnx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_jnx_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_jnx_la_rpath = -rpath $(codersdir) +coders_jp2_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_jp2_la_OBJECTS = coders/jp2_la-jp2.lo +coders_jp2_la_OBJECTS = $(am_coders_jp2_la_OBJECTS) +coders_jp2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_jp2_la_LDFLAGS) $(LDFLAGS) -o $@ +@LIBOPENJP2_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_jp2_la_rpath = \ +@LIBOPENJP2_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath \ +@LIBOPENJP2_DELEGATE_TRUE@@WITH_MODULES_TRUE@ $(codersdir) +coders_jpeg_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_jpeg_la_OBJECTS = coders/jpeg_la-jpeg.lo +coders_jpeg_la_OBJECTS = $(am_coders_jpeg_la_OBJECTS) +coders_jpeg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_jpeg_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@JPEG_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_jpeg_la_rpath = \ +@JPEG_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_json_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_json_la_OBJECTS = coders/json_la-json.lo +coders_json_la_OBJECTS = $(am_coders_json_la_OBJECTS) +coders_json_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_json_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_json_la_rpath = -rpath $(codersdir) +coders_label_la_DEPENDENCIES = $(MAGICKCORE_LIBS) \ + $(am__DEPENDENCIES_1) +am_coders_label_la_OBJECTS = coders/label_la-label.lo +coders_label_la_OBJECTS = $(am_coders_label_la_OBJECTS) +coders_label_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_label_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_label_la_rpath = -rpath $(codersdir) +coders_mac_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_mac_la_OBJECTS = coders/mac_la-mac.lo +coders_mac_la_OBJECTS = $(am_coders_mac_la_OBJECTS) +coders_mac_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_mac_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_mac_la_rpath = -rpath $(codersdir) +coders_magick_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_magick_la_OBJECTS = coders/magick_la-magick.lo +coders_magick_la_OBJECTS = $(am_coders_magick_la_OBJECTS) +coders_magick_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_magick_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_magick_la_rpath = -rpath $(codersdir) +coders_map_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_map_la_OBJECTS = coders/map_la-map.lo +coders_map_la_OBJECTS = $(am_coders_map_la_OBJECTS) +coders_map_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_map_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_map_la_rpath = -rpath $(codersdir) +coders_mask_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_mask_la_OBJECTS = coders/mask_la-mask.lo +coders_mask_la_OBJECTS = $(am_coders_mask_la_OBJECTS) +coders_mask_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_mask_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_mask_la_rpath = -rpath $(codersdir) +coders_mat_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_coders_mat_la_OBJECTS = coders/mat_la-mat.lo +coders_mat_la_OBJECTS = $(am_coders_mat_la_OBJECTS) +coders_mat_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_mat_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_mat_la_rpath = -rpath $(codersdir) +coders_matte_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_matte_la_OBJECTS = coders/matte_la-matte.lo +coders_matte_la_OBJECTS = $(am_coders_matte_la_OBJECTS) +coders_matte_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_matte_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_matte_la_rpath = -rpath $(codersdir) +coders_meta_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_meta_la_OBJECTS = coders/meta_la-meta.lo +coders_meta_la_OBJECTS = $(am_coders_meta_la_OBJECTS) +coders_meta_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_meta_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_meta_la_rpath = -rpath $(codersdir) +coders_miff_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_coders_miff_la_OBJECTS = coders/miff_la-miff.lo +coders_miff_la_OBJECTS = $(am_coders_miff_la_OBJECTS) +coders_miff_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_miff_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_miff_la_rpath = -rpath $(codersdir) +coders_mono_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_mono_la_OBJECTS = coders/mono_la-mono.lo +coders_mono_la_OBJECTS = $(am_coders_mono_la_OBJECTS) +coders_mono_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_mono_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_mono_la_rpath = -rpath $(codersdir) +coders_mpc_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_mpc_la_OBJECTS = coders/mpc_la-mpc.lo +coders_mpc_la_OBJECTS = $(am_coders_mpc_la_OBJECTS) +coders_mpc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_mpc_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_mpc_la_rpath = -rpath $(codersdir) +coders_mpr_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_mpr_la_OBJECTS = coders/mpr_la-mpr.lo +coders_mpr_la_OBJECTS = $(am_coders_mpr_la_OBJECTS) +coders_mpr_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_mpr_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_mpr_la_rpath = -rpath $(codersdir) +coders_msl_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_msl_la_OBJECTS = coders/msl_la-msl.lo +coders_msl_la_OBJECTS = $(am_coders_msl_la_OBJECTS) +coders_msl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_msl_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_msl_la_rpath = -rpath $(codersdir) +coders_mtv_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_mtv_la_OBJECTS = coders/mtv_la-mtv.lo +coders_mtv_la_OBJECTS = $(am_coders_mtv_la_OBJECTS) +coders_mtv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_mtv_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_mtv_la_rpath = -rpath $(codersdir) +coders_mvg_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_mvg_la_OBJECTS = coders/mvg_la-mvg.lo +coders_mvg_la_OBJECTS = $(am_coders_mvg_la_OBJECTS) +coders_mvg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_mvg_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_mvg_la_rpath = -rpath $(codersdir) +coders_null_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_null_la_OBJECTS = coders/null_la-null.lo +coders_null_la_OBJECTS = $(am_coders_null_la_OBJECTS) +coders_null_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_null_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_null_la_rpath = -rpath $(codersdir) +coders_otb_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_otb_la_OBJECTS = coders/otb_la-otb.lo +coders_otb_la_OBJECTS = $(am_coders_otb_la_OBJECTS) +coders_otb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_otb_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_otb_la_rpath = -rpath $(codersdir) +coders_palm_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_palm_la_OBJECTS = coders/palm_la-palm.lo +coders_palm_la_OBJECTS = $(am_coders_palm_la_OBJECTS) +coders_palm_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_palm_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_palm_la_rpath = -rpath $(codersdir) +coders_pango_la_DEPENDENCIES = $(MAGICKCORE_LIBS) \ + $(am__DEPENDENCIES_1) +am_coders_pango_la_OBJECTS = coders/pango_la-pango.lo +coders_pango_la_OBJECTS = $(am_coders_pango_la_OBJECTS) +coders_pango_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_pango_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_pango_la_rpath = -rpath $(codersdir) +coders_pattern_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_pattern_la_OBJECTS = coders/pattern_la-pattern.lo +coders_pattern_la_OBJECTS = $(am_coders_pattern_la_OBJECTS) +coders_pattern_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_pattern_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_pattern_la_rpath = -rpath $(codersdir) +coders_pcd_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_pcd_la_OBJECTS = coders/pcd_la-pcd.lo +coders_pcd_la_OBJECTS = $(am_coders_pcd_la_OBJECTS) +coders_pcd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_pcd_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_pcd_la_rpath = -rpath $(codersdir) +coders_pcl_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_pcl_la_OBJECTS = coders/pcl_la-pcl.lo +coders_pcl_la_OBJECTS = $(am_coders_pcl_la_OBJECTS) +coders_pcl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_pcl_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_pcl_la_rpath = -rpath $(codersdir) +coders_pcx_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_pcx_la_OBJECTS = coders/pcx_la-pcx.lo +coders_pcx_la_OBJECTS = $(am_coders_pcx_la_OBJECTS) +coders_pcx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_pcx_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_pcx_la_rpath = -rpath $(codersdir) +coders_pdb_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_pdb_la_OBJECTS = coders/pdb_la-pdb.lo +coders_pdb_la_OBJECTS = $(am_coders_pdb_la_OBJECTS) +coders_pdb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_pdb_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_pdb_la_rpath = -rpath $(codersdir) +coders_pdf_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_pdf_la_OBJECTS = coders/pdf_la-pdf.lo +coders_pdf_la_OBJECTS = $(am_coders_pdf_la_OBJECTS) +coders_pdf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_pdf_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_pdf_la_rpath = -rpath $(codersdir) +coders_pes_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_pes_la_OBJECTS = coders/pes_la-pes.lo +coders_pes_la_OBJECTS = $(am_coders_pes_la_OBJECTS) +coders_pes_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_pes_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_pes_la_rpath = -rpath $(codersdir) +coders_pgx_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_pgx_la_OBJECTS = coders/pgx_la-pgx.lo +coders_pgx_la_OBJECTS = $(am_coders_pgx_la_OBJECTS) +coders_pgx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_pgx_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_pgx_la_rpath = -rpath $(codersdir) +coders_pict_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_pict_la_OBJECTS = coders/pict_la-pict.lo +coders_pict_la_OBJECTS = $(am_coders_pict_la_OBJECTS) +coders_pict_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_pict_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_pict_la_rpath = -rpath $(codersdir) +coders_pix_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_pix_la_OBJECTS = coders/pix_la-pix.lo +coders_pix_la_OBJECTS = $(am_coders_pix_la_OBJECTS) +coders_pix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_pix_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_pix_la_rpath = -rpath $(codersdir) +coders_plasma_la_DEPENDENCIES = $(MAGICKCORE_LIBS) \ + $(am__DEPENDENCIES_1) +am_coders_plasma_la_OBJECTS = coders/plasma_la-plasma.lo +coders_plasma_la_OBJECTS = $(am_coders_plasma_la_OBJECTS) +coders_plasma_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_plasma_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_plasma_la_rpath = -rpath $(codersdir) +coders_png_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_coders_png_la_OBJECTS = coders/png_la-png.lo +coders_png_la_OBJECTS = $(am_coders_png_la_OBJECTS) +coders_png_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_png_la_LDFLAGS) $(LDFLAGS) -o $@ +@PNG_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_png_la_rpath = -rpath \ +@PNG_DELEGATE_TRUE@@WITH_MODULES_TRUE@ $(codersdir) +coders_pnm_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_pnm_la_OBJECTS = coders/pnm_la-pnm.lo +coders_pnm_la_OBJECTS = $(am_coders_pnm_la_OBJECTS) +coders_pnm_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_pnm_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_pnm_la_rpath = -rpath $(codersdir) +coders_preview_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_preview_la_OBJECTS = coders/preview_la-preview.lo +coders_preview_la_OBJECTS = $(am_coders_preview_la_OBJECTS) +coders_preview_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_preview_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_preview_la_rpath = -rpath $(codersdir) +coders_ps_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_ps_la_OBJECTS = coders/ps_la-ps.lo +coders_ps_la_OBJECTS = $(am_coders_ps_la_OBJECTS) +coders_ps_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_ps_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_ps_la_rpath = -rpath $(codersdir) +coders_ps2_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_ps2_la_OBJECTS = coders/ps2_la-ps2.lo +coders_ps2_la_OBJECTS = $(am_coders_ps2_la_OBJECTS) +coders_ps2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_ps2_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_ps2_la_rpath = -rpath $(codersdir) +coders_ps3_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_ps3_la_OBJECTS = coders/ps3_la-ps3.lo +coders_ps3_la_OBJECTS = $(am_coders_ps3_la_OBJECTS) +coders_ps3_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_ps3_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_ps3_la_rpath = -rpath $(codersdir) +coders_psd_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_psd_la_OBJECTS = coders/psd_la-psd.lo +coders_psd_la_OBJECTS = $(am_coders_psd_la_OBJECTS) +coders_psd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_psd_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_psd_la_rpath = -rpath $(codersdir) +coders_pwp_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_pwp_la_OBJECTS = coders/pwp_la-pwp.lo +coders_pwp_la_OBJECTS = $(am_coders_pwp_la_OBJECTS) +coders_pwp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_pwp_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_pwp_la_rpath = -rpath $(codersdir) +coders_raw_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_raw_la_OBJECTS = coders/raw_la-raw.lo +coders_raw_la_OBJECTS = $(am_coders_raw_la_OBJECTS) +coders_raw_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_raw_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_raw_la_rpath = -rpath $(codersdir) +coders_rgb_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_rgb_la_OBJECTS = coders/rgb_la-rgb.lo +coders_rgb_la_OBJECTS = $(am_coders_rgb_la_OBJECTS) +coders_rgb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_rgb_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_rgb_la_rpath = -rpath $(codersdir) +coders_rgf_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_rgf_la_OBJECTS = coders/rgf_la-rgf.lo +coders_rgf_la_OBJECTS = $(am_coders_rgf_la_OBJECTS) +coders_rgf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_rgf_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_rgf_la_rpath = -rpath $(codersdir) +coders_rla_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_rla_la_OBJECTS = coders/rla_la-rla.lo +coders_rla_la_OBJECTS = $(am_coders_rla_la_OBJECTS) +coders_rla_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_rla_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_rla_la_rpath = -rpath $(codersdir) +coders_rle_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_rle_la_OBJECTS = coders/rle_la-rle.lo +coders_rle_la_OBJECTS = $(am_coders_rle_la_OBJECTS) +coders_rle_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_rle_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_rle_la_rpath = -rpath $(codersdir) +coders_scr_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_scr_la_OBJECTS = coders/scr_la-scr.lo +coders_scr_la_OBJECTS = $(am_coders_scr_la_OBJECTS) +coders_scr_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_scr_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_scr_la_rpath = -rpath $(codersdir) +coders_sct_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_sct_la_OBJECTS = coders/sct_la-sct.lo +coders_sct_la_OBJECTS = $(am_coders_sct_la_OBJECTS) +coders_sct_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_sct_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_sct_la_rpath = -rpath $(codersdir) +coders_sfw_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_sfw_la_OBJECTS = coders/sfw_la-sfw.lo +coders_sfw_la_OBJECTS = $(am_coders_sfw_la_OBJECTS) +coders_sfw_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_sfw_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_sfw_la_rpath = -rpath $(codersdir) +coders_sgi_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_sgi_la_OBJECTS = coders/sgi_la-sgi.lo +coders_sgi_la_OBJECTS = $(am_coders_sgi_la_OBJECTS) +coders_sgi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_sgi_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_sgi_la_rpath = -rpath $(codersdir) +coders_sixel_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_sixel_la_OBJECTS = coders/sixel_la-sixel.lo +coders_sixel_la_OBJECTS = $(am_coders_sixel_la_OBJECTS) +coders_sixel_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_sixel_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_sixel_la_rpath = -rpath $(codersdir) +coders_stegano_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_stegano_la_OBJECTS = coders/stegano_la-stegano.lo +coders_stegano_la_OBJECTS = $(am_coders_stegano_la_OBJECTS) +coders_stegano_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_stegano_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_stegano_la_rpath = -rpath $(codersdir) +coders_sun_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_sun_la_OBJECTS = coders/sun_la-sun.lo +coders_sun_la_OBJECTS = $(am_coders_sun_la_OBJECTS) +coders_sun_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_sun_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_sun_la_rpath = -rpath $(codersdir) +coders_svg_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_svg_la_OBJECTS = coders/svg_la-svg.lo +coders_svg_la_OBJECTS = $(am_coders_svg_la_OBJECTS) +coders_svg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_svg_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_svg_la_rpath = -rpath $(codersdir) +coders_tga_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_tga_la_OBJECTS = coders/tga_la-tga.lo +coders_tga_la_OBJECTS = $(am_coders_tga_la_OBJECTS) +coders_tga_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_tga_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_tga_la_rpath = -rpath $(codersdir) +coders_thumbnail_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_thumbnail_la_OBJECTS = coders/thumbnail_la-thumbnail.lo +coders_thumbnail_la_OBJECTS = $(am_coders_thumbnail_la_OBJECTS) +coders_thumbnail_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_thumbnail_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_thumbnail_la_rpath = -rpath $(codersdir) +coders_tiff_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_coders_tiff_la_OBJECTS = coders/tiff_la-tiff.lo \ + coders/tiff_la-psd.lo +coders_tiff_la_OBJECTS = $(am_coders_tiff_la_OBJECTS) +coders_tiff_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_tiff_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@TIFF_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_tiff_la_rpath = \ +@TIFF_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_tile_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_tile_la_OBJECTS = coders/tile_la-tile.lo +coders_tile_la_OBJECTS = $(am_coders_tile_la_OBJECTS) +coders_tile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_tile_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_tile_la_rpath = -rpath $(codersdir) +coders_tim_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_tim_la_OBJECTS = coders/tim_la-tim.lo +coders_tim_la_OBJECTS = $(am_coders_tim_la_OBJECTS) +coders_tim_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_tim_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_tim_la_rpath = -rpath $(codersdir) +coders_ttf_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_ttf_la_OBJECTS = coders/ttf_la-ttf.lo +coders_ttf_la_OBJECTS = $(am_coders_ttf_la_OBJECTS) +coders_ttf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_ttf_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_ttf_la_rpath = -rpath $(codersdir) +coders_txt_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_txt_la_OBJECTS = coders/txt_la-txt.lo +coders_txt_la_OBJECTS = $(am_coders_txt_la_OBJECTS) +coders_txt_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_txt_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_txt_la_rpath = -rpath $(codersdir) +coders_uil_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_uil_la_OBJECTS = coders/uil_la-uil.lo +coders_uil_la_OBJECTS = $(am_coders_uil_la_OBJECTS) +coders_uil_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_uil_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_uil_la_rpath = -rpath $(codersdir) +coders_url_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_url_la_OBJECTS = coders/url_la-url.lo +coders_url_la_OBJECTS = $(am_coders_url_la_OBJECTS) +coders_url_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_url_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_url_la_rpath = -rpath $(codersdir) +coders_uyvy_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_uyvy_la_OBJECTS = coders/uyvy_la-uyvy.lo +coders_uyvy_la_OBJECTS = $(am_coders_uyvy_la_OBJECTS) +coders_uyvy_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_uyvy_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_uyvy_la_rpath = -rpath $(codersdir) +coders_vicar_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_vicar_la_OBJECTS = coders/vicar_la-vicar.lo +coders_vicar_la_OBJECTS = $(am_coders_vicar_la_OBJECTS) +coders_vicar_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_vicar_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_vicar_la_rpath = -rpath $(codersdir) +coders_vid_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_vid_la_OBJECTS = coders/vid_la-vid.lo +coders_vid_la_OBJECTS = $(am_coders_vid_la_OBJECTS) +coders_vid_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_vid_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_vid_la_rpath = -rpath $(codersdir) +coders_video_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_video_la_OBJECTS = coders/video_la-video.lo +coders_video_la_OBJECTS = $(am_coders_video_la_OBJECTS) +coders_video_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_video_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_video_la_rpath = -rpath $(codersdir) +coders_viff_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_viff_la_OBJECTS = coders/viff_la-viff.lo +coders_viff_la_OBJECTS = $(am_coders_viff_la_OBJECTS) +coders_viff_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_viff_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_viff_la_rpath = -rpath $(codersdir) +coders_vips_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_vips_la_OBJECTS = coders/vips_la-vips.lo +coders_vips_la_OBJECTS = $(am_coders_vips_la_OBJECTS) +coders_vips_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_vips_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_vips_la_rpath = -rpath $(codersdir) +coders_wbmp_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_wbmp_la_OBJECTS = coders/wbmp_la-wbmp.lo +coders_wbmp_la_OBJECTS = $(am_coders_wbmp_la_OBJECTS) +coders_wbmp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_wbmp_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WITH_MODULES_TRUE@am_coders_wbmp_la_rpath = -rpath $(codersdir) +coders_webp_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_coders_webp_la_OBJECTS = coders/webp_la-webp.lo +coders_webp_la_OBJECTS = $(am_coders_webp_la_OBJECTS) +coders_webp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_webp_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@WEBP_DELEGATE_TRUE@@WITH_MODULES_TRUE@am_coders_webp_la_rpath = \ +@WEBP_DELEGATE_TRUE@@WITH_MODULES_TRUE@ -rpath $(codersdir) +coders_wmf_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_coders_wmf_la_OBJECTS = coders/wmf_la-wmf.lo +coders_wmf_la_OBJECTS = $(am_coders_wmf_la_OBJECTS) +coders_wmf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_wmf_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@@WMF_DELEGATE_TRUE@am_coders_wmf_la_rpath = -rpath \ +@WITH_MODULES_TRUE@@WMF_DELEGATE_TRUE@ $(codersdir) +coders_wpg_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_wpg_la_OBJECTS = coders/wpg_la-wpg.lo +coders_wpg_la_OBJECTS = $(am_coders_wpg_la_OBJECTS) +coders_wpg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_wpg_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_wpg_la_rpath = -rpath $(codersdir) +coders_x_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_x_la_OBJECTS = coders/x_la-x.lo +coders_x_la_OBJECTS = $(am_coders_x_la_OBJECTS) +coders_x_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_x_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@@X11_DELEGATE_TRUE@am_coders_x_la_rpath = -rpath \ +@WITH_MODULES_TRUE@@X11_DELEGATE_TRUE@ $(codersdir) +coders_xbm_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_xbm_la_OBJECTS = coders/xbm_la-xbm.lo +coders_xbm_la_OBJECTS = $(am_coders_xbm_la_OBJECTS) +coders_xbm_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_xbm_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_xbm_la_rpath = -rpath $(codersdir) +coders_xc_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_xc_la_OBJECTS = coders/xc_la-xc.lo +coders_xc_la_OBJECTS = $(am_coders_xc_la_OBJECTS) +coders_xc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_xc_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_xc_la_rpath = -rpath $(codersdir) +coders_xcf_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_xcf_la_OBJECTS = coders/xcf_la-xcf.lo +coders_xcf_la_OBJECTS = $(am_coders_xcf_la_OBJECTS) +coders_xcf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_xcf_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_xcf_la_rpath = -rpath $(codersdir) +coders_xpm_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_xpm_la_OBJECTS = coders/xpm_la-xpm.lo +coders_xpm_la_OBJECTS = $(am_coders_xpm_la_OBJECTS) +coders_xpm_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_xpm_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_xpm_la_rpath = -rpath $(codersdir) +coders_xps_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_coders_xps_la_OBJECTS = coders/xps_la-xps.lo +coders_xps_la_OBJECTS = $(am_coders_xps_la_OBJECTS) +coders_xps_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_xps_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_xps_la_rpath = -rpath $(codersdir) +coders_xwd_la_DEPENDENCIES = $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) +am_coders_xwd_la_OBJECTS = coders/xwd_la-xwd.lo +coders_xwd_la_OBJECTS = $(am_coders_xwd_la_OBJECTS) +coders_xwd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_xwd_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@@X11_DELEGATE_TRUE@am_coders_xwd_la_rpath = -rpath \ +@WITH_MODULES_TRUE@@X11_DELEGATE_TRUE@ $(codersdir) +coders_ycbcr_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_ycbcr_la_OBJECTS = coders/ycbcr_la-ycbcr.lo +coders_ycbcr_la_OBJECTS = $(am_coders_ycbcr_la_OBJECTS) +coders_ycbcr_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(coders_ycbcr_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +@WITH_MODULES_TRUE@am_coders_ycbcr_la_rpath = -rpath $(codersdir) +coders_yuv_la_DEPENDENCIES = $(MAGICKCORE_LIBS) +am_coders_yuv_la_OBJECTS = coders/yuv_la-yuv.lo +coders_yuv_la_OBJECTS = $(am_coders_yuv_la_OBJECTS) +coders_yuv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(coders_yuv_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_coders_yuv_la_rpath = -rpath $(codersdir) +filters_analyze_la_DEPENDENCIES = $(MAGICKCORE_LIBS) \ + $(am__DEPENDENCIES_1) +am_filters_analyze_la_OBJECTS = filters/analyze_la-analyze.lo +filters_analyze_la_OBJECTS = $(am_filters_analyze_la_OBJECTS) +filters_analyze_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(filters_analyze_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@WITH_MODULES_TRUE@am_filters_analyze_la_rpath = -rpath $(filtersdir) +am__magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES_DIST = \ + magick/ImageMagick.h magick/MagickCore.h magick/accelerate.c \ + magick/accelerate-private.h \ + magick/accelerate-kernels-private.h magick/animate.c \ + magick/animate.h magick/animate-private.h magick/annotate.c \ + magick/annotate.h magick/api.h magick/artifact.c \ + magick/artifact.h magick/attribute.c magick/attribute.h \ + magick/blob.c magick/blob.h magick/blob-private.h \ + magick/cache.c magick/cache.h magick/cache-private.h \ + magick/cache-view.c magick/cache-view.h magick/channel.c \ + magick/channel.h magick/cipher.c magick/cipher.h \ + magick/client.c magick/client.h magick/coder.c magick/coder.h \ + magick/color.c magick/color.h magick/color-private.h \ + magick/colormap.c magick/colormap.h magick/colormap-private.h \ + magick/colorspace.c magick/colorspace.h \ + magick/colorspace-private.h magick/compare.c magick/compare.h \ + magick/composite.c magick/composite.h \ + magick/composite-private.h magick/compress.c magick/compress.h \ + magick/configure.c magick/configure.h magick/constitute.c \ + magick/constitute.h magick/decorate.c magick/decorate.h \ + magick/distribute-cache.c magick/distribute-cache.h \ + magick/distribute-cache-private.h magick/delegate.c \ + magick/delegate.h magick/delegate-private.h magick/deprecate.c \ + magick/deprecate.h magick/display.c magick/display.h \ + magick/display-private.h magick/distort.c magick/distort.h \ + magick/draw.c magick/draw.h magick/draw-private.h \ + magick/effect.c magick/effect.h magick/enhance.c \ + magick/enhance.h magick/exception.c magick/exception.h \ + magick/exception-private.h magick/feature.c magick/feature.h \ + magick/fourier.c magick/fourier.h magick/fx.c magick/fx.h \ + magick/fx-private.h magick/gem.c magick/gem.h \ + magick/gem-private.h magick/geometry.c magick/geometry.h \ + magick/hashmap.c magick/hashmap.h magick/histogram.c \ + magick/histogram.h magick/identify.c magick/identify.h \ + magick/image.c magick/image.h magick/image-private.h \ + magick/image-view.c magick/image-view.h magick/layer.c \ + magick/layer.h magick/list.c magick/list.h magick/locale.c \ + magick/locale_.h magick/locale-private.h magick/log.c \ + magick/log.h magick/mac.h magick/magic.c magick/magic.h \ + magick/magick.c magick/magick-baseconfig.h \ + magick/magick-config.h magick/magick-type.h magick/magick.h \ + magick/matrix.c magick/matrix.h magick/memory.c \ + magick/memory_.h magick/memory-private.h magick/methods.h \ + magick/method-attribute.h magick/mime.c magick/mime.h \ + magick/module.c magick/module.h magick/monitor.c \ + magick/monitor.h magick/monitor-private.h magick/montage.c \ + magick/montage.h magick/morphology.c magick/morphology.h \ + magick/morphology-private.h magick/mutex.h magick/nt-base.h \ + magick/nt-base-private.h magick/nt-feature.h magick/opencl.c \ + magick/opencl.h magick/opencl-private.h magick/option.c \ + magick/option.h magick/option-private.h magick/paint.c \ + magick/paint.h magick/pixel.c magick/pixel.h \ + magick/pixel-accessor.h magick/pixel-private.h magick/policy.c \ + magick/policy.h magick/policy-private.h magick/prepress.c \ + magick/prepress.h magick/property.c magick/property.h \ + magick/profile.c magick/profile.h magick/quantize.c \ + magick/quantize.h magick/quantum.c magick/quantum.h \ + magick/quantum-export.c magick/quantum-import.c \ + magick/quantum-private.h magick/random.c magick/random_.h \ + magick/random-private.h magick/registry.c magick/registry.h \ + magick/resample.c magick/resample.h magick/resample-private.h \ + magick/resize.c magick/resize.h magick/resize-private.h \ + magick/resource.c magick/resource_.h magick/segment.c \ + magick/segment.h magick/semaphore.c magick/semaphore.h \ + magick/semaphore-private.h magick/shear.c magick/shear.h \ + magick/signature.c magick/signature.h \ + magick/signature-private.h magick/splay-tree.c \ + magick/splay-tree.h magick/static.c magick/static.h \ + magick/statistic.c magick/statistic.h magick/stream.c \ + magick/stream.h magick/stream-private.h magick/string.c \ + magick/string_.h magick/string-private.h magick/studio.h \ + magick/thread.c magick/thread_.h magick/thread-private.h \ + magick/timer.c magick/timer.h magick/timer-private.h \ + magick/token.c magick/token.h magick/token-private.h \ + magick/transform.c magick/transform.h magick/threshold.c \ + magick/threshold.h magick/type.c magick/type.h \ + magick/utility.c magick/utility.h magick/utility-private.h \ + magick/version.c magick/version.h magick/version-private.h \ + magick/vision.c magick/vision.h magick/visual-effects.c \ + magick/visual-effects.h magick/vms.h magick/widget.c \ + magick/widget.h magick/xml-tree.c magick/xml-tree.h \ + magick/xml-tree-private.h magick/xwindow.c magick/xwindow.h \ + magick/nt-feature.c magick/nt-base.c coders/aai.c coders/art.c \ + coders/avs.c coders/bgr.c coders/bmp.c coders/braille.c \ + coders/bytebuffer-private.h coders/cals.c coders/caption.c \ + coders/cin.c coders/cip.c coders/clip.c coders/cmyk.c \ + coders/cut.c coders/dcm.c coders/dds.c coders/debug.c \ + coders/dib.c coders/dng.c coders/dot.c coders/dpx.c \ + coders/fax.c coders/fits.c coders/ghostscript-private.h \ + coders/gif.c coders/gradient.c coders/gray.c coders/hald.c \ + coders/hdr.c coders/histogram.c coders/hrz.c coders/html.c \ + coders/icon.c coders/info.c coders/inline.c coders/ipl.c \ + coders/jnx.c coders/json.c coders/label.c coders/mac.c \ + coders/magick.c coders/map.c coders/mask.c coders/mat.c \ + coders/matte.c coders/meta.c coders/miff.c coders/mono.c \ + coders/mpc.c coders/mpr.c coders/msl.c coders/mtv.c \ + coders/mvg.c coders/null.c coders/otb.c coders/palm.c \ + coders/pango.c coders/pattern.c coders/pcd.c coders/pcl.c \ + coders/pcx.c coders/pdb.c coders/pdf.c coders/pes.c \ + coders/pgx.c coders/pict.c coders/pix.c coders/plasma.c \ + coders/pnm.c coders/preview.c coders/ps.c coders/ps2.c \ + coders/ps3.c coders/psd.c coders/psd-private.h coders/pwp.c \ + coders/raw.c coders/rgb.c coders/rgf.c coders/rla.c \ + coders/rle.c coders/scr.c coders/screenshot.c coders/sct.c \ + coders/sfw.c coders/sgi.c coders/sixel.c coders/stegano.c \ + coders/sun.c coders/svg.c coders/tga.c coders/thumbnail.c \ + coders/tile.c coders/tim.c coders/ttf.c coders/txt.c \ + coders/uil.c coders/url.c coders/uyvy.c coders/vicar.c \ + coders/vid.c coders/video.c coders/viff.c coders/vips.c \ + coders/wbmp.c coders/wpg.c coders/xbm.c coders/xc.c \ + coders/xcf.c coders/xpm.c coders/xps.c coders/ycbcr.c \ + coders/yuv.c coders/dps.c coders/djvu.c coders/exr.c \ + coders/flif.c coders/fpx.c coders/clipboard.c coders/emf.c \ + coders/heic.c coders/jbig.c coders/jpeg.c coders/jp2.c \ + coders/png.c coders/ept.c coders/tiff.c coders/webp.c \ + coders/wmf.c coders/x.c coders/xwd.c filters/analyze.c +am__objects_1 = magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.lo \ + magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.lo +@CYGWIN_BUILD_TRUE@@WIN32_NATIVE_BUILD_FALSE@am__objects_2 = magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.lo +@WIN32_NATIVE_BUILD_TRUE@am__objects_2 = magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.lo \ +@WIN32_NATIVE_BUILD_TRUE@ magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.lo +@DPS_DELEGATE_TRUE@am__objects_3 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.lo +@DJVU_DELEGATE_TRUE@am__objects_4 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.lo +@OPENEXR_DELEGATE_TRUE@am__objects_5 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.lo +@FLIF_DELEGATE_TRUE@am__objects_6 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.lo +@FPX_DELEGATE_TRUE@am__objects_7 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.lo +@WINGDI32_DELEGATE_TRUE@am__objects_8 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.lo \ +@WINGDI32_DELEGATE_TRUE@ coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.lo +@HEIC_DELEGATE_TRUE@am__objects_9 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.lo +@JBIG_DELEGATE_TRUE@am__objects_10 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.lo +@JPEG_DELEGATE_TRUE@am__objects_11 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.lo +@LIBOPENJP2_DELEGATE_TRUE@am__objects_12 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.lo +@PNG_DELEGATE_TRUE@am__objects_13 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.lo +@TIFF_DELEGATE_TRUE@am__objects_14 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.lo \ +@TIFF_DELEGATE_TRUE@ coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.lo +@WEBP_DELEGATE_TRUE@am__objects_15 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.lo +@WMF_DELEGATE_TRUE@am__objects_16 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.lo +@X11_DELEGATE_TRUE@am__objects_17 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.lo \ +@X11_DELEGATE_TRUE@ coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.lo +am__objects_18 = coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.lo \ + coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.lo \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) \ + $(am__objects_6) $(am__objects_7) $(am__objects_8) \ + $(am__objects_9) $(am__objects_10) $(am__objects_11) \ + $(am__objects_12) $(am__objects_13) $(am__objects_14) \ + $(am__objects_15) $(am__objects_16) $(am__objects_17) +am__objects_19 = filters/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.lo +@WITH_MODULES_FALSE@am_magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS = \ +@WITH_MODULES_FALSE@ $(am__objects_1) $(am__objects_2) \ +@WITH_MODULES_FALSE@ $(am__objects_18) $(am__objects_19) +@WITH_MODULES_TRUE@am_magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS = \ +@WITH_MODULES_TRUE@ $(am__objects_1) $(am__objects_2) +am__objects_20 = +nodist_magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS = \ + $(am__objects_20) +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS = $(am_magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS) \ + $(nodist_magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS) +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LINK = \ + $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_DEPENDENCIES = \ + $(MAGICKCORE_LIBS) $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__objects_21 = wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.lo \ + wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.lo +am_wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS = \ + $(am__objects_21) +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS = $(am_wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS) +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LINK = \ + $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_Magick___demo_analyze_OBJECTS = \ + Magick++/demo/analyze-analyze.$(OBJEXT) +Magick___demo_analyze_OBJECTS = $(am_Magick___demo_analyze_OBJECTS) +@WITH_MAGICK_PLUS_PLUS_TRUE@am__DEPENDENCIES_2 = Magick++/lib/libMagick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la +@WITH_MAGICK_PLUS_PLUS_TRUE@am__DEPENDENCIES_3 = \ +@WITH_MAGICK_PLUS_PLUS_TRUE@ $(am__DEPENDENCIES_2) \ +@WITH_MAGICK_PLUS_PLUS_TRUE@ $(top_builddir)/magick/libMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la \ +@WITH_MAGICK_PLUS_PLUS_TRUE@ $(top_builddir)/wand/libMagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la +Magick___demo_analyze_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___demo_button_OBJECTS = \ + Magick++/demo/button-button.$(OBJEXT) +Magick___demo_button_OBJECTS = $(am_Magick___demo_button_OBJECTS) +Magick___demo_button_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___demo_demo_OBJECTS = Magick++/demo/demo-demo.$(OBJEXT) +Magick___demo_demo_OBJECTS = $(am_Magick___demo_demo_OBJECTS) +Magick___demo_demo_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___demo_detrans_OBJECTS = \ + Magick++/demo/detrans-detrans.$(OBJEXT) +Magick___demo_detrans_OBJECTS = $(am_Magick___demo_detrans_OBJECTS) +Magick___demo_detrans_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___demo_flip_OBJECTS = Magick++/demo/flip-flip.$(OBJEXT) +Magick___demo_flip_OBJECTS = $(am_Magick___demo_flip_OBJECTS) +Magick___demo_flip_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___demo_gravity_OBJECTS = \ + Magick++/demo/gravity-gravity.$(OBJEXT) +Magick___demo_gravity_OBJECTS = $(am_Magick___demo_gravity_OBJECTS) +Magick___demo_gravity_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___demo_piddle_OBJECTS = \ + Magick++/demo/piddle-piddle.$(OBJEXT) +Magick___demo_piddle_OBJECTS = $(am_Magick___demo_piddle_OBJECTS) +Magick___demo_piddle_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___demo_shapes_OBJECTS = \ + Magick++/demo/shapes-shapes.$(OBJEXT) +Magick___demo_shapes_OBJECTS = $(am_Magick___demo_shapes_OBJECTS) +Magick___demo_shapes_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___demo_zoom_OBJECTS = Magick++/demo/zoom-zoom.$(OBJEXT) +Magick___demo_zoom_OBJECTS = $(am_Magick___demo_zoom_OBJECTS) +Magick___demo_zoom_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_appendImages_OBJECTS = \ + Magick++/tests/appendImages-appendImages.$(OBJEXT) +Magick___tests_appendImages_OBJECTS = \ + $(am_Magick___tests_appendImages_OBJECTS) +Magick___tests_appendImages_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_attributes_OBJECTS = \ + Magick++/tests/attributes-attributes.$(OBJEXT) +Magick___tests_attributes_OBJECTS = \ + $(am_Magick___tests_attributes_OBJECTS) +Magick___tests_attributes_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_averageImages_OBJECTS = \ + Magick++/tests/averageImages-averageImages.$(OBJEXT) +Magick___tests_averageImages_OBJECTS = \ + $(am_Magick___tests_averageImages_OBJECTS) +Magick___tests_averageImages_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_coalesceImages_OBJECTS = \ + Magick++/tests/coalesceImages-coalesceImages.$(OBJEXT) +Magick___tests_coalesceImages_OBJECTS = \ + $(am_Magick___tests_coalesceImages_OBJECTS) +Magick___tests_coalesceImages_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_coderInfo_OBJECTS = \ + Magick++/tests/coderInfo-coderInfo.$(OBJEXT) +Magick___tests_coderInfo_OBJECTS = \ + $(am_Magick___tests_coderInfo_OBJECTS) +Magick___tests_coderInfo_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_color_OBJECTS = \ + Magick++/tests/color-color.$(OBJEXT) +Magick___tests_color_OBJECTS = $(am_Magick___tests_color_OBJECTS) +Magick___tests_color_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_colorHistogram_OBJECTS = \ + Magick++/tests/colorHistogram-colorHistogram.$(OBJEXT) +Magick___tests_colorHistogram_OBJECTS = \ + $(am_Magick___tests_colorHistogram_OBJECTS) +Magick___tests_colorHistogram_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_exceptions_OBJECTS = \ + Magick++/tests/exceptions-exceptions.$(OBJEXT) +Magick___tests_exceptions_OBJECTS = \ + $(am_Magick___tests_exceptions_OBJECTS) +Magick___tests_exceptions_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_montageImages_OBJECTS = \ + Magick++/tests/montageImages-montageImages.$(OBJEXT) +Magick___tests_montageImages_OBJECTS = \ + $(am_Magick___tests_montageImages_OBJECTS) +Magick___tests_montageImages_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_morphImages_OBJECTS = \ + Magick++/tests/morphImages-morphImages.$(OBJEXT) +Magick___tests_morphImages_OBJECTS = \ + $(am_Magick___tests_morphImages_OBJECTS) +Magick___tests_morphImages_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_readWriteBlob_OBJECTS = \ + Magick++/tests/readWriteBlob-readWriteBlob.$(OBJEXT) +Magick___tests_readWriteBlob_OBJECTS = \ + $(am_Magick___tests_readWriteBlob_OBJECTS) +Magick___tests_readWriteBlob_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_Magick___tests_readWriteImages_OBJECTS = \ + Magick++/tests/readWriteImages-readWriteImages.$(OBJEXT) +Magick___tests_readWriteImages_OBJECTS = \ + $(am_Magick___tests_readWriteImages_OBJECTS) +Magick___tests_readWriteImages_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_tests_drawtest_OBJECTS = tests/drawtest-drawtest.$(OBJEXT) +tests_drawtest_OBJECTS = $(am_tests_drawtest_OBJECTS) +tests_drawtest_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +tests_drawtest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(tests_drawtest_LDFLAGS) $(LDFLAGS) -o \ + $@ +am_tests_validate_OBJECTS = tests/validate-validate.$(OBJEXT) +tests_validate_OBJECTS = $(am_tests_validate_OBJECTS) +tests_validate_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) \ + $(am__DEPENDENCIES_1) +tests_validate_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(tests_validate_LDFLAGS) $(LDFLAGS) -o \ + $@ +am_tests_wandtest_OBJECTS = tests/wandtest-wandtest.$(OBJEXT) +tests_wandtest_OBJECTS = $(am_tests_wandtest_OBJECTS) +tests_wandtest_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +tests_wandtest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(tests_wandtest_LDFLAGS) $(LDFLAGS) -o \ + $@ +am_utilities_animate_OBJECTS = utilities/animate.$(OBJEXT) +utilities_animate_OBJECTS = $(am_utilities_animate_OBJECTS) +utilities_animate_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_animate_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_animate_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_utilities_compare_OBJECTS = utilities/compare.$(OBJEXT) +utilities_compare_OBJECTS = $(am_utilities_compare_OBJECTS) +utilities_compare_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_compare_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_compare_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_utilities_composite_OBJECTS = utilities/composite.$(OBJEXT) +utilities_composite_OBJECTS = $(am_utilities_composite_OBJECTS) +utilities_composite_DEPENDENCIES = $(MAGICKCORE_LIBS) \ + $(MAGICKWAND_LIBS) +utilities_composite_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_composite_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_utilities_conjure_OBJECTS = utilities/conjure.$(OBJEXT) +utilities_conjure_OBJECTS = $(am_utilities_conjure_OBJECTS) +utilities_conjure_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_conjure_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_conjure_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_utilities_convert_OBJECTS = utilities/convert.$(OBJEXT) +utilities_convert_OBJECTS = $(am_utilities_convert_OBJECTS) +utilities_convert_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_convert_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_convert_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_utilities_display_OBJECTS = utilities/display.$(OBJEXT) +utilities_display_OBJECTS = $(am_utilities_display_OBJECTS) +utilities_display_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_display_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_display_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_utilities_identify_OBJECTS = utilities/identify.$(OBJEXT) +utilities_identify_OBJECTS = $(am_utilities_identify_OBJECTS) +utilities_identify_DEPENDENCIES = $(MAGICKCORE_LIBS) \ + $(MAGICKWAND_LIBS) +utilities_identify_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_identify_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_utilities_import_OBJECTS = utilities/import.$(OBJEXT) +utilities_import_OBJECTS = $(am_utilities_import_OBJECTS) +utilities_import_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_import_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_import_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_utilities_mogrify_OBJECTS = utilities/mogrify.$(OBJEXT) +utilities_mogrify_OBJECTS = $(am_utilities_mogrify_OBJECTS) +utilities_mogrify_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_mogrify_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_mogrify_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_utilities_montage_OBJECTS = utilities/montage.$(OBJEXT) +utilities_montage_OBJECTS = $(am_utilities_montage_OBJECTS) +utilities_montage_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_montage_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_montage_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_utilities_stream_OBJECTS = utilities/stream.$(OBJEXT) +utilities_stream_OBJECTS = $(am_utilities_stream_OBJECTS) +utilities_stream_DEPENDENCIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_stream_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(utilities_stream_LDFLAGS) $(LDFLAGS) \ + -o $@ +SCRIPTS = $(bin_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = Magick++/demo/$(DEPDIR)/analyze-analyze.Po \ + Magick++/demo/$(DEPDIR)/button-button.Po \ + Magick++/demo/$(DEPDIR)/demo-demo.Po \ + Magick++/demo/$(DEPDIR)/detrans-detrans.Po \ + Magick++/demo/$(DEPDIR)/flip-flip.Po \ + Magick++/demo/$(DEPDIR)/gravity-gravity.Po \ + Magick++/demo/$(DEPDIR)/piddle-piddle.Po \ + Magick++/demo/$(DEPDIR)/shapes-shapes.Po \ + Magick++/demo/$(DEPDIR)/zoom-zoom.Po \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.Plo \ + Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.Plo \ + Magick++/tests/$(DEPDIR)/appendImages-appendImages.Po \ + Magick++/tests/$(DEPDIR)/attributes-attributes.Po \ + Magick++/tests/$(DEPDIR)/averageImages-averageImages.Po \ + Magick++/tests/$(DEPDIR)/coalesceImages-coalesceImages.Po \ + Magick++/tests/$(DEPDIR)/coderInfo-coderInfo.Po \ + Magick++/tests/$(DEPDIR)/color-color.Po \ + Magick++/tests/$(DEPDIR)/colorHistogram-colorHistogram.Po \ + Magick++/tests/$(DEPDIR)/exceptions-exceptions.Po \ + Magick++/tests/$(DEPDIR)/montageImages-montageImages.Po \ + Magick++/tests/$(DEPDIR)/morphImages-morphImages.Po \ + Magick++/tests/$(DEPDIR)/readWriteBlob-readWriteBlob.Po \ + Magick++/tests/$(DEPDIR)/readWriteImages-readWriteImages.Po \ + coders/$(DEPDIR)/aai_la-aai.Plo \ + coders/$(DEPDIR)/art_la-art.Plo \ + coders/$(DEPDIR)/avs_la-avs.Plo \ + coders/$(DEPDIR)/bgr_la-bgr.Plo \ + coders/$(DEPDIR)/bmp_la-bmp.Plo \ + coders/$(DEPDIR)/braille_la-braille.Plo \ + coders/$(DEPDIR)/cals_la-cals.Plo \ + coders/$(DEPDIR)/caption_la-caption.Plo \ + coders/$(DEPDIR)/cin_la-cin.Plo \ + coders/$(DEPDIR)/cip_la-cip.Plo \ + coders/$(DEPDIR)/clip_la-clip.Plo \ + coders/$(DEPDIR)/clipboard_la-clipboard.Plo \ + coders/$(DEPDIR)/cmyk_la-cmyk.Plo \ + coders/$(DEPDIR)/cut_la-cut.Plo \ + coders/$(DEPDIR)/dcm_la-dcm.Plo \ + coders/$(DEPDIR)/dds_la-dds.Plo \ + coders/$(DEPDIR)/debug_la-debug.Plo \ + coders/$(DEPDIR)/dib_la-dib.Plo \ + coders/$(DEPDIR)/djvu_la-djvu.Plo \ + coders/$(DEPDIR)/dng_la-dng.Plo \ + coders/$(DEPDIR)/dot_la-dot.Plo \ + coders/$(DEPDIR)/dps_la-dps.Plo \ + coders/$(DEPDIR)/dpx_la-dpx.Plo \ + coders/$(DEPDIR)/emf_la-emf.Plo \ + coders/$(DEPDIR)/ept_la-ept.Plo \ + coders/$(DEPDIR)/exr_la-exr.Plo \ + coders/$(DEPDIR)/fax_la-fax.Plo \ + coders/$(DEPDIR)/fits_la-fits.Plo \ + coders/$(DEPDIR)/flif_la-flif.Plo \ + coders/$(DEPDIR)/fpx_la-fpx.Plo \ + coders/$(DEPDIR)/gif_la-gif.Plo \ + coders/$(DEPDIR)/gradient_la-gradient.Plo \ + coders/$(DEPDIR)/gray_la-gray.Plo \ + coders/$(DEPDIR)/hald_la-hald.Plo \ + coders/$(DEPDIR)/hdr_la-hdr.Plo \ + coders/$(DEPDIR)/heic_la-heic.Plo \ + coders/$(DEPDIR)/histogram_la-histogram.Plo \ + coders/$(DEPDIR)/hrz_la-hrz.Plo \ + coders/$(DEPDIR)/html_la-html.Plo \ + coders/$(DEPDIR)/icon_la-icon.Plo \ + coders/$(DEPDIR)/info_la-info.Plo \ + coders/$(DEPDIR)/inline_la-inline.Plo \ + coders/$(DEPDIR)/ipl_la-ipl.Plo \ + coders/$(DEPDIR)/jbig_la-jbig.Plo \ + coders/$(DEPDIR)/jnx_la-jnx.Plo \ + coders/$(DEPDIR)/jp2_la-jp2.Plo \ + coders/$(DEPDIR)/jpeg_la-jpeg.Plo \ + coders/$(DEPDIR)/json_la-json.Plo \ + coders/$(DEPDIR)/label_la-label.Plo \ + coders/$(DEPDIR)/mac_la-mac.Plo \ + coders/$(DEPDIR)/magick_la-magick.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.Plo \ + coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.Plo \ + coders/$(DEPDIR)/map_la-map.Plo \ + coders/$(DEPDIR)/mask_la-mask.Plo \ + coders/$(DEPDIR)/mat_la-mat.Plo \ + coders/$(DEPDIR)/matte_la-matte.Plo \ + coders/$(DEPDIR)/meta_la-meta.Plo \ + coders/$(DEPDIR)/miff_la-miff.Plo \ + coders/$(DEPDIR)/mono_la-mono.Plo \ + coders/$(DEPDIR)/mpc_la-mpc.Plo \ + coders/$(DEPDIR)/mpr_la-mpr.Plo \ + coders/$(DEPDIR)/msl_la-msl.Plo \ + coders/$(DEPDIR)/mtv_la-mtv.Plo \ + coders/$(DEPDIR)/mvg_la-mvg.Plo \ + coders/$(DEPDIR)/null_la-null.Plo \ + coders/$(DEPDIR)/otb_la-otb.Plo \ + coders/$(DEPDIR)/palm_la-palm.Plo \ + coders/$(DEPDIR)/pango_la-pango.Plo \ + coders/$(DEPDIR)/pattern_la-pattern.Plo \ + coders/$(DEPDIR)/pcd_la-pcd.Plo \ + coders/$(DEPDIR)/pcl_la-pcl.Plo \ + coders/$(DEPDIR)/pcx_la-pcx.Plo \ + coders/$(DEPDIR)/pdb_la-pdb.Plo \ + coders/$(DEPDIR)/pdf_la-pdf.Plo \ + coders/$(DEPDIR)/pes_la-pes.Plo \ + coders/$(DEPDIR)/pgx_la-pgx.Plo \ + coders/$(DEPDIR)/pict_la-pict.Plo \ + coders/$(DEPDIR)/pix_la-pix.Plo \ + coders/$(DEPDIR)/plasma_la-plasma.Plo \ + coders/$(DEPDIR)/png_la-png.Plo \ + coders/$(DEPDIR)/pnm_la-pnm.Plo \ + coders/$(DEPDIR)/preview_la-preview.Plo \ + coders/$(DEPDIR)/ps2_la-ps2.Plo \ + coders/$(DEPDIR)/ps3_la-ps3.Plo coders/$(DEPDIR)/ps_la-ps.Plo \ + coders/$(DEPDIR)/psd_la-psd.Plo \ + coders/$(DEPDIR)/pwp_la-pwp.Plo \ + coders/$(DEPDIR)/raw_la-raw.Plo \ + coders/$(DEPDIR)/rgb_la-rgb.Plo \ + coders/$(DEPDIR)/rgf_la-rgf.Plo \ + coders/$(DEPDIR)/rla_la-rla.Plo \ + coders/$(DEPDIR)/rle_la-rle.Plo \ + coders/$(DEPDIR)/scr_la-scr.Plo \ + coders/$(DEPDIR)/sct_la-sct.Plo \ + coders/$(DEPDIR)/sfw_la-sfw.Plo \ + coders/$(DEPDIR)/sgi_la-sgi.Plo \ + coders/$(DEPDIR)/sixel_la-sixel.Plo \ + coders/$(DEPDIR)/stegano_la-stegano.Plo \ + coders/$(DEPDIR)/sun_la-sun.Plo \ + coders/$(DEPDIR)/svg_la-svg.Plo \ + coders/$(DEPDIR)/tga_la-tga.Plo \ + coders/$(DEPDIR)/thumbnail_la-thumbnail.Plo \ + coders/$(DEPDIR)/tiff_la-psd.Plo \ + coders/$(DEPDIR)/tiff_la-tiff.Plo \ + coders/$(DEPDIR)/tile_la-tile.Plo \ + coders/$(DEPDIR)/tim_la-tim.Plo \ + coders/$(DEPDIR)/ttf_la-ttf.Plo \ + coders/$(DEPDIR)/txt_la-txt.Plo \ + coders/$(DEPDIR)/uil_la-uil.Plo \ + coders/$(DEPDIR)/url_la-url.Plo \ + coders/$(DEPDIR)/uyvy_la-uyvy.Plo \ + coders/$(DEPDIR)/vicar_la-vicar.Plo \ + coders/$(DEPDIR)/vid_la-vid.Plo \ + coders/$(DEPDIR)/video_la-video.Plo \ + coders/$(DEPDIR)/viff_la-viff.Plo \ + coders/$(DEPDIR)/vips_la-vips.Plo \ + coders/$(DEPDIR)/wbmp_la-wbmp.Plo \ + coders/$(DEPDIR)/webp_la-webp.Plo \ + coders/$(DEPDIR)/wmf_la-wmf.Plo \ + coders/$(DEPDIR)/wpg_la-wpg.Plo coders/$(DEPDIR)/x_la-x.Plo \ + coders/$(DEPDIR)/xbm_la-xbm.Plo coders/$(DEPDIR)/xc_la-xc.Plo \ + coders/$(DEPDIR)/xcf_la-xcf.Plo \ + coders/$(DEPDIR)/xpm_la-xpm.Plo \ + coders/$(DEPDIR)/xps_la-xps.Plo \ + coders/$(DEPDIR)/xwd_la-xwd.Plo \ + coders/$(DEPDIR)/ycbcr_la-ycbcr.Plo \ + coders/$(DEPDIR)/yuv_la-yuv.Plo \ + filters/$(DEPDIR)/analyze_la-analyze.Plo \ + filters/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.Plo \ + magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.Plo \ + tests/$(DEPDIR)/drawtest-drawtest.Po \ + tests/$(DEPDIR)/validate-validate.Po \ + tests/$(DEPDIR)/wandtest-wandtest.Po \ + utilities/$(DEPDIR)/animate.Po utilities/$(DEPDIR)/compare.Po \ + utilities/$(DEPDIR)/composite.Po \ + utilities/$(DEPDIR)/conjure.Po utilities/$(DEPDIR)/convert.Po \ + utilities/$(DEPDIR)/display.Po utilities/$(DEPDIR)/identify.Po \ + utilities/$(DEPDIR)/import.Po utilities/$(DEPDIR)/mogrify.Po \ + utilities/$(DEPDIR)/montage.Po utilities/$(DEPDIR)/stream.Po \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.Plo \ + wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES) \ + $(coders_aai_la_SOURCES) $(coders_art_la_SOURCES) \ + $(coders_avs_la_SOURCES) $(coders_bgr_la_SOURCES) \ + $(coders_bmp_la_SOURCES) $(coders_braille_la_SOURCES) \ + $(coders_cals_la_SOURCES) $(coders_caption_la_SOURCES) \ + $(coders_cin_la_SOURCES) $(coders_cip_la_SOURCES) \ + $(coders_clip_la_SOURCES) $(coders_clipboard_la_SOURCES) \ + $(coders_cmyk_la_SOURCES) $(coders_cut_la_SOURCES) \ + $(coders_dcm_la_SOURCES) $(coders_dds_la_SOURCES) \ + $(coders_debug_la_SOURCES) $(coders_dib_la_SOURCES) \ + $(coders_djvu_la_SOURCES) $(coders_dng_la_SOURCES) \ + $(coders_dot_la_SOURCES) $(coders_dps_la_SOURCES) \ + $(coders_dpx_la_SOURCES) $(coders_emf_la_SOURCES) \ + $(coders_ept_la_SOURCES) $(coders_exr_la_SOURCES) \ + $(coders_fax_la_SOURCES) $(coders_fits_la_SOURCES) \ + $(coders_flif_la_SOURCES) $(coders_fpx_la_SOURCES) \ + $(coders_gif_la_SOURCES) $(coders_gradient_la_SOURCES) \ + $(coders_gray_la_SOURCES) $(coders_hald_la_SOURCES) \ + $(coders_hdr_la_SOURCES) $(coders_heic_la_SOURCES) \ + $(coders_histogram_la_SOURCES) $(coders_hrz_la_SOURCES) \ + $(coders_html_la_SOURCES) $(coders_icon_la_SOURCES) \ + $(coders_info_la_SOURCES) $(coders_inline_la_SOURCES) \ + $(coders_ipl_la_SOURCES) $(coders_jbig_la_SOURCES) \ + $(coders_jnx_la_SOURCES) $(coders_jp2_la_SOURCES) \ + $(coders_jpeg_la_SOURCES) $(coders_json_la_SOURCES) \ + $(coders_label_la_SOURCES) $(coders_mac_la_SOURCES) \ + $(coders_magick_la_SOURCES) $(coders_map_la_SOURCES) \ + $(coders_mask_la_SOURCES) $(coders_mat_la_SOURCES) \ + $(coders_matte_la_SOURCES) $(coders_meta_la_SOURCES) \ + $(coders_miff_la_SOURCES) $(coders_mono_la_SOURCES) \ + $(coders_mpc_la_SOURCES) $(coders_mpr_la_SOURCES) \ + $(coders_msl_la_SOURCES) $(coders_mtv_la_SOURCES) \ + $(coders_mvg_la_SOURCES) $(coders_null_la_SOURCES) \ + $(coders_otb_la_SOURCES) $(coders_palm_la_SOURCES) \ + $(coders_pango_la_SOURCES) $(coders_pattern_la_SOURCES) \ + $(coders_pcd_la_SOURCES) $(coders_pcl_la_SOURCES) \ + $(coders_pcx_la_SOURCES) $(coders_pdb_la_SOURCES) \ + $(coders_pdf_la_SOURCES) $(coders_pes_la_SOURCES) \ + $(coders_pgx_la_SOURCES) $(coders_pict_la_SOURCES) \ + $(coders_pix_la_SOURCES) $(coders_plasma_la_SOURCES) \ + $(coders_png_la_SOURCES) $(coders_pnm_la_SOURCES) \ + $(coders_preview_la_SOURCES) $(coders_ps_la_SOURCES) \ + $(coders_ps2_la_SOURCES) $(coders_ps3_la_SOURCES) \ + $(coders_psd_la_SOURCES) $(coders_pwp_la_SOURCES) \ + $(coders_raw_la_SOURCES) $(coders_rgb_la_SOURCES) \ + $(coders_rgf_la_SOURCES) $(coders_rla_la_SOURCES) \ + $(coders_rle_la_SOURCES) $(coders_scr_la_SOURCES) \ + $(coders_sct_la_SOURCES) $(coders_sfw_la_SOURCES) \ + $(coders_sgi_la_SOURCES) $(coders_sixel_la_SOURCES) \ + $(coders_stegano_la_SOURCES) $(coders_sun_la_SOURCES) \ + $(coders_svg_la_SOURCES) $(coders_tga_la_SOURCES) \ + $(coders_thumbnail_la_SOURCES) $(coders_tiff_la_SOURCES) \ + $(coders_tile_la_SOURCES) $(coders_tim_la_SOURCES) \ + $(coders_ttf_la_SOURCES) $(coders_txt_la_SOURCES) \ + $(coders_uil_la_SOURCES) $(coders_url_la_SOURCES) \ + $(coders_uyvy_la_SOURCES) $(coders_vicar_la_SOURCES) \ + $(coders_vid_la_SOURCES) $(coders_video_la_SOURCES) \ + $(coders_viff_la_SOURCES) $(coders_vips_la_SOURCES) \ + $(coders_wbmp_la_SOURCES) $(coders_webp_la_SOURCES) \ + $(coders_wmf_la_SOURCES) $(coders_wpg_la_SOURCES) \ + $(coders_x_la_SOURCES) $(coders_xbm_la_SOURCES) \ + $(coders_xc_la_SOURCES) $(coders_xcf_la_SOURCES) \ + $(coders_xpm_la_SOURCES) $(coders_xps_la_SOURCES) \ + $(coders_xwd_la_SOURCES) $(coders_ycbcr_la_SOURCES) \ + $(coders_yuv_la_SOURCES) $(filters_analyze_la_SOURCES) \ + $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES) \ + $(nodist_magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES) \ + $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES) \ + $(Magick___demo_analyze_SOURCES) \ + $(Magick___demo_button_SOURCES) $(Magick___demo_demo_SOURCES) \ + $(Magick___demo_detrans_SOURCES) $(Magick___demo_flip_SOURCES) \ + $(Magick___demo_gravity_SOURCES) \ + $(Magick___demo_piddle_SOURCES) \ + $(Magick___demo_shapes_SOURCES) $(Magick___demo_zoom_SOURCES) \ + $(Magick___tests_appendImages_SOURCES) \ + $(Magick___tests_attributes_SOURCES) \ + $(Magick___tests_averageImages_SOURCES) \ + $(Magick___tests_coalesceImages_SOURCES) \ + $(Magick___tests_coderInfo_SOURCES) \ + $(Magick___tests_color_SOURCES) \ + $(Magick___tests_colorHistogram_SOURCES) \ + $(Magick___tests_exceptions_SOURCES) \ + $(Magick___tests_montageImages_SOURCES) \ + $(Magick___tests_morphImages_SOURCES) \ + $(Magick___tests_readWriteBlob_SOURCES) \ + $(Magick___tests_readWriteImages_SOURCES) \ + $(tests_drawtest_SOURCES) $(tests_validate_SOURCES) \ + $(tests_wandtest_SOURCES) $(utilities_animate_SOURCES) \ + $(utilities_compare_SOURCES) $(utilities_composite_SOURCES) \ + $(utilities_conjure_SOURCES) $(utilities_convert_SOURCES) \ + $(utilities_display_SOURCES) $(utilities_identify_SOURCES) \ + $(utilities_import_SOURCES) $(utilities_mogrify_SOURCES) \ + $(utilities_montage_SOURCES) $(utilities_stream_SOURCES) +DIST_SOURCES = $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES) \ + $(coders_aai_la_SOURCES) $(coders_art_la_SOURCES) \ + $(coders_avs_la_SOURCES) $(coders_bgr_la_SOURCES) \ + $(coders_bmp_la_SOURCES) $(coders_braille_la_SOURCES) \ + $(coders_cals_la_SOURCES) $(coders_caption_la_SOURCES) \ + $(coders_cin_la_SOURCES) $(coders_cip_la_SOURCES) \ + $(coders_clip_la_SOURCES) $(coders_clipboard_la_SOURCES) \ + $(coders_cmyk_la_SOURCES) $(coders_cut_la_SOURCES) \ + $(coders_dcm_la_SOURCES) $(coders_dds_la_SOURCES) \ + $(coders_debug_la_SOURCES) $(coders_dib_la_SOURCES) \ + $(coders_djvu_la_SOURCES) $(coders_dng_la_SOURCES) \ + $(coders_dot_la_SOURCES) $(coders_dps_la_SOURCES) \ + $(coders_dpx_la_SOURCES) $(coders_emf_la_SOURCES) \ + $(coders_ept_la_SOURCES) $(coders_exr_la_SOURCES) \ + $(coders_fax_la_SOURCES) $(coders_fits_la_SOURCES) \ + $(coders_flif_la_SOURCES) $(coders_fpx_la_SOURCES) \ + $(coders_gif_la_SOURCES) $(coders_gradient_la_SOURCES) \ + $(coders_gray_la_SOURCES) $(coders_hald_la_SOURCES) \ + $(coders_hdr_la_SOURCES) $(coders_heic_la_SOURCES) \ + $(coders_histogram_la_SOURCES) $(coders_hrz_la_SOURCES) \ + $(coders_html_la_SOURCES) $(coders_icon_la_SOURCES) \ + $(coders_info_la_SOURCES) $(coders_inline_la_SOURCES) \ + $(coders_ipl_la_SOURCES) $(coders_jbig_la_SOURCES) \ + $(coders_jnx_la_SOURCES) $(coders_jp2_la_SOURCES) \ + $(coders_jpeg_la_SOURCES) $(coders_json_la_SOURCES) \ + $(coders_label_la_SOURCES) $(coders_mac_la_SOURCES) \ + $(coders_magick_la_SOURCES) $(coders_map_la_SOURCES) \ + $(coders_mask_la_SOURCES) $(coders_mat_la_SOURCES) \ + $(coders_matte_la_SOURCES) $(coders_meta_la_SOURCES) \ + $(coders_miff_la_SOURCES) $(coders_mono_la_SOURCES) \ + $(coders_mpc_la_SOURCES) $(coders_mpr_la_SOURCES) \ + $(coders_msl_la_SOURCES) $(coders_mtv_la_SOURCES) \ + $(coders_mvg_la_SOURCES) $(coders_null_la_SOURCES) \ + $(coders_otb_la_SOURCES) $(coders_palm_la_SOURCES) \ + $(coders_pango_la_SOURCES) $(coders_pattern_la_SOURCES) \ + $(coders_pcd_la_SOURCES) $(coders_pcl_la_SOURCES) \ + $(coders_pcx_la_SOURCES) $(coders_pdb_la_SOURCES) \ + $(coders_pdf_la_SOURCES) $(coders_pes_la_SOURCES) \ + $(coders_pgx_la_SOURCES) $(coders_pict_la_SOURCES) \ + $(coders_pix_la_SOURCES) $(coders_plasma_la_SOURCES) \ + $(coders_png_la_SOURCES) $(coders_pnm_la_SOURCES) \ + $(coders_preview_la_SOURCES) $(coders_ps_la_SOURCES) \ + $(coders_ps2_la_SOURCES) $(coders_ps3_la_SOURCES) \ + $(coders_psd_la_SOURCES) $(coders_pwp_la_SOURCES) \ + $(coders_raw_la_SOURCES) $(coders_rgb_la_SOURCES) \ + $(coders_rgf_la_SOURCES) $(coders_rla_la_SOURCES) \ + $(coders_rle_la_SOURCES) $(coders_scr_la_SOURCES) \ + $(coders_sct_la_SOURCES) $(coders_sfw_la_SOURCES) \ + $(coders_sgi_la_SOURCES) $(coders_sixel_la_SOURCES) \ + $(coders_stegano_la_SOURCES) $(coders_sun_la_SOURCES) \ + $(coders_svg_la_SOURCES) $(coders_tga_la_SOURCES) \ + $(coders_thumbnail_la_SOURCES) $(coders_tiff_la_SOURCES) \ + $(coders_tile_la_SOURCES) $(coders_tim_la_SOURCES) \ + $(coders_ttf_la_SOURCES) $(coders_txt_la_SOURCES) \ + $(coders_uil_la_SOURCES) $(coders_url_la_SOURCES) \ + $(coders_uyvy_la_SOURCES) $(coders_vicar_la_SOURCES) \ + $(coders_vid_la_SOURCES) $(coders_video_la_SOURCES) \ + $(coders_viff_la_SOURCES) $(coders_vips_la_SOURCES) \ + $(coders_wbmp_la_SOURCES) $(coders_webp_la_SOURCES) \ + $(coders_wmf_la_SOURCES) $(coders_wpg_la_SOURCES) \ + $(coders_x_la_SOURCES) $(coders_xbm_la_SOURCES) \ + $(coders_xc_la_SOURCES) $(coders_xcf_la_SOURCES) \ + $(coders_xpm_la_SOURCES) $(coders_xps_la_SOURCES) \ + $(coders_xwd_la_SOURCES) $(coders_ycbcr_la_SOURCES) \ + $(coders_yuv_la_SOURCES) $(filters_analyze_la_SOURCES) \ + $(am__magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES_DIST) \ + $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES) \ + $(Magick___demo_analyze_SOURCES) \ + $(Magick___demo_button_SOURCES) $(Magick___demo_demo_SOURCES) \ + $(Magick___demo_detrans_SOURCES) $(Magick___demo_flip_SOURCES) \ + $(Magick___demo_gravity_SOURCES) \ + $(Magick___demo_piddle_SOURCES) \ + $(Magick___demo_shapes_SOURCES) $(Magick___demo_zoom_SOURCES) \ + $(Magick___tests_appendImages_SOURCES) \ + $(Magick___tests_attributes_SOURCES) \ + $(Magick___tests_averageImages_SOURCES) \ + $(Magick___tests_coalesceImages_SOURCES) \ + $(Magick___tests_coderInfo_SOURCES) \ + $(Magick___tests_color_SOURCES) \ + $(Magick___tests_colorHistogram_SOURCES) \ + $(Magick___tests_exceptions_SOURCES) \ + $(Magick___tests_montageImages_SOURCES) \ + $(Magick___tests_morphImages_SOURCES) \ + $(Magick___tests_readWriteBlob_SOURCES) \ + $(Magick___tests_readWriteImages_SOURCES) \ + $(tests_drawtest_SOURCES) $(tests_validate_SOURCES) \ + $(tests_wandtest_SOURCES) $(utilities_animate_SOURCES) \ + $(utilities_compare_SOURCES) $(utilities_composite_SOURCES) \ + $(utilities_conjure_SOURCES) $(utilities_convert_SOURCES) \ + $(utilities_display_SOURCES) $(utilities_identify_SOURCES) \ + $(utilities_import_SOURCES) $(utilities_mogrify_SOURCES) \ + $(utilities_montage_SOURCES) $(utilities_stream_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +DATA = $(configlib_DATA) $(configshare_DATA) $(configsharearch_DATA) \ + $(doc_DATA) $(pkgconfig_DATA) +am__magickppinc_HEADERS_DIST = Magick++/lib/Magick++/Blob.h \ + Magick++/lib/Magick++/ChannelMoments.h \ + Magick++/lib/Magick++/CoderInfo.h \ + Magick++/lib/Magick++/Color.h Magick++/lib/Magick++/Drawable.h \ + Magick++/lib/Magick++/Exception.h \ + Magick++/lib/Magick++/Functions.h \ + Magick++/lib/Magick++/Geometry.h Magick++/lib/Magick++/Image.h \ + Magick++/lib/Magick++/Include.h \ + Magick++/lib/Magick++/Montage.h Magick++/lib/Magick++/Pixels.h \ + Magick++/lib/Magick++/ResourceLimits.h \ + Magick++/lib/Magick++/STL.h Magick++/lib/Magick++/TypeMetric.h +am__magickpptopinc_HEADERS_DIST = Magick++/lib/Magick++.h +HEADERS = $(include_HEADERS) $(magickinc_HEADERS) \ + $(magickincarch_HEADERS) $(magickppinc_HEADERS) \ + $(magickpptopinc_HEADERS) $(noinst_HEADERS) $(wandinc_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope check recheck +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +@WITH_MAGICK_PLUS_PLUS_TRUE@am__EXEEXT_5 = \ +@WITH_MAGICK_PLUS_PLUS_TRUE@ $(MAGICKPP_TEST_SCRPTS_OPT) +am__EXEEXT_6 = +TEST_SUITE_LOG = test-suite.log +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +am__test_logs3 = $(am__test_logs2:.sh.log=.log) +SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver +SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +TEST_LOGS = $(am__test_logs3:.tap.log=.log) +TAP_LOG_COMPILE = $(TAP_LOG_COMPILER) $(AM_TAP_LOG_FLAGS) \ + $(TAP_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/ImageMagick.spec.in \ + $(srcdir)/Magick++/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/PerlMagick/Makefile.am $(srcdir)/coders/Makefile.am \ + $(srcdir)/common.shi.in $(srcdir)/config/Makefile.am \ + $(srcdir)/filters/Makefile.am $(srcdir)/m4/Makefile.am \ + $(srcdir)/magick.sh.in $(srcdir)/magick/Makefile.am \ + $(srcdir)/tests/Makefile.am $(srcdir)/utilities/Makefile.am \ + $(srcdir)/wand/Makefile.am \ + $(top_srcdir)/Magick++/bin/Magick++-config.in \ + $(top_srcdir)/Magick++/lib/ImageMagick++.pc.in \ + $(top_srcdir)/Magick++/lib/Magick++.pc.in \ + $(top_srcdir)/PerlMagick/Makefile.PL.in \ + $(top_srcdir)/PerlMagick/check.sh.in \ + $(top_srcdir)/PerlMagick/default/Magick.pm.in \ + $(top_srcdir)/PerlMagick/default/Makefile.PL.in \ + $(top_srcdir)/PerlMagick/quantum/Makefile.PL.in \ + $(top_srcdir)/PerlMagick/quantum/quantum.pm.in \ + $(top_srcdir)/PerlMagick/quantum/quantum.xs.in \ + $(top_srcdir)/PerlMagick/quantum/typemap.in \ + $(top_srcdir)/config/ImageMagick.rdf.in \ + $(top_srcdir)/config/Magick++.dox.in \ + $(top_srcdir)/config/MagickCore.dox.in \ + $(top_srcdir)/config/MagickWand.dox.in \ + $(top_srcdir)/config/ar-lib $(top_srcdir)/config/compile \ + $(top_srcdir)/config/config.guess \ + $(top_srcdir)/config/config.h.in \ + $(top_srcdir)/config/config.sub \ + $(top_srcdir)/config/configure.xml.in \ + $(top_srcdir)/config/delegates.xml.in \ + $(top_srcdir)/config/depcomp $(top_srcdir)/config/install-sh \ + $(top_srcdir)/config/ltmain.sh $(top_srcdir)/config/missing \ + $(top_srcdir)/config/mkinstalldirs \ + $(top_srcdir)/config/tap-driver.sh \ + $(top_srcdir)/config/test-driver \ + $(top_srcdir)/config/type-apple.xml.in \ + $(top_srcdir)/config/type-dejavu.xml.in \ + $(top_srcdir)/config/type-ghostscript.xml.in \ + $(top_srcdir)/config/type-urw-base35.xml.in \ + $(top_srcdir)/config/type-windows.xml.in \ + $(top_srcdir)/config/type.xml.in \ + $(top_srcdir)/magick/ImageMagick.pc.in \ + $(top_srcdir)/magick/Magick-config.in \ + $(top_srcdir)/magick/MagickCore-config.in \ + $(top_srcdir)/magick/MagickCore.pc.in \ + $(top_srcdir)/magick/version.h.in \ + $(top_srcdir)/utilities/ImageMagick.1.in \ + $(top_srcdir)/utilities/animate.1.in \ + $(top_srcdir)/utilities/compare.1.in \ + $(top_srcdir)/utilities/composite.1.in \ + $(top_srcdir)/utilities/conjure.1.in \ + $(top_srcdir)/utilities/convert.1.in \ + $(top_srcdir)/utilities/display.1.in \ + $(top_srcdir)/utilities/identify.1.in \ + $(top_srcdir)/utilities/import.1.in \ + $(top_srcdir)/utilities/mogrify.1.in \ + $(top_srcdir)/utilities/montage.1.in \ + $(top_srcdir)/utilities/stream.1.in \ + $(top_srcdir)/wand/MagickWand-config.in \ + $(top_srcdir)/wand/MagickWand.pc.in \ + $(top_srcdir)/wand/Wand-config.in \ + $(top_srcdir)/wand/Wand.pc.in config/ar-lib config/compile \ + config/config.guess config/config.sub config/depcomp \ + config/install-sh config/ltmain.sh config/missing \ + config/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).tar.lz \ + $(distdir).tar.xz $(distdir).zip +GZIP_ENV = --best +DIST_TARGETS = dist-lzip dist-xz dist-bzip2 dist-gzip dist-zip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AUTOTRACE_CFLAGS = @AUTOTRACE_CFLAGS@ +AUTOTRACE_LIBS = @AUTOTRACE_LIBS@ +AWK = @AWK@ +BIN_DIR = @BIN_DIR@ +BPGDecodeDelegate = @BPGDecodeDelegate@ +BPGEncodeDelegate = @BPGEncodeDelegate@ +BZLIB_LIBS = @BZLIB_LIBS@ +BlenderDecodeDelegate = @BlenderDecodeDelegate@ +BrowseDelegate = @BrowseDelegate@ +CAIRO_SVG_CFLAGS = @CAIRO_SVG_CFLAGS@ +CAIRO_SVG_LIBS = @CAIRO_SVG_LIBS@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCMALLOCDelegate = @CCMALLOCDelegate@ +CFLAGS = @CFLAGS@ +CODER_DIRNAME = @CODER_DIRNAME@ +CODER_PATH = @CODER_PATH@ +CONFIGURE_ARGS = @CONFIGURE_ARGS@ +CONFIGURE_DEPENDENCIES = @CONFIGURE_DEPENDENCIES@ +CONFIGURE_PATH = @CONFIGURE_PATH@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +ConvertDelegate = @ConvertDelegate@ +DATA_DIR = @DATA_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIRSEP = @DIRSEP@ +DISTCHECK_CONFIG_FLAGS = @DISTCHECK_CONFIG_FLAGS@ +DJVU_CFLAGS = @DJVU_CFLAGS@ +DJVU_LIBS = @DJVU_LIBS@ +DLLTOOL = @DLLTOOL@ +DNGDecodeDelegate = @DNGDecodeDelegate@ +DOCDecodeDelegate = @DOCDecodeDelegate@ +DOCUMENTATION_PATH = @DOCUMENTATION_PATH@ +DOC_DIR = @DOC_DIR@ +DPS_LIBS = @DPS_LIBS@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DVIDecodeDelegate = @DVIDecodeDelegate@ +DisplayDelegate = @DisplayDelegate@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXECUTABLE_PATH = @EXECUTABLE_PATH@ +EXEC_PREFIX_DIR = @EXEC_PREFIX_DIR@ +EXEEXT = @EXEEXT@ +EditorDelegate = @EditorDelegate@ +FFTW_CFLAGS = @FFTW_CFLAGS@ +FFTW_LIBS = @FFTW_LIBS@ +FGREP = @FGREP@ +FILTER_DIRNAME = @FILTER_DIRNAME@ +FILTER_PATH = @FILTER_PATH@ +FLIF_LIBS = @FLIF_LIBS@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FPX_LIBS = @FPX_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GDI32_LIBS = @GDI32_LIBS@ +GOMP_LIBS = @GOMP_LIBS@ +GREP = @GREP@ +GSAlphaDevice = @GSAlphaDevice@ +GSCMYKDevice = @GSCMYKDevice@ +GSColorDevice = @GSColorDevice@ +GSEPSDevice = @GSEPSDevice@ +GSMonoDevice = @GSMonoDevice@ +GSPDFDevice = @GSPDFDevice@ +GSPSDevice = @GSPSDevice@ +GSVersion = @GSVersion@ +GS_LIBS = @GS_LIBS@ +GVCDecodeDelegate = @GVCDecodeDelegate@ +GVC_CFLAGS = @GVC_CFLAGS@ +GVC_LIBS = @GVC_LIBS@ +HEIF_CFLAGS = @HEIF_CFLAGS@ +HEIF_LIBS = @HEIF_LIBS@ +HPGLDecodeDelegate = @HPGLDecodeDelegate@ +HTMLDecodeDelegate = @HTMLDecodeDelegate@ +ILBMDecodeDelegate = @ILBMDecodeDelegate@ +ILBMEncodeDelegate = @ILBMEncodeDelegate@ +INCLUDEARCH_DIR = @INCLUDEARCH_DIR@ +INCLUDEARCH_PATH = @INCLUDEARCH_PATH@ +INCLUDE_DIR = @INCLUDE_DIR@ +INCLUDE_PATH = @INCLUDE_PATH@ +INFO_DIR = @INFO_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JBIG_LIBS = @JBIG_LIBS@ +JEMALLOC_LIBS = @JEMALLOC_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +JXL_LIBS = @JXL_LIBS@ +JXRDecodeDelegate = @JXRDecodeDelegate@ +JXREncodeDelegate = @JXREncodeDelegate@ +LCMS2_CFLAGS = @LCMS2_CFLAGS@ +LCMS2_LIBS = @LCMS2_LIBS@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEPDelegate = @LEPDelegate@ +LFS_CPPFLAGS = @LFS_CPPFLAGS@ +LIBEXEC_DIR = @LIBEXEC_DIR@ +LIBOBJS = @LIBOBJS@ +LIBOPENJP2_CFLAGS = @LIBOPENJP2_CFLAGS@ +LIBOPENJP2_LIBS = @LIBOPENJP2_LIBS@ +LIBRARY_EXTRA_CPPFLAGS = @LIBRARY_EXTRA_CPPFLAGS@ +LIBRARY_PATH = @LIBRARY_PATH@ +LIBS = @LIBS@ +LIBSTDCLDFLAGS = @LIBSTDCLDFLAGS@ +LIBTOOL = @LIBTOOL@ + +# Automagically reconfigure libtool +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIBZSTD_CFLAGS = @LIBZSTD_CFLAGS@ +LIBZSTD_LIBS = @LIBZSTD_LIBS@ +LIB_BIN_BASEDIRNAME = @LIB_BIN_BASEDIRNAME@ +LIB_BIN_DIR = @LIB_BIN_DIR@ +LIB_BIN_DIR_PATH = @LIB_BIN_DIR_PATH@ +LIB_BIN_DIR_RELATIVE_PATH = @LIB_BIN_DIR_RELATIVE_PATH@ +LIB_DIR = @LIB_DIR@ +LIB_DL = @LIB_DL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALSTATE_DIR = @LOCALSTATE_DIR@ +LPDelegate = @LPDelegate@ +LPRDelegate = @LPRDelegate@ +LQR_CFLAGS = @LQR_CFLAGS@ +LQR_LIBS = @LQR_LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +LZMA_CFLAGS = @LZMA_CFLAGS@ +LZMA_LIBS = @LZMA_LIBS@ +LaunchDelegate = @LaunchDelegate@ +MAGICKCORE_FREETYPE_DELEGATE = @MAGICKCORE_FREETYPE_DELEGATE@ +MAGICKCORE_PATH = @MAGICKCORE_PATH@ +MAGICKPP_LIBRARY_AGE = @MAGICKPP_LIBRARY_AGE@ +MAGICKPP_LIBRARY_CURRENT = @MAGICKPP_LIBRARY_CURRENT@ +MAGICKPP_LIBRARY_CURRENT_MIN = @MAGICKPP_LIBRARY_CURRENT_MIN@ +MAGICKPP_LIBRARY_REVISION = @MAGICKPP_LIBRARY_REVISION@ +MAGICKPP_LIBRARY_VERSION_INFO = @MAGICKPP_LIBRARY_VERSION_INFO@ +MAGICKPP_LIB_VERSION = @MAGICKPP_LIB_VERSION@ +MAGICKPP_LIB_VERSION_TEXT = @MAGICKPP_LIB_VERSION_TEXT@ +MAGICK_ABI_SUFFIX = @MAGICK_ABI_SUFFIX@ +MAGICK_CFLAGS = @MAGICK_CFLAGS@ +MAGICK_CODER_MODULE_PATH = @MAGICK_CODER_MODULE_PATH@ +MAGICK_CONFIGURE_BUILD_PATH = @MAGICK_CONFIGURE_BUILD_PATH@ +MAGICK_CONFIGURE_SRC_PATH = @MAGICK_CONFIGURE_SRC_PATH@ +MAGICK_CPPFLAGS = @MAGICK_CPPFLAGS@ +MAGICK_CXXFLAGS = @MAGICK_CXXFLAGS@ +MAGICK_DELEGATES = @MAGICK_DELEGATES@ +MAGICK_DEP_LIBS = @MAGICK_DEP_LIBS@ +MAGICK_EXTRA_DEP_LIBS = @MAGICK_EXTRA_DEP_LIBS@ +MAGICK_FEATURES = @MAGICK_FEATURES@ +MAGICK_FILTER_MODULE_PATH = @MAGICK_FILTER_MODULE_PATH@ +MAGICK_GIT_REVISION = @MAGICK_GIT_REVISION@ +MAGICK_HDRI = @MAGICK_HDRI@ +MAGICK_LDFLAGS = @MAGICK_LDFLAGS@ +MAGICK_LIBRARY_AGE = @MAGICK_LIBRARY_AGE@ +MAGICK_LIBRARY_CURRENT = @MAGICK_LIBRARY_CURRENT@ +MAGICK_LIBRARY_CURRENT_MIN = @MAGICK_LIBRARY_CURRENT_MIN@ +MAGICK_LIBRARY_REVISION = @MAGICK_LIBRARY_REVISION@ +MAGICK_LIBRARY_VERSION_INFO = @MAGICK_LIBRARY_VERSION_INFO@ +MAGICK_LIBS = @MAGICK_LIBS@ +MAGICK_LIB_VERSION = @MAGICK_LIB_VERSION@ +MAGICK_LIB_VERSION_NUMBER = @MAGICK_LIB_VERSION_NUMBER@ +MAGICK_LIB_VERSION_TEXT = @MAGICK_LIB_VERSION_TEXT@ +MAGICK_LT_RELEASE_OPTS = @MAGICK_LT_RELEASE_OPTS@ +MAGICK_MAJOR_VERSION = @MAGICK_MAJOR_VERSION@ +MAGICK_MICRO_VERSION = @MAGICK_MICRO_VERSION@ +MAGICK_MINOR_VERSION = @MAGICK_MINOR_VERSION@ +MAGICK_PATCHLEVEL_VERSION = @MAGICK_PATCHLEVEL_VERSION@ +MAGICK_PCFLAGS = @MAGICK_PCFLAGS@ +MAGICK_TARGET_CPU = @MAGICK_TARGET_CPU@ +MAGICK_TARGET_OS = @MAGICK_TARGET_OS@ +MAGICK_TARGET_VENDOR = @MAGICK_TARGET_VENDOR@ +MAGICK_VERSION = @MAGICK_VERSION@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAN_DIR = @MAN_DIR@ +MATH_LIBS = @MATH_LIBS@ +MKDIR_P = @MKDIR_P@ +MODULES_BASEDIRNAME = @MODULES_BASEDIRNAME@ +MODULES_DIRNAME = @MODULES_DIRNAME@ +MODULES_PATH = @MODULES_PATH@ +MODULES_RELATIVE_PATH = @MODULES_RELATIVE_PATH@ +MODULE_EXTRA_CPPFLAGS = @MODULE_EXTRA_CPPFLAGS@ +MVDelegate = @MVDelegate@ +MogrifyDelegate = @MogrifyDelegate@ +MrSIDDecodeDelegate = @MrSIDDecodeDelegate@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_CFLAGS = @OPENEXR_CFLAGS@ +OPENEXR_LIBS = @OPENEXR_LIBS@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@ +OSX_GCOV_LDFLAG = @OSX_GCOV_LDFLAG@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +P7ZIP = @P7ZIP@ +PACKAGE = @PACKAGE@ +PACKAGE_BASE_VERSION = @PACKAGE_BASE_VERSION@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_LIB_VERSION = @PACKAGE_LIB_VERSION@ +PACKAGE_LIB_VERSION_NUMBER = @PACKAGE_LIB_VERSION_NUMBER@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_PATCHLEVEL_VERSION = @PACKAGE_PATCHLEVEL_VERSION@ +PACKAGE_RELEASE_DATE = @PACKAGE_RELEASE_DATE@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_ADDENDUM = @PACKAGE_VERSION_ADDENDUM@ +PANGO_CFLAGS = @PANGO_CFLAGS@ +PANGO_LIBS = @PANGO_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PCLCMYKDevice = @PCLCMYKDevice@ +PCLColorDevice = @PCLColorDevice@ +PCLDelegate = @PCLDelegate@ +PCLMonoDevice = @PCLMonoDevice@ +PCLVersion = @PCLVersion@ +PERL = @PERL@ +PERLMAINCC = @PERLMAINCC@ +PERL_MAKE_OPTIONS = @PERL_MAKE_OPTIONS@ +PERL_SUPPORTS_DESTDIR = @PERL_SUPPORTS_DESTDIR@ +PERL_VERSION = @PERL_VERSION@ +PERSISTINCLUDE_DIR = @PERSISTINCLUDE_DIR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +POW_LIB = @POW_LIB@ +PREFIX_DIR = @PREFIX_DIR@ +PRTDIAG = @PRTDIAG@ +PSDelegate = @PSDelegate@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +PrintDelegate = @PrintDelegate@ +QUANTUM_DEPTH = @QUANTUM_DEPTH@ +RANLIB = @RANLIB@ +RAQM_CFLAGS = @RAQM_CFLAGS@ +RAQM_LIBS = @RAQM_LIBS@ +RAW_R_CFLAGS = @RAW_R_CFLAGS@ +RAW_R_LIBS = @RAW_R_LIBS@ +RMDelegate = @RMDelegate@ +RPM = @RPM@ +RSVGDecodeDelegate = @RSVGDecodeDelegate@ +RSVG_CFLAGS = @RSVG_CFLAGS@ +RSVG_LIBS = @RSVG_LIBS@ +SBIN_DIR = @SBIN_DIR@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAREARCH_BASEDIRNAME = @SHAREARCH_BASEDIRNAME@ +SHAREARCH_DIR = @SHAREARCH_DIR@ +SHAREARCH_DIRNAME = @SHAREARCH_DIRNAME@ +SHAREARCH_PATH = @SHAREARCH_PATH@ +SHAREARCH_RELATIVE_PATH = @SHAREARCH_RELATIVE_PATH@ +SHAREDSTATE_DIR = @SHAREDSTATE_DIR@ +SHARE_PATH = @SHARE_PATH@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVGDecodeDelegate = @SVGDecodeDelegate@ +SYSCONF_DIR = @SYSCONF_DIR@ +ShowImageDelegate = @ShowImageDelegate@ +TAR = @TAR@ +TCMALLOC_LIBS = @TCMALLOC_LIBS@ +THREAD_LIBS = @THREAD_LIBS@ +TIFF_LIBS = @TIFF_LIBS@ +TextEncodeDelegate = @TextEncodeDelegate@ +TraceEncodeDelegate = @TraceEncodeDelegate@ +UMEM_LIBS = @UMEM_LIBS@ +VERSION = @VERSION@ +VIDEODecodeDelegate = @VIDEODecodeDelegate@ +VIDEOEncodeDelegate = @VIDEOEncodeDelegate@ +WEBPMUX_CFLAGS = @WEBPMUX_CFLAGS@ +WEBPMUX_LIBS = @WEBPMUX_LIBS@ +WEBP_CFLAGS = @WEBP_CFLAGS@ +WEBP_LIBS = @WEBP_LIBS@ +WMF_CFLAGS = @WMF_CFLAGS@ +WMF_LIBS = @WMF_LIBS@ +WWWDecodeDelegate = @WWWDecodeDelegate@ +WebPDecodeDelegate = @WebPDecodeDelegate@ +WebPEncodeDelegate = @WebPEncodeDelegate@ +WinPathScript = @WinPathScript@ +X11_LIBS = @X11_LIBS@ +XEXT_LIBS = @XEXT_LIBS@ +XMKMF = @XMKMF@ +XML_CFLAGS = @XML_CFLAGS@ +XML_LIBS = @XML_LIBS@ +XPSCMYKDevice = @XPSCMYKDevice@ +XPSColorDevice = @XPSColorDevice@ +XPSDelegate = @XPSDelegate@ +XPSMonoDevice = @XPSMonoDevice@ +XPSVersion = @XPSVersion@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZIP = @ZIP@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +ZSTD_CFLAGS = @ZSTD_CFLAGS@ +ZSTD_LIBS = @ZSTD_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +apple_font_dir = @apple_font_dir@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +ddjvuapi_CFLAGS = @ddjvuapi_CFLAGS@ +ddjvuapi_LIBS = @ddjvuapi_LIBS@ +dejavu_font_dir = @dejavu_font_dir@ + +# Architecture independent data files installed in the package's data directory +docdir = $(DOCUMENTATION_PATH) +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +fftw3_CFLAGS = @fftw3_CFLAGS@ +fftw3_LIBS = @fftw3_LIBS@ +ghostscript_font_dir = @ghostscript_font_dir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ + +# Pkgconfig directory +pkgconfigdir = $(libdir)/pkgconfig +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +type_include_files = @type_include_files@ +urw_base35_font_dir = @urw_base35_font_dir@ +windows_font_dir = @windows_font_dir@ +topincludedir = @includedir@/magick +AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) +ACLOCAL_AMFLAGS = -I m4 +MODULECOMMONFLAGS = -no-undefined -export-symbols-regex ".*" -shared -module -avoid-version +MODULECOMMONCPPFLAGS = $(AM_CPPFLAGS) + +# Options to pass when running configure in the distcheck target. +# +# We want to preserve user-provided option variables so the same +# compiler, headers, and libraries are used as for a normal build. +DISTCHECK_CONFIGURE_FLAGS = $(DISTCHECK_CONFIG_FLAGS) +DISTCLEANFILES = _configs.sed magick/magick-baseconfig.h +CLEANFILES = $(WAND_CLEANFILES) $(MAGICKPP_CLEANFILES) \ + $(UTILITIES_CLEANFILES) $(TESTS_CLEANFILES) $(am__append_2) + +# Binary scripts +bin_SCRIPTS = \ + $(MAGICK_BIN_SCRPTS) \ + $(WAND_BIN_SCRPTS) \ + $(MAGICKPP_SCRPTS) + +include_HEADERS = + +# Headers which are not installed but which are distributed +noinst_HEADERS = \ + $(MAGICK_NOINST_HDRS) + +@WIN32_NATIVE_BUILD_FALSE@SRCDIR = "$(srcdir)/" +@WIN32_NATIVE_BUILD_TRUE@SRCDIR = '$(shell @WinPathScript@ $(srcdir)/)' + +# Tests with .tap extensions use the TAP protocol and TAP driver +LOG_COMPILER = $(SHELL) +SH_LOG_COMPILER = $(LOG_COMPILER) +TAP_LOG_COMPILER = $(LOG_COMPILER) + +# Test extensions +TEST_EXTENSIONS = .sh .tap +TAP_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \ + $(top_srcdir)/config/tap-driver.sh + + +# Environment parameters to be used during tests +TESTS_ENVIRONMENT = \ + MAKE="$(MAKE)" \ + MAKEFLAGS="$(MAKEFLAGS)" \ + MEMCHECK="$(MEMCHECK)" + +TOP_EXTRA_DIST = \ + AUTHORS.txt \ + ChangeLog.md \ + LICENSE \ + QuickStart.txt \ + NOTICE \ + Install-mac.txt \ + Install-unix.txt \ + Install-vms.txt \ + Install-windows.txt \ + magick.sh.in \ + Magickshr.opt \ + NEWS.txt \ + README.txt \ + index.html \ + winpath.sh + + +# Additional files to distribute +EXTRA_DIST = \ + $(TOP_EXTRA_DIST) \ + $(CONFIG_EXTRA_DIST) \ + $(MAGICK_EXTRA_DIST) \ + $(WAND_EXTRA_DIST) \ + $(MAGICKPP_EXTRA_DIST) \ + $(UTILITIES_EXTRA_DIST) \ + $(TESTS_EXTRA_DIST) + +lib_LTLIBRARIES = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(MAGICKPP_LIBS) +AM_LDFLAGS = +noinst_LTLIBRARIES = +EXTRA_LTLIBRARIES = +BUILT_SOURCES = +MOSTLYCLEANFILES = +M4_EXTRA_DIST = \ + ac_func_fseeko.m4 \ + ax_append_flag.m4 \ + ax_c___attribute__.m4 \ + ax_cflags_warn_all.m4 \ + ax_check_framework.m4 \ + ax_compare_version.m4 \ + ax_cxx_bool.m4 \ + ax_cxx_namespaces.m4 \ + ax_cxx_namespace_std.m4 \ + ax_lang_compiler_ms.m4 \ + ax_have_opencl.m4 \ + ax_prefix_config_h.m4 \ + ax_prog_perl_version.m4 \ + ax_pthread.m4 \ + ax_require_defined.m4 \ + cxx_have_lstring.m4 \ + cxx_have_std_libs.m4 \ + framework.m4 \ + libtool.m4 \ + lt~obsolete.m4 \ + ltoptions.m4 \ + ltsugar.m4 \ + ltversion.m4 \ + magick_check_pthread_lib.m4 \ + pkg.m4 \ + version.m4 + + +# Where architecture-independent configuration files get installed +# (share/ImageMagick-version) +configsharedir = $(SHARE_PATH) +configshare_DATA = \ + config/english.xml \ + config/francais.xml \ + config/locale.xml + + +# Where architecture-dependent configuration files get installed +# (share/arch/ImageMagick-version) +configsharearchdir = $(SHAREARCH_PATH) +configsharearch_DATA = \ + config/configure.xml + + +# Where architecture-dependent configuration files get installed +# (share/ImageMagick-version) +configlibdir = $(CONFIGURE_PATH) +configlib_DATA = \ + config/coder.xml \ + config/colors.xml \ + config/delegates.xml \ + config/log.xml \ + config/magic.xml \ + config/mime.xml \ + config/policy.xml \ + config/quantization-table.xml \ + config/thresholds.xml \ + config/type.xml \ + config/type-apple.xml \ + config/type-dejavu.xml \ + config/type-ghostscript.xml \ + config/type-urw-base35.xml \ + config/type-windows.xml + +CONFIG_EXTRA_DIST = \ + config/cmyk.icm \ + config/coder.xml \ + config/colors.xml \ + config/config.h.in \ + config/delegates.xml.in \ + config/english.xml \ + config/francais.xml \ + config/ImageMagick.rc \ + config/ImageMagick.rdf.in \ + config/install-sh \ + config/lndir.sh \ + config/locale.md \ + config/locale.xml \ + config/log.xml \ + config/magic.xml \ + config/mime.xml \ + config/policy.xml \ + config/quantization-table.xml \ + config/sRGB.icm \ + config/thresholds.xml \ + config/type-apple.xml.in \ + config/type-dejavu.xml.in \ + config/type-ghostscript.xml.in \ + config/type-urw-base35.xml.in \ + config/type-windows.xml.in \ + config/type.xml.in + + +# Where coder modules get installed +codersdir = $(CODER_PATH) +@DPS_DELEGATE_TRUE@MAGICK_DPS_MODULES = coders/dps.la +@DPS_DELEGATE_TRUE@MAGICK_DPS_SRCS = coders/dps.c +@DJVU_DELEGATE_TRUE@MAGICK_DJVU_MODULES = coders/djvu.la +@DJVU_DELEGATE_TRUE@MAGICK_DJVU_SRCS = coders/djvu.c +@OPENEXR_DELEGATE_TRUE@MAGICK_EXR_MODULES = coders/exr.la +@OPENEXR_DELEGATE_TRUE@MAGICK_EXR_SRCS = coders/exr.c +@FLIF_DELEGATE_TRUE@MAGICK_FLIF_MODULES = coders/flif.la +@FLIF_DELEGATE_TRUE@MAGICK_FLIF_SRCS = coders/flif.c +@FPX_DELEGATE_TRUE@MAGICK_FPX_MODULES = coders/fpx.la +@FPX_DELEGATE_TRUE@MAGICK_FPX_SRCS = coders/fpx.c +@HEIC_DELEGATE_TRUE@MAGICK_HEIC_MODULES = coders/heic.la +@HEIC_DELEGATE_TRUE@MAGICK_HEIC_SRCS = coders/heic.c +@JBIG_DELEGATE_TRUE@MAGICK_JBIG_MODULES = coders/jbig.la +@JBIG_DELEGATE_TRUE@MAGICK_JBIG_SRCS = coders/jbig.c +@JPEG_DELEGATE_TRUE@MAGICK_JPEG_MODULES = coders/jpeg.la +@JPEG_DELEGATE_TRUE@MAGICK_JPEG_SRCS = coders/jpeg.c +@LIBOPENJP2_DELEGATE_TRUE@MAGICK_JP2_MODULES = coders/jp2.la +@LIBOPENJP2_DELEGATE_TRUE@MAGICK_JP2_SRCS = coders/jp2.c +@PNG_DELEGATE_TRUE@MAGICK_PNG_MODULES = coders/png.la +@PNG_DELEGATE_TRUE@MAGICK_PNG_SRCS = coders/png.c +@TIFF_DELEGATE_TRUE@MAGICK_TIFF_MODULES = coders/ept.la coders/tiff.la +@TIFF_DELEGATE_TRUE@MAGICK_TIFF_SRCS = coders/ept.c coders/tiff.c +@WEBP_DELEGATE_TRUE@MAGICK_WEBP_MODULES = coders/webp.la +@WEBP_DELEGATE_TRUE@MAGICK_WEBP_SRCS = coders/webp.c +@WINGDI32_DELEGATE_TRUE@MAGICK_GDI32_MODULES = coders/clipboard.la coders/emf.la +@WINGDI32_DELEGATE_TRUE@MAGICK_GDI32_SRCS = coders/clipboard.c coders/emf.c +@WMF_DELEGATE_TRUE@MAGICK_WMF_MODULES = coders/wmf.la +@WMF_DELEGATE_TRUE@MAGICK_WMF_SRCS = coders/wmf.c +@X11_DELEGATE_TRUE@MAGICK_X11_MODULES = coders/x.la coders/xwd.la +@X11_DELEGATE_TRUE@MAGICK_X11_SRCS = coders/x.c coders/xwd.c +MAGICK_CODER_CPPFLAGS = \ + $(MODULECOMMONCPPFLAGS) \ + $(MODULE_EXTRA_CPPFLAGS) + +MAGICK_CODER_SRCS = \ + coders/aai.c \ + coders/art.c \ + coders/avs.c \ + coders/bgr.c \ + coders/bmp.c \ + coders/braille.c \ + coders/bytebuffer-private.h \ + coders/cals.c \ + coders/caption.c \ + coders/cin.c \ + coders/cip.c \ + coders/clip.c \ + coders/cmyk.c \ + coders/cut.c \ + coders/dcm.c \ + coders/dds.c \ + coders/debug.c \ + coders/dib.c \ + coders/dng.c \ + coders/dot.c \ + coders/dpx.c \ + coders/fax.c \ + coders/fits.c \ + coders/ghostscript-private.h \ + coders/gif.c \ + coders/gradient.c \ + coders/gray.c \ + coders/hald.c \ + coders/hdr.c \ + coders/histogram.c \ + coders/hrz.c \ + coders/html.c \ + coders/icon.c \ + coders/info.c \ + coders/inline.c \ + coders/ipl.c \ + coders/jnx.c \ + coders/json.c \ + coders/label.c \ + coders/mac.c \ + coders/magick.c \ + coders/map.c \ + coders/mask.c \ + coders/mat.c \ + coders/matte.c \ + coders/meta.c \ + coders/miff.c \ + coders/mono.c \ + coders/mpc.c \ + coders/mpr.c \ + coders/msl.c \ + coders/mtv.c \ + coders/mvg.c \ + coders/null.c \ + coders/otb.c \ + coders/palm.c \ + coders/pango.c \ + coders/pattern.c \ + coders/pcd.c \ + coders/pcl.c \ + coders/pcx.c \ + coders/pdb.c \ + coders/pdf.c \ + coders/pes.c \ + coders/pgx.c \ + coders/pict.c \ + coders/pix.c \ + coders/plasma.c \ + coders/pnm.c \ + coders/preview.c \ + coders/ps.c \ + coders/ps2.c \ + coders/ps3.c \ + coders/psd.c \ + coders/psd-private.h \ + coders/pwp.c \ + coders/raw.c \ + coders/rgb.c \ + coders/rgf.c \ + coders/rla.c \ + coders/rle.c \ + coders/scr.c \ + coders/screenshot.c \ + coders/sct.c \ + coders/sfw.c \ + coders/sgi.c \ + coders/sixel.c \ + coders/stegano.c \ + coders/sun.c \ + coders/svg.c \ + coders/tga.c \ + coders/thumbnail.c \ + coders/tile.c \ + coders/tim.c \ + coders/ttf.c \ + coders/txt.c \ + coders/uil.c \ + coders/url.c \ + coders/uyvy.c \ + coders/vicar.c \ + coders/vid.c \ + coders/video.c \ + coders/viff.c \ + coders/vips.c \ + coders/wbmp.c \ + coders/wpg.c \ + coders/xbm.c \ + coders/xc.c \ + coders/xcf.c \ + coders/xpm.c \ + coders/xps.c \ + coders/ycbcr.c \ + coders/yuv.c \ + $(MAGICK_DPS_SRCS) \ + $(MAGICK_DJVU_SRCS) \ + $(MAGICK_EXR_SRCS) \ + $(MAGICK_FLIF_SRCS) \ + $(MAGICK_FPX_SRCS) \ + $(MAGICK_GDI32_SRCS) \ + $(MAGICK_HEIC_SRCS) \ + $(MAGICK_JBIG_SRCS) \ + $(MAGICK_JPEG_SRCS) \ + $(MAGICK_JP2_SRCS) \ + $(MAGICK_PNG_SRCS) \ + $(MAGICK_TIFF_SRCS) \ + $(MAGICK_WEBP_SRCS) \ + $(MAGICK_WMF_SRCS) \ + $(MAGICK_X11_SRCS) + +CODERS_NOINST_HDRS = \ + coders/bytebuffer-private.h \ + coders/ghostscript-private.h + +@WITH_MODULES_FALSE@coders_LTLIBRARIES = +@WITH_MODULES_TRUE@coders_LTLIBRARIES = \ +@WITH_MODULES_TRUE@ coders/aai.la \ +@WITH_MODULES_TRUE@ coders/art.la \ +@WITH_MODULES_TRUE@ coders/avs.la \ +@WITH_MODULES_TRUE@ coders/bgr.la \ +@WITH_MODULES_TRUE@ coders/bmp.la \ +@WITH_MODULES_TRUE@ coders/braille.la \ +@WITH_MODULES_TRUE@ coders/cals.la \ +@WITH_MODULES_TRUE@ coders/caption.la \ +@WITH_MODULES_TRUE@ coders/cin.la \ +@WITH_MODULES_TRUE@ coders/cip.la \ +@WITH_MODULES_TRUE@ coders/clip.la \ +@WITH_MODULES_TRUE@ coders/cmyk.la \ +@WITH_MODULES_TRUE@ coders/cut.la \ +@WITH_MODULES_TRUE@ coders/dcm.la \ +@WITH_MODULES_TRUE@ coders/dds.la \ +@WITH_MODULES_TRUE@ coders/debug.la \ +@WITH_MODULES_TRUE@ coders/dib.la \ +@WITH_MODULES_TRUE@ coders/dng.la \ +@WITH_MODULES_TRUE@ coders/dot.la \ +@WITH_MODULES_TRUE@ coders/dpx.la \ +@WITH_MODULES_TRUE@ coders/fax.la \ +@WITH_MODULES_TRUE@ coders/fits.la \ +@WITH_MODULES_TRUE@ coders/gif.la \ +@WITH_MODULES_TRUE@ coders/gradient.la \ +@WITH_MODULES_TRUE@ coders/gray.la \ +@WITH_MODULES_TRUE@ coders/hald.la \ +@WITH_MODULES_TRUE@ coders/hdr.la \ +@WITH_MODULES_TRUE@ coders/histogram.la \ +@WITH_MODULES_TRUE@ coders/hrz.la \ +@WITH_MODULES_TRUE@ coders/html.la \ +@WITH_MODULES_TRUE@ coders/icon.la \ +@WITH_MODULES_TRUE@ coders/info.la \ +@WITH_MODULES_TRUE@ coders/inline.la \ +@WITH_MODULES_TRUE@ coders/ipl.la \ +@WITH_MODULES_TRUE@ coders/jnx.la \ +@WITH_MODULES_TRUE@ coders/json.la \ +@WITH_MODULES_TRUE@ coders/label.la \ +@WITH_MODULES_TRUE@ coders/mac.la \ +@WITH_MODULES_TRUE@ coders/magick.la \ +@WITH_MODULES_TRUE@ coders/map.la \ +@WITH_MODULES_TRUE@ coders/mask.la \ +@WITH_MODULES_TRUE@ coders/mat.la \ +@WITH_MODULES_TRUE@ coders/matte.la \ +@WITH_MODULES_TRUE@ coders/meta.la \ +@WITH_MODULES_TRUE@ coders/miff.la \ +@WITH_MODULES_TRUE@ coders/mono.la \ +@WITH_MODULES_TRUE@ coders/mpc.la \ +@WITH_MODULES_TRUE@ coders/mpr.la \ +@WITH_MODULES_TRUE@ coders/msl.la \ +@WITH_MODULES_TRUE@ coders/mtv.la \ +@WITH_MODULES_TRUE@ coders/mvg.la \ +@WITH_MODULES_TRUE@ coders/null.la \ +@WITH_MODULES_TRUE@ coders/otb.la \ +@WITH_MODULES_TRUE@ coders/palm.la \ +@WITH_MODULES_TRUE@ coders/pango.la \ +@WITH_MODULES_TRUE@ coders/pattern.la \ +@WITH_MODULES_TRUE@ coders/pcd.la \ +@WITH_MODULES_TRUE@ coders/pcl.la \ +@WITH_MODULES_TRUE@ coders/pcx.la \ +@WITH_MODULES_TRUE@ coders/pdb.la \ +@WITH_MODULES_TRUE@ coders/pdf.la \ +@WITH_MODULES_TRUE@ coders/pes.la \ +@WITH_MODULES_TRUE@ coders/pgx.la \ +@WITH_MODULES_TRUE@ coders/pict.la \ +@WITH_MODULES_TRUE@ coders/pix.la \ +@WITH_MODULES_TRUE@ coders/plasma.la \ +@WITH_MODULES_TRUE@ coders/pnm.la \ +@WITH_MODULES_TRUE@ coders/preview.la \ +@WITH_MODULES_TRUE@ coders/ps.la \ +@WITH_MODULES_TRUE@ coders/ps2.la \ +@WITH_MODULES_TRUE@ coders/ps3.la \ +@WITH_MODULES_TRUE@ coders/psd.la \ +@WITH_MODULES_TRUE@ coders/pwp.la \ +@WITH_MODULES_TRUE@ coders/raw.la \ +@WITH_MODULES_TRUE@ coders/rgb.la \ +@WITH_MODULES_TRUE@ coders/rgf.la \ +@WITH_MODULES_TRUE@ coders/rla.la \ +@WITH_MODULES_TRUE@ coders/rle.la \ +@WITH_MODULES_TRUE@ coders/scr.la \ +@WITH_MODULES_TRUE@ coders/sct.la \ +@WITH_MODULES_TRUE@ coders/sfw.la \ +@WITH_MODULES_TRUE@ coders/sgi.la \ +@WITH_MODULES_TRUE@ coders/sixel.la \ +@WITH_MODULES_TRUE@ coders/stegano.la \ +@WITH_MODULES_TRUE@ coders/sun.la \ +@WITH_MODULES_TRUE@ coders/svg.la \ +@WITH_MODULES_TRUE@ coders/tga.la \ +@WITH_MODULES_TRUE@ coders/thumbnail.la \ +@WITH_MODULES_TRUE@ coders/tile.la \ +@WITH_MODULES_TRUE@ coders/tim.la \ +@WITH_MODULES_TRUE@ coders/ttf.la \ +@WITH_MODULES_TRUE@ coders/txt.la \ +@WITH_MODULES_TRUE@ coders/uil.la \ +@WITH_MODULES_TRUE@ coders/url.la \ +@WITH_MODULES_TRUE@ coders/uyvy.la \ +@WITH_MODULES_TRUE@ coders/vicar.la \ +@WITH_MODULES_TRUE@ coders/vid.la \ +@WITH_MODULES_TRUE@ coders/video.la \ +@WITH_MODULES_TRUE@ coders/viff.la \ +@WITH_MODULES_TRUE@ coders/vips.la \ +@WITH_MODULES_TRUE@ coders/wbmp.la \ +@WITH_MODULES_TRUE@ coders/wpg.la \ +@WITH_MODULES_TRUE@ coders/xbm.la \ +@WITH_MODULES_TRUE@ coders/xc.la \ +@WITH_MODULES_TRUE@ coders/xcf.la \ +@WITH_MODULES_TRUE@ coders/xpm.la \ +@WITH_MODULES_TRUE@ coders/xps.la \ +@WITH_MODULES_TRUE@ coders/ycbcr.la \ +@WITH_MODULES_TRUE@ coders/yuv.la \ +@WITH_MODULES_TRUE@ $(MAGICK_DPS_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_DJVU_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_EXR_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_FLIF_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_FPX_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_GDI32_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_HEIC_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_JBIG_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_JPEG_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_JP2_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_PNG_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_TIFF_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_WEBP_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_WMF_MODULES) \ +@WITH_MODULES_TRUE@ $(MAGICK_X11_MODULES) + + +# AAI coder module +coders_aai_la_SOURCES = coders/aai.c +coders_aai_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_aai_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_aai_la_LIBADD = $(MAGICKCORE_LIBS) + +# ART coder module +coders_art_la_SOURCES = coders/art.c +coders_art_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_art_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_art_la_LIBADD = $(MAGICKCORE_LIBS) + +# AVS coder module +coders_avs_la_SOURCES = coders/avs.c +coders_avs_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_avs_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_avs_la_LIBADD = $(MAGICKCORE_LIBS) + +# BRG coder module +coders_bgr_la_SOURCES = coders/bgr.c +coders_bgr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_bgr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_bgr_la_LIBADD = $(MAGICKCORE_LIBS) + +# BMP coder module +coders_bmp_la_SOURCES = coders/bmp.c +coders_bmp_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_bmp_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_bmp_la_LIBADD = $(MAGICKCORE_LIBS) + +# BRAILLE coder module +coders_braille_la_SOURCES = coders/braille.c +coders_braille_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_braille_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_braille_la_LIBADD = $(MAGICKCORE_LIBS) + +# CALS coder module +coders_cals_la_SOURCES = coders/cals.c +coders_cals_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_cals_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_cals_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# CAPTION coder module +coders_caption_la_SOURCES = coders/caption.c +coders_caption_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_caption_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_caption_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# CINEON coder module +coders_cin_la_SOURCES = coders/cin.c +coders_cin_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_cin_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_cin_la_LIBADD = $(MAGICKCORE_LIBS) + +# CIP coder module +coders_cip_la_SOURCES = coders/cip.c +coders_cip_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_cip_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_cip_la_LIBADD = $(MAGICKCORE_LIBS) + +# CLIP coder module +coders_clip_la_SOURCES = coders/clip.c +coders_clip_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_clip_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_clip_la_LIBADD = $(MAGICKCORE_LIBS) + +# CLIPBOARD coder module +coders_clipboard_la_SOURCES = coders/clipboard.c +coders_clipboard_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_clipboard_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_clipboard_la_LIBADD = $(MAGICKCORE_LIBS) $(GDI32_LIBS) + +# CMYK coder module +coders_cmyk_la_SOURCES = coders/cmyk.c +coders_cmyk_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_cmyk_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_cmyk_la_LIBADD = $(MAGICKCORE_LIBS) + +# CUT coder module +coders_cut_la_SOURCES = coders/cut.c +coders_cut_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_cut_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_cut_la_LIBADD = $(MAGICKCORE_LIBS) + +# DCM coder module +coders_dcm_la_SOURCES = coders/dcm.c +coders_dcm_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dcm_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dcm_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# DDS coder module +coders_dds_la_SOURCES = coders/dds.c +coders_dds_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dds_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dds_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# DEBUG coder module +coders_debug_la_SOURCES = coders/debug.c +coders_debug_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_debug_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_debug_la_LIBADD = $(MAGICKCORE_LIBS) + +# DIB coder module +coders_dib_la_SOURCES = coders/dib.c +coders_dib_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dib_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dib_la_LIBADD = $(MAGICKCORE_LIBS) + +# DJVU coder module +coders_djvu_la_SOURCES = coders/djvu.c +coders_djvu_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_djvu_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_djvu_la_LIBADD = $(MAGICKCORE_LIBS) $(DJVU_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# DNG coder module +coders_dng_la_SOURCES = coders/dng.c +coders_dng_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dng_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dng_la_LIBADD = $(MAGICKCORE_LIBS) $(RAW_R_LIBS) $(GOMP_LIBS) + +# DPS coder module +coders_dps_la_SOURCES = coders/dps.c +coders_dps_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dps_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dps_la_LIBADD = $(MAGICKCORE_LIBS) $(DPS_LIBS) $(XEXT_LIBS) $(X11_LIBS) + +# DPX coder module +coders_dpx_la_SOURCES = coders/dpx.c +coders_dpx_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dpx_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dpx_la_LIBADD = $(MAGICKCORE_LIBS) $(GOMP_LIBS) + +# DOT coder module +coders_dot_la_SOURCES = coders/dot.c +coders_dot_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) $(GVC_CFLAGS) +coders_dot_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dot_la_LIBADD = $(MAGICKCORE_LIBS) $(GVC_LIBS) + +# EMF coder module +coders_emf_la_SOURCES = coders/emf.c +coders_emf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_emf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_emf_la_LIBADD = $(MAGICKCORE_LIBS) $(GDI32_LIBS) + +# EPT coder module +coders_ept_la_SOURCES = coders/ept.c +coders_ept_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ept_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ept_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# EXR coder module +coders_exr_la_SOURCES = coders/exr.c +coders_exr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) $(OPENEXR_CFLAGS) +coders_exr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_exr_la_LIBADD = $(MAGICKCORE_LIBS) $(OPENEXR_LIBS) $(MATH_LIBS) + +# FAX coder module +coders_fax_la_SOURCES = coders/fax.c +coders_fax_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_fax_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_fax_la_LIBADD = $(MAGICKCORE_LIBS) + +# FITS coder module +coders_fits_la_SOURCES = coders/fits.c +coders_fits_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_fits_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_fits_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# FLIF coder module +coders_flif_la_SOURCES = coders/flif.c +coders_flif_la_CPPFLAGS = $(MODULE_EXTRA_CPPFLAGS) +coders_flif_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_flif_la_LIBADD = $(MAGICKCORE_LIBS) $(FLIF_LIBS) + +# FPX coder module +coders_fpx_la_SOURCES = coders/fpx.c +coders_fpx_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_fpx_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_fpx_la_LIBADD = $(MAGICKCORE_LIBS) $(FPX_LIBS) $(MATH_LIBS) -lstdc++ + +# GIF coder module +coders_gif_la_SOURCES = coders/gif.c +coders_gif_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_gif_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_gif_la_LIBADD = $(MAGICKCORE_LIBS) + +# GRAY coder module +coders_gray_la_SOURCES = coders/gray.c +coders_gray_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_gray_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_gray_la_LIBADD = $(MAGICKCORE_LIBS) + +# GRADIENT coder module +coders_gradient_la_SOURCES = coders/gradient.c +coders_gradient_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_gradient_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_gradient_la_LIBADD = $(MAGICKCORE_LIBS) + +# HISTOGRAM coder module +coders_histogram_la_SOURCES = coders/histogram.c +coders_histogram_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_histogram_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_histogram_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# HALD coder module +coders_hald_la_SOURCES = coders/hald.c +coders_hald_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_hald_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_hald_la_LIBADD = $(MAGICKCORE_LIBS) $(GOMP_LIBS) + +# HDR coder module +coders_hdr_la_SOURCES = coders/hdr.c +coders_hdr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_hdr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_hdr_la_LIBADD = $(MAGICKCORE_LIBS) $(GOMP_LIBS) $(MATH_LIBS) + +# HEIC coder module +coders_heic_la_SOURCES = coders/heic.c +coders_heic_la_CPPFLAGS = $(MODULE_CODER_CPPFLAGS) +coders_heic_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_heic_la_LIBADD = $(MAGICKCORE_LIBS) $(HEIF_LIBS) + +# HRZ coder module +coders_hrz_la_SOURCES = coders/hrz.c +coders_hrz_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_hrz_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_hrz_la_LIBADD = $(MAGICKCORE_LIBS) + +# HTML coder module +coders_html_la_SOURCES = coders/html.c +coders_html_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_html_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_html_la_LIBADD = $(MAGICKCORE_LIBS) + +# ICON coder module +coders_icon_la_SOURCES = coders/icon.c +coders_icon_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_icon_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_icon_la_LIBADD = $(MAGICKCORE_LIBS) + +# INFO coder module +coders_info_la_SOURCES = coders/info.c +coders_info_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_info_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_info_la_LIBADD = $(MAGICKCORE_LIBS) + +# INLINE coder module +coders_inline_la_SOURCES = coders/inline.c +coders_inline_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_inline_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_inline_la_LIBADD = $(MAGICKCORE_LIBS) + +# IPL coder module +coders_ipl_la_SOURCES = coders/ipl.c +coders_ipl_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ipl_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ipl_la_LIBADD = $(MAGICKCORE_LIBS) + +# JBIG coder module +coders_jbig_la_SOURCES = coders/jbig.c +coders_jbig_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_jbig_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_jbig_la_LIBADD = $(MAGICKCORE_LIBS) $(JBIG_LIBS) $(MATH_LIBS) + +# JPEG coder module +coders_jpeg_la_SOURCES = coders/jpeg.c +coders_jpeg_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_jpeg_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_jpeg_la_LIBADD = $(MAGICKCORE_LIBS) $(JPEG_LIBS) $(MATH_LIBS) + +# JPEG 2000 coder module +coders_jp2_la_SOURCES = coders/jp2.c +coders_jp2_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) $(LIBOPENJP2_CFLAGS) +coders_jp2_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_jp2_la_LIBADD = $(MAGICKCORE_LIBS) $(LIBOPENJP2_LIBS) $(MATH_LIBS) + +# JNX coder module +coders_jnx_la_SOURCES = coders/jnx.c +coders_jnx_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_jnx_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_jnx_la_LIBADD = $(MAGICKCORE_LIBS) + +# JSON coder module +coders_json_la_SOURCES = coders/json.c +coders_json_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_json_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_json_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# LABEL coder module +coders_label_la_SOURCES = coders/label.c +coders_label_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_label_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_label_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# MAC coder module +coders_mac_la_SOURCES = coders/mac.c +coders_mac_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mac_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mac_la_LIBADD = $(MAGICKCORE_LIBS) + +# MAGICK coder module +coders_magick_la_SOURCES = coders/magick.c +coders_magick_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_magick_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_magick_la_LIBADD = $(MAGICKCORE_LIBS) + +# MAP coder module +coders_map_la_SOURCES = coders/map.c +coders_map_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_map_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_map_la_LIBADD = $(MAGICKCORE_LIBS) + +# MASK coder module +coders_mask_la_SOURCES = coders/mask.c +coders_mask_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mask_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mask_la_LIBADD = $(MAGICKCORE_LIBS) + +# MAT coder module +coders_mat_la_SOURCES = coders/mat.c +coders_mat_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mat_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mat_la_LIBADD = $(MAGICKCORE_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# MATTE coder module +coders_matte_la_SOURCES = coders/matte.c +coders_matte_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_matte_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_matte_la_LIBADD = $(MAGICKCORE_LIBS) + +# META coder module +coders_meta_la_SOURCES = coders/meta.c +coders_meta_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_meta_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_meta_la_LIBADD = $(MAGICKCORE_LIBS) + +# MIFF coder module +coders_miff_la_SOURCES = coders/miff.c +coders_miff_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_miff_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_miff_la_LIBADD = $(MAGICKCORE_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(BZLIB_LIBS) + +# MONO coder module +coders_mono_la_SOURCES = coders/mono.c +coders_mono_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mono_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mono_la_LIBADD = $(MAGICKCORE_LIBS) + +# MPC coder module +coders_mpc_la_SOURCES = coders/mpc.c +coders_mpc_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mpc_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mpc_la_LIBADD = $(MAGICKCORE_LIBS) + +# MPR coder module +coders_mpr_la_SOURCES = coders/mpr.c +coders_mpr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mpr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mpr_la_LIBADD = $(MAGICKCORE_LIBS) + +# MSL coder module +coders_msl_la_SOURCES = coders/msl.c +coders_msl_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_msl_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_msl_la_LIBADD = $(MAGICKCORE_LIBS) $(XML_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# MTV coder module +coders_mtv_la_SOURCES = coders/mtv.c +coders_mtv_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mtv_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mtv_la_LIBADD = $(MAGICKCORE_LIBS) + +# MVG coder module +coders_mvg_la_SOURCES = coders/mvg.c +coders_mvg_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mvg_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mvg_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# NULL coder module +coders_null_la_SOURCES = coders/null.c +coders_null_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_null_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_null_la_LIBADD = $(MAGICKCORE_LIBS) + +# OTB coder module +coders_otb_la_SOURCES = coders/otb.c +coders_otb_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_otb_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_otb_la_LIBADD = $(MAGICKCORE_LIBS) + +# PALM coder module +coders_palm_la_SOURCES = coders/palm.c +coders_palm_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_palm_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_palm_la_LIBADD = $(MAGICKCORE_LIBS) + +# PANGO coder module +coders_pango_la_SOURCES = coders/pango.c +coders_pango_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) $(PANGO_CFLAGS) +coders_pango_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pango_la_LIBADD = $(MAGICKCORE_LIBS) $(PANGO_LIBS) + +# Pattern module +coders_pattern_la_SOURCES = coders/pattern.c +coders_pattern_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pattern_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pattern_la_LIBADD = $(MAGICKCORE_LIBS) + +# PCD coder module +coders_pcd_la_SOURCES = coders/pcd.c +coders_pcd_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pcd_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pcd_la_LIBADD = $(MAGICKCORE_LIBS) + +# PCL coder module +coders_pcl_la_SOURCES = coders/pcl.c +coders_pcl_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pcl_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pcl_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# PCX coder module +coders_pcx_la_SOURCES = coders/pcx.c +coders_pcx_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pcx_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pcx_la_LIBADD = $(MAGICKCORE_LIBS) + +# PDB coder module +coders_pdb_la_SOURCES = coders/pdb.c +coders_pdb_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pdb_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pdb_la_LIBADD = $(MAGICKCORE_LIBS) + +# PDF coder module +coders_pdf_la_SOURCES = coders/pdf.c +coders_pdf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pdf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pdf_la_LIBADD = $(MAGICKCORE_LIBS) $(JBIG_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(GS_LIBS) $(MATH_LIBS) + +# PES coder module +coders_pes_la_SOURCES = coders/pes.c +coders_pes_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pes_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pes_la_LIBADD = $(MAGICKCORE_LIBS) + +# PGX coder module +coders_pgx_la_SOURCES = coders/pgx.c +coders_pgx_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pgx_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pgx_la_LIBADD = $(MAGICKCORE_LIBS) + +# PICT coder module +coders_pict_la_SOURCES = coders/pict.c +coders_pict_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pict_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pict_la_LIBADD = $(MAGICKCORE_LIBS) + +# PIX coder module +coders_pix_la_SOURCES = coders/pix.c +coders_pix_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pix_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pix_la_LIBADD = $(MAGICKCORE_LIBS) + +# PNG coder module +coders_png_la_SOURCES = coders/png.c +coders_png_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_png_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_png_la_LIBADD = $(MAGICKCORE_LIBS) $(PNG_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# PLASMA coder module +coders_plasma_la_SOURCES = coders/plasma.c +coders_plasma_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_plasma_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_plasma_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# PNM coder module +coders_pnm_la_SOURCES = coders/pnm.c +coders_pnm_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pnm_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pnm_la_LIBADD = $(MAGICKCORE_LIBS) $(GOMP_LIBS) + +# PREVIEW coder module +coders_preview_la_SOURCES = coders/preview.c +coders_preview_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_preview_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_preview_la_LIBADD = $(MAGICKCORE_LIBS) + +# PS coder module +coders_ps_la_SOURCES = coders/ps.c +coders_ps_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ps_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ps_la_LIBADD = $(MAGICKCORE_LIBS) $(GS_LIBS) $(MATH_LIBS) + +# PS2 coder module +coders_ps2_la_SOURCES = coders/ps2.c +coders_ps2_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ps2_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ps2_la_LIBADD = $(MAGICKCORE_LIBS) $(JBIG_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(ZSTD_LIBS) $(WEBPMUX_LIBS) $(WEBP_LIBS) $(MATH_LIBS) + +# PS3 coder module +coders_ps3_la_SOURCES = coders/ps3.c +coders_ps3_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ps3_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ps3_la_LIBADD = $(MAGICKCORE_LIBS) $(JBIG_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(ZSTD_LIBS) $(WEBPMUX_LIBS) $(WEBP_LIBS) $(MATH_LIBS) + +# PSD coder module +coders_psd_la_SOURCES = coders/psd.c coders/psd-private.h +coders_psd_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_psd_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_psd_la_LIBADD = $(MAGICKCORE_LIBS) $(ZLIB_LIBS) + +# PWP coder module +coders_pwp_la_SOURCES = coders/pwp.c +coders_pwp_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pwp_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pwp_la_LIBADD = $(MAGICKCORE_LIBS) + +# RAW coder module +coders_raw_la_SOURCES = coders/raw.c +coders_raw_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_raw_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_raw_la_LIBADD = $(MAGICKCORE_LIBS) + +# RGB coder module +coders_rgb_la_SOURCES = coders/rgb.c +coders_rgb_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_rgb_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_rgb_la_LIBADD = $(MAGICKCORE_LIBS) + +# RFG coder module +coders_rgf_la_SOURCES = coders/rgf.c +coders_rgf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_rgf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_rgf_la_LIBADD = $(MAGICKCORE_LIBS) + +# RLA coder module +coders_rla_la_SOURCES = coders/rla.c +coders_rla_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_rla_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_rla_la_LIBADD = $(MAGICKCORE_LIBS) + +# RLE coder module +coders_rle_la_SOURCES = coders/rle.c +coders_rle_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_rle_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_rle_la_LIBADD = $(MAGICKCORE_LIBS) + +# SCR coder module +coders_scr_la_SOURCES = coders/scr.c +coders_scr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_scr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_scr_la_LIBADD = $(MAGICKCORE_LIBS) + +# SCT coder module +coders_sct_la_SOURCES = coders/sct.c +coders_sct_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_sct_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_sct_la_LIBADD = $(MAGICKCORE_LIBS) + +# SFW coder module +coders_sfw_la_SOURCES = coders/sfw.c +coders_sfw_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_sfw_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_sfw_la_LIBADD = $(MAGICKCORE_LIBS) + +# SGI coder module +coders_sgi_la_SOURCES = coders/sgi.c +coders_sgi_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_sgi_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_sgi_la_LIBADD = $(MAGICKCORE_LIBS) + +# STEGANO coder module +coders_stegano_la_SOURCES = coders/stegano.c +coders_stegano_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_stegano_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_stegano_la_LIBADD = $(MAGICKCORE_LIBS) + +# SUN coder module +coders_sun_la_SOURCES = coders/sun.c +coders_sun_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_sun_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_sun_la_LIBADD = $(MAGICKCORE_LIBS) + +# SIXEL coder module +coders_sixel_la_SOURCES = coders/sixel.c +coders_sixel_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_sixel_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_sixel_la_LIBADD = $(MAGICKCORE_LIBS) + +# SVG coder module +coders_svg_la_SOURCES = coders/svg.c +coders_svg_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) $(RSVG_CFLAGS) $(CAIRO_SVG_CFLAGS) +coders_svg_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_svg_la_LIBADD = $(MAGICKCORE_LIBS) $(AUTOTRACE_LIBS) $(RSVG_LIBS) $(XML_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# TGA coder module +coders_tga_la_SOURCES = coders/tga.c +coders_tga_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_tga_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_tga_la_LIBADD = $(MAGICKCORE_LIBS) + +# THUMBNAIL coder module +coders_thumbnail_la_SOURCES = coders/thumbnail.c +coders_thumbnail_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_thumbnail_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_thumbnail_la_LIBADD = $(MAGICKCORE_LIBS) + +# TIFF coder module +coders_tiff_la_SOURCES = coders/tiff.c coders/psd.c coders/psd-private.h +coders_tiff_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_tiff_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_tiff_la_LIBADD = $(MAGICKCORE_LIBS) $(TIFF_LIBS) $(JBIG_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(ZSTD_LIBS) $(WEBPMUX_LIBS) $(WEBP_LIBS) $(MATH_LIBS) + +# TILE coder module +coders_tile_la_SOURCES = coders/tile.c +coders_tile_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_tile_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_tile_la_LIBADD = $(MAGICKCORE_LIBS) + +# TIM coder module +coders_tim_la_SOURCES = coders/tim.c +coders_tim_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_tim_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_tim_la_LIBADD = $(MAGICKCORE_LIBS) + +# TTF coder module +coders_ttf_la_SOURCES = coders/ttf.c +coders_ttf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ttf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ttf_la_LIBADD = $(MAGICKCORE_LIBS) + +# TXT coder module +coders_txt_la_SOURCES = coders/txt.c +coders_txt_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_txt_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_txt_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# UIL coder module +coders_uil_la_SOURCES = coders/uil.c +coders_uil_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_uil_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_uil_la_LIBADD = $(MAGICKCORE_LIBS) + +# URL coder module +coders_url_la_SOURCES = coders/url.c +coders_url_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_url_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_url_la_LIBADD = $(MAGICKCORE_LIBS) $(XML_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# UYVY coder module +coders_uyvy_la_SOURCES = coders/uyvy.c +coders_uyvy_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_uyvy_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_uyvy_la_LIBADD = $(MAGICKCORE_LIBS) + +# VICAR coder module +coders_vicar_la_SOURCES = coders/vicar.c +coders_vicar_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_vicar_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_vicar_la_LIBADD = $(MAGICKCORE_LIBS) + +# VID coder module +coders_vid_la_SOURCES = coders/vid.c +coders_vid_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_vid_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_vid_la_LIBADD = $(MAGICKCORE_LIBS) + +# VIDEO coder module +coders_video_la_SOURCES = coders/video.c +coders_video_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_video_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_video_la_LIBADD = $(MAGICKCORE_LIBS) + +# VIFF coder module +coders_viff_la_SOURCES = coders/viff.c +coders_viff_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_viff_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_viff_la_LIBADD = $(MAGICKCORE_LIBS) + +# VIPS coder module +coders_vips_la_SOURCES = coders/vips.c +coders_vips_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_vips_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_vips_la_LIBADD = $(MAGICKCORE_LIBS) + +# WBMP coder module +coders_wbmp_la_SOURCES = coders/wbmp.c +coders_wbmp_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_wbmp_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_wbmp_la_LIBADD = $(MAGICKCORE_LIBS) + +# WEBP coder module +coders_webp_la_SOURCES = coders/webp.c +coders_webp_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_webp_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_webp_la_LIBADD = $(MAGICKCORE_LIBS) $(WEBPMUX_LIBS) $(WEBP_LIBS) $(MATH_LIBS) + +# WMF coder module +coders_wmf_la_SOURCES = coders/wmf.c +coders_wmf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_wmf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_wmf_la_LIBADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(WMF_LIBS) $(MATH_LIBS) + +# WPG coder module +coders_wpg_la_SOURCES = coders/wpg.c +coders_wpg_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_wpg_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_wpg_la_LIBADD = $(MAGICKCORE_LIBS) + +# X coder module +coders_x_la_SOURCES = coders/x.c +coders_x_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_x_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_x_la_LIBADD = $(MAGICKCORE_LIBS) $(X11_LIBS) + +# XBM coder module +coders_xbm_la_SOURCES = coders/xbm.c +coders_xbm_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xbm_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xbm_la_LIBADD = $(MAGICKCORE_LIBS) + +# XC coder module +coders_xc_la_SOURCES = coders/xc.c +coders_xc_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xc_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xc_la_LIBADD = $(MAGICKCORE_LIBS) + +# XCF coder module +coders_xcf_la_SOURCES = coders/xcf.c +coders_xcf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xcf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xcf_la_LIBADD = $(MAGICKCORE_LIBS) + +# XPM coder module +coders_xpm_la_SOURCES = coders/xpm.c +coders_xpm_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xpm_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xpm_la_LIBADD = $(MAGICKCORE_LIBS) + +# XPS coder module +coders_xps_la_SOURCES = coders/xps.c +coders_xps_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xps_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xps_la_LIBADD = $(MAGICKCORE_LIBS) $(MUPDF_LIBS) $(FREETYPE_LIBS) $(MATH_LIBS) + +# XWD coder module +coders_xwd_la_SOURCES = coders/xwd.c +coders_xwd_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xwd_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xwd_la_LIBADD = $(MAGICKCORE_LIBS) $(X11_LIBS) + +# YCBCR coder module +coders_ycbcr_la_SOURCES = coders/ycbcr.c +coders_ycbcr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ycbcr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ycbcr_la_LIBADD = $(MAGICKCORE_LIBS) + +# YUV coder module +coders_yuv_la_SOURCES = coders/yuv.c +coders_yuv_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_yuv_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_yuv_la_LIBADD = $(MAGICKCORE_LIBS) +magickincdir = $(INCLUDE_PATH)/magick +magickincarchdir = $(INCLUDEARCH_PATH)/magick + +# Headers which are installed +magickinc_HEADERS = \ + $(MAGICK_INCLUDE_HDRS) + +magickincarch_HEADERS = \ + $(MAGICK_INCLUDEARCH_HDRS) + +MAGICK_BIN_SCRPTS = \ + magick/Magick-config \ + magick/MagickCore-config + +MAGICK_PKGCONFIG = \ + magick/ImageMagick.pc \ + magick/ImageMagick-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc \ + magick/MagickCore.pc \ + magick/MagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc + +MAGICK_MANS = \ + magick/Magick-config.1 \ + magick/MagickCore-config.1 + +MAGICKCORE_LIBS = magick/libMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la +@WITH_MODULES_FALSE@magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES = $(MAGICK_BASE_SRCS) $(MAGICK_PLATFORM_SRCS) $(MAGICK_CODER_SRCS) $(MAGICK_FILTER_SRCS) +@WITH_MODULES_TRUE@magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES = $(MAGICK_BASE_SRCS) $(MAGICK_PLATFORM_SRCS) +@WITH_MODULES_FALSE@magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD = $(MAGICK_DEP_LIBS) +@WITH_MODULES_TRUE@magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD = $(MAGICK_DEP_LIBS) +nodist_magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES = \ + $(am__append_1) +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBRARY_EXTRA_CPPFLAGS) +@HAVE_LD_VERSION_SCRIPT_FALSE@magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -export-symbols-regex ".*" +@HAVE_LD_VERSION_SCRIPT_TRUE@magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -Wl,--version-script=$(top_srcdir)/magick/libMagickCore.map +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS = -no-undefined \ + $(magick_libMagickCore_la_LDFLAGS_VERSION) \ + $(OSX_GCOV_LDFLAG) $(MAGICK_LT_RELEASE_OPTS) -version-info \ + $(MAGICK_LIBRARY_CURRENT):$(MAGICK_LIBRARY_REVISION):$(MAGICK_LIBRARY_AGE) + +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_DEPENDENCIES = + +# Library base sources +MAGICK_BASE_SRCS = \ + magick/ImageMagick.h \ + magick/MagickCore.h \ + magick/accelerate.c \ + magick/accelerate-private.h \ + magick/accelerate-kernels-private.h \ + magick/animate.c \ + magick/animate.h \ + magick/animate-private.h \ + magick/annotate.c \ + magick/annotate.h \ + magick/api.h \ + magick/artifact.c \ + magick/artifact.h \ + magick/attribute.c \ + magick/attribute.h \ + magick/blob.c \ + magick/blob.h \ + magick/blob-private.h \ + magick/cache.c \ + magick/cache.h \ + magick/cache-private.h \ + magick/cache-view.c \ + magick/cache-view.h \ + magick/channel.c \ + magick/channel.h \ + magick/cipher.c \ + magick/cipher.h \ + magick/client.c \ + magick/client.h \ + magick/coder.c \ + magick/coder.h \ + magick/color.c \ + magick/color.h \ + magick/color-private.h \ + magick/colormap.c \ + magick/colormap.h \ + magick/colormap-private.h \ + magick/colorspace.c \ + magick/colorspace.h \ + magick/colorspace-private.h \ + magick/compare.c \ + magick/compare.h \ + magick/composite.c \ + magick/composite.h \ + magick/composite-private.h \ + magick/compress.c \ + magick/compress.h \ + magick/configure.c \ + magick/configure.h \ + magick/constitute.c \ + magick/constitute.h \ + magick/decorate.c \ + magick/decorate.h \ + magick/distribute-cache.c \ + magick/distribute-cache.h \ + magick/distribute-cache-private.h \ + magick/delegate.c \ + magick/delegate.h \ + magick/delegate-private.h \ + magick/deprecate.c \ + magick/deprecate.h \ + magick/display.c \ + magick/display.h \ + magick/display-private.h \ + magick/distort.c \ + magick/distort.h \ + magick/draw.c \ + magick/draw.h \ + magick/draw-private.h \ + magick/effect.c \ + magick/effect.h \ + magick/enhance.c \ + magick/enhance.h \ + magick/exception.c \ + magick/exception.h \ + magick/exception-private.h \ + magick/feature.c \ + magick/feature.h \ + magick/fourier.c \ + magick/fourier.h \ + magick/fx.c \ + magick/fx.h \ + magick/fx-private.h \ + magick/gem.c \ + magick/gem.h \ + magick/gem-private.h \ + magick/geometry.c \ + magick/geometry.h \ + magick/hashmap.c \ + magick/hashmap.h \ + magick/histogram.c \ + magick/histogram.h \ + magick/identify.c \ + magick/identify.h \ + magick/image.c \ + magick/image.h \ + magick/image-private.h \ + magick/image-view.c \ + magick/image-view.h \ + magick/layer.c \ + magick/layer.h \ + magick/list.c \ + magick/list.h \ + magick/locale.c \ + magick/locale_.h \ + magick/locale-private.h \ + magick/log.c \ + magick/log.h \ + magick/mac.h \ + magick/magic.c \ + magick/magic.h \ + magick/magick.c \ + magick/magick-baseconfig.h \ + magick/magick-config.h \ + magick/magick-type.h \ + magick/magick.h \ + magick/matrix.c \ + magick/matrix.h \ + magick/memory.c \ + magick/memory_.h \ + magick/memory-private.h \ + magick/methods.h \ + magick/method-attribute.h \ + magick/mime.c \ + magick/mime.h \ + magick/module.c \ + magick/module.h \ + magick/monitor.c \ + magick/monitor.h \ + magick/monitor-private.h \ + magick/montage.c \ + magick/montage.h \ + magick/morphology.c \ + magick/morphology.h \ + magick/morphology-private.h \ + magick/mutex.h \ + magick/nt-base.h \ + magick/nt-base-private.h \ + magick/nt-feature.h \ + magick/opencl.c \ + magick/opencl.h \ + magick/opencl-private.h \ + magick/option.c \ + magick/option.h \ + magick/option-private.h \ + magick/paint.c \ + magick/paint.h \ + magick/pixel.c \ + magick/pixel.h \ + magick/pixel-accessor.h \ + magick/pixel-private.h \ + magick/policy.c \ + magick/policy.h \ + magick/policy-private.h \ + magick/prepress.c \ + magick/prepress.h \ + magick/property.c \ + magick/property.h \ + magick/profile.c \ + magick/profile.h \ + magick/quantize.c \ + magick/quantize.h \ + magick/quantum.c \ + magick/quantum.h \ + magick/quantum-export.c \ + magick/quantum-import.c \ + magick/quantum-private.h \ + magick/random.c \ + magick/random_.h \ + magick/random-private.h \ + magick/registry.c \ + magick/registry.h \ + magick/resample.c \ + magick/resample.h \ + magick/resample-private.h \ + magick/resize.c \ + magick/resize.h \ + magick/resize-private.h \ + magick/resource.c \ + magick/resource_.h \ + magick/segment.c \ + magick/segment.h \ + magick/semaphore.c \ + magick/semaphore.h \ + magick/semaphore-private.h \ + magick/shear.c \ + magick/shear.h \ + magick/signature.c \ + magick/signature.h \ + magick/signature-private.h \ + magick/splay-tree.c \ + magick/splay-tree.h \ + magick/static.c \ + magick/static.h \ + magick/statistic.c \ + magick/statistic.h \ + magick/stream.c \ + magick/stream.h \ + magick/stream-private.h \ + magick/string.c \ + magick/string_.h \ + magick/string-private.h \ + magick/studio.h \ + magick/thread.c \ + magick/thread_.h \ + magick/thread-private.h \ + magick/timer.c \ + magick/timer.h \ + magick/timer-private.h \ + magick/token.c \ + magick/token.h \ + magick/token-private.h \ + magick/transform.c \ + magick/transform.h \ + magick/threshold.c \ + magick/threshold.h \ + magick/type.c \ + magick/type.h \ + magick/utility.c \ + magick/utility.h \ + magick/utility-private.h \ + magick/version.c \ + magick/version.h \ + magick/version-private.h \ + magick/vision.c \ + magick/vision.h \ + magick/visual-effects.c \ + magick/visual-effects.h \ + magick/vms.h \ + magick/widget.c \ + magick/widget.h \ + magick/xml-tree.c \ + magick/xml-tree.h \ + magick/xml-tree-private.h \ + magick/xwindow.c \ + magick/xwindow.h + +@CYGWIN_BUILD_FALSE@@WIN32_NATIVE_BUILD_FALSE@MAGICK_PLATFORM_SRCS = +@CYGWIN_BUILD_TRUE@@WIN32_NATIVE_BUILD_FALSE@MAGICK_PLATFORM_SRCS = \ +@CYGWIN_BUILD_TRUE@@WIN32_NATIVE_BUILD_FALSE@ magick/nt-feature.c \ +@CYGWIN_BUILD_TRUE@@WIN32_NATIVE_BUILD_FALSE@ magick/nt-feature.h + +@WIN32_NATIVE_BUILD_TRUE@MAGICK_PLATFORM_SRCS = \ +@WIN32_NATIVE_BUILD_TRUE@ magick/nt-base.c \ +@WIN32_NATIVE_BUILD_TRUE@ magick/nt-base.h \ +@WIN32_NATIVE_BUILD_TRUE@ magick/nt-base-private.h \ +@WIN32_NATIVE_BUILD_TRUE@ magick/nt-feature.c \ +@WIN32_NATIVE_BUILD_TRUE@ magick/nt-feature.h + +MAGICK_INCLUDE_HDRS = \ + magick/ImageMagick.h \ + magick/MagickCore.h \ + magick/animate.h \ + magick/annotate.h \ + magick/api.h \ + magick/artifact.h \ + magick/attribute.h \ + magick/blob.h \ + magick/cache.h \ + magick/cache-view.h \ + magick/channel.h \ + magick/cipher.h \ + magick/client.h \ + magick/coder.h \ + magick/color.h \ + magick/colormap.h \ + magick/colorspace.h \ + magick/compare.h \ + magick/composite.h \ + magick/compress.h \ + magick/configure.h \ + magick/constitute.h \ + magick/decorate.h \ + magick/delegate.h \ + magick/deprecate.h \ + magick/display.h \ + magick/distribute-cache.h \ + magick/distort.h \ + magick/draw.h \ + magick/effect.h \ + magick/enhance.h \ + magick/exception.h \ + magick/feature.h \ + magick/fourier.h \ + magick/fx.h \ + magick/gem.h \ + magick/geometry.h \ + magick/hashmap.h \ + magick/histogram.h \ + magick/identify.h \ + magick/image.h \ + magick/image-view.h \ + magick/layer.h \ + magick/list.h \ + magick/locale_.h \ + magick/log.h \ + magick/magic.h \ + magick/magick.h \ + magick/magick-config.h \ + magick/magick-type.h \ + magick/matrix.h \ + magick/memory_.h \ + magick/methods.h \ + magick/method-attribute.h \ + magick/mime.h \ + magick/module.h \ + magick/monitor.h \ + magick/montage.h \ + magick/morphology.h \ + magick/opencl.h \ + magick/option.h \ + magick/paint.h \ + magick/pixel.h \ + magick/pixel-accessor.h \ + magick/policy.h \ + magick/prepress.h \ + magick/profile.h \ + magick/property.h \ + magick/quantize.h \ + magick/quantum.h \ + magick/random_.h \ + magick/registry.h \ + magick/resample.h \ + magick/resize.h \ + magick/resource_.h \ + magick/segment.h \ + magick/semaphore.h \ + magick/shear.h \ + magick/signature.h \ + magick/splay-tree.h \ + magick/static.h \ + magick/statistic.h \ + magick/stream.h \ + magick/string_.h \ + magick/studio.h \ + magick/timer.h \ + magick/token.h \ + magick/transform.h \ + magick/threshold.h \ + magick/type.h \ + magick/utility.h \ + magick/version.h \ + magick/vision.h \ + magick/visual-effects.h \ + magick/widget.h \ + magick/xml-tree.h \ + magick/xwindow.h + +MAGICK_NOINST_HDRS = \ + magick/accelerate-private.h \ + magick/accelerate-kernels-private.h \ + magick/animate-private.h \ + magick/blob-private.h \ + magick/cache-private.h \ + magick/color-private.h \ + magick/colormap-private.h \ + magick/colorspace-private.h \ + magick/composite-private.h \ + magick/delegate-private.h \ + magick/display-private.h \ + magick/distribute-cache-private.h \ + magick/draw-private.h \ + magick/exception-private.h \ + magick/fx-private.h \ + magick/gem-private.h \ + magick/image-private.h \ + magick/locale-private.h \ + magick/mac.h \ + magick/memory-private.h \ + magick/mime-private.h \ + magick/monitor-private.h \ + magick/morphology-private.h \ + magick/mutex.h \ + magick/nt-base.h \ + magick/nt-base-private.h \ + magick/nt-feature.h \ + magick/opencl.h \ + magick/option-private.h \ + magick/pixel-private.h \ + magick/policy-private.h \ + magick/quantum-private.h \ + magick/random-private.h \ + magick/resample-private.h \ + magick/resize-private.h \ + magick/semaphore-private.h \ + magick/signature-private.h \ + magick/stream-private.h \ + magick/string-private.h \ + magick/thread_.h \ + magick/thread-private.h \ + magick/timer-private.h \ + magick/token-private.h \ + magick/utility-private.h \ + magick/version-private.h \ + magick/xml-tree-private.h \ + magick/xwindow-private.h \ + magick/vms.h + +MAGICK_INCLUDEARCH_HDRS = \ + magick/magick-baseconfig.h + +MAGICK_EXTRA_DIST = \ + magick/Magick-config.in \ + magick/MagickCore-config.in \ + $(MAGICK_MANS) \ + magick/ImageMagick.pc.in \ + magick/libMagickCore.map \ + magick/MagickCore.pc.in \ + magick/config.h_vms \ + magick/mac.c \ + magick/nt-base.c \ + magick/nt-feature.c \ + magick/vms.c \ + magick/xwdfile.h_vms + +@MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE@libMagickCore_threshold_target = magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.lo + +# Where filter modules get installed +filtersdir = $(FILTER_PATH) +MAGICK_FILTER_CPPFLAGS = $(AM_CPPFLAGS) +MAGICK_FILTER_SRCS = \ + filters/analyze.c + +@WITH_MODULES_FALSE@filters_LTLIBRARIES = +@WITH_MODULES_TRUE@filters_LTLIBRARIES = filters/analyze.la +filters_CPPFLAGS = $(MAGICK_FILTER_CPPFLAGS) + +# analyze filter module +filters_analyze_la_SOURCES = filters/analyze.c +filters_analyze_la_CPPFLAGS = $(MAGICK_FILTER_CPPFLAGS) +filters_analyze_la_LDFLAGS = $(MODULECOMMONFLAGS) +filters_analyze_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) +wandincdir = $(INCLUDE_PATH)/wand +WAND_CPPFLAGS = $(AM_CPPFLAGS) +WAND_SOURCES = \ + wand/MagickWand.h \ + wand/animate.c \ + wand/animate.h \ + wand/compare.c \ + wand/compare.h \ + wand/composite.c \ + wand/composite.h \ + wand/conjure.c \ + wand/conjure.h \ + wand/convert.c \ + wand/convert.h \ + wand/deprecate.h \ + wand/deprecate.c \ + wand/display.c \ + wand/display.h \ + wand/drawing-wand.c \ + wand/drawing-wand.h \ + wand/identify.c \ + wand/identify.h \ + wand/import.c \ + wand/import.h \ + wand/magick-image.c \ + wand/magick-image.h \ + wand/magick-property.c \ + wand/magick-property.h \ + wand/magick-wand.c \ + wand/magick-wand.h \ + wand/magick-wand-private.h \ + wand/method-attribute.h \ + wand/mogrify.c \ + wand/mogrify.h \ + wand/mogrify-private.h \ + wand/montage.c \ + wand/montage.h \ + wand/pixel-iterator.c \ + wand/pixel-iterator.h \ + wand/pixel-wand.c \ + wand/pixel-wand.h \ + wand/pixel-wand-private.h \ + wand/stream.c \ + wand/stream.h \ + wand/studio.h \ + wand/wand.c \ + wand/wand.h \ + wand/wand-view.c \ + wand/wand-view.h + +WAND_INCLUDE_HDRS = \ + wand/MagickWand.h \ + wand/animate.h \ + wand/compare.h \ + wand/composite.h \ + wand/conjure.h \ + wand/convert.h \ + wand/deprecate.h \ + wand/display.h \ + wand/drawing-wand.h \ + wand/identify.h \ + wand/import.h \ + wand/magick-image.h \ + wand/magick-property.h \ + wand/magick-wand.h \ + wand/magick_wand.h \ + wand/method-attribute.h \ + wand/mogrify.h \ + wand/montage.h \ + wand/pixel-iterator.h \ + wand/pixel-wand.h \ + wand/stream.h \ + wand/wand-view.h + +WAND_NOINST_HDRS = \ + wand/mogrify-private.h \ + wand/magick-wand-private.h \ + wand/pixel-wand-private.h \ + wand/studio.h \ + wand/wand.h + + +# Headers which are installed +wandinc_HEADERS = \ + $(WAND_INCLUDE_HDRS) + +WAND_BIN_SCRPTS = \ + wand/Wand-config \ + wand/MagickWand-config + +WAND_PKGCONFIG = \ + wand/MagickWand.pc \ + wand/Wand.pc \ + wand/MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc \ + wand/Wand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc + +WAND_MANS = \ + wand/MagickWand-config.1 \ + wand/Wand-config.1 + +WAND_BUILT_SRCS = +MAGICKWAND_LIBS = wand/libMagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES = $(WAND_SOURCES) +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS = $(WAND_CPPFLAGS) $(LIBRARY_EXTRA_CPPFLAGS) +@HAVE_LD_VERSION_SCRIPT_FALSE@wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -export-symbols-regex ".*" +@HAVE_LD_VERSION_SCRIPT_TRUE@wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -Wl,--version-script=$(top_srcdir)/wand/libMagickWand.map +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS = -no-undefined \ + $(wand_libMagickWand_la_LDFLAGS_VERSION) $(MAGICK_LT_RELEASE_OPTS) \ + -version-info \ + $(MAGICK_LIBRARY_CURRENT):$(MAGICK_LIBRARY_REVISION):$(MAGICK_LIBRARY_AGE) + +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD = $(MAGICKCORE_LIBS) $(X11_LIBS) $(GOMP_LIBS) $(MATH_LIBS) +WAND_EXTRA_DIST = \ + wand/ChangeLog \ + wand/libMagickWand.map \ + wand/MagickWand-config.1 \ + wand/MagickWand.pc.in \ + wand/Wand-config.1 \ + wand/Wand.pc.in + +WAND_CLEANFILES = +MAGICKPP_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/Magick++/lib +@WITH_MAGICK_PLUS_PLUS_FALSE@MAGICKPP_LIBS = +@WITH_MAGICK_PLUS_PLUS_TRUE@MAGICKPP_LIBS = Magick++/lib/libMagick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la +@WITH_MAGICK_PLUS_PLUS_FALSE@MAGICKPP_LDADD = +@WITH_MAGICK_PLUS_PLUS_TRUE@MAGICKPP_LDADD = $(MAGICKPP_LIBS) $(top_builddir)/magick/libMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la $(top_builddir)/wand/libMagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la +@WITH_MAGICK_PLUS_PLUS_FALSE@MAGICKPP_CHECK_PGRMS = +@WITH_MAGICK_PLUS_PLUS_TRUE@MAGICKPP_CHECK_PGRMS = $(MAGICKPP_CHECK_PGRMS_OPT) +@WITH_MAGICK_PLUS_PLUS_FALSE@MAGICKPP_MANS = +@WITH_MAGICK_PLUS_PLUS_TRUE@MAGICKPP_MANS = $(MAGICKPP_MANS_OPT) +@WITH_MAGICK_PLUS_PLUS_FALSE@MAGICKPP_PKGCONFIG = +@WITH_MAGICK_PLUS_PLUS_TRUE@MAGICKPP_PKGCONFIG = $(MAGICKPP_PKGCONFIG_OPT) +@WITH_MAGICK_PLUS_PLUS_FALSE@MAGICKPP_SCRPTS = +@WITH_MAGICK_PLUS_PLUS_TRUE@MAGICKPP_SCRPTS = $(MAGICKPP_SCRPTS_OPT) +@WITH_MAGICK_PLUS_PLUS_FALSE@MAGICKPP_TESTS = +@WITH_MAGICK_PLUS_PLUS_TRUE@MAGICKPP_TESTS = $(MAGICKPP_TEST_SCRPTS_OPT) +@WITH_MAGICK_PLUS_PLUS_FALSE@MAGICKPP_TOP_INCHEADERS = +@WITH_MAGICK_PLUS_PLUS_TRUE@MAGICKPP_TOP_INCHEADERS = $(MAGICKPP_TOP_INCHEADERS_OPT) +@WITH_MAGICK_PLUS_PLUS_FALSE@MAGICKPP_INCHEADERS = +@WITH_MAGICK_PLUS_PLUS_TRUE@MAGICKPP_INCHEADERS = $(MAGICKPP_INCHEADERS_OPT) +MAGICKPP_SCRPTS_OPT = \ + Magick++/bin/Magick++-config + +MAGICKPP_MANS_OPT = \ + Magick++/bin/Magick++-config.1 + +MAGICKPP_PKGCONFIG_OPT = \ + Magick++/lib/Magick++.pc \ + Magick++/lib/ImageMagick++.pc \ + Magick++/lib/Magick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc \ + Magick++/lib/ImageMagick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc + +MAGICKPP_TEST_SCRPTS_OPT = \ + Magick++/tests/tests.tap \ + Magick++/demo/demos.tap + +MAGICKPP_EXTRA_DIST = \ + Magick++/AUTHORS \ + Magick++/ChangeLog \ + Magick++/INSTALL \ + Magick++/LICENSE \ + Magick++/NEWS \ + Magick++/README \ + Magick++/bin/Magick++-config.1 \ + Magick++/bin/Magick++-config.in \ + Magick++/lib/ImageMagick++.pc.in \ + Magick++/lib/libMagick++.map \ + Magick++/lib/Magick++.pc.in \ + Magick++/demo/model.miff \ + Magick++/demo/smile.miff \ + Magick++/demo/smile_anim.miff \ + Magick++/demo/tile.miff \ + $(MAGICKPP_TEST_SCRPTS_OPT) \ + Magick++/tests/test_image.miff \ + Magick++/tests/test_image_anim.miff + +MAGICKPP_CLEANFILES = \ + Magick++/demo/*_out* \ + Magick++/demo/ir.out \ + Magick++/tests/colorHistogram.txt \ + Magick++/tests/testmagick_anim_out.miff \ + Magick++/tests/ir.out + +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES = \ + Magick++/lib/Blob.cpp \ + Magick++/lib/BlobRef.cpp \ + Magick++/lib/ChannelMoments.cpp \ + Magick++/lib/CoderInfo.cpp \ + Magick++/lib/Color.cpp \ + Magick++/lib/Drawable.cpp \ + Magick++/lib/Exception.cpp \ + Magick++/lib/Functions.cpp \ + Magick++/lib/Geometry.cpp \ + Magick++/lib/Image.cpp \ + Magick++/lib/ImageRef.cpp \ + Magick++/lib/Montage.cpp \ + Magick++/lib/Options.cpp \ + Magick++/lib/Pixels.cpp \ + Magick++/lib/ResourceLimits.cpp \ + Magick++/lib/STL.cpp \ + Magick++/lib/Thread.cpp \ + Magick++/lib/TypeMetric.cpp \ + Magick++/lib/Magick++.h \ + Magick++/lib/Magick++/Blob.h \ + Magick++/lib/Magick++/BlobRef.h \ + Magick++/lib/Magick++/ChannelMoments.h \ + Magick++/lib/Magick++/CoderInfo.h \ + Magick++/lib/Magick++/Color.h \ + Magick++/lib/Magick++/Drawable.h \ + Magick++/lib/Magick++/Exception.h \ + Magick++/lib/Magick++/Functions.h \ + Magick++/lib/Magick++/Geometry.h \ + Magick++/lib/Magick++/Image.h \ + Magick++/lib/Magick++/ImageRef.h \ + Magick++/lib/Magick++/Include.h \ + Magick++/lib/Magick++/Montage.h \ + Magick++/lib/Magick++/Options.h \ + Magick++/lib/Magick++/Pixels.h \ + Magick++/lib/Magick++/ResourceLimits.h \ + Magick++/lib/Magick++/STL.h \ + Magick++/lib/Magick++/Thread.h \ + Magick++/lib/Magick++/TypeMetric.h + +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS = \ + $(MAGICKPP_CPPFLAGS) $(LIBRARY_EXTRA_CPPFLAGS) + +magickpptopincdir = $(INCLUDE_PATH) +magickpptopinc_HEADERS = $(MAGICKPP_TOP_INCHEADERS) +MAGICKPP_TOP_INCHEADERS_OPT = \ + Magick++/lib/Magick++.h + +magickppincdir = $(INCLUDE_PATH)/Magick++ +magickppinc_HEADERS = $(MAGICKPP_INCHEADERS) +MAGICKPP_INCHEADERS_OPT = \ + Magick++/lib/Magick++/Blob.h \ + Magick++/lib/Magick++/ChannelMoments.h \ + Magick++/lib/Magick++/CoderInfo.h \ + Magick++/lib/Magick++/Color.h \ + Magick++/lib/Magick++/Drawable.h \ + Magick++/lib/Magick++/Exception.h \ + Magick++/lib/Magick++/Functions.h \ + Magick++/lib/Magick++/Geometry.h \ + Magick++/lib/Magick++/Image.h \ + Magick++/lib/Magick++/Include.h \ + Magick++/lib/Magick++/Montage.h \ + Magick++/lib/Magick++/Pixels.h \ + Magick++/lib/Magick++/ResourceLimits.h \ + Magick++/lib/Magick++/STL.h \ + Magick++/lib/Magick++/TypeMetric.h + +@HAVE_LD_VERSION_SCRIPT_FALSE@Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -export-symbols-regex ".*" +@HAVE_LD_VERSION_SCRIPT_TRUE@Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -Wl,--version-script=$(top_srcdir)/Magick++/lib/libMagick++.map +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS = -no-undefined \ + $(Magick___lib_libMagick___la_LDFLAGS_VERSION) $(MAGICK_LT_RELEASE_OPTS) \ + -version-info \ + $(MAGICKPP_LIBRARY_CURRENT):$(MAGICKPP_LIBRARY_REVISION):$(MAGICKPP_LIBRARY_AGE) + +Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +MAGICKPP_CHECK_PGRMS_OPT = \ + Magick++/demo/analyze \ + Magick++/demo/button \ + Magick++/demo/demo \ + Magick++/demo/detrans \ + Magick++/demo/flip \ + Magick++/demo/gravity \ + Magick++/demo/piddle \ + Magick++/demo/shapes \ + Magick++/demo/zoom \ + Magick++/tests/appendImages \ + Magick++/tests/attributes \ + Magick++/tests/averageImages \ + Magick++/tests/coalesceImages \ + Magick++/tests/coderInfo \ + Magick++/tests/color \ + Magick++/tests/colorHistogram \ + Magick++/tests/exceptions \ + Magick++/tests/montageImages \ + Magick++/tests/morphImages \ + Magick++/tests/readWriteBlob \ + Magick++/tests/readWriteImages + +Magick___demo_analyze_SOURCES = Magick++/demo/analyze.cpp +Magick___demo_analyze_LDADD = $(MAGICKPP_LDADD) +Magick___demo_analyze_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___demo_button_SOURCES = Magick++/demo/button.cpp +Magick___demo_button_LDADD = $(MAGICKPP_LDADD) +Magick___demo_button_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___demo_demo_SOURCES = Magick++/demo/demo.cpp +Magick___demo_demo_LDADD = $(MAGICKPP_LDADD) +Magick___demo_demo_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___demo_detrans_SOURCES = Magick++/demo/detrans.cpp +Magick___demo_detrans_LDADD = $(MAGICKPP_LDADD) +Magick___demo_detrans_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___demo_flip_SOURCES = Magick++/demo/flip.cpp +Magick___demo_flip_LDADD = $(MAGICKPP_LDADD) +Magick___demo_flip_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___demo_gravity_SOURCES = Magick++/demo/gravity.cpp +Magick___demo_gravity_LDADD = $(MAGICKPP_LDADD) +Magick___demo_gravity_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___demo_piddle_SOURCES = Magick++/demo/piddle.cpp +Magick___demo_piddle_LDADD = $(MAGICKPP_LDADD) +Magick___demo_piddle_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___demo_shapes_SOURCES = Magick++/demo/shapes.cpp +Magick___demo_shapes_LDADD = $(MAGICKPP_LDADD) +Magick___demo_shapes_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___demo_zoom_SOURCES = Magick++/demo/zoom.cpp +Magick___demo_zoom_LDADD = $(MAGICKPP_LDADD) +Magick___demo_zoom_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_appendImages_SOURCES = Magick++/tests/appendImages.cpp +Magick___tests_appendImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_appendImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_attributes_SOURCES = Magick++/tests/attributes.cpp +Magick___tests_attributes_LDADD = $(MAGICKPP_LDADD) +Magick___tests_attributes_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_averageImages_SOURCES = Magick++/tests/averageImages.cpp +Magick___tests_averageImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_averageImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_coalesceImages_SOURCES = Magick++/tests/coalesceImages.cpp +Magick___tests_coalesceImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_coalesceImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_coderInfo_SOURCES = Magick++/tests/coderInfo.cpp +Magick___tests_coderInfo_LDADD = $(MAGICKPP_LDADD) +Magick___tests_coderInfo_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_color_SOURCES = Magick++/tests/color.cpp +Magick___tests_color_LDADD = $(MAGICKPP_LDADD) +Magick___tests_color_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_colorHistogram_SOURCES = Magick++/tests/colorHistogram.cpp +Magick___tests_colorHistogram_LDADD = $(MAGICKPP_LDADD) +Magick___tests_colorHistogram_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_exceptions_SOURCES = Magick++/tests/exceptions.cpp +Magick___tests_exceptions_LDADD = $(MAGICKPP_LDADD) +Magick___tests_exceptions_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_montageImages_SOURCES = Magick++/tests/montageImages.cpp +Magick___tests_montageImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_montageImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_morphImages_SOURCES = Magick++/tests/morphImages.cpp +Magick___tests_morphImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_morphImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_readWriteBlob_SOURCES = Magick++/tests/readWriteBlob.cpp +Magick___tests_readWriteBlob_LDADD = $(MAGICKPP_LDADD) +Magick___tests_readWriteBlob_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +Magick___tests_readWriteImages_SOURCES = Magick++/tests/readWriteImages.cpp +Magick___tests_readWriteImages_LDADD = $(MAGICKPP_LDADD) +Magick___tests_readWriteImages_CPPFLAGS = $(MAGICKPP_CPPFLAGS) +MAGICKPP_LOCAL_TARGETS = www/Magick++/NEWS.html www/Magick++/ChangeLog.html +UTILITIES_PGMS = \ + utilities/animate \ + utilities/compare \ + utilities/composite \ + utilities/conjure \ + utilities/convert \ + utilities/display \ + utilities/identify \ + utilities/import \ + utilities/mogrify \ + utilities/montage \ + utilities/stream + +UTILITIES_XFAIL_TESTS = \ + $(UTILITIES_TTF_XFAIL_TESTS) \ + $(UTILITIES_XML_XFAIL_TESTS) + +utilities_animate_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_animate_LDFLAGS = $(LDFLAGS) +utilities_animate_SOURCES = utilities/animate.c +utilities_compare_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_compare_LDFLAGS = $(LDFLAGS) +utilities_compare_SOURCES = utilities/compare.c +utilities_composite_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_composite_LDFLAGS = $(LDFLAGS) +utilities_composite_SOURCES = utilities/composite.c +utilities_conjure_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_conjure_LDFLAGS = $(LDFLAGS) +utilities_conjure_SOURCES = utilities/conjure.c +utilities_convert_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_convert_LDFLAGS = $(LDFLAGS) +utilities_convert_SOURCES = utilities/convert.c +utilities_display_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_display_LDFLAGS = $(LDFLAGS) +utilities_display_SOURCES = utilities/display.c +utilities_identify_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_identify_LDFLAGS = $(LDFLAGS) +utilities_identify_SOURCES = utilities/identify.c +utilities_import_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_import_LDFLAGS = $(LDFLAGS) +utilities_import_SOURCES = utilities/import.c +utilities_mogrify_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_mogrify_LDFLAGS = $(LDFLAGS) +utilities_mogrify_SOURCES = utilities/mogrify.c +utilities_montage_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_montage_LDFLAGS = $(LDFLAGS) +utilities_montage_SOURCES = utilities/montage.c +utilities_stream_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_stream_LDFLAGS = $(LDFLAGS) +utilities_stream_SOURCES = utilities/stream.c +UTILITIES_MANS = \ + utilities/ImageMagick.1 \ + utilities/animate.1 \ + utilities/compare.1 \ + utilities/composite.1 \ + utilities/conjure.1 \ + utilities/convert.1 \ + utilities/display.1 \ + utilities/identify.1 \ + utilities/import.1 \ + utilities/mogrify.1 \ + utilities/montage.1 \ + utilities/stream.1 + +UTILITIES_CONFIGURE = \ + utilities/ImageMagick.1.in \ + utilities/animate.1.in \ + utilities/compare.1.in \ + utilities/composite.1.in \ + utilities/conjure.1.in \ + utilities/convert.1.in \ + utilities/display.1.in \ + utilities/identify.1.in \ + utilities/import.1.in \ + utilities/mogrify.1.in \ + utilities/montage.1.in \ + utilities/stream.1.in + +UTILITIES_EXTRA_DIST = \ + $(UTILITIES_MANS) \ + $(UTILITIES_TESTS) + +UTILITIES_CLEANFILES = + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for the ImageMagick validation suite. +# +TESTS_CPPFLAGS = $(AM_CPPFLAGS) +TESTS_CHECK_PGRMS = \ + tests/validate \ + tests/drawtest \ + tests/wandtest + +tests_validate_SOURCES = tests/validate.c tests/validate.h +tests_validate_CPPFLAGS = $(TESTS_CPPFLAGS) +tests_validate_LDFLAGS = $(LDFLAGS) +tests_validate_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(MATH_LIBS) +tests_drawtest_SOURCES = tests/drawtest.c +tests_drawtest_CPPFLAGS = $(TESTS_CPPFLAGS) +tests_drawtest_LDFLAGS = $(LDFLAGS) +tests_drawtest_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +tests_wandtest_SOURCES = tests/wandtest.c +tests_wandtest_CPPFLAGS = $(TESTS_CPPFLAGS) +tests_wandtest_LDFLAGS = $(LDFLAGS) +tests_wandtest_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +TESTS_XFAIL_TESTS = +TESTS_TESTS = \ + tests/cli-pipe.tap \ + tests/cli-colorspace.tap \ + tests/validate-colorspace.tap \ + tests/validate-compare.tap \ + tests/validate-composite.tap \ + tests/validate-convert.tap \ + tests/validate-formats-disk.tap \ + tests/validate-formats-map.tap \ + tests/validate-formats-memory.tap \ + tests/validate-identify.tap \ + tests/validate-import.tap \ + tests/validate-montage.tap \ + tests/validate-stream.tap \ + tests/drawtest.tap \ + tests/wandtest.tap + +TESTS_EXTRA_DIST = \ + tests/common.shi \ + tests/rose.pnm \ + tests/input_256c.miff \ + tests/input_bilevel.miff \ + tests/input_gray.miff \ + tests/input_truecolor.miff \ + tests/sequence.miff \ + $(TESTS_TESTS) + +TESTS_CLEANFILES = \ + tests/*_out.* + +@WITH_PERL_TRUE@PERLMAGICK = PerlMagick +@WITH_PERL_TRUE@PERLMAKEMAKER = $(PERLMAGICK)/Makefile.PL +@WITH_PERL_TRUE@PERLMAKEFILE = $(PERLMAGICK)/Makefile +@WITH_PERL_TRUE@PERLMAGICK_ALL_LOCAL_TARGETS = all-perl +@WITH_PERL_TRUE@PERLMAGICK_INSTALL_EXEC_LOCAL_TARGETS = install-exec-perl +@WITH_PERL_TRUE@PERLMAGICK_INSTALL_DATA_LOCAL_TARGETS = +@WITH_PERL_TRUE@PERLMAGICK_UNINSTALL_LOCAL_TARGETS = uninstall-exec-perl +@WITH_PERL_TRUE@PERLMAGICK_CLEAN_LOCAL_TARGETS = clean-perl +@WITH_PERL_TRUE@PERLMAGICK_DISTCLEAN_LOCAL_TARGETS = clean-perl +@WITH_PERL_TRUE@PERLMAGICK_MAINTAINER_CLEAN_LOCAL_TARGETS = distclean-local +@WITH_PERL_TRUE@PERLMAGICK_TESTS = PerlMagick/check.sh +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@PERLMAGICK_CHECKSCRPTS = perl-build +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@PERLMAGICK_CHECKSCRPTS = +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@PERLSTATICNAME = PerlMagick + +# Files to install in Pkgconfig directory +pkgconfig_DATA = \ + $(MAGICK_PKGCONFIG) \ + $(WAND_PKGCONFIG) \ + $(MAGICKPP_PKGCONFIG) + + +# Manual pages to install +@INSTALL_DOC_TRUE@man_MANS = \ +@INSTALL_DOC_TRUE@ $(MAGICK_MANS) \ +@INSTALL_DOC_TRUE@ $(WAND_MANS) \ +@INSTALL_DOC_TRUE@ $(MAGICKPP_MANS) \ +@INSTALL_DOC_TRUE@ $(UTILITIES_MANS) + +@INSTALL_DOC_TRUE@doc_DATA = \ +@INSTALL_DOC_TRUE@ LICENSE \ +@INSTALL_DOC_TRUE@ ChangeLog.md \ +@INSTALL_DOC_TRUE@ NEWS.txt + +@MAINTAINER_MODE_TRUE@MAINTAINER_TARGETS = \ +@MAINTAINER_MODE_TRUE@ magick-version \ +@MAINTAINER_MODE_TRUE@ ImageMagick.spec \ +@MAINTAINER_MODE_TRUE@ $(PERLMAGICK_MAINTAINER_TARGETS) + + +# Non-Automake subdirectories to distribute +DISTDIRS = images scripts www PerlMagick + +# +# Additional install rules +# + +# Install HTML files +pkgdocdir = $(DOCUMENTATION_PATH) +DOCDIRSDOXYGEN = www/api/MagickCore www/api/MagickWand +DOCDIRSMANUAL = images images/patterns www www/assets www/api www/source www/Magick++ +DOCDIRS = $(DOCDIRSMANUAL) $(DOCDIRSDOXYGEN) +@INSTALL_DOC_TRUE@HTML_INSTALL_DATA_TARGETS = install-data-html + +# Uninstall HTML files +HTML_UNINSTALL_DATA_TARGETS = uninstall-data-html +@ZIP_DELEGATE_FALSE@DIST_WINDOWS_SRC_ZIP = + +# +# Build Windows source Zip and 7Zip balls +# +@ZIP_DELEGATE_TRUE@DIST_WINDOWS_SRC_ZIP = $(PACKAGE_NAME)-$(PACKAGE_VERSION)-windows.zip +@P7ZIP_DELEGATE_FALSE@DIST_WINDOWS_SRC_7ZIP = +@P7ZIP_DELEGATE_TRUE@DIST_WINDOWS_SRC_7ZIP = $(PACKAGE_NAME)-$(PACKAGE_VERSION)-windows.7z + +# +# RPM build support +# +@RPM_DELEGATE_TRUE@DIST_ARCHIVE_SRPM = $(distdir).src.rpm +@RPM_DELEGATE_TRUE@RPMDIR = rpmbuild +@RPM_DELEGATE_TRUE@RPMARCH = $(MAGICK_TARGET_CPU) +@RPM_DELEGATE_FALSE@DIST_ARCHIVE_RPM = +@RPM_DELEGATE_TRUE@DIST_ARCHIVE_RPM = \ +@RPM_DELEGATE_TRUE@ $(RPMDIR)/$(RPMARCH)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)-$(PACKAGE_PATCHLEVEL_VERSION).$(RPMARCH).rpm \ +@RPM_DELEGATE_TRUE@ $(RPMDIR)/$(RPMARCH)/$(PACKAGE_NAME)-c++-$(PACKAGE_VERSION)-$(PACKAGE_PATCHLEVEL_VERSION).$(RPMARCH).rpm \ +@RPM_DELEGATE_TRUE@ $(RPMDIR)/$(RPMARCH)/$(PACKAGE_NAME)-c++-devel-$(PACKAGE_VERSION)-$(PACKAGE_PATCHLEVEL_VERSION).$(RPMARCH).rpm \ +@RPM_DELEGATE_TRUE@ $(RPMDIR)/$(RPMARCH)/$(PACKAGE_NAME)-devel-$(PACKAGE_VERSION)-$(PACKAGE_PATCHLEVEL_VERSION).$(RPMARCH).rpm \ +@RPM_DELEGATE_TRUE@ $(RPMDIR)/$(RPMARCH)/$(PACKAGE_NAME)-perl-$(PACKAGE_VERSION)-$(PACKAGE_PATCHLEVEL_VERSION).$(RPMARCH).rpm + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .cpp .lo .log .o .obj .sh .sh$(EXEEXT) .tap .tap$(EXEEXT) .trs +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/m4/Makefile.am $(srcdir)/config/Makefile.am $(srcdir)/coders/Makefile.am $(srcdir)/magick/Makefile.am $(srcdir)/filters/Makefile.am $(srcdir)/wand/Makefile.am $(srcdir)/Magick++/Makefile.am $(srcdir)/utilities/Makefile.am $(srcdir)/tests/Makefile.am $(srcdir)/PerlMagick/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; +$(srcdir)/m4/Makefile.am $(srcdir)/config/Makefile.am $(srcdir)/coders/Makefile.am $(srcdir)/magick/Makefile.am $(srcdir)/filters/Makefile.am $(srcdir)/wand/Makefile.am $(srcdir)/Magick++/Makefile.am $(srcdir)/utilities/Makefile.am $(srcdir)/tests/Makefile.am $(srcdir)/PerlMagick/Makefile.am $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config/config.h: config/stamp-h1 + @test -f $@ || rm -f config/stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) config/stamp-h1 + +config/stamp-h1: $(top_srcdir)/config/config.h.in $(top_builddir)/config.status + @rm -f config/stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config/config.h +$(top_srcdir)/config/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f config/stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config/config.h config/stamp-h1 +common.shi: $(top_builddir)/config.status $(srcdir)/common.shi.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/configure.xml: $(top_builddir)/config.status $(top_srcdir)/config/configure.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/delegates.xml: $(top_builddir)/config.status $(top_srcdir)/config/delegates.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/ImageMagick.rdf: $(top_builddir)/config.status $(top_srcdir)/config/ImageMagick.rdf.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/MagickCore.dox: $(top_builddir)/config.status $(top_srcdir)/config/MagickCore.dox.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/MagickWand.dox: $(top_builddir)/config.status $(top_srcdir)/config/MagickWand.dox.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/Magick++.dox: $(top_builddir)/config.status $(top_srcdir)/config/Magick++.dox.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/type-apple.xml: $(top_builddir)/config.status $(top_srcdir)/config/type-apple.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/type-dejavu.xml: $(top_builddir)/config.status $(top_srcdir)/config/type-dejavu.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/type-ghostscript.xml: $(top_builddir)/config.status $(top_srcdir)/config/type-ghostscript.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/type-urw-base35.xml: $(top_builddir)/config.status $(top_srcdir)/config/type-urw-base35.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/type-windows.xml: $(top_builddir)/config.status $(top_srcdir)/config/type-windows.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config/type.xml: $(top_builddir)/config.status $(top_srcdir)/config/type.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +ImageMagick.spec: $(top_builddir)/config.status $(srcdir)/ImageMagick.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +Magick++/bin/Magick++-config: $(top_builddir)/config.status $(top_srcdir)/Magick++/bin/Magick++-config.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +magick/ImageMagick.pc: $(top_builddir)/config.status $(top_srcdir)/magick/ImageMagick.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +Magick++/lib/ImageMagick++.pc: $(top_builddir)/config.status $(top_srcdir)/Magick++/lib/ImageMagick++.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +Magick++/lib/Magick++.pc: $(top_builddir)/config.status $(top_srcdir)/Magick++/lib/Magick++.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +magick/Magick-config: $(top_builddir)/config.status $(top_srcdir)/magick/Magick-config.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +magick/MagickCore-config: $(top_builddir)/config.status $(top_srcdir)/magick/MagickCore-config.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +magick/MagickCore.pc: $(top_builddir)/config.status $(top_srcdir)/magick/MagickCore.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +magick/version.h: $(top_builddir)/config.status $(top_srcdir)/magick/version.h.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +magick.sh: $(top_builddir)/config.status $(srcdir)/magick.sh.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +PerlMagick/check.sh: $(top_builddir)/config.status $(top_srcdir)/PerlMagick/check.sh.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +PerlMagick/default/Magick.pm: $(top_builddir)/config.status $(top_srcdir)/PerlMagick/default/Magick.pm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +PerlMagick/Makefile.PL: $(top_builddir)/config.status $(top_srcdir)/PerlMagick/Makefile.PL.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +PerlMagick/default/Makefile.PL: $(top_builddir)/config.status $(top_srcdir)/PerlMagick/default/Makefile.PL.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +PerlMagick/quantum/Makefile.PL: $(top_builddir)/config.status $(top_srcdir)/PerlMagick/quantum/Makefile.PL.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +PerlMagick/quantum/quantum.pm: $(top_builddir)/config.status $(top_srcdir)/PerlMagick/quantum/quantum.pm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +PerlMagick/quantum/quantum.xs: $(top_builddir)/config.status $(top_srcdir)/PerlMagick/quantum/quantum.xs.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +PerlMagick/quantum/typemap: $(top_builddir)/config.status $(top_srcdir)/PerlMagick/quantum/typemap.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/animate.1: $(top_builddir)/config.status $(top_srcdir)/utilities/animate.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/compare.1: $(top_builddir)/config.status $(top_srcdir)/utilities/compare.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/composite.1: $(top_builddir)/config.status $(top_srcdir)/utilities/composite.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/conjure.1: $(top_builddir)/config.status $(top_srcdir)/utilities/conjure.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/convert.1: $(top_builddir)/config.status $(top_srcdir)/utilities/convert.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/display.1: $(top_builddir)/config.status $(top_srcdir)/utilities/display.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/identify.1: $(top_builddir)/config.status $(top_srcdir)/utilities/identify.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/ImageMagick.1: $(top_builddir)/config.status $(top_srcdir)/utilities/ImageMagick.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/import.1: $(top_builddir)/config.status $(top_srcdir)/utilities/import.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/mogrify.1: $(top_builddir)/config.status $(top_srcdir)/utilities/mogrify.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/montage.1: $(top_builddir)/config.status $(top_srcdir)/utilities/montage.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +utilities/stream.1: $(top_builddir)/config.status $(top_srcdir)/utilities/stream.1.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +wand/MagickWand-config: $(top_builddir)/config.status $(top_srcdir)/wand/MagickWand-config.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +wand/MagickWand.pc: $(top_builddir)/config.status $(top_srcdir)/wand/MagickWand.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +wand/Wand-config: $(top_builddir)/config.status $(top_srcdir)/wand/Wand-config.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +wand/Wand.pc: $(top_builddir)/config.status $(top_srcdir)/wand/Wand.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +install-codersLTLIBRARIES: $(coders_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(coders_LTLIBRARIES)'; test -n "$(codersdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(codersdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(codersdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(codersdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(codersdir)"; \ + } + +uninstall-codersLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(coders_LTLIBRARIES)'; test -n "$(codersdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(codersdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(codersdir)/$$f"; \ + done + +clean-codersLTLIBRARIES: + -test -z "$(coders_LTLIBRARIES)" || rm -f $(coders_LTLIBRARIES) + @list='$(coders_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +install-filtersLTLIBRARIES: $(filters_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(filters_LTLIBRARIES)'; test -n "$(filtersdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(filtersdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(filtersdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(filtersdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(filtersdir)"; \ + } + +uninstall-filtersLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(filters_LTLIBRARIES)'; test -n "$(filtersdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(filtersdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(filtersdir)/$$f"; \ + done + +clean-filtersLTLIBRARIES: + -test -z "$(filters_LTLIBRARIES)" || rm -f $(filters_LTLIBRARIES) + @list='$(filters_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +Magick++/lib/$(am__dirstamp): + @$(MKDIR_P) Magick++/lib + @: > Magick++/lib/$(am__dirstamp) +Magick++/lib/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) Magick++/lib/$(DEPDIR) + @: > Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.lo: \ + Magick++/lib/$(am__dirstamp) \ + Magick++/lib/$(DEPDIR)/$(am__dirstamp) + +Magick++/lib/libMagick++-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la: $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_DEPENDENCIES) $(EXTRA_Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_DEPENDENCIES) Magick++/lib/$(am__dirstamp) + $(AM_V_CXXLD)$(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LINK) $(am_Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_rpath) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD) $(LIBS) +coders/$(am__dirstamp): + @$(MKDIR_P) coders + @: > coders/$(am__dirstamp) +coders/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coders/$(DEPDIR) + @: > coders/$(DEPDIR)/$(am__dirstamp) +coders/aai_la-aai.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/aai.la: $(coders_aai_la_OBJECTS) $(coders_aai_la_DEPENDENCIES) $(EXTRA_coders_aai_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_aai_la_LINK) $(am_coders_aai_la_rpath) $(coders_aai_la_OBJECTS) $(coders_aai_la_LIBADD) $(LIBS) +coders/art_la-art.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/art.la: $(coders_art_la_OBJECTS) $(coders_art_la_DEPENDENCIES) $(EXTRA_coders_art_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_art_la_LINK) $(am_coders_art_la_rpath) $(coders_art_la_OBJECTS) $(coders_art_la_LIBADD) $(LIBS) +coders/avs_la-avs.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/avs.la: $(coders_avs_la_OBJECTS) $(coders_avs_la_DEPENDENCIES) $(EXTRA_coders_avs_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_avs_la_LINK) $(am_coders_avs_la_rpath) $(coders_avs_la_OBJECTS) $(coders_avs_la_LIBADD) $(LIBS) +coders/bgr_la-bgr.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/bgr.la: $(coders_bgr_la_OBJECTS) $(coders_bgr_la_DEPENDENCIES) $(EXTRA_coders_bgr_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_bgr_la_LINK) $(am_coders_bgr_la_rpath) $(coders_bgr_la_OBJECTS) $(coders_bgr_la_LIBADD) $(LIBS) +coders/bmp_la-bmp.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/bmp.la: $(coders_bmp_la_OBJECTS) $(coders_bmp_la_DEPENDENCIES) $(EXTRA_coders_bmp_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_bmp_la_LINK) $(am_coders_bmp_la_rpath) $(coders_bmp_la_OBJECTS) $(coders_bmp_la_LIBADD) $(LIBS) +coders/braille_la-braille.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/braille.la: $(coders_braille_la_OBJECTS) $(coders_braille_la_DEPENDENCIES) $(EXTRA_coders_braille_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_braille_la_LINK) $(am_coders_braille_la_rpath) $(coders_braille_la_OBJECTS) $(coders_braille_la_LIBADD) $(LIBS) +coders/cals_la-cals.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/cals.la: $(coders_cals_la_OBJECTS) $(coders_cals_la_DEPENDENCIES) $(EXTRA_coders_cals_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_cals_la_LINK) $(am_coders_cals_la_rpath) $(coders_cals_la_OBJECTS) $(coders_cals_la_LIBADD) $(LIBS) +coders/caption_la-caption.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/caption.la: $(coders_caption_la_OBJECTS) $(coders_caption_la_DEPENDENCIES) $(EXTRA_coders_caption_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_caption_la_LINK) $(am_coders_caption_la_rpath) $(coders_caption_la_OBJECTS) $(coders_caption_la_LIBADD) $(LIBS) +coders/cin_la-cin.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/cin.la: $(coders_cin_la_OBJECTS) $(coders_cin_la_DEPENDENCIES) $(EXTRA_coders_cin_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_cin_la_LINK) $(am_coders_cin_la_rpath) $(coders_cin_la_OBJECTS) $(coders_cin_la_LIBADD) $(LIBS) +coders/cip_la-cip.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/cip.la: $(coders_cip_la_OBJECTS) $(coders_cip_la_DEPENDENCIES) $(EXTRA_coders_cip_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_cip_la_LINK) $(am_coders_cip_la_rpath) $(coders_cip_la_OBJECTS) $(coders_cip_la_LIBADD) $(LIBS) +coders/clip_la-clip.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/clip.la: $(coders_clip_la_OBJECTS) $(coders_clip_la_DEPENDENCIES) $(EXTRA_coders_clip_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_clip_la_LINK) $(am_coders_clip_la_rpath) $(coders_clip_la_OBJECTS) $(coders_clip_la_LIBADD) $(LIBS) +coders/clipboard_la-clipboard.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/clipboard.la: $(coders_clipboard_la_OBJECTS) $(coders_clipboard_la_DEPENDENCIES) $(EXTRA_coders_clipboard_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_clipboard_la_LINK) $(am_coders_clipboard_la_rpath) $(coders_clipboard_la_OBJECTS) $(coders_clipboard_la_LIBADD) $(LIBS) +coders/cmyk_la-cmyk.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/cmyk.la: $(coders_cmyk_la_OBJECTS) $(coders_cmyk_la_DEPENDENCIES) $(EXTRA_coders_cmyk_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_cmyk_la_LINK) $(am_coders_cmyk_la_rpath) $(coders_cmyk_la_OBJECTS) $(coders_cmyk_la_LIBADD) $(LIBS) +coders/cut_la-cut.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/cut.la: $(coders_cut_la_OBJECTS) $(coders_cut_la_DEPENDENCIES) $(EXTRA_coders_cut_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_cut_la_LINK) $(am_coders_cut_la_rpath) $(coders_cut_la_OBJECTS) $(coders_cut_la_LIBADD) $(LIBS) +coders/dcm_la-dcm.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/dcm.la: $(coders_dcm_la_OBJECTS) $(coders_dcm_la_DEPENDENCIES) $(EXTRA_coders_dcm_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_dcm_la_LINK) $(am_coders_dcm_la_rpath) $(coders_dcm_la_OBJECTS) $(coders_dcm_la_LIBADD) $(LIBS) +coders/dds_la-dds.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/dds.la: $(coders_dds_la_OBJECTS) $(coders_dds_la_DEPENDENCIES) $(EXTRA_coders_dds_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_dds_la_LINK) $(am_coders_dds_la_rpath) $(coders_dds_la_OBJECTS) $(coders_dds_la_LIBADD) $(LIBS) +coders/debug_la-debug.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/debug.la: $(coders_debug_la_OBJECTS) $(coders_debug_la_DEPENDENCIES) $(EXTRA_coders_debug_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_debug_la_LINK) $(am_coders_debug_la_rpath) $(coders_debug_la_OBJECTS) $(coders_debug_la_LIBADD) $(LIBS) +coders/dib_la-dib.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/dib.la: $(coders_dib_la_OBJECTS) $(coders_dib_la_DEPENDENCIES) $(EXTRA_coders_dib_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_dib_la_LINK) $(am_coders_dib_la_rpath) $(coders_dib_la_OBJECTS) $(coders_dib_la_LIBADD) $(LIBS) +coders/djvu_la-djvu.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/djvu.la: $(coders_djvu_la_OBJECTS) $(coders_djvu_la_DEPENDENCIES) $(EXTRA_coders_djvu_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_djvu_la_LINK) $(am_coders_djvu_la_rpath) $(coders_djvu_la_OBJECTS) $(coders_djvu_la_LIBADD) $(LIBS) +coders/dng_la-dng.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/dng.la: $(coders_dng_la_OBJECTS) $(coders_dng_la_DEPENDENCIES) $(EXTRA_coders_dng_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_dng_la_LINK) $(am_coders_dng_la_rpath) $(coders_dng_la_OBJECTS) $(coders_dng_la_LIBADD) $(LIBS) +coders/dot_la-dot.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/dot.la: $(coders_dot_la_OBJECTS) $(coders_dot_la_DEPENDENCIES) $(EXTRA_coders_dot_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_dot_la_LINK) $(am_coders_dot_la_rpath) $(coders_dot_la_OBJECTS) $(coders_dot_la_LIBADD) $(LIBS) +coders/dps_la-dps.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/dps.la: $(coders_dps_la_OBJECTS) $(coders_dps_la_DEPENDENCIES) $(EXTRA_coders_dps_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_dps_la_LINK) $(am_coders_dps_la_rpath) $(coders_dps_la_OBJECTS) $(coders_dps_la_LIBADD) $(LIBS) +coders/dpx_la-dpx.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/dpx.la: $(coders_dpx_la_OBJECTS) $(coders_dpx_la_DEPENDENCIES) $(EXTRA_coders_dpx_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_dpx_la_LINK) $(am_coders_dpx_la_rpath) $(coders_dpx_la_OBJECTS) $(coders_dpx_la_LIBADD) $(LIBS) +coders/emf_la-emf.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/emf.la: $(coders_emf_la_OBJECTS) $(coders_emf_la_DEPENDENCIES) $(EXTRA_coders_emf_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_emf_la_LINK) $(am_coders_emf_la_rpath) $(coders_emf_la_OBJECTS) $(coders_emf_la_LIBADD) $(LIBS) +coders/ept_la-ept.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/ept.la: $(coders_ept_la_OBJECTS) $(coders_ept_la_DEPENDENCIES) $(EXTRA_coders_ept_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_ept_la_LINK) $(am_coders_ept_la_rpath) $(coders_ept_la_OBJECTS) $(coders_ept_la_LIBADD) $(LIBS) +coders/exr_la-exr.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/exr.la: $(coders_exr_la_OBJECTS) $(coders_exr_la_DEPENDENCIES) $(EXTRA_coders_exr_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_exr_la_LINK) $(am_coders_exr_la_rpath) $(coders_exr_la_OBJECTS) $(coders_exr_la_LIBADD) $(LIBS) +coders/fax_la-fax.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/fax.la: $(coders_fax_la_OBJECTS) $(coders_fax_la_DEPENDENCIES) $(EXTRA_coders_fax_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_fax_la_LINK) $(am_coders_fax_la_rpath) $(coders_fax_la_OBJECTS) $(coders_fax_la_LIBADD) $(LIBS) +coders/fits_la-fits.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/fits.la: $(coders_fits_la_OBJECTS) $(coders_fits_la_DEPENDENCIES) $(EXTRA_coders_fits_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_fits_la_LINK) $(am_coders_fits_la_rpath) $(coders_fits_la_OBJECTS) $(coders_fits_la_LIBADD) $(LIBS) +coders/flif_la-flif.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/flif.la: $(coders_flif_la_OBJECTS) $(coders_flif_la_DEPENDENCIES) $(EXTRA_coders_flif_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_flif_la_LINK) $(am_coders_flif_la_rpath) $(coders_flif_la_OBJECTS) $(coders_flif_la_LIBADD) $(LIBS) +coders/fpx_la-fpx.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/fpx.la: $(coders_fpx_la_OBJECTS) $(coders_fpx_la_DEPENDENCIES) $(EXTRA_coders_fpx_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_fpx_la_LINK) $(am_coders_fpx_la_rpath) $(coders_fpx_la_OBJECTS) $(coders_fpx_la_LIBADD) $(LIBS) +coders/gif_la-gif.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/gif.la: $(coders_gif_la_OBJECTS) $(coders_gif_la_DEPENDENCIES) $(EXTRA_coders_gif_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_gif_la_LINK) $(am_coders_gif_la_rpath) $(coders_gif_la_OBJECTS) $(coders_gif_la_LIBADD) $(LIBS) +coders/gradient_la-gradient.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/gradient.la: $(coders_gradient_la_OBJECTS) $(coders_gradient_la_DEPENDENCIES) $(EXTRA_coders_gradient_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_gradient_la_LINK) $(am_coders_gradient_la_rpath) $(coders_gradient_la_OBJECTS) $(coders_gradient_la_LIBADD) $(LIBS) +coders/gray_la-gray.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/gray.la: $(coders_gray_la_OBJECTS) $(coders_gray_la_DEPENDENCIES) $(EXTRA_coders_gray_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_gray_la_LINK) $(am_coders_gray_la_rpath) $(coders_gray_la_OBJECTS) $(coders_gray_la_LIBADD) $(LIBS) +coders/hald_la-hald.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/hald.la: $(coders_hald_la_OBJECTS) $(coders_hald_la_DEPENDENCIES) $(EXTRA_coders_hald_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_hald_la_LINK) $(am_coders_hald_la_rpath) $(coders_hald_la_OBJECTS) $(coders_hald_la_LIBADD) $(LIBS) +coders/hdr_la-hdr.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/hdr.la: $(coders_hdr_la_OBJECTS) $(coders_hdr_la_DEPENDENCIES) $(EXTRA_coders_hdr_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_hdr_la_LINK) $(am_coders_hdr_la_rpath) $(coders_hdr_la_OBJECTS) $(coders_hdr_la_LIBADD) $(LIBS) +coders/heic_la-heic.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/heic.la: $(coders_heic_la_OBJECTS) $(coders_heic_la_DEPENDENCIES) $(EXTRA_coders_heic_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_heic_la_LINK) $(am_coders_heic_la_rpath) $(coders_heic_la_OBJECTS) $(coders_heic_la_LIBADD) $(LIBS) +coders/histogram_la-histogram.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/histogram.la: $(coders_histogram_la_OBJECTS) $(coders_histogram_la_DEPENDENCIES) $(EXTRA_coders_histogram_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_histogram_la_LINK) $(am_coders_histogram_la_rpath) $(coders_histogram_la_OBJECTS) $(coders_histogram_la_LIBADD) $(LIBS) +coders/hrz_la-hrz.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/hrz.la: $(coders_hrz_la_OBJECTS) $(coders_hrz_la_DEPENDENCIES) $(EXTRA_coders_hrz_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_hrz_la_LINK) $(am_coders_hrz_la_rpath) $(coders_hrz_la_OBJECTS) $(coders_hrz_la_LIBADD) $(LIBS) +coders/html_la-html.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/html.la: $(coders_html_la_OBJECTS) $(coders_html_la_DEPENDENCIES) $(EXTRA_coders_html_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_html_la_LINK) $(am_coders_html_la_rpath) $(coders_html_la_OBJECTS) $(coders_html_la_LIBADD) $(LIBS) +coders/icon_la-icon.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/icon.la: $(coders_icon_la_OBJECTS) $(coders_icon_la_DEPENDENCIES) $(EXTRA_coders_icon_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_icon_la_LINK) $(am_coders_icon_la_rpath) $(coders_icon_la_OBJECTS) $(coders_icon_la_LIBADD) $(LIBS) +coders/info_la-info.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/info.la: $(coders_info_la_OBJECTS) $(coders_info_la_DEPENDENCIES) $(EXTRA_coders_info_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_info_la_LINK) $(am_coders_info_la_rpath) $(coders_info_la_OBJECTS) $(coders_info_la_LIBADD) $(LIBS) +coders/inline_la-inline.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/inline.la: $(coders_inline_la_OBJECTS) $(coders_inline_la_DEPENDENCIES) $(EXTRA_coders_inline_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_inline_la_LINK) $(am_coders_inline_la_rpath) $(coders_inline_la_OBJECTS) $(coders_inline_la_LIBADD) $(LIBS) +coders/ipl_la-ipl.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/ipl.la: $(coders_ipl_la_OBJECTS) $(coders_ipl_la_DEPENDENCIES) $(EXTRA_coders_ipl_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_ipl_la_LINK) $(am_coders_ipl_la_rpath) $(coders_ipl_la_OBJECTS) $(coders_ipl_la_LIBADD) $(LIBS) +coders/jbig_la-jbig.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/jbig.la: $(coders_jbig_la_OBJECTS) $(coders_jbig_la_DEPENDENCIES) $(EXTRA_coders_jbig_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_jbig_la_LINK) $(am_coders_jbig_la_rpath) $(coders_jbig_la_OBJECTS) $(coders_jbig_la_LIBADD) $(LIBS) +coders/jnx_la-jnx.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/jnx.la: $(coders_jnx_la_OBJECTS) $(coders_jnx_la_DEPENDENCIES) $(EXTRA_coders_jnx_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_jnx_la_LINK) $(am_coders_jnx_la_rpath) $(coders_jnx_la_OBJECTS) $(coders_jnx_la_LIBADD) $(LIBS) +coders/jp2_la-jp2.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/jp2.la: $(coders_jp2_la_OBJECTS) $(coders_jp2_la_DEPENDENCIES) $(EXTRA_coders_jp2_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_jp2_la_LINK) $(am_coders_jp2_la_rpath) $(coders_jp2_la_OBJECTS) $(coders_jp2_la_LIBADD) $(LIBS) +coders/jpeg_la-jpeg.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/jpeg.la: $(coders_jpeg_la_OBJECTS) $(coders_jpeg_la_DEPENDENCIES) $(EXTRA_coders_jpeg_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_jpeg_la_LINK) $(am_coders_jpeg_la_rpath) $(coders_jpeg_la_OBJECTS) $(coders_jpeg_la_LIBADD) $(LIBS) +coders/json_la-json.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/json.la: $(coders_json_la_OBJECTS) $(coders_json_la_DEPENDENCIES) $(EXTRA_coders_json_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_json_la_LINK) $(am_coders_json_la_rpath) $(coders_json_la_OBJECTS) $(coders_json_la_LIBADD) $(LIBS) +coders/label_la-label.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/label.la: $(coders_label_la_OBJECTS) $(coders_label_la_DEPENDENCIES) $(EXTRA_coders_label_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_label_la_LINK) $(am_coders_label_la_rpath) $(coders_label_la_OBJECTS) $(coders_label_la_LIBADD) $(LIBS) +coders/mac_la-mac.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/mac.la: $(coders_mac_la_OBJECTS) $(coders_mac_la_DEPENDENCIES) $(EXTRA_coders_mac_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_mac_la_LINK) $(am_coders_mac_la_rpath) $(coders_mac_la_OBJECTS) $(coders_mac_la_LIBADD) $(LIBS) +coders/magick_la-magick.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/magick.la: $(coders_magick_la_OBJECTS) $(coders_magick_la_DEPENDENCIES) $(EXTRA_coders_magick_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_magick_la_LINK) $(am_coders_magick_la_rpath) $(coders_magick_la_OBJECTS) $(coders_magick_la_LIBADD) $(LIBS) +coders/map_la-map.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/map.la: $(coders_map_la_OBJECTS) $(coders_map_la_DEPENDENCIES) $(EXTRA_coders_map_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_map_la_LINK) $(am_coders_map_la_rpath) $(coders_map_la_OBJECTS) $(coders_map_la_LIBADD) $(LIBS) +coders/mask_la-mask.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/mask.la: $(coders_mask_la_OBJECTS) $(coders_mask_la_DEPENDENCIES) $(EXTRA_coders_mask_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_mask_la_LINK) $(am_coders_mask_la_rpath) $(coders_mask_la_OBJECTS) $(coders_mask_la_LIBADD) $(LIBS) +coders/mat_la-mat.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/mat.la: $(coders_mat_la_OBJECTS) $(coders_mat_la_DEPENDENCIES) $(EXTRA_coders_mat_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_mat_la_LINK) $(am_coders_mat_la_rpath) $(coders_mat_la_OBJECTS) $(coders_mat_la_LIBADD) $(LIBS) +coders/matte_la-matte.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/matte.la: $(coders_matte_la_OBJECTS) $(coders_matte_la_DEPENDENCIES) $(EXTRA_coders_matte_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_matte_la_LINK) $(am_coders_matte_la_rpath) $(coders_matte_la_OBJECTS) $(coders_matte_la_LIBADD) $(LIBS) +coders/meta_la-meta.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/meta.la: $(coders_meta_la_OBJECTS) $(coders_meta_la_DEPENDENCIES) $(EXTRA_coders_meta_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_meta_la_LINK) $(am_coders_meta_la_rpath) $(coders_meta_la_OBJECTS) $(coders_meta_la_LIBADD) $(LIBS) +coders/miff_la-miff.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/miff.la: $(coders_miff_la_OBJECTS) $(coders_miff_la_DEPENDENCIES) $(EXTRA_coders_miff_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_miff_la_LINK) $(am_coders_miff_la_rpath) $(coders_miff_la_OBJECTS) $(coders_miff_la_LIBADD) $(LIBS) +coders/mono_la-mono.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/mono.la: $(coders_mono_la_OBJECTS) $(coders_mono_la_DEPENDENCIES) $(EXTRA_coders_mono_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_mono_la_LINK) $(am_coders_mono_la_rpath) $(coders_mono_la_OBJECTS) $(coders_mono_la_LIBADD) $(LIBS) +coders/mpc_la-mpc.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/mpc.la: $(coders_mpc_la_OBJECTS) $(coders_mpc_la_DEPENDENCIES) $(EXTRA_coders_mpc_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_mpc_la_LINK) $(am_coders_mpc_la_rpath) $(coders_mpc_la_OBJECTS) $(coders_mpc_la_LIBADD) $(LIBS) +coders/mpr_la-mpr.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/mpr.la: $(coders_mpr_la_OBJECTS) $(coders_mpr_la_DEPENDENCIES) $(EXTRA_coders_mpr_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_mpr_la_LINK) $(am_coders_mpr_la_rpath) $(coders_mpr_la_OBJECTS) $(coders_mpr_la_LIBADD) $(LIBS) +coders/msl_la-msl.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/msl.la: $(coders_msl_la_OBJECTS) $(coders_msl_la_DEPENDENCIES) $(EXTRA_coders_msl_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_msl_la_LINK) $(am_coders_msl_la_rpath) $(coders_msl_la_OBJECTS) $(coders_msl_la_LIBADD) $(LIBS) +coders/mtv_la-mtv.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/mtv.la: $(coders_mtv_la_OBJECTS) $(coders_mtv_la_DEPENDENCIES) $(EXTRA_coders_mtv_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_mtv_la_LINK) $(am_coders_mtv_la_rpath) $(coders_mtv_la_OBJECTS) $(coders_mtv_la_LIBADD) $(LIBS) +coders/mvg_la-mvg.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/mvg.la: $(coders_mvg_la_OBJECTS) $(coders_mvg_la_DEPENDENCIES) $(EXTRA_coders_mvg_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_mvg_la_LINK) $(am_coders_mvg_la_rpath) $(coders_mvg_la_OBJECTS) $(coders_mvg_la_LIBADD) $(LIBS) +coders/null_la-null.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/null.la: $(coders_null_la_OBJECTS) $(coders_null_la_DEPENDENCIES) $(EXTRA_coders_null_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_null_la_LINK) $(am_coders_null_la_rpath) $(coders_null_la_OBJECTS) $(coders_null_la_LIBADD) $(LIBS) +coders/otb_la-otb.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/otb.la: $(coders_otb_la_OBJECTS) $(coders_otb_la_DEPENDENCIES) $(EXTRA_coders_otb_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_otb_la_LINK) $(am_coders_otb_la_rpath) $(coders_otb_la_OBJECTS) $(coders_otb_la_LIBADD) $(LIBS) +coders/palm_la-palm.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/palm.la: $(coders_palm_la_OBJECTS) $(coders_palm_la_DEPENDENCIES) $(EXTRA_coders_palm_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_palm_la_LINK) $(am_coders_palm_la_rpath) $(coders_palm_la_OBJECTS) $(coders_palm_la_LIBADD) $(LIBS) +coders/pango_la-pango.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pango.la: $(coders_pango_la_OBJECTS) $(coders_pango_la_DEPENDENCIES) $(EXTRA_coders_pango_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pango_la_LINK) $(am_coders_pango_la_rpath) $(coders_pango_la_OBJECTS) $(coders_pango_la_LIBADD) $(LIBS) +coders/pattern_la-pattern.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pattern.la: $(coders_pattern_la_OBJECTS) $(coders_pattern_la_DEPENDENCIES) $(EXTRA_coders_pattern_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pattern_la_LINK) $(am_coders_pattern_la_rpath) $(coders_pattern_la_OBJECTS) $(coders_pattern_la_LIBADD) $(LIBS) +coders/pcd_la-pcd.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pcd.la: $(coders_pcd_la_OBJECTS) $(coders_pcd_la_DEPENDENCIES) $(EXTRA_coders_pcd_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pcd_la_LINK) $(am_coders_pcd_la_rpath) $(coders_pcd_la_OBJECTS) $(coders_pcd_la_LIBADD) $(LIBS) +coders/pcl_la-pcl.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pcl.la: $(coders_pcl_la_OBJECTS) $(coders_pcl_la_DEPENDENCIES) $(EXTRA_coders_pcl_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pcl_la_LINK) $(am_coders_pcl_la_rpath) $(coders_pcl_la_OBJECTS) $(coders_pcl_la_LIBADD) $(LIBS) +coders/pcx_la-pcx.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pcx.la: $(coders_pcx_la_OBJECTS) $(coders_pcx_la_DEPENDENCIES) $(EXTRA_coders_pcx_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pcx_la_LINK) $(am_coders_pcx_la_rpath) $(coders_pcx_la_OBJECTS) $(coders_pcx_la_LIBADD) $(LIBS) +coders/pdb_la-pdb.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pdb.la: $(coders_pdb_la_OBJECTS) $(coders_pdb_la_DEPENDENCIES) $(EXTRA_coders_pdb_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pdb_la_LINK) $(am_coders_pdb_la_rpath) $(coders_pdb_la_OBJECTS) $(coders_pdb_la_LIBADD) $(LIBS) +coders/pdf_la-pdf.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pdf.la: $(coders_pdf_la_OBJECTS) $(coders_pdf_la_DEPENDENCIES) $(EXTRA_coders_pdf_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pdf_la_LINK) $(am_coders_pdf_la_rpath) $(coders_pdf_la_OBJECTS) $(coders_pdf_la_LIBADD) $(LIBS) +coders/pes_la-pes.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pes.la: $(coders_pes_la_OBJECTS) $(coders_pes_la_DEPENDENCIES) $(EXTRA_coders_pes_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pes_la_LINK) $(am_coders_pes_la_rpath) $(coders_pes_la_OBJECTS) $(coders_pes_la_LIBADD) $(LIBS) +coders/pgx_la-pgx.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pgx.la: $(coders_pgx_la_OBJECTS) $(coders_pgx_la_DEPENDENCIES) $(EXTRA_coders_pgx_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pgx_la_LINK) $(am_coders_pgx_la_rpath) $(coders_pgx_la_OBJECTS) $(coders_pgx_la_LIBADD) $(LIBS) +coders/pict_la-pict.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pict.la: $(coders_pict_la_OBJECTS) $(coders_pict_la_DEPENDENCIES) $(EXTRA_coders_pict_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pict_la_LINK) $(am_coders_pict_la_rpath) $(coders_pict_la_OBJECTS) $(coders_pict_la_LIBADD) $(LIBS) +coders/pix_la-pix.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pix.la: $(coders_pix_la_OBJECTS) $(coders_pix_la_DEPENDENCIES) $(EXTRA_coders_pix_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pix_la_LINK) $(am_coders_pix_la_rpath) $(coders_pix_la_OBJECTS) $(coders_pix_la_LIBADD) $(LIBS) +coders/plasma_la-plasma.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/plasma.la: $(coders_plasma_la_OBJECTS) $(coders_plasma_la_DEPENDENCIES) $(EXTRA_coders_plasma_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_plasma_la_LINK) $(am_coders_plasma_la_rpath) $(coders_plasma_la_OBJECTS) $(coders_plasma_la_LIBADD) $(LIBS) +coders/png_la-png.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/png.la: $(coders_png_la_OBJECTS) $(coders_png_la_DEPENDENCIES) $(EXTRA_coders_png_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_png_la_LINK) $(am_coders_png_la_rpath) $(coders_png_la_OBJECTS) $(coders_png_la_LIBADD) $(LIBS) +coders/pnm_la-pnm.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pnm.la: $(coders_pnm_la_OBJECTS) $(coders_pnm_la_DEPENDENCIES) $(EXTRA_coders_pnm_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pnm_la_LINK) $(am_coders_pnm_la_rpath) $(coders_pnm_la_OBJECTS) $(coders_pnm_la_LIBADD) $(LIBS) +coders/preview_la-preview.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/preview.la: $(coders_preview_la_OBJECTS) $(coders_preview_la_DEPENDENCIES) $(EXTRA_coders_preview_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_preview_la_LINK) $(am_coders_preview_la_rpath) $(coders_preview_la_OBJECTS) $(coders_preview_la_LIBADD) $(LIBS) +coders/ps_la-ps.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/ps.la: $(coders_ps_la_OBJECTS) $(coders_ps_la_DEPENDENCIES) $(EXTRA_coders_ps_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_ps_la_LINK) $(am_coders_ps_la_rpath) $(coders_ps_la_OBJECTS) $(coders_ps_la_LIBADD) $(LIBS) +coders/ps2_la-ps2.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/ps2.la: $(coders_ps2_la_OBJECTS) $(coders_ps2_la_DEPENDENCIES) $(EXTRA_coders_ps2_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_ps2_la_LINK) $(am_coders_ps2_la_rpath) $(coders_ps2_la_OBJECTS) $(coders_ps2_la_LIBADD) $(LIBS) +coders/ps3_la-ps3.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/ps3.la: $(coders_ps3_la_OBJECTS) $(coders_ps3_la_DEPENDENCIES) $(EXTRA_coders_ps3_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_ps3_la_LINK) $(am_coders_ps3_la_rpath) $(coders_ps3_la_OBJECTS) $(coders_ps3_la_LIBADD) $(LIBS) +coders/psd_la-psd.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/psd.la: $(coders_psd_la_OBJECTS) $(coders_psd_la_DEPENDENCIES) $(EXTRA_coders_psd_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_psd_la_LINK) $(am_coders_psd_la_rpath) $(coders_psd_la_OBJECTS) $(coders_psd_la_LIBADD) $(LIBS) +coders/pwp_la-pwp.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/pwp.la: $(coders_pwp_la_OBJECTS) $(coders_pwp_la_DEPENDENCIES) $(EXTRA_coders_pwp_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_pwp_la_LINK) $(am_coders_pwp_la_rpath) $(coders_pwp_la_OBJECTS) $(coders_pwp_la_LIBADD) $(LIBS) +coders/raw_la-raw.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/raw.la: $(coders_raw_la_OBJECTS) $(coders_raw_la_DEPENDENCIES) $(EXTRA_coders_raw_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_raw_la_LINK) $(am_coders_raw_la_rpath) $(coders_raw_la_OBJECTS) $(coders_raw_la_LIBADD) $(LIBS) +coders/rgb_la-rgb.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/rgb.la: $(coders_rgb_la_OBJECTS) $(coders_rgb_la_DEPENDENCIES) $(EXTRA_coders_rgb_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_rgb_la_LINK) $(am_coders_rgb_la_rpath) $(coders_rgb_la_OBJECTS) $(coders_rgb_la_LIBADD) $(LIBS) +coders/rgf_la-rgf.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/rgf.la: $(coders_rgf_la_OBJECTS) $(coders_rgf_la_DEPENDENCIES) $(EXTRA_coders_rgf_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_rgf_la_LINK) $(am_coders_rgf_la_rpath) $(coders_rgf_la_OBJECTS) $(coders_rgf_la_LIBADD) $(LIBS) +coders/rla_la-rla.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/rla.la: $(coders_rla_la_OBJECTS) $(coders_rla_la_DEPENDENCIES) $(EXTRA_coders_rla_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_rla_la_LINK) $(am_coders_rla_la_rpath) $(coders_rla_la_OBJECTS) $(coders_rla_la_LIBADD) $(LIBS) +coders/rle_la-rle.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/rle.la: $(coders_rle_la_OBJECTS) $(coders_rle_la_DEPENDENCIES) $(EXTRA_coders_rle_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_rle_la_LINK) $(am_coders_rle_la_rpath) $(coders_rle_la_OBJECTS) $(coders_rle_la_LIBADD) $(LIBS) +coders/scr_la-scr.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/scr.la: $(coders_scr_la_OBJECTS) $(coders_scr_la_DEPENDENCIES) $(EXTRA_coders_scr_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_scr_la_LINK) $(am_coders_scr_la_rpath) $(coders_scr_la_OBJECTS) $(coders_scr_la_LIBADD) $(LIBS) +coders/sct_la-sct.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/sct.la: $(coders_sct_la_OBJECTS) $(coders_sct_la_DEPENDENCIES) $(EXTRA_coders_sct_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_sct_la_LINK) $(am_coders_sct_la_rpath) $(coders_sct_la_OBJECTS) $(coders_sct_la_LIBADD) $(LIBS) +coders/sfw_la-sfw.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/sfw.la: $(coders_sfw_la_OBJECTS) $(coders_sfw_la_DEPENDENCIES) $(EXTRA_coders_sfw_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_sfw_la_LINK) $(am_coders_sfw_la_rpath) $(coders_sfw_la_OBJECTS) $(coders_sfw_la_LIBADD) $(LIBS) +coders/sgi_la-sgi.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/sgi.la: $(coders_sgi_la_OBJECTS) $(coders_sgi_la_DEPENDENCIES) $(EXTRA_coders_sgi_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_sgi_la_LINK) $(am_coders_sgi_la_rpath) $(coders_sgi_la_OBJECTS) $(coders_sgi_la_LIBADD) $(LIBS) +coders/sixel_la-sixel.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/sixel.la: $(coders_sixel_la_OBJECTS) $(coders_sixel_la_DEPENDENCIES) $(EXTRA_coders_sixel_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_sixel_la_LINK) $(am_coders_sixel_la_rpath) $(coders_sixel_la_OBJECTS) $(coders_sixel_la_LIBADD) $(LIBS) +coders/stegano_la-stegano.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/stegano.la: $(coders_stegano_la_OBJECTS) $(coders_stegano_la_DEPENDENCIES) $(EXTRA_coders_stegano_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_stegano_la_LINK) $(am_coders_stegano_la_rpath) $(coders_stegano_la_OBJECTS) $(coders_stegano_la_LIBADD) $(LIBS) +coders/sun_la-sun.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/sun.la: $(coders_sun_la_OBJECTS) $(coders_sun_la_DEPENDENCIES) $(EXTRA_coders_sun_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_sun_la_LINK) $(am_coders_sun_la_rpath) $(coders_sun_la_OBJECTS) $(coders_sun_la_LIBADD) $(LIBS) +coders/svg_la-svg.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/svg.la: $(coders_svg_la_OBJECTS) $(coders_svg_la_DEPENDENCIES) $(EXTRA_coders_svg_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_svg_la_LINK) $(am_coders_svg_la_rpath) $(coders_svg_la_OBJECTS) $(coders_svg_la_LIBADD) $(LIBS) +coders/tga_la-tga.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/tga.la: $(coders_tga_la_OBJECTS) $(coders_tga_la_DEPENDENCIES) $(EXTRA_coders_tga_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_tga_la_LINK) $(am_coders_tga_la_rpath) $(coders_tga_la_OBJECTS) $(coders_tga_la_LIBADD) $(LIBS) +coders/thumbnail_la-thumbnail.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/thumbnail.la: $(coders_thumbnail_la_OBJECTS) $(coders_thumbnail_la_DEPENDENCIES) $(EXTRA_coders_thumbnail_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_thumbnail_la_LINK) $(am_coders_thumbnail_la_rpath) $(coders_thumbnail_la_OBJECTS) $(coders_thumbnail_la_LIBADD) $(LIBS) +coders/tiff_la-tiff.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) +coders/tiff_la-psd.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/tiff.la: $(coders_tiff_la_OBJECTS) $(coders_tiff_la_DEPENDENCIES) $(EXTRA_coders_tiff_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_tiff_la_LINK) $(am_coders_tiff_la_rpath) $(coders_tiff_la_OBJECTS) $(coders_tiff_la_LIBADD) $(LIBS) +coders/tile_la-tile.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/tile.la: $(coders_tile_la_OBJECTS) $(coders_tile_la_DEPENDENCIES) $(EXTRA_coders_tile_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_tile_la_LINK) $(am_coders_tile_la_rpath) $(coders_tile_la_OBJECTS) $(coders_tile_la_LIBADD) $(LIBS) +coders/tim_la-tim.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/tim.la: $(coders_tim_la_OBJECTS) $(coders_tim_la_DEPENDENCIES) $(EXTRA_coders_tim_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_tim_la_LINK) $(am_coders_tim_la_rpath) $(coders_tim_la_OBJECTS) $(coders_tim_la_LIBADD) $(LIBS) +coders/ttf_la-ttf.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/ttf.la: $(coders_ttf_la_OBJECTS) $(coders_ttf_la_DEPENDENCIES) $(EXTRA_coders_ttf_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_ttf_la_LINK) $(am_coders_ttf_la_rpath) $(coders_ttf_la_OBJECTS) $(coders_ttf_la_LIBADD) $(LIBS) +coders/txt_la-txt.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/txt.la: $(coders_txt_la_OBJECTS) $(coders_txt_la_DEPENDENCIES) $(EXTRA_coders_txt_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_txt_la_LINK) $(am_coders_txt_la_rpath) $(coders_txt_la_OBJECTS) $(coders_txt_la_LIBADD) $(LIBS) +coders/uil_la-uil.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/uil.la: $(coders_uil_la_OBJECTS) $(coders_uil_la_DEPENDENCIES) $(EXTRA_coders_uil_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_uil_la_LINK) $(am_coders_uil_la_rpath) $(coders_uil_la_OBJECTS) $(coders_uil_la_LIBADD) $(LIBS) +coders/url_la-url.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/url.la: $(coders_url_la_OBJECTS) $(coders_url_la_DEPENDENCIES) $(EXTRA_coders_url_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_url_la_LINK) $(am_coders_url_la_rpath) $(coders_url_la_OBJECTS) $(coders_url_la_LIBADD) $(LIBS) +coders/uyvy_la-uyvy.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/uyvy.la: $(coders_uyvy_la_OBJECTS) $(coders_uyvy_la_DEPENDENCIES) $(EXTRA_coders_uyvy_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_uyvy_la_LINK) $(am_coders_uyvy_la_rpath) $(coders_uyvy_la_OBJECTS) $(coders_uyvy_la_LIBADD) $(LIBS) +coders/vicar_la-vicar.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/vicar.la: $(coders_vicar_la_OBJECTS) $(coders_vicar_la_DEPENDENCIES) $(EXTRA_coders_vicar_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_vicar_la_LINK) $(am_coders_vicar_la_rpath) $(coders_vicar_la_OBJECTS) $(coders_vicar_la_LIBADD) $(LIBS) +coders/vid_la-vid.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/vid.la: $(coders_vid_la_OBJECTS) $(coders_vid_la_DEPENDENCIES) $(EXTRA_coders_vid_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_vid_la_LINK) $(am_coders_vid_la_rpath) $(coders_vid_la_OBJECTS) $(coders_vid_la_LIBADD) $(LIBS) +coders/video_la-video.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/video.la: $(coders_video_la_OBJECTS) $(coders_video_la_DEPENDENCIES) $(EXTRA_coders_video_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_video_la_LINK) $(am_coders_video_la_rpath) $(coders_video_la_OBJECTS) $(coders_video_la_LIBADD) $(LIBS) +coders/viff_la-viff.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/viff.la: $(coders_viff_la_OBJECTS) $(coders_viff_la_DEPENDENCIES) $(EXTRA_coders_viff_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_viff_la_LINK) $(am_coders_viff_la_rpath) $(coders_viff_la_OBJECTS) $(coders_viff_la_LIBADD) $(LIBS) +coders/vips_la-vips.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/vips.la: $(coders_vips_la_OBJECTS) $(coders_vips_la_DEPENDENCIES) $(EXTRA_coders_vips_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_vips_la_LINK) $(am_coders_vips_la_rpath) $(coders_vips_la_OBJECTS) $(coders_vips_la_LIBADD) $(LIBS) +coders/wbmp_la-wbmp.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/wbmp.la: $(coders_wbmp_la_OBJECTS) $(coders_wbmp_la_DEPENDENCIES) $(EXTRA_coders_wbmp_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_wbmp_la_LINK) $(am_coders_wbmp_la_rpath) $(coders_wbmp_la_OBJECTS) $(coders_wbmp_la_LIBADD) $(LIBS) +coders/webp_la-webp.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/webp.la: $(coders_webp_la_OBJECTS) $(coders_webp_la_DEPENDENCIES) $(EXTRA_coders_webp_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_webp_la_LINK) $(am_coders_webp_la_rpath) $(coders_webp_la_OBJECTS) $(coders_webp_la_LIBADD) $(LIBS) +coders/wmf_la-wmf.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/wmf.la: $(coders_wmf_la_OBJECTS) $(coders_wmf_la_DEPENDENCIES) $(EXTRA_coders_wmf_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_wmf_la_LINK) $(am_coders_wmf_la_rpath) $(coders_wmf_la_OBJECTS) $(coders_wmf_la_LIBADD) $(LIBS) +coders/wpg_la-wpg.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/wpg.la: $(coders_wpg_la_OBJECTS) $(coders_wpg_la_DEPENDENCIES) $(EXTRA_coders_wpg_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_wpg_la_LINK) $(am_coders_wpg_la_rpath) $(coders_wpg_la_OBJECTS) $(coders_wpg_la_LIBADD) $(LIBS) +coders/x_la-x.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/x.la: $(coders_x_la_OBJECTS) $(coders_x_la_DEPENDENCIES) $(EXTRA_coders_x_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_x_la_LINK) $(am_coders_x_la_rpath) $(coders_x_la_OBJECTS) $(coders_x_la_LIBADD) $(LIBS) +coders/xbm_la-xbm.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/xbm.la: $(coders_xbm_la_OBJECTS) $(coders_xbm_la_DEPENDENCIES) $(EXTRA_coders_xbm_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_xbm_la_LINK) $(am_coders_xbm_la_rpath) $(coders_xbm_la_OBJECTS) $(coders_xbm_la_LIBADD) $(LIBS) +coders/xc_la-xc.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/xc.la: $(coders_xc_la_OBJECTS) $(coders_xc_la_DEPENDENCIES) $(EXTRA_coders_xc_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_xc_la_LINK) $(am_coders_xc_la_rpath) $(coders_xc_la_OBJECTS) $(coders_xc_la_LIBADD) $(LIBS) +coders/xcf_la-xcf.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/xcf.la: $(coders_xcf_la_OBJECTS) $(coders_xcf_la_DEPENDENCIES) $(EXTRA_coders_xcf_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_xcf_la_LINK) $(am_coders_xcf_la_rpath) $(coders_xcf_la_OBJECTS) $(coders_xcf_la_LIBADD) $(LIBS) +coders/xpm_la-xpm.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/xpm.la: $(coders_xpm_la_OBJECTS) $(coders_xpm_la_DEPENDENCIES) $(EXTRA_coders_xpm_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_xpm_la_LINK) $(am_coders_xpm_la_rpath) $(coders_xpm_la_OBJECTS) $(coders_xpm_la_LIBADD) $(LIBS) +coders/xps_la-xps.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/xps.la: $(coders_xps_la_OBJECTS) $(coders_xps_la_DEPENDENCIES) $(EXTRA_coders_xps_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_xps_la_LINK) $(am_coders_xps_la_rpath) $(coders_xps_la_OBJECTS) $(coders_xps_la_LIBADD) $(LIBS) +coders/xwd_la-xwd.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/xwd.la: $(coders_xwd_la_OBJECTS) $(coders_xwd_la_DEPENDENCIES) $(EXTRA_coders_xwd_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_xwd_la_LINK) $(am_coders_xwd_la_rpath) $(coders_xwd_la_OBJECTS) $(coders_xwd_la_LIBADD) $(LIBS) +coders/ycbcr_la-ycbcr.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/ycbcr.la: $(coders_ycbcr_la_OBJECTS) $(coders_ycbcr_la_DEPENDENCIES) $(EXTRA_coders_ycbcr_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_ycbcr_la_LINK) $(am_coders_ycbcr_la_rpath) $(coders_ycbcr_la_OBJECTS) $(coders_ycbcr_la_LIBADD) $(LIBS) +coders/yuv_la-yuv.lo: coders/$(am__dirstamp) \ + coders/$(DEPDIR)/$(am__dirstamp) + +coders/yuv.la: $(coders_yuv_la_OBJECTS) $(coders_yuv_la_DEPENDENCIES) $(EXTRA_coders_yuv_la_DEPENDENCIES) coders/$(am__dirstamp) + $(AM_V_CCLD)$(coders_yuv_la_LINK) $(am_coders_yuv_la_rpath) $(coders_yuv_la_OBJECTS) $(coders_yuv_la_LIBADD) $(LIBS) +filters/$(am__dirstamp): + @$(MKDIR_P) filters + @: > filters/$(am__dirstamp) +filters/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) filters/$(DEPDIR) + @: > filters/$(DEPDIR)/$(am__dirstamp) +filters/analyze_la-analyze.lo: filters/$(am__dirstamp) \ + filters/$(DEPDIR)/$(am__dirstamp) + +filters/analyze.la: $(filters_analyze_la_OBJECTS) $(filters_analyze_la_DEPENDENCIES) $(EXTRA_filters_analyze_la_DEPENDENCIES) filters/$(am__dirstamp) + $(AM_V_CCLD)$(filters_analyze_la_LINK) $(am_filters_analyze_la_rpath) $(filters_analyze_la_OBJECTS) $(filters_analyze_la_LIBADD) $(LIBS) +magick/$(am__dirstamp): + @$(MKDIR_P) magick + @: > magick/$(am__dirstamp) +magick/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) magick/$(DEPDIR) + @: > magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.lo: \ + magick/$(am__dirstamp) magick/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.lo: \ + coders/$(am__dirstamp) coders/$(DEPDIR)/$(am__dirstamp) +filters/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.lo: \ + filters/$(am__dirstamp) filters/$(DEPDIR)/$(am__dirstamp) + +magick/libMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la: $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_DEPENDENCIES) $(EXTRA_magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_DEPENDENCIES) magick/$(am__dirstamp) + $(AM_V_CCLD)$(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LINK) -rpath $(libdir) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD) $(LIBS) +wand/$(am__dirstamp): + @$(MKDIR_P) wand + @: > wand/$(am__dirstamp) +wand/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) wand/$(DEPDIR) + @: > wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.lo: \ + wand/$(am__dirstamp) wand/$(DEPDIR)/$(am__dirstamp) + +wand/libMagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la: $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_DEPENDENCIES) $(EXTRA_wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_DEPENDENCIES) wand/$(am__dirstamp) + $(AM_V_CCLD)$(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LINK) -rpath $(libdir) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_OBJECTS) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD) $(LIBS) +Magick++/demo/$(am__dirstamp): + @$(MKDIR_P) Magick++/demo + @: > Magick++/demo/$(am__dirstamp) +Magick++/demo/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) Magick++/demo/$(DEPDIR) + @: > Magick++/demo/$(DEPDIR)/$(am__dirstamp) +Magick++/demo/analyze-analyze.$(OBJEXT): \ + Magick++/demo/$(am__dirstamp) \ + Magick++/demo/$(DEPDIR)/$(am__dirstamp) + +Magick++/demo/analyze$(EXEEXT): $(Magick___demo_analyze_OBJECTS) $(Magick___demo_analyze_DEPENDENCIES) $(EXTRA_Magick___demo_analyze_DEPENDENCIES) Magick++/demo/$(am__dirstamp) + @rm -f Magick++/demo/analyze$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___demo_analyze_OBJECTS) $(Magick___demo_analyze_LDADD) $(LIBS) +Magick++/demo/button-button.$(OBJEXT): Magick++/demo/$(am__dirstamp) \ + Magick++/demo/$(DEPDIR)/$(am__dirstamp) + +Magick++/demo/button$(EXEEXT): $(Magick___demo_button_OBJECTS) $(Magick___demo_button_DEPENDENCIES) $(EXTRA_Magick___demo_button_DEPENDENCIES) Magick++/demo/$(am__dirstamp) + @rm -f Magick++/demo/button$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___demo_button_OBJECTS) $(Magick___demo_button_LDADD) $(LIBS) +Magick++/demo/demo-demo.$(OBJEXT): Magick++/demo/$(am__dirstamp) \ + Magick++/demo/$(DEPDIR)/$(am__dirstamp) + +Magick++/demo/demo$(EXEEXT): $(Magick___demo_demo_OBJECTS) $(Magick___demo_demo_DEPENDENCIES) $(EXTRA_Magick___demo_demo_DEPENDENCIES) Magick++/demo/$(am__dirstamp) + @rm -f Magick++/demo/demo$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___demo_demo_OBJECTS) $(Magick___demo_demo_LDADD) $(LIBS) +Magick++/demo/detrans-detrans.$(OBJEXT): \ + Magick++/demo/$(am__dirstamp) \ + Magick++/demo/$(DEPDIR)/$(am__dirstamp) + +Magick++/demo/detrans$(EXEEXT): $(Magick___demo_detrans_OBJECTS) $(Magick___demo_detrans_DEPENDENCIES) $(EXTRA_Magick___demo_detrans_DEPENDENCIES) Magick++/demo/$(am__dirstamp) + @rm -f Magick++/demo/detrans$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___demo_detrans_OBJECTS) $(Magick___demo_detrans_LDADD) $(LIBS) +Magick++/demo/flip-flip.$(OBJEXT): Magick++/demo/$(am__dirstamp) \ + Magick++/demo/$(DEPDIR)/$(am__dirstamp) + +Magick++/demo/flip$(EXEEXT): $(Magick___demo_flip_OBJECTS) $(Magick___demo_flip_DEPENDENCIES) $(EXTRA_Magick___demo_flip_DEPENDENCIES) Magick++/demo/$(am__dirstamp) + @rm -f Magick++/demo/flip$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___demo_flip_OBJECTS) $(Magick___demo_flip_LDADD) $(LIBS) +Magick++/demo/gravity-gravity.$(OBJEXT): \ + Magick++/demo/$(am__dirstamp) \ + Magick++/demo/$(DEPDIR)/$(am__dirstamp) + +Magick++/demo/gravity$(EXEEXT): $(Magick___demo_gravity_OBJECTS) $(Magick___demo_gravity_DEPENDENCIES) $(EXTRA_Magick___demo_gravity_DEPENDENCIES) Magick++/demo/$(am__dirstamp) + @rm -f Magick++/demo/gravity$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___demo_gravity_OBJECTS) $(Magick___demo_gravity_LDADD) $(LIBS) +Magick++/demo/piddle-piddle.$(OBJEXT): Magick++/demo/$(am__dirstamp) \ + Magick++/demo/$(DEPDIR)/$(am__dirstamp) + +Magick++/demo/piddle$(EXEEXT): $(Magick___demo_piddle_OBJECTS) $(Magick___demo_piddle_DEPENDENCIES) $(EXTRA_Magick___demo_piddle_DEPENDENCIES) Magick++/demo/$(am__dirstamp) + @rm -f Magick++/demo/piddle$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___demo_piddle_OBJECTS) $(Magick___demo_piddle_LDADD) $(LIBS) +Magick++/demo/shapes-shapes.$(OBJEXT): Magick++/demo/$(am__dirstamp) \ + Magick++/demo/$(DEPDIR)/$(am__dirstamp) + +Magick++/demo/shapes$(EXEEXT): $(Magick___demo_shapes_OBJECTS) $(Magick___demo_shapes_DEPENDENCIES) $(EXTRA_Magick___demo_shapes_DEPENDENCIES) Magick++/demo/$(am__dirstamp) + @rm -f Magick++/demo/shapes$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___demo_shapes_OBJECTS) $(Magick___demo_shapes_LDADD) $(LIBS) +Magick++/demo/zoom-zoom.$(OBJEXT): Magick++/demo/$(am__dirstamp) \ + Magick++/demo/$(DEPDIR)/$(am__dirstamp) + +Magick++/demo/zoom$(EXEEXT): $(Magick___demo_zoom_OBJECTS) $(Magick___demo_zoom_DEPENDENCIES) $(EXTRA_Magick___demo_zoom_DEPENDENCIES) Magick++/demo/$(am__dirstamp) + @rm -f Magick++/demo/zoom$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___demo_zoom_OBJECTS) $(Magick___demo_zoom_LDADD) $(LIBS) +Magick++/tests/$(am__dirstamp): + @$(MKDIR_P) Magick++/tests + @: > Magick++/tests/$(am__dirstamp) +Magick++/tests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) Magick++/tests/$(DEPDIR) + @: > Magick++/tests/$(DEPDIR)/$(am__dirstamp) +Magick++/tests/appendImages-appendImages.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/appendImages$(EXEEXT): $(Magick___tests_appendImages_OBJECTS) $(Magick___tests_appendImages_DEPENDENCIES) $(EXTRA_Magick___tests_appendImages_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/appendImages$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_appendImages_OBJECTS) $(Magick___tests_appendImages_LDADD) $(LIBS) +Magick++/tests/attributes-attributes.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/attributes$(EXEEXT): $(Magick___tests_attributes_OBJECTS) $(Magick___tests_attributes_DEPENDENCIES) $(EXTRA_Magick___tests_attributes_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/attributes$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_attributes_OBJECTS) $(Magick___tests_attributes_LDADD) $(LIBS) +Magick++/tests/averageImages-averageImages.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/averageImages$(EXEEXT): $(Magick___tests_averageImages_OBJECTS) $(Magick___tests_averageImages_DEPENDENCIES) $(EXTRA_Magick___tests_averageImages_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/averageImages$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_averageImages_OBJECTS) $(Magick___tests_averageImages_LDADD) $(LIBS) +Magick++/tests/coalesceImages-coalesceImages.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/coalesceImages$(EXEEXT): $(Magick___tests_coalesceImages_OBJECTS) $(Magick___tests_coalesceImages_DEPENDENCIES) $(EXTRA_Magick___tests_coalesceImages_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/coalesceImages$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_coalesceImages_OBJECTS) $(Magick___tests_coalesceImages_LDADD) $(LIBS) +Magick++/tests/coderInfo-coderInfo.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/coderInfo$(EXEEXT): $(Magick___tests_coderInfo_OBJECTS) $(Magick___tests_coderInfo_DEPENDENCIES) $(EXTRA_Magick___tests_coderInfo_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/coderInfo$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_coderInfo_OBJECTS) $(Magick___tests_coderInfo_LDADD) $(LIBS) +Magick++/tests/color-color.$(OBJEXT): Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/color$(EXEEXT): $(Magick___tests_color_OBJECTS) $(Magick___tests_color_DEPENDENCIES) $(EXTRA_Magick___tests_color_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/color$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_color_OBJECTS) $(Magick___tests_color_LDADD) $(LIBS) +Magick++/tests/colorHistogram-colorHistogram.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/colorHistogram$(EXEEXT): $(Magick___tests_colorHistogram_OBJECTS) $(Magick___tests_colorHistogram_DEPENDENCIES) $(EXTRA_Magick___tests_colorHistogram_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/colorHistogram$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_colorHistogram_OBJECTS) $(Magick___tests_colorHistogram_LDADD) $(LIBS) +Magick++/tests/exceptions-exceptions.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/exceptions$(EXEEXT): $(Magick___tests_exceptions_OBJECTS) $(Magick___tests_exceptions_DEPENDENCIES) $(EXTRA_Magick___tests_exceptions_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/exceptions$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_exceptions_OBJECTS) $(Magick___tests_exceptions_LDADD) $(LIBS) +Magick++/tests/montageImages-montageImages.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/montageImages$(EXEEXT): $(Magick___tests_montageImages_OBJECTS) $(Magick___tests_montageImages_DEPENDENCIES) $(EXTRA_Magick___tests_montageImages_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/montageImages$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_montageImages_OBJECTS) $(Magick___tests_montageImages_LDADD) $(LIBS) +Magick++/tests/morphImages-morphImages.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/morphImages$(EXEEXT): $(Magick___tests_morphImages_OBJECTS) $(Magick___tests_morphImages_DEPENDENCIES) $(EXTRA_Magick___tests_morphImages_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/morphImages$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_morphImages_OBJECTS) $(Magick___tests_morphImages_LDADD) $(LIBS) +Magick++/tests/readWriteBlob-readWriteBlob.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/readWriteBlob$(EXEEXT): $(Magick___tests_readWriteBlob_OBJECTS) $(Magick___tests_readWriteBlob_DEPENDENCIES) $(EXTRA_Magick___tests_readWriteBlob_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/readWriteBlob$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_readWriteBlob_OBJECTS) $(Magick___tests_readWriteBlob_LDADD) $(LIBS) +Magick++/tests/readWriteImages-readWriteImages.$(OBJEXT): \ + Magick++/tests/$(am__dirstamp) \ + Magick++/tests/$(DEPDIR)/$(am__dirstamp) + +Magick++/tests/readWriteImages$(EXEEXT): $(Magick___tests_readWriteImages_OBJECTS) $(Magick___tests_readWriteImages_DEPENDENCIES) $(EXTRA_Magick___tests_readWriteImages_DEPENDENCIES) Magick++/tests/$(am__dirstamp) + @rm -f Magick++/tests/readWriteImages$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Magick___tests_readWriteImages_OBJECTS) $(Magick___tests_readWriteImages_LDADD) $(LIBS) +tests/$(am__dirstamp): + @$(MKDIR_P) tests + @: > tests/$(am__dirstamp) +tests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) tests/$(DEPDIR) + @: > tests/$(DEPDIR)/$(am__dirstamp) +tests/drawtest-drawtest.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/drawtest$(EXEEXT): $(tests_drawtest_OBJECTS) $(tests_drawtest_DEPENDENCIES) $(EXTRA_tests_drawtest_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/drawtest$(EXEEXT) + $(AM_V_CCLD)$(tests_drawtest_LINK) $(tests_drawtest_OBJECTS) $(tests_drawtest_LDADD) $(LIBS) +tests/validate-validate.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/validate$(EXEEXT): $(tests_validate_OBJECTS) $(tests_validate_DEPENDENCIES) $(EXTRA_tests_validate_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/validate$(EXEEXT) + $(AM_V_CCLD)$(tests_validate_LINK) $(tests_validate_OBJECTS) $(tests_validate_LDADD) $(LIBS) +tests/wandtest-wandtest.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/wandtest$(EXEEXT): $(tests_wandtest_OBJECTS) $(tests_wandtest_DEPENDENCIES) $(EXTRA_tests_wandtest_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/wandtest$(EXEEXT) + $(AM_V_CCLD)$(tests_wandtest_LINK) $(tests_wandtest_OBJECTS) $(tests_wandtest_LDADD) $(LIBS) +utilities/$(am__dirstamp): + @$(MKDIR_P) utilities + @: > utilities/$(am__dirstamp) +utilities/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) utilities/$(DEPDIR) + @: > utilities/$(DEPDIR)/$(am__dirstamp) +utilities/animate.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/animate$(EXEEXT): $(utilities_animate_OBJECTS) $(utilities_animate_DEPENDENCIES) $(EXTRA_utilities_animate_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/animate$(EXEEXT) + $(AM_V_CCLD)$(utilities_animate_LINK) $(utilities_animate_OBJECTS) $(utilities_animate_LDADD) $(LIBS) +utilities/compare.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/compare$(EXEEXT): $(utilities_compare_OBJECTS) $(utilities_compare_DEPENDENCIES) $(EXTRA_utilities_compare_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/compare$(EXEEXT) + $(AM_V_CCLD)$(utilities_compare_LINK) $(utilities_compare_OBJECTS) $(utilities_compare_LDADD) $(LIBS) +utilities/composite.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/composite$(EXEEXT): $(utilities_composite_OBJECTS) $(utilities_composite_DEPENDENCIES) $(EXTRA_utilities_composite_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/composite$(EXEEXT) + $(AM_V_CCLD)$(utilities_composite_LINK) $(utilities_composite_OBJECTS) $(utilities_composite_LDADD) $(LIBS) +utilities/conjure.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/conjure$(EXEEXT): $(utilities_conjure_OBJECTS) $(utilities_conjure_DEPENDENCIES) $(EXTRA_utilities_conjure_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/conjure$(EXEEXT) + $(AM_V_CCLD)$(utilities_conjure_LINK) $(utilities_conjure_OBJECTS) $(utilities_conjure_LDADD) $(LIBS) +utilities/convert.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/convert$(EXEEXT): $(utilities_convert_OBJECTS) $(utilities_convert_DEPENDENCIES) $(EXTRA_utilities_convert_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/convert$(EXEEXT) + $(AM_V_CCLD)$(utilities_convert_LINK) $(utilities_convert_OBJECTS) $(utilities_convert_LDADD) $(LIBS) +utilities/display.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/display$(EXEEXT): $(utilities_display_OBJECTS) $(utilities_display_DEPENDENCIES) $(EXTRA_utilities_display_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/display$(EXEEXT) + $(AM_V_CCLD)$(utilities_display_LINK) $(utilities_display_OBJECTS) $(utilities_display_LDADD) $(LIBS) +utilities/identify.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/identify$(EXEEXT): $(utilities_identify_OBJECTS) $(utilities_identify_DEPENDENCIES) $(EXTRA_utilities_identify_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/identify$(EXEEXT) + $(AM_V_CCLD)$(utilities_identify_LINK) $(utilities_identify_OBJECTS) $(utilities_identify_LDADD) $(LIBS) +utilities/import.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/import$(EXEEXT): $(utilities_import_OBJECTS) $(utilities_import_DEPENDENCIES) $(EXTRA_utilities_import_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/import$(EXEEXT) + $(AM_V_CCLD)$(utilities_import_LINK) $(utilities_import_OBJECTS) $(utilities_import_LDADD) $(LIBS) +utilities/mogrify.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/mogrify$(EXEEXT): $(utilities_mogrify_OBJECTS) $(utilities_mogrify_DEPENDENCIES) $(EXTRA_utilities_mogrify_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/mogrify$(EXEEXT) + $(AM_V_CCLD)$(utilities_mogrify_LINK) $(utilities_mogrify_OBJECTS) $(utilities_mogrify_LDADD) $(LIBS) +utilities/montage.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/montage$(EXEEXT): $(utilities_montage_OBJECTS) $(utilities_montage_DEPENDENCIES) $(EXTRA_utilities_montage_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/montage$(EXEEXT) + $(AM_V_CCLD)$(utilities_montage_LINK) $(utilities_montage_OBJECTS) $(utilities_montage_LDADD) $(LIBS) +utilities/stream.$(OBJEXT): utilities/$(am__dirstamp) \ + utilities/$(DEPDIR)/$(am__dirstamp) + +utilities/stream$(EXEEXT): $(utilities_stream_OBJECTS) $(utilities_stream_DEPENDENCIES) $(EXTRA_utilities_stream_DEPENDENCIES) utilities/$(am__dirstamp) + @rm -f utilities/stream$(EXEEXT) + $(AM_V_CCLD)$(utilities_stream_LINK) $(utilities_stream_OBJECTS) $(utilities_stream_LDADD) $(LIBS) +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f Magick++/demo/*.$(OBJEXT) + -rm -f Magick++/lib/*.$(OBJEXT) + -rm -f Magick++/lib/*.lo + -rm -f Magick++/tests/*.$(OBJEXT) + -rm -f coders/*.$(OBJEXT) + -rm -f coders/*.lo + -rm -f filters/*.$(OBJEXT) + -rm -f filters/*.lo + -rm -f magick/*.$(OBJEXT) + -rm -f magick/*.lo + -rm -f tests/*.$(OBJEXT) + -rm -f utilities/*.$(OBJEXT) + -rm -f wand/*.$(OBJEXT) + -rm -f wand/*.lo + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/demo/$(DEPDIR)/analyze-analyze.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/demo/$(DEPDIR)/button-button.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/demo/$(DEPDIR)/demo-demo.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/demo/$(DEPDIR)/detrans-detrans.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/demo/$(DEPDIR)/flip-flip.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/demo/$(DEPDIR)/gravity-gravity.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/demo/$(DEPDIR)/piddle-piddle.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/demo/$(DEPDIR)/shapes-shapes.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/demo/$(DEPDIR)/zoom-zoom.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/appendImages-appendImages.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/attributes-attributes.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/averageImages-averageImages.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/coalesceImages-coalesceImages.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/coderInfo-coderInfo.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/color-color.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/colorHistogram-colorHistogram.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/exceptions-exceptions.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/montageImages-montageImages.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/morphImages-morphImages.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/readWriteBlob-readWriteBlob.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@Magick++/tests/$(DEPDIR)/readWriteImages-readWriteImages.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/aai_la-aai.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/art_la-art.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/avs_la-avs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/bgr_la-bgr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/bmp_la-bmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/braille_la-braille.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/cals_la-cals.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/caption_la-caption.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/cin_la-cin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/cip_la-cip.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/clip_la-clip.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/clipboard_la-clipboard.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/cmyk_la-cmyk.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/cut_la-cut.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/dcm_la-dcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/dds_la-dds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/debug_la-debug.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/dib_la-dib.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/djvu_la-djvu.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/dng_la-dng.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/dot_la-dot.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/dps_la-dps.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/dpx_la-dpx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/emf_la-emf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/ept_la-ept.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/exr_la-exr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/fax_la-fax.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/fits_la-fits.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/flif_la-flif.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/fpx_la-fpx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/gif_la-gif.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/gradient_la-gradient.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/gray_la-gray.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/hald_la-hald.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/hdr_la-hdr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/heic_la-heic.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/histogram_la-histogram.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/hrz_la-hrz.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/html_la-html.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/icon_la-icon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/info_la-info.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/inline_la-inline.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/ipl_la-ipl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/jbig_la-jbig.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/jnx_la-jnx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/jp2_la-jp2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/jpeg_la-jpeg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/json_la-json.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/label_la-label.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/mac_la-mac.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_la-magick.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/map_la-map.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/mask_la-mask.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/mat_la-mat.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/matte_la-matte.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/meta_la-meta.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/miff_la-miff.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/mono_la-mono.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/mpc_la-mpc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/mpr_la-mpr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/msl_la-msl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/mtv_la-mtv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/mvg_la-mvg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/null_la-null.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/otb_la-otb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/palm_la-palm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pango_la-pango.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pattern_la-pattern.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pcd_la-pcd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pcl_la-pcl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pcx_la-pcx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pdb_la-pdb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pdf_la-pdf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pes_la-pes.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pgx_la-pgx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pict_la-pict.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pix_la-pix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/plasma_la-plasma.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/png_la-png.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pnm_la-pnm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/preview_la-preview.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/ps2_la-ps2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/ps3_la-ps3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/ps_la-ps.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/psd_la-psd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/pwp_la-pwp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/raw_la-raw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/rgb_la-rgb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/rgf_la-rgf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/rla_la-rla.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/rle_la-rle.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/scr_la-scr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/sct_la-sct.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/sfw_la-sfw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/sgi_la-sgi.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/sixel_la-sixel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/stegano_la-stegano.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/sun_la-sun.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/svg_la-svg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/tga_la-tga.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/thumbnail_la-thumbnail.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/tiff_la-psd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/tiff_la-tiff.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/tile_la-tile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/tim_la-tim.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/ttf_la-ttf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/txt_la-txt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/uil_la-uil.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/url_la-url.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/uyvy_la-uyvy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/vicar_la-vicar.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/vid_la-vid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/video_la-video.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/viff_la-viff.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/vips_la-vips.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/wbmp_la-wbmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/webp_la-webp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/wmf_la-wmf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/wpg_la-wpg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/x_la-x.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/xbm_la-xbm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/xc_la-xc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/xcf_la-xcf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/xpm_la-xpm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/xps_la-xps.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/xwd_la-xwd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/ycbcr_la-ycbcr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@coders/$(DEPDIR)/yuv_la-yuv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@filters/$(DEPDIR)/analyze_la-analyze.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@filters/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/drawtest-drawtest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/validate-validate.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/wandtest-wandtest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/animate.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/compare.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/composite.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/conjure.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/convert.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/display.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/identify.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/import.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/mogrify.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/montage.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utilities/$(DEPDIR)/stream.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +coders/aai_la-aai.lo: coders/aai.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_aai_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/aai_la-aai.lo -MD -MP -MF coders/$(DEPDIR)/aai_la-aai.Tpo -c -o coders/aai_la-aai.lo `test -f 'coders/aai.c' || echo '$(srcdir)/'`coders/aai.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/aai_la-aai.Tpo coders/$(DEPDIR)/aai_la-aai.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/aai.c' object='coders/aai_la-aai.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_aai_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/aai_la-aai.lo `test -f 'coders/aai.c' || echo '$(srcdir)/'`coders/aai.c + +coders/art_la-art.lo: coders/art.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_art_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/art_la-art.lo -MD -MP -MF coders/$(DEPDIR)/art_la-art.Tpo -c -o coders/art_la-art.lo `test -f 'coders/art.c' || echo '$(srcdir)/'`coders/art.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/art_la-art.Tpo coders/$(DEPDIR)/art_la-art.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/art.c' object='coders/art_la-art.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_art_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/art_la-art.lo `test -f 'coders/art.c' || echo '$(srcdir)/'`coders/art.c + +coders/avs_la-avs.lo: coders/avs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_avs_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/avs_la-avs.lo -MD -MP -MF coders/$(DEPDIR)/avs_la-avs.Tpo -c -o coders/avs_la-avs.lo `test -f 'coders/avs.c' || echo '$(srcdir)/'`coders/avs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/avs_la-avs.Tpo coders/$(DEPDIR)/avs_la-avs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/avs.c' object='coders/avs_la-avs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_avs_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/avs_la-avs.lo `test -f 'coders/avs.c' || echo '$(srcdir)/'`coders/avs.c + +coders/bgr_la-bgr.lo: coders/bgr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_bgr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/bgr_la-bgr.lo -MD -MP -MF coders/$(DEPDIR)/bgr_la-bgr.Tpo -c -o coders/bgr_la-bgr.lo `test -f 'coders/bgr.c' || echo '$(srcdir)/'`coders/bgr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/bgr_la-bgr.Tpo coders/$(DEPDIR)/bgr_la-bgr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/bgr.c' object='coders/bgr_la-bgr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_bgr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/bgr_la-bgr.lo `test -f 'coders/bgr.c' || echo '$(srcdir)/'`coders/bgr.c + +coders/bmp_la-bmp.lo: coders/bmp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_bmp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/bmp_la-bmp.lo -MD -MP -MF coders/$(DEPDIR)/bmp_la-bmp.Tpo -c -o coders/bmp_la-bmp.lo `test -f 'coders/bmp.c' || echo '$(srcdir)/'`coders/bmp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/bmp_la-bmp.Tpo coders/$(DEPDIR)/bmp_la-bmp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/bmp.c' object='coders/bmp_la-bmp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_bmp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/bmp_la-bmp.lo `test -f 'coders/bmp.c' || echo '$(srcdir)/'`coders/bmp.c + +coders/braille_la-braille.lo: coders/braille.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_braille_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/braille_la-braille.lo -MD -MP -MF coders/$(DEPDIR)/braille_la-braille.Tpo -c -o coders/braille_la-braille.lo `test -f 'coders/braille.c' || echo '$(srcdir)/'`coders/braille.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/braille_la-braille.Tpo coders/$(DEPDIR)/braille_la-braille.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/braille.c' object='coders/braille_la-braille.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_braille_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/braille_la-braille.lo `test -f 'coders/braille.c' || echo '$(srcdir)/'`coders/braille.c + +coders/cals_la-cals.lo: coders/cals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_cals_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/cals_la-cals.lo -MD -MP -MF coders/$(DEPDIR)/cals_la-cals.Tpo -c -o coders/cals_la-cals.lo `test -f 'coders/cals.c' || echo '$(srcdir)/'`coders/cals.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/cals_la-cals.Tpo coders/$(DEPDIR)/cals_la-cals.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/cals.c' object='coders/cals_la-cals.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_cals_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/cals_la-cals.lo `test -f 'coders/cals.c' || echo '$(srcdir)/'`coders/cals.c + +coders/caption_la-caption.lo: coders/caption.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_caption_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/caption_la-caption.lo -MD -MP -MF coders/$(DEPDIR)/caption_la-caption.Tpo -c -o coders/caption_la-caption.lo `test -f 'coders/caption.c' || echo '$(srcdir)/'`coders/caption.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/caption_la-caption.Tpo coders/$(DEPDIR)/caption_la-caption.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/caption.c' object='coders/caption_la-caption.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_caption_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/caption_la-caption.lo `test -f 'coders/caption.c' || echo '$(srcdir)/'`coders/caption.c + +coders/cin_la-cin.lo: coders/cin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_cin_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/cin_la-cin.lo -MD -MP -MF coders/$(DEPDIR)/cin_la-cin.Tpo -c -o coders/cin_la-cin.lo `test -f 'coders/cin.c' || echo '$(srcdir)/'`coders/cin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/cin_la-cin.Tpo coders/$(DEPDIR)/cin_la-cin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/cin.c' object='coders/cin_la-cin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_cin_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/cin_la-cin.lo `test -f 'coders/cin.c' || echo '$(srcdir)/'`coders/cin.c + +coders/cip_la-cip.lo: coders/cip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_cip_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/cip_la-cip.lo -MD -MP -MF coders/$(DEPDIR)/cip_la-cip.Tpo -c -o coders/cip_la-cip.lo `test -f 'coders/cip.c' || echo '$(srcdir)/'`coders/cip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/cip_la-cip.Tpo coders/$(DEPDIR)/cip_la-cip.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/cip.c' object='coders/cip_la-cip.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_cip_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/cip_la-cip.lo `test -f 'coders/cip.c' || echo '$(srcdir)/'`coders/cip.c + +coders/clip_la-clip.lo: coders/clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_clip_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/clip_la-clip.lo -MD -MP -MF coders/$(DEPDIR)/clip_la-clip.Tpo -c -o coders/clip_la-clip.lo `test -f 'coders/clip.c' || echo '$(srcdir)/'`coders/clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/clip_la-clip.Tpo coders/$(DEPDIR)/clip_la-clip.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/clip.c' object='coders/clip_la-clip.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_clip_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/clip_la-clip.lo `test -f 'coders/clip.c' || echo '$(srcdir)/'`coders/clip.c + +coders/clipboard_la-clipboard.lo: coders/clipboard.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_clipboard_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/clipboard_la-clipboard.lo -MD -MP -MF coders/$(DEPDIR)/clipboard_la-clipboard.Tpo -c -o coders/clipboard_la-clipboard.lo `test -f 'coders/clipboard.c' || echo '$(srcdir)/'`coders/clipboard.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/clipboard_la-clipboard.Tpo coders/$(DEPDIR)/clipboard_la-clipboard.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/clipboard.c' object='coders/clipboard_la-clipboard.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_clipboard_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/clipboard_la-clipboard.lo `test -f 'coders/clipboard.c' || echo '$(srcdir)/'`coders/clipboard.c + +coders/cmyk_la-cmyk.lo: coders/cmyk.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_cmyk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/cmyk_la-cmyk.lo -MD -MP -MF coders/$(DEPDIR)/cmyk_la-cmyk.Tpo -c -o coders/cmyk_la-cmyk.lo `test -f 'coders/cmyk.c' || echo '$(srcdir)/'`coders/cmyk.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/cmyk_la-cmyk.Tpo coders/$(DEPDIR)/cmyk_la-cmyk.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/cmyk.c' object='coders/cmyk_la-cmyk.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_cmyk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/cmyk_la-cmyk.lo `test -f 'coders/cmyk.c' || echo '$(srcdir)/'`coders/cmyk.c + +coders/cut_la-cut.lo: coders/cut.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_cut_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/cut_la-cut.lo -MD -MP -MF coders/$(DEPDIR)/cut_la-cut.Tpo -c -o coders/cut_la-cut.lo `test -f 'coders/cut.c' || echo '$(srcdir)/'`coders/cut.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/cut_la-cut.Tpo coders/$(DEPDIR)/cut_la-cut.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/cut.c' object='coders/cut_la-cut.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_cut_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/cut_la-cut.lo `test -f 'coders/cut.c' || echo '$(srcdir)/'`coders/cut.c + +coders/dcm_la-dcm.lo: coders/dcm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dcm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/dcm_la-dcm.lo -MD -MP -MF coders/$(DEPDIR)/dcm_la-dcm.Tpo -c -o coders/dcm_la-dcm.lo `test -f 'coders/dcm.c' || echo '$(srcdir)/'`coders/dcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/dcm_la-dcm.Tpo coders/$(DEPDIR)/dcm_la-dcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dcm.c' object='coders/dcm_la-dcm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dcm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/dcm_la-dcm.lo `test -f 'coders/dcm.c' || echo '$(srcdir)/'`coders/dcm.c + +coders/dds_la-dds.lo: coders/dds.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/dds_la-dds.lo -MD -MP -MF coders/$(DEPDIR)/dds_la-dds.Tpo -c -o coders/dds_la-dds.lo `test -f 'coders/dds.c' || echo '$(srcdir)/'`coders/dds.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/dds_la-dds.Tpo coders/$(DEPDIR)/dds_la-dds.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dds.c' object='coders/dds_la-dds.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/dds_la-dds.lo `test -f 'coders/dds.c' || echo '$(srcdir)/'`coders/dds.c + +coders/debug_la-debug.lo: coders/debug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_debug_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/debug_la-debug.lo -MD -MP -MF coders/$(DEPDIR)/debug_la-debug.Tpo -c -o coders/debug_la-debug.lo `test -f 'coders/debug.c' || echo '$(srcdir)/'`coders/debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/debug_la-debug.Tpo coders/$(DEPDIR)/debug_la-debug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/debug.c' object='coders/debug_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_debug_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/debug_la-debug.lo `test -f 'coders/debug.c' || echo '$(srcdir)/'`coders/debug.c + +coders/dib_la-dib.lo: coders/dib.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dib_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/dib_la-dib.lo -MD -MP -MF coders/$(DEPDIR)/dib_la-dib.Tpo -c -o coders/dib_la-dib.lo `test -f 'coders/dib.c' || echo '$(srcdir)/'`coders/dib.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/dib_la-dib.Tpo coders/$(DEPDIR)/dib_la-dib.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dib.c' object='coders/dib_la-dib.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dib_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/dib_la-dib.lo `test -f 'coders/dib.c' || echo '$(srcdir)/'`coders/dib.c + +coders/djvu_la-djvu.lo: coders/djvu.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_djvu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/djvu_la-djvu.lo -MD -MP -MF coders/$(DEPDIR)/djvu_la-djvu.Tpo -c -o coders/djvu_la-djvu.lo `test -f 'coders/djvu.c' || echo '$(srcdir)/'`coders/djvu.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/djvu_la-djvu.Tpo coders/$(DEPDIR)/djvu_la-djvu.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/djvu.c' object='coders/djvu_la-djvu.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_djvu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/djvu_la-djvu.lo `test -f 'coders/djvu.c' || echo '$(srcdir)/'`coders/djvu.c + +coders/dng_la-dng.lo: coders/dng.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dng_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/dng_la-dng.lo -MD -MP -MF coders/$(DEPDIR)/dng_la-dng.Tpo -c -o coders/dng_la-dng.lo `test -f 'coders/dng.c' || echo '$(srcdir)/'`coders/dng.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/dng_la-dng.Tpo coders/$(DEPDIR)/dng_la-dng.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dng.c' object='coders/dng_la-dng.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dng_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/dng_la-dng.lo `test -f 'coders/dng.c' || echo '$(srcdir)/'`coders/dng.c + +coders/dot_la-dot.lo: coders/dot.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dot_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/dot_la-dot.lo -MD -MP -MF coders/$(DEPDIR)/dot_la-dot.Tpo -c -o coders/dot_la-dot.lo `test -f 'coders/dot.c' || echo '$(srcdir)/'`coders/dot.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/dot_la-dot.Tpo coders/$(DEPDIR)/dot_la-dot.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dot.c' object='coders/dot_la-dot.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dot_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/dot_la-dot.lo `test -f 'coders/dot.c' || echo '$(srcdir)/'`coders/dot.c + +coders/dps_la-dps.lo: coders/dps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dps_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/dps_la-dps.lo -MD -MP -MF coders/$(DEPDIR)/dps_la-dps.Tpo -c -o coders/dps_la-dps.lo `test -f 'coders/dps.c' || echo '$(srcdir)/'`coders/dps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/dps_la-dps.Tpo coders/$(DEPDIR)/dps_la-dps.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dps.c' object='coders/dps_la-dps.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dps_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/dps_la-dps.lo `test -f 'coders/dps.c' || echo '$(srcdir)/'`coders/dps.c + +coders/dpx_la-dpx.lo: coders/dpx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dpx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/dpx_la-dpx.lo -MD -MP -MF coders/$(DEPDIR)/dpx_la-dpx.Tpo -c -o coders/dpx_la-dpx.lo `test -f 'coders/dpx.c' || echo '$(srcdir)/'`coders/dpx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/dpx_la-dpx.Tpo coders/$(DEPDIR)/dpx_la-dpx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dpx.c' object='coders/dpx_la-dpx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_dpx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/dpx_la-dpx.lo `test -f 'coders/dpx.c' || echo '$(srcdir)/'`coders/dpx.c + +coders/emf_la-emf.lo: coders/emf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_emf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/emf_la-emf.lo -MD -MP -MF coders/$(DEPDIR)/emf_la-emf.Tpo -c -o coders/emf_la-emf.lo `test -f 'coders/emf.c' || echo '$(srcdir)/'`coders/emf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/emf_la-emf.Tpo coders/$(DEPDIR)/emf_la-emf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/emf.c' object='coders/emf_la-emf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_emf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/emf_la-emf.lo `test -f 'coders/emf.c' || echo '$(srcdir)/'`coders/emf.c + +coders/ept_la-ept.lo: coders/ept.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ept_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/ept_la-ept.lo -MD -MP -MF coders/$(DEPDIR)/ept_la-ept.Tpo -c -o coders/ept_la-ept.lo `test -f 'coders/ept.c' || echo '$(srcdir)/'`coders/ept.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/ept_la-ept.Tpo coders/$(DEPDIR)/ept_la-ept.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ept.c' object='coders/ept_la-ept.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ept_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/ept_la-ept.lo `test -f 'coders/ept.c' || echo '$(srcdir)/'`coders/ept.c + +coders/exr_la-exr.lo: coders/exr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_exr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/exr_la-exr.lo -MD -MP -MF coders/$(DEPDIR)/exr_la-exr.Tpo -c -o coders/exr_la-exr.lo `test -f 'coders/exr.c' || echo '$(srcdir)/'`coders/exr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/exr_la-exr.Tpo coders/$(DEPDIR)/exr_la-exr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/exr.c' object='coders/exr_la-exr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_exr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/exr_la-exr.lo `test -f 'coders/exr.c' || echo '$(srcdir)/'`coders/exr.c + +coders/fax_la-fax.lo: coders/fax.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_fax_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/fax_la-fax.lo -MD -MP -MF coders/$(DEPDIR)/fax_la-fax.Tpo -c -o coders/fax_la-fax.lo `test -f 'coders/fax.c' || echo '$(srcdir)/'`coders/fax.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/fax_la-fax.Tpo coders/$(DEPDIR)/fax_la-fax.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/fax.c' object='coders/fax_la-fax.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_fax_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/fax_la-fax.lo `test -f 'coders/fax.c' || echo '$(srcdir)/'`coders/fax.c + +coders/fits_la-fits.lo: coders/fits.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_fits_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/fits_la-fits.lo -MD -MP -MF coders/$(DEPDIR)/fits_la-fits.Tpo -c -o coders/fits_la-fits.lo `test -f 'coders/fits.c' || echo '$(srcdir)/'`coders/fits.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/fits_la-fits.Tpo coders/$(DEPDIR)/fits_la-fits.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/fits.c' object='coders/fits_la-fits.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_fits_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/fits_la-fits.lo `test -f 'coders/fits.c' || echo '$(srcdir)/'`coders/fits.c + +coders/flif_la-flif.lo: coders/flif.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_flif_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/flif_la-flif.lo -MD -MP -MF coders/$(DEPDIR)/flif_la-flif.Tpo -c -o coders/flif_la-flif.lo `test -f 'coders/flif.c' || echo '$(srcdir)/'`coders/flif.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/flif_la-flif.Tpo coders/$(DEPDIR)/flif_la-flif.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/flif.c' object='coders/flif_la-flif.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_flif_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/flif_la-flif.lo `test -f 'coders/flif.c' || echo '$(srcdir)/'`coders/flif.c + +coders/fpx_la-fpx.lo: coders/fpx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_fpx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/fpx_la-fpx.lo -MD -MP -MF coders/$(DEPDIR)/fpx_la-fpx.Tpo -c -o coders/fpx_la-fpx.lo `test -f 'coders/fpx.c' || echo '$(srcdir)/'`coders/fpx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/fpx_la-fpx.Tpo coders/$(DEPDIR)/fpx_la-fpx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/fpx.c' object='coders/fpx_la-fpx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_fpx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/fpx_la-fpx.lo `test -f 'coders/fpx.c' || echo '$(srcdir)/'`coders/fpx.c + +coders/gif_la-gif.lo: coders/gif.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_gif_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/gif_la-gif.lo -MD -MP -MF coders/$(DEPDIR)/gif_la-gif.Tpo -c -o coders/gif_la-gif.lo `test -f 'coders/gif.c' || echo '$(srcdir)/'`coders/gif.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/gif_la-gif.Tpo coders/$(DEPDIR)/gif_la-gif.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/gif.c' object='coders/gif_la-gif.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_gif_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/gif_la-gif.lo `test -f 'coders/gif.c' || echo '$(srcdir)/'`coders/gif.c + +coders/gradient_la-gradient.lo: coders/gradient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_gradient_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/gradient_la-gradient.lo -MD -MP -MF coders/$(DEPDIR)/gradient_la-gradient.Tpo -c -o coders/gradient_la-gradient.lo `test -f 'coders/gradient.c' || echo '$(srcdir)/'`coders/gradient.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/gradient_la-gradient.Tpo coders/$(DEPDIR)/gradient_la-gradient.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/gradient.c' object='coders/gradient_la-gradient.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_gradient_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/gradient_la-gradient.lo `test -f 'coders/gradient.c' || echo '$(srcdir)/'`coders/gradient.c + +coders/gray_la-gray.lo: coders/gray.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_gray_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/gray_la-gray.lo -MD -MP -MF coders/$(DEPDIR)/gray_la-gray.Tpo -c -o coders/gray_la-gray.lo `test -f 'coders/gray.c' || echo '$(srcdir)/'`coders/gray.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/gray_la-gray.Tpo coders/$(DEPDIR)/gray_la-gray.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/gray.c' object='coders/gray_la-gray.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_gray_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/gray_la-gray.lo `test -f 'coders/gray.c' || echo '$(srcdir)/'`coders/gray.c + +coders/hald_la-hald.lo: coders/hald.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_hald_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/hald_la-hald.lo -MD -MP -MF coders/$(DEPDIR)/hald_la-hald.Tpo -c -o coders/hald_la-hald.lo `test -f 'coders/hald.c' || echo '$(srcdir)/'`coders/hald.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/hald_la-hald.Tpo coders/$(DEPDIR)/hald_la-hald.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/hald.c' object='coders/hald_la-hald.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_hald_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/hald_la-hald.lo `test -f 'coders/hald.c' || echo '$(srcdir)/'`coders/hald.c + +coders/hdr_la-hdr.lo: coders/hdr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_hdr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/hdr_la-hdr.lo -MD -MP -MF coders/$(DEPDIR)/hdr_la-hdr.Tpo -c -o coders/hdr_la-hdr.lo `test -f 'coders/hdr.c' || echo '$(srcdir)/'`coders/hdr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/hdr_la-hdr.Tpo coders/$(DEPDIR)/hdr_la-hdr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/hdr.c' object='coders/hdr_la-hdr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_hdr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/hdr_la-hdr.lo `test -f 'coders/hdr.c' || echo '$(srcdir)/'`coders/hdr.c + +coders/heic_la-heic.lo: coders/heic.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_heic_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/heic_la-heic.lo -MD -MP -MF coders/$(DEPDIR)/heic_la-heic.Tpo -c -o coders/heic_la-heic.lo `test -f 'coders/heic.c' || echo '$(srcdir)/'`coders/heic.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/heic_la-heic.Tpo coders/$(DEPDIR)/heic_la-heic.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/heic.c' object='coders/heic_la-heic.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_heic_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/heic_la-heic.lo `test -f 'coders/heic.c' || echo '$(srcdir)/'`coders/heic.c + +coders/histogram_la-histogram.lo: coders/histogram.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_histogram_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/histogram_la-histogram.lo -MD -MP -MF coders/$(DEPDIR)/histogram_la-histogram.Tpo -c -o coders/histogram_la-histogram.lo `test -f 'coders/histogram.c' || echo '$(srcdir)/'`coders/histogram.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/histogram_la-histogram.Tpo coders/$(DEPDIR)/histogram_la-histogram.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/histogram.c' object='coders/histogram_la-histogram.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_histogram_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/histogram_la-histogram.lo `test -f 'coders/histogram.c' || echo '$(srcdir)/'`coders/histogram.c + +coders/hrz_la-hrz.lo: coders/hrz.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_hrz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/hrz_la-hrz.lo -MD -MP -MF coders/$(DEPDIR)/hrz_la-hrz.Tpo -c -o coders/hrz_la-hrz.lo `test -f 'coders/hrz.c' || echo '$(srcdir)/'`coders/hrz.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/hrz_la-hrz.Tpo coders/$(DEPDIR)/hrz_la-hrz.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/hrz.c' object='coders/hrz_la-hrz.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_hrz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/hrz_la-hrz.lo `test -f 'coders/hrz.c' || echo '$(srcdir)/'`coders/hrz.c + +coders/html_la-html.lo: coders/html.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_html_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/html_la-html.lo -MD -MP -MF coders/$(DEPDIR)/html_la-html.Tpo -c -o coders/html_la-html.lo `test -f 'coders/html.c' || echo '$(srcdir)/'`coders/html.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/html_la-html.Tpo coders/$(DEPDIR)/html_la-html.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/html.c' object='coders/html_la-html.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_html_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/html_la-html.lo `test -f 'coders/html.c' || echo '$(srcdir)/'`coders/html.c + +coders/icon_la-icon.lo: coders/icon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_icon_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/icon_la-icon.lo -MD -MP -MF coders/$(DEPDIR)/icon_la-icon.Tpo -c -o coders/icon_la-icon.lo `test -f 'coders/icon.c' || echo '$(srcdir)/'`coders/icon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/icon_la-icon.Tpo coders/$(DEPDIR)/icon_la-icon.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/icon.c' object='coders/icon_la-icon.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_icon_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/icon_la-icon.lo `test -f 'coders/icon.c' || echo '$(srcdir)/'`coders/icon.c + +coders/info_la-info.lo: coders/info.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_info_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/info_la-info.lo -MD -MP -MF coders/$(DEPDIR)/info_la-info.Tpo -c -o coders/info_la-info.lo `test -f 'coders/info.c' || echo '$(srcdir)/'`coders/info.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/info_la-info.Tpo coders/$(DEPDIR)/info_la-info.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/info.c' object='coders/info_la-info.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_info_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/info_la-info.lo `test -f 'coders/info.c' || echo '$(srcdir)/'`coders/info.c + +coders/inline_la-inline.lo: coders/inline.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_inline_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/inline_la-inline.lo -MD -MP -MF coders/$(DEPDIR)/inline_la-inline.Tpo -c -o coders/inline_la-inline.lo `test -f 'coders/inline.c' || echo '$(srcdir)/'`coders/inline.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/inline_la-inline.Tpo coders/$(DEPDIR)/inline_la-inline.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/inline.c' object='coders/inline_la-inline.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_inline_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/inline_la-inline.lo `test -f 'coders/inline.c' || echo '$(srcdir)/'`coders/inline.c + +coders/ipl_la-ipl.lo: coders/ipl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ipl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/ipl_la-ipl.lo -MD -MP -MF coders/$(DEPDIR)/ipl_la-ipl.Tpo -c -o coders/ipl_la-ipl.lo `test -f 'coders/ipl.c' || echo '$(srcdir)/'`coders/ipl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/ipl_la-ipl.Tpo coders/$(DEPDIR)/ipl_la-ipl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ipl.c' object='coders/ipl_la-ipl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ipl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/ipl_la-ipl.lo `test -f 'coders/ipl.c' || echo '$(srcdir)/'`coders/ipl.c + +coders/jbig_la-jbig.lo: coders/jbig.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_jbig_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/jbig_la-jbig.lo -MD -MP -MF coders/$(DEPDIR)/jbig_la-jbig.Tpo -c -o coders/jbig_la-jbig.lo `test -f 'coders/jbig.c' || echo '$(srcdir)/'`coders/jbig.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/jbig_la-jbig.Tpo coders/$(DEPDIR)/jbig_la-jbig.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/jbig.c' object='coders/jbig_la-jbig.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_jbig_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/jbig_la-jbig.lo `test -f 'coders/jbig.c' || echo '$(srcdir)/'`coders/jbig.c + +coders/jnx_la-jnx.lo: coders/jnx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_jnx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/jnx_la-jnx.lo -MD -MP -MF coders/$(DEPDIR)/jnx_la-jnx.Tpo -c -o coders/jnx_la-jnx.lo `test -f 'coders/jnx.c' || echo '$(srcdir)/'`coders/jnx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/jnx_la-jnx.Tpo coders/$(DEPDIR)/jnx_la-jnx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/jnx.c' object='coders/jnx_la-jnx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_jnx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/jnx_la-jnx.lo `test -f 'coders/jnx.c' || echo '$(srcdir)/'`coders/jnx.c + +coders/jp2_la-jp2.lo: coders/jp2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_jp2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/jp2_la-jp2.lo -MD -MP -MF coders/$(DEPDIR)/jp2_la-jp2.Tpo -c -o coders/jp2_la-jp2.lo `test -f 'coders/jp2.c' || echo '$(srcdir)/'`coders/jp2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/jp2_la-jp2.Tpo coders/$(DEPDIR)/jp2_la-jp2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/jp2.c' object='coders/jp2_la-jp2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_jp2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/jp2_la-jp2.lo `test -f 'coders/jp2.c' || echo '$(srcdir)/'`coders/jp2.c + +coders/jpeg_la-jpeg.lo: coders/jpeg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_jpeg_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/jpeg_la-jpeg.lo -MD -MP -MF coders/$(DEPDIR)/jpeg_la-jpeg.Tpo -c -o coders/jpeg_la-jpeg.lo `test -f 'coders/jpeg.c' || echo '$(srcdir)/'`coders/jpeg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/jpeg_la-jpeg.Tpo coders/$(DEPDIR)/jpeg_la-jpeg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/jpeg.c' object='coders/jpeg_la-jpeg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_jpeg_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/jpeg_la-jpeg.lo `test -f 'coders/jpeg.c' || echo '$(srcdir)/'`coders/jpeg.c + +coders/json_la-json.lo: coders/json.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_json_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/json_la-json.lo -MD -MP -MF coders/$(DEPDIR)/json_la-json.Tpo -c -o coders/json_la-json.lo `test -f 'coders/json.c' || echo '$(srcdir)/'`coders/json.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/json_la-json.Tpo coders/$(DEPDIR)/json_la-json.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/json.c' object='coders/json_la-json.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_json_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/json_la-json.lo `test -f 'coders/json.c' || echo '$(srcdir)/'`coders/json.c + +coders/label_la-label.lo: coders/label.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_label_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/label_la-label.lo -MD -MP -MF coders/$(DEPDIR)/label_la-label.Tpo -c -o coders/label_la-label.lo `test -f 'coders/label.c' || echo '$(srcdir)/'`coders/label.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/label_la-label.Tpo coders/$(DEPDIR)/label_la-label.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/label.c' object='coders/label_la-label.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_label_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/label_la-label.lo `test -f 'coders/label.c' || echo '$(srcdir)/'`coders/label.c + +coders/mac_la-mac.lo: coders/mac.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mac_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/mac_la-mac.lo -MD -MP -MF coders/$(DEPDIR)/mac_la-mac.Tpo -c -o coders/mac_la-mac.lo `test -f 'coders/mac.c' || echo '$(srcdir)/'`coders/mac.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/mac_la-mac.Tpo coders/$(DEPDIR)/mac_la-mac.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mac.c' object='coders/mac_la-mac.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mac_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/mac_la-mac.lo `test -f 'coders/mac.c' || echo '$(srcdir)/'`coders/mac.c + +coders/magick_la-magick.lo: coders/magick.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_magick_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_la-magick.lo -MD -MP -MF coders/$(DEPDIR)/magick_la-magick.Tpo -c -o coders/magick_la-magick.lo `test -f 'coders/magick.c' || echo '$(srcdir)/'`coders/magick.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_la-magick.Tpo coders/$(DEPDIR)/magick_la-magick.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/magick.c' object='coders/magick_la-magick.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_magick_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_la-magick.lo `test -f 'coders/magick.c' || echo '$(srcdir)/'`coders/magick.c + +coders/map_la-map.lo: coders/map.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_map_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/map_la-map.lo -MD -MP -MF coders/$(DEPDIR)/map_la-map.Tpo -c -o coders/map_la-map.lo `test -f 'coders/map.c' || echo '$(srcdir)/'`coders/map.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/map_la-map.Tpo coders/$(DEPDIR)/map_la-map.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/map.c' object='coders/map_la-map.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_map_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/map_la-map.lo `test -f 'coders/map.c' || echo '$(srcdir)/'`coders/map.c + +coders/mask_la-mask.lo: coders/mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mask_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/mask_la-mask.lo -MD -MP -MF coders/$(DEPDIR)/mask_la-mask.Tpo -c -o coders/mask_la-mask.lo `test -f 'coders/mask.c' || echo '$(srcdir)/'`coders/mask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/mask_la-mask.Tpo coders/$(DEPDIR)/mask_la-mask.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mask.c' object='coders/mask_la-mask.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mask_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/mask_la-mask.lo `test -f 'coders/mask.c' || echo '$(srcdir)/'`coders/mask.c + +coders/mat_la-mat.lo: coders/mat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mat_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/mat_la-mat.lo -MD -MP -MF coders/$(DEPDIR)/mat_la-mat.Tpo -c -o coders/mat_la-mat.lo `test -f 'coders/mat.c' || echo '$(srcdir)/'`coders/mat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/mat_la-mat.Tpo coders/$(DEPDIR)/mat_la-mat.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mat.c' object='coders/mat_la-mat.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mat_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/mat_la-mat.lo `test -f 'coders/mat.c' || echo '$(srcdir)/'`coders/mat.c + +coders/matte_la-matte.lo: coders/matte.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_matte_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/matte_la-matte.lo -MD -MP -MF coders/$(DEPDIR)/matte_la-matte.Tpo -c -o coders/matte_la-matte.lo `test -f 'coders/matte.c' || echo '$(srcdir)/'`coders/matte.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/matte_la-matte.Tpo coders/$(DEPDIR)/matte_la-matte.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/matte.c' object='coders/matte_la-matte.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_matte_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/matte_la-matte.lo `test -f 'coders/matte.c' || echo '$(srcdir)/'`coders/matte.c + +coders/meta_la-meta.lo: coders/meta.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_meta_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/meta_la-meta.lo -MD -MP -MF coders/$(DEPDIR)/meta_la-meta.Tpo -c -o coders/meta_la-meta.lo `test -f 'coders/meta.c' || echo '$(srcdir)/'`coders/meta.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/meta_la-meta.Tpo coders/$(DEPDIR)/meta_la-meta.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/meta.c' object='coders/meta_la-meta.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_meta_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/meta_la-meta.lo `test -f 'coders/meta.c' || echo '$(srcdir)/'`coders/meta.c + +coders/miff_la-miff.lo: coders/miff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_miff_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/miff_la-miff.lo -MD -MP -MF coders/$(DEPDIR)/miff_la-miff.Tpo -c -o coders/miff_la-miff.lo `test -f 'coders/miff.c' || echo '$(srcdir)/'`coders/miff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/miff_la-miff.Tpo coders/$(DEPDIR)/miff_la-miff.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/miff.c' object='coders/miff_la-miff.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_miff_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/miff_la-miff.lo `test -f 'coders/miff.c' || echo '$(srcdir)/'`coders/miff.c + +coders/mono_la-mono.lo: coders/mono.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mono_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/mono_la-mono.lo -MD -MP -MF coders/$(DEPDIR)/mono_la-mono.Tpo -c -o coders/mono_la-mono.lo `test -f 'coders/mono.c' || echo '$(srcdir)/'`coders/mono.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/mono_la-mono.Tpo coders/$(DEPDIR)/mono_la-mono.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mono.c' object='coders/mono_la-mono.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mono_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/mono_la-mono.lo `test -f 'coders/mono.c' || echo '$(srcdir)/'`coders/mono.c + +coders/mpc_la-mpc.lo: coders/mpc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mpc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/mpc_la-mpc.lo -MD -MP -MF coders/$(DEPDIR)/mpc_la-mpc.Tpo -c -o coders/mpc_la-mpc.lo `test -f 'coders/mpc.c' || echo '$(srcdir)/'`coders/mpc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/mpc_la-mpc.Tpo coders/$(DEPDIR)/mpc_la-mpc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mpc.c' object='coders/mpc_la-mpc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mpc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/mpc_la-mpc.lo `test -f 'coders/mpc.c' || echo '$(srcdir)/'`coders/mpc.c + +coders/mpr_la-mpr.lo: coders/mpr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mpr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/mpr_la-mpr.lo -MD -MP -MF coders/$(DEPDIR)/mpr_la-mpr.Tpo -c -o coders/mpr_la-mpr.lo `test -f 'coders/mpr.c' || echo '$(srcdir)/'`coders/mpr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/mpr_la-mpr.Tpo coders/$(DEPDIR)/mpr_la-mpr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mpr.c' object='coders/mpr_la-mpr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mpr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/mpr_la-mpr.lo `test -f 'coders/mpr.c' || echo '$(srcdir)/'`coders/mpr.c + +coders/msl_la-msl.lo: coders/msl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_msl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/msl_la-msl.lo -MD -MP -MF coders/$(DEPDIR)/msl_la-msl.Tpo -c -o coders/msl_la-msl.lo `test -f 'coders/msl.c' || echo '$(srcdir)/'`coders/msl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/msl_la-msl.Tpo coders/$(DEPDIR)/msl_la-msl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/msl.c' object='coders/msl_la-msl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_msl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/msl_la-msl.lo `test -f 'coders/msl.c' || echo '$(srcdir)/'`coders/msl.c + +coders/mtv_la-mtv.lo: coders/mtv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mtv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/mtv_la-mtv.lo -MD -MP -MF coders/$(DEPDIR)/mtv_la-mtv.Tpo -c -o coders/mtv_la-mtv.lo `test -f 'coders/mtv.c' || echo '$(srcdir)/'`coders/mtv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/mtv_la-mtv.Tpo coders/$(DEPDIR)/mtv_la-mtv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mtv.c' object='coders/mtv_la-mtv.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mtv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/mtv_la-mtv.lo `test -f 'coders/mtv.c' || echo '$(srcdir)/'`coders/mtv.c + +coders/mvg_la-mvg.lo: coders/mvg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mvg_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/mvg_la-mvg.lo -MD -MP -MF coders/$(DEPDIR)/mvg_la-mvg.Tpo -c -o coders/mvg_la-mvg.lo `test -f 'coders/mvg.c' || echo '$(srcdir)/'`coders/mvg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/mvg_la-mvg.Tpo coders/$(DEPDIR)/mvg_la-mvg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mvg.c' object='coders/mvg_la-mvg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_mvg_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/mvg_la-mvg.lo `test -f 'coders/mvg.c' || echo '$(srcdir)/'`coders/mvg.c + +coders/null_la-null.lo: coders/null.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_null_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/null_la-null.lo -MD -MP -MF coders/$(DEPDIR)/null_la-null.Tpo -c -o coders/null_la-null.lo `test -f 'coders/null.c' || echo '$(srcdir)/'`coders/null.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/null_la-null.Tpo coders/$(DEPDIR)/null_la-null.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/null.c' object='coders/null_la-null.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_null_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/null_la-null.lo `test -f 'coders/null.c' || echo '$(srcdir)/'`coders/null.c + +coders/otb_la-otb.lo: coders/otb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_otb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/otb_la-otb.lo -MD -MP -MF coders/$(DEPDIR)/otb_la-otb.Tpo -c -o coders/otb_la-otb.lo `test -f 'coders/otb.c' || echo '$(srcdir)/'`coders/otb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/otb_la-otb.Tpo coders/$(DEPDIR)/otb_la-otb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/otb.c' object='coders/otb_la-otb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_otb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/otb_la-otb.lo `test -f 'coders/otb.c' || echo '$(srcdir)/'`coders/otb.c + +coders/palm_la-palm.lo: coders/palm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_palm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/palm_la-palm.lo -MD -MP -MF coders/$(DEPDIR)/palm_la-palm.Tpo -c -o coders/palm_la-palm.lo `test -f 'coders/palm.c' || echo '$(srcdir)/'`coders/palm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/palm_la-palm.Tpo coders/$(DEPDIR)/palm_la-palm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/palm.c' object='coders/palm_la-palm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_palm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/palm_la-palm.lo `test -f 'coders/palm.c' || echo '$(srcdir)/'`coders/palm.c + +coders/pango_la-pango.lo: coders/pango.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pango_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pango_la-pango.lo -MD -MP -MF coders/$(DEPDIR)/pango_la-pango.Tpo -c -o coders/pango_la-pango.lo `test -f 'coders/pango.c' || echo '$(srcdir)/'`coders/pango.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pango_la-pango.Tpo coders/$(DEPDIR)/pango_la-pango.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pango.c' object='coders/pango_la-pango.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pango_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pango_la-pango.lo `test -f 'coders/pango.c' || echo '$(srcdir)/'`coders/pango.c + +coders/pattern_la-pattern.lo: coders/pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pattern_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pattern_la-pattern.lo -MD -MP -MF coders/$(DEPDIR)/pattern_la-pattern.Tpo -c -o coders/pattern_la-pattern.lo `test -f 'coders/pattern.c' || echo '$(srcdir)/'`coders/pattern.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pattern_la-pattern.Tpo coders/$(DEPDIR)/pattern_la-pattern.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pattern.c' object='coders/pattern_la-pattern.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pattern_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pattern_la-pattern.lo `test -f 'coders/pattern.c' || echo '$(srcdir)/'`coders/pattern.c + +coders/pcd_la-pcd.lo: coders/pcd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pcd_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pcd_la-pcd.lo -MD -MP -MF coders/$(DEPDIR)/pcd_la-pcd.Tpo -c -o coders/pcd_la-pcd.lo `test -f 'coders/pcd.c' || echo '$(srcdir)/'`coders/pcd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pcd_la-pcd.Tpo coders/$(DEPDIR)/pcd_la-pcd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pcd.c' object='coders/pcd_la-pcd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pcd_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pcd_la-pcd.lo `test -f 'coders/pcd.c' || echo '$(srcdir)/'`coders/pcd.c + +coders/pcl_la-pcl.lo: coders/pcl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pcl_la-pcl.lo -MD -MP -MF coders/$(DEPDIR)/pcl_la-pcl.Tpo -c -o coders/pcl_la-pcl.lo `test -f 'coders/pcl.c' || echo '$(srcdir)/'`coders/pcl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pcl_la-pcl.Tpo coders/$(DEPDIR)/pcl_la-pcl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pcl.c' object='coders/pcl_la-pcl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pcl_la-pcl.lo `test -f 'coders/pcl.c' || echo '$(srcdir)/'`coders/pcl.c + +coders/pcx_la-pcx.lo: coders/pcx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pcx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pcx_la-pcx.lo -MD -MP -MF coders/$(DEPDIR)/pcx_la-pcx.Tpo -c -o coders/pcx_la-pcx.lo `test -f 'coders/pcx.c' || echo '$(srcdir)/'`coders/pcx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pcx_la-pcx.Tpo coders/$(DEPDIR)/pcx_la-pcx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pcx.c' object='coders/pcx_la-pcx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pcx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pcx_la-pcx.lo `test -f 'coders/pcx.c' || echo '$(srcdir)/'`coders/pcx.c + +coders/pdb_la-pdb.lo: coders/pdb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pdb_la-pdb.lo -MD -MP -MF coders/$(DEPDIR)/pdb_la-pdb.Tpo -c -o coders/pdb_la-pdb.lo `test -f 'coders/pdb.c' || echo '$(srcdir)/'`coders/pdb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pdb_la-pdb.Tpo coders/$(DEPDIR)/pdb_la-pdb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pdb.c' object='coders/pdb_la-pdb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pdb_la-pdb.lo `test -f 'coders/pdb.c' || echo '$(srcdir)/'`coders/pdb.c + +coders/pdf_la-pdf.lo: coders/pdf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pdf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pdf_la-pdf.lo -MD -MP -MF coders/$(DEPDIR)/pdf_la-pdf.Tpo -c -o coders/pdf_la-pdf.lo `test -f 'coders/pdf.c' || echo '$(srcdir)/'`coders/pdf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pdf_la-pdf.Tpo coders/$(DEPDIR)/pdf_la-pdf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pdf.c' object='coders/pdf_la-pdf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pdf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pdf_la-pdf.lo `test -f 'coders/pdf.c' || echo '$(srcdir)/'`coders/pdf.c + +coders/pes_la-pes.lo: coders/pes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pes_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pes_la-pes.lo -MD -MP -MF coders/$(DEPDIR)/pes_la-pes.Tpo -c -o coders/pes_la-pes.lo `test -f 'coders/pes.c' || echo '$(srcdir)/'`coders/pes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pes_la-pes.Tpo coders/$(DEPDIR)/pes_la-pes.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pes.c' object='coders/pes_la-pes.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pes_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pes_la-pes.lo `test -f 'coders/pes.c' || echo '$(srcdir)/'`coders/pes.c + +coders/pgx_la-pgx.lo: coders/pgx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pgx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pgx_la-pgx.lo -MD -MP -MF coders/$(DEPDIR)/pgx_la-pgx.Tpo -c -o coders/pgx_la-pgx.lo `test -f 'coders/pgx.c' || echo '$(srcdir)/'`coders/pgx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pgx_la-pgx.Tpo coders/$(DEPDIR)/pgx_la-pgx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pgx.c' object='coders/pgx_la-pgx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pgx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pgx_la-pgx.lo `test -f 'coders/pgx.c' || echo '$(srcdir)/'`coders/pgx.c + +coders/pict_la-pict.lo: coders/pict.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pict_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pict_la-pict.lo -MD -MP -MF coders/$(DEPDIR)/pict_la-pict.Tpo -c -o coders/pict_la-pict.lo `test -f 'coders/pict.c' || echo '$(srcdir)/'`coders/pict.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pict_la-pict.Tpo coders/$(DEPDIR)/pict_la-pict.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pict.c' object='coders/pict_la-pict.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pict_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pict_la-pict.lo `test -f 'coders/pict.c' || echo '$(srcdir)/'`coders/pict.c + +coders/pix_la-pix.lo: coders/pix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pix_la-pix.lo -MD -MP -MF coders/$(DEPDIR)/pix_la-pix.Tpo -c -o coders/pix_la-pix.lo `test -f 'coders/pix.c' || echo '$(srcdir)/'`coders/pix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pix_la-pix.Tpo coders/$(DEPDIR)/pix_la-pix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pix.c' object='coders/pix_la-pix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pix_la-pix.lo `test -f 'coders/pix.c' || echo '$(srcdir)/'`coders/pix.c + +coders/plasma_la-plasma.lo: coders/plasma.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_plasma_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/plasma_la-plasma.lo -MD -MP -MF coders/$(DEPDIR)/plasma_la-plasma.Tpo -c -o coders/plasma_la-plasma.lo `test -f 'coders/plasma.c' || echo '$(srcdir)/'`coders/plasma.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/plasma_la-plasma.Tpo coders/$(DEPDIR)/plasma_la-plasma.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/plasma.c' object='coders/plasma_la-plasma.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_plasma_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/plasma_la-plasma.lo `test -f 'coders/plasma.c' || echo '$(srcdir)/'`coders/plasma.c + +coders/png_la-png.lo: coders/png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_png_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/png_la-png.lo -MD -MP -MF coders/$(DEPDIR)/png_la-png.Tpo -c -o coders/png_la-png.lo `test -f 'coders/png.c' || echo '$(srcdir)/'`coders/png.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/png_la-png.Tpo coders/$(DEPDIR)/png_la-png.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/png.c' object='coders/png_la-png.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_png_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/png_la-png.lo `test -f 'coders/png.c' || echo '$(srcdir)/'`coders/png.c + +coders/pnm_la-pnm.lo: coders/pnm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pnm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pnm_la-pnm.lo -MD -MP -MF coders/$(DEPDIR)/pnm_la-pnm.Tpo -c -o coders/pnm_la-pnm.lo `test -f 'coders/pnm.c' || echo '$(srcdir)/'`coders/pnm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pnm_la-pnm.Tpo coders/$(DEPDIR)/pnm_la-pnm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pnm.c' object='coders/pnm_la-pnm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pnm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pnm_la-pnm.lo `test -f 'coders/pnm.c' || echo '$(srcdir)/'`coders/pnm.c + +coders/preview_la-preview.lo: coders/preview.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_preview_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/preview_la-preview.lo -MD -MP -MF coders/$(DEPDIR)/preview_la-preview.Tpo -c -o coders/preview_la-preview.lo `test -f 'coders/preview.c' || echo '$(srcdir)/'`coders/preview.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/preview_la-preview.Tpo coders/$(DEPDIR)/preview_la-preview.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/preview.c' object='coders/preview_la-preview.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_preview_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/preview_la-preview.lo `test -f 'coders/preview.c' || echo '$(srcdir)/'`coders/preview.c + +coders/ps_la-ps.lo: coders/ps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ps_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/ps_la-ps.lo -MD -MP -MF coders/$(DEPDIR)/ps_la-ps.Tpo -c -o coders/ps_la-ps.lo `test -f 'coders/ps.c' || echo '$(srcdir)/'`coders/ps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/ps_la-ps.Tpo coders/$(DEPDIR)/ps_la-ps.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ps.c' object='coders/ps_la-ps.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ps_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/ps_la-ps.lo `test -f 'coders/ps.c' || echo '$(srcdir)/'`coders/ps.c + +coders/ps2_la-ps2.lo: coders/ps2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ps2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/ps2_la-ps2.lo -MD -MP -MF coders/$(DEPDIR)/ps2_la-ps2.Tpo -c -o coders/ps2_la-ps2.lo `test -f 'coders/ps2.c' || echo '$(srcdir)/'`coders/ps2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/ps2_la-ps2.Tpo coders/$(DEPDIR)/ps2_la-ps2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ps2.c' object='coders/ps2_la-ps2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ps2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/ps2_la-ps2.lo `test -f 'coders/ps2.c' || echo '$(srcdir)/'`coders/ps2.c + +coders/ps3_la-ps3.lo: coders/ps3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ps3_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/ps3_la-ps3.lo -MD -MP -MF coders/$(DEPDIR)/ps3_la-ps3.Tpo -c -o coders/ps3_la-ps3.lo `test -f 'coders/ps3.c' || echo '$(srcdir)/'`coders/ps3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/ps3_la-ps3.Tpo coders/$(DEPDIR)/ps3_la-ps3.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ps3.c' object='coders/ps3_la-ps3.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ps3_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/ps3_la-ps3.lo `test -f 'coders/ps3.c' || echo '$(srcdir)/'`coders/ps3.c + +coders/psd_la-psd.lo: coders/psd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_psd_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/psd_la-psd.lo -MD -MP -MF coders/$(DEPDIR)/psd_la-psd.Tpo -c -o coders/psd_la-psd.lo `test -f 'coders/psd.c' || echo '$(srcdir)/'`coders/psd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/psd_la-psd.Tpo coders/$(DEPDIR)/psd_la-psd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/psd.c' object='coders/psd_la-psd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_psd_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/psd_la-psd.lo `test -f 'coders/psd.c' || echo '$(srcdir)/'`coders/psd.c + +coders/pwp_la-pwp.lo: coders/pwp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pwp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/pwp_la-pwp.lo -MD -MP -MF coders/$(DEPDIR)/pwp_la-pwp.Tpo -c -o coders/pwp_la-pwp.lo `test -f 'coders/pwp.c' || echo '$(srcdir)/'`coders/pwp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/pwp_la-pwp.Tpo coders/$(DEPDIR)/pwp_la-pwp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pwp.c' object='coders/pwp_la-pwp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_pwp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/pwp_la-pwp.lo `test -f 'coders/pwp.c' || echo '$(srcdir)/'`coders/pwp.c + +coders/raw_la-raw.lo: coders/raw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_raw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/raw_la-raw.lo -MD -MP -MF coders/$(DEPDIR)/raw_la-raw.Tpo -c -o coders/raw_la-raw.lo `test -f 'coders/raw.c' || echo '$(srcdir)/'`coders/raw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/raw_la-raw.Tpo coders/$(DEPDIR)/raw_la-raw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/raw.c' object='coders/raw_la-raw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_raw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/raw_la-raw.lo `test -f 'coders/raw.c' || echo '$(srcdir)/'`coders/raw.c + +coders/rgb_la-rgb.lo: coders/rgb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_rgb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/rgb_la-rgb.lo -MD -MP -MF coders/$(DEPDIR)/rgb_la-rgb.Tpo -c -o coders/rgb_la-rgb.lo `test -f 'coders/rgb.c' || echo '$(srcdir)/'`coders/rgb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/rgb_la-rgb.Tpo coders/$(DEPDIR)/rgb_la-rgb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/rgb.c' object='coders/rgb_la-rgb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_rgb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/rgb_la-rgb.lo `test -f 'coders/rgb.c' || echo '$(srcdir)/'`coders/rgb.c + +coders/rgf_la-rgf.lo: coders/rgf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_rgf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/rgf_la-rgf.lo -MD -MP -MF coders/$(DEPDIR)/rgf_la-rgf.Tpo -c -o coders/rgf_la-rgf.lo `test -f 'coders/rgf.c' || echo '$(srcdir)/'`coders/rgf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/rgf_la-rgf.Tpo coders/$(DEPDIR)/rgf_la-rgf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/rgf.c' object='coders/rgf_la-rgf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_rgf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/rgf_la-rgf.lo `test -f 'coders/rgf.c' || echo '$(srcdir)/'`coders/rgf.c + +coders/rla_la-rla.lo: coders/rla.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_rla_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/rla_la-rla.lo -MD -MP -MF coders/$(DEPDIR)/rla_la-rla.Tpo -c -o coders/rla_la-rla.lo `test -f 'coders/rla.c' || echo '$(srcdir)/'`coders/rla.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/rla_la-rla.Tpo coders/$(DEPDIR)/rla_la-rla.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/rla.c' object='coders/rla_la-rla.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_rla_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/rla_la-rla.lo `test -f 'coders/rla.c' || echo '$(srcdir)/'`coders/rla.c + +coders/rle_la-rle.lo: coders/rle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_rle_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/rle_la-rle.lo -MD -MP -MF coders/$(DEPDIR)/rle_la-rle.Tpo -c -o coders/rle_la-rle.lo `test -f 'coders/rle.c' || echo '$(srcdir)/'`coders/rle.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/rle_la-rle.Tpo coders/$(DEPDIR)/rle_la-rle.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/rle.c' object='coders/rle_la-rle.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_rle_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/rle_la-rle.lo `test -f 'coders/rle.c' || echo '$(srcdir)/'`coders/rle.c + +coders/scr_la-scr.lo: coders/scr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_scr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/scr_la-scr.lo -MD -MP -MF coders/$(DEPDIR)/scr_la-scr.Tpo -c -o coders/scr_la-scr.lo `test -f 'coders/scr.c' || echo '$(srcdir)/'`coders/scr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/scr_la-scr.Tpo coders/$(DEPDIR)/scr_la-scr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/scr.c' object='coders/scr_la-scr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_scr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/scr_la-scr.lo `test -f 'coders/scr.c' || echo '$(srcdir)/'`coders/scr.c + +coders/sct_la-sct.lo: coders/sct.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_sct_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/sct_la-sct.lo -MD -MP -MF coders/$(DEPDIR)/sct_la-sct.Tpo -c -o coders/sct_la-sct.lo `test -f 'coders/sct.c' || echo '$(srcdir)/'`coders/sct.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/sct_la-sct.Tpo coders/$(DEPDIR)/sct_la-sct.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/sct.c' object='coders/sct_la-sct.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_sct_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/sct_la-sct.lo `test -f 'coders/sct.c' || echo '$(srcdir)/'`coders/sct.c + +coders/sfw_la-sfw.lo: coders/sfw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_sfw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/sfw_la-sfw.lo -MD -MP -MF coders/$(DEPDIR)/sfw_la-sfw.Tpo -c -o coders/sfw_la-sfw.lo `test -f 'coders/sfw.c' || echo '$(srcdir)/'`coders/sfw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/sfw_la-sfw.Tpo coders/$(DEPDIR)/sfw_la-sfw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/sfw.c' object='coders/sfw_la-sfw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_sfw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/sfw_la-sfw.lo `test -f 'coders/sfw.c' || echo '$(srcdir)/'`coders/sfw.c + +coders/sgi_la-sgi.lo: coders/sgi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_sgi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/sgi_la-sgi.lo -MD -MP -MF coders/$(DEPDIR)/sgi_la-sgi.Tpo -c -o coders/sgi_la-sgi.lo `test -f 'coders/sgi.c' || echo '$(srcdir)/'`coders/sgi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/sgi_la-sgi.Tpo coders/$(DEPDIR)/sgi_la-sgi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/sgi.c' object='coders/sgi_la-sgi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_sgi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/sgi_la-sgi.lo `test -f 'coders/sgi.c' || echo '$(srcdir)/'`coders/sgi.c + +coders/sixel_la-sixel.lo: coders/sixel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_sixel_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/sixel_la-sixel.lo -MD -MP -MF coders/$(DEPDIR)/sixel_la-sixel.Tpo -c -o coders/sixel_la-sixel.lo `test -f 'coders/sixel.c' || echo '$(srcdir)/'`coders/sixel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/sixel_la-sixel.Tpo coders/$(DEPDIR)/sixel_la-sixel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/sixel.c' object='coders/sixel_la-sixel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_sixel_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/sixel_la-sixel.lo `test -f 'coders/sixel.c' || echo '$(srcdir)/'`coders/sixel.c + +coders/stegano_la-stegano.lo: coders/stegano.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_stegano_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/stegano_la-stegano.lo -MD -MP -MF coders/$(DEPDIR)/stegano_la-stegano.Tpo -c -o coders/stegano_la-stegano.lo `test -f 'coders/stegano.c' || echo '$(srcdir)/'`coders/stegano.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/stegano_la-stegano.Tpo coders/$(DEPDIR)/stegano_la-stegano.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/stegano.c' object='coders/stegano_la-stegano.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_stegano_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/stegano_la-stegano.lo `test -f 'coders/stegano.c' || echo '$(srcdir)/'`coders/stegano.c + +coders/sun_la-sun.lo: coders/sun.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_sun_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/sun_la-sun.lo -MD -MP -MF coders/$(DEPDIR)/sun_la-sun.Tpo -c -o coders/sun_la-sun.lo `test -f 'coders/sun.c' || echo '$(srcdir)/'`coders/sun.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/sun_la-sun.Tpo coders/$(DEPDIR)/sun_la-sun.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/sun.c' object='coders/sun_la-sun.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_sun_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/sun_la-sun.lo `test -f 'coders/sun.c' || echo '$(srcdir)/'`coders/sun.c + +coders/svg_la-svg.lo: coders/svg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_svg_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/svg_la-svg.lo -MD -MP -MF coders/$(DEPDIR)/svg_la-svg.Tpo -c -o coders/svg_la-svg.lo `test -f 'coders/svg.c' || echo '$(srcdir)/'`coders/svg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/svg_la-svg.Tpo coders/$(DEPDIR)/svg_la-svg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/svg.c' object='coders/svg_la-svg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_svg_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/svg_la-svg.lo `test -f 'coders/svg.c' || echo '$(srcdir)/'`coders/svg.c + +coders/tga_la-tga.lo: coders/tga.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_tga_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/tga_la-tga.lo -MD -MP -MF coders/$(DEPDIR)/tga_la-tga.Tpo -c -o coders/tga_la-tga.lo `test -f 'coders/tga.c' || echo '$(srcdir)/'`coders/tga.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/tga_la-tga.Tpo coders/$(DEPDIR)/tga_la-tga.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/tga.c' object='coders/tga_la-tga.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_tga_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/tga_la-tga.lo `test -f 'coders/tga.c' || echo '$(srcdir)/'`coders/tga.c + +coders/thumbnail_la-thumbnail.lo: coders/thumbnail.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_thumbnail_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/thumbnail_la-thumbnail.lo -MD -MP -MF coders/$(DEPDIR)/thumbnail_la-thumbnail.Tpo -c -o coders/thumbnail_la-thumbnail.lo `test -f 'coders/thumbnail.c' || echo '$(srcdir)/'`coders/thumbnail.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/thumbnail_la-thumbnail.Tpo coders/$(DEPDIR)/thumbnail_la-thumbnail.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/thumbnail.c' object='coders/thumbnail_la-thumbnail.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_thumbnail_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/thumbnail_la-thumbnail.lo `test -f 'coders/thumbnail.c' || echo '$(srcdir)/'`coders/thumbnail.c + +coders/tiff_la-tiff.lo: coders/tiff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_tiff_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/tiff_la-tiff.lo -MD -MP -MF coders/$(DEPDIR)/tiff_la-tiff.Tpo -c -o coders/tiff_la-tiff.lo `test -f 'coders/tiff.c' || echo '$(srcdir)/'`coders/tiff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/tiff_la-tiff.Tpo coders/$(DEPDIR)/tiff_la-tiff.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/tiff.c' object='coders/tiff_la-tiff.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_tiff_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/tiff_la-tiff.lo `test -f 'coders/tiff.c' || echo '$(srcdir)/'`coders/tiff.c + +coders/tiff_la-psd.lo: coders/psd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_tiff_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/tiff_la-psd.lo -MD -MP -MF coders/$(DEPDIR)/tiff_la-psd.Tpo -c -o coders/tiff_la-psd.lo `test -f 'coders/psd.c' || echo '$(srcdir)/'`coders/psd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/tiff_la-psd.Tpo coders/$(DEPDIR)/tiff_la-psd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/psd.c' object='coders/tiff_la-psd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_tiff_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/tiff_la-psd.lo `test -f 'coders/psd.c' || echo '$(srcdir)/'`coders/psd.c + +coders/tile_la-tile.lo: coders/tile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_tile_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/tile_la-tile.lo -MD -MP -MF coders/$(DEPDIR)/tile_la-tile.Tpo -c -o coders/tile_la-tile.lo `test -f 'coders/tile.c' || echo '$(srcdir)/'`coders/tile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/tile_la-tile.Tpo coders/$(DEPDIR)/tile_la-tile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/tile.c' object='coders/tile_la-tile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_tile_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/tile_la-tile.lo `test -f 'coders/tile.c' || echo '$(srcdir)/'`coders/tile.c + +coders/tim_la-tim.lo: coders/tim.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_tim_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/tim_la-tim.lo -MD -MP -MF coders/$(DEPDIR)/tim_la-tim.Tpo -c -o coders/tim_la-tim.lo `test -f 'coders/tim.c' || echo '$(srcdir)/'`coders/tim.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/tim_la-tim.Tpo coders/$(DEPDIR)/tim_la-tim.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/tim.c' object='coders/tim_la-tim.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_tim_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/tim_la-tim.lo `test -f 'coders/tim.c' || echo '$(srcdir)/'`coders/tim.c + +coders/ttf_la-ttf.lo: coders/ttf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ttf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/ttf_la-ttf.lo -MD -MP -MF coders/$(DEPDIR)/ttf_la-ttf.Tpo -c -o coders/ttf_la-ttf.lo `test -f 'coders/ttf.c' || echo '$(srcdir)/'`coders/ttf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/ttf_la-ttf.Tpo coders/$(DEPDIR)/ttf_la-ttf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ttf.c' object='coders/ttf_la-ttf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ttf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/ttf_la-ttf.lo `test -f 'coders/ttf.c' || echo '$(srcdir)/'`coders/ttf.c + +coders/txt_la-txt.lo: coders/txt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_txt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/txt_la-txt.lo -MD -MP -MF coders/$(DEPDIR)/txt_la-txt.Tpo -c -o coders/txt_la-txt.lo `test -f 'coders/txt.c' || echo '$(srcdir)/'`coders/txt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/txt_la-txt.Tpo coders/$(DEPDIR)/txt_la-txt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/txt.c' object='coders/txt_la-txt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_txt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/txt_la-txt.lo `test -f 'coders/txt.c' || echo '$(srcdir)/'`coders/txt.c + +coders/uil_la-uil.lo: coders/uil.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_uil_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/uil_la-uil.lo -MD -MP -MF coders/$(DEPDIR)/uil_la-uil.Tpo -c -o coders/uil_la-uil.lo `test -f 'coders/uil.c' || echo '$(srcdir)/'`coders/uil.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/uil_la-uil.Tpo coders/$(DEPDIR)/uil_la-uil.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/uil.c' object='coders/uil_la-uil.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_uil_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/uil_la-uil.lo `test -f 'coders/uil.c' || echo '$(srcdir)/'`coders/uil.c + +coders/url_la-url.lo: coders/url.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_url_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/url_la-url.lo -MD -MP -MF coders/$(DEPDIR)/url_la-url.Tpo -c -o coders/url_la-url.lo `test -f 'coders/url.c' || echo '$(srcdir)/'`coders/url.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/url_la-url.Tpo coders/$(DEPDIR)/url_la-url.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/url.c' object='coders/url_la-url.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_url_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/url_la-url.lo `test -f 'coders/url.c' || echo '$(srcdir)/'`coders/url.c + +coders/uyvy_la-uyvy.lo: coders/uyvy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_uyvy_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/uyvy_la-uyvy.lo -MD -MP -MF coders/$(DEPDIR)/uyvy_la-uyvy.Tpo -c -o coders/uyvy_la-uyvy.lo `test -f 'coders/uyvy.c' || echo '$(srcdir)/'`coders/uyvy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/uyvy_la-uyvy.Tpo coders/$(DEPDIR)/uyvy_la-uyvy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/uyvy.c' object='coders/uyvy_la-uyvy.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_uyvy_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/uyvy_la-uyvy.lo `test -f 'coders/uyvy.c' || echo '$(srcdir)/'`coders/uyvy.c + +coders/vicar_la-vicar.lo: coders/vicar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_vicar_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/vicar_la-vicar.lo -MD -MP -MF coders/$(DEPDIR)/vicar_la-vicar.Tpo -c -o coders/vicar_la-vicar.lo `test -f 'coders/vicar.c' || echo '$(srcdir)/'`coders/vicar.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/vicar_la-vicar.Tpo coders/$(DEPDIR)/vicar_la-vicar.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/vicar.c' object='coders/vicar_la-vicar.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_vicar_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/vicar_la-vicar.lo `test -f 'coders/vicar.c' || echo '$(srcdir)/'`coders/vicar.c + +coders/vid_la-vid.lo: coders/vid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_vid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/vid_la-vid.lo -MD -MP -MF coders/$(DEPDIR)/vid_la-vid.Tpo -c -o coders/vid_la-vid.lo `test -f 'coders/vid.c' || echo '$(srcdir)/'`coders/vid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/vid_la-vid.Tpo coders/$(DEPDIR)/vid_la-vid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/vid.c' object='coders/vid_la-vid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_vid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/vid_la-vid.lo `test -f 'coders/vid.c' || echo '$(srcdir)/'`coders/vid.c + +coders/video_la-video.lo: coders/video.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_video_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/video_la-video.lo -MD -MP -MF coders/$(DEPDIR)/video_la-video.Tpo -c -o coders/video_la-video.lo `test -f 'coders/video.c' || echo '$(srcdir)/'`coders/video.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/video_la-video.Tpo coders/$(DEPDIR)/video_la-video.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/video.c' object='coders/video_la-video.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_video_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/video_la-video.lo `test -f 'coders/video.c' || echo '$(srcdir)/'`coders/video.c + +coders/viff_la-viff.lo: coders/viff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_viff_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/viff_la-viff.lo -MD -MP -MF coders/$(DEPDIR)/viff_la-viff.Tpo -c -o coders/viff_la-viff.lo `test -f 'coders/viff.c' || echo '$(srcdir)/'`coders/viff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/viff_la-viff.Tpo coders/$(DEPDIR)/viff_la-viff.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/viff.c' object='coders/viff_la-viff.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_viff_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/viff_la-viff.lo `test -f 'coders/viff.c' || echo '$(srcdir)/'`coders/viff.c + +coders/vips_la-vips.lo: coders/vips.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_vips_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/vips_la-vips.lo -MD -MP -MF coders/$(DEPDIR)/vips_la-vips.Tpo -c -o coders/vips_la-vips.lo `test -f 'coders/vips.c' || echo '$(srcdir)/'`coders/vips.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/vips_la-vips.Tpo coders/$(DEPDIR)/vips_la-vips.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/vips.c' object='coders/vips_la-vips.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_vips_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/vips_la-vips.lo `test -f 'coders/vips.c' || echo '$(srcdir)/'`coders/vips.c + +coders/wbmp_la-wbmp.lo: coders/wbmp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_wbmp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/wbmp_la-wbmp.lo -MD -MP -MF coders/$(DEPDIR)/wbmp_la-wbmp.Tpo -c -o coders/wbmp_la-wbmp.lo `test -f 'coders/wbmp.c' || echo '$(srcdir)/'`coders/wbmp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/wbmp_la-wbmp.Tpo coders/$(DEPDIR)/wbmp_la-wbmp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/wbmp.c' object='coders/wbmp_la-wbmp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_wbmp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/wbmp_la-wbmp.lo `test -f 'coders/wbmp.c' || echo '$(srcdir)/'`coders/wbmp.c + +coders/webp_la-webp.lo: coders/webp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_webp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/webp_la-webp.lo -MD -MP -MF coders/$(DEPDIR)/webp_la-webp.Tpo -c -o coders/webp_la-webp.lo `test -f 'coders/webp.c' || echo '$(srcdir)/'`coders/webp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/webp_la-webp.Tpo coders/$(DEPDIR)/webp_la-webp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/webp.c' object='coders/webp_la-webp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_webp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/webp_la-webp.lo `test -f 'coders/webp.c' || echo '$(srcdir)/'`coders/webp.c + +coders/wmf_la-wmf.lo: coders/wmf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_wmf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/wmf_la-wmf.lo -MD -MP -MF coders/$(DEPDIR)/wmf_la-wmf.Tpo -c -o coders/wmf_la-wmf.lo `test -f 'coders/wmf.c' || echo '$(srcdir)/'`coders/wmf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/wmf_la-wmf.Tpo coders/$(DEPDIR)/wmf_la-wmf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/wmf.c' object='coders/wmf_la-wmf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_wmf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/wmf_la-wmf.lo `test -f 'coders/wmf.c' || echo '$(srcdir)/'`coders/wmf.c + +coders/wpg_la-wpg.lo: coders/wpg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_wpg_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/wpg_la-wpg.lo -MD -MP -MF coders/$(DEPDIR)/wpg_la-wpg.Tpo -c -o coders/wpg_la-wpg.lo `test -f 'coders/wpg.c' || echo '$(srcdir)/'`coders/wpg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/wpg_la-wpg.Tpo coders/$(DEPDIR)/wpg_la-wpg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/wpg.c' object='coders/wpg_la-wpg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_wpg_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/wpg_la-wpg.lo `test -f 'coders/wpg.c' || echo '$(srcdir)/'`coders/wpg.c + +coders/x_la-x.lo: coders/x.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_x_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/x_la-x.lo -MD -MP -MF coders/$(DEPDIR)/x_la-x.Tpo -c -o coders/x_la-x.lo `test -f 'coders/x.c' || echo '$(srcdir)/'`coders/x.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/x_la-x.Tpo coders/$(DEPDIR)/x_la-x.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/x.c' object='coders/x_la-x.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_x_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/x_la-x.lo `test -f 'coders/x.c' || echo '$(srcdir)/'`coders/x.c + +coders/xbm_la-xbm.lo: coders/xbm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xbm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/xbm_la-xbm.lo -MD -MP -MF coders/$(DEPDIR)/xbm_la-xbm.Tpo -c -o coders/xbm_la-xbm.lo `test -f 'coders/xbm.c' || echo '$(srcdir)/'`coders/xbm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/xbm_la-xbm.Tpo coders/$(DEPDIR)/xbm_la-xbm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xbm.c' object='coders/xbm_la-xbm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xbm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/xbm_la-xbm.lo `test -f 'coders/xbm.c' || echo '$(srcdir)/'`coders/xbm.c + +coders/xc_la-xc.lo: coders/xc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/xc_la-xc.lo -MD -MP -MF coders/$(DEPDIR)/xc_la-xc.Tpo -c -o coders/xc_la-xc.lo `test -f 'coders/xc.c' || echo '$(srcdir)/'`coders/xc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/xc_la-xc.Tpo coders/$(DEPDIR)/xc_la-xc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xc.c' object='coders/xc_la-xc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/xc_la-xc.lo `test -f 'coders/xc.c' || echo '$(srcdir)/'`coders/xc.c + +coders/xcf_la-xcf.lo: coders/xcf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xcf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/xcf_la-xcf.lo -MD -MP -MF coders/$(DEPDIR)/xcf_la-xcf.Tpo -c -o coders/xcf_la-xcf.lo `test -f 'coders/xcf.c' || echo '$(srcdir)/'`coders/xcf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/xcf_la-xcf.Tpo coders/$(DEPDIR)/xcf_la-xcf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xcf.c' object='coders/xcf_la-xcf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xcf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/xcf_la-xcf.lo `test -f 'coders/xcf.c' || echo '$(srcdir)/'`coders/xcf.c + +coders/xpm_la-xpm.lo: coders/xpm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xpm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/xpm_la-xpm.lo -MD -MP -MF coders/$(DEPDIR)/xpm_la-xpm.Tpo -c -o coders/xpm_la-xpm.lo `test -f 'coders/xpm.c' || echo '$(srcdir)/'`coders/xpm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/xpm_la-xpm.Tpo coders/$(DEPDIR)/xpm_la-xpm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xpm.c' object='coders/xpm_la-xpm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xpm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/xpm_la-xpm.lo `test -f 'coders/xpm.c' || echo '$(srcdir)/'`coders/xpm.c + +coders/xps_la-xps.lo: coders/xps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xps_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/xps_la-xps.lo -MD -MP -MF coders/$(DEPDIR)/xps_la-xps.Tpo -c -o coders/xps_la-xps.lo `test -f 'coders/xps.c' || echo '$(srcdir)/'`coders/xps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/xps_la-xps.Tpo coders/$(DEPDIR)/xps_la-xps.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xps.c' object='coders/xps_la-xps.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xps_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/xps_la-xps.lo `test -f 'coders/xps.c' || echo '$(srcdir)/'`coders/xps.c + +coders/xwd_la-xwd.lo: coders/xwd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xwd_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/xwd_la-xwd.lo -MD -MP -MF coders/$(DEPDIR)/xwd_la-xwd.Tpo -c -o coders/xwd_la-xwd.lo `test -f 'coders/xwd.c' || echo '$(srcdir)/'`coders/xwd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/xwd_la-xwd.Tpo coders/$(DEPDIR)/xwd_la-xwd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xwd.c' object='coders/xwd_la-xwd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_xwd_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/xwd_la-xwd.lo `test -f 'coders/xwd.c' || echo '$(srcdir)/'`coders/xwd.c + +coders/ycbcr_la-ycbcr.lo: coders/ycbcr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ycbcr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/ycbcr_la-ycbcr.lo -MD -MP -MF coders/$(DEPDIR)/ycbcr_la-ycbcr.Tpo -c -o coders/ycbcr_la-ycbcr.lo `test -f 'coders/ycbcr.c' || echo '$(srcdir)/'`coders/ycbcr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/ycbcr_la-ycbcr.Tpo coders/$(DEPDIR)/ycbcr_la-ycbcr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ycbcr.c' object='coders/ycbcr_la-ycbcr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_ycbcr_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/ycbcr_la-ycbcr.lo `test -f 'coders/ycbcr.c' || echo '$(srcdir)/'`coders/ycbcr.c + +coders/yuv_la-yuv.lo: coders/yuv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_yuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/yuv_la-yuv.lo -MD -MP -MF coders/$(DEPDIR)/yuv_la-yuv.Tpo -c -o coders/yuv_la-yuv.lo `test -f 'coders/yuv.c' || echo '$(srcdir)/'`coders/yuv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/yuv_la-yuv.Tpo coders/$(DEPDIR)/yuv_la-yuv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/yuv.c' object='coders/yuv_la-yuv.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(coders_yuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/yuv_la-yuv.lo `test -f 'coders/yuv.c' || echo '$(srcdir)/'`coders/yuv.c + +filters/analyze_la-analyze.lo: filters/analyze.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(filters_analyze_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT filters/analyze_la-analyze.lo -MD -MP -MF filters/$(DEPDIR)/analyze_la-analyze.Tpo -c -o filters/analyze_la-analyze.lo `test -f 'filters/analyze.c' || echo '$(srcdir)/'`filters/analyze.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/analyze_la-analyze.Tpo filters/$(DEPDIR)/analyze_la-analyze.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/analyze.c' object='filters/analyze_la-analyze.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(filters_analyze_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o filters/analyze_la-analyze.lo `test -f 'filters/analyze.c' || echo '$(srcdir)/'`filters/analyze.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.lo: magick/accelerate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.lo `test -f 'magick/accelerate.c' || echo '$(srcdir)/'`magick/accelerate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/accelerate.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.lo `test -f 'magick/accelerate.c' || echo '$(srcdir)/'`magick/accelerate.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo: magick/animate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo `test -f 'magick/animate.c' || echo '$(srcdir)/'`magick/animate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/animate.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo `test -f 'magick/animate.c' || echo '$(srcdir)/'`magick/animate.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.lo: magick/annotate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.lo `test -f 'magick/annotate.c' || echo '$(srcdir)/'`magick/annotate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/annotate.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.lo `test -f 'magick/annotate.c' || echo '$(srcdir)/'`magick/annotate.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.lo: magick/artifact.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.lo `test -f 'magick/artifact.c' || echo '$(srcdir)/'`magick/artifact.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/artifact.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.lo `test -f 'magick/artifact.c' || echo '$(srcdir)/'`magick/artifact.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.lo: magick/attribute.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.lo `test -f 'magick/attribute.c' || echo '$(srcdir)/'`magick/attribute.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/attribute.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.lo `test -f 'magick/attribute.c' || echo '$(srcdir)/'`magick/attribute.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.lo: magick/blob.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.lo `test -f 'magick/blob.c' || echo '$(srcdir)/'`magick/blob.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/blob.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.lo `test -f 'magick/blob.c' || echo '$(srcdir)/'`magick/blob.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.lo: magick/cache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.lo `test -f 'magick/cache.c' || echo '$(srcdir)/'`magick/cache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/cache.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.lo `test -f 'magick/cache.c' || echo '$(srcdir)/'`magick/cache.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.lo: magick/cache-view.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.lo `test -f 'magick/cache-view.c' || echo '$(srcdir)/'`magick/cache-view.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/cache-view.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.lo `test -f 'magick/cache-view.c' || echo '$(srcdir)/'`magick/cache-view.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.lo: magick/channel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.lo `test -f 'magick/channel.c' || echo '$(srcdir)/'`magick/channel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/channel.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.lo `test -f 'magick/channel.c' || echo '$(srcdir)/'`magick/channel.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.lo: magick/cipher.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.lo `test -f 'magick/cipher.c' || echo '$(srcdir)/'`magick/cipher.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/cipher.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.lo `test -f 'magick/cipher.c' || echo '$(srcdir)/'`magick/cipher.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.lo: magick/client.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.lo `test -f 'magick/client.c' || echo '$(srcdir)/'`magick/client.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/client.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.lo `test -f 'magick/client.c' || echo '$(srcdir)/'`magick/client.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.lo: magick/coder.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.lo `test -f 'magick/coder.c' || echo '$(srcdir)/'`magick/coder.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/coder.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.lo `test -f 'magick/coder.c' || echo '$(srcdir)/'`magick/coder.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.lo: magick/color.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.lo `test -f 'magick/color.c' || echo '$(srcdir)/'`magick/color.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/color.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.lo `test -f 'magick/color.c' || echo '$(srcdir)/'`magick/color.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.lo: magick/colormap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.lo `test -f 'magick/colormap.c' || echo '$(srcdir)/'`magick/colormap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/colormap.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.lo `test -f 'magick/colormap.c' || echo '$(srcdir)/'`magick/colormap.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.lo: magick/colorspace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.lo `test -f 'magick/colorspace.c' || echo '$(srcdir)/'`magick/colorspace.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/colorspace.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.lo `test -f 'magick/colorspace.c' || echo '$(srcdir)/'`magick/colorspace.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo: magick/compare.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo `test -f 'magick/compare.c' || echo '$(srcdir)/'`magick/compare.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/compare.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo `test -f 'magick/compare.c' || echo '$(srcdir)/'`magick/compare.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo: magick/composite.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo `test -f 'magick/composite.c' || echo '$(srcdir)/'`magick/composite.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/composite.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo `test -f 'magick/composite.c' || echo '$(srcdir)/'`magick/composite.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.lo: magick/compress.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.lo `test -f 'magick/compress.c' || echo '$(srcdir)/'`magick/compress.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/compress.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.lo `test -f 'magick/compress.c' || echo '$(srcdir)/'`magick/compress.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.lo: magick/configure.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.lo `test -f 'magick/configure.c' || echo '$(srcdir)/'`magick/configure.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/configure.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.lo `test -f 'magick/configure.c' || echo '$(srcdir)/'`magick/configure.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.lo: magick/constitute.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.lo `test -f 'magick/constitute.c' || echo '$(srcdir)/'`magick/constitute.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/constitute.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.lo `test -f 'magick/constitute.c' || echo '$(srcdir)/'`magick/constitute.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.lo: magick/decorate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.lo `test -f 'magick/decorate.c' || echo '$(srcdir)/'`magick/decorate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/decorate.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.lo `test -f 'magick/decorate.c' || echo '$(srcdir)/'`magick/decorate.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.lo: magick/distribute-cache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.lo `test -f 'magick/distribute-cache.c' || echo '$(srcdir)/'`magick/distribute-cache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/distribute-cache.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.lo `test -f 'magick/distribute-cache.c' || echo '$(srcdir)/'`magick/distribute-cache.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.lo: magick/delegate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.lo `test -f 'magick/delegate.c' || echo '$(srcdir)/'`magick/delegate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/delegate.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.lo `test -f 'magick/delegate.c' || echo '$(srcdir)/'`magick/delegate.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo: magick/deprecate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo `test -f 'magick/deprecate.c' || echo '$(srcdir)/'`magick/deprecate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/deprecate.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo `test -f 'magick/deprecate.c' || echo '$(srcdir)/'`magick/deprecate.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo: magick/display.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo `test -f 'magick/display.c' || echo '$(srcdir)/'`magick/display.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/display.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo `test -f 'magick/display.c' || echo '$(srcdir)/'`magick/display.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.lo: magick/distort.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.lo `test -f 'magick/distort.c' || echo '$(srcdir)/'`magick/distort.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/distort.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.lo `test -f 'magick/distort.c' || echo '$(srcdir)/'`magick/distort.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.lo: magick/draw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.lo `test -f 'magick/draw.c' || echo '$(srcdir)/'`magick/draw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/draw.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.lo `test -f 'magick/draw.c' || echo '$(srcdir)/'`magick/draw.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.lo: magick/effect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.lo `test -f 'magick/effect.c' || echo '$(srcdir)/'`magick/effect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/effect.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.lo `test -f 'magick/effect.c' || echo '$(srcdir)/'`magick/effect.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.lo: magick/enhance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.lo `test -f 'magick/enhance.c' || echo '$(srcdir)/'`magick/enhance.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/enhance.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.lo `test -f 'magick/enhance.c' || echo '$(srcdir)/'`magick/enhance.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.lo: magick/exception.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.lo `test -f 'magick/exception.c' || echo '$(srcdir)/'`magick/exception.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/exception.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.lo `test -f 'magick/exception.c' || echo '$(srcdir)/'`magick/exception.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.lo: magick/feature.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.lo `test -f 'magick/feature.c' || echo '$(srcdir)/'`magick/feature.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/feature.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.lo `test -f 'magick/feature.c' || echo '$(srcdir)/'`magick/feature.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.lo: magick/fourier.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.lo `test -f 'magick/fourier.c' || echo '$(srcdir)/'`magick/fourier.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/fourier.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.lo `test -f 'magick/fourier.c' || echo '$(srcdir)/'`magick/fourier.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.lo: magick/fx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.lo `test -f 'magick/fx.c' || echo '$(srcdir)/'`magick/fx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/fx.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.lo `test -f 'magick/fx.c' || echo '$(srcdir)/'`magick/fx.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.lo: magick/gem.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.lo `test -f 'magick/gem.c' || echo '$(srcdir)/'`magick/gem.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/gem.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.lo `test -f 'magick/gem.c' || echo '$(srcdir)/'`magick/gem.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.lo: magick/geometry.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.lo `test -f 'magick/geometry.c' || echo '$(srcdir)/'`magick/geometry.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/geometry.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.lo `test -f 'magick/geometry.c' || echo '$(srcdir)/'`magick/geometry.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.lo: magick/hashmap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.lo `test -f 'magick/hashmap.c' || echo '$(srcdir)/'`magick/hashmap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/hashmap.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.lo `test -f 'magick/hashmap.c' || echo '$(srcdir)/'`magick/hashmap.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo: magick/histogram.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo `test -f 'magick/histogram.c' || echo '$(srcdir)/'`magick/histogram.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/histogram.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo `test -f 'magick/histogram.c' || echo '$(srcdir)/'`magick/histogram.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo: magick/identify.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo `test -f 'magick/identify.c' || echo '$(srcdir)/'`magick/identify.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/identify.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo `test -f 'magick/identify.c' || echo '$(srcdir)/'`magick/identify.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.lo: magick/image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.lo `test -f 'magick/image.c' || echo '$(srcdir)/'`magick/image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/image.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.lo `test -f 'magick/image.c' || echo '$(srcdir)/'`magick/image.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.lo: magick/image-view.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.lo `test -f 'magick/image-view.c' || echo '$(srcdir)/'`magick/image-view.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/image-view.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.lo `test -f 'magick/image-view.c' || echo '$(srcdir)/'`magick/image-view.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.lo: magick/layer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.lo `test -f 'magick/layer.c' || echo '$(srcdir)/'`magick/layer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/layer.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.lo `test -f 'magick/layer.c' || echo '$(srcdir)/'`magick/layer.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.lo: magick/list.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.lo `test -f 'magick/list.c' || echo '$(srcdir)/'`magick/list.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/list.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.lo `test -f 'magick/list.c' || echo '$(srcdir)/'`magick/list.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.lo: magick/locale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.lo `test -f 'magick/locale.c' || echo '$(srcdir)/'`magick/locale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/locale.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.lo `test -f 'magick/locale.c' || echo '$(srcdir)/'`magick/locale.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.lo: magick/log.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.lo `test -f 'magick/log.c' || echo '$(srcdir)/'`magick/log.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/log.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.lo `test -f 'magick/log.c' || echo '$(srcdir)/'`magick/log.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.lo: magick/magic.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.lo `test -f 'magick/magic.c' || echo '$(srcdir)/'`magick/magic.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/magic.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.lo `test -f 'magick/magic.c' || echo '$(srcdir)/'`magick/magic.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo: magick/magick.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo `test -f 'magick/magick.c' || echo '$(srcdir)/'`magick/magick.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/magick.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo `test -f 'magick/magick.c' || echo '$(srcdir)/'`magick/magick.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.lo: magick/matrix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.lo `test -f 'magick/matrix.c' || echo '$(srcdir)/'`magick/matrix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/matrix.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.lo `test -f 'magick/matrix.c' || echo '$(srcdir)/'`magick/matrix.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.lo: magick/memory.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.lo `test -f 'magick/memory.c' || echo '$(srcdir)/'`magick/memory.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/memory.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.lo `test -f 'magick/memory.c' || echo '$(srcdir)/'`magick/memory.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.lo: magick/mime.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.lo `test -f 'magick/mime.c' || echo '$(srcdir)/'`magick/mime.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/mime.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.lo `test -f 'magick/mime.c' || echo '$(srcdir)/'`magick/mime.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.lo: magick/module.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.lo `test -f 'magick/module.c' || echo '$(srcdir)/'`magick/module.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/module.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.lo `test -f 'magick/module.c' || echo '$(srcdir)/'`magick/module.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.lo: magick/monitor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.lo `test -f 'magick/monitor.c' || echo '$(srcdir)/'`magick/monitor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/monitor.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.lo `test -f 'magick/monitor.c' || echo '$(srcdir)/'`magick/monitor.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo: magick/montage.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo `test -f 'magick/montage.c' || echo '$(srcdir)/'`magick/montage.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/montage.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo `test -f 'magick/montage.c' || echo '$(srcdir)/'`magick/montage.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.lo: magick/morphology.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.lo `test -f 'magick/morphology.c' || echo '$(srcdir)/'`magick/morphology.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/morphology.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.lo `test -f 'magick/morphology.c' || echo '$(srcdir)/'`magick/morphology.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.lo: magick/opencl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.lo `test -f 'magick/opencl.c' || echo '$(srcdir)/'`magick/opencl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/opencl.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.lo `test -f 'magick/opencl.c' || echo '$(srcdir)/'`magick/opencl.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.lo: magick/option.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.lo `test -f 'magick/option.c' || echo '$(srcdir)/'`magick/option.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/option.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.lo `test -f 'magick/option.c' || echo '$(srcdir)/'`magick/option.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.lo: magick/paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.lo `test -f 'magick/paint.c' || echo '$(srcdir)/'`magick/paint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/paint.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.lo `test -f 'magick/paint.c' || echo '$(srcdir)/'`magick/paint.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.lo: magick/pixel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.lo `test -f 'magick/pixel.c' || echo '$(srcdir)/'`magick/pixel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/pixel.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.lo `test -f 'magick/pixel.c' || echo '$(srcdir)/'`magick/pixel.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.lo: magick/policy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.lo `test -f 'magick/policy.c' || echo '$(srcdir)/'`magick/policy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/policy.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.lo `test -f 'magick/policy.c' || echo '$(srcdir)/'`magick/policy.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.lo: magick/prepress.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.lo `test -f 'magick/prepress.c' || echo '$(srcdir)/'`magick/prepress.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/prepress.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.lo `test -f 'magick/prepress.c' || echo '$(srcdir)/'`magick/prepress.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.lo: magick/property.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.lo `test -f 'magick/property.c' || echo '$(srcdir)/'`magick/property.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/property.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.lo `test -f 'magick/property.c' || echo '$(srcdir)/'`magick/property.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.lo: magick/profile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.lo `test -f 'magick/profile.c' || echo '$(srcdir)/'`magick/profile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/profile.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.lo `test -f 'magick/profile.c' || echo '$(srcdir)/'`magick/profile.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.lo: magick/quantize.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.lo `test -f 'magick/quantize.c' || echo '$(srcdir)/'`magick/quantize.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/quantize.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.lo `test -f 'magick/quantize.c' || echo '$(srcdir)/'`magick/quantize.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.lo: magick/quantum.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.lo `test -f 'magick/quantum.c' || echo '$(srcdir)/'`magick/quantum.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/quantum.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.lo `test -f 'magick/quantum.c' || echo '$(srcdir)/'`magick/quantum.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.lo: magick/quantum-export.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.lo `test -f 'magick/quantum-export.c' || echo '$(srcdir)/'`magick/quantum-export.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/quantum-export.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.lo `test -f 'magick/quantum-export.c' || echo '$(srcdir)/'`magick/quantum-export.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.lo: magick/quantum-import.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.lo `test -f 'magick/quantum-import.c' || echo '$(srcdir)/'`magick/quantum-import.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/quantum-import.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.lo `test -f 'magick/quantum-import.c' || echo '$(srcdir)/'`magick/quantum-import.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.lo: magick/random.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.lo `test -f 'magick/random.c' || echo '$(srcdir)/'`magick/random.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/random.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.lo `test -f 'magick/random.c' || echo '$(srcdir)/'`magick/random.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.lo: magick/registry.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.lo `test -f 'magick/registry.c' || echo '$(srcdir)/'`magick/registry.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/registry.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.lo `test -f 'magick/registry.c' || echo '$(srcdir)/'`magick/registry.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.lo: magick/resample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.lo `test -f 'magick/resample.c' || echo '$(srcdir)/'`magick/resample.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/resample.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.lo `test -f 'magick/resample.c' || echo '$(srcdir)/'`magick/resample.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.lo: magick/resize.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.lo `test -f 'magick/resize.c' || echo '$(srcdir)/'`magick/resize.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/resize.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.lo `test -f 'magick/resize.c' || echo '$(srcdir)/'`magick/resize.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.lo: magick/resource.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.lo `test -f 'magick/resource.c' || echo '$(srcdir)/'`magick/resource.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/resource.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.lo `test -f 'magick/resource.c' || echo '$(srcdir)/'`magick/resource.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.lo: magick/segment.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.lo `test -f 'magick/segment.c' || echo '$(srcdir)/'`magick/segment.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/segment.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.lo `test -f 'magick/segment.c' || echo '$(srcdir)/'`magick/segment.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.lo: magick/semaphore.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.lo `test -f 'magick/semaphore.c' || echo '$(srcdir)/'`magick/semaphore.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/semaphore.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.lo `test -f 'magick/semaphore.c' || echo '$(srcdir)/'`magick/semaphore.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.lo: magick/shear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.lo `test -f 'magick/shear.c' || echo '$(srcdir)/'`magick/shear.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/shear.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.lo `test -f 'magick/shear.c' || echo '$(srcdir)/'`magick/shear.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.lo: magick/signature.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.lo `test -f 'magick/signature.c' || echo '$(srcdir)/'`magick/signature.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/signature.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.lo `test -f 'magick/signature.c' || echo '$(srcdir)/'`magick/signature.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.lo: magick/splay-tree.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.lo `test -f 'magick/splay-tree.c' || echo '$(srcdir)/'`magick/splay-tree.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/splay-tree.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.lo `test -f 'magick/splay-tree.c' || echo '$(srcdir)/'`magick/splay-tree.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.lo: magick/static.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.lo `test -f 'magick/static.c' || echo '$(srcdir)/'`magick/static.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/static.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.lo `test -f 'magick/static.c' || echo '$(srcdir)/'`magick/static.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.lo: magick/statistic.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.lo `test -f 'magick/statistic.c' || echo '$(srcdir)/'`magick/statistic.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/statistic.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.lo `test -f 'magick/statistic.c' || echo '$(srcdir)/'`magick/statistic.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo: magick/stream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo `test -f 'magick/stream.c' || echo '$(srcdir)/'`magick/stream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/stream.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo `test -f 'magick/stream.c' || echo '$(srcdir)/'`magick/stream.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.lo: magick/string.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.lo `test -f 'magick/string.c' || echo '$(srcdir)/'`magick/string.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/string.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.lo `test -f 'magick/string.c' || echo '$(srcdir)/'`magick/string.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.lo: magick/thread.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.lo `test -f 'magick/thread.c' || echo '$(srcdir)/'`magick/thread.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/thread.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.lo `test -f 'magick/thread.c' || echo '$(srcdir)/'`magick/thread.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.lo: magick/timer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.lo `test -f 'magick/timer.c' || echo '$(srcdir)/'`magick/timer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/timer.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.lo `test -f 'magick/timer.c' || echo '$(srcdir)/'`magick/timer.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.lo: magick/token.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.lo `test -f 'magick/token.c' || echo '$(srcdir)/'`magick/token.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/token.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.lo `test -f 'magick/token.c' || echo '$(srcdir)/'`magick/token.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.lo: magick/transform.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.lo `test -f 'magick/transform.c' || echo '$(srcdir)/'`magick/transform.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/transform.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.lo `test -f 'magick/transform.c' || echo '$(srcdir)/'`magick/transform.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.lo: magick/threshold.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.lo `test -f 'magick/threshold.c' || echo '$(srcdir)/'`magick/threshold.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/threshold.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.lo `test -f 'magick/threshold.c' || echo '$(srcdir)/'`magick/threshold.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.lo: magick/type.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.lo `test -f 'magick/type.c' || echo '$(srcdir)/'`magick/type.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/type.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.lo `test -f 'magick/type.c' || echo '$(srcdir)/'`magick/type.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.lo: magick/utility.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.lo `test -f 'magick/utility.c' || echo '$(srcdir)/'`magick/utility.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/utility.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.lo `test -f 'magick/utility.c' || echo '$(srcdir)/'`magick/utility.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.lo: magick/version.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.lo `test -f 'magick/version.c' || echo '$(srcdir)/'`magick/version.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/version.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.lo `test -f 'magick/version.c' || echo '$(srcdir)/'`magick/version.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.lo: magick/vision.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.lo `test -f 'magick/vision.c' || echo '$(srcdir)/'`magick/vision.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/vision.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.lo `test -f 'magick/vision.c' || echo '$(srcdir)/'`magick/vision.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.lo: magick/visual-effects.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.lo `test -f 'magick/visual-effects.c' || echo '$(srcdir)/'`magick/visual-effects.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/visual-effects.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.lo `test -f 'magick/visual-effects.c' || echo '$(srcdir)/'`magick/visual-effects.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.lo: magick/widget.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.lo `test -f 'magick/widget.c' || echo '$(srcdir)/'`magick/widget.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/widget.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.lo `test -f 'magick/widget.c' || echo '$(srcdir)/'`magick/widget.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.lo: magick/xml-tree.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.lo `test -f 'magick/xml-tree.c' || echo '$(srcdir)/'`magick/xml-tree.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/xml-tree.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.lo `test -f 'magick/xml-tree.c' || echo '$(srcdir)/'`magick/xml-tree.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.lo: magick/xwindow.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.lo `test -f 'magick/xwindow.c' || echo '$(srcdir)/'`magick/xwindow.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/xwindow.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.lo `test -f 'magick/xwindow.c' || echo '$(srcdir)/'`magick/xwindow.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.lo: magick/nt-feature.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.lo `test -f 'magick/nt-feature.c' || echo '$(srcdir)/'`magick/nt-feature.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/nt-feature.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.lo `test -f 'magick/nt-feature.c' || echo '$(srcdir)/'`magick/nt-feature.c + +magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.lo: magick/nt-base.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.lo -MD -MP -MF magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.Tpo -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.lo `test -f 'magick/nt-base.c' || echo '$(srcdir)/'`magick/nt-base.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.Tpo magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='magick/nt-base.c' object='magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.lo `test -f 'magick/nt-base.c' || echo '$(srcdir)/'`magick/nt-base.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.lo: coders/aai.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.lo `test -f 'coders/aai.c' || echo '$(srcdir)/'`coders/aai.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/aai.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.lo `test -f 'coders/aai.c' || echo '$(srcdir)/'`coders/aai.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.lo: coders/art.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.lo `test -f 'coders/art.c' || echo '$(srcdir)/'`coders/art.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/art.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.lo `test -f 'coders/art.c' || echo '$(srcdir)/'`coders/art.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.lo: coders/avs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.lo `test -f 'coders/avs.c' || echo '$(srcdir)/'`coders/avs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/avs.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.lo `test -f 'coders/avs.c' || echo '$(srcdir)/'`coders/avs.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.lo: coders/bgr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.lo `test -f 'coders/bgr.c' || echo '$(srcdir)/'`coders/bgr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/bgr.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.lo `test -f 'coders/bgr.c' || echo '$(srcdir)/'`coders/bgr.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.lo: coders/bmp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.lo `test -f 'coders/bmp.c' || echo '$(srcdir)/'`coders/bmp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/bmp.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.lo `test -f 'coders/bmp.c' || echo '$(srcdir)/'`coders/bmp.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.lo: coders/braille.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.lo `test -f 'coders/braille.c' || echo '$(srcdir)/'`coders/braille.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/braille.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.lo `test -f 'coders/braille.c' || echo '$(srcdir)/'`coders/braille.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.lo: coders/cals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.lo `test -f 'coders/cals.c' || echo '$(srcdir)/'`coders/cals.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/cals.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.lo `test -f 'coders/cals.c' || echo '$(srcdir)/'`coders/cals.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.lo: coders/caption.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.lo `test -f 'coders/caption.c' || echo '$(srcdir)/'`coders/caption.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/caption.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.lo `test -f 'coders/caption.c' || echo '$(srcdir)/'`coders/caption.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.lo: coders/cin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.lo `test -f 'coders/cin.c' || echo '$(srcdir)/'`coders/cin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/cin.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.lo `test -f 'coders/cin.c' || echo '$(srcdir)/'`coders/cin.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.lo: coders/cip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.lo `test -f 'coders/cip.c' || echo '$(srcdir)/'`coders/cip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/cip.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.lo `test -f 'coders/cip.c' || echo '$(srcdir)/'`coders/cip.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.lo: coders/clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.lo `test -f 'coders/clip.c' || echo '$(srcdir)/'`coders/clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/clip.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.lo `test -f 'coders/clip.c' || echo '$(srcdir)/'`coders/clip.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.lo: coders/cmyk.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.lo `test -f 'coders/cmyk.c' || echo '$(srcdir)/'`coders/cmyk.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/cmyk.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.lo `test -f 'coders/cmyk.c' || echo '$(srcdir)/'`coders/cmyk.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.lo: coders/cut.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.lo `test -f 'coders/cut.c' || echo '$(srcdir)/'`coders/cut.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/cut.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.lo `test -f 'coders/cut.c' || echo '$(srcdir)/'`coders/cut.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.lo: coders/dcm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.lo `test -f 'coders/dcm.c' || echo '$(srcdir)/'`coders/dcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dcm.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.lo `test -f 'coders/dcm.c' || echo '$(srcdir)/'`coders/dcm.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.lo: coders/dds.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.lo `test -f 'coders/dds.c' || echo '$(srcdir)/'`coders/dds.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dds.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.lo `test -f 'coders/dds.c' || echo '$(srcdir)/'`coders/dds.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.lo: coders/debug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.lo `test -f 'coders/debug.c' || echo '$(srcdir)/'`coders/debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/debug.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.lo `test -f 'coders/debug.c' || echo '$(srcdir)/'`coders/debug.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.lo: coders/dib.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.lo `test -f 'coders/dib.c' || echo '$(srcdir)/'`coders/dib.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dib.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.lo `test -f 'coders/dib.c' || echo '$(srcdir)/'`coders/dib.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.lo: coders/dng.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.lo `test -f 'coders/dng.c' || echo '$(srcdir)/'`coders/dng.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dng.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.lo `test -f 'coders/dng.c' || echo '$(srcdir)/'`coders/dng.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.lo: coders/dot.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.lo `test -f 'coders/dot.c' || echo '$(srcdir)/'`coders/dot.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dot.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.lo `test -f 'coders/dot.c' || echo '$(srcdir)/'`coders/dot.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.lo: coders/dpx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.lo `test -f 'coders/dpx.c' || echo '$(srcdir)/'`coders/dpx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dpx.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.lo `test -f 'coders/dpx.c' || echo '$(srcdir)/'`coders/dpx.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.lo: coders/fax.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.lo `test -f 'coders/fax.c' || echo '$(srcdir)/'`coders/fax.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/fax.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.lo `test -f 'coders/fax.c' || echo '$(srcdir)/'`coders/fax.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.lo: coders/fits.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.lo `test -f 'coders/fits.c' || echo '$(srcdir)/'`coders/fits.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/fits.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.lo `test -f 'coders/fits.c' || echo '$(srcdir)/'`coders/fits.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.lo: coders/gif.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.lo `test -f 'coders/gif.c' || echo '$(srcdir)/'`coders/gif.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/gif.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.lo `test -f 'coders/gif.c' || echo '$(srcdir)/'`coders/gif.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.lo: coders/gradient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.lo `test -f 'coders/gradient.c' || echo '$(srcdir)/'`coders/gradient.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/gradient.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.lo `test -f 'coders/gradient.c' || echo '$(srcdir)/'`coders/gradient.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.lo: coders/gray.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.lo `test -f 'coders/gray.c' || echo '$(srcdir)/'`coders/gray.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/gray.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.lo `test -f 'coders/gray.c' || echo '$(srcdir)/'`coders/gray.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.lo: coders/hald.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.lo `test -f 'coders/hald.c' || echo '$(srcdir)/'`coders/hald.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/hald.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.lo `test -f 'coders/hald.c' || echo '$(srcdir)/'`coders/hald.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.lo: coders/hdr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.lo `test -f 'coders/hdr.c' || echo '$(srcdir)/'`coders/hdr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/hdr.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.lo `test -f 'coders/hdr.c' || echo '$(srcdir)/'`coders/hdr.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo: coders/histogram.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo `test -f 'coders/histogram.c' || echo '$(srcdir)/'`coders/histogram.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/histogram.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.lo `test -f 'coders/histogram.c' || echo '$(srcdir)/'`coders/histogram.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.lo: coders/hrz.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.lo `test -f 'coders/hrz.c' || echo '$(srcdir)/'`coders/hrz.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/hrz.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.lo `test -f 'coders/hrz.c' || echo '$(srcdir)/'`coders/hrz.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.lo: coders/html.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.lo `test -f 'coders/html.c' || echo '$(srcdir)/'`coders/html.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/html.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.lo `test -f 'coders/html.c' || echo '$(srcdir)/'`coders/html.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.lo: coders/icon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.lo `test -f 'coders/icon.c' || echo '$(srcdir)/'`coders/icon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/icon.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.lo `test -f 'coders/icon.c' || echo '$(srcdir)/'`coders/icon.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.lo: coders/info.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.lo `test -f 'coders/info.c' || echo '$(srcdir)/'`coders/info.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/info.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.lo `test -f 'coders/info.c' || echo '$(srcdir)/'`coders/info.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.lo: coders/inline.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.lo `test -f 'coders/inline.c' || echo '$(srcdir)/'`coders/inline.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/inline.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.lo `test -f 'coders/inline.c' || echo '$(srcdir)/'`coders/inline.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.lo: coders/ipl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.lo `test -f 'coders/ipl.c' || echo '$(srcdir)/'`coders/ipl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ipl.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.lo `test -f 'coders/ipl.c' || echo '$(srcdir)/'`coders/ipl.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.lo: coders/jnx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.lo `test -f 'coders/jnx.c' || echo '$(srcdir)/'`coders/jnx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/jnx.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.lo `test -f 'coders/jnx.c' || echo '$(srcdir)/'`coders/jnx.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.lo: coders/json.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.lo `test -f 'coders/json.c' || echo '$(srcdir)/'`coders/json.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/json.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.lo `test -f 'coders/json.c' || echo '$(srcdir)/'`coders/json.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.lo: coders/label.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.lo `test -f 'coders/label.c' || echo '$(srcdir)/'`coders/label.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/label.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.lo `test -f 'coders/label.c' || echo '$(srcdir)/'`coders/label.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.lo: coders/mac.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.lo `test -f 'coders/mac.c' || echo '$(srcdir)/'`coders/mac.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mac.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.lo `test -f 'coders/mac.c' || echo '$(srcdir)/'`coders/mac.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo: coders/magick.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo `test -f 'coders/magick.c' || echo '$(srcdir)/'`coders/magick.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/magick.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.lo `test -f 'coders/magick.c' || echo '$(srcdir)/'`coders/magick.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.lo: coders/map.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.lo `test -f 'coders/map.c' || echo '$(srcdir)/'`coders/map.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/map.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.lo `test -f 'coders/map.c' || echo '$(srcdir)/'`coders/map.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.lo: coders/mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.lo `test -f 'coders/mask.c' || echo '$(srcdir)/'`coders/mask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mask.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.lo `test -f 'coders/mask.c' || echo '$(srcdir)/'`coders/mask.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.lo: coders/mat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.lo `test -f 'coders/mat.c' || echo '$(srcdir)/'`coders/mat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mat.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.lo `test -f 'coders/mat.c' || echo '$(srcdir)/'`coders/mat.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.lo: coders/matte.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.lo `test -f 'coders/matte.c' || echo '$(srcdir)/'`coders/matte.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/matte.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.lo `test -f 'coders/matte.c' || echo '$(srcdir)/'`coders/matte.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.lo: coders/meta.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.lo `test -f 'coders/meta.c' || echo '$(srcdir)/'`coders/meta.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/meta.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.lo `test -f 'coders/meta.c' || echo '$(srcdir)/'`coders/meta.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.lo: coders/miff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.lo `test -f 'coders/miff.c' || echo '$(srcdir)/'`coders/miff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/miff.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.lo `test -f 'coders/miff.c' || echo '$(srcdir)/'`coders/miff.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.lo: coders/mono.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.lo `test -f 'coders/mono.c' || echo '$(srcdir)/'`coders/mono.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mono.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.lo `test -f 'coders/mono.c' || echo '$(srcdir)/'`coders/mono.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.lo: coders/mpc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.lo `test -f 'coders/mpc.c' || echo '$(srcdir)/'`coders/mpc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mpc.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.lo `test -f 'coders/mpc.c' || echo '$(srcdir)/'`coders/mpc.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.lo: coders/mpr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.lo `test -f 'coders/mpr.c' || echo '$(srcdir)/'`coders/mpr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mpr.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.lo `test -f 'coders/mpr.c' || echo '$(srcdir)/'`coders/mpr.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.lo: coders/msl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.lo `test -f 'coders/msl.c' || echo '$(srcdir)/'`coders/msl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/msl.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.lo `test -f 'coders/msl.c' || echo '$(srcdir)/'`coders/msl.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.lo: coders/mtv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.lo `test -f 'coders/mtv.c' || echo '$(srcdir)/'`coders/mtv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mtv.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.lo `test -f 'coders/mtv.c' || echo '$(srcdir)/'`coders/mtv.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.lo: coders/mvg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.lo `test -f 'coders/mvg.c' || echo '$(srcdir)/'`coders/mvg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/mvg.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.lo `test -f 'coders/mvg.c' || echo '$(srcdir)/'`coders/mvg.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.lo: coders/null.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.lo `test -f 'coders/null.c' || echo '$(srcdir)/'`coders/null.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/null.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.lo `test -f 'coders/null.c' || echo '$(srcdir)/'`coders/null.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.lo: coders/otb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.lo `test -f 'coders/otb.c' || echo '$(srcdir)/'`coders/otb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/otb.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.lo `test -f 'coders/otb.c' || echo '$(srcdir)/'`coders/otb.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.lo: coders/palm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.lo `test -f 'coders/palm.c' || echo '$(srcdir)/'`coders/palm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/palm.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.lo `test -f 'coders/palm.c' || echo '$(srcdir)/'`coders/palm.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.lo: coders/pango.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.lo `test -f 'coders/pango.c' || echo '$(srcdir)/'`coders/pango.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pango.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.lo `test -f 'coders/pango.c' || echo '$(srcdir)/'`coders/pango.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.lo: coders/pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.lo `test -f 'coders/pattern.c' || echo '$(srcdir)/'`coders/pattern.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pattern.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.lo `test -f 'coders/pattern.c' || echo '$(srcdir)/'`coders/pattern.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.lo: coders/pcd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.lo `test -f 'coders/pcd.c' || echo '$(srcdir)/'`coders/pcd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pcd.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.lo `test -f 'coders/pcd.c' || echo '$(srcdir)/'`coders/pcd.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.lo: coders/pcl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.lo `test -f 'coders/pcl.c' || echo '$(srcdir)/'`coders/pcl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pcl.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.lo `test -f 'coders/pcl.c' || echo '$(srcdir)/'`coders/pcl.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.lo: coders/pcx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.lo `test -f 'coders/pcx.c' || echo '$(srcdir)/'`coders/pcx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pcx.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.lo `test -f 'coders/pcx.c' || echo '$(srcdir)/'`coders/pcx.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.lo: coders/pdb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.lo `test -f 'coders/pdb.c' || echo '$(srcdir)/'`coders/pdb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pdb.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.lo `test -f 'coders/pdb.c' || echo '$(srcdir)/'`coders/pdb.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.lo: coders/pdf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.lo `test -f 'coders/pdf.c' || echo '$(srcdir)/'`coders/pdf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pdf.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.lo `test -f 'coders/pdf.c' || echo '$(srcdir)/'`coders/pdf.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.lo: coders/pes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.lo `test -f 'coders/pes.c' || echo '$(srcdir)/'`coders/pes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pes.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.lo `test -f 'coders/pes.c' || echo '$(srcdir)/'`coders/pes.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.lo: coders/pgx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.lo `test -f 'coders/pgx.c' || echo '$(srcdir)/'`coders/pgx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pgx.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.lo `test -f 'coders/pgx.c' || echo '$(srcdir)/'`coders/pgx.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.lo: coders/pict.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.lo `test -f 'coders/pict.c' || echo '$(srcdir)/'`coders/pict.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pict.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.lo `test -f 'coders/pict.c' || echo '$(srcdir)/'`coders/pict.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.lo: coders/pix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.lo `test -f 'coders/pix.c' || echo '$(srcdir)/'`coders/pix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pix.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.lo `test -f 'coders/pix.c' || echo '$(srcdir)/'`coders/pix.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.lo: coders/plasma.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.lo `test -f 'coders/plasma.c' || echo '$(srcdir)/'`coders/plasma.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/plasma.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.lo `test -f 'coders/plasma.c' || echo '$(srcdir)/'`coders/plasma.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.lo: coders/pnm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.lo `test -f 'coders/pnm.c' || echo '$(srcdir)/'`coders/pnm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pnm.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.lo `test -f 'coders/pnm.c' || echo '$(srcdir)/'`coders/pnm.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.lo: coders/preview.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.lo `test -f 'coders/preview.c' || echo '$(srcdir)/'`coders/preview.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/preview.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.lo `test -f 'coders/preview.c' || echo '$(srcdir)/'`coders/preview.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.lo: coders/ps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.lo `test -f 'coders/ps.c' || echo '$(srcdir)/'`coders/ps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ps.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.lo `test -f 'coders/ps.c' || echo '$(srcdir)/'`coders/ps.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.lo: coders/ps2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.lo `test -f 'coders/ps2.c' || echo '$(srcdir)/'`coders/ps2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ps2.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.lo `test -f 'coders/ps2.c' || echo '$(srcdir)/'`coders/ps2.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.lo: coders/ps3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.lo `test -f 'coders/ps3.c' || echo '$(srcdir)/'`coders/ps3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ps3.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.lo `test -f 'coders/ps3.c' || echo '$(srcdir)/'`coders/ps3.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.lo: coders/psd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.lo `test -f 'coders/psd.c' || echo '$(srcdir)/'`coders/psd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/psd.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.lo `test -f 'coders/psd.c' || echo '$(srcdir)/'`coders/psd.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.lo: coders/pwp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.lo `test -f 'coders/pwp.c' || echo '$(srcdir)/'`coders/pwp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/pwp.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.lo `test -f 'coders/pwp.c' || echo '$(srcdir)/'`coders/pwp.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.lo: coders/raw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.lo `test -f 'coders/raw.c' || echo '$(srcdir)/'`coders/raw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/raw.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.lo `test -f 'coders/raw.c' || echo '$(srcdir)/'`coders/raw.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.lo: coders/rgb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.lo `test -f 'coders/rgb.c' || echo '$(srcdir)/'`coders/rgb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/rgb.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.lo `test -f 'coders/rgb.c' || echo '$(srcdir)/'`coders/rgb.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.lo: coders/rgf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.lo `test -f 'coders/rgf.c' || echo '$(srcdir)/'`coders/rgf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/rgf.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.lo `test -f 'coders/rgf.c' || echo '$(srcdir)/'`coders/rgf.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.lo: coders/rla.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.lo `test -f 'coders/rla.c' || echo '$(srcdir)/'`coders/rla.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/rla.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.lo `test -f 'coders/rla.c' || echo '$(srcdir)/'`coders/rla.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.lo: coders/rle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.lo `test -f 'coders/rle.c' || echo '$(srcdir)/'`coders/rle.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/rle.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.lo `test -f 'coders/rle.c' || echo '$(srcdir)/'`coders/rle.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.lo: coders/scr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.lo `test -f 'coders/scr.c' || echo '$(srcdir)/'`coders/scr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/scr.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.lo `test -f 'coders/scr.c' || echo '$(srcdir)/'`coders/scr.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.lo: coders/screenshot.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.lo `test -f 'coders/screenshot.c' || echo '$(srcdir)/'`coders/screenshot.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/screenshot.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.lo `test -f 'coders/screenshot.c' || echo '$(srcdir)/'`coders/screenshot.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.lo: coders/sct.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.lo `test -f 'coders/sct.c' || echo '$(srcdir)/'`coders/sct.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/sct.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.lo `test -f 'coders/sct.c' || echo '$(srcdir)/'`coders/sct.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.lo: coders/sfw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.lo `test -f 'coders/sfw.c' || echo '$(srcdir)/'`coders/sfw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/sfw.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.lo `test -f 'coders/sfw.c' || echo '$(srcdir)/'`coders/sfw.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.lo: coders/sgi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.lo `test -f 'coders/sgi.c' || echo '$(srcdir)/'`coders/sgi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/sgi.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.lo `test -f 'coders/sgi.c' || echo '$(srcdir)/'`coders/sgi.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.lo: coders/sixel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.lo `test -f 'coders/sixel.c' || echo '$(srcdir)/'`coders/sixel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/sixel.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.lo `test -f 'coders/sixel.c' || echo '$(srcdir)/'`coders/sixel.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.lo: coders/stegano.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.lo `test -f 'coders/stegano.c' || echo '$(srcdir)/'`coders/stegano.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/stegano.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.lo `test -f 'coders/stegano.c' || echo '$(srcdir)/'`coders/stegano.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.lo: coders/sun.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.lo `test -f 'coders/sun.c' || echo '$(srcdir)/'`coders/sun.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/sun.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.lo `test -f 'coders/sun.c' || echo '$(srcdir)/'`coders/sun.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.lo: coders/svg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.lo `test -f 'coders/svg.c' || echo '$(srcdir)/'`coders/svg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/svg.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.lo `test -f 'coders/svg.c' || echo '$(srcdir)/'`coders/svg.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.lo: coders/tga.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.lo `test -f 'coders/tga.c' || echo '$(srcdir)/'`coders/tga.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/tga.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.lo `test -f 'coders/tga.c' || echo '$(srcdir)/'`coders/tga.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.lo: coders/thumbnail.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.lo `test -f 'coders/thumbnail.c' || echo '$(srcdir)/'`coders/thumbnail.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/thumbnail.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.lo `test -f 'coders/thumbnail.c' || echo '$(srcdir)/'`coders/thumbnail.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.lo: coders/tile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.lo `test -f 'coders/tile.c' || echo '$(srcdir)/'`coders/tile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/tile.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.lo `test -f 'coders/tile.c' || echo '$(srcdir)/'`coders/tile.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.lo: coders/tim.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.lo `test -f 'coders/tim.c' || echo '$(srcdir)/'`coders/tim.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/tim.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.lo `test -f 'coders/tim.c' || echo '$(srcdir)/'`coders/tim.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.lo: coders/ttf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.lo `test -f 'coders/ttf.c' || echo '$(srcdir)/'`coders/ttf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ttf.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.lo `test -f 'coders/ttf.c' || echo '$(srcdir)/'`coders/ttf.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.lo: coders/txt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.lo `test -f 'coders/txt.c' || echo '$(srcdir)/'`coders/txt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/txt.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.lo `test -f 'coders/txt.c' || echo '$(srcdir)/'`coders/txt.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.lo: coders/uil.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.lo `test -f 'coders/uil.c' || echo '$(srcdir)/'`coders/uil.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/uil.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.lo `test -f 'coders/uil.c' || echo '$(srcdir)/'`coders/uil.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.lo: coders/url.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.lo `test -f 'coders/url.c' || echo '$(srcdir)/'`coders/url.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/url.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.lo `test -f 'coders/url.c' || echo '$(srcdir)/'`coders/url.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.lo: coders/uyvy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.lo `test -f 'coders/uyvy.c' || echo '$(srcdir)/'`coders/uyvy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/uyvy.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.lo `test -f 'coders/uyvy.c' || echo '$(srcdir)/'`coders/uyvy.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.lo: coders/vicar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.lo `test -f 'coders/vicar.c' || echo '$(srcdir)/'`coders/vicar.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/vicar.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.lo `test -f 'coders/vicar.c' || echo '$(srcdir)/'`coders/vicar.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.lo: coders/vid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.lo `test -f 'coders/vid.c' || echo '$(srcdir)/'`coders/vid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/vid.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.lo `test -f 'coders/vid.c' || echo '$(srcdir)/'`coders/vid.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.lo: coders/video.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.lo `test -f 'coders/video.c' || echo '$(srcdir)/'`coders/video.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/video.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.lo `test -f 'coders/video.c' || echo '$(srcdir)/'`coders/video.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.lo: coders/viff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.lo `test -f 'coders/viff.c' || echo '$(srcdir)/'`coders/viff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/viff.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.lo `test -f 'coders/viff.c' || echo '$(srcdir)/'`coders/viff.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.lo: coders/vips.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.lo `test -f 'coders/vips.c' || echo '$(srcdir)/'`coders/vips.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/vips.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.lo `test -f 'coders/vips.c' || echo '$(srcdir)/'`coders/vips.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.lo: coders/wbmp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.lo `test -f 'coders/wbmp.c' || echo '$(srcdir)/'`coders/wbmp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/wbmp.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.lo `test -f 'coders/wbmp.c' || echo '$(srcdir)/'`coders/wbmp.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.lo: coders/wpg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.lo `test -f 'coders/wpg.c' || echo '$(srcdir)/'`coders/wpg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/wpg.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.lo `test -f 'coders/wpg.c' || echo '$(srcdir)/'`coders/wpg.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.lo: coders/xbm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.lo `test -f 'coders/xbm.c' || echo '$(srcdir)/'`coders/xbm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xbm.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.lo `test -f 'coders/xbm.c' || echo '$(srcdir)/'`coders/xbm.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.lo: coders/xc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.lo `test -f 'coders/xc.c' || echo '$(srcdir)/'`coders/xc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xc.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.lo `test -f 'coders/xc.c' || echo '$(srcdir)/'`coders/xc.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.lo: coders/xcf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.lo `test -f 'coders/xcf.c' || echo '$(srcdir)/'`coders/xcf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xcf.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.lo `test -f 'coders/xcf.c' || echo '$(srcdir)/'`coders/xcf.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.lo: coders/xpm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.lo `test -f 'coders/xpm.c' || echo '$(srcdir)/'`coders/xpm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xpm.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.lo `test -f 'coders/xpm.c' || echo '$(srcdir)/'`coders/xpm.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.lo: coders/xps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.lo `test -f 'coders/xps.c' || echo '$(srcdir)/'`coders/xps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xps.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.lo `test -f 'coders/xps.c' || echo '$(srcdir)/'`coders/xps.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.lo: coders/ycbcr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.lo `test -f 'coders/ycbcr.c' || echo '$(srcdir)/'`coders/ycbcr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ycbcr.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.lo `test -f 'coders/ycbcr.c' || echo '$(srcdir)/'`coders/ycbcr.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.lo: coders/yuv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.lo `test -f 'coders/yuv.c' || echo '$(srcdir)/'`coders/yuv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/yuv.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.lo `test -f 'coders/yuv.c' || echo '$(srcdir)/'`coders/yuv.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.lo: coders/dps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.lo `test -f 'coders/dps.c' || echo '$(srcdir)/'`coders/dps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/dps.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.lo `test -f 'coders/dps.c' || echo '$(srcdir)/'`coders/dps.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.lo: coders/djvu.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.lo `test -f 'coders/djvu.c' || echo '$(srcdir)/'`coders/djvu.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/djvu.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.lo `test -f 'coders/djvu.c' || echo '$(srcdir)/'`coders/djvu.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.lo: coders/exr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.lo `test -f 'coders/exr.c' || echo '$(srcdir)/'`coders/exr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/exr.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.lo `test -f 'coders/exr.c' || echo '$(srcdir)/'`coders/exr.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.lo: coders/flif.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.lo `test -f 'coders/flif.c' || echo '$(srcdir)/'`coders/flif.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/flif.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.lo `test -f 'coders/flif.c' || echo '$(srcdir)/'`coders/flif.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.lo: coders/fpx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.lo `test -f 'coders/fpx.c' || echo '$(srcdir)/'`coders/fpx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/fpx.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.lo `test -f 'coders/fpx.c' || echo '$(srcdir)/'`coders/fpx.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.lo: coders/clipboard.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.lo `test -f 'coders/clipboard.c' || echo '$(srcdir)/'`coders/clipboard.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/clipboard.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.lo `test -f 'coders/clipboard.c' || echo '$(srcdir)/'`coders/clipboard.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.lo: coders/emf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.lo `test -f 'coders/emf.c' || echo '$(srcdir)/'`coders/emf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/emf.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.lo `test -f 'coders/emf.c' || echo '$(srcdir)/'`coders/emf.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.lo: coders/heic.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.lo `test -f 'coders/heic.c' || echo '$(srcdir)/'`coders/heic.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/heic.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.lo `test -f 'coders/heic.c' || echo '$(srcdir)/'`coders/heic.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.lo: coders/jbig.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.lo `test -f 'coders/jbig.c' || echo '$(srcdir)/'`coders/jbig.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/jbig.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.lo `test -f 'coders/jbig.c' || echo '$(srcdir)/'`coders/jbig.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.lo: coders/jpeg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.lo `test -f 'coders/jpeg.c' || echo '$(srcdir)/'`coders/jpeg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/jpeg.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.lo `test -f 'coders/jpeg.c' || echo '$(srcdir)/'`coders/jpeg.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.lo: coders/jp2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.lo `test -f 'coders/jp2.c' || echo '$(srcdir)/'`coders/jp2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/jp2.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.lo `test -f 'coders/jp2.c' || echo '$(srcdir)/'`coders/jp2.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.lo: coders/png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.lo `test -f 'coders/png.c' || echo '$(srcdir)/'`coders/png.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/png.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.lo `test -f 'coders/png.c' || echo '$(srcdir)/'`coders/png.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.lo: coders/ept.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.lo `test -f 'coders/ept.c' || echo '$(srcdir)/'`coders/ept.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/ept.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.lo `test -f 'coders/ept.c' || echo '$(srcdir)/'`coders/ept.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.lo: coders/tiff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.lo `test -f 'coders/tiff.c' || echo '$(srcdir)/'`coders/tiff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/tiff.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.lo `test -f 'coders/tiff.c' || echo '$(srcdir)/'`coders/tiff.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.lo: coders/webp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.lo `test -f 'coders/webp.c' || echo '$(srcdir)/'`coders/webp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/webp.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.lo `test -f 'coders/webp.c' || echo '$(srcdir)/'`coders/webp.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.lo: coders/wmf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.lo `test -f 'coders/wmf.c' || echo '$(srcdir)/'`coders/wmf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/wmf.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.lo `test -f 'coders/wmf.c' || echo '$(srcdir)/'`coders/wmf.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.lo: coders/x.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.lo `test -f 'coders/x.c' || echo '$(srcdir)/'`coders/x.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/x.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.lo `test -f 'coders/x.c' || echo '$(srcdir)/'`coders/x.c + +coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.lo: coders/xwd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.lo -MD -MP -MF coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.Tpo -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.lo `test -f 'coders/xwd.c' || echo '$(srcdir)/'`coders/xwd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.Tpo coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coders/xwd.c' object='coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coders/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.lo `test -f 'coders/xwd.c' || echo '$(srcdir)/'`coders/xwd.c + +filters/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.lo: filters/analyze.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT filters/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.lo -MD -MP -MF filters/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.Tpo -c -o filters/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.lo `test -f 'filters/analyze.c' || echo '$(srcdir)/'`filters/analyze.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.Tpo filters/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/analyze.c' object='filters/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o filters/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.lo `test -f 'filters/analyze.c' || echo '$(srcdir)/'`filters/analyze.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo: wand/animate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo `test -f 'wand/animate.c' || echo '$(srcdir)/'`wand/animate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/animate.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.lo `test -f 'wand/animate.c' || echo '$(srcdir)/'`wand/animate.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo: wand/compare.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo `test -f 'wand/compare.c' || echo '$(srcdir)/'`wand/compare.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/compare.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.lo `test -f 'wand/compare.c' || echo '$(srcdir)/'`wand/compare.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo: wand/composite.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo `test -f 'wand/composite.c' || echo '$(srcdir)/'`wand/composite.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/composite.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.lo `test -f 'wand/composite.c' || echo '$(srcdir)/'`wand/composite.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.lo: wand/conjure.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.lo `test -f 'wand/conjure.c' || echo '$(srcdir)/'`wand/conjure.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/conjure.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.lo `test -f 'wand/conjure.c' || echo '$(srcdir)/'`wand/conjure.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.lo: wand/convert.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.lo `test -f 'wand/convert.c' || echo '$(srcdir)/'`wand/convert.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/convert.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.lo `test -f 'wand/convert.c' || echo '$(srcdir)/'`wand/convert.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo: wand/deprecate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo `test -f 'wand/deprecate.c' || echo '$(srcdir)/'`wand/deprecate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/deprecate.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.lo `test -f 'wand/deprecate.c' || echo '$(srcdir)/'`wand/deprecate.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo: wand/display.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo `test -f 'wand/display.c' || echo '$(srcdir)/'`wand/display.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/display.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.lo `test -f 'wand/display.c' || echo '$(srcdir)/'`wand/display.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.lo: wand/drawing-wand.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.lo `test -f 'wand/drawing-wand.c' || echo '$(srcdir)/'`wand/drawing-wand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/drawing-wand.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.lo `test -f 'wand/drawing-wand.c' || echo '$(srcdir)/'`wand/drawing-wand.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo: wand/identify.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo `test -f 'wand/identify.c' || echo '$(srcdir)/'`wand/identify.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/identify.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.lo `test -f 'wand/identify.c' || echo '$(srcdir)/'`wand/identify.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.lo: wand/import.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.lo `test -f 'wand/import.c' || echo '$(srcdir)/'`wand/import.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/import.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.lo `test -f 'wand/import.c' || echo '$(srcdir)/'`wand/import.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.lo: wand/magick-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.lo `test -f 'wand/magick-image.c' || echo '$(srcdir)/'`wand/magick-image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/magick-image.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.lo `test -f 'wand/magick-image.c' || echo '$(srcdir)/'`wand/magick-image.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.lo: wand/magick-property.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.lo `test -f 'wand/magick-property.c' || echo '$(srcdir)/'`wand/magick-property.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/magick-property.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.lo `test -f 'wand/magick-property.c' || echo '$(srcdir)/'`wand/magick-property.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.lo: wand/magick-wand.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.lo `test -f 'wand/magick-wand.c' || echo '$(srcdir)/'`wand/magick-wand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/magick-wand.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.lo `test -f 'wand/magick-wand.c' || echo '$(srcdir)/'`wand/magick-wand.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.lo: wand/mogrify.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.lo `test -f 'wand/mogrify.c' || echo '$(srcdir)/'`wand/mogrify.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/mogrify.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.lo `test -f 'wand/mogrify.c' || echo '$(srcdir)/'`wand/mogrify.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo: wand/montage.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo `test -f 'wand/montage.c' || echo '$(srcdir)/'`wand/montage.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/montage.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.lo `test -f 'wand/montage.c' || echo '$(srcdir)/'`wand/montage.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.lo: wand/pixel-iterator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.lo `test -f 'wand/pixel-iterator.c' || echo '$(srcdir)/'`wand/pixel-iterator.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/pixel-iterator.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.lo `test -f 'wand/pixel-iterator.c' || echo '$(srcdir)/'`wand/pixel-iterator.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.lo: wand/pixel-wand.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.lo `test -f 'wand/pixel-wand.c' || echo '$(srcdir)/'`wand/pixel-wand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/pixel-wand.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.lo `test -f 'wand/pixel-wand.c' || echo '$(srcdir)/'`wand/pixel-wand.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo: wand/stream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo `test -f 'wand/stream.c' || echo '$(srcdir)/'`wand/stream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/stream.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.lo `test -f 'wand/stream.c' || echo '$(srcdir)/'`wand/stream.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.lo: wand/wand.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.lo `test -f 'wand/wand.c' || echo '$(srcdir)/'`wand/wand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/wand.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.lo `test -f 'wand/wand.c' || echo '$(srcdir)/'`wand/wand.c + +wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.lo: wand/wand-view.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.lo -MD -MP -MF wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.Tpo -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.lo `test -f 'wand/wand-view.c' || echo '$(srcdir)/'`wand/wand-view.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.Tpo wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wand/wand-view.c' object='wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wand/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.lo `test -f 'wand/wand-view.c' || echo '$(srcdir)/'`wand/wand-view.c + +tests/drawtest-drawtest.o: tests/drawtest.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_drawtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tests/drawtest-drawtest.o -MD -MP -MF tests/$(DEPDIR)/drawtest-drawtest.Tpo -c -o tests/drawtest-drawtest.o `test -f 'tests/drawtest.c' || echo '$(srcdir)/'`tests/drawtest.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/drawtest-drawtest.Tpo tests/$(DEPDIR)/drawtest-drawtest.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/drawtest.c' object='tests/drawtest-drawtest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_drawtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tests/drawtest-drawtest.o `test -f 'tests/drawtest.c' || echo '$(srcdir)/'`tests/drawtest.c + +tests/drawtest-drawtest.obj: tests/drawtest.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_drawtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tests/drawtest-drawtest.obj -MD -MP -MF tests/$(DEPDIR)/drawtest-drawtest.Tpo -c -o tests/drawtest-drawtest.obj `if test -f 'tests/drawtest.c'; then $(CYGPATH_W) 'tests/drawtest.c'; else $(CYGPATH_W) '$(srcdir)/tests/drawtest.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/drawtest-drawtest.Tpo tests/$(DEPDIR)/drawtest-drawtest.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/drawtest.c' object='tests/drawtest-drawtest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_drawtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tests/drawtest-drawtest.obj `if test -f 'tests/drawtest.c'; then $(CYGPATH_W) 'tests/drawtest.c'; else $(CYGPATH_W) '$(srcdir)/tests/drawtest.c'; fi` + +tests/validate-validate.o: tests/validate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_validate_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tests/validate-validate.o -MD -MP -MF tests/$(DEPDIR)/validate-validate.Tpo -c -o tests/validate-validate.o `test -f 'tests/validate.c' || echo '$(srcdir)/'`tests/validate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/validate-validate.Tpo tests/$(DEPDIR)/validate-validate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/validate.c' object='tests/validate-validate.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_validate_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tests/validate-validate.o `test -f 'tests/validate.c' || echo '$(srcdir)/'`tests/validate.c + +tests/validate-validate.obj: tests/validate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_validate_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tests/validate-validate.obj -MD -MP -MF tests/$(DEPDIR)/validate-validate.Tpo -c -o tests/validate-validate.obj `if test -f 'tests/validate.c'; then $(CYGPATH_W) 'tests/validate.c'; else $(CYGPATH_W) '$(srcdir)/tests/validate.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/validate-validate.Tpo tests/$(DEPDIR)/validate-validate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/validate.c' object='tests/validate-validate.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_validate_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tests/validate-validate.obj `if test -f 'tests/validate.c'; then $(CYGPATH_W) 'tests/validate.c'; else $(CYGPATH_W) '$(srcdir)/tests/validate.c'; fi` + +tests/wandtest-wandtest.o: tests/wandtest.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_wandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tests/wandtest-wandtest.o -MD -MP -MF tests/$(DEPDIR)/wandtest-wandtest.Tpo -c -o tests/wandtest-wandtest.o `test -f 'tests/wandtest.c' || echo '$(srcdir)/'`tests/wandtest.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/wandtest-wandtest.Tpo tests/$(DEPDIR)/wandtest-wandtest.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/wandtest.c' object='tests/wandtest-wandtest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_wandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tests/wandtest-wandtest.o `test -f 'tests/wandtest.c' || echo '$(srcdir)/'`tests/wandtest.c + +tests/wandtest-wandtest.obj: tests/wandtest.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_wandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tests/wandtest-wandtest.obj -MD -MP -MF tests/$(DEPDIR)/wandtest-wandtest.Tpo -c -o tests/wandtest-wandtest.obj `if test -f 'tests/wandtest.c'; then $(CYGPATH_W) 'tests/wandtest.c'; else $(CYGPATH_W) '$(srcdir)/tests/wandtest.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/wandtest-wandtest.Tpo tests/$(DEPDIR)/wandtest-wandtest.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/wandtest.c' object='tests/wandtest-wandtest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_wandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tests/wandtest-wandtest.obj `if test -f 'tests/wandtest.c'; then $(CYGPATH_W) 'tests/wandtest.c'; else $(CYGPATH_W) '$(srcdir)/tests/wandtest.c'; fi` + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.lo: Magick++/lib/Blob.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.lo `test -f 'Magick++/lib/Blob.cpp' || echo '$(srcdir)/'`Magick++/lib/Blob.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Blob.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.lo `test -f 'Magick++/lib/Blob.cpp' || echo '$(srcdir)/'`Magick++/lib/Blob.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.lo: Magick++/lib/BlobRef.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.lo `test -f 'Magick++/lib/BlobRef.cpp' || echo '$(srcdir)/'`Magick++/lib/BlobRef.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/BlobRef.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.lo `test -f 'Magick++/lib/BlobRef.cpp' || echo '$(srcdir)/'`Magick++/lib/BlobRef.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.lo: Magick++/lib/ChannelMoments.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.lo `test -f 'Magick++/lib/ChannelMoments.cpp' || echo '$(srcdir)/'`Magick++/lib/ChannelMoments.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/ChannelMoments.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.lo `test -f 'Magick++/lib/ChannelMoments.cpp' || echo '$(srcdir)/'`Magick++/lib/ChannelMoments.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.lo: Magick++/lib/CoderInfo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.lo `test -f 'Magick++/lib/CoderInfo.cpp' || echo '$(srcdir)/'`Magick++/lib/CoderInfo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/CoderInfo.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.lo `test -f 'Magick++/lib/CoderInfo.cpp' || echo '$(srcdir)/'`Magick++/lib/CoderInfo.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.lo: Magick++/lib/Color.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.lo `test -f 'Magick++/lib/Color.cpp' || echo '$(srcdir)/'`Magick++/lib/Color.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Color.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.lo `test -f 'Magick++/lib/Color.cpp' || echo '$(srcdir)/'`Magick++/lib/Color.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.lo: Magick++/lib/Drawable.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.lo `test -f 'Magick++/lib/Drawable.cpp' || echo '$(srcdir)/'`Magick++/lib/Drawable.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Drawable.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.lo `test -f 'Magick++/lib/Drawable.cpp' || echo '$(srcdir)/'`Magick++/lib/Drawable.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.lo: Magick++/lib/Exception.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.lo `test -f 'Magick++/lib/Exception.cpp' || echo '$(srcdir)/'`Magick++/lib/Exception.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Exception.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.lo `test -f 'Magick++/lib/Exception.cpp' || echo '$(srcdir)/'`Magick++/lib/Exception.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.lo: Magick++/lib/Functions.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.lo `test -f 'Magick++/lib/Functions.cpp' || echo '$(srcdir)/'`Magick++/lib/Functions.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Functions.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.lo `test -f 'Magick++/lib/Functions.cpp' || echo '$(srcdir)/'`Magick++/lib/Functions.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.lo: Magick++/lib/Geometry.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.lo `test -f 'Magick++/lib/Geometry.cpp' || echo '$(srcdir)/'`Magick++/lib/Geometry.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Geometry.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.lo `test -f 'Magick++/lib/Geometry.cpp' || echo '$(srcdir)/'`Magick++/lib/Geometry.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.lo: Magick++/lib/Image.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.lo `test -f 'Magick++/lib/Image.cpp' || echo '$(srcdir)/'`Magick++/lib/Image.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Image.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.lo `test -f 'Magick++/lib/Image.cpp' || echo '$(srcdir)/'`Magick++/lib/Image.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.lo: Magick++/lib/ImageRef.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.lo `test -f 'Magick++/lib/ImageRef.cpp' || echo '$(srcdir)/'`Magick++/lib/ImageRef.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/ImageRef.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.lo `test -f 'Magick++/lib/ImageRef.cpp' || echo '$(srcdir)/'`Magick++/lib/ImageRef.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.lo: Magick++/lib/Montage.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.lo `test -f 'Magick++/lib/Montage.cpp' || echo '$(srcdir)/'`Magick++/lib/Montage.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Montage.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.lo `test -f 'Magick++/lib/Montage.cpp' || echo '$(srcdir)/'`Magick++/lib/Montage.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.lo: Magick++/lib/Options.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.lo `test -f 'Magick++/lib/Options.cpp' || echo '$(srcdir)/'`Magick++/lib/Options.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Options.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.lo `test -f 'Magick++/lib/Options.cpp' || echo '$(srcdir)/'`Magick++/lib/Options.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.lo: Magick++/lib/Pixels.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.lo `test -f 'Magick++/lib/Pixels.cpp' || echo '$(srcdir)/'`Magick++/lib/Pixels.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Pixels.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.lo `test -f 'Magick++/lib/Pixels.cpp' || echo '$(srcdir)/'`Magick++/lib/Pixels.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.lo: Magick++/lib/ResourceLimits.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.lo `test -f 'Magick++/lib/ResourceLimits.cpp' || echo '$(srcdir)/'`Magick++/lib/ResourceLimits.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/ResourceLimits.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.lo `test -f 'Magick++/lib/ResourceLimits.cpp' || echo '$(srcdir)/'`Magick++/lib/ResourceLimits.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.lo: Magick++/lib/STL.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.lo `test -f 'Magick++/lib/STL.cpp' || echo '$(srcdir)/'`Magick++/lib/STL.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/STL.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.lo `test -f 'Magick++/lib/STL.cpp' || echo '$(srcdir)/'`Magick++/lib/STL.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.lo: Magick++/lib/Thread.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.lo `test -f 'Magick++/lib/Thread.cpp' || echo '$(srcdir)/'`Magick++/lib/Thread.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/Thread.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.lo `test -f 'Magick++/lib/Thread.cpp' || echo '$(srcdir)/'`Magick++/lib/Thread.cpp + +Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.lo: Magick++/lib/TypeMetric.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.lo -MD -MP -MF Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.Tpo -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.lo `test -f 'Magick++/lib/TypeMetric.cpp' || echo '$(srcdir)/'`Magick++/lib/TypeMetric.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.Tpo Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/lib/TypeMetric.cpp' object='Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___lib_libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/lib/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.lo `test -f 'Magick++/lib/TypeMetric.cpp' || echo '$(srcdir)/'`Magick++/lib/TypeMetric.cpp + +Magick++/demo/analyze-analyze.o: Magick++/demo/analyze.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_analyze_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/analyze-analyze.o -MD -MP -MF Magick++/demo/$(DEPDIR)/analyze-analyze.Tpo -c -o Magick++/demo/analyze-analyze.o `test -f 'Magick++/demo/analyze.cpp' || echo '$(srcdir)/'`Magick++/demo/analyze.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/analyze-analyze.Tpo Magick++/demo/$(DEPDIR)/analyze-analyze.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/analyze.cpp' object='Magick++/demo/analyze-analyze.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_analyze_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/analyze-analyze.o `test -f 'Magick++/demo/analyze.cpp' || echo '$(srcdir)/'`Magick++/demo/analyze.cpp + +Magick++/demo/analyze-analyze.obj: Magick++/demo/analyze.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_analyze_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/analyze-analyze.obj -MD -MP -MF Magick++/demo/$(DEPDIR)/analyze-analyze.Tpo -c -o Magick++/demo/analyze-analyze.obj `if test -f 'Magick++/demo/analyze.cpp'; then $(CYGPATH_W) 'Magick++/demo/analyze.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/analyze.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/analyze-analyze.Tpo Magick++/demo/$(DEPDIR)/analyze-analyze.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/analyze.cpp' object='Magick++/demo/analyze-analyze.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_analyze_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/analyze-analyze.obj `if test -f 'Magick++/demo/analyze.cpp'; then $(CYGPATH_W) 'Magick++/demo/analyze.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/analyze.cpp'; fi` + +Magick++/demo/button-button.o: Magick++/demo/button.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_button_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/button-button.o -MD -MP -MF Magick++/demo/$(DEPDIR)/button-button.Tpo -c -o Magick++/demo/button-button.o `test -f 'Magick++/demo/button.cpp' || echo '$(srcdir)/'`Magick++/demo/button.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/button-button.Tpo Magick++/demo/$(DEPDIR)/button-button.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/button.cpp' object='Magick++/demo/button-button.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_button_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/button-button.o `test -f 'Magick++/demo/button.cpp' || echo '$(srcdir)/'`Magick++/demo/button.cpp + +Magick++/demo/button-button.obj: Magick++/demo/button.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_button_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/button-button.obj -MD -MP -MF Magick++/demo/$(DEPDIR)/button-button.Tpo -c -o Magick++/demo/button-button.obj `if test -f 'Magick++/demo/button.cpp'; then $(CYGPATH_W) 'Magick++/demo/button.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/button.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/button-button.Tpo Magick++/demo/$(DEPDIR)/button-button.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/button.cpp' object='Magick++/demo/button-button.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_button_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/button-button.obj `if test -f 'Magick++/demo/button.cpp'; then $(CYGPATH_W) 'Magick++/demo/button.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/button.cpp'; fi` + +Magick++/demo/demo-demo.o: Magick++/demo/demo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_demo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/demo-demo.o -MD -MP -MF Magick++/demo/$(DEPDIR)/demo-demo.Tpo -c -o Magick++/demo/demo-demo.o `test -f 'Magick++/demo/demo.cpp' || echo '$(srcdir)/'`Magick++/demo/demo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/demo-demo.Tpo Magick++/demo/$(DEPDIR)/demo-demo.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/demo.cpp' object='Magick++/demo/demo-demo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_demo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/demo-demo.o `test -f 'Magick++/demo/demo.cpp' || echo '$(srcdir)/'`Magick++/demo/demo.cpp + +Magick++/demo/demo-demo.obj: Magick++/demo/demo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_demo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/demo-demo.obj -MD -MP -MF Magick++/demo/$(DEPDIR)/demo-demo.Tpo -c -o Magick++/demo/demo-demo.obj `if test -f 'Magick++/demo/demo.cpp'; then $(CYGPATH_W) 'Magick++/demo/demo.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/demo.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/demo-demo.Tpo Magick++/demo/$(DEPDIR)/demo-demo.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/demo.cpp' object='Magick++/demo/demo-demo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_demo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/demo-demo.obj `if test -f 'Magick++/demo/demo.cpp'; then $(CYGPATH_W) 'Magick++/demo/demo.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/demo.cpp'; fi` + +Magick++/demo/detrans-detrans.o: Magick++/demo/detrans.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_detrans_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/detrans-detrans.o -MD -MP -MF Magick++/demo/$(DEPDIR)/detrans-detrans.Tpo -c -o Magick++/demo/detrans-detrans.o `test -f 'Magick++/demo/detrans.cpp' || echo '$(srcdir)/'`Magick++/demo/detrans.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/detrans-detrans.Tpo Magick++/demo/$(DEPDIR)/detrans-detrans.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/detrans.cpp' object='Magick++/demo/detrans-detrans.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_detrans_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/detrans-detrans.o `test -f 'Magick++/demo/detrans.cpp' || echo '$(srcdir)/'`Magick++/demo/detrans.cpp + +Magick++/demo/detrans-detrans.obj: Magick++/demo/detrans.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_detrans_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/detrans-detrans.obj -MD -MP -MF Magick++/demo/$(DEPDIR)/detrans-detrans.Tpo -c -o Magick++/demo/detrans-detrans.obj `if test -f 'Magick++/demo/detrans.cpp'; then $(CYGPATH_W) 'Magick++/demo/detrans.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/detrans.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/detrans-detrans.Tpo Magick++/demo/$(DEPDIR)/detrans-detrans.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/detrans.cpp' object='Magick++/demo/detrans-detrans.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_detrans_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/detrans-detrans.obj `if test -f 'Magick++/demo/detrans.cpp'; then $(CYGPATH_W) 'Magick++/demo/detrans.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/detrans.cpp'; fi` + +Magick++/demo/flip-flip.o: Magick++/demo/flip.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_flip_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/flip-flip.o -MD -MP -MF Magick++/demo/$(DEPDIR)/flip-flip.Tpo -c -o Magick++/demo/flip-flip.o `test -f 'Magick++/demo/flip.cpp' || echo '$(srcdir)/'`Magick++/demo/flip.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/flip-flip.Tpo Magick++/demo/$(DEPDIR)/flip-flip.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/flip.cpp' object='Magick++/demo/flip-flip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_flip_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/flip-flip.o `test -f 'Magick++/demo/flip.cpp' || echo '$(srcdir)/'`Magick++/demo/flip.cpp + +Magick++/demo/flip-flip.obj: Magick++/demo/flip.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_flip_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/flip-flip.obj -MD -MP -MF Magick++/demo/$(DEPDIR)/flip-flip.Tpo -c -o Magick++/demo/flip-flip.obj `if test -f 'Magick++/demo/flip.cpp'; then $(CYGPATH_W) 'Magick++/demo/flip.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/flip.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/flip-flip.Tpo Magick++/demo/$(DEPDIR)/flip-flip.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/flip.cpp' object='Magick++/demo/flip-flip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_flip_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/flip-flip.obj `if test -f 'Magick++/demo/flip.cpp'; then $(CYGPATH_W) 'Magick++/demo/flip.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/flip.cpp'; fi` + +Magick++/demo/gravity-gravity.o: Magick++/demo/gravity.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_gravity_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/gravity-gravity.o -MD -MP -MF Magick++/demo/$(DEPDIR)/gravity-gravity.Tpo -c -o Magick++/demo/gravity-gravity.o `test -f 'Magick++/demo/gravity.cpp' || echo '$(srcdir)/'`Magick++/demo/gravity.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/gravity-gravity.Tpo Magick++/demo/$(DEPDIR)/gravity-gravity.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/gravity.cpp' object='Magick++/demo/gravity-gravity.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_gravity_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/gravity-gravity.o `test -f 'Magick++/demo/gravity.cpp' || echo '$(srcdir)/'`Magick++/demo/gravity.cpp + +Magick++/demo/gravity-gravity.obj: Magick++/demo/gravity.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_gravity_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/gravity-gravity.obj -MD -MP -MF Magick++/demo/$(DEPDIR)/gravity-gravity.Tpo -c -o Magick++/demo/gravity-gravity.obj `if test -f 'Magick++/demo/gravity.cpp'; then $(CYGPATH_W) 'Magick++/demo/gravity.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/gravity.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/gravity-gravity.Tpo Magick++/demo/$(DEPDIR)/gravity-gravity.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/gravity.cpp' object='Magick++/demo/gravity-gravity.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_gravity_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/gravity-gravity.obj `if test -f 'Magick++/demo/gravity.cpp'; then $(CYGPATH_W) 'Magick++/demo/gravity.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/gravity.cpp'; fi` + +Magick++/demo/piddle-piddle.o: Magick++/demo/piddle.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_piddle_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/piddle-piddle.o -MD -MP -MF Magick++/demo/$(DEPDIR)/piddle-piddle.Tpo -c -o Magick++/demo/piddle-piddle.o `test -f 'Magick++/demo/piddle.cpp' || echo '$(srcdir)/'`Magick++/demo/piddle.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/piddle-piddle.Tpo Magick++/demo/$(DEPDIR)/piddle-piddle.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/piddle.cpp' object='Magick++/demo/piddle-piddle.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_piddle_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/piddle-piddle.o `test -f 'Magick++/demo/piddle.cpp' || echo '$(srcdir)/'`Magick++/demo/piddle.cpp + +Magick++/demo/piddle-piddle.obj: Magick++/demo/piddle.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_piddle_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/piddle-piddle.obj -MD -MP -MF Magick++/demo/$(DEPDIR)/piddle-piddle.Tpo -c -o Magick++/demo/piddle-piddle.obj `if test -f 'Magick++/demo/piddle.cpp'; then $(CYGPATH_W) 'Magick++/demo/piddle.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/piddle.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/piddle-piddle.Tpo Magick++/demo/$(DEPDIR)/piddle-piddle.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/piddle.cpp' object='Magick++/demo/piddle-piddle.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_piddle_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/piddle-piddle.obj `if test -f 'Magick++/demo/piddle.cpp'; then $(CYGPATH_W) 'Magick++/demo/piddle.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/piddle.cpp'; fi` + +Magick++/demo/shapes-shapes.o: Magick++/demo/shapes.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_shapes_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/shapes-shapes.o -MD -MP -MF Magick++/demo/$(DEPDIR)/shapes-shapes.Tpo -c -o Magick++/demo/shapes-shapes.o `test -f 'Magick++/demo/shapes.cpp' || echo '$(srcdir)/'`Magick++/demo/shapes.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/shapes-shapes.Tpo Magick++/demo/$(DEPDIR)/shapes-shapes.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/shapes.cpp' object='Magick++/demo/shapes-shapes.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_shapes_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/shapes-shapes.o `test -f 'Magick++/demo/shapes.cpp' || echo '$(srcdir)/'`Magick++/demo/shapes.cpp + +Magick++/demo/shapes-shapes.obj: Magick++/demo/shapes.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_shapes_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/shapes-shapes.obj -MD -MP -MF Magick++/demo/$(DEPDIR)/shapes-shapes.Tpo -c -o Magick++/demo/shapes-shapes.obj `if test -f 'Magick++/demo/shapes.cpp'; then $(CYGPATH_W) 'Magick++/demo/shapes.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/shapes.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/shapes-shapes.Tpo Magick++/demo/$(DEPDIR)/shapes-shapes.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/shapes.cpp' object='Magick++/demo/shapes-shapes.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_shapes_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/shapes-shapes.obj `if test -f 'Magick++/demo/shapes.cpp'; then $(CYGPATH_W) 'Magick++/demo/shapes.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/shapes.cpp'; fi` + +Magick++/demo/zoom-zoom.o: Magick++/demo/zoom.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_zoom_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/zoom-zoom.o -MD -MP -MF Magick++/demo/$(DEPDIR)/zoom-zoom.Tpo -c -o Magick++/demo/zoom-zoom.o `test -f 'Magick++/demo/zoom.cpp' || echo '$(srcdir)/'`Magick++/demo/zoom.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/zoom-zoom.Tpo Magick++/demo/$(DEPDIR)/zoom-zoom.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/zoom.cpp' object='Magick++/demo/zoom-zoom.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_zoom_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/zoom-zoom.o `test -f 'Magick++/demo/zoom.cpp' || echo '$(srcdir)/'`Magick++/demo/zoom.cpp + +Magick++/demo/zoom-zoom.obj: Magick++/demo/zoom.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_zoom_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/demo/zoom-zoom.obj -MD -MP -MF Magick++/demo/$(DEPDIR)/zoom-zoom.Tpo -c -o Magick++/demo/zoom-zoom.obj `if test -f 'Magick++/demo/zoom.cpp'; then $(CYGPATH_W) 'Magick++/demo/zoom.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/zoom.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/demo/$(DEPDIR)/zoom-zoom.Tpo Magick++/demo/$(DEPDIR)/zoom-zoom.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/demo/zoom.cpp' object='Magick++/demo/zoom-zoom.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___demo_zoom_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/demo/zoom-zoom.obj `if test -f 'Magick++/demo/zoom.cpp'; then $(CYGPATH_W) 'Magick++/demo/zoom.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/demo/zoom.cpp'; fi` + +Magick++/tests/appendImages-appendImages.o: Magick++/tests/appendImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_appendImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/appendImages-appendImages.o -MD -MP -MF Magick++/tests/$(DEPDIR)/appendImages-appendImages.Tpo -c -o Magick++/tests/appendImages-appendImages.o `test -f 'Magick++/tests/appendImages.cpp' || echo '$(srcdir)/'`Magick++/tests/appendImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/appendImages-appendImages.Tpo Magick++/tests/$(DEPDIR)/appendImages-appendImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/appendImages.cpp' object='Magick++/tests/appendImages-appendImages.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_appendImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/appendImages-appendImages.o `test -f 'Magick++/tests/appendImages.cpp' || echo '$(srcdir)/'`Magick++/tests/appendImages.cpp + +Magick++/tests/appendImages-appendImages.obj: Magick++/tests/appendImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_appendImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/appendImages-appendImages.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/appendImages-appendImages.Tpo -c -o Magick++/tests/appendImages-appendImages.obj `if test -f 'Magick++/tests/appendImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/appendImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/appendImages.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/appendImages-appendImages.Tpo Magick++/tests/$(DEPDIR)/appendImages-appendImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/appendImages.cpp' object='Magick++/tests/appendImages-appendImages.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_appendImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/appendImages-appendImages.obj `if test -f 'Magick++/tests/appendImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/appendImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/appendImages.cpp'; fi` + +Magick++/tests/attributes-attributes.o: Magick++/tests/attributes.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_attributes_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/attributes-attributes.o -MD -MP -MF Magick++/tests/$(DEPDIR)/attributes-attributes.Tpo -c -o Magick++/tests/attributes-attributes.o `test -f 'Magick++/tests/attributes.cpp' || echo '$(srcdir)/'`Magick++/tests/attributes.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/attributes-attributes.Tpo Magick++/tests/$(DEPDIR)/attributes-attributes.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/attributes.cpp' object='Magick++/tests/attributes-attributes.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_attributes_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/attributes-attributes.o `test -f 'Magick++/tests/attributes.cpp' || echo '$(srcdir)/'`Magick++/tests/attributes.cpp + +Magick++/tests/attributes-attributes.obj: Magick++/tests/attributes.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_attributes_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/attributes-attributes.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/attributes-attributes.Tpo -c -o Magick++/tests/attributes-attributes.obj `if test -f 'Magick++/tests/attributes.cpp'; then $(CYGPATH_W) 'Magick++/tests/attributes.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/attributes.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/attributes-attributes.Tpo Magick++/tests/$(DEPDIR)/attributes-attributes.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/attributes.cpp' object='Magick++/tests/attributes-attributes.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_attributes_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/attributes-attributes.obj `if test -f 'Magick++/tests/attributes.cpp'; then $(CYGPATH_W) 'Magick++/tests/attributes.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/attributes.cpp'; fi` + +Magick++/tests/averageImages-averageImages.o: Magick++/tests/averageImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_averageImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/averageImages-averageImages.o -MD -MP -MF Magick++/tests/$(DEPDIR)/averageImages-averageImages.Tpo -c -o Magick++/tests/averageImages-averageImages.o `test -f 'Magick++/tests/averageImages.cpp' || echo '$(srcdir)/'`Magick++/tests/averageImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/averageImages-averageImages.Tpo Magick++/tests/$(DEPDIR)/averageImages-averageImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/averageImages.cpp' object='Magick++/tests/averageImages-averageImages.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_averageImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/averageImages-averageImages.o `test -f 'Magick++/tests/averageImages.cpp' || echo '$(srcdir)/'`Magick++/tests/averageImages.cpp + +Magick++/tests/averageImages-averageImages.obj: Magick++/tests/averageImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_averageImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/averageImages-averageImages.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/averageImages-averageImages.Tpo -c -o Magick++/tests/averageImages-averageImages.obj `if test -f 'Magick++/tests/averageImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/averageImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/averageImages.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/averageImages-averageImages.Tpo Magick++/tests/$(DEPDIR)/averageImages-averageImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/averageImages.cpp' object='Magick++/tests/averageImages-averageImages.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_averageImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/averageImages-averageImages.obj `if test -f 'Magick++/tests/averageImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/averageImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/averageImages.cpp'; fi` + +Magick++/tests/coalesceImages-coalesceImages.o: Magick++/tests/coalesceImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_coalesceImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/coalesceImages-coalesceImages.o -MD -MP -MF Magick++/tests/$(DEPDIR)/coalesceImages-coalesceImages.Tpo -c -o Magick++/tests/coalesceImages-coalesceImages.o `test -f 'Magick++/tests/coalesceImages.cpp' || echo '$(srcdir)/'`Magick++/tests/coalesceImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/coalesceImages-coalesceImages.Tpo Magick++/tests/$(DEPDIR)/coalesceImages-coalesceImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/coalesceImages.cpp' object='Magick++/tests/coalesceImages-coalesceImages.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_coalesceImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/coalesceImages-coalesceImages.o `test -f 'Magick++/tests/coalesceImages.cpp' || echo '$(srcdir)/'`Magick++/tests/coalesceImages.cpp + +Magick++/tests/coalesceImages-coalesceImages.obj: Magick++/tests/coalesceImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_coalesceImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/coalesceImages-coalesceImages.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/coalesceImages-coalesceImages.Tpo -c -o Magick++/tests/coalesceImages-coalesceImages.obj `if test -f 'Magick++/tests/coalesceImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/coalesceImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/coalesceImages.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/coalesceImages-coalesceImages.Tpo Magick++/tests/$(DEPDIR)/coalesceImages-coalesceImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/coalesceImages.cpp' object='Magick++/tests/coalesceImages-coalesceImages.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_coalesceImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/coalesceImages-coalesceImages.obj `if test -f 'Magick++/tests/coalesceImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/coalesceImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/coalesceImages.cpp'; fi` + +Magick++/tests/coderInfo-coderInfo.o: Magick++/tests/coderInfo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_coderInfo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/coderInfo-coderInfo.o -MD -MP -MF Magick++/tests/$(DEPDIR)/coderInfo-coderInfo.Tpo -c -o Magick++/tests/coderInfo-coderInfo.o `test -f 'Magick++/tests/coderInfo.cpp' || echo '$(srcdir)/'`Magick++/tests/coderInfo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/coderInfo-coderInfo.Tpo Magick++/tests/$(DEPDIR)/coderInfo-coderInfo.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/coderInfo.cpp' object='Magick++/tests/coderInfo-coderInfo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_coderInfo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/coderInfo-coderInfo.o `test -f 'Magick++/tests/coderInfo.cpp' || echo '$(srcdir)/'`Magick++/tests/coderInfo.cpp + +Magick++/tests/coderInfo-coderInfo.obj: Magick++/tests/coderInfo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_coderInfo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/coderInfo-coderInfo.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/coderInfo-coderInfo.Tpo -c -o Magick++/tests/coderInfo-coderInfo.obj `if test -f 'Magick++/tests/coderInfo.cpp'; then $(CYGPATH_W) 'Magick++/tests/coderInfo.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/coderInfo.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/coderInfo-coderInfo.Tpo Magick++/tests/$(DEPDIR)/coderInfo-coderInfo.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/coderInfo.cpp' object='Magick++/tests/coderInfo-coderInfo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_coderInfo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/coderInfo-coderInfo.obj `if test -f 'Magick++/tests/coderInfo.cpp'; then $(CYGPATH_W) 'Magick++/tests/coderInfo.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/coderInfo.cpp'; fi` + +Magick++/tests/color-color.o: Magick++/tests/color.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/color-color.o -MD -MP -MF Magick++/tests/$(DEPDIR)/color-color.Tpo -c -o Magick++/tests/color-color.o `test -f 'Magick++/tests/color.cpp' || echo '$(srcdir)/'`Magick++/tests/color.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/color-color.Tpo Magick++/tests/$(DEPDIR)/color-color.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/color.cpp' object='Magick++/tests/color-color.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/color-color.o `test -f 'Magick++/tests/color.cpp' || echo '$(srcdir)/'`Magick++/tests/color.cpp + +Magick++/tests/color-color.obj: Magick++/tests/color.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/color-color.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/color-color.Tpo -c -o Magick++/tests/color-color.obj `if test -f 'Magick++/tests/color.cpp'; then $(CYGPATH_W) 'Magick++/tests/color.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/color.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/color-color.Tpo Magick++/tests/$(DEPDIR)/color-color.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/color.cpp' object='Magick++/tests/color-color.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/color-color.obj `if test -f 'Magick++/tests/color.cpp'; then $(CYGPATH_W) 'Magick++/tests/color.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/color.cpp'; fi` + +Magick++/tests/colorHistogram-colorHistogram.o: Magick++/tests/colorHistogram.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_colorHistogram_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/colorHistogram-colorHistogram.o -MD -MP -MF Magick++/tests/$(DEPDIR)/colorHistogram-colorHistogram.Tpo -c -o Magick++/tests/colorHistogram-colorHistogram.o `test -f 'Magick++/tests/colorHistogram.cpp' || echo '$(srcdir)/'`Magick++/tests/colorHistogram.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/colorHistogram-colorHistogram.Tpo Magick++/tests/$(DEPDIR)/colorHistogram-colorHistogram.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/colorHistogram.cpp' object='Magick++/tests/colorHistogram-colorHistogram.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_colorHistogram_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/colorHistogram-colorHistogram.o `test -f 'Magick++/tests/colorHistogram.cpp' || echo '$(srcdir)/'`Magick++/tests/colorHistogram.cpp + +Magick++/tests/colorHistogram-colorHistogram.obj: Magick++/tests/colorHistogram.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_colorHistogram_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/colorHistogram-colorHistogram.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/colorHistogram-colorHistogram.Tpo -c -o Magick++/tests/colorHistogram-colorHistogram.obj `if test -f 'Magick++/tests/colorHistogram.cpp'; then $(CYGPATH_W) 'Magick++/tests/colorHistogram.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/colorHistogram.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/colorHistogram-colorHistogram.Tpo Magick++/tests/$(DEPDIR)/colorHistogram-colorHistogram.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/colorHistogram.cpp' object='Magick++/tests/colorHistogram-colorHistogram.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_colorHistogram_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/colorHistogram-colorHistogram.obj `if test -f 'Magick++/tests/colorHistogram.cpp'; then $(CYGPATH_W) 'Magick++/tests/colorHistogram.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/colorHistogram.cpp'; fi` + +Magick++/tests/exceptions-exceptions.o: Magick++/tests/exceptions.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_exceptions_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/exceptions-exceptions.o -MD -MP -MF Magick++/tests/$(DEPDIR)/exceptions-exceptions.Tpo -c -o Magick++/tests/exceptions-exceptions.o `test -f 'Magick++/tests/exceptions.cpp' || echo '$(srcdir)/'`Magick++/tests/exceptions.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/exceptions-exceptions.Tpo Magick++/tests/$(DEPDIR)/exceptions-exceptions.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/exceptions.cpp' object='Magick++/tests/exceptions-exceptions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_exceptions_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/exceptions-exceptions.o `test -f 'Magick++/tests/exceptions.cpp' || echo '$(srcdir)/'`Magick++/tests/exceptions.cpp + +Magick++/tests/exceptions-exceptions.obj: Magick++/tests/exceptions.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_exceptions_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/exceptions-exceptions.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/exceptions-exceptions.Tpo -c -o Magick++/tests/exceptions-exceptions.obj `if test -f 'Magick++/tests/exceptions.cpp'; then $(CYGPATH_W) 'Magick++/tests/exceptions.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/exceptions.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/exceptions-exceptions.Tpo Magick++/tests/$(DEPDIR)/exceptions-exceptions.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/exceptions.cpp' object='Magick++/tests/exceptions-exceptions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_exceptions_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/exceptions-exceptions.obj `if test -f 'Magick++/tests/exceptions.cpp'; then $(CYGPATH_W) 'Magick++/tests/exceptions.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/exceptions.cpp'; fi` + +Magick++/tests/montageImages-montageImages.o: Magick++/tests/montageImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_montageImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/montageImages-montageImages.o -MD -MP -MF Magick++/tests/$(DEPDIR)/montageImages-montageImages.Tpo -c -o Magick++/tests/montageImages-montageImages.o `test -f 'Magick++/tests/montageImages.cpp' || echo '$(srcdir)/'`Magick++/tests/montageImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/montageImages-montageImages.Tpo Magick++/tests/$(DEPDIR)/montageImages-montageImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/montageImages.cpp' object='Magick++/tests/montageImages-montageImages.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_montageImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/montageImages-montageImages.o `test -f 'Magick++/tests/montageImages.cpp' || echo '$(srcdir)/'`Magick++/tests/montageImages.cpp + +Magick++/tests/montageImages-montageImages.obj: Magick++/tests/montageImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_montageImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/montageImages-montageImages.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/montageImages-montageImages.Tpo -c -o Magick++/tests/montageImages-montageImages.obj `if test -f 'Magick++/tests/montageImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/montageImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/montageImages.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/montageImages-montageImages.Tpo Magick++/tests/$(DEPDIR)/montageImages-montageImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/montageImages.cpp' object='Magick++/tests/montageImages-montageImages.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_montageImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/montageImages-montageImages.obj `if test -f 'Magick++/tests/montageImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/montageImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/montageImages.cpp'; fi` + +Magick++/tests/morphImages-morphImages.o: Magick++/tests/morphImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_morphImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/morphImages-morphImages.o -MD -MP -MF Magick++/tests/$(DEPDIR)/morphImages-morphImages.Tpo -c -o Magick++/tests/morphImages-morphImages.o `test -f 'Magick++/tests/morphImages.cpp' || echo '$(srcdir)/'`Magick++/tests/morphImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/morphImages-morphImages.Tpo Magick++/tests/$(DEPDIR)/morphImages-morphImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/morphImages.cpp' object='Magick++/tests/morphImages-morphImages.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_morphImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/morphImages-morphImages.o `test -f 'Magick++/tests/morphImages.cpp' || echo '$(srcdir)/'`Magick++/tests/morphImages.cpp + +Magick++/tests/morphImages-morphImages.obj: Magick++/tests/morphImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_morphImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/morphImages-morphImages.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/morphImages-morphImages.Tpo -c -o Magick++/tests/morphImages-morphImages.obj `if test -f 'Magick++/tests/morphImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/morphImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/morphImages.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/morphImages-morphImages.Tpo Magick++/tests/$(DEPDIR)/morphImages-morphImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/morphImages.cpp' object='Magick++/tests/morphImages-morphImages.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_morphImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/morphImages-morphImages.obj `if test -f 'Magick++/tests/morphImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/morphImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/morphImages.cpp'; fi` + +Magick++/tests/readWriteBlob-readWriteBlob.o: Magick++/tests/readWriteBlob.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_readWriteBlob_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/readWriteBlob-readWriteBlob.o -MD -MP -MF Magick++/tests/$(DEPDIR)/readWriteBlob-readWriteBlob.Tpo -c -o Magick++/tests/readWriteBlob-readWriteBlob.o `test -f 'Magick++/tests/readWriteBlob.cpp' || echo '$(srcdir)/'`Magick++/tests/readWriteBlob.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/readWriteBlob-readWriteBlob.Tpo Magick++/tests/$(DEPDIR)/readWriteBlob-readWriteBlob.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/readWriteBlob.cpp' object='Magick++/tests/readWriteBlob-readWriteBlob.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_readWriteBlob_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/readWriteBlob-readWriteBlob.o `test -f 'Magick++/tests/readWriteBlob.cpp' || echo '$(srcdir)/'`Magick++/tests/readWriteBlob.cpp + +Magick++/tests/readWriteBlob-readWriteBlob.obj: Magick++/tests/readWriteBlob.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_readWriteBlob_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/readWriteBlob-readWriteBlob.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/readWriteBlob-readWriteBlob.Tpo -c -o Magick++/tests/readWriteBlob-readWriteBlob.obj `if test -f 'Magick++/tests/readWriteBlob.cpp'; then $(CYGPATH_W) 'Magick++/tests/readWriteBlob.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/readWriteBlob.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/readWriteBlob-readWriteBlob.Tpo Magick++/tests/$(DEPDIR)/readWriteBlob-readWriteBlob.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/readWriteBlob.cpp' object='Magick++/tests/readWriteBlob-readWriteBlob.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_readWriteBlob_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/readWriteBlob-readWriteBlob.obj `if test -f 'Magick++/tests/readWriteBlob.cpp'; then $(CYGPATH_W) 'Magick++/tests/readWriteBlob.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/readWriteBlob.cpp'; fi` + +Magick++/tests/readWriteImages-readWriteImages.o: Magick++/tests/readWriteImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_readWriteImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/readWriteImages-readWriteImages.o -MD -MP -MF Magick++/tests/$(DEPDIR)/readWriteImages-readWriteImages.Tpo -c -o Magick++/tests/readWriteImages-readWriteImages.o `test -f 'Magick++/tests/readWriteImages.cpp' || echo '$(srcdir)/'`Magick++/tests/readWriteImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/readWriteImages-readWriteImages.Tpo Magick++/tests/$(DEPDIR)/readWriteImages-readWriteImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/readWriteImages.cpp' object='Magick++/tests/readWriteImages-readWriteImages.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_readWriteImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/readWriteImages-readWriteImages.o `test -f 'Magick++/tests/readWriteImages.cpp' || echo '$(srcdir)/'`Magick++/tests/readWriteImages.cpp + +Magick++/tests/readWriteImages-readWriteImages.obj: Magick++/tests/readWriteImages.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_readWriteImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Magick++/tests/readWriteImages-readWriteImages.obj -MD -MP -MF Magick++/tests/$(DEPDIR)/readWriteImages-readWriteImages.Tpo -c -o Magick++/tests/readWriteImages-readWriteImages.obj `if test -f 'Magick++/tests/readWriteImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/readWriteImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/readWriteImages.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Magick++/tests/$(DEPDIR)/readWriteImages-readWriteImages.Tpo Magick++/tests/$(DEPDIR)/readWriteImages-readWriteImages.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Magick++/tests/readWriteImages.cpp' object='Magick++/tests/readWriteImages-readWriteImages.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Magick___tests_readWriteImages_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Magick++/tests/readWriteImages-readWriteImages.obj `if test -f 'Magick++/tests/readWriteImages.cpp'; then $(CYGPATH_W) 'Magick++/tests/readWriteImages.cpp'; else $(CYGPATH_W) '$(srcdir)/Magick++/tests/readWriteImages.cpp'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf Magick++/demo/.libs Magick++/demo/_libs + -rm -rf Magick++/lib/.libs Magick++/lib/_libs + -rm -rf Magick++/tests/.libs Magick++/tests/_libs + -rm -rf coders/.libs coders/_libs + -rm -rf filters/.libs filters/_libs + -rm -rf magick/.libs magick/_libs + -rm -rf tests/.libs tests/_libs + -rm -rf utilities/.libs utilities/_libs + -rm -rf wand/.libs wand/_libs + +distclean-libtool: + -rm -f libtool config.lt +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-configlibDATA: $(configlib_DATA) + @$(NORMAL_INSTALL) + @list='$(configlib_DATA)'; test -n "$(configlibdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(configlibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(configlibdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(configlibdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(configlibdir)" || exit $$?; \ + done + +uninstall-configlibDATA: + @$(NORMAL_UNINSTALL) + @list='$(configlib_DATA)'; test -n "$(configlibdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(configlibdir)'; $(am__uninstall_files_from_dir) +install-configshareDATA: $(configshare_DATA) + @$(NORMAL_INSTALL) + @list='$(configshare_DATA)'; test -n "$(configsharedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(configsharedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(configsharedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(configsharedir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(configsharedir)" || exit $$?; \ + done + +uninstall-configshareDATA: + @$(NORMAL_UNINSTALL) + @list='$(configshare_DATA)'; test -n "$(configsharedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(configsharedir)'; $(am__uninstall_files_from_dir) +install-configsharearchDATA: $(configsharearch_DATA) + @$(NORMAL_INSTALL) + @list='$(configsharearch_DATA)'; test -n "$(configsharearchdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(configsharearchdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(configsharearchdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(configsharearchdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(configsharearchdir)" || exit $$?; \ + done + +uninstall-configsharearchDATA: + @$(NORMAL_UNINSTALL) + @list='$(configsharearch_DATA)'; test -n "$(configsharearchdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(configsharearchdir)'; $(am__uninstall_files_from_dir) +install-docDATA: $(doc_DATA) + @$(NORMAL_INSTALL) + @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ + done + +uninstall-docDATA: + @$(NORMAL_UNINSTALL) + @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) +install-magickincHEADERS: $(magickinc_HEADERS) + @$(NORMAL_INSTALL) + @list='$(magickinc_HEADERS)'; test -n "$(magickincdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(magickincdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(magickincdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(magickincdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(magickincdir)" || exit $$?; \ + done + +uninstall-magickincHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(magickinc_HEADERS)'; test -n "$(magickincdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(magickincdir)'; $(am__uninstall_files_from_dir) +install-magickincarchHEADERS: $(magickincarch_HEADERS) + @$(NORMAL_INSTALL) + @list='$(magickincarch_HEADERS)'; test -n "$(magickincarchdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(magickincarchdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(magickincarchdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(magickincarchdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(magickincarchdir)" || exit $$?; \ + done + +uninstall-magickincarchHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(magickincarch_HEADERS)'; test -n "$(magickincarchdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(magickincarchdir)'; $(am__uninstall_files_from_dir) +install-magickppincHEADERS: $(magickppinc_HEADERS) + @$(NORMAL_INSTALL) + @list='$(magickppinc_HEADERS)'; test -n "$(magickppincdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(magickppincdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(magickppincdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(magickppincdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(magickppincdir)" || exit $$?; \ + done + +uninstall-magickppincHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(magickppinc_HEADERS)'; test -n "$(magickppincdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(magickppincdir)'; $(am__uninstall_files_from_dir) +install-magickpptopincHEADERS: $(magickpptopinc_HEADERS) + @$(NORMAL_INSTALL) + @list='$(magickpptopinc_HEADERS)'; test -n "$(magickpptopincdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(magickpptopincdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(magickpptopincdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(magickpptopincdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(magickpptopincdir)" || exit $$?; \ + done + +uninstall-magickpptopincHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(magickpptopinc_HEADERS)'; test -n "$(magickpptopincdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(magickpptopincdir)'; $(am__uninstall_files_from_dir) +install-wandincHEADERS: $(wandinc_HEADERS) + @$(NORMAL_INSTALL) + @list='$(wandinc_HEADERS)'; test -n "$(wandincdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(wandincdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(wandincdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(wandincdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(wandincdir)" || exit $$?; \ + done + +uninstall-wandincHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(wandinc_HEADERS)'; test -n "$(wandincdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(wandincdir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +.sh.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(SH_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_SH_LOG_DRIVER_FLAGS) $(SH_LOG_DRIVER_FLAGS) -- $(SH_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.sh$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(SH_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_SH_LOG_DRIVER_FLAGS) $(SH_LOG_DRIVER_FLAGS) -- $(SH_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +.tap.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TAP_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TAP_LOG_DRIVER_FLAGS) $(TAP_LOG_DRIVER_FLAGS) -- $(TAP_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.tap$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TAP_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TAP_LOG_DRIVER_FLAGS) $(TAP_LOG_DRIVER_FLAGS) -- $(TAP_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(SCRIPTS) $(MANS) $(DATA) \ + $(HEADERS) all-local +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(codersdir)" "$(DESTDIR)$(filtersdir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(configlibdir)" "$(DESTDIR)$(configsharedir)" "$(DESTDIR)$(configsharearchdir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(magickincdir)" "$(DESTDIR)$(magickincarchdir)" "$(DESTDIR)$(magickppincdir)" "$(DESTDIR)$(magickpptopincdir)" "$(DESTDIR)$(wandincdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f Magick++/demo/$(DEPDIR)/$(am__dirstamp) + -rm -f Magick++/demo/$(am__dirstamp) + -rm -f Magick++/lib/$(DEPDIR)/$(am__dirstamp) + -rm -f Magick++/lib/$(am__dirstamp) + -rm -f Magick++/tests/$(DEPDIR)/$(am__dirstamp) + -rm -f Magick++/tests/$(am__dirstamp) + -rm -f coders/$(DEPDIR)/$(am__dirstamp) + -rm -f coders/$(am__dirstamp) + -rm -f filters/$(DEPDIR)/$(am__dirstamp) + -rm -f filters/$(am__dirstamp) + -rm -f magick/$(DEPDIR)/$(am__dirstamp) + -rm -f magick/$(am__dirstamp) + -rm -f tests/$(DEPDIR)/$(am__dirstamp) + -rm -f tests/$(am__dirstamp) + -rm -f utilities/$(DEPDIR)/$(am__dirstamp) + -rm -f utilities/$(am__dirstamp) + -rm -f wand/$(DEPDIR)/$(am__dirstamp) + -rm -f wand/$(am__dirstamp) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-binPROGRAMS clean-checkPROGRAMS \ + clean-codersLTLIBRARIES clean-filtersLTLIBRARIES clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-local \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Magick++/demo/$(DEPDIR)/analyze-analyze.Po + -rm -f Magick++/demo/$(DEPDIR)/button-button.Po + -rm -f Magick++/demo/$(DEPDIR)/demo-demo.Po + -rm -f Magick++/demo/$(DEPDIR)/detrans-detrans.Po + -rm -f Magick++/demo/$(DEPDIR)/flip-flip.Po + -rm -f Magick++/demo/$(DEPDIR)/gravity-gravity.Po + -rm -f Magick++/demo/$(DEPDIR)/piddle-piddle.Po + -rm -f Magick++/demo/$(DEPDIR)/shapes-shapes.Po + -rm -f Magick++/demo/$(DEPDIR)/zoom-zoom.Po + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.Plo + -rm -f Magick++/tests/$(DEPDIR)/appendImages-appendImages.Po + -rm -f Magick++/tests/$(DEPDIR)/attributes-attributes.Po + -rm -f Magick++/tests/$(DEPDIR)/averageImages-averageImages.Po + -rm -f Magick++/tests/$(DEPDIR)/coalesceImages-coalesceImages.Po + -rm -f Magick++/tests/$(DEPDIR)/coderInfo-coderInfo.Po + -rm -f Magick++/tests/$(DEPDIR)/color-color.Po + -rm -f Magick++/tests/$(DEPDIR)/colorHistogram-colorHistogram.Po + -rm -f Magick++/tests/$(DEPDIR)/exceptions-exceptions.Po + -rm -f Magick++/tests/$(DEPDIR)/montageImages-montageImages.Po + -rm -f Magick++/tests/$(DEPDIR)/morphImages-morphImages.Po + -rm -f Magick++/tests/$(DEPDIR)/readWriteBlob-readWriteBlob.Po + -rm -f Magick++/tests/$(DEPDIR)/readWriteImages-readWriteImages.Po + -rm -f coders/$(DEPDIR)/aai_la-aai.Plo + -rm -f coders/$(DEPDIR)/art_la-art.Plo + -rm -f coders/$(DEPDIR)/avs_la-avs.Plo + -rm -f coders/$(DEPDIR)/bgr_la-bgr.Plo + -rm -f coders/$(DEPDIR)/bmp_la-bmp.Plo + -rm -f coders/$(DEPDIR)/braille_la-braille.Plo + -rm -f coders/$(DEPDIR)/cals_la-cals.Plo + -rm -f coders/$(DEPDIR)/caption_la-caption.Plo + -rm -f coders/$(DEPDIR)/cin_la-cin.Plo + -rm -f coders/$(DEPDIR)/cip_la-cip.Plo + -rm -f coders/$(DEPDIR)/clip_la-clip.Plo + -rm -f coders/$(DEPDIR)/clipboard_la-clipboard.Plo + -rm -f coders/$(DEPDIR)/cmyk_la-cmyk.Plo + -rm -f coders/$(DEPDIR)/cut_la-cut.Plo + -rm -f coders/$(DEPDIR)/dcm_la-dcm.Plo + -rm -f coders/$(DEPDIR)/dds_la-dds.Plo + -rm -f coders/$(DEPDIR)/debug_la-debug.Plo + -rm -f coders/$(DEPDIR)/dib_la-dib.Plo + -rm -f coders/$(DEPDIR)/djvu_la-djvu.Plo + -rm -f coders/$(DEPDIR)/dng_la-dng.Plo + -rm -f coders/$(DEPDIR)/dot_la-dot.Plo + -rm -f coders/$(DEPDIR)/dps_la-dps.Plo + -rm -f coders/$(DEPDIR)/dpx_la-dpx.Plo + -rm -f coders/$(DEPDIR)/emf_la-emf.Plo + -rm -f coders/$(DEPDIR)/ept_la-ept.Plo + -rm -f coders/$(DEPDIR)/exr_la-exr.Plo + -rm -f coders/$(DEPDIR)/fax_la-fax.Plo + -rm -f coders/$(DEPDIR)/fits_la-fits.Plo + -rm -f coders/$(DEPDIR)/flif_la-flif.Plo + -rm -f coders/$(DEPDIR)/fpx_la-fpx.Plo + -rm -f coders/$(DEPDIR)/gif_la-gif.Plo + -rm -f coders/$(DEPDIR)/gradient_la-gradient.Plo + -rm -f coders/$(DEPDIR)/gray_la-gray.Plo + -rm -f coders/$(DEPDIR)/hald_la-hald.Plo + -rm -f coders/$(DEPDIR)/hdr_la-hdr.Plo + -rm -f coders/$(DEPDIR)/heic_la-heic.Plo + -rm -f coders/$(DEPDIR)/histogram_la-histogram.Plo + -rm -f coders/$(DEPDIR)/hrz_la-hrz.Plo + -rm -f coders/$(DEPDIR)/html_la-html.Plo + -rm -f coders/$(DEPDIR)/icon_la-icon.Plo + -rm -f coders/$(DEPDIR)/info_la-info.Plo + -rm -f coders/$(DEPDIR)/inline_la-inline.Plo + -rm -f coders/$(DEPDIR)/ipl_la-ipl.Plo + -rm -f coders/$(DEPDIR)/jbig_la-jbig.Plo + -rm -f coders/$(DEPDIR)/jnx_la-jnx.Plo + -rm -f coders/$(DEPDIR)/jp2_la-jp2.Plo + -rm -f coders/$(DEPDIR)/jpeg_la-jpeg.Plo + -rm -f coders/$(DEPDIR)/json_la-json.Plo + -rm -f coders/$(DEPDIR)/label_la-label.Plo + -rm -f coders/$(DEPDIR)/mac_la-mac.Plo + -rm -f coders/$(DEPDIR)/magick_la-magick.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.Plo + -rm -f coders/$(DEPDIR)/map_la-map.Plo + -rm -f coders/$(DEPDIR)/mask_la-mask.Plo + -rm -f coders/$(DEPDIR)/mat_la-mat.Plo + -rm -f coders/$(DEPDIR)/matte_la-matte.Plo + -rm -f coders/$(DEPDIR)/meta_la-meta.Plo + -rm -f coders/$(DEPDIR)/miff_la-miff.Plo + -rm -f coders/$(DEPDIR)/mono_la-mono.Plo + -rm -f coders/$(DEPDIR)/mpc_la-mpc.Plo + -rm -f coders/$(DEPDIR)/mpr_la-mpr.Plo + -rm -f coders/$(DEPDIR)/msl_la-msl.Plo + -rm -f coders/$(DEPDIR)/mtv_la-mtv.Plo + -rm -f coders/$(DEPDIR)/mvg_la-mvg.Plo + -rm -f coders/$(DEPDIR)/null_la-null.Plo + -rm -f coders/$(DEPDIR)/otb_la-otb.Plo + -rm -f coders/$(DEPDIR)/palm_la-palm.Plo + -rm -f coders/$(DEPDIR)/pango_la-pango.Plo + -rm -f coders/$(DEPDIR)/pattern_la-pattern.Plo + -rm -f coders/$(DEPDIR)/pcd_la-pcd.Plo + -rm -f coders/$(DEPDIR)/pcl_la-pcl.Plo + -rm -f coders/$(DEPDIR)/pcx_la-pcx.Plo + -rm -f coders/$(DEPDIR)/pdb_la-pdb.Plo + -rm -f coders/$(DEPDIR)/pdf_la-pdf.Plo + -rm -f coders/$(DEPDIR)/pes_la-pes.Plo + -rm -f coders/$(DEPDIR)/pgx_la-pgx.Plo + -rm -f coders/$(DEPDIR)/pict_la-pict.Plo + -rm -f coders/$(DEPDIR)/pix_la-pix.Plo + -rm -f coders/$(DEPDIR)/plasma_la-plasma.Plo + -rm -f coders/$(DEPDIR)/png_la-png.Plo + -rm -f coders/$(DEPDIR)/pnm_la-pnm.Plo + -rm -f coders/$(DEPDIR)/preview_la-preview.Plo + -rm -f coders/$(DEPDIR)/ps2_la-ps2.Plo + -rm -f coders/$(DEPDIR)/ps3_la-ps3.Plo + -rm -f coders/$(DEPDIR)/ps_la-ps.Plo + -rm -f coders/$(DEPDIR)/psd_la-psd.Plo + -rm -f coders/$(DEPDIR)/pwp_la-pwp.Plo + -rm -f coders/$(DEPDIR)/raw_la-raw.Plo + -rm -f coders/$(DEPDIR)/rgb_la-rgb.Plo + -rm -f coders/$(DEPDIR)/rgf_la-rgf.Plo + -rm -f coders/$(DEPDIR)/rla_la-rla.Plo + -rm -f coders/$(DEPDIR)/rle_la-rle.Plo + -rm -f coders/$(DEPDIR)/scr_la-scr.Plo + -rm -f coders/$(DEPDIR)/sct_la-sct.Plo + -rm -f coders/$(DEPDIR)/sfw_la-sfw.Plo + -rm -f coders/$(DEPDIR)/sgi_la-sgi.Plo + -rm -f coders/$(DEPDIR)/sixel_la-sixel.Plo + -rm -f coders/$(DEPDIR)/stegano_la-stegano.Plo + -rm -f coders/$(DEPDIR)/sun_la-sun.Plo + -rm -f coders/$(DEPDIR)/svg_la-svg.Plo + -rm -f coders/$(DEPDIR)/tga_la-tga.Plo + -rm -f coders/$(DEPDIR)/thumbnail_la-thumbnail.Plo + -rm -f coders/$(DEPDIR)/tiff_la-psd.Plo + -rm -f coders/$(DEPDIR)/tiff_la-tiff.Plo + -rm -f coders/$(DEPDIR)/tile_la-tile.Plo + -rm -f coders/$(DEPDIR)/tim_la-tim.Plo + -rm -f coders/$(DEPDIR)/ttf_la-ttf.Plo + -rm -f coders/$(DEPDIR)/txt_la-txt.Plo + -rm -f coders/$(DEPDIR)/uil_la-uil.Plo + -rm -f coders/$(DEPDIR)/url_la-url.Plo + -rm -f coders/$(DEPDIR)/uyvy_la-uyvy.Plo + -rm -f coders/$(DEPDIR)/vicar_la-vicar.Plo + -rm -f coders/$(DEPDIR)/vid_la-vid.Plo + -rm -f coders/$(DEPDIR)/video_la-video.Plo + -rm -f coders/$(DEPDIR)/viff_la-viff.Plo + -rm -f coders/$(DEPDIR)/vips_la-vips.Plo + -rm -f coders/$(DEPDIR)/wbmp_la-wbmp.Plo + -rm -f coders/$(DEPDIR)/webp_la-webp.Plo + -rm -f coders/$(DEPDIR)/wmf_la-wmf.Plo + -rm -f coders/$(DEPDIR)/wpg_la-wpg.Plo + -rm -f coders/$(DEPDIR)/x_la-x.Plo + -rm -f coders/$(DEPDIR)/xbm_la-xbm.Plo + -rm -f coders/$(DEPDIR)/xc_la-xc.Plo + -rm -f coders/$(DEPDIR)/xcf_la-xcf.Plo + -rm -f coders/$(DEPDIR)/xpm_la-xpm.Plo + -rm -f coders/$(DEPDIR)/xps_la-xps.Plo + -rm -f coders/$(DEPDIR)/xwd_la-xwd.Plo + -rm -f coders/$(DEPDIR)/ycbcr_la-ycbcr.Plo + -rm -f coders/$(DEPDIR)/yuv_la-yuv.Plo + -rm -f filters/$(DEPDIR)/analyze_la-analyze.Plo + -rm -f filters/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.Plo + -rm -f tests/$(DEPDIR)/drawtest-drawtest.Po + -rm -f tests/$(DEPDIR)/validate-validate.Po + -rm -f tests/$(DEPDIR)/wandtest-wandtest.Po + -rm -f utilities/$(DEPDIR)/animate.Po + -rm -f utilities/$(DEPDIR)/compare.Po + -rm -f utilities/$(DEPDIR)/composite.Po + -rm -f utilities/$(DEPDIR)/conjure.Po + -rm -f utilities/$(DEPDIR)/convert.Po + -rm -f utilities/$(DEPDIR)/display.Po + -rm -f utilities/$(DEPDIR)/identify.Po + -rm -f utilities/$(DEPDIR)/import.Po + -rm -f utilities/$(DEPDIR)/mogrify.Po + -rm -f utilities/$(DEPDIR)/montage.Po + -rm -f utilities/$(DEPDIR)/stream.Po + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.Plo + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-local distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: html-local + +info: info-am + +info-am: + +install-data-am: install-codersLTLIBRARIES install-configlibDATA \ + install-configshareDATA install-configsharearchDATA \ + install-data-local install-docDATA install-filtersLTLIBRARIES \ + install-includeHEADERS install-magickincHEADERS \ + install-magickincarchHEADERS install-magickppincHEADERS \ + install-magickpptopincHEADERS install-man \ + install-pkgconfigDATA install-wandincHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-binSCRIPTS \ + install-exec-local install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Magick++/demo/$(DEPDIR)/analyze-analyze.Po + -rm -f Magick++/demo/$(DEPDIR)/button-button.Po + -rm -f Magick++/demo/$(DEPDIR)/demo-demo.Po + -rm -f Magick++/demo/$(DEPDIR)/detrans-detrans.Po + -rm -f Magick++/demo/$(DEPDIR)/flip-flip.Po + -rm -f Magick++/demo/$(DEPDIR)/gravity-gravity.Po + -rm -f Magick++/demo/$(DEPDIR)/piddle-piddle.Po + -rm -f Magick++/demo/$(DEPDIR)/shapes-shapes.Po + -rm -f Magick++/demo/$(DEPDIR)/zoom-zoom.Po + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Blob.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-BlobRef.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ChannelMoments.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-CoderInfo.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Color.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Drawable.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Exception.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Functions.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Geometry.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Image.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ImageRef.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Montage.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Options.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Pixels.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ResourceLimits.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-STL.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-Thread.Plo + -rm -f Magick++/lib/$(DEPDIR)/libMagick___@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-TypeMetric.Plo + -rm -f Magick++/tests/$(DEPDIR)/appendImages-appendImages.Po + -rm -f Magick++/tests/$(DEPDIR)/attributes-attributes.Po + -rm -f Magick++/tests/$(DEPDIR)/averageImages-averageImages.Po + -rm -f Magick++/tests/$(DEPDIR)/coalesceImages-coalesceImages.Po + -rm -f Magick++/tests/$(DEPDIR)/coderInfo-coderInfo.Po + -rm -f Magick++/tests/$(DEPDIR)/color-color.Po + -rm -f Magick++/tests/$(DEPDIR)/colorHistogram-colorHistogram.Po + -rm -f Magick++/tests/$(DEPDIR)/exceptions-exceptions.Po + -rm -f Magick++/tests/$(DEPDIR)/montageImages-montageImages.Po + -rm -f Magick++/tests/$(DEPDIR)/morphImages-morphImages.Po + -rm -f Magick++/tests/$(DEPDIR)/readWriteBlob-readWriteBlob.Po + -rm -f Magick++/tests/$(DEPDIR)/readWriteImages-readWriteImages.Po + -rm -f coders/$(DEPDIR)/aai_la-aai.Plo + -rm -f coders/$(DEPDIR)/art_la-art.Plo + -rm -f coders/$(DEPDIR)/avs_la-avs.Plo + -rm -f coders/$(DEPDIR)/bgr_la-bgr.Plo + -rm -f coders/$(DEPDIR)/bmp_la-bmp.Plo + -rm -f coders/$(DEPDIR)/braille_la-braille.Plo + -rm -f coders/$(DEPDIR)/cals_la-cals.Plo + -rm -f coders/$(DEPDIR)/caption_la-caption.Plo + -rm -f coders/$(DEPDIR)/cin_la-cin.Plo + -rm -f coders/$(DEPDIR)/cip_la-cip.Plo + -rm -f coders/$(DEPDIR)/clip_la-clip.Plo + -rm -f coders/$(DEPDIR)/clipboard_la-clipboard.Plo + -rm -f coders/$(DEPDIR)/cmyk_la-cmyk.Plo + -rm -f coders/$(DEPDIR)/cut_la-cut.Plo + -rm -f coders/$(DEPDIR)/dcm_la-dcm.Plo + -rm -f coders/$(DEPDIR)/dds_la-dds.Plo + -rm -f coders/$(DEPDIR)/debug_la-debug.Plo + -rm -f coders/$(DEPDIR)/dib_la-dib.Plo + -rm -f coders/$(DEPDIR)/djvu_la-djvu.Plo + -rm -f coders/$(DEPDIR)/dng_la-dng.Plo + -rm -f coders/$(DEPDIR)/dot_la-dot.Plo + -rm -f coders/$(DEPDIR)/dps_la-dps.Plo + -rm -f coders/$(DEPDIR)/dpx_la-dpx.Plo + -rm -f coders/$(DEPDIR)/emf_la-emf.Plo + -rm -f coders/$(DEPDIR)/ept_la-ept.Plo + -rm -f coders/$(DEPDIR)/exr_la-exr.Plo + -rm -f coders/$(DEPDIR)/fax_la-fax.Plo + -rm -f coders/$(DEPDIR)/fits_la-fits.Plo + -rm -f coders/$(DEPDIR)/flif_la-flif.Plo + -rm -f coders/$(DEPDIR)/fpx_la-fpx.Plo + -rm -f coders/$(DEPDIR)/gif_la-gif.Plo + -rm -f coders/$(DEPDIR)/gradient_la-gradient.Plo + -rm -f coders/$(DEPDIR)/gray_la-gray.Plo + -rm -f coders/$(DEPDIR)/hald_la-hald.Plo + -rm -f coders/$(DEPDIR)/hdr_la-hdr.Plo + -rm -f coders/$(DEPDIR)/heic_la-heic.Plo + -rm -f coders/$(DEPDIR)/histogram_la-histogram.Plo + -rm -f coders/$(DEPDIR)/hrz_la-hrz.Plo + -rm -f coders/$(DEPDIR)/html_la-html.Plo + -rm -f coders/$(DEPDIR)/icon_la-icon.Plo + -rm -f coders/$(DEPDIR)/info_la-info.Plo + -rm -f coders/$(DEPDIR)/inline_la-inline.Plo + -rm -f coders/$(DEPDIR)/ipl_la-ipl.Plo + -rm -f coders/$(DEPDIR)/jbig_la-jbig.Plo + -rm -f coders/$(DEPDIR)/jnx_la-jnx.Plo + -rm -f coders/$(DEPDIR)/jp2_la-jp2.Plo + -rm -f coders/$(DEPDIR)/jpeg_la-jpeg.Plo + -rm -f coders/$(DEPDIR)/json_la-json.Plo + -rm -f coders/$(DEPDIR)/label_la-label.Plo + -rm -f coders/$(DEPDIR)/mac_la-mac.Plo + -rm -f coders/$(DEPDIR)/magick_la-magick.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-aai.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-art.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-avs.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bgr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-bmp.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-braille.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cals.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-caption.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cin.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cip.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clip.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-clipboard.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cmyk.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cut.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dcm.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dds.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-debug.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dib.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-djvu.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dng.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dot.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dps.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-dpx.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-emf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ept.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fax.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fits.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-flif.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fpx.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gif.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gradient.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gray.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hald.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hdr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-heic.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hrz.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-html.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-icon.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-info.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-inline.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ipl.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jbig.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jnx.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jp2.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-jpeg.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-json.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-label.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mac.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-map.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mask.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mat.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matte.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-meta.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-miff.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mono.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpc.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mpr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-msl.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mtv.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mvg.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-null.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-otb.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-palm.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pango.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pattern.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcd.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcl.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pcx.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdb.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pdf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pes.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pgx.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pict.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pix.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-plasma.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-png.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pnm.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-preview.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps2.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ps3.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-psd.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pwp.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-raw.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgb.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rgf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rla.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-rle.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-scr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-screenshot.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sct.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sfw.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sgi.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sixel.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stegano.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-sun.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-svg.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tga.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thumbnail.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tiff.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tile.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-tim.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ttf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-txt.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uil.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-url.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-uyvy.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vicar.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vid.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-video.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-viff.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vips.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wbmp.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-webp.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wmf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wpg.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-x.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xbm.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xc.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xcf.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xpm.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xps.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwd.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-ycbcr.Plo + -rm -f coders/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-yuv.Plo + -rm -f coders/$(DEPDIR)/map_la-map.Plo + -rm -f coders/$(DEPDIR)/mask_la-mask.Plo + -rm -f coders/$(DEPDIR)/mat_la-mat.Plo + -rm -f coders/$(DEPDIR)/matte_la-matte.Plo + -rm -f coders/$(DEPDIR)/meta_la-meta.Plo + -rm -f coders/$(DEPDIR)/miff_la-miff.Plo + -rm -f coders/$(DEPDIR)/mono_la-mono.Plo + -rm -f coders/$(DEPDIR)/mpc_la-mpc.Plo + -rm -f coders/$(DEPDIR)/mpr_la-mpr.Plo + -rm -f coders/$(DEPDIR)/msl_la-msl.Plo + -rm -f coders/$(DEPDIR)/mtv_la-mtv.Plo + -rm -f coders/$(DEPDIR)/mvg_la-mvg.Plo + -rm -f coders/$(DEPDIR)/null_la-null.Plo + -rm -f coders/$(DEPDIR)/otb_la-otb.Plo + -rm -f coders/$(DEPDIR)/palm_la-palm.Plo + -rm -f coders/$(DEPDIR)/pango_la-pango.Plo + -rm -f coders/$(DEPDIR)/pattern_la-pattern.Plo + -rm -f coders/$(DEPDIR)/pcd_la-pcd.Plo + -rm -f coders/$(DEPDIR)/pcl_la-pcl.Plo + -rm -f coders/$(DEPDIR)/pcx_la-pcx.Plo + -rm -f coders/$(DEPDIR)/pdb_la-pdb.Plo + -rm -f coders/$(DEPDIR)/pdf_la-pdf.Plo + -rm -f coders/$(DEPDIR)/pes_la-pes.Plo + -rm -f coders/$(DEPDIR)/pgx_la-pgx.Plo + -rm -f coders/$(DEPDIR)/pict_la-pict.Plo + -rm -f coders/$(DEPDIR)/pix_la-pix.Plo + -rm -f coders/$(DEPDIR)/plasma_la-plasma.Plo + -rm -f coders/$(DEPDIR)/png_la-png.Plo + -rm -f coders/$(DEPDIR)/pnm_la-pnm.Plo + -rm -f coders/$(DEPDIR)/preview_la-preview.Plo + -rm -f coders/$(DEPDIR)/ps2_la-ps2.Plo + -rm -f coders/$(DEPDIR)/ps3_la-ps3.Plo + -rm -f coders/$(DEPDIR)/ps_la-ps.Plo + -rm -f coders/$(DEPDIR)/psd_la-psd.Plo + -rm -f coders/$(DEPDIR)/pwp_la-pwp.Plo + -rm -f coders/$(DEPDIR)/raw_la-raw.Plo + -rm -f coders/$(DEPDIR)/rgb_la-rgb.Plo + -rm -f coders/$(DEPDIR)/rgf_la-rgf.Plo + -rm -f coders/$(DEPDIR)/rla_la-rla.Plo + -rm -f coders/$(DEPDIR)/rle_la-rle.Plo + -rm -f coders/$(DEPDIR)/scr_la-scr.Plo + -rm -f coders/$(DEPDIR)/sct_la-sct.Plo + -rm -f coders/$(DEPDIR)/sfw_la-sfw.Plo + -rm -f coders/$(DEPDIR)/sgi_la-sgi.Plo + -rm -f coders/$(DEPDIR)/sixel_la-sixel.Plo + -rm -f coders/$(DEPDIR)/stegano_la-stegano.Plo + -rm -f coders/$(DEPDIR)/sun_la-sun.Plo + -rm -f coders/$(DEPDIR)/svg_la-svg.Plo + -rm -f coders/$(DEPDIR)/tga_la-tga.Plo + -rm -f coders/$(DEPDIR)/thumbnail_la-thumbnail.Plo + -rm -f coders/$(DEPDIR)/tiff_la-psd.Plo + -rm -f coders/$(DEPDIR)/tiff_la-tiff.Plo + -rm -f coders/$(DEPDIR)/tile_la-tile.Plo + -rm -f coders/$(DEPDIR)/tim_la-tim.Plo + -rm -f coders/$(DEPDIR)/ttf_la-ttf.Plo + -rm -f coders/$(DEPDIR)/txt_la-txt.Plo + -rm -f coders/$(DEPDIR)/uil_la-uil.Plo + -rm -f coders/$(DEPDIR)/url_la-url.Plo + -rm -f coders/$(DEPDIR)/uyvy_la-uyvy.Plo + -rm -f coders/$(DEPDIR)/vicar_la-vicar.Plo + -rm -f coders/$(DEPDIR)/vid_la-vid.Plo + -rm -f coders/$(DEPDIR)/video_la-video.Plo + -rm -f coders/$(DEPDIR)/viff_la-viff.Plo + -rm -f coders/$(DEPDIR)/vips_la-vips.Plo + -rm -f coders/$(DEPDIR)/wbmp_la-wbmp.Plo + -rm -f coders/$(DEPDIR)/webp_la-webp.Plo + -rm -f coders/$(DEPDIR)/wmf_la-wmf.Plo + -rm -f coders/$(DEPDIR)/wpg_la-wpg.Plo + -rm -f coders/$(DEPDIR)/x_la-x.Plo + -rm -f coders/$(DEPDIR)/xbm_la-xbm.Plo + -rm -f coders/$(DEPDIR)/xc_la-xc.Plo + -rm -f coders/$(DEPDIR)/xcf_la-xcf.Plo + -rm -f coders/$(DEPDIR)/xpm_la-xpm.Plo + -rm -f coders/$(DEPDIR)/xps_la-xps.Plo + -rm -f coders/$(DEPDIR)/xwd_la-xwd.Plo + -rm -f coders/$(DEPDIR)/ycbcr_la-ycbcr.Plo + -rm -f coders/$(DEPDIR)/yuv_la-yuv.Plo + -rm -f filters/$(DEPDIR)/analyze_la-analyze.Plo + -rm -f filters/$(DEPDIR)/magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-analyze.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-accelerate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-annotate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-artifact.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-attribute.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-blob.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache-view.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cache.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-channel.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-cipher.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-client.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-coder.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-color.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colormap.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-colorspace.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compress.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-configure.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-constitute.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-decorate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-delegate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distort.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-distribute-cache.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-draw.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-effect.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-enhance.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-exception.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-feature.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fourier.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-fx.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-gem.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-geometry.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-hashmap.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-histogram.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image-view.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-image.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-layer.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-list.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-locale.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-log.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magic.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-matrix.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-memory.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mime.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-module.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-monitor.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-morphology.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-base.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-nt-feature.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-opencl.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-option.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-paint.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-policy.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-prepress.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-profile.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-property.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantize.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-export.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum-import.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-quantum.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-random.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-registry.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resample.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resize.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-resource.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-segment.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-semaphore.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-shear.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-signature.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-splay-tree.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-static.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-statistic.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-string.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-thread.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-timer.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-token.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-transform.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-type.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-utility.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-version.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-vision.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-visual-effects.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-widget.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xml-tree.Plo + -rm -f magick/$(DEPDIR)/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-xwindow.Plo + -rm -f tests/$(DEPDIR)/drawtest-drawtest.Po + -rm -f tests/$(DEPDIR)/validate-validate.Po + -rm -f tests/$(DEPDIR)/wandtest-wandtest.Po + -rm -f utilities/$(DEPDIR)/animate.Po + -rm -f utilities/$(DEPDIR)/compare.Po + -rm -f utilities/$(DEPDIR)/composite.Po + -rm -f utilities/$(DEPDIR)/conjure.Po + -rm -f utilities/$(DEPDIR)/convert.Po + -rm -f utilities/$(DEPDIR)/display.Po + -rm -f utilities/$(DEPDIR)/identify.Po + -rm -f utilities/$(DEPDIR)/import.Po + -rm -f utilities/$(DEPDIR)/mogrify.Po + -rm -f utilities/$(DEPDIR)/montage.Po + -rm -f utilities/$(DEPDIR)/stream.Po + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-animate.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-compare.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-composite.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-conjure.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-convert.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-deprecate.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-display.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-drawing-wand.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-identify.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-import.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-image.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-property.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-magick-wand.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-mogrify.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-montage.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-iterator.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-pixel-wand.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-stream.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand-view.Plo + -rm -f wand/$(DEPDIR)/libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-wand.Plo + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-codersLTLIBRARIES uninstall-configlibDATA \ + uninstall-configshareDATA uninstall-configsharearchDATA \ + uninstall-docDATA uninstall-filtersLTLIBRARIES \ + uninstall-includeHEADERS uninstall-libLTLIBRARIES \ + uninstall-local uninstall-magickincHEADERS \ + uninstall-magickincarchHEADERS uninstall-magickppincHEADERS \ + uninstall-magickpptopincHEADERS uninstall-man \ + uninstall-pkgconfigDATA uninstall-wandincHEADERS + +uninstall-man: uninstall-man1 + +.MAKE: all check check-am install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles am--refresh \ + check check-TESTS check-am check-local clean clean-binPROGRAMS \ + clean-checkPROGRAMS clean-codersLTLIBRARIES clean-cscope \ + clean-filtersLTLIBRARIES clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-local clean-noinstLTLIBRARIES cscope \ + cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-local distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am html-local info \ + info-am install install-am install-binPROGRAMS \ + install-binSCRIPTS install-codersLTLIBRARIES \ + install-configlibDATA install-configshareDATA \ + install-configsharearchDATA install-data install-data-am \ + install-data-local install-docDATA install-dvi install-dvi-am \ + install-exec install-exec-am install-exec-local \ + install-filtersLTLIBRARIES install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-libLTLIBRARIES install-magickincHEADERS \ + install-magickincarchHEADERS install-magickppincHEADERS \ + install-magickpptopincHEADERS install-man install-man1 \ + install-pdf install-pdf-am install-pkgconfigDATA install-ps \ + install-ps-am install-strip install-wandincHEADERS \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am recheck tags tags-am uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-codersLTLIBRARIES uninstall-configlibDATA \ + uninstall-configshareDATA uninstall-configsharearchDATA \ + uninstall-docDATA uninstall-filtersLTLIBRARIES \ + uninstall-includeHEADERS uninstall-libLTLIBRARIES \ + uninstall-local uninstall-magickincHEADERS \ + uninstall-magickincarchHEADERS uninstall-magickppincHEADERS \ + uninstall-magickpptopincHEADERS uninstall-man uninstall-man1 \ + uninstall-pkgconfigDATA uninstall-wandincHEADERS + +.PRECIOUS: Makefile + +@MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE@$(libMagickCore_threshold_target): magick/threshold-map.h +@MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE@magick/threshold-map.h: config/thresholds.xml Makefile +@MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE@ $(AM_V_GEN){ printf '%s\n %s=\n' 'static const char *const' BuiltinMap; sed -e 's/"/\\"/g; s/^.*$$/ "&\\n"/; $$s/$$/;/' $<; } >$@ + +$(PERLMAGICK)/quantum/@MAGICK_ABI_SUFFIX@.xs: $(PERLMAGICK)/quantum/quantum.xs + $(AM_V_GEN) $(LN_S) quantum.xs $@ + +$(PERLMAGICK)/quantum/@MAGICK_ABI_SUFFIX@.pm: $(PERLMAGICK)/quantum/quantum.pm + $(AM_V_GEN) $(LN_S) quantum.pm $@ + +perl-quantum-sources: $(PERLMAGICK)/quantum/@MAGICK_ABI_SUFFIX@.xs $(PERLMAGICK)/quantum/@MAGICK_ABI_SUFFIX@.pm + +perl-sources: perl-quantum-sources + @if test -n "$(VPATH)" ; then \ + echo "Linking PerlMagick Sources ..." ; \ + imagemagick=`(cd $(VPATH) ; pwd)` && \ + ( cd $(PERLMAGICK) && \ + sh $$imagemagick/config/lndir.sh $$imagemagick/$(PERLMAGICK) ; ) \ + fi ; \ + touch perl-sources + +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@$(PERLMAKEFILE): perl-sources $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(PERLMAKEMAKER) +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@ cd $(PERLMAGICK) && @PERL@ Makefile.PL $(PERL_MAKE_OPTIONS) + +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@install-exec-perl: $(PERLMAKEFILE) +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@ ( cd $(PERLMAGICK) && $(MAKE) CC='@CC@' && \ +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@ $(MAKE) CC='@CC@' install ) + +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@all-perl: perl-sources + +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@uninstall-exec-perl: $(PERLMAKEFILE) +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@ echo "Uninstall not supported for PerlMagick" + +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@check-perl: $(PERLMAKEFILE) +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@ cd $(PERLMAGICK) && $(abs_top_builddir)/magick.sh $(MAKE) CC='@CC@' test + +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@perl-build: $(PERLMAKEFILE) +@WITH_PERL_DYNAMIC_TRUE@@WITH_PERL_TRUE@ ( cd $(PERLMAGICK) && $(MAKE) CC='@CC@' ) + +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@$(PERLMAKEFILE): perl-sources $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(PERLMAKEMAKER) +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ cd $(PERLMAGICK) && @PERL@ Makefile.PL MAP_TARGET=$(PERLSTATICNAME) $(PERL_MAKE_OPTIONS) && $(MAKE) Makefile ; $(MAKE) Makefile + +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@$(PERLMAGICK)/$(PERLSTATICNAME): $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(PERLMAKEFILE) +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ ( rm -f $(PERLMAGICK)/$(PERLSTATICNAME) ; cd $(PERLMAGICK) && $(MAKE) CC='@CC@' $(PERLSTATICNAME) ; $(MAKE) CC='@CC@' $(PERLSTATICNAME) ) + +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@all-perl: $(PERLMAGICK)/$(PERLSTATICNAME) + +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@install-exec-perl: $(PERLMAGICK)/$(PERLSTATICNAME) +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ rm -f "$(DESTDIR)$(BIN_DIR)/$(PERLSTATICNAME)" +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ if test "x$(DESTDIR)" = "x" -o "$(PERL_SUPPORTS_DESTDIR)" = 'yes' ; then \ +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ ( cd $(PERLMAGICK) && \ +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ $(MAKE) -f Makefile.aperl CC='@CC@' inst_perl MAP_TARGET=$(PERLSTATICNAME) \ +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ INSTALLBIN="$(BIN_DIR)" \ +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ ) ; \ +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ else \ +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ ( cd $(PERLMAGICK) && \ +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ $(MAKE) -f Makefile.aperl CC='@CC@' inst_perl MAP_TARGET=$(PERLSTATICNAME) \ +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ INSTALLBIN="$(DESTDIR)$(BIN_DIR)" PREFIX="$(DESTDIR)$(prefix)" \ +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ ) ; \ +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ fi + +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@uninstall-exec-perl: +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ rm -f '$(DESTDIR)$(BIN_DIR)/$(PERLSTATICNAME)' + +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@check-perl: $(PERLMAGICK)/$(PERLSTATICNAME) +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@ cd $(PERLMAGICK) && $(abs_top_builddir)/magick.sh $(MAKE) -f Makefile.aperl CC='@CC@' test + +@WITH_PERL_DYNAMIC_FALSE@@WITH_PERL_STATIC_TRUE@@WITH_PERL_TRUE@perl-build: $(PERLMAGICK)/$(PERLSTATICNAME) + +@WITH_PERL_TRUE@clean-perl: +@WITH_PERL_TRUE@ (cd $(PERLMAGICK) && \ +@WITH_PERL_TRUE@ ( if test -f Makefile.old ; then $(MAKE) -f Makefile.old CC='@CC@' clean ; fi ) ; \ +@WITH_PERL_TRUE@ ( if test -f Makefile ; then $(MAKE) CC='@CC@' clean ; fi ) ; \ +@WITH_PERL_TRUE@ ( if test -f Makefile ; then $(MAKE) CC='@CC@' clean ; fi ) ; \ +@WITH_PERL_TRUE@ rm -f Makefile.old PerlMagick ; \ +@WITH_PERL_TRUE@ rm -f t/output* t/jng/*_tmp.jng t/*/output* ; \ +@WITH_PERL_TRUE@ rm -f quantum/@MAGICK_ABI_SUFFIX@.xs;\ +@WITH_PERL_TRUE@ rm -f quantum/@MAGICK_ABI_SUFFIX@.pm;\ +@WITH_PERL_TRUE@ rm -f Magick.pm;) +@WITH_PERL_TRUE@ rm -f perl-sources + +@WITH_PERL_TRUE@distclean-perl: clean-perl + +# Satisfy makefile requirements if not building PERL +@WITH_PERL_FALSE@all-perl: +@WITH_PERL_FALSE@install-exec-perl: +@WITH_PERL_FALSE@uninstall-exec-perl: +@WITH_PERL_FALSE@check-perl: +@WITH_PERL_FALSE@clean-perl: +@WITH_PERL_FALSE@distclean-perl: + +# create a copy for pc file (ideally the non abi should be symlinked) +%-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc: %.pc + cp -f $^ $@ + +all-local: $(MAGICKPP_LOCAL_TARGETS) $(PERLMAGICK_ALL_LOCAL_TARGETS) $(MAINTAINER_TARGETS) + +install-exec-local: $(PERLMAGICK_INSTALL_EXEC_LOCAL_TARGETS) + +install-data-local: $(PERLMAGICK_INSTALL_DATA_LOCAL_TARGETS) $(HTML_INSTALL_DATA_TARGETS) + +uninstall-local: $(PERLMAGICK_UNINSTALL_LOCAL_TARGETS) $(HTML_UNINSTALL_DATA_TARGETS) + +clean-local: $(PERLMAGICK_CLEAN_LOCAL_TARGETS) + +distclean-local: $(PERLMAGICK_DISTCLEAN_LOCAL_TARGETS) + +maintainer-clean-local: $(PERLMAGICK_MAINTAINER_CLEAN_LOCAL_TARGETS) + +check-local: $(PERLMAGICK_CHECK_LOCAL_TARGETS) + +# drd: valgrind's newer thread error detector +drd: + $(MAKE) MEMCHECK='valgrind --tool=drd --check-stack-var=yes --var-info=yes \ + --quiet $(VALGRIND_EXTRA_OPTS)' check + +# helgrind: valgrind's older thread error detector +helgrind: + $(MAKE) MEMCHECK='valgrind --tool=helgrind --error-exitcode=2 --quiet \ + $(VALGRIND_EXTRA_OPTS)' check + +# memcheck: valgrind's memory access checker +memcheck: + $(MAKE) MEMCHECK='valgrind --tool=memcheck --leak-check=full --read-var-info=yes \ + --error-exitcode=2 --track-origins=yes --num-callers=12 \ + --quiet $(VALGRIND_EXTRA_OPTS)' check + +# ptrcheck: valgrind's experimental pointer checking tool. +ptrcheck: + $(MAKE) MEMCHECK='valgrind --tool=exp-ptrcheck --quiet $(VALGRIND_EXTRA_OPTS)' check +dist-hook: + ( \ + builddir=`pwd` ; \ + cd $(srcdir) && \ + ( \ + for dir in $(DISTDIRS) ; do \ + find $$dir -depth -print | egrep -v '(~$$)|(/.git)|(/\.#)|(/\.deps)|(/\.git)' \ + | cpio -pdum $$builddir/$(distdir) 2> /dev/null ; \ + done \ + ) \ + ) + +install-data-html: + $(mkinstalldirs) $(DESTDIR)$(pkgdocdir) + $(INSTALL_DATA) $(srcdir)/index.html $(DESTDIR)$(pkgdocdir) + for dir in $(DOCDIRS) ; do \ + $(mkinstalldirs) $(DESTDIR)$(pkgdocdir)/$$dir && \ + if test -d $(builddir)/$$dir ; then \ + docsrcdir=$(builddir)/$$dir; \ + else \ + docsrcdir=$(srcdir)/$$dir; \ + fi; \ + if test -d $$docsrcdir; then \ + for file in $$docsrcdir/*.* ; do \ + echo "$(INSTALL_DATA) $$file $(DESTDIR)$(pkgdocdir)/$$dir" ; \ + $(INSTALL_DATA) "$$file" $(DESTDIR)$(pkgdocdir)/$$dir ; \ + done ; \ + fi; \ + done +uninstall-data-html: + rm -f $(DESTDIR)$(pkgdocdir)/index.html + for dir in $(DOCDIRS) ; do \ + rm -f -r $(DESTDIR)$(pkgdocdir)/$$dir ; \ + done + +# Ensure that version.h at $(srcdir)/magick/version.h is kept up to date. +magick-version: magick/version.h + @if test -f "$(srcdir)/VisualMagick/installer/inc/version.isx.in" ; then \ + ./config.status --file="$(srcdir)/../VisualMagick/installer/inc/version.isx" 2> /dev/null ; \ + fi + @if test -n "$(VPATH)" ; then \ + cmp magick/version.h $(srcdir)/magick/version.h > /dev/null ; \ + if test $$? -eq 1 ; then \ + echo "Updating $(srcdir)/magick/version.h ..."; \ + cp magick/version.h $(srcdir)/magick/version.h ; \ + fi ; \ + fi ; \ + touch magick-version + +magick/version.h: $(top_srcdir)/ChangeLog.md $(top_srcdir)/m4/version.m4 +libtool: $(LIBTOOL_DEPS) + $(SHELL) ./config.status --recheck + +# Format C API documentation +html-local: +# copy static file + for dir in $(DOCDIRSMANUAL) ; do \ + $(mkinstalldirs) $(top_builddir)/$$dir ;\ + for file in $$dir/*.* ; do \ + if ! test -f $(top_builddir)/$$file; then \ + cp -p -f $(top_srcdir)/$$file $(top_builddir)/$$dir ; \ + fi; \ + done ; \ + done; +# remove old doxygen files + for dir in $(DOCDIRDOXYGEN) ; do \ + rm -rf $$dir || true; \ + done; +# make doxygen doc + $(mkinstalldirs) $(top_builddir)/www/api + cd config && doxygen MagickCore.dox + cd config && doxygen MagickWand.dox + cd config && doxygen Magick++.dox +$(DIST_WINDOWS_SRC_ZIP) $(DIST_WINDOWS_SRC_7ZIP) windows-dist: + if test -d $(PACKAGE_NAME)-$(PACKAGE_VERSION) ; then \ + chmod -R u+w $(PACKAGE_NAME)-$(PACKAGE_VERSION) ; \ + rm -rf $(PACKAGE_NAME)-$(PACKAGE_VERSION) ; \ + fi + git clone -b main https://github.com/ImageMagick/ImageMagick6.git $(PACKAGE_NAME)-$(PACKAGE_VERSION) +@ZIP_DELEGATE_TRUE@ rm -f $(DIST_WINDOWS_SRC_ZIP) +@ZIP_DELEGATE_TRUE@ $(ZIP) -r -9 -q $(DIST_WINDOWS_SRC_ZIP) $(PACKAGE_NAME)-$(PACKAGE_VERSION) +@P7ZIP_DELEGATE_TRUE@ rm -f $(DIST_WINDOWS_SRC_7ZIP) +@P7ZIP_DELEGATE_TRUE@ $(P7ZIP) a -t7z -mx=9 $(DIST_WINDOWS_SRC_7ZIP) $(PACKAGE_NAME)-$(PACKAGE_VERSION) +@P7ZIP_DELEGATE_TRUE@ chmod 644 $(DIST_WINDOWS_SRC_7ZIP) + rm -rf $(PACKAGE_NAME)-$(PACKAGE_VERSION) +@RPM_DELEGATE_TRUE@.PHONY: srpm +@RPM_DELEGATE_TRUE@$(DIST_ARCHIVE_SRPM) srpm: dist-bzip2 +@RPM_DELEGATE_TRUE@ rm -f $(DIST_ARCHIVE_SRPM) +@RPM_DELEGATE_TRUE@ $(RPM) --define="_sourcedir `pwd`" --define="_srcrpmdir `pwd`" --nodeps --bs ImageMagick.spec +@RPM_DELEGATE_TRUE@ @echo ============================================================== +@RPM_DELEGATE_TRUE@ @echo $(DIST_ARCHIVE_SRPM) is ready for distribution. +@RPM_DELEGATE_TRUE@ @echo ============================================================== + +@RPM_DELEGATE_TRUE@.PHONY: rpm +@RPM_DELEGATE_TRUE@rpm: dist +@RPM_DELEGATE_TRUE@ rm -rf $(RPMDIR) +@RPM_DELEGATE_TRUE@ $(mkinstalldirs) $(RPMDIR) +@RPM_DELEGATE_TRUE@ $(mkinstalldirs) $(RPMDIR)/BUILD +@RPM_DELEGATE_TRUE@ $(mkinstalldirs) $(RPMDIR)/RPMS +@RPM_DELEGATE_TRUE@ $(RPM) --define="_sourcedir `pwd`" --define="_rpmdir `pwd`/$(RPMDIR)/RPMS" --define="_builddir `pwd`/$(RPMDIR)/BUILD" --nodeps -bb ImageMagick.spec +@RPM_DELEGATE_TRUE@ @echo ============================================================== +@RPM_DELEGATE_TRUE@ @echo $(DIST_ARCHIVE_RPM) is ready for distribution. +@RPM_DELEGATE_TRUE@ @echo ============================================================== + +# +# Build a validated snapshot release and move to the snapshots directory. +# +snapshot: distcheck + $(MAKE) $(DIST_ARCHIVE_SRPM) + $(MAKE) $(DIST_WINDOWS_SRC_ZIP) + $(MAKE) $(DIST_WINDOWS_SRC_7ZIP) + mv $(DIST_ARCHIVES) $(DIST_WINDOWS_SRC_ZIP) $(DIST_WINDOWS_SRC_7ZIP) $(DIST_ARCHIVE_SRPM) /var/ftp/pub/ImageMagick/beta/ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ImageMagick-6.9.12-44/NEWS.txt b/ImageMagick-6.9.12-44/NEWS.txt new file mode 100644 index 0000000..5352b6c --- /dev/null +++ b/ImageMagick-6.9.12-44/NEWS.txt @@ -0,0 +1,33 @@ +ImageMagick version 7 has been released. We encourage you to migrate your +workstreams to version 7. However, we recognize a significant version 6 user +community. As such, the ImageMagick development team is committed to maintain, +but not enhance, version 6 at least until 2028 and possibly beyond. + +We discovered a bug in the pseudo-random generator prior to ImageMagick +6.9.10-81, the first 3 values repeated because the random state was not +initialized properly. As a consequence of the fix, expect a different +numerical sequence when seeding (-seed). + +ImageMagick best practices strongly encourages you to configure a security +policy that best suits your local environment. + +The ImageMagick development process ensures a stable API and ABI. Before each +ImageMagick release, we perform a comprehensive security assessment that +includes memory error, thread data race detection, and continuous fuzzing +to detect and prevent security vulnerabilities. + +As an analog to linear (RGB) and non-linear (sRGB) color colorspaces, as +of ImageMagick 6.9.9-29, we introduce the LinearGray colorspace. Gray is +non-linear grayscale and LinearGray is linear (e.g. -colorspace linear-gray). + +Want more performance from ImageMagick? Try these options: + + add more memory to your system; + add more cores to your system; + reduce lock contention with the tcmalloc memory allocation library; + push large images to a solid-state drive, see large image support. + +If these options are prohibitive, you can reduce the quality of the image +results. The default build is Q16. If you instead use a Q8 build, you use half +the memory The tradeoff is reduced precision. For a Q8 build of ImageMagick, +use this configure script option: --with-quantum-depth=8. diff --git a/ImageMagick-6.9.12-44/NOTICE b/ImageMagick-6.9.12-44/NOTICE new file mode 100644 index 0000000..164bf51 --- /dev/null +++ b/ImageMagick-6.9.12-44/NOTICE @@ -0,0 +1,240 @@ +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +1. ImageMagick copyright: + +Copyright © 1999 ImageMagick Studio LLC, a non-profit organization dedicated +to making software imaging solutions freely available. + +You may not use this file except in compliance with the License. You may obtain +a copy of the License at + + https://imagemagick.org/script/license.php + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. + +The full text of this license is availaible in the LICENSE file. + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +2. E. I. du Pont de Nemours and Company copyright (ImageMagick was originally + developed and distributed by E. I. du Pont de Nemours and Company): + +Copyright 1999 E. I. du Pont de Nemours and Company + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files ("ImageMagick"), to deal in +ImageMagick without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of ImageMagick, and to permit persons to whom the ImageMagick is furnished to +do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of ImageMagick. + +The software is provided "as is", without warranty of any kind, express or +implied, including but not limited to the warranties of merchantability, +fitness for a particular purpose and noninfringement. In no event shall E. I. +du Pont de Nemours and Company be liable for any claim, damages or other +liability, whether in an action of contract, tort or otherwise, arising from, +out of or in connection with ImageMagick or the use or other dealings in +ImageMagick. + +Except as contained in this notice, the name of the E. I. du Pont de Nemours +and Company shall not be used in advertising or otherwise to promote the sale, +use or other dealings in ImageMagick without prior written authorization from +the E. I. du Pont de Nemours and Company. + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +3. OpenSSH copyright (this copyright is limited to magick/utility.c/ + Base64Decode() and Base64Encode(),incorporated from the OpenSSH package): + +Copyright (c) 2000 Markus Friedl. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR \`\`AS IS\'\' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +4. Xfig copyright (this copyright is limited to the image patterns in + magick/nt-base.c, incorporated from the XFig package): + +| FIG : Facility for Interactive Generation of figures +| Copyright (c) 1985-1988 by Supoj Sutanthavibul +| Parts Copyright (c) 1989-2000 by Brian V. Smith +| Parts Copyright (c) 1991 by Paul King + +Any party obtaining a copy of these files is granted, free of charge, a full +and unrestricted irrevocable, world-wide, paid up, royalty-free, nonexclusive +right and license to deal in this software and documentation files (the +"Software"), including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and +to permit persons who receive copies from any such party to do so, with the +only requirement being that this copyright notice remain intact. + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +5. ezXML copyright (This copyright is limited to code for reading XML files in + magick/xml-tree.c, incorporated from the ezxml package): + +Copyright 2004-2006 Aaron Voisine + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +6. GraphicsMagick copyright (this copyright is limited to the Windows installer + and enhancements to the automake and autoconf configure scripts, + incorporated from the GraphicsMagick package): + +Copyright (C) 2002 - 2009 GraphicsMagick Group + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +7. Magick++ copyright (this copyright is limited to the Magick++ API in the + Magick++ folder): + +Copyright 1999 - 2002 Bob Friesenhahn + +Permission is hereby granted, free of charge, to any person obtaining a copy of +the source files and associated documentation files ("Magick++"), to deal in +Magick++ without restriction, including without limitation of the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of Magick++, and to permit persons to whom the Magick++ is furnished to do so, +subject to the following conditions: + +This copyright notice shall be included in all copies or substantial portions +of Magick++. The copyright to Magick++ is retained by its author and shall not +be subsumed or replaced by any other copyright. + +The software is provided "as is", without warranty of any kind, express or +implied, including but not limited to the warranties of merchantability,fitness +for a particular purpose and noninfringement. In no event shall Bob Friesenhahn +be liable for any claim, damages or other liability, whether in an action of +contract, tort or otherwise, arising from, out of or in connection with +Magick++ or the use or other dealings in Magick++. + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +8. Thatcher Ulrich copyright (ImageMagick includes two fonts, + PerlMagick/t/ttf/input.ttf and PerlMagick/demo/Generic.ttf under this + copyright): + + Copyright: 2004-2007, Thatcher Ulrich + + I have placed these fonts in the Public Domain. This is all 100% my own work. + Usage is totally unrestricted. If you want to make derivative works for any + purpose, please go ahead. + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +9. Gsview copyright (ImageMagick incorporated a small portion of code from the + gsview package to locate Ghostscript under Windows. This source code is + distributed under the following license): + +Copyright (C) 2000-2002, Ghostgum Software Pty Ltd. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this file ("Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of this Software, and to permit persons to whom +this file is furnished to do so, subject to the following conditions: + +This Software is distributed with NO WARRANTY OF ANY KIND. No author or +distributor accepts any responsibility for the consequences of using it, or +for whether it serves any particular purpose or works at all, unless he or she +says so in writing. + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +10. Libsquish copyright (this copyright is limited to the compression used in + coder/dds.c, incorporated from the libsquish library): + +Copyright (c) 2006 Simon Brown si@sjbrown.co.uk + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +11. Bootstrap copyright (ImageMagick utilizes CSS for its web pages under this + copyright): + +Bootstrap v3.3.5 (http://getbootstrap.com) +Copyright 2011-2015 Twitter, Inc. +Licensed under the MIT license + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * diff --git a/ImageMagick-6.9.12-44/PerlMagick/Changelog b/ImageMagick-6.9.12-44/PerlMagick/Changelog new file mode 100644 index 0000000..88ffc35 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/Changelog @@ -0,0 +1,122 @@ +2021-01-26 6.9.11 Cristy + * if info has undefined orientation, return the image orientation. + +2021-01-16 6.9.11 Cristy + * requires ImageMagick 6.9.11 or above. + +2014-11-05 6.8.9-8 Cristy + * Add support $image->Colorspace() (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=7&t=30980). + +2014-03-18 6.8.8-9 Cristy + * Quantize() arguments global and transparent switched (reference + www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=25238). + +2011-12-25 6.7.4-2 Cristy + * Relax when PerlMagick tosses an image when an exception is thrown. + +2011-12-20 6.7.4-1 Cristy + * Use PTR2IV() and INT2PTR() macros to avoid int to ptr cast messages. + +2011-08-25 6.7.2-0 Cristy + * Fix fault for Thumbnail() with GIF animation (problem report and patch + from Shigeki Morimoto). + +2011-08-09 6.7.1-4 Cristy + * Add a simple "ignore this type" style typemap to get past a xsubpp + exception in recent versions of Perl. + +2011-06-06 6.7.0-5 Cristy + * Set modulate() colorspace predicated on parameter (e.g. brightness is HSB). + +2011-01-25 6.6.7-3 Cristy + * Verify color parameter is a Perl array to avoid seg fault (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=7&t=17928). + +2010-11-11 6.6.5-6 Cristy + * Check that image exists before accessing its member (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=2&t=17502). + +2010-11-01 6.6.5-6 Cristy + * The gravity attribute must set the ImageInfo gravity property (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=3&t=17282). + +2009-12-08 6.5.8-5 + * A couple of minor changes to Makefile.PL to support Strawberry Perl. + +2009-12-06 6.5.8-4 Cristy + * Support the crop() gravity option. + +2009-11-23 6.5.8-0 Cristy + * Add 'dither' option to Remap(). + +2009-10-18 6.5.7-0 Cristy + * Interpret gravity properly for ExtentImage(). + * Support the Modulate() method parameter, 'lightness.' + +2009-10-08 6.5.6-10 + * Improve PerlMagick.PL to work with Strawberry Perl under Windows. + +2009-08-02 6.5.4-8 Cristy + * Create a image registry to track which image objects must be cloned + when a Perl thread is created. + +2009-06-14 6.5.3-7 Anthony Thyssen + * Expand PerlMagick Composite() 'mask' merge for both compose 'displace' + and new 'distort' mapping (absolute lookup) + +2009-06-11 6.5.3-5 Anthony Thyssen + * Fixed PerlMagick Composite() for correct merging of 'mask' image into + the overlay image for Displacement Mapping Composition. + +2009-06-02 6.5.3-2 Cristy + * Fix filename parameter in Read() (e.g. $image->Read(filename=>'xc:white')). +2009-04-14 6.5.1-3 Cristy + * Support magick parameter for Read() (e.g. + $im->Read( file => $fh, magick +> 'text:' )). + +2008-11-16 6.4.4-5 Cristy + * Statistics() returns normalized values. + +2008-10-16 6.4.4-9 Michael.Kroell + * Check if Image::Magick::constant is defined in AUTOLOAD() function. + +2008-06-07 6.4.1-9 Cristy + * Permit settings of the form: + $image->Set("quantum:polarity","min-is-white"). + +2008-04-07 6.4.0-5 Cristy + * X11 regression test passed if the DISPLAY variable is not defined (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=3&t=10979). + * Make regression test, x11/write.t, exit after 8 seconds as stated (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=3&t=10979). + +2007-11-07 6.3.7-0 Cristy + * Added gravity attribute to Transform() method. + +2007-09-12 6.3.5-9 Cristy + * Added GetPixel()/SetPixel() methods. + +2007-06-22 6.3.4-2 grafman + * Add GetImagePixels to return C pointer for image cache. + * Add SyncImagePixels to sync image cache. + * Add Quantum parameter to Get API to return Quantum-Depth. + +2007-06-21 6.3.4-1 Cristy + * Add Distort. + +2007-03-20 6.3.3-3 Cristy + * Add vector-graphics parameter to the Draw() method. + + blob length was not being set properly). +2007-03-11 6.3.3-2 Cristy + * Read(blob=>$blob) and Ping(blob=>$blob) sometimes failed because the + blob length was not being set properly). + +2007-01-23 cristy + + * Add parameters fill-pattern and stroke-pattern to Annotate() and Draw(). + +2005-01-10 cristy + * Added normalize parameter to GetPixels(). Use normalize=>'true' to return + normalized pixel values. diff --git a/ImageMagick-6.9.12-44/PerlMagick/MANIFEST b/ImageMagick-6.9.12-44/PerlMagick/MANIFEST new file mode 100644 index 0000000..2b03d5b --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/MANIFEST @@ -0,0 +1,552 @@ +Changelog +check.sh.in +demo/annotate.pl +demo/button.pl +demo/compose-specials.pl +demo/composite.pl +demo/demo.pl +demo/dst.png +demo/Generic.ttf +demo/lsys.pl +demo/Makefile +demo/model.gif +demo/piddle.pl +demo/pink-flower.gif +demo/pixel-fx.pl +demo/README +demo/red-flower.gif +demo/shadow-text.pl +demo/shapes.pl +demo/single-pixels.pl +demo/smile.gif +demo/src.png +demo/steganography.pl +demo/tile.gif +demo/tree.pl +demo/Turtle.pm +demo/yellow-flower.gif +Makefile.am +Makefile.nt +Makefile.PL.in +MANIFEST +MANIFEST.SKIP +README.txt +t/blob.t +t/bzlib/input.miff +t/bzlib/read.t +t/bzlib/write.t +t/cgm/input.cgm +t/cgm/read.t +t/composite.t +t/filter.t +t/fpx/input_256.fpx +t/fpx/input_bw.fpx +t/fpx/input_grayscale.fpx +t/fpx/input_jpeg.fpx +t/fpx/input_truecolor.fpx +t/fpx/read.t +t/fpx/write.t +t/getattribute.t +t/hdf/input_256.hdf +t/hdf/input_truecolor.hdf +t/hdf/read.t +t/hdf/write.t +t/hpgl/input.hpgl +t/hpgl/read.t +t/input_16.miff +t/input_70x46.cmyk +t/input_70x46.gray +t/input_70x46.rgb +t/input_70x46.rgba +t/input_70x46.uyvy +t/input_70x46.yuv +t/input.avs +t/input.bie +t/input.bmp +t/input.bmp24 +t/input.dcx +t/input.dib +t/input.fits +t/input.gif +t/input.gif87 +t/input_gray_lsb_08bit.mat +t/input_gray_lsb_double.mat +t/input_gray_msb_08bit.mat +t/input.ico +t/input.im1 +t/input.im24 +t/input.im8 +t/input.mat +t/input.miff +t/input.mtv +t/input_p1.pbm +t/input_p2.pgm +t/input_p3.ppm +t/input_p4.pbm +t/input_p5.pgm +t/input_p6.ppm +t/input.p7 +t/input_p7.p7 +t/input.pcx +t/input.pict +t/input.psd +t/input_rgb_lsb_08bit.mat +t/input.rle +t/input.sgi +t/input.tga +t/input.tim +t/input.viff +t/input.wbmp +t/input.wpg +t/input.xbm +t/input.xpm +t/jbig/input.jbig +t/jbig/read.t +t/jbig/write.t +t/jng/input_gray_idat.jng +t/jng/input_gray_jdaa.jng +t/jng/input_gray.jng +t/jng/input_gray_prog_idat.jng +t/jng/input_gray_prog_jdaa.jng +t/jng/input_gray_prog.jng +t/jng/input_idat.jng +t/jng/input_jdaa.jng +t/jng/input_prog_idat.jng +t/jng/input_prog_jdaa.jng +t/jng/input_prog.jng +t/jng/input_rose.jng +t/jng/read.t +t/jng/write.t +t/jpeg/input.jpg +t/jpeg/input_plane.jpg +t/jpeg/read.t +t/jpeg/write.t +t/MasterImage_70x46.ppm +t/montage.t +t/mpeg/input.m2v +t/mpeg/input.mpg +t/mpeg/read.t +t/openjp2/input.jp2 +t/openjp2/input.jpc +t/openjp2/read.t +t/ping.t +t/png/input_16.png +t/png/input_256.png +t/png/input_bw.png +t/png/input.mng +t/png/input_mono.png +t/png/input_truecolor.png +t/png/read-16.t +t/png/read.t +t/png/write-16.t +t/png/write.t +t/ps/input.eps +t/ps/input.miff +t/ps/input.ps +t/ps/read.t +t/ps/write.t +t/rad/input.rad +t/rad/read.t +t/rad/write.t +t/read.t +t/reference/cgm/read.miff +t/reference/composite/Add.miff +t/reference/composite/Atop.miff +t/reference/composite/Bumpmap.miff +t/reference/composite/Clear.miff +t/reference/composite/CopyBlue.miff +t/reference/composite/CopyGreen.miff +t/reference/composite/Copy.miff +t/reference/composite/CopyOpacity.miff +t/reference/composite/CopyRed.miff +t/reference/composite/Difference.miff +t/reference/composite/In.miff +t/reference/composite/Minus.miff +t/reference/composite/Multiply.miff +t/reference/composite/Out.miff +t/reference/composite/Over.miff +t/reference/composite/Plus.miff +t/reference/composite/Rotate.miff +t/reference/composite/Subtract.miff +t/reference/composite/Xor.miff +t/reference/filter/AdaptiveThreshold.miff +t/reference/filter/Annotate.miff +t/reference/filter/Blur.miff +t/reference/filter/Border.miff +t/reference/filter/Channel.miff +t/reference/filter/Charcoal.miff +t/reference/filter/Chop.miff +t/reference/filter/ColorFloodfill.miff +t/reference/filter/Colorize.miff +t/reference/filter/Contrast.miff +t/reference/filter/Convolve.miff +t/reference/filter/Crop.miff +t/reference/filter/Despeckle.miff +t/reference/filter/Draw.miff +t/reference/filter/Edge.miff +t/reference/filter/Emboss.miff +t/reference/filter/Equalize.miff +t/reference/filter/Flip.miff +t/reference/filter/Flop.miff +t/reference/filter/Frame.miff +t/reference/filter/Gamma.miff +t/reference/filter/GaussianBlur.miff +t/reference/filter/Implode.miff +t/reference/filter/Level.miff +t/reference/filter/Magnify.miff +t/reference/filter/MatteFloodfill.miff +t/reference/filter/MedianFilter.miff +t/reference/filter/Minify.miff +t/reference/filter/Modulate.miff +t/reference/filter/MotionBlur.miff +t/reference/filter/Negate.miff +t/reference/filter/Normalize.miff +t/reference/filter/OilPaint.miff +t/reference/filter/Opaque.miff +t/reference/filter/Quantize.miff +t/reference/filter/QuantizeMono.miff +t/reference/filter/RadialBlur.miff +t/reference/filter/Raise.miff +t/reference/filter/ReduceNoise.miff +t/reference/filter/Resize.miff +t/reference/filter/Roll.miff +t/reference/filter/Rotate.miff +t/reference/filter/Sample.miff +t/reference/filter/Scale.miff +t/reference/filter/Segment.miff +t/reference/filter/Set.miff +t/reference/filter/Shade.miff +t/reference/filter/Sharpen.miff +t/reference/filter/Shave.miff +t/reference/filter/Shear.miff +t/reference/filter/SigmoidalContrast.miff +t/reference/filter/Solarize.miff +t/reference/filter/Swirl.miff +t/reference/filter/Threshold.miff +t/reference/filter/Trim.miff +t/reference/filter/UnsharpMask.miff +t/reference/filter/Wave.miff +t/reference/jng/gray_idat_tmp.miff +t/reference/jng/gray_jdaa_tmp.miff +t/reference/jng/gray_prog_idat_tmp.miff +t/reference/jng/gray_prog_jdaa_tmp.miff +t/reference/jng/gray_prog_tmp.miff +t/reference/jng/gray_tmp.miff +t/reference/jng/idat_tmp.miff +t/reference/jng/input_gray_idat.miff +t/reference/jng/input_gray_jdaa.miff +t/reference/jng/input_gray.miff +t/reference/jng/input_gray_prog_idat.miff +t/reference/jng/input_gray_prog_jdaa.miff +t/reference/jng/input_gray_prog.miff +t/reference/jng/input_idat.miff +t/reference/jng/input_jdaa.miff +t/reference/jng/input_prog_idat.miff +t/reference/jng/input_prog_jdaa.miff +t/reference/jng/input_prog.miff +t/reference/jng/input_rose.miff +t/reference/jng/jdaa_tmp.miff +t/reference/jng/prog_idat_tmp.miff +t/reference/jng/prog_jdaa_tmp.miff +t/reference/jng/prog_tmp.miff +t/reference/jng/read_gray_idat.miff +t/reference/jng/read_gray_jdaa.miff +t/reference/jng/read_gray.miff +t/reference/jng/read_gray_prog_idat.miff +t/reference/jng/read_gray_prog_jdaa.miff +t/reference/jng/read_gray_prog.miff +t/reference/jng/read_idat.miff +t/reference/jng/read_jdaa.miff +t/reference/jng/read_prog_idat.miff +t/reference/jng/read_prog_jdaa.miff +t/reference/jng/read_prog.miff +t/reference/jng/write_gray_idat.miff +t/reference/jng/write_gray_jdaa.miff +t/reference/jng/write_gray.miff +t/reference/jng/write_gray_prog_idat.miff +t/reference/jng/write_gray_prog_jdaa.miff +t/reference/jng/write_gray_prog.miff +t/reference/jng/write_idat.miff +t/reference/jng/write_jdaa.miff +t/reference/jng/write_prog_idat.miff +t/reference/jng/write_prog_jdaa.miff +t/reference/jng/write_prog.miff +t/reference/jpeg/read_non_interlaced.miff +t/reference/jpeg/read_plane_interlaced.miff +t/reference/jpeg/write_non_interlaced.miff +t/reference/jpeg/write_plane_interlaced.miff +t/reference/openjp2/read_jp2.miff +t/reference/openjp2/read_jpc.miff +t/reference/read/gradient.miff +t/reference/read/granite.miff +t/reference/read/input_avs.miff +t/reference/read/input_bmp24.miff +t/reference/read/input_bmp.miff +t/reference/read/input_cmyk.miff +t/reference/read/input_dcx.miff +t/reference/read/input_dib.miff +t/reference/read/input_fits.miff +t/reference/read/input_gif87.miff +t/reference/read/input_gif.miff +t/reference/read/input_gray_lsb_08bit_mat.miff +t/reference/read/input_gray_lsb_double_mat.miff +t/reference/read/input_gray.miff +t/reference/read/input_gray_msb_08bit_mat.miff +t/reference/read/input_ico.miff +t/reference/read/input_im1.miff +t/reference/read/input_im24.miff +t/reference/read/input_im8.miff +t/reference/read/input_mat.miff +t/reference/read/input_miff.miff +t/reference/read/input_mtv.miff +t/reference/read/input_null_black.miff +t/reference/read/input_null_DarkOrange.miff +t/reference/read/input_null_white.miff +t/reference/read/input_p7.miff +t/reference/read/input_pbm_p1.miff +t/reference/read/input_pbm_p4.miff +t/reference/read/input_pcx.miff +t/reference/read/input_pgm_p2.miff +t/reference/read/input_pgm_p5.miff +t/reference/read/input_pict.miff +t/reference/read/input_ppm_p3.miff +t/reference/read/input_ppm_p6.miff +t/reference/read/input_psd.miff +t/reference/read/input_rgba.miff +t/reference/read/input_rgb_lsb_08bit_mat.miff +t/reference/read/input_rgb.miff +t/reference/read/input_rle.miff +t/reference/read/input_sgi.miff +t/reference/read/input_tga.miff +t/reference/read/input_tile.miff +t/reference/read/input_tim.miff +t/reference/read/input_uyvy.miff +t/reference/read/input_viff.miff +t/reference/read/input_wbmp.miff +t/reference/read/input_wpg.miff +t/reference/read/input_xbm.miff +t/reference/read/input_xc_black.miff +t/reference/read/input_xpm.miff +t/reference/read/input_xwd.miff +t/reference/ttf/annotate.miff +t/reference/ttf/label.miff +t/reference/ttf/read.miff +t/reference/wmf/clock.miff +t/reference/wmf/wizard.miff +t/reference/write/cgm/read.miff +t/reference/write/composite/Add.miff +t/reference/write/composite/Atop.miff +t/reference/write/composite/Bumpmap.miff +t/reference/write/composite/Clear.miff +t/reference/write/composite/CopyBlue.miff +t/reference/write/composite/CopyGreen.miff +t/reference/write/composite/Copy.miff +t/reference/write/composite/CopyOpacity.miff +t/reference/write/composite/CopyRed.miff +t/reference/write/composite/Difference.miff +t/reference/write/composite/In.miff +t/reference/write/composite/Minus.miff +t/reference/write/composite/Multiply.miff +t/reference/write/composite/Out.miff +t/reference/write/composite/Over.miff +t/reference/write/composite/Plus.miff +t/reference/write/composite/Rotate.miff +t/reference/write/composite/Subtract.miff +t/reference/write/composite/Xor.miff +t/reference/write/filter/AdaptiveThreshold.miff +t/reference/write/filter/Annotate.miff +t/reference/write/filter/Blur.miff +t/reference/write/filter/Border.miff +t/reference/write/filter/Channel.miff +t/reference/write/filter/Charcoal.miff +t/reference/write/filter/Chop.miff +t/reference/write/filter/ColorFloodfill.miff +t/reference/write/filter/Colorize.miff +t/reference/write/filter/Contrast.miff +t/reference/write/filter/Convolve.miff +t/reference/write/filter/Crop.miff +t/reference/write/filter/Despeckle.miff +t/reference/write/filter/Draw.miff +t/reference/write/filter/Edge.miff +t/reference/write/filter/Emboss.miff +t/reference/write/filter/Equalize.miff +t/reference/write/filter/Flip.miff +t/reference/write/filter/Flop.miff +t/reference/write/filter/Frame.miff +t/reference/write/filter/Gamma.miff +t/reference/write/filter/GaussianBlur.miff +t/reference/write/filter/Implode.miff +t/reference/write/filter/Level.miff +t/reference/write/filter/Magnify.miff +t/reference/write/filter/MatteFloodfill.miff +t/reference/write/filter/MedianFilter.miff +t/reference/write/filter/Minify.miff +t/reference/write/filter/Modulate.miff +t/reference/write/filter/MotionBlur.miff +t/reference/write/filter/Negate.miff +t/reference/write/filter/Normalize.miff +t/reference/write/filter/OilPaint.miff +t/reference/write/filter/Opaque.miff +t/reference/write/filter/Quantize.miff +t/reference/write/filter/RadialBlur.miff +t/reference/write/filter/Raise.miff +t/reference/write/filter/ReduceNoise.miff +t/reference/write/filter/Resize.miff +t/reference/write/filter/Roll.miff +t/reference/write/filter/Rotate.miff +t/reference/write/filter/Sample.miff +t/reference/write/filter/Scale.miff +t/reference/write/filter/Segment.miff +t/reference/write/filter/Set.miff +t/reference/write/filter/Shade.miff +t/reference/write/filter/Sharpen.miff +t/reference/write/filter/Shave.miff +t/reference/write/filter/Shear.miff +t/reference/write/filter/SigmoidalContrast.miff +t/reference/write/filter/Solarize.miff +t/reference/write/filter/Swirl.miff +t/reference/write/filter/Threshold.miff +t/reference/write/filter/Trim.miff +t/reference/write/filter/UnsharpMask.miff +t/reference/write/filter/Wave.miff +t/reference/write/jng/gray_idat_tmp.miff +t/reference/write/jng/gray_jdaa_tmp.miff +t/reference/write/jng/gray_prog_idat_tmp.miff +t/reference/write/jng/gray_prog_jdaa_tmp.miff +t/reference/write/jng/gray_prog_tmp.miff +t/reference/write/jng/gray_tmp.miff +t/reference/write/jng/idat_tmp.miff +t/reference/write/jng/input_gray_idat.miff +t/reference/write/jng/input_gray_jdaa.miff +t/reference/write/jng/input_gray.miff +t/reference/write/jng/input_gray_prog_idat.miff +t/reference/write/jng/input_gray_prog_jdaa.miff +t/reference/write/jng/input_gray_prog.miff +t/reference/write/jng/input_idat.miff +t/reference/write/jng/input_jdaa.miff +t/reference/write/jng/input_prog_idat.miff +t/reference/write/jng/input_prog_jdaa.miff +t/reference/write/jng/input_prog.miff +t/reference/write/jng/input_rose.miff +t/reference/write/jng/jdaa_tmp.miff +t/reference/write/jng/prog_idat_tmp.miff +t/reference/write/jng/prog_jdaa_tmp.miff +t/reference/write/jng/prog_tmp.miff +t/reference/write/jng/read_gray_idat.miff +t/reference/write/jng/read_gray_jdaa.miff +t/reference/write/jng/read_gray.miff +t/reference/write/jng/read_gray_prog_idat.miff +t/reference/write/jng/read_gray_prog_jdaa.miff +t/reference/write/jng/read_gray_prog.miff +t/reference/write/jng/read_idat.miff +t/reference/write/jng/read_jdaa.miff +t/reference/write/jng/read_prog_idat.miff +t/reference/write/jng/read_prog_jdaa.miff +t/reference/write/jng/read_prog.miff +t/reference/write/jng/write_gray_idat.miff +t/reference/write/jng/write_gray_jdaa.miff +t/reference/write/jng/write_gray.miff +t/reference/write/jng/write_gray_prog_idat.miff +t/reference/write/jng/write_gray_prog_jdaa.miff +t/reference/write/jng/write_gray_prog.miff +t/reference/write/jng/write_idat.miff +t/reference/write/jng/write_jdaa.miff +t/reference/write/jng/write_prog_idat.miff +t/reference/write/jng/write_prog_jdaa.miff +t/reference/write/jng/write_prog.miff +t/reference/write/jp2/read_jp2.miff +t/reference/write/jp2/read_jpc.miff +t/reference/write/jp2/read_pgx.miff +t/reference/write/jpeg/read_non_interlaced.miff +t/reference/write/jpeg/read_plane_interlaced.miff +t/reference/write/jpeg/write_non_interlaced.miff +t/reference/write/jpeg/write_plane_interlaced.miff +t/reference/write/read/gradient.miff +t/reference/write/read/granite.miff +t/reference/write/read/input_avs.miff +t/reference/write/read/input_bmp24.miff +t/reference/write/read/input_bmp.miff +t/reference/write/read/input_cmyk.miff +t/reference/write/read/input_dcx.miff +t/reference/write/read/input_dib.miff +t/reference/write/read/input_fits.miff +t/reference/write/read/input_gif87.miff +t/reference/write/read/input_gif.miff +t/reference/write/read/input_gray.miff +t/reference/write/read/input_ico.miff +t/reference/write/read/input_im1.miff +t/reference/write/read/input_im24.miff +t/reference/write/read/input_im8.miff +t/reference/write/read/input_mat.miff +t/reference/write/read/input_miff.miff +t/reference/write/read/input_mtv.miff +t/reference/write/read/input_null_black.miff +t/reference/write/read/input_null_DarkOrange.miff +t/reference/write/read/input_null_white.miff +t/reference/write/read/input_p7.miff +t/reference/write/read/input_pbm_p1.miff +t/reference/write/read/input_pbm_p4.miff +t/reference/write/read/input_pcx.miff +t/reference/write/read/input_pgm_p2.miff +t/reference/write/read/input_pgm_p5.miff +t/reference/write/read/input_pict.miff +t/reference/write/read/input_ppm_p3.miff +t/reference/write/read/input_ppm_p6.miff +t/reference/write/read/input_psd.miff +t/reference/write/read/input_rgba.miff +t/reference/write/read/input_rgb.miff +t/reference/write/read/input_rle.miff +t/reference/write/read/input_sgi.miff +t/reference/write/read/input_tga.miff +t/reference/write/read/input_tile.miff +t/reference/write/read/input_tim.miff +t/reference/write/read/input_uyvy.miff +t/reference/write/read/input_viff.miff +t/reference/write/read/input_wbmp.miff +t/reference/write/read/input_wpg.miff +t/reference/write/read/input_xbm.miff +t/reference/write/read/input_xc_black.miff +t/reference/write/read/input_xpm.miff +t/reference/write/read/input_xwd.miff +t/reference/write/ttf/annotate.miff +t/reference/write/ttf/label.miff +t/reference/write/ttf/read.miff +t/reference/write/wmf/clock.miff +t/reference/write/wmf/wizard.miff +t/setattribute.t +t/subroutines.pl +t/tiff/input_16_matte.tiff +t/tiff/input_16.tiff +t/tiff/input_256_matte.tiff +t/tiff/input_256_planar_contig.tiff +t/tiff/input_256_planar_separate.tiff +t/tiff/input_256.tiff +t/tiff/input_gray_12bit.tiff +t/tiff/input_gray_16bit.tiff +t/tiff/input_gray_4bit_matte.tiff +t/tiff/input_gray_4bit.tiff +t/tiff/input_gray_8bit_matte.tiff +t/tiff/input_gray_8bit.tiff +t/tiff/input_mono.tiff +t/tiff/input_truecolor_16.tiff +t/tiff/input_truecolor_stripped.tiff +t/tiff/input_truecolor.tiff +t/tiff/input_truecolor_tiled32x32.tiff +t/tiff/read.t +t/tiff/write.t +t/ttf/input.ttf +t/ttf/read.t +t/wmf/clock.wmf +t/wmf/read.t +t/wmf/wizard.wmf +t/write.t +t/x11/congrats.fig +t/x11/congrats.miff +t/x11/input.xwd +t/x11/read.t +t/x11/write.t +t/xfig/input.fig +t/xfig/read.t +t/zlib/input.miff +t/zlib/read.t +t/zlib/write.t diff --git a/ImageMagick-6.9.12-44/PerlMagick/MANIFEST.SKIP b/ImageMagick-6.9.12-44/PerlMagick/MANIFEST.SKIP new file mode 100644 index 0000000..a497278 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/MANIFEST.SKIP @@ -0,0 +1,16 @@ +.*\.gdbinit$ +.*core$ +/output.*$ +/test_.+_out\..+$ +Magick\.bs$ +Magick\.c$ +Magick\.o$ +\.bak$ +\.svn$ +\.old$ +^MANIFEST\. +^MakeMaker-\d +^Makefile$ +^blib/ +^pm_to_blib$ +~$ diff --git a/ImageMagick-6.9.12-44/PerlMagick/Makefile.PL b/ImageMagick-6.9.12-44/PerlMagick/Makefile.PL new file mode 100644 index 0000000..abf1aa1 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/Makefile.PL @@ -0,0 +1,271 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Exercise all regression tests: +# +# make test +# +# Exersise one regression test: +# +# make TEST_VERBOSE=1 TEST_FILES=t/filter.t test +# + +use ExtUtils::MakeMaker; +use Config; +use File::Spec::Functions qw/catfile catdir devnull catpath splitpath/; +use Cwd; + +sub AutodetectWin32gcc { + my $wrkdir = getcwd(); + my $devnull = devnull(); + + my @incdir = (); + my @libdir = ($wrkdir); + my @bindir = (); + + #try to get configuration info via identify or convert utilities + my $conf = `identify -list Configure 2>$devnull` || `convert -list Configure 2>$devnull`; + foreach my $line (split '\n', $conf) { + if ($line =~ /^Path:\s+(.*)/) { + my ($vol,$dir,$file) = splitpath($1); + next unless $dir; + my $dirpath = catpath( $vol, $dir); + my (@l,@b,@i) = ( (),(),() ); + + # try to detect 'lib' dir + push @l, catfile($dirpath,'lib'); + push @l, catfile($dirpath,'..','lib'); + push @l, catfile($dirpath,'..','..','lib'); + push @l, catfile($dirpath,'..','..','..','lib'); + foreach (@l) { push @libdir, $_ if (-d $_) }; + + # try to detect 'bin' dir + push @b, catfile($dirpath); + push @b, catfile($dirpath,'bin'); + push @b, catfile($dirpath,'..'); + push @b, catfile($dirpath,'..','bin'); + push @b, catfile($dirpath,'..','..'); + push @b, catfile($dirpath,'..','..','bin'); + push @b, catfile($dirpath,'..','..','..'); + push @b, catfile($dirpath,'..','..','..','bin'); + foreach (@b) { push @bindir, $_ if (-e "$_/convert.exe" || -e "$_/identify.exe") }; + + # try to detect 'include' dir + push @i, catfile($dirpath,'include'); + push @i, catfile($dirpath,'include','ImageMagick'); + push @i, catfile($dirpath,'..','include'); + push @i, catfile($dirpath,'..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','include'); + push @i, catfile($dirpath,'..','..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','..','include'); + push @i, catfile($dirpath,'..','..','..','include','ImageMagick'); + foreach (@i) { push @incdir, $_ if (-e "$_/magick/MagickCore.h") }; + } + }; + + foreach my $bin (@bindir) { + opendir(my $bindir, $bin) or die qq{Cannot opendir $bin: $!}; + my @dlls = map {catfile($bin, $_)} grep /^\S*magick[^\+]\S*?\.dll$/i, readdir $bindir; + foreach my $d (@dlls) { + unlink "$wrkdir/libMagickCore.def", "$wrkdir/libMagickCore.a"; + system("pexports \"$d\" >\"$wrkdir/libMagickCore.def\" 2>$devnull"); + open(DEF, "<$wrkdir/libMagickCore.def"); + my @found = grep(/MagickCoreGenesis/, ); #checking if we have taken the right DLL + close(DEF); + next unless(@found); + print STDERR "Gonna create 'libMagickCore.a' from '$d'\n"; + system("dlltool -D \"$d\" -d \"$wrkdir/libMagickCore.def\" -l \"$wrkdir/libMagickCore.a\" 2>$devnull"); + last if -s "$wrkdir/libMagickCore.a"; + } + last if -s "$wrkdir/libMagickCore.a"; + } + + unless(@incdir && @libdir && @bindir && (-s "$wrkdir/libMagickCore.a")) { + print STDERR <$devnull` || `convert -list Configure 2>$devnull`; + my @delegates = (); + foreach my $line (split '\n', $conf) { + next unless $line =~ /^DELEGATES\s+/; + (undef, @delegates) = split /\s+/, $line; + last; + }; + return @delegates; +} + +# Compute test specification +my $delegate_tests='t/*.t'; +my @tested_delegates = qw/bzlib djvu fftw fontconfig freetype jpeg jng openjp2 lcms png rsvg tiff x11 xml wmf zlib/; +my @supported_delegates = AutodetectDelegates(); +# find the intersection of tested and supported delegates +my %seen_delegates = (); +$seen_delegates{$_}++ for @supported_delegates; +foreach my $delegate (@tested_delegates) { + if ( $seen_delegates{$delegate} ) { + if ( -d "t/$delegate" ) { + if ( defined($ENV{'DISPLAY'}) && ($^O ne 'MSWin32') ) { + if ( defined $ENV{'DISPLAY'} ) { + $delegate_tests .= " t/$delegate/*.t"; + } + next; + } + $delegate_tests .= " t/$delegate/*.t"; + } + } +} + +# defaults for LIBS & INC & CCFLAGS params that we later pass to Writemakefile +my $INC_magick = '-I../ -I.. -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -I"' . $Config{'usrinc'} . '/ImageMagick"'; +my $LIBS_magick = '-L../magick/.libs -lMagickCore-6.Q16 -lm -L' . $Config{'archlib'} . '/CORE'; +my $CCFLAGS_magick = "$Config{'ccflags'} -I/usr/include/libxml2 -I/usr/include/libraw -I/usr/include/libpng16 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/uuid -I/usr/include/harfbuzz -I/usr/include/OpenEXR -pthread -I/usr/include/openjpeg-2.4 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/fribidi -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/uuid -pthread -fopenmp -Wall -g -O2 -mtune=amdfam10 -fexceptions -pthread -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16"; +my $LDFLAGS_magick = "-L../magick/.libs -lMagickCore-6.Q16 $Config{'ldflags'} "; +my $LDDLFLAGS_magick = "-L../magick/.libs -lMagickCore-6.Q16 $Config{'lddlflags'} "; + +if (($^O eq 'MSWin32') && ($Config{cc} =~ /gcc/)) { + my($Ipaths, $Lpaths) = AutodetectWin32gcc(); + + # + # Setup for strawberry perl. + # + $INC_magick = "$Ipaths"; + $LIBS_magick = "-lMagickCore-6.Q16"; + $CCFLAGS_magick = "$Config{'ccflags'}"; + $LDFLAGS_magick = "$Config{'ldflags'} $Lpaths "; + $LDDLFLAGS_magick = "$Config{'lddlflags'} $Lpaths "; +} + +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile + ( + # Module description + 'ABSTRACT' => 'ImageMagick PERL Extension', + + # Perl module name is Image::Magick + 'NAME' => 'Image::Magick', + + # Module author + 'AUTHOR' => 'ImageMagick Studio LLC', + + # Module version + 'VERSION' => '6.9.12', + + # Prerequisite version + 'PREREQ_PM' => {'parent' => '0'}, + + # Preprocessor defines + 'DEFINE' => ' -D_LARGE_FILES=1 -DHAVE_CONFIG_H', # e.g., '-DHAVE_SOMETHING' + + # Header search specfication and preprocessor flags + 'INC' => $INC_magick, + + # C compiler + #'CC' => 'gcc', + + # C pre-processor flags (e.g. -I & -D options) + # 'CPPFLAGS' => "$Config{'cppflags'} -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 ", + + # C compiler flags (e.g. -O -g) + 'CCFLAGS' => $CCFLAGS_magick, + + # Linker + #'LD' => $Config{'ld'} == $Config{'cc'} ? 'gcc' : $Config{'ld'}, + + # Linker flags for building an executable + 'LDFLAGS' => $LDFLAGS_magick, + + # Linker flags for building a dynamically loadable module + 'LDDLFLAGS' => $LDDLFLAGS_magick, + + # Install PerlMagick binary into ImageMagick bin directory + 'INSTALLBIN' => '/usr/bin', + + # Library specification + 'LIBS' => [ $LIBS_magick ], + + # Perl binary name (if a Perl binary is built) + 'MAP_TARGET' => 'PerlMagick', + + # Let CFLAGS drive optimization flags by setting OPTIMIZE to empty + # 'OPTIMIZE' => '', + + # Use same compiler as ImageMagick + 'PERLMAINCC' => ' -fopenmp', + 'AR' => 'ar', + 'LD' => '', + + # Set Perl installation prefix to ImageMagick installation prefix +# 'PREFIX' => '/usr', + + # Include delegate directories in tests + test => { TESTS => $delegate_tests}, + + ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()), + + # sane version + depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' } +); + + +# +# Substitutions for "makeaperl" section. +# +sub MY::makeaperl { + package MY; # so that "SUPER" works right + my $inherited = shift->SUPER::makeaperl(@_); + + # Stinky ExtUtils::MM_Unix likes to append its own library path to $(CC), + # prior to any user-specified library path so that an installed library is + # used rather than the library just built. This substitution function + # tries to insert our library path first. Also, use the same compiler used + # to build perlmain.c to link so that a C++ compiler may be used if + # necessary. + $inherited =~ s:MAP_LINKCMD\s.*\s*\$\(CC\):MAP_LINKCMD = \$(PERLMAINCC) -L/usr/lib64: ; + $inherited; + } diff --git a/ImageMagick-6.9.12-44/PerlMagick/Makefile.PL.in b/ImageMagick-6.9.12-44/PerlMagick/Makefile.PL.in new file mode 100644 index 0000000..65081fa --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/Makefile.PL.in @@ -0,0 +1,271 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Exercise all regression tests: +# +# make test +# +# Exersise one regression test: +# +# make TEST_VERBOSE=1 TEST_FILES=t/filter.t test +# + +use ExtUtils::MakeMaker; +use Config; +use File::Spec::Functions qw/catfile catdir devnull catpath splitpath/; +use Cwd; + +sub AutodetectWin32gcc { + my $wrkdir = getcwd(); + my $devnull = devnull(); + + my @incdir = (); + my @libdir = ($wrkdir); + my @bindir = (); + + #try to get configuration info via identify or convert utilities + my $conf = `identify -list Configure 2>$devnull` || `convert -list Configure 2>$devnull`; + foreach my $line (split '\n', $conf) { + if ($line =~ /^Path:\s+(.*)/) { + my ($vol,$dir,$file) = splitpath($1); + next unless $dir; + my $dirpath = catpath( $vol, $dir); + my (@l,@b,@i) = ( (),(),() ); + + # try to detect 'lib' dir + push @l, catfile($dirpath,'lib'); + push @l, catfile($dirpath,'..','lib'); + push @l, catfile($dirpath,'..','..','lib'); + push @l, catfile($dirpath,'..','..','..','lib'); + foreach (@l) { push @libdir, $_ if (-d $_) }; + + # try to detect 'bin' dir + push @b, catfile($dirpath); + push @b, catfile($dirpath,'bin'); + push @b, catfile($dirpath,'..'); + push @b, catfile($dirpath,'..','bin'); + push @b, catfile($dirpath,'..','..'); + push @b, catfile($dirpath,'..','..','bin'); + push @b, catfile($dirpath,'..','..','..'); + push @b, catfile($dirpath,'..','..','..','bin'); + foreach (@b) { push @bindir, $_ if (-e "$_/convert.exe" || -e "$_/identify.exe") }; + + # try to detect 'include' dir + push @i, catfile($dirpath,'include'); + push @i, catfile($dirpath,'include','ImageMagick'); + push @i, catfile($dirpath,'..','include'); + push @i, catfile($dirpath,'..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','include'); + push @i, catfile($dirpath,'..','..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','..','include'); + push @i, catfile($dirpath,'..','..','..','include','ImageMagick'); + foreach (@i) { push @incdir, $_ if (-e "$_/magick/MagickCore.h") }; + } + }; + + foreach my $bin (@bindir) { + opendir(my $bindir, $bin) or die qq{Cannot opendir $bin: $!}; + my @dlls = map {catfile($bin, $_)} grep /^\S*magick[^\+]\S*?\.dll$/i, readdir $bindir; + foreach my $d (@dlls) { + unlink "$wrkdir/libMagickCore.def", "$wrkdir/libMagickCore.a"; + system("pexports \"$d\" >\"$wrkdir/libMagickCore.def\" 2>$devnull"); + open(DEF, "<$wrkdir/libMagickCore.def"); + my @found = grep(/MagickCoreGenesis/, ); #checking if we have taken the right DLL + close(DEF); + next unless(@found); + print STDERR "Gonna create 'libMagickCore.a' from '$d'\n"; + system("dlltool -D \"$d\" -d \"$wrkdir/libMagickCore.def\" -l \"$wrkdir/libMagickCore.a\" 2>$devnull"); + last if -s "$wrkdir/libMagickCore.a"; + } + last if -s "$wrkdir/libMagickCore.a"; + } + + unless(@incdir && @libdir && @bindir && (-s "$wrkdir/libMagickCore.a")) { + print STDERR <$devnull` || `convert -list Configure 2>$devnull`; + my @delegates = (); + foreach my $line (split '\n', $conf) { + next unless $line =~ /^DELEGATES\s+/; + (undef, @delegates) = split /\s+/, $line; + last; + }; + return @delegates; +} + +# Compute test specification +my $delegate_tests='t/*.t'; +my @tested_delegates = qw/bzlib djvu fftw fontconfig freetype jpeg jng openjp2 lcms png rsvg tiff x11 xml wmf zlib/; +my @supported_delegates = AutodetectDelegates(); +# find the intersection of tested and supported delegates +my %seen_delegates = (); +$seen_delegates{$_}++ for @supported_delegates; +foreach my $delegate (@tested_delegates) { + if ( $seen_delegates{$delegate} ) { + if ( -d "t/$delegate" ) { + if ( defined($ENV{'DISPLAY'}) && ($^O ne 'MSWin32') ) { + if ( defined $ENV{'DISPLAY'} ) { + $delegate_tests .= " t/$delegate/*.t"; + } + next; + } + $delegate_tests .= " t/$delegate/*.t"; + } + } +} + +# defaults for LIBS & INC & CCFLAGS params that we later pass to Writemakefile +my $INC_magick = '-I../ -I@top_srcdir@ @CPPFLAGS@ -I"' . $Config{'usrinc'} . '/ImageMagick"'; +my $LIBS_magick = '-L../magick/.libs -lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ @MATH_LIBS@ -L' . $Config{'archlib'} . '/CORE'; +my $CCFLAGS_magick = "$Config{'ccflags'} @CFLAGS@"; +my $LDFLAGS_magick = "-L../magick/.libs -lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ $Config{'ldflags'} @LDFLAGS@"; +my $LDDLFLAGS_magick = "-L../magick/.libs -lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ $Config{'lddlflags'} @LDFLAGS@"; + +if (($^O eq 'MSWin32') && ($Config{cc} =~ /gcc/)) { + my($Ipaths, $Lpaths) = AutodetectWin32gcc(); + + # + # Setup for strawberry perl. + # + $INC_magick = "$Ipaths"; + $LIBS_magick = "-lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@"; + $CCFLAGS_magick = "$Config{'ccflags'}"; + $LDFLAGS_magick = "$Config{'ldflags'} $Lpaths "; + $LDDLFLAGS_magick = "$Config{'lddlflags'} $Lpaths "; +} + +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile + ( + # Module description + 'ABSTRACT' => 'ImageMagick PERL Extension', + + # Perl module name is Image::Magick + 'NAME' => 'Image::Magick', + + # Module author + 'AUTHOR' => 'ImageMagick Studio LLC', + + # Module version + 'VERSION' => '@PACKAGE_BASE_VERSION@', + + # Prerequisite version + 'PREREQ_PM' => {'parent' => '0'}, + + # Preprocessor defines + 'DEFINE' => '@LFS_CPPFLAGS@ @DEFS@', # e.g., '-DHAVE_SOMETHING' + + # Header search specfication and preprocessor flags + 'INC' => $INC_magick, + + # C compiler + #'CC' => '@CC@', + + # C pre-processor flags (e.g. -I & -D options) + # 'CPPFLAGS' => "$Config{'cppflags'} @CPPFLAGS@", + + # C compiler flags (e.g. -O -g) + 'CCFLAGS' => $CCFLAGS_magick, + + # Linker + #'LD' => $Config{'ld'} == $Config{'cc'} ? '@CC@' : $Config{'ld'}, + + # Linker flags for building an executable + 'LDFLAGS' => $LDFLAGS_magick, + + # Linker flags for building a dynamically loadable module + 'LDDLFLAGS' => $LDDLFLAGS_magick, + + # Install PerlMagick binary into ImageMagick bin directory + 'INSTALLBIN' => '@BIN_DIR@', + + # Library specification + 'LIBS' => [ $LIBS_magick ], + + # Perl binary name (if a Perl binary is built) + 'MAP_TARGET' => 'PerlMagick', + + # Let CFLAGS drive optimization flags by setting OPTIMIZE to empty + # 'OPTIMIZE' => '', + + # Use same compiler as ImageMagick + 'PERLMAINCC' => '@PERLMAINCC@ @OPENMP_CFLAGS@', + 'AR' => '@AR@', + 'LD' => '@PERLMAINCC@', + + # Set Perl installation prefix to ImageMagick installation prefix +# 'PREFIX' => '@prefix@', + + # Include delegate directories in tests + test => { TESTS => $delegate_tests}, + + ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()), + + # sane version + depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' } +); + + +# +# Substitutions for "makeaperl" section. +# +sub MY::makeaperl { + package MY; # so that "SUPER" works right + my $inherited = shift->SUPER::makeaperl(@_); + + # Stinky ExtUtils::MM_Unix likes to append its own library path to $(CC), + # prior to any user-specified library path so that an installed library is + # used rather than the library just built. This substitution function + # tries to insert our library path first. Also, use the same compiler used + # to build perlmain.c to link so that a C++ compiler may be used if + # necessary. + $inherited =~ s:MAP_LINKCMD\s.*\s*\$\(CC\):MAP_LINKCMD = \$(PERLMAINCC) -L@MAGICKCORE_PATH@: ; + $inherited; + } diff --git a/ImageMagick-6.9.12-44/PerlMagick/Makefile.am b/ImageMagick-6.9.12-44/PerlMagick/Makefile.am new file mode 100644 index 0000000..c17be69 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/Makefile.am @@ -0,0 +1,138 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright (C) 2003 - 2008 GraphicsMagick Group +# +# Makefile for building PerlMagick. + +# If source files missing, see if they can be obtained via VPATH + +$(PERLMAGICK)/quantum/@MAGICK_ABI_SUFFIX@.xs: $(PERLMAGICK)/quantum/quantum.xs + $(AM_V_GEN) $(LN_S) quantum.xs $@ + +$(PERLMAGICK)/quantum/@MAGICK_ABI_SUFFIX@.pm: $(PERLMAGICK)/quantum/quantum.pm + $(AM_V_GEN) $(LN_S) quantum.pm $@ + +perl-quantum-sources: $(PERLMAGICK)/quantum/@MAGICK_ABI_SUFFIX@.xs $(PERLMAGICK)/quantum/@MAGICK_ABI_SUFFIX@.pm + +perl-sources: perl-quantum-sources + @if test -n "$(VPATH)" ; then \ + echo "Linking PerlMagick Sources ..." ; \ + imagemagick=`(cd $(VPATH) ; pwd)` && \ + ( cd $(PERLMAGICK) && \ + sh $$imagemagick/config/lndir.sh $$imagemagick/$(PERLMAGICK) ; ) \ + fi ; \ + touch perl-sources + +if WITH_PERL + +PERLMAGICK=PerlMagick +PERLMAKEMAKER=$(PERLMAGICK)/Makefile.PL +PERLMAKEFILE=$(PERLMAGICK)/Makefile + +PERLMAGICK_ALL_LOCAL_TARGETS = all-perl +PERLMAGICK_INSTALL_EXEC_LOCAL_TARGETS = install-exec-perl +PERLMAGICK_INSTALL_DATA_LOCAL_TARGETS = +PERLMAGICK_UNINSTALL_LOCAL_TARGETS = uninstall-exec-perl +PERLMAGICK_CLEAN_LOCAL_TARGETS = clean-perl +PERLMAGICK_DISTCLEAN_LOCAL_TARGETS = clean-perl +PERLMAGICK_MAINTAINER_CLEAN_LOCAL_TARGETS = distclean-local +PERLMAGICK_TESTS = PerlMagick/check.sh + +if WITH_PERL_DYNAMIC + +PERLMAGICK_CHECKSCRPTS = + +$(PERLMAKEFILE): perl-sources $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(PERLMAKEMAKER) + cd $(PERLMAGICK) && @PERL@ Makefile.PL $(PERL_MAKE_OPTIONS) + +install-exec-perl: $(PERLMAKEFILE) + ( cd $(PERLMAGICK) && $(MAKE) CC='@CC@' && \ + $(MAKE) CC='@CC@' install ) + +all-perl: perl-sources + +uninstall-exec-perl: $(PERLMAKEFILE) + echo "Uninstall not supported for PerlMagick" + +check-perl: $(PERLMAKEFILE) + cd $(PERLMAGICK) && $(abs_top_builddir)/magick.sh $(MAKE) CC='@CC@' test + +perl-build: $(PERLMAKEFILE) + ( cd $(PERLMAGICK) && $(MAKE) CC='@CC@' ) + +else +if WITH_PERL_STATIC + +PERLSTATICNAME=PerlMagick + +PERLMAGICK_CHECKSCRPTS = perl-build + +$(PERLMAKEFILE): perl-sources $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(PERLMAKEMAKER) + cd $(PERLMAGICK) && @PERL@ Makefile.PL MAP_TARGET=$(PERLSTATICNAME) $(PERL_MAKE_OPTIONS) && $(MAKE) Makefile ; $(MAKE) Makefile + +$(PERLMAGICK)/$(PERLSTATICNAME): $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(PERLMAKEFILE) + ( rm -f $(PERLMAGICK)/$(PERLSTATICNAME) ; cd $(PERLMAGICK) && $(MAKE) CC='@CC@' $(PERLSTATICNAME) ; $(MAKE) CC='@CC@' $(PERLSTATICNAME) ) + +all-perl: $(PERLMAGICK)/$(PERLSTATICNAME) + +install-exec-perl: $(PERLMAGICK)/$(PERLSTATICNAME) + rm -f "$(DESTDIR)$(BIN_DIR)/$(PERLSTATICNAME)" + if test "x$(DESTDIR)" = "x" -o "$(PERL_SUPPORTS_DESTDIR)" = 'yes' ; then \ + ( cd $(PERLMAGICK) && \ + $(MAKE) -f Makefile.aperl CC='@CC@' inst_perl MAP_TARGET=$(PERLSTATICNAME) \ + INSTALLBIN="$(BIN_DIR)" \ + ) ; \ + else \ + ( cd $(PERLMAGICK) && \ + $(MAKE) -f Makefile.aperl CC='@CC@' inst_perl MAP_TARGET=$(PERLSTATICNAME) \ + INSTALLBIN="$(DESTDIR)$(BIN_DIR)" PREFIX="$(DESTDIR)$(prefix)" \ + ) ; \ + fi + +uninstall-exec-perl: + rm -f '$(DESTDIR)$(BIN_DIR)/$(PERLSTATICNAME)' + +check-perl: $(PERLMAGICK)/$(PERLSTATICNAME) + cd $(PERLMAGICK) && $(abs_top_builddir)/magick.sh $(MAKE) -f Makefile.aperl CC='@CC@' test + +perl-build: $(PERLMAGICK)/$(PERLSTATICNAME) + +endif # WITH_PERL_STATIC +endif # WTIH_PERL_DYNAMIC + + +clean-perl: + (cd $(PERLMAGICK) && \ + ( if test -f Makefile.old ; then $(MAKE) -f Makefile.old CC='@CC@' clean ; fi ) ; \ + ( if test -f Makefile ; then $(MAKE) CC='@CC@' clean ; fi ) ; \ + ( if test -f Makefile ; then $(MAKE) CC='@CC@' clean ; fi ) ; \ + rm -f Makefile.old PerlMagick ; \ + rm -f t/output* t/jng/*_tmp.jng t/*/output* ; \ + rm -f quantum/@MAGICK_ABI_SUFFIX@.xs;\ + rm -f quantum/@MAGICK_ABI_SUFFIX@.pm;\ + rm -f Magick.pm;) + rm -f perl-sources + +distclean-perl: clean-perl + +else +# Satisfy makefile requirements if not building PERL +all-perl: +install-exec-perl: +uninstall-exec-perl: +check-perl: +clean-perl: +distclean-perl: +endif # WITH_PERL diff --git a/ImageMagick-6.9.12-44/PerlMagick/Makefile.nt b/ImageMagick-6.9.12-44/PerlMagick/Makefile.nt new file mode 100644 index 0000000..519274c --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/Makefile.nt @@ -0,0 +1,169 @@ +# Copyright (C) 1999-2021 ImageMagick Studio LLC +# +# This program is covered by multiple licenses, which are described in +# LICENSE. You should have received a copy of LICENSE with this +# package; otherwise see https://imagemagick.org/script/license.php. +# +# Makefile for building PerlMagick under Windows +# +# +# +use ExtUtils::MakeMaker; +use Config; +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +# +# NOTE: The current ActiveState binary distribution does not completely setup +# the values in C:/Perl/lib/Config.pm. You must manually modify the values of +# libpth to add the VisualC++ library path. It should look similar to one of +# the following examples in order to work properly. +# +# Random developer +# libpth='"C:\Perl\lib\CORE" "D:\DevStudio\VC98\lib"' +# +# Visual Studio 6.0 default install: +# libpth='"C:\Program Files\Microsoft Visual Studio\VC98\lib" "C:\Perl\lib\CORE"' +# +# Visual Studio 7.0 default install: +# libpth='"C:\Program Files\Microsoft Visual Studio .NET\vc7\lib" "C:\Perl\lib\CORE"' +# +# Visual Studio 7.1 default install: +# libpth='"C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib" "C:\Perl\lib\CORE"' +# +# Visual Studio 9.0 default install (C:\Perl\lib\Config.pm): +# libpth='"C:\Program Files\Microsoft Visual Studio 9.0\VC\lib" "C:\Perl\lib\CORE"' +# +WriteMakefile( + 'ABSTRACT' => 'ImageMagick PERL Extension', + 'AUTHOR' => 'ImageMagick Studio', + 'NAME' => 'Image::Magick', + 'VERSION_FROM' => 'Magick.pm', # finds $VERSION + 'LIBS' => ['-L..\..\VisualMagick\lib -L..\..\VisualMagick\bin -lCORE_RL_magick_.lib -lCORE_DB_magick_.lib'], + 'DEFINE' => '-D_VISUALC_ -D_WINDOWS', # e.g., '-DHAVE_SOMETHING' + 'INC' => '-I.. -I..\xlib\include', + 'BINARY_LOCATION' => 'x86/Image-Magick.tar.gz', + 'dist' => {ZIP => "zip.exe", ZIPFLAGS=>"-r"}, + 'clean' => {FILES => "Image-Magick.ppd Image-Magick.tar.gz PerlMagick.zip " }, + ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()), +); + +# +# Add a targets for building ActiveState ppm distribution modules +# Dylan Beattie , April 2002 +# +# Requires tar, gzip, and zip. This produces PerlMagick.zip +# Get GNU tar and gzip from http://sourceware.cygnus.com/ +# Get Win32 command line PKZIP from http://www.pkware.com/ +# and rename PKZIP.EXE to ZIP.EXE and PKUNZIP.EXE to UNZIP.EXE +# Make sure tar.exe, gzip.exe and zip.exe are in your system path +# +# 'nmake ppm' will include only the PerlMagick module +# 'nmake ppm-full' also includes all ImageMagick DLLs and MGK files + +sub MY::postamble +{ + ' +Image-Magick.tar.gz: ppd pure_all #htmlifypods manifypods + if exist Image-Magick.tar.gz del Image-Magick.tar.gz + if exist Image-Magick.tar del Image-Magick.tar + $(TAR) $(TARFLAGS) Image-Magick.tar blib + $(COMPRESS) -q Image-Magick.tar + +release: Image-Magick.tar.gz + +ppm: ppd pure_all htmlifypods manifypods + if exist PerlMagick.zip del PerlMagick.zip + $(TAR) $(TARFLAGS) Image-Magick.tar blib + $(COMPRESS) -q Image-Magick.tar + if exist x86 del x86 /f /q + if exist x86 rd x86 + md x86 + copy Image-Magick.tar$(SUFFIX) x86 + del Image-Magick.tar$(SUFFIX) + if exist ppm-readme.txt copy ppm-readme.txt readme + $(ZIP) $(ZIPFLAGS) PerlMagick.zip readme Image-Magick.ppd x86/Image-Magick.tar$(SUFFIX) + del x86\Image-Magick.tar$(SUFFIX) + rd x86 + +ppm-full: ppd pure_all htmlifypods manifypods + if exist PerlMagick-full.zip del PerlMagick-full.zip + copy ..\..\VisualMagick\bin\*.dll blib\arch\auto\Image\Magick + copy ..\..\VisualMagick\bin\*.xml blib\arch\auto\Image\Magick + $(TAR) $(TARFLAGS) Image-Magick.tar blib + $(COMPRESS) -q Image-Magick.tar + if exist x86 del x86 /f /q + if exist x86 rd x86 + md x86 + copy Image-Magick.tar$(SUFFIX) x86 + del Image-Magick.tar$(SUFFIX) + if exist ppm-readme.txt copy ppm-readme.txt readme + $(ZIP) $(ZIPFLAGS) PerlMagick-full.zip readme Image-Magick.ppd x86/Image-Magick.tar$(SUFFIX) + del x86\Image-Magick.tar$(SUFFIX) + rd x86 + ' +} + +# +# Modify the MakeMaker test fragment +# +sub MY::test +{ + # + # List any ImageMagick features derived from add-on libraries + # or programs you would like to test. + # + # Valid choices are: + # + # Feature Formats Tested Prerequisites + # ======= ====================== ====================================== + # bzlib BZip compression BZip library + # cgm CGM format 'ralcgm' program + # hdf HDF format HDF library + # jbig JBIG format JBIG library + # jpeg JPEG format JPEG library + # mpeg MPEG format 'ffmpeg' program + # png PNG format PNG and Zlib libraries + # ps Postscript format 'gs' program and/or DPS library + # rad Radiance format 'ra_ppm' program + # tiff TIFF format TIFF library + # ttf TrueType font format FreeType library + # x X11 support X-windows libraries and server + # xfig Xfig format 'transfig' program + # zlib Zip compression Zlib library + # + my @DELEGATES = qw/ bzlib cgm jbig jpeg mpeg png ps tiff wmf x xfig zlib/; + + package MY; # so that "SUPER" works right + my $inherited = shift->SUPER::test(@_); + my $delegate_tests= + " t/setattribute.t" . + " t/getattribute.t" . + " t/filter.t" . + " t/read.t" . + " t/ping.t" . + " t/montage.t" . + " t/write.t" . + " t/hpgl/read.t" . + " t/jbig/read.t" . + " t/jbig/write.t" . + " t/jng/read.t" . + " t/jng/write.t" . + " t/openjp2/read.t" . + " t/jpeg/read.t" . + " t/jpeg/write.t" . + " t/png/read.t" . + " t/png/write.t" . + " t/ps/read.t" . + " t/ps/write.t" . + " t/tiff/read.t" . + " t/tiff/write.t" . + " t/ttf/read.t" . + " t/wmf/read.t" . + " t/zlib/read.t" . + " t/zlib/write.t"; + if ( defined $ENV{'DISPLAY'} ) { + $delegate_tests .= " t/x11/write.t t/x11/read.t"; + } + $inherited =~ s:^TEST_FILES =.*:TEST_FILES = ${delegate_tests}:m; + $inherited; +} diff --git a/ImageMagick-6.9.12-44/PerlMagick/README.txt b/ImageMagick-6.9.12-44/PerlMagick/README.txt new file mode 100644 index 0000000..8606c8d --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/README.txt @@ -0,0 +1,137 @@ +Introduction + + PerlMagick, is an objected-oriented Perl interface to ImageMagick. + Use the module to read, manipulate, or write an image or image sequence + from within a Perl script. This makes it suitable for Web CGI scripts. You + must have ImageMagick 6.8.11 or above installed on your system for this + module to work properly. + + See + + https://imagemagick.org/script/perl-magick.php + + for additional information about PerlMagick. If you have problems, go to + + https://github.com/ImageMagick/ImageMagick6/discussions + + for help. For instructions about installing ImageMagick, see + + https://imagemagick.org/ + + +Installation + + Get the PerlMagick distribution and type the following: + + gunzip ImageMagick-6.9.12-0.tar.gz + tar xvf ImageMagick-6.9.12-0 + + Follow the ImageMagick installation instructions in INSTALL-unix.txt + then type + + cd PerlMagick + + Next, edit Makefile.PL and change LIBS and INC to include the appropriate + path information to the required libMagick library. You will also need + library search paths (-L) to JPEG, PNG, TIFF, etc. libraries if they were + included with your installed version of ImageMagick. If an extension + library is built as a shared library but not installed in the system's + default library search path, you may need to add run-path information + (often -R or -rpath) corresponding to the equivalent library search + path option so that the library can be located at run-time. + + To create and install the dymamically-loaded version of PerlMagick + (the preferred way), execute + + perl Makefile.PL + make + make install + + To create and install a new 'perl' executable (replacing your existing + PERL interpreter!) with PerlMagick statically linked (but other libraries + linked statically or dynamically according to system linker default), + execute + + perl Makefile.PL + make perl + make -f Makefile.aperl inst_perl + + or to create and install a new PERL interpreter with a different name + than 'perl' (e.g. 'PerlMagick') and with PerlMagick statically linked + + perl Makefile.PL MAP_TARGET=PerlMagick + make PerlMagick + make -f Makefile.aperl inst_perl + + See the ExtUtils::MakeMaker(3) manual page for more information on + building PERL extensions (like PerlMagick). + + For Windows systems, type + + perl Makefile.nt + nmake install + + For Unix, you typically need to be root to install the software. + There are ways around this. Consult the Perl manual pages for more + information. You are now ready to utilize the PerlMagick routines from + within your Perl scripts. + +Installation - Win32 Strawberry perl + + On Win32 Strawberry perl the prefered way of installing PerlMagick is the + following: + + 1) Download and install ImageMagick Windows binaries from + https://imagemagick.org/script/binary-releases.php#windows + + 2) You HAVE TO choose dynamic (DLL) ImageMagick binaries. Note: it is not + possible to mix 32/64bit binaries of perl and ImageMagick + + 3) During installation select that you want to install ImageMagick's + development files (libraries+headers) + + 4) You NEED TO have ImageMagick's directory in your PATH. Note: we are + checking the presence of convert.exe or identify.exe tools + + 5) You might need Visual C++ Redistributable Package installed on your + system. See instructions on ImageMagick's Binary Release webpage. + + 6) If you have all prerequisites 1)...5) you can simply install + ImageMagick by running: cpan -i Image::Magick + + +Testing PerlMagick + + Before PerlMagick is installed, you may want to execute + + make test + + to verify that PERL can load the PerlMagick extension ok. Chances are + some of the tests will fail if you do not have the proper delegates + installed for formats like JPEG, TIFF, etc. + + To see a number of PerlMagick demonstration scripts, type + + cd demo + make + + +Example Perl Magick Script + + Here is an example script to get you started: + + #!/usr/bin/perl + use Image::Magick; + + $q = Image::Magick->new; + $x = $q->Read("model.gif", "logo.gif", "rose.gif"); + warn "$x" if $x; + + $x = $q->Crop(geom=>'100x100+100+100'); + warn "$x" if $x; + + $x = $q->Write("x.gif"); + warn "$x" if $x; + + The script reads three images, crops them, and writes a single image + as a GIF animation sequence. diff --git a/ImageMagick-6.9.12-44/PerlMagick/check.sh b/ImageMagick-6.9.12-44/PerlMagick/check.sh new file mode 100755 index 0000000..4554724 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/check.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright (C) 2003 - 2009 GraphicsMagick Group +# +# Check script for building PerlMagick. + +echo "LD_LIBRARY_PATH='${LD_LIBRARY_PATH}'" +echo "MAGICK_CODER_MODULE_PATH='${MAGICK_CODER_MODULE_PATH}'" +echo "MAGICK_CONFIGURE_PATH='${MAGICK_CONFIGURE_PATH}'" +echo "MAGICK_FILTER_MODULE_PATH='${MAGICK_FILTER_MODULE_PATH}'" +echo "MAKE='${MAKE}'" +echo "MAKEFLAGS='${MAKEFLAGS}'" +echo "MEMCHECK='${MEMCHECK}'" +echo "PATH='${PATH}'" +echo "SRCDIR='${SRCDIR}'" +echo "srcdir='${srcdir}'" + +set -x + +SRCDIR=`dirname $0` +SRCDIR=`cd $SRCDIR && pwd` +TOPSRCDIR=`cd $srcdir && pwd` + +cd PerlMagick || exit 1 + +if test -z "${MAKE}" ; then + MAKE=make +fi + +if test -x PerlMagick -a -f Makefile.aperl ; then + # Static build test incantation + ${MAKE} -f Makefile.aperl CC='gcc' TEST_VERBOSE=1 test +elif test -f Makefile -a -f Magick.o; then + # Shared build test incantation + ${MAKE} CC='gcc' TEST_VERBOSE=1 test +else + echo 'PerlMagick has not been built!' + exit 1 +fi diff --git a/ImageMagick-6.9.12-44/PerlMagick/check.sh.in b/ImageMagick-6.9.12-44/PerlMagick/check.sh.in new file mode 100644 index 0000000..fc86227 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/check.sh.in @@ -0,0 +1,52 @@ +#!/bin/sh +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright (C) 2003 - 2009 GraphicsMagick Group +# +# Check script for building PerlMagick. + +echo "LD_LIBRARY_PATH='${LD_LIBRARY_PATH}'" +echo "MAGICK_CODER_MODULE_PATH='${MAGICK_CODER_MODULE_PATH}'" +echo "MAGICK_CONFIGURE_PATH='${MAGICK_CONFIGURE_PATH}'" +echo "MAGICK_FILTER_MODULE_PATH='${MAGICK_FILTER_MODULE_PATH}'" +echo "MAKE='${MAKE}'" +echo "MAKEFLAGS='${MAKEFLAGS}'" +echo "MEMCHECK='${MEMCHECK}'" +echo "PATH='${PATH}'" +echo "SRCDIR='${SRCDIR}'" +echo "srcdir='${srcdir}'" + +set -x + +SRCDIR=`dirname $0` +SRCDIR=`cd $SRCDIR && pwd` +TOPSRCDIR=`cd $srcdir && pwd` + +cd PerlMagick || exit 1 + +if test -z "${MAKE}" ; then + MAKE=make +fi + +if test -x PerlMagick -a -f Makefile.aperl ; then + # Static build test incantation + ${MAKE} -f Makefile.aperl CC='@CC@' TEST_VERBOSE=1 test +elif test -f Makefile -a -f Magick.o; then + # Shared build test incantation + ${MAKE} CC='@CC@' TEST_VERBOSE=1 test +else + echo 'PerlMagick has not been built!' + exit 1 +fi diff --git a/ImageMagick-6.9.12-44/PerlMagick/default/Magick.pm b/ImageMagick-6.9.12-44/PerlMagick/default/Magick.pm new file mode 100644 index 0000000..1335800 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/default/Magick.pm @@ -0,0 +1,69 @@ +package Image::Magick; + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Initial version, written by Kyle Shorter. + +use strict; +use Carp; + +use parent qw/Image::Magick::Q16/; + +1; +__END__ + +=head1 NAME + +Image::Magick - objected-oriented Perl interface to ImageMagick for default quantum (Q16). Use it to read, manipulate, or write an image or image sequence from within a Perl script. + +=head1 SYNOPSIS + + use Image::Magick; + $p = new Image::Magick; + $p->Read("imagefile"); + $p->Set(attribute => value, ...) + ($a, ...) = $p->Get("attribute", ...) + $p->routine(parameter => value, ...) + $p->Mogrify("Routine", parameter => value, ...) + $p->Write("filename"); + +=head1 DESCRIPTION + +This Perl extension allows the reading, manipulation and writing of +a large number of image file formats using the ImageMagick library. +It was originally developed to be used by CGI scripts for Web pages. + +A web page has been set up for this extension. See: + + file:///usr/share/doc/ImageMagick-6/www/perl-magick.html@EXTRA_DOC_DIR@ + https://imagemagick.org/script/perl-magick.php + +If you have problems, go to + + https://imagemagick.org/discourse-server/viewforum.php?f=7 + +=head1 AUTHOR + +Kyle Shorter magick-users@imagemagick.org + +=head1 BUGS + +Has all the bugs of ImageMagick and much, much more! + +=head1 SEE ALSO + +perl(1). + +=cut diff --git a/ImageMagick-6.9.12-44/PerlMagick/default/Magick.pm.in b/ImageMagick-6.9.12-44/PerlMagick/default/Magick.pm.in new file mode 100644 index 0000000..0566e20 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/default/Magick.pm.in @@ -0,0 +1,69 @@ +package Image::Magick; + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Initial version, written by Kyle Shorter. + +use strict; +use Carp; + +use parent qw/Image::Magick::@MAGICK_ABI_SUFFIX@/; + +1; +__END__ + +=head1 NAME + +Image::Magick - objected-oriented Perl interface to ImageMagick for default quantum (@MAGICK_ABI_SUFFIX@). Use it to read, manipulate, or write an image or image sequence from within a Perl script. + +=head1 SYNOPSIS + + use Image::Magick; + $p = new Image::Magick; + $p->Read("imagefile"); + $p->Set(attribute => value, ...) + ($a, ...) = $p->Get("attribute", ...) + $p->routine(parameter => value, ...) + $p->Mogrify("Routine", parameter => value, ...) + $p->Write("filename"); + +=head1 DESCRIPTION + +This Perl extension allows the reading, manipulation and writing of +a large number of image file formats using the ImageMagick library. +It was originally developed to be used by CGI scripts for Web pages. + +A web page has been set up for this extension. See: + + file://@DOCUMENTATION_PATH@/www/perl-magick.html@EXTRA_DOC_DIR@ + https://imagemagick.org/script/perl-magick.php + +If you have problems, go to + + https://imagemagick.org/discourse-server/viewforum.php?f=7 + +=head1 AUTHOR + +Kyle Shorter magick-users@imagemagick.org + +=head1 BUGS + +Has all the bugs of ImageMagick and much, much more! + +=head1 SEE ALSO + +perl(1). + +=cut diff --git a/ImageMagick-6.9.12-44/PerlMagick/default/Makefile.PL b/ImageMagick-6.9.12-44/PerlMagick/default/Makefile.PL new file mode 100644 index 0000000..de8a248 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/default/Makefile.PL @@ -0,0 +1,271 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Exercise all regression tests: +# +# make test +# +# Exersise one regression test: +# +# make TEST_VERBOSE=1 TEST_FILES=t/filter.t test +# + +use ExtUtils::MakeMaker; +use Config; +use File::Spec::Functions qw/catfile catdir devnull catpath splitpath/; +use Cwd; + +sub AutodetectWin32gcc { + my $wrkdir = getcwd(); + my $devnull = devnull(); + + my @incdir = (); + my @libdir = ($wrkdir); + my @bindir = (); + + #try to get configuration info via identify or convert utilities + my $conf = `identify -list Configure 2>$devnull` || `convert -list Configure 2>$devnull`; + foreach my $line (split '\n', $conf) { + if ($line =~ /^Path:\s+(.*)/) { + my ($vol,$dir,$file) = splitpath($1); + next unless $dir; + my $dirpath = catpath( $vol, $dir); + my (@l,@b,@i) = ( (),(),() ); + + # try to detect 'lib' dir + push @l, catfile($dirpath,'lib'); + push @l, catfile($dirpath,'..','lib'); + push @l, catfile($dirpath,'..','..','lib'); + push @l, catfile($dirpath,'..','..','..','lib'); + foreach (@l) { push @libdir, $_ if (-d $_) }; + + # try to detect 'bin' dir + push @b, catfile($dirpath); + push @b, catfile($dirpath,'bin'); + push @b, catfile($dirpath,'..'); + push @b, catfile($dirpath,'..','bin'); + push @b, catfile($dirpath,'..','..'); + push @b, catfile($dirpath,'..','..','bin'); + push @b, catfile($dirpath,'..','..','..'); + push @b, catfile($dirpath,'..','..','..','bin'); + foreach (@b) { push @bindir, $_ if (-e "$_/convert.exe" || -e "$_/identify.exe") }; + + # try to detect 'include' dir + push @i, catfile($dirpath,'include'); + push @i, catfile($dirpath,'include','ImageMagick'); + push @i, catfile($dirpath,'..','include'); + push @i, catfile($dirpath,'..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','include'); + push @i, catfile($dirpath,'..','..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','..','include'); + push @i, catfile($dirpath,'..','..','..','include','ImageMagick'); + foreach (@i) { push @incdir, $_ if (-e "$_/magick/MagickCore.h") }; + } + }; + + foreach my $bin (@bindir) { + opendir(my $bindir, $bin) or die qq{Cannot opendir $bin: $!}; + my @dlls = map {catfile($bin, $_)} grep /^\S*magick[^\+]\S*?\.dll$/i, readdir $bindir; + foreach my $d (@dlls) { + unlink "$wrkdir/libMagickCore.def", "$wrkdir/libMagickCore.a"; + system("pexports \"$d\" >\"$wrkdir/libMagickCore.def\" 2>$devnull"); + open(DEF, "<$wrkdir/libMagickCore.def"); + my @found = grep(/MagickCoreGenesis/, ); #checking if we have taken the right DLL + close(DEF); + next unless(@found); + print STDERR "Gonna create 'libMagickCore.a' from '$d'\n"; + system("dlltool -D \"$d\" -d \"$wrkdir/libMagickCore.def\" -l \"$wrkdir/libMagickCore.a\" 2>$devnull"); + last if -s "$wrkdir/libMagickCore.a"; + } + last if -s "$wrkdir/libMagickCore.a"; + } + + unless(@incdir && @libdir && @bindir && (-s "$wrkdir/libMagickCore.a")) { + print STDERR <$devnull` || `convert -list Configure 2>$devnull`; + my @delegates = (); + foreach my $line (split '\n', $conf) { + next unless $line =~ /^DELEGATES\s+/; + (undef, @delegates) = split /\s+/, $line; + last; + }; + return @delegates; +} + +# Compute test specification +my $delegate_tests='t/*.t'; +my @tested_delegates = qw/bzlib djvu fftw fontconfig freetype jpeg jng jp2 lcms mpeg png rsvg tiff x11 xml wmf zlib/; +my @supported_delegates = AutodetectDelegates(); +# find the intersection of tested and supported delegates +my %seen_delegates = (); +$seen_delegates{$_}++ for @supported_delegates; +foreach my $delegate (@tested_delegates) { + if ( $seen_delegates{$delegate} ) { + if ( -d "t/$delegate" ) { + if ( defined($ENV{'DISPLAY'}) && ($^O ne 'MSWin32') ) { + if ( defined $ENV{'DISPLAY'} ) { + $delegate_tests .= " t/$delegate/*.t"; + } + next; + } + $delegate_tests .= " t/$delegate/*.t"; + } + } +} + +# defaults for LIBS & INC & CCFLAGS params that we later pass to Writemakefile +my $INC_magick = '-I../.. -I../.. -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -I"' . $Config{'usrinc'} . '/ImageMagick"'; +my $LIBS_magick = '-L../../magick/.libs -lMagickCore-6.Q16 -lm -L' . $Config{'archlib'} . '/CORE'; +my $CCFLAGS_magick = "$Config{'ccflags'} -I/usr/include/libxml2 -I/usr/include/libraw -I/usr/include/libpng16 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/uuid -I/usr/include/harfbuzz -I/usr/include/OpenEXR -pthread -I/usr/include/openjpeg-2.4 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/fribidi -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/uuid -pthread -fopenmp -Wall -g -O2 -mtune=amdfam10 -fexceptions -pthread -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16"; +my $LDFLAGS_magick = "-L../../magick/.libs -lMagickCore-6.Q16 $Config{'ldflags'} "; +my $LDDLFLAGS_magick = "-L../../magick/.libs -lMagickCore-6.Q16 $Config{'lddlflags'} "; + +if (($^O eq 'MSWin32') && ($Config{cc} =~ /gcc/)) { + my($Ipaths, $Lpaths) = AutodetectWin32gcc(); + + # + # Setup for strawberry perl. + # + $INC_magick = "$Ipaths"; + $LIBS_magick = "-lMagickCore-6.Q16"; + $CCFLAGS_magick = "$Config{'ccflags'}"; + $LDFLAGS_magick = "$Config{'ldflags'} $Lpaths "; + $LDDLFLAGS_magick = "$Config{'lddlflags'} $Lpaths "; +} + +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile + ( + # Module description + 'ABSTRACT' => 'ImageMagick PERL Extension', + + # Perl module name is Image::Magick + 'NAME' => 'Image::Magick', + + # Module author + 'AUTHOR' => 'ImageMagick Studio LLC', + + # Module version + 'VERSION' => '6.9.12', + + # Prerequisite version + 'PREREQ_PM' => {'parent' => '0'}, + + # Preprocessor defines + 'DEFINE' => ' -D_LARGE_FILES=1 -DHAVE_CONFIG_H', # e.g., '-DHAVE_SOMETHING' + + # Header search specfication and preprocessor flags + 'INC' => $INC_magick, + + # C compiler + #'CC' => 'gcc', + + # C pre-processor flags (e.g. -I & -D options) + # 'CPPFLAGS' => "$Config{'cppflags'} -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 ", + + # C compiler flags (e.g. -O -g) + 'CCFLAGS' => $CCFLAGS_magick, + + # Linker + #'LD' => $Config{'ld'} == $Config{'cc'} ? 'gcc' : $Config{'ld'}, + + # Linker flags for building an executable + 'LDFLAGS' => $LDFLAGS_magick, + + # Linker flags for building a dynamically loadable module + 'LDDLFLAGS' => $LDDLFLAGS_magick, + + # Install PerlMagick binary into ImageMagick bin directory + 'INSTALLBIN' => '/usr/bin', + + # Library specification + 'LIBS' => [ $LIBS_magick ], + + # Perl binary name (if a Perl binary is built) + 'MAP_TARGET' => 'PerlMagick', + + # Let CFLAGS drive optimization flags by setting OPTIMIZE to empty + # 'OPTIMIZE' => '', + + # Use same compiler as ImageMagick + 'PERLMAINCC' => ' -fopenmp', + 'AR' => 'ar', + 'LD' => '', + + # Set Perl installation prefix to ImageMagick installation prefix +# 'PREFIX' => '/usr', + + # Include delegate directories in tests + test => { TESTS => $delegate_tests}, + + ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()), + + # sane version + depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' } +); + + +# +# Substitutions for "makeaperl" section. +# +sub MY::makeaperl { + package MY; # so that "SUPER" works right + my $inherited = shift->SUPER::makeaperl(@_); + + # Stinky ExtUtils::MM_Unix likes to append its own library path to $(CC), + # prior to any user-specified library path so that an installed library is + # used rather than the library just built. This substitution function + # tries to insert our library path first. Also, use the same compiler used + # to build perlmain.c to link so that a C++ compiler may be used if + # necessary. + $inherited =~ s:MAP_LINKCMD\s.*\s*\$\(CC\):MAP_LINKCMD = \$(PERLMAINCC) -L/usr/lib64: ; + $inherited; + } diff --git a/ImageMagick-6.9.12-44/PerlMagick/default/Makefile.PL.in b/ImageMagick-6.9.12-44/PerlMagick/default/Makefile.PL.in new file mode 100644 index 0000000..a71ae10 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/default/Makefile.PL.in @@ -0,0 +1,271 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Exercise all regression tests: +# +# make test +# +# Exersise one regression test: +# +# make TEST_VERBOSE=1 TEST_FILES=t/filter.t test +# + +use ExtUtils::MakeMaker; +use Config; +use File::Spec::Functions qw/catfile catdir devnull catpath splitpath/; +use Cwd; + +sub AutodetectWin32gcc { + my $wrkdir = getcwd(); + my $devnull = devnull(); + + my @incdir = (); + my @libdir = ($wrkdir); + my @bindir = (); + + #try to get configuration info via identify or convert utilities + my $conf = `identify -list Configure 2>$devnull` || `convert -list Configure 2>$devnull`; + foreach my $line (split '\n', $conf) { + if ($line =~ /^Path:\s+(.*)/) { + my ($vol,$dir,$file) = splitpath($1); + next unless $dir; + my $dirpath = catpath( $vol, $dir); + my (@l,@b,@i) = ( (),(),() ); + + # try to detect 'lib' dir + push @l, catfile($dirpath,'lib'); + push @l, catfile($dirpath,'..','lib'); + push @l, catfile($dirpath,'..','..','lib'); + push @l, catfile($dirpath,'..','..','..','lib'); + foreach (@l) { push @libdir, $_ if (-d $_) }; + + # try to detect 'bin' dir + push @b, catfile($dirpath); + push @b, catfile($dirpath,'bin'); + push @b, catfile($dirpath,'..'); + push @b, catfile($dirpath,'..','bin'); + push @b, catfile($dirpath,'..','..'); + push @b, catfile($dirpath,'..','..','bin'); + push @b, catfile($dirpath,'..','..','..'); + push @b, catfile($dirpath,'..','..','..','bin'); + foreach (@b) { push @bindir, $_ if (-e "$_/convert.exe" || -e "$_/identify.exe") }; + + # try to detect 'include' dir + push @i, catfile($dirpath,'include'); + push @i, catfile($dirpath,'include','ImageMagick'); + push @i, catfile($dirpath,'..','include'); + push @i, catfile($dirpath,'..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','include'); + push @i, catfile($dirpath,'..','..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','..','include'); + push @i, catfile($dirpath,'..','..','..','include','ImageMagick'); + foreach (@i) { push @incdir, $_ if (-e "$_/magick/MagickCore.h") }; + } + }; + + foreach my $bin (@bindir) { + opendir(my $bindir, $bin) or die qq{Cannot opendir $bin: $!}; + my @dlls = map {catfile($bin, $_)} grep /^\S*magick[^\+]\S*?\.dll$/i, readdir $bindir; + foreach my $d (@dlls) { + unlink "$wrkdir/libMagickCore.def", "$wrkdir/libMagickCore.a"; + system("pexports \"$d\" >\"$wrkdir/libMagickCore.def\" 2>$devnull"); + open(DEF, "<$wrkdir/libMagickCore.def"); + my @found = grep(/MagickCoreGenesis/, ); #checking if we have taken the right DLL + close(DEF); + next unless(@found); + print STDERR "Gonna create 'libMagickCore.a' from '$d'\n"; + system("dlltool -D \"$d\" -d \"$wrkdir/libMagickCore.def\" -l \"$wrkdir/libMagickCore.a\" 2>$devnull"); + last if -s "$wrkdir/libMagickCore.a"; + } + last if -s "$wrkdir/libMagickCore.a"; + } + + unless(@incdir && @libdir && @bindir && (-s "$wrkdir/libMagickCore.a")) { + print STDERR <$devnull` || `convert -list Configure 2>$devnull`; + my @delegates = (); + foreach my $line (split '\n', $conf) { + next unless $line =~ /^DELEGATES\s+/; + (undef, @delegates) = split /\s+/, $line; + last; + }; + return @delegates; +} + +# Compute test specification +my $delegate_tests='t/*.t'; +my @tested_delegates = qw/bzlib djvu fftw fontconfig freetype jpeg jng jp2 lcms mpeg png rsvg tiff x11 xml wmf zlib/; +my @supported_delegates = AutodetectDelegates(); +# find the intersection of tested and supported delegates +my %seen_delegates = (); +$seen_delegates{$_}++ for @supported_delegates; +foreach my $delegate (@tested_delegates) { + if ( $seen_delegates{$delegate} ) { + if ( -d "t/$delegate" ) { + if ( defined($ENV{'DISPLAY'}) && ($^O ne 'MSWin32') ) { + if ( defined $ENV{'DISPLAY'} ) { + $delegate_tests .= " t/$delegate/*.t"; + } + next; + } + $delegate_tests .= " t/$delegate/*.t"; + } + } +} + +# defaults for LIBS & INC & CCFLAGS params that we later pass to Writemakefile +my $INC_magick = '-I../.. -I@top_srcdir@ @CPPFLAGS@ -I"' . $Config{'usrinc'} . '/ImageMagick"'; +my $LIBS_magick = '-L../../magick/.libs -lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ @MATH_LIBS@ -L' . $Config{'archlib'} . '/CORE'; +my $CCFLAGS_magick = "$Config{'ccflags'} @CFLAGS@"; +my $LDFLAGS_magick = "-L../../magick/.libs -lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ $Config{'ldflags'} @LDFLAGS@"; +my $LDDLFLAGS_magick = "-L../../magick/.libs -lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ $Config{'lddlflags'} @LDFLAGS@"; + +if (($^O eq 'MSWin32') && ($Config{cc} =~ /gcc/)) { + my($Ipaths, $Lpaths) = AutodetectWin32gcc(); + + # + # Setup for strawberry perl. + # + $INC_magick = "$Ipaths"; + $LIBS_magick = "-lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@"; + $CCFLAGS_magick = "$Config{'ccflags'}"; + $LDFLAGS_magick = "$Config{'ldflags'} $Lpaths "; + $LDDLFLAGS_magick = "$Config{'lddlflags'} $Lpaths "; +} + +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile + ( + # Module description + 'ABSTRACT' => 'ImageMagick PERL Extension', + + # Perl module name is Image::Magick + 'NAME' => 'Image::Magick', + + # Module author + 'AUTHOR' => 'ImageMagick Studio LLC', + + # Module version + 'VERSION' => '@PACKAGE_BASE_VERSION@', + + # Prerequisite version + 'PREREQ_PM' => {'parent' => '0'}, + + # Preprocessor defines + 'DEFINE' => '@LFS_CPPFLAGS@ @DEFS@', # e.g., '-DHAVE_SOMETHING' + + # Header search specfication and preprocessor flags + 'INC' => $INC_magick, + + # C compiler + #'CC' => '@CC@', + + # C pre-processor flags (e.g. -I & -D options) + # 'CPPFLAGS' => "$Config{'cppflags'} @CPPFLAGS@", + + # C compiler flags (e.g. -O -g) + 'CCFLAGS' => $CCFLAGS_magick, + + # Linker + #'LD' => $Config{'ld'} == $Config{'cc'} ? '@CC@' : $Config{'ld'}, + + # Linker flags for building an executable + 'LDFLAGS' => $LDFLAGS_magick, + + # Linker flags for building a dynamically loadable module + 'LDDLFLAGS' => $LDDLFLAGS_magick, + + # Install PerlMagick binary into ImageMagick bin directory + 'INSTALLBIN' => '@BIN_DIR@', + + # Library specification + 'LIBS' => [ $LIBS_magick ], + + # Perl binary name (if a Perl binary is built) + 'MAP_TARGET' => 'PerlMagick', + + # Let CFLAGS drive optimization flags by setting OPTIMIZE to empty + # 'OPTIMIZE' => '', + + # Use same compiler as ImageMagick + 'PERLMAINCC' => '@PERLMAINCC@ @OPENMP_CFLAGS@', + 'AR' => '@AR@', + 'LD' => '@PERLMAINCC@', + + # Set Perl installation prefix to ImageMagick installation prefix +# 'PREFIX' => '@prefix@', + + # Include delegate directories in tests + test => { TESTS => $delegate_tests}, + + ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()), + + # sane version + depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' } +); + + +# +# Substitutions for "makeaperl" section. +# +sub MY::makeaperl { + package MY; # so that "SUPER" works right + my $inherited = shift->SUPER::makeaperl(@_); + + # Stinky ExtUtils::MM_Unix likes to append its own library path to $(CC), + # prior to any user-specified library path so that an installed library is + # used rather than the library just built. This substitution function + # tries to insert our library path first. Also, use the same compiler used + # to build perlmain.c to link so that a C++ compiler may be used if + # necessary. + $inherited =~ s:MAP_LINKCMD\s.*\s*\$\(CC\):MAP_LINKCMD = \$(PERLMAINCC) -L@MAGICKCORE_PATH@: ; + $inherited; + } diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/Generic.ttf b/ImageMagick-6.9.12-44/PerlMagick/demo/Generic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8ea647090f75e7d34bee4c511921299d1f3c1055 GIT binary patch literal 18444 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 sin($self->{theta}), + $self->{y}+$r*-cos($self->{theta})); + if ($what) { + &$what($self->{x}, $self->{y}, $newx, $newy); # motion + } + # According to the coderef passed in + ($self->{x}, $self->{y})=($newx, $newy); # change the old coords +} + +sub turn +{ + my $self = shift; + my $dtheta = shift; + + $self->{theta} += $dtheta*$self->{mirror}; +} + +sub state +{ + my $self = shift; + + @{$self}{qw(x y theta mirror)}; +} + +sub setstate +{ + my $self = shift; + + @{$self}{qw(x y theta mirror)} = @_; +} + +sub mirror +{ + my $self = shift; + + $self->{mirror} *= -1; +} + +"Turtle.pm"; diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/annotate.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/annotate.pl new file mode 100644 index 0000000..01aea6e --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/annotate.pl @@ -0,0 +1,41 @@ +#!/usr/bin/perl + +use Image::Magick; + +$image = Image::Magick->new(); +$x = 100; +$y = 100; +for ($angle=0; $angle < 360; $angle+=30) +{ + my ($label); + + print "angle $angle\n"; + $label=Image::Magick->new(size=>"600x600",pointsize=>24); + $label->Read("xc:white"); + $label->Draw(primitive=>'line',points=>"300,100 300,500",stroke=>'#600'); + $label->Draw(primitive=>'line',points=>"100,300 500,300",stroke=>'#600'); + $label->Draw(primitive=>'rectangle',points=>"100,100 500,500",fill=>'none', + stroke=>'#600'); + $label->Annotate(font=>'Generic.ttf',text=>"North West",gravity=>"NorthWest", + x=>$x,y=>$y,undercolor=>'yellow',rotate=>$angle); + $label->Annotate(font=>'Generic.ttf',text=>"North",gravity=>"North", + y=>$y,rotate=>$angle); + $label->Annotate(font=>'Generic.ttf',text=>"North East",gravity=>"NorthEast", + x=>$x,y=>$y,rotate=>$angle); + $label->Annotate(font=>'Generic.ttf',text=>"West",gravity=>"West", + x=>$x,rotate=>$angle); + $label->Annotate(font=>'Generic.ttf',text=>"Center",gravity=>"Center", + rotate=>$angle); + $label->Annotate(font=>'Generic.ttf',text=>"East",gravity=>"East", + x=>$x,rotate=>$angle); + $label->Annotate(font=>'Generic.ttf',text=>"South West",gravity=>"SouthWest", + x=>$x,y=>$y,rotate=>$angle); + $label->Annotate(font=>'Generic.ttf',text=>"South",gravity=>"South", + y=>$y,rotate=>$angle); + $label->Annotate(font=>'Generic.ttf',text=>"South East",gravity=>"SouthEast", + x=>$x,y=>$y,rotate=>$angle); + push(@$image,$label); +} +$image->Set(delay=>20); +$image->Write("annotate.miff"); +$image->Animate(); diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/annotate_words.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/annotate_words.pl new file mode 100755 index 0000000..3b76b1d --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/annotate_words.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl +# +# annotate_words.pl +# +# Take the internal string, split it into words and try to annotate each +# individual word correctly, so as to control spacing between the words +# under program control. +# +# A demonstration of using QueryFontMetrics(), by passing it exactly the same +# arguments as you would for Annotate(), to determine the location of the +# text that is/was drawn. +# +# Example script from Zentara +# http://zentara.net/Remember_How_Lucky_You_Are.html +# +use warnings; +use strict; +use Image::Magick; + +my $image = Image::Magick->new; +$image->Set(size=>'500x200'); +my $rc = $image->Read("xc:white"); + +my $str = 'Just Another Perl Hacker'; +my (@words) = split ' ',$str; +#print join "\n",@words,"\n"; + +my ($x,$y) = (50,50); + +foreach my $word (@words){ + + $image->Annotate(font=>'Generic.ttf', + pointsize => 24, + fill => '#000000ff', #last 2 digits transparency in hex ff=max + text => $word, + gravity => 'NorthWest', + align => 'left', + x => $x, + y => $y, + ); + + my ( $character_width,$character_height,$ascender,$descender,$text_width, + $text_height,$maximum_horizontal_advance, $boundsx1, $boundsy1, + $boundsx2, $boundsy2,$originx,$originy) = + $image->QueryFontMetrics( + pointsize => 24, + text => $word, + gravity => 'NorthWest', + align => 'left', + x => $x, + y => $y, + ); + + print "$word ( $character_width, $character_height, + $ascender,$descender, + $text_width, $text_height, + $maximum_horizontal_advance, + $boundsx1, $boundsy1, + $boundsx2, $boundsy2, + $originx,$originy)\n"; + + my $n = $x + $originx + $character_width/3; # add a space + print "Next word at: $x + $originx + $character_width/3 => $n\n"; + $x = $n; + +} + +$image->Write("show:"); + +exit; + diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/button.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/button.pl new file mode 100644 index 0000000..a771e01 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/button.pl @@ -0,0 +1,15 @@ +#!/usr/bin/perl +# +# Make simple beveled button. +# +use Image::Magick; + +$q=Image::Magick->new; +$q->Set(size=>'30x106'); +$q->Read('gradient:#00f685-#0083f8'); +$q->Rotate(-90); +$q->Raise('6x6'); +$q->Annotate(font=>'Generic.ttf',text=>'Push Me',fill=>'black', + gravity=>'Center',pointsize=>18); +$q->Write('button.gif'); +$q->Write('win:'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/compose-specials.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/compose-specials.pl new file mode 100755 index 0000000..9af3328 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/compose-specials.pl @@ -0,0 +1,252 @@ +#!/usr/bin/perl +# +# Demonstration of some of the fancier Image Composition Methods +# including the 'rotate' parameter specific to PerlMagick Composite() +# +# NOTE: versions of IM older than IM v6.5.3-4 will need to rename the +# parameter "args=>" to the mis-named "blend=>" parameter. +# +# Also not that "composite -watermark" is actually known as the compose +# method "Modulate". +# +# Essentially each image is equivelent to +# convert logo: -crop 80x80+140+60 +repage \ +# -size 60x60 gradient:black-white \ +# -alpha set miff:- |\ +# composite - -geometry +10+10 -virtual-pixel gray \ +# -dissolve 70x30 show: +# for various composition methods. +# +use strict; +use Image::Magick; + +# Background or Destination image +my $dest=Image::Magick->new(); +$dest->Read('logo:'); +$dest->Crop('100x100+400+100'); # wizards hat +$dest->Set(page=>'0x0+0+0'); +$dest->Set(alpha=>'Set'); + +# Source, Composite or Overlay image +my $src=Image::Magick->new(); +$src->Set(size=>'80x80'); +$src->Read('gradient:black-white'); +$src->Set(alpha=>'Set'); + +my $offset="+10+10"; + +# Circle Mask Image (same size as Destination) +my $circle=Image::Magick->new(); +$circle->Set(size=>'80x80'); +$circle->Read('xc:black'); +$circle->Draw(fill=>'white',primitive=>'circle',points=>'39.5,39.5 10,39.5'); + +my $texture=Image::Magick->new(); +$texture->Read('pattern:checkerboard'); + +# List of images generated +my $results=Image::Magick->new(); + +# Working copy of Destination Image +my $clone; + +# ---------------------------------------- +# Normal Composition Methods + +$clone=$dest->Clone(); +$clone->Label('Over\n(normal compose)'); +$clone->Composite( + image=>$src, + compose=>'over', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Multiply\n(add black)'); +$clone->Composite( + image=>$src, + compose=>'multiply', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Screen\n(add white)'); +$clone->Composite( + image=>$src, + compose=>'screen', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('HardLight\n(light effects)'); +$clone->Composite( + image=>$src, + compose=>'hardlight', + geometry=>$offset, +); +push(@$results, $clone); + +# --------------- +# Masked and Blending Demonstartion + +$clone=$dest->Clone(); +$clone->Label('Circle Masked\n(three image)'); +$clone->Composite( + image=>$src, + mask=>$circle, + compose=>'over', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Blend 50x50\n(50% plus 50%)'); +$clone->Composite( + image=>$src, + compose=>'blend', + args=>'50x50', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Dissolve 50x50\n(50% over 50%)'); +$clone->Composite( + image=>$src, + compose=>'dissolve', + args=>'50x50', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Dissolve 50\n(50% over 100%)'); +$clone->Composite( + image=>$src, + compose=>'dissolve', + args=>'50', + geometry=>$offset, +); +push(@$results, $clone); + +# --------------- +# Displacement Demonstartion + +$clone=$dest->Clone(); +$clone->Label('Displace 50x0\n(displace horiz)'); +$clone->Set('virtual-pixel'=>'gray'); +$clone->Composite( + image=>$src, + compose=>'displace', + args=>'50x0', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Displace 0x50\n(compress vert)'); +$clone->Set('virtual-pixel'=>'gray'); +$clone->Composite( + image=>$src, + compose=>'displace', + args=>'0x50', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Displace 50x50\n(diagonal)'); +$clone->Set('virtual-pixel'=>'gray'); +$clone->Composite( + image=>$src, + compose=>'displace', + args=>'50x50', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Displace 0,-80\n(displace flip)'); +$clone->Set('virtual-pixel'=>'gray'); +$clone->Composite( + image=>$src, + compose=>'displace', + args=>'0,-80', + geometry=>$offset, +); +push(@$results, $clone); + +# --------------- +# Demonstrate rotation +# note that offset is automatically adjusted to keep rotated image +# centered relative to its '0' rotation position + +$clone=$dest->Clone(); +$clone->Label('Rotate 0\n'); +$clone->Composite( + image=>$src, + compose=>'over', + rotate=>0, + background=>'none', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Rotate 10\n'); +$clone->Composite( + image=>$src, + compose=>'over', + rotate=>10, + background=>'none', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Rotate 45\n'); +$clone->Composite( + image=>$src, + compose=>'over', + rotate=>45, + background=>'none', + geometry=>$offset, +); +push(@$results, $clone); + +$clone=$dest->Clone(); +$clone->Label('Rotate 90\n'); +$clone->Composite( + image=>$src, + compose=>'over', + rotate=>90, + background=>'none', + geometry=>$offset, +); +push(@$results, $clone); + +# ---------------------------------------- +# Output the changed pixels + +# to every image underlay a checkboard pattern +# so as to show if any transparency is present +for my $image ( @$results ) { + $image->Composite( + image=>$texture, + tile=>'True', + compose=>'DstOver', + ); +} + +my $montage=$results->Montage(font=>'Generic.ttf', + geometry=>'+10+10', + tile=>'4x', + frame=>'6x6+2+2', + shadow=>'True', +); +$montage->Write('show:'); +$montage->Write('compose-specials.jpg'); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/composite.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/composite.pl new file mode 100644 index 0000000..987be11 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/composite.pl @@ -0,0 +1,39 @@ +#!/usr/bin/perl + +use Image::Magick; + +$image = Image::Magick->new(); +$smile = Image::Magick->new(); +$smile->Read('smile.gif'); +$smile->Set(background=>'none'); +$x = 100; +$y = 100; +for ($angle=0; $angle < 360; $angle+=30) +{ + my ($thumbnail); + + print "angle $angle\n"; + $thumbnail=Image::Magick->new(size=>"600x600",pointsize=>24,fill=>'black'); + $thumbnail->Read("xc:white"); + $thumbnail->Draw(primitive=>'line',points=>"300,100 300,500",stroke=>'#600'); + $thumbnail->Draw(primitive=>'line',points=>"100,300 500,300",stroke=>'#600'); + $thumbnail->Draw(primitive=>'rectangle',points=>"100,100 500,500", + fill=>'none',stroke=>'#600'); + $thumbnail->Composite(image=>$smile,gravity=>"NorthWest",x=>$x,y=>$y, + rotate=>$angle); + $thumbnail->Composite(image=>$smile,gravity=>"North",y=>$y,rotate=>$angle); + $thumbnail->Composite(image=>$smile,gravity=>"NorthEast",x=>$x,y=>$y, + rotate=>$angle); + $thumbnail->Composite(image=>$smile,gravity=>"West",x=>$x,rotate=>$angle); + $thumbnail->Composite(image=>$smile,gravity=>"Center",rotate=>$angle); + $thumbnail->Composite(image=>$smile,gravity=>"East",x=>$x,rotate=>$angle); + $thumbnail->Composite(image=>$smile,gravity=>"SouthWest",x=>$x,y=>$y, + rotate=>$angle); + $thumbnail->Composite(image=>$smile,gravity=>"South",y=>$y,rotate=>$angle); + $thumbnail->Composite(image=>$smile,gravity=>"SouthEast",x=>$x,y=>$y, + rotate=>$angle); + push(@$image,$thumbnail); +} +$image->Set(delay=>20); +$image->Write("composite.miff"); +$image->Animate(); diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/demo.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/demo.pl new file mode 100644 index 0000000..80abde8 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/demo.pl @@ -0,0 +1,519 @@ +#!/usr/bin/perl +# +# Overall demo of the major PerlMagick methods. +# +use Image::Magick; + +# +# Read model & smile image. +# +print "Read...\n"; +$null=Image::Magick->new; +$null->Set(size=>'70x70'); +$x=$null->ReadImage('NULL:black'); +warn "$x" if "$x"; + +$model=Image::Magick->new(); +$x=$model->ReadImage('model.gif'); +warn "$x" if "$x"; +$model->Label('Magick'); +$model->Set(background=>'white'); + +$smile=Image::Magick->new; +$x=$smile->ReadImage('smile.gif'); +warn "$x" if "$x"; +$smile->Label('Smile'); +$smile->Set(background=>'white'); +# +# Create image stack. +# +print "Transform image...\n"; +$images=Image::Magick->new(); + +print "Adaptive Blur...\n"; +$example=$model->Clone(); +$example->Label('Adaptive Blur'); +$example->AdaptiveBlur('0x1'); +push(@$images,$example); + +print "Adaptive Resize...\n"; +$example=$model->Clone(); +$example->Label('Adaptive Resize'); +$example->AdaptiveResize('60%'); +push(@$images,$example); + +print "Adaptive Sharpen...\n"; +$example=$model->Clone(); +$example->Label('Adaptive Sharpen'); +$example->AdaptiveSharpen('0x1'); +push(@$images,$example); + +print "Adaptive Threshold...\n"; +$example=$model->Clone(); +$example->Label('Adaptive Threshold'); +$example->AdaptiveThreshold('5x5+5%'); +push(@$images,$example); + +print "Add Noise...\n"; +$example=$model->Clone(); +$example->Label('Add Noise'); +$example->AddNoise("Laplacian"); +push(@$images,$example); + +print "Annotate...\n"; +$example=$model->Clone(); +$example->Label('Annotate'); +$example->Annotate(font=>'Generic.ttf',text=>'Magick',geometry=>'+0+20', + fill=>'gold',gravity=>'North',pointsize=>14); +push(@$images,$example); + +print "Auto-gamma...\n"; +$example=$model->Clone(); +$example->Label('Auto Gamma'); +$example->AutoGamma(); +push(@$images,$example); + +print "Auto-level...\n"; +$example=$model->Clone(); +$example->Label('Auto Level'); +$example->AutoLevel(); +push(@$images,$example); + +print "Auto-threshold...\n"; +$example=$model->Clone(); +$example->Label('Auto Threshold'); +$example->AutoThreshold(); +push(@$images,$example); + +print "Blur...\n"; +$example=$model->Clone(); +$example->Label('Blur'); +$example->Blur('0.0x1.0'); +push(@$images,$example); + +print "Border...\n"; +$example=$model->Clone(); +$example->Label('Border'); +$example->Border(geometry=>'6x6',color=>'gold'); +push(@$images,$example); + +print "Channel...\n"; +$example=$model->Clone(); +$example->Label('Channel'); +$example->Channel(channel=>'red'); +push(@$images,$example); + +print "Charcoal...\n"; +$example=$model->Clone(); +$example->Label('Charcoal'); +$example->Charcoal('2x1'); +push(@$images,$example); + +print "ColorMatrix...\n"; +$example=$model->Clone(); +$example->Label('ColorMatrix'); +$example->ColorMatrix([1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0.5, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]); +push(@$images,$example); + +print "Colorspace...\n"; +$example=$model->Clone(); +$example->Label('Colorspace'); +$example->Colorspace('Lab'); +push(@$images,$example); + +print "Composite...\n"; +$example=$model->Clone(); +$example->Label('Composite'); +$example->Composite(image=>$smile,compose=>'over',geometry=>'+35+65'); +$example->Clamp(); +push(@$images,$example); + +print "Contrast...\n"; +$example=$model->Clone(); +$example->Label('Contrast'); +$example->Contrast(); +push(@$images,$example); + +print "Contrast Stretch...\n"; +$example=$model->Clone(); +$example->Label('Contrast Stretch'); +$example->ContrastStretch('5%'); +push(@$images,$example); + +print "Convolve...\n"; +$example=$model->Clone(); +$example->Label('Convolve'); +$example->Convolve([0.125, 0.125, 0.125, 0.125, 0.5, 0.125, 0.125, 0.125, 0.125]); +push(@$images,$example); + +print "Crop...\n"; +$example=$model->Clone(); +$example->Label('Crop'); +$example->Crop(geometry=>'80x80+25+50'); +$example->Set(page=>'0x0+0+0'); +push(@$images,$example); + +print "Despeckle...\n"; +$example=$model->Clone(); +$example->Label('Despeckle'); +$example->Despeckle(); +push(@$images,$example); + +print "Distort...\n"; +$example=$model->Clone(); +$example->Label('Distort'); +$example->Distort(method=>'arc',points=>[60],'virtual-pixel'=>'white'); +push(@$images,$example); + +print "Draw...\n"; +$example=$model->Clone(); +$example->Label('Draw'); +$example->Draw(fill=>'none',stroke=>'gold',primitive=>'circle', + points=>'60,90 60,120',strokewidth=>2); +push(@$images,$example); + +print "Detect Edges...\n"; +$example=$model->Clone(); +$example->Label('Detect Edges'); +$example->Edge('2x0.5'); +$example->Clamp(); +push(@$images,$example); + +print "Emboss...\n"; +$example=$model->Clone(); +$example->Label('Emboss'); +$example->Emboss('0x1'); +push(@$images,$example); + +print "Encipher...\n"; +$example=$model->Clone(); +$example->Label('Encipher'); +$example->Encipher('Magick'); +push(@$images,$example); + +print "Equalize...\n"; +$example=$model->Clone(); +$example->Label('Equalize'); +$example->Equalize(); +push(@$images,$example); + +print "Explode...\n"; +$example=$model->Clone(); +$example->Label('Explode'); +$example->Implode(-1); +push(@$images,$example); + +print "Flip...\n"; +$example=$model->Clone(); +$example->Label('Flip'); +$example->Flip(); +push(@$images,$example); + +print "Flop...\n"; +$example=$model->Clone(); +$example->Label('Flop'); +$example->Flop(); +push(@$images,$example); + +print "Frame...\n"; +$example=$model->Clone(); +$example->Label('Frame'); +$example->Frame('15x15+3+3'); +push(@$images,$example); + +print "Fx...\n"; +$example=$model->Clone(); +$example->Label('Fx'); +push(@$images,$example->Fx(expression=>'0.5*u')); + +print "Gamma...\n"; +$example=$model->Clone(); +$example->Label('Gamma'); +$example->Gamma(1.6); +push(@$images,$example); + +print "Gaussian Blur...\n"; +$example=$model->Clone(); +$example->Label('Gaussian Blur'); +$example->GaussianBlur('0.0x1.5'); +push(@$images,$example); + +print "Gradient...\n"; +$gradient=Image::Magick->new; +$gradient->Set(size=>'130x194'); +$x=$gradient->ReadImage('gradient:#20a0ff-#ffff00'); +warn "$x" if "$x"; +$gradient->Label('Gradient'); +push(@$images,$gradient); + +print "Grayscale...\n"; +$example=$model->Clone(); +$example->Label('Grayscale'); +$example->Set(type=>'grayscale'); +push(@$images,$example); + +print "Implode...\n"; +$example=$model->Clone(); +$example->Label('Implode'); +$example->Implode(0.5); +push(@$images,$example); + +print "Kuwahara...\n"; +$example=$model->Clone(); +$example->Label('Kuwahara'); +$example->Kuwahara('0x1'); +push(@$images,$example); + +print "Level...\n"; +$example=$model->Clone(); +$example->Label('Level'); +$example->Level('20%x'); +$example->Clamp(); +push(@$images,$example); + +print "Linear stretch...\n"; +$example=$model->Clone(); +$example->Label('Linear Stretch'); +$example->LinearStretch('5x5'); +push(@$images,$example); + +print "Median Filter...\n"; +$example=$model->Clone(); +$example->Label('Median Filter'); +$example->MedianFilter('4x4'); +push(@$images,$example); + +print "Mode...\n"; +$example=$model->Clone(); +$example->Label('Mode'); +$example->Mode('4x4'); +push(@$images,$example); + +print "Modulate...\n"; +$example=$model->Clone(); +$example->Label('Modulate'); +$example->Modulate(brightness=>110,saturation=>110,hue=>110); +push(@$images,$example); +$example=$model->Clone(); + +print "Monochrome...\n"; +$example=$model->Clone(); +$example->Label('Monochrome'); +$example->Quantize(colorspace=>'gray',colors=>2,dither=>'false'); +push(@$images,$example); + +print "Morphology...\n"; +$example=$model->Clone(); +$example->Label('Morphology'); +$example->Morphology(method=>'Dilate',kernel=>'Diamond',iterations=>2); +push(@$images,$example); + +print "Motion Blur...\n"; +$example=$model->Clone(); +$example->Label('Motion Blur'); +$example->MotionBlur('0x13+10-10'); +push(@$images,$example); + +print "Negate...\n"; +$example=$model->Clone(); +$example->Label('Negate'); +$example->Negate(); +push(@$images,$example); + +print "Normalize...\n"; +$example=$model->Clone(); +$example->Label('Normalize'); +$example->Normalize(); +push(@$images,$example); + +print "Oil Paint...\n"; +$example=$model->Clone(); +$example->Label('Oil Paint'); +$example->OilPaint('2x0.5'); +push(@$images,$example); + +print "Plasma...\n"; +$plasma=Image::Magick->new; +$plasma->Set(size=>'130x194'); +$x=$plasma->ReadImage('plasma:fractal'); +warn "$x" if "$x"; +$plasma->Label('Plasma'); +push(@$images,$plasma); + +print "Polaroid...\n"; +$example=$model->Clone(); +$example->Label('Polaroid'); +$example->Polaroid(caption=>'Magick',angle=>-5.0,gravity=>'center'); +push(@$images,$example); + +print "Posterize...\n"; +$example=$model->Clone(); +$example->Label('Posterize'); +$example->Posterize(5); +push(@$images,$example); + +print "Quantize...\n"; +$example=$model->Clone(); +$example->Label('Quantize'); +$example->Quantize(); +push(@$images,$example); + +print "Rotational Blur...\n"; +$example=$model->Clone(); +$example->Label('Rotational Blur'); +$example->RotationalBlur(10); +push(@$images,$example); + +print "Raise...\n"; +$example=$model->Clone(); +$example->Label('Raise'); +$example->Raise('10x10'); +push(@$images,$example); + +print "Reduce Noise...\n"; +$example=$model->Clone(); +$example->Label('Reduce Noise'); +$example->ReduceNoise('2x2'); +push(@$images,$example); + +print "Resize...\n"; +$example=$model->Clone(); +$example->Label('Resize'); +$example->Resize('60%'); +push(@$images,$example); + +print "Roll...\n"; +$example=$model->Clone(); +$example->Label('Roll'); +$example->Roll(geometry=>'+20+10'); +push(@$images,$example); + +print "Rotate...\n"; +$example=$model->Clone(); +$example->Label('Rotate'); +$example->Rotate(45); +push(@$images,$example); + +print "Sample...\n"; +$example=$model->Clone(); +$example->Label('Sample'); +$example->Sample('60%'); +push(@$images,$example); + +print "Scale...\n"; +$example=$model->Clone(); +$example->Label('Scale'); +$example->Scale('60%'); +push(@$images,$example); + +print "Segment...\n"; +$example=$model->Clone(); +$example->Label('Segment'); +$example->Segment(); +push(@$images,$example); + +print "Shade...\n"; +$example=$model->Clone(); +$example->Label('Shade'); +$example->Shade(geometry=>'30x30',gray=>'true'); +push(@$images,$example); + +print "Sharpen...\n"; +$example=$model->Clone(); +$example->Label('Sharpen'); +$example->Sharpen('0.0x1.0'); +$example->Clamp(); +push(@$images,$example); + +print "Shave...\n"; +$example=$model->Clone(); +$example->Label('Shave'); +$example->Shave('10x10'); +push(@$images,$example); + +print "Shear...\n"; +$example=$model->Clone(); +$example->Label('Shear'); +$example->Shear('-20x20'); +push(@$images,$example); + +print "Sketch...\n"; +$example=$model->Clone(); +$example->Label('Sketch'); +$example->Set(colorspace=>'Gray'); +$example->Sketch('0x20+120'); +push(@$images,$example); + +print "Sigmoidal Contrast...\n"; +$example=$model->Clone(); +$example->Label('Sigmoidal Contrast'); +$example->SigmoidalContrast("3x50%"); +push(@$images,$example); + +print "Spread...\n"; +$example=$model->Clone(); +$example->Label('Spread'); +$example->Spread(); +push(@$images,$example); + +print "Solarize...\n"; +$example=$model->Clone(); +$example->Label('Solarize'); +$example->Solarize(); +push(@$images,$example); + +print "Swirl...\n"; +$example=$model->Clone(); +$example->Label('Swirl'); +$example->Swirl(90); +push(@$images,$example); + +print "Tint...\n"; +$example=$model->Clone(); +$example->Label('Tint'); +$example->Tint('wheat'); +push(@$images,$example); + +print "Unsharp Mask...\n"; +$example=$model->Clone(); +$example->Label('Unsharp Mask'); +$example->UnsharpMask('0.0x1.0'); +$example->Clamp(); +push(@$images,$example); + +print "Vignette...\n"; +$example=$model->Clone(); +$example->Label('Vignette'); +$example->Vignette('0x20'); +push(@$images,$example); + +print "Wave...\n"; +$example=$model->Clone(); +$example->Label('Wave'); +$example->Wave('25x150'); +push(@$images,$example); + +print "WaveletDenoise...\n"; +$example=$model->Clone(); +$example->Label('Wavelet Denoise'); +$example->WaveletDenoise('5%'); +push(@$images,$example); + +# +# Create image montage. +# +print "Montage...\n"; +$montage=$images->Montage(font=>'Generic.ttf',geometry=>'140x160+8+4>', + gravity=>'Center',tile=>'5x+10+200',compose=>'over',background=>'#ffffff', + pointsize=>18,fill=>'#600',stroke=>'none',shadow=>'true'); + +$logo=Image::Magick->new(); +$logo->Read('logo:'); +$logo->Zoom('40%'); +$montage->Composite(image=>$logo,gravity=>'North'); + +print "Write...\n"; +$montage->Set(matte=>'false'); +$montage->Write('demo.jpg'); +print "Display...\n"; +$montage->Write('win:'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/dst.png b/ImageMagick-6.9.12-44/PerlMagick/demo/dst.png new file mode 100644 index 0000000000000000000000000000000000000000..2569f632db5c2132c6a085b8e51cb58251eb7ae0 GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^4j?SR1|)y|Tss#?u_bxCyZi?O&WP`KfFhg)9+AaB z+5?Q;PG;LNFffLCx;TbZ+-Hbqu3__Z^-PvnPzcLntds)`b*UydKSHITI4UpxjJuApj_-JAafGC!c1p{26>}42Zs6+B20{bl$|+P3LKsYa6D+~P!u@8I?+j? zflUxd@Y%FGFvwQ&G%~P#04n5pqR7HD<3JGyi^0UB0vrj9-ayq()0`R@x9+RWd;E>{ z{Y^o~7+%JMb9fmYWr6hD)&`Y%tqm!1&Y%EdNH}iZ^!Ls+3#QZcAg-sYpUXO@geCw= C_Li>z literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/lsys.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/lsys.pl new file mode 100644 index 0000000..cc1194e --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/lsys.pl @@ -0,0 +1,83 @@ +#!/usr/bin/perl + +# Written by jreed@itis.com, adapted by Cristy. + +use Image::Magick; +use Turtle; + +sub flower +{ + my $flower = shift; + my ($width, $height) = $flower->Get('width', 'height'); + my ($x, $y) = $turtle->state(); + my ($geometry); + + $geometry = '+' . int($x-$width/2) . '+' . int($y-$height/2); + $im->Composite(image=>$flower, compose=>'over', geometry=>$geometry); +} + +sub lsys_init +{ + my ($imagesize) = @_; + + %translate = + ( + 'S' => sub{ # Step forward + $turtle->forward($changes->{"distance"}, + $changes->{"motionsub"}); + }, + '-' => sub{ $turtle->turn(-$changes->{"dtheta"}); }, # counter-clockwise + '+' => sub{ $turtle->turn($changes->{"dtheta"}); }, # Turn clockwise + 'M' => sub{ $turtle->mirror(); }, # Mirror + '[' => sub{ push(@statestack, [$turtle->state()]); }, # Begin branch + ']' => sub{ $turtle->setstate(@{pop(@statestack)}); }, # End branch + '{' => sub{ @poly = (); $changes=\%polychanges; }, # Begin polygon + '}' => sub{ # End polygon + $im->Draw (primitive=>'Polygon', points=>join(' ',@poly), + fill=>'light green'); + $changes = \%stemchanges; + }, + 'f' => sub{ flower($pink_flower); }, # Flower + 'g' => sub{ flower($red_flower); }, # Flower + 'h' => sub{ flower($yellow_flower); } # Flower + ); + + # Create the main image + $im = new Image::Magick; + $im->Set(size=>$imagesize . 'x' . $imagesize); + $im->Read('xc:white'); + + # Create the flower images + $pink_flower = new Image::Magick; + $pink_flower->Read('pink-flower.gif'); + + $red_flower = new Image::Magick; + $red_flower->Read('red-flower.gif'); + + $yellow_flower = new Image::Magick; + $yellow_flower->Read('yellow-flower.gif'); + + # Turtle: the midpoint of the bottom edge of the image, pointing up. + $turtle=new Turtle($imagesize/2, $imagesize, 0, 1); +} + +sub lsys_execute +{ + my ($string, $repetitions, $filename, %rule) = @_; + + my ($command); + + # Apply the %rule to $string, $repetitions times. + for (1..$repetitions) + { + $string =~ s/./defined ($rule{$&}) ? $rule{$&} : $&/eg; + } + foreach $command (split(//, $string)) + { + if ($translate{$command}) { &{$translate{$command}}(); } + } + $im->Write($filename); + $im->Write('win:'); +} + +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/model.gif b/ImageMagick-6.9.12-44/PerlMagick/demo/model.gif new file mode 100644 index 0000000000000000000000000000000000000000..f58e4a86228ae55fff6d9f69c202f313b42d1f2b GIT binary patch literal 23433 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ሆo$$lW> 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 awPn|GrjcD_+4)33Y%D&m`%R4qto%P|TxxFs literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/piddle.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/piddle.pl new file mode 100644 index 0000000..d822713 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/piddle.pl @@ -0,0 +1,66 @@ +#!/usr/bin/perl +# Piddle example using PerlMagick methods. + +use Image::Magick; + +# +# Create white canvas. +# +$image=Image::Magick->new(size=>'300x300'); +$image->Read('xc:white'); +# +# Draw blue grid +# +for ($i=0; $i < 300; $i+=10) +{ + $image->Draw(primitive=>'line',points=>"$i,0 $i,300",stroke=>"#ccf"); + $image->Draw(primitive=>'line',points=>"0,$i 300,$i",stroke=>"#ccf"); +} +# +# Draw rounded rectangle. +# +$image->Draw(primitive=>'RoundRectangle',fill=>'blue',stroke=>'maroon', + strokewidth=>4,points=>'30,30 100,100 10,10'); +# +# Draw curve. +# +$image->Draw(primitive=>'bezier',points=>'20,20, 100,50, 50,100, 160,160', + fill=>'none',stroke=>'black',strokewidth=>4); +# +# Draw line. +# +$image->Draw(primitive=>'line',points=>"10,200 20,190",stroke=>red); +# +# Draw arc within a circle. +# +$image->Draw(primitive=>'circle',stroke=>'none',fill=>'yellow',, + points=>"170,70 200,70"); +$image->Draw(primitive=>'Path',stroke=>'none',fill=>'blue',strokewidth=>4, + points=>'M170,70 v-30 a30,30 0 0,0 -30,30 z'); +$image->Draw(primitive=>'circle',stroke=>'black',fill=>'none',strokewidth=>4, + points=>"170,70 200,70"); +# +# Draw pentogram. +# +$image->Draw(primitive=>'polygon', + points=>"160,120 130,190 210,145 110,145 190,190 160,120",stroke=>red, + fill=>LimeGreen,strokewidth=>3); +# +# Draw rectangle. +# +$image->Draw(primitive=>'line',points=>'200,260 200,200',stroke=>yellow, + strokewidth=>5); +$image->Draw(primitive=>'line',points=>'200,200 260,200',stroke=>yellow, + strokewidth=>5); +$image->Draw(primitive=>'line',points=>'260,200 260,260',stroke=>red, + strokewidth=>5); +$image->Draw(primitive=>'line',points=>'200,260 260,260',stroke=>green, + strokewidth=>5); +# +# Draw text. +# +$image->Annotate(font=>'Generic.ttf',text=>'This is a test!', + geometry=>'+30+140',fill=>'green',pointsize=>24,rotate=>45.0); +$image->Write('piddle.gif'); +$image->Write('piddle.mvg'); +$image->Write('win:'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/pink-flower.gif b/ImageMagick-6.9.12-44/PerlMagick/demo/pink-flower.gif new file mode 100644 index 0000000000000000000000000000000000000000..7222ff5436e81d3a5ad80f8fa4ee192223d36c1e GIT binary patch literal 544 zcmd6kyEEf)0L0hpypj{*&7E%$f_MdyaEQ0?59m;8ltyDF5{k^wDa?4JKaMC)h`t)eiRMw2LrMv)KoBM<6C2GyZT zT6MnEf%eCe($aO)=*y-b9HtM2YlU*FU2Y|eJA5V zZ)<6R3Z4D_z>gWfyV;p&8Jn1zoDL4S+wFN(qyG8X@N&r4W-oAhN9JZ%mIj;biRO0q l(8S_GPerWJWjtMj!$URkN>`J^Q(fzbM@#d|^W%FO{{T3RpIra| literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/pixel-fx.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/pixel-fx.pl new file mode 100755 index 0000000..ae55288 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/pixel-fx.pl @@ -0,0 +1,53 @@ +#!/usr/bin/perl +# +# Example of modifying all the pixels in an image (like -fx). +# +# Currently this is slow as each pixel is being lokedup one pixel at a time. +# The better technique of extracting and modifing a whole row of pixels at +# a time has not been figured out, though perl functions have been provided +# for this. +# +# Also access and controls for Area Re-sampling (EWA), beyond single pixel +# lookup (interpolated unscaled lookup), is also not available at this time. +# +# Anthony Thyssen 5 October 2007 +# +use strict; +use Image::Magick; + +# read original image +my $orig = Image::Magick->new(); +my $w = $orig->Read('rose:'); +warn("$w") if $w; +exit if $w =~ /^Exception/; + + +# make a clone of the image (preserve input, modify output) +my $dest = $orig->Clone(); + +# You could enlarge destination image here if you like. +# And it is posible to modify the existing image directly +# rather than modifying a clone as FX does. + +# Iterate over destination image... +my ($width, $height) = $dest->Get('width', 'height'); + +for( my $j = 0; $j < $height; $j++ ) { + for( my $i = 0; $i < $width; $i++ ) { + + # read original image color + my @pixel = $orig->GetPixel( x=>$i, y=>$j ); + + # modify the pixel values (as normalized floats) + $pixel[0] = $pixel[0]/2; # darken red + + # write pixel to destination + # (quantization and clipping happens here) + $dest->SetPixel(x=>$i,y=>$j,color=>\@pixel); + } +} + +# display the result (or you could save it) +$dest->Write('win:'); +$dest->Write('pixel-fx.gif'); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/red-flower.gif b/ImageMagick-6.9.12-44/PerlMagick/demo/red-flower.gif new file mode 100644 index 0000000000000000000000000000000000000000..3e2aea537c0e3f1134ca9003fc07fe2b1a14312f GIT binary patch literal 694 zcmV;n0!jTxNk%w1VHf}y0OkMy|NsC0+~EJ(-v6_^|D>+}qOJd-tN)&=|DCA*$j$!7 z%>K5%{;IS7qptp)sQ#R&{+y@&o2UMorTwR|{g|WumZJTRn*EKM{fUz(_=b=1dW7$Ggzj~N?rM7D zU2)@CZ{ccf;Aw2xT5Z@_Y}ZU=)JkI0O=QzaVbVxo%0pYqLRiW|R>?wJ$VXepKv%^- zRm474!#!5PJXOIsQ^7M(y*W?2G)%fUP`Wowxi(C;H$k*9LbNeKvo1-qEkv>{N3b$V zurW!mD?_g;L9Q)Csw+gPBR!`kL8l=;rXoC}9WkOKG@>Chpd2co94Vk1G@lzbpBpor z9X6aAHkcMJmK8FV6fKn&FqIWDlN2tJ6e5xkB9Rg-jSnn}3LA+E8i)%chX@vh2_%CE zBY_Aafd?Ug2O)q49)AQDegz+K0~T-t6>kFPp!kdRV-Wi*wKLVH&Zn+S?JeN6?00}6#D zSv`e2c1#C^DOEo+g<*JVAA>h!Ruh6KFm88P7KIdZd21mI0xe=j3lk$NU|&-kiWo&~ za!(xuL^&ErTVqNd5RU~OT5(i7X-O+M>6Cf(x3wrI&6wyP{d)%7cVMAOjuwvK&;VIr$V6% zSnjlWaYE1pD`ad8@}LG!m_jpvR7pVy0TVko3iZfBqELbXg$y+5qeIcGN)N8^5#q2A cjWT`{q_ib;Set( + background => 'none', + fill => 'white', + stroke => 'black', + strokewidth => 2, + Gravity => 'East', + pointsize => 48, + size => '200x300', +); +die $e if $e; + +$e = $im->Read("caption:Lorem ipsum etc etc"); +die $e if $e; + +$e = $im->Trim(); +die $e if $e; + +$e = $im->Write('settings.png'); +die $e if $e; diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/shadow-text.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/shadow-text.pl new file mode 100644 index 0000000..f04f3a1 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/shadow-text.pl @@ -0,0 +1,15 @@ +#!/usr/bin/perl +# +# Make simple text with a shadow. +# +use Image::Magick; + +$image=Image::Magick->new(size=>'525x125'); +$image->Read('xc:white'); +$image->Annotate(font=>'Generic.ttf',fill=>'rgba(100,100,100,0.8)', + pointsize=>60,text=>'Works like magick!',geometry=>'+8+90'); +$image->Blur('0x1'); +$image->Annotate(font=>'Generic.ttf',fill=>'red',stroke=>'blue',pointsize=>60, + text=>'Works like magick!',geometry=>'+4+86'); +$image->Write('shadow.gif'); +$image->Write('win:'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/shapes.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/shapes.pl new file mode 100644 index 0000000..4d97d84 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/shapes.pl @@ -0,0 +1,40 @@ +#!/usr/bin/perl +# GD example using PerlMagick methods. + +use Image::Magick; + +# +# Create a 300x300 white canvas. +# +$image=Image::Magick->new; +$image->Set(size=>'300x300'); +$image->Read('xc:white'); +# +# Draw shapes. +# +$tile=Image::Magick->new; +$tile->Read('tile.gif'); +$image->Draw(primitive=>'Polygon',tile=>$tile,fill=>'none', + points=>'30,30 100,10 190,290 30,290'); +$image->Draw(stroke=>'red',primitive=>'Ellipse',stroke=>'black',fill=>'red', + strokewidth=>5,points=>'100,100 50,75 0,360'); +$image->Draw(primitive=>'Polygon',fill=>'none',stroke=>'black',strokewidth=>5, + points=>'30,30 100,10 190,290 30,290'); +$image->FloodfillPaint(geometry=>'+132+62',fill=>'blue',bordercolor=>'black', + invert=>'true'); +# +# Draw text. +# +$image->Annotate(font=>'Generic.ttf',fill=>'red',geometry=>'+150+20', + pointsize=>18,text=>'Hello world!'); +$image->Annotate(font=>'Generic.ttf',fill=>'blue',geometry=>'+150+38', + pointsize=>14,text=>'Goodbye cruel world!'); +$image->Annotate(font=>'Generic.ttf',fill=>'black',geometry=>'+280+120', + pointsize=>14,text=>"I'm climbing the wall!",rotate=>90.0); +# +# Write image. +# +print "Write image...\n"; +$image->Write('shapes.gif'); +print "Display image...\n"; +$image->Write('win:'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/single-pixels.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/single-pixels.pl new file mode 100755 index 0000000..e364c0f --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/single-pixels.pl @@ -0,0 +1,48 @@ +#!/usr/bin/perl +# +# Methods for to Get and Set single pixels in images using PerlMagick +# +use strict; +use Image::Magick; + +# read image +my $im=Image::Magick->new(); +$im->Read('logo:'); + +# --- + +# Get/Set a single pixel as a string +my $skin=$im->Get('pixel[400,200]'); +print "Get('pixel[x,y]') = ", $skin, "\n"; + +$im->Set('pixel[1,1]'=>'0,0,0,0'); +$im->Set('pixel[2,1]'=>$skin); +$im->Set('pixel[3,1]'=>'green'); +$im->Set('pixel[4,1]'=>'rgb(255,0,255)'); + +# --- + +# More direct single pixel access +my @pixel = $im->GetPixel( x=>400, y=>200 ); +print "GetPixel() = ", "@pixel", "\n"; + +# modify the pixel values (as normalized floats) +$pixel[0] = $pixel[0]/2; # darken red value +$pixel[1] = 0.0; # junk green value +$pixel[2] = 0.0; # junk blue value + +# write pixel to destination +# (quantization and clipping happens here) +$im->SetPixel(x=>5,y=>1,color=>\@pixel); + +# --- + +# crop, scale, display the changed pixels +$im->Crop(geometry=>'7x3+0+0'); +$im->Set(page=>'0x0+0+0'); +$im->Scale('1000%'); + +# Output the changed pixels +$im->Write('win:'); +$im->Write('single-pixels.gif'); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/smile.gif b/ImageMagick-6.9.12-44/PerlMagick/demo/smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..7dede2de499f2e63df33a72c26d6ab848e8a2744 GIT binary patch literal 1349 zcmbW1ze)o^5XLw62QLRgI8un$nBw3Hi!_pmO%REAmG=l~EdstliWH_um%=(WK0<1d zJb|S)<_W|~0vBg*W^VWPk|18S+;3<1n{Q|4`ljDKAGAeVeAxoNkNUy-+udw7tsm#m z7q&Q+e6lCeDX{~B^S}D1^Vh2)q&yaF{8ve z0%ap%)1}xoGL0x{K1$@-q*WCT+S4sdvyoJfEvI}3?a?}O8fq_Q^mEuz&tgu2&XBFI&JLJUQvKG6QyDaShgxXN L9(Z2<oEH6H*+?CGT zVx0b=ZrkrYAuk6+{%4ckwS|une&Rstx)36K2(r#LtSRvB;zyyj|T*ch57 zpz!S!3zJJmr(=Ufl#+nLIWb9=j@7PAj7nkRjtw1mJp~kkN(ERtuCO*SOk6E1pis1( ik;!Fcn1aKUcbqxr%dI&b?mPwtB7>)^pUXO@geCy7n2sF) literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/steganography.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/steganography.pl new file mode 100644 index 0000000..def3e06 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/steganography.pl @@ -0,0 +1,26 @@ +#!/usr/bin/perl + +use Image::Magick; + +# +# Hide an image within an image +# +$watermark=Image::Magick->new; +$watermark->ReadImage('smile.gif'); +($width, $height)=$watermark->Get('width','height'); +# +# Hide image in image. +# +$image=Image::Magick->new; +$image->ReadImage('model.gif'); +$image->SteganoImage(image=>$watermark,offset=>91); +$image->Write('model.png'); +$image->Write('win:'); +# +# Extract image from image. +# +$size="$width" . "x" . "$height" . "+91"; +$stegano=Image::Magick->new(size=>$size); +$stegano->ReadImage('stegano:model.png'); +$stegano->Write('stegano.gif'); +$stegano->Write('win:'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/tile.gif b/ImageMagick-6.9.12-44/PerlMagick/demo/tile.gif new file mode 100644 index 0000000000000000000000000000000000000000..99c8776041b0d35b0e76a380a3372f1b14f905dd GIT binary patch literal 1566 zcmZ?wbhEHbbZ2m9_|Cv^4g~%K;q&Lu{{vY-<|r5qfe{k|It)Mn$_ox0{}{MAWFi<2 zG&FNCvP7J?pm2zhfq`R&$3~^29sG($IWq*64mL8_3H4}PTy%1>1izcj$xTY06BS|) z>D<_ucBt1v_SPE-p|q2oX4PF+c5Yq~IMuk*?#>F4mlqZ>aCpr1TJX|&p>np?k&~tj zVU1zsZd0YqUR+qmZCiKe)z=lbx7*C*%RMzs^T>K*$7f$Xg>o4PQyt3iu%(fe z*-xq@_4ILF&slR{UP(`BFBN}v=FYcw{@oRha&u-FnfUI|vR-VqH!|twg?8g(`(AC% z2wz%pxNqsH=)mA$GN0GI=vs}*qeo4eM;Cq73duflyK=F!>D-77-T`^`u>W-*fGsE)4sw7|2=yu1uV)C6@AD=y{S6F2( z>;C&J`_%4G)9<&7;xxBSYZqR(LMB}6so0YCvz4aT8Pa>j7Y5wlxmBj?kfo+{`3q0A z+3_7qUnE!TNVF81-fOBky~xAL{MmE`Ns)O?ZniU2W`D{&ezShU-{naYOS4#)Cx4f0 zlbo~Z>&xY7Us+!XMejRVersx%n^bCVHg84vk|m6*GBT?JttKs*%(mlY+zi#Laq%DS zZn?K|+P;v7jsJFNR;c@bHO-jdQ{%hqX^;A 'S[---LMA][++++B]', + 'B' => 'S[++LBg][--Cg]', + 'C' => 'S[-----LB]GS[+MC]', + 'g' => '', + 'L' => '[{S+S+S+S+S+S}]' + ); + +%stemchanges = ( + distance => 18.5, + dtheta => 0.1, + motionsub => sub{ + $im->Draw ( primitive=>'line', points=>join(' ',@_), + stroke=>'dark green', strokewidth=>1 ); + } +); + +%polychanges = ( + distance => 3, + dtheta => 0.4, + motionsub => sub{ push( @poly, @_[0..1] ); } +); + +$changes = \%stemchanges; +lsys_init(400); +lsys_execute('A', 10, "tree.gif", %rule); diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/yellow-flower.gif b/ImageMagick-6.9.12-44/PerlMagick/demo/yellow-flower.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3e234544fe7a0cc310654254f13c88640316fb9 GIT binary patch literal 565 zcmchUziSg=9L7I|YBT9UO373dQ(MJLJo-bE4#r?2t%#7#41#14ZoKi9(w^EMfu!wK zq1<380hb#ySh!6x-r#UJy_5KY%R9a}y@O+GBr$=H@8P+)Jthgsm~l)z zViXaDgnf)gE0jbEL`Ig9PDqkwp1>HiMk%C3%4B+FJSL7Ajff(`kba*a!1wVy zT$f&tZkJAnW)p2t8mSPHOps!pR^%j$jS+3DGEy$devnull` || `convert -list Configure 2>$devnull`; + foreach my $line (split '\n', $conf) { + if ($line =~ /^Path:\s+(.*)/) { + my ($vol,$dir,$file) = splitpath($1); + next unless $dir; + my $dirpath = catpath( $vol, $dir); + my (@l,@b,@i) = ( (),(),() ); + + # try to detect 'lib' dir + push @l, catfile($dirpath,'lib'); + push @l, catfile($dirpath,'..','lib'); + push @l, catfile($dirpath,'..','..','lib'); + push @l, catfile($dirpath,'..','..','..','lib'); + foreach (@l) { push @libdir, $_ if (-d $_) }; + + # try to detect 'bin' dir + push @b, catfile($dirpath); + push @b, catfile($dirpath,'bin'); + push @b, catfile($dirpath,'..'); + push @b, catfile($dirpath,'..','bin'); + push @b, catfile($dirpath,'..','..'); + push @b, catfile($dirpath,'..','..','bin'); + push @b, catfile($dirpath,'..','..','..'); + push @b, catfile($dirpath,'..','..','..','bin'); + foreach (@b) { push @bindir, $_ if (-e "$_/convert.exe" || -e "$_/identify.exe") }; + + # try to detect 'include' dir + push @i, catfile($dirpath,'include'); + push @i, catfile($dirpath,'include','ImageMagick'); + push @i, catfile($dirpath,'..','include'); + push @i, catfile($dirpath,'..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','include'); + push @i, catfile($dirpath,'..','..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','..','include'); + push @i, catfile($dirpath,'..','..','..','include','ImageMagick'); + foreach (@i) { push @incdir, $_ if (-e "$_/magick/MagickCore.h") }; + } + }; + + foreach my $bin (@bindir) { + opendir(my $bindir, $bin) or die qq{Cannot opendir $bin: $!}; + my @dlls = map {catfile($bin, $_)} grep /^\S*magick[^\+]\S*?\.dll$/i, readdir $bindir; + foreach my $d (@dlls) { + unlink "$wrkdir/libMagickCore.def", "$wrkdir/libMagickCore.a"; + system("pexports \"$d\" >\"$wrkdir/libMagickCore.def\" 2>$devnull"); + open(DEF, "<$wrkdir/libMagickCore.def"); + my @found = grep(/MagickCoreGenesis/, ); #checking if we have taken the right DLL + close(DEF); + next unless(@found); + print STDERR "Gonna create 'libMagickCore.a' from '$d'\n"; + system("dlltool -D \"$d\" -d \"$wrkdir/libMagickCore.def\" -l \"$wrkdir/libMagickCore.a\" 2>$devnull"); + last if -s "$wrkdir/libMagickCore.a"; + } + last if -s "$wrkdir/libMagickCore.a"; + } + + unless(@incdir && @libdir && @bindir && (-s "$wrkdir/libMagickCore.a")) { + print STDERR <$devnull` || `convert -list Configure 2>$devnull`; + my @delegates = (); + foreach my $line (split '\n', $conf) { + next unless $line =~ /^DELEGATES\s+/; + (undef, @delegates) = split /\s+/, $line; + last; + }; + return @delegates; +} + +# Compute test specification +my $delegate_tests='t/*.t'; +my @tested_delegates = qw/bzlib djvu fftw fontconfig freetype jpeg jng jp2 lcms png rsvg tiff x11 xml wmf zlib/; +my @supported_delegates = AutodetectDelegates(); +# find the intersection of tested and supported delegates +my %seen_delegates = (); +$seen_delegates{$_}++ for @supported_delegates; +foreach my $delegate (@tested_delegates) { + if ( $seen_delegates{$delegate} ) { + if ( -d "t/$delegate" ) { + if ( defined($ENV{'DISPLAY'}) && ($^O ne 'MSWin32') ) { + if ( defined $ENV{'DISPLAY'} ) { + $delegate_tests .= " t/$delegate/*.t"; + } + next; + } + $delegate_tests .= " t/$delegate/*.t"; + } + } +} + +# defaults for LIBS & INC & CCFLAGS params that we later pass to Writemakefile +my $INC_magick = '-I../../ -I../.. -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -I"' . $Config{'usrinc'} . '/ImageMagick"'; +my $LIBS_magick = '-L../../magick/.libs -lMagickCore-6.Q16 -lm -L' . $Config{'archlib'} . '/CORE'; +my $CCFLAGS_magick = "$Config{'ccflags'} -I/usr/include/libxml2 -I/usr/include/libraw -I/usr/include/libpng16 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/uuid -I/usr/include/harfbuzz -I/usr/include/OpenEXR -pthread -I/usr/include/openjpeg-2.4 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/fribidi -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/uuid -pthread -fopenmp -Wall -g -O2 -mtune=amdfam10 -fexceptions -pthread -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16"; +my $LDFLAGS_magick = "-L../../magick/.libs -lMagickCore-6.Q16 $Config{'ldflags'} "; +my $LDDLFLAGS_magick = "-L../../magick/.libs -lMagickCore-6.Q16 $Config{'lddlflags'} "; + +if (($^O eq 'MSWin32') && ($Config{cc} =~ /gcc/)) { + my($Ipaths, $Lpaths) = AutodetectWin32gcc(); + + # + # Setup for strawberry perl. + # + $INC_magick = "$Ipaths"; + $LIBS_magick = "-lMagickCore-6.Q16"; + $CCFLAGS_magick = "$Config{'ccflags'}"; + $LDFLAGS_magick = "$Config{'ldflags'} $Lpaths "; + $LDDLFLAGS_magick = "$Config{'lddlflags'} $Lpaths "; +} + +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile + ( + # Module description + 'ABSTRACT' => 'ImageMagick PERL Extension (Q16)', + + # Perl module name is Image::Magick + 'NAME' => 'Image::Magick::Q16', + + # Module author + 'AUTHOR' => 'ImageMagick Studio LLC', + + # Module version + 'VERSION' => '6.9.12', + + # Preprocessor defines + 'DEFINE' => ' -D_LARGE_FILES=1 -DHAVE_CONFIG_H', # e.g., '-DHAVE_SOMETHING' + + # Header search specfication and preprocessor flags + 'INC' => $INC_magick, + + # C compiler + #'CC' => 'gcc', + + # C pre-processor flags (e.g. -I & -D options) + # 'CPPFLAGS' => "$Config{'cppflags'} -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 ", + + # C compiler flags (e.g. -O -g) + 'CCFLAGS' => $CCFLAGS_magick, + + # Linker + #'LD' => $Config{'ld'} == $Config{'cc'} ? 'gcc' : $Config{'ld'}, + + # Linker flags for building an executable + 'LDFLAGS' => $LDFLAGS_magick, + + # Linker flags for building a dynamically loadable module + 'LDDLFLAGS' => $LDDLFLAGS_magick, + + # Install PerlMagick binary into ImageMagick bin directory + 'INSTALLBIN' => '/usr/bin', + + # Library specification + 'LIBS' => [ $LIBS_magick ], + + # Perl binary name (if a Perl binary is built) + 'MAP_TARGET' => 'PerlMagick', + + # Let CFLAGS drive optimization flags by setting OPTIMIZE to empty + # 'OPTIMIZE' => '', + + # Use same compiler as ImageMagick + 'PERLMAINCC' => ' -fopenmp', + 'PM' => { 'Q16.pm' => '$(INST_LIBDIR)/Q16.pm' }, + 'XS' => { 'Q16.xs' => 'Q16.xs' }, + 'AR' => 'ar', + 'LD' => '', + + # Set Perl installation prefix to ImageMagick installation prefix +# 'PREFIX' => '/usr', + + # Include delegate directories in tests + test => { TESTS => $delegate_tests}, + + ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()), + +# sane vesion + depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' } +); + + +# +# Substitutions for "makeaperl" section. +# +sub MY::makeaperl { + package MY; # so that "SUPER" works right + my $inherited = shift->SUPER::makeaperl(@_); + + # Stinky ExtUtils::MM_Unix likes to append its own library path to $(CC), + # prior to any user-specified library path so that an installed library is + # used rather than the library just built. This substitution function + # tries to insert our library path first. Also, use the same compiler used + # to build perlmain.c to link so that a C++ compiler may be used if + # necessary. + $inherited =~ s:MAP_LINKCMD\s.*\s*\$\(CC\):MAP_LINKCMD = \$(PERLMAINCC) -L/usr/lib64: ; + $inherited; + } diff --git a/ImageMagick-6.9.12-44/PerlMagick/quantum/Makefile.PL.in b/ImageMagick-6.9.12-44/PerlMagick/quantum/Makefile.PL.in new file mode 100644 index 0000000..21a534a --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/quantum/Makefile.PL.in @@ -0,0 +1,270 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Exercise all regression tests: +# +# make test +# +# Exersise one regression test: +# +# make TEST_VERBOSE=1 TEST_FILES=t/filter.t test +# + +use ExtUtils::MakeMaker; +use Config; +use File::Spec::Functions qw/catfile catdir devnull catpath splitpath/; +use Cwd; + +sub AutodetectWin32gcc { + my $wrkdir = getcwd(); + my $devnull = devnull(); + + my @incdir = (); + my @libdir = ($wrkdir); + my @bindir = (); + + #try to get configuration info via identify or convert utilities + my $conf = `identify -list Configure 2>$devnull` || `convert -list Configure 2>$devnull`; + foreach my $line (split '\n', $conf) { + if ($line =~ /^Path:\s+(.*)/) { + my ($vol,$dir,$file) = splitpath($1); + next unless $dir; + my $dirpath = catpath( $vol, $dir); + my (@l,@b,@i) = ( (),(),() ); + + # try to detect 'lib' dir + push @l, catfile($dirpath,'lib'); + push @l, catfile($dirpath,'..','lib'); + push @l, catfile($dirpath,'..','..','lib'); + push @l, catfile($dirpath,'..','..','..','lib'); + foreach (@l) { push @libdir, $_ if (-d $_) }; + + # try to detect 'bin' dir + push @b, catfile($dirpath); + push @b, catfile($dirpath,'bin'); + push @b, catfile($dirpath,'..'); + push @b, catfile($dirpath,'..','bin'); + push @b, catfile($dirpath,'..','..'); + push @b, catfile($dirpath,'..','..','bin'); + push @b, catfile($dirpath,'..','..','..'); + push @b, catfile($dirpath,'..','..','..','bin'); + foreach (@b) { push @bindir, $_ if (-e "$_/convert.exe" || -e "$_/identify.exe") }; + + # try to detect 'include' dir + push @i, catfile($dirpath,'include'); + push @i, catfile($dirpath,'include','ImageMagick'); + push @i, catfile($dirpath,'..','include'); + push @i, catfile($dirpath,'..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','include'); + push @i, catfile($dirpath,'..','..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','..','include'); + push @i, catfile($dirpath,'..','..','..','include','ImageMagick'); + foreach (@i) { push @incdir, $_ if (-e "$_/magick/MagickCore.h") }; + } + }; + + foreach my $bin (@bindir) { + opendir(my $bindir, $bin) or die qq{Cannot opendir $bin: $!}; + my @dlls = map {catfile($bin, $_)} grep /^\S*magick[^\+]\S*?\.dll$/i, readdir $bindir; + foreach my $d (@dlls) { + unlink "$wrkdir/libMagickCore.def", "$wrkdir/libMagickCore.a"; + system("pexports \"$d\" >\"$wrkdir/libMagickCore.def\" 2>$devnull"); + open(DEF, "<$wrkdir/libMagickCore.def"); + my @found = grep(/MagickCoreGenesis/, ); #checking if we have taken the right DLL + close(DEF); + next unless(@found); + print STDERR "Gonna create 'libMagickCore.a' from '$d'\n"; + system("dlltool -D \"$d\" -d \"$wrkdir/libMagickCore.def\" -l \"$wrkdir/libMagickCore.a\" 2>$devnull"); + last if -s "$wrkdir/libMagickCore.a"; + } + last if -s "$wrkdir/libMagickCore.a"; + } + + unless(@incdir && @libdir && @bindir && (-s "$wrkdir/libMagickCore.a")) { + print STDERR <$devnull` || `convert -list Configure 2>$devnull`; + my @delegates = (); + foreach my $line (split '\n', $conf) { + next unless $line =~ /^DELEGATES\s+/; + (undef, @delegates) = split /\s+/, $line; + last; + }; + return @delegates; +} + +# Compute test specification +my $delegate_tests='t/*.t'; +my @tested_delegates = qw/bzlib djvu fftw fontconfig freetype jpeg jng jp2 lcms png rsvg tiff x11 xml wmf zlib/; +my @supported_delegates = AutodetectDelegates(); +# find the intersection of tested and supported delegates +my %seen_delegates = (); +$seen_delegates{$_}++ for @supported_delegates; +foreach my $delegate (@tested_delegates) { + if ( $seen_delegates{$delegate} ) { + if ( -d "t/$delegate" ) { + if ( defined($ENV{'DISPLAY'}) && ($^O ne 'MSWin32') ) { + if ( defined $ENV{'DISPLAY'} ) { + $delegate_tests .= " t/$delegate/*.t"; + } + next; + } + $delegate_tests .= " t/$delegate/*.t"; + } + } +} + +# defaults for LIBS & INC & CCFLAGS params that we later pass to Writemakefile +my $INC_magick = '-I../../ -I@top_srcdir@ @CPPFLAGS@ -I"' . $Config{'usrinc'} . '/ImageMagick"'; +my $LIBS_magick = '-L../../magick/.libs -lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ @MATH_LIBS@ -L' . $Config{'archlib'} . '/CORE'; +my $CCFLAGS_magick = "$Config{'ccflags'} @CFLAGS@"; +my $LDFLAGS_magick = "-L../../magick/.libs -lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ $Config{'ldflags'} @LDFLAGS@"; +my $LDDLFLAGS_magick = "-L../../magick/.libs -lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ $Config{'lddlflags'} @LDFLAGS@"; + +if (($^O eq 'MSWin32') && ($Config{cc} =~ /gcc/)) { + my($Ipaths, $Lpaths) = AutodetectWin32gcc(); + + # + # Setup for strawberry perl. + # + $INC_magick = "$Ipaths"; + $LIBS_magick = "-lMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@"; + $CCFLAGS_magick = "$Config{'ccflags'}"; + $LDFLAGS_magick = "$Config{'ldflags'} $Lpaths "; + $LDDLFLAGS_magick = "$Config{'lddlflags'} $Lpaths "; +} + +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile + ( + # Module description + 'ABSTRACT' => 'ImageMagick PERL Extension (@MAGICK_ABI_SUFFIX@)', + + # Perl module name is Image::Magick + 'NAME' => 'Image::Magick::@MAGICK_ABI_SUFFIX@', + + # Module author + 'AUTHOR' => 'ImageMagick Studio LLC', + + # Module version + 'VERSION' => '@PACKAGE_BASE_VERSION@', + + # Preprocessor defines + 'DEFINE' => '@LFS_CPPFLAGS@ @DEFS@', # e.g., '-DHAVE_SOMETHING' + + # Header search specfication and preprocessor flags + 'INC' => $INC_magick, + + # C compiler + #'CC' => '@CC@', + + # C pre-processor flags (e.g. -I & -D options) + # 'CPPFLAGS' => "$Config{'cppflags'} @CPPFLAGS@", + + # C compiler flags (e.g. -O -g) + 'CCFLAGS' => $CCFLAGS_magick, + + # Linker + #'LD' => $Config{'ld'} == $Config{'cc'} ? '@CC@' : $Config{'ld'}, + + # Linker flags for building an executable + 'LDFLAGS' => $LDFLAGS_magick, + + # Linker flags for building a dynamically loadable module + 'LDDLFLAGS' => $LDDLFLAGS_magick, + + # Install PerlMagick binary into ImageMagick bin directory + 'INSTALLBIN' => '@BIN_DIR@', + + # Library specification + 'LIBS' => [ $LIBS_magick ], + + # Perl binary name (if a Perl binary is built) + 'MAP_TARGET' => 'PerlMagick', + + # Let CFLAGS drive optimization flags by setting OPTIMIZE to empty + # 'OPTIMIZE' => '', + + # Use same compiler as ImageMagick + 'PERLMAINCC' => '@PERLMAINCC@ @OPENMP_CFLAGS@', + 'PM' => { '@MAGICK_ABI_SUFFIX@.pm' => '$(INST_LIBDIR)/@MAGICK_ABI_SUFFIX@.pm' }, + 'XS' => { '@MAGICK_ABI_SUFFIX@.xs' => '@MAGICK_ABI_SUFFIX@.xs' }, + 'AR' => '@AR@', + 'LD' => '@PERLMAINCC@', + + # Set Perl installation prefix to ImageMagick installation prefix +# 'PREFIX' => '@prefix@', + + # Include delegate directories in tests + test => { TESTS => $delegate_tests}, + + ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()), + +# sane vesion + depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' } +); + + +# +# Substitutions for "makeaperl" section. +# +sub MY::makeaperl { + package MY; # so that "SUPER" works right + my $inherited = shift->SUPER::makeaperl(@_); + + # Stinky ExtUtils::MM_Unix likes to append its own library path to $(CC), + # prior to any user-specified library path so that an installed library is + # used rather than the library just built. This substitution function + # tries to insert our library path first. Also, use the same compiler used + # to build perlmain.c to link so that a C++ compiler may be used if + # necessary. + $inherited =~ s:MAP_LINKCMD\s.*\s*\$\(CC\):MAP_LINKCMD = \$(PERLMAINCC) -L@MAGICKCORE_PATH@: ; + $inherited; + } diff --git a/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.pm b/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.pm new file mode 100644 index 0000000..a6aea49 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.pm @@ -0,0 +1,144 @@ +package Image::Magick::Q16; + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Initial version, written by Kyle Shorter. + +use strict; +use Carp; +use vars qw($VERSION @ISA @EXPORT $AUTOLOAD); + +require 5.002; +require Exporter; +require DynaLoader; +require AutoLoader; + +@ISA = qw(Exporter DynaLoader); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = + qw( + Success Transparent Opaque QuantumDepth QuantumRange MaxRGB + WarningException ResourceLimitWarning TypeWarning OptionWarning + DelegateWarning MissingDelegateWarning CorruptImageWarning + FileOpenWarning BlobWarning StreamWarning CacheWarning CoderWarning + ModuleWarning DrawWarning ImageWarning XServerWarning RegistryWarning + ConfigureWarning ErrorException ResourceLimitError TypeError + OptionError DelegateError MissingDelegateError CorruptImageError + FileOpenError BlobError StreamError CacheError CoderError + ModuleError DrawError ImageError XServerError RegistryError + ConfigureError FatalErrorException + ); + +$VERSION = '6.9.12'; + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + no warnings; + + my $constname; + ($constname = $AUTOLOAD) =~ s/.*:://; + die "&${AUTOLOAD} not defined. The required ImageMagick libraries are not installed or not installed properly.\n" if $constname eq 'constant'; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + my($pack,$file,$line) = caller; + die "Your vendor has not defined PerlMagick macro $pack\:\:$constname, used at $file line $line.\n"; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Image::Magick::Q16 $VERSION; + +# Preloaded methods go here. + +sub new +{ + my $this = shift; + my $class = ref($this) || $this || "Image::Magick::Q16"; + my $self = [ ]; + bless $self, $class; + $self->set(@_) if @_; + return $self; +} + +sub New +{ + my $this = shift; + my $class = ref($this) || $this || "Image::Magick::Q16"; + my $self = [ ]; + bless $self, $class; + $self->set(@_) if @_; + return $self; +} + +# Autoload methods go after =cut, and are processed by the autosplit program. + +END { UNLOAD () }; + +1; +__END__ + +=head1 NAME + +Image::Magick::Q16 - objected-oriented Perl interface to ImageMagick (Q16). Use it to create, edit, compose, or convert bitmap images from within a Perl script. + +=head1 SYNOPSIS + + use Image::Magick::Q16; + $p = new Image::Magick::Q16; + $p->Read("imagefile"); + $p->Set(attribute => value, ...) + ($a, ...) = $p->Get("attribute", ...) + $p->routine(parameter => value, ...) + $p->Mogrify("Routine", parameter => value, ...) + $p->Write("filename"); + +=head1 DESCRIPTION + +This Perl extension allows the reading, manipulation and writing of +a large number of image file formats using the ImageMagick library. +It was originally developed to be used by CGI scripts for Web pages. + +A web page has been set up for this extension. See: + + https://imagemagick.org/script/perl-magick.php + +If you have problems, go to + + https://github.com/ImageMagick/ImageMagick6/discussions/categories/development + +=head1 AUTHOR + +Kyle Shorter magick-users@imagemagick.org + +=head1 BUGS + +Has all the bugs of ImageMagick and much, much more! + +=head1 SEE ALSO + +perl(1). + +=cut diff --git a/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.pm.in b/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.pm.in new file mode 100644 index 0000000..2aefe21 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.pm.in @@ -0,0 +1,144 @@ +package Image::Magick::@MAGICK_ABI_SUFFIX@; + +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Initial version, written by Kyle Shorter. + +use strict; +use Carp; +use vars qw($VERSION @ISA @EXPORT $AUTOLOAD); + +require 5.002; +require Exporter; +require DynaLoader; +require AutoLoader; + +@ISA = qw(Exporter DynaLoader); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = + qw( + Success Transparent Opaque QuantumDepth QuantumRange MaxRGB + WarningException ResourceLimitWarning TypeWarning OptionWarning + DelegateWarning MissingDelegateWarning CorruptImageWarning + FileOpenWarning BlobWarning StreamWarning CacheWarning CoderWarning + ModuleWarning DrawWarning ImageWarning XServerWarning RegistryWarning + ConfigureWarning ErrorException ResourceLimitError TypeError + OptionError DelegateError MissingDelegateError CorruptImageError + FileOpenError BlobError StreamError CacheError CoderError + ModuleError DrawError ImageError XServerError RegistryError + ConfigureError FatalErrorException + ); + +$VERSION = '@PACKAGE_BASE_VERSION@'; + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + no warnings; + + my $constname; + ($constname = $AUTOLOAD) =~ s/.*:://; + die "&${AUTOLOAD} not defined. The required ImageMagick libraries are not installed or not installed properly.\n" if $constname eq 'constant'; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + my($pack,$file,$line) = caller; + die "Your vendor has not defined PerlMagick macro $pack\:\:$constname, used at $file line $line.\n"; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Image::Magick::@MAGICK_ABI_SUFFIX@ $VERSION; + +# Preloaded methods go here. + +sub new +{ + my $this = shift; + my $class = ref($this) || $this || "Image::Magick::@MAGICK_ABI_SUFFIX@"; + my $self = [ ]; + bless $self, $class; + $self->set(@_) if @_; + return $self; +} + +sub New +{ + my $this = shift; + my $class = ref($this) || $this || "Image::Magick::@MAGICK_ABI_SUFFIX@"; + my $self = [ ]; + bless $self, $class; + $self->set(@_) if @_; + return $self; +} + +# Autoload methods go after =cut, and are processed by the autosplit program. + +END { UNLOAD () }; + +1; +__END__ + +=head1 NAME + +Image::Magick::@MAGICK_ABI_SUFFIX@ - objected-oriented Perl interface to ImageMagick (@MAGICK_ABI_SUFFIX@). Use it to create, edit, compose, or convert bitmap images from within a Perl script. + +=head1 SYNOPSIS + + use Image::Magick::@MAGICK_ABI_SUFFIX@; + $p = new Image::Magick::@MAGICK_ABI_SUFFIX@; + $p->Read("imagefile"); + $p->Set(attribute => value, ...) + ($a, ...) = $p->Get("attribute", ...) + $p->routine(parameter => value, ...) + $p->Mogrify("Routine", parameter => value, ...) + $p->Write("filename"); + +=head1 DESCRIPTION + +This Perl extension allows the reading, manipulation and writing of +a large number of image file formats using the ImageMagick library. +It was originally developed to be used by CGI scripts for Web pages. + +A web page has been set up for this extension. See: + + https://imagemagick.org/script/perl-magick.php + +If you have problems, go to + + https://github.com/ImageMagick/ImageMagick6/discussions/categories/development + +=head1 AUTHOR + +Kyle Shorter magick-users@imagemagick.org + +=head1 BUGS + +Has all the bugs of ImageMagick and much, much more! + +=head1 SEE ALSO + +perl(1). + +=cut diff --git a/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.xs b/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.xs new file mode 100644 index 0000000..3ea439f --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.xs @@ -0,0 +1,14586 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% PPPP EEEEE RRRR L % +% P P E R R L % +% PPPP EEE RRRR L % +% P E R R L % +% P EEEEE R R LLLLL % +% % +% M M AAA GGGG IIIII CCCC K K % +% MM MM A A G I C K K % +% M M M AAAAA G GGG I C KKK % +% M M A A G G I C K K % +% M M A A GGGG IIIII CCCC K K % +% % +% % +% Object-oriented Perl interface to ImageMagick % +% % +% Software Design % +% Kyle Shorter % +% Cristy % +% February 1997 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PerlMagick is an objected-oriented Perl interface to ImageMagick. Use +% the module to read, manipulate, or write an image or image sequence from +% within a Perl script. This makes PerlMagick suitable for Web CGI scripts. +% +*/ + +/* + Include declarations. +*/ +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" +#include +#include +#undef tainted + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +/* + Define declarations. +*/ +#ifndef aTHX_ +#define aTHX_ +#define pTHX_ +#define dTHX +#endif +#define DegreesToRadians(x) (MagickPI*(x)/180.0) +#define EndOf(array) (&array[NumberOf(array)]) +#define MagickPI 3.14159265358979323846264338327950288419716939937510 +#define MaxArguments 34 +#ifndef na +#define na PL_na +#endif +#define NumberOf(array) (sizeof(array)/sizeof(*array)) +#define PackageName "Image::Magick::Q16" +#if PERL_VERSION <= 6 +#define PerlIO FILE +#define PerlIO_importFILE(f, fl) (f) +#define PerlIO_findFILE(f) NULL +#endif +#ifndef sv_undef +#define sv_undef PL_sv_undef +#endif + +#define AddImageToRegistry(sv,image) \ +{ \ + if (magick_registry != (SplayTreeInfo *) NULL) \ + { \ + (void) AddValueToSplayTree(magick_registry,image,image); \ + (sv)=newSViv(PTR2IV(image)); \ + } \ +} + +#define DeleteImageFromRegistry(reference,image) \ +{ \ + if (magick_registry != (SplayTreeInfo *) NULL) \ + { \ + if (GetImageReferenceCount(image) == 1) \ + (void) DeleteNodeByValueFromSplayTree(magick_registry,image); \ + image=DestroyImage(image); \ + sv_setiv(reference,0); \ + } \ +} + +#define InheritPerlException(exception,perl_exception) \ +{ \ + char \ + message[MaxTextExtent]; \ + \ + if ((exception)->severity != UndefinedException) \ + { \ + (void) FormatLocaleString(message,MaxTextExtent,"Exception %d: %s%s%s%s",\ + (exception)->severity, (exception)->reason ? \ + GetLocaleExceptionMessage((exception)->severity,(exception)->reason) : \ + "Unknown", (exception)->description ? " (" : "", \ + (exception)->description ? GetLocaleExceptionMessage( \ + (exception)->severity,(exception)->description) : "", \ + (exception)->description ? ")" : ""); \ + if ((perl_exception) != (SV *) NULL) \ + { \ + if (SvCUR(perl_exception)) \ + sv_catpv(perl_exception,"\n"); \ + sv_catpv(perl_exception,message); \ + } \ + } \ +} + +#define ThrowPerlException(exception,severity,tag,reason) \ + (void) ThrowMagickException(exception,GetMagickModule(),severity, \ + tag,"`%s'",reason); \ + +/* + Typedef and structure declarations. +*/ +typedef enum +{ + NullReference = 0, + ArrayReference = (~0), + RealReference = (~0)-1, + FileReference = (~0)-2, + ImageReference = (~0)-3, + IntegerReference = (~0)-4, + StringReference = (~0)-5 +} MagickReference; + +typedef struct _Arguments +{ + const char + *method; + + ssize_t + type; +} Arguments; + +struct ArgumentList +{ + ssize_t + integer_reference; + + MagickRealType + real_reference; + + const char + *string_reference; + + Image + *image_reference; + + SV + *array_reference; + + FILE + *file_reference; + + size_t + length; +}; + +struct PackageInfo +{ + ImageInfo + *image_info; +}; + +typedef void + *Image__Magick__Q16; /* data type for the Image::Magick::Q16 package */ + +/* + Static declarations. +*/ +static struct + Methods + { + const char + *name; + + Arguments + arguments[MaxArguments]; + } Methods[] = + { + { "Comment", { {"comment", StringReference} } }, + { "Label", { {"label", StringReference} } }, + { "AddNoise", { {"noise", MagickNoiseOptions}, + {"channel", MagickChannelOptions} } }, + { "Colorize", { {"fill", StringReference}, {"opacity", StringReference} } }, + { "Border", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"fill", StringReference}, + {"bordercolor", StringReference}, {"color", StringReference}, + {"compose", MagickComposeOptions} } }, + { "Blur", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference}, {"channel", MagickChannelOptions} } }, + { "Chop", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"x", IntegerReference}, + {"y", IntegerReference}, {"gravity", MagickGravityOptions} } }, + { "Crop", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"x", IntegerReference}, + {"y", IntegerReference}, {"fuzz", StringReference}, + {"gravity", MagickGravityOptions} } }, + { "Despeckle", { { (const char *) NULL, NullReference } } }, + { "Edge", { {"radius", RealReference} } }, + { "Emboss", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference} } }, + { "Enhance", { { (const char *) NULL, NullReference } } }, + { "Flip", { { (const char *) NULL, NullReference } } }, + { "Flop", { { (const char *) NULL, NullReference } } }, + { "Frame", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"inner", IntegerReference}, + {"outer", IntegerReference}, {"fill", StringReference}, + {"color", StringReference}, {"compose", MagickComposeOptions} } }, + { "Implode", { {"amount", RealReference}, + {"interpolate", MagickInterpolateOptions} } }, + { "Magnify", { { (const char *) NULL, NullReference } } }, + { "MedianFilter", { {"geometry", StringReference}, + {"width", IntegerReference},{"height", IntegerReference}, + {"channel", MagickChannelOptions} } }, + { "Minify", { { (const char *) NULL, NullReference } } }, + { "OilPaint", { {"radius", RealReference} } }, + { "ReduceNoise", { {"geometry", StringReference}, + {"width", IntegerReference},{"height", IntegerReference}, + {"channel", MagickChannelOptions} } }, + { "Roll", { {"geometry", StringReference}, {"x", IntegerReference}, + {"y", IntegerReference} } }, + { "Rotate", { {"degrees", RealReference}, {"fill", StringReference}, + {"color", StringReference}, {"background", StringReference} } }, + { "Sample", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference} } }, + { "Scale", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference} } }, + { "Shade", { {"geometry", StringReference}, {"azimuth", RealReference}, + {"elevation", RealReference}, {"gray", MagickBooleanOptions} } }, + { "Sharpen", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference}, {"channel", MagickChannelOptions} } }, + { "Shear", { {"geometry", StringReference}, {"x", RealReference}, + {"y", RealReference}, { "fill", StringReference}, + {"color", StringReference} } }, + { "Spread", { {"radius", RealReference}, + {"interpolate", MagickInterpolateOptions} } }, + { "Swirl", { {"degrees", RealReference}, + {"interpolate", MagickInterpolateOptions} } }, + { "Resize", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"filter", MagickFilterOptions}, + {"support", StringReference }, {"blur", RealReference } } }, + { "Zoom", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"filter", MagickFilterOptions}, + {"support", RealReference }, {"blur", RealReference } } }, + { "Annotate", { {"text", StringReference}, {"font", StringReference}, + {"pointsize", RealReference}, {"density", StringReference}, + {"undercolor", StringReference}, {"stroke", StringReference}, + {"fill", StringReference}, {"geometry", StringReference}, + {"pen", StringReference}, {"x", RealReference}, + {"y", RealReference}, {"gravity", MagickGravityOptions}, + {"translate", StringReference}, {"scale", StringReference}, + {"rotate", RealReference}, {"skewX", RealReference}, + {"skewY", RealReference}, {"strokewidth", RealReference}, + {"antialias", MagickBooleanOptions}, {"family", StringReference}, + {"style", MagickStyleOptions}, {"stretch", MagickStretchOptions}, + {"weight", IntegerReference}, {"align", MagickAlignOptions}, + {"encoding", StringReference}, {"affine", ArrayReference}, + {"fill-pattern", ImageReference}, {"stroke-pattern", ImageReference}, + {"tile", ImageReference}, {"kerning", RealReference}, + {"interline-spacing", RealReference}, + {"interword-spacing", RealReference}, + {"direction", MagickDirectionOptions}, + {"decorate", MagickDecorateOptions} } }, + { "ColorFloodfill", { {"geometry", StringReference}, + {"x", IntegerReference}, {"y", IntegerReference}, + {"fill", StringReference}, {"bordercolor", StringReference}, + {"fuzz", StringReference}, {"invert", MagickBooleanOptions} } }, + { "Composite", { {"image", ImageReference}, + {"compose", MagickComposeOptions}, {"geometry", StringReference}, + {"x", IntegerReference}, {"y", IntegerReference}, + {"gravity", MagickGravityOptions}, {"opacity", StringReference}, + {"tile", MagickBooleanOptions}, {"rotate", RealReference}, + {"color", StringReference}, {"mask", ImageReference}, + {"channel", MagickChannelOptions}, + {"interpolate", MagickInterpolateOptions}, {"args", StringReference}, + {"blend", StringReference} } }, + { "Contrast", { {"sharpen", MagickBooleanOptions} } }, + { "CycleColormap", { {"display", IntegerReference} } }, + { "Draw", { {"primitive", MagickPrimitiveOptions}, + {"points", StringReference}, {"method", MagickMethodOptions}, + {"stroke", StringReference}, {"fill", StringReference}, + {"strokewidth", RealReference}, {"font", StringReference}, + {"bordercolor", StringReference}, {"x", RealReference}, + {"y", RealReference}, {"translate", StringReference}, + {"scale", StringReference}, {"rotate", RealReference}, + {"skewX", RealReference}, {"skewY", RealReference}, + {"tile", ImageReference}, {"pointsize", RealReference}, + {"antialias", MagickBooleanOptions}, {"density", StringReference}, + {"linewidth", RealReference}, {"affine", ArrayReference}, + {"stroke-dashoffset", RealReference}, + {"stroke-dasharray", ArrayReference}, + {"interpolate", MagickInterpolateOptions}, + {"origin", StringReference}, {"text", StringReference}, + {"fill-pattern", ImageReference}, {"stroke-pattern", ImageReference}, + {"vector-graphics", StringReference}, {"kerning", RealReference}, + {"interline-spacing", RealReference}, + {"interword-spacing", RealReference}, + {"direction", MagickDirectionOptions} } }, + { "Equalize", { {"channel", MagickChannelOptions} } }, + { "Gamma", { {"gamma", StringReference}, {"channel", MagickChannelOptions}, + {"red", RealReference}, {"green", RealReference}, + {"blue", RealReference} } }, + { "Map", { {"image", ImageReference}, {"dither", MagickBooleanOptions}, + {"dither-method", MagickDitherOptions} } }, + { "MatteFloodfill", { {"geometry", StringReference}, + {"x", IntegerReference}, {"y", IntegerReference}, + {"opacity", StringReference}, {"bordercolor", StringReference}, + {"fuzz", StringReference}, {"invert", MagickBooleanOptions} } }, + { "Modulate", { {"factor", StringReference}, {"hue", RealReference}, + {"saturation", RealReference}, {"whiteness", RealReference}, + {"brightness", RealReference}, {"lightness", RealReference}, + {"blackness", RealReference} } }, + { "Negate", { {"gray", MagickBooleanOptions}, + {"channel", MagickChannelOptions} } }, + { "Normalize", { {"channel", MagickChannelOptions} } }, + { "NumberColors", { { (const char *) NULL, NullReference } } }, + { "Opaque", { {"color", StringReference}, {"fill", StringReference}, + {"fuzz", StringReference}, {"channel", MagickChannelOptions}, + {"invert", MagickBooleanOptions} } }, + { "Quantize", { {"colors", IntegerReference}, + {"treedepth", IntegerReference}, {"colorspace", MagickColorspaceOptions}, + {"dither", MagickBooleanOptions}, {"measure", MagickBooleanOptions}, + {"global", MagickBooleanOptions}, {"transparent-color", StringReference}, + {"dither-method", MagickDitherOptions} } }, + { "Raise", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"raise", MagickBooleanOptions} } }, + { "Segment", { {"geometry", StringReference}, + {"cluster-threshold", RealReference}, + {"smoothing-threshold", RealReference}, + {"colorspace", MagickColorspaceOptions}, + {"verbose", MagickBooleanOptions} } }, + { "Signature", { { (const char *) NULL, NullReference } } }, + { "Solarize", { {"geometry", StringReference}, + {"threshold", StringReference}, {"channel", MagickChannelOptions} } }, + { "Sync", { { (const char *) NULL, NullReference } } }, + { "Texture", { {"texture", ImageReference} } }, + { "Evaluate", { {"value", RealReference}, + {"operator", MagickEvaluateOptions}, + {"channel", MagickChannelOptions} } }, + { "Transparent", { {"color", StringReference}, {"opacity", StringReference}, + {"fuzz", StringReference}, {"invert", MagickBooleanOptions} } }, + { "Threshold", { {"threshold", StringReference}, + {"channel", MagickChannelOptions} } }, + { "Charcoal", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference} } }, + { "Trim", { {"fuzz", StringReference} } }, + { "Wave", { {"geometry", StringReference}, {"amplitude", RealReference}, + {"wavelength", RealReference}, + {"interpolate", MagickInterpolateOptions} } }, + { "Separate", { {"channel", MagickChannelOptions} } }, + { "Condense", { { (const char *) NULL, NullReference } } }, + { "Stereo", { {"image", ImageReference}, {"x", IntegerReference}, + {"y", IntegerReference} } }, + { "Stegano", { {"image", ImageReference}, {"offset", IntegerReference} } }, + { "Deconstruct", { { (const char *) NULL, NullReference } } }, + { "GaussianBlur", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Convolve", { {"coefficients", ArrayReference}, + {"channel", MagickChannelOptions}, {"bias", StringReference} } }, + { "Profile", { {"name", StringReference}, {"profile", StringReference}, + { "rendering-intent", MagickIntentOptions}, + { "black-point-compensation", MagickBooleanOptions} } }, + { "UnsharpMask", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"amount", RealReference}, {"threshold", RealReference}, + {"channel", MagickChannelOptions} } }, + { "MotionBlur", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"angle", RealReference}, {"channel", MagickChannelOptions} } }, + { "OrderedDither", { {"threshold", StringReference}, + {"channel", MagickChannelOptions} } }, + { "Shave", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference} } }, + { "Level", { {"levels", StringReference}, {"black-point", RealReference}, + {"white-point", RealReference}, {"gamma", RealReference}, + {"channel", MagickChannelOptions}, {"level", StringReference} } }, + { "Clip", { {"id", StringReference}, {"inside", MagickBooleanOptions} } }, + { "AffineTransform", { {"affine", ArrayReference}, + {"translate", StringReference}, {"scale", StringReference}, + {"rotate", RealReference}, {"skewX", RealReference}, + {"skewY", RealReference}, {"interpolate", MagickInterpolateOptions}, + {"background", StringReference} } }, + { "Difference", { {"image", ImageReference}, {"fuzz", StringReference} } }, + { "AdaptiveThreshold", { {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"offset", IntegerReference} } }, + { "Resample", { {"density", StringReference}, {"x", RealReference}, + {"y", RealReference}, {"filter", MagickFilterOptions}, + {"support", RealReference }, {"blur", RealReference } } }, + { "Describe", { {"file", FileReference} } }, + { "BlackThreshold", { {"threshold", StringReference}, + {"channel", MagickChannelOptions} } }, + { "WhiteThreshold", { {"threshold", StringReference}, + {"channel", MagickChannelOptions} } }, + { "RotationalBlur", { {"geometry", StringReference}, + {"angle", RealReference}, {"channel", MagickChannelOptions} } }, + { "Thumbnail", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference} } }, + { "Strip", { { (const char *) NULL, NullReference } } }, + { "Tint", { {"fill", StringReference}, {"opacity", StringReference} } }, + { "Channel", { {"channel", MagickChannelOptions} } }, + { "Splice", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"x", IntegerReference}, + {"y", IntegerReference}, {"fuzz", StringReference}, + {"background", StringReference}, {"gravity", MagickGravityOptions} } }, + { "Posterize", { {"levels", IntegerReference}, + {"dither", MagickBooleanOptions} } }, + { "Shadow", { {"geometry", StringReference}, {"opacity", RealReference}, + {"sigma", RealReference}, {"x", IntegerReference}, + {"y", IntegerReference} } }, + { "Identify", { {"file", FileReference}, {"features", StringReference}, + {"moments", MagickBooleanOptions}, {"unique", MagickBooleanOptions} } }, + { "SepiaTone", { {"threshold", RealReference} } }, + { "SigmoidalContrast", { {"geometry", StringReference}, + {"contrast", RealReference}, {"mid-point", RealReference}, + {"channel", MagickChannelOptions}, {"sharpen", MagickBooleanOptions} } }, + { "Extent", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"x", IntegerReference}, + {"y", IntegerReference}, {"fuzz", StringReference}, + {"background", StringReference}, {"gravity", MagickGravityOptions} } }, + { "Vignette", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference}, {"x", IntegerReference}, + {"y", IntegerReference}, {"background", StringReference} } }, + { "ContrastStretch", { {"levels", StringReference}, + {"black-point", RealReference},{"white-point", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Sans0", { { (const char *) NULL, NullReference } } }, + { "Sans1", { { (const char *) NULL, NullReference } } }, + { "AdaptiveSharpen", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Transpose", { { (const char *) NULL, NullReference } } }, + { "Transverse", { { (const char *) NULL, NullReference } } }, + { "AutoOrient", { { (const char *) NULL, NullReference } } }, + { "AdaptiveBlur", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Sketch", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"angle", RealReference} } }, + { "UniqueColors", { { (const char *) NULL, NullReference } } }, + { "AdaptiveResize", { {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"filter", MagickFilterOptions}, {"support", StringReference }, + {"blur", RealReference } } }, + { "ClipMask", { {"mask", ImageReference} } }, + { "LinearStretch", { {"levels", StringReference}, + {"black-point", RealReference},{"white-point", RealReference} } }, + { "Recolor", { {"matrix", ArrayReference} } }, + { "Mask", { {"mask", ImageReference} } }, + { "Polaroid", { {"caption", StringReference}, {"angle", RealReference}, + {"font", StringReference}, {"stroke", StringReference}, + {"fill", StringReference}, {"strokewidth", RealReference}, + {"pointsize", RealReference}, {"gravity", MagickGravityOptions}, + {"background", StringReference} } }, + { "FloodfillPaint", { {"geometry", StringReference}, + {"x", IntegerReference}, {"y", IntegerReference}, + {"fill", StringReference}, {"bordercolor", StringReference}, + {"fuzz", StringReference}, {"channel", MagickChannelOptions}, + {"invert", MagickBooleanOptions} } }, + { "Distort", { {"points", ArrayReference}, {"method", MagickDistortOptions}, + {"virtual-pixel", MagickVirtualPixelOptions}, + {"best-fit", MagickBooleanOptions} } }, + { "Clut", { {"image", ImageReference}, + {"channel", MagickChannelOptions} } }, + { "LiquidRescale", { {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"delta-x", RealReference}, {"rigidity", RealReference } } }, + { "Encipher", { {"passphrase", StringReference} } }, + { "Decipher", { {"passphrase", StringReference} } }, + { "Deskew", { {"geometry", StringReference}, + {"threshold", StringReference} } }, + { "Remap", { {"image", ImageReference}, {"dither", MagickBooleanOptions}, + {"dither-method", MagickDitherOptions} } }, + { "SparseColor", { {"points", ArrayReference}, + {"method", MagickSparseColorOptions}, + {"virtual-pixel", MagickVirtualPixelOptions}, + {"channel", MagickChannelOptions} } }, + { "Function", { {"parameters", ArrayReference}, + {"function", MagickFunctionOptions}, + {"virtual-pixel", MagickVirtualPixelOptions} } }, + { "SelectiveBlur", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"threshold", RealReference}, {"channel", MagickChannelOptions} } }, + { "HaldClut", { {"image", ImageReference}, + {"channel", MagickChannelOptions} } }, + { "BlueShift", { {"factor", StringReference} } }, + { "ForwardFourierTransform", { {"magnitude", MagickBooleanOptions} } }, + { "InverseFourierTransform", { {"magnitude", MagickBooleanOptions} } }, + { "ColorDecisionList", { + {"color-correction-collection", StringReference} } }, + { "AutoGamma", { {"channel", MagickChannelOptions} } }, + { "AutoLevel", { {"channel", MagickChannelOptions} } }, + { "LevelColors", { {"invert", MagickBooleanOptions}, + {"black-point", StringReference}, {"white-point", StringReference}, + {"channel", MagickChannelOptions}, {"invert", MagickBooleanOptions} } }, + { "Clamp", { {"channel", MagickChannelOptions} } }, + { "Filter", { {"kernel", StringReference}, + {"channel", MagickChannelOptions}, {"bias", StringReference} } }, + { "BrightnessContrast", { {"levels", StringReference}, + {"brightness", RealReference},{"contrast", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Morphology", { {"kernel", StringReference}, + {"channel", MagickChannelOptions}, {"method", MagickMorphologyOptions}, + {"iterations", IntegerReference} } }, + { "ColorMatrix", { {"matrix", ArrayReference} } }, + { "Color", { {"color", StringReference} } }, + { "Mode", { {"geometry", StringReference}, + {"width", IntegerReference},{"height", IntegerReference}, + {"channel", MagickChannelOptions} } }, + { "Statistic", { {"geometry", StringReference}, + {"width", IntegerReference},{"height", IntegerReference}, + {"channel", MagickChannelOptions}, {"type", MagickStatisticOptions} } }, + { "Perceptible", { {"epsilon", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Poly", { {"terms", ArrayReference}, + {"channel", MagickChannelOptions} } }, + { "Grayscale", { {"method", MagickPixelIntensityOptions} } }, + { "CannyEdge", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"lower-percent", RealReference}, {"upper-percent", RealReference} } }, + { "HoughLine", { {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"threshold", IntegerReference} } }, + { "MeanShift", { {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"distance", RealReference} } }, + { "Kuwahara", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference}, {"channel", MagickChannelOptions} } }, + { "ConnectedComponents", { {"connectivity", IntegerReference} } }, + { "CopyPixels", { {"image", ImageReference}, {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"x", IntegerReference}, {"y", IntegerReference}, + {"gravity", MagickGravityOptions}, {"offset", StringReference}, + {"dx", IntegerReference}, {"dy", IntegerReference} } }, + { "WaveletDenoise", { {"geometry", StringReference}, + {"threshold", RealReference}, {"softness", RealReference} } }, + { "Colorspace", { {"colorspace", MagickColorspaceOptions} } }, + { "AutoThreshold", { {"method", MagickAutoThresholdOptions} } } + }; + +static SplayTreeInfo + *magick_registry = (SplayTreeInfo *) NULL; + +/* + Forward declarations. +*/ +static Image + *SetupList(pTHX_ SV *,struct PackageInfo **,SV ***,ExceptionInfo *); + +static ssize_t + strEQcase(const char *,const char *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e P a c k a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClonePackageInfo makes a duplicate of the given info, or if info is NULL, +% a new one. +% +% The format of the ClonePackageInfo routine is: +% +% struct PackageInfo *ClonePackageInfo(struct PackageInfo *info, +% exception) +% +% A description of each parameter follows: +% +% o info: a structure of type info. +% +% o exception: Return any errors or warnings in this structure. +% +*/ +static struct PackageInfo *ClonePackageInfo(struct PackageInfo *info, + ExceptionInfo *exception) +{ + struct PackageInfo + *clone_info; + + clone_info=(struct PackageInfo *) AcquireQuantumMemory(1,sizeof(*clone_info)); + if (clone_info == (struct PackageInfo *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "UnableToClonePackageInfo",PackageName); + return((struct PackageInfo *) NULL); + } + if (info == (struct PackageInfo *) NULL) + { + clone_info->image_info=CloneImageInfo((ImageInfo *) NULL); + return(clone_info); + } + *clone_info=(*info); + clone_info->image_info=CloneImageInfo(info->image_info); + return(clone_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% c o n s t a n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% constant() returns a double value for the specified name. +% +% The format of the constant routine is: +% +% double constant(char *name,ssize_t sans) +% +% A description of each parameter follows: +% +% o value: Method constant returns a double value for the specified name. +% +% o name: The name of the constant. +% +% o sans: This integer value is not used. +% +*/ +static double constant(char *name,ssize_t sans) +{ + (void) sans; + errno=0; + switch (*name) + { + case 'B': + { + if (strEQ(name,"BlobError")) + return(BlobError); + if (strEQ(name,"BlobWarning")) + return(BlobWarning); + break; + } + case 'C': + { + if (strEQ(name,"CacheError")) + return(CacheError); + if (strEQ(name,"CacheWarning")) + return(CacheWarning); + if (strEQ(name,"CoderError")) + return(CoderError); + if (strEQ(name,"CoderWarning")) + return(CoderWarning); + if (strEQ(name,"ConfigureError")) + return(ConfigureError); + if (strEQ(name,"ConfigureWarning")) + return(ConfigureWarning); + if (strEQ(name,"CorruptImageError")) + return(CorruptImageError); + if (strEQ(name,"CorruptImageWarning")) + return(CorruptImageWarning); + break; + } + case 'D': + { + if (strEQ(name,"DelegateError")) + return(DelegateError); + if (strEQ(name,"DelegateWarning")) + return(DelegateWarning); + if (strEQ(name,"DrawError")) + return(DrawError); + if (strEQ(name,"DrawWarning")) + return(DrawWarning); + break; + } + case 'E': + { + if (strEQ(name,"ErrorException")) + return(ErrorException); + if (strEQ(name,"ExceptionError")) + return(CoderError); + if (strEQ(name,"ExceptionWarning")) + return(CoderWarning); + break; + } + case 'F': + { + if (strEQ(name,"FatalErrorException")) + return(FatalErrorException); + if (strEQ(name,"FileOpenError")) + return(FileOpenError); + if (strEQ(name,"FileOpenWarning")) + return(FileOpenWarning); + break; + } + case 'I': + { + if (strEQ(name,"ImageError")) + return(ImageError); + if (strEQ(name,"ImageWarning")) + return(ImageWarning); + break; + } + case 'M': + { + if (strEQ(name,"MaxRGB")) + return(QuantumRange); + if (strEQ(name,"MissingDelegateError")) + return(MissingDelegateError); + if (strEQ(name,"MissingDelegateWarning")) + return(MissingDelegateWarning); + if (strEQ(name,"ModuleError")) + return(ModuleError); + if (strEQ(name,"ModuleWarning")) + return(ModuleWarning); + break; + } + case 'O': + { + if (strEQ(name,"Opaque")) + return(OpaqueOpacity); + if (strEQ(name,"OptionError")) + return(OptionError); + if (strEQ(name,"OptionWarning")) + return(OptionWarning); + break; + } + case 'Q': + { + if (strEQ(name,"MAGICKCORE_QUANTUM_DEPTH")) + return(MAGICKCORE_QUANTUM_DEPTH); + if (strEQ(name,"QuantumDepth")) + return(MAGICKCORE_QUANTUM_DEPTH); + if (strEQ(name,"QuantumRange")) + return(QuantumRange); + break; + } + case 'R': + { + if (strEQ(name,"ResourceLimitError")) + return(ResourceLimitError); + if (strEQ(name,"ResourceLimitWarning")) + return(ResourceLimitWarning); + if (strEQ(name,"RegistryError")) + return(RegistryError); + if (strEQ(name,"RegistryWarning")) + return(RegistryWarning); + break; + } + case 'S': + { + if (strEQ(name,"StreamError")) + return(StreamError); + if (strEQ(name,"StreamWarning")) + return(StreamWarning); + if (strEQ(name,"Success")) + return(0); + break; + } + case 'T': + { + if (strEQ(name,"Transparent")) + return(TransparentOpacity); + if (strEQ(name,"TypeError")) + return(TypeError); + if (strEQ(name,"TypeWarning")) + return(TypeWarning); + break; + } + case 'W': + { + if (strEQ(name,"WarningException")) + return(WarningException); + break; + } + case 'X': + { + if (strEQ(name,"XServerError")) + return(XServerError); + if (strEQ(name,"XServerWarning")) + return(XServerWarning); + break; + } + } + errno=EINVAL; + return(0); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y P a c k a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method DestroyPackageInfo frees a previously created info structure. +% +% The format of the DestroyPackageInfo routine is: +% +% DestroyPackageInfo(struct PackageInfo *info) +% +% A description of each parameter follows: +% +% o info: a structure of type info. +% +*/ +static void DestroyPackageInfo(struct PackageInfo *info) +{ + info->image_info=DestroyImageInfo(info->image_info); + info=(struct PackageInfo *) RelinquishMagickMemory(info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method GetList is recursively called by SetupList to traverse the +% Image__Magick reference. If building an reference_vector (see SetupList), +% *current is the current position in *reference_vector and *last is the final +% entry in *reference_vector. +% +% The format of the GetList routine is: +% +% GetList(info) +% +% A description of each parameter follows: +% +% o info: a structure of type info. +% +*/ +static Image *GetList(pTHX_ SV *reference,SV ***reference_vector, + ssize_t *current,ssize_t *last,ExceptionInfo *exception) +{ + Image + *image; + + if (reference == (SV *) NULL) + return(NULL); + switch (SvTYPE(reference)) + { + case SVt_PVAV: + { + AV + *av; + + Image + *head, + *previous; + + ssize_t + i; + + ssize_t + n; + + /* + Array of images. + */ + previous=(Image *) NULL; + head=(Image *) NULL; + av=(AV *) reference; + n=av_len(av); + for (i=0; i <= n; i++) + { + SV + **rv; + + rv=av_fetch(av,i,0); + if (rv && *rv && sv_isobject(*rv)) + { + image=GetList(aTHX_ SvRV(*rv),reference_vector,current,last, + exception); + if (image == (Image *) NULL) + continue; + if (image == previous) + { + image=CloneImage(image,0,0,MagickTrue,exception); + if (image == (Image *) NULL) + return(NULL); + } + image->previous=previous; + *(previous ? &previous->next : &head)=image; + for (previous=image; previous->next; previous=previous->next) ; + } + } + return(head); + } + case SVt_PVMG: + { + /* + Blessed scalar, one image. + */ + image=INT2PTR(Image *,SvIV(reference)); + if (image == (Image *) NULL) + return(NULL); + image->previous=(Image *) NULL; + image->next=(Image *) NULL; + if (reference_vector) + { + if (*current == *last) + { + *last+=256; + if (*reference_vector == (SV **) NULL) + *reference_vector=(SV **) AcquireQuantumMemory(*last, + sizeof(*reference_vector)); + else + *reference_vector=(SV **) ResizeQuantumMemory(*reference_vector, + *last,sizeof(*reference_vector)); + } + if (*reference_vector == (SV **) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + return((Image *) NULL); + } + (*reference_vector)[*current]=reference; + (*reference_vector)[++(*current)]=NULL; + } + return(image); + } + default: + break; + } + (void) fprintf(stderr,"GetList: UnrecognizedType %.20g\n", + (double) SvTYPE(reference)); + return((Image *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P a c k a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method GetPackageInfo looks up or creates an info structure for the given +% Image__Magick reference. If it does create a new one, the information in +% package_info is used to initialize it. +% +% The format of the GetPackageInfo routine is: +% +% struct PackageInfo *GetPackageInfo(void *reference, +% struct PackageInfo *package_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o info: a structure of type info. +% +% o exception: Return any errors or warnings in this structure. +% +*/ +static struct PackageInfo *GetPackageInfo(pTHX_ void *reference, + struct PackageInfo *package_info,ExceptionInfo *exception) +{ + char + message[MaxTextExtent]; + + struct PackageInfo + *clone_info; + + SV + *sv; + + (void) FormatLocaleString(message,MaxTextExtent,"%s::package%s%p", + PackageName,XS_VERSION,reference); + sv=perl_get_sv(message,(TRUE | 0x02)); + if (sv == (SV *) NULL) + { + ThrowPerlException(exception,ResourceLimitError,"UnableToGetPackageInfo", + message); + return(package_info); + } + if (SvREFCNT(sv) == 0) + (void) SvREFCNT_inc(sv); + if (SvIOKp(sv) && (clone_info=INT2PTR(struct PackageInfo *,SvIV(sv)))) + return(clone_info); + clone_info=ClonePackageInfo(package_info,exception); + sv_setiv(sv,PTR2IV(clone_info)); + return(clone_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t A t t r i b u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetAttribute() sets the attribute to the value in sval. This can change +% either or both of image or info. +% +% The format of the SetAttribute routine is: +% +% SetAttribute(struct PackageInfo *info,Image *image,char *attribute, +% SV *sval,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o list: a list of strings. +% +% o string: a character string. +% +*/ + +static double SiPrefixToDoubleInterval(const char *string,const double interval) +{ + char + *q; + + double + value; + + value=InterpretSiPrefixValue(string,&q); + if (*q == '%') + value*=interval/100.0; + return(value); +} + +static inline double StringToDouble(const char *string,char **sentinal) +{ + return(InterpretLocaleValue(string,sentinal)); +} + +static double StringToDoubleInterval(const char *string,const double interval) +{ + char + *q; + + double + value; + + value=InterpretLocaleValue(string,&q); + if (*q == '%') + value*=interval/100.0; + return(value); +} + +static inline ssize_t StringToLong(const char *value) +{ + return(strtol(value,(char **) NULL,10)); +} + +static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, + const char *attribute,SV *sval,ExceptionInfo *exception) +{ + GeometryInfo + geometry_info; + + long + x, + y; + + MagickPixelPacket + pixel; + + MagickStatusType + flags; + + PixelPacket + *color, + target_color; + + ssize_t + sp; + + switch (*attribute) + { + case 'A': + case 'a': + { + if (LocaleCompare(attribute,"adjoin") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->adjoin=sp != 0 ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare(attribute,"alpha") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickAlphaOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + for ( ; image; image=image->next) + (void) SetImageAlphaChannel(image,(AlphaChannelType) sp); + break; + } + if (LocaleCompare(attribute,"antialias") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->antialias=sp != 0 ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare(attribute,"area-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(AreaResource,limit); + break; + } + if (LocaleCompare(attribute,"attenuate") == 0) + { + if (info) + (void) SetImageOption(info->image_info,attribute,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"authenticate") == 0) + { + if (info) + (void) CloneString(&info->image_info->authenticate,SvPV(sval,na)); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'B': + case 'b': + { + if (LocaleCompare(attribute,"background") == 0) + { + (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception); + if (info) + info->image_info->background_color=target_color; + for ( ; image; image=image->next) + image->background_color=target_color; + break; + } + if (LocaleCompare(attribute,"bias") == 0) + { + for ( ; image; image=image->next) + image->bias=StringToDoubleInterval(SvPV(sval,na),(double) + QuantumRange+1.0); + break; + } + if (LocaleCompare(attribute,"blue-primary") == 0) + { + for ( ; image; image=image->next) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + image->chromaticity.blue_primary.x=geometry_info.rho; + image->chromaticity.blue_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.blue_primary.y= + image->chromaticity.blue_primary.x; + } + break; + } + if (LocaleCompare(attribute,"bordercolor") == 0) + { + (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception); + if (info) + info->image_info->border_color=target_color; + for ( ; image; image=image->next) + image->border_color=target_color; + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"cache-threshold") == 0) + { + (void) SetMagickResourceLimit(MemoryResource,(MagickSizeType) + SiPrefixToDoubleInterval(SvPV(sval,na),100.0)); + (void) SetMagickResourceLimit(MapResource,(MagickSizeType) + (2.0*SiPrefixToDoubleInterval(SvPV(sval,na),100.0))); + break; + } + if (LocaleCompare(attribute,"clip-mask") == 0) + { + Image + *clip_mask; + + clip_mask=(Image *) NULL; + if (SvPOK(sval)) + clip_mask=SetupList(aTHX_ SvRV(sval),&info,(SV ***) NULL,exception); + for ( ; image; image=image->next) + SetImageClipMask(image,clip_mask); + break; + } + if (LocaleNCompare(attribute,"colormap",8) == 0) + { + for ( ; image; image=image->next) + { + int + items; + + long + i; + + if (image->storage_class == DirectClass) + continue; + i=0; + items=sscanf(attribute,"%*[^[][%ld",&i); + (void) items; + if (i > (ssize_t) image->colors) + i%=image->colors; + if ((strchr(SvPV(sval,na),',') == 0) || + (strchr(SvPV(sval,na),')') != 0)) + QueryColorDatabase(SvPV(sval,na),image->colormap+i,exception); + else + { + color=image->colormap+i; + pixel.red=color->red; + pixel.green=color->green; + pixel.blue=color->blue; + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + pixel.red=geometry_info.rho; + pixel.green=geometry_info.sigma; + pixel.blue=geometry_info.xi; + color->red=ClampToQuantum(pixel.red); + color->green=ClampToQuantum(pixel.green); + color->blue=ClampToQuantum(pixel.blue); + } + } + break; + } + if (LocaleCompare(attribute,"colorspace") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickColorspaceOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedColorspace", + SvPV(sval,na)); + break; + } + for ( ; image; image=image->next) + (void) SetImageColorspace(image,(ColorspaceType) sp); + break; + } + if (LocaleCompare(attribute,"comment") == 0) + { + for ( ; image; image=image->next) + (void) SetImageProperty(image,"Comment",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,image, + SvPV(sval,na))); + break; + } + if (LocaleCompare(attribute,"compression") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickCompressOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedImageCompression",SvPV(sval,na)); + break; + } + if (info) + info->image_info->compression=(CompressionType) sp; + for ( ; image; image=image->next) + image->compression=(CompressionType) sp; + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(attribute,"debug") == 0) + { + SetLogEventMask(SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"delay") == 0) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + for ( ; image; image=image->next) + { + image->delay=(size_t) floor(geometry_info.rho+0.5); + if ((flags & SigmaValue) != 0) + image->ticks_per_second=(ssize_t) + floor(geometry_info.sigma+0.5); + } + break; + } + if (LocaleCompare(attribute,"disk-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(DiskResource,limit); + break; + } + if (LocaleCompare(attribute,"density") == 0) + { + if (IsGeometry(SvPV(sval,na)) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + SvPV(sval,na)); + break; + } + if (info) + (void) CloneString(&info->image_info->density,SvPV(sval,na)); + for ( ; image; image=image->next) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + image->x_resolution=geometry_info.rho; + image->y_resolution=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->y_resolution=image->x_resolution; + } + break; + } + if (LocaleCompare(attribute,"depth") == 0) + { + if (info) + info->image_info->depth=SvIV(sval); + for ( ; image; image=image->next) + (void) SetImageDepth(image,SvIV(sval)); + break; + } + if (LocaleCompare(attribute,"dispose") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickDisposeOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedDisposeMethod",SvPV(sval,na)); + break; + } + for ( ; image; image=image->next) + image->dispose=(DisposeType) sp; + break; + } + if (LocaleCompare(attribute,"dither") == 0) + { + if (info) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + info->image_info->dither=sp != 0 ? MagickTrue : MagickFalse; + } + break; + } + if (LocaleCompare(attribute,"display") == 0) + { + display: + if (info) + (void) CloneString(&info->image_info->server_name,SvPV(sval,na)); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(attribute,"endian") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickEndianOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedEndianType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->endian=(EndianType) sp; + for ( ; image; image=image->next) + image->endian=(EndianType) sp; + break; + } + if (LocaleCompare(attribute,"extract") == 0) + { + /* + Set image extract geometry. + */ + (void) CloneString(&info->image_info->extract,SvPV(sval,na)); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(attribute,"filename") == 0) + { + if (info) + (void) CopyMagickString(info->image_info->filename,SvPV(sval,na), + MaxTextExtent); + for ( ; image; image=image->next) + (void) CopyMagickString(image->filename,SvPV(sval,na), + MaxTextExtent); + break; + } + if (LocaleCompare(attribute,"file") == 0) + { + FILE + *file; + + PerlIO + *io_info; + + if (info == (struct PackageInfo *) NULL) + break; + io_info=IoIFP(sv_2io(sval)); + if (io_info == (PerlIO *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + break; + } + file=PerlIO_findFILE(io_info); + if (file == (FILE *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + break; + } + SetImageInfoFile(info->image_info,file); + break; + } + if (LocaleCompare(attribute,"fill") == 0) + { + if (info) + (void) SetImageOption(info->image_info,"fill",SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"font") == 0) + { + if (info) + (void) CloneString(&info->image_info->font,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"foreground") == 0) + break; + if (LocaleCompare(attribute,"fuzz") == 0) + { + if (info) + info->image_info->fuzz=StringToDoubleInterval(SvPV(sval,na),(double) + QuantumRange+1.0); + for ( ; image; image=image->next) + image->fuzz=StringToDoubleInterval(SvPV(sval,na),(double) + QuantumRange+1.0); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(attribute,"gamma") == 0) + { + for ( ; image; image=image->next) + image->gamma=SvNV(sval); + break; + } + if (LocaleCompare(attribute,"gravity") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickGravityOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedGravityType",SvPV(sval,na)); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + image->gravity=(GravityType) sp; + break; + } + if (LocaleCompare(attribute,"green-primary") == 0) + { + for ( ; image; image=image->next) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + image->chromaticity.green_primary.x=geometry_info.rho; + image->chromaticity.green_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.green_primary.y= + image->chromaticity.green_primary.x; + } + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'I': + case 'i': + { + if (LocaleNCompare(attribute,"index",5) == 0) + { + IndexPacket + *indexes; + + int + items; + + long + index; + + PixelPacket + *p; + + CacheView + *image_view; + + for ( ; image; image=image->next) + { + if (image->storage_class != PseudoClass) + continue; + x=0; + y=0; + items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y); + (void) items; + image_view=AcquireAuthenticCacheView(image,exception); + p=GetCacheViewAuthenticPixels(image_view,x,y,1,1,exception); + if (p != (PixelPacket *) NULL) + { + indexes=GetCacheViewAuthenticIndexQueue(image_view); + items=sscanf(SvPV(sval,na),"%ld",&index); + if ((index >= 0) && (index < (ssize_t) image->colors)) + SetPixelIndex(indexes,index); + (void) SyncCacheViewAuthenticPixels(image_view,exception); + } + image_view=DestroyCacheView(image_view); + } + break; + } + if (LocaleCompare(attribute,"iterations") == 0) + { + iterations: + for ( ; image; image=image->next) + image->iterations=SvIV(sval); + break; + } + if (LocaleCompare(attribute,"interlace") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickInterlaceOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedInterlaceType",SvPV(sval,na)); + break; + } + if (info) + info->image_info->interlace=(InterlaceType) sp; + for ( ; image; image=image->next) + image->interlace=(InterlaceType) sp; + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'L': + case 'l': + { + if (LocaleCompare(attribute,"label") == 0) + { + for ( ; image; image=image->next) + (void) SetImageProperty(image,"label",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,image, + SvPV(sval,na))); + break; + } + if (LocaleCompare(attribute,"loop") == 0) + goto iterations; + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"magick") == 0) + { + if (info) + (void) FormatLocaleString(info->image_info->filename,MaxTextExtent, + "%s:",SvPV(sval,na)); + for ( ; image; image=image->next) + (void) CopyMagickString(image->magick,SvPV(sval,na),MaxTextExtent); + break; + } + if (LocaleCompare(attribute,"map-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(MapResource,limit); + break; + } + if (LocaleCompare(attribute,"mask") == 0) + { + Image + *mask; + + mask=(Image *) NULL; + if (SvPOK(sval)) + mask=SetupList(aTHX_ SvRV(sval),&info,(SV ***) NULL,exception); + for ( ; image; image=image->next) + SetImageMask(image,mask); + break; + } + if (LocaleCompare(attribute,"mattecolor") == 0) + { + (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception); + if (info) + info->image_info->matte_color=target_color; + for ( ; image; image=image->next) + image->matte_color=target_color; + break; + } + if (LocaleCompare(attribute,"matte") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + for ( ; image; image=image->next) + image->matte=sp != 0 ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare(attribute,"memory-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(MemoryResource,limit); + break; + } + if (LocaleCompare(attribute,"monochrome") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->monochrome=sp != 0 ? MagickTrue : MagickFalse; + for ( ; image; image=image->next) + (void) SetImageType(image,BilevelType); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(attribute,"option") == 0) + { + if (info) + DefineImageOption(info->image_info,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"orientation") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickOrientationOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedOrientationType",SvPV(sval,na)); + break; + } + if (info) + info->image_info->orientation=(OrientationType) sp; + for ( ; image; image=image->next) + image->orientation=(OrientationType) sp; + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(attribute,"page") == 0) + { + char + *geometry; + + geometry=GetPageGeometry(SvPV(sval,na)); + if (info) + (void) CloneString(&info->image_info->page,geometry); + for ( ; image; image=image->next) + (void) ParsePageGeometry(image,geometry,&image->page,exception); + geometry=(char *) RelinquishMagickMemory(geometry); + break; + } + if (LocaleCompare(attribute,"pen") == 0) + { + if (info) + (void) SetImageOption(info->image_info,"fill",SvPV(sval,na)); + break; + } + if (LocaleNCompare(attribute,"pixel",5) == 0) + { + int + items; + + MagickPixelPacket + pixel; + + IndexPacket + *indexes; + + PixelPacket + *q; + + CacheView + *image_view; + + for ( ; image; image=image->next) + { + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + break; + x=0; + y=0; + items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y); + (void) items; + image_view=AcquireAuthenticCacheView(image,exception); + q=GetCacheViewAuthenticPixels(image_view,x,y,1,1,exception); + indexes=GetCacheViewAuthenticIndexQueue(image_view); + if (q != (PixelPacket *) NULL) + { + if ((strchr(SvPV(sval,na),',') == 0) || + (strchr(SvPV(sval,na),')') != 0)) + QueryMagickColor(SvPV(sval,na),&pixel,exception); + else + { + GetMagickPixelPacket(image,&pixel); + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + pixel.red=geometry_info.rho; + if ((flags & SigmaValue) != 0) + pixel.green=geometry_info.sigma; + if ((flags & XiValue) != 0) + pixel.blue=geometry_info.xi; + if ((flags & PsiValue) != 0) + pixel.opacity=geometry_info.psi; + if ((flags & ChiValue) != 0) + pixel.index=geometry_info.chi; + } + SetPixelRed(q,ClampToQuantum(pixel.red)); + SetPixelGreen(q,ClampToQuantum(pixel.green)); + SetPixelBlue(q,ClampToQuantum(pixel.blue)); + SetPixelOpacity(q,ClampToQuantum(pixel.opacity)); + if (((image->colorspace == CMYKColorspace) || + (image->storage_class == PseudoClass)) && + (indexes != (IndexPacket *) NULL)) + SetPixelIndex(indexes,ClampToQuantum(pixel.index)); + (void) SyncCacheViewAuthenticPixels(image_view,exception); + } + image_view=DestroyCacheView(image_view); + } + break; + } + if (LocaleCompare(attribute,"pointsize") == 0) + { + if (info) + { + (void) ParseGeometry(SvPV(sval,na),&geometry_info); + info->image_info->pointsize=geometry_info.rho; + } + break; + } + if (LocaleCompare(attribute,"precision") == 0) + { + (void) SetMagickPrecision(SvIV(sval)); + break; + } + if (LocaleCompare(attribute,"preview") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickPreviewOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->preview_type=(PreviewType) sp; + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'Q': + case 'q': + { + if (LocaleCompare(attribute,"quality") == 0) + { + if (info) + info->image_info->quality=SvIV(sval); + for ( ; image; image=image->next) + image->quality=SvIV(sval); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(attribute,"red-primary") == 0) + { + for ( ; image; image=image->next) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + image->chromaticity.red_primary.x=geometry_info.rho; + image->chromaticity.red_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.red_primary.y= + image->chromaticity.red_primary.x; + } + break; + } + if (LocaleCompare(attribute,"render") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickIntentOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedIntentType", + SvPV(sval,na)); + break; + } + for ( ; image; image=image->next) + image->rendering_intent=(RenderingIntent) sp; + break; + } + if (LocaleCompare(attribute,"repage") == 0) + { + RectangleInfo + geometry; + + for ( ; image; image=image->next) + { + flags=ParseAbsoluteGeometry(SvPV(sval,na),&geometry); + if ((flags & WidthValue) != 0) + { + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + image->page.width=geometry.width; + image->page.height=geometry.height; + } + if ((flags & AspectValue) != 0) + { + if ((flags & XValue) != 0) + image->page.x+=geometry.x; + if ((flags & YValue) != 0) + image->page.y+=geometry.y; + } + else + { + if ((flags & XValue) != 0) + { + image->page.x=geometry.x; + if (((flags & WidthValue) != 0) && (geometry.x > 0)) + image->page.width=image->columns+geometry.x; + } + if ((flags & YValue) != 0) + { + image->page.y=geometry.y; + if (((flags & HeightValue) != 0) && (geometry.y > 0)) + image->page.height=image->rows+geometry.y; + } + } + } + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'S': + case 's': + { + if (LocaleCompare(attribute,"sampling-factor") == 0) + { + if (IsGeometry(SvPV(sval,na)) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + SvPV(sval,na)); + break; + } + if (info) + (void) CloneString(&info->image_info->sampling_factor, + SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"scene") == 0) + { + for ( ; image; image=image->next) + image->scene=SvIV(sval); + break; + } + if (LocaleCompare(attribute,"subimage") == 0) + { + if (info) + info->image_info->subimage=SvIV(sval); + break; + } + if (LocaleCompare(attribute,"subrange") == 0) + { + if (info) + info->image_info->subrange=SvIV(sval); + break; + } + if (LocaleCompare(attribute,"server") == 0) + goto display; + if (LocaleCompare(attribute,"size") == 0) + { + if (info) + { + if (IsGeometry(SvPV(sval,na)) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + SvPV(sval,na)); + break; + } + (void) CloneString(&info->image_info->size,SvPV(sval,na)); + } + break; + } + if (LocaleCompare(attribute,"stroke") == 0) + { + if (info) + (void) SetImageOption(info->image_info,"stroke",SvPV(sval,na)); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'T': + case 't': + { + if (LocaleCompare(attribute,"texture") == 0) + { + if (info) + (void) CloneString(&info->image_info->texture,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"thread-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(ThreadResource,limit); + break; + } + if (LocaleCompare(attribute,"tile") == 0) + { + if (info) + (void) CloneString(&info->image_info->tile,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"tile-offset") == 0) + { + char + *geometry; + + geometry=GetPageGeometry(SvPV(sval,na)); + if (info) + (void) CloneString(&info->image_info->page,geometry); + for ( ; image; image=image->next) + (void) ParsePageGeometry(image,geometry,&image->tile_offset, + exception); + geometry=(char *) RelinquishMagickMemory(geometry); + break; + } + if (LocaleCompare(attribute,"time-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(TimeResource,limit); + break; + } + if (LocaleCompare(attribute,"transparent-color") == 0) + { + (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception); + if (info) + info->image_info->transparent_color=target_color; + for ( ; image; image=image->next) + image->transparent_color=target_color; + break; + } + if (LocaleCompare(attribute,"type") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickTypeOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->type=(ImageType) sp; + for ( ; image; image=image->next) + SetImageType(image,(ImageType) sp); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'U': + case 'u': + { + if (LocaleCompare(attribute,"units") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickResolutionOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedUnitsType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->units=(ResolutionType) sp; + for ( ; image; image=image->next) + { + ResolutionType + units; + + units=(ResolutionType) sp; + if (image->units != units) + switch (image->units) + { + case UndefinedResolution: + case PixelsPerInchResolution: + { + if (units == PixelsPerCentimeterResolution) + { + image->x_resolution*=2.54; + image->y_resolution*=2.54; + } + break; + } + case PixelsPerCentimeterResolution: + { + if (units == PixelsPerInchResolution) + { + image->x_resolution/=2.54; + image->y_resolution/=2.54; + } + break; + } + } + image->units=units; + } + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'V': + case 'v': + { + if (LocaleCompare(attribute,"verbose") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->verbose=sp != 0 ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare(attribute,"view") == 0) + { + if (info) + (void) CloneString(&info->image_info->view,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"virtual-pixel") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickVirtualPixelOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedVirtualPixelMethod",SvPV(sval,na)); + break; + } + if (info) + info->image_info->virtual_pixel_method=(VirtualPixelMethod) sp; + for ( ; image; image=image->next) + SetImageVirtualPixelMethod(image,(VirtualPixelMethod) sp); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(attribute,"white-point") == 0) + { + for ( ; image; image=image->next) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + image->chromaticity.white_point.x=geometry_info.rho; + image->chromaticity.white_point.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.white_point.y= + image->chromaticity.white_point.x; + } + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + default: + { + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t u p L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method SetupList returns the list of all the images linked by their +% image->next and image->previous link lists for use with ImageMagick. If +% info is non-NULL, an info structure is returned in *info. If +% reference_vector is non-NULL,an array of SV* are returned in +% *reference_vector. Reference_vector is used when the images are going to be +% replaced with new Image*'s. +% +% The format of the SetupList routine is: +% +% Image *SetupList(SV *reference,struct PackageInfo **info, +% SV ***reference_vector,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o list: a list of strings. +% +% o string: a character string. +% +% o exception: Return any errors or warnings in this structure. +% +*/ +static Image *SetupList(pTHX_ SV *reference,struct PackageInfo **info, + SV ***reference_vector,ExceptionInfo *exception) +{ + Image + *image; + + ssize_t + current, + last; + + if (reference_vector) + *reference_vector=NULL; + if (info) + *info=NULL; + current=0; + last=0; + image=GetList(aTHX_ reference,reference_vector,¤t,&last,exception); + if (info && (SvTYPE(reference) == SVt_PVAV)) + *info=GetPackageInfo(aTHX_ (void *) reference,(struct PackageInfo *) NULL, + exception); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% s t r E Q c a s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% strEQcase() compares two strings and returns 0 if they are the +% same or if the second string runs out first. The comparison is case +% insensitive. +% +% The format of the strEQcase routine is: +% +% ssize_t strEQcase(const char *p,const char *q) +% +% A description of each parameter follows: +% +% o p: a character string. +% +% o q: a character string. +% +% +*/ +static ssize_t strEQcase(const char *p,const char *q) +{ + char + c; + + ssize_t + i; + + for (i=0 ; (c=(*q)) != 0; i++) + { + if ((isUPPER((unsigned char) c) ? toLOWER(c) : c) != + (isUPPER((unsigned char) *p) ? toLOWER(*p) : *p)) + return(0); + p++; + q++; + } + return(((*q == 0) && (*p == 0)) ? i : 0); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I m a g e : : M a g i c k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ +MODULE = Image::Magick::Q16 PACKAGE = Image::Magick::Q16 + +PROTOTYPES: ENABLE + +BOOT: + MagickCoreGenesis("PerlMagick",MagickFalse); + SetWarningHandler(NULL); + SetErrorHandler(NULL); + magick_registry=NewSplayTree((int (*)(const void *,const void *)) + NULL,(void *(*)(void *)) NULL,(void *(*)(void *)) NULL); + +void +UNLOAD() + PPCODE: + { + if (magick_registry != (SplayTreeInfo *) NULL) + magick_registry=DestroySplayTree(magick_registry); + MagickCoreTerminus(); + } + +double +constant(name,argument) + char *name + ssize_t argument + +# +############################################################################### +# # +# # +# # +# A n i m a t e # +# # +# # +# # +############################################################################### +# +# +void +Animate(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + AnimateImage = 1 + animate = 2 + animateimage = 3 + PPCODE: + { + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + i; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + package_info=(struct PackageInfo *) NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + package_info=ClonePackageInfo(info,exception); + if (items == 2) + SetAttribute(aTHX_ package_info,NULL,"server",ST(1),exception); + else + if (items > 2) + for (i=2; i < items; i+=2) + SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i), + exception); + (void) AnimateImages(package_info->image_info,image); + (void) CatchImageException(image); + InheritException(exception,&image->exception); + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# A p p e n d # +# # +# # +# # +############################################################################### +# +# +void +Append(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + AppendImage = 1 + append = 2 + appendimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ssize_t + i; + + ssize_t + stack; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + attribute=NULL; + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get options. + */ + stack=MagickTrue; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'S': + case 's': + { + if (LocaleCompare(attribute,"stack") == 0) + { + stack=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (stack < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=AppendImages(image,stack != 0 ? MagickTrue : MagickFalse,exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# A v e r a g e # +# # +# # +# # +############################################################################### +# +# +void +Average(ref) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + AverageImage = 1 + average = 2 + averageimage = 3 + PPCODE: + { + AV + *av; + + char + *p; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + image=EvaluateImages(image,MeanEvaluateOperator,exception); + if (image == (Image *) NULL) + goto PerlException; + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + (void) FormatLocaleString(info->image_info->filename,MaxTextExtent, + "average-%.*s",(int) (MaxTextExtent-9), + ((p=strrchr(image->filename,'/')) ? p+1 : image->filename)); + (void) CopyMagickString(image->filename,info->image_info->filename, + MaxTextExtent); + SetImageInfo(info->image_info,0,exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# B l o b T o I m a g e # +# # +# # +# # +############################################################################### +# +# +void +BlobToImage(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + BlobToImage = 1 + blobtoimage = 2 + blobto = 3 + PPCODE: + { + AV + *av; + + char + **keep, + **list; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + char + **p; + + ssize_t + i; + + ssize_t + ac, + n, + number_images; + + STRLEN + *length; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + number_images=0; + ac=(items < 2) ? 1 : items-1; + length=(STRLEN *) NULL; + list=(char **) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*list)); + if (list == (char **) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + length=(STRLEN *) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*length)); + if (length == (STRLEN *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + if (SvTYPE(reference) != SVt_PVAV) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + n=1; + if (items <= 1) + { + ThrowPerlException(exception,OptionError,"NoBlobDefined",PackageName); + goto PerlException; + } + for (n=0, i=0; i < ac; i++) + { + list[n]=(char *) (SvPV(ST(i+1),length[n])); + if ((items >= 3) && strEQcase((char *) SvPV(ST(i+1),na),"blob")) + { + list[n]=(char *) (SvPV(ST(i+2),length[n])); + continue; + } + n++; + } + list[n]=(char *) NULL; + keep=list; + for (i=number_images=0; i < n; i++) + { + image=BlobToImage(info->image_info,list[i],length[i],exception); + if (image == (Image *) NULL) + break; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + number_images++; + } + } + /* + Free resources. + */ + for (i=0; i < n; i++) + if (list[i] != (char *) NULL) + for (p=keep; list[i] != *p++; ) + if (*p == (char *) NULL) + { + list[i]=(char *) RelinquishMagickMemory(list[i]); + break; + } + + PerlException: + if (list) + list=(char **) RelinquishMagickMemory(list); + if (length) + length=(STRLEN *) RelinquishMagickMemory(length); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) number_images); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# C l o n e # +# # +# # +# # +############################################################################### +# +# +void +Clone(ref) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + CopyImage = 1 + copy = 2 + copyimage = 3 + CloneImage = 4 + clone = 5 + cloneimage = 6 + Clone = 7 + PPCODE: + { + AV + *av; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *clone, + *image; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + for ( ; image; image=image->next) + { + clone=CloneImage(image,0,0,MagickTrue,exception); + if (clone == (Image *) NULL) + break; + AddImageToRegistry(sv,clone); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# C L O N E # +# # +# # +# # +############################################################################### +# +# +void +CLONE(ref,...) + SV *ref; + CODE: + { + PERL_UNUSED_VAR(ref); + if (magick_registry != (SplayTreeInfo *) NULL) + { + Image + *p; + + ResetSplayTreeIterator(magick_registry); + p=(Image *) GetNextKeyInSplayTree(magick_registry); + while (p != (Image *) NULL) + { + ReferenceImage(p); + p=(Image *) GetNextKeyInSplayTree(magick_registry); + } + } + } + +# +############################################################################### +# # +# # +# # +# C o a l e s c e # +# # +# # +# # +############################################################################### +# +# +void +Coalesce(ref) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + CoalesceImage = 1 + coalesce = 2 + coalesceimage = 3 + PPCODE: + { + AV + *av; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + image=CoalesceImages(image,exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# C o m p a r e # +# # +# # +# # +############################################################################### +# +# +void +Compare(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + CompareImage = 1 + compare = 2 + compareimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ChannelType + channel; + + double + distortion; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *difference_image, + *image, + *reconstruct_image; + + MetricType + metric; + + ssize_t + i; + + ssize_t + option; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + av=NULL; + attribute=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get attribute. + */ + channel=DefaultChannels; + reconstruct_image=image; + metric=RootMeanSquaredErrorMetric; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"channel") == 0) + { + ssize_t + option; + + option=ParseChannelOption(SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedType",SvPV(ST(i),na)); + return; + } + channel=(ChannelType) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(attribute,"fuzz") == 0) + { + image->fuzz=StringToDoubleInterval(SvPV(ST(i),na),100.0); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(attribute,"image") == 0) + { + reconstruct_image=SetupList(aTHX_ SvRV(ST(i)), + (struct PackageInfo **) NULL,(SV ***) NULL,exception); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"metric") == 0) + { + option=ParseCommandOption(MagickMetricOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + metric=(MetricType) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + difference_image=CompareImageChannels(image,reconstruct_image,channel, + metric,&distortion,exception); + if (difference_image != (Image *) NULL) + { + difference_image->error.mean_error_per_pixel=distortion; + AddImageToRegistry(sv,difference_image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# C o m p a r e L a y e r s # +# # +# # +# # +############################################################################### +# +# +void +CompareLayers(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + CompareImageLayers = 1 + comparelayers = 2 + compareimagelayers = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ImageLayerMethod + method; + + ssize_t + i; + + ssize_t + option; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + method=CompareAnyLayer; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"method") == 0) + { + option=ParseCommandOption(MagickLayerOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + method=(ImageLayerMethod) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=CompareImageLayers(image,method,exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# C o m p l e x I m a g e s # +# # +# # +# # +############################################################################### +# +# +void +ComplexImages(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + ComplexImages = 1 + compleximages = 2 + PPCODE: + { + AV + *av; + + char + *attribute, + *p; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ComplexOperator + op; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + op=UndefinedComplexOperator; + if (items == 2) + { + ssize_t + in; + + in=ParseCommandOption(MagickComplexOptions,MagickFalse,(char *) + SvPV(ST(1),na)); + if (in < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(1),na)); + return; + } + op=(ComplexOperator) in; + } + else + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'O': + case 'o': + { + if (LocaleCompare(attribute,"operator") == 0) + { + ssize_t + in; + + in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickComplexOptions,MagickFalse,SvPV(ST(i),na)); + if (in < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + op=(ComplexOperator) in; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=ComplexImages(image,op,exception); + if (image == (Image *) NULL) + goto PerlException; + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + (void) FormatLocaleString(info->image_info->filename,MaxTextExtent, + "complex-%.*s",(int) (MaxTextExtent-9), + ((p=strrchr(image->filename,'/')) ? p+1 : image->filename)); + (void) CopyMagickString(image->filename,info->image_info->filename, + MaxTextExtent); + SetImageInfo(info->image_info,0,exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# D e s t r o y # +# # +# # +# # +############################################################################### +# +# +void +DESTROY(ref) + Image::Magick::Q16 ref = NO_INIT + PPCODE: + { + SV + *reference; + + PERL_UNUSED_VAR(ref); + if (sv_isobject(ST(0)) == 0) + croak("ReferenceIsNotMyType"); + reference=SvRV(ST(0)); + switch (SvTYPE(reference)) + { + case SVt_PVAV: + { + char + message[MaxTextExtent]; + + const SV + *key; + + HV + *hv; + + GV + **gvp; + + struct PackageInfo + *info; + + SV + *sv; + + /* + Array (AV *) reference + */ + (void) FormatLocaleString(message,MaxTextExtent,"package%s%p", + XS_VERSION,reference); + hv=gv_stashpv(PackageName, FALSE); + if (!hv) + break; + gvp=(GV **) hv_fetch(hv,message,(long) strlen(message),FALSE); + if (!gvp) + break; + sv=GvSV(*gvp); + if (sv && (SvREFCNT(sv) == 1) && SvIOK(sv)) + { + info=INT2PTR(struct PackageInfo *,SvIV(sv)); + DestroyPackageInfo(info); + } + key=hv_delete(hv,message,(long) strlen(message),G_DISCARD); + (void) key; + break; + } + case SVt_PVMG: + { + Image + *image; + + /* + Blessed scalar = (Image *) SvIV(reference) + */ + image=INT2PTR(Image *,SvIV(reference)); + if (image != (Image *) NULL) + DeleteImageFromRegistry(reference,image); + break; + } + default: + break; + } + } + +# +############################################################################### +# # +# # +# # +# D i s p l a y # +# # +# # +# # +############################################################################### +# +# +void +Display(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + DisplayImage = 1 + display = 2 + displayimage = 3 + PPCODE: + { + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + i; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + package_info=(struct PackageInfo *) NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + package_info=ClonePackageInfo(info,exception); + if (items == 2) + SetAttribute(aTHX_ package_info,NULL,"server",ST(1),exception); + else + if (items > 2) + for (i=2; i < items; i+=2) + SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i), + exception); + (void) DisplayImages(package_info->image_info,image); + (void) CatchImageException(image); + InheritException(exception,&image->exception); + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# E v a l u a t e I m a g e s # +# # +# # +# # +############################################################################### +# +# +void +EvaluateImages(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + EvaluateImages = 1 + evaluateimages = 2 + PPCODE: + { + AV + *av; + + char + *attribute, + *p; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + MagickEvaluateOperator + op; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + op=MeanEvaluateOperator; + if (items == 2) + { + ssize_t + in; + + in=ParseCommandOption(MagickEvaluateOptions,MagickFalse,(char *) + SvPV(ST(1),na)); + if (in < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(1),na)); + return; + } + op=(MagickEvaluateOperator) in; + } + else + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'O': + case 'o': + { + if (LocaleCompare(attribute,"operator") == 0) + { + ssize_t + in; + + in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickEvaluateOptions,MagickFalse,SvPV(ST(i),na)); + if (in < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + op=(MagickEvaluateOperator) in; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=EvaluateImages(image,op,exception); + if (image == (Image *) NULL) + goto PerlException; + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + (void) FormatLocaleString(info->image_info->filename,MaxTextExtent, + "evaluate-%.*s",(int) (MaxTextExtent-9), + ((p=strrchr(image->filename,'/')) ? p+1 : image->filename)); + (void) CopyMagickString(image->filename,info->image_info->filename, + MaxTextExtent); + SetImageInfo(info->image_info,0,exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# F e a t u r e s # +# # +# # +# # +############################################################################### +# +# +void +Features(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + FeaturesImage = 1 + features = 2 + featuresimage = 3 + PPCODE: + { +#define ChannelFeatures(channel,direction) \ +{ \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].angular_second_moment[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].contrast[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].contrast[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].variance_sum_of_squares[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].inverse_difference_moment[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].sum_average[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].sum_variance[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].sum_entropy[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].entropy[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].difference_variance[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].difference_entropy[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].measure_of_correlation_1[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].measure_of_correlation_2[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].maximum_correlation_coefficient[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ +} + + AV + *av; + + char + *attribute, + message[MaxTextExtent]; + + ChannelFeatures + *channel_features; + + double + distance; + + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + i; + + ssize_t + count; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + av=newAV(); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + distance=1.0; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'D': + case 'd': + { + if (LocaleCompare(attribute,"distance") == 0) + { + distance=StringToLong((char *) SvPV(ST(1),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + count=0; + for ( ; image; image=image->next) + { + channel_features=GetImageChannelFeatures(image,distance, + &image->exception); + if (channel_features == (ChannelFeatures *) NULL) + continue; + count++; + EXTEND(sp,280*count); + for (i=0; i < 4; i++) + { + ChannelFeatures(RedChannel,i); + ChannelFeatures(GreenChannel,i); + ChannelFeatures(BlueChannel,i); + if (image->colorspace == CMYKColorspace) + ChannelFeatures(IndexChannel,i); + if (image->matte != MagickFalse) + ChannelFeatures(OpacityChannel,i); + } + channel_features=(ChannelFeatures *) + RelinquishMagickMemory(channel_features); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# F l a t t e n # +# # +# # +# # +############################################################################### +# +# +void +Flatten(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + FlattenImage = 1 + flatten = 2 + flattenimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute, + *p; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + PixelPacket + background_color; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + background_color=image->background_color; + if (items == 2) + (void) QueryColorDatabase((char *) SvPV(ST(1),na),&background_color, + exception); + else + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'B': + case 'b': + { + if (LocaleCompare(attribute,"background") == 0) + { + (void) QueryColorDatabase((char *) SvPV(ST(1),na), + &background_color,exception); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image->background_color=background_color; + image=MergeImageLayers(image,FlattenLayer,exception); + if (image == (Image *) NULL) + goto PerlException; + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + (void) FormatLocaleString(info->image_info->filename,MaxTextExtent, + "flatten-%.*s",(int) (MaxTextExtent-9), + ((p=strrchr(image->filename,'/')) ? p+1 : image->filename)); + (void) CopyMagickString(image->filename,info->image_info->filename, + MaxTextExtent); + SetImageInfo(info->image_info,0,exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); /* return messages in string context */ + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# F x # +# # +# # +# # +############################################################################### +# +# +void +Fx(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + FxImage = 1 + fx = 2 + fximage = 3 + PPCODE: + { + AV + *av; + + char + *attribute, + expression[MaxTextExtent]; + + ChannelType + channel; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + attribute=NULL; + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get options. + */ + channel=DefaultChannels; + (void) CopyMagickString(expression,"u",MaxTextExtent); + if (items == 2) + (void) CopyMagickString(expression,(char *) SvPV(ST(1),na),MaxTextExtent); + else + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"channel") == 0) + { + ssize_t + option; + + option=ParseChannelOption(SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedType",SvPV(ST(i),na)); + return; + } + channel=(ChannelType) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(attribute,"expression") == 0) + { + (void) CopyMagickString(expression,SvPV(ST(i),na), + MaxTextExtent); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=FxImageChannel(image,channel,expression,exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# G e t # +# # +# # +# # +############################################################################### +# +# +void +Get(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + GetAttributes = 1 + GetAttribute = 2 + get = 3 + getattributes = 4 + getattribute = 5 + PPCODE: + { + char + *attribute, + color[MaxTextExtent]; + + const char + *value; + + ExceptionInfo + *exception; + + Image + *image; + + long + j; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *s; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + XSRETURN_EMPTY; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL && !info) + XSRETURN_EMPTY; + EXTEND(sp,items); + for (i=1; i < items; i++) + { + attribute=(char *) SvPV(ST(i),na); + s=NULL; + switch (*attribute) + { + case 'A': + case 'a': + { + if (LocaleCompare(attribute,"adjoin") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->adjoin); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"antialias") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->antialias); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"area") == 0) + { + s=newSViv(GetMagickResource(AreaResource)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"attenuate") == 0) + { + const char + *value; + + value=GetImageProperty(image,attribute); + if (value != (const char *) NULL) + s=newSVpv(value,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"authenticate") == 0) + { + if (info) + s=newSVpv(info->image_info->authenticate,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'B': + case 'b': + { + if (LocaleCompare(attribute,"background") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + image->background_color.red,image->background_color.green, + image->background_color.blue,image->background_color.opacity); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"base-columns") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->magick_columns); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"base-filename") == 0) + { + if (image != (Image *) NULL) + s=newSVpv(image->magick_filename,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"base-height") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->magick_rows); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"base-rows") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->magick_rows); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"base-width") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->magick_columns); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"bias") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->bias); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"blue-primary") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,"%.20g,%.15g", + image->chromaticity.blue_primary.x, + image->chromaticity.blue_primary.y); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"bordercolor") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + image->border_color.red,image->border_color.green, + image->border_color.blue,image->border_color.opacity); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"bounding-box") == 0) + { + char + geometry[MaxTextExtent]; + + RectangleInfo + page; + + if (image == (Image *) NULL) + break; + page=GetImageBoundingBox(image,&image->exception); + (void) FormatLocaleString(geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) page.width,(double) + page.height,(double) page.x,(double) page.y); + s=newSVpv(geometry,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"class") == 0) + { + if (image == (Image *) NULL) + break; + s=newSViv(image->storage_class); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickClassOptions, + image->storage_class)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"clip-mask") == 0) + { + if (image != (Image *) NULL) + { + SV + *sv; + + sv=NULL; + if (image->mask == (Image *) NULL) + ClipImage(image); + if (image->mask != (Image *) NULL) + { + AddImageToRegistry(sv,image->mask); + s=sv_bless(newRV(sv),SvSTASH(reference)); + } + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"clip-path") == 0) + { + if (image != (Image *) NULL) + { + SV + *sv; + + sv=NULL; + if (image->clip_mask == (Image *) NULL) + ClipImage(image); + if (image->clip_mask != (Image *) NULL) + { + AddImageToRegistry(sv,image->clip_mask); + s=sv_bless(newRV(sv),SvSTASH(reference)); + } + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"compression") == 0) + { + j=info ? info->image_info->compression : image ? + image->compression : UndefinedCompression; + if (info) + if (info->image_info->compression == UndefinedCompression) + j=image->compression; + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickCompressOptions, + j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"colorspace") == 0) + { + j=image ? image->colorspace : RGBColorspace; + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickColorspaceOptions, + j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"colors") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) GetNumberColors(image,(FILE *) NULL, + &image->exception)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleNCompare(attribute,"colormap",8) == 0) + { + int + items; + + if (image == (Image *) NULL || !image->colormap) + break; + j=0; + items=sscanf(attribute,"%*[^[][%ld",&j); + (void) items; + if (j > (ssize_t) image->colors) + j%=image->colors; + (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + image->colormap[j].red,image->colormap[j].green, + image->colormap[j].blue,image->colormap[j].opacity); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"columns") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->columns); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"comment") == 0) + { + const char + *value; + + value=GetImageProperty(image,attribute); + if (value != (const char *) NULL) + s=newSVpv(value,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"copyright") == 0) + { + s=newSVpv(GetMagickCopyright(),0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(attribute,"density") == 0) + { + char + geometry[MaxTextExtent]; + + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.15g", + image->x_resolution,image->y_resolution); + s=newSVpv(geometry,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"delay") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->delay); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"depth") == 0) + { + s=newSViv(MAGICKCORE_QUANTUM_DEPTH); + if (image != (Image *) NULL) + s=newSViv((ssize_t) GetImageDepth(image,&image->exception)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"directory") == 0) + { + if (image && image->directory) + s=newSVpv(image->directory,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"dispose") == 0) + { + if (image == (Image *) NULL) + break; + + s=newSViv(image->dispose); + (void) sv_setpv(s, + CommandOptionToMnemonic(MagickDisposeOptions,image->dispose)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"disk") == 0) + { + s=newSViv(GetMagickResource(DiskResource)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"dither") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->dither); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"display") == 0) /* same as server */ + { + if (info && info->image_info->server_name) + s=newSVpv(info->image_info->server_name,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(attribute,"elapsed-time") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(GetElapsedTime(&image->timer)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"endian") == 0) + { + j=info ? info->image_info->endian : image ? image->endian : + UndefinedEndian; + if (info) + if (info->image_info->endian == UndefinedEndian) + j=image->endian; + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickEndianOptions,j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"error") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->error.mean_error_per_pixel); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(attribute,"filesize") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) GetBlobSize(image)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"filename") == 0) + { + if (image != (Image *) NULL) + s=newSVpv(image->filename,0); + else + if (info && *info->image_info->filename) + s=newSVpv(info->image_info->filename,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"filter") == 0) + { + s=image ? newSViv(image->filter) : newSViv(0); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickFilterOptions, + image->filter)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"font") == 0) + { + if (info && info->image_info->font) + s=newSVpv(info->image_info->font,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"foreground") == 0) + continue; + if (LocaleCompare(attribute,"format") == 0) + { + const MagickInfo + *magick_info; + + magick_info=(const MagickInfo *) NULL; + if (info && (*info->image_info->magick != '\0')) + magick_info=GetMagickInfo(info->image_info->magick,exception); + if (image != (Image *) NULL) + magick_info=GetMagickInfo(image->magick,&image->exception); + if ((magick_info != (const MagickInfo *) NULL) && + (*magick_info->description != '\0')) + s=newSVpv((char *) magick_info->description,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"fuzz") == 0) + { + if (info) + s=newSVnv(info->image_info->fuzz); + if (image != (Image *) NULL) + s=newSVnv(image->fuzz); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(attribute,"gamma") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->gamma); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"geometry") == 0) + { + if (image && image->geometry) + s=newSVpv(image->geometry,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"gravity") == 0) + { + s=image ? newSViv(image->gravity) : newSViv(0); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickGravityOptions, + image->gravity)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"green-primary") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,"%.20g,%.15g", + image->chromaticity.green_primary.x, + image->chromaticity.green_primary.y); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(attribute,"height") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->rows); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(attribute,"icc") == 0) + { + if (image != (Image *) NULL) + { + const StringInfo + *profile; + + profile=GetImageProfile(image,"icc"); + if (profile != (StringInfo *) NULL) + s=newSVpv((const char *) GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"icm") == 0) + { + if (image != (Image *) NULL) + { + const StringInfo + *profile; + + profile=GetImageProfile(image,"icm"); + if (profile != (const StringInfo *) NULL) + s=newSVpv((const char *) GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"id") == 0) + { + if (image != (Image *) NULL) + { + char + key[MaxTextExtent]; + + MagickBooleanType + status; + + static ssize_t + id = 0; + + (void) FormatLocaleString(key,MaxTextExtent,"%.20g\n",(double) + id); + status=SetImageRegistry(ImageRegistryType,key,image, + &image->exception); + (void) status; + s=newSViv(id++); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleNCompare(attribute,"index",5) == 0) + { + char + name[MaxTextExtent]; + + int + items; + + long + x, + y; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + CacheView + *image_view; + + if (image == (Image *) NULL) + break; + if (image->storage_class != PseudoClass) + break; + x=0; + y=0; + items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y); + (void) items; + image_view=AcquireVirtualCacheView(image,exception); + p=GetCacheViewVirtualPixels(image_view,x,y,1,1,&image->exception); + if (p != (const PixelPacket *) NULL) + { + indexes=GetCacheViewVirtualIndexQueue(image_view); + (void) FormatLocaleString(name,MaxTextExtent,QuantumFormat, + GetPixelIndex(indexes)); + s=newSVpv(name,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + } + image_view=DestroyCacheView(image_view); + continue; + } + if (LocaleCompare(attribute,"iptc") == 0) + { + if (image != (Image *) NULL) + { + const StringInfo + *profile; + + profile=GetImageProfile(image,"iptc"); + if (profile != (const StringInfo *) NULL) + s=newSVpv((const char *) GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"iterations") == 0) /* same as loop */ + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->iterations); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"interlace") == 0) + { + j=info ? info->image_info->interlace : image ? image->interlace : + UndefinedInterlace; + if (info) + if (info->image_info->interlace == UndefinedInterlace) + j=image->interlace; + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickInterlaceOptions, + j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'L': + case 'l': + { + if (LocaleCompare(attribute,"label") == 0) + { + const char + *value; + + if (image == (Image *) NULL) + break; + value=GetImageProperty(image,"Label"); + if (value != (const char *) NULL) + s=newSVpv(value,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"loop") == 0) /* same as iterations */ + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->iterations); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"magick") == 0) + { + if (info && *info->image_info->magick) + s=newSVpv(info->image_info->magick,0); + if (image != (Image *) NULL) + s=newSVpv(image->magick,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"map") == 0) + { + s=newSViv(GetMagickResource(MapResource)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"maximum-error") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->error.normalized_maximum_error); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"memory") == 0) + { + s=newSViv(GetMagickResource(MemoryResource)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"mean-error") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->error.normalized_mean_error); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"mime") == 0) + { + if (info && *info->image_info->magick) + s=newSVpv(MagickToMime(info->image_info->magick),0); + if (image != (Image *) NULL) + s=newSVpv(MagickToMime(image->magick),0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"mattecolor") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + image->matte_color.red,image->matte_color.green, + image->matte_color.blue,image->matte_color.opacity); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"matte") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->matte); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"mime") == 0) + { + const char + *magick; + + magick=NULL; + if (info && *info->image_info->magick) + magick=info->image_info->magick; + if (image != (Image *) NULL) + magick=image->magick; + if (magick) + { + char + *mime; + + mime=MagickToMime(magick); + s=newSVpv(mime,0); + mime=(char *) RelinquishMagickMemory(mime); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"monochrome") == 0) + { + if (image == (Image *) NULL) + continue; + j=info ? info->image_info->monochrome : + IsMonochromeImage(image,&image->exception); + s=newSViv(j); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"montage") == 0) + { + if (image && image->montage) + s=newSVpv(image->montage,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(attribute,"orientation") == 0) + { + j=info ? info->image_info->orientation : image ? + image->orientation : UndefinedOrientation; + if (info) + if (info->image_info->orientation == UndefinedOrientation) + j=image->orientation; + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickOrientationOptions, + j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(attribute,"page") == 0) + { + if (info && info->image_info->page) + s=newSVpv(info->image_info->page,0); + if (image != (Image *) NULL) + { + char + geometry[MaxTextExtent]; + + (void) FormatLocaleString(geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) image->page.width, + (double) image->page.height,(double) image->page.x,(double) + image->page.y); + s=newSVpv(geometry,0); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"page.x") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->page.x); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"page.y") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->page.y); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleNCompare(attribute,"pixel",5) == 0) + { + char + tuple[MaxTextExtent]; + + int + items; + + long + x, + y; + + const PixelPacket + *p; + + const IndexPacket + *indexes; + + if (image == (Image *) NULL) + break; + x=0; + y=0; + items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y); + (void) items; + p=GetVirtualPixels(image,x,y,1,1,exception); + indexes=GetVirtualIndexQueue(image); + if (image->colorspace != CMYKColorspace) + (void) FormatLocaleString(tuple,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + GetPixelRed(p),GetPixelGreen(p), + GetPixelBlue(p),GetPixelOpacity(p)); + else + (void) FormatLocaleString(tuple,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat "," + QuantumFormat,GetPixelRed(p), + GetPixelGreen(p),GetPixelBlue(p), + GetPixelIndex(indexes),GetPixelOpacity(p)); + s=newSVpv(tuple,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"pointsize") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->pointsize); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"precision") == 0) + { + s=newSViv((ssize_t) GetMagickPrecision()); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"preview") == 0) + { + s=newSViv(info->image_info->preview_type); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickPreviewOptions, + info->image_info->preview_type)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'Q': + case 'q': + { + if (LocaleCompare(attribute,"quality") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->quality); + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->quality); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"quantum") == 0) + { + if (info) + s=newSViv((ssize_t) MAGICKCORE_QUANTUM_DEPTH); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(attribute,"rendering-intent") == 0) + { + s=newSViv(image->rendering_intent); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickIntentOptions, + image->rendering_intent)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"red-primary") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,"%.20g,%.15g", + image->chromaticity.red_primary.x, + image->chromaticity.red_primary.y); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"rows") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->rows); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(attribute,"sampling-factor") == 0) + { + if (info && info->image_info->sampling_factor) + s=newSVpv(info->image_info->sampling_factor,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"subimage") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->subimage); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"subrange") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->subrange); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"server") == 0) /* same as display */ + { + if (info && info->image_info->server_name) + s=newSVpv(info->image_info->server_name,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"size") == 0) + { + if (info && info->image_info->size) + s=newSVpv(info->image_info->size,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"scene") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->scene); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"scenes") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) info->image_info->number_scenes); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"signature") == 0) + { + const char + *value; + + if (image == (Image *) NULL) + break; + (void) SignatureImage(image); + value=GetImageProperty(image,"Signature"); + if (value != (const char *) NULL) + s=newSVpv(value,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(attribute,"taint") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) IsTaintImage(image)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"tile") == 0) + { + if (info && info->image_info->tile) + s=newSVpv(info->image_info->tile,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"texture") == 0) + { + if (info && info->image_info->texture) + s=newSVpv(info->image_info->texture,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"total-ink-density") == 0) + { + s=newSViv(MAGICKCORE_QUANTUM_DEPTH); + if (image != (Image *) NULL) + s=newSVnv(GetImageTotalInkDensity(image)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"transparent-color") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + image->transparent_color.red,image->transparent_color.green, + image->transparent_color.blue,image->transparent_color.opacity); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"type") == 0) + { + if (image == (Image *) NULL) + break; + j=(ssize_t) GetImageType(image,&image->exception); + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickTypeOptions,j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'U': + case 'u': + { + if (LocaleCompare(attribute,"units") == 0) + { + j=info ? info->image_info->units : image ? image->units : + UndefinedResolution; + if (info) + if (info->image_info->units == UndefinedResolution) + j=image->units; + if (j == UndefinedResolution) + s=newSVpv("undefined units",0); + else + if (j == PixelsPerInchResolution) + s=newSVpv("pixels / inch",0); + else + s=newSVpv("pixels / centimeter",0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"user-time") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(GetUserTime(&image->timer)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'V': + case 'v': + { + if (LocaleCompare(attribute,"verbose") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->verbose); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"version") == 0) + { + s=newSVpv(GetMagickVersion((size_t *) NULL),0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"view") == 0) + { + if (info && info->image_info->view) + s=newSVpv(info->image_info->view,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"virtual-pixel") == 0) + { + if (image == (Image *) NULL) + break; + j=(ssize_t) GetImageVirtualPixelMethod(image); + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic( + MagickVirtualPixelOptions,j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(attribute,"white-point") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,"%.20g,%.15g", + image->chromaticity.white_point.x, + image->chromaticity.white_point.y); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"width") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->columns); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(attribute,"xmp") == 0) + { + if (image != (Image *) NULL) + { + const StringInfo + *profile; + + profile=GetImageProfile(image,"xmp"); + if (profile != (StringInfo *) NULL) + s=newSVpv((const char *) GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"x-resolution") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->x_resolution); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(attribute,"y-resolution") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->y_resolution); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + break; + } + if (image == (Image *) NULL) + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute) + else + { + value=GetImageProperty(image,attribute); + if (value != (const char *) NULL) + { + s=newSVpv(value,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + } + else + if (*attribute != '%') + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute) + else + { + char + *meta; + + meta=InterpretImageProperties(info ? info->image_info : + (ImageInfo *) NULL,image,attribute); + s=newSVpv(meta,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + meta=(char *) RelinquishMagickMemory(meta); + } + } + } + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + } + +# +############################################################################### +# # +# # +# # +# G e t A u t h e n t i c P i x e l s # +# # +# # +# # +############################################################################### +# +# +void * +GetAuthenticPixels(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + getauthenticpixels = 1 + GetImagePixels = 2 + getimagepixels = 3 + CODE: + { + char + *attribute; + + ExceptionInfo + *exception; + + Image + *image; + + RectangleInfo + region; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + void + *blob = NULL; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + + region.x=0; + region.y=0; + region.width=image->columns; + region.height=1; + if (items == 1) + (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(attribute,"height") == 0) + { + region.height=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(attribute,"x") == 0) + { + region.x=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(attribute,"y") == 0) + { + region.y=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(attribute,"width") == 0) + { + region.width=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + } + } + blob=(void *) GetAuthenticPixels(image,region.x,region.y,region.width, + region.height,exception); + if (blob != (void *) NULL) + goto PerlEnd; + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + + PerlEnd: + RETVAL = blob; + } + OUTPUT: + RETVAL + +# +############################################################################### +# # +# # +# # +# G e t V i r t u a l P i x e l s # +# # +# # +# # +############################################################################### +# +# +void * +GetVirtualPixels(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + getvirtualpixels = 1 + AcquireImagePixels = 2 + acquireimagepixels = 3 + CODE: + { + char + *attribute; + + const void + *blob = NULL; + + ExceptionInfo + *exception; + + Image + *image; + + RectangleInfo + region; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + + region.x=0; + region.y=0; + region.width=image->columns; + region.height=1; + if (items == 1) + (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(attribute,"height") == 0) + { + region.height=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(attribute,"x") == 0) + { + region.x=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(attribute,"y") == 0) + { + region.y=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(attribute,"width") == 0) + { + region.width=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + } + } + blob=(const void *) GetVirtualPixels(image,region.x,region.y,region.width, + region.height,exception); + if (blob != (void *) NULL) + goto PerlEnd; + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + + PerlEnd: + RETVAL = (void *) blob; + } + OUTPUT: + RETVAL + +# +############################################################################### +# # +# # +# # +# G e t A u t h e n t i c I n d e x Q u e u e # +# # +# # +# # +############################################################################### +# +# +void * +GetAuthenticIndexQueue(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + getauthenticindexqueue = 1 + GetIndexes = 2 + getindexes = 3 + CODE: + { + ExceptionInfo + *exception; + + Image + *image; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + void + *blob = NULL; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + + blob=(void *) GetAuthenticIndexQueue(image); + if (blob != (void *) NULL) + goto PerlEnd; + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + + PerlEnd: + RETVAL = blob; + } + OUTPUT: + RETVAL + +# +############################################################################### +# # +# # +# # +# G e t V i r t u a l I n d e x Q u e u e # +# # +# # +# # +############################################################################### +# +# +void * +GetVirtualIndexQueue(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + getvirtualindexqueue = 1 + CODE: + { + ExceptionInfo + *exception; + + Image + *image; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + void + *blob = NULL; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + + blob=(void *) GetVirtualIndexQueue(image); + if (blob != (void *) NULL) + goto PerlEnd; + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + + PerlEnd: + RETVAL = blob; + } + OUTPUT: + RETVAL + +# +############################################################################### +# # +# # +# # +# H i s t o g r a m # +# # +# # +# # +############################################################################### +# +# +void +Histogram(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + HistogramImage = 1 + histogram = 2 + histogramimage = 3 + PPCODE: + { + AV + *av; + + char + message[MaxTextExtent]; + + ColorPacket + *histogram; + + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + i; + + ssize_t + count; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + size_t + number_colors; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + av=newAV(); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + count=0; + for ( ; image; image=image->next) + { + histogram=GetImageHistogram(image,&number_colors,&image->exception); + if (histogram == (ColorPacket *) NULL) + continue; + count+=(ssize_t) number_colors; + EXTEND(sp,6*count); + for (i=0; i < (ssize_t) number_colors; i++) + { + (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat, + histogram[i].pixel.red); + PUSHs(sv_2mortal(newSVpv(message,0))); + (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat, + histogram[i].pixel.green); + PUSHs(sv_2mortal(newSVpv(message,0))); + (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat, + histogram[i].pixel.blue); + PUSHs(sv_2mortal(newSVpv(message,0))); + if (image->colorspace == CMYKColorspace) + { + (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat, + histogram[i].index); + PUSHs(sv_2mortal(newSVpv(message,0))); + } + (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat, + histogram[i].pixel.opacity); + PUSHs(sv_2mortal(newSVpv(message,0))); + (void) FormatLocaleString(message,MaxTextExtent,"%.20g",(double) + histogram[i].count); + PUSHs(sv_2mortal(newSVpv(message,0))); + } + histogram=(ColorPacket *) RelinquishMagickMemory(histogram); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# G e t P i x e l # +# # +# # +# # +############################################################################### +# +# +void +GetPixel(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + getpixel = 1 + getPixel = 2 + PPCODE: + { + AV + *av; + + char + *attribute; + + ChannelType + channel; + + ExceptionInfo + *exception; + + Image + *image; + + MagickBooleanType + normalize; + + RectangleInfo + region; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i; + + ssize_t + option; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + channel=DefaultChannels; + normalize=MagickTrue; + region.x=0; + region.y=0; + region.width=image->columns; + region.height=1; + if (items == 1) + (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"channel") == 0) + { + ssize_t + option; + + option=ParseChannelOption(SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + channel=(ChannelType) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'N': + case 'n': + { + if (LocaleCompare(attribute,"normalize") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + normalize=option != 0 ? MagickTrue : MagickFalse; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'x': + case 'X': + { + if (LocaleCompare(attribute,"x") == 0) + { + region.x=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'y': + case 'Y': + { + if (LocaleCompare(attribute,"y") == 0) + { + region.y=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + p=GetVirtualPixels(image,region.x,region.y,1,1,exception); + if (p == (const PixelPacket *) NULL) + PUSHs(&sv_undef); + else + { + double + scale; + + indexes=GetVirtualIndexQueue(image); + scale=1.0; + if (normalize != MagickFalse) + scale=1.0/QuantumRange; + if ((channel & RedChannel) != 0) + PUSHs(sv_2mortal(newSVnv(scale*GetPixelRed(p)))); + if ((channel & GreenChannel) != 0) + PUSHs(sv_2mortal(newSVnv(scale*GetPixelGreen(p)))); + if ((channel & BlueChannel) != 0) + PUSHs(sv_2mortal(newSVnv(scale*GetPixelBlue(p)))); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + PUSHs(sv_2mortal(newSVnv(scale*GetPixelIndex(indexes)))); + if ((channel & OpacityChannel) != 0) + PUSHs(sv_2mortal(newSVnv(scale*GetPixelOpacity(p)))); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# G e t P i x e l s # +# # +# # +# # +############################################################################### +# +# +void +GetPixels(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + getpixels = 1 + getPixels = 2 + PPCODE: + { + AV + *av; + + char + *attribute; + + const char + *map; + + ExceptionInfo + *exception; + + Image + *image; + + MagickBooleanType + normalize, + status; + + RectangleInfo + region; + + ssize_t + i; + + ssize_t + option; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + map="RGB"; + if (image->matte != MagickFalse) + map="RGBA"; + if (image->colorspace == CMYKColorspace) + { + map="CMYK"; + if (image->matte != MagickFalse) + map="CMYKA"; + } + normalize=MagickFalse; + region.x=0; + region.y=0; + region.width=image->columns; + region.height=1; + if (items == 1) + (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(attribute,"height") == 0) + { + region.height=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"map") == 0) + { + map=SvPV(ST(i),na); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'N': + case 'n': + { + if (LocaleCompare(attribute,"normalize") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + normalize=option != 0 ? MagickTrue : MagickFalse; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(attribute,"width") == 0) + { + region.width=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'x': + case 'X': + { + if (LocaleCompare(attribute,"x") == 0) + { + region.x=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'y': + case 'Y': + { + if (LocaleCompare(attribute,"y") == 0) + { + region.y=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + if (normalize != MagickFalse) + { + float + *pixels; + + MemoryInfo + *pixels_info; + + pixels_info=AcquireVirtualMemory(strlen(map)*region.width, + region.height*sizeof(*pixels)); + if (pixels_info == (MemoryInfo *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + pixels=(float *) GetVirtualMemoryBlob(pixels_info); + status=ExportImagePixels(image,region.x,region.y,region.width, + region.height,map,FloatPixel,pixels,exception); + if (status == MagickFalse) + PUSHs(&sv_undef); + else + { + EXTEND(sp,strlen(map)*region.width*region.height); + for (i=0; i < (ssize_t) (strlen(map)*region.width*region.height); i++) + PUSHs(sv_2mortal(newSVnv(pixels[i]))); + } + pixels_info=RelinquishVirtualMemory(pixels_info); + } + else + { + MemoryInfo + *pixels_info; + + Quantum + *pixels; + + pixels_info=AcquireVirtualMemory(strlen(map)*region.width, + region.height*sizeof(*pixels)); + if (pixels_info == (MemoryInfo *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + pixels=(Quantum *) GetVirtualMemoryBlob(pixels_info); + status=ExportImagePixels(image,region.x,region.y,region.width, + region.height,map,QuantumPixel,pixels,exception); + if (status == MagickFalse) + PUSHs(&sv_undef); + else + { + EXTEND(sp,strlen(map)*region.width*region.height); + for (i=0; i < (ssize_t) (strlen(map)*region.width*region.height); i++) + PUSHs(sv_2mortal(newSViv(pixels[i]))); + } + pixels_info=RelinquishVirtualMemory(pixels_info); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# I m a g e T o B l o b # +# # +# # +# # +############################################################################### +# +# +void +ImageToBlob(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + ImageToBlob = 1 + imagetoblob = 2 + toblob = 3 + blob = 4 + PPCODE: + { + char + filename[MaxTextExtent]; + + ExceptionInfo + *exception; + + Image + *image, + *next; + + ssize_t + i; + + struct PackageInfo + *info, + *package_info; + + size_t + length; + + ssize_t + scene; + + SV + *perl_exception, + *reference; + + void + *blob; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + package_info=(struct PackageInfo *) NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + package_info=ClonePackageInfo(info,exception); + for (i=2; i < items; i+=2) + SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i),exception); + (void) CopyMagickString(filename,package_info->image_info->filename, + MaxTextExtent); + scene=0; + for (next=image; next; next=next->next) + { + (void) CopyMagickString(next->filename,filename,MaxTextExtent); + next->scene=scene++; + } + SetImageInfo(package_info->image_info,(unsigned int) + GetImageListLength(image),&image->exception); + EXTEND(sp,(ssize_t) GetImageListLength(image)); + for ( ; image; image=image->next) + { + length=0; + blob=ImagesToBlob(package_info->image_info,image,&length,exception); + if (blob != (char *) NULL) + { + PUSHs(sv_2mortal(newSVpv((const char *) blob,length))); + blob=(unsigned char *) RelinquishMagickMemory(blob); + } + if (package_info->image_info->adjoin) + break; + } + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + } + +# +############################################################################### +# # +# # +# # +# L a y e r s # +# # +# # +# # +############################################################################### +# +# +void +Layers(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + Layers = 1 + layers = 2 + OptimizeImageLayers = 3 + optimizelayers = 4 + optimizeimagelayers = 5 + PPCODE: + { + AV + *av; + + char + *attribute; + + CompositeOperator + compose; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image, + *layers; + + ImageLayerMethod + method; + + ssize_t + i; + + ssize_t + option, + sp; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + compose=image->compose; + method=OptimizeLayer; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"compose") == 0) + { + sp=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickComposeOptions,MagickFalse,SvPV(ST(i),na)); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + compose=(CompositeOperator) sp; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"method") == 0) + { + option=ParseCommandOption(MagickLayerOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + method=(ImageLayerMethod) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + layers=(Image *) NULL; + switch (method) + { + case CompareAnyLayer: + case CompareClearLayer: + case CompareOverlayLayer: + default: + { + layers=CompareImageLayers(image,method,exception); + break; + } + case MergeLayer: + case FlattenLayer: + case MosaicLayer: + { + layers=MergeImageLayers(image,method,exception); + break; + } + case DisposeLayer: + { + layers=DisposeImages(image,exception); + break; + } + case OptimizeImageLayer: + { + layers=OptimizeImageLayers(image,exception); + break; + } + case OptimizePlusLayer: + { + layers=OptimizePlusImageLayers(image,exception); + break; + } + case OptimizeTransLayer: + { + OptimizeImageTransparency(image,exception); + InheritException(&(image->exception),exception); + break; + } + case RemoveDupsLayer: + { + RemoveDuplicateLayers(&image,exception); + InheritException(&(image->exception),exception); + break; + } + case RemoveZeroLayer: + { + RemoveZeroDelayLayers(&image,exception); + InheritException(&(image->exception),exception); + break; + } + case OptimizeLayer: + { + QuantizeInfo + *quantize_info; + + /* + General Purpose, GIF Animation Optimizer. + */ + layers=CoalesceImages(image,exception); + if (layers == (Image *) NULL) + break; + InheritException(&(layers->exception),exception); + image=layers; + layers=OptimizeImageLayers(image,exception); + if (layers == (Image *) NULL) + break; + InheritException(&(layers->exception),exception); + image=DestroyImageList(image); + image=layers; + layers=(Image *) NULL; + OptimizeImageTransparency(image,exception); + InheritException(&(image->exception),exception); + quantize_info=AcquireQuantizeInfo(info->image_info); + (void) RemapImages(quantize_info,image,(Image *) NULL); + quantize_info=DestroyQuantizeInfo(quantize_info); + break; + } + case CompositeLayer: + { + Image + *source; + + RectangleInfo + geometry; + + /* + Split image sequence at the first 'NULL:' image. + */ + source=image; + while (source != (Image *) NULL) + { + source=GetNextImageInList(source); + if ((source != (Image *) NULL) && + (LocaleCompare(source->magick,"NULL") == 0)) + break; + } + if (source != (Image *) NULL) + { + if ((GetPreviousImageInList(source) == (Image *) NULL) || + (GetNextImageInList(source) == (Image *) NULL)) + source=(Image *) NULL; + else + { + /* + Separate the two lists, junk the null: image. + */ + source=SplitImageList(source->previous); + DeleteImageFromList(&source); + } + } + if (source == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"MissingNullSeparator","layers Composite"); + break; + } + /* + Adjust offset with gravity and virtual canvas. + */ + SetGeometry(image,&geometry); + (void) ParseAbsoluteGeometry(image->geometry,&geometry); + geometry.width=source->page.width != 0 ? source->page.width : + source->columns; + geometry.height=source->page.height != 0 ? source->page.height : + source->rows; + GravityAdjustGeometry(image->page.width != 0 ? image->page.width : + image->columns,image->page.height != 0 ? image->page.height : + image->rows,image->gravity,&geometry); + CompositeLayers(image,compose,source,geometry.x,geometry.y,exception); + source=DestroyImageList(source); + InheritException(&(image->exception),exception); + break; + } + } + if (layers == (Image *) NULL) + image=CloneImage(image,0,0,MagickTrue,exception); + else + { + InheritException(&(layers->exception),exception); + image=layers; + } + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# M a g i c k T o M i m e # +# # +# # +# # +############################################################################### +# +# +SV * +MagickToMime(ref,name) + Image::Magick::Q16 ref = NO_INIT + char *name + ALIAS: + magicktomime = 1 + CODE: + { + char + *mime; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + mime=MagickToMime(name); + RETVAL=newSVpv(mime,0); + mime=(char *) RelinquishMagickMemory(mime); + } + OUTPUT: + RETVAL + +# +############################################################################### +# # +# # +# # +# M o g r i f y # +# # +# # +# # +############################################################################### +# +# +void +Mogrify(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + Comment = 1 + CommentImage = 2 + Label = 3 + LabelImage = 4 + AddNoise = 5 + AddNoiseImage = 6 + Colorize = 7 + ColorizeImage = 8 + Border = 9 + BorderImage = 10 + Blur = 11 + BlurImage = 12 + Chop = 13 + ChopImage = 14 + Crop = 15 + CropImage = 16 + Despeckle = 17 + DespeckleImage = 18 + Edge = 19 + EdgeImage = 20 + Emboss = 21 + EmbossImage = 22 + Enhance = 23 + EnhanceImage = 24 + Flip = 25 + FlipImage = 26 + Flop = 27 + FlopImage = 28 + Frame = 29 + FrameImage = 30 + Implode = 31 + ImplodeImage = 32 + Magnify = 33 + MagnifyImage = 34 + MedianFilter = 35 + MedianFilterImage = 36 + Minify = 37 + MinifyImage = 38 + OilPaint = 39 + OilPaintImage = 40 + ReduceNoise = 41 + ReduceNoiseImage = 42 + Roll = 43 + RollImage = 44 + Rotate = 45 + RotateImage = 46 + Sample = 47 + SampleImage = 48 + Scale = 49 + ScaleImage = 50 + Shade = 51 + ShadeImage = 52 + Sharpen = 53 + SharpenImage = 54 + Shear = 55 + ShearImage = 56 + Spread = 57 + SpreadImage = 58 + Swirl = 59 + SwirlImage = 60 + Resize = 61 + ResizeImage = 62 + Zoom = 63 + ZoomImage = 64 + Annotate = 65 + AnnotateImage = 66 + ColorFloodfill = 67 + ColorFloodfillImage= 68 + Composite = 69 + CompositeImage = 70 + Contrast = 71 + ContrastImage = 72 + CycleColormap = 73 + CycleColormapImage = 74 + Draw = 75 + DrawImage = 76 + Equalize = 77 + EqualizeImage = 78 + Gamma = 79 + GammaImage = 80 + Map = 81 + MapImage = 82 + MatteFloodfill = 83 + MatteFloodfillImage= 84 + Modulate = 85 + ModulateImage = 86 + Negate = 87 + NegateImage = 88 + Normalize = 89 + NormalizeImage = 90 + NumberColors = 91 + NumberColorsImage = 92 + Opaque = 93 + OpaqueImage = 94 + Quantize = 95 + QuantizeImage = 96 + Raise = 97 + RaiseImage = 98 + Segment = 99 + SegmentImage = 100 + Signature = 101 + SignatureImage = 102 + Solarize = 103 + SolarizeImage = 104 + Sync = 105 + SyncImage = 106 + Texture = 107 + TextureImage = 108 + Evaluate = 109 + EvaluateImage = 110 + Transparent = 111 + TransparentImage = 112 + Threshold = 113 + ThresholdImage = 114 + Charcoal = 115 + CharcoalImage = 116 + Trim = 117 + TrimImage = 118 + Wave = 119 + WaveImage = 120 + Separate = 121 + SeparateImage = 122 + Stereo = 125 + StereoImage = 126 + Stegano = 127 + SteganoImage = 128 + Deconstruct = 129 + DeconstructImage = 130 + GaussianBlur = 131 + GaussianBlurImage = 132 + Convolve = 133 + ConvolveImage = 134 + Profile = 135 + ProfileImage = 136 + UnsharpMask = 137 + UnsharpMaskImage = 138 + MotionBlur = 139 + MotionBlurImage = 140 + OrderedDither = 141 + OrderedDitherImage = 142 + Shave = 143 + ShaveImage = 144 + Level = 145 + LevelImage = 146 + Clip = 147 + ClipImage = 148 + AffineTransform = 149 + AffineTransformImage = 150 + Difference = 151 + DifferenceImage = 152 + AdaptiveThreshold = 153 + AdaptiveThresholdImage = 154 + Resample = 155 + ResampleImage = 156 + Describe = 157 + DescribeImage = 158 + BlackThreshold = 159 + BlackThresholdImage= 160 + WhiteThreshold = 161 + WhiteThresholdImage= 162 + RotationalBlur = 163 + RotationalBlurImage= 164 + Thumbnail = 165 + ThumbnailImage = 166 + Strip = 167 + StripImage = 168 + Tint = 169 + TintImage = 170 + Channel = 171 + ChannelImage = 172 + Splice = 173 + SpliceImage = 174 + Posterize = 175 + PosterizeImage = 176 + Shadow = 177 + ShadowImage = 178 + Identify = 179 + IdentifyImage = 180 + SepiaTone = 181 + SepiaToneImage = 182 + SigmoidalContrast = 183 + SigmoidalContrastImage = 184 + Extent = 185 + ExtentImage = 186 + Vignette = 187 + VignetteImage = 188 + ContrastStretch = 189 + ContrastStretchImage = 190 + Sans0 = 191 + Sans0Image = 192 + Sans1 = 193 + Sans1Image = 194 + AdaptiveSharpen = 195 + AdaptiveSharpenImage = 196 + Transpose = 197 + TransposeImage = 198 + Transverse = 199 + TransverseImage = 200 + AutoOrient = 201 + AutoOrientImage = 202 + AdaptiveBlur = 203 + AdaptiveBlurImage = 204 + Sketch = 205 + SketchImage = 206 + UniqueColors = 207 + UniqueColorsImage = 208 + AdaptiveResize = 209 + AdaptiveResizeImage= 210 + ClipMask = 211 + ClipMaskImage = 212 + LinearStretch = 213 + LinearStretchImage = 214 + RecolorImage = 215 + Recolor = 216 + Mask = 217 + MaskImage = 218 + Polaroid = 219 + PolaroidImage = 220 + FloodfillPaint = 221 + FloodfillPaintImage= 222 + Distort = 223 + DistortImage = 224 + Clut = 225 + ClutImage = 226 + LiquidRescale = 227 + LiquidRescaleImage = 228 + Encipher = 229 + EncipherImage = 230 + Decipher = 231 + DecipherImage = 232 + Deskew = 233 + DeskewImage = 234 + Remap = 235 + RemapImage = 236 + SparseColor = 237 + SparseColorImage = 238 + Function = 239 + FunctionImage = 240 + SelectiveBlur = 241 + SelectiveBlurImage = 242 + HaldClut = 243 + HaldClutImage = 244 + BlueShift = 245 + BlueShiftImage = 246 + ForwardFourierTransform = 247 + ForwardFourierTransformImage = 248 + InverseFourierTransform = 249 + InverseFourierTransformImage = 250 + ColorDecisionList = 251 + ColorDecisionListImage = 252 + AutoGamma = 253 + AutoGammaImage = 254 + AutoLevel = 255 + AutoLevelImage = 256 + LevelColors = 257 + LevelColorsImage = 258 + Clamp = 259 + ClampImage = 260 + Filter = 261 + FilterImage = 262 + BrightnessContrast = 263 + BrightnessContrastImage = 264 + Morphology = 265 + MorphologyImage = 266 + ColorMatrix = 267 + ColorMatrixImage = 268 + Color = 269 + ColorImage = 270 + Mode = 271 + ModeImage = 272 + Statistic = 273 + StatisticImage = 274 + Perceptible = 275 + PerceptibleImage = 276 + Poly = 277 + PolyImage = 278 + Grayscale = 279 + GrayscaleImage = 280 + CannyEdge = 281 + CannyEdgeImage = 282 + HoughLine = 283 + HoughLineImage = 284 + MeanShift = 285 + MeanShiftImage = 286 + Kuwahara = 287 + KuwaharaImage = 288 + ConnectedComponents= 289 + ConnectedComponentsImage = 290 + CopyPixels = 291 + CopyImagePixels = 292 + WaveletDenoise = 293 + WaveletDenoiseImage= 294 + Colorspace = 295 + ColorspaceImage = 296 + AutoThreshold = 297 + AutoThresholdImage = 298 + MogrifyRegion = 666 + PPCODE: + { + AffineMatrix + affine, + current; + + char + attribute_flag[MaxArguments], + message[MaxTextExtent]; + + ChannelType + channel; + + CompositeOperator + compose; + + const char + *attribute, + *value; + + double + angle; + + ExceptionInfo + *exception; + + GeometryInfo + geometry_info; + + Image + *image, + *next, + *region_image; + + MagickBooleanType + status; + + MagickStatusType + flags; + + PixelPacket + fill_color; + + RectangleInfo + geometry, + region_info; + + ssize_t + i; + + ssize_t + base, + j, + number_images; + + struct Methods + *rp; + + struct PackageInfo + *info; + + SV + *perl_exception, + **pv, + *reference, + **reference_vector; + + struct ArgumentList + argument_list[MaxArguments]; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference_vector=NULL; + region_image=NULL; + number_images=0; + base=2; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + region_info.width=0; + region_info.height=0; + region_info.x=0; + region_info.y=0; + region_image=(Image *) NULL; + image=SetupList(aTHX_ reference,&info,&reference_vector,exception); + if (ix && (ix != 666)) + { + /* + Called as Method(...) + */ + ix=(ix+1)/2; + rp=(&Methods[ix-1]); + attribute=rp->name; + } + else + { + /* + Called as Mogrify("Method",...) + */ + attribute=(char *) SvPV(ST(1),na); + if (ix) + { + flags=ParseGravityGeometry(image,attribute,®ion_info,exception); + attribute=(char *) SvPV(ST(2),na); + base++; + } + for (rp=Methods; ; rp++) + { + if (rp >= EndOf(Methods)) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedPerlMagickMethod",attribute); + goto PerlException; + } + if (strEQcase(attribute,rp->name)) + break; + } + ix=rp-Methods+1; + base++; + } + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined",attribute); + goto PerlException; + } + Zero(&argument_list,NumberOf(argument_list),struct ArgumentList); + Zero(&attribute_flag,NumberOf(attribute_flag),char); + for (i=base; (i < items) || ((i == items) && (base == items)); i+=2) + { + Arguments + *pp, + *qq; + + ssize_t + ssize_test; + + struct ArgumentList + *al; + + SV + *sv; + + sv=NULL; + ssize_test=0; + pp=(Arguments *) NULL; + qq=rp->arguments; + if (i == items) + { + pp=rp->arguments, + sv=ST(i-1); + } + else + for (sv=ST(i), attribute=(char *) SvPV(ST(i-1),na); ; qq++) + { + if ((qq >= EndOf(rp->arguments)) || (qq->method == NULL)) + break; + if (strEQcase(attribute,qq->method) > ssize_test) + { + pp=qq; + ssize_test=strEQcase(attribute,qq->method); + } + } + if (pp == (Arguments *) NULL) + { + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + goto continue_outer_loop; + } + al=(&argument_list[pp-rp->arguments]); + switch (pp->type) + { + case ArrayReference: + { + if (SvTYPE(sv) != SVt_RV) + { + (void) FormatLocaleString(message,MaxTextExtent, + "invalid %.60s value",pp->method); + ThrowPerlException(exception,OptionError,message,SvPV(sv,na)); + goto continue_outer_loop; + } + al->array_reference=SvRV(sv); + break; + } + case RealReference: + { + al->real_reference=SvNV(sv); + break; + } + case FileReference: + { + al->file_reference=(FILE *) PerlIO_findFILE(IoIFP(sv_2io(sv))); + break; + } + case ImageReference: + { + if (!sv_isobject(sv) || + !(al->image_reference=SetupList(aTHX_ SvRV(sv), + (struct PackageInfo **) NULL,(SV ***) NULL,exception))) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + break; + } + case IntegerReference: + { + al->integer_reference=SvIV(sv); + break; + } + case StringReference: + { + al->string_reference=(char *) SvPV(sv,al->length); + if (sv_isobject(sv)) + al->image_reference=SetupList(aTHX_ SvRV(sv), + (struct PackageInfo **) NULL,(SV ***) NULL,exception); + break; + } + default: + { + /* + Is a string; look up name. + */ + if ((al->length > 1) && (*(char *) SvPV(sv,al->length) == '@')) + { + al->string_reference=(char *) SvPV(sv,al->length); + al->integer_reference=(-1); + break; + } + al->integer_reference=ParseCommandOption((CommandOption) pp->type, + MagickFalse,SvPV(sv,na)); + if (pp->type == MagickChannelOptions) + al->integer_reference=ParseChannelOption(SvPV(sv,na)); + if ((al->integer_reference < 0) && ((al->integer_reference=SvIV(sv)) <= 0)) + { + (void) FormatLocaleString(message,MaxTextExtent, + "invalid %.60s value",pp->method); + ThrowPerlException(exception,OptionError,message,SvPV(sv,na)); + goto continue_outer_loop; + } + break; + } + } + attribute_flag[pp-rp->arguments]++; + continue_outer_loop: ; + } + (void) ResetMagickMemory((char *) &fill_color,0,sizeof(fill_color)); + pv=reference_vector; + SetGeometryInfo(&geometry_info); + channel=DefaultChannels; + for (next=image; next; next=next->next) + { + image=next; + SetGeometry(image,&geometry); + if ((region_info.width*region_info.height) != 0) + { + region_image=image; + image=CropImage(image,®ion_info,exception); + } + switch (ix) + { + default: + { + (void) FormatLocaleString(message,MaxTextExtent,"%.20g",(double) ix); + ThrowPerlException(exception,OptionError, + "UnrecognizedPerlMagickMethod",message); + goto PerlException; + } + case 1: /* Comment */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference=(char *) NULL; + (void) SetImageProperty(image,"comment",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,image, + argument_list[0].string_reference)); + break; + } + case 2: /* Label */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference=(char *) NULL; + (void) SetImageProperty(image,"label",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,image, + argument_list[0].string_reference)); + break; + } + case 3: /* AddNoise */ + { + if (attribute_flag[0] == 0) + argument_list[0].integer_reference=UniformNoise; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + image=AddNoiseImageChannel(image,channel,(NoiseType) + argument_list[0].integer_reference,exception); + break; + } + case 4: /* Colorize */ + { + PixelPacket + target; + + (void) GetOneVirtualPixel(image,0,0,&target,exception); + if (attribute_flag[0] != 0) + (void) QueryColorDatabase(argument_list[0].string_reference,&target, + exception); + if (attribute_flag[1] == 0) + argument_list[1].string_reference="100%"; + image=ColorizeImage(image,argument_list[1].string_reference,target, + exception); + break; + } + case 5: /* Border */ + { + geometry.width=0; + geometry.height=0; + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + QueryColorDatabase(argument_list[3].string_reference, + &image->border_color,exception); + if (attribute_flag[4] != 0) + QueryColorDatabase(argument_list[4].string_reference, + &image->border_color,exception); + if (attribute_flag[5] != 0) + QueryColorDatabase(argument_list[5].string_reference, + &image->border_color,exception); + if (attribute_flag[6] != 0) + image->compose=(CompositeOperator) + argument_list[6].integer_reference; + image=BorderImage(image,&geometry,exception); + break; + } + case 6: /* Blur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=BlurImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 7: /* Chop */ + { + if (attribute_flag[5] != 0) + image->gravity=(GravityType) argument_list[5].integer_reference; + if (attribute_flag[0] != 0) + flags=ParseGravityGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry.x=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry.y=argument_list[4].integer_reference; + image=ChopImage(image,&geometry,exception); + break; + } + case 8: /* Crop */ + { + if (attribute_flag[6] != 0) + image->gravity=(GravityType) argument_list[6].integer_reference; + if (attribute_flag[0] != 0) + flags=ParseGravityGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry.x=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry.y=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + image=CropImage(image,&geometry,exception); + break; + } + case 9: /* Despeckle */ + { + image=DespeckleImage(image,exception); + break; + } + case 10: /* Edge */ + { + if (attribute_flag[0] != 0) + geometry_info.rho=argument_list[0].real_reference; + image=EdgeImage(image,geometry_info.rho,exception); + break; + } + case 11: /* Emboss */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + image=EmbossImage(image,geometry_info.rho,geometry_info.sigma, + exception); + break; + } + case 12: /* Enhance */ + { + image=EnhanceImage(image,exception); + break; + } + case 13: /* Flip */ + { + image=FlipImage(image,exception); + break; + } + case 14: /* Flop */ + { + image=FlopImage(image,exception); + break; + } + case 15: /* Frame */ + { + FrameInfo + frame_info; + + if (attribute_flag[0] != 0) + { + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + frame_info.width=geometry.width; + frame_info.height=geometry.height; + frame_info.outer_bevel=geometry.x; + frame_info.inner_bevel=geometry.y; + } + if (attribute_flag[1] != 0) + frame_info.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + frame_info.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + frame_info.inner_bevel=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + frame_info.outer_bevel=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + QueryColorDatabase(argument_list[5].string_reference,&fill_color, + exception); + if (attribute_flag[6] != 0) + QueryColorDatabase(argument_list[6].string_reference,&fill_color, + exception); + frame_info.x=(ssize_t) frame_info.width; + frame_info.y=(ssize_t) frame_info.height; + frame_info.width=image->columns+2*frame_info.x; + frame_info.height=image->rows+2*frame_info.y; + if ((attribute_flag[5] != 0) || (attribute_flag[6] != 0)) + image->matte_color=fill_color; + if (attribute_flag[7] != 0) + image->compose=(CompositeOperator) argument_list[7].integer_reference; + image=FrameImage(image,&frame_info,exception); + break; + } + case 16: /* Implode */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=0.5; + if (attribute_flag[1] != 0) + image->interpolate=(InterpolatePixelMethod) + argument_list[1].integer_reference; + image=ImplodeImage(image,argument_list[0].real_reference, + exception); + break; + } + case 17: /* Magnify */ + { + image=MagnifyImage(image,exception); + break; + } + case 18: /* MedianFilter */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=StatisticImageChannel(image,channel,MedianStatistic, + (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception); + break; + } + case 19: /* Minify */ + { + image=MinifyImage(image,exception); + break; + } + case 20: /* OilPaint */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=0.0; + image=OilPaintImage(image,argument_list[0].real_reference, + exception); + break; + } + case 21: /* ReduceNoise */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=StatisticImageChannel(image,channel,NonpeakStatistic, + (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception); + break; + } + case 22: /* Roll */ + { + if (attribute_flag[0] != 0) + { + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if ((flags & PercentValue) != 0) + { + geometry.x*=(double) image->columns/100.0; + geometry.y*=(double) image->rows/100.0; + } + } + if (attribute_flag[1] != 0) + geometry.x=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.y=argument_list[2].integer_reference; + image=RollImage(image,geometry.x,geometry.y,exception); + break; + } + case 23: /* Rotate */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=90.0; + if (attribute_flag[1] != 0) + QueryColorDatabase(argument_list[1].string_reference, + &image->background_color,exception); + if (attribute_flag[2] != 0) + QueryColorDatabase(argument_list[2].string_reference, + &image->background_color,exception); + if (attribute_flag[3] != 0) + QueryColorDatabase(argument_list[3].string_reference, + &image->background_color,exception); + image=RotateImage(image,argument_list[0].real_reference,exception); + break; + } + case 24: /* Sample */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + image=SampleImage(image,geometry.width,geometry.height,exception); + break; + } + case 25: /* Scale */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + image=ScaleImage(image,geometry.width,geometry.height,exception); + break; + } + case 26: /* Shade */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=0.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + image=ShadeImage(image, + argument_list[3].integer_reference != 0 ? MagickTrue : MagickFalse, + geometry_info.rho,geometry_info.sigma,exception); + break; + } + case 27: /* Sharpen */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=SharpenImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 28: /* Shear */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + QueryColorDatabase(argument_list[3].string_reference, + &image->background_color,exception); + if (attribute_flag[4] != 0) + QueryColorDatabase(argument_list[4].string_reference, + &image->background_color,exception); + image=ShearImage(image,geometry_info.rho,geometry_info.sigma, + exception); + break; + } + case 29: /* Spread */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=1.0; + image=SpreadImage(image,argument_list[0].real_reference,exception); + break; + } + case 30: /* Swirl */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=50.0; + if (attribute_flag[1] != 0) + image->interpolate=(InterpolatePixelMethod) + argument_list[1].integer_reference; + image=SwirlImage(image,argument_list[0].real_reference,exception); + break; + } + case 31: /* Resize */ + case 32: /* Zoom */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] == 0) + argument_list[3].integer_reference=(ssize_t) UndefinedFilter; + if (attribute_flag[4] != 0) + SetImageArtifact(image,"filter:support", + argument_list[4].string_reference); + if (attribute_flag[5] == 0) + argument_list[5].real_reference=1.0; + image=ResizeImage(image,geometry.width,geometry.height, + (FilterTypes) argument_list[3].integer_reference, + argument_list[5].real_reference,exception); + break; + } + case 33: /* Annotate */ + { + DrawInfo + *draw_info; + + draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL, + (DrawInfo *) NULL); + if (attribute_flag[0] != 0) + { + char + *text; + + text=InterpretImageProperties(info ? info->image_info : + (ImageInfo *) NULL,image,argument_list[0].string_reference); + (void) CloneString(&draw_info->text,text); + text=DestroyString(text); + } + if (attribute_flag[1] != 0) + (void) CloneString(&draw_info->font, + argument_list[1].string_reference); + if (attribute_flag[2] != 0) + draw_info->pointsize=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + (void) CloneString(&draw_info->density, + argument_list[3].string_reference); + if (attribute_flag[4] != 0) + (void) QueryColorDatabase(argument_list[4].string_reference, + &draw_info->undercolor,exception); + if (attribute_flag[5] != 0) + { + (void) QueryColorDatabase(argument_list[5].string_reference, + &draw_info->stroke,exception); + if (argument_list[5].image_reference != (Image *) NULL) + draw_info->stroke_pattern=CloneImage( + argument_list[5].image_reference,0,0,MagickTrue,exception); + } + if (attribute_flag[6] != 0) + { + (void) QueryColorDatabase(argument_list[6].string_reference, + &draw_info->fill,exception); + if (argument_list[6].image_reference != (Image *) NULL) + draw_info->fill_pattern=CloneImage( + argument_list[6].image_reference,0,0,MagickTrue,exception); + } + if (attribute_flag[7] != 0) + { + (void) CloneString(&draw_info->geometry, + argument_list[7].string_reference); + flags=ParsePageGeometry(image,argument_list[7].string_reference, + &geometry,exception); + if (((flags & SigmaValue) == 0) && ((flags & XiValue) != 0)) + geometry_info.sigma=geometry_info.xi; + } + if (attribute_flag[8] != 0) + (void) QueryColorDatabase(argument_list[8].string_reference, + &draw_info->fill,exception); + if (attribute_flag[11] != 0) + draw_info->gravity=(GravityType) argument_list[11].integer_reference; + if (attribute_flag[25] != 0) + { + AV + *av; + + av=(AV *) argument_list[25].array_reference; + if ((av_len(av) != 3) && (av_len(av) != 5)) + { + ThrowPerlException(exception,OptionError, + "affine matrix must have 4 or 6 elements",PackageName); + goto PerlException; + } + draw_info->affine.sx=(double) SvNV(*(av_fetch(av,0,0))); + draw_info->affine.rx=(double) SvNV(*(av_fetch(av,1,0))); + draw_info->affine.ry=(double) SvNV(*(av_fetch(av,2,0))); + draw_info->affine.sy=(double) SvNV(*(av_fetch(av,3,0))); + if (fabs(draw_info->affine.sx*draw_info->affine.sy- + draw_info->affine.rx*draw_info->affine.ry) < MagickEpsilon) + { + ThrowPerlException(exception,OptionError, + "affine matrix is singular",PackageName); + goto PerlException; + } + if (av_len(av) == 5) + { + draw_info->affine.tx=(double) SvNV(*(av_fetch(av,4,0))); + draw_info->affine.ty=(double) SvNV(*(av_fetch(av,5,0))); + } + } + for (j=12; j < 17; j++) + { + if (attribute_flag[j] == 0) + continue; + value=argument_list[j].string_reference; + angle=argument_list[j].real_reference; + current=draw_info->affine; + GetAffineMatrix(&affine); + switch (j) + { + case 12: + { + /* + Translate. + */ + flags=ParseGeometry(value,&geometry_info); + affine.tx=geometry_info.xi; + affine.ty=geometry_info.psi; + if ((flags & PsiValue) == 0) + affine.ty=affine.tx; + break; + } + case 13: + { + /* + Scale. + */ + flags=ParseGeometry(value,&geometry_info); + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.sy=affine.sx; + break; + } + case 14: + { + /* + Rotate. + */ + if (angle == 0.0) + break; + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 15: + { + /* + SkewX. + */ + affine.ry=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 16: + { + /* + SkewY. + */ + affine.rx=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + } + draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + draw_info->affine.tx=current.sx*affine.tx+current.ry*affine.ty+ + current.tx; + draw_info->affine.ty=current.rx*affine.tx+current.sy*affine.ty+ + current.ty; + } + if (attribute_flag[9] == 0) + argument_list[9].real_reference=0.0; + if (attribute_flag[10] == 0) + argument_list[10].real_reference=0.0; + if ((attribute_flag[9] != 0) || (attribute_flag[10] != 0)) + { + char + geometry[MaxTextExtent]; + + (void) FormatLocaleString(geometry,MaxTextExtent,"%+f%+f", + (double) argument_list[9].real_reference+draw_info->affine.tx, + (double) argument_list[10].real_reference+draw_info->affine.ty); + (void) CloneString(&draw_info->geometry,geometry); + } + if (attribute_flag[17] != 0) + draw_info->stroke_width=argument_list[17].real_reference; + if (attribute_flag[18] != 0) + { + draw_info->text_antialias=argument_list[18].integer_reference != 0 ? + MagickTrue : MagickFalse; + draw_info->stroke_antialias=draw_info->text_antialias; + } + if (attribute_flag[19] != 0) + (void) CloneString(&draw_info->family, + argument_list[19].string_reference); + if (attribute_flag[20] != 0) + draw_info->style=(StyleType) argument_list[20].integer_reference; + if (attribute_flag[21] != 0) + draw_info->stretch=(StretchType) argument_list[21].integer_reference; + if (attribute_flag[22] != 0) + draw_info->weight=argument_list[22].integer_reference; + if (attribute_flag[23] != 0) + draw_info->align=(AlignType) argument_list[23].integer_reference; + if (attribute_flag[24] != 0) + (void) CloneString(&draw_info->encoding, + argument_list[24].string_reference); + if (attribute_flag[25] != 0) + draw_info->fill_pattern=CloneImage( + argument_list[25].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[26] != 0) + draw_info->fill_pattern=CloneImage( + argument_list[26].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[27] != 0) + draw_info->stroke_pattern=CloneImage( + argument_list[27].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[29] != 0) + draw_info->kerning=argument_list[29].real_reference; + if (attribute_flag[30] != 0) + draw_info->interline_spacing=argument_list[30].real_reference; + if (attribute_flag[31] != 0) + draw_info->interword_spacing=argument_list[31].real_reference; + if (attribute_flag[32] != 0) + draw_info->direction=(DirectionType) + argument_list[32].integer_reference; + if (attribute_flag[33] != 0) + draw_info->decorate=(DecorationType) + argument_list[33].integer_reference; + (void) AnnotateImage(image,draw_info); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 34: /* ColorFloodfill */ + { + DrawInfo + *draw_info; + + MagickBooleanType + invert; + + MagickPixelPacket + target; + + draw_info=CloneDrawInfo(info ? info->image_info : + (ImageInfo *) NULL,(DrawInfo *) NULL); + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.x=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.y=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + (void) QueryColorDatabase(argument_list[3].string_reference, + &draw_info->fill,exception); + (void) GetOneVirtualMagickPixel(image,geometry.x,geometry.y,&target, + exception); + invert=MagickFalse; + if (attribute_flag[4] != 0) + { + QueryMagickColor(argument_list[4].string_reference,&target, + exception); + invert=MagickTrue; + } + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[6] != 0) + invert=(MagickBooleanType) argument_list[6].integer_reference; + (void) FloodfillPaintImage(image,DefaultChannels,draw_info,&target, + geometry.x,geometry.y,invert); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 35: /* Composite */ + { + char + composite_geometry[MaxTextExtent]; + + Image + *composite_image, + *rotate_image; + + compose=OverCompositeOp; + if (attribute_flag[0] != 0) + composite_image=argument_list[0].image_reference; + else + { + ThrowPerlException(exception,OptionError, + "CompositeImageRequired",PackageName); + goto PerlException; + } + /* + Parameter Handling used for BOTH normal and tiled composition. + */ + if (attribute_flag[1] != 0) /* compose */ + compose=(CompositeOperator) argument_list[1].integer_reference; + if (attribute_flag[6] != 0) /* opacity */ + { + if (compose != DissolveCompositeOp) + (void) SetImageOpacity(composite_image,(Quantum) (QuantumRange- + StringToDoubleInterval(argument_list[6].string_reference, + (double) QuantumRange+1.0))); + else + { + CacheView + *composite_view; + + double + opacity; + + MagickBooleanType + sync; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + y; + + /* + Handle dissolve composite operator. + */ + (void) CloneString(&image->geometry, + argument_list[6].string_reference); + opacity=(Quantum) (QuantumRange-StringToDoubleInterval( + argument_list[6].string_reference,(double) QuantumRange+ + 1.0)); + if (composite_image->matte != MagickTrue) + (void) SetImageOpacity(composite_image,OpaqueOpacity); + composite_view=AcquireAuthenticCacheView(composite_image, + exception); + for (y=0; y < (ssize_t) composite_image->rows ; y++) + { + q=GetCacheViewAuthenticPixels(composite_view,0,y,(ssize_t) + composite_image->columns,1,exception); + for (x=0; x < (ssize_t) composite_image->columns; x++) + { + if (q->opacity == OpaqueOpacity) + q->opacity=ClampToQuantum(opacity); + q++; + } + sync=SyncCacheViewAuthenticPixels(composite_view,exception); + if (sync == MagickFalse) + break; + } + composite_view=DestroyCacheView(composite_view); + } + } + if (attribute_flag[9] != 0) /* "color=>" */ + QueryColorDatabase(argument_list[9].string_reference, + &composite_image->background_color,exception); + if (attribute_flag[12] != 0) /* "interpolate=>" */ + image->interpolate=(InterpolatePixelMethod) + argument_list[12].integer_reference; + if (attribute_flag[13] != 0) /* "args=>" */ + (void) SetImageArtifact(composite_image,"compose:args", + argument_list[13].string_reference); + if (attribute_flag[14] != 0) /* "blend=>" depreciated */ + (void) SetImageArtifact(composite_image,"compose:args", + argument_list[14].string_reference); + /* + Tiling Composition (with orthogonal rotate). + */ + rotate_image=(Image *) NULL; + if (attribute_flag[8] != 0) /* "rotate=>" */ + { + /* + Rotate image. + */ + rotate_image=RotateImage(composite_image, + argument_list[8].real_reference,exception); + if (rotate_image == (Image *) NULL) + break; + } + if ((attribute_flag[7] != 0) && + (argument_list[7].integer_reference != 0)) /* tile */ + { + ssize_t + x, + y; + + /* + Tile the composite image. + */ + if (attribute_flag[8] != 0) /* "tile=>" */ + (void) SetImageArtifact(rotate_image,"compose:outside-overlay", + "false"); + else + (void) SetImageArtifact(composite_image, + "compose:outside-overlay","false"); + for (y=0; y < (ssize_t) image->rows; y+=(ssize_t) composite_image->rows) + for (x=0; x < (ssize_t) image->columns; x+=(ssize_t) composite_image->columns) + { + if (attribute_flag[8] != 0) /* rotate */ + (void) CompositeImage(image,compose,rotate_image,x,y); + else + (void) CompositeImage(image,compose,composite_image,x,y); + } + if (attribute_flag[8] != 0) /* rotate */ + rotate_image=DestroyImage(rotate_image); + break; + } + /* + Parameter Handling used used ONLY for normal composition. + */ + if (attribute_flag[5] != 0) /* gravity */ + image->gravity=(GravityType) argument_list[5].integer_reference; + if (attribute_flag[2] != 0) /* geometry offset */ + { + SetGeometry(image,&geometry); + (void) ParseAbsoluteGeometry(argument_list[2].string_reference, + &geometry); + GravityAdjustGeometry(image->columns,image->rows,image->gravity, + &geometry); + } + if (attribute_flag[3] != 0) /* x offset */ + geometry.x=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) /* y offset */ + geometry.y=argument_list[4].integer_reference; + if (attribute_flag[10] != 0) /* mask */ + { + if ((image->compose == DisplaceCompositeOp) || + (image->compose == DistortCompositeOp)) + { + /* + Merge Y displacement into X displacement image. + */ + composite_image=CloneImage(composite_image,0,0,MagickTrue, + &image->exception); + (void) CompositeImage(composite_image,CopyGreenCompositeOp, + argument_list[10].image_reference,0,0); + } + else + { + /* + Set a blending mask for the composition. + */ + image->mask=CloneImage(argument_list[10].image_reference,0,0, + MagickTrue,&image->exception); + (void) NegateImage(image->mask,MagickFalse); + } + } + if (attribute_flag[11] != 0) /* channel */ + channel=(ChannelType) argument_list[11].integer_reference; + /* + Composite two images (normal composition). + */ + (void) FormatLocaleString(composite_geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) composite_image->columns, + (double) composite_image->rows,(double) geometry.x,(double) + geometry.y); + flags=ParseGravityGeometry(image,composite_geometry,&geometry, + exception); + if (attribute_flag[8] == 0) /* no rotate */ + CompositeImageChannel(image,channel,compose,composite_image, + geometry.x,geometry.y); + else + { + /* + Position adjust rotated image then composite. + */ + geometry.x-=(ssize_t) (rotate_image->columns- + composite_image->columns)/2; + geometry.y-=(ssize_t) (rotate_image->rows- + composite_image->rows)/2; + CompositeImageChannel(image,channel,compose,rotate_image, + geometry.x,geometry.y); + rotate_image=DestroyImage(rotate_image); + } + if (attribute_flag[10] != 0) /* mask */ + { + if ((image->compose == DisplaceCompositeOp) || + (image->compose == DistortCompositeOp)) + composite_image=DestroyImage(composite_image); + else + image->mask=DestroyImage(image->mask); + } + break; + } + case 36: /* Contrast */ + { + if (attribute_flag[0] == 0) + argument_list[0].integer_reference=0; + (void) ContrastImage(image,argument_list[0].integer_reference != 0 ? + MagickTrue : MagickFalse); + break; + } + case 37: /* CycleColormap */ + { + if (attribute_flag[0] == 0) + argument_list[0].integer_reference=6; + (void) CycleColormapImage(image,argument_list[0].integer_reference); + break; + } + case 38: /* Draw */ + { + DrawInfo + *draw_info; + + draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL, + (DrawInfo *) NULL); + (void) CloneString(&draw_info->primitive,"point"); + if (attribute_flag[0] != 0) + { + if (argument_list[0].integer_reference < 0) + (void) CloneString(&draw_info->primitive, + argument_list[0].string_reference); + else + (void) CloneString(&draw_info->primitive,CommandOptionToMnemonic( + MagickPrimitiveOptions,argument_list[0].integer_reference)); + } + if (attribute_flag[1] != 0) + { + if (LocaleCompare(draw_info->primitive,"path") == 0) + { + (void) ConcatenateString(&draw_info->primitive," '"); + ConcatenateString(&draw_info->primitive, + argument_list[1].string_reference); + (void) ConcatenateString(&draw_info->primitive,"'"); + } + else + { + (void) ConcatenateString(&draw_info->primitive," "); + ConcatenateString(&draw_info->primitive, + argument_list[1].string_reference); + } + } + if (attribute_flag[2] != 0) + { + (void) ConcatenateString(&draw_info->primitive," "); + (void) ConcatenateString(&draw_info->primitive, + CommandOptionToMnemonic(MagickMethodOptions, + argument_list[2].integer_reference)); + } + if (attribute_flag[3] != 0) + { + (void) QueryColorDatabase(argument_list[3].string_reference, + &draw_info->stroke,exception); + if (argument_list[3].image_reference != (Image *) NULL) + draw_info->stroke_pattern=CloneImage( + argument_list[3].image_reference,0,0,MagickTrue,exception); + } + if (attribute_flag[4] != 0) + { + (void) QueryColorDatabase(argument_list[4].string_reference, + &draw_info->fill,exception); + if (argument_list[4].image_reference != (Image *) NULL) + draw_info->fill_pattern=CloneImage( + argument_list[4].image_reference,0,0,MagickTrue,exception); + } + if (attribute_flag[5] != 0) + draw_info->stroke_width=argument_list[5].real_reference; + if (attribute_flag[6] != 0) + (void) CloneString(&draw_info->font, + argument_list[6].string_reference); + if (attribute_flag[7] != 0) + (void) QueryColorDatabase(argument_list[7].string_reference, + &draw_info->border_color,exception); + if (attribute_flag[8] != 0) + draw_info->affine.tx=argument_list[8].real_reference; + if (attribute_flag[9] != 0) + draw_info->affine.ty=argument_list[9].real_reference; + if (attribute_flag[20] != 0) + { + AV + *av; + + av=(AV *) argument_list[20].array_reference; + if ((av_len(av) != 3) && (av_len(av) != 5)) + { + ThrowPerlException(exception,OptionError, + "affine matrix must have 4 or 6 elements",PackageName); + goto PerlException; + } + draw_info->affine.sx=(double) SvNV(*(av_fetch(av,0,0))); + draw_info->affine.rx=(double) SvNV(*(av_fetch(av,1,0))); + draw_info->affine.ry=(double) SvNV(*(av_fetch(av,2,0))); + draw_info->affine.sy=(double) SvNV(*(av_fetch(av,3,0))); + if (fabs(draw_info->affine.sx*draw_info->affine.sy- + draw_info->affine.rx*draw_info->affine.ry) < MagickEpsilon) + { + ThrowPerlException(exception,OptionError, + "affine matrix is singular",PackageName); + goto PerlException; + } + if (av_len(av) == 5) + { + draw_info->affine.tx=(double) SvNV(*(av_fetch(av,4,0))); + draw_info->affine.ty=(double) SvNV(*(av_fetch(av,5,0))); + } + } + for (j=10; j < 15; j++) + { + if (attribute_flag[j] == 0) + continue; + value=argument_list[j].string_reference; + angle=argument_list[j].real_reference; + current=draw_info->affine; + GetAffineMatrix(&affine); + switch (j) + { + case 10: + { + /* + Translate. + */ + flags=ParseGeometry(value,&geometry_info); + affine.tx=geometry_info.xi; + affine.ty=geometry_info.psi; + if ((flags & PsiValue) == 0) + affine.ty=affine.tx; + break; + } + case 11: + { + /* + Scale. + */ + flags=ParseGeometry(value,&geometry_info); + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.sy=affine.sx; + break; + } + case 12: + { + /* + Rotate. + */ + if (angle == 0.0) + break; + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 13: + { + /* + SkewX. + */ + affine.ry=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 14: + { + /* + SkewY. + */ + affine.rx=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + } + draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + draw_info->affine.tx= + current.sx*affine.tx+current.ry*affine.ty+current.tx; + draw_info->affine.ty= + current.rx*affine.tx+current.sy*affine.ty+current.ty; + } + if (attribute_flag[15] != 0) + draw_info->fill_pattern=CloneImage( + argument_list[15].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[16] != 0) + draw_info->pointsize=argument_list[16].real_reference; + if (attribute_flag[17] != 0) + { + draw_info->stroke_antialias=argument_list[17].integer_reference != 0 + ? MagickTrue : MagickFalse; + draw_info->text_antialias=draw_info->stroke_antialias; + } + if (attribute_flag[18] != 0) + (void) CloneString(&draw_info->density, + argument_list[18].string_reference); + if (attribute_flag[19] != 0) + draw_info->stroke_width=argument_list[19].real_reference; + if (attribute_flag[21] != 0) + draw_info->dash_offset=argument_list[21].real_reference; + if (attribute_flag[22] != 0) + { + AV + *av; + + av=(AV *) argument_list[22].array_reference; + draw_info->dash_pattern=(double *) AcquireQuantumMemory( + av_len(av)+2UL,sizeof(*draw_info->dash_pattern)); + if (draw_info->dash_pattern != (double *) NULL) + { + for (i=0; i <= av_len(av); i++) + draw_info->dash_pattern[i]=(double) + SvNV(*(av_fetch(av,i,0))); + draw_info->dash_pattern[i]=0.0; + } + } + if (attribute_flag[23] != 0) + image->interpolate=(InterpolatePixelMethod) + argument_list[23].integer_reference; + if ((attribute_flag[24] != 0) && + (draw_info->fill_pattern != (Image *) NULL)) + flags=ParsePageGeometry(draw_info->fill_pattern, + argument_list[24].string_reference, + &draw_info->fill_pattern->tile_offset,exception); + if (attribute_flag[25] != 0) + { + (void) ConcatenateString(&draw_info->primitive," '"); + (void) ConcatenateString(&draw_info->primitive, + argument_list[25].string_reference); + (void) ConcatenateString(&draw_info->primitive,"'"); + } + if (attribute_flag[26] != 0) + draw_info->fill_pattern=CloneImage( + argument_list[26].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[27] != 0) + draw_info->stroke_pattern=CloneImage( + argument_list[27].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[28] != 0) + (void) CloneString(&draw_info->primitive, + argument_list[28].string_reference); + if (attribute_flag[29] != 0) + draw_info->kerning=argument_list[29].real_reference; + if (attribute_flag[30] != 0) + draw_info->interline_spacing=argument_list[30].real_reference; + if (attribute_flag[31] != 0) + draw_info->interword_spacing=argument_list[31].real_reference; + if (attribute_flag[32] != 0) + draw_info->direction=(DirectionType) + argument_list[32].integer_reference; + DrawImage(image,draw_info); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 39: /* Equalize */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + EqualizeImageChannel(image,channel); + break; + } + case 40: /* Gamma */ + { + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + if (attribute_flag[2] == 0) + argument_list[2].real_reference=1.0; + if (attribute_flag[3] == 0) + argument_list[3].real_reference=1.0; + if (attribute_flag[4] == 0) + argument_list[4].real_reference=1.0; + if (attribute_flag[0] == 0) + { + (void) FormatLocaleString(message,MaxTextExtent, + "%.20g,%.15g,%.15g",(double) argument_list[2].real_reference, + (double) argument_list[3].real_reference, + (double) argument_list[4].real_reference); + argument_list[0].string_reference=message; + } + if (strchr(argument_list[0].string_reference,',') != (char *) NULL) + (void) GammaImage(image,argument_list[0].string_reference); + else + (void) GammaImageChannel(image,channel,StringToDouble( + argument_list[0].string_reference,(char **) NULL)); + break; + } + case 41: /* Map */ + { + QuantizeInfo + *quantize_info; + + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"MapImageRequired", + PackageName); + goto PerlException; + } + quantize_info=AcquireQuantizeInfo(info->image_info); + if (attribute_flag[1] != 0) + quantize_info->dither=(MagickBooleanType) + argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + quantize_info->dither_method=(DitherMethod) + argument_list[2].integer_reference; + (void) RemapImages(quantize_info,image, + argument_list[0].image_reference); + quantize_info=DestroyQuantizeInfo(quantize_info); + break; + } + case 42: /* MatteFloodfill */ + { + DrawInfo + *draw_info; + + MagickBooleanType + invert; + + MagickPixelPacket + target; + + draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL, + (DrawInfo *) NULL); + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.x=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.y=argument_list[2].integer_reference; + if (image->matte == MagickFalse) + (void) SetImageOpacity(image,OpaqueOpacity); + (void) GetOneVirtualMagickPixel(image,geometry.x,geometry.y,&target, + exception); + if (attribute_flag[4] != 0) + QueryMagickColor(argument_list[4].string_reference,&target, + exception); + if (attribute_flag[3] != 0) + target.opacity=StringToDoubleInterval( + argument_list[3].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + invert=MagickFalse; + if (attribute_flag[6] != 0) + invert=(MagickBooleanType) argument_list[6].integer_reference; + (void) FloodfillPaintImage(image,OpacityChannel,draw_info,&target, + geometry.x,geometry.y,invert); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 43: /* Modulate */ + { + char + modulate[MaxTextExtent]; + + geometry_info.rho=100.0; + geometry_info.sigma=100.0; + geometry_info.xi=100.0; + if (attribute_flag[0] != 0) + (void)ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if (attribute_flag[1] != 0) + geometry_info.xi=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + { + geometry_info.sigma=argument_list[3].real_reference; + SetImageArtifact(image,"modulate:colorspace","HWB"); + } + if (attribute_flag[4] != 0) + { + geometry_info.rho=argument_list[4].real_reference; + SetImageArtifact(image,"modulate:colorspace","HSB"); + } + if (attribute_flag[5] != 0) + { + geometry_info.sigma=argument_list[5].real_reference; + SetImageArtifact(image,"modulate:colorspace","HSL"); + } + if (attribute_flag[6] != 0) + { + geometry_info.rho=argument_list[6].real_reference; + SetImageArtifact(image,"modulate:colorspace","HWB"); + } + (void) FormatLocaleString(modulate,MaxTextExtent,"%.20g,%.15g,%.15g", + geometry_info.rho,geometry_info.sigma,geometry_info.xi); + (void) ModulateImage(image,modulate); + break; + } + case 44: /* Negate */ + { + if (attribute_flag[0] == 0) + argument_list[0].integer_reference=0; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + (void) NegateImageChannel(image,channel, + argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse); + break; + } + case 45: /* Normalize */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + NormalizeImageChannel(image,channel); + break; + } + case 46: /* NumberColors */ + break; + case 47: /* Opaque */ + { + MagickBooleanType + invert; + + MagickPixelPacket + fill_color, + target; + + (void) QueryMagickColor("none",&target,exception); + (void) QueryMagickColor("none",&fill_color,exception); + if (attribute_flag[0] != 0) + (void) QueryMagickColor(argument_list[0].string_reference, + &target,exception); + if (attribute_flag[1] != 0) + (void) QueryMagickColor(argument_list[1].string_reference, + &fill_color,exception); + if (attribute_flag[2] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[2].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + invert=MagickFalse; + if (attribute_flag[4] != 0) + invert=(MagickBooleanType) argument_list[4].integer_reference; + (void) OpaquePaintImageChannel(image,channel,&target,&fill_color, + invert); + break; + } + case 48: /* Quantize */ + { + QuantizeInfo + *quantize_info; + + quantize_info=AcquireQuantizeInfo(info->image_info); + if (attribute_flag[0] != 0) + quantize_info->number_colors=(size_t) + argument_list[0].integer_reference; + if (attribute_flag[1] != 0) + quantize_info->tree_depth=(size_t) + argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + quantize_info->colorspace=(ColorspaceType) + argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + quantize_info->dither=argument_list[3].integer_reference != 0 ? + MagickTrue : MagickFalse; + if (attribute_flag[4] != 0) + quantize_info->measure_error= + argument_list[4].integer_reference != 0 ? MagickTrue : MagickFalse; + if (attribute_flag[6] != 0) + (void) QueryColorDatabase(argument_list[6].string_reference, + &image->transparent_color,exception); + if (attribute_flag[7] != 0) + quantize_info->dither_method=(DitherMethod) + argument_list[7].integer_reference; + if (attribute_flag[5] && argument_list[5].integer_reference) + (void) QuantizeImages(quantize_info,image); + else if ((image->storage_class == DirectClass) || + (image->colors > quantize_info->number_colors) || + (quantize_info->colorspace == GRAYColorspace)) + (void) QuantizeImage(quantize_info,image); + else + CompressImageColormap(image); + quantize_info=DestroyQuantizeInfo(quantize_info); + break; + } + case 49: /* Raise */ + { + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] == 0) + argument_list[3].integer_reference=1; + (void) RaiseImage(image,&geometry,argument_list[3].integer_reference != + 0 ? MagickTrue : MagickFalse); + break; + } + case 50: /* Segment */ + { + ColorspaceType + colorspace; + + double + cluster_threshold, + smoothing_threshold; + + MagickBooleanType + verbose; + + cluster_threshold=1.0; + smoothing_threshold=1.5; + colorspace=sRGBColorspace; + verbose=MagickFalse; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + cluster_threshold=geometry_info.rho; + if (flags & SigmaValue) + smoothing_threshold=geometry_info.sigma; + } + if (attribute_flag[1] != 0) + cluster_threshold=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + smoothing_threshold=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + colorspace=(ColorspaceType) argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + verbose=argument_list[4].integer_reference != 0 ? + MagickTrue : MagickFalse; + (void) SegmentImage(image,colorspace,verbose,cluster_threshold, + smoothing_threshold); + break; + } + case 51: /* Signature */ + { + (void) SignatureImage(image); + break; + } + case 52: /* Solarize */ + { + geometry_info.rho=QuantumRange/2.0; + if (attribute_flag[0] != 0) + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if (attribute_flag[1] != 0) + geometry_info.rho=StringToDoubleInterval( + argument_list[1].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[2] != 0) + channel=(ChannelType) argument_list[2].integer_reference; + (void) SolarizeImageChannel(image,channel,geometry_info.rho, + exception); + break; + } + case 53: /* Sync */ + { + (void) SyncImage(image); + break; + } + case 54: /* Texture */ + { + if (attribute_flag[0] == 0) + break; + TextureImage(image,argument_list[0].image_reference); + break; + } + case 55: /* Evalute */ + { + MagickEvaluateOperator + op; + + op=SetEvaluateOperator; + if (attribute_flag[0] == MagickFalse) + argument_list[0].real_reference=0.0; + if (attribute_flag[1] != MagickFalse) + op=(MagickEvaluateOperator) argument_list[1].integer_reference; + if (attribute_flag[2] != MagickFalse) + channel=(ChannelType) argument_list[2].integer_reference; + (void) EvaluateImageChannel(image,channel,op, + argument_list[0].real_reference,exception); + break; + } + case 56: /* Transparent */ + { + double + opacity; + + MagickBooleanType + invert; + + MagickPixelPacket + target; + + (void) QueryMagickColor("none",&target,exception); + if (attribute_flag[0] != 0) + (void) QueryMagickColor(argument_list[0].string_reference,&target, + exception); + opacity=TransparentOpacity; + if (attribute_flag[1] != 0) + opacity=StringToDoubleInterval(argument_list[1].string_reference, + (double) QuantumRange+1.0); + if (attribute_flag[2] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[2].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[3] == 0) + argument_list[3].integer_reference=0; + invert=MagickFalse; + if (attribute_flag[3] != 0) + invert=(MagickBooleanType) argument_list[3].integer_reference; + (void) TransparentPaintImage(image,&target,ClampToQuantum(opacity), + invert); + break; + } + case 57: /* Threshold */ + { + double + threshold; + + if (attribute_flag[0] == 0) + argument_list[0].string_reference="50%"; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + threshold=StringToDoubleInterval(argument_list[0].string_reference, + (double) QuantumRange+1.0); + (void) BilevelImageChannel(image,channel,threshold); + break; + } + case 58: /* Charcoal */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + image=CharcoalImage(image,geometry_info.rho,geometry_info.sigma, + exception); + break; + } + case 59: /* Trim */ + { + if (attribute_flag[0] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[0].string_reference,(double) QuantumRange+1.0); + image=TrimImage(image,exception); + break; + } + case 60: /* Wave */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + image->interpolate=(InterpolatePixelMethod) + argument_list[3].integer_reference; + image=WaveImage(image,geometry_info.rho,geometry_info.sigma, + exception); + break; + } + case 61: /* Separate */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + (void) SeparateImageChannel(image,channel); + break; + } + case 63: /* Stereo */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"StereoImageRequired", + PackageName); + goto PerlException; + } + if (attribute_flag[1] != 0) + geometry.x=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.y=argument_list[2].integer_reference; + image=StereoAnaglyphImage(image,argument_list[0].image_reference, + geometry.x,geometry.y,exception); + break; + } + case 64: /* Stegano */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"SteganoImageRequired", + PackageName); + goto PerlException; + } + if (attribute_flag[1] == 0) + argument_list[1].integer_reference=0; + image->offset=argument_list[1].integer_reference; + image=SteganoImage(image,argument_list[0].image_reference,exception); + break; + } + case 65: /* Deconstruct */ + { + image=DeconstructImages(image,exception); + break; + } + case 66: /* GaussianBlur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=GaussianBlurImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 67: /* Convolve */ + { + AV + *av; + + double + *kernel; + + size_t + order; + + if (attribute_flag[0] == 0) + break; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + image->bias=StringToDoubleInterval( + argument_list[2].string_reference,(double) QuantumRange+1.0); + av=(AV *) argument_list[0].array_reference; + order=(size_t) sqrt(av_len(av)+1); + kernel=(double *) AcquireQuantumMemory(order,order*sizeof(*kernel)); + if (kernel == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; (j < (ssize_t) (order*order)) && (j < (av_len(av)+1)); j++) + kernel[j]=(double) SvNV(*(av_fetch(av,j,0))); + for ( ; j < (ssize_t) (order*order); j++) + kernel[j]=0.0; + image=ConvolveImageChannel(image,channel,order,kernel,exception); + kernel=(double *) RelinquishMagickMemory(kernel); + break; + } + case 68: /* Profile */ + { + const char + *name; + + Image + *profile_image; + + ImageInfo + *profile_info; + + StringInfo + *profile; + + name="*"; + if (attribute_flag[0] != 0) + name=argument_list[0].string_reference; + if (attribute_flag[2] != 0) + image->rendering_intent=(RenderingIntent) + argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + image->black_point_compensation= + argument_list[3].integer_reference != 0 ? MagickTrue : MagickFalse; + if (attribute_flag[1] != 0) + { + if (argument_list[1].length == 0) + { + /* + Remove a profile from the image. + */ + (void) ProfileImage(image,name,(const unsigned char *) NULL,0, + MagickTrue); + break; + } + /* + Associate user supplied profile with the image. + */ + profile=AcquireStringInfo(argument_list[1].length); + SetStringInfoDatum(profile,(const unsigned char *) + argument_list[1].string_reference); + (void) ProfileImage(image,name,GetStringInfoDatum(profile), + (size_t) GetStringInfoLength(profile),MagickFalse); + profile=DestroyStringInfo(profile); + break; + } + /* + Associate a profile with the image. + */ + profile_info= + CloneImageInfo(info ? info->image_info : (ImageInfo *) NULL); + (void) CopyMagickString(profile_info->filename,name,MaxTextExtent); + profile_image=ReadImages(profile_info,&image->exception); + if (profile_image == (Image *) NULL) + break; + ResetImageProfileIterator(profile_image); + name=GetNextImageProfile(profile_image); + while (name != (const char *) NULL) + { + const StringInfo + *profile; + + profile=GetImageProfile(profile_image,name); + if (profile != (const StringInfo *) NULL) + (void) ProfileImage(image,name,GetStringInfoDatum(profile), + (size_t) GetStringInfoLength(profile),MagickFalse); + name=GetNextImageProfile(profile_image); + } + profile_image=DestroyImage(profile_image); + profile_info=DestroyImageInfo(profile_info); + break; + } + case 69: /* UnsharpMask */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=1.0; + if ((flags & PsiValue) == 0) + geometry_info.psi=0.5; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].real_reference; + if (attribute_flag[4] != 0) + geometry_info.psi=argument_list[4].real_reference; + if (attribute_flag[5] != 0) + channel=(ChannelType) argument_list[5].integer_reference; + image=UnsharpMaskImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception); + break; + } + case 70: /* MotionBlur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].real_reference; + if (attribute_flag[4] != 0) + channel=(ChannelType) argument_list[4].integer_reference; + image=MotionBlurImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,geometry_info.xi,exception); + break; + } + case 71: /* OrderedDither */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference="o8x8"; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + (void) OrderedPosterizeImageChannel(image,channel, + argument_list[0].string_reference,exception); + break; + } + case 72: /* Shave */ + { + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + image=ShaveImage(image,&geometry,exception); + break; + } + case 73: /* Level */ + { + double + black_point, + gamma, + white_point; + + black_point=0.0; + white_point=(MagickRealType) image->columns*image->rows; + gamma=1.0; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + black_point=geometry_info.rho; + if ((flags & SigmaValue) != 0) + white_point=geometry_info.sigma; + if ((flags & XiValue) != 0) + gamma=geometry_info.xi; + if ((flags & PercentValue) != 0) + { + black_point*=(double) (QuantumRange/100.0); + white_point*=(double) (QuantumRange/100.0); + } + if ((flags & SigmaValue) == 0) + white_point=(double) QuantumRange-black_point; + } + if (attribute_flag[1] != 0) + black_point=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + white_point=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + gamma=argument_list[3].real_reference; + if (attribute_flag[4] != 0) + channel=(ChannelType) argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + { + argument_list[0].real_reference=argument_list[5].real_reference; + attribute_flag[0]=attribute_flag[5]; + } + (void) LevelImageChannel(image,channel,black_point,white_point,gamma); + break; + } + case 74: /* Clip */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference="#1"; + if (attribute_flag[1] == 0) + argument_list[1].integer_reference=MagickTrue; + (void) ClipImagePath(image,argument_list[0].string_reference, + argument_list[1].integer_reference != 0 ? MagickTrue : MagickFalse); + break; + } + case 75: /* AffineTransform */ + { + DrawInfo + *draw_info; + + draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL, + (DrawInfo *) NULL); + if (attribute_flag[0] != 0) + { + AV + *av; + + av=(AV *) argument_list[0].array_reference; + if ((av_len(av) != 3) && (av_len(av) != 5)) + { + ThrowPerlException(exception,OptionError, + "affine matrix must have 4 or 6 elements",PackageName); + goto PerlException; + } + draw_info->affine.sx=(double) SvNV(*(av_fetch(av,0,0))); + draw_info->affine.rx=(double) SvNV(*(av_fetch(av,1,0))); + draw_info->affine.ry=(double) SvNV(*(av_fetch(av,2,0))); + draw_info->affine.sy=(double) SvNV(*(av_fetch(av,3,0))); + if (fabs(draw_info->affine.sx*draw_info->affine.sy- + draw_info->affine.rx*draw_info->affine.ry) < MagickEpsilon) + { + ThrowPerlException(exception,OptionError, + "affine matrix is singular",PackageName); + goto PerlException; + } + if (av_len(av) == 5) + { + draw_info->affine.tx=(double) SvNV(*(av_fetch(av,4,0))); + draw_info->affine.ty=(double) SvNV(*(av_fetch(av,5,0))); + } + } + for (j=1; j < 6; j++) + { + if (attribute_flag[j] == 0) + continue; + value=argument_list[j].string_reference; + angle=argument_list[j].real_reference; + current=draw_info->affine; + GetAffineMatrix(&affine); + switch (j) + { + case 1: + { + /* + Translate. + */ + flags=ParseGeometry(value,&geometry_info); + affine.tx=geometry_info.xi; + affine.ty=geometry_info.psi; + if ((flags & PsiValue) == 0) + affine.ty=affine.tx; + break; + } + case 2: + { + /* + Scale. + */ + flags=ParseGeometry(value,&geometry_info); + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.sy=affine.sx; + break; + } + case 3: + { + /* + Rotate. + */ + if (angle == 0.0) + break; + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 4: + { + /* + SkewX. + */ + affine.ry=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 5: + { + /* + SkewY. + */ + affine.rx=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + } + draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + draw_info->affine.tx= + current.sx*affine.tx+current.ry*affine.ty+current.tx; + draw_info->affine.ty= + current.rx*affine.tx+current.sy*affine.ty+current.ty; + } + if (attribute_flag[6] != 0) + image->interpolate=(InterpolatePixelMethod) + argument_list[6].integer_reference; + if (attribute_flag[7] != 0) + QueryColorDatabase(argument_list[7].string_reference, + &image->background_color,exception); + image=AffineTransformImage(image,&draw_info->affine,exception); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 76: /* Difference */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError, + "ReferenceImageRequired",PackageName); + goto PerlException; + } + if (attribute_flag[1] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[1].string_reference,(double) QuantumRange+1.0); + (void) IsImagesEqual(image,argument_list[0].image_reference); + break; + } + case 77: /* AdaptiveThreshold */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & PercentValue) != 0) + geometry_info.xi=QuantumRange*geometry_info.xi/100.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].integer_reference;; + image=AdaptiveThresholdImage(image,(size_t) geometry_info.rho, + (size_t) geometry_info.sigma,(ssize_t) geometry_info.xi, + exception); + break; + } + case 78: /* Resample */ + { + size_t + height, + width; + + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] == 0) + argument_list[3].integer_reference=(ssize_t) UndefinedFilter; + if (attribute_flag[4] == 0) + SetImageArtifact(image,"filter:support", + argument_list[4].string_reference); + if (attribute_flag[5] != 0) + argument_list[5].real_reference=1.0; + width=(size_t) (geometry_info.rho*image->columns/ + (image->x_resolution == 0.0 ? 72.0 : image->x_resolution)+0.5); + height=(size_t) (geometry_info.sigma*image->rows/ + (image->y_resolution == 0.0 ? 72.0 : image->y_resolution)+0.5); + image=ResizeImage(image,width,height,(FilterTypes) + argument_list[3].integer_reference,argument_list[5].real_reference, + exception); + if (image != (Image *) NULL) + { + image->x_resolution=geometry_info.rho; + image->y_resolution=geometry_info.sigma; + } + break; + } + case 79: /* Describe */ + { + if (attribute_flag[0] == 0) + argument_list[0].file_reference=(FILE *) NULL; + (void) IdentifyImage(image,argument_list[0].file_reference, + MagickTrue); + break; + } + case 80: /* BlackThreshold */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference="50%"; + if (attribute_flag[2] != 0) + channel=(ChannelType) argument_list[2].integer_reference; + BlackThresholdImageChannel(image,channel, + argument_list[0].string_reference,exception); + break; + } + case 81: /* WhiteThreshold */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference="50%"; + if (attribute_flag[2] != 0) + channel=(ChannelType) argument_list[2].integer_reference; + WhiteThresholdImageChannel(image,channel, + argument_list[0].string_reference,exception); + break; + } + case 82: /* RotationalBlur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + channel=(ChannelType) argument_list[2].integer_reference; + image=RotationalBlurImageChannel(image,channel,geometry_info.rho, + exception); + break; + } + case 83: /* Thumbnail */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + image=ThumbnailImage(image,geometry.width,geometry.height,exception); + break; + } + case 84: /* Strip */ + { + (void) StripImage(image); + break; + } + case 85: /* Tint */ + { + PixelPacket + target; + + (void) GetOneVirtualPixel(image,0,0,&target,exception); + if (attribute_flag[0] != 0) + (void) QueryColorDatabase(argument_list[0].string_reference,&target, + exception); + if (attribute_flag[1] == 0) + argument_list[1].string_reference="100"; + image=TintImage(image,argument_list[1].string_reference,target, + exception); + break; + } + case 86: /* Channel */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + (void) SeparateImageChannel(image,channel); + break; + } + case 87: /* Splice */ + { + if (attribute_flag[7] != 0) + image->gravity=(GravityType) argument_list[7].integer_reference; + if (attribute_flag[0] != 0) + flags=ParseGravityGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry.x=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry.y=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[6] != 0) + (void) QueryColorDatabase(argument_list[6].string_reference, + &image->background_color,exception); + image=SpliceImage(image,&geometry,exception); + break; + } + case 88: /* Posterize */ + { + if (attribute_flag[0] == 0) + argument_list[0].integer_reference=3; + if (attribute_flag[1] == 0) + argument_list[1].integer_reference=0; + (void) PosterizeImage(image,argument_list[0].integer_reference, + argument_list[1].integer_reference ? MagickTrue : MagickFalse); + break; + } + case 89: /* Shadow */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=4.0; + if ((flags & PsiValue) == 0) + geometry_info.psi=4.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry_info.psi=argument_list[4].integer_reference; + image=ShadowImage(image,geometry_info.rho,geometry_info.sigma, + (ssize_t) ceil(geometry_info.xi-0.5),(ssize_t) ceil(geometry_info.psi- + 0.5),exception); + break; + } + case 90: /* Identify */ + { + if (attribute_flag[0] == 0) + argument_list[0].file_reference=(FILE *) NULL; + if (attribute_flag[1] != 0) + (void) SetImageArtifact(image,"identify:features", + argument_list[1].string_reference); + if ((attribute_flag[2] != 0) && + (argument_list[2].integer_reference != 0)) + (void) SetImageArtifact(image,"identify:moments","true"); + if ((attribute_flag[3] != 0) && + (argument_list[3].integer_reference != 0)) + (void) SetImageArtifact(image,"identify:unique","true"); + (void) IdentifyImage(image,argument_list[0].file_reference, + MagickTrue); + break; + } + case 91: /* SepiaTone */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=80.0*QuantumRange/100.0; + image=SepiaToneImage(image,argument_list[0].real_reference, + exception); + break; + } + case 92: /* SigmoidalContrast */ + { + MagickBooleanType + sharpen; + + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=QuantumRange/2.0; + if ((flags & PercentValue) != 0) + geometry_info.sigma=QuantumRange*geometry_info.sigma/100.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + sharpen=MagickTrue; + if (attribute_flag[4] != 0) + sharpen=argument_list[4].integer_reference != 0 ? MagickTrue : + MagickFalse; + (void) SigmoidalContrastImageChannel(image,channel,sharpen, + geometry_info.rho,geometry_info.sigma); + break; + } + case 93: /* Extent */ + { + if (attribute_flag[7] != 0) + image->gravity=(GravityType) argument_list[7].integer_reference; + if (attribute_flag[0] != 0) + { + int + flags; + + flags=ParseGravityGeometry(image, + argument_list[0].string_reference,&geometry,exception); + (void) flags; + if (geometry.width == 0) + geometry.width=image->columns; + if (geometry.height == 0) + geometry.height=image->rows; + } + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry.x=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry.y=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[6] != 0) + (void) QueryColorDatabase(argument_list[6].string_reference, + &image->background_color,exception); + image=ExtentImage(image,&geometry,exception); + break; + } + case 94: /* Vignette */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=0.1*image->columns; + if ((flags & PsiValue) == 0) + geometry_info.psi=0.1*image->rows; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry_info.psi=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + (void) QueryColorDatabase(argument_list[5].string_reference, + &image->background_color,exception); + image=VignetteImage(image,geometry_info.rho,geometry_info.sigma, + (ssize_t) ceil(geometry_info.xi-0.5),(ssize_t) ceil(geometry_info.psi- + 0.5),exception); + break; + } + case 95: /* ContrastStretch */ + { + double + black_point, + white_point; + + black_point=0.0; + white_point=(MagickRealType) image->columns*image->rows; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + black_point=geometry_info.rho; + white_point=(flags & SigmaValue) != 0 ? geometry_info.sigma : + black_point; + if ((flags & PercentValue) != 0) + { + black_point*=(double) image->columns*image->rows/100.0; + white_point*=(double) image->columns*image->rows/100.0; + } + white_point=(MagickRealType) image->columns*image->rows- + white_point; + } + if (attribute_flag[1] != 0) + black_point=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + white_point=argument_list[2].real_reference; + if (attribute_flag[4] != 0) + channel=(ChannelType) argument_list[4].integer_reference; + (void) ContrastStretchImageChannel(image,channel,black_point, + white_point); + break; + } + case 96: /* Sans0 */ + { + break; + } + case 97: /* Sans1 */ + { + break; + } + case 98: /* AdaptiveSharpen */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=AdaptiveSharpenImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 99: /* Transpose */ + { + image=TransposeImage(image,exception); + break; + } + case 100: /* Tranverse */ + { + image=TransverseImage(image,exception); + break; + } + case 101: /* AutoOrient */ + { + image=AutoOrientImage(image,image->orientation,exception); + break; + } + case 102: /* AdaptiveBlur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=AdaptiveBlurImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 103: /* Sketch */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].real_reference; + image=SketchImage(image,geometry_info.rho,geometry_info.sigma, + geometry_info.xi,exception); + break; + } + case 104: /* UniqueColors */ + { + image=UniqueImageColors(image,exception); + break; + } + case 105: /* AdaptiveResize */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + image->filter=(FilterTypes) argument_list[4].integer_reference; + if (attribute_flag[4] != 0) + SetImageArtifact(image,"filter:support", + argument_list[4].string_reference); + if (attribute_flag[5] != 0) + image->blur=argument_list[5].real_reference; + image=AdaptiveResizeImage(image,geometry.width,geometry.height, + exception); + break; + } + case 106: /* ClipMask */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"MaskImageRequired", + PackageName); + goto PerlException; + } + image->clip_mask=CloneImage(argument_list[0].image_reference,0,0, + MagickTrue,exception); + (void) NegateImage(image->clip_mask,MagickFalse); + break; + } + case 107: /* LinearStretch */ + { + double + black_point, + white_point; + + black_point=0.0; + white_point=(MagickRealType) image->columns*image->rows; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) != 0) + white_point=geometry_info.sigma; + if ((flags & PercentValue) != 0) + { + black_point*=(double) image->columns*image->rows/100.0; + white_point*=(double) image->columns*image->rows/100.0; + } + if ((flags & SigmaValue) == 0) + white_point=(double) image->columns*image->rows-black_point; + } + if (attribute_flag[1] != 0) + black_point=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + white_point=argument_list[2].real_reference; + (void) LinearStretchImage(image,black_point,white_point); + break; + } + case 109: /* Mask */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"MaskImageRequired", + PackageName); + goto PerlException; + } + image->mask=CloneImage(argument_list[0].image_reference,0,0, + MagickTrue,exception); + (void) NegateImage(image->mask,MagickFalse); + break; + } + case 110: /* Polaroid */ + { + DrawInfo + *draw_info; + + double + angle; + + draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL, + (DrawInfo *) NULL); + if (attribute_flag[0] != 0) + (void) SetImageProperty(image,"caption",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,image, + argument_list[0].string_reference)); + angle=0.0; + if (attribute_flag[1] != 0) + angle=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + (void) CloneString(&draw_info->font, + argument_list[2].string_reference); + if (attribute_flag[3] != 0) + (void) QueryColorDatabase(argument_list[3].string_reference, + &draw_info->stroke,exception); + if (attribute_flag[4] != 0) + (void) QueryColorDatabase(argument_list[4].string_reference, + &draw_info->fill,exception); + if (attribute_flag[5] != 0) + draw_info->stroke_width=argument_list[5].real_reference; + if (attribute_flag[6] != 0) + draw_info->pointsize=argument_list[6].real_reference; + if (attribute_flag[7] != 0) + draw_info->gravity=(GravityType) argument_list[7].integer_reference; + if (attribute_flag[8] != 0) + (void) QueryColorDatabase(argument_list[8].string_reference, + &image->background_color,exception); + image=PolaroidImage(image,draw_info,angle,exception); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 111: /* FloodfillPaint */ + { + DrawInfo + *draw_info; + + MagickBooleanType + invert; + + MagickPixelPacket + target; + + draw_info=CloneDrawInfo(info ? info->image_info : + (ImageInfo *) NULL,(DrawInfo *) NULL); + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.x=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.y=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + (void) QueryColorDatabase(argument_list[3].string_reference, + &draw_info->fill,exception); + (void) GetOneVirtualMagickPixel(image,geometry.x,geometry.y,&target, + exception); + if (attribute_flag[4] != 0) + QueryMagickColor(argument_list[4].string_reference,&target, + exception); + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[6] != 0) + channel=(ChannelType) argument_list[6].integer_reference; + invert=MagickFalse; + if (attribute_flag[7] != 0) + invert=(MagickBooleanType) argument_list[7].integer_reference; + (void) FloodfillPaintImage(image,channel,draw_info,&target,geometry.x, + geometry.y,invert); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 112: /* Distort */ + { + AV + *av; + + double + *coordinates; + + DistortImageMethod + method; + + size_t + number_coordinates; + + VirtualPixelMethod + virtual_pixel; + + if (attribute_flag[0] == 0) + break; + method=UndefinedDistortion; + if (attribute_flag[1] != 0) + method=(DistortImageMethod) argument_list[1].integer_reference; + av=(AV *) argument_list[0].array_reference; + number_coordinates=(size_t) av_len(av)+1; + coordinates=(double *) AcquireQuantumMemory(number_coordinates, + sizeof(*coordinates)); + if (coordinates == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; j < (ssize_t) number_coordinates; j++) + coordinates[j]=(double) SvNV(*(av_fetch(av,j,0))); + virtual_pixel=UndefinedVirtualPixelMethod; + if (attribute_flag[2] != 0) + virtual_pixel=SetImageVirtualPixelMethod(image,(VirtualPixelMethod) + argument_list[2].integer_reference); + image=DistortImage(image,method,number_coordinates,coordinates, + argument_list[3].integer_reference != 0 ? MagickTrue : MagickFalse, + exception); + if ((attribute_flag[2] != 0) && (image != (Image *) NULL)) + virtual_pixel=SetImageVirtualPixelMethod(image,virtual_pixel); + coordinates=(double *) RelinquishMagickMemory(coordinates); + break; + } + case 113: /* Clut */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"ClutImageRequired", + PackageName); + goto PerlException; + } + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + (void) ClutImageChannel(image,channel, + argument_list[0].image_reference); + break; + } + case 114: /* LiquidRescale */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] == 0) + argument_list[3].real_reference=1.0; + if (attribute_flag[4] == 0) + argument_list[4].real_reference=0.0; + image=LiquidRescaleImage(image,geometry.width,geometry.height, + argument_list[3].real_reference,argument_list[4].real_reference, + exception); + break; + } + case 115: /* EncipherImage */ + { + (void) EncipherImage(image,argument_list[0].string_reference, + exception); + break; + } + case 116: /* DecipherImage */ + { + (void) DecipherImage(image,argument_list[0].string_reference, + exception); + break; + } + case 117: /* Deskew */ + { + geometry_info.rho=QuantumRange/2.0; + if (attribute_flag[0] != 0) + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if (attribute_flag[1] != 0) + geometry_info.rho=StringToDoubleInterval( + argument_list[1].string_reference,(double) QuantumRange+1.0); + image=DeskewImage(image,geometry_info.rho,exception); + break; + } + case 118: /* Remap */ + { + QuantizeInfo + *quantize_info; + + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"RemapImageRequired", + PackageName); + goto PerlException; + } + quantize_info=AcquireQuantizeInfo(info->image_info); + if (attribute_flag[1] != 0) + quantize_info->dither=(MagickBooleanType) + argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + quantize_info->dither_method=(DitherMethod) + argument_list[2].integer_reference; + (void) RemapImages(quantize_info,image, + argument_list[0].image_reference); + quantize_info=DestroyQuantizeInfo(quantize_info); + break; + } + case 119: /* SparseColor */ + { + AV + *av; + + double + *coordinates; + + SparseColorMethod + method; + + size_t + number_coordinates; + + VirtualPixelMethod + virtual_pixel; + + if (attribute_flag[0] == 0) + break; + method=UndefinedColorInterpolate; + if (attribute_flag[1] != 0) + method=(SparseColorMethod) argument_list[1].integer_reference; + av=(AV *) argument_list[0].array_reference; + number_coordinates=(size_t) av_len(av)+1; + coordinates=(double *) AcquireQuantumMemory(number_coordinates, + sizeof(*coordinates)); + if (coordinates == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; j < (ssize_t) number_coordinates; j++) + coordinates[j]=(double) SvNV(*(av_fetch(av,j,0))); + virtual_pixel=UndefinedVirtualPixelMethod; + if (attribute_flag[2] != 0) + virtual_pixel=SetImageVirtualPixelMethod(image,(VirtualPixelMethod) + argument_list[2].integer_reference); + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=SparseColorImage(image,channel,method,number_coordinates, + coordinates,exception); + if ((attribute_flag[2] != 0) && (image != (Image *) NULL)) + virtual_pixel=SetImageVirtualPixelMethod(image,virtual_pixel); + coordinates=(double *) RelinquishMagickMemory(coordinates); + break; + } + case 120: /* Function */ + { + AV + *av; + + double + *parameters; + + MagickFunction + function; + + size_t + number_parameters; + + VirtualPixelMethod + virtual_pixel; + + if (attribute_flag[0] == 0) + break; + function=UndefinedFunction; + if (attribute_flag[1] != 0) + function=(MagickFunction) argument_list[1].integer_reference; + av=(AV *) argument_list[0].array_reference; + number_parameters=(size_t) av_len(av)+1; + parameters=(double *) AcquireQuantumMemory(number_parameters, + sizeof(*parameters)); + if (parameters == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; j < (ssize_t) number_parameters; j++) + parameters[j]=(double) SvNV(*(av_fetch(av,j,0))); + virtual_pixel=UndefinedVirtualPixelMethod; + if (attribute_flag[2] != 0) + virtual_pixel=SetImageVirtualPixelMethod(image,(VirtualPixelMethod) + argument_list[2].integer_reference); + (void) FunctionImage(image,function,number_parameters,parameters, + exception); + if ((attribute_flag[2] != 0) && (image != (Image *) NULL)) + virtual_pixel=SetImageVirtualPixelMethod(image,virtual_pixel); + parameters=(double *) RelinquishMagickMemory(parameters); + break; + } + case 121: /* SelectiveBlur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & PercentValue) != 0) + geometry_info.xi=QuantumRange*geometry_info.xi/100.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].integer_reference;; + if (attribute_flag[4] != 0) + channel=(ChannelType) argument_list[4].integer_reference; + image=SelectiveBlurImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,geometry_info.xi,exception); + break; + } + case 122: /* HaldClut */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"ClutImageRequired", + PackageName); + goto PerlException; + } + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + (void) HaldClutImageChannel(image,channel, + argument_list[0].image_reference); + break; + } + case 123: /* BlueShift */ + { + if (attribute_flag[0] != 0) + (void) ParseGeometry(argument_list[0].string_reference, + &geometry_info); + image=BlueShiftImage(image,geometry_info.rho,exception); + break; + } + case 124: /* ForwardFourierTransformImage */ + { + image=ForwardFourierTransformImage(image, + argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse, + exception); + break; + } + case 125: /* InverseFourierTransformImage */ + { + image=InverseFourierTransformImage(image,image->next, + argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse, + exception); + break; + } + case 126: /* ColorDecisionList */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference=(char *) NULL; + (void) ColorDecisionListImage(image, + argument_list[0].string_reference); + break; + } + case 127: /* AutoGamma */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + (void) AutoGammaImageChannel(image,channel); + break; + } + case 128: /* AutoLevel */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + (void) AutoLevelImageChannel(image,channel); + break; + } + case 129: /* LevelColors */ + { + MagickPixelPacket + black_point, + white_point; + + (void) QueryMagickColor("#000000",&black_point,exception); + (void) QueryMagickColor("#ffffff",&white_point,exception); + if (attribute_flag[1] != 0) + (void) QueryMagickColor(argument_list[1].string_reference, + &black_point,exception); + if (attribute_flag[2] != 0) + (void) QueryMagickColor(argument_list[2].string_reference, + &white_point,exception); + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + (void) LevelColorsImageChannel(image,channel,&black_point, + &white_point,argument_list[0].integer_reference != 0 ? MagickTrue : + MagickFalse); + break; + } + case 130: /* Clamp */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + (void) ClampImageChannel(image,channel); + break; + } + case 131: /* Filter */ + { + KernelInfo + *kernel; + + if (attribute_flag[0] == 0) + break; + kernel=AcquireKernelInfo(argument_list[0].string_reference); + if (kernel == (KernelInfo *) NULL) + break; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + image->bias=StringToDoubleInterval( + argument_list[2].string_reference,(double) QuantumRange+1.0); + image=FilterImageChannel(image,channel,kernel,exception); + kernel=DestroyKernelInfo(kernel); + break; + } + case 132: /* BrightnessContrast */ + { + double + brightness, + contrast; + + brightness=0.0; + contrast=0.0; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + brightness=geometry_info.rho; + if ((flags & SigmaValue) == 0) + contrast=geometry_info.sigma; + } + if (attribute_flag[1] != 0) + brightness=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + contrast=argument_list[2].real_reference; + if (attribute_flag[4] != 0) + channel=(ChannelType) argument_list[4].integer_reference; + (void) BrightnessContrastImageChannel(image,channel,brightness, + contrast); + break; + } + case 133: /* Morphology */ + { + KernelInfo + *kernel; + + MorphologyMethod + method; + + ssize_t + iterations; + + if (attribute_flag[0] == 0) + break; + kernel=AcquireKernelInfo(argument_list[0].string_reference); + if (kernel == (KernelInfo *) NULL) + break; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + method=UndefinedMorphology; + if (attribute_flag[2] != 0) + method=argument_list[2].integer_reference; + iterations=1; + if (attribute_flag[3] != 0) + iterations=argument_list[3].integer_reference; + image=MorphologyImageChannel(image,channel,method,iterations,kernel, + exception); + kernel=DestroyKernelInfo(kernel); + break; + } + case 108: /* Recolor */ + case 134: /* ColorMatrix */ + { + AV + *av; + + double + *color_matrix; + + KernelInfo + *kernel_info; + + size_t + order; + + if (attribute_flag[0] == 0) + break; + av=(AV *) argument_list[0].array_reference; + order=(size_t) sqrt(av_len(av)+1); + color_matrix=(double *) AcquireQuantumMemory(order,order* + sizeof(*color_matrix)); + if (color_matrix == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; (j < (ssize_t) (order*order)) && (j < (av_len(av)+1)); j++) + color_matrix[j]=(double) SvNV(*(av_fetch(av,j,0))); + for ( ; j < (ssize_t) (order*order); j++) + color_matrix[j]=0.0; + kernel_info=AcquireKernelInfo("1"); + if (kernel_info == (KernelInfo *) NULL) + break; + kernel_info->width=order; + kernel_info->height=order; + kernel_info->values=color_matrix; + image=ColorMatrixImage(image,kernel_info,exception); + kernel_info->values=(double *) NULL; + kernel_info=DestroyKernelInfo(kernel_info); + color_matrix=(double *) RelinquishMagickMemory(color_matrix); + break; + } + case 135: /* Color */ + { + MagickPixelPacket + color; + + (void) QueryMagickColor("none",&color,exception); + if (attribute_flag[0] != 0) + (void) QueryMagickColor(argument_list[0].string_reference, + &color,exception); + (void) SetImageColor(image,&color); + break; + } + case 136: /* Mode */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=StatisticImageChannel(image,channel,ModeStatistic, + (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception); + break; + } + case 137: /* Statistic */ + { + StatisticType + statistic; + + statistic=UndefinedStatistic; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + statistic=(StatisticType) argument_list[4].integer_reference; + image=StatisticImageChannel(image,channel,statistic, + (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception); + break; + } + case 138: /* Perceptible */ + { + double + epsilon; + + epsilon=MagickEpsilon; + if (attribute_flag[0] != 0) + epsilon=argument_list[0].real_reference; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + (void) PerceptibleImageChannel(image,channel,epsilon); + break; + } + case 139: /* Poly */ + { + AV + *av; + + double + *terms; + + size_t + number_terms; + + if (attribute_flag[0] == 0) + break; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + av=(AV *) argument_list[0].array_reference; + number_terms=(size_t) av_len(av); + terms=(double *) AcquireQuantumMemory(number_terms,sizeof(*terms)); + if (terms == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; j < av_len(av); j++) + terms[j]=(double) SvNV(*(av_fetch(av,j,0))); + image=PolynomialImageChannel(image,channel,number_terms >> 1,terms, + exception); + terms=(double *) RelinquishMagickMemory(terms); + break; + } + case 140: /* Grayscale */ + { + PixelIntensityMethod + method; + + method=UndefinedPixelIntensityMethod; + if (attribute_flag[0] != 0) + method=(PixelIntensityMethod) argument_list[0].integer_reference; + (void) GrayscaleImage(image,method); + break; + } + case 141: /* CannyEdge */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=0.10; + if ((flags & PsiValue) == 0) + geometry_info.psi=0.30; + if ((flags & PercentValue) != 0) + { + geometry_info.xi/=100.0; + geometry_info.psi/=100.0; + } + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].real_reference; + if (attribute_flag[4] != 0) + geometry_info.psi=argument_list[4].real_reference; + image=CannyEdgeImage(image,geometry_info.rho,geometry_info.sigma, + geometry_info.xi,geometry_info.psi,exception); + break; + } + case 142: /* HoughLine */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + if ((flags & XiValue) == 0) + geometry_info.xi=40; + } + if (attribute_flag[1] != 0) + geometry_info.rho=(double) argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=(double) argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=(double) argument_list[3].integer_reference; + image=HoughLineImage(image,(size_t) geometry_info.rho,(size_t) + geometry_info.sigma,(size_t) geometry_info.xi,exception); + break; + } + case 143: /* MeanShift */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + if ((flags & XiValue) == 0) + geometry_info.xi=0.10*QuantumRange; + if ((flags & PercentValue) != 0) + geometry_info.xi=QuantumRange*geometry_info.xi/100.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=(double) argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=(double) argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=(double) argument_list[3].real_reference; + image=MeanShiftImage(image,(size_t) geometry_info.rho,(size_t) + geometry_info.sigma,geometry_info.xi,exception); + break; + } + case 144: /* Kuwahara */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho-0.5; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=KuwaharaImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 145: /* ConnectedComponent */ + { + MagickBooleanType + verbose; + + size_t + connectivity; + + connectivity=4; + verbose=MagickFalse; + if (attribute_flag[0] != 0) + connectivity=argument_list[0].integer_reference; + if (attribute_flag[1] != 0) + verbose=argument_list[4].integer_reference != 0 ? + MagickTrue : MagickFalse; + if (verbose != MagickFalse) + SetImageArtifact(image,"connected-components","true"); + image=ConnectedComponentsImage(image,connectivity,exception); + break; + } + case 146: /* Copy */ + { + Image + *source_image; + + OffsetInfo + offset; + + RectangleInfo + offset_geometry; + + source_image=image; + if (attribute_flag[0] != 0) + source_image=argument_list[0].image_reference; + SetGeometry(source_image,&geometry); + if (attribute_flag[1] != 0) + flags=ParseGravityGeometry(source_image, + argument_list[1].string_reference,&geometry,exception); + if (attribute_flag[2] != 0) + geometry.width=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry.height=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry.x=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + geometry.y=argument_list[5].integer_reference; + if (attribute_flag[6] != 0) + image->gravity=(GravityType) argument_list[6].integer_reference; + SetGeometry(image,&offset_geometry); + if (attribute_flag[7] != 0) + flags=ParseGravityGeometry(image,argument_list[7].string_reference, + &offset_geometry,exception); + offset.x=offset_geometry.x; + offset.y=offset_geometry.y; + if (attribute_flag[8] != 0) + offset.x=argument_list[8].integer_reference; + if (attribute_flag[9] != 0) + offset.y=argument_list[9].integer_reference; + (void) CopyImagePixels(image,source_image,&geometry,&offset, + exception); + break; + } + case 147: /* WaveletDenoise */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & PercentValue) != 0) + { + geometry_info.rho=QuantumRange*geometry_info.rho/100.0; + geometry_info.sigma=QuantumRange*geometry_info.sigma/100.0; + } + if ((flags & SigmaValue) == 0) + geometry_info.sigma=0.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + image=WaveletDenoiseImage(image,geometry_info.rho,geometry_info.sigma, exception); + break; + } + case 148: /* Colorspace */ + { + ColorspaceType + colorspace; + + colorspace=sRGBColorspace; + if (attribute_flag[0] != 0) + colorspace=(ColorspaceType) argument_list[0].integer_reference; + (void) TransformImageColorspace(image,colorspace); + break; + } + case 149: /* AutoThreshold */ + { + AutoThresholdMethod + method; + + method=UndefinedThresholdMethod; + if (attribute_flag[0] != 0) + method=(AutoThresholdMethod) argument_list[0].integer_reference; + (void) AutoThresholdImage(image,method,exception); + break; + } + } + if (next != (Image *) NULL) + (void) CatchImageException(next); + if (region_image != (Image *) NULL) + { + /* + Composite region. + */ + status=CompositeImage(region_image,CopyCompositeOp,image, + region_info.x,region_info.y); + (void) status; + (void) CatchImageException(region_image); + image=DestroyImage(image); + image=region_image; + } + if (image != (Image *) NULL) + { + number_images++; + if (next && (next != image)) + { + image->next=next->next; + if (image->next != (Image *) NULL) + image->next->previous=image; + DeleteImageFromRegistry(*pv,next); + } + sv_setiv(*pv,PTR2IV(image)); + next=image; + } + if (*pv) + pv++; + } + + PerlException: + if (reference_vector) + reference_vector=(SV **) RelinquishMagickMemory(reference_vector); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) number_images); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# M o n t a g e # +# # +# # +# # +############################################################################### +# +# +void +Montage(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + MontageImage = 1 + montage = 2 + montageimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image, + *next; + + MagickPixelPacket + transparent_color; + + MontageInfo + *montage_info; + + ssize_t + i; + + ssize_t + sp; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + attribute=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + /* + Get options. + */ + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + montage_info=CloneMontageInfo(info->image_info,(MontageInfo *) NULL); + (void) QueryMagickColor("none",&transparent_color,exception); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'B': + case 'b': + { + if (LocaleCompare(attribute,"background") == 0) + { + (void) QueryColorDatabase(SvPV(ST(i),na), + &montage_info->background_color,exception); + for (next=image; next; next=next->next) + next->background_color=montage_info->background_color; + break; + } + if (LocaleCompare(attribute,"border") == 0) + { + montage_info->border_width=SvIV(ST(i)); + break; + } + if (LocaleCompare(attribute,"bordercolor") == 0) + { + (void) QueryColorDatabase(SvPV(ST(i),na), + &montage_info->border_color,exception); + for (next=image; next; next=next->next) + next->border_color=montage_info->border_color; + break; + } + if (LocaleCompare(attribute,"borderwidth") == 0) + { + montage_info->border_width=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"compose") == 0) + { + sp=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickComposeOptions,MagickFalse,SvPV(ST(i),na)); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + for (next=image; next; next=next->next) + next->compose=(CompositeOperator) sp; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(attribute,"fill") == 0) + { + (void) QueryColorDatabase(SvPV(ST(i),na),&montage_info->fill, + exception); + break; + } + if (LocaleCompare(attribute,"font") == 0) + { + (void) CloneString(&montage_info->font,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"frame") == 0) + { + char + *p; + + p=SvPV(ST(i),na); + if (IsGeometry(p) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + p); + break; + } + (void) CloneString(&montage_info->frame,p); + if (*p == '\0') + montage_info->frame=(char *) NULL; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + char + *p; + + p=SvPV(ST(i),na); + if (IsGeometry(p) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + p); + break; + } + (void) CloneString(&montage_info->geometry,p); + if (*p == '\0') + montage_info->geometry=(char *) NULL; + break; + } + if (LocaleCompare(attribute,"gravity") == 0) + { + ssize_t + in; + + in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickGravityOptions,MagickFalse,SvPV(ST(i),na)); + if (in < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + montage_info->gravity=(GravityType) in; + for (next=image; next; next=next->next) + next->gravity=(GravityType) in; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'L': + case 'l': + { + if (LocaleCompare(attribute,"label") == 0) + { + for (next=image; next; next=next->next) + (void) SetImageProperty(next,"label",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,next, + SvPV(ST(i),na))); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"mattecolor") == 0) + { + (void) QueryColorDatabase(SvPV(ST(i),na), + &montage_info->matte_color,exception); + for (next=image; next; next=next->next) + next->matte_color=montage_info->matte_color; + break; + } + if (LocaleCompare(attribute,"mode") == 0) + { + ssize_t + in; + + in=!SvPOK(ST(i)) ? SvIV(ST(i)) : + ParseCommandOption(MagickModeOptions,MagickFalse,SvPV(ST(i),na)); + switch (in) + { + default: + { + ThrowPerlException(exception,OptionError, + "UnrecognizedModeType",SvPV(ST(i),na)); + break; + } + case FrameMode: + { + (void) CloneString(&montage_info->frame,"15x15+3+3"); + montage_info->shadow=MagickTrue; + break; + } + case UnframeMode: + { + montage_info->frame=(char *) NULL; + montage_info->shadow=MagickFalse; + montage_info->border_width=0; + break; + } + case ConcatenateMode: + { + montage_info->frame=(char *) NULL; + montage_info->shadow=MagickFalse; + (void) CloneString(&montage_info->geometry,"+0+0"); + montage_info->border_width=0; + } + } + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(attribute,"pointsize") == 0) + { + montage_info->pointsize=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(attribute,"shadow") == 0) + { + sp=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickBooleanOptions,MagickFalse,SvPV(ST(i),na)); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + montage_info->shadow=sp != 0 ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare(attribute,"stroke") == 0) + { + (void) QueryColorDatabase(SvPV(ST(i),na),&montage_info->stroke, + exception); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(attribute,"texture") == 0) + { + (void) CloneString(&montage_info->texture,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"tile") == 0) + { + char *p=SvPV(ST(i),na); + if (IsGeometry(p) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + p); + break; + } + (void) CloneString(&montage_info->tile,p); + if (*p == '\0') + montage_info->tile=(char *) NULL; + break; + } + if (LocaleCompare(attribute,"title") == 0) + { + (void) CloneString(&montage_info->title,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"transparent") == 0) + { + MagickPixelPacket + transparent_color; + + QueryMagickColor(SvPV(ST(i),na),&transparent_color,exception); + for (next=image; next; next=next->next) + (void) TransparentPaintImage(next,&transparent_color, + TransparentOpacity,MagickFalse); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=MontageImageList(info->image_info,montage_info,image,exception); + montage_info=DestroyMontageInfo(montage_info); + if (image == (Image *) NULL) + goto PerlException; + if (transparent_color.opacity != TransparentOpacity) + for (next=image; next; next=next->next) + (void) TransparentPaintImage(next,&transparent_color, + TransparentOpacity,MagickFalse); + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# M o r p h # +# # +# # +# # +############################################################################### +# +# +void +Morph(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + MorphImage = 1 + morph = 2 + morphimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ssize_t + i; + + ssize_t + number_frames; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + av=NULL; + attribute=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get attribute. + */ + number_frames=30; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'F': + case 'f': + { + if (LocaleCompare(attribute,"frames") == 0) + { + number_frames=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=MorphImages(image,number_frames,exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# M o s a i c # +# # +# # +# # +############################################################################### +# +# +void +Mosaic(ref) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + MosaicImage = 1 + mosaic = 2 + mosaicimage = 3 + PPCODE: + { + AV + *av; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + image=MergeImageLayers(image,MosaicLayer,exception); + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + (void) CopyMagickString(info->image_info->filename,image->filename, + MaxTextExtent); + SetImageInfo(info->image_info,0,&image->exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); /* return messages in string context */ + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# P i n g # +# # +# # +# # +############################################################################### +# +# +void +Ping(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + PingImage = 1 + ping = 2 + pingimage = 3 + PPCODE: + { + AV + *av; + + char + **keep, + **list; + + ExceptionInfo + *exception; + + Image + *image, + *next; + + int + n; + + MagickBooleanType + status; + + char + **p; + + ssize_t + i; + + ssize_t + ac; + + STRLEN + *length; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; + + size_t + count; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + package_info=(struct PackageInfo *) NULL; + ac=(items < 2) ? 1 : items-1; + list=(char **) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*list)); + keep=list; + length=(STRLEN *) NULL; + if (list == (char **) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + keep=list; + length=(STRLEN *) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*length)); + if (length == (STRLEN *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + if (SvTYPE(reference) != SVt_PVAV) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + package_info=ClonePackageInfo(info,exception); + n=1; + if (items <= 1) + *list=(char *) (*package_info->image_info->filename ? + package_info->image_info->filename : "XC:black"); + else + for (n=0, i=0; i < ac; i++) + { + list[n]=(char *) SvPV(ST(i+1),length[n]); + if ((items >= 3) && strEQcase(list[n],"blob")) + { + void + *blob; + + i++; + blob=(void *) (SvPV(ST(i+1),length[n])); + SetImageInfoBlob(package_info->image_info,blob,(size_t) length[n]); + } + if ((items >= 3) && strEQcase(list[n],"filename")) + continue; + if ((items >= 3) && strEQcase(list[n],"file")) + { + FILE + *file; + + PerlIO + *io_info; + + i++; + io_info=IoIFP(sv_2io(ST(i+1))); + if (io_info == (PerlIO *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + continue; + } + file=PerlIO_findFILE(io_info); + if (file == (FILE *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + continue; + } + SetImageInfoFile(package_info->image_info,file); + } + if ((items >= 3) && strEQcase(list[n],"magick")) + continue; + n++; + } + list[n]=(char *) NULL; + keep=list; + status=ExpandFilenames(&n,&list); + if (status == MagickFalse) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + count=0; + for (i=0; i < n; i++) + { + (void) CopyMagickString(package_info->image_info->filename,list[i], + MaxTextExtent); + image=PingImage(package_info->image_info,exception); + if (image == (Image *) NULL) + break; + if ((package_info->image_info->file != (FILE *) NULL) || + (package_info->image_info->blob != (void *) NULL)) + DisassociateImageStream(image); + count+=GetImageListLength(image); + EXTEND(sp,4*count); + for (next=image; next; next=next->next) + { + PUSHs(sv_2mortal(newSViv(next->columns))); + PUSHs(sv_2mortal(newSViv(next->rows))); + PUSHs(sv_2mortal(newSViv((size_t) GetBlobSize(next)))); + PUSHs(sv_2mortal(newSVpv(next->magick,0))); + } + image=DestroyImageList(image); + } + /* + Free resources. + */ + for (i=0; i < n; i++) + if (list[i] != (char *) NULL) + for (p=keep; list[i] != *p++; ) + if (*p == NULL) + { + list[i]=(char *) RelinquishMagickMemory(list[i]); + break; + } + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + if (list && (list != keep)) + list=(char **) RelinquishMagickMemory(list); + if (keep) + keep=(char **) RelinquishMagickMemory(keep); + if (length) + length=(STRLEN *) RelinquishMagickMemory(length); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + } + +# +############################################################################### +# # +# # +# # +# P r e v i e w # +# # +# # +# # +############################################################################### +# +# +void +Preview(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + PreviewImage = 1 + preview = 2 + previewimage = 3 + PPCODE: + { + AV + *av; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image, + *preview_image; + + PreviewType + preview_type; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + preview_type=GammaPreview; + if (items > 1) + preview_type=(PreviewType) + ParseCommandOption(MagickPreviewOptions,MagickFalse,SvPV(ST(1),na)); + for ( ; image; image=image->next) + { + preview_image=PreviewImage(image,preview_type,exception); + if (preview_image == (Image *) NULL) + goto PerlException; + AddImageToRegistry(sv,preview_image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# Q u e r y C o l o r # +# # +# # +# # +############################################################################### +# +# +void +QueryColor(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + querycolor = 1 + PPCODE: + { + char + *name; + + ExceptionInfo + *exception; + + MagickPixelPacket + color; + + ssize_t + i; + + SV + *perl_exception; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (items == 1) + { + const ColorInfo + **colorlist; + + size_t + colors; + + colorlist=GetColorInfoList("*",&colors,exception); + EXTEND(sp,colors); + for (i=0; i < (ssize_t) colors; i++) + { + PUSHs(sv_2mortal(newSVpv(colorlist[i]->name,0))); + } + colorlist=(const ColorInfo **) + RelinquishMagickMemory((ColorInfo **) colorlist); + goto PerlException; + } + EXTEND(sp,5*items); + for (i=1; i < items; i++) + { + name=(char *) SvPV(ST(i),na); + if (QueryMagickColor(name,&color,exception) == MagickFalse) + { + PUSHs(&sv_undef); + continue; + } + PUSHs(sv_2mortal(newSViv((size_t) floor(color.red+0.5)))); + PUSHs(sv_2mortal(newSViv((size_t) floor(color.green+0.5)))); + PUSHs(sv_2mortal(newSViv((size_t) floor(color.blue+0.5)))); + if (color.matte != MagickFalse) + PUSHs(sv_2mortal(newSViv((size_t) floor(color.opacity+0.5)))); + if (color.colorspace == CMYKColorspace) + PUSHs(sv_2mortal(newSViv((size_t) floor(color.index+0.5)))); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# Q u e r y C o l o r N a m e # +# # +# # +# # +############################################################################### +# +# +void +QueryColorname(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + querycolorname = 1 + PPCODE: + { + AV + *av; + + char + message[MaxTextExtent]; + + ExceptionInfo + *exception; + + Image + *image; + + PixelPacket + target_color; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + EXTEND(sp,items); + for (i=1; i < items; i++) + { + (void) QueryColorDatabase(SvPV(ST(i),na),&target_color,exception); + (void) QueryColorname(image,&target_color,SVGCompliance,message, + exception); + PUSHs(sv_2mortal(newSVpv(message,0))); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# Q u e r y F o n t # +# # +# # +# # +############################################################################### +# +# +void +QueryFont(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + queryfont = 1 + PPCODE: + { + char + *name, + message[MaxTextExtent]; + + ExceptionInfo + *exception; + + ssize_t + i; + + SV + *perl_exception; + + volatile const TypeInfo + *type_info; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (items == 1) + { + const TypeInfo + **typelist; + + size_t + types; + + typelist=GetTypeInfoList("*",&types,exception); + EXTEND(sp,types); + for (i=0; i < (ssize_t) types; i++) + { + PUSHs(sv_2mortal(newSVpv(typelist[i]->name,0))); + } + typelist=(const TypeInfo **) RelinquishMagickMemory((TypeInfo **) + typelist); + goto PerlException; + } + EXTEND(sp,10*items); + for (i=1; i < items; i++) + { + name=(char *) SvPV(ST(i),na); + type_info=GetTypeInfo(name,exception); + if (type_info == (TypeInfo *) NULL) + { + PUSHs(&sv_undef); + continue; + } + if (type_info->name == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->name,0))); + if (type_info->description == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->description,0))); + if (type_info->family == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->family,0))); + if (type_info->style == UndefinedStyle) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(CommandOptionToMnemonic(MagickStyleOptions, + type_info->style),0))); + if (type_info->stretch == UndefinedStretch) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(CommandOptionToMnemonic(MagickStretchOptions, + type_info->stretch),0))); + (void) FormatLocaleString(message,MaxTextExtent,"%.20g",(double) + type_info->weight); + PUSHs(sv_2mortal(newSVpv(message,0))); + if (type_info->encoding == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->encoding,0))); + if (type_info->foundry == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->foundry,0))); + if (type_info->format == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->format,0))); + if (type_info->metrics == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->metrics,0))); + if (type_info->glyphs == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->glyphs,0))); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# Q u e r y F o n t M e t r i c s # +# # +# # +# # +############################################################################### +# +# +void +QueryFontMetrics(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + queryfontmetrics = 1 + PPCODE: + { + AffineMatrix + affine, + current; + + AV + *av; + + char + *attribute; + + double + x, + y; + + DrawInfo + *draw_info; + + ExceptionInfo + *exception; + + GeometryInfo + geometry_info; + + Image + *image; + + MagickBooleanType + status; + + MagickStatusType + flags; + + ssize_t + i; + + ssize_t + type; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + TypeMetric + metrics; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + package_info=(struct PackageInfo *) NULL; + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + package_info=ClonePackageInfo(info,exception); + draw_info=CloneDrawInfo(package_info->image_info,(DrawInfo *) NULL); + CloneString(&draw_info->text,""); + current=draw_info->affine; + GetAffineMatrix(&affine); + x=0.0; + y=0.0; + EXTEND(sp,7*items); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'A': + case 'a': + { + if (LocaleCompare(attribute,"antialias") == 0) + { + type=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (type < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + draw_info->text_antialias=type != 0 ? MagickTrue : MagickFalse; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'd': + case 'D': + { + if (LocaleCompare(attribute,"density") == 0) + { + CloneString(&draw_info->density,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"direction") == 0) + { + draw_info->direction=(DirectionType) ParseCommandOption( + MagickDirectionOptions,MagickFalse,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'e': + case 'E': + { + if (LocaleCompare(attribute,"encoding") == 0) + { + CloneString(&draw_info->encoding,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'f': + case 'F': + { + if (LocaleCompare(attribute,"family") == 0) + { + CloneString(&draw_info->family,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"fill") == 0) + { + if (info) + (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->fill, + &image->exception); + break; + } + if (LocaleCompare(attribute,"font") == 0) + { + CloneString(&draw_info->font,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + CloneString(&draw_info->geometry,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"gravity") == 0) + { + draw_info->gravity=(GravityType) ParseCommandOption( + MagickGravityOptions,MagickFalse,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'i': + case 'I': + { + if (LocaleCompare(attribute,"interline-spacing") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->interline_spacing=geometry_info.rho; + break; + } + if (LocaleCompare(attribute,"interword-spacing") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->interword_spacing=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'k': + case 'K': + { + if (LocaleCompare(attribute,"kerning") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->kerning=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'p': + case 'P': + { + if (LocaleCompare(attribute,"pointsize") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->pointsize=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'r': + case 'R': + { + if (LocaleCompare(attribute,"rotate") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.rx=geometry_info.rho; + affine.ry=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.ry=affine.rx; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 's': + case 'S': + { + if (LocaleCompare(attribute,"scale") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.sy=affine.sx; + break; + } + if (LocaleCompare(attribute,"skew") == 0) + { + double + x_angle, + y_angle; + + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + x_angle=geometry_info.rho; + y_angle=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + y_angle=x_angle; + affine.ry=tan(DegreesToRadians(fmod(x_angle,360.0))); + affine.rx=tan(DegreesToRadians(fmod(y_angle,360.0))); + break; + } + if (LocaleCompare(attribute,"stroke") == 0) + { + if (info) + (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->stroke, + &image->exception); + break; + } + if (LocaleCompare(attribute,"style") == 0) + { + type=ParseCommandOption(MagickStyleOptions,MagickFalse, + SvPV(ST(i),na)); + if (type < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + draw_info->style=(StyleType) type; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 't': + case 'T': + { + if (LocaleCompare(attribute,"text") == 0) + { + CloneString(&draw_info->text,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"translate") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.tx=geometry_info.rho; + affine.ty=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.ty=affine.tx; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'w': + case 'W': + { + if (LocaleCompare(attribute,"weight") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->weight=(size_t) geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'x': + case 'X': + { + if (LocaleCompare(attribute,"x") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + x=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'y': + case 'Y': + { + if (LocaleCompare(attribute,"y") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + y=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + draw_info->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; + draw_info->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; + if (draw_info->geometry == (char *) NULL) + { + draw_info->geometry=AcquireString((char *) NULL); + (void) FormatLocaleString(draw_info->geometry,MaxTextExtent, + "%.20g,%.15g",x,y); + } + status=GetTypeMetrics(image,draw_info,&metrics); + (void) CatchImageException(image); + if (status == MagickFalse) + PUSHs(&sv_undef); + else + { + PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.x))); + PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.y))); + PUSHs(sv_2mortal(newSVnv(metrics.ascent))); + PUSHs(sv_2mortal(newSVnv(metrics.descent))); + PUSHs(sv_2mortal(newSVnv(metrics.width))); + PUSHs(sv_2mortal(newSVnv(metrics.height))); + PUSHs(sv_2mortal(newSVnv(metrics.max_advance))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.x1))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.y1))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.x2))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.y2))); + PUSHs(sv_2mortal(newSVnv(metrics.origin.x))); + PUSHs(sv_2mortal(newSVnv(metrics.origin.y))); + } + draw_info=DestroyDrawInfo(draw_info); + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + } + +# +############################################################################### +# # +# # +# # +# Q u e r y M u l t i l i n e F o n t M e t r i c s # +# # +# # +# # +############################################################################### +# +# +void +QueryMultilineFontMetrics(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + querymultilinefontmetrics = 1 + PPCODE: + { + AffineMatrix + affine, + current; + + AV + *av; + + char + *attribute; + + double + x, + y; + + DrawInfo + *draw_info; + + ExceptionInfo + *exception; + + GeometryInfo + geometry_info; + + Image + *image; + + MagickBooleanType + status; + + MagickStatusType + flags; + + ssize_t + i; + + ssize_t + type; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + TypeMetric + metrics; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + package_info=(struct PackageInfo *) NULL; + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + package_info=ClonePackageInfo(info,exception); + draw_info=CloneDrawInfo(package_info->image_info,(DrawInfo *) NULL); + CloneString(&draw_info->text,""); + current=draw_info->affine; + GetAffineMatrix(&affine); + x=0.0; + y=0.0; + EXTEND(sp,7*items); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'A': + case 'a': + { + if (LocaleCompare(attribute,"antialias") == 0) + { + type=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (type < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + draw_info->text_antialias=type != 0 ? MagickTrue : MagickFalse; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'd': + case 'D': + { + if (LocaleCompare(attribute,"density") == 0) + { + CloneString(&draw_info->density,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'e': + case 'E': + { + if (LocaleCompare(attribute,"encoding") == 0) + { + CloneString(&draw_info->encoding,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'f': + case 'F': + { + if (LocaleCompare(attribute,"family") == 0) + { + CloneString(&draw_info->family,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"fill") == 0) + { + if (info) + (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->fill, + &image->exception); + break; + } + if (LocaleCompare(attribute,"font") == 0) + { + CloneString(&draw_info->font,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + CloneString(&draw_info->geometry,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"gravity") == 0) + { + draw_info->gravity=(GravityType) ParseCommandOption( + MagickGravityOptions,MagickFalse,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'p': + case 'P': + { + if (LocaleCompare(attribute,"pointsize") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->pointsize=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'r': + case 'R': + { + if (LocaleCompare(attribute,"rotate") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.rx=geometry_info.rho; + affine.ry=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.ry=affine.rx; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 's': + case 'S': + { + if (LocaleCompare(attribute,"scale") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.sy=affine.sx; + break; + } + if (LocaleCompare(attribute,"skew") == 0) + { + double + x_angle, + y_angle; + + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + x_angle=geometry_info.rho; + y_angle=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + y_angle=x_angle; + affine.ry=tan(DegreesToRadians(fmod(x_angle,360.0))); + affine.rx=tan(DegreesToRadians(fmod(y_angle,360.0))); + break; + } + if (LocaleCompare(attribute,"stroke") == 0) + { + if (info) + (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->stroke, + &image->exception); + break; + } + if (LocaleCompare(attribute,"style") == 0) + { + type=ParseCommandOption(MagickStyleOptions,MagickFalse, + SvPV(ST(i),na)); + if (type < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + draw_info->style=(StyleType) type; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 't': + case 'T': + { + if (LocaleCompare(attribute,"text") == 0) + { + CloneString(&draw_info->text,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"translate") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.tx=geometry_info.rho; + affine.ty=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.ty=affine.tx; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'w': + case 'W': + { + if (LocaleCompare(attribute,"weight") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->weight=(size_t) geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'x': + case 'X': + { + if (LocaleCompare(attribute,"x") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + x=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'y': + case 'Y': + { + if (LocaleCompare(attribute,"y") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + y=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + draw_info->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; + draw_info->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; + if (draw_info->geometry == (char *) NULL) + { + draw_info->geometry=AcquireString((char *) NULL); + (void) FormatLocaleString(draw_info->geometry,MaxTextExtent, + "%.20g,%.15g",x,y); + } + status=GetMultilineTypeMetrics(image,draw_info,&metrics); + (void) CatchImageException(image); + if (status == MagickFalse) + PUSHs(&sv_undef); + else + { + PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.x))); + PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.y))); + PUSHs(sv_2mortal(newSVnv(metrics.ascent))); + PUSHs(sv_2mortal(newSVnv(metrics.descent))); + PUSHs(sv_2mortal(newSVnv(metrics.width))); + PUSHs(sv_2mortal(newSVnv(metrics.height))); + PUSHs(sv_2mortal(newSVnv(metrics.max_advance))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.x1))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.y1))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.x2))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.y2))); + PUSHs(sv_2mortal(newSVnv(metrics.origin.x))); + PUSHs(sv_2mortal(newSVnv(metrics.origin.y))); + } + draw_info=DestroyDrawInfo(draw_info); + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + } + +# +############################################################################### +# # +# # +# # +# Q u e r y F o r m a t # +# # +# # +# # +############################################################################### +# +# +void +QueryFormat(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + queryformat = 1 + PPCODE: + { + char + *name; + + ExceptionInfo + *exception; + + ssize_t + i; + + SV + *perl_exception; + + volatile const MagickInfo + *magick_info; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (items == 1) + { + char + format[MaxTextExtent]; + + const MagickInfo + **format_list; + + size_t + types; + + format_list=GetMagickInfoList("*",&types,exception); + EXTEND(sp,types); + for (i=0; i < (ssize_t) types; i++) + { + (void) CopyMagickString(format,format_list[i]->name,MaxTextExtent); + LocaleLower(format); + PUSHs(sv_2mortal(newSVpv(format,0))); + } + format_list=(const MagickInfo **) + RelinquishMagickMemory((MagickInfo *) format_list); + goto PerlException; + } + EXTEND(sp,8*items); + for (i=1; i < items; i++) + { + name=(char *) SvPV(ST(i),na); + magick_info=GetMagickInfo(name,exception); + if (magick_info == (const MagickInfo *) NULL) + { + PUSHs(&sv_undef); + continue; + } + PUSHs(sv_2mortal(newSViv(magick_info->adjoin))); + PUSHs(sv_2mortal(newSViv(magick_info->blob_support))); + PUSHs(sv_2mortal(newSViv(magick_info->raw))); + PUSHs(sv_2mortal(newSViv((long) magick_info->decoder))); + PUSHs(sv_2mortal(newSViv((long) magick_info->encoder))); + if (magick_info->description == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(magick_info->description,0))); + if (magick_info->magick_module == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(magick_info->magick_module,0))); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# Q u e r y O p t i o n # +# # +# # +# # +############################################################################### +# +# +void +QueryOption(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + queryoption = 1 + PPCODE: + { + char + **options; + + ExceptionInfo + *exception; + + ssize_t + i; + + ssize_t + j, + option; + + SV + *perl_exception; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + EXTEND(sp,8*items); + for (i=1; i < items; i++) + { + option=ParseCommandOption(MagickListOptions,MagickFalse,(char *) + SvPV(ST(i),na)); + options=GetCommandOptions((CommandOption) option); + if (options == (char **) NULL) + PUSHs(&sv_undef); + else + { + for (j=0; options[j] != (char *) NULL; j++) + PUSHs(sv_2mortal(newSVpv(options[j],0))); + options=DestroyStringList(options); + } + } + + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# R e a d # +# # +# # +# # +############################################################################### +# +# +void +Read(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + ReadImage = 1 + read = 2 + readimage = 3 + PPCODE: + { + AV + *av; + + char + **keep, + **list; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + int + n; + + MagickBooleanType + status; + + char + **p; + + ssize_t + i; + + ssize_t + ac, + number_images; + + STRLEN + *length; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, /* Perl variable for storing messages */ + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + package_info=(struct PackageInfo *) NULL; + number_images=0; + ac=(items < 2) ? 1 : items-1; + list=(char **) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*list)); + keep=list; + length=(STRLEN *) NULL; + if (list == (char **) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + length=(STRLEN *) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*length)); + if (length == (STRLEN *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + if (SvTYPE(reference) != SVt_PVAV) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + package_info=ClonePackageInfo(info,exception); + n=1; + if (items <= 1) + *list=(char *) (*package_info->image_info->filename ? + package_info->image_info->filename : "XC:black"); + else + for (n=0, i=0; i < ac; i++) + { + list[n]=(char *) SvPV(ST(i+1),length[n]); + if ((items >= 3) && strEQcase(list[n],"blob")) + { + void + *blob; + + i++; + blob=(void *) (SvPV(ST(i+1),length[n])); + SetImageInfoBlob(package_info->image_info,blob,(size_t) length[n]); + } + if ((items >= 3) && strEQcase(list[n],"filename")) + continue; + if ((items >= 3) && strEQcase(list[n],"file")) + { + FILE + *file; + + PerlIO + *io_info; + + i++; + io_info=IoIFP(sv_2io(ST(i+1))); + if (io_info == (PerlIO *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + continue; + } + file=PerlIO_findFILE(io_info); + if (file == (FILE *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + continue; + } + SetImageInfoFile(package_info->image_info,file); + } + if ((items >= 3) && strEQcase(list[n],"magick")) + continue; + n++; + } + list[n]=(char *) NULL; + keep=list; + status=ExpandFilenames(&n,&list); + if (status == MagickFalse) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + number_images=0; + for (i=0; i < n; i++) + { + if ((package_info->image_info->file != (FILE *) NULL) || + (package_info->image_info->blob != (void *) NULL)) + { + image=ReadImages(package_info->image_info,exception); + if (image != (Image *) NULL) + DisassociateImageStream(image); + } + else + { + (void) CopyMagickString(package_info->image_info->filename,list[i], + MaxTextExtent); + image=ReadImages(package_info->image_info,exception); + } + if (image == (Image *) NULL) + break; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + number_images++; + } + } + /* + Free resources. + */ + for (i=0; i < n; i++) + if (list[i] != (char *) NULL) + for (p=keep; list[i] != *p++; ) + if (*p == (char *) NULL) + { + list[i]=(char *) RelinquishMagickMemory(list[i]); + break; + } + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + if (list && (list != keep)) + list=(char **) RelinquishMagickMemory(list); + if (keep) + keep=(char **) RelinquishMagickMemory(keep); + if (length) + length=(STRLEN *) RelinquishMagickMemory(length); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) number_images); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# R e m o t e # +# # +# # +# # +############################################################################### +# +# +void +Remote(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + RemoteCommand = 1 + remote = 2 + remoteCommand = 3 + PPCODE: + { + AV + *av; + + ExceptionInfo + *exception; + + ssize_t + i; + + SV + *perl_exception, + *reference; + + struct PackageInfo + *info; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + for (i=1; i < items; i++) + (void) RemoteDisplayCommand(info->image_info,(char *) NULL,(char *) + SvPV(ST(i),na),exception); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + } + +# +############################################################################### +# # +# # +# # +# S e t # +# # +# # +# # +############################################################################### +# +# +void +Set(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + SetAttributes = 1 + SetAttribute = 2 + set = 3 + setattributes = 4 + setattribute = 5 + PPCODE: + { + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (items == 2) + SetAttribute(aTHX_ info,image,"size",ST(1),exception); + else + for (i=2; i < items; i+=2) + SetAttribute(aTHX_ info,image,SvPV(ST(i-1),na),ST(i),exception); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) (SvCUR(perl_exception) != 0)); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# S e t P i x e l # +# # +# # +# # +############################################################################### +# +# +void +SetPixel(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + setpixel = 1 + setPixel = 2 + PPCODE: + { + AV + *av; + + char + *attribute; + + ChannelType + channel; + + ExceptionInfo + *exception; + + Image + *image; + + MagickBooleanType + normalize; + + RectangleInfo + region; + + IndexPacket + *indexes; + + ssize_t + i; + + PixelPacket + *q; + + ssize_t + option; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + av=(AV *) NULL; + channel=DefaultChannels; + if (image->matte != MagickFalse) + channel|=OpacityChannel; + normalize=MagickTrue; + region.x=0; + region.y=0; + region.width=image->columns; + region.height=1; + if (items == 1) + (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"channel") == 0) + { + ssize_t + option; + + option=ParseChannelOption(SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + channel=(ChannelType) option; + break; + } + if (LocaleCompare(attribute,"color") == 0) + { + if (SvTYPE(ST(i)) != SVt_RV) + { + char + message[MaxTextExtent]; + + (void) FormatLocaleString(message,MaxTextExtent, + "invalid %.60s value",attribute); + ThrowPerlException(exception,OptionError,message, + SvPV(ST(i),na)); + } + av=(AV *) SvRV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'N': + case 'n': + { + if (LocaleCompare(attribute,"normalize") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + normalize=option != 0 ? MagickTrue : MagickFalse; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'x': + case 'X': + { + if (LocaleCompare(attribute,"x") == 0) + { + region.x=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'y': + case 'Y': + { + if (LocaleCompare(attribute,"y") == 0) + { + region.y=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + (void) SetImageStorageClass(image,DirectClass); + q=GetAuthenticPixels(image,region.x,region.y,1,1,exception); + if ((q == (PixelPacket *) NULL) || (av == (AV *) NULL) || + (SvTYPE(av) != SVt_PVAV)) + PUSHs(&sv_undef); + else + { + double + scale; + + ssize_t + i; + + i=0; + indexes=GetAuthenticIndexQueue(image); + scale=1.0; + if (normalize != MagickFalse) + scale=QuantumRange; + if (((channel & RedChannel) != 0) && (i <= av_len(av))) + { + SetPixelRed(q,ClampToQuantum(scale*SvNV(*( + av_fetch(av,i,0))))); + i++; + } + if (((channel & GreenChannel) != 0) && (i <= av_len(av))) + { + SetPixelGreen(q,ClampToQuantum(scale*SvNV(*( + av_fetch(av,i,0))))); + i++; + } + if (((channel & BlueChannel) != 0) && (i <= av_len(av))) + { + SetPixelBlue(q,ClampToQuantum(scale*SvNV(*( + av_fetch(av,i,0))))); + i++; + } + if ((((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) && (i <= av_len(av))) + { + SetPixelIndex(indexes,ClampToQuantum(scale* + SvNV(*(av_fetch(av,i,0))))); + i++; + } + if (((channel & OpacityChannel) != 0) && (i <= av_len(av))) + { + SetPixelOpacity(q,ClampToQuantum(scale* + SvNV(*(av_fetch(av,i,0))))); + i++; + } + (void) SyncAuthenticPixels(image,exception); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# S m u s h # +# # +# # +# # +############################################################################### +# +# +void +Smush(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + SmushImage = 1 + smush = 2 + smushimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ssize_t + i; + + ssize_t + offset, + stack; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + attribute=NULL; + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get options. + */ + offset=0; + stack=MagickTrue; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'O': + case 'o': + { + if (LocaleCompare(attribute,"offset") == 0) + { + offset=(ssize_t) StringToLong((char *) SvPV(ST(1),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(attribute,"stack") == 0) + { + stack=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (stack < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=SmushImages(image,stack != 0 ? MagickTrue : MagickFalse,offset, + exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# S t a t i s t i c s # +# # +# # +# # +############################################################################### +# +# +void +Statistics(ref) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + StatisticsImage = 1 + statistics = 2 + statisticsimage = 3 + PPCODE: + { +#define ChannelStatistics(channel) \ +{ \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + (double) channel_statistics[channel].depth); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].minima/scale); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].maxima/scale); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].mean/scale); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].standard_deviation/scale); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].kurtosis); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].skewness); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].entropy); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ +} + + AV + *av; + + char + message[MaxTextExtent]; + + ChannelStatistics + *channel_statistics; + + double + scale; + + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + count; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + av=newAV(); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + count=0; + for ( ; image; image=image->next) + { + channel_statistics=GetImageChannelStatistics(image,&image->exception); + if (channel_statistics == (ChannelStatistics *) NULL) + continue; + count++; + EXTEND(sp,40*count); + scale=(double) QuantumRange; + ChannelStatistics(RedChannel); + ChannelStatistics(GreenChannel); + ChannelStatistics(BlueChannel); + if (image->colorspace == CMYKColorspace) + ChannelStatistics(IndexChannel); + if (image->matte != MagickFalse) + ChannelStatistics(OpacityChannel); + channel_statistics=(ChannelStatistics *) + RelinquishMagickMemory(channel_statistics); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# S y n c A u t h e n t i c P i x e l s # +# # +# # +# # +############################################################################### +# +# +void +SyncAuthenticPixels(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + Syncauthenticpixels = 1 + SyncImagePixels = 2 + syncimagepixels = 3 + CODE: + { + ExceptionInfo + *exception; + + Image + *image; + + MagickBooleanType + status; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + + status=SyncAuthenticPixels(image,exception); + if (status != MagickFalse) + return; + InheritException(exception,&image->exception); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + } + +# +############################################################################### +# # +# # +# # +# T r a n s f o r m # +# # +# # +# # +############################################################################### +# +# +void +Transform(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + TransformImage = 1 + transform = 2 + transformimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute, + *crop_geometry, + *geometry; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *clone, + *image; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + av=NULL; + attribute=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get attribute. + */ + crop_geometry=(char *) NULL; + geometry=(char *) NULL; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'c': + case 'C': + { + if (LocaleCompare(attribute,"crop") == 0) + { + crop_geometry=SvPV(ST(i),na); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + geometry=SvPV(ST(i),na); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + for ( ; image; image=image->next) + { + clone=CloneImage(image,0,0,MagickTrue,exception); + if (clone == (Image *) NULL) + goto PerlException; + TransformImage(&clone,crop_geometry,geometry); + for ( ; clone; clone=clone->next) + { + AddImageToRegistry(sv,clone); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# W r i t e # +# # +# # +# # +############################################################################### +# +# +void +Write(ref,...) + Image::Magick::Q16 ref = NO_INIT + ALIAS: + WriteImage = 1 + write = 2 + writeimage = 3 + PPCODE: + { + char + filename[MaxTextExtent]; + + ExceptionInfo + *exception; + + Image + *image, + *next; + + ssize_t + i; + + ssize_t + number_images, + scene; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + number_images=0; + package_info=(struct PackageInfo *) NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + scene=0; + for (next=image; next; next=next->next) + next->scene=scene++; + package_info=ClonePackageInfo(info,exception); + if (items == 2) + SetAttribute(aTHX_ package_info,NULL,"filename",ST(1),exception); + else + if (items > 2) + for (i=2; i < items; i+=2) + SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i), + exception); + (void) CopyMagickString(filename,package_info->image_info->filename, + MaxTextExtent); + for (next=image; next; next=next->next) + (void) CopyMagickString(next->filename,filename,MaxTextExtent); + *package_info->image_info->magick='\0'; + SetImageInfo(package_info->image_info,(unsigned int) + GetImageListLength(image),&image->exception); + for (next=image; next; next=next->next) + { + (void) WriteImage(package_info->image_info,next); + if (next->exception.severity >= ErrorException) + InheritException(exception,&next->exception); + GetImageException(next,exception); + number_images++; + if (package_info->image_info->adjoin) + break; + } + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) number_images); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } diff --git a/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.xs.in b/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.xs.in new file mode 100644 index 0000000..5271c3d --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/quantum/quantum.xs.in @@ -0,0 +1,14586 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% PPPP EEEEE RRRR L % +% P P E R R L % +% PPPP EEE RRRR L % +% P E R R L % +% P EEEEE R R LLLLL % +% % +% M M AAA GGGG IIIII CCCC K K % +% MM MM A A G I C K K % +% M M M AAAAA G GGG I C KKK % +% M M A A G G I C K K % +% M M A A GGGG IIIII CCCC K K % +% % +% % +% Object-oriented Perl interface to ImageMagick % +% % +% Software Design % +% Kyle Shorter % +% Cristy % +% February 1997 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PerlMagick is an objected-oriented Perl interface to ImageMagick. Use +% the module to read, manipulate, or write an image or image sequence from +% within a Perl script. This makes PerlMagick suitable for Web CGI scripts. +% +*/ + +/* + Include declarations. +*/ +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" +#include +#include +#undef tainted + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +/* + Define declarations. +*/ +#ifndef aTHX_ +#define aTHX_ +#define pTHX_ +#define dTHX +#endif +#define DegreesToRadians(x) (MagickPI*(x)/180.0) +#define EndOf(array) (&array[NumberOf(array)]) +#define MagickPI 3.14159265358979323846264338327950288419716939937510 +#define MaxArguments 34 +#ifndef na +#define na PL_na +#endif +#define NumberOf(array) (sizeof(array)/sizeof(*array)) +#define PackageName "Image::Magick::@MAGICK_ABI_SUFFIX@" +#if PERL_VERSION <= 6 +#define PerlIO FILE +#define PerlIO_importFILE(f, fl) (f) +#define PerlIO_findFILE(f) NULL +#endif +#ifndef sv_undef +#define sv_undef PL_sv_undef +#endif + +#define AddImageToRegistry(sv,image) \ +{ \ + if (magick_registry != (SplayTreeInfo *) NULL) \ + { \ + (void) AddValueToSplayTree(magick_registry,image,image); \ + (sv)=newSViv(PTR2IV(image)); \ + } \ +} + +#define DeleteImageFromRegistry(reference,image) \ +{ \ + if (magick_registry != (SplayTreeInfo *) NULL) \ + { \ + if (GetImageReferenceCount(image) == 1) \ + (void) DeleteNodeByValueFromSplayTree(magick_registry,image); \ + image=DestroyImage(image); \ + sv_setiv(reference,0); \ + } \ +} + +#define InheritPerlException(exception,perl_exception) \ +{ \ + char \ + message[MaxTextExtent]; \ + \ + if ((exception)->severity != UndefinedException) \ + { \ + (void) FormatLocaleString(message,MaxTextExtent,"Exception %d: %s%s%s%s",\ + (exception)->severity, (exception)->reason ? \ + GetLocaleExceptionMessage((exception)->severity,(exception)->reason) : \ + "Unknown", (exception)->description ? " (" : "", \ + (exception)->description ? GetLocaleExceptionMessage( \ + (exception)->severity,(exception)->description) : "", \ + (exception)->description ? ")" : ""); \ + if ((perl_exception) != (SV *) NULL) \ + { \ + if (SvCUR(perl_exception)) \ + sv_catpv(perl_exception,"\n"); \ + sv_catpv(perl_exception,message); \ + } \ + } \ +} + +#define ThrowPerlException(exception,severity,tag,reason) \ + (void) ThrowMagickException(exception,GetMagickModule(),severity, \ + tag,"`%s'",reason); \ + +/* + Typedef and structure declarations. +*/ +typedef enum +{ + NullReference = 0, + ArrayReference = (~0), + RealReference = (~0)-1, + FileReference = (~0)-2, + ImageReference = (~0)-3, + IntegerReference = (~0)-4, + StringReference = (~0)-5 +} MagickReference; + +typedef struct _Arguments +{ + const char + *method; + + ssize_t + type; +} Arguments; + +struct ArgumentList +{ + ssize_t + integer_reference; + + MagickRealType + real_reference; + + const char + *string_reference; + + Image + *image_reference; + + SV + *array_reference; + + FILE + *file_reference; + + size_t + length; +}; + +struct PackageInfo +{ + ImageInfo + *image_info; +}; + +typedef void + *Image__Magick__@MAGICK_ABI_SUFFIX@; /* data type for the Image::Magick::@MAGICK_ABI_SUFFIX@ package */ + +/* + Static declarations. +*/ +static struct + Methods + { + const char + *name; + + Arguments + arguments[MaxArguments]; + } Methods[] = + { + { "Comment", { {"comment", StringReference} } }, + { "Label", { {"label", StringReference} } }, + { "AddNoise", { {"noise", MagickNoiseOptions}, + {"channel", MagickChannelOptions} } }, + { "Colorize", { {"fill", StringReference}, {"opacity", StringReference} } }, + { "Border", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"fill", StringReference}, + {"bordercolor", StringReference}, {"color", StringReference}, + {"compose", MagickComposeOptions} } }, + { "Blur", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference}, {"channel", MagickChannelOptions} } }, + { "Chop", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"x", IntegerReference}, + {"y", IntegerReference}, {"gravity", MagickGravityOptions} } }, + { "Crop", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"x", IntegerReference}, + {"y", IntegerReference}, {"fuzz", StringReference}, + {"gravity", MagickGravityOptions} } }, + { "Despeckle", { { (const char *) NULL, NullReference } } }, + { "Edge", { {"radius", RealReference} } }, + { "Emboss", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference} } }, + { "Enhance", { { (const char *) NULL, NullReference } } }, + { "Flip", { { (const char *) NULL, NullReference } } }, + { "Flop", { { (const char *) NULL, NullReference } } }, + { "Frame", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"inner", IntegerReference}, + {"outer", IntegerReference}, {"fill", StringReference}, + {"color", StringReference}, {"compose", MagickComposeOptions} } }, + { "Implode", { {"amount", RealReference}, + {"interpolate", MagickInterpolateOptions} } }, + { "Magnify", { { (const char *) NULL, NullReference } } }, + { "MedianFilter", { {"geometry", StringReference}, + {"width", IntegerReference},{"height", IntegerReference}, + {"channel", MagickChannelOptions} } }, + { "Minify", { { (const char *) NULL, NullReference } } }, + { "OilPaint", { {"radius", RealReference} } }, + { "ReduceNoise", { {"geometry", StringReference}, + {"width", IntegerReference},{"height", IntegerReference}, + {"channel", MagickChannelOptions} } }, + { "Roll", { {"geometry", StringReference}, {"x", IntegerReference}, + {"y", IntegerReference} } }, + { "Rotate", { {"degrees", RealReference}, {"fill", StringReference}, + {"color", StringReference}, {"background", StringReference} } }, + { "Sample", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference} } }, + { "Scale", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference} } }, + { "Shade", { {"geometry", StringReference}, {"azimuth", RealReference}, + {"elevation", RealReference}, {"gray", MagickBooleanOptions} } }, + { "Sharpen", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference}, {"channel", MagickChannelOptions} } }, + { "Shear", { {"geometry", StringReference}, {"x", RealReference}, + {"y", RealReference}, { "fill", StringReference}, + {"color", StringReference} } }, + { "Spread", { {"radius", RealReference}, + {"interpolate", MagickInterpolateOptions} } }, + { "Swirl", { {"degrees", RealReference}, + {"interpolate", MagickInterpolateOptions} } }, + { "Resize", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"filter", MagickFilterOptions}, + {"support", StringReference }, {"blur", RealReference } } }, + { "Zoom", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"filter", MagickFilterOptions}, + {"support", RealReference }, {"blur", RealReference } } }, + { "Annotate", { {"text", StringReference}, {"font", StringReference}, + {"pointsize", RealReference}, {"density", StringReference}, + {"undercolor", StringReference}, {"stroke", StringReference}, + {"fill", StringReference}, {"geometry", StringReference}, + {"pen", StringReference}, {"x", RealReference}, + {"y", RealReference}, {"gravity", MagickGravityOptions}, + {"translate", StringReference}, {"scale", StringReference}, + {"rotate", RealReference}, {"skewX", RealReference}, + {"skewY", RealReference}, {"strokewidth", RealReference}, + {"antialias", MagickBooleanOptions}, {"family", StringReference}, + {"style", MagickStyleOptions}, {"stretch", MagickStretchOptions}, + {"weight", IntegerReference}, {"align", MagickAlignOptions}, + {"encoding", StringReference}, {"affine", ArrayReference}, + {"fill-pattern", ImageReference}, {"stroke-pattern", ImageReference}, + {"tile", ImageReference}, {"kerning", RealReference}, + {"interline-spacing", RealReference}, + {"interword-spacing", RealReference}, + {"direction", MagickDirectionOptions}, + {"decorate", MagickDecorateOptions} } }, + { "ColorFloodfill", { {"geometry", StringReference}, + {"x", IntegerReference}, {"y", IntegerReference}, + {"fill", StringReference}, {"bordercolor", StringReference}, + {"fuzz", StringReference}, {"invert", MagickBooleanOptions} } }, + { "Composite", { {"image", ImageReference}, + {"compose", MagickComposeOptions}, {"geometry", StringReference}, + {"x", IntegerReference}, {"y", IntegerReference}, + {"gravity", MagickGravityOptions}, {"opacity", StringReference}, + {"tile", MagickBooleanOptions}, {"rotate", RealReference}, + {"color", StringReference}, {"mask", ImageReference}, + {"channel", MagickChannelOptions}, + {"interpolate", MagickInterpolateOptions}, {"args", StringReference}, + {"blend", StringReference} } }, + { "Contrast", { {"sharpen", MagickBooleanOptions} } }, + { "CycleColormap", { {"display", IntegerReference} } }, + { "Draw", { {"primitive", MagickPrimitiveOptions}, + {"points", StringReference}, {"method", MagickMethodOptions}, + {"stroke", StringReference}, {"fill", StringReference}, + {"strokewidth", RealReference}, {"font", StringReference}, + {"bordercolor", StringReference}, {"x", RealReference}, + {"y", RealReference}, {"translate", StringReference}, + {"scale", StringReference}, {"rotate", RealReference}, + {"skewX", RealReference}, {"skewY", RealReference}, + {"tile", ImageReference}, {"pointsize", RealReference}, + {"antialias", MagickBooleanOptions}, {"density", StringReference}, + {"linewidth", RealReference}, {"affine", ArrayReference}, + {"stroke-dashoffset", RealReference}, + {"stroke-dasharray", ArrayReference}, + {"interpolate", MagickInterpolateOptions}, + {"origin", StringReference}, {"text", StringReference}, + {"fill-pattern", ImageReference}, {"stroke-pattern", ImageReference}, + {"vector-graphics", StringReference}, {"kerning", RealReference}, + {"interline-spacing", RealReference}, + {"interword-spacing", RealReference}, + {"direction", MagickDirectionOptions} } }, + { "Equalize", { {"channel", MagickChannelOptions} } }, + { "Gamma", { {"gamma", StringReference}, {"channel", MagickChannelOptions}, + {"red", RealReference}, {"green", RealReference}, + {"blue", RealReference} } }, + { "Map", { {"image", ImageReference}, {"dither", MagickBooleanOptions}, + {"dither-method", MagickDitherOptions} } }, + { "MatteFloodfill", { {"geometry", StringReference}, + {"x", IntegerReference}, {"y", IntegerReference}, + {"opacity", StringReference}, {"bordercolor", StringReference}, + {"fuzz", StringReference}, {"invert", MagickBooleanOptions} } }, + { "Modulate", { {"factor", StringReference}, {"hue", RealReference}, + {"saturation", RealReference}, {"whiteness", RealReference}, + {"brightness", RealReference}, {"lightness", RealReference}, + {"blackness", RealReference} } }, + { "Negate", { {"gray", MagickBooleanOptions}, + {"channel", MagickChannelOptions} } }, + { "Normalize", { {"channel", MagickChannelOptions} } }, + { "NumberColors", { { (const char *) NULL, NullReference } } }, + { "Opaque", { {"color", StringReference}, {"fill", StringReference}, + {"fuzz", StringReference}, {"channel", MagickChannelOptions}, + {"invert", MagickBooleanOptions} } }, + { "Quantize", { {"colors", IntegerReference}, + {"treedepth", IntegerReference}, {"colorspace", MagickColorspaceOptions}, + {"dither", MagickBooleanOptions}, {"measure", MagickBooleanOptions}, + {"global", MagickBooleanOptions}, {"transparent-color", StringReference}, + {"dither-method", MagickDitherOptions} } }, + { "Raise", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"raise", MagickBooleanOptions} } }, + { "Segment", { {"geometry", StringReference}, + {"cluster-threshold", RealReference}, + {"smoothing-threshold", RealReference}, + {"colorspace", MagickColorspaceOptions}, + {"verbose", MagickBooleanOptions} } }, + { "Signature", { { (const char *) NULL, NullReference } } }, + { "Solarize", { {"geometry", StringReference}, + {"threshold", StringReference}, {"channel", MagickChannelOptions} } }, + { "Sync", { { (const char *) NULL, NullReference } } }, + { "Texture", { {"texture", ImageReference} } }, + { "Evaluate", { {"value", RealReference}, + {"operator", MagickEvaluateOptions}, + {"channel", MagickChannelOptions} } }, + { "Transparent", { {"color", StringReference}, {"opacity", StringReference}, + {"fuzz", StringReference}, {"invert", MagickBooleanOptions} } }, + { "Threshold", { {"threshold", StringReference}, + {"channel", MagickChannelOptions} } }, + { "Charcoal", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference} } }, + { "Trim", { {"fuzz", StringReference} } }, + { "Wave", { {"geometry", StringReference}, {"amplitude", RealReference}, + {"wavelength", RealReference}, + {"interpolate", MagickInterpolateOptions} } }, + { "Separate", { {"channel", MagickChannelOptions} } }, + { "Condense", { { (const char *) NULL, NullReference } } }, + { "Stereo", { {"image", ImageReference}, {"x", IntegerReference}, + {"y", IntegerReference} } }, + { "Stegano", { {"image", ImageReference}, {"offset", IntegerReference} } }, + { "Deconstruct", { { (const char *) NULL, NullReference } } }, + { "GaussianBlur", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Convolve", { {"coefficients", ArrayReference}, + {"channel", MagickChannelOptions}, {"bias", StringReference} } }, + { "Profile", { {"name", StringReference}, {"profile", StringReference}, + { "rendering-intent", MagickIntentOptions}, + { "black-point-compensation", MagickBooleanOptions} } }, + { "UnsharpMask", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"amount", RealReference}, {"threshold", RealReference}, + {"channel", MagickChannelOptions} } }, + { "MotionBlur", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"angle", RealReference}, {"channel", MagickChannelOptions} } }, + { "OrderedDither", { {"threshold", StringReference}, + {"channel", MagickChannelOptions} } }, + { "Shave", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference} } }, + { "Level", { {"levels", StringReference}, {"black-point", RealReference}, + {"white-point", RealReference}, {"gamma", RealReference}, + {"channel", MagickChannelOptions}, {"level", StringReference} } }, + { "Clip", { {"id", StringReference}, {"inside", MagickBooleanOptions} } }, + { "AffineTransform", { {"affine", ArrayReference}, + {"translate", StringReference}, {"scale", StringReference}, + {"rotate", RealReference}, {"skewX", RealReference}, + {"skewY", RealReference}, {"interpolate", MagickInterpolateOptions}, + {"background", StringReference} } }, + { "Difference", { {"image", ImageReference}, {"fuzz", StringReference} } }, + { "AdaptiveThreshold", { {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"offset", IntegerReference} } }, + { "Resample", { {"density", StringReference}, {"x", RealReference}, + {"y", RealReference}, {"filter", MagickFilterOptions}, + {"support", RealReference }, {"blur", RealReference } } }, + { "Describe", { {"file", FileReference} } }, + { "BlackThreshold", { {"threshold", StringReference}, + {"channel", MagickChannelOptions} } }, + { "WhiteThreshold", { {"threshold", StringReference}, + {"channel", MagickChannelOptions} } }, + { "RotationalBlur", { {"geometry", StringReference}, + {"angle", RealReference}, {"channel", MagickChannelOptions} } }, + { "Thumbnail", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference} } }, + { "Strip", { { (const char *) NULL, NullReference } } }, + { "Tint", { {"fill", StringReference}, {"opacity", StringReference} } }, + { "Channel", { {"channel", MagickChannelOptions} } }, + { "Splice", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"x", IntegerReference}, + {"y", IntegerReference}, {"fuzz", StringReference}, + {"background", StringReference}, {"gravity", MagickGravityOptions} } }, + { "Posterize", { {"levels", IntegerReference}, + {"dither", MagickBooleanOptions} } }, + { "Shadow", { {"geometry", StringReference}, {"opacity", RealReference}, + {"sigma", RealReference}, {"x", IntegerReference}, + {"y", IntegerReference} } }, + { "Identify", { {"file", FileReference}, {"features", StringReference}, + {"moments", MagickBooleanOptions}, {"unique", MagickBooleanOptions} } }, + { "SepiaTone", { {"threshold", RealReference} } }, + { "SigmoidalContrast", { {"geometry", StringReference}, + {"contrast", RealReference}, {"mid-point", RealReference}, + {"channel", MagickChannelOptions}, {"sharpen", MagickBooleanOptions} } }, + { "Extent", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"x", IntegerReference}, + {"y", IntegerReference}, {"fuzz", StringReference}, + {"background", StringReference}, {"gravity", MagickGravityOptions} } }, + { "Vignette", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference}, {"x", IntegerReference}, + {"y", IntegerReference}, {"background", StringReference} } }, + { "ContrastStretch", { {"levels", StringReference}, + {"black-point", RealReference},{"white-point", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Sans0", { { (const char *) NULL, NullReference } } }, + { "Sans1", { { (const char *) NULL, NullReference } } }, + { "AdaptiveSharpen", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Transpose", { { (const char *) NULL, NullReference } } }, + { "Transverse", { { (const char *) NULL, NullReference } } }, + { "AutoOrient", { { (const char *) NULL, NullReference } } }, + { "AdaptiveBlur", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Sketch", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"angle", RealReference} } }, + { "UniqueColors", { { (const char *) NULL, NullReference } } }, + { "AdaptiveResize", { {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"filter", MagickFilterOptions}, {"support", StringReference }, + {"blur", RealReference } } }, + { "ClipMask", { {"mask", ImageReference} } }, + { "LinearStretch", { {"levels", StringReference}, + {"black-point", RealReference},{"white-point", RealReference} } }, + { "Recolor", { {"matrix", ArrayReference} } }, + { "Mask", { {"mask", ImageReference} } }, + { "Polaroid", { {"caption", StringReference}, {"angle", RealReference}, + {"font", StringReference}, {"stroke", StringReference}, + {"fill", StringReference}, {"strokewidth", RealReference}, + {"pointsize", RealReference}, {"gravity", MagickGravityOptions}, + {"background", StringReference} } }, + { "FloodfillPaint", { {"geometry", StringReference}, + {"x", IntegerReference}, {"y", IntegerReference}, + {"fill", StringReference}, {"bordercolor", StringReference}, + {"fuzz", StringReference}, {"channel", MagickChannelOptions}, + {"invert", MagickBooleanOptions} } }, + { "Distort", { {"points", ArrayReference}, {"method", MagickDistortOptions}, + {"virtual-pixel", MagickVirtualPixelOptions}, + {"best-fit", MagickBooleanOptions} } }, + { "Clut", { {"image", ImageReference}, + {"channel", MagickChannelOptions} } }, + { "LiquidRescale", { {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"delta-x", RealReference}, {"rigidity", RealReference } } }, + { "Encipher", { {"passphrase", StringReference} } }, + { "Decipher", { {"passphrase", StringReference} } }, + { "Deskew", { {"geometry", StringReference}, + {"threshold", StringReference} } }, + { "Remap", { {"image", ImageReference}, {"dither", MagickBooleanOptions}, + {"dither-method", MagickDitherOptions} } }, + { "SparseColor", { {"points", ArrayReference}, + {"method", MagickSparseColorOptions}, + {"virtual-pixel", MagickVirtualPixelOptions}, + {"channel", MagickChannelOptions} } }, + { "Function", { {"parameters", ArrayReference}, + {"function", MagickFunctionOptions}, + {"virtual-pixel", MagickVirtualPixelOptions} } }, + { "SelectiveBlur", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"threshold", RealReference}, {"channel", MagickChannelOptions} } }, + { "HaldClut", { {"image", ImageReference}, + {"channel", MagickChannelOptions} } }, + { "BlueShift", { {"factor", StringReference} } }, + { "ForwardFourierTransform", { {"magnitude", MagickBooleanOptions} } }, + { "InverseFourierTransform", { {"magnitude", MagickBooleanOptions} } }, + { "ColorDecisionList", { + {"color-correction-collection", StringReference} } }, + { "AutoGamma", { {"channel", MagickChannelOptions} } }, + { "AutoLevel", { {"channel", MagickChannelOptions} } }, + { "LevelColors", { {"invert", MagickBooleanOptions}, + {"black-point", StringReference}, {"white-point", StringReference}, + {"channel", MagickChannelOptions}, {"invert", MagickBooleanOptions} } }, + { "Clamp", { {"channel", MagickChannelOptions} } }, + { "Filter", { {"kernel", StringReference}, + {"channel", MagickChannelOptions}, {"bias", StringReference} } }, + { "BrightnessContrast", { {"levels", StringReference}, + {"brightness", RealReference},{"contrast", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Morphology", { {"kernel", StringReference}, + {"channel", MagickChannelOptions}, {"method", MagickMorphologyOptions}, + {"iterations", IntegerReference} } }, + { "ColorMatrix", { {"matrix", ArrayReference} } }, + { "Color", { {"color", StringReference} } }, + { "Mode", { {"geometry", StringReference}, + {"width", IntegerReference},{"height", IntegerReference}, + {"channel", MagickChannelOptions} } }, + { "Statistic", { {"geometry", StringReference}, + {"width", IntegerReference},{"height", IntegerReference}, + {"channel", MagickChannelOptions}, {"type", MagickStatisticOptions} } }, + { "Perceptible", { {"epsilon", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Poly", { {"terms", ArrayReference}, + {"channel", MagickChannelOptions} } }, + { "Grayscale", { {"method", MagickPixelIntensityOptions} } }, + { "CannyEdge", { {"geometry", StringReference}, + {"radius", RealReference}, {"sigma", RealReference}, + {"lower-percent", RealReference}, {"upper-percent", RealReference} } }, + { "HoughLine", { {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"threshold", IntegerReference} } }, + { "MeanShift", { {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"distance", RealReference} } }, + { "Kuwahara", { {"geometry", StringReference}, {"radius", RealReference}, + {"sigma", RealReference}, {"channel", MagickChannelOptions} } }, + { "ConnectedComponents", { {"connectivity", IntegerReference} } }, + { "CopyPixels", { {"image", ImageReference}, {"geometry", StringReference}, + {"width", IntegerReference}, {"height", IntegerReference}, + {"x", IntegerReference}, {"y", IntegerReference}, + {"gravity", MagickGravityOptions}, {"offset", StringReference}, + {"dx", IntegerReference}, {"dy", IntegerReference} } }, + { "WaveletDenoise", { {"geometry", StringReference}, + {"threshold", RealReference}, {"softness", RealReference} } }, + { "Colorspace", { {"colorspace", MagickColorspaceOptions} } }, + { "AutoThreshold", { {"method", MagickAutoThresholdOptions} } } + }; + +static SplayTreeInfo + *magick_registry = (SplayTreeInfo *) NULL; + +/* + Forward declarations. +*/ +static Image + *SetupList(pTHX_ SV *,struct PackageInfo **,SV ***,ExceptionInfo *); + +static ssize_t + strEQcase(const char *,const char *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e P a c k a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClonePackageInfo makes a duplicate of the given info, or if info is NULL, +% a new one. +% +% The format of the ClonePackageInfo routine is: +% +% struct PackageInfo *ClonePackageInfo(struct PackageInfo *info, +% exception) +% +% A description of each parameter follows: +% +% o info: a structure of type info. +% +% o exception: Return any errors or warnings in this structure. +% +*/ +static struct PackageInfo *ClonePackageInfo(struct PackageInfo *info, + ExceptionInfo *exception) +{ + struct PackageInfo + *clone_info; + + clone_info=(struct PackageInfo *) AcquireQuantumMemory(1,sizeof(*clone_info)); + if (clone_info == (struct PackageInfo *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "UnableToClonePackageInfo",PackageName); + return((struct PackageInfo *) NULL); + } + if (info == (struct PackageInfo *) NULL) + { + clone_info->image_info=CloneImageInfo((ImageInfo *) NULL); + return(clone_info); + } + *clone_info=(*info); + clone_info->image_info=CloneImageInfo(info->image_info); + return(clone_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% c o n s t a n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% constant() returns a double value for the specified name. +% +% The format of the constant routine is: +% +% double constant(char *name,ssize_t sans) +% +% A description of each parameter follows: +% +% o value: Method constant returns a double value for the specified name. +% +% o name: The name of the constant. +% +% o sans: This integer value is not used. +% +*/ +static double constant(char *name,ssize_t sans) +{ + (void) sans; + errno=0; + switch (*name) + { + case 'B': + { + if (strEQ(name,"BlobError")) + return(BlobError); + if (strEQ(name,"BlobWarning")) + return(BlobWarning); + break; + } + case 'C': + { + if (strEQ(name,"CacheError")) + return(CacheError); + if (strEQ(name,"CacheWarning")) + return(CacheWarning); + if (strEQ(name,"CoderError")) + return(CoderError); + if (strEQ(name,"CoderWarning")) + return(CoderWarning); + if (strEQ(name,"ConfigureError")) + return(ConfigureError); + if (strEQ(name,"ConfigureWarning")) + return(ConfigureWarning); + if (strEQ(name,"CorruptImageError")) + return(CorruptImageError); + if (strEQ(name,"CorruptImageWarning")) + return(CorruptImageWarning); + break; + } + case 'D': + { + if (strEQ(name,"DelegateError")) + return(DelegateError); + if (strEQ(name,"DelegateWarning")) + return(DelegateWarning); + if (strEQ(name,"DrawError")) + return(DrawError); + if (strEQ(name,"DrawWarning")) + return(DrawWarning); + break; + } + case 'E': + { + if (strEQ(name,"ErrorException")) + return(ErrorException); + if (strEQ(name,"ExceptionError")) + return(CoderError); + if (strEQ(name,"ExceptionWarning")) + return(CoderWarning); + break; + } + case 'F': + { + if (strEQ(name,"FatalErrorException")) + return(FatalErrorException); + if (strEQ(name,"FileOpenError")) + return(FileOpenError); + if (strEQ(name,"FileOpenWarning")) + return(FileOpenWarning); + break; + } + case 'I': + { + if (strEQ(name,"ImageError")) + return(ImageError); + if (strEQ(name,"ImageWarning")) + return(ImageWarning); + break; + } + case 'M': + { + if (strEQ(name,"MaxRGB")) + return(QuantumRange); + if (strEQ(name,"MissingDelegateError")) + return(MissingDelegateError); + if (strEQ(name,"MissingDelegateWarning")) + return(MissingDelegateWarning); + if (strEQ(name,"ModuleError")) + return(ModuleError); + if (strEQ(name,"ModuleWarning")) + return(ModuleWarning); + break; + } + case 'O': + { + if (strEQ(name,"Opaque")) + return(OpaqueOpacity); + if (strEQ(name,"OptionError")) + return(OptionError); + if (strEQ(name,"OptionWarning")) + return(OptionWarning); + break; + } + case 'Q': + { + if (strEQ(name,"MAGICKCORE_QUANTUM_DEPTH")) + return(MAGICKCORE_QUANTUM_DEPTH); + if (strEQ(name,"QuantumDepth")) + return(MAGICKCORE_QUANTUM_DEPTH); + if (strEQ(name,"QuantumRange")) + return(QuantumRange); + break; + } + case 'R': + { + if (strEQ(name,"ResourceLimitError")) + return(ResourceLimitError); + if (strEQ(name,"ResourceLimitWarning")) + return(ResourceLimitWarning); + if (strEQ(name,"RegistryError")) + return(RegistryError); + if (strEQ(name,"RegistryWarning")) + return(RegistryWarning); + break; + } + case 'S': + { + if (strEQ(name,"StreamError")) + return(StreamError); + if (strEQ(name,"StreamWarning")) + return(StreamWarning); + if (strEQ(name,"Success")) + return(0); + break; + } + case 'T': + { + if (strEQ(name,"Transparent")) + return(TransparentOpacity); + if (strEQ(name,"TypeError")) + return(TypeError); + if (strEQ(name,"TypeWarning")) + return(TypeWarning); + break; + } + case 'W': + { + if (strEQ(name,"WarningException")) + return(WarningException); + break; + } + case 'X': + { + if (strEQ(name,"XServerError")) + return(XServerError); + if (strEQ(name,"XServerWarning")) + return(XServerWarning); + break; + } + } + errno=EINVAL; + return(0); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y P a c k a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method DestroyPackageInfo frees a previously created info structure. +% +% The format of the DestroyPackageInfo routine is: +% +% DestroyPackageInfo(struct PackageInfo *info) +% +% A description of each parameter follows: +% +% o info: a structure of type info. +% +*/ +static void DestroyPackageInfo(struct PackageInfo *info) +{ + info->image_info=DestroyImageInfo(info->image_info); + info=(struct PackageInfo *) RelinquishMagickMemory(info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method GetList is recursively called by SetupList to traverse the +% Image__Magick reference. If building an reference_vector (see SetupList), +% *current is the current position in *reference_vector and *last is the final +% entry in *reference_vector. +% +% The format of the GetList routine is: +% +% GetList(info) +% +% A description of each parameter follows: +% +% o info: a structure of type info. +% +*/ +static Image *GetList(pTHX_ SV *reference,SV ***reference_vector, + ssize_t *current,ssize_t *last,ExceptionInfo *exception) +{ + Image + *image; + + if (reference == (SV *) NULL) + return(NULL); + switch (SvTYPE(reference)) + { + case SVt_PVAV: + { + AV + *av; + + Image + *head, + *previous; + + ssize_t + i; + + ssize_t + n; + + /* + Array of images. + */ + previous=(Image *) NULL; + head=(Image *) NULL; + av=(AV *) reference; + n=av_len(av); + for (i=0; i <= n; i++) + { + SV + **rv; + + rv=av_fetch(av,i,0); + if (rv && *rv && sv_isobject(*rv)) + { + image=GetList(aTHX_ SvRV(*rv),reference_vector,current,last, + exception); + if (image == (Image *) NULL) + continue; + if (image == previous) + { + image=CloneImage(image,0,0,MagickTrue,exception); + if (image == (Image *) NULL) + return(NULL); + } + image->previous=previous; + *(previous ? &previous->next : &head)=image; + for (previous=image; previous->next; previous=previous->next) ; + } + } + return(head); + } + case SVt_PVMG: + { + /* + Blessed scalar, one image. + */ + image=INT2PTR(Image *,SvIV(reference)); + if (image == (Image *) NULL) + return(NULL); + image->previous=(Image *) NULL; + image->next=(Image *) NULL; + if (reference_vector) + { + if (*current == *last) + { + *last+=256; + if (*reference_vector == (SV **) NULL) + *reference_vector=(SV **) AcquireQuantumMemory(*last, + sizeof(*reference_vector)); + else + *reference_vector=(SV **) ResizeQuantumMemory(*reference_vector, + *last,sizeof(*reference_vector)); + } + if (*reference_vector == (SV **) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + return((Image *) NULL); + } + (*reference_vector)[*current]=reference; + (*reference_vector)[++(*current)]=NULL; + } + return(image); + } + default: + break; + } + (void) fprintf(stderr,"GetList: UnrecognizedType %.20g\n", + (double) SvTYPE(reference)); + return((Image *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P a c k a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method GetPackageInfo looks up or creates an info structure for the given +% Image__Magick reference. If it does create a new one, the information in +% package_info is used to initialize it. +% +% The format of the GetPackageInfo routine is: +% +% struct PackageInfo *GetPackageInfo(void *reference, +% struct PackageInfo *package_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o info: a structure of type info. +% +% o exception: Return any errors or warnings in this structure. +% +*/ +static struct PackageInfo *GetPackageInfo(pTHX_ void *reference, + struct PackageInfo *package_info,ExceptionInfo *exception) +{ + char + message[MaxTextExtent]; + + struct PackageInfo + *clone_info; + + SV + *sv; + + (void) FormatLocaleString(message,MaxTextExtent,"%s::package%s%p", + PackageName,XS_VERSION,reference); + sv=perl_get_sv(message,(TRUE | 0x02)); + if (sv == (SV *) NULL) + { + ThrowPerlException(exception,ResourceLimitError,"UnableToGetPackageInfo", + message); + return(package_info); + } + if (SvREFCNT(sv) == 0) + (void) SvREFCNT_inc(sv); + if (SvIOKp(sv) && (clone_info=INT2PTR(struct PackageInfo *,SvIV(sv)))) + return(clone_info); + clone_info=ClonePackageInfo(package_info,exception); + sv_setiv(sv,PTR2IV(clone_info)); + return(clone_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t A t t r i b u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetAttribute() sets the attribute to the value in sval. This can change +% either or both of image or info. +% +% The format of the SetAttribute routine is: +% +% SetAttribute(struct PackageInfo *info,Image *image,char *attribute, +% SV *sval,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o list: a list of strings. +% +% o string: a character string. +% +*/ + +static double SiPrefixToDoubleInterval(const char *string,const double interval) +{ + char + *q; + + double + value; + + value=InterpretSiPrefixValue(string,&q); + if (*q == '%') + value*=interval/100.0; + return(value); +} + +static inline double StringToDouble(const char *string,char **sentinal) +{ + return(InterpretLocaleValue(string,sentinal)); +} + +static double StringToDoubleInterval(const char *string,const double interval) +{ + char + *q; + + double + value; + + value=InterpretLocaleValue(string,&q); + if (*q == '%') + value*=interval/100.0; + return(value); +} + +static inline ssize_t StringToLong(const char *value) +{ + return(strtol(value,(char **) NULL,10)); +} + +static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, + const char *attribute,SV *sval,ExceptionInfo *exception) +{ + GeometryInfo + geometry_info; + + long + x, + y; + + MagickPixelPacket + pixel; + + MagickStatusType + flags; + + PixelPacket + *color, + target_color; + + ssize_t + sp; + + switch (*attribute) + { + case 'A': + case 'a': + { + if (LocaleCompare(attribute,"adjoin") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->adjoin=sp != 0 ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare(attribute,"alpha") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickAlphaOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + for ( ; image; image=image->next) + (void) SetImageAlphaChannel(image,(AlphaChannelType) sp); + break; + } + if (LocaleCompare(attribute,"antialias") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->antialias=sp != 0 ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare(attribute,"area-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(AreaResource,limit); + break; + } + if (LocaleCompare(attribute,"attenuate") == 0) + { + if (info) + (void) SetImageOption(info->image_info,attribute,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"authenticate") == 0) + { + if (info) + (void) CloneString(&info->image_info->authenticate,SvPV(sval,na)); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'B': + case 'b': + { + if (LocaleCompare(attribute,"background") == 0) + { + (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception); + if (info) + info->image_info->background_color=target_color; + for ( ; image; image=image->next) + image->background_color=target_color; + break; + } + if (LocaleCompare(attribute,"bias") == 0) + { + for ( ; image; image=image->next) + image->bias=StringToDoubleInterval(SvPV(sval,na),(double) + QuantumRange+1.0); + break; + } + if (LocaleCompare(attribute,"blue-primary") == 0) + { + for ( ; image; image=image->next) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + image->chromaticity.blue_primary.x=geometry_info.rho; + image->chromaticity.blue_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.blue_primary.y= + image->chromaticity.blue_primary.x; + } + break; + } + if (LocaleCompare(attribute,"bordercolor") == 0) + { + (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception); + if (info) + info->image_info->border_color=target_color; + for ( ; image; image=image->next) + image->border_color=target_color; + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"cache-threshold") == 0) + { + (void) SetMagickResourceLimit(MemoryResource,(MagickSizeType) + SiPrefixToDoubleInterval(SvPV(sval,na),100.0)); + (void) SetMagickResourceLimit(MapResource,(MagickSizeType) + (2.0*SiPrefixToDoubleInterval(SvPV(sval,na),100.0))); + break; + } + if (LocaleCompare(attribute,"clip-mask") == 0) + { + Image + *clip_mask; + + clip_mask=(Image *) NULL; + if (SvPOK(sval)) + clip_mask=SetupList(aTHX_ SvRV(sval),&info,(SV ***) NULL,exception); + for ( ; image; image=image->next) + SetImageClipMask(image,clip_mask); + break; + } + if (LocaleNCompare(attribute,"colormap",8) == 0) + { + for ( ; image; image=image->next) + { + int + items; + + long + i; + + if (image->storage_class == DirectClass) + continue; + i=0; + items=sscanf(attribute,"%*[^[][%ld",&i); + (void) items; + if (i > (ssize_t) image->colors) + i%=image->colors; + if ((strchr(SvPV(sval,na),',') == 0) || + (strchr(SvPV(sval,na),')') != 0)) + QueryColorDatabase(SvPV(sval,na),image->colormap+i,exception); + else + { + color=image->colormap+i; + pixel.red=color->red; + pixel.green=color->green; + pixel.blue=color->blue; + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + pixel.red=geometry_info.rho; + pixel.green=geometry_info.sigma; + pixel.blue=geometry_info.xi; + color->red=ClampToQuantum(pixel.red); + color->green=ClampToQuantum(pixel.green); + color->blue=ClampToQuantum(pixel.blue); + } + } + break; + } + if (LocaleCompare(attribute,"colorspace") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickColorspaceOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedColorspace", + SvPV(sval,na)); + break; + } + for ( ; image; image=image->next) + (void) SetImageColorspace(image,(ColorspaceType) sp); + break; + } + if (LocaleCompare(attribute,"comment") == 0) + { + for ( ; image; image=image->next) + (void) SetImageProperty(image,"Comment",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,image, + SvPV(sval,na))); + break; + } + if (LocaleCompare(attribute,"compression") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickCompressOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedImageCompression",SvPV(sval,na)); + break; + } + if (info) + info->image_info->compression=(CompressionType) sp; + for ( ; image; image=image->next) + image->compression=(CompressionType) sp; + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(attribute,"debug") == 0) + { + SetLogEventMask(SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"delay") == 0) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + for ( ; image; image=image->next) + { + image->delay=(size_t) floor(geometry_info.rho+0.5); + if ((flags & SigmaValue) != 0) + image->ticks_per_second=(ssize_t) + floor(geometry_info.sigma+0.5); + } + break; + } + if (LocaleCompare(attribute,"disk-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(DiskResource,limit); + break; + } + if (LocaleCompare(attribute,"density") == 0) + { + if (IsGeometry(SvPV(sval,na)) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + SvPV(sval,na)); + break; + } + if (info) + (void) CloneString(&info->image_info->density,SvPV(sval,na)); + for ( ; image; image=image->next) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + image->x_resolution=geometry_info.rho; + image->y_resolution=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->y_resolution=image->x_resolution; + } + break; + } + if (LocaleCompare(attribute,"depth") == 0) + { + if (info) + info->image_info->depth=SvIV(sval); + for ( ; image; image=image->next) + (void) SetImageDepth(image,SvIV(sval)); + break; + } + if (LocaleCompare(attribute,"dispose") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickDisposeOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedDisposeMethod",SvPV(sval,na)); + break; + } + for ( ; image; image=image->next) + image->dispose=(DisposeType) sp; + break; + } + if (LocaleCompare(attribute,"dither") == 0) + { + if (info) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + info->image_info->dither=sp != 0 ? MagickTrue : MagickFalse; + } + break; + } + if (LocaleCompare(attribute,"display") == 0) + { + display: + if (info) + (void) CloneString(&info->image_info->server_name,SvPV(sval,na)); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(attribute,"endian") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickEndianOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedEndianType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->endian=(EndianType) sp; + for ( ; image; image=image->next) + image->endian=(EndianType) sp; + break; + } + if (LocaleCompare(attribute,"extract") == 0) + { + /* + Set image extract geometry. + */ + (void) CloneString(&info->image_info->extract,SvPV(sval,na)); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(attribute,"filename") == 0) + { + if (info) + (void) CopyMagickString(info->image_info->filename,SvPV(sval,na), + MaxTextExtent); + for ( ; image; image=image->next) + (void) CopyMagickString(image->filename,SvPV(sval,na), + MaxTextExtent); + break; + } + if (LocaleCompare(attribute,"file") == 0) + { + FILE + *file; + + PerlIO + *io_info; + + if (info == (struct PackageInfo *) NULL) + break; + io_info=IoIFP(sv_2io(sval)); + if (io_info == (PerlIO *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + break; + } + file=PerlIO_findFILE(io_info); + if (file == (FILE *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + break; + } + SetImageInfoFile(info->image_info,file); + break; + } + if (LocaleCompare(attribute,"fill") == 0) + { + if (info) + (void) SetImageOption(info->image_info,"fill",SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"font") == 0) + { + if (info) + (void) CloneString(&info->image_info->font,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"foreground") == 0) + break; + if (LocaleCompare(attribute,"fuzz") == 0) + { + if (info) + info->image_info->fuzz=StringToDoubleInterval(SvPV(sval,na),(double) + QuantumRange+1.0); + for ( ; image; image=image->next) + image->fuzz=StringToDoubleInterval(SvPV(sval,na),(double) + QuantumRange+1.0); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(attribute,"gamma") == 0) + { + for ( ; image; image=image->next) + image->gamma=SvNV(sval); + break; + } + if (LocaleCompare(attribute,"gravity") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickGravityOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedGravityType",SvPV(sval,na)); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + image->gravity=(GravityType) sp; + break; + } + if (LocaleCompare(attribute,"green-primary") == 0) + { + for ( ; image; image=image->next) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + image->chromaticity.green_primary.x=geometry_info.rho; + image->chromaticity.green_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.green_primary.y= + image->chromaticity.green_primary.x; + } + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'I': + case 'i': + { + if (LocaleNCompare(attribute,"index",5) == 0) + { + IndexPacket + *indexes; + + int + items; + + long + index; + + PixelPacket + *p; + + CacheView + *image_view; + + for ( ; image; image=image->next) + { + if (image->storage_class != PseudoClass) + continue; + x=0; + y=0; + items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y); + (void) items; + image_view=AcquireAuthenticCacheView(image,exception); + p=GetCacheViewAuthenticPixels(image_view,x,y,1,1,exception); + if (p != (PixelPacket *) NULL) + { + indexes=GetCacheViewAuthenticIndexQueue(image_view); + items=sscanf(SvPV(sval,na),"%ld",&index); + if ((index >= 0) && (index < (ssize_t) image->colors)) + SetPixelIndex(indexes,index); + (void) SyncCacheViewAuthenticPixels(image_view,exception); + } + image_view=DestroyCacheView(image_view); + } + break; + } + if (LocaleCompare(attribute,"iterations") == 0) + { + iterations: + for ( ; image; image=image->next) + image->iterations=SvIV(sval); + break; + } + if (LocaleCompare(attribute,"interlace") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickInterlaceOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedInterlaceType",SvPV(sval,na)); + break; + } + if (info) + info->image_info->interlace=(InterlaceType) sp; + for ( ; image; image=image->next) + image->interlace=(InterlaceType) sp; + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'L': + case 'l': + { + if (LocaleCompare(attribute,"label") == 0) + { + for ( ; image; image=image->next) + (void) SetImageProperty(image,"label",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,image, + SvPV(sval,na))); + break; + } + if (LocaleCompare(attribute,"loop") == 0) + goto iterations; + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"magick") == 0) + { + if (info) + (void) FormatLocaleString(info->image_info->filename,MaxTextExtent, + "%s:",SvPV(sval,na)); + for ( ; image; image=image->next) + (void) CopyMagickString(image->magick,SvPV(sval,na),MaxTextExtent); + break; + } + if (LocaleCompare(attribute,"map-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(MapResource,limit); + break; + } + if (LocaleCompare(attribute,"mask") == 0) + { + Image + *mask; + + mask=(Image *) NULL; + if (SvPOK(sval)) + mask=SetupList(aTHX_ SvRV(sval),&info,(SV ***) NULL,exception); + for ( ; image; image=image->next) + SetImageMask(image,mask); + break; + } + if (LocaleCompare(attribute,"mattecolor") == 0) + { + (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception); + if (info) + info->image_info->matte_color=target_color; + for ( ; image; image=image->next) + image->matte_color=target_color; + break; + } + if (LocaleCompare(attribute,"matte") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + for ( ; image; image=image->next) + image->matte=sp != 0 ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare(attribute,"memory-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(MemoryResource,limit); + break; + } + if (LocaleCompare(attribute,"monochrome") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->monochrome=sp != 0 ? MagickTrue : MagickFalse; + for ( ; image; image=image->next) + (void) SetImageType(image,BilevelType); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(attribute,"option") == 0) + { + if (info) + DefineImageOption(info->image_info,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"orientation") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickOrientationOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedOrientationType",SvPV(sval,na)); + break; + } + if (info) + info->image_info->orientation=(OrientationType) sp; + for ( ; image; image=image->next) + image->orientation=(OrientationType) sp; + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(attribute,"page") == 0) + { + char + *geometry; + + geometry=GetPageGeometry(SvPV(sval,na)); + if (info) + (void) CloneString(&info->image_info->page,geometry); + for ( ; image; image=image->next) + (void) ParsePageGeometry(image,geometry,&image->page,exception); + geometry=(char *) RelinquishMagickMemory(geometry); + break; + } + if (LocaleCompare(attribute,"pen") == 0) + { + if (info) + (void) SetImageOption(info->image_info,"fill",SvPV(sval,na)); + break; + } + if (LocaleNCompare(attribute,"pixel",5) == 0) + { + int + items; + + MagickPixelPacket + pixel; + + IndexPacket + *indexes; + + PixelPacket + *q; + + CacheView + *image_view; + + for ( ; image; image=image->next) + { + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + break; + x=0; + y=0; + items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y); + (void) items; + image_view=AcquireAuthenticCacheView(image,exception); + q=GetCacheViewAuthenticPixels(image_view,x,y,1,1,exception); + indexes=GetCacheViewAuthenticIndexQueue(image_view); + if (q != (PixelPacket *) NULL) + { + if ((strchr(SvPV(sval,na),',') == 0) || + (strchr(SvPV(sval,na),')') != 0)) + QueryMagickColor(SvPV(sval,na),&pixel,exception); + else + { + GetMagickPixelPacket(image,&pixel); + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + pixel.red=geometry_info.rho; + if ((flags & SigmaValue) != 0) + pixel.green=geometry_info.sigma; + if ((flags & XiValue) != 0) + pixel.blue=geometry_info.xi; + if ((flags & PsiValue) != 0) + pixel.opacity=geometry_info.psi; + if ((flags & ChiValue) != 0) + pixel.index=geometry_info.chi; + } + SetPixelRed(q,ClampToQuantum(pixel.red)); + SetPixelGreen(q,ClampToQuantum(pixel.green)); + SetPixelBlue(q,ClampToQuantum(pixel.blue)); + SetPixelOpacity(q,ClampToQuantum(pixel.opacity)); + if (((image->colorspace == CMYKColorspace) || + (image->storage_class == PseudoClass)) && + (indexes != (IndexPacket *) NULL)) + SetPixelIndex(indexes,ClampToQuantum(pixel.index)); + (void) SyncCacheViewAuthenticPixels(image_view,exception); + } + image_view=DestroyCacheView(image_view); + } + break; + } + if (LocaleCompare(attribute,"pointsize") == 0) + { + if (info) + { + (void) ParseGeometry(SvPV(sval,na),&geometry_info); + info->image_info->pointsize=geometry_info.rho; + } + break; + } + if (LocaleCompare(attribute,"precision") == 0) + { + (void) SetMagickPrecision(SvIV(sval)); + break; + } + if (LocaleCompare(attribute,"preview") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickPreviewOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->preview_type=(PreviewType) sp; + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'Q': + case 'q': + { + if (LocaleCompare(attribute,"quality") == 0) + { + if (info) + info->image_info->quality=SvIV(sval); + for ( ; image; image=image->next) + image->quality=SvIV(sval); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(attribute,"red-primary") == 0) + { + for ( ; image; image=image->next) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + image->chromaticity.red_primary.x=geometry_info.rho; + image->chromaticity.red_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.red_primary.y= + image->chromaticity.red_primary.x; + } + break; + } + if (LocaleCompare(attribute,"render") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickIntentOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedIntentType", + SvPV(sval,na)); + break; + } + for ( ; image; image=image->next) + image->rendering_intent=(RenderingIntent) sp; + break; + } + if (LocaleCompare(attribute,"repage") == 0) + { + RectangleInfo + geometry; + + for ( ; image; image=image->next) + { + flags=ParseAbsoluteGeometry(SvPV(sval,na),&geometry); + if ((flags & WidthValue) != 0) + { + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + image->page.width=geometry.width; + image->page.height=geometry.height; + } + if ((flags & AspectValue) != 0) + { + if ((flags & XValue) != 0) + image->page.x+=geometry.x; + if ((flags & YValue) != 0) + image->page.y+=geometry.y; + } + else + { + if ((flags & XValue) != 0) + { + image->page.x=geometry.x; + if (((flags & WidthValue) != 0) && (geometry.x > 0)) + image->page.width=image->columns+geometry.x; + } + if ((flags & YValue) != 0) + { + image->page.y=geometry.y; + if (((flags & HeightValue) != 0) && (geometry.y > 0)) + image->page.height=image->rows+geometry.y; + } + } + } + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'S': + case 's': + { + if (LocaleCompare(attribute,"sampling-factor") == 0) + { + if (IsGeometry(SvPV(sval,na)) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + SvPV(sval,na)); + break; + } + if (info) + (void) CloneString(&info->image_info->sampling_factor, + SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"scene") == 0) + { + for ( ; image; image=image->next) + image->scene=SvIV(sval); + break; + } + if (LocaleCompare(attribute,"subimage") == 0) + { + if (info) + info->image_info->subimage=SvIV(sval); + break; + } + if (LocaleCompare(attribute,"subrange") == 0) + { + if (info) + info->image_info->subrange=SvIV(sval); + break; + } + if (LocaleCompare(attribute,"server") == 0) + goto display; + if (LocaleCompare(attribute,"size") == 0) + { + if (info) + { + if (IsGeometry(SvPV(sval,na)) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + SvPV(sval,na)); + break; + } + (void) CloneString(&info->image_info->size,SvPV(sval,na)); + } + break; + } + if (LocaleCompare(attribute,"stroke") == 0) + { + if (info) + (void) SetImageOption(info->image_info,"stroke",SvPV(sval,na)); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'T': + case 't': + { + if (LocaleCompare(attribute,"texture") == 0) + { + if (info) + (void) CloneString(&info->image_info->texture,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"thread-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(ThreadResource,limit); + break; + } + if (LocaleCompare(attribute,"tile") == 0) + { + if (info) + (void) CloneString(&info->image_info->tile,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"tile-offset") == 0) + { + char + *geometry; + + geometry=GetPageGeometry(SvPV(sval,na)); + if (info) + (void) CloneString(&info->image_info->page,geometry); + for ( ; image; image=image->next) + (void) ParsePageGeometry(image,geometry,&image->tile_offset, + exception); + geometry=(char *) RelinquishMagickMemory(geometry); + break; + } + if (LocaleCompare(attribute,"time-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(SvPV(sval,na),"unlimited") != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na), + 100.0); + (void) SetMagickResourceLimit(TimeResource,limit); + break; + } + if (LocaleCompare(attribute,"transparent-color") == 0) + { + (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception); + if (info) + info->image_info->transparent_color=target_color; + for ( ; image; image=image->next) + image->transparent_color=target_color; + break; + } + if (LocaleCompare(attribute,"type") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickTypeOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->type=(ImageType) sp; + for ( ; image; image=image->next) + SetImageType(image,(ImageType) sp); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'U': + case 'u': + { + if (LocaleCompare(attribute,"units") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickResolutionOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedUnitsType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->units=(ResolutionType) sp; + for ( ; image; image=image->next) + { + ResolutionType + units; + + units=(ResolutionType) sp; + if (image->units != units) + switch (image->units) + { + case UndefinedResolution: + case PixelsPerInchResolution: + { + if (units == PixelsPerCentimeterResolution) + { + image->x_resolution*=2.54; + image->y_resolution*=2.54; + } + break; + } + case PixelsPerCentimeterResolution: + { + if (units == PixelsPerInchResolution) + { + image->x_resolution/=2.54; + image->y_resolution/=2.54; + } + break; + } + } + image->units=units; + } + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'V': + case 'v': + { + if (LocaleCompare(attribute,"verbose") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(sval,na)); + break; + } + if (info) + info->image_info->verbose=sp != 0 ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare(attribute,"view") == 0) + { + if (info) + (void) CloneString(&info->image_info->view,SvPV(sval,na)); + break; + } + if (LocaleCompare(attribute,"virtual-pixel") == 0) + { + sp=SvPOK(sval) ? ParseCommandOption(MagickVirtualPixelOptions, + MagickFalse,SvPV(sval,na)) : SvIV(sval); + if (sp < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedVirtualPixelMethod",SvPV(sval,na)); + break; + } + if (info) + info->image_info->virtual_pixel_method=(VirtualPixelMethod) sp; + for ( ; image; image=image->next) + SetImageVirtualPixelMethod(image,(VirtualPixelMethod) sp); + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(attribute,"white-point") == 0) + { + for ( ; image; image=image->next) + { + flags=ParseGeometry(SvPV(sval,na),&geometry_info); + image->chromaticity.white_point.x=geometry_info.rho; + image->chromaticity.white_point.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.white_point.y= + image->chromaticity.white_point.x; + } + break; + } + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + default: + { + if (info) + SetImageOption(info->image_info,attribute,SvPV(sval,na)); + for ( ; image; image=image->next) + { + (void) SetImageProperty(image,attribute,SvPV(sval,na)); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } + break; + } + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t u p L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method SetupList returns the list of all the images linked by their +% image->next and image->previous link lists for use with ImageMagick. If +% info is non-NULL, an info structure is returned in *info. If +% reference_vector is non-NULL,an array of SV* are returned in +% *reference_vector. Reference_vector is used when the images are going to be +% replaced with new Image*'s. +% +% The format of the SetupList routine is: +% +% Image *SetupList(SV *reference,struct PackageInfo **info, +% SV ***reference_vector,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o list: a list of strings. +% +% o string: a character string. +% +% o exception: Return any errors or warnings in this structure. +% +*/ +static Image *SetupList(pTHX_ SV *reference,struct PackageInfo **info, + SV ***reference_vector,ExceptionInfo *exception) +{ + Image + *image; + + ssize_t + current, + last; + + if (reference_vector) + *reference_vector=NULL; + if (info) + *info=NULL; + current=0; + last=0; + image=GetList(aTHX_ reference,reference_vector,¤t,&last,exception); + if (info && (SvTYPE(reference) == SVt_PVAV)) + *info=GetPackageInfo(aTHX_ (void *) reference,(struct PackageInfo *) NULL, + exception); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% s t r E Q c a s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% strEQcase() compares two strings and returns 0 if they are the +% same or if the second string runs out first. The comparison is case +% insensitive. +% +% The format of the strEQcase routine is: +% +% ssize_t strEQcase(const char *p,const char *q) +% +% A description of each parameter follows: +% +% o p: a character string. +% +% o q: a character string. +% +% +*/ +static ssize_t strEQcase(const char *p,const char *q) +{ + char + c; + + ssize_t + i; + + for (i=0 ; (c=(*q)) != 0; i++) + { + if ((isUPPER((unsigned char) c) ? toLOWER(c) : c) != + (isUPPER((unsigned char) *p) ? toLOWER(*p) : *p)) + return(0); + p++; + q++; + } + return(((*q == 0) && (*p == 0)) ? i : 0); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I m a g e : : M a g i c k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ +MODULE = Image::Magick::@MAGICK_ABI_SUFFIX@ PACKAGE = Image::Magick::@MAGICK_ABI_SUFFIX@ + +PROTOTYPES: ENABLE + +BOOT: + MagickCoreGenesis("PerlMagick",MagickFalse); + SetWarningHandler(NULL); + SetErrorHandler(NULL); + magick_registry=NewSplayTree((int (*)(const void *,const void *)) + NULL,(void *(*)(void *)) NULL,(void *(*)(void *)) NULL); + +void +UNLOAD() + PPCODE: + { + if (magick_registry != (SplayTreeInfo *) NULL) + magick_registry=DestroySplayTree(magick_registry); + MagickCoreTerminus(); + } + +double +constant(name,argument) + char *name + ssize_t argument + +# +############################################################################### +# # +# # +# # +# A n i m a t e # +# # +# # +# # +############################################################################### +# +# +void +Animate(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + AnimateImage = 1 + animate = 2 + animateimage = 3 + PPCODE: + { + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + i; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + package_info=(struct PackageInfo *) NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + package_info=ClonePackageInfo(info,exception); + if (items == 2) + SetAttribute(aTHX_ package_info,NULL,"server",ST(1),exception); + else + if (items > 2) + for (i=2; i < items; i+=2) + SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i), + exception); + (void) AnimateImages(package_info->image_info,image); + (void) CatchImageException(image); + InheritException(exception,&image->exception); + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# A p p e n d # +# # +# # +# # +############################################################################### +# +# +void +Append(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + AppendImage = 1 + append = 2 + appendimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ssize_t + i; + + ssize_t + stack; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + attribute=NULL; + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get options. + */ + stack=MagickTrue; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'S': + case 's': + { + if (LocaleCompare(attribute,"stack") == 0) + { + stack=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (stack < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=AppendImages(image,stack != 0 ? MagickTrue : MagickFalse,exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# A v e r a g e # +# # +# # +# # +############################################################################### +# +# +void +Average(ref) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + AverageImage = 1 + average = 2 + averageimage = 3 + PPCODE: + { + AV + *av; + + char + *p; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + image=EvaluateImages(image,MeanEvaluateOperator,exception); + if (image == (Image *) NULL) + goto PerlException; + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + (void) FormatLocaleString(info->image_info->filename,MaxTextExtent, + "average-%.*s",(int) (MaxTextExtent-9), + ((p=strrchr(image->filename,'/')) ? p+1 : image->filename)); + (void) CopyMagickString(image->filename,info->image_info->filename, + MaxTextExtent); + SetImageInfo(info->image_info,0,exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# B l o b T o I m a g e # +# # +# # +# # +############################################################################### +# +# +void +BlobToImage(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + BlobToImage = 1 + blobtoimage = 2 + blobto = 3 + PPCODE: + { + AV + *av; + + char + **keep, + **list; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + char + **p; + + ssize_t + i; + + ssize_t + ac, + n, + number_images; + + STRLEN + *length; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + number_images=0; + ac=(items < 2) ? 1 : items-1; + length=(STRLEN *) NULL; + list=(char **) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*list)); + if (list == (char **) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + length=(STRLEN *) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*length)); + if (length == (STRLEN *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + if (SvTYPE(reference) != SVt_PVAV) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + n=1; + if (items <= 1) + { + ThrowPerlException(exception,OptionError,"NoBlobDefined",PackageName); + goto PerlException; + } + for (n=0, i=0; i < ac; i++) + { + list[n]=(char *) (SvPV(ST(i+1),length[n])); + if ((items >= 3) && strEQcase((char *) SvPV(ST(i+1),na),"blob")) + { + list[n]=(char *) (SvPV(ST(i+2),length[n])); + continue; + } + n++; + } + list[n]=(char *) NULL; + keep=list; + for (i=number_images=0; i < n; i++) + { + image=BlobToImage(info->image_info,list[i],length[i],exception); + if (image == (Image *) NULL) + break; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + number_images++; + } + } + /* + Free resources. + */ + for (i=0; i < n; i++) + if (list[i] != (char *) NULL) + for (p=keep; list[i] != *p++; ) + if (*p == (char *) NULL) + { + list[i]=(char *) RelinquishMagickMemory(list[i]); + break; + } + + PerlException: + if (list) + list=(char **) RelinquishMagickMemory(list); + if (length) + length=(STRLEN *) RelinquishMagickMemory(length); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) number_images); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# C l o n e # +# # +# # +# # +############################################################################### +# +# +void +Clone(ref) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + CopyImage = 1 + copy = 2 + copyimage = 3 + CloneImage = 4 + clone = 5 + cloneimage = 6 + Clone = 7 + PPCODE: + { + AV + *av; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *clone, + *image; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + for ( ; image; image=image->next) + { + clone=CloneImage(image,0,0,MagickTrue,exception); + if (clone == (Image *) NULL) + break; + AddImageToRegistry(sv,clone); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# C L O N E # +# # +# # +# # +############################################################################### +# +# +void +CLONE(ref,...) + SV *ref; + CODE: + { + PERL_UNUSED_VAR(ref); + if (magick_registry != (SplayTreeInfo *) NULL) + { + Image + *p; + + ResetSplayTreeIterator(magick_registry); + p=(Image *) GetNextKeyInSplayTree(magick_registry); + while (p != (Image *) NULL) + { + ReferenceImage(p); + p=(Image *) GetNextKeyInSplayTree(magick_registry); + } + } + } + +# +############################################################################### +# # +# # +# # +# C o a l e s c e # +# # +# # +# # +############################################################################### +# +# +void +Coalesce(ref) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + CoalesceImage = 1 + coalesce = 2 + coalesceimage = 3 + PPCODE: + { + AV + *av; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + image=CoalesceImages(image,exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# C o m p a r e # +# # +# # +# # +############################################################################### +# +# +void +Compare(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + CompareImage = 1 + compare = 2 + compareimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ChannelType + channel; + + double + distortion; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *difference_image, + *image, + *reconstruct_image; + + MetricType + metric; + + ssize_t + i; + + ssize_t + option; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + av=NULL; + attribute=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get attribute. + */ + channel=DefaultChannels; + reconstruct_image=image; + metric=RootMeanSquaredErrorMetric; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"channel") == 0) + { + ssize_t + option; + + option=ParseChannelOption(SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedType",SvPV(ST(i),na)); + return; + } + channel=(ChannelType) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(attribute,"fuzz") == 0) + { + image->fuzz=StringToDoubleInterval(SvPV(ST(i),na),100.0); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(attribute,"image") == 0) + { + reconstruct_image=SetupList(aTHX_ SvRV(ST(i)), + (struct PackageInfo **) NULL,(SV ***) NULL,exception); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"metric") == 0) + { + option=ParseCommandOption(MagickMetricOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + metric=(MetricType) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + difference_image=CompareImageChannels(image,reconstruct_image,channel, + metric,&distortion,exception); + if (difference_image != (Image *) NULL) + { + difference_image->error.mean_error_per_pixel=distortion; + AddImageToRegistry(sv,difference_image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# C o m p a r e L a y e r s # +# # +# # +# # +############################################################################### +# +# +void +CompareLayers(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + CompareImageLayers = 1 + comparelayers = 2 + compareimagelayers = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ImageLayerMethod + method; + + ssize_t + i; + + ssize_t + option; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + method=CompareAnyLayer; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"method") == 0) + { + option=ParseCommandOption(MagickLayerOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + method=(ImageLayerMethod) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=CompareImageLayers(image,method,exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# C o m p l e x I m a g e s # +# # +# # +# # +############################################################################### +# +# +void +ComplexImages(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + ComplexImages = 1 + compleximages = 2 + PPCODE: + { + AV + *av; + + char + *attribute, + *p; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ComplexOperator + op; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + op=UndefinedComplexOperator; + if (items == 2) + { + ssize_t + in; + + in=ParseCommandOption(MagickComplexOptions,MagickFalse,(char *) + SvPV(ST(1),na)); + if (in < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(1),na)); + return; + } + op=(ComplexOperator) in; + } + else + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'O': + case 'o': + { + if (LocaleCompare(attribute,"operator") == 0) + { + ssize_t + in; + + in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickComplexOptions,MagickFalse,SvPV(ST(i),na)); + if (in < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + op=(ComplexOperator) in; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=ComplexImages(image,op,exception); + if (image == (Image *) NULL) + goto PerlException; + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + (void) FormatLocaleString(info->image_info->filename,MaxTextExtent, + "complex-%.*s",(int) (MaxTextExtent-9), + ((p=strrchr(image->filename,'/')) ? p+1 : image->filename)); + (void) CopyMagickString(image->filename,info->image_info->filename, + MaxTextExtent); + SetImageInfo(info->image_info,0,exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# D e s t r o y # +# # +# # +# # +############################################################################### +# +# +void +DESTROY(ref) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + PPCODE: + { + SV + *reference; + + PERL_UNUSED_VAR(ref); + if (sv_isobject(ST(0)) == 0) + croak("ReferenceIsNotMyType"); + reference=SvRV(ST(0)); + switch (SvTYPE(reference)) + { + case SVt_PVAV: + { + char + message[MaxTextExtent]; + + const SV + *key; + + HV + *hv; + + GV + **gvp; + + struct PackageInfo + *info; + + SV + *sv; + + /* + Array (AV *) reference + */ + (void) FormatLocaleString(message,MaxTextExtent,"package%s%p", + XS_VERSION,reference); + hv=gv_stashpv(PackageName, FALSE); + if (!hv) + break; + gvp=(GV **) hv_fetch(hv,message,(long) strlen(message),FALSE); + if (!gvp) + break; + sv=GvSV(*gvp); + if (sv && (SvREFCNT(sv) == 1) && SvIOK(sv)) + { + info=INT2PTR(struct PackageInfo *,SvIV(sv)); + DestroyPackageInfo(info); + } + key=hv_delete(hv,message,(long) strlen(message),G_DISCARD); + (void) key; + break; + } + case SVt_PVMG: + { + Image + *image; + + /* + Blessed scalar = (Image *) SvIV(reference) + */ + image=INT2PTR(Image *,SvIV(reference)); + if (image != (Image *) NULL) + DeleteImageFromRegistry(reference,image); + break; + } + default: + break; + } + } + +# +############################################################################### +# # +# # +# # +# D i s p l a y # +# # +# # +# # +############################################################################### +# +# +void +Display(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + DisplayImage = 1 + display = 2 + displayimage = 3 + PPCODE: + { + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + i; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + package_info=(struct PackageInfo *) NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + package_info=ClonePackageInfo(info,exception); + if (items == 2) + SetAttribute(aTHX_ package_info,NULL,"server",ST(1),exception); + else + if (items > 2) + for (i=2; i < items; i+=2) + SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i), + exception); + (void) DisplayImages(package_info->image_info,image); + (void) CatchImageException(image); + InheritException(exception,&image->exception); + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# E v a l u a t e I m a g e s # +# # +# # +# # +############################################################################### +# +# +void +EvaluateImages(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + EvaluateImages = 1 + evaluateimages = 2 + PPCODE: + { + AV + *av; + + char + *attribute, + *p; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + MagickEvaluateOperator + op; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + op=MeanEvaluateOperator; + if (items == 2) + { + ssize_t + in; + + in=ParseCommandOption(MagickEvaluateOptions,MagickFalse,(char *) + SvPV(ST(1),na)); + if (in < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(1),na)); + return; + } + op=(MagickEvaluateOperator) in; + } + else + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'O': + case 'o': + { + if (LocaleCompare(attribute,"operator") == 0) + { + ssize_t + in; + + in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickEvaluateOptions,MagickFalse,SvPV(ST(i),na)); + if (in < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + op=(MagickEvaluateOperator) in; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=EvaluateImages(image,op,exception); + if (image == (Image *) NULL) + goto PerlException; + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + (void) FormatLocaleString(info->image_info->filename,MaxTextExtent, + "evaluate-%.*s",(int) (MaxTextExtent-9), + ((p=strrchr(image->filename,'/')) ? p+1 : image->filename)); + (void) CopyMagickString(image->filename,info->image_info->filename, + MaxTextExtent); + SetImageInfo(info->image_info,0,exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# F e a t u r e s # +# # +# # +# # +############################################################################### +# +# +void +Features(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + FeaturesImage = 1 + features = 2 + featuresimage = 3 + PPCODE: + { +#define ChannelFeatures(channel,direction) \ +{ \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].angular_second_moment[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].contrast[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].contrast[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].variance_sum_of_squares[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].inverse_difference_moment[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].sum_average[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].sum_variance[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].sum_entropy[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].entropy[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].difference_variance[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].difference_entropy[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].measure_of_correlation_1[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].measure_of_correlation_2[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_features[channel].maximum_correlation_coefficient[direction]); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ +} + + AV + *av; + + char + *attribute, + message[MaxTextExtent]; + + ChannelFeatures + *channel_features; + + double + distance; + + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + i; + + ssize_t + count; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + av=newAV(); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + distance=1.0; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'D': + case 'd': + { + if (LocaleCompare(attribute,"distance") == 0) + { + distance=StringToLong((char *) SvPV(ST(1),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + count=0; + for ( ; image; image=image->next) + { + channel_features=GetImageChannelFeatures(image,distance, + &image->exception); + if (channel_features == (ChannelFeatures *) NULL) + continue; + count++; + EXTEND(sp,280*count); + for (i=0; i < 4; i++) + { + ChannelFeatures(RedChannel,i); + ChannelFeatures(GreenChannel,i); + ChannelFeatures(BlueChannel,i); + if (image->colorspace == CMYKColorspace) + ChannelFeatures(IndexChannel,i); + if (image->matte != MagickFalse) + ChannelFeatures(OpacityChannel,i); + } + channel_features=(ChannelFeatures *) + RelinquishMagickMemory(channel_features); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# F l a t t e n # +# # +# # +# # +############################################################################### +# +# +void +Flatten(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + FlattenImage = 1 + flatten = 2 + flattenimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute, + *p; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + PixelPacket + background_color; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + background_color=image->background_color; + if (items == 2) + (void) QueryColorDatabase((char *) SvPV(ST(1),na),&background_color, + exception); + else + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'B': + case 'b': + { + if (LocaleCompare(attribute,"background") == 0) + { + (void) QueryColorDatabase((char *) SvPV(ST(1),na), + &background_color,exception); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image->background_color=background_color; + image=MergeImageLayers(image,FlattenLayer,exception); + if (image == (Image *) NULL) + goto PerlException; + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + (void) FormatLocaleString(info->image_info->filename,MaxTextExtent, + "flatten-%.*s",(int) (MaxTextExtent-9), + ((p=strrchr(image->filename,'/')) ? p+1 : image->filename)); + (void) CopyMagickString(image->filename,info->image_info->filename, + MaxTextExtent); + SetImageInfo(info->image_info,0,exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); /* return messages in string context */ + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# F x # +# # +# # +# # +############################################################################### +# +# +void +Fx(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + FxImage = 1 + fx = 2 + fximage = 3 + PPCODE: + { + AV + *av; + + char + *attribute, + expression[MaxTextExtent]; + + ChannelType + channel; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + attribute=NULL; + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get options. + */ + channel=DefaultChannels; + (void) CopyMagickString(expression,"u",MaxTextExtent); + if (items == 2) + (void) CopyMagickString(expression,(char *) SvPV(ST(1),na),MaxTextExtent); + else + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"channel") == 0) + { + ssize_t + option; + + option=ParseChannelOption(SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedType",SvPV(ST(i),na)); + return; + } + channel=(ChannelType) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(attribute,"expression") == 0) + { + (void) CopyMagickString(expression,SvPV(ST(i),na), + MaxTextExtent); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=FxImageChannel(image,channel,expression,exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# G e t # +# # +# # +# # +############################################################################### +# +# +void +Get(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + GetAttributes = 1 + GetAttribute = 2 + get = 3 + getattributes = 4 + getattribute = 5 + PPCODE: + { + char + *attribute, + color[MaxTextExtent]; + + const char + *value; + + ExceptionInfo + *exception; + + Image + *image; + + long + j; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *s; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + XSRETURN_EMPTY; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL && !info) + XSRETURN_EMPTY; + EXTEND(sp,items); + for (i=1; i < items; i++) + { + attribute=(char *) SvPV(ST(i),na); + s=NULL; + switch (*attribute) + { + case 'A': + case 'a': + { + if (LocaleCompare(attribute,"adjoin") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->adjoin); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"antialias") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->antialias); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"area") == 0) + { + s=newSViv(GetMagickResource(AreaResource)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"attenuate") == 0) + { + const char + *value; + + value=GetImageProperty(image,attribute); + if (value != (const char *) NULL) + s=newSVpv(value,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"authenticate") == 0) + { + if (info) + s=newSVpv(info->image_info->authenticate,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'B': + case 'b': + { + if (LocaleCompare(attribute,"background") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + image->background_color.red,image->background_color.green, + image->background_color.blue,image->background_color.opacity); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"base-columns") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->magick_columns); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"base-filename") == 0) + { + if (image != (Image *) NULL) + s=newSVpv(image->magick_filename,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"base-height") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->magick_rows); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"base-rows") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->magick_rows); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"base-width") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->magick_columns); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"bias") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->bias); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"blue-primary") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,"%.20g,%.15g", + image->chromaticity.blue_primary.x, + image->chromaticity.blue_primary.y); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"bordercolor") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + image->border_color.red,image->border_color.green, + image->border_color.blue,image->border_color.opacity); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"bounding-box") == 0) + { + char + geometry[MaxTextExtent]; + + RectangleInfo + page; + + if (image == (Image *) NULL) + break; + page=GetImageBoundingBox(image,&image->exception); + (void) FormatLocaleString(geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) page.width,(double) + page.height,(double) page.x,(double) page.y); + s=newSVpv(geometry,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"class") == 0) + { + if (image == (Image *) NULL) + break; + s=newSViv(image->storage_class); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickClassOptions, + image->storage_class)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"clip-mask") == 0) + { + if (image != (Image *) NULL) + { + SV + *sv; + + sv=NULL; + if (image->mask == (Image *) NULL) + ClipImage(image); + if (image->mask != (Image *) NULL) + { + AddImageToRegistry(sv,image->mask); + s=sv_bless(newRV(sv),SvSTASH(reference)); + } + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"clip-path") == 0) + { + if (image != (Image *) NULL) + { + SV + *sv; + + sv=NULL; + if (image->clip_mask == (Image *) NULL) + ClipImage(image); + if (image->clip_mask != (Image *) NULL) + { + AddImageToRegistry(sv,image->clip_mask); + s=sv_bless(newRV(sv),SvSTASH(reference)); + } + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"compression") == 0) + { + j=info ? info->image_info->compression : image ? + image->compression : UndefinedCompression; + if (info) + if (info->image_info->compression == UndefinedCompression) + j=image->compression; + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickCompressOptions, + j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"colorspace") == 0) + { + j=image ? image->colorspace : RGBColorspace; + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickColorspaceOptions, + j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"colors") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) GetNumberColors(image,(FILE *) NULL, + &image->exception)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleNCompare(attribute,"colormap",8) == 0) + { + int + items; + + if (image == (Image *) NULL || !image->colormap) + break; + j=0; + items=sscanf(attribute,"%*[^[][%ld",&j); + (void) items; + if (j > (ssize_t) image->colors) + j%=image->colors; + (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + image->colormap[j].red,image->colormap[j].green, + image->colormap[j].blue,image->colormap[j].opacity); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"columns") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->columns); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"comment") == 0) + { + const char + *value; + + value=GetImageProperty(image,attribute); + if (value != (const char *) NULL) + s=newSVpv(value,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"copyright") == 0) + { + s=newSVpv(GetMagickCopyright(),0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(attribute,"density") == 0) + { + char + geometry[MaxTextExtent]; + + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.15g", + image->x_resolution,image->y_resolution); + s=newSVpv(geometry,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"delay") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->delay); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"depth") == 0) + { + s=newSViv(MAGICKCORE_QUANTUM_DEPTH); + if (image != (Image *) NULL) + s=newSViv((ssize_t) GetImageDepth(image,&image->exception)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"directory") == 0) + { + if (image && image->directory) + s=newSVpv(image->directory,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"dispose") == 0) + { + if (image == (Image *) NULL) + break; + + s=newSViv(image->dispose); + (void) sv_setpv(s, + CommandOptionToMnemonic(MagickDisposeOptions,image->dispose)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"disk") == 0) + { + s=newSViv(GetMagickResource(DiskResource)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"dither") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->dither); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"display") == 0) /* same as server */ + { + if (info && info->image_info->server_name) + s=newSVpv(info->image_info->server_name,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(attribute,"elapsed-time") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(GetElapsedTime(&image->timer)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"endian") == 0) + { + j=info ? info->image_info->endian : image ? image->endian : + UndefinedEndian; + if (info) + if (info->image_info->endian == UndefinedEndian) + j=image->endian; + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickEndianOptions,j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"error") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->error.mean_error_per_pixel); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(attribute,"filesize") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) GetBlobSize(image)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"filename") == 0) + { + if (image != (Image *) NULL) + s=newSVpv(image->filename,0); + else + if (info && *info->image_info->filename) + s=newSVpv(info->image_info->filename,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"filter") == 0) + { + s=image ? newSViv(image->filter) : newSViv(0); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickFilterOptions, + image->filter)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"font") == 0) + { + if (info && info->image_info->font) + s=newSVpv(info->image_info->font,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"foreground") == 0) + continue; + if (LocaleCompare(attribute,"format") == 0) + { + const MagickInfo + *magick_info; + + magick_info=(const MagickInfo *) NULL; + if (info && (*info->image_info->magick != '\0')) + magick_info=GetMagickInfo(info->image_info->magick,exception); + if (image != (Image *) NULL) + magick_info=GetMagickInfo(image->magick,&image->exception); + if ((magick_info != (const MagickInfo *) NULL) && + (*magick_info->description != '\0')) + s=newSVpv((char *) magick_info->description,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"fuzz") == 0) + { + if (info) + s=newSVnv(info->image_info->fuzz); + if (image != (Image *) NULL) + s=newSVnv(image->fuzz); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(attribute,"gamma") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->gamma); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"geometry") == 0) + { + if (image && image->geometry) + s=newSVpv(image->geometry,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"gravity") == 0) + { + s=image ? newSViv(image->gravity) : newSViv(0); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickGravityOptions, + image->gravity)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"green-primary") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,"%.20g,%.15g", + image->chromaticity.green_primary.x, + image->chromaticity.green_primary.y); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(attribute,"height") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->rows); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(attribute,"icc") == 0) + { + if (image != (Image *) NULL) + { + const StringInfo + *profile; + + profile=GetImageProfile(image,"icc"); + if (profile != (StringInfo *) NULL) + s=newSVpv((const char *) GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"icm") == 0) + { + if (image != (Image *) NULL) + { + const StringInfo + *profile; + + profile=GetImageProfile(image,"icm"); + if (profile != (const StringInfo *) NULL) + s=newSVpv((const char *) GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"id") == 0) + { + if (image != (Image *) NULL) + { + char + key[MaxTextExtent]; + + MagickBooleanType + status; + + static ssize_t + id = 0; + + (void) FormatLocaleString(key,MaxTextExtent,"%.20g\n",(double) + id); + status=SetImageRegistry(ImageRegistryType,key,image, + &image->exception); + (void) status; + s=newSViv(id++); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleNCompare(attribute,"index",5) == 0) + { + char + name[MaxTextExtent]; + + int + items; + + long + x, + y; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + CacheView + *image_view; + + if (image == (Image *) NULL) + break; + if (image->storage_class != PseudoClass) + break; + x=0; + y=0; + items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y); + (void) items; + image_view=AcquireVirtualCacheView(image,exception); + p=GetCacheViewVirtualPixels(image_view,x,y,1,1,&image->exception); + if (p != (const PixelPacket *) NULL) + { + indexes=GetCacheViewVirtualIndexQueue(image_view); + (void) FormatLocaleString(name,MaxTextExtent,QuantumFormat, + GetPixelIndex(indexes)); + s=newSVpv(name,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + } + image_view=DestroyCacheView(image_view); + continue; + } + if (LocaleCompare(attribute,"iptc") == 0) + { + if (image != (Image *) NULL) + { + const StringInfo + *profile; + + profile=GetImageProfile(image,"iptc"); + if (profile != (const StringInfo *) NULL) + s=newSVpv((const char *) GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"iterations") == 0) /* same as loop */ + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->iterations); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"interlace") == 0) + { + j=info ? info->image_info->interlace : image ? image->interlace : + UndefinedInterlace; + if (info) + if (info->image_info->interlace == UndefinedInterlace) + j=image->interlace; + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickInterlaceOptions, + j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'L': + case 'l': + { + if (LocaleCompare(attribute,"label") == 0) + { + const char + *value; + + if (image == (Image *) NULL) + break; + value=GetImageProperty(image,"Label"); + if (value != (const char *) NULL) + s=newSVpv(value,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"loop") == 0) /* same as iterations */ + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->iterations); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"magick") == 0) + { + if (info && *info->image_info->magick) + s=newSVpv(info->image_info->magick,0); + if (image != (Image *) NULL) + s=newSVpv(image->magick,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"map") == 0) + { + s=newSViv(GetMagickResource(MapResource)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"maximum-error") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->error.normalized_maximum_error); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"memory") == 0) + { + s=newSViv(GetMagickResource(MemoryResource)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"mean-error") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->error.normalized_mean_error); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"mime") == 0) + { + if (info && *info->image_info->magick) + s=newSVpv(MagickToMime(info->image_info->magick),0); + if (image != (Image *) NULL) + s=newSVpv(MagickToMime(image->magick),0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"mattecolor") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + image->matte_color.red,image->matte_color.green, + image->matte_color.blue,image->matte_color.opacity); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"matte") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->matte); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"mime") == 0) + { + const char + *magick; + + magick=NULL; + if (info && *info->image_info->magick) + magick=info->image_info->magick; + if (image != (Image *) NULL) + magick=image->magick; + if (magick) + { + char + *mime; + + mime=MagickToMime(magick); + s=newSVpv(mime,0); + mime=(char *) RelinquishMagickMemory(mime); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"monochrome") == 0) + { + if (image == (Image *) NULL) + continue; + j=info ? info->image_info->monochrome : + IsMonochromeImage(image,&image->exception); + s=newSViv(j); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"montage") == 0) + { + if (image && image->montage) + s=newSVpv(image->montage,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(attribute,"orientation") == 0) + { + j=info ? info->image_info->orientation : image ? + image->orientation : UndefinedOrientation; + if (info) + if (info->image_info->orientation == UndefinedOrientation) + j=image->orientation; + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickOrientationOptions, + j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(attribute,"page") == 0) + { + if (info && info->image_info->page) + s=newSVpv(info->image_info->page,0); + if (image != (Image *) NULL) + { + char + geometry[MaxTextExtent]; + + (void) FormatLocaleString(geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) image->page.width, + (double) image->page.height,(double) image->page.x,(double) + image->page.y); + s=newSVpv(geometry,0); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"page.x") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->page.x); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"page.y") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->page.y); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleNCompare(attribute,"pixel",5) == 0) + { + char + tuple[MaxTextExtent]; + + int + items; + + long + x, + y; + + const PixelPacket + *p; + + const IndexPacket + *indexes; + + if (image == (Image *) NULL) + break; + x=0; + y=0; + items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y); + (void) items; + p=GetVirtualPixels(image,x,y,1,1,exception); + indexes=GetVirtualIndexQueue(image); + if (image->colorspace != CMYKColorspace) + (void) FormatLocaleString(tuple,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + GetPixelRed(p),GetPixelGreen(p), + GetPixelBlue(p),GetPixelOpacity(p)); + else + (void) FormatLocaleString(tuple,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat "," + QuantumFormat,GetPixelRed(p), + GetPixelGreen(p),GetPixelBlue(p), + GetPixelIndex(indexes),GetPixelOpacity(p)); + s=newSVpv(tuple,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"pointsize") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->pointsize); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"precision") == 0) + { + s=newSViv((ssize_t) GetMagickPrecision()); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"preview") == 0) + { + s=newSViv(info->image_info->preview_type); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickPreviewOptions, + info->image_info->preview_type)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'Q': + case 'q': + { + if (LocaleCompare(attribute,"quality") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->quality); + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->quality); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"quantum") == 0) + { + if (info) + s=newSViv((ssize_t) MAGICKCORE_QUANTUM_DEPTH); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(attribute,"rendering-intent") == 0) + { + s=newSViv(image->rendering_intent); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickIntentOptions, + image->rendering_intent)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"red-primary") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,"%.20g,%.15g", + image->chromaticity.red_primary.x, + image->chromaticity.red_primary.y); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"rows") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->rows); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(attribute,"sampling-factor") == 0) + { + if (info && info->image_info->sampling_factor) + s=newSVpv(info->image_info->sampling_factor,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"subimage") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->subimage); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"subrange") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->subrange); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"server") == 0) /* same as display */ + { + if (info && info->image_info->server_name) + s=newSVpv(info->image_info->server_name,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"size") == 0) + { + if (info && info->image_info->size) + s=newSVpv(info->image_info->size,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"scene") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->scene); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"scenes") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) info->image_info->number_scenes); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"signature") == 0) + { + const char + *value; + + if (image == (Image *) NULL) + break; + (void) SignatureImage(image); + value=GetImageProperty(image,"Signature"); + if (value != (const char *) NULL) + s=newSVpv(value,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(attribute,"taint") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) IsTaintImage(image)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"tile") == 0) + { + if (info && info->image_info->tile) + s=newSVpv(info->image_info->tile,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"texture") == 0) + { + if (info && info->image_info->texture) + s=newSVpv(info->image_info->texture,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"total-ink-density") == 0) + { + s=newSViv(MAGICKCORE_QUANTUM_DEPTH); + if (image != (Image *) NULL) + s=newSVnv(GetImageTotalInkDensity(image)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"transparent-color") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat, + image->transparent_color.red,image->transparent_color.green, + image->transparent_color.blue,image->transparent_color.opacity); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"type") == 0) + { + if (image == (Image *) NULL) + break; + j=(ssize_t) GetImageType(image,&image->exception); + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic(MagickTypeOptions,j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'U': + case 'u': + { + if (LocaleCompare(attribute,"units") == 0) + { + j=info ? info->image_info->units : image ? image->units : + UndefinedResolution; + if (info) + if (info->image_info->units == UndefinedResolution) + j=image->units; + if (j == UndefinedResolution) + s=newSVpv("undefined units",0); + else + if (j == PixelsPerInchResolution) + s=newSVpv("pixels / inch",0); + else + s=newSVpv("pixels / centimeter",0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"user-time") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(GetUserTime(&image->timer)); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'V': + case 'v': + { + if (LocaleCompare(attribute,"verbose") == 0) + { + if (info) + s=newSViv((ssize_t) info->image_info->verbose); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"version") == 0) + { + s=newSVpv(GetMagickVersion((size_t *) NULL),0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"view") == 0) + { + if (info && info->image_info->view) + s=newSVpv(info->image_info->view,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"virtual-pixel") == 0) + { + if (image == (Image *) NULL) + break; + j=(ssize_t) GetImageVirtualPixelMethod(image); + s=newSViv(j); + (void) sv_setpv(s,CommandOptionToMnemonic( + MagickVirtualPixelOptions,j)); + SvIOK_on(s); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(attribute,"white-point") == 0) + { + if (image == (Image *) NULL) + break; + (void) FormatLocaleString(color,MaxTextExtent,"%.20g,%.15g", + image->chromaticity.white_point.x, + image->chromaticity.white_point.y); + s=newSVpv(color,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"width") == 0) + { + if (image != (Image *) NULL) + s=newSViv((ssize_t) image->columns); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(attribute,"xmp") == 0) + { + if (image != (Image *) NULL) + { + const StringInfo + *profile; + + profile=GetImageProfile(image,"xmp"); + if (profile != (StringInfo *) NULL) + s=newSVpv((const char *) GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + } + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + if (LocaleCompare(attribute,"x-resolution") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->x_resolution); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(attribute,"y-resolution") == 0) + { + if (image != (Image *) NULL) + s=newSVnv(image->y_resolution); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + break; + } + if (image == (Image *) NULL) + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute) + else + { + value=GetImageProperty(image,attribute); + if (value != (const char *) NULL) + { + s=newSVpv(value,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + } + else + if (*attribute != '%') + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute) + else + { + char + *meta; + + meta=InterpretImageProperties(info ? info->image_info : + (ImageInfo *) NULL,image,attribute); + s=newSVpv(meta,0); + PUSHs(s ? sv_2mortal(s) : &sv_undef); + meta=(char *) RelinquishMagickMemory(meta); + } + } + } + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + } + +# +############################################################################### +# # +# # +# # +# G e t A u t h e n t i c P i x e l s # +# # +# # +# # +############################################################################### +# +# +void * +GetAuthenticPixels(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + getauthenticpixels = 1 + GetImagePixels = 2 + getimagepixels = 3 + CODE: + { + char + *attribute; + + ExceptionInfo + *exception; + + Image + *image; + + RectangleInfo + region; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + void + *blob = NULL; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + + region.x=0; + region.y=0; + region.width=image->columns; + region.height=1; + if (items == 1) + (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(attribute,"height") == 0) + { + region.height=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(attribute,"x") == 0) + { + region.x=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(attribute,"y") == 0) + { + region.y=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(attribute,"width") == 0) + { + region.width=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + } + } + blob=(void *) GetAuthenticPixels(image,region.x,region.y,region.width, + region.height,exception); + if (blob != (void *) NULL) + goto PerlEnd; + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + + PerlEnd: + RETVAL = blob; + } + OUTPUT: + RETVAL + +# +############################################################################### +# # +# # +# # +# G e t V i r t u a l P i x e l s # +# # +# # +# # +############################################################################### +# +# +void * +GetVirtualPixels(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + getvirtualpixels = 1 + AcquireImagePixels = 2 + acquireimagepixels = 3 + CODE: + { + char + *attribute; + + const void + *blob = NULL; + + ExceptionInfo + *exception; + + Image + *image; + + RectangleInfo + region; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + + region.x=0; + region.y=0; + region.width=image->columns; + region.height=1; + if (items == 1) + (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(attribute,"height") == 0) + { + region.height=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(attribute,"x") == 0) + { + region.x=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(attribute,"y") == 0) + { + region.y=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(attribute,"width") == 0) + { + region.width=SvIV(ST(i)); + continue; + } + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + break; + } + } + } + blob=(const void *) GetVirtualPixels(image,region.x,region.y,region.width, + region.height,exception); + if (blob != (void *) NULL) + goto PerlEnd; + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + + PerlEnd: + RETVAL = (void *) blob; + } + OUTPUT: + RETVAL + +# +############################################################################### +# # +# # +# # +# G e t A u t h e n t i c I n d e x Q u e u e # +# # +# # +# # +############################################################################### +# +# +void * +GetAuthenticIndexQueue(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + getauthenticindexqueue = 1 + GetIndexes = 2 + getindexes = 3 + CODE: + { + ExceptionInfo + *exception; + + Image + *image; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + void + *blob = NULL; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + + blob=(void *) GetAuthenticIndexQueue(image); + if (blob != (void *) NULL) + goto PerlEnd; + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + + PerlEnd: + RETVAL = blob; + } + OUTPUT: + RETVAL + +# +############################################################################### +# # +# # +# # +# G e t V i r t u a l I n d e x Q u e u e # +# # +# # +# # +############################################################################### +# +# +void * +GetVirtualIndexQueue(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + getvirtualindexqueue = 1 + CODE: + { + ExceptionInfo + *exception; + + Image + *image; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + void + *blob = NULL; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + + blob=(void *) GetVirtualIndexQueue(image); + if (blob != (void *) NULL) + goto PerlEnd; + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + + PerlEnd: + RETVAL = blob; + } + OUTPUT: + RETVAL + +# +############################################################################### +# # +# # +# # +# H i s t o g r a m # +# # +# # +# # +############################################################################### +# +# +void +Histogram(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + HistogramImage = 1 + histogram = 2 + histogramimage = 3 + PPCODE: + { + AV + *av; + + char + message[MaxTextExtent]; + + ColorPacket + *histogram; + + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + i; + + ssize_t + count; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + size_t + number_colors; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + av=newAV(); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + count=0; + for ( ; image; image=image->next) + { + histogram=GetImageHistogram(image,&number_colors,&image->exception); + if (histogram == (ColorPacket *) NULL) + continue; + count+=(ssize_t) number_colors; + EXTEND(sp,6*count); + for (i=0; i < (ssize_t) number_colors; i++) + { + (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat, + histogram[i].pixel.red); + PUSHs(sv_2mortal(newSVpv(message,0))); + (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat, + histogram[i].pixel.green); + PUSHs(sv_2mortal(newSVpv(message,0))); + (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat, + histogram[i].pixel.blue); + PUSHs(sv_2mortal(newSVpv(message,0))); + if (image->colorspace == CMYKColorspace) + { + (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat, + histogram[i].index); + PUSHs(sv_2mortal(newSVpv(message,0))); + } + (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat, + histogram[i].pixel.opacity); + PUSHs(sv_2mortal(newSVpv(message,0))); + (void) FormatLocaleString(message,MaxTextExtent,"%.20g",(double) + histogram[i].count); + PUSHs(sv_2mortal(newSVpv(message,0))); + } + histogram=(ColorPacket *) RelinquishMagickMemory(histogram); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# G e t P i x e l # +# # +# # +# # +############################################################################### +# +# +void +GetPixel(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + getpixel = 1 + getPixel = 2 + PPCODE: + { + AV + *av; + + char + *attribute; + + ChannelType + channel; + + ExceptionInfo + *exception; + + Image + *image; + + MagickBooleanType + normalize; + + RectangleInfo + region; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i; + + ssize_t + option; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + channel=DefaultChannels; + normalize=MagickTrue; + region.x=0; + region.y=0; + region.width=image->columns; + region.height=1; + if (items == 1) + (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"channel") == 0) + { + ssize_t + option; + + option=ParseChannelOption(SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + channel=(ChannelType) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'N': + case 'n': + { + if (LocaleCompare(attribute,"normalize") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + normalize=option != 0 ? MagickTrue : MagickFalse; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'x': + case 'X': + { + if (LocaleCompare(attribute,"x") == 0) + { + region.x=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'y': + case 'Y': + { + if (LocaleCompare(attribute,"y") == 0) + { + region.y=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + p=GetVirtualPixels(image,region.x,region.y,1,1,exception); + if (p == (const PixelPacket *) NULL) + PUSHs(&sv_undef); + else + { + double + scale; + + indexes=GetVirtualIndexQueue(image); + scale=1.0; + if (normalize != MagickFalse) + scale=1.0/QuantumRange; + if ((channel & RedChannel) != 0) + PUSHs(sv_2mortal(newSVnv(scale*GetPixelRed(p)))); + if ((channel & GreenChannel) != 0) + PUSHs(sv_2mortal(newSVnv(scale*GetPixelGreen(p)))); + if ((channel & BlueChannel) != 0) + PUSHs(sv_2mortal(newSVnv(scale*GetPixelBlue(p)))); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + PUSHs(sv_2mortal(newSVnv(scale*GetPixelIndex(indexes)))); + if ((channel & OpacityChannel) != 0) + PUSHs(sv_2mortal(newSVnv(scale*GetPixelOpacity(p)))); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# G e t P i x e l s # +# # +# # +# # +############################################################################### +# +# +void +GetPixels(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + getpixels = 1 + getPixels = 2 + PPCODE: + { + AV + *av; + + char + *attribute; + + const char + *map; + + ExceptionInfo + *exception; + + Image + *image; + + MagickBooleanType + normalize, + status; + + RectangleInfo + region; + + ssize_t + i; + + ssize_t + option; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + map="RGB"; + if (image->matte != MagickFalse) + map="RGBA"; + if (image->colorspace == CMYKColorspace) + { + map="CMYK"; + if (image->matte != MagickFalse) + map="CMYKA"; + } + normalize=MagickFalse; + region.x=0; + region.y=0; + region.width=image->columns; + region.height=1; + if (items == 1) + (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(attribute,"height") == 0) + { + region.height=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"map") == 0) + { + map=SvPV(ST(i),na); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'N': + case 'n': + { + if (LocaleCompare(attribute,"normalize") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + normalize=option != 0 ? MagickTrue : MagickFalse; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(attribute,"width") == 0) + { + region.width=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'x': + case 'X': + { + if (LocaleCompare(attribute,"x") == 0) + { + region.x=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'y': + case 'Y': + { + if (LocaleCompare(attribute,"y") == 0) + { + region.y=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + if (normalize != MagickFalse) + { + float + *pixels; + + MemoryInfo + *pixels_info; + + pixels_info=AcquireVirtualMemory(strlen(map)*region.width, + region.height*sizeof(*pixels)); + if (pixels_info == (MemoryInfo *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + pixels=(float *) GetVirtualMemoryBlob(pixels_info); + status=ExportImagePixels(image,region.x,region.y,region.width, + region.height,map,FloatPixel,pixels,exception); + if (status == MagickFalse) + PUSHs(&sv_undef); + else + { + EXTEND(sp,strlen(map)*region.width*region.height); + for (i=0; i < (ssize_t) (strlen(map)*region.width*region.height); i++) + PUSHs(sv_2mortal(newSVnv(pixels[i]))); + } + pixels_info=RelinquishVirtualMemory(pixels_info); + } + else + { + MemoryInfo + *pixels_info; + + Quantum + *pixels; + + pixels_info=AcquireVirtualMemory(strlen(map)*region.width, + region.height*sizeof(*pixels)); + if (pixels_info == (MemoryInfo *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + pixels=(Quantum *) GetVirtualMemoryBlob(pixels_info); + status=ExportImagePixels(image,region.x,region.y,region.width, + region.height,map,QuantumPixel,pixels,exception); + if (status == MagickFalse) + PUSHs(&sv_undef); + else + { + EXTEND(sp,strlen(map)*region.width*region.height); + for (i=0; i < (ssize_t) (strlen(map)*region.width*region.height); i++) + PUSHs(sv_2mortal(newSViv(pixels[i]))); + } + pixels_info=RelinquishVirtualMemory(pixels_info); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# I m a g e T o B l o b # +# # +# # +# # +############################################################################### +# +# +void +ImageToBlob(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + ImageToBlob = 1 + imagetoblob = 2 + toblob = 3 + blob = 4 + PPCODE: + { + char + filename[MaxTextExtent]; + + ExceptionInfo + *exception; + + Image + *image, + *next; + + ssize_t + i; + + struct PackageInfo + *info, + *package_info; + + size_t + length; + + ssize_t + scene; + + SV + *perl_exception, + *reference; + + void + *blob; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + package_info=(struct PackageInfo *) NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + package_info=ClonePackageInfo(info,exception); + for (i=2; i < items; i+=2) + SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i),exception); + (void) CopyMagickString(filename,package_info->image_info->filename, + MaxTextExtent); + scene=0; + for (next=image; next; next=next->next) + { + (void) CopyMagickString(next->filename,filename,MaxTextExtent); + next->scene=scene++; + } + SetImageInfo(package_info->image_info,(unsigned int) + GetImageListLength(image),&image->exception); + EXTEND(sp,(ssize_t) GetImageListLength(image)); + for ( ; image; image=image->next) + { + length=0; + blob=ImagesToBlob(package_info->image_info,image,&length,exception); + if (blob != (char *) NULL) + { + PUSHs(sv_2mortal(newSVpv((const char *) blob,length))); + blob=(unsigned char *) RelinquishMagickMemory(blob); + } + if (package_info->image_info->adjoin) + break; + } + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + } + +# +############################################################################### +# # +# # +# # +# L a y e r s # +# # +# # +# # +############################################################################### +# +# +void +Layers(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + Layers = 1 + layers = 2 + OptimizeImageLayers = 3 + optimizelayers = 4 + optimizeimagelayers = 5 + PPCODE: + { + AV + *av; + + char + *attribute; + + CompositeOperator + compose; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image, + *layers; + + ImageLayerMethod + method; + + ssize_t + i; + + ssize_t + option, + sp; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + compose=image->compose; + method=OptimizeLayer; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"compose") == 0) + { + sp=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickComposeOptions,MagickFalse,SvPV(ST(i),na)); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + compose=(CompositeOperator) sp; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"method") == 0) + { + option=ParseCommandOption(MagickLayerOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + method=(ImageLayerMethod) option; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + layers=(Image *) NULL; + switch (method) + { + case CompareAnyLayer: + case CompareClearLayer: + case CompareOverlayLayer: + default: + { + layers=CompareImageLayers(image,method,exception); + break; + } + case MergeLayer: + case FlattenLayer: + case MosaicLayer: + { + layers=MergeImageLayers(image,method,exception); + break; + } + case DisposeLayer: + { + layers=DisposeImages(image,exception); + break; + } + case OptimizeImageLayer: + { + layers=OptimizeImageLayers(image,exception); + break; + } + case OptimizePlusLayer: + { + layers=OptimizePlusImageLayers(image,exception); + break; + } + case OptimizeTransLayer: + { + OptimizeImageTransparency(image,exception); + InheritException(&(image->exception),exception); + break; + } + case RemoveDupsLayer: + { + RemoveDuplicateLayers(&image,exception); + InheritException(&(image->exception),exception); + break; + } + case RemoveZeroLayer: + { + RemoveZeroDelayLayers(&image,exception); + InheritException(&(image->exception),exception); + break; + } + case OptimizeLayer: + { + QuantizeInfo + *quantize_info; + + /* + General Purpose, GIF Animation Optimizer. + */ + layers=CoalesceImages(image,exception); + if (layers == (Image *) NULL) + break; + InheritException(&(layers->exception),exception); + image=layers; + layers=OptimizeImageLayers(image,exception); + if (layers == (Image *) NULL) + break; + InheritException(&(layers->exception),exception); + image=DestroyImageList(image); + image=layers; + layers=(Image *) NULL; + OptimizeImageTransparency(image,exception); + InheritException(&(image->exception),exception); + quantize_info=AcquireQuantizeInfo(info->image_info); + (void) RemapImages(quantize_info,image,(Image *) NULL); + quantize_info=DestroyQuantizeInfo(quantize_info); + break; + } + case CompositeLayer: + { + Image + *source; + + RectangleInfo + geometry; + + /* + Split image sequence at the first 'NULL:' image. + */ + source=image; + while (source != (Image *) NULL) + { + source=GetNextImageInList(source); + if ((source != (Image *) NULL) && + (LocaleCompare(source->magick,"NULL") == 0)) + break; + } + if (source != (Image *) NULL) + { + if ((GetPreviousImageInList(source) == (Image *) NULL) || + (GetNextImageInList(source) == (Image *) NULL)) + source=(Image *) NULL; + else + { + /* + Separate the two lists, junk the null: image. + */ + source=SplitImageList(source->previous); + DeleteImageFromList(&source); + } + } + if (source == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"MissingNullSeparator","layers Composite"); + break; + } + /* + Adjust offset with gravity and virtual canvas. + */ + SetGeometry(image,&geometry); + (void) ParseAbsoluteGeometry(image->geometry,&geometry); + geometry.width=source->page.width != 0 ? source->page.width : + source->columns; + geometry.height=source->page.height != 0 ? source->page.height : + source->rows; + GravityAdjustGeometry(image->page.width != 0 ? image->page.width : + image->columns,image->page.height != 0 ? image->page.height : + image->rows,image->gravity,&geometry); + CompositeLayers(image,compose,source,geometry.x,geometry.y,exception); + source=DestroyImageList(source); + InheritException(&(image->exception),exception); + break; + } + } + if (layers == (Image *) NULL) + image=CloneImage(image,0,0,MagickTrue,exception); + else + { + InheritException(&(layers->exception),exception); + image=layers; + } + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# M a g i c k T o M i m e # +# # +# # +# # +############################################################################### +# +# +SV * +MagickToMime(ref,name) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + char *name + ALIAS: + magicktomime = 1 + CODE: + { + char + *mime; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + mime=MagickToMime(name); + RETVAL=newSVpv(mime,0); + mime=(char *) RelinquishMagickMemory(mime); + } + OUTPUT: + RETVAL + +# +############################################################################### +# # +# # +# # +# M o g r i f y # +# # +# # +# # +############################################################################### +# +# +void +Mogrify(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + Comment = 1 + CommentImage = 2 + Label = 3 + LabelImage = 4 + AddNoise = 5 + AddNoiseImage = 6 + Colorize = 7 + ColorizeImage = 8 + Border = 9 + BorderImage = 10 + Blur = 11 + BlurImage = 12 + Chop = 13 + ChopImage = 14 + Crop = 15 + CropImage = 16 + Despeckle = 17 + DespeckleImage = 18 + Edge = 19 + EdgeImage = 20 + Emboss = 21 + EmbossImage = 22 + Enhance = 23 + EnhanceImage = 24 + Flip = 25 + FlipImage = 26 + Flop = 27 + FlopImage = 28 + Frame = 29 + FrameImage = 30 + Implode = 31 + ImplodeImage = 32 + Magnify = 33 + MagnifyImage = 34 + MedianFilter = 35 + MedianFilterImage = 36 + Minify = 37 + MinifyImage = 38 + OilPaint = 39 + OilPaintImage = 40 + ReduceNoise = 41 + ReduceNoiseImage = 42 + Roll = 43 + RollImage = 44 + Rotate = 45 + RotateImage = 46 + Sample = 47 + SampleImage = 48 + Scale = 49 + ScaleImage = 50 + Shade = 51 + ShadeImage = 52 + Sharpen = 53 + SharpenImage = 54 + Shear = 55 + ShearImage = 56 + Spread = 57 + SpreadImage = 58 + Swirl = 59 + SwirlImage = 60 + Resize = 61 + ResizeImage = 62 + Zoom = 63 + ZoomImage = 64 + Annotate = 65 + AnnotateImage = 66 + ColorFloodfill = 67 + ColorFloodfillImage= 68 + Composite = 69 + CompositeImage = 70 + Contrast = 71 + ContrastImage = 72 + CycleColormap = 73 + CycleColormapImage = 74 + Draw = 75 + DrawImage = 76 + Equalize = 77 + EqualizeImage = 78 + Gamma = 79 + GammaImage = 80 + Map = 81 + MapImage = 82 + MatteFloodfill = 83 + MatteFloodfillImage= 84 + Modulate = 85 + ModulateImage = 86 + Negate = 87 + NegateImage = 88 + Normalize = 89 + NormalizeImage = 90 + NumberColors = 91 + NumberColorsImage = 92 + Opaque = 93 + OpaqueImage = 94 + Quantize = 95 + QuantizeImage = 96 + Raise = 97 + RaiseImage = 98 + Segment = 99 + SegmentImage = 100 + Signature = 101 + SignatureImage = 102 + Solarize = 103 + SolarizeImage = 104 + Sync = 105 + SyncImage = 106 + Texture = 107 + TextureImage = 108 + Evaluate = 109 + EvaluateImage = 110 + Transparent = 111 + TransparentImage = 112 + Threshold = 113 + ThresholdImage = 114 + Charcoal = 115 + CharcoalImage = 116 + Trim = 117 + TrimImage = 118 + Wave = 119 + WaveImage = 120 + Separate = 121 + SeparateImage = 122 + Stereo = 125 + StereoImage = 126 + Stegano = 127 + SteganoImage = 128 + Deconstruct = 129 + DeconstructImage = 130 + GaussianBlur = 131 + GaussianBlurImage = 132 + Convolve = 133 + ConvolveImage = 134 + Profile = 135 + ProfileImage = 136 + UnsharpMask = 137 + UnsharpMaskImage = 138 + MotionBlur = 139 + MotionBlurImage = 140 + OrderedDither = 141 + OrderedDitherImage = 142 + Shave = 143 + ShaveImage = 144 + Level = 145 + LevelImage = 146 + Clip = 147 + ClipImage = 148 + AffineTransform = 149 + AffineTransformImage = 150 + Difference = 151 + DifferenceImage = 152 + AdaptiveThreshold = 153 + AdaptiveThresholdImage = 154 + Resample = 155 + ResampleImage = 156 + Describe = 157 + DescribeImage = 158 + BlackThreshold = 159 + BlackThresholdImage= 160 + WhiteThreshold = 161 + WhiteThresholdImage= 162 + RotationalBlur = 163 + RotationalBlurImage= 164 + Thumbnail = 165 + ThumbnailImage = 166 + Strip = 167 + StripImage = 168 + Tint = 169 + TintImage = 170 + Channel = 171 + ChannelImage = 172 + Splice = 173 + SpliceImage = 174 + Posterize = 175 + PosterizeImage = 176 + Shadow = 177 + ShadowImage = 178 + Identify = 179 + IdentifyImage = 180 + SepiaTone = 181 + SepiaToneImage = 182 + SigmoidalContrast = 183 + SigmoidalContrastImage = 184 + Extent = 185 + ExtentImage = 186 + Vignette = 187 + VignetteImage = 188 + ContrastStretch = 189 + ContrastStretchImage = 190 + Sans0 = 191 + Sans0Image = 192 + Sans1 = 193 + Sans1Image = 194 + AdaptiveSharpen = 195 + AdaptiveSharpenImage = 196 + Transpose = 197 + TransposeImage = 198 + Transverse = 199 + TransverseImage = 200 + AutoOrient = 201 + AutoOrientImage = 202 + AdaptiveBlur = 203 + AdaptiveBlurImage = 204 + Sketch = 205 + SketchImage = 206 + UniqueColors = 207 + UniqueColorsImage = 208 + AdaptiveResize = 209 + AdaptiveResizeImage= 210 + ClipMask = 211 + ClipMaskImage = 212 + LinearStretch = 213 + LinearStretchImage = 214 + RecolorImage = 215 + Recolor = 216 + Mask = 217 + MaskImage = 218 + Polaroid = 219 + PolaroidImage = 220 + FloodfillPaint = 221 + FloodfillPaintImage= 222 + Distort = 223 + DistortImage = 224 + Clut = 225 + ClutImage = 226 + LiquidRescale = 227 + LiquidRescaleImage = 228 + Encipher = 229 + EncipherImage = 230 + Decipher = 231 + DecipherImage = 232 + Deskew = 233 + DeskewImage = 234 + Remap = 235 + RemapImage = 236 + SparseColor = 237 + SparseColorImage = 238 + Function = 239 + FunctionImage = 240 + SelectiveBlur = 241 + SelectiveBlurImage = 242 + HaldClut = 243 + HaldClutImage = 244 + BlueShift = 245 + BlueShiftImage = 246 + ForwardFourierTransform = 247 + ForwardFourierTransformImage = 248 + InverseFourierTransform = 249 + InverseFourierTransformImage = 250 + ColorDecisionList = 251 + ColorDecisionListImage = 252 + AutoGamma = 253 + AutoGammaImage = 254 + AutoLevel = 255 + AutoLevelImage = 256 + LevelColors = 257 + LevelColorsImage = 258 + Clamp = 259 + ClampImage = 260 + Filter = 261 + FilterImage = 262 + BrightnessContrast = 263 + BrightnessContrastImage = 264 + Morphology = 265 + MorphologyImage = 266 + ColorMatrix = 267 + ColorMatrixImage = 268 + Color = 269 + ColorImage = 270 + Mode = 271 + ModeImage = 272 + Statistic = 273 + StatisticImage = 274 + Perceptible = 275 + PerceptibleImage = 276 + Poly = 277 + PolyImage = 278 + Grayscale = 279 + GrayscaleImage = 280 + CannyEdge = 281 + CannyEdgeImage = 282 + HoughLine = 283 + HoughLineImage = 284 + MeanShift = 285 + MeanShiftImage = 286 + Kuwahara = 287 + KuwaharaImage = 288 + ConnectedComponents= 289 + ConnectedComponentsImage = 290 + CopyPixels = 291 + CopyImagePixels = 292 + WaveletDenoise = 293 + WaveletDenoiseImage= 294 + Colorspace = 295 + ColorspaceImage = 296 + AutoThreshold = 297 + AutoThresholdImage = 298 + MogrifyRegion = 666 + PPCODE: + { + AffineMatrix + affine, + current; + + char + attribute_flag[MaxArguments], + message[MaxTextExtent]; + + ChannelType + channel; + + CompositeOperator + compose; + + const char + *attribute, + *value; + + double + angle; + + ExceptionInfo + *exception; + + GeometryInfo + geometry_info; + + Image + *image, + *next, + *region_image; + + MagickBooleanType + status; + + MagickStatusType + flags; + + PixelPacket + fill_color; + + RectangleInfo + geometry, + region_info; + + ssize_t + i; + + ssize_t + base, + j, + number_images; + + struct Methods + *rp; + + struct PackageInfo + *info; + + SV + *perl_exception, + **pv, + *reference, + **reference_vector; + + struct ArgumentList + argument_list[MaxArguments]; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference_vector=NULL; + region_image=NULL; + number_images=0; + base=2; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + region_info.width=0; + region_info.height=0; + region_info.x=0; + region_info.y=0; + region_image=(Image *) NULL; + image=SetupList(aTHX_ reference,&info,&reference_vector,exception); + if (ix && (ix != 666)) + { + /* + Called as Method(...) + */ + ix=(ix+1)/2; + rp=(&Methods[ix-1]); + attribute=rp->name; + } + else + { + /* + Called as Mogrify("Method",...) + */ + attribute=(char *) SvPV(ST(1),na); + if (ix) + { + flags=ParseGravityGeometry(image,attribute,®ion_info,exception); + attribute=(char *) SvPV(ST(2),na); + base++; + } + for (rp=Methods; ; rp++) + { + if (rp >= EndOf(Methods)) + { + ThrowPerlException(exception,OptionError, + "UnrecognizedPerlMagickMethod",attribute); + goto PerlException; + } + if (strEQcase(attribute,rp->name)) + break; + } + ix=rp-Methods+1; + base++; + } + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined",attribute); + goto PerlException; + } + Zero(&argument_list,NumberOf(argument_list),struct ArgumentList); + Zero(&attribute_flag,NumberOf(attribute_flag),char); + for (i=base; (i < items) || ((i == items) && (base == items)); i+=2) + { + Arguments + *pp, + *qq; + + ssize_t + ssize_test; + + struct ArgumentList + *al; + + SV + *sv; + + sv=NULL; + ssize_test=0; + pp=(Arguments *) NULL; + qq=rp->arguments; + if (i == items) + { + pp=rp->arguments, + sv=ST(i-1); + } + else + for (sv=ST(i), attribute=(char *) SvPV(ST(i-1),na); ; qq++) + { + if ((qq >= EndOf(rp->arguments)) || (qq->method == NULL)) + break; + if (strEQcase(attribute,qq->method) > ssize_test) + { + pp=qq; + ssize_test=strEQcase(attribute,qq->method); + } + } + if (pp == (Arguments *) NULL) + { + ThrowPerlException(exception,OptionError,"UnrecognizedOption", + attribute); + goto continue_outer_loop; + } + al=(&argument_list[pp-rp->arguments]); + switch (pp->type) + { + case ArrayReference: + { + if (SvTYPE(sv) != SVt_RV) + { + (void) FormatLocaleString(message,MaxTextExtent, + "invalid %.60s value",pp->method); + ThrowPerlException(exception,OptionError,message,SvPV(sv,na)); + goto continue_outer_loop; + } + al->array_reference=SvRV(sv); + break; + } + case RealReference: + { + al->real_reference=SvNV(sv); + break; + } + case FileReference: + { + al->file_reference=(FILE *) PerlIO_findFILE(IoIFP(sv_2io(sv))); + break; + } + case ImageReference: + { + if (!sv_isobject(sv) || + !(al->image_reference=SetupList(aTHX_ SvRV(sv), + (struct PackageInfo **) NULL,(SV ***) NULL,exception))) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + break; + } + case IntegerReference: + { + al->integer_reference=SvIV(sv); + break; + } + case StringReference: + { + al->string_reference=(char *) SvPV(sv,al->length); + if (sv_isobject(sv)) + al->image_reference=SetupList(aTHX_ SvRV(sv), + (struct PackageInfo **) NULL,(SV ***) NULL,exception); + break; + } + default: + { + /* + Is a string; look up name. + */ + if ((al->length > 1) && (*(char *) SvPV(sv,al->length) == '@')) + { + al->string_reference=(char *) SvPV(sv,al->length); + al->integer_reference=(-1); + break; + } + al->integer_reference=ParseCommandOption((CommandOption) pp->type, + MagickFalse,SvPV(sv,na)); + if (pp->type == MagickChannelOptions) + al->integer_reference=ParseChannelOption(SvPV(sv,na)); + if ((al->integer_reference < 0) && ((al->integer_reference=SvIV(sv)) <= 0)) + { + (void) FormatLocaleString(message,MaxTextExtent, + "invalid %.60s value",pp->method); + ThrowPerlException(exception,OptionError,message,SvPV(sv,na)); + goto continue_outer_loop; + } + break; + } + } + attribute_flag[pp-rp->arguments]++; + continue_outer_loop: ; + } + (void) ResetMagickMemory((char *) &fill_color,0,sizeof(fill_color)); + pv=reference_vector; + SetGeometryInfo(&geometry_info); + channel=DefaultChannels; + for (next=image; next; next=next->next) + { + image=next; + SetGeometry(image,&geometry); + if ((region_info.width*region_info.height) != 0) + { + region_image=image; + image=CropImage(image,®ion_info,exception); + } + switch (ix) + { + default: + { + (void) FormatLocaleString(message,MaxTextExtent,"%.20g",(double) ix); + ThrowPerlException(exception,OptionError, + "UnrecognizedPerlMagickMethod",message); + goto PerlException; + } + case 1: /* Comment */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference=(char *) NULL; + (void) SetImageProperty(image,"comment",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,image, + argument_list[0].string_reference)); + break; + } + case 2: /* Label */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference=(char *) NULL; + (void) SetImageProperty(image,"label",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,image, + argument_list[0].string_reference)); + break; + } + case 3: /* AddNoise */ + { + if (attribute_flag[0] == 0) + argument_list[0].integer_reference=UniformNoise; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + image=AddNoiseImageChannel(image,channel,(NoiseType) + argument_list[0].integer_reference,exception); + break; + } + case 4: /* Colorize */ + { + PixelPacket + target; + + (void) GetOneVirtualPixel(image,0,0,&target,exception); + if (attribute_flag[0] != 0) + (void) QueryColorDatabase(argument_list[0].string_reference,&target, + exception); + if (attribute_flag[1] == 0) + argument_list[1].string_reference="100%"; + image=ColorizeImage(image,argument_list[1].string_reference,target, + exception); + break; + } + case 5: /* Border */ + { + geometry.width=0; + geometry.height=0; + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + QueryColorDatabase(argument_list[3].string_reference, + &image->border_color,exception); + if (attribute_flag[4] != 0) + QueryColorDatabase(argument_list[4].string_reference, + &image->border_color,exception); + if (attribute_flag[5] != 0) + QueryColorDatabase(argument_list[5].string_reference, + &image->border_color,exception); + if (attribute_flag[6] != 0) + image->compose=(CompositeOperator) + argument_list[6].integer_reference; + image=BorderImage(image,&geometry,exception); + break; + } + case 6: /* Blur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=BlurImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 7: /* Chop */ + { + if (attribute_flag[5] != 0) + image->gravity=(GravityType) argument_list[5].integer_reference; + if (attribute_flag[0] != 0) + flags=ParseGravityGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry.x=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry.y=argument_list[4].integer_reference; + image=ChopImage(image,&geometry,exception); + break; + } + case 8: /* Crop */ + { + if (attribute_flag[6] != 0) + image->gravity=(GravityType) argument_list[6].integer_reference; + if (attribute_flag[0] != 0) + flags=ParseGravityGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry.x=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry.y=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + image=CropImage(image,&geometry,exception); + break; + } + case 9: /* Despeckle */ + { + image=DespeckleImage(image,exception); + break; + } + case 10: /* Edge */ + { + if (attribute_flag[0] != 0) + geometry_info.rho=argument_list[0].real_reference; + image=EdgeImage(image,geometry_info.rho,exception); + break; + } + case 11: /* Emboss */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + image=EmbossImage(image,geometry_info.rho,geometry_info.sigma, + exception); + break; + } + case 12: /* Enhance */ + { + image=EnhanceImage(image,exception); + break; + } + case 13: /* Flip */ + { + image=FlipImage(image,exception); + break; + } + case 14: /* Flop */ + { + image=FlopImage(image,exception); + break; + } + case 15: /* Frame */ + { + FrameInfo + frame_info; + + if (attribute_flag[0] != 0) + { + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + frame_info.width=geometry.width; + frame_info.height=geometry.height; + frame_info.outer_bevel=geometry.x; + frame_info.inner_bevel=geometry.y; + } + if (attribute_flag[1] != 0) + frame_info.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + frame_info.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + frame_info.inner_bevel=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + frame_info.outer_bevel=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + QueryColorDatabase(argument_list[5].string_reference,&fill_color, + exception); + if (attribute_flag[6] != 0) + QueryColorDatabase(argument_list[6].string_reference,&fill_color, + exception); + frame_info.x=(ssize_t) frame_info.width; + frame_info.y=(ssize_t) frame_info.height; + frame_info.width=image->columns+2*frame_info.x; + frame_info.height=image->rows+2*frame_info.y; + if ((attribute_flag[5] != 0) || (attribute_flag[6] != 0)) + image->matte_color=fill_color; + if (attribute_flag[7] != 0) + image->compose=(CompositeOperator) argument_list[7].integer_reference; + image=FrameImage(image,&frame_info,exception); + break; + } + case 16: /* Implode */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=0.5; + if (attribute_flag[1] != 0) + image->interpolate=(InterpolatePixelMethod) + argument_list[1].integer_reference; + image=ImplodeImage(image,argument_list[0].real_reference, + exception); + break; + } + case 17: /* Magnify */ + { + image=MagnifyImage(image,exception); + break; + } + case 18: /* MedianFilter */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=StatisticImageChannel(image,channel,MedianStatistic, + (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception); + break; + } + case 19: /* Minify */ + { + image=MinifyImage(image,exception); + break; + } + case 20: /* OilPaint */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=0.0; + image=OilPaintImage(image,argument_list[0].real_reference, + exception); + break; + } + case 21: /* ReduceNoise */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=StatisticImageChannel(image,channel,NonpeakStatistic, + (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception); + break; + } + case 22: /* Roll */ + { + if (attribute_flag[0] != 0) + { + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if ((flags & PercentValue) != 0) + { + geometry.x*=(double) image->columns/100.0; + geometry.y*=(double) image->rows/100.0; + } + } + if (attribute_flag[1] != 0) + geometry.x=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.y=argument_list[2].integer_reference; + image=RollImage(image,geometry.x,geometry.y,exception); + break; + } + case 23: /* Rotate */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=90.0; + if (attribute_flag[1] != 0) + QueryColorDatabase(argument_list[1].string_reference, + &image->background_color,exception); + if (attribute_flag[2] != 0) + QueryColorDatabase(argument_list[2].string_reference, + &image->background_color,exception); + if (attribute_flag[3] != 0) + QueryColorDatabase(argument_list[3].string_reference, + &image->background_color,exception); + image=RotateImage(image,argument_list[0].real_reference,exception); + break; + } + case 24: /* Sample */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + image=SampleImage(image,geometry.width,geometry.height,exception); + break; + } + case 25: /* Scale */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + image=ScaleImage(image,geometry.width,geometry.height,exception); + break; + } + case 26: /* Shade */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=0.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + image=ShadeImage(image, + argument_list[3].integer_reference != 0 ? MagickTrue : MagickFalse, + geometry_info.rho,geometry_info.sigma,exception); + break; + } + case 27: /* Sharpen */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=SharpenImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 28: /* Shear */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + QueryColorDatabase(argument_list[3].string_reference, + &image->background_color,exception); + if (attribute_flag[4] != 0) + QueryColorDatabase(argument_list[4].string_reference, + &image->background_color,exception); + image=ShearImage(image,geometry_info.rho,geometry_info.sigma, + exception); + break; + } + case 29: /* Spread */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=1.0; + image=SpreadImage(image,argument_list[0].real_reference,exception); + break; + } + case 30: /* Swirl */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=50.0; + if (attribute_flag[1] != 0) + image->interpolate=(InterpolatePixelMethod) + argument_list[1].integer_reference; + image=SwirlImage(image,argument_list[0].real_reference,exception); + break; + } + case 31: /* Resize */ + case 32: /* Zoom */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] == 0) + argument_list[3].integer_reference=(ssize_t) UndefinedFilter; + if (attribute_flag[4] != 0) + SetImageArtifact(image,"filter:support", + argument_list[4].string_reference); + if (attribute_flag[5] == 0) + argument_list[5].real_reference=1.0; + image=ResizeImage(image,geometry.width,geometry.height, + (FilterTypes) argument_list[3].integer_reference, + argument_list[5].real_reference,exception); + break; + } + case 33: /* Annotate */ + { + DrawInfo + *draw_info; + + draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL, + (DrawInfo *) NULL); + if (attribute_flag[0] != 0) + { + char + *text; + + text=InterpretImageProperties(info ? info->image_info : + (ImageInfo *) NULL,image,argument_list[0].string_reference); + (void) CloneString(&draw_info->text,text); + text=DestroyString(text); + } + if (attribute_flag[1] != 0) + (void) CloneString(&draw_info->font, + argument_list[1].string_reference); + if (attribute_flag[2] != 0) + draw_info->pointsize=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + (void) CloneString(&draw_info->density, + argument_list[3].string_reference); + if (attribute_flag[4] != 0) + (void) QueryColorDatabase(argument_list[4].string_reference, + &draw_info->undercolor,exception); + if (attribute_flag[5] != 0) + { + (void) QueryColorDatabase(argument_list[5].string_reference, + &draw_info->stroke,exception); + if (argument_list[5].image_reference != (Image *) NULL) + draw_info->stroke_pattern=CloneImage( + argument_list[5].image_reference,0,0,MagickTrue,exception); + } + if (attribute_flag[6] != 0) + { + (void) QueryColorDatabase(argument_list[6].string_reference, + &draw_info->fill,exception); + if (argument_list[6].image_reference != (Image *) NULL) + draw_info->fill_pattern=CloneImage( + argument_list[6].image_reference,0,0,MagickTrue,exception); + } + if (attribute_flag[7] != 0) + { + (void) CloneString(&draw_info->geometry, + argument_list[7].string_reference); + flags=ParsePageGeometry(image,argument_list[7].string_reference, + &geometry,exception); + if (((flags & SigmaValue) == 0) && ((flags & XiValue) != 0)) + geometry_info.sigma=geometry_info.xi; + } + if (attribute_flag[8] != 0) + (void) QueryColorDatabase(argument_list[8].string_reference, + &draw_info->fill,exception); + if (attribute_flag[11] != 0) + draw_info->gravity=(GravityType) argument_list[11].integer_reference; + if (attribute_flag[25] != 0) + { + AV + *av; + + av=(AV *) argument_list[25].array_reference; + if ((av_len(av) != 3) && (av_len(av) != 5)) + { + ThrowPerlException(exception,OptionError, + "affine matrix must have 4 or 6 elements",PackageName); + goto PerlException; + } + draw_info->affine.sx=(double) SvNV(*(av_fetch(av,0,0))); + draw_info->affine.rx=(double) SvNV(*(av_fetch(av,1,0))); + draw_info->affine.ry=(double) SvNV(*(av_fetch(av,2,0))); + draw_info->affine.sy=(double) SvNV(*(av_fetch(av,3,0))); + if (fabs(draw_info->affine.sx*draw_info->affine.sy- + draw_info->affine.rx*draw_info->affine.ry) < MagickEpsilon) + { + ThrowPerlException(exception,OptionError, + "affine matrix is singular",PackageName); + goto PerlException; + } + if (av_len(av) == 5) + { + draw_info->affine.tx=(double) SvNV(*(av_fetch(av,4,0))); + draw_info->affine.ty=(double) SvNV(*(av_fetch(av,5,0))); + } + } + for (j=12; j < 17; j++) + { + if (attribute_flag[j] == 0) + continue; + value=argument_list[j].string_reference; + angle=argument_list[j].real_reference; + current=draw_info->affine; + GetAffineMatrix(&affine); + switch (j) + { + case 12: + { + /* + Translate. + */ + flags=ParseGeometry(value,&geometry_info); + affine.tx=geometry_info.xi; + affine.ty=geometry_info.psi; + if ((flags & PsiValue) == 0) + affine.ty=affine.tx; + break; + } + case 13: + { + /* + Scale. + */ + flags=ParseGeometry(value,&geometry_info); + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.sy=affine.sx; + break; + } + case 14: + { + /* + Rotate. + */ + if (angle == 0.0) + break; + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 15: + { + /* + SkewX. + */ + affine.ry=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 16: + { + /* + SkewY. + */ + affine.rx=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + } + draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + draw_info->affine.tx=current.sx*affine.tx+current.ry*affine.ty+ + current.tx; + draw_info->affine.ty=current.rx*affine.tx+current.sy*affine.ty+ + current.ty; + } + if (attribute_flag[9] == 0) + argument_list[9].real_reference=0.0; + if (attribute_flag[10] == 0) + argument_list[10].real_reference=0.0; + if ((attribute_flag[9] != 0) || (attribute_flag[10] != 0)) + { + char + geometry[MaxTextExtent]; + + (void) FormatLocaleString(geometry,MaxTextExtent,"%+f%+f", + (double) argument_list[9].real_reference+draw_info->affine.tx, + (double) argument_list[10].real_reference+draw_info->affine.ty); + (void) CloneString(&draw_info->geometry,geometry); + } + if (attribute_flag[17] != 0) + draw_info->stroke_width=argument_list[17].real_reference; + if (attribute_flag[18] != 0) + { + draw_info->text_antialias=argument_list[18].integer_reference != 0 ? + MagickTrue : MagickFalse; + draw_info->stroke_antialias=draw_info->text_antialias; + } + if (attribute_flag[19] != 0) + (void) CloneString(&draw_info->family, + argument_list[19].string_reference); + if (attribute_flag[20] != 0) + draw_info->style=(StyleType) argument_list[20].integer_reference; + if (attribute_flag[21] != 0) + draw_info->stretch=(StretchType) argument_list[21].integer_reference; + if (attribute_flag[22] != 0) + draw_info->weight=argument_list[22].integer_reference; + if (attribute_flag[23] != 0) + draw_info->align=(AlignType) argument_list[23].integer_reference; + if (attribute_flag[24] != 0) + (void) CloneString(&draw_info->encoding, + argument_list[24].string_reference); + if (attribute_flag[25] != 0) + draw_info->fill_pattern=CloneImage( + argument_list[25].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[26] != 0) + draw_info->fill_pattern=CloneImage( + argument_list[26].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[27] != 0) + draw_info->stroke_pattern=CloneImage( + argument_list[27].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[29] != 0) + draw_info->kerning=argument_list[29].real_reference; + if (attribute_flag[30] != 0) + draw_info->interline_spacing=argument_list[30].real_reference; + if (attribute_flag[31] != 0) + draw_info->interword_spacing=argument_list[31].real_reference; + if (attribute_flag[32] != 0) + draw_info->direction=(DirectionType) + argument_list[32].integer_reference; + if (attribute_flag[33] != 0) + draw_info->decorate=(DecorationType) + argument_list[33].integer_reference; + (void) AnnotateImage(image,draw_info); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 34: /* ColorFloodfill */ + { + DrawInfo + *draw_info; + + MagickBooleanType + invert; + + MagickPixelPacket + target; + + draw_info=CloneDrawInfo(info ? info->image_info : + (ImageInfo *) NULL,(DrawInfo *) NULL); + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.x=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.y=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + (void) QueryColorDatabase(argument_list[3].string_reference, + &draw_info->fill,exception); + (void) GetOneVirtualMagickPixel(image,geometry.x,geometry.y,&target, + exception); + invert=MagickFalse; + if (attribute_flag[4] != 0) + { + QueryMagickColor(argument_list[4].string_reference,&target, + exception); + invert=MagickTrue; + } + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[6] != 0) + invert=(MagickBooleanType) argument_list[6].integer_reference; + (void) FloodfillPaintImage(image,DefaultChannels,draw_info,&target, + geometry.x,geometry.y,invert); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 35: /* Composite */ + { + char + composite_geometry[MaxTextExtent]; + + Image + *composite_image, + *rotate_image; + + compose=OverCompositeOp; + if (attribute_flag[0] != 0) + composite_image=argument_list[0].image_reference; + else + { + ThrowPerlException(exception,OptionError, + "CompositeImageRequired",PackageName); + goto PerlException; + } + /* + Parameter Handling used for BOTH normal and tiled composition. + */ + if (attribute_flag[1] != 0) /* compose */ + compose=(CompositeOperator) argument_list[1].integer_reference; + if (attribute_flag[6] != 0) /* opacity */ + { + if (compose != DissolveCompositeOp) + (void) SetImageOpacity(composite_image,(Quantum) (QuantumRange- + StringToDoubleInterval(argument_list[6].string_reference, + (double) QuantumRange+1.0))); + else + { + CacheView + *composite_view; + + double + opacity; + + MagickBooleanType + sync; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + y; + + /* + Handle dissolve composite operator. + */ + (void) CloneString(&image->geometry, + argument_list[6].string_reference); + opacity=(Quantum) (QuantumRange-StringToDoubleInterval( + argument_list[6].string_reference,(double) QuantumRange+ + 1.0)); + if (composite_image->matte != MagickTrue) + (void) SetImageOpacity(composite_image,OpaqueOpacity); + composite_view=AcquireAuthenticCacheView(composite_image, + exception); + for (y=0; y < (ssize_t) composite_image->rows ; y++) + { + q=GetCacheViewAuthenticPixels(composite_view,0,y,(ssize_t) + composite_image->columns,1,exception); + for (x=0; x < (ssize_t) composite_image->columns; x++) + { + if (q->opacity == OpaqueOpacity) + q->opacity=ClampToQuantum(opacity); + q++; + } + sync=SyncCacheViewAuthenticPixels(composite_view,exception); + if (sync == MagickFalse) + break; + } + composite_view=DestroyCacheView(composite_view); + } + } + if (attribute_flag[9] != 0) /* "color=>" */ + QueryColorDatabase(argument_list[9].string_reference, + &composite_image->background_color,exception); + if (attribute_flag[12] != 0) /* "interpolate=>" */ + image->interpolate=(InterpolatePixelMethod) + argument_list[12].integer_reference; + if (attribute_flag[13] != 0) /* "args=>" */ + (void) SetImageArtifact(composite_image,"compose:args", + argument_list[13].string_reference); + if (attribute_flag[14] != 0) /* "blend=>" depreciated */ + (void) SetImageArtifact(composite_image,"compose:args", + argument_list[14].string_reference); + /* + Tiling Composition (with orthogonal rotate). + */ + rotate_image=(Image *) NULL; + if (attribute_flag[8] != 0) /* "rotate=>" */ + { + /* + Rotate image. + */ + rotate_image=RotateImage(composite_image, + argument_list[8].real_reference,exception); + if (rotate_image == (Image *) NULL) + break; + } + if ((attribute_flag[7] != 0) && + (argument_list[7].integer_reference != 0)) /* tile */ + { + ssize_t + x, + y; + + /* + Tile the composite image. + */ + if (attribute_flag[8] != 0) /* "tile=>" */ + (void) SetImageArtifact(rotate_image,"compose:outside-overlay", + "false"); + else + (void) SetImageArtifact(composite_image, + "compose:outside-overlay","false"); + for (y=0; y < (ssize_t) image->rows; y+=(ssize_t) composite_image->rows) + for (x=0; x < (ssize_t) image->columns; x+=(ssize_t) composite_image->columns) + { + if (attribute_flag[8] != 0) /* rotate */ + (void) CompositeImage(image,compose,rotate_image,x,y); + else + (void) CompositeImage(image,compose,composite_image,x,y); + } + if (attribute_flag[8] != 0) /* rotate */ + rotate_image=DestroyImage(rotate_image); + break; + } + /* + Parameter Handling used used ONLY for normal composition. + */ + if (attribute_flag[5] != 0) /* gravity */ + image->gravity=(GravityType) argument_list[5].integer_reference; + if (attribute_flag[2] != 0) /* geometry offset */ + { + SetGeometry(image,&geometry); + (void) ParseAbsoluteGeometry(argument_list[2].string_reference, + &geometry); + GravityAdjustGeometry(image->columns,image->rows,image->gravity, + &geometry); + } + if (attribute_flag[3] != 0) /* x offset */ + geometry.x=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) /* y offset */ + geometry.y=argument_list[4].integer_reference; + if (attribute_flag[10] != 0) /* mask */ + { + if ((image->compose == DisplaceCompositeOp) || + (image->compose == DistortCompositeOp)) + { + /* + Merge Y displacement into X displacement image. + */ + composite_image=CloneImage(composite_image,0,0,MagickTrue, + &image->exception); + (void) CompositeImage(composite_image,CopyGreenCompositeOp, + argument_list[10].image_reference,0,0); + } + else + { + /* + Set a blending mask for the composition. + */ + image->mask=CloneImage(argument_list[10].image_reference,0,0, + MagickTrue,&image->exception); + (void) NegateImage(image->mask,MagickFalse); + } + } + if (attribute_flag[11] != 0) /* channel */ + channel=(ChannelType) argument_list[11].integer_reference; + /* + Composite two images (normal composition). + */ + (void) FormatLocaleString(composite_geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) composite_image->columns, + (double) composite_image->rows,(double) geometry.x,(double) + geometry.y); + flags=ParseGravityGeometry(image,composite_geometry,&geometry, + exception); + if (attribute_flag[8] == 0) /* no rotate */ + CompositeImageChannel(image,channel,compose,composite_image, + geometry.x,geometry.y); + else + { + /* + Position adjust rotated image then composite. + */ + geometry.x-=(ssize_t) (rotate_image->columns- + composite_image->columns)/2; + geometry.y-=(ssize_t) (rotate_image->rows- + composite_image->rows)/2; + CompositeImageChannel(image,channel,compose,rotate_image, + geometry.x,geometry.y); + rotate_image=DestroyImage(rotate_image); + } + if (attribute_flag[10] != 0) /* mask */ + { + if ((image->compose == DisplaceCompositeOp) || + (image->compose == DistortCompositeOp)) + composite_image=DestroyImage(composite_image); + else + image->mask=DestroyImage(image->mask); + } + break; + } + case 36: /* Contrast */ + { + if (attribute_flag[0] == 0) + argument_list[0].integer_reference=0; + (void) ContrastImage(image,argument_list[0].integer_reference != 0 ? + MagickTrue : MagickFalse); + break; + } + case 37: /* CycleColormap */ + { + if (attribute_flag[0] == 0) + argument_list[0].integer_reference=6; + (void) CycleColormapImage(image,argument_list[0].integer_reference); + break; + } + case 38: /* Draw */ + { + DrawInfo + *draw_info; + + draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL, + (DrawInfo *) NULL); + (void) CloneString(&draw_info->primitive,"point"); + if (attribute_flag[0] != 0) + { + if (argument_list[0].integer_reference < 0) + (void) CloneString(&draw_info->primitive, + argument_list[0].string_reference); + else + (void) CloneString(&draw_info->primitive,CommandOptionToMnemonic( + MagickPrimitiveOptions,argument_list[0].integer_reference)); + } + if (attribute_flag[1] != 0) + { + if (LocaleCompare(draw_info->primitive,"path") == 0) + { + (void) ConcatenateString(&draw_info->primitive," '"); + ConcatenateString(&draw_info->primitive, + argument_list[1].string_reference); + (void) ConcatenateString(&draw_info->primitive,"'"); + } + else + { + (void) ConcatenateString(&draw_info->primitive," "); + ConcatenateString(&draw_info->primitive, + argument_list[1].string_reference); + } + } + if (attribute_flag[2] != 0) + { + (void) ConcatenateString(&draw_info->primitive," "); + (void) ConcatenateString(&draw_info->primitive, + CommandOptionToMnemonic(MagickMethodOptions, + argument_list[2].integer_reference)); + } + if (attribute_flag[3] != 0) + { + (void) QueryColorDatabase(argument_list[3].string_reference, + &draw_info->stroke,exception); + if (argument_list[3].image_reference != (Image *) NULL) + draw_info->stroke_pattern=CloneImage( + argument_list[3].image_reference,0,0,MagickTrue,exception); + } + if (attribute_flag[4] != 0) + { + (void) QueryColorDatabase(argument_list[4].string_reference, + &draw_info->fill,exception); + if (argument_list[4].image_reference != (Image *) NULL) + draw_info->fill_pattern=CloneImage( + argument_list[4].image_reference,0,0,MagickTrue,exception); + } + if (attribute_flag[5] != 0) + draw_info->stroke_width=argument_list[5].real_reference; + if (attribute_flag[6] != 0) + (void) CloneString(&draw_info->font, + argument_list[6].string_reference); + if (attribute_flag[7] != 0) + (void) QueryColorDatabase(argument_list[7].string_reference, + &draw_info->border_color,exception); + if (attribute_flag[8] != 0) + draw_info->affine.tx=argument_list[8].real_reference; + if (attribute_flag[9] != 0) + draw_info->affine.ty=argument_list[9].real_reference; + if (attribute_flag[20] != 0) + { + AV + *av; + + av=(AV *) argument_list[20].array_reference; + if ((av_len(av) != 3) && (av_len(av) != 5)) + { + ThrowPerlException(exception,OptionError, + "affine matrix must have 4 or 6 elements",PackageName); + goto PerlException; + } + draw_info->affine.sx=(double) SvNV(*(av_fetch(av,0,0))); + draw_info->affine.rx=(double) SvNV(*(av_fetch(av,1,0))); + draw_info->affine.ry=(double) SvNV(*(av_fetch(av,2,0))); + draw_info->affine.sy=(double) SvNV(*(av_fetch(av,3,0))); + if (fabs(draw_info->affine.sx*draw_info->affine.sy- + draw_info->affine.rx*draw_info->affine.ry) < MagickEpsilon) + { + ThrowPerlException(exception,OptionError, + "affine matrix is singular",PackageName); + goto PerlException; + } + if (av_len(av) == 5) + { + draw_info->affine.tx=(double) SvNV(*(av_fetch(av,4,0))); + draw_info->affine.ty=(double) SvNV(*(av_fetch(av,5,0))); + } + } + for (j=10; j < 15; j++) + { + if (attribute_flag[j] == 0) + continue; + value=argument_list[j].string_reference; + angle=argument_list[j].real_reference; + current=draw_info->affine; + GetAffineMatrix(&affine); + switch (j) + { + case 10: + { + /* + Translate. + */ + flags=ParseGeometry(value,&geometry_info); + affine.tx=geometry_info.xi; + affine.ty=geometry_info.psi; + if ((flags & PsiValue) == 0) + affine.ty=affine.tx; + break; + } + case 11: + { + /* + Scale. + */ + flags=ParseGeometry(value,&geometry_info); + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.sy=affine.sx; + break; + } + case 12: + { + /* + Rotate. + */ + if (angle == 0.0) + break; + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 13: + { + /* + SkewX. + */ + affine.ry=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 14: + { + /* + SkewY. + */ + affine.rx=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + } + draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + draw_info->affine.tx= + current.sx*affine.tx+current.ry*affine.ty+current.tx; + draw_info->affine.ty= + current.rx*affine.tx+current.sy*affine.ty+current.ty; + } + if (attribute_flag[15] != 0) + draw_info->fill_pattern=CloneImage( + argument_list[15].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[16] != 0) + draw_info->pointsize=argument_list[16].real_reference; + if (attribute_flag[17] != 0) + { + draw_info->stroke_antialias=argument_list[17].integer_reference != 0 + ? MagickTrue : MagickFalse; + draw_info->text_antialias=draw_info->stroke_antialias; + } + if (attribute_flag[18] != 0) + (void) CloneString(&draw_info->density, + argument_list[18].string_reference); + if (attribute_flag[19] != 0) + draw_info->stroke_width=argument_list[19].real_reference; + if (attribute_flag[21] != 0) + draw_info->dash_offset=argument_list[21].real_reference; + if (attribute_flag[22] != 0) + { + AV + *av; + + av=(AV *) argument_list[22].array_reference; + draw_info->dash_pattern=(double *) AcquireQuantumMemory( + av_len(av)+2UL,sizeof(*draw_info->dash_pattern)); + if (draw_info->dash_pattern != (double *) NULL) + { + for (i=0; i <= av_len(av); i++) + draw_info->dash_pattern[i]=(double) + SvNV(*(av_fetch(av,i,0))); + draw_info->dash_pattern[i]=0.0; + } + } + if (attribute_flag[23] != 0) + image->interpolate=(InterpolatePixelMethod) + argument_list[23].integer_reference; + if ((attribute_flag[24] != 0) && + (draw_info->fill_pattern != (Image *) NULL)) + flags=ParsePageGeometry(draw_info->fill_pattern, + argument_list[24].string_reference, + &draw_info->fill_pattern->tile_offset,exception); + if (attribute_flag[25] != 0) + { + (void) ConcatenateString(&draw_info->primitive," '"); + (void) ConcatenateString(&draw_info->primitive, + argument_list[25].string_reference); + (void) ConcatenateString(&draw_info->primitive,"'"); + } + if (attribute_flag[26] != 0) + draw_info->fill_pattern=CloneImage( + argument_list[26].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[27] != 0) + draw_info->stroke_pattern=CloneImage( + argument_list[27].image_reference,0,0,MagickTrue,exception); + if (attribute_flag[28] != 0) + (void) CloneString(&draw_info->primitive, + argument_list[28].string_reference); + if (attribute_flag[29] != 0) + draw_info->kerning=argument_list[29].real_reference; + if (attribute_flag[30] != 0) + draw_info->interline_spacing=argument_list[30].real_reference; + if (attribute_flag[31] != 0) + draw_info->interword_spacing=argument_list[31].real_reference; + if (attribute_flag[32] != 0) + draw_info->direction=(DirectionType) + argument_list[32].integer_reference; + DrawImage(image,draw_info); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 39: /* Equalize */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + EqualizeImageChannel(image,channel); + break; + } + case 40: /* Gamma */ + { + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + if (attribute_flag[2] == 0) + argument_list[2].real_reference=1.0; + if (attribute_flag[3] == 0) + argument_list[3].real_reference=1.0; + if (attribute_flag[4] == 0) + argument_list[4].real_reference=1.0; + if (attribute_flag[0] == 0) + { + (void) FormatLocaleString(message,MaxTextExtent, + "%.20g,%.15g,%.15g",(double) argument_list[2].real_reference, + (double) argument_list[3].real_reference, + (double) argument_list[4].real_reference); + argument_list[0].string_reference=message; + } + if (strchr(argument_list[0].string_reference,',') != (char *) NULL) + (void) GammaImage(image,argument_list[0].string_reference); + else + (void) GammaImageChannel(image,channel,StringToDouble( + argument_list[0].string_reference,(char **) NULL)); + break; + } + case 41: /* Map */ + { + QuantizeInfo + *quantize_info; + + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"MapImageRequired", + PackageName); + goto PerlException; + } + quantize_info=AcquireQuantizeInfo(info->image_info); + if (attribute_flag[1] != 0) + quantize_info->dither=(MagickBooleanType) + argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + quantize_info->dither_method=(DitherMethod) + argument_list[2].integer_reference; + (void) RemapImages(quantize_info,image, + argument_list[0].image_reference); + quantize_info=DestroyQuantizeInfo(quantize_info); + break; + } + case 42: /* MatteFloodfill */ + { + DrawInfo + *draw_info; + + MagickBooleanType + invert; + + MagickPixelPacket + target; + + draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL, + (DrawInfo *) NULL); + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.x=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.y=argument_list[2].integer_reference; + if (image->matte == MagickFalse) + (void) SetImageOpacity(image,OpaqueOpacity); + (void) GetOneVirtualMagickPixel(image,geometry.x,geometry.y,&target, + exception); + if (attribute_flag[4] != 0) + QueryMagickColor(argument_list[4].string_reference,&target, + exception); + if (attribute_flag[3] != 0) + target.opacity=StringToDoubleInterval( + argument_list[3].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + invert=MagickFalse; + if (attribute_flag[6] != 0) + invert=(MagickBooleanType) argument_list[6].integer_reference; + (void) FloodfillPaintImage(image,OpacityChannel,draw_info,&target, + geometry.x,geometry.y,invert); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 43: /* Modulate */ + { + char + modulate[MaxTextExtent]; + + geometry_info.rho=100.0; + geometry_info.sigma=100.0; + geometry_info.xi=100.0; + if (attribute_flag[0] != 0) + (void)ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if (attribute_flag[1] != 0) + geometry_info.xi=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + { + geometry_info.sigma=argument_list[3].real_reference; + SetImageArtifact(image,"modulate:colorspace","HWB"); + } + if (attribute_flag[4] != 0) + { + geometry_info.rho=argument_list[4].real_reference; + SetImageArtifact(image,"modulate:colorspace","HSB"); + } + if (attribute_flag[5] != 0) + { + geometry_info.sigma=argument_list[5].real_reference; + SetImageArtifact(image,"modulate:colorspace","HSL"); + } + if (attribute_flag[6] != 0) + { + geometry_info.rho=argument_list[6].real_reference; + SetImageArtifact(image,"modulate:colorspace","HWB"); + } + (void) FormatLocaleString(modulate,MaxTextExtent,"%.20g,%.15g,%.15g", + geometry_info.rho,geometry_info.sigma,geometry_info.xi); + (void) ModulateImage(image,modulate); + break; + } + case 44: /* Negate */ + { + if (attribute_flag[0] == 0) + argument_list[0].integer_reference=0; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + (void) NegateImageChannel(image,channel, + argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse); + break; + } + case 45: /* Normalize */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + NormalizeImageChannel(image,channel); + break; + } + case 46: /* NumberColors */ + break; + case 47: /* Opaque */ + { + MagickBooleanType + invert; + + MagickPixelPacket + fill_color, + target; + + (void) QueryMagickColor("none",&target,exception); + (void) QueryMagickColor("none",&fill_color,exception); + if (attribute_flag[0] != 0) + (void) QueryMagickColor(argument_list[0].string_reference, + &target,exception); + if (attribute_flag[1] != 0) + (void) QueryMagickColor(argument_list[1].string_reference, + &fill_color,exception); + if (attribute_flag[2] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[2].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + invert=MagickFalse; + if (attribute_flag[4] != 0) + invert=(MagickBooleanType) argument_list[4].integer_reference; + (void) OpaquePaintImageChannel(image,channel,&target,&fill_color, + invert); + break; + } + case 48: /* Quantize */ + { + QuantizeInfo + *quantize_info; + + quantize_info=AcquireQuantizeInfo(info->image_info); + if (attribute_flag[0] != 0) + quantize_info->number_colors=(size_t) + argument_list[0].integer_reference; + if (attribute_flag[1] != 0) + quantize_info->tree_depth=(size_t) + argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + quantize_info->colorspace=(ColorspaceType) + argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + quantize_info->dither=argument_list[3].integer_reference != 0 ? + MagickTrue : MagickFalse; + if (attribute_flag[4] != 0) + quantize_info->measure_error= + argument_list[4].integer_reference != 0 ? MagickTrue : MagickFalse; + if (attribute_flag[6] != 0) + (void) QueryColorDatabase(argument_list[6].string_reference, + &image->transparent_color,exception); + if (attribute_flag[7] != 0) + quantize_info->dither_method=(DitherMethod) + argument_list[7].integer_reference; + if (attribute_flag[5] && argument_list[5].integer_reference) + (void) QuantizeImages(quantize_info,image); + else if ((image->storage_class == DirectClass) || + (image->colors > quantize_info->number_colors) || + (quantize_info->colorspace == GRAYColorspace)) + (void) QuantizeImage(quantize_info,image); + else + CompressImageColormap(image); + quantize_info=DestroyQuantizeInfo(quantize_info); + break; + } + case 49: /* Raise */ + { + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] == 0) + argument_list[3].integer_reference=1; + (void) RaiseImage(image,&geometry,argument_list[3].integer_reference != + 0 ? MagickTrue : MagickFalse); + break; + } + case 50: /* Segment */ + { + ColorspaceType + colorspace; + + double + cluster_threshold, + smoothing_threshold; + + MagickBooleanType + verbose; + + cluster_threshold=1.0; + smoothing_threshold=1.5; + colorspace=sRGBColorspace; + verbose=MagickFalse; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + cluster_threshold=geometry_info.rho; + if (flags & SigmaValue) + smoothing_threshold=geometry_info.sigma; + } + if (attribute_flag[1] != 0) + cluster_threshold=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + smoothing_threshold=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + colorspace=(ColorspaceType) argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + verbose=argument_list[4].integer_reference != 0 ? + MagickTrue : MagickFalse; + (void) SegmentImage(image,colorspace,verbose,cluster_threshold, + smoothing_threshold); + break; + } + case 51: /* Signature */ + { + (void) SignatureImage(image); + break; + } + case 52: /* Solarize */ + { + geometry_info.rho=QuantumRange/2.0; + if (attribute_flag[0] != 0) + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if (attribute_flag[1] != 0) + geometry_info.rho=StringToDoubleInterval( + argument_list[1].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[2] != 0) + channel=(ChannelType) argument_list[2].integer_reference; + (void) SolarizeImageChannel(image,channel,geometry_info.rho, + exception); + break; + } + case 53: /* Sync */ + { + (void) SyncImage(image); + break; + } + case 54: /* Texture */ + { + if (attribute_flag[0] == 0) + break; + TextureImage(image,argument_list[0].image_reference); + break; + } + case 55: /* Evalute */ + { + MagickEvaluateOperator + op; + + op=SetEvaluateOperator; + if (attribute_flag[0] == MagickFalse) + argument_list[0].real_reference=0.0; + if (attribute_flag[1] != MagickFalse) + op=(MagickEvaluateOperator) argument_list[1].integer_reference; + if (attribute_flag[2] != MagickFalse) + channel=(ChannelType) argument_list[2].integer_reference; + (void) EvaluateImageChannel(image,channel,op, + argument_list[0].real_reference,exception); + break; + } + case 56: /* Transparent */ + { + double + opacity; + + MagickBooleanType + invert; + + MagickPixelPacket + target; + + (void) QueryMagickColor("none",&target,exception); + if (attribute_flag[0] != 0) + (void) QueryMagickColor(argument_list[0].string_reference,&target, + exception); + opacity=TransparentOpacity; + if (attribute_flag[1] != 0) + opacity=StringToDoubleInterval(argument_list[1].string_reference, + (double) QuantumRange+1.0); + if (attribute_flag[2] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[2].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[3] == 0) + argument_list[3].integer_reference=0; + invert=MagickFalse; + if (attribute_flag[3] != 0) + invert=(MagickBooleanType) argument_list[3].integer_reference; + (void) TransparentPaintImage(image,&target,ClampToQuantum(opacity), + invert); + break; + } + case 57: /* Threshold */ + { + double + threshold; + + if (attribute_flag[0] == 0) + argument_list[0].string_reference="50%"; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + threshold=StringToDoubleInterval(argument_list[0].string_reference, + (double) QuantumRange+1.0); + (void) BilevelImageChannel(image,channel,threshold); + break; + } + case 58: /* Charcoal */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + image=CharcoalImage(image,geometry_info.rho,geometry_info.sigma, + exception); + break; + } + case 59: /* Trim */ + { + if (attribute_flag[0] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[0].string_reference,(double) QuantumRange+1.0); + image=TrimImage(image,exception); + break; + } + case 60: /* Wave */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + image->interpolate=(InterpolatePixelMethod) + argument_list[3].integer_reference; + image=WaveImage(image,geometry_info.rho,geometry_info.sigma, + exception); + break; + } + case 61: /* Separate */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + (void) SeparateImageChannel(image,channel); + break; + } + case 63: /* Stereo */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"StereoImageRequired", + PackageName); + goto PerlException; + } + if (attribute_flag[1] != 0) + geometry.x=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.y=argument_list[2].integer_reference; + image=StereoAnaglyphImage(image,argument_list[0].image_reference, + geometry.x,geometry.y,exception); + break; + } + case 64: /* Stegano */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"SteganoImageRequired", + PackageName); + goto PerlException; + } + if (attribute_flag[1] == 0) + argument_list[1].integer_reference=0; + image->offset=argument_list[1].integer_reference; + image=SteganoImage(image,argument_list[0].image_reference,exception); + break; + } + case 65: /* Deconstruct */ + { + image=DeconstructImages(image,exception); + break; + } + case 66: /* GaussianBlur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=GaussianBlurImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 67: /* Convolve */ + { + AV + *av; + + double + *kernel; + + size_t + order; + + if (attribute_flag[0] == 0) + break; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + image->bias=StringToDoubleInterval( + argument_list[2].string_reference,(double) QuantumRange+1.0); + av=(AV *) argument_list[0].array_reference; + order=(size_t) sqrt(av_len(av)+1); + kernel=(double *) AcquireQuantumMemory(order,order*sizeof(*kernel)); + if (kernel == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; (j < (ssize_t) (order*order)) && (j < (av_len(av)+1)); j++) + kernel[j]=(double) SvNV(*(av_fetch(av,j,0))); + for ( ; j < (ssize_t) (order*order); j++) + kernel[j]=0.0; + image=ConvolveImageChannel(image,channel,order,kernel,exception); + kernel=(double *) RelinquishMagickMemory(kernel); + break; + } + case 68: /* Profile */ + { + const char + *name; + + Image + *profile_image; + + ImageInfo + *profile_info; + + StringInfo + *profile; + + name="*"; + if (attribute_flag[0] != 0) + name=argument_list[0].string_reference; + if (attribute_flag[2] != 0) + image->rendering_intent=(RenderingIntent) + argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + image->black_point_compensation= + argument_list[3].integer_reference != 0 ? MagickTrue : MagickFalse; + if (attribute_flag[1] != 0) + { + if (argument_list[1].length == 0) + { + /* + Remove a profile from the image. + */ + (void) ProfileImage(image,name,(const unsigned char *) NULL,0, + MagickTrue); + break; + } + /* + Associate user supplied profile with the image. + */ + profile=AcquireStringInfo(argument_list[1].length); + SetStringInfoDatum(profile,(const unsigned char *) + argument_list[1].string_reference); + (void) ProfileImage(image,name,GetStringInfoDatum(profile), + (size_t) GetStringInfoLength(profile),MagickFalse); + profile=DestroyStringInfo(profile); + break; + } + /* + Associate a profile with the image. + */ + profile_info= + CloneImageInfo(info ? info->image_info : (ImageInfo *) NULL); + (void) CopyMagickString(profile_info->filename,name,MaxTextExtent); + profile_image=ReadImages(profile_info,&image->exception); + if (profile_image == (Image *) NULL) + break; + ResetImageProfileIterator(profile_image); + name=GetNextImageProfile(profile_image); + while (name != (const char *) NULL) + { + const StringInfo + *profile; + + profile=GetImageProfile(profile_image,name); + if (profile != (const StringInfo *) NULL) + (void) ProfileImage(image,name,GetStringInfoDatum(profile), + (size_t) GetStringInfoLength(profile),MagickFalse); + name=GetNextImageProfile(profile_image); + } + profile_image=DestroyImage(profile_image); + profile_info=DestroyImageInfo(profile_info); + break; + } + case 69: /* UnsharpMask */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=1.0; + if ((flags & PsiValue) == 0) + geometry_info.psi=0.5; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].real_reference; + if (attribute_flag[4] != 0) + geometry_info.psi=argument_list[4].real_reference; + if (attribute_flag[5] != 0) + channel=(ChannelType) argument_list[5].integer_reference; + image=UnsharpMaskImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception); + break; + } + case 70: /* MotionBlur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].real_reference; + if (attribute_flag[4] != 0) + channel=(ChannelType) argument_list[4].integer_reference; + image=MotionBlurImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,geometry_info.xi,exception); + break; + } + case 71: /* OrderedDither */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference="o8x8"; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + (void) OrderedPosterizeImageChannel(image,channel, + argument_list[0].string_reference,exception); + break; + } + case 72: /* Shave */ + { + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + image=ShaveImage(image,&geometry,exception); + break; + } + case 73: /* Level */ + { + double + black_point, + gamma, + white_point; + + black_point=0.0; + white_point=(MagickRealType) image->columns*image->rows; + gamma=1.0; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + black_point=geometry_info.rho; + if ((flags & SigmaValue) != 0) + white_point=geometry_info.sigma; + if ((flags & XiValue) != 0) + gamma=geometry_info.xi; + if ((flags & PercentValue) != 0) + { + black_point*=(double) (QuantumRange/100.0); + white_point*=(double) (QuantumRange/100.0); + } + if ((flags & SigmaValue) == 0) + white_point=(double) QuantumRange-black_point; + } + if (attribute_flag[1] != 0) + black_point=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + white_point=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + gamma=argument_list[3].real_reference; + if (attribute_flag[4] != 0) + channel=(ChannelType) argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + { + argument_list[0].real_reference=argument_list[5].real_reference; + attribute_flag[0]=attribute_flag[5]; + } + (void) LevelImageChannel(image,channel,black_point,white_point,gamma); + break; + } + case 74: /* Clip */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference="#1"; + if (attribute_flag[1] == 0) + argument_list[1].integer_reference=MagickTrue; + (void) ClipImagePath(image,argument_list[0].string_reference, + argument_list[1].integer_reference != 0 ? MagickTrue : MagickFalse); + break; + } + case 75: /* AffineTransform */ + { + DrawInfo + *draw_info; + + draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL, + (DrawInfo *) NULL); + if (attribute_flag[0] != 0) + { + AV + *av; + + av=(AV *) argument_list[0].array_reference; + if ((av_len(av) != 3) && (av_len(av) != 5)) + { + ThrowPerlException(exception,OptionError, + "affine matrix must have 4 or 6 elements",PackageName); + goto PerlException; + } + draw_info->affine.sx=(double) SvNV(*(av_fetch(av,0,0))); + draw_info->affine.rx=(double) SvNV(*(av_fetch(av,1,0))); + draw_info->affine.ry=(double) SvNV(*(av_fetch(av,2,0))); + draw_info->affine.sy=(double) SvNV(*(av_fetch(av,3,0))); + if (fabs(draw_info->affine.sx*draw_info->affine.sy- + draw_info->affine.rx*draw_info->affine.ry) < MagickEpsilon) + { + ThrowPerlException(exception,OptionError, + "affine matrix is singular",PackageName); + goto PerlException; + } + if (av_len(av) == 5) + { + draw_info->affine.tx=(double) SvNV(*(av_fetch(av,4,0))); + draw_info->affine.ty=(double) SvNV(*(av_fetch(av,5,0))); + } + } + for (j=1; j < 6; j++) + { + if (attribute_flag[j] == 0) + continue; + value=argument_list[j].string_reference; + angle=argument_list[j].real_reference; + current=draw_info->affine; + GetAffineMatrix(&affine); + switch (j) + { + case 1: + { + /* + Translate. + */ + flags=ParseGeometry(value,&geometry_info); + affine.tx=geometry_info.xi; + affine.ty=geometry_info.psi; + if ((flags & PsiValue) == 0) + affine.ty=affine.tx; + break; + } + case 2: + { + /* + Scale. + */ + flags=ParseGeometry(value,&geometry_info); + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.sy=affine.sx; + break; + } + case 3: + { + /* + Rotate. + */ + if (angle == 0.0) + break; + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 4: + { + /* + SkewX. + */ + affine.ry=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + case 5: + { + /* + SkewY. + */ + affine.rx=tan(DegreesToRadians(fmod(angle,360.0))); + break; + } + } + draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + draw_info->affine.tx= + current.sx*affine.tx+current.ry*affine.ty+current.tx; + draw_info->affine.ty= + current.rx*affine.tx+current.sy*affine.ty+current.ty; + } + if (attribute_flag[6] != 0) + image->interpolate=(InterpolatePixelMethod) + argument_list[6].integer_reference; + if (attribute_flag[7] != 0) + QueryColorDatabase(argument_list[7].string_reference, + &image->background_color,exception); + image=AffineTransformImage(image,&draw_info->affine,exception); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 76: /* Difference */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError, + "ReferenceImageRequired",PackageName); + goto PerlException; + } + if (attribute_flag[1] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[1].string_reference,(double) QuantumRange+1.0); + (void) IsImagesEqual(image,argument_list[0].image_reference); + break; + } + case 77: /* AdaptiveThreshold */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & PercentValue) != 0) + geometry_info.xi=QuantumRange*geometry_info.xi/100.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].integer_reference;; + image=AdaptiveThresholdImage(image,(size_t) geometry_info.rho, + (size_t) geometry_info.sigma,(ssize_t) geometry_info.xi, + exception); + break; + } + case 78: /* Resample */ + { + size_t + height, + width; + + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] == 0) + argument_list[3].integer_reference=(ssize_t) UndefinedFilter; + if (attribute_flag[4] == 0) + SetImageArtifact(image,"filter:support", + argument_list[4].string_reference); + if (attribute_flag[5] != 0) + argument_list[5].real_reference=1.0; + width=(size_t) (geometry_info.rho*image->columns/ + (image->x_resolution == 0.0 ? 72.0 : image->x_resolution)+0.5); + height=(size_t) (geometry_info.sigma*image->rows/ + (image->y_resolution == 0.0 ? 72.0 : image->y_resolution)+0.5); + image=ResizeImage(image,width,height,(FilterTypes) + argument_list[3].integer_reference,argument_list[5].real_reference, + exception); + if (image != (Image *) NULL) + { + image->x_resolution=geometry_info.rho; + image->y_resolution=geometry_info.sigma; + } + break; + } + case 79: /* Describe */ + { + if (attribute_flag[0] == 0) + argument_list[0].file_reference=(FILE *) NULL; + (void) IdentifyImage(image,argument_list[0].file_reference, + MagickTrue); + break; + } + case 80: /* BlackThreshold */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference="50%"; + if (attribute_flag[2] != 0) + channel=(ChannelType) argument_list[2].integer_reference; + BlackThresholdImageChannel(image,channel, + argument_list[0].string_reference,exception); + break; + } + case 81: /* WhiteThreshold */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference="50%"; + if (attribute_flag[2] != 0) + channel=(ChannelType) argument_list[2].integer_reference; + WhiteThresholdImageChannel(image,channel, + argument_list[0].string_reference,exception); + break; + } + case 82: /* RotationalBlur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + channel=(ChannelType) argument_list[2].integer_reference; + image=RotationalBlurImageChannel(image,channel,geometry_info.rho, + exception); + break; + } + case 83: /* Thumbnail */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + image=ThumbnailImage(image,geometry.width,geometry.height,exception); + break; + } + case 84: /* Strip */ + { + (void) StripImage(image); + break; + } + case 85: /* Tint */ + { + PixelPacket + target; + + (void) GetOneVirtualPixel(image,0,0,&target,exception); + if (attribute_flag[0] != 0) + (void) QueryColorDatabase(argument_list[0].string_reference,&target, + exception); + if (attribute_flag[1] == 0) + argument_list[1].string_reference="100"; + image=TintImage(image,argument_list[1].string_reference,target, + exception); + break; + } + case 86: /* Channel */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + (void) SeparateImageChannel(image,channel); + break; + } + case 87: /* Splice */ + { + if (attribute_flag[7] != 0) + image->gravity=(GravityType) argument_list[7].integer_reference; + if (attribute_flag[0] != 0) + flags=ParseGravityGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry.x=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry.y=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[6] != 0) + (void) QueryColorDatabase(argument_list[6].string_reference, + &image->background_color,exception); + image=SpliceImage(image,&geometry,exception); + break; + } + case 88: /* Posterize */ + { + if (attribute_flag[0] == 0) + argument_list[0].integer_reference=3; + if (attribute_flag[1] == 0) + argument_list[1].integer_reference=0; + (void) PosterizeImage(image,argument_list[0].integer_reference, + argument_list[1].integer_reference ? MagickTrue : MagickFalse); + break; + } + case 89: /* Shadow */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=4.0; + if ((flags & PsiValue) == 0) + geometry_info.psi=4.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry_info.psi=argument_list[4].integer_reference; + image=ShadowImage(image,geometry_info.rho,geometry_info.sigma, + (ssize_t) ceil(geometry_info.xi-0.5),(ssize_t) ceil(geometry_info.psi- + 0.5),exception); + break; + } + case 90: /* Identify */ + { + if (attribute_flag[0] == 0) + argument_list[0].file_reference=(FILE *) NULL; + if (attribute_flag[1] != 0) + (void) SetImageArtifact(image,"identify:features", + argument_list[1].string_reference); + if ((attribute_flag[2] != 0) && + (argument_list[2].integer_reference != 0)) + (void) SetImageArtifact(image,"identify:moments","true"); + if ((attribute_flag[3] != 0) && + (argument_list[3].integer_reference != 0)) + (void) SetImageArtifact(image,"identify:unique","true"); + (void) IdentifyImage(image,argument_list[0].file_reference, + MagickTrue); + break; + } + case 91: /* SepiaTone */ + { + if (attribute_flag[0] == 0) + argument_list[0].real_reference=80.0*QuantumRange/100.0; + image=SepiaToneImage(image,argument_list[0].real_reference, + exception); + break; + } + case 92: /* SigmoidalContrast */ + { + MagickBooleanType + sharpen; + + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=QuantumRange/2.0; + if ((flags & PercentValue) != 0) + geometry_info.sigma=QuantumRange*geometry_info.sigma/100.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + sharpen=MagickTrue; + if (attribute_flag[4] != 0) + sharpen=argument_list[4].integer_reference != 0 ? MagickTrue : + MagickFalse; + (void) SigmoidalContrastImageChannel(image,channel,sharpen, + geometry_info.rho,geometry_info.sigma); + break; + } + case 93: /* Extent */ + { + if (attribute_flag[7] != 0) + image->gravity=(GravityType) argument_list[7].integer_reference; + if (attribute_flag[0] != 0) + { + int + flags; + + flags=ParseGravityGeometry(image, + argument_list[0].string_reference,&geometry,exception); + (void) flags; + if (geometry.width == 0) + geometry.width=image->columns; + if (geometry.height == 0) + geometry.height=image->rows; + } + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry.x=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry.y=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[6] != 0) + (void) QueryColorDatabase(argument_list[6].string_reference, + &image->background_color,exception); + image=ExtentImage(image,&geometry,exception); + break; + } + case 94: /* Vignette */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=0.1*image->columns; + if ((flags & PsiValue) == 0) + geometry_info.psi=0.1*image->rows; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry_info.psi=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + (void) QueryColorDatabase(argument_list[5].string_reference, + &image->background_color,exception); + image=VignetteImage(image,geometry_info.rho,geometry_info.sigma, + (ssize_t) ceil(geometry_info.xi-0.5),(ssize_t) ceil(geometry_info.psi- + 0.5),exception); + break; + } + case 95: /* ContrastStretch */ + { + double + black_point, + white_point; + + black_point=0.0; + white_point=(MagickRealType) image->columns*image->rows; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + black_point=geometry_info.rho; + white_point=(flags & SigmaValue) != 0 ? geometry_info.sigma : + black_point; + if ((flags & PercentValue) != 0) + { + black_point*=(double) image->columns*image->rows/100.0; + white_point*=(double) image->columns*image->rows/100.0; + } + white_point=(MagickRealType) image->columns*image->rows- + white_point; + } + if (attribute_flag[1] != 0) + black_point=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + white_point=argument_list[2].real_reference; + if (attribute_flag[4] != 0) + channel=(ChannelType) argument_list[4].integer_reference; + (void) ContrastStretchImageChannel(image,channel,black_point, + white_point); + break; + } + case 96: /* Sans0 */ + { + break; + } + case 97: /* Sans1 */ + { + break; + } + case 98: /* AdaptiveSharpen */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=AdaptiveSharpenImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 99: /* Transpose */ + { + image=TransposeImage(image,exception); + break; + } + case 100: /* Tranverse */ + { + image=TransverseImage(image,exception); + break; + } + case 101: /* AutoOrient */ + { + image=AutoOrientImage(image,image->orientation,exception); + break; + } + case 102: /* AdaptiveBlur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=AdaptiveBlurImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 103: /* Sketch */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].real_reference; + image=SketchImage(image,geometry_info.rho,geometry_info.sigma, + geometry_info.xi,exception); + break; + } + case 104: /* UniqueColors */ + { + image=UniqueImageColors(image,exception); + break; + } + case 105: /* AdaptiveResize */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + image->filter=(FilterTypes) argument_list[4].integer_reference; + if (attribute_flag[4] != 0) + SetImageArtifact(image,"filter:support", + argument_list[4].string_reference); + if (attribute_flag[5] != 0) + image->blur=argument_list[5].real_reference; + image=AdaptiveResizeImage(image,geometry.width,geometry.height, + exception); + break; + } + case 106: /* ClipMask */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"MaskImageRequired", + PackageName); + goto PerlException; + } + image->clip_mask=CloneImage(argument_list[0].image_reference,0,0, + MagickTrue,exception); + (void) NegateImage(image->clip_mask,MagickFalse); + break; + } + case 107: /* LinearStretch */ + { + double + black_point, + white_point; + + black_point=0.0; + white_point=(MagickRealType) image->columns*image->rows; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) != 0) + white_point=geometry_info.sigma; + if ((flags & PercentValue) != 0) + { + black_point*=(double) image->columns*image->rows/100.0; + white_point*=(double) image->columns*image->rows/100.0; + } + if ((flags & SigmaValue) == 0) + white_point=(double) image->columns*image->rows-black_point; + } + if (attribute_flag[1] != 0) + black_point=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + white_point=argument_list[2].real_reference; + (void) LinearStretchImage(image,black_point,white_point); + break; + } + case 109: /* Mask */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"MaskImageRequired", + PackageName); + goto PerlException; + } + image->mask=CloneImage(argument_list[0].image_reference,0,0, + MagickTrue,exception); + (void) NegateImage(image->mask,MagickFalse); + break; + } + case 110: /* Polaroid */ + { + DrawInfo + *draw_info; + + double + angle; + + draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL, + (DrawInfo *) NULL); + if (attribute_flag[0] != 0) + (void) SetImageProperty(image,"caption",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,image, + argument_list[0].string_reference)); + angle=0.0; + if (attribute_flag[1] != 0) + angle=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + (void) CloneString(&draw_info->font, + argument_list[2].string_reference); + if (attribute_flag[3] != 0) + (void) QueryColorDatabase(argument_list[3].string_reference, + &draw_info->stroke,exception); + if (attribute_flag[4] != 0) + (void) QueryColorDatabase(argument_list[4].string_reference, + &draw_info->fill,exception); + if (attribute_flag[5] != 0) + draw_info->stroke_width=argument_list[5].real_reference; + if (attribute_flag[6] != 0) + draw_info->pointsize=argument_list[6].real_reference; + if (attribute_flag[7] != 0) + draw_info->gravity=(GravityType) argument_list[7].integer_reference; + if (attribute_flag[8] != 0) + (void) QueryColorDatabase(argument_list[8].string_reference, + &image->background_color,exception); + image=PolaroidImage(image,draw_info,angle,exception); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 111: /* FloodfillPaint */ + { + DrawInfo + *draw_info; + + MagickBooleanType + invert; + + MagickPixelPacket + target; + + draw_info=CloneDrawInfo(info ? info->image_info : + (ImageInfo *) NULL,(DrawInfo *) NULL); + if (attribute_flag[0] != 0) + flags=ParsePageGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.x=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.y=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + (void) QueryColorDatabase(argument_list[3].string_reference, + &draw_info->fill,exception); + (void) GetOneVirtualMagickPixel(image,geometry.x,geometry.y,&target, + exception); + if (attribute_flag[4] != 0) + QueryMagickColor(argument_list[4].string_reference,&target, + exception); + if (attribute_flag[5] != 0) + image->fuzz=StringToDoubleInterval( + argument_list[5].string_reference,(double) QuantumRange+1.0); + if (attribute_flag[6] != 0) + channel=(ChannelType) argument_list[6].integer_reference; + invert=MagickFalse; + if (attribute_flag[7] != 0) + invert=(MagickBooleanType) argument_list[7].integer_reference; + (void) FloodfillPaintImage(image,channel,draw_info,&target,geometry.x, + geometry.y,invert); + draw_info=DestroyDrawInfo(draw_info); + break; + } + case 112: /* Distort */ + { + AV + *av; + + double + *coordinates; + + DistortImageMethod + method; + + size_t + number_coordinates; + + VirtualPixelMethod + virtual_pixel; + + if (attribute_flag[0] == 0) + break; + method=UndefinedDistortion; + if (attribute_flag[1] != 0) + method=(DistortImageMethod) argument_list[1].integer_reference; + av=(AV *) argument_list[0].array_reference; + number_coordinates=(size_t) av_len(av)+1; + coordinates=(double *) AcquireQuantumMemory(number_coordinates, + sizeof(*coordinates)); + if (coordinates == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; j < (ssize_t) number_coordinates; j++) + coordinates[j]=(double) SvNV(*(av_fetch(av,j,0))); + virtual_pixel=UndefinedVirtualPixelMethod; + if (attribute_flag[2] != 0) + virtual_pixel=SetImageVirtualPixelMethod(image,(VirtualPixelMethod) + argument_list[2].integer_reference); + image=DistortImage(image,method,number_coordinates,coordinates, + argument_list[3].integer_reference != 0 ? MagickTrue : MagickFalse, + exception); + if ((attribute_flag[2] != 0) && (image != (Image *) NULL)) + virtual_pixel=SetImageVirtualPixelMethod(image,virtual_pixel); + coordinates=(double *) RelinquishMagickMemory(coordinates); + break; + } + case 113: /* Clut */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"ClutImageRequired", + PackageName); + goto PerlException; + } + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + (void) ClutImageChannel(image,channel, + argument_list[0].image_reference); + break; + } + case 114: /* LiquidRescale */ + { + if (attribute_flag[0] != 0) + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); + if (attribute_flag[1] != 0) + geometry.width=argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry.height=argument_list[2].integer_reference; + if (attribute_flag[3] == 0) + argument_list[3].real_reference=1.0; + if (attribute_flag[4] == 0) + argument_list[4].real_reference=0.0; + image=LiquidRescaleImage(image,geometry.width,geometry.height, + argument_list[3].real_reference,argument_list[4].real_reference, + exception); + break; + } + case 115: /* EncipherImage */ + { + (void) EncipherImage(image,argument_list[0].string_reference, + exception); + break; + } + case 116: /* DecipherImage */ + { + (void) DecipherImage(image,argument_list[0].string_reference, + exception); + break; + } + case 117: /* Deskew */ + { + geometry_info.rho=QuantumRange/2.0; + if (attribute_flag[0] != 0) + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if (attribute_flag[1] != 0) + geometry_info.rho=StringToDoubleInterval( + argument_list[1].string_reference,(double) QuantumRange+1.0); + image=DeskewImage(image,geometry_info.rho,exception); + break; + } + case 118: /* Remap */ + { + QuantizeInfo + *quantize_info; + + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"RemapImageRequired", + PackageName); + goto PerlException; + } + quantize_info=AcquireQuantizeInfo(info->image_info); + if (attribute_flag[1] != 0) + quantize_info->dither=(MagickBooleanType) + argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + quantize_info->dither_method=(DitherMethod) + argument_list[2].integer_reference; + (void) RemapImages(quantize_info,image, + argument_list[0].image_reference); + quantize_info=DestroyQuantizeInfo(quantize_info); + break; + } + case 119: /* SparseColor */ + { + AV + *av; + + double + *coordinates; + + SparseColorMethod + method; + + size_t + number_coordinates; + + VirtualPixelMethod + virtual_pixel; + + if (attribute_flag[0] == 0) + break; + method=UndefinedColorInterpolate; + if (attribute_flag[1] != 0) + method=(SparseColorMethod) argument_list[1].integer_reference; + av=(AV *) argument_list[0].array_reference; + number_coordinates=(size_t) av_len(av)+1; + coordinates=(double *) AcquireQuantumMemory(number_coordinates, + sizeof(*coordinates)); + if (coordinates == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; j < (ssize_t) number_coordinates; j++) + coordinates[j]=(double) SvNV(*(av_fetch(av,j,0))); + virtual_pixel=UndefinedVirtualPixelMethod; + if (attribute_flag[2] != 0) + virtual_pixel=SetImageVirtualPixelMethod(image,(VirtualPixelMethod) + argument_list[2].integer_reference); + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=SparseColorImage(image,channel,method,number_coordinates, + coordinates,exception); + if ((attribute_flag[2] != 0) && (image != (Image *) NULL)) + virtual_pixel=SetImageVirtualPixelMethod(image,virtual_pixel); + coordinates=(double *) RelinquishMagickMemory(coordinates); + break; + } + case 120: /* Function */ + { + AV + *av; + + double + *parameters; + + MagickFunction + function; + + size_t + number_parameters; + + VirtualPixelMethod + virtual_pixel; + + if (attribute_flag[0] == 0) + break; + function=UndefinedFunction; + if (attribute_flag[1] != 0) + function=(MagickFunction) argument_list[1].integer_reference; + av=(AV *) argument_list[0].array_reference; + number_parameters=(size_t) av_len(av)+1; + parameters=(double *) AcquireQuantumMemory(number_parameters, + sizeof(*parameters)); + if (parameters == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; j < (ssize_t) number_parameters; j++) + parameters[j]=(double) SvNV(*(av_fetch(av,j,0))); + virtual_pixel=UndefinedVirtualPixelMethod; + if (attribute_flag[2] != 0) + virtual_pixel=SetImageVirtualPixelMethod(image,(VirtualPixelMethod) + argument_list[2].integer_reference); + (void) FunctionImage(image,function,number_parameters,parameters, + exception); + if ((attribute_flag[2] != 0) && (image != (Image *) NULL)) + virtual_pixel=SetImageVirtualPixelMethod(image,virtual_pixel); + parameters=(double *) RelinquishMagickMemory(parameters); + break; + } + case 121: /* SelectiveBlur */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & PercentValue) != 0) + geometry_info.xi=QuantumRange*geometry_info.xi/100.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].integer_reference;; + if (attribute_flag[4] != 0) + channel=(ChannelType) argument_list[4].integer_reference; + image=SelectiveBlurImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,geometry_info.xi,exception); + break; + } + case 122: /* HaldClut */ + { + if (attribute_flag[0] == 0) + { + ThrowPerlException(exception,OptionError,"ClutImageRequired", + PackageName); + goto PerlException; + } + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + (void) HaldClutImageChannel(image,channel, + argument_list[0].image_reference); + break; + } + case 123: /* BlueShift */ + { + if (attribute_flag[0] != 0) + (void) ParseGeometry(argument_list[0].string_reference, + &geometry_info); + image=BlueShiftImage(image,geometry_info.rho,exception); + break; + } + case 124: /* ForwardFourierTransformImage */ + { + image=ForwardFourierTransformImage(image, + argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse, + exception); + break; + } + case 125: /* InverseFourierTransformImage */ + { + image=InverseFourierTransformImage(image,image->next, + argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse, + exception); + break; + } + case 126: /* ColorDecisionList */ + { + if (attribute_flag[0] == 0) + argument_list[0].string_reference=(char *) NULL; + (void) ColorDecisionListImage(image, + argument_list[0].string_reference); + break; + } + case 127: /* AutoGamma */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + (void) AutoGammaImageChannel(image,channel); + break; + } + case 128: /* AutoLevel */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + (void) AutoLevelImageChannel(image,channel); + break; + } + case 129: /* LevelColors */ + { + MagickPixelPacket + black_point, + white_point; + + (void) QueryMagickColor("#000000",&black_point,exception); + (void) QueryMagickColor("#ffffff",&white_point,exception); + if (attribute_flag[1] != 0) + (void) QueryMagickColor(argument_list[1].string_reference, + &black_point,exception); + if (attribute_flag[2] != 0) + (void) QueryMagickColor(argument_list[2].string_reference, + &white_point,exception); + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + (void) LevelColorsImageChannel(image,channel,&black_point, + &white_point,argument_list[0].integer_reference != 0 ? MagickTrue : + MagickFalse); + break; + } + case 130: /* Clamp */ + { + if (attribute_flag[0] != 0) + channel=(ChannelType) argument_list[0].integer_reference; + (void) ClampImageChannel(image,channel); + break; + } + case 131: /* Filter */ + { + KernelInfo + *kernel; + + if (attribute_flag[0] == 0) + break; + kernel=AcquireKernelInfo(argument_list[0].string_reference); + if (kernel == (KernelInfo *) NULL) + break; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + image->bias=StringToDoubleInterval( + argument_list[2].string_reference,(double) QuantumRange+1.0); + image=FilterImageChannel(image,channel,kernel,exception); + kernel=DestroyKernelInfo(kernel); + break; + } + case 132: /* BrightnessContrast */ + { + double + brightness, + contrast; + + brightness=0.0; + contrast=0.0; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + brightness=geometry_info.rho; + if ((flags & SigmaValue) == 0) + contrast=geometry_info.sigma; + } + if (attribute_flag[1] != 0) + brightness=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + contrast=argument_list[2].real_reference; + if (attribute_flag[4] != 0) + channel=(ChannelType) argument_list[4].integer_reference; + (void) BrightnessContrastImageChannel(image,channel,brightness, + contrast); + break; + } + case 133: /* Morphology */ + { + KernelInfo + *kernel; + + MorphologyMethod + method; + + ssize_t + iterations; + + if (attribute_flag[0] == 0) + break; + kernel=AcquireKernelInfo(argument_list[0].string_reference); + if (kernel == (KernelInfo *) NULL) + break; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + method=UndefinedMorphology; + if (attribute_flag[2] != 0) + method=argument_list[2].integer_reference; + iterations=1; + if (attribute_flag[3] != 0) + iterations=argument_list[3].integer_reference; + image=MorphologyImageChannel(image,channel,method,iterations,kernel, + exception); + kernel=DestroyKernelInfo(kernel); + break; + } + case 108: /* Recolor */ + case 134: /* ColorMatrix */ + { + AV + *av; + + double + *color_matrix; + + KernelInfo + *kernel_info; + + size_t + order; + + if (attribute_flag[0] == 0) + break; + av=(AV *) argument_list[0].array_reference; + order=(size_t) sqrt(av_len(av)+1); + color_matrix=(double *) AcquireQuantumMemory(order,order* + sizeof(*color_matrix)); + if (color_matrix == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; (j < (ssize_t) (order*order)) && (j < (av_len(av)+1)); j++) + color_matrix[j]=(double) SvNV(*(av_fetch(av,j,0))); + for ( ; j < (ssize_t) (order*order); j++) + color_matrix[j]=0.0; + kernel_info=AcquireKernelInfo("1"); + if (kernel_info == (KernelInfo *) NULL) + break; + kernel_info->width=order; + kernel_info->height=order; + kernel_info->values=color_matrix; + image=ColorMatrixImage(image,kernel_info,exception); + kernel_info->values=(double *) NULL; + kernel_info=DestroyKernelInfo(kernel_info); + color_matrix=(double *) RelinquishMagickMemory(color_matrix); + break; + } + case 135: /* Color */ + { + MagickPixelPacket + color; + + (void) QueryMagickColor("none",&color,exception); + if (attribute_flag[0] != 0) + (void) QueryMagickColor(argument_list[0].string_reference, + &color,exception); + (void) SetImageColor(image,&color); + break; + } + case 136: /* Mode */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=StatisticImageChannel(image,channel,ModeStatistic, + (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception); + break; + } + case 137: /* Statistic */ + { + StatisticType + statistic; + + statistic=UndefinedStatistic; + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + statistic=(StatisticType) argument_list[4].integer_reference; + image=StatisticImageChannel(image,channel,statistic, + (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception); + break; + } + case 138: /* Perceptible */ + { + double + epsilon; + + epsilon=MagickEpsilon; + if (attribute_flag[0] != 0) + epsilon=argument_list[0].real_reference; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + (void) PerceptibleImageChannel(image,channel,epsilon); + break; + } + case 139: /* Poly */ + { + AV + *av; + + double + *terms; + + size_t + number_terms; + + if (attribute_flag[0] == 0) + break; + if (attribute_flag[1] != 0) + channel=(ChannelType) argument_list[1].integer_reference; + av=(AV *) argument_list[0].array_reference; + number_terms=(size_t) av_len(av); + terms=(double *) AcquireQuantumMemory(number_terms,sizeof(*terms)); + if (terms == (double *) NULL) + { + ThrowPerlException(exception,ResourceLimitFatalError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + for (j=0; j < av_len(av); j++) + terms[j]=(double) SvNV(*(av_fetch(av,j,0))); + image=PolynomialImageChannel(image,channel,number_terms >> 1,terms, + exception); + terms=(double *) RelinquishMagickMemory(terms); + break; + } + case 140: /* Grayscale */ + { + PixelIntensityMethod + method; + + method=UndefinedPixelIntensityMethod; + if (attribute_flag[0] != 0) + method=(PixelIntensityMethod) argument_list[0].integer_reference; + (void) GrayscaleImage(image,method); + break; + } + case 141: /* CannyEdge */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=0.10; + if ((flags & PsiValue) == 0) + geometry_info.psi=0.30; + if ((flags & PercentValue) != 0) + { + geometry_info.xi/=100.0; + geometry_info.psi/=100.0; + } + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=argument_list[3].real_reference; + if (attribute_flag[4] != 0) + geometry_info.psi=argument_list[4].real_reference; + image=CannyEdgeImage(image,geometry_info.rho,geometry_info.sigma, + geometry_info.xi,geometry_info.psi,exception); + break; + } + case 142: /* HoughLine */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + if ((flags & XiValue) == 0) + geometry_info.xi=40; + } + if (attribute_flag[1] != 0) + geometry_info.rho=(double) argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=(double) argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=(double) argument_list[3].integer_reference; + image=HoughLineImage(image,(size_t) geometry_info.rho,(size_t) + geometry_info.sigma,(size_t) geometry_info.xi,exception); + break; + } + case 143: /* MeanShift */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + if ((flags & XiValue) == 0) + geometry_info.xi=0.10*QuantumRange; + if ((flags & PercentValue) != 0) + geometry_info.xi=QuantumRange*geometry_info.xi/100.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=(double) argument_list[1].integer_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=(double) argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry_info.xi=(double) argument_list[3].real_reference; + image=MeanShiftImage(image,(size_t) geometry_info.rho,(size_t) + geometry_info.sigma,geometry_info.xi,exception); + break; + } + case 144: /* Kuwahara */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho-0.5; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + image=KuwaharaImageChannel(image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + case 145: /* ConnectedComponent */ + { + MagickBooleanType + verbose; + + size_t + connectivity; + + connectivity=4; + verbose=MagickFalse; + if (attribute_flag[0] != 0) + connectivity=argument_list[0].integer_reference; + if (attribute_flag[1] != 0) + verbose=argument_list[4].integer_reference != 0 ? + MagickTrue : MagickFalse; + if (verbose != MagickFalse) + SetImageArtifact(image,"connected-components","true"); + image=ConnectedComponentsImage(image,connectivity,exception); + break; + } + case 146: /* Copy */ + { + Image + *source_image; + + OffsetInfo + offset; + + RectangleInfo + offset_geometry; + + source_image=image; + if (attribute_flag[0] != 0) + source_image=argument_list[0].image_reference; + SetGeometry(source_image,&geometry); + if (attribute_flag[1] != 0) + flags=ParseGravityGeometry(source_image, + argument_list[1].string_reference,&geometry,exception); + if (attribute_flag[2] != 0) + geometry.width=argument_list[2].integer_reference; + if (attribute_flag[3] != 0) + geometry.height=argument_list[3].integer_reference; + if (attribute_flag[4] != 0) + geometry.x=argument_list[4].integer_reference; + if (attribute_flag[5] != 0) + geometry.y=argument_list[5].integer_reference; + if (attribute_flag[6] != 0) + image->gravity=(GravityType) argument_list[6].integer_reference; + SetGeometry(image,&offset_geometry); + if (attribute_flag[7] != 0) + flags=ParseGravityGeometry(image,argument_list[7].string_reference, + &offset_geometry,exception); + offset.x=offset_geometry.x; + offset.y=offset_geometry.y; + if (attribute_flag[8] != 0) + offset.x=argument_list[8].integer_reference; + if (attribute_flag[9] != 0) + offset.y=argument_list[9].integer_reference; + (void) CopyImagePixels(image,source_image,&geometry,&offset, + exception); + break; + } + case 147: /* WaveletDenoise */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & PercentValue) != 0) + { + geometry_info.rho=QuantumRange*geometry_info.rho/100.0; + geometry_info.sigma=QuantumRange*geometry_info.sigma/100.0; + } + if ((flags & SigmaValue) == 0) + geometry_info.sigma=0.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + image=WaveletDenoiseImage(image,geometry_info.rho,geometry_info.sigma, exception); + break; + } + case 148: /* Colorspace */ + { + ColorspaceType + colorspace; + + colorspace=sRGBColorspace; + if (attribute_flag[0] != 0) + colorspace=(ColorspaceType) argument_list[0].integer_reference; + (void) TransformImageColorspace(image,colorspace); + break; + } + case 149: /* AutoThreshold */ + { + AutoThresholdMethod + method; + + method=UndefinedThresholdMethod; + if (attribute_flag[0] != 0) + method=(AutoThresholdMethod) argument_list[0].integer_reference; + (void) AutoThresholdImage(image,method,exception); + break; + } + } + if (next != (Image *) NULL) + (void) CatchImageException(next); + if (region_image != (Image *) NULL) + { + /* + Composite region. + */ + status=CompositeImage(region_image,CopyCompositeOp,image, + region_info.x,region_info.y); + (void) status; + (void) CatchImageException(region_image); + image=DestroyImage(image); + image=region_image; + } + if (image != (Image *) NULL) + { + number_images++; + if (next && (next != image)) + { + image->next=next->next; + if (image->next != (Image *) NULL) + image->next->previous=image; + DeleteImageFromRegistry(*pv,next); + } + sv_setiv(*pv,PTR2IV(image)); + next=image; + } + if (*pv) + pv++; + } + + PerlException: + if (reference_vector) + reference_vector=(SV **) RelinquishMagickMemory(reference_vector); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) number_images); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# M o n t a g e # +# # +# # +# # +############################################################################### +# +# +void +Montage(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + MontageImage = 1 + montage = 2 + montageimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image, + *next; + + MagickPixelPacket + transparent_color; + + MontageInfo + *montage_info; + + ssize_t + i; + + ssize_t + sp; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + attribute=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + /* + Get options. + */ + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + montage_info=CloneMontageInfo(info->image_info,(MontageInfo *) NULL); + (void) QueryMagickColor("none",&transparent_color,exception); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'B': + case 'b': + { + if (LocaleCompare(attribute,"background") == 0) + { + (void) QueryColorDatabase(SvPV(ST(i),na), + &montage_info->background_color,exception); + for (next=image; next; next=next->next) + next->background_color=montage_info->background_color; + break; + } + if (LocaleCompare(attribute,"border") == 0) + { + montage_info->border_width=SvIV(ST(i)); + break; + } + if (LocaleCompare(attribute,"bordercolor") == 0) + { + (void) QueryColorDatabase(SvPV(ST(i),na), + &montage_info->border_color,exception); + for (next=image; next; next=next->next) + next->border_color=montage_info->border_color; + break; + } + if (LocaleCompare(attribute,"borderwidth") == 0) + { + montage_info->border_width=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"compose") == 0) + { + sp=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickComposeOptions,MagickFalse,SvPV(ST(i),na)); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + for (next=image; next; next=next->next) + next->compose=(CompositeOperator) sp; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(attribute,"fill") == 0) + { + (void) QueryColorDatabase(SvPV(ST(i),na),&montage_info->fill, + exception); + break; + } + if (LocaleCompare(attribute,"font") == 0) + { + (void) CloneString(&montage_info->font,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"frame") == 0) + { + char + *p; + + p=SvPV(ST(i),na); + if (IsGeometry(p) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + p); + break; + } + (void) CloneString(&montage_info->frame,p); + if (*p == '\0') + montage_info->frame=(char *) NULL; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + char + *p; + + p=SvPV(ST(i),na); + if (IsGeometry(p) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + p); + break; + } + (void) CloneString(&montage_info->geometry,p); + if (*p == '\0') + montage_info->geometry=(char *) NULL; + break; + } + if (LocaleCompare(attribute,"gravity") == 0) + { + ssize_t + in; + + in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickGravityOptions,MagickFalse,SvPV(ST(i),na)); + if (in < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + montage_info->gravity=(GravityType) in; + for (next=image; next; next=next->next) + next->gravity=(GravityType) in; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'L': + case 'l': + { + if (LocaleCompare(attribute,"label") == 0) + { + for (next=image; next; next=next->next) + (void) SetImageProperty(next,"label",InterpretImageProperties( + info ? info->image_info : (ImageInfo *) NULL,next, + SvPV(ST(i),na))); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(attribute,"mattecolor") == 0) + { + (void) QueryColorDatabase(SvPV(ST(i),na), + &montage_info->matte_color,exception); + for (next=image; next; next=next->next) + next->matte_color=montage_info->matte_color; + break; + } + if (LocaleCompare(attribute,"mode") == 0) + { + ssize_t + in; + + in=!SvPOK(ST(i)) ? SvIV(ST(i)) : + ParseCommandOption(MagickModeOptions,MagickFalse,SvPV(ST(i),na)); + switch (in) + { + default: + { + ThrowPerlException(exception,OptionError, + "UnrecognizedModeType",SvPV(ST(i),na)); + break; + } + case FrameMode: + { + (void) CloneString(&montage_info->frame,"15x15+3+3"); + montage_info->shadow=MagickTrue; + break; + } + case UnframeMode: + { + montage_info->frame=(char *) NULL; + montage_info->shadow=MagickFalse; + montage_info->border_width=0; + break; + } + case ConcatenateMode: + { + montage_info->frame=(char *) NULL; + montage_info->shadow=MagickFalse; + (void) CloneString(&montage_info->geometry,"+0+0"); + montage_info->border_width=0; + } + } + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(attribute,"pointsize") == 0) + { + montage_info->pointsize=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(attribute,"shadow") == 0) + { + sp=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption( + MagickBooleanOptions,MagickFalse,SvPV(ST(i),na)); + if (sp < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + montage_info->shadow=sp != 0 ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare(attribute,"stroke") == 0) + { + (void) QueryColorDatabase(SvPV(ST(i),na),&montage_info->stroke, + exception); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(attribute,"texture") == 0) + { + (void) CloneString(&montage_info->texture,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"tile") == 0) + { + char *p=SvPV(ST(i),na); + if (IsGeometry(p) == MagickFalse) + { + ThrowPerlException(exception,OptionError,"MissingGeometry", + p); + break; + } + (void) CloneString(&montage_info->tile,p); + if (*p == '\0') + montage_info->tile=(char *) NULL; + break; + } + if (LocaleCompare(attribute,"title") == 0) + { + (void) CloneString(&montage_info->title,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"transparent") == 0) + { + MagickPixelPacket + transparent_color; + + QueryMagickColor(SvPV(ST(i),na),&transparent_color,exception); + for (next=image; next; next=next->next) + (void) TransparentPaintImage(next,&transparent_color, + TransparentOpacity,MagickFalse); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=MontageImageList(info->image_info,montage_info,image,exception); + montage_info=DestroyMontageInfo(montage_info); + if (image == (Image *) NULL) + goto PerlException; + if (transparent_color.opacity != TransparentOpacity) + for (next=image; next; next=next->next) + (void) TransparentPaintImage(next,&transparent_color, + TransparentOpacity,MagickFalse); + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# M o r p h # +# # +# # +# # +############################################################################### +# +# +void +Morph(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + MorphImage = 1 + morph = 2 + morphimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ssize_t + i; + + ssize_t + number_frames; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + av=NULL; + attribute=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get attribute. + */ + number_frames=30; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'F': + case 'f': + { + if (LocaleCompare(attribute,"frames") == 0) + { + number_frames=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=MorphImages(image,number_frames,exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# M o s a i c # +# # +# # +# # +############################################################################### +# +# +void +Mosaic(ref) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + MosaicImage = 1 + mosaic = 2 + mosaicimage = 3 + PPCODE: + { + AV + *av; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + image=MergeImageLayers(image,MosaicLayer,exception); + /* + Create blessed Perl array for the returned image. + */ + av=newAV(); + ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + (void) CopyMagickString(info->image_info->filename,image->filename, + MaxTextExtent); + SetImageInfo(info->image_info,0,&image->exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); /* return messages in string context */ + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# P i n g # +# # +# # +# # +############################################################################### +# +# +void +Ping(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + PingImage = 1 + ping = 2 + pingimage = 3 + PPCODE: + { + AV + *av; + + char + **keep, + **list; + + ExceptionInfo + *exception; + + Image + *image, + *next; + + int + n; + + MagickBooleanType + status; + + char + **p; + + ssize_t + i; + + ssize_t + ac; + + STRLEN + *length; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; + + size_t + count; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + package_info=(struct PackageInfo *) NULL; + ac=(items < 2) ? 1 : items-1; + list=(char **) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*list)); + keep=list; + length=(STRLEN *) NULL; + if (list == (char **) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + keep=list; + length=(STRLEN *) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*length)); + if (length == (STRLEN *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + if (SvTYPE(reference) != SVt_PVAV) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + package_info=ClonePackageInfo(info,exception); + n=1; + if (items <= 1) + *list=(char *) (*package_info->image_info->filename ? + package_info->image_info->filename : "XC:black"); + else + for (n=0, i=0; i < ac; i++) + { + list[n]=(char *) SvPV(ST(i+1),length[n]); + if ((items >= 3) && strEQcase(list[n],"blob")) + { + void + *blob; + + i++; + blob=(void *) (SvPV(ST(i+1),length[n])); + SetImageInfoBlob(package_info->image_info,blob,(size_t) length[n]); + } + if ((items >= 3) && strEQcase(list[n],"filename")) + continue; + if ((items >= 3) && strEQcase(list[n],"file")) + { + FILE + *file; + + PerlIO + *io_info; + + i++; + io_info=IoIFP(sv_2io(ST(i+1))); + if (io_info == (PerlIO *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + continue; + } + file=PerlIO_findFILE(io_info); + if (file == (FILE *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + continue; + } + SetImageInfoFile(package_info->image_info,file); + } + if ((items >= 3) && strEQcase(list[n],"magick")) + continue; + n++; + } + list[n]=(char *) NULL; + keep=list; + status=ExpandFilenames(&n,&list); + if (status == MagickFalse) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + count=0; + for (i=0; i < n; i++) + { + (void) CopyMagickString(package_info->image_info->filename,list[i], + MaxTextExtent); + image=PingImage(package_info->image_info,exception); + if (image == (Image *) NULL) + break; + if ((package_info->image_info->file != (FILE *) NULL) || + (package_info->image_info->blob != (void *) NULL)) + DisassociateImageStream(image); + count+=GetImageListLength(image); + EXTEND(sp,4*count); + for (next=image; next; next=next->next) + { + PUSHs(sv_2mortal(newSViv(next->columns))); + PUSHs(sv_2mortal(newSViv(next->rows))); + PUSHs(sv_2mortal(newSViv((size_t) GetBlobSize(next)))); + PUSHs(sv_2mortal(newSVpv(next->magick,0))); + } + image=DestroyImageList(image); + } + /* + Free resources. + */ + for (i=0; i < n; i++) + if (list[i] != (char *) NULL) + for (p=keep; list[i] != *p++; ) + if (*p == NULL) + { + list[i]=(char *) RelinquishMagickMemory(list[i]); + break; + } + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + if (list && (list != keep)) + list=(char **) RelinquishMagickMemory(list); + if (keep) + keep=(char **) RelinquishMagickMemory(keep); + if (length) + length=(STRLEN *) RelinquishMagickMemory(length); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + } + +# +############################################################################### +# # +# # +# # +# P r e v i e w # +# # +# # +# # +############################################################################### +# +# +void +Preview(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + PreviewImage = 1 + preview = 2 + previewimage = 3 + PPCODE: + { + AV + *av; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image, + *preview_image; + + PreviewType + preview_type; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + preview_type=GammaPreview; + if (items > 1) + preview_type=(PreviewType) + ParseCommandOption(MagickPreviewOptions,MagickFalse,SvPV(ST(1),na)); + for ( ; image; image=image->next) + { + preview_image=PreviewImage(image,preview_type,exception); + if (preview_image == (Image *) NULL) + goto PerlException; + AddImageToRegistry(sv,preview_image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# Q u e r y C o l o r # +# # +# # +# # +############################################################################### +# +# +void +QueryColor(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + querycolor = 1 + PPCODE: + { + char + *name; + + ExceptionInfo + *exception; + + MagickPixelPacket + color; + + ssize_t + i; + + SV + *perl_exception; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (items == 1) + { + const ColorInfo + **colorlist; + + size_t + colors; + + colorlist=GetColorInfoList("*",&colors,exception); + EXTEND(sp,colors); + for (i=0; i < (ssize_t) colors; i++) + { + PUSHs(sv_2mortal(newSVpv(colorlist[i]->name,0))); + } + colorlist=(const ColorInfo **) + RelinquishMagickMemory((ColorInfo **) colorlist); + goto PerlException; + } + EXTEND(sp,5*items); + for (i=1; i < items; i++) + { + name=(char *) SvPV(ST(i),na); + if (QueryMagickColor(name,&color,exception) == MagickFalse) + { + PUSHs(&sv_undef); + continue; + } + PUSHs(sv_2mortal(newSViv((size_t) floor(color.red+0.5)))); + PUSHs(sv_2mortal(newSViv((size_t) floor(color.green+0.5)))); + PUSHs(sv_2mortal(newSViv((size_t) floor(color.blue+0.5)))); + if (color.matte != MagickFalse) + PUSHs(sv_2mortal(newSViv((size_t) floor(color.opacity+0.5)))); + if (color.colorspace == CMYKColorspace) + PUSHs(sv_2mortal(newSViv((size_t) floor(color.index+0.5)))); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# Q u e r y C o l o r N a m e # +# # +# # +# # +############################################################################### +# +# +void +QueryColorname(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + querycolorname = 1 + PPCODE: + { + AV + *av; + + char + message[MaxTextExtent]; + + ExceptionInfo + *exception; + + Image + *image; + + PixelPacket + target_color; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + EXTEND(sp,items); + for (i=1; i < items; i++) + { + (void) QueryColorDatabase(SvPV(ST(i),na),&target_color,exception); + (void) QueryColorname(image,&target_color,SVGCompliance,message, + exception); + PUSHs(sv_2mortal(newSVpv(message,0))); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# Q u e r y F o n t # +# # +# # +# # +############################################################################### +# +# +void +QueryFont(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + queryfont = 1 + PPCODE: + { + char + *name, + message[MaxTextExtent]; + + ExceptionInfo + *exception; + + ssize_t + i; + + SV + *perl_exception; + + volatile const TypeInfo + *type_info; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (items == 1) + { + const TypeInfo + **typelist; + + size_t + types; + + typelist=GetTypeInfoList("*",&types,exception); + EXTEND(sp,types); + for (i=0; i < (ssize_t) types; i++) + { + PUSHs(sv_2mortal(newSVpv(typelist[i]->name,0))); + } + typelist=(const TypeInfo **) RelinquishMagickMemory((TypeInfo **) + typelist); + goto PerlException; + } + EXTEND(sp,10*items); + for (i=1; i < items; i++) + { + name=(char *) SvPV(ST(i),na); + type_info=GetTypeInfo(name,exception); + if (type_info == (TypeInfo *) NULL) + { + PUSHs(&sv_undef); + continue; + } + if (type_info->name == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->name,0))); + if (type_info->description == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->description,0))); + if (type_info->family == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->family,0))); + if (type_info->style == UndefinedStyle) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(CommandOptionToMnemonic(MagickStyleOptions, + type_info->style),0))); + if (type_info->stretch == UndefinedStretch) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(CommandOptionToMnemonic(MagickStretchOptions, + type_info->stretch),0))); + (void) FormatLocaleString(message,MaxTextExtent,"%.20g",(double) + type_info->weight); + PUSHs(sv_2mortal(newSVpv(message,0))); + if (type_info->encoding == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->encoding,0))); + if (type_info->foundry == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->foundry,0))); + if (type_info->format == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->format,0))); + if (type_info->metrics == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->metrics,0))); + if (type_info->glyphs == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(type_info->glyphs,0))); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# Q u e r y F o n t M e t r i c s # +# # +# # +# # +############################################################################### +# +# +void +QueryFontMetrics(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + queryfontmetrics = 1 + PPCODE: + { + AffineMatrix + affine, + current; + + AV + *av; + + char + *attribute; + + double + x, + y; + + DrawInfo + *draw_info; + + ExceptionInfo + *exception; + + GeometryInfo + geometry_info; + + Image + *image; + + MagickBooleanType + status; + + MagickStatusType + flags; + + ssize_t + i; + + ssize_t + type; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + TypeMetric + metrics; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + package_info=(struct PackageInfo *) NULL; + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + package_info=ClonePackageInfo(info,exception); + draw_info=CloneDrawInfo(package_info->image_info,(DrawInfo *) NULL); + CloneString(&draw_info->text,""); + current=draw_info->affine; + GetAffineMatrix(&affine); + x=0.0; + y=0.0; + EXTEND(sp,7*items); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'A': + case 'a': + { + if (LocaleCompare(attribute,"antialias") == 0) + { + type=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (type < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + draw_info->text_antialias=type != 0 ? MagickTrue : MagickFalse; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'd': + case 'D': + { + if (LocaleCompare(attribute,"density") == 0) + { + CloneString(&draw_info->density,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"direction") == 0) + { + draw_info->direction=(DirectionType) ParseCommandOption( + MagickDirectionOptions,MagickFalse,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'e': + case 'E': + { + if (LocaleCompare(attribute,"encoding") == 0) + { + CloneString(&draw_info->encoding,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'f': + case 'F': + { + if (LocaleCompare(attribute,"family") == 0) + { + CloneString(&draw_info->family,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"fill") == 0) + { + if (info) + (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->fill, + &image->exception); + break; + } + if (LocaleCompare(attribute,"font") == 0) + { + CloneString(&draw_info->font,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + CloneString(&draw_info->geometry,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"gravity") == 0) + { + draw_info->gravity=(GravityType) ParseCommandOption( + MagickGravityOptions,MagickFalse,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'i': + case 'I': + { + if (LocaleCompare(attribute,"interline-spacing") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->interline_spacing=geometry_info.rho; + break; + } + if (LocaleCompare(attribute,"interword-spacing") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->interword_spacing=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'k': + case 'K': + { + if (LocaleCompare(attribute,"kerning") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->kerning=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'p': + case 'P': + { + if (LocaleCompare(attribute,"pointsize") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->pointsize=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'r': + case 'R': + { + if (LocaleCompare(attribute,"rotate") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.rx=geometry_info.rho; + affine.ry=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.ry=affine.rx; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 's': + case 'S': + { + if (LocaleCompare(attribute,"scale") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.sy=affine.sx; + break; + } + if (LocaleCompare(attribute,"skew") == 0) + { + double + x_angle, + y_angle; + + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + x_angle=geometry_info.rho; + y_angle=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + y_angle=x_angle; + affine.ry=tan(DegreesToRadians(fmod(x_angle,360.0))); + affine.rx=tan(DegreesToRadians(fmod(y_angle,360.0))); + break; + } + if (LocaleCompare(attribute,"stroke") == 0) + { + if (info) + (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->stroke, + &image->exception); + break; + } + if (LocaleCompare(attribute,"style") == 0) + { + type=ParseCommandOption(MagickStyleOptions,MagickFalse, + SvPV(ST(i),na)); + if (type < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + draw_info->style=(StyleType) type; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 't': + case 'T': + { + if (LocaleCompare(attribute,"text") == 0) + { + CloneString(&draw_info->text,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"translate") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.tx=geometry_info.rho; + affine.ty=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.ty=affine.tx; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'w': + case 'W': + { + if (LocaleCompare(attribute,"weight") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->weight=(size_t) geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'x': + case 'X': + { + if (LocaleCompare(attribute,"x") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + x=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'y': + case 'Y': + { + if (LocaleCompare(attribute,"y") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + y=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + draw_info->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; + draw_info->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; + if (draw_info->geometry == (char *) NULL) + { + draw_info->geometry=AcquireString((char *) NULL); + (void) FormatLocaleString(draw_info->geometry,MaxTextExtent, + "%.20g,%.15g",x,y); + } + status=GetTypeMetrics(image,draw_info,&metrics); + (void) CatchImageException(image); + if (status == MagickFalse) + PUSHs(&sv_undef); + else + { + PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.x))); + PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.y))); + PUSHs(sv_2mortal(newSVnv(metrics.ascent))); + PUSHs(sv_2mortal(newSVnv(metrics.descent))); + PUSHs(sv_2mortal(newSVnv(metrics.width))); + PUSHs(sv_2mortal(newSVnv(metrics.height))); + PUSHs(sv_2mortal(newSVnv(metrics.max_advance))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.x1))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.y1))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.x2))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.y2))); + PUSHs(sv_2mortal(newSVnv(metrics.origin.x))); + PUSHs(sv_2mortal(newSVnv(metrics.origin.y))); + } + draw_info=DestroyDrawInfo(draw_info); + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + } + +# +############################################################################### +# # +# # +# # +# Q u e r y M u l t i l i n e F o n t M e t r i c s # +# # +# # +# # +############################################################################### +# +# +void +QueryMultilineFontMetrics(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + querymultilinefontmetrics = 1 + PPCODE: + { + AffineMatrix + affine, + current; + + AV + *av; + + char + *attribute; + + double + x, + y; + + DrawInfo + *draw_info; + + ExceptionInfo + *exception; + + GeometryInfo + geometry_info; + + Image + *image; + + MagickBooleanType + status; + + MagickStatusType + flags; + + ssize_t + i; + + ssize_t + type; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + TypeMetric + metrics; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + package_info=(struct PackageInfo *) NULL; + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + package_info=ClonePackageInfo(info,exception); + draw_info=CloneDrawInfo(package_info->image_info,(DrawInfo *) NULL); + CloneString(&draw_info->text,""); + current=draw_info->affine; + GetAffineMatrix(&affine); + x=0.0; + y=0.0; + EXTEND(sp,7*items); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'A': + case 'a': + { + if (LocaleCompare(attribute,"antialias") == 0) + { + type=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (type < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + draw_info->text_antialias=type != 0 ? MagickTrue : MagickFalse; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'd': + case 'D': + { + if (LocaleCompare(attribute,"density") == 0) + { + CloneString(&draw_info->density,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'e': + case 'E': + { + if (LocaleCompare(attribute,"encoding") == 0) + { + CloneString(&draw_info->encoding,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'f': + case 'F': + { + if (LocaleCompare(attribute,"family") == 0) + { + CloneString(&draw_info->family,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"fill") == 0) + { + if (info) + (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->fill, + &image->exception); + break; + } + if (LocaleCompare(attribute,"font") == 0) + { + CloneString(&draw_info->font,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + CloneString(&draw_info->geometry,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"gravity") == 0) + { + draw_info->gravity=(GravityType) ParseCommandOption( + MagickGravityOptions,MagickFalse,SvPV(ST(i),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'p': + case 'P': + { + if (LocaleCompare(attribute,"pointsize") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->pointsize=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'r': + case 'R': + { + if (LocaleCompare(attribute,"rotate") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.rx=geometry_info.rho; + affine.ry=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.ry=affine.rx; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 's': + case 'S': + { + if (LocaleCompare(attribute,"scale") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.sy=affine.sx; + break; + } + if (LocaleCompare(attribute,"skew") == 0) + { + double + x_angle, + y_angle; + + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + x_angle=geometry_info.rho; + y_angle=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + y_angle=x_angle; + affine.ry=tan(DegreesToRadians(fmod(x_angle,360.0))); + affine.rx=tan(DegreesToRadians(fmod(y_angle,360.0))); + break; + } + if (LocaleCompare(attribute,"stroke") == 0) + { + if (info) + (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->stroke, + &image->exception); + break; + } + if (LocaleCompare(attribute,"style") == 0) + { + type=ParseCommandOption(MagickStyleOptions,MagickFalse, + SvPV(ST(i),na)); + if (type < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + draw_info->style=(StyleType) type; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 't': + case 'T': + { + if (LocaleCompare(attribute,"text") == 0) + { + CloneString(&draw_info->text,SvPV(ST(i),na)); + break; + } + if (LocaleCompare(attribute,"translate") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + affine.tx=geometry_info.rho; + affine.ty=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + affine.ty=affine.tx; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'w': + case 'W': + { + if (LocaleCompare(attribute,"weight") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + draw_info->weight=(size_t) geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'x': + case 'X': + { + if (LocaleCompare(attribute,"x") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + x=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'y': + case 'Y': + { + if (LocaleCompare(attribute,"y") == 0) + { + flags=ParseGeometry(SvPV(ST(i),na),&geometry_info); + y=geometry_info.rho; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + draw_info->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; + draw_info->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; + if (draw_info->geometry == (char *) NULL) + { + draw_info->geometry=AcquireString((char *) NULL); + (void) FormatLocaleString(draw_info->geometry,MaxTextExtent, + "%.20g,%.15g",x,y); + } + status=GetMultilineTypeMetrics(image,draw_info,&metrics); + (void) CatchImageException(image); + if (status == MagickFalse) + PUSHs(&sv_undef); + else + { + PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.x))); + PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.y))); + PUSHs(sv_2mortal(newSVnv(metrics.ascent))); + PUSHs(sv_2mortal(newSVnv(metrics.descent))); + PUSHs(sv_2mortal(newSVnv(metrics.width))); + PUSHs(sv_2mortal(newSVnv(metrics.height))); + PUSHs(sv_2mortal(newSVnv(metrics.max_advance))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.x1))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.y1))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.x2))); + PUSHs(sv_2mortal(newSVnv(metrics.bounds.y2))); + PUSHs(sv_2mortal(newSVnv(metrics.origin.x))); + PUSHs(sv_2mortal(newSVnv(metrics.origin.y))); + } + draw_info=DestroyDrawInfo(draw_info); + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + } + +# +############################################################################### +# # +# # +# # +# Q u e r y F o r m a t # +# # +# # +# # +############################################################################### +# +# +void +QueryFormat(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + queryformat = 1 + PPCODE: + { + char + *name; + + ExceptionInfo + *exception; + + ssize_t + i; + + SV + *perl_exception; + + volatile const MagickInfo + *magick_info; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (items == 1) + { + char + format[MaxTextExtent]; + + const MagickInfo + **format_list; + + size_t + types; + + format_list=GetMagickInfoList("*",&types,exception); + EXTEND(sp,types); + for (i=0; i < (ssize_t) types; i++) + { + (void) CopyMagickString(format,format_list[i]->name,MaxTextExtent); + LocaleLower(format); + PUSHs(sv_2mortal(newSVpv(format,0))); + } + format_list=(const MagickInfo **) + RelinquishMagickMemory((MagickInfo *) format_list); + goto PerlException; + } + EXTEND(sp,8*items); + for (i=1; i < items; i++) + { + name=(char *) SvPV(ST(i),na); + magick_info=GetMagickInfo(name,exception); + if (magick_info == (const MagickInfo *) NULL) + { + PUSHs(&sv_undef); + continue; + } + PUSHs(sv_2mortal(newSViv(magick_info->adjoin))); + PUSHs(sv_2mortal(newSViv(magick_info->blob_support))); + PUSHs(sv_2mortal(newSViv(magick_info->raw))); + PUSHs(sv_2mortal(newSViv((long) magick_info->decoder))); + PUSHs(sv_2mortal(newSViv((long) magick_info->encoder))); + if (magick_info->description == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(magick_info->description,0))); + if (magick_info->magick_module == (char *) NULL) + PUSHs(&sv_undef); + else + PUSHs(sv_2mortal(newSVpv(magick_info->magick_module,0))); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# Q u e r y O p t i o n # +# # +# # +# # +############################################################################### +# +# +void +QueryOption(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + queryoption = 1 + PPCODE: + { + char + **options; + + ExceptionInfo + *exception; + + ssize_t + i; + + ssize_t + j, + option; + + SV + *perl_exception; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + EXTEND(sp,8*items); + for (i=1; i < items; i++) + { + option=ParseCommandOption(MagickListOptions,MagickFalse,(char *) + SvPV(ST(i),na)); + options=GetCommandOptions((CommandOption) option); + if (options == (char **) NULL) + PUSHs(&sv_undef); + else + { + for (j=0; options[j] != (char *) NULL; j++) + PUSHs(sv_2mortal(newSVpv(options[j],0))); + options=DestroyStringList(options); + } + } + + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# R e a d # +# # +# # +# # +############################################################################### +# +# +void +Read(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + ReadImage = 1 + read = 2 + readimage = 3 + PPCODE: + { + AV + *av; + + char + **keep, + **list; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + int + n; + + MagickBooleanType + status; + + char + **p; + + ssize_t + i; + + ssize_t + ac, + number_images; + + STRLEN + *length; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, /* Perl variable for storing messages */ + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + package_info=(struct PackageInfo *) NULL; + number_images=0; + ac=(items < 2) ? 1 : items-1; + list=(char **) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*list)); + keep=list; + length=(STRLEN *) NULL; + if (list == (char **) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + length=(STRLEN *) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*length)); + if (length == (STRLEN *) NULL) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + if (SvTYPE(reference) != SVt_PVAV) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + package_info=ClonePackageInfo(info,exception); + n=1; + if (items <= 1) + *list=(char *) (*package_info->image_info->filename ? + package_info->image_info->filename : "XC:black"); + else + for (n=0, i=0; i < ac; i++) + { + list[n]=(char *) SvPV(ST(i+1),length[n]); + if ((items >= 3) && strEQcase(list[n],"blob")) + { + void + *blob; + + i++; + blob=(void *) (SvPV(ST(i+1),length[n])); + SetImageInfoBlob(package_info->image_info,blob,(size_t) length[n]); + } + if ((items >= 3) && strEQcase(list[n],"filename")) + continue; + if ((items >= 3) && strEQcase(list[n],"file")) + { + FILE + *file; + + PerlIO + *io_info; + + i++; + io_info=IoIFP(sv_2io(ST(i+1))); + if (io_info == (PerlIO *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + continue; + } + file=PerlIO_findFILE(io_info); + if (file == (FILE *) NULL) + { + ThrowPerlException(exception,BlobError,"UnableToOpenFile", + PackageName); + continue; + } + SetImageInfoFile(package_info->image_info,file); + } + if ((items >= 3) && strEQcase(list[n],"magick")) + continue; + n++; + } + list[n]=(char *) NULL; + keep=list; + status=ExpandFilenames(&n,&list); + if (status == MagickFalse) + { + ThrowPerlException(exception,ResourceLimitError, + "MemoryAllocationFailed",PackageName); + goto PerlException; + } + number_images=0; + for (i=0; i < n; i++) + { + if ((package_info->image_info->file != (FILE *) NULL) || + (package_info->image_info->blob != (void *) NULL)) + { + image=ReadImages(package_info->image_info,exception); + if (image != (Image *) NULL) + DisassociateImageStream(image); + } + else + { + (void) CopyMagickString(package_info->image_info->filename,list[i], + MaxTextExtent); + image=ReadImages(package_info->image_info,exception); + } + if (image == (Image *) NULL) + break; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + number_images++; + } + } + /* + Free resources. + */ + for (i=0; i < n; i++) + if (list[i] != (char *) NULL) + for (p=keep; list[i] != *p++; ) + if (*p == (char *) NULL) + { + list[i]=(char *) RelinquishMagickMemory(list[i]); + break; + } + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + if (list && (list != keep)) + list=(char **) RelinquishMagickMemory(list); + if (keep) + keep=(char **) RelinquishMagickMemory(keep); + if (length) + length=(STRLEN *) RelinquishMagickMemory(length); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) number_images); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# R e m o t e # +# # +# # +# # +############################################################################### +# +# +void +Remote(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + RemoteCommand = 1 + remote = 2 + remoteCommand = 3 + PPCODE: + { + AV + *av; + + ExceptionInfo + *exception; + + ssize_t + i; + + SV + *perl_exception, + *reference; + + struct PackageInfo + *info; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + for (i=1; i < items; i++) + (void) RemoteDisplayCommand(info->image_info,(char *) NULL,(char *) + SvPV(ST(i),na),exception); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + } + +# +############################################################################### +# # +# # +# # +# S e t # +# # +# # +# # +############################################################################### +# +# +void +Set(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + SetAttributes = 1 + SetAttribute = 2 + set = 3 + setattributes = 4 + setattribute = 5 + PPCODE: + { + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (items == 2) + SetAttribute(aTHX_ info,image,"size",ST(1),exception); + else + for (i=2; i < items; i+=2) + SetAttribute(aTHX_ info,image,SvPV(ST(i-1),na),ST(i),exception); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) (SvCUR(perl_exception) != 0)); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# S e t P i x e l # +# # +# # +# # +############################################################################### +# +# +void +SetPixel(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + setpixel = 1 + setPixel = 2 + PPCODE: + { + AV + *av; + + char + *attribute; + + ChannelType + channel; + + ExceptionInfo + *exception; + + Image + *image; + + MagickBooleanType + normalize; + + RectangleInfo + region; + + IndexPacket + *indexes; + + ssize_t + i; + + PixelPacket + *q; + + ssize_t + option; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; /* reference is the SV* of ref=SvIV(reference) */ + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + reference=SvRV(ST(0)); + av=(AV *) reference; + info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL, + exception); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + av=(AV *) NULL; + channel=DefaultChannels; + if (image->matte != MagickFalse) + channel|=OpacityChannel; + normalize=MagickTrue; + region.x=0; + region.y=0; + region.width=image->columns; + region.height=1; + if (items == 1) + (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion); + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'C': + case 'c': + { + if (LocaleCompare(attribute,"channel") == 0) + { + ssize_t + option; + + option=ParseChannelOption(SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + channel=(ChannelType) option; + break; + } + if (LocaleCompare(attribute,"color") == 0) + { + if (SvTYPE(ST(i)) != SVt_RV) + { + char + message[MaxTextExtent]; + + (void) FormatLocaleString(message,MaxTextExtent, + "invalid %.60s value",attribute); + ThrowPerlException(exception,OptionError,message, + SvPV(ST(i),na)); + } + av=(AV *) SvRV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'N': + case 'n': + { + if (LocaleCompare(attribute,"normalize") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (option < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + break; + } + normalize=option != 0 ? MagickTrue : MagickFalse; + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'x': + case 'X': + { + if (LocaleCompare(attribute,"x") == 0) + { + region.x=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'y': + case 'Y': + { + if (LocaleCompare(attribute,"y") == 0) + { + region.y=SvIV(ST(i)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + (void) SetImageStorageClass(image,DirectClass); + q=GetAuthenticPixels(image,region.x,region.y,1,1,exception); + if ((q == (PixelPacket *) NULL) || (av == (AV *) NULL) || + (SvTYPE(av) != SVt_PVAV)) + PUSHs(&sv_undef); + else + { + double + scale; + + ssize_t + i; + + i=0; + indexes=GetAuthenticIndexQueue(image); + scale=1.0; + if (normalize != MagickFalse) + scale=QuantumRange; + if (((channel & RedChannel) != 0) && (i <= av_len(av))) + { + SetPixelRed(q,ClampToQuantum(scale*SvNV(*( + av_fetch(av,i,0))))); + i++; + } + if (((channel & GreenChannel) != 0) && (i <= av_len(av))) + { + SetPixelGreen(q,ClampToQuantum(scale*SvNV(*( + av_fetch(av,i,0))))); + i++; + } + if (((channel & BlueChannel) != 0) && (i <= av_len(av))) + { + SetPixelBlue(q,ClampToQuantum(scale*SvNV(*( + av_fetch(av,i,0))))); + i++; + } + if ((((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) && (i <= av_len(av))) + { + SetPixelIndex(indexes,ClampToQuantum(scale* + SvNV(*(av_fetch(av,i,0))))); + i++; + } + if (((channel & OpacityChannel) != 0) && (i <= av_len(av))) + { + SetPixelOpacity(q,ClampToQuantum(scale* + SvNV(*(av_fetch(av,i,0))))); + i++; + } + (void) SyncAuthenticPixels(image,exception); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# S m u s h # +# # +# # +# # +############################################################################### +# +# +void +Smush(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + SmushImage = 1 + smush = 2 + smushimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *image; + + ssize_t + i; + + ssize_t + offset, + stack; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + attribute=NULL; + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get options. + */ + offset=0; + stack=MagickTrue; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'O': + case 'o': + { + if (LocaleCompare(attribute,"offset") == 0) + { + offset=(ssize_t) StringToLong((char *) SvPV(ST(1),na)); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(attribute,"stack") == 0) + { + stack=ParseCommandOption(MagickBooleanOptions,MagickFalse, + SvPV(ST(i),na)); + if (stack < 0) + { + ThrowPerlException(exception,OptionError,"UnrecognizedType", + SvPV(ST(i),na)); + return; + } + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + image=SmushImages(image,stack != 0 ? MagickTrue : MagickFalse,offset, + exception); + if (image == (Image *) NULL) + goto PerlException; + for ( ; image; image=image->next) + { + AddImageToRegistry(sv,image); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# S t a t i s t i c s # +# # +# # +# # +############################################################################### +# +# +void +Statistics(ref) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + StatisticsImage = 1 + statistics = 2 + statisticsimage = 3 + PPCODE: + { +#define ChannelStatistics(channel) \ +{ \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + (double) channel_statistics[channel].depth); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].minima/scale); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].maxima/scale); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].mean/scale); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].standard_deviation/scale); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].kurtosis); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].skewness); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \ + channel_statistics[channel].entropy); \ + PUSHs(sv_2mortal(newSVpv(message,0))); \ +} + + AV + *av; + + char + message[MaxTextExtent]; + + ChannelStatistics + *channel_statistics; + + double + scale; + + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + count; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + av=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + av=newAV(); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + count=0; + for ( ; image; image=image->next) + { + channel_statistics=GetImageChannelStatistics(image,&image->exception); + if (channel_statistics == (ChannelStatistics *) NULL) + continue; + count++; + EXTEND(sp,40*count); + scale=(double) QuantumRange; + ChannelStatistics(RedChannel); + ChannelStatistics(GreenChannel); + ChannelStatistics(BlueChannel); + if (image->colorspace == CMYKColorspace) + ChannelStatistics(IndexChannel); + if (image->matte != MagickFalse) + ChannelStatistics(OpacityChannel); + channel_statistics=(ChannelStatistics *) + RelinquishMagickMemory(channel_statistics); + } + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); + } + +# +############################################################################### +# # +# # +# # +# S y n c A u t h e n t i c P i x e l s # +# # +# # +# # +############################################################################### +# +# +void +SyncAuthenticPixels(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + Syncauthenticpixels = 1 + SyncImagePixels = 2 + syncimagepixels = 3 + CODE: + { + ExceptionInfo + *exception; + + Image + *image; + + MagickBooleanType + status; + + struct PackageInfo + *info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + + status=SyncAuthenticPixels(image,exception); + if (status != MagickFalse) + return; + InheritException(exception,&image->exception); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + SvREFCNT_dec(perl_exception); /* throw away all errors */ + } + +# +############################################################################### +# # +# # +# # +# T r a n s f o r m # +# # +# # +# # +############################################################################### +# +# +void +Transform(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + TransformImage = 1 + transform = 2 + transformimage = 3 + PPCODE: + { + AV + *av; + + char + *attribute, + *crop_geometry, + *geometry; + + ExceptionInfo + *exception; + + HV + *hv; + + Image + *clone, + *image; + + ssize_t + i; + + struct PackageInfo + *info; + + SV + *av_reference, + *perl_exception, + *reference, + *rv, + *sv; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + sv=NULL; + av=NULL; + attribute=NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + hv=SvSTASH(reference); + av=newAV(); + av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); + SvREFCNT_dec(av); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + info=GetPackageInfo(aTHX_ (void *) av,info,exception); + /* + Get attribute. + */ + crop_geometry=(char *) NULL; + geometry=(char *) NULL; + for (i=2; i < items; i+=2) + { + attribute=(char *) SvPV(ST(i-1),na); + switch (*attribute) + { + case 'c': + case 'C': + { + if (LocaleCompare(attribute,"crop") == 0) + { + crop_geometry=SvPV(ST(i),na); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(attribute,"geometry") == 0) + { + geometry=SvPV(ST(i),na); + break; + } + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + default: + { + ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", + attribute); + break; + } + } + } + for ( ; image; image=image->next) + { + clone=CloneImage(image,0,0,MagickTrue,exception); + if (clone == (Image *) NULL) + goto PerlException; + TransformImage(&clone,crop_geometry,geometry); + for ( ; clone; clone=clone->next) + { + AddImageToRegistry(sv,clone); + rv=newRV(sv); + av_push(av,sv_bless(rv,hv)); + SvREFCNT_dec(sv); + } + } + exception=DestroyExceptionInfo(exception); + ST(0)=av_reference; + SvREFCNT_dec(perl_exception); /* can't return warning messages */ + XSRETURN(1); + + PerlException: + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } + +# +############################################################################### +# # +# # +# # +# W r i t e # +# # +# # +# # +############################################################################### +# +# +void +Write(ref,...) + Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT + ALIAS: + WriteImage = 1 + write = 2 + writeimage = 3 + PPCODE: + { + char + filename[MaxTextExtent]; + + ExceptionInfo + *exception; + + Image + *image, + *next; + + ssize_t + i; + + ssize_t + number_images, + scene; + + struct PackageInfo + *info, + *package_info; + + SV + *perl_exception, + *reference; + + PERL_UNUSED_VAR(ref); + PERL_UNUSED_VAR(ix); + exception=AcquireExceptionInfo(); + perl_exception=newSVpv("",0); + number_images=0; + package_info=(struct PackageInfo *) NULL; + if (sv_isobject(ST(0)) == 0) + { + ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", + PackageName); + goto PerlException; + } + reference=SvRV(ST(0)); + image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); + if (image == (Image *) NULL) + { + ThrowPerlException(exception,OptionError,"NoImagesDefined", + PackageName); + goto PerlException; + } + scene=0; + for (next=image; next; next=next->next) + next->scene=scene++; + package_info=ClonePackageInfo(info,exception); + if (items == 2) + SetAttribute(aTHX_ package_info,NULL,"filename",ST(1),exception); + else + if (items > 2) + for (i=2; i < items; i+=2) + SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i), + exception); + (void) CopyMagickString(filename,package_info->image_info->filename, + MaxTextExtent); + for (next=image; next; next=next->next) + (void) CopyMagickString(next->filename,filename,MaxTextExtent); + *package_info->image_info->magick='\0'; + SetImageInfo(package_info->image_info,(unsigned int) + GetImageListLength(image),&image->exception); + for (next=image; next; next=next->next) + { + (void) WriteImage(package_info->image_info,next); + if (next->exception.severity >= ErrorException) + InheritException(exception,&next->exception); + GetImageException(next,exception); + number_images++; + if (package_info->image_info->adjoin) + break; + } + + PerlException: + if (package_info != (struct PackageInfo *) NULL) + DestroyPackageInfo(package_info); + InheritPerlException(exception,perl_exception); + exception=DestroyExceptionInfo(exception); + sv_setiv(perl_exception,(IV) number_images); + SvPOK_on(perl_exception); + ST(0)=sv_2mortal(perl_exception); + XSRETURN(1); + } diff --git a/ImageMagick-6.9.12-44/PerlMagick/quantum/typemap b/ImageMagick-6.9.12-44/PerlMagick/quantum/typemap new file mode 100644 index 0000000..3b7a489 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/quantum/typemap @@ -0,0 +1 @@ +Image::Magick::Q16 T_PTROBJ diff --git a/ImageMagick-6.9.12-44/PerlMagick/quantum/typemap.in b/ImageMagick-6.9.12-44/PerlMagick/quantum/typemap.in new file mode 100644 index 0000000..3fd2b88 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/quantum/typemap.in @@ -0,0 +1 @@ +Image::Magick::@MAGICK_ABI_SUFFIX@ T_PTROBJ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/MasterImage_70x46.ppm b/ImageMagick-6.9.12-44/PerlMagick/t/MasterImage_70x46.ppm new file mode 100644 index 0000000..920fe6c --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/MasterImage_70x46.ppm @@ -0,0 +1,4 @@ +P6 +70 46 +255 +0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTRead( 'input.miff' ); +@blob = $image->ImageToBlob(); +undef $image; + +$image=Image::Magick->new( magick=>'MIFF' ); +$image->BlobToImage( @blob ); + +if ($image->Get('signature') ne + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7') + { print "not ok $test\n"; } +else + { print "ok $test\n"; } + +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/bzlib/input.miff b/ImageMagick-6.9.12-44/PerlMagick/t/bzlib/input.miff new file mode 100644 index 0000000..7740ad5 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/bzlib/input.miff @@ -0,0 +1,9 @@ +id=ImageMagick +class=DirectClass matte=False +columns=70 rows=46 depth=8 +signature=eb4d6e084afe2835a1ad28ad7fc12ced +background-color=gray74 border-color=gray74 matte-color=gray74 +{ +This is a comment.} + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTL5f 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 +# + +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/bzlib' || die 'Cd failed'; + +# +# Test reading BZip compressed MIFF +# +testRead( 'input.miff', + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7' ); + +# +# 2) Test reading BZip stream-compressed MIFF (.bz2 extension) +# +print("Reading BZip stream-compressed MIFF (.bz2 extension) ...\n"); +++$test; +testRead( 'input.miff.bz2', + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7' ); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/bzlib/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/bzlib/write.t new file mode 100644 index 0000000..f9db65d --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/bzlib/write.t @@ -0,0 +1,27 @@ +#!/usr/bin/perl +# +# Test writing files using bzlib-based compression +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..1\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/bzlib' || die 'Cd failed'; + +# +# Test writing BZip-compressed MIFF +# + +testReadWrite( 'input.miff', + 'output.miff', + q/compression=>'BZip'/, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7' ); + +$test = 0; # Quench PERL compliaint + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/cgm/input.cgm b/ImageMagick-6.9.12-44/PerlMagick/t/cgm/input.cgm new file mode 100644 index 0000000..6e7bfcd --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/cgm/input.cgm @@ -0,0 +1 @@ +0 \XCGMF01\1 A1!XSAMMIE CGM File\1"@1*XA\1-Xroman \Xgreek \Xscript \Xold english \Xstick \1&H1)@@@@0"XPicture\2%@@gjLgjL2"A0#60A@ddddRRRRIIIIvvvv[[[[mmmmfw~~bEzL5"b`@5#F cp^dfQ`pAaD d`_dkV@tA cp^djR@tA cp^djR`pAaD d`_dj[@`[ cp^diX@`Z cp^diX`pAaC d`WdkBHW cpWdi_GW cpWdi_`p@aC d`WdkW@pU cpWdjT@pU cpWdjT`p@aC cWdlRa@p[ coVdkOaAp[ coVdkO`pAaC cWdk_@`S coVdj[@`T coVdj[`pAaD cRdlAER coQdj^ES coQdj^`pAaC cRdlS@pR coQdkP@pR coQdkP`pAaC c|UdnIb]qV clTdmFb]qV clTdmF`pAaC c|XdkWSbR clWdjTSbR clWdjT`pAaC d`_dgUtGdB cp^dfQtGdC d`^dgSAdA d`_dkTfO`^ dgNdlR`UqF dhCdkL\tU dgWdfW]qP dgJdeGvLbL cp]dfPAd@ cp^djP`W`R cqUdkBKqG cr@di[UtU cq[deFYqP cqRdcVpUbZ cp]dfP`pAaC cp^djP`pAaD cqUdkB`uYaP cr@di[`vCaQ cq[deF`u\aQ cqRdcV`uXaQ ciQdjHcEr] clVdgKq_pZ cjWdfQcGrM cm^ddDJa\ cnDdhTDrT cnDdhT[bS cmYdkGpQaL cmHdlSrN`P cjZdmCa]qC clWdl@sGH ciPdlHAr@ clSdjOdGsQ cpZdf^JrX cqDddFEbA cqIdfGQbQ cqHdhXWbE cqAdj]pSaF cpNdlCMpY cp[dkJpZ_ cpAdj[sPaT clQdlOBr@ clSdjOsBW clQdlOsAW cpAdj[sJaE cp[dkJvAaY cpNdlCsF`P cqAdj]sHJ cqHdhXsDT cqIdfGsAW cqDddFsFR cjZdmCSvR clWdl@QtU cp[dkJQtL cZdkRcVr] dcPdhUcR^ dgBdhGcFrL djHde[Ka[ djOdjJDrT djOdjJ\bT djCdl^pPaL diSdnJrNO dgEdnYsTqO dcQdmJsYG cXdmQBq_ c|YdkKdGsQ da@dgZfLrK dgLdeOEbA dgQdgPQbQ dgPdjAWbE dgIdlFpRaF dfWdmLuVqF daAdlFpZ_ d`GdkWsPaT c|WdmKBr@ c|YdkKcAG c|WdmKcAF d`GdkWcJaS daAdlFfDbS dfWdmLb\`^ dgIdlFbZ`X dgPdjAb_I dgQdgPcBF dgLdeOb\L dgEdnYSvR dcQdmJQtU daAdlFQtL ddEdpPqKq\ dbZdnTrC`tZ d`WecNpQaG d`FedUqHiD c~^emYEaJ cCeoCaM`[ d`Peo^`RrA daBem]aSzE dbUecXFpZ db[eb^Ip_ dcDea_a^}] deBdtBp]sR c~CdpCqLqT c|WdnOrC`tQ czTec@[aG czIedGqBiE cyGemLaQF czXemRaHyP c|@edBCp] c|CecEDpZ c|GebKa\prH c~CdpCe[c] dc^dt@q]m] dbAea]Z`^ daWeb[@`[ daWecVqKjE d`Lem[^bB c^eo]tE@ c{Yeo]qDqD czUenYqNqM cyGemLeWM czIedGe]N czTec@fCN c|WdnOfCE c~CdpCfBM dc^dt@aDB dbAea]aCB daWeb[aDC daWecV`^B d`Lem[`VB c^eo]`RA d`Lem[uTY c{Yeo]qArK czUenYdNJ db[eb^rD`P daWecVuWL daWeb[uTJ dbAea]uZN cg_dnRqKq] cfTdlUrC`tZ cdQeaOVaH cdKebWp[iE ccPek\`PaK cd@emGaM`[ ceMenBHrB ceUel@aEzF cfZeaZUp[ cfUe`_Ip^ cf^e`Aa^}] ch\drDp]sR cnBdn_qLqS clVdmLrC`tQ cjSea][aG ciFelHaByD ciFelHaQF cjWelNaHyP ck_eb^Cp] clBebADpY clFeaHa\prI cnBdn_tCcG ci_drFq^m] chAe`CY`_ cgXeaB@`Z cgXea\qLjE cfLelA]bB ce_enCcR`R ciQenUqCqE chNemP`XqH ccPek\eVL cjHecDu]] cjSea]vB^ clVdmLvBpW cnBdn_vC] ci_drFqCR chAe`CqCR cgXeaBqCS cgXea\p^R cfLelApWQ ce_enCpRQ cfLelAdKM ciQenUaFrG chNemPtNY cfUe`_rD`P cgXea\dGaB cgXeaBdJ`_ chAe`CdEaE c|WdnOppAqC cmOdmSpYW c}PdnWpYX c}PdnWppAqD cmZdpJ[rW c}[dqN[rW c}[dqNppAqD cmPdsZJsP c}Qdt^JsP c}Qdt^ppAqD cl_dwX`Qs^ c}@dx[`Qs] c}@dx[ppAqC clZdw]EU c|[dyAEV c|[dyAppAqD clWdxNCpQ c|XdyRCpQ c|XdyRppAqD cl[dx\T^ c|\dy_T] c|\dy_ppAqC clNd|NMsR c|Nd}QNsR c|Nd}Qpp@qC clHd|MFA c|Id}QE@ c|Id}QppAqD clFd|^BpQ c|Gd~ABpP c|Gd~AppAqC clJd}LT^ c|Kd~PT_ c|Kd~PppAqD ckZe`_`PsS c{[ebB`PsR c{[ebBppAqC ckWe`^CA c{XebBC@ c{XebBppAqD ckTeaPCpR c{UebTCpR c{UebTppAqD ckXeaYTY c{Yeb\TX c{Yeb\ppAqC ckCekQ`UyX c{DelU`UyY c{DelUppAqD cjUelYNqH czVem]NqH czVem]ppAqD ciLel]aIT cyMenAaIT cyMenAppAqD ciFelHF`U cyGemLF`U cyGemLppAqD cjHeb_qBiI czIedBqBiJ czIedBppAqC cjSea][aB czTec@[aB czTec@ppAqC clVdmLrC`tQ c|WdnOrC`tQ cyBeoWOqB ckGenOqTF czVeoQqTF czVeoQOqB ckLenXUY cz[eo[UZ cz[eo[OqC cjZev[`RxC czIew^`RxC czIew^OqC cjKew^OqC cyZey@OqB cyZey@OqB ciGevXaDaF cxVewZaDaF cxVewZOqB ciNeoBWgV cx]epEWgU cx]epEOqC ciSenUUM cyBeoWUN5#B ci^dcFp[iS ci^dcFNA cjLdcGp[iS ciQdlZ^Q cjLdcGH@ cjTdcGp[iS ciYdlZX@ cjTdcGTR cjPdcEp[iT ciUdlYDA cjPdcE\R cjDdcCp\iT ciHdlWMB cjDdcC^@ ciVdcCp\iS chZdlVNA ciVdcCX@ ciNdcCp[iS chSdlVG@ ciNdcCDA ciRdcDp\iS chVdlWSQ ciRdcDLB ciCdlY]R ciCdl[SaA ciCdl[`VA ciYdl\SaA ciVdm]pVQ ciYdl\M@ cjFdl\RaA cjDdm]^@ cjFdl\BQ cjHdl[Sa@ cjEdm[QB cjHdl[\S ci\dlXRaA ciZdmYKB ci\dlXpTR ciHdlVSaA ciEdmW`UB ciHdlVpUR chSdlTSaA chPdmU`UB chSdlT^@ chEdlTSaA chBdmUN@ chEdlTQB chDdlVTaA ch@dmWBR chDdlVKB chOdlXSaA chLdmY\R chOdlX`TC ci@dm\pTS ciFdm^R`V ciFdm^`YB ci_dn@R`V ci]dnVpYR ci_dn@`RA cjQdnAR`U cjOdnVpR@ cjQdnAGR cjXdm_R`V cjVdnUWA cjXdm_VR cjRdm]R`V cjPdnSFB cjRdm]pRS cj@dmZR`V ci^dnP`RC cj@dmZpXS ciHdmWS`V ciEdnM`YC ciHdmWpYQ chOdmVR`U chMdnK`XB chOdmVpSQ cg\dmUR`V cgZdnK`S@ cg\dmUWB cgUdmWR`U cgSdnLGQ cgUdmWGB cg\dmYR`V cgZdnOWS cg\dmY`RC chNdm\S`V chKdnRpQS chNdm\`XB ciDdnTpYR5#F biDdcG`pEaD byIdhL@tA biDdgH@tA biDdgH`pEaD byIdgQ@`[ biDdfM@`[ biDdfM`pEaD byBdgXGW bh]dfTGW bh]dfT`pEaD byBdhM@pU bh]dgI@pU bh]dgI`pEaD bx@diHaBp[ bg\dhDaAp[ bg\dhD`pDaD bx@dhT@`T bg\dgQ@`S bg\dgQ`pDaC bw\dhWDS bgWdgTES bgWdgT`pEaC bw\diI@pR bgWdhE@pQ bgWdhE`pEaD bt_dj_b]qV bd[di[b\qV bd[di[`pDaD buAdhMRbR bd]dgIRbR bd]dgI`pDaD byIddKtHdB biDdcGtGdB bx_ddH@dA bx_dhIfJ`^ bIdiG`VqF b_dhA\tV bSdcK]qP bFda[vGbM biUdcGAd@ biVdgG`Z`R bjPdgYIqG bjYdfRStU bjVda]YqP bjMd`MpXbZ biUdcGoJaA biVdgGoIaB bjPdgY`tYaN bjYdfR`uFaO bjVda]`t]aN bjMd`M`tYaN baWdf^cDr^ bd[dd@r@pZ bb[dcFcFrL bfAd`ZKa[ bfHdeIDrT bfHdeI[bS be]dg\pQaM beLdiIrOO bb]diXb@qC bd]dhUsHI baUdh^Br@ bdZdgEdHsQ biBdcTGrY biId`[FbA biOdb\RbR biMdeNVbE biGdgSpSaF bhTdhYOpY biCdh@p[_ bhHdgQsPaT bdXdiEBr@ bdZdgEsCW bdXdiEsCW bhHdgQsKaD biCdh@vFaX bhTdhYsH`P biGdgSsJI biMdeNsEU biOdb\sCW biId`[sHQ bb]diXRvR bd]dhURtU biCdh@QtL bxEdhGcVr\ b{[deKcT^ bOdd]cGrL cbVdbQJa[ cb\dg@DrT cb\dg@[bS cbQdiSpQaM cb@dk@rOO bQdkOsTqO b{]dj@sZG bxCdjGBr@ buBdhAdGsQ byIddPfNrK bWdbEFbA b]ddFRbQ b[dfWVbE bUdh\pSaF bBdjBuWqF byKdh\p[pP bxPdhLsPaT bu@dj@Bq_ buBdhAcCF bu@dj@cCG bxPdhLcMaT byKdh\fFbS bBdjBb^`^ bUdh\b\`W b[dfWcAI b]ddFcCF bWdbEb_L bQdkORvR b{]dj@RtU byKdh\RtL b|QdmFqKq\ b{FdkJrC`tZ byCe`DpQaG bxReaKqIiD bwIejOFaI bwOekXaM`\ bx\elT`SrA byOejSaRzE b{Ae`NFpZ b{GdTIp_ b{Pd~Ua^}] b}NdpXp]sR bvMdlYqLqT buAdkErB`tQ br_dV\aG brSe`]qBiE bqQejBaQF bsBejHaIyP btKe`XBp] btMd[EpZ btRdAa[prH bvMdlYe]c] b|JdpVq]m] bzMd~SZ`^ bzCdQ@`[ bzCe`LqKjE bxXejQ^bB bxJelStG@ btCelSqCqD bs@ekOqOqM bqQejBeXM brSe`]e_N br_dVfDN buAdkEfEE bvMdlYfDM b|JdpVaDB bzMd~SaCB bzCdQaDC bzCe`L`^B bxXejQ`WB bxJelS`RA bxXejQuVY btCelSqArK bs@ekOdOI b{GdTrD`P bzCe`LuXL bzCdQuVJ bzMd~Su[N b`DdkGqKq\ a~YdiKrC`tY a|Vd~DVaH a|PdLp[iE a{UehQ`PaK a|Eei\aM`[ a}RejWHrB a}ZehUaEzE a~_d~PVp[ a~Yd}UJp_ aCd|Va^}] baAdnYp]sR bfHdkUqKqT bd]djArC`tQ bbZd~R[aG baMeh^aByE baMeh^aQF bb^eiDaHyP bdFdTBp] bdHd~WEpZ bdMd}]a[prH bfHdkUtDcG bbDdn\q^m] b`Fd|YY`^ a]d}W@`[ a]d~RqLjE a~QehW]bA a~DejXcT`R baXekJqDqD b`TejF`YqH a{UehQeXM bbOdYu_] bbZd~RvD^ bd]djAvDpV bfHdkUvD^ bbDdn\qCS b`Fd|YqCS a]d}WqDR a]d~Rp^R a~QehWpWR a~DejXpRQ a~QehWdMM baXekJaFrF b`TejFtOZ a~Yd}UrCO a]d~RdIaB a]d}WdKa@ b`Fd|YdGaD buAdkEppDqD beVdjIpYX buZdkMpYX buZdkMppDqD bfAdm@[rW bvEdnD[rW bvEdnDppDqD beWdpPJsP bu\dqTIsP bu\dqTppEqD beGdtM`Ps] buKduQ`Qs] buKduQppDqD beAdtSFV buEduWFV buEduWppDqD bd^duDCpQ buCdvHBpQ buCdvHppEqD beBduQT] buGdvUT] buGdvUppEqD bdUdyDMsS btYdzGNsR btYdzGppDqC bdPdyCEA btTdzGE@ btTdzGppDqD bdNdySBpP btRdzWBpP btRdzWppDqD bdQdzAS^ btUd{ES^ btUd{EppDqD bdAd}T`PsS btEd~X`PsS btEd~XppDqD bc^d}SCA btBd~WCA btBd~WppDqD bc\d~FBpS bt@dJBpS bt@dJppDqD bc_d~NSX btDdRTX btDdRppEqD bcJehG`UyY bsNeiK`VyY bsNeiKppDqD bb\eiONqH bs@ejSNqH bs@ejSppDqD baSeiSaIT bqXejWaHT bqXejWppEqD baMeh^F`U bqRejBF`U bqRejBppEqD bbOdTqBiJ brSe`XqAiJ brSe`XppDqD bb[d~R\aB br_dV\aB br_dVppDqD bd]djArB`tQ buAdkErB`tQ bq@epHSqB bcBeo@qUF brTepBqTF brTepBRqB bcFeoITY brYepLUZ brYepLSqC bbUewM`QxD brGexO`RxC brGexORqB bbEexO`PqB bqXeyROqC bqXeyRSqC baAewIaDaF bpTexLaDaF bpTexLSqC baHeoSWgV bp[epVWgV bp[epVSqC baMeoFUM bq@epHUN5#N byKcRQ@ byJcRQ@ byIcR@Q byIcQBA byKcSQA byJcTQ@ byIcT@Q byIcSB@ byKcR@A byJcR@B byIcR@B byIcQ@B buFc{_qAs@ btEcx_FpT btKcxK`^cC buIc{NS`Q br_c{Zq@s@ bq_cxZEpT brDcxF`_cC bsCc{IT`Q buFc{_rGU buIc{NrFU btEcx_rFU btKcxKrGU bWdgZQ@ bVdgZQ@ bUdgZ@@ bUdgZB@ bWdg\Q@ bVdg\Q@ bUdg\@Q bUdg[BA bWdgZ@B bVdgZ@B bUdgZ@B bUdgZ@A c`Kc}RpUrA bVc{QDpR bZcz_`UbA c`Oc}@T`R bw^c|_pUrA bwIcz^DpR bwMczL`UbA bxBc|MT`R c`Kc}RxMpS c`Oc}@xMpS bVc{QxMpS bZcz_xMpS cjAdcE@@ cjAdcER@ ci_dcE@@ ci_dcEB@ cjAdcG@@ cjAdcGR@ ci_dcG@@ ci_dcGB@ cjAdcE@B cjAdcE@B ci_dcE@B ci_dcE@B clVdnVpXC ck^dnYuQ\ cfMdnM`XS cgEdnJeQL clSdpIpXC ck[dpLuQ\ cfJdp@`XS cgBdo]eQL clVdnVSaS ck^dnYSaS cfMdnMSaS cgEdnJSaS cjQdh\[A cjFdh]qJR ch\dh[KR ciGdhYaJC cjGdnS\A ci[dnTqJS chQdnQKQ ch\dnPaKC cjQdh\ZeW cjFdh][eW ch\dh[[eV ciGdhY[eW cjOdcEZeW cjOdcESA cjLdcF[eV cjAdh\D@ cjLdcF_Q ci]dcEZeW ciSdh\N@ ci]dcEZQ ciSdcD[eW ciHdh[KA ciSdcDD@ ciWdcD[eV ciLdhZTA ciWdcDN@ cjEdcD[eW ciZdh[^Q cjEdcDJA cjEdh\[Q bvKd|FQB bvJd|HQ@ bvId|H@R bvId|FB@ bvKd|H@A bvKd|IR@ bvId|I@Q bvId|HB@ bvKd|F@B bvJd|HAA bvId|H@A bvId|F@B bvIdnVgX`Q b~AdoGsKiI bzVdxPwWpQ br_dw_cJyI bw@dsLgW`Q b~Wds]sJiI b{Md}FwXpQ bsUd|UcKyI bvIdnV`WdV b~AdoG`VdV bzVdxP`WdV br_dw_`VdV brUdtMVE brOdtR[W brDdtKUpS bq_dsXApP br@dsHGU brGdsCIG brPdsJF`S bpEduNXF bo]duTpQT boLduPZpR boBdt^R_ bo@dtOJW boJdtHNF boXdtNL`Q bnNdwEZH bnDdwMpSS bmQdwJ]\ bmDdv^T_ bm@dvOLV bmLdvI`QA bm]dvJOM bmWdyL[J bmLdyVpTC blXdyYpPZ blHdyOS\ blEdyCKZ blPdxY`TR bmDdxW`PJ bnCd{Z[J bmXd|DpTH bmDd|L_T blUd|HS\ blRd{\KZ bl]d{R`SW bmPd{K`PD boOd~EXN boGd~SpQK bnVd~^\@ bnJd~^RY bnHd~UJ] bnRd~HO\ boAd}\MB bqXe`FWO bqQe`U]O bqDeaDWD bp]eaHQW bp\eaAI^ bqEe`SKpP bqPe`CIS btTeaST`P btPebCX`R btHebUQF btGeb[CU btJebVEpP btOebFEpR btTeaTCV bwXebHS`P bwUebX@`T bwUecLDF bwYecRES bw^ecOBpR bx@eb]ApR bxAebKUX bzWebAQ`P bzVebQG`S bz]ecDIG b{FecKFU b{LecFBpP b{NebVVpS b{HebC[W b}Hea@@O b}HeaOL`P b}Tea_NF b~BebEJV b~Lea_R_ b~JeaPZpR b~@e`^pPT b~_dHAN b@dVON bOe`D`QA c`@e`ELV c`Ld_TpP c`HdO]\ b[dCpSR bUd}ACL bXd}M`PI c`Hd}V`UQ c`]d}UJ[ caGd}JS[ caDd|_pPZ c`Td|UpTB bJdzSCK bMdz^OE b\d{C`SX c`Odz[KZ c`ZdzQS[ c`WdzF_T c`HdzBpSG b}]dxIAG b}^dxPMA b~KdxQO\ b~ZdxEK\ bEdwYSY bBdwP[@ b~WdwPpQJ b{TdvGQG b{SdvNIS b{\dvKKpP b|Gdu[I^ b|PduMQW b|OduFWD b|HduJ]O bxXdt[SE bxUdu@CV bxXdtZFpR bx^dtHDpQ byBdsWCU byEdsRQF byDdsXW`R brUdtMVE brOdtR[W brDdtKUpS bq_dsXApP br@dsHGU brGdsCIG brPdsJF`S brUdtMrPaA bpEduNqWaW bnNdwEpWbG bmWdyLLbN bnCd{ZaLbK boOd~EbIbA bqXe`Fb\aM btTeaScD`U bwXebHb_W bzWebAbQqA b}Hea@aWqX b~_dH`VrG bUd}A[rN bJdzSqMrJ b}]dxIrIrB b{TdvGr\qL bxXdt[vC^ brUdtM@@ brOdtRrRaB bo]duTqYaY bnDdwMpXbI bmLdyVLbN bmXd|DaObO boGd~SbJbB bqQe`Ub_aN btPebCcE`U bwUebXcAW bzVebQbRqB b}HeaOaXqY b@dV`XrI bXd}M[rO bMdz^qOrN b}^dxPrKrB b{SdvNr^qN bxUdu@vF^ brOdtR@@ brDdtKrXaE boLduPq[aZ bmQdwJpYbO blXdyYLbS bmDd|LaRbR bnVd~^bNbF bqDeaDcDaQ btHebUcM`W bwUecLcHX bz]ecDbWqE b}Tea_a[q[ bOe`D`YrN c`Hd}V\rS b\d{CqQrR b~KdxQrOrF b{\dvKsDqQ bxXdtZvT_ brDdtK@@ bq_dsXr]aF boBdt^q^b@ bmDdv^p\bQ blHdyOMbY blUd|HaUbV bnJd~^bSbJ bp]eaHcJaS btGeb[cR`W bwYecRcMW b{FecKb\qF b~BebEa^r@ c`@e`E`]rP c`]d}U^rZ c`Odz[qUrV b~ZdxErSrJ b|Gdu[sIqS bx^dtHv_pP bq_dsX@@ br@dsHs@aG bo@dtOr@b@ bm@dvOp[bT blEdyCMbY blRd{\aVbY bnHd~UbTbL bp\eaAcNaU btJebVcT`Y bw^ecOcNY b{LecFc@qG b~Lea_b@r@ c`Ld_`[rU caGd}J]rY c`ZdzQqUrX bEdwYrUrL b|PduMsNqV byBdsWwB_ br@dsH@@ brGdsCr]aE boJdtHq^bA bmLdvIp\bP blPdxYMbY bl]d{RaUbV bnRd~HbSbK bqEe`ScJaS btOebFcQ`W bx@eb]cNW b{NebVb\qF b~JeaPa^rA c`HdO`\rP caDd|_]rY c`WdzFqUrV bBdwPrSrJ b|OduFsJqT byEdsRv^_ brGdsC@@ brPdsJrXaD boXdtNq[a\ bm]dvJpYbM bmDdxWLbT bmPd{KaQbQ boAd}\bObG bqPe`CcDaQ btTeaTcM`W bxAebKcGX b{HebCbXqE b~@e`^a[q[ b[dC`YrN c`Td|U\rS c`HdzBqQrR b~WdwPrOrF b|HduJsDqR byDdsXvT^ brPdsJ@@ brVds]rRaB bpDdt_qXaX bnLdvWpXbJ bmTdyALbN bn@d{OaNbO boNd}^bKbB bqYe`@b^aN btWeaNcE`U bw\ebCcAW bz]ea\bSqB b}Pe`ZaXqY bHdA`XrJ c`@d|W[rN bUdzIqOrO b~FdwZrKrA b{[duYr^qO bx]dtJvG] brVds]@@ b{Hd|X]aD bQd|AtVa[ b^dz^tVaZ b^dz^]aC b}TdxSa]cN b~@dwPa^cN b~@dwP\aC b{GdyVbMqC b{SdxRbMqB b{SdxR\aD bwXdwWcOa_ bxDdvScOa_ bxDdvS\aD bwKduBMbU bwXds_LbT bwXds_]aC bsXdtZcSH btEdsWcSH btEdsW]aC btEdwO]rU btQdvK\rT btQdvK\aD bqFdy@b_qQ bqSdw\b^qQ bqSdw\]aD bnMdwRbYaN bnZdvNbYaN bnZdvN]aD blQdzWa\sE bl^dySa\sE bl^dyS]aD br[d}JvJrS bsGd|FvIrS bsGd|F\aD bz[d}\x@pR b{Hd|XxApR5#F cdUdiPQA cdTdiQRQ cdRdiPA@ cdSdiPB@ cdUdiRQ@ cdTdiRR@ cdRdiRAQ cdSdiQBA cdUdiP@B cdTdiQ@A cdRdiP@B cdSdiP@A ciDdi[qYT ceAdk^bJrG cfZdlBbJrG cfZdlBqYT ceNdiK]bS cgGdiO]bS cgGdiOqYT cgOdg[rAaP ciHdg_rAaP ciHdg_qYT cgKdiWDq\ ciDdi[Dq\ cf_dkOqYT cb^dlTbHqI cdWdlXbHqI cdWdlXqYT cbTdh^JcV cdMdiBJcV cdMdiBqYT ceLdi[rXp] cgDdi_rWp] cgDdi_qXT ceFdkKFqP cf_dkOEqP ciMdhAWG ciFdhHqKS cg[dhEHW chCdg^aJC ciMdiDWG ciFdiKqKR cg[diIHX chCdiAaJC ciMdhA@aC ciFdhH@aC cg[dhE@aD chCdg^@aC chJdePr]bH ceMdgX_rL cd^deLqYaW ccEdgCpYcY cbLdj\vAe[ b|KdpWRt] b|IdkZqE`R b{DdlLqCU bzAdlGp^`] byCdmDfFN bIdmR`^p^ c`GdlTaCF caJdlZaEpS cbOdlG`Sd_ ccBdqFfSuZ ciUdkL`YsY cjNdgSaYqW clGde\ObL clVdhHb]rH coSdf@wIpP ccCcwQwKdW b{Xc|HsRgL bxFdcTrMb[ buYdfOmI`] ccBdgLcPrY cfRddSkIvZ cq[c}Yb^uA ctYcxXpqVqG chJdePuG}_ coSdf@eF}H ceMdgXgI`P cd^deLgI`P ccEdgCgI`P ccEdgCwMz[ cjNdgSgMyZ cbLdj\gI`P b|KdpWfWO cbOdlGdCwT b|IdkZtCxF b|IdkZfFM b{DdlLfFN bzAdlGfFM byCdmDsJvU bIdmRcYvF coSdf@cDsA crWdb_eG}H cw^cuWsEcA ckNdbNuF}^ cfHctP`qVaG chJdePcDsB ckNdbNgI`Q ccCcwQcEsA boBcxR@@ boBcxRR@ bo@cxRA@ boAcxRA@ boBcxS@A boBcxTR@ bo@cxTAQ boAcxSA@ boBcxR@A boBcxR@B bo@cxR@B boAcxR@A ctYe~ObIsY cwBezVtLK crVe{As@aE coVe|FqQaZ cnEe~@fTO coVe|FFp^ co\e{H`SuG cpOevA`WwQ cqFenPMtS cqSei]`YtB crLee[`ZvD csFdWJuS csPdzDbZaZ cvJd{^dXaP c{Bd}NqStF cyOdyHtVaeG cxRenUbPpqG ctBenObHprQ cxRenUtPV ctBenOr\A crVe{AaL|R cwBezVaP|A csPdzDprAp] csFdWpq]qH crLee[pq]qH cqSei]pq]qH cqFenPpq]qH cpOevApq]qH co\e{Hpq]qH coVe|Fpq\qH cnEe~@pq]qG b|He|Yu_] bvIe|LaWq] bx@ezObBY bzBezFbGE b|IezKQbN b|He|YaRq[ b}Zez^Ep^ b|IezKaV[ b}_ez@`SuG b|IezKaD}D bzBezFaE}E bx@ezOaJ}T byJel[a]F b{GemAbFF b}MemGa\A bIemHpWgQ byJel[bFptA b{GemAbQpsG b}MemGbRpsI bIemHMtS bVehU`YtB c`OedS`ZvD caId~OFuH caOdyGqP`W b_dy^rGT b}XdyZrHq@ bz_dwD`QaV bz_dwD`~PbD crVe{ArZG bvIe|LdVqeH cm]ezKOqB c`BeyBqTG coQezEqTF coQezEOqC c`GeyLUZ coVezNUY coVezNOqB bUfaO`RxC coDfbQ`RxC coDfbQOqB bEfbR`PqC cnUfcTOqC cnUfcTPqB b~BfaKaCaG cmQfbNaDaF cmQfbNOqC b~IeyVWgU cmXezXWgV cmXezXOqB b~NeyIUM cm]ezKUM bzVdwX}Ip^ bnEdwPpXpV b{MdxNpWpV b{MdxN}Hp^ bnMdzYXsI b{Vd{VYsH b{Vd{V}Ip] bnAd~TLs[ b{IdRMs\ b{IdR}Hp^ bmNeb]`StI bzVecZ`StH bzVecZ}Hp] bmHec@FS bzPec^FT bzPec^}Hp^ bmDecRDpR bzMedPCpR bzMedP}Ip^ bmHedCTpQ bzQeeATpQ bzQeeA}Ip^ blXeh@`Ps] bz@eh]`Qs\ bz@eh]}Hp] blSeg^EB by\eh[DB by\eh[}Ip] blQehOBpQ byYeiMCpR byYeiM}Hp^ blTeiASpR by\ei^SpQ by\ei^}Hp] blAel]`Ss\ byIemZ`Ss\ byIemZ}Hp] bk^el[CB byGemXBB byGemX}Ip] bk[emNCpS byDenLCpT byDenL}Ip^ bk_emZT\ byGenXS\ byGenX}Hp^ bkBexU`]z[ bxJeyR`]zZ bxJeyR}Hp] bjSey]OqH bw[ezZOqH bw[ezZ}Hp] biKeyOaHN bvTezMaGM bvTezM}Ip^ biGexTD`[ bvOeyQE`\ bvOeyQ}Hp] bjOenNqHjF bwXeoLqIjE bwXeoL}Ip^ bj[emL\aB bxCenI[aC bxCenI}Hp] bmMdvZrR`vR bzVdwXrS`vQ ajQeyJcEsW amVeuScR`] aqHevPaNaO arVew_qQaZ aqEeyYvT_ arVew_Fp_ ar\ew@`SuG asOeqY`VwQ atEejHNtS atSeeU`XtB auKeaS`[vC avFd{PIuS avOdu]qTaO at[dwLtB`] apYdxIqStF aoFdtCtUaeG aoEeiRaTpqI arSei]bHprQ aoEeiRcNK arSei]aRK aqHevPaK|S amVeuSaO|A avOdu]`qYaR avFd{P`q]aH auKeaS`q]aH atSeeU`q]aH atEejH`q]aH asOeqY`q]aH ar\ew@`q]aH arVew_`q]aG aqEeyY`q]aH bcBe{Ae_M biAe{NaWq\ bjXeyRqOpQ biIeyArGU bgBex\t@bE bcBe{AaQq[ bdSeyFFp^ bgBex\rIpT bdYexH`SuG bgBex\aD}D biIeyAaD}E bjXeyRaJ}U blBek]qUQ bjMek\rGT bhFekXrDX bfBekPpVgQ blBek]bFptA bjMek\bQpsH bhFekXbRpsI bfBekPNtS bfPef]`XtB bgHeb[`[vC bhCd|XEuI bhHdwObPa@ bjXdxObFE bl^dxTaJpX bmVdvF`RaV bmVdvFp~PrC aqHevPaT`P biAe{NdUqeH bbXewMPqB at]evEqUF bdLewGqTF bdLewGOqB auBevNUY bdQewQUZ bdQewQOqC atPe~Q`RxC bc_eT`RxC bc_eTOqC at@eT`PqC bcPf`VOqB bcPf`VPqB ar]e~NaCaF bbLePaDaF bbLePOqB asDevXWgV bbSew[WgU bbSew[OqC asHevKTM bbXewMUN azGdpMa|YdG cv^dxVBtB azEdtPBtC azEdtPa|YdF cv^dw\@`Z azEdsU@`[ azEdsUa|YdG cvWdxAGU ay^dsZGU ay^dsZa|YdG cvWdxV@pU ay^dtP@pV ay^dtPa|YdF cuVdyKaApU ax]duDaApT ax]duDa|YdG cuVdxW@`T ax]dtP@`T ax]dtPa|YdG cuRdxYDR axXdtRER axXdtRa|ZdG cuQdyKApR axXduD@pR axXduDa|YdG crVdzNb[qC au\dvGb\qC au\dvGa|ZdG crYdw\SbR au_dsUSbR au_dsUa|ZdG cw@dtTtGcH azGdpMtHcH cu\dx@cVr\ cyRduDcR^ c}DdtVcGrM d`KdrIJa\ d`QdvYDrT d`QdvY\bS d`EdyLpPaL cUdzXrN`P c}Gd{HsTqO cySdyYsYG cuZdz@Br@ cr[dwYdGsP cwBdtIfLrL c}Ndq]EbA c}Sds^QbR c}RdvPWbE c}KdxUpRaF c|Ydy[uVqF cwCdxUpZpP cvIdxEsPaT crYdyYBr@ cr[dwYcAG crYdyYcAG cvIdxEcJaT cwCdxUfDbS c|Ydy[b\`] c}KdxUbZ`W c}RdvPb_I c}Sds^cBG c}Ndq]b]L c}Gd{HSvR cySdyYQtU cwCdxUQtL ar\dsGcEr^ avAdpIq_pZ atBdoOcGrM awIdmBJa\ awOdqRDrT awOdqR\bS awCdtEpPaM avSduRrNO atEdvAa]qC avBdt^sHI arZduGBr@ au^dsNdGsQ azEdo]JrY azOdmDEbA azTdoERbQ azRdqVVbE azLds[pSaG ayYduBMpY azFdtIpZ_ ayLdsZsPaS au\duMBq_ au^dsNsBW au\duMsBV ayLdsZsJaD azFdtIvAaX ayYduBsF`P azLds[sIJ azRdqVsCT azTdoEsAW azOdmDsFR atEdvASvR avBdt^QtU azFdtIQtL cvYdtD@dA cvYdxEfO`^ c}HdyC`VqF c}^dw]\tU c}RdsH]qP c}EdqXvLbL ay_do]AdA az@ds^`W`R azWdtPKqH a{BdsHUtT az]dnTYqP azTdmDpUbY ay_do]a|ZdG az@ds^a|YdG azWdtPbbQdS a{BdsHbb\dU az]dnTbbUdT azTdmDbbQdT5#A b}WcqMqHg^ b|OcyKX`[ b|GczFpZa[ by^c~XvSiU bsKdhMzHlQ biCdt^rXaB bfKdv@q_rE bdLds[rDv[ bbHdm@[yN ba]dcRRvY ba[c|YaCxQ bb^ctHbNtA b}WcqMr@C b{WcqPXg[ b{Kcy]qBaX bzIc{UqRbS bxWc~HvZiK bq]dgSqJqA bpSdfRgOx^ bxBc}TaYrH by[c{LZqE byQczGp[xB bxVcrEcApU bxVcrEsFaV byQczGrKaQ buPcs[aVg] bxBc}Tp\q\ bpSdfRrKtO bq]dgS{RnM bpSdfR|GmI bnHdbC|@j] beVcYsYcY beAcy^sFb[ bfRcqVsTbR bh^cmWsRbP b{Kcy]qPaO bwFc{Xx^fK b}WcqMxPf^ bjVcm[rUbR bnHdbCqCr^ boFcxDp^dA bnHc|EqCc@ bmEcEqObW bkVda\p_aP bjWdcLpX`[ bi_ddGpYL biFddSp\T bhJddOqHp\ bgBdcSp[r@ bfGdaSpQqZ beVcYpUu[ beAcy^aQxH bfRcqVbLs_ beAcy^SdO bd^c~MHa[ beFd`H`[a^ bfAdbFa@`] bgAdcC`WT bgXdb_`UpQ bhMdbN`XpW biEdaW`]qK bjBd`LaKrV bkMc}VaArY blNcz]bXrY bnHc|EqZqH bmEcEqXqO bkVda\qTqP bjWdcLqRqU bi_ddGqRqY biFddSqNqT bhJddOqIqL bgBdcSqAqM bfGdaSqAqK beVcYpXqL buGcxKp^dG btIc|Rp^c@ bsKcRqGbT brDdbFp[aM bqIdcSpVaB bpSddUpWF bo\dd[pZB boBdd]qF^ bm\ddOp\rQ bm@da^pSqZ blMd`DqBuX bkKczLpQxM bjZcq_TtD boFcxDfAG blNcz]g[aU bkMc}Vg^a\ bjBd`LhBaZ biEdaWhDa\ bhMdbNhFbG bgXdb_hDa\ bgAdcChAaZ bfAdbFg[bI beFd`HgZaV bd^c~MgOaW beAcy^fJN bfRcqVdHI bh^cmWaXD b{OcyKa@@ b{Mc|AqD\ by^c~XqGpP bsKdhMqNpZ bxWc~HpUpT bzIc{U^Y biCdt^qFpZ bg]dtDJvW bhGdmMCyM bhJdd@RvY bhHc}GWxT bhActS@tF bg]dtDsQY bhGdmMu_] bhJdd@vM^ bhHc}GvM^ bhActSuC[ bhAcpMrUV b{OcyKq^`\ buPcs[vJdI b{Mc|AqObW b|GczFp\Y b{Kcy]DpR boFcxDrXbY blNcz]bDuC bnRcuZ`Z`Z boLcvTVaP boFcxBrXbZ blNcz\bDuD bnRcuX`Z`\ boLcvTVaN blNcz]@Q bnRcuZ@R boLcvT@@ boFcxD@R eiYcvVUh@ eiTc~VT`[ eiPcQpWa\ egXddEuHiX ebPdm]x^lT dyRdzQSaH dyOd{YbNq[ d{]dy^bXvQ d~UdsM`QyL dFdjARvY dDdcHqRxW d}RczQrMtL eiYcvVaQK ekJcwApZgY ejLcLpPaZ ei\daFp]bS eh_dcYuAiP ec^dmIaJp[ eeHdlNdLyE eiTdcI`VrK ejJd`^KqB ejUc\bAw] elVcw_qLp^ elVcw_pPa\ ejUc\TaU elFcy[qUgV eiTdcI`]qX eeHdlNbKtE ec^dmIzOnP eeHdlNyKmP egSdhIx^kD ec@dfIsZcX ea\d`LrXb\ dMcw[q[bV d|^csQqYbT ejLcLRaR ejQdaQr^fX eiYcvVvCgD d{EcsMrUbR egSdhIaCrZ eiLc~LTdC eiHdbOpRc@ ehVdeOpYbY eg]dhHpRaQ egKdiYpR`\ efYdjUpQM efHdkBpUT eeSdj^q@p[ edSdjCqBrA ecQdhBpQqY ec@dfIqDu] ea\d`LrOxQ dMcw[rOtJ ea\d`LbDdT ed@de@`Va\ edVdf\aBa_ eeXdh[aG`] ef_diX`WT egVdiT`UpQ ehKdiC`QpX eh\dhK`UqK eiQdg@`]rW ejNddI`TrZ ekBdaOqVsC eiHdbOaZq@ ehVdeOaXqF eg]dhHaTqH egKdiYaQqN efYdjUaRqR efHdkBaNqN eeSdj^aLqF edSdjCaEqH ecQdhBaEqF ec@dfIa@qI ecVc}Z_dG ecGdbApWcA ebPdeBqAbU eaOdgWpWaM e`XdiDpSaB e`EdjFpSF dRdjLpWC d~[djOqB_ d}Ydj@pYrP d}@dgP_qZ d|QdeVp^uX d{Sc^^xL d{EcwR@tE eiLc~LuVpR ekBdaOw[`R ejNddIw^`Y eiQdg@xB`W eh\dhKxD`Y ehKdiCxFaC egVdiTxD`X ef_diXxD`W eeXdh[w_aE edVdf\wV`T ed@de@wO`V ea\d`LvI^ dMcw[tHY d|^csQqYT ejPc~Zp\T ehYdaMaCW egXddEaG\ ebPdm]aNpT eh_dcY`UpP ei\daFNX dyRdzQqFp[ dxLdyVIvV dxUds@DyM dxYdiSRvZ dxWdbYWxS dxPczF@tG dxLdyVcQH dxUds@f@M dxYdiSfMN dxWdbYfMO dxPczFeBK dxPcu_bUF ejPc~ZEaB elFcy[rZdQ ehYdaMqAbX eiPcQ`\U ejLcLDpR eiLc~LaVcC ekBdaOpQuI ejQc|Fp_`V eiRc|\VaP eiLc~JaVcC ekBdaMpQuI ejQc|Dp_`X eiRc|\VaN ekBdaO@R ejQc|F@R eiRc|\@@ eiLc~L@R bg\duFqFaD bfVdvJcDqI biZduAq^E bhXeu]pQ`P bhGevMbMpQ bjTeu\q\A bjTeu\pZq`[ bhXeu]p\q`W bhGevMqQq`C dw]dzWqEaD dvXd{[WqQ dvQdzJaLM deYezCpQ`Q deHezTp]pY ddKey[aNH ddKey[`rFpQ deYezC`rDpL deHezT`qPp~Y ddEcsMaLrM deQcq@Gp] deXcpCBpP deZcoSSS deWcoPGpU de^cn[@sK de^ckPRtR de\cf^qKrG ddQcdWRrZ ddOca]ZI ddEcbF@`qG cmXcrEaLrM coDcoXGp\ coKcn\BpQ coMcnKSS coJcnHGpU coQcmS@sK coQcjHRtR coOceVqKrG cnDccORrZ cnBc`UZI cmXc`^@`qG cbGcq]aMrP ccTcoMHp\ cc\cnQBpP cc^cnATT ccZcm]GpU cdAcmH@sK cdAci]RtR cc_ceKqKrG cbTccDRrZ cbRc`JZI cbHc`SQ`qJ by_cq[KrD bzJcoWpQp^ byYcnYEpP by^cnICS bzAcnFVpV by[cmP@sK by[cjEAtR by\ceSaMrA b{IccRBrZ b{Kc`XHK b{ScaCqT`pX by_cq[qQqO bxNcpLpTp[ bwZcoQSpP bwWcoAET bw\cn]pVpV bwFcnG@sJ bwFcj]EtR bwKcfKcRrT bz]ccWErZ b{Bc`]`QF b{ScaCqT`pX bsHcvWrTqI bpTcuNp]pX boWctVW^ boPctHNV bo^ctBp\pP boBcsR@sJ boBcpHCtU boEckSaHsO bpMchDaCrY bqPceKaXD bsHceO@`qH bq[cxCrOqO boLcvTpZpZ bnRcuZTpQ bnNcuI`PX bn^cuApZpR bnDctOMsW bnQcpXMt] bn^ck[aKsS bpIchHaCrY bqLceOaYD bsEceS@b\ bsEchOTcU bsAclDZd] brWcqA]cW brJctXWaJ brCcvBS`X br@cvZUaI cmXcrE`vMaH coDcoX`vMaH coKcn\`vMaG coMcnK`vMaH coJcnH`vMaH coQcmS`vMaH coQcjH`vMaH coOceV`vMaH cnDccO`vMaH cnBc`U`vMaH cmXc`^`vMaH cbGcq]kQH ccTcoMkPK cc\cnQkOK cc^cnAkOJ ccZcm]kPK cdAcmHkPK cdAci]kPK cc_ceKkPK cbTccDkPK cbRc`JkPK cbHc`SkPK by_cq[hHB bzJcoWiJZ byYcnYjCX by^cnIj@X bzAcnFiYY by[cmPjFX by[cjEjFX by\ceSjCX b{IccRgK^ b{Kc`XgG^ b{ScaCfUpP by_cq[@@ bxNcpLa\pU bwZcoQa_pX bwWcoAbGpX bw\cn]bEpW bwFcnGbUpW bwFcj]bUpX bwKcfKbQpX bz]ccWLU b{Bc`]IU b{ScaC@@ bsHcvWfWt\ bpTcuNgZuB boWctVhCuE boPctHhGuG bo^ctBg^uE boBcsRhDuK boBcpHhDuK boEckShFuH bpMchDjPtM bqPceKiRtN bsHceOhKtL bq[cxCaMqL boLcvTaHqF bnRcuZaEqD bnNcuIaBqA bn^cuAa@p_ bnDctO`^p] bnQcpX`QpP bn^ck[GX bpIchHDT bqLceODT bsEceSCT boLcvTbTF bnRcuZcQH bnDctOdFI bnQcpXdFI bsAclDtCY bsEchOr\W ddEcsMaLrM deQcq@Gp] deXcpCBpP deZcoSSS deWcoPGpU de^cn[@sK de^ckPRtR de\cf^qKrG ddQcdWRrZ ddOca]ZI ddEcbF@`qG dy_cuHaLrN d{KcrZGp\ d{Rcq^BpP d{TcqNTT d{PcqJHpU d{XcpU@sK d{XcmJRtR d{VchXqLrG dzJcfQRrZ dzHccWYI dy_cd@@`qH edQcvPaMrP ee^ct@Hp\ efFcsDApP efGcrTST efDcrPGpU efKcq[@sJ efKcnQQtS efJci^qLrG ed^cgWRrZ ed\cd]YI edSceFR`qJ ekXcwPaVrA emNcuOa@pZ enNctURpQ enLctD[S enActA`VpU enWcsL@sJ enWcpBUtS enRckOtDrM ejNciBVr[ ejHcfGp[H eiMcfObK`qA ekXcwPb@qF emXcvJ`^pX enVcuRD_ enZcuCYV enQct]aBpR eoSctK@sJ eoScqAYtS eoJclNt[sF ejOciHYr[ ejFcfMpYB eiMcfObK`qA ehEc|SbUp] ejZc{V`\pS ekVc{CG^ ek]czU^X ekOczM`\\ elKczA@sK elKcvVStT elHcrBqGsT ekAcnNqDr_ ei]ckOqXS ehEckL@`qG efWc}_b[qC eiRc|\`_pV ejQc|FJpP ej[c{V\Z ejOc{L`^^ ekMcz^MsW ekZcwGFt^ el@crIqCsW ej]cnRqCr_ eiZckSqYT ehAckO@b\ ehAcnKTcU eg]cr@Yd^ egTcv^^cV egFczTVaJ eg@c{^S`X ef]c|VVaI dy_cuHpuZq[ d{KcrZpuZqZ d{Rcq^puZq[ d{TcqNpuZq[ d{PcqJpuYqZ d{XcpUpuZqZ d{XcmJpuZqZ d{VchXpuZqZ dzJcfQpuYqZ dzHccWpuYqZ dy_cd@puZqZ edQcvPzRqH ee^ct@zSqF efFcsDzTqF efGcrTzSqF efDcrPzTqF efKcq[zSqF efKcnQzSqG efJci^zTqF ed^cgWzTqF ed\cd]zTqF edSceFzTqF ekXcwPwGq@ emNcuOwPqO enNctUxHqQ enLctDxEqP enActAw]qQ enWcsLxLqQ enWcpBxLqQ enRckOxHqQ ejNciBuPqK ejHcfGuLqJ eiMcfOtZqI ekXcwP@@ emXcvJZp[ enVcuRXp] enZcuC^p_ enQct]pPp\ eoSctKp\p_ eoScqAp\p_ eoJclNpXp_ ejOciHQV ejFcfMBV eiMcfO@@ ehEc|ScSuC ejZc{Vb^uL ekVc{Cc@uQ ek]czUb]uR ekOczMcBuP elKczAcHuV elKcvVcHuU elHcrBcBuT ekAcnNpRuF ei]ckOIuB ehEckLaHt] efWc}_aNqL eiRc|\aHqF ejQc|FaEqC ej[c{VaBqA ejOc{La@p_ ekMcz^`^p] ekZcwG`QpQ el@crIHW ej]cnRDT eiZckSCT ehAckODS eiRc|\rUV ejQc|FsQX ekMcz^tGZ ekZcwGtFY eg]cr@dCI ehAcnKb\G eiMc~JpqNq[ dw_c|OqLpW dvSc{XpXpT du[c{DpUvX duFctL`tNbN eiTcvZWgP ehUcApqNq[ dwGc}FqLpW du[c|OpXpT duCc{[pVvX dtMcuC`tObN eh\cwQWgP eiMc~JpX`W dw_c|OpX`W dvSc{XpX`W du[c{DpX`W duFctLpY`W eiTcvZpX`W b|Vcx_`rS`V coIcyUaXpP cqAcyEa@pP crAcxUbMvR ctNcrCpvNpP b~@cqSqJgL b{^cyV`rT`V cnRczLaWpQ cpIcy[a@_ cqIcyLbNvR csWcrZpvNpQ b}IcrIqKgM b|Vcx_pX`W coIcyUpW`W cqAcyEpX`V crAcxUpX`W ctNcrCpW`W b~@cqSpW`V du@cvTppDqK dd\cuIppSp] ctIctL`RqJ ct[csB`pG`^ deBct@o[aI dt]cuICaK dtVcv]ppDqK ddRcuRppSp] cs_ctU`RqJ ctQcsK`pG`^ ddXctIo[aI dtScuRCaK du@cvTZI ctIctLZI ct[csBZI dt]cuIZI ddRcuRFqI dd\cuIFqI d}RczPrNtJ d{DcvFvTqA dtPcuEaJh[ duZc~@gXsP dbGdt]rLtL c[dpQvUq@ cyFdoQaIh\ czOdxMgXsP d}RczPp{K`zM d{DcvFp{I`zK dtPcuEp{J`zL duZc~@p{K`zM bb^ctGbMs_ beKcpHfUT bl@cpDqKhU bjUcxYwWtR agRdnTbPtA ajBdjSfTS apVdjPqLhV aoJdsFwXtR bb^ctGp{L`zM beKcpHp{I`zK bl@cpDp{J`zL bjUcxYp{K`zM c{Ve{NUD c{Qe{RvIn[ cuHfjMpRaG ctVfkTCT ctYfkP`SqG cuLfjIfJ~[ czLe{DUD czGe{Hu^`pT ctIfk\EU ctNfkWe^ppS ctNfkWKW ctIfk\MX czLe{DaJJ czGe{HaJJ cuLfjITD ctIfk\qRa@ crWfl\qDY cqSflS`R{[ crEf`XdKq^ cvPe~Zp^R cuRe~XrNkF csDfi^`WL cs[fjJaMC cuHfjMp[\ ctMfjArZbR ctIfk\MX ctVfkTqW`T cr_flHqLK cqSflSaQrU csDfi^aIC ctIfk\^qR crWfl\HpT cr_flHaNrG ctVfkT`RqG crEf`XcMr@ ctMfjAbC{G ayOfgYqOaA ax@fhZq@Y aw@fhQpp]}B afCe{OLrF afOeyI`^B agMeyK`qAlQ axNfe\`SK ayAffGqNS awSffD^[ awEfeYUbX ayOfgYpV[ axYfgNqA`V awXfhDpXM aw@fhQaNrU axNfe\qIS ayOfgY^qR ax@fhZXpV awXfhDpSrK axYfgNqFqJ afCe{OaJrD awEfeYppV|P c{Ue{OaYqE c}NezJbLvF cZetDGsN d`AepVKqZ d`Len\bHwM dbTegOaExW dcYd~Xp_zJ dbZdtNpSO dbGdt]`YjT dc@dQqHh[ daXehLqJc^ d`NelJqAaT cMem^qAaA c~Len_qF`Y c}FeoXqQD c{Ueo\qCp] czRen_q^`W cxTeoVaVbR czJerHaZD c|DerLaDpX c}HeqTaIqE c~QepOaDqY cUenVb_wG dcYd~XpY`Y dbTegOp\`] cUenV`YrL c~QepO`\rQ c}HeqTaDrU c|DerLaBrT czJerHaKrL czRen_y@G c{Ueo\xTa\ c}FeoXxUbD c~Len_x[bD cMem^x\a_ d`NelJx_aZ daXehLxZpV dc@dQxRpX dbGdt]wFpT c{AdtIpSjP czNd~YqPh] cx^egVqOfN cwOenDp^aY cvQeo]q@aF cuQeqCq@`Y ctQeq\qPT csAeqXqOrR c{AdtIN[ dbZdtNwKpP dcYd~XxVpT dbTegOxVpS d`Len\xMpS d`AepVxKpR cZetDxHpR c{Ue{OtCw] c{Ue{OuEcK cZetDpsGoF c}NezJpsEoD c{Ue{OsTcO cxAe~^rZbA cuGf`_z^hO cjIfiNbJvD clSfcJJzA cl]eyIcXsG cpUevBg_vL cqReoFy@h\ cpUevBrJk\ cnKfa^qXaL clSfcJtZY cgYfcAppGpZ bwRfbG@zF bwRexA`uKaH bwRexA`XpW bxJewJ`pH`X chRexB@jF chRfbHpY`Y chRfbHppHpX bxJfaPpX`W bxJfaP@zF cg\fiKSvJ cg\fiKbMC cg\fiKlU|G cg\fiKjIxS crEf`XcBG crEf`XdKq^ cvPe~ZaQD cvPe~Zq_qV ctQe}DcAyR cwResRDsN cwVepDIq[ cw_enIa_wM cy^ef\aExX c{Cd~DLzF agUeuTq\qM aeYetGrPvP acIemW@sN acIejIHq[ acQehNaVwN aeGea@aExX afLdxHaVzC ahBdnEpPO agRdnTrCjN aeOdyBqOhZ ad@ea\qQc] abOeeYq@aU aaOegNp[aA a`TehOpW`Z `]eiIqCE `~ZeiNpUp\ `~EehRI`\ `~NeiNaHbQ `Vek_aEC a`[elB`]pX aaXekJ`WqG abOejC`YqZ acHehIa_wI afLdxHp]`Z aeGea@qG`\ acHehIpYrP abOejCq@rU aaXekJqDr[ a`[elBp^rY `Vek_p\rQ `~EehRgKaL `~ZeiNhFcA `]eiIhRcJ a`TehOh[cL aaOegNi@cF abOeeYh_cB ad@ea\h]`R aeOdyBh^N agRdnTgMM an_doApRjO anMdyPqPh^ al]ebNqOfM akNeh[p_aY ajOejTq@aG aiOek[q@`X ahOelSqOT ag@elOqPrQ an_doAO\ ahBdnEgL`P afLdxHhU`S aeGea@hU`S acQehNhM`S acIejIhK`R acIemWhH`R agUeuTc\wK agUeuTqFcU acIemW|HoU aeYetG|FoS agUeuTrWcQ ad^eyEq^bC ac@e{HyMhR `ySfcZrRvN `wAe}LpRzC `vOesIbQsJ `y@eo_eNvQ aePei^x_h\ `y@eo_p\l@ `xDe{_qCaM `wAe}LdVL `{We}XoTaM akKeE@zF akKet_pt\qV akKet_`XpW alCetHRqN `|QerZ@jE `|Qe|_pZ`Y `|Qe|_oRaO alCe~NpX`W alCe~N@zF `{ZfdBSvJ `{ZfdBrGX `{ZfdBlU|G `{ZfdBjIxS afCe{OsCW afCe{OLrF afOeyIqQT afOeyIb@qN ahOew[cByR akQenICsN akTej[JqZ ak^eiAa^wN am\eaSaExX aoAdx[MzF cxTeoVyRg^ coBewTrCaH cl_ex\sIF ciVeyBprFqF bwPew\pvEqO baKevMjFy[ cyYem^yTg_ cpEeu]rQaP cmTewMsVK ci^ewXpsGp] bvWev[pvEqO b`ReuL`YaA cx^ei]xRf^ cpLep[rUaS cmWerNsVK cjAerYpsOp[ bvReq^pvEqO b`MepOEd] cwHedUw_gH coIek]rAaU cmHemRsM`R ci[enDps@p] bv[emGpvEqO b`VekXYdW ctKdZxLg\ ck_egVqA`S cj^ehIrFM chXehVppZpW bw^eg_pvFqN baXefQqBeG cxTeoVqmCsD cyYem^qnFsF cx^ei]qnMsG cwHedUqmJsE ctKdZqjUr^ biVd|\w^iU ctKdZb]d[ cwHedUaVeH cx^ei]`[dA cyYem^qEaX bkQelRBqZ bkSejXqBtB bjQefVpSuF bi^eaPXtT coBewTaCqW cpEeu]GuB cpLep[qCt^ coIek]sJtG cl_ex\`UqO cmTewMCt_ cmWerN_t\ cmHemRrJuI ciVeyBHqJ ci^ewXCt_ cjAerYVtU ci[enDqCuN bwPew\pYqA bvWev[Ut] bvReq^ItW bv[emGaCuH czRen_q^`W cxTeoVaEqX cyYem^`YaA czRen]q^`W cxTeoTaEqX cyYem\`YaA czRen_@R cxTeoV@R cyYem^@R `~NeiNwAhC `wMeqQpTaK `vYer\bN`T `yGesP`rBaJ akIetZ`vBaS baKevMjFy[ `}LegQwBhE `vJeoVpUaT `uUeqJbP`Y `xEerC`rLaV ajQesY`vAaS b`ReuL`YaA `|CecOv@gD `vCejSpYaW `uJelJbP`Y `wZemC`rQaY ajKen\`vBaS b`MepOEd] `|Td~KuNgN `wFeeYqAaX `vEegQbK`^ `xPehO`rEaV ajUejE`vAaS b`VekXYdW `Ady]tQhE `zPebBQ`U `zOebWaK`T `{ZecKo^aR akXed]`v@aT baXefQqBeG `~NeiNamCcD `}LegQanGcG `|CecOanNcG `|Td~KamJcE `Ady]ajUb_ biVd|\w^iU `Ady]rMdN `|Td~KpQeD `|CecOaIdB `}LegQaBa] bkQelRBqZ bkSejXqBtB bjQefVpSuF bi^eaPXtT `wMeqQqCq[ `vJeoVWuC `vCejSaCtZ `wFeeYcJsW `vYer\qDqR `uUeqJ[u@ `uJelJ`[tY `vEegQdJtZ `yGesPqBqM `xEerC[u@ `wZemC`VtT `xPehOcJuD akIetZpXqA ajQesYVt] ajKen\JtW ajUejEaCuH `~EehRI`\ `~NeiNqBq] `}LegQ`YaA `~EehPI`\ `~NeiLqBq] `}LegO`YaA `~EehR@R `~NeiN@R `}LegQ@R beAdvMpRrM bdOdt@pPwC bc_dl]DyO bdCdcNVvZ bc]c|TAxM bc^ctGqoRhS `tLc|Z]iE `s_de_@fX `s_dlWpPj^ `sOdwU`Pf] `s_d~R`WaR `tVe`DapKyW bf\dv\`XqV bgTduF`^vS bhRdnSqF^ bgLdnELyK bgXddZUvZ bgSc~@sUyY `tLc|ZcJjQ `wVdgK@fW `wVdnBpYj\ `v]dx^aFN `xCdyLp^fK `wEdW[`_ `vZe`VapByZ `wEdWapOzQ `xCdyLapOzY `v]dx^apOzY `wVdnBapByH `wVdgKao]yK `s_de_ao^yK `s_dlWapDyI `s_d~RapPzR `[dtQadDwT `sOdwUeBqR `WdrCwIaQ `xNdsTCbO `xQdvCHa[ `xYdw^gIqR a`BdvLWq[ `[dtQTrN aaKdrVwJaQ `zAdtGAdF `zBdxMgKqQ aaMdv\RtF `xYdw^aIO a`BdvLaK`P `WdrCaT`S `xNdsTaS`S beAdvMa[O bdOdt@cEaF bc_dl]cMaH bdCdcNcUaL bc]c|TcVaL `s_de_cWaL `s_dlWcWaK `sOdwUcNaI `s_d~RcFaE `tVe`DbD`R `tVe`DbN^ `wDdVaE`xX `xIexNjQrF abZevHf@qH ahZeu@d]qE amWes[bQ`V apHetQsTaI alTeuZsJaA aiJev[v@aO acJexJ|QbS `vYez]D`S `v]e{PlXrQ acUex_fAqU aiVewJcHqA al^evIcJqX apHetQ`uWp}Y anRetZ`sXp}M baLdwBpsU`|Y bbJdwMp^[ be_dvXsU`U baLdwBdSZ anRetZpuMc_ `tVe`Da[`xW `v]e{PqNp{J `yEexYqGpyA `tVe`D`YB `uOe`FbO^ `w^dXpZR `vQex[HbB `xIexN`\K abZevH`PbB acJexJK`U aiVewJ\_ aiJev[pPq[ amWes[qCa_ alTeuZJO amWes[`[`_ `vQex[aX] `v]e{PbHrW anRetZaVY dyMd{^bLq_ d{Ydy_bSvT d~LdsK`PyM d~\di^QvZ d~[dcDqNxT d}MczPu@n_ dxMdiOaMiM dyZdr\@fX dyZdyTpQj^ dyIedRrTfN dvUek@q]aF dtXelFdUppH dvGd{TCqY dvJdy[CvV dvMdsEbAA dxNdsFByM dxPdiYQvY dxOdc@d^xP dxMdiOuAiI dsLdrX@fW dsLdyOSj_ dsIedNrAQ dqHedMTfO dqDej\Qa@ dqCek\eDppH dqDej\eFpqA dqHedMeEpqH dsIedNeEpqH dsLdyOeDV dsLdrXeCX dyZdr\eAX dyZdyTeBV dvUek@eDpqA dzSdYcY|N dyIedR`QrH dzWd}LpZbQ dy]d]SbM dyZebJ]aY dyMedC`YrQ dzFeaRMqY dzSdYDrM dw]d}JpYbQ dwDd[@dF dwDedA`YrQ dw]eaP@tF dyMedCrIR dzFeaRrIR dzWd}LrZR dy]d]rYR dyMd{^sFZ d{Ydy_uOT d~LdsKu^U d~\di^vLU d~[dcDvLT dyZdr\vNT dyZdyTvNU dyIedRv@T dvUek@uQT dtXelFsUZ dtXelFHpX du@ekN{J`v\ diVfbJaLsR dkBe~X`ZrA dk\e|W`UqY dlQez^qJC dkGe{ACa[ dkJe|\YaP dkAe~LpZbG djGf`SqWdH dhPfd[pSO dg]feJaWtF diTfaD`WrO djKe~UMqO djXe}FOrE dkGe{AlSpD dkAe{RlMp~P dyAd}C|P`}[ dwNd}BaSA dwZd{]\aE dyAd}CqGqF dkAe{Rr\fW dtXelF{J`vX dg]feJkOpyL dhEfbIkOpwD dtXelFqLX dsLek^HpY dsTekEaLI diNfb^p^a] diVfbJqQQ dkBe~Xp[a[ djGf`SpS`Q djKe~U`VY dkAe~L`[qU dlQez^qGa^ dkJe|\pRJ dlQez^qP`T diNfb^HpT dg]feJHsA dkAe{RFpQ djSekWa^qC dlQejTbWvJ doHedJ`Vz^ do^dyL@vW do^drUqNyP dnPdiE{UkH db[dtM`^jJ dcYd~WqDhW dbUegNrHgM d`Men[[aZ d`BepUWcN c[etCrLfF c}OezIqYaE c{Ve{NsQ_ cxEez_RqB cxCey]RvK cxAesRb@D czNenNa_wM c|MegAaExX c}Rd~IeIy\ dnPdiEvIjO dhGdsT@fX dhGdzLXj^ dg_eeJr@T de_eeFYfO deVekUTa@ dhGdsTgWp_ dg_eeJgIq@ djSekW~]oW dlQejTBoU doHedJ{IkK do^dyL}InB do^drU|ElB dhGdsTzUjU dhGdzL{ZlU de_eeF}^nL deRelU}MnJ c[etCaZr@ ddHelZrJbN da^eoHYb[ daUerC^aJ daGesMbJrO dcQep^NqI dc_eoUIr[ cEelNrJbO c|[en]@dF c|[esCbJrO cEepT@tF daGesMtLZ cEepTdLJ cEelNeCL c|[en]eCK czEepIIq[ czAesVDsM djSekWuA`^ dlQejTv[aA do^dyLwWa@ dcYd~WvG^ dbUegNvH] d`Men[u_] d`BepUu]\ c[etCuZ] c}OezIuL\ dg_eeJ}^nL deVekU}SnH djSekWpY`W diZelN{U`vG c~EfbUwWf[ cvNfiPdFzU czTe~[cHu_ c}\ex\rFbR c{Ve{NvJn[ cuLfjIpR`_ ctZfkHh]wV c}WfcR`_qK c~VfbGk]pvP diHekM|C`xZ c}EfdGxWgP ctNfkWe^ppS czLe{DbFrR c|RexRsIfF cyIe~XtPjU ctYfiMh@v[ c|YfbRkWpvN dhPelD`XpW c}WfcRpR`U ctZfkH\O cvNfiPqUS c~EfbUqLS diZelNqJZ djSekWqKZ cvNfiPqUS czTe~[qKS c}\ex\qJZ c{Ve{NqJZ cuLfjIaBpY c~EfbU`Q^ c}EfdG\qU avSee\qWqK at\edQrDvU arXd}\Wz_ arQdr]@vX arQdlEaGyI asXdb\{UkH ahCdnDqVjC afMdxGqEhX aeHe`_qVgN acRehMXa[ acJejH@cN acJemVbPfQ aeZetGa\aL agVeuScQA akGeuTRqB akEetRRvK akCenGq_T aiQehZa_wM akPeaMaDxX alTdxUtQzQ asXdb\cRkE awJdnA@fX awJdtYXj^ awBdWb@D ayBd[ZfP axXefKSa@ awJdnAtYq\ awBdWtJq[ avSee\~]oW at\edQBoV arXd}\{JkL arQdr]}InB arQdlE|DlB awJdnAzVjT awJdtY{ZlT ayBd[}_nL axUegK}NnI acJemVa[r@ agFefKrJbO ad\ehZIb\ aeEekVNaK aeSemAbJrN ag]ejS_qK agNeiHXr] alHefVrJbO ai^eiE@dF ai^emKbKrO alIej\QtF aeSemAdKJ alIej\tLY alHefVuB[ ai^eiEuB[ aiGejUJq[ aiDenCCsN avSee\bBaO at\edQc\aZ arQdr]dYa\ afMdxGfGN aeHe`_fHN acRehMe_M acJejHe]M acJemVeZM aeZetGeKK awBdW}^nL axXefK}SnG avSee\pY`X auZefTiO`wU aIe~Iv_f] axJfeF{E{X amEeyNsIvM ai\esArFbR agVeuS`pA`pN awWffAaFaB ax]fgCgSwY b`PeJpZqO aVe}[yCpw_ aw]eeXiC`zI ba@f`AwLgT ayTfgUppTprF ai@euObGrR akGer]cHfT anOeyQkPkY ay_feJfVv] b`Ue~MyPpw] awEefP`XpX b`PeJ`P`W ax]fgC`W`R axJfeFaUD aIe~IaLD auZefTaKT avSee\aJT axJfeFaUD amEeyNaJC ai\esAaKT agVeuSaJT awWffA`Sp[ aIe~IM^ ba@f`A[qT b|VcyG\`[ b|JczBrDdS bzFc~UvSiV bsSdhKzHlS biKdt^oJV bxUdtX`{MaG ctBdu_`yUbO dmWdxNkTbB dyKdzPh^|V ebIdmZeIyY egRddAa\tT eiNcMQp[ eiMc~RpqMq[ dx@c|WqLpW dvTc|@pYpT du[c{LpRsV duIcwVppOqP ddZcvFpqEpZ csUcuLqTcQ crAcx]q@`P cqAcyMqW`P coJcy]prTpV b|VcyDpsK`{W biKdt[oJp[ bxUdt@`{KaA ct@duA`yWbT dmWdwUkTbW dyKdzL`pBp{^ eiMc~NpqNqZ dw_c|TqKpX dvTc{\pYpS du[c{IpRsV duIcwSppOqQ ddZcvBpqEpZ csUcuHqTcQ crAcxYq@`P cqAcyIqW`P coJcyYprTpU b|VcyG@S biKdt^@S bxUdtX@pX ctBdu_Rp^ dmWdxN@pY dyKdzP@T eiMc~R@T dx@c|WQS dvTc|@@T du[c{L@S duIcwV@S ddZcvF@T csUcuL@T crAcx]@T cqAcyM@T coJcy]@T du[c{LpqPqT dvTc|@prLqW dx@c|WpsZq] eiNcMpr_qW egRddAprZpU ebIdmZpqDpQ dqEdmIpvG^ dtXdcLps]Y dvOc}VprUqG ddKcyXprJp[ ddHczIpsGp\ ddFczZpt\p] dcZc|Opr^qL d`[dcCps\rO cz^dl[pvGrT bsSdhK`qDa\ cl_d`TprYq_ cp\c{CptRqA cp\c{Cs]eQ dcZc|Or_fT dvOc}VqWeV cdWdjGhHyS d`[dcCu]iX dtXdcLsSi] cdWdjG|BjQ cz^dl[v\iD dqEdmIsNkE ddZcvF_cR ddKcyXS`Q ddHczIR`Q ddFczZ\aU cq^f`QQ@ cq]f`QR@ cq[f`QAQ cq\f`PBA cq^f`RQA cq]f`SRQ cq[f`RA@ cq\f`RB@ cq^f`Q@A cq]f`Q@B cq[f`Q@A cq\f`P@B cq^f`Q@F cq^f`WwDaL cjZfbCz]O b]fbRpvTpZ biIfaXpuRrH asWePyAq[ ajVe}UtLrF afJe{OtVc_ aaTeNtYdA `|[fcOpZ`V `|AfdEeP`W aaQfd\iYaJ akJffF`u_aZ baIfh@`vHaH bwQfiHjDC caUfiKf@B cgUfiM`YpV chNfhWdZtA cmHfdVdVs_ cjZfbCsJbY b]fbRrKbB biIfaXq[aV asWePrLbB ajVe}UsJbY agLf`NtYd@ aqKfaRtZd@ bgNfcNtZc\ b}RfdTtZd@ cgPfd\tZd@ cbVfh\qAO bxXfhTqG`T bbTfgJqK`V alQfeRqG`T abSfdNqBN cgUfiMTvC caUfiK@vJ bwQfiH@vW baIfh@CpqE akJffF@vW aaQfd\@vI cq^f`QwD`] cjZfaNz]H b]faVpvTqA biIf`UpuRrB asWe~SyAqS ajVe}@tLqX `{]e~BHW afJe{HzEhR cgYfiBjExQ cgXfcCAe_ cgQfcJGW caUfcAe\I bwQfbQjD`P bwJfbPGA bwJexK@jE baLev[`u^aP akQeuJ`u[aQ akQeO@zE akJeOG@ aaQe~SiY`\ `{]e~BeT`Q cjZfbC@pU b]fbR@p\ biIfaX@qC asWeP@p] ajVe}U@pU afJe{O@W `|AfdETvC `|EfcZ@u_ `|Ee}[o]aD alBe~_@zF alBetYakYcA bw[ewZ@jF bw[fb@o]aC cgYfiBrkTuH cmHfdVuXF cgPfd\y^X b}RfdTpvDqF bgNfcNpvCq\ aqKfaRy_qD agLf`NuXq@ chNfhWuXE cbVfh\y^X bxXfhTpvDqJ bbTfgJpvCqX alQfeRy^qD abSfdNuXp_ bwJfbP`QpP bwJexK`QpQ akQeuJ`QpQ akQeO`QpP5#H abIdtM@@ abIdtM@Q abIdtL@Q abIdtK@B abIdtM@@ abIdtM@Q abIdtL@Q abIdtK@B abIdtM@@ abIdtM@@ abIdtL@@ abIdtK@@ abUd~QB@ acVd|Op_bB acTd|Op_bB acTd|OB@ adOdyPpYb_ adMdyPpYb_ adMdyPB@ ae@duZpQcV ad^duZpQcV ad^duZB@ aeGdrAWcY aeEdrAWcY aeEdrAB@ aeCdnRDcO aeAdnRDcO aeAdnRB@ adTdkVOb\ adRdkUOb] adRdkUBA ac\di_`XaW ac[di_`WaV ac[di_A@ ab_diO`]`P ab]diO`^`P ab]diOB@ aa_djIa@pZ aa]djIa@pZ aa]djIB@ aa@dlK`_rB a`_dlK`^rB a`_dlKA@ a`GdoJ`Yr_ a`EdoJ`Zr_ a`EdoJB@ `VdsA`QsW `TdsA`QsW `TdsAB@ `OdvYGsX `MdvYGsX `MdvYB@ `SdzHTsO `RdzHUsO `RdzHA@ a`Bd}E_r] a`@d}E^r] a`@d}EB@ a`Zd~[pXqV a`Xd~[pXqV a`Xd~[B@ aaWdLp]pQ aaUdKp]pP aaUdKBA abWd~Qq@`[ abUd~Qq@`Z c|GdzTA@ c|HdzT@Q c|HdzSQ@ c|GdzS@A c|GdzTA@ c|HdzT@Q c|HdzSQ@ c|GdzS@A c|GdzT@@ c|HdzT@@ c|HdzS@@ c|GdzS@@ c{PeePQ@ cyXeeFaWJ cyZeeGaVI cyZeeGRQ cxJecVaNaP cxLecVaNaQ cxLecVR@ cwLe`_`^bW cwNe`_`^bW cwNe`_R@ cw@d}SLcL cwAd}SMcL cwAd}SQ@ cwHdy[XcX cwIdy[XcX cwIdy[Q@ cxBdvDpZcW cxCdvDpZcW cxCdvDQ@ cyMdsAqKcC cyNdsAqKcC cyNdsAQ@ c{AdpZqTbG c{CdpZqUbG c{CdpZR@ c|\doYq[aA c|]doYqZaA c|]doYQ@ c~RdpCqVZ c~SdpCqVZ c~SdpCQ@ d`@dqSqNqP d`BdqSqOqP d`BdqSR@ d`^dtJp^rW da@dtJp^rW da@dtJR@ daJdwV\sL daLdwV\sL daLdwVR@ daBd{MHsW daDd{NHsX daDd{NRQ d`IdE`YsX d`JdE`ZsW d`JdEQ@ c~^ebHaKsC c~_ebHaKsC c~_ebHQ@ c}IedOaUrG c}KedOaTrG c}KedOR@ c{OeePaZqA c{PeePa[qA ef@csB@@ ef@csB@R ef@cs@@@ ef@cs@@B ee_csAQA ee^csB@R ee^cs@AQ ee_cr_@B ef@csBQQ ef@csBR@ ef@cs@R@ ef@cs@QQ ef[dcP{WpZ ef[dcPqTaR eeGdeB{XpZ dyOddHaUqR eeGdeBqRpS ecUddO{VpZ dw_dcUaP`S ecUddOqGrW ebNdaX{WpY dvWd`_aHbV ebNdaXp[tO eaSc}I{WpZ du\c|O`[dP eaSc}IYuV eaJcwS{Vp[ duTcvXHeW eaJcwSIvI eaScqJ{WpZ du\cpPXfH eaScqJ`ZvA ebMckI{VpZ dvWcjOp[fA ebMckIaHuD ecUcfE{VpZ dw_ceKqHeD ecUcfEaRsR eeGcbS{WpZ dyPcaYqQcR eeGcbSaTqS ef[ca@{WpY d{Dc`GqTaR ef[ca@aQ`T ehLcaT{WpZ d|Uc`ZqQpS ehLcaTaHbV eiTcdJ{WpZ d}]ccPqHrV eiTcdJ`YdO ejMchY{VpY d~Wch@pZtP ejMchYJeW ejWcnP{WpZ d@cmVYuV ejWcnPZfI ejMctY{VpZ d~Wcs_IvI ejMctYpYfB eiTcz[{Wp[ d}]cz@`ZvA eiTcz[qHeC ehLc^{WpZ d|UcDaHuD ehLc^qQcR d{DdbVaQsR ef[csBQ@ efZcsB@Q efZcsAAQ ef[cs@@B ef[csBQ@ efZcsB@Q efZcsAAQ ef[cs@@B ef[csB@@ efZcsB@@ efZcsA@@ ef[cs@@@ egGc}FB@ ehGc{Dp^bB ehEc{Dp^bB ehEc{DB@ eiAcxEpZb_ eh_cxEpZb_ eh_cxEB@ eiQctOpPcV eiPctOpQcV eiPctOA@ eiXcpVWcY eiWcpVWcY eiWcpVA@ eiTcmGDcO eiRcmGEcO eiRcmGB@ eiFcjKNb\ eiDcjJNb] eiDcjJBA ehNchT`XaW ehLchT`XaV ehLchTB@ egPchD`^`P egOchD`]`P egOchDA@ efPch^a@pZ efOch^a@pZ efOch^A@ eeRck@`^rB eePck@`_rB eePck@B@ edXcn@`Zs@ edWcm_`Yr_ edWcm_AA edHcqV`PsV edFcqU`QsV edFcqUBA edAcuNGsX ec_cuNGsY ec_cuNB@ edEcx^TsP edCcx^TsP edCcx^B@ edSc{Z^r\ edRc{Z_r\ edRc{ZA@ eeKc}PpXqV eeJc}PpXqV eeJc}PA@ efIc~Ap^pQ efGc~Ap]pQ efGc~AB@ egIc}Fq@`[ egGc}Fq@`[ bvLcmQQ@ bvKcmQ@R bvKcmOA@ bvLcmO@B bvJcmQ@@ bvJcmQ@R bvJcmO@@ bvJcmO@B bvLcmQR@ bvKcmQQ@ bvKcmOQ@ bvLcmOR@ bwFc}_{WpZ bwFc}_qTaS buRcR{Wp[ bi[c~WaTqR buRcRqQpT btAc~^{WpZ bhJc~DaQ`S btAc~^qHrV brYc|H{WpZ bgBc{NaHbV brYc|HpZtP bq_cwX{WpZ bfHcv^`ZdP bq_cwXYuV bqVcrB{WpZ be_cqHIeV bqVcrBIvI bq_ckY{WpZ bfHcj_YfI bq_ckY`ZvA brYceX{WpZ bgBcd^pZfA brYceXaHuD btAc`T{WpZ bhJbZqHeD btAc`TaQsR buRb}B{WpZ bi[b|HqQcR buRb}BaTqR bwFb{P{WpZ bkObzVqTaR bwFb{PaQ`S bxWb|C{WpZ bm@b{IqQpS bxWb|CaHbV by_b~Y{WpZ bnHb}_qHrV by_b~Y`ZdP bzYccI{WpZ boBcbOpZtP bzYccIIeW b{Bci@{WpZ boKchFYuW b{Bci@YfH bzYcoH{WpZ boBcnNIvH bzYcoHpZfB by_cuJ{WpZ bnHctP`ZvB by_cuJqHeC bxWczM{WpZ bm@cySaHuC bxWczMqQcR bkOc}EaQsR bjKclW@@ bjKclW@R bjKclU@@ bjKclU@B bjKclW@@ bjKclW@R bjKclU@@ bjKclU@B bjKclW@@ bjKclW@@ bjKclU@@ bjKclU@@ bjXcvZA@ bkXctYp_bA bkVctYp^bA bkVctYB@ blQcqYpYc@ blOcqYpYc@ blOcqYB@ bmBcnCpQcV bm@cnCpQcV bm@cnCB@ bmIcjKWcX bmGcjJWcY bmGcjJBA bmEcf[DcP bmCcf[DcO bmCcf[B@ blVcc_Ob\ blTcc_Ob\ blTcc_B@ bk^cbI`XaV bk\cbH`XaW bk\cbHBA bkAcaX`]`Q bj_caX`]`P bj_caXB@ bjAcbSa@p[ bi_cbSa@p[ bi_cbSB@ biBcdU`_rB biAcdU`^rB biAcdUA@ bhIcgT`Yr_ bhGcgT`Zr_ bhGcgTB@ bgXckJ`QsV bgVckJ`QsV bgVckJB@ bgQcoCGsY bgOcoCGsY bgOcoCB@ bgVcrRUsO bgTcrRUsO bgTcrRB@ bhDcuN^r\ bhBcuN^r\ bhBcuNB@ bh\cwEpXqW bhZcwEpXqW bhZcwEB@ biYcwUp]pP biWcwUp]pP biWcwUB@ bjYcvZq@`[ bjXcvZqA`[ c|HdzT@A c|HdzU@R c|HdzS@@ c|HdzS@A c|GdzTQA c|FdzU@R c|FdzSAQ c|GdzR@B c|HdzTQ@ c|HdzUR@ c|HdzSR@ c|HdzSQQ c}BekC{WpZ c}BekCqTaR c{NelU{WpZ coWek[aTqR c{NelUqQpS cy]elB{WpZ cnFekHaQ`S cy]elBqHrW cxUeiK{WpZ cl^ehQaHbW cxUeiKpZtO cw[ed\{WpZ clDedB`ZdO cw[ed\YuW cwRdE{WpZ ck[d~KIeW cwRdEIvH cw[dx]{WpZ clDdxCYfH cw[dx]`ZvB cxUdr[{WpZ cl^drApZfB cxUdr[aHuD cy]dmW{WpY cnFdl^qHeC cy]dmWaQsQ c{NdjF{WpZ coWdiLqQcR c{NdjFaTqS c}BdhS{VpZ cqLdgYqUaS c}BdhSaQ`T c~SdiG{WpZ cr\dhMqPpT c~SdiGaHbV c[dk]{WpZ ctDdkCqHrV c[dk]`ZdO d`UdpL{VpZ ct_doRp[tO d`UdpLIeW d`^dvC{WpZ cuGduIXuW d`^dvCYfH d`Ud|K{VpZ ct_d{QHvH d`Ud|KpZfB c[ebM{WpZ ctDeaS`[vB c[ebMqHeD c~SegQ{WpZ cr\efWaHuD c~SegQqQcR cqKejIaQsR anRduH@@ anRduH@R anRduF@@ anRduF@B anPduH@@ anPduH@R anPduF@@ anPduF@B anRduHR@ anRduHR@ anRduFR@ anRduFR@ aoLeeV{WpZ aoLeeVqTaR amXegH{WpY abAefOaTqS amXegHqQpS alGefU{WpZ a`Pee[aQ`T alGefUqHrV aj_ec_{WpZ `HecEaHbV aj_ec_pZtP ajEdO{WpZ `~Nd~U`ZdP ajEdOYuV ai\dyY{WpZ `~Edx_IeV ai\dyYIvI ajEdsP{WpZ `~NdrVYfI ajEdsP`ZvA aj_dmO{WpZ `HdlUpZfA aj_dmOaHuD alGdhK{WpZ a`PdgQqHeD alGdhKaQsR amXddY{WpZ abAdc_qQcR amXddYaTqR aoLdcG{VpZ acVdbMqUaR aoLdcGaQ`S ap]dcZ{WpZ aeFdc@qPpS ap]dcZaHbW arEdfQ{WpZ afNdeWqHrW arEdfQ`ZdO ar_dk@{VpZ agIdjFp[tO ar_dk@IeW asHdpW{WpZ agQdo]XuW asHdpWYfH ar_dv_{VpZ agIdvEHvH ar_dv_pZfB arEd}A{WpZ afNd|G`[vB arEd}AqHeC ap]ebD{WpZ aeFeaJaHuC ap]ebDqQcR acUed\aQsR5#A chYewFqIbZ cgPez@qJa^ cfFe{^r_c^ ccGe\{[kO bwLfkKr_aX btMfmCqSW brZfl\`vZ`P ciTfmL`]`S cjQfm_b_qY cmPflFkZ{N cyJf`XbVsN c|@e}JaFqZ c}Fe{PaFrV c~LexZgLaJ deXezDqFbD ddRe|HqBaO dcPe}Wr@bP daPf`G}BkP ctNfkWqWaE crWfl\qDY a}NfjJ`\`S a~Jfj]b^qY baHfiDk\{N bmDe}VbUsO boYezGaFqY bp_exNaFrW brEeuWyMF bhXeu]p_bE bgYexBp_aN bfZeyPq\bQ bd^e|A{JkT ayTfgUqTaE ax@fhZq@Y aw@fhQfNaY ax@fhZfJbC ayTfgUgTaO bd^e|AhFaU bfZeyPh_`W bgYexBiFL brEeuW`vTaO bp_exN`vQaR boYezG`vMaW bmDe}V`vCbF baHfiD`vDbG a~Jfj]`vCbF a}NfjJ`uLbR btMfmC`vD`\ bwLfkK`vD`[ ccGe\`vC`\ cfFe{^`uZaL cgPez@`uVaP chYewF`uSaT c}Fe{PgL`X c|@e}JgPM cyJf`XhFpQ cmPflFf^_ cjQfm_hFqC ciTfmLg_pY deXezDptE`rO bhXeu]pqX`rT5#N cbTdsH}Zp^ btZdrJEU bt_drEmZ`_ cbYdsDUD cbTdsZ}Zp_ btZdr[ET bt_drWmZ`^ cbYdsUUE cbTdsH@`R btZdrJ@`Q bt_drE@`R cbYdsD@`Q5#B ef_c~Fr_^ ed@c}XJ`[ edJc~Sb^N egHcAYp[ ed@c}XxYw\ d{Gcu\nEbC eiLcw_rMfG egHcAbTuP ei\cyQpPqR edJc~SxRwE d{XcwNnDbC d{Gcu\`QaR emZdsN^qJ emLdrDuWcW egUdu[MaF ehBdwAeXsS ehBdwAqPrF efRdt[^qK efDdsPaQbK emLdrDpQwZ el[djJ`SaW emNdlALgM efDdsPpZwW eeJdkYgQqO efRdt[pUwK ee]dmPpSqW ee]dmPgQqO eeJdkYqOppG ec[c{RcEpS eg@cz_e[oK ee]dmPqYpqB edDc|NYp\ edDc|NcFpT egJc{ZfD`pG egJc{ZZp[ el\ei_iSsT evOefKpWrD euXedGyTcS elDegZ`XbE evOefKsKwK esDd@yDcM ej@ebMb\gR euXedGsJwG erNd}@`Vb@ elDegZrYwL eiKe`NiCsN ej@ebMpUq_ esDd@uO|F emUdrZvZW ef[drSSbZ efXduMcHm@ erNd}@uG{O emGdqQNaI eiKe`NsB|J efIdtDErV efNdqNfYC efXduM_qI ef[drS]qE ezYczVr^U ew[czQ`[pU exVcy\b^F e{TczBp[`T ew[czQy\vZ em_csWm^`Z e{]ctQqDfE e{TczBa[vV e}OcsLqRaE exVcy\yFwJ eoPcrRm_`Z em_csWaQqE exPdp[aIp_ eyYdo\vPaD esIdq@qE`\ erDdq\fLqA erDdq\pTrV eqPdoFaIq@ erYdnF`PbZ eyYdo\bNwN e|GdhNqVaI ezQdiWrAgD erYdnFbDwO et]dfWgJaW eqPdoFaWwG esGdg_aVqH esGdg_gJaX et]dfWc]\ exZcv[cB`W e{\cwRK`p\ esGdg_dXppP ew_cwO`[pT ew_cwOcB`X e{AcxGpP`qP e{AcxG`[pU em]ebMiXbJ ewUedWrCaT euRefKyXrJ ekZedAbCqT ewUedW`_xD exTd|SyHrF eoLdzMqOh@ euRefKaDxI evVd~Ba^qO ekZedAaTxE emNd{\iHbF eoLdzMq^aO exTd|SaE|W eyYdo\uSs\ etFdl@qMbF erYdnFsMlG evVd~BaZ}G exPdp[aIp_ emNd{\dB|V eqPdoFaPrJ es@dl\ePc_ erYdnFqIa@ etFdl@qF`\ eeSffHcDaV ejGfiMqPqO eiIfiSsDqV ejGfiMp^F ejGfiMqRa_ ehUfkLqYqX ef\fiTa[qV eeSffHsX`U ea[ff]eAbW ea[ff]aKqW ecFfeFbMaB ecFfeFpUC ebQfeIq\aZ e`UfgCaFV ehUfkLqDG egQfkSaXr@ egQfkSuArV ebPfh]cUq@ efEfg]rSqS ecRffJqBbS ebPfh]q[qZ ebQfeIaAaA ehUfkLq@dH egUfoTq_q_ eeVfmUaFtA eeVfmUv@sF dVfjObEsR dVfjOqEH d~QfjWaCrG dTfhP`TpV e`HfgZMpW dTfhPp^Y d~VfhGaR] egUfoTqHG efMfo[aDtH efMfo[v@sG e`MflTbCsW e`MflTq\q] d~QfjWaHqX dYfh_OqE d~VfhGaC`X egUfoTuWbJ ea^fq^NrM ebLfoQcJq\ ebLfoQsHsR dDfk_`RqP ea^fq^tItG d}UfmWaOqX d~QfjWp\c@ efMfo[sNaN eb_fqIqA`U dYfm^cFcK dYfm^`TqJ d}UfmWbDG d~VfhGUbP ef[fdDqHbD eeSffHpWJ ed\ffRaHrE efDfdM`WY eeSffHcDaV ehWfg^aHrE ei_feYsDqU ei_feYa]aW ek\fgPqMaP ejOfi@pPsG ejOfi@XM ejGfiMqPqO egMfeYqHbD efEfg]qIqK efDfdMaIaL egMfeYcDaV ejQfgOqHbD eiIfiSsDqV ejQfgOaKA ejOfi@BqQ ejGfiMp^F e`NefZrZbK d}TeiEMO d~AeiTbZrL e`[egH]^ d}TeiEsIsB dzKefCsIt[ dwBeaHbZrL dy\d~\dEdD d~Aec@bMcZ d~AeiTsLsF dzUefNsMt_ dwHeaObZrL dzBdCdIdH d~KecKbPc] d~KecKZ[ dzBdCVW dzUefNZ[ dwHeaOVW ehFesWpSaE egSet\[\ egHetPGqR egOer^`W`Y egSet\r^`] edUeuYcQrB egHetPsK`Q ec]euA`X`X egOer^sRbC ehFesWwR}J e`TefMsQbB d}CehOgRmJ ec]euAwG|_ d|VehBMM egOer^wG|^ e`Hef@sRbB e`Hef@LM eh_fdUXpW ehWfc^aRaR ejIfePE`Q ejNffAqOqL ejNffAc_qP enMfdQFq_ enSfbRuTbC enSfbRWpX enLfaZTbF enHfd@E`Q ejIfePbIA elRfeQrD`P elRfeQa[q@ enHfd@qVaQ ehWfc^UpR ehRfcLaWbD ehRfcLd@bE elRfeQaStH enEfaIuSbC enHfd@SrW enEfaIG`Q eh_fdUtUA edJeuT\qC ec^etQdTn[ edJeuTc[qN ehEetFfNnL ehEetF[qC egZesCfKnF ec^etQc\qN ec^etQbTqW efRerZG`R efYesLrObH ehEetFqLpZ efRerZaHI enLfcZqRaU elZfeOrIE ejQfeTqVqO eh[fdETrG ehWfa^eUa\ ehWfa^rEs@ efRe~^aWgL ehIffJNtL eh[fdEpRbE ejQfeTrH`V ehIffJcLaD ekUfgNqDqZ elZfeOqEa_ enLfcZrWcT ekUfgNaPY emEfgEaGsK enLfcZaKq\ eoWfa^rReG ehIffJqKqG ef^feC\vE emEfgEvGrB eoWfa^yEs@ dwCejQrSbR dtPemCaAaK duQenNbSrR dxDek\qAqK dtPemCr[qN dqUekUrZrY dn[eh\bSrR dqNefJcSb@ duAehJbBbG duQenNsBqW drOelWsDsF doKeiQbSrQ dq^eg@c]bL du[eiLbIbP du[eiLpZqB dq^eg@pPpV drOelWpZqB doKeiQpPpU d@epJIaX dIerB`]aF e`FesH`TpS e`ZerUqZrK dIerBsFaD d|CesFb]r\ e`FesHrIbJ d}]euRqZrL e`ZerUr]b] d@epJxLvM dvTei]r]b\ dsWelYhLfM d}]euRyGwQ dtVenAp_qH e`ZerUyGwP dwSekEr]b\ dwSekEp_qH egNeBH`W egVeYbC`Y eiYf`RVpP eiSf`BrEq@ eiSf`Bc@r_ elSe}Cp^rH ekUez[tGdG ekUez[H`X ek]e{S`\b@ elYe}SVpP eiYf`RbCp] ek\eUrIM ek\eU`WrR elYe}Sp]bB egVeYF`R eg\f`Ka]G eg\f`Kd@pV ek\eUGsP elCe|EtGdF elYe}SpVqN elCe|EVpR egNeBzT{H d|ZesZLaC d}Fet]jVkN d|ZesZb]r\ dWep^k^i] dWep^LaC e`CerAl@jD d}Fet]b]r\ d}Fet]aLsC d~ReqZVpR d~LeqHqRbR dWep^qKJ d~ReqZaQG elTe~TqRaU ekBf`IrIE ehYf`NqVqO egCe~_SrF eg@e|YeTa[ eg@e|Y^bE efRe~^aEeV egWfdTpWw[ egCe~_`TeU ehYf`NqBdF egWfdTcLaC ekCfeWrJuI ekBf`IAeN elTe~TqQgC ekCfeWbBaN emEfgEpQxQ elTe~TcCcJ eoWfa^rReG egWfdTpYO ef^feC\vE emEfgEvGrB eoWfa^yEs@ ejLesNqKaO eiAet]bZb\ ek[ewYgJbM esEezFIq[ esNexKqXrP eqVeu[wJrM eiAet]rVg@ efKe{]aOqT egZezIbRv[ egZezIgIbM eoCe|VbSv[ eoCe|Va\bW ep_eMbOwB ek[ewYrNgG eiMe@sBsC esEezFrOgG epVfaMwIrM ep_eMYb@ egZezIHb\ ehBe}EqSaX efOe~]Ts@ eoCe|VqLbK emWeAuUq\ ep_eMqHbR eoWfa_r@r^ eiMe@LcH eiYfbHsJsK epVfaMqIbV eoMfdCuTq[ eoWfa_ZbD ek_ekBaOqR emNeiPhNbY eu\elIa\bV ewXen_Za_ ewNep^xNrZ eo@enDsAsB emNeiPpYdE elUemUqGaJ ekNen_`Qs] eu\elIq\cY et@epBwKrM ewXen_rFcK euRerJqRrH ekNen_bQbR em_eqQaAsM em_eqQgKbN euJes_bDsA euJes_HqU ekNen_rSe] eh[et\aMqQ ejHesKbMuV ejHesKgRbO eqZeuZbFuX eqZeuZaYbS esSexMa_vC em_eqQrGfI ekXewZr]r^ ekXewZgRbP esJezJb@vK esJezJIq] exCel\q]rI evFejSy@F emFejYqSbL ekSemEcEbH enXeoMi@V ewXeoGKrK exCel\`Qw^ exTed^r@rM evTebQ^hB evTebQyUcH el_eeYiGdZ el_eeYGe@ el_eeYqWbQ ekHehJKd[ ewXeoG`Pw\ exHegKLrM exHegKyTcK enTejViDdQ enXeoMTtW enTejVsLrL exTed^rCuR evQdLqZq_ etWd}Ma]eD etWd}MvHbC enOdPhEcA el_eeYaPvI enOdPqZcF elUebVqMeT exHegKq_uJ evIebAHrU evIebAvGbF epBedGhFcD enTejVaNvO elUebVcMaQ evIebAqRtT enOdPaSdW5#C aoDcsZrO] alUcsMq]`W ajXctDbOM amGctQa]pW alUcsMw]wX adXckUkZa\ apRcmQqNfI amGctQTuV amCcn[cOqJ ajXctDyNwF aaJcl^kYa] adXckUsNaI arFdjDb\qC auBdiAtYb\ apIdk]rS`_ amVdl\dPrX amVdl\qNrO alHdjMb]qC aoEdiJaDbS auBdiAQw[ auAdaFsYaM aqHdbS`^gQ aoEdiJZwZ an[daPfFZ alHdjMqFwP akBdb]cYqM akBdb]fFZ an[daPrQppR alJcp^bST an]cpZfD`pL akBdb]pVpqI ajLcqTa^pV ajLcqTbTT am@cqPdH`qC am@cqPa]pV aDdvRaSyN b`WdmDdXqX beOdkLqSiN bc\dtZtXaX b`WdmDv[rI ay\dj[qQh^ axKdsYfYbY beOdkLwGrE a~HdiGtLaT bc\dtZwErT a|WdrFaQx_ axKdsYdLqS ay\dj[zCs_ aoYdf\r]d\ al\dkXaXa] anTdmUiWfD a~HdiG{RsM arVdeZr]aB a|WdrF{FuS aqQdlSrBqZ aoOdjYcGt_ anTdmUb]qB al\dkXbSp_ ajFctZrOpP agWctJa]pV aiTcsTbO`P alCctDq]`V agWctJxRwX `EclRkZbL aj_cn^pYe\ alCctDbJvO anMcmUsNaI aiTcsTwAxK abSckIkZbL `EclRcNqI awPdeAb\qB azLdc_rTeP awXdiOrS`_ auEdjNbKuM auEdjNrGqR ar^dh\b\qB auZdgZa^aU azLdc_sFwD awFc|[sYaM asMc~HdCfY auZdgZsLv_ arNd`[dXt@ ar^dh\tIvT anUdbHcYqM anUdbHdXt@ arNd`[yL~U aiBcrFb@qV akBcpPlDlK anUdbHwPK agEcr]a]pW agEcr]b@qV aiEcqGjHmA aiEcqGa]pW biHdrQbAyH bkIdiItXaX bfQdkArAiH bdPdtIdXqX bkIdiIvYrV bdPdfSq^hX bbRdoKfVcF bfQdkAvLr[ b`EdhFdKqS bdPdtIvIsJ a~Gdp_a^xY bbRdoKtKaT bdPdfS{UtA ax[dbRsPdX auKdgJbAa] awLdiGkFfD b`EdhFzGtQ au^dcUb]qC a~Gdp_yWvV atPdjIqXr@ arXdhIcFtT awLdiGr\aB auKdgJrS`_ a~^elZbYaX b`^eo^`YqL a~Aeo^rYqX b`^eo^r]@ b`^eo^q@a_ a^eq]`]qT b`[epI`\qW a~^elZrR`U a|LemOdObZ a|LemOXqZ a|DekUbZaE a|DekUr@Q azDekTqHaZ ax\emNcPA a^eq]sO@ a|Oeq]aRq_ a|Oeq]tOrZ ax@eoCcHp] a{HenFqSqT ayUelRqUbQ ax@eoC`\qU azDekT_`^ a^eq]WdI aWevF`_qZ b`VetLEtC b`VetLuJsL a{Leq@a@sQ a{Leq@sYB awSeqBaGrF axZen\WpW axSenEIpW axZen\qM\ awMenPaF[ aWevFs\@ a{[evF`TtI a{[evFuJsL avQerZaOsW avQerZaBqX awSeqBFqZ awYeoH`ZqC awMenPL`X aWevFtLbG a{KexMbLrH a}WevEb_qY a}WevEr[sT az\erQ`PqQ a{KexMtAtK awJetBcRqQ awSeqBYc@ a{[evFrAaN ayZewTaQ`Y avPetEcJcO avPetEAqK awJetBpZC awMenPFbR b`Aej[qBa\ a~_elWrTQ a|KelVaBq\ a}MejZbTA a~_elWbRbH baQen_aBq\ bbSemCrRrH bbSemCpQa[ bbBen^qEaH b`]epFaVsC b`]epFWL b`VepR`[qS a|KelGqBa\ a{IenCaBqM a}MejZqBaM a|KelGbRbH a~]enOqBa\ a}[epKrRrH a~]enOcEO b`]epFr@qW b`VepRr[W amSdsGqPa_ alCduFpXaT akKdvZaOq_ alZdt[`YqT alCduFtOqW agTdsOuJr] abJdpRaOq_ acYdnSeYbI aiRdp\dAbK akKdvZtIrB agBdtXuDsL aa^dqLaPq_ acNdoMeQbX ah_drEc[bV ah_drE`SqI acNdoMKpZ agBdtX`RqI aa^dqLLpZ ay@d|P`YK ayYd|[`UqO azNd{LTqY azJdySqJb] ayYd|[rNa\ awKd~WaUrG azNd{LqYO axUd{[qJb\ azJdySqUbH ay@d|P}BxM ak^dtCqUbG ajIdvJmBhM axUd{[}UwB ak@dtYpWaQ azJdyS}UwA alUdrRqUbG alUdrRpWaQ a|YekRrRX azGekJ`VaH az]elRaZF a|WelXBqF a|WelXaWrI a~NejO`XrE aFehJrMcH aFehJrRX a|TehB@bG a|TejIaZF az]elRa@] a{]elE`Z`S a{]elEbQqV a|TejIpWa\ azGekJq]W axJekCbSaO axJekCcSaB a{]elEqFtI azWeg\rMcG a|TejIq]rM azWeg\a]F a|YekRr\~C ay]d}OsZ] avCd}BbGnA ay]d}OaUrG a{Rd{HcTmB a{Rd{HsZ] awXdz[b_mA avCd}BaUrG avCd}Bb@rM axCdzUa_F azBdz[UbT a{Rd{HqP] axCdzU[F a}WekDqIaL a|NelPq\Y azRelGqLqY ayFejNRrG ayDehGdSb] ayDehGdVrZ a}ZeeMpYgO a}Ael\s]tU ayFejNc[bN azRelGbO`U a}Ael\bXaX aYenTuGrM a|NelPcKbD a}WekDbBcP aYenTcKG bcDen[uMsW a}WekDgRp_ beIejErEdV a}Ael\a@qH a~AekTWvG bcDen[uCsG beIejEwOtX aq^dvNbCpY atAduUHbK atIdx@rD`Y arEdxYWrK atAduUsOH apRdu]uJ`S akHdvPrC`Y aiEdwIdU[ amZdv^dDpP atIdx@sQY apXdwWuLR akLdwUrC`Y aiIdxNdWJ an@dxXdEA an@dxXVqZ aiIdxNTqE apXdwWVqZ akLdwUTqE a}LdvAaP`Z a~\dv[GbD aCdx_qIaF a}ZdzE^tD a~\dv[`\qW aXduDrL`] aCdx_aBJ b`EdyI]tE a}ZdzEbKp\ a}LdvA|Q`P ap[dvQbLp] asGduTlQpP b`EdyI|WqN asNdw[WrG a}ZdzE|WqN aqCdxWbKp\ aqCdxWXrF bjOecMqZaK bhUedX`Qa_ biFefWaJp^ bjPeeYQrL bjPeeYrN`] bhBefVqAr@ bgAedVcNqI bgAedVqZaK beGefAaQaS bfXegTaJp^ biFefWpYaG bhMeg^bCrE bhMeg^[qH bfXegTaUJ bhUedXqLaA bgIeeYa]`^ bgIeeYaDbE bhMeg^tRp\ bc[egBcNqI bfXegTr]pR bc[egBaLqA bjOecMyE}G baJdvFrWbA a~SdxGhVmR baJdvFrK`] a~_dwChBmS a~_dwCrXb@ a|GdyCgTm_ a~SdxGrL`\ a~SdxGqTpV a|_dwQaMqA a~LdvPb^Z a~_dwCpSpS a|_dwQpXaR biGef[qIaL bg^ehGq]Y bfAeg^qKqY bdVefERrG bdTec^dSb] bdTec^vZaO a}ZeeMb_fC b`YekPc[wR bdVefEs]eK bfAeg^uHcR b`YekPbYaX bcRemHbOuJ bg^ehGtLeA biGef[uUfM bcRemH^aS bcDen[fCx@ biGef[s^cJ beIejErEdV b`YekPrXD a~AekTWvG bcDen[uCsG beIejEwOtX bfPd{FvQ`W a_d{]sDb\ a|[d~Yf@cY bb[ebReTqI bhOeaId@rJ blOd~_u_sY a_d{]rJfN a}UebKgCpY bdXeaRaXvL bdXeaRe_cY bjWeeKaXvL bjWeeKtKbP bfLeg[bCvR a|[d~YrRfV azIeeOcLsD bb[ebRrSfV b`HeiHu_sY bfLeg[vDaM bdXeaR`Tb_ beLedQwT`[ a}XeeLSsA bjWeeKpXbC bi_egNtSr] bfLeg[qBbJ beJejEdUrW azIeeOUcH azDehWcTsK b`HeiHqQbM a~WekUtSr^ beJejEvSaP bbKdrTgApY biLdq[f^dH bpJdvCtIbO blAdxRvAaK bf@dy]v_tG aAduVcJsB biLdq[qSc^ bgYduYu[`U ba^dvNMsZ bpJdvCrPcL bmZdyOvAsV blAdxRqYb_ bjHd{QcRrB ba^dvNrYbR aEdy@TsJ aEdy@fAcV beFd|V`ZrY beFd|VeBqE ba^dvNrEeN aYd{\fYpX bfRd{DaGuK bfRd{DfFcY blXd~]aBuN blXd~]tDbL bhTeaIaTuX aEdy@rQeZ a|Td~ZcEr^ a|Td~ZfFcY bbZebSbLu] bbZebSeZqJ blKdvQdGrC bpRdtNwMqK biEdsCwDaR bbAdtUsFbH a~[dv]gMaK bfHdxHfCqW blKdvQNw\ blYdnUdLrE bqEdlPpSg^ bqEdlPwZaS biKdnCgGfK biKdnCVe@ biKdnCwRaU baYdoXHd] bfHdxHFwY bfNdpOfKqZ bfNdpOxAaU a~MdrDg[fD a~[dv]^tY a~MdrDcLrL blYdnUqWu] bkBdhXdJqX boLdg@aYeP boLdg@uBaB bjJdhBf[dN biKdnC`_vA bjJdhBwLbJ bb^djLqEeL bfNdpOqMuT beAdj[fArC beAdj[uFaC a[dk^fSdQ a~MdrDaNvF bb^djLsCaR beAdj[jKs[ bjJdhBzOc\0$0! \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/cgm/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/cgm/read.t new file mode 100644 index 0000000..bc6eeb7 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/cgm/read.t @@ -0,0 +1,20 @@ +#!/usr/bin/perl +# +# Test reading CGM files +# +# Written by Bob Friesenhahn +# +# Whenever a new test is added/removed, be sure to update the +# 1..n ouput. +# +BEGIN { $| = 1; $test=1; print "1..1\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/cgm' || die 'Cd failed'; + +testReadCompare('CGM:input.cgm', '../reference/cgm/read.miff', q//, 0.0 0.0); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/composite.t b/ImageMagick-6.9.12-44/PerlMagick/t/composite.t new file mode 100644 index 0000000..ee73b57 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/composite.t @@ -0,0 +1,167 @@ +#!/usr/bin/perl +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +BEGIN { $| = 1; $test=1; print "1..18\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't' || die 'Cd failed'; + +# +# Add +# +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Add'/, + 'reference/composite/Add.miff', 0.2, 1.03); +# +# Atop +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Atop'/, + 'reference/composite/Atop.miff', 0.1, 1.03); + +# +# Bumpmap +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//,q/, gravity=>'Center', compose=>'Bumpmap'/, + 'reference/composite/Bumpmap.miff', 0.1, 1.03); + +# +# Clear +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Clear'/, + 'reference/composite/Clear.miff', 0.3, 1.03); + +# +# Copy +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Copy'/, + 'reference/composite/Copy.miff', 0.1, 1.03); + +# +# CopyBlue +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'CopyBlue'/, + 'reference/composite/CopyBlue.miff', 0.1, 1.03); + +# +# CopyGreen +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'CopyGreen'/, + 'reference/composite/CopyGreen.miff', 0.1, 1.03); + +# +# CopyRed +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'CopyRed'/, + 'reference/composite/CopyRed.miff', 0.1, 1.03); + +# +# CopyOpacity +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'CopyOpacity'/, + 'reference/composite/CopyOpacity.miff', 0.1, 1.03); + +# +# Difference +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Difference'/, + 'reference/composite/Difference.miff', 0.1, 1.03); + +# +# In +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'In'/, + 'reference/composite/In.miff', 0.1, 1.03); + +# +# Minus +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Minus'/, + 'reference/composite/Minus.miff', 0.3, 1.03); + +# +# Multiply +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Multiply'/, + 'reference/composite/Multiply.miff', 0.1, 1.03); + +# +# Out +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Out'/, + 'reference/composite/Out.miff', 0.3, 1.03); + +# +# Over +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Over'/, + 'reference/composite/Over.miff', 0.1, 1.03); + +# +# Plus +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Plus'/, + 'reference/composite/Plus.miff', 0.1, 1.03); + +# +# Subtract +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Subtract'/, + 'reference/composite/Subtract.miff', 0.145, 1.03); + +# +# Xor +# +++$test; +testCompositeCompare('gradient:white-black',q/size=>"100x80"/, + 'input.miff', q//, q/, gravity=>'Center', compose=>'Xor'/, + 'reference/composite/Xor.miff', 0.3, 1.03); + +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/filter.t b/ImageMagick-6.9.12-44/PerlMagick/t/filter.t new file mode 100644 index 0000000..70f48a6 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/filter.t @@ -0,0 +1,207 @@ +#!/usr/bin/perl +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test image filters. +# +BEGIN { $| = 1; $test=1, print "1..58\n"; } +END {print "not ok 1\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't' || die 'Cd failed'; +use FileHandle; +autoflush STDOUT 1; +autoflush STDERR 1; + +$fuzz=int(0.05*(Image::Magick->new()->QuantumRange)); + +testFilterCompare('input.miff', q//, 'reference/filter/AdaptiveThreshold.miff', 'AdaptiveThreshold', q/'5x5+5%'/, 0.30, 1.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Annotate.miff', 'Annotate', q/text=>'Magick',geometry=>'+0+20',font=>'Generic.ttf',fill=>'gold',gravity=>'North',pointsize=>14/, 0.02, 1.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Blur.miff', 'Blur', q/'0.0x1.0'/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Border.miff', 'Border', q/geometry=>'6x6',color=>'gold'/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Channel.miff', 'Channel', q/channel=>'red'/, 0.05, 0.5); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Chop.miff', 'Chop', q/geometry=>'80x80+5+10'/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Charcoal.miff', 'Charcoal', q/'0x1'/, 0.2, 1.02); +++$test; + +testFilterCompare('input.miff', "fuzz=>$fuzz", 'reference/filter/ColorFloodfill.miff', 'ColorFloodfill', q/geometry=>"+25+45"/, 0.03, 1.02); +++$test; + +testFilterCompare('input.miff', "fuzz=>$fuzz", 'reference/filter/Colorize.miff', 'Colorize', q/fill=>"red", opacity=>"50%"/, 0.02, 0.5 ); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Contrast.miff', 'Contrast', q//, 0.06, 0.6); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Convolve.miff', 'Convolve', q/[1, 1, 1, 1, 4, 1, 1, 1, 1]/, 0.09, 0.9); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Crop.miff', 'Crop', q/geometry=>'80x80+5+10'/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Set.miff', 'Set', q/page=>'0x0+0+0'/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Despeckle.miff', 'Despeckle', q//, 0.08, 1.08); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Draw.miff', 'Draw', q/fill=>'none',stroke=>'gold',primitive=>'circle',points=>'60,90 60,120',strokewidth=>2/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Edge.miff', 'Edge', q//, 0.3, 1.03); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Emboss.miff', 'Emboss', q/'0x1'/, 0.2, 1.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Equalize.miff', 'Equalize', q//, 0.2, 1.03); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Implode.miff', 'Implode', q/0.5/, 0.002, 0.2); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Flip.miff', 'Flip', q//, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Flop.miff', 'Flop', q//, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Frame.miff', 'Frame', q/'15x15+3+3'/, 0.4, 1.04); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Gamma.miff', 'Gamma', q/1.6/, 0.02, 0.2); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/GaussianBlur.miff', 'GaussianBlur', q/'0.0x1.5'/, 0.004, 0.4); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Implode.miff', 'Implode', q/0.5/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Level.miff', 'Level', q/'20%x'/, 0.2, 1.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Magnify.miff', 'Magnify', q//, 0.05, 0.5); +++$test; + +testFilterCompare('input.miff', "fuzz=>$fuzz", 'reference/filter/MatteFloodfill.miff', 'MatteFloodfill', q/geometry=>"+25+45"/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/MedianFilter.miff', 'MedianFilter', q//, 0.5, 0.9); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Minify.miff', 'Minify', q//, 0.05, 0.5); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Modulate.miff', 'Modulate', q/brightness=>110,saturation=>110,hue=>110/, 0.08, 1.08); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/QuantizeMono.miff', 'Quantize', q/colorspace=>'gray',colors=>2,dither=>'false'/, 0.9, 1.03); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/MotionBlur.miff', 'MotionBlur', q/'0x13+10-10'/, 0.003, 0.03); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Negate.miff', 'Negate', q//, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Normalize.miff', 'Normalize', q//, 0.04, 1.04); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/OilPaint.miff', 'OilPaint', q//, 0.03, 1.03); +++$test; + +testFilterCompare('input.miff', "fuzz=>$fuzz", 'reference/filter/Opaque.miff', 'Opaque', q/color=>"#e23834", fill=>"green"/, 0.03, 1.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Quantize.miff', 'Quantize', q//, 0.2, 1.03); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/RadialBlur.miff', 'RadialBlur', q/10/, 0.004, 0.4); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Raise.miff', 'Raise', q/'10x10'/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/ReduceNoise.miff', 'ReduceNoise', q//, 0.5, 0.9); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Resize.miff', 'Resize', q/'60%'/, 0.02, 1.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Roll.miff', 'Roll', q/geometry=>'+20+10'/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Rotate.miff', 'Rotate', q/45/, 0.4, 1.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Sample.miff', 'Sample', q/'60%'/, 0.006, 0.6); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Scale.miff', 'Scale', q/'60%'/, 0.008, 1.0); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Segment.miff', 'Segment', q//, 0.09, 0.9); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Shade.miff', 'Shade', q/geometry=>'30x30',gray=>'true'/, 0.08, 0.3); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Sharpen.miff', 'Sharpen', q/'0.0x1.0'/, 0.05, 1.05); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Shave.miff', 'Shave', q/'10x10'/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Shear.miff', 'Shear', q/'-20x20'/, 0.4, 1.04); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/SigmoidalContrast.miff', 'SigmoidalContrast', q/"3x50%"/, 0.06, 0.6); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Solarize.miff', 'Solarize', q//, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Swirl.miff', 'Swirl', q/90/, 0.002, 0.2); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Threshold.miff', 'Threshold', q/90%/, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Trim.miff', 'Trim', q//, 0.002, 0.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/UnsharpMask.miff', 'UnsharpMask', q/'0.0x1.0'/, 0.02, 1.02); +++$test; + +testFilterCompare('input.miff', q//, 'reference/filter/Wave.miff', 'Wave', q/'25x150'/, 0.6, 1.06); +++$test; + +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_256.fpx b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_256.fpx new file mode 100644 index 0000000000000000000000000000000000000000..d1d53a4f98557dd980ff4482266f464042e40cb5 GIT binary patch literal 80384 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_grayscale.fpx b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_grayscale.fpx new file mode 100644 index 0000000000000000000000000000000000000000..eb4b5615f85b3840fab09844aec964fb16cff40a GIT binary patch literal 33792 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_jpeg.fpx b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_jpeg.fpx new file mode 100644 index 0000000000000000000000000000000000000000..9bc210ca989bd613e712e4ded0ea05e26f477e7e GIT binary patch literal 45056 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
bJ|6_fp+_)E(_u8k!U-nV@ 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 Uf3owR{+4_!JOAlFmjCp>0n&fFaR2}S literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/fpx/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/read.t new file mode 100644 index 0000000..a6b6914 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/read.t @@ -0,0 +1,55 @@ +#!/usr/bin/perl +# +# Test reading FPX images +# +# Contributed by Bob Friesenhahn +# + +BEGIN { $| = 1; $test=1; print "1..5\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/fpx' || die 'Cd failed'; + +# +# 1) Test Black-and-white, bit_depth=1 FPX +# +print( "1-bit grayscale FPX ...\n" ); +testRead( 'input_bw.fpx', + '164b30b0e46fab4b60ea891a0f13c1ec2e3c9558e647c75021f7bd2935fe1e46' ); + +# +# 2) Test grayscale FPX +# +++$test; +print( "8-bit grayscale FPX ...\n" ); +testRead( 'input_grayscale.fpx', + '74416d622acf60c213b8dd0a4ba9ab4a46581daa8b7b4a084658fb5ae2ad1e4b' ); + +# +# 3) Test 256 color pseudocolor FPX +# +++$test; +print( "8-bit indexed-color FPX ...\n" ); +testRead( 'input_256.fpx', + '772ef079906aa47951a09cd4ce6d62b740a391935710e7076a6716423a92db4f' ); + +# +# 4) Test TrueColor FPX +# +++$test; +print( "24-bit Truecolor FPX ...\n" ); +testRead( 'input_truecolor.fpx', + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7' ); + +# +# 5) Test JPEG FPX +# +++$test; +print( "24-bit JPEG FPX ...\n" ); +testRead( 'input_jpeg.fpx', + '8c02bf8e953893cbd65b8a0a1fb574de50ac4cdeb2a88dbf702c8b65d82aa41b' ); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/fpx/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/write.t new file mode 100644 index 0000000..cf5153a --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/write.t @@ -0,0 +1,49 @@ +#!/usr/bin/perl +# +# Test writing FPX images +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..4\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/fpx' || die 'Cd failed'; + +# +# 1) Test Black-and-white, bit_depth=1 FPX +# +print( "1-bit grayscale FPX ...\n" ); +testReadWrite( 'input_bw.fpx', 'output_bw.fpx', q/quality=>95/, + '164b30b0e46fab4b60ea891a0f13c1ec2e3c9558e647c75021f7bd2935fe1e46'); + +# +# 2) Test grayscale image +# +++$test; +print( "8-bit grayscale FPX ...\n" ); +testReadWrite( 'input_grayscale.fpx', + 'output_grayscale.fpx', '', + '74416d622acf60c213b8dd0a4ba9ab4a46581daa8b7b4a084658fb5ae2ad1e4b'); +# +# 3) Test pseudocolor image +# +++$test; +print( "8-bit indexed-color FPX ...\n" ); +testReadWrite( 'input_256.fpx', + 'output_256.fpx', + q/quality=>54/, + '772ef079906aa47951a09cd4ce6d62b740a391935710e7076a6716423a92db4f' ); +# +# 4) Test truecolor image +# +++$test; +print( "24-bit Truecolor FPX ...\n" ); +testReadWrite( 'input_truecolor.fpx', + 'output_truecolor.fpx', + q/quality=>55/, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7' ); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/getattribute.t b/ImageMagick-6.9.12-44/PerlMagick/t/getattribute.t new file mode 100644 index 0000000..884a759 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/getattribute.t @@ -0,0 +1,103 @@ +#!/usr/bin/perl +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test getting attributes. +# +BEGIN { $| = 1; $test=1, print "1..25\n"; } +END {print "not ok 1\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't' || die 'Cd failed'; + +testGetAttribute('input.miff','base-columns','70'); + +++$test; +testGetAttribute('input.miff','base-filename','input.miff'); + +++$test; +testGetAttribute('input.miff','base-rows','46'); + +++$test; +testGetAttribute('input.miff','class','DirectClass'); + +++$test; +testGetAttribute('input.miff','colors','3019'); + +++$test; +testGetAttribute('input.miff','columns','70'); + +++$test; +testGetAttribute('input.miff','directory',undef); + +++$test; +testGetAttribute('input.miff','gamma','1'); + +++$test; +testGetAttribute('input.miff','geometry',undef); + +++$test; +testGetAttribute('input.miff','height','46'); + +++$test; +# Returns undef +testGetAttribute('input.miff','label',undef); + +++$test; +testGetAttribute('input.miff','matte','0'); + +++$test; +testGetAttribute('input.miff','error','0'); + +++$test; +testGetAttribute('input.miff','montage',undef); + +++$test; +testGetAttribute('input.miff','maximum-error','0'); + +++$test; +testGetAttribute('input.miff','mean-error','0'); + +++$test; +testGetAttribute('input.miff','rows','46'); + +++$test; +testGetAttribute('input.miff','signature', + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +++$test; +testGetAttribute('input.miff','texture',undef); + +++$test; +testGetAttribute('input.miff','type','TrueColor'); + +++$test; +testGetAttribute('input.miff','units','undefined units'); + +++$test; +testGetAttribute('input.miff','view',undef); + +++$test; +testGetAttribute('input.miff','width','70'); + +++$test; +testGetAttribute('input.miff','x-resolution','72'); + +++$test; +testGetAttribute('input.miff','y-resolution','72'); + +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/hdf/input_256.hdf b/ImageMagick-6.9.12-44/PerlMagick/t/hdf/input_256.hdf new file mode 100644 index 0000000000000000000000000000000000000000..6b1a7856f2003e62ce54ed9633c9489edcf50e18 GIT binary patch literal 4189 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 HzZCo%xr=mD literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/hdf/input_truecolor.hdf b/ImageMagick-6.9.12-44/PerlMagick/t/hdf/input_truecolor.hdf new file mode 100644 index 0000000000000000000000000000000000000000..183e90f91306d65aa7061fd9f48a1769c09145ae GIT binary patch literal 9987 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

i?z}p)~PITS5 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 Fe*;d%;;sMy literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.tga b/ImageMagick-6.9.12-44/PerlMagick/t/input.tga new file mode 100644 index 0000000000000000000000000000000000000000..0d902c919f55332ace0ab2c2d5937c193d55c228 GIT binary patch literal 9678 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 UaP?%Y#!+HbWH$K?esBsfPwy2ce)t z$5QAf*wINkxLa`TAK@S<5{P%#`rz(ra?Nm5%k~1zwBnmL~6ZPzkb! z8=bJH=Yw{Y=~zI`B|FH0v!k?WPgGVgB^*v-ek3b>9(d-U>g QtP&QF0gnHxS&Y3&-!w$xM@*+nd~5bYq4)C-di=-#Pc3+kuWdK04R{U^+EQz?x+9+@4!M z`EK@V(jWES?*hp~P$#*M8*t7cc>u3v_a?u$W!v7F%(}HEP$%XW0cSXaP2sFq7-0)x z)m9l;W#IqIfNkROE_PweM>8;H-%;%RplE%gsDGtME-1|BK@D~G7W)qSKKp>({chX& z^Q8&bNQK(~xs}@TwIH5HSgA&ng?wtLQZ;_D3z8iVULQm?{%|zfO&#?O3g@)n_>Zq9Lq{ABnA@J#&tuJwt8f)(0Qtr$Mf=T{q< z!B_r@*j}9$?rNLP4}nZ3T`ZL1dI>mPWcblV@IUjby8_o!B^&}XO0$z`zT|Ttf7py) zwA|&R717;bG67ALXR&b>locRSA)+wF_Xmn>1%1EojVkan@vCoUoNzXcO&2Lk@qL8h z>&I-0cQ`4OUqlm#o? zD$9@9QiJ8=FNKZDD}GEx?qFelsBp~|KeK;7kXs2uw|4ecqGxz30sO=lm_$al1y?tt zTZi~$EdO&j@z)?HwLa3`>vpFBbe?SB%`6lJXr1i88sNd{ N+Yk3%p1!br`9E!WVOanG literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.xbm b/ImageMagick-6.9.12-44/PerlMagick/t/input.xbm new file mode 100644 index 0000000..68d87dc --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input.xbm @@ -0,0 +1,38 @@ +#define input_width 70 +#define input_height 46 +static char input_bits[] = { + 0xfe, 0xfe, 0xee, 0xae, 0xea, 0xaa, 0xfe, 0xae, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xbb, 0xaa, 0xaa, + 0xfe, 0xbf, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f, 0x37, + 0xff, 0xff, 0xef, 0xee, 0xee, 0xae, 0xee, 0xbf, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xfc, 0x7f, 0x34, 0xff, 0xff, 0xff, 0xbf, 0xaa, 0xab, + 0xea, 0xbf, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf5, 0x7f, 0x35, + 0xee, 0xee, 0xee, 0xaa, 0xea, 0xaa, 0xaa, 0xae, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xdd, 0xdd, 0x5d, 0x30, 0xbf, 0xfb, 0xfb, 0xab, 0xaa, 0xaa, + 0xaa, 0x2a, 0x28, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x0f, 0x00, + 0xee, 0xea, 0xee, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0x08, 0xff, 0xc5, 0xdf, + 0xdf, 0xdf, 0xff, 0xdd, 0x1d, 0x00, 0xbb, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0x2a, 0x00, 0xff, 0x11, 0xfd, 0xff, 0xff, 0xff, 0x5f, 0x15, 0x00, + 0xee, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0x00, 0xff, 0xdd, 0xfd, + 0xff, 0xfd, 0xff, 0x5f, 0x14, 0x04, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0x2a, 0xff, 0xdf, 0xf7, 0xff, 0xf7, 0xfd, 0x7f, 0x7d, 0x15, + 0xee, 0xae, 0xaa, 0xaa, 0xea, 0xaa, 0xaa, 0xaa, 0x2a, 0xff, 0xdf, 0xdd, + 0xdf, 0xff, 0xdd, 0x5d, 0xdd, 0x05, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0x2a, 0x7f, 0x07, 0x7d, 0x7f, 0x7d, 0xff, 0x7f, 0x5f, 0x35, + 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0x2a, 0xdf, 0xc5, 0xc7, + 0xfd, 0xfd, 0xfd, 0xdd, 0xdf, 0x1d, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaf, 0x2a, 0x7f, 0xd5, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x67, 0x37, + 0xaf, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0x2a, 0xff, 0xfd, 0xdf, + 0xff, 0xdd, 0xdd, 0xdf, 0xfd, 0x1d, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xba, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x35, + 0xaa, 0xea, 0xaa, 0xae, 0xea, 0xea, 0xaa, 0xae, 0x2a, 0xff, 0xfd, 0xfd, + 0xdd, 0xff, 0xfd, 0xff, 0xfd, 0x1d, 0xaa, 0xea, 0xaa, 0xaa, 0xba, 0xba, + 0xab, 0xba, 0x2a, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0x35, + 0xaa, 0xaa, 0xae, 0xaa, 0xee, 0xee, 0xea, 0xee, 0x2a, 0xff, 0x0f, 0xff, + 0xdd, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xaa, 0x0a, 0x3a, 0xaa, 0xaa, 0xbb, + 0xfb, 0xbf, 0x2a, 0xff, 0x07, 0x1c, 0xfc, 0xff, 0xff, 0xff, 0x7f, 0x3f, + 0xaa, 0x8a, 0x08, 0xa8, 0xee, 0xee, 0xfe, 0xee, 0x2a, 0xfd, 0x01, 0x04, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xaa, 0x02, 0x02, 0xa0, 0xba, 0xba, + 0xfe, 0xff, 0x2b, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xaa, 0x82, 0x00, 0x00, 0xe8, 0xee, 0xee, 0xee, 0x2f, 0xdf, 0x01, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0x3f, }; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.xpm b/ImageMagick-6.9.12-44/PerlMagick/t/input.xpm new file mode 100644 index 0000000..b196f51 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input.xpm @@ -0,0 +1,308 @@ +/* XPM */ +static char *magick[] = { +/* columns rows colors chars-per-pixel */ +"70 46 256 2", +" c #2b2f1e", +". c #2d2b2b", +"X c #2a2927", +"o c #2d2e31", +"O c #2d322c", +"+ c #2d362a", +"@ c #2e3430", +"# c #332d2b", +"$ c #372c2a", +"% c #312a30", +"& c #33332d", +"* c #333c2c", +"= c #3a332d", +"- c #3a3929", +"; c #363b33", +": c #3b3532", +"> c #3b3b33", +", c #363733", +"< c #38354c", +"1 c #38422b", +"2 c #394435", +"3 c #3c464c", +"4 c #592b1f", +"5 c #44392d", +"6 c #453b33", +"7 c #553b2e", +"8 c #583b36", +"9 c #4c2c29", +"0 c #69362c", +"q c #6a3a33", +"w c #7c3a2d", +"e c #75372c", +"r c #793b32", +"t c #602e24", +"y c #433f4e", +"u c #493e75", +"i c #45472c", +"p c #484637", +"a c #485738", +"s c #53442e", +"d c #5c4d3c", +"f c #574a38", +"g c #58543b", +"h c #43572d", +"j c #4a6539", +"k c #556a3c", +"l c #654638", +"z c #63553b", +"x c #764337", +"c c #79412d", +"v c #607c3c", +"b c #4d4b48", +"n c #4b5844", +"m c #594d45", +"M c #5a5746", +"N c #555155", +"B c #5c5869", +"V c #4e4d69", +"C c #596847", +"Z c #5a6853", +"A c #597845", +"S c #597350", +"D c #655b48", +"F c #685e55", +"G c #77584a", +"H c #73544d", +"J c #6b5a6b", +"K c #68654b", +"L c #6a6354", +"P c #696657", +"I c #647b47", +"U c #677857", +"Y c #716655", +"T c #757456", +"R c #76634c", +"E c #6a6667", +"W c #7b7969", +"Q c #6d6f73", +"! c #58588f", +"~ c #5c5ea3", +"^ c #5d66af", +"/ c #665c9e", +"( c #727196", +") c #7977a6", +"_ c #6e73b2", +"` c #7478cd", +"' c #5d843e", +"] c #5e8447", +"[ c #65884a", +"{ c #6b944b", +"} c #6d9554", +"| c #719b4d", +" . c #739957", +".. c #6e8759", +"X. c #748967", +"o. c #778575", +"O. c #7b9b68", +"+. c #779877", +"@. c #6b8e68", +"#. c #78a658", +"$. c #7ca567", +"%. c #7ea675", +"&. c #7eb065", +"*. c #7c8d84", +"=. c #7f83b0", +"-. c #7baf88", +";. c #7d87cb", +":. c #91341d", +">. c #873b2b", +",. c #853b34", +"<. c #953c2b", +"1. c #983d34", +"2. c #a83a29", +"3. c #aa3c31", +"4. c #b83a2a", +"5. c #b73b33", +"6. c #b63d45", +"7. c #884336", +"8. c #9b402b", +"9. c #984537", +"0. c #8c402e", +"q. c #a7412b", +"w. c #a74435", +"e. c #b94437", +"r. c #864a44", +"t. c #87574a", +"y. c #994447", +"u. c #95544c", +"i. c #975855", +"p. c #8a5956", +"a. c #936b5a", +"s. c #876652", +"d. c #946c67", +"f. c #a94845", +"g. c #b3524c", +"h. c #ba5d7b", +"j. c #b16d59", +"k. c #b0746d", +"l. c #c43a2b", +"z. c #cb3a2b", +"x. c #c93727", +"c. c #c73c33", +"v. c #d7372a", +"b. c #d83a35", +"n. c #da2e27", +"m. c #ff1b38", +"M. c #e72d29", +"N. c #ec2c37", +"B. c #e5342b", +"V. c #ec363a", +"C. c #e73936", +"Z. c #f7292b", +"A. c #f92a37", +"S. c #f3312d", +"D. c #f63439", +"F. c #da3d43", +"G. c #c03e40", +"H. c #e93d45", +"J. c #fc2b48", +"K. c #f83b43", +"L. c #fa3b58", +"P. c #f03654", +"I. c #ff3b66", +"U. c #fb3e71", +"Y. c #c84239", +"T. c #d6443c", +"R. c #e4423b", +"E. c #c64b47", +"W. c #c94a57", +"Q. c #d84644", +"!. c #d54954", +"~. c #d75348", +"^. c #cc5754", +"/. c #cc5969", +"(. c #d6655b", +"). c #d56f71", +"_. c #e74546", +"`. c #e95657", +"'. c #f6454a", +"]. c #f94956", +"[. c #ec5055", +"{. c #fb4667", +"}. c #fe4877", +"|. c #fb5668", +" X c #fd5776", +".X c #e75a64", +"XX c #e8645c", +"oX c #f8686b", +"OX c #fa6774", +"+X c #f9737a", +"@X c #e96f6f", +"#X c #847597", +"$X c #8c7dae", +"%X c #b37498", +"&X c #837ec8", +"*X c #fd7985", +"=X c #e97b84", +"-X c #c56995", +";X c #82865e", +":X c #879172", +">X c #8aa877", +",X c #97a57c", +".2.e.Q.H.K.K.T.q.q.4.8.8.>.<.<.<.<.1.5.c.9.5 , : & & & . @ % % 5 r i.$X^ u V B *.U N ", +". . # # # # . . # # # # # # # # # # # & = 5 5 5 5 p f 0 >.9.e.Q.D.V.e.q.q.q.<.<.<.>.>.>.7.9.c.g.p.> : = & & O O @ @ # # 9 H 6X` u < < 3 n M ", +"o o . . . . X X . . . . . # . # # # # # = = : 5 6 6 8 7 e <.w.e.Q.Q.q.8.1.1.<.>.>.>.>.,.7.9.e.j.:XZ 6 & O O . . # @ @ % # E uX;.( B Q *.*.Z ", +"o o o . . . X X X . X X X . . . # . . . = : : = 5 5 6 6 0 ,.1.9.w.e.8.<.<.<.<.>.>.>.w r r.9.g.1X8XQ n 2 O . # # . . . % X K 4X0XkXkX9XhX8XZ ", +"O O . & & # # . . . . . X X . . . . $ # = : = = $ = , % 9 0 7.0.<.9.1.<.>.0.>.>.e e w 7.r.u.:X9X9X+.U n : # X . % % % % X g >X>XhXhX%.8XX.M ", +"O & & : , : # # % o % % # # # . % # $ 5 5 5 = $ : 9 9 9 $ 9 0 ,.,.r 7.7.0.>.>.e e e r 7.r.p.o.8X8X+.@.@.Z * X X X X . X X M O.O.%.%.%.+.@.n ", +", , , > > 6 6 : : : = $ # & & , : 5 6 6 6 6 5 = 5 : 6 5 = 9 0 ,.r.7.,.c w w e e g.j.x H R T j.k.4X>X:X%.@.Z - X X X $ $ f P ..} .@.+.+.@.n ", +"> > 2 < 6 6 p p 6 6 6 6 6 : = & : 6 6 s 6 6 6 > : 6 r.y.7.f.9.3.3.9.3.6.w.x w 6._.^.D C s.`.J.J.L.{..X@X)././.g.y.9 $ i z ......X.+.4X*.U n ", +", : > 6 b 6 b p 6 6 6 6 6 5 : = - 6 7 s 7 6 5 > : x ].x.<.Y.3.5.e.2.5.c.D.R.T.C.n.Y.s.s.XXK._.'.J.J.J.L.U.U.}.}. X/.8 2 W 4X4X4XeXVXCXeXU Z ", +"@ , , > p b p p p b 6 6 5 - > : > 6 p p i 5 6 ; 6 f.2.2.q.2.2.3.3.3.e.z.M.Z.S.B.n.l.E.~.'.H.4.Y._.K.L.L.I.U.}.{. X X/.d.VXUXUXJXPXPXIXCX5Xo.", +"& . @ , > 6 p p N 7X) B y : $ & - 5 6 8 5 = & 9 ,.2.2.<.4.l.5.2.4.c.x.v.v.S.M.x.n.v.T.R.T.l.2.2.Q.'.'.].I.}.}.}. X{.=Xs.DXLXLXLXLXLXLXJXeXeX", +": & # & > p f f B pXfXpXuX( b < > i p > 3 V n d 9.2.3.2.4.v.b.z.b.b.R.M.Z.Z.M.v.x.v.T.~.Y.4.4.Y.Q.Q._.{.{.{.}. X X|.OX!.mXLXLXLXPXLXPXDXGXHX", +"p > - $ : 6 f f B yXfXfXfXgX&X/ V > > b ) qXh.W.4.2.4.l.b.C.v.C.C.v.R.S.Z.Z.B.x.x.x.v.~.T.4.4.Y.~.e.~.`..X|.}. X|.|.|.W.d.JXLXLXPXPXJXVXJXPX", +"p p p = = > p s N rXdXdXfXdXpXtX_ ! p.W.[.!.b.C.c.4.c.b.b.v.b.v.v.x.x.v.D.S.v.C.S.B.T.R.T.v.l.4.Y.4.Y.E..XOX|. X+X X=Xd.d VXLXLXLXLXPXGXKXKX", +"m f f p 5 6 p s N 6XpXdXdXgXgXdXpX%XF.H.C.c.T.H.C.Y.Y.4.x.v.B.B.x.x.x.x.v.B.S.N.S.B.x.T.Q.~.l.l.4.4.5.e.XXoXoX@X@XOX*X:Xi VXLXLXLXKXPXKXKXKX", +"m d m f f p f f N $XyXiXpXyXrX6X-XH.C.H.F.c.Q.H.T.Y.4.4.x.B.B.B.v.4.c.V.x.x.x.v.z.x.z.b.V.[.T.l.4.2.2.4.~.@X.XoXOXoX|.X.C GXLXLXFXAXAXKXFXFX", +"d d d d f f f f b J ( $XtX_ ^ J F.K._.'.Q.5.Y.c.Y.e.4.x.v.B.S.Z.A.N.A.Z.x.x.B.C.Y.x.x.B.B.v.v.T.4.2.2.2.e.@X+X+X+X|.I.,XO.MXAXkX9XhXjXAXFXVX", +"d d d f f d m d m m B / rXqX%X6.z.C.K._.c.2.c.b.Y.4.Y.x.v.S.B.M.Z.A.m.N.H.N.A.N.B._.b.b.v.l.l.~.c.c.z.4.4..XbX*X+X{.].;X[ ..I ..$.XeXcX", +"d f f f d d d d z z m B ( zXOXP.H.Q._.Q.3.2.c.H.R.T.x.v.B.B.S.S.N.J.J.|.|.P.n.4.Y.[.T.x.4.2.2.Q.C.S.Z.C.4.(.bX*XOX{.L.k I X.O.%.X>X$.$.$.&. p d E ( ! ~ ` tXrXrXtXrX6Xp.M G ^.@X3X3Xl.4.x.v.z.x.v.x.l.z.c.c.z.n.A.A.J.A.A.D.b.b.C.D.B.v.v.n.v.v.b.|.I.I.q X + g 2XX.' { } { { ] [ [ ", +"O . , p B ! ~ ` iX` rXtXtXrX( H K D g.`.oXT.x.x.v.n.Y.l.T.z.x.x.v.b.b.V.J.N.N.D.V.C.b.C.V.D.C.x.x.x.x.l.[.{.I.f., % i 2XjX .' | } [ ] ] [ { ", +"+ X O > b B / iXiX&XrXrXrX#XF D D D t.`.C.n.v.v.v.x.q.x.T.x.l.x.x.v.C.D.N._.`.R.B.b.C.V.C.V.b.l.4.4.4.4.|.L.W.i 9 :XjX,Xj v { ] ] { { { } ", +"> > : 1 p n E 6XtX$X) ) Q F D D K G w.v.B.B.v.x.v.4.4.v.R.4.4.l.b.C.C.C.'.`.Y.b.b.C.V.V.V.C.T.2.2.2.:.Y.|.!.t.- h #. # i [ { { } { | #.} ", +"D D D D D D D D F D D d p d M Z a.!.v.4.z.v.v.v.v.e.:.2.x.x.B.C.V.V.v.2.2.4.T.V.V.C.C.C.b.Y.2.:.0.:.c u.u.u.a.>Xj , = : 1 [ | | | | #.#.] ", +"F F F F F F K F D K K D p 2 2 p g g._.l.l.v.z.v.v.4.:.<.4.b._.b.5.5.2.<.8.2.4.b.C.C.R.Y.3.<.>.>.w e >.9.u.i.t.h + ; p - - 1 [ .| | #.&.] ] ", +"F K G F F F F F L F F F M p 2 1 1 u.`.'.z.z.z.c.T.Y.3.e.Q._.Q.3.0.7.w >.>.<.<.<.4.5.4.2.<.>.>.w e e 9.7.u.i.a.I a Z a - - 1 [ | } | &.[ ] ] ", +"D K F K L Y L K K Y L L L g i - 7.E.!.oX~.T.Q.Q.Q._._._.'.R.b.1.0.,.,.r w w e w >.>.<.>.>.w e e 0 r 7.t.u.p.M j A h 1 > = - I .} #.} ] { ] ", +"F L Y L F F L F L F L L F K D i x y.f.E.E.T.Y.Y.Q._.Q._.C.T.c.1.>.r ,.>.>.w w w r w e r e e e 0 0 x t.u.u.R C C a 1 - > * - k .#.} ] ] { ] ", +"K F L K L L L K Y K R F Q 4XeXW 1 1 1 > l f.F.T.T.Q.Q.Q.Q.T.T.3.>.w >.>.w w w w e e e e e e 0 0 t r u.i.R D a * 2 2 2 * , = a } #.] ] ] ] ] ", +"F K L F K L F L L F F d.CXLXLXDX1X2 1 - . 8 ).^.b.H.Q.H.Q.Y.T.c.>.w w w w w w w r e e e 0 e 0 0 t 0 u.G p 2 + @ + 1 2 1 O & i .} A A ] ] A ", +"L L L L P L L L L P E lXLXLXLXKXFX,Xi - b 4XJXGX).5.c.F.F.T.b.E.<.,.w >.r w r r q 0 0 0 0 0 0 t 4 0 H 6 + * , , * + 2 2 & X i O.] j A A ] C ", +"L K L K K L L L L P B eXIXLXKXKXKXDXT p 4XJXLXLXPXmXf.5.Y.Y.Q.5.,.w w ,.r w r r 0 0 0 0 0 0 0 0 q H , & * & * + + + + 1 2 + p @.A j j A ] 3 ", +"L L P P P L P P K E 0XHXLXLXKXIXKXMXT Q CXLXLXLXLXLXDXj.2.c.Y.w.,.,.,.r e e e 0 0 0 0 0 0 0 0 l s.P O @ + + O O + + O O 2 2 2 n 2 A j S S 2 ", +"L L Z L P L P F Z *.SXLXLXLXFXFXGXMXwXVXIXLXLXLXLXLXLXLXxXw.4.5.1.,.H q x q q 0 e q 0 q q l l g o.n O + * + O O O O O O O + 1 + 2 j j S S + ", +"P L L P P P E P P Q lXLXLXPXFXFXGXVXJXLXLXLXLXLXLXPXLXLXLXBXj.1.<.w q r r x l c e 0 8 8 s g g g U 1 ; * ; + @ o O O O . O O + 2 2 1 2 S n + ", +"Z L P P P P F P S Q lXLXLXPXKXAXAXFXPXLXLXPXLXLXLXLXLXLXLXLXKXvXa.x t 0 0 l 0 l l l f D i 1 i T C * ; ; ; ; ; @ , , O O X X O O 2 2 1 2 3 @ ", +"L L P P P P E P P Q lXLXLXPXKXMXcXJXLXLXPXLXLXLXLXLXLXPXLXLXLXLXLXKXDXvXz s s z f p p C i 1 i K D i ; > ; 2 ; 3 ; 2 2 @ @ O o o + 2 2 2 2 + ", +"Z P P P P P P P P *.CXLXKXFXAXvXcXHXPXLXLXLXLXLXPXLXLXLXPXJXLXLXLXLXKXDXR s s g f a a i a k K g g f p p ; 2 2 2 2 2 2 3 2 2 @ 1 j j 2 2 n * " +}; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_16.miff b/ImageMagick-6.9.12-44/PerlMagick/t/input_16.miff new file mode 100644 index 0000000..f71545c --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input_16.miff @@ -0,0 +1,9 @@ +id=ImageMagick +class=DirectClass matte=False +columns=70 rows=46 depth=16 +background-color=gray74 border-color=gray74 matte-color=gray74 +Comment={ +This is a comment.} +Signature=eb4d6e084afe2835a1ad28ad7fc12ced + +:00//--2200..6622//8833..::33--9922--8800--9911..8800--8800--77//,,55--**44,,))55--**55--**11--''11..''4411**7744--9966//??:://FF??33JJBB44LLAA22NNBB22UUAA22ttDD44CC33AA55EE==DDGGCCFF==BB<<@@@@;;??//??--@@--AA++@@++??..==,,==++==**??..??33BB33DD66FF99RR:://::55337722117722//6611..3300,,////--00//--33,,--66++--PP7788IIGGbbnn||llppPPHHnnRRLLaauuww||zz||llYYVVSS//..,,00//--5500--7711--8811,,8800,,66//,,8811--8811--8811..77..,,44--**44,,**66//++66..++33//**3300**4411++6633--775500>>88--EE==22HH??11II>>..KK@@//MMDD33iiEE44@@..<<--GG<>..==,,==**;;**>>-->>33@@44DD88HH;;DD77,,9955559933116622//6622..1111----11..0000..55//..22**,,EE2211xxAA55YY\\}}ccllJJ>>kkKK@@\\]]^^gg~~llpp__YYWWSS,,,,,,,,--++00//,,11..++22,,((22--**00,,++22,,++22++++22,,++22,,++11,,++11,,))33--,,33--,,33//,,3311,,4400,,5522--775500::33,,>>66--@@66--CC88--HH;;//EEEE55UUDD44mm==++99((EE44HH==EE@@<<>>>>==AA00@@**??-->>--??,,>>))>>,,==--<<--;;..??//BB11@@88GGDDWWNN<>FFFFIISSIIYYZZOO,,--//++--//..----//--))//**''--++((,,****,,****..++++..++++..++++//++++//----00,,,,00--..//--**22..,,22..++22--,,3300..8822//<<44//>>44//AA55--FF9911HH>>77QQ<<55__7700yy77--;;//AA33EE99EE@@HHAABB//@@,,>>--==//==--==++<<++<<,,<<..<<22CC77GG::EE@@gg__yyWWeeWWCCBB887755++//11**..11++--00,,--00////00..0022..//22..//--2244**,,ggccbb~~iippYY\\oo``pprr||__eeQQ,,//22++//22....00--..----++)),,**++++))++((''((****++,,**++,,**++**))))**(())--++,,..--..//,,++00,,++..**))//++++00----881111<<3322;;2211>>00..AA22//AA7733BB::66KK6622hh77//==00>>55AA33DD77GG<>UURR{{rrppSSZZGG<<@@330011((--))''22,,++22,,++00,,**00--++00//++22**1100))((eeqqRRʳǰYYddJJ..00..////--//11..2211..3300--33//,,22--**--**++,,++,,**))--++((,,--'',,++(()),,**))----++//--,,..++**//++))44,,))66//**;;33..==4400;;11--;;//..>>//..>>33,,5599//9933,,OO,,''ii::--AA11@@11;;--BB22>>22<>--::++;;**vv>>))vv88,,ss99--{{@@44GG>>NNEEddVVzzqq{{vv||eeggddeePPffPP44==00**&&##..$$&&++****))++,,''++//''''--))$$""WW\\HH~~jj{{jj~~oooo}}tt~~{{oollLLVVDD778822778822999944<<::55@@==88BB::88AA9955==7733<<7755::554499000099////6611..6622..6633..664411997733??7722BB9900HH==11JJ>>44HH==44BB8800@@6611??6622<<9944CC5544AA5500<<66**EE55''cc66--==;;BBAACC;;>>66AA55~~:://yy;;//uu>>..zz44))PPLL[[VVppJJ99kkSS@@ss``IIzzXXff``zzrr~~vvxxooooXXiiMM??;;))33))""%%++!!++//&&::&&**CC))))TTNN::hhqqRRhhWWkk\\nncckkhhsstttttthhddNNXXCC88993399::44>>>>88AA??::DD??::FFAA<>BBCCEEvvCC99yy::44<>33((GG@@--ee^^::ww\\nn\\mmYYssdd~~{{dd}}__SS__GG667711668811====88BB@@;;FFAA??HHCC>>HHCC>>JJDD<>99,,EE<>11KK;;11DD:://>>==1177==00BB@@KK]]3355;;##??55;;00>>33DD77::((>>22>>8888??<<<>JJII;;MMII66IIEE77MMHHJJHH@@99EE;;++CC99--??8800>>8833==7711>>9944@@==99IIAA66PP@@--HH??--KK8811CC774455==00@@??//II@@44++44!!AA&&::$$66''==22AA11@@22@@4488))11++++++00))66%%55!!99,,UUIIUUQQAAKK??AA;;..EE;;AADD>>HHAAQQ==VV>>hh>>qqEEwwJJnnWWxxYY]]nnnndd҅uunn1100--//..,,4433//889922>>??55GGDD;;OOKK88MMKK44XXWWWW||xx[[TTooFF??OO9944446622&&5522))::99..BB==--KK@@//PP@@//CC;;**::44))004400BB11--66<<;;//<<'';;%%>>,,==11;;1199**::++??2233**44,,88..11++//((55 44!!99,,??66CCAAAA>>>>3399((==--EE@@FFKKDDKKDDXXBBbbJJttKK}}MMzzTTttCCcc{{__TT::88116633--3300++7744,,<<;;22IIAA66VVJJ99TTHH::ddaarr䬬쏏nnmmLLIIXX@@??MM<<9999AA==((BBCC..88AA99::EEQQEEUUaaFFSSRRaaGG<>22::##::))@@77HHFFGGHHFFJJOO\\FF``JJnnRRzzXXzzUUqqSSgg``ppKKUU᪪DD@@55AA==33;;66--5522((::55//FF==77TTGG66WWFF77]]UUjjޫ||ff\\RRLLss77::CC::9977RRJJNNss]]{{KKPP<<''99##::**;;--<<33;;336611>>99<<7788//DD99??44))))++++22,,22%%<<((::**77--LLHHCC@@99$$99((>>22QQIIEE>>NNIIQQSSTTaaVVnnNNooUUxxWWooZZiiWWeeOOTTttnnOOII;;MMGG::FF@@55??9900==6600AA==88MMEE55SSDD..WWLLSS틋oozzaaeeNN__OOWWLL]]HHRR;;>>>>>>>>55>>//??22>>4499//33++77//88//33))33$$99"">>0088;;005522005544553377++>>//PPJJEEII==3388++<<--CC22==--HH==NNJJ\\aaffvvPPmmZZuurrxxbbpp{{uueeVVPPAAWWNN??VVMM??PPII::KKBB44FF<<11EE@@77LLGG55SSGG..VVNNQQ𮮭຺vvAANN<>CC??FF>>;;GGFF>>AA??;;==11??00;;++::..993333//44..88**;;++;;66<<9999%%99!!33&&55//77++88&&==))>>55@@BBUUSSGG==99))::**<<--<<..::**VVGGmmjjaaggbbmmnnqqddllWWppuuiiXXnnEE[[NN>>ZZNN>>[[NN==XXMM<>CCNNBBGG@@55CC;;4411BB55;;))99%%::%%88((44++1133,,33--11..88((>>((0000''88((;;22==44DD6666&&55))7755..//44**55**JJ>>>>1166**::++77&&HH>>qqrrss~~rr{{ss{{VVeeDDaa}}}}gg̮Ưʪǚպ[[LL<<[[LL<<\\LL<>^^MM<<^^PP<<[[NNAAYYLLII^^SSddmmeeě~~qq@@GG>>++@@99<<@@BBJJ<<7799((BB88;;88DD::77$$;;((88''44''99..44'',,$$))''%%2266''66<>UUYYaa77eeNNdd~~mmppooppooqqÿ\\KK77\\KK66\\KK66]]LL77]]LL99]]LL;;^^MM==]]PP==]]PP==aaMM::ccGG>>gg]]qquuqqKKUU??QQ==GG<<==>>44;;**>>//883333++99''MMAAAA33::..779922>>""// --!!++%%77;;VVccppNNSS::5566$$--::008866IIEE;;0088++88++88//JJ@@33....11--0022,,44%%MMEE{{YYtt??aa@@SSIIYY11pp[[ooqq||ff~~ffkk~~eenn^^MM::^^MM::^^MM::^^MM::^^MM::__LL77^^NN99VVNNAAaaXXYYoo``mmmmddppppxxꙙ͹vv||dd\\MMUU99AA7777BB22::++GG>>BB9966++66''44..DD77<<..0033DDNNCCGG//--,,((2233>>CC??CC778833..OOJJOOQQIIGGUUUUEEAABB::<<7722==77??>>::11**2200..2200..44%%HH<>__OO==__OO==``PP77\\LL99__[[aa}}||}}qqvv||ƚǺȶppRRLLAAHHJJ7799::2277..II??ffXX@@3322++11,,==1177))--))5555RRXXJJQQQQVVVV[[@@BB99??--77JJVVoozzffvvRRNN5533AA<>ccAAdd\\;;//LL__>>uu^^{{ccooWWrrXXxx^^yy[[wwVVaahhee||VV[[MM==__PP@@__RRBB``RRCC``RR@@\\OOBBccYYaawwwwww||ccjjzzzz֯ᶶ諫yyddllggWWZZ66::6633::11OOAAXXII11''>><<@@7700%%--''33**9955SSWWVVbbddooaagg//77((66FFSS^^ffTT[[7733664488228800::55;;;;665555++66**00--//4400//99..8822wwRRpp<>``SS>>ee__XXzzttsspp]]__iiiiߝޢ֠֞Εppgg}}^^VVRR||SSHHYYQQyyss||^^ZZ66--55##;;**::0077,,99//88//<<**@@11==447733PPLLKKBB66$$//00((::''??::##88..66::55<<5577553355440077))99&&66&&55--55))44''VV\\PPkk88ee@@XX9955##AABB337788!!QQZZ44ddyyNN__AAccDDllNNhhGGccIIccJJffIIbbDD4477--::::44OODD;;VVLL==ggeelllljjQQQQ[[]]yy{{Ή݌ш͈ҍȇ~~ZZjj\\[[LLppWWDDSSVVffkkzz;;--;;##;;))66++;;++66((::--88((::--:://::00??55::..11''//77++==**>>$$::&&9955==::66;;445544448866//77))88&&66$$99&&;;%%==44WWll77ccCCjjkk33==##//%%//44^^YY22ss``]]>>mmKKppQQkkHHiiMMeeJJffHHggGG**00&&++00++997755EECC==ZZ\\ii\\]][[ZZyy||օ낂ځʃҋۍ~~xxssWWRR``__HHdd__CCWWPPZZccnnjjKK@@77&&<<''88++11((>>++::((GG;;99++::))77((77((<>00>>==44<<==22AAEE**LLMM::UUTTAAeeccggzzwwsszzyyoonn__WWllYYGGhh\\KKjj^^NN__OOKK<<55..00++44**88$$==$$99,,;;))77&&==55IIBB99''::))99--<<44;;77::888866HHIIZZXXCC==::7799228844668888>>66==77;;??77;;++;;'';;((66##IIDDUUhhMMXX]]OO3399""FFOO))uu__iijjIITT<<<>VVMM??VVNN??VVPP==\\RRCC``WWBBbbYYKKmmcckkwwjj||ppddmm]]WW[[WWUURR]]VVGGffZZFFnn__HHjjddOOZZOORRGG::,,44++77//77..66**99))::,,<<++55""99--<<44HH::BB99>>99<<<<6688;;88==2299**;;--<<5566::66::8866992299668888;;==@@88;;,,;;((88$$66''YYZZTTVVYYRRccKK``xx;;qqvvYYOO]];;;;==..2233++;;CC11ffGGooJJjjMMmmRRjjGGqqKKxxUUqqWWccZZKKee[[KKee[[KKdd[[LLee[[MMgg__JJhh__HHgg^^MMgg]]LLff\\II``ZZGGQQNN==LLHH77SSPP>>[[ZZFF____OOaaYYJJLL4400==))::**99++88**77**::++==//55??))77**99//449966<<66;;55<<664488&&99&&::))>>44998866778855<<33>>99>>>>@@;;88++::((::((77""~~::**RRJJTTII\\SSnn]]ssSSccBB''225588117766//99990099CC00ggKKwwQQppSSppOOooIIxxUUwwYY``JJhh__PPii``QQii``QQii``QQhh__PPkkbbTTjjbbSSii``PPiibbLLiibbHHhhbbKK``ZZFFLLJJ66@@EE44@@HH88CCJJ>>UUMM;;XXOODDFF::,,77%%88))::))::((99));;//669988**;;55@@EE>>;;6611::5599-->>**AA++<<''66))<<55==77??66DD99AA99883388**88''<<))}};;((ww33""AA33SSGGZZNNYYSSYYMMAAMM++''22%%77>><>22@@::>>33CC33HHAAIIEEEEAA==//FF22CC11yyAA--::++<<,,==,,88**::..;;00??11<<..66**77,,<<,,;;**{{;;,,ss99**vv55((HH;;OOBBSSNNVVWWoo__ffvvIIGGVV44^^kkQQKKQQ55::;;##8888//88BB//iiLLwwPPppNNrrPP}}``ffNNbbJJbbMMii``QQii``QQhh__PPllccTTkkbbSSmmbbWWllbbUUllddOOllddPPllbbVVmmbbUUmmccTThhaaQQVVPP@@EEAA1188AA''KK@@>>@@NNOOiimmNNJJCC<>BB>>AA<<99//==//<<338822;;//;;..::--||::..||:://{{9911{{88//||99..zz::..xx99//uu88..rr66++oo44**ll22''vv@@66TTLLQQMMUUMMyyeeOOZZnnJJUUmmDDMM__::99CC((8899,,;;==3344;;008899))VVdd>>ttTTxx\\rr\\ZZCC__IIeeLL\\GGhhaaQQiibbRRjjddSSiibbRRiibbRRjjbbSSkkbbSSkkbbSSllccTTllccTTmmaaTTffZZPPssppii}}{{jj77>>++33<<((<<==//??;;..^^BB55HHEEAAEE>><>==44==,,~~>>//99..::++::++::,,~~:://~~::00{{9900yy88//ww99//vv9900tt::..qq66--nn33++kk44))ee11%%ss==22RRNNYYRR__RR__\\HHEESS;;22??));;EE00BBJJ6699AA0044;;..4499557788,,LLWW33rrSS{{^^``IIZZ~~CCaaIIaaKKXX||GGhhbbRRiibbRRkkccSSiibbRRiibbRRjjbbSSkkbbSSllccTTllccTTkkbbRRee]]SS||ՠ||CCJJ2255??++::7722**00++ZZ??>>XXUU99::@@DDBBDDAABBCC??EE;;BB::BB88;;,,==,,<<++::++}}99--}}99//}}::00||::11ww::33ss88//pp66,,oo88--nn77++nn66//kk44,,gg33**``..$$pp88//UUQQzz\\OONNOO>>55@@11//55,,333300..33++44>>11;;KK8800>>..--22//5544++AAMM//ssYYnnTTTTuu??ZZ||EE__LL__IIWWwwHHhhccSShhccSShhccSShhccSShhccSSjjccSSllccTTmmddUUmmddUUllbbQQlljjee̝KKOO11==66))OOHHFFqqqq==::@@<<@@@@>>??BB==@@<>44ffFF99ccJJ55__MM55iiQQYYFF**11((0077,,1177--0066,,//33,,--22--..33----22,,,,00++,,33,,))44----88--22>>--22>>**66CC..DDVV;;HH]]==^^qqRRZZllSS,,88..hheeVVhheeVVhheeVViiffWWiiffWWjjeeVVllcc\\nnggZZhhiiQQlluuppԼkkSS??..66**88,,ooAA33rr==77ss??99ssAA;;oo??88nn==66qq9944ll::33dd==22^^>>22PP;;++UUPP99]]XX==]]]]??nnvv\\22@@++2277//2288..3399//2288--//55,,..33--..33--,,11++**//))++00++++33++**44,,--55,,77@@5599CC4433>>,,>>JJ44\\hhTTQQ]]OO++44--ggddUUhheeVViiffWWiiffWWiiffWWjjeeVVnncc\\llhhZZffllSShhwwooìuu]]yyHH11ee66""ee33))jj9900ll??44ii>>44hh>>22ccAA77__DD55YYGG55ee]]GGEEFF//99CC''EEII++ppppRR\\``GG2299''77==5577==3377>>4488>>3388<<5577;;6666;;55227711..33--,,11++((..((**..**,,11,,//22//==DD====JJ8811??((BBPP<>5588>>4499??5599@@88;;AA;;::>>99::@@::99==8877;;66006622,,11,,++//..))--..))33))66JJ2299LL3388II11;;KK88//;;..\\ggOO__iiRRggkkWWiihhXXllffXXllggYYkkff[[hhggYYeellYY||ɾmmggKKRRKK--UUOO22SSOO33PPNN44LLOO66HHOO55EENN..LLSS00]]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 BCszOf literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.gray b/ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.gray new file mode 100644 index 0000000..2ba6d24 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.gray @@ -0,0 +1 @@ +/0234323221/.//-.146:?BBCEP[bjrvtrla_^[WUTTTVXae\?63320./..>YutNPvyV./122102220..00/01358>@?ADMTYhqtutk_^]ZWTSSRTWcj\964220//0,7PjpFF^lW,,..-.-------../1025477:=CGIM]jqsqb[\ZXTSRQPSZfkd<54321111/.4VxG96CNX,,--++**+++,--.-...03567;@ABIS\grr^XXWURPPPOU_g}_A4//../00.-ds]k`...-+*)'***)(+-,-+,-354369;;DRVYbhZUTTRPNMMQY\ozU=/)--,-.-*i]/.000/.++))))*,-++.0463235635FRUSYVTRSRMLJMX\emV:*))*+-,'^T2236632/0-*++./0/037::63465218FOOPTTQOOLIHPY^lx\8&'***'%X}P778:=<:88621223478:>@?:8899868BRYURRMLLGnrSXcw}`:+(,,0MjuyR89=??AA@@><;;8547<:769=ACA>;;9T}`Td[_dWaiomnm`goktq{nnquzz|FBvϰr_247;BEGHDIA<:9989=BB?<:9=cWS\XS\__dbghigcau~zo[itw{y||tω{/.27=CJHW}YB5118q~~Z\\[\^_^^\YLGNX]orc_dgedfaO\^ejkmmeXW\jonmmmlhXSPJLjfjxZ,657=sv_```_cb`aaaYHACFMswb^deed_NQ]itj]^WXZY[hpqqi[SOOLETeijeE-;J97;swu```aabbbbbbbUC?<>i{ebfhii_dsxnYYTONQRRX_c^TPOMLHF\`gkwlMdL76/H~Z\[fqMdddddddfdlnuZfl`UQOLJHGEEDBCEFHMtj.4332111/29:FPLZUek=dddddceed~ϯ__`VROMLLHFGEEEINOO|T-3431/0/.0/3888CbW0cdeeedeggqTA@FKIIJJJ\C<=;93.-+.ACAD5`cgffffegeIMMKKIGL^`SRPH@<<>==>?A@<9=SUDIR; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.rgb b/ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.rgb new file mode 100644 index 0000000..b778d9f --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input_70x46.rgb @@ -0,0 +1 @@ +0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nndun10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:darnmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Uj|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLSozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮ʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdme~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxv|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzzydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iipg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S||CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQljeKO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTxYu~tNP~v~zyV~./|12|21|02|22}0.|.0|0/|01|35y8>v@?uADmMTfYheqtbutck_b^]eZWiTShSRjTWdcjr\9~64}22~0/~/0},7sPj{pFF^}zlW,,}..|-.~--~--~--}-.}./}10|25z47x7:w=CqGIiM]ejqasqcb[e\ZfXTiSRkQPiSZgfkwd<|54}32~1|1~1~1~/.w4VyxG96|C{N}X,~,~--}++**+++,--~.-}..~.0|35z67y;@vABmISf\gcrre^XgXWiURjPPmPOlU_lg}x~_zA4|/~/.~.~/00.~-dwsz]kvyz`.}..-+*)'***)(+-,~-+,-}35|43{69{;;oDRkVYgbhhZUhTTjRPkNMoMQoY\powvzxU~=|/)~--~,-.-x*iwzoupux]/.~00}0/~.++))))*,-~++|.0|46|32{35{63t5FkRUiSYjVTkRSlRMmLJoMXr\etvqumvV|:*))*+-,t'^kxkpoouxT|22|36|63}2/0-*+~+.}/0~/0z37y::{63{46|52x18rFOpOPlTTkQOkOLoIHpPYr^ltoumsnxy\y8~&'***~'z%Xmvkqppv}xP}77}8:|=<|:8~86~21}22}34|78x:>x@?z:8|89|98w68rBRqYUoRRoMLnLGmnrqSXocwo}q~qxtt`x:+|(},|,0sMjlusmmspuywR}89}=?|?A{A@z@>y<;z;8|54y7y<:{76w9=uACwA>x;;w9Tj}`dTdf[_edWdaidomdnmb`gmokfteq{innpquwzzvقs|tFBxv~z{́ρvrx_~24|7;zBEvGH|DIxAdqud~q_~p`mvZ\v\[u\^s_^t^\uYLvGNvX]norbc_^dg^ed`fabO\a^ecjkcmmceXbW\`jo`nm`mmelhfXShPJlLjpfjnxtZ{,|65y7~=dstbq_pcnvv_`v``v_cvb`raasaYvHAzC}FpMsbwb^^d]eead_cNQb]ietjg]^fWXdZYc[h^pqbqih[SiOOkLEmTeqijqeE}-{;wJ9y7~;dst_pbpfwpuv``v`axabzbbxbbubbwUCy?{ie{`eb`fhbiie_dbsxgnYjYTkONjQRhRXd_ce^TkPOlMLnHFn\`rgkowlsM{dsL7y6~~/vHx~nZs\m[tfpqvMwddxddwddxdfydl|{sun}u~~r㙀dZfel`oUQpOLpJHqGEsEDtBCtEFqHMutj|.|4{3}3|2~1}1}1}/}2{9z:wFzPrLwZpUuevkw=wddwddwdcyeeyd~}~y~sy~k_f_`qVRsOMrLLsHFtGEsEEtINpOOv|T{-}3|4}3}1}/}0}/}.}0}/{3x8{8v{8wC{b|W{0wcdweewedyegyg|q{|s~yՄ~~slTpA@rFKrIItJJsJ\sC~<}=~;~9~3}.-}+y.yAvCxAzDz5u`|cvgfwffxfe{g{{yu؄}~~|toeIpMMsKKrI~GnL^r`SrRPwH@{<}<{>{={=|>|?|A{@|YutNPvyV./122102220..00/01358>@?ADMTYhqtutk_^]ZWTSSRTWcj\964220//0,7PjpFF^lW,,..-.-------../1025477:=CGIM]jqsqb[\ZXTSRQPSZfkd<54321111/.4VxG96CNX,,--++**+++,--.-...03567;@ABIS\grr^XXWURPPPOU_g}_A4//../00.-ds]k`...-+*)'***)(+-,-+,-354369;;DRVYbhZUTTRPNMMQY\ozU=/)--,-.-*i]/.000/.++))))*,-++.0463235635FRUSYVTRSRMLJMX\emV:*))*+-,'^T2236632/0-*++./0/037::63465218FOOPTTQOOLIHPY^lx\8&'***'%X}P778:=<:88621223478:>@?:8899868BRYURRMLLGnrSXcw}`:+(,,0MjuyR89=??AA@@><;;8547<:769=ACA>;;9T}`Td[_dWaiomnm`goktq{nnquzz|FBvϰr_247;BEGHDIA<:9989=BB?<:9=cWS\XS\__dbghigcau~zo[itw{y||tω{/.27=CJHW}YB5118q~~Z\\[\^_^^\YLGNX]orc_dgedfaO\^ejkmmeXW\jonmmmlhXSPJLjfjxZ,657=sv_```_cb`aaaYHACFMswb^deed_NQ]itj]^WXZY[hpqqi[SOOLETeijeE-;J97;swu```aabbbbbbbUC?<>i{ebfhii_dsxnYYTONQRRX_c^TPOMLHF\`gkwlMdL76/H~Z\[fqMdddddddfdlnuZfl`UQOLJHGEEDBCEFHMtj.4332111/29:FPLZUek=dddddceed~ϯ__`VROMLLHFGEEEINOO|T-3431/0/.0/3888CbW0cdeeedeggqTA@FKIIJJJ\C<=;93.-+.ACAD5`cgffffegeIMMKKIGL^`SRPH@<<>==>?A@<9=SUDIR;~}{}}}}}{{ywuofgcdcdihhel~}}~ux~|~~~}~}|{ywujfacefikkes}}~~t|~~~}{|slgihjjnqouw{~~}~zwv}}|}|{yz}{{rpnkkopqsurx}~olnu}}|{{yz|{wwy{vpiggqrfqmkkprtwxlnoyu~}zxx{x||yu|wfafed^[Zgefdhtztuz|||{uukcbcba[[[cebgenwqms|xwy{vlhcb``^\`b_^hbbekqmow}rvvvvahgdba`_f]_`^dabfcliqozuuuuutw_agdc_][\hfbbc_bccennojnjgvsrsutvhjedc[`baamfdgead_^_mqpijgbmtttsleceg`^]hhgdmdc`b^__oqtkff_iuus|l`c_d_`jjec^^a`[`^msuoafem{yxlka___bbbafdc`_[[at{ujcdfgz}|tmb[]aa___ec`ccba`jtzimddfawwvwwqre_^^cabcacbc_bdfkooaq|hd`]vvvwssuyud_^^dbeghec_`hiklpq{y{ha`evvvwtwvwpieeefcflpomlhlnpnqtkv{hafdvvvvvw{zwytidfddkmloppprqrtvwx~ochiwwwvv}nq}{nffdlloprrrrrwy|}y{ujljwxxyu{xr~yecnopqsttqt|||}~|xtprwwwztxr}gjqtttstqt|||}}}|zw{wwxzt~ux}}upptttqt{|}~~|vy˺~ܽ™|~}~{~s~zootvllv}yqou͍ĴvuvuӸݺж|v{yy˾Λ~uxwuƿԿyuv˿xv{~˾tupoxϸѶ˷rqrmv}x{´Ϻݑvqrot}uxۂ{qqpw{xz|zrstv~~|yzֿ~{vuqsqκưy{xqqm}ͯµν{wqppƥx|woor~ʤz|}}}prr~ͬ{}z~}put{}|}~~~z{xuuz}~~}}}}|||{{~x~|~}}~~}~{xy \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_gray_lsb_08bit.mat b/ImageMagick-6.9.12-44/PerlMagick/t/input_gray_lsb_08bit.mat new file mode 100644 index 0000000000000000000000000000000000000000..78ea14754bc2e0c1afe537ee4a4ca615980c3004 GIT binary patch literal 3456 zcmb7H=XM+C5tVadpU9CYl3*1ZXt9In*v0nVdjoc{s4O5rNmQXJ(Nwb%`^1S8=b`dc z`I%Yy3G!_rfU|qge0T2L8QOeg@j@OcRq{3;6)!HIkB{@-^OKv4m)BQBUbUPALyz;~ z_4wpwe4c;#g2;z&UgYhQ>wFc@*Q!JVBWm@0tx`er|L?l@m2S`6yLa!u5ANOj2LApD zuKRFh>ub2O?Mx(fUbgIw9)Di=WvC z_cy{w(hNwYdel@Tc%}MhGyt08;*v9(ex}n zWog3osJXoETZUnnx=6~tp$d4FWF^ZD;&v3cK^Xa-YrDSZxE>r1fB~-S8o{vNpS&K| z#twxYRhN!**)%jAmgGi;#ITaC8%_`fK0I#2VOci3>AIfp1%4QKei%hzD~N!blgX$W zw{dp1Y`bz8sH&!Ea(igXmS@VMC@2uSW!kn4uiK92`+*+>A-o@Dw^qB|4&1?DIJz8& zB86~Hw`BtNnx?B7uL+bSYo?+AjTugc;z0}m5{7WL03gYL0I?PM{lW13?P(atY3P`` z3Cl2aT|+>P8hq9i$cJQ@ru_u~-i5Q(%Hjz9E)e8L?RFA}{r>RkZZv-N+>?P3U>E4s zG`hrVrVY`14q&Oe<$AzxJ4rg7BnA)<5@p)448e>{prtL&4utY5I`|K zQ?SDRaM(?{y|kOeaVJf?-Rz7b*V0rtbi?*Shb;oe^2UO3K7N1Iy7<)7Y}k-#3cS}j zd-ZDE8^=+a1kw3q(C>9RX}8w}kfh}qiUcVHAeqAsmuDX49&c=I&C3^;KThJ)3l~U% z!>~KUUaNO?(zhI;rZml)wz%cvaVVePa|12EzrE^oW>_-Kx&)-H=SO8kQ$}c`Nge+Ql(Nk++JOr z&%s(;UR~SV+T31Q?M>fbUwG#bg5q@4tcE~qwke0hi_`uHD!1S5B)%>k^7I>Z^(A_FtuA$Lu7`%68JQh8S@py*xCoR>s~!4|ZDl34 z-xPdL-~fmhWmTp~mLbt5hG7i^DIV=?tghv#+t)*Yupt!R)^yuSr;(G6Ed{Z<9DZT zU-a7n7!_4P@a}1lQVc8blE4uNP7!DgZ6Y-k#YtA=3d<|o%0$#Mqs@{HNd-P2|8N7s z<8~{IoCd2`&1gRoSw>V8fkhFDV^|WYRvQiI@NnN6qYbz%$jXS8FvC3JgQ)_2LdAH79o;KZF+4xa)WxNC?US zc4?VXaQo`i2ZKUMNj5ZBvf|0uQ6v!#fudkkAqavbNvyuP%`3w6vZB-U7-(9GJ zt7qkz;SB!r>F)Ld8ltD0HrJ?8!Swa*n-^1jla60LixuDnL18d#z~oaZmyVyz%{*L} z75?@mf7HYo-+*BQV1nCUe*H9Pfq=m|3hUpB!HznCJKrePM`0&f;Hyz*i3@A)TSFuW|q0w3_(G*CnSgtg{ zAQ~77(_r?s@Ff3u_7SC0!>b=64W=uYJw4y`$M1gma0=54xT%x0OpT`TW?g6*qAs$a z-%7dGz_1#E<6t<&TD`QhzB>C5QRt{WjK)r<9mbvwj6i3OqP7RQPoGcPM&K%}06AMG z!5~!%YoKToN(rV8l0<9udUCv|(jVEk(d@~)NwVfz(V1`QjEtn;A{rsC?~&lkwf> z*B#%DI5X^6g<7*N>BILgJcgqwmZrc0S)OJ{oWhF_Xa4+6z3n%Ra5%mDY1$5hY^t*D zFmTTP_1oW0pxi@wc_-{D2#t`Uaq$o6_L|5G3`tWI2LmrnP)uPb_sxB=7h_~N`SJbL zNjHuoPc3jk7S(Xv34G0@9+p`qFjSG2747-of9QF(DsT+Va16(@3{5jQdtJGgm!}?s zl#&}jZ|)oxmUAol9T4a2w+l15vZ$MmCc91;CrKZ)4eeACVA_UxTh??@ RUdN_;D~8OH@Q)0v{{eJlpWFZd literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_gray_lsb_double.mat b/ImageMagick-6.9.12-44/PerlMagick/t/input_gray_lsb_double.mat new file mode 100644 index 0000000000000000000000000000000000000000..7686dc2daf14eb1491cf32402dc09325f079a597 GIT binary patch literal 26312 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 XTFlpZu|e1y%D3lg>^Eyy&u#gCDI9U| literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_gray_msb_08bit.mat b/ImageMagick-6.9.12-44/PerlMagick/t/input_gray_msb_08bit.mat new file mode 100644 index 0000000000000000000000000000000000000000..1517e389fdfeb2c166dd35dbd17751c127d2ce22 GIT binary patch literal 20560 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_p1.pbm b/ImageMagick-6.9.12-44/PerlMagick/t/input_p1.pbm new file mode 100644 index 0000000..59fa992 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input_p1.pbm @@ -0,0 +1,92 @@ +P1 +70 46 +0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 +0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 +0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 +1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 +0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 +1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 +0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 +1 1 1 0 1 1 1 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 +1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 +1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 0 1 1 1 1 +1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 +0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 +0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 +0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 +0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 +0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 +1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 +0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 +1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 +1 0 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 0 0 0 +1 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 +1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 +1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 +1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 +1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 +1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 +1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 +0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 +0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 +1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 +1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 +0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 +0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 +1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 +0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 +1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 +1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 +0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 +0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 +0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 +0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 +0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 +0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_p2.pgm b/ImageMagick-6.9.12-44/PerlMagick/t/input_p2.pgm new file mode 100644 index 0000000..5bc03cd --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input_p2.pgm @@ -0,0 +1,127 @@ +P2 +70 46 +255 +7 8 8 9 9 9 8 9 8 8 8 7 7 7 7 7 7 8 9 9 11 13 14 14 15 16 23 34 44 53 67 75 79 +75 60 45 42 40 37 32 30 29 30 30 31 33 43 48 33 14 10 9 9 8 8 7 7 7 7 13 29 49 +61 47 20 21 47 79 49 24 7 7 8 8 8 8 8 8 8 8 8 7 7 8 8 7 8 8 9 9 10 12 13 13 14 +15 21 28 37 48 65 73 82 79 58 42 41 40 36 32 30 29 29 28 30 32 46 54 33 11 9 9 +8 8 8 7 7 8 7 10 23 41 61 44 17 16 29 58 39 24 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 +8 8 8 9 9 10 10 11 12 14 17 19 24 36 51 65 78 72 46 37 38 37 33 29 29 28 27 26 +27 34 50 53 36 12 9 9 8 8 8 8 8 8 7 7 10 25 70 52 18 11 10 15 20 25 7 7 7 7 6 +6 6 6 6 6 6 6 7 7 7 7 7 7 7 8 9 9 10 10 12 13 14 15 21 30 37 48 66 65 38 33 34 +33 30 28 26 26 25 25 28 36 48 58 65 30 14 9 7 7 7 7 7 8 8 7 7 33 93 71 45 28 +38 70 63 31 7 7 7 7 6 6 6 5 6 6 6 6 6 6 7 7 7 6 6 7 9 9 9 9 10 11 12 12 17 27 +31 33 42 48 34 30 30 30 28 26 25 24 23 25 29 34 48 76 89 50 24 12 7 6 7 7 7 7 +7 7 6 37 86 88 131 126 100 107 78 29 7 7 8 8 8 8 7 6 6 6 6 6 6 6 7 7 6 6 7 8 9 +10 9 8 9 9 10 9 10 18 26 29 29 33 31 30 27 27 27 24 22 21 23 29 31 37 60 88 89 +65 41 24 11 6 6 6 6 6 7 7 5 29 81 85 122 116 88 88 59 23 8 8 8 10 10 9 8 7 8 7 +6 6 6 7 7 8 7 8 9 10 11 11 10 9 9 10 11 9 8 11 18 25 25 25 27 28 26 26 25 22 +20 20 24 30 32 40 63 86 91 71 57 50 28 10 5 5 6 6 6 5 5 25 62 69 75 77 77 75 +54 21 10 10 10 11 12 12 11 10 10 10 8 8 8 8 9 9 10 10 11 13 13 13 11 10 10 11 +11 10 10 10 16 27 31 27 26 25 23 22 22 21 51 50 24 26 33 48 59 74 88 80 71 73 +60 31 11 6 5 7 7 8 19 38 47 57 64 62 68 63 50 22 10 10 12 13 13 14 14 13 13 13 +12 12 12 10 9 9 10 12 13 15 15 13 12 11 11 11 31 36 28 43 38 37 39 37 39 40 36 +23 22 48 68 58 29 32 46 77 81 82 83 81 78 78 77 71 69 57 35 11 9 13 28 51 51 +52 58 69 82 68 44 26 9 10 12 13 14 15 15 15 15 13 12 12 12 11 10 10 11 12 14 +15 14 13 12 12 11 26 78 52 32 49 39 43 46 36 45 57 73 65 60 70 58 51 43 39 78 +79 67 81 81 82 83 84 87 87 89 90 97 63 17 14 47 85 82 86 117 154 160 112 44 30 +8 9 10 11 14 16 16 17 15 17 14 12 11 11 11 10 11 12 14 15 13 12 11 11 12 41 39 +34 38 37 33 38 40 42 48 53 67 77 73 63 58 50 58 73 85 65 40 52 74 83 85 86 87 +86 88 87 95 97 67 46 152 192 186 210 237 236 215 161 64 51 8 7 8 10 12 15 18 +17 24 61 54 26 14 9 8 8 10 12 14 15 11 9 8 10 26 40 36 34 43 51 44 39 41 50 48 +57 61 72 71 56 59 57 57 64 65 52 39 40 61 80 82 87 87 92 93 92 94 80 96 39 182 +255 242 246 255 253 247 214 132 121 10 9 8 9 11 14 19 18 33 105 127 103 78 43 +18 14 11 12 13 12 15 22 20 20 33 38 41 40 46 57 56 54 57 59 65 68 73 77 69 55 +54 55 63 71 46 41 44 52 61 64 76 88 84 90 92 91 93 89 98 64 128 255 253 251 +245 247 232 190 205 213 13 12 10 8 9 13 17 18 26 90 132 141 143 112 62 36 22 +11 10 19 53 76 60 57 42 37 41 48 58 65 60 68 68 61 68 77 77 77 64 53 52 55 57 +72 58 45 46 52 64 52 70 76 83 93 90 94 95 96 92 59 58 207 253 252 244 246 227 +164 227 241 17 16 13 11 10 12 16 16 21 74 121 129 131 120 103 80 55 36 33 60 +80 67 57 69 55 46 51 58 60 60 60 62 58 54 52 62 83 76 60 63 72 64 61 73 65 56 +48 46 49 46 55 60 80 101 91 93 98 91 101 52 21 155 252 252 251 252 254 205 235 +243 20 20 17 15 12 13 16 17 21 71 110 113 120 116 122 120 110 72 66 74 67 54 +59 73 64 55 54 44 49 61 63 63 55 48 49 53 57 66 68 68 75 64 51 65 65 69 50 48 +45 43 42 47 77 99 95 92 96 102 113 71 17 153 255 254 252 240 253 250 238 242 +22 21 20 18 17 17 18 19 22 60 88 92 103 94 79 69 72 70 67 70 67 50 62 70 60 50 +48 44 54 66 63 65 55 45 51 70 51 48 53 56 54 50 52 62 71 81 66 50 43 40 39 40 +64 93 84 90 101 100 91 55 33 203 255 255 223 184 207 238 207 209 21 21 21 20 +20 19 20 20 20 32 52 64 73 58 44 32 63 83 72 76 65 44 53 55 52 46 46 48 57 66 +76 81 78 74 78 74 55 53 67 69 58 46 51 65 65 57 53 62 45 36 37 35 49 95 103 +104 106 93 84 83 68 148 180 133 103 103 125 161 194 161 20 20 20 19 20 20 21 +22 21 20 25 41 66 70 66 45 52 70 82 72 48 36 53 63 57 44 49 51 59 72 64 69 73 +75 78 72 73 70 81 73 63 73 59 63 57 49 48 68 52 54 55 46 41 87 116 111 108 91 +83 56 49 54 43 53 72 93 98 90 120 125 20 20 19 19 20 20 20 22 22 21 21 29 53 +87 94 83 69 58 76 63 41 35 56 71 74 65 47 53 66 71 73 78 74 72 79 87 96 73 56 +43 55 73 62 52 47 37 38 60 63 74 78 67 45 72 120 111 102 87 78 27 44 59 71 82 +84 89 94 83 115 135 20 20 20 20 20 20 21 22 22 21 20 32 65 82 102 89 78 70 62 +52 37 43 55 61 61 75 58 57 71 77 77 79 73 69 80 100 81 53 33 23 39 48 64 52 50 +41 47 67 64 79 78 72 50 55 125 113 96 87 59 21 60 80 82 76 75 79 85 89 103 88 +21 21 21 21 21 21 21 20 27 34 35 52 81 76 70 84 89 75 62 51 37 50 52 51 62 64 +67 62 72 87 80 65 62 61 65 62 61 51 63 64 57 78 64 60 64 74 77 70 60 74 77 74 +52 48 129 106 89 87 35 25 61 72 69 68 72 76 77 90 84 49 22 22 22 22 22 22 20 +28 56 60 54 68 90 115 123 61 55 78 68 58 44 49 69 49 59 64 65 65 71 73 83 75 +78 81 60 70 68 81 106 101 76 58 64 65 63 79 83 67 61 72 79 75 56 42 120 95 87 +81 16 24 59 70 61 64 69 72 74 81 72 43 20 22 23 23 23 21 28 51 58 44 64 115 +185 215 196 114 59 78 87 69 60 46 51 66 53 70 67 62 67 60 55 81 87 100 95 76 +74 83 93 87 63 67 62 58 66 69 68 58 64 73 78 75 60 44 108 94 87 54 11 15 44 60 +56 60 65 66 60 49 28 24 18 20 23 25 23 30 54 56 41 54 96 147 174 167 127 61 37 +50 92 100 79 63 49 53 56 70 70 63 65 52 44 53 56 88 81 63 80 72 67 77 72 71 65 +64 68 70 69 60 63 71 75 74 60 59 99 86 87 29 20 13 24 49 52 55 60 54 47 40 33 +35 14 15 21 23 30 49 49 36 46 78 97 100 95 90 76 39 25 30 54 98 114 86 51 45 +52 58 54 61 61 50 50 51 47 67 61 52 68 76 79 79 80 73 64 65 69 71 65 60 61 66 +72 71 58 82 92 86 57 9 13 9 23 41 45 50 55 52 47 45 44 43 9 11 16 19 34 41 26 +35 62 78 77 72 70 72 64 35 26 28 63 85 107 114 50 45 50 57 53 52 58 51 50 51 +52 56 51 56 78 81 78 79 80 73 61 64 70 73 64 57 59 59 58 57 60 94 86 87 18 6 8 +24 101 56 44 57 60 54 52 46 46 50 7 7 10 14 28 32 33 64 79 71 69 69 74 72 51 +30 28 28 49 83 96 65 51 51 58 56 50 47 65 54 51 50 53 59 61 72 78 70 68 76 73 +64 61 66 73 77 65 54 53 53 49 48 75 88 86 40 9 7 16 107 145 57 44 62 59 50 50 +49 49 56 7 7 8 11 19 26 44 87 91 67 69 78 71 53 33 27 28 29 35 75 72 60 60 56 +63 50 46 50 63 48 49 52 53 58 68 74 69 75 82 72 64 63 65 69 72 72 62 47 45 45 +40 42 92 85 59 14 7 11 69 136 87 25 42 58 51 48 54 55 53 64 12 12 11 14 18 22 +33 64 80 58 51 56 45 32 28 29 30 36 41 58 64 64 58 53 59 44 41 60 72 41 44 50 +59 66 70 69 81 80 56 61 63 66 69 71 70 71 60 43 37 35 29 52 92 63 36 9 17 67 +82 72 20 14 43 57 50 52 56 60 61 73 19 20 20 20 22 25 26 35 42 36 26 23 24 27 +31 32 36 46 39 51 64 62 58 56 58 44 35 48 60 61 60 61 69 72 67 50 43 46 59 71 +68 67 67 68 69 69 54 37 31 27 24 64 54 43 37 38 101 64 24 11 8 13 44 60 56 58 +57 66 77 67 27 28 28 27 28 29 30 29 29 28 26 19 16 20 25 28 44 61 56 44 54 60 +57 57 58 46 29 39 47 56 68 68 71 72 58 38 36 42 60 72 74 70 67 65 62 53 37 30 +27 23 23 44 38 39 50 79 27 7 10 9 10 12 46 66 63 62 62 74 74 50 30 31 31 31 30 +32 32 31 31 31 31 26 17 14 15 16 19 53 76 51 48 56 56 56 56 45 27 29 44 61 75 +58 44 43 34 34 35 36 42 57 72 72 66 54 41 31 26 25 23 19 28 37 39 41 36 16 7 11 +18 11 10 11 46 67 64 65 73 78 50 48 31 31 31 31 31 31 32 32 32 32 32 32 23 15 +13 12 13 40 80 79 55 51 55 57 58 56 42 46 65 74 59 35 31 27 23 25 27 28 30 35 +44 49 43 33 28 25 23 22 20 20 33 34 39 42 49 39 20 33 19 10 10 12 47 67 64 69 +78 53 49 48 31 31 30 33 32 33 32 33 33 32 33 33 31 21 13 12 30 49 66 96 69 58 +60 64 67 71 70 73 74 69 55 34 28 26 24 24 23 22 22 22 25 28 29 26 24 23 21 21 +18 22 32 34 39 38 23 27 38 19 11 11 10 11 39 67 66 76 58 45 53 46 31 31 32 31 +31 32 32 32 33 33 33 33 30 30 25 12 25 36 42 55 58 59 56 56 63 66 68 68 68 68 +56 33 24 24 26 25 24 23 22 23 22 22 22 22 21 20 19 18 17 23 34 37 38 36 33 31 +24 12 10 11 10 10 28 62 73 64 43 47 52 42 31 32 33 32 32 32 32 32 33 33 32 28 +41 90 110 49 11 10 11 11 18 40 60 61 65 66 66 64 61 61 62 41 25 24 25 25 24 23 +23 23 22 21 21 21 20 19 18 17 15 21 38 39 36 27 19 11 13 15 12 10 10 10 21 60 +75 45 41 46 46 39 31 32 32 32 32 32 32 33 33 32 29 56 162 246 255 197 75 15 11 +10 7 17 84 64 63 67 65 65 61 58 64 49 28 24 24 24 23 23 23 23 21 20 19 19 18 +18 17 16 14 19 39 33 19 11 8 8 8 11 15 10 8 9 16 61 61 35 40 44 44 37 32 32 32 +32 32 32 33 33 33 32 37 136 255 255 255 251 214 90 18 10 17 83 221 204 81 49 +54 59 60 60 62 51 29 25 23 23 22 22 23 23 20 18 17 17 17 18 17 14 12 20 29 13 +9 10 10 10 9 9 12 14 9 6 15 68 46 31 34 39 45 30 32 32 32 32 32 32 33 33 33 31 +32 111 239 251 243 242 251 180 39 16 77 210 250 255 253 132 45 42 56 56 59 44 +29 25 24 23 22 22 22 21 18 17 17 16 16 17 17 16 18 24 10 8 9 9 9 9 9 9 9 12 13 +7 17 55 28 29 28 36 44 19 33 33 33 33 33 33 33 34 33 38 97 202 255 254 242 241 +251 171 41 46 152 253 254 253 255 255 197 63 40 51 54 40 28 25 24 23 21 20 20 +18 18 17 16 17 17 18 19 21 45 37 7 9 9 9 8 8 8 8 7 8 11 11 16 21 19 27 24 35 +39 12 33 33 33 33 33 32 33 34 33 54 190 255 255 248 202 201 218 160 110 154 +226 255 254 252 252 252 255 250 106 38 46 44 32 25 22 21 21 21 19 18 19 18 18 +17 19 20 21 21 52 23 7 9 9 9 8 8 8 8 7 8 8 9 10 10 12 20 23 36 33 9 33 33 33 +33 33 33 33 35 34 43 152 254 255 243 210 209 201 170 199 248 255 254 252 252 +252 251 251 252 255 175 59 34 28 23 21 21 22 22 21 20 20 19 18 17 13 20 24 26 +42 11 9 9 9 9 8 8 8 7 7 7 7 8 8 12 13 10 15 31 25 8 32 33 33 33 33 33 34 35 35 +43 140 251 254 252 228 186 171 193 241 252 254 252 252 252 252 251 252 246 253 +255 249 147 57 25 16 16 18 20 19 19 19 18 18 28 15 12 15 39 27 9 11 11 11 11 +11 11 10 9 8 7 6 7 7 8 14 15 10 17 18 9 31 32 34 33 33 33 34 35 34 42 156 254 +254 252 229 159 134 210 255 254 253 252 252 252 252 252 252 248 252 254 255 +255 255 230 179 136 25 17 20 20 20 19 19 31 16 13 16 33 26 15 12 11 11 12 12 +13 12 12 11 11 9 7 7 6 7 14 15 14 15 10 31 32 35 34 34 35 34 34 35 60 161 241 +239 214 176 136 135 197 248 252 252 253 253 251 251 250 252 252 241 219 247 +254 254 254 251 198 34 18 20 19 19 18 18 17 19 29 30 22 22 21 17 13 12 12 12 +12 12 12 13 14 13 12 11 12 23 24 15 18 22 12 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_p3.ppm b/ImageMagick-6.9.12-44/PerlMagick/t/input_p3.ppm new file mode 100644 index 0000000..d131158 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input_p3.ppm @@ -0,0 +1,809 @@ +P3 +70 46 +255 + 48 47 45 50 48 46 54 50 47 56 51 46 + 58 51 45 57 50 45 56 48 45 57 49 46 + 56 48 45 56 48 45 55 47 44 53 45 42 + 52 44 41 53 45 42 53 45 42 49 45 39 + 49 46 39 52 49 42 55 52 45 57 54 47 + 63 58 47 70 63 51 74 66 52 76 65 50 + 78 66 50 85 65 50 116 68 52 154 67 51 + 180 65 53 197 69 61 224 68 71 237 67 70 + 246 61 66 241 60 64 214 64 59 184 63 47 + 178 63 45 173 64 45 163 65 43 152 64 43 + 146 63 46 145 61 44 146 61 43 147 61 42 + 149 63 46 153 63 51 177 66 51 187 68 54 + 149 70 57 82 58 47 58 53 51 55 50 49 + 55 50 47 54 49 46 51 48 44 47 47 45 + 48 47 45 51 44 45 54 43 45 80 55 56 + 130 73 71 157 98 110 140 124 166 108 112 165 + 80 72 110 82 76 97 117 119 124 149 154 144 + 122 124 108 89 86 83 47 46 44 48 47 45 + 53 48 45 55 49 45 56 49 44 56 48 44 + 54 47 44 56 49 45 56 49 45 56 49 46 + 55 46 44 52 45 42 52 44 42 54 47 43 + 54 46 43 51 47 42 51 48 42 52 49 43 + 54 51 45 55 53 48 62 56 45 69 61 50 + 72 63 49 73 62 46 75 64 47 77 68 51 + 105 69 52 140 64 46 166 60 45 186 71 60 + 220 68 71 235 66 69 252 60 65 247 60 64 + 209 65 59 177 63 45 176 63 43 173 63 44 + 162 64 43 151 63 43 145 62 46 144 61 44 + 145 61 42 144 59 42 145 62 45 152 62 51 + 186 64 52 200 68 56 147 72 59 68 55 44 + 57 53 53 57 51 49 54 50 47 54 50 46 + 49 49 45 45 49 46 48 48 46 53 47 46 + 50 42 44 69 50 49 120 65 53 148 89 92 + 134 125 171 99 108 172 74 62 107 75 64 92 + 93 94 103 128 134 126 108 112 95 89 87 83 + 44 44 44 44 45 43 48 47 44 49 46 43 + 50 44 40 50 45 42 48 44 43 50 44 43 + 50 43 43 50 44 43 50 44 43 49 44 43 + 49 44 41 51 45 44 51 45 44 51 47 44 + 51 49 44 52 48 44 53 50 45 55 53 48 + 58 51 44 62 54 45 64 54 45 67 56 45 + 72 59 47 69 69 53 85 68 52 109 61 43 + 132 57 40 159 69 52 192 72 61 220 69 64 + 246 60 62 236 62 61 185 65 48 165 64 42 + 169 63 45 165 62 45 155 63 44 145 62 41 + 142 62 44 140 61 45 139 60 45 137 59 46 + 137 63 47 155 66 49 195 64 56 195 71 68 + 137 87 78 60 63 53 59 52 49 57 51 46 + 53 51 46 49 52 47 45 52 46 44 52 48 + 47 51 47 49 50 48 48 48 46 51 45 43 + 73 46 33 108 77 78 138 135 189 107 113 198 + 72 61 127 61 49 88 53 52 72 62 70 70 + 73 83 73 89 90 79 44 45 47 43 45 47 + 46 45 45 47 45 41 47 42 39 45 43 40 + 44 42 42 44 42 42 46 43 43 46 43 43 + 46 43 43 47 43 43 47 45 45 48 44 44 + 48 45 46 47 45 42 50 46 44 50 46 43 + 50 45 44 51 48 46 56 50 47 60 52 47 + 62 52 47 65 53 45 70 57 49 72 62 55 + 81 60 53 95 55 48 121 55 45 147 59 47 + 163 65 51 188 69 57 222 69 64 218 72 65 + 167 66 47 155 64 44 158 62 45 156 61 47 + 148 61 45 140 61 43 136 60 43 135 60 44 + 133 60 46 130 60 50 134 67 55 157 71 58 + 186 69 64 180 103 95 143 138 121 87 101 87 + 67 66 56 55 53 43 47 49 42 46 49 43 + 45 48 44 45 48 47 47 48 46 48 50 46 + 47 50 46 47 45 50 52 42 44 103 99 98 + 154 157 206 126 135 208 105 112 158 89 92 111 + 96 112 114 130 150 140 124 143 129 95 101 81 + 44 47 50 43 47 50 46 46 48 45 46 45 + 45 43 41 44 42 43 43 41 43 40 39 40 + 42 42 43 44 42 43 44 42 43 42 41 41 + 42 40 41 45 43 44 46 45 46 47 44 43 + 48 44 43 46 42 41 47 43 43 48 45 45 + 56 49 49 60 51 50 59 50 49 62 48 46 + 65 50 47 65 55 51 66 58 54 75 54 50 + 104 55 47 137 61 48 149 62 53 152 65 51 + 175 68 55 186 71 60 158 63 51 146 63 44 + 148 61 43 149 59 45 142 60 45 135 59 44 + 135 57 41 130 57 42 127 58 46 127 63 55 + 134 71 64 151 69 62 174 85 82 163 145 123 + 140 171 140 114 129 112 83 90 71 60 64 51 + 48 49 40 45 41 39 50 44 43 50 44 43 + 48 44 42 48 45 43 48 47 43 50 42 49 + 48 41 40 101 113 82 149 161 156 143 165 163 + 166 202 179 164 199 176 143 182 151 153 186 152 + 133 161 132 89 100 74 46 48 46 47 47 45 + 47 49 46 50 49 46 51 48 45 51 47 44 + 50 45 42 45 42 43 44 43 44 42 41 45 + 43 40 44 45 39 44 43 40 41 44 42 41 + 45 45 43 47 45 44 46 43 42 47 43 41 + 52 44 41 54 47 42 59 51 46 61 52 48 + 59 49 45 59 47 46 62 47 46 62 51 44 + 53 57 47 57 51 44 79 44 39 105 58 45 + 131 65 49 142 64 49 146 59 45 152 66 50 + 148 62 50 147 60 47 137 61 46 137 63 47 + 139 60 47 132 57 44 123 59 44 118 58 42 + 125 59 48 134 71 59 135 75 68 149 81 79 + 147 129 112 144 169 139 137 173 142 119 150 121 + 92 123 90 78 94 71 61 58 51 50 39 40 + 47 39 41 45 40 43 48 40 44 50 40 47 + 49 43 48 48 42 48 43 39 31 91 102 64 + 145 162 118 140 170 118 160 201 140 157 195 147 + 132 175 126 135 173 130 118 142 112 79 91 68 + 50 51 45 51 52 45 53 51 46 57 54 49 + 57 54 49 58 50 46 56 48 45 51 46 44 + 51 48 48 45 46 48 47 40 47 49 41 46 + 47 42 44 49 46 42 49 48 42 48 49 46 + 47 48 48 52 47 43 59 49 43 65 53 44 + 67 56 47 65 57 48 61 53 45 59 48 47 + 60 49 47 69 49 45 82 41 46 70 42 46 + 55 48 41 82 47 40 106 57 46 131 58 55 + 134 57 52 127 63 53 132 66 54 137 65 49 + 133 62 45 136 58 43 133 59 42 118 62 41 + 118 56 44 115 57 45 123 64 52 137 71 62 + 136 78 69 134 100 86 122 146 113 123 175 136 + 131 177 140 118 158 124 101 146 103 100 135 101 + 80 102 80 52 61 48 42 38 35 46 36 38 + 43 42 42 41 43 44 39 43 47 39 39 45 + 41 36 34 87 92 72 126 145 106 123 156 106 + 126 163 111 127 165 111 125 165 116 126 161 123 + 111 137 108 76 86 68 55 56 50 55 56 50 + 57 57 52 60 58 53 64 61 56 66 58 56 + 65 57 53 61 55 51 60 55 53 58 53 52 + 57 48 48 57 47 47 54 49 46 54 50 46 + 54 51 46 54 52 49 57 55 51 63 55 50 + 66 57 48 72 61 49 74 62 52 72 61 52 + 66 56 48 64 54 49 63 54 50 60 57 52 + 67 53 52 65 53 48 60 54 42 69 53 39 + 99 54 45 135 61 59 144 66 65 132 67 59 + 132 62 54 127 65 53 126 58 47 121 59 47 + 117 62 46 122 52 41 185 80 76 172 91 86 + 112 74 57 107 83 64 115 96 73 127 122 88 + 182 102 96 191 122 114 162 161 133 143 160 126 + 139 151 118 128 158 120 111 147 111 88 105 77 + 63 59 41 51 41 34 37 43 33 43 47 38 + 58 38 42 67 41 41 84 78 58 104 113 82 + 104 131 87 107 145 92 110 154 99 107 152 104 + 115 156 116 116 149 116 104 134 100 78 88 67 + 56 57 51 57 58 52 62 62 56 65 63 58 + 68 63 58 70 65 60 69 65 58 69 64 58 + 71 63 56 69 61 52 68 59 49 67 58 51 + 67 58 51 60 56 48 57 53 47 57 52 47 + 60 55 48 66 60 48 73 61 48 79 65 50 + 80 64 53 75 60 52 69 58 49 65 58 49 + 61 60 51 71 55 48 139 69 74 154 71 73 + 134 67 58 171 75 72 162 70 57 166 63 51 + 168 67 53 162 69 49 170 64 50 172 62 66 + 158 67 69 118 67 57 121 58 52 191 60 72 + 225 69 71 195 85 80 112 89 67 96 106 72 + 144 108 83 232 83 90 255 40 72 255 41 75 + 249 64 86 240 77 95 228 89 104 219 102 110 + 212 106 114 210 95 109 212 87 107 194 80 98 + 150 70 79 82 46 40 62 51 40 71 64 45 + 101 94 58 119 131 92 110 135 92 109 137 89 + 115 143 100 126 152 123 140 162 142 128 150 129 + 100 125 95 83 95 71 54 55 49 54 56 49 + 61 61 56 66 64 59 70 65 63 72 67 62 + 72 67 62 74 68 60 77 66 55 74 61 48 + 72 60 45 70 61 47 69 59 48 65 57 49 + 60 55 49 58 55 46 62 57 44 69 60 47 + 77 63 47 79 65 48 79 62 49 75 59 49 + 68 58 47 62 61 49 55 61 48 128 66 64 + 237 75 93 203 51 53 155 59 35 193 63 53 + 172 59 48 179 62 51 183 68 55 165 58 40 + 185 62 50 209 62 56 239 56 63 225 60 60 + 212 68 63 235 55 59 218 46 39 196 66 58 + 146 100 79 136 99 74 222 99 94 247 59 69 + 224 66 67 245 70 79 254 46 69 255 44 72 + 255 48 84 255 52 92 255 58 104 255 58 111 + 255 65 114 255 71 111 255 90 120 198 91 102 + 97 61 51 72 67 47 127 118 100 154 159 149 + 145 158 152 152 160 154 182 181 173 209 203 198 + 212 204 211 176 177 177 103 123 101 87 103 76 + 51 51 48 53 53 49 56 56 51 61 60 54 + 68 67 57 71 71 62 74 73 59 77 73 54 + 73 69 55 77 72 74 72 64 57 69 59 43 + 67 57 45 63 56 48 62 56 51 61 55 49 + 62 57 52 64 61 57 73 65 54 80 64 45 + 72 63 45 75 56 49 67 55 52 53 61 48 + 64 63 47 166 73 64 175 52 43 164 52 33 + 166 65 38 169 58 36 160 54 39 169 61 50 + 172 65 49 176 64 50 191 64 52 204 56 41 + 232 49 43 249 43 43 243 48 41 225 54 37 + 216 53 33 199 57 44 197 85 73 224 85 81 + 254 65 75 223 63 65 174 59 46 196 69 59 + 236 65 68 252 62 72 253 65 81 255 61 86 + 254 62 104 251 62 113 252 69 119 249 74 110 + 253 87 120 255 89 127 205 93 110 135 110 100 + 211 200 193 224 224 234 230 214 240 245 225 249 + 253 243 249 253 244 243 245 231 240 211 206 210 + 133 141 131 117 129 110 49 48 45 47 46 44 + 52 51 47 56 57 50 62 63 53 71 68 59 + 79 75 56 77 75 52 88 87 87 128 131 165 + 124 120 160 91 84 111 70 63 79 57 52 52 + 54 50 38 53 50 41 58 57 46 66 61 45 + 75 64 47 80 64 47 67 59 42 58 52 41 + 48 52 48 66 49 45 138 54 60 174 59 47 + 164 60 39 161 59 37 181 62 44 199 61 49 + 184 59 49 173 57 42 179 58 43 195 63 50 + 196 51 42 214 52 44 220 56 46 241 49 43 + 240 47 40 212 53 32 218 52 33 212 57 44 + 208 63 54 219 67 65 222 65 62 199 62 51 + 174 57 40 175 61 45 213 69 64 243 70 75 + 247 68 75 254 68 88 254 66 98 255 74 116 + 255 75 125 254 77 122 254 84 116 243 67 99 + 228 123 136 137 95 84 241 211 201 255 255 255 + 255 245 255 255 248 255 255 255 254 255 254 251 + 255 249 253 242 233 236 192 191 184 181 186 176 + 58 56 49 54 51 45 51 48 43 55 52 44 + 60 59 50 73 65 54 86 74 57 84 72 58 + 100 97 114 158 165 228 172 178 255 157 161 236 + 143 143 197 110 109 142 76 73 88 64 63 77 + 60 57 57 65 61 40 66 67 46 56 65 57 + 58 69 81 69 85 97 70 83 82 97 71 60 + 148 70 55 168 61 43 174 65 45 176 59 40 + 191 54 42 212 56 48 210 58 52 206 56 50 + 211 58 51 215 59 50 223 63 55 235 49 39 + 244 45 40 249 45 40 235 50 40 210 55 33 + 207 55 34 209 53 40 217 67 60 221 86 77 + 186 62 50 179 58 35 185 58 41 198 64 55 + 210 72 70 216 71 72 237 70 74 251 79 92 + 248 70 96 253 74 110 252 82 122 247 88 122 + 253 85 113 249 83 103 255 96 112 213 75 85 + 225 170 164 255 255 254 252 255 255 253 253 254 + 254 250 245 255 250 249 254 240 244 234 220 219 + 239 230 219 235 237 228 68 64 53 65 61 51 + 59 54 45 53 50 40 58 53 47 70 61 55 + 84 71 54 87 70 55 93 85 106 144 153 222 + 171 184 255 181 190 255 185 190 255 167 167 239 + 128 124 194 102 92 158 82 76 115 55 58 67 + 58 57 55 82 74 78 134 115 155 170 129 174 + 186 93 123 200 75 80 179 60 39 169 57 35 + 179 58 42 193 59 45 212 60 51 225 59 51 + 219 54 49 229 62 57 230 60 55 220 56 47 + 227 68 57 244 63 52 251 41 41 250 43 43 + 227 50 44 207 50 37 201 60 40 208 58 42 + 212 55 45 228 76 72 209 67 64 187 57 36 + 191 57 40 199 62 50 211 81 73 196 69 62 + 224 78 73 231 81 83 240 84 97 253 86 110 + 251 78 111 253 85 120 255 87 111 255 90 105 + 252 87 101 202 79 84 161 116 110 250 225 224 + 252 255 255 250 255 255 254 249 247 255 250 245 + 250 239 240 220 206 201 249 242 224 249 251 238 + 79 73 59 77 71 58 70 64 53 63 57 48 + 61 54 48 65 61 56 77 69 53 83 68 46 + 87 76 83 132 142 193 166 174 251 176 178 255 + 178 180 255 169 172 249 156 160 237 139 141 216 + 111 122 182 97 101 135 133 78 95 203 79 87 + 239 76 93 220 72 82 210 59 62 230 62 62 + 206 62 53 188 62 47 198 63 50 212 62 52 + 217 57 47 219 51 43 218 55 47 222 56 47 + 217 51 41 209 51 36 202 57 34 219 62 48 + 254 56 59 247 48 53 219 50 48 223 53 52 + 239 53 51 226 55 43 217 62 47 227 80 74 + 220 69 73 208 61 51 194 56 43 188 60 45 + 192 67 50 188 61 45 199 72 61 206 78 74 + 230 92 97 254 102 118 253 80 109 250 90 117 + 241 114 120 243 98 112 238 123 128 146 117 101 + 86 80 65 224 195 196 255 253 255 253 254 255 + 255 252 254 253 255 248 255 255 250 237 231 220 + 250 248 222 251 252 233 87 78 63 86 77 63 + 80 73 58 75 66 52 70 60 49 69 64 55 + 76 71 53 83 71 46 86 78 81 131 139 189 + 163 164 246 164 164 255 164 173 255 164 173 240 + 174 173 246 160 175 254 161 171 224 186 118 141 + 222 65 78 239 60 63 229 59 55 202 64 49 + 209 70 59 237 61 65 224 57 60 204 64 58 + 199 69 57 187 54 40 200 50 43 220 52 49 + 222 59 47 223 55 41 211 52 33 196 54 33 + 198 55 38 206 53 41 214 53 43 228 56 46 + 233 52 50 235 45 53 247 42 48 228 49 41 + 203 53 36 217 76 65 218 72 73 223 77 75 + 199 56 46 193 58 40 187 59 39 183 59 42 + 180 60 47 187 64 51 226 94 86 247 110 109 + 246 103 112 241 103 113 237 116 114 251 111 117 + 255 122 139 136 151 124 65 81 51 221 196 192 + 255 255 255 255 254 255 251 255 254 238 255 240 + 255 255 249 255 254 241 254 248 226 253 250 234 + 91 80 65 91 79 65 89 77 63 84 74 58 + 84 71 57 78 71 60 82 74 57 87 75 52 + 88 81 84 127 128 170 148 151 212 149 151 228 + 153 162 236 148 159 216 136 144 208 135 133 190 + 197 105 149 230 61 80 226 64 58 231 62 67 + 225 63 70 195 62 59 214 71 70 232 62 65 + 215 63 59 196 61 49 192 63 48 185 59 43 + 205 58 46 228 57 51 224 51 47 228 52 46 + 209 56 42 186 59 43 198 59 54 233 60 57 + 201 57 37 194 57 33 207 51 38 212 53 47 + 207 55 43 200 56 38 201 61 41 219 62 53 + 232 64 66 237 85 83 221 71 61 199 57 41 + 183 58 42 175 60 45 172 60 46 175 58 42 + 209 86 71 240 109 106 233 97 103 241 98 109 + 250 110 113 255 100 108 248 87 112 117 136 105 + 88 110 69 241 229 212 255 255 255 255 255 255 + 226 249 230 197 235 200 226 239 213 253 248 230 + 244 230 214 242 232 221 91 78 62 90 78 62 + 91 78 61 88 77 60 90 76 60 87 75 63 + 88 76 60 90 76 56 85 76 71 100 95 117 + 119 120 154 130 128 186 137 134 205 123 123 182 + 102 109 166 124 82 98 220 59 70 255 51 63 + 233 69 62 238 67 78 220 66 71 182 64 53 + 198 67 59 209 52 49 198 66 53 189 59 41 + 190 57 37 193 58 37 212 56 40 229 52 43 + 247 49 51 255 44 51 251 45 49 243 46 56 + 251 40 62 246 40 48 211 48 39 205 56 40 + 228 59 50 232 61 52 208 68 54 192 54 38 + 202 53 41 227 55 53 229 46 47 214 52 42 + 206 53 42 212 74 62 184 62 49 169 54 42 + 168 58 43 166 55 38 188 72 62 238 113 114 + 247 115 126 250 114 123 253 115 123 254 86 101 + 249 68 97 152 160 125 125 154 103 203 204 174 + 212 226 198 175 202 170 149 184 142 143 188 134 + 168 199 154 206 213 186 238 222 212 221 203 197 + 91 76 60 91 76 60 92 76 60 89 73 59 + 90 75 59 91 76 62 94 77 60 94 80 60 + 91 78 65 89 76 73 94 83 100 109 101 155 + 135 127 196 155 126 180 171 113 163 181 64 71 + 201 62 43 232 64 57 252 60 64 233 66 74 + 191 60 55 166 57 40 199 66 56 221 59 56 + 207 68 58 186 55 36 196 59 40 201 56 39 + 218 52 39 238 57 46 227 52 39 238 44 36 + 245 41 39 248 37 50 255 22 54 243 39 54 + 237 60 68 237 49 58 254 48 58 243 43 46 + 223 56 53 232 71 71 217 54 52 221 59 54 + 213 53 42 196 56 38 195 56 43 219 81 71 + 201 60 51 205 57 49 208 58 51 191 56 43 + 179 56 45 231 107 107 255 129 137 253 122 131 + 255 114 127 255 77 100 249 63 92 130 134 94 + 103 135 81 124 133 92 97 126 81 101 141 89 + 121 161 104 134 182 116 141 185 121 148 172 127 + 192 181 166 197 181 179 91 75 58 91 75 58 + 89 75 58 89 73 57 91 75 58 93 74 60 + 94 75 60 94 79 59 94 79 59 95 78 58 + 95 75 72 97 87 119 124 119 155 194 135 155 + 245 101 119 255 52 75 228 64 70 209 67 64 + 239 66 71 218 67 64 178 59 46 164 56 38 + 206 64 54 236 56 59 232 77 69 214 80 65 + 194 54 40 207 52 42 228 54 48 238 49 47 + 242 49 57 250 45 60 245 42 60 240 45 72 + 249 46 87 248 81 99 254 92 109 238 56 79 + 213 48 53 184 55 38 204 67 54 226 83 78 + 215 67 64 203 57 46 194 55 36 167 59 37 + 172 56 41 211 70 66 222 56 51 242 51 49 + 250 48 48 229 57 49 190 52 39 217 92 87 + 255 135 139 252 124 132 252 107 124 251 72 97 + 243 62 85 89 97 55 101 128 78 129 139 100 + 126 157 109 127 171 112 136 171 111 135 177 112 + 130 185 111 133 170 113 181 182 153 195 191 190 + 92 75 55 92 75 54 92 75 54 93 76 55 + 93 76 57 93 76 59 94 77 61 93 80 61 + 93 80 61 97 77 58 99 71 62 103 93 113 + 127 134 181 179 135 166 246 117 113 255 75 85 + 243 63 81 231 61 71 219 60 61 199 62 52 + 169 59 42 180 62 47 209 56 51 222 51 43 + 219 57 39 233 77 65 210 65 51 211 58 46 + 236 55 57 247 50 62 252 34 47 255 32 45 + 246 33 43 238 37 55 247 59 86 255 99 112 + 241 78 83 203 58 53 161 54 36 135 45 24 + 173 58 48 194 56 54 216 73 69 201 59 48 + 199 56 43 180 56 43 193 56 47 222 74 64 + 226 51 46 252 46 49 250 45 48 240 50 44 + 201 52 37 197 77 69 255 143 144 255 123 136 + 255 89 116 255 63 97 210 64 83 73 89 49 + 112 149 91 133 166 111 131 170 113 124 165 102 + 126 163 102 127 168 107 126 176 101 134 178 110 + 156 182 137 150 164 151 94 77 58 94 77 58 + 94 77 58 94 77 58 94 77 58 95 76 55 + 94 78 57 86 78 65 97 88 89 111 96 109 + 109 100 112 112 120 168 131 140 234 153 131 205 + 185 118 124 232 100 92 253 77 85 242 57 65 + 222 55 55 195 66 50 169 58 43 189 71 62 + 197 66 57 202 54 43 222 54 39 227 52 46 + 224 68 55 220 60 46 240 48 51 255 68 78 + 245 67 71 230 47 45 225 44 40 222 50 51 + 223 62 67 217 63 67 220 55 56 202 51 46 + 210 79 74 212 79 81 202 73 71 233 85 85 + 218 69 65 212 66 58 222 60 55 243 50 61 + 245 55 63 232 62 58 220 49 42 243 50 48 + 248 46 50 243 48 46 205 52 37 186 72 60 + 255 147 149 253 113 129 255 70 104 255 60 100 + 157 65 71 78 98 60 114 150 90 121 161 99 + 117 159 96 118 157 95 122 161 100 123 166 100 + 123 169 90 135 179 104 137 170 118 108 130 103 + 95 79 61 95 79 63 95 79 62 95 79 61 + 95 79 61 96 80 55 92 76 57 95 91 97 + 125 124 160 129 125 178 113 118 184 124 134 198 + 154 155 199 186 175 183 200 182 150 178 112 82 + 198 76 65 240 72 74 232 55 57 213 58 50 + 187 55 46 186 73 63 205 102 88 193 64 51 + 218 50 43 228 49 44 225 61 49 228 55 41 + 240 45 41 240 53 53 241 82 88 234 74 81 + 235 81 86 236 86 91 213 64 66 234 57 63 + 235 45 55 242 74 86 255 111 122 255 102 118 + 231 82 78 215 53 51 220 65 60 220 69 60 + 224 52 48 252 44 58 255 53 63 231 54 51 + 221 52 42 240 50 47 251 46 50 245 47 45 + 211 53 41 178 60 51 254 136 143 248 98 119 + 255 62 99 244 65 100 92 59 47 76 95 62 + 117 145 94 123 158 99 111 151 87 114 154 88 + 120 158 94 121 163 91 119 166 86 128 171 97 + 128 159 104 101 124 86 91 77 61 95 80 64 + 95 82 66 96 82 67 96 82 64 92 79 66 + 99 89 97 119 119 154 119 124 185 99 106 180 + 122 122 214 175 172 219 228 225 182 248 242 164 + 235 232 171 184 181 145 160 121 100 214 108 103 + 246 87 90 234 54 58 218 54 51 189 58 49 + 187 79 65 211 88 73 208 49 39 232 62 60 + 226 64 55 224 48 37 233 45 39 219 51 42 + 207 57 53 238 83 87 245 86 98 255 100 111 + 251 97 103 246 47 55 246 40 54 247 70 83 + 250 94 102 247 84 91 223 55 51 230 54 52 + 221 56 50 214 56 48 228 58 53 231 59 59 + 232 54 53 216 53 43 226 54 42 243 48 45 + 250 47 52 246 48 47 218 57 46 185 56 50 + 252 119 130 255 82 112 255 60 100 193 74 91 + 61 60 38 65 74 48 104 126 83 116 148 88 + 104 146 76 109 150 81 115 155 90 115 157 84 + 108 151 77 98 138 69 78 106 52 73 97 52 + 84 72 56 89 76 60 95 82 66 98 86 68 + 96 83 63 102 93 98 123 121 158 116 122 180 + 93 102 175 108 118 193 152 157 223 193 196 231 + 216 215 215 216 211 200 194 183 188 131 135 136 + 111 106 101 153 106 100 227 121 117 255 103 101 + 244 68 65 221 61 53 194 60 49 199 66 50 + 209 60 45 227 71 70 226 73 70 224 55 48 + 227 54 48 203 57 43 186 58 38 201 61 54 + 208 58 65 243 91 103 235 87 94 224 55 51 + 246 66 73 234 63 70 230 55 57 247 53 54 + 239 53 49 238 51 48 225 58 47 223 59 51 + 232 54 53 234 55 56 233 54 52 219 54 45 + 224 55 40 239 49 43 244 51 53 244 48 47 + 219 52 42 209 68 66 250 104 117 255 59 100 + 254 64 104 128 77 71 82 80 60 69 66 45 + 79 95 57 105 135 76 101 142 68 103 145 75 + 110 149 85 104 143 76 94 135 69 89 125 67 + 87 111 66 91 115 68 68 66 54 74 69 60 + 92 77 62 96 83 62 101 95 88 122 116 145 + 115 112 167 93 95 161 105 105 187 139 136 223 + 157 157 222 162 161 214 160 155 214 158 150 206 + 149 137 193 112 103 125 94 86 82 124 83 72 + 184 89 81 236 121 115 255 128 124 239 94 90 + 201 54 45 190 53 35 202 59 42 213 58 48 + 207 55 44 220 57 47 220 56 47 197 60 42 + 194 64 49 197 61 52 193 55 51 217 80 76 + 210 75 66 204 54 36 235 47 48 248 40 58 + 252 39 63 255 31 58 255 35 56 243 46 54 + 223 58 53 224 60 53 234 55 53 238 51 53 + 228 52 48 219 55 41 220 57 38 229 54 38 + 239 53 45 237 53 41 215 52 39 237 86 92 + 255 80 107 255 56 101 205 64 88 57 53 35 + 65 66 51 55 56 33 81 90 52 100 121 78 + 95 132 65 99 140 68 108 144 78 104 141 71 + 99 134 73 99 130 74 102 127 73 98 127 68 + 52 55 45 58 58 52 79 68 59 86 76 61 + 103 101 108 108 106 145 81 81 138 91 93 165 + 121 123 206 137 137 221 140 139 209 136 133 205 + 136 129 210 141 133 200 135 130 173 126 90 106 + 92 91 76 112 87 68 207 83 86 231 102 107 + 239 133 127 254 129 122 197 59 45 187 59 35 + 198 59 41 214 54 43 204 59 43 203 54 40 + 214 58 45 200 56 40 197 58 45 200 58 47 + 202 58 48 206 63 53 200 58 46 214 49 39 + 249 47 55 255 43 61 250 42 62 254 36 58 + 255 38 57 240 53 61 218 58 54 223 59 52 + 235 53 52 241 52 56 226 54 47 213 55 41 + 217 56 38 218 54 36 215 57 38 212 59 37 + 215 61 52 254 87 108 255 55 99 252 67 106 + 107 51 61 35 47 37 47 52 29 94 89 50 + 160 179 130 115 141 96 93 131 62 109 147 75 + 112 149 81 107 143 72 105 139 77 101 132 74 + 102 131 72 103 137 71 42 48 38 43 48 43 + 57 55 53 69 67 61 90 92 105 92 93 135 + 91 90 156 121 124 214 133 136 235 130 130 218 + 129 133 202 131 130 210 139 130 219 141 134 194 + 126 120 137 115 87 82 96 95 72 100 95 67 + 174 87 80 236 90 99 243 110 106 217 75 64 + 201 55 38 200 60 39 214 56 43 213 49 40 + 197 62 43 191 58 40 219 71 59 206 57 43 + 201 58 41 200 55 40 206 55 40 215 60 47 + 218 59 48 238 54 59 249 49 63 238 45 59 + 233 51 54 245 53 56 240 55 59 225 54 53 + 219 56 53 227 58 56 239 55 56 246 54 59 + 226 56 52 207 56 42 204 58 41 205 58 39 + 194 61 33 193 60 38 233 75 77 255 66 103 + 255 54 103 167 67 79 51 54 52 56 43 47 + 68 78 41 165 185 121 182 213 154 113 144 92 + 93 132 61 114 152 78 111 148 82 102 138 69 + 103 137 77 101 136 75 102 137 71 107 145 74 + 46 50 38 43 46 40 48 49 43 58 61 48 + 76 79 78 88 86 109 110 108 159 146 143 234 + 147 144 246 129 127 209 132 132 199 141 141 206 + 142 133 191 129 119 147 108 97 93 94 93 71 + 102 93 73 106 92 69 136 89 67 230 82 81 + 235 61 61 220 48 43 219 55 38 211 55 38 + 225 53 43 200 53 41 189 61 43 197 60 43 + 218 68 57 194 56 41 196 58 40 202 57 40 + 207 52 40 216 50 41 231 59 52 241 56 60 + 236 47 58 236 69 74 239 86 81 234 65 61 + 225 56 50 223 56 52 226 56 56 232 56 60 + 237 55 60 239 53 57 220 59 54 192 56 41 + 186 61 42 186 61 42 177 57 35 182 53 41 + 255 80 96 253 61 95 203 73 93 75 64 49 + 45 51 37 74 51 39 134 152 101 168 212 140 + 143 170 124 75 99 57 96 127 61 108 148 73 + 100 140 71 101 135 67 107 142 79 105 144 79 + 102 143 69 112 155 80 64 62 48 62 61 52 + 60 61 50 65 69 42 76 77 58 85 84 65 + 101 99 103 132 129 183 145 140 212 127 122 175 + 119 115 165 127 122 164 121 111 127 110 95 87 + 108 89 71 104 92 75 106 94 78 127 95 79 + 165 75 60 216 53 46 227 48 43 226 52 42 + 215 56 36 202 61 36 215 57 44 185 59 41 + 181 55 38 215 61 53 231 73 66 179 57 39 + 186 58 41 199 57 45 214 60 52 227 59 55 + 234 58 56 233 56 54 244 72 73 233 90 88 + 205 67 61 218 58 55 223 57 50 228 56 52 + 234 54 56 236 56 62 235 54 61 236 55 59 + 214 63 55 182 59 43 167 59 39 164 59 40 + 150 54 35 192 73 68 252 85 104 210 77 88 + 130 93 79 51 57 34 70 79 41 117 156 95 + 146 165 105 136 155 106 73 84 60 60 72 44 + 103 126 67 106 148 70 97 140 69 107 140 75 + 108 145 80 111 150 81 109 153 77 118 165 86 + 85 77 62 86 77 63 86 78 63 86 80 61 + 92 82 67 96 87 66 98 89 75 109 99 107 + 119 106 124 112 100 109 93 87 91 87 85 82 + 93 86 71 102 90 70 110 95 72 106 100 79 + 136 90 79 173 82 71 174 58 44 203 52 43 + 225 55 47 222 55 46 215 54 42 211 57 41 + 213 58 44 184 60 43 167 53 34 194 57 45 + 215 60 52 211 72 58 212 66 57 216 62 57 + 231 60 60 238 54 56 229 59 56 197 61 50 + 183 57 42 189 59 45 214 60 53 237 54 58 + 232 54 58 230 56 54 229 57 50 230 57 54 + 232 56 56 231 59 61 203 64 56 167 59 44 + 153 59 40 141 56 36 132 54 39 204 89 90 + 188 84 86 158 89 82 128 99 75 96 120 59 + 157 182 113 118 152 89 79 93 59 59 61 46 + 50 51 43 59 67 49 102 127 71 111 151 74 + 106 146 77 109 147 82 106 148 71 113 158 75 + 120 170 85 113 159 87 99 90 75 101 91 75 + 101 91 75 100 91 76 101 91 77 103 95 74 + 104 95 72 103 94 77 103 93 76 102 92 73 + 96 90 71 81 78 61 76 72 55 83 80 62 + 91 90 70 95 95 79 150 97 89 209 74 76 + 211 52 48 183 61 41 205 58 42 218 57 43 + 213 56 42 213 55 42 213 58 43 188 61 47 + 151 53 30 170 63 41 193 55 42 209 57 47 + 233 52 57 232 54 60 237 54 59 239 53 60 + 214 54 52 173 56 38 167 57 38 181 58 41 + 215 62 52 238 57 56 242 54 55 235 56 53 + 229 60 51 224 62 57 218 62 62 201 64 59 + 169 56 43 149 58 40 141 58 40 129 55 34 + 126 58 42 166 82 74 149 84 73 143 92 83 + 150 110 93 142 161 115 83 99 66 39 50 30 + 53 56 49 55 54 47 57 57 48 57 67 48 + 103 130 75 119 156 81 112 153 83 112 152 79 + 111 153 73 120 166 85 119 166 89 96 139 74 + 104 95 80 105 96 81 105 96 81 105 96 81 + 104 95 80 107 98 84 106 98 83 105 96 80 + 105 98 76 105 98 72 104 98 75 96 90 70 + 76 74 54 64 69 52 64 72 56 67 74 62 + 85 77 59 182 88 79 239 68 70 200 58 44 + 195 55 37 210 56 41 209 58 41 209 58 40 + 210 57 41 187 59 47 145 54 30 148 57 31 + 187 56 42 218 59 53 238 64 69 211 62 59 + 187 54 49 183 58 53 162 57 45 157 62 42 + 159 65 43 165 60 39 183 54 41 211 60 53 + 236 61 55 235 63 54 223 68 57 202 65 57 + 178 56 51 152 56 42 140 56 39 132 60 41 + 125 59 40 119 51 34 137 65 51 148 83 71 + 145 90 78 150 89 83 137 89 77 65 77 43 + 39 50 37 55 62 60 75 77 64 61 59 40 + 55 58 47 56 64 45 104 130 75 118 157 80 + 113 155 80 112 157 74 121 164 86 125 168 98 + 98 140 73 96 136 76 105 96 81 105 96 81 + 105 96 81 106 97 82 106 97 81 107 95 90 + 107 95 95 107 97 86 107 97 84 107 97 88 + 108 97 82 107 98 78 90 86 68 68 70 56 + 60 67 53 53 67 49 63 67 41 150 90 70 + 230 93 89 240 74 77 207 59 48 200 57 43 + 206 60 48 210 61 49 212 62 50 206 64 58 + 178 62 51 184 67 51 219 72 65 234 73 69 + 209 69 65 160 61 47 142 70 50 132 67 49 + 121 65 45 133 58 43 137 60 44 141 61 44 + 150 56 42 163 58 46 185 59 48 192 63 49 + 182 60 46 161 54 42 144 55 44 132 60 44 + 127 59 42 123 59 44 115 57 42 118 53 40 + 146 72 59 141 79 66 153 83 78 156 86 87 + 145 111 95 102 118 73 71 86 52 94 107 81 + 75 81 53 58 59 35 56 56 47 56 66 47 + 105 131 76 119 157 80 112 156 78 114 162 80 + 125 169 96 102 142 78 98 138 74 98 136 77 + 105 96 81 105 96 81 104 95 80 108 99 84 + 107 98 83 109 98 87 108 98 85 108 100 79 + 108 100 80 108 98 86 109 98 85 109 99 84 + 104 97 81 86 80 64 69 65 49 56 65 39 + 132 75 64 192 62 64 216 78 79 247 105 109 + 222 78 74 209 67 60 211 69 63 216 72 67 + 222 73 70 228 71 75 224 76 75 231 73 72 + 237 65 67 229 66 65 204 64 61 159 61 48 + 138 65 50 133 60 49 129 58 51 127 59 50 + 126 59 49 122 59 47 122 59 43 123 58 43 + 134 56 44 143 56 44 148 56 40 137 58 42 + 128 60 44 127 56 43 123 51 40 121 54 44 + 112 52 41 118 61 49 133 81 64 137 84 71 + 154 81 77 140 91 83 87 88 64 79 101 61 + 96 118 70 67 87 45 54 64 42 58 60 50 + 55 57 47 56 64 45 95 121 65 120 157 81 + 112 158 81 119 168 89 106 149 83 92 132 71 + 103 142 74 97 133 73 105 96 81 106 97 82 + 108 98 84 106 97 82 106 97 82 107 98 83 + 107 98 83 107 98 82 108 99 83 108 99 84 + 112 98 82 112 97 85 102 95 82 102 97 80 + 95 89 67 65 64 37 114 77 60 156 69 67 + 174 66 67 193 79 78 203 76 76 210 67 66 + 207 64 57 203 69 59 217 68 69 224 64 69 + 225 67 69 226 68 67 227 65 62 226 66 62 + 205 65 60 157 57 47 128 61 47 128 60 51 + 136 56 50 133 59 47 129 59 46 127 58 45 + 124 58 46 124 58 47 123 57 49 123 56 47 + 124 57 46 122 58 46 120 57 47 117 56 46 + 114 54 43 111 52 42 108 50 39 118 64 54 + 136 84 76 148 81 77 147 85 77 121 101 79 + 90 110 74 85 109 68 77 95 58 57 67 40 + 56 57 44 59 61 51 52 59 48 56 57 41 + 86 100 62 116 150 84 120 164 92 114 153 92 + 90 130 67 95 135 73 101 141 76 92 128 71 + 104 97 81 105 98 82 106 100 83 105 98 82 + 105 98 82 106 98 83 107 98 83 107 98 83 + 108 99 84 108 99 84 109 97 84 102 90 80 + 115 112 105 163 160 152 180 175 165 125 123 106 + 55 62 43 51 60 40 60 61 47 63 59 46 + 94 66 53 165 72 69 213 65 69 217 62 60 + 221 68 65 222 68 68 222 68 68 218 70 68 + 213 70 63 212 70 61 216 68 62 176 61 52 + 132 61 44 126 62 47 133 57 46 133 58 43 + 129 58 43 127 58 44 126 58 47 126 58 48 + 123 57 48 121 56 47 119 57 47 118 57 48 + 116 58 46 113 54 45 110 51 43 107 52 41 + 101 49 37 115 61 50 149 82 78 145 89 82 + 127 95 82 95 92 72 69 83 59 50 63 41 + 59 69 48 66 74 54 57 65 48 52 59 46 + 52 57 53 55 56 44 76 87 51 114 149 83 + 123 165 94 96 131 73 90 126 67 97 133 73 + 97 133 75 88 124 71 104 98 82 105 98 82 + 107 99 83 105 98 82 105 98 82 106 98 83 + 107 98 83 108 99 84 108 99 84 107 98 82 + 101 93 83 132 129 124 207 209 209 250 251 253 + 255 255 255 244 221 213 160 145 124 67 74 50 + 53 63 43 58 55 50 42 48 43 90 63 62 + 205 127 127 206 88 85 222 57 58 225 64 68 + 221 66 68 221 65 66 214 67 63 208 69 59 + 221 66 58 191 66 56 141 59 44 127 61 44 + 129 60 43 129 58 43 125 57 45 125 57 47 + 125 58 48 124 58 49 119 58 51 115 56 47 + 112 54 44 111 56 45 110 55 43 110 54 47 + 107 52 44 103 51 42 96 46 36 112 56 47 + 150 85 81 122 92 79 78 79 62 53 64 49 + 47 53 44 51 51 48 46 51 43 52 62 49 + 59 75 56 48 62 46 45 50 47 53 52 43 + 65 77 47 115 149 89 110 152 84 84 117 63 + 90 124 69 95 129 76 95 130 73 87 119 72 + 104 99 83 104 99 83 104 99 83 104 99 83 + 104 99 83 106 99 83 108 99 84 109 100 85 + 109 100 85 108 98 81 108 106 101 188 195 197 + 255 255 255 255 255 255 255 255 254 255 255 239 + 234 243 204 157 167 127 75 79 49 61 54 41 + 79 72 70 158 153 151 242 240 231 250 224 214 + 214 113 113 193 61 58 202 64 60 212 64 64 + 214 62 63 212 66 61 218 64 60 194 67 60 + 146 59 49 129 61 47 126 60 44 127 58 46 + 123 57 47 124 57 48 123 60 51 122 60 52 + 112 59 49 107 56 45 105 55 45 104 56 45 + 104 56 46 107 55 48 105 54 45 97 48 39 + 89 43 31 109 61 52 118 84 78 71 64 51 + 46 57 41 49 60 46 55 58 50 54 56 54 + 50 56 48 45 57 42 54 68 50 57 72 54 + 49 54 44 44 45 34 64 74 49 122 155 109 + 94 134 77 81 111 60 86 115 66 92 121 71 + 98 130 76 81 106 69 103 100 83 103 100 82 + 103 100 82 103 100 82 102 100 82 105 99 82 + 108 99 85 109 100 85 109 100 83 106 97 81 + 100 100 100 167 179 185 239 251 252 250 255 252 + 250 252 238 248 252 237 255 255 237 228 219 192 + 114 110 87 65 74 60 150 151 142 243 230 229 + 255 252 251 255 255 255 255 255 247 222 178 158 + 172 79 65 181 56 48 205 65 60 205 66 61 + 209 69 64 181 63 59 143 60 51 129 61 51 + 126 60 49 126 58 46 124 57 47 124 57 48 + 122 57 50 118 56 48 106 56 47 104 56 47 + 102 55 44 101 55 45 101 55 44 105 54 48 + 105 55 48 102 54 46 104 59 50 110 76 66 + 56 56 51 49 52 44 51 55 45 53 54 43 + 51 55 41 47 57 43 48 57 42 46 56 42 + 47 56 44 56 65 50 59 67 50 48 49 36 + 68 77 58 111 139 106 71 106 61 76 107 60 + 76 105 59 87 117 70 98 129 78 67 86 59 + 104 101 86 104 101 87 104 101 87 104 101 87 + 104 101 87 105 101 86 107 100 90 110 101 87 + 104 102 81 110 108 104 160 167 175 226 231 235 + 255 255 255 255 255 252 248 251 241 248 250 243 + 255 255 239 218 217 184 112 115 87 111 123 106 + 200 205 201 255 254 252 255 255 253 253 255 254 + 255 255 255 255 255 255 240 223 216 187 106 94 + 176 56 43 196 64 54 199 72 57 168 69 54 + 135 66 55 128 63 54 130 59 50 125 57 50 + 120 56 47 117 55 46 115 55 46 111 53 43 + 106 55 48 104 55 48 102 53 47 103 54 47 + 105 55 48 108 55 49 108 60 47 103 70 52 + 130 113 95 110 107 91 41 50 40 49 55 46 + 48 55 45 49 54 42 48 53 44 47 51 45 + 47 51 45 47 52 46 46 49 44 46 53 46 + 50 63 52 51 64 51 64 77 58 73 88 64 + 66 85 56 77 103 64 71 98 57 88 114 74 + 93 120 84 52 68 53 104 101 86 104 101 86 + 104 101 86 104 101 86 104 101 86 103 101 85 + 107 100 91 110 100 88 103 104 80 125 128 126 + 217 226 232 255 255 255 255 255 255 253 252 247 + 229 232 222 227 234 215 240 241 217 211 210 183 + 180 176 159 205 204 199 242 242 241 255 255 255 + 255 255 253 254 254 252 254 254 252 255 253 255 + 255 255 255 251 255 247 199 163 142 163 69 52 + 189 57 46 182 60 57 152 58 59 127 64 61 + 112 66 60 113 64 54 113 63 53 111 63 52 + 106 60 50 104 58 49 113 54 50 109 53 49 + 106 55 47 103 57 49 103 62 52 102 70 57 + 99 74 53 95 77 53 127 127 105 81 89 70 + 42 49 40 48 55 44 49 55 45 48 54 44 + 47 51 44 45 50 45 46 51 45 45 50 44 + 44 48 43 44 51 44 41 52 45 45 56 45 + 50 62 45 50 62 42 54 67 46 68 86 59 + 72 93 61 94 113 82 90 108 83 44 56 46 + 104 101 86 104 101 86 104 101 86 105 102 87 + 105 102 87 106 101 86 108 99 92 110 103 90 + 104 105 81 108 117 112 195 205 213 254 255 255 + 255 255 254 250 251 242 233 237 220 231 239 210 + 234 232 206 221 212 199 239 224 225 255 250 255 + 255 255 255 255 255 253 254 254 252 254 254 252 + 254 254 252 255 253 250 249 255 255 250 255 255 + 255 255 255 232 212 188 180 107 83 157 63 46 + 145 54 42 127 56 44 111 65 51 114 61 55 + 115 63 57 115 65 59 111 63 56 110 61 54 + 113 57 52 108 58 51 100 61 50 94 62 50 + 80 59 43 85 80 57 93 88 61 93 93 63 + 110 118 92 50 64 43 50 55 47 50 56 46 + 51 57 47 50 56 45 47 53 44 46 51 45 + 46 51 45 44 49 43 42 47 41 43 48 43 + 43 51 43 42 52 44 45 53 44 55 64 53 + 57 67 52 51 62 44 62 74 52 92 104 84 + 81 93 79 43 52 45 103 100 85 104 101 86 + 105 102 87 105 102 87 105 102 87 106 101 86 + 110 99 92 108 104 90 102 108 83 104 119 111 + 186 198 205 251 254 255 255 255 253 255 255 242 + 240 247 225 221 227 195 218 215 193 233 222 222 + 255 245 250 255 253 255 255 255 252 254 254 252 + 254 254 252 254 254 252 254 254 252 250 255 253 + 255 253 255 255 248 255 255 254 254 255 255 255 + 255 254 235 218 195 172 160 117 93 121 72 49 + 101 54 34 101 51 41 106 57 48 108 63 52 + 105 62 52 104 62 50 99 65 55 95 68 53 + 89 71 53 101 93 71 69 70 47 57 67 39 + 69 73 43 112 112 82 92 96 71 50 57 39 + 55 61 53 55 61 51 55 62 52 56 62 51 + 56 60 53 55 59 54 54 59 53 50 55 49 + 46 51 45 44 49 43 40 46 40 42 46 42 + 44 49 44 47 50 47 61 68 61 61 74 56 + 49 63 40 66 80 60 69 80 68 47 57 48 + 100 100 83 103 100 85 104 103 87 105 101 87 + 104 102 87 107 101 86 110 100 92 108 104 90 + 100 107 82 100 119 111 195 208 217 254 255 255 + 255 255 252 255 255 242 242 247 224 209 210 182 + 198 191 179 240 230 238 255 255 255 254 255 252 + 254 255 250 254 254 252 254 254 252 254 254 252 + 254 254 252 254 253 255 251 255 252 249 255 245 + 253 255 250 255 254 255 255 255 255 255 255 255 + 255 255 254 248 244 228 229 216 200 209 189 167 + 104 83 59 88 68 44 93 75 50 92 76 52 + 86 79 58 81 78 55 77 79 56 94 103 75 + 64 76 48 61 69 42 71 74 43 105 103 74 + 96 89 68 70 70 53 58 63 53 58 62 53 + 56 62 52 57 63 53 57 64 56 59 65 59 + 58 62 57 58 64 58 57 61 56 55 59 54 + 48 54 50 44 49 44 43 47 46 41 45 46 + 41 51 41 54 74 50 57 76 51 56 73 49 + 59 75 56 47 59 46 92 103 79 95 105 82 + 103 107 87 105 104 88 108 102 88 108 103 89 + 107 102 91 104 103 89 101 108 89 124 138 134 + 200 210 217 245 250 250 247 250 240 238 238 220 + 221 218 198 201 192 174 201 190 182 233 224 230 + 254 250 255 253 254 254 253 254 254 254 254 254 + 255 254 252 255 253 251 255 253 249 255 252 252 + 255 253 253 254 254 252 252 248 244 246 236 232 + 254 250 251 254 255 253 253 255 255 255 255 252 + 255 255 238 233 230 205 109 103 75 82 75 45 + 85 79 50 83 79 51 80 78 52 76 79 54 + 72 79 53 69 78 46 76 83 48 93 101 64 + 97 101 70 86 86 61 87 84 60 85 82 57 + 77 73 54 67 66 53 60 63 53 56 65 53 + 56 67 53 57 65 55 57 65 54 58 66 55 + 59 67 56 60 69 60 59 69 58 57 64 53 + 53 61 54 54 68 47 71 96 53 71 98 60 + 58 77 56 64 82 58 72 92 65 52 66 49 + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_p4.pbm b/ImageMagick-6.9.12-44/PerlMagick/t/input_p4.pbm new file mode 100644 index 0000000000000000000000000000000000000000..c1cac1808232fb610bdee4a1a0d004977e37c1ff GIT binary patch literal 423 zcmXYtu}Z{15QeuA;Sf|%Y*SiTSR871=Nm-WAypn@nMTN!zQ;8I1J{OI$odebJaQmd z9p(xTC7bNrY?6V2<==1re`mt!TTX8&|ATt zO)7eV8A00c!{#=K2L>eBnrh>U6czX^uV}Ve>vTjwx^3YKa!ocWO4{X@F-F_G9HfJE z@3o)odw1v+RZ23Jw6?2!Kp-9_CFe2@QV};ZM)QYE?xW+l^i1uIm;nXI!%5nc_SXLp xN`Otp``JFtJk!F<% literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_p5.pgm b/ImageMagick-6.9.12-44/PerlMagick/t/input_p5.pgm new file mode 100644 index 0000000..89e35da --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input_p5.pgm @@ -0,0 +1,79 @@ +P5 +70 46 +255 +   ",5CKOK<-*(% !+0! +  1=//O1 + %0AIRO:*)($  .6!  +)=,:' + + $3ANH.%&%!"25$  +F4 + + + %0BA&!"!$0:A !]G-&F? + !*0""0LY2 %VX~dkN +  + +!%EKMMK6 + + + + + + + + + + + + +32!0;JXPGI< &/9@>D?2 + +  + +  $+&%'%'($0D: .MQRSQNNMGE9# 334:ERD, +  + +  N4 1'+.$-9IA$ +5L<9*%)0:A:64>SLF<20,6B?A7-3F3058624>GQB2+('(@]TZed[7!߸ 4@I:, ?SHLA,574..09BLQNJNJ75CE:.3AA95>-$%#1_ghj]TSDgg}¡)BFB-4FRH0$5?9,13;H@EIKNHIFQI?I;?910D467.)Wtol[S816+5H]bZx}5W^SE:L?)#8GJA/5BGINJHOW`I8+7I>4/%&4%+7==K:9GMMOIEPdQ5!'0@42)/C@ONH27}q`W;3%243>@C>HWPA>=A>=3?@9N@<@JMFC<7QWd_LJS]W?C>:BED:@INK<,l^W6 ,<8NMHFH@#?Ukr2-2954:3234838NQNOPI=@FI@9;;:9<^VWe8,9<64..2 + !@OGEEJH31S`A33:82/A6325;=HNFDLI@=BIMA65510KXV( k9,>;22118 ,W[CENG5!#KH<<8?2.2?0145:DJEKRH@?AEHH>/--(*\U; EW*:30675@ !@P:38- $):@@:5;,):8:,#0<=<=EHC2+.;GDCCDEE6%@6+%&e@  ,<8:9BMC,=8,6<99:.'/8DDGH:&$*5%,&'2O + + .B?>>JJ2 5L308888-,=K:,+""#$*9HHB6)%')$  + .C@AIN20  (PO7379:8*.AJ;##,1+!!"'*1'! + + /C@EN510! ! !! !! 1B`E:<@CGFIJE7" "'&& + 'CBL:-5.  !!!! $*7:;88?BDDDD8!"%&$! + + +>I@+/4* ! !! )Zn1 + (<=ABB@==>)&'$  + + +3  + + +  D."'- !!! o'M-*88;, + 7$,!!!!!!!"!&a).?(36(-%  #' !!!!! !"!6ڠnj&., 4  + + $! !!!!!!!#"+ɪ;" *  + !!!!!"##+享9 ' +  +  "!!!"#"*埆泈 !  + #""#""#<ְ"   \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_p6.ppm b/ImageMagick-6.9.12-44/PerlMagick/t/input_p6.ppm new file mode 100644 index 0000000..920fe6c --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input_p6.ppm @@ -0,0 +1,4 @@ +P6 +70 46 +255 +0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTnXQI4I3et2v)38Yy>t(1uT1v7HngB6+&ymZ=st!LSRtN4 zHsfJ)vY{Ge$mB4KHN+$=v)cfWi1^{-05{!QtNufBSytulrvX(dE4GNv<= zSsv%H%;ZE09&_$JM>M(cAK(AZ@>@ZD%?jGCwTkJ>&@fUc5uJIMBq1Y}NYjIeCpt~0 zey^=QD6y*l!qu4*Ifj}Fl44Zr5F2<*$cRK{g7bZF?30X$eVy1f3dn?YeU<5kwL$_9 z3X%JfDIT+mwG$zD6CzcJRJr&=V3=<gYHddru4}3T*A}t9u@jh0H25&20{E6o=<+ zL8y6f*a&QfUlfniKKkQH<0NwK*9Xs%3j!okVvi{)VxTZRzv>@0_BI_u$8TxgirsFU zylOWB_<}r3tVl_X@B|Y0zN9@uQY5kEdFHmq{n~ESh$`;-9ly03MbU1wY3Y#A*&~KO zsLcuj)ot-3|$ZRltGaSVJBWBt`IoJ%M$aQp0HJM>ya=~F1|MxP{6x47+pl4)Xw04G4 z4kqJCnq}EEKlhAU)NXgX*RK={WH8ZM@=)IrR}&o1Ib?*C<5Y^X&QSKLo6{_T&@k(? zE@W57TIUupkw%$i7TEeIdk|NQU_|zsj!;4T4#Gn%~SV>nO4u|>s;nghCRZ5Fbi-lp?R3ES$9sh8=7ryD^Fo?l&hIRX3 zITaa#Mmi=0KjWg455O`F*5{uVx0g4I(HzD?2I17gryF%YNz*~XB@!ZE#_0sn7b)0! z#6^Db_$r^lmv(e9`thXEz5H+u7Nlcahq=T5lm(Cr_WSWy71Mu-v6nZSrIANg&(p57R5pJI^&d3b3MR*#?kOBDuaU_CkWke@9o8TCnJ`Q zs*jvZv0qS`>}T*0Tbc@DIh*BKX4;#OA)d%l37OR(d=j3F{`v9Z5HblGT`|bs09}fv z%cp&KL!J;zBJyb_nBi84Ca5@u0S?;=!e7>p-d$c_1a9knPAMo~Xv_xGC)ftWf*6A( znPy4VW(FNnZrNRT(6_eZ)}1He@zL?o3)k`EtJwfGL4SZr#2svc9{Q$-ejyIx8DwdK z1H>tpArc^H50S{m)9^+3BB&YF&hW1@>RWJ7&(e07q<9JzwYPA_m@At73TGV>0?i8c zu;Y9aJ`F=e4e7;$9D9fM5&D&ykM=Z@>LE~MERdv=gH_FZ)vXZAPQ|TgC5;)D`|<~3 zsgp;(>KREKkigog(SS-`+}WpG|IEpSEYbp!G}HM z?R&$6rtiKA45sN|L9xFJ9NR}4 z;rW^F=Qv-fK6FsS2hYR$#3e|?tD4+z9<<79HqJ>bcn z;NCXYM|k_ZxUZ`|SZt>ZZjHegsuHm%j$$-f6$fIBJq(Tkv48_C^xAhC=!mf&>;7{@XLVj$SmSSo8xcanJjcF?yt3>N%Y)8cc2|V3f+%7k5gBdSA&EMbz z221=u9FNUMY}-fQ5(lDWL}lmySWf7QT8wJO5#4!zQy2ZRMq3_n6j9QMrMQaC%9>%X zy9TAA(yFyTkjU+IIk=>YYCbxr^1@bCBiM@3G=myap>(kSaGyK${6dFF;Y$FK#mAfZ z<=ad3CV)?GxgZv^3W35G&!+dN!WVjZRiPPv{pV zQ6&zBbJ5k8Ec9-tc$j0X-m|z}nhKF6iIQ6Uqow@t;E8GDT*SI~X;J}}2jHSJL9tMU z$_`i-H>0i+fj=0P(0p`ltNRKL=&S}Qq@hBGKafH1{Ff!TzJ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input_rgb_lsb_08bit.mat b/ImageMagick-6.9.12-44/PerlMagick/t/input_rgb_lsb_08bit.mat new file mode 100644 index 0000000000000000000000000000000000000000..03d9a0260889e5cef52c87c05d75fb8e1b54b269 GIT binary patch literal 9992 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 +# +BEGIN { $| = 1; $test=1; print "1..1\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/jbig' || die 'Cd failed'; + +testRead( 'input.jbig', + 'f7047e83432fbef872f3034a19efb95aa3b241d0be228ae0ccdc7814a9e27811'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jbig/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/jbig/write.t new file mode 100644 index 0000000..a317eac --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/jbig/write.t @@ -0,0 +1,22 @@ +#!/usr/bin/perl +# +# Test write image method on JBIG image +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..1\n"; } +END {print "not \n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/jbig' || die 'Cd failed'; + +testReadWrite( 'input.jbig', + 'output.jbig', + '', + 'f7047e83432fbef872f3034a19efb95aa3b241d0be228ae0ccdc7814a9e27811' ); + +$test=0; # Keep perl from complaining diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray.jng new file mode 100644 index 0000000000000000000000000000000000000000..6267b9659b8386442a8c8c970bdd12ceb098c8c7 GIT binary patch literal 996 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 BAhQ4f literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog.jng new file mode 100644 index 0000000000000000000000000000000000000000..def56e5521c9f9ad2dd7ef2af376e3cc455a7589 GIT binary patch literal 1110 zcmeD7@^k0qlHy`uU=Z-~a0vp^Za}QZ0RlkAib$q!K#H+A$lZzY=1HA;1_l;hFBiv< z|2O_W0BUjbbYoy-WMuFFLWcjh8Jrn7*x1DCNEfxO~Kdm-Vxnp%OcTG^(rOk65ZM9KfrhCNv zwgKk}wZ{UtUqAlJeCca%_B`Qa?Hvd8CNGus%Q!LX6UV`#-%HNv^lj7X$$E6Poax)? zD+=Xy&zrO&uLIqtF2KOZ%)-FRf^ZuHlc0c*q7t)$p<|-3Q(#bG<3y zMS=PBrcKQ^-d}2NmFdf#IZ2f#TBJNeUbN%Z{3)+v1-2DN*N66M-AcJIaq>+^^TL>7 z*=ZTCJp}rhFWp?xq7;Kw)Fz#SgGBvR7Q?^HZZYW@}+X;dkby<%M^znHCt_N)qeve(SxHXUgV#r<%PQ z!X-1?cc$@}2M4LGe|RQCq~eXxtB1w~e|&=f96D$H=E;|HOM_e1o$7sIF8{7;bLH%< zzeRmG)M~SO{4U+TeX{(U_cO061lJR-kNf@5&`G&p zB5Mmn*4fkw69uk%OU@dL#Qx~;%M&9v6~{FTJz(MdKHF*ey9IstlxVnj>*a>18w>VrIxuTN0>8xq#!FguMb%5?UH@&= zy2H8b(%y^%P2CI4zP)GeI^h`bUU!+`ig_`j=PsVHyvB7p$o0@f1Lo-xM|9e>O*$)M z|1->=lb5$@*}7xXp7QjWH_lqL;&*aKX=it4M9KR0HRaxHEZ+-Co#!l;Q0UNJfA`RA zCq{->sTy^MKesct>^vE$_qE_=M|U0Tu>~npzQ&#Ri#=3rG3V``2a5`F>};z~t;$^^ dQC@h&D#~v2|C=9XczggQ5>Hn@mvv4FO#oP!sqX*) literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog_idat.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog_idat.jng new file mode 100644 index 0000000000000000000000000000000000000000..634a0095e9cd6f7e60a00c133c4d6552d2a3582c GIT binary patch literal 3988 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 Q^KVG>wGFl2YFJ193qC|dUjP6A literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog_jdaa.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog_jdaa.jng new file mode 100644 index 0000000000000000000000000000000000000000..75ba3f64bb505ad6b3d71ce342c915818c30904d GIT binary patch literal 2178 zcmd6nc{JPU8pnUhFG(d$uS8Ik3TkPHCbrnBhpH_YTZ>vsOpQ_|sk%&+3aur!=BCs( zwbas!QfsSKTOB1@t=NSQ)#{=p(!tDV<;L7D^Y7fh?(>}YyytoUc;4^xobUOhJ2>0! zLMfmC0KhodS-XjE8}ZRaOKb-Kr~-b?;u=b$+FApmlWxo!IY+zuZtZ8!4SkGKn-#|~)1MHLlbO9R(1Ph3I0R^!Z zQ2fKU0AWx#0s@Gp0f|4~AtURk1Bm;63>Se4ye2ey^zphL>h+uINv+K{m2cGxg=vKB zj5^)%$zDluKQ#;hg}|UtDEOr#1cU-GtQ1BCC#|ZcZ)x?pF$4}>N@CH3YKrdawZtO% zJ)OOkvX1NU^_w4hGVW|ut=2re<5T&GRXdVb(w!09s%X~IfUg2^bZ(Vuv?utDY< z<%DM`#qF_o8ejzxleMf-tNBjsKWH5XY$hIGsebk*caginhpqji^m3>%U#v|N13*9+ z0Ed0k20*bGDHT-^PqqxiS-H9~nC#E`5Qm_P;7nC}85N}8O5gj-G&{#UGx9`2pyI5- zkM@TQ^T&%X@(cA^LXL|7nPt@502h!sYbPrxARipp;xqM9l*h*UF(+FDMTDcAnse~d zhoe=ePW@N_G*(;?Yr$h6+lvQ4asD?T09J);>55@61BV4)mUKwvo@1=erSlaoZ2dJ{ zD(Eui!FDC_gZ27R?-XhjWv>oVuZGcX^ITpoB01{5Gimj|lTl9T?Wwy)g9*j|E)W5! zPoJ3od`)iVo*rc&%BigM)6ug_xMQ98HV)eMK0lv3eB6xCk?+?Xn{3Th+I<i=*~&R0IxcdI-A zkyfHnG9xl0n7^ zNsTZLYL3E$?M66y%%1L4o9~M2SW)iuN(%`0#1iu$gAX#t&mIoO1UYDJ4rtN#Ri6*Q z+J-`7o>*wb{;Q!Dm#Ep2U)+6pA@DwrWZy?|#$r5BbF&S@8HFw?>u)>Am``u0+oH8KNPq~?`S zrqVgucMrkwhXe{BIy>Wl^ zSF5+%tfsTbEOzl4P74`#YbDbN+fts{4aFSoW9YO*lP1rpcyK-&5PrSDK!2lN=H}`Y2wUKG*)k0ih z*YIlaaujS|_^(Ws$)wF|F0X1s#pR!mFBvW8e?vpfI2Q^=ZyQ1t^A!zWF!)zA{FMyJ z$q^6HvMPz#@&(;YT*?9e&3UqwTDDwhGZ6atWQ+kGb-@IA-Z(JZ$8&`3-5BYgBsB*^ zZWLNoaZ)HH#2#;WKCbmNP$W{Yk23g6wAJUbWUTU&d*c;b;Wrl_ynT(?b-H!CI zN#IqvUY%rZgS4OgL_l#-L_~FEU0?1?bQXnKP7oM literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_idat.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_idat.jng new file mode 100644 index 0000000000000000000000000000000000000000..2b037b90b486bec4b4fccf39e40c6f5eea49e774 GIT binary patch literal 4441 zcmb7Hbx_o8*ZwUFOD)~8bUxCxbhp$ZAtfQA(y?@dh;*l*l%#+NxFS+6APPt$EGe~w zbc?Vb&wTTJ^ZxsuGxwZ(&UKx0?wK?9A6JsTkq#LNGYJ3yl=`}wrngc1_K1)Z5dlQE zmj~La?`{Lc>8_3@fcw`=I;yg6Gax@x9d*#`H=#%XfRgKJs+k30gmW(yY;0Eh0@ahn zd($~y=*H+)R0nqoTVob2LL0}w)su_p=Pc$Ya?omNZZJv|*k~X$D0wAxsMVH~m#|k~ zKl7vZ<*{Bh*BMyu(~Q%Li$tIXQ~GZ`O?ym;3?8&SiqlRHQV?3s806w*BFJjyPJ zLdpERG+ZZm2Jpi%`+@r^*X=jLNHe;M&e;i9GDy;btDef#t zLrA_kiEBtOofej(uRYesgRbn`@B?vQbl#*rnC@~5F|O(w`d(IN+@hUyJ@3*~h?2#5 zqta4zY$!KYhFqFozkXe;7Fah0`86ben&BE4s)fOAeDhbV`MrM3&}uj=>;bFKAwV(H zpPhb?Y+rC`oi+Gkx$sv`Pp5G*x@m4i^u{kZA|m*yO0!kzy((on(;9Laf|J79P=b*i zSGUF17Ni(sePo{EQ|8OE4;W6I#ZHa6?S#qA$6x+)tWk$Ykg>bJeaAM=vDw+1vNvDqd8n4=FcP}PeaFt8B zMcr7zaKOtxm!|t3l{8bG+ZUSkwu@7u$I2}dm@SWCkJwnWL5QCl`!TvC$Y}~09B{ab z9bqS381mFMKA(Y%?zC>B!Bb7vs~32X*t4siGt_P@dVf1S$69Xo=tD>G*n-NW!wv+<*J1J!Ny`^uY-SC34ODH0wT)yxp-4E?K;9*xY-=iC<5XBhG8HG`mks3> z69JkLfuB*w9^r1`Hf^};&5KQMH~&z-rJ(x}`#!->wYFm0gDu5H1`ak`psYe=JQGXA z zmiUJ6#ZHpo8~4KaP8&lKGFC0sL5wGN?|LxL(o=ktaVX?;dIg(+rTB+sh9%y0D%z-g zzPKU$zArqDI!`qvf#?89{35AJON)M9#2_u{%r78Lp{>VG)m_#*1`P;}!hzp4M#+T> zBcw;DNLq$m|AgGr!u4qtQd6(I#UG{5Xf$GoOJDtXF?x}GhgL{fMKq-_f%GU^0S)rj zk9h8_-VMYoui#Bj2X?X7O?L^k>P@%(A*Dk3#O7E$M9dX<;I z8YD(Oef%4`it>B!R|OAi1T~ZGoiW3q6nkS~ql-k#@=_F! zSaYc$=O=iQ&63B>q{q#7X}~aKWpy4fDxi*#7rw@L$z@Z*my?kJReVn3mcCgU8Uw`H zEN>_V8_VY@z4Pyy8&j`8FhryA&3M+d#o-FvS;Ir$`fVQEAc|sq)Ui2LTKx>pmFXs> z0u+`}C&#gz++v7~rUI+p?A|-UsMr$CsJrp+0R8M-hL3JSlRcBvXuM|+p*5eQnQgJjRU9pLt6LHK->hP{^|A=FQa zfE{a#hQmJf52`XKG4NTZAkRvtqZ}@LeIgMnEo8M%7P{RP`aBg zL_q?N;l&qfV$RM8@d$v&)%;Hm@fMGcn4DlC9^WvgEWKG`!r05z)6;#+;@wJYm?P8W z)>@t3+GO(N+B38Fq){#<6oOpc3PLi8v>FM~ApSkvoHHHz$cH{pl%BX}JUj4*O zS%Qx`QOnjlz;VibsCj1*`2pU!vo@gld1D#C%V2&LA{?7tT)@f>Tie~=XJKTcdVYA! zyGBp@_W}O0-pezudI}a9-Xdc0JW;1;Gci?L`1kh@tFt#b%yj#Q-JDenymiI+1ZsZ!KfIdS8ENOqiFMmF8+VKGq+r_pO_YWj)0k&J)-9HQQ7Z^0USL_*Y)VXE)O ztk6E_#$3A;e))9Lt@R6t-tG5l6h6^KSZCCrpDiy-eEij2tOVy)q> z%a)@?9eB+Ri0WHlZ6PKUve|k%g`6_J-e`Kj&&c}d^xQxXI8jXd>i+^=yl{`D%aZV_ zw~DV9LA^K60U7^ivGp7^#!~m1c7t9ibnb@(ImNVeX9PkNli}ftl)nMoDs-fz2^{fR z_hbpjFFraTYTQOr0?-rHV?jb91EOo&_P7>*iBDI5^6SZ3PedTiucc?SBd1#4@y)`Y zoXBtKOasQ8MUXHytUa8SJc*ZD&zxIS-#2q*C9BN)mt(18LXMr?Fl99=@7wR)D_JRt zekS*Z@ClXnmWHX~d}PvV<I0ftv#NfG7<-#Q&Hi^x2s#FWI|RlTO{&Gy{| z4|0`-p_}L)<8t?gppTWWIL%+ZVtr!Bcim5PPeMUSiNf(CIW!(khx*DL^|-GS;V1Vp zKZ+tPna4h1$juoUaCUNXLJn>2pK)(6`BJ-g<=Rp(V!&_Fj*uR@QM{8Q0z_*l3NVsm zKRq-geLJuCAapN|1Iu%7fYvks)?y+NS`a=uAMHvM8R8k{jU6h37h%Y(2QM98yFWsR zx8glZ*9;>Z*j3x?UgDI{qZFi$mX#)%W$f1 zl|s{A%C5V+kijm_7ma;S@Hr`GA6whrgO zrYyyKCBa8;ZRG{dB&$1aqG~G~y=-Jc_qtW7{ATcs=v(T_WAV7dqhs;FB1BPb=2jz& zEKF={57T`4oa^rT%FT@h8FSt-!G8YOveUZ3-S?eDBrdOP`#RpPx4w%SvZ{>NAo(ho3p8}e)!F_2FQ*FZsj)I1<+{b{6& zQul{RdCVHKI?d1^UDBPM_vlqvr?X}G*wa>i<`fGrrLK!ZG;kd+Q<5&9xk}R8QN!k0 zJ&;W+1trIsA2=B8iB$^$Cl^QKc~dDK>(9eNd>o&K+t_3(b_yGX;Yx=j!05^kMzLgi+dfEU81Ojw#9l*^28UPUlLI@!sA|xavCMF_*(vm?* zNuf;CG!(QjW_C6hGb<|xj|e{pmk>8As{mY3NK9NxN{XFdPDxfmQAAQo;@>79Vq#(_ zDU^|nj8TG81Nc+~)SM7;HH0G#Ef*a(k56fngnD#F&)C6j2{Q=51OI0~ z0H5Ht90c5A0#pD99|XoDAo#y&|B|W1@d-Go)o8dJeWE20r9ERf3;+e+B2-{1Km{0* z8DNOE4G(RzZi=(xndSJKLO(b<>|cQnbwt7zz>IdmBTWroSt>fCk)I47;cGgZ7!lFA zRc;GIzgNjB3!aWPiX9HWhiD|L1Sof#&3Jt0`kG#R!$K;M#1yqiT;RyH4k6%U|5P$$N17ekh_jAyIiRnJp~o=bR=um z=U;1SOcqLEJSH=1o9CL@8)0>e>EW2RltCe37EcbJA|I`3OQrO;*x5> zIWok&(anyqa=Ve5i^chcPjhqR(ngL!o;@!wsK-HFCJ+!=2?7wgNmbifTPUJ0E{VL$ z{d#j>t4oz&Rf#4jjhu-Uvo5C(fwbnA#j;8wb2e?W@DqYXXf$Pp* zT@`gghFI7KV}iP8$&$rYxlEuGS&_8a{;>(a=K}$Ize7ER$Z(Xt#ub^{l}*E+s*>yOCY< zZd73YYkx`2S^A37t{6>^?my8PSLV-O)*C|_k!L7A!jynqRk&kYzi}!7V)k|sR$O*R zQKnL`nM)jCKV2|UI6gbg^cXJx_9%-p>Grta%yxrq0k!Eirm}7(fwJ}NnaxkbKU(=>kd>G1S_=8f zs`gC$J%!LGae@zR4zRlD!@@*n%&?d zy9Y-1MeUm}abS>N|36AcOkTVhbG&nkW{x!d8r+w4Xb`d4I1}s<%+8f))&uSIVd{;# qC7)LgWpnbK*!1ukbHgYLlhWu&+$>(7hwHzeS5M1Gvq9Y<=6?XA4HwP; literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_jdaa.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_jdaa.jng new file mode 100644 index 0000000000000000000000000000000000000000..deffc4c01e49c848895c807e1b519d1cd957b786 GIT binary patch literal 2278 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 C;k&^A literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_rose.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_rose.jng new file mode 100644 index 0000000000000000000000000000000000000000..518aeb70e3edc9236fd22e0f43ea5c9b933d8e57 GIT binary patch literal 1325 zcmeD7@^k0qlHy`uU=Z-~a0vp^Za}QZ#lgYA0c70b@$&*wjKx9jPK-BC>eMqZusrc{ zaSZu?=$VSiD#0X>vBPS;(4>yklFRz4= zqKu*u$>9G120;!6Jq9;sMkNL&K}Kdl#{WkcWPl!F1-TXu*cg~uSlO8vIe@Z;0t`%y z%*@P8%xvrs1&mD03@n1ILW*pLj)957B1)plDuoL-8aXviJb3W~P>U2J0~0f{c?>M9 zK<$hSKsgOT21XV}W+qlvm~9}%f`%-tib9UUN{NMyMu7_tUi^QHfrl9=BgibsV9#*I z?1Xq@Ol|efsEw_$DmNAW^opInaJF>G;p)T^*}KdVv6bgHt~)NhWM5;+F5grZmy`fM z4$+{itpbbP`>H+K28?AEtftu>F`T{8DP ze{O%zI=#Gq%F~z``i{-LtUK?~*T92*m3IugN(0NDwrT%{y`S{w%@u zd79SK-Hlg1y))m{`N}MlTe(*zt=fEhv;2D5)%PaU-rCuFT1QtpPoZ#5q3bo57)`FD zP2VNY3Vq3IUwrC#A#ud{=!#w2j zg3CIK`>bEC3w|_r!3u_y`l`_N*|F@)Uac2Wl1}L;+`PH|{ zJ*r>`oYuYk)#R7kIS!?DsXjR7dHeW^g|@QGy8^Z=ESkiAgjt2(B+x!UMJzux+xo4- z3fBjMuU(w3Z8NuD*C%@L%ZIGj?^Z7t>YQj$v(2A%bxV)&+~w0G8G9}C`fnb)c)7Uk zMA^H=`$eS-YkHnedCYRj{BOwi30^T5mD|-fP5m@UKsn++gFw*%OGbyU%etl}h)&V} z+~CQ6Z5Qt(F;Bm@3s_~ot&3^x?X)tQe&5!VoMh8Z*s{!@T+m+@6fi{ zYyH{Qmwel<#@<^t&A~iz=Q002*1(&jUKTXs)d3)kP%fG8$9OT*e+IZiqqz`*EHdTIG|1yf<)lZ$oqerjw@A$yo^Zewq zsoZ~7o$x;0D!X%OP|nju(*ie5>)PtW8v9}{fBDsG--V*j^Ki2>-uVgkSqBc2`w*`{UM2G4F1F zkLG$T`_uBh(}W{D%`%OrnP0wrAMir03o)VColU}0nZ|C>xlbF)C1*VEO{Wt~$(69C$_10MhY literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/jng/read.t new file mode 100644 index 0000000..0b3747f --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/jng/read.t @@ -0,0 +1,69 @@ +#!/usr/bin/perl +# +# Test read image method on non-interlaced JPEG. +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..11\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/jng' || die 'Cd failed'; + +# +# 1) Gray +# +testReadCompare('input_gray.jng', '../reference/jng/read_gray.miff', q//, 0.002, 0.22); +# +# 2) Gray with IDAT encoding +# +++$test; +testReadCompare('input_gray_idat.jng', '../reference/jng/read_gray_idat.miff', q//, 0.002, 0.22); +# +# 3) Gray with JDAA encoding +# +++$test; +testReadCompare('input_gray_jdaa.jng', '../reference/jng/read_gray_jdaa.miff', q//, 0.002, 0.22); +# +# 4) Gray Progressive +# +++$test; +testReadCompare('input_gray_prog.jng', '../reference/jng/read_gray_prog.miff', q//, 0.002, 0.22); +# +# 5) Gray progressive with IDAT encoding +# +++$test; +testReadCompare('input_gray_prog_idat.jng', '../reference/jng/read_gray_prog_idat.miff', q//, 0.002, 0.22); +# +# 6) Gray progressive with JDAA encoding +# +++$test; +testReadCompare('input_gray_prog_jdaa.jng', '../reference/jng/read_gray_prog_jdaa.miff', q//, 0.002, 0.22); +# +# 7) Color with JDAA encoding +# +++$test; +testReadCompare('input_idat.jng', '../reference/jng/read_idat.miff', q//, 0.002, 0.22); +# +# 8) Color with JDAA encoding +# +++$test; +testReadCompare('input_jdaa.jng', '../reference/jng/read_jdaa.miff', q//, 0.002, 0.22); +# +# 9) Color progressive +# +++$test; +testReadCompare('input_prog.jng', '../reference/jng/read_prog.miff', q//, 0.002, 0.22);# +# +# 10) Color progressive with IDAT encoding +# +++$test; +testReadCompare('input_prog_idat.jng', '../reference/jng/read_prog_idat.miff', q//, 0.002, 0.22); +# +# 11) Color progressive with JDAA encoding +# +++$test; +testReadCompare('input_prog_jdaa.jng', '../reference/jng/read_prog_jdaa.miff', q//, 0.002, 0.22); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/jng/write.t new file mode 100644 index 0000000..696aeae --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/jng/write.t @@ -0,0 +1,38 @@ +#!/usr/bin/perl +# +# Test reading JPEG images +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..11\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/jng' || die 'Cd failed'; + +testReadWriteCompare( 'input_gray_idat.jng', 'gray_idat_tmp.jng', '../reference/jng/write_gray_idat.miff', q//, q//, 0.2, 1.0); +++$test; +testReadWriteCompare( 'input_gray_jdaa.jng', 'gray_jdaa_tmp.jng', '../reference/jng/write_gray_jdaa.miff', q//, q//, 0.2, 1.0); +++$test; +testReadWriteCompare( 'input_gray.jng', 'gray_tmp.jng', '../reference/jng/write_gray.miff', q//, q//, 0.2, 1.0); +++$test; +testReadWriteCompare( 'input_gray_prog_idat.jng', 'gray_prog_idat_tmp.jng', '../reference/jng/write_gray_prog_idat.miff', q//, q//, 0.2, 1.0); +++$test; +testReadWriteCompare( 'input_gray_prog_jdaa.jng', 'gray_prog_jdaa_tmp.jng', '../reference/jng/write_gray_prog_jdaa.miff', q//, q//, 0.2, 1.0); +++$test; +testReadWriteCompare( 'input_gray_prog.jng', 'gray_prog_tmp.jng', '../reference/jng/write_gray_prog.miff', q//, q//, 0.2, 1.0); +++$test; +testReadWriteCompare( 'input_idat.jng', 'idat_tmp.jng', '../reference/jng/write_idat.miff', q//, q//, 0.2, 1.0); +++$test; +testReadWriteCompare( 'input_jdaa.jng', 'jdaa_tmp.jng', '../reference/jng/write_jdaa.miff', q//, q//, 0.2, 1.0); +++$test; +testReadWriteCompare( 'input_prog_idat.jng', 'prog_idat_tmp.jng', '../reference/jng/write_prog_idat.miff', q//, q//, 0.2, 1.0); +++$test; +testReadWriteCompare( 'input_prog_jdaa.jng', 'prog_jdaa_tmp.jng', '../reference/jng/write_prog_jdaa.miff', q//, q//, 0.2, 1.0); +++$test; +testReadWriteCompare( 'input_prog.jng', 'prog_tmp.jng', '../reference/jng/write_prog.miff', q//, q//, 0.2, 1.0); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/input.jpg b/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/input.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e8fdb0b01f8e2495d94034f265a4be7998514089 GIT binary patch literal 1564 zcmb7;X*`q(9LJw$Zf2%DnrRLrGt4lOW2V7O&5YcnY>IM32bCPu@wvG;s z9Gl6NT$L+yBOQ#1nrfw_Y!|C$_1WDQ`*MH(m*3C-`}?V%sK)@U)lRNX00;sAIDddz z0oVf=6bg+(V$f)`h6Y9xN5JE-SR6%r(L#bQRd0zdl}4j8&5Y>!%M55Vwzcsx3l5LR z(=!r?_*|jcavt}G1k}*bz+rJ@Jf6&D&=}nR9d#Q3VE{A02@XO43dArR=lF$jYL2neaoKyhq6wk;wM^$jA=)iAk9+3o%B z=RYVQ@L$`!9f1T<^N0-rAOb|p3z7d+f%6bzAhbEQ$VFUzk8LP|U1W`V7{I~j2?U1# z8{m#rFDc1h(jVG0+Hz9f=U!{E688+`J>AO=Iovb1XYo6LY`Y?MQTfu2+ z(H4Ylg`Ny{a0R}(6W`=4(wc_&;}4yYg5M*$jSEd3V#McTf?|e!1`Bw@;e$Dqb&5K@ z>$;WQ{D@XHP~EFKz>1a8tmJ`Fx3Nx&G}pLT?j>Xd zXP{o8dDFkVy-Ud6XL3gv9hM|jEmUSz6AKNWjM!(|^*iNc>R~%?41f&^P2S%5o+_n{7)rylP zYo$B8w7ZKgSOslnXx=#bg>u(p(f5h0u)P$R8Ym4KS1xouQ*LG|f17&av|f5)6ngl{ zp3zg4+ZjEKICBocG-v4PZoe3L@`IRN#~^&I1Al1f`qUpz6VCz{AGN4v=&U?KiWCCI zTeX9Y#!T{$mrdlpzJlr4na&#Pc2)G0S5a8`coF}|LB~>Rth?y?l7Wh@lAtwurn&7Q zZOoy|?`R)BE}l!oc63wi>!&;EoYE*Si<*n9dyX@%80cbR7p;21s&%5>Ew(+OwXI$? ztqkJQHWPNhJFbhkp6rT?mqc6$F4P}9={Li4Ql44IwFzNoG$Gz&I^9;T;VE|>u#7Le z++-mPt*-@J@HZ)9KGBx-E4KIhSt;Hn^dO-3Nvyktb%MUx-(^M!QwgTyM{=cjKxHk(ARi#PEZ-Ho&}2eN#xcvVW;CKqoa zcL>~W^v~|D-#7BCR=1^m>PB3X^5mp2$ekLYDB7Q3FB$wv1M%hRMTVG23F; zt1=fDB+b}9C>T&aqU^F>QPm~u4Ll@U&E5YZ!aXr0tl?FzcL2%5pfobR#a-+b#CqA0 zIWqWX7U~lcsRCXpJ;TG--zp8p2ad6I{IeV{?Ab%lExaUXgC({_Yo-<-ctq`r@p-L@ZCyH^;n}SfE zP-`!n2h~xY3EZ)SJp&GoUSXw`phFg&zt6tJ{*AHj0)GC_OIaut=m;yxPG0j}-akdT5EK`?=Q% z%gal=T2IKvwy#WUjQM;&`)x2Y;my^;+wd-`^u(q4;;i$X73Sa#)VL|*CyZ7q%++q;wse dxHbg_E}n04ZEmIcbQ9Zq#e)rx*+_Hs&|jkpentQQ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/input_plane.jpg b/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/input_plane.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8aaa5c0fa257275680d0bdf77ccbd82aad1b900 GIT binary patch literal 1805 zcmb7@e>~H99LGQ3{je=_zOxbXYc@@OZ?VQ1jZ&mEL_hSyxN^zwQ%XthGMA-v-MB<3 zwMgA40mEBahv8ExcS@x(~p9KE6Hx zf&hS!2dI_68{oCHa9UVA4u>NU@NA%^9v-4$IwPp)*VK6No?{5VeVhIy#0dstJ|#zen8wNO<4?e9#aHphys! z1gRCk7yuMnL;Gb=7&KN30?3&W1dyYDpFt=z1`E_r0TB%W6pV(EE!&PHDVht4COg2Zb=rBM* z7!(S^&N3q#01QbFrjjW%OXfnJ7ea_fz#%MZBG)egiE*`TqheF{o}WnF<0(xB$p{<`(H0prqUtOigd(94HVm1G zwWRU*Gi->ip3q=(+i6DL)>IdE_u&r8#lxZ$R%A%-5gi+9j&ro+WZuK5D|bYc>$ajz zRi4Ve-&-emR!X`WD1stYmHfX5`>iZlB~Nl+ES;Qkn6&KNV`VdxckJ{$mT!yFF*AIu zW4)9kOJGM{zP68bzrwS$IxM2adM{V*F50WsxN9*(ibgD+1qBExOhxN4$rhh6Q5wuU zrODR*fp3PA-d(<*@u+moTK~~ zl7{!o_|(cdoHT;op@_!@B;>;RFo4i#6!wd4NI#GZ^{AFSv<1^EoXk%+ko(y=El<<{ zL+0}!UDu(tRX3vcxQTUtQrMkb>zz%ek8v`AOVCTVt|j)XY(w8j%QpC*&~qCqE~viX zdRQFwyaPk4`$OgeFLA34TFDE&buQU%+e_5u6VqAm&JbG?~}D{|wRyDwD^D z6Apy8&t}Jy>TBP>#7XgOBQTyy@1y55#%^h;3zx25zMM96w1+3~PkmDCR1C%6TFSj* zUE0|~c2rgG00E|=Rh;<_x{3^bp((S#p;|B77|dGHc-VFFa45EnEjaE(7SEl-2m>@f`-;}qE>CWQx5qp_}I3B z=SxpW{ic7>yY1W$$H>_k(5D9ILaMfT{yLM_`}W>W$%gqHD=SHI}gm4}SA)J~267u00 zI87$ump=@OpHa=8HT7few)qf?T#bU1i#N{S7}u@q*eiG)aa+Hk*&@yFZB?c4RBV9Y zhBzDVgfo72;pz01nDxqKuF;JXcFM=TIcw7vyUXN}x$!%++l86y5)+%N5CR&ENQAT) z!pxTVb3il_l}PK`N56yw&dl6>sa{}MEPWF$;c?>M?&|S9L^4TfTvLn=iMFj*fuND2 zU5%NBA7%So^$Qp-ub2+NJ8UZP^wqKWfeHN_f3GZ8gFeQ{mOj;(z}(}y8l1WZ9W;f~ z#iBA*e?vs-xmA#@AfrvI;Xu0k^K=|7c<*2>WsEW{_*hL|dF)11T}E~Zdwc|a=r(Wl zh`pRt9>B3FJe{8;(HEb|PUpLUIFZ1>o5cNbchLT>F5`lVU(ZX+Zc0k>U!)jSppM8n z!nOJGgF?TFJ +# +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/jpeg' || die 'Cd failed'; + +# +# 1) Test non-interlaced image read +# +print( "Non-interlaced JPEG ...\n" ); +testReadCompare('input.jpg', '../reference/jpeg/read_non_interlaced.miff', q//, 0.002, 0.22); + +# +# 2) Test plane-interlaced image read +# +++$test; +print( "Plane-interlaced JPEG ...\n" ); +testReadCompare('input_plane.jpg', '../reference/jpeg/read_plane_interlaced.miff', q//, 0.002, 0.22); + + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/write.t new file mode 100644 index 0000000..65bfbb5 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/write.t @@ -0,0 +1,33 @@ +#!/usr/bin/perl +# +# Test reading JPEG images +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/jpeg' || die 'Cd failed'; + +# +# 1) Test with non-interlaced image +# +print( "Non-interlaced JPEG ...\n" ); +testReadWriteCompare( 'input.jpg', 'output_tmp.jpg', + '../reference/jpeg/write_non_interlaced.miff', + q//, q//, 0.02, 0.27); + +# +# 2) Test with plane-interlaced image +# +++$test; +print( "Plane-interlaced JPEG ...\n" ); +testReadWriteCompare( 'input.jpg', 'output_plane_tmp.jpg', + '../reference/jpeg/write_plane_interlaced.miff', + q//, q//, 0.02, 0.27); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/montage.t b/ImageMagick-6.9.12-44/PerlMagick/t/montage.t new file mode 100644 index 0000000..df84347 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/montage.t @@ -0,0 +1,235 @@ +#!/usr/bin/perl +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test montage method. +# +BEGIN { $| = 1; $test=1, print "1..19\n"; } +END {print "not ok 1\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't' || die 'Cd failed'; + +# +# 1) Test montage defaults (except no label that requires an exact font) +# +testMontage( q//, + q/background=>'#696e7e'/, + '977b812cb06e16d0ee7da6c80a9470cb85c2d33ba33f5919f26b05058f0eb177', + 'fea8915dc67163d86e93a6e611c900185f82bdc5fc67c7a3e53a4b76639aaa56', + '8de04216e6f60ad3bf63d5a2c54386cb824579e1c4a677af726e0306e0c7fb09'); + +# +# 2) Test Center gravity +# Image should be centered in frame +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, geometry=>'90x80+5+5>', gravity=>'Center'/, + '9a3f16a11fa4173f43642e7759070b32ce66a21c72312a7c99ed5dab711dc377', + '633267a42b30c1a5709d8929ef9ad24e6612f28e10299315a0ff386ccba7ec9a', + '2a381bc2cc7dc751c95df0f6a88c5f04232e82d06094b65b3909f488e4347f93'); + +# +# 3) Test NorthWest gravity +# Image should be at top-left in frame +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, geometry=>'90x80+5+5>', gravity=>'NorthWest'/, + '1ace55dbec2814d4d12e911f6ab21e0eac769cf12fbdcf516376f356222b74e1', + '9d4854b04b3072c4f371a55289ed0583c5fab1a52758e514008462bfb890be41', + 'f3be8f6f4ecabc14d6da8a3d8b6a2e369ad005d045f381df6f24ca2410406380'); + +# +# 4) Test North gravity +# Image should be at top-center of frame +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, geometry=>'90x80+5+5>', gravity=>'North'/, + '02840dc5ac270f2e26422b8c90c5e5c3af81fd6e6739e9554977115e152a6872', + '67ee49456bfc3500aac4a2425b7b45c9cd32d8948232a97fabe62713ddd7f859', + 'abd7f530c44e953ac799a04846a3eef613d0ab7b08aa92bb6cabe8abf275d5b6'); + +# +# 5) Test NorthEast gravity +# Image should be at top-right of frame +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, geometry=>'90x80+5+5>', gravity=>'NorthEast'/, + 'c5a10e80cb4f3b1c866d03e8cad4154f1139758ec86ffeef4fe2a802ac118ae2', + '66b8ac0676dbf6c48703cb16422e75174ee676003cacfd58de546a697075b469', + 'bb35ddfaab468d869f2a3bafb16b3751015f2bb94e87438c48c7b294831d2bb8'); + +# +# 6) Test West gravity +# Image should be at left-center of frame +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, geometry=>'90x80+5+5>', gravity=>'West'/, + '60f394bc620fba50b97dfe55c6026eed616a26ceee7a97fa66485b1853182ff8', + '46eed993d02f46dc553478fcdda6c0632b4d1161d478d5a9409b2925a8624c09', + '09bb863d97be728ee75411ff87f1d09a5ef272b03fd23edca07b692239ce9346'); + +# +# 7) Test East gravity +# Image should be at right-center of frame. +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, geometry=>'90x80+5+5>', gravity=>'East'/, + '48e3b6f793ef83ff702a4a164a6d91f1e3711ff9d7eee9f2eb7f8ce704783355', + '2285ea36a814317b190c43012f509a70a779cac61afc0dcd0a54f089cbd6b284', + '932cf84bf09b180ed7e01976dabf6ba7088fc374c539991ea42600ae40cedcbd'); + +# +# 8) Test SouthWest gravity +# Image should be at bottom-left of frame +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, geometry=>'90x80+5+5>', gravity=>'SouthWest'/, + 'a7bdd145d3a98e1ba42ccff175ef3ff91c04ccff47cab1b0c8ae8ad21315f680', + '6e4b779635b9dbd54490aa6a71aa45c4414c51554e449ccd88570ced42975b1b', + 'ef5b118bfa9dfbed332c1cf349b8cc792280f535a1dcba053e878657cb060198'); + +# +# 9) Test South gravity +# Image should be at bottom of frame +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, geometry=>'90x80+5+5>', gravity=>'South'/, + '35c31352e889dc7912ddb0ae23af45c3776f36bc77a874b751d2594415cee1e6', + 'b72b1f24b49d9a3bb0507f3e5d5588b0c11cde499fab27d02df41d36dd87f099', + '3fd57e40caef146868326f177db65265e8970c88ce20ba099152a1c5e8027e1f'); + +# +# 10) Test SouthEast gravity +# Image should be at bottom-right of frame. +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, geometry=>'90x80+5+5>', gravity=>'SouthEast'/, + 'd46836aea9de6ca6441a856b103edbe1bee6ceeeab189ac8bdf61bac35556774', + '192a8ee4da1c5d62d14ab7837378d06fec13c37cb097d7ee00f97534f86d8304', + 'c94a37024d7f8ff664c5aae0977ed6ff5d3aa92f46425b09b179c2ab32494e0c'); + +# +# 11) Test Framed Montage +# +# Image border color 'bordercolor' controls frame background color +# Image matte color 'mattecolor' controls frame color +# Image pen color 'pen' controls label text foreground color +++$test; +testMontage( q/bordercolor=>'blue', mattecolor=>'red'/, + q/background=>'#696e7e',, tile=>'4x4', geometry=>'90x80+3+3>', frame=>'8x10', + borderwidth=>'0', gravity=>'Center', background=>'gray'/, + '5110ae8eb21ded2d8e6b6d3f5cc80317a6c58304f84731810a318bd76473427a', + 'eadda2683d38109f1432faa08a7c92cf62d13730e33044041ef4ac8bf68c96b2', + '1419b60478f8f0d6f4da5fb87b0df3f16313a1e89a3192d9feeda2cdf2ac9860'); + +# +# 12) Test Framed Montage with drop-shadows +# +++$test; +testMontage( q/bordercolor=>'blue', mattecolor=>'red'/, + q/background=>'#696e7e',, tile=>'4x4', geometry=>'90x80+6+6>', frame=>'8x10', + borderwidth=>'0', gravity=>'Center', shadow=>'True',background=>'gray'/, + 'd4de864f9004b185297c9c2351f811aaeb779095bdd8fd5f29bcfbee79f09da4', + 'e784da474c0296b00cbde2eed40fa99664f6a5975eeca2efc2aff131bc5982ce', + '803c926764df2ad940f36fbbeea274e05467d729bfdfb2f28c479cfd27245a85'); + +# +# 13) Test Framed Montage with drop-shadows and background texture +# +++$test; +testMontage( q/bordercolor=>'blue', mattecolor=>'red'/, + q/background=>'#696e7e',, tile=>'4x4', geometry=>'90x80+6+6>', frame=>'8x10', + borderwidth=>'0', gravity=>'Center', shadow=>'True', texture=>'granite:'/, + '8418407b6d56d2c1b67bc735004794d9eb20609d30115a93255eefcad3499e95', + 'f683fcddacc049c873776952909ea5a741f76ec6db600453724cee8dbb9d06c4', + '5793a1de15b5d73df297968af79fa01a110c1585cccd46dcbef794674ab5f174'); + +# +# 14) Test Un-bordered, Un-framed Montage +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, tile=>'4x4', geometry=>'90x80+6+6>', mode=>'Unframe', + borderwidth=>'0', gravity=>'Center', background=>'gray'/, + '5b5b6e7667055dee87a282cac637bceeec605644d8063972f79a01b2c07f9872', + 'd313d29183c31fb1aa91b0fb44ef04c8cd7ad6f7648a553fe0ec3c6ba7872fb4', + '438478e6380519b065e4e24e33bab0e6dd6c4ab5a8c6449e22537fd55269babb'); + +# +# 15) Test Bordered, Un-framed Montage (mode=>'Unframe') +# +++$test; +testMontage( q/bordercolor=>'red'/, + q/background=>'#696e7e',, tile=>'4x4', geometry=>'90x80+6+6>', mode=>'Unframe', + borderwidth=>'5', gravity=>'Center', background=>'gray'/, + 'fadebb098990a6230d30c55f45c4f1a31effc70055d4eb66c8f46c913257e1fb', + '9468d6ff4312772656e980874be56ae69cf97946e78461de1f67e96c6c76675c', + '535b6d2dd565ee5d01c3500569e60112812f5cd4d88525d528d35a5d02bbe681'); + +# +# 16) Test Bordered, Un-framed Montage (mode=>'UnFrame') +# +++$test; +testMontage( q/bordercolor=>'red'/, + q/tile=>'4x4', geometry=>'90x80+6+6>', mode=>'UnFrame', + borderwidth=>'5', gravity=>'Center', background=>'gray'/, + 'fadebb098990a6230d30c55f45c4f1a31effc70055d4eb66c8f46c913257e1fb', + '9468d6ff4312772656e980874be56ae69cf97946e78461de1f67e96c6c76675c', + '535b6d2dd565ee5d01c3500569e60112812f5cd4d88525d528d35a5d02bbe681'); + +# +# 17) Test Un-bordered, Un-framed Montage with 16x1 tile +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, tile=>'16x1', geometry=>'90x80+0+0>', mode=>'Unframe', + borderwidth=>'0', gravity=>'Center', background=>'gray'/, + 'bead47d8f45327614e1a91f3537443317f59eebb960839f613365a1231b163ff', + 'ecc4b83e0b76129f1635c2e866bc641cce6a5d65a6c89bc497b5b81e4bb0f3b6', + 'ad05ecff14b56693e2785eb4b6f06215c215eb1309eb19591d9380027aacfe21'); + +# +# 18) Test concatenated thumbnail Montage (concatenated via special Concatenate mode) +# Thumbnails should be compacted tightly together in a grid +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, tile=>'4x4', geometry=>'90x80>', mode=>'Concatenate'/, + '73dba1cf6a2077fca9c3d6a4f82ee5aa4481d64481423cffbb676b92e3f3c7dd', + '108b50e6f8d5155f6c6f60dfe939e83ec465a917b3d8ec6fa1419d27ffa3cdb3', + '1fdca151dfe00fdc106832696815eff00b7e32a5fb0af64b41cb08610661880e'); +# +# 19) Test concatenated thumbnail Montage (concatentated by setting params to zero) +# Thumbnails should be compacted tightly together in a grid +# +++$test; +testMontage( q//, + q/background=>'#696e7e',, tile=>'4x4', geometry=>'+0+0', mode=>'Unframe', shadow=>'False', + borderwidth=>'0', background=>'gray'/, + '73dba1cf6a2077fca9c3d6a4f82ee5aa4481d64481423cffbb676b92e3f3c7dd', + '108b50e6f8d5155f6c6f60dfe939e83ec465a917b3d8ec6fa1419d27ffa3cdb3', + '1fdca151dfe00fdc106832696815eff00b7e32a5fb0af64b41cb08610661880e'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/mpeg/input.m2v b/ImageMagick-6.9.12-44/PerlMagick/t/mpeg/input.m2v new file mode 100644 index 0000000000000000000000000000000000000000..04b4a45aad3b2bb4c00820cc44c1c55edc9fb503 GIT binary patch literal 15924 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 w0h89qpBpsNC+=x`x5)bcd(lV#Ka@|RCjbBd literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/mpeg/input.mpg b/ImageMagick-6.9.12-44/PerlMagick/t/mpeg/input.mpg new file mode 100644 index 0000000000000000000000000000000000000000..7a66614290b5028e650c57e2ac1ec471a4a4c6ac GIT binary patch literal 11473 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 G^Zx>;BN)5@ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/mpeg/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/mpeg/read.t new file mode 100644 index 0000000..56470b9 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/mpeg/read.t @@ -0,0 +1,30 @@ +#!/usr/bin/perl +# +# Test reading MPEG files +# +# Whenever a new test is added/removed, be sure to update the +# 1..n ouput. +# +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/mpeg' || die 'Cd failed'; + +# +# Motion Picture Experts Group file interchange format (version 2) +# +testRead( 'input.m2v', + 'b41936e37b153bc3627167a6ff9520d92fa256e7cc967ba29acfbaad5812ff11' ); + +# +# Motion Picture Experts Group file interchange format +# +++$test; +testRead( 'input.mpg', + '113b91329ec4ad7d147e910e5fd8340d06db419ce6d0258de8993ec4673fc7bc' ); + +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.j2k b/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.j2k new file mode 100644 index 0000000000000000000000000000000000000000..3f68405398df1f3083018f3f7552bdbd020d7c75 GIT binary patch literal 6350 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.jp2 b/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.jp2 new file mode 100644 index 0000000000000000000000000000000000000000..383586e213a1a651f526047c1acf130ebba103cb GIT binary patch literal 6410 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 GmHz`_8W4;C literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.jpc b/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.jpc new file mode 100644 index 0000000000000000000000000000000000000000..383586e213a1a651f526047c1acf130ebba103cb GIT binary patch literal 6410 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 GmHz`_8W4;C literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/read.t new file mode 100644 index 0000000..c7e8997 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/read.t @@ -0,0 +1,34 @@ +#!/usr/bin/perl +# +# Test read image method on non-interlaced JPEG. +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..3\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/openjp2' || die 'Cd failed'; + +# +# 1) JPEG-2000 JP2 File Format Syntax (ISO/IEC 15444-1) +# +print( "JPEG-2000 JP2 File Format Syntax ...\n" ); +testReadCompare('input.jp2', '../reference/openjp2/read_jp2.miff', q//, 0.13, 1.0); + +# +# 2) JPEG-2000 Code Stream Syntax (ISO/IEC 15444-1) +# +++$test; +print( " ...\n" ); +testReadCompare('input.jpc', '../reference/openjp2/read_jpc.miff', q//, 0.13, 1.0); + +# +# 3) JPEG-2000 VM Format +# +++$test; +print( " ...\n" ); +testReadCompare('input.j2k', '../reference/openjp2/read_j2k.miff', q//, 0.13, 1.0); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/ping.t b/ImageMagick-6.9.12-44/PerlMagick/t/ping.t new file mode 100644 index 0000000..1a63bd2 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/ping.t @@ -0,0 +1,63 @@ +#!/usr/bin/perl +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test reading blobs supported directly by ImageMagick. +# +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't' || die 'Cd failed'; + +my (@blob, $filename, $format, $height, $image, $size, $status, $width); + +$filename='input_p6.ppm'; +print "Ping \"$filename\" ...\n"; +$image=Image::Magick->new; +($width, $height, $size, $format)=$image->Ping("$filename"); +if (($width == 70) && ($height == 46) && ($size == 9673) && ($format eq "PPM")) + { + print "ok $test\n"; + } + else + { + print "not ok $test\n"; + } +undef $image; +$test++; + +print("Ping blob ...\n"); +$image=Image::Magick->new; +$status=$image->Read($filename); +warn "$status" if "$status"; +@blob=$image->ImageToBlob(); +undef $image; +$image=Image::Magick->new; +($width, $height, $size, $format)=$image->Ping(blob=>@blob); +undef @blob; +undef $image; +if (($width == 70) && ($height == 46) && ($size == 9673) && ($format eq "PPM")) + { + print "ok $test\n"; + } +else + { + print "not ok $test\n"; + } + +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/png/input.mng b/ImageMagick-6.9.12-44/PerlMagick/t/png/input.mng new file mode 100644 index 0000000000000000000000000000000000000000..2694fc5676cda9d480863030ca0f5a9a08ebc56f GIT binary patch literal 12920 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 F{|_)8YtjG! literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/png/input_16.png b/ImageMagick-6.9.12-44/PerlMagick/t/png/input_16.png new file mode 100644 index 0000000000000000000000000000000000000000..06223a689a5391850a30f2e0da2abc826e7320f5 GIT binary patch literal 2440 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 DxoA5e literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/png/input_bw.png b/ImageMagick-6.9.12-44/PerlMagick/t/png/input_bw.png new file mode 100644 index 0000000000000000000000000000000000000000..0020f8047936b02aae1a63b8a8b837a10b03792a GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^6M%RDBamP??S5kikTUmlaSZYBetXi9i@|_{*>V27 z<>Cu%pQtca-)40@uEjOEM&SkfUfEeIHjA_9PMRCwFkLaDSK|f4K7I!IEsRS|K}LDH L`njxgN@xNAbgLk- literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/png/input_mono.png b/ImageMagick-6.9.12-44/PerlMagick/t/png/input_mono.png new file mode 100644 index 0000000000000000000000000000000000000000..1b83ba98f0d2dfcdb2acda4755e921c85df41e2d GIT binary patch literal 616 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 JPDHLkV1kv<@E`yH literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/png/read-16.t b/ImageMagick-6.9.12-44/PerlMagick/t/png/read-16.t new file mode 100644 index 0000000..b900821 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/png/read-16.t @@ -0,0 +1,52 @@ +#!/usr/bin/perl +# +# Test reading PNG images when 16bit support is enabled +# +# Contributed by Bob Friesenhahn +# + +BEGIN { $| = 1; $test=1; print "1..5\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/png' || die 'Cd failed'; + +# +# 1) Test Monochrome PNG +# +testRead( 'input_mono.png', + 'cda5c7a8ba8250de624af6dc825ad6772ebba3a7fa6da756c5b1ca228b62f8ac' ); + +# +# 2) Test 256 color pseudocolor PNG +# +++$test; +testRead( 'input_256.png', + '066c0047c6e7e3f4cda1c86224441bfd5f522b5805b2a9190dcfa5294d94e4bd' ); + +# +# 3) Test TrueColor PNG +# +++$test; +testRead( 'input_truecolor.png', + '55913611798c087b9300b14d3baeda08a142910ad120379a9308a6b8c8b2f6e8' ); + +# +# 4) Test Multiple-image Network Graphics +# +++$test; +testRead( 'input.mng', + '40805ef3db6e3a94c85e30e591e5881dc660ff863591d6f56605dba64d03d83d' ); + +# +# 5) Test 16-bit Portable Network Graphics +# +++$test; +testRead( 'input_16.png', + 'ed0c17df37c4717fa3e70176148ab00e076fd0df743dce30323112100a71290b', + '82f48df83eec5bacbe2c38f13ce7e2219e5e318f4b2974d928d0ea7f7cec65fd', + '82f48df83eec5bacbe2c38f13ce7e2219e5e318f4b2974d928d0ea7f7cec65fd' ); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/png/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/png/read.t new file mode 100644 index 0000000..3459611 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/png/read.t @@ -0,0 +1,64 @@ +#!/usr/bin/perl +# +# Test reading PNG images +# +# Contributed by Bob Friesenhahn +# + +BEGIN { $| = 1; $test=1; print "1..6\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/png' || die 'Cd failed'; + +# +# 1) Test Black-and-white, bit_depth=1 PNG +# +print( "1-bit grayscale PNG ...\n" ); +testRead( 'input_bw.png', + '349c2ff9310d578051e40e80d42cfc36ca29ba93e353df175219f7448da5eeee' ); + +# +# 2) Test Monochrome PNG +# +++$test; +print( "8-bit grayscale PNG ...\n" ); +testRead( 'input_mono.png', + 'cda5c7a8ba8250de624af6dc825ad6772ebba3a7fa6da756c5b1ca228b62f8ac' ); + +# +# 3) Test 16-bit Portable Network Graphics +# +++$test; +print( "16-bit grayscale PNG ...\n" ); +testRead( 'input_16.png', + 'ed0c17df37c4717fa3e70176148ab00e076fd0df743dce30323112100a71290b', + '82f48df83eec5bacbe2c38f13ce7e2219e5e318f4b2974d928d0ea7f7cec65fd', + '82f48df83eec5bacbe2c38f13ce7e2219e5e318f4b2974d928d0ea7f7cec65fd' ); +# +# 4) Test 256 color pseudocolor PNG +# +++$test; +print( "8-bit indexed-color PNG ...\n" ); +testRead( 'input_256.png', + '066c0047c6e7e3f4cda1c86224441bfd5f522b5805b2a9190dcfa5294d94e4bd' ); + +# +# 5) Test TrueColor PNG +# +++$test; +print( "24-bit Truecolor PNG ...\n" ); +testRead( 'input_truecolor.png', + '55913611798c087b9300b14d3baeda08a142910ad120379a9308a6b8c8b2f6e8' ); + +# +# 6) Test Multiple-image Network Graphics +# +++$test; +print( "MNG with 24-bit Truecolor PNGs...\n" ); +testRead( 'input.mng', + '40805ef3db6e3a94c85e30e591e5881dc660ff863591d6f56605dba64d03d83d' ); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/png/write-16.t b/ImageMagick-6.9.12-44/PerlMagick/t/png/write-16.t new file mode 100644 index 0000000..02dd9c6 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/png/write-16.t @@ -0,0 +1,61 @@ +#!/usr/bin/perl +# +# Test writing PNG images when 16bit support is enabled +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..5\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/png' || die 'Cd failed'; + +# +# 1) Test pseudocolor image +# +testReadWrite( 'input_256.png', + 'output_256.png', + q/quality=>54/, + '066c0047c6e7e3f4cda1c86224441bfd5f522b5805b2a9190dcfa5294d94e4bd' ); + +# +# 2) Test truecolor image +# +++$test; +testReadWrite( 'input_truecolor.png', + 'output_truecolor.png', + q/quality=>55/, + '55913611798c087b9300b14d3baeda08a142910ad120379a9308a6b8c8b2f6e8' ); + +# +# 3) Test monochrome image +# +++$test; +testReadWrite( 'input_mono.png', + 'output_mono.png', '', + 'cda5c7a8ba8250de624af6dc825ad6772ebba3a7fa6da756c5b1ca228b62f8ac' ); + +# +# 4) Test Multiple-image Network Graphics +# +++$test; +testReadWrite( 'input.mng', + 'output.mng', + q/quality=>55/, + '40805ef3db6e3a94c85e30e591e5881dc660ff863591d6f56605dba64d03d83d' ); + +# +# 5) Test 16-bit Portable Network Graphics +# +++$test; +testReadWrite( 'input_16.png', + 'output_16.png', + q/quality=>55/, + '6f2b7a49124d65616f37d4dbebec3e46b6a4a4b53abc6b197dc6f7e9b4cdeb33', + '82f48df83eec5bacbe2c38f13ce7e2219e5e318f4b2974d928d0ea7f7cec65fd'); + + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/png/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/png/write.t new file mode 100644 index 0000000..e3bc0b2 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/png/write.t @@ -0,0 +1,68 @@ +#!/usr/bin/perl +# +# Test writing PNG images +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..6\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/png' || die 'Cd failed'; + +# +# 1) Test Black-and-white, bit_depth=1 PNG +# +print( "1-bit grayscale PNG ...\n" ); +testReadWrite( 'input_bw.png', 'output_bw.png', q/quality=>95/, + '349c2ff9310d578051e40e80d42cfc36ca29ba93e353df175219f7448da5eeee'); + +# +# 2) Test monochrome image +# +++$test; +print( "8-bit grayscale PNG ...\n" ); +testReadWrite( 'input_mono.png', + 'output_mono.png', '', + 'cda5c7a8ba8250de624af6dc825ad6772ebba3a7fa6da756c5b1ca228b62f8ac'); +# +# 3) Test 16-bit Portable Network Graphics +# +++$test; +print( "16-bit grayscale PNG ...\n" ); +testReadWrite( 'input_16.png', + 'output_16.png', + q/quality=>55/, + '6f2b7a49124d65616f37d4dbebec3e46b6a4a4b53abc6b197dc6f7e9b4cdeb33', + '82f48df83eec5bacbe2c38f13ce7e2219e5e318f4b2974d928d0ea7f7cec65fd' ); +# +# 4) Test pseudocolor image +# +++$test; +print( "8-bit indexed-color PNG ...\n" ); +testReadWrite( 'input_256.png', + 'output_256.png', + q/quality=>54/, + '066c0047c6e7e3f4cda1c86224441bfd5f522b5805b2a9190dcfa5294d94e4bd' ); +# +# 5) Test truecolor image +# +++$test; +print( "24-bit Truecolor PNG ...\n" ); +testReadWrite( 'input_truecolor.png', + 'output_truecolor.png', + q/quality=>55/, + '55913611798c087b9300b14d3baeda08a142910ad120379a9308a6b8c8b2f6e8' ); +# +# 6) Test Multiple-image Network Graphics +# +++$test; +print( "MNG with 24-bit Truecolor PNGs ...\n" ); +testReadWrite( 'input.mng', + 'output.mng', + q/quality=>55/, + '40805ef3db6e3a94c85e30e591e5881dc660ff863591d6f56605dba64d03d83d' ); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/ps/input.eps b/ImageMagick-6.9.12-44/PerlMagick/t/ps/input.eps new file mode 100644 index 0000000..48ba981 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/ps/input.eps @@ -0,0 +1,132 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: congrats.eps +%%Creator: fig2dev Version 3.2 Patchlevel 0-beta2 +%%CreationDate: Thu Sep 3 18:27:20 1998 +%%For: bfriesen@scooby (Bob Friesenhahn) +%%Orientation: Portrait +%%BoundingBox: 0 0 497 317 +%%Pages: 0 +%%BeginSetup +%%IncludeFeature: *PageSize Letter +%%EndSetup +%%Magnification: 1.00 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-53.0 352.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n 0 5902 m 0 0 l 9202 0 l 9202 5902 l cp clip + 0.06000 0.06000 sc +% Polyline +7.500 slw +n 1005 600 m 900 600 900 5745 105 arcto 4 {pop} repeat + 900 5850 9045 5850 105 arcto 4 {pop} repeat + 9150 5850 9150 705 105 arcto 4 {pop} repeat + 9150 600 1005 600 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +30.000 slw +n 5415 3735 m 5115 3735 l gs col0 s gr +% Polyline +n 4335 3720 m 4035 3720 l gs col0 s gr +/Helvetica-Bold ff 480.00 scf sf +5025 1950 m +gs 1 -1 sc (You can display an image!) dup sw pop 2 div neg 0 rm col4 sh gr +/Helvetica-Bold ff 480.00 scf sf +5025 1275 m +gs 1 -1 sc (CONGRATULATIONS!) dup sw pop 2 div neg 0 rm col4 sh gr +/Helvetica-Bold ff 360.00 scf sf +1500 3375 m +gs 1 -1 sc (2\) Use CNTRL-Q key combination) col0 sh gr +/Helvetica-Bold ff 360.00 scf sf +4575 3825 m +gs 1 -1 sc (or) col0 sh gr +/Helvetica-Bold ff 360.00 scf sf +1875 4350 m +gs 1 -1 sc (Depress right mouse button to bring) col0 sh gr +/Helvetica-Bold ff 360.00 scf sf +1875 4875 m +gs 1 -1 sc (up menu and select 'Quit' to continue) col0 sh gr +/Helvetica-Bold ff 360.00 scf sf +1875 5325 m +gs 1 -1 sc (tests.) col0 sh gr +/Helvetica-Bold ff 360.00 scf sf +1500 2775 m +gs 1 -1 sc (1\) Move mouse cursor into this window.) col0 sh gr +$F2psEnd +rs diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/ps/input.miff b/ImageMagick-6.9.12-44/PerlMagick/t/ps/input.miff new file mode 100644 index 0000000..7740ad5 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/ps/input.miff @@ -0,0 +1,9 @@ +id=ImageMagick +class=DirectClass matte=False +columns=70 rows=46 depth=8 +signature=eb4d6e084afe2835a1ad28ad7fc12ced +background-color=gray74 border-color=gray74 matte-color=gray74 +{ +This is a comment.} + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT +# + +BEGIN { $| = 1; $test=1; print "1..3\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/ps' || die 'Cd failed'; + +# +# 1) Test reading Postscript +# +$image=Image::Magick->new; +$x=$image->ReadImage('input.ps'); +if( "$x" ) { + print "ReadImage: $x\n"; + print "not ok $test\n"; +} else { + print "ok $test\n"; +} +undef $image; + + +# +# 2) Test reading Encapsulated Postscript +# +++$test; +$image=Image::Magick->new; +$x=$image->ReadImage('input.eps'); +if( "$x" ) { + print "ReadImage: $x\n"; + print "not ok $test\n"; +} else { + print "ok $test\n"; +} +undef $image; + +# +# 3) Test rendering using a Postscript font +# +++$test; +$font = 'helvetica'; + +$image=Image::Magick->new; +$x=$image->Set(font=>"$font", pen=>'#0000FF', dither=>'False'); +if( "$x" ) { + print "$x\n"; + print "not ok $test\n"; +} else { + $x=$image->ReadImage('label:The quick brown fox jumps over the lazy dog.'); + if ( "$x" ) { + print "ReadImage: $x\n"; + # If server can't be accessed, ImageMagick returns this warning + # Warning 305: Unable to open X server + $x =~ /(\d+)/; + my $errorCode = $1; + if ( $errorCode > 0 ) { + print "not ok $test\n"; + } else { + print "ok $test\n"; + } + } else { + print "ok $test\n"; + } +} +undef $image; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/ps/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/ps/write.t new file mode 100644 index 0000000..18b5ce2 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/ps/write.t @@ -0,0 +1,30 @@ +#!/usr/bin/perl +# +# Test writing Postscript images +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/ps' || die 'Cd failed'; + +# +# 1) Test Postscript +# +testReadWriteNoVerify( 'input.miff', + 'output.ps', + q// ); +# +# 2) Test Encapsulated Postscript +# +++$test; +testReadWriteNoVerify( 'input.miff', + 'output.eps', + q// ); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/rad/input.rad b/ImageMagick-6.9.12-44/PerlMagick/t/rad/input.rad new file mode 100644 index 0000000000000000000000000000000000000000..135f7e3b62f23bfdd9df23eedd610d515313b919 GIT binary patch literal 20051 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"70x46"/, 0.22, 1.022); + +print("GRANITE (granite texture) ...\n"); +++$test; +testReadCompare('granite:', 'reference/read/granite.miff', q/size=>"70x46"/, 0.0, 0.0); + +print("MAT (MatLab gray 8-bit LSB integer) ...\n"); +++$test; +testReadCompare('input_gray_lsb_08bit.mat', 'reference/read/input_gray_lsb_08bit_mat.miff', q//, 0.4, 1.04); + +print("MAT (MatLab gray 8-bit MSB integer) ...\n"); +++$test; +testReadCompare('input_gray_msb_08bit.mat', 'reference/read/input_gray_msb_08bit_mat.miff', q//, 0.22, 1.022); + +print("MAT (MatLab gray 64-bit LSB double) ...\n"); +++$test; +testReadCompare('input_gray_lsb_double.mat', 'reference/read/input_gray_lsb_double_mat.miff', q//, 0.22, 1.022); + +print("MAT (MatLab RGB 8-bit LSB integer) ...\n"); +++$test; +testReadCompare('input_rgb_lsb_08bit.mat', 'reference/read/input_rgb_lsb_08bit_mat.miff', q//, 0.22, 1.022); + +print("Microsoft icon ...\n"); +++$test; +testReadCompare('input.ico', 'reference/read/input_ico.miff', q//, 0.0, 0.0); + +print("Magick image file format ...\n"); +++$test; +testReadCompare('input.miff', 'reference/read/input_miff.miff', q//, 0.0, 0.0); + +print("MTV Raytracing image format ...\n"); +++$test; +testReadCompare('input.mtv', 'reference/read/input_mtv.miff', q//, 0.0, 0.0); + +print("NULL (white image) ...\n"); +++$test; +testReadCompare('NULL:white', 'reference/read/input_null_white.miff', q/size=>"70x46"/, 0.0, 0.0); + +print("NULL (black image) ...\n"); +++$test; +testReadCompare('NULL:black', 'reference/read/input_null_black.miff', q/size=>"70x46"/, 0.0, 0.0); + +print("NULL (DarkOrange image) ...\n"); +++$test; +testReadCompare('NULL:DarkOrange', 'reference/read/input_null_DarkOrange.miff', q/size=>"70x46"/, 0.0, 0.0); + +print("Portable bitmap format (black and white), ASCII format ...\n"); +++$test; +testReadCompare('input_p1.pbm', 'reference/read/input_pbm_p1.miff', q//, 0.0, 0.0); + +print("Portable bitmap format (black and white), binary format ...\n"); +++$test; +testReadCompare('input_p4.pbm', 'reference/read/input_pbm_p4.miff', q//, 0.0, 0.0); + +print("ZSoft IBM PC Paintbrush file ...\n"); +++$test; +testReadCompare('input.pcx', 'reference/read/input_pcx.miff', q//, 0.0, 0.0); + +print("Portable graymap format (gray scale), ASCII format ...\n"); +++$test; +testReadCompare('input_p2.pgm', 'reference/read/input_pgm_p2.miff', q//, 0.06, 0.6); + +print("Portable graymap format (gray scale), binary format ...\n"); +++$test; +testReadCompare('input_p5.pgm', 'reference/read/input_pgm_p5.miff', q//, 0.06, 0.6); + +print("Apple Macintosh QuickDraw/PICT file ...\n"); +++$test; +testReadCompare('input.pict', 'reference/read/input_pict.miff', q//, 0.0, 0.0); + +print("Alias/Wavefront RLE image format ...\n"); +++$test; +testReadCompare('input.rle', 'reference/read/input_rle.miff', q//, 0.0, 0.0); + +print("Portable pixmap format (color), ASCII format ...\n"); +++$test; +testReadCompare('input_p3.ppm', 'reference/read/input_ppm_p3.miff', q//, 0.0, 0.0); + +print("Portable pixmap format (color), binary format ...\n"); +++$test; +testReadCompare('input_p6.ppm', 'reference/read/input_ppm_p6.miff', q//, 0.0, 0.0); + +print("Adobe Photoshop bitmap file ...\n"); +++$test; +testReadCompare('input.psd', 'reference/read/input_psd.miff', q//, 0.0, 0.0); + +print("Irix RGB image file ...\n"); +++$test; +testReadCompare('input.sgi', 'reference/read/input_sgi.miff', q//, 0.25, 1.1); + +print("SUN 1-bit Rasterfile ...\n"); +++$test; +testReadCompare('input.im1', 'reference/read/input_im1.miff', q//, 0.0, 0.0); + +print("SUN 8-bit Rasterfile ...\n"); +++$test; +testReadCompare('input.im8', 'reference/read/input_im8.miff', q//, 0.0, 0.0); + +print("SUN TrueColor Rasterfile ...\n"); +++$test; +testReadCompare('sun:input.im24', 'reference/read/input_im24.miff', q//, 0.0, 0.0); + +print("Truevision Targa image file ...\n"); +++$test; +testReadCompare('input.tga', 'reference/read/input_tga.miff', q//, 0.0, 0.0); + +print("PSX TIM file ...\n"); +++$test; +testReadCompare('input.tim', 'reference/read/input_tim.miff', q//, 0.0, 0.0); + +print("Khoros Visualization image file ...\n"); +++$test; +testReadCompare('input.viff', 'reference/read/input_viff.miff', q//, 0.0, 0.0); + +print("WBMP (Wireless Bitmap (level 0) image) ...\n"); +++$test; +testReadCompare('input.wbmp', 'reference/read/input_wbmp.miff', q//, 0.0, 0.0); + +print("X Windows system bitmap (black and white only) ...\n"); +++$test; +testReadCompare('input.xbm', 'reference/read/input_xbm.miff', q//, 0.0, 0.0); + +print("XC: Constant image of X server color ...\n"); +++$test; +testReadCompare('xc:black', 'reference/read/input_xc_black.miff', q/size=>"70x46",, depth=>8/, 0.0, 0.0); + +print("X Windows system pixmap file (color) ...\n"); +++$test; +testReadCompare('input.xpm', 'reference/read/input_xpm.miff', q//, 0.0, 0.0); + +print("TILE (Tile image with a texture) ...\n"); +# This is an internal generated format +# We will tile using the default image and a MIFF file +# +++$test; +testReadCompare('TILE:input.miff', 'reference/read/input_tile.miff', + q/size=>"140x92", depth=>8/, 0.0, 0.0); + +print("CMYK format ...\n"); +++$test; +testReadCompare('cmyk:input_70x46.cmyk', 'reference/read/input_cmyk.miff', + q/size=>"70x46", depth=>8/, 0.0, 0.0); + +print("GRAY format ...\n"); +++$test; +testReadCompare('gray:input_70x46.gray', 'reference/read/input_gray.miff', + q/size=>"70x46", depth=>8/, 0.06, 0.6); + +print("RGB format ...\n"); +++$test; +testReadCompare('rgb:input_70x46.rgb', 'reference/read/input_rgb.miff', + q/size=>"70x46", depth=>8/, 0.0, 0.0); + +print("RGBA format ...\n"); +++$test; +testReadCompare('rgba:input_70x46.rgba', 'reference/read/input_rgba.miff', + q/size=>"70x46", depth=>8/, 0.0, 0.0); + +print("UYVY format ...\n"); +++$test; +testReadCompare('uyvy:input_70x46.uyvy', 'reference/read/input_uyvy.miff', + q/size=>"70x46", depth=>8/, 0.22, 1.022); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/cgm/read.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/cgm/read.miff new file mode 100644 index 0000000000000000000000000000000000000000..2527a97c9114ea355d02bf2ad9125140390583db GIT binary patch literal 107110 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 z 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Add.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Add.miff new file mode 100644 index 0000000000000000000000000000000000000000..f22a6c99363976bbcf5fa81d5f2c0834de9474a8 GIT binary patch literal 24408 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.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT>>... + + +  + + +  +++:::999""" ***333999 RRR>>>(((!!!>>>777 + + + + + +%%%******BBBMMM,,,  KKKMMMrrrnnnWWW]]]DDD  444LLLMMM999### FFFJJJiiidddLLLLLL333   + + +"""666JJJNNN===111+++ 666;;;AAABBBBBB@@@... + + + + + + + + +   ,,,***)))222???KKKDDD===>>>333  (((000666555:::666+++ + + + + + + + + + + + +  + + + + + + + + + + + + + + +%%% !!! !!!"""))):::111'''AAAEEEEEEFFFDDDBBBBBBAAA<<<:::000  ++++++,,,111:::EEE:::%%% + + + + + + + + + + + +  + + + + + + + + + BBB+++)))!!!$$$&&&&&&000===777333;;;111+++$$$!!!AAABBB888DDDDDDEEEFFFGGGIIIIIIKKKLLLQQQ444 '''GGGEEEHHHbbb^^^%%%   + + +  + + + + + + + + +"""  !!!###(((,,,888@@@===555000***000===GGG666!!!+++===EEEGGGGGGHHHGGGJJJHHHOOOQQQ888&&&~~~IJ555*** + + + 333,,,  + + + !!!$$$***$$$ """)))'''///222<<<;;;...111//////555666+++ !!!222BBBCCCHHHHHHKKKLLLLLLMMMBBBOOO ˰mmmddd VVVhhhUUU@@@### + + + + + + !!!!!!%%%///...,,,///000555888<<>>HHHEEEIIILLLJJJLLLIIIPPP444iiiʾ + + + + + +IIIkkkrrrttt[[[222 +++===000..."""!!!'''///555111777777222777??????>>>444+++***---...:::///$$$&&&***444***999===CCCLLLHHHLLLMMMMMMKKK000///Ǹ  + + + ;;;aaagggiii```RRR@@@,,,000@@@666...777,,,%%%)))///000000000222///+++)))222BBB===000222:::444111:::444---&&&%%%(((%%%,,,000@@@QQQIIIKKKNNNIIIQQQ***|||̤ + + + 888XXXZZZ___\\\aaa___WWW999444;;;666+++///:::333,,,+++###'''000222222,,,&&&'''***...444666666<<<333)))444444777(((&&&$$$""""""%%%>>>NNNLLLIIILLLQQQZZZ888zzzȿǽ ///EEEHHHQQQJJJ>>>666999777555777444'''111777000'''&&&###***444111333+++###(((777(((&&&***,,,***((()))111888???444(((""" 333JJJBBBGGGOOONNNGGG+++ɯ(((222999---"""111@@@888;;;222###)))+++)))$$$$$$%%%,,,333<<>>MMMDDD;;;555///''' ***......888,,,+++666:::;;;<<<777444===KKK===((($$$000'''&&&$$$333000<<<;;;666&&&***___UUUIIIBBB---...<<<>>>999888<<<@@@DDDNNNBBB'''<<<999444???BBB888///&&&%%%'''&&&...000222...666AAA<<<111......111......&&&///000***;;;000---000888999444---777999777'''$$$```OOOCCCAAA...555333333666999:::CCC???$$$)))---(((222CCCUUU[[[---))):::333+++!!!$$$333$$$,,,000000000444666===888:::<<<,,,444333<<>>??? + + +$$$&&&(((+++'''""" + + + ######!!!888FFFHHHDDD@@@666&&&FFFRRR===$$$ %%%)))''',,,,,,$$$###$$$"""000,,,%%%111666888999999444---...222333///+++,,,///333222))):::BBB===)))  $$$(((%%%"""  ,,,777666333222333------<<>><<< JJJeee(((+++)))######""""""''' <<<>>>...///666111$$$444111))))))&&&,,,""" """+++!!!"""$$$%%%(((///333000333888111,,,+++---///111222+++ ???;;;((( + + +///^^^<<<(((###!!!%%%&&&$$$,,, ,,,666'''"""&&&(((++++++'''$$$((()))111"""(((---000///777666&&&)))+++---///000000000)))###>>>+++ ---888111 '''"""$$$&&&)))***111 """+++***'''&&&''' ((()))((()))...000---"""'''000...---------......$$$+++$$$CCC+++(((&&&'''&&&,,,444--- (((%%%###(((&&&&&&&&&%%%------///000&&&(((000111...,,,+++)))###!!!444,,,)))))))))111111!!! + + + + + + """222!!!$$$$$$$$$$$$(((000&&&%%%//////+++###  + + + +++******///333!!! 333222###!!!###$$$%%%$$$***000&&&   +++))),,,222"""  ***===+++%%%&&&(((***,,,,,,...///,,,###  ******000%%%!!!"""$$$%%%###"""''')))************### + + +&&&---''' 777CCC %%%%%%((((((((('''%%%%%%&&& + + +    %%%---"""aaavvv---  + + +333&&&&&&(((''''''%%%###'''  + + + + + +    + + +$$$%%%PPP~~~555  + + +111xxx/// #########%%% + + + + + + + + + + + + + + +  (((@@@hhh ---yyyLLL """ + + + + + + + + + + + + + + + + + + + + +  777rrraaaVVVooo### + + + + + + + + + + + + + + +  iiiooooooyyyXXX===UUU}}};;; + + + + + + + + + + + + + + + + + +   RRRqqqqqqmmm\\\lll^^^  + + + + + +   JJJxxxbbbZZZfffNNN  + + + + + + + + + + + + + + + + + + + + +PPPvvvRRREEElllvvv\\\FFF + + + + + + + + + + + + + + + QQQyyyxxxkkkXXXDDDDDDccc|||~~~~~~~~~~~~}}}~~~~~~yyynnn|||~~~ccc + + + + + +  + + + + + +  ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Clear.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Clear.miff new file mode 100644 index 0000000000000000000000000000000000000000..b1898d07e52534b8debcbf9903b1cd84d80809f0 GIT binary patch literal 24408 zcmeIuOODhq5P)IU5hq~fJ*4F%-RUNhHw*%?03kFNFiDZI$P3#&kK0ojHnZXcf4qoY zRj#tWFt{(XALXkbL;u^DdxnT{=qI0&`xv71`DWi6)34JSle5OmK4)>C{FJ27 z=yhI_tE?vC`jFg3H-l{X&RzDb-r0OFF8%oYLC^CRB|VS%wk~4KpR1ojesZ?Zxc18X z3(oc9xh^(++urx_V&Cd2#^~?&(i>T_M6F*2iD4PbpywsK?-F~Rs|}0M&$D;-a6Iix zONVlcVfIl69opkNduSSC#wfD9NHiL6jrloUK!(GT4Uv-)`X{!3Xx2fM3 zgU{0SQS|3(Th*m)%euO?=dL+*r?#}m&f0%f^E!lIPyeZUU370=@gaZ!0tg_000Iag zfB*srAb8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT=0*--,),--./18DN51../.0/0.+!NXHFIO//-)'(**++++-,.*,+,.///-1750-/39@A/,-/-++,.27:@_yW8+*+,/...2,borQ220-)++(+++)),.++)+-121./362/0537<3,+--,)*.7@>R{ތpG3('++*++1(Rޜޣ޳ްޗޘބJ.-..-,*+,-,,))+,*))*.0-..,/,'-11-22/.//,,*0;DOp݋ݎyZG3()+,/00@vv݌ݓ~݂pD--.11.-,00/.,**.0++,/0-//-..)(.74561-+*),-4>EVqۈی|geP0#&*,/-"Hjjoot{lD22458853540/...1320144012440*'-;A;65//.)LV9@IX`rم~vxoM)"!&*):RW\chttdC348::<::841330//0002541130JI:H93512BE94HGPCHSZHKV_hnrmkbO((-:\\Yd{؎؁_G118;?>><70-/011.,//011/10@]5#5037(28?;67J9+-031496--140/@+!&$'2124)++)%!,IQKA.;DHQVhqwnxndԃn-,/25;84WҥҠoO4&).-//*)0-3(-@KKXbt}ztc҈TҸҰ1-+,269:rЎXM9(.9QaR<7+-(*042327'(((!"(ISanoxoieTn;:50085.SͶ͇_W]R>>5/24/+//)$"0;5043+/JI3+-2-=Javmuxp̀eA??:4175.Q˽ˍN?71;A<:9(+1/)!!&)+.250)$AIK.('*/3Vmpqruˋ|3AA?:9<94TɪɾɕP:CF;FA;10+.3/.*+69%!&/+&)5BS=)*-.*GjgmqlpiE>>=<NG5;15)%%(+3318>0'(246&)5/**>1*+&>r~{{ea}gǮǪǎdžǚǺ<<<;;><qqUQG=4*/3+'A3.9>/-+7VpS5$06E0++/@.10,%EtaS1[oqffken:::::79AYmp꿿Ϳ|\UA72+>9+'.7.3NG-(3CC8.JQGUA:7=?:*02.%==79aƽǽRAJ92.?X3+,1))5XQV[B?7VzvN3<<0:?3*/2-)3wcd/>^cWX^[VahV=@BC@BaֺۺdgZ:31AI'<7%'*5Wbog76Sf[34205;5+*-4/.2pd[&0SXLQZTME448>X߶޶ֶֶζ}RHQs|Z-#*0,//*143LB$0:?:8655550)&&-)'\keX#3!4NADNGIJID-4;=lδݴѴʹҴȴjLDVkz-#)++(-(-/05.'7=>:9=6448/)&$&%4lcj=%2`>KQHMJHG&+5=iֲ벲ڲʲҲ۲²RHCPcj@&'+(+(;+)((/0;?;68;5588;4*)'!&MggO4/)y\=NREMKGJ&(+0Nm꯯ѯǯί]GIECQ=+&&+)++9)((()4<:JQ=248<<96)**#)`_]1%'e|9=IGCOOEP042*:AgԭWGKNO<.+*$$,)&5B')-4786IX=7248>=;7+'(#DhXO")_ij<,CFEKPQMV>??=CBKk|m[RGFHOOG,+/.*),+"-4:99<882*-5::6268=8,($'ZVRK;qY;.+1GJMRGKUWKKKLMJHMLIG=7>FOYL0)*+**+/)*/9<;<4&&)487539>;+(("*JIS]sB1/00KQSOIUYJPQQQPTSPLHKF648>;OF,%))()/*5E;15-*+')576993*')("3GNSM+%<@(/-KPPJVbILQQQRQZ_VTXRND851)FYM0+012:33AEA/21-+,,*.01.*,,*,*(;BNW_I4Q5#//LPNP`NJMQQPTSWUOPVUTQ@1'@@OmJ>T\\CILGQRSRRSSSTTTPij+(/.5EE4,/.++,/00//0.-+)%2NRRH;)060.5,3S^ICIKGRRSRRSSTTRS|љՙ|2+2+>U:DDB?;:8,,++-/013/,-+/,*$/QO>1,0+18./+/YT?ELIHSSSSSSTUUQeŖ̖1)F疖֖q:<@?=<<1/,./0341---.0-'4N3).260*26,"1mM@DE@==;>>@DH75322110/*2AY}l>@^pW,-/.,-,,+,,,,--/10253668;ED=9EHE<>A@?>?>>=<;?B@GW?433444320-.Mq=14FSZ----*+**++++-,--..-024459><77;AEEHB@>===<<<ADG??=;<;99:?GEUޑޫށZ@1),,,-/*)qޡޥ޶޺ޡd0/110/-*+)('(*--++,/341//393,:A@;B><=?<9;:;GKQ݁ݩݭݖ{^:''(((+*'fݢݪݯݭݎ[3436620.0.()*.010/15895011)*0/9:9?BA>:;>89@GNdےۯ۱۞ےۇf=&$*++'$\ۑۣۜۥۥۡۉV889:=:97750/1234779=>=866955656=BC>A:;>4P[JS`zfz١٠ٗٞٓi;)+/&)Nqكّٜٕٚ٘نX9:>??AA@?=;::8547<=A@<::<7EGCKF?CE@>CC:;:==BK3;?;>D:>>8A=>>EJWY]nԍԁ0.39?DKKW҃xT?4229=@@;4416;<;>=;9:?3481/549?CA>9=EFDDBJKMTC{_ҿҺ8304;AJHaХвСЏmI?9=CAEUSGF=A;68:8:;?1--2775CV>::@HGFOFJRXUS`KЪ@=625=GFUΙθξξΧ|\L:9Js΁]K<9:;<;6><8D?)+22<:7LC99>QENQTVNUWZWOtIG@96=EDL͎ͮͲʹ͍ͬ͠zeNOLH;>>>?>9378339>802557>PE=8?>G>?=?;:9348;;<993578=>@UG9:<<:VmabndWɈnNNNMLKLLL_xǀdž{mR;3ECB@C4B;9:841,-.((08;=D657.45J>6:7HqsrsVDǠǚǸǼLLLIKLMPNLSe~q@>@aÀËÝëëñùêöÿKKKLLLMPPMG]uK?=<>;>839MA:72" !%;cN:6-:8I;888J3.-24M{Y?@YMMMMMLNNX`dxvdM97B:GB664D<0DC/,2>?73OOIUEB<27>12.04HqFA;_|MPRRROYw|jzẺ躺ylW66:OX1>@0-39SVda/(F^T7688:;6560/098wR:G9:77<;61-35768:7688::===EMTczszo_Y\^_K5048=9;7=I9:9<;:8HZC:986867?;;;6IUM]9OTH~MMNPRWYcjdWUVZ_dZR:47769:<59<6;=9;<668998;@;;86YTYcx]=3CZ[[[[__^]\ZNHPZ_aJ4=:987:=5?794665689:>968<>>@8::7:RT\nc2869C_```_bb`bbbZJEHJMXD:78::9;698;@>6:9>A<6<=?DA888<;3ASZYYM2>M;:@```aa__aaaabVFCCCZ]J;9<=>@>CHIE=FCA:<=8:;?<67<;;95HOSVovVkQ;8B``_cbbbddbbcaPAAK>NiNCEHIGLIAB@=A<:;;;;:888:<8364=QTQ[XevW@<9@y`abaabbbccba_aY@MEBOLC@ED@CDABA9=<8;;:::989:98642@TQUenm_C9=;9dabdbbbbbccaZp{><=;BHA>DDDFFFD==>9:::::9899:6341=RY_\S?EJA;98W~|bbcbbbbccb]љݙJ?70?X9@BACEBB;=<:99:::8687643.8U\O@533>K>24Mu|wcccccccddbjÖ󖖧O6Hq=@@>B@C;=<:99<<;8788760+=T@9<:889DH6-JosyjdddddccddadۓnJ擓O8ABE?<=<:999888777676;L847679988AC1MjkiuVeeeeeedefl琐ِs{͐ߐj8@HEB?;98775775677FJMY177632320348>>CV]ql8eeeffecgiu͊튊芊ԊԊk?68A=?A?=9:=>;PX]v@78985331/0345@C>Jh]4defffechlwƇ㇇ׇއÇuH639?>>ADG]FCIp`9==>><;;731..12DJ?PP9ddgefedhkwЃ҃惃؃SDKLONOgLEJgYF?>>?@A>@=;61/-3JLIK;gikhfgfglҀڀ쀀怀gKOONOONSeeVTRIB?ACAABCEE@=D`bMR\B||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/CopyOpacity.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/CopyOpacity.miff new file mode 100644 index 0000000000000000000000000000000000000000..ab36c060e8d6c3986f5348f20b227ef012a966a1 GIT binary patch literal 32407 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/CopyRed.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/CopyRed.miff new file mode 100644 index 0000000..cb98111 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/CopyRed.miff @@ -0,0 +1,16 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=100 rows=80 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=100x80+0+0 +gravity=Center +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T07:35:56-04:00 +date:modify=2012-06-21T07:35:56-04:00 + +:0268:989887545511479?FJLNUtR:7763/036PlPRuzY/0578868887446633467>EHIKMiD99661-052ExcJK]lY,,012202222113333457:>@CHEUm<;951-,/103IlkH=5>IY,+.//-,,...//00/22238<>AFHQ_yWC7/.--/0//4g~iY`|_,+.--,+(*,,**-./0./08<;>AABKhމޕޘޯ޺ޞޒޔޕގއއނކޗޮޣތrS<0-2200020eޕޏަޤޏޙޅY.//2332-,*+-+,-/./46;=;;>>59Oi݃ݎݒݘݔݓ݉݉݋݄{v}݆݇ݕݓݐ݉w\N=2/-0210+[ݑ݌ݠݝ݄݇vO23599:833-/1/110/4;ACA=;ADFEEGEDCC<99Gewnms~،؀dS66=BFHHJMJHFEA<:>EMOOKD>7րֳַֹ֛֥֬֒ֈaHְֶ֑֚֘gW358=DGJMIMHEC?>=>@IPHKC5@ԦԯԤԦԩԠԩԬ԰ԿԮԇԅu1/48>GOMXҀ|[F965:BKPC:0BҊҮҤҡҵҸҭҳҮү҉ҵ:637\Q+ghiiijnlfh݇ڇ采ڇyeejlihc_YeE9Ep\277788762.,(*,/==1BE/dghihknlddÃуƃ僃уhX]\VQM^@=Gi`F::899;::970,+))698;/\_gillkhe|Ȁ݀ɀɀ退退mRUSPLHEL]aVWUMC<8899:;<;956GG:@H4||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Difference.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Difference.miff new file mode 100644 index 0000000..1aa4bfb --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Difference.miff @@ -0,0 +1,40 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=100 rows=80 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=100x80+0+0 +gravity=Center +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T07:35:56-04:00 +date:modify=2012-06-21T07:35:56-04:00 + +:嵶qK1  -38BMSTSRPL4*PcHwYi?yu@wpniPKUkiy䵶{X>*347BMSTSTSL*QlP^g9x8y}d^fxtⶶu^C" +)=9=GQTVWYYGYvX[%wqcളgM=$9EBDLTXY[^ZC&,yQVg{y}~FCbYwpBqpn^JTdQ_{޲vUIF/$@LJIPWW\__XG0;McR3Rl]nymI=BO9;8+:.O(GE$FY=ZzݯtZOKEIJTTRYbg`WVHJ\mM4RT0OfGdbwL;gQ3g=Q@JY._V0[gOm۩qXU\WRVSVeeh`RSUwaIj`,SX*Oe=_vItwTvu]Jq`?q]8l\6l^6g]:`lRo٢vRIUUZ[`d_ -~infyZ_#sy_g78TJ9[NBcY;ajFjpqhqVnH}k?vnAqf=eeDeqSuؠM>R-6206.,:b_ hxnHl~''!y prjnfykmvBszaU|jQ|kOeItZ@]L6JXBWt[yy֠Vy ;*#1 DrNssx! +()))z)n)g)d)g)|^{puW`r<7AE8>>6< !)  +&%%o[qoԡ.%0.+4+($%   * &()+~*l'c(]%f)}\+{UwfMfp  ! %)%) !OGQ_Sfҡz{{RO-VZ2w~cH$.1 % + $#!%,z,p-^-U,X,~^!oWJIs~ ----#--&---,-,)-'+ "Жz|lo^2+$/3/AA bcBx{o}~o<(" $) z ++t(p-b,~V'xV-{_)}i/p`{&,//.,//--..*%/*). $  Ίzwqyd>5#111''!NR hr0|[|H[3$M qS~%  &-,} +}{"zm/x`-_/yV1w_1te.wiz-Z`,.11,110+)1,',!"+$+- ~zvzI? '.22$!,1- B@ ^SlhFHn~v"p{   1*" }  ql1gW0}`-sX$[U&k]!RM;Xhw} + 2020122/102+22- -+./t}u~{xu}zH@('+''4'4'%++3* U>}$"  ,~ +mu,]^+d[&dZ"WY0\V4Q@C4Oz 444434043#4%44.43&3-2/nynzp|uu{wr~qxuJI52 420'#5*A9BD `4y    $tvs'\_ hb(g\1[X6e]/rYTA`q[( 6666660"& 4/+ )lymylyozm{p|o{m{r{chRPO-EG >ALLaZ!Kue8"'y + +  084,4/ !  }! 'VU0TI3UL6TL7qb2f/'JJ-` 298 A- ' jyjyiyl|kzjygxgujwly|graX`*>F*GT"~#7${ + ))03:.((9.#~~t~ "ZZ:D<8KB:SF:xa4iC?g^>tI@idGt`8lL$]?Q8 L1Fhxhxjxjzhxfyexetetdudx{blLGL(<(2^LR *evevevduduductdqdq`t^zZdPB; :5LP>vl2p&z (t+6;>5-6k>^Q0sn + :x| w!;9/t|>21>F9>hM>`nxhQ,f<R>PE[C[BVC\;S% 8+*ararararar`saqiq~^gfP_RR[OOG<3+&<IC)[c>rj3~}x} $!{1@{q6|x'" || pupn vx*jjz~}46)494w@,*>N>@yW@["~xq]M)eF\J _I"`E[D[De8 W6IS=X^n^n~^n^n^n]maq^b\@A<@ LGA7 #" + ' Mk q|3us+t~We}'$'334ke-sl.lg/gb}{-~.5sgBNCBWG*ko|x#?B~* 3>8 A5.;[FBZ7|Yaq^H,_BZN&fK#eE_DbFg=\=UXAg_m}[jz[hxZhwZhz^kxWaYCC C>WP@@ !*'>81.)AVNS[R LB ' /   +510INSNT+?CGQSvo2yr.?76)~'}021#(7<<#tvBPCG}TFxP8kqfh|sviYO1lS*tQ'mJ#cP)lZ1s_;uaIv]EtrtlqzZixVcxQW^{w/|})z}1xz={zD|w0z~zxxuv7geMpKM|K oc|~znd 9#A"VU.u@dC`L(mK)eM*gL)kG!h}~urc`aWYBAC ;G.0"++""!*.8CNRQRhIRfESj'Vl7]^xs@zv-tyw r rvzP_ONrPfRdo~|e|)J%# 3dLvO0rCfK#hJ(lD!`F`I j?_mo}opyqp{lha`sXYlHJF), +!'.36:.3 4>.?NVATfEQbCO_.N^bq+x6}5y*up*t rv*px:dkt st)qy6rv=suwp?vr)nv rr rwdiOXE%`U+P^ztg^8ND%CdYqqeF/jCgL!hB!bA]>\@`7WV^mU^lU]lU[nOYhKTiIR`>H@4A/;G>NTPTVYNUdEQe=LcAG\#Q\Ydq w6t|3t},u(r*q ovr~,ow(cq)ir-mrYAd: `3V: TEN]CM]CM]DM\CM[AI^@I`AJ[AK\BL_HNaWZk\`qUXjMNbIIYGO)^\+txk%n~2o}-p~-q~-n}kysiq~)oyAto@rlErmGsl.rtpo n/jtFopJrqCps=lu8jo2jj!hmp}nn'q*n~V^T_LU:K5UEfvspwqryooxoexA&]1 W8U8Y9_0S1OH^>GV=FU=FU=FU>GV;DRD[FL`Z\pfarf^nc\hQYkNWIb`"lzo,n}+l}+l~,m}kwpmn|4kqHfa-hkpulqmy h|e{jp}-jqFioEgp9bm$em nsn|n"j})k~/sesS_LXMSMYeY{tohj[Yfik~olwnfy>$[0 V5 V6 \-P)DD]FZ:CR:CR:CR9BQ9BR8DI8DD8BM8BO8BK7BQ8AUIM__]kg`nn`rd`z I]CFJMYV,hs%jx+gs/fr1eq+ciep`p8[bGZ^.^bft]q`r*bvixgwfw kyiuhsdrgumylwgw$hy(hw0jy-n{[hTa +PUML4D=-Z\MoE8RXRnihkktkat: W,S3U1S&C=UAYAV8AP8AP9BQ5>M6?N4?J5?L5=R5=Q5?K4?L4>M9@PKQa\`pi`zVaca7SRV84=SW0^e2\b7Y^=X[CZV?UVFXYL`^D_`+addq`oep gn"fo#fp'fr'fv&gviuiu iygw!eu"iv&ny(ku1mx+dpPaMZPTFNJIaRM4=L2]_BWZCWWCWW?UW:U\9U^=W]^g^o]lbmapapaoalak bk"cl$bl%bk'am*en-hp0gr6jv(^iIM +BIVV@XW>TYDVZ,SZ[eYgZj\h]g]fZcZb&[e+^i-_i.^i.^h+_f-`i5fo=kw)Yb BHOVch]meZh_\d`^`d^fi]l`Rd]N`e`jjitVLe)8IE'Z@#T:O4JE,Q,/@,/A,/A,/A-/A*0A'0>&/>&/@)2B/// &\higligi[eiZllZQH-!%NS"TXW`V`WbYeZdZcZa[c)[d+[d-\g.\f.\g*]c*\c-]e+Xa%GQ[[`b_g`\f^]h`\jdZhcZie[id[g[RaXPacboOFY$)L)VG(WG*X<M1EP=X(+:(+9(+9(+9(+9'+:%,6"+9(*?"$(RW[ooooolhkahjcoo_JI( 9!&8=9onloommonoooooo`OH+&2 Xe4PZ7HWKZ NYQZU^W^XaYbYb![e&Y`(Y`*[a)Za'Y`$Y_$Ta)J\1"%5g^h_Yb`Yc_Zf`[da]ca]ca\bb_db[b^Q\]P]PCVG8PN;XC)PI.W8F3<\L[%(7%(7%(7%(7%(7&(8")2)5&%= LU[rrrrrrpojX[QV]JcdLFE*'#@?:eedrrrrrpqqoqqorprrrrnrj:HY0T_)QT SRMPKQMWNXNY#Q[%S\W[ X\#V^&T\&OY'GT*CX.@X$<4Gc\e]Va\V`]Wa^Za`[`_Z``[aa]baZadY``U`[O`[OcWJ_I7RE0P/;3!:aU_"%4"%4"%4!$3!$3 %4'.#0"!99CKtuuuutpqh_cR]eH`^DSJ=eVWupuuuuuusttrttrttruspouupuuuuu^J2*7K\T` R^IWMSKQIOKRMTQVPW&MX,LX:O_5:Q-2M--K.XJ_XS[XR\WQ[XR][U^\W]\W]^Y_`[a_Z__W_`V^]U^SJUQGVWL^L@V."69-;_V] #2"1!0!0!0"1$+-!43?FtwxxxvxxkipZV\\5+'@UN`PJRPJTPISOITOKRPLQQLRUPVYTZ[V\_Y_]Y][V[XUXJCJJ=OVH_E7KB7CXNW0.,,,-')1 @MV{||||y||oot]NO3C<0mck|||{|y{|w{{y{{y{{y{{y{z|x|yv|rz|w|{|||||||||{uqabUEN:$0H+?W&8Q'7O-4I25L64K%8C7SF>Y<9X9#*?==NIDNIENKEOJDNJCKHBHIEJICIJFKLHMSMQWRWXTUZVUZPZM9QJ7PK:RH8KTHU$1!.)(('%'' +HRYuzzwzpnn\]ZFI@.I>6i`f~z}~~}~~~~~~|}{}y||}}~~||xtvlh~z{~}}|nifM5.5S+1N-1M02L41J81K;2R4-P#@:**C),D+.G37J=>KDAKH?KH=KG?IG?JF>IE=HD;DE;FG@KKCJJO||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/In.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/In.miff new file mode 100644 index 0000000..ba7ac56 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/In.miff @@ -0,0 +1,16 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=100 rows=80 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=100x80+0+0 +gravity=Center +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T07:35:56-04:00 +date:modify=2012-06-21T07:35:56-04:00 + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]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 Wfp!nZ3S95OSb@d(gWCVg8vg}?8P^T~ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Multiply.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Multiply.miff new file mode 100644 index 0000000..4a3ced5 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Multiply.miff @@ -0,0 +1,16 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=100 rows=80 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=100x80+0+0 +gravity=Center +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T07:35:56-04:00 +date:modify=2012-06-21T07:35:56-04:00 + +:+*(-+)1-*2.)4.(3-(2+(3,)2+(2+(1*(0(&/(%0(&0(&,(#,)#/,&1/(31*94*?9.C;/D:-F;-L:-h=/<.:0>7=@6-@8,A7)C9*E=.^>.}9)6(?6=?;>6:69:58(8&8'9&8&7)6'6%5%7(7.9.=2@5=1'3//3.,0-*0-),,((,)++)/*)-%'>-,k:/ORxpX`B7_C9RST\rxp`dUONJ''''(&+*'+)&,'#,(%+'&,'&,&&,'&,'&+'&+'$-('-('-*'-+'.+'/,(1/+3-'70(90(;2(@4*==/K<.a6&u2#=.@6=95776:+9%8(7(8'7$~7'|6({5(y4)y8*:+92?>AJAOPF'()&()((()($)%"(&#'%%'%%(&&(&&(&&)&&)((*''*(()(%,(',(&,('-*(1,)5.)7.)9/(>2+?70G5/T0*j0(4)9-=2=8?9:)8'7(6)6({6&x5&w5'u5(r5,v;0>3=8[T~yjLYL;:10/&)+%(+&(*'(*))*(*,(),()(,.%'[WVow\bNQbTbdr{m~qTYG&),&),((*'(''&$&%&&$&#"#%%&&%&&%&%$$%#$'&&('()&&*&&(%$)&&*''1++4,,3,+6*(9,)90,:3/A/,[0)x5*6.9,;0>47,7&5&3'|4'v3&v2$q2%o3(o70u>8<6JHkzzcqbHO>48,*+#'$",&&,&&*&%*'&*)&,%+*$#XcH}}tsNWA(*())')*(+*(,*',)&+'$'$%&%&$$'%#&'"&%#$&$$''%)'&(%$)%$-&$/)$3,(5-*3*'3)(6)(6,&.1)1,&D&"[2'q8*{7*~3'9+6+4)w5(w7)x4)r1&k3&f2$l3*t=3uA;FDpa}xw{giPkNDQ=52,+"#)"$'#%*#&+#)*%**$*%"OX7~fyfyrmuqf{aDO;+,',-'.,(1.*1.*2+(0)',(&,))'()("(*#(($&*($*)$)*(())-(%3*%8.&:0(81)4.'3)(4*(;*'F#(<$(/)#F("[1(q2/s1-m6.q9.v8*r5'u2%r3$e5#e0&c1'j7-v=5uC;sVJi}ajuqxekW}XVtWEXE-4)$!(!%$$#%&"%(""'#KO>l}[j[l_m_kdlj_v]AJ:/0+/0+11,31-74081071-4/+3/-1-,1))1((.*'.+'.+'.,*1/+6/+81)=4*?5,=4,80)7.*6.+31,9-,7-)3.$;-!T.&s42{87p92p5.l7-k1(g2(d5'h,#DANI_?1[G7bR>lhKWRhaqzkvemf_}_KYB62#+# %%( 1 $9##HB1Y`FYpJ[|N^T[YbcccYrUBK9/0+01,44/751951;73:71:61<5/:4,92)91+91+3/)0-(0,(3.)83)>4)C7*D6-?3,:1)71)43+<.)v:?<>q91?=;05+9-:)6*489:d90f1,3=:92A7.>3(<2&;3':1(60)2.)1.'40%:2'A5'B6(B4)?1)91'43).3(k76?N+,15,1(4+9.1"4*4//52295.1'!71zTBrS>SO1:78;B':%<(F,M1W1]6`<]KeLVQ3+<8'jcT}zVgUIV@**(,,)//*32-98/;;4>=1@=-=9.@<><5/91$8/%4/(4/*3.)4/+53/=6-C5%<4%>/)8.+,3(54'=5+$+6 0- 3*6)5*5+/")$$$("-,/%G=GC6>461&91694<6C3G4V4^9c>[HdJjM[p[Sÿ̻ȯoumak[((%'&$+*'./)34,;81A>.?>+IHHilfcKE[:4A/++-),)"0/&62%>5'B5'71#0+"(+(6(%r-11'1 13$2(1(/#0#4)*#+$.&(#'!,+/$4-76633*/!2%95:>8>8I6Q=`>g?eE`7RepqNEǮž/.(,*%*'#-*$10)<5,F]-/6/.-B:64.. 2(B;82?;BCDOFY?ZEaFZIUFR@D^Yʶ²ĵ?;/>9/83+3.'1+'41->7+C7%F=Cjrɍ͏͈}pqYbNQlk?L?F=K:B/2222+2&3(2*.&)",&-&)!).2'-/'+('+*+),"2&@;7;1)-"0$6(1$:1?;JNR_@WH^[`OZcgu^QE@4ɾDzʻE>2D=2@:.<4)80'73,<8*B8%D>@hnĂ˂˂ʀ^p4>02/,3'8/04-03.7-+ (")'/%,!)+,*!*"-%)($*!&'!*<49:=<-%. //!0%3)KDWWRYRZ\[X]anlxc4@)ʽ˿ŴǺH?3H>3F=2B:.B8-=8/A:-D;)E@Bdetwuwxt}kqjiSu0?2.15271.87132.0'2&.".$-((%)$,!.".+/---(*%+",0 1*24CA80- .!/#/$.!D8VSLQMVWYOUDX\kSEW6ɲĵõG=0F=0G=0E.F<2E;8I@MTNxhbxaW~170!1,.139.*,3+.+4-*.+(,#(" '**.4&-%-!#+)77*(.*) ++!?7.',&-'+!+#SSdj^eXb;M1GdgIOh?`gGKa?NmE]|PgZm]rbF9,F9,D9,D8,F9,G9.H9.H<-H<-I<,I97JB[_[vgvM[(915312631-#}+1)+-;5=2)( )%%$%,". ."7#B>LFS+<%(*3)?<31,#*-+52+''%%%,%(FBgj_eR_7J/ADJ*Mb1E<.JCGYWrTXCJ~NUnq_bbPMIoMHWUJI1/,&+#0$+!3353(#'#)*,'*/BJ?D(%05.3()&'&#%#*"+%'&(('&'!(#%&#"&10KU+H.K]83;:+20!9E)Lb7Ig1Ji6Ol=Kg7Db2@Z0?P0BS11/'51+B7,E;,HD?WShRPwBDsKKcapptsroqkjbPJYC=;Y;3@:VR[YC@' &*)"')"("+.#,%'$966/'"")-)(!')&+&'&$&%"')'& &%=B9L(H.?)&./$'(:@%GV8D^.Gd1Mg8Je3G`4G]5I[4F[1%' ))%80*=6+IGLLKf99a@BtUWaacb`^`[c^_\zY?KA@6O=0;=HK^Z[V* **&*&) () )!)",%) #!'+,)(%+)&*%%%%(&!'(&(*+%=L'F/KK$+!!%B?#q~\QcDB\,Mh5Oi9Ke3Jb6G]4H\3Ia2!!(&%0/*?@I@A^??mTV]_[[Z][[a[b]XT_P=9CB2FB/y=8?EMJ4-&*'"+(1)((&&*!)!&)",)$&%'&)&%'%('&'&)'$'((**46.H&Ht/7$&$'!/6sTkOd@A\*Oj6Mg9G`0H_6F_4G_1Ke4 " !"(*!466<;KLJmdbecYW[[aab[YReJC@A@1F@2I?/]=.88**!&&$$*)/'&('$")$&) (/3;8-*&"&$&&&)&)$')%&**z'}$7B*A2@4,"#3#\hEs`buU4D'BW*Jf2E`1E].Jb6Hc6Fb/Mk7+*!*)#))",/44':9,ECFZX|b_VSwQNpVSoRKVK@;I<0G>3H@5V@6p3)$!#&)'}({%)$2-y'~'')#(%'&&%12=<-)'%'"&#%&&*%)%(+%{(q(o(f%2.:G47-@:,B<2IBHPGSKCI>:=:97>:/D'')!"'-!DU/Je2Gb4Ib7Gc/Lj2Pr9Lj:A;1C<1C<1B<2C<3D?1E?/D>3D=2C=0?;/53(2/$75)<;.??4c@;12" y(&&%$&|(d#p*$&"&$($'#($"r%n&w&)"&%$$%#(")&))*'o%b&]&U$S&m61b70^=7cI=^jL7A,!#% $$&& &, DV1Ng5Je7Jd4Ie0Om8Nm;?\1D>4D>5D>5D>5D>4F@7E@6D>4D@1D@/D@1>:-10#*-"*/$,0(72&v93,-&$$&&%z&^#`%z$&"*-(&z# w&"i%f(g*k'w#'"($)#,%*%t$!c$[$V'Q&M!Y*!`6.^:3a:6Y:2*2 $('12*(&$&$*DT1Mf4Ie4If0Ok8Qm@@[/>X1C=4C=4C=4D>4D>4D=:D==D>7D>6D>8E>4D?2:7,,-$&+""+(+`:-<9/1&$&'( )%r(!v+!.*/,,*f'[- T+M*U%X&Z'`$h%v&{(t&g#\#T&Q&O&J$L"].&Z3*b52d78]G=AL/-7!5C>4E>7D>6D?2D?2D>6E>6E>5A=362(+)#)S/(y'(12BE1/*&+(-*.,-/0/.-)**)(&d&W)T&Q% P%O%M%M%M%T#Z#]#V%Q&P#M L"G!J&T3(V5-a30X9477(2@&&H]4Jf9G_98Q*;T-?W/9O,?;1@<2A=3@<2@<2A<3A<3A<3B<3B<3B;3>71FD@ca]nkdLKA!&%%%&$9( d,*(*&%)())))+)+&+%)&k% P%M&Q#Q#O#M#M#M#K#J"H#H#G#E!CA >F%[2/X62M:2:8,*3$&$*(-!#( $ # !".5E[3Kd9:P,7M);Q,;Q.6L+>;1?;1@;2?;1?;1?;2@;2A;2A;2@;1<82OMJ|}}`WJ(, &#!6&%{LL{53"#&)')''(&|)#'#r'!T#L$M$M#K"K"K#J#G#E!C B!B!B @>9C!Z30I7///% & %#-!% '.EY5B[22F&6J)9M-9N,4G+=:1=:1=:1=:1=:1>:1?:1@;2@;2?:0?>;nstx\bK,.$ .*)]ZY~~BBq$"w&#|&&~$%|'$&#r'#V#L$J#K"H!I!H#H#B#?!> =!=!? > 94@$E1.*&!# " ! !! (!*  &+H[@7O-0A#2D'6G*:L-0>);:0;:/;:/;:/;:/<9/>91?:1?:0=8/:::`gk~oB?2%+#VWRg[c-%h v%#v&#x(%h$"R#J#I#I!G!G!F!D = < ; : : << ;<"?,&   !!   %"'',!@P=)=#,>#,<"2C(8J-'2";91;91;91;91;91;91<83>91;:.>=;Z^c{zh?A1?E<3$$$+!)2$%0 +:$(7 2@*4D/&98098098098098098/;72=7199,EGFx}{}wxutecaXqqnnZNZ&he!T !F#">$!>#>#=#;!9 ><;99"8'7)4+FF:-1'""%&0!(3"4>-2<.87.87.87.97/97/97.:52;8189,:?=ios~w}q~}owslyz}sfa:-U"NE<#>!>"># <";!=:6!3!+ .+20!22";@2##$!!(28-,2+65-75-76.76.76.85-:4197/69,7?;bhlwuxgsqf{uu|sg[T>1@&5589!7!7!4"2$/%51%$%#$';;+13%  !!  $ '!#* $*$33+53,65-64-64-74,93/86.37*3=9dkp}}sll^fb\|vz~~uvoglaV6+-#0'/',)*(()05'!'$%&65&1.#$$    !! !&'&'.4(05)46,54,63,64-63.44-36->ECdim{}}|}xwwnomce`We_[ups}~~}~~~~|z{vt}~~wusg74&)&+(*(('&($(#'&*/3 13#++,*+)'%"! !"!!!"## "$0$1' )$.!!||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Out.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Out.miff new file mode 100644 index 0000000000000000000000000000000000000000..e241df93583bffc36d7672d9601bc2a21ca9fb19 GIT binary patch literal 24408 zcmeI0&r1|x7{@&i{RJIj?zzkCuDfds1Cfz*NFqFSiD~z39om^)XJ-8Y9Rv@8AP9mW zf*^tjB7%sBAR;0nqKJqnqKGI(6h%=KMfGl8JjL@pba{9_bJ&^pedm4W^Es|tupfF( zQ9W{sZvLfdcBmk9%f6k6TSmU*grR-k4OBjAs@3I_=R}dRA2_8@8G5wp z`JtV#^h8kZ4DCjJQ&5$t&2FsC>USzmUfJQ3=6m|ts{|_idrV8&SEkusbxLm3ZCi#O z*Ly{^FUTglvPq+&zpb`!SEF@XUq&%-I%-Rslpm=;ulEZoaQ$M;)z5xpKUP6rpQ|@C zijLt3WRBMIaaWERYL)637KU3giMG z1ag7*0=d9Dfn4CNKrZk`AQyNokPBQQ)UgAxzq~+Tm#Pl2zc@$W*9x&eKSSWx3b8*s zMc~&8u|GXQ;MWSVKRHI=*9x&eK0@Hv3b8*rMBvv7u|GUO;MWSVKiEg$*9x)U-$UTn z3bEhYMc~&8vESW6;MWSV-`Pgs*9x)U-a_El3bEhXMBvv7vEST4;MWSV-&jZB*9x&; zUqj&63b9{XMc~&8v0q(5;MWSVUs*=r*9x&;UP9p43b9{WMBvv7v0q$3;MWSVUzkVW z*9x(ppF`l+3bCJ?Mc~&8v7enm;MWSVpP5GB*9x(poMBvv7v7ekk;MWSV zpBP8r*9x&8A4A~R3b7v>Mc~&8u^$~l;MWSV9~nmA*9x&89zx*P3b7v=MBvv7u^${j z;MWSVALvKm*9x)k??d3%3bF6&Mc~&8vG46c;MWSV?|CJV3v>(Q0#$)rpj{vr@C0&! zHi2BAAdm|@6UYUg3giN<0=YnoKrYZMkPF-u$OW8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTjkڈeZZNuRQe[ccfpfvwlKLNJLNMLLNLHNIFLJGKIIKIIMJJMJJMJJNJJNLLOKKOLMNLIQMKQMJQLKROMWQN[SN]SN`TLeXPg]Vp[T~VOVLZN`RdXd_g`aN_K]L\N\L\J[J[K[M[QbVfYd_ӆ~vvbaWVTJNPIMPJLOKLONNOMOQMNQMNLQSIK흦x{~pMPSLPSOOQNONNLJMKLLJLIHIKKLMKLMKLKJJKIJNLMONOPMLQMLOKJPLLQNNYRR]TS\SR_QObSPbXTc[WlWSXP^Q_VbTeXh]`T`M^L\N]N\MZJZK[O`Xhaf_vsIJ̭t{h]aTQRINJHSMLSMLQMKQNLQPLSKRQJIs½Ѱ׸۹¥zkPRPQQOQSPTSPUROUQNTOLOLMNMNLKOMJNOINMJKNLKOOMQONPMLQMKVNKXQL]UP_VR]SO]QP`QP`UNW[Q[UNqNI\OcSbS]OdT`T^Q_PaQ^Q[N]N\L]Ri]mfsq˭ϰ~|pi_\UTIJQIKOJMRJNTJQSMRRLRMIA}bĘ̘뮿嵦ѠϤq}fVWQWXQYWR]ZU]ZU^VR\TQWRPWTTQRTSLSUMRSNPURNUTNTURSTTXSO_UOeYPg\Se]TaYQ_TS`USiUQvMRjNR[TMvSL]R^[]XcYfZeUbQ^O_NbM\P]QdXkbrizӬհ ttXaTNJGRHJONNMOPKOSKKQMHF{lǓɓɘşpzh]^X]^X__Zb`[fc^h`^g_[c]Yb][`[Z_VV_UU\WT\XT\YT\ZW_]Ye]Xh_VncWpdZncZh^Vf\We\Xb_Zi[Zg[Vb\Pk[M\Scahgiad\g[`UaUdTZOvrҁ|p_yfo~܌堘ǫƤĞ~seaOYOHKQGQUL`LPiOOzt`x}št~i_`Z`a[ee_hfakfamhclhalganf_ld[kbXjaZjaZc_W`\V`[Vc^WicWpdWvhYwg\rc[laXhaXdcZn^Wlqnpjarom`fZj\lXgYeijlj`a[co ln|wjozz'Oo'Pr!g}t ~wmvyUOeZOngTaɵzn_`Z_aZffakidojhqlgqlgsmevk`sfYqeVofXndYjbZe`Zc`WgbUneXvhXxjYxgZtdZmcXgfZ`fYkit\^dLh^dYg\m`cQg[gaah eemh`dWPkcxs!dn +klox(Wn)Uq)Y})])c)c)j)p)f\qlXȾڐu^^[``\cc^hgaondrriutfxtatpbxsuskdpfVndXjc[ic^hb\id_khdtla{kXsjXvc\nb_`h[kjZtk_V_LlQeOaRh]l\k]k_cT\V%VV[T aP`LdWt |*lv jlfYpflo(is)l|+h*i'i(p%u)+ ! %)%) !^]Z\[Ya`\ef_klbtqh|xezxaҩ͈sl|faac_Sb_Vgf[ojZxm\}m\phWgaV]a]o^Zcih\iThRkYj^h^fWgXl_`WaY +e[^X\UbMaNfYlc pn nkk`fUjZrm!sx%qx,q,o-w-x,z,!p----#--&---,-,)-'+ ig`eb\b_Zfc[kjaxpeyhwi/{xon|khhplWqr]gphittuvkuflZp\jWeYg_icgaibjanf`V$\W)\WaWfPfQdW rk |maiRiXofwuvwuy+~(u-y,'-)/z//.,//--..*%/*). $  uqfrndlg^fcYkf`wnhxgwh111!σ}hktkjh{۲뎬|mXjTk[l^mdld gbojmhi`uj&pe-ZZ,\\c]cVmYk[h^}ytqjUjYoczvoz"/-/11.ҥ,.11,110+)1,',!"+$+- ́{mylxrgqkbohbsojwgv`~.22, 蓗"~zmppppgpaqdpf kae] iaja e[eVkTpb1jm*bgdbgf"gei] pa|w{oej]n_udo_zo|10-$&!ħs2020122/102+22- -+./ˋss}nvhzpeytk{i{b+44%+3u$psoktezo"qumptnymj\f_heock]hUjUkZi] i_lbhf ai,^de]iXu|}lbn\o[o^pctg,+&"04˰ug444434043#4%44.43&3-2/ɑwwup}o}roj #svptyu|tq }|twuqsgufqapdoiiejdn`qaql roo[oWi\ keman\s_tkvx$}so_p`rcrdp`}' (16/{( 6666660"& 4/+ )ǓvvuttwtpҺ޴s~8kw"}v'{zxm{s +lizmsaq]r] p`lc0ik8dk4ei,fp4`v/`h h_p`sj!ul |nn^maomfglbmb vvinbrco^v'03672|صҟ ' ŕvvvuuxvv{ոzxe#zs7vz$|vqsb|rur +~tq^ubrana)shna)f^0ca3_l:Pp.ap(v~(kt9jt.ehro#pnupodr`revmsk tmrerg":8::4yǓۢ×vvvuvxxwwv22}&{z{|ryh|mvqqiwe(qxl+uw6p|;`m>^k5_i-cu6y>0 +xstbkVxnvtynvivivm~!ql;lo9kn/pjrc>>>>}~oә诺㤼᤽橼zzzzzwy+)>3ywwrzk~y vkvg$tn!w|n1ps@6'om"lhrs ~wx sn *z|w4r}6w)~zqj4rp9nr4pnte|@>@@|݁|֚ᣵߠݟ᤻椻궬§y{ÿ + 3+y{|typutm'sn$s'yk3ok3ww4-./-{.oy5BB*wu~~#vr?n|Bw*xu vl3tq>pt8qowk~uA;B7}qӠॱٙܚ࠻坹ᪧ߼!*'>81.復<0{ {xvvl.(|&uj/rl!xo~z4;EA2.~?|}7|x6zw)v'z0}|2~1}{#}t(~o7xr/)1=D0wvtns7MMx|v#ݩъ囼៳ג֚՘֔ޗ~v{~x{;G"㼱ة7<-{,v$v2{y{{+yxx x)y8B==@;2039>@-y z zsyPN}uw%̛ύ䙴ܗדޟߕ렯| +'ѱ+6}5|*vv*~ {x*:y {)6=?) }yzuO%ԯt{~Е昳ޗޝ裿˾ĸ³ܮ 63,~(}* v,()-BCC?:9=衐⢓青鞏垏㞐➓➔ߝݜ۝ڝ؞՚җϘɕסö +签鯼૛ȸȸɹȸȸȹȹɺɺȸù688abdfff[D<⩰45EHDD=7D&壒碑砑㟓㟕㠖⠗ݠٞ֜՞ԝԜњ͙Ɣ֞µۥ诽ݮ̼̼̼̼̼̼̽;;˺&-/iiiiiiiihiiYT]6贸\ZQdJ@@+4>@>D,ꦘ祕裗䢘墙䥜㥝٤ԡҠѡѡԠҟʙ”֦߽ﶺإܫ뵺ӮпооооϾпͽ &\higligi[eiZllZQH-í`SRlihllllldK "::>"ꨝꦚ襛襜楞⤜֤ԤңѣѣբգҢԧڸֳ֩רէ§RW[ooooolhkahjcoo_JI(8=9onloommonoooooo`OH+ 47ﮥ쨡秞䦝⦝ޤ٦צդ֥ئۦֵ۫ʘǯħ֯ѨãLU[rrrrrrpojX[QV]JcdLFE*'#@?:eedrrrrrpqqoqqorprrrrnrj:0) ⴮㲨㱧ᱦܮڬ㨤ߧܩ٫ٰظռѿ˸ȭϯŞ9CKtuuuutpqh_cR]eH`^DSJ=eVWupuuuuuusttrttrttruspouupuuuuu^J2*䶨粬贮趰䴭㲫殩ᯨٲӳŰŮͲҴѧĠ3?FtwxxxvxxkipZV\6i`f~z}~~}~~~~~~|}{}y||}}~~||xtvlh~z{~}}|nifMʬαβͳεδͭүռӻѸȵ´·ĻĹîߴỹ̷ѹ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Xor.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Xor.miff new file mode 100644 index 0000000000000000000000000000000000000000..e241df93583bffc36d7672d9601bc2a21ca9fb19 GIT binary patch literal 24408 zcmeI0&r1|x7{@&i{RJIj?zzkCuDfds1Cfz*NFqFSiD~z39om^)XJ-8Y9Rv@8AP9mW zf*^tjB7%sBAR;0nqKJqnqKGI(6h%=KMfGl8JjL@pba{9_bJ&^pedm4W^Es|tupfF( zQ9W{sZvLfdcBmk9%f6k6TSmU*grR-k4OBjAs@3I_=R}dRA2_8@8G5wp z`JtV#^h8kZ4DCjJQ&5$t&2FsC>USzmUfJQ3=6m|ts{|_idrV8&SEkusbxLm3ZCi#O z*Ly{^FUTglvPq+&zpb`!SEF@XUq&%-I%-Rslpm=;ulEZoaQ$M;)z5xpKUP6rpQ|@C zijLt3WRBMIaaWERYL)637KU3giMG z1ag7*0=d9Dfn4CNKrZk`AQyNokPBQQ)UgAxzq~+Tm#Pl2zc@$W*9x&eKSSWx3b8*s zMc~&8u|GXQ;MWSVKRHI=*9x&eK0@Hv3b8*rMBvv7u|GUO;MWSVKiEg$*9x)U-$UTn z3bEhYMc~&8vESW6;MWSV-`Pgs*9x)U-a_El3bEhXMBvv7vEST4;MWSV-&jZB*9x&; zUqj&63b9{XMc~&8v0q(5;MWSVUs*=r*9x&;UP9p43b9{WMBvv7v0q$3;MWSVUzkVW z*9x(ppF`l+3bCJ?Mc~&8v7enm;MWSVpP5GB*9x(poMBvv7v7ekk;MWSV zpBP8r*9x&8A4A~R3b7v>Mc~&8u^$~l;MWSV9~nmA*9x&89zx*P3b7v=MBvv7u^${j z;MWSVALvKm*9x)k??d3%3bF6&Mc~&8vG46c;MWSV?|CJV3v>(Q0#$)rpj{vr@C0&! zHi2BAAdm|@6UYUg3giN<0=YnoKrYZMkPF-u$OWT-4cyE=-^@n$U=3tHUoGBM?=ZjLG{^1! zcCy`{oBg@|y*aL-4+xBISG(P+t}d^x@jsw$CilnfZgm9V%f;0<)#ZFX9^W3DW^WR6 zz`^W?yNAZ0(`$gM#pu(=?HTX`bOVw3basO>v+qWm)wx-&j}5%)Sv8$cs`+F#dq2Hd z&SuN&t4VdWtSV;h4x8`S^GN53R?r2AjNypbkq+LMP=9b`4A%r`3j;1`A(K2(8P6B7X%XG{Rd<;k=al z49w!AmWjep{N1_kueh~mXXBn0I1!A)PY;h%NX)Fkx;G{0IAzyl=rA6g#+%wLXl5*y z{F(4`7k&x_MusT)PW;8Rwaki!;xDkJ{4WuI-Ow5h%O7NM!T|2rD^UVT$x*;#)31oU z=^M=im+e;rATMLp42zc%jc;fwLO18Qzt1WiD@hb(L|+YV;DM!q#*9-k{P^#`+ft-Pt*s8nv`0clGsh)O*U0i9 z1uIo!T#^MJ1^ID}=om1;4|VD|K|nW}qQbJsw|jTW?aNip;&cmW*;;6=6iqtyY?Jq38~T4+*{puu}WXfFTi$)iNgrlfI{#IDj;-q~&ziWvj~9tsGK4$ zP=X6+6yW-W16!EoJgaE$l)7qcH^<@TFR*}mZld%CP17DP#Nuy2KM7OGVWHKbHgdmc z9fh4|JCREzj`{$0%QHDkba(h6@YAPKma{sjo2&rlQVF*Y;6~)X)4Vm)r`4GYCnNVn z$CQw}{)r{TJkWKsT_@Cq=hb60TzB?j4D;C&ap6Y=bVIVb`%i+_9NNrJmn?zF?AP4TDD@g?t?U0@SZ@CIA2c literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Annotate.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Annotate.miff new file mode 100644 index 0000000000000000000000000000000000000000..81ede08076670f6053898bf7eff21770296ff784 GIT binary patch literal 13270 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 RM(SaYGa@9z0d>?8?2?.@,@,?,?,>,=+=,>.@2B4C7B6_<3C6293172/51.21-00-1/-4..>00U99tIL^olle[V|[Wokkswzvqsjbb[/.-0/-30-50,60,6/,6/,6/,6/,6/,5.,4-+4-*4-+4.+3.*30*41+63-95.=8/B:0F<0H>0L@1VB2jB2@1@3C9D@BB?@>=?7?0?-?,?,?,>,=,=,=->/@3C7F;F;\?7B8394163/42.11./1.00.3/.:0/L64gDE|[j}lkfXSTOl^^ihljgja_`W---..-0.,2.+2.*2-*2-+2-+2-,2-,2,+2,+2,+2-+2.,2.+3/+30,51-73.;5.?7/B8/E:/H=1O?3]@2r>0=0A5C;B>A>@;@4@/?->->,>+=,=,<-=/@2C6H>QGUJ]KBD>7:6153.22-/2./1./1.10.50.@21V@@o[hzroo^]UTqX]g`ieai_]bV,./-....-/-+/,*/,*.+*.+*.++/++/++/++/++0,,0-,1-,1.+2.+3/,51.92/<4/?5/A6/D91I;3R<2b:0y:/>2A6B9C;B9A3@.>-=-=,=,<+<,TJgZo`dbTKMA<=445.01,/0,/0-/0-00.1/.710I?>f`f|}s}kwkzxntkzibkY-/0-//././.,0-+/,+.+*-*+,*+-*+-*+-*+-*+.++/,,/-,0-+1-+2-+5/-92/;3/=3/?3/A40C71H81S70g7.~;0?3A5B7B6A3?/>-=-<-;,;+;-=0A7G>QHfZmtm{fUaODK<8:120,0-+/,+0-,0--0-.4//C@:be\~spcqY/1/01/11/21.30-3/-1-,/,,.,--+--*--),.*+.,+/-,0.,0-,2-+5/+91-<3.=4/=3/=2/?2/A4/C4/I3.V4-k8.<0>3?4@4@3>0=.=-<-;,;-~3/?3/C30F30I2/O3,^6-s:0<4>5@5@4?2=0<.<-508-+3++1+,1+-60.DB6\dKr`}muyzyujeYiQ671772993<:5>:6?:6?94=74<63:42:2191/82/72.63.63/850=6/B8/F:0G;1E:1B81@71B61K74W76\74_81j:0{;2=5?7@6@6?5>4=2<2>5D0-C91RO=dlOp^vfzn}v~{wuhcYhP782993<;6?=8B>9D?:D?9D>8D=6C;4B92@81>70<60:5/:6/<70A:0G<0J>1K=2H<2D:1B:1I:3`<8{===:=5>4?4?5A5A4?5>8>9=7<7=:C?MCVE\I\NUQNSPWW]]baech_hUbJZDSAJp<>Y<6WH;gcNw~d~pxoj]lT671883;;6@>8C@;FB90C<1I>1L?1L>1H;1D:1D;2U=4z?:?<=6=1>1>2?2@2?2>3<5:7:6:594=6HRMHWRTWPUPIKIA@B<9>94<81>:1C<2H?1K?0I>1F;2C:2J;2d=4>6=4;.<+<,<.=0>0>0<09060405.6+9,A4L@OGJFC??;?=?D?K?R@[BfDnGrMsQpUj]evq¿54/54/750:92@>6GC8MH;SNE_\anlrpjf]XkPKVEAE@<?6=2@7B@CHDODYEdGoKuOuSsXoco}~үŽ:8196/85.:7/?;3GA6OG:XPKifvɍÁom\YtNK^FCLEA>HB:PFCYLQbOWlKO}DA@5=.<+;+:-:/:1:1;1;1:06.2+0*2(4&7';-A7E>B9=0=.@5D?FFHMJWKbMmPtSuUqYn`luxץC?5A<3=90<8/?:1G?5OE9XOJjfy㤩쟡Ꮠ{zhfZWuVLY_GLsLRTcWhPZGF@6=.<-;-:/90919190:/;/8/3.0-2+4*7*:-@5E=C:>1<.@3D;F@IGNSR`TkUrXt[q^nbknoÓMF:JD8F@4B<2B<3G?5NE7VMEgbr䧬铔م{q~]wN[KTNYNYIOCB?8>2=0;/9/7/7/8.7,8*9+8.5/3/2/3.5-8->3D=D?@8=1>0@3B6F>MJV[\i\p_rdshrlprlͽTL=SJ>9>5>1;.8.6/6.6,6)6)7+7-6-5-4/303.6,<0B:E@C=?5=.=->/A4I@WSaecnfqirltqsym{üYN?XM>VKA=?<>8>3=.:,8,6.5/4-4,4.40506,6+6-6/6.8,:.>6@0<.<-=/D8TLcbhnjrjrgpmo}l{[N>ZM>YL=XK;WJ;WJ8>5=/;+9)7+5-3.0.//.3.61552606081:1;0:193:4<3>3@4=1:.:.@3OFbansoxit_ldh|hsħɩȢʟϦҴ[L<[L]QGaVZi`vvmyxhReDK@B@A@@>:=4>5>7@5?0;+8*6+4.1/./+2*8,?4B9A8;5572<5?8<6928.9,=1@6=4918/<2IA`_rws}gvYi[_s\bq{}|ȿ[L:[K:[K:[K:[K:\L;]M<]N>^OA`QKeWaqeuwgP]CI@B?@?;=4<1<3=6A6A4=/8-6/32/2+2*6,>4J?QCN6B<@:<39,9,<1?6;5614080D<]Ysvs~cuReSWiPwWzc}j~lmpu\L9\L9\L9\L9]L:]L;]N=^PB`SHdURh[eriz}nW`GN@E>>>7=2>2=3<2>3@4>2:1644818-5,60?;LEREL?A=8>6A:C>B=>6:080;4<683311/4/@7YSqto}\rLaNQeKrTxa|g|g~hhkt]M:^M:^M:^M;^M:^N<^PBaVPf]bkbrpi{xɀhfQRDF>==5>3B6B8=3:/;1<191758<9>7<7<:B?HAH?DBDHGJGGDEAC>?8:576879551200/3.=4TOkphyTmG\LLueHnTu_xaxazb{b~bho}q]N<^N=^O=_O>_P>`QCbVQg`kmjsp{{ƞȀpbYPMED?:?6D:H^P@`RAaSEcXSg`lljpqwyƣ˽õŴsg`ZTRJGC>D3<4;37/5-82?D:BBKKSIN@A;8:5:5866765604-2.1/3/:5JJYeTlHbEPrI?YY=`tHjQmQnSpUpSlPgLaI[uFRH:VK=\O@`SEcYQh`ilhmnos{őҪսqke_`][XRNJBD9@3>2>5=5907-9.=3A=HINRJL>@9>:C;E8A595583948575626-5+4,3.4/;7HLPaJeCZCG_G9QS7ZjAdIgKiMlOjNfJaG]zD[uBFB6LE9UK>]SHd\]id{jhjkrtΒ֦֟Х×w|ec_Xb\fcd`WOF:=.;-<0;19/9-:-:GQI`C_>Oo>6=57427/;-<,:.93776967665617+8(8'9(;/AAEVC_>W:DV=5OO6enHuYpUhKiIkKiKgJeJeHfH25+67/>=6JHEVU_^^}gfttӄԆψˉ…}|qqddn]P[KZP[XZVOFA3:*8)8*:+<-=/;-:+9+9-:093664;5>6>5;486787887877829,9):';(>3CHDYBZ>Lf<?B@A<;978687897:8893:-;);(<+A:GNHXGQ{EAXJ9Y]@p}Sdx`gOcEgGhIhJiLjLkLnNA?3B@4DB5IH:RPE\YYjfyytz|wwsuptlqfimaWm^Ow[KUFK>A8;38-8)9(9)9):+=/?3>1=:978687898:99;4;-;);)>0FAMRQUTLlX@]c@dsInSl}U^nKViA^yAgFiIjKkMmNoPpRRL>RL>SN?VP@ZTD`YMha^phstl}piyicod_dc\Yd[Of\Ko\LYLPED9;18-7+8*9):*:)9);-=1>3<4;6979795;3=3?6>7:8879696:8:9;8<3;-:):)@3KDSQYSbNpmIdsH_qHYgEPY?GP9KZ9\uBiIlLlMnNpPqRoR_WH`WH`XHaYIcZJe]Mh_RjaYkb[i`Xc\R\WKWRDVRAYUDgWGUIMEC:<19,8+8*9*:+:*:(:)C2HU8]uClLoNpOqPrRnRiPf]Ng]Ng^Og^Oh_Pi_Qi`Rj`RjaQh`Oe]L]XFTQ?MMwPBNEHAA8<0:,:,;-<.<.<+<,=1>8>:<9;6;3;0<,<+;+:.:2;4<4=4<4;2:/:,:*9);+C5NCUL\QbNdbENX=DN9AF5=?03>2?4?6@7@6A6B:B=@;?7>3>1=/<-<,;,:-:/;0<1<0;/:.9,9+~9*z9+}=/F9ODUL[PxaL`aCO[2=1<0;/;.;-:-:.:.:.:-:-9,8,{7+w7*u9,{?3J>QGVL\MlaIZcBO^;FS6?G1;?/;?0EP5ZpAlMrRpSjQeMcKaJiaQiaRjaRjbRjbSkbTkbSkbSlcSlbTmbUoeXqj]rn`miXg\IoO@H>HBIEHDFBEAEADBDDDDDCD@C>A:>4=1<0;0;/;.:.:.:.9/9.9-~9-z9-w7,t6+q5*q8-yA6LCSJWLr[J]]DO\=HV7AL2;C08=09>0BK3Vi?iMpTkRdMaJ`J^IiaRibRjbRjbRjbSjbSkbSkbSlcSlcUpg[{tjvugVfP@dE9lB:E?KHQNOLHGDECDDBD@C=A:?5=0E2Qb=fLlReM_I_I^I[~HhbRibRicSicRibSjbSkcSlcTlcTmeXxqh½omWSO=OD9dMFd`wurp]\MLEDCAC?C=B:@6>1<.;-:-:-}:/|:0z:1v90s8/q8.o8-n7-m6-k5,h3*i6,r?6wJBlODXL>FG815=06@06A15>14;/;B0M\B=B;@8>3=0<.~:.}9/|90z:1w:1r90n8/k7.j7-j7.j7.i6-f5,f9/h@7cE=SD:BA49=05:/38/29.2<.4?04>04;.9@0JY=[vL]}KWwDVvCZxFYwHSoEhdThdThdThdThdTidTkdUldUmfXuqg̷ovwiञ|u\UJDD=C;A8?5=3<1}:0{90y90w90s90n80j8/h7.h7.h8/i8/h:0h>3hE9`G<269.38-27-17-07-08-1:.3<045}=4z<2w;1u:1s90p80m70j70h7/g8/g:0g<2hA4jK;iUEYPBBA659/27-16,15,05,/5,/5,/5-08.1;/5?1=J7EV=G\=H`5s=4q<3o;3m:2l92j81g91d;1b>2aC4cK8fVAd]IQRB;A439.17-16-05-/4-.3-.3,-2,-4--7.0:/5@1:F4=M6BT8I]?PcGK\E;J:heVheVheVifWieWjeXkeYlhZprdܳˎn`YLM@{G;tC9q@7n?6l>5k=4j<4g=3c@4^B4XD3VI4ZQ9`\B[\EHN<9?24:039/39/27/16/05//4.-2,,2,,3,-5-08.4=18C367=66<54:428206006/2;06D2:K4;M5=M8S6>Q7>P9=N88F4 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Border.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Border.miff new file mode 100644 index 0000000000000000000000000000000000000000..439d6a18b8169c4da9a9272908cca85670511836 GIT binary patch literal 14659 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 Gf&UGo*Zu<9=V}tF + #R5$93 + #@MPm}WILME>>966=Ol]C+ !MFa_FQ< +$:EIPLJ@@B;3.4=>MJG@/ HCZV;>. + + +   +%:=6;@G;;651-2|i)%,6w\FB7)  ##%(%,-# + +  + +  BR=h\ad\giW.1)GƵN !/(',5C7    +7ؘTisy`|ԳI?6RHPwo# +   am_aeZeiol><- + 73 +  Al_[vzksިlm@v  +  WiVF(  + LdloԤ}s| Ghv|c7" + =g}sesʷğƣ[ ;aoreUB)<ܷʝ±ķI:]___lZ[}ȗؾƘyt? 6LMQL?>έ|ƾƣ}Еظymim-Ž /9@3"3ڷw릜ΡȫzedaP4mMFdڸ'>ThvЅa}αs9#3!1=DL3ƣܳr_Ϋڪz­ciȃ!856?>9ktޕ)<:3565=UN)'):Q|⺋eľгη}V+1-.233>@&48*3R}rΪ}̸֪̭r-3)+01/77! // 2mzZҳ¾еʸί| #-#',,&"3-&P:)Q縊¾Ę}Ծе絣7$!#(#!2,$BV\ZWM)3zܕ弾Ƶح + +  &# " #&1@C??D>5)޳ª%Z,')%$!"# +1<98:BD5, l展Ÿc +`w*+)"#!"% (IJ8;DE8&"%?Էܷ}}pw=dF& !%$") !;H6/61(&#%6`­|vs}М֫wc_N9-I? #%%&)'.'/)"(%?klzcȎy̘cQD;W7V.  ")%'%*0* !! !####"NyOgܫkcvȾeMD85aMFNE + + +#/)))0/#$$$#%%$$$# wܓHLڦy\VX`yԼrPC;4/@LHN@  + + +#.*)14$$$%%%%%%%&% NޟrzңZE;1<@DN]|w[G;63,.IDQUH" + +$/)+4"$$#&%'&&&&''# +;ƾȚXA<865223=FL@7631).<@RC + +0)/%#$%&%%%%%&&))"" +UlœV77?<863333320-+)&.?LJ1 + + +-0+!#$%$$%%%&&'",]t4 + `o;5<<865531/.-*(%!,MH6  + ++3#$%$$%%&&%!;Z D6884443/,))((%#)N2   ,(#####%&''&&V WI8563332)%$##%$'. +  + 2####"$&''% c+ NivvF855332.%#"!!$$"#( +  + )#####$%(#(Z))od>7940-,)%#"#$& (  ######%(#4ަt]wP6)**)%#*'%##" 6 ###$$%&(#&ҸtVH6)+,,)(*& ( + + ##$$$%(&"#}޸Z1!!%&$# ! +) + + + + + +   ##$#%(& ⣐ȣ# $ + + + + + + + #$&&%#!3ڸ' + + + + +   \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Charcoal.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Charcoal.miff new file mode 100644 index 0000000000000000000000000000000000000000..4aef9946ee487656ddfadd5957e705e9c4033d9d GIT binary patch literal 3482 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 E1tyc`{r~^~ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Chop.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Chop.miff new file mode 100644 index 0000000..353d938 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Chop.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=5 rows=10 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=5x10+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/-20.62/83.:3-/.,0/-50-71-81,,,,,-+0/,1.+2,(,-/+-/.--/-)/*',/2+/2..0-.--+).0.//-/1.21.30-23-34-53.961961782782994<:5@=88939:4>>8A?:D?:671681==8B@;FA? \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/ColorFloodfill.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/ColorFloodfill.miff new file mode 100644 index 0000000..5112068 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/ColorFloodfill.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTS8R$7&0;>MH>6+) "" #"#!"    "$ ,.>U6V5 ./3C?8/+)"""$"   ! #"+'&'C^8c?,$##)$-' "" $ ! !#" 3/E<2+!11NgCh8O.789KFG@2( "## "*)H=UF@8-# 8)PNRQeYcX[K]LPB2%  !#%"('@8TEVGK<=-/#3 Q;U;dFaIW?VAG8-"!  #'"2+I8WDXFO>I3C23(.$H5N5Q7R7R:P=D6+"! ! (&-+%) 0$=,30=9PBP?K;O//#  !!"! ! %.""!2'1%1/"!!#'"$*.47 9#7-<-3!;2OJOLPMZVecfiXX=23&!#$$"$%   $     *$*( % " "$ (+48";%7+<,?.772d`pukxp|y|zysxgiFA@7"%%++AR&=*:!1=D/*idz|}|~tv_\]X %$09RrYPvGb6G$,&! "(*0))## !+& $##$#%'.#0%7)=,=*8)308%*UR~}z}|xznmsmvr ##*5Lo\__Sw>a.O&9!%'9M@W.=%("&$! ($"'$()*0+7'7*<+7-4+2'*:7pp|{}zwxgdyp}w$# ""&)G`W}YZV|PvFl=[2C'/'+&.$)(%"$!$'%.03;(6-:9<18=@:2( ab~~|}sn|o~t'&$! ##'(E^R{RVVxV{WUp;F ' #  "& $$&% /+763838:97:=EK>(b`x|x|q}u( ' &%##%%(*@UKjKrQvOlHhB_4J( !###  !*)#+#6503167826+8D47"rj|sudwj|ssktn'''&&%&&&#/:M3fWqceU\G^CcMj]ojeb&&&$%&&(' &$)22M?b?Z8Q #  !%!" "##(#55@D=A9?&2.C/C(B.?(F,P4[:\B5>$0*0@'E2N6U8U7X8\7U8[L__%%%&&&&((&#.8CZCS:8%*(#& +18') $"% &"GH=D,:0 ),J-S7U8R3Q3T5X2Y7[DRK&&&&&&'' ,,06282.&* !#!""'!#!!'%'($#**" !$IJ8@#42 #1K-P1O0N/P2S2T-Y4U;A3'''''(&-0>P>Y;\CcMcW[[K8)& $%$3, ),%((++- !%+7=3;)' "DG1;1 2/H/O1K+M,O/Q-S+U0O4>+&( )!)!) '!,0;M>\5Z=kVmp[yRtUZH<263+-' ,$ )++12703#)/3*-;A)82%-%?)J,I&K(M-N*K&E"50$&)!+").1!7!9"!"&)/,:H8S/P4]DoNoPkMkKgD`3>+))$,(<9@>/- (&%!+.(52 ,!-<'B F"H'F#C$A%?$?""&265H(E.R=gDnEhBf@iBdAV-5-&+")+35B?@=+61!5,YAF0AI%J(G$E&B%A$D#!.4.C-N>kDuAmBeAiAmCa1?J$F#C!G'H'G"M("&* 13@[Fj=W9R=R7?/+,#.%/'/'%$!$$-,!$"*4&,.''N/R4M5*$?!J#F"F%H(K(L&R+&&'()!+!,%155>26+-*)+#-#/$2'-')#$! ,-*+,)1%<[8L,.!?#K%I&I)J#O%U*O+-%-%-%-&-&/%/$/&.&.$-#'$(-#/'0,%& )%*$.)7.P91!!A%N(L)L'L$S*S,E%/(0(0(0(/(1*1)0(1&1$1%-#%"$%&,'"# " "  )#-',),&&&  A%N(M(N%R+T1F$D&0(0(0(0)0(/-//0+0*0,0)1'+"#!!!-#.,%& !$ $"" #! $'!)'++7/;$+5((!A&N(N'Q(T0G'E%D&0(0(/(1*1)1+1*2'2(1+1*1*0((  %  ''46'%!"$!$##%&%$$ !!  ( *#(&-), 2;#+  < N(O(T,J)B#G%B$0(0)1*0)0)1)1)1)1)1*1)0*/)0(,! &"!!!''&&!! """ "!""! !  *&(&*&2'7%6"/!2K*R.L.A!C$F&@#0(1)2)1)1)1)1)1)1*1*0*-(84PLWR=5!$" "" """"#"##")',)/).$)"% +J)R/A$?!B$B%>#1)1)1)1)1)1)1)1*1*1).)@>hh}~njH>%??,* "!" !!"!!*(.'' %&J,L*:>"@&A$;$1)1)1)1)1)1)1*2*2*1(52abwyfS?'$#LKxspk88  ! !*' "$%M6C&79!<#A&5"2)2)2)2)2)1)1*2*2)0(22Y\}~~~w~vvm`7+%KGsr~}{YO'  !" &! !&E5554:#@'+2+2+2+2+2+2+2-2+3(64SWsu~}x}ywl\9+=5fd~~ol5/ $"!#8/5- &, *3 19%<*"2+2+2+2+2+2*2-2,4(@?qt~{toukxli[XOfcyx~~~~{QG" ! #%&?4,#!+.8)6)2+2+2+3+3+2+1.3-4(:8fj}yvnwitgjcpp}~~~~~}j^5)  (,.;.  !%4*.'2*2+3+3+3+2+1.4-6);7cf~y{pqak`ooz}~~~~~~~~|uaV:.$ "#.##!$8)0#"%(("2)2*3+2+3+2+2.4-5);7hl~y{pi[_Ysw~}~~~~~~z}zrld^S)"%&'''3%&"%3%,"#   %&$%3'4)5+4,3,3,3-3,6,ECil}}}xwnmc`W_[ps}~~}~|~~~~~|zvt}}~~wsf3%%'''''')2 2#+*)$! !  !!"" "01&). ! \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Contrast.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Contrast.miff new file mode 100644 index 0000000..cfeb096 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Contrast.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:=<9?=:C>;E?9G?7F>8E<8F=9E<8E<8D:7B85A74B85B85>92>:2A>5DA8FC:LF9SJ<8;,;*<*=)=)=,;+;);(<,<1>0?2C7]B5GA?D>=D>:C=9@=7<<:=<9@79C68[?@IG]hufiTKsYRivx}{}mc`\<;8=<9B<8D=8E=7E<7C;7E=8E=8E=9D97A95A75C;6C96@;5@=5A>6C@8DB-8*B8@C@C;C>9>>99>:==;B;:?58R;:zB6VX~u]eNAqSFecdn~|ptcca\9999:7=<8>:7?83?95=87?86?66?86?86>87>84@97@97@;7@>7A<7B?8DB.?/<4B?ULIL@H@A;9A:7A<;@;>?===;@96U6'qQR~diH=D7b>=UISSS^ScdW8:<7:<;::<:4<62:74966966;77;77;77<77<::=88=9;<:6?:8?:6?98@=:E>:I@9K?9N@6SC:UIA\D,=*;+:-;+;*;*;+;-<2B6C7@<`Yu]l]POCDB5<>5:>79=89=<<=;=?:;?:;9?A57nihv~dj]`tctv}x}flW8;?6;?;;=:;::75968858434668968968755745:79;:;<87=87;65<77=99E==I>=H=1@3B8<0=*;)9+:,:+8(9*:.?7F?B;OMtrp\dOHM>=>3:52?86?86=86=97=<7?5>=43iuU~}`kP;=;<<:<>:?>:@=9@;7?95:6798965:849:29845965::7<:8;76<74A74C;4H?8J?:H<7H:8K98K>5AF:F?6[2-o=0A1>09+?0<0:-<->.;.8,|<,y;+~;0F:JCNL|lrt]|[UgNJG>?13<24:47=38?3;>7==6=83(amDoo{v~zsmWdK?@9@A9B@:FC=FC=G>9E<8@:7@==9;=<3<>4:<68>:5>=5=>:<==A;6H<5N@5PC8NE:JA7H;:I<9R:5]/4S26D<3]5-p<1:783?5A5@0=,9*:*y?*y9-w;.|A5F=MDcUvmszpvacbcUmU?J:71.;.186658927<22:6/,`eOzfuewixhvmwtmjU`LDE>DE>FF@IGAMJDOECNE@JC>ICAGA@F;;F::C=9C>9C@9CA=FD?LC=OD9UH:VH=UH=OC9MA;LA=IF@P?>N@:IB3R?.k:0<:@?B:=5A5~:/{<0x@/|5*JGUQtM;qWCwcKzX_Yrj~wqyrkk]oRLG2@4+08+7<1G/4P11_XAluUgVgYi^fcmnoogcWbKEF?FG@KKDNLFQKESMGRMERLETJBRH>QF:PE=PE=ID;FA:F@:IC;OH9UG8[K9[I=WFTA9CHDFB9FCB6;0?2A.@AyE:{;58CBDOKt\FepLiPPW(H)K?UK\Uc`hdkYfReK[CL]4-K>1TK5le>v[l[kWpaxv{|e~`[hMCD=CE=JJDOMGSMJUOIUOIVOFYL@VG8UF5SH8RF9NE;ICUQ@YSUUKCRF3PD6LD:KD>JCAJ:ML9E<1(1=$6"3%9/=.7+@7?B>HAQ=V>h>pEvImWxYWglbƼŁun>=9<;8A@;EF>KL@TPE[V@YW/B?3GF9OI6WJ7[I6PF2G@2;:05%9*A3))++0*/#8%6'4*IE?<5"5%:/LE@:JENPR^VnMnUxWoZiVdJNnhþ[TDYRCSL?LE:JB:NICYP=^M4aU]{情gr_cM^JQJZDN7:;;:2:,;/:16,0)4,5-0'0"5 ;-8;/4/-21324);,LGAE904(8*>/9*C9IEX]fvPmYtou`nw|qa`ZIպaWF`VG[SBWMJ:=85<.B7;?69<6@52%/(1.8-4'123#2&2(6,20+3)//'2"H=DEIG4+6%7$7'8,;89.;-7(6+611-2,5'7(72:75#50$2,3(4#9&;2>?RPC:5&6'8*8+6'QCjg]c`jmpdlVosg\sHdVDdVEdVCbVCdTBaTFbUCdT>`VPgaxqryw}ss`g}Sc8B3?B71.>17&5"6"5&2)02,3-1-7(>'/-%4%80;2@32#1&53,-1(2'F::.3'6(4$C:noq|qzs{VeC`vwbؽ}ȯdTBdTBeTBcQBdSAdTDgTBgXBdVHcTQeYkh`~vuj7<@@G836&>485@63"7%4$1%7-2%+#(&%16&5:B/80:*-52DD31832(4#4(MC805.604(4*ggzrMd>[]eP{[a~QbWrb}lqwdS@dS@cS@cQ?dS@fQBgRBgVAgVAhU?hROcYyvq~cu4K=C?<@E?<7+5$<369JBK=2%1'4.0.08-;);,F-VPb\m6M-23#?2OJ?<5+3"7#4&B>5020007/0$WR{j{G`=S`iO;D9::07':,500)6%J?=06+571="/ - *$5:UcpLQ623",6-42EA7-4(4(4,F=1,.1-01+1#H@{Yt?a`WIi_`tdrqhtiq~{ns`XMU8?44=/6(B:>52(3%2,A49,/2DNBF-+*&/0;@;?450+JEJLDBRRA=>7941<6><8.(1/-1/-1#C8qFhCTjAmVr^o[pZs_t^sT~aokfhVChVEhVDhVChVChW7=+5HTozfvOK20>9A91.,:5?411(1..2.,2'80au>c@beA4ShDq[u^jSmTrYrVpQx[ycf}WdUChWFhYHhYIhYFeWIk`iqqos\cssɦ׮५r_faVX48306.J=SE.%<:=4.#+&0(52QTT`do`f.6'5ER]eSZ40425/5-7399432)3(/,/4/.6+4/vRp/8*DCFC4.4.5(6#926=YeT[41AH=C5745301/7-804356423+4&0*24/.1(@>gt;d@hMG][DRN5Vh>gKbBdHjReJ]DZ~C[tE^wFQO@VPFeUDhZClf^vpliXZbbԕәɗɔqh~g^Z}TISKuo|[W2*1!7'7-3)6-5-8'<.903/LHF>2"-.'9'?:#8-5729253132.4'6$4$3,3(1%SYPk8eiHlNhFgKdIeGeF6=07=7FDAROH_ao[\WVruɀ{{x|{zŃ{σ}|vwZUhgNkfHQKW`lhG<3#8$5(.&:(6%C85(6&3%3%9,8-490>,9144769325275565:524'6&6$98#HJBg6g?J@CAE5:NZ/qȑmY\7GJ:W[Y\Zrhf⑎yw{{||sqfbgfNmcNpaIWBON;;-)4$4$2)1&9(8(@64&6%5%1%/'927:-8CHTO?;5051556:5:37834&9'9'5!1&P`=_DWWJ99@/V;-aDŽtQk=`=hFaEcBhMfLcCkLMK:KJ?IJ=MR2XYC`_Ilin{xwrplxsyosc[q]KnbPpcR_OG82+.)2(5"9"6)7&3#92F?5$6&5*81858664GHWU?9746062466<4;59;47(7%8&4"D?UgHS\O?F*P[/oZceR_DFU4g~CfC_ChIhMjNhJoQ`WF`VG`WG`ZDeZJh_Hj`Qrhpxk}thqf_da_\f^Nm`KscKpjSXNMB6)1(4-4,3(6'7)8(2 5*91D6>6:6::46869/5'7*824848647074669;<47)8&6#5'STNPTNcKbzKUBNVH`WBRJBD6)3"5&6&6&5&7,474'82>C:72.616*;(>)8%2&82;5=4A6=5406(7&;)~;(y4#@2PDWKUPWKKY21?/CKIWYJJH1DG:DM6gKpLlLjFrQu\`G^KofVofVofVpfWpfVqd_qddqf[qfXqf]qfVqgRd_KPSBHP??P:KP1VCYUHK7-5(8-9.:/<6:0>0D=FCA=:,D1B1{B.9*;+;+6(7+7-;.8+3(5+;,;*|<,w;+y6)E9M@OJRSk\hyKP`:cqUU\<9:-@1;0:3;2~;1|<0|<,|;+7+6+6&9)<,8+|4({7-t6+y>2P?RFMIYQabGUlAbyHKa2AM3GI=DF:DM6`{BrMjMpTfP[FdH`HofVpfWqgXpfWpfWqgWqgWqgVqhWqhXtfUteXmeXmhUhaINM,vP>B@>?JIGG?><5@7@A=B@BA@>;?;=86-=/<371:.;.:-}:.}:/|:2|9/}9.|;/z:0x9/v8,t6,q5)yA7SKNJRJ{gP^sMYrGTh?DP0EF6HJ>@H;EF3\kCoQqWmXZC]HbJ\GngVohWpjXohWohWpgXqgWqgWqhXqhXrfXm`Uwsl~|kCK4>I1IJ9LG8gH:DA=A;9@>AAAAB@B;B9@:91<,~>/8-9*:+:,~:/~:0|:1{90y:0y:1w6=7dFEwwRP67=A?@>??;A7?7=49+=,<+:+~9-~9/~:0}:1y;4w:0t8.t:/s9-s81q7.n6-h2't:1QN|]PY[G@M;;B7@@=:@6?K9<9>89/=/~<,:.|:/}90|=4|=5t=3q;/o:0n;0n;1q:3o90i4*c0"r@6yVPTK<9F3CEC>E<8F4@Q;CU?=C79:,KV9th]LTt>YwD]{HaLVpInkXnkWnkWnkWmkXoiWqhYriYriWpfVkkkѸvrZLVFөJ=4-=8>9A<;7:1=3~<1~:.}9/}90|:3y91p;2n;2m;/l;0l;/o93o:3m:1n?5sOEEE?>A7?D8BC6?D3:F5;F49E4:E7CN.OYClhKp@Pq?Po>YxHbNK`Bnk[nk\nk\nk\nk\ok[qi_si[nlVsqmͮswZp|kҮcX4(<2C5A3A6?6;2~92z90x8/w9/t7-p:3n:3m92n:2o:3q:3q?1nK7p^sp_4?3=D98:B:=L?>M>JYCQbGJ`?RnDMj>[vL_zU>Q?nk[nk[nk[nk[nk[nl[qi`sh\mnU}~ŬA15+8578@=tE>uB8uA7tB6p?5n>4u84r83p:2n=4nB7mK=kP9hT:iZcN5>3D:>E9?F:>E8;B7:@9:@98>76<47=76@65A78B7BM@DP>>K5HV=bnYYfW6A9nk[nk[ol\ol\ol\pk[sg`qm_kqWjyqٺ˶θoX{I2l:$l7,p<3qB7oB7nB5kF;hJ:cO;ldLRS8DP/QU2ttUdhM>F0CJACJ>CK?DK>DIACHBBHA>D=:@98>73;36;68>8;?;IQIGVA;L0K[EO[N:F;kkYnk[nm\ok\nl\qj[sh`qm_iqVfyqūϿınX?bL1fR7eT9`YA\Y?X[@dnPJX8HR2SV2omNhaJSS?FL@FK@DK?EL@EMDGNGFKEFMFEJDCHB8>87<;5:;4@4?V:BX;BU9EWA:H8bnTeoWlq\on]qk\ql]qk`nm_jq]yϼrlO]U3`Y8^Y:[Y;W[>S[=OZ5V^6dlEhlK``Da^C`\@YT>PO?IL@CN@CP?ENBENAEOBFPCGRGFREEM@AJB@Q8Mh:MjACYAI]BOeH>O; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Convolve.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Convolve.miff new file mode 100644 index 0000000..6108759 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Convolve.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +: \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Crop.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Crop.miff new file mode 100644 index 0000000..176f971 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Crop.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=65 rows=36 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+5+10 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:GG>JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅unGD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_TIA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnA=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAE@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnEWK?XLCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L>^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%HcAd\;/L_>u^{coWrXx^y[wVahe|V\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`JkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.jeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-jeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.lgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT0M>0l?1@0@1A7B>@?*=*=*<*;*;*=,>/@2B5?5J6173051/40-2/,0/,/.,/-,0-,2,,H10zA?ZfodkMDiNEamotrtdTQN-,*/.-2/-3/-3/,4.,4.,3.+4.,4-,3-+3,*3,*3-*3-*3.*4/*50+62-84.<6/B90F<0H>1K>1M?2i@2@2A2B;B?C?@??>?9?/?-?,>,?,>,=,=,=,>/@2B5D7C7D:5:5173052.31.10.00.10.1/.310E1/tA5Y\qgpOEnODeYZdtzthl[UWR+,+-.-//-1/,2.,2-+1-+2-,2-,2-,2,+1,+2,+2-+2.,2/+3/,40,51-73/:4/>60B70F:1H=2K>3U?3m>1?2B4C;B?B>@=@1@/?.>.?->,>,=-=->.@1B5D9FBSJCB7;6384053.12.02.01/00/10/10.3/0I2/pQRlrODI@cEAUJRTU[SVWN+,,-....-0.-1.+0-+1-+0,+/,+0++/++/++/++0,,0-,1.,2.,2/,3/-51.92/<40>40A61D91F;3O<2_:1y<1>1B5B9B=A9A1@/>.>.=-=-=,=-=.>1A6E:GBc[qWaSBB694/23.12-01.0/-0/.0./2./2..4//gc^‚kr]`v`ps~x}W_O+---/.//.0/,1.,1.,0-+/-+/,,.+,.+,.*,/+,/,,0--1-,1.,2.,30-51.:2/=30?50?50@61B72C81O70g90=0?3A5A7B7A2?/>/=.<.<-<-<-=/?5F@433-10-1.,0--0--1-.1-/2-.3-.emR~YcJ,.-00/11/21.30-3/,1.,0-,/-,.,-/+-/+-/+,0,-1--1/-1/-20-40-91.=4/?50?5/?50@51A50C60D60P6/i:0>1?4@7A4A3?1>/=/<.;.;-<.>1E;JAROovy`^Q_I<=22.,1-,0,,0,-0,-0,.0,-3-.\fDqwvpO[E/0-34/540751940:2.80-4/-20/0./0,/1,.1-.2.-20-11.21.51.;2.@5/B70@60@61@51@51B51E51F50D6/R7/j;1>5@5A5@4@2>0=/0~D8K?QEdVo{|ikceQdO8=02-+0,,0,+/,-/,-2-.4-.[`Hye}k~ot~w|volNYD34.661872::4>;6A:7@95=84<74:5191080/71.62.63/73/84/>6/A90G;1H;1E;2A82A71A72B72F62I61H7/M:0k=3?6@6@5A5@5?2=1=0=0HDOFvN?vSD{`JnTf\zo}xqlolXdP?=-3-+/-,/--:.-B-.TN9hqRp]sauiwn}wvuhdOYD560772::4><7B=8C?8EA9F@8G=6E;4D:1B90@80;60:50:60>71A:1G<1I=1I=2H;2D:2B92A:3E;3>>?A>4>8@4@4A5A4@5?8>8>9<8>@DCQGwUFp_JbOWS6L6NAVM_Yhfldl[mOkJbFOR3-C4.JB2e^;s]r`tavi~{|}g~cS_G45/782;;5@=8C?8FB:GC:ID9JB9I?7F=3E;1B:1?81=71>71?:1C;1I>1J>1I=1I<2D;2B<2B<3>:?M>4>-?2>2?3?3@3?2>6<9;9<988:.E>\I]K]Q@IBE@I7K:N3D;2@92?82?91?:1C=2I?2I?1J>1F<2C<3A<3D=4>7=0=,>.=-=0=2>2>1=2907/5.5,7*8*;.OESJBHBB@5A?@H@KAQBYCgDoIrLsSsUvYjneĽωqj22.760871::3>?6HD9LG:OI:VSSy{|x[ToG?OA;4@:2?:2A=2B>2F?2I@2E?2C=3@<4E=5>6>0=-=-=,;4HA7PG9UJ:`]nܢ쏏nmLIXB?MA>9D?3C@3DA9DEPES]FONeC8?4>.=.<-;.;/;1;2;1;1:15.4-3,5*5)7*9,A9F@A6@/?/A3ECEGFJIYJaLoRtVuUrYpZlZa᪤>:0A=3=82=:3@:3F?6SF7UI9]Ujަ|f\RLsB@CCA;RGQgqQoDH?0>/=.;/;/:0:0:2:1:1:/:/3.4-4,6+7+9-;0EBC@?/>/@1E>FBIILSPaToVqWsYrZnZh[]unIC5MG8F@5A;3C=5HA6NF7UI9XOToveaIWGSHUHRCB@?@7>2<0<0:/9/91809.9+:,8.704050606.8/;0EBFC>3?0>0?1A1G=NJX`^oWqZrjrftrutib[MQH9UK5=1;/9/807/7/7+8+8,806060605/708/:/E@FDDB>0>0>/>0>1D7\Vdlfpjqjtntu{tQ^CUK2/=0=0>1VGgljoktmshs_s|idzQWK]OGc[qwxɆvtVfAJAAAE@B?C@:@:@:?7>.<,:,8-7.5/2///.3.6.55/7.719291;0;0;1;1;/kmnxp{mvZjNfngȪ¯ʪǚպXJ:[L;[L<[L_O@_PIdWhqi{oAKA;@E@A@D?9?3?8@7>8=-;,:,8,6.3/.0-2-7&9.:8@768373:1?=;2;1;.;.;.A7=2:19091;0kkwv~p{NfJc]pZ}`qareotyYJ9[K;\K;\K;\L<]L<^M=^N>^O?`QAbRIf[w{iwAP@F@A@D@>?3>3?3=7C8B7;-9,7/4011,3,6,@.QK[Pa9G758/>5C>@><2;.:-:/>6:261417/90\W{{k|JdGYeaCkUya|g~ijnquZJ9\L:]L:]L;]L;^M<^M=_O>_P@aRCeSFkautuMUAO@E???5?3?3=5=3<2C7=2908156,3+5-5.9;QSaJO;99.:(A8A>C><5:19/:3<76231404/60MEzYtFcGSY]ApZ|g|g}h}hiip[K9]M;^M<^M<^N<_N=_O=_PAaXYn`modttzڞļv|dXLR?E?:?4?4?8@5;2;3;2;1:173D=C=<::JJLKIGJH=:?9:89898764130304/50H`P=`P@aZ`rtuvsx|ŝżİtZQMLL?GP_kZjLJ;:?9<8:88877534/3/303/51=4|bwGeEc\F8T_@pWs[rYsYv\x[yZ}`zdaxRZK;]M<^N>`P?`Q@aQBc[arsqvovzzҫվܪsdjcWZ?<@:A9G:L><2=4;39/9/9/;5MQPZV_U]8?8=BOV^PW99:8:6;79786755/4.4.3.4070<4kwRnDeE[KF5MJ7g~OpTlPmRqVqTlMeJZuAMe7PF8[L=^O?_Q@bRBd]`qqpqiqpw׹ľxkeh`micaDAA9@7>2>0=8=8;0:.:0;/<6BET]SZ:<:@9@7>6:688696969585726.5,5,5.6.70DB\mCf@dEGLG6HF3R_9hKiKlNkPkLfKaH^vEVp>@>5NE:ZM=`R@d]Xojnjfhmnו؜֠Ӟʑwk}k_V|^Q^YqkwrZV?1=-<,<.93570<.;,:,85786:68684817,7+6*7+7.9/M\Ke?e?XA;.CD1CD.V^8gJkMiKkLiLhJeIcG_zD26,;;5MD;YM>a`jeb``acz}҈׊֋ӌыȇz`jj^Pp]N]Tfgvpwr=-;+;,;+<,<.;-;/;.;/;1<3;3632:0;-<+:-87797979686819+8*8*8):+=4Kd@c?ck:=3:.;;-ZY3xmYhJjJjLjKiKgJfHcE-1(26-;:5ID;+;+:*;+<+<-=/<.;.:-;.;1:3795<2=3;5:798888988897949+:*:):)<)FMBa@c=O;:3<:/HN/xNJq\fEjJjKjLiLiKhKfG.2(37/8:2@B5NPJZ[jjhᇅ憆тˇˈ~vo`Yk_Nl^Ml\KYJRM==:,;+:*:*;*;+=,=1<.;-;-:.:2969:75<5;7;7:6;6<5=/=2<8;7:8:7:8:9;9;8;6<+<);)=*QQSTWT_QdpBepUO];=?3=@4?H6fFkJmNnNnOqOoOoO_UFd[Ke[Ke[Lf\Mh_NjaPkaRkbRi`Pa\NYVEVS@SP?[YF_[KXKNG>1;.:-:,:,:+;,;+<*<+>-=4=9<9;7;7;4<.1HM*>0>9>:>9<7<41;?12@6@5B5C>B>@3=1=00;B1gJpOrPrRsUfNcLaIg^Oi`QjaRjaSkbTlbTlbTlcTlcTlbTlbSlaRh`PZTCEH7DH4H=GAKJY]JIC=C=C>CBCCDDEAD@C>B=@3?2>2<01:>0;@1_yAqOsRrTjQcLbJ_Hg^OiaRjbRjbSkaSkbTlbTkcTlcTmcTmbTlbTlaShaQ_YDHH3rGEAJIHFD@D@DCECEDEDECE@D>B<@3>2=1<0;0;/:/~:/~:/}9/{:/|9.z:.x9.u8-r6,p7,s7-v>3QITLVLy\JYdFRd@I[6=E1;?19>09>0:=2Vd>qQqTpSbKaJ`I\Gg_PhaRjbSjbRjbSjbSkbSkbSlcTmcTmcUmbUspi}{jDG4AD6AD4@A3`D9DCEDECEDDDECEBE?D>B2=0<0;/:/:/}:0|:0z:0y9/w9.v9/s8.p7-n6,l6,m7,t=3SKTK{VK[VFES;8C2;E2:A28?17>17=19=1LW3oRpSbK_J_I]HX|Ff`PhbRicSibRibRkbSkcTlcTlcTmcUmcU}xў|CJ4?A3AA4:@4`ED{{XUDDDCDBDAD?C=B;A8>1=16@15<14:14:06?15?16>16<07;1BM2lQlR]}I\|G]H\}GVwFfaPgcShcSicSicSjcSlcTmdUmdUldUnhd̝|IN4BA4OHEqqEBDAD@C=C=B;A9?3=0<0~;0}:0|:0{;1y:1s:0m80l8.k8.k8/k7.k7.i7-i8.k<3pKFG@45<04:/39038/28/29/4>04=05:06;0BL2l_^MUsCXvE\{GZzGQjEebRgdShdThdTidTjdTkdUldUmeVmgWokhټsrZMOD޲OBC3<1~;1|:1z;1x:1t91m91l9/j7/j8/i8/j80j8/j9/j<3jH><<44:/39.38/27.17.16.06.07.3;/4<06<0BM8c^Ll?Nk?RoBYuGYvHCV;ebRheUheUheUieUjeVkeVleWmfWnjgٹw{`wnؿj^B;C;B9A8@8>5~=4{<2x<2u;2s:2n:2m91k80j90h80h90h91h<1iF4teSjcS4:029/28/27.17-15-/5-/6-05./5.1;/4?2Nj?XoHVoJ4D5fcSheVheVheVieVjeWkeXlfXmhZy|zٽȣE9B9A9?7?7w?5t>4s=3r=4o;3n:3l92k91h91f:1f<2eC4dI5gQ9soYQYF3:029028/28.26.06-/6-05..4-/4..5./8/4?19C2;E5DV:Ka=VjKUhJ-9/fcTgeUheVifWifWjeWkfYlgZli[mxpԼkSA7@7~@5s@4r?3p?5p?5m>5k=4j;3h;3d<2b>2XC4UK4aQ8`]?ejP7@27<139039039/17.17.16//4./4..4-.5..5./7/5@29C3:E7AM9TaJMYJ-8/ecSgeUhfVifWjfWjeXkfYkhZkk[lwoìu]H4q?2o?5o@6l@5iA5g@4cA4_D4]G5ZQ;JK3HL3LM2ddF^]A;@38?38=26<26<36<45;45:4271/5./5..4..6//500608B5:G5;J7@O:>M<.90`cPfdTgfUhfVifWjfWkfXjhYkkZkxpּǼ͹kO7`H5]I3[I4VI4RI5QL5VW39=47=46<56<55<45<45<45;4071/50/500700;/;K5>N68-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nndun10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:darnmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Uj|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLSozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮ʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdme~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxv|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzzydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iipg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S||CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQljeKO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT>nn}Gd&$MEKPc4ud1XLe_2cK4xW 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 B>DmAQ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Emboss.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Emboss.miff new file mode 100644 index 0000000000000000000000000000000000000000..dac25ebb2943a0badee2a35f6751f70309408b2e GIT binary patch literal 10006 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Equalize.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Equalize.miff new file mode 100644 index 0000000000000000000000000000000000000000..c3a023dfc07e1782be8d42da24a4452dc0568b7b GIT binary patch literal 10006 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 TQqG@J<*;bPWUJ6*UDW>tD8Q$i literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Flip.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Flip.miff new file mode 100644 index 0000000..cdead28 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Flip.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-heVheVheVheVheVgeUkd[ndXghP}~ҷǣE49.<9:;@=pB4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheWheWheWheWieVkdZneWhfQnlhٸpsWo{jػj^8+@6H9E6B7?6;2}92x8/u7.s7.o5+j70h70f5/g6/i70l71l?B=@XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|Gi`QjaRlbTjaRjaRkbSkbSkbRlcSlcTpbRpaUf_RfaP_YCA@%rMB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\Gi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJC2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`JUM>VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqW@>0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<+:(G;9+:)7(7($:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgGDB6JE<\M>`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbDTH8YL<_RBbVD`S?f]b{ytz]flv·ojejdyugeDA=5<1B2<-GFIF70609+:&=6:A[gW^73BI?F79565130:/;36578646-7(1+350/4*DBhu;d@hMGRP<@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%Hg]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en[K:[K:YK:YI9[K:]J<^K<^O;^O;_N:_KHaWw|w‡ew4K@FC@BGC@;.8&@68;MEPA6(4*601/19-<*<-H.WQc\m8O057&C6SNC@9.7$;%8)FB833100914'\W|k|Ha>UYa7eNd~mpopoqÿ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[PA[OAYM?TJ:TG9NGC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnEWN?VM?PI:KB4F<1E@7LG5SG.VNQvAN>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAD@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtn:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T330551883=<6DC9GG>JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC23-34-53.961961:2.80-3.,300-.0/(/1)./*,1.*10*01./004/+;1+A5,C8/A90=5-;0/<1/E1-R).F*.70)R/(j9.:794?5B6A1>-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>20.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Flop.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Flop.miff new file mode 100644 index 0000000..ea67797 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Flop.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:YVSz|luw|RLaPHnlp|bnIGP786+-3,-0/-//-30,61.72/721:53R:/F9D6B3?3?.=*=+=,?.@+A+@-?-?/@;<@=BCFDGE=A5C3tD4UA2NB2LA2JB4F?3?:/96/74-41*1.'1-'5-*5-*4,)5-*7/,80-80-91.80-92-:3-83.62/20.0/-YWSlp_~]^gK@\J>kcl}Y\xA5E212*,5/.00.-1.11-62.62/931955D7,H;D8@4>3>-;*=*=,>.?+@+?,?+?-A;<@.H?1E=2>8-75063-41+30*3/*6.+6/+4,*4-*7.,81.81-81-6/,80,81,71-50-0/-/.,YZOISI>FF54H=1XH=kqƊlMNI.!3-+00.120/3/,40-4.14/53.93.;41,>)?,>-?-@*A0>=<>E@H=E49(m=+UD4EE5H;/C8-@6->6-:3,75052-40,31,3/,3-,3-,1,)1,+2,+2,+2++2,+0,+2-*2,(1.+0/,,-+,,,_eQ|`prY\oip~Кgcb4*,/-2/2.02./0.-0/-0,.1+/1*75+CB8WeWyg_E@G:C7<2<.<,<+=+=-=/>-@,B/HAE@E9A3;/y7-_70Q<5H>7F91A5->4/<4/82/30.2-,2.+2.,/-*0-.0,,/--/++.++.++.++,**,**-+(/*'/-).--+-/,-/YdJǰʳeqR0)(2*10/+0-+0,*2,+2,+-)'01(<@3SZGrp{URE>G@?7:.9*9);,<-;-=+?,?3G5=0h7/K62B:6A73A2/>0.;21<328110--/++.*)0,+/,+.-.-+,*()*)),*+,*+**+('(+)+,*+-+)-.-..0+/2,/2O[Dvp~ÓɌvv[f@+'0*01+02(/0(,-(+/')2'(=:3N^G\{ZwypQOKDG;};0v:*{;,9,2B2;-@1A1i:-O,'93,59/>3,>/.;/.;1-=40;3.6/*4,)/+).+*/-,--+,*)+()-',+(,*)-,+,-*+2-*3/,30-21./1.//-.0.LVDol~{}to~o{j~jW\H)$"''-'+/)+,+**.$&*=0PfPdeegv|{zqdVNEG>{@4s9-v8,v>);*:+>-A1B6?594:7j9.R/(70)F*.R).E1-<1/;0/=5-A90C8/A5,;1+4/+/0001.10*1.*/*,1)./(/-.03003.,80-:2.96196153.34-23-NXChdttstkhnck\hWhqRTN:C)):&*+/&%+!3)"?;)XiMooxv~zrf`zXs`IkS@pJ9[VPLz4)u>.y;/~:/A5>6C;BA=;c6-E5'<6*A50C54<94?62@61B80H=4J>4H=1B90?7297364163.62.61.9//900:54<75=73A95B:8@=8<:5994782782S_Gd}_~{sdmYn\w\e^:G@->3(R.(FOPbWk_mjrfnYhM_@V)K(HSZlS`jHpYCUPEGB@2E1C5?3F9KHC:GIEJG70=<3A:1E:1K<4P@5OA2I=0B<0<7094/95/<80C:3C:3D;1E=4G?8E@:EA:FA>89:4893WgLg{eƶvdHC/a=3[fZxGoAr:o:h4\0T,H.EFOBC;Ec^cJdOB:.'7;D?<<8?>8>2:(D7>3;0?5;#35K]B@7=0>=1D:/K;1O>1OA0M?/E9,:7.<71A91E;0F=/H<-J=0MB7JDHC>FA?B@;==8681671unnd]nYWxJnEw>q>h=VAQ>HADE;;.?AAKUQUI9,5!6%0)++1+8)@4@2A1=26':$A&4!4+I@@?/5=0C74K81H?-P@-IA6@=9>94=71>83?80C9-E;+H@9MHJIE7MI6JI;GG>DC9=<6883551330ɉ_T{CcTtMzK}JtBbDXDKFKE@=-9(>3A>CA?69,4!5 /(1+8.4,3*?2:+9*;1=1>,;%<';/6?589243//.,10-᪤KU`pSgUqXzRzJnF`O\FJGHHF@7:):#>2VMC<5(7"7!2(-(-(1'?7;2:382:4806*;(A-=+F7aGQI>29(9$C@LH7-:*<(2%2,++))?4D98/<7>961;3<3;-:*9#<'KP]{sRJN:977:CRLsf\|§ﹾ]UjWF7TG6F=7:5/52(;6-A=3D@5VPAue{bprxZuPmfv\aNJH==-C2<-8+=3EIPJ>/7+535420058;>09"3$3)8/7/3+9/>4?2>/>5>>;>HRL]OWN_aeoz؜WLSSD.ME5A=8=60?90F@5MG:OI;AQ3|zoutrgqgpnm^V@35=)8&7+5/3&9!9%<9;6;+8*4.3/93:.;+?0=1?;>AGF>;?F>C@:=PiДؙ앗䔗XQTWK4RJ9NG7&:+6*>1J>5*4*./755)6&D6=4;28(0'(0(>.8-1,3134+8(:%9%;)B541C;@5BGCNE>3?;F|Rbfm{{͂wxd_uULGZL8XL[N>ŵytyheYa~Q|\gQ^?\Mdrzkk8-8+:391<3QG8+8&5*;664GG85+.0:1:+@Gq~me^SdYLI[NA^P<^M<[L>ZK;YI;\L<[L<[L<ÿqopop~mdeNYa7>UHak||\W4'91003183FB8);%7$9.C@SNC67&058O\mQc.W-H*<-<191/604*6(PAME8;@68&;.C@BGC@@F4Kew‡|waWw_KH_N:^O;^O;^K<]J<[K:YI9YK:[K:[K:n~ek~f|fqop[IY1@S?aYt{ME4%2,-0.13.J@8/8+8+;0IE86:0-6$:5NScp;V%7!+ -"/2>79:.A3MA9'3+83>/;*>4<==G?QKUuqg]qcG>aM:]P=]P=^M=]L;]L9]L7\K6\K6\K7lgvh{Z{dzdv_u`ycrZNb:7?2=<7B:EAUUIGOQOJ3.78?C>C23,(/-CGDN03<.D74.6'6+B9G>:+B2779AMUd\v|̓pxmdpo`maXYVNA^N9_L7^M:^M:^M:^M:^M:e|VhawVy[x^rXoW{cu^L_>\;/Ad>cbw<35)/-.22/4*635?,:40E_O?_O=Ia4Nj4bElMsTsZmQhLtXh~SAJ0=<&J[<1'XIOA:1636:WZlgydᶯzzcjw|wwcYa\OB`R@`RC_RB_P@[M=[sDWoBY}C^EhLnUgKeDiLO_9EB-RP\M>JEs`^Y2/4#/%k3=Cj7cWl=4;%9&6$8&7)6/4854;4:65=&9$:*>+=/71':.?5:0:/:-8(:-6(;+6+;);#;-zfkSVpWD\[L~ZjȈ҈͌щy{[]QQljgelVL=OD;::447-kJfGeKgMfEoRrN]=q\՚yDN)8+/364CO6gBgKM<&=!:':)8*846;78:885657;5836-;1?6;;0+1(8+<'7&K@njZcWPd_C`_HsWR~x‹ۃҁʂڅy|[Z\]Z\iEC=975+0+*0&pPfEiOkOeCdGlI`=Kc9|ԌeJ3'-3%K@1I]=_P`5)9#=*=*8);6597<8<888482A=VQEJ/:8<;42)4(9(:(8)D9<+=+5)5+7&7&0+==RQYCj\Ef]I^]Gla]w΄ǁѓnlXVmLON:=001++.(.2&vVmMoQlPkKaEjFg~C688492:7C=ZXHI86:8;7<49-:)9'IB=57&;)9,=$8$4*0+5.K<_Oj^Nh\KlYGn_WyozwszԄecgUTALM:AE*<=2>=4@>0qWxUqKjGmRjMoJfG;C123+;=.O];vYq`x;cKYRTVYZ6'8$;(;,@8;=889692866:6:<5;-9*=2;868<<>9B9H:<49-5"<+:,9)6*7.7/4+:,RGZOjdOn_HfZF]VGWUR]W[pdmwj|mckbYK`WB\RCVP=VN?VM?UM>`JwYxUoIpOpSwQgK9C099076/581'2ScBsn]\STIRJ~:*7":(:(8+@;>>>9<3856798>4:)9&8&645<6;6<499/7*?)5=/:+7*8*9+:*=)40JLaY__O[ZFSP>LH7QN=`ZGf\Ig]Lg^Mh_Hg_Je[Md[Le[Ke[KcZK`LbI}byVpJqPvPhK8@-7:/=;(KM@7><'2%AM+YMYSZNSGA3w3"};(<)8'8*83A9D9?6=7<56)<'A+>*9-:561>;@E;58*96;/9):(:)8)7%:,DFXOUM;CJ>@H8@E4LJ6`ZFhbKibHibLi`PjbSkbTh_Pi`Qi`Qi`Qh_PbMbJfN}`rPpNwPiL8B/88/:;#KQ5^kQGV4fvIo_VWSNOBH;v5(s9*{;,;*<,7,6*<.?1;0:.8*=,<,:+yA-C1F2=/EAIEHAC3>3@:>2=1<09+;0JM]YZF?C)5C1@K@8A'EA1VP@haQmcTmbUlbVldPldOlbUmbWkbSlcTh_Pi`Qi`Q\GeL_IZCr\x\tTVd>89)4;0;=389,9C(M_:UmDZnJyeOUMQMTLv@6l2'o4*r6+u8.x9/z:.|9.{8/{91|:/|:.:-;.;/82<3=/9/AA>DCCE@EDEE;@9CBLLONBCECrM/=,=4D>F=F?FDDDDDDA>+}{jspifZPmaTlcTlcTkbSkbSjbSibRibRjdSibRhaQWwH_I_LZ|ETu?nTsYAM/54+-2/0>.;K84>1.3+330/5,5@1NO>z\OUQp8/`.$g3*k4,n6/n7+o8-p6,s8/w:3|:1}:0}9/}9-:+<+=,;,B8B:E;C?ABBD@D9:XUZ?>*0+:725?+CJ2|ф|e]SkbRlcTlcTkbSjbSibRibRkcSibRhbRQjEbL\yGVsBQo<^Mzm@J1,-"16,9H66D2-9*2806867:21<..9)G@3vTNm=4Y+a0'i6-k70h8.h8-i7-k8-p;1z<4{<3|90{9/:.~<,=/;1C<@?@@@<=:qq瞙OHF=6)KO1ljelbQmdUmdUlcTjcShcShcShcShcShcSCV;bNWuFLi;Lk*2>--8-)4-,3,,0+-2,.3--2-/3,06,17-07,*1(QYFi_M5cJ5fF9g>4g91j7/m51q62h:1j<2o?4q?5q@6pB<@=:;<99.E4ǣǴҷ}~ghPndXkd[geUheVheVheVheVheV+4-Q]O\hT>J43>,9C47@5-5,*4,+3++0+*/),1+.3-.3-/5,28-39/28.27/2@+nv\]]?]X=UP9P;+^>2d=2l:3q94n=6o?8sA;s?9r=7oA38,6*?.kSԼluphiQngZlc\jeVifWifWheVheVheV/90EPDBP<1?(=J8=D=/2/,1,*.*(.(,1+.3-2716;57;68<58>37>47=37=529'\`GppREI+9C'EF/e]GYG5_D5cA7h>2i>4l?4j90e3)e6"yH1u]ìhwoflSlhZnc\jeVifWifWifWheVgdU/;.;K88I19L36J2)3))-.+/.,1,0627;69=8:@::>9;A;9@89?58>4:>5:?5FF5`YDigJGJ+=E*@L0^gKMO8QN7VO:\L4]K2XD,hS;ѽƿҶdwodkRlhZnd\keVhfWieWhgWgdUddS4B1H\A@R::M8Gb8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWSݽdddddddddݽddddddddd,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZOݽdddddddddݽddddddddd,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQݽdddddddddݽddddddddd,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJݽdddddddddݽddddddddd.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVDݽdddddddddݽddddddddd782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXCݽdddddddddݽddddddddd8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_Gݽdddddddddݽddddddddd671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅unݽdddddddddݽddddddddd10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_Tݽdddddddddݽddddddddd:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤ݽdddddddddݽdddddddddD@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnݽdddddddddݽdddddddddOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAݽdddddddddݽdddddddddWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnEݽdddddddddݽddddddddd[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպݽdddddddddݽddddddddd[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿݽdddddddddݽddddddddd\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~enݽdddddddddݽddddddddd^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|Vݽdddddddddݽddddddddd[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbDݽdddddddddݽddddddddd47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgGݽdddddddddݽddddddddd*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWݽdddddddddݽdddddddddcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jݽdddddddddݽdddddddddh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMݽdddddddddݽdddddddddi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GݽdddddddddݽdddddddddhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GݽdddddddddݽdddddddddhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHݽdddddddddݽdddddddddhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.ݽdddddddddݽdddddddddheVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-ݽdddddddddݽdddddddddgdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.ݽdddddddddݽddddddddd\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT9/C<1G>1K?1S@2`A2sB3B4B7B;B?AA@@?=?8?3?/?-?,?,>,>,=,>-?/A2B5C7B7e>5M93>5183/42.21.10-3/.80/C44U@;?6?2?.?-?,>,>,=,=->.@1B5F9H=H=eC:L=6>7274/42.21.10.20.60/?32O;2u>1>3@6A9A->,>,=,=-=.?0B4F:MASGTHfNCND3@6A8A9A7@4?0>.>-=,=,<,=->0A4E9MBXLcUfWi_PSRECD:9:244.11-0/-0/-2/.610@87PHId_ersw~tp~n~yl|qhvfbl[.////.0/.1/-1.,1-,0-+/,,/,,.+,.+,.++/++/,+0-,0-,1.,3.,5/,71-:3.<4/>4/@5/C60G71N70Z80k90~;1>3@5A6A5@3?0>.=-=-<-<-=/?2D8K@VJfWtcyfor^[bPKQB?B877131.1.,0--1.-40/<75KIE`c^s|x}}zuvlicq[01/11/22/31/41.40.3/-2.-1--0,-0,-/+,0,,0-,0.,1.,2/,4/,71-:2.<4/>4/>4/?4/A40E50J50S5/`7/p90<2>4?5@5@3?1>/=.<.<.=0?2C6I5.@6/@60@60@50C50H51N51U60_70m90|;1=3?5@5?4?2>1=0=0>1@4C7H;NAWJbUpb~lqmydrkYeZMYIBP<9H43A00=//<20A;5NN@`hQqd|rz}|xtlf_qW561672883;94=95>95>84=74<63;52:3192082/72.63.73/94/<6/@7/C90D90D91C81C71I72R74\84e83m92w:1<2>4?5?5?5>4=4=3=3?5B9H8C=8C=7C<7B:6@84>72<61:60:60=70@90D;0G<1H<1F;1E:1H:2R:4c:6s;7~;5;3<2=3>3?4?4?5>5<5<5<5>7B:I>PCUGVKVOVTYY]]`a`b^cYaP]IWCQ@Jy@EkEChSJpiY}k{xsixa672883;:5><7B?8EA:GB;ID;A;7>94=82?91B;1F=1I>1I=2H<2H;3O;3^<5u=6=6<4<2=1=1>2>2>3=3<4:49393;4@7GA<9A<5D=4G>3J?4K?5K>6N=6Y=5l=5=4=3<1LBJCFAC@BBCGDNEUG]HdIjJmMlPiUf`gwuȼ861871:82=;3A>6GC9MH?UPL^[ahewmjjgc_tXUeOKVHDJFAAG@;JA9NB;RC>VC@]A>j@:~>6=2=0<.;-;.;/;0<0;0:07/5.4-4+6+9-?2D9F=E=B:@9@2<.;-;-:/:0:0:0:09/7.4-3,3*5*8+<0A6C:B9@6?5@8B=EEGMIVKaNjQpTrXq^pitҀӢC?5A=3@<2@;2C=4HA7PHA[UVkhz~~ēАʅxwmhf[ugQ`oKS{KPLSLSIMECA9>2=/;.:.9/90909/9.8.7.4-3,3,4+7,;0?5B9B9@6?3@5B9E?HGLRP^ShVoYr]qbpks~͞KE8IC7G@5E?4F?5JB7QH@[TTkgy˚ޚߔՋ„yiZqP]KTKSJQGKCB@9>3<0;/9/8/8/7.8-8-8-7.5.4.3-4-6-90>4A8B:A7?4?3A5C9GALLSYXe\m_qbrgqnr~{оRI?9>4<0:/9.7.6.6-6,6-6-6.5.5.4.5.6.9/<3@7A:A8?5?2?1@4D:KETS\aakdpgrjqqqxĺWL=VK?;>7=32=0>1A5H?SN^_ekhqhrippos͹YM=YL5=1<.9,7-5.3.1/010316476663727191:2;3<3<4=4>3>2=1<1>3D;PJ^]gljrhrfmlj|lxƦ˧ΨЬҴҽ[L]PD`UQg\epf|qwvk\tN\FMBD@??;>8>7>6>4>1<.9-7-4/10/1.4/92=6?8>9:8694;4=5<5;3;1;1<2=3<2:1;2A9MG\[hlkteqajecubjv¨±\L;[L:[L:[L:[L;\L<]N?^PD`SMeY]maszktsiYiLUDH@@?;>7>5>5>5>4>2<09/604213/4.80=5C:F8?9>7<4:1:1;2;3:38282=7JDZXgkisbp[f_]nZ^gnrtw}\L:\L:\L:\L:]M;]N>^PB`SJcWTg\codx}pyzp_iPUFHA@?:>6>5>4>4>3=2<191735537292<5A:F>I@G@C@?@=A_PB`TKcXXg^hmeyvo|lnYYLKDBA;@7@6@6?4=3<2;19284788;8>:AH@HAGBFDEEDDAB>@;=8:595857362404084C>RQ^d_mWhQ]VRgOv}StZv^x`ya{b}dhmq\M;]N<^N=_P?`QCaTLdY[g`nlhtq}|vfaVRKHF@C3<2:1918397<=?BBGCJCI@G@FCHFJGHDDA>>:<796867562503/3073@=NOW`XhQcMWSLxcJnxNnTqXsZtZuZuZt[q\n\XK;ZM=\O?_RDaULdYZg`nkgqpzzpi_ZUPNIJCG>E:A6>4<3:29181:5>;BBFIHKEJAF>E@GBIBG?A=;;8:6967563615/3.4/73?=IMQ\PbL\JPPFl_DfrIiNlRnToToTmRjPgOc~MQH9UJ3<2;19090:2=6A=EDGGDF?B;A:C;D:A8=8986958574626/5-5,5.83>=FMKYJ]GUGIsNAc]AaoFeKiMkOlOkNhMeJbH_|GHB6LF:SK@ZRL`Y^e`uignnvwǎΙΡƠ{ljc^`Z^YYTQIH=A4=0;0;0:/:.:/<2?7A4>3=3:5776857574616-6+6+7-:4??DNFWDWCNFChP?aaBcsHgLhLiLjLiLgJdIbGaF>=2C@6KF>SNL\Wac`{igppxyˊΐ˓}pxeb`X^W^XZTQIG;?1;-:-:-:.;.;.;/<1=5>7<8996:4<2<2;294766767674717-8*8*:-<5@BCODUBQCHqJAdYBfmIj|OkPjMiKiKhKgJfIeIeH99/=<3DB;MKIWT^`^yihrr{zȅƇ{}ryhk}`Z\QYPWQSLLBC7=.:+9+:,;-<.;.;-:.;0;3:5887:6<6<5;596777877775818-9*:*<.?8CEEPEQEK}HDhTBffHlyQoUmRiMhJiJiJhKhKiKiK;;0>=3CB9KIDTRV^\oigtr{y~||z}vzpvirtb_|]RXKSHNFIAC9>1;,9*9*:,<.=/1B;=;;9989787989896:2:.;+<-@4F?LJPOTM~YGj`DbgFcoJcqL`qJ^tGa|FeGiJkKlMmNnOnPQK>RL?SN@WQD[VKb\Wibfohtrk|qj|mgviclf`be]Xh[QqYLVHPDH=A7<1:.9+9*9*:*:+<-<0=2<4;4:595:4;4=5=6=7;7:696:7:7:7:5;1;-;+=.B5IAPKWO]MubIdeE\eDXcCT`BR_@Ug@]vCeHjKmMnNnOnPmQ\UF]UF]VG_XIbZLe]Rh`Ykc`ldckcbg`]b\V]XN\VI_UFlTFREMBG=@6<1:.:,:,:,;,;,<.=1=4<6;7:6:4:2;1<0<1<3;4:5:5;5;5;5;3:/:,;+>.C7KASJZN`MocH^bCS]?LV1>4>7>8=7<5;3;1;/<.;.;0;1;3;3;3;3;2:0:-:+;,?0E8MBTJ[M{`KhaFW]@LU;EM7BH4DL5M[:ZrBgInNpPpQmQjOgNg^Oh_Ph_Ph_Qi`Rj`SjaTkaTjaSiaRg_Ob\L\XHWTCWP@bN>zM@LBJBG@C;@7?5?5?6@6@7@7@9@:?9>7=4<2<0<.;-;-;.:/;0;1;0;0:/9-9,9+;-@2G:NCUI[Lt^Ib^DSZ=IR8BJ4?E2BJ3KY9ZqAgJnOoQnQjOgNdLi`Qi`Qi`QjaRjaSkaTkbTkbSkbSkbSkbSiaRf`Qb^NaYIgTDxPBMBKDICF@D=C3=1<0;/;.;-:.:.:/:/:/:.9-8,~8+z8,z;/~A5H=PDUIzZIj\F[\ANW;FP6@H3=D1@H3IW8XnAeIlOmPjOgNcLaKiaQiaRjaRjbRjbSkbSkbTkbSlcTmdUofYsl_wqeytfxpbwgW{[MRFLCICICIDJEIEGDECDBDAC?B=A9?6>2=02<0;/;.:.:.~:/}:/|9/{9/z9.w8.u8-r7-p6,o7,q:0uA7xI?uNCkPC]P@PO^yGeLdLaK_I]I[~HhbRibRicSicSicSjcSkcTlcUnfXtl`{rxeraRqYM_Wlgvsvsjh\ZPNIFEAC=A:@6>3=0;/;.:.}:/{:/y:0w90t9/r8.q8.o7-n7-l6-k7-l;1nA7mF=fJ?ZJ=MH:CE6YsF_~J_I]H\}HZzGXwGhcShcShcSicSicSjcTkcTleVpi[ytizhypczrʟܟzveaUQKFF?C;@7>4=1<0;/}:/{:/y:0v90s90p8/m8.l8.k8.j8.i8/h:0h>3eB8_D:UD9IB7@@39=16<04;/3I5IY3<2};1z:0x:0v90s90p80l8/j8/i8/h9/h:0h=2gA5dD8]E:RC8F?5=<27:/49.28.18.19.2:.3;/5>0;F4DS:L`@PiBQlBRnCSnDQjDLcAhdUhdUhdUhdUidUjdVkeWni[wshı⯩ؓypcZTJJ@D:A7>5{=3w<2u;2s:1p91m90j90h90f:0e<1e?2fD5eI:`L=VIMeAOfCKaBEX>heUheVheVheVieVjeWkfYok^yxmʽ㻵٠΅{nc]RQFJ?E;zB8u?5r=4o<3m;2k;2h;2e<2c>2a@2`D4aJ8aP=\R?PL=CD79=249/28.17.06.05./5-/5-/6.08.2<07B3;I6@P8DV;H[>J]AFX@?O;geUheVheVieVieWjeXlgZom`{|pۮ͕sma`TVK~NCvG3d?3aA4]C4ZF4ZJ5[P9\T>WT?LM<@D68=25:049038027016005//5..5..6.08/2<06A2:G5>M7CS;DT>AP=:H8feUgfUhfVifWjfWjfXlhZona{}r߿ЫzwigX{WHoKJL:@D6:?37=26<25;25:3492382271070/6//7/1904>18D3;J5?N8@O:=L:8E6dfTefUggVhfWjfXkfYkh[oob{tŻ˵vlYoWCcL8]I5ZI5WJ6TL6RN6PP6RS7UV:VW=SSA4:?48>47>57=57=56<45;44:32922912;15?28F3;K5=N7=N8;J87E5agRcgTfgVhgWjgXkgYki[opc{uĵ~hpaI`R:XM5TM5QM5OO5NQ5OT6RW9VX;WX=TT66=55=35?37D3:J4=O6>P7=O88-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4n=+9(E4H>E@<>>=A1@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q=5`80y7,<0B5E:C?F@B/@,>-=/=-=+<+<,<.<2C6F9FAf^wVdVCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>1.A3/B83E:6O72j7/<0?4B5D:G>@2?,=,<.<-<,:*:+;/?7F>G?XSyn}lQXE;?201(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)3,)5/*:2.=40;2.<0.>0.?4.;81?5/U1+s:.?2@2@2D7?3>-=,=.<.:,:*|:+<1E;JDTO}mssYtUKXC;822'(/')-(+0(,2(/1+00*0+'[f@vvɌÓ~vpO[D23-34-53.961961:2.80-3.,300-.0/(/1)./*,1.*10*01./0/3/+90+>3+A6.@70=5.;1.<0/@1-C1.@0-D.)[4*v=/>2;/A2?3=/=.>.<-:+x:,w:-?4H>PHh[wrvbc]z\JZH38.+&$.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.540762<61?7/D:/G;1F;2B80>4/=30@30I/0H-/=/+H0(b6,}:5:5>5B6A1>-:+<*x<*};0{?4|E8MA]Mu_ry|qsob~`MXA;6'1)"&+",.&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FA1M?3K>4F;2B81?72>83D85F63>5-B5(Y6+|;6?>B:?6A4;/|;.x<,=2QLRHnNHC>JD3I;2D:1@;1@;2Y;8CFB>}B9B8?5A9D7@4?JI;MI6IE7MGHIA:F<.D:-A9/>82=71=80@:2E=3L@1O@/M>0J;1D:/>=1==2z@>GR=;A4D<@4A5B0@2>@@B@9<<<@GBYHxeIfWFM=DCN0F.H3R6Y;e?5GD;OK8MK4WUSxzxu`YrLDR@9<:5/94+:6.=:2A=5JA4P@.I?-K90D839<1<>0E>BH4.=%=2<1A5=-=0>89??==<2-=4]K_LTU=B?8DA=E=IAQ>W?fBqGxKvRuOp]unsw:8163-30+74,<;2IA6UJ9TH:a]iƢ똛߅nlTQaA>@:89;92A<,H@.N@/H=,@8+:5/;60Q:2A8;05#@&:&8+?2@1?2:.312/6,4#:-UJON@E=6=/B9DEDKDPD[DfJtN|RzTtOi^q[ewxD@5A=3;6-52(:5/F=7SF6VF7\R_䋊fcRMpEAQ?<6A@,?B2>EH?FG??;^8497;,;&=)=,9-<.?0<06*2,/*4$4!;/E>CA?7;+=.D>GHFJJUI^IgNrSxWxVpWiZiR[iiͩOI;MG:F@5?90=60A=7LD5RD0VJJrtߪ|xd`MKk8:@><9MILg`}rhjW`qH@F7=,?*:(;.;29,?==/<+<.<2:2;6;6>4;0+)2+6%:)9.JG?79+;-A1=-B5E;TMecknfofppqmqiwsxuiSgAƳ[N>ZN>[N=XMWL=YL9XL?ZSVkh}~ҎՈ~Ã}pZ}CS@?=A=>?5E9?@;:?4?3;14,807/9+?2/12.608+F;HID>8-;);(;,ZND[PRbZkmg{uƊ}s^JU;C5A@?BDAH@AA=DD>?=8B76(3.:/5(5#;-4322.14'J>HHIC=/:*;,;-:*A2UNqst~t~s}iuPdC_uf}au]mweobtfnv{ŵ[K:[K:YK:YI9[K:\J;^K<^M<^O;^O<^N=^MHaSejbyw`5?5>2B963A7<-<,:.616*8%7.8)214*=)<:C?:0H;=07-:/8*:.WRsv{r\pG`@WdHexIoVczi|mnoppuÿ\K7\K6\K6]L7]L9]L:^L<^N=]P=]P=`N;bJ=cNPg_wz{jqFV>L@FBBBFCB>7:,<-?8?9=-:'9&5+0150568%;26&722,7(F;B:8241508.7*UNxxwdyMhA[DNYY5cLxbnp}i~giigq^M:^M:^M:^M:^M:_L8^M8\N=8>1;+=.:362F;K<6)5+4()-'33785>;8+:%8+G@4//1-00-3);.PHh|Ll@e?VIEMa:iRv_ydvav`yc{d{a~]julg_O=_O?_O>_O=_O=`P9^N8]PEb^fyw{yxsxzŽȣķêmcPLFEG&4Te3&96@8:44<:<722,10.2/.3):.PIqUp@d@d>F\G6Ob@mXxaw_pWrXv\y]xYyYb~ge|V[M=_P@_RB`RC`RA^PA_TPibqwww{jpmqƒ׫̝ydofbaOR6:6492E9SDJ=6/?93(/(@>/7?>7381:8875/6*3+0//30/7.80HGw\uHk>bI\oA:>A)DN3auMoVpTiMmQqWsWpQiK_CNi4Ia4TH8YL<_RBbUDaT@dYUpjyyqw`hhqϠ༾ǽywzle`c\ibmhnjd`VQB:8*9(:.8,8,8(8,58.94=;565335-8(7'4*402-3*>9NRaqGi=dA`HF`L>LJ6DC-MY6]uDgIeEgJlRkPdI]EY{CWoB[sDDB6JE<[M>_R>d\Rrl}vqki_`ijՓޛڝԛ՚їɑ~nl]eaXMsVFUP_`qq~{s>/;%9*4)<*D8:(6,89OL8386896:728)8'6$9&:&:,CAUeFf@g<_;LM5-89)>?,>>$U]9aqGd~L_AcDiKjKfHcIcJfIbD47-::4NC;UK=c`bjh^]VWcez|хډՉχωԋ̊zz^gi[Qb^Gp]EWOY]_`PJ:/8&6(6*:)@7<+;198;3F>87848<6<889/;*<);%<$@0JNFdjIoOmMjJhLeJfHgG*0&+0+875DB)8-8=8886<)<(:287;5>8=<=70>=4<=2AE+KL8TS@`^Zur{tqlplnhuka]j\Mm]HkaLx_OWLMC8-8*9,9,8*8*9*<.79%<6@?=2>1<+=*7+<4?6B9;7<28*:(9'8$=/VSTSXS_MniBdxBYv[sVp~TalLBJ6iEgFeGkLlPoQmMvVUM>VM?VN?VP=\RC`WBbYIi_^qeorfok`b^XUVSLUQCXR@]WCa\Ha`O`VRPA@:2;*8(8):):*;.1=/9.9-9););(z5#<-LATJXNbVw_fmSUi@HX9AG49:.45,9@0Wj@kInLkNmPkGqKxUqWcZKe[Ke[Kd[Le[Mg_Kh_Ig^Lg^Mg]Ke]H`ZGVR@NJ8JJ8JM;JO?NOAbO?WMKJB<<09+:-<0?3B=D>F?CBB?=1@2;2;2};0z;,~:+9-9+8*9,:+}:+x:+v7(;-ImMuQpRpNpJxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbTi`QiaNibLibLg`K`ZFQN;DG7?E6;E6>E1`L5[JYWQTC;?5B:F@IFGJIIEDB@A=:/=192;/;.|:-|:.9/8-9+;,~8,{3(y7,q6*w:.L=PCRLUUe[ukNN\9>K4JSEKOCB<;0=/:0:-:,~:.}:/{91z8/z9.y:/v8.t6,s5*o3)t;0L?SFRKVP}[NcbFXkATf=RbAGP5>A+9:+81=-;-:+:,~:.~:0{90y8/w9/v9/t9.q6,o4*k3(o7-~H?SMRMXNxcOYfFSiAVk@FW1:E+8=.9;17;.@L1b}CwQpQwYjS\GgJaIi`QjaRlbTjaRjaRkbSkbSkbRlcSlcTobSoaTkaVpk]zueso[\VATD3Y?2Y>4S>3`B5GBJMGFA?BCCDCCD?D;B9>2<,<+:+}9-}9/}:0y:2u80r7-q8.p8,o6.l3+i3)g2'x@6SNXQ\Qk_KS_CGZ:FW7AM1:@,9;/8<25:/B4@.=92YTQcbEAA=>=@>B=B<=5=1~B<>5=4<1~:/{9/z90x81r8/i8/g7.f7,e7-g7.i70g6.d5,h>4aE>LA98:.19+3:.69148318..:+6D29G516,,-"@J1zm^MQo4F9E7B7?6;2}92x8/u7.s7.n6,i70g7/f6.g7/i70k80i<0lH:rVIYLB26.15-37,46+27*/8+09*.8*/8,8A2;C201$DM:ojGj=Lk5s=3p=2l:1k80n61k60h7/g91h<3i?4gD2lT@zr_XZK+3)17.07-16*05,/3-/3-/4..1,.5.2?43@3@M:IX@BU8Mg@Gb9XrJ]xT4D5heVheVheVheVheVgeUkd[ndXghP}~ӹǐ}XG@582<4pA7r>7r?7q@8l=5l;3p73l82g:0c;1_?2aJ9aN7cX?twaHP>,2)07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupΟn[M=~>.l=-m92p=6p@8m?7l=5l<5h=4a@3^E6N?-QN6ZW;aaChpV2?+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoоlWXE|PDj?2h@2gA4fA3aD7\F5XI6c]FDF/:C'GK,ooQ[_F39(7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BPF+HK,igJ`YDFF5:?5:>58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Magnify.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Magnify.miff new file mode 100644 index 0000000..48554e0 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Magnify.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=140 rows=92 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=140x92+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/-1/-10.30.51.62.72.83.93-92-92-91-81-80-81.91.80-80-80-80-7/,6.+6.+5-*4,)4,)5-*5-*5-*4-)2-(1.(1.(2/(30)52+63,74-96.;7/=9/A;0D=2G?3IA3JA3KA2LA2NA2PB2TB2^B3lC3}C3C3B3B4B7D;D?DDDFCFAE?C=B=@=??->-=,=+=+=+=+>-?/?1@3A3B4C5E7E8B6e=2N91A62;4283272172072/61.51-40-20-0/-//-0/-1.-2--4,-7,.>/0J45];;sDCOQ[dh|svsqedXTRKnSMg\Xjjjsz}~tpqfdc[\ZU0/-0/-1/-30.41.62.72.82-92-92-92-81-80-80-81-81-81-80-80-80-7/,6.+5-+5-*4,*4-*5-*5-*5-*4-*3.)2.(2/(2/)30*52+63,74.85/:7/=8/@;0D=1F?2H@3J@2K@1K@1MA1OA1SB2[C3iC3zC3C2A2A3A6D:E?DDDFCFAD?C=A=@=>?<@7?2?/?-?-@,@,@,@+@+?,?->->-=,=+=+=*=+>-?/?1@3A3B4C6E7E8B6c=2L91@62:4283272172072/61.51.31-10-00-/0-0/-1/-3.-4,-6,.<.0H34[:9pC@MMY`fyrvrpcbWRPImQJeYTgfeouwz}{~qnoccbZ\ZU/.,0/-0/-20-40-51-61-71-81,81,81,70,70,70-70-80-80-80-80-70-7/,6.+5-+4-*4,*4-*5-*5.+5.+4.*3.*3/)2/)30*41*52+63,74.85/:6/<8/@:/C<1E=2G?2H?1I?0J?0K@0MA1PB2XC3eD3tC2B1@0?0@3C8E>ECDECEAD>B=A=@>>?;@7@1?.?,?,?,@,@+@+?+?,?->-=-=,=+=+<+=+>->/?1?3@4B5C7E9F:~C7_=3I81>62:4393283072/62/62.42.21-01-/1-/0./0.1/.3/.4--5,-:./D21U75j?:}IFUYduq~voo`aTONEmNEdSMc][hjlqvzwy~uswjik_``X[ZT..,..,/.,0/-2/-40-50,50,60+6/+6/+6/+5/,5/,6/,6/,6/,6/-6/-6/-5.,5-+4-+3-*3,*4-*4-+5.+5.+4.+4/+3/*30*30+41+41,52-63.74/95/;6.>8.A:/C;0E<0F/J@1LB2SD3^D3lC2{A/>-=-?0C6EA=@=?>=?9@4@0?-?,?,?,?,?,?+?+?+>,>-=-=,=+<+<+<,=->/?1@3@5B7D:G=I>{F;[?5E:2=62:5293183073/62/52.32.12./2..2..2./1.11.20.3/.3.-6..>0/L40_:3pC=~PRarq}wop``SMKAoI?cKD^PN_Z[cchggmfej_`dX\]TZZR--,--,--,/.,0/,2/,2/,3.+3.*4.*3.*3-+2-+2-+3-+3-,4-,4-,4-,4-,3-+3-+2,+2,*2,*2-*3-+4-,4-,3.,3.+3/+30+30+40,41,52-63.74/84/:5.<6-?7.@8.B9.C9.D:.F;.G.B3E8F=E?D@B@?@>?>>?;@6@2@.@,?,?,?-?,?,?+?+>+>,>,=-=,<,<,<-<.>/?0@2A4A6C:G?LDPGxNCXF6=83;5294083/63.43.33.13./3..3.-3/-2//2/02/11/10/2/.3/-8/-B0,O4-_=7oLM{`qt~{rtbcTPKBuF[FCWKMXRXZV^YX`VX^SY\RY[Q,--,--,---.,/.,0.,0.+1-*1,)1,)1,)0,*0,*0,+0,+1,+1,+1,+1,+1,+1,+1,+1,+1,+1,+1,+2-+2-,2-,2-,2.,2/,2/,30,30,40,40-51-52.73.93.;4-=5.>6.?6.A6.B7.D8.F:/G=1H@4KB5RA4[@2e=/q;,}:,<-?1B5D8E;E=C>A?@?@>A:A5A0@-@,?,>->->->,>,>+>+=+=,=,=-<-<.7<82:5/74.53-33-13-03-.3.-3.-2/-2/.2//2/02/01/01.1/.3.-9.+B1,Q:6cMNudtzx{il[ZQLKElGD`GI[LR[S\]Xc^[f][dY[aT[^Q,-.,-.,-.,-...-/.,/-+0-)0,(/+(/+).+).+*-+*.+*.+*/++/++/++/++/++/++/++/,+/,+0,,0,,1,,1--1-,1-,1.+2.+2/,2/+2.,3/,3/-41.51.72.:3.;4.=4/>5.?5.A6.C7.E80F;2G>4J?5O>5V=3_;0i9.u9-:-=/?2B5C7D:DC?D>D:B4A/@-?,?,>->.=.=-=,=+=+=+<+<,<-<-2@4C6D7E:G>MFYRg]qd}oaccVPTIFG>@>5;8065-33,12,/1,/1,.1--1--1..1//1./1.01.01.01.00.1./4--;/.I;9]QRslyt{in`cZ\yW[nW`j]jmfvql}sl|phufbk[^dS,.0,.0,.0,./-...--.-+/,*.+).+(-+)-*),**,**,**,**,*+-++-++.++.++.++.++.++.++.+,/,,/,-/--/--0-,0-+1-+1-+1-+1-+1-+2.,2/-40.71/92/;30<40=4/>4/@4.A5.C60E82F;4H<5K<5P:4W92a70n7.{9.;/=1?3A5C7D9D;E=F=E:C5A0@-?,>,=-=.=.=-=,<,<+<+;+;+;,;.KDVOh]ykspkudZcUNSFDF:==277.33+01*/0*./+./+//,//-//-//-//-00-00-00-0/.0-/2,/6/0D=:ZWSssw|wro~o~t||rpgs_`hS,.1,.1,.1,.0-./.....-.-+.,*.+)-+*-**,**+)**)**)*+**,*+,*+,*+,*+,*+,**,**,**,*+-++.,,.,-/--/-,/,+0,+0,+0,*0,*0,+1,,2.-3/.61/920;31<31<30=2/>2/@2.A4/B51C73D94F:4I94O82X60e7/s8/;/=1>3@4A5B6C8E:E;D9B5@1?.?,>,=,<-<-<-<-<,;+;*:*:+:,;.<0>4A8D;F=G?KCSLbYwiv~{socp_V_NJPAAE79<045,01*/.)/,)/,*0-+0-,0-,0-,0-,0.,0/,0/-0..1,/1+.5./B?8XZMqxmvrgv^^iQ-/0-/0-/0-/0.//.////./.,/-+/,+.,+.++-++,**+)**)*+*++*++*,,*,,)+,)++)*+)*+)*+)*,*+-+,.,,.-,/-,/,+/,+/+*/+*/+*0+*1,+2-,4/-71/:20;31<31<20<1/=1/>1.?1/@3/@51@72@83B82F61O5/[5.i6-w9.<0>2?3@3A3A4C6D7C7A4?1>/>-=,=-=-<.<.<-;,:+:+:*:*:,;.=1@6C:F>HAJDQJ^Uqdtxwj}g]lWQ]IGP>?D68:032+1-)0*)0**0+*0++0++0++0++0,,0,,0--1-.1+/0*-3.,?>3U[Fnxa}tndu[ZgN.0/.0/.0/.0//0/00.00.10-1/-1/,1.,1-+0,+/+*-**,*+,*+,*,+*,+),+),,(,,(+,(+,(*,)*,**-++-,+.-,/-,/-+/,+/,*/+*0+)2,*3-*5.+70,92.;3/<30<30<2/<1.<0.=0.>0.?1.?3/>5/=70=60@5/F3-P2+]3+j7-v;/>1?2@2?2?1@2A4A4@3?1>0=.=-=-=.=.<.;-;,:,:+}:+{:+{:,};/>3B7F5/=4/<3.<2.<0.<0.=0.>1.?2-@3.?3.?3.?1-B0,H/*Q1*]5+j9-v1>2=2<1=1?2@3@3?2>1>/=.=.=.=-<-;-;,;+|:,y:,x:,x;-{<0@4D9G>KBOGVNdYxfuz~pree]zZVnRO`JGPA>B87602.+/)(.((.').(*.(+/),/)-/*..*/.*/-*.-(+/+(::-OT5.=3.<1.<1/=1/>1.A2.D1.F0.E/.C..A.,B/*G0)R2*_5+k9.w;1<3;4;4<3>4@4@4@3@2?0>.=-<-<,<,<+~<+|;+|;-{;.zcmPu`jmptxyyyyz{wsog|aYiRQ]H34/45/45/55/650751861:72:73;72<52;41;3092/71/61/5104112012.02,02+/3+.2+.2,-2-,2.,2/+20,21,21.22/22042/62.92-;3->4-A6-C8.D90D91C:1B90@7/>5/=3/=20=20?30A3/D2/H00H./E./A/-?1+B1)K2)W4*c7-q91};5;7<8=7?7@6@6A5@3?1>/<.;-;,;,~;+|;+<.>2A6B8C8}D7{F9}I<M@REZKdSp\}fq{{xuppklhfd]w[RfOGTA=C566,2-'0)&.(&,)'*+(*+*+++-*,.)-0),2++72-CA4SWBcmQo]vcxfyhzk{m{o{q{s{vzwwtoldz_XhQP\H670671671771872983;94<:5=:5>:6?95?84?73=62<52:52:539538437227017.07./6./5/.50.51-51-52-52.53/540641851:50=5/?6/B8/D:/F;0G<2G<2F<2D:2B80@70?50>51>51?51@62D52H43K33I31F3/D4-F5+M5*W6+d7.r91;6=9>;@;A9A8@6@6@5?3=1<0vKvTBzYGaMiToZqawiqy}xtqpxmpgfv\[dNQR@HA4B5,=.)8,(3,'/-'.-(0,)2**6)+9++>2-E=2PM;\`GerRlYo]p`qbreshsktovsxvwvsrliby\WhOQ]G782782782893::4;:5=;6><7@<8A=8B<8B<8B;7A:6@:5?95?95>85=74=63<41<30<20;30:3093/84/74.74.74/740751961;71>81@81C90E;0H<1J>2K>3J>4I=4G;3D:1B81A71@71?72?82A83I85S98Z99\:8Z:5X:2Z:0b;1k;1t;2~<3=6?9@;B:B9B7@6@6?7?8>6=5~=3z=1z<1;1:3>9EBMIRMSJRCsR?nVAq\Ez`JeOgUdX^Z\^bdmkyqutsrrrqnyfk[y[OqLEj@=c98Z55P42E2.>0*:.):,)=-*A1+H:/RI6\Z@ekLjxTlXlZm\n_pbqgsluryxzzxxsrkhax[XhOR^H8938938939:4;;6=<7?=8@>9B>9C?:D?:D?:D?9D>9C>8C=8C=7C<6B;5B:3A82A71@71@71?71>71<60:6/95/85/85/950;60=81@91C;0F<0H=0K>1M?2M?3M>4K=4H<3F:2C91A91@91?:2A:2H:4W;8k>>y@B~@@{??DDKIQLTKVFtYCm^EscIeNdR_UTUHSBSDVL[V`^dcffhijmlqnspromlef[`RZKUFPBK?En;=[63L2-D1*B3*F8,NC1ZR:fdFntSq[q^o_p_rbugxn|v~xwliaw[YiOTaI782893893::4<<6>>8@>9B?:C?;E@9/A:0E<0H=0K>0M@1N@2O?3N>3L=3I;2F;1C:1A;1?;1?;2E;3U<6o>=BECHAD@=@7A7C:D;C8A5@4@5B5B4B2A1@2?6?:>>?@??@8<;;><@>?DAKERGXG|^GvcHfLfQ`TUSHP=L7K8M;P?SCUGYJ\O`SdWg[j\mZmWlSkPiMgLcK_IZFP@Dk;9W81L9.K?/SK6b\BpnRzb}k|nzo{oryqncw]ZkQVdK6727827829:4;<6>=8@?:B@;D@81<70;60;6/;7.=8.?9/B;/F=0I>0L?0N@0O@1O?1N>2L<2I;1F:1C;0@;1=<1?=2L=4e?9ABDJBJ>A<7=1?0A4A6?5>3?3@4A4A2@/?.>1>4>8=;<=<==<>:>:=;;;8986<7D]@6UF6]S@ohS}h{zxgyb^nUZiO561561671883::5=<7?>9B?:DA3G=1F<1<=0@>1S?5uB;CBBF?B:89/;*=*>-=//>1>3=4;587787797;7;695615-7->4I=UE\K^M]PYRQQGJ@D>@@AAD?G:G6G5I5M7Q9V:Z<_=e>j?n@pBrEqHpMpSrVqVkR_MP{KFlRFrdT}nͽplfu_bqY440450551672883;:5=<7@>8CA:EC;FE=HF=IGNGCNGCMD?JA:H?5F=2D;1C:0A91?81=71=71<70<70=91?:2A<4D>4H?3K@2N@0M@.L?.J=/I:0G91D81@91<;1=<0F>1^@5C:B<>;:57.8(;'='=);*:+:-<0>1@2@1?0>0>1=1;08/50312130506/6,5)5'6(;.D8OBVIWLTNONHKBE?>>9?9B=AA>C;E:H:K;O;S;W<]n@rBtEsIrNrSuWvXtWnWdY[b[xm͵|vor~j32/33/330440661883;:4==6A@8CB9FE;HG;C:7?84=71<60;6/;6/;7/<81>:2@<3D>4G?3K@2M@/M?.J>-G<-E9.C70@71=71=90D:1S<2n>5A7@6<18+7'9&<'>(<);*9+9,;.=/>0?0?1>1=0;/8-6,4-2-0,/,0*2)4&5$5#6%9+@3H=NDOILJGHCE@?>9=3>2@5A;A@AD@G@K@N@Q?V?[?b@iAoCsEvHvJtNtRuTvUuXt_qdkli|ë21.21.21.32.44/661982;;4>>5BA8ED:IF:LH:MJ8NK8PM>TRK]\ahhxonnkhc{_XlVO^NGRHAHB<>>97;71:5/95.96/;80=:0@<1D>1G?1K@0L@0K?/G>.C;.A9/>81;72;72A71P82g95;6=4=1<,:(:&;&<(=*<,;-:.:.:-;-<.=/>0=0:/8-6,5,5,3,1+0*0)1&4$5"5"6%8*=0B8G?HCGDDBA>?9=31A7C=CCDGCJCMCPCUB[BaChEnGtIxJyLxOvRuQrQpWrcviqnl~ˮ42.32.31-31-42.54/760:91=<3A?6EB8JE9NH9PJ8QK:SOCZXWhgvxz~urkga]zXTjOKZHDKA>?=:8;86:84;93=:0@<.C>.F@/HA0H@1F@3C?6A?8??:=?;<>;?<8J;5]:5w;6<6<2=.=+<(;';(;*;,;.;0;0:0:.:.:.;/<0<1907.5,4+3+2+1*0*0(2&4#5!5"6$8);/?5D@8>2<.;+;,=0@6C=ECFGEJELEOFUF[E`EfGmJtLxNzOyQwRtQpPlWobtgphj~yԧǽƼ86075/63.52-42-53-75.97/<:1@=4E@6KD8PG8RI8SK;=>;6@<0B>.C@.CA1BB6BC=BDEDHLGKPHLPIJLOGE[C>mA9@7?4>/=,>+=*<);):*9-:/:1:2:29190:1;1;2<2;2905-3*1*0*/)/)0(2&4#6"6"6$7(:.?5E=JCIBD;?3<-;););,>1A8E?GDGGFIGKHOIVI[H`HeJlLrNwQySyTwTtSoRkWl^o_k`frsؙĿ<:2;91:7085.73-63,74,85-;80?;3E>5KB7QF8TH8UJC6@0>,=*=+=+<*:+9,9.90919293:3:4:3:3;2<3=4<38/3+/*-)-).)0)3'4%6#7$8%8(:->4D2B9GAHEHFGGHIJNLUMZL_LdMkNpPtRwTxVvVsUnUkXjZjYfYahkщݳA>4@=3?;2=90;7.95,84+84,:6/>92D=5JA6PE7TG7VH;YLH`Wcom࣭䙚֋{ymib]YTQMnIG\CBK@??B>;GA=PFF\OXlZozdif^sTbMQGBB5>-<)<(<*<+<,;-:/:091918293:5;5;5:3:1<2>4?4<16.0,-+,+.+0*2)4'6&8&9(9)9,<1A9HAJDE?@6<-:(:(;,>1C9H@JCHCHCJGLLNRPXP^QdRjRoQrRtTvVuXrXnYkZjZhXdX_bdzwɠGB6FA6E@5B>3@;1=8.:6-:5-;6/>82C<5H@6ND6RF6UG8WJD]S\khڡፌр~uqjf_]UUxMMdKGTQDJ]DHnIOR_\sdgc~YoP_IPDB@5=-<*;)<+<-<.F=F>IBLHONQUT]WeXkVoSpRrUtYu\s^p^n_m`l`h_aa^oiӹLF9KF9JD8HB7E?4B<2?90=7/=70?82B<5F?6LC6PE4SF5UH?[PUhc{{~Ҟ쨰叐څ{|psfia^cTkoM\JTKTO[TeWkWkSdLYFOCGA??7=1=.=.=/=0=1<1:08/7/6/7/8091807.6+6)7(:)<,==9=5>3?3?3?2=1:/8/6.5.5.7/8/8.7,5)4'5%6$8%9(:,907253333221212222213/5-7+:-A4H>JEHGEDB=?6;0:-;,=-?/@/?/@1C6FTL>SK=RJ??=><;<9>7@6A5?31F;ICHFGGGDC=>5;.:+;*<*=+=,=.?1A5D:LCVP`^fhfncoapcqgrmsosntoyu~}~u~xbimU~|iXN?WN?WM?UL>SJA>?><@:B:C8@6A5?2;.8+6,5.6/607/7.7,6)6'6%7%8&8)8,8-7-7,7+7+6,5-3/1101001-2*5(8)=.C7F?GDHHJHHCB:=1;,;););*;+<,=.>0@3HUKB>A>>?;A;C>C@@@>>=<=9>6?3?2>/;-9+8,7.7071605/5-5+6)7(8)8+8/81828/8+8(8&7'5*4,3/304.4,5)7(9)<-?4A;C@FEJIJFE=@4=.;+;*;*;+;,<-<.>/E7PD]Sfaiiglemenhplqlqipeqftpt}oybl|Zq[O@[O@ZO@ZN?YM>XL=VK;UJ:UI:SH:RH;RI;SJ:UJ8VK8WL>YQLa[fnk{{Ǐӑړޒ܏Պͅƃ{qeVtI^AM@CAA@C@E@E?A@=AB??>=;>9>6>2=/=-<,;*:*9+8-7/6040302/3.4-5-6.61545655506+7'8%7&7)6,7/809/9,8)8(9);-<2<7=;@?DAF@C:@5?1>/<-;,;,;,;,;,<-A3L?YPe`jkinhphqjrlsjqdn]l\mhn|mfubwƿ[N?[N?[N?ZN>ZN>YM=XLYOH]V[fatpnyxɋϋ·ǁ|{{rg[wPfFX>L6?3=/<+;);(:(:(9)8+6-5.301000/00/001205.8.8.5002,5)6(7*8-8/91;2=23A5B5?2<.:-9,:,:+:+>0H;UMd`lnnunwnwownwjs`lWhTgcj}nkiyѷýԹϮ̥˟͠ѧֱڽ[M>[M>[M>[M=[M=ZMD;@5?2=-;):':'9&9'8(7)6+5-3.1...-.-.,0,3)6'9&8(5,2114/5/6072737393<4>3<2:08.707263414.6-7,9-=2D8E9A5<19.9-9-9,9+<.C8QIb_nqtzu~t~s|qziu]lQeOc_f|kjhqÑƚɥ̱μ[M=[M=[M<[M<[L<[L?@CAFAE??=8=2>1?5?7<7=7@7@3=-;):'9'9'8'6(6*6+5,4,1,.+,++,*/(3%6"9"9'9/:5;7;68473635325294>7@:>9;58383725.5+6)7)9+>2E;G=?9?:?=?@@CAD@A>:<2;.<.>3>7=8>:B:C8A2>-;*9(8(6)6*5+6-5.3.1-.-,-*/)2(6%;#?&A/D8G?J?I9D4>2915104094@:D@DA?<;7:4907,7(7'8(:+?2E;F=@8;3817171708.8-;0G>ZVlly}}|wq}evWkKbH]SYiV{{ToTrXy^|bxctdsewh|koruwzĹź[K:[K:[K:[K:ZK:ZK:ZJ:ZJ:ZJ:[K;\K<]K<]L<^M<^N<^O<]O=]N>]N@^MD_NNaR_eYume{r{{o\tI\?K>B@?A?A@@BACAB@==6;/:+;-=2=6<9>;D=GM6C2:223-6-<2C;HBHDC@?:;49.8*8'9&9':*>2C:C<>893624141506/7-9.C:UOigy{}wn}btSjH`EYNR_JoqIh}MnUw]{bydwfwgzikmoqrsw[K9[K9[K9[K9[K9ZK9ZJ9[J9[K:\K:]K;]K<^L<^M<^N<^O<^O<^O<_N<_M?`LGaPVdWkldzr}}p^nK[AO?I@F@D@C@B@A@>?8=2;-;+;-<1;5:6<7B9G_P>`O>aM@bMFcQTfZkmgzvtdmS]GSBO@K?G>D>A>=?9>4=/<-<-6;/9,8*8*8,9.=4A9A::5411001/00/2.4+6+>2LCb]yx~sezWpJgC^BUIJ}W@bjAeMr[|ejml~j~iijkjijnx]L8]L8]L8]L8]L8]L8]L8]L8]L9]L9^L:^L:^M;]N<\O>\PA^RD`SGcSIeRLfSQgW_jawqn||wjp\`OWGRBN>H<:>6>2=.=.>1?3=4:27/7,9+=/A5C7B5?2<09174696>4>0:,5(1&.&-'/*5/>7IBTMZPYKQDF=<;5;2<0;.;0>4@:B>DAEBD>@8=3:09/707183<7@:?8933/10/0/0//1.2+5*<0I?`Zyx}n^vPmFeA]BSIHtW@`lCfOs\{ejj}i|g|e}f}g~h~g~efks}]M9]M9]M9]M9]M9^M9^M9^M9^M:^M9^M9^M9^M:\N=[OA\RH`VPdYXh[^k\bk]hlcunluw˜¯|ruecXYNSFN?G;A:<;8=4>1=.>0A5C8A8>5:07+7*8,;0>3@4@3=190636:9A;D:A6<05-0,.-0054<:D@JEMEKAE<=:8=9C=G@GAFAFAFCHFHFGCD?A:?6<484665879::=:<6713.1/00/1/00.2+4*;.G<^Wxwzi|WrJjBd?[BPJFmY@_nEgQs\yc{ezeydxbybzc{d|e|c}abgnuxw{v^M;^M;^M;^M;^N;^N;^N;^N;^N;_M:_M9_M8^N:\O?\RH_WUe^dlcqpfzqgpipnsvzˑПƭzpf`XSQILBG=A:<:7<4=12C8H>I?F;?49-6*5+6-90=2>289789:;==A>C?D?DB;@8<677493;5<8<:9945/3-2.10/1/00.1,4*9-E:[UuuucxQnEh@b?YAKJAdY@]oFgRs\waxav`u^u^v_xazbzaz_{]}^cinmvjof^N<^N=_N=_N=_O=_O=_O=_O<_O<_O;_O9_N9^O=^QF_WTe`hmi}towrvrtruwz‘ɟɬĕjjXZOOKHHBE=?;9;5;2:0=3D:LAQFOCF:=17-4+4-7/;1<0:-5,2-2178>AEIGKEIDGEHGJIMHLDH@D5;7>?FLRY__g^fY_QSJHDBA>A=B_O>_O?_P?_P?_P?_P>_P>_P=_P<_P?_QEaVSe_gli~srwvwvvvvx{ƕȦŶüνɮv|bgV[QTPMMFG@@<99492;3B8K@SGTFL?B69/5-5/81;2;08,3)0*0,42;:CDHKKOLROURYT[SYMREJ;;8<8?9?8=69565383:4;5864605-4,2-1//1/10/1-4,8.?7ROjnr~g{VqIiBdA^AQ@?\F5PS8VgCe|PpZu]t[qXoVpVrXu[v[wZvXuVuUvWuXqXkUd}Q_wN\M=]N>^O?_P@_Q@_QA`QA`Q@`Q@_Q@_QB`SHbWTf^glh}qptvswqurux{ƅΗѫͿ̺ղ׫ҥÙtyej]b[\YSTJKAA;:95:4>6E;MAQDOAF9<17/83<6=6;16,2)0(0*3-83>;DDJMOTRZV_Zc[cV\KQ=D3;0:5@@LMXXa\eYaPVFG><968594;5<4;4948678696865515-5+4+2-0/01/1002.5-8/>7OMdjky`wPoFhBbC[CMrB;QD1IN4Q_>_sKkTqXqWnSlQmRpUrXtYtWrTpQnOkNgKbH\xDWqBTmAYL]O?^QA_RB`SB`SB`SA`SD`TJcXWg_img}qprtpumslsqw~͐ץٻپ߶ޱ֭ţorekcfca`XXMNDD><<7=5A7F:K>L>F9>2:1=7@=9663728292:2939496888876636/6,6+4+2,1/0102102.5.80>9MM_gctWrJlCfBaFWGJgE:LE1FJ1MW9YiCd{MkQmQkNiMkOmRpUqVpTnPjMgJcG^CXw?To=Rk]P@_RB`TCaTCaTDbVJdYVi`inh~rprsoskqipltv}LJӚܮѼǶypofkdjejffd]\SRJHD?@:@7A6C7E7C4>1=3@:C?C?@::36.4-5,6+8+:-=2A:CBEIKST^ZcX^NR@B8;8=:C>G@HAHAF>C;=775342518191:2938486877775626.6,6*5*3+2.2112102.5.92A=NP[e[oOmDhAdC]GRIF`I;MG4GH1JP4R_<\qDeJiLhJgIhKkOmRnSlPiMeJaG^E[|CXu@Vp?Vn?Vn?PG8QH9TI;WL=[O?^QA`SBaUDbWHe[Si`enhzrnsroqjogmiorwϏ؟ݭ߹»Ÿ~z}vmk{f`d]f_idkfiec`[XSNKEE=@6>1>/>.=.>2@8B?DIOTUZSVKJ@<979;9@9B7A5?3=2;080503234272:2:3:48576666664616.7+7)6(4*3,3/302.3,5-;4DBOTWdTkHi@e?aAWDIlF>VH8JF3EE/GK0NX6Xi?ayFeIeGeFfHhLkOlPjMgJcH`G^F]|E\xD\uC\uC\uCIC7JD8MF:RI\O?_RAaVFcZOh``ngurlrnnmijfihkoqz|͇֓۝ܥ۫ٮׯӯΫȣ{tmwlcdo]X\T]UaZgamhokmifb[VNGB9;/9*:);+<.=3=5=5;3:18/8/9.:,;,=-=/=2<5<8A@JJONMJF@=47054391Ny>=U?4HB2DB/BC,FJ.PX6Zi@avGdIcFcDdFgIjMkMiKgIdHbHaHaGa|Ga{F`{E`|DA?4B@5EB8KD:SH=4D@7LD:RH7JC:PH?VQK^Z^caredba]\\]bckmuw~փه؉ԉЉЉъҌЌɋt{fvq]`g[Se[KnZGXJWPZYackltrvqog^TJ=>-:':&:(8*7*7+9+:*9*:,<.<.:,:+:+:,:-9-9.;0=2>3<19/5/2105/9-;,<,<+;*:*:+:.:2:698796:59576665756637/7,8)8(8'8&8%9%:%;'=,@8EHJZHeAf=d>`=U9FX48=1.34(8='IN/bh@}XnsgnVeIdDiHmLnOmMkKiJhKgLfKeJfIgHgHhH.2).3*03-550;94B>8HD=OLJWV\]]o__^^]]abkluw}قބ܄օхΆχ҉ӋϋĈ{}pwcjo\Xg\Nd]Ik\FZHXNYV\_cfjiid_WQFC5<*:':'9)7*5*6*9*;*;*<-?1?1<.:+9*9*9*8*8+9,;/;0;09164471:0FOG]Ce>e<`>X>Li9?G35:2/97,CG.Yc.A3@3=/:+9)9)8)8)7)7*8,9.:194775:3<2>4?7?:?;=9;8:78677676868798998979697885818-9*:););(;&;$;$<(@4EEGUE^Ac>b>[?Oz=BS97>40<4.E@1TY;m|Ng|zzchObEdCjHmLlMjKhHgHhKhMgLfJgIhIjJlK.2'-1(-1)/1+23-770<=4CE>KMMRS\WWl]\}edqp}ˈ銈兄ڂЂʄɇʉɊĉ{~uwmxoeci_Uf]Le]If]Hk]Fx[FYGVKTOQPMLFC?9:08*8'8&8(7)6*5*7):*<+=,?0A4@4=/:*9)9(9(8)6)6*6+7.9195896;4=6@;CAFEFEC@><:9785858586888:8;7;7:6:7896929-:*;)<)<);';%:%;+@9GKHYE_B`C]CSAD^=7D9/<7,C1BD7IKCOPOUU\][mfdsqَ⌈ކсƀz~txlyqeek`Wf^Ne]Kf]Jj]Jp]H{ZFVDQDLEFC@=:7605+6(8&8&8'7)7*7*8):*;+=-?2B6A5=/:*9):)9)8*7+7,6.709396998;9>=CDHJKKIHEB?=9:594848587898;8<7<6;6:89:6;2:.:*;)<)<);':&:(<0B@IRK]H^G\IXHLkC0;+:*:+:,9.9/91929495:798;;>@DFKKMKJFEA@<<8:594848577798;7<7<7<7;99;7<3;.;+;);(;(:'9';,A8HHNWO^M]NXQROF\H6FF-EL.O[7_nDpR^fj}ek}XXhHM]4A8B7@2>/=.0F?NNRYR\RYTUXOvXD[U8QY4Xf;dwFmQtXxZxZrWerPT_DGQ9CO4KZ6Yo=eDiFiGgHgIiKkLlMmNnNoOpOqQsTtUOI;OI;OIYSA\UC_XHc\Qhaaohtvnzqzpvmph|jcufapd`kd_ed^]e]Ug\Oi\Kj\Ik^Jk_Lp_N{]NZMVJOBE9=18.6-5-5-6,6+7)8(9(:):*:+;+:(8&8'9,<1>5@6A5A4?4>4=5<7;8:9989897:6;4<3=4@6B8B9@9=8:88878778685858697998:9;:;<:=8=4G1IW7Yn?fEkHkJjKjLkNlMlLmLoMrOsQsSrUrUXPAXPAYPBYQBYQBYQAYRA[SB\TD_VE`XEbZGd[Lg^Tja_ndiqfnqfnodij`cd]]^YX[WSYUNZTI\UF_VEbYFe[Gg^Ii`Mr`O]PYOSJJAA7:/8,7,7,7-7-7,7+7*8)9*:+;,;+:)8%8%9);-<0=2@4@6?7=8<9;:::9:8:7987:4:1;.;,;,<.=1=3;698797878868594:4:6:8:9;;<;<9=6<1<-;*:):'9%8%:)A5LESPUSVSXS]RdQnOvyNsQwVsUgMZoEP`>IR9BG5=@29;/8VQ?ZUA]XD_[Hc]Lo^O]QXPQLHC>8:09,9+9+9+8+8+8*8*8*8*9+;,;,:)8%8$:';*:,;/<2<5;8::9;9;8;7:7:7876829-:*:):):*;-<1;4:78878778695;4<5<7<9<:<;=:=7<2;.:+:):(9&8%8%:*B5LCRLUNVOZQ_SgUtXYuWk}Q\oGM_6>8>9=9<9<6<3:.:+:):):(9&8%8&<+C5LARIULWNZQ^TeVoWywVhtOUeDES9:F27@0:?2;>3;;099.89/8LOATQBeRDSFRINHFCA;=3;-9)9)8)9*9*9*9*9*:*:,;-:*8%8":#:&:*:.;2<8<<<>;<:99686869491:.;+<)=)=)<);*:,:/:3;5;6;6<6>6?6@7?7>7<6;4:1:.9+9):);):(9&}7%8'=.E7MASHVKXNZQ\S_R~dNieGT^>CP69E27@3:A6?C7@B5>>0;:-9:.8ML:GI8CG7AG8AH9BI:GJ:SK:oO>SESJNIHDC<>4;-9*9*9*:+:+;+;+;,;.<0;.:):&;&<*=.>3?8@<@???>;=6<4<3<3<2+>*=*;)9*9-:0;3<4=5>5?5@5@5>4<3:2909-9+9*:););)}:)z8'z7'~9*?1F9MARGVLWOYR[T^R{`Kc^AMV7?L2;F3>H:CK=FKJJ:CG7@E6=E53>5>4=1>/?/A2B7C;C>D@C@A=?8?4?2@2@2?1>/=-<,<,=,=,<+;*9*9,:.;0;1<2=2>2>1=0;/9/9.9-:,:+:*:*:*|:*y:*w8)x8)~;-B4H;NAQFTKVPXS\UbU|fOgfFT_HH9BE6=C33=2>3?5@6@6A8A:BE@EBEBD@A;?5?2A1B2A1@1?0=/<.;-<-<-<-;,:+9+:-:.:/;/HQ7BH0=@,:<+8:-8<.;C0GU7XnAhIqNtOsPrPsRtUtWqVjQeMdKcKbKbKi`Qi`Qi`Qi`Qi`Qi`QjaRkbSkbSkaTlaVlaWlaWlbVlbTlcRlcRlcSlbUlbUlbUmbSlbRjaQe^N^YIVRBNL@:?4?1@1A1?1>1=1<1;0;0;/;/;.;-:,:,:,:-9-9.:.:-:+9+9*9+:,:,9,8+}7*{7*y7+w7+t6*s7+v:.|A3H:N@QDRHSKUOXQ\Pt_MfdH]hDXjAVi?Sf=N_:GV5AL1=D.;?.9;.8:.8<.;B0ER5Vj>fGpMtPsQrSsUsVpUjReMbKcJcJbJaJi`Qi`Qi`Qi`Qi`QjaRkaSkbSkbSkbTlbUlbUlbUlbTlcRlcQlcQlcSlcTmbUmbTnbTmbTkaSh`Qc\M]WHWRAPL:HG3ED.PE/iG6H=FAFDJJQRWXWXQOJGEAC=C=D=E?FAFCFEEGFGGGHGGEEDCBBAB@B?A=?9>4=1>1?1=1<2;2:2;1;0;0;/~;.};.};-}:,~:,:-9-9.9-9,9+9+9+:,:,~:-}9,{7+y6*x5*v5*t5*r5*r7,u<0{C7K>PDRGSJSLVNZPz^Ni`I\cEVfBUiAUi?Qd;HY4@N/;E-9?-9=/9<08;07;.:@.DO3Se;b|EnMtQtTtVsWpVjReMaJaIcJcJbI`Ii`Qi`QiaRjaRjaRkaSkbSjbSjbSkbSkbTkbTkbTkbSkbRlcRlcRlcSlcTmbTnbTnbTnaTlaTjaSgaRe`Pc]L^YFUR=NK4TH2gI7~HE@ECEEDFDGEGFFEEDCCAB@B?B>A.BJ1P^9_uClMsSuWuYrXlTeN`I_IaIcJbJ`I^Hi`QiaQiaRjbRkbSkbSjbSjbRjaRjbRjbSkbSkbSkbSkbSkbSlcSlcSlcTmcTnbSnaSm`TlaUldXoi]tobwscvq`miU`\G[R=_K9iG8uD9B;B=D@GCIEIEHDFCDAB?B=B=C?DACDCECECEDEDDDBC@C?C>C>B<@9=4<1J\;HY8ES4@K0EAEDEDDCC@C?CACBCDCDCDDDECEBD@D?D>D=C6=2=/=.=/<0:/:.:-:,:,:,:-~:-~:.}:/}:/|:0{90z90z8/y8/x9/x9/w9/v9/u9.t9.s7-q6-p5,n4+m4*k3(i3(k5*r;1|C;LESMVOXPZOy[Ml\J^\FRZAHV;BQ6?M3?L3?J2>H2=E1:A08?07=05;15:15908;.>C/JT5Xk?hKrTvYrWkRcL^G]F^G`IaJ_J\HZ~GhaQhaRibRibRjcSjcSjbRibRibRibRjbSjbSkbSkbSkbSlcSlcTlcTlcTkbTkaTmbWqg^zsk~vpkYXVCII5BB0B?/C=0F<1K<2U=4g?8D?IHOOOPKJFDCABABCCDCDDDDCDBE@E>E=E=D3=/=.=.<.;.:-:,:,:,:,:-~:.~:/}:/}:0|:0{91y90x80w8/v8.u8.t9.t9.s9.r8-q7-p6-n4,l4+k3*h3(g2'i4)p:/|B:LFSMWPYOwYLiWH[UDOQ?EM:>H58C17@.7A/9B0;D2;E3:D28A15>03;039137069.<@.FP3Ug=fJqTsWnTeM^G\E\F^H`J`J^I[~HY|HhbRhbRibRibRjcSjcSibRibRibRibRjbSjbSkbSkbSlcTlcTlcTlcTkbSjaSkbVph^{unǾ}ur]X[DEL6=C0;>.;;/<90A92P=7kFCUSdchg`^SQHGBCABACBCBCCCCAC@D>D=D-CL1Rd=dLoUpViP`IZ|DZ|D[~F^I_J_J]IZ|HXyHhbRhbRibRicSicSicSicSibRibRibSjbSjbSkbSlcTlcTlcTlcTlcTkbSjbTleZvqj¾~vz^Z`FHN7?B0<;/;91>;5MD@iVSomӑۇro\[LLDEABAAAAAAAAB@B>C=CdOnXlUdM[~EWxBXxCZ{F]}H^J_J\}IYxHVuGhcShcShcShcSicSicShcShcShcSicSicSjcSkcTlcTlcTmdUmdTlcTlcSkcVni`~|wٿw}^Z_DHJ4A?0A>4JF@^XU~tr˳鸲砛}dbQPGECAA?@?@?@?A>B=B3<0/4/5B16D36D34@12:/05+13)59*?H1QbAdTl[gT^JWyCTt@UtAXwD[zG^}I_~J\{IWtGSoFhcShcShcShcShcShcShcShcShcShcSicSjcSkcTlcTmdUmdUmdTlcSlcSkdWokdݽyprVUU>IH7LJ?]ZSzuqú魩ލrl]VNGE?@=?28;.3:-3:-3:.49.49048138028/08-/9,0;-2?/5A16C36A25=/27+14(59)?G2QaDc|Wi\aRW{GSt@Qp>Sp?UsBYvE\{H^}J[xITnFOhCgdSgdSgdSgdSgdSgdSgdSgdSgdShdSicSjcSkcTlcUmdUmdUmdTldSkcUkeZpnhҶhbbLSUDZ\PuulޢЃwg\RIE>@;?;@5=3=2=1<0~;/~:/}:/|9/|9/{90{90z91y92w91t91o90l9/j8/i8.h7-g7-f7-f7-f7-g7.i7/i7/i7/h6.f6-e7-f9/h>4hD:bE=UC;G>7>;279.48-28,38,38,48,38-28.18.18-08,/8+/9,1;-3=/6@17A27?05;-37*6;+?H5O_E_vVbXYyMPrCNn>Nl=Om>Ro@VtD[yH]{JXtHPhCI_?gdTgdTgdTgdTgdTgdTgdTgdTgdThdTidTjdTkcUldVmdVmdUleTleUlfYplcyxv»tmnX`eSlreݯΏqfXOIAB:@9A:B;D4>4=3<2;1~:0}:/|9/{9/z9/y80x80w80u8/q8/m8/j8/i8/h7/g7.f7-f7-f7.g7.h7.i7/j70j80i90h;1i@4lG;nMAjPD]KAHA9:9247/36-27-27,37+37+27+27+07,07,07,/7+/7+/7,/7,19.3<05>16?15=/4;-7>/?I7LZCWkOXqPPmGKh?Kh=Li5=3;2}:1|:1z90x9/w8/v8/u8/t7/r7.o7.l7/j70i70h7/g6/f6.f6.g7/g7/h80j80j91j;0i=1iB4mK13=07A2=H7ES>L]DMaEI_?G_6{=5z<4x;2w;2u:1t:0s90q90p8/n7.m7.l70k70j70i60h6/g6/g7/g80h91i:2i;2i=3i?2hB2hH6mTAucPujXidSTUF=B607-/5,07-17-17,16,16+05,/4,/4-/3-/3-/3-.3-.3-.2,.3,.4-/7//:00<11=14@29E4>K7AP:BR9AS8CV8F\;I`7G6heVheVheVheVheVheVheVheVheVheVheVieWjdYldYmeXleVkhUmm]xyqƭĽݻΚzj_PN?E8A6@6>7=8=9>9~?9y?8v?7u>6t=5t=4s=3r=3p<2n;1m:1l90l80m71m71l61k60i70h70g80f91f;2f=3f@5fC5fE5dH5eM8kZDsiTpmYacPLQB9@4/6,/5,07-17-17-16,05,04,/4,.3-.3-.3-.3-.3--2,-1,-1,-3,,5-,6.-8/.:/1=04@07C19E2:G2;I2>N5BU8EZ;H]=NcBUjIZoOXlOM_H=M<3A4heVheVheVheVheVheVheVheVheVheVheVieWjdYldZmeYlfVkiVmn^x|sκŶŻǻѦĆujYVFI7v@8r@8r?7r?6r?6r?6q?6o>5n=4l<3k;3l:2n82o72m72k71i81g90e:1c;1a=2`@3aE6aI7aL8aN8bS;h^FnkThkUW]ICK;6=107-06,17-17-17-17-06,/5,/4,.3-.3-.3-.3--2,-1+,1+,1+,2++3,+4-+5-,7-.9-0;.2=.4?/6A/7D1:H2=M5AQ7EV:L^AUfJYjPVgOJYG;H:1=2heVheVheVheVheVheVheVifWifWieVieVjeXkdZld[meYlgWjiVkn]tzpڷΘyfaOPBF:?5=3<2{=3t?4p?5p>5q>6q>7r?7q@8p?7n?6m>5l<5m;4n:4n93l93j:2g;2d<2b>2^>1Z>0XB2XH5ZM8\Q9^T:`Y>ebGhjQ`fOLUAR`IVeOS`NGTE9D90:1heVheVheVheVheVheVifWifWifWifWjeWkdXldZmd[mfZkhWjjVin\pxnŴԨƌxucbQSDI:B3z?0r>/n=0n<2o<4o=5p>6p?7o?7n?7m>6l=5l=5l<5k<4i=4f>3c?3aB5`D6[D4TB1OC0NH2PM4TQ7YW;_^AdeIdhNX_GEN98A04;/3903904:04:04:04:/39/28/27/16016005/05//4.-2,,1+,1++1++1+*1+*2+*2++3,-4,/6.2:15=38A59C48D39E1;H3BP:KYCP]JMZJDOB8B80:1gdUgeUheVheVhfVifWifWifWifWifWjeWkdXldZme[lfZkhXikWho\nym¯Ъ~yfeSWDN;wH6rD5qA5o?5n>5m>4m?5l@5k?5j?5i?4h?4g?5e@5cA5`B5^E5^I8^N;ZM:PI4HF/EF.FI.KN1UV9``CefJadJTYBBJ57?/5<05;26;26<26<26<26<26<25;25:359349349338216005/.3--2,-2,,1+*1**0**0++1+,2,.3.0604:37?69C79E58E28F0kD6gA3fA3fB3eB3eC3cC4aD6_E7\F6ZG6YJ7ZO;\V@XU>MN6DH/@F+@G+FK.RU7``CeeJ`aHSU?DH5;@08=28=48=47=37=47>38>38>48=58=68<67<67<66;55:438327116004/.3.,2,+1++0++0+,0,,1-.2/0614;47A59E58G37F09H1=L6@O;AN>59>49>48>48?49?59?69?79?89>89>88=78=77<66;55:4493272060.4/-2-,1-,1-,1.,1..4/0904@17F38I38I28I2:K4OM9HH6CD5?B5=@578=76<64;5292170050/40.40.5/09.2?/6F19L3:O5:M4:L4;L5[[@[Z@ZW?WT=RP:NL7IH6EE6BB5?@565<44:33932:22<05B0:K1=R3?V6?U7O98G54B1]gP^gP_hRbiTejVgjWihXjgXkgXlfXlfYlfYkfZjfZigZhiYgl\lufx|ʸó·pmeI[S7UN1UM1UN2TO3SN4QN4PN5NO6LO6JO5IO4HP2IQ1KS1OW4U]:Za>\aA\_AZ[@XW>XU=VT55=44>36B19I1?S3C[6D]8BY9>S9P9AT;CV=@R;:J65D2 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/MatteFloodfill.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/MatteFloodfill.miff new file mode 100644 index 0000000..d8fbc2d --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/MatteFloodfill.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=True +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nndun10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:darnmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Uj|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLSozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮ʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdme~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxv|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzzydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iipg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S||CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQljeKO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT6/C:0H?2JA2LB2UB2mB3C4D4C=C@C@@@?@?;?/@-?,?,?,>+=+=,=-?.?3B3B4B5R:3:5173/72/62.11.10-1/-2/-5/.I21xIGxbnxbnlbncl|]^|RSlYZaYZSYWS0/-0/-1/-20-60-80,80,80-7/,5-+4-+4-+4-+3-*3-*3.*3.+30,52-74-<6/?8/F;/H?2KA2NA2_A2yA4C4C5C=C@A@@>?;?/?-?,?,>,=,=,=-=-?/@3C6D6B6R?5:5173/62.32.01.00.00-00.30.620gA8lbblbnkbocp|`l|]^n]^a_eSYZS..-/.-/.-0.-1.,2-+2,+2,+2,+2,+2,+2,+2-+1-+2-+3-+3.+3/,41,73-:4/>5/A8/E;1H>2K>2U=2m>3@4A3A9C=A=@;?3?-?-?,>,=,=,=,=-=.?2B6E9E:E9SD8<7394/62.21.01.00.00-0/.1/.40.P75lb\lllpkpipipr_eg_eSYdS.....-/.-/.,0.,1-+0++.++.++.++.++/++/,+/-+0-+0-+2-+3.+40,62-:3.<4.>4/A6/B9/F9/K9/_;0y<0>1@3A9A9@3?0?/?->,=,=,<,<,<-=/@4E:G@QNWN\WGC@595163.11.01-00.00.0/.0-.2//E21gcRlpv~q~v~`po_eSYdQ./.././/-/.-0.,1-+0++.++.++.++.++.++/++/,,/-,0-,0-+2.,40,71-;3-<3.=3/>4/A5/C6/F7/Q7/h9/:0<1@4A5@3?1?/>-=-=,<,<,<,<.?2E:G@UOg_gr{_S^N4/>4/?5/A5/B6/F6/R7/i7/;0?3A5A5?2?/>/=-<-;,<,<-?4G:G@SIg_qr{vegSeM==321+0,+/,+/++0+,0+,0+.:/1efRkc~o~v~{~{vtop_eQ23233254174193092.80.30.3./1.//+./+.1-.1..00.10.40.61-;3/?50A50@50>50>50?50A50A6/F6/R7/j:0=1?3@4@4?3?2>/<.<-;-;.>4G>K@QEUOfXpqrwnefeSZM==32,+2,+0++0++0++2--G@1eqRn\{j~t{~{}tolYdJ671781882994=:5@:5@95=74<70:5091091/61.62.63.64.94/;7/A80C;0D:0B:0@90?80?70@60C60O6/i9/:0;1?3?3?4>4>2>23?3?4@4>2>2;/:.;.>4E>PGUIUISKNOFVFVM_YgYhEhEhEhAba=3H=/R@/WN:h^Rn\{d~o~t{~{}tsnd{_681782994>=8B?8EA:GB9HC8HA7H?5F=4D;1A90<70<70<70>80B<0H=0I=0I=0H<1C;1B:1C:1G;1;0;0;0;0=1>2>2>2>2>2;28/8.9.<6C@PGSHSHEHAHAHBKDTD\DhDkGnJoJnGkGbTT]\v\duttn671781892==6D@9FA:HC:JE:MH:ME9I@8F=4E;3A91>91>90>9/A=/C>0I?0I?1E=1D<1E<1G=1=0=/=/;0;1=1=2>2>2>2;28.7+6+7+9,?;CACCBCAC@C?EAHDKDVD_EhJnJqMqRpSgYf_f̓pӠƵ671671881<;3B?6GC7JE9MH;TI;WKJ[Uj[ToH@OE=4@94?93@<1A=0C?0H?1I@1H@1F=1K=1=0A@@>?>>@AEDIDKDXEbJnKqRqUqWnZn`n:81881:81=92?=5GC6MF7SI:WKJ]Woŀ|f\LIXA=CB?9B@9H@9IA9KA9PA>a?<>5=0=/<-;,;-:/:0:1:1:19/8,2+2+2)5)6*9,>3?6?6>3>3>3A=EHFJFVJaNnRqTtWtXp]onp䪤D@5?92=91?<2E=5GA5MF7TJ9XUWޣ襤|feRIXRAMRACRACC?E?@<>;>7=/<-;-;/9/9/809/8,8+6+4+2+2+4+5+7->2>3>3>3>2=.>2D>FIHSNaQnUqVqXrZq`ptpOI:KB5F@4F=5F@5LD5SG7VJ9XQT䣤襤씐؈z\JPCNANEFFFEA?23>5>5>2<-<.@2FFJJP`VmZoap`pbpdoopWM>TJ;PI:MG9MG7RG7TG8WK>;>9=1;/:.9/8/7/6/7/7/7+8+7.5/5.5,5,7/:/=/=3>5=1<-<-<.@2H>QVZmbofpbpgqnntnݗ}[M>YL?;>:>8=2;/9+9.7.4.4.4.4.5+6050505250507383;3;3<5[L;?:?:?9;1:+9+6+4.4.3/11.24266555272726284849/8.:/:.:-:.:/:/;1H>bjmqnqkqnqngzdgmpĪǚǚǦ˾[L<[L<[L;[K;ZK>?;>8>7>6>5;0:.9.7.4.2/./-3-6.788868482828294948/8.9/8.9/90908.90<3agmrmrdqbldanaa~gmpqtùſ[L:[L:[L:[L:\L;]L;]L<^M<^N=_PHd]ppwwvq|MU@G@F>@>=@7>5;5;5;3:.9.8.7.4.1/-2-3,6.83:8:868585;6;6;6848/8/8/8181814070:2\Wq{q{k{YdYab^~\|`|fkmoqy\L:\L:\L:]L:]L:^M;^N<^N<^O>aSYm`qqwwwu|MUBG@A>=<9<7<3;3;3;39.7.7.7/4/1015.9.<7B9C:C9?::::C@<9<6;3:1>3>39.7.606140252<9C;C;C;H>J?JCGCGC@B:;6:68585736141202.2052H3<1=2>3<.7.71917075:7>C>C>C?C?C?C?F:9:9;6:48585856460402/2.2/42<_R?`SB`[affoptx}}ȠDzv|jdYUMJGAB:B5<2<1<1:.7.8/9090:3=6CC?B>B?B>B7?7?7?:::6:585857565605/3-3-4/52;<@dFdBdAXhBGdPGdyDhLnUoUnTnTnThLcIbEYL<[M=_O>_P?`RB`Yae_ljtwz|ΘΞȢy}jd[ZWRWQOAB:<2<1;-;,8,8,9-9/:0=5@B?A:???7>5:5:5:698675757564636-6-5+5*5.82;B>cAd@ck@>\B<\P<^y>gKmQmNlMlMiLfIcGbEJD8THgKlNkLhLhKfJfHcGbE974DB6LE\VX`]gfst{|ʄщҌэ͋ƒ|ge|]R~\R\QZQWQB=<-;+;+:+:+9+:+:+:-:+:0:3848:6;3:1:5:588675757575747*8)8)9):*<5=\@]@\@GR@4QB4RZ9_>eIiKhIgIhKfIfHfIfG970<=0AB5LL=XSN\]mgeytʄшшΈǃyg}p_Rp\N|ZNZNYORC<-;+8*8):*:+:+:+:+:-:+:/:084886;3;1:5:788886787775748*9)9(:'<)=MBXBX@Xk@=K@3QO4^c<`AgFgGgGhHiKgJgJgJgJ970<=0AC5OM=VQB[Yiecpjy{͂́z~on_Rn^Np\KZKYHRC;/9+9+8*9):):+:+:+:-:-:-:/:2:5:7:88:7:8:88888888888884:*:):(;(=*BOIRIRCOkC=^N;^Y<^c<`>jGjGjGjIkKjKkKkMmM@>2@>4LM=VO?ZVH`[Mg^imc|wlzzysna]l_Rl_Ol^Ln\IZIRE=<8,8*8+8*8):*:+;+:+:-9/9/:4848697:6989887868788888888:6:*:):(;)=DKOPRPRMO`OBOO;JT;JT9]~=gFgGgGjJlMkMlMmOpPUM>VM>VO?XTCbYKe^Mh_PibTjcgmckib[h_RfZH`ZGf\Hj\IlZGRGJ=:.8+8*8*9*9)9):+;+:+:/:495:79594:4;4<5;7:6969787888898;,;*;(;);*IGSNTOUOvYMSY@KM;IM;=C1KT;`~=fFhIkKoOmOoOoPpPcZKd[Ke[Ke[Ke_Lh_Pi_PjaTjaTkaRiaNfZI]YG[VF[VFhYGnXGKFD;:.9+9*9*:+:*:+;,;/;3=5<9;8;8:4:2;-;-;-;2:5:596969697;3;,;*;(;);*OGTNYNYNv\O^]BKQ;FM4;B0[M@KFJFJ@=0:.:+:+:,;,<-9>9=9<8;2;1;-;,;,;-:0:3:593:3:.:,:+:*:);*A3RGTMYMZMf\KS]@GQ5:=09>/:@0;B0gJoMpPpPpPoNgLbLi`Qi`Qi`Qi`QjaRjaRkaRkbSkbRkbPiaPfaK_ZFSP>SKrJ@JCJCCC@9=0<0=1>2?3@3@:A=@<>;=5<3;1;1;.;-;,:.:/:/:0:0:.9,9,8+{8*}:*;,H;RITMYM[MZ\FMX=AM39<08E@E@CCB?A;A;@<@A<>4=2<0;/;.:-:,:.:/:/:/9/9.9,{8,y8+v8*w9*{=1O@SLUMYM`YIUY@GS:=E2:>08=/8=/:@2_yApNqPrPjNbJaJaIi`QiaRiaRjbRjbSkbSkbSkbTlbTlbTlbTlbTlaRhaQfYDfK@rE@}E@E@C@B?C>C>CACDDDCCCCCAB>B08=/8=/:>0Vd>nNpPpPeLaI_I_IibRibRibRjbSjbSkbSkbSlbSlbTlcTlcTmbTpcU}{j{jaPMC}J@rH@C@CBECEEDDDDDDCDBBB?B>A<@4=1yQHyTJUS@MQ;;E29C19@07>07<.8=/9>1LW5_I`MaM`J_I\H\HhbRhbRibRibRjbSjbSkcSlcSlcTlcTlcTpddѴ{jrMC^J<^HBHCHEHFEEDEDDCBB?B>B=ANQ>7@35<05<06:06>04=05;.8=09A2DM5To>Z~C_I_IZ~GZ|GX|GhcShcShcSicSicSjcSkcSlcTlcTldTmfdٸr{j^OF^JEpOF{jٗޙqqFDDBB?B>B.3?/;C2DU:Ig.6@2@J5DV:Lh=Qj@Qi@QhBQ]EheVheVheVheVieVieWjeVkeVlgZnlhѣH@E;B9?6=3}<3u=2r<2q:2o92m92j92h81g80f90e<0e>1fF4fJ5_I5Q=339/28-27-17-07-/6-/3,.3-.3,-3,-4,/5-2?/7C4>J8DV;G]=G]4l>4j>3h=2g=2e=2d>1^E1_F2`J5_M9]J5FF57>429/28.28.17-06-/3-.3-.3--3,,3,-4-/6.3>.7C3=J5BP9>L89J54D1heVheVheVheVieWjfXjfXkgZlk\nwpԼu]H=B;qA7oA5j?4i?4hA4cA4_D4^F4YF3YJ2]M5]S9\T47=47=47<47;56;5271.4--4-,4--4-/6.3>.6C29J4>M8=L89J34B1geUgfVhfWifWifWkfXkfYkgZll\nwp͠u]sK;mK7iK4cK4XK4VN4VN5PN4MN5MO2VS9WV=WV=VT69=67;506206/5=/6@26D4:J5>M8;L89J34B1dgSggUhgWigWjfXkfYkgYkgYkl[|ygKjO4eO3VN3SN4SO4PO5LO5LO5LO5VV=WV=WV=VT0RA2yA2B7BA???4?-?,>,=,?1D8sB8>6252/11.2/.E32tQZtgXSwfgkgja-..0.,1-*0,+0,+0,+1,+1.,2/+51-<5/B7/I<2a=1>2B:A;@2>-=,<,=/C7VKt\OB@833-/0-00.81/]OTxxfleqoepb/0/00.1.,/,+-+,-*,.++/-,1-+5/,;3/>3/A40J50j7.>3A5@1=-<,<-A5RG{i{qSaM9<30,+/,,1..QSHnh560872<73:527216//40-42.83.@7/C90@60D51Q52`7/<3?6?4=1=1D9N?^Pyju}fiZNQ86?//;2.VYDueu|xf|`883=<7D@:FA9G?8D;4?81;60@90I>1J<1D:1_<7=9=2>3@3>5;7;6E=WGTMINOXUbRgH`EPnMFmto550:93DA8NJ?^Z`a\mOIP@<;A<3H@3H?7N=6>4?9AFBVEiLtTnmq̸կ=:2;80C>4TKCvuԆdbPKW\GHwPZIK?2<,:/91:08/1,3)9+B9@6>2E?JOPfTsZpkqٶOG:IA5G@5RI?sq桥푏ϒiKVIPDE>6<08/7.7*8-5.3/6-@7C<>1@2H@Z_aphsroYM>VJ;TH:WL?hbp̜xUiBG@>?:>4;,7-3.1/236/609/;2>7?37<59->3:380SNry^ncYdtw]L:]M:^M;_QEfZ]rjltHK>:?4>4=2;1674:4>?KAFC@D?@:9395412/KEkuQgZMsYzd|ejz]N=_P?aSGg`mrq˜aZIFC;E9<39173BBJPCI@GLQB@<787643.2/DAZjH\qTBhPpVsWpThRPG:[PCf^ekjxzԱǚgb`\VOB6=1:19->5GFBA6>4@3784756/5*5-BDIaAKWO8avGhKjMdI_|E:91JF@][plkЋЌ{n|\R^XZS@19*:-;-:-;1953;1<3887767/9(;-CM@Vg@0:.9197>?>=878889:0;)A6KROH^`ApVezOcEiJkMmNYQCZSD`YJkc`nfkd^]]WLeYHSG@68,9*:*:*=2;797:2=1;596;7;7;.:)F;WP{gLZhDLU3=0>2>1@8>9<4<.;,:/;2<2:/9+;,I=XNobIKV;?D2BK4dGrQoRgNiaQjaRkbTkbTlbSlbThcU`XGK?KFFAC>DADBC?@7=1;/;.:.9.9-~8,u6+w<1NDYL]_CGT7;B0?G2a{FoRfMaJibRibRjbSkcSldU~xo|p]`H@8=0;-:.|:0w9/s8.p7-k4+p;2xND[O@@G69C16?09@0YoDeN^H\IhdShdSicTldUpj]廼qr_⛖_YE?A9>3;/{9/w90n8/j7.i7.h9/eA7QB8:<038.19.3=/7?0NbBUtEVtDUqFheVheVieVkeX{{qŶ⻴vkMB@7y=4t;2p:1k81f90d>2fL:\SC:=217-05-.4-.5-1;/25:1391160.4.-4-19/9E4CR<@M=dfThgWjfXkhZ}{ʺt`J\J4VL6PQ7MR5VX66<52822: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:kF=gG@bGB]GCYGDTGEMGFIGHHGIJHKMIMOINPINQKOTMQXPS\UXb\_e_ac`b`aa]_\]_X_aXacX_aV[]RY[P4-,5.,6.,7/-9/-:0-<0->1-A2.C3.F3.I5/M6/R70V80Z:1^;1d=2j?3qA4wB4}D5E6F7F8F8F8F9F:G;F;F:F:F9F8F8~F8zF8vG9sG9pF9lF9iG:eH=aJ@^LB[MCVOFPQJLRNLRPLQPNRQPSSRTTTVWUVXXX[[Y\]Y]\Y[YZ[VZYTXTUZQZ_R]bS]bRZ_OY^N2-+3-+4-+5-,7-,8.-9.-:/-0.A1.D2/H3/L4/P60U70Y81^:2d<3j>4p?5uA5yC6E7G8H9H9J:KL>K=JsM>qL?nL?kL?gL?dM@bPA`PB\OATPAMQCJQEMTIOXLR\PU_TXdZ[f`\fb\da]eb_ebafdaig^gfZc^W_UU]NT\JV^KW`KX`L5.-5.,6.,7.+7.+8.,9.,;.,=/-?/.A0.C1/E1/G2/J3/O40T61Y72_82e:3j;4o=4t?5zA7D9E:H;J=M>O?Q@RARASASB}TCyUDuUDrSDpSDlTFiUGfUGcUHaUH_UG[TGSTEMSDJQ@KRAMVCOYFS^JVbOYfT\jX_n\cr`guejzkl|phxn`nc\hYYfSYeQYeOWbKU_I:1/:0.;0.<0.>0.?0.@0.A0.C1.D1-E1-G2.I2/K2/N30R30V41Y52\62^82c94j:5p;5w=6~>8A9C:E;I=L@OCQEUGYI[I]J{^Jw_Ku_Ls`MoaNlbPhbQebPc`O__NZ^MS]LNYHJRDIPAJQBLTCOXER]HVaKYgN^lRaqUduYgy]j}bi|dfyacu]_oX[jSXeNT`JQ\F?4/@4/B40D30F30G30H3/I30L40O40S51V61X61Y71\71]71^71`71c72f84j96o:7t:7y;8{=8~?9@;A=C?EAGCKFNHQIVM[Q^S`VgYm\o\yq\rs\ot\kr[gpZanX\kUXeQT^LPYGMWFKUDKWEO[IR_LVdNZhQ]mR`qTdvWgzZi|]gz\cvZ_pV[jRXeNT`KR]HE92G92H81J71J70K6/N60Q61T71X72]72`72b81e92j:3o;4u;5z<5|<5~=6<6<6<6=7=9>;@>B@DAECGEHGJJKLMOOSQVX[]^cbjgqlvoyprtqxko{diu^cnX^fSZaOX`M[bP]gS_lV_oW^pW`sWdx[h|^h}_g{]ex[ctY`pW^kT[gQXdNJ<4L<4N<4P<3Q;2R;2T:1W:1Y90\9/^8/a9/g:1n;2s<2z<3<4<3<2=4=5>7>8@:A;AEAGDIHKMNPNQPSRVV[X_Ze^kaodslyt~|̂ˆ~{tzmxyiv{iv}jv~iuitiukultlrjogmel|cjx`gt]fq[L?7O>5Q=4R=4U<3W<3Y;2\;2`;1c;0d;/g;0k;0p;/u;/z;.;.6?8@9A:C=E?FCGEIIKMNPRSTWY^]e`icmfqkyk~mr{獝ޔ֙ΛŜ|x}u|sUGFTDASA3>5?5?4@5@7A9B;C=D?GDKINNQRTWW\]bbhhnjsnzrx~귿ļfUagU`iU^kSZkPVlNRkJLhDCe@;d>7h=4o=4u>4{=2<1;1:1:1:0:0:0:1;0=1<1<0H@HBKGNLQOTSZZ`bdignksqyxv]p|`tawax`w_u^r\oYjTaLTEH@>=7=4>5?7?7@6>3<2;2;3;3;3;1<2=3>4>5@5B6B7E;H?KCNFQIUMXR\X`^cdhkkootv}~}^p`ubyf~ilmlje\uRcJUGMEHEEEBEAB=>9>6>4=3<3<3<3=5=6>7>7?8@8B9D:E=9?;C@DAA;=3;/:.:/:1;2<4=6>7@9B;D>=;=:<8;5;3<1;/;/:/:-:.;/=2>4@6B8C;E>G@JAMCQFTHYL^RcWg[k^pcwl̀uЉՔٝۢۨٮص׾ļ~RVSZT_UcWfYj\o`wcd`z[qVgR`OYKQDG==9896959675748493:2:1<2>2>2>2>2@3A5C7F;I?LCOEQGVJZM]P`RdUhWn^wgÀqƈzŎœǚƢǪʵ̾Ĺɽ̓OQPTQVRYS[R\R_UdVjVlThQaNZKVHQCH>?;9:7:7:594746364657576657595<6?6A7C8D8F9G;H=K@NAQDUGZM`RdUfVjXn\saygms{ŷǻǻƻƼļļüüNINJNLNNNRNUNXOZQ]Q_P\LXGPCI?C<=<;;:<:<:;997:7979796857565668899;:<;<9@9C:G=I?K?M@OBSFWH[K`OcQfTjVoZu`}hmppprw|PIPJOKOLNLNMMNLOKPKRKUJTHQDHA?>9=9<:;9:897;9<;;;;;;::;9::<;=;=<>==>>>J?MAPBTEWG\K_NdQiSmVrZx^|beeefil~oquzTSTRSSQQPOQNQOPONOMPLPKOILDE??>:<8=9=:>==<::78689<B?B?A?@>>A@C@B>BL@NAOAQATCWFZI_LdNiQmTsXwZ|^`^\\x\p]r`uevhxkznzp}sx|`^^[]Y]Y[\Y]V[TZSZOVNTNRMNHGB?><><>;?;?:>:?=?=@>?=>>??>?=?<>;;:;<=BCFEGEE@C;=:?:@;?:>;><><@?BAAACDBDBC@@??BBDCFDEBD?C=E?F@G@I@J?K@M@PBUDYE\F`IcKjNpPvTzUxPzxNp{LfJcJfMfNeMdMdMcMb~Ma|M`yM^vLnsoupyq{s{txvvywzuvomhea^XULLDD=>9=8<6=7>9<9<::9<;>=A?A@ABBCEFEECBCAB?B?D@HCJDG?F;F;H@9=7;6=7>9=8;795:79888:;>?ACCCDBB??:>9C=G@H?F;F:G;J=M>PAQ@R?T?WA\EaGeGjJpLuMzuKpwGf|FbFdHfJfIdHdHdHcGaE_}D^zC]zCbxd}ffhklkh~iykrjie^]UUMOFMDIAB:<5:2:2:2;3<6;7;7:6:6:7;9<;<<<<<;=;@Q@SAS?V@YA]EaGfJhIjH~nH{rJvtInyGe~FcFeGgIhJhJhJgIfHeGeGeGeGy^u`ya{c}ddcb}byas_j[bX[VUQMLEJ@J?I>E;A7<2;1;1:2:3:4;4;4<5<7;8;9=:=9=9>:>:@9C9H;L=O?R@Q>U?ZA`EdHhKkLlJpLtN~xNv|LnLfJeHfHjKjLjKkKjKjKjKjKjJjJv[s~^v`ya|a~`}_{_x_s\kWaSYRUPMKEG>F6=7<6=7>9?9@9@9@:@9B:F;J=M=O=O\A`EdHiKiInKuO|TSuQlOhMkNoQpRmOlNmNmNmNmNmNmNmNsVe{Yj\p`va{`{_x^s[kV`SXQTPNKEH=D8B6?6@7A6?3<0<1=3=3=3>3>4=5<5>7@9A:BN=M;O;T5?7@7@7@8B9B:C;F=I>I=I5>5>4=3>4?5@6A7B8E;E:E9E8F8H9M

S?U?X@Z?y\>ycBxkEyqIzuLtwLhvH]tDZwCaHgNgMdKbHdJfLgLgNhOhPiPiPjQqSCtRBwQB{PA~N@MANCNEMDJAH=G;F9E7B4@2>0<.:-:.:.;.;.:.;/;0;2<3>4>4?4?4@4@4B5C5C6F9H:I:K:L9L8M9O:{R;uVF2?3@2A2B3D5F6G7G7J8L9N9R<U=yX=tY=n[=i\=e]>c`@adB^hC`pG_uH[uEWrBXtC[yE_HbJdLgMfNeMcLdLcLaL`KxXMzWL}UKTJSHRGQFODMALAK@H=F2>3>3>2>1=0=0=1>2>1>1=0?1A1B2C2D3F5H6I7K8}M9wO9qQ9nS:nX=m[?i]?ibChgEekEblE\lBXlASl@UoBXsD\yE]}F_HbJeLdLcKcLcLaK_J_Jo[MoYJrWIwUI}TISIPGOEMDKBI@H@F?E?E>F?G@E?C=@:?8?7>7>6=5=3=3>4>4=3}=2w=1u>1u>1v?1w?1wA2xA2yB2{D4zF6wI7sK8mM8jP9hS;fTb]?`aA^dB_hD\kDWmBVoCVpCXsCXuCYxD\}G_IaJaI`J`J_J]H]H]Izk^wgZucVv`Tw]RwZNvUHxQD}NBLAKAI@F>D=CD?D?C=@:?9?8>7>6>6=5<3;2;1{;1v;0s<1q<1o<1m=2j=1i>1j?2kA4kC5iE6fG6dI7bJ7bL9aP;`U>_Y?\\?[^@Z`AW`@Rb?Qe?Rh@Rj@RkATnCVrEYwF[|H]I]I\I[HZ|GY{GY{GY{Gvvvsymtiodh]`VZQVMQHKAF6>5=4<3;1~:/x:/r:.n:.m:/k:/i;0g;0f<1e>2c?3a?3^@3[A3ZB4ZE6ZH8YK:WN;UQL`=La=Nc?Pf@RjBToDWsEYwGZzIXxHVvGUuEUuFUtFTtEuvmpgd[ULH@A:B;C=D>A;?:?9?7?7?6?5>4=2};0v;0o:/j9/h9/f8.c8.b9.`:/^:/[;/Y<0W<0U=1V@3UB5SD6PE6MF7JH7JJ9KN;IP;FQ;CR:BT9CU9FX:H[8>7>6=5=3~=2w=2o<1j<1f<1c:0`9/^90[90X90U9/R8.O8.O:/N<0K=0I?1G@2D@2DA3FF7EJ:@K8Kc@Ia?H^>G^>G^?G]>F\>ƾ¹ú̽Ʊwshlcmdla^TLDA:>7>6>5=4}>4v=3o=2i<1e<1b;1`<2]<2Z=2W=3T<2O:0L8/K90H90E90C:0?:/<:/>>1>A3;B38C27C38C39D4;H6P8>P9=O84g=3c=2`=2^>3[=3X=3U<2R<2O<2M=3J=3H>3E>3B=3=;1;:09;16;02:/3;04=04>15@26B38D49F5:G6:G5:H53@>3==2;>38>34;108.08.19/2;03<13<13=14?25A36B37D59F69F69G67E56D44B33@31=1.:/ǿǽǿxykiY~VFvI9qB5mB6gC8aD8^E8[E7WC5UB5SC5RD6OC5MD6JE6HE7FD6BB5?A4<@3:@46>31:/08.08.08.09/1:/1;02;01<02=14?25A35A35A36B46B46B45A43?30<1.8.ƾǼ½|{g|gRpUAgI6aD3\D3ZF5YG7WG7TG7QG7OG7NG7KG7GF5EF5DG7CH8AG7@G8=E7:C66>34<23;12;01:/0:.0:.1;/1<02VK4SI4TL7RL8OK8LI6LJ7KK7HJ7FI7CI7AH6AH7AH8?H8;E79C6:D69D69C68C57B46A44?22>12>02>02>03?04A25B24B14B14A14A23?11>0Ľʿĸyluu_iiQ_^FVU=NN6MM6LN7JN8IN8IO9HN9EL8BH5CI6CI8AH8>F7;E6:E6:E6:E6:F6:F6:G6:G69F58F48F47E37E35C35C26E26E25D24C14B13A0Ľʿø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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Normalize.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Normalize.miff new file mode 100644 index 0000000..e88344e --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Normalize.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:,+).,*2.+4/*6/)5.)4,)5-*4,)4,)3+(1)%0($1)%1)%-)"-*"0-%30)52+;6+B;/F>0H=.J>.Q=.q@0?/=1A9@C?B9>8<<7;+;)<)='<';*9(9'9%;*;/>/@2B5N6+61/3.-3.+2-*/,(++),+)/()2')L34EC_kyimLDkNH^rtywyiURO+*(,+)1,)3-)4-(4,(2+(4-)4-)4-*3*(0)%0(%2+'2*'/+%/,%0-'2/)31,:4)A9.D;-E:*G<+I@/fA0<*8)C8@C>A8=8<=7;);';(<';':*9(9%7%:):/<0@4D7@3(5115/-2.+2.*--))-*,,*1+*.%(A.-u=1UYz`iF:hG-<4C@SJ8;170-5/*1/*-0+)0*(0,+/+-.,,,*/)'E*iIJhnD9|9-T10D:BBEOEUWK()+')+*))+)$+%")'#(%%(%%*''*''*''+''+)),((,)*+)%.*(.*'.)(/,*4.+80+:0+=1)B5-D:3M81\3,v3)7+=/A5A+<(:)9+9)9'8'8(8*8.?3C6A431'+-%*-'),(),++,*,.*+.*+).0%(d`_{fmUYl]moy~\bM(+.'+.**,)*))'$(%''$'#"#%%'(%'(%'%$$%#$)'(*)*+(',('*%$+'',))4--8/.7.-:,*=.+=3/>62G2.e3+9,:1=/@3C8;/;(9'7)8)7(5$5%|6*|;3C.:.8+9*;+8+5(x7(s6%z7,C7G@MK~mtvYxWJ[C96/."#+"$)#',#(.#+-',,%,'"Xc2=-:)6'7%s:$s4(p5)x<0C:JAaRwnxsybdabLcL09,%!*!'%%$'("'+"")$SYD{gxg{l|lzq{xliHR@34.34.550861<94>64=5193/8316105,,5++2-*2.*2/*20-53/;3.>5,D9-F:0D90>4,<2-;2.850?10=1,82%A1"`2)97>=?7:2|=1{6+v7+r:*w0$LHXRmF5hO8,E9,K=.L<1G80A6-=6-98/C3,AFCE?6GDB5;/?1A-<.:>?As?5v608DACQLmU?]gDiOOW#D$G<7B=;D?:D?:F@8I>3F9,D8)B9+A7,=5-83-63*:5(A8+I;+K=,K:-G7-@6+:9-39,}>6aK`F`[7A>?BK*A(D,P0Y6e6l=oClWuXc^9/D?+|saҮdxbSdH//,11-44/982@?5CC:FE7IE2EA3IDFD<5A7'?5);4,:4/93-:50<95E=2L<)D;)G4-?3019,<;+E<0'0=!62"9.=-<.<04$-''',$2 15(QEQM=G;=7*A7=@:D=M9R:e:nAtFkSuU|Zkkaтr~k-,)+*(0/+45.:;1C@7KG4IG0TSS}yuXPlB;K5002.!1.$65*>9)G<+L<+?7%60$,0,>-)287+8"7 :(9-7-5%6';./%0(4*-'+#105(;2?==::/5#9)A_FqGzIwPq?`x\P쿾64-2/)/,'30(87.E=2RF5PD6a^o㪰썍kjHET<;I855=9#>?*4=56AMAQ^BON^C8B39'=)7#2%4,604.6/7.;3-")#)#.#331#?8RI:.66$<3DBCDBFKYB]FkNwTwQnOd]mGQਢ@<1=9/72)1.#61+B93PC2SB3ZQgݩ}ycYNHp36?653NFJp~ZxGL8"56%7)8/7/2-:5834+@5;0$$''.(. 8#6%3)HD?<55#:.MEA:JEMOP^RkJlQuSlWfSbKPqkKE7IC6B<1;5,92,=94IA1O@*SHO퉋lw^bJ\KSHZDN7::::1:+;.:05+/'3+4+/$/5:,47,1.,101/3':+LFAE9/4'8)?.9)D9JFY^csLjWrou_mx}rbRL=SJ;RI;LE6G>0B8-A<3HC1OC*RJM߹s=J8;73<-B79=58<6A52#.'0-7+3$023!1$1'4*0.)1%,-$1H=DEIG4*6#7"7%8+QOC95$6%8)8*6%RCjg^d_jknaiSmrfTkAXJ:WJ:XJ9TI8WH8SG;TH8WH4QHCa\rtu}xxcjyN_7B/;A:?J>C<1?70->17$5 6 4#0'-/(/)-*4#:#,,"4#7.90@22!1$31*+0%1%F::-2%6'3!D:nop{oxpxRb@^zzdˬŭɨƘԹXH8XH8YH8UE7WG7XH:[I8[L8XJ=UHE[Oajb|Ù{nF835#>474@637#4"0"5*0"($" .2"28@-6,6'*41CC20721%4!4'MC8/5-6/4'4)hh~wo|Ia;Y[dMyY^{MbUveqv|ijXG6XG6UG6UE5XG6ZF8[G8[K7[K7\J6\GD^Stytbt0GC?<7*4!<247IAL=2#0%2,-+-5)8%8)D*SM`Yj4K,13!?2OJ?<5*37 4$B>4//-,,5-0"YSyhyD^:QU^3b}J~a{j|mlmln¾YG3YG2YG2ZH3ZH5ZH7[I9ZL9ZL9^I6`C:dZn|rnGQ;M9C89:07%:+4//'5"I==/6*35.:+)' 37R`mJO612)6,42EA7,4'4'4+F.6'C:>52'2"0*@38*,/@J?C+)(#./:?;?34/*KFKMECQQA=>683.93;:6-%.,*.,*0 D8n~Be8a=CJ_8oWv`r]s\waxaxWesid\K9\K;\K:\K9\K9]L3YH5\X^zy~znsyŘƹǴmNH=DF356.3*E;cT5;)3FRlwcsNJ1/=8A80,(61;2/0%.+*.+)1$8/_t:`=aY7+H\:r[x`lSoTu[vXtR}^}ebyRXI9\L<\N>]N?]N`U^ttty`gwwխ詶vaidSW262/6-K=TE-":8<3, )"/%51OSR_al^d+3#2BO[cPX3/204.4,6177211'2%,)+0,+5*4.tNm8aFX98!=F,e{OqTeHjMpWpPiI_AJg0E^0PD4UH8\N>_R@]O;cZ_xvqwZcislgbgavrdb@=918->.8)CBEB3,2,5'6!926=XdS[3/>E;B35121-/,6+7/2134202)3#-'/1,+0%@>er7a)K\5fHb@dGkQeH[AUz?Sl>Xp@@>2FA8YI:]O:b\TwqpmZ\ffޛݠ՞՜͓mdz[RNyODUMvp}y[W2)17%6,3(5+4+8%<-903/LHG>2+,#6";64*2618131/10,3$5!2!1)1$0"RYLh4b/34MW0avJ\=`@iJeC`E`Fc|E_|@03)660K@7RH9dbiigMMXZvx͇܊Ѕ̅~ыDŽ{WgYXHmS@ORch|~w7)77$2'7'2#6)4#6)6+6,;16*-"+3'9%:6!519627010042+3$4!25!7 90Si3`?gh/9+ +0[U.p]Z:jGmMhDfIbFcDdC%,!','531A?9WYfYZXWvyՂ~ɀщڋ{upSN]\Da\?SLW`kgG<3!8"4'-#:'6#C75'6$3#3#8+7,27-;)7/214372141643427404%6$6"98!GI>d2d?K/204'+@J$vԘnYZ9oJlNcAdIbGcChF*.!'*#,-'69,HKJTRjkiꑎ~|ЁƋ͌~ti^Z[ZCcZEgYAU?NM99,'3!3!1'1$9'8'@54$6#5#0#.$7048+6AFRM=94.4044483815724$9%9%51$L]9\EZG<-)/ F/"bӊyG`5]|9iEaCb?hKfKcAmL<:,:9089.=A%HI6QP=b`d~|wtp|wvl|k\SiUCeYGg[J|\KG81*,'0%495(7$3!91E>5"6$5)80736442DEWT?9635.40244:2937;37'7"7#2E@QeITZK/5BK$r\fgEP88D(d{?gB^AhGiLlMjIsRQI:RI;RJ;RL9YN?]S>_UGj`htgymajZSXSQNZRCcWBk\DgaKWKNC6(0'3+3*2%5$6(8'15)80D6>5:58824749.5%7)812626425.524479<47(7#42"UWPRUN}`G]u7nsUKZ779*./'7?-c|ClFgIjNgCnGuQnS`WGbXGbXGaXHbXId\Fe\Dd[IdZHcYE]WCMJ9HD3OL:XWB\\K^UFH0,9$6%5'4%3%6'9+1;$3%5+05282718204!5!6$:05423418/:5::<74'6#6#~3{6%NFPEYOkZpO`>".14-32+55,5?,dGtMmOmKlEuQtU]Fe\Lf]Mf]Mf]Me\Lh_Pg_Of]Lf_Hf_De_G]WBHF2OJRSl\csECR0[hMGM16744+4>+fHtLmJoLz]cJ_F_If]Mf]Me\Li`Ph_Oj_Si_QiaKiaLi_Rj_Qj`Pe^MRL=<99,=.8-~6/|7.{7-w7+w7'x6'4(4(4#6%}8(|4'x/#v2(m0$s9-M?KJHH?><5A7@A:=85+}9+}8/4.7+~7*|6)y6*y6+x5-x4+y5*w6*u5+r4*o2'l0%i."s<2PHMIQIvbKWkFQj@I\65?#45(79/07,45$Ra:qPuYoYW?\EbHY}Ce^Mf_NgaOf_Nf_Ng_Oh_Oh_Oi`Pi`Pj^PcWLpmfzxg3:'/8#89+;7*[>1DA=A:8@=@@@@B@B;B9@:909({:+5*6'~6'|6({6+{6,x5,v4+t5+s5,q6*n2)k/'h0$b- p9.NJUN|\N\YDAO7.;$7A,>F25=,07*05134(HS/oOx[]EW{?^E^GTyCe_Nf_Nh`Of_Nf_Ng_Oh_Oi`Pi`Ph_NbZO~yԞy?F.1;'63.%,'W;:||TQ56<@>@=>?;A7>6>47(|9(~8'~6'z5)z5+z6,y6-t6/p4+m2(l4)k3'k2+h0(d/%]*m4+QMwYKJK:1<-+1(//,*/'0:-7G4,:*).+10'=I+pUkPPr;WyA\~H\EStDe`Oe`Oe`Oe`Oe`Og`Oi`PjaQjaQi_Migb˛|GK-92$KDBnn96<8<<:;>9<8?87-~9+{8(|6*x5+y5,x8/w80m7-h4)f3)e4)e4*h3,f2)^,"U'j90sPJCYvC_HMgAdaOdaNdaNdaNcaNf`Ni`QjaQjaOg^MaaaڿokS=F8ݰK=4,=8>9A<;78/~9/{8-{6*y5+y5,w5.s4,g4+e4+c3(b3)b3(f2,f3,c2*e7.kH>44/-0(/3)12'/3$+5',5%*4%+4(4=.7?.,-@I6lgCg9Hh8Hf7SrB_~J?R7ebRebSebSebSebSfbRhaWkbSecMkieضmpSlxg׺g[4'<2D5A2>3};27.z5.u4+r3*p3*l1'g3,e3,c1+d2+f3,i3-i8+dB0n\khX$.#-3*,3)-2%,1(+/)+/)+0**-(*1*.;0/Q4Id8n<2n;1l;0g8.e6-n2.j1-g3+d5-d:0cB5`F1\I1||fMUB%-#,3(-3),2(+/().)*/)).((,'(/($0))4).:).:%2?*@R7DZ9[nNWiO(4*ebRebRebRfcSfcSgbRi`YkdWefMirmӻhO;*2%|4(l=/o93p;5p=7l;4k92n50i6/a9.[:.L7'QL5ZT9ZZ;ksY.<'.3+.4*/5+.4)+1(*/)*/)(-'%+$',''/'%0()1(3<15?0/:(:F0YePMZK'0)daQebRfcSfcSfcSgbRk`YieWciOetlªrZvD-b2b/$g5,i;0f:0e:.`=3\@1UC1bZCAB+5?"AE'mmNY]C.5"39139/3:04:/481372271.3-*/)(-'#*#%*%(-(+.+9@99F4-;#>L8AL@+5,aaOdaQedSfbSecShbRkaYieWahNatlѴžмeO7T@(ZG.YH0RK6MJ3IK4[dG18;14=14?15=35=26>37?48A87A65<11922@+C]1C_86I4- \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/OilPaint.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/OilPaint.miff new file mode 100644 index 0000000..14a311a --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/OilPaint.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/,1.+81,80,6/,91.81-81.7.,7.,1,)3-,3-,3-,3-,3-,3-,52-:3,:3,:3,LA2K@/EE5EE5EE5MD3UA2tD4C3A5<@<@<@<@?->->-?,>,>.>.>->->->-H;H;H;93.93.93.-4.,40/3/12000.3-+3-+3-+3-+}}}uw|uw|ISIYWSYWSYWS.--/-)/-)/-)6/,91.81-81.7.,7.,/--0,,0-./-*2.,2.+2-,2-,82/<4/<4/<4/K@/EE5Q<5Q<5_70UA2tD4C3A5<@<@<@<@?->->-=->,>,>.>->->->-H;H;H;75+75+75+-4.,40/3/02./0./-24*,4*,4*,}}}uw|uw|ISIYWSYWSYWS..0-.--.--.--.--.-**+,*+7.,*))/--0,,.-./,+0,+0,+0,+0--811<32;21>0.>0.A2/Q<5Q<5K62Q<5y7-E@E@HAHA<@D7;-;-;-;->,>,>,>-G@>-URH;H;UR75+75+75+-4.,400,*0-+0/+2*12*12*12*12*1}}uw|uw|ISIYWSYWSYWS//-//-//-//-2-*3/,,+,*)-+(,-',+(),*)--+/-,/-,/-,4,)4,)6/*;3.;1-;1->/.>3,>3,K62K62Q<5y7-E@E@HAHAB2,>,G;G;G;?7C7G:G:;4175+75+75+-4.2,+0,*0-+1+00*00*00*00*00*0xA5Y\~YdJYdJYWS//-//-//-//-2-*3.,,+,*)-/(/1)./*,/*,/*,10*/00/00/00/00/00;1+;1+;0/<1/<1/<1/F*.F*.E1-K62F*.;-?5?5B26>6y:4y:4y:4UIUIUIpJ9pJ9`jH.E.E.E.E>H_m>hJnJn3)"3)"3)"'+/'+/)$")$"n\kh}t}t}t}tLVDLVD883892892892>?5B@;GD;GD;J=0E;+E;+E;+E;+E;+:9.:9.:9.:9.P@/H?-H?-H?-C;*5=05=05=07=0E5'E5'E5'=2:$9*9*@2vC9y:4y:4y:4y:4UIUIUI9,A>FO.E.E.E.EBbBbBbBbBbR.(:&*:&*:&*:&*n\n\n\n\NXCNXC:81:81:81892IA6IA6GD;GD;J=0E;+E;+E;+E;+E;+<99:9.:9.8A98A98A9:EQ:EQC;*5=05=05=07=0<'4+=2=2:$9*9*:3:(-(-(-(5!UIUIUIUIA>@7.E.E.E.EBbBbBbBbBbRzYYYn\n\g{eg{eS_GS_G30+52(;6-;6-GD;GD;GD;GD;IE7IE7E;+E;+E;+>83<997:C7:C8A98A98A9K@/8A9@?/@?/5=0:*:*:*4+=2=29*D9D9:3++++++++++UIUIC@7-A>>2>2E>E>E>BbBbBbBbBbRzWeYYWgLWgL30+52(52(:5/=60SD.SD.TG6TG6MK4F?O?80>83>83<997:C7:C8A98A98A9:EQC;*C;*5=0:*:*:*:*7/7/7/7/D9D9D9++++++++++:*:*7-7-EI>2>2E>E>E>BbBbBbBbZuZuWeUxWounun30+52(52(F<152(WF7WF7WF7WF7WF7]Uj52)52)8A98A98A9:EQ:EQaG2E>E>E>BbBbBbgqZuZugqgqtrYM?YM?:5/:5/NGE>E>VGQSQSmjmjmjWpWprxWp[N=[N=ZLE>?F?F?F?F?F4141419%9%7/7/7/7/D9D90'++++8(8(1)1)53./././././=-=-E>:*:*mjmjmjVeWpgqtrWp\L<\L[L>[L>[L>YLI[NA[NA[NA@9E>BJBJ?F?F?F?F4141419%9%7/7/7/3/3/60'9%8(8(-5-5-5GG./././././8+8+8+:*:*qrmjmjVeMdMdMdMd[K:[K:[K:]J<^K<^K<^K<^K<^K<^O;_KH_KHq@9E>BJBJ?F?F?F?F=1417$7$7$603/3/3/-<-<0'9%8(8(8OSNSNSN././././9)9)9):*4':*qrqrqrqrDaMdMdMd\K6]L7]L9]L;]L;]L;]L;]L;]P=]P=aM:aM:qqq=G=G=G=G=G?F>AB8=19%9%:.60606060!+-<-<69%:58O8OSNSNSN;0;0;0./5*US-0:*:*:*-0||?aDaMdMdMd?\\K6]L7]L9]L;]L;VNAVNAVNA^N9]P=aM:aM:qqqv|v|BJBJBJBJB8B8B89%9%:.9%6060!+!+-<-<6(068O8OSNSNSN<7<7<7./5*20-00.0.0.-0||c>c>c>c\M>\OB\OB\OBlvtzlvۯۯۃlglglglglg6-6-<1<1IF0%0%-'-'60VbSWW^W^KBW^W^737373:5:5:5:5:575757)7)353535350/@h@h@h@h@hO_9oWoWnUy[nUnUhhbDbD_P@_P@_P@_P@`S>`S>`P7cYalvtzlvۯۯۃlglglglglg6:<1<1<1IFIFIFIF60:-:-:-W^W^1'+=+=$:$:$:$:;4;4;46/7575647)35353535=4CjCjCjCj@h^Y2^Y2^Y2pQpQpQpQpQhbDbDYL<`S>`S>`S>`S>`S>`S?lvlv݉ݍd_Cd_Cd_Cd_CSV7&<'<'<'<'IFIFIF>+:):):):):.1'(:1?$:$:$:$:6565656/7575647)35=4=4=46g6g6g6gCj364AB3]=]=pQpQpQpQpQgMgMIa4+.(+.(+.(`S>`S>`S>e_XlvlvDŽǍf]If]If]If]ISVSV<'<'<'5)<+<+<+<+<+:):):):.1'1'1?$:$:$:$:828265886/75357)7)5)5)9&6g6g6g6g364364AB3AB3^Y2lNlNiMgMkOgMgM[sD+.(+.(+.(<=2spspspsp݄DŽǍlYGlYGlYGf]If]Izz<'<'<'5)<+<+<+<+9-9-9-:):.:01'1?$:$:$:$:8278788884786$6$6$6$9&Uh6g6g6g6g39"36478!]=jFjFjFaEaEaEgMgMbD+.(+.(+.(<=2bYKbYKbYKbYK]W[DŽǍlYGlYGlYGf]If]I7/7/4+:,:,5)<+<+<+<+9-:):):)=2<<1'1?1?1?7;:78278;=;=;=786$6$6$6$Uh6g6g6g6g6g-3%-3%O];fGjFjFjFaEaEaEgMgMgG+.(+.(+.(e[Me[MAE*g]Lg]L`ZGDŽDŽDŽfZF__O__O__O__Of]I7/7/4+:+:+:+<+<+<+B99-4(4(6<=2<<5<;4986:82<3<3<3;=;=;=8+@;8+:':'UhUhUhUh'2'2'2'2;=.fGjFjFjFaEaEaE`JlPkJ+.(+.(VP=VP=<=2\RCg]Lg]LhbKhbKhbK`ZF`ZFfZF__O__O__Oh\KZO7/7/:(9)9)9)9)8*8*B9B9;5;56<>;<<868686=7?6?6<3<3;=;=;=8+8+8+};(};(UhUhUhUh'2%'2%=;(=;(8@-7:/8@-7:/mRjMoJjMoIyVbIi`QjaRjaQk_Zk_Zk_ZkaTkaXlaRkbNkbNkbN`ZFkbNjdOjdOZOZOZO7/7/:(9)@:>2@:8*8*B9B9;5;56<<<<<5<>*<'<'?6<3<3<3<3;=7;8+8+;*};(};(SNSNfvIfvIYMYM=;(88/88/88/88/88/hKjMoJjMoIbMbMi`Qi`Qi`Qi`Qk_ZlbUlbUlbVlbVlbVlbVlbV`ZFCJ>EA1EA1EA1=)=)9+:):(9)@:@:@:>29B9;5;5;56<=05<5<>*{:+{:+?6<3<3<3<3<3;=8+8+;*};(};(QMQMQMQM`vF'2%:<279/8@-79/79/79/xQxQxQoIoIbMbMjaRjaRjaRjaRjaRkbRkbRkbRkbRpaUpaUpaUpaUA@%EA1EA1EA1A@%=)8)@9E;E;E;E;E;A>B>B>B>B>B><3<3;.;.;.|:.{91{8/|9.z:.z:.z:.:*x9/8+v@6v@6v@6v@6QMQMQMQM'2%'2%;=34;089)89)89)89)xQxQxQr\oIbMbMhaQhaQhaQjaRkbSkbSkbSkbSmaTlcTlcTlcTpaUA@%EA1EA1EA1A@%?;.9+ONE;E;E;E;E;A>B>B>B>F=~>/~>/~>/:+:+~:/~:0~:0{90{90{90{90v90v90v908+v@6v@6TLYRYRYRYRQM`vFES;2?)49578,78,78,78,xQxQxQr\aKbMbMhbRhbRhbRjbSkbSkbSkbSkbRkbRlcTlcTlcTpaUA@%EA1EA1EA15?+5?+5?+ONONLLE;E;DDABB>B>B>C?=,<+:+:+:+}:0|:1|:1|:1{90{90{90v90v90v90n6/n6/n3+TLUQUQUQYRQM.3+ES;4>10>.0>.0>.0>.78,xQxQxQgJaKaKaKhbRhbRhcSjcSjcSjcSjcSlbQmdUmdUmdUlcTpaU5?+5?+5?+5?+5?+LLLLE;DDDDA>B>B>B>C?=,<+:+:+:+{<3z<4z<4z<4{90{90{90v90i6-k70k70k70i6-o4*UQRNRN686UM.3+.3+4>10>.0>.0>.0>.78,78,nT`I^MaKaKaKgdRgdRfdRicRicRicRicRicRmdSmdSmdSlcT5?+5?+5?+5?+5?+E;E;E;DDDDA>B>B>B>C?=,~<1~<1~<1~<1~:.~:.z<4z<4z<4{90{90i60i70i70i70i70i70k4)RN56+37)/9+09*.8*/8,/8,/8,0>.0>.0>.78,78,Li;nT^MbN\yG\yGgdRgdRfdRicRicRicRhfQhfQhfQhfQhfQddd5?+5?+5?+5?+5?+=6)ABABC?C?C?C??6?6?6;2;2}92}92z<4z<4z<4g6/i70i70i70i70i70i70i70UQ07-16*16*16*16*16*/8,/8,/8,/8,0>.0>.78,nTnTnT^MbN]xT]xTgdRgdRfdRgeUgeUkd[ghPghPghPghPghP=6)=6)=6)=6)ABABB=B=@=;2;2;2}92}92}92z<4m51j7/j7/g91g91g91g91i70i70i70a0'17-06,06,06,06,-2,-2,,3,)4-)4-)4-)4--8-nTnTnTbNbNbNWwHheVifWifWjeVlc\lc\lc\lc\lc\ghPkSkSB=@=@=8,8,sA;sA;sA;sA;m51d=2d=2^>2^>2^>2^>2i70i70_M528.39/28-28-28-28-.3-.3-.3-.3-+3++3+-5,-5,3>,3>,Li;Li;]xTQjEQjEifWifWifWjeVjeVjeVjeVjeVlc\ghPB=B=yH1yH1yH1r=7r=7o?8o?8sA;cA7YG5YG5^>2^>2^>2^>2i70_M5_M529'29'29'28-28-28-.3-.3-.3-.3-*.*,1,,1,,1,3>,1?(1?(Li;^qR/90/90ifWieWhfWkeVkeVkeVkeVkeVdkRlhZyH1r=7r=7r=7o?8o?8VO:VO:YG5YG5YG5YG5^>2^>2_M5_M5_M529'29'29'28-28-.3-.3-.3-.3-.3-,1,+/.+/.)3))3)1?(1?(;K8;K8/90/90ifWieWhfWkeVkeVkeVkeVhgYhgYelYr=7r=7r=7o?8o?8UO2PN4PN4PN4LS0HO5HO5EN._M5UR9UR929'29'29'28-8>49A6:B7.3-.3-.3-,1,+/.+/.)3))3)1?(:M8:M8:M8/90/90\gOieWhfWkeVkeVkeVhgYhgYhgYelYRK-UO2UO2UO2PN4PN4PN4LS0HO5HO5EN.WT58>48>48C59A79A6:B7:B7:B7:B7,1,+/.+/.)3))3):M8:M8:M8:M8:M84B1\gO\gOlfXkeVkf[hgYhgYhgYhgYelYelYRK-UO2UO2PN4PN4PN4PN4LS0HO5HO5EN.WT48A58C59A79A6:B7:B7:B7:B79@5;E:6D/6D/6D/:M8:M8:M8:M84B14B1 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Opaque.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Opaque.miff new file mode 100644 index 0000000000000000000000000000000000000000..e2984f36bb42771ba2e15cd6529513dae5fd974e GIT binary patch literal 10051 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 bFxkAgg@J%ck&gxk?9?3@/@-@,@,?,>,>,>->/@2B4A4@5f<3L82;4063042/31.10.1/-2--:.,R98qNW^w{boc]Y}XXq]`jkolquijk`///10/31/40.4/,4/,3.+5/,5/,4.,4-+3,*3,*3-*3.*2.*30,42,73-:6/?90C<1F<0I=/P>0\A2qB2B3A5B:B@AB?B>=?8?2@.?,?,?,>-=,=,=,>/@4E:E:B6b;1L82;4053032/22.01.01.1/.2,,F75jMR`vl~ikaeyciqhnjlrejm_0//10/20.40-3/,4/,2.,2-,2,,1,+1,+1,+1,*1-+1-*2/,20,40-62-94.<5.?7.A8.D:/L<0S?2a@1t?1?0A5C9C=A+>,=->/>0@3G9RGUKODb@5I8072-52/21.11.01.01.00/1..;72WJEwcjyithrspzsoxjhn]00.10.31-31-4/,40-2.,0,+0++/++/++/++/,,0++0-,0.+2/,3/,3/,50,81-;3.?50A80E:2M92X91g:2o91;1?3B8E-=,=,<,<,>1?3D:REaQj[i\lVJIB874-2/+2/-1/-0/./0./0.//,871KJ?jh\~o~dqoamdepcbjX11.21.32.41-51-51.4/-/+*/,+.++.+,-+,.),/+,/-,0.+1.+0-+1.-4/,91.<3/>40@50C51E51D52P5/b:/r:0=2A3C8B6A2A1=.=-<,:+:+:,<0A6OF^Pl]~ilxwdY_OAE941*0+)0-+/-,.--.-./.,651DF:`iO{p}nevpevk\h\XaQ13023/32.53/53/7207202.-0--0-..,./*-0+,/,+0.,1/,0.,1.-6/-91-=4/?40?4/>3/>20:4.<4-I-+Y0+f7/u:.<.?0@20>0=/;.<-;,}:->1D8NCaR}hu{|wjj[mVDI:3.(/)',+).,+0*-2+-51.>?4U^Ep]{q~p}kpbrbUaP23133/33/6518539539426205213103./4-.3..40-31,20-20.71-<4-?6.C80B80@60>2/>3/G0/G/0@0.C1+S5+j6/|93;5>5A4@1>.<+<*{;*u:+x,-3,)2++4.-<82CD8PYCewSrrukhbs\230340551862:73<84>95<84:75;53;2091.83.84.74/53/73/=5.B9/G;0I=2G;2C71@60B60?94D61X;7^;3e:/e80~<8A=A;A7>3}=1yoG7sQ?SKPLQVohy{upxkWTq>?c59J2080*:0-K?8XXK[cOl~\upfw_34/44/651973<94>:5A>7B>8B=6A:4B94?71?7/<7.950951;6/A:0G=0M?2M?3I;2E91A91=;3X>9EFGK@=D7EA@@;><>AGJUJ_Ku`GSHRMMP?PM[_hdkhols`kQ]HUBM[75E>4`XOrmb{}o|Ȯ{sl550761872:83>:4@=6F@:HC9IB5H@8OGGLEDE=9?85;61:6/=8.C;0I?3MA4N>1H<0E90?;3<;0DDBF6,:(>.=3?3A5?0<->5;<:>==8684NE_N`NYMKBIH:I2H:P>XDdLnVsPlMeLdU^cF=wj_ǯȳ¯982:93<:4=:4?;5B>7HC:NG7KD5PKJ_[e_YdUOYLGND?A>:5?:5C<4I@1N?/L>/F:.>8/4:0V;4<86);%=%<(8&:-?2A2@3I?,IA.B<1=;:9B@CA:B=?/<(>)=*:.<1:.:+=/9.4+6-5-0*2$5!7'<1HCE;>8=5@6FADHFPDXEbGpJwMuQnRmapieǴȼA>5B?6C?6B?6C?6F@7MF7RI=`Y_squtdb~YWrRNbTRZC?5<<3BACTTdfWdIQD=>*=(;)9,:2929393;3=58//(-(0(5%7"5%>4KB>2<.=/C8C;IFJMMXKbHkOvWxUq[p[j^cǡɺE@7E@7D@6E@5F@6JD8QH7WMDkfzؘדʅttjf^_}^cpFJR[JU]q`tOXDB=0<,<-=0=4:19294;4:3>4B74/**/,2)7'9&6+HBMG<.9'<-G;C;JELMU_VkQpYx^u_sdm`_qlJC8IB8GA6F@3HA6ME9RH8VK=d]j륧薙ي{}mntXu~TaIQThWhHNEC>;<6@6B78,3+5-8/6,3'6#<);648134254:*<-D.<.A3VMehapbrir`nu}nvjRTJ;RH:OE7MC6OC7RF:UI8XL:_Y`{{œژ敖ԏɟ|qQ]:6@3=-:(:*9.716-8-:0<2:.;-6&7(5)6-1+7):-FBONJD>2;,:*;,:*OEijitgtmvbmXorgvOջڷ޼ռXL(00'8(;2=4;57)7(:/62:6E?I>9;,A7::I@D39(6)7,9.4',$)'%26'6>AA?;0:*<563C6OA<.7,601/19-<*<-H.WQc\m8O057&C6@?=::27+:&8*LE8131216-;.^ZxdxHc@VfqImWqvq}Ž\M<]N=]N=\M<]M<\M<^M;]QCcXSgXYfVcli}PQDHCF<>A7;,C7=65+8'A8C58,322>"/ -!+%7;VcpNS:56$-:0TRDA:/:.:(8,HA6111.14.5(UOuYrCc?MWd>nXfwdvbkjkt[L;\M<]N=]N=^N<_PC_OA`XThakk`slb~yyƺޜwkWYKP9:>39,H?TI;/4)3-A49,21DNCG/-,(23>C?C783.OJOQIG75EA?5:15487D=2,10.10-4'KBpLlBb?BM\8nX|cv`v`yb{bx^zaqyWJ9YK;]N=^P=_QAdVQcVQeammkplvròtgVTNPBC;58/B8[ML>2)84?46*/-55RXJQQVV[@B9?-7JVozfvRNFE?:D;84/<6?:73*1/.30.6)@9ezDhC]tA:IV6kUx_qXrXx^v\qWsZ|dwiQG7TH:[L<^P=aUIg[]h^jihnorsÝкøu^RXSXXHF;6<3F9M>7*CAE?7-2-3*95SWVbdoag/7(6FS^fT[7342>6?6734;6:6/5*1-040.6*A;{Ur?cCQVA3DM1dzMrXiNmQtZrVoSrXw_m[JC5ME9UIaXQe\djdikmqx{Ƌդع»yj\dZc`][SPNH9/<+<,A;@95*3+9+:&=6:A[gW^73BI?F7956512594:2859:656,7)2*222-4)GFkzGk=]BDHB0GJ/gzOoVeGjMsXpQnPnRlRbLD@2GA6NE:TK=]VP`Zehejlqt}ҏנحѱåwlrd`U~_Pb_mlnipj9-8#;*?99,7,8/<*@1=473PLKB6$/0(:'?:#847:3<47557527+8'4'6-5*9.LSUpAd$:&926:6<56547507)9'7&9'9'?9J\Gj?Z8C@5,JP4ltIlhS_?kJkOjJgLeJaDdGC@3EA7MF9SL:[WMe`jiguvÃ܄ӆȊʌʼn}tsZXb]Kq\GVN[`ebTL7&:'7+3)>+;*?39+:)7(7(1KTKaJZ}FAED0VX>l}NgjQeAZvTNA_[Wc^f`\m|x~xspnspumrhmmbWt^NWLPAH9?:723*8&<(;,8&8*=5I>:(9*;/:2;6:7AAIGFCJH>893867:8=6;99<0<+<(9%6&QUQYM[RVbO:YeC^nHfuJx_`mQGU8\v?lJnOkKkKnOpQiMMJRN@YTJa\Ye_coiv{rumhctb`kb^ae]Yg^Re^M[OLBA06,5,6+7(:*<.9%:&8,;2E:@9=;:9<::5:1<0;0986:7777988:8:=:>2;);(7#>2UYLUUV\L_d@epE^wJarOX`H=C1@L2`xCoMkKlKnOsUjMiMUOAUOBUOCVRA[UFaZNf_XiaXpghpghhb^\YUVSLVSGWUCYWE\OKH8-8(8+9+8)8);-:'7<*90745;6<6<687-9&:(@:9*;(:'5$G=SMTP[R\MnvNauKN^=R[D?B18;,AK3`zEoMlKnOrTnQiMkP^VH_WH_WI^WHaYId\Lf^Oh_OjaUlbUiaR]XJNL=HI9HL9YP?TFUQAA;,9):,:,:,=?@:683:1<,@+?)<*<.=6;6>5A9@<<78+:);)~:'x7'C7PDVKYPbOntOM_=BO7GN:;=,9<.@I3YpAkJpPqRrTkNkPiOe\Me]Ne\Mf]Nf]Nh^Pi_RkbRjaSkaSkaPg`N[VEKI8AE1UK:jH;RE_\IJ=3<0?4@5@7B:D>B;EAGCA8B1E2B/>,;,=,;+9,;/=3B5?47/7+;*:*|8)v6(z9,H;JFTUFF@;E>EDDECEDBD?B==6;/=1:3:1;/;.~:.|:/|:09/8-9-}:-{9-w7,t6,o4*o6+uA4LBQMXQq`MUcCL].:?25>/DO6Wh>dGtXoTbK^GaK_JhbRibRibRhbRjbSkbSlbUlcTlcRkcV~wnmLR9LB0[>7]:4~E@\[II=:C@CDCCDBF?E>B:?5>.06?16>1@I3Q`9aFt]cOY|D\F_I_KhbShbSicSicSjcSkcTlcTlcTkbSjdY~wɷvLJ27;)B?8XWP{sύYY<;A@AC@BB?C0<,<+:,~9-}9/}:0{:1y91v90s8.q8-o7,l6-k5,g3)g4*u<4NHzZPVP?414=048.49/4;02<.2=/3;138-8@-L]6C>B=@:=6<2<1}:/}9/{90y91s80n8/i8.g8-f7-g7.i6/g5-d4)i?3w[POL@>B619-37-36-07,08,2;/1:/28/37,5=,N`D^yRIa;Kc5~;2|91x80t7-q7/n6.j6-h7/f6/f6.h60i92h<1gC4pXG\XJAF95<007,37,17.06-.5,07.18/06-.5+5?2K]FPiFAV7G\;K`>SjDSiGGZ@heUheVheUieUieVjeWjfWkhZxyl՞aT=4<7=;>:u@:p@7o>4m=3n;3j91j71l61k60j80h<2bA3cN;eZDccNLR@9A328,27,28.17-06-06.16/16..5,090;G96E28q?9q>8n=6n:3l93e>3^@3[B2YO8YV=WZ@W]FBI69>139-39038/27/27016016006//701:02<11;.8E2;I6@R7H_;K`BAR=8G5fgUhfVifWjfWifXifXjfYmm`x}q͵qP=m=,g8*h9/i<1i>4g@4d@5`B4ZJ7XQ;RP9LR6NT7V\@MQ:CF4?B58=26;27;16:24:34:328117017007/07/2:08B49H4AU7K`@FX@56<45<45;34:32923:33926>457>57>66>56=56=65=39G3AT8CW<bbbbca̝ޞ읚ښϚљϙʙř٘˜ʛߚߞܱម6>6BC;bcdacdcccƗΚܝ랚Лʚ̙˘Ƙ˜˞ڝׯ廿氳̧aph\k`GKG5ijfikfnnkrqmuqpwsowsoxtnzrj㓔ʗޙӗיٜϗڙ癖蜙됍ŭᨮsvolvqqwsM\KAM9ggehhfkkgnnitskvvoxwmzwiwtjzwxH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nndcibW`Rfecdcbhgdkkfophvtm|ykzyh|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_Tlkfigcgeajhbnmfwqixkwl묲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKUztqhqngmichf_lhdunjviuj櫸|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTxVR|wmzvluqhpkenieqnkzthtczѦ틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ue@<0{pzp}wlyrhunftqjzvhvc{}ΣvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiBR3{o{o{nznznypznzkzvwx{{fm|Rb;F3?E>CNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}]sMojkd}sznznznwmymzozn}n{qzw^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7K_:`hK^uQ_SeSeSaScTryjyiyizjzkzmzn}n}nzlcG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1SoDc|SbT\{L^yL_}P^KdRtfpzqzlzlzlzlzlzj{k{qmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%HcAd\;/L_>WlF\vJSqAUsBYvFZyDY|@_H_vMK\@zn}q~r~s~q|rˋzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRpVnBMm9Qp$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2waViHEb.Qn8So+:(G;9+:)7(7(6=7;?7;+;';(6#IDUhMX]O39"FO)u_ij6?--6!M^2On4Hh3Ph8Pl9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.%& ,2%L_5Sq7Om9Qn=On5Tv8Y?TvAyyyzzxwzzw`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/**$*2$Ma8YtSq;Sr6Y|?Y|BHh7}}}}}}zwhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#**#*1#Nb9Yu@NOimNJCEb5Mj7Hc6}~~~~pbRpaUf_RfaP_YCA@%rMB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=3',$**@K.Vp?YzEUrECa2Ge6Ki9E_5}~~~:3,60*=;8VUP_]WBA8!  !2#W&%q"%s! u$"v$$v$$s%$q%!p% r$!] F C!FFDCCCA@?>=<:95= O+)M/+C2+21&%,!%#'"'*')*!9A&Uo>\{FHb6C^2Hc6Hc8B\5~~~~94+51,FDBnoouqUMB#'!0!!mCCm/-vw"$u#$u"#q#!n%u#e#KC D DBBBB?=;;::973;O-+A1*)*!"!(!'' 09#VoBRq??W/C\3G`9Ga6AY6:5-94+985dgh|lSXC(* *&%TQPzwqq<,)&" $&07%[sQFd9876558867:(#"#$)ShO5O-9P-9N,AW4I`:2@,950:5.76+:97UX]xz|ssa;=.;A8jmjvrc82]h"i&Y%G#D!EB@>=;8767899 7%E<2:90!"")'/"1?*9M05I*BU7EY?'3'75-950:5/77*BDCsx{y{vx|rspoa_]TmliiVKV%d` PC" ;# <"!*"86.85.941:7078+9>;gmq{}tzo|{mupiww{pd_9,S!MC;"< =!=";!: <95 2!*-*1/ 11!:>1""#!.7'EM?1@&5589!8!7!4"2$/&51&%%#%';;+13&  !!  $ '!1<-3<3#*$77.85.76.95.:5197059+5?;gnswoo`ie_z~yyrjodX7,/$1(1(.*+))*27("( %&'87'3/$%%!!!!""!" '(',8*#,"|28+79.87/96/97/96077/59/BIGjos~~tusijf\je`{wz}{~{zm:7(+(-*,**)(*&*%)(,15"35%.. ., -+)'## !"#""## % %" $&3&4 )"+&1"'1% \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/ReduceNoise.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/ReduceNoise.miff new file mode 100644 index 0000000..9e43c54 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/ReduceNoise.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/-0/-20-61-81-81-80-80-80-7/,5-+5-+5-*4-*3-*4.*4/*41,73-95->6/C:0H?2JA2LB2UB2mB3C4D4C=C@C@@@?@?;?/@-?,?,?,>+=+=,=-?.?3B3B4B5R:3:5173/72/62.11.10-1/-2/-5/.I21xIGxbnxbnlbncl|]^|RSlYZaYZSYWS0/-0/-1/-20-60-80,80,80-7/,5-+4-+4-+4-+3-*3-*3.*3.+30,52-74-<6/?8/F;/H?2KA2NA2_A2yA4C4C5C=C@A@@>?;?/?-?,?,>,=,=,=-=-?/@3C6D6B6R?5:5173/62.32.01.00.00-00.30.620gA8lbblbnkbocp|`l|]^n]^a_eSYZS..-/.-/.-0.-1.,2-+2,+2,+2,+2,+2,+2,+2-+1-+2-+3-+3.+3/,41,73-:4/>5/A8/E;1H>2K>2U=2m>3@4A3A9C=A=@;?3?-?-?,>,=,=,=,=-=.?2B6E9E:E9SD8<7394/62.21.01.00.00-0/.1/.40.P75lb\lllpkpipipr_eg_eSYdS.....-/.-/.,0.,1-+0++.++.++.++.++/++/,+/-+0-+0-+2-+3.+40,62-:3.<4.>4/A6/B9/F9/K9/_;0y<0>1@3A9A9@3?0?/?->,=,=,<,<,<-=/@4E:G@QNWN\WGC@595163.11.01-00.00.0/.0-.2//E21gcRlpv~q~v~`po_eSYdQ./.././/-/.-0.,1-+0++.++.++.++.++.++/++/,,/-,0-,0-+2.,40,71-;3-<3.=3/>4/A5/C6/F7/Q7/h9/:0<1@4A5@3?1?/>-=-=,<,<,<,<.?2E:G@UOg_gr{_S^N4/>4/?5/A5/B6/F6/R7/i7/;0?3A5A5?2?/>/=-<-;,<,<-?4G:G@SIg_qr{vegSeM==321+0,+/,+/++0+,0+,0+.:/1efRkc~o~v~{~{vtop_eQ23233254174193092.80.30.3./1.//+./+.1-.1..00.10.40.61-;3/?50A50@50>50>50?50A50A6/F6/R7/j:0=1?3@4@4?3?2>/<.<-;-;.>4G>K@QEUOfXpqrwnefeSZM==32,+2,+0++0++0++2--G@1eqRn\{j~t{~{}tolYdJ671781882994=:5@:5@95=74<70:5091091/61.62.63.64.94/;7/A80C;0D:0B:0@90?80?70@60C60O6/i9/:0;1?3?3?4>4>2>23?3?4@4>2>2;/:.;.>4E>PGUIUISKNOFVFVM_YgYhEhEhEhAba=3H=/R@/WN:h^Rn\{d~o~t{~{}tsnd{_681782994>=8B?8EA:GB9HC8HA7H?5F=4D;1A90<70<70<70>80B<0H=0I=0I=0H<1C;1B:1C:1G;1;0;0;0;0=1>2>2>2>2>2;28/8.9.<6C@PGSHSHEHAHAHBKDTD\DhDkGnJoJnGkGbTT]\v\duttn671781892==6D@9FA:HC:JE:MH:ME9I@8F=4E;3A91>91>90>9/A=/C>0I?0I?1E=1D<1E<1G=1=0=/=/;0;1=1=2>2>2>2;28.7+6+7+9,?;CACCBCAC@C?EAHDKDVD_EhJnJqMqRpSgYf_f̓pӠƵ671671881<;3B?6GC7JE9MH;TI;WKJ[Uj[ToH@OE=4@94?93@<1A=0C?0H?1I@1H@1F=1K=1=0A@@>?>>@AEDIDKDXEbJnKqRqUqWnZn`n:81881:81=92?=5GC6MF7SI:WKJ]Woŀ|f\LIXA=CB?9B@9H@9IA9KA9PA>a?<>5=0=/<-;,;-:/:0:1:1:19/8,2+2+2)5)6*9,>3?6?6>3>3>3A=EHFJFVJaNnRqTtWtXp]onp䪤D@5?92=91?<2E=5GA5MF7TJ9XUWޣ襤|feRIXRAMRACRACC?E?@<>;>7=/<-;-;/9/9/809/8,8+6+4+2+2+4+5+7->2>3>3>3>2=.>2D>FIHSNaQnUqVqXrZq`ptpOI:KB5F@4F=5F@5LD5SG7VJ9XQT䣤襤씐؈z\JPCNANEFFFEA?23>5>5>2<-<.@2FFJJP`VmZoap`pbpdoopWM>TJ;PI:MG9MG7RG7TG8WK>;>9=1;/:.9/8/7/6/7/7/7+8+7.5/5.5,5,7/:/=/=3>5=1<-<-<.@2H>QVZmbofpbpgqnntnݗ}[M>YL?;>:>8=2;/9+9.7.4.4.4.4.5+6050505250507383;3;3<5[L;?:?:?9;1:+9+6+4.4.3/11.24266555272726284849/8.:/:.:-:.:/:/;1H>bjmqnqkqnqngzdgmpĪǚǚǦ˾[L<[L<[L;[K;ZK>?;>8>7>6>5;0:.9.7.4.2/./-3-6.788868482828294948/8.9/8.9/90908.90<3agmrmrdqbldanaa~gmpqtùſ[L:[L:[L:[L:\L;]L;]L<^M<^N=_PHd]ppwwvq|MU@G@F>@>=@7>5;5;5;3:.9.8.7.4.1/-2-3,6.83:8:868585;6;6;6848/8/8/8181814070:2\Wq{q{k{YdYab^~\|`|fkmoqy\L:\L:\L:]L:]L:^M;^N<^N<^O>aSYm`qqwwwu|MUBG@A>=<9<7<3;3;3;39.7.7.7/4/1015.9.<7B9C:C9?::::C@<9<6;3:1>3>39.7.606140252<9C;C;C;H>J?JCGCGC@B:;6:68585736141202.2052H3<1=2>3<.7.71917075:7>C>C>C?C?C?C?F:9:9;6:48585856460402/2.2/42<_R?`SB`[affoptx}}ȠDzv|jdYUMJGAB:B5<2<1<1:.7.8/9090:3=6CC?B>B?B>B7?7?7?:::6:585857565605/3-3-4/52;<@dFdBdAXhBGdPGdyDhLnUoUnTnTnThLcIbEYL<[M=_O>_P?`RB`Yae_ljtwz|ΘΞȢy}jd[ZWRWQOAB:<2<1;-;,8,8,9-9/:0=5@B?A:???7>5:5:5:698675757564636-6-5+5*5.82;B>cAd@ck@>\B<\P<^y>gKmQmNlMlMiLfIcGbEJD8THgKlNkLhLhKfJfHcGbE974DB6LE\VX`]gfst{|ʄщҌэ͋ƒ|ge|]R~\R\QZQWQB=<-;+;+:+:+9+:+:+:-:+:0:3848:6;3:1:5:588675757575747*8)8)9):*<5=\@]@\@GR@4QB4RZ9_>eIiKhIgIhKfIfHfIfG970<=0AB5LL=XSN\]mgeytʄшшΈǃyg}p_Rp\N|ZNZNYORC<-;+8*8):*:+:+:+:+:-:+:/:084886;3;1:5:788886787775748*9)9(:'<)=MBXBX@Xk@=K@3QO4^c<`AgFgGgGhHiKgJgJgJgJ970<=0AC5OM=VQB[Yiecpjy{͂́z~on_Rn^Np\KZKYHRC;/9+9+8*9):):+:+:+:-:-:-:/:2:5:7:88:7:8:88888888888884:*:):(;(=*BOIRIRCOkC=^N;^Y<^c<`>jGjGjGjIkKjKkKkMmM@>2@>4LM=VO?ZVH`[Mg^imc|wlzzysna]l_Rl_Ol^Ln\IZIRE=<8,8*8+8*8):*:+;+:+:-9/9/:4848697:6989887868788888888:6:*:):(;)=DKOPRPRMO`OBOO;JT;JT9]~=gFgGgGjJlMkMlMmOpPUM>VM>VO?XTCbYKe^Mh_PibTjcgmckib[h_RfZH`ZGf\Hj\IlZGRGJ=:.8+8*8*9*9)9):+;+:+:/:495:79594:4;4<5;7:6969787888898;,;*;(;);*IGSNTOUOvYMSY@KM;IM;=C1KT;`~=fFhIkKoOmOoOoPpPcZKd[Ke[Ke[Ke_Lh_Pi_PjaTjaTkaRiaNfZI]YG[VF[VFhYGnXGKFD;:.9+9*9*:+:*:+;,;/;3=5<9;8;8:4:2;-;-;-;2:5:596969697;3;,;*;(;);*OGTNYNYNv\O^]BKQ;FM4;B0[M@KFJFJ@=0:.:+:+:,;,<-9>9=9<8;2;1;-;,;,;-:0:3:593:3:.:,:+:*:);*A3RGTMYMZMf\KS]@GQ5:=09>/:@0;B0gJoMpPpPpPoNgLbLi`Qi`Qi`Qi`QjaRjaRkaRkbSkbRkbPiaPfaK_ZFSP>SKrJ@JCJCCC@9=0<0=1>2?3@3@:A=@<>;=5<3;1;1;.;-;,:.:/:/:0:0:.9,9,8+{8*}:*;,H;RITMYM[MZ\FMX=AM39<08E@E@CCB?A;A;@<@A<>4=2<0;/;.:-:,:.:/:/:/9/9.9,{8,y8+v8*w9*{=1O@SLUMYM`YIUY@GS:=E2:>08=/8=/:@2_yApNqPrPjNbJaJaIi`QiaRiaRjbRjbSkbSkbSkbTlbTlbTlbTlbTlaRhaQfYDfK@rE@}E@E@C@B?C>C>CACDDDCCCCCAB>B08=/8=/:>0Vd>nNpPpPeLaI_I_IibRibRibRjbSjbSkbSkbSlcSlbTlcTlcTmbTpcU}{j{jaPMC}J@rH@C@CBECEEDDDDDDCDBBB?B>A<@4=1yQHyTJUS@MQ;;E29C19@07>07<.8=/9>1LW5_I`MaM`J_I\H\HhbRhbRibRibSjbSjbSkcSlcSlcTlcTlcTpddѴ{jrMC^J<^HBHCHEHFEEDEDDCBB?B>B=ANQ>7@35<05<06:06>04=05;.8=09A2DM5To>Z~C_I_IZ~GZ|GX|GhcShcShcSicSicSjcSkcSlcTlcTldTmfdٸr{j^OF^JEpOF{jٗޙqqFDDBB?B>B.3?/;C2DU:Ig.6@2@J5DV:Lh=Qj@Qi@QhBQ]EheVheVheVheVieVieWjeVkeVlgZnlhѣH@E;B9?6=3}<3u=2r<2q:2o92m92j92h81g80f90e<0e>1fF4fJ5_I5Q=339/28-27-17-07-/6-/3,.3-.3,-3,-4,/5-2?/7C4>J8DV;G]=G]4l>4j>3h=2g=2e=2d>1^E1_F2`J5_M9]J5FF57>429/28.28.17-06-/3-.3-.3--3,,3,-4-/6.3>.7C3=J5BP9>L89J54D1heVheVheVheVieWjfXjfXkgZlk\nwpԼu]H=B;qA7oA5j?4i?4hA4cA4_D4^F4YF3YJ2]M5]S9\T47=47=47<47;56;5271.4--4-,4--4-/6.3>.6C29J4>M8=L89J34B1geUgfVhfWifWifWkfXkfYkgZll\nwp͠u]sK;mK7iK4cK4XK4VN4VN5PN4MN5MO2VS9WV=WV=VT69=67;506206/5=/6@26D4:J5>M8;L89J34B1dgSggUhgWigWjfXkfYkgYkgYkl[|ygKjO4eO3VN3SN4SN4PO5LO5LO5LO5VV=WV=WV=VT=?.@,@+>-=*=,?3D6f=143282041-/0-1,-C00OKyRRYRcdcZ,-,0.,3-)2-*2-+3-,2,+2-+4-,30,41,63.<5.B8-F;/MD6r<,?0F??A@6@+>-?+>,<->/@3LFZLB52.63..4.-3/1201,+];2TQ;2OR[Z[_T+.1-./-+)+***)*,*+,**,*+.,-0,+0+*0--921<2/B3/C;6R81:/A3F;C6>+=.<-;*;/C:D?quvEE80.'0-+1.-21--)-BA8l{d/1-11.42.4.+/++++-,'-,(*.-*..,0+*8/*=5/;2.<..A2.<.+V2)=1<1@4>.<-;+q7(}=1F@h[xX{Y=F9($$+&(0+0)%-::,j^nV671983?;6A95=73:6590271/52-541<60F;0I>3B80>51C42I54J7-w:3@n\El[|s~usiQG88,''+%7()SP;kWhZkgssYjQ792=>8EA=GC>IC5QA/H7&62+I<3@97$<&8,?09(:@2?OYINR>6<)<(:1:3;1<42*.(4"7"A:E=8$@4JIJPIbOxRvTkX`ID8@;094.IA7RB2y{ooIPfyHOfTf?4<*<17/9270<,92-14.7+@4JG7(@3F:KEZcUr[tfs[[XO@RJ;I?4ID8OD-stk=B<6@8XK6B4;.6&OCqwqxVjpfЯ̜ͭ[L;ZK;ZJ;]L=_O=ZK<^Qfyr8<@9BH;.<2C>@.5'5,0/*4"B?Q:I.,C5(6"F=835.>3z~~If`PhVs^udn~ƹ\K7\K7]L8^L;[N-71:/G:906>)4 )6KYd;94#B;GC:-80@900/04&yut>b}P=j[pj~gp_O=_N=_O=\K2`YXxqqtԻiS?E50?4SG4*6.8+69HMEFFH06DIenHHB=<71>852-/2/#pna}5VTU:vat[v]y[bn^[M=`SC_Q>eZYvxhq㰔}jdSU40K=A5A=6.1'A:T`_h2:EQPT627/94786,3,042)\aKrFO:G.ezLkMnTmP]CQi:GC8YL580:,;,<:LF7--48;%^jCcFiKfIaHc}G,2+>92[Y]]]jkᄄ͇؇|j[SpWA]btpA07&6)<+<.9*9,;-14,;/;1::687578*9':FD@nRL=WQ<_XAqisvk`\e`XNi\DvcSPG5)5-8);+9':.A5=4:;89<1C79867849;=;=-7"B8W\^LnLsUMU<24*`yBnMjMrMtVh^Oi_Oh^Pj`Pg]Jg^F_YBKH5IO>WWHOJ9/8&8)9*9&8:1;?7883<&:&:4;8@6=9:/;(|6#E7WMeW[hF08/;9/57,b|HvSqMxXdMi`Qi`QkbRl`[lbVkbUndU^YG<@2:B-SFVX>4?3A8B;C8ECA;A0?/<.<,9+<0<-8+9*y9+v8*L=SO_SOa:O]@AD.47,b{FuOvWiQaIi`QjaRjbSkbTkcQmcTn`Se\OYVBNB+@>QPNL?:GEGKFFB@>7=/:3:0|;.x:.z8.8,z;.w7-p2(r<1RJXPcfJQk@AM-7:/58.WhAFEE=B:=.<,:+~:-~:1y91s8.r9.o6.e1'n7,XRhYI>I739-:C36B2/0-LY6vZ[}E_I[~IhcRhcRhcRjcSoeWf\K{}z77&lih쫦E>65DAC><2}<-~9.|91z;3n90h7,g7-k70`.&h7.`JB0:+27-360/;,8G5-/%KV>j[Ml:]|HXtGheUheUgeUjdWmeUjfZҶciTԼfZ4*D;C;?7|:1v8/q7.i7/f6.h70j6/mF8qaS,4,15,26+/6,.4,18/2N5\lR>J>hdUieWhfVldZlgWdqbܾ˳v^KvI>h?3hB5`B5^M;OO837<46;6382.3-*/*+/,4:55C/BO;8B8`fQgiWjfWmfZheUlzoƿNC'XP4OO6KR8JU5PW6]\AUP;CC5;?59B6:A9;A8;B:6>50617G/>U7=O79I5 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Roll.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Roll.miff new file mode 100644 index 0000000..056a51f --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Roll.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/vTNG@3.9)1<.7:2686280-9*6D29H616,,-"@J1zm^MQo?B=@-2>*6C.DV;H]=^qRZlS,8.heVheVheVheVheVgeUkd[ndXghP}~ҷǣE49.<9:;@=pB4fF9cJ5_M5iQYF27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29':?5:>58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.ddSgdUhgWieWhfWkeVnd\lhZdkRdwoҶƿѽhS;XD,]K2\L4VO:QN7MO8^gK@L0=E*GJ+igJ`YDFF5MI6CB5kK@\]^g~lp_YWS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,;4193.53.14/-4.,40/3/12000.3-+I.!lMNkqH==1X54H>FFISIYZO,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWN4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rp\{ZN^G=:32'(/')-(+0(,2(/1+00*0+'[f@vvɌÓ~vpO[D.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~Yhfnjr_mWkPbFOR.(>3(G@-e^:w\n\mYsd~{d}_S_G8939:4>>8A?:D?:FABCEvC9y:4HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<h>qEwJnWxY]nnd҅un330551883=<6DC9GG>JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HDKDXBbJtK}MzTtCc{_T10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKFJO\F`JnRzXzUqSg`pKU᪤:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHNIQSTaVnNoUxWoZiWeOTtnD@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>H=NJ\afvPmZurxbp{ueVPAOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-C?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:38+8-kkzrMd?\^gQ|\a~QeYyhtyŵ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ[K:[K:YK:YI9[K:]J<^K<^O;^O;_N:_KHaWw|w‡ew4K@FC@BGC@;.8&@68;MEPA6(4*601/19-<*<-H.WQc\m8O057&C6SNC@9.7$;%8)FB8331-02,4%ME{Yt?a@SIY1p[oq|f~fk~en\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1.20.4%HB96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.2/-5)<3bw>cAd\;/L_>u^{coWrXx^y[wVahe|V_O=_O?_O>_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53A<@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-350/4*DBhu;d@hMGRP`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$=!<&KMBg6gCO3648+/DN)y՚q\]=rNoRfEgMeKfGkJ*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWUM>VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`JcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"A3SGZNYSYMAM+'2%7>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qi`QjaRjaQk_Zk__kaVkaTkaXlaRkbNZVDDF82@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(Q@TGQM[SWX@Oe=`vFCW-6@*:<279/8@-_yAxQpQwYjS\GgJaIi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCtTx\r\ZC_IeL\Gi`QjaRlbTjaRjaRkbSkbSkbRlcSlcTpbRpaUf_RfaP_YCA@%rMB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Rotate.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Rotate.miff new file mode 100644 index 0000000..6ea0977 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Rotate.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=84 rows=84 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=84x84-7-19 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:\[YEDCFCACCE$$#0/,.*'IEACFH"$',--0/,50-0*$LE@EGC%'&,/1.-./-*2-*60+1*%JC?LMH+,%12-/0.....,)0*'2-*5/,0(%KCAMMH/0*78264/53/10--+*,*)-+)0,+60,0($JB@JJG./)9;4<<7;94:7263/2.,,*++)*.+*2++70-1)&IB?IHD('%672<=7A?:A>9@<8<416/,0,*('(+**/++2,+6.,-%"G@=TQI/-&0/,651<<6D@9-;7/30+660==5EC;HC?GB8=73510.-.*),,*+-*+0,+1,)5.+.&"G@=jaTME6KE9>9/52)97/>?5FEGB;C=8;650/1,(.,(,*()-++0-,3-,5.++& C@:maSUI9XN@MG9A;183+<81F@6LH9MK8LH7LC9I?6A:49112)//(-+(),)*/,-1--3.,30++(!FC=m_QSE4ZN>ZM?QG8F=1=71B;6OD7VJ9NJ4MK2F<0@718//1+-.**,+*.-./-+1.+31,41+-*#JG@m^MUD2[L<\M6GA7SF5VG8ZTWijydcsF>5G<.E<2?7261.2/+/.*.-,/,+1-,3/+41,63.1.(NJAp`PUD.[K7YK:ZI;YK;YKVK>TK8TI0RG>d`vتb\B99A9.?81:6084/7522200-*1+)0++1..72.<4,C;1B9+[REg\NUG6_P@_O=^M:^L8\L9\J<]L=\M83:7/:6.<81=72:1,9/*4.*50/920=5.@6-G=/D9(^SESSIE>1[N>_RB_Q@_O<^M:^L9^L<^L<^P4-;3/<32<30@5-D8-J>/F:)lSECH?.0(JD;]O@aUC`SB_P>`O7_M7]N<]O<^O;[M@]T]wxמlh@?J75.<91@<7I>0L?0M@2I>3D:1?60;2.<1/A3.F90EA3QE4j>-TFGI>%240NC:\N;bVC`SA]QD]O@[M49@6E=/D:)K91F:0C;0@91>62@3/C1,690E73b608,C2GACD6;NRyqdcZJi`Qh_Pd[K\SCUP>RRBb_~jiornpxẃՊؗޜϏΐ޸oqAW:8;34Cn@BA41=.,D.(k9,>3@4E;??;@59QNyqdbYIi`Qi`QjaRh^Pe[MbXD^XGmk䉈ܗݦα|]^>O@CA7=HXCIuA=95(H0'j9-A2A3E;DA><@:8,QAxrdc[KjbSj`RkbSjaRi`QjaQg_Hd[LunՎ遁׃ϊΘӵӠ~bZVCR?GBD>DBLBK?B?4B9<>EFA/@0<,7'3(5+B5D>T5*n90=4=/E8H?C2A,?+8$Q@xtfb[KjbRjdSjbSkbSkbSk`XkaXiaOg^Mpdiv{ą̈́ӈӖѰƼbHB=E9?>?CA>;>8@6FDCB1F>A5<::8;0C3@5@.@+?-?,8#R>wtfa]KhcSjcSjbRibRjaRlbUlaXk`]jaSh`Lg]Lk`^jd|}yǍӍь|z|xwf\X;?95?3<.9*9'B7<8=>;==9>0;,;+9(=-<*8';0?3B8B?~@7@4=0>,>,>.>-@+8#P?xvhb_PgeTgdRhcSibRibRjbSkbSkbSldPkaTjbOh`Gb[HWSMhdq~tz|{e|h[de\WkefeAD;1<,=-;,?3>994@6>4A7C7>3<1:08/<29,=2B6C2E4?7B4>/=.<,<.>->*>,7&O?xuha^NheVheWgeTgdRhcSjbSjbSkbSkbRldQlcRkaXjbNb\GPM/;,5+8.9182939+=-A2;)@0?9?4=-=->/<-<,=+>,=,5"O>vufb_OheVheVheVheWgdTicRkcSlcTlcTlcTlcTlcUmbUmbQb\GMJ6PL;dYDn]Gg[Ia]Gb^Ga^CTL\XtoMK72C9^Q>43(?0PC<):&:%;+5-3/5-82<792<.?2@3>5?A@>{:/:+<,:-:+;*<,<-<+5"P?~tTXCheVifWifWifWheVheVjdVlcUmdUlcUlcTlcTobSpbTlcS^YGFH6EI8[ZFfcMo_Nj^Ni]G}[FWWek~b_<3H;YJ;/5'?2L>7)8(7&8)9271:.8/;5;4<37.7,8,8>A?n?4t=-v;(x:*|;+9*;-<.;.=,6'QFowcbcQifWifWifWieUidXldZmdVmdTmcSkbRg]Qi]Qm_Sh`R[VFBE7=E6HOAsaT[QYLVEUDW[ooid;3A3OA3*0+91C59-5,5*7+30306+4$3'7,B98/4+5,..><>:8;@8>4q8*z:-;1=4@3@0?39,TFvwgc`PhfWjeVkdYld\ndXieQjdSi_Ohc\yvq~ysokcmhZYSACA14B12?08167306,1+-36,7#5!8#B46-.(3,-)4-:<;BMMXTz@4?5E:E>E;E7?6B8=0WKytgf`QmdYnd\ngZigQlm[srpvwy~ͦpjV;?%OE0MF.XHHH5-6*2,1+0*7'8$;$:(>4HHB:6)3)269D)409-)+)/3:.9+7&=3//*(.(0(4#5%0(LGVHlK9I>JBKFGBHCOJKGK?[5(XJBxtig_UlhZhjSekWw}z㊇wRH1L@C@[QKJ:+;)8.6,7%8%9'9*7*8->6;5/&-(78FL*3#2+;(/'4,=:98.6/37..2*6"5 5"9,VFpbH`cEp[EZL`VqexjrylUH>96.2.-IEDvuh_cMalWjyr𮟑8>*D=CEWXOR9,8'9+7+9'<%5+3)5);+7,806/3)>+:(8*9.;+9'>9PWHL1.*63S>\5C456%8"3-0554;+8(<3A:KIMQRTEQ?Qrj~hvcHJ=95-73.62//*'FC?㰺FP53<,F=0JHJHB:<0;+9(:+<-:(8'<+@1C78(=->.?8PYZdNQ;?L[anZk9F43;05-.1-07,8*A9TKB>?A=@?A,HFZ~nrYsUCI934*02+24/22.(($BB@ʞ~EF,96.34-{E;DCB3;+;-;*5!9-C;D9:,9*:-<274GRepUZ<@=AGJCI4E/932@59+3(4&B5LHF@<,=/:,B8AL3Mfi{lk[zZCH:0/(-.)-2,-4/-2/''%C@?ھceMAE7F@:>=;u?>CFA:GAHC@9;/5<&:.B:;+9':(8*9/>8UW[dHN0808318.3&4(2/>68':'<*MCIK?89":';*B6=D,F@YpnxacCJ>2'(0*)/.,,1/.3/21.-%&G>@Ѹʹ­}wÙYY?5EDHI=38(<.A:E@CG;K0TPf}tgh=L:,(&/(*2,+/.-02/1201,-5&'kMN¶Ⱦzv99DCAEHIIFF:?49075>:=4:04)7,6hn݆<>BEDDDDDDBCIEBBA@B@C=>7766;69:9976;0=-<+>&?&8655164>;E?>48)8$9&5(@4;+:';)@2MFPTJ^DeCq@tBrOjw?C&-#(,+++01+11)/1)+WJGzdxhmkjǻH;?>AAE>F=C>?9=0C0=28766;3<4DG@G;B07&;9*54072=7D<>7809(7'E:MB>0;,;,?3LETXNcImLzIyInUwGQ>,$6'*+'-(&++& PW>{rxUTE9ab\q߷YN:5??D0A2C1=.:+8&8(G=TQSN=<2:):.963;08093142>74B8EA=49/8*<-;,OG_e[oPqS{OzSv[|WaM6,@2)E0-1,'FJ5sXjoE9uF:[WUbdW90B>A=B:@7=.}=0;2<2~=,=*?):':->8=9<7866889;5<484:83;3?;=C;615182:/7&E5_TlnYqOpVxVtLkQtWgQ>/LH0^W8`dJgrVp|NKi72MZ]cu>2E/92:2;1<,>*:(=4897892837595;48555787654722+0/.1118.8+QHlgilap[u]tVlRgqhhxkyg|aoXjYwft͕˰tZfjAIIek]YYM|ywϤ9,E6B9<5;0=-;,9-;.;0};0;+7);478698576899:87463542605*5*3-11-03.5*=3jjrybkeoqtlt\jYhR^riМxniUm`ykouJQEkidۺF5;7B7?4=2~<-;+:+:+:-{:.~:+:-<4;78593858>7=6:6:616,7)7)2+00.2//1'7)WQ{{pymrpqnwv\aUZ㪥~pnblgzpyk|forcڭdP2+=<?7<2~;/~:.|9.~9-:-}:.y:-9,;0?4@7=4:67:6<69968.7(9&6'1/04//1*6'G=;;:<>8:/9)9(7%6'40014.7,;0xt|qbtNcEcrnjeEP6ӠyymjWkQ^gUyH1l:*pA8r?5w90z8/|91{<3|;2{:1{90z808,9)6*91:4?9>6>2:)=*<):%9&7(2'6-81gio[uRnE_=\nhv\tI䱲nkThK`hVȳg7(m82s@8p>4s8/w80y92u<3t:2v8/x9/z9.:,;+9,9*8(9);*;(<(;';"<#;*;2MN]cnZsHi?f=`>WPDkRs\ߏXkQeqZӧwg6-r?9p@8j;1n6,o7.j9/k8.o7-r7-v90w:/z:-8+;*;)<(:(9$7$7$6(Cf?h?c?_>IyM>Jf7dMtVʑ|tԼoaF^C.k?4n?7l=5l81k70h80g7-h7-l8-q8,s9.s7.w5*{5*y:,y;){6#~7#9*NINUOc@c;i:f;g>bE\JR[;/PM6QoBoZghaRyɨgbGN@$`G2h>2n<5r73m51g6/f6-e7-h8-l7-o6.o4+o5*s4*q5)s5(}8)@1MDXWU^K[G^?[CW8Jv7;M?/WO<:A)N`?t]xamq}np`ud_DRG+]J6bB7j<4j91i7/g6/f7.g7.k70k5-j4+j3(j2&r:/{B4I.<811/1!."6:)??,FH/auLx_x`t_{eiopѬa^ELI0UL7[E4`A4b;1g<3j81k60i70e3*c0'b/$m8,}G>SGSDQHXOYReY~pNM^0:B#96%B1,8?#HG'II+KV1c|HoRkQrYxa|fmou\_HDG.UT=d\FQ?.ZB3gE8k=0h:/d3+Z, g3)B;SOSNRKROVW^V~_Lkc]uZ]iv~i{ReJeEjNsYy_{c|cisW^ELW8JS9>C*MN5`S;`H2lQ>tSFlB8qF>VQ[R\RZN_QsZKqXMY47E/AO3^yGpRpȇȑthR^?cEkQrYvXxX~]l˿Y`A>H(:C'BG)]\?b^B|fwr`ZPED=8QD9UN>ZTDe]JbiKTfCSi?Qb;7B417237.<@/RYAVdGYoH[zC^>jHjKlPiMlNrRdsmtSJN.[[/9B3?O6Md>XnBUj=ZgKMQ?A@376.22+6=,JZ2b>mIrQoPiGcG]D^BjOq^zvjlR[X=`\F@F1.9).4,.5+17.27-47,5;024/15,9E.CQ2;I(;G,@D*::&8:/6<.IW9hFjFhHiLhGjKeK_GWrAD^+g|WfdNLH257=34:017,/4,/4,/6+19,/8-2=/;H66=/8<26:05:,HX9jLuPtRlPlOlNkPgMeHa@tYWUG37,8>48>328..3,-2-/3-/6+.9*4B17G40:.49457+CK1dDvPtPpPpOlJlKnQgHb@z]MQG29.9?68<505/-2-.3-/3..4,5@17D4.3.33->A-Vd=rPuQpNqLtOrLsNsPkIdISG1:0:?:6;5/4.,1+,0+-2-5=19@1,.$57(GU2lMyZuXvWy[{]|^xXnOiKSI2809>8271+0*+0*+4-0=33:-46(DP6mYvZw[oYiQhReNfM\Dr^KRH3:27;6-2,+0+*3,,7-6C4EP=mfo`dMZ|D[EZC]HdI\Dq_MTJ281272(.(*2+,6,3?.DRQp=VuA\FaIdL\Ar]NWN.6/+0,+/+-4-3>/5B-AT7Li>Mk;WtC^~J`JW}Bl[LSI(.(*.-.2/9@67C1DV;Hb;Li=XvFbLTvAi[HPH&.'*/-=E<6A0=L4OdCYrL`~QOk?bxXPbD/B'6G35C-BN9^lT^rUBX?N^KXqM3I-7H0BP4AICXjR(9$DND_j\ \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Sample.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Sample.miff new file mode 100644 index 0000000..fdbfd6f --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Sample.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=42 rows=28 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=42x28+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/-62/83.92-91.80-7/,4,)5-*1-'41*74-?:/JB4LA2UA2C3A5DG=B<@?/@-A+?.=+=*?3D6F9:5372/61.//-3,-6+-IG|lpRLaz|l,,,0/,1.+2-*2,+2++2,+1,)3-,3/,40,52-:3,@6-C8-EE5m=+9(H=<>>=@*>-?,>,<-;.B1GDWN;4153.14/,4012000.I.!kq=1X>FFISI,-/.--/-)-+(,**.++.++/--0,,/-*2.+2-,82/>4/A5-H>7_70y7-A3E@HA@,=/=-<+<.<2G:g_yCB8/1*.1+-0/02./2.4*,~Y\o|.0./1.21.3/,-*+,+,+(,+(),*)/-,/+)4,);3.;1-;/.>3,93,O,'A1;-B24B80@61<94A50<6*c6-BAC;A5y;/u>.PLpJ9kS@zXzrvooXiM3)"+/&:&*TN:hWk\khtthd893>>8A?:FABvC9y:4EGpYC`jHSZ)K@VYhjr_mPbR.(>3(e^:n\mY~{d}_330883=<6GG>MI6IE7H@9C9-?80=71@=9IA6H?-C745=0I@4!A&6'A1@28)++0)5!UIUQ?AE;ADAQ>h>qJnY]n҅:8130+74,IA6TH:darnm@?MA=(BC.:EQFSRaG<=+;(6*:4:3;21'-(2(7"C2QINITaVnUxZiWetnWN?PI:KB4E@7SG.VNQvAN;7F;=A@:6(2+;/4!6!5)8.42*05$LAMK:(;'A=1;+:.3/8*;+<99!3&7+=)>5US9):*<.VGmjbmdlWpXnE[L<\L^P<[NA^Sdě~@G@9<@<7B8;87$8'4'4')'%2'61:0:8564;68&QG<3:38-kkzMd?\gQa~QeYt\K7\K6]L7]L;]P=]P=cG>KU=G<=;*833+MA:.79"/!+%7cp:56$:0IE;08+J@3.-04%ME{?a@Sp[q|fkn^M:^M:^M:_L7VNAaXYmdpꙃd\9A77:+B96+4.<.03CG,(23?C3.OJIGEAB:2=>:1*.24%H<0%-'95Vbdo/7FS^f738280;;5+6*/49.82RpJ[=<&h~ShLmQsTbENj4DB6\M>`S>zt]_iiޠ֞pg}|SHYQ|6-5#:09/8/@173PL6$(:'?#8:5<5357)9&5-4'V\8e95#AB3QZ4_AcDhGcJfI47-OD;VL=lj[]y{Όшҍ~ZjpWDSV;-;#6+6(:-:-:0?51'+=*>&9:6;4487)8&9&=4WlCj#/%/4]>mKkHeJfH.2&01+:=0XVmꓐǎw^]Gj\EYC==7&7&5)<+D9:(4(2)8VN?VP=`WBmckwj|]W[]VGfZFjdORG:,7/6*9)<+9-<4B9<<68=2;-<56:9296;=;,;(6'TVYR`x;vYO];23+fGoJmRqKxUcZKe[Kd[Lg_Jg^Mg]L`ZGLH7SP>__OJL40:*8*7*=/?)7*496;5<8&:)>467<3>9@;:(:(~:*TI\Ss'2581990gKwQpOxUwYi`Qi`QjaRk_ZkaVkaTlaRZVDDF85C1ZF]Y;0<0=1@:C3HAEAF2C1:+=,8*;0<.6*<,{;,s9*H;SNVWfvI^kQKQ588/iLwPrPfNbJi`QlbTjaRkbSkbRlcSpbRf_RfaPA@%ECBCLL@9E;@EDCA>A<=/<3;/:-|:.{91|9.z:.u8.o4*l2'TLUMyeOUmD9C(89,4;0Vd>tTr\_IeLhaQjdSibRjbSkbSlcTmaTspi}{j3<(<=/^B5AE>=,~>/:+:,~:/{90w9/v90q6-k4)e1%RN_R_\H2?)BJ69A0495LW3rS`IaIaKhcShcShcSjcSmdUmdUljeKO1OHF=:@@>?@<;1=/:.|90{<3p;1i7-h8-k70a0'Y+vTN.9)1<.686-9*6D216,@J1zmQo<\yGbLgdSgdRgdRicRmdUmdSdddrnW޲80A-2>*DV;^qRZlSgdUifWifWjeVlhZflSu]yH1e3)l?4i>4cA7YG5e]G9C'ppR\`G7=57>48>37;6271.3-(.(,1,/2/=J8BP49?5;A;:@:9=8062+/.)-.6J28I1;K8 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Scale.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Scale.miff new file mode 100644 index 0000000..a71f2f5 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Scale.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=42 rows=28 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=42x28+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/-51.92-81-81-80-6.+4-*5.*2.(41*85.A;0I@2LA1^C3B2C8CF>B?=?-@,@+>-=+>,@3D7i>394372/41-/0-3--B12PPtXU[Vg~dd[--,0/,2-*2-*2-+3-,2,+2,*3-,3/+40,63/<5-A8.G;.NC5q=.@1E>??@7?,>->+=,<->/B5MF`NC;5153./3..2/11/4..^?9zZXE@ZU][Z_S,.1-...,),***)*,*+-*+-*+/,-0-+0,*1--:20=30B4/F:5W71:/A5E;C6?,<-<,:*;/B9IB{lvqEG:12*/-*0.,0/,0-/GD=kzc01.22.52/5/,0,,,,.-(--)*.-*/.,1-*80*>5/<2.=0.@3.@0,X3*>1=1@3>/=-;,x:,}>2JAi]}[yXCJ=/*(.(*.*.-*/>>.j}|^nV671983>;6@85<639538/060.52-641<60E:/H<3B80>51F63L52O6,y:3@;@7?4}xYFm\r|qs}cTG:>-+2-):*+VU?m[qcuqutYjQ782==7D@4E<0C:1<70;7.D3E;1<<1AC?@B8@4B3?0>??<<>@<\HgR@K7L:QG`OkLnMgEIK>.|za{\mS33/772@?7IG71K;1?68'=):->0=16,0,4'6&KAIJ=7A8@F@S?eDvOtWtecΌ75/52-:91ME8UMBzyTQb?;(@5GGHQHbNvUwUlZbHC7@;1;5.IA7UH3HF:*?1E9MHWaUp\uaodeWM?QH:J@4JD7SI8qq뜛ۻg@F?=B=<=@6:-5/8-6&8'7-6,111,;,GDF@;+<*?2ZRgmjqmuzr[N?ZM=WK;UJ=XL5A4:-:*OEnsow\jxo̹ҵϣ[L;ZK;ZJ:]L=^O<\MAbVlwu4B=>-6)5-0/*2$A@N8E00C>?;8,9'E<8270@6wzvPf`RpVq_yhs\K8\K8]L9^L;]O>aQDfV_~zHS>E>9<-;39-E9:06;)3&03HS]<;8*@:D?:/7/@9100/9.usl~EbQ@v`k}ghq_N<_N<_N<^N8`YYwpsv˺_QBD;4?4OD7,8/8-68GLCECF7=DJ_gIGC><61=752-/06,nmXr?[]R;v_t\w^y\cscZL<_RB`SAe[_rsiqܲ}keTU;6G:@2B?6-3*@:OW^g29BLKP628193886-3+027/\aDiGPDF/e}MiLnTkN]CQj:GC7XL>bYMqmfhyz͝ڧԡnelZQjfkf@5:)<39/:,=0>:MH4..<';+68495447+6'5,;3Qd<`^<5AA+bsHcEjLfHbHb}F04+A=7XVX^^ln݆Ή҆nZUx[H[_oiB2:(7*;+<.9+9-<026.;.9299686678+9&;$DD?g=M73,hqD|eGpPhIfJhH35+67.FI>_]q̇ԃ|rfhd]Jv[GMD737'8)9)>0>0:)7,9287784<(;):3:6?7=9:.:(7$F9WL`TUdC5>1==18=/azFsQrNvWeMi`Qi`QjaRk`ZkbUkbTkaQ\WFCE6CD0PDTT?4>4A7B>B,87=0:2;/~:.|:.8/9-|:.v7,q4*r:/SJWNfcJQe>@L/9<06;.Wi>vVjR`I`IhbRjcSibRjbSkbSlcSne[͗DI4;;/]>7UVCBBDDBE=B:=.<-:+~:.}:0x90t8.r9-n5-h3)l6,VPhVHAI73;-:C25@036/LZ7tXZ}D_I[~IhcShcShcSkcSmdUlcRޡFF4|vsꫨRL@=A=B<=3<.~:.|90z;2n90i7-h8-j6/c2)g:0\H@7[yGVqGheUheUgeUjdVleVlh[̲jp\i^@7E:@6=3{90w8/s7.i70g6.g7/k90kF7r_Q/5,17-26+/5,/5,07.4>1BN;JaAKf=VrHH]BheVheVheVjdXlfXpth͠H::4v@7r?7p?6k<4o72h91_<1_M9d[BX`K/5,18-05,.3--1,+1++5,0:-6A0?O6WgM=IT7=O89H5 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Segment.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Segment.miff new file mode 100644 index 0000000000000000000000000000000000000000..d2d6661dcce51ad8e973842ea07cf0fc7837a4b4 GIT binary patch literal 3589 zcmeH{%Z{5c6ow~T)Fo^ES zoUyExa3BtXek3Q>ids7eW6yYeh)am)FbyD%W$y*XerJTVWPZRIJcx}g*Tg&1K77Xq z-|>74o7nX+R#j;p#y_8Ds@@p>+xPa}`Fy^4HP_}UC)r#Dvys<&LDx~UUdO*ekYCQ` zX6<$XqrRba`voCGjsU-KUA2~0qYPD;OK}aR8DB*jf6fp)flqTFJ+8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTPuqd7CSLqN)i$RB!m!p366c^n7GAu8WV=z1EKd~ z7#LvaRTNP|4Ip|EU7~}K5JK?4+kE%_nIkJ=kF?omomKvSt+n^rzL}n`(yYFY?(*!8 z?w-yiwYAI3L&H4-{iVkGhMLaaj^W|b^q!$|=g73my0*4+pm$(sxYSTv+t)ENQZCKt z=p8QCkS^=%A1<|#4-KpsF157Q)^?Q#M;4bRS6(t1?C30)hUd+k>bY-ls61SaGH0N_ zTwA+zSx0Zr$f{C94LMgM6##8bE8CiC20`O?WlQUXh6$DT{axjup8oE-p8knx@%!_7nU>Ei- zE02*jP9kn-ty!_SXM}t}G)|fuo7yUFnx@orb&QnTJBP~tQ)+5xY_4l)u4`(V-`LjP z)YLwyrLLi+y`dpmeFI%Ri&j;%n(7)_>l$08Q9PM{l|1mP;?aR6$u4gB3p#we!w9&zd!hE1T}Ar=FsG{q@%?*`0UZ z89HWfnP*r>lD7qsLRd&*MJ{MK0%_Lz=Vsz3;C+)iHuC1-D`|Y>iv}x0nmI1~k$8YDTxde8A>pAc?FSun(40AQY^DEJhjx1U>8J0%|Nbkk zxB?7L47O%v}FTzYYLCOb)vIN}KH8qI63y%wp*AAkJryYGfmQ#oNo zkuHoJclMDDWy5N3d86P+;S=T5G#OwbmH~rdflFqu3S}nNBvq~zvLq74MB5-G`Ho_8 z@GiLE0%~R_p12oZe6c>H?@|6S0tt8R2O&l(J2El?xikMi{~z*?prZ`^qmMq?R^?xZ zGw1oi2OoU>_1Cp41)j4#&FPTftgx!`@>mRU>0}g)2(5vHhkwO)1)TYQZ^ql*2u!048MUD9|?2OB1hvA@|n6S0SL~Bz=erTMFd# z!N$mzcibru7_1V}OaW!29(m-E!wx%a`|Y>qUpKNMNA11$-uwOc-+%n^M~4HqOn_vS z!J9{4F(I6y4tXb!bKW_rsRSw*u_fV?5HP9s$ea8CoZh2jpbtC+&cTpaLJ}<`3M)xt zDE}Bqjt2IYl~`t0W@=h`k3IGnH*TCuf^rZVa=vcey6?XG?xT-BvX!VA{D+hzb0x~; z$&*W^(oHwrml~>+=`)vyj^NpZ`J|gz7uVHb<@-MoI$RS3MH!7M2H90E@ta*SxAi8Z

WvT#FP! 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 N&PR%}!H-$E{{iWQ^UVMN literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Sharpen.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Sharpen.miff new file mode 100644 index 0000000000000000000000000000000000000000..71ffaed63269d6677e23f326e91a0685beafc496 GIT binary patch literal 10051 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/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOT틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{uevANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiwx{{fm|Rb;F3?E>CNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1mdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%HcAd\;/L_>zz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2ʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(6=7;?7;+;';(6#IDUhMX]O39"FO)u_ij]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/hbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#mbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=3 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Shear.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Shear.miff new file mode 100644 index 0000000..49ee41c --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Shear.miff @@ -0,0 +1,14 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=True +columns=87 rows=78 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/-31.kgeQPO0/-51-82-:3-~yw,-,0/,50,81,80,80-HA>./1--.0.,2-)4.*5.,81-81-80-YROFIK+.1.--/,)0+(0,*2,+5.,70-7.,4-*4,)jdb.//.//-.-.+)-+),**/++1,+3,+3-*4,*6.+4-*1-'{yt12-11-11.1/,.,++)+*))-++/++0,+1,*3-+5.+3/*30)52+HE?PQL55/64/74051.2.+,)***+,*+-++/++0-,2-,3.,30+41+63-960A;0haW893994;83;7291.4.,.+,+*,+),*))+)*/,,0--1.+30,51-74/=7-E>2I@2LA2tiĹ893;<6>=7@=8A:7=5250.1//,+.,(,+(*,*+.-./-+1-,2.+41.83.>6.D;/H=.M@0YC3D4Ć}JJF782>>9B?:E?;D>9?95:643120)//)--**-,*.-+0,+.*)0,,40.:3/>5.B7-G<.KC3iE4A0A5UQ441995@?:FA?GB=FA;D>8@95:217./2--1.*0/+/-,/+)0+*1-,810<30>4/C7.F?3OD4s@.<,G2G<.D;2@9295/740862:4/=3,@5-?6/<3.<0.?1/A73I:5^709.A4E=??=?A:?-?,@,†x>:162,75->>4JF9NK7MJ;OJJIA9F=/E;0>80:5/:50>81B90F;0F;1A90<3-1-<81E61h7/=0A5DfgtqoVNRD:-@80=71:7.?9.E<0K>1L?3I=4A80=20>1/B2->2.H0*p8->4B5E-?,?+>.=,=+aRШ^VHNG:C=3<6.A:4PE7UG9c_pTMdA:=<71=71>90E<1M?/OA2N>4G:2A81?62@51L-0C+-K2)q;.A1A3F:@2?,>.>.>+>+=,=+<*?/@3vlἷ~WN@PH:F>3@92F@7SF5ZOTsqGCJ62(:6/?<6H@5OA0N>1J;1C:0?;2@92L86B40=3*S2)s:0<2>0@2>.=+<-=-=+=,<-;->.>3A4D7|B6|[O@YN?QG9I?3E@7ME4TF7jgJGT<:>=:0F>/N@/J?-J:0D91==1?<2p?>DGk>8S8,a6-;7;5@4?2=.=.<.;,:*;,1A1A5D;H;F7.943JEDcWGZN>YM=UI:OF:NG8SG/YRWZUB>GB=)HA/I>.B9+@609;1=>0DAHX<:E;E=?7A?B:A6@0>-<.:-:+9*:.>5D9E:HCQJPA7:6493162/51-XVSs[L<[M?4:A:YL;YM>eapdkPKYQEHd\sfc{GSR_@9<7;,8%=%<'9,>3C5@.?9><=4w=.x9*<1u:.A6I@LG\Vx[fX?=463,23./3.-2/00.5..;./c??\K7[K8ZJ9ZJ:[K<]M<]O3>=@?w?694IFSM|G:I?QIl_wwTZH:<0/1*.1,-2..3/21/2,-F21GAgyyk]L8\K7\L8\K:]K<^N<\O>YLGg`v|xgERAGEMDLDJ@7:%=*;)7+:1:/;,?0@3;179=>EOMQDlS?x[HpYzufeJXC57,-+(/.,.0.01.01.2.,U5+ST|bgPGi}{_N<^M;^M:]L:]L;^M=^O<^O;^NKg]{|vjUjF\>C>?<<@2B<>=>2<,;-;0:1:480;0;/6+4+.-83665/ODlaFugLnVj_xrw]\JTC5.,1**2,+0-+00-/1/7-,X@=smsLAsOE_qsw]N=_O?_O=^N;_M8^M:[O>]P=`M=aNVog~tJX<;7>C@@H>@D??A:>?8C78+5,4-81:492?65+.(.)1&5!7'L@YNVV-(%.&(/),1*01*0/)(clS|^`HH]?DKPXNXXRTI:]P@`SC`R@]O?_TQjgxxrqjoqklANAEABAG=:9CH0G>UWgppk`PE53*$)*')+-**/,((HM4x|m|pw_g[FD9QI=_RAaTAbWPiapwwz|tvu{xX\AQ>E@A?8:*?3<7B7:(:&:)90706+4"5"9&;2130-3&8$6(BaRmYlITX65*.%1)+.'*41*kuUtǢ{zTWN=<5VI<`UDibcupvzlsdlzzρpUV>F:;>3;*<.<8B==-:'9&7(4.206,8'8)6*51233/7-:*;0PH>2;':*@5BEANB37(5(7-2/,32/73;68-8,4224519,D;FC<*:(@7GEFJCQ@`?nCtIpZvILJ:-TM3imLjWn^wi}ox}x`rX-1'/1-><8VUZeeTS\^ssֵm\QQ87:/B8B:7-:)K>:-5-5/3,-%+++7*;1.8$5&10+03*>0MJA;:)=/ICGGFKI\EhHwJuTuXsFDNH4xuZzfm[n`mhusywhdZYN45.34-BE>VXk[[egy{vnkfWZ77;4RGJ>7*90@3:/6717/:+4'56&33,8)7.7-6)7&J>FF@89,D7H?JFOVG`JqN{PxRs[rfbz}tz{jg]hTIE8??4?C.MNI\Zvqpngq}b]soZY=;<3SE@52+;1>0446@"/$2)<,M2K>H4966=4?09'>0BALK:0<+@/B5MIS[RkRvXzRpVnptsqYjP\SDXO@PL9ON:SS@ig{z_pdWOUJf`\Y?9E9TE1(94;/3+9=CI-1%+(<>ZXiGY2>-094;15+97DCLE=.;(<+C8PN\gVpSuVrUhbphibu]yqde[LaXH]UD^TCa[Oxs~}zdlc[NnWEYVurrnIA>0<-@C=?727&2D;LH=77+7'8,I=/\Sfhdmpqouyra~uȿofXi`Qi`QjaRjaTjaVi`Qh_Lf]I^XIURE_VEj\Hj^Kj^Mw^KUDPPIE=0:&:)6+:+8-9.<*=1>@Yc_f080=VbdmRTRQIE=38*9)>4@:82929,G>qtlvkrioj{zQ\Bi`Qi`QlcTkaSl`Zk`[jaRibKg`IYTBMI8ZTAf_Jw_OYMM>;3522*7&8(4)9*8):-:*>0;5FHW]?A2;ERbk[cGD?40115/8-b`yu}mvWimk_sPiaQkbSkaSjaRlbVlbVlcRkbTkaTg_LSPEDIIN7375@9?8375>><3..1/05,F=uv}sSgRersm^ibRjcSibRjbSkbSkcQldPlbVlbSf^KNN=@F7BI3<13'-3-<0953528191641<7;5/2./11-6(^YtXmB]c}eʫibRkcSibRibRjbSkbSlcSlcTnbTmcTb]LII::C4AF3RCHF=/:*8+8*9*;+8'<2E<9*:(8(9+;/5.06*<'> 9+561:195::665.4,00//3'I>xYqC\VLf|KxZrФhcShcShcSibRjbSkbSkbSlcTmbSpaTi`S\VFEA18B*iK7ZLKF:,8(9*8*:+:)7'?6=/:)9*5*5,964=.=,<%:&828;59577655-6*0./21,<0trzTp?aENVhG@HHcfKE>4=2,i?5HEMLE@E?E>B;?8=,<,:2:=8<7;79;5>5LFGB=98385888969637*8&6'5,4*>8^fNm3:/;*<(:*<57978768;6=6:;49);)<$<$?5UfAf0C2B0>,>+=(:-966785:4888;>8;,<)<):$A9H\;fAg6C34'=>-BG*\qBfGiLqXtUsS{^vcǸ`gRefUhfWifWjeVmd[mgZhjṮcaLKKA~xvɳݏ<=ACDDFBD>B=<3?1<1;1;.<,:*:0<6<6=4=9<<=;=1;);(7$=6L_=b?Yk;@/0,/4RP-n|Rc|JbDjOkPfJaEVr=xigkWigXjfWldYmf[hkUkvle^gW礠MMABBBD?E=A:<0<1:3;1~;1;.9+;/=3B7A9=:?8:-;):&7%F>RaG]KTL=241,@?,pzJwc_AgHkLdH\EVr@Ph;xlgYlf[iiWeq_蹲YR@?A?D&WK5eʊxcGkIoPiHdJaH_xEɶwviemZậJ><8@>ATIXR^RrzUL\=9H,@F479-9@.[n>jFcFgFjNgKiIؿ̽n]C5E6A6>4~<0}:.|9/|;1{;2w:3t8/t8.u9/t9.r6,p5*n3(u<1P@RGTP^Xi_D2=)08/;>676/8:/JX9jHhHjKlOkOhHl>6=9?8<3~:1{9/|90z:3t;2n9/m7-o8-p8,o6-m3*k3(p9.MDSJQM\TofMZjAGT7w:1v7.v80s8/j8/i8.h7-j8-l7/k4,h3)g3'}D;SNUN^O^`EPf>[oDP^>EI/9:)8>.\rDtPpRoNnItPuUѫUE~9-pA6q?6q>4p;1o6-k7/h7/f7,f7-h7.j6.f3*`.$p8/SN[Ry^O_cIUkETi@BT.6@*:;.8;/K\:pNsPpLsNxVuW͵U=l=+o;3s?9p?7j<3l81k61g5/f6.g7.i60g5-_0&e5+MGwXLYSCIO@14>/06-37.8?/@G48>06;17:,Te;uPpQvWtYfNaKyfF4g@3i>3k<5j;3e<1c<2gB6gC4fF4{eTl\O78236,19,4;057305.4=09F43<0592CJ2fIuXvZiR^IdKi\BXG._I3`F6_D6]D4_G7Q=,[M9`O7odMnmZ8>306-27-46+38,280/9-5C23A0.4/8:-Rc9uWtZbL]GeJbJqkSVN2WN5TO9SL7\WANL6FI/VT8``CjpY=F6-4*07-16+16+/7,09*0;,6C24=012)>H.oUqW^G\EbJ_I_]FMO6OT;S]A>G,AG*ceGejP4@,16.17-17-05,/3-/3-/5-07-8A249+6<*bzRmXWxAZ}D`J_J}EN.GO/HO0UV8dcIBF35;14:139/17-.3,-2-.3-.1,/6.5>138*O^Ej_VxCUtA]}I_IiZs`cD]\BWS>?B48>47>46<128/.3-.3-,1+,2,.8/1>2@M;YpRHi=Nm=UrB_~JXvHtr^QO8CC5:>58>48>57;6382.3-*/)+2,+5-2>/>K6BT8Kf>Lh85:4/4.,1++2++5,0:,4@-@R7G_;UoG\xOZjU}8C5:A8:?89>8372+1+*/*-3,6?4:E3@P7RfF\rR>P=msk:B7:@86;6.3/,0,.1.9@77B1AM7[jSHVE]e]9B8270+//.408D55B-HVAKWIEMGELF2>.6H/7K2:K4AN>6@7|Gb<:L6;L57E5qmFZ@U`S \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/SigmoidalContrast.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/SigmoidalContrast.miff new file mode 100644 index 0000000..b93b35d --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/SigmoidalContrast.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:('%*(&.*'0+&2+%1*%0(%1)&0(%0(%/'$-%",$!-%"-%")% )& ,)"/,%1.'72'>7+B:,D9*G:*N9*r<,;+9-=55:48837'7%8%9#8#7&5$5#5"7&7+:+<.>1K2'2-+/*)/*'.)&+($''%('%+$%.#%I/0A?]k{imI@kKD\su{y{iSOL'&$('%-(%/)%0)$0($.'$0)%0)%0)&/&$,%",$".'#.&#+'"+(",)#.+%/-(60%=5*@7)A6&C8'F<+e=,8&4%?4>ALASTH$%'#%'&%%'%!'" %# $""$""&##&##&##'##'%%($$(%&'%"*&$*&#*%$+(&0*'4,'6,'9-%>1)@6/J4-Z/(x/%3'9+=1=8@9:'8$6%5'5%5#4#4$4&4*;/?2=8cZxQ`Q;:0/-#')"&)#%($%(''(&(*&'*&'%*,"$c^]~emSVl[mp{Z`J$'*#'*&&(%&%%#!$"##!# ""#$"#$"#"!!" !%#$&%&'$#($#&"!'##(%%0))4+*3*)6(&9*'9/+:2.C.*d/'5(6-9+"&/(!K' f1&2/1,7-:.9)6%2#3"t6!t0$q1%z8,?6G=_Oynzt{`c_`IbI,5("&#""!#$ #' %!QV@~fzf~ll}r~zliDO94=92=82?70=5,<3);2+;2+40(1-'1,'4/(:4(A5(H9*I8-C4,=2)92)54+?/(=B?A;2C@>17+;-=)8*6:;=t;1x2,4@=?NImS;[f@iLLT @!C8OFZSdbkfpZjQgI]>HK& 6+ ?8%`X2uVkVjSq_~z_}ZLZ?./).0)550:83>97@;6@;6B<4F:/B5(@4%>5'=3(91)4/)2/&61$=4'F7'H9(H6)C3)<2'65)/5(:8CW+-37-3(6+H&=$@(M,V2d2l9p?lTwUb\5+@;'t_۷cz`QcD++(--)00+54.<;1??6BA3FA.A=/F@B@81=3#;1%70(60+5/)61,851A9.I8%@7%C0);/,-5(87'A8,#,92. 5*9)8*8,0!)###(!.-1$NANJ9C793&=39<6@9J5O6d6n=uBkQwSWkk_چsk)(%'&$,+'01*67-?<3HC0FC,RQQ{wUMl>7H1,,.*-*!21&:5%C8'I8';3"2,!(,(:)%.43'4 36$5)3)1"2#7*+",$0&)#' -,1$7.;9966+1 5%=8>CLK\?4>/5#9%3 ."0(2,0*2+3*7/) % % * //- ;4OF6*22!8/@>?@>BHV>[BkKyRyNnLc[mCN籪<8-95+3.%-* 2-'>5/M?.Q>/WNf{bVKDq/2;21/KBGqWzCI4 12"3%4+3+.)614/0'<17,!!##*$*4 2"/%D@;811 6*JA=6GAJLM\OkGlNwQlTeQ`HMrkHA3F?2>8-71(5.(950F=-L<&QDLɬly\`GZHQDW@K36666-6'7*6,1'+#/'0'+!+16(03(-*(-,-+/#6'IB=A5+0#4%;*5%@5GBV\btIjTspw]mzs`OI9QG7OF7IA2C:,>4)=8/D?-L?&OGJũt9G473/8)>3591482=1. *#,)3'/!,./-!-#0&,*%-"()!-D9@AFC0&2 3 3"4'8+XOkjcmcnrplsy{9J+UI9UH9SF7MB2M?1G?4KB1QC,RJMܙꝨߊ؈e5I826;7>63?>69735)7(3#2&1++',&0"3#3.4111+-'/#05!6-8:NL?51!2"4%4&2"O?jf\c]jkn_iQmseRk=UG6TG6UG5RF4TD4QC7RD4TD0ND?_Zsuw‹zzbj{K]3>+7=6;G:?8-;3,):-3!120 ,#)+$+%)&0 6 (( 0 3*5,<..-!/-&',"-"B66)."2#/@6npq~pzqzO`<\}}cԵζұćϟUD4UD4VD4SA3TC3UD6XF4XI4UG9SDAXL_j`̠~n8?6#8148:B4/1 :030<2/3 0 , 1&, $! *. .4<)2(2#&0-??.,3.-"00#J?4+1)2+0#0%ggypF_7VXcJ{V\~J`SxdrxȽͽUC2UC2SC2SA1UC2WB4XC4XH3XH3ZG2ZC@\Qu{uʈ`u,C8>;8:?;83&08.03F=I9. ,".()')1%4"4%@&QJ^Vj0H(-/;.LG;81&/30!>:0++)((1), VQ{g{@\6NS\/`G_~jmlmlnVC/VC.VC.WD/WD1WD3XF5WI5WI5\F2^?6cWnsnCN7J5?456,3"6'0++#1 F99+2&/1*6'%#/3O^mGL2-.%2(0.A=3(0#0#0'B8+&&)%(*$,F=zSr7\8LAS)mUln{b~bg~`kXF2XF2XF2XF2XF2ZD/XG1OG9\RSl[jj_mmwt{_VFN19//:*2#?6:1.#. ,&d4_9?G]4pTx^s[tZy_z_zTdticZH5ZH7ZH6ZH5ZH5[I/VD1ZU\}{}nt{Ο¶оmKD9@B/12*/&A7bR8+*#)$5)/!%!--KRBJJOOU8:17%/BOlybtKG-+94=4,($2-7.+,"*'&*'%-!4+]u6^9_V3'DZ6sXz^lQpRwXxUuO\d`{OUF5ZI8ZK:[K;[K8VH:^S\uuu{^fyy޶x_icQT.2.+2)H9RA) 648/(% +"1-LQO]_l\c'/ .>LXbMU/+.,0*0(2-33.--#."(%',('1&0*uKm4_BU549B(d~LrRdDjJqTqMiF]=Gf,A\,M@0SD4ZK:]O<[L7bW]zxryWbitɜʿĄlf`f_xsc`<95-4):*4%?>A>/(.(1#25.29UcQX/+:A7>/1-.-)+(2'3+.-/0.,.%/ )#+-(',"<:ds3_8dF?KI4=:%HZ1eD`H!sZefAM44@$c~;f>\=gCiIlJjFtONF6OF7OG7OI5VK;[Q:]SCj^guf{m_jWQUQNKWO?bT>kZ@f_HTHK?2$,#/'/&."1!2$4#-1%4,@2:16144.0305*1"3%4-.2.20.1*1.0035803$3 0. STMOSK^C[w3ntSHW335&*+#3;)b?lBfFjKf?nCwNnQ^TC`UC`UC_UD`UFcZBdZ@cXFcWDbVA[T?JG5D@/LI6UT>ZZH\SBD,(5!2"1#0"/"2#5'-7!/"1',1.4.3-4.,012!6,10./0-4+6166830#2 2 /~2"KBMAVLkWqL^: *-0)/.'11(1;(cCuJmLmHlAwNuS[BdZIe[Je[Je[JdZIg]Mf]Le[Ie]De]@d]C[T>DB.8=,8@0;B6NF3RH<>2$/0!2!2 1!3'.10"3-8=63.)2-1%6"9#4 .!4-5/7.<1910+0"0 4!}3 u+9+L?TGSLSF9F# */64CF853 /2'08%dCtInImBxO}]]A[De[Je[Je[Jf\Kf\JgZTgZZg\Og\Mg\Ri\Kg]GTO<<>04;--;)7;!T>WSBF3(1#4(5)6*826+;+@9A==95'>*;)x9%2#4$5$0"2&3(7)4&."/$4$3"z3$q1"t- @3H:LGOQlZbtA?O,XgJCJ-2300'0:'eDuImGpI}[bG]B]Fe[Je[JdZIi^Mg]Lj]Qi]Ni_Hi_Ii]Oj]Nj^Md\JOI8=9)09 C868GHejGB;4=7@;A>?CDCA@9;:9855(9*4)2+3*~3)y3'y3#z2#0$0$0 2"4$0#z+ x.$m,!t5)J8M?JFULQR8H`5[t>;Q%.8"24*/1'08%Zx9wJmJuSfLV?cB\Ae[Jf\Ki]Mf\Kf\Kg]Lg]Lg]Ki^Li^Mm]Km\NbZKb\IZS;98pF4=;:;HGDD;:81=3<=8=;=<;96:6941'5'4+0*3'3&2%{2&{2'z1)z0'{1&y2&w1's0&p.#l,"i* t8.MDJFNFx`HTkBNj<>7>5<65,5$~6'1&2#2#2$~2'~2(z1(x0'u1't1(r2&n.%k+#g,!`)q5*KGSKZKZV@=L3*7!3=(:B.19(,3&,1-/0$DQ+pLzX[AT~;\A\CR{?d]Ke]Kg^Le]Ke]Kf]Lg]Li^Mi^Mg]K`WL{ݥ{;B*-7#2/*"(#T76RN128<:<9:;7=3:2:03$5$4#2#}1%}1'}2({2)u2+q0'm.$l0%k/#k.'g,$c+"[&m0'NJyVHGH6-8)'-$++(&+#,6)3C0(6&%*'-,#9F'qSkMMs7T{=ZDZAQu@d^Ld^Ld^Ld^Ld^Lf^Li^Mj_Nj_Ni]Jif`ԢCH)5.!H@>nn52848867:584;43)5'~4$2&z1'{1(z4+y4,m3)g0%e/%d0%d0&g/(e.%\( S#j5,tMG?8+&1!)4&/2*.0.*0(%1".<*1@.).$$%8B)yjXFJl4Oq:Vx?]DJf=c_Lc_Kc_Kc_Kb_Ke^Ki^Nj_Nj_Lf\J___pkQ9B4幣H90(94:5=8734+5+~4)~2&{1'{1(y1*t0(f0'd0'b/$`/%`/$e.(e/(b.&d3*kD:00+),$+/%-.#+/!'1#(1"&0"'0$09*3;*()]G;O3d`Od`Qd`Qd`Qd`Qe`Og_Tk`QdbJkidmqQlzffX0#8.@1=.:/7.3*}1*w0's/&q/&l-#f/(d/(b-'c.'e/(i/)i4'c>,nZkgU!* )/&(/%)."(-$'+%'+%',&&)$&-&*7,+8+8F2AR8:N0Fc8?]1RpBWwM,<-d`Od`Od`Od`Od`Oc`Ng_Uk_RcdI}~ڿϩ=,1&412385m:4n8.n7-l7,f4*d2)n.*j-)f/'c1)c6,b>1^B-ZF-eJS>") (/$)/%(.$'+$%*%&+%%*$$(#$+$!,%%0%*6%*6".;&'1; =A#mmKV[?*1 /5-/5+/6,06+04-/3..3-*/)&+%$)# & "&"$)$'*'5<55B0)7 :I4=I<'1(__Lc_NdcQe`QdbQg`Ok_VidT_gK_ulھǻŭdL3R<$WC*VD,OH2JG/FH0XcC8D(5="?B#ecB[S<>>-27-26-06,17-180393261282150/3.(.*$)$#'&!%&!+!.B*1D+0A)3C0'3&VcHZeKcgQedRibRicSgbUdcS`iS{ȵƾjcCKC%NH*LH+IG,DH.@H-=G&DL(W`8\`>OO5QM4NK1FA.;:-47-09-0;-19/19.2:/3;04=43=218--5..<'?[-?]42F08K2@V9,:) \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Solarize.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Solarize.miff new file mode 100644 index 0000000000000000000000000000000000000000..bc9d84eda60f1772780c6f7e65c1dcc5985027db GIT binary patch literal 10051 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.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-HB?=>?8A.@+?->-?+>*>,=-<-<.@/B2A9HEWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/?4/B6.G;3K>6W:3m7.:.?2D8E>GAC3@->-=/=-=,<+<,<-<0@5E9G=PJpfuVcUCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++1..921<31=20@2/B62D:5M72i7/=0?5B5E9E9?0>,<,;-<-:+9*9+;/A8G@GAVQnixeOWD;?201(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*0+)4-*70,<3/<2/<0.?0.>4.:80F2,c5+~>0@2=/B3>26/E9/G;2C:1>5/=30A40J.0@0-D2(a6,<9?2|;/w=/~9/B>ROUKmU@jaFgOaXFS=SIZ^eginlwpr~oi]wOGa;7I1-4/'0.';'*C*)TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FA4D:1@71?82J96V97Q:.k<1=5A:D6?4??B@y@8;;PF`J}eJeYJN>EBGCN1F.H0N5W;^BgFlHoKoLiMaDK^61C7*JC/f`HC>JD:;@=3XIWOHM@E=9<.B6B?AEAJBO@T>]>i>pBtFsKoWwZtQ[pI@`XFsӰg{eWgL330551883=<6DC9GG>JI;MI6IE8LFEG>4E;-B9/>82;7/?:/I>0OA0O>1H;1@<1==2DH2710//*5%5!8*A7C>C@?7<,:)=0C;GEGIFJGPJ[E_GiKtL|M{PwRsKleyij҅un10-/.,43/892>?5GD;OK8NL6[Z\ssa[nJBF>84<60<71?;7H@5O@.K<0E82:=0oB9?C7(=(7*>2@2>26*4,0*2%5!6%;0IBOG@6:&9';-A6OFIAG@NIPPRYSbSkQpQuVyVtUmThdtY_Ύ:8163-30+74,<;2IA6VJ9UK@mmӇd`D?F63(86,@<0K@1K?-E7.<72I<1E;6'>';*:-<-=14+4+/)1(6"9%9)7-JDGF@;;08+;,>-?-<,@2C8G?VSaegtWoTq[vet_n]kWdPVtrD@5A=3;6-52(:5/G>7TG6XJBqo吝gfCAJ;97B=+IA0D=196.;2.6;<,;%=-;19-;0<32(,(.*2)6*8-:-B5MFHILKF?>2:):);+<-<.;-=.QCbZlkeleojqtsmtq||~wfiYLOI;MG:F@5?90=60B>8OE4VG-B7;07-9.9,8)A5YTqtqzmwltnsemarsx|oK[,:,9193<78.?0943531-50.7':(80531,6(8(:-F>C=83512120807+C:ec|~wr}YjKbdkqgSǮ[PA[OAYM?TJ:RF8LF:QI6UK=mm姨hoYM^|JPlbHI:%:+<091927/4%:(7/8-4,5/=09)9184:37(8%:(8,=4H?:41./1.1//2+4%I@qozm}UjE^RZar\Էþݽ[N>ZN>[N=XMVK9XM@liΜnj\tMVM^FQA@=.>0;14,8/4(5"6(7+9#7*<3;4@>JGEA@8;/;1852=4>7=975.3,10.2//2*:-UKz`xLkA]DOXa7e~Mx[qZfX{p{ŖҶ[L<[L<\L[M;YM>^Xb{{җ甝ڕݫbu@GACB>>?=6A59.4.:.5%8%:3815&70053-C6A;?=GDD>D;>751486:665.6+4+0//30/6,90ggy\tCf=aALZX8fQ{dlnmnswŵ[K:[K:YK:YI9[K;\K=^M<]O>ZOJf_s{x{jFV?B==B7?@;;C97)5/7/5+9+38*2531:193(2 A:MKCB85:58291937678656/7*5)2.241.7->:wXs@eAc=@]V=dNw`}h~j}fimlrÿ\K7\K6\K6\K7\L:]K<^L<^O;]N>]NOh_~Š{ycIZ8HA??F>;CC><>3<-9.61200/,9!80=IW8F6)C:UY_iOQ84524161:3<48555436-8(8&6)5,4*?:U\TnAhD]CCGF/YnGw`w`s]w`{e}f~bn^M:^M:^M:^M9^M:^L:^N=]P=^O<`L?`RcxqkBD:;B>CL@>D>;8>1<*:(6,13,/*.62MVgMT:6?<]feoY`BF27)7#8-868:59456567.8(7%8&9&9-T\Pk9d@]vLDKI4HO4iStYmSrXx_z^zYgtlg_O=_O?_O>_O<_N<_M7]N:XPDaUOeQHdPSrnk9I?6>=AH>=?3;6B6:'9&7'7-2(+**9-N@\\g?B386A8E>H>E0>'>%<$:,:6885:879798/9):'<"=+GLGh?g;TP6,ED4@>)O^8lOgIlQtZuVsRyZzbd{U[M=_P@_RB`QB`Q?_P;]N?_[_qlrg}mevru}P]?JC@AE?=:+A7=9?1:'8'5*5/05+:&5%77D>C/756952/-6+=.;387975878;6;879+=*;':%HIBf8c>RF11/4#DC)S[7bxJcDfJnUlOfJ`EOk6Jb4TH8YL<_RBaUD`S@`TNf]hsry{zxquxߢnoLU>K>BA<;-:)=8B?L?;,4*6125(3!.&+,*>@RVY`ajZcQQA42'17/=6;*<)8#?;F_BaBE44275*X^8fxaaDdDkNhI`G[~EYqC[sDDB6JE<\M>`S?cZNmerxuuyjpgovwϕҩijj\MU:B;9>1<,;160:.I;C6;/753<9BNL>;9285897;;:<95?7<2<5:2;0<0:099:?UT@:787792:8<<>3;)8$B9TZSUgS?>E'\fAiLJkaElIpQiHhLeJfHgG*0&+0+:85GD=\]fccXWY[lnӒݠܴǰxcb^HJ:67/D:YMNA:/2+2-<29-1&.'2+7,:+>.=/:.8*6)2):697B:<28868:4=8>=:/:(8$;,URYR{eIfxDqVej^qMUo:hEiJfEhMfLfGkJ.2&+.(01+;=1NPRXXs`_st~ނއ׋АЗԝ΢ËurrkelgccEG97:2G;RDN@4)=8C@GC>9808/9-9)9*:)9(7*92:8<5:*;+<687<5@8:79,;)8%;,SJYPkXwWwXYjBU\B?H3Pb7iEdFgFkNjOfEpP@>0>=4<=2@D+KM/THYPcUoXVM?VN?UO1>99;5;8.>)=(8+;2?2:-7,<+|;,u8)B4QFWR]Q;G*3<1>A798-9<0Oa=oLnOmQkHqKxUqWcZKe[Ke[Kd[LdZLf]If]Ih_Vodgrfpmcpfatokwowkusegl^Vc^Lb]He]Hg]DZIXTZ`edWPD88(9&9(6+5*8):(;0@8A7E9:96<6794<,=+=+9+:.;.9*:,8*z8,s7+H:QFUSm^SaF7?H:KK;rQBUNFE=7;+9(9)9*9*9)9)9);.:+;)A0HAGDB?=0@2;291;/:-}:.|:0z8/x9/v:/r7-n4*h2'xA7TNXOlcLTiDOb<;F)8<-8;17<-Uh=5C=E>GAFFCGDFDECAB>C=B;<2=-<.:,:,~9.}:0z:2t90o6,m8-m7.k5,d1(i4*RMqYLGJ:7>137.6=/;E45?039268-JU2rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRf^SytmƧeeS3eA7E/38035108.7E44B1.4/44+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlid¾x|_JR9:?-:7103.I<:XX}|_]GF?A@CABAAA?C=A;B;=4<0<-:.{9/|90z:2r91j8/g7,f7-g7.i7/e5,f:0^D=@<318+39-590380/9,4A09G527-,-"@J1zm^MQo:?B=>7<3=2~;0|9/z8/x80s7.j8/g7/f6.g7.k71j;0nK=pZM79115-37,36*07+08+.8*/8,8A2;C201$DM:ojGj=Lk>4C9F:C7A6>5;2z92v90r9/n7.l70j60h6/g80i;3i@3eG4t`]_O+3*17-16+05,/3-/3-/4..1,.5.2?43@3@M:IX@BU8Mg@Gb9XrJ]xT4D5heVheVheVheVheVgeUkd[ndXghP}~ؽܼygC4<1=9;;@=pB-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupȴ{eJ99-8,u>1q>5r>8r@:o?8m=6o:5j;3b?3\B4OB/TQ8][>gkPDO929.28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoɪiRuD.e6#g5+j;1k?4h?3f@4`C6[F5^S?RP9=D*BG*ghJ_bH6=*7=47=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BPF+GJ+hfI`YDFF5:?5:>58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾysXTN0UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTP96cR$mOB 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 C-uWm1 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Wave.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Wave.miff new file mode 100644 index 0000000..0523abd --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Wave.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=96 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x96+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/-/.,<:8,,,0/-HEB,-/,-+50-SNJ,/2+-/0/,71-[VQ.0.+/2.--2.+81,`[W23-//-..0/-)3-)80,c][}{x78234-/1.-.,0*'3.*6/,f`]YWS89378243.11.-+).+(1-+81-d^\osbYYP6719:49838512/,,**-**3-+81-`ZXQZN^cQ330681>>8<948502.,+)+-**3,+81.YRPoj|bckMTRptZdL10-551==8@>9?<791.0,*)((/++3-,7.,LECd]LB]==Ns|Q]E:81/.,883B@;C?:@867/,,)*+*+/++3,+4-*=52rvK?k?4YWdiyuMWDD@563-43/>=7FA>E@;?732-,,+,,*+/++1,+4,*5-*|clH=}TUkqmNXCOI;@=330+993DC:HC>D?9;511//*)-,*+/++1,)6/+5-*ǜak}kqej}jfR]FWN?LG::5-75-?@6GF>GC=C>8:54,-/+(,+))/--3-,6.+2.(GBWZ}ПĘ~vvve`VeK[PAVM?E?452)<<3GE[OAOH:>8/:60IB7NK9LH7LA7C;47/01).+()-+,0-.2.+30+41+NKEJDE3*,=0.C-$ge_xrni~|[LXM?IA3<60G>7TJ9MK4JD7I=1B918.//*,,*).-./-*30,40,63-96/0/-5/.1.-1-.3*+coOu|kpd{x˳[K:[L<[N=SI9D;1B=8TH7RI9USPLFEG<.B9361.1.*.-+/,+1-,3/+52-750?9.wqiifc.0-00.120/1.0,2.(%ZdA}il]rd¹\K7[K:\L2JB461.21--2//3/02.00,1*1*& Z_JhWmY^M:\K6YK:YJ;YK;LF;LG5TD0_XlsoE;+E;0<8063.22/.--/+)/++30.93-@8.G>1K@0aVHĽMHG72/62..3.,20//-0.+1,.,)/61)jtTp__O=^M:\K6YI9ZK;UJ>QI8SF.XNXߤXQgC9-A9195/7404312.*3,)1--820=5.@6-F;.K@/RB2aSٸ׹mYO:5493162/14/-1-/.-0+*2)/*+/4(+YS:}e[M=_O?^M:\L7[K:ZL>WL;VJ3VNQǫF?N?80<7195/:72;40:0+80*920<31>4/B7-HޕӔM?G:F7,:5493.22,.0+1-+0*+/(,*+,4(,E4+meGTH8_P@_O>^M:]L9]J<]M5.=41;21@3-F91FC6XD4?-<-F4>9375+/1)-)'0(*-&)**)+/'=/)GA.ʺDB6YL<_RB_O=^M:]L;^K<]O;VMJqp:6.;5/>90D1F;1@80;1-=0.B3/F<6R=5h;-9(F7EEBE-?3@6GCj^S_RIJ=;?265-2))+&%0&$5/'N.(U:/fWHʾý47-KE<_RB`RB_O<_L8^M=^O;ZNBifڥUQj864<91B=6M?/OA2M?4F<3=5-;/.>/.@61D:6W71z7-?1F;E@.=,=+;-?/C3C=f^n}lVfNL[EFOA7A395'o9=IUV_RZg\ƾϴϦ*0&;;4\M>bUD`Q?`O7^N:]P=]O<[PR|}祭LHf;93A=1IA5OA0P?3J<4B80=30<1/@2,790D50i7/<0@3E:B?B?A0@*?->-?,>)>,=-<-<1C6G;NJzvx__bb_{_chPPZLgZxY|qVT͚đtuq.2&,0+PE;`S?`S?]O@\L9XN@]P=^N=bYmqkFBTA=*K@0P@-L>/K;2E:1@81?52B4/N+.>0-P-'w;.?4A3D:H?A0@,>-=/=-=+<+;+;.>5G?HBncv|rl}vp\mGpHoWwFfixMUi`wqozg}Z@>0+.(;86WM=d]TdZ\aVX]XZ`VSaM:_LMohΓ֨`b:;:CC.M@0F=,K91D:/@;1=;3@83E33D./80)\4*}?0@1>0E8?3?,=+;-<-;,9)9*~:/D:KDUQq|~qloSm:oDvKsTtQgZia\PP=̮|lqgikOg;UM>=<312,GD=gdivovrrqwtl\cbH@bY{}{ɘꇑSWp;:65+A74:=18=0[;6CGc<9<6*K2'h8.:7:2A3?3=/=.?/;<1;>2\^joluruyx|}wk_hf\r|w~qnup|LZcKOZXpBLR273;7/??/D@JZ?AB9A:q:0=;?=A8A6A2>-:+;*v>);0B8vD6uO?u_IqXCR-M9P1L6S@D+NQS_`XXbeckinpsouoMZSpPdBPLTcuPTVQ;47;D:833-;$D=D7?4C9D7?5A7:0y;/u>.}4+NKYTpQ=dbEkRNU7EEO5E;HBOCXDaKnOrWwrwntcyrv`}]~m|fzdy]nO[Cc{GfFi`Qi`QdZJSO:LM=YWrYX[]fhjtxy{Ã貇hv3D6@-?2>ABEwC9y:47E?E==B:<>EH=)<(@,;&>,<+7)=2B3=,?3=68><:+=.FBGHIJQTXaguaoeoorXfA^ouLhRmu`rXtZjMbHeJfGoOi`Qi`Qi`Qh_PcYK^VBges傅剉ݜ޿޷SW@KB>=@CM@F?8F<>?>3;';*;*6*:0;29+<-@2=17)1+++0)6%5!9,KAIFA?=/:)@7KGE@LENK]\nmciiss|Nd>WQ]4q[ycoVmQoVhHhLeKfEuUhaQjaRh_PjaRg^Of]Hc[QÐۏӦξhYFS?EAFBI?@?7GE=A:;?3>1<0<3:29381:0=26-4+7.1+/(5 4!8+A9PI>3:#9(>2L@>0D8B5ZOmknxu~qIa?TK]6s[zahLgKlOjHgMhNkKrWhbRibRlbTlcTjaQjaRg^Irj|܁Ӄˋ΢ழeML:C=>B><3;+C;99>;?7D8;/9/6.61>8;6:1@83)-(-(2(7!8#6)>5OJC?:'8*<-@.;*rNeHjJjIvSgMbMheVgdRhcSibRibRkbTlaWkaUiaLh^Pa\g|tcwga\keSV939,E:9463LD@.;(9&8(6.304.7'8%8*6+5+8.42-5,/3(9&C9ACNJ=2I==29072904&MDk}>cI\KI5>='iuLs_]=lIaEmQnI|_bJaJheVheWgdRhcSibRjbSkbSlcQkaRhaH_YJ\Y\zpv{t{Yc]XO[Qur=@70H?E<4+;*OA7(6(4'7-20-31/5168989%9!3&5/9-7&9)95/15)7+QG:341/03-4%G;[t=eMIGG6IH)kV`=jFiLoPwSkRfJ]GheVheVheWgdRhcSjbSkbSkbQlcQkaUgaJRO?^WIn_Vl`YmYO^]JtVE]Uig<9>5dV;/6'D:?16,604/3+,%***5#<(11(8(;2<4B6;/5.:64*9&8*GB61/1-10.4'<3{Hk@fA8'59$SȑI_7g~CoJoRpK|^^IeLY}GgdUheVheVheVfdRjcSkbSkbSlcRlbVkaQ^YEMI8eZFlZGa]Hc^Hh\CTUvr]Z<4M@K=2+3-D6;.7928.7-:*5)<?-<>F1:0:,.:5JI<9:17$:&8,J@2,10.2/-7+93lx:d>T&0%=E%Ƃzhk^Hi^Lh]Kh]DWQdj}UP;1N>1'62>2:,03GC@7<61<6?635*0-040/4)V]>eC_262H2(hdoN45-9C0hKwPpQs[ZC_KaKFZ=_iRhgWifWifWgeUkdYmdUmdUkbRnaTpaUgaPEF8?G8VYJ]TVJM=NLYWYO;,8#;*B>HD3)-'4/LPHNDFBE?C>B783.OJPSJHLLC?D;51/:695+6)1+424*8-Ul6fBB07&pYeuJ9:.8908@-iKxQw[cLZ|E]{HbN7H6gkWieWifWieVkd[neWmdSlbQf^Sg[Qf_RWQA=C4?H:wXKMJ<.5.85717&;%;)9.:080606+92RWT^\dIL8>-7JVozeuNJ53=8<4:5::646-8'5'6+:%D@BfD`A=+R]3vZ>D4:8,79/8B/_xAtT{^VwAWuCXvF^zS.;0ihXhfWjeVlc\ndXifQjaQkhb|wrohidTIE46B.KH3SN505+3-3*7&:'8+4*:+8,8/;*;(?9DL`k^e06)7FS^fRY735391:26567527)9&6$:$<&MV>^XSFT-k0>%DF;<;&88/8?,Vc=rSpURp=Nk+8(:-:)?0=488V[TV71AH?F79463222:2<475365/7)9'9'<"6)RdNWaLsSM\>5=9KP9:;*6:/89)KW3sY`NMlGBZW<19(8,6*;&9,7)=+;)F:9*:,:/91HBF=5$/0(:'?:#808:5;45449728*;)=*8#GAU`YRkXn~U+7'ZfO=F.:<24:277,AM/zlJm?Mh?H^<\jTHSF/;.lf[lhZfkSowsVF4CBPPNQ9*8*8*8):,;*8'2:/2*/7+=*>%:(95;96:7786;:58)<);(6$WXTP\S_QQ^8JZ6FY17;+8<127343*@J1ojCW9FY<@N6HUA=L;3@0igYdkRiwoheQV?1CDeiC;9*:*8):+<,5#;2IB9(:(9(5(8,;16;1?-;36687:75869;7<59=7;+;'8%7(SLWKYSiZ\oD]sD:E)9>/2<..3.-."DM:KZB7E/6B/4A*:K3EX?elWewoÿ>E/I>1LJMK@8=1;,9)P8we6?+>:/HBC@E>B9=1=36=%7*?4?9>8<997:895GGZXC=:79385759988<=;1:(:(y4"C6OCRN\SYhGFZ99C/6?28F49E48B32?22>-7@5=D<7J3:M7ʪHM0:71H:1GD@:G?HDB@=0='8*:27<7<8;6::7<09*;-<56:6:86:2<8>>>78)<)y:)v5'K=SFSMwdNKZ?2:,/4,.:+1<.3;0/<2-7--5,/3/+5+D^:ڻnjS>9,::6nA@FJB;EEEIJGE;G@C>AD=;6479729'9&:)>49877:5@6@9849*:){;,r7*v<0RDQLZO[ZF5=045328/.8*.3,-4-*4,*3,,1,)-.D[4ԷprWGQBmidЉJHDAAEDFGFACECD@=0A2>3;-=*A+<'6)<5=6?5@4:/7-;,}6)y6,n3(v@5SMXQhWI5@159038108*/4.-0+,2,*1**.*+0.5C/޿¬|w㘒:;CDDDECA>B?@==0C2@1{?/:,<,=,8*:.;/=0:+9*<,}8,v5*o4*i2&s=3SO|\O?E41;.48+/6,/3--2,+/*+0+*0+.3-?G@ʹ̺kk?ABDDCF?D=B<9/>0<293;2~;1z;/z;+{:+8-8-8+:-y9/t8.p4+k4)c0%p9/UPMC608+56+16+.3-.3-,1+-2,1603;4Z`Vǿf]@=AAC?E?C.:-:+:+:,~:/~:0z90w8/t8.q8.n7+m6/j5-a0'_1&nJ@36/17.07-06,/4,2617;69?9:A8KAA8:>9:B7ӣ8,A9F>?;<2=1~<-:.{9/|90{<3z<4o;1j8.h7-f7-e7,j60k:/gE4vcU\I-3*28.5;18>39?7:A9T[RƞC5E7E6@6>4<1~:/|9/|90z92v80j8/h8/f6-f6.i70k:3gD2_M5y|d7D/4916<27>49?58B6ʖD6=9=:?9}=5{:3x8/u7.s7.o5+k70i60h6/g80g=4bH9`R:]\?gnT2:(8>5:>5:>4IQGŌu?/70<5pB:q@6q?5o?4j<2h:1q62m62g:0a<2R;,OM5OO3ooQ^]FCD3AB5BB5չ`L|?.l>.p<5s?9sA;o?8n=6o:4i=4_A3cR@FE/:C(FJ+igJ]WASP8|DZaOtF:j:1l?4i>4g?2aC7[G6TK6`dJ@L0DL/VY:WW>ì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 az5aUefJdHrCeKx;ZQGXl_NL8w;NR literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_prog_idat_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_prog_idat_tmp.miff new file mode 100644 index 0000000000000000000000000000000000000000..795fcdbd9a6b53001da12e645d3ada091fc1182d GIT binary patch literal 26037 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 az5aUefJdHrCeKx;ZQGXl_NL8w;NR literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_prog_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_prog_tmp.miff new file mode 100644 index 0000000..0ea6fd6 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_prog_tmp.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:......//////111111333333555555555555444444444444222222222222111111111111000000......,,,,,,,,,,,,111111222222444444999999>>>>>>BBBBBBCCCCCCCCCCCC@@@@@@HHHHHHPPPPPPXXXXXXccccccoooooottttttrrrrrrvvvvvvttttttnnnnnneeeeeeaaaaaaaaaaaa]]]]]]XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXbbbbbbmmmmmm[[[[[[@@@@@@333333555555222222111111333333//////))))))......))))))??????^^^^^^uuuuuussssssSSSSSSTTTTTTwwwwwwvvvvvvOOOOOO......//////111111333333333333333333222222222222111111111111111111111111000000//////............111111000000111111555555999999<<<<<<============BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttuuuuuurrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[YYYYYYTTTTTTRRRRRRSSSSSSTTTTTTWWWWWW______gggggg\\\\\\@@@@@@111111555555666666666666555555------333333333333,,,,,,777777IIIIIIiiiiiiuuuuuu@@@@@@??????______uuuuuuVVVVVV------......000000111111111111000000//////......////////////////////////////////////////////////111111000000//////111111555555777777888888888888AAAAAADDDDDDEEEEEEHHHHHHQQQQQQaaaaaammmmmmqqqqqqvvvvvvqqqqqqffffffZZZZZZWWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF222222333333444444555555444444++++++222222111111......000000333333^^^^^^zzzzzzLLLLLL999999::::::UUUUUUIIIIII::::::,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,,,,,,,------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiirrrrrrnnnnnnccccccXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRROOOOOOOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbssssssiiiiiimmmmmmkkkkkk,,,,,,------............------,,,,,,******))))))((((((((((((((((((((((((((((((******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^VVVVVVTTTTTTUUUUUURRRRRRNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------------222222111111++++++eeeeeeuuuuuu//////000000111111111111000000//////------,,,,,,************))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444000000666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTTTTTTTVVVVVVTTTTTTNNNNNNEEEEEEHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV777777''''''))))))++++++......------''''''%%%%%%&&&&&&ZZZZZZúooooooJJJJJJ333333444444555555666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999666666444444333333777777888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuXXXXXX>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWW^^^^^^777777888888999999::::::::::::999999888888777777666666555555333333111111111111222222444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[[[[[[[eeeeeeqqqqqq~~~~~~]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||wwwwwwSSSSSS888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>FFFFFFFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______XXXXXXZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaawwwwwwyyyyyyoooooowwwwww{{{{{{||||||xxxxxxbbbbbb999999555555777777]]]]]]yyyyyyppppppRRRRRR444444777777<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa[[[[[[______aaaaaa^^^^^^````````````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppvvvvvv{{{{{{}}}}}}~~~~~~kkkkkk\\\\\\LLLLLL~~~~~~ǬqqqqqqZZZZZZ111111222222666666<<<<<>>>>>;;;;;;FFFFFF\\\\\\ccccccUUUUUURRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddppppppttttttxxxxxxyyyyyyyyyyyy||||||~~~~~~mmmmmmԌ111111000000111111777777??????FFFFFFHHHHHHHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC999999555555333333111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX[[[[[[bbbbbbddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddiiiiiippppppuuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{}}}}}}~~~~~~~~~~~~vvvvvv888888333333000000222222999999BBBBBBHHHHHHJJJJJJccccccrrrrrrSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~ooooooaaaaaaYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{rrrrrrJJJJJJFFFFFFAAAAAA;;;;;;999999======DDDDDDIIIIIIXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddaaaaaacccccciiiiiilllllljjjjjjhhhhhhhhhhhhppppppbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvwwwwwwTTTTTTOOOOOOMMMMMMIIIIIIBBBBBB============BBBBBBHHHHHHTTTTTTxxxxxxssssssjjjjjj^^^^^^ffffff{{{{{{iiiiiimmmmmmiiiiii``````^^^^^^ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttkkkkkklllllldddddd^^^^^^ZZZZZZ\\\\\\llllllGGGGGGIIIIIIOOOOOOPPPPPPJJJJJJHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqppppppjjjjjjkkkkkkffffff``````cccccclllllljjjjjjbbbbbbffffff]]]]]]ffffffppppppeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv{{{{{{vvvvvv]]]]]]aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvrrrrrrUUUUUUrrrrrrooooooxxxxxxzzzzzzjjjjjjbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````bbbbbbaaaaaagggggglllllliiiiii````````````UUUUUU^^^^^^hhhhhh¨PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQRRRRRRPPPPPPKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddiiiiiixxxxxxyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnngggggg``````cccccchhhhhhiiiiiippppppppppppddddddqqqqqqyyyyyytttttthhhhhhaaaaaa^^^^^^ggggggwwwwwwddddddeeeeee\\\\\\______aaaaaa~~~~~~||||||uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJHHHHHHIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUWWWWWWNNNNNNbbbbbbzzzzzzoooooommmmmmrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyynnnnnnggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhffffffwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}}}}}}}qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPKKKKKKLLLLLLOOOOOO]]]]]]ffffffbbbbbbwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______oooooorrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhooooooeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzssssssmmmmmmppppppooooooppppppwwwwwwbbbbbbiiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWWOOOOOOOOOOOOQQQQQQRRRRRROOOOOOLLLLLLTTTTTT^^^^^^xxxxxxuuuuuurrrrrrssssssllllllbbbbbbiiiiiittttttqqqqqqaaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkffffffiiiiiikkkkkkeeeeeeeeeeeehhhhhhllllllllllll``````ffffffrrrrrrBBBBBBJJJJJJzzzzzzPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^aaaaaassssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbddddddpppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmjjjjjj______``````uuuuuuvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{[[[[[[OOOOOOMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddddddddeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllggggggiiiiiiggggggjjjjjjggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooo{{{{{{zzzzzzrrrrrrggggggeeeeeekkkkkk<<<<<>>>>>BBBBBBRRRRRRkkkkkkiiiiii^^^^^^ffffffjjjjjjZZZZZZRRRRRRqqqqqqkkkkkkZZZZZZbbbbbbccccccddddddeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]qqqqqqhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmjjjjjjkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{FFFFFF------hhhhhhxxxxxx{{{{{{~~~~~~yyyyyyttttttttttttxxxxxx//////888888111111>>>>>>____________``````gggggg______[[[[[[pppppp{{{{{{cccccccccccceeeeeeddddddeeeeeeiiiiiiiiiiiieeeeeeccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllqqqqqqlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmnnnnnnjjjjjjbbbbbbaaaaaaddddddaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz||||||zzzzzzxxxxxxvvvvvvwwwwwwyyyyyy......444444++++++444444TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmwwwwww}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~xxxxxxwwwwwwxxxxxx{{{{{{999999======888888======NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______YYYYYY[[[[[[bbbbbbbbbbbb[[[[[[iiiiiillllllaaaaaaffffffeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuunnnnnnkkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUkkkkkkoooooojjjjjj777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||NNNNNNOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffmmmmmmbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffnnnnnnaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooommmmmmiiiiiibbbbbbffffffkkkkkkggggggmmmmmmllllllkkkkkkjjjjjjnnnnnnnnnnnnddddddYYYYYYZZZZZZHHHHHHVVVVVVrrrrrrwwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY______dddddd____________cccccc______cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccaaaaaaqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssiiiiiieeeeee^^^^^^UUUUUU______mmmmmmoooooonnnnnnmmmmmmjjjjjjiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX999999UUUUUUqqqqqqWWWWWWooooooxxxxxx``````))))))......777777::::::>>>>>>pppppp``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXhhhhhh______UUUUUUIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkppppppiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWWZZZZZZ______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQPPPPPPMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{qqqqqqnnnnnn````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWSSSSSSQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF>>>>>>222222<<<<<>>>>>EEEEEE666666000000111111GGGGGGeeeeeehhhhhhyyyyyyjjjjjjggggggbbbbbbbbbbbbbbbbbbccccccccccccccccccddddddddddddkkkkkkaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@777777KKKKKKVVVVVVKKKKKK======::::::>>>>>>>>>>>>******333333<<<<<<000000444444444444CCCCCCtttttt``````aaaaaappppppnnnnnn______bbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeeiiiiii333333nnnnnn^^^^^^hhhhhhppppppllllll______TTTTTTSSSSSSPPPPPPMMMMMMJJJJJJJJJJJJIIIIIIJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMBBBBBB111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<^^^^^^______XXXXXXddddddssssssYYYYYYddddddeeeeeeeeeeeeeeeeeeddddddddddddffffffhhhhhheeeeeerrrrrrzzzzzzttttttՀVVVVVVhhhhhhttttttdddddd^^^^^^PPPPPPHHHHHHIIIIIIQQQQQQMMMMMMHHHHHHAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX777777333333888888555555111111333333//////------//////444444888888======FFFFFFPPPPPPGGGGGGSSSSSSUUUUUUiiiiiieeeeeeAAAAAAcccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhkkkkkkвkkkkkkPPPPPP^^^^^^PPPPPPRRRRRRYYYYYYXXXXXXMMMMMMDDDDDDIIIIIIOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLvvvvvvRRRRRR444444111111777777333333//////111111000000------------000000222222555555<<<<<>>>>>============??????======::::::999999999999555555000000111111555555;;;;;;BBBBBB::::::HHHHHHLLLLLL666666aaaaaaddddddggggggggggggffffffeeeeeeeeeeeeffffffooooooddddddDDDDDDIIIIII]]]]]]HHHHHHNNNNNNMMMMMMHHHHHHNNNNNN[[[[[[]]]]]]TTTTTT[[[[[[OOOOOOEEEEEEAAAAAA@@@@@@<<<<<<;;;;;;<<<<<<@@@@@@>>>>>>>>>>>>??????<<<<<<666666666666999999LLLLLLPPPPPPAAAAAAIIIIIIMMMMMM:::::: \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_tmp.miff new file mode 100644 index 0000000..0ea6fd6 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/gray_tmp.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:......//////111111333333555555555555444444444444222222222222111111111111000000......,,,,,,,,,,,,111111222222444444999999>>>>>>BBBBBBCCCCCCCCCCCC@@@@@@HHHHHHPPPPPPXXXXXXccccccoooooottttttrrrrrrvvvvvvttttttnnnnnneeeeeeaaaaaaaaaaaa]]]]]]XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXbbbbbbmmmmmm[[[[[[@@@@@@333333555555222222111111333333//////))))))......))))))??????^^^^^^uuuuuussssssSSSSSSTTTTTTwwwwwwvvvvvvOOOOOO......//////111111333333333333333333222222222222111111111111111111111111000000//////............111111000000111111555555999999<<<<<<============BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttuuuuuurrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[YYYYYYTTTTTTRRRRRRSSSSSSTTTTTTWWWWWW______gggggg\\\\\\@@@@@@111111555555666666666666555555------333333333333,,,,,,777777IIIIIIiiiiiiuuuuuu@@@@@@??????______uuuuuuVVVVVV------......000000111111111111000000//////......////////////////////////////////////////////////111111000000//////111111555555777777888888888888AAAAAADDDDDDEEEEEEHHHHHHQQQQQQaaaaaammmmmmqqqqqqvvvvvvqqqqqqffffffZZZZZZWWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF222222333333444444555555444444++++++222222111111......000000333333^^^^^^zzzzzzLLLLLL999999::::::UUUUUUIIIIII::::::,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,,,,,,,------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiirrrrrrnnnnnnccccccXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRROOOOOOOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbssssssiiiiiimmmmmmkkkkkk,,,,,,------............------,,,,,,******))))))((((((((((((((((((((((((((((((******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^VVVVVVTTTTTTUUUUUURRRRRRNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------------222222111111++++++eeeeeeuuuuuu//////000000111111111111000000//////------,,,,,,************))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444000000666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTTTTTTTVVVVVVTTTTTTNNNNNNEEEEEEHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV777777''''''))))))++++++......------''''''%%%%%%&&&&&&ZZZZZZúooooooJJJJJJ333333444444555555666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999666666444444333333777777888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuXXXXXX>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWW^^^^^^777777888888999999::::::::::::999999888888777777666666555555333333111111111111222222444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[[[[[[[eeeeeeqqqqqq~~~~~~]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||wwwwwwSSSSSS888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>FFFFFFFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______XXXXXXZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaawwwwwwyyyyyyoooooowwwwww{{{{{{||||||xxxxxxbbbbbb999999555555777777]]]]]]yyyyyyppppppRRRRRR444444777777<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa[[[[[[______aaaaaa^^^^^^````````````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppvvvvvv{{{{{{}}}}}}~~~~~~kkkkkk\\\\\\LLLLLL~~~~~~ǬqqqqqqZZZZZZ111111222222666666<<<<<>>>>>;;;;;;FFFFFF\\\\\\ccccccUUUUUURRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddppppppttttttxxxxxxyyyyyyyyyyyy||||||~~~~~~mmmmmmԌ111111000000111111777777??????FFFFFFHHHHHHHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC999999555555333333111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX[[[[[[bbbbbbddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddiiiiiippppppuuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{}}}}}}~~~~~~~~~~~~vvvvvv888888333333000000222222999999BBBBBBHHHHHHJJJJJJccccccrrrrrrSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~ooooooaaaaaaYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{rrrrrrJJJJJJFFFFFFAAAAAA;;;;;;999999======DDDDDDIIIIIIXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddaaaaaacccccciiiiiilllllljjjjjjhhhhhhhhhhhhppppppbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvwwwwwwTTTTTTOOOOOOMMMMMMIIIIIIBBBBBB============BBBBBBHHHHHHTTTTTTxxxxxxssssssjjjjjj^^^^^^ffffff{{{{{{iiiiiimmmmmmiiiiii``````^^^^^^ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttkkkkkklllllldddddd^^^^^^ZZZZZZ\\\\\\llllllGGGGGGIIIIIIOOOOOOPPPPPPJJJJJJHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqppppppjjjjjjkkkkkkffffff``````cccccclllllljjjjjjbbbbbbffffff]]]]]]ffffffppppppeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv{{{{{{vvvvvv]]]]]]aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvrrrrrrUUUUUUrrrrrrooooooxxxxxxzzzzzzjjjjjjbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````bbbbbbaaaaaagggggglllllliiiiii````````````UUUUUU^^^^^^hhhhhh¨PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQRRRRRRPPPPPPKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddiiiiiixxxxxxyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnngggggg``````cccccchhhhhhiiiiiippppppppppppddddddqqqqqqyyyyyytttttthhhhhhaaaaaa^^^^^^ggggggwwwwwwddddddeeeeee\\\\\\______aaaaaa~~~~~~||||||uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJHHHHHHIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUWWWWWWNNNNNNbbbbbbzzzzzzoooooommmmmmrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyynnnnnnggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhffffffwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}}}}}}}qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPKKKKKKLLLLLLOOOOOO]]]]]]ffffffbbbbbbwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______oooooorrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhooooooeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzssssssmmmmmmppppppooooooppppppwwwwwwbbbbbbiiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWWOOOOOOOOOOOOQQQQQQRRRRRROOOOOOLLLLLLTTTTTT^^^^^^xxxxxxuuuuuurrrrrrssssssllllllbbbbbbiiiiiittttttqqqqqqaaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkffffffiiiiiikkkkkkeeeeeeeeeeeehhhhhhllllllllllll``````ffffffrrrrrrBBBBBBJJJJJJzzzzzzPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^aaaaaassssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbddddddpppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmjjjjjj______``````uuuuuuvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{[[[[[[OOOOOOMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddddddddeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllggggggiiiiiiggggggjjjjjjggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooo{{{{{{zzzzzzrrrrrrggggggeeeeeekkkkkk<<<<<>>>>>BBBBBBRRRRRRkkkkkkiiiiii^^^^^^ffffffjjjjjjZZZZZZRRRRRRqqqqqqkkkkkkZZZZZZbbbbbbccccccddddddeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]qqqqqqhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmjjjjjjkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{FFFFFF------hhhhhhxxxxxx{{{{{{~~~~~~yyyyyyttttttttttttxxxxxx//////888888111111>>>>>>____________``````gggggg______[[[[[[pppppp{{{{{{cccccccccccceeeeeeddddddeeeeeeiiiiiiiiiiiieeeeeeccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllqqqqqqlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmnnnnnnjjjjjjbbbbbbaaaaaaddddddaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz||||||zzzzzzxxxxxxvvvvvvwwwwwwyyyyyy......444444++++++444444TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmwwwwww}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~xxxxxxwwwwwwxxxxxx{{{{{{999999======888888======NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______YYYYYY[[[[[[bbbbbbbbbbbb[[[[[[iiiiiillllllaaaaaaffffffeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuunnnnnnkkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUkkkkkkoooooojjjjjj777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||NNNNNNOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffmmmmmmbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffnnnnnnaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooommmmmmiiiiiibbbbbbffffffkkkkkkggggggmmmmmmllllllkkkkkkjjjjjjnnnnnnnnnnnnddddddYYYYYYZZZZZZHHHHHHVVVVVVrrrrrrwwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY______dddddd____________cccccc______cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccaaaaaaqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssiiiiiieeeeee^^^^^^UUUUUU______mmmmmmoooooonnnnnnmmmmmmjjjjjjiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX999999UUUUUUqqqqqqWWWWWWooooooxxxxxx``````))))))......777777::::::>>>>>>pppppp``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXhhhhhh______UUUUUUIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkppppppiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWWZZZZZZ______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQPPPPPPMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{qqqqqqnnnnnn````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWSSSSSSQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF>>>>>>222222<<<<<>>>>>EEEEEE666666000000111111GGGGGGeeeeeehhhhhhyyyyyyjjjjjjggggggbbbbbbbbbbbbbbbbbbccccccccccccccccccddddddddddddkkkkkkaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@777777KKKKKKVVVVVVKKKKKK======::::::>>>>>>>>>>>>******333333<<<<<<000000444444444444CCCCCCtttttt``````aaaaaappppppnnnnnn______bbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeeiiiiii333333nnnnnn^^^^^^hhhhhhppppppllllll______TTTTTTSSSSSSPPPPPPMMMMMMJJJJJJJJJJJJIIIIIIJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMBBBBBB111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<^^^^^^______XXXXXXddddddssssssYYYYYYddddddeeeeeeeeeeeeeeeeeeddddddddddddffffffhhhhhheeeeeerrrrrrzzzzzzttttttՀVVVVVVhhhhhhttttttdddddd^^^^^^PPPPPPHHHHHHIIIIIIQQQQQQMMMMMMHHHHHHAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX777777333333888888555555111111333333//////------//////444444888888======FFFFFFPPPPPPGGGGGGSSSSSSUUUUUUiiiiiieeeeeeAAAAAAcccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhkkkkkkвkkkkkkPPPPPP^^^^^^PPPPPPRRRRRRYYYYYYXXXXXXMMMMMMDDDDDDIIIIIIOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLvvvvvvRRRRRR444444111111777777333333//////111111000000------------000000222222555555<<<<<>>>>>============??????======::::::999999999999555555000000111111555555;;;;;;BBBBBB::::::HHHHHHLLLLLL666666aaaaaaddddddggggggggggggffffffeeeeeeeeeeeeffffffooooooddddddDDDDDDIIIIII]]]]]]HHHHHHNNNNNNMMMMMMHHHHHHNNNNNN[[[[[[]]]]]]TTTTTT[[[[[[OOOOOOEEEEEEAAAAAA@@@@@@<<<<<<;;;;;;<<<<<<@@@@@@>>>>>>>>>>>>??????<<<<<<666666666666999999LLLLLLPPPPPPAAAAAAIIIIIIMMMMMM:::::: \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/idat_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/idat_tmp.miff new file mode 100644 index 0000000000000000000000000000000000000000..1ef75c0a74aee6c6d7b8a619c354941488941e17 GIT binary patch literal 26037 zcmZ6zXH-;&_ce?yF~-CiyMlBW7^e3^8(`?2q4(Z+sDNFFY=8Hiw}>8I zDlUjmW-PMxkCpy=96pLkNn%nI6yhU-<6`;o5q|yw!4dv`i=w2zRrxcLKgL)3Y4P4+ivqpF!@c<=B8^U?)208XpLSGCaJY9&vh+O$ zO^ZaNQWX>eWBmOi{-1xKO5c}$BcHH%|NrM*GF|#MiLod#C^$~~ex&r5Nk4>2rZDj_ z6!xOUi#Y4(bS*6*7T=n@rZx85!YnDHJ+=Xb5L2b$FP? zqDYUC5f+O|)zKLqW-w?pb@h=E8jV6xQW_bdQYq34Fgi*mlSrF3jg1kBIy&<5m`s2F=%Z9UTjcojXlTC=^@U=4NAK9UV8f(o%fmz`(LH zeSHEUJiNGAS64$LBBHcZC{$Mu53i`e>#(qj3V}dXH6)~_27hTlKx?b1DT!oh+1~Et zWGFq-)A4;mLL?FfgUQ^t&(M%SAQFd$baip1Mn@S8GFe+2*ONlg)Vz2RcSBS2(j_7h z*L!kOOG{f@UVdVNMkA4wl`mbQ)78}#6)#>iH|O#A`~wFfBPEicptQ8Syzub6JRhH` zs+5$Lme|;|w6L&}lIm)EdmEd8fCC3CEp2SPy!P#jj*g4V$=SNKzP_nx*RGI|*x1Cx zoSeKo6BBcDiKM$*hL_1nI-N*VRh^iS;bm-0hL_P%Hk(8ulSfAWJ2M#gJ1$<7{T(AC zbUKBip&`SIiVE;TCMzo9@6*vyQ1}lgQIdQ_+n9C&)jvse$08Wk` z_48x1)zuFlPD*04H8tz%%E~w#9i7NG5-BLCw$|8~N{xu9sLvBcr<7+S=aU-Mzb;O4ZU*RJ?YLLLm}WRIXj4(R6h1`{{HNNn88M6*?V} z;qqk~jVL`XU#3#ErN_hsg`%yksfpLP|CcXQC^|ao>X$E*$@rYhm+{l8s#mU%NLpGN z8dt91^R=}vUBbPfP%d2pUZ~Vdmv}q^0cSp6Q?sYp14mbqNGarkB^*vqna^Mw63fW=2LzN)I36e*N&n-Mb=@uI`EzV`IRVkbZIGrp`{fYTU<<|X==vB zm6fqr1VTbWO%0DnA|)g=HRS9lJ3HIjCM0-z@^~E1 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]]]]]]XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXbbbbbbmmmmmm[[[[[[@@@@@@333333555555222222111111333333//////))))))......))))))??????^^^^^^uuuuuussssssPPPPPPVVVVVVxxxxxxuuuuuuTTTTTT......//////111111333333333333333333222222222222111111111111111111111111000000//////............111111000000111111555555999999<<<<<<============BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttuuuuuurrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[YYYYYYTTTTTTRRRRRRSSSSSSTTTTTTWWWWWW______gggggg\\\\\\@@@@@@111111555555666666666666555555------333333333333,,,,,,777777IIIIIIiiiiiiuuuuuuAAAAAABBBBBB______ooooooUUUUUU------......000000111111111111000000//////......////////////////////////////////////////////////111111000000//////111111555555777777888888888888AAAAAADDDDDDEEEEEEHHHHHHQQQQQQaaaaaammmmmmqqqqqqvvvvvvqqqqqqffffffZZZZZZWWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF222222333333444444555555444444++++++222222111111......000000333333^^^^^^zzzzzzHHHHHH777777::::::UUUUUUNNNNNNHHHHHH,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,,,,,,,------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiirrrrrrnnnnnnccccccXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRROOOOOOOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbttttttjjjjjjnnnnnn~~~~~~eeeeee,,,,,,------............------,,,,,,******))))))((((((((((((((((((((((((((((((******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^VVVVVVTTTTTTUUUUUURRRRRRNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------------222222111111++++++eeeeeellllll//////000000111111111111000000//////------,,,,,,************))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444000000666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTTTTTTTVVVVVVTTTTTTNNNNNNEEEEEEHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV777777''''''))))))++++++......------''''''%%%%%%&&&&&&ZZZZZZxxxxxxPPPPPP333333444444555555666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999666666444444333333777777888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuXXXXXX>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWWTTTTTT777777888888999999::::::::::::999999888888777777666666555555333333111111111111222222444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[[[[[[[eeeeeeqqqqqq~~~~~~]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||yyyyyyRRRRRR888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>FFFFFFFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______XXXXXXZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaawwwwwwyyyyyyoooooowwwwww{{{{{{||||||xxxxxxaaaaaa888888444444666666\\\\\\xxxxxxrrrrrrUUUUUU444444777777<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa[[[[[[______aaaaaa^^^^^^````````````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppvvvvvv{{{{{{}}}}}}~~~~~~jjjjjj[[[[[[KKKKKK}}}}}}Ǭqqqqqq[[[[[[111111222222666666<<<<<>>>>>;;;;;;FFFFFF\\\\\\ccccccUUUUUURRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddppppppttttttxxxxxxyyyyyyyyyyyy||||||}}}}}}llllllԋ111111000000111111777777??????FFFFFFHHHHHHHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC999999555555333333111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX[[[[[[bbbbbbddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddiiiiiippppppuuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{}}}}}}~~~~~~~~~~~~vvvvvv888888333333000000222222999999BBBBBBHHHHHHJJJJJJccccccrrrrrrSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~ooooooaaaaaaYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{rrrrrrJJJJJJFFFFFFAAAAAA;;;;;;999999======DDDDDDIIIIIIXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddaaaaaacccccciiiiiilllllljjjjjjhhhhhhhhhhhhppppppbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvxxxxxxUUUUUUOOOOOOMMMMMMIIIIIIBBBBBB============BBBBBBHHHHHHTTTTTTxxxxxxssssssjjjjjj^^^^^^ffffff{{{{{{iiiiiimmmmmmiiiiii``````^^^^^^ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttkkkkkklllllldddddd^^^^^^ZZZZZZ\\\\\\llllllIIIIIIIIIIIIOOOOOOPPPPPPJJJJJJHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqppppppjjjjjjkkkkkkffffff``````cccccclllllljjjjjjbbbbbbffffff]]]]]]ffffffppppppeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv{{{{{{vvvvvv]]]]]]aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvrrrrrrUUUUUUrrrrrrooooooxxxxxxzzzzzzjjjjjjbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````bbbbbbaaaaaagggggglllllliiiiii````````````UUUUUU^^^^^^hhhhhh©PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQRRRRRRPPPPPPKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddiiiiiixxxxxxyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnngggggg``````cccccchhhhhhiiiiiippppppppppppddddddqqqqqqyyyyyytttttthhhhhhaaaaaa^^^^^^ggggggwwwwwwddddddeeeeee\\\\\\______aaaaaa~~~~~~||||||uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJHHHHHHIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUWWWWWWNNNNNNbbbbbbzzzzzzoooooommmmmmrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyynnnnnnggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhffffffwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}}}}}}}qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPKKKKKKLLLLLLOOOOOO]]]]]]ffffffbbbbbbwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______oooooorrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhooooooeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzssssssmmmmmmppppppooooooppppppwwwwwwbbbbbbiiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWW}}}}}}OOOOOOOOOOOOQQQQQQRRRRRROOOOOOLLLLLLTTTTTT^^^^^^xxxxxxuuuuuurrrrrrssssssllllllbbbbbbiiiiiittttttqqqqqqaaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkffffffiiiiiikkkkkkeeeeeeeeeeeehhhhhhllllllllllll``````ffffffrrrrrrBBBBBBJJJJJJwwwwwwPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^aaaaaassssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbddddddpppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmjjjjjj______``````uuuuuuvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{\\\\\\QQQQQQMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddddddddeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllggggggiiiiiiggggggjjjjjjggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooozzzzzzyyyyyyrrrrrrhhhhhhffffffiiiiii<<<<<>>>>>BBBBBBRRRRRRkkkkkkiiiiii^^^^^^ffffffjjjjjjZZZZZZRRRRRRqqqqqqkkkkkkZZZZZZbbbbbbccccccddddddeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]qqqqqqhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmjjjjjjkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{FFFFFF------hhhhhhxxxxxx{{{{{{yyyyyyttttttttttttxxxxxx//////888888111111>>>>>>____________``````gggggg______[[[[[[pppppp{{{{{{cccccccccccceeeeeeddddddeeeeeeiiiiiiiiiiiieeeeeeccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllqqqqqqlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmnnnnnnjjjjjjbbbbbbaaaaaaddddddaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz}}}}}}{{{{{{wwwwwwuuuuuuwwwwww{{{{{{......444444++++++444444TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmwwwwww}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~yyyyyywwwwwwwwwwww{{{{{{999999======888888======NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______YYYYYY[[[[[[bbbbbbbbbbbb[[[[[[iiiiiillllllaaaaaaffffffeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuunnnnnnkkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUkkkkkkoooooojjjjjj777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||NNNNNNOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffmmmmmmbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffnnnnnnaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooommmmmmiiiiiibbbbbbffffffkkkkkkggggggmmmmmmllllllkkkkkkjjjjjjnnnnnnnnnnnnddddddYYYYYYZZZZZZHHHHHHVVVVVVrrrrrrwwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY______dddddd____________cccccc______cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccaaaaaaqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssiiiiiieeeeee^^^^^^UUUUUU______mmmmmmoooooonnnnnnmmmmmmjjjjjjiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX999999UUUUUUqqqqqqWWWWWWooooooxxxxxx``````))))))......777777::::::>>>>>>pppppp``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXhhhhhh______UUUUUUIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkppppppiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWWZZZZZZ______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQPPPPPPMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{qqqqqqpppppp````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWSSSSSSQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF>>>>>>222222<<<<<>>>>>EEEEEE666666000000111111GGGGGGddddddiiiiiizzzzzzllllllggggggbbbbbbbbbbbbbbbbbbccccccccccccccccccddddddddddddkkkkkkaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@777777KKKKKKVVVVVVKKKKKK======::::::>>>>>>>>>>>>******333333<<<<<<000000444444444444CCCCCCrrrrrr______aaaaaaqqqqqqnnnnnn^^^^^^bbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeeiiiiii333333nnnnnn^^^^^^hhhhhhppppppllllll______TTTTTTSSSSSSPPPPPPMMMMMMJJJJJJJJJJJJIIIIIIJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMBBBBBB111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<]]]]]]______XXXXXXddddddqqqqqqUUUUUUddddddeeeeeeeeeeeeeeeeeeddddddddddddffffffhhhhhhbbbbbbuuuuuuyyyyyyssssssۃUUUUUUddddddrrrrrreeeeee[[[[[[NNNNNNHHHHHHIIIIIIQQQQQQLLLLLLGGGGGGAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX666666333333888888555555111111333333333333000000111111555555888888======FFFFFFPPPPPPHHHHHHTTTTTTWWWWWWllllllffffff@@@@@@cccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhhhhhhhбiiiiiiOOOOOO______NNNNNNQQQQQQYYYYYYXXXXXXLLLLLLCCCCCCHHHHHHOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLwwwwwwRRRRRR444444111111666666333333//////000000111111............000000222222555555<<<<<>>>>><<<<<<<<<<<<>>>>>>======;;;;;;::::::::::::666666000000//////333333<<<<<>>>>>888888666666999999OOOOOORRRRRRCCCCCCJJJJJJNNNNNN;;;;;; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..af1c11c1e4e3500e5a9bac486b4771ddb63ffc32 GIT binary patch literal 26037 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 J56_*S|37q{3WERu literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..e8d118910a92fe33e3c6b1364e78e665899a3506 GIT binary patch literal 26037 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog.miff new file mode 100644 index 0000000..2e7732c --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:......//////111111333333555555555555444444444444222222222222111111111111000000......,,,,,,,,,,,,111111222222444444999999>>>>>>BBBBBBCCCCCCCCCCCC@@@@@@HHHHHHPPPPPPXXXXXXccccccoooooottttttrrrrrrvvvvvvttttttnnnnnneeeeeeaaaaaaaaaaaa]]]]]]XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXbbbbbbmmmmmm[[[[[[@@@@@@333333555555222222111111333333//////))))))......))))))??????^^^^^^uuuuuussssssPPPPPPVVVVVVxxxxxxuuuuuuTTTTTT......//////111111333333333333333333222222222222111111111111111111111111000000//////............111111000000111111555555999999<<<<<<============BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttuuuuuurrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[YYYYYYTTTTTTRRRRRRSSSSSSTTTTTTWWWWWW______gggggg\\\\\\@@@@@@111111555555666666666666555555------333333333333,,,,,,777777IIIIIIiiiiiiuuuuuuAAAAAABBBBBB______ooooooUUUUUU------......000000111111111111000000//////......////////////////////////////////////////////////111111000000//////111111555555777777888888888888AAAAAADDDDDDEEEEEEHHHHHHQQQQQQaaaaaammmmmmqqqqqqvvvvvvqqqqqqffffffZZZZZZWWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF222222333333444444555555444444++++++222222111111......000000333333^^^^^^zzzzzzHHHHHH777777::::::UUUUUUNNNNNNHHHHHH,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,,,,,,,------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiirrrrrrnnnnnnccccccXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRROOOOOOOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbttttttjjjjjjnnnnnn~~~~~~eeeeee,,,,,,------............------,,,,,,******))))))((((((((((((((((((((((((((((((******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^VVVVVVTTTTTTUUUUUURRRRRRNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------------222222111111++++++eeeeeellllll//////000000111111111111000000//////------,,,,,,************))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444000000666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTTTTTTTVVVVVVTTTTTTNNNNNNEEEEEEHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV777777''''''))))))++++++......------''''''%%%%%%&&&&&&ZZZZZZxxxxxxPPPPPP333333444444555555666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999666666444444333333777777888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuXXXXXX>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWWTTTTTT777777888888999999::::::::::::999999888888777777666666555555333333111111111111222222444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[[[[[[[eeeeeeqqqqqq~~~~~~]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||yyyyyyRRRRRR888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>FFFFFFFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______XXXXXXZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaawwwwwwyyyyyyoooooowwwwww{{{{{{||||||xxxxxxaaaaaa888888444444666666\\\\\\xxxxxxrrrrrrUUUUUU444444777777<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa[[[[[[______aaaaaa^^^^^^````````````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppvvvvvv{{{{{{}}}}}}~~~~~~jjjjjj[[[[[[KKKKKK}}}}}}Ǭqqqqqq[[[[[[111111222222666666<<<<<>>>>>;;;;;;FFFFFF\\\\\\ccccccUUUUUURRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddppppppttttttxxxxxxyyyyyyyyyyyy||||||}}}}}}llllllԋ111111000000111111777777??????FFFFFFHHHHHHHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC999999555555333333111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX[[[[[[bbbbbbddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddiiiiiippppppuuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{}}}}}}~~~~~~~~~~~~vvvvvv888888333333000000222222999999BBBBBBHHHHHHJJJJJJccccccrrrrrrSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~ooooooaaaaaaYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{rrrrrrJJJJJJFFFFFFAAAAAA;;;;;;999999======DDDDDDIIIIIIXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddaaaaaacccccciiiiiilllllljjjjjjhhhhhhhhhhhhppppppbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvxxxxxxUUUUUUOOOOOOMMMMMMIIIIIIBBBBBB============BBBBBBHHHHHHTTTTTTxxxxxxssssssjjjjjj^^^^^^ffffff{{{{{{iiiiiimmmmmmiiiiii``````^^^^^^ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttkkkkkklllllldddddd^^^^^^ZZZZZZ\\\\\\llllllIIIIIIIIIIIIOOOOOOPPPPPPJJJJJJHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqppppppjjjjjjkkkkkkffffff``````cccccclllllljjjjjjbbbbbbffffff]]]]]]ffffffppppppeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv{{{{{{vvvvvv]]]]]]aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvrrrrrrUUUUUUrrrrrrooooooxxxxxxzzzzzzjjjjjjbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````bbbbbbaaaaaagggggglllllliiiiii````````````UUUUUU^^^^^^hhhhhh©PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQRRRRRRPPPPPPKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddiiiiiixxxxxxyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnngggggg``````cccccchhhhhhiiiiiippppppppppppddddddqqqqqqyyyyyytttttthhhhhhaaaaaa^^^^^^ggggggwwwwwwddddddeeeeee\\\\\\______aaaaaa~~~~~~||||||uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJHHHHHHIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUWWWWWWNNNNNNbbbbbbzzzzzzoooooommmmmmrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyynnnnnnggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhffffffwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}}}}}}}qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPKKKKKKLLLLLLOOOOOO]]]]]]ffffffbbbbbbwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______oooooorrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhooooooeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzssssssmmmmmmppppppooooooppppppwwwwwwbbbbbbiiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWW}}}}}}OOOOOOOOOOOOQQQQQQRRRRRROOOOOOLLLLLLTTTTTT^^^^^^xxxxxxuuuuuurrrrrrssssssllllllbbbbbbiiiiiittttttqqqqqqaaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkffffffiiiiiikkkkkkeeeeeeeeeeeehhhhhhllllllllllll``````ffffffrrrrrrBBBBBBJJJJJJwwwwwwPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^aaaaaassssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbddddddpppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmjjjjjj______``````uuuuuuvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{\\\\\\QQQQQQMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddddddddeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllggggggiiiiiiggggggjjjjjjggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooozzzzzzyyyyyyrrrrrrhhhhhhffffffiiiiii<<<<<>>>>>BBBBBBRRRRRRkkkkkkiiiiii^^^^^^ffffffjjjjjjZZZZZZRRRRRRqqqqqqkkkkkkZZZZZZbbbbbbccccccddddddeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]qqqqqqhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmjjjjjjkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{FFFFFF------hhhhhhxxxxxx{{{{{{yyyyyyttttttttttttxxxxxx//////888888111111>>>>>>____________``````gggggg______[[[[[[pppppp{{{{{{cccccccccccceeeeeeddddddeeeeeeiiiiiiiiiiiieeeeeeccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllqqqqqqlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmnnnnnnjjjjjjbbbbbbaaaaaaddddddaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz}}}}}}{{{{{{wwwwwwuuuuuuwwwwww{{{{{{......444444++++++444444TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmwwwwww}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~yyyyyywwwwwwwwwwww{{{{{{999999======888888======NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______YYYYYY[[[[[[bbbbbbbbbbbb[[[[[[iiiiiillllllaaaaaaffffffeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuunnnnnnkkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUkkkkkkoooooojjjjjj777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||NNNNNNOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffmmmmmmbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffnnnnnnaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooommmmmmiiiiiibbbbbbffffffkkkkkkggggggmmmmmmllllllkkkkkkjjjjjjnnnnnnnnnnnnddddddYYYYYYZZZZZZHHHHHHVVVVVVrrrrrrwwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY______dddddd____________cccccc______cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccaaaaaaqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssiiiiiieeeeee^^^^^^UUUUUU______mmmmmmoooooonnnnnnmmmmmmjjjjjjiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX999999UUUUUUqqqqqqWWWWWWooooooxxxxxx``````))))))......777777::::::>>>>>>pppppp``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXhhhhhh______UUUUUUIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkppppppiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWWZZZZZZ______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQPPPPPPMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{qqqqqqpppppp````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWSSSSSSQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF>>>>>>222222<<<<<>>>>>EEEEEE666666000000111111GGGGGGddddddiiiiiizzzzzzllllllggggggbbbbbbbbbbbbbbbbbbccccccccccccccccccddddddddddddkkkkkkaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@777777KKKKKKVVVVVVKKKKKK======::::::>>>>>>>>>>>>******333333<<<<<<000000444444444444CCCCCCrrrrrr______aaaaaaqqqqqqnnnnnn^^^^^^bbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeeiiiiii333333nnnnnn^^^^^^hhhhhhppppppllllll______TTTTTTSSSSSSPPPPPPMMMMMMJJJJJJJJJJJJIIIIIIJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMBBBBBB111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<]]]]]]______XXXXXXddddddqqqqqqUUUUUUddddddeeeeeeeeeeeeeeeeeeddddddddddddffffffhhhhhhbbbbbbuuuuuuyyyyyyssssssۃUUUUUUddddddrrrrrreeeeee[[[[[[NNNNNNHHHHHHIIIIIIQQQQQQLLLLLLGGGGGGAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX666666333333888888555555111111333333333333000000111111555555888888======FFFFFFPPPPPPHHHHHHTTTTTTWWWWWWllllllffffff@@@@@@cccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhhhhhhhбiiiiiiOOOOOO______NNNNNNQQQQQQYYYYYYXXXXXXLLLLLLCCCCCCHHHHHHOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLwwwwwwRRRRRR444444111111666666333333//////000000111111............000000222222555555<<<<<>>>>><<<<<<<<<<<<>>>>>>======;;;;;;::::::::::::666666000000//////333333<<<<<>>>>>888888666666999999OOOOOORRRRRRCCCCCCJJJJJJNNNNNN;;;;;; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..af1c11c1e4e3500e5a9bac486b4771ddb63ffc32 GIT binary patch literal 26037 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 J56_*S|37q{3WERu literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..e8d118910a92fe33e3c6b1364e78e665899a3506 GIT binary patch literal 26037 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..621c674f3a0ae47277b385e5ed282e71f1fed242 GIT binary patch literal 26037 zcmZ5|cUV;C_BFPc7!ylOEU5Gj!}Q)LGYq}=I`rOq??syQrhp0vDvG@U3Mi<6D3(}b z?@^=3eE(wT~CM57o!{UPi5>4>4vT~F(F)@he6rU8dBp@a-DJnXF#~>;z$H$~3@ThcU z<-nlW#84iIzQiFYLH7GZycL6-${;H%Cq;)PCh(G?1A~IYqJsjL#LE7w?2l8abUmUT zaY=lT>^JdY(IEz5(TPFPiM-gL_yF0vB}pTfgh->Jq&y;lN~6+fvR4Kg#Kwn3N#oOG z&(W#+L;{7PtQ-;_6cqh`enF8vFZ)FPkx4=S=UEa>_B4^cBqcN~QTBX{?4QZrghC=S z@HS-DlBG-7>u5B6eKob289Lp-KvQ#in!zwM)Ym_Mp2Z@O3=JnHI2HPU0oXO;zfZ#PmjTvoaAtbL?-jxIo5xU@o_fW z$cV){eVWTPGh;B0A2%@(i)pmOhb=8lObCR72i@JdTwUG$`=g^d99`XAyUNOVJR-5Y zeA_mmkiiHFI(pR9R3NalJa^9A+{A>3K`Fs*dM`v`D$0HET%nlwjF)=i>w(jkfNXTRdhn5yIGebi!uZjv|V;!B4 zkjhG9V?Dj7sPb~5P)8>^y0TIr(AJKMs;LnObaWyk>+88(P0jG|=4KvGTRS+oyIU+K z5^Zd{x}2R&Wk+6~rKP!fc(|Jzoz7tN_lrb&dIZARv&P1_Qn(I=h6V=b&e3Q@qOR`w z^K?3eqN_VKg{!ZocIgtCtgEY}G&93y8yKjoPff8{nwqMr=g-^OvDrM{zJ0N=Zf>EW zSy@FzQBg%j{{D4!X=z)wBqU^IMMhRt)z#VA+1LaI?%QW$G&S_+$55L!NdfOMked%$nm0~0lbh%s;ar zQIQCLdE|(*GjMX~P+%a7rLBG7KzcfpsjJ)AxOp?KbV5RRHlOrbb9w6~j?QK{bEwY8?EL}F-YeZ83(g%TZIU2SYkAjHH}SM&LLdePB!byx{8 zF^!Ep9v*MmA`loDgoO0;n3>UNBGHZ=PEH~bgOQzWYin*E8R_K2WHJ~hPh#EZ>W+^K z1h`UIFEkp7gzJSXj_XdR>+4^eJIA z5t&S-o;cy=W@>6@S5lIaB9$g5M?}=tW@opyrlnAADZ`mRg8W}k{9zM+B7#Uex zA3Egb=Ia|4wtahkesOVibxuxXWL#WIN?o0;t&@|RTTc&#qOY&2dgTh4Odx1zT)9G} z8XDsN1J4Eq7cbIihz!%yR4PGsOixoN2C`#jhDuVEUc~zw7+_rx2xRiq6yBFYnVRBofDfE?b&15uNj6(Y$I$S?1w3zP zcd_lh)8(ql(8|LuB$sZXl>2m7#JKq>f*v;>FAs|5fsE=Xld=* zm6}SYYirlmR#h<=1_l`!Jv}@ggW>0Q>Xb+%6bb}au9%yP#cFC#pJIJ~^UZ??CMH7R z4?kSI$Y#^&V)60gRH}i2hsT~hK(>oZceg-5p?G+-w;LPNXn}!EO-4pkYIOAG&3rzY z92d7~6Y!OgP+m@@>gpyYR#!6^dV0ypO-+cH$;s{QLLrqJ7`S`4rKLc?1kub z zuHgQvt6#ke9B64>zKr{?tBZICTwJ4Sq*Dw|CpoI9tjjre`(l9m=S&*jVd`dBZsv-84w_q1_w7ccXVvs+S?lxgq%}XmzNh4la`j6+Sn+SMn?w)_4EV=#>It(c68+D zS5*}jW@V+O78a(a0@Yz*o}QhZ^8bVTPaps`$gry(qNk^!A%9*&Ltp>eHAEW%0q=uvj_<9fM|S#>M}NFFr?DvW-gaRii!fxNTi5}iV8lTN(~P$F6Qy5)VR3pY~Ud^ zH9H%~O-;?o0bk0>%Fjof$j!~m6NxyS+}y%Kyl+}sWu>jHscC5FjvYZk9v=4gyLad2 z#>9Ae_4Rdh6c;BXq^9QPhK5#FIy+0HmX>?=aJd#1EY{eVni_?I>$714;>PT(wl*UC z^fZCMWD<$f(_lM@C-VD;ya2plJ(9_Y_gHn{8UFquAprrctvhz~_wU&g9$r`1(b3ix z8#^#?`ZQQzPtVb#-QAv^?d|*aZQU9hyKC3+<2^mW!8J9Vo#o}}=>Y-p@t&TDFIf4P zFXL_i$7C`hz<HjQlb^jYqn=v$OK}0UT*-{}&eq2EY?=GCM2B$5qH3McswBY%o%}zNTg6k zM_DY2>^O6VM55Dy8!auw=aCUDEiM;lB2ggF*9ZUNa5OZ=$E~dBbS0&Mfq(!iRav>Q zF)NG7)Yi_-L>?g$2YN_adnIXStw7@06Rxu8HG zpwkl*Gc&<+GBRRgk$(ycLY|PJ(iRtd%v!}c~IXOMOzCI?VwA9x(EzQeo#||?yKR*kL{rk1G zg+elUbad@nd7f8N!aBZmNkc=vo(&9;zvOs9y`rb5qqAYd#fzGz78A!{Unk+4jLLF-|FcZ8Ula%`UJwoi*o)0UITp2%;@OQ>4>K~IxH6I zC^DH&*U&g~hRa2U8Xh(=q0y++!9i0~DwV+)9>(2cGDk-l47~Ep8L%KSd2EbC!g@P# zg24b|?(atwP*Xd8+{((pKvD7BIbUCWeMQCo{`7RzaSaWnrO0@hnR$6Uo~~|MT0sH$ zYHn^xiLo)6oRLvn3|^g_TvWv2Aiv0Qlaf+Y1RSNOBfc0KmX&2?foYbNrKBL=RaD5T zY}xM%3sX|WVkR>=IX~aQ!PFFtF(}BzB`t0D?yRin=%S*1`&wG^@(K%UYxnHQ$pQP^ zwk(_O4)zsFmy>SDqLQ(O?4XUin*3!Cu-PP686IEVbUPT4IbyikYRYpc( zVL?GtQ+9SKLYYehEU})nc%%(fTvHRdco(gv;>X^2W@S2byZb|huz&(RTUM-#=^tZ)z_^% zaUw4d`F_im>S`8CS2r~kb+Ca!OiV?Ei3yRIkx^YO6dD@hjNj+xR#kx~+2gDoSn_hD=M~a z3kYy?%gycYkBbWqHa8y_0Cx}y_wV1jH8a!OyS25xK2~;Y+0xLEk&&3#-rmqqSeTPj zR+gTgl(czsM1-rWyZg?ac6KxxmkWJi!v-}q)Rh}HsH)z&WoD+O1)d-js;et2pFN8z zOh;#M(80mVip$--+uuJp*x9+M2}~<4uBj<5uB0S3w!R+UG&#AZCMTz^E;Y5jJ~?^Q zCPbg??AqGoEn8L!Kpr$6V*wd5C-M^p3Vla%2Cnk72F4x!?bsUb75rIG`WV45d z`Fx>}Mnj#4IDPy$Gy^vK#0fLmArPE6VQg$<#N!=1hBF@Heb{Wgp2J}>2M76l4hQjp zOePZ5)W*h;*Ax}U$MI^^jXWNWrm8wNhU!6GeQ3zs9P9bW5l2U3V-9Cvz{v^K%)WiL zwp1#Mb?A_t9dL5ugu6S5#N`eTJ2|PV6N#gv(a}_@Ptv@|w$)25i1nwqGns;Y#9 z+FChoDk=&K8yms8T3h$*sjp8+$jz;-O;69siHXU}L!7g*@$(al_v`@+5DKApFc<;> z_yX#w(NQ^GhK7ucOibwX>ZZGp!VC$K81)B^{st-&7$ z2CS`7uM7;>+A?Ivp+gQ1hK9heySuI~nLIKQ76!fV+__DgxLkAdoSg1%tn!sB`}&NG zEG($hzCI3z&xaxfB=hJ*jg42Wf-*&;L3uJU!P-Cu<#3{+Mn|D2 zrlefH?BnC=s-iMI?cw3<{PovkW7gKt3$I_dw6w8VvgFAV3Pm88H}BIY5=kOaQ26_A zCey`5LE+06KHuM8LE-afBcq521%(eEOiknC6%>B^&D=aCMM2@&Gh5r#R0V|>FZ})U z^MOBW>wo|j3-y?(DJo{65b?OSHZwCiIybkmv8}DBC@83?sH3B>5E-$jr@TBQWcTjV zr~CWO%}<}ccyVY56~olj$&-3|9UXi3wzb*X#>8Z1hK4pbJ3IUPqkcm+U!Pcv$kNrtV6fSq zp55KxH}3BH_XBq>F8lWj1T>njZ+AD9s;TMXa^L{;G$>X~rlzK??Wt49lS1L;%it#z z%DsDFQma=#dW3lS)mQTK(xvzBn1mnX>o|yr@n9P|O=qu2Xotz{RC8ZlT+}-W$ z=FOX&w6YS3l$DW5m`r>UZ0zj~ zd>9)C1qlyLXnBad8V4ynXBBl$`w4S06rvg%uXgpMUpmU?6aG@}!SX za4?zN-tO(~>6w~(@7~bR!GrqxZ{9q6_Vdq5O1E!6e}47q+O_xZfB5k5A@KV9?@yo3 zpa1F8+}y{H^XET){N~N0M@yERKY#V=__)4)Nl9&Oetvp7YU+f9O`GU+0)fT4coFIp zm5MqRN(^)}=uZ<9$TNn9BO|~Ioqp_?x$NNa1_lr}Oid3Q@b>od3Jl!2Gb1BCy`mx~ z2k*Rjb3uWttD9R?R96@Bn4R76GYG{bdMU4dpr=!E+ z%+5jy($Tql7gt72?a?E=-}m3&y9egJY#Ay&O-(43G@7XNH@nft&UEP;2&CP9Xmo9z%+S1a^?dz|9 z`_00_$7kL=#FK!4dGp@Cx3mlkL!7a*i;czE#U(Lu-n`eZ-QDBj=FNNb2o>+rrL(i) z;c;<_io179rT+fO$)7$=O^uI#|NY$D-+#Y*r=al1AD=(}`m2Hh@bTxL3JQPzDL;St zf>+>uKY#w?4+VuskDfn&@Zh`ehK9z*jvp5YjvN^r92l^$fO^1YpFJzr|G_^E4K*~T zrl2oE*9ZU9(i$5RiJ*TUIRd;01bux_MXjuM?+ys?^GixF&OK+20?`a9|)dHZn3MrmCu@#@gD!Av6>`o5wRZKXr=30W!wMI2<`&lJo4L zA+Q$;Wnuz6hRHm8HaHlc^~8yU1jM)F$J5fFqqMhISDTqJnGq57^+rY{lB;V+2lRV; z`#pQ`*w*&Q5h#5^;fWJQMz~X_PT}ti49=WE9wL#zn4yHCPXML#`gQcFl$CGYLLX_> zs$YJAKKAXm4;}#5Uww7w4(hs9t1ew464liW{?pmf&>#{|pGLey=Lh{QP0h(kJ3FCJ zRrSmn)JY=I$&<)#R#u3tB$8M>Je)GoJIV5EM{HIU-{30Uo z`C?*{k`xsB`rO?;Jal#M+}X2d*RG8l=jML@{mmQT;p4~Oep|2rc=`Kpyx+h7{{8p7 zc^_p5aPqtCc=vAJyoV1TJ^JOBAAfxL^3|(HkCrcg`t;eed-qnYLbTxVPM$>fgiIbD zM)XBJ%VJTf=oeyrgKwLd7#Zp7A3ttkVP+;2Le;jgaB%4D_4fAgNK4zky{W0berzlz zW@Kb&=+8f$oW{mRM&{-$ECvTpp8WJlEbi{^>A7%Uch1a=M50p9o{fkwGcz~u?{94l4GjrNOFMKZDJeGA+4Z ztceK}quE(gQ>>92H^gG_o5zo>t(~0KtarG$%X$ z`Dej`zy88c^2c*?^X7f{@b2CF_X-N{-o1YP>#vIz-Me@D_Kh2AYJdLu;lppgef8C+ zPk;RJ`t?^|IXa5PLLqpii3xbCL?RUG>4D#JxvHwCPovJ+xN&q8t3Xe0cvvDq|K-2| z#1~iBJ$qbT9URirdwWYu^Ye#?GctDX?&^B?&fR@rVE68S{;{<^c<{i1xjAd=y?X}+ z{{Gv=rLC>K{lSBPfcpB%%8`-8#M;`F6m$nmN<2KGqubld%Mpju(|7N7a|;irQm3YZ zgA)^%FTZ@*+dDW|O>KPK($d-*%8Zc_hqHDq;stt~gM-jfOiWIlVzafhSgiBs(TUR2 z`}t=E109O{_sL{EJ$3arZ@_yrG~T=ce^pVrc8yAvE1-xU1j6mxh(0vhix=pOsjL6~ zJCw|M^M3!`(2z*{`s=rEp&zQNKYxz8U0M10bMzO$hZziA-3=RX-@$}X@0gpfUw`9< zsi{y1A*1My1l%ckkZ#`1$inO7CR{;>epfA3y%}*Zlc&bN~K3H>aR5H~0DTmoIo< zyh1_Y?c0|xpFUl=^5e&M?_RxHwCKy1KmUCDcHu%#PYVlUrS60laV{8rci$o2#+4w+FDw!Tsb|B zc%h_(bqYpstgYo=1*oB(fAAg`PuA=h#HPEE2{NRCs0hH!z z*ED1Yhja6$s;as=i}n1uzCM)4_wS)(>gc?Chj&+0eDw+p{imN$*BBbETJ_)o`sZJN zeg3?zuDZIS;?=9rt*F#juN)k#tu-|tKQ=cvGtYGDx->O?{@hJ=Y}hb27aSZB@%7hpbD^P;k>7kXHy0Qf z8VX*Ln3$4+{1p-s7KXS3?MFdjcsMZ;on@&M{rTbHd-rB%r>0a@yNinYEzk$C+&GPa)H&6}twiNvWX z^jjH>>(|jyq0^r{F*Y_aQCENR#LP@AUcLJ1QyUxL` z=b!QMadF6#adFYn3JT-nQBffwix+ovL`3-bKx+vJad6nV^VzevZ*ScKzQAOFhc92i zXWqU0^5vIbHf*?Z<>AAT5jOk&{a3H1r#EZ>|9$y#{`^1w`0(M;qi?@``th2B>mPjlty1D`afbN|;rBWy<-Q7~DnHlim?rvj4Chy#7D?2EZ z?rx#b#)ik+wae8tJUlkGtt})ZIeF{W($buqqM}o$(4Q?VJa;ZRxuPOI{@}sF!qQSd zzxw)?ma;My%g3jn;QDp3*xOr8?eSwK)6`T!0rB11`lp{>ys);mvshkgz^4Cn{4SQjopH#Rmte;$2WBO}CnO-(-k=bv#`_4MxEg;QYNx_kHV z_g{bg(`?LLL#A)1Dy)a4igh}GS8g@uR(@K z-^tAEwMi?eB+v=X>ySt-*>Fn&}l#sA(TVi5xa8pxlZBtWP+P;0Msk?Tir|;Pl z7`T6bOiV+Alhd9(5=mg7g#{cNh*%FEkjc3IFJGFP+Sn{u@a!4%te<{@ABD{p3QwH^ z|8RFddloty;yLsgbSlBS;0$52iA0eI&KoT))Whg((&@kaf_S2#@%%aB!HN~HUO~}b zzy8->k!Mz{c>5O4fF(*C#nXO*^-~n_zP0ef95O-8np==q-I=XPO=<9Phlat7* zT<-1LSfA?Za555!bo#k-aH^2W=(y<1oIitucq|kiKMuBRWrY~+QZf}R4B9*qb=H<1uMMf4ES624-XJn+M)z|Oam!BUW-_o*gUs+j1#NNF_L+$MX z!QkNdcz-{eEf%}FQYc+rW@b)Kbb418SQeAn(_?3ceACn8<_1SnSC^-!y*-n;eY?B6 z9528HoxW|Gi;JtPNVIL6n;U-W>~wN6Gm}a?J7Z&AT(Yv-+uPcrqnnxv3XUDi$k@7- z$2)f}Ev>3*$&xc?+}uJ!@I8e>J3B>1#22xcKzQ;*ATT#yzWnA*KHu0_Lj#Tl_#p=e zNhDoePtS=7BO_F#7cYWY{qV!jKSSSGy&81|l#?4b5I=alTerXqh(yE@5=l|<%^N0@ zMgu<3-}>&m7cX>m4GkA9difH%(~>1mpMvEsTlW6FKp+x*_0>QBI668xEnfWLgQKIp zJ?cv{GZT{)E2gL6NY&Lneq2*iNy*Giu0T*IckhDPZP)sAYk6DOvp`}?6CyStOgJ9dafE-pC3ZN*^h*kNxE=h61<&d#>BEY|kz zE-p4U4952DPENMAWb(Fc4h}XpG}`v@=a4ULwSy=e_ZP}8Oj>Ir;hDd^0%--h(>O(b3y`>C)%Vjg4(=)~va62cJn@eR7gU zV=$m^!RPDZGBkub#?lgwDRju8lj1th%pm@$t6#eYo#UsUZr+4`YhdupFLGz;^XGJ# z!}y0E-oJ-#{q@)H-$S)su;9fDZEXVs1qJXJ2IHG=?%aWLxMIcY*T%*Y33#QetA~ez z!u$7DRyH=@e~-Kd9y>a!rKP6k<8$nova+ILYU=6Jh-VHCh;u9!_>GYf9De8%7#Ps$ z&~c#?qQk1EXK9HJysj>v|L`IDS1KxZ?!X7QVZ-Cc;9Cn8{Qf(K!(xGtKu=z_?C@de zg5XaM4p_l+b5&K<)xZlpIOrSL*@cEGC_v{!|KQ|F8yiPQ1B09#D=QA?$dTOK^74Ry z>gx3L?(W#w^z_QgW5)^#GBdNXdVAqjNKfzSiHJa_d|)6cDK|GizppPb5suxyzBJj< z+Ir+jWo1A>Q`7$an>K}o+1Pk^AWqoWz;O&5I6Jf1h!>8I0>QRzuCBJWTrTpDxjBQ; z+3DyA9}gbe*cco4^+~0u+uGa1!~Ol?A_))o^o)8Zt9SN8#rR z4xX9Ww5gy#EIxleA|fDQ_3G=_?d_p|-?(9HY-#!3cb6_fA6HRUP+xwwpv zqaR>wJUNN}09)of9DSRPfAMn??Zu9Q+xRm{hnpZK7B%e z3v~g9BM>ZE^6?{!B@nD#d+#2cY#TSiVMwE?r~qetzOwR*7ks{{sir3K5;|SCZoz*; zqusyH<-)@yk2iXH_wQRG;!`FAyCOE>Joy*FSll%HYLW+vg(su4dX93RD=;%V(v3qxNGO|`zS5i`P za%5zAxvy_sou{Xh6Pw-H>E&f_&*5}-N~QMpMn;{T{{D7$#>SnUK0a1fID2?N|L^GV z_O_QDJ9Y#IqYu#8SyEC^P+y;)UsQw$mz|xK79U?%hc%F&-`-wOaNs~&TYrC0(Ae0H z9lgCG(U~(XEt@wp7zYo=#RUW)&p0{R+p}1clVH%xmd(uA+S=HxUJX403LH9=WU{I0 z)D+gQNObF#jSUpqt5*?E_O9-wEXeMUw=jXShecaD_dJf#~*%x{%&uttNZ*pn{8t9%aR>UdPJs7j&}c&+Y9kEY_^~`Df_faG)YDV&cNY1p1%652d7Z^Cs%I z1q&WO#`jTBc=(V+($ZS9=J8`9QAtTv^|#-kA}(9@@4u+y7cTtx(a;ci5`75<15REj z;MUg2L#3tj=KcM*RGOByc=6k}R#x~Nv$JMqUS8jRo0SE>EL?oX#`^jP50;izRt5%c z+LWB!(&Fn|SQr`E-R|TK0YNSF)>@WdU+KWr=@jwhlZAx78LB- zm5`8=lbG1j5)_n^6BJZZ;_Teo>hEu51)d8RAdlDC85k(XM{uyUwM5d<5fET0J32a~ zQcN7|*bx!o?G3kkYHCc(rcI@#$;pX{ZEdBcX=#XTTef6nWoPf&RaDg9zkBzkOLlfo zp4`3r;e(>$=g+TSfBLj|@$1*OZe72=YSqPyc(s|?@#B$^fq}lh7cWLe1_bEnT)i3= zCY65k&G@*jt(n=6KOQ*(Jsu7j@LXeK@B~zD4%@Xy)u#=MB=Z%qNBND#ryYeZXO;>mi+rK^e*7Q-CZhOxbW#y z8ciU84_r%&N`>Ab7Ten+PkDO!`!8Db`LngPt?k!e-?@XXw6d~1->h9bH3k2-s_NCN z&>!GP1wT<#eDDAct~G1kzJ>a-diCSS_*Pn4FJCekYHAxcynoMNXlgE9`uVf2uD14~ zMIS!s>yydIlVHah8t2c$c`6pq&4q>Kq%hHkA?ig^rwf04+@X!q`*AjG?#p0F_V+dDf0 z0?<+1x>YK*vT}6n=txWq2uMnTCoDO+xw)_~Jv}k8tE;>mRa|T9_U&*Ko;Xog*WTXM z_3&Xx$l&1U=*N$I{?ydPi+}uq{_V`nvu9dbhYue(Ff_#DH8jA@m6<8`DQ?~j)Z5tw z2Vc9ElM^2gy*(iTc^S?y8=G&xg&xP@sH#p(p!>(;p>GUc@aPfv3W4zSDfqzp^^YDQ zUx9Z5Kfnw6%653YukX^OpFUYzySO0U&}c?R zN=kqK&E;BJe)G+jFDw@D`{D(Gz+kLh`|1^w$>jns=)f;uF6XJJJ2A(!aU=Q!aDd*u z3!JZB{p=Y!EkFMF`ZeMm^aAvu)YYFpWiZs$m6U)_HMQl-|M&y!?AveOzJ>n#?YEB~ zQ>g-hy86S1=z0(c;J5ktixxe4WML5;te`MC2_<9Rys|Rnp`4tsFe@uIyT2c*v69k> z6Fxq03JnZoXIECbxHL9eSrrztSgoyoemizJIyN`^``6c7Ti4XUi3%L~`xh6B#o!~E znW&GQo#7np?R9fYOA`vax~#3?b3A#{)fKAr;lsYZP;QZLoSYmSIy$1GrPA>5*4Ct? zh=_uMqN4cth=``9ii(JckdUsf?c1Ri4GqDIT2yrPYGPtjQ(N2P$Nv7Ut(~2}{NnAs zWlLx0%#5$^jvYNc6BANtO-)_hu3cd5;oCx#67QA@_c7?nGyeKF@*I}`iF1>pf@k3ep_HD!yB_+B3`{R$# zoNZ1MGlgMG^uboq>oT3Y=5;b7mo z71ceNJUNLj2$zfQD*7@51J2G44wjaEec|B|5iv2%%|SsSA(@$Vb#89%?qy|r_xkww z`flIe)rELBGgDk#Qc_rW`*w12RaJTUty>8R#l-~$|9v-o=@GY2_z!x($<>(k3ykJ2@1m3s4e&fc~s~0XrmB;07 z+<57dr)O9gbdCcDdV32CeSM3H3JYCaDk|i0Wczkc&$>E^q_#FfHo<0VTU{L;T~%dm zU0)v-R#s+V(byOmn4fQI+S&@uMkH!!2@fwVwXkSz#+)35a_t(tK1}A-tEd9Bwc+12 zHpV=mn_EDDw|959tE*Htsk>u`o13?HNl8~%N=j<#@#DqCWo5<1KmVMbUR0Eud-ZBo z7My+4)7jZIH62jPf81i})Jb}s7 z($dwvco8^ZvnMApQ7RNpOqiO2Nsf*}ZzqwE3*o_mGZ`~rlauHtl1TUOqi)jHhQ5ah zlv}sZJzB8>{DQ~(>Z^C}pt7!5fj%Yr1js8K4s<@?W!bV9FW~Umxbf*zCKL6&94G77 z%W<@P`Lkz;Ki_=w=n?wU;8)Nei9}2?U`AwI=7iPLgYygZ9*-yQXY={UbEvz}Z;Xji zP`G$eByx3CP=I1)YwPCb?2I{wsVQY;L&KFT@onARp+dB@?A%#U;NfxU(z$b8U2q;| zXFE7lRfUIFRoUBb-yRau(&FS)Ss4*gU2SU%{##LDY1z^Ou4``I+#C{8QX-MGw#xC- z(gHl$+Sb>jTZ?%h)QYG&w6uuC4I5@=3=F^)&Yrch^6)S>KX}l=!Ou@B-MKR)Br2-1 zvZkh~sk!;$#i*#QTbrA2-;RtdE6d3_b0#~xygWPm$dQbUwzi6j!-wPJ8yibYw{3$W zjk(bKTr*Y+72XtI_{&Xz1y2bQFnFQYI!mJ#B5*uDyEI z+8T4Km_R^&LEWpR1wR7x4SoG9SI`aKxDmRUsw#tV_AL6-=nEJdBmbN~Z)z%cXh09+ z@lc=RyPY`$m7hkNoW#2jiMMW{4$;#3mX=ml$d6*N zM6!JO@4tg}|M=tc=U`DAH@v=d6zH0a|aF)IJKcl z3k0bDbah3diqszCJv>veMeRu`xEbuFl@Rr3FmG*}1wJSsYi9&*$-& z%#jgfW%z4ZEU0F~!)9ifP(FANt}h##UAugIf`U?0TU(2YN=o+b&B$nK+PryuJUTif zBQCDH8ww#1Tv}Qvo2V!&%gqHs5)+GyBO{^I)YKrKIyu$Vg@xJKSz0zVm6k%;X=rF| zMO~Jg3*R-J?%^>w2%n9X7WyrG{`&Qpc+uD2u;Kc3^jqMB$D}YO^*J0kZOvj+W2I^D|Z;zjh0M55VQuoEWp=1r`39i4mk;9Oq6{{DSq zV}anuAMf3R58>27SGWppvHXB#!`Exi-m6d<}6?jopginUW z0$&0D_~D1gkI^TE?+W_B4?p0};**bzfPZ5p;*pzMZ!gg5>DktXzIs^L!GqS;@WelS z7%4jzEI4)yj#mSNwl*lESy@(A6pE74)Rai%ZW^@BRJZfuGQ#(4myvoYJE$!@f?eg%jw3JBt`dnS@?HP=|K4)iFS2DS;4}Bpj zb;k}H8y6QNqmB+27k76*zpYz?g8convTAFSlF$z-Ee#3r_Rh(vuEx|vaPao+{{Ehx z&d$BPo}Ml)LgDu99v<%QY&J9iKR+X*8ks-c-QCEjp#fE#rDaOWo;|3`&`HJpv$se8 z1RbA?vYi{?z(JjZ&h4#Rm|xb`zHouTz(gD-%Q3M#IEdA4W_IWhoxWiMCV#O%0*`m; z5+<$To5On0*S~ug6H0n|j~=mDa1OqBfj<12HIE({8S(imR>0@R=dW9L^qOeTkez8COqJy7+6gX`*abQBfigw9six;D-CKRq+ zd*)1dcu|p?TT4rnY;x1f3x88v>+0Ij5E{C9v%P(7ZDeFa18|g(uyw1aXH`{l^0sYW zUL_@QaqaEy?p0OM(az4Eo?EtrgkZj*wKY84#|L>UA|g0gEN*KHkR3)wsK5OE!FK`! z0|I<}nwtFl;9qKPhWkAvq`BGG*VQ#Ju%!jl6VA>Z9dLiJ*?afG$El%l@Sv0IAQ1NK z2?z)ZLR}UUs zIyx{%79QT!g>H3xd~U9i(oa8O>IeH!i@m#FtgBJR-u^*WSLd5&AyzS6CQS*rukiu)shY8^o)C0N@X2SJ%cyKRA5D zH#P0l?&66kL>ekgA8*_Ao?s?%tL#iV6e z*!Z}Y>{z?@)-69jU*BcRpzFe^0R0pdtUO^z^7+_F0P{dU{)oOHn9b?aSoglZ?d`a$adFt+hf2-Jz&tgPh}{c-6U;oI ziwt!XxQmZ(YeQZP3+w7af6B{CKBpoUA3hA-MIbnM5O^{-@9hP@MkIzWG$y8`1S~fr zBQulBRZ+>!O-n=6DJ+bS$9^i9CqzHJtgN)u%*@CLoj6xlJG=P!iV8nJXXoJH!ot8n zSJ!}mjEvAwSJ&w1#Kh=my*!{6csr;TUush zw6r)oTUo(pf%+K}ze!2a(eOFCxY*l6;pX#k$7W`rzw7J62Lb-^@+BO_Dk^W@z<;8s z`0KBzr<9c7M-hwHthsj&eFgYdtgXf3b?eTaMcFYyX?&sIo2;P~Lg#9-R4b#($ zi-C{q?7~81z1-Y_0;u}v*CI<56;)KA&rnoUSBHHN3JY6WkPXvhdp1F@g<}l9t%!(* z2Ivx)E~Qd6G;(AIg8`f*Cxd4d7A7QcIO^)f#YstcA9UL=7gtsW_9>BIUK`gVIT?4? z!XhXrHWoS+G;cRIiKMqzew_yfppLn@A^&@M85s=@QYe^+g{ow143`-^G#fW!RpBa4 zOaufZB-q+^cIM}|v_wRdlw@R}*Hc{`7q?}LvvX-Fc5bk?ZfFP$tgg1O*s((@g&u=! z2ptc7<^SQt#Rc&McmYnNQfFtx6@P!^AK*leo4`N^2jEA322Q}IQ&QsN(Z2+aoSdqw z{r$bXtgNc5k)IqLQP&3sVmC?(XQ*pF0P95M{o6kqD0d$B#`+pv$~?ArvCwK7I^;@5YVL zd%=8f-7+%ba@ViNep2wKOiZ9&B9l>%=;-+S*Ve*Ekdsqd3N+^A6cz%F&>7imJ-zgF z`8hi~KVLpiU0jUU7ZhyTgn8NMAquY%>ABUr<3GW;7QC(d|1|n}+8Fv1XNKjjPdpkKrL=+bX26}izMrLPY$DiWj zm>7S52Z!!%xT4I>ckQy1?GuKnO`*`j0{bICuS3@ao*QN5GqU{%ghK4|MJAh=K<##R z4h%Fg>FY~RudWUZEHBT>>ge$IFDZ$L08T0^(Zd!BySu%;3k%VA_VbhLFnBDI?TYok zcp}e3;4Q$3{ET=5z5-qY8~{H!qdu3P;TCmu#jG}zmAX1q&9=6+weIeiGjC~0Pft#c zimIsS>Dj)$rNzr@@7}(??ruxVl9H^f#Kio3`F>*9T@F({Q&V`?h@YVQLD#JoK?p72Dd@)S%kR$Uwd@Fn|vPbC$pfT;=KMd3n%>v$Jz^;bOpq zG4iPVbvPFlfd>~B0!Ic0#l?k%*e|TKG&dKxDl5y#K>xhFJRt!pEwmBTbu~4ip$yqR zM)mbULD(0nwKXvj{0ge3i;J~2su({%1j3_ zI^UTy*#C)29U9{EF$D~MD-d7`3fiT7UpO95O%1Ef*%^NQq@-c6L@4x{>+$=)RFi|2t=8fyWjU;Ode{rKOm& z#C{%#BLo8WJOFO6!wTF8H8sGAj!sQYa4_nk`g*C9LebQ0Zgz8n-xz&5_+P85v$Ei1 z3=4~ocX6?_MD2?{>i+%m{nxNB8TJLlK1-;-r>5XGmb)e}e>XX4WMpH*W}i7jAb?L} zzZ6X0&C2%MVY5|KE?h7%v9rUx0Cc_ZaOmqbHPFT6{i5BwU0sneySvdZ!mbm+!9_(@ zR`9c=recmn9zRh3AddX+EXM_K6c`BpAwMI&$Z--D78K;}URxU-9UkuMTU#3#i1koc zmyi%0jeXKaMuvy6n5N8#7B>=Uj6aM9XqP3($cUi z7kqt(4#DNDt2;W1)yCxx4D|K2v{Y0`r5``uxN+$cd?;71Ub(Vp(a=zQd~&jm&Y?q& zjvgL-{=R*1`_gDbLrf+nVBjynUW%w|vE$3^Eaq-CG%j3#AA-kgY($?fDhm0CNCa;I zkIBmeUWmlp+>8vM4102+ZYn59P6loY3*~3@U(ta>9SU63*GEU={ZKCeFQ_}wAH{VA zju20fe;ONoeZh0u+Z`OR4_r@=R0@9&_#yV8Dl7Bw5Q{k+%&X(`T)qsK72NIU3S%Eg z9uIR@=g;ftV1LQ!X?=b470`{s4kvKE= zwzk{0IXcG1LjRDT;e*S{0)O%M&(5~7*}B!vE;5qK-Md$glji3C|18H#bF&;LEiH0< zpuPr9pwD7ot=d}f5>L$B9&TxAZLO#X z3;X@|-+p`cZ0XXuxlf;d`wh7J{Q2WYod5U(^AQgo^z`)hs;Knzz(?%pxNVz2fY^NU zq(sJd&{4IpKm zYJ%#;;ndXF*}*?EF~Q{$2x@AWQi6*I>J#GNg$r=0>dW@^Gcdqo?8Ai5g*bw^b@?)p zh`J2VgCS1H_G!UB3E(lP(`II{dybyo$&)!b$dRbRqN2oN%*6);(CJW>Lqgc>g9m+m zQ&VkZ`!V?VBqjncVzI9;Q?_qHXlPK7gUnBZ`z((y@_l9S82iiM_lPfYzKXmQ9PH@{ zz8f0q>swPJl|r#=YJ#sJGP0&-U|`?AUAugJpFDZ|`2Ky&SpgBauk!OJ+414S;>CZ- zj(6{Xm$^B_nVFgC>0`$5XAf_A9uR(Q&dII~zG&k4Oq@_hgWo7yM!zqud9yq{s6N#j* zj;RN^$^)+s_A3TXaNh|8Jic^EzW*Wi=Yn2*=@NRe`ucE*fxlzlO5h3mDhmWqJ%vK> zw^OIYVh0C4|Hu*S-G`|Jb8}x`4hQ?F`1>0f9Xp2IS6y9q?)3IXWww1goo-=aXgE0; z5)v3_Z~s5MgolTO03W~$a3IGCYIVdF#G&9|Z*S;!@WIv8L_~y#2L&}Z7Z;;Lou5BD zd-?M8w5H}i|NQ$ecnap|aGyVZ{PYR)anGN>c=7o0x^*vKzJC4q@%r^IUc7&Q@7}Uy z)6>_lkBsQ+A2@L65N4t$CeEBWd6G>2@&%K-$UpLY_T|gx&)7%c&p$tZ{_C%K^FGU_ zIC1_Tp1ypM&tv`m`?F^Y7v8+t*Vop@WTIY|NW8qNs^G_i!xVTiH_y*!%I3vFLJA6i zo7`Mm3NcSdLqkjqd|8MKxGz;zK0b&$@US6& zG&H!l;C`YGMZ9Wmj){>-;3G*)#JRX1Vs|194Y&ib z9|iW&M!x`4a+tE5nbFln{RLcLu4;A`IKi$En4Z#+?N2E`W4}q{MNC5>j$OZwnNRGi z2@fk=V|>0?%wWJZW@ZL;%h=e(g~K^{65Vfs;OJ3z_lO8*XZW-cPrADa1Wb8fxq>M< z;3Xs^I9MKMLPO>81bAs|{C_o^T}YE{7{?Rr6T&*kpu?cZs7Y(ik(O~{Ei<>d|s^TWbIo2|Yc#yKu+BO`$TTn@2+ z@J!d%$Q!a84*&hTeS0uCH#a?}&$zyH^-@81s}9vhpP86DlX z4>S-jh$bRFttbj{u0x@X4e)^iPvC?#97Y)~o`Wu&=gTtn^~%bhKijrVPy2jc@43)yjFRw)WO7^tdjU#gd+W;siW3aOClnlz`8cmV5X9QIzU#x6^s; z+U3h`cU2YjAifpw=$WeGuZN#8xWQkR`n$g$%@xx!m5TU>Pc1kfRQ&6>1}|i;;bD4~ zusf2HsE>a9fFr?*H^8xDen0FL)cvr0k`;FVwVLiFUD2#8oenhva~%Ae9FD9k=7u&K z>UZj8d@M^#OG=nmf*1O9ckW0M_>iRX^89@AE$4oL7ps+dCc3Hr6#gD~sjaoy>~^9$ zyefRoe7>$OJduej(P(_USVf${ZzL3oM(5`f68!$j$)O=S1rrnf{qX5$XGcd96Bia% zSMe!fzXeW0A>!2LCJJ%zffEI5EXEp(t*orA#l?Xh{06v7{8?O#M5v3ni++5oPD155 zJ`O*iv$L)3$Pp%Pbdn!FMDOt8MR76p0dq8TlMM|eCG_X&>K;8Z8qb}pt*xrU(SmxF zb5nhNK>_svy)LSw#>Tunvl;!C!(p+UKaWz7E)o81u)pbE3trLV$DAWxy(%osSD5tZ zd3Yaqp$dv%$Y=YO>oiGj+P=X4FBaPq(#EYo9rT zkCN3&f8Jur&em%A1)V*6RPocgdGpE@wYsC@{(bu7Z{IS#qwirdna%jV!IojVk)Dno zwyO(Pu13Su6h3lyH~zv}Ei3uV=SxlHdxnz<1=Ug{lK&ftV89KPJ- z&5;qUmeT zth^lVp1=z$cwtTiUh3;BDk>FU=!ORPyVcdto(&E8{Y*#Mucf6ud-$CPgS&Rk&B^lA z)c*ZHe@;%4cRqja?ZvGOUeCvmTJ6+SFi4&PU+lZ6Q>bSn5qu`L;)z&^7om{A)%rSl ziqjWy1-~2W7g-L4mX_iaUlYzz@ab1qWqJ2*S&l~W!&zPqhl4?ZKXm2fH++})eDaqp z2LiplOpNi(ee=fQ;M~&M>TsZ2X=#xp`eyiY&1%A@fV2fS6n4ZoQjr*_&^?Gon(cnAT-3>cOt!9U)e|vjP qro24nPbQPqdf`GxhfYVok12gl4!kIX!D7+t+uKi_!e{o|xBmgk5f3u} literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..9158c2365b5bb7f78a0ee0e4a5401002f3af7873 GIT binary patch literal 26037 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 Zd0$CMT^$^;@^X!aeSm%Y;LN&Q{{byQ0p9=s literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog.miff new file mode 100644 index 0000000..9e113ba --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:55,,##66--&&77//,,9911//;;2255;;22338822228833//6644((4422##3322 1100..//////##0000&&55--++>>**55??++77;;0088999999::AA99<>AA88>>11==..CC//HH22GG//BB))BB++@@))??((??))<<&&==((FF00UUDDKKIIXX6677EE++..BB000099//--5500**6633**33//##22**::--$$99&&""PP::==ppXXhhmmyy}}llPPNNddNNTTddrruussuuPPSS\\55,,##55..&&77//,,9911//9900119900116600006611--5522))4422%%3311""11// ////##0000&&1100++77..//<<++55==))4499,,3388443399::44<<>>33@@>>//EE<<++UU;;**dd99((zz88**99//<<66CC==IIDDKKGGGGBBBB99<<3388,,>>..FF33GG44DD00GG33BB..>>++>>**==++??--GG55TTEE~~OOIITT8877??++**??1100::55117766116666,,00.."";;55))==33))88))$$EE2244XXDDPPwwaavv~~||oo@@AASS;;AAMMXX__iillqqwwOOTTXX33,,""22..%%44//))5500--55////44....33----22--**3300++22//((11..%%00--&&00,,))22..--33..2255//33;;,,33;;**00::))//;;,,//??1100??4400@@66--BB66**MM;;--VV99))ee77''xx66((77--==77EE@@IIFFKKIICC@@::6644--77..??33BB55AA44>>2288,,44**77++;;00@@44KK??[[NN]]RRQQCC::9900))6633,,3366//2277001177--**--""4444((5511&&55,,%%99..,,<>55,,BB<<00EE<<++PP;;((__99&&uu77((;;00DD;;HHCCKKGGFFCC>>9955//55//;;33<<44::22::33770088..::11<<44DD::TTJJii]]||kkbb__NNBBDD6644::..((22))''22**,,66--,,44))++--""//,,##6622))8811++11++++ccaaffooyyxxaanneeddqqhhxxxx]]ii[[//,,##....$$11..''//..))00,,))//++((--))((,,(('',,(()),,(()),,&&**++%%)),,%%,,--&&..//''22,,++00''11((&&11##----%%55,,''==----??1111<<4422558811//;;//11??..99AA**FF>>''ZZ::%%tt;;((AA22FF::FF==EE<>44==44~~::11~~>>55@@77CC::EE;;EE<>00==..AA22AA44==11==22@@66??66||<<33pp44**qq88--tt>>44yyEE::}}KK@@\\PPwwiizzoo__yy\\GG``JJ((@@22..%%..))%%..))--00))....&&++))&&&&&&))WW__TTȴppggEEXX::3333334444225566116677116677115566004433..3322..44001133//0033--1111++//11++//22,,..33----0011))))66""))992266%%<<55--CC5544DD4477==2288772266//33221188007799,,==44##LL--__,,zz22##;;++==**BB..BB22>>//;;..==22==11~~:://}}==33ww;;00ss==11wwFF88RRDDeeVV}}nnooppeellZZgg@@ffQQ,,HH<><<--EE<<33KK;;;;LL77<>@@55??AA44DDDD::GGGG??BBAA==BBAA??==<<::??;;88>>;;442200##00//AA??**==55""@@44$$II;;..SSBB;;TT@@??OO4499PP//88YY11<>XXww$$44WWUU..''jj]]MMwwiippoommssqqppzzooggNN``FF6622@@8877??==;;<><<::==??==>>IIHHCCDDEE7799;;%%<<::##RRFF66OOAA44LL@@44MM@@77MM>>99OO7777RR//55YY**22ii**55<>==<>CC;;KKCC^^WWZZUUMMIIKKNN33??11HH88VV>>bbAAkkDDrrIIwwOOxxbbMMcc<>>>66CCDD44GGHH88HHII;;GGGG??HHHHHHPPOOUUEECCNN5544<<66668899::445599**6699&&2200!!<<::--CCDD66FFFF::GGEE99JJ@@77PP7722ZZ..--qq1122BBFFFFKK77::3322>>99??5544&&==++88&&66&&:://<<55;;88;;88>>9955..BB88KK??TTHHYYPPLLEE<<88<<<<==CC==HH@@TTBB]]BBeeEEjjKKqqTTvviiddww^^ff]][[߽Ƈxxss66..9944--445500--::88,,BBAA//GGHH66IIII==IIHHDD]]\\dd{{zzzzxxWWXXmm??AAPP6699@@226655338811//55++??BB77GGJJ??CCEE88==99--@@22%%HH,,!!SS$$||9911??::>>9955..44**==33==//55%%;;((<<''99))66**44--55..22,,//&&55((??11LL==TTEEMM@@;;2200++3333HHIIIIOOKKXXJJ^^IIccKKiiPPppVVttYYqqccrrjjqqaabbώù>>55::9911//66//%%6633"">><<''EEDD00IIII??KKIILLcc``uuᦦъllooMMRRhh77==II;;CCEE;;@@::::;;55BB;;33SSBB88ffJJ>>ssII;;yyAA22GG88AA11>>..AA11CC11AA00AA22EE44BB..II44GG77>>1166--55++11))00$$55%%99&&FF55PP@@FF8888..6611<<99BB@@DDFFHHPPKKYYNNaaRRjjTTmmWWooUUgg``kkoouuYYZZܬII====BB9922<<55%%9944==99 CCAA,,JJGG@@KKJJRR]]ZZyy{{~~[[^^}}MMKKYYCC88>>GG1144kkGGIIhhgguuppii``XXJJKK99??**==''DD00EE33==//==22GG99@@00FF44EE88>>44771144--33++55))??1199((FF66QQBBBB9966117755::99CC??DDBBFFIIMMTTSSaaVVggUUggTTee]]ii]]eessvvVVXXzzyySSFF@@MMCC77HH@@++BB<<""??;;BB@@++HHEE@@KKIIWWWWRRzz񰰫ᔔwwZZnnJJ^^XXjjfftt]]ffKKMMAA;;AA33==**::''::))77))22++..--553344,,55++22--33001111//00//..22..DD;;77**DD88SSIIDD@@55661177..33DD??CC>>BB@@JJMMWW^^^^ii[[ffVVaammuuccgg}}[[[[vvBBDD[[JJBBYYII<>::==OOKK==22CC33@@0055&&..$$11++..//))++--,,%%%%""$$,,--44443333220033//::44**$$;;55RRMMIIGG==??88>>225555//55++77//EE@@XXXXffkkhhllddhhttwwggiittqqaa<<66^^EE>>ffKKDDhhHHIIccAA@@^^@@88\\EE77VVII66IIJJ::SS____ss˙ꜜ阘٣βzz__||CCTT@@MMHHQQBBGG>>>>DDAAIIAABB88;;0055))66++88..88//55..11--++// '',,11::;;22//))$$11,,9944::66**''2211BBCCGGFFNNKKJJHH33//88//@@2211!!@@11OOHHmmjjYYYYffeerrqqqqnnmmggkk^^ooggRR__MM??bbNNEEffHHJJcc@@DDaa??==aaGG::YYNN22OOOO33@@NN==WWjjppggvvȌrr``99^^FF]]88DDDDMMMMPP@@@@6600;;22@@66;;1133**,,##..&&44++9900;;22663366>>''33,,3344555500::33FF>>FF??8833//,,//0011223311;;77CC<>UUMMBBWWFF>>ZZGG99^^MM99ZZTT44TTUU55HHOO==QQYY[[UUTTssttffyyzzooHHdd55II22??DDNNKKNN::::22++<<22FF::CC77::0000''//((55..994499774444,,44$$..**004466::77CC>>EE>>9922EE??LLGGFFBB::6644//33,,>>55NNEE9900<>BB////11**AA66HH<>77<<44//%%\\TTxx~~ggwwNN]]QQSSNN==jjttQQkkddyyppooͭDDYY22EEVV22IIRR77QQPP;;UUOO99VVNN77TTOO22RRNN55KKGG;;XXOORR\\JJ``^^{{uu____SS]]BBNN<>;;??99??44::005577>>>>DD44::0033<<==GGCCMMEEQQGGKK>>EE88EE;;CC88AA99FF==00 11%%4444667733//IIEEjj}}QQmmIIbb>>BBzzKK99ggmm^^kk__aaUUvvggyyii{{nnvvuull__[[TT::\\QQ;;aaQQAAbbPPBB^^LLBBZZHHDD]]QQQQff\\ddyyrrãęqqccTTQQOOOOOONNCC??9922CC99NNAAFF8877**@@33AA6699006622??==EEGGGGKKLLNNOOSSIIQQ::CC11::IIOOddhhjjiiQQJJII??FF99CC44:://;;00992211''0022$$,,--//446677;;@@xxaayyLLiiGG\\}}))))eeBB,,ddvv__ll``llbboo^^oo\\yyhhsstteeeeUUbbLL>>aaKK==ddLLBBffMMHHccKKKKaaNNTTkk]]nnxxoovvttyyzz}}~~ΦllddllcciiaaOOGG66--<<22JJ@@JJ==66**AA55AA6644**..''8844AAAAFFFFXXZZccggYYaa55??''44FFQQ[[bbMMOO>>;;55++>>22EE77;;//==44>>88--%%77##77&&**((,,2255<>aa++bbEEAAeeIIEEiiMMIIccIIHHaaLLSSttccuuvvzztt^^^^vvzz⼼絵\\PP``PPrrsshhWWNNCC;;--##<<33??55DD99EE99AA55:://88..88118844==>>[[__MMVV55AA<>77AA88??44<<22<<55662211))77$$55##33....3344??99LLggJJffWWjj>>BBiiLL::DD??^^YY11~~VVLL99``SSbbMMggNNbbFFXX||>>UUww;;XXyy@@MM4477WW????__JJGGffTTRRnnaajjuukkrrkkkkggrrqqԗ䚚ޜϣǑttjjrruuXXJJQQ;;mm\\yyllxxnncc[[77//..%%33((77++<>44??++6677<<6666;;99>>88==44::4488333311//((55""88$$??6677::--99II^^RRppOOiiPPYY[[55,,IIEE,,1177bbYY22ffmm::KK}}44YYIIffLLkkMMeeHH__@@^^}}AAbbEE99..22DD;;<>..??11AA44AA883344BBGG44<<""++,,7700::**4411774477::::;;888855886688552211//((55""<<((CC66::77,,88ZZppCC]]SSffkk8855//<<[[iiEEVVggNN[[HHkkOOnnMMiiJJddDDeeEEjjJJ00..338888880033((::BB33XXcc]]WWaammXX]]wwxxׅԌ͑Ívvqq``ppttXXMM~~PP99]]KKqqaallccOOHH22**11''66((88''==,,BB00DD22@@22==22::221111;;??55::--1177==<>GG^^ooEEWWGGOOUU>>00 //DDYY88Ȥ~~RRjjQQggTTkkOOllKKhhIIggHHiiJJnnOO..--22335522''00--;;""LLZZIIRR``aaggmmΝۉċ~~uurrddsskkTTZZXXNNQQBBSSEE[[OOMMGG33--00''99--88&&66""::''BB//DD55<<0044--00,,--,,6677::;;<<;;FFFFKKLLFFHH@@DD338855::66::8899<<==@@>>==99770099**>>,,44$$;;33^^bbVV^^NNRRjj11**&&&& ??WW55}}lláxxWWYY11]]{{EEhhUUggMMffIIffIIjjMMppQQttUU==66==>>==8877<<%%99DD$$GGUU;;KKXXNN^^eexx{{qqxxjjww~~rrttllaa[[bbYYTTiiPPKKTTIILLBB??66GG@@CC>>44,,88--88));;''6688!!AA..EE88>>66663344337755==;;BB??DD@@DD@@FFCCAAAA::<<559955::449977::>>>>CC????8888..88))77''55&&MMAAllllPPOOXXOOLL33EETT33nnddzzssWWWW55EEMM&&ddPPddSSffMMeeIIiiMMooUUvvZZxx\\\\GGPPZZKKHHWWQQ77UUWW22QQYY44NNVVAAVVYY``eebb}}uuoogg]]ccXXffbb[[UU[[VV@@ZZYY::__``AAmmYYAATTKKMMII7755<<99??;;::11BB5577%%EE--:: 66??))BB66==88779999<>DD>>>>7777..7700;;77555588;;55::33;;44::==>>BB>><<4455))88++));;,,YYKKZZTTVVLLhhSSddggHHxxlloojjMMGG==""$$((00@@jjXXmm\\llWWhhQQllSSss[[vv\\qqYYnnUU[[ggTTPPjj^^HHkkffFFccccAA``bbJJddcc^^``]]ff^^WWgg__WWdd``XXUURRMM::EEDD%%TTTT..ccee@@ooZZ??YYPPWWVV>>>>;;99885555..FF88::&&II00::1166!!;;..77224488::>>BB????88??66:://00$$77--FF??GGCC>>>>;;==88<<99;;@@==EE::??1155''<<11>>33[[OO@@66^^PPuu[[~~YYooKK.. 77117700??II&&11FFggVVuubbuu^^ooWWppXXtt^^rr\\ggRRnn\\ZZll]]VVkk__QQjjbbMMiiccMMiiddNNiiccSSiiccWW``YYOOooii]]ee__OOZZUUAANNII33HHDD++QQOO88XX>>--~~7711^^__aacc99::****9944==3366&&FF1188 ,,..::..BB;;==??>>>>;;77>>55<<11:://;;..==22>>77??88IIFFHHFFFFCCAA;;==1199&&::$$;;''55++33--<<55OOEE__TTaaSSjjXXDDOOMM44!!** ==HH((BBII**==GG%%((6633EEllXXxxccooWWvv^^{{eeppZZaaMMZZFFkk^^VVkk^^UUll``TTll``RRjjaaPPkkccPPkkccNNkkccLLvvppZZrrllVVffaaKKllggSS[[VVCC<<66&&@@::**SS;;//kk,,''7766\\\\``__<<::5511DD>>AA6644&&88'';;))BB33II>>KKCCCCAA@@==;;55??44==00;;..::,,::..::119911>>99>>88>>77<<00::))99##||<>::>>;;@@<>00%%kkGG99RRCCRRDDSSGG^^VVYYSSHHEEEEFFCCHH@@EE::==7766AA<>@@JJ11//<<""..== //@@ 22CC##UUddCCzzdd}}bbkkMM^^@@]]AA``HH]]EEjj``TTjj``TTjjbbUUjjbbUUjjccSSkkddTTkkddTTjjddTTmmggWWxxrrddaa[[OOYYUUIIzzvvmm}}ttUU;;**II))PP++aa66%%ss;;..LLCCRROO>>AA@@HHAALL??HH;;CC@@@@HH@@FF::AA2255((99--::--==..>>..==--;;//:://77--66--66,,66++{{77**ss88((ll77%%hh77((ee11&&ttBB;;VVMM``WW}}aaVVmm[[OOWWPP@@EEDD22::??++@@II44>>JJ4411??&&,,:: //==##HHUU99uu__||``eeEEXX}}::]]AAbbHH]]DDkkaaUUjjbbUUjjbbUUjjbbUUkkddTTjjddTTjjddTTkkeeWWee__QQaa]]QQ``\\QQܩWW>>((II33PP::%%88 qqEE::||kkmmEEMMFFQQJJVVIIQQEEFFAA;;BB55HH9933''88,,::,,;;..}}>>//||>>11||>>11}}==11}}::11||9900zz77..vv66,,ss77,,ll77))ff55''aa33&&XX,,##nnFF>>}}[[QQrrVVKKXXDD99BB66**22// '')),,33##::EE44AANN::..;;''))77 ,,::!!CCPP66}}jjtt[[__@@WWvv::bbFFffLLZZxxBBjjccSSiiccSSiiccSSjjddTTjjddVVjjddVVkkeeWWiieeYYnnjj__dd``WWssnnhhԣyy__PP;;GG<<**VVMM<<ӽrrvvSSZZ::@@88==>>==@@;;BB77JJ==55,,::00:://;;00{{;;//xx<<11vv>>11vv>>11rr99..pp77,,nn55,,ll66,,ll77//ii77..ee55++__33**RR--$$aaCC99jjOODDZZFF;;HH:://AA99..????33==AA33))11"",,99((55BB11,,99((00;;**..::&&??HH33vvdd~~OOSSpp::SSpp::aa}}JJbb~~NNPPll<>HHEEJJDD??55;;//::22>>66<<33;;22zz<<11vv<<11rr>>11qq??44hh88,,ee66,,dd55++ff77//hh9911ii::22ff7711^^66..ccEE;;^^HH;;PP>>22<<..##22**5533''5577,,--33''22<<11))55''00<<0022>>00==HH88//::))33<<++ssWWmmFFIIcc66MMgg::__xxNN^^ttNNFF__88hheeRRiiffSSiiffUUiiffUUhheeVVhhddXXjjff[[kkhh__aa^^WWrrqqll͸~~{{jjxxvviiʭrrjj;;22DD::NNDDFF;;@@88::44{{55--ww44,,||==44xx??44oo==22ee66,,cc99--__77--aa;;00hhBB99hh==66aa66//gg7733kkDD==yymmbbTTGG??33''9911$$::88,,4466++--33))..66++,,66--))55))**66,,..::..22<<1177??22@@FF::FFRR>>==PP22II__;;MMbbAAaavvWW]]ppTT66JJ//ggddQQiiffSSjjggVViiffWWhhddXXggeeYYiiff]]iiiiaakkjjeeĻ٩UUHH66**FF;;88//@@88II@@EE<>44ooEE99^^::..^^>>11XX:://VV66++^^<<33ooHHAAttIICCeeCC::rrffYYRRBB9933%%4422%%6688++1144))**11))**44++))55++''33))''33))++55,,//66..0088--88>>44>>FF7788GG00BBVV;;EEWW??YYkkUUTTeeRR..??,,ffeeQQggffRRiihhVVhhffWWggeeXXeeeeYYgggg]]hhhh``bbaa\\||}}wwij||mmMM>>KK@@uu??55pp77..ss::11nn7700rr@@77ll@@55__99,,\\??11[[AA22WW@@00SS<<,,XX>>11ddFF;;ooMMCCmmQQFFqqeeWWMMJJ994422##2233%%66::,,2288,,..55--..88//**55--''22**''11))))33**++22**))00((..33,,44<>qqII==__>>//__HH88UUDD22XXKK88``SS@@WWFF44GG44##\\BB33zzddVVaaZZHHEEFF444455%%5588''::>>0077==1155==2255??6600::22,,77//,,66..--77//,,33++))00((++00))//77,,//==,,66GG4422CC00CCTTBBFFTTGG,,::--ccddRReeffTTgghhXXhhii[[gggg[[eegg\\eeff^^ffgg__kkllddssvvmmýѯ{{UUJJggAA66__==11\\@@22]]LL88RRJJ33WWSS::]][[BBSSOO66EE==&&VVGG22ppccPP\\ZZEEIIKK66<<==++<>BB44;;AA5599AA6699CC::77AA9955??7744>>6655??7733::33..55..//44--22:://66EE2299KK55..@@**::KK88>>OO??**;;++bbccQQeeffTThhiiYYhhii[[ffhh[[eegg\\eeff^^ffgg__kknnee||ɺû~~\\PP``>>22``@@33ggPP@@WWHH33UUQQ88QQQQ77HHLL11PPPP44^^]]AAcc\\BBYYSS;;__]]HHPPRR==EEHH55AAEE44??CC4499??1177??4499AA66;;EE==99CC;;::DD<<;;EE==::AA::44;;4444992277??22IIXXEEII[[CC88JJ44??PP==BBSSAA11BB22 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..621c674f3a0ae47277b385e5ed282e71f1fed242 GIT binary patch literal 26037 zcmZ5|cUV;C_BFPc7!ylOEU5Gj!}Q)LGYq}=I`rOq??syQrhp0vDvG@U3Mi<6D3(}b z?@^=3eE(wT~CM57o!{UPi5>4>4vT~F(F)@he6rU8dBp@a-DJnXF#~>;z$H$~3@ThcU z<-nlW#84iIzQiFYLH7GZycL6-${;H%Cq;)PCh(G?1A~IYqJsjL#LE7w?2l8abUmUT zaY=lT>^JdY(IEz5(TPFPiM-gL_yF0vB}pTfgh->Jq&y;lN~6+fvR4Kg#Kwn3N#oOG z&(W#+L;{7PtQ-;_6cqh`enF8vFZ)FPkx4=S=UEa>_B4^cBqcN~QTBX{?4QZrghC=S z@HS-DlBG-7>u5B6eKob289Lp-KvQ#in!zwM)Ym_Mp2Z@O3=JnHI2HPU0oXO;zfZ#PmjTvoaAtbL?-jxIo5xU@o_fW z$cV){eVWTPGh;B0A2%@(i)pmOhb=8lObCR72i@JdTwUG$`=g^d99`XAyUNOVJR-5Y zeA_mmkiiHFI(pR9R3NalJa^9A+{A>3K`Fs*dM`v`D$0HET%nlwjF)=i>w(jkfNXTRdhn5yIGebi!uZjv|V;!B4 zkjhG9V?Dj7sPb~5P)8>^y0TIr(AJKMs;LnObaWyk>+88(P0jG|=4KvGTRS+oyIU+K z5^Zd{x}2R&Wk+6~rKP!fc(|Jzoz7tN_lrb&dIZARv&P1_Qn(I=h6V=b&e3Q@qOR`w z^K?3eqN_VKg{!ZocIgtCtgEY}G&93y8yKjoPff8{nwqMr=g-^OvDrM{zJ0N=Zf>EW zSy@FzQBg%j{{D4!X=z)wBqU^IMMhRt)z#VA+1LaI?%QW$G&S_+$55L!NdfOMked%$nm0~0lbh%s;ar zQIQCLdE|(*GjMX~P+%a7rLBG7KzcfpsjJ)AxOp?KbV5RRHlOrbb9w6~j?QK{bEwY8?EL}F-YeZ83(g%TZIU2SYkAjHH}SM&LLdePB!byx{8 zF^!Ep9v*MmA`loDgoO0;n3>UNBGHZ=PEH~bgOQzWYin*E8R_K2WHJ~hPh#EZ>W+^K z1h`UIFEkp7gzJSXj_XdR>+4^eJIA z5t&S-o;cy=W@>6@S5lIaB9$g5M?}=tW@opyrlnAADZ`mRg8W}k{9zM+B7#Uex zA3Egb=Ia|4wtahkesOVibxuxXWL#WIN?o0;t&@|RTTc&#qOY&2dgTh4Odx1zT)9G} z8XDsN1J4Eq7cbIihz!%yR4PGsOixoN2C`#jhDuVEUc~zw7+_rx2xRiq6yBFYnVRBofDfE?b&15uNj6(Y$I$S?1w3zP zcd_lh)8(ql(8|LuB$sZXl>2m7#JKq>f*v;>FAs|5fsE=Xld=* zm6}SYYirlmR#h<=1_l`!Jv}@ggW>0Q>Xb+%6bb}au9%yP#cFC#pJIJ~^UZ??CMH7R z4?kSI$Y#^&V)60gRH}i2hsT~hK(>oZceg-5p?G+-w;LPNXn}!EO-4pkYIOAG&3rzY z92d7~6Y!OgP+m@@>gpyYR#!6^dV0ypO-+cH$;s{QLLrqJ7`S`4rKLc?1kub z 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..9158c2365b5bb7f78a0ee0e4a5401002f3af7873 GIT binary patch literal 26037 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 Zd0$CMT^$^;@^X!aeSm%Y;LN&Q{{byQ0p9=s literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_rose.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_rose.miff new file mode 100644 index 0000000..9e113ba --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_rose.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:55,,##66--&&77//,,9911//;;2255;;22338822228833//6644((4422##3322 1100..//////##0000&&55--++>>**55??++77;;0088999999::AA99<>AA88>>11==..CC//HH22GG//BB))BB++@@))??((??))<<&&==((FF00UUDDKKIIXX6677EE++..BB000099//--5500**6633**33//##22**::--$$99&&""PP::==ppXXhhmmyy}}llPPNNddNNTTddrruussuuPPSS\\55,,##55..&&77//,,9911//9900119900116600006611--5522))4422%%3311""11// ////##0000&&1100++77..//<<++55==))4499,,3388443399::44<<>>33@@>>//EE<<++UU;;**dd99((zz88**99//<<66CC==IIDDKKGGGGBBBB99<<3388,,>>..FF33GG44DD00GG33BB..>>++>>**==++??--GG55TTEE~~OOIITT8877??++**??1100::55117766116666,,00.."";;55))==33))88))$$EE2244XXDDPPwwaavv~~||oo@@AASS;;AAMMXX__iillqqwwOOTTXX33,,""22..%%44//))5500--55////44....33----22--**3300++22//((11..%%00--&&00,,))22..--33..2255//33;;,,33;;**00::))//;;,,//??1100??4400@@66--BB66**MM;;--VV99))ee77''xx66((77--==77EE@@IIFFKKIICC@@::6644--77..??33BB55AA44>>2288,,44**77++;;00@@44KK??[[NN]]RRQQCC::9900))6633,,3366//2277001177--**--""4444((5511&&55,,%%99..,,<>55,,BB<<00EE<<++PP;;((__99&&uu77((;;00DD;;HHCCKKGGFFCC>>9955//55//;;33<<44::22::33770088..::11<<44DD::TTJJii]]||kkbb__NNBBDD6644::..((22))''22**,,66--,,44))++--""//,,##6622))8811++11++++ccaaffooyyxxaanneeddqqhhxxxx]]ii[[//,,##....$$11..''//..))00,,))//++((--))((,,(('',,(()),,(()),,&&**++%%)),,%%,,--&&..//''22,,++00''11((&&11##----%%55,,''==----??1111<<4422558811//;;//11??..99AA**FF>>''ZZ::%%tt;;((AA22FF::FF==EE<>44==44~~::11~~>>55@@77CC::EE;;EE<>00==..AA22AA44==11==22@@66??66||<<33pp44**qq88--tt>>44yyEE::}}KK@@\\PPwwiizzoo__yy\\GG``JJ((@@22..%%..))%%..))--00))....&&++))&&&&&&))WW__TTȴppggEEXX::3333334444225566116677116677115566004433..3322..44001133//0033--1111++//11++//22,,..33----0011))))66""))992266%%<<55--CC5544DD4477==2288772266//33221188007799,,==44##LL--__,,zz22##;;++==**BB..BB22>>//;;..==22==11~~:://}}==33ww;;00ss==11wwFF88RRDDeeVV}}nnooppeellZZgg@@ffQQ,,HH<><<--EE<<33KK;;;;LL77<>@@55??AA44DDDD::GGGG??BBAA==BBAA??==<<::??;;88>>;;442200##00//AA??**==55""@@44$$II;;..SSBB;;TT@@??OO4499PP//88YY11<>XXww$$44WWUU..''jj]]MMwwiippoommssqqppzzooggNN``FF6622@@8877??==;;<><<::==??==>>IIHHCCDDEE7799;;%%<<::##RRFF66OOAA44LL@@44MM@@77MM>>99OO7777RR//55YY**22ii**55<>==<>CC;;KKCC^^WWZZUUMMIIKKNN33??11HH88VV>>bbAAkkDDrrIIwwOOxxbbMMcc<>>>66CCDD44GGHH88HHII;;GGGG??HHHHHHPPOOUUEECCNN5544<<66668899::445599**6699&&2200!!<<::--CCDD66FFFF::GGEE99JJ@@77PP7722ZZ..--qq1122BBFFFFKK77::3322>>99??5544&&==++88&&66&&:://<<55;;88;;88>>9955..BB88KK??TTHHYYPPLLEE<<88<<<<==CC==HH@@TTBB]]BBeeEEjjKKqqTTvviiddww^^ff]][[߽Ƈxxss66..9944--445500--::88,,BBAA//GGHH66IIII==IIHHDD]]\\dd{{zzzzxxWWXXmm??AAPP6699@@226655338811//55++??BB77GGJJ??CCEE88==99--@@22%%HH,,!!SS$$||9911??::>>9955..44**==33==//55%%;;((<<''99))66**44--55..22,,//&&55((??11LL==TTEEMM@@;;2200++3333HHIIIIOOKKXXJJ^^IIccKKiiPPppVVttYYqqccrrjjqqaabbώù>>55::9911//66//%%6633"">><<''EEDD00IIII??KKIILLcc``uuᦦъllooMMRRhh77==II;;CCEE;;@@::::;;55BB;;33SSBB88ffJJ>>ssII;;yyAA22GG88AA11>>..AA11CC11AA00AA22EE44BB..II44GG77>>1166--55++11))00$$55%%99&&FF55PP@@FF8888..6611<<99BB@@DDFFHHPPKKYYNNaaRRjjTTmmWWooUUgg``kkoouuYYZZܬII====BB9922<<55%%9944==99 CCAA,,JJGG@@KKJJRR]]ZZyy{{~~[[^^}}MMKKYYCC88>>GG1144kkGGIIhhgguuppii``XXJJKK99??**==''DD00EE33==//==22GG99@@00FF44EE88>>44771144--33++55))??1199((FF66QQBBBB9966117755::99CC??DDBBFFIIMMTTSSaaVVggUUggTTee]]ii]]eessvvVVXXzzyySSFF@@MMCC77HH@@++BB<<""??;;BB@@++HHEE@@KKIIWWWWRRzz񰰫ᔔwwZZnnJJ^^XXjjfftt]]ffKKMMAA;;AA33==**::''::))77))22++..--553344,,55++22--33001111//00//..22..DD;;77**DD88SSIIDD@@55661177..33DD??CC>>BB@@JJMMWW^^^^ii[[ffVVaammuuccgg}}[[[[vvBBDD[[JJBBYYII<>::==OOKK==22CC33@@0055&&..$$11++..//))++--,,%%%%""$$,,--44443333220033//::44**$$;;55RRMMIIGG==??88>>225555//55++77//EE@@XXXXffkkhhllddhhttwwggiittqqaa<<66^^EE>>ffKKDDhhHHIIccAA@@^^@@88\\EE77VVII66IIJJ::SS____ss˙ꜜ阘٣βzz__||CCTT@@MMHHQQBBGG>>>>DDAAIIAABB88;;0055))66++88..88//55..11--++// '',,11::;;22//))$$11,,9944::66**''2211BBCCGGFFNNKKJJHH33//88//@@2211!!@@11OOHHmmjjYYYYffeerrqqqqnnmmggkk^^ooggRR__MM??bbNNEEffHHJJcc@@DDaa??==aaGG::YYNN22OOOO33@@NN==WWjjppggvvȌrr``99^^FF]]88DDDDMMMMPP@@@@6600;;22@@66;;1133**,,##..&&44++9900;;22663366>>''33,,3344555500::33FF>>FF??8833//,,//0011223311;;77CC<>UUMMBBWWFF>>ZZGG99^^MM99ZZTT44TTUU55HHOO==QQYY[[UUTTssttffyyzzooHHdd55II22??DDNNKKNN::::22++<<22FF::CC77::0000''//((55..994499774444,,44$$..**004466::77CC>>EE>>9922EE??LLGGFFBB::6644//33,,>>55NNEE9900<>BB////11**AA66HH<>77<<44//%%\\TTxx~~ggwwNN]]QQSSNN==jjttQQkkddyyppooͭDDYY22EEVV22IIRR77QQPP;;UUOO99VVNN77TTOO22RRNN55KKGG;;XXOORR\\JJ``^^{{uu____SS]]BBNN<>;;??99??44::005577>>>>DD44::0033<<==GGCCMMEEQQGGKK>>EE88EE;;CC88AA99FF==00 11%%4444667733//IIEEjj}}QQmmIIbb>>BBzzKK99ggmm^^kk__aaUUvvggyyii{{nnvvuull__[[TT::\\QQ;;aaQQAAbbPPBB^^LLBBZZHHDD]]QQQQff\\ddyyrrãęqqccTTQQOOOOOONNCC??9922CC99NNAAFF8877**@@33AA6699006622??==EEGGGGKKLLNNOOSSIIQQ::CC11::IIOOddhhjjiiQQJJII??FF99CC44:://;;00992211''0022$$,,--//446677;;@@xxaayyLLiiGG\\}}))))eeBB,,ddvv__ll``llbboo^^oo\\yyhhsstteeeeUUbbLL>>aaKK==ddLLBBffMMHHccKKKKaaNNTTkk]]nnxxoovvttyyzz}}~~ΦllddllcciiaaOOGG66--<<22JJ@@JJ==66**AA55AA6644**..''8844AAAAFFFFXXZZccggYYaa55??''44FFQQ[[bbMMOO>>;;55++>>22EE77;;//==44>>88--%%77##77&&**((,,2255<>aa++bbEEAAeeIIEEiiMMIIccIIHHaaLLSSttccuuvvzztt^^^^vvzz⼼絵\\PP``PPrrsshhWWNNCC;;--##<<33??55DD99EE99AA55:://88..88118844==>>[[__MMVV55AA<>77AA88??44<<22<<55662211))77$$55##33....3344??99LLggJJffWWjj>>BBiiLL::DD??^^YY11~~VVLL99``SSbbMMggNNbbFFXX||>>UUww;;XXyy@@MM4477WW????__JJGGffTTRRnnaajjuukkrrkkkkggrrqqԗ䚚ޜϣǑttjjrruuXXJJQQ;;mm\\yyllxxnncc[[77//..%%33((77++<>44??++6677<<6666;;99>>88==44::4488333311//((55""88$$??6677::--99II^^RRppOOiiPPYY[[55,,IIEE,,1177bbYY22ffmm::KK}}44YYIIffLLkkMMeeHH__@@^^}}AAbbEE99..22DD;;<>..??11AA44AA883344BBGG44<<""++,,7700::**4411774477::::;;888855886688552211//((55""<<((CC66::77,,88ZZppCC]]SSffkk8855//<<[[iiEEVVggNN[[HHkkOOnnMMiiJJddDDeeEEjjJJ00..338888880033((::BB33XXcc]]WWaammXX]]wwxxׅԌ͑Ívvqq``ppttXXMM~~PP99]]KKqqaallccOOHH22**11''66((88''==,,BB00DD22@@22==22::221111;;??55::--1177==<>GG^^ooEEWWGGOOUU>>00 //DDYY88Ȥ~~RRjjQQggTTkkOOllKKhhIIggHHiiJJnnOO..--22335522''00--;;""LLZZIIRR``aaggmmΝۉċ~~uurrddsskkTTZZXXNNQQBBSSEE[[OOMMGG33--00''99--88&&66""::''BB//DD55<<0044--00,,--,,6677::;;<<;;FFFFKKLLFFHH@@DD338855::66::8899<<==@@>>==99770099**>>,,44$$;;33^^bbVV^^NNRRjj11**&&&& ??WW55}}lláxxWWYY11]]{{EEhhUUggMMffIIffIIjjMMppQQttUU==66==>>==8877<<%%99DD$$GGUU;;KKXXNN^^eexx{{qqxxjjww~~rrttllaa[[bbYYTTiiPPKKTTIILLBB??66GG@@CC>>44,,88--88));;''6688!!AA..EE88>>66663344337755==;;BB??DD@@DD@@FFCCAAAA::<<559955::449977::>>>>CC????8888..88))77''55&&MMAAllllPPOOXXOOLL33EETT33nnddzzssWWWW55EEMM&&ddPPddSSffMMeeIIiiMMooUUvvZZxx\\\\GGPPZZKKHHWWQQ77UUWW22QQYY44NNVVAAVVYY``eebb}}uuoogg]]ccXXffbb[[UU[[VV@@ZZYY::__``AAmmYYAATTKKMMII7755<<99??;;::11BB5577%%EE--:: 66??))BB66==88779999<>DD>>>>7777..7700;;77555588;;55::33;;44::==>>BB>><<4455))88++));;,,YYKKZZTTVVLLhhSSddggHHxxlloojjMMGG==""$$((00@@jjXXmm\\llWWhhQQllSSss[[vv\\qqYYnnUU[[ggTTPPjj^^HHkkffFFccccAA``bbJJddcc^^``]]ff^^WWgg__WWdd``XXUURRMM::EEDD%%TTTT..ccee@@ooZZ??YYPPWWVV>>>>;;99885555..FF88::&&II00::1166!!;;..77224488::>>BB????88??66:://00$$77--FF??GGCC>>>>;;==88<<99;;@@==EE::??1155''<<11>>33[[OO@@66^^PPuu[[~~YYooKK.. 77117700??II&&11FFggVVuubbuu^^ooWWppXXtt^^rr\\ggRRnn\\ZZll]]VVkk__QQjjbbMMiiccMMiiddNNiiccSSiiccWW``YYOOooii]]ee__OOZZUUAANNII33HHDD++QQOO88XX>>--~~7711^^__aacc99::****9944==3366&&FF1188 ,,..::..BB;;==??>>>>;;77>>55<<11:://;;..==22>>77??88IIFFHHFFFFCCAA;;==1199&&::$$;;''55++33--<<55OOEE__TTaaSSjjXXDDOOMM44!!** ==HH((BBII**==GG%%((6633EEllXXxxccooWWvv^^{{eeppZZaaMMZZFFkk^^VVkk^^UUll``TTll``RRjjaaPPkkccPPkkccNNkkccLLvvppZZrrllVVffaaKKllggSS[[VVCC<<66&&@@::**SS;;//kk,,''7766\\\\``__<<::5511DD>>AA6644&&88'';;))BB33II>>KKCCCCAA@@==;;55??44==00;;..::,,::..::119911>>99>>88>>77<<00::))99##||<>::>>;;@@<>00%%kkGG99RRCCRRDDSSGG^^VVYYSSHHEEEEFFCCHH@@EE::==7766AA<>@@JJ11//<<""..== //@@ 22CC##UUddCCzzdd}}bbkkMM^^@@]]AA``HH]]EEjj``TTjj``TTjjbbUUjjbbUUjjccSSkkddTTkkddTTjjddTTmmggWWxxrrddaa[[OOYYUUIIzzvvmm}}ttUU;;**II))PP++aa66%%ss;;..LLCCRROO>>AA@@HHAALL??HH;;CC@@@@HH@@FF::AA2255((99--::--==..>>..==--;;//:://77--66--66,,66++{{77**ss88((ll77%%hh77((ee11&&ttBB;;VVMM``WW}}aaVVmm[[OOWWPP@@EEDD22::??++@@II44>>JJ4411??&&,,:: //==##HHUU99uu__||``eeEEXX}}::]]AAbbHH]]DDkkaaUUjjbbUUjjbbUUjjbbUUkkddTTjjddTTjjddTTkkeeWWee__QQaa]]QQ``\\QQܩWW>>((II33PP::%%88 qqEE::||kkmmEEMMFFQQJJVVIIQQEEFFAA;;BB55HH9933''88,,::,,;;..}}>>//||>>11||>>11}}==11}}::11||9900zz77..vv66,,ss77,,ll77))ff55''aa33&&XX,,##nnFF>>}}[[QQrrVVKKXXDD99BB66**22// '')),,33##::EE44AANN::..;;''))77 ,,::!!CCPP66}}jjtt[[__@@WWvv::bbFFffLLZZxxBBjjccSSiiccSSiiccSSjjddTTjjddVVjjddVVkkeeWWiieeYYnnjj__dd``WWssnnhhԣyy__PP;;GG<<**VVMM<<ӽrrvvSSZZ::@@88==>>==@@;;BB77JJ==55,,::00:://;;00{{;;//xx<<11vv>>11vv>>11rr99..pp77,,nn55,,ll66,,ll77//ii77..ee55++__33**RR--$$aaCC99jjOODDZZFF;;HH:://AA99..????33==AA33))11"",,99((55BB11,,99((00;;**..::&&??HH33vvdd~~OOSSpp::SSpp::aa}}JJbb~~NNPPll<>HHEEJJDD??55;;//::22>>66<<33;;22zz<<11vv<<11rr>>11qq??44hh88,,ee66,,dd55++ff77//hh9911ii::22ff7711^^66..ccEE;;^^HH;;PP>>22<<..##22**5533''5577,,--33''22<<11))55''00<<0022>>00==HH88//::))33<<++ssWWmmFFIIcc66MMgg::__xxNN^^ttNNFF__88hheeRRiiffSSiiffUUiiffUUhheeVVhhddXXjjff[[kkhh__aa^^WWrrqqll͸~~{{jjxxvviiʭrrjj;;22DD::NNDDFF;;@@88::44{{55--ww44,,||==44xx??44oo==22ee66,,cc99--__77--aa;;00hhBB99hh==66aa66//gg7733kkDD==yymmbbTTGG??33''9911$$::88,,4466++--33))..66++,,66--))55))**66,,..::..22<<1177??22@@FF::FFRR>>==PP22II__;;MMbbAAaavvWW]]ppTT66JJ//ggddQQiiffSSjjggVViiffWWhhddXXggeeYYiiff]]iiiiaakkjjeeĻ٩UUHH66**FF;;88//@@88II@@EE<>44ooEE99^^::..^^>>11XX:://VV66++^^<<33ooHHAAttIICCeeCC::rrffYYRRBB9933%%4422%%6688++1144))**11))**44++))55++''33))''33))++55,,//66..0088--88>>44>>FF7788GG00BBVV;;EEWW??YYkkUUTTeeRR..??,,ffeeQQggffRRiihhVVhhffWWggeeXXeeeeYYgggg]]hhhh``bbaa\\||}}wwij||mmMM>>KK@@uu??55pp77..ss::11nn7700rr@@77ll@@55__99,,\\??11[[AA22WW@@00SS<<,,XX>>11ddFF;;ooMMCCmmQQFFqqeeWWMMJJ994422##2233%%66::,,2288,,..55--..88//**55--''22**''11))))33**++22**))00((..33,,44<>qqII==__>>//__HH88UUDD22XXKK88``SS@@WWFF44GG44##\\BB33zzddVVaaZZHHEEFF444455%%5588''::>>0077==1155==2255??6600::22,,77//,,66..--77//,,33++))00((++00))//77,,//==,,66GG4422CC00CCTTBBFFTTGG,,::--ccddRReeffTTgghhXXhhii[[gggg[[eegg\\eeff^^ffgg__kkllddssvvmmýѯ{{UUJJggAA66__==11\\@@22]]LL88RRJJ33WWSS::]][[BBSSOO66EE==&&VVGG22ppccPP\\ZZEEIIKK66<<==++<>BB44;;AA5599AA6699CC::77AA9955??7744>>6655??7733::33..55..//44--22:://66EE2299KK55..@@**::KK88>>OO??**;;++bbccQQeeffTThhiiYYhhii[[ffhh[[eegg\\eeff^^ffgg__kknnee||ɺû~~\\PP``>>22``@@33ggPP@@WWHH33UUQQ88QQQQ77HHLL11PPPP44^^]]AAcc\\BBYYSS;;__]]HHPPRR==EEHH55AAEE44??CC4499??1177??4499AA66;;EE==99CC;;::DD<<;;EE==::AA::44;;4444992277??22IIXXEEII[[CC88JJ44??PP==BBSSAA11BB22 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/jdaa_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/jdaa_tmp.miff new file mode 100644 index 0000000000000000000000000000000000000000..3bdfa320869d12d71f642a885a8ce60dc44dde4f GIT binary patch literal 26037 zcmaI8XINY5xi##Zz+4FI-FOz);QCo+MkI|ug_WRGMf78`fS3iDycUMnOL*vAWogFfnKu}k| zc#%TU)+P`xTre=u(b3i2*uY98Zfxl5>&TAHO?`bLkwDno)YBu8l$E!(NF*JdB!-p?i(9|RljvU$ABFK*8$1h&gk{u^bY;Wu8YG|mb?d%vCDJ$#h zZf_eKtEiC4+uMeQnwt9h7cS6f`uY^g>Z*Z(kr9P*?wp~ag$0>BKW}PkVWF!#H)msG zYO1L@Kkw;Dqp7OS%*4hT7^tdFO_i0==~`OD!&0fSF`3-eH9c)^&R~eeD=SQ+4rn@9Y>GYirln&(AX$nwnzq*qE6a zfgqLk^jKNx=t!kvv85$}(9uy-gJ0a+%i)-qsHye!RaF@osi+JL)YLE-%E|)+JRTnR z_w#s$h9^!84Dk8*OZ)mH5^HNMEvdA%)x*QgjL*-_#qa6tWU=)0$mE3uGcz?cP0b4z zjEr!mHa7J1w6!%fwzjmjb#zo!FJ8peP*ufw#rfXZQCHW{ICA9jWfDnCOF?00M^{%_ z`Pi|`mu+onG&+4@Auf)^3J-5>Eh&kKDJiL_sH@A&Y;MlV%E^h2uCA`Ca&>ib3Jo0@ zvA1_}3JB=yOGrpgE-ET36ADG5zP|AAq@=X8qN2)5D=S-D7HeSO6JB(6H8uag@Is+z zX=!U;xbSJ!)5G7fwe{)m(ACw^QBm3623`~ux3`HzZS7;nwzq+{qer*51MOXL21qMS&i9`ZE)zyi_%}qHz*Vd?13WY>kTB6Ym4T;3FXN`;u z4GDyW1xrf<12wg?XWiU@lQU<6gDDhc<(ZlEbP7dPbz*|Up;8Hifq~9WI$ck%y?tiJ z%#2QNY+PTrwl*{4@vdIAwY9XYtbFjm+SUewja z6~B0qMADQUz=MYD*xAw1(a=y;-Q6V;as799b#w>>W#!#nZEbwc&JNxU{Ap>atE;Hs z|7&XEeMBPe3^`ti#GM@)O-&8>pwm@VwX_gdR8$bxXf$VMsMBI*!{(gOZ zP0gO3?rz|Wc-iK&42(o4mg~uDv2aM9*C)^C@y9)?d@G%PoC7)rcewF*4A`%s8kwldD+pC z#q#p%?>95Ev$M4w8`IXtoqO^muIHCuUb=+q3tR#RN=owUud4b_Txe^n$&S4}ph-n# ze_vBmS$15$OdzPKDJ$>oX=084N_m)m0M{T#s|-%*}zkvu7P0 z4Gff(=jQzUD3lW?W@nR<^!1gMCnq@^`E?r@Ff%hSXlXfn7Ws+K-`PQ&sjlAIva&KY z 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_idat_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_idat_tmp.miff new file mode 100644 index 0000000000000000000000000000000000000000..1ef75c0a74aee6c6d7b8a619c354941488941e17 GIT binary patch literal 26037 zcmZ6zXH-;&_ce?yF~-CiyMlBW7^e3^8(`?2q4(Z+sDNFFY=8Hiw}>8I zDlUjmW-PMxkCpy=96pLkNn%nI6yhU-<6`;o5q|yw!4dv`i=w2zRrxcLKgL)3Y4P4+ivqpF!@c<=B8^U?)208XpLSGCaJY9&vh+O$ zO^ZaNQWX>eWBmOi{-1xKO5c}$BcHH%|NrM*GF|#MiLod#C^$~~ex&r5Nk4>2rZDj_ z6!xOUi#Y4(bS*6*7T=n@rZx85!YnDHJ+=Xb5L2b$FP? zqDYUC5f+O|)zKLqW-w?pb@h=E8jV6xQW_bdQYq34Fgi*mlSrF3jg1kBIy&<5m`s2F=%Z9UTjcojXlTC=^@U=4NAK9UV8f(o%fmz`(LH zeSHEUJiNGAS64$LBBHcZC{$Mu53i`e>#(qj3V}dXH6)~_27hTlKx?b1DT!oh+1~Et zWGFq-)A4;mLL?FfgUQ^t&(M%SAQFd$baip1Mn@S8GFe+2*ONlg)Vz2RcSBS2(j_7h z*L!kOOG{f@UVdVNMkA4wl`mbQ)78}#6)#>iH|O#A`~wFfBPEicptQ8Syzub6JRhH` zs+5$Lme|;|w6L&}lIm)EdmEd8fCC3CEp2SPy!P#jj*g4V$=SNKzP_nx*RGI|*x1Cx zoSeKo6BBcDiKM$*hL_1nI-N*VRh^iS;bm-0hL_P%Hk(8ulSfAWJ2M#gJ1$<7{T(AC zbUKBip&`SIiVE;TCMzo9@6*vyQ1}lgQIdQ_+n9C&)jvse$08Wk` z_48x1)zuFlPD*04H8tz%%E~w#9i7NG5-BLCw$|8~N{xu9sLvBcr<7+S=aU-Mzb;O4ZU*RJ?YLLLm}WRIXj4(R6h1`{{HNNn88M6*?V} z;qqk~jVL`XU#3#ErN_hsg`%yksfpLP|CcXQC^|ao>X$E*$@rYhm+{l8s#mU%NLpGN z8dt91^R=}vUBbPfP%d2pUZ~Vdmv}q^0cSp6Q?sYp14mbqNGarkB^*vqna^Mw63fW=2LzN)I36e*N&n-Mb=@uI`EzV`IRVkbZIGrp`{fYTU<<|X==vB zm6fqr1VTbWO%0DnA|)g=HRS9lJ3HIjCM0-z@^~E1 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 z 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_tmp.miff new file mode 100644 index 0000000..ec9c873 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_tmp.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:55,,##66--&&77//,,9911//;;2255;;22338822228833//6644((4422##3322 1100..//////##0000&&55--++@@((55AA))77>>..88<<8899;;@@99>>FF77CCFF55KKCC..YY<<**nn;;**==00AA77EE??IICCMMIIMMGGJJ>>EE88AA11??..DD//HH22GG//AA))BB++@@))??((@@))>>&&@@((JJ00WWDD~~MMIIXX6677DD++..@@00006611--1122**2255**..22##,,--4400$$55((""LL<<==ooXXhhmmzz}}llTTQQffNNQQ``qqttsswwHHLLXX55,,##55..&&77//,,9911//9900119900116600006611--5522))4422%%3311""11// ////##0000&&1100++77..//??))55??''44;;,,33;;2233::9944<<>>33@@>>//GG;;++UU;;**dd99((xx99**:://==66DD==JJDDLLGGJJBBEE99??33;;,,??..FF33GG44CC00GG33BB..>>++??**??++BB--JJ55VVEEMMIIXX6677CC))**@@0000<<44116677114477,,,,00""5577))8866))44++$$@@4444UUEEPPttccvvzzpp@@??OO99==HHYY]]hhrrvvPPTT]]33,,""22..%%44//))5500--55////44....33----22--**3300++22//((11..%%00--&&00,,))22..--33..2277..33<<++33==**00<<))//<<,,//@@0000AA3300BB55--CC55**NN;;--VV99))ee77''vv77((88-->>77FF@@KKFFMMIIEE@@==6666--88..>>33AA55@@44<<2266,,44**88++<<00BB44MM??[[NNYYRR__<<::FF**))@@..,,::22//6655003366--((..""2266((1133&&11..%%4411,,772266``]]hhxxzzIINNTT1199;;22::<>66>>55..//..))--//**//44----33))++--""----##6622))6611++00,,++ccaaffnnwwtt``kkcceepphh||~~aammcc//,,##....$$11..''//..))00,,))//++((--))((,,(('',,(()),,(()),,&&**++%%)),,%%,,--&&..//''22--++00))00((((00##//,,%%66++''??----@@0011==3322667711//;;//11??..88BB**EE??''YY::%%ss<<((BB22FF::GG==EE<>II99%%22((,,%%))22--116600//,,%%44++$$<>....@@0033;;2233335522''77--''<<--..??,,88<<%%KK77``66 ||99((??00<<..AA22AA44==11<<22>>66==66::33ss33**ss77--vv==44zzDD::}}KK@@\\PPwwii~~ooaaxx\\II__JJ**>>22--%%""--))((--))11..))44++&&22%%00!!11$$ccXXTTʶ~~ffxx^^==OO553333334444225566116677116677115566004433..3322..44001133//0033--1111++//11++//22,,..33----1111))**66""++774455%%==44--DD4444FF3377>>1188882266//332211880066::,,<<55##II..\\--ww44##;;++<<**AA..AA22>>//::..<<22;;1188//<<33zz::00vv<<11zzDD88RRDDddVV||nnppssllggggKK``QQ33DD<<''22..%%!!++**&&00--&&(($$**((3355''TT\\MM||||{{~~yy~~zzrrPPddHH7766;;8888::999977::;;55::;;3399;;00999911887722::66559955667733446600226611..6611++7733**7755&&77::%%99;;%%AA;;--HH;;33NN::;;LL77<>@@55??AA44DDDD::GGGG??BBAA==BBAA??==<<::??;;88>>;;442200##00//CC>>**??44""CC33$$LL::..UU@@;;WW????OO4499PP//88YY11<><<::==??==>>IIHHCCDDEE7799;;%%<<::##SSFF66RR@@44OO>>44PP??77OO==99OO7777RR//55[[))22ii**55<>>><<@@::<<22DD44::**::--AA88>>9955337766EEBB9955BB>>BB;;KKCC]]WWYYUULLIIKKNN88??88HH??VVEEbbGGkkIIrrNNwwRRxxddOOcc==DDvv??<>>>66CCDD44GGHH88HHII;;GGGG??HHHHHHPPOOUUEECCNN5544<<66668899::445599**6699&&3300!!??99--EECC66HHFF::HHDD99LL??77RR6622ZZ..--qq1122BBFFGGKK88::4422??99@@5544&&<<++66&&44&&:://<<55;;88;;88>>9955..BB88KK??SSHHYYPPJJEE;;88::<<<>9955..55**==33??//66%%::((::''88))66**44--55..33,,//&&66((@@11LL==TTEELL@@::22//++2233HHIIHHOOJJXXKK^^KKccMMiiSSppZZtt^^qqiirrppqqffbbώ¼>>55::9911//66//%%6633"">><<''EEDD00IIII??KKIILLcc``uuᦦъllooMMRRhh77==II>>BBEE==??::==::55DD9933TTBB88ggII>>ttHH;;yyAA22GG88AA11>>..AA11CC11AA00BB22FF44BB..HH44GG77>>1166--66++22))11$$77%%::&&GG55QQ@@FF8877..5511<<99DD@@IIFFLLPPOOYYRRaaVVjjXXmm\\ooXXffcckkppuuZZZZݫII====BB9922<<55%%9944==99 CCAA,,JJGG@@KKJJRR]]ZZyy{{~~]]^^}}PPIIYYFF77>>JJ//44mmFFIIhhggttppii``XXJJKK99??**==''DD00FF33>>//>>22GG99@@00EE44EE88??44881166--66++88))BB11;;((HH66RRBBCC9966116655::99EE??HHBBJJIIQQTTWWaaZZggYYggWWee^^hh^^eerrvvTTXXwwyySSFF@@MMCC77HH@@++BB<<""??;;BB@@++HHEE@@KKIIWWWWRRzz񰰫ᔔwwYYnnII^^WWjjeett]]ffKKMMAA;;AA33==**;;'';;))88))22++//--553333,,44++22--44003311220022..66..GG;;::**FF88UUIIEE@@66660077..33CC??CC>>CC@@KKMMXX^^^^ii\\ffXXaannuuccgg||YY[[zz??CC[[JJBBYYII<>::==OOKK==22BB33??0055&&..$$11++..//))++--,,%%%%""$$----66445533440066//<<44,,$$<<55SSMMIIGG==??77>>005544//33++44//CC@@XXXXffkkhhllddhhttwwhhiittqqff9966]]FF>>ddKKDDggIIIIaaBB@@^^@@88\\EE77VVII66IIJJ::SS____ss˚ꝝ陙٤ΰ{{dd||IITTEEMMLLQQEEGG??>>EEAAHHAAAA88::0044))44++77..77//33..//--**// ''--11;;;;22//**$$11,,9944::66++''3311CCCCGGFFMMKKJJHH33//9900??33--""<<11QQHHppjjXXXXddddssssttppsshhoo__vvccRR^^NN??aaOOEEeeHHJJaaAADDaa??==aaGG::YYNN22OOOO33@@NN==WWjjppggvvȎqq__::^^KK]]??DDJJMMRRPPCC@@8800<<22??66::1111****##,,&&22++77009922443355>>''33,,3344554400::33EE>>EE??7733//,,//0011222211;;77CC<>TTNNBBUUGG>>YYGG99]]NN99ZZTT44TTUU55HHOO==QQYY[[UUTTssvvffwwxxnnIIdd::II88??IINNOONN==::44++<<22DD::AA778800//''--((33..884488773344++44$$..**004466::77CC>>DD>>9922DD??LLGGFFBB::6644//33,,==55NNEE::11:://66,,:://;;..hh]]{{zzzzwwSSZZcc\\vveexxyyZZttee{{ggyyddssϨCCYY33EEVV66IINN88NNKK::VVNN;;YYRR88YYTT44UUTT66UUXXEEXXVVWWTTGGaaqqUU}}mmyyxxYYggCCPP==FFDDIIBBBB22//33**AA66HH<>5566//55446677//33((--1177//55BBHHWWZZLLNN4455''## 00''CC99AA7799--<<3355++22**DD9977))77,,>>::<<88//&&RRJJss}}QQggKK``MMSSJJ;;cc~~qqssrrzzttuuKK[[66MMXX66QQUU::VVTT??VVOO<>>><>??DD44::0033<<==GGCCMMEEQQGGLL>>EE88FF;;CC88AA99FF==00!!33&&8844997722//GGDDmm||SSllIIaa;;BBHH99hhnn__ss``kkXXzzkkzzkk}}nnttrrll\\ZZTT::ZZRR;;__RRAAaaQQBB]]LLBBXXIIDD]]QQQQdd]]dd{{qqŢřqqccUUQQPPOOPPNNEE??9922CC99NNAAFF8877**AA33BB66::007722AA==FFGGIIKKMMNNOOSSJJQQ;;CC11::IIOOddhhkkiiQQJJII??GG99DD44;;//;;00992211''11 33$$33..5555557799@@zzeexxQQjjII]]&&**nn==,,ddtt__tt``vvaass``oo^^||iippttccccRR``MM>>__LL==ccMMBBeeNNHHaaLLKKaaNNTTjj]]nnxxoovvtt{{zz~~ХllddllcciiaaPPGG66--<<22JJ@@KK==77**AA55BB6666**00''9944CCAAHHFFXXZZddggZZaa55??((44FFQQ\\bbOOOO??;;66++??22EE77<>>>[[__NNVV77AA==KK::GG//7799<<7766??77BB88@@44==22<<55662211))66$$77##::..333333??66LLiiOOff[[jj??BBssGG::OO::]]ZZ11{{VVVV99kkSSjjQQiiOO__GGTT{{<>KK5577UU@@??^^KKGGddUURRnnaajjuukkqqkkiihhrrqqԗ䛛ޝϥǔuujjrrxxVVJJPP;;ll\\yyllxxnndd[[88////%%44((99++==//==--;;++;;//>>22??664444LLPP>>FF**4433>>44??--6677<<6666<<99@@88==44;;44::334411//((55""::$$EE66<<::--99GG^^UUppSSiiTTYYZZ55,,RR@@,,9933aaYY22eemm::TTyy44ccIIkkOOkkOOeeHH\\??[[~~>>``CC88//22BB<<<>,,@@..@@11CC44BB884444CCGG55<<$$++--7722::,,4422776677;;::==88::55996699554411//((55""<<((GG66==77,,88YYppEE]]VVffgg::555599bbffEEVVnnNNddHHmmOOllMMiiHHccBBccBBhhGG..//33559988--55((77DD33WWdd]]UUaammVV]]wwxxׅԎ͑Ïuutt__ppuuWWMM~~PP99]]KKqqaallccPPHH44**33''88((::''>>,,CC00EE22AA22==22;;222211==??66::..1188====CC77;;77;;5577889999999966;;::<<99885533++99((??++==,,7711??GG__ooFFWWIIOORR??00//GGXX88Ǥ||RRooQQmmTTjjNNiiJJhhGGeeFFiiHHjjKK++//22006622%%11,,<<""JJ[[IIQQaaaaeennΝۉċ~~ttttccssmmTTZZWWNNQQBBSSEE\\OOOOGG55--33''<<--::&&88"";;''CC//DD55<<0044--00,,..,,7777;;;;>>;;HHFFMMLLHHHHBBDD558877::88::9999====BB>>??99990099**>>,,22$$;;33__bbYY^^PPRRhh11**$$'' >>XX55zzllġxx[[WW11aayyEEiiUUffLLeeIIffGGiiKKooPPqqSS::88====>>8855==%%77EE$$FFVV;;IIYYNN]]eexx{{qqxxjjwwqqttnnaa[[eeWWTTkkOOKKSSIILLBB@@66GG@@EE>>77,,;;--;;))>>''88::!!BB..EE88==66553333338855>>;;DD??EE@@EE@@HHCCDDAA<<<<779966::669988::@@>>DD??AA88;;..88))77''22&&KKAAoollTTOOZZOOMM22EETT33llddzzss]]TT55LLII&&eePPccQQeeNNccIIffJJooSSuuYYww[[YYHHPPWWLLHHVVRR77SSWW22OOYY44MMVVAAUUZZ``cccc}}uuoogg]]ccXXffccZZUU\\VV@@]]XX::bb^^AAppWWAATTKKMMII8855>>99AA;;<<11FF55;;%%HH--<< 88??))AA66;;88559977<>EE>>AA7788..::00==778855::;;77::55;;66::??>>CC>>>>4477))99++((66,,UUKK^^TT[[LLhhSSggffHHwwllddooMM@@AA""**%%88<<jjXXjj\\llVViiPPjjRRrrZZvv\\ssYYkkVV[[ffTTPPii^^HHjjggFFbbccAA``bbJJddcc^^``]]ff^^WWgg__WWdd``XXUUSSLL::GGDD%%VVTT..dddd@@qqYY??ZZRRWWXX>>??<<;;997777..II88<<&&LL00;;2266!!::005544228888>>BB??@@88@@66;;//11$$99--HH??HHCC>>>><<==88<<::;;AA==FF::??1166''==11::33XXOOBB66ccPPuu[[~~ZZnnKK// --660033EEFF&&88BBggVVppbbvv``ppXXmmWWrr\\qq[[iiQQll]]ZZll]]VVkk__QQjjbbMMiiccMMiiddNNiiccSSiiccWW``YYOOooii]]ee__OOZZUUAANNII33HHDD++SSNN88XX>>--}}8833``aabbee;;<<,,++;;77??5588''II44::##,,//88..>><<::??::>>::77>>55::1199//::..<<22>>77>>88HHFFGGFFFFCC@@;;<<1199&&99$$;;''55++33--::55NNEE``TTccSSjjXXDDQQMM44##)) ;;II((??JJ**<>7755FF??BB8877))99**<<..BB66GG@@HHFF@@AA==>>::55==44;;0099..99,,99..88117711<<99==88<<77;;0099))88##~~;;!!||;;%%tt++""~~55//GGAAWWPP``UUddWW{{hhWWttnnXX[[]]EEVV__BB@@MM//::II((,,==44FF jj||TTggtt]]tt^^ww__llXXccMM\\HHii__UUjj``VVjj``TTjjaaRRkkbbQQkkccPPjjccPPjjddNNcc\\IIff__LLcc^^JJttoo\\llffVVNNHH::FFBB66JJ88,,VVMMVVMMmmggvvqqWWSS??<>JJGGNNKKNNKKLLGGMMIIKKGG>>::22**770099//88,,77**66))44))22**11))//**00))11**11((33%%55!!ww99 vv99$$uu22))??99MMHHUULL||TTJJppTTHHhhXXHHcc^^JJkkooXXRR\\AA33@@$$33BB##//@@44EE!!ccssOOkk{{bbqqWWkkPPddLLbbII^^FFjj``VVjj``VVjj``TTkkaaUUkkbbSSjjccQQkkddRRkkddRRff__MMwwrr__jjddTTbb\\LLee__SShhddXX^^ZZQQ>>00''iiGG;;SSDDSSFFTTII__XXZZUUIIGGFFHHDDIIAAHH::AA66::@@>>LLEEDD::66++55++99..99,,99++99++77**66++33))//''//((00))11((44%%{{77$$ss99##qq::&&qq55++{{@@::PPHH]]TTddZZ~~ffZZoobbRR__\\IIPPSS>>@@JJ11//<<""..== //@@ 22CC##UUddCCzzff~~ddkkOO^^BB^^DD``FF^^DDjj``TTjj``TTjjbbUUjjbbUUjjccSSkkddTTkkddTTjjddTTmmggWWxxrrddaa[[OOYYUUIIzzvvmm}}ttUU;;,,II((OO,,``66&&qq;;//LLEERRQQ>>CC@@JJAAMM??LL<>JJ4411??&&,,:: //==##HHUU99uuaa}}ccffJJXX||<<]]CCccII^^DDkkaaUUjjbbUUjjbbUUjjbbUUkkddTTjjddTTjjddTTkkeeWWee__QQaa]]QQ``\\QQܩWW>>**II33PP99''88 qqEE<<||kkmmDDMMFFRRKKWWKKSSGGHHCC==EE88JJ;;33''77,,99,,::..==//||>>11||>>11}}==11}}::11||9900zz77..vv66,,ss77,,ll77))ff55''aa33&&XX,,##nnFF>>}}[[QQrrVVKKXXDD99BB66**22// '')),,33##::EE44AANN::..;;''))77 ,,::!!CCPP66}}llvv^^``DDWWvv;;aaGGffLL\\{{BBjjccSSiiccSSiiccSSjjddTTjjddVVjjddVVkkeeWWiieeYYnnjj__dd``WWssnnhhԤyy``OO==HH;;**XXLL>>ӺrrvvSSYY;;AA99<<@@??DD<>11vv>>11rr99..pp77,,nn55,,ll66,,ll77//ii77..ee55++__33**RR--$$aaCC99jjOODDZZFF;;HH:://AA99..????33==AA33))11"",,99((55BB11,,99((00;;**..::&&??HH33vvhhSSTTpp==RRnn;;aa}}LLbb~~MMRRnn==iiccSSiiccSSiiccSSjjddTTjjddVViieeYYiieeYYiieeZZhhdd[[\\YYRRiiffaaxxmm[[;;55%%ަVVVV@@>>LLFFOOEEDD66>>22::22>>66<<33;;22zz<<11vv<<11ss==11qq??44hh88,,ee66,,dd55++ff77//hh9911ii::22ff7711^^66..ccEE;;^^HH;;PP>>22<<..##22**5533''5577,,--33''22<<11))55''00<<0022>>00==HH88//::))33<<++ssZZnnKKJJcc99OOff<<^^wwOO__uuNNIIbb::hheeRRiiffSSiiffUUiiffUUhheeVVhhddXXjjff[[kkhh__eebb[[ppoojj˷~~{{jjzzvvjjƨttii>>33JJ<>55yy??44pp<<11cc44**ee99..``88..cc;;11iiAA99hh==66aa44..ff6622kkBB<>11??EE99EEPP??==MM22GG\\==JJ]]??^^rrVV[[nnRR77KK//ggddQQiiffSSjjggVViiffWWhhddXXggeeYYiiff]]iiiiaappoojj¸өWWEE<<))KK<<77..??88GG@@FF==yy::33oo66--nn<<33nnBB77__99..__==11\\::00WW55++``;;33ppGGAAttGGBBggBB::rrffXXQQAA9933%%4422%%6688++2255**++22****44++++77--((44**''33))++55,,..55--0088--88>>44??GG88;;JJ55EEWW??GGYYCC[[mmWWWWiiSS33EE//ffeeQQggffRRiihhVVhhffWWggeeXXeeeeYYgggg]]hhhh``ffee``zz{{uuíjjSSAAJJ>>xx==55rr66..vv::22qq6600uu>>77oo==44aa77++__==11]]@@22XX>>//UU;;,,ZZ<<11hhFF<>..eeddPPggffTTiiggXXgghhZZffffZZeeee[[ffff^^gghh``]]^^XXeeff``ýӾii\\yyJJ@@ff44++nn9911hh11**{{FF>>uuFF<>0088>>2277??4477AA8800::22,,77//++55--,,66..,,33++))00((,,11**1199..--;;,,55FF4422CC33CCTTDDDDUUEE))::**ccddRReeffTTgghhXXhhii[[gggg[[eegg\\eeff^^ffgg__kkllddnnqqhhǾ̺ժQQIIll==55ee::11bb>>22bbHH77XXGG33[[PP::ccXXBBXXLL66JJ;;&&ZZEE22ssbbPP\\WWCCGGII44<<==++<>BB44;;AA55::BB77::DD;;88BB::55??7744>>6644>>66229922..55..//44--33;;0077EE44::KK8800AA//<>++<<**bbccQQeeffTThhiiYYhhii[[ffhh[[eegg\\eeff^^ffgg__nnqqhhyy˺ŷƃWWNNff::11ee==33nnNNAA]]FF44\\PP::WWOO88NNJJ11UUNN44ccYY@@hhXXAA[[OO99aa\\HHQQSS>>EEHH55AAEE44??CC4499??1177??4499AA66==GG??::DD<<::DD<<;;EE==99@@9933::3344992266>>33HHVVEEGGXXEE66GG44==NN;;@@QQ??..??-- \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray.miff new file mode 100644 index 0000000..baaf9fc --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=16 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Relative +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2009-09-05T17:47:34-04:00 + +:......//////222222444444555555555555444444444444222222222222222222111111000000......------,,,,,,111111222222444444999999??????BBBBBBCCCCCCCCCCCCAAAAAAHHHHHHPPPPPPXXXXXXccccccoooooottttttrrrrrrvvvvvvttttttnnnnnneeeeeeaaaaaaaaaaaa^^^^^^XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWYYYYYYbbbbbbmmmmmm[[[[[[@@@@@@444444555555222222111111333333//////))))))......))))))??????______uuuuuussssssPPPPPPVVVVVVxxxxxxuuuuuuTTTTTT......//////111111333333444444333333222222222222111111111111111111111111000000//////............111111111111222222555555999999==================BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttvvvvvvrrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[ZZZZZZUUUUUURRRRRRSSSSSSTTTTTTWWWWWW______hhhhhh]]]]]]@@@@@@222222555555666666666666555555------333333444444,,,,,,777777IIIIIIiiiiiiuuuuuuAAAAAABBBBBB______ooooooUUUUUU------......000000111111111111000000//////......////////////////////////////////////////////////111111000000000000111111555555888888888888888888AAAAAADDDDDDFFFFFFHHHHHHQQQQQQaaaaaammmmmmrrrrrrvvvvvvqqqqqqffffff[[[[[[WWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF333333333333444444555555444444,,,,,,222222111111......000000333333______zzzzzzHHHHHH777777::::::UUUUUUNNNNNNHHHHHH,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,------------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiissssssnnnnnnddddddXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRRPPPPPPOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbuuuuuukkkkkknnnnnn~~~~~~ffffff------------..................,,,,,,******))))))))))))(((((((((((((((((())))))******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^WWWWWWTTTTTTUUUUUUSSSSSSNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------......222222111111,,,,,,eeeeeemmmmmm//////000000111111111111111111//////------,,,,,,++++++******))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444111111666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTUUUUUUVVVVVVTTTTTTNNNNNNFFFFFFHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV888888''''''))))))++++++......------''''''%%%%%%&&&&&&[[[[[[xxxxxxPPPPPP333333444444666666666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999777777444444333333888888888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuYYYYYY>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWWTTTTTT777777888888999999::::::::::::::::::888888777777666666555555333333111111111111333333444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[\\\\\\eeeeeerrrrrr]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||yyyyyyRRRRRR888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>GGGGGGFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______YYYYYYZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaaxxxxxxyyyyyyoooooowwwwww{{{{{{||||||xxxxxxaaaaaa888888444444666666\\\\\\xxxxxxrrrrrrUUUUUU444444888888<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa\\\\\\______bbbbbb^^^^^^aaaaaa``````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppwwwwww{{{{{{}}}}}}~~~~~~jjjjjj[[[[[[KKKKKK~~~~~~Ǭqqqqqq[[[[[[111111222222777777======CCCCCCGGGGGGGGGGGGGGGGGGHHHHHHPPPPPPEEEEEE555555666666999999666666777777//////999999BBBBBBEEEEEEDDDDDDBBBBBB>>>>>>;;;;;;FFFFFF\\\\\\ccccccVVVVVVRRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddqqqqqqttttttxxxxxxyyyyyyzzzzzz||||||}}}}}}mmmmmmԋ111111000000111111777777??????FFFFFFIIIIIIHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC::::::555555444444111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX\\\\\\ccccccddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddjjjjjjqqqqqquuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{~~~~~~~~~~~~~~~~~~vvvvvv888888444444000000222222::::::BBBBBBHHHHHHJJJJJJccccccssssssSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~oooooobbbbbbYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{ssssssJJJJJJGGGGGGAAAAAA;;;;;;999999======DDDDDDJJJJJJXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddbbbbbbcccccciiiiiilllllljjjjjjhhhhhhhhhhhhqqqqqqbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvxxxxxxUUUUUUOOOOOONNNNNNIIIIIIBBBBBB============CCCCCCHHHHHHTTTTTTxxxxxxsssssskkkkkk______gggggg{{{{{{iiiiiimmmmmmjjjjjj``````______ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttlllllllllllldddddd^^^^^^ZZZZZZ\\\\\\llllllIIIIIIIIIIIIPPPPPPPPPPPPKKKKKKHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqqqqqqqjjjjjjkkkkkkgggggg``````ddddddlllllljjjjjjbbbbbbffffff]]]]]]ffffffqqqqqqeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv||||||vvvvvv^^^^^^aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvssssssUUUUUUssssssppppppxxxxxxzzzzzzkkkkkkbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````ccccccaaaaaagggggglllllliiiiii````````````VVVVVV^^^^^^hhhhhh©PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQSSSSSSQQQQQQKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddjjjjjjyyyyyyyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnnhhhhhh``````cccccchhhhhhiiiiiippppppppppppeeeeeerrrrrryyyyyyuuuuuuiiiiiiaaaaaa______ggggggxxxxxxddddddeeeeee]]]]]]______aaaaaa~~~~~~}}}}}}uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJIIIIIIIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUXXXXXXNNNNNNbbbbbbzzzzzzoooooonnnnnnrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyyooooooggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhggggggwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}~~~~~~qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPLLLLLLLLLLLLOOOOOO^^^^^^ffffffccccccwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______pppppprrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhppppppeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzttttttnnnnnnppppppooooooppppppwwwwwwcccccciiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWW}}}}}}PPPPPPOOOOOOQQQQQQSSSSSSOOOOOOLLLLLLTTTTTT______xxxxxxuuuuuussssssssssssllllllbbbbbbjjjjjjuuuuuurrrrrraaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkggggggiiiiiikkkkkkeeeeeeeeeeeehhhhhhmmmmmmllllll``````ffffffrrrrrrBBBBBBJJJJJJwwwwwwPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^bbbbbbssssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbeeeeeepppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmkkkkkk______``````vvvvvvvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{\\\\\\RRRRRRMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddeeeeeeeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllhhhhhhiiiiiiggggggkkkkkkggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooozzzzzzzzzzzzrrrrrrhhhhhhffffffiiiiii<<<<<>>>>>CCCCCCRRRRRRkkkkkkiiiiii______ffffffjjjjjjZZZZZZSSSSSSqqqqqqkkkkkkZZZZZZbbbbbbcccccceeeeeeeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]rrrrrrhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmkkkkkkkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{GGGGGG------hhhhhhxxxxxx{{{{{{yyyyyyttttttttttttyyyyyy//////888888111111>>>>>>______````````````gggggg______[[[[[[pppppp{{{{{{ddddddcccccceeeeeeddddddeeeeeeiiiiiiiiiiiiffffffccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllrrrrrrlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmoooooojjjjjjbbbbbbaaaaaaeeeeeeaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz}}}}}}{{{{{{wwwwwwuuuuuuwwwwww{{{{{{......555555++++++555555TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmxxxxxx}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~yyyyyywwwwwwwwwwww{{{{{{999999>>>>>>999999>>>>>>NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______ZZZZZZ[[[[[[ccccccbbbbbb[[[[[[iiiiiillllllaaaaaaggggggeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuuooooookkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUllllllooooookkkkkk777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||OOOOOOOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffnnnnnnbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffooooooaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooonnnnnniiiiiibbbbbbffffffllllllhhhhhhmmmmmmmmmmmmkkkkkkkkkkkknnnnnnnnnnnneeeeeeYYYYYYZZZZZZHHHHHHVVVVVVsssssswwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY``````dddddd____________cccccc``````cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccbbbbbbqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssjjjjjjeeeeee^^^^^^UUUUUU______nnnnnnoooooonnnnnnmmmmmmkkkkkkiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX::::::UUUUUUqqqqqqWWWWWWooooooxxxxxxaaaaaa))))))......777777::::::>>>>>>qqqqqq``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXiiiiii``````VVVVVVIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkqqqqqqiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWW[[[[[[______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQQQQQQQMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{qqqqqqpppppp````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWTTTTTTQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF??????222222<<<<<>>>>>FFFFFF666666000000111111GGGGGGddddddiiiiiizzzzzzllllllggggggbbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddllllllaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJKKKKKKJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@888888KKKKKKVVVVVVKKKKKK======::::::>>>>>>??????++++++333333<<<<<<111111444444555555CCCCCCrrrrrr______aaaaaaqqqqqqnnnnnn^^^^^^bbbbbbbbbbbbccccccccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeejjjjjj333333nnnnnn______hhhhhhppppppllllll______UUUUUUSSSSSSPPPPPPMMMMMMKKKKKKJJJJJJJJJJJJJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMCCCCCC111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<]]]]]]______YYYYYYddddddqqqqqqUUUUUUddddddeeeeeeffffffeeeeeeddddddddddddffffffhhhhhhbbbbbbuuuuuuyyyyyyttttttۃUUUUUUeeeeeerrrrrreeeeee[[[[[[NNNNNNIIIIIIIIIIIIQQQQQQLLLLLLGGGGGGAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX777777333333999999555555111111333333333333111111111111555555888888======FFFFFFPPPPPPHHHHHHUUUUUUWWWWWWllllllffffff@@@@@@cccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhhhhhhhбiiiiiiOOOOOO______NNNNNNQQQQQQYYYYYYXXXXXXLLLLLLCCCCCCHHHHHHOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLwwwwwwRRRRRR444444111111777777333333//////111111111111............111111222222555555<<<<<>>>>>======<<<<<<>>>>>>======;;;;;;::::::::::::666666000000//////333333<<<<<>>>>>888888666666999999PPPPPPRRRRRRCCCCCCJJJJJJNNNNNN;;;;;; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..1a55df90784a703c7747c16fcc7282e71d47b045 GIT binary patch literal 26149 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..df3fd07fab19a038ef7ae05e3939d96313ef60c9 GIT binary patch literal 26149 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 besIkHaD|uP2QC8Nd-tlJ)L(FIUY`5kUw}0f literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog.miff new file mode 100644 index 0000000..baaf9fc --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=16 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Relative +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2009-09-05T17:47:34-04:00 + +:......//////222222444444555555555555444444444444222222222222222222111111000000......------,,,,,,111111222222444444999999??????BBBBBBCCCCCCCCCCCCAAAAAAHHHHHHPPPPPPXXXXXXccccccoooooottttttrrrrrrvvvvvvttttttnnnnnneeeeeeaaaaaaaaaaaa^^^^^^XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWYYYYYYbbbbbbmmmmmm[[[[[[@@@@@@444444555555222222111111333333//////))))))......))))))??????______uuuuuussssssPPPPPPVVVVVVxxxxxxuuuuuuTTTTTT......//////111111333333444444333333222222222222111111111111111111111111000000//////............111111111111222222555555999999==================BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttvvvvvvrrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[ZZZZZZUUUUUURRRRRRSSSSSSTTTTTTWWWWWW______hhhhhh]]]]]]@@@@@@222222555555666666666666555555------333333444444,,,,,,777777IIIIIIiiiiiiuuuuuuAAAAAABBBBBB______ooooooUUUUUU------......000000111111111111000000//////......////////////////////////////////////////////////111111000000000000111111555555888888888888888888AAAAAADDDDDDFFFFFFHHHHHHQQQQQQaaaaaammmmmmrrrrrrvvvvvvqqqqqqffffff[[[[[[WWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF333333333333444444555555444444,,,,,,222222111111......000000333333______zzzzzzHHHHHH777777::::::UUUUUUNNNNNNHHHHHH,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,------------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiissssssnnnnnnddddddXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRRPPPPPPOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbuuuuuukkkkkknnnnnn~~~~~~ffffff------------..................,,,,,,******))))))))))))(((((((((((((((((())))))******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^WWWWWWTTTTTTUUUUUUSSSSSSNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------......222222111111,,,,,,eeeeeemmmmmm//////000000111111111111111111//////------,,,,,,++++++******))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444111111666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTUUUUUUVVVVVVTTTTTTNNNNNNFFFFFFHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV888888''''''))))))++++++......------''''''%%%%%%&&&&&&[[[[[[xxxxxxPPPPPP333333444444666666666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999777777444444333333888888888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuYYYYYY>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWWTTTTTT777777888888999999::::::::::::::::::888888777777666666555555333333111111111111333333444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[\\\\\\eeeeeerrrrrr]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||yyyyyyRRRRRR888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>GGGGGGFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______YYYYYYZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaaxxxxxxyyyyyyoooooowwwwww{{{{{{||||||xxxxxxaaaaaa888888444444666666\\\\\\xxxxxxrrrrrrUUUUUU444444888888<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa\\\\\\______bbbbbb^^^^^^aaaaaa``````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppwwwwww{{{{{{}}}}}}~~~~~~jjjjjj[[[[[[KKKKKK~~~~~~Ǭqqqqqq[[[[[[111111222222777777======CCCCCCGGGGGGGGGGGGGGGGGGHHHHHHPPPPPPEEEEEE555555666666999999666666777777//////999999BBBBBBEEEEEEDDDDDDBBBBBB>>>>>>;;;;;;FFFFFF\\\\\\ccccccVVVVVVRRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddqqqqqqttttttxxxxxxyyyyyyzzzzzz||||||}}}}}}mmmmmmԋ111111000000111111777777??????FFFFFFIIIIIIHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC::::::555555444444111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX\\\\\\ccccccddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddjjjjjjqqqqqquuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{~~~~~~~~~~~~~~~~~~vvvvvv888888444444000000222222::::::BBBBBBHHHHHHJJJJJJccccccssssssSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~oooooobbbbbbYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{ssssssJJJJJJGGGGGGAAAAAA;;;;;;999999======DDDDDDJJJJJJXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddbbbbbbcccccciiiiiilllllljjjjjjhhhhhhhhhhhhqqqqqqbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvxxxxxxUUUUUUOOOOOONNNNNNIIIIIIBBBBBB============CCCCCCHHHHHHTTTTTTxxxxxxsssssskkkkkk______gggggg{{{{{{iiiiiimmmmmmjjjjjj``````______ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttlllllllllllldddddd^^^^^^ZZZZZZ\\\\\\llllllIIIIIIIIIIIIPPPPPPPPPPPPKKKKKKHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqqqqqqqjjjjjjkkkkkkgggggg``````ddddddlllllljjjjjjbbbbbbffffff]]]]]]ffffffqqqqqqeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv||||||vvvvvv^^^^^^aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvssssssUUUUUUssssssppppppxxxxxxzzzzzzkkkkkkbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````ccccccaaaaaagggggglllllliiiiii````````````VVVVVV^^^^^^hhhhhh©PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQSSSSSSQQQQQQKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddjjjjjjyyyyyyyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnnhhhhhh``````cccccchhhhhhiiiiiippppppppppppeeeeeerrrrrryyyyyyuuuuuuiiiiiiaaaaaa______ggggggxxxxxxddddddeeeeee]]]]]]______aaaaaa~~~~~~}}}}}}uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJIIIIIIIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUXXXXXXNNNNNNbbbbbbzzzzzzoooooonnnnnnrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyyooooooggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhggggggwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}~~~~~~qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPLLLLLLLLLLLLOOOOOO^^^^^^ffffffccccccwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______pppppprrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhppppppeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzttttttnnnnnnppppppooooooppppppwwwwwwcccccciiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWW}}}}}}PPPPPPOOOOOOQQQQQQSSSSSSOOOOOOLLLLLLTTTTTT______xxxxxxuuuuuussssssssssssllllllbbbbbbjjjjjjuuuuuurrrrrraaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkggggggiiiiiikkkkkkeeeeeeeeeeeehhhhhhmmmmmmllllll``````ffffffrrrrrrBBBBBBJJJJJJwwwwwwPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^bbbbbbssssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbeeeeeepppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmkkkkkk______``````vvvvvvvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{\\\\\\RRRRRRMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddeeeeeeeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllhhhhhhiiiiiiggggggkkkkkkggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooozzzzzzzzzzzzrrrrrrhhhhhhffffffiiiiii<<<<<>>>>>CCCCCCRRRRRRkkkkkkiiiiii______ffffffjjjjjjZZZZZZSSSSSSqqqqqqkkkkkkZZZZZZbbbbbbcccccceeeeeeeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]rrrrrrhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmkkkkkkkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{GGGGGG------hhhhhhxxxxxx{{{{{{yyyyyyttttttttttttyyyyyy//////888888111111>>>>>>______````````````gggggg______[[[[[[pppppp{{{{{{ddddddcccccceeeeeeddddddeeeeeeiiiiiiiiiiiiffffffccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllrrrrrrlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmoooooojjjjjjbbbbbbaaaaaaeeeeeeaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz}}}}}}{{{{{{wwwwwwuuuuuuwwwwww{{{{{{......555555++++++555555TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmxxxxxx}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~yyyyyywwwwwwwwwwww{{{{{{999999>>>>>>999999>>>>>>NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______ZZZZZZ[[[[[[ccccccbbbbbb[[[[[[iiiiiillllllaaaaaaggggggeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuuooooookkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUllllllooooookkkkkk777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||OOOOOOOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffnnnnnnbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffooooooaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooonnnnnniiiiiibbbbbbffffffllllllhhhhhhmmmmmmmmmmmmkkkkkkkkkkkknnnnnnnnnnnneeeeeeYYYYYYZZZZZZHHHHHHVVVVVVsssssswwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY``````dddddd____________cccccc``````cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccbbbbbbqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssjjjjjjeeeeee^^^^^^UUUUUU______nnnnnnoooooonnnnnnmmmmmmkkkkkkiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX::::::UUUUUUqqqqqqWWWWWWooooooxxxxxxaaaaaa))))))......777777::::::>>>>>>qqqqqq``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXiiiiii``````VVVVVVIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkqqqqqqiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWW[[[[[[______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQQQQQQQMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{qqqqqqpppppp````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWTTTTTTQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF??????222222<<<<<>>>>>FFFFFF666666000000111111GGGGGGddddddiiiiiizzzzzzllllllggggggbbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddllllllaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJKKKKKKJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@888888KKKKKKVVVVVVKKKKKK======::::::>>>>>>??????++++++333333<<<<<<111111444444555555CCCCCCrrrrrr______aaaaaaqqqqqqnnnnnn^^^^^^bbbbbbbbbbbbccccccccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeejjjjjj333333nnnnnn______hhhhhhppppppllllll______UUUUUUSSSSSSPPPPPPMMMMMMKKKKKKJJJJJJJJJJJJJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMCCCCCC111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<]]]]]]______YYYYYYddddddqqqqqqUUUUUUddddddeeeeeeffffffeeeeeeddddddddddddffffffhhhhhhbbbbbbuuuuuuyyyyyyttttttۃUUUUUUeeeeeerrrrrreeeeee[[[[[[NNNNNNIIIIIIIIIIIIQQQQQQLLLLLLGGGGGGAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX777777333333999999555555111111333333333333111111111111555555888888======FFFFFFPPPPPPHHHHHHUUUUUUWWWWWWllllllffffff@@@@@@cccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhhhhhhhбiiiiiiOOOOOO______NNNNNNQQQQQQYYYYYYXXXXXXLLLLLLCCCCCCHHHHHHOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLwwwwwwRRRRRR444444111111777777333333//////111111111111............111111222222555555<<<<<>>>>>======<<<<<<>>>>>>======;;;;;;::::::::::::666666000000//////333333<<<<<>>>>>888888666666999999PPPPPPRRRRRRCCCCCCJJJJJJNNNNNN;;;;;; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..1a55df90784a703c7747c16fcc7282e71d47b045 GIT binary patch literal 26149 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..df3fd07fab19a038ef7ae05e3939d96313ef60c9 GIT binary patch literal 26149 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 besIkHaD|uP2QC8Nd-tlJ)L(FIUY`5kUw}0f literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..a6d2e2ec2891d9cdb639707fb026966a4005af9b GIT binary patch literal 26149 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..655af2c4ea4e1bcaa749ee4c426cdcb19ae86f94 GIT binary patch literal 26149 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::<>33==..CC//HH22GG//BB))BB++@@))??))??))==))==((FF00UUDDKKIIXX6677FF,,//BB000099//--5500**6633**33//##22**::--$$99&&""QQ;;>>ppXXhhmmyy}}llPPNNddNNTTddssvvssuuPPSS\\55,,##55..&&77//,,9911//::11229900336600006611--5522))4422%%3311""2200!!////##0000&&1100++77..//<<++55>>**55::--4488443399::44==??44@@>>//EE<<++UU;;**dd99))zz88,,99//==77CC==IIDDKKGGHHCCAA;;<<3388,,>>..FF33GG44DD00GG33BB..>>++==,,==++??--GG55TTEEPPJJTT8877@@,,++??1100::55117766116666,,00.."";;55))==33))88))$$FF3355XXDDPPwwaavv~~}}pp@@AASS;;AAMMXX__iillqqwwOOTTXX33,,""22..%%44//))5500--55////44..0033----22--**3300++22//((11..%%00--&&11--**22..--33..2255//33;;,,33;;**00;;**00;;,,//??1100@@5511@@66--BB66**MM;;--VV99))ee77((xx66**77--==77EE@@IIFFKKIICC@@::6644--77..??33BB55AA44>>2299--44**77++;;00AA55KK??[[NN]]RRQQCC::::11**6633,,3366//2277001166//++..%%4444((5511&&66--&&99----<>55..BB<<00EE<<++PP;;**__88''uu77((<<11CC;;HHCCLLHHFFCC>>9955//55//;;33<<44::22::33770088..::11<<44DD::TTJJii]]||kkbb__NNBBDD6644::..((22))''22**,,66..,,33++++--""//,,##6622))9911..11++++ee``ffooyyxxaanneeddqqhhxxxx]]ii[[00--$$....$$11..''//..))11--**//++**--))((,,(()),,(()),,(()),,&&**++%%)),,%%,,..''////''22--,,11''11((&&11##----%%55++))==--..??1111<<3344557722//;;//11??..99AA,,FF>>))ZZ99&&tt;;**@@44EE::FF==EE<>44==44;;22~~>>55@@77CC::EE;;EE<>00<<..AA22AA44>>22>>33@@66??66||<<33pp44**qq88//tt>>44yyEE::~~LLAA\\PPwwiizzoo__yy\\GG``JJ))AA33..%%..))%%..))--00))....&&++))&&&&''))WW__TTȴppggEEXX::3333334444226677226677116677115566004433..3322..44001133//0033--1122,,0011++//22,,..33----0011))))66""))88!!2266''<<55--CC5555DD3399>>33997722660044331188117799..==44%%LL,,``--zz22$$::--==**BB..BB22>>//;;..==22<<33~~::11}}==33ww;;11ss==11wwFF88RRDDeeVV}}nnooppeellZZggAAggRR,,HH<><<--EE<<33KK;;;;LL77<>@@55??AA44DDDD::HHHH@@BBAA==BBAA??==<<::??;;88>>;;442200##00//AA??**==55""@@44$$II;;..TTCC<>XXww$$44WWUU..))jj\\OOwwkkppoooossrrqqzzooggNN``FF7733AA9988@@>><<==??@@::AACC66CCEE77EEEE99GGGG==<<;;77??==>><<::==??==>>IIHHCCDDEE7799;;%%<<::##RRFF66OOAA44LL@@44MM@@77MM>>99OO7777RR//55YY**22ii**55<>==<>CC<>bbAAkkDDrrIIwwOOxxbbMMcc<>>>66DDEE55GGHH88HHII;;GGGG??HHHHHHPPOOUUEECCNN5544<<66668899::446688**8899''2200!!<<::--CCDD66FFFF::GGEE99JJ@@77PP7722ZZ..--qq0044BBHHFFKK77::3322>>99??5544&&==++88&&66)):://<<77;;88;;88>>9955..BB88KK??TTHHYYRRLLEE==99<<<<==CC==HH@@TTBB]]BBeeEEjjKKqqTTvviiddww^^ff]][[߽Ƈxxuu66..9944--445500--::88,,BBAA//GGHH66IIII==IIHHDD]]\\dd{{zzzzxxWWXXmm??AAPP6699@@2266553388111144++??BB77GGJJ??CCEE88>>::..@@22''II--""SS$$||9933??<<>>9955..55++==33==1155%%;;((==((99))66**44--55..22,,//&&55((??11LL==TTEELLBB;;4400--3333HHIIIIOOKKXXJJ^^IIccKKiiPPppVVttYYqqccrrjjssaabbώù>>55::99001166//''6633"">><<''EEDD00IIII??KKIILLcc``uuᦦъooppMMRRhh77==II;;CCEE;;@@::::;;55BB;;33SSBB88ffJJ>>ssII;;yyAA22GG88AA11>>..AA11CC11AA22AA22EE44BB..II44GG77>>1166--55++22**00$$55%%::''GG66PP@@FF::88006633;;;;CCAADDFFHHPPKKYYNNaaRRjjTTmmWWooUUii__mmoouuZZ[[ܬII====CC::33<<44''9944 ==99 CCAA,,JJGG@@LLKKSS]]ZZyy{{~~[[^^}}MMKKYYCC88>>GG0066kkGGIIhhgguuppii``XXJJKK99@@++==''DD00EE33==//==22FF;;@@00FF44EE88??55771144--33++55))??1199((FF66QQBBBB9966117777::;;DD@@DDBBFFIIMMVVSSaaVVggUUggTTee\\jj]]ggrrxxVVXXzzyySSFF@@NNDD88HH@@--BB<<""@@<<BB@@++HHEE@@KKIIWWWWRRzz񰰫ᔔwwZZooJJ``XXllfftt]]ffKKMMAA;;AA33>>++;;((::))77++22++--..553344,,55++22--33002222//00//..22..DD;;77**DD88SSIIDD@@55662288..33DD??CC>>BB@@JJOOWW``^^ii[[ffVVaammuubbii}}[[[[vvBBDD[[JJBBYYII<>OOKK==22CC33@@0055&&//%%11--..//**,,--..&&&&""$$,,--4444444422004400::44**$$;;55RRMMIIGG==??88>>225555//55++77//FFAAWWZZffkkhhllddhhttwwggiittqqbb;;66^^EE>>ffKKDDhhHHIIccAA@@^^@@88]]FF88VVII66IIJJ::SS____ss˙ꝝ陙٤βzz__||CCTT@@OOHHRRBBGG>>>>DDAAIIAABB88;;0055))66++88//880055..11--**11 **,,33::;;3300))$$11,,9944::66**''2211BBCCGGFFOOLLJJHH44009900@@2222""@@11OOHHmmjjYYYYffeerrqqqqnnmmggjj^^qqffRR__MM??eeNNFFffHHJJcc@@DDaa??==aaGG::YYNN22OOOO33@@NN==WWjjppggvvȌrr``99^^GG^^99GGDDMMMMQQ@@@@6600;;44@@66;;3333**,,##..&&44++::11;;22663366@@''33,,3344555500;;44FF>>FF??8833//,,//0022333311;;77CC<>VVLLBBWWFF>>ZZGG99^^MM99ZZTT44TTUU55HHOO==QQYY[[UUTTssttffxxyyooHHdd55II22AADDNNKKOO::::22++<<44FF::CC99::0000''//((5500996699774444,,44$$..++114466::77CC>>EE>>9922FF@@LLGGGGCC;;7744//44-->>55OOFF9900<>BB000011**AA66HH<>77<<44//%%\\TTxx~~ggwwNN]]QQSSNN==jjttQQkkddyyppooͯDDYY22FFVV22KKQQ77QQPP;;VVPP::VVNN77TTOO22RRNN55KKGG;;XXOORR\\JJ``^^{{uu____SS]]BBNN<>;;AA99@@44::005577>>>>DD44:://55==>>GGCCMMFFQQGGLL??FF99EE;;CC88AA99FF==00 11%%444466774400IIEEjj}}QQmmIIbb>>BBzzKK99ggmm^^kk__aaUUvvggyyii{{nnvvuull__\\UU;;]]RR<>aaKK>>eeMMCCffMMHHccKKKKaaNNTTkk]]nnxxoovvttyyzz}}~~ΦllddllcciiaaOOGG77..<<22JJ@@JJ??66**AA55AA6644**//((8844BBBBFFHHWW[[cciiYYaa44@@''44GGRR[[ddMMOO>>;;55++>>22EE77;;//==44>>88--%%77##77&&++)),,2255<>77AA88??44<<22<<55662222**77$$55##33..//4444??99LLggJJffWWjj>>BBiiLL::DD??__ZZ22~~WWLL99``SSddMMhhNNbbHHXX||??VVww>>YYzzAAMM4488WW>>AA__JJGGffTTRRnnaajjuukkrrkkkkggrrqqԗ䚚ޜϣǑttjjrruuXXJJQQ;;ll[[yyllxxnncc[[77//..%%33**77--<>88==44::4488333311//((55""88$$??6677::--99II^^RRppOOiiPPYY[[55,,IIEE,,1177ccZZ33ffmm::LL~~77YYJJhhNNllOOeeHH__~~BB^^}}AAbbEE99..44DD;;<>-->>..??11AA44AA883344BBGG44<<""++,,7711==**4411774488::::;;889966886688552211//((55""<<((DD77::77--99ZZppCC]]SSffkk8855//<<[[iiEEWWggNN]]JJkkQQnnOOiiJJeeEEeeEEjjJJ00..338888880033((::BB33XXcc]]XXbbnnXX]]wwxxׅԌ͐ÍwwrraaqqttXXMM~~PP99]]KKppccllccOOHH33++11''66**88''==,,BB00DD22@@22==22::221111<<@@66;;--1166??<>==99770099**>>,,44$$;;33^^bbVV^^NNRRjj11**''%%??WW77~~nnâxxWWYY11]]{{GGiiVVggMMffIIhhIIkkNNppQQttUU==66==??>>9988==&&::EE%%GGUU;;KKXXNN^^eexx{{qqvvjjxx~~rrttllaa[[bbYYTThhQQKKUUJJLLBB??88GG@@CC>>44..99..88));;''77 88!!BB..EE88>>66663344337755==;;CC@@DD@@DD@@FFCCAAAA::<<559955::449977::>>>>CC????8888..88))77''66''MMAAllllPPOOXXOOMM22FFUU66ooff||uuXXXX66FFNN''ddPPddSSggNNeeIIiiMMqqUUvvZZxx\\]]HHQQZZKKHHWWQQ77UUWW22QQYY44NNVVAAVVYY``eebb}}uuoogg]]bbZZggbb[[UU[[VV@@ZZYY::``aaBBmmYYAAUUKKMMKK7755<<99??;;::33CC6677%%EE--:: 66>>**BB66==88779999<>DD>>>>7777..7700<<88555588;;66;;33;;55;;==>>BB>>==5555))88++**;;,,YYKKZZTTVVLLhhSSddggHHzzllppjjPPHH<<""$$((00@@jjXXmm\\llWWjjRRllSStt[[vv\\ssYYnnUU[[ggTTPPkk__IIkkffFFccccAA``bbJJddcc^^aa^^gg^^WWgg``XXee``XXUURRMM::FFEE&&TTTT..ddffAAooZZ??YYRRWWXX==??;;99885566//FF88::&&II00::1166!!;;..77224488::>>BBAA??88??66:://00$$77--FF??GGCC>>>>;;==88==99;;@@==EE::??1155''<<11>>33[[OOAA77^^PPuu[[~~YYooKK.. 88228811AAHH&&33EEjjWWuubbuu^^ooWWppXXvv^^rr\\hhRRnn\\ZZll]]VVkk__QQjjbbMMiiccMMiiddNNiiccSSiiccWW``YYOOooii]]ee__OOZZUUAANNII33IIEE,,QQOO88XX>>--~~7733^^__aacc99::++++9944==3366&&FF1188 ,,..::..BB;;>>@@>>>><<88>>55==22;;00;;..==22>>77??88IIFFHHFFFFCCAA;;<<11::'';;%%;;''55++33--<<55OOEE__TTaaSSjjXXDDOOMM44!!** ==HH((BBII**??FF%%((6644FF ooYYyyccnnVVvv^^{{eeppZZccMM\\FFkk^^VVkk^^UUll``TTll``RRjjaaPPkkccPPkkccNNkkccLLwwqq[[rrllVVffaaKKllggSS[[VVCC<<66&&AA;;--SS;;//kk,,''8877\\\\``__==;;5511DD>>AA6644&&88'';;))CC44II>>KKCCCCAA@@==;;55??44==00;;..::..::..::119911>>99>>88>>77<<22::))::$$||<>::>>;;@@<>00%%kkGG99RRCCRRDDSSGG__WWYYSSHHEEEEFFCCHH@@EE::==7766AA<>@@JJ11//<<""..== 00?? 33BB##UUddCCzzdd}}bbkkMM^^@@^^BB``HH^^FFjj``TTjj``TTjjbbUUjjbbUUkkddTTkkddTTkkddTTjjddTTmmggWWxxrrddaa[[OOYYUUJJ{{wwnn}}ttUU;;**II))PP++aa66%%ss;;..LLCCRROO>>AA@@HHAALL@@II<>00==--<>JJ4422@@''--;;!!//==##HHUU99uuaa}}``eeEEYY~~;;]]AAbbHH]]DDkkaaUUjjbbUUjjbbUUkkccVVkkddTTjjddTTkkeeWWkkeeWWee__SSaa]]QQ``\\QQܩWW>>((II33PP::%%88 qqEE::||kkmmEEMMFFQQJJVVIIQQEEFFAA;;AA77HH;;33''88,,::..<>//||>>11||>>11||>>11~~;;22||9900zz77..vv88--ss77--mm77++ff55''aa33&&XX,,##nnFF>>}}[[RRrrUUMMXXDD99BB66**22..""((**,,33##::EE44AANN:://<<(())77 --99!!EEOO77~~lluu[[__@@XXww;;bbFFffLLZZxxBBjjccSSiiccSSiiccSSjjddTTjjddVVkkeeWWkkeeYYiieeYYnnjj__eeaaXXssnnhhԣyy__PP;;GG<<**VVMM<<ӽrrvvSSZZ::@@88==>>==@@;;BB99JJ==55,,::00::11;;00{{;;//xx<<11vv>>11ww??22rr99..pp77,,nn55,,ll66,,ll77//ii77..ee55++__33**SS..%%aaCC99jjOOFFZZFF==HH::11@@::..????33>>BB44))11"",,99((55BB11,,99((00;;**..::&&??HH55vvff}}OOSSpp::SSoo<>HHEEJJDD??55;;//;;33>>66<<33<<33zz<<11vv<<11ss??22qq??44hh88,,ee66,,dd55++ff77//hh9911ii::22gg6611``55..ccEE;;^^HH==QQ??55<<..%%22)) 5522))5577,,--33))22<<11))55))00<<0022>>00==HH8811::))55<<,,ssXXmmFFIIcc66MMff<<__xxPP__uuOOFF__88hheeTTiiffUUjjggXXiiffWWhhddXXhhddXXjjff[[kkhh__bb__XXssrrmm͸~~{{jjxxvviiʭrrjj;;22DD::OOEEFF;;AA99::44||66..ww44,,||==44xx??66oo==22ff77--cc99--__77--aa;;00hhBB99hh==66bb55//gg7733kkDD==yymmbbTTGG??33''9911&&::88,,4466++--33))..55--,,66--))55++**66,,..::..22<<1177??22@@FF::FFRR>>==PP22II__;;MMbbAAbbwwXX]]ppTT66JJ//ggddSSiiffUUjjggXXiiffWWhhddXXggeeYYiiff]]iiiiaakkjjeeĻ٩UUHH66**FF;;9900AA99II@@EE>>uu::22mm77--nn>>44ooEE99^^::..^^>>11XX:://VV66++^^<<33ooHHAAttIICCeeCC::rrffYYRRBB::44&&4422%%6688++1144))**11))**44++))44,,''22**''33)),,66--//66..1199..88>>44>>FF7788GG00BBVV;;FFXX@@YYkkUUTTeeRR..??,,ffeeSShhggUUiiggXXiiggXXggeeXXeeeeYYgggg]]hhhh``bbaa\\||}}wwij||mmNN??KK@@vv@@66pp77..tt;;44nn7700rr@@77ll@@77__99..]]@@22[[AA22WW@@22SS<<..XX>>11ddFF;;ooMMCCmmQQFFqqeeWWMMJJ994422##2233%%66::,,2288,,..55--..88//**55--''22**((22**))33**++22**))00((..33,,44<>0077==1155==2266@@7700::22,,77//,,66..--77//,,33++))00((++00))//77,,//==,,66GG4422CC00CCTTBBFFTTGG,,::--ccddRReeffTTgghhXXhhii[[gggg[[eegg\\eeff^^ffgg__kkllddssvvmmýѯ||VVKKggAA66__==11\\@@22]]LL88RRJJ33WWSS::]][[BBSSOO66EE==&&VVGG22ppccPP\\ZZEEIIKK66<<==++<>BB44;;AA5599AA6699CC::77AA9955??7744>>6655??7733::33..55..//44--22:://66EE2299KK55..@@**::KK88>>OO??**;;++bbccQQeeffTThhii[[hhii[[ffhh]]eegg\\eeff^^ffgg__kknnee||ɺû~~\\PP``>>22``@@33ggPP@@WWHH33VVRR99QQQQ77HHLL11QQQQ55^^]]AAcc\\BBYYSS;;__]]HHPPRR==EEHH55AAEE44??CC44::@@4477??4499@@88;;EE==99CC;;::DD<<;;EE==::AA::44;;4455::3377??22IIXXEEII[[CC88JJ44??PP==BBSSAA11BB22 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..a6d2e2ec2891d9cdb639707fb026966a4005af9b GIT binary patch literal 26149 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..655af2c4ea4e1bcaa749ee4c426cdcb19ae86f94 GIT binary patch literal 26149 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]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbssssssiiiiiinnnnnnkkkkkk------------..................,,,,,,******))))))))))))(((((((((((((((((())))))******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^WWWWWWTTTTTTUUUUUUSSSSSSNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------......222222111111,,,,,,eeeeeeuuuuuu//////000000111111111111111111//////------,,,,,,++++++******))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444111111666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTUUUUUUVVVVVVTTTTTTNNNNNNFFFFFFHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV888888''''''))))))++++++......------''''''%%%%%%&&&&&&[[[[[[úooooooJJJJJJ333333444444666666666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999777777444444333333888888888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuYYYYYY>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWW^^^^^^777777888888999999::::::::::::::::::888888777777666666555555333333111111111111333333444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[\\\\\\eeeeeerrrrrr]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||wwwwwwSSSSSS888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>GGGGGGFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______YYYYYYZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaaxxxxxxyyyyyyoooooowwwwww{{{{{{||||||xxxxxxaaaaaa999999555555888888^^^^^^yyyyyyppppppRRRRRR444444888888<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa\\\\\\______bbbbbb^^^^^^aaaaaa``````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppwwwwww{{{{{{}}}}}}~~~~~~kkkkkk\\\\\\MMMMMMǬqqqqqq[[[[[[111111222222777777======CCCCCCGGGGGGGGGGGGGGGGGGHHHHHHPPPPPPEEEEEE555555666666999999666666777777//////999999BBBBBBEEEEEEDDDDDDBBBBBB>>>>>>;;;;;;FFFFFF\\\\\\ccccccVVVVVVRRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddqqqqqqttttttxxxxxxyyyyyyzzzzzz||||||~~~~~~nnnnnnԌ111111000000111111777777??????FFFFFFIIIIIIHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC::::::555555444444111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX\\\\\\ccccccddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddjjjjjjqqqqqquuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{~~~~~~~~~~~~~~~~~~wwwwww888888444444000000222222::::::BBBBBBHHHHHHJJJJJJccccccssssssSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~oooooobbbbbbYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{ssssssJJJJJJGGGGGGAAAAAA;;;;;;999999======DDDDDDJJJJJJXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddbbbbbbcccccciiiiiilllllljjjjjjhhhhhhhhhhhhqqqqqqbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvxxxxxxUUUUUUOOOOOONNNNNNIIIIIIBBBBBB============CCCCCCHHHHHHTTTTTTxxxxxxsssssskkkkkk______gggggg{{{{{{iiiiiimmmmmmjjjjjj``````______ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttlllllllllllldddddd^^^^^^ZZZZZZ\\\\\\llllllHHHHHHIIIIIIPPPPPPPPPPPPKKKKKKHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqqqqqqqjjjjjjkkkkkkgggggg``````ddddddlllllljjjjjjbbbbbbffffff]]]]]]ffffffqqqqqqeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv||||||vvvvvv^^^^^^aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvssssssUUUUUUssssssppppppxxxxxxzzzzzzkkkkkkbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````ccccccaaaaaagggggglllllliiiiii````````````VVVVVV^^^^^^hhhhhh¨PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQSSSSSSQQQQQQKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddjjjjjjyyyyyyyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnnhhhhhh``````cccccchhhhhhiiiiiippppppppppppeeeeeerrrrrryyyyyyuuuuuuiiiiiiaaaaaa______ggggggxxxxxxddddddeeeeee]]]]]]______aaaaaa~~~~~~}}}}}}uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJIIIIIIIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUXXXXXXNNNNNNbbbbbbzzzzzzoooooonnnnnnrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyyooooooggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhggggggwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}~~~~~~qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPLLLLLLLLLLLLOOOOOO^^^^^^ffffffccccccwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______pppppprrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhppppppeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzttttttnnnnnnppppppooooooppppppwwwwwwcccccciiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWWPPPPPPOOOOOOQQQQQQSSSSSSOOOOOOLLLLLLTTTTTT______xxxxxxuuuuuussssssssssssllllllbbbbbbjjjjjjuuuuuurrrrrraaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkggggggiiiiiikkkkkkeeeeeeeeeeeehhhhhhmmmmmmllllll``````ffffffrrrrrrBBBBBBJJJJJJ{{{{{{PPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^bbbbbbssssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbeeeeeepppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmkkkkkk______``````vvvvvvvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{\\\\\\PPPPPPMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddeeeeeeeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllhhhhhhiiiiiiggggggkkkkkkggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooo{{{{{{yyyyyyqqqqqqggggggffffffkkkkkk<<<<<>>>>>CCCCCCRRRRRRkkkkkkiiiiii______ffffffjjjjjjZZZZZZSSSSSSqqqqqqkkkkkkZZZZZZbbbbbbcccccceeeeeeeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]rrrrrrhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmkkkkkkkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{GGGGGG------hhhhhhxxxxxx{{{{{{~~~~~~yyyyyyttttttttttttyyyyyy//////888888111111>>>>>>______````````````gggggg______[[[[[[pppppp{{{{{{ddddddcccccceeeeeeddddddeeeeeeiiiiiiiiiiiiffffffccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllrrrrrrlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmoooooojjjjjjbbbbbbaaaaaaeeeeeeaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz{{{{{{zzzzzzwwwwwwvvvvvvxxxxxxzzzzzz......555555++++++555555TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmxxxxxx}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~wwwwwwvvvvvvwwwwww{{{{{{999999>>>>>>999999>>>>>>NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______ZZZZZZ[[[[[[ccccccbbbbbb[[[[[[iiiiiillllllaaaaaaggggggeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuuooooookkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUllllllooooookkkkkk777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxyyyyyyxxxxxx||||||OOOOOOOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffnnnnnnbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffooooooaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooonnnnnniiiiiibbbbbbffffffllllllhhhhhhmmmmmmmmmmmmkkkkkkkkkkkknnnnnnnnnnnneeeeeeYYYYYYZZZZZZHHHHHHVVVVVVsssssswwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx}}}}}}]]]]]]YYYYYY``````dddddd____________cccccc``````cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccbbbbbbqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssjjjjjjeeeeee^^^^^^UUUUUU______nnnnnnoooooonnnnnnmmmmmmkkkkkkiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX::::::UUUUUUqqqqqqWWWWWWooooooxxxxxxaaaaaa))))))......777777::::::>>>>>>qqqqqq``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXiiiiii``````VVVVVVIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkqqqqqqiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWW[[[[[[______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQQQQQQQMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{ppppppnnnnnn````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWTTTTTTQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF??????222222<<<<<>>>>>FFFFFF666666000000111111GGGGGGeeeeeehhhhhhyyyyyykkkkkkggggggbbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddllllllaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJKKKKKKJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@888888KKKKKKVVVVVVKKKKKK======::::::>>>>>>??????++++++333333<<<<<<111111444444555555CCCCCCuuuuuuaaaaaaaaaaaaqqqqqqnnnnnn______bbbbbbbbbbbbccccccccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeejjjjjj333333nnnnnn______hhhhhhppppppllllll______UUUUUUSSSSSSPPPPPPMMMMMMKKKKKKJJJJJJJJJJJJJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMCCCCCC111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<``````aaaaaaYYYYYYddddddrrrrrrYYYYYYddddddeeeeeeffffffeeeeeeddddddddddddffffffhhhhhhffffffrrrrrrzzzzzzttttttՀVVVVVVhhhhhhttttttdddddd^^^^^^PPPPPPHHHHHHIIIIIIQQQQQQMMMMMMHHHHHHAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX777777333333888888555555111111333333222222000000111111555555999999======FFFFFFOOOOOOGGGGGGSSSSSSUUUUUUjjjjjjeeeeeeAAAAAAcccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhkkkkkkвkkkkkkPPPPPP^^^^^^PPPPPPRRRRRRYYYYYYXXXXXXNNNNNNEEEEEEIIIIIIOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLvvvvvvRRRRRR444444111111777777333333//////111111111111............111111444444666666======FFFFFFCCCCCCPPPPPPRRRRRRffffffaaaaaa======cccccceeeeeeffffffffffffddddddddddddffffffgggggg``````vvvvvvȆ[[[[[[[[[[[[LLLLLLEEEEEELLLLLLIIIIIIMMMMMMKKKKKKEEEEEEIIIIIIIIIIIIFFFFFFAAAAAADDDDDDMMMMMMUUUUUUVVVVVVeeeeeeGGGGGG000000000000777777555555222222555555222222............////////////......333333::::::999999FFFFFFGGGGGG[[[[[[YYYYYY777777bbbbbbddddddffffffffffffeeeeeeeeeeeeffffffgggggg``````hhhhhhttttttVVVVVVAAAAAAJJJJJJBBBBBBTTTTTTTTTTTTLLLLLLOOOOOOHHHHHHMMMMMMUUUUUUHHHHHH888888HHHHHHhhhhhhWWWWWWAAAAAA111111333333::::::::::::::::::<<<<<<777777444444222222222222000000,,,,,,......444444333333======;;;;;;NNNNNNPPPPPP555555bbbbbbddddddffffffggggggffffffeeeeeeeeeeeeffffffqqqqqqttttttٹ``````IIIIIIGGGGGGNNNNNNMMMMMMIIIIIIPPPPPPYYYYYYMMMMMM======JJJJJJffffffUUUUUUEEEEEE::::::;;;;;;>>>>>>============????????????<<<<<<;;;;;;::::::666666111111111111555555;;;;;;BBBBBB::::::HHHHHHLLLLLL666666aaaaaaddddddggggggggggggffffffeeeeeeeeeeeeffffffooooooddddddDDDDDDIIIIII]]]]]]HHHHHHNNNNNNMMMMMMHHHHHHNNNNNN[[[[[[]]]]]]TTTTTT[[[[[[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]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbssssssiiiiiinnnnnnkkkkkk------------..................,,,,,,******))))))))))))(((((((((((((((((())))))******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^WWWWWWTTTTTTUUUUUUSSSSSSNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------......222222111111,,,,,,eeeeeeuuuuuu//////000000111111111111111111//////------,,,,,,++++++******))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444111111666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTUUUUUUVVVVVVTTTTTTNNNNNNFFFFFFHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV888888''''''))))))++++++......------''''''%%%%%%&&&&&&[[[[[[úooooooJJJJJJ333333444444666666666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999777777444444333333888888888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuYYYYYY>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWW^^^^^^777777888888999999::::::::::::::::::888888777777666666555555333333111111111111333333444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[\\\\\\eeeeeerrrrrr]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||wwwwwwSSSSSS888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>GGGGGGFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______YYYYYYZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaaxxxxxxyyyyyyoooooowwwwww{{{{{{||||||xxxxxxaaaaaa999999555555888888^^^^^^yyyyyyppppppRRRRRR444444888888<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa\\\\\\______bbbbbb^^^^^^aaaaaa``````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppwwwwww{{{{{{}}}}}}~~~~~~kkkkkk\\\\\\MMMMMMǬqqqqqq[[[[[[111111222222777777======CCCCCCGGGGGGGGGGGGGGGGGGHHHHHHPPPPPPEEEEEE555555666666999999666666777777//////999999BBBBBBEEEEEEDDDDDDBBBBBB>>>>>>;;;;;;FFFFFF\\\\\\ccccccVVVVVVRRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddqqqqqqttttttxxxxxxyyyyyyzzzzzz||||||~~~~~~nnnnnnԌ111111000000111111777777??????FFFFFFIIIIIIHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC::::::555555444444111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX\\\\\\ccccccddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddjjjjjjqqqqqquuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{~~~~~~~~~~~~~~~~~~wwwwww888888444444000000222222::::::BBBBBBHHHHHHJJJJJJccccccssssssSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~oooooobbbbbbYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{ssssssJJJJJJGGGGGGAAAAAA;;;;;;999999======DDDDDDJJJJJJXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddbbbbbbcccccciiiiiilllllljjjjjjhhhhhhhhhhhhqqqqqqbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvxxxxxxUUUUUUOOOOOONNNNNNIIIIIIBBBBBB============CCCCCCHHHHHHTTTTTTxxxxxxsssssskkkkkk______gggggg{{{{{{iiiiiimmmmmmjjjjjj``````______ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttlllllllllllldddddd^^^^^^ZZZZZZ\\\\\\llllllHHHHHHIIIIIIPPPPPPPPPPPPKKKKKKHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqqqqqqqjjjjjjkkkkkkgggggg``````ddddddlllllljjjjjjbbbbbbffffff]]]]]]ffffffqqqqqqeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv||||||vvvvvv^^^^^^aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvssssssUUUUUUssssssppppppxxxxxxzzzzzzkkkkkkbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````ccccccaaaaaagggggglllllliiiiii````````````VVVVVV^^^^^^hhhhhh¨PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQSSSSSSQQQQQQKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddjjjjjjyyyyyyyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnnhhhhhh``````cccccchhhhhhiiiiiippppppppppppeeeeeerrrrrryyyyyyuuuuuuiiiiiiaaaaaa______ggggggxxxxxxddddddeeeeee]]]]]]______aaaaaa~~~~~~}}}}}}uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJIIIIIIIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUXXXXXXNNNNNNbbbbbbzzzzzzoooooonnnnnnrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyyooooooggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhggggggwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}~~~~~~qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPLLLLLLLLLLLLOOOOOO^^^^^^ffffffccccccwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______pppppprrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhppppppeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzttttttnnnnnnppppppooooooppppppwwwwwwcccccciiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWWPPPPPPOOOOOOQQQQQQSSSSSSOOOOOOLLLLLLTTTTTT______xxxxxxuuuuuussssssssssssllllllbbbbbbjjjjjjuuuuuurrrrrraaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkggggggiiiiiikkkkkkeeeeeeeeeeeehhhhhhmmmmmmllllll``````ffffffrrrrrrBBBBBBJJJJJJ{{{{{{PPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^bbbbbbssssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbeeeeeepppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmkkkkkk______``````vvvvvvvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{\\\\\\PPPPPPMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddeeeeeeeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllhhhhhhiiiiiiggggggkkkkkkggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooo{{{{{{yyyyyyqqqqqqggggggffffffkkkkkk<<<<<>>>>>CCCCCCRRRRRRkkkkkkiiiiii______ffffffjjjjjjZZZZZZSSSSSSqqqqqqkkkkkkZZZZZZbbbbbbcccccceeeeeeeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]rrrrrrhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmkkkkkkkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{GGGGGG------hhhhhhxxxxxx{{{{{{~~~~~~yyyyyyttttttttttttyyyyyy//////888888111111>>>>>>______````````````gggggg______[[[[[[pppppp{{{{{{ddddddcccccceeeeeeddddddeeeeeeiiiiiiiiiiiiffffffccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllrrrrrrlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmoooooojjjjjjbbbbbbaaaaaaeeeeeeaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz{{{{{{zzzzzzwwwwwwvvvvvvxxxxxxzzzzzz......555555++++++555555TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmxxxxxx}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~wwwwwwvvvvvvwwwwww{{{{{{999999>>>>>>999999>>>>>>NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______ZZZZZZ[[[[[[ccccccbbbbbb[[[[[[iiiiiillllllaaaaaaggggggeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuuooooookkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUllllllooooookkkkkk777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxyyyyyyxxxxxx||||||OOOOOOOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffnnnnnnbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffooooooaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooonnnnnniiiiiibbbbbbffffffllllllhhhhhhmmmmmmmmmmmmkkkkkkkkkkkknnnnnnnnnnnneeeeeeYYYYYYZZZZZZHHHHHHVVVVVVsssssswwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx}}}}}}]]]]]]YYYYYY``````dddddd____________cccccc``````cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccbbbbbbqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssjjjjjjeeeeee^^^^^^UUUUUU______nnnnnnoooooonnnnnnmmmmmmkkkkkkiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX::::::UUUUUUqqqqqqWWWWWWooooooxxxxxxaaaaaa))))))......777777::::::>>>>>>qqqqqq``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXiiiiii``````VVVVVVIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkqqqqqqiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWW[[[[[[______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQQQQQQQMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{ppppppnnnnnn````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWTTTTTTQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF??????222222<<<<<>>>>>FFFFFF666666000000111111GGGGGGeeeeeehhhhhhyyyyyykkkkkkggggggbbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddllllllaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJKKKKKKJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@888888KKKKKKVVVVVVKKKKKK======::::::>>>>>>??????++++++333333<<<<<<111111444444555555CCCCCCuuuuuuaaaaaaaaaaaaqqqqqqnnnnnn______bbbbbbbbbbbbccccccccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeejjjjjj333333nnnnnn______hhhhhhppppppllllll______UUUUUUSSSSSSPPPPPPMMMMMMKKKKKKJJJJJJJJJJJJJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMCCCCCC111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<``````aaaaaaYYYYYYddddddrrrrrrYYYYYYddddddeeeeeeffffffeeeeeeddddddddddddffffffhhhhhhffffffrrrrrrzzzzzzttttttՀVVVVVVhhhhhhttttttdddddd^^^^^^PPPPPPHHHHHHIIIIIIQQQQQQMMMMMMHHHHHHAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX777777333333888888555555111111333333222222000000111111555555999999======FFFFFFOOOOOOGGGGGGSSSSSSUUUUUUjjjjjjeeeeeeAAAAAAcccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhkkkkkkвkkkkkkPPPPPP^^^^^^PPPPPPRRRRRRYYYYYYXXXXXXNNNNNNEEEEEEIIIIIIOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLvvvvvvRRRRRR444444111111777777333333//////111111111111............111111444444666666======FFFFFFCCCCCCPPPPPPRRRRRRffffffaaaaaa======cccccceeeeeeffffffffffffddddddddddddffffffgggggg``````vvvvvvȆ[[[[[[[[[[[[LLLLLLEEEEEELLLLLLIIIIIIMMMMMMKKKKKKEEEEEEIIIIIIIIIIIIFFFFFFAAAAAADDDDDDMMMMMMUUUUUUVVVVVVeeeeeeGGGGGG000000000000777777555555222222555555222222............////////////......333333::::::999999FFFFFFGGGGGG[[[[[[YYYYYY777777bbbbbbddddddffffffffffffeeeeeeeeeeeeffffffgggggg``````hhhhhhttttttVVVVVVAAAAAAJJJJJJBBBBBBTTTTTTTTTTTTLLLLLLOOOOOOHHHHHHMMMMMMUUUUUUHHHHHH888888HHHHHHhhhhhhWWWWWWAAAAAA111111333333::::::::::::::::::<<<<<<777777444444222222222222000000,,,,,,......444444333333======;;;;;;NNNNNNPPPPPP555555bbbbbbddddddffffffggggggffffffeeeeeeeeeeeeffffffqqqqqqttttttٹ``````IIIIIIGGGGGGNNNNNNMMMMMMIIIIIIPPPPPPYYYYYYMMMMMM======JJJJJJffffffUUUUUUEEEEEE::::::;;;;;;>>>>>>============????????????<<<<<<;;;;;;::::::666666111111111111555555;;;;;;BBBBBB::::::HHHHHHLLLLLL666666aaaaaaddddddggggggggggggffffffeeeeeeeeeeeeffffffooooooddddddDDDDDDIIIIII]]]]]]HHHHHHNNNNNNMMMMMMHHHHHHNNNNNN[[[[[[]]]]]]TTTTTT[[[[[[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 Kxe`Ks(D^U_%EPw+ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog.miff new file mode 100644 index 0000000..f1c3acf --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=16 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Relative +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T07:35:57-04:00 +date:modify=2012-06-21T07:35:57-04:00 + +:55,,##66--&&8800--::2200;;2255;;22338822228833//6644((5533$$3322 1100//00 ////##0000&&44//,,;;++55<<,,7777228866::9988DD::;;HH77BBFF55KKCC00[[<<**pp;;--;;00??77CC??GGCCJJIIKKGGII@@FF99AA33??..DD//HH22GG//AA))BB++@@))??))@@))??))@@((JJ00WWDD~~MMIIXX6677EE,,//@@00006611--1122**2255**..22##,,--4400$$55((""MM==>>ooXXhhmmzz}}llUUPPffPPRRaarrttttvvIIKKXX55,,##55..&&77//,,9911//::11229900336600006611--5522))4422%%3311""2200!!////##0000&&1100++55////99,,5599,,5566004455553366;;44::@@44>>??//GG;;++VV;;**gg77))||66,,88//<<77BB==GGDDJJGGJJCCEE;;??33;;,,??..FF33GG44CC00GG33BB..>>++>>,,??++BB--JJ55VVEENNJJXX6677DD**++@@0000<<44116677114477,,,,00""6677))9955))44++$$AA5555UUEEPPttccvv}}ppAA>>OO99==HHZZ\\hhssvvPPTT]]33,,""22..%%44//))5500--55////44..0033----22--**3300++22//((11..%%00--&&11--**22..--33..2255//3377..3377,,0077,,0088..//<<2200??6611??66--BB66**NN;;--XX88))gg66((yy55**66--<<77DD@@IIFFLLIIEE@@==6666--88..>>33AA55@@44<<2277--44**77++<<00CC55MM??[[NNYYRR__<<::GG++**@@..,,::22//6655003366//++..%%3355((2222&&22//&&4400--772266``]]hhzzyyIINNTT1199;;4499<>55..CC;;00GG;;++QQ::**aa77''xx66((;;11BB;;GGCCMMHHHHCC??9966//55//9933<<4499229933770066..::11==44EE::VVJJii]]xxkkooYYNNOO>>66>>55..//..))--//**//44..--22++++--""//,,##6622))7722..00,,++ccaaffnnwwtt``kkcceepphh||~~aammcc00--$$....$$11..''//..))11--**//++**--))((,,(()),,(()),,(()),,&&**++%%)),,%%,,..''////''22--,,11%%22(($$22##++..%%22--))::....==1111::444466772200:://22??..99AA,,FF>>))\\99&&uu::**??44EE::FF==EE<>II99&&22((,,%%))22--11660000--&&44++$$<>00<<..AA22AA44>>22==33>>66==66::33ss33**ss77//vv==44zzDD::~~LLAA\\PPwwii~~ooccww\\II__JJ++??33--%%""--))((--))11..))44++&&22%%00!!11$$ccXXTTʶ~~ffxx``==OO553333334444226677226677116677115566004433..3322..44001133//0033--1122,,0011++//22,,..33----0011))((77""))88!!2266''::66--CC5555CC4499>>33997722660044332277117799..??33%%LL,,``--{{11$$::--<<**AA..AA22>>//::..<<22;;337711<<33zz::11vv<<11zzDD88RRDDddVV||nnppttllhh~~ggLLaaRR33DD<<''22..%%!!++**&&00--&&(($$**((3355''TT\\MM||||{{~~yy~~zzssPPddHH7766;;8888::999977::;;55::;;33::<<11999911887722::66559955667733446600226611..6611++7733**5566&&66;;%%77<<&&??<<--FF<<33MM;;;;LL77<>::88CC==<>@@55??AA44DDDD::HHHH@@BBAA==BBAA??==<<::??;;88>>;;442200##00//AA??**==55""AA44$$II;;..UUBB<><<==??@@::AACC66CCEE77EEEE99GGGG==<<;;77??==>><<::==??==>>IIHHCCDDEE7799;;%%<<::##RRFF66QQAA44MM??44NN@@77OO==99OO7777RR//55[[))22ii**55<>>><<@@::<<22DD44;;++::--AA88>>;;55337766EEBB9955BB>>BB<>>>66DDEE55GGHH88HHII;;GGGG??HHHHHHPPOOUUEECCNN5544<<66668899::446688**8899''3300!!??99--EECC66HHFF::HHDD99LL??77RR6622ZZ..--qq0044BBHHGGKK88::4422??99@@5544&&<<++66&&55)):://<<77;;88;;88>>9955..BB88KK??SSHHXXRRJJEE<<99::<<<>::..@@22''JJ,,""SS$$||9933@@<<>>9955..66++>>33??1166%%::((;;((88))66**44--55..33,,//&&66((@@11LL==TTEEKKBB::44..--2233HHIIHHOOJJXXKK^^KKccMMiiSSppZZtt^^qqiirrppssffbb㾾ý>>55::99001166//''6633"">><<''EEDD00IIII??KKIILLcc``uuᦦъooppMMRRhh99==II>>BBEE>>??::==::55DD9933TTBB88ggII>>ttHH;;zz@@22GG88AA11>>..AA11CC11CC22CC22FF44BB..HH44GG77>>1166--66++33**11$$77%%;;''HH66QQ@@FF::77004433;;;;EEAAIIFFLLPPOOYYRRaaVVjjXXmm\\ooXXhhbbmmppuu[[[[ݫII====CC::33<<44''9944 ==99 CCAA,,JJGG@@LLKKSS]]ZZyy{{~~]]^^}}QQHHYYGG66>>JJ//66mmFFIIggggttpphh``XXJJKK99AA++==''EE00FF33??//??22HH;;@@00EE44EE88@@55881166--66++88))BB11;;((HH66RRBBCC9966116677::;;FF@@HHBBJJIIQQVVWWaaZZggYYggWWee]]ii]]ggrrxxTTXXwwyySSFF@@NNDD88HH@@--BB<<""@@<<BB@@++HHEE@@KKIIWWWWRRzz񰰫ᕕvvXXooHH``VVllddtt\\ffJJMMAA;;AA33??++<<((<<))88++33++//..553344,,44++22--44004422220022..66..GG;;::**FF88UUIIEE@@66661188..33CC??CC>>CC@@KKOOWW``^^ii\\ffXXaannuubbii||YY[[zz??CC[[JJBBYYII<>OOMM==22CC33@@0055&&00''11--..//**,,,,..&&&&""$$----6644664444007700<<44,,$$<<55SSMMIIGG==??77>>005544//33++44//DDAAWWZZffkkhhllddhhttwwhhiittqqff9966^^EE>>ffKKDDhhHHIIccAA@@``??88__EE88VVII66KKII::TT^^__tt˛Ꞟ隚٦βzzbb||GGUUDDOOKKRREEII@@@@FFCCIICCBB::;;2244++44--661166221100..//**11 **--33;;;;3300**$$11,,9944::66++''3311CCCCGGFFNNLLJJHH44009900??33..##==22RRIIppjjXXXXccccrrrrssoorrggnn^^uubbQQ__MM??ccOOFFffHHJJcc@@DDbb??==bbFF::[[MM22PPOO33AANN==XXiippiiuuȏpp__99^^KK``>>IIIIOOQQSSCCAA8822<<66AA77<<4422,,**%%++((11//66557744335544@@''33,,3344554400;;44EE>>EE??7733//,,//0022332211;;77CC<>UUMMBBWWFF>>ZZGG99^^MM99\\SS44UUTT55JJNN==SSXX[[WWTTsswweevvxxmmHHdd77JJ66CCHHPPNNQQ==;;44-->>66FF;;CC::9922//))--**2222668866991166**44$$..++114466::77CC>>EE>>9922EE@@LLGGGGCC;;7744//44--==55OOFF::11:://77--;;00<>88<<5522&&]]SSxx||ffuuOO\\QQRRNN==mmssQQqqddzzttuu~~™ҩDDYY22EEVV22IIRR77QQPP;;VVPP::VVNN77UUNN22SSMM55MMGG;;YYNNRR__II``\\{{ss}}||]]__TT^^EEPP??FF6699..,,66..AA66==00GG;;EE::>>777744556655::..88&&0000770066CCIIWWZZLLPP4455''%% 00((CC99AA7799--<<3355++22**DD9977++88..>>::==9900''RRJJrr||QQggLLaaMMSSJJ;;dd~~qqssrrzzvvwwOO[[77NNXX66RRUU::XXSS??WWOO<>??DD44::0055==>>GGCCMMFFQQGGMM??FF99FF;;CC88AA99FF==// 33&&9955;;883300HHEEll{{TTmmJJbb;;BBII::hhnn__ss``mmYY||ll||ll}}oovvuunn``\\UU;;]]RR<>--eeuu``uuaawwddttaarr``||llssuueeeeUUbbLL>>aaKK>>eeMMCCffMMHHccKKKKbbMMTTkk]]nnyyooyyrr||yy}}ѥkkffkkeeiiccPPII6600<<44KKCCJJAA77,,BB77BB8855,,00,,9966CCCCGGHHXX[[ddiiZZaa55@@((44GGRR[[ddOOOO??;;66++??22EE77<>??[[aaNNVV66BB==KK::GG..9999<<7766??77BB88@@44==22<<55662222**66$$77##::..444433??66LLiiOOff[[jj??BBssGG::OO::^^[[22{{WWVV99mmTTiiPPkkRRccIIXXzz>>UUww;;ZZ||@@MM4488WW>>AA__JJGGffTTRRpp``jjwwkkssjjllffttppԚ䞞ޞϦǕvviirrxxVVLLQQ<>44>>884455LLPP>>FF**4433AA44AA--6677<<6677<<99@@88==44;;44::334411//((55""::$$EE66<<::--99GG^^UUppSSiiTTYYZZ55,,RR@@,,;;22bbZZ33eemm::UUzz77ddJJmmQQnnQQggJJ__~~BB__||BBccGG99..44DD;;<>//??00@@22BB66BB::4444CCGG55<<$$++--7722==,,4422776688;;::==88;;66996699554411//((55""<<((HH77==77--99YYppEE]]VVffgg::555599ddeeEEWWnnNNddJJmmRRooQQjjLLeeGGffGGiiKK00..338888880033((::BB33YYbb]]YYaannXX]]xxwwׇԏ͔Òuuuu``qqttWWOO}}PP;;]]MMppeekkeeNNII33--11**66,,88++==--BB22DD44AA33==44;;442211>>@@77;;..1188??==CC77==77;;5588889999999966;;::==::885533++99((??++==,,7711@@HH__ooFFWWIIOORR??00 ..HHYY99Ƥ||TTooQQmmVVmmPPllNNjjLLiiKKkkMMnnPP..--22446633''00..<<##LLZZIIRR``aaggmmΞۊČ}}ssuuccssooTT[[XXPPRRDDSSHH\\SSNNII44..22))::0088**77&&::((BB11DD77==1155//22....,,7777<<<<>>;;GGHHMMLLHHHHBBDD558877::88::9999====BB>>??99990099**>>,,22$$;;33__bbYY^^PPRRhh11**&&&&>>WW77{{nnâxx[[WW11aayyGGkkVVggMMhhKKiiLLmmPPrrSSuuVV<<77==??>>9988==&&::EE%%GGUU;;LLXXNN__ddxx}}ppyyiivvqqttoo``[[ffWWTTkkOOKKUULLMMDD@@99HHBBDD@@55//::0099++==))88""99##BB00FF::>>88665544558877>>;;EE@@EE@@EE@@HHCCDDAA<<<<779966::669988::@@>>DD??AA88;;..88))77''33''KKAAoollTTOOZZOOMM22GGTT66nnff||uu^^UU66MMJJ''eePPddSSffMMeeKKiiOOqqWWxx\\yy]]\\HHQQYYKKHHWWQQ77UUWW22QQYY44NNVVAAXXXX``ffbb}}vvnnhh]]eeYYggddYYUU]]UU@@^^WW::dd__BBppWWAAUULLNNMM8866==;;@@==;;44DD8888''EE//;;""66??,,BB88<<::77;;88>>BBAACC>>EE>>AA7788..::00>>888855::;;88;;55;;77;;??>>CC>>??5577))99++))66,,UUKK^^TT[[LLhhSSggffHHxxlleeppPP@@AA""**%%88<<jjXXjj\\llWWjjRRmmUUuu]]ww``tt]]llUU[[ggTTPPjj__IIkkffFFccccAA``bbJJffcc^^cc]]gg__VVggbbWWeeaaWWUUSSLL::IIDD&&VVTT..ggddAAqqYY??ZZSSYYZZ>>AA<<==99777700GG::::((JJ22:: 0066##::11664433::99@@BBAA@@88@@66;;//11$$99--HH??HHCC>>>><<==99==::;;AA==FF::??1166''==11::33XXOOCC77ccPPuu[[~~\\mmKK// ..771144EEFF&&::AAhhWWrrbbuuaaooYYqqZZuu__tt^^kkUUll]]ZZll]]VVkk__QQjjbbMMiiccMMiiddNNjjccSSiiccWWbbYYPPppjj^^gg``PP[[VVBBOOJJ44JJFF--TTOO99YY??00||8855``bbccgg::>>--,,;;77??5577''HH4499##,,//9911??<<;;??::@@<<88>>55;;22::00::..<<22>>77>>88HHFFGGFFFFCC@@;;<<11::''::%%;;''55++33--::55NNEE``TTccSSjjXXDDQQMM44##)) ;;II((??JJ**<>??7755FF??BB8877))99**<<..AA77GG@@HHFF@@AA==>>::55==44;;0099..88..99..88117711<<99==88<<77::2299))99$$~~;;!!||;;%%tt++""~~55//GGAAWWPP``UUddWW{{hhWWttnnXX[[]]EEVV__BB@@MM//::II((,,==44FF kk{{VVhhtt__tt^^wwaallXXccMM\\HHii__UUjj``VVjj``TTjjaaRRkkbbQQkkccPPjjccPPkkeeOOdd]]JJgg``MMdd__KKuupp]]mmggYYOOII;;GGCC77KK99--VVMMVVMMmmggvvqqWWSS??<>JJGGNNKKNNKKKKIIMMKKLLHH>>::22**770099//88--77**66))44))22**11))//**00))11**11((33%%55##ww99 vv99$$uu22))??99MMHHUULL||TTJJppTTHHhhXXHHcc^^JJkkooXXRR\\AA44AA%%33BB##11@@55EE!!ccssOOmm{{bbqqWWkkRReeMMbbII^^FFjj``VVjj``VVjj``TTkkaaUUkkbbSSkkddRRkkddRRkkddRRgg``NNwwrr__jjddTTbb\\NNff``TThhddYY__[[RR>>00''iiGG;;SSDDSSFFTTII``YYZZUUIIGGFFHHDDIIAAHH::AA66::@@@@KKGGDD::66++55++99..99--99,,99,,77**66++44**//''//((00))11((44''{{66&&ss99%%qq::&&qq55++{{@@::PPHH]]TTddZZ~~ffZZoobbRR__\\IIPPSS>>@@JJ11//<<""..== 00?? 33BB##UUddCCzzff~~ddkkOO^^BB^^DD``FF__EEjj``TTjj``TTjjbbUUjjbbUUkkddTTkkddTTkkddTTjjddTTmmggWWxxrrddaa[[OOYYUUJJzzvvmm}}ttUU;;,,II((OO,,``66&&qq;;//LLEERRQQ>>CC@@JJBBNN??LL==EEAABBHHCCHH;;CC5555**88--::00<<00<<00==--;;//:://77--66--55,,55++{{77,,uu77**mm88((hh77((ee11&&uuCC<>JJ4422@@''--;;!!//==##HHUU99uuaa~~ccffJJYY}}==]]CCccII^^DDkkaaUUjjbbUUjjbbUUkkccVVkkddTTjjddTTkkeeWWkkeeWWee__SSaa]]QQ__[[PPܩWW>>**II33PP99''88 qqEE<<||kkmmDDMMGGSSKKWWKKSSGGHHDD>>EE88JJ;;33))77,,99..;;//==//||>>11||>>11}}==11~~;;22||9900zz77..ww77--ss77--mm77++ff55''aa33&&XX,,##nnFF>>}}[[RRrrUUMMXXDD99BB66**22..""((**,,33##::EE44AANN:://<<(())77 --99!!EEOO77~~llvv^^``DDWWvv==bbHHffLL\\{{BBjjccSSiiccSSiiccSSjjddTTjjddVVkkeeWWkkeeYYiieeYYmmii^^dd``WWrrmmggԤyy``OO==HH;;**XXLL>>ӺrrvvSSYY;;AA99<>11ww??22rr99..pp77,,nn55,,ll66,,ll77//ii77..ee55++__33**SS..%%aaCC99jjOOFFZZFF==HH::11@@::..????33>>BB44))11"",,99((55BB11,,99((00;;**..::&&??HH55vvhhSSTTpp==RRnn==aa}}LLbb~~MMRRnn==iiccSSiiccSSjjddTTjjddTTjjddVViieeYYiieeZZiiee\\ggccZZ[[XXQQhhee``xxmm[[;;55%%ަWWWW@@>>LLFFOOEEDD88>>22;;33>>66<<33<<33zz<<11vv<<11tt>>22qq??44hh88,,ee66,,dd55++ff77//hh9911ii::22ff7711^^66..ccEE;;^^HH==QQ??55<<..%%22)) 5522))5577,,--33))22<<11))55))00<<0022>>00==HH8811::))55<<,,ssZZnnKKJJcc99OOee>>^^wwOO__uuNNIIbb::hheeTTiiffUUjjggXXiiffWWhhddXXhhddXXjjff[[kkhh__eebb[[ppoojj˷~~{{jjzzvvjjƨttii>>33JJ<>33gg88..ee99..``88..cc;;11iiAA99hh==66aa44..ff6622kkBB<>11??EE99GGPP??>>NN33GG\\==JJ]]AA^^rrVV[[nnRR77KK//ggddSSiiffUUjjggXXiiffWWhhddXXggeeYYiiff]]iiiiaappoojj¸өXXHH;;++LL==9900@@99GG@@CC==ww8811nn55,,oo==44ppDD99__99..__==11\\::00WW55++``;;33ppGGAAttGGBBggBB::ppddYYRRBB;;55''5533&&5577**0033((**11)),,66--++66..((33++''33))++55,,..55--0088--88>>44??GG88;;JJ55EEWW??GGYYCC[[mmWWWWiiSS33EE//ffeeSShhggUUiiggXXiiggXXggeeXXeeeeYYgggg]]hhhh``ffee``zz{{uuïjjSSAAKK??xx==55rr66..vv9944qq6600uu>>77oo==66aa66--__==11]]@@22XX>>11UU;;..ZZ<<11hhFF<>..eeddRRggffTTiiggXXgghhZZffffZZffff\\gggg__gghh``]]^^XXeeff``ýӾggZZyyJJ@@ff44--oo::22jj33,,||GG??uuFF>>bb::00ccFF88XXAA11[[HH77ddQQ@@ZZEE44MM33$$aaAA44~~ddWW``WWFFCCDD223344$$5588''::>>0088>>2277??4488BB9900::22,,77//,,66..,,66..,,33++))00((,,11**1199....<<--55FF4422CC33CCTTDDDDUUEE))::**ccddRReeffTTgghhXXhhii[[gggg[[eegg\\eeff^^ffgg__kkllddnnqqhhǾ̼׬SSKKmm>>66dd9900aa==11bbHH77XXGG33[[PP::ccXXBBXXLL66JJ;;&&ZZEE22ssbbPP]]XXDDGGII44;;<<**<>6644>>6633::33..55..0055..33;;0077EE44::KK8800AA//<>++<<**bbccQQeeffTThhii[[hhii[[ffhh]]eegg\\eeff^^ffgg__nnqqhhyy˺ŹʅYYPPgg;;22ee==33mmMM@@]]FF44\\PP::WWOO88NNJJ11UUNN44ccYY@@hhXXAA\\PP::bb]]IIPPRR==DDGG44@@DD33@@DD55;;AA5577??4488??77==GG??;;EE==::DD<<;;EE==99@@9933::3344992266>>33HHVVEEGGXXEE66GG44==NN;;@@QQ??//@@.. \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..f03697c2c39b67395370bf3c6e4e7c106d02ad7b GIT binary patch literal 26149 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 Kxe`Ks(D^U_%EPw+ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/read_non_interlaced.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/read_non_interlaced.miff new file mode 100644 index 0000000..1df02b5 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/read_non_interlaced.miff @@ -0,0 +1,17 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=75 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2009-09-05T17:47:34-04:00 +jpeg:colorspace=2 +jpeg:sampling-factor=1x1,1x1,1x1 + +:1.'2/(52+83-94.;4.:3-;2-;0*:/)8-'6+%6+%6+%7,&8-'42#53'74-=84E>8HA7JC3JC0JA2VC2pG3H6G:EABG?K8D=@?8?0@.B0@+:">19/9-@,E*D*C2C=FFV8..9)+;18/2B(1@-/0/*-*%./4-'1V75PBf_|`tXIhZNbzvwvxjTTL./)0/*21,63.74/72.61-61-80-7/,6.+5-*4,)5-*6.+7/,42&41(52-941?74C<4DIJX7014)/91<36A06653"3+:4(465-,2G13l<:Zf|epF9nB:a^[lorgSUH,.+-/,00.11/21/10.2.-1-,3/.2.-1-,0,+1-,2.-3/.40/41*30+3/,50-;31>71?6-?7,D=5K=4Y<.m9+9*=0B=GCD?F;C1=(<)@1C2C/C2;-6(8+=.@3B=FGYWW@844*24/:14;25,847,;2!23-,037.3H*2uSlpqEA|20_17OOY[JTIBK:)-,*.-+/..0/...---++++)*-+.,*-+),+),,*--+./-00.13/.2.-1-,4/,91/<41>50>5.@85F93N7/\6)s5(:-B5G>H:I7F/?'<(=-?1?.7/7,<+{B.~E1H9OIXXt^`R>F96924+,4+..44!827) 0,)/553465+,k]lkv^k~_pw|ut]kT*.-*.-+/.-/....,,,****()))+))+((*'')((***,++---/0,-/+*/+(2-)80-;4.=31=31@44C84K:3T9.c7*|:,B4G9A2E1F0A+<+=/=/;-;.>0B5C6F7Q@lVkimMeO>I90-&/##6+/7266*.3-1235/4.,/$ei[Ŭcr[.0-/1.11/11/21/0/-0,+/+*,*-+),*(+*(+*(++),-+..,/.*+.*'/,'3/&92(;4,<3.;1/<-*?1.B5/G4-P2(c3)|:.?37,?0C0A/>.>2=0<-e;%o:(8/85?>ZNirv\{\K_F4=,+& 6#%="+3,42+2,&()&&*VcGvԔNj{~lgGVA34.54/76196196194072.61-4013/02./1-.0,-1-.2./3/03/.41,63*:6*?9+?9->5.;2-?*%@.*?2,=0*C+'S,%k4-~;374@8D9~@3<0;1;.|:*<1w<.s>0~B8MDdXrwsjf`KdF8C26+'5)*/2),.2""52+Q_Hyiu]vb|myquuKZG:70;81<92>93>93@93>71>50;55:44822600600600711822:63;81>0A8/=4-J3+H5/B71>3/@.*Q/-j95|A=>AEB}F?z?7}906,7)u6%NWQJoYA^cCohNk]qmzx{{}ihLiM>@55!" )&6.,<#&I06RGM[f^mki[mfroknu}mpJWF:6A@A=>C==GB?KFBK>8K?1F;)F:,C845,-0-&>?1R'1G.2A>5CM2CM*=B"9=/:@@-B9Z>;:=>=E9G5@495K8E6C:G?D=968=?J@GO@of?kpGfSMV5P(IHXP_Zgbnbp^mViQg?LY5)3-N2tXCraeiomxtt|oP]I67/:94>=9B>=D@?GB?HC=LE=B92E=0B;+E=0NG?IB<<8,;:%EL:CG8CD4MB.T>)R8'I5,C54@7.|FDLOB@<-B.F5C;C0=.:1<8=<:<:@;D36B8X?dL\VLTAM?G&C,K5U;`>e?kAoAq\X`iNC`H<}pȿsyoVaP21,43/:65@<;GB?JE?MG;LF8IHDQPLHDC843952=90<6(=8%$96>&L@0Z=5\;4V;4H;2>E@9I55D8I9S9Z8_8LF:NI6OH5\\fyzxxWWsA@R:7>935<34:0&M<2YB:P><=98/85*:-&9#<)<05-,#3%A0=2/(=&?*9).$-#4'5 /0':0H?KI>A219(I+QEQKNSI\GbJkQsW{CrTufvah;8163.4/+61-@91IA4OH5QK3_axĵሉpoTMlA6XI;JH9>A83;=8;JMGUXXSPdI@K5;(0 4(>4@7:541=4D:B;70.+2*6#6-"5'C3K?A84+:)J1G8E?DJDVFbJlPuSyLbSfbqSX⧩EA6@<195,92*>5,F>1OF5TL7[[sʻzaV9Po6<68,4,21/6*8+:)E1P=I:9+7(B0F7C46/1*6.>51*4&7(8026*6-333<29/A5OBNB=26';*L8H7I@?;816/;2<-8%> :<B%>52502642+,&40HFOKD;=.A.:+7(9.KA`[lojsco|bor7O5PN7XS=XS@RK;PF:UI=VH=UE8b[H{җޕŏzipHP8A=F=E;D?D=AC?B6A+B)@+9,4-1-::,-3/@6;)11&22E60#4+E?GAGAD;2'C0D01>)SDrm[devwx[g\bz\YjFXR<[TAYQ>UI9TG7XK;[K9=7<89-9$8"8'6/3111=C,6*4051.82>9;:90.&.(4/5/;1D7G8;.=-1 =)KYL;UH5XI6^M;`O;_N:VFFdP\`NtmgĜkBR.B-<>BKED:=2>9>;B<>3:(8%6*5214.4'408'A/@;0+C?GDC@<8816,D5ZI5.5-3);-=.jbzzD]IY~[hU{^b^zdxlxzƻ[K>ZJ;YH6XG3\L5`P9`O;_N:bU3lT8bG>f]p|{owE1@G;:A8E4=,819<2=KDH412174900$_U{hyEf@PiR2`Mi\qgk|dsovû\J@[I;ZI7\L5]M6\K7ZJ:YI:QH'dO4dLBofypG?SUDB>1;(8'<18:'0B;D9A39.4025,5%/,4+6>RSjJ^7@.),7+H>C;72951/0.B@3//05651+!UJyRhDiHSfQ4zdpkpi}_e}_naOE_M?_N<_P9ZN8UH8UH?YKHdYgn_vjZvoñ[jIR;@515)=-L?>AAF2+,,/12//%LBqQnBeFB^W:j_\kXxP`|YwYiwumaPF`PA_S=_S=ZO=UKA\RQg\b~}nq»šugNSFI@@8592NAXFN91*=4@67-2.=A:9430778:.07*/+)*/.8.B:c{Jj:[Z=-JU5hid{dz]~^sSvX~ewem^^NA[N=]R<\T=YR@ZSMi`eyq~vsq{nš顮wrgjaYV??..=8NCL?1,>5?31')#51EBNHOfai_W:/(&EP\pQj860-63952.;8><*(>+6-()..=4:3q{VqAc>Z<@%5M+yvWh`u[YDbnPiMbHKl7G]6SN8YQ>bRB_N:]QAmhnyyqu[[xxݵ~hmYi`{|hmOOA;/%A6A;5532;3A36A\aVV>@>I6E)54<(527989482:4907,8+<--%)+63F>v9fVn?A]Q;5D'R_Aa\~1e6kKkNcM[xHYtG]wH?>*LF6XNBcWImd]qo|kmdhmqʂКןѡϩ̘rjyd^N~RIdcmoond[?19'50:3<5831/3/<2C443QMHD/01=.>%50=+63798947272703(4%<,;-:252NTWs7jKgi.2GB,%:P`C`oHXv6^9lNkQeM_}I_{HdJ25$??3GB+A-D153Qi>>^^fZ^{VZrv́}مًۋӌ}vocma`KwRBVNgbh`RD;*:(7,9+=,@0>0;-;*@*9&D5:2+,2:6A1>2=055787667698733+9"?+5"=+?EIj;_BSY:@-(D[/yӣoWoSpRkOiMeIdFgGlH-1#470++)553QUXXZohjޖ퀂ρƒϏtqghe^D_hMz[GQGTOIC2(/#8,6*5&;(B/A19+6%7$,"6.7387CCKKHHCF257787778:<<<980>$?,(82Ub?\N]I=-#%FU.x\͑oIa-_{>pHgKcGcEhImJqN<:-A>5:94??5NPESSSdbxwsqm~wzpjafc[D_[.icIUE?6A<>60'4(0&8-6&9&C0E6>29-;-0/55:;54858677:=?>@8<.>&<+,#DDcoCNaV$DCU+uXmkI^39S#dBk>eIcEgHnLuSvUVNAVMDVPDXS?VU9US<_XRlbm{nj_md\ZcZU\RP]TMe]Jd]@ZMQJ4153936*?.0 @77*7&A0E9?8<7?:B+')A!iMsFlPjKlLsRvUqVhZMcWKh_PleIgb:gb#*83 7./=BE,A2dSyQuWqRqOvSrUgNk_Qk_Qk_Ql`Rl`RmaSmaSmaS]ZKnhXf]N]QCNF9DB5KOA?G:bB+cWZX3..F/I3:)>;9)68";3:>+@'@%>(=+;.@7B8D:@7<1:.9.;.6/{9-{A3OCZQ\NqU=NO/,7J.,lPpLiMu[{apXcK\Fk_Qk_Ql`Rl`Rl`RmaSmaSmaSwp`rkYj^NpdV]TE;8);=/>D6FI*J9YYRU2//$=25-91?0D3D8AA@DB=C696:3;0<,;*:*9+8-8-;/=0,gMtSoStWtYmScK_Hk_Ql`Rl`Rl`RmaSmaSmaSnbTh]Kj_Mj]Mzn`pgXPJ.`vHxZuXqTjNeJaH`HjaRjaRjaRkbSkbSlcTlcTlcTk^K|o^pcSg[Oh^RkeW_\M76$uF@LMCHDHVSVNJ@J@@FBE<=469;FEF==*y@5{?5<49393}:1z<1w=1z7.{8/z:.x:-w9,t9)r9(r9(l8*{A6MDVP]VeWchQJgHJVBpVx[jM]B^D`H`GibRibRjcSjcSkdTkdTkdTkdTsdQ|o_eYM\SJ|umoEG175 A4!W<+p:.CA@J)=2EFAB?:7y@-}>-<.;.;.;/|>/x@/v=6v=6v;3u:2u9/s7,s5*q3&a3$wC8QK[U_Uh_PIVB4N57@/=K4-u>9s<5s:3s82r7/q5-o0'l-$W-tD8VOvTJQH94=,'4#"-,2$9F2>P80;+01,34,AQ4tcpY\GVwB`NfSZwIicSicSicSjdTjdTkeUkeUkeUthZg^UrnkӣUZF6D3GQFrnVP=5;0B5C9A4rLCVH;6C1,C1:B7F<:,/$-9%2D,,9(57236/8?6?5x?4t>4v;5}9878h8*f6(e5'f8+h9/g;0d8/`5,mA6mA8[;043!6 =+270?),891*5$-?'2?.BD?4701?(wjQpDEd8Kg>]yQ\vQF^>pbUmdUheTefVfgYhfYle[oe\agMrul͸{|luvnԿmq33?8P>H/HB<7t74o:6sB=o?5l;,i6#a82a60e82o>7m;4f4+i7.sA8zm\cS28,*/(9?;062$+$07/.6+,4)-5*19,4<-7?0?H7HQ@;T7HaCMeCbzX^sT8L3ocUkdTheTefVfgYhfYle[ne\dmR}ҿŽۢMA. <,:4>8GCFEt=:k4/p:0zB5i31j73d5/]2)`<0iL]H3uzfRYG06*,1*5:4/6/'.'-4,,3+*1)*1).6+/7,19,7?2>F75L2AXZoPVhN/A+kdTjdThgUfgWfgYigZle[md[ZdKw|uȷxpDAI@{;2p3.u;7o:6s>8r;4l6,p64k84d90W:,RA-UO7V[=U^?hkVEI804&05.271070180-7.-3/*0,*1*+2++2*)0(-5*4<10B,2_H8`T>MK28? CQ0csO]_J=>,35(9<33816=5;E<3=2286/53.42/51,3,)0)*1)/6./>)8G24C.FSAHSC.8-bgSdgTfgUigXjfZjfZjf[ieZes\nxpпúǶp^JYG3UC/XG3YN:QK5TT:Y]BLS40AB:9<59@8?I>7B49?=7=;6<:7=93:3.5..5-2916E.;J30?,=J9BM?.8-^gRaiTehUjhYmg[lfZieZhdY_nYy~ǾmiNLH+MI,[ZESD4@4 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/read_plane_interlaced.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/read_plane_interlaced.miff new file mode 100644 index 0000000..1df02b5 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/read_plane_interlaced.miff @@ -0,0 +1,17 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=75 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2009-09-05T17:47:34-04:00 +jpeg:colorspace=2 +jpeg:sampling-factor=1x1,1x1,1x1 + +:1.'2/(52+83-94.;4.:3-;2-;0*:/)8-'6+%6+%6+%7,&8-'42#53'74-=84E>8HA7JC3JC0JA2VC2pG3H6G:EABG?K8D=@?8?0@.B0@+:">19/9-@,E*D*C2C=FFV8..9)+;18/2B(1@-/0/*-*%./4-'1V75PBf_|`tXIhZNbzvwvxjTTL./)0/*21,63.74/72.61-61-80-7/,6.+5-*4,)5-*6.+7/,42&41(52-941?74C<4DIJX7014)/91<36A06653"3+:4(465-,2G13l<:Zf|epF9nB:a^[lorgSUH,.+-/,00.11/21/10.2.-1-,3/.2.-1-,0,+1-,2.-3/.40/41*30+3/,50-;31>71?6-?7,D=5K=4Y<.m9+9*=0B=GCD?F;C1=(<)@1C2C/C2;-6(8+=.@3B=FGYWW@844*24/:14;25,847,;2!23-,037.3H*2uSlpqEA|20_17OOY[JTIBK:)-,*.-+/..0/...---++++)*-+.,*-+),+),,*--+./-00.13/.2.-1-,4/,91/<41>50>5.@85F93N7/\6)s5(:-B5G>H:I7F/?'<(=-?1?.7/7,<+{B.~E1H9OIXXt^`R>F96924+,4+..44!827) 0,)/553465+,k]lkv^k~_pw|ut]kT*.-*.-+/.-/....,,,****()))+))+((*'')((***,++---/0,-/+*/+(2-)80-;4.=31=31@44C84K:3T9.c7*|:,B4G9A2E1F0A+<+=/=/;-;.>0B5C6F7Q@lVkimMeO>I90-&/##6+/7266*.3-1235/4.,/$ei[Ŭcr[.0-/1.11/11/21/0/-0,+/+*,*-+),*(+*(+*(++),-+..,/.*+.*'/,'3/&92(;4,<3.;1/<-*?1.B5/G4-P2(c3)|:.?37,?0C0A/>.>2=0<-e;%o:(8/85?>ZNirv\{\K_F4=,+& 6#%="+3,42+2,&()&&*VcGvԔNj{~lgGVA34.54/76196196194072.61-4013/02./1-.0,-1-.2./3/03/.41,63*:6*?9+?9->5.;2-?*%@.*?2,=0*C+'S,%k4-~;374@8D9~@3<0;1;.|:*<1w<.s>0~B8MDdXrwsjf`KdF8C26+'5)*/2),.2""52+Q_Hyiu]vb|myquuKZG:70;81<92>93>93@93>71>50;55:44822600600600711822:63;81>0A8/=4-J3+H5/B71>3/@.*Q/-j95|A=>AEB}F?z?7}906,7)u6%NWQJoYA^cCohNk]qmzx{{}ihLiM>@55!" )&6.,<#&I06RGM[f^mki[mfroknu}mpJWF:6A@A=>C==GB?KFBK>8K?1F;)F:,C845,-0-&>?1R'1G.2A>5CM2CM*=B"9=/:@@-B9Z>;:=>=E9G5@495K8E6C:G?D=968=?J@GO@of?kpGfSMV5P(IHXP_Zgbnbp^mViQg?LY5)3-N2tXCraeiomxtt|oP]I67/:94>=9B>=D@?GB?HC=LE=B92E=0B;+E=0NG?IB<<8,;:%EL:CG8CD4MB.T>)R8'I5,C54@7.|FDLOB@<-B.F5C;C0=.:1<8=<:<:@;D36B8X?dL\VLTAM?G&C,K5U;`>e?kAoAq\X`iNC`H<}pȿsyoVaP21,43/:65@<;GB?JE?MG;LF8IHDQPLHDC843952=90<6(=8%$96>&L@0Z=5\;4V;4H;2>E@9I55D8I9S9Z8_8LF:NI6OH5\\fyzxxWWsA@R:7>935<34:0&M<2YB:P><=98/85*:-&9#<)<05-,#3%A0=2/(=&?*9).$-#4'5 /0':0H?KI>A219(I+QEQKNSI\GbJkQsW{CrTufvah;8163.4/+61-@91IA4OH5QK3_axĵሉpoTMlA6XI;JH9>A83;=8;JMGUXXSPdI@K5;(0 4(>4@7:541=4D:B;70.+2*6#6-"5'C3K?A84+:)J1G8E?DJDVFbJlPuSyLbSfbqSX⧩EA6@<195,92*>5,F>1OF5TL7[[sʻzaV9Po6<68,4,21/6*8+:)E1P=I:9+7(B0F7C46/1*6.>51*4&7(8026*6-333<29/A5OBNB=26';*L8H7I@?;816/;2<-8%> :<B%>52502642+,&40HFOKD;=.A.:+7(9.KA`[lojsco|bor7O5PN7XS=XS@RK;PF:UI=VH=UE8b[H{җޕŏzipHP8A=F=E;D?D=AC?B6A+B)@+9,4-1-::,-3/@6;)11&22E60#4+E?GAGAD;2'C0D01>)SDrm[devwx[g\bz\YjFXR<[TAYQ>UI9TG7XK;[K9=7<89-9$8"8'6/3111=C,6*4051.82>9;:90.&.(4/5/;1D7G8;.=-1 =)KYL;UH5XI6^M;`O;_N:VFFdP\`NtmgĜkBR.B-<>BKED:=2>9>;B<>3:(8%6*5214.4'408'A/@;0+C?GDC@<8816,D5ZI5.5-3);-=.jbzzD]IY~[hU{^b^zdxlxzƻ[K>ZJ;YH6XG3\L5`P9`O;_N:bU3lT8bG>f]p|{owE1@G;:A8E4=,819<2=KDH412174900$_U{hyEf@PiR2`Mi\qgk|dsovû\J@[I;ZI7\L5]M6\K7ZJ:YI:QH'dO4dLBofypG?SUDB>1;(8'<18:'0B;D9A39.4025,5%/,4+6>RSjJ^7@.),7+H>C;72951/0.B@3//05651+!UJyRhDiHSfQ4zdpkpi}_e}_naOE_M?_N<_P9ZN8UH8UH?YKHdYgn_vjZvoñ[jIR;@515)=-L?>AAF2+,,/12//%LBqQnBeFB^W:j_\kXxP`|YwYiwumaPF`PA_S=_S=ZO=UKA\RQg\b~}nq»šugNSFI@@8592NAXFN91*=4@67-2.=A:9430778:.07*/+)*/.8.B:c{Jj:[Z=-JU5hid{dz]~^sSvX~ewem^^NA[N=]R<\T=YR@ZSMi`eyq~vsq{nš顮wrgjaYV??..=8NCL?1,>5?31')#51EBNHOfai_W:/(&EP\pQj860-63952.;8><*(>+6-()..=4:3q{VqAc>Z<@%5M+yvWh`u[YDbnPiMbHKl7G]6SN8YQ>bRB_N:]QAmhnyyqu[[xxݵ~hmYi`{|hmOOA;/%A6A;5532;3A36A\aVV>@>I6E)54<(527989482:4907,8+<--%)+63F>v9fVn?A]Q;5D'R_Aa\~1e6kKkNcM[xHYtG]wH?>*LF6XNBcWImd]qo|kmdhmqʂКןѡϩ̘rjyd^N~RIdcmoond[?19'50:3<5831/3/<2C443QMHD/01=.>%50=+63798947272703(4%<,;-:252NTWs7jKgi.2GB,%:P`C`oHXv6^9lNkQeM_}I_{HdJ25$??3GB+A-D153Qi>>^^fZ^{VZrv́}مًۋӌ}vocma`KwRBVNgbh`RD;*:(7,9+=,@0>0;-;*@*9&D5:2+,2:6A1>2=055787667698733+9"?+5"=+?EIj;_BSY:@-(D[/yӣoWoSpRkOiMeIdFgGlH-1#470++)553QUXXZohjޖ퀂ρƒϏtqghe^D_hMz[GQGTOIC2(/#8,6*5&;(B/A19+6%7$,"6.7387CCKKHHCF257787778:<<<980>$?,(82Ub?\N]I=-#%FU.x\͑oIa-_{>pHgKcGcEhImJqN<:-A>5:94??5NPESSSdbxwsqm~wzpjafc[D_[.icIUE?6A<>60'4(0&8-6&9&C0E6>29-;-0/55:;54858677:=?>@8<.>&<+,#DDcoCNaV$DCU+uXmkI^39S#dBk>eIcEgHnLuSvUVNAVMDVPDXS?VU9US<_XRlbm{nj_md\ZcZU\RP]TMe]Jd]@ZMQJ4153936*?.0 @77*7&A0E9?8<7?:B+')A!iMsFlPjKlLsRvUqVhZMcWKh_PleIgb:gb#*83 7./=BE,A2dSyQuWqRqOvSrUgNk_Qk_Qk_Ql`Rl`RmaSmaSmaS]ZKnhXf]N]QCNF9DB5KOA?G:bB+cWZX3..F/I3:)>;9)68";3:>+@'@%>(=+;.@7B8D:@7<1:.9.;.6/{9-{A3OCZQ\NqU=NO/,7J.,lPpLiMu[{apXcK\Fk_Qk_Ql`Rl`Rl`RmaSmaSmaSwp`rkYj^NpdV]TE;8);=/>D6FI*J9YYRU2//$=25-91?0D3D8AA@DB=C696:3;0<,;*:*9+8-8-;/=0,gMtSoStWtYmScK_Hk_Ql`Rl`Rl`RmaSmaSmaSnbTh]Kj_Mj]Mzn`pgXPJ.`vHxZuXqTjNeJaH`HjaRjaRjaRkbSkbSlcTlcTlcTk^K|o^pcSg[Oh^RkeW_\M76$uF@LMCHDHVSVNJ@J@@FBE<=469;FEF==*y@5{?5<49393}:1z<1w=1z7.{8/z:.x:-w9,t9)r9(r9(l8*{A6MDVP]VeWchQJgHJVBpVx[jM]B^D`H`GibRibRjcSjcSkdTkdTkdTkdTsdQ|o_eYM\SJ|umoEG175 A4!W<+p:.CA@J)=2EFAB?:7y@-}>-<.;.;.;/|>/x@/v=6v=6v;3u:2u9/s7,s5*q3&a3$wC8QK[U_Uh_PIVB4N57@/=K4-u>9s<5s:3s82r7/q5-o0'l-$W-tD8VOvTJQH94=,'4#"-,2$9F2>P80;+01,34,AQ4tcpY\GVwB`NfSZwIicSicSicSjdTjdTkeUkeUkeUthZg^UrnkӣUZF6D3GQFrnVP=5;0B5C9A4rLCVH;6C1,C1:B7F<:,/$-9%2D,,9(57236/8?6?5x?4t>4v;5}9878h8*f6(e5'f8+h9/g;0d8/`5,mA6mA8[;043!6 =+270?),891*5$-?'2?.BD?4701?(wjQpDEd8Kg>]yQ\vQF^>pbUmdUheTefVfgYhfYle[oe\agMrul͸{|luvnԿmq33?8P>H/HB<7t74o:6sB=o?5l;,i6#a82a60e82o>7m;4f4+i7.sA8zm\cS28,*/(9?;062$+$07/.6+,4)-5*19,4<-7?0?H7HQ@;T7HaCMeCbzX^sT8L3ocUkdTheTefVfgYhfYle[ne\dmR}ҿŽۢMA. <,:4>8GCFEt=:k4/p:0zB5i31j73d5/]2)`<0iL]H3uzfRYG06*,1*5:4/6/'.'-4,,3+*1)*1).6+/7,19,7?2>F75L2AXZoPVhN/A+kdTjdThgUfgWfgYigZle[md[ZdKw|uȷxpDAI@{;2p3.u;7o:6s>8r;4l6,p64k84d90W:,RA-UO7V[=U^?hkVEI804&05.271070180-7.-3/*0,*1*+2++2*)0(-5*4<10B,2_H8`T>MK28? CQ0csO]_J=>,35(9<33816=5;E<3=2286/53.42/51,3,)0)*1)/6./>)8G24C.FSAHSC.8-bgSdgTfgUigXjfZjfZjf[ieZes\nxpпúǶp^JYG3UC/XG3YN:QK5TT:Y]BLS40AB:9<59@8?I>7B49?=7=;6<:7=93:3.5..5-2916E.;J30?,=J9BM?.8-^gRaiTehUjhYmg[lfZieZhdY_nYy~ǾmiNLH+MI,[ZESD4@4 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/write_non_interlaced.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/write_non_interlaced.miff new file mode 100644 index 0000000..2b02b31 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/write_non_interlaced.miff @@ -0,0 +1,18 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=75 +units=PixelsPerInch +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T07:35:58-04:00 +date:modify=2012-06-21T07:35:58-04:00 +jpeg:colorspace=2 +jpeg:sampling-factor=1x1,1x1,1x1 + +:1.'2/(52+83-94.;4.:3-;2-;0*:/)8-'6+%6+%6+%7,&8-'42#53'74-=84E>8HA7JC3JC0JA2VC2pG3H6G:EABG?K8D=@?8?0@.B0@+:">19/9-@,E*D*C2C=FFV8..9)+;18/2B(1@-/0/*-*%./4-'1V75PBf_|`tZLpWMeyryxyiLNA./)0/*21,63.74/72.61-61-80-7/,6.+5-*4,)5-*6.+7/,42&41(52-941?74C<4DIJX7014)/91<36A06653"3+:4(465-,2G13l<:Zf|epB7o>5`]ZouxmSWH,.+-/,00.11/21/10.2.-1-,3/.2.-1-,0,+1-,2.-3/.40/41*30+3/,50-;31>71?6-?7,D=5K=4Y<.m9+9*=0B=GCD?F;C1=(<)@1C2C/C2;-6(8+=.@3B=FGYWW@844*24/:14;25,847,;2!23-,037.3H*2uSlpqGF12b26QPW]EOD1=))-,*.-+/..0/...---++++)*-+.,*-+),+),,*--+./-00.13/.2.-1-,4/,91/<41>50>5.@85F93N7/\6)s5(:-B5G>H:I7F/?'<(=-?1?.7/7,<+{B.~E1H9OIXXt^`R>F96924+,4+..44!827) 0,)/553465+,k]lguZi|_pwyx`oX*.-*.-+/.-/....,,,****()))+))+((*'')((***,++---/0,-/+*/+(2-)80-;4.=31=31@44C84K:3T9.c7*|:,B4G9A2E1F0A+<+=/=/;-;.>0B5C6F7Q@lVkimMeO>I90-&/##6+/7266*.3-1235/4.,/$ei[Ʃhzd.0-/1.11/11/21/0/-0,+/+*,*-+),*(+*(+*(++),-+..,/.*+.*'/,'3/&92(;4,<3.;1/<-*?1.B5/G4-P2(c3)|:.?37,?0C0A/>.>2=0<-e;%o:(8/85?>ZNirv\{\K_F4=,+& 6#%="+3,42+2,&()&&*VcGvٖ̍yub{^5.;2-?*%@.*?2,=0*C+'S,%k4-~;374@8D9~@3<0;1;.|:*<1w<.s>0~B8MDdXrwsjf`KdF8C26+'5)*/2),.2""52+Q_Hyiu]nYzh{pwwQbP:70;81<92>93>93@93>71>50;55:44822600600600711822:63;81>0A8/=4-J3+H5/B71>3/@.*Q/-j95|A=>AEB}F?z?7}906,7)u6%NWQJoYA^cCohNk]qmzx{{}ihLiM>@55!" )&6.,<#&I06RGM[f^mki[e]qlmnvzkoHVG:6A@A=>C==GB?KFBK=:K>5F:*F90C775,/0,)>>2R'1G.2A>5CM2CM*=B"9=/:@@-B9Z>;:=>=E9G5@495K8E6C:G?D=968=?J@GO@of?kpGfSMV5P(IHXP_Zgbnbp^mViQg=9B>=D@?GB?HC=LE=B94E<3B:-E<3NFCIA><8-;:(EL:CG8CD4MB.T>)R8'I5,C54@7.|FDLOB@<-B.F5C;C0=.:1<8=<:<:@;D36B8X?dL\VLTAM?G&C,K5U;`>e?kAoAq[|W^fNB^H;}pνɽsyoX`Q21,43/:65@<;GB?JE?MG;LF8IHFQPNHDE845954=82<6*=8%$96>&L@0Z=5\;4V;4H;2>E@9I55D8I9S9Z8_8LF:NI6OH5\\fyzxxWWsA@R:7>935<34:0&M<2YB:P><=98/85*:-&9#<)<05-,#3%A0=2/(=&?*9).$-#4'5 /0':0H?KI>A219(I+QEQKNSI\GbJkQsW{BpTtfubhĿ;8163.4/+61-@91IA4OH5QK3_axµሉpoTNjA6XI;JH9>A83;=8;JMGUXXSPdI@K5;(0 4(>4@7:541=4D:B;70.+2*6#6-"5'C3K?A84+:)J1G8E?DJDVFbJlPuSyL`RebpSWߩEA6@<195,92*>5,F>1OF5TL7[\qȻzaW9Po6<68,4,21/6*8+:)E1P=I:9+7(B0F7C46/1*6.>51*4&7(8026*6-333<29/A5OBNB=26';*L8H7I@?;816/;2<-8%> :<B%>52502642+,&40HFOKD;=.A.:+7(9.KA`[lojsco}bor6P5PN7XS=XS@RK;PF:UI=VH=UE8b[H{җޕŏzipHP8A=F=E;D?D=AC?B6A+B)@+9,4-1-::,-3/@6;)11&22E60#4+E?GAGAD;2'C0D01>)SDrm[devyz\h]cy[WhDXR<[TAYQ>UI9TG7XK;[K9=7<89-9$8"8'6/3111=C,6*4051.82>9;:90.&.(4/5/;1D7G8;.=-1 =)KYL;UH5XI6^M;`O;_N:VFFdP\`NtmgĜkBR.B-<>BKED:=2>9>;B<>3:(8%6*5214.4'408'A/@;0+C?GDC@<8816,D5ZI5.5-3);-=.jbzyD]HX}ZgTz]a]zdxlwy˼[K>ZJ;YH6XG3\L5`P9`O;_N:bU3lT8bG>f]p|{owE1@G;:A8E4=,819<2=KDH412174900$_U{gxCd?OiR2`Mi\rhl}fsns\J@[I;ZI7\L5]M6\K7ZJ:YI:QH'dO4dLBofypG?SUDB>1;(8'<18:'0B;D9A39.4025,5%/,4+6>RSjJ^7@.),7+H>C;72951/0.B@3//05651+!UJyPfChGReP3zdqlrkae{]kaOE_M?_N<_P9ZN8UH8UH?YKHdYgn_vjZvoñ[jIR;@515)=-L?>AAF2+,,/12//%LBqPmBeFB^W:k`]mZzR_yXwXiy{qaPF`PA_S=_S=ZO=UKA\RQg\b~}nq»šugNSFI@@8592NAXFN91*=4@67-2.=A:9430778:.07*/+)*/.8.B:c{Jj:[[>.JU5ije|e{^}]qQuWf|gtb^NA[N=]R<\T=YR@ZSMi`eyq~vsq{nš顮wrgjaYV??..=8NCL?1,>5?31')#51EBNHOfai_W:/(&EP\pQj860-63952.;8><*(>+6-()..=4:3q{VqBd@\=A&6N,zwXiav\ZEamOiMcHMk7HZ4SN8YQ>bRB_N:]QAmhnyyqu[[xxݵ~hmYi`{|hmOOA;/%A6A;5532;3A36A\aVV>@>I6E)54<(527989482:4907,8+<--%)+63F>v9fVn?A]Q;5D'R_Aa\~1e6lKlOcMZwIXsJ^wO?>*LF6XNBcWImd]qo|kmdhmqʂКןѡϩ̘rjyd^N~RIdcmoond[?19'50:3<5831/3/<2C443QMHD/01=.>%50=+63798947272703(4%<,;-:252NTWs7jKgi.2GB,%:P`C`oHXv6^9mMkOeM_}K_{KeP25$??3GB+A-D153Qi>>^^fZ^{VZrv́}مًۋӌ}vocma`KwRBVNgbh`RD;*:(7,9+=,@0>0;-;*@*9&D5:2+,2:6A1>2=055787667698733+9"?+5"=+?EIj;_BSY:@-(D[/yӣoWoSpRjNhLfJeGgGkI-1#470++)553QUXXZohjޖ퀂ρƒϏtqghe^D_hMz[GQGTOIC2(/#8,6*5&;(B/A19+6%7$,"6.7387CCKKHHCF257787778:<<<980>$?,(82Ub?\N]I=-#%FU.x\͑oIa-_{>pHfJcGdFhGmJpK<:-A>5:94??5NPESSSdbxwsqm~wzpjafc[D_[.icIUE?6A<>60'4(0&8-6&9&C0E6>29-;-0/55:;54858677:=?>@8<.>&<+,#DDcoCNaV$DCU+uXmkI^39S#dBk>dJcGgHnLuPuQVNAVMDVPDXS?VU9US<_XRlbm{nj_md\ZcZU\RP]TMe]Jd]@ZMQJ4153936*?.0 @77*7&A0E9?8<7?:B+')A!iMsFlPjLlLsPvRqPhZMcWKh_PleIgb:gb#*83 7./=BE,A2dSyQvZqRqOuQrQhJk_Qk_Qk_Ql`Rl`RmaSmaSmaS]ZKnhXf]N]QCNF9DB5KOA?G:bB+cWZX3..F/I3:)>;9)68";3:>+@'@%>(=+;.@7B8D:@7<1:.9.;.6/{9-{A3OCZQ\NqU=NO/,7J.,lPpLiMu[{aqYdL\Fk_Qk_Ql`Rl`Rl`RmaSmaSmaSwp`rkYj^NpdV]TE;8);=/>D6FI*J9YYRU2//$=25-91?0D3D8AA@DB=C696:3;0<,;*:*9+8-8-;/=0,gMtSoStWuZnTcK_Hk_Ql`Rl`Rl`RmaSmaSmaSnbTh]Kj_Mj]Mzn`pgXPJ.`vHxZuXqTjNfKbI`HjaRjaRjaRkbSkbSlcTlcTlcTk^K|o^pcSg[Oh^RkeW_\M76$uF@LMCHDHVSVNJ@J@@FBE<=469;FEF==*y@5{?5<49393}:1z<1w=1z7.{8/z:.x:-w9,t9)r9(r9(l8*{A6MDVP]VeWchQJgHJVBpVy\jM]B^D`HaHibRibRjcSjcSkdTkdTkdTkdTsdQ|o_eYM\SJ|umoEG175 A4!W<+p:.CA@J)=2EFAB?:7y@-}>-<.;.;.;/|>/x@/v=6v=6v;3u:2u9/s7,s5*q3&a3$wC8QK[U_Uh_PIVB4N57@/=K4-u>9s<5s:3s82r7/q5-o0'l-$W-tD8VOvTJQH94=,'4#"-,2$9F2>P80;+01,34,AQ4tcqZ]HUvA`NfS\yKicSicSicSjdTjdTkeUkeUkeUthZg^UrnkӣUZF6D3GQFrnVP=5;0B5C9A4rLCVH;6C1,C1:B7F<:,/$-9%2D,,9(57236/8?6?5x?4t>4v;5}9878h8*f6(e5'f8+h9/g;0d8/`5,mA6mA8[;043!6 =+270?),891*5$-?'2?.BD?4701?(wjSrFFe9Kg>\xP\vQIaApbUmdUheTefVfgYhfYle[oe\_eKy|s˶}~nxyqнmn43@7P=E.K@>5t72o:6uD?q@9m;0i5'`;3_81e:3n?7m;4g2*j5-t?7}pX_O17+,1*6<8173(/(-4,08--5*-5(19,3;,6?.>G6GP?7U3Fa@IdC^wYZsU6M0ocUkdTheTefVfgYhfYle[ne\clQҿļ؟L>-;-<3>8GCGFu>;l50q;1zA6g41j73e60]2)`<0iLU`@knYAE404&27005/1815<4*4+-3/*0,)/+*1**1))0(.6+5=2.B):N5+gfTgfThgUhfWigZjfZle[le[XdLhogⱴg^vJA`5,g?5`8.rJ>qJ;hA2lA8a=1`F7`T>LL26? BQ0`tO`bM9:(35(;>516/7>6?I@0:/288/55.42.42,2.)/++2+181);#5D/3B-FSAHUD.9+bgSdgTfgUigXjfZjfZjf[ieZft]mwoп¹ȷo]IXF2UC/[J6XM9QK5TT:Y]BJS4,<=/DE=7:3:A9BLA4?1:?B7==6<<6<:397.40/513955D-;J33@,@Ma\>\Q5e`LNI6HF9GG=;>59A60?EE=CC5 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/write_plane_interlaced.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/write_plane_interlaced.miff new file mode 100644 index 0000000..2b02b31 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jpeg/write_plane_interlaced.miff @@ -0,0 +1,18 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=75 +units=PixelsPerInch +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T07:35:58-04:00 +date:modify=2012-06-21T07:35:58-04:00 +jpeg:colorspace=2 +jpeg:sampling-factor=1x1,1x1,1x1 + +:1.'2/(52+83-94.;4.:3-;2-;0*:/)8-'6+%6+%6+%7,&8-'42#53'74-=84E>8HA7JC3JC0JA2VC2pG3H6G:EABG?K8D=@?8?0@.B0@+:">19/9-@,E*D*C2C=FFV8..9)+;18/2B(1@-/0/*-*%./4-'1V75PBf_|`tZLpWMeyryxyiLNA./)0/*21,63.74/72.61-61-80-7/,6.+5-*4,)5-*6.+7/,42&41(52-941?74C<4DIJX7014)/91<36A06653"3+:4(465-,2G13l<:Zf|epB7o>5`]ZouxmSWH,.+-/,00.11/21/10.2.-1-,3/.2.-1-,0,+1-,2.-3/.40/41*30+3/,50-;31>71?6-?7,D=5K=4Y<.m9+9*=0B=GCD?F;C1=(<)@1C2C/C2;-6(8+=.@3B=FGYWW@844*24/:14;25,847,;2!23-,037.3H*2uSlpqGF12b26QPW]EOD1=))-,*.-+/..0/...---++++)*-+.,*-+),+),,*--+./-00.13/.2.-1-,4/,91/<41>50>5.@85F93N7/\6)s5(:-B5G>H:I7F/?'<(=-?1?.7/7,<+{B.~E1H9OIXXt^`R>F96924+,4+..44!827) 0,)/553465+,k]lguZi|_pwyx`oX*.-*.-+/.-/....,,,****()))+))+((*'')((***,++---/0,-/+*/+(2-)80-;4.=31=31@44C84K:3T9.c7*|:,B4G9A2E1F0A+<+=/=/;-;.>0B5C6F7Q@lVkimMeO>I90-&/##6+/7266*.3-1235/4.,/$ei[Ʃhzd.0-/1.11/11/21/0/-0,+/+*,*-+),*(+*(+*(++),-+..,/.*+.*'/,'3/&92(;4,<3.;1/<-*?1.B5/G4-P2(c3)|:.?37,?0C0A/>.>2=0<-e;%o:(8/85?>ZNirv\{\K_F4=,+& 6#%="+3,42+2,&()&&*VcGvٖ̍yub{^5.;2-?*%@.*?2,=0*C+'S,%k4-~;374@8D9~@3<0;1;.|:*<1w<.s>0~B8MDdXrwsjf`KdF8C26+'5)*/2),.2""52+Q_Hyiu]nYzh{pwwQbP:70;81<92>93>93@93>71>50;55:44822600600600711822:63;81>0A8/=4-J3+H5/B71>3/@.*Q/-j95|A=>AEB}F?z?7}906,7)u6%NWQJoYA^cCohNk]qmzx{{}ihLiM>@55!" )&6.,<#&I06RGM[f^mki[e]qlmnvzkoHVG:6A@A=>C==GB?KFBK=:K>5F:*F90C775,/0,)>>2R'1G.2A>5CM2CM*=B"9=/:@@-B9Z>;:=>=E9G5@495K8E6C:G?D=968=?J@GO@of?kpGfSMV5P(IHXP_Zgbnbp^mViQg=9B>=D@?GB?HC=LE=B94E<3B:-E<3NFCIA><8-;:(EL:CG8CD4MB.T>)R8'I5,C54@7.|FDLOB@<-B.F5C;C0=.:1<8=<:<:@;D36B8X?dL\VLTAM?G&C,K5U;`>e?kAoAq[|W^fNB^H;}pνɽsyoX`Q21,43/:65@<;GB?JE?MG;LF8IHFQPNHDE845954=82<6*=8%$96>&L@0Z=5\;4V;4H;2>E@9I55D8I9S9Z8_8LF:NI6OH5\\fyzxxWWsA@R:7>935<34:0&M<2YB:P><=98/85*:-&9#<)<05-,#3%A0=2/(=&?*9).$-#4'5 /0':0H?KI>A219(I+QEQKNSI\GbJkQsW{BpTtfubhĿ;8163.4/+61-@91IA4OH5QK3_axµሉpoTNjA6XI;JH9>A83;=8;JMGUXXSPdI@K5;(0 4(>4@7:541=4D:B;70.+2*6#6-"5'C3K?A84+:)J1G8E?DJDVFbJlPuSyL`RebpSWߩEA6@<195,92*>5,F>1OF5TL7[\qȻzaW9Po6<68,4,21/6*8+:)E1P=I:9+7(B0F7C46/1*6.>51*4&7(8026*6-333<29/A5OBNB=26';*L8H7I@?;816/;2<-8%> :<B%>52502642+,&40HFOKD;=.A.:+7(9.KA`[lojsco}bor6P5PN7XS=XS@RK;PF:UI=VH=UE8b[H{җޕŏzipHP8A=F=E;D?D=AC?B6A+B)@+9,4-1-::,-3/@6;)11&22E60#4+E?GAGAD;2'C0D01>)SDrm[devyz\h]cy[WhDXR<[TAYQ>UI9TG7XK;[K9=7<89-9$8"8'6/3111=C,6*4051.82>9;:90.&.(4/5/;1D7G8;.=-1 =)KYL;UH5XI6^M;`O;_N:VFFdP\`NtmgĜkBR.B-<>BKED:=2>9>;B<>3:(8%6*5214.4'408'A/@;0+C?GDC@<8816,D5ZI5.5-3);-=.jbzyD]HX}ZgTz]a]zdxlwy˼[K>ZJ;YH6XG3\L5`P9`O;_N:bU3lT8bG>f]p|{owE1@G;:A8E4=,819<2=KDH412174900$_U{gxCd?OiR2`Mi\rhl}fsns\J@[I;ZI7\L5]M6\K7ZJ:YI:QH'dO4dLBofypG?SUDB>1;(8'<18:'0B;D9A39.4025,5%/,4+6>RSjJ^7@.),7+H>C;72951/0.B@3//05651+!UJyPfChGReP3zdqlrkae{]kaOE_M?_N<_P9ZN8UH8UH?YKHdYgn_vjZvoñ[jIR;@515)=-L?>AAF2+,,/12//%LBqPmBeFB^W:k`]mZzR_yXwXiy{qaPF`PA_S=_S=ZO=UKA\RQg\b~}nq»šugNSFI@@8592NAXFN91*=4@67-2.=A:9430778:.07*/+)*/.8.B:c{Jj:[[>.JU5ije|e{^}]qQuWf|gtb^NA[N=]R<\T=YR@ZSMi`eyq~vsq{nš顮wrgjaYV??..=8NCL?1,>5?31')#51EBNHOfai_W:/(&EP\pQj860-63952.;8><*(>+6-()..=4:3q{VqBd@\=A&6N,zwXiav\ZEamOiMcHMk7HZ4SN8YQ>bRB_N:]QAmhnyyqu[[xxݵ~hmYi`{|hmOOA;/%A6A;5532;3A36A\aVV>@>I6E)54<(527989482:4907,8+<--%)+63F>v9fVn?A]Q;5D'R_Aa\~1e6lKlOcMZwIXsJ^wO?>*LF6XNBcWImd]qo|kmdhmqʂКןѡϩ̘rjyd^N~RIdcmoond[?19'50:3<5831/3/<2C443QMHD/01=.>%50=+63798947272703(4%<,;-:252NTWs7jKgi.2GB,%:P`C`oHXv6^9mMkOeM_}K_{KeP25$??3GB+A-D153Qi>>^^fZ^{VZrv́}مًۋӌ}vocma`KwRBVNgbh`RD;*:(7,9+=,@0>0;-;*@*9&D5:2+,2:6A1>2=055787667698733+9"?+5"=+?EIj;_BSY:@-(D[/yӣoWoSpRjNhLfJeGgGkI-1#470++)553QUXXZohjޖ퀂ρƒϏtqghe^D_hMz[GQGTOIC2(/#8,6*5&;(B/A19+6%7$,"6.7387CCKKHHCF257787778:<<<980>$?,(82Ub?\N]I=-#%FU.x\͑oIa-_{>pHfJcGdFhGmJpK<:-A>5:94??5NPESSSdbxwsqm~wzpjafc[D_[.icIUE?6A<>60'4(0&8-6&9&C0E6>29-;-0/55:;54858677:=?>@8<.>&<+,#DDcoCNaV$DCU+uXmkI^39S#dBk>dJcGgHnLuPuQVNAVMDVPDXS?VU9US<_XRlbm{nj_md\ZcZU\RP]TMe]Jd]@ZMQJ4153936*?.0 @77*7&A0E9?8<7?:B+')A!iMsFlPjLlLsPvRqPhZMcWKh_PleIgb:gb#*83 7./=BE,A2dSyQvZqRqOuQrQhJk_Qk_Qk_Ql`Rl`RmaSmaSmaS]ZKnhXf]N]QCNF9DB5KOA?G:bB+cWZX3..F/I3:)>;9)68";3:>+@'@%>(=+;.@7B8D:@7<1:.9.;.6/{9-{A3OCZQ\NqU=NO/,7J.,lPpLiMu[{aqYdL\Fk_Qk_Ql`Rl`Rl`RmaSmaSmaSwp`rkYj^NpdV]TE;8);=/>D6FI*J9YYRU2//$=25-91?0D3D8AA@DB=C696:3;0<,;*:*9+8-8-;/=0,gMtSoStWuZnTcK_Hk_Ql`Rl`Rl`RmaSmaSmaSnbTh]Kj_Mj]Mzn`pgXPJ.`vHxZuXqTjNfKbI`HjaRjaRjaRkbSkbSlcTlcTlcTk^K|o^pcSg[Oh^RkeW_\M76$uF@LMCHDHVSVNJ@J@@FBE<=469;FEF==*y@5{?5<49393}:1z<1w=1z7.{8/z:.x:-w9,t9)r9(r9(l8*{A6MDVP]VeWchQJgHJVBpVy\jM]B^D`HaHibRibRjcSjcSkdTkdTkdTkdTsdQ|o_eYM\SJ|umoEG175 A4!W<+p:.CA@J)=2EFAB?:7y@-}>-<.;.;.;/|>/x@/v=6v=6v;3u:2u9/s7,s5*q3&a3$wC8QK[U_Uh_PIVB4N57@/=K4-u>9s<5s:3s82r7/q5-o0'l-$W-tD8VOvTJQH94=,'4#"-,2$9F2>P80;+01,34,AQ4tcqZ]HUvA`NfS\yKicSicSicSjdTjdTkeUkeUkeUthZg^UrnkӣUZF6D3GQFrnVP=5;0B5C9A4rLCVH;6C1,C1:B7F<:,/$-9%2D,,9(57236/8?6?5x?4t>4v;5}9878h8*f6(e5'f8+h9/g;0d8/`5,mA6mA8[;043!6 =+270?),891*5$-?'2?.BD?4701?(wjSrFFe9Kg>\xP\vQIaApbUmdUheTefVfgYhfYle[oe\_eKy|s˶}~nxyqнmn43@7P=E.K@>5t72o:6uD?q@9m;0i5'`;3_81e:3n?7m;4g2*j5-t?7}pX_O17+,1*6<8173(/(-4,08--5*-5(19,3;,6?.>G6GP?7U3Fa@IdC^wYZsU6M0ocUkdTheTefVfgYhfYle[ne\clQҿļ؟L>-;-<3>8GCGFu>;l50q;1zA6g41j73e60]2)`<0iLU`@knYAE404&27005/1815<4*4+-3/*0,)/+*1**1))0(.6+5=2.B):N5+gfTgfThgUhfWigZjfZle[le[XdLhogⱴg^vJA`5,g?5`8.rJ>qJ;hA2lA8a=1`F7`T>LL26? BQ0`tO`bM9:(35(;>516/7>6?I@0:/288/55.42.42,2.)/++2+181);#5D/3B-FSAHUD.9+bgSdgTfgUigXjfZjfZjf[ieZft]mwoп¹ȷo]IXF2UC/[J6XM9QK5TT:Y]BJS4,<=/DE=7:3:A9BLA4?1:?B7==6<<6<:397.40/513955D-;J33@,@Ma\>\Q5e`LNI6HF9GG=;>59A60?EE=CC5 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_j2k.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_j2k.miff new file mode 100644 index 0000000000000000000000000000000000000000..e8d47b3a8629fc8a9ba1be69a368ad2e4f77c437 GIT binary patch literal 12962 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 Lakd0KVL<-}wEwyU literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_jp2.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_jp2.miff new file mode 100644 index 0000000000000000000000000000000000000000..e8d47b3a8629fc8a9ba1be69a368ad2e4f77c437 GIT binary patch literal 12962 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 Lakd0KVL<-}wEwyU literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_jpc.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_jpc.miff new file mode 100644 index 0000000000000000000000000000000000000000..e8d47b3a8629fc8a9ba1be69a368ad2e4f77c437 GIT binary patch literal 12962 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 Lakd0KVL<-}wEwyU literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/gradient.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/gradient.miff new file mode 100644 index 0000000000000000000000000000000000000000..69718adc93e477082735f59cdc7fc599e9f93d3b GIT binary patch literal 19712 zcmeI)KS/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.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_bmp24.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_bmp24.miff new file mode 100644 index 0000000..54b1432 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_bmp24.miff @@ -0,0 +1,16 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +units=PixelsPerCentimeter +resolution=29.25x29.25 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2009-09-05T17:47:34-04:00 + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]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 JVxyP-{{f9QfN1~# literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_dcx.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_dcx.miff new file mode 100644 index 0000000..f352648 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_dcx.miff @@ -0,0 +1,16 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=16 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +units=PixelsPerInch +resolution=70x46 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2009-09-05T17:47:34-04:00 + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTEKMMK6 + + + + + + + + + + + + +32!0;JXPGI< &/9@>D?2 + +  + +  $+&%'%'($0D: .MQRSQNNMGE9# 334:ERD, +  + +  N4 1'+.$-9IA$ +5L<9*%)0:A:64>SLF<20,6B?A7-3F3058624>GQB2+('(@]TZed[7!߸ 4@I:, ?SHLA,574..09BLQNJNJ75CE:.3AA95>-$%#1_ghj]TSDgg}¡)BFB-4FRH0$5?9,13;H@EIKNHIFQI?I;?910D467.)Wtol[S816+5H]bZx}5W^SE:L?)#8GJA/5BGINJHOW`I8+7I>4/%&4%+7==K:9GMMOIEPdQ5!'0@42)/C@ONH27}q`W;3%243>@C>HWPA>=A>=3?@9N@<@JMFC<7QWd_LJS]W?C>:BED:@INK<,l^W6 ,<8NMHFH@#?Ukr2-2954:3234838NQNOPI=@FI@9;;:9<^VWe8,9<64..2 + !@OGEEJH31S`A33:82/A6325;=HNFDLI@=BIMA65510KXV( k9,>;22118 ,W[CENG5!#KH<<8?2.2?0145:DJEKRH@?AEHH>/--(*\U; EW*:30675@ !@P:38- $):@@:5;,):8:,#0<=<=EHC2+.;GDCCCEE6%@6+%&e@  ,<8:9BMC,=8,6<99:.'/8DDGH:&$*5%,&'2O + + .B?>>JJ2 5L308888-,=K:,+""#$*9HHB6)%')$  + .C@AIN20  (PO7379:8*.AJ;##,1+!!"'*1'! + + /C@EN510! ! !! !! 1B`E:<@CGFIJE7" "'&& + 'CBL:-5.  !!!! $*7:;88?BDDDD8!"%&$! + + +>I@+/4* ! !! )Zn1 + (<=ABB@==>)&'$  + + +3  + + +  D."'- !!! o'M-*88;, + 7$,!!!!!!!"!&a).?(36(-%  #' !!!!! !"!6ڠnj&., 4  + + $! !!!!!!!#"+ɪ;" *  + !!!!!"##+享9 ' +  +  "!!!"#"*埆泈 !  + #""#""#<ְ"   \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gif.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gif.miff new file mode 100644 index 0000000000000000000000000000000000000000..2709c678585b6956b0bea39e093a193de322a1eb GIT binary patch literal 4394 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gif87.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gif87.miff new file mode 100644 index 0000000000000000000000000000000000000000..7bf3e994839e612673e6bbe86fcdf5182d149151 GIT binary patch literal 4394 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray.miff new file mode 100644 index 0000000..0b10088 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray.miff @@ -0,0 +1,12 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=Gray +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +gamma=1 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2009-09-05T17:47:34-04:00 + +:/0234323221/.//-.146:?BBCEP[bjrvtrla_^[WUTTTVXae\?63320./..>YutNPvyV./122102220..00/01358>@?ADMTYhqtutk_^]ZWTSSRTWcj\964220//0,7PjpFF^lW,,..-.-------../1025477:=CGIM]jqsqb[\ZXTSRQPSZfkd<54321111/.4VxG96CNX,,--++**+++,--.-...03567;@ABIS\grr^XXWURPPPOU_g}_A4//../00.-ds]k`...-+*)'***)(+-,-+,-354369;;DRVYbhZUTTRPNMMQY\ozU=/)--,-.-*i]/.000/.++))))*,-++.0463235635FRUSYVTRSRMLJMX\emV:*))*+-,'^T2236632/0-*++./0/037::63465218FOOPTTQOOLIHPY^lx\8&'***'%X}P778:=<:88621223478:>@?:8899868BRYURRMLLGnrSXcw}`:+(,,0MjuyR89=??AA@@><;;8547<:769=ACA>;;9T}`Td[_dWaiomnm`goktq{nnquzz|FBvϰr_247;BEGHDIA<:9989=BB?<:9=cWS\XS\__dbghigcau~zo[itw{y||tω{/.27=CJHW}YB5118q~~Z\\[\^_^^\YLGNX]orc_dgedfaO\^ejkmmeXW\jonmmmlhXSPJLjfjxZ,657=sv_```_cb`aaaYHACFMswb^deed_NQ]itj]^WXZY[hpqqi[SOOLETeijeE-;J97;swu```aabbbbbbbUC?<>i{ebfhii_dsxnYYTONQRRX_c^TPOMLHF\`gkwlMdL76/H~Z\[fqMdddddddfdlnuZfl`UQOLJHGEEDBCEFHMtj.4332111/29:FPLZUek=dddddceed~ϯ__`VROMLLHFGEEEINOO|T-3431/0/.0/3888CbW0cdeeedeggqTA@FKIIJJJ\C<=;93.-+.ACAD5`cgffffegeIMMKKIGL^`SRPH@<<>==>?A@<9=SUDIR; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_lsb_08bit_mat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_lsb_08bit_mat.miff new file mode 100644 index 0000000000000000000000000000000000000000..b71fd7802fc1b229729bdc0bf08ddcbf13c82c67 GIT binary patch literal 4298 zcmYjT1$+}v7Yq)?-66OZ(o%s!aCdhLZ778rO^ds`yB6(&|&n;uRcjb2zMx9rn18sA_yS zn}egmqhcIZU;hBJIl>kjYq!?4g*)tCn2(EybXff`9~0HvVGZ;#n?vl;vE8g?xrn4_ zTd>_)E5_Cr-x1Ll`>_@RH;&>PMtbUnlx$CrcIYFUHbItGi1n+F=NI|nKEV0oHKi4rABmMrP*?Om!=snVrOTPzkIA0J;|-!f&&`1$$y`}+q31Ox^KmMvSh zT)A>VK|$rqm#Cu3V)`m8w;%R;yO6diClxYSgG%vu3SYwQAR{ zU8hc+x^?T;t5>gn{rU|WG-%kcVWUQk8aHm-q)C&eO`A4r)~tE+<}F&ZXxXx5t5&UA zw{G30O`EoD+qP@hu6_IV9XfRA*s)`$PMtb;?rgK!x^(Fh92^`H5@NU8yLRmw8XDTI zTeq;Vu_C7A#!2aM7Ygix)4}G;PU}B}V{$t}R=(Y~8wb+qP}nw{PFE zW5>>&J9q8cwR`t&x7)pE&z`+|_wL)bZ~y-N2M!!Kc<|t%Lx(&b&*8&|j~qF2^ytxJ z$BrF8e*DCV6DLoeJay{S>C>mroH=v$?AdeY&YeGh{=$U|7cXACbm`LN%a^ZQxpMXD z)oa(TUB7<)#*G^{Z{ECh>(=etx9{A!bNBAud-v|$zkmP1g9i^EK791((c{ODpFDZ; z^y$-Q&z?Ph{`|#@7cXDFeD&(p>({T}ym|BX?b~(}q!zyJLC^Y`!HfB*iOTu!&i?Q&t{qnV)3Z*8V-}GVf=fd%k+4Vr6-Y3|xZIk_ zBf*$3%5%h=8x&nkVl|=aHc4p@=@4B;R$_vVC{?&7REWURio2kRIDoPgPQxoeL$YdZI?l>V*V>VC(m7OCUQi=B*-<*dg6-Wxg zpB(Wnt|$W}3Bevb(4`io8M;6tSi}kq1X7Pn7s<`#0mt~}h**68SELg{GzRG&8(pJl z?jPAJ(irk~D&ADD8NA7lO(F=z2^D>7Xu3^8i9rm;oZ6Wbsw|X4;v{eS3$e;~h05me zaFDlCy2%(K8|5fWd{-w(^hhP6qvTCwOp>?I;y05pY6cKSRS8N(plm87ki7Y5pvks- z2q2=#O(wBO?i7lLT;141#wKG&Q3;bop%9=GNm&LE*#e{q-b4l{KKP<@hEO>Kphu^8 z5M-V60L6X60F*?g2%|HoInw&eEt1;XE92b*uf21tc)QXbS8?0O@f}r=_T1 zGG3sFQ58W?X`t8W2bJPKDXF@p+b0_h^svU$FSZJA{KvBKRYairCbFV}L}?mO=mxhZ z7v=K7c2FA$RVkJgq$fb-eW&j*B?xouo*`Jaw9r9@hL+1;0^Jc_^hWpSJr9Sth3c|d zgq!R}ib84bI-!MNLz5b*oZL`e=gn)*IBrDMWSsyEpw|o*Hz*X22v36GF1rNm>`NShIB|p4v6@yf|&nq7*%VsLFgHZ)Cgn_7p1^FSs01-=(bV>Z?-Y|GG zKp}~Jdb5-nWTAV@Dx~8iH6Af)iRY{6f)ZX>jw3y1vUCnrXaMNQ36ewxpQV| z8aYca!SDb?zrUqRLPOc4I%^mpM@$&75=yWU1`_|8;m57m$>u0z{se(j62xF}1&bn( P+ko$Q=s%N)?sEMPr`>jN literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_lsb_double_mat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_lsb_double_mat.miff new file mode 100644 index 0000000000000000000000000000000000000000..f4f61acde4dc5200ec9c48cc05de510e661e4559 GIT binary patch literal 26391 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 I*aOD@2N);3HUIzs literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_ico.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_ico.miff new file mode 100644 index 0000000000000000000000000000000000000000..43f4ae49959a416ca9967aa6bf8f5c4f82d2ba34 GIT binary patch literal 4487 zcmd^9OOM(x5at~97xa|-7L*5%Zlqk=N>vZ7s)|354K5p%Bs2-#-P`_iI%9jBiGctM z+e;I|*yHi{7zeUN{3TD8;%lwSo)kZjw-Q-0bhk@%><%1e5#JahU-{T@|StqH8>mQ##z&u}9qLwV*%0jsA z?@hAGny1)vAP-Ot3YZ0tv%pz{G=O~!gB$M#*NcUyvSK;RibfPo{9RNj@Bo0bO!7R5 zz0r7rHnh8W3V=t`@jGu6hOWD;gecfT2zfAbx7rAn^(T<_rq08C)MwqXz~{?tz&dO|Ka@)yT8fdoafzxpw>n48P&AGsLTXnmWw0n{!KjYTt1M8b|H{ zyiQaY>Nn2Tv^V1ybzH!Y8qNO*4CJ3Z&ygnSSJkRL*YR)oZSD>)a<$xY53OJ5U1Aw- z-e>aH_6KY6qLrP#OHEy!YDdpE=WdaWU-V6v;ln!H_eI>TN9r@@MSkP?n%oLldL@r` zG(JheHGE4ynhE=Flj`-Oo?p^)gT04Tr;KNbf8eYc_u(^Z&z0CDw$?y7JD%*@J`0B1 z^`Lc7J*(^G?t9k=%Z`X`=j?eOKd(K+&uh*d_i$q`I=#P?UvssX>Ku^g(ACzm(LRsI zv;hJCUC}#wh?nO(=eOGtiL3CKMpLJFIXA~Xb=*Nl|MK3&CSN?B%5kiYW77E8o|D)A E0tQe*FaQ7m literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_im1.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_im1.miff new file mode 100644 index 0000000000000000000000000000000000000000..26f38444f00ceccc2ede7015d23f8272043ca338 GIT binary patch literal 3617 zcmbVM+iuf95N%&AzJMpcmqd~SyGGG4z^3%uP-w@d-mcure)oD zX3or>b9SS&*kxbJe6POd`(pbmj{m5pE$S+pO_OMQ$lEr%Y1RF%{>XV8Z|g(dv{@R* zW!`lv`;;GA6%l%0R&BOU;<%|F+HA3kn%s>^Ovvn3rOi1v9| z=21?NwU}^iAFX-7f=+6#}H$n$+5|WC~ah`#0 zNP>e647!%M@oUj`RB$**a}K0UmyUv`xDJtlz0eX@ekH>|2DXktvdvAHT2%bABZm%0 z#`=$sIogqIM2aqkyLw@a3xIv?!CI4Ghqqa?4!$sKC7Hr3Lm*1H6aUPE9^{sUg1&C6 zO2f7S+K)U8CptPS0*@%3d^_H(JCN96C;DUEolh(cyf}llHKrZ*d=le@0w{eKjP(~> zYZg8MJ9yzY68Z?LKt^=?>O-iATX}JU!<@StJ03W2(_?j`)~PT~x!`$IR^O9AKK&k%QC%(&YEQ z7h5(?c-V2iJPUVONoz~fTG*<2sutrZgTGwAKk589(N|?~F2ub%aqMCg>c9~h4|C(e zu?rw$&LH|gQ0qCU8EZXnAi@gehyB;UKgjTb6N#Y23~GwZK?|AJIiH$41e=cRKt7sIdZ7!m&ATt2(j{y0KD}Iq z9p|l}BYOIMLV_Mk@gosC5v5}*<0TB}jz{QG>88--EE==22HH??11II>>..KK@@//MMDD33iiEE44@@..<<--GG<>..==,,==**;;**>>-->>33@@44DD88HH;;DD77,,9955559933116622//6622..1111----11..0000..55//..22**,,EE2211xxAA55YY\\}}ccllJJ>>kkKK@@\\]]^^gg~~llpp__YYWWSS,,,,,,,,--++00//,,11..++22,,((22--**00,,++22,,++22++++22,,++22,,++11,,++11,,))33--,,33--,,33//,,3311,,4400,,5522--775500::33,,>>66--@@66--CC88--HH;;//EEEE55UUDD44mm==++99((EE44HH==EE@@<<>>>>==AA00@@**??-->>--??,,>>))>>,,==--<<--;;..??//BB11@@88GGDDWWNN<>FFFFIISSIIYYZZOO,,--//++--//..----//--))//**''--++((,,****,,****..++++..++++..++++//++++//----00,,,,00--..//--**22..,,22..++22--,,3300..8822//<<44//>>44//AA55--FF9911HH>>77QQ<<55__7700yy77--;;//AA33EE99EE@@HHAABB//@@,,>>--==//==--==++<<++<<,,<<..<<22CC77GG::EE@@gg__yyWWeeWWCCBB887755++//11**..11++--00,,--00////00..0022..//22..//--2244**,,ggccbb~~iippYY\\oo``pprr||__eeQQ,,//22++//22....00--..----++)),,**++++))++((''((****++,,**++,,**++**))))**(())--++,,..--..//,,++00,,++..**))//++++00----881111<<3322;;2211>>00..AA22//AA7733BB::66KK6622hh77//==00>>55AA33DD77GG<>UURR{{rrppSSZZGG<<@@330011((--))''22,,++22,,++00,,**00--++00//++22**1100))((eeqqRRʳǰYYddJJ..00..////--//11..2211..3300--33//,,22--**--**++,,++,,**))--++((,,--'',,++(()),,**))----++//--,,..++**//++))44,,))66//**;;33..==4400;;11--;;//..>>//..>>33,,5599//9933,,OO,,''ii::--AA11@@11;;--BB22>>22<>--::++;;**vv>>))vv88,,ss99--{{@@44GG>>NNEEddVVzzqq{{vv||eeggddeePPffPP44==00**&&##..$$&&++****))++,,''++//''''--))$$""WW\\HH~~jj{{jj~~oooo}}tt~~{{oollLLVVDD778822778822999944<<::55@@==88BB::88AA9955==7733<<7755::554499000099////6611..6622..6633..664411997733??7722BB9900HH==11JJ>>44HH==44BB8800@@6611??6622<<9944CC5544AA5500<<66**EE55''cc66--==;;BBAACC;;>>66AA55~~:://yy;;//uu>>..zz44))PPLL[[VVppJJ99kkSS@@ss``IIzzXXff``zzrr~~vvxxooooXXiiMM??;;))33))""%%++!!++//&&::&&**CC))))TTNN::hhqqRRhhWWkk\\nncckkhhsstttttthhddNNXXCC88993399::44>>>>88AA??::DD??::FFAA<>BBCCEEvvCC99yy::44<>33((GG@@--ee^^::ww\\nn\\mmYYssdd~~{{dd}}__SS__GG667711668811====88BB@@;;FFAA??HHCC>>HHCC>>JJDD<>99,,EE<>11KK;;11DD:://>>==1177==00BB@@KK]]3355;;##??55;;00>>33DD77::((>>22>>8888??<<<>JJII;;MMII66IIEE77MMHHJJHH@@99EE;;++CC99--??8800>>8833==7711>>9944@@==99IIAA66PP@@--HH??--KK8811CC774455==00@@??//II@@44++44!!AA&&::$$66''==22AA11@@22@@4488))11++++++00))66%%55!!99,,UUIIUUQQAAKK??AA;;..EE;;AADD>>HHAAQQ==VV>>hh>>qqEEwwJJnnWWxxYY]]nnnndd҅uunn1100--//..,,4433//889922>>??55GGDD;;OOKK88MMKK44XXWWWW||xx[[TTooFF??OO9944446622&&5522))::99..BB==--KK@@//PP@@//CC;;**::44))004400BB11--66<<;;//<<'';;%%>>,,==11;;1199**::++??2233**44,,88..11++//((55 44!!99,,??66CCAAAA>>>>3399((==--EE@@FFKKDDKKDDXXBBbbJJttKK}}MMzzTTttCCcc{{__TT::88116633--3300++7744,,<<;;22IIAA66VVJJ99TTHH::ddaarr䬬쏏nnmmLLIIXX@@??MM<<9999AA==((BBCC..88AA99::EEQQEEUUaaFFSSRRaaGG<>22::##::))@@77HHFFGGHHFFJJOO\\FF``JJnnRRzzXXzzUUqqSSgg``ppKKUU᪪DD@@55AA==33;;66--5522((::55//FF==77TTGG66WWFF77]]UUjjޫ||ff\\RRLLss77::CC::9977RRJJNNss]]{{KKPP<<''99##::**;;--<<33;;336611>>99<<7788//DD99??44))))++++22,,22%%<<((::**77--LLHHCC@@99$$99((>>22QQIIEE>>NNIIQQSSTTaaVVnnNNooUUxxWWooZZiiWWeeOOTTttnnOOII;;MMGG::FF@@55??9900==6600AA==88MMEE55SSDD..WWLLSS틋oozzaaeeNN__OOWWLL]]HHRR;;>>>>>>>>55>>//??22>>4499//33++77//88//33))33$$99"">>0088;;005522005544553377++>>//PPJJEEII==3388++<<--CC22==--HH==NNJJ\\aaffvvPPmmZZuurrxxbbpp{{uueeVVPPAAWWNN??VVMM??PPII::KKBB44FF<<11EE@@77LLGG55SSGG..VVNNQQ𮮭຺vvAANN<>CC??FF>>;;GGFF>>AA??;;==11??00;;++::..993333//44..88**;;++;;66<<9999%%99!!33&&55//77++88&&==))>>55@@BBUUSSGG==99))::**<<--<<..::**VVGGmmjjaaggbbmmnnqqddllWWppuuiiXXnnEE[[NN>>ZZNN>>[[NN==XXMM<>CCNNBBGG@@55CC;;4411BB55;;))99%%::%%88((44++1133,,33--11..88((>>((0000''88((;;22==44DD6666&&55))7755..//44**55**JJ>>>>1166**::++77&&HH>>qqrrss~~rr{{ss{{VVeeDDaa}}}}gg̮Ưʪǚպ[[LL<<[[LL<<\\LL<>^^MM<<^^PP<<[[NNAAYYLLII^^SSddmmeeě~~qq@@GG>>++@@99<<@@BBJJ<<7799((BB88;;88DD::77$$;;((88''44''99..44'',,$$))''%%2266''66<>UUYYaa77eeNNdd~~mmppooppooqqÿ\\KK77\\KK66\\KK66]]LL77]]LL99]]LL;;^^MM==]]PP==]]PP==aaMM::ccGG>>gg]]qquuqqKKUU??QQ==GG<<==>>44;;**>>//883333++99''MMAAAA33::..779922>>""// --!!++%%77;;VVccppNNSS::5566$$--::008866IIEE;;0088++88++88//JJ@@33....11--0022,,44%%MMEE{{YYtt??aa@@SSIIYY11pp[[ooqq||ff~~ffkk~~eenn^^MM::^^MM::^^MM::^^MM::^^MM::__LL77^^NN99VVNNAAaaXXYYoo``mmmmddppppxxꙙ͹vv||dd\\MMUU99AA7777BB22::++GG>>BB9966++66''44..DD77<<..0033DDNNCCGG//--,,((2233>>CC??CC778833..OOJJOOQQIIGGUUUUEEAABB::<<7722==77??>>::11**2200..2200..44%%HH<>__OO==__OO==``PP77\\LL99__[[aa}}||}}qqvv||ƚǺȶppRRLLAAHHJJ7799::2277..II??ffXX@@3322++11,,==1177))--))5555RRXXJJQQQQVVVV[[@@BB99??--77JJVVoozzffvvRRNN5533AA<>ccAAdd\\;;//LL__>>uu^^{{ccooWWrrXXxx^^yy[[wwVVaahhee||VV[[MM==__PP@@__RRBB``RRCC``RR@@\\OOBBccYYaawwwwww||ccjjzzzz֯ᶶ諫yyddllggWWZZ66::6633::11OOAAXXII11''>><<@@7700%%--''33**9955SSWWVVbbddooaagg//77((66FFSS^^ffTT[[7733664488228800::55;;;;665555++66**00--//4400//99..8822wwRRpp<>``SS>>ee__XXzzttsspp]]__iiiiߝޢ֠֞Εppgg}}^^VVRR||SSHHYYQQyyss||^^ZZ66--55##;;**::0077,,99//88//<<**@@11==447733PPLLKKBB66$$//00((::''??::##88..66::55<<5577553355440077))99&&66&&55--55))44''VV\\PPkk88ee@@XX9955##AABB337788!!QQZZ44ddyyNN__AAccDDllNNhhGGccIIccJJffIIbbDD4477--::::44OODD;;VVLL==ggeelllljjQQQQ[[]]yy{{Ή݌ш͈ҍȇ~~ZZjj\\[[LLppWWDDSSVVffkkzz;;--;;##;;))66++;;++66((::--88((::--:://::00??55::..11''//77++==**>>$$::&&9955==::66;;445544448866//77))88&&66$$99&&;;%%==44WWll77ccCCjjkk33==##//%%//44^^YY22ss``]]>>mmKKppQQkkHHiiMMeeJJffHHggGG**00&&++00++997755EECC==ZZ\\ii\\]][[ZZyy||օ낂ځʃҋۍ~~xxssWWRR``__HHdd__CCWWPPZZccnnjjKK@@77&&<<''88++11((>>++::((GG;;99++::))77((77((<>00>>==44<<==22AAEE**LLMM::UUTTAAeeccggzzwwsszzyyoonn__WWllYYGGhh\\KKjj^^NN__OOKK<<55..00++44**88$$==$$99,,;;))77&&==55IIBB99''::))99--<<44;;77::888866HHIIZZXXCC==::7799228844668888>>66==77;;??77;;++;;'';;((66##IIDDUUhhMMXX]]OO3399""FFOO))uu__iijjIITT<<<>VVMM??VVNN??VVPP==\\RRCC``WWBBbbYYKKmmcckkwwjj||ppddmm]]WW[[WWUURR]]VVGGffZZFFnn__HHjjddOOZZOORRGG::,,44++77//77..66**99))::,,<<++55""99--<<44HH::BB99>>99<<<<6688;;88==2299**;;--<<5566::66::8866992299668888;;==@@88;;,,;;((88$$66''YYZZTTVVYYRRccKK``xx;;qqvvYYOO]];;;;==..2233++;;CC11ffGGooJJjjMMmmRRjjGGqqKKxxUUqqWWccZZKKee[[KKee[[KKdd[[LLee[[MMgg__JJhh__HHgg^^MMgg]]LLff\\II``ZZGGQQNN==LLHH77SSPP>>[[ZZFF____OOaaYYJJLL4400==))::**99++88**77**::++==//55??))77**99//449966<<66;;55<<664488&&99&&::))>>44998866778855<<33>>99>>>>@@;;88++::((::((77""~~::**RRJJTTII\\SSnn]]ssSSccBB''225588117766//99990099CC00ggKKwwQQppSSppOOooIIxxUUwwYY``JJhh__PPii``QQii``QQii``QQhh__PPkkbbTTjjbbSSii``PPiibbLLiibbHHhhbbKK``ZZFFLLJJ66@@EE44@@HH88CCJJ>>UUMM;;XXOODDFF::,,77%%88))::))::((99));;//669988**;;55@@EE>>;;6611::5599-->>**AA++<<''66))<<55==77??66DD99AA99883388**88''<<))}};;((ww33""AA33SSGGZZNNYYSSYYMMAAMM++''22%%77>><>22@@::>>33CC33HHAAIIEEEEAA==//FF22CC11yyAA--::++<<,,==,,88**::..;;00??11<<..66**77,,<<,,;;**{{;;,,ss99**vv55((HH;;OOBBSSNNVVWWoo__ffvvIIGGVV44^^kkQQKKQQ55::;;##8888//88BB//iiLLwwPPppNNrrPP}}``ffNNbbJJbbMMii``QQii``QQhh__PPllccTTkkbbSSmmbbWWllbbUUllddOOllddPPllbbVVmmbbUUmmccTThhaaQQVVPP@@EEAA1188AA''KK@@>>@@NNOOiimmNNJJCC<>BB>>AA<<99//==//<<338822;;//;;..::--||::..||:://{{9911{{88//||99..zz::..xx99//uu88..rr66++oo44**ll22''vv@@66TTLLQQMMUUMMyyeeOOZZnnJJUUmmDDMM__::99CC((8899,,;;==3344;;008899))VVdd>>ttTTxx\\rr\\ZZCC__IIeeLL\\GGhhaaQQiibbRRjjddSSiibbRRiibbRRjjbbSSkkbbSSkkbbSSllccTTllccTTmmaaTTffZZPPssppii}}{{jj77>>++33<<((<<==//??;;..^^BB55HHEEAAEE>><>==44==,,~~>>//99..::++::++::,,~~:://~~::00{{9900yy88//ww99//vv9900tt::..qq66--nn33++kk44))ee11%%ss==22RRNNYYRR__RR__\\HHEESS;;22??));;EE00BBJJ6699AA0044;;..4499557788,,LLWW33rrSS{{^^``IIZZ~~CCaaIIaaKKXX||GGhhbbRRiibbRRkkccSSiibbRRiibbRRjjbbSSkkbbSSllccTTllccTTkkbbRRee]]SS||ՠ||CCJJ2255??++::7722**00++ZZ??>>XXUU99::@@DDBBDDAABBCC??EE;;BB::BB88;;,,==,,<<++::++}}99--}}99//}}::00||::11ww::33ss88//pp66,,oo88--nn77++nn66//kk44,,gg33**``..$$pp88//UUQQzz\\OONNOO>>55@@11//55,,333300..33++44>>11;;KK8800>>..--22//5544++AAMM//ssYYnnTTTTuu??ZZ||EE__LL__IIWWwwHHhhccSShhccSShhccSShhccSShhccSSjjccSSllccTTmmddUUmmddUUllbbQQlljjee̝KKOO11==66))OOHHFFqqqq==::@@<<@@@@>>??BB==@@<>44ffFF99ccJJ55__MM55iiQQYYFF**11((0077,,1177--0066,,//33,,--22--..33----22,,,,00++,,33,,))44----88--22>>--22>>**66CC..DDVV;;HH]]==^^qqRRZZllSS,,88..hheeVVhheeVVhheeVViiffWWiiffWWjjeeVVllcc\\nnggZZhhiiQQlluuppԼkkSS??..66**88,,ooAA33rr==77ss??99ssAA;;oo??88nn==66qq9944ll::33dd==22^^>>22PP;;++UUPP99]]XX==]]]]??nnvv\\22@@++2277//2288..3399//2288--//55,,..33--..33--,,11++**//))++00++++33++**44,,--55,,77@@5599CC4433>>,,>>JJ44\\hhTTQQ]]OO++44--ggddUUhheeVViiffWWiiffWWiiffWWjjeeVVnncc\\llhhZZffllSShhwwooìuu]]yyHH11ee66""ee33))jj9900ll??44ii>>44hh>>22ccAA77__DD55YYGG55ee]]GGEEFF//99CC''EEII++ppppRR\\``GG2299''77==5577==3377>>4488>>3388<<5577;;6666;;55227711..33--,,11++((..((**..**,,11,,//22//==DD====JJ8811??((BBPP<>5588>>4499??5599@@88;;AA;;::>>99::@@::99==8877;;66006622,,11,,++//..))--..))33))66JJ2299LL3388II11;;KK88//;;..\\ggOO__iiRRggkkWWiihhXXllffXXllggYYkkff[[hhggYYeellYY||ɾmmggKKRRKK--UUOO22SSOO33PPNN44LLOO66HHOO55EENN..LLSS00]]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 A-2eap literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_miff.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_miff.miff new file mode 100644 index 0000000..f8bb968 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_miff.miff @@ -0,0 +1,16 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +type=TrueColor +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.3127 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT^1=>)-tqhMeJ$~FiMY8eA2Z;W# z0KP7&O206;+sTje&5xn~Wz3VrEiAJu4mRu0e%sua5T#F__jhCZ<-EkrSz{)jlDPYL zkxawOG;gleI4;kds~ckmS<|B{n*CINS$!{VyZib{zo#|I_IJwnWfo(8U;H_wS7$TL zwO85~Xv>$j%vN1Z`@Yo8jlJ2==Rsna$2`nQ=Hz}z>~)Yf$VNX+-q}Na+;1%%@->FZ zM{Rs)>W}tNRmO}_WPWo{X|CHooG!awy zm9{8z+vH_&Z`-aqcE?k0>(1JLRnszrpRey!U1!~gD=q{OKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL I_-_UN0EyRl!vFvP literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_null_black.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_null_black.miff new file mode 100644 index 0000000000000000000000000000000000000000..5001b9bc58a95a8e2d1949a42df5d4a3ae2faae7 GIT binary patch literal 26151 zcmeIuOKzM%5XNz@kx!6S?;S?XV?cw{n^1=>)-tqhMeJ$~FiMY8eA2Z;W# z0KP7&O206;+sTje&5xn~Wz3VrEiAJu4mRu0e%sua5T#F__jhCZ<-EkrSz{)jlDPYL zkxawOG;gleI4;kds~ckmS<|B{n*CINS$!{VyZib{zo#|I_IJwnWfo(8U;H_wS7$TL zwO85~Xv>$j%vN1Z`@Yo8jlJ2==Rsna$2`nQ=Hz}z>~)Yf$VNX+-q}Na+;1%%@->FZ zM{Rs)>W}tNRmO}_WPWo{X|CHooG!awy zm9{8z+vH_&Z`-aqcE?k0>(1JLRnszrpRey!U1!~gD=q{OKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL I_-_UN0EyRl!vFvP literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_null_white.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_null_white.miff new file mode 100644 index 0000000000000000000000000000000000000000..5001b9bc58a95a8e2d1949a42df5d4a3ae2faae7 GIT binary patch literal 26151 zcmeIuOKzM%5XNz@kx!6S?;S?XV?cw{n^1=>)-tqhMeJ$~FiMY8eA2Z;W# z0KP7&O206;+sTje&5xn~Wz3VrEiAJu4mRu0e%sua5T#F__jhCZ<-EkrSz{)jlDPYL zkxawOG;gleI4;kds~ckmS<|B{n*CINS$!{VyZib{zo#|I_IJwnWfo(8U;H_wS7$TL zwO85~Xv>$j%vN1Z`@Yo8jlJ2==Rsna$2`nQ=Hz}z>~)Yf$VNX+-q}Na+;1%%@->FZ zM{Rs)>W}tNRmO}_WPWo{X|CHooG!awy zm9{8z+vH_&Z`-aqcE?k0>(1JLRnszrpRey!U1!~gD=q{OKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL I_-_UN0EyRl!vFvP literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_p7.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_p7.miff new file mode 100644 index 0000000000000000000000000000000000000000..831c3e754aa5b350ab986f7008cf42eb9afa4968 GIT binary patch literal 4164 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pbm_p1.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pbm_p1.miff new file mode 100644 index 0000000000000000000000000000000000000000..97bcccb9996e381aa7ae1231f0c08f93034749ab GIT binary patch literal 3482 zcmbtU!EV|>5bfFO7xd(Nl*&*7jU}I2wd$cgCDc)oiScpBwYt) z=FRMTZ#TehQ+%t-ZS}p}?$*E3^iS2ayW^plz0Z>MzHHm#^RB7Z-6zh|bbZ_(o3_Z( zv@W}@D!!Eawn_+ns1I$iBD^{NZHvV+O*hr4`&oSCCT%&D>#F$LluuOGr>1J1%8%or zO4HvD<$l*a6qlM`7Z+Q-H6D!a;(ZCTf4F-taOSLN%bqEO7U+59?N zUe9ND*)qSm&9mF{V~Ox4HD?*56U7^c6QyV)vVtnv>FKlL`r-#x#PWh3YEdZx$^ z*LZXu2=+=R`hLMkbe{+N4&u6uzG9tk5~(N=TEi&XN(F~enlX?zJu3xIaotBEd!Z$+ zY$d}$B3q{**`^b|78QIxY=jO+`*{IwF{PczCZy>P1!)$h}(KieS zNv8126Nuv2y^Qz~3i@{kRT>NxP^hBjVT-{DVFHh+QFrpu1Bo4W;$E(_>e9FGf!LUN zy&Fs7y->iJ`?|Kmthjb8d;&Jd+yC$B3CV4o-$@J=@gOfwaF{ViVSL2%z)PQ2+kITT z2uAss`pa-H=2*jJ%K^D1np(pf&+9Qq&UuLwB@s%Za*+QX@xNcy{fL_p{eI8SUZOjk z5klZx(Xu7fr8EA{mc0{80jlXJk}Ay8VVTszLCvUoOm;YYT6emueu9^mC2%e>WX?Xy zE(bslI3nZy+?!B#0c1=aq7MYMn}eD}%dZ`v9Fh0kfZ9Z>V&G`%#Z?iRRf8g2pf{{l z!+obwig{GivH$zxe;UX^ANTj64nV5@fwrPL&nR11U+`ckHi>*V&2MG(Ed~gJ&L@{aRQxpF}xp~*hgnJ>>4Cf HE~NJluYL{C literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pbm_p4.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pbm_p4.miff new file mode 100644 index 0000000000000000000000000000000000000000..97bcccb9996e381aa7ae1231f0c08f93034749ab GIT binary patch literal 3482 zcmbtU!EV|>5bfFO7xd(Nl*&*7jU}I2wd$cgCDc)oiScpBwYt) z=FRMTZ#TehQ+%t-ZS}p}?$*E3^iS2ayW^plz0Z>MzHHm#^RB7Z-6zh|bbZ_(o3_Z( zv@W}@D!!Eawn_+ns1I$iBD^{NZHvV+O*hr4`&oSCCT%&D>#F$LluuOGr>1J1%8%or zO4HvD<$l*a6qlM`7Z+Q-H6D!a;(ZCTf4F-taOSLN%bqEO7U+59?N zUe9ND*)qSm&9mF{V~Ox4HD?*56U7^c6QyV)vVtnv>FKlL`r-#x#PWh3YEdZx$^ z*LZXu2=+=R`hLMkbe{+N4&u6uzG9tk5~(N=TEi&XN(F~enlX?zJu3xIaotBEd!Z$+ zY$d}$B3q{**`^b|78QIxY=jO+`*{IwF{PczCZy>P1!)$h}(KieS zNv8126Nuv2y^Qz~3i@{kRT>NxP^hBjVT-{DVFHh+QFrpu1Bo4W;$E(_>e9FGf!LUN zy&Fs7y->iJ`?|Kmthjb8d;&Jd+yC$B3CV4o-$@J=@gOfwaF{ViVSL2%z)PQ2+kITT z2uAss`pa-H=2*jJ%K^D1np(pf&+9Qq&UuLwB@s%Za*+QX@xNcy{fL_p{eI8SUZOjk z5klZx(Xu7fr8EA{mc0{80jlXJk}Ay8VVTszLCvUoOm;YYT6emueu9^mC2%e>WX?Xy zE(bslI3nZy+?!B#0c1=aq7MYMn}eD}%dZ`v9Fh0kfZ9Z>V&G`%#Z?iRRf8g2pf{{l z!+obwig{GivH$zxe;UX^ANTj64nV5@fwrPL&nR11U+`ckHi>*V&2MG(Ed~gJ&L@{aRQxpF}xp~*hgnJ>>4Cf HE~NJluYL{C literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pcx.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pcx.miff new file mode 100644 index 0000000..f352648 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pcx.miff @@ -0,0 +1,16 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=16 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +units=PixelsPerInch +resolution=70x46 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2009-09-05T17:47:34-04:00 + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTEKMMK6 + + + + + + + + + + + + +32!0;JXPGI< &/9@>D?2 + +  + +  $+&%'%'($0D: .MQRSQNNMGE9# 334:ERD, +  + +  N4 1'+.$-9IA$ +5L<9*%)0:A:64>SLF<20,6B?A7-3F3058624>GQB2+('(@]TZed[7!߸ 4@I:, ?SHLA,574..09BLQNJNJ75CE:.3AA95>-$%#1_ghj]TSDgg}¡)BFB-4FRH0$5?9,13;H@EIKNHIFQI?I;?910D467.)Wtol[S816+5H]bZx}5W^SE:L?)#8GJA/5BGINJHOW`I8+7I>4/%&4%+7==K:9GMMOIEPdQ5!'0@42)/C@ONH27}q`W;3%243>@C>HWPA>=A>=3?@9N@<@JMFC<7QWd_LJS]W?C>:BED:@INK<,l^W6 ,<8NMHFH@#?Ukr2-2954:3234838NQNOPI=@FI@9;;:9<^VWe8,9<64..2 + !@OGEEJH31S`A33:82/A6325;=HNFDLI@=BIMA65510KXV( k9,>;22118 ,W[CENG5!#KH<<8?2.2?0145:DJEKRH@?AEHH>/--(*\U; EW*:30675@ !@P:38- $):@@:5;,):8:,#0<=<=EHC2+.;GDCCDEE6%@6+%&e@  ,<8:9BMC,=8,6<99:.'/8DDGH:&$*5%,&'2O + + .B?>>JJ2 5L308888-,=K:,+""#$*9HHB6)%')$  + .C@AIN20  (PO7379:8*.AJ;##,1+!!"'*1'! + + /C@EN510! ! !! !! 1B`E:<@CGFIJE7" "'&& + 'CBL:-5.  !!!! $*7:;88?BDDDD8!"%&$! + + +>I@+/4* ! !! )Zn1 + (<=ABB@==>)&'$  + + +3  + + +  D."'- !!! o'M-*88;, + 7$,!!!!!!!"!&a).?(36(-%  #' !!!!! !"!6ڠnj&., 4  + + $! !!!!!!!#"+ɪ;" *  + !!!!!"##+享9 ' +  +  "!!!"#"*埆泈 !  + #""#""#<ְ"   \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pgm_p5.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pgm_p5.miff new file mode 100644 index 0000000..6f5025b --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pgm_p5.miff @@ -0,0 +1,87 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=Gray +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +gamma=1 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +:   ",5CKOK<-*(% !+0! +  1=//O1 + %0AIRO:*)($  .6!  +)=,:' + + $3ANH.%&%!"25$  +F4 + + + %0BA&!"!$0:A !]G-&F? + !*0""0LY2 %VX~dkN +  + +!%EKMMK6 + + + + + + + + + + + + +32!0;JXPGI< &/9@>D?2 + +  + +  $+&%'%'($0D: .MQRSQNNMGE9# 334:ERD, +  + +  N4 1'+.$-9IA$ +5L<9*%)0:A:64>SLF<20,6B?A7-3F3058624>GQB2+('(@]TZed[7!߸ 4@I:, ?SHLA,574..09BLQNJNJ75CE:.3AA95>-$%#1_ghj]TSDgg}¡)BFB-4FRH0$5?9,13;H@EIKNHIFQI?I;?910D467.)Wtol[S816+5H]bZx}5W^SE:L?)#8GJA/5BGINJHOW`I8+7I>4/%&4%+7==K:9GMMOIEPdQ5!'0@42)/C@ONH27}q`W;3%243>@C>HWPA>=A>=3?@9N@<@JMFC<7QWd_LJS]W?C>:BED:@INK<,l^W6 ,<8NMHFH@#?Ukr2-2954:3234838NQNOPI=@FI@9;;:9<^VWe8,9<64..2 + !@OGEEJH31S`A33:82/A6325;=HNFDLI@=BIMA65510KXV( k9,>;22118 ,W[CENG5!#KH<<8?2.2?0145:DJEKRH@?AEHH>/--(*\U; EW*:30675@ !@P:38- $):@@:5;,):8:,#0<=<=EHC2+.;GDCCDEE6%@6+%&e@  ,<8:9BMC,=8,6<99:.'/8DDGH:&$*5%,&'2O + + .B?>>JJ2 5L308888-,=K:,+""#$*9HHB6)%')$  + .C@AIN20  (PO7379:8*.AJ;##,1+!!"'*1'! + + /C@EN510! ! !! !! 1B`E:<@CGFIJE7" "'&& + 'CBL:-5.  !!!! $*7:;88?BDDDD8!"%&$! + + +>I@+/4* ! !! )Zn1 + (<=ABB@==>)&'$  + + +3  + + +  D."'- !!! o'M-*88;, + 7$,!!!!!!!"!&a).?(36(-%  #' !!!!! !"!6ڠnj&., 4  + + $! !!!!!!!#"+ɪ;" *  + !!!!!"##+享9 ' +  +  "!!!"#"*埆泈 !  + #""#""#<ְ"   \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pict.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pict.miff new file mode 100644 index 0000000..e6d9e84 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_pict.miff @@ -0,0 +1,15 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.454545 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-21T06:59:09-04:00 +date:modify=2009-09-05T17:47:34-04:00 + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]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.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nndun10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:darnmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Uj|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLSozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮ʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdme~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxv|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzzydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iipg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S||CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQljeKO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT>88--EE==22HH??11II>>..KK@@//MMDD33iiEE44@@..<<--GG<>..==,,==**;;**>>-->>33@@44DD88HH;;DD77,,9955559933116622//6622..1111----11..0000..55//..22**,,EE2211xxAA55YY\\}}ccllJJ>>kkKK@@\\]]^^gg~~llpp__YYWWSS,,,,,,,,--++00//,,11..++22,,((22--**00,,++22,,++22++++22,,++22,,++11,,++11,,))33--,,33--,,33//,,3311,,4400,,5522--775500::33,,>>66--@@66--CC88--HH;;//EEEE55UUDD44mm==++99((EE44HH==EE@@<<>>>>==AA00@@**??-->>--??,,>>))>>,,==--<<--;;..??//BB11@@88GGDDWWNN<>FFFFIISSIIYYZZOO,,--//++--//..----//--))//**''--++((,,****,,****..++++..++++..++++//++++//----00,,,,00--..//--**22..,,22..++22--,,3300..8822//<<44//>>44//AA55--FF9911HH>>77QQ<<55__7700yy77--;;//AA33EE99EE@@HHAABB//@@,,>>--==//==--==++<<++<<,,<<..<<22CC77GG::EE@@gg__yyWWeeWWCCBB887755++//11**..11++--00,,--00////00..0022..//22..//--2244**,,ggccbb~~iippYY\\oo``pprr||__eeQQ,,//22++//22....00--..----++)),,**++++))++((''((****++,,**++,,**++**))))**(())--++,,..--..//,,++00,,++..**))//++++00----881111<<3322;;2211>>00..AA22//AA7733BB::66KK6622hh77//==00>>55AA33DD77GG<>UURR{{rrppSSZZGG<<@@330011((--))''22,,++22,,++00,,**00--++00//++22**1100))((eeqqRRʳǰYYddJJ..00..////--//11..2211..3300--33//,,22--**--**++,,++,,**))--++((,,--'',,++(()),,**))----++//--,,..++**//++))44,,))66//**;;33..==4400;;11--;;//..>>//..>>33,,5599//9933,,OO,,''ii::--AA11@@11;;--BB22>>22<>--::++;;**vv>>))vv88,,ss99--{{@@44GG>>NNEEddVVzzqq{{vv||eeggddeePPffPP44==00**&&##..$$&&++****))++,,''++//''''--))$$""WW\\HH~~jj{{jj~~oooo}}tt~~{{oollLLVVDD778822778822999944<<::55@@==88BB::88AA9955==7733<<7755::554499000099////6611..6622..6633..664411997733??7722BB9900HH==11JJ>>44HH==44BB8800@@6611??6622<<9944CC5544AA5500<<66**EE55''cc66--==;;BBAACC;;>>66AA55~~:://yy;;//uu>>..zz44))PPLL[[VVppJJ99kkSS@@ss``IIzzXXff``zzrr~~vvxxooooXXiiMM??;;))33))""%%++!!++//&&::&&**CC))))TTNN::hhqqRRhhWWkk\\nncckkhhsstttttthhddNNXXCC88993399::44>>>>88AA??::DD??::FFAA<>BBCCEEvvCC99yy::44<>33((GG@@--ee^^::ww\\nn\\mmYYssdd~~{{dd}}__SS__GG667711668811====88BB@@;;FFAA??HHCC>>HHCC>>JJDD<>99,,EE<>11KK;;11DD:://>>==1177==00BB@@KK]]3355;;##??55;;00>>33DD77::((>>22>>8888??<<<>JJII;;MMII66IIEE77MMHHJJHH@@99EE;;++CC99--??8800>>8833==7711>>9944@@==99IIAA66PP@@--HH??--KK8811CC774455==00@@??//II@@44++44!!AA&&::$$66''==22AA11@@22@@4488))11++++++00))66%%55!!99,,UUIIUUQQAAKK??AA;;..EE;;AADD>>HHAAQQ==VV>>hh>>qqEEwwJJnnWWxxYY]]nnnndd҅uunn1100--//..,,4433//889922>>??55GGDD;;OOKK88MMKK44XXWWWW||xx[[TTooFF??OO9944446622&&5522))::99..BB==--KK@@//PP@@//CC;;**::44))004400BB11--66<<;;//<<'';;%%>>,,==11;;1199**::++??2233**44,,88..11++//((55 44!!99,,??66CCAAAA>>>>3399((==--EE@@FFKKDDKKDDXXBBbbJJttKK}}MMzzTTttCCcc{{__TT::88116633--3300++7744,,<<;;22IIAA66VVJJ99TTHH::ddaarr䬬쏏nnmmLLIIXX@@??MM<<9999AA==((BBCC..88AA99::EEQQEEUUaaFFSSRRaaGG<>22::##::))@@77HHFFGGHHFFJJOO\\FF``JJnnRRzzXXzzUUqqSSgg``ppKKUU᪪DD@@55AA==33;;66--5522((::55//FF==77TTGG66WWFF77]]UUjjޫ||ff\\RRLLss77::CC::9977RRJJNNss]]{{KKPP<<''99##::**;;--<<33;;336611>>99<<7788//DD99??44))))++++22,,22%%<<((::**77--LLHHCC@@99$$99((>>22QQIIEE>>NNIIQQSSTTaaVVnnNNooUUxxWWooZZiiWWeeOOTTttnnOOII;;MMGG::FF@@55??9900==6600AA==88MMEE55SSDD..WWLLSS틋oozzaaeeNN__OOWWLL]]HHRR;;>>>>>>>>55>>//??22>>4499//33++77//88//33))33$$99"">>0088;;005522005544553377++>>//PPJJEEII==3388++<<--CC22==--HH==NNJJ\\aaffvvPPmmZZuurrxxbbpp{{uueeVVPPAAWWNN??VVMM??PPII::KKBB44FF<<11EE@@77LLGG55SSGG..VVNNQQ𮮭຺vvAANN<>CC??FF>>;;GGFF>>AA??;;==11??00;;++::..993333//44..88**;;++;;66<<9999%%99!!33&&55//77++88&&==))>>55@@BBUUSSGG==99))::**<<--<<..::**VVGGmmjjaaggbbmmnnqqddllWWppuuiiXXnnEE[[NN>>ZZNN>>[[NN==XXMM<>CCNNBBGG@@55CC;;4411BB55;;))99%%::%%88((44++1133,,33--11..88((>>((0000''88((;;22==44DD6666&&55))7755..//44**55**JJ>>>>1166**::++77&&HH>>qqrrss~~rr{{ss{{VVeeDDaa}}}}gg̮Ưʪǚպ[[LL<<[[LL<<\\LL<>^^MM<<^^PP<<[[NNAAYYLLII^^SSddmmeeě~~qq@@GG>>++@@99<<@@BBJJ<<7799((BB88;;88DD::77$$;;((88''44''99..44'',,$$))''%%2266''66<>UUYYaa77eeNNdd~~mmppooppooqqÿ\\KK77\\KK66\\KK66]]LL77]]LL99]]LL;;^^MM==]]PP==]]PP==aaMM::ccGG>>gg]]qquuqqKKUU??QQ==GG<<==>>44;;**>>//883333++99''MMAAAA33::..779922>>""// --!!++%%77;;VVccppNNSS::5566$$--::008866IIEE;;0088++88++88//JJ@@33....11--0022,,44%%MMEE{{YYtt??aa@@SSIIYY11pp[[ooqq||ff~~ffkk~~eenn^^MM::^^MM::^^MM::^^MM::^^MM::__LL77^^NN99VVNNAAaaXXYYoo``mmmmddppppxxꙙ͹vv||dd\\MMUU99AA7777BB22::++GG>>BB9966++66''44..DD77<<..0033DDNNCCGG//--,,((2233>>CC??CC778833..OOJJOOQQIIGGUUUUEEAABB::<<7722==77??>>::11**2200..2200..44%%HH<>__OO==__OO==``PP77\\LL99__[[aa}}||}}qqvv||ƚǺȶppRRLLAAHHJJ7799::2277..II??ffXX@@3322++11,,==1177))--))5555RRXXJJQQQQVVVV[[@@BB99??--77JJVVoozzffvvRRNN5533AA<>ccAAdd\\;;//LL__>>uu^^{{ccooWWrrXXxx^^yy[[wwVVaahhee||VV[[MM==__PP@@__RRBB``RRCC``RR@@\\OOBBccYYaawwwwww||ccjjzzzz֯ᶶ諫yyddllggWWZZ66::6633::11OOAAXXII11''>><<@@7700%%--''33**9955SSWWVVbbddooaagg//77((66FFSS^^ffTT[[7733664488228800::55;;;;665555++66**00--//4400//99..8822wwRRpp<>``SS>>ee__XXzzttsspp]]__iiiiߝޢ֠֞Εppgg}}^^VVRR||SSHHYYQQyyss||^^ZZ66--55##;;**::0077,,99//88//<<**@@11==447733PPLLKKBB66$$//00((::''??::##88..66::55<<5577553355440077))99&&66&&55--55))44''VV\\PPkk88ee@@XX9955##AABB337788!!QQZZ44ddyyNN__AAccDDllNNhhGGccIIccJJffIIbbDD4477--::::44OODD;;VVLL==ggeelllljjQQQQ[[]]yy{{Ή݌ш͈ҍȇ~~ZZjj\\[[LLppWWDDSSVVffkkzz;;--;;##;;))66++;;++66((::--88((::--:://::00??55::..11''//77++==**>>$$::&&9955==::66;;445544448866//77))88&&66$$99&&;;%%==44WWll77ccCCjjkk33==##//%%//44^^YY22ss``]]>>mmKKppQQkkHHiiMMeeJJffHHggGG**00&&++00++997755EECC==ZZ\\ii\\]][[ZZyy||օ낂ځʃҋۍ~~xxssWWRR``__HHdd__CCWWPPZZccnnjjKK@@77&&<<''88++11((>>++::((GG;;99++::))77((77((<>00>>==44<<==22AAEE**LLMM::UUTTAAeeccggzzwwsszzyyoonn__WWllYYGGhh\\KKjj^^NN__OOKK<<55..00++44**88$$==$$99,,;;))77&&==55IIBB99''::))99--<<44;;77::888866HHIIZZXXCC==::7799228844668888>>66==77;;??77;;++;;'';;((66##IIDDUUhhMMXX]]OO3399""FFOO))uu__iijjIITT<<<>VVMM??VVNN??VVPP==\\RRCC``WWBBbbYYKKmmcckkwwjj||ppddmm]]WW[[WWUURR]]VVGGffZZFFnn__HHjjddOOZZOORRGG::,,44++77//77..66**99))::,,<<++55""99--<<44HH::BB99>>99<<<<6688;;88==2299**;;--<<5566::66::8866992299668888;;==@@88;;,,;;((88$$66''YYZZTTVVYYRRccKK``xx;;qqvvYYOO]];;;;==..2233++;;CC11ffGGooJJjjMMmmRRjjGGqqKKxxUUqqWWccZZKKee[[KKee[[KKdd[[LLee[[MMgg__JJhh__HHgg^^MMgg]]LLff\\II``ZZGGQQNN==LLHH77SSPP>>[[ZZFF____OOaaYYJJLL4400==))::**99++88**77**::++==//55??))77**99//449966<<66;;55<<664488&&99&&::))>>44998866778855<<33>>99>>>>@@;;88++::((::((77""~~::**RRJJTTII\\SSnn]]ssSSccBB''225588117766//99990099CC00ggKKwwQQppSSppOOooIIxxUUwwYY``JJhh__PPii``QQii``QQii``QQhh__PPkkbbTTjjbbSSii``PPiibbLLiibbHHhhbbKK``ZZFFLLJJ66@@EE44@@HH88CCJJ>>UUMM;;XXOODDFF::,,77%%88))::))::((99));;//669988**;;55@@EE>>;;6611::5599-->>**AA++<<''66))<<55==77??66DD99AA99883388**88''<<))}};;((ww33""AA33SSGGZZNNYYSSYYMMAAMM++''22%%77>><>22@@::>>33CC33HHAAIIEEEEAA==//FF22CC11yyAA--::++<<,,==,,88**::..;;00??11<<..66**77,,<<,,;;**{{;;,,ss99**vv55((HH;;OOBBSSNNVVWWoo__ffvvIIGGVV44^^kkQQKKQQ55::;;##8888//88BB//iiLLwwPPppNNrrPP}}``ffNNbbJJbbMMii``QQii``QQhh__PPllccTTkkbbSSmmbbWWllbbUUllddOOllddPPllbbVVmmbbUUmmccTThhaaQQVVPP@@EEAA1188AA''KK@@>>@@NNOOiimmNNJJCC<>BB>>AA<<99//==//<<338822;;//;;..::--||::..||:://{{9911{{88//||99..zz::..xx99//uu88..rr66++oo44**ll22''vv@@66TTLLQQMMUUMMyyeeOOZZnnJJUUmmDDMM__::99CC((8899,,;;==3344;;008899))VVdd>>ttTTxx\\rr\\ZZCC__IIeeLL\\GGhhaaQQiibbRRjjddSSiibbRRiibbRRjjbbSSkkbbSSkkbbSSllccTTllccTTmmaaTTffZZPPssppii}}{{jj77>>++33<<((<<==//??;;..^^BB55HHEEAAEE>><>==44==,,~~>>//99..::++::++::,,~~:://~~::00{{9900yy88//ww99//vv9900tt::..qq66--nn33++kk44))ee11%%ss==22RRNNYYRR__RR__\\HHEESS;;22??));;EE00BBJJ6699AA0044;;..4499557788,,LLWW33rrSS{{^^``IIZZ~~CCaaIIaaKKXX||GGhhbbRRiibbRRkkccSSiibbRRiibbRRjjbbSSkkbbSSllccTTllccTTkkbbRRee]]SS||ՠ||CCJJ2255??++::7722**00++ZZ??>>XXUU99::@@DDBBDDAABBCC??EE;;BB::BB88;;,,==,,<<++::++}}99--}}99//}}::00||::11ww::33ss88//pp66,,oo88--nn77++nn66//kk44,,gg33**``..$$pp88//UUQQzz\\OONNOO>>55@@11//55,,333300..33++44>>11;;KK8800>>..--22//5544++AAMM//ssYYnnTTTTuu??ZZ||EE__LL__IIWWwwHHhhccSShhccSShhccSShhccSShhccSSjjccSSllccTTmmddUUmmddUUllbbQQlljjee̝KKOO11==66))OOHHFFqqqq==::@@<<@@@@>>??BB==@@<>44ffFF99ccJJ55__MM55iiQQYYFF**11((0077,,1177--0066,,//33,,--22--..33----22,,,,00++,,33,,))44----88--22>>--22>>**66CC..DDVV;;HH]]==^^qqRRZZllSS,,88..hheeVVhheeVVhheeVViiffWWiiffWWjjeeVVllcc\\nnggZZhhiiQQlluuppԼkkSS??..66**88,,ooAA33rr==77ss??99ssAA;;oo??88nn==66qq9944ll::33dd==22^^>>22PP;;++UUPP99]]XX==]]]]??nnvv\\22@@++2277//2288..3399//2288--//55,,..33--..33--,,11++**//))++00++++33++**44,,--55,,77@@5599CC4433>>,,>>JJ44\\hhTTQQ]]OO++44--ggddUUhheeVViiffWWiiffWWiiffWWjjeeVVnncc\\llhhZZffllSShhwwooìuu]]yyHH11ee66""ee33))jj9900ll??44ii>>44hh>>22ccAA77__DD55YYGG55ee]]GGEEFF//99CC''EEII++ppppRR\\``GG2299''77==5577==3377>>4488>>3388<<5577;;6666;;55227711..33--,,11++((..((**..**,,11,,//22//==DD====JJ8811??((BBPP<>5588>>4499??5599@@88;;AA;;::>>99::@@::99==8877;;66006622,,11,,++//..))--..))33))66JJ2299LL3388II11;;KK88//;;..\\ggOO__iiRRggkkWWiihhXXllffXXllggYYkkff[[hhggYYeellYY||ɾmmggKKRRKK--UUOO22SSOO33PPNN44LLOO66HHOO55EENN..LLSS00]]ee@@aaeeFFVVVV==WWTT<8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD23-34-53.961961:2.80-3.,300-.0/(/1)./*,1.*10*01./004/+;1+A5,C8/A90=5-;0/<1/E1-R).F*.70)R/(j9.:794?5B6A1>-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un330551883=<6DC9GG>JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnD@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[PA[OAYM?TJ:TG9NGC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ[K:[K:YK:YI9[K:]J<^K<^O;^O;_N:_KHaWw|w‡ew4K@FC@BGC@;.8&@68;MEPA6(4*601/19-<*<-H.WQc\m8O057&C6SNC@9.7$;%8)FB833100914'\W|k|Ha>UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%HB96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V_O=_O?_O>_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp<@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbDDB6JE<\M>`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWUM>VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`JcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qi`QjaRjaQk_Zk__kaVkaTkaXlaRkbNZVDDF82@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJC@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\Gi`QjaRlbTjaRjaRkbSkbSkbRlcSlcTpbRpaUf_RfaP_YCA@%rMB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVheVheVgeUkd[ndXghP}~ҷǣE49.<9:;@=pB4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.ddSgdUhgWieWhfWkeVnd\lhZdkRdwoҶƿѽhS;XD,]K2\L4VO:QN7MO8^gK@L0=E*GJ+igJ`YDFF5:?5:>58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD23-34-53.961961:2.80-3.,300-.0/(/1)./*,1.*10*01./004/+;1+A5,C8/A90=5-;0/<1/E1-R).F*.70)R/(j9.:794?5B6A1>-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un330551883=<6DC9GG>JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnD@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[PA[OAYM?TJ:TG9NGC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ[K:[K:YK:YI9[K:]J<^K<^O;^O;_N:_KHaWw|w‡ew4K@FC@BGC@;.8&@68;MEPA6(4*601/19-<*<-H.WQc\m8O057&C6SNC@9.7$;%8)FB833100914'\W|k|Ha>UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%HB96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V_O=_O?_O>_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp<@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbDDB6JE<\M>`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWUM>VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`JcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qi`QjaRjaQk_Zk__kaVkaTkaXlaRkbNZVDDF82@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJC@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\Gi`QjaRlbTjaRjaRkbSkbSkbRlcSlcTpbRpaUf_RfaP_YCA@%rMB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVheVheVgeUkd[ndXghP}~ҷǣE49.<9:;@=pB4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.ddSgdUhgWieWhfWkeVnd\lhZdkRdwoҶƿѽhS;XD,]K2\L4VO:QN7MO8^gK@L0=E*GJ+igJ`YDFF5:?5:>58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTdu8JvBFPeL(?eRF1ySt z^bz_ReWso}Gaeg55UU=LvG1MF=iZsINhk69c{1f6lW97>34-rD%hTl|j?O}FJWKLC zzRLM}vV245K`>sp zp_9&Smd=yx9>GEXRe09x1;I4qd{IgC5J!PuXKP-GM&}5J1MluST_L`N8*b8zx)*et z?$DbgD?S=$96xb4jJlmD>_mgl;b7DaN6|$m?2p1wj+!qg>9_kmqkM1lqV2S!%lu{Z zrF|0peEh>0d;IygEYZ`*ds7g3|+ZP%^vaFfzjxYV~dimY4XpDS5}L0{hO|BIz^Mtp?pc0c8wSF z_msa(V*0gXoo|WyTf6I5$vUt0ih&ijT4IWyw7?`UE_uNMys zftJ+GQU3kWCFh@J zsnMWg)AJBg$$flFO7i9YqX!ZGQgy!Qze(#SJa(*~;AIm1tM;4Q{hRPGckrTrnXLPl zvqAp}Yxux~t~NPv~~~~yzVz.~/~1|2|2|1|0|2|2|2|0}.}.|0|0|/|0|1|3|5|8y>y@v?vAuDuMmTmYfhfqeteubtbkc_c^b]bZeWeTiSiShRhTjWjcdjd\r9r6~4~2}2}0~/~/~0~,}7}Psjs{p{FF^}}lzWz,,.}.}-|.|-~-~-~-~-~-~-}.}.}/}1}0}2|5|4z7z7x:x=wCwGqIqMi]ijeqesaqabc[c\eZeXfTfSiRiQkPkSiZifgkgdwx@x?x:z8z8|9|9|8|6w8wBrRrYqUqRoRoMoLoLnGnnmrmSqXqcowo}ooq~q~qxqxtt`tt:x+x(|},|},|0|MsjsulslsmmmmspspyuwRuw8}9}=}?}?|A|A{@{@z>zvw;x;x9wTw}j`jTddd[f_fdeWeadidodmdndmd`bgbomkmftfqe{eniniqpupzwzwvقvَs|sFtBtvxx~z~z{{ρrvx_vx2~4~7|;|BzEzGvHvD|I|Axz~qdudu~dqdq~_p_p`m`mZv\v\v[v\u^u_s^s^t\tYuLuGvNvXv]vonrncb_bd^g^e^d^f`a`Ob\b^aeajckcmcmcecXcWb\bj`o`n`m`m`m`leheXfSfPhJhLljlfpjpxnnZt{,t{6|5|7y~=y~sdtdtbqbq_p_pcnvcn_v`v`v`v_vcvbv`vararasYsHvAvCz}Fz}Mpspwbbb^^d^e]e]da_aNcQc]bibteje]g^gWfXfZdYd[chcp^q^qbib[hShOiOiLkEkTmemiqjqeqEq-}{;}{Jw9w7y~;y~sdtdt_p_pbpbpwfpufp`v`v`vavaxbxbzbzbxbxbubuUwCw?y{oioe{ee`b`f`h`ibib_edesbxbngYgYjTjOkNkQjRjRhXh_dcd^eTePkOkMlLlHnFn\n`ngrkrwoloMs{ds{Ls7s6y~x~/x~Hvx~vxZns\ns[mtfmtqpvMpvdwdwdxdxdwdwdxfxdyly||{{ssnu}uu}~~~~rrZdfdle`eUoQoOpLpJpHpGqEqEsDsBtCtEtFtHqMqtuju.||4||3{}3{}2|~1|~1}}1}}/}}2}}9{z:{zFwzPwzLrwZrwUpuepukvw=vwdwdwdwdwdwcweyeydy~y߂}}~~y~y~ssyy~~k_k_f`fVqRqOsMsLrLrHsFsGtEtEsEsItNtOpOp|vTv-{}3{}4|}3|}1}}/}}0}}/}}.}}0}}/}{3}{8x{8x{y{8y{Cw{bw{W|{0|{cwdwewewewdweygygy|qy|Ã{{||s~s~yy~~~~sslTlAp@pFrKrIrIrJtJtJs\sCs}}<~}=~};~~9~~3~}.~}-}+}.yyAyyCvxAvxDzz5zz`u|cu|gvfvfwfwfxexg{{{{ς{{yyuu}}~~~~||tteoIoMpMpKsKsIr~Gr~Ln^n`rSrRrPrHw@w<{}<{}>{{={{={|>{|?||A||@{|<{|9z{=z{SouUouDwxIwxRwy;wy \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_viff.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_viff.miff new file mode 100644 index 0000000000000000000000000000000000000000..7828fe0c1899c781c5068e3319d5aa45b6bf1b78 GIT binary patch literal 4336 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_wbmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_wbmp.miff new file mode 100644 index 0000000000000000000000000000000000000000..7f184af866f848567b1fbda3f62950c119b12a61 GIT binary patch literal 3572 zcmb7>%Wl(95QdYj#S^gdzNE69G=)gsfCOTJR3To##D~-(H`xiLPhaMrnRBs2Y}aXX z=JNmFj8CdE|GFzS=3B9;*1zNUkExsLu+P)mBwBBarpX@~b1n~`5XbTQuszgGp2hL5 zIGs%Xx!5))qUw3KZ}R&jj_boylP{KWT$BbmUo*X0tSzrOO}5 za+M{kES)8bRg#EmcPOi0&poO)(dzAFGI@DG4|5nwM-Si;@D;xurdTJ zF1iui3O7OQMj_@utB_SLC6I+x$ComHyHM6aN;qlh5ss!7&*l~<_zH#At)~ce6Tp2a zL%8AqsD(srwE8WA72u@*K!{9JZXlK%_r;-IMszBM${MlGmB*p0@y z)Jmjcv#X~d9EdO5-nSxL^D2ZIDzZCa6@5h;^tq+i8ia%)z)0Z746|q!jLDufCLTQ!0UYrY&XP;y&)LZc)ucNe3d0c?10m;S2enA+hqw87YME(!b$d*$Ulv4ZHT3}y zVxq;~vuQm5jusA|TiE_PzZ5ladaKx%z)sTcMU!vz{4synnBQcT+kU zFfR_?6q+6myMpH@faPs}Ng<0Lrw^)7P9rga4TR{P*aKtK{K)Tw5U{iLC_cea0;BUV zTaE1q(x2h9#XaX{i{bO5iYDj1z)@o+V$4bg#ap`+WCXh`*|C@~TW0a~bRoY11TkjXGu3C)^9Ms}5D&B%u&R z+O{hBoE{n#0D3CQCfP_K>guscqO}m2I<^nV2Q0$KG2N-8`SIl=E$UPh+t zZ4kdZpU*dNy`jsGxTo(8MEqdRAJ@+a&r)S@eL>6MoB_KIhIJ8r#nm4osX-zxT}IM& zRP1n&W(s@$Q!%XEc#KI<9dY?&sj&9bo=T< zD2n1`#4&N-F-NwY$9hpS^5WXaxGX4ML+>pMX_xF%r=YYGBn)gg<0VxQYl=&N|};MRycMc(;ptjI37c9}a3{XfkqndfXec7I>&Ps8Q!j<4=0oqvlV z2V9VIw58FFIYVaC5uMRj(^0MK!asVtY3$Mu52ds|4ZH2AhhBm7^h(2y&Yl@cX+^Vk nDX7Ajbb3So7Or0(<>DB*Nx zT~H0@e%c3B)k5?%$E~_r4*8c^ccjA0{WX8v*;DwL@-#UT;&Z1*6OT$JoO7$VEYK8( zrbuR9joTiodL>uOx$DUrH>Acza#1~#?|2S3NCs`KRx+#B%gv>II(uWa=f+uGUCOL1 zg%~`MJ2@yh=Vjl<9i624nqyff`>lzbPdtsAlzGuCZHi6O>qu?qi65$vd6CLGE%H~{ zwB@>8Z&F#cQvO!isWiRiH$@Y8-v9sr literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xpm.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xpm.miff new file mode 100644 index 0000000000000000000000000000000000000000..327d9e7b19a86c9f4704aa18ab172071bcac934e GIT binary patch literal 4336 zcmaKudt8!t-^XvwBVyp7M=B5OxkW{gP!JRpEAWu!?q(Wb)-pwN3gU%`hGi=?Lk^aJ zlDE|yXk=TcnYOH_ZEYRaTx+Ye*7MX(<=Uy%-N8fM--}+)^V(m}2d>`*KYqXW_4$5( z-`{mnUXrp(UQ{N_DJm;3t{{_ZWr(W0N|6%BU}B0Zi&UzVH7c39q)Lc>CX=qRP!! ziBZD!U}PPeLu1mI7(}Khks;-Zve5WT(ZYBq#*-~Bu{Z()^fUx4? zxhN(+2~$#3BjXh#GB~BgGvnf81+Gs8O+uxY&4lEGLG+X0l>wTzX7g43ou*WhK*jtXN(WmBVN86XN-N7Kh79 zOjw<`l9nV&NKRiZrG<-;FQIf|Oies~6N%?Ol%hD5z^ZB(xZvBebO%2I8*_qiAku)c* zK%AccW`3ch{EeJ)>6VOwEo-H9X;Rf1+4{^a8}l`iELC1kMM1?DS@zq-dF7?z5^Y9V zow&L*UtP1Vws`g1rDfXsa(R_XA~6+id~ZYPvC_f=NVTC#jfx777X8XRTY`_$WAvIav_<1Ux>SnIak zpYLUd?&i~)`D{xvtt*9nm`6R595=>`8RfH1q@=Y9Io-=?U1?nXaz_6OTE8gaq=?&+ zCE6{{vWYS*d8<1m`8w&kj*5carMc$HGG}JmaPI04H)sdtQdf=q9FO)nk9Lt8bv~JO zgBvr+OSs91dbu?5UM%$&I`>C5?H3O3UJ~aimG(S_`)6G26L!+g6yaIH^68YcIa=m3 zzHo*w`Gb@9l3zM2sJ^f=>AEQShn4)#vNJAbi6_%V*H-1-SetoSoOfATeqFZyT2=ME zwDjq9;wNcY&sVMcWljEUdfAIi&Fs1@^Wxfj1ts@O3ZHGMm?^7yuG%_XRn?^K)NlJ> zxTb5@_6zg%&C}YZPs=SkTQ=_Ai|7t(IvovrT#DYk4UUub&v!O-{nOI2w{>^(c+)QD zp2K@Oj_or!-aFQG(2hEzJZzJCtn^u z_Giy09Y-cQ4qrTW>eGuK@9zHc1M9i*v5P1BUpDJs?(MjH#QxR9@UPQH?|(BsdFk9& zUrl^;?%vfOKb!jQ{)4G2(+{Q|{(SA;4?jJ=cYkJP`o)X+xtV`GeDvt2>woxSFjy?s z&kx?dZo&6JQWS|2#jI8JJBJQh90*chUt6b8DC(-TTFv4he?P3RhnKJ4k`+y7-%Lu% znOMz*uf8xJi^2VsLJD3?VN@!$&Ypt@9rg7{ZEYn`6jdsNCO8O(!C*Xm{QZN;JI=28 zds1Rq2G_#_b?~ZvWyTkS4F*xDA(a}fbH7DfUtbS|%F0T$#?bN(9*4zXyu5sTe0`U$ zxRU?(*Irx1<}6s?0rK=jTMu71(ie-x1(Qfi7KbagYMsvd+Nvs)Q7Knzw5{j)Bw)Z$ zA0L0;>|1Z=Cgzlt@fWx;o`69Q6y)K7#o@pXi4-EQ(rne%qOkxZjNG7U`TS}Qo9G1> zgJJ%j!ijHw{PFAWukwM5!MHpB*O8wu76#vJ4 z*f?KL4}Xwn%!Lcze=obbk>iEI;DT_zzWxjR{m}&Z`}#pruzt9uOPBgB4Ux;qYPA~@ zPF6R(^VZd?MVmMC1Hd4?oZY}}}9#4FYM50j8xgmL~ELF}%BhYt0= zcVc90?ER*PFJI2g&%b!|+IZT)EgZGb_B6Iovx9QkrQKMqvJ<@1<3r|{F7(TDfmD?90@2l@7}%p z-N$bx;qk1s*LEL9l!(q`HCnC4K3iv}S+Ca{2Vh^?2ebo&Cr3|=jgF2UZkhqg{LI6d zdB_MBi>E|!C-2<3d*}94-W%^6K7PbxH6R9)$!IbfVfucX(P}e8L`EHAN9_G4$4AFb zkDY6Zeuzdi|7>dcw(PtHf6l-c=NphTk_DwTWo=C`+RPG0%6$J*0vaP~ML33{{HY(xwe z6x60~Gg*#1bcj-k44gT6YW&pbM&7fzxu=gG&pv$`4WfcrD|63I<*ixS4K?9Z*$s9r zYQ@&s)zQ_d*PE?&Xv{{V11L)EnbW6FkM>^N^xI?Di$6Sm`p^xD21f~rZ%$tOsHV+& z&}C2>Oc1}`XfyBY?AqJW)6vyoc0rnSx&ecs4M9#m_~i7+@Mn?@=^IKeUAk~%8a0CY zS+*=8G56m1yFE^qvs!8B>2si2vDrEf92gyaw;iz`cj&=~(`xIqA|E{XWPIdMZ2HDc zvP+=rzoF5fl;~xQl~=Bv8h*FOWKbfeb|b8aW&hsJ&W?A-h7F2}YJ(F}t8$n-J8k;@ zUp^V@?WPr8xKL73QhMp@iDe8%bTqsZS7zsZduz{!!v{@vWeXInxzA`D8rs+1-qUT; zIgj)ocQ{N34_Mo6T{gY;m(wG?&Gf=en+i9T6kocO0RZqpO+0%xZ}QfS`>pmNi%F&Z zK-Ip_WbU*bKYo0$+tM+7dK}W?Fn8@Y8-Zd}Js9g9Sqzkd!s6ofKmmqeSwd=VUS9tH z{Qmpz*PD(FTTDpHfWEJ9-@f*?(klwE|<})N9=~tLDNu=Wxvg4Hd!oI*qJt4 zyK}s^w}BcFDUnDEBw}%LGKCTyotnG$A9+(ZZ~phK$sEq|)-zvx=&m!P(QenN1{``@ zSJ&RI4zSVz6@ymd;7IRbzlgxd^mXf`Qn5Ha88&oucJ3Sh$e)^=oSMAy4rlq%Ghck6 zgOY308}+(2sE_upt^-|N`ynDoi?Q8kG>!K5hI)F(T;8}&S^yY{#LFXyk_eD*^CzdK zCUaK^1ucW898mJ@cAcXQ&L)%PKu5=Zi`8Vc?6;!ZN_QL5<~cj$G1vF`714fdGTYCP7 zi}ZMiM=F&T;PE&Dg`It6>g?LJIRFtZ-wL6_O$kAaeF%Dwv08@)?GTOylIwt7RAC=I zvMrESeCd27AzccP0%>t{3@e5s5M<}Bvh#u}LMkAusIiS$MfdN6#c#;ZP~Fc{_^@ryl;dAWvnkQfDqgQ8_|?#4u9tnBhrRav=vHpFIy}|xEDCw6sYQo zx{A2Q#>Sl&=zj~s;s}!UpyFb2s$0TTflw%*5Q&tS7MD(E1P)T6Kuj)^N~KiP!p5>% z`|Q>5xDE@i)HLqcM)O`s2@E7i3IS3o7N-iAyE!6gITRv+&^S2M*4Acl*sHbZ_O4Th zRigi05EY_yL&7!c#vMD;Bl(diWqrZ=QdlK{FjXkZ6bXfyB9SO2B2e9bS%u&{6xg&GMDA*;7FzQds>(+GHMV0vLeae-JWP6b42stA3FQiXyD=Jw|P zeuv!-K3rCZp{kNBhuL9ab5Q)TqAZ%nou^1J^gTBE?YSW{+ zxhJ0!34tCiiHXS|EDTua?Xv(V z9^i;bBoI^B-rxk3nwH|G%szhn6sDsDw`PCd$$UK|gb~7EFsOnELc}Uwz(Q2;=gG^< z(-Vz~KwRYGw(@^oW`CPTGy4kh>NNZ0=Veh*%cv9z4=7NV3-Jqy3l}XU5`BEU7Ayca zM4~qzwSubb5iIlLpQoR{nvAyd?%-yhWJN{AP$MHFB4dRyF@OUCszm@I(CLukfPVvF CG5h}j literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xwd.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xwd.miff new file mode 100644 index 0000000..85525c0 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xwd.miff @@ -0,0 +1,9 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=RGB +resolution=72x72 +page=70x46+0+0 +Comment={input.xwd} + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT(cNv_)9R`X!gG15t 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:::ppp...333vvvrrrJJJ XXX '''___~~~///rrraaawwwMMM JJJ 000 + + +dddOOO"""NNN]]] 555PPPXXX%%%mmmyyy}}}NNN,,,??? 555 DDD[[[444xxxKKKwwwOOOjjj888XXXJJJ```fff"""uuu(((yyy,,,RRR999$$$ OOOTTT + + +333nnnTTT + + +333...555TTT + + +333xxx OOO IIIcccRRRsss+++RRR,,,TTT + + +333&&&iii gggvvv}}}TTT666kkk<<>>[[[111nnnZZZ+++ !!!:::%%%,,,UUUKKK)))///]]]yyy111xxx!!!ggg'''///QQQFFF 555...'''///QQQ >>>!!! NNNnnnFFF111!!!EEE&&&&&&]]] + + +yyy111***vvv///&&&{{{nnn777qqq 000PPPbbb'''zzz}}}999oooNNNpppVVV```]]]AAA222pppVVV```RRRIII000PPPCCCIII444pppVVV```]]]SSS!!!777~~~nnnFFF + + +BBBddduuukkkxxx fffQQQ\\\pppVVV```000$$$;;;!!! (((###III111"""777MMMBBB<<<&&&888JJJ + + +%%%]]]qqqLLLGGGqqq,,,XXX,,,===>>> ...}}}...ssszzz %%%ZZZ<<>>^^^(((www::::::vvvAAAhhh + + +!!!LLL  ***eee$$$LLLfff+++zzzPPPEEEiiiAAAIIIppplllzzzVVV---???###nnn<<>>[[[OOOaaa ggg^^^fff???---%%%```CCCuuuBBB'''kkkPPP333,,,ddd,,,BBBllleeemmm%%%888...'''###999&&&222TTT```EEEXXXwwwttt777$$$===QQQjjj555%%%lllgggCCCrrr777 555\\\ + + ++++nnnEEEMMMjjj888UUUrrr??? 666ccc~~~'''XXXVVV777iiiDDD"""AAA$$$###---xxx222BBBHHH)))777KKK hhh===nnnddd:::www555JJJOOO~~~TTT+++[[[777fff///uuuppplll111EEE*** TTT!!!777bbbFFF888\\\CCCUUU\\\```555wwwJJJ```TTT::: FFFIIIMMMLLL%%%VVVJJJXXX jjj[[[}}}>>>000555eee}}}uuu777KKKnnnccc rrr ;;;SSS !!!,,,{{{nnn>>>MMM???***000LLL + + +QQQ```LLLlll|||@@@???eee@@@QQQ\\\222 QQQDDDsssUUU 444ggg ,,,hhhwww  llluuu%%%&&&ooo111///DDD###bbb[[[>>>$$$aaa\\\!!!YYY000777 NNN444TTT777###>>>lll$$$HHHvvvAAA000$$$DDDEEE}}}ppp666lll:::ooo---GGGaaannn[[[gggsssKKK111ttt>>>zzz>>>nnn|||vvv[[[nnnJJJlll111TTTpppJJJ555 &&&---DDD>>>HHH@@@JJJ ///111___JJJBBB ddd&&&mmmwwwGGGSSSTTT///SSSOOOtttCCCFFFddd===GGG + + +))) + + + ~~~///DDDUUU(((***###pppCCC***--- )))+++!!!YYYsssCCC:::^^^[[[uuu999DDD]]]&&&nnn222fff 999<<<$$$MMM ```]]]{{{"""eeeOOO %%% &&&SSS???&&&KKKpppMMMJJJ888)))@@@tttZZZ222ppp444VVV>>> + + + 999___eee~~~KKKsssDDD WWW EEECCC{{{###???ttt$$$PPP<<>>222 XXX ttt<<>> 111tttooogggIII---fff111777uuu&&&MMM,,,UUU hhh 000999 XXX + + +^^^UUU///@@@dddYYYZZZgggVVVAAA___999UUU,,,RRR<<<bbb***555000```$$$rrrkkk gggJJJyyylll JJJ444xxxKKKwww gggvvv}}}bbb===!!!^^^^^^"""}}}JJJmmm666###qqqCCCPPP:::CCCPPPCCCPPPPPPLLLCCCPPP))) + + +]]]OOOUUUcccYYY~~~OOOUUU{{{OOOUUUPPP~~~cccYYY~~~PPP~~~cccYYY~~~ cccYYY~~~&&&999\\\___AAAFFFiiiGGGNNN666qqq&&&___AAA___kkk + + +___AAA222888 /// + + +222 + + +dddBBBIIIRRR888 ???/// + + +lllGGGNNN222888 222 + + +dddBBBIIIlllGGGNNN___...////// + + +iiiXXXDDDBBBnnnooo///222 + + +ddd/// + + +RRR888 ???^^^FFFXXXDDDBBBnnnooo///FFF^^^222 + + +dddBBBIIInnnooo///222 + + +dddBBBIIIlllGGGNNN___...////// + + +RRR888 ???222 + + +ddd___...///III'''444111HHHFFFRRRDDD>>>444111<<< '''444111111iiiyyy eee YYY^^^---pppyyy RRR111iiieee YYY^^^RRRoooqqq yyyJJJ)))eee yyy ---pppqqq yyyJJJ)))HHHFFFvvv[[[222eee YYY^^^yyyJJJ)))eee YYY^^^RRRooo ---ppp,,,777eee  ___LLL===///bbb888UUUTTT^^^ttt)))^^^NNN[[[WWW'''BBBtttCCC^^^^^^NNN[[[,,,ttt666###rrr + + +vvv```^^^tttCCCWWW'''gggRRR@@@###rrr + + +vvv___}}}^^^NNN[[[###rrr + + +vvv```^^^NNN[[[,,,tttCCCWWW%%% + + +!!!^^^,,,sss%%%222 [[[222)))```jjjkkkCCC\\\,,,ddd + + + + + +[[[222))) [[[222)))KKKEEEUUU)))}}},,,uuu:::###}}}CCCKKKEEEUUU,,,,,,uuu:::CCC)))}}} + + +vvvsss<<<***,,,uuu)))}}} + + +vvvsss<<<]]]jjj\\\,,,,,,uuu:::sss<<<***,,,uuu:::CCC)))}}},,,,,,uuu"""xxxPPPwwwaaa&&&kkk ggg111III...,,, mmmYYY + + + KKK 888ZZZ777777ccc KKKggg + + + 888gggEEEEEE KKKPPP###sss + + +JJJsss KKKZZZ777777cccWWW PPP###sss + + + QQQ NNN 888###sss + + +QQQ888gggEEEEEE KKKZZZ777777 :::QQQEEEEEEddd)))&&&&&&  + + +666iii[[[yyy444AAA???VVVmmm888___===[[[yyy444SSS[[[yyy444BBB***QQQ333 + + +aaawwwlllsssrrrPPPGGG333 + + +aaammmBBB***QQQwwwlllsssrrrmmmQQQ333 + + +aaa555888<<<)))wwwlll333 + + +aaaPPPGGGZZZ```555888<<<)))AAA???VVVooo555ccctttlllsssrrr888<<<)))wwwlll|||rrrmmmQQQ333 + + +aaaPPPGGG333DDD222wwwlllQQQ,,,iii))))))LLLccc ccc 666bbbbbbPPP KKKKKKKKK111JJJ111JJJ$$$rrrwwwnnnuuuQQQ... rrrvvvttt vvvvvvttt ttt ttt JJJyyywwwUUU```HHHRRR + + +EEEyyy + + +,,,rrr + + +,,,UUU + + +,,,)))rrr)))rrrNNNZZZrrr """TTT333vvvrrr///rrrJJJrrr/////////444xxx]]] 555}}}NNN,,,EEE 555 555[[[}}}NNN,,,EEE[[[}}}NNN,,,EEE DDDPPP}}}NNN,,,EEE ===(((yyy+++ IIIcccyyyyyyRRR,,,TTT + + +333555TTT + + +333 IIIcccRRR,,,555 IIIccc OOOTTT + + +333TTT + + +333sss+++999555555 IIIccc OOOTTT + + +333 OOO"""}}}<<<:::333 ---333dddXXX[[[ hhhAAAMMM ---333dddqqqlllqqq ---333ddd + + +@@@LLL===555===ppp + + +@@@hhh LLL===555hhh!!! + + +@@@YYYNNN888333555 ```333^^^BBBLLL=== + + +@@@===ppp + + +222YYYNNN888333555 ```333^^^BBBXXX[[[ ???QQQLLL===555888333555 ```333^^^BBBLLL===555hhh!!! + + +@@@===pppVVVSSSxxxLLL===!!!,,,QQQyyynnnrrr&&& ;;;zzz666ttt vvvKKKyyyUUUrrr + + +ggg///CCC EEEqqqiii + + +UUUrrrggg///CCC EEEqqqFFF}}} + + +ccc,,, ggg///CCC  + + +iiiuuuccc,,, nnnrrr```tttOOOSSSggg///CCC EEEqqq,,, ggg///CCC EEEqqqFFF}}} + + +iiiLLL===ggg///CCC FFF}}}/// 555nnn>>>!!!FFFYYY!!!iii$$$ 555tttbbblll 555tttFFF111ggg'''///QQQ]]]yyy###\\\UUU>>>111FFFFFFggg'''///QQQ]]]yyyFFF111nnn%%%,,,UUUggg'''///QQQ000###\\\UUU>>> nnn%%%,,,UUU>>>!!!ggg'''///QQQ]]]yyy%%%,,,UUUggg'''///QQQ]]]yyyFFF000###\\\UUU>>>!!!EEEggg'''///QQQ]]]{{{nnn777??? + + +BBBddd!!!AAA777bbb'''777QQQ\\\pppVVV```aaaIII444222pppVVV```!!!QQQ\\\III444!!!SSSpppVVV```xxx fffCCCpppVVV```QQQ222~~~nnnxxx fffCCCFFF + + +BBBdddzzz}}}III444CCCIII444!!!SSSpppVVV```QQQ222000$$$;;;!!!SSS BBB LLL444www)))...ssszzz LLL```,,,LLLbbbNNN444CCCGGGqqqOOO%%%ZZZ<<<)))NNN444IIIGGGqqqOOO)))...www)))BBB"""IIIGGGqqq """ZZZ<<<www)))BBB"""www===IIIGGGqqqOOO"""IIIGGGqqqOOO)))... """ZZZ<<<EEEIIIGGGqqq...sssfff$$$JJJ111kkkWWW!!!ZZZQQQ;;;111xxx ///111===GGG + + + """***CCCBBB333 + + +!!!===GGG """***CCCBBB!!! + + + )))sss999qqq """ + + +bbb333 )))sss999qqqkkkWWWCCC### """***CCCBBBsss999qqq """***CCCBBB!!! + + +bbb333000555;;; """&&&MMM"""xxx'''999+++tttTTT + + +------*** + + ++++tttPPPooo===777+++tttTTT$$$MMMOOOeee555444111[[[OOOeee---$$$MMM555444---000OOOeee'''KKK555dddOOOeee111[[[222sss'''KKK + + +'''555444'''KKK555444---000OOOeee111[[[ 555000&&& FFF<<<333$$$---***LLL777bbbDDD333$$$JJJ###333$$$ UUUEEElll ,,,,,,:::EEERRRlll 777 UUUEEE,,,,,,:::777ooolll qqqLLLSSSNNNNNN,,,RRRlll EEERRR%%%qqqLLLSSSNNNNNN---***LLLOOOooo[[[,,,,,,:::LLLSSSNNNNNN,,,,,,:::777ooolll EEERRR + + +QQQqqq```,,,oooUUU,,,000```zzzkkk333333///aaaaaa)))))))))&&& &&& + + + + + + + + +EEEYYYEEEYYYdddBBB"""mmm111mmmmmm111111444111TTT%%%IIICCCIIICCC]]] UUU+++RRRhhhXXXQQQhhh,,,hhhXXXQQQXXXQQQ888XXXQQQRRR&&&---@@@ KKK... KKK... ***bbb>>> kkk ggg&&&))){{{jjjlllZZZ<<<jjjvvvjjj333TTT '''TTT lllZZZ<<<333'''lllZZZ<<>>ddd$$$&&&BBByyysssuuuPPPhhh000HHHFFFiii---000>>>ddd$$$&&&BBByyysssHHHggg)))hhh000lll"""}}}@@@lll000>>>ddd$$$hhh000uuuPPP ___lll"""}}}@@@lll--- xxxWWW...000>>>ddd$$$&&&BBByyysss@@@lll000>>>ddd$$$&&&BBByyysssHHHggg)))hhh000uuuPPP(((RRR000>>>ddd$$$ggg)))gggvvv}}}666kkk<<<fff'''555444555$$$DDDKKKddd--- '''555444{{{  !!!ccc'''555444kkknnnxxxOOO ```kkkOOOkkknnnxxx ```OOOhhh%%%MMMTTT + + +mmm--- OOOkkkppphhh%%%MMMTTT + + +mmm---555$$$DDDWWW}}}111&&& ```TTT + + +mmm--- ```OOOkkkuuuqqq;;; JJJmmm111ccc{{{[[[MMM^^^(((!!!AAA + + +>>>CCC[[[qqqKKK[[[DDDIII^^^ FFF>>>XXXIII^^^(((DDD FFF>>>(((ppp>>>III^^^ggg,,,(((222 FFFIII^^^XXXGGGggg,,,(((222MMM^^^ FFF>>>222 FFF>>>(((ppp>>>III^^^XXXggg}}}NNN FFFppp>>>))) + + +@@@000444555!!!>>>,,,}}}XXXhhhddd555!!!VVV555!!!))) + + +>>>bbb---;;;MMM hhh))) + + +>>>bbb---;;;MMM  111iii___III(((BBBOOO---;;;MMM hhhdddiii___III(((BBBOOO>>>,,,aaa |||---;;;MMM III(((BBBOOO---;;;MMM  111hhh---;;;MMM 111&&&]]]999jjj + + +555]]]999jjjbbbddd(((999jjjtttccc@@@iii,,,XXXQQQaaa:::[[[<<<BBB@@@iii,,,tttcccXXXQQQaaa:::[[[@@@iii,,,nnn...pppXXX@@@iii,,,<<<BBBnnn...ppp + + +XXXQQQaaa:::[[[...pppXXXQQQaaa:::[[[@@@iii,,,<<<BBBFFFKKKXXXIII"""777MMMBBB<<>>rrr888>>>rrr///CCCKKKKKKeee,,,777,,,777,,,```222222AAAKKK,,,hhh,,,hhhYYYYYYYYYHHHHHHHHHbbb$$$bbb$$${{{]]]AAA$$$ UUU777444 + + +777777444 + + +444 + + +444 + + +```;;;LLLPPP111CCCPPP999PPPfff111CCCfff111CCC555\\\###MMM111CCC\\\... + + + ooo(((YYY (((ooooooooo'''QQQddddddKKKdddjjj jjj  nnn###YYY>>>""" qqq"""  """ mmmqqqmmmqqqYYY qqqHHHuuuSSS???eee```TTTGGGFFFLLLUUU???eee```TTTGGGFFFUUU???eee```TTTGGGFFFwww%%%qqq???eee```TTTGGGFFF fffrrrmmm\\\KKK777|||999###jjjppp"""XXXrrr(((rrr(((mmm\\\KKK777ppp"""XXXmmm\\\KKK777rrr(((rrr(((777 fffrrrmmm\\\KKK777rrr(((rrr---...LLLVVV uuummm !!!JJJppp&&& uuu---VVVmmm !!!JJJ---  uuu uuuppp&&&{{{rrr&&&mmm !!!JJJmmm !!!JJJ---  uuuppp&&&"""'''bbb!!!###]]]###222999$$$]]]---FFF'''bbb!!!###555555[[['''bbb!!!###&&&NNNCCC>>>UUU&&& 888KKK;;;***yyy///qqq>>>999$$$]]]&&&NNNCCCUUU&&& 888KKK;;;999$$$]]]777```BBB[[[>>>$$$SSS"""666[[[OOO]]]zzz999888UUU&&& 888>>>***yyy///qqq###$$$SSS"""666[[[OOO]]]zzz999888]]]###222iiiUUU&&& 888KKK;;;[[[OOO]]]zzz999888UUU&&& 888KKK;;;999$$$]]]777```BBB[[[>>>***yyy///qqq>>>UUU&&& 888111OOO---===jjj)))333yyy111OOOvvv 111OOOaaa###BBBzzz ===ttt---fff###BBB===aaazzz ======yyy TTT###BBB ///555```~~~AAAzzz ###BBBttt---fffzzz ///555```~~~AAA---+++zzz ===555```~~~AAAzzz ======yyy TTT###BBBttt---fffzzz IIITTTCCCfff uuu&&&PPP ??? ^^^\\\CCCfff  :::CCCfff ZZZ;;;{{{..."""]]]ZZZeee)))lll999%%% ###"""]]] ZZZ;;;{{{...ZZZeee)))lll999%%% ,,,bbb"""]]]222 + + +ppp::: ZZZeee)))"""]]] ### + + +222 + + +ppp::: uuu&&&PPP333ZZZeee)))lll999%%%ppp::: ZZZeee)))lll999%%% ,,,bbb"""]]] ###333 qqqZZZeee)))BBBYYY111CCCsssRRRUUUNNNBBBYYY111RRR + + +PPPBBBYYY111ZZZ>>> + + +;;; *** + + +III ;;;RRRUUUZZZ>>> + + + *** + + +RRRUUUjjj;;;JJJ///www,,,999((( ;;;III oooJJJ///www,,,999(((CCCsss:::\\\ }}} *** + + +///www,,,999((( *** + + +RRRUUUjjj;;;III >>> KKK\\\,,,hhhrrr/// jjj444SSS||| + + +ppp jjjjjjJJJ jjj555fffuuu444]]]"""...\\\hhh:::uuu444555fff]]]"""...333MMMuuu444fffiiiDDD}}}]]]"""...uuu444\\\hhh:::fffiiiDDD}}}444SSSrrr kkk]]]"""...DDD}}}]]]"""...333MMMuuu444\\\hhh:::\\\WWW]]]"""...RRR[[[###ppp]]][[[===vvv$$$ooo---JJJppp]]][[[888 yyyppp]]][[[cccmmmkkk{{{ + + +555 ]]]QQQcccmmm$$$oookkk{{{ + + +555 ]]]$$$ooocccmmm666...bbb$$$kkk{{{ + + +cccmmmQQQ|||SSS666...bbb$$$===vvvHHHEEEkkk{{{ + + +555 ]]]...bbb$$$kkk{{{ + + +555 ]]]$$$ooocccmmmQQQUUUkkk{{{ + + + dddOOO '''aaa{{{...fffLLL888+++ '''PPP||| '''444:::LLL +++BBBIII444oooLLL +++444:::BBBIIIDDD LLL +++gggcccBBBIIILLL +++444ooo gggcccaaa{{{...BBBIIIgggcccBBBIIIDDD LLL +++444ooo + + +???~~~BBBIIIDDDOOO```fff000{{{tttVVV@@@^^^ jjj FFF'''ZZZtttVVV)))(((tttVVVZZZ]]]xxxuuu444<<<>>>}}} ``` ZZZ]]]xxxxxx444<<<>>> &&&'''fffFFFxxx444<<<}}} ```www***&&&'''fffFFF@@@^^^VVV|||xxx444<<<>>>'''fffFFFxxx444<<<>>> }}} ```:::CCC xxx444<<<TTTrrrOOO LLLzzz RRR???444GGGPPP LLLzzz222 LLLzzz---~~~)))???mmm QQQeeerrr~~~)))???uuuRRR--- QQQeeeRRRfffHHH~~~)))???uuu YYYTTTAAA QQQ~~~)))???uuurrr + + + YYYTTTAAA lll QQQeeeTTTAAA QQQeeeRRRfffHHH~~~)))???uuurrroooyyy QQQfff]]]555dddYYY\\\~~~cccSSS[[[FFF\\\444yyy~~~ccc XXX666~~~ccc\\\ccc999ZZZ]]]NNNddd777 + + +lll999\\\cccZZZ]]]NNNddd 999JJJ]]]888yyyZZZ999777 + + +lllnnnJJJ]]]888yyySSS[[[FFFeee ZZZ]]]NNNddd]]]888yyyZZZ]]]NNNddd 999777 + + +lll***??? ZZZ ***+++rrrVVV```///!!!zzz~~~vvvVVV```"""SSSVVV```rrroooHHH[[[kkk|||ooo///!!!rrrHHH[[[kkk///!!!===ooo + + + MMM HHH[[[ooo|||MMM + + + MMM zzz~~~HHH[[[kkkMMM HHH[[[kkk///!!!===ooo|||vvvHHH[[[yyy111***>>>yyyfffrrr///888 OOOyyyiii yyy333NNN444@@@mmm666'''333NNN444@@@mmm666666,,,(((ZZZ111}}}444@@@mmm'''rrr,,,(((ZZZ111}}}fffrrr///vvv???444@@@mmm666ZZZ111}}}444@@@mmm666666'''ppp 444@@@mmm666111&&&888JJJRRRNNN!!!###!!!)))bbb///RRRNNN cccRRRNNN + + + + + + JJJiii!!! + + +!!!))) + + + JJJiii!!!!!!)))### + + +???~~~SSS JJJiii666111}}} + + + ???~~~SSS!!!### JJJiii!!!~~~SSS JJJiii!!!!!!)))### + + +333hhhvvv JJJiiiGGGPPPlll:::!!!jjj...222888FFF  999___vvv (((PPP)))<<<___vvv 999 (((PPP___vvvXXX}}} www444uuu 222______vvv)))<<<XXXXXX}}} www444uuu (((PPP www444uuu (((PPP___vvv)))<<<  www***(((uuuAAA"""QQQ000FFF***111???"""QQQ000FFF"""QQQ000FFF/// eeeeee...111xxx$$$ eee***111///eee...111xxx***111/// eee|||YYYvvvkkk$$$sss eee... eee$$$888|||YYYvvvkkk$$$sss jjj999eee...111xxxvvvkkk$$$sss eee...111xxx***111/// eee$$$!!!WWWeee.../// 111RRR~~~((( nnn...___ lllLLL@@@ + + + &&&&&&!!! EEE :::777!!!&&&&&& EEEuuufff!!!___444PPPFFF{{{yyyxxx!!! :::777www ___444PPPFFF{{{yyynnn...___ NNN''' EEEPPPFFF{{{yyy EEEuuufff!!! :::777(((uuufff333"""dddsssTTTmmmlll444]]]DDDLLL%%%)))666RRR"""uuu|||<<<,,,DDD444}}}444]]]DDDLLL&&&yyyfff <<<444]]]DDDLLLeeeOOO'''aaajjj"""!!!VVVkkk&&&***QQQ^^^'''aaa|||<<<eeeOOOjjj"""!!!VVVkkk&&&***QQQ|||<<<###'''aaaAAAkkkRRR111jjj"""!!!VVVPPP'''aaa^^^555bbbAAAkkkRRR111%%%)))666RRR"""uuubbb"""jjj"""!!!VVVkkk&&&***QQQAAAkkkRRR111jjj"""!!!VVVkkk&&&***QQQ|||<<<###'''aaa^^^ggg %%%wwwjjj"""!!!VVV###:::KKKyyyKKK___fff kkkfffccc + + +::: + + +:::MMM ZZZJJJ666<<>>;;;>>>WWW000BBB~~~WWW000{{{;;;>>>;;;>>>UUUJJJ333DDDrrrwww wwwMMMwww>>>\\\&&&///PPP***\\\ >>>&&&///PPP @@@>>>\\\\\\***RRR]]] DDD'''qqq+++WWWyyy999CCC ===UUUlllzzz [[[555 + + + NNNqqq+++WWWvvvPPP777KKKqqq+++WWW~~~ + + +@@@hhhEEEmmmaaa555HHH\\\###bbblll(((^^^EEEmmmCCC ===UUUlllzzz~~~ + + +@@@hhhaaa555HHH\\\###CCC ===UUUlllzzz+++VVVGGGEEEmmm}}}"""000 777 mmmEEE|||aaa555HHHEEEmmmbbblll(((^^^KKK}}}"""000 777 mmmEEE|||yyy999vvvEEE@@@444yyy111IIIbbbzzzwwwFFF$$$ hhhddd@@@ + + +;;;fff@@@;;;DDDYYY~~~BBB???111IIIbbbzzzwww;;;DDDYYY~~~BBB111IIIbbbzzzwww ###888HHH%%%KKKyyycccrrr>>>YYY~~~???EEE888HHH%%%KKKyyycccrrr>>>444yyyqqq ZZZYYYppp'''LLLccc>>>\\\...ppp'''OOOVVV)))ppp'''###+++)))RRRXXXZZZ444JJJXXXccc>>>###+++)))RRRZZZ444ccc>>>"""(((dddXXX&&&LLLUUU ZZZXXXJJJFFF&&&LLLUUU LLL tttZZZZZZ(((NNN pppaaa@@@UUUppp(((NNN|||:::hhhBBBFFF(((NNNfff"""""":::AAA999FFF;;;"""fff""":::AAA999FFF"""FFFCCC444hhh***""":::AAA""";;;///FFFCCC444hhh*** pppaaa>>> FFF\\\000^^^nnnGGGHHHmmm }}}EEEFFF\\\000111999RRRFFF\\\000!!!<<<OOO + + +|||}}}HHH jjj OOO + + +GGGHHH!!!<<<|||}}}HHH jjjGGGHHH...OOO + + +oooFFF + + +###|||}}}HHH OOO + + + FFFoooFFF + + +###^^^nnn"""lll}}}XXX|||222,,, yyy III666$$$ bbbTTTiiiooo >>>|||XXX"""mmmrrrJJJOOO((( EEE///XXX""">>>|||mmmrrrJJJOOO((( XXX"""ddd###hhhmmmrrrJJJXXX""" EEE///ddd###hhhyyy III!!!???mmmrrr ooozzzKKK)))OOOvvvyyy  ooo {{{ + + + ooovvv (((KKKRRRLLLmmm555 nnnKKKRRRLLL)))OOOvvv (((mmm555 )))OOO@@@VVVKKKRRRLLL%%%mmm555KKKRRRLLLnnnIII%%%zzzKKK//////BBB!!!]]] + + +___222LLL333 + + +___EEE gggeeeZZZ + + +___ZZZ444mmm''')))JJJWWW"""SSS444mmmZZZ''')))JJJWWW + + +444mmmEEE444'''444mmm"""SSSEEE444222~~~ooojjjxxx###VVV""" +++YYYjjjxxxIII+++jjjxxx'''PPP ###>>>lll VVV'''PPP ###>>>lllVVVYYYNNN###xxx ###>>> MMMWWWNNN###xxx###@@@GGG  JJJjjjMMMRRR:::hhhDDDVVV JJJ&&& JJJYYYUUU666666```WWWjjjYYYUUU666666```jjjDDDYYYUUU666WWWDDDYYYUUU&&&)))wwwnnn"""GGG111DDD___\\\zzz---kkk111111LLL111%%% %%%555JJJgggjjjiii%%%555JJJ\\\%%% gggjjj\\\|||%%%555JJJ%%%NNNtttggg%%%555JJJiiiPPP%%%NNNtttDDD___QQQqqq```wwwUUU```HHH222$$$FFFGGG 222$$${{{ )))222$$$;;;BBBoooRRR???AAAXXX888ZZZGGG;;;BBBoooRRR???AAAXXXGGG999###JJJuuu<<<RRR???888ZZZ}}}###JJJuuu<<<FFF555RRR000"""TTTKKK%%%LLLuuu```|||444eee,,,LLL iiiLLL,,,fff{{{$$$666VVVJJJ777555{{{$$$666VVV```,,,fffJJJ777555```{{{$$$666VVVXXX}}}***CCCJJJ{{{$$$666VVVTTTXXX}}}***CCCuuudddBBBjjj888XXX111222 lll>>>000RRRppp)))yyyZZZ111222 xxx[[['''???111222 111YYY;;;yyy}}}333NNN;;;nnn###---ccc;;;yyy}}}000111YYY333NNN;;;nnn000MMM...;;;yyy}}}%%%hhh 666333;;;yyy}}}###---ccc333%%%hhh 666lll>>> @@@KKK666kkk<<<===wwwjjjeeeOOO]]]aaa)))@@@ kkkjjjeee 333+++ooojjjeeeeeeNNN + + +111eeeZZZ $$$eeeaaaNNN + + +111eeeZZZ aaaeee000 + + +zzzNNN + + +111eeeZZZeee$$$^^^000 + + +zzzOOO]]]wwwyyy]]]NNN + + +111eee111ccc<<<:::nnn %%%LLL000&&& AAA %%%LLLxxx %%%LLLFFFCCC + + +  + + + XXX---!!!www + + + &&&FFFCCC + + + XXX&&& + + + 111,,,WWW___999{{{ + + + + + + ---!!!www111,,,WWW___999{{{000|||@@@000,,,BBBIIIFFFaaaZZZ!!!BBB sss BBB{{{ + + +\\\TTT+++ggg222 + + +aaa{{{\\\TTT+++gggaaa;;;~~~ + + +---\\\ + + +222:::---IIIFFF~~~vvv]]]///999GGGsss)))000 sssXXX;;;iiisss999...777PPPHHHgggiii666"""777PPPHHH)))999...gggiii)))777PPPHHHZZZDDDQQQggg + + +///777PPPHHH666"""ZZZDDDQQQ666"""777MMMBBB<<<]]](((777///\\\kkk(((ZZZNNN\\\((( + + +QQQaaa%%%(((222RRR888KKK///%%%\\\ + + +QQQaaa(((222RRR888\\\UUU%%%<<<333(((222RRRUUU%%%KKK///<<<333777/// (((222RRR[[[BBB ddd***:::XXX;;;***$$$***777bbbzzz...666???))) + + +:::777bbbzzz...666:::DDD@@@VVV&&&VVV444zzz???))) + + +YYY888@@@VVV&&&VVV444)))JJJzzz===fff$$$XXXxxx}}}OOO%%%...sssVVV///+++RRRxxx}}}===xxx}}}///222///&&&///sssVVV222sssVVV'''///KKKnnn222//////&&&KKKnnnOOO%%%...}}} + + +FFF~~~'''000 rrr[[[777... ~~~ '''VVV DDD+++777888kkk888vvvDDDuuu888kkkDDD+++777888vvv888kkk???zzzMMM!!!~~~ttt,,,555888(((888kkkDDDuuu???zzzMMM!!!~~~ttt,,,555rrrddd + + +GGGWWW^^^555 FFFppp^^^ |||WWWrrr###kkk(((|||???KKKQQQ&&&333sss!!! |||WWWgggKKK"""555{{{ |||WWWjjj ???NNNxxxBBB&&&kkk::: !!!MMMwww,,, 111TTTrrrBBB&&&kkkKKKQQQjjj ???NNNxxx::: !!!MMMwww,,, 111TTTKKKQQQBBB&&&kkk!!!999iii::: !!!MMMrrrBBB&&&kkkrrrAAA:::!!!999iiirrr###kkk(((|||???OOO,,,::: !!!MMMSSSSSSbbbGGGHHHbbbFFF444999CCCFFF444mmm  CCC ;;;;;;SSSSSS((((((000 000 ]]]ttt]]]tttEEEEEEEEEfff222cccfff222cccLLLLLLLLLXXXXXX222qqq555 ]]]222222===qqq555 ]]]===qqq555 ]]]WWWBBBWWWBBBWWWxxx222xxxxxx:::222:::222lllOOO222 666 ...666...666aaa@@@ YYYrrrBBBrrrrrr888BBB888BBBwwwQQQ+++ XXX + + +ttt + + +$$$ttt + + +vvvHHHwwwhhhRRR www))) www555hhhRRR555hhhRRReee333 + + +mmmmmm TTT888___:::AAA222vvv888___222vvv888___{{{ MMMlllllllll777|||jjjHHH///aaajjj///aaajjj^^^lll ~~~ + + +lll >>>444lll ~~~ + + +~~~ + + + + + +111___hhh(((hhh + + + ```TTTHHH;;;..."""yyy$$$KKKhhh + + + ```TTTHHH;;;..."""$$$KKKhhh + + + ```TTTHHH;;;...""" lll...ZZZ222ccclll...lll...TTTZZZ222cccTTTZZZ222ccc$$$SSSiii///RRRBBBUUU666===[[[xxx===[[[///UUU666///AAAqqq ===[[[===%%%nnn===kkkHHHjjjnnn===ooo333nnn===<<<~~~ ppp```***///XXX}}}~~~ pppHHHjjj<<<```***///XXXHHHjjj>>> ~~~ ppp~~~ YYY###jjj___###KKKmmm"""RRR + + +KKK###___###mmm"""RRR###'''KKKKKKJJJuuunnnHHHmmm777PPPsss:::!!! YYY''' + + +^^^999 + + + ;;;YYYHHHmmm777PPPXXXqqq + + +;;;nnnHHHmmm777PPPzzzcccOOOyyymmmCCC OOO000666}}}CCCHHHOOOyyy''' + + +^^^zzzcccmmmCCC OOO000666''' + + +^^^qqq&&&cccOOOyyy >>>ttt + + +HHHIIIWWWWWW///NNNmmmCCC OOOOOOVVV SSSnnn^^^nnnzzz777cccNNN VVV SSSTTTggg!!!VVV SSSvvv888 >>>HHH000eeevvv{{{ggg^^^nnnzzzvvv888 >>>HHH000eee^^^nnnzzz ^^^ppp```000kkk>>>HHHqqqLLLnnn aaafffHHH xxx aaa + + +BBB$$$777+++nnn aaaRRRssshhhDDDhhhRRRsssDDDUUU <<<hhh}}}SSS;;;SSSCCCwwwSSSDDD + + +GGG [[[FFFyyy  + + +GGG LLLpppaaa  + + +GGG <<<<<< lll!!!(((hhhjjj%%%WWWxxx777lll!!!yyy<<<<<< (((hhhjjjyyyJJJlll!!!vvv^^^GGG'''555(((lll"""jjj///ZZZqqq777:::### ///777jjj///BBBjjj```jjjqqqDDD>>>)))DDD444uuu BBBjjj```jjjqqqDDD>>>)))DDDWWWTTTqqqiiiFFF777 qqqDDD>>>---ggg>>>&&&222@@@QQQjjjPPP)))***ggg>>>&&&222"""ggg>>>RRR{{{ ///>>>[[[AAA]]]eee111```///ggg ///QQQRRR{{{>>>[[[AAA]]]eee111```QQQUUU ///mmmttttttXXX@@@...>>>[[[AAA /// + + +YYY###ccc'''(((]]] 999OOO###)))'''zzzMMMYYY###FFFTTT...:::)))"""SSS***...:::(((FFFTTT)))"""SSS(((]]]:::...:::lll~~~TTT@@@rrruuu)))"""...SSSggg(((ppp + + + )))222JJJOOO (((ppp + + +ZZZ^^^ (((ppp + + +mmmHHH+++fff%%%\\\*** fff:::111cccHHH+++fff)))mmm%%%\\\*** fff)))HHH+++fffkkk)))===III%%%\\\***HHH+++WWW nnneee666 tttlllWWW nnnkkk333qqqTTTWWW nnnPPP+++???WWW888sssXXXwww===WWW666PPP+++???888sssXXXwww===666iiiDDDWWWlll%%% <<<XXXBBB888sssXXXwwwzzzEEEsss  '''EEEsss sssPPP""" cccdddRRR + + +WWW666[[[333jjj777  PPP"""cccdddRRR + + +WWW666[[[ ooo mmmTTTUUU&&&;;;cccdddRRR ___}}} + + +kkk'''[[[FFFVVV~~~iii___}}} + + +kkkOOO___}}} + + +kkk***nnn;;;;;;TTT}}}???GGGpppnnn;;;[[[FFF***;;;TTT}}}???[[[FFFzzznnn;;;ooovvv666UUU...;;;TTTnnn%%%(((ttt111sssxxxyyy}}} + + +HHH(((tttsssBBB(((ttt%%%yyy&&& + + +&&&DDD YYYsss///$$$::: + + +&&&DDD%%%yyy&&& YYYssssss + + +&&&DDDrrrBBBYYYHHH''' YYY + + +&&&DDD555mmm ``````AAA000UUUXXXEEE===,,,mmm ```;;;mmm ```"""BBB~~~nnn%%%hhh YYY~~~000UUU"""BBBnnn%%%hhh000UUU777~~~vvv&&&(((@@@nnn%%%~~~ + + +BBB|||///ggg---???GGG--- + + +BBB|||ZZZ---mmm + + +BBB|||###kkk333UUU```bbbNNN///<<<333UUU```###kkkbbbNNN&&&333UUU```{{{XXXQQQ===yyy333UUU\\\uuu~~~BBBccczzzqqqKKK ~~~BBB+++~~~BBB000 ttt~~~ppp @@@bbbccc000 ttt~~~ppp cccBBB000vvvttt~~~,,,hhh$$$ NNNUUULLLVVVuuuCCCzzzqqqNNN333nnnNNNMMMssssss)))QQQ888^^^(((###dddjjj555CCC sss)))QQQuuuMMMsss888^^^(((###dddjjjuuuOOOsss)))QQQdddGGG333TTT888sss)))###RRRZZZ'''&&&'''mmmSSS;;;KKK'''&&& VVV)))'''&&&<<<lllddd:::RRR222ccc&&&<<<llldddmmm:::RRR222cccmmm444<<<lllddd$$$666 +++ccc:::<<<lllddddddOOOaaawwwMMMMMM@@@gggXXXDDD[[[ + + +cccMMM***???MMMrrr$$$]]]iiilll ;;;ppp&&& ???RRRiii[[[ + + +rrr$$$]]]lll ;;;ppp&&& [[[ + + +iiiUUUpppAAA///111lll ;;;ppp&&&```fff>>>:::vvvTTTBBB:::kkk :::fff,,,888HHH333(((:::vvvfff,,,888HHH333(((:::vvv$$$...^^^888HHH333rrrOOO&&&iii>>>---EEE|||EEE333LLL (((ttt(((---EEE---EEE444***HHH___GGGjjjLLLBBBVVVIIInnn000LLL 444***HHH___GGGjjjLLLBBBVVVLLL aaaFFF---___GGGjjjddd"""$$$WWW :::{{{DDDhhhWWW 666 ###WWW ccc$$$666ccc{{{$$$666{{{lll + + +ccchhh888ppp$$$000 ```***ooo444]]]eee???:::sssPPP$$$MMM"""333???:::sss---kkk???:::sss]]]222KKKttt###222 [[[LLLZZZ !!!TTT888KKKttt###222MMM]]]222 [[[LLLZZZ !!!MMMgggKKKttt###222FFFWWW[[[777 [[[LLLZZZ>>>KKKttt###yyy111 + + + ~~~iii ~~~ ~~~{{{~~~???111fff}}})))222 ;;;|||KKK~~~???111fff}}})))222 ;;;|||~~~111OOOjjj111fff}}})))222EEE```&&&888(((###mmmHHH555hhh[[[zzzHHH555hhhooo!!!###$$$ + + +HHH555hhh:::  ~~~BBB555 ``` 555[[[:::  ~~~BBB555 [[[mmm>>>)))MMMCCCppp~~~BBB:::ddd777:::AAA444RRROOO\\\::: :::***~~~... ???---...RRR***~~~ ???RRR...TTT kkkfffLLLeee ddd...(((uuu666kkkGGGfff EEE___555ddd###SSS(((===___555ddd&&&KKK222___555ddd(((iiiIIIZZZRRRddd###PPP888ZZZ(((iiiIIIRRRddd###(((ZZZ333MMM^^^TTT RRRlllZZZ~~~+++777JJJvvvYYY===///...$$$JJJQQQJJJJJJ:::uuu|||CCC&&&oooKKKHHHCCC&&&:::uuu|||oooKKKaaa{{{CCC&&&yyy^^^aaapppoooKKKCCC&&&sssTTT### ccc333&&&???hhhttt,,, 000bbb(((000UUU(((\\\&&&???hhh555qqq444 +++aaa&&&???hhhccc###cccccc%%% + + +$$$___UUU((( """GGG|||ZZZ(((;;;___mmm ccc%%% + + +$$$___UUUccc###cccUUU((( """GGG|||ZZZ(((;;;___UUU{{{ccc%%% + + +$$$___XXXZZZ<<>> 555rrr>>> 555YYYYYYYYY}}}}}}000000000!!!!!!...ddd000 RRR......ddd000 RRRddd000 RRR!!![[[@@@!!![[[!!![[[www@@@www@@@```AAA""" VVVcccBBB!!!EEE$$$EEEEEE]]]$$$]]]$$$~~~YYY555///(((kkkvvv((((((vvvIII;;; ;;;jjj;;;DDD DDD bbb///TTT111}}}///$$$TTT111$$$TTT111ccc---555555 555++++++[[[+++;;;ppp""",,,+++;;;,,,+++;;;999QQQ"""444"""444***bbb"""444333{{{CCC444CCC444CCCXXX***555mmm***555eee***555 + + +mmm + + +mmmPPPMMM222555===jjjMMM===jjjMMM 111RRRpppttt444777JJJ{{{sss444777AAA444777}}}JJJ{{{sss}}}JJJ{{{ssscccKKK~~~444ggguuu```MMM999""",,,mmmmmm888 QQQuuu```MMM999""",,,mmm888 QQQuuu```MMM999""",,,???:::VVV???:::ddd>>>BBBzzz???:::^^^UUU  ...vvvUUU  ...vvvVVV^^^VVVUUU  ...vvvbbbNNN---sss888 BBB777xxx;;; + + +888aaa```sssBBB777xxx;;; + + +888aaasss"""ZZZXXXccc + + +KKK;;;mmm((( + + +CCCBBBBBB___KKK;;;mmm((( + + +CCCYYYKKK;;;mmm((( + + +CCCHHH(((mmmPPPMMM+++(((mmmBBBHHHPPPMMMBBB fff + + +(((mmm'''OOO///rrr,,,OOO///RRR!!!OOO///~~~!!!aaavvv ```'''aaa~~~!!!vvvaaa(((VVV666{{{HHH$$$ 000ccc<<>>JJJYYYFFF???444111444nnnnnnaaa444VVV555]]]$$$ooo(((000OOO"""999aaannnnnn444VVV555]]]$$$ooo(((000OOO888aaa***===oooDDD+++999***/// ***000oooyyyDDDeee333DDDvvv111 + + +uuuNNNwww111lll222,,,FFF###uuuNNN***vvv111 + + +www111lll222,,,***999uuuNNN$$$ttt^^^OOO(((111777|||333www"""MMMjjjZZZIII AAA:::<<<pppZZZIII|||jjj AAA:::<<<ppp|||NNN111ZZZIII///***lllEEE|||555$$$sssLLLIII666 [[[nnn/// + + +:::TTTDDD ddd CCC%%% + + +555[[[nnn///:::TTTDDD ddd 555  + + +999 + + +---&&&}}}'''RRRQQQPPP???***---&&&}}}---&&&}}}XXXQQQ{{{ ```%%%\\\\\\TTT {{{ ```RRRXXXQQQ%%%\\\\\\RRRkkk{{{ ```DDDEEE ***www&&&AAA~~~BBB}}}***,,,jjj(((***lll&&& 111!!!JJJ###CCC***'''zzz&&& AAAlll111!!!JJJ###AAA LLL&&& NNNbbb111HHH:::JJJccc111hhh...^^^GGG + + +888HHH:::JJJHHH:::JJJ 777ttt<<<000///ttt<<<... 777000///...ttt<<<XXX... ...III444zzz```...{{{222...JJJYYYfff^^^CCC + + +JJJ222,,,JJJIIIYYYfff^^^CCC + + +III(((NNNJJJccc""" ___dddeee\\\///iii 444PPPeeeeee\\\ nnndddeee\\\EEE+++!!!VVVBBB777hhhUUUooo VVVBBB777EEE+++!!!hhhUUUoooVVVBBB777mmmYYY )))333www|||QQQ###""" ZZZ>>>)))sssVVV)))JJJIII---$$$XXXEEEXXX"""TTT666---|||QQQJJJIII$$$XXXEEEXXX"""|||QQQYYY@@@---xxxjjj@@@&&&  gggkkk ggg???}}}222yyyVVV !!! }}} ;;;...fff666^^^}}}[[[PPPppprrr|||:::PPP [[[ppprrr||| PPP + + + 444nnn %%%>>>SSSlll&&&TTTddddddhhhXXXPPP$$$ TTTmmmOOOTTTttt```www @@@!!!KKK'''}}}333```JJJ hhhXXXttt```www@@@!!!KKK'''}}}333hhhXXX*** 222 JJJNNNcccccc!!! TTTEEEIII___VVVaaammmvvvRRREEEIII___VVVaaammmvvv999((("""KKKwwwSSS...333***@@@DDDRRRccc]]]999|||...333***mmmddd999```...333***+++]]]]]]EEE oooKKKkkkkkk]]]EEEccc]]]+++]]] oooKKKccc]]]]]]EEE:::oooooogggvvv}}}~~~FFFTTT~~~~~~ pppAAARRRfff + + +'''sss[[[AAARRRfff + + + ppp'''sss|||AAARRRfff + + +PPPPPP(((JJJmmm]]]FFF + + +___$$$???ggg```iii000FFF + + +___ppp---CCCXXXNNNFFF + + +___$$$DDD~~~'''DDDccc kkkuuu~~~ggg```$$$DDD'''DDDccc kkkggg```///~~~iii000---))) + + +nnnrrr ;;;nnnrrr + + + tttLLLnnnrrrBBB{{{bbb TTTUUUBBB{{{bbbXXXvvv&&&000XXX,,,...vvvcccXXX 111XXX???sss+++KKK~~~DDD|||KKKvvvccc???sss+++~~~DDD|||vvvcccKKK + + +%%%IIIJJJ'''bbbBBBSSSfffQQQ###hhh'''bbbBBBSSSiii '''bbbBBBSSS### MMM###### ###555111XXX___ 333eee>>>oooyyy + + +OOOEEE[[[fff111 + + +333eeeOOOEEE[[[333eee + + +mmmWWW%%%222 fff\\\\\\999uuu""""""hhh|||rrrEEE\\\\\\999"""CCC,,,\\\\\\999;;;sss&&&'''FFFpppAAACCC???SSSWWW'''FFF;;;sss&&&pppAAACCC???AAA'''FFF<<<???BBBPPPwww'''TTTeee zzzjjjeeexxx,,,<<<%%%TTTeee444bbb$$$TTTeeefff + + + +++mmmmmmzzzPPP +++jjjeeefff + + +mmmmmmjjjeee666ppp +++rrr&&&  + + +666ppp===```,,,)))555uuuaaaUUU MMM YYY```,,,)))...HHH:::sss```,,,)))555>>>BBBmmmCCC000nnn\\\---///VVVhhh444 ...SSSzzzFFF CCC000nnnMMM555>>>BBBmmm\\\---///VVVhhh444 ...SSSzzzMMMrrrCCC000nnn333ddd666***ttt###TTTiii))) ]]]wwwBBBAAA```000!!! \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/wmf/clock.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/wmf/clock.miff new file mode 100644 index 0000000000000000000000000000000000000000..421ae843d5a2d903ab24559cf3c3f59edfd304fd GIT binary patch literal 511645 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 z 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Add.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Add.miff new file mode 100644 index 0000000000000000000000000000000000000000..8a1a4c0045b8521985f61b0e5bafb125a1dffa05 GIT binary patch literal 35311 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 H!QlS@%3X>% literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Clear.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Clear.miff new file mode 100644 index 0000000000000000000000000000000000000000..023ee92645d07bd63f7dd400b34513f5a4a6160f GIT binary patch literal 35311 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 M017|>D4-Vj3&36}=l}o! literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Copy.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Copy.miff new file mode 100644 index 0000000000000000000000000000000000000000..61787968b3ed42d562fb3be6bd80ec0632f2d2b7 GIT binary patch literal 35311 zcmeHvb$F9^+jd%PFs5ug+n!0$YT8B`PntA!ccb2>ZnULE3dM`ta2qgW3uz3_KA=XO~%0SW;H5cek@EO0TG}=%dSeSlaMl zkD}soy~Lfz%Sx)s^(rp1ETt8>dX?}jUs9T$Y0*ded9^9Cl=Jio;ddydJ(bcnrTp!} zOM9x^o%yd#X<12jUZF*tmszBjN#yc2ZQE!*5sBLR2j>-+*uEm~9ue6Hj}D6c!|m+;KK}o;dM~rI ztU@HR3Fq0eEK7MN*Mqq(tg0v#jyG`qK}LbFwrwt~%lHAg{zzEoyj;69o%3>S6xLZq z#aTQ@_{^nQMOngn3)jOcdsw(`7R>d~$~;RI*N3?7OhxB${g~?yiY)2nB2n|U!tn}A zW-iz6T(>QYjx=+v6N%nvoAZx##y{2-mY)2aB9XbIv{zYPPHu&rL#CshM6FiY`CFi_HZKR)@_S^x7w z!1m=C_amAxvuVHQ?_+>r;&SiaoXT(q0tDEc7PRrK!u4@Avw?GZI^_ok>>(ri9s^A~Qxtz$)k<;8t* z<>kKTn$I`={J(zKj^#t!^1K{7;jlR}+Agz4S*5V1O$a|)h}wwW5q%)~SoFE5lgL3N z7D+`)kyd0B`G^8VVWMbJf+$6lDasWUiONJ(qH56q(NNJy(Kyj0(R9&QqWPl5qGh5V zMXNlW*wS|o2i=3AN{Y<{kJL-WQKZ?*Weg>wr{i+~pK zEpl2^wHVrBa*Ks6R<_vM;&6*gEgrUP*|L30`rLBHzb)eOyR*&C!^NlawkiOyjM&cXAZw!26 z@*Cg2@#`B0-njC{v)1pn?$TP*I;?e8>t3zLww~X5UF-d=FSUNw=DjxdZS-xT+vK+y z&}M3zWo@>$Io0O=n{U3^@lExc5pU+b+5gR{Z+`#gjyKP}`K0apZJpYh+a|T`(RNJR zMQt~K^ITW`J9^)2IDiEmZBHRi3wZ*6|-%v+D&Zuhq9+W~K9yr7-3RZrdr$IS*n36q zje76f_jbN__5D`wcYWXI{jB!~zyJ07o8Q0Cu35WI?ab{m+YM?rzune$mp*9uf&B*o zALM^9@`LX_*!MxhhwpzV|1kE$o*&Nm@Rtwk+c#_9wS7SQ!uDg^|JeRW`=|f<>|dsT zS^hQrU(5b=;9rkE`u9i1k1QXJ_-Oe@hd+AyvE9c$9~XQ){^QjjpZ=uzCr+P4d{Xtv z>`%6Sa`WFG{9F6)%zuyg_mBTR@u}^nPM=18+UL`+Ki%``gU>$y%%A(xV+=(PHj4=I%Rj7*lAOzhR$Df4(VLoc}eFJU0Qchb;<2ArOWm%kGk4- zjq6(5b#>RP_8-{?*!Q+yVt>lvEeB7B?hf-D4mq}TR5=zn&T{}#U^p3c!~I&YkSvV*MY99U2nT}c1v^{@3!5o(cQzn z(0#u9Ny+PKI>|k$lQdI0LwZQ|mdsaHBU>Z8D|eP#GjC0 zG50lZ@NVYq=RLxEpU?X~F+S6M&iHop&GB90+u-Nn*T-*ze+&O0|MC7u13nAL3|Jh{ z5U3378@MH?ZBSIu^q}*>PQhit>q2Zp0zc9837qHGa53@nNu=vWErz2W?i%BEfXwPvh~>$vajaobH2>Emg|{2 zIrnCsId6L2-F*N2uks%igcU3*Kw(_r@}f72(u&p=zh7KXyrtyxlAa}XrOu^8OY6I9 zx=-rfP!?3Su-v9RxqMB<2TZ2+^l<1gq{q2RL*0%XfPw*g2f7cOFz}B- zaf8+k{%mmn!54=34Oueu?V)8ukJf5yzZ%wjSl+OG!)3##4R0KgHDcFD_mPuFJ|C4i zYS(DV=&7SICVR}jv5K*?$F&?+JnqPN&+*?(cyB`Q2^YQ$`Eu1nyNM$v{xK#he);g1vA?$Yb?~qFt@m#a zHk59-xiM$sg-xlOPHv9hd}vF=mVH};w(i*GyKVD!)ArwX=y&|QQ?qmJF4eBpyA``v z?eW;Na<9kUmHQO?R_#~rU-P^A_jPr;x?c}?9@u!$`{1@i0f%-U4n16VB<9Gmqe(~W zk7XUZdc5%X-4m53o}KJ}s>P`hr{6t2`OK$h=ACssyS!de|I0b=b9>H5oj-XY^TLgb zD8aF`Cj||dbjJBZj|15c5~>h_ioL+?Qr|2JH|VE8sZx+ z-7UL|d!z1ue1Fj&@;^2`2!C+qVbQ~9k48NH`0+PSR8O`)jeC0KS=IAa&!@g{e6g-E zsPPnv@cQgeFXg9msmuZ|Ax-Mfd^^6Kc|_U+qvEw7Fa zZrr$m*YfJ<;Of<@crCAv4lZ4~gxB)w=-}MBb9gPUjtgeF)$&+|3uZ|9m z9Xp2C^6Kc|@ZrOFEw7Fa>gww7T3#I;?Ax~wujSRz!S3C=@mgLT9qib#1J;VWn;24e zS16=zP{~}Ok%^&}ilK7ny~MTYURW#LT;L&gg51Ti>0Ve%#P*Q5+CwgJf>O@&6>jj< zxWU&`hCnYlf=yC{dPxz(`wDM4rkiE>$>f2pK6=!9`{9<^7Z3GbxT`bbh*66*o^JTj zQ;hG7Vtj3K##Ey-CV0AHyxs*9^v?KF?}SNwJdN-FgO?2Jy%m_`t41V$r^Z7DrBp(3 zgMy!1=I#PFemCL!$y~%xIExXkRAFF%A7*6~V^sA*6qYVPxPLJsgVWKYsv47~k3;Y3 zLL|gSS*=e2hb>#SSS@a@E=`}=L(sW|I7nQGfeRGWzpCl6aLg4-o+od@!->y1L*eQS znVS>8H!+g%F>zFSxWk|l!$&WLzo!HN23G_b-4Nm}L!OTuql~Uts1swIpAM&p#|t>Fk629MdOY7_9Pt=WEXHY__*jgo1{u~F<=Ek^!k7M9 zcq?6?_V9pOCTZGN3aKk3{On?WZg=iA4>wmxom}8Uyn1p!OiW0^(7sEMS-2E|h5~-Z zBqXQgp#RW*#3&UBaZy(5Q@~>5#*J2si;D|f#LmRTg?rr@QWpnEsdsl5VNG%V^PX!- zlQ=>qc6lj$jg0uoiJu2;O29)SbAdr2hLK_>HvU>S`1p7rhW1g!Jw90NfUk(n27f(H z`55s~XTVK^9&1hRSYUL*Vq&s@I-fyI#v2?l#^8ccdND>4$KhI645tmv@RDG&QH9NZ z-WVPi3Z171v~mgYpzbLWxf{fCSGdUC;U;r~MC#szi;Ukhz_kMkLqaj4_7@a%-v)nu z4fK+Dc*y->@byJNQ~(kZ!>rb)fW@!B{%W%|6aFSF@}i!NE|^U$X6oHAkr<33e#3OmsMWb(h|U!Qby5s9D>2JY zgLQn}PdTX=JE9ljEO9Vl{W6|NF1Eu z?C1;!dj~jiEj$*)$h4}IN(Ov{Qa&;n(#LAsmsU#BUWKwA98w}KiiTIe5 zGI(he2vSIqt8~L~y*nluJTR4*EcaG6`LEfG2@_}&6N$kjtr%ly54Bns)T$jZQ0;^o zjVo$Al^E)0#1tO`mc>Nk>+yXsYRM>+4Jbuaq91fd8Qdif5IfqxwC$$PM_X^Qf9@G4 z3EUkWVCf!-Npojn?1HbcaMudV-~K(uu9|{r>!xDJ+`&l53bb0E0v4-RueMrTsWTz& zxzX23o8lnjAN`Qvv%~@p)V-6V7|ssdZ}u*{7w{q`{Elw430G$)V&T{n=M{`6TKWq; z{e+hOTT8!f5QIL=L+wU?;({<2d*o@v7-W)Qj8TFK)csV({D}rBzSId=z4S>VxgM-` zK_6mLsc}MItvj*MqBh7IlOn?KB{3MccqE2@HwIOcdm*V$B0^LApx4MCGdL3i@D*hPEx_R5JP^nY&;&^uxk;awK-NcZn-=E5>nm;^)Ta z<&5uI`UsPU3u6ZDLG2DbeU+B}LMLJTAU2VFt*;aF0(VD5x;Y?U?TSGf?sv7E``!bC zy%ZQujE2x(4bwPd2xE68<42{+1?6fn`Y?VE_cLHvs1Jr_#iI9w?&!087zX_?3YD{~ zVVRJFtXd1gv%?{${W*2*1lP`8;Y`2l$USB6>;`*#F&sO0L|l?T`i;*=pPBjS_jL(s z7L=gxf(rDT+Xp4X3lSXaZM8lHEPnXm2dhP?l0pzQ^`g^wz^GTzx2UL759sMRm%~ft&X_KNCw-KT?``ILm>BPM z3Mcq@*dvqizE-crI4=_ho3$8hP@smnPe10ay%=A5Ft6$@cf{K8U@Ywxi_$S_#bb1%l|PYqbac4`a5DG1^P#jsWh-FxDC2 zMh^t(L;V4ZoBQ4(_;|im2H7XHs@CO`&@WdF4hLBWTOvuH_>|z|s zFT;Ve;3~bUGaJ_QVaP7AIJ5Zt>D!LRJ`tWd`C*W(po@ zeNgXZ#sliQ(bWfVAvW&OfIJD%Rl0+mX}y{v#Y_og5H zbYOrMApr^m_$U$L9|(V=npil)OkeIv`!ERS6B7e{kx{QkfJs5yV7vlx3CmcEZ1K_JrpX)64gPpxiU9PnXf)*FnV~zL`&8jc zU@>0A^#l@Xus69FwZ&ODxML&g>#yVTkp?_C_XIEQQ~tP*2Ui+!aNhw889fL+1{7PZ zPXUYh^XFSF62@(zMwhd0QmLgdaPRtgYY`TtLP(Gt@o{nJKWG7}d(J_(=n`@vVf0gS z*1=s_13E&(xa`GRL8!ySDQ3oD4gJ15b1W~$@ev9gb?1ipI(y93cEL*4ciU+c7cG}f4)|Jco zdk?b?x$hf9?e$p3&uD)Q zveL^id%;C4{SlZo_a?@U-HPI(F$fNb=iU!ttX9LMcYv3fIhjcfjZXx8V$$Io6^V56 zA`^X;_=YvbG84HFtpk2zJU>MHI>7j_k9ovF#-pSBoo88F+>qGg53vKDP;N*aa6s7s z`;{G0=iz|kW*tt)hF~52+6ql4tkpPTn^B1a{=PWo=Z{;yfp`{{gvY*VctN{(9@!g@ z;(OyoOm{qq$^i>L91e=Xxo_t;Vep(kU%Y5U<5L3j^a&ap{=oH9CvoTUN!++~(Q17P zSj?V1+iLM<{58?HYMJkNPzM^uX2mPxz zAvOUkvs~o!N->>dyF$ z_OYGV9E=E{-!h;+Gyqp3qRC=W!P73X8_viefxHR}TS? zrvfrh9&zyiPwzC~)V`f~a<3jwp53-up8^)sr%$(9!h|?M{=t{HcnWocg7KQMJ%pT7 zl(#G5f}=2a%tkC+_6*RG!?tU;&3N88K?Xs zaX@RpWrG3xScm^?aKkqGq(jVwkFzd3DRagN*6C-6!*Q7->SUdGJ6tI{wWs21j7wU=F5Kn{$Xb?n>+*c=Io~uN#AMx;WMQmsU295j$U(bI?p9;+X zPLKvH`|cs;EN{fzCG}WWIhuYw6nAu|x%#om|y=g#&g- zopFkF%NfR$vr0!CWPI47=zwj?uGr_{h$G~nE;5E(lS^?!?14wDsV_<#vD>3Fjt85_ zbp_yTND#L3oQ=%O)@$vtnlbAq=6LJLmz+4#EDi*H}02iVJ0LHljuMV z{gfJ^^!t&FA8|rFkBCN1|8FsI${|deauL(!-NeMNj$zoi-%&f{S8UCjgv5I(5jF`&-Rjsy2zTRp83N?aV~ZCVAc z>D1V%?t)Ef#tm6l#&b8u4`=L9b;VA-BkjinSB+k{6%&QietPCzj#y1!ww!jdlziiI zuIpm`&`^|*Yw0<-n?V~X?ha%X;&EIldJM}$e6bJiUOLnShw$V4lgrq8V+YRPIgA&N zFXNBPM{w`zX{+@qU@?CDc&nvbr~!$TZlQX_hv<+PtRoJdi06G`unIB3e#lDgfvTR< zF|hwS3?I4|efq3IcF{sqM`qxZ))$a@;u?MUZF4A2dHG=#ecv|L+;y~rZC)Pug|+gp z)bmD77shf2Tw?C~NFrn1Aj31U1ovH4c;;ZhLkD*pbhpP|o^z2g{wnLx-`R88py-NS zw4Dp&3NE?2F%NU1EitA98nA}-&SK^W-!M;GNE`dvpP!?986K7Q!_%@pcv0R5jjSM1w|m4emR;;;f1`;pd0r3OV0Tfy2aM3+-hyKmTo~B2$CR3fVyd&97rsJC}G+rNhRl#N{%Bv zt_syvGq9<41|C?dSPuu`qS3c0=ea|>IKkZKN7iZcsjq!T1#U7nUk&lW5&FbUj2-*A zuP-uRxJ{1noChnd#}n5$JdVgjV^R@rtHN-YF?|j9`yR6b=c7V#l<&Qp zIBp`gi&)1jW$k#-*NZuU4ENXd|8(3p#2_JE z2}}P_3>Zm{WL6PsmXu=Hk`mPZP>O+TOEBcy?pV2M8aDs-tJV4xu&AxAwOW#blt>Cv zG)ZzW^V?uGg*b%hksSU~(nB=JWX+zF+#NMTS7Jr&LOkq2zs!98zGnok=>2d~M}N-z zX|WJnnG4lXPiL4%omAW7T8Ie;*y}jR*l|;-#v`c#&pWySc49p2;EdZ{l;l8SflS8W z&?xLCuQ^xI8MWe%@SVn;xs(FO0(`KO9Lsjvz)zHo%+1aO8gZVy=5tr#A$CUtbL5@! zF4)RFfU)BM)__Q0ZRnYf1I8!>BuG#?sT+nYEWse^zIs76`Q2>Pd{cma-&-*B$70M} zH5`-YPqA8`0v3Y@54KuTsO$eKsl+8ERL$JVg!K3Xl%y4*D615uJ-@-AQP(kT&|a*q ztj5)>B)kZT!96wWW~CCF*~eH+KmH4`+v=spE`>ABkQceYxLr@4>J(#cgFEAfcPJj1 z{cxFmmvih7pOMONmbt)jPcu$&=3p0fd>||khr%MTi}MH9Vq$Q@$Am-VvChyR-k0j} zKQ#wiN`vB9q{EOyy!jv@Fkz6%fc*^A3`&9D4U!}AC-w7 zU!|dPRw{bW%|f4rl*NgtU6G67?1>Z(%&}UZ0u}=X46s^K!}LfE^Q0Ik!dj2CaM}#* zB(+;Q`c}`ufWAMXd*vEb58a08Gqz*h^3~X}YBGK-jl?$Qpbg}=u5#ZW)=06Q9OJqG zPwdT($42I#Cz#(}WRLwEbF7QZZyVSXZs6>}-N<-c4~)Q#h*;c=?S{k5o35+LA&Ql_ z7f4$v=?$=sxDrWU#Tw)kIp|%4o)?o$M_WVnVpG}DRC&99*>^0Q_$<{Zm3!qi~dW}(f_Ml zSgK>K)~A3)-@eQntdwr_OR3>Tq(*unEs~seq!CGBUdT*HM^)8yR8_A9ovW<;_-N==8 zg(=V-x&5M0F)<#w6M|7RIRfP~5>Y-Y8ii9rkTJpsq4{zIq|2?=r+`E6-o34sXnz&+ zCtVXB8SIOtMR_7SIRkxq%|=DvIWilY>4-{{Ad^76FIr^l8_K(MfVV^-2fa zA^-RXx%@wf$4S~towpaB=JNAsv(RYFMgI^#L^4?E5v4hOkrEq;>L`D#Nr=GBUgaRMg*z#U*hyXe z>d^_i7~c;wChzBr)G2Z$0#~(F=Y&nH;kUBB*hmbHvj=z}$P0TI!*94T7C30|+};!T zf_|x!iuH*CXK5GpoKd;X8ss*0f02IcB>mqhbyr+seR7BW;al`oN10#UicJE-ne(bF z*lUbu@2nF{oS##wIv^rZj;vmxNF8iK<|uCzjtfQZXg_2Q4M66=KxEehAfv|HYJCb= zR8+9nXr;)>(`m@HhLK~B4c2pu7osqKJR%}Spj+|+^y;$@!-t>7sF8ITHe@e`4LE?& zLw2Bc;CJYkn2)4x!6=RM#{Q^ST*)rLogp=79MBtE$sMj|?`a!r!6S_8dsu_-X3l$r zvkW^}?`;+Cx#xEgt9|77cQE%lLf`g;J`2uzJasalu`}`Ls%E^=;{@kZ&T8ejK~C$g zTtz?ShQq|;ICJY0#PKL`ImA5pC^2q~D+H98cy7)|flQB1Ze8Fe{|qS!Qp{N~5apxO zkUYqMqA!D(Z$+SBtUvNbhQKnIcntDK&Tv1g^(o*`TFTtVN^x>$&!1eon)}YjtVd!} z9+Hx4(JgT%dQ~66kYP74aNr3H7_tk41|Go3fhRF~=qB{*IUMD2kw{DRXZ>!*vbb>E zOw7dn;(QzrGGZrdhaKd0k1#hq%o&`mtQ&tL-*l2QBKzpCc9JjOL0_|va+KWD3Ffl5 z6ng1SAmtom?hg8q zU)TfL%GtIPKr(w|5{PA85Gb?9(5V)D zb7&OCep`*8Of}MK^eCJdfUHq|u+*ASFeVIn)1Or`8Xk%^+-$@Oe-~(1;{HQ~m=U9%a@&&w~k6tA;C{B$-VS*oWlY)?+5{jDC zFf3p_f6RkC2(dWNn0i!24qY$!5f}1^j#x=-jxx?)3Gl)S)`;u4ueY=JdxWzO7sv@; z=ia}@y6+G2x7QNmv6r@bg7ZLU*|WSzJgzHLtoIGLq0qCYBwxw?)hhbHMdWwqlZ%j6q@;zKi5MhQ)Ogav6?;HUl@CiFm~T!{(O~knK)e{ zE|=8`+K7s_q{nW~?=Ir3+%#e_n%EC!-MJ?r5kE)AVs=6#`ez0qt)~{VR&__^)C7bj zYoX<=os^t`)+}M%_G1kai2Mm5j3bf6#t+?R2chS;G3fqPoYndiu*k~FvRX0|gJ9|Q zQnDDEE!{$plNyLz>N_We>*Qee0Rxbh=!Xb$z`_1XM1_+NCMK!0i^=H;s0$2cAHyB1 z$%*eJ=Y4|l;V^ysVWp5;v2Vn=lqnvc<6BQh=2Of^nP**-tEp@HAI5?^9y-Q+Ilg0T zUc|V(lD2b{+{UAAj${$Usbr z4#3!?C`>L+#+bR~h|2VWz4UWK5Z&cGm4&5S_lv?!EL4MWMa0Q6iK z!@4j5X(I!z)~A3)T3VXblA9WiytIhFM0i|~5smzeC?4Z;8Nn2PILmOBac39%^FNXoo67eX zMXq?T&XIGZ4yclKO4g%6Ax7wVu97*OigPfz z#G`UnIJz@dl+Fr7ulcd)`%MNiMse>A3$|LH0v5^1$yUohvB*!S-KI1DOHHJtq98q% z5>1I`{Ej3}p-5!S=G>r=oYF)`6< z`41j~T@+?g_q27!)!-6lU>wMl6rTFrGvsmw3gJU-9AGl*+_C%G`E?!H8p_ zVR)2Rgfr}6*Kro)ppPex`I~Wub@@fVAk+s3F_v=<#AL=L&WP?Y>hTrxxe=Uc9Ku?D z0Q(m;>_PS898hoCQ*XxVKE!7z=Xb|aCbDK3PM_3Yz=FQ259bYgDO^y>*`i9~J|x13 z;n9AW9ub03-J%c|Z$y}dTwJ9u%yGOvir1ECc)fy>zEZG{)Ltg^oJD^%I|5bTBp`oM z6p{w}A!ke=(uV|Ctxo}qIL=5}D*_&ZT@(sFs>wbCJBa#Icsw(z38&JGNR+0>AUl=$ zdU`lgnctd>T~Nlp)l47OADkE5$Xt1MFl%kI7xuG9wVU&5$GtgANZ)jhbD-zF&A7n% zsq?J=qi@NDg8|ly3FpPQa5aKX^{gWEjiq*7@YWkKw>}mAjo~|Y@)tkq9@-;o! zJ1=96S;9Q7P->4#_F9HT2V)|!_%bF0y)0o!EDl6WkvBq8HH;SyoGo)|TS`rcmnvq%?z#dgFlKT5utxo}msHiBbMcD6o)OCIq;|1@V)_>vg z5(~j@is-kp6T``)N17>*#-VSIBfFaObBPD z$Y-7L_HL3BzTPxo0YdK~jM;CtrTgXx?4v0pNT`WF1v07?zxkT6%>kF|Rr#@}AV zql!3Ga$P}8x|543W}Z|)+ptKwpqzQxB=W%HnOD_tzoc@0-6u*5Df0)d59jh2^VFPW zmGkq-$zv*MZ^3agl+h;oEJ#7xAld`-U%@WYhXf(M+Rtiz3Rr}Phg&VVe_~KTJNU17 z2spg-VUe&TbM9wAHTKul;psCD%kcKc>BE>azM64eO8T4iBn--B6;Y7i90nQZ1nVVoD7J#7l^ zHC(~d`Xe~fy*oDQHJkzBjI@#0(HdwUUaa-_coXBy1jdU2w5@(ZT;SgCLoBLk2Yu+n zdb3t3cs|v^y=g~&eIs1^{`~|N|l%p~_l=JH{xY8F%82gp%#VA;} zNXgNQ8S@q1yr#lm0SR$+5qE?!ka2285mJVRAfiNv*m5r<_3}f;z+gn=`&g|{0gJ%E zK&vH(ekvy`@-NBeIxka*8!xda;`2hzCFIqMR;HUaD^`Ch3X8l*m^Ygj)b1B)(t1QIC!uvdO_Ibo4Tj7da<^aXPUQP4h655Q6=Xfx- z$jCLiG0$@+7Ou?I+~}iJCSFI!`8jtfa#zkJqI1v&)hX%W}M7a0RWVUE>W ztxo|9Kh9rRE4h|f?K`tv7a~3Vf`71a6)bVpXes&j+pWf%= zJ2-KC4NA-7P{Me!V=w2G8-;1i7yKvK(92uH*<)CrpMvk18*O3y-R`f(H$Do~@_L5; ztS<&quYHL@PwKu0>-%y_3AwL)>OEJ`J!i3U=%)l63OQF_NDeZ`SB`<*Q&C*d4UU|3 zmGCw0#6!Zo*q#2$jdRIO!hW$Udz7x^bEKR}mC=rj#3O(?m{$yEF>{RY%TOb}ED*^( zqapX^O!@ypr)IMm*2+sf1Wf*x97_!G=!W8~c;w_VH}BsM$IoB=k81Ja`6FDqdIlG+ zA4S96<2ZPL*UWwY7547g&cAbd_s{c)25}KYn9US!&+rJ_zaE3HSx^4L_`QnrZ&Ni| z)G+rg_0pj`aq3R)y@Wc;XKtFy_|cu$R~4}*l}{cfhq+b`>-KD3%aa+%>vcmsP*anK zhy-6akwbQ;?MR4+JAINHuT>QD8f;f$BIcZf3*(v#k2&(%JTd*Al-I>cS$`@x2kuRK z@K4qwh1X3b@_HW^`b2B>DZI`|zih4i6NkL)I0%wYYzi}Z4N*=aa`PBFdX!@G-otl7=ius_BR$U@pvjsWB&E@)k8nyr-CTV68`oA z_i_z=NeS!gGS=edo@$iyZv&L@x~yXM54-dFl0wGxEap%ttS!S?m&Al~1}2`fFUg)L zu1tcIe>*@*yrk5ljQ&naeGBniz(Noga@S67j!k_9XU2CY`ZY11S8{GoZKl2O8VEz6 z97(y+h#(K?Ow6p+r|>#GIc{quhw)m#fx? z@1fz*Ih?+*87Gcz#I-YLfCmJl$qruH#D8oN%)>U_rXLfS_j?I4%>&on8KO8=3-d14FseIH+PP-c7h1UR!t5s9QUKS;?J zE6E)z8Hbd7or+w5id>75oV@je@H&Np`@l*`$_Ybi9`maL;*m?9igP-JISDAp?naCfU@1&M^@yR^ao{*j;3*zG zZQ$QtK84dKwqfUnW!U-aDqO3-%xw$992RQTH&Dqg3nBEP1lZK-)3orXDs)=bWga{^i)VnaXWL0_ow zc7tCUV>jorG$AS&BQ@|(GC}UeYm}_ir|>$NO!it{Asx7LcJ;NqIyw;Z?}ogVS4Rhq zyyot;ygEAQ+O;cQ%d4Yat#ymJr_GiQgp6KuP*NX4T{_}ShFyQsy=YH?~eQxfZHe1pO-sYO$=ceCcvu*p6&35*O zzt4@h-Dc~x!e-n0W}ELBpnoqjTU(n`T&_in7R5Bw)x_vQfBX5r7W`KEKPPR@i_v+% zyj{`&8lq~E5~w*FINY`x#?Zwva@>$c#2-EBdWH?k7& z+uz&hu9Y_Z=2Z>(?AL$y)pU0GxX_vfEen1*}Be4;eoEeq`<7e;=pl%Qv&M)=LIeaToJf7@aDif z10M|B8n`|1wZMIWhXRiUo(Qr9bq^X4G&IN=loXU5R1!2PXhu*=&?P~ug4PAy8MGzn z>7ZRf?*ttR`ZDOJ;E>>c!J)y<;MCxP;PJsV!SjMI30@PtKKQ=it-(8k-w8e(d_4Gc zr=Fb#b#in{=~UQhLZ|vpi#o0Bw64=Vou26Qa;JTrj&%AyBqU@&NJL0tNI}TNkXa!Y zg{%qrOUOeZFNW+5`6T2-=gyr6c6M}5?_AQkx^rvim7Q+YmUOM{dSTbAyKd_Gbk{e#9_f0r zTc2(b-O{^_>o%*~@@_YG+tTgjZXb2~u6y_H!@4JTFYDgW{nG9?cYnD1?(T=X|J0*z z4||X79+P`4=&`oPy**y+@j;L8diLxY-ZQi3q@Jxk*Y>=>=Sw{g_WbdTerLp-QFun} z8OzStaK_d%-ag~2UR`^I^~&mXL9Zpf*7bU<*PFe*?A^6@c<=1q)x9t2y`lG0z2ED7 zqEEj*o<1dg8vCs2^FW_h`yB1txo>#i+`hGaSMY+7tNZ`8|DOKG&+L0<+?kbUEe{P>*U zbL{7oowMkijpw|4&X?!*KR5N%1Gzd;Yx7hx8kgF{EM04MScS@t6!)FY?Vfc>W$43kqF=oWl5t~PR7}hl`DQsrg zO<}vjeh7~UuL{2+d|UX@h_fRKBbG#Lj`%3DXXMDpd69QUz8e)1l@v8Q>Mv1m*#qtI z_L=q#_BS1Yjs!=8<1dcA(Ve1`qno1djDFAA!ZAMo_`6nQT5Jni{5)*f3EyCL>nZ%=QYcbWG|?>BLdxVpHFaqq|X ziysqzMf{HVUlI}%S`xM-e4aQWaa!W7iSH%#Pby7Xle9azQ}U?fWy#Mb|CExD(wg#U z%GasR)Y+*Iq#jL+NUKZRl=eybu=MKmJJJtjgl0_3xIN?0$e|;vN8UN|ADP25Ycuc3 z{46UfYgX2SSznEEk7^n9#Hb&#Q?f74elaH~CqHLZ&Ys-9x#M%!=N`-(mRFy*Iq!IW zeEvoGFBWtvC@#3R;Jw1Zg*Aou7alK4EV{U8XK|0>isJRf{}^o_-7@;=F@a->##}$< zqp@LQo5pS{v6U2-Twn5WX+-I~(r3y-%1X;Nlzm$6DPLN?tD;}U)QSfxz8^Pg+|}a_ zjE@|@VEm5CUX_z8@2~u!DyQnYszVc86E2?c+Qf4vHcWhSQs+sPlkS;x;{4q6Z#@6V zZy-S>ol!u+5^*0RhLxXS$$%9;q+UlAFs)- zxvAz@ZD#EawV&6e*Iifl*^KlV*UdOupI(1`{pT}B&RjS1%ZBWR^$p+5DwuWKtRH5V z%)WQFHK%IMLycV;r!_v+)VFDN)6Ti)&0RcqZ?mI$W%HqVDf4cecf6&z<(~Ng^QX*z zvb8_|G4=X_$OV5|aCl+H!VL?5TvWN}vBiBBH!XhsLi>eRUHI9Oyd`&E6ns(5MLU)b zUAlbf;fu2_zT=XBOQv74W7+U!E0!I(H2>23mUmk|d-)rexi7o!vVUJ*b@|gP2Cuku z#V3Et|I_A`XRK^l`Q8<&SKM}G@Rbc$?zzf))h$<@URAs5Z>!y_*R4Lare@9G{_Oel z&40Gm&RDzW>V&H|UK4Un(>43A9eM42*Y&w>$#tJxKj!+aH-z4>>V|*cIQ7O?*Tt>7 z?WS%wEx75>&7*IA@|F>|Tyx8*^)uJ++c0XwL$?mP^{QKc_)G0y-rktGam#IkZ(Dua z&$l<+{{9{LcWk{g{LXcEh1|99u1_~rZrXKs(%tvpbIv`h@A>84rh5_`PwjX*_30;`iFxMUXNNw!;kh%PyZZTV z&#!pidSS^6CthrR@yqS?+dtVcb;p61CcO0S&a$0*UM_xl_bYj?ytFH8*9*JTcR%}T z%BxTPE$MIDUQ2jw>+A8aKk-KV8&B*>*t7M`#5bROEBURb_onTA{_T-(Z+|D}ombv1 zeD}3|WB2XdKYsuF?@fO1(EGLTAN^p?2j6_S@WYb_F8!#}N2@;W{qeekgAU&L_o%-= zbSUA_bBA*dzy6Pke;oLv=96Rpod3^LM^=2=^V4;o4f*W;qp?Sy{XFmUx4t<4izCOH zkDdH-<-hv;>(;L#zk2-Z%&%WRKH>P0Z(6>wzFqU(!0+z;cig{soG3kU@cYK^PyVp# z$ALfI_fyhOyMC_v`LmOYPIW$Y^Dj}qJbk+O^hZ{s)$!BLUf|@(lU9fJ^9Dcu_@mXK z{k*}66DO<=?dJ`?{q|d{L;HDyufF=q>d=1P;MlQaR)_ZU21kz`wK}w)H#lwW@E+$=Ge?l>4~I;}Hk#rTvwsBNG`WSFg_X^=WV4S-!a# z=Cq#&Nyx!iXn)OV-B+WiJyox$vCbcgv3L%zU>PQ$0C^}x3H*Q4=bwMx@}G-daUu#4 zh=kp65Zh8+G-AxUa;^L3eEa$K^sttQc(|c{t$C4*Ok_cG+QYZ5=sVZ9cPw+-D+TJC ziVIPNB&c5Z_T5K&>YhI8*Iv`H2XA2`=As2_upDLZ|4pBH<{8U>vGj@?PDH_BM7GH_ zr!|R2419II9`$>m{S;N>f)@$Uyv8~!9-2=?n#r}V_S8P2vG%q@d#N@P87Rj^Sc7Kd zL;LB@5%Aqjy}n#`(z<$Y#a(y|5921>j1?$?|8Kf&+cwL8G4wj2=*y$Y?QlT3))ghn z@U5xNH>X^CxY2e`^|_!JVb(lEQC+N|8ucss>eZutwPz}FP=aQx##&s6Nyvv6kQRSM==|XbhxYN^ zOZyB%0cIITN^{O6%pl8}m#$S~4~iEzUSm&tuSF^r?l{2$jeR-Jk?F$M7$ zZldPB(EgE#h3=s9b*`fB6M+Tr7unF9@&b&*WX!}|w3xVQTM=;-EG4YE69es&gR| z>K%%3j6eipp;|@l69v_Y@-V0;8igoBF|rT?-7yCR&{`#CVjdQu35&7Jhu3iH*MNv`OisjG+c;9JW`Q_I8@W^@f#$;zg&1fL^@|;vcSG}O z(0l~KptC%NY8}wI%C)BbG#80b429+skcA9*p>^$_iDF{{aXMOYF_xIThIl2$;Z;~| zoF+esU+^WK#KZ9aP4Bql4$FTYdYy0}8nH+~GE&fjf5O6-co}Ok0b`)LNW_@Dj986w zq#+U7TW6@w4maYUv%Ds%E&{6Y8A?9PjJ21}Q_pZjK|OgWKoKTm8k(@gm`AKfGsa^R zPD9_LcmhA+-#B3Cd;NdYjT<*w{)?yA3nwDsLLw4OoJBkctBtS8cR=UPM>f~6+Vdi6rg~%|mf>@0v%*A388;Ern z2dy1~?|XhAKY`cTv3;zWO5a!ZveGa_y^_4y{*XAsVp&i_wfr zQHLz-gzsBUlmCdH@evNv+@D2WfFW~>1-f+VWmjANom61q6GSWRqfmi#Xioi3XkX>| zn1y;YVjkw884bvVzQr;=CGN&PDBq8daf9Ekz4ltme;M>jI?{}hCMFT{u>kAwG~U2g z+=J=JgX*=%Sg1Z8sqmOQiWp`@5*_dws?j;>cOwF-iA5X|5Dx93eO<5{>QTSO+EaC! zYr!SB$fzS$<6_if3tqtkSc{eLec!v}FT?*gUAuOz<-as~eNxFKqs?3vc_C`C0Xy+H z?m|8sNJb`#kcdbm87agOW-fv#F(ztW<5(mZIYjk{>f)hu;-DHk!l83D?}f)i%{eg} zSK)FjLoFub0+g9taUy1-6&FIa_uw)3|E8-}t+M==La$G<$C5^T=<(^YH&ouejn0%YTXVCK$?-k&5&-Qphtf4^QA8laD8s zAs?!bgB>n-;Xnkk%s7Uq{k4~BoKTIf-i5Cg3%dNCIHa3T_#%QljTsw+YnROdTG_tZY=7zvH-a6@OSFAQn8 z5z8?Xwa`AApM)Ar!&GQZG_Tr)sE7Y=x_tR^%YW(gjzk8OOCpj{joa}kp2REIg>6`e za%7$MH^x}&zw)~e)Zze_|yG>qAz8+8EaqPzd zY{e#Q#E zFDF#vLJU-U8JeN{X`gVYUwco$Xp}+s9)~f=h4vBu-*m~6C6@n^=uN{YzIyj)uOq7~{=2mzWLTJNW;m{GV@G{!5@Y4H?D+ z;+?hg(xyn^ZvhSYiq0JKPSC$NJTp4 z;99K0-PnVVu@`UPZS2NhF$<%SgG$WCGAx1i9gZkCj7Xy9ebGhkMm%B=fkfyY8Aw60 z87B~RPf3D$wRbp1m>5RXy1ta!ce&3GDdDs(>&!VrNvtie*KU-#7A^$ogviJ@;Ph5v6lYt}5w ze{Oo?5DPm}kcE0|!@GD0cViQlp$hpZ##odf4KZ*)`;0K6iBSkgJVqe`nsY*DCn5<6 zD8vM$L-V?qYP6mK&8I?ZI!k*+VmNXz6YAHUhC$~{MFaFsx~J}xjXdN+-%*M(j6o&* zf7AN5d-g&P5ml-*>5JJgQLd zx7ylT%YVi6`iv$YgCZ1|TyurUM>-ObfjpF8B2?o>6zp)A=*wM<&x3DW<7A{E)x
    )#!|2(0o3|LU$hn?WOyqArq?AU38YdN8cw!sKj&>Lf`EF zn@*WB#qwVny*}k8pG2IBN{qt)pVpOYuI;*V%|#*=qo6xhLH9329Lk{k4u{T^(I|!L6{nfJh^X)I|4k=N znq>K}j9w|lI8>kt<52?5SDLZbRhtP9B22EaY8z36G>k+x@=$CPn7J%sI^2kb_VTvL zUE~fUnkbR5n_O!eYd#9<*B$aP2Kok#b%xG&LcKamduyya=v!nW)T4ggzYzYvX;oE~ z<-am|%Q4PG8?H=>|>=({Exx?3T%Pd@yA(~61;%YS9`mYaS> zU+&v;9CJRU~vFx_S~!^xaSUd!cW<0ENglv6z?--}nFj$I{YL%YWtcN`;BOT;p+u zZ*D2$z4!$d_Ca&8aI}dT#P{4*SE(+a($!jl#9_QL;?JN(=lVlSpKV^_rEia`SC^>u?{c8 zGENh}#_L!H52BEVoA4R-V;)kFhD?k^x*2OueJ(^J#^i3I7je+Kvklc~U2_o_0@aO$ zdUOZX#3BKzwYM4ToMF(ujnLca9;1+t(a447{Zmv_Wcjax-tzy(c;-awWvIndIAwfA z{Fm_}u?lHeiz7G*3qN2Zvfzel(vgW&cnuFR1}>;B)$w);K5)cQi#TpKxYSJ+hx~Jw`(0+l}{p#3hlTd-Vcmo!G!M8Y!m#`fN@iVl3>c62Lt;uN-pD7q5CI3up*f9JBU;9L8dTs3X^)=n_5b&Y*alm8RDaW7I4 zjabA%-9@3G9WcX@S=aXpW6_cRa6lh)bE|Y6s>srf#2U_=!*Xy-9w4XO{ zyWLiY_VWf#r_<`te%>G|D$456e%>HFJlyKge%@gC@Zna6_VWgzp`liX_VWgV2M@M7 zw4XN^IB=lVq5ZtUfB^%n4(;a+`t|E)b!b0t(7ShUt3&&FgC0G4SRLBW8+7g3)#}iG e-XJ6-#Oly~-XJI_$m-C3-oR$FSsmKX8~hi{tcfuI literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyGreen.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyGreen.miff new file mode 100644 index 0000000000000000000000000000000000000000..c036f1a4090792865495001cb084b8b29e4c372b GIT binary patch literal 35311 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 F{2vw5_s0ML literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyOpacity.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyOpacity.miff new file mode 100644 index 0000000000000000000000000000000000000000..70e2f54b55a92e4b0ca8721ae2a7ae9352540879 GIT binary patch literal 35311 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyRed.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyRed.miff new file mode 100644 index 0000000000000000000000000000000000000000..4a6055ab2fd11c8b1ff7999c27d392b9dc652dea GIT binary patch literal 35311 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 K>5CMe9{ewNHogM@ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Difference.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Difference.miff new file mode 100644 index 0000000000000000000000000000000000000000..a5080941ff1147d0df04730ec7efd80ebcccfce1 GIT binary patch literal 35311 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 S9oGy83`1ip*Ky5o@P7bUT6e(! literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/In.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/In.miff new file mode 100644 index 0000000000000000000000000000000000000000..8f92fd7f01a236790785bbebb597e9d4bddbf82e GIT binary patch literal 35311 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Minus.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Minus.miff new file mode 100644 index 0000000000000000000000000000000000000000..da1afdabe13dca6545ea81f07ea133822e23bc19 GIT binary patch literal 35311 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 VR4SFOjn<<9ezT%$qxER;{{X8q9f<${ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Multiply.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Multiply.miff new file mode 100644 index 0000000000000000000000000000000000000000..ffb420466d0445867e8ab4aa81ada0e4bdcaac85 GIT binary patch literal 35311 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 QAo}9~|KB4FqCXD)1%T3#761SM literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Over.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Over.miff new file mode 100644 index 0000000000000000000000000000000000000000..61787968b3ed42d562fb3be6bd80ec0632f2d2b7 GIT binary patch literal 35311 zcmeHvb$F9^+jd%PFs5ug+n!0$YT8B`PntA!ccb2>ZnULE3dM`ta2qgW3uz3_KA=XO~%0SW;H5cek@EO0TG}=%dSeSlaMl zkD}soy~Lfz%Sx)s^(rp1ETt8>dX?}jUs9T$Y0*ded9^9Cl=Jio;ddydJ(bcnrTp!} zOM9x^o%yd#X<12jUZF*tmszBjN#yc2ZQE!*5sBLR2j>-+*uEm~9ue6Hj}D6c!|m+;KK}o;dM~rI ztU@HR3Fq0eEK7MN*Mqq(tg0v#jyG`qK}LbFwrwt~%lHAg{zzEoyj;69o%3>S6xLZq z#aTQ@_{^nQMOngn3)jOcdsw(`7R>d~$~;RI*N3?7OhxB${g~?yiY)2nB2n|U!tn}A zW-iz6T(>QYjx=+v6N%nvoAZx##y{2-mY)2aB9XbIv{zYPPHu&rL#CshM6FiY`CF
    i_HZKR)@_S^x7w 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Rotate.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Rotate.miff new file mode 100644 index 0000000..48a50ec --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Rotate.miff @@ -0,0 +1,12 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=RGB +compression=None +resolution=72x72 +compose=Over +signature={eb4d6e084afe2835a1ad28ad7fc12ced} +comment={ +This is a comment.} + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT0Yg#?rHu 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 QAo}9~|KB4FqCXD)1%T3#761SM literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/AdaptiveThreshold.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/AdaptiveThreshold.miff new file mode 100644 index 0000000000000000000000000000000000000000..8fb7754ad6290c092f550a0bdb33dd35b82d5df3 GIT binary patch literal 13013 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Blur.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Blur.miff new file mode 100644 index 0000000000000000000000000000000000000000..c6a794df9c754ec16a28275c6a33ab14a2e6ec83 GIT binary patch literal 13013 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Channel.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Channel.miff new file mode 100644 index 0000000000000000000000000000000000000000..36b6c5085340ddecea4e8c30bb7c9ddcb70c6274 GIT binary patch literal 13013 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 A6951J literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/ColorFloodfill.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/ColorFloodfill.miff new file mode 100644 index 0000000000000000000000000000000000000000..cf8c5ffa29cdb7199becfc2d95880f6fe0c9a110 GIT binary patch literal 16232 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 A&;S4c literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Contrast.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Contrast.miff new file mode 100644 index 0000000000000000000000000000000000000000..16524f87bfa90d8738c1c9a9385f726f635a6ecd GIT binary patch literal 13013 zcmbVy2Ut``|L%e<8coxf@+A?aEwFu0FMH1R&cd=RMcT5Bg@s*~DxxSNilW%C5{)JH z5_|7aY#+ARKJ^og8Z{a0%fEiBBIz&L(hjr)v&0apJ^HMU#kHqL69Km=MVT?9dg|eST=i^ z-hEJ@l za5B7yf#Hpn9%mK9e_(hNV-XL-e`olhVyCT)#p>BVR9^117cgAF@csddSlkc?8=Y7a>GZBtqk?@;b}Qxk)yAkuBhekTa&Wm5gAq z{?r`0i}g{cZzGsahJ+{taYa0)`~OP+#~=Ty^?xQI+x}VOS@K((g$+LSpR)hl`=2u3 z5*7=2&h*W+|CHs=W3jf6XR$v0*MG{QzG1Q6Z(y;uo&KAi!6APsC@=S8e126`70=_e z^Fkf^SNgwJ_^alBPyY5iUg&v$^<9L*>9SRL%OgUa8X8y?frz(5D}wvKJMsVbjel#_ z-`c@3J6+Czv&8OXEgO`6cWxyBYdgS)q}aHsq&2{hr~>?{D+}B@1t1F2l<_?ubya z+-!-kR|G0UoEa0LtQV^v>wVTB)@Q7*SdlC?i^~$RU>44zSxT0UWnx)a8LS+ZomIdp zW(8PPtXkGsRwHXNYZ|MSHJ`PJwT!ijwVt(!wVkzxb&z$Gb&_?4b%Ax2)ycZU`kD2F z^@84Mm8Fn!2c-YynD`7Xo?uY#v))n3(ynpzh@Grw-!ujDyxHMcJZVAs0cZZjT z*Mv8OPYs_Nz9f8Y__pwa;U~i{gm;Gj9R9oqtH--N2KN}+gWCh?A@5=8k=eu5BhX`X zk4Zgd_gKvwWqyjY0uF;n|sdhxw7ZB zp5OO8-}7eACq3Wv8qn*DUJ1RhUfN#iz1+R3dNuZ%-D`QTt-X%)y3p%RuNS?0_a59k zwl~~c(>tSgVegT>n|puVdqeL7z0dakvG?;nefoUXC!r77$JEExr@T*NpLu=O_SxU( zT%S9Aet+lPcZR$pdPnt6<~t?t)W0+Poz?H`d*|FcKfUuu-w*mm_r>~}`a1fK=-bkF zS>IiKPxrmk_m6%b_KWRD_OtXW>^HXG+PyifS3XFfXo5q1EvmGHQ?}oe-HTm zy@BuX-qXJ4c(3lg1@CQp@7#O8yx;fz==Y`X=e%F@{_OWRzkmAuhadF)Am#)42euDJ zf3V<#ogZBK;Q5CGKNNmw`mp%J<_}kYc>KeAANBbt<|E}tj*l8XTKdu9kA583V_@V! z`9S-?aRZkPJTmakpx%RG2WbZt4w^h@-Jp&^Pd@(WW8h=!$JHM%_;~Nfor8M}jv1^S z>>b=Pc+=pEgS$TY@)PMN&QF>?S^vqoPhNidk5B1Oou5wnbi=0?KJEG};xpxEMW0Ro zZ2M=|KkxZ@{O8G^SAD+l^CO=>{Kuew;Qz4yW70o1{o`L>gntqLh53t-Uo8FN)ECdc z{OU{fm;Nv3eR=rHhhGi;ivFtbt65*|`|AFXfkPxiJVRy;*+1k##K#fR2yevPi0>nw z4Ew`P$#Sx?h^hgiWk{M3q(JN2Z&YTI`IziQy>9w0t?m=H+5LS+D!XD#Xya->7-y>oPC$Wt9 zksLE@J2@$NLGoR*&|GV7 zPZ^k!o3c9Pg+*p*v0P1Mr&gpMvc7N4vaYheOjD%INb5}Jr;kcMnelmsCu2uupG<4! z^33PMmBU+y-^l{A8nZ5D$7WY&AJ6$b$D6Y^_x)U3?&iE+d1-m8^IqFbwk5Xb`P%%p z{3mv~eUANS2kn^UxbGyLGn_xUNY@P4JvZr|>Aqh;70fPp=#hKod!80*3Ktc=EHV|X zC<=Phyc>$&Db6e2S@KayQOWnduYA?Mv;G8sqrbBhD{U=(63_>hmxYyOm+dGY#4M&x zRj@0@SKO?WR4%Cey~gUViQP`rJZ#;rc~iE}Fck>l@EEmlvxSZ(9ovj>$&R}Zy3B`@^`H7 zD!zNLF>m9=P5MoTHY1zYZ;9U0wsqjvN!!AZVTs-uV7 zrS1EVk;nEN$Byqjft=WW5<0o<6nJXuKf!-)?SMMAorX{EID?+qb(T20?;LgR;CaRQ zqd#bWIC&xQ!r6 zhEAw+?@h(cQ@2uXUH#Gi9;_s={S{@~8f{-6JN z*!bwfM{U2bf7$Ywethal`jb0P15bm$Hb499*^1wQ-wr)bdj9Vh#V`JNIqCP$eqZ?t zdDY&P*7egLRj>QJp4%PQz3Yws&9z{0Fi7GkMPPCXrle4{1Xhu-5{Fd;!sHAT7$idg zDJ*7k1`<>#!Guy0P|&bSh8a|dSw~n6M7kc$(4)Cpq)G|Spad%j;dUCiK+EsY@~1fc z0FxXi;5Asnax88!9zTy{PbcG=2~IN>-;Bjg!PqSXX9gkomgKLeL@jbCTMDYB5`~0N zNH95x(gaKpDAP_FM&uweTtbi4s9LiN#+A1@JquFwfpoK{qN;Z4jHa4eZ+>nTfgwy~ z8G$GWSV=%i9Fk*@GQ=663KWut6ajJ!l%pVx12h3hNk~p13MsBvK*<{1qD50RV44m} zPsDs$c%p>UhQzOv!DndsElSpf)6a0~Fadvy#V^Cyi?O)51bZ40*Nk%}u|v?3YelqlB9r2DpgSg)6a4VDv_Y51S3gIhM^P)C*xR+44j&pKC0rIEazgQ z)NfWf?T+Hn4YmIA{QSHugh?n&;)n!;C|E=xAc-&pqM)}q3`s%&Xao)chiMX)60l4X zQlyqZdMRX-LM9n#QNqc|l3W88pt$u&>};uUlN>oCC7xo$Z5&%ma261;3-R~`So};-!RVq9 zC>4w;O-dd!YJ=UgLqpcdp?nEx(VETXY;(Rn4M7PAC2$laP=El1C@e-Ghyf16e}aG@ z0!2v#AyJG#K?;K@MmwX9z?3AWrBFSECQ^`Dj#@NymV$8OKn={Df^g@Nf(t6_=>#rN#iTBz1gNjnL-NU z5)hL>%(EGv!%2*wFq{EGNddUnQ!s7Dfy&W`?1imaxn=gUirSXO>Pe%VUMq}K5K|8$ zQAQOEAP@|LFdzmX2xd3~2m~PjL}3I+aRPxD3*sQa$RtrzNf25IsUZnH1}73oqKq^t z=`;yef(aXOehV&|E)guH#Eb{F;(}%(ekvB%f+RFy2@MPo_E;pY4&&8PaD$4PCc~GQ z4D%+IkNaj^=@{Q|d!oij5)u&#h(ZnnGtUJ{6e4km0wp9MDyXnD&z;%0VBUf~E9UN8 zHhxv})OAxv&8^KXGGUB%0>vd5CBbL{Vf>15Je1MGr~yJ2Lq!NI216GpOrQu3g9H?s zE94lUksvw>(-5!*Mf51FCqbzSQ&CW+h~p#q^|YW#!f!?rrc?Z>xL^w7U3kdBCSZ(P zCe-4bYCL`vE@)6;4O&@?Q9q@&Xu`t!F^d}lE#+CYnW-+LP9>p)B0>nDVwe;mln9qV z1PLN)m^jxrZc$0=?)n*9CyrcNF?#WcK$ADkp{HnsmWDi5B_kN9$jLV$z>!%4=qAq@c}Qh-T@Bq~rH4QVh`i=)XHn9T#sLP&v&vq7$p z5Y(ek10t@Yz3HMiW` z=t<2pD3l}vm5SD?XroqcQpyt*lujVSw>PfIp3XaD3H8{VD;*SL4 z*6LJ?Qk&&@wpoEt@%2oic+a*y9!nso3B7(OVBU>qHwF0ZbfQ_*HqEx=sq$|%-I(>%81xYtd z)*xFGjMKlMQt#`suB6&e=M}Wui;iTt+LIkybi-TZ`fPx!Cj}{b(Cd&?)(`hKWEM82 z`6lI6Pp@d0+gQ^w(lIJG(`}S12$_=5=@ce|%52bC5;Y90CS|&TvZ`T=3NUNnWF_NW zj22uiNAyZCSq-OapiCW{sYcQiNRkrP>u|XatCLc9G?{z(!kNg>&6sd8%vp}|S5x8z zQ1n`qcNhciLF7dgZKv>CAkvW#wT*@x?F(jB@37>0WUwU>uB&uRpFO3iby~}u>8n;QKD=*d`~IWLzWuhK)|FM9 zMAL*!MkK8hMUt9Cr>CS^^s;27$fN)ba!juvb#h#Nfcs(~7= z6X9}Du~fjGFC5ZFMlOVg&Jjl~M0tw|?lPRW5f|(OVs7x`Uc|>g z;;}D^BTov4>;&Vsn-mw4jNP>EJWeiw6SmRNZHcstRKKQ^f~2*ZbiX3~U5d&VTJLLX zRWPG&ztz>?%|E((>!nLKZ=AXR>%U*T{`L3Q&whP!>*u2fkBn`qD<4xVAy8)7Af<7o ziqsqElq6-Ql}@)3`FVNOBNtSZ&dEtDOVVVjXj(4e%Oqm83NdLzD}>=%(4-QnX%QhM zOc*!;z?de@N22D!!&ahkI}z?0h`Sh!T@JCgV!Unq*yDn@Gho64e%yU-OuO)_4&jh? zFzyg8I!%%1NNgv{UjjxiMdOdr#3P0FnM~U)PwST2g1YjcepI(%M0ZNrBWd21iu%TE z^MijL4l?O^F!($3=S}dz1k&1hb@}2}nUhS`Eo`ex8}iNtU`D z6?4A6vUXE&&Vt+H$8Rt6G+C1KwVHITQkkd~B$^;*29YIZ>9Rbg>@1H#I#mvQjk1>z z@yp=ojiT6gfO`ZI8~}JnA^r)Ne;x;J@uMGeVqb7#ZwX?Kh`%~09&%V1eTqWPCTrHA zyyZ~DS}0}*EE5(+b)j3qEQ@{5bMFA z8^P$EDDS92v5iJA=#oJ1btBye~7#9{9>1etGMV4kD%qlclFHJX-*-1cNTIPtc8@^fmblI}tvUR~l zEAOva{dCd#?s-cttScUOj?~@5$g2pj2j?D^!gp}V1qj`TLpy13y(oGYk9|hSI|p;l z12IPhUu_e8wL=_vKp1me$i4z5bczJG62#Bq_*Zzbdxb+!smTt7;=ES96NujoMX!gV zRztBX;Dq%!|5AqenYZYvv*dxJ8S3A%)c4L@$TUP&4U{qAw|L9jTb-eyLIsDy^hx}?>xSF z_TjBd4y(d$RXD8j{8X9UBD1Ba@+}OJ68S1zxI+RT7I1fv!VOT&ci^zi(6DwO`l>MQnLrfeh+lC8k2uh)Sn_Es z|0p+VKM;Kd;orc7hbYk|QRE(B%w<4ymBTqMh&>>TZC7GzQ0_ue?AH*xO&qyFj@~UU zc~)Bc(m&#Lpr$+3@j{;4GN-a?M*iM?OHN$cvvkkGNoyL$Z>VkC*>dpM`n#9@dG^3A zM~aMrGewr4EVZXd9VrTzMe0hEI;`q^OR^)Q$elNHROPm56)V2+%w37gcBAYYB-Djd zos@bbEN)|lGYOo9!GjdEPCRrQ6uldW>JUcVg*lgn(RbsAJz>ZE79|W0h91QLcQEN4 zKGMxcAH{RdgQ6P>#VL{SEG#}IjNJxAZUxw<4f5Rxe?Q1Q1o1Zl?Bzh*b(bqRw(0eV z`e2|gXmq@gWR7XbayFQ1#%0<@C+9a=19S6hS9!;+^-o${xoPG6?JJi%%rt}i6goed zVu&kQ>M~1RR+@o3m2xL1=BJOSES zp*M80<9c$7DEgov_KKK$m(P93hhK8=Cvn*Q1l0?!^*58Pd${*5WH`nZt`SG>lZY;v zbSEfcFBrc?JhTlSwwM`oQt})qcqrt*y4Sgvnha$8{Bse5KBNM5N?- za7UeS)C5~qtGn`>g1T?qqrWW}vDRI?$g^_Q)U6x8bD9aK8E4>1AzUdER|@U2$Xsb5 zcv2*V23cWVMP=>E<)h|5E%OESsgFq0bxd&@L3g5pg>dW&lo=`fa{~5hFsf50IYRJ{ zLJ7A)_?eLG8p;bsaGyrR-;D&HVV0oX|G<#67ZT1D4{P9jvKZoQ0YoPi(%mp;C%|3- zur~t<=TyWcK|&W-@RGy7FNohQ7`9za2V15EM@|f8lm{u>5yF_94;8hfjcO~XS>!2S zkXJb`uj*?@#j>1H%U#n~)lHc{)n%dn4mTq$Rg#yc@#N-}*-J~^>~m1H?Hsz zkF#GeY@Hkq&TM_{9}`p+1PMngDYtm&;ugl)vP))X`dc&0=H`^O<&-V7j9P9Rv#6wK ztjlecxvdJfRsNR93aq%3u~fdNvSLnk`EpP3nzGs*Ez@?cTe5oBs>#a>3_DcBeU;`0 z03Cz)>&5ZwVGo9e_{i7B^J(vK06n-Fm; z0eq-Q3HoY+uFC6)x)Vad8Ip-bAQyz(t^_m)QrE?Tv%=W>0`4oW@ClD|R2Z`y=66q+ z`deN_P-1^f*_^c4?3R}{XO_2S7fws@&PXY3%?Qj(^|d8ceUmw2cD}RL>PVHl)0FNE zbwP%vAVcZ2Y6^1;N=s*yl&#ImUl9l#|8~jgE0@;)_RHd1o!_omIblv9=eRTPX=?gS z0PYYAHh|pqTH>f#aflmr14l2Bzy)q(XF~L8LF_?LcsI%N#F7_u_+I6?p7NllvEVaB z^2==JGjqmyKyXbgJPY!V1KcaH=sJSj5Q|O<*_Xs@#yT%~;-`FG2bi!H;B{4w4VwLo zfi^2FIxSCcg$qWf_@-JM&Dw$%WAV(?;#QM;nl^WW-0Xu)9waB3Vy0_Gkta)Akg4$6 z3(5nn-qID;+@+4<&C^=X@7#0!Hg2=I#aA>mcTJBRT{Tk1`y$ESVPo!Bbj&laOBnpl1MhPt3n7 zq`Asr=v&Pes?3kp@YLI7)l4q7FvMW_diL^CI>9i;cGUZ-pPKCeO>uF2Nm}|4G zZy0;Nwe{TGImc&DKR&bhz@)m(e)lL>PDX8tW{p{YyTTV7Q+scC+HO(&cfyE0aO^RN zdr-_QusIC2!?9a%?si15ST5a!&&>XTZp-;;4J#ggfHc6N0EaDH*|}q9EejkDFD}1fz-h;$~;qQD==Qr=HH6 zC@Yw(cQz?)4eI={T34MmzfM6bV6~dgG|KZ*72d+q0#~!iG$A!@L2226v18AUt3O;< zyT5M4k#V)VMvquLI*H1G%7(-0FjVNE=@LRa&5lM;SJW*S*7L2$BesGQ`1phyQhYcQ*(M;?Us=h zjg=Xe0(WAOOT8pncRMZjQIY$Uir6iV+yzG+2iV7W(c4irvxGh^hYx`4-B8Rfar6Ok z^a+I10dwyH=nH}5ZUWjV6h8r=`yhIeaWg=483ylx&{Gh*1PTuVvHPHy{ZP~vXW`T3vN`;8=Z=}4_jUWY#zo~xg=AhG>7J^xO;p+&r0ynzbFv|SlB{s1!Kg#^I!dc!UR}bp zbXjhWw#ZXlQ@wiPxc17xQonaWRbc)IUtPeSS(>dYv6*~!b6u`!feJY(Ot{RAyCh_v z0EX^ChMoZ9m`}Eq;>Z)I@Vbgx4o0nmVwmslHQ(YGK5si6lRwAW}Ps-%`W@R=l$R9h? zVa}1OEMoU)xpS&KXQI4dqPC#fSlD7Ln4$G8NXoS;nXidF=9?lz;mp()& zs<5`)UFyoU+j57ya*W^qw9YyZ~&{YK7j__84u^S*pqwo&E%+>HUP<$2QUxUOqK=3+( z?ZtsMIBo_K(*#AetJ=TFR5aUMn3v?Wg-~Qm_S($F&cqUjq1a(AwkLV>jRiJiR=P4hh04xU zIqXKa+uD+qdRVDGD&Ve07>AGT0NKZY*kfX5qGNAB5~hj1ScJ!H7RMe2Ih`Wth8VpA zp!dYsagks#5ZMMsu7qMvV1m0a^bi1VLE@{Z-~tA9VAyUPUI?&T;Fu;PW(+iRG#1}x zRJJ6kCS@eGcrqI2dNT^uLMmFSBouN?rNR{^)HPODI?Gr%!&Ed~@0p?Wx0!rxDcKV= zB@T2> z5#GkYTLf^PhV~HPa)3V_WKV=*>T&icoIL^<)<_AbniS1eeM_pTF-@;e7YZq!Os}z~ zYjtXYT#d?&kbA7o->NT~X(((}1?DGLe4Uj$QJphh_m>=>%j$Eb`W-obhr{p6^t;mi zuB=k0)$cajbM;APnc75ACQNScWGE(nrbO&M1E|7fy;T%D^?HKO>4lx0`H4^@5 z1$k2?J4_REP)?IvP%jhINV((C_(m+D36F09+4G=;wGd|$#$5%+&lSf`2IK4TggQK) z35Hi<3Dpq0S&1|m=ou#6tYmX@(eQ$5ohc8?_ot?25o%4mQi;h;NI|{6v{hd?OII{k zU$HRL-lWf+pvfDr|I0e1?sUI9E#Mkn>dGkfm`gpDQdefcl@V~KmAI{W8R}#sCQszm z>!?jAep0J@<}Ny?QyrEdM``?|oI0nJU6HFVXw=tL$~zMJDka&6qq9-&1SZ^#3&xue&aQKZt6auvqdD6d9Z+R7Nn;QKno*+03$`Njtnw#q__AfhR4Lhw!JOkQ@d9MoV65Wtn&0?3NWv=ZzX!DANNH ztw5_o4Qkk>K^MsBV`OKWAibN|$8vwPO*~x+IO2z)l$^&N8IS9T;&}Sv|SyFPG!Vl5# zSqZd}1ezEXBxejBk~0eBjzamP7&(}51P)Z9f^vjghVcR@Cx8h35U&{G6o_KWF+oeR zab$KgFCdKqHLg6wgs85GVT2ejJldM&AX00-3j6P?qCVhmq z#FPGa_zFVS2^3^7D0QWl`U*E}-TpS{!emTz?D6eK?K9h|teJ>TD$Fz|wN7t&_~7Qt z>*tRb7H&qMJvh=%5XUjRoq3HC$QB9QjPS=0ywL=Q+0Ls)88;Ku65^2rP)>@NbC^Di zUxG6b_)(D$<$HkmeEzTi1y!e-QuG9(65(1zt|nzlCN$4%;fv`cTxOw2IfS4IIxAW} z)1B3zx0FfJD;3!_8rxWXs!vl~m|k3%_9wiBX}$tx1cl@T3PMv~QBl!?go!< z{=Mtri>{x8!ADolZm%fK&|8%)(7 zm~ads8chgC|4&6DQBgH2^x?u1To z#Fz@iRbo^LU`i%BO{h#bA>k&b%e)iZIv<_nr;>bq6QkOlYnC};V4wZ44f*2Uy1O`U=Gv%5=H_dDt@b_6cv|J z!eSjf)}Isb<%%g0p+Ip3Ov(X52IDjmf)vFhFmu?7Fi1!vsZEz9=c{$Ol(|@8@Q|4m zhMbyIGKqSth!OQ)C@#wMdvXH>!;4ESwRNM;T)FYKrHmb3T)T1MUpG(Re{lZjku@up z&Dy_j*TaX5$(YpL-TemxCTz>3KY}lJ&TW_{6>b3ISHa+P7^$Pla)qQq23JU-GAZPv zfD#g@fW-k=?8Ah`1W+u4y*i@Mgt}AEx;jrrz7dp&a0NstU|bI2%*hN2VRroy3Pwl> zreU!Zft4_!hX}oxHbI6wS)xm3tFYvhra?;dFD*WARtSZerS7~yQBH|3wWKPr{lKxe zz5nL-S5I!%4Fw_`K__MVQ@=kahk{v3VB)vu}^rBH-D8WaFN@b8w3YSR1LKW`Tq4|lJ*KSBQ!wM5GDOFTnp6Vzt zk}82*N6U2*nVwSUNrje{Yh*GFbFhY)@j|-9xERDiSi+oKz%@x4wUyZh7U+j75{DZx z6<$=75fW9*SSPE*o8>QLK9E9+JbtTdMCp$2PrYp%Gj;#^%d>0WA6dO))AIW_equzv zVRi+AU4O}82(wA>NAUHl;PY98hQXts)c#fb%Z%;6D<%0R31w1QD&pcO{BDp94 zsb62d{O#qVyLT^~?byA0^OD^gS9M;x{)U)1 z&7zrYQ&S?v9H)^dQZf^zV2+?9(n^z5Ws<3r)yiar!bs6NDV+ox3s8fHmZj60Y^lkq ImYA^r0Syeo)c^nh literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Convolve.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Convolve.miff new file mode 100644 index 0000000000000000000000000000000000000000..3a47d2a549571eaf6f8dce6c0f80d3506a7419bd GIT binary patch literal 13013 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�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 Ju|~Z^_&crJoxhG)$F5jW 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Draw.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Draw.miff new file mode 100644 index 0000000000000000000000000000000000000000..17f8e5828627f7278639201df221b0bf9a64ab17 GIT binary patch literal 16232 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

    FDm~D~&(P9L$I9Q;CfF)8Alci`LPvxf2}H59 zL{ZhV>RLRM7EIVGFWI6T#pqc9#b6R9I<=7!v;7__L1}~m#QLto4|6Rl3!gtQ%P{s?k3T7w_AzkEv~ zK}d<%a{&5Yz4%2=2nRkrL5Rp=L{5K8nN2XiYs#)YN--eZAuQa-BF0lL%2hSR$|T9& zKh?t35+7mh>tt>%W9F`A;4b27i3?0f4!{?h^JvN1CyMGC?{h1JHe+9C8i9)U(eJvh+qa(kFrVyw_lvQrs z*qJO_6Jb;ml4GS>D61MHDIP4$6)Gki&&P_>wKs9~GBLEaGxqkjvW`-)PI8d+slm;E zeB1Q!9O*$UGK$&Fh09oxPsyB1(nmnvl~>K3hFX$R%tCs0n%>odln4Y*EUPwGhCE!s zHVfNrPo=#igsCIXA9>G=IgbxGkN4Y-^qY=XI}NNy56x(dFxieG3CnNr`9tNCtNK?@ zzm^x@JS%7c}8@4#-P%qFeDC}YK; ztIwjV#l$DiC@f1Vs6a%|M8QQxBS=Y1iq;yeQD4X_xjrp^eu|7c`1GOg?3DBPkjK=x z*VLrjc!PKMX5{>eL<~|1_J8IQ!japTL+@{XMfi$-KKL) zilo*h#bfPT(=yvLN_!JBYJ)R#GHes$jlG;5tqe4E5VxQ|(^7c2p_au}_2LR}0e*uF zHa%HBM{{mFDS9~pDy$H#s1OAQJ2^cgGnW*Dydss1HM5qBa!rd!xHB>eh8Q$Fxvsgn zM)1BzmqD|$h)|wmqfRqpZj*H(t?RyXi%RWeNbU5`8D+$se!i`FakBj3o9QE@&p(}h zfnOy$hH&qzroLsQ?}hs;iuCd;u%%>*HjDSxx3%;xun%@OD-3RadO@hC08BE(osUm* z54VxMz-W~%91$p%lcHFbq?nm6ADt%?m%#7pOvA}ZPS1cQC83~XqoCoTr&IA+-Zoko zL^=?QH&5I@Ly-Ejld$gT$l1k!o=L}1CaEYGm&%{%Xz3-qmWKi_maxqoOZu^-1qv)z{~6I*N=N%-1NS@X?VUH^yFV(5dCl2`yUXAKHPwQ zIj|HAru@M~DwxRt*p1zKrl520l5eQa=*w;ZiYJoin?w0+4(1SKW)$dJm>uXbJp{+c(Z0r zX1(kCzBM!7N??E=BK8*^JK!%2JbIE&|K=DL9C%vdx0b;qA3fzC9PGC%5Ic4>WT%zW z=|@kWI*kSUG3j)%e@MtNzuo?)f{&5$R;gGL><8iP*y*#uej7H?=>f-rLPUO>tq1W_ zg8Yvj^E>p}C-_Hk5Oys1?L|I6EjdP~pON~X3Jj6^G0Av4{!Jm)>qF~g&^mGuJ~I4U zWg9lFWUgeAgRs-b15X`W9e7miw|?!04R62fbnr31a|iKpE69%ItsVq|RO|6;C3gRl?+fyl;tuMapDd=%#@oS!-y5@cfjIvM z&H?c;|6l^a&e7T)a_p!G=S-YCVqYBEiSv&Mghh_RKXAbxc*rpsK28E*=jk9h7AO>j z(3cYN$O(jBHCxXjylb6XIzGvp)^6Ff zY4th=KK;Ly|MB2&z5Zunwe7DxUU1&pjOgC*d)x2l{@!*vjX>D^5}%tNes2>b5D3OF z0)g7|d)v|!0)e6;5biYnL65uDUqm4xL0i|XIeYdjBkKG5XukqObnHo%nx!;va_fhjFYrbnN&s?3m=}G5VLd zmjz0MxVa?(f!1K92TJ}s3;!=q`@ThQtTTm$78};*%QbF z3IQOzPxz3qgs_~jny`)l5w;Ov!l#72goA`H2q@tQ;V3~w5EC%MS;BcjDB&{U3gHJr zEa5ugM?wZcPsk$_5{!fr!hOO6LOr3G&_U=W3=+(QDZ(7#72y{mkw_vs5#5OI6TOHa zaV2pbaWio{@l)b{;vphR{F*2vN{CY8dEzDF6=F2;Ix&@~Cl(Oz67Lfq5?hGf#3AAY z@j3Bl8(SMk8^FfXW|_?zo6R;mZ1&lFVe>Z|q0JeazuTy6B5khOq}k-y+_AZDQ*YB@ zGiWnq^U{`J`;M)w_9zu&2Ep~VY{PtXY4N6Y3#1s-LSi3S7p~`H)J;xOXyl0+iC zPg+UxBON69lR`+BNeQGJQW>e0WG4M%(L0O07Oh*fd(l^mB#SOCid%GZQR$-AMPrM8 zS?sbHT)cJh!NmcK<%^>hXDl`?Zdz_he=e?dM$4kceB=aH+)edHJKyz|aS z?`(O8^G@J9%6G24lmAZbJ45fhaeUWth2u^~o}<(;(lOhy+_Bs7g_D!hGAG#SE2j{r zNGH8hrPC9qe>l52Gn^6U0OxO=6P@okw>m$gET({z9h4)Kzfp@qstH$-F>qFP^cS-Lqd-v0K1Kw4=oBnR)yCZJ4ZcE&D zx*c`9fPx5%SS#R z9scOzN4GxeUqW88dCBo5SC>>QnOo|$^uW^dOASkVz{TKZPz1(Xh=r%mw=(h2|#_)|58~<|? zv zeNz0%>z!M7Dt4CdvfcIBu83WYpT7I);ZLuB`egS=6-$i>wo$m^iT7DDL@2Cg1MtRkH#OJ3V;Ky2233DI~ILx?6}|Y z=;Px;KVgh;Lc|iqiKYX023`-GKe6Y;k0)NAJa{tuq~#R%)GhHM@z>(Jl6NI1B~_Z2I+EXm~`ly?cXGR^N+J%p1mz| zl}Tg`@)dHmeC+SL|DJiy?%dIH73aOrhn^o&>`MW0@jJWk0>5iiuU99i{}mAsQFn!T zCGN^UHAgjd->?1t+V_^oCYSLs(Ht}ev# zV;{zCi2E^~950O@yte<^PYFvCen|M|bX#7`1$C4G>jPI{djkld<+b$LH}{&?lb zpHl);9;bemdM9mJT3otA`ZwvL8DD19WNyyXXL)2@$@-t5m=N|>{c9chj>SR zXU-@x4*rDx)N*(4-3rq-Q}KT={v*4@yCm`6d-tMB$)&1NOWEJcUX}-yPu~~bAF1G1 z^j7|*vb~B^)mXi+y7s~D2bDEDYRYQ;YD*q&eR#KSbDgn%Q~jNWjSa<*Ha;qD+|+od z32OSOc}ugY<>QvpR#xl%wq0!x+L8A9j?X(1x@`jeR;-pCh6JoXGOE{Y{T4N=FIchyydy(#rrR^7d9+Zykx(8@=E;b zm)8;hc>fbfXEH#gd4P}?6Y=37OiZvrDcYpqK}z1o3Z5if zq*V!iR7i3nG>ze@{VLsU1^9yu)L^VDLWV{NYJ{{%jHSf{ z$x1){z5)*#*Mo*osVp~uL3V-gak?#ns3d3$B)<@y8e?h?Z#D-!e7Z&3 zzBQr#^rODWp`noGHdt>WJ2UXk?)c!TkSCSl2{5QG3{NY^!SZls09HjbstZVU2Hjj} zZU7CSf>b)>;mh`cp*2F@I*hws%-SeJpl|^%LKH4zUE@O;k?Pv;)Lv!sEI)3XA9Gg` zmW)Bk7?_ALVr5_y23`@fB7}@9LRth$yCQ~u5DPM7qWo~VMjN&oVtDyVyy#qfo~bmJ zGZk{6vYY^xy9>+Jp0S3;#T1h7b89cQm_M&EZxFX`l-2IO-E_XQKj2{;lgmEG5~<#PO~cVrZaq)&~hfU3WnC9 z$eIYr$Kj&mLQsiNu11J%Xf?GFF=PCwKCvcE!H$>Fu47QV7}8>lD`G$`W`ql&a6WVy zWnIP)t&(ey$qkW-mkoJKG075;>qTd|(^<|S;sCPjKsK3f?xWGI&&q^v<=Z(TwvGtN5h6PRWP7p$iDG9@!$Bf}zk*Bx$&QfI zB8HPAi|j~qb!NEY+HrLN%aevI1rZ+*S>X#Y5$-y%bSq!77h(rPkOoEK6oSkMMSVm} zwKndW64A;SF=8lMheSu6+bb$oDdir% zAel-dQ9%cQ;Q%0HfaOGEk#RWk0DH#ad-d9pX?fQ)@8Jks(6R5~;|l|WXZxP)tthf{ z;n}+INX~2rXUKsB*x7@&wjhB>A=-mD$3e6Oh&F%&i9x~@Edp^1lI#IorjsM?mfWRu z-Vz$u2VkwBAuAxkN)EP>$wMLJvXC7qmi(X)B!x?H4~)SC8jSJ15R612H6OZ!GA<#& z1%!5v!#amaFGj{hMMNdtFvj)whK~=PYU|u~D|M+%;6$Z3*pjUdW4$iT$?8j>t3B7r zmcpqsMw&;|qff6r8;hG6RZk6Tr-wt$PvEj_62QXaj!b2_T4NBx{R($H2V4t@L9~Tz zZ5R$jhOG^*6mW3Fjm035Xk-$AuN71m+7dcz8OUBjg_gLmd~nbi?g-*VXKY?X=5e5J z68NGcOuj*L?2k}sB(hxB(zCkMWr91I%i}uRnSpW#xM4~N; zK(e)`5lIXJ2_X<6BEe>RLAt!ZRXW@%H+P&H?U0Rj%gw!kkJ~os6Fp!a4lhKslp|R# zl&|E-S0IvQkYFh!@%9yY0ck^8uIaE4}iU%wt@PT+M5%xMEcY|28PAFOlvzIfu zK1|+HM6}9Rw8EFYlu29TOa7b*T@r>xDC3l>Fr^qfr;x}wNHB_=7PCS?AT7<1m|uP( zR^gu&BfgV)uBj@evM#&najf}?`e}doK+pM+p1}SNR&|aK3b@(Y5J*H@7m_!Tw#pXR zrVB;ujA(m>e}AoTsKI}*Sv=e=dD4w`K7w)*JQ0BxN8}@xufRfAW1&oidW|Ad%cjoS;5;PlWgRR)^NBhINW7?!CHtN9+9n$ z%)F=yy&j()t5ICT1PLlhYy|hZjF%{mk5MHDsT9E+Q8qulDI(Qyqu@kt!oCOT5jCc+ ztZIu*y2VyMB`Y6Js%y(_uBmJ++*WF6y_r@YrODswO!1*p*2*Bx?a(vrwZg92 zTb;>+d}rN0S?s38R|)1?ObT zqI3&TVgYL{oMsEB!=iX>iR`f4>dDP-+%FWYQz7RX9%)C0u8a)-@N_t3YV_{2$cVDh2ELg_JR;v_iBcnD%he6TU`Uokc&0Z%{tU9f_fx?# zi0gxhmJ1c@71$O$*@;0LVeTqODf)qmr44#`)(RvkRm1ujUtUEQ~&1D0wy$+VkXeTe~v= z;g1af9e?}a`CyW@;bEKOE;H3h_&tbEjz#TL#Ed*4Hx1<`A~YQbG+;afomLJqYGKwe6&!Y< zl=>2?L1HPwFk)DZDz07;l_wS?A(SK`R2C6q*67E>^$X!u3(9&+Y_}!8Zy~97A-mhG zYG`X3xLjN^JUeB<%Yw!7694zJ<;`o$%Qqv>pWm1nPnjO|hPn77jT-=ZfQ+Rm51)L$ zSj9GN=t1M-n9=#fNlT3Rxw>ysSUa>Sx@tL=vlLOR5K>mESe^=ncSO;e8}-aAFX9eh69`(l2zOtL~KSi*$dX%uf?gejD6i^R5Tq`Pml zMhwnfpSGk-ThgX2*T!C)Z=O6*w|DGrErX8$A{S9!f2G?Ta(KK$T zm$;&r(=QfkpG{4@n45a_Vly5!k)ceP#0S5#Fxe}FawtNwEu6JI!KCb+xHj=RdD5br zvRt2d75(%@c+a!Irm_7M1EIRQ+bI=;3AMFaqX~`b5J%k+OESesF2*Yriz*SMh7MLk zNIi^H(t*2lyF$dKM$BG-!^Qzg4UOI4D;o3_G(%ve7->n%u8qhv3I#V|Fq046Q1LQ_ zP@YzEN0;4EP`^;wGoRKreXD!8uE%WZ9B6u?X=wCIi));jw7j;=zp+?e|2%JXzE}Ov zXQyAz&AfiTU8nU+(r$?k-KZ2X`P?-!>841@wn&zruIStDiMY|1aif;F2^ji^_aHwz0d=jUHN-~UBGp@C72ENZA-&{WtNHtZnaF{8t@-))BhOTQ)0a9Ya;k?qgaysA z&`xne6Q(nW!^$IdUE;X=SeQY`y@9dQP_UT8YC{B#bfgVr-GylxD42_4-F!s>Vt*4M z8tJ4`U&IK3`7o(K2-JurU9$N88>YHQO&$WIa%f3>D3Q-f;?VBuQ-^C?yNyl5rnc$Y zE=yV4grW2F;}%wJ^6>nORguNg{Bl0$`Bd|ZXY()T&Cj2WJfGdEi`t=!+Nsm9lGHmA z)Z62=tOT6MKTb$JSloT)(eQ=V@yngl(x$OPwdS)K^|h$ZLf3XjL=C9&YL%%eGD)r~ z>@LX7RZ6l@APceAbL>lDN;?RSQw5eqf*D7y*;zhg6E$YTE&<5JFr^LUbqPhraO?(? zROkz|K$3Q6q#UH(@uiiK>2R_fOaL&e!)Y=o_cP>wkFK zCmU+I{cN;!elqEqIdXbPJw1>xGkj-ud|+;-?%Cwd1T~Ib32HbxY)5?9&V;BvN$Ndm z>YchcI3aUS)}!MUBbQnywJl@U>z<~_QVYajmrOCskLgxsXY-}k@Nibj>rlBdJTwEc zGoX|Lm|P8#2M|^ZUN5p6wIxpwcoqU?CSv{k#C~e%0uX8@u^M1WS7d4>Q&fjyWxg~6 zOftY=O?qkpUr>y2jT}KX4C-L0v!>P3HZb4x#8TI9NqRJe)n4d)c(|+RY-jEMmLg71 zRj|4F;#Bu{)4ktM^xv2==S+?5j1R>DH7^mXCIB+ z>>3%Z=&^wMHkl4zng*4r)v6dB%8G+YcVt)}9M+YTT%HzplSwgxv^FMtfQpPz71NID zQG4~UWBQbH#YB3;LP6UAoL>e=(jZci3Tw{FyRVA5jj(P)cGpn*L>MU1#Mi@u5juAo zV7DXOERbATP+{pBoNazGThlkAtv8EHVWX7Ony2V~Bp+!zH{Pil@3=JCd11OEbi6BN zYS=I{u`6D>D;~qKJ3+cTL9sg_Y)_JAcbXOZlR`g_j5=J{b*^(v*JU1S=(5C@nz5oz zVQLLulP4Bk$3s|*+=T`8bg%{?cPGV}6oL{Cs}E9))1qbxh=l-+5x@b0bQ~?W-0K|H znQn6=u}r&5j)X)G`zDN4L?;)Z>^vC!5eD@zQXd=BOlQqHbEh5I!!$+#XrGgmZ0Q@a zG!0mCyDeC~NoHD~%RTYrLFib=x8q%BM;qnl#&ct>^2x@FlkL${15u;Hdy+!`h`kBY zJvxP-E^dELRp6br<7J&E9+|)Gd9H1rPHX7vDyyAODjh-M>LIB?$-B-0vm&E%l!`(o zSkEN4fUL%FX)T{M3kisqE>@$h+?=s8y(IBh-x`dv;N% z#aG+O6x4yVVHz^y%o}xqN_+twU$F3aXu{NE5jU6>k9MKRrsAm6{ST!h4S@p{r-rJq zk%z(N2WQ60&yUxiA8F<^m+wr{>`jZ=n-RY+BVk`g%&wI9&vWbXCGJe~_~#GCLYkf> zP0Y51LGW0;S-YD9pmBR^YT+so2;=U~Hp~8A;ee*%8YQ&3Si$QuaC#FD_v?jEO3^;Uo~~rLC1Lx+_?`8M ztCiS>2=%U{sC`*coZ_mG`XTW{^X}rOyz24r$8#|wbFt=USBIX(3`|Epo;Xp}w?}V0 zo0XoHTh!P1*wWfJc)PlQ31#`(7NWE=4%-MZY7qo~kjvrIZpyehLXjR4RHhkB@$p4W zyIvRegiYuyQEMTDS_pEpGuFV7H1csdk^#D;4P@6qKrKRQXOaeep?+WBK1lA@*ILqA zEpTJ8tjf#Rc7;;l0TZ|05*=*J+uITMc~4?MUmn_%`gv#O=k3{tS~Cx{CIS%T%@J)5 z5A#dV9Ij{!crdgzePCzd)8MA*%a3QnyJu9L)2geV0wU5egweHF{oG>IBv&uUw zTL(M)7utGrP$(0%%|(H7CRl`mx0#f34wMg5a`2ji6mr;iFiAd#RZb;OxkxP}&9r^g z0HYW1gU2rl+y zkgzA0cXjfKxTkJ+d(`oM{fQ?<{(b4Z?i@}>_M!Il!;e#m0Lc~ry&%aNm1ajl%dWzK zowr7Uo1cX~etw~SR?#{2ZTn1k`|Nj}lk!IcVuNvCar(jHgd{^j->n97ZEIzGOaVm7 z=ab7}u#8H{5rf$rN=;!xF)zVcxxtcfY9 zfh8>*`5+`8V}>=uA|p&I;sC`Q@=YO8&nI=q=U9|Y7G~2mRlXZjwx&_-jvzl zlYOR^=viWEAxZHMIa(1CdG~Qj;&3?+auJ z!5ltV9j>?u0|pMI5W#P_lnNTqiHe3{b)QRUUqtqxzNkl`X@YqTu&5c9cfsm@NImGQ zs70|GFpwdn;YdboQ+xqSTHU;`?sjzTMj6+EZoh#}zBt&JFgvIo@7s7!v9DDV@FeqK zPb#M?!M``3*Oz~&FZsk!!E!O%M<`k<8eUK=dxVaog9s9vU~4+<;Cq$wzP4JF5+ zlqja{jp)SL8_lMqstbkrZio#t1vouirx|Tg4YjV%Rxi~u4!0y6d7|6jlkDH459lul z94INK0Q(rsx`J8$Xs7UxG9tM0}c zN@A$m~pYfhnrCR&9Q~ z?Or^AMsSC@9!$gwVSB0AhuigMhKo)NnobPn2M%UpW2I-ts`ho`<1gUdDf$&S_cxUs zF`0OG3V0?1&yQ`>A18&S+(4a17vT4fx8?W6cYku zqR15{;d_LT3Dc@k$$%`mL>!jM~i^?@!&dpho1QKZW9%A*zq?lzW#e;)*${@5| zA2d>Ma;V_MNOtgOxooWdKu_kr$A;hJ95EV?7>oRitNn}X{Eg-Q#u9&HRe;gxZ_3-D zPh72$FI7q0Ra_qx5Oqt}QCKw`n`1=T`3QK2&o&9UrDEP4Sty>MOH&DIv~fMr$#)~- zt_l&ghNo0w5O(MW4go}we^G%PbI=@H=G$MI5C`e%3L5Dt2@-2 zcc44_z~h|XtP^mr#NT8(ZmI|{l?IgM2b2{An97fvN{`L7$R$JHcR5#T#Xc+Yw=v z;mM7%eb9h3FBC1&#Rjg3QAjo+ka-J_x!MsouQJ}1I9Ox{Eb(Vuj5v~+Q&LXT3 z4hut&(=h846AT1t0W@-u3{zzrzE985+{g*8$lp<${c&v~R2=H1qIe>VB|-s!vON*N zuPjP3P=bxto*Jy((VnokE0fb>*wvbf&p*#(JW^)DYb*J;BC8x6$BiY2ZWV|hw!}Rh z{&DiDtf|#Q47%|tONEFJ%G#rp#A}nw6v>rhbzOK|eRv{{YE5F9Mq8@URD?$*3q?vH zLoP-_5f<)s3J!RV!@%?Tat>RHu!CXb41xq9Yzc>Tk_idvpg#z3sP}h2{!TrsITd{? z#Q)xZQS_@Ef0L0@Xi~QI8E0pvU*U-)i+S$Z)&9O!u{?JS^oDpu0NjB^6}R@^$tkTz zLYriXb;`s#MSQtRYm5l1Q-)?M<=>%e_GRFyY!V#=#M~wEawjp%frhw);EE(f z{G>`aShB4_yQ4XIZ<}Fnd*=2>>F7PvA93WZvmGxh#SvgC3V6_%iD$O$%o5Khs%t=;!v59 zcMp#stDNIyCVc5TSoY}JzlRvk4kWPUzxdHwpW z;+OT4BZ(<-DKHz4pkk%wZbVE97N+J46heWV&z0lh^Hxy^!V7}gM_>enkwXxJ13?^! z!DF&{5c?35g`zxRLOi~+;0!X{Ajq8wxcO2)-+!o8*P66{Oy3>OuSma zfh($>8$VHB5!lq4|7^migdeG7K7ISe{mq5P@A%O3!211(YX4 zco>YFhFD^V73d2df!HW6!52BqL~tzu5I2C29M*^~)YS=V9uR31XNctlLC#E?lP`lz zhpYfuBr1dC%W}m;ZZg60q|o&_F)MG#p{kg*CIzc5d-tOfAYAfR5iaWAI9yTcU-m#) zR&}_#K-St{IsdC1JZJv0{rOzW^Jl{^W=m$rf1DgCel|7o0vCvvHw$m9z|*#PnX$ag zGY`c@h_Vn?3SaR9C+wU|b3&;;DZ@@;l0Zy!gwI1c+>=b+abNBc2sw;!4~s>IG>Xq- zC3}-3=UQ8~=IV%4iW9_eh9D;na0XA;cACxgmHB;VT0!2ZtRMB)S0jyN@j$ zB!UbFUxtTF;-wO~i5WhzqFvP`TMP4TLFjND|bA@zoxCD-ra0*k`Xb>+Ic}+BU;-PWZom5wZ>>-qR2n8Nuk*8ST z$(MMb7!{ScLfl_<5u7PRXPOMjq%{44#Vv1TN_ywjV#RFogK@a85@3%uMc?k{LO;p)vx~c@A@_Fa&M+A zFXyd!b*rV`mY*jU=G*6{?oON0tT0wMV|P4nSAxhdC3LG!3Z=;RROy!|u$M*9*2aRo zs_cEaiA;^e8?t%Q-+0j?8#$PQAyqK+< zn=F_aEtnqbp2xQe@tuyJaV+5Gutv~p%WK?fII&u7_T|FZ^XCh%UgN6gt*UT&FS?&k zAFtAHjfXx?;cZJ1Y|)7}rC{q)Bx`i6OX#sMyQuWgnG#&?m~@ zAfgb`DJ?Ihv{W=@mw3|3jIG?yFRd`Iu%uK({QUA$%E~;VB_*%a(@E|v&o3wyX}Q0o zu(DJnC_le+Pf=Nx$h3YapHh^P<`F}!26;EXsKitH{vttz1s*@Y;_{Td?6N*0(n;=@ zzp1SC`ZU&?#ySy5`)Y{)D^RB76 zt=zY5D=(1^l=(NUJo5wByg%jx*R}HW{DO4(m{yyM((}_>`7W6ct0?!#yp2=lLn^X8 zl`^lFc~99R*)o4E^RD@xlv0JFZRghhGEZ8T%n_M)E(s4c%3M$=KI)wL51#rDUgqg7 z+o@0(3yb=cWM^iT`6<&>ekjW_el|~Ko~Nt~3{FYQO({wDGs><_Dd?k6e9+u_mg39S zvGtP&nL=5L0x?J){=c{X%7AI;gFQRbJxvKDGS7|22sJzfb&!S^uy@6Y9zE zlz0l#JbsaKlw}uW%I+>m&u&dtzwCnlornKFPy2@rt@J}&%cRSq7Dd-2Nb&j6u8KAf z4=LJq`B>2=evbT!&)VBl(zpoIasGF+RyYnLY(R1Pe75`S_c`u!&gZJnU7x2uO}=e>JNtI^{lVAY7xra*^}Y_@aNh*qOy6SPD&IlA zV|=IiF7RFHyWV%Z??K;Fz74+jeP6UuwE4Kr*KNAB0oyQbjBVU)V%uc2DQQ#NW<;AQ zZ5Fgy)n;>>y=_jmX=wAH&6~FE+jeQ|*A{Hcx3#s6Xq(oyxNU9QQEg|m{kiS>w!7M% zYD0f|v`(u!?e283)3c91{HpZI^G`y}?0vQNf*vh0(cpIrXr^`~7v zg+2}ZH2u@MPiKC*{?ikmKKiWVXT3htf0p=J)n`*aTl?A3&mMf<@pJ#rji0A{Ui`57o)yd{>A<;?tIzdOaCv;U#5RK=*xv)?)>t4mo{B`bTM{G z>oTy*qAt6;-0a%EYe3h)t~p&tcKxO6k*Uz3=zx??b<@{(j;2hrWOD z!;e2$e<=E4`VTvQc<|%bKk9zW`Ek;ZfBks(r!GH9KV|8Gtf-Shj(Pw$uKH_dOC zUt_oLyV<&xcbnhsNVm7$1G-0aAJBbu_e(uG^3tXH*HF{)hEY}GNf zubNb6sb{K>0=@tRWCOE-hVu-3toqB#GeoV;UVS_XUQ(4iyTVsAm33m zRYI+z?$SN!WO^2ThUv-#GozS&Y&+J#*0EdIHyp*4acj88Jjmzr%lSJ(fZ!1p3D?E$ zVv0ClY>@nz3$l>s9(3{Yw2K17avKtTVhaa>l;KZKgIR zt7(Mki1|x%gn5SfvZcEv)3UuC{6d5>qC8?p`(kIF)#7Yq|cI4lGY}-OO8rjp4^<`PFaxhA~i5| zR%&CKF>Pwv{d8UWr1ZNU(KEqwJ44KvkZ~td%$%5cH%pr}CF?=9F?&Y#lN?*l+?-dr z?%buh-n^*1)%hRgC+BY}__83kU{~Rfg}n=p7Xd{>iW-W!;>pF0C61CMr9Pzzr5nq- z$~RMo%9Z7V%db{Q6*DVdS4LK@?fpgXg5HPvsQV1>bGyn?wYa)%bz1d~nr=1yYp(Xy z_nlwsQ=3}5qpnBYpt_s=to?rO->H9Y|HA{20TTv19~d=o^PnFF^&513uyyc?A)gK@ z8FFSQKXmS}w!^ZA9T|=fpFX^0MEZyWBax9)MmCR18+BkbI(ph@@0g4+N5)cP=ZtGV zu3+5h@!Ih}PxxX&)r9L4T@%+&@|!eb((}nlllM;{rp%q%X=?e@hH1`e8>jc2K5lyR zjI0@_W*TO$p7s5#;j>=NPM>{Zj&9DXxj)PuIk#zE_Pn$6t@GC}@Lw=xVf%#@3vVro zT(oyFvv}E(@0N^Q@@{Ft(uSWyf8Mo>Ubbxc_shqw@Lf^9;_k}$mB)TD{jzZtxN83D zuUC)!Rq<>2ulIgS{_XS{$C@2$nYF8a@AdnvbzRntSnspG&-%sI;*>z;M zWB0y2mOVT7>i2HlC+^#_pWDCb0CQl&LF(Z8L*$`#hsne1j!;L|AEl3OJjNc|d|WvG z*9q;3?I%qq_tXd0A3POw>iFr1(`V1bpJ_Ooe)i6}ymL>^SDb%)q2I-J7e`$B{L+-m z-(OyEMRjF$1J&^7Rnyf&*TSw{xSn?X{*BTb%{K?#`sCJ>+dti2b_ct&<*w!Kv3qg% zZr(4t|MtO_BZ$2q`;(a>m*|*P@J|~{K^2_{}Z(ogg z{q5_Y-!O0XHbphvep}hxp?TUn)w|6tj+Tqwe6Ke?)18zZnwcAwofVyz5uKMAlbaEj zl^Ns7i>VngWZ#K%FPfTOH8nnZbn(*pJ^Qz<+W*)3yA8Kmn!N8?T4czZx24(p?ydLT z8*j5rKhq(2|UvWQ-)Mr&&G48ED?f2xfsdbF7XeMT#=P)@0I} zDsV1F7s}b<^@IUUPY=sXkI2f5%JxKMWkltAA`8;v^Ri;ob3@ZB3wItn*YaN`J$?GB z;rNO5d$z7^y!A-#Ywc$;MV|ATklx8CMA-WTt@P4dV8b8C71{Kn0*`;Py)G%Jjc zHfa(ZSiF;nbaNp=w9CyTW;%3EL^P|db|5>`o*ZMcSV&GwauUf%1gj-k9mDH+PGUJ7 z$BGQiQwW7=Pz?Y>DiBiPD$0(rPMiruc?SdYP^%nIWOhc>2js|#(pnW|*cBv{QBm^B8N1A(HV(D-C4#s<(LNsBlw5sZX0 z0x7GYcoL&g2nRJNpoElaNG*$kF<3N-qMbptN<*+<4mQCoBFp)JzZK=B#TR78W@U%u zl^5+ieCmU7O>dvxeR%Qq;}iGp9Jy4#_i@8j*$?lx)-d}3@4Kcq-v8>pQ@`c++_2eN zXgsB^V>E?&yhNl+wQQ-LFVr#xB2~;1c^sZDVu=zK%mWd@Y(lh{kf1H7h{tpQM#C5b z;jG+(FsYG+e9)qXRq}H=fCFkm1CknAN3uo&mo$={h|dZSNpJ%M__v}DB-0a-n;ut? z9-WyL+_zutxoda+%kJh^H}71&e(y}wSFw+{U8PsKV-;eTVnA zmW9^z|F5)ZymI!BoWx%lV3&^CYh!;lQ$r1OKP@$Y$NI8ZZw4->p;8(uB!L_n$)b@A z63(RHY#Pa<(L4dpv=9S|lL~Uu{Zm3yjto zA{bYu&YH?bm)H|}hZ80;v$ZmWen3WgXm(m?URp$cx{R=#l#ulF^rdSzJ$@_aNOM#3 zqu0$3z21j6E^I3)h|=4IDO1NhyLHps{Pw-%SC`k!S?SiVW01po;jlqGZq}{S@?!2-?%+;tEIRSaU>YuHek(qslF*{ez5=d{$c6KarCbmX{X( zUQt9|YDiv=XUopr9|Etnym=qrdv<8{(mID56)Bb5W|=d6>eI&CO%10{7Z-0AxdS?( zUZ*=PY3mK*d7ZGsC`{nd{vuo}XzDnq`n{rR0k0B>A|B0Uz-$`KVq`$MG?Gn$DM&yJ z@Ke4>RD=gvbvVSTPywPjjAAH^K|oebnK0Hyp_E1gcGua_s+swTLtG(+LS(5SzK=C^ zfHNe=oRu1yof?{(7AChca#F)`Q(HyJ$W0CPB!ms>Uvu>M@us(}rS18pQ}f2x80{FT z1vna0BS5THI$T$GBs$_U%U#u(E*VUh^oG+$?J+Zd$-r$jFr#@*ov7(A0R1_jFAMf% z;l3PF!=aTNUdq5ll%|jY3uvH#f^!K?Caz9~dKNM8l!%b3cz2LnB6X--8E_ndaDb3n z>oX!jAO@2Jpm)KglVb{|g@>1GV{6Pw{hdhz0;4KzSt%i{Lel@6qQ6Dur-Wz32A39P zFPt~+_tlI0R_D+XfD1}Ngta`BXdoBc%%}9`bCPh$q`z!3$vAH@ow8`_E#g^|^s7h= z5;e6FJeY+BbFHH4I87}F*K$ZTi}YdON*1nQkunY{roaLm$R$)Bv{$K!O%4qj9}`-a z6q*!oGl%h*R>hkUgPmga2*E=HOVW(S8HJZj4y#_Am^?5rw$_+3I51_fBf7?#og9*r z5}KD9F1IpdE$<;`Q>&+nQbUVUA~KRfGg5++VvKrSuM(Fq%WPa_Fm87T9dtTR7!5~t z>_Ibs&SY-TnXekn*G$Iidg+=$lCx!3Ohie;%siz#2KBIJlZcs~I`1 zpehdP&BEmjR6+rTggOrksL)Zv!kv>sToWT)eLU{i0((Th$(6*hMkT{)co8Rfgke>Y z=~CI0@ZO8!OQy%i4lpJS4fKq5#`kMgBqJ*+_Xxb0QQNR!FJ2u6}LqFSSBO04BpLQJFG zb(BZ;vA_`lIU%C;5_Uw#t&#AJM*Ml7~t%I&dS-rMYDoR76kWQmYgvrD0PHAb(l-`&flVBo-2o6YFKu1aCWLQ zJJptz>PU{YIPH|qOz3Qk(Jn=}`1R55$0o}@PP3Elb%IeH=VT~Pu&O_Jcs%vvB=)C2 z81;Fce55m+wlp*731HQ)0q~$GG$^AOPz{OM=6t6L}@gwfZP)fTLn|aPiFGqS^L7 ziz55}oSHf+FnO3WE!N?QYejmT(-Y^)OtNPs*)kJdnF-E}_`u{?Ye$Sc}mgu8Sq6J+~k?vBDR55|H*@= z1@a-q-J!T!40V&mZn4xIhPlm)2X)L+UNfCnj%Ioeq5=-Z#BK?XoD&n;FU^tMo1eYD zxMEt2JAvm#2*Uy1h-TDT3#Zz1Cb;q^hUQGN7SD0?ULH|AH%ccVl1K<5rZ=mdE-oTm z?@7xX)PKYHQT26It1C+v*Hta*Q&?A!6qOfa&5C#ABnH(bxfeTxvm|sK0j?41Gfd9| zV$U zih00D_bKrK&7aoN>v>=)AFzm5PN8~i3p6!HWSwwD4@hw1Y=9(`oY;H~{DC+4LjBqmrh5(0DL&BJ1hw?aeii{eEDxIp`#r2Vgwz&=v- zrwHs8fb%AH2cz1>DG#v9qlEG-rn=1&PZ;3=%snvMA4i7V(~DOb>g{} z`Y5Yss4;hpJA0fvW30JoX0RIZm+#M6nlu~5*!b-DgrRYa{cfK5TF#hd!9KQ*IxTztYHv1D3M;iS-v5$4R{ zF3&JW#&B!ycsoIZ97niKe56y%^yKB`j1LJJ5tp#IPxX=E!!L~*d3@O5!^8TY7(IC3 z&;h^H#^%JwIg6r9N5dj-XXHK}T-VaSYBvx5!S~q1t4>qEAs#qLDNl3YK1R7)ZaMe> zhaAz8`#9({8t?|Dy@1%HmRfppUVpZcl*5m@!V~vN;t9cAqu^7t>Kx;Lo|0qOzn<@P zMkHFI^1O6fvoR+Z7kj|HVB&|w7;N6!0i~mp69!886CFj9LvqL3vPZf+gX|dtZJEQZ zCIe+R3-K-~IZW~-MOT%LFD+V{kTgF#`;U>suFRf&dBObC^Jbo&Gv&zS;oFNc`zA() z)`ZzM#)LfRQ|j$k^EfefKL!3p_Bg=H*8yA!{+L|^bFl~T6qb@MD&J=EAVw^%! zs3A4dlpLnbNJy>jGpDTT_k@hqc@^8I&AzgI*X^@s&YV5DZ^wo$1BVVP%<)XmNx$Bw z+?(lnZqi>8$sGc^*MJ=t!0T4awLnV)ja;XYgDkL_^WQI0$2k47xXk-ei48RV(hzu0 zYq>?UuSn`Ki9W)Ss~miV$L~;|ny+xPR z&t(mjAH5BrJBiI6>hz2;WsY|gOpeGJ>r5PKj_GTRDm28En&MnyQm{@|lq{F-P+h#+ zkQS3tSvjM!W>Z?u?^RW&SFgNqqmpU%sC85Mhv;?7g}pB(y! zTYoY-@E96!M-r~-=mwzJ%$QO6rv*tSK?$Re0PL z8oxymml*6cgWTZA+dMDpI!glADD^W0Y=ViG2z;J}HZfRpa zstqff6rDA}nLj0@bY^Vn?C`v)uGA6cpd2DFg-CLXNp5YDTY68#nk`4LU>O7xltLv(P{w z%^J>2YHw5cB|_bZ!EYh#1q_}fRci#iW!Tu)sg+(S?YTZZo`;=DQu+AA>N#nJQ=>{| zME9PP*k@r}<&wyLD^mK+&GOVlCc3zPBFRZ72CMA2<|lny)asD!QfSm z@-l{Bk&NfG#)~v_0EbSv?e*@E1A*4N5fSIj`g#L*S)iX`;tN`PN8&D`>Sq}88p56- z&|#w2W}D!hIQd<1f3GD=cGGOVH7HdmnG)M)ep>n5;^pQMZe-By=g^Hg2E1R z-s)lA zm@=<6<%BLQFa|A}95;AL;lSm^HH$N97iQG`oLl>=XULj@S?h;SSu{1y!O4h`5y;9U z!7d~^ghV$lBPobWa@bO$Dr+id?if1rg{RU>IBw`H$Bnwj2J3mFZVeADV*HQjs0R#x z$7MbptlvS&KdI^)6!Hj#pQ3CND7;V$jiBuf6!khJttCGH5#v6EkQ-_LLq_UaSkM`x z?jQ^8pnERmd#z+tCoP7{4E_{Hn-JtCi~dCfoQse04jtKCGpISY=B+K|nG_L|LVNlJ z^&gpDJ3GH_MbWSog+qTU8nCHw@bcny>!8$%D;Es-M7Ib$F_N@ZFgjMb}Fqe4dsEON5_uR!R z_cHMyp}cCJ@Fqr6D~ zuTb2p!QX=DGl+SslwK;4lSsf}MtOtB?uf)O6Sa-7qj90amof3cAYPlon&uIBwBDzhBY~q2#9CU-l8*umr z0Uc-5n|WXlPu&&R{cNutY`3Ghe?18wrGb5n{DY;sAdz=;hKCVhm#pGmR<(gsuNJ_S z0<@Y_ACI&)=I7i^$$XNU-&9cSP0xEBRa8DKJG#L9s@opg z{|Ko%O#(L<=q`cX2gz4zZl?}GE2V#}YD z^nR9F^r*VugmO=0u)bmEuGVz}c?Pk$in7oN5jo?gUtY1%yY4UVroX&Pmp<-Svm+yZPN=h#=8POmhuVXNl+IkV1yjwL-u$w#Qmdy`2Z^1^g5 z*JBf>+M}aS*eqwQwuct`TX+0xOY%E=L33!;tLUnC5yfx9GQG(~ryLPimoJi~yq|Dy zX=!@lZF(YM7_)e>Iz%$Rngdf4!!@Fyqtw3Y<8QDHS>Ux1-0_*tb7cON-UuhS=p7rI?$#C z9Smxu2~tFKT6jsIZZ!ccBDyWn`!C~q&Z7dBiP%a#`l}Axsv{0Dsyis~1^}KRs;gA5 zvt+lutY&vaU_(Smi{5cXt6#-KyUhFpy{TEUz0-$y#mE*Z>#bDWY_5D`FL)Q#+Z$7N zIH6!@LHfyk+Z!70-8$X);_91s&)&Ry{_Mr=#*;@*3?4nOyng{jqZEURB4g0;7QNPH zlw{aVg3CbLMZ_k677;e{h@M3S8s%t6Vl`#~c4=X^9&t;kgGWsqEQu&BBK-`yhmM4U zI60H=v0Y29qA0?iR@G)!4j9xR;3ca#>!k(5o-;TID3_y(casMZ|4JxUM37#@xx{=S-V6Z^rs{ zzZ^ffr~c5%Uw`{8v)U7t>10@(=yDyl zQZmdjnk$TKACA~6*shwbJ0pUNVvNZ-wsCo3cfw-5N}E^Zc%zGKbS2%0$-0nHP@hwB zA}PNJ*DR6jDmK(y9YJiCpEt_=2JF`NLyM$EMd#s~)vrOus4p)B7fcC0S_( zlfkltz>zxHQ=FXfq)6ieO>!i`A_xn^6bexoMBxxcpe&7RY0SVPHW9T;giRz245Fh@ zErkgzVI&DXi3pV1Oa`P;;82ktXV4Ea@`EI*PEX2n_)&nyO$`3LGnTk4ry=%0U-od z!l(*@dV({82@z5I_keo(18TJj&;$T*Kme%f**z-WRy#hYdR9*D!os@6g?$&7)y}Uj z9G>TlG(iXi!yt@8n7j}zYk@Tws0P)52GFQgAfVKM0UAK5YTW?=7}P+38U|E^Mn%DD z9*0B%;Zcx>AxQ?VAz7HkHEvBnHU|#WqhoaF1Rk7bz$Qu9L;)TyLc_K2NC6(iYUC;I z3QpaZM}}DWp$^mJ5ckCXMdOx@9RACg$|-%~t7C%_ts;kG0ZKSP1u6kVslnvo1rT{$ zfqn8<**hl=T3tKzmjM-HirjG~c?BJSF$j`9BAYB*4ge}Z8K6|l zqTWNTQmK`)HVp(qum(Uh0HjvI0D#D=yC^E)7>}V60_ibWPvZuTa!^Sm9HhBJ^ zm~^`agaP>%2?SwK1*-#Ey`omjfB@hFWaD8FMC4^^SrMqlAPoiq7$}D **Mz!CxL zNzlTgHi-@q$Rrx+LxU4}c%dHOVrDO!b?0sRr3QGWPBTXWXNmA65ga7~!vtWcpcyPc z0|ab{k)CbkHk)<7XC{pu(I?6iWi&7}3BaftLIL^OAOgb(gkX?7_ArPMYE5QZ>WtY( zYKI=nE}9b)Uzl7}GGNN6nz8+pJRur+Yt=4iiaZobIpkz7vk`A~;e2hx4tWIMaac)G<4)rr}XR^2;;4T!L^&&Tf=|K|;O* zKwun3F$9rUFF_y>>XzpU8Zq?G+~Pepu}(yzNx~*sEP?U^Zme6rVL)JzL_ivqqe#Ob z8Vc4hty~5~%U=e{Z$qdl7@!~kht)WuCQv}Wagr5D3}_ZHn-&d}Ao(uBWx}(~#3&uK zL;&STyJ)iBH<+6R{VPFtT+jce1%K57zi2fJbihd>2B1&?fvRZ&WGPt7 z!4@rUHxN!e7G%I8^jMjRm|?_!*OR-=VuQ*0&}exn8lDKc(>i{m7G9$Tf6;*p^}sY8 zFhPDDMbu0Xfr+AevKE@I#eXy4f0(Gr7B-ZFITEKal$I5>)+>!%yJS1%H#H~#45pa@ jf!5in1*2+~LfOLlj5+;u(c*|>Xl2yvjZz(n)TY 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Frame.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Frame.miff new file mode 100644 index 0000000000000000000000000000000000000000..b9c8796a7f809e57a44b136d0cd69510ef24e25e GIT binary patch literal 26155 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 PLBjR#aGL+BbNv4R3j&=^ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Gamma.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Gamma.miff new file mode 100644 index 0000000000000000000000000000000000000000..e6c8b54b3a6e8083cfad4a313d58f65a4c11e324 GIT binary patch literal 13013 zcmbVz30M?Y+HQkeG-lOgl1vsd*^|jS*)z^$S4Sb;UFq8X+RNH{r&sp9*=g2h5mCTa zL5QM6QR0dk_ce+lZitA8$RZ$!(6?IW$>hJ!^WS@)d!F|>ynX6a)p^hNeW&W2Q%H;E z%s0>i7fcHhs|yNpa2Bg%GR}Gbo%d$2dfIB8^Q~mzSlc u&ly^d^gS&U-;Y2HIxh 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/GaussianBlur.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/GaussianBlur.miff new file mode 100644 index 0000000000000000000000000000000000000000..f28631365f3507a28009f16330dbca4b17d43e4e GIT binary patch literal 13013 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�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 Pwvoyx+L)}8sgeHy2qv}Y literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Level.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Level.miff new file mode 100644 index 0000000000000000000000000000000000000000..0316d8ab84600246981b603c1538e68e7b333c24 GIT binary patch literal 13013 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

    =lF%# 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/MedianFilter.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/MedianFilter.miff new file mode 100644 index 0000000000000000000000000000000000000000..9319b2494377c9457b9357e9268f3a8b31ecca1f GIT binary patch literal 13013 zcmbW72Ut^Q`|ty9t6f^(wr>aBLXtCcPR`EB9uP*@$O2Hp0l{v&6}LLBi#c* zZ%JPMNL~&4iwep{@+vYQz~%N9XY!QvA^3{dneOHtW*vB&=Ph!N^!-R^LB2a6ps>W5 zn^j!SBLhJ{_)o>s@2jy7)!0BUSTpcnKU9%&M2-yf78PV<<+_zw>3KYks#LyzRxr}d zSA>D}9y4&zK;~7MY>*`+E5E@1d6_IPzqkneW(zwe#G9AR#AkHl- z_DcPoARd~QBgOu`rML*JAc$XYX@?2898^n`JOWYvt z6$0X#(kyowh?_zDF33n0i0^}VXr9|SQYPy?Na`py+(u8_%|tCq<&AAZVbm{c#B#l>C*hRe#zpe%PfByG?q zum9@;PnP_jgQtEEl78>WwhJ)0Gn^&4#R1Yrl?GNxQGjn~1t|Y>5&wUG@u}5%YCRMV zcZR#jouBRwhyhiWmG1%R&Ua-=gEb&4|9{Hx|L519S_diYscR4nS^ZcxGzF49e|V^@ z*Nua+-b0>|^-5d@KJj~!w~zrbGHK++zInN)?m-Mb_qG3_@t*PgW!= zlZ}>*lhw$k$Y#ps$`;9%%T~+Q$~MTpmTi%3m+g@KB0C^EB0DBKCF_t~lwFf`%Knf& z^z-xU=Qr4Ih~F!IZ~DFGC-=krC_ll^=ojMW@Qe3L_4D}U`<3{O_M6~0#c#IXBEOY> zYyH0R`_6BN-#))azmtAv{jU1`=GW!l%YTsnQ2*Ec-}i_8DSxehuz!?)lE25l(0`PF zwf}Vg1^%o2Klk74zr+84|1tj#|7-qtd&zn|(`#6-w|XgiQN8rN!g?k2%IHb0TQwqEtUj`r&4b-mYv-hF!y=^fBp*_-Wc=^foWy?0^n%HC6ZFY5hS@6Ek; z_deSDZ12wAkNXVn^I9KyAEuABPh1~QpRztRedhI9(`QqkJ$;V#x!C8AzJ2=+>-#}p zbze*0_`cbFEBa3DyR`4dzCZVE?0dfN-G2T0z0yzKkM9@O&)KiIUroP-{XXyaQ@^Hu z7yI4s|4jck`(yo0{S*4<_aEPXUjKFdf9&7X|8oC_1D+r7-T-Dm*Z|jn@&PjjtRAp! zz~KQG2Rt13!oUv(@&ls=W)B=UaKXS01NRJU8+hlLXP$Zc8Ty%sXR@9d`^VIq1&d!Gqr)EDlZ>Ts(OC;I)Hy4Q?NN|JfnW zLeE;Cbv;}4?BZuPKil-|&F2O@_ug~b=aQcr_1wJYzIpEObJw3A@cjGF>z{W%U-|sv z=f8XY`15yP81e%8Lf8v=FHC)5-3$9(xbkAZ7vF!;_@e8@>K8wLao3CIhx8iq&Jg{O z^dS?5tRAvw$i<<3hkh{BIy8Iel%Zb?Z5Z15(u*&tUW$3?!JO(*S)VVe0|sJ*WVcShWJMI8*|?H@r|o*4tY~}GwaPcZ~pY=uK_OwXajNs76j}L z=zQz7w=8d!ytVSJhPNKR{lVMOZ;yX_IBd5?8Q5!lQ-G=^#1!3vfVyqb-jGOQ(d@FuiC0Dss%Ty+4YvvZKWOLYc z>=o_<&dsgn&hu~cPJSidAp{7i!U~~7^OnY`S*1BAz9YKCHR5G$pf+3kx%Q?G(G}@7 z>F((n{TThvhF%7VxmS@ByF`X$69tVy^#!Z>2?h>M9tVohR8(g#T&ChbdpH90r=hm_}1oGIU=_DPLR zU6-c7TnElKN4*Qd`+Wd-I&)uFE#JG{1@|c@^=@!QSf0wqgU>&@pcq4g>wr# zi-L>RjPx6sG;(Y4P;fAHuw;12#FDe6Lh0ht`(-g@-+cJOhxs2KEDtKLE5AI-H0qOz z-WBN;J4e4Ydfe!eT@;#l+8&&CZLmox6rcx3$S@xM=qov^L? z_3E+J=O>ycuCIBvrl{t4EnB;MQtwGwlN##qx`lO*C%Y!^pMp%8H>G=O`qcf?&}j>% z{W(2jdczEI#ehDRcMDQ_WjGf8hL* z`5g;F7HnPk?!uW1yBB3HI<{E1c;k}Smeeh|x74+?X_>fe!}8acPg&lzB5TEomFAV3 zSG~V#-p74EF8%n@>X_B_pHQEyUGwUiDQg~mn*V9XXO7QyuT`&IyY97hGuHdBFIj)} z^Tf}Od|~)v>jve9l^cg`obsjY%aSjD{VMgVmal`q-uVsn&4zE^`*z8uA)6*|_S;;( zxpPbAmX59QTN}T#eYbNPyKU3=(D$Eie{1{VA71)l#*YJktp4%OpGN(3_h;|V*LQe! zoZp$U^VF`mUCp~Ab~o$^-m~`?(=WT~we>&k<@avi$L#xVKed0$0rJ4+gT%p2hloR) z8pwvtht-F-9-)tHYvdY#Y|=FCIBGchOS854z_HL{jV;kFCypl`?>ON)aph$0$=j`^ ztq)I)ZR^uE`SkOr=e57qzUoZinT;J}#}8)>XAho>Ja_7R`uS@YMqcQ?Sbb^mrFoa% zyu9`bc4hlj)72xtj`;QBHSe{D*K2OPaAV2M;Wxj%CEhyN8P|F7cG2xWf17&el{=sQ zuKIoF-SE5Zf8_n~@ZRM6uiXFa0rjB1E4J(M!?Nyv-3uNCKHBy;_;K5xd4K+CiPWlD zn8F|*N*YtrsFHdDqEy2Q5>gPb4^%;7N;Ls9B&=Z&lLoVDuwX4_*Wu9yRk1;}$e{Yx zNbE849Y)h1Js3_jnrHd?KDyj1IaN2O`vLE0nQBo;KUP^S``K{7-rN`9;-PkJ|{gjKR&g)p9MqO-r}x`Bp98D6(5M_!k=GCmQ7vjbgr_n8hn*@;ye%nLIRGgDupN z3yt(bBQwKDM;a(jjngVg2lKfg2!tR?u%0Lkf$blzCUVmfb91Y5y-RYuOR~IGS>B=) zwn*J;oLXJ`QDx2e(wfRtZvik0i?w37 z&j?of()8aL0Xv_R0#+&z2{{I;5mBg7C5tOL9O7|Uk|JO|37gb#gc{DI;Ry^fokJIh zs%2VYv4}6$pbIqc96>pYS5Dy-lYBZ8IYkWz)o8FuMyAdz&WH}1;Ypb=&Qny85}6#z zX>dXXj1({eHmL%DC?G_x1X4JRxYI*(3kxb|l~%2+s{FXBa%E-dbZ?3~A|%G7rZ7ng z3?&J0N(%~40m=UZuw2slPev>TaX8F_!tv-iPPFc$;syW4YPB~tqnrLQf%;Ka-E6|xSu5ik%qKa9i?pjZz+s^YihRP98 zApkij9)%Bxfl+scBd0dKa#2C$%F@b@D=Jr3l+G(IsPl%6FwnFLND-eKS|eZCNR?AA8Aw{ z3932)7-4lBkdmn8RMk4RHdtR9X`B>knVA|kH$7%mM#`#+%$XILQ?fJ1W_SwX-7aln zIBQqI3S16QGIFIEhhsyT%+lDAGeC~AD_0a(tpYhJE?rQZS>yiONRr|iQp;014Q&)D zqegAy2_uW^8AMAX90fCK00J}t8XD1ah=oTi90F!J9fN8aR7azFHELEPHELuL2`y%j z6+E^|z*lMTH5%0?qH2|ZEd#LdcMS9s3wh-q9IJY%D|$M)ZaP+h3I@bRvrOZI8^VG(le-;MW?XHY9DJ@WG#=b z6|i*z_PKz4DPZ3T*lreUrr=fzYNnxjj@+Xc_k^4GL|Op#MoYWa(xJ6n*9G4(MBOta zJ~U)@8*;kM`Q5gH2e$lXbIv?-T5VKRRZ?PAX<}`iYr*mbi&iY!yy=V0o4)$;t1l)l znNU2fIMx%wFe(aE9gXokX%K0Xma*s=n~||w7`u_SiWHCn$9Gc)gx?<7Uqxs{So!`!0Z*Dl+c;J_*tERguQowvdQ7C|8ah--V>(w?R zZMU#dRyH=+HX=HEL{x!A3^Vd7kydGFT;xzKkLWdsMT1&J)FPrL9u4;Ctl{9boMI!Z z*u*NgvdC5z-N9l%vDiT#Yhkc66m$ibU&G|*vEi-6@Md)&kZRU4jas2mE7prbqef^F z#1mTM4TJT*A^4FY?vXJ~G72ty+Ib}_a8jEd#|hW z_q$iGU%Pbb=)rv@s_Qu?1r%d@^Ikp0T5MW+YAz zvBqh6Js4;@k+z7mRZ9nJ>2R&!)NpGAVl9ts;Ngv&@*7t16RWIe;3fuXV$engJ<6ab zY4{AK06KsxSl}5V@B|rjf>xXq@MaC!s3GeG{1*Y=E#UQ9{+Q8n-DJCOis`mFyF>FO zov7mO*y0Cq-rGq97xKLq)~&wX@oP8G>3aCMtLxE&`;YG2d2s70klM8E%Wx}e5LG;l zYB&tc24*b*jG}CGTy!kZnYpn2kUify-?@Fi2Uy8!tR*DhjB&s5(;mpdT$ncZ_c06b++SC_haz- z6Z~~Qc>Lh^uKU-2yV23surEGT6J}*hqRPY*AYUN{BGRmm0Y(u~)zfz@TzTOyqm|d^ z%seq^)aHqawG(aOHTuwP+R*(*(*cvI!KmG<;eOFDI|OV82miu??7%0b82~;-NdZ7I zqU7fZNebwkA>_?HMmz$HP71^kfv5*YoN^}z?G~{Hlc~dIyAhuHM@-(mgn}-ow=30q zKh1mFRdBPwdvns*+h?1*yB|M#1bn(4b=`eYxV~`ai8&RUr?{uB42f;ihqh_WO?p$4PTwdB z`vtaMpnu^}pi|F)sZ4TdSHtb3uT{e*)$&uoNDZAQ;4=hthEOyUij$xpxbpzKMIah@ z6d3)?DYtXbb`h($2$v#aIur8#NGs^d@OGtnA9xCH=jV46=bxTGrg{I*w=Z^db=~cL zbieCC=Y#v_9{kqv+m*J{$MyjuuxE}7;bLrHHejNxbWAWC8^R@oT3sn66UP29XZoRq z^G^VsB{hduj{0_kyY_%S^sLr=R@Ap?HEm!xYuE;XIVe!|JO=7*FAe4~s7(#EtDp`Q zbjAm$u~Q^+f#?AP!5IQMt;SDLcq@ya1aL$H2k&O3qTS9Zzvtkec)T&(cGH=2JEyQK zudvHg_@Jopc2Vx>QCSCSy$e=IQXLofo_lcV+^x17*II5~X*t*4yl2xlz-WY>PYB`S zg8^)u1P9(GhiX$IqRPq^PZ+y-&e&~p$8K9$`R%5>xsCeJb6WE`QGZs{w2Ewtz&2`_ z1_^o}i|%FQ`+yNC2QC*>&`lifMA17C)~Uj7kmOZ@xI$oO)Yv&ScAUgcQYr~)ph3qN zxPgJ{88D?lKQZw44Ez&|p0o&8)3R>^o&3Uwz$?G-e!l0xDA%M~&$vZ-lh%7T?q2s< z{UX56^=tMV_;J@y-)!2nFcBDqa3ez45y5PN8r zr0%4s8x(nkQXQqR!xVM|K&t@9D7b-wzyt!?L!hORBQ&y4ijk8Xe%0x@msivca20l? z<=%HW7vwv~*E%Z~d8$6it6A@@-CQ_nbMc(bHJ^RAaLMNRb3U&EYo2Ha77QRUgiVs* zlK(OCddn79l`XC-UA(Dqbelc;ifFzfn%V`iRp9GIbv+o-EYZLcjV#_IjUWgd5`gh? zQw9Bo0v${;QUD{W6K8Hv%ms>UridnrIL4CAED72cN(Bxi{suioq3slUM1>qtBNrL$ zW@2o2VZ|drPDOXT>rT9LVp?)#ZQ|%fsiRkBRISOWT9-HR^Mcy13#V-=ulu^RW?gYTZp*e}mEApfzV0<~YNg&~qnr%n6P> z!IH-*kSV;4LV(LT61|M0=WzI<3b{;Sopxh)TJd8*eDTBh^rra4(ayw@nuL2( zDW7#A*L5YtaY1Kp6~tqb5xIxO_k-Q2fVT>GI}HwUpbKCIAkmvDq!S}LG43|4?_~A2 zS;1a`;5bvrU2 z0c@G~ZO)~(gp!oFqAAfu^Abvzri@yiKI-GtiZ!mv&)ij?c`8;r(?%PU!v&y_Y?mzl zB3yLFJJVg>g3`~*Mr|5bvt{GdE#FODzq5AU-V#rHc4B*o(fR2#j(4 zb@g|pqjzSzj>Si}+HI%J+G9FqpN`niVTXVehqf_LhZ;IZ!5uULIM3i`dGf4Ye^#UW zRnT42=&lL6-_#nwEw$z{!*noY2Sc2thzk^PSxsCf31D=EfN$YS2^9=-^gGLSi7p`3 zt#j?r#%1cvu5h!f+>kjvB!5nH!My1F`B6P&P7X<{G6JK-zl?;Ga80U1mm2SMr_9RD zURhlB?WoZ^Ce<`7nAfmu>E2a~cdV#ezpQ-B*V(SEBNAF-9p_^sPKRla>X;s*!>sZc zt7xMX9h9PtR-U5aBMfqwCz?dvNsaazqq(L5F2X&6>7kRPFHz)KHF2Q_QgwmEFOtd& zr1BymKSu=JAfQ_mc9+$43F%#0*L^WPM-&ouTw*wvTrPN~2ItL+$eSISJKLT+%bqnO zB%{{aV-z3G$AkS5s5*z38fi#P%FS>u%JqI)HtPFv;~OVUY?)Tq1f=HH?VL7oeeH*1 zYCWzMDd{aK3Fi|MfK;nNJi?(zSmi-h(a6eM7)1*$KTOLH(8>c0e1Jh3I8_TvbTI0h z411Gg|3I00D07!!ItlWU&qZoMn$#-5Ij|!mgHDlwZDim@N_m4;{mzATiRpkHVqCJw zMd(zHa5}kCGRmD9nlm#ba|R$dW3nw{k|k}taYTU*93F%jxey~4A0{Nm#HA+HdNP)c zEZ$f#dVlrA#=413Q)?Qh)f}2Kap#0_AC307M<+Qd6CGOIy&j86ybXC;)N-OnIL7#!?LuTji(lD&m9cTu3j+#;weVE3dZ06l3sr&hJ8gHBO_ z$Em=Rbl@o_=mtmJ;1h3%NsVISSkdedRgzHxoiagiPqk)E56+xs^-Qy7P6I~Pj5>?E z+B{;6!De8!Isy<9!pB91CMM;1+)K)fH;${?UtJAy1ZbF4T|Z&m7v-KY-V}#7F?4i7 z=!S&Qw)n6%hrW$d9%tppsG$8+;C?0u7y&PEi~`co`?ik2UzeMWTPUMBE~4oFagkHZXn zoWagB#8pOpm7%VKOsScx6myB9dbmPSmwj;?r8>+6?PLOfW`^%zhacpF4(h@VS{>W1 zjIl0hIV&%HbXo55s!Cm4kLaqim#MaBOpe0b5>mks>eC>dOpym8Jk!C^hK0M5%kEE>hGv ziaN}YKQlpJF@aw(!#A^m+jztF;IPf%j(OpZvG%akFkM&}Yl{NVNtL{3{9ifBo@L9O zW6uHe!$)?YmN6wbJta6b!3K2VqV#F;!R};xW=eQgT2ywrCoerGD{Vw(iX$VzlA2)7 zNVH@pT5}W3^Bm?aHolR8dR&0cF*>M`4%|Zr?qK9Uu=1UZype&AGOA{pIKik-fRn%n3rhjD?-^_htL)(riydc(GYkQw02gSog;sB7@lRRBTsCML zJA4`&IGYWc8)lvx6*?zAbVht=X<}G%k}f!cHQ80H4&n4DZ$UwtvS$Yu%(r_NhIY5gYPe4%A}b{#J2fKP8J^>e1Ufm+@JwfDYJvs0#Dt4r#Er0v)xo9> zHq&04*vKPC!I3s2KPsVU0<*Vt1`6*4=QSGQs6aOh^iiH}HVwI~{#V5Y& zDnBqt3xflxRvO>O;9oP)0!A^7kykT8)lA?-;HAZ9ILx!6?6czS(-Z6&iNTRcqB(+K zc!U;UMnr&@XT0q%oh9Mk#o+}DLbImZJ(DDztkj4evYifq7M;XGb*yq4tC+_?A2aY~3FK=AS-?OuX+<@ysG{T*RL~eEXdJ7kv#{Wb1~8ft zZ?79+Pe?S`<9Mwdr#Xb;V46pOlxKV}NDXi)S`q=$m)O{11=0*G9*$eq+{PwBPodTpy- zb49d%IKg9 z9-R~>PK^wi7HzMKx2MKiqvJ($B*PmqMnEVY1~4L)Qm*yR3oVq4!n5awrcJh`O$^DX z_8Cc1K<8Tl(Imr$S36hFR2*GW2Iq2 zd4#1r$`&0d+9O!jh|xetMAQPJ<{*$GT0lc$iIfS})Ec|9)}A`imNMR&GS-?_9^!F1 zGSelaf27hQb0z*V^156fuUN2s*PdTbH-5YElcg2eMRt9%jZ3!Z=2`RyEXF2_>7>zk z+5j+|*6Uh)I?X!%ke1t|p{DUzwJ%3cWe2IC5uj5_!Cnd~prCxUG6z5^a!6$^3FWa^ zzNqqs2%!;zTEqzs0gwzr3W$nF2o@M2v=%eiiKqf0p;8aLfKEcCIc2mpt>iDG%=E}C zAKB@VIZt$4QF$4z6)P4TZfv~&@aFx8x9)e{Xg#^Ls3JQ#%#>_1dc#b6E3!|{pWeQ3 zetTizX_KMVpljA?ntdf#uVXif>S;VaoRaT>xXa~nU$5hK>X=O;HG?O|ad;Jnj$y&rk+M?;bZDf2 zLVymq71%>2xYwyhvM2=TWUzPyjS&=ts+9l)Kq_ED0aMBzFag3fFssK5(Tvr@MHPy% zMaGyyV?wSq#qE%cBw{37F6>`Gfk=tQI*8wI1PimJTZcSkxBvKN(i(n1q>b-79di@ zL>pm%skdjUP|1w}?L&+0S$|FdEC_V>rBo$BHVBBYfE0h2rMJO>1tk$ap8)b-L z%}KmDiHmTVk|d+(r;LD(L{3IRZdPJ`S;4MD#~yb7*2Dd-Tfg3rj4q#Vx^=1j@!hT` z7EcEcA3y4PeD6y0_WF{f%@%frj;IMQjmoQ06$q+aL6t4wnLOsq}hZCH|>NQ$HrqqrCc zZMPDPMv_wVJ~)+{B}kUQ)Zn2LC2#?c!aOk|^%!ka33iGPp>*L~f-5Z1^-r2W$z^3o zWP9RsG81xh6Gl(2+1qro^Iiww@|A|u?e&1m9SyfGU3%R0Uvz-uqwa2rhuz>B`~7Qw zG;hCAlGJK3eXV87B_mayh-Yh`Hp1ggSiBWW3c-`Y>BMk4#wtA*#0Uf>;M9LKBGm+` z#&8lv2nZozg2zZvMH^HgM`8#Aas-Sb62szS0S=cd(j!d{u|O)r9peUM#Je-&-MR5S zQm0#Y?fZH26Ize&=)CkKO`y;umxqrYKJ0$bbsyaO`2E5CYu(qc+}ri}A0H0Z%a@$wnmEgt$$()1pc;kukm}oq!R|tALRt^>>ccY63t5 dSnw&qY6;#z@is~q!kO*7F`P3xw3Zmd{{c?wcz*x@ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Minify.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Minify.miff new file mode 100644 index 0000000000000000000000000000000000000000..273c3abc568a1f755e749def8dcfaeafaebef712 GIT binary patch literal 5768 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 F{R`T36<+`V literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Modulate.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Modulate.miff new file mode 100644 index 0000000000000000000000000000000000000000..dc506568e877223726b1b65c9bc193feec29d909 GIT binary patch literal 13013 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 BQQ80i literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Normalize.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Normalize.miff new file mode 100644 index 0000000000000000000000000000000000000000..3bf941e64659ba029c4a10ec17e905255bb47700 GIT binary patch literal 13013 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 dizMnP|ZcAcqDT?G4^r4bH-oO~i{{;st1;zjX literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/OilPaint.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/OilPaint.miff new file mode 100644 index 0000000000000000000000000000000000000000..4521b76da13afe703eb5d35ae94e4c6cf0a2a2b5 GIT binary patch literal 13013 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Quantize.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Quantize.miff new file mode 100644 index 0000000000000000000000000000000000000000..85ee5302b113b53d6c602a20275b76e842af3753 GIT binary patch literal 7343 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 Ty3p)V7&`|%%9ZTsN^$-lMLV%u literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/ReduceNoise.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/ReduceNoise.miff new file mode 100644 index 0000000000000000000000000000000000000000..ca95ed7298f65c008913568e0bdf70eb95b3120a GIT binary patch literal 13013 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Resize.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Resize.miff new file mode 100644 index 0000000000000000000000000000000000000000..78d31ef2c69dc778fed1851dbd5ee55818bb3ca2 GIT binary patch literal 6881 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Rotate.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Rotate.miff new file mode 100644 index 0000000000000000000000000000000000000000..cfd973f1bd2a1a5ba524f8e2e13c6c9f4ee1f944 GIT binary patch literal 30233 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Scale.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Scale.miff new file mode 100644 index 0000000000000000000000000000000000000000..036a82671b0e77da8bb64e391bba979c746a8255 GIT binary patch literal 6881 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Segment.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Segment.miff new file mode 100644 index 0000000000000000000000000000000000000000..f062d502c5cc4a6ba0bb2a0986a5c19bc025db80 GIT binary patch literal 6576 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 NU{rxo1^#ae{0o-vI-&po literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Set.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Set.miff new file mode 100644 index 0000000000000000000000000000000000000000..5f75176a4de2a33cbf8d43b91d07c07f969cfd55 GIT binary patch literal 12998 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Shade.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Shade.miff new file mode 100644 index 0000000000000000000000000000000000000000..b7647537bfde52594c75b9adf24f205433c2f540 GIT binary patch literal 13013 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𝔚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±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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Swirl.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Swirl.miff new file mode 100644 index 0000000000000000000000000000000000000000..3ad9af42c7c15e5e40a011d76c772c4b189f0b68 GIT binary patch literal 13013 zcmbVy2Xqt1{;q6VAf!TaliU<10o#(c_pWY9mMq(H?^U+t-i^T+Y^qHs^xkVIAqfx? z2)%@AddJ40H`9$9Z$;kCz5jR4|Nq{3d%iR0+tKXqeDnQgG&{5IbkUlZlIaRc$#kdX z`1q8&ic8!D`63D-ebRDMN=ihdyV#XhYVdF$pR|J9g5nYp@$tz^DJ^x00V%m9u0C>Z zSzdmLNXz-f1r;SCLHYQky9!IQM8@-@d`V$SnoD$=_3~+6VX>>^%|jdo`7R%yqOz1+ zcWI@F^pW%BJC%B#Ph*28_GAnU9otZbfOK zC%;AJ{Zn&1+`GGn7t0lt`6nKp`4niD-H5A z=-(L z0XSV5u3}eyn#(6rjxu+Crfhe9y4%xPecbu~ox}g1m;FZ_JoK-)mPx;5U5frmkmCL0 z{T1CF98q-d_qL*2`~vwGufKh>_l{I}dS295xBiNInajVwN&idYJxM&r2CPknkSP`y>Q6wtT6j_Qq zMX{nnQKhI+j8=?OOjb-+%uy^r=07s)xD{EOZToG@AUY*hq?#X!`dUdM`n+T9;18A=&_>5&pr0_IMd@sj~6|A_WZb~ zUr)NHrDsgf?4CnAYJKbNx4wD{dn@3r*thcEs(ow5TWj9h@z%+=ZoSps`~BVndvm>md#CrV>^-UX zvfkTzAMbsmcYB`?`uOz``-Jz&?o-oeR-g5K_Vu~k=jq#Tzx~bI?AxJlyWbxE_N=!z zzJ2iRrng`9{jjg9uc2>z-?F|F`>yP}v+sqzPv3dx9p87f@5H`S`p(36R=>07ovZJ( zzT59z=w0i(>F*AEcka8J-#z*6!}of>H}E~(dx`H2es9KmKfZVTz5DO?e&6?f!}}@k zSHC~^{a@Zc_x|$_`h9?Y5d1;j2jf3j^TDAHZhzS8L*EZgAEtje^24Pc?)k8}U$=hW z_A~TL>o=m`vVQye-RR%5zh8fA|Lp$b`mgJMtbfZ#AAUr96#3DhkLG@~{iDW@yM65Y zvGwEJk0*V+>Ep8>xBcUbf9U?<`bXVA*8k(=KVE+F&rh_UxIU@>WWy(CK56^Z=Tpa)<#Dn48A*}l*2|Fi!;`G2PUv;Lo({(13p@6T1AJ3k-t`O?pi zeE$54FTXH3_4&w0=acI* z%V)1o%h#WOZTY(F>&0Im`?~!bzi%SGsr_cdH&?#x^DXmj#<$bH-TiILfUgDw4X7Hh zcEH7fy$3P_vj)x_cwpd5Uq9a{-!Z;hd~f@G;%D_6?6=nMvj02&8vi2yCH|+CJ(Y|y zM>$`4LglR@RavUJs^e;JHKlf|=c^ll9smpE151E&U|&!NmV;}-Cg@|x4%I?ipoj1P zI2N7)AAq|M63IoDA(zk((Ll5o-G)BFR9G4|7dwr=g9qTl@U8e`LQS}c1;lx>9~nfB zA$OCV6ipRV>!~~R06LkTN1tQ*Ga<})<{;aH)w9Fc-`H0i#g%fKxJNw5=kROz+k&6q z5|#aum;>mKS6eX;&${YwL9 z7;4yQ>}E6@>y5`uADSXeb4*tQz6r<-SR2q{Ce1_4J1spdHp>*tIqMhJH0x?>OCTLM zG;pu2uPw|r$9CPWvKQO81$hSr27MQF*)h?Yf$-9IuvuK#J^PxF56_jCPbug#U4Tef6vY1|sK zwc(e*Uv_WfxBdJp^y|vszW#0Q_K&tt+R3CorOE^@5`}Z8s9r*pAc<{GF+@W9oVE)*0m^!@q2zlh^qvX+_k5R`qAE%FR zJ;9#X)*v+OIH@_g>y+`-{?pdehtD|9G@Ok%d;VPfxyJM9=Wk!gz3}*A`Nj52!!P%^ zTz}>LD>JTses#$;<+TlsRO9w0W7CoAVb?D;r#0XEv*gc?8zXPNb92V6uWqfrjotq3 zPQaZLcjNBfxL0_u{r>0&A3T`%(Es62kF<}Dv_!YucwGGW^^@^WKYhCL8S!lQ^N{CP zU*x@Le_7x9Y3r(2%&P-!QEj){D>{00%<5EjZtJpjU4EVS`ZWTB7y?lk%-|4*gDeIz z2*{$4oXVhKfCN)S{*#W} zXA&EY<_Cs=7oz^LpgpVQw`$-`8gQK!T&h#g(yFIwpeZ6SRaAc`s-|n8*&6%@J^rha znjXM9IhZ4H8bfIercek+02l`4dg1^`slgDMskNHtr{<5ZT9I40Jj9akw5OC+R85~V zd2m&3Ok@}g0diqdt~?4dD8L{91p|zS%YbMIAUujx6s)EoH4dwAL`9%#3I}Ntkr>b< zVipZ*l^~lI4mT2cI;2ieFV>>uO+r=iGxPwI}2~50hT0L9F^OdlHUzb5R_j$5r~8#Oa+)QbdZjm z785^u=-Ra0?*pYAn>IcnF?0Cn>fFMln5Zy7K0q}B11O}%0DlZrA%INOnEFi$s8J7; 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Threshold.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/filter/Threshold.miff new file mode 100644 index 0000000000000000000000000000000000000000..0316d8ab84600246981b603c1538e68e7b333c24 GIT binary patch literal 13013 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

    O-p!6OW-igromQzQE>PAr{~ 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 az5aUefJdHrCeKx;ZQGXl_NL8w;NR literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_prog_idat_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_prog_idat_tmp.miff new file mode 100644 index 0000000000000000000000000000000000000000..795fcdbd9a6b53001da12e645d3ada091fc1182d GIT binary patch literal 26037 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 az5aUefJdHrCeKx;ZQGXl_NL8w;NR literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_prog_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_prog_tmp.miff new file mode 100644 index 0000000..0ea6fd6 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_prog_tmp.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:......//////111111333333555555555555444444444444222222222222111111111111000000......,,,,,,,,,,,,111111222222444444999999>>>>>>BBBBBBCCCCCCCCCCCC@@@@@@HHHHHHPPPPPPXXXXXXccccccoooooottttttrrrrrrvvvvvvttttttnnnnnneeeeeeaaaaaaaaaaaa]]]]]]XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXbbbbbbmmmmmm[[[[[[@@@@@@333333555555222222111111333333//////))))))......))))))??????^^^^^^uuuuuussssssSSSSSSTTTTTTwwwwwwvvvvvvOOOOOO......//////111111333333333333333333222222222222111111111111111111111111000000//////............111111000000111111555555999999<<<<<<============BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttuuuuuurrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[YYYYYYTTTTTTRRRRRRSSSSSSTTTTTTWWWWWW______gggggg\\\\\\@@@@@@111111555555666666666666555555------333333333333,,,,,,777777IIIIIIiiiiiiuuuuuu@@@@@@??????______uuuuuuVVVVVV------......000000111111111111000000//////......////////////////////////////////////////////////111111000000//////111111555555777777888888888888AAAAAADDDDDDEEEEEEHHHHHHQQQQQQaaaaaammmmmmqqqqqqvvvvvvqqqqqqffffffZZZZZZWWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF222222333333444444555555444444++++++222222111111......000000333333^^^^^^zzzzzzLLLLLL999999::::::UUUUUUIIIIII::::::,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,,,,,,,------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiirrrrrrnnnnnnccccccXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRROOOOOOOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbssssssiiiiiimmmmmmkkkkkk,,,,,,------............------,,,,,,******))))))((((((((((((((((((((((((((((((******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^VVVVVVTTTTTTUUUUUURRRRRRNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------------222222111111++++++eeeeeeuuuuuu//////000000111111111111000000//////------,,,,,,************))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444000000666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTTTTTTTVVVVVVTTTTTTNNNNNNEEEEEEHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV777777''''''))))))++++++......------''''''%%%%%%&&&&&&ZZZZZZúooooooJJJJJJ333333444444555555666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999666666444444333333777777888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuXXXXXX>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWW^^^^^^777777888888999999::::::::::::999999888888777777666666555555333333111111111111222222444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[[[[[[[eeeeeeqqqqqq~~~~~~]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||wwwwwwSSSSSS888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>FFFFFFFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______XXXXXXZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaawwwwwwyyyyyyoooooowwwwww{{{{{{||||||xxxxxxbbbbbb999999555555777777]]]]]]yyyyyyppppppRRRRRR444444777777<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa[[[[[[______aaaaaa^^^^^^````````````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppvvvvvv{{{{{{}}}}}}~~~~~~kkkkkk\\\\\\LLLLLL~~~~~~ǬqqqqqqZZZZZZ111111222222666666<<<<<>>>>>;;;;;;FFFFFF\\\\\\ccccccUUUUUURRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddppppppttttttxxxxxxyyyyyyyyyyyy||||||~~~~~~mmmmmmԌ111111000000111111777777??????FFFFFFHHHHHHHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC999999555555333333111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX[[[[[[bbbbbbddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddiiiiiippppppuuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{}}}}}}~~~~~~~~~~~~vvvvvv888888333333000000222222999999BBBBBBHHHHHHJJJJJJccccccrrrrrrSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~ooooooaaaaaaYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{rrrrrrJJJJJJFFFFFFAAAAAA;;;;;;999999======DDDDDDIIIIIIXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddaaaaaacccccciiiiiilllllljjjjjjhhhhhhhhhhhhppppppbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvwwwwwwTTTTTTOOOOOOMMMMMMIIIIIIBBBBBB============BBBBBBHHHHHHTTTTTTxxxxxxssssssjjjjjj^^^^^^ffffff{{{{{{iiiiiimmmmmmiiiiii``````^^^^^^ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttkkkkkklllllldddddd^^^^^^ZZZZZZ\\\\\\llllllGGGGGGIIIIIIOOOOOOPPPPPPJJJJJJHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqppppppjjjjjjkkkkkkffffff``````cccccclllllljjjjjjbbbbbbffffff]]]]]]ffffffppppppeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv{{{{{{vvvvvv]]]]]]aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvrrrrrrUUUUUUrrrrrrooooooxxxxxxzzzzzzjjjjjjbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````bbbbbbaaaaaagggggglllllliiiiii````````````UUUUUU^^^^^^hhhhhh¨PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQRRRRRRPPPPPPKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddiiiiiixxxxxxyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnngggggg``````cccccchhhhhhiiiiiippppppppppppddddddqqqqqqyyyyyytttttthhhhhhaaaaaa^^^^^^ggggggwwwwwwddddddeeeeee\\\\\\______aaaaaa~~~~~~||||||uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJHHHHHHIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUWWWWWWNNNNNNbbbbbbzzzzzzoooooommmmmmrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyynnnnnnggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhffffffwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}}}}}}}qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPKKKKKKLLLLLLOOOOOO]]]]]]ffffffbbbbbbwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______oooooorrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhooooooeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzssssssmmmmmmppppppooooooppppppwwwwwwbbbbbbiiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWWOOOOOOOOOOOOQQQQQQRRRRRROOOOOOLLLLLLTTTTTT^^^^^^xxxxxxuuuuuurrrrrrssssssllllllbbbbbbiiiiiittttttqqqqqqaaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkffffffiiiiiikkkkkkeeeeeeeeeeeehhhhhhllllllllllll``````ffffffrrrrrrBBBBBBJJJJJJzzzzzzPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^aaaaaassssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbddddddpppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmjjjjjj______``````uuuuuuvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{[[[[[[OOOOOOMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddddddddeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllggggggiiiiiiggggggjjjjjjggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooo{{{{{{zzzzzzrrrrrrggggggeeeeeekkkkkk<<<<<>>>>>BBBBBBRRRRRRkkkkkkiiiiii^^^^^^ffffffjjjjjjZZZZZZRRRRRRqqqqqqkkkkkkZZZZZZbbbbbbccccccddddddeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]qqqqqqhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmjjjjjjkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{FFFFFF------hhhhhhxxxxxx{{{{{{~~~~~~yyyyyyttttttttttttxxxxxx//////888888111111>>>>>>____________``````gggggg______[[[[[[pppppp{{{{{{cccccccccccceeeeeeddddddeeeeeeiiiiiiiiiiiieeeeeeccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllqqqqqqlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmnnnnnnjjjjjjbbbbbbaaaaaaddddddaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz||||||zzzzzzxxxxxxvvvvvvwwwwwwyyyyyy......444444++++++444444TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmwwwwww}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~xxxxxxwwwwwwxxxxxx{{{{{{999999======888888======NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______YYYYYY[[[[[[bbbbbbbbbbbb[[[[[[iiiiiillllllaaaaaaffffffeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuunnnnnnkkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUkkkkkkoooooojjjjjj777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||NNNNNNOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffmmmmmmbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffnnnnnnaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooommmmmmiiiiiibbbbbbffffffkkkkkkggggggmmmmmmllllllkkkkkkjjjjjjnnnnnnnnnnnnddddddYYYYYYZZZZZZHHHHHHVVVVVVrrrrrrwwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY______dddddd____________cccccc______cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccaaaaaaqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssiiiiiieeeeee^^^^^^UUUUUU______mmmmmmoooooonnnnnnmmmmmmjjjjjjiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX999999UUUUUUqqqqqqWWWWWWooooooxxxxxx``````))))))......777777::::::>>>>>>pppppp``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXhhhhhh______UUUUUUIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkppppppiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWWZZZZZZ______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQPPPPPPMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{qqqqqqnnnnnn````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWSSSSSSQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF>>>>>>222222<<<<<>>>>>EEEEEE666666000000111111GGGGGGeeeeeehhhhhhyyyyyyjjjjjjggggggbbbbbbbbbbbbbbbbbbccccccccccccccccccddddddddddddkkkkkkaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@777777KKKKKKVVVVVVKKKKKK======::::::>>>>>>>>>>>>******333333<<<<<<000000444444444444CCCCCCtttttt``````aaaaaappppppnnnnnn______bbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeeiiiiii333333nnnnnn^^^^^^hhhhhhppppppllllll______TTTTTTSSSSSSPPPPPPMMMMMMJJJJJJJJJJJJIIIIIIJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMBBBBBB111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<^^^^^^______XXXXXXddddddssssssYYYYYYddddddeeeeeeeeeeeeeeeeeeddddddddddddffffffhhhhhheeeeeerrrrrrzzzzzzttttttՀVVVVVVhhhhhhttttttdddddd^^^^^^PPPPPPHHHHHHIIIIIIQQQQQQMMMMMMHHHHHHAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX777777333333888888555555111111333333//////------//////444444888888======FFFFFFPPPPPPGGGGGGSSSSSSUUUUUUiiiiiieeeeeeAAAAAAcccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhkkkkkkвkkkkkkPPPPPP^^^^^^PPPPPPRRRRRRYYYYYYXXXXXXMMMMMMDDDDDDIIIIIIOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLvvvvvvRRRRRR444444111111777777333333//////111111000000------------000000222222555555<<<<<>>>>>============??????======::::::999999999999555555000000111111555555;;;;;;BBBBBB::::::HHHHHHLLLLLL666666aaaaaaddddddggggggggggggffffffeeeeeeeeeeeeffffffooooooddddddDDDDDDIIIIII]]]]]]HHHHHHNNNNNNMMMMMMHHHHHHNNNNNN[[[[[[]]]]]]TTTTTT[[[[[[OOOOOOEEEEEEAAAAAA@@@@@@<<<<<<;;;;;;<<<<<<@@@@@@>>>>>>>>>>>>??????<<<<<<666666666666999999LLLLLLPPPPPPAAAAAAIIIIIIMMMMMM:::::: \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_tmp.miff new file mode 100644 index 0000000..0ea6fd6 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/gray_tmp.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:......//////111111333333555555555555444444444444222222222222111111111111000000......,,,,,,,,,,,,111111222222444444999999>>>>>>BBBBBBCCCCCCCCCCCC@@@@@@HHHHHHPPPPPPXXXXXXccccccoooooottttttrrrrrrvvvvvvttttttnnnnnneeeeeeaaaaaaaaaaaa]]]]]]XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXbbbbbbmmmmmm[[[[[[@@@@@@333333555555222222111111333333//////))))))......))))))??????^^^^^^uuuuuussssssSSSSSSTTTTTTwwwwwwvvvvvvOOOOOO......//////111111333333333333333333222222222222111111111111111111111111000000//////............111111000000111111555555999999<<<<<<============BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttuuuuuurrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[YYYYYYTTTTTTRRRRRRSSSSSSTTTTTTWWWWWW______gggggg\\\\\\@@@@@@111111555555666666666666555555------333333333333,,,,,,777777IIIIIIiiiiiiuuuuuu@@@@@@??????______uuuuuuVVVVVV------......000000111111111111000000//////......////////////////////////////////////////////////111111000000//////111111555555777777888888888888AAAAAADDDDDDEEEEEEHHHHHHQQQQQQaaaaaammmmmmqqqqqqvvvvvvqqqqqqffffffZZZZZZWWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF222222333333444444555555444444++++++222222111111......000000333333^^^^^^zzzzzzLLLLLL999999::::::UUUUUUIIIIII::::::,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,,,,,,,------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiirrrrrrnnnnnnccccccXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRROOOOOOOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbssssssiiiiiimmmmmmkkkkkk,,,,,,------............------,,,,,,******))))))((((((((((((((((((((((((((((((******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^VVVVVVTTTTTTUUUUUURRRRRRNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------------222222111111++++++eeeeeeuuuuuu//////000000111111111111000000//////------,,,,,,************))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444000000666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTTTTTTTVVVVVVTTTTTTNNNNNNEEEEEEHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV777777''''''))))))++++++......------''''''%%%%%%&&&&&&ZZZZZZúooooooJJJJJJ333333444444555555666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999666666444444333333777777888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuXXXXXX>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWW^^^^^^777777888888999999::::::::::::999999888888777777666666555555333333111111111111222222444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[[[[[[[eeeeeeqqqqqq~~~~~~]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||wwwwwwSSSSSS888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>FFFFFFFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______XXXXXXZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaawwwwwwyyyyyyoooooowwwwww{{{{{{||||||xxxxxxbbbbbb999999555555777777]]]]]]yyyyyyppppppRRRRRR444444777777<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa[[[[[[______aaaaaa^^^^^^````````````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppvvvvvv{{{{{{}}}}}}~~~~~~kkkkkk\\\\\\LLLLLL~~~~~~ǬqqqqqqZZZZZZ111111222222666666<<<<<>>>>>;;;;;;FFFFFF\\\\\\ccccccUUUUUURRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddppppppttttttxxxxxxyyyyyyyyyyyy||||||~~~~~~mmmmmmԌ111111000000111111777777??????FFFFFFHHHHHHHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC999999555555333333111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX[[[[[[bbbbbbddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddiiiiiippppppuuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{}}}}}}~~~~~~~~~~~~vvvvvv888888333333000000222222999999BBBBBBHHHHHHJJJJJJccccccrrrrrrSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~ooooooaaaaaaYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{rrrrrrJJJJJJFFFFFFAAAAAA;;;;;;999999======DDDDDDIIIIIIXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddaaaaaacccccciiiiiilllllljjjjjjhhhhhhhhhhhhppppppbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvwwwwwwTTTTTTOOOOOOMMMMMMIIIIIIBBBBBB============BBBBBBHHHHHHTTTTTTxxxxxxssssssjjjjjj^^^^^^ffffff{{{{{{iiiiiimmmmmmiiiiii``````^^^^^^ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttkkkkkklllllldddddd^^^^^^ZZZZZZ\\\\\\llllllGGGGGGIIIIIIOOOOOOPPPPPPJJJJJJHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqppppppjjjjjjkkkkkkffffff``````cccccclllllljjjjjjbbbbbbffffff]]]]]]ffffffppppppeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv{{{{{{vvvvvv]]]]]]aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvrrrrrrUUUUUUrrrrrrooooooxxxxxxzzzzzzjjjjjjbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````bbbbbbaaaaaagggggglllllliiiiii````````````UUUUUU^^^^^^hhhhhh¨PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQRRRRRRPPPPPPKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddiiiiiixxxxxxyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnngggggg``````cccccchhhhhhiiiiiippppppppppppddddddqqqqqqyyyyyytttttthhhhhhaaaaaa^^^^^^ggggggwwwwwwddddddeeeeee\\\\\\______aaaaaa~~~~~~||||||uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJHHHHHHIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUWWWWWWNNNNNNbbbbbbzzzzzzoooooommmmmmrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyynnnnnnggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhffffffwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}}}}}}}qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPKKKKKKLLLLLLOOOOOO]]]]]]ffffffbbbbbbwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______oooooorrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhooooooeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzssssssmmmmmmppppppooooooppppppwwwwwwbbbbbbiiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWWOOOOOOOOOOOOQQQQQQRRRRRROOOOOOLLLLLLTTTTTT^^^^^^xxxxxxuuuuuurrrrrrssssssllllllbbbbbbiiiiiittttttqqqqqqaaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkffffffiiiiiikkkkkkeeeeeeeeeeeehhhhhhllllllllllll``````ffffffrrrrrrBBBBBBJJJJJJzzzzzzPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^aaaaaassssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbddddddpppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmjjjjjj______``````uuuuuuvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{[[[[[[OOOOOOMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddddddddeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllggggggiiiiiiggggggjjjjjjggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooo{{{{{{zzzzzzrrrrrrggggggeeeeeekkkkkk<<<<<>>>>>BBBBBBRRRRRRkkkkkkiiiiii^^^^^^ffffffjjjjjjZZZZZZRRRRRRqqqqqqkkkkkkZZZZZZbbbbbbccccccddddddeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]qqqqqqhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmjjjjjjkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{FFFFFF------hhhhhhxxxxxx{{{{{{~~~~~~yyyyyyttttttttttttxxxxxx//////888888111111>>>>>>____________``````gggggg______[[[[[[pppppp{{{{{{cccccccccccceeeeeeddddddeeeeeeiiiiiiiiiiiieeeeeeccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllqqqqqqlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmnnnnnnjjjjjjbbbbbbaaaaaaddddddaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz||||||zzzzzzxxxxxxvvvvvvwwwwwwyyyyyy......444444++++++444444TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmwwwwww}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~xxxxxxwwwwwwxxxxxx{{{{{{999999======888888======NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______YYYYYY[[[[[[bbbbbbbbbbbb[[[[[[iiiiiillllllaaaaaaffffffeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuunnnnnnkkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUkkkkkkoooooojjjjjj777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||NNNNNNOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffmmmmmmbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffnnnnnnaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooommmmmmiiiiiibbbbbbffffffkkkkkkggggggmmmmmmllllllkkkkkkjjjjjjnnnnnnnnnnnnddddddYYYYYYZZZZZZHHHHHHVVVVVVrrrrrrwwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY______dddddd____________cccccc______cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccaaaaaaqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssiiiiiieeeeee^^^^^^UUUUUU______mmmmmmoooooonnnnnnmmmmmmjjjjjjiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX999999UUUUUUqqqqqqWWWWWWooooooxxxxxx``````))))))......777777::::::>>>>>>pppppp``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXhhhhhh______UUUUUUIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkppppppiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWWZZZZZZ______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQPPPPPPMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{qqqqqqnnnnnn````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWSSSSSSQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF>>>>>>222222<<<<<>>>>>EEEEEE666666000000111111GGGGGGeeeeeehhhhhhyyyyyyjjjjjjggggggbbbbbbbbbbbbbbbbbbccccccccccccccccccddddddddddddkkkkkkaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@777777KKKKKKVVVVVVKKKKKK======::::::>>>>>>>>>>>>******333333<<<<<<000000444444444444CCCCCCtttttt``````aaaaaappppppnnnnnn______bbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeeiiiiii333333nnnnnn^^^^^^hhhhhhppppppllllll______TTTTTTSSSSSSPPPPPPMMMMMMJJJJJJJJJJJJIIIIIIJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMBBBBBB111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<^^^^^^______XXXXXXddddddssssssYYYYYYddddddeeeeeeeeeeeeeeeeeeddddddddddddffffffhhhhhheeeeeerrrrrrzzzzzzttttttՀVVVVVVhhhhhhttttttdddddd^^^^^^PPPPPPHHHHHHIIIIIIQQQQQQMMMMMMHHHHHHAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX777777333333888888555555111111333333//////------//////444444888888======FFFFFFPPPPPPGGGGGGSSSSSSUUUUUUiiiiiieeeeeeAAAAAAcccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhkkkkkkвkkkkkkPPPPPP^^^^^^PPPPPPRRRRRRYYYYYYXXXXXXMMMMMMDDDDDDIIIIIIOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLvvvvvvRRRRRR444444111111777777333333//////111111000000------------000000222222555555<<<<<>>>>>============??????======::::::999999999999555555000000111111555555;;;;;;BBBBBB::::::HHHHHHLLLLLL666666aaaaaaddddddggggggggggggffffffeeeeeeeeeeeeffffffooooooddddddDDDDDDIIIIII]]]]]]HHHHHHNNNNNNMMMMMMHHHHHHNNNNNN[[[[[[]]]]]]TTTTTT[[[[[[OOOOOOEEEEEEAAAAAA@@@@@@<<<<<<;;;;;;<<<<<<@@@@@@>>>>>>>>>>>>??????<<<<<<666666666666999999LLLLLLPPPPPPAAAAAAIIIIIIMMMMMM:::::: \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/idat_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/idat_tmp.miff new file mode 100644 index 0000000000000000000000000000000000000000..1ef75c0a74aee6c6d7b8a619c354941488941e17 GIT binary patch literal 26037 zcmZ6zXH-;&_ce?yF~-CiyMlBW7^e3^8(`?2q4(Z+sDNFFY=8Hiw}>8I zDlUjmW-PMxkCpy=96pLkNn%nI6yhU-<6`;o5q|yw!4dv`i=w2zRrxcLKgL)3Y4P4+ivqpF!@c<=B8^U?)208XpLSGCaJY9&vh+O$ zO^ZaNQWX>eWBmOi{-1xKO5c}$BcHH%|NrM*GF|#MiLod#C^$~~ex&r5Nk4>2rZDj_ z6!xOUi#Y4(bS*6*7T=n@rZx85!YnDHJ+=Xb5L2b$FP? zqDYUC5f+O|)zKLqW-w?pb@h=E8jV6xQW_bdQYq34Fgi*mlSrF3jg1kBIy&<5m`s2F=%Z9UTjcojXlTC=^@U=4NAK9UV8f(o%fmz`(LH zeSHEUJiNGAS64$LBBHcZC{$Mu53i`e>#(qj3V}dXH6)~_27hTlKx?b1DT!oh+1~Et zWGFq-)A4;mLL?FfgUQ^t&(M%SAQFd$baip1Mn@S8GFe+2*ONlg)Vz2RcSBS2(j_7h z*L!kOOG{f@UVdVNMkA4wl`mbQ)78}#6)#>iH|O#A`~wFfBPEicptQ8Syzub6JRhH` zs+5$Lme|;|w6L&}lIm)EdmEd8fCC3CEp2SPy!P#jj*g4V$=SNKzP_nx*RGI|*x1Cx zoSeKo6BBcDiKM$*hL_1nI-N*VRh^iS;bm-0hL_P%Hk(8ulSfAWJ2M#gJ1$<7{T(AC zbUKBip&`SIiVE;TCMzo9@6*vyQ1}lgQIdQ_+n9C&)jvse$08Wk` z_48x1)zuFlPD*04H8tz%%E~w#9i7NG5-BLCw$|8~N{xu9sLvBcr<7+S=aU-Mzb;O4ZU*RJ?YLLLm}WRIXj4(R6h1`{{HNNn88M6*?V} z;qqk~jVL`XU#3#ErN_hsg`%yksfpLP|CcXQC^|ao>X$E*$@rYhm+{l8s#mU%NLpGN z8dt91^R=}vUBbPfP%d2pUZ~Vdmv}q^0cSp6Q?sYp14mbqNGarkB^*vqna^Mw63fW=2LzN)I36e*N&n-Mb=@uI`EzV`IRVkbZIGrp`{fYTU<<|X==vB zm6fqr1VTbWO%0DnA|)g=HRS9lJ3HIjCM0-z@^~E1 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]]]]]]XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXbbbbbbmmmmmm[[[[[[@@@@@@333333555555222222111111333333//////))))))......))))))??????^^^^^^uuuuuussssssPPPPPPVVVVVVxxxxxxuuuuuuTTTTTT......//////111111333333333333333333222222222222111111111111111111111111000000//////............111111000000111111555555999999<<<<<<============BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttuuuuuurrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[YYYYYYTTTTTTRRRRRRSSSSSSTTTTTTWWWWWW______gggggg\\\\\\@@@@@@111111555555666666666666555555------333333333333,,,,,,777777IIIIIIiiiiiiuuuuuuAAAAAABBBBBB______ooooooUUUUUU------......000000111111111111000000//////......////////////////////////////////////////////////111111000000//////111111555555777777888888888888AAAAAADDDDDDEEEEEEHHHHHHQQQQQQaaaaaammmmmmqqqqqqvvvvvvqqqqqqffffffZZZZZZWWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF222222333333444444555555444444++++++222222111111......000000333333^^^^^^zzzzzzHHHHHH777777::::::UUUUUUNNNNNNHHHHHH,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,,,,,,,------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiirrrrrrnnnnnnccccccXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRROOOOOOOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbttttttjjjjjjnnnnnn~~~~~~eeeeee,,,,,,------............------,,,,,,******))))))((((((((((((((((((((((((((((((******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^VVVVVVTTTTTTUUUUUURRRRRRNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------------222222111111++++++eeeeeellllll//////000000111111111111000000//////------,,,,,,************))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444000000666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTTTTTTTVVVVVVTTTTTTNNNNNNEEEEEEHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV777777''''''))))))++++++......------''''''%%%%%%&&&&&&ZZZZZZxxxxxxPPPPPP333333444444555555666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999666666444444333333777777888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuXXXXXX>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWWTTTTTT777777888888999999::::::::::::999999888888777777666666555555333333111111111111222222444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[[[[[[[eeeeeeqqqqqq~~~~~~]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||yyyyyyRRRRRR888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>FFFFFFFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______XXXXXXZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaawwwwwwyyyyyyoooooowwwwww{{{{{{||||||xxxxxxaaaaaa888888444444666666\\\\\\xxxxxxrrrrrrUUUUUU444444777777<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa[[[[[[______aaaaaa^^^^^^````````````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppvvvvvv{{{{{{}}}}}}~~~~~~jjjjjj[[[[[[KKKKKK}}}}}}Ǭqqqqqq[[[[[[111111222222666666<<<<<>>>>>;;;;;;FFFFFF\\\\\\ccccccUUUUUURRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddppppppttttttxxxxxxyyyyyyyyyyyy||||||}}}}}}llllllԋ111111000000111111777777??????FFFFFFHHHHHHHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC999999555555333333111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX[[[[[[bbbbbbddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddiiiiiippppppuuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{}}}}}}~~~~~~~~~~~~vvvvvv888888333333000000222222999999BBBBBBHHHHHHJJJJJJccccccrrrrrrSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~ooooooaaaaaaYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{rrrrrrJJJJJJFFFFFFAAAAAA;;;;;;999999======DDDDDDIIIIIIXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddaaaaaacccccciiiiiilllllljjjjjjhhhhhhhhhhhhppppppbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvxxxxxxUUUUUUOOOOOOMMMMMMIIIIIIBBBBBB============BBBBBBHHHHHHTTTTTTxxxxxxssssssjjjjjj^^^^^^ffffff{{{{{{iiiiiimmmmmmiiiiii``````^^^^^^ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttkkkkkklllllldddddd^^^^^^ZZZZZZ\\\\\\llllllIIIIIIIIIIIIOOOOOOPPPPPPJJJJJJHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqppppppjjjjjjkkkkkkffffff``````cccccclllllljjjjjjbbbbbbffffff]]]]]]ffffffppppppeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv{{{{{{vvvvvv]]]]]]aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvrrrrrrUUUUUUrrrrrrooooooxxxxxxzzzzzzjjjjjjbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````bbbbbbaaaaaagggggglllllliiiiii````````````UUUUUU^^^^^^hhhhhh©PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQRRRRRRPPPPPPKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddiiiiiixxxxxxyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnngggggg``````cccccchhhhhhiiiiiippppppppppppddddddqqqqqqyyyyyytttttthhhhhhaaaaaa^^^^^^ggggggwwwwwwddddddeeeeee\\\\\\______aaaaaa~~~~~~||||||uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJHHHHHHIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUWWWWWWNNNNNNbbbbbbzzzzzzoooooommmmmmrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyynnnnnnggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhffffffwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}}}}}}}qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPKKKKKKLLLLLLOOOOOO]]]]]]ffffffbbbbbbwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______oooooorrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhooooooeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzssssssmmmmmmppppppooooooppppppwwwwwwbbbbbbiiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWW}}}}}}OOOOOOOOOOOOQQQQQQRRRRRROOOOOOLLLLLLTTTTTT^^^^^^xxxxxxuuuuuurrrrrrssssssllllllbbbbbbiiiiiittttttqqqqqqaaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkffffffiiiiiikkkkkkeeeeeeeeeeeehhhhhhllllllllllll``````ffffffrrrrrrBBBBBBJJJJJJwwwwwwPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^aaaaaassssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbddddddpppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmjjjjjj______``````uuuuuuvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{\\\\\\QQQQQQMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddddddddeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllggggggiiiiiiggggggjjjjjjggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooozzzzzzyyyyyyrrrrrrhhhhhhffffffiiiiii<<<<<>>>>>BBBBBBRRRRRRkkkkkkiiiiii^^^^^^ffffffjjjjjjZZZZZZRRRRRRqqqqqqkkkkkkZZZZZZbbbbbbccccccddddddeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]qqqqqqhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmjjjjjjkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{FFFFFF------hhhhhhxxxxxx{{{{{{yyyyyyttttttttttttxxxxxx//////888888111111>>>>>>____________``````gggggg______[[[[[[pppppp{{{{{{cccccccccccceeeeeeddddddeeeeeeiiiiiiiiiiiieeeeeeccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllqqqqqqlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmnnnnnnjjjjjjbbbbbbaaaaaaddddddaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz}}}}}}{{{{{{wwwwwwuuuuuuwwwwww{{{{{{......444444++++++444444TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmwwwwww}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~yyyyyywwwwwwwwwwww{{{{{{999999======888888======NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______YYYYYY[[[[[[bbbbbbbbbbbb[[[[[[iiiiiillllllaaaaaaffffffeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuunnnnnnkkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUkkkkkkoooooojjjjjj777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||NNNNNNOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffmmmmmmbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffnnnnnnaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooommmmmmiiiiiibbbbbbffffffkkkkkkggggggmmmmmmllllllkkkkkkjjjjjjnnnnnnnnnnnnddddddYYYYYYZZZZZZHHHHHHVVVVVVrrrrrrwwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY______dddddd____________cccccc______cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccaaaaaaqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssiiiiiieeeeee^^^^^^UUUUUU______mmmmmmoooooonnnnnnmmmmmmjjjjjjiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX999999UUUUUUqqqqqqWWWWWWooooooxxxxxx``````))))))......777777::::::>>>>>>pppppp``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXhhhhhh______UUUUUUIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkppppppiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWWZZZZZZ______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQPPPPPPMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{qqqqqqpppppp````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWSSSSSSQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF>>>>>>222222<<<<<>>>>>EEEEEE666666000000111111GGGGGGddddddiiiiiizzzzzzllllllggggggbbbbbbbbbbbbbbbbbbccccccccccccccccccddddddddddddkkkkkkaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@777777KKKKKKVVVVVVKKKKKK======::::::>>>>>>>>>>>>******333333<<<<<<000000444444444444CCCCCCrrrrrr______aaaaaaqqqqqqnnnnnn^^^^^^bbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeeiiiiii333333nnnnnn^^^^^^hhhhhhppppppllllll______TTTTTTSSSSSSPPPPPPMMMMMMJJJJJJJJJJJJIIIIIIJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMBBBBBB111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<]]]]]]______XXXXXXddddddqqqqqqUUUUUUddddddeeeeeeeeeeeeeeeeeeddddddddddddffffffhhhhhhbbbbbbuuuuuuyyyyyyssssssۃUUUUUUddddddrrrrrreeeeee[[[[[[NNNNNNHHHHHHIIIIIIQQQQQQLLLLLLGGGGGGAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX666666333333888888555555111111333333333333000000111111555555888888======FFFFFFPPPPPPHHHHHHTTTTTTWWWWWWllllllffffff@@@@@@cccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhhhhhhhбiiiiiiOOOOOO______NNNNNNQQQQQQYYYYYYXXXXXXLLLLLLCCCCCCHHHHHHOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLwwwwwwRRRRRR444444111111666666333333//////000000111111............000000222222555555<<<<<>>>>><<<<<<<<<<<<>>>>>>======;;;;;;::::::::::::666666000000//////333333<<<<<>>>>>888888666666999999OOOOOORRRRRRCCCCCCJJJJJJNNNNNN;;;;;; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..af1c11c1e4e3500e5a9bac486b4771ddb63ffc32 GIT binary patch literal 26037 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 J56_*S|37q{3WERu literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..e8d118910a92fe33e3c6b1364e78e665899a3506 GIT binary patch literal 26037 zcmbWZ!<0=X&u!wDB4Qs$PfO&1{7FwXeh9(V35EM}m zXqs+l=s*reRE(H2BhKiURyI}bmb4UM%GBgcjcqM^3?PD5S&sJ?aelWOZH zRZXaE7}-5qWA)gIQPtzdRaf;p^~?ch4j9ngv!?HahPrXp4b!@>4LtLdey5&sMrGxw zhT7Wt-?(u`_x0`--9EOl_BXEfAJBcd-@u9~qw6MhUmxE+S@$4k^gn&jSHqk>xT1H( zSx223^2=YI7V^Od{X^b=|BR5`y9b24`!0QE$b0Y6r-%IF7qsW;ej$7InCFy`4?m>! z^Sp5fhrIdbIU%pSazV(8FJ2h(!VC0yAuqjjNyyHfSA{(K==C9+HjNBvYa1W(&_k0# z7AAqy9}ULUe_X>G`=Rn;MD*V4Cybafe@9v-q~3q2xa^JZGV+e6l@85go_ z*-atq*V{*FcXnYX_xbCjkdHrRU+r^4UVi!3kj~D=ko)hS7cyhU#E=IbU@z;Q8glQw zD?>()_T050+qRj<{N=i=kG6hV|9xqAF~0d|&*`TPpKx<_$ZM}vg}nMI4M!J;JoC)u zAv<>be#j$_+#IrQ-JKyTR=^2-u!rmV-4@c`4j+FI($T^G{Cq>m#*OTGb;!dHUlX!@ zyX$acoKYbyE!GDw<^BhTyz>stE`39O^(%g%#o?fkx8J@r8cS7EJi?-jPAPqkY}G2hy0Ik z*+Ki{kdHpnpS?;y8VAl7hun47^pN@U*@=D63VGuV__#9U@yGRp#}YUEZ+`c!^S48O z{cG)gY2(wzG48%_=(_!iFZ-g0guMQ`yoHBpyn}D$C-H_?-xcoJb7ZsC!c(q_FTEYa(wfc-~PoH+|c3;--r(yZY~RX@=1Il53oZ` z$m-Sn24DDr-{C;q!3Q2I`x^((%LDwye?Jeo=N>$SFWKjWkWW7q$M)?$&0hG1z3p>r z$aUAP4ymbmHsqp<9uK+l$}J(ohij{2#)d3kZhm+*5AC{s*2S-IK$keucHeWxu^-xf z^NAC9q1ns&;0JEB)j#UvD?*-lg5UWQpTHBp)B0({OPT*%*H0c3zw<+;PhT5SUA-~n zh8yk+nKDIun-9;x3wyGcxMENJjtlwx^W#H4`^-ApLPm~+gO@_iJMZa`OD~1r=8(EN z^{={^KiHo?*qe4;{}RXiTdv(;A3yTXh6wE9>c=2yHR@6fKp z75}@gPSG|VjgQn#&La^}{7Lh(=lBZ_ z_*-1Nj+dOrjOSb{{_zowSB!^;wchE!GkWyldn>?!-5E243KUmRIeEo$xsS!$XN9IF;{=3#a9C z>Rap1^UjVP@=f}G-MXwp9)39MwC&r|uXtqb+U&n&3%rzm#Pj?L5BSEu-7j&aUd1PP zsGJWz*p0vO35{3aLcXFGhD@I9oQ|hH4ms(h{|(u1zkd#?sL=lJkRCm>|2?E<&o4uc zJo4p`^Uu$7_t2s80zbeFKk^s9^QSsW9Igqu{r2Ry3omre_dZd4sVCJV@*UogZ}1zO zsvp$p_$=SYZ`zdg|Hh5kUcWy5)6tRsY->y1+A3dV-e_&*Z|7Kf1U}>;c}D#TFK`B5 zC2rtL9igA`@eBK?Ys6p4C-4Cmc*gl^Nyvl=>Tv!@9DMJ4{~FS(SK{P=1O79lXU~5L zIq0B&2{q^T6t_7}dpn$D{C0K0L-KM{Q~GV?%Dmp(oPJumls`+nX!9!^ z=npq=gg@i~yrJzre8H)G(EN;V@Cp8a7j-b4s7su);LrW^`;UHvM@pT%)2o+!^hwA` zCndfrD*h>?q5@CA0sN>B@C!arPxu_m`vK>%M?+|X;*q(9cI$@{BUr*3Uce>XR0{jp*NzrioQgb)6VO z#D{&dGe6-mI1zv8*Or$2TxRLgY&SI}?m9d3xvs8!Zsp1x58td>1uyEY=^C3c3Dz_T3Ha7FU-DW< zhxbI{FW2vTGE0{xZ`9PJ-6l*(KA$|9J>f;Z^7*rMIv??S)-4AfnCGJ({NN8mjyq1B zoBj6R-~B%csjMvPNcAYb@jerd^!MHqp4gQ=)MM%|c!C2wsSPLi#eVnYUv?1h{K#+O z*1GiLU*nn|PV_f^i7V?Y@nk+Y^_)CsJh-)v?BCHrr(L#e$?@9TbKT9&iHEwn#LXRd zd{fufiaU0fr?g)W88YPUkU@jgmHGMNh!M&2!-snxvnQl~{|`g@_RaJ4DW|{z4JY^n zUf@I>sz1K*`Gk6gJ>gycm3P?-FKfe#_YVArr}>rL@eRMgi*fM|ywLIpKk_qv(9gQ; zhc>?Xtyli>ymi5o`PA__PFveI_u19;&G$uX)~FBHh1`5|^7r-E%RkQD@}T&1u6Is% zpU!&7=MvS`Szq3CQ+^J5(=>?Y3H7r*ec`|QC_{J^jLfftM~f4R>;aDm6g zt$F#Kz2Mlm@|<|F4!AL|^}>gJ&^b5mc+eII3yl=HIDP z@lED|x;obr-wPMw4;ruFUHH(pPv;mo3Zu)6|sx zmM@o&lJ~m0;6@%wzWDlk{`}$ns`stzgkSi{^~BG_iMhX7v$Efe8EK#S^Ro_Ezdm{7 z(MRQByrO>9h97xZJh3ezqJ1PS(p85TaPwv9K0rnFYsU2> zkL2gNufLx0wrNwIJEl+1eJx*}_?R(69uxQMXkR5i`rO9n0eD8eq(6HZk3G%9zv?l% zGvwA=v+lm-7WE9fsvGc#ysAD{_o(Ns$8+M;^>Uy1f#z?1P)D*gQp(@#9gBk+=OzH{f%Azyx(-(TFlJLhR{ z?+6(&BI}r0v-0_Q^YZxx3%u{(NAa&7pv~+1N5Y@Q)ARNI(3+ zZ^re$Kzzv$?8H8BLGvGbYqK})y60$hk$B=~e&T0%(x&y-rr`vB;6Q)lo8S7i*@ZpW zPn?Ta-xJF3eSi9Co?{<-EZ^%@SLb_^!Gn`O7A!~}&FX93yu3Pd=G?jLi(i~WwB7f8 zbKlGKI|Xg^F5YHW=VI~Czw*ELa`uV$#FsjW-`I~m%`e#9%< z#^Y~(W-okQ#-H&$S8Dbu@n+rjt?gW4pW;t^!kzCCeXpMO`7@r;_FhiiD^9(imN(R;<};6Y;7>e{ zPuPogz4RX(h%4)W1OBJ+7rz@%f7*EXp!Bc$*}mYH-#iB=Wg9=h3w*%?yvncQ$T;H7 zx;*cDNqJs*^2zl3+_{O5y1K;8`0+XJ_U&2MJojAI?+-qh`32w1pAR?usE*)g=WuxN zo<+T@o}itV_?w;igTLW|-#ia*?BscVjp>(+l?^H?tpr`8E4K8L|C;tWoWZ=Lp+dFPf}@Ot)ZYRYrWE3X_IvUhLhi+A5m zoZNR`)-AJUsbBEF_Xg@sb%l0mXa2S?ZQ44^wsGv&{?*SVUf_Zqom=66pUmgFICY=D z@DhCTgXit1^fSD`2i_9*;@y7D$8Xl}Iy@Q=zFapBd$0qZH=liaPisDPr*lQd-XYWz6(z93Ve9a2Up^~)ciy9PpNai zn>S~@(9)9j=+U0Ww^@??|t2ktLez7iXcEy+M z&hMU=ANbS0;oW@3qv6lG*Z~jF@Pm)ked<6wjmN$JVh8u_4^HrlxX|D48U3C@oI0=g zeX;M;t4q`)>LdK*J%&68x9rAVv~`x6eM-$f{9zn%oP4u+vwZ9O+}7{Ck2q8JzxvLyH2+?+h~)Kgj4 zzwko7uYT<{_Ax$wfp2w~^A3N@U+Odal80T_&wlX=|MRD|I*vcZG3|3S8lFlGAD;95 z5E?%4g8AW19BAVe8Xt-u`zYhm`9++*Zci}I5rO+=U40GZ}!2DuH!jzr(O`3&Nc8RF3r#1@WS74 zLG%B&X?TDSd7{+#z&hZ={_V#;@F(2JbLvEPg%6)2!HxLDFU~*m5uBJ$ysGoQD^B1g z@!Hy&Jhymp?qkCS^-KEu{`-9oCqE|`K0JA3&YW_e>OSwG*jF83AMnMV@M2$h*ZuOk z=iy^t8g6L313%?;I4betdqVJmSG>oESL=dzyb4G9v76_$Y41be1dgoRdsFXIOPq*9 z@x{K@w=WGBrH1p&Xa29-x^?i9xNU5FFJ!=g{CxWR-_P%*A8>%*D_F1nc~7YA|5k`2 zpSQ`k@L*r+IlPL8@DjY?W&Wn&VPBfPY0qhwd;%x%!Jq0D{=_frD&H7SKkrxle+KX8 z)hp)lJ2JmN^xocj@ClwVFJ6=1OM87+oEV=U@KpM3>CzWNF1*n1=zK4o_B*@33pwmC zpAV@g?VsP^B)`Xg?6I^w3@_?2_*NIQgE+Bn@rqwc|CfA$H%iS9{N;CA+H{E*^@e%8 zkI)u3@(a7r{(lGlP}jnV_@nW*b21*rU;Kz~*von1|BDy+D0TY7{|8*ZUORucHf&h_ zuDeg4{2fcrp2;u!?U#5t=pes?$=_f8^r!r4|K2nB-S2;eeEoZ0_{;AlUw(PHKYWg7 z#0&f2E%hS&z-fsK@$S0(0w3_eFYcFk($74!>-fOuGtN1Fe-00L1Rm5YaOiUbc!MYB zX*|Xr&Z+ziH{#fJaad~iY4s>SB;MAp&3batqWm7zuwnUo+oO->Pda}e)w_54|Bypm ze>Y^nfU>@NGi2~!{YqWp2k)>)xli$ApXx@uqF#avc|yM7cYfes`2}w916-B(F|P9< zKk>hKk%!;}j@+l=$9?@hkEh^QT-dL;aSjky{B3_FZ@bT)a6-EeFR5Ev(myk2`rS(U z@xTMsE6FDZAME$r$vcN1p1;>U{O}J#PCL!_?(+YUoPD;u1t;>G-&@h{(|-5q`&oEP z-Vsl5!hhal@E@G;H~SjLb$-y6FXSQo#V^M7zTbHoPw;z*AN5L!4|NUge#uMt#k$}C zzrhh)$U|`FdWnZ`!;5+``E1>~$fw;N-8bc?+KWe%Sj4=PjE5N`Am6?&Ayg#zQpR;2-1h2fV0L*wOQF z!r$;x;s~$61DyE(U1i&QUgOJGa9}_7>)b7F@Rjf#bN=CN;i%f9gLx8VgIO5DJU>sene zTb8`KaAC&rph5g5A8F&4tXBpOly`hDTt8a=(WddqH~-JTe*3vk<0H6pz0}6RbN-)% z^A=vgANU47@B=;Pe{GiSMaD|uP2QJL3eo}wIiG7*({{TZJ4c`C& literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog.miff new file mode 100644 index 0000000..2e7732c --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:......//////111111333333555555555555444444444444222222222222111111111111000000......,,,,,,,,,,,,111111222222444444999999>>>>>>BBBBBBCCCCCCCCCCCC@@@@@@HHHHHHPPPPPPXXXXXXccccccoooooottttttrrrrrrvvvvvvttttttnnnnnneeeeeeaaaaaaaaaaaa]]]]]]XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXbbbbbbmmmmmm[[[[[[@@@@@@333333555555222222111111333333//////))))))......))))))??????^^^^^^uuuuuussssssPPPPPPVVVVVVxxxxxxuuuuuuTTTTTT......//////111111333333333333333333222222222222111111111111111111111111000000//////............111111000000111111555555999999<<<<<<============BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttuuuuuurrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[YYYYYYTTTTTTRRRRRRSSSSSSTTTTTTWWWWWW______gggggg\\\\\\@@@@@@111111555555666666666666555555------333333333333,,,,,,777777IIIIIIiiiiiiuuuuuuAAAAAABBBBBB______ooooooUUUUUU------......000000111111111111000000//////......////////////////////////////////////////////////111111000000//////111111555555777777888888888888AAAAAADDDDDDEEEEEEHHHHHHQQQQQQaaaaaammmmmmqqqqqqvvvvvvqqqqqqffffffZZZZZZWWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF222222333333444444555555444444++++++222222111111......000000333333^^^^^^zzzzzzHHHHHH777777::::::UUUUUUNNNNNNHHHHHH,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,,,,,,,------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiirrrrrrnnnnnnccccccXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRROOOOOOOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbttttttjjjjjjnnnnnn~~~~~~eeeeee,,,,,,------............------,,,,,,******))))))((((((((((((((((((((((((((((((******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^VVVVVVTTTTTTUUUUUURRRRRRNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------------222222111111++++++eeeeeellllll//////000000111111111111000000//////------,,,,,,************))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444000000666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTTTTTTTVVVVVVTTTTTTNNNNNNEEEEEEHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV777777''''''))))))++++++......------''''''%%%%%%&&&&&&ZZZZZZxxxxxxPPPPPP333333444444555555666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999666666444444333333777777888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuXXXXXX>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWWTTTTTT777777888888999999::::::::::::999999888888777777666666555555333333111111111111222222444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[[[[[[[eeeeeeqqqqqq~~~~~~]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||yyyyyyRRRRRR888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>FFFFFFFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______XXXXXXZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaawwwwwwyyyyyyoooooowwwwww{{{{{{||||||xxxxxxaaaaaa888888444444666666\\\\\\xxxxxxrrrrrrUUUUUU444444777777<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa[[[[[[______aaaaaa^^^^^^````````````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppvvvvvv{{{{{{}}}}}}~~~~~~jjjjjj[[[[[[KKKKKK}}}}}}Ǭqqqqqq[[[[[[111111222222666666<<<<<>>>>>;;;;;;FFFFFF\\\\\\ccccccUUUUUURRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddppppppttttttxxxxxxyyyyyyyyyyyy||||||}}}}}}llllllԋ111111000000111111777777??????FFFFFFHHHHHHHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC999999555555333333111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX[[[[[[bbbbbbddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddiiiiiippppppuuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{}}}}}}~~~~~~~~~~~~vvvvvv888888333333000000222222999999BBBBBBHHHHHHJJJJJJccccccrrrrrrSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~ooooooaaaaaaYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{rrrrrrJJJJJJFFFFFFAAAAAA;;;;;;999999======DDDDDDIIIIIIXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddaaaaaacccccciiiiiilllllljjjjjjhhhhhhhhhhhhppppppbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvxxxxxxUUUUUUOOOOOOMMMMMMIIIIIIBBBBBB============BBBBBBHHHHHHTTTTTTxxxxxxssssssjjjjjj^^^^^^ffffff{{{{{{iiiiiimmmmmmiiiiii``````^^^^^^ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttkkkkkklllllldddddd^^^^^^ZZZZZZ\\\\\\llllllIIIIIIIIIIIIOOOOOOPPPPPPJJJJJJHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqppppppjjjjjjkkkkkkffffff``````cccccclllllljjjjjjbbbbbbffffff]]]]]]ffffffppppppeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv{{{{{{vvvvvv]]]]]]aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvrrrrrrUUUUUUrrrrrrooooooxxxxxxzzzzzzjjjjjjbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````bbbbbbaaaaaagggggglllllliiiiii````````````UUUUUU^^^^^^hhhhhh©PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQRRRRRRPPPPPPKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddiiiiiixxxxxxyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnngggggg``````cccccchhhhhhiiiiiippppppppppppddddddqqqqqqyyyyyytttttthhhhhhaaaaaa^^^^^^ggggggwwwwwwddddddeeeeee\\\\\\______aaaaaa~~~~~~||||||uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJHHHHHHIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUWWWWWWNNNNNNbbbbbbzzzzzzoooooommmmmmrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyynnnnnnggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhffffffwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}}}}}}}qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPKKKKKKLLLLLLOOOOOO]]]]]]ffffffbbbbbbwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______oooooorrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhooooooeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzssssssmmmmmmppppppooooooppppppwwwwwwbbbbbbiiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWW}}}}}}OOOOOOOOOOOOQQQQQQRRRRRROOOOOOLLLLLLTTTTTT^^^^^^xxxxxxuuuuuurrrrrrssssssllllllbbbbbbiiiiiittttttqqqqqqaaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkffffffiiiiiikkkkkkeeeeeeeeeeeehhhhhhllllllllllll``````ffffffrrrrrrBBBBBBJJJJJJwwwwwwPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^aaaaaassssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbddddddpppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmjjjjjj______``````uuuuuuvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{\\\\\\QQQQQQMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddddddddeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllggggggiiiiiiggggggjjjjjjggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooozzzzzzyyyyyyrrrrrrhhhhhhffffffiiiiii<<<<<>>>>>BBBBBBRRRRRRkkkkkkiiiiii^^^^^^ffffffjjjjjjZZZZZZRRRRRRqqqqqqkkkkkkZZZZZZbbbbbbccccccddddddeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]qqqqqqhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmjjjjjjkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{FFFFFF------hhhhhhxxxxxx{{{{{{yyyyyyttttttttttttxxxxxx//////888888111111>>>>>>____________``````gggggg______[[[[[[pppppp{{{{{{cccccccccccceeeeeeddddddeeeeeeiiiiiiiiiiiieeeeeeccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllqqqqqqlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmnnnnnnjjjjjjbbbbbbaaaaaaddddddaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz}}}}}}{{{{{{wwwwwwuuuuuuwwwwww{{{{{{......444444++++++444444TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmwwwwww}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~yyyyyywwwwwwwwwwww{{{{{{999999======888888======NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______YYYYYY[[[[[[bbbbbbbbbbbb[[[[[[iiiiiillllllaaaaaaffffffeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuunnnnnnkkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUkkkkkkoooooojjjjjj777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||NNNNNNOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffmmmmmmbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffnnnnnnaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooommmmmmiiiiiibbbbbbffffffkkkkkkggggggmmmmmmllllllkkkkkkjjjjjjnnnnnnnnnnnnddddddYYYYYYZZZZZZHHHHHHVVVVVVrrrrrrwwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY______dddddd____________cccccc______cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccaaaaaaqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssiiiiiieeeeee^^^^^^UUUUUU______mmmmmmoooooonnnnnnmmmmmmjjjjjjiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX999999UUUUUUqqqqqqWWWWWWooooooxxxxxx``````))))))......777777::::::>>>>>>pppppp``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXhhhhhh______UUUUUUIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkppppppiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWWZZZZZZ______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQPPPPPPMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{qqqqqqpppppp````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWSSSSSSQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF>>>>>>222222<<<<<>>>>>EEEEEE666666000000111111GGGGGGddddddiiiiiizzzzzzllllllggggggbbbbbbbbbbbbbbbbbbccccccccccccccccccddddddddddddkkkkkkaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@777777KKKKKKVVVVVVKKKKKK======::::::>>>>>>>>>>>>******333333<<<<<<000000444444444444CCCCCCrrrrrr______aaaaaaqqqqqqnnnnnn^^^^^^bbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeeiiiiii333333nnnnnn^^^^^^hhhhhhppppppllllll______TTTTTTSSSSSSPPPPPPMMMMMMJJJJJJJJJJJJIIIIIIJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMBBBBBB111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<]]]]]]______XXXXXXddddddqqqqqqUUUUUUddddddeeeeeeeeeeeeeeeeeeddddddddddddffffffhhhhhhbbbbbbuuuuuuyyyyyyssssssۃUUUUUUddddddrrrrrreeeeee[[[[[[NNNNNNHHHHHHIIIIIIQQQQQQLLLLLLGGGGGGAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX666666333333888888555555111111333333333333000000111111555555888888======FFFFFFPPPPPPHHHHHHTTTTTTWWWWWWllllllffffff@@@@@@cccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhhhhhhhбiiiiiiOOOOOO______NNNNNNQQQQQQYYYYYYXXXXXXLLLLLLCCCCCCHHHHHHOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLwwwwwwRRRRRR444444111111666666333333//////000000111111............000000222222555555<<<<<>>>>><<<<<<<<<<<<>>>>>>======;;;;;;::::::::::::666666000000//////333333<<<<<>>>>>888888666666999999OOOOOORRRRRRCCCCCCJJJJJJNNNNNN;;;;;; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..af1c11c1e4e3500e5a9bac486b4771ddb63ffc32 GIT binary patch literal 26037 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 J56_*S|37q{3WERu literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..e8d118910a92fe33e3c6b1364e78e665899a3506 GIT binary patch literal 26037 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..621c674f3a0ae47277b385e5ed282e71f1fed242 GIT binary patch literal 26037 zcmZ5|cUV;C_BFPc7!ylOEU5Gj!}Q)LGYq}=I`rOq??syQrhp0vDvG@U3Mi<6D3(}b z?@^=3eE(wT~CM57o!{UPi5>4>4vT~F(F)@he6rU8dBp@a-DJnXF#~>;z$H$~3@ThcU z<-nlW#84iIzQiFYLH7GZycL6-${;H%Cq;)PCh(G?1A~IYqJsjL#LE7w?2l8abUmUT zaY=lT>^JdY(IEz5(TPFPiM-gL_yF0vB}pTfgh->Jq&y;lN~6+fvR4Kg#Kwn3N#oOG z&(W#+L;{7PtQ-;_6cqh`enF8vFZ)FPkx4=S=UEa>_B4^cBqcN~QTBX{?4QZrghC=S z@HS-DlBG-7>u5B6eKob289Lp-KvQ#in!zwM)Ym_Mp2Z@O3=JnHI2HPU0oXO;zfZ#PmjTvoaAtbL?-jxIo5xU@o_fW z$cV){eVWTPGh;B0A2%@(i)pmOhb=8lObCR72i@JdTwUG$`=g^d99`XAyUNOVJR-5Y zeA_mmkiiHFI(pR9R3NalJa^9A+{A>3K`Fs*dM`v`D$0HET%nlwjF)=i>w(jkfNXTRdhn5yIGebi!uZjv|V;!B4 zkjhG9V?Dj7sPb~5P)8>^y0TIr(AJKMs;LnObaWyk>+88(P0jG|=4KvGTRS+oyIU+K z5^Zd{x}2R&Wk+6~rKP!fc(|Jzoz7tN_lrb&dIZARv&P1_Qn(I=h6V=b&e3Q@qOR`w z^K?3eqN_VKg{!ZocIgtCtgEY}G&93y8yKjoPff8{nwqMr=g-^OvDrM{zJ0N=Zf>EW zSy@FzQBg%j{{D4!X=z)wBqU^IMMhRt)z#VA+1LaI?%QW$G&S_+$55L!NdfOMked%$nm0~0lbh%s;ar zQIQCLdE|(*GjMX~P+%a7rLBG7KzcfpsjJ)AxOp?KbV5RRHlOrbb9w6~j?QK{bEwY8?EL}F-YeZ83(g%TZIU2SYkAjHH}SM&LLdePB!byx{8 zF^!Ep9v*MmA`loDgoO0;n3>UNBGHZ=PEH~bgOQzWYin*E8R_K2WHJ~hPh#EZ>W+^K z1h`UIFEkp7gzJSXj_XdR>+4^eJIA z5t&S-o;cy=W@>6@S5lIaB9$g5M?}=tW@opyrlnAADZ`mRg8W}k{9zM+B7#Uex zA3Egb=Ia|4wtahkesOVibxuxXWL#WIN?o0;t&@|RTTc&#qOY&2dgTh4Odx1zT)9G} z8XDsN1J4Eq7cbIihz!%yR4PGsOixoN2C`#jhDuVEUc~zw7+_rx2xRiq6yBFYnVRBofDfE?b&15uNj6(Y$I$S?1w3zP zcd_lh)8(ql(8|LuB$sZXl>2m7#JKq>f*v;>FAs|5fsE=Xld=* zm6}SYYirlmR#h<=1_l`!Jv}@ggW>0Q>Xb+%6bb}au9%yP#cFC#pJIJ~^UZ??CMH7R z4?kSI$Y#^&V)60gRH}i2hsT~hK(>oZceg-5p?G+-w;LPNXn}!EO-4pkYIOAG&3rzY z92d7~6Y!OgP+m@@>gpyYR#!6^dV0ypO-+cH$;s{QLLrqJ7`S`4rKLc?1kub z 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..9158c2365b5bb7f78a0ee0e4a5401002f3af7873 GIT binary patch literal 26037 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 Zd0$CMT^$^;@^X!aeSm%Y;LN&Q{{byQ0p9=s literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog.miff new file mode 100644 index 0000000..9e113ba --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:55,,##66--&&77//,,9911//;;2255;;22338822228833//6644((4422##3322 1100..//////##0000&&55--++>>**55??++77;;0088999999::AA99<>AA88>>11==..CC//HH22GG//BB))BB++@@))??((??))<<&&==((FF00UUDDKKIIXX6677EE++..BB000099//--5500**6633**33//##22**::--$$99&&""PP::==ppXXhhmmyy}}llPPNNddNNTTddrruussuuPPSS\\55,,##55..&&77//,,9911//9900119900116600006611--5522))4422%%3311""11// ////##0000&&1100++77..//<<++55==))4499,,3388443399::44<<>>33@@>>//EE<<++UU;;**dd99((zz88**99//<<66CC==IIDDKKGGGGBBBB99<<3388,,>>..FF33GG44DD00GG33BB..>>++>>**==++??--GG55TTEE~~OOIITT8877??++**??1100::55117766116666,,00.."";;55))==33))88))$$EE2244XXDDPPwwaavv~~||oo@@AASS;;AAMMXX__iillqqwwOOTTXX33,,""22..%%44//))5500--55////44....33----22--**3300++22//((11..%%00--&&00,,))22..--33..2255//33;;,,33;;**00::))//;;,,//??1100??4400@@66--BB66**MM;;--VV99))ee77''xx66((77--==77EE@@IIFFKKIICC@@::6644--77..??33BB55AA44>>2288,,44**77++;;00@@44KK??[[NN]]RRQQCC::9900))6633,,3366//2277001177--**--""4444((5511&&55,,%%99..,,<>55,,BB<<00EE<<++PP;;((__99&&uu77((;;00DD;;HHCCKKGGFFCC>>9955//55//;;33<<44::22::33770088..::11<<44DD::TTJJii]]||kkbb__NNBBDD6644::..((22))''22**,,66--,,44))++--""//,,##6622))8811++11++++ccaaffooyyxxaanneeddqqhhxxxx]]ii[[//,,##....$$11..''//..))00,,))//++((--))((,,(('',,(()),,(()),,&&**++%%)),,%%,,--&&..//''22,,++00''11((&&11##----%%55,,''==----??1111<<4422558811//;;//11??..99AA**FF>>''ZZ::%%tt;;((AA22FF::FF==EE<>44==44~~::11~~>>55@@77CC::EE;;EE<>00==..AA22AA44==11==22@@66??66||<<33pp44**qq88--tt>>44yyEE::}}KK@@\\PPwwiizzoo__yy\\GG``JJ((@@22..%%..))%%..))--00))....&&++))&&&&&&))WW__TTȴppggEEXX::3333334444225566116677116677115566004433..3322..44001133//0033--1111++//11++//22,,..33----0011))))66""))992266%%<<55--CC5544DD4477==2288772266//33221188007799,,==44##LL--__,,zz22##;;++==**BB..BB22>>//;;..==22==11~~:://}}==33ww;;00ss==11wwFF88RRDDeeVV}}nnooppeellZZgg@@ffQQ,,HH<><<--EE<<33KK;;;;LL77<>@@55??AA44DDDD::GGGG??BBAA==BBAA??==<<::??;;88>>;;442200##00//AA??**==55""@@44$$II;;..SSBB;;TT@@??OO4499PP//88YY11<>XXww$$44WWUU..''jj]]MMwwiippoommssqqppzzooggNN``FF6622@@8877??==;;<><<::==??==>>IIHHCCDDEE7799;;%%<<::##RRFF66OOAA44LL@@44MM@@77MM>>99OO7777RR//55YY**22ii**55<>==<>CC;;KKCC^^WWZZUUMMIIKKNN33??11HH88VV>>bbAAkkDDrrIIwwOOxxbbMMcc<>>>66CCDD44GGHH88HHII;;GGGG??HHHHHHPPOOUUEECCNN5544<<66668899::445599**6699&&2200!!<<::--CCDD66FFFF::GGEE99JJ@@77PP7722ZZ..--qq1122BBFFFFKK77::3322>>99??5544&&==++88&&66&&:://<<55;;88;;88>>9955..BB88KK??TTHHYYPPLLEE<<88<<<<==CC==HH@@TTBB]]BBeeEEjjKKqqTTvviiddww^^ff]][[߽Ƈxxss66..9944--445500--::88,,BBAA//GGHH66IIII==IIHHDD]]\\dd{{zzzzxxWWXXmm??AAPP6699@@226655338811//55++??BB77GGJJ??CCEE88==99--@@22%%HH,,!!SS$$||9911??::>>9955..44**==33==//55%%;;((<<''99))66**44--55..22,,//&&55((??11LL==TTEEMM@@;;2200++3333HHIIIIOOKKXXJJ^^IIccKKiiPPppVVttYYqqccrrjjqqaabbώù>>55::9911//66//%%6633"">><<''EEDD00IIII??KKIILLcc``uuᦦъllooMMRRhh77==II;;CCEE;;@@::::;;55BB;;33SSBB88ffJJ>>ssII;;yyAA22GG88AA11>>..AA11CC11AA00AA22EE44BB..II44GG77>>1166--55++11))00$$55%%99&&FF55PP@@FF8888..6611<<99BB@@DDFFHHPPKKYYNNaaRRjjTTmmWWooUUgg``kkoouuYYZZܬII====BB9922<<55%%9944==99 CCAA,,JJGG@@KKJJRR]]ZZyy{{~~[[^^}}MMKKYYCC88>>GG1144kkGGIIhhgguuppii``XXJJKK99??**==''DD00EE33==//==22GG99@@00FF44EE88>>44771144--33++55))??1199((FF66QQBBBB9966117755::99CC??DDBBFFIIMMTTSSaaVVggUUggTTee]]ii]]eessvvVVXXzzyySSFF@@MMCC77HH@@++BB<<""??;;BB@@++HHEE@@KKIIWWWWRRzz񰰫ᔔwwZZnnJJ^^XXjjfftt]]ffKKMMAA;;AA33==**::''::))77))22++..--553344,,55++22--33001111//00//..22..DD;;77**DD88SSIIDD@@55661177..33DD??CC>>BB@@JJMMWW^^^^ii[[ffVVaammuuccgg}}[[[[vvBBDD[[JJBBYYII<>::==OOKK==22CC33@@0055&&..$$11++..//))++--,,%%%%""$$,,--44443333220033//::44**$$;;55RRMMIIGG==??88>>225555//55++77//EE@@XXXXffkkhhllddhhttwwggiittqqaa<<66^^EE>>ffKKDDhhHHIIccAA@@^^@@88\\EE77VVII66IIJJ::SS____ss˙ꜜ阘٣βzz__||CCTT@@MMHHQQBBGG>>>>DDAAIIAABB88;;0055))66++88..88//55..11--++// '',,11::;;22//))$$11,,9944::66**''2211BBCCGGFFNNKKJJHH33//88//@@2211!!@@11OOHHmmjjYYYYffeerrqqqqnnmmggkk^^ooggRR__MM??bbNNEEffHHJJcc@@DDaa??==aaGG::YYNN22OOOO33@@NN==WWjjppggvvȌrr``99^^FF]]88DDDDMMMMPP@@@@6600;;22@@66;;1133**,,##..&&44++9900;;22663366>>''33,,3344555500::33FF>>FF??8833//,,//0011223311;;77CC<>UUMMBBWWFF>>ZZGG99^^MM99ZZTT44TTUU55HHOO==QQYY[[UUTTssttffyyzzooHHdd55II22??DDNNKKNN::::22++<<22FF::CC77::0000''//((55..994499774444,,44$$..**004466::77CC>>EE>>9922EE??LLGGFFBB::6644//33,,>>55NNEE9900<>BB////11**AA66HH<>77<<44//%%\\TTxx~~ggwwNN]]QQSSNN==jjttQQkkddyyppooͭDDYY22EEVV22IIRR77QQPP;;UUOO99VVNN77TTOO22RRNN55KKGG;;XXOORR\\JJ``^^{{uu____SS]]BBNN<>;;??99??44::005577>>>>DD44::0033<<==GGCCMMEEQQGGKK>>EE88EE;;CC88AA99FF==00 11%%4444667733//IIEEjj}}QQmmIIbb>>BBzzKK99ggmm^^kk__aaUUvvggyyii{{nnvvuull__[[TT::\\QQ;;aaQQAAbbPPBB^^LLBBZZHHDD]]QQQQff\\ddyyrrãęqqccTTQQOOOOOONNCC??9922CC99NNAAFF8877**@@33AA6699006622??==EEGGGGKKLLNNOOSSIIQQ::CC11::IIOOddhhjjiiQQJJII??FF99CC44:://;;00992211''0022$$,,--//446677;;@@xxaayyLLiiGG\\}}))))eeBB,,ddvv__ll``llbboo^^oo\\yyhhsstteeeeUUbbLL>>aaKK==ddLLBBffMMHHccKKKKaaNNTTkk]]nnxxoovvttyyzz}}~~ΦllddllcciiaaOOGG66--<<22JJ@@JJ==66**AA55AA6644**..''8844AAAAFFFFXXZZccggYYaa55??''44FFQQ[[bbMMOO>>;;55++>>22EE77;;//==44>>88--%%77##77&&**((,,2255<>aa++bbEEAAeeIIEEiiMMIIccIIHHaaLLSSttccuuvvzztt^^^^vvzz⼼絵\\PP``PPrrsshhWWNNCC;;--##<<33??55DD99EE99AA55:://88..88118844==>>[[__MMVV55AA<>77AA88??44<<22<<55662211))77$$55##33....3344??99LLggJJffWWjj>>BBiiLL::DD??^^YY11~~VVLL99``SSbbMMggNNbbFFXX||>>UUww;;XXyy@@MM4477WW????__JJGGffTTRRnnaajjuukkrrkkkkggrrqqԗ䚚ޜϣǑttjjrruuXXJJQQ;;mm\\yyllxxnncc[[77//..%%33((77++<>44??++6677<<6666;;99>>88==44::4488333311//((55""88$$??6677::--99II^^RRppOOiiPPYY[[55,,IIEE,,1177bbYY22ffmm::KK}}44YYIIffLLkkMMeeHH__@@^^}}AAbbEE99..22DD;;<>..??11AA44AA883344BBGG44<<""++,,7700::**4411774477::::;;888855886688552211//((55""<<((CC66::77,,88ZZppCC]]SSffkk8855//<<[[iiEEVVggNN[[HHkkOOnnMMiiJJddDDeeEEjjJJ00..338888880033((::BB33XXcc]]WWaammXX]]wwxxׅԌ͑Ívvqq``ppttXXMM~~PP99]]KKqqaallccOOHH22**11''66((88''==,,BB00DD22@@22==22::221111;;??55::--1177==<>GG^^ooEEWWGGOOUU>>00 //DDYY88Ȥ~~RRjjQQggTTkkOOllKKhhIIggHHiiJJnnOO..--22335522''00--;;""LLZZIIRR``aaggmmΝۉċ~~uurrddsskkTTZZXXNNQQBBSSEE[[OOMMGG33--00''99--88&&66""::''BB//DD55<<0044--00,,--,,6677::;;<<;;FFFFKKLLFFHH@@DD338855::66::8899<<==@@>>==99770099**>>,,44$$;;33^^bbVV^^NNRRjj11**&&&& ??WW55}}lláxxWWYY11]]{{EEhhUUggMMffIIffIIjjMMppQQttUU==66==>>==8877<<%%99DD$$GGUU;;KKXXNN^^eexx{{qqxxjjww~~rrttllaa[[bbYYTTiiPPKKTTIILLBB??66GG@@CC>>44,,88--88));;''6688!!AA..EE88>>66663344337755==;;BB??DD@@DD@@FFCCAAAA::<<559955::449977::>>>>CC????8888..88))77''55&&MMAAllllPPOOXXOOLL33EETT33nnddzzssWWWW55EEMM&&ddPPddSSffMMeeIIiiMMooUUvvZZxx\\\\GGPPZZKKHHWWQQ77UUWW22QQYY44NNVVAAVVYY``eebb}}uuoogg]]ccXXffbb[[UU[[VV@@ZZYY::__``AAmmYYAATTKKMMII7755<<99??;;::11BB5577%%EE--:: 66??))BB66==88779999<>DD>>>>7777..7700;;77555588;;55::33;;44::==>>BB>><<4455))88++));;,,YYKKZZTTVVLLhhSSddggHHxxlloojjMMGG==""$$((00@@jjXXmm\\llWWhhQQllSSss[[vv\\qqYYnnUU[[ggTTPPjj^^HHkkffFFccccAA``bbJJddcc^^``]]ff^^WWgg__WWdd``XXUURRMM::EEDD%%TTTT..ccee@@ooZZ??YYPPWWVV>>>>;;99885555..FF88::&&II00::1166!!;;..77224488::>>BB????88??66:://00$$77--FF??GGCC>>>>;;==88<<99;;@@==EE::??1155''<<11>>33[[OO@@66^^PPuu[[~~YYooKK.. 77117700??II&&11FFggVVuubbuu^^ooWWppXXtt^^rr\\ggRRnn\\ZZll]]VVkk__QQjjbbMMiiccMMiiddNNiiccSSiiccWW``YYOOooii]]ee__OOZZUUAANNII33HHDD++QQOO88XX>>--~~7711^^__aacc99::****9944==3366&&FF1188 ,,..::..BB;;==??>>>>;;77>>55<<11:://;;..==22>>77??88IIFFHHFFFFCCAA;;==1199&&::$$;;''55++33--<<55OOEE__TTaaSSjjXXDDOOMM44!!** ==HH((BBII**==GG%%((6633EEllXXxxccooWWvv^^{{eeppZZaaMMZZFFkk^^VVkk^^UUll``TTll``RRjjaaPPkkccPPkkccNNkkccLLvvppZZrrllVVffaaKKllggSS[[VVCC<<66&&@@::**SS;;//kk,,''7766\\\\``__<<::5511DD>>AA6644&&88'';;))BB33II>>KKCCCCAA@@==;;55??44==00;;..::,,::..::119911>>99>>88>>77<<00::))99##||<>::>>;;@@<>00%%kkGG99RRCCRRDDSSGG^^VVYYSSHHEEEEFFCCHH@@EE::==7766AA<>@@JJ11//<<""..== //@@ 22CC##UUddCCzzdd}}bbkkMM^^@@]]AA``HH]]EEjj``TTjj``TTjjbbUUjjbbUUjjccSSkkddTTkkddTTjjddTTmmggWWxxrrddaa[[OOYYUUIIzzvvmm}}ttUU;;**II))PP++aa66%%ss;;..LLCCRROO>>AA@@HHAALL??HH;;CC@@@@HH@@FF::AA2255((99--::--==..>>..==--;;//:://77--66--66,,66++{{77**ss88((ll77%%hh77((ee11&&ttBB;;VVMM``WW}}aaVVmm[[OOWWPP@@EEDD22::??++@@II44>>JJ4411??&&,,:: //==##HHUU99uu__||``eeEEXX}}::]]AAbbHH]]DDkkaaUUjjbbUUjjbbUUjjbbUUkkddTTjjddTTjjddTTkkeeWWee__QQaa]]QQ``\\QQܩWW>>((II33PP::%%88 qqEE::||kkmmEEMMFFQQJJVVIIQQEEFFAA;;BB55HH9933''88,,::,,;;..}}>>//||>>11||>>11}}==11}}::11||9900zz77..vv66,,ss77,,ll77))ff55''aa33&&XX,,##nnFF>>}}[[QQrrVVKKXXDD99BB66**22// '')),,33##::EE44AANN::..;;''))77 ,,::!!CCPP66}}jjtt[[__@@WWvv::bbFFffLLZZxxBBjjccSSiiccSSiiccSSjjddTTjjddVVjjddVVkkeeWWiieeYYnnjj__dd``WWssnnhhԣyy__PP;;GG<<**VVMM<<ӽrrvvSSZZ::@@88==>>==@@;;BB77JJ==55,,::00:://;;00{{;;//xx<<11vv>>11vv>>11rr99..pp77,,nn55,,ll66,,ll77//ii77..ee55++__33**RR--$$aaCC99jjOODDZZFF;;HH:://AA99..????33==AA33))11"",,99((55BB11,,99((00;;**..::&&??HH33vvdd~~OOSSpp::SSpp::aa}}JJbb~~NNPPll<>HHEEJJDD??55;;//::22>>66<<33;;22zz<<11vv<<11rr>>11qq??44hh88,,ee66,,dd55++ff77//hh9911ii::22ff7711^^66..ccEE;;^^HH;;PP>>22<<..##22**5533''5577,,--33''22<<11))55''00<<0022>>00==HH88//::))33<<++ssWWmmFFIIcc66MMgg::__xxNN^^ttNNFF__88hheeRRiiffSSiiffUUiiffUUhheeVVhhddXXjjff[[kkhh__aa^^WWrrqqll͸~~{{jjxxvviiʭrrjj;;22DD::NNDDFF;;@@88::44{{55--ww44,,||==44xx??44oo==22ee66,,cc99--__77--aa;;00hhBB99hh==66aa66//gg7733kkDD==yymmbbTTGG??33''9911$$::88,,4466++--33))..66++,,66--))55))**66,,..::..22<<1177??22@@FF::FFRR>>==PP22II__;;MMbbAAaavvWW]]ppTT66JJ//ggddQQiiffSSjjggVViiffWWhhddXXggeeYYiiff]]iiiiaakkjjeeĻ٩UUHH66**FF;;88//@@88II@@EE<>44ooEE99^^::..^^>>11XX:://VV66++^^<<33ooHHAAttIICCeeCC::rrffYYRRBB9933%%4422%%6688++1144))**11))**44++))55++''33))''33))++55,,//66..0088--88>>44>>FF7788GG00BBVV;;EEWW??YYkkUUTTeeRR..??,,ffeeQQggffRRiihhVVhhffWWggeeXXeeeeYYgggg]]hhhh``bbaa\\||}}wwij||mmMM>>KK@@uu??55pp77..ss::11nn7700rr@@77ll@@55__99,,\\??11[[AA22WW@@00SS<<,,XX>>11ddFF;;ooMMCCmmQQFFqqeeWWMMJJ994422##2233%%66::,,2288,,..55--..88//**55--''22**''11))))33**++22**))00((..33,,44<>qqII==__>>//__HH88UUDD22XXKK88``SS@@WWFF44GG44##\\BB33zzddVVaaZZHHEEFF444455%%5588''::>>0077==1155==2255??6600::22,,77//,,66..--77//,,33++))00((++00))//77,,//==,,66GG4422CC00CCTTBBFFTTGG,,::--ccddRReeffTTgghhXXhhii[[gggg[[eegg\\eeff^^ffgg__kkllddssvvmmýѯ{{UUJJggAA66__==11\\@@22]]LL88RRJJ33WWSS::]][[BBSSOO66EE==&&VVGG22ppccPP\\ZZEEIIKK66<<==++<>BB44;;AA5599AA6699CC::77AA9955??7744>>6655??7733::33..55..//44--22:://66EE2299KK55..@@**::KK88>>OO??**;;++bbccQQeeffTThhiiYYhhii[[ffhh[[eegg\\eeff^^ffgg__kknnee||ɺû~~\\PP``>>22``@@33ggPP@@WWHH33UUQQ88QQQQ77HHLL11PPPP44^^]]AAcc\\BBYYSS;;__]]HHPPRR==EEHH55AAEE44??CC4499??1177??4499AA66;;EE==99CC;;::DD<<;;EE==::AA::44;;4444992277??22IIXXEEII[[CC88JJ44??PP==BBSSAA11BB22 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..621c674f3a0ae47277b385e5ed282e71f1fed242 GIT binary patch literal 26037 zcmZ5|cUV;C_BFPc7!ylOEU5Gj!}Q)LGYq}=I`rOq??syQrhp0vDvG@U3Mi<6D3(}b z?@^=3eE(wT~CM57o!{UPi5>4>4vT~F(F)@he6rU8dBp@a-DJnXF#~>;z$H$~3@ThcU z<-nlW#84iIzQiFYLH7GZycL6-${;H%Cq;)PCh(G?1A~IYqJsjL#LE7w?2l8abUmUT zaY=lT>^JdY(IEz5(TPFPiM-gL_yF0vB}pTfgh->Jq&y;lN~6+fvR4Kg#Kwn3N#oOG z&(W#+L;{7PtQ-;_6cqh`enF8vFZ)FPkx4=S=UEa>_B4^cBqcN~QTBX{?4QZrghC=S z@HS-DlBG-7>u5B6eKob289Lp-KvQ#in!zwM)Ym_Mp2Z@O3=JnHI2HPU0oXO;zfZ#PmjTvoaAtbL?-jxIo5xU@o_fW z$cV){eVWTPGh;B0A2%@(i)pmOhb=8lObCR72i@JdTwUG$`=g^d99`XAyUNOVJR-5Y zeA_mmkiiHFI(pR9R3NalJa^9A+{A>3K`Fs*dM`v`D$0HET%nlwjF)=i>w(jkfNXTRdhn5yIGebi!uZjv|V;!B4 zkjhG9V?Dj7sPb~5P)8>^y0TIr(AJKMs;LnObaWyk>+88(P0jG|=4KvGTRS+oyIU+K z5^Zd{x}2R&Wk+6~rKP!fc(|Jzoz7tN_lrb&dIZARv&P1_Qn(I=h6V=b&e3Q@qOR`w z^K?3eqN_VKg{!ZocIgtCtgEY}G&93y8yKjoPff8{nwqMr=g-^OvDrM{zJ0N=Zf>EW zSy@FzQBg%j{{D4!X=z)wBqU^IMMhRt)z#VA+1LaI?%QW$G&S_+$55L!NdfOMked%$nm0~0lbh%s;ar zQIQCLdE|(*GjMX~P+%a7rLBG7KzcfpsjJ)AxOp?KbV5RRHlOrbb9w6~j?QK{bEwY8?EL}F-YeZ83(g%TZIU2SYkAjHH}SM&LLdePB!byx{8 zF^!Ep9v*MmA`loDgoO0;n3>UNBGHZ=PEH~bgOQzWYin*E8R_K2WHJ~hPh#EZ>W+^K z1h`UIFEkp7gzJSXj_XdR>+4^eJIA z5t&S-o;cy=W@>6@S5lIaB9$g5M?}=tW@opyrlnAADZ`mRg8W}k{9zM+B7#Uex zA3Egb=Ia|4wtahkesOVibxuxXWL#WIN?o0;t&@|RTTc&#qOY&2dgTh4Odx1zT)9G} z8XDsN1J4Eq7cbIihz!%yR4PGsOixoN2C`#jhDuVEUc~zw7+_rx2xRiq6yBFYnVRBofDfE?b&15uNj6(Y$I$S?1w3zP zcd_lh)8(ql(8|LuB$sZXl>2m7#JKq>f*v;>FAs|5fsE=Xld=* zm6}SYYirlmR#h<=1_l`!Jv}@ggW>0Q>Xb+%6bb}au9%yP#cFC#pJIJ~^UZ??CMH7R z4?kSI$Y#^&V)60gRH}i2hsT~hK(>oZceg-5p?G+-w;LPNXn}!EO-4pkYIOAG&3rzY z92d7~6Y!OgP+m@@>gpyYR#!6^dV0ypO-+cH$;s{QLLrqJ7`S`4rKLc?1kub z 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..9158c2365b5bb7f78a0ee0e4a5401002f3af7873 GIT binary patch literal 26037 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 Zd0$CMT^$^;@^X!aeSm%Y;LN&Q{{byQ0p9=s literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_rose.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_rose.miff new file mode 100644 index 0000000..9e113ba --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_rose.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:55,,##66--&&77//,,9911//;;2255;;22338822228833//6644((4422##3322 1100..//////##0000&&55--++>>**55??++77;;0088999999::AA99<>AA88>>11==..CC//HH22GG//BB))BB++@@))??((??))<<&&==((FF00UUDDKKIIXX6677EE++..BB000099//--5500**6633**33//##22**::--$$99&&""PP::==ppXXhhmmyy}}llPPNNddNNTTddrruussuuPPSS\\55,,##55..&&77//,,9911//9900119900116600006611--5522))4422%%3311""11// ////##0000&&1100++77..//<<++55==))4499,,3388443399::44<<>>33@@>>//EE<<++UU;;**dd99((zz88**99//<<66CC==IIDDKKGGGGBBBB99<<3388,,>>..FF33GG44DD00GG33BB..>>++>>**==++??--GG55TTEE~~OOIITT8877??++**??1100::55117766116666,,00.."";;55))==33))88))$$EE2244XXDDPPwwaavv~~||oo@@AASS;;AAMMXX__iillqqwwOOTTXX33,,""22..%%44//))5500--55////44....33----22--**3300++22//((11..%%00--&&00,,))22..--33..2255//33;;,,33;;**00::))//;;,,//??1100??4400@@66--BB66**MM;;--VV99))ee77''xx66((77--==77EE@@IIFFKKIICC@@::6644--77..??33BB55AA44>>2288,,44**77++;;00@@44KK??[[NN]]RRQQCC::9900))6633,,3366//2277001177--**--""4444((5511&&55,,%%99..,,<>55,,BB<<00EE<<++PP;;((__99&&uu77((;;00DD;;HHCCKKGGFFCC>>9955//55//;;33<<44::22::33770088..::11<<44DD::TTJJii]]||kkbb__NNBBDD6644::..((22))''22**,,66--,,44))++--""//,,##6622))8811++11++++ccaaffooyyxxaanneeddqqhhxxxx]]ii[[//,,##....$$11..''//..))00,,))//++((--))((,,(('',,(()),,(()),,&&**++%%)),,%%,,--&&..//''22,,++00''11((&&11##----%%55,,''==----??1111<<4422558811//;;//11??..99AA**FF>>''ZZ::%%tt;;((AA22FF::FF==EE<>44==44~~::11~~>>55@@77CC::EE;;EE<>00==..AA22AA44==11==22@@66??66||<<33pp44**qq88--tt>>44yyEE::}}KK@@\\PPwwiizzoo__yy\\GG``JJ((@@22..%%..))%%..))--00))....&&++))&&&&&&))WW__TTȴppggEEXX::3333334444225566116677116677115566004433..3322..44001133//0033--1111++//11++//22,,..33----0011))))66""))992266%%<<55--CC5544DD4477==2288772266//33221188007799,,==44##LL--__,,zz22##;;++==**BB..BB22>>//;;..==22==11~~:://}}==33ww;;00ss==11wwFF88RRDDeeVV}}nnooppeellZZgg@@ffQQ,,HH<><<--EE<<33KK;;;;LL77<>@@55??AA44DDDD::GGGG??BBAA==BBAA??==<<::??;;88>>;;442200##00//AA??**==55""@@44$$II;;..SSBB;;TT@@??OO4499PP//88YY11<>XXww$$44WWUU..''jj]]MMwwiippoommssqqppzzooggNN``FF6622@@8877??==;;<><<::==??==>>IIHHCCDDEE7799;;%%<<::##RRFF66OOAA44LL@@44MM@@77MM>>99OO7777RR//55YY**22ii**55<>==<>CC;;KKCC^^WWZZUUMMIIKKNN33??11HH88VV>>bbAAkkDDrrIIwwOOxxbbMMcc<>>>66CCDD44GGHH88HHII;;GGGG??HHHHHHPPOOUUEECCNN5544<<66668899::445599**6699&&2200!!<<::--CCDD66FFFF::GGEE99JJ@@77PP7722ZZ..--qq1122BBFFFFKK77::3322>>99??5544&&==++88&&66&&:://<<55;;88;;88>>9955..BB88KK??TTHHYYPPLLEE<<88<<<<==CC==HH@@TTBB]]BBeeEEjjKKqqTTvviiddww^^ff]][[߽Ƈxxss66..9944--445500--::88,,BBAA//GGHH66IIII==IIHHDD]]\\dd{{zzzzxxWWXXmm??AAPP6699@@226655338811//55++??BB77GGJJ??CCEE88==99--@@22%%HH,,!!SS$$||9911??::>>9955..44**==33==//55%%;;((<<''99))66**44--55..22,,//&&55((??11LL==TTEEMM@@;;2200++3333HHIIIIOOKKXXJJ^^IIccKKiiPPppVVttYYqqccrrjjqqaabbώù>>55::9911//66//%%6633"">><<''EEDD00IIII??KKIILLcc``uuᦦъllooMMRRhh77==II;;CCEE;;@@::::;;55BB;;33SSBB88ffJJ>>ssII;;yyAA22GG88AA11>>..AA11CC11AA00AA22EE44BB..II44GG77>>1166--55++11))00$$55%%99&&FF55PP@@FF8888..6611<<99BB@@DDFFHHPPKKYYNNaaRRjjTTmmWWooUUgg``kkoouuYYZZܬII====BB9922<<55%%9944==99 CCAA,,JJGG@@KKJJRR]]ZZyy{{~~[[^^}}MMKKYYCC88>>GG1144kkGGIIhhgguuppii``XXJJKK99??**==''DD00EE33==//==22GG99@@00FF44EE88>>44771144--33++55))??1199((FF66QQBBBB9966117755::99CC??DDBBFFIIMMTTSSaaVVggUUggTTee]]ii]]eessvvVVXXzzyySSFF@@MMCC77HH@@++BB<<""??;;BB@@++HHEE@@KKIIWWWWRRzz񰰫ᔔwwZZnnJJ^^XXjjfftt]]ffKKMMAA;;AA33==**::''::))77))22++..--553344,,55++22--33001111//00//..22..DD;;77**DD88SSIIDD@@55661177..33DD??CC>>BB@@JJMMWW^^^^ii[[ffVVaammuuccgg}}[[[[vvBBDD[[JJBBYYII<>::==OOKK==22CC33@@0055&&..$$11++..//))++--,,%%%%""$$,,--44443333220033//::44**$$;;55RRMMIIGG==??88>>225555//55++77//EE@@XXXXffkkhhllddhhttwwggiittqqaa<<66^^EE>>ffKKDDhhHHIIccAA@@^^@@88\\EE77VVII66IIJJ::SS____ss˙ꜜ阘٣βzz__||CCTT@@MMHHQQBBGG>>>>DDAAIIAABB88;;0055))66++88..88//55..11--++// '',,11::;;22//))$$11,,9944::66**''2211BBCCGGFFNNKKJJHH33//88//@@2211!!@@11OOHHmmjjYYYYffeerrqqqqnnmmggkk^^ooggRR__MM??bbNNEEffHHJJcc@@DDaa??==aaGG::YYNN22OOOO33@@NN==WWjjppggvvȌrr``99^^FF]]88DDDDMMMMPP@@@@6600;;22@@66;;1133**,,##..&&44++9900;;22663366>>''33,,3344555500::33FF>>FF??8833//,,//0011223311;;77CC<>UUMMBBWWFF>>ZZGG99^^MM99ZZTT44TTUU55HHOO==QQYY[[UUTTssttffyyzzooHHdd55II22??DDNNKKNN::::22++<<22FF::CC77::0000''//((55..994499774444,,44$$..**004466::77CC>>EE>>9922EE??LLGGFFBB::6644//33,,>>55NNEE9900<>BB////11**AA66HH<>77<<44//%%\\TTxx~~ggwwNN]]QQSSNN==jjttQQkkddyyppooͭDDYY22EEVV22IIRR77QQPP;;UUOO99VVNN77TTOO22RRNN55KKGG;;XXOORR\\JJ``^^{{uu____SS]]BBNN<>;;??99??44::005577>>>>DD44::0033<<==GGCCMMEEQQGGKK>>EE88EE;;CC88AA99FF==00 11%%4444667733//IIEEjj}}QQmmIIbb>>BBzzKK99ggmm^^kk__aaUUvvggyyii{{nnvvuull__[[TT::\\QQ;;aaQQAAbbPPBB^^LLBBZZHHDD]]QQQQff\\ddyyrrãęqqccTTQQOOOOOONNCC??9922CC99NNAAFF8877**@@33AA6699006622??==EEGGGGKKLLNNOOSSIIQQ::CC11::IIOOddhhjjiiQQJJII??FF99CC44:://;;00992211''0022$$,,--//446677;;@@xxaayyLLiiGG\\}}))))eeBB,,ddvv__ll``llbboo^^oo\\yyhhsstteeeeUUbbLL>>aaKK==ddLLBBffMMHHccKKKKaaNNTTkk]]nnxxoovvttyyzz}}~~ΦllddllcciiaaOOGG66--<<22JJ@@JJ==66**AA55AA6644**..''8844AAAAFFFFXXZZccggYYaa55??''44FFQQ[[bbMMOO>>;;55++>>22EE77;;//==44>>88--%%77##77&&**((,,2255<>aa++bbEEAAeeIIEEiiMMIIccIIHHaaLLSSttccuuvvzztt^^^^vvzz⼼絵\\PP``PPrrsshhWWNNCC;;--##<<33??55DD99EE99AA55:://88..88118844==>>[[__MMVV55AA<>77AA88??44<<22<<55662211))77$$55##33....3344??99LLggJJffWWjj>>BBiiLL::DD??^^YY11~~VVLL99``SSbbMMggNNbbFFXX||>>UUww;;XXyy@@MM4477WW????__JJGGffTTRRnnaajjuukkrrkkkkggrrqqԗ䚚ޜϣǑttjjrruuXXJJQQ;;mm\\yyllxxnncc[[77//..%%33((77++<>44??++6677<<6666;;99>>88==44::4488333311//((55""88$$??6677::--99II^^RRppOOiiPPYY[[55,,IIEE,,1177bbYY22ffmm::KK}}44YYIIffLLkkMMeeHH__@@^^}}AAbbEE99..22DD;;<>..??11AA44AA883344BBGG44<<""++,,7700::**4411774477::::;;888855886688552211//((55""<<((CC66::77,,88ZZppCC]]SSffkk8855//<<[[iiEEVVggNN[[HHkkOOnnMMiiJJddDDeeEEjjJJ00..338888880033((::BB33XXcc]]WWaammXX]]wwxxׅԌ͑Ívvqq``ppttXXMM~~PP99]]KKqqaallccOOHH22**11''66((88''==,,BB00DD22@@22==22::221111;;??55::--1177==<>GG^^ooEEWWGGOOUU>>00 //DDYY88Ȥ~~RRjjQQggTTkkOOllKKhhIIggHHiiJJnnOO..--22335522''00--;;""LLZZIIRR``aaggmmΝۉċ~~uurrddsskkTTZZXXNNQQBBSSEE[[OOMMGG33--00''99--88&&66""::''BB//DD55<<0044--00,,--,,6677::;;<<;;FFFFKKLLFFHH@@DD338855::66::8899<<==@@>>==99770099**>>,,44$$;;33^^bbVV^^NNRRjj11**&&&& ??WW55}}lláxxWWYY11]]{{EEhhUUggMMffIIffIIjjMMppQQttUU==66==>>==8877<<%%99DD$$GGUU;;KKXXNN^^eexx{{qqxxjjww~~rrttllaa[[bbYYTTiiPPKKTTIILLBB??66GG@@CC>>44,,88--88));;''6688!!AA..EE88>>66663344337755==;;BB??DD@@DD@@FFCCAAAA::<<559955::449977::>>>>CC????8888..88))77''55&&MMAAllllPPOOXXOOLL33EETT33nnddzzssWWWW55EEMM&&ddPPddSSffMMeeIIiiMMooUUvvZZxx\\\\GGPPZZKKHHWWQQ77UUWW22QQYY44NNVVAAVVYY``eebb}}uuoogg]]ccXXffbb[[UU[[VV@@ZZYY::__``AAmmYYAATTKKMMII7755<<99??;;::11BB5577%%EE--:: 66??))BB66==88779999<>DD>>>>7777..7700;;77555588;;55::33;;44::==>>BB>><<4455))88++));;,,YYKKZZTTVVLLhhSSddggHHxxlloojjMMGG==""$$((00@@jjXXmm\\llWWhhQQllSSss[[vv\\qqYYnnUU[[ggTTPPjj^^HHkkffFFccccAA``bbJJddcc^^``]]ff^^WWgg__WWdd``XXUURRMM::EEDD%%TTTT..ccee@@ooZZ??YYPPWWVV>>>>;;99885555..FF88::&&II00::1166!!;;..77224488::>>BB????88??66:://00$$77--FF??GGCC>>>>;;==88<<99;;@@==EE::??1155''<<11>>33[[OO@@66^^PPuu[[~~YYooKK.. 77117700??II&&11FFggVVuubbuu^^ooWWppXXtt^^rr\\ggRRnn\\ZZll]]VVkk__QQjjbbMMiiccMMiiddNNiiccSSiiccWW``YYOOooii]]ee__OOZZUUAANNII33HHDD++QQOO88XX>>--~~7711^^__aacc99::****9944==3366&&FF1188 ,,..::..BB;;==??>>>>;;77>>55<<11:://;;..==22>>77??88IIFFHHFFFFCCAA;;==1199&&::$$;;''55++33--<<55OOEE__TTaaSSjjXXDDOOMM44!!** ==HH((BBII**==GG%%((6633EEllXXxxccooWWvv^^{{eeppZZaaMMZZFFkk^^VVkk^^UUll``TTll``RRjjaaPPkkccPPkkccNNkkccLLvvppZZrrllVVffaaKKllggSS[[VVCC<<66&&@@::**SS;;//kk,,''7766\\\\``__<<::5511DD>>AA6644&&88'';;))BB33II>>KKCCCCAA@@==;;55??44==00;;..::,,::..::119911>>99>>88>>77<<00::))99##||<>::>>;;@@<>00%%kkGG99RRCCRRDDSSGG^^VVYYSSHHEEEEFFCCHH@@EE::==7766AA<>@@JJ11//<<""..== //@@ 22CC##UUddCCzzdd}}bbkkMM^^@@]]AA``HH]]EEjj``TTjj``TTjjbbUUjjbbUUjjccSSkkddTTkkddTTjjddTTmmggWWxxrrddaa[[OOYYUUIIzzvvmm}}ttUU;;**II))PP++aa66%%ss;;..LLCCRROO>>AA@@HHAALL??HH;;CC@@@@HH@@FF::AA2255((99--::--==..>>..==--;;//:://77--66--66,,66++{{77**ss88((ll77%%hh77((ee11&&ttBB;;VVMM``WW}}aaVVmm[[OOWWPP@@EEDD22::??++@@II44>>JJ4411??&&,,:: //==##HHUU99uu__||``eeEEXX}}::]]AAbbHH]]DDkkaaUUjjbbUUjjbbUUjjbbUUkkddTTjjddTTjjddTTkkeeWWee__QQaa]]QQ``\\QQܩWW>>((II33PP::%%88 qqEE::||kkmmEEMMFFQQJJVVIIQQEEFFAA;;BB55HH9933''88,,::,,;;..}}>>//||>>11||>>11}}==11}}::11||9900zz77..vv66,,ss77,,ll77))ff55''aa33&&XX,,##nnFF>>}}[[QQrrVVKKXXDD99BB66**22// '')),,33##::EE44AANN::..;;''))77 ,,::!!CCPP66}}jjtt[[__@@WWvv::bbFFffLLZZxxBBjjccSSiiccSSiiccSSjjddTTjjddVVjjddVVkkeeWWiieeYYnnjj__dd``WWssnnhhԣyy__PP;;GG<<**VVMM<<ӽrrvvSSZZ::@@88==>>==@@;;BB77JJ==55,,::00:://;;00{{;;//xx<<11vv>>11vv>>11rr99..pp77,,nn55,,ll66,,ll77//ii77..ee55++__33**RR--$$aaCC99jjOODDZZFF;;HH:://AA99..????33==AA33))11"",,99((55BB11,,99((00;;**..::&&??HH33vvdd~~OOSSpp::SSpp::aa}}JJbb~~NNPPll<>HHEEJJDD??55;;//::22>>66<<33;;22zz<<11vv<<11rr>>11qq??44hh88,,ee66,,dd55++ff77//hh9911ii::22ff7711^^66..ccEE;;^^HH;;PP>>22<<..##22**5533''5577,,--33''22<<11))55''00<<0022>>00==HH88//::))33<<++ssWWmmFFIIcc66MMgg::__xxNN^^ttNNFF__88hheeRRiiffSSiiffUUiiffUUhheeVVhhddXXjjff[[kkhh__aa^^WWrrqqll͸~~{{jjxxvviiʭrrjj;;22DD::NNDDFF;;@@88::44{{55--ww44,,||==44xx??44oo==22ee66,,cc99--__77--aa;;00hhBB99hh==66aa66//gg7733kkDD==yymmbbTTGG??33''9911$$::88,,4466++--33))..66++,,66--))55))**66,,..::..22<<1177??22@@FF::FFRR>>==PP22II__;;MMbbAAaavvWW]]ppTT66JJ//ggddQQiiffSSjjggVViiffWWhhddXXggeeYYiiff]]iiiiaakkjjeeĻ٩UUHH66**FF;;88//@@88II@@EE<>44ooEE99^^::..^^>>11XX:://VV66++^^<<33ooHHAAttIICCeeCC::rrffYYRRBB9933%%4422%%6688++1144))**11))**44++))55++''33))''33))++55,,//66..0088--88>>44>>FF7788GG00BBVV;;EEWW??YYkkUUTTeeRR..??,,ffeeQQggffRRiihhVVhhffWWggeeXXeeeeYYgggg]]hhhh``bbaa\\||}}wwij||mmMM>>KK@@uu??55pp77..ss::11nn7700rr@@77ll@@55__99,,\\??11[[AA22WW@@00SS<<,,XX>>11ddFF;;ooMMCCmmQQFFqqeeWWMMJJ994422##2233%%66::,,2288,,..55--..88//**55--''22**''11))))33**++22**))00((..33,,44<>qqII==__>>//__HH88UUDD22XXKK88``SS@@WWFF44GG44##\\BB33zzddVVaaZZHHEEFF444455%%5588''::>>0077==1155==2255??6600::22,,77//,,66..--77//,,33++))00((++00))//77,,//==,,66GG4422CC00CCTTBBFFTTGG,,::--ccddRReeffTTgghhXXhhii[[gggg[[eegg\\eeff^^ffgg__kkllddssvvmmýѯ{{UUJJggAA66__==11\\@@22]]LL88RRJJ33WWSS::]][[BBSSOO66EE==&&VVGG22ppccPP\\ZZEEIIKK66<<==++<>BB44;;AA5599AA6699CC::77AA9955??7744>>6655??7733::33..55..//44--22:://66EE2299KK55..@@**::KK88>>OO??**;;++bbccQQeeffTThhiiYYhhii[[ffhh[[eegg\\eeff^^ffgg__kknnee||ɺû~~\\PP``>>22``@@33ggPP@@WWHH33UUQQ88QQQQ77HHLL11PPPP44^^]]AAcc\\BBYYSS;;__]]HHPPRR==EEHH55AAEE44??CC4499??1177??4499AA66;;EE==99CC;;::DD<<;;EE==::AA::44;;4444992277??22IIXXEEII[[CC88JJ44??PP==BBSSAA11BB22 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/jdaa_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/jdaa_tmp.miff new file mode 100644 index 0000000000000000000000000000000000000000..3bdfa320869d12d71f642a885a8ce60dc44dde4f GIT binary patch literal 26037 zcmaI8XINY5xi##Zz+4FI-FOz);QCo+MkI|ug_WRGMf78`fS3iDycUMnOL*vAWogFfnKu}k| zc#%TU)+P`xTre=u(b3i2*uY98Zfxl5>&TAHO?`bLkwDno)YBu8l$E!(NF*JdB!-p?i(9|RljvU$ABFK*8$1h&gk{u^bY;Wu8YG|mb?d%vCDJ$#h zZf_eKtEiC4+uMeQnwt9h7cS6f`uY^g>Z*Z(kr9P*?wp~ag$0>BKW}PkVWF!#H)msG zYO1L@Kkw;Dqp7OS%*4hT7^tdFO_i0==~`OD!&0fSF`3-eH9c)^&R~eeD=SQ+4rn@9Y>GYirln&(AX$nwnzq*qE6a zfgqLk^jKNx=t!kvv85$}(9uy-gJ0a+%i)-qsHye!RaF@osi+JL)YLE-%E|)+JRTnR z_w#s$h9^!84Dk8*OZ)mH5^HNMEvdA%)x*QgjL*-_#qa6tWU=)0$mE3uGcz?cP0b4z zjEr!mHa7J1w6!%fwzjmjb#zo!FJ8peP*ufw#rfXZQCHW{ICA9jWfDnCOF?00M^{%_ z`Pi|`mu+onG&+4@Auf)^3J-5>Eh&kKDJiL_sH@A&Y;MlV%E^h2uCA`Ca&>ib3Jo0@ zvA1_}3JB=yOGrpgE-ET36ADG5zP|AAq@=X8qN2)5D=S-D7HeSO6JB(6H8uag@Is+z zX=!U;xbSJ!)5G7fwe{)m(ACw^QBm3623`~ux3`HzZS7;nwzq+{qer*51MOXL21qMS&i9`ZE)zyi_%}qHz*Vd?13WY>kTB6Ym4T;3FXN`;u z4GDyW1xrf<12wg?XWiU@lQU<6gDDhc<(ZlEbP7dPbz*|Up;8Hifq~9WI$ck%y?tiJ z%#2QNY+PTrwl*{4@vdIAwY9XYtbFjm+SUewja z6~B0qMADQUz=MYD*xAw1(a=y;-Q6V;as799b#w>>W#!#nZEbwc&JNxU{Ap>atE;Hs z|7&XEeMBPe3^`ti#GM@)O-&8>pwm@VwX_gdR8$bxXf$VMsMBI*!{(gOZ zP0gO3?rz|Wc-iK&42(o4mg~uDv2aM9*C)^C@y9)?d@G%PoC7)rcewF*4A`%s8kwldD+pC z#q#p%?>95Ev$M4w8`IXtoqO^muIHCuUb=+q3tR#RN=owUud4b_Txe^n$&S4}ph-n# ze_vBmS$15$OdzPKDJ$>oX=084N_m)m0M{T#s|-%*}zkvu7P0 z4Gff(=jQzUD3lW?W@nR<^!1gMCnq@^`E?r@Ff%hSXlXfn7Ws+K-`PQ&sjlAIva&KY z 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_idat_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_idat_tmp.miff new file mode 100644 index 0000000000000000000000000000000000000000..1ef75c0a74aee6c6d7b8a619c354941488941e17 GIT binary patch literal 26037 zcmZ6zXH-;&_ce?yF~-CiyMlBW7^e3^8(`?2q4(Z+sDNFFY=8Hiw}>8I zDlUjmW-PMxkCpy=96pLkNn%nI6yhU-<6`;o5q|yw!4dv`i=w2zRrxcLKgL)3Y4P4+ivqpF!@c<=B8^U?)208XpLSGCaJY9&vh+O$ zO^ZaNQWX>eWBmOi{-1xKO5c}$BcHH%|NrM*GF|#MiLod#C^$~~ex&r5Nk4>2rZDj_ z6!xOUi#Y4(bS*6*7T=n@rZx85!YnDHJ+=Xb5L2b$FP? zqDYUC5f+O|)zKLqW-w?pb@h=E8jV6xQW_bdQYq34Fgi*mlSrF3jg1kBIy&<5m`s2F=%Z9UTjcojXlTC=^@U=4NAK9UV8f(o%fmz`(LH zeSHEUJiNGAS64$LBBHcZC{$Mu53i`e>#(qj3V}dXH6)~_27hTlKx?b1DT!oh+1~Et zWGFq-)A4;mLL?FfgUQ^t&(M%SAQFd$baip1Mn@S8GFe+2*ONlg)Vz2RcSBS2(j_7h z*L!kOOG{f@UVdVNMkA4wl`mbQ)78}#6)#>iH|O#A`~wFfBPEicptQ8Syzub6JRhH` zs+5$Lme|;|w6L&}lIm)EdmEd8fCC3CEp2SPy!P#jj*g4V$=SNKzP_nx*RGI|*x1Cx zoSeKo6BBcDiKM$*hL_1nI-N*VRh^iS;bm-0hL_P%Hk(8ulSfAWJ2M#gJ1$<7{T(AC zbUKBip&`SIiVE;TCMzo9@6*vyQ1}lgQIdQ_+n9C&)jvse$08Wk` z_48x1)zuFlPD*04H8tz%%E~w#9i7NG5-BLCw$|8~N{xu9sLvBcr<7+S=aU-Mzb;O4ZU*RJ?YLLLm}WRIXj4(R6h1`{{HNNn88M6*?V} z;qqk~jVL`XU#3#ErN_hsg`%yksfpLP|CcXQC^|ao>X$E*$@rYhm+{l8s#mU%NLpGN z8dt91^R=}vUBbPfP%d2pUZ~Vdmv}q^0cSp6Q?sYp14mbqNGarkB^*vqna^Mw63fW=2LzN)I36e*N&n-Mb=@uI`EzV`IRVkbZIGrp`{fYTU<<|X==vB zm6fqr1VTbWO%0DnA|)g=HRS9lJ3HIjCM0-z@^~E1 z;GmI_rly9*g$ug6M530~@GysiD?2vEVBn5ixk9DldreKLs}qT``^I3Xt4~gn$y6$? zx9s{O-jK;!TDZ;>3WIU{xR)1jP+eVCR$ScL8XupOl#)_ZR8u1sTUy%NpEyA#v)Nqk zzyO89;qZ84W7gIZiHl2rzoDUpg}M3h<76_P-0p7N&&`{!UBmrVR-T>)4%F1HUd6Z6 z)SR4@;R4@>AU&q0fF=!%YuAWGb?I^KnvM>Epss%PDv_wEiJ#Nf*3eK@m7Vc-;C%vN zauT0LB27%-ub@&VCV*2ab#n4Q9O7yNcPy5s^tgN(_`%<+r>Ct=B#w+28Y0dO4*rK5 zp%9U=uTNhe_v6$lkqF2;al+b~%T-t3zu&`y%~n-yZ;y>-vDDS`^UKQc|AmF^*<)zP z<+{0@Kac!mU@$p}IJ0^4<;x}}1_mlBXU+(PY_>$QXAgs+qvPk--i{~6+q-ptiQ$-172* zg0!?PTM7%)({pmXrFD|8Z+knc6(uFyek4#41=<8##^z}70&z?oqqNaxU%HgP})Yr$x@_6d%2?^!p`uY?~NJwX=kr9Uz z7`S(@u`!=-ZM}Cd5GN9KcIxXhncm(F4Lly193Ea(h0KgN4xEI96cynd9i5fMVv)&7 zNm*Gu9-W?)l$|XUGMQ;fXmFx>}(?=9xpk$xY)|d&@d>dy*(hn#l^;E z&z{W8$VfN0-Md>`^Yde4Q&TfCf`Up*B@!<$Gqb&W1p={{%^n<7QK3+9edOhFU8bfq zH1Gr?j-xWTd|7tA5KoYYCMI}1S$^R0w6ziM84OkFF)E-3?+thUUa97vfy&)m3 ztxZkM%~4Uuj-5Sw_^`9{&Yj1P@7Uq$+SayzKi=QH`_!rK?tp;m>W+@`@|2X2kmTfm z0K^v=ZpqRExTH`J0scGVdm-Okx`h8vc1C`|_aqQBHK(Rz@dG$gSN{(e+ScD`kuDNi5N=4;#;ewhPlc}xU->;^IE7adlBnpLET4Q4@7LTW*GCXW%#$?LNA3W&g z#gKLcb#+^|pw8K{rL0USB$1+{5qF40)TerS6iQ$q&WIny#e6=Q92T~9EAmZ3LUA#k z`-Fu2eB`URxQq-Ahe}ONjg6&JH8pc{V`K3>ii#2v5KpqRQ&J2KIh^F=v@|m_UEQRl zk`gyJYwM7ZojVf~gM-7ujvcG3%g&CB+_h`>?&9Kvg!J^Ps>sN~LT~S+BsaGmJH%p7 zPgB!Fhcq<>0t#hdV8aG&ZRB}HMLe;Slj`a?Pfg+ZM*RT1pkJX-R8%%@ydtdwHg8_H z4)I)BdDEupX;C863pB zBvNlLgTdiwY30wp)6*joGc${dfSc6Rf&$dl2?>RT9F8o%05^$=g@s%$nVgc6oy}tD=oA%YX7YGc zYEe;23Wq}?m6RkTATH(R0xv99LPAcCt*xP9Vq#5=pP!>+a`N82Ted_*b#58GCy-Hw%lN zo{Wsr(k)xEvbJm~FHcR)%>_=Ale4l43tL(;rAJ;~V`F-Hc6LcgdwXtfR#r+%Sy@a> zMTNDspPz}zkt0kdgTdvFjYDEPqsm#pEO4JEiS=H633-a@;s>ozb&8=HYOHsk)gwQNWVB<4wY7;2;*4lyr3X_(&v~nFkL>MFj+i z#Yc~3WJE^l>YhH`(6D8TyZg?aWo1#)qo)V=F)psBr=lV^HzT8>A|W9@zM>*B(%v3f z!`7BYwv0y&mMR8;9v)b z`udod!ouk2`ufPoqN1p%nwr?yty`m_Dl5?gB_-9=;EF^?mz1QXRaPRZhKFZm`TN(` zi$u=OeEy+BK!?8m$Oxa$XX4i}eX_1DmwWJ_lM}wsfdf`nG#Z`W%}czu2L z_R7j6(!fAO1dXPvd-CMgt;WXI)^TwS4d&+7*8cv@&HDO=hRMmz&0us8k@VUK0}*%gJfS4nChqba&sg2mFnL1DGB*+s^LPDKJgm-h1|_s3uR zh^?);xt!eDv-bAZ)^c)_la7vdcHez>^QJ`N?7U>j?c3;M)~~;F$6Lw*Dl6Z(;q9H8 zN+3*3xVfdKYHJSK!4Z$|_^~vJM;2{1#C8ePuJ3AvI2BW{<))xI~Z!h`-8tw35Yirbx2M=0V@%d~v z&P?fX^r)?^jt=na>Wa#*zdtxwQK(fTmYk(m^eM{?(XEYdGq9? zv$KQ4!iB@b=H}oFXJ*XIEG-u;x_g(!5(?+cdHIsXGBJ^pd-qN#bacd7B=Yf*lY8^V z*f=y)PVVJPu{b71PVVVbOUuMWIl24yZEcg1um(4CKj*bToAYOWUc6HHcs;Z8TKsbS5XLs@>IteSQfdRa)t2;FXzK=@%?Kf0Ht5-jM zjClFocaI+7ym;~b`@qqrO{n-#%TG+`>m#R6OqiJog&fYcYj$=fCi3#PZaF(!ThEzu z>ES8PU!~}Q_F89$R9?!sF#fmp?z?aRN_x`=EuD$)-x$oW?7`VI3$-RDU zXz1@hXU>ZkCMF>v^XI>OX=N21J#XH#XA((5!gt@jejOH;lQVbj)KqXVaCG>vuWvvA zg;HJZf%K$t%8Ee%KZG4l;q@`oTQ|!TNw-@kBc=)ipyPKPz-_D(>sVONX zB^enhDM?8c6*)OhP7+CYcxNZ_n6>q(Q@{tJH>y-R{o+L`75(Vg7*qxV0sJ@mSkx`1 zrb6M-qsV(K)`0_vF522>&gkl*@*f%!iwT6ynt7}IG?xTlCR~L9aQ`5tT(TTHIz>SWMu`&1+6%||C6DK$vb#-&|bLTi5^jPSu zG&H!}sVN2nndk0ZTp93s_`IKgzIPAI(UK)#22@qiF@i5sQMq(US69Y(n49zY=mhQU zMIvQo@H@J?n>V8pq)=F_zCLu8Ha4T9_{*)WpFYJCsHyq-wTX$9)#AnP-kF+8Bnub5 zeQRds;W1~S`=zP>nHSOf>l$-RGXXBQQPxZ~my7dL0lqemVd(b03}+`Jha922v6 z@$hg|RCM(E_2}Dud=e5~y_%dH8v6O?S?TfNgPh#+=ik1)e2MrqJNx;woZP2RvhzRx z%+CJ(H(vks*YCf}$vu4d?Ae0{KmBy}?7#pxspH2_pFVmN+6kS`;S3Gos_W>WF4fV& zU(aArso?by#nsdX2Sp+>9;orc!cbFIR$5rt+6D!o&gS#Q;&bN&0)2gv2)qiO%Dz56 zpTnWk&z?n8p;AXi?CtT~4h;ncip2s!Z*N>2D&bS7l9SQLw6>O)8ymA&p`kT3(0!bo zT3gY9gWtewE32bN4GhR+UENcs^z^_CoIMNvMOzz8Dq<=sW-zJa<0d9h!e(ZSjhRdZ zgcN_wY4u?U@}!y&4fGdI6*fleorjf^f|=JC)wOidXY>gs}l5Q~kB)YNX@ zM%}f1`GW^mR?g1z=f8MiYwPX({rB(QIXZ@f%$@t`6Q09)^M3!`%`Gx=;lig+C6a)E zxpVK|_w@}8#rKPfijS9*>*;Zk9-5kW@9x>Nd-tYIK+Bsqa&n(PfBg9N?Yw!PKmYR& z;>lls{r&fsFLUO6k{%yF%E^6{9`D}+hmRls_S-MNynOlU)zha-mp*>{+6HB?CV4HML!GG26`c$Z&|&qr>CWL>XfOev9Yf1o;_w}rl!be?(Qxw$;llZ z_4PG1gM*Qg{rzXpe)(c=KRDRmKRat`dgjdO)1N;Z8Fh7aci*`qk))=kr|;R5k>T#{ z;gOcs*l2An7CSrd+XppKAQ&ArH3fq?G!!0gWF!{v+t=J26ciYkoP6w9TwGL?gTs*{ z!NFc$BGK;M5{aoPliA&EX2xcln|E|TuW@wTxs%UVQ!_V5Wlkaq1S2EpoCt)mG4#iq zHcd@|&rnvrecRZW&0e?e;zck!Yu8@ADiWd7MqR>UZP@VO0V?qye|+);ad7_p$B%)V z1q)=j*|6dIb;KbO>FQN# zx8EK-Sg-(D=kLGg&6}P5_HA|+umAn`+qXG$e*gX5ySH!UBEQbzWd{k4070;hXpR;Mxz<|C! z-tX%(F@er<_%Py&lhfY4PENMADJeZYg@xJKeSN8^d-im8e)xcTVb7j#->j^T965Y= zcGkjT|Nesq|Nh(2vAMam^}z#Q-8#JakQimh9nog*SzTT4sDVh@j$ z6nt_>2#t2-iobtc+|s2}Q||5o0Z_or%q%Rx%%JmLyY}2UChNW6U;(T7fd_DrVu zzI%sHpEKv(J9Kyp7ruCbeqCAl!2@J+1%(F>pnNV}dhsIaWiVxkC#tG<@1l?1uwiBf z*9%HADmfjU8#hQK#8xOMRH}i&)vE>u=m1AX&@mbqjExx>=<2dqzy6B9lT3c|Mk4X> zSiAP?R}YWi;5l>t`Nz!-@#K#`Boc3L-0z5p`1qfHe)Y=NH!u+S3|!8#W#DXGUBkmu zQiMVSgI&8GJsKPw9hH~={Q323SseNB;m<$k&IMj(XXWI+ef#p|k3UeyeEj(C9rD%7 zm(QLpU;f7*@87?9vtYs3uRzTF`L3?eXM1{_ozV^M+66t6!9f3tD0%d#i3yLVs(R`a zSOo&1x7XAZedduPh%=U!d-qyf+t`4m%+AiuJ#k{omM-b>?wy<4&Ye9yfB)_3+SAk3 z_0K=9uDf@4cYpor>bie_PtW`JHZ}tTyLLT%=;?X&YE8}Y;~pNPqft?Xg(A_}vrbOo z;mG%vmfqe=m!h((^DJ2bX*6mZGAv zGMoM633x>^`Q1A>HZ(NeyaB$}uYdX!I9j#px8HF0k*}Z+EL=D=q@@L>=jv5NXd3PL zb2~c=3su!ekHlhQV-=OVcad=w6z<(a9A&YtUL}#}bb;X9IVik_hR2U13YwUlI)&F} zW-{Cu8a{t6kscd2e)|>>5E{C0;p}WsP*~UxKg`bh`2_``E{TgvOkBSF`SYNl;Nbc5 z|NOI}qO43#uCFgHE;>3fF(81=W-$8to;eV-IqVI*G1%4HED(^EP^8X22F zxOEF1C5bdP2EB{PynY?=h{1UDNGfI;C@VjCVr*<=w0iZkXBHN~_q}`IYZMjx`@x8# z{)JP-#N_N*_$aKcckYCKXlHl)ICx@f>&ZzQ8xs>E@$=`XsF08)OJ2VQepape^2JYj z{QUFZf5%FX1q+@$LB0mB6B`>8^!@iuO_7nFo?EvjB%lx8x%2(|7cXwz0>1wJ7xgTv zTf`C6w+|m~+&D9H|NhVrhx6b8D&&nDzkZ#aeg1sz-1qOle7S%B#~<(CfAZwYm7jj{ z@UXNL3OhT!y{)W7qOLA~e{?8#t*2*bxO1nsH<*;JE^lvRW8ecSDuuFhr?ghE3@Ik`J`Oie8;R;>cRU~Ro@*_A7Z&q_-D{own>VmLx5 z6gC@5Br?L)tI&bb;emJ6*S~yOQ&UMvPfwR%wfnfc5Fsee~>eW+I zV6>rpK=~62p^zbRT)&P!f5Qfu61Q&MCnT#*JfuA42+K-JV>Kmx->R+>==PCEIsz`x3=!?K6to$Pp+z_wS!MvuxS)^yA0p&nqfgSxF>ZZfB>B zje`T?jJ>_3rM~`-9S#o0#sWcix3e?q!mciNcS}n)yR*~9#onGq+rHi2-ob%R-@YAP zAfJz)N51Utc5tw_kB!~FJs}|=puWDUs;Mb4@xXzkq<#C6lJ@TP^E-SvBBHj|-hS6E zvDnYg)bzpy4hInnbq22g{rhlaz`tZ=Wofx;)#xZXCSBd$UOdgt&O<}M3*tF=W<|y6 zY53?+cLGl$5u6ihYFzHj3=~iXLl#d|R9?Mev1qhq%ig{PGr3{In>WxcmMwe#os_OOYh&zgkQ08=`PK4oM)Ja?}oIZ3qk9YgFr6u}p zFkXm9IP2)hly@zu^XL3|yw=r~;l|wj!GoY6clR}GW@j@qQ&WNS6zPHbBQY^EQ%>&I zEjv3G7dg4!USD4~x9`5g9q{*0OG`>hPIhr=Xo!m|EcEx!$$@4R7}(mHoSd8M=hxJf zm)Fz;uD7BBiaC52`}gPO#>CXuA3RuC7#g}~Pk(M3E*$Gz@33zaKT_~-|pZbk%&aww@W0B zj!sVP?e_M@#@^oT?a|Q=4rytvt=qPRhu7EVXwl#x>U=r5 z>1hK4Yim5Oe7=zp>P#yK9 zRh|zph{Z{yh{c;DbV;(SG{r#S7%21q+aWfS0FFQRSi! z5eh}3@4ox?&Cbr={`>F$_`}Z5#%9i(hYyX74Gfkog98!H$lhKR6?u7MV;KWMrQW@Z z%5LMv+qcm_z)66nNTcp(P|clX7M z@myM3u32;ax~{IFp|UcZ!b~O@Wg?M4aCGeLg+I#7Y;aKKm+bF{?*%-&krA5>odtdH zs#SOHpeokZmer$LS}$Ip`dqQ%<45q;3m5+WJ6PL!^Ip7wBS22>@nh(fKm2g#4s?cP z%ig@v*EcaiymxZK^ZN0lxw)m~&p+R|f&4_H4GgHMDJgk)oII(Zuzr0~()sfwlA4;W zE&3dI8lfY=;Rgq+wl;$SMG!pU#fx-0fna7fJ`S`A1P>nq-7AX?(J3i1Tx{8rm)F&Wnlme_yE`TZ`t*SVDJf8p zcJ7Re%gV~h>FJ4&Pfo6>Idv*O-`BUY^7!$boZw(HGgnu{2@4B2NVjiCUgB`JZ+CRG zw-*X=wzA^!wr|I`Wis2_ZEeAKARi%b?b_w#<>uz<+S(ct;^PAsNm!VROH52vRZ&rB zXkK1<`M!ObnYFcBwhRpw6;)RU1WZmA73Jg@8C|>xKiBHjSFhqZo;w$HteM$QKY=GT zFhG9II0Wb$c|4(T(V|bEI2@sH?b>_yz*lbC1cxD=zIn5(e^F3){v7p` zsw(mll&)L1;J=~M@85@yT3cHdZwQ3@_bn_$B0BxvJsTTi<5jDsr_Id;0u_~s3E-DN zn3*v$;&L}{Mm~d%@bICY9-F;r(c8C1MtnZ-+%w=75@Ik ziw6f0U*WJfHiiZ_JG*r&@bdX{c=(nr=zs0(!otA6h{fLCa&o(ObGiEZK0cY5CMIn5 zp+iMQm6h;e!SUkh31?PIiyK$#v=iJ=1wC?VRh}_(qoV|PF;@|_@ zwF`_+SXgznn_G1?>Jbj7z1_vd)|Sg{Z};@Hwbj#WZ};}LvC-FWZ+CY$H^*5b5sM8C z+uGdSZKTJJ9e#f9?r6y)U8)MRJpJwbhNLpg~jR94h}XpY&IODR#r=vT)KqFwR-i13#cbG zHPJs%DB!v9{E9?3Z(3S{*`1yS&mj=N5uvH6qH^N~c$oF;@7>eaXD~Kxx_uk{()#uH z?<0RKS@QNRbo3=lzJ4__GB*DC=g*(TVl%T}etGo@ivP-$&}HoGR;&OYZ)2mW`SdB5 zYhdupFHfF8S6jLA>sPVZ%Ic?|WPL31L1-xW`KM29Y)nnpteKes?+qs$>OCc;%a@_M z!6At_2ptLeX5Ktmy^Xj^CabBfS@ZNMnXI6osEB$>S$WBl-+xE{Hh(_)cjXw3nIdeXK^!HCn`u_VDFKlc=LgeJ8ro>`*_aA@E&xgNp$Bu{yK3_}g z$dQ7AvNAuvty|;bnwmU4b93Y3wr}_Hs*t)Q(8H9L#>Td_d3hBSL`F6@dwAsMgAoZ1 zE-VCIqM|Y~;^MY#^YzWh@bxVzv9)b#^768iGtEWxK7A!!#p-_JK;kVzQ+d`os5I7toquJT8u#Aj(^IpDmbAw(zHDzfDUiZQUM@L^@ zfgmahzKekYi3I$7UtdZ}TAHnGeSKV9Wu=o-ak0ODRh5NBeZ7lINr{0$Rh0}s@MzW5 zIXa@3YHW0Mt*#CXEHAgQ*|yEdC?bMHg73xKTS@8oac^(%8PI{CpLTZ#2ExbD-tOar z%4FL%;Kk0atqt=C@$rp~Sy>4Q4Gr**#l>}Y78iR+4{$9B2`MSPz17uiZ98^6d>9zm z*Vo^V9B}ES}FWQL%HUr>C`b zK)}pQdU{OEh7EV`#>9Z}7aWktiwX+2Z-Y-1#!j94Dk+G0aF&oj(K>PnHd`+ z-#9qf+P1YtM0k6Lgfun9$A^YuZYerCG_=0Hq$D^vCKYmG_O7X^s@lCfBqTmQBqS!LygVrhe);X& z3ku-u&&fG?GAzu^&Di+%?d0UJuoWvleM(A-hybtT=jZCWbm`0te2@$Vcnv! zcIy_{3{B1J*P#xRNa$OEtP2<5y99rOyujfM3_w5P^M{7O-*7m?!|;0w1kayC=TlXE z@&uD{+S<2oYifd_dHa@16$nmNUclUZ3A^^>BalG3lgayZJ$;D^Ak zFI|c{iNk^JsI3jh@wacr#vUHam;d#bg9CWE>1jJVyc!^7|qVQvCy z?TQtnqu$>5*Zuqb{lmjKoaSbG`{ZOA4SA%xS}bm92@S2Pva+hK4wX9Effs-O!a@_1 zmKHa+j0~Z$rNz}XJzXGZZ1nQV$uTh4whdRGLKz>2Uc}=K4Z#HjUz@G1ot>H4u3ccC zBO@Cc{QUz1w`{4dc5-rdE-J#jhNovoM`veRT59UVM1FojL2mBt+u-Gji+}w!HWnFh zcsMaJJ3Br7(4oY{va*7Lg9l?`Fr(1k4h(pC!DSyA37^Q09dU8S#w1dC`HmgPj3m<7wQI`C1cHVJbO9#w zyYF7T!ekEWN_^^q1<#&QC`{&@InW`QOgX8}$K`T3OO_z-uvp;#p|e9@LcP6m<&!7y zRsH<)qesBY#*OI5)Yajb2VUUd$NT~&z>JOIkeHg{^O;Nn;pR;(E%4W~v(C;@QFG>C z4imnZ;bBL|fPi`P0t4}TYHBuaT(f5We0+Ph)Ri+i>Eja+0G{LU;hvt{Tu;xuyxd&m z8+hp~Ejv2={L0HsOsc9d0bylTULF=!UT$GgQxhCqRAgdOSLf@SlcTTS)FeAMHUVn_HVogt@=TKK49%eEP4KYvXo^EZ;W;Zu?c48{W#%5|NI@;TN#fn$2P}eM8{OA$< zvEacl55{1~aKdEXyosx+p#h#(O-)l16SZ1e&==sxh2usff*uWLFhx51fLsU<4&n{& zID9DZp3C$db@kh~5p_^M6NzNZmci+8z%jbiCdHIsbgiatkFIt2;hsj*B zbc4jf|X}N*2>g?@HOG84+$}BA_DuRPcN=!}v z4;P3tMn+9dGW;|)hJ=)snwizqz`c)oAQB0Ab$VJw1?Zoc(9(iFJv3x$>gp;MA30)U z<1IaQ?vxI0OJ{^DE9>eS8?Rgm58t+}q2c!Ju&|<{jEoBx($kBJ)68OKZW2>vf!|m-|T()n|&PILG*of*%U%$4ttIN(#BuY#i z9(HrHvRb=#YRbwAbE~7HU{%m>Af6~I-@J+W5gAXfs=8?t_!>n;CKLWOH8nVq;RpwA z3=L%t4e(-oet$pwPh9SW3t;)-+=BasM7nVUeoy#Mpc}1ObN4RXl|TP1tBY5x`0&9( zI_I}y#ryX#6fRx*?j0Pe$TM_0>Xm2D;9OTw0B$&(jT>dSL0!w29>^>3Ys%^z^iQa# zNF<>U4th;Zk?7PZ;9Ml?=>fVeEsq|B-(4(z{MgeIzRc-qXJ-$OxpNO5w6=!lJ17YH z$I+w8%BYf2g~7dW>{v<)IF01w-rfrrwr__oxuGE`DJsg<)yauWK6=#KJ2@HCxWU1d zl@1PIIJRyzH*aqC_b)0Ei<_DP0*Z=^jS*+c%FN8_>LMens;sRW8>6G^>g?>w%i*H~ z`v~_fi`Cyxr}OzLDuaVeCfMq}J|iPXM=tls5x7(=EqCvBcSj!w9=V`k|Nhj}+S-bW z;o*n~^wC{inVCsRKx|=QZf;^CrY$lvF~Oamk2=WJwX)LR-^t0|9{Cdba(#VKk)54b zTwB}Nh`v2Dv$a)Mm%(sxfumekS50kf40_Fm4I?AyDxpJycTrbI-ofNGCY03F)YZ?N zVX@@pjf{GGIh@U#O-+$+;NX|>AZyl4PGWAz++60v6^X80Lp{l2-ME40T|)yrAD4?d z8~pw+zsTleSFMtrfBf;m1Ne|vt$Osx&=8U8;X~wa6&3Joa0tD4fw%Bo=5HLR*SIOy-6kzsA!(BSL4b*qg{ZLPn5aj~UkYb#!h#Wghn0i~s;rq$Jv zk-$eqMSOfqi?ef8RbpamtE+2Kk+ZXjiM2KKLUVHylU=(U9l`JJ+GS@4zIWFyxV&hz z9Xl*693A!a+S(i(TwJ`o(3AW6rlnO?#m7fR*4Dx~?CzeCQC^O@sDOZu4qsmv7YB!) z9yd2fM_t{H4tIBngu`iU^zrfV(9^4|jEZt{($lN0t*^JYH#192+`AWZ%(k{&UATWX zHhA99!HkW;=K`NBRJzU5$zAMcP*(?Ehl#k+Q4Vp87Bj7o*q!`|M&psC5#)!f|MyPzN_ z$j%P4NdW=iI~p4g94IdK@kvaqtVERe^NWnMusC>7S65FD?mlo+-+vEvg2!9C_QHjb zki0yJ1o@@1(#;LAsHVozv9>li7;&VkDnz3jq7m4}CkNmEluNMN9mQFF78kFT$u9(Wpb*bNPSe!jjQ z9`*H@-^M(yhli6>U|>Uorza{M)X@@&gF{=JogF4a_U{KPsiJb^2>4CMMw3!MGv5fUy8ChRGmI7=W3=<_Z!C zkr}8mFxb5t-D^Q6FQ|!KqW|r)+Ka?1Ar6A~|sa{JyE_l`AGD;N@=JLcCeF?A|@}<3If*<9%1I zymt?GX5G4*H-RI0dF%&4#D*^u3gm$ULLvC-mKFv>O)Vq@b1YrKdMH zqmRnUI&eTDRal&z3k$&~g@ja8`1)E~M@8l3#mBq41_w7bwzj6HM@PH3L_}bIcKv!C zoyCi9-bDAddNuZ@P^rk`B9W1isw%RzzP`Nt@Ni&YW~QSfX5(sWeSE;5wYGYBm6u0F zH8n{j<>lewO-)Wt6%{ctZEe6wbTr~hVPSA^U7d|hTU%HdI`sN_oY9|$hI)G1*wod5 z-?y-+s|yYWgI8Z49PH<3X^Fh%>uYBRJo@@NIblxQ+1bhpc@FdAb#?y!o}TE-5M2X;?;aTN^78f;i?3hz@$vUxy7csE%(XC? zy}eq}d2t>OJSiqluU*5WJvOAUSZZq67$Fv;A~|^yti7S(u3cJMt5!us?B5UfWoRgT z5JaM(Au>Gj2lQs45V|3UgNotkQRvTxhSltSpJ7zCKAho963VR1_XwTkGV6II?30aFd$a(-Rn&pAVe4yJu(n_>`AhT5j9s z;!;omem^wS!$XD>4-W^2y1KA1d_UP4aVaFk+uPc@wiarSwRKGm&cF@M=H@ju2?>~p zs;P;I2@7*{ME>*kHZ!ZP4hstmw6m+JadmZcG%)Du;_)!Aar!h|{D=;Ac6ffr#)5({ zS9Sh8_FpiW!NCIqU;x*yy?))>+s9|gl7RtKR+z+vzRYCax@Ba9Csf9ZVSWp79TNtq z8_DDg7cdWPVKFv_=hE1CY6^9bvhvIf?&~kVKxe|_tL$?&$dV1>XZ{H5hKt~5p0q_IYAD<5w z8jWUTq@XY|5)!gy3+``5Mtwcz*Ps))yO)=P=k@R?Elo_^zTMLkGir^E_ko{;HJ7dBn0uMx*Bc^ zu^4qWcoV$#@Gvz6&y4K@RaJ2JI6BtXLtWr-cI|>Ygu#HXQ#P-Xo$csoVUd~&<`J7w zdV9me0|UVaCnQ8iFI+e>;^bs!w|VoqbC|zEJb`~pOY7DxJv~&q&!58?3V$UW80*)+ zevPxdyv&cXX3c{KsEgoR0S~!u-O!Lgs{c}{d-gyl_VQ|IfO{rB9{AAF!5$8Luk`f% zeCQ0&`;ncX-@><-mse4NpUcaus{=oqo7>U?cS~||TN{a_p%E3;+KRpf6JBI8_Cb`C zP^l^^85!BxP%|?#!Imm0mZVuMs$o2{*zo1Wg8GgK;`4$SN5>th}e9-2*? z5MM;1&6`I?(4AUYwYO(yH#UZb78InWwzVOKL`S!@I61-bQd5KY;OAFXW^TS?hmTKj zu~>|{1N}90<^RJ8>K++hfD>&ou&Az1OpJ-~ z^pxSq-oCut$H&dh+`POT`N_@>eZ8L_@ao~=BHd=u-j0}|rq76*}Hz-$Osc4=vPqrKYy;LhxxEak2oAX zJ?M?7H#cqs--`a~)-7{$k!a&aY?8qwP)`r^9v`3TYUG2AjN)R%kBp3h0>qQV#JoJz zq2QHpPEXIvli{bZ5I>ibQ(TO>>YSX?QuwoSb1N#qzvbpuRsuKpci<&2FDHjaQ&GWv zfljn_YiumK>C)2ZXw08fR76MP_g7b^rXund73JlDXF_j@&L%W8Ki|*K#U(5(Jso>M z^7A7jeSFXrczWVF-M!n|+RjcOIDA-F*VL3O-H)K710G~#1fCmYMc@T{z95t2mt%h-tOmDP$1)ZOG`aG^78ccySi{TG;D8&76~3k_8R)(fAK_?hfucw zC$cl*4e}=H8b3dKd*BD>ni|9xoDmJ2oG_~$6XWMsU5&2U%Brf$SvvhG7B@Dgq$DJS zhnJLecXxC&HoCd(-@j{DSC^R?c;2|U>}>24Lzjc-`O7btE?HS=X{}v5IEeils;cMD zM@J)XZQov7i~H^3f(b|H$0ts}O|Pno{9P>w@ot%?j|pWn}?J+S<9f`T5XA^Yioaz{?j(rzL=cq9Wi#Q?s}@J|6sYSy@;Z z=9S9n+# z7GK}oT<|carfqG|iLm|3-90PIzyN)AL4jD@+Untvoeh7kERG=m04K6K*TDgJkiC}S z1Mkc5@*hq@L&2m}S0jGd*Z?PRI@Hv_4+B3Je4}vxO-_!F4-Jt>fByOV?{D8?{^6g0 z{`w1Zo{t{gx%1o zq@O2__&@PHdAoHCQkXihw#K{wn0RbFOh~A#^zf*x^zzEcFf`n=$H^%nfy;&0Av4q1 z7*mpYdFJNr?U?q*9EmJ`p#MP}`Mq{*w}~&>`CkI@9V>k1I#Ua{R*GJztXv=|2u#C_URM+>0iD)d^kP*%P*K4NKW?g z@$!Nn7;`MxV+dUy{-c8jckga!C@Jyw{`1cpH>RfGLz$kwc5T6e-d?zQG&Bw$wzG3~ z76|t4<#M4|qyNQZG&ToHozI;Dtnj zR~GRkSL#$mpOcf5kO17E{=hjeFD3?g4E-o@QBxBUf%t-c0iTP$6LSf;uD}uE3F1y& zou?=KrLC>Dw%7xQc?|e_z<*#5RZ)?P3w&0XS4SKJi-g~E|5=6?=-t3eW1|co=&ym3>S~-_ zT&k*2m$S9a3}i(W3_sV!MQFUT*2qzyJRF^~;w93;z8V^Dhe){PowT zPjBCT|2^Uj<}^QkeDGjm0uDz+-qKR^qADtVea+2{jZniseR}`?*|WuqF(vc8?oZ7eJj0|72EHMh5hyEa|?S|8OEZOSkSy;|g?o%s&61qH$92VM)mr>+j~lgV{;9v=7>=s!dvF1NlOtQVJCS!r#J?=>=lY^bDk zMY<Fdrr7RqHb9v+E_R#rVdo}TgX=%>YEA0H0q%$cAd ze}DLCaGz!IB_IHMW$+qj{5#@{tX@T43J7p@MZFso!YL_`@k6-9pWMO*1{)*Js8-Sa{M@-4`t!(Sz}{2 zH$MOHVN+9gccJj)Ne>TX#GN}`T_YlFZ96)cOfxebo$>L&KtDeloBzWLcwOKFcyV(2 z4=3o=5myk00s^poHduOidxO^pP8u4Zm!oUEc5Q0v$`$z7W%K@j|NYND*aPs#AAkP& z;ltdyuV24;^Zfa`bxJzb#oZK7Qjyf4`R2!GlMSq8=WQ9w$#y zC_usc_sBo8xx9b>{qhC*?XSN+f5x2n=g)us`SBy>@4kJL#hY*6Wb;@bKR$jufBv;= zyLL4;vRGABPEH~b7)xwyg;H;3hK(_qnaC4?fw{Txy=7*Wlz^`(FVD}1zZN+X-8Xby z)Uy>85fO+#wY3ou*e3yh5%5x0=IM#JgE)&k1`Z5yrlG;h3%VirRPZW|jqq*g>$kK7 z2I}j>2aDN_fPlse1&la@x_n{+8nz4?yc>najmKU{rP3%!Iuy&dvq~ zCr)6N*2xKqWpJ>aT~`;CDiUGqL_mPQKkx!QLKbI&f@JXoc&V!cP9zfWw!lkmZJ_jU zcdxDvk{(`OsNekky}at{Q&Lh>u~lPc=Ee=ogaR*Lzs{NS<;!3H+Yj;K!>3P}!+rhw z-Mi<{F*o@5@vU2H)?B;x`t{7rFTaeAK7RcF)pT|tO}1eiZzWPeSSJP@mlezsoh?UV zBPBz<N7>W#&E#7A8RvM0C(mWHl_T&A^;Li!*Pb&{jZaOIQKHWi0^{B?%lhWFH_gMf4{jIcglkYLMQj`H8nvTu~?{E zA3SKYiF03fcS8g5==E!(5l*Jv-rla!l$Sqy*49=n`Au0{T54;VoS@G!HpX-$`3STR z_=Z#kh(Q6`T1}!yx!K<3m52Dq8I9P zCX>N{J`4t_1FxGS8dI z%*}~m10dM(aGv+G)kO7ALK=-D3O4V5{=Hx5Qoy~Kmfh1t#MuE&42vZu)*W` z@BzkHM~BIz)15tg{W`wjJ9qSYo?ENcY!-Qk@C|f!-nhZ}#bUX7mHUpLh&-762jBUV zC-wF4L%O;e8!IcJMi8}+9<^E<8aTH&92yONZkMZBnj7Wy&70I~J32TeK)-{_#QB&h zy4|~}uPK#zd33+XL*NUFyao!GLP0l;IpC3zf&z3+eoMYIHbz`QKXN&`@<@DJd^X>| zuj@rFr=IBXFcXUI@OH@M0|Ujy@J$8=sM8b`F;#l{ba^>k6(;H(j{WcHm7rV7%B+* zh{cF6=`@@Ocr@e};czTAGqY{m(9p!h$BzdNynXxmv%^tR;_=MSPfq6Kz&Rq0@b~Bf zJ#Zc3gorEgIQ)rB2F`#?mQ031|Nimw|D-RWn^Y<*E0uzSlby|PvkxW`tE=S6TvzN@ zB5&edL>vnSfBj-UZG7D6+_lT+v)jA7A!gRpoH)Tbhxmj4hx0S^Lhc{+PxSHPMSVS7 z_?{lz$SM_-r}}#8^PKMv9qRAr^qwd2w9rpsVP9W+JJ0W<_y-LYd&pB_I>{p9_7 zrd8-}F!e&03_cF}5T`yklJ=%uR*osg%j>qW0O z8u5z@y|AJe`b6mE@nfMAtCidZW|ha|_q*LnCHEx~*}63xjz(u^H*XGwB9ZCo9XtN~ znVIo=A%(cz(8_vyhlc1SPfji_PE9dKE_9MeWHRyi#*OK8EC$zx?~4702!j4XA-EJ` zUm}hyEfI&p;b4&bmwjnrfqg2Sjzl&|d>wSMWlJy^j|T!W+3f7%;_u(+D;8s}oa+eP z@Og=Y-@dtAxw(+CwAzOc^?G!|WDGuYyWMPNuI1%Rcm=onKSr0cpBAedcMp7a&Fb>sPEU*P^Y!qD=I20i;Lg9QLDL+ke%?4 zGL1#ojJP7=OGybn4VSC56t1Gs4}My7bmR!G<%){ZQvQzr*8#7XJPaM7pV3kBU(Vx| nm9^6UG3e{Vm&Z!aO(F4jN=un*?eB+z+4FI-FOz);QCo+MkI|ug_WRGMf78`fS3iDycUMnOL*vAWogFfnKu}k| zc#%TU)+P`xTre=u(b3i2*uY98Zfxl5>&TAHO?`bLkwDno)YBu8l$E!(NF*JdB!-p?i(9|RljvU$ABFK*8$1h&gk{u^bY;Wu8YG|mb?d%vCDJ$#h zZf_eKtEiC4+uMeQnwt9h7cS6f`uY^g>Z*Z(kr9P*?wp~ag$0>BKW}PkVWF!#H)msG zYO1L@Kkw;Dqp7OS%*4hT7^tdFO_i0==~`OD!&0fSF`3-eH9c)^&R~eeD=SQ+4rn@9Y>GYirln&(AX$nwnzq*qE6a zfgqLk^jKNx=t!kvv85$}(9uy-gJ0a+%i)-qsHye!RaF@osi+JL)YLE-%E|)+JRTnR z_w#s$h9^!84Dk8*OZ)mH5^HNMEvdA%)x*QgjL*-_#qa6tWU=)0$mE3uGcz?cP0b4z zjEr!mHa7J1w6!%fwzjmjb#zo!FJ8peP*ufw#rfXZQCHW{ICA9jWfDnCOF?00M^{%_ z`Pi|`mu+onG&+4@Auf)^3J-5>Eh&kKDJiL_sH@A&Y;MlV%E^h2uCA`Ca&>ib3Jo0@ zvA1_}3JB=yOGrpgE-ET36ADG5zP|AAq@=X8qN2)5D=S-D7HeSO6JB(6H8uag@Is+z zX=!U;xbSJ!)5G7fwe{)m(ACw^QBm3623`~ux3`HzZS7;nwzq+{qer*51MOXL21qMS&i9`ZE)zyi_%}qHz*Vd?13WY>kTB6Ym4T;3FXN`;u z4GDyW1xrf<12wg?XWiU@lQU<6gDDhc<(ZlEbP7dPbz*|Up;8Hifq~9WI$ck%y?tiJ z%#2QNY+PTrwl*{4@vdIAwY9XYtbFjm+SUewja z6~B0qMADQUz=MYD*xAw1(a=y;-Q6V;as799b#w>>W#!#nZEbwc&JNxU{Ap>atE;Hs z|7&XEeMBPe3^`ti#GM@)O-&8>pwm@VwX_gdR8$bxXf$VMsMBI*!{(gOZ zP0gO3?rz|Wc-iK&42(o4mg~uDv2aM9*C)^C@y9)?d@G%PoC7)rcewF*4A`%s8kwldD+pC z#q#p%?>95Ev$M4w8`IXtoqO^muIHCuUb=+q3tR#RN=owUud4b_Txe^n$&S4}ph-n# ze_vBmS$15$OdzPKDJ$>oX=084N_m)m0M{T#s|-%*}zkvu7P0 z4Gff(=jQzUD3lW?W@nR<^!1gMCnq@^`E?r@Ff%hSXlXfn7Ws+K-`PQ&sjlAIva&KY z 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_tmp.miff new file mode 100644 index 0000000..ec9c873 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_tmp.miff @@ -0,0 +1,11 @@ +id=ImageMagick version=1.0 +class=DirectClass matte=False +columns=70 rows=46 depth=16 +Resolution=72x72 units=undefined +page=70x46+0+0 +rendering-intent=perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:55,,##66--&&77//,,9911//;;2255;;22338822228833//6644((4422##3322 1100..//////##0000&&55--++@@((55AA))77>>..88<<8899;;@@99>>FF77CCFF55KKCC..YY<<**nn;;**==00AA77EE??IICCMMIIMMGGJJ>>EE88AA11??..DD//HH22GG//AA))BB++@@))??((@@))>>&&@@((JJ00WWDD~~MMIIXX6677DD++..@@00006611--1122**2255**..22##,,--4400$$55((""LL<<==ooXXhhmmzz}}llTTQQffNNQQ``qqttsswwHHLLXX55,,##55..&&77//,,9911//9900119900116600006611--5522))4422%%3311""11// ////##0000&&1100++77..//??))55??''44;;,,33;;2233::9944<<>>33@@>>//GG;;++UU;;**dd99((xx99**:://==66DD==JJDDLLGGJJBBEE99??33;;,,??..FF33GG44CC00GG33BB..>>++??**??++BB--JJ55VVEEMMIIXX6677CC))**@@0000<<44116677114477,,,,00""5577))8866))44++$$@@4444UUEEPPttccvvzzpp@@??OO99==HHYY]]hhrrvvPPTT]]33,,""22..%%44//))5500--55////44....33----22--**3300++22//((11..%%00--&&00,,))22..--33..2277..33<<++33==**00<<))//<<,,//@@0000AA3300BB55--CC55**NN;;--VV99))ee77''vv77((88-->>77FF@@KKFFMMIIEE@@==6666--88..>>33AA55@@44<<2266,,44**88++<<00BB44MM??[[NNYYRR__<<::FF**))@@..,,::22//6655003366--((..""2266((1133&&11..%%4411,,772266``]]hhxxzzIINNTT1199;;22::<>66>>55..//..))--//**//44----33))++--""----##6622))6611++00,,++ccaaffnnwwtt``kkcceepphh||~~aammcc//,,##....$$11..''//..))00,,))//++((--))((,,(('',,(()),,(()),,&&**++%%)),,%%,,--&&..//''22--++00))00((((00##//,,%%66++''??----@@0011==3322667711//;;//11??..88BB**EE??''YY::%%ss<<((BB22FF::GG==EE<>II99%%22((,,%%))22--116600//,,%%44++$$<>....@@0033;;2233335522''77--''<<--..??,,88<<%%KK77``66 ||99((??00<<..AA22AA44==11<<22>>66==66::33ss33**ss77--vv==44zzDD::}}KK@@\\PPwwii~~ooaaxx\\II__JJ**>>22--%%""--))((--))11..))44++&&22%%00!!11$$ccXXTTʶ~~ffxx^^==OO553333334444225566116677116677115566004433..3322..44001133//0033--1111++//11++//22,,..33----1111))**66""++774455%%==44--DD4444FF3377>>1188882266//332211880066::,,<<55##II..\\--ww44##;;++<<**AA..AA22>>//::..<<22;;1188//<<33zz::00vv<<11zzDD88RRDDddVV||nnppssllggggKK``QQ33DD<<''22..%%!!++**&&00--&&(($$**((3355''TT\\MM||||{{~~yy~~zzrrPPddHH7766;;8888::999977::;;55::;;3399;;00999911887722::66559955667733446600226611..6611++7733**7755&&77::%%99;;%%AA;;--HH;;33NN::;;LL77<>@@55??AA44DDDD::GGGG??BBAA==BBAA??==<<::??;;88>>;;442200##00//CC>>**??44""CC33$$LL::..UU@@;;WW????OO4499PP//88YY11<><<::==??==>>IIHHCCDDEE7799;;%%<<::##SSFF66RR@@44OO>>44PP??77OO==99OO7777RR//55[[))22ii**55<>>><<@@::<<22DD44::**::--AA88>>9955337766EEBB9955BB>>BB;;KKCC]]WWYYUULLIIKKNN88??88HH??VVEEbbGGkkIIrrNNwwRRxxddOOcc==DDvv??<>>>66CCDD44GGHH88HHII;;GGGG??HHHHHHPPOOUUEECCNN5544<<66668899::445599**6699&&3300!!??99--EECC66HHFF::HHDD99LL??77RR6622ZZ..--qq1122BBFFGGKK88::4422??99@@5544&&<<++66&&44&&:://<<55;;88;;88>>9955..BB88KK??SSHHYYPPJJEE;;88::<<<>9955..55**==33??//66%%::((::''88))66**44--55..33,,//&&66((@@11LL==TTEELL@@::22//++2233HHIIHHOOJJXXKK^^KKccMMiiSSppZZtt^^qqiirrppqqffbbώ¼>>55::9911//66//%%6633"">><<''EEDD00IIII??KKIILLcc``uuᦦъllooMMRRhh77==II>>BBEE==??::==::55DD9933TTBB88ggII>>ttHH;;yyAA22GG88AA11>>..AA11CC11AA00BB22FF44BB..HH44GG77>>1166--66++22))11$$77%%::&&GG55QQ@@FF8877..5511<<99DD@@IIFFLLPPOOYYRRaaVVjjXXmm\\ooXXffcckkppuuZZZZݫII====BB9922<<55%%9944==99 CCAA,,JJGG@@KKJJRR]]ZZyy{{~~]]^^}}PPIIYYFF77>>JJ//44mmFFIIhhggttppii``XXJJKK99??**==''DD00FF33>>//>>22GG99@@00EE44EE88??44881166--66++88))BB11;;((HH66RRBBCC9966116655::99EE??HHBBJJIIQQTTWWaaZZggYYggWWee^^hh^^eerrvvTTXXwwyySSFF@@MMCC77HH@@++BB<<""??;;BB@@++HHEE@@KKIIWWWWRRzz񰰫ᔔwwYYnnII^^WWjjeett]]ffKKMMAA;;AA33==**;;'';;))88))22++//--553333,,44++22--44003311220022..66..GG;;::**FF88UUIIEE@@66660077..33CC??CC>>CC@@KKMMXX^^^^ii\\ffXXaannuuccgg||YY[[zz??CC[[JJBBYYII<>::==OOKK==22BB33??0055&&..$$11++..//))++--,,%%%%""$$----66445533440066//<<44,,$$<<55SSMMIIGG==??77>>005544//33++44//CC@@XXXXffkkhhllddhhttwwhhiittqqff9966]]FF>>ddKKDDggIIIIaaBB@@^^@@88\\EE77VVII66IIJJ::SS____ss˚ꝝ陙٤ΰ{{dd||IITTEEMMLLQQEEGG??>>EEAAHHAAAA88::0044))44++77..77//33..//--**// ''--11;;;;22//**$$11,,9944::66++''3311CCCCGGFFMMKKJJHH33//9900??33--""<<11QQHHppjjXXXXddddssssttppsshhoo__vvccRR^^NN??aaOOEEeeHHJJaaAADDaa??==aaGG::YYNN22OOOO33@@NN==WWjjppggvvȎqq__::^^KK]]??DDJJMMRRPPCC@@8800<<22??66::1111****##,,&&22++77009922443355>>''33,,3344554400::33EE>>EE??7733//,,//0011222211;;77CC<>TTNNBBUUGG>>YYGG99]]NN99ZZTT44TTUU55HHOO==QQYY[[UUTTssvvffwwxxnnIIdd::II88??IINNOONN==::44++<<22DD::AA778800//''--((33..884488773344++44$$..**004466::77CC>>DD>>9922DD??LLGGFFBB::6644//33,,==55NNEE::11:://66,,:://;;..hh]]{{zzzzwwSSZZcc\\vveexxyyZZttee{{ggyyddssϨCCYY33EEVV66IINN88NNKK::VVNN;;YYRR88YYTT44UUTT66UUXXEEXXVVWWTTGGaaqqUU}}mmyyxxYYggCCPP==FFDDIIBBBB22//33**AA66HH<>5566//55446677//33((--1177//55BBHHWWZZLLNN4455''## 00''CC99AA7799--<<3355++22**DD9977))77,,>>::<<88//&&RRJJss}}QQggKK``MMSSJJ;;cc~~qqssrrzzttuuKK[[66MMXX66QQUU::VVTT??VVOO<>>><>??DD44::0033<<==GGCCMMEEQQGGLL>>EE88FF;;CC88AA99FF==00!!33&&8844997722//GGDDmm||SSllIIaa;;BBHH99hhnn__ss``kkXXzzkkzzkk}}nnttrrll\\ZZTT::ZZRR;;__RRAAaaQQBB]]LLBBXXIIDD]]QQQQdd]]dd{{qqŢřqqccUUQQPPOOPPNNEE??9922CC99NNAAFF8877**AA33BB66::007722AA==FFGGIIKKMMNNOOSSJJQQ;;CC11::IIOOddhhkkiiQQJJII??GG99DD44;;//;;00992211''11 33$$33..5555557799@@zzeexxQQjjII]]&&**nn==,,ddtt__tt``vvaass``oo^^||iippttccccRR``MM>>__LL==ccMMBBeeNNHHaaLLKKaaNNTTjj]]nnxxoovvtt{{zz~~ХllddllcciiaaPPGG66--<<22JJ@@KK==77**AA55BB6666**00''9944CCAAHHFFXXZZddggZZaa55??((44FFQQ\\bbOOOO??;;66++??22EE77<>>>[[__NNVV77AA==KK::GG//7799<<7766??77BB88@@44==22<<55662211))66$$77##::..333333??66LLiiOOff[[jj??BBssGG::OO::]]ZZ11{{VVVV99kkSSjjQQiiOO__GGTT{{<>KK5577UU@@??^^KKGGddUURRnnaajjuukkqqkkiihhrrqqԗ䛛ޝϥǔuujjrrxxVVJJPP;;ll\\yyllxxnndd[[88////%%44((99++==//==--;;++;;//>>22??664444LLPP>>FF**4433>>44??--6677<<6666<<99@@88==44;;44::334411//((55""::$$EE66<<::--99GG^^UUppSSiiTTYYZZ55,,RR@@,,9933aaYY22eemm::TTyy44ccIIkkOOkkOOeeHH\\??[[~~>>``CC88//22BB<<<>,,@@..@@11CC44BB884444CCGG55<<$$++--7722::,,4422776677;;::==88::55996699554411//((55""<<((GG66==77,,88YYppEE]]VVffgg::555599bbffEEVVnnNNddHHmmOOllMMiiHHccBBccBBhhGG..//33559988--55((77DD33WWdd]]UUaammVV]]wwxxׅԎ͑Ïuutt__ppuuWWMM~~PP99]]KKqqaallccPPHH44**33''88((::''>>,,CC00EE22AA22==22;;222211==??66::..1188====CC77;;77;;5577889999999966;;::<<99885533++99((??++==,,7711??GG__ooFFWWIIOORR??00//GGXX88Ǥ||RRooQQmmTTjjNNiiJJhhGGeeFFiiHHjjKK++//22006622%%11,,<<""JJ[[IIQQaaaaeennΝۉċ~~ttttccssmmTTZZWWNNQQBBSSEE\\OOOOGG55--33''<<--::&&88"";;''CC//DD55<<0044--00,,..,,7777;;;;>>;;HHFFMMLLHHHHBBDD558877::88::9999====BB>>??99990099**>>,,22$$;;33__bbYY^^PPRRhh11**$$'' >>XX55zzllġxx[[WW11aayyEEiiUUffLLeeIIffGGiiKKooPPqqSS::88====>>8855==%%77EE$$FFVV;;IIYYNN]]eexx{{qqxxjjwwqqttnnaa[[eeWWTTkkOOKKSSIILLBB@@66GG@@EE>>77,,;;--;;))>>''88::!!BB..EE88==66553333338855>>;;DD??EE@@EE@@HHCCDDAA<<<<779966::669988::@@>>DD??AA88;;..88))77''22&&KKAAoollTTOOZZOOMM22EETT33llddzzss]]TT55LLII&&eePPccQQeeNNccIIffJJooSSuuYYww[[YYHHPPWWLLHHVVRR77SSWW22OOYY44MMVVAAUUZZ``cccc}}uuoogg]]ccXXffccZZUU\\VV@@]]XX::bb^^AAppWWAATTKKMMII8855>>99AA;;<<11FF55;;%%HH--<< 88??))AA66;;88559977<>EE>>AA7788..::00==778855::;;77::55;;66::??>>CC>>>>4477))99++((66,,UUKK^^TT[[LLhhSSggffHHwwllddooMM@@AA""**%%88<<jjXXjj\\llVViiPPjjRRrrZZvv\\ssYYkkVV[[ffTTPPii^^HHjjggFFbbccAA``bbJJddcc^^``]]ff^^WWgg__WWdd``XXUUSSLL::GGDD%%VVTT..dddd@@qqYY??ZZRRWWXX>>??<<;;997777..II88<<&&LL00;;2266!!::005544228888>>BB??@@88@@66;;//11$$99--HH??HHCC>>>><<==88<<::;;AA==FF::??1166''==11::33XXOOBB66ccPPuu[[~~ZZnnKK// --660033EEFF&&88BBggVVppbbvv``ppXXmmWWrr\\qq[[iiQQll]]ZZll]]VVkk__QQjjbbMMiiccMMiiddNNiiccSSiiccWW``YYOOooii]]ee__OOZZUUAANNII33HHDD++SSNN88XX>>--}}8833``aabbee;;<<,,++;;77??5588''II44::##,,//88..>><<::??::>>::77>>55::1199//::..<<22>>77>>88HHFFGGFFFFCC@@;;<<1199&&99$$;;''55++33--::55NNEE``TTccSSjjXXDDQQMM44##)) ;;II((??JJ**<>7755FF??BB8877))99**<<..BB66GG@@HHFF@@AA==>>::55==44;;0099..99,,99..88117711<<99==88<<77;;0099))88##~~;;!!||;;%%tt++""~~55//GGAAWWPP``UUddWW{{hhWWttnnXX[[]]EEVV__BB@@MM//::II((,,==44FF jj||TTggtt]]tt^^ww__llXXccMM\\HHii__UUjj``VVjj``TTjjaaRRkkbbQQkkccPPjjccPPjjddNNcc\\IIff__LLcc^^JJttoo\\llffVVNNHH::FFBB66JJ88,,VVMMVVMMmmggvvqqWWSS??<>JJGGNNKKNNKKLLGGMMIIKKGG>>::22**770099//88,,77**66))44))22**11))//**00))11**11((33%%55!!ww99 vv99$$uu22))??99MMHHUULL||TTJJppTTHHhhXXHHcc^^JJkkooXXRR\\AA33@@$$33BB##//@@44EE!!ccssOOkk{{bbqqWWkkPPddLLbbII^^FFjj``VVjj``VVjj``TTkkaaUUkkbbSSjjccQQkkddRRkkddRRff__MMwwrr__jjddTTbb\\LLee__SShhddXX^^ZZQQ>>00''iiGG;;SSDDSSFFTTII__XXZZUUIIGGFFHHDDIIAAHH::AA66::@@>>LLEEDD::66++55++99..99,,99++99++77**66++33))//''//((00))11((44%%{{77$$ss99##qq::&&qq55++{{@@::PPHH]]TTddZZ~~ffZZoobbRR__\\IIPPSS>>@@JJ11//<<""..== //@@ 22CC##UUddCCzzff~~ddkkOO^^BB^^DD``FF^^DDjj``TTjj``TTjjbbUUjjbbUUjjccSSkkddTTkkddTTjjddTTmmggWWxxrrddaa[[OOYYUUIIzzvvmm}}ttUU;;,,II((OO,,``66&&qq;;//LLEERRQQ>>CC@@JJAAMM??LL<>JJ4411??&&,,:: //==##HHUU99uuaa}}ccffJJXX||<<]]CCccII^^DDkkaaUUjjbbUUjjbbUUjjbbUUkkddTTjjddTTjjddTTkkeeWWee__QQaa]]QQ``\\QQܩWW>>**II33PP99''88 qqEE<<||kkmmDDMMFFRRKKWWKKSSGGHHCC==EE88JJ;;33''77,,99,,::..==//||>>11||>>11}}==11}}::11||9900zz77..vv66,,ss77,,ll77))ff55''aa33&&XX,,##nnFF>>}}[[QQrrVVKKXXDD99BB66**22// '')),,33##::EE44AANN::..;;''))77 ,,::!!CCPP66}}llvv^^``DDWWvv;;aaGGffLL\\{{BBjjccSSiiccSSiiccSSjjddTTjjddVVjjddVVkkeeWWiieeYYnnjj__dd``WWssnnhhԤyy``OO==HH;;**XXLL>>ӺrrvvSSYY;;AA99<<@@??DD<>11vv>>11rr99..pp77,,nn55,,ll66,,ll77//ii77..ee55++__33**RR--$$aaCC99jjOODDZZFF;;HH:://AA99..????33==AA33))11"",,99((55BB11,,99((00;;**..::&&??HH33vvhhSSTTpp==RRnn;;aa}}LLbb~~MMRRnn==iiccSSiiccSSiiccSSjjddTTjjddVViieeYYiieeYYiieeZZhhdd[[\\YYRRiiffaaxxmm[[;;55%%ަVVVV@@>>LLFFOOEEDD66>>22::22>>66<<33;;22zz<<11vv<<11ss==11qq??44hh88,,ee66,,dd55++ff77//hh9911ii::22ff7711^^66..ccEE;;^^HH;;PP>>22<<..##22**5533''5577,,--33''22<<11))55''00<<0022>>00==HH88//::))33<<++ssZZnnKKJJcc99OOff<<^^wwOO__uuNNIIbb::hheeRRiiffSSiiffUUiiffUUhheeVVhhddXXjjff[[kkhh__eebb[[ppoojj˷~~{{jjzzvvjjƨttii>>33JJ<>55yy??44pp<<11cc44**ee99..``88..cc;;11iiAA99hh==66aa44..ff6622kkBB<>11??EE99EEPP??==MM22GG\\==JJ]]??^^rrVV[[nnRR77KK//ggddQQiiffSSjjggVViiffWWhhddXXggeeYYiiff]]iiiiaappoojj¸өWWEE<<))KK<<77..??88GG@@FF==yy::33oo66--nn<<33nnBB77__99..__==11\\::00WW55++``;;33ppGGAAttGGBBggBB::rrffXXQQAA9933%%4422%%6688++2255**++22****44++++77--((44**''33))++55,,..55--0088--88>>44??GG88;;JJ55EEWW??GGYYCC[[mmWWWWiiSS33EE//ffeeQQggffRRiihhVVhhffWWggeeXXeeeeYYgggg]]hhhh``ffee``zz{{uuíjjSSAAJJ>>xx==55rr66..vv::22qq6600uu>>77oo==44aa77++__==11]]@@22XX>>//UU;;,,ZZ<<11hhFF<>..eeddPPggffTTiiggXXgghhZZffffZZeeee[[ffff^^gghh``]]^^XXeeff``ýӾii\\yyJJ@@ff44++nn9911hh11**{{FF>>uuFF<>0088>>2277??4477AA8800::22,,77//++55--,,66..,,33++))00((,,11**1199..--;;,,55FF4422CC33CCTTDDDDUUEE))::**ccddRReeffTTgghhXXhhii[[gggg[[eegg\\eeff^^ffgg__kkllddnnqqhhǾ̺ժQQIIll==55ee::11bb>>22bbHH77XXGG33[[PP::ccXXBBXXLL66JJ;;&&ZZEE22ssbbPP\\WWCCGGII44<<==++<>BB44;;AA55::BB77::DD;;88BB::55??7744>>6644>>66229922..55..//44--33;;0077EE44::KK8800AA//<>++<<**bbccQQeeffTThhiiYYhhii[[ffhh[[eegg\\eeff^^ffgg__nnqqhhyy˺ŷƃWWNNff::11ee==33nnNNAA]]FF44\\PP::WWOO88NNJJ11UUNN44ccYY@@hhXXAA[[OO99aa\\HHQQSS>>EEHH55AAEE44??CC4499??1177??4499AA66==GG??::DD<<::DD<<;;EE==99@@9933::3344992266>>33HHVVEEGGXXEE66GG44==NN;;@@QQ??..??-- \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray.miff new file mode 100644 index 0000000..badfb6b --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray.miff @@ -0,0 +1,13 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=RGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:...///111333555555444444222222111111000...,,,,,,111222444999>>>BBBCCCCCC@@@HHHPPPXXXcccoootttrrrvvvtttnnneeeaaaaaa]]]XXXXXXVVVVVVWWWWWWXXXbbbmmm[[[@@@333555222111333///)))...)))???^^^uuusssPPPVVVxxxuuuTTT...///111333333333222222111111111111000///......111000111555999<<<======BBBGGGLLLQQQ\\\jjjrrrtttuuurrrjjj```]]]___^^^[[[YYYTTTRRRSSSTTTWWW___ggg\\\@@@111555666666555---333333,,,777IIIiiiuuuAAABBB___oooUUU---...000111111000///...////////////////////////111000///111555777888888AAADDDEEEHHHQQQaaammmqqqvvvqqqfffZZZWWWZZZ[[[YYYTTTOOOLLLOOOTTT[[[eeeooogggFFF222333444555444+++222111...000333^^^zzzHHH777:::UUUNNNHHH,,,---...///...---+++***++++++++++++,,,,,,---...000///...000333666777777;;;>>>??????GGGVVVccciiirrrnnncccXXXSSSUUUUUURRRRRROOOOOORRRUUU]]]mmm|||^^^BBB777......222000+++,,,222333---bbbtttjjjnnn~~~eee,,,---......---,,,***)))(((((((((((((((***+++,,,---,,,,,,...222555666666444888::::::???KKKWWW\\\eeeddd^^^VVVTTTUUURRRNNNOOOQQQTTTUUUVVV___uuu{{{[[[DDD---'''///444------222111+++eeelll///000111111000///---,,,******)))((()))***,,,---++++++,,,///333555555444000666888666999CCCMMMRRRVVVXXXWWWTTTTTTVVVTTTNNNEEEHHHNNNTTTZZZjjjnnnVVV777''')))+++...---'''%%%&&&ZZZxxxPPP333444555666666555333222111///...------...000222000111333666999999666444333777888444444===HHHNNNQQQSSSSSSQQQRRRTTTQQQLLLQQQNNNNNNUUUaaasssuuuXXX>>>...###)))+++"""&&&111WWWTTT777888999::::::999888777666555333111111222444666777888;;;>>>@@@>>>:::666777:::999222111;;;GGGNNNUUUVVVSSSOOONNNOOOLLLGGGsssfff[[[[[[eeeqqq~~~]]]>>>'''%%%///***777JJJaaa}}}|||yyyRRR888;;;??????>>>@@@DDDHHHAAAAAA<<<<<<;;;///---===555666>>>FFFFFF===:::>>>222FFF]]]eee___XXXZZZ``````^^^```bbbZZZQQQUUUbbbrrrrrraaaaaawwwyyyooowww{{{|||xxxaaa888444666\\\xxxrrrUUU444777<<>>;;;>>>HHHCCC888888HHHDDDBBBCCCBBB>>>:::999>>>UUUeeeaaa[[[___aaa^^^``````bbbfffgggfffiiiooo```iiihhhqqq~~~ooorrrkkkpppvvv{{{}}}~~~jjj[[[KKK}}}Ǭqqq[[[111222666<<>>;;;FFF\\\cccUUURRR___aaaVVV[[[^^^```ccciiippppppkkk^^^jjjrrr{{{rrrbbbdddppptttxxxyyyyyy|||}}}lllԋ111000111777???FFFHHHHHH]]]|||{{{ZZZBBB999555666222@@@HHHCCC999555333111MMMXXX[[[SSSTTT^^^```XXX[[[bbbdddaaadddjjjggg]]]dddiiipppuuuooo```[[[bbbxxx{{{}}}~~~~~~vvv888333000222999BBBHHHJJJcccrrrSSS===AAA>>>:::<<>>FFFKKK^^^¬aaaMMM<<<888RRRwww~~~oooaaaYYY[[[hhhlllggghhhpppgggnnnqqqnnnjjjiiigggeeehhh```lllxxxlll```bbbdddoooooosss{{{rrrJJJFFFAAA;;;999===DDDIIIXXXjjj```ssspppfffeeeaaaaaadddeeeeeegggkkkdddaaaccciiillljjjhhhhhhpppbbbnnnssseeebbb\\\nnnkkklllvvvxxxUUUOOOMMMIIIBBB======BBBHHHTTTxxxsssjjj^^^fff{{{iiimmmiii```^^^fffjjjgggdddZZZYYYeeennnlllhhhiiinnnZZZggg|||tttkkklllddd^^^ZZZ\\\lllIIIIIIOOOPPPJJJHHHJJJKKKGGG[[[rrrooorrrllllllqqqpppjjjkkkfff```cccllljjjbbbfff]]]fffpppeeeYYY___gggiiiZZZcccsssvvv{{{vvv]]]aaa___TTT```mmmzzzgggQQQTTTSSSMMMLLLPPPQQQNNNHHHeeevvvrrrUUUrrroooxxxzzzjjjbbbfffggghhh___ZZZ^^^eeehhhiiijjjrrrfffeeegggbbbfffooopppeee^^^```bbbaaagggllliii``````UUU^^^hhh©PPPPPPMMMJJJLLLQQQRRRPPPKKKWWWXXXpppiiidddiiixxxyyyeee\\\ffflllqqqaaaZZZdddkkkhhhhhhnnnggg```ccchhhiiippppppdddqqqyyyttthhhaaa^^^gggwwwdddeee\\\___aaa~~~|||uuu}}}||||||KKKJJJHHHIIIMMMQQQQQQPPPUUUWWWNNNbbbzzzooommmrrrlll[[[ZZZhhhoooyyynnngggiiimmmkkkgggeeehhhfffwwwwwwfffSSSaaauuurrrddd```VVVXXXooohhhlllgggddd]]]}}}}}}qqq[[[mmmNNNMMMNNNPPPQQQPPPOOONNNGGGRRRRRRkkktttlllcccXXX\\\eeecccmmmrrrooofffhhhppplll___hhhdddwww~~~eeeVVVMMMZZZllljjjbbbfff```___rrrgggmmmmmmjjj^^^sss}}}oooYYYQQQPPPQQQSSSPPPKKKLLLOOO]]]fffbbbwwwzzzoooiiiccc^^^fffkkkccc___ooorrrfffhhhyyyzzzllleee___hhhoooeeeaaakkksssxxxzzzsssmmmpppooopppwwwbbbiiinnnlll```mmmzzz]]]WWW}}}OOOOOOQQQRRROOOLLLTTT^^^xxxuuurrrssslllbbbiiitttqqqaaammmqqqiiihhhttt|||{{{{{{|||{{{nnnggg}}}}}}rrrnnnkkkfffiiikkkeeeeeehhhllllll```fffrrrBBBJJJwwwPPPPPPSSSVVVTTTVVVeeevvvyyy߱ttt^^^aaasssxxxhhhkkklllgggbbbdddppp{{{mmmbbbmmm```gggnnnhhhmmmrrrccckkkjjjmmmjjj___```uuuvvv999;;;xxxxxx{{{\\\QQQMMMQQQUUUQQQSSSjjj}}}{{{eee|||ٶiiisss|||mmmZZZlllnnnrrrsssmmmgggddddddeeejjjooovvvqqqeeennnhhhlllmmmkkkkkknnnlllgggiiigggjjjggggggkkkwwwQQQVVV555^^^ooozzzyyyrrrhhhfffiii<<>>BBBRRRkkkiii^^^fffjjjZZZRRRqqqkkkZZZbbbcccdddeeeeeeeeegggiii]]]qqqhhhYYYeeejjjeeellljjjmmmmmmjjjkkklllhhhbbb```dddnnniiibbbxxx{{{FFF---hhhxxx{{{yyyttttttxxx///888111>>>______```ggg___[[[ppp{{{cccccceeedddeeeiiiiiieeeccccccaaaooojjjbbblllqqqlllllljjjllllllkkkmmmnnnjjjbbbaaadddaaa___ppprrrfffCCC)))KKK}}}zzz}}}{{{wwwuuuwww{{{...444+++444TTT\\\ooo~~~hhhUUUcccbbbjjjzzzuuu``````iiiccc___aaahhhjjjddd^^^]]]^^^iiilllmmmwww}}}yyytttjjjllllllllloooqqqlllcccbbbcccVVV```nnnAAA###JJJPPPnnn~~~yyywwwwww{{{999===888===NNNSSSeee|||wwwrrr___YYY[[[bbbbbb[[[iiilllaaafffeeeddd]]]]]]gggmmmiiiddddddfffkkkoooqqqssswwwuuunnnkkklllkkklllpppqqqjjj```^^^ZZZUUUkkkooojjj777MMMyyyZZZ???vvvxxxzzzyyy|||NNNOOOPPPRRRRRRQQQYYYfffmmmbbb___]]]RRRSSS```fffgggiiiXXXbbbiiifffnnnaaajjj]]]YYYccclllkkkjjjmmmsssooommmiiibbbfffkkkgggmmmlllkkkjjjnnnnnndddYYYZZZHHHVVVrrrwwwllloooccclll<<<$$$444xxx~~~]]]YYY___ddd______ccc___ccc]]]VVVHHHBBBSSS```XXXnnnvvvaaabbbcccaaaqqqbbbmmm[[[RRRZZZcccdddgggmmmsssiiieee^^^UUU___mmmooonnnmmmjjjiiikkkjjj___SSSXXX999UUUqqqWWWoooxxx```)))...777:::>>>ppp`````````aaaaaabbbbbbbbbXXXhhh___UUUIIICCCLLLBBBKKKzzz___YYYkkkmmmaaammmWWWNNNUUU^^^kkkpppiii```]]]YYYWWWWWWZZZ___bbbrrrrrrnnnfff\\\TTTQQQPPPMMMKKKQQQaaaooolll[[[KKK"""EEEHHH>>>,,,@@@{{{qqqppp``````aaaaaaaaabbbbbbbbbnnnkkk```gggVVV777:::@@@FFFXXXeee^^^kkkeeeccc^^^dddlllmmmqqqooobbbYYYWWWSSSQQQPPPRRRUUUWWWaaaaaa___ZZZSSSNNNMMMMMM@@@JJJZZZggglllllllllmmmWWWYYYFFF>>>222<<>>EEE666000111GGGdddiiizzzlllgggbbbbbbbbbcccccccccddddddkkkaaaoooUUU>>>MMMۍooo```ccceeeiiinnnkkkPPPOOONNNLLLKKKJJJJJJJJJJJJGGGEEEDDDEEEEEEBBB@@@777KKKVVVKKK===:::>>>>>>***333<<<000444444CCCrrr___aaaqqqnnn^^^bbbbbbbbbccccccdddddddddeeeZZZeeeiii333nnn^^^hhhppplll___TTTSSSPPPMMMJJJJJJIIIJJJFFFDDDBBBCCCFFFGGGEEEBBBMMMMMMBBB111+++222555000666444;;;777AAA:::<<<]]]___XXXdddqqqUUUdddeeeeeeeeeddddddfffhhhbbbuuuyyysssۃUUUdddrrreee[[[NNNHHHIIIQQQLLLGGGAAABBB@@@DDDKKKJJJCCCFFFQQQXXX666333888555111333333000111555888===FFFPPPHHHTTTWWWlllfff@@@ccceeefffeeeddddddfffhhhhhhбiiiOOO___NNNQQQYYYXXXLLLCCCHHHOOOCCCFFFCCC>>>EEESSSTTTLLLwwwRRR444111666333///000111......000222555<<>><<<<<<>>>===;;;::::::666000///333<<>>888666999OOORRRCCCJJJNNN;;; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..2c190991846e9a0347911fe5e49020c46d9a775e GIT binary patch literal 13192 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..479732509857263dbd8ed4f4659ffb0b3c4ecc69 GIT binary patch literal 13192 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 LlD{x9mV5sfX^B5h literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog.miff new file mode 100644 index 0000000..badfb6b --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog.miff @@ -0,0 +1,13 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=RGB +compression=None quality=0 +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:...///111333555555444444222222111111000...,,,,,,111222444999>>>BBBCCCCCC@@@HHHPPPXXXcccoootttrrrvvvtttnnneeeaaaaaa]]]XXXXXXVVVVVVWWWWWWXXXbbbmmm[[[@@@333555222111333///)))...)))???^^^uuusssPPPVVVxxxuuuTTT...///111333333333222222111111111111000///......111000111555999<<<======BBBGGGLLLQQQ\\\jjjrrrtttuuurrrjjj```]]]___^^^[[[YYYTTTRRRSSSTTTWWW___ggg\\\@@@111555666666555---333333,,,777IIIiiiuuuAAABBB___oooUUU---...000111111000///...////////////////////////111000///111555777888888AAADDDEEEHHHQQQaaammmqqqvvvqqqfffZZZWWWZZZ[[[YYYTTTOOOLLLOOOTTT[[[eeeooogggFFF222333444555444+++222111...000333^^^zzzHHH777:::UUUNNNHHH,,,---...///...---+++***++++++++++++,,,,,,---...000///...000333666777777;;;>>>??????GGGVVVccciiirrrnnncccXXXSSSUUUUUURRRRRROOOOOORRRUUU]]]mmm|||^^^BBB777......222000+++,,,222333---bbbtttjjjnnn~~~eee,,,---......---,,,***)))(((((((((((((((***+++,,,---,,,,,,...222555666666444888::::::???KKKWWW\\\eeeddd^^^VVVTTTUUURRRNNNOOOQQQTTTUUUVVV___uuu{{{[[[DDD---'''///444------222111+++eeelll///000111111000///---,,,******)))((()))***,,,---++++++,,,///333555555444000666888666999CCCMMMRRRVVVXXXWWWTTTTTTVVVTTTNNNEEEHHHNNNTTTZZZjjjnnnVVV777''')))+++...---'''%%%&&&ZZZxxxPPP333444555666666555333222111///...------...000222000111333666999999666444333777888444444===HHHNNNQQQSSSSSSQQQRRRTTTQQQLLLQQQNNNNNNUUUaaasssuuuXXX>>>...###)))+++"""&&&111WWWTTT777888999::::::999888777666555333111111222444666777888;;;>>>@@@>>>:::666777:::999222111;;;GGGNNNUUUVVVSSSOOONNNOOOLLLGGGsssfff[[[[[[eeeqqq~~~]]]>>>'''%%%///***777JJJaaa}}}|||yyyRRR888;;;??????>>>@@@DDDHHHAAAAAA<<<<<<;;;///---===555666>>>FFFFFF===:::>>>222FFF]]]eee___XXXZZZ``````^^^```bbbZZZQQQUUUbbbrrrrrraaaaaawwwyyyooowww{{{|||xxxaaa888444666\\\xxxrrrUUU444777<<>>;;;>>>HHHCCC888888HHHDDDBBBCCCBBB>>>:::999>>>UUUeeeaaa[[[___aaa^^^``````bbbfffgggfffiiiooo```iiihhhqqq~~~ooorrrkkkpppvvv{{{}}}~~~jjj[[[KKK}}}Ǭqqq[[[111222666<<>>;;;FFF\\\cccUUURRR___aaaVVV[[[^^^```ccciiippppppkkk^^^jjjrrr{{{rrrbbbdddppptttxxxyyyyyy|||}}}lllԋ111000111777???FFFHHHHHH]]]|||{{{ZZZBBB999555666222@@@HHHCCC999555333111MMMXXX[[[SSSTTT^^^```XXX[[[bbbdddaaadddjjjggg]]]dddiiipppuuuooo```[[[bbbxxx{{{}}}~~~~~~vvv888333000222999BBBHHHJJJcccrrrSSS===AAA>>>:::<<>>FFFKKK^^^¬aaaMMM<<<888RRRwww~~~oooaaaYYY[[[hhhlllggghhhpppgggnnnqqqnnnjjjiiigggeeehhh```lllxxxlll```bbbdddoooooosss{{{rrrJJJFFFAAA;;;999===DDDIIIXXXjjj```ssspppfffeeeaaaaaadddeeeeeegggkkkdddaaaccciiillljjjhhhhhhpppbbbnnnssseeebbb\\\nnnkkklllvvvxxxUUUOOOMMMIIIBBB======BBBHHHTTTxxxsssjjj^^^fff{{{iiimmmiii```^^^fffjjjgggdddZZZYYYeeennnlllhhhiiinnnZZZggg|||tttkkklllddd^^^ZZZ\\\lllIIIIIIOOOPPPJJJHHHJJJKKKGGG[[[rrrooorrrllllllqqqpppjjjkkkfff```cccllljjjbbbfff]]]fffpppeeeYYY___gggiiiZZZcccsssvvv{{{vvv]]]aaa___TTT```mmmzzzgggQQQTTTSSSMMMLLLPPPQQQNNNHHHeeevvvrrrUUUrrroooxxxzzzjjjbbbfffggghhh___ZZZ^^^eeehhhiiijjjrrrfffeeegggbbbfffooopppeee^^^```bbbaaagggllliii``````UUU^^^hhh©PPPPPPMMMJJJLLLQQQRRRPPPKKKWWWXXXpppiiidddiiixxxyyyeee\\\ffflllqqqaaaZZZdddkkkhhhhhhnnnggg```ccchhhiiippppppdddqqqyyyttthhhaaa^^^gggwwwdddeee\\\___aaa~~~|||uuu}}}||||||KKKJJJHHHIIIMMMQQQQQQPPPUUUWWWNNNbbbzzzooommmrrrlll[[[ZZZhhhoooyyynnngggiiimmmkkkgggeeehhhfffwwwwwwfffSSSaaauuurrrddd```VVVXXXooohhhlllgggddd]]]}}}}}}qqq[[[mmmNNNMMMNNNPPPQQQPPPOOONNNGGGRRRRRRkkktttlllcccXXX\\\eeecccmmmrrrooofffhhhppplll___hhhdddwww~~~eeeVVVMMMZZZllljjjbbbfff```___rrrgggmmmmmmjjj^^^sss}}}oooYYYQQQPPPQQQSSSPPPKKKLLLOOO]]]fffbbbwwwzzzoooiiiccc^^^fffkkkccc___ooorrrfffhhhyyyzzzllleee___hhhoooeeeaaakkksssxxxzzzsssmmmpppooopppwwwbbbiiinnnlll```mmmzzz]]]WWW}}}OOOOOOQQQRRROOOLLLTTT^^^xxxuuurrrssslllbbbiiitttqqqaaammmqqqiiihhhttt|||{{{{{{|||{{{nnnggg}}}}}}rrrnnnkkkfffiiikkkeeeeeehhhllllll```fffrrrBBBJJJwwwPPPPPPSSSVVVTTTVVVeeevvvyyy߱ttt^^^aaasssxxxhhhkkklllgggbbbdddppp{{{mmmbbbmmm```gggnnnhhhmmmrrrccckkkjjjmmmjjj___```uuuvvv999;;;xxxxxx{{{\\\QQQMMMQQQUUUQQQSSSjjj}}}{{{eee|||ٶiiisss|||mmmZZZlllnnnrrrsssmmmgggddddddeeejjjooovvvqqqeeennnhhhlllmmmkkkkkknnnlllgggiiigggjjjggggggkkkwwwQQQVVV555^^^ooozzzyyyrrrhhhfffiii<<>>BBBRRRkkkiii^^^fffjjjZZZRRRqqqkkkZZZbbbcccdddeeeeeeeeegggiii]]]qqqhhhYYYeeejjjeeellljjjmmmmmmjjjkkklllhhhbbb```dddnnniiibbbxxx{{{FFF---hhhxxx{{{yyyttttttxxx///888111>>>______```ggg___[[[ppp{{{cccccceeedddeeeiiiiiieeeccccccaaaooojjjbbblllqqqlllllljjjllllllkkkmmmnnnjjjbbbaaadddaaa___ppprrrfffCCC)))KKK}}}zzz}}}{{{wwwuuuwww{{{...444+++444TTT\\\ooo~~~hhhUUUcccbbbjjjzzzuuu``````iiiccc___aaahhhjjjddd^^^]]]^^^iiilllmmmwww}}}yyytttjjjllllllllloooqqqlllcccbbbcccVVV```nnnAAA###JJJPPPnnn~~~yyywwwwww{{{999===888===NNNSSSeee|||wwwrrr___YYY[[[bbbbbb[[[iiilllaaafffeeeddd]]]]]]gggmmmiiiddddddfffkkkoooqqqssswwwuuunnnkkklllkkklllpppqqqjjj```^^^ZZZUUUkkkooojjj777MMMyyyZZZ???vvvxxxzzzyyy|||NNNOOOPPPRRRRRRQQQYYYfffmmmbbb___]]]RRRSSS```fffgggiiiXXXbbbiiifffnnnaaajjj]]]YYYccclllkkkjjjmmmsssooommmiiibbbfffkkkgggmmmlllkkkjjjnnnnnndddYYYZZZHHHVVVrrrwwwllloooccclll<<<$$$444xxx~~~]]]YYY___ddd______ccc___ccc]]]VVVHHHBBBSSS```XXXnnnvvvaaabbbcccaaaqqqbbbmmm[[[RRRZZZcccdddgggmmmsssiiieee^^^UUU___mmmooonnnmmmjjjiiikkkjjj___SSSXXX999UUUqqqWWWoooxxx```)))...777:::>>>ppp`````````aaaaaabbbbbbbbbXXXhhh___UUUIIICCCLLLBBBKKKzzz___YYYkkkmmmaaammmWWWNNNUUU^^^kkkpppiii```]]]YYYWWWWWWZZZ___bbbrrrrrrnnnfff\\\TTTQQQPPPMMMKKKQQQaaaooolll[[[KKK"""EEEHHH>>>,,,@@@{{{qqqppp``````aaaaaaaaabbbbbbbbbnnnkkk```gggVVV777:::@@@FFFXXXeee^^^kkkeeeccc^^^dddlllmmmqqqooobbbYYYWWWSSSQQQPPPRRRUUUWWWaaaaaa___ZZZSSSNNNMMMMMM@@@JJJZZZggglllllllllmmmWWWYYYFFF>>>222<<>>EEE666000111GGGdddiiizzzlllgggbbbbbbbbbcccccccccddddddkkkaaaoooUUU>>>MMMۍooo```ccceeeiiinnnkkkPPPOOONNNLLLKKKJJJJJJJJJJJJGGGEEEDDDEEEEEEBBB@@@777KKKVVVKKK===:::>>>>>>***333<<<000444444CCCrrr___aaaqqqnnn^^^bbbbbbbbbccccccdddddddddeeeZZZeeeiii333nnn^^^hhhppplll___TTTSSSPPPMMMJJJJJJIIIJJJFFFDDDBBBCCCFFFGGGEEEBBBMMMMMMBBB111+++222555000666444;;;777AAA:::<<<]]]___XXXdddqqqUUUdddeeeeeeeeeddddddfffhhhbbbuuuyyysssۃUUUdddrrreee[[[NNNHHHIIIQQQLLLGGGAAABBB@@@DDDKKKJJJCCCFFFQQQXXX666333888555111333333000111555888===FFFPPPHHHTTTWWWlllfff@@@ccceeefffeeeddddddfffhhhhhhбiiiOOO___NNNQQQYYYXXXLLLCCCHHHOOOCCCFFFCCC>>>EEESSSTTTLLLwwwRRR444111666333///000111......000222555<<>><<<<<<>>>===;;;::::::666000///333<<>>888666999OOORRRCCCJJJNNN;;; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..2c190991846e9a0347911fe5e49020c46d9a775e GIT binary patch literal 13192 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..479732509857263dbd8ed4f4659ffb0b3c4ecc69 GIT binary patch literal 13192 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 LlD{x9mV5sfX^B5h literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..3aabb1a47928d8c94caccd4b04c5c794a0c57128 GIT binary patch literal 13192 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..a24c98deebb38f30f12f02923ee98dd3df5beb01 GIT binary patch literal 13192 zcmY+Kb$AsF(fEix^=#Ndr(|-Tw)TRy?uL3Kyq>j-#IZQ2-&_pI3zwfoX_3*lKe+}Ku`$Z(NaQwjEPSSN&0dP+ql?}?b{Pl z0-__5Gx+SU$#$}*67!k3_A+gDP`;f#S z@-k!xUxx+6#02o!ObCWxnEYihBR(-ACLodQmx(}hHWLK5Zx2fh35orGz5vN~@>T<* zQ$qfqRt`)yvyrdU!XuK&_BirlWG5g8K)1R9u&@98HU1BnzH0+vn4U#h^fipbS|I>< zi2%SQE&wcZLDn(?nXf{?t`!j2zQSRDx58w7zsh3mT4S?K*I@?jtbhuy3u)*&!RD@D z7&ecKvC}+D^rTb{Pg+ZvCp~!7qp<|_U>To1+#y1H4qFKI3rcDIrj4@VmbGQc50-+8 z$6{{fMFB^Bn$OgaOIdCE6hNESlGRlyq3o-Y(E2Mxlz}Rt`9PhJvcG|6I-ud3_xH%z zZQU*w4SCkeZg&KolF^te5;l7YV=-1?HgydFsVg9B*I9u2{RNz{`z&U<^MXCjpNe-6 zZ!d}|DpO~)WM)TKSJ>MIkJvf~_a~+lmo#d7!jn?+%I%%J2e!Dt%>T;;V{=xv3}LfZ z5e|6`fU*t&ChH()=Q@YAeVt^ozQu&YrkzEZtg}2CyuznID;OPI=0e~ChC?$v0eDIz zU`@$*v{Nnw^+Ygcesm9)I$n#h26}i%=P@Z?v!t}By=rY){=`yJ_E3UVo#TOxC%N>t z5dpKaPY$*lETN8i3wC#dCD>IXVeYFD&<4~3>i#A^t-nRc=^qrdk(_{l;QPyELV-04p)*vQx9b_=h0u1T~ z$fj)oEb|Qx)8s6h)D@dfISViuXF(=#7G{BG36cjvWv}2AQfqY95_xa)LWq4vgfM0# z2=$DLU`)AUl*tg(>_|FdK30t~2738u$COOebWSO+d1$RHy(1M>t>K8~D8%R*M45d( zLa^H)fxDW;P*1G@*k8`2AEKvkq?usvH;AC_0c)YQ&&#%^z{gSJAjOYjY|1JE z(pNx)wG5!_B@W71rZRS(hamG6m}9yM(@oA|O!^v+g)E19hPOAA8sf9kDhg#v$HOd) zSl|%6S$hxn{Z>x)qavlnVK#loIW}YWCcrQwpP%}L1&2o4WKk&RndasfSTyrZCe>_{ zK`|w5>zua1qO#9&=-@iQ0M|hlb8X9?5GwU7L8GsWn9LO^hqFksnHRwHc?pkwdP_I< zg!!Z&W_m0IHJ_*2 z!<2cBWd>~0Y3vO%j`=xL&aU$ehRJ!DZnnv1Fi1UfmU$4c1amn{EP^%15i(~nF?B{R zFgxvun@lAW=7(yeeN}cAZCxRrWdnQTlKb0={nPh`7rF#kck`^U`6`WWdM+?5NZU0u=&Wwj2OT&yF7G|uV`~^`b=`lo*S4;` zB0MP3OU))V!r@TX0S+*g6ip39?Mr`7GwLkPR+kAh^gufF(0h&t^QvB3npbzzCB?8|3?i zAZYt^HrITjR>1DBJ%!{RKi~D2oS<#Y5C%30%hEWC1jm zA;Sl=twp_+-u6v>X%U$RoALvD1}i-FG{mL(Wq8+F`djszi-3i{Gfggk&!k*5VN%XB z*p#zOrs)Qa^6e#4(|=qsrF?hU&Cj{Jp+gf`X{Zf5xG*8=pX^qud#e1a+KM9L3&Kid z?)V4@f-4XNEW-$A2|>wtMH-B-mmrWyjzP>-h|O6AS!^=ia5gwJ*5;N0bmqoZ{9%(k zDag)M3ikaffS4@tV8*-@hR#?(=ovo1oksy=kp%)v94>nS#pv^VXxEYrb0z+=qFc;G2(f;ee|@=jTTyfac3cR|8I=j9-L#u{MG*im=RdF=dVF>?1mX7d<3 zkJez+kqQx`zf#KHS0iE#Y<;eVCA0G8~DQ|aFG}kEkoz*s?jz$-y zrX$F`VkjXr`#@e?;%IA@zpf!Zrlm16%FtLCQMM-~FUrlM(;ntc^S<46ng8w1E0$*F z>!RJ;&s)Njc}E-GL|~{(Yg%zaUP4KHer8Q-X0AFtIkh}CJEuN1Ev_)6SnkCe!cfU9 zpC_3X3WZZb5k4gl!KZ{`Xv)F@KW=F$JR%YEPfEnX<9r@|N=R_e2nc8vVDDOGv%Xmu z3#l`Fc;}J`+P$bGnA1)Y;;6Goc+?KUPTRA%vmPAYwDWHEQY<7oTq(Ej)LGl>TO<}8 z2Atd5!{c@hT3{{vmE6{LA+x)m&+a@T#q@_Tuw$Ru&XFM+rT?UuubHt?R7}|`s|PIj z9sLSn`$>QI;uC)E1*48OHIvTv6&IYGif=o4wvgiMAVv$W(N;SuN=AzyHkhx1R9$7!WPde}mS z9wlSNEDztc;3!89+lis$HX>+JB|=ZA1lXhNdGZ^EJ7odLDxf^HM?6 zNhzT@Z7r?Y@O8^v^>o=gqf*vhw6?8&016x4aTGNlxvpiO1c8Mg#8G)~EE4zrtW3*& zWS5@(Brrc=QWaEH!?PGj5%GrWvtsj_^hKdXZG|yKy%nJYr-r1b)+X_jE60(xVZBpa zR(Op|plt`lKd3d4T|#mRdk3EEU`%3MFxPOD_tA;)uPS%aBZJdl-gzO9;YU zB%-Q`QGpYatHKZ~48ewO$Y{VWM7{7Dv>_rf|M z>nG>b^fwWO;WvWQQjhzF<{Nyx>TgYsqt72*`p31$=fAoA=I&n~yn6WW?~HGMbN~6h zzbu}gqnFg@C#M%AA_FfgDjP`G=GWi$gx%!JV0VD)aWF z*XFso$Mg!t_9qccGy@>;Jh(Lu!?abQ1f8<95+0VyxF`4+V@?E^EGg(aR-AVK&$TR! zGu9x)dpiVJS2xV;?}e!S<9x7foX=_-f=&7+2=k6fo|%3Dqi8n~YRe6Xp}Pk&8*c%0 z?Kzfd$0}@YSQT;_H*ENo=bU9_>nc&*DFWy?&ZhOuf}sAsLRtJ&X;<*f+I{cOR=&AE zD}!=hT1RBRv5!xGiO%p)P?UQlA%W@JMAKtN#iyOp^e#*Z(4`})I=zk6qVzwN#8 z{ck=QKW=;T;q~wCJ-+j|$(f^~LnjVM1u#BGu8WotmI=A0*tsI$nVpeYuumwJ!b8?d zn~5O*l$I9FQU9Zd?udJPHeAcg48+S8A;1|Y3HNBI zm0&nYNepC&fsqN9e#?l_m(GmUWCR(Y8EqC`}E z!$MwhPhnsD#M&e8g>69Ad&kJMPtGyPAKl^-pSy%*JoJysxE_}h+3(@maD8yU!1(I< zpWeLv`48`mAAk4h^T*%4ef#?NuU@_Q)7^VFzkm9}z5ns>(XGEJ`TR)<2F&nalSK^r zZkdm5pO=d1Q&yIu!`4=g<364loy`q1LDQ4(xiiy7^u+OZf}Y;%4w*Rvd%S$J+f>#b zV^XeQ#*zcgM_DR|bm3v86DjfO;}QOO``xW-d#y2Dr;ys+$2aRfZo$?r$iRkWK1*|+ z4>aDe#3~m>Y~8vXs=FcMR^1gq^^Z|b!xM;6e;=eZT!SgvOG1uj7Bg>KkR$bH9VEr` z5=>1pX;3#WjLUtGhIKe>b@zjF>rd*>68^w1|H z<4#g)_&!&6_28b2q+cK0`%k0s*KNNTjoXZ*y?OES4=U95I#X0pMm&Lf!#8a*@C1+FtmGdHp##4Zx zV+H4H@7Y-wuJVEAO(|G^PQ-55fK6MjFn1dsb7;-4nXJZV6q@c1gRZ||V$yMC=kCtO zbcX&V1gT$uVBHS@yYT_Y(%!+LnnmjFp7R8(|G`mJbYE#%c7rdhyTKKx*8tdX0%moN z!nEEol+`^a6E!?`ch540MnxIJqr;8C;nBwAH2)`I5i##-s@+Z|C&UKukf~dnD<)fd z`All%-TRk+HX7eUF(=RLIywtgRL!_#^ ztZ*nlC$X$u69^hFScq$`D8&^Q$gyOTU^lFjK5-tQwO!{jTW)b#>f2;&z0YB^{zPMG zA8j{l{ejNWJjaQeYXGZpnXvfl)pbM!X!V>O1H&Rt$9X$N+2@$Zz-JyFsc%C=65l5#1l~`GjhKrGOKpqt zEsP6uY<~39)&F5MzS?H|^!&FkKHdDwxx3RQw|`ju&rimu+g`u9_veTAFMQ{x5{?Ag z$_7IfRzpD|i}3&D+}0_W3KP>6fp~ z(Hz`}VMk}du!~AE>LwRVcv@m(zA9|U(-|6Yc7cZ!cKk6153fEK=cK;m(B_)vjFFW6 zdj?}i;~G;36~Rqwuu^*m5H>xvuq}CHZCkj8hyOk(u*6FipwD8@8A3H41f?#=Qr zW@dUA)AQV}IeYD$_Vdo~Ne;qGV zj@4Zz0L@jHMQVgo|C|dq`~*UpCsda1DFf0zWWbFtg|gCLot!h?I60)s^^%#q6 z_jb-VR+QQs({tR7VQIk+Y<=>MJ2+M4+48$0lO5`!YJ+o2Ix`~kbn)?fJL6(&5AXG; z8O`;n8QdE%Fx_f>Y;}ll;Q@@vT!C?=BRb|_PaJTu!$w?f(Gh1mVARnT9<#P2j=I}9 z4trbq59j)3Huj~|W}MEgi(1dkk68Be%X{eLlk-?&TXvmiQMU}EEyo$OzDbDQIU@wM zr^xrXZi&@jkaMf92;thBC`k8D0-5XM@eoc%v%wvp}6&|QrglUFlfZBG~0;{}^m^a)CdbK^N!m()#Ta`J$oyHGWYbvM^_yw@W|d5 zAF-!5Dz5NAN^pLEa#&G+MzHQsl}qzzxu>lsGGyzH3_H5uL+(z(K{q?zu(J{!ce299 zooyu}0bX96k%2LqNUua)X>?KXU|wVF>2h_@dU=8WVpLGtMF;1i%M$DAvwUg892aew zf;b&>BD8r~hSkpyjFx$V-o7aUYp;u-s@oVx`;=VwyyFXsKNG^Dx0q0U3&M5h*s%U4 zDrkBlu&BKQ;SE>Wp#CRAgg^&DXTY@RNEONvx7c6#H2k^1{U@RBprLKvA)vUu;iE~ z-#t-neklPOm+aL3u=tF=h}g{D*r>vR)Zl{dlZzdSEze9+s07z%I@4+Ppv`h9IA zL!JtY13nH8`$D~gTT2QWGK%ta=^2UY!kTy z@^w4gvU#bn;UoqaR-~Bvs;#*6yqsIJNX|Vji@^F@Vx*dkw@r5up!tQ6U-7HVvfzWI zb>WXTwnabKIpzGUbSQX?OVtlJc*7^9-ClBxjWR|?1U+`J%Dbc#l6#$4?Yb0FlWQo= z6@uM(9|P2PIcD1X?C*6y1G^hO(;4+|Sy1C9g0{>NB8@S<)b(RPM)XfM5xJX|-j&%D z%83vOeWJ9ATr6q*QlfkO6QTzLW8%7flj2&v(=&R)V+-~tg(Yi4(n3mHN&{^KBLUX@ zkzgCiV5mybA7pJk5Mb-vALSFPPme1vOHJ07XYA?C%g))qXK3K8-Gdu%wtsl`?!P^| zdU3~EZ;R?^ba2*MbWrN~h=9~NJIl&L2%~F`jJY?gL}hoa_@(5=Z}SZ?+(2?sUx28Z z4W?P^4KAerK`gHMQ7$ih>F$~SIVdd5=n;_k5EeGxF@tnQxkI+mD=_wh%5Kkf0a3T* zH!A|5`MeCRCF4oc9X=Va1>DN}3={oRbXU_$)U@gY)m;6C4(P7KJpCezXf;OU`n_>a zO1Yv8E<58KSQ<>(F{|Q!JCmL1Se#n#zQj*o11&WhJ~W`)7NV35N2rwhgOrNl02`;lm6Q|#D zSJqzB*Vi904vtOQH0JHiAomoTd;IOoFXSeMUP}s(zvyOLv?(QO=NY@YZjrfmS0q8efA<^-oMta~~2m z-^Fay#<2XLdsd-E%WjdmWdg}igblvWLiqinuLq|+r^+?QrVy*~?{dltY)}=3)!G&X z7RxK$vjoj9X@t%_L)4^#&>1(O@Ti}ab+q4lu|~Y;-LS1HP8d-3yr~>tg|7FhelZt z+F-Lcs#cX3QmQEN%N5o7W{c|r^JG;R6Iit%c++w*G3nxHJro%g*ANnx)#UC`*5T{d zsm;z@PcJFF7F%6$HLSQ`Em0MTOR%|i1EcAe`1IB}0ke5p$k9!Up_X|uw_y>4Ivz+Yt8YO( z&BdLx-bZv)`<#udA5$UiQx4kj2tpek;<%dJk7>Bgg&Xg45t0jB{}A9b-(Z;=HsPIy z4W7CFniQ!c=RVDs>0E=+Gd}j7)Td;{DYPJp3m^IJZ@;_8;(fQ_6(MUH+gIpYROp&U zYNXgpttg19x66*LR^>*NSrrB6TU3M;$SNXBtxCv@>{%|CJI@Bq*Ki3q?H=UQ?iLW! z?(S34mX>~WZ&~rB_@ce%lPe2XxQBL%f-3-3M=~*x<7mqTu9;?yPuDL?*xGpuKz*8=w@>nc_8A<|Eps@A z+k~+8CX6>-WpG-bqWt<7JZaT)m{31Mh=#``mnR6Oe#phtB$F*h^^XXw_8tm1UI1vV zOPIM~PDs;F5%e~4o!xOwU|ILkH!gln=2qQpX{U1$u#azN{q=%{2X|cCSKxJap_`YR zm+NK_p&QFud=LM0U535*k*};9E&Ds_vEZw37Tz`hg)=fc-?lWw1 z-pZhNUPaKRn>bN_n@7}4a!NKk#9 zPwwTR?3R-lwe6^Y-r580-akfw?GJqe)33Pt=8fArsv|knDO1xwUlY2)6WP_#DJNz+ zWNrHNKsOK0uurC}HoVSdZ&-z@D6~vjvSpD~s=|1+!`|d(mux=5pA+!8r^!A2dCX$> zX-gMk)Y{#4&^IJqS5z{b+*~^snwij3kRDlGUYJ&vo0FJa939}L3G{I8jIg)vD|J>H zbT*Qfb|KPr!cs)8TLg`(mg8UHee8K0RzYFs>3e+>MToCpTVe_3m~}HsJS5GG}l!wmi6~LBA(Z zU7wWV<_34mRHjqGd+keu%bbcs%Tc#lx;1{=FfA+1ix2#6lp5S3^YeJ%V1LtV2O5mC$)TDh?#%Ml)Z#PUJ-}X%lDQ#yZNZmy~ zx8VkgY42gY+9zUB^*ynm_J)O^_8d8vpGTPnQV05r1WN8p!A+03L<6ap`X4}|{sDxm zZi%Y*czFr|BtOY2ipzB!^H=>20J)|Hc<&L!QhHtN!Fr@G)Ug`w#{g;#oQ zbVgjHs@{^n^Ym`>KU`&t{=O7h##Sv(J4Er)hi{n!#g3t;E@{Z z;?)`EY~LH{t7wl3mFt6o#O?lpR_(z-zAgSfq3ynIVLg6s!QKAuE^huOOaj-iaM4Y{!Xx}~)Gra+*+ zL-6Zva(VSvFrslo#BZFH;mrqxoc1=@Y=1Y8vv2SB|2bDL0QdKM*;Q4GkUovCeN9n{ zS4m@gPN+wmwc%UlpD&=Cznw+d|1mFAnx5gvzdseW*R?vOJ}@ms@0%W{b<2v^x$jBt z@J&f<^G*$Ga@-s1?P-YiaWzEwIT#`XRjm<0qy^iyLQI;nN)AXV>BB zA|9|+f`=3qv=a_?+%b0n<9H6r8K3p_%fB2Dv}X##4JWD8{__~5xx@z>7ZKC84LPUg z7qCqeTlff{-QaEF1%>1n}PeXRsp&%g(|M+Iox zF(J2QT`8~LRLHBha{H&ngl34(>C|DS1C{vhky65JqztBw6@!e4A|5UOa6x5x!mR4>^#Z{+7e4T-Sd+LNxUnQSCP);z1DslR7J@-%yBVhplwi9?vv@nkGx#RsiS(UQIWX&BsinB5*3Dj1 z>F=U040cmzhP$bgW8Le$d}O_@ev)pHigg%QnxCZe|Go^#w@*iAIalO1hovOzz0;CA zJrha)NsQ9CWCm5Kio8pe`^hDd+c)<}{|WPoF9RGc`G|Z{cPHT ze68A(s{0UWlYPa9%$iEM)V+cxDhlzP!5@l=b}3frsCTVB@w$1r2v#;`9f@{T%~9) zaj|L1a<*!ZcUE+VyDPfMd+v;ibFX*w7Vif|yXQd3t{Il-yIDxKVjE7Unfmct2i<)r5#MzTi3)ZmnKskBAQ>^n3K9DFUW7K0iBb%N&O}Rtu zeJj_(CrXFBJ2H9IMKMvoCV^{DE3n2o(Ck1lStpi{(?@d&=4iHnHJT;hY}r^gpER;I zC<|kc??IUdQxW>%B$Q4vp&Sc^%_ajt(^KyBUGuSW!Em;hgFeyKy3^ePJ4Dv6%>%6M z8)lSmF4MtXYq$)W65Ha3nS|Lq1>L?%$9Jqq?U6&-)sgARbzXbPby2-rDy|L8lUIip z*_3&vOVp8H#+|LPhxDH>8gV6c;`)V2M2LqjHqx&t*x#)!DK@-j`s7iO@z)RAjGuq~ zVxQjp^wryY=l`p#IwQu2y6wb~~ zI%d8EOE}ZyafMA#7n!)}f=~e-D^#Z@2j|$;IK|_JEepuDstL@ot+tQmwf%EE{{Ojb z@%X2C>cWG)^xhthJrSV+nu!BL)?{Ap-#&hL|C`UB$b8-F=U*9reYWkz-Sux$W4-Dy zvNlMos|cY60JdtKdXI)s9@;|f{xvXw>6q7ZI4O0YUK zIIzD$fD9Dzz~Nj17~QkQgtSBf=U{>mnh598kA)!g6Tu{hP?U8%9OE2~z=0#7DCf8@ z!aNxyBgT9c#F)JRnB*~ct&w%9=V8!n6-Mbx4A5*H;Bgiyu-P)3$36oH*b96G_aqCa z%z`}HOm0O|mRpQmuM9%^RAG3RU%G9*Z?bKp+>bjD9^$Bt2zAm#gt}~*Hax^tPsUY! zWT=-mD%`I*z}HQim=IldU}V4jgZsC?+sa36*}HddzW(Kx7r!?ef7-UbdIZeLj4Vn| zji^{$oW_jC5C38$bK#_~Z8N@o{X63?ueZJ5STY$(jLfbefPsDsyk*ALqWX}W&}&89 zt|A;7%7hsQ(;)hhEIxD~T?mcF@qvRRkI5j6am){8Oa>6_qu~;4ES!%V3_w^X!cg#N zlm&mJE+Zy8(AknK;WS&oIJ>{p9*||yBooRi6QM1V^@l4In6gGi=&MYexkz%FLxsSM zNRA(uI||15_P`;fAJMN06!!$Ay4Cu`J2xR#WdFeqU${huxsqJmv?LQYk#)wa2$#0Nfha3fvc`=H(N-xiZOsfMYcxU1SsF}VWg*OE zHkYx)6+mYMa`Xh(l07MLB@W2kgu@SPqZ@0aA`_orXethuP>kqGebMEnl?JIZI zOs_q>{N0CNUjN?sk<`;KWIp`O=YKVR`e$DJ?fW-hy?XoX>n}OJU!MN4p*x(hhR zg5|_$oJzVs#zEen5aOm$Sz(9Bn)FowB)Q=9d4Nk_V#177CYQBBg&FH)-Rh>#gdeSUTi(4U~>@Anh14*My%BQ6%eA$M!;sK1k_ z-%So3vV?Zcc}u{z5nyBdDsw8sGGPih&``P%GWb*o7KN(+dd-nSNUzRp!IFn1K zc-J1@{PxpU-1$uEY35pNN2$j62|>SzTXbaTRoeY_;SPIkzs zjBh&aY6(ol2iZ4!d&>Hi*2obapEko2GN%O+h^%Xer!g@ygGuqzs2H1ph3G6KK<2iN zAPz1vVdfeOVypo;YYCA7r!Z^yI8#KO!>zf;1a`thRD!k?8026ex#+_qJic%V4gWt} zG+(%owb1!RS=pNxmS~@hFUfcQC3x53jy@_5Q^lU%!3wweiDK(%*h0 zfB$sbt4oVJa=h(z{sQ2zzX&`OW>4xv0Uma7;Ep;tpkoRf&S86d=zy<}xHHIG(&6Dm z^!xcJy6qkLBQgbiR4ju|2&K?TOvpKn3ZXM3o704hKZQw&Q@9216nTCU7vs|q0nI}g gut3J&S*5#dSm`Al*5?+7;08999:A9A8>1=.C/H2G/B)B+@)?(?)<&=(F0UDKIX67E+.B009/-50*63*3/#2*:-$9&"P:=pXhmy}lPNdNTdrusuPS\5,#5.&7/,91/90190160061-52)42%31"1/ //#00&10+7./<+5=)49,38439:4<>3@>/E<+U;*d9(z8*9/<6C=IDKGGBB9<38,>.F3G4D0G3B.>+>*=+?-G5TE~OIT87?+*?10:5176166,0.";5)=3)8)$E24XDPwav~|o@AS;AMX_ilqwOTX3,"2.%4/)50-5//4..3--2-*30+2/(1.%0-&0,)2.-3.25/3;,3;*0:)/;,/?10?40@6-B6*M;-V9)e7'x6(7-=7E@IFKIC@:64-7.?3B5A4>28,4*7+;0@4K?[N]RQC:90)63,36/27017-*-"44(51&5,%9.,5,B<0E<+P;(_9&u7(;0D;HCKGFC>95/5/;3<4:2:3708.:1<4D:TJi]|kb_NBD64:.(2)'2*,6-,4)+-"/,#62)81+1++cafoyxanedqhxx]i[/,#..$1.'/.)0,)/+(-)(,(',(),(),&*+%),%,-&./'2,+0'1(&1#--%5,'=--?11<42581/;/1?.9A*F>'Z:%t;(A2F:F=E4=4~:1~>5@7C:E;E0=.A2A4=1=2@6?6|<3p4*q8-t>4yE:}K@\Pwizo_y\G`J(@2.%.)%.)-0)..&+)&&&)W_TȴpgEX:33344256167167156043.32.4013/03-11+/1+/2,.3--01))6")926%<5-C54D47=28726/3218079,=4#L-_,z2#;+=*B.B2>/;.=2=1~:/}=3w;0s=1wF8RDeV}nopelZg@fQ,H<-E<3K;;L7@5?A4DD:GG?BA=BA?=<:?;8>;420#0/A?*=5"@4$I;.SB;T@?O49P/8Y1Xw$4WU.'j]MwipomsqpzogN`F62@87?=;<:=?=>IHCDE79;%<:#RF6OA4L@4M@7M>9O77R/5Y*2i*5=C;KC^WZUMIKN3?1H8V>bAkDrIwOxbMc>6CD4GH8HI;GG?HHHPOUECN54<6689:459*69&20!<:-CD6FF:GE9J@7P72Z.-q12BFFK7:32>9?54&=+8&6&:/<5;8;8>95.B8K?THYPLE<8<<=C=H@TB]BeEjKqTvidw^f][߽Ƈxs6.94-450-:8,BA/GH6II=IHD]\d{zzxWXm?AP69@265381/5+?B7GJ?CE8=9-@2%H,!S$|91?:>95.4*=3=/5%;(<'9)6*4-5.2,/&5(?1L=TEM@;20+33HIIOKXJ^IcKiPpVtYqcrjqabù>5:91/6/%63"><'ED0II?KILc`uᦥъloMRh7=I;CE;@::;5B;3SB8fJ>sI;yA2G8A1>.A1C1A0A2E4B.I4G7>16-5+1)0$5%9&F5P@F88.61<9B@DFHPKYNaRjTmWoUg`kouYZܬI==B92<5%94=9 CA,JG@KJR]Zy{~[^}MKYC8>G14kGIhgupi`XJK9?*='D0E3=/=2G9@0F4E8>4714-3+5)?19(F6QBB96175:9C?DBFIMTSaVgUgTe]i]esvVXzySF@MC7H@+B<"?;B@+HE@KIWWRzᔍwZnJ^Xjft]fKMA;A3=*:':)7)2+.-534,5+2-3011/0/.2.D;7*D8SID@5617.3D?C>B@JMW^^i[fVamucg}[[vBD[JBYI:=OK=2C3@05&.$1+./)+-,%%"$,-4433203/:4*$;5RMIG=?8>255/5+7/E@XXfkhldhtwgitqa<6^E>fKDhHIcA@^@8\E7VI6IJ:S__s˙ꜛ阍٣βz_|CT@MHQBG>>DAIAB8;05)6+8.8/5.1-+/ ',1:;2/)$1,94:6*'21BCGFNKJH3/8/@21!@1OHmjYYferqqnmgk^ogR_M?bNEfHJc@Da?=aG:YN2OO3@N=WjpgvȌr`9^F]8DDMMP@@60;2@6;13*,#.&4+90;2636>'3,34550:3F>F?83/,/01231;7CUMBWF>ZG9^M9ZT4TU5HO=QY[UTstfyzoHd5I2?DNKN::2+<2F:C7:00'/(5.949744,4$.*046:7C>E>92E?LGFB:64/3,>5NE90B//1*A6H7<4/%\Tx~gwN]QSN=jtQkdypoͭDY2EV2IR7QP;UO9VN7TO2RN5KG;XOR\J`^{u__S]BN;?9?4:057>>D4:03<=GCMEQGK>E8E;C8A9F=0 1%44673/IEj}QmIb>BzK9gm^k_aUvgyi{nvul_[T:\Q;aQAbPB^LBZHD]QQf\dyrãęqcTQOOONC?92C9NAF87*@3A69062?=EGGKLNOSIQ:C1:IOdhjiQJI?F9C4:/;0921'02$,-/467;@xayLiG\}))eB,dv_l`lbo^o\yhsteeUbL>aK=dLBfMHcKKaNTk]nxovtyz}~ΦldlciaOG6-<2J@J=6*A5A64*.'84AAFFXZcgYa5?'4FQ[bMO>;5+>2E7;/=4>8-%7#7&*(,25a+bEAeIEiMIcIHaLStcuvzt^^vz絲\P`PrshWNC;-#<3?5D9E9A5:/8.8184=>[_MV5A7A8?4<2<5621)7$5#3..34?9LgJfWj>BiL:D?^Y1~VL9`SbMgNbFX|>Uw;Xy@M47W??_JGfTRnajukrkkgrqԗ䚠ޜϣǑtjruXJQ;m\ylxnc[7/.%3(7+4?+67<66;9>8=4:48331/(5"8$?67:-9I^RpOiPY[5,IE,17bY2fm:K}4YIfLkMeH_@^}AbE9.2D;.?1A4A834BG4<"+,70:*41747::;885868521/(5"<(C6:7,8ZpC]Sfk85/<[iEVgN[HkOnMiJdDeEjJ0.388803(:B3Xc]WamX]wxׅԌ͑Ívq`ptXM~P9]KqalcOH2*1'6(8'=,B0D2@2=2:211;?5:-17=G^oEWGOU>0 /DY8Ȥ~RjQgTkOlKhIgHiJnO.-2352'0-;"LZIR`agmΝۉċ~urdskTZXNQBSE[OMG3-0'9-8&6":'B/D5<04-0,-,67:;<;FFKLFH@D385:6:89<=@>=9709*>,4$;3^bV^NRj1*&& ?W5}láxWY1]{EhUgMfIfIjMpQtU=6=>=87<%9D$GU;KXN^ex{qxjw~rtla[bYTiPKTILB?6G@C>4,8-8);'68!A.E8>6634375=;B?D@D@FCAA:<595:497:>>C??88.8)7'5&MAllPOXOL3ET3ndzsWW5EM&dPdSfMeIiMoUvZx\\GPZKHWQ7UW2QY4NVAVY`eb}uog]cXfb[U[V@ZY:_`AmYATKMI75<9?;:1B57%E-: 6?)B6=8799D>>77.70;7558;5:3;4:=>B><45)8+);,YKZTVLhSdgHxlojMG="$(0@jXm\lWhQlSs[v\qYnU[gTPj^HkfFccA`bJdc^`]f^Wg_Wd`XURM:ED%TT.ce@oZ?YPWV>>;9855.F8:&I0:16!;.7248:>B??8?6:/0$7-F?GC>>;=8<9;@=E:?15'<1>3[O@6^Pu[~YoK. 7170?I&1FgVubu^oWpXt^r\gRn\Zl]Vk_QjbMicMidNicSicW`YOoi]e_OZUANI3HD+QO8X>-~71^_ac9:**94=36&F18 ,.:.B;=?>>;7>5<1:/;.=2>7?8IFHFFCA;=19&:$;'5+3-<5OE_TaSjXDOM4!* =H(BI*=G%(63ElXxcoWv^{epZaMZFk^Vk^Ul`Tl`RjaPkcPkcNkcLvpZrlVfaKlgS[VC<6&@:*S;/k,'76\\`_<:51D>A64&8';)B3I>KCCA@=;5?4=0;.:,:.:191>9>8>7<0:)9#|:>;@0%kG9RCRDSG^VYSHEEFCH@E:=76A@J1/<".= /@ 2C#UdCzd}bkM^@]A`H]Ej`Tj`TjbUjbUjcSkdTkdTjdTmgWxrda[OYUIzvm}tU;*I)P+a6%s;.LCRO>A@HAL?H;C@@H@F:A25(9-:-=.>.=-;/:/7-6-6,6+{7*s8(l7%h7(e1&tB;VM`W}aVm[OWP@ED2:?+@I4>J41?&,: /=#HU9u_|`eEX}:]AbH]DkaUjbUjbUjbUkdTjdTjdTkeWe_Qa]Q`\QܩW>(I3P:%8 qE:|kmEMFQJVIQEFA;B5H93'8,:,;.}>/|>1|>1}=1}:1|90z7.v6,s7,l7)f5'a3&X,#nF>}[QrVKXD9B6*2/ '),3#:E4AN:.;')7 ,:!CP6}jt[_@Wv:bFfLZxBjcSicSicSjdTjdVjdVkeWieYnj_d`Wsnhԣy_P;G<*VM<ӽrvSZ:@8=>=@;B7J=5,:0:/;0{;/x<1v>1v>1r9.p7,n5,l6,l7/i7.e5+_3*R-$aC9jODZF;H:/A9.??3=A3)1",9(5B1,9(0;*.:&?H3vd~OSp:Sp:a}Jb~NPlHEJD?5;/:2>6<3;2z<1v<1r>1q?4h8,e6,d5+f7/h91i:2f71^6.cE;^H;P>2<.#2*53'57,-3'2<1)5'0<02>0=H8/:)3<+sWmFIc6Mg:_xN^tNF_8heRifSifUifUheVhdXjf[kh_a^Wrql͸~{jxviʭrj;2D:NDF;@8:4{5-w4,|=4x?4o=2e6,c9-_7-a;0hB9h=6a6/g73kD=ymbTG?3'91$:8,46+-3).6+,6-)5)*6,.:.2<17?2@F:FR>=P2I_;MbAavW]pT6J/gdQifSjgVifWhdXgeYif]iiakjeĻ٩UH6*F;8/@8I@E4oE9^:.^>1X:/V6+^<3oHAtICeC:rfYRB93%42%68+14)*1)*4+)5+'3)'3)+5,/6.08-8>4>F78G0BV;EW?YkUTeR.?,feQgfRihVhfWgeXeeYgg]hh`ba\|}wij|mM>K@u?5p7.s:1n70r@7l@5_9,\?1[A2W@0S<,X>1dF;oMCmQFqeWMJ942#23%6:,28,.5-.8/*5-'2*'1))3*+2*)0(.3,4qI=_>/_H8UD2XK8`S@WF4G4#\B3zdVaZHEF445%58':>07=15=25?60:2,7/,6.-7/,3+)0(+0)/7,/=,6G42C0CTBFTG,:-cdRefTghXhi[gg[eg\ef^fg_kldsvmýѯ{UJgA6_=1\@2]L8RJ3WS:][BSO6E=&VG2pcP\ZEIK6<=+B4;A59A69C:7A95?74>65?73:3.5./4-2:/6E29K5.@*:K8>O?*;+bcQefThiYhi[fh[eg\ef^fg_kne|ɺû~\P`>2`@3gP@WH3UQ8QQ7HL1PP4^]Ac\BYS;_]HPR=EH5AE4?C49?17?49A6;E=9C;:D<;E=:A:4;44927?2IXEI[C8J4?P=BSA1B2 \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..3aabb1a47928d8c94caccd4b04c5c794a0c57128 GIT binary patch literal 13192 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..a24c98deebb38f30f12f02923ee98dd3df5beb01 GIT binary patch literal 13192 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]]]]]]XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXbbbbbbmmmmmm[[[[[[@@@@@@333333555555222222111111333333//////))))))......))))))??????^^^^^^uuuuuussssssSSSSSSTTTTTTwwwwwwvvvvvvOOOOOO......//////111111333333333333333333222222222222111111111111111111111111000000//////............111111000000111111555555999999<<<<<<============BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttuuuuuurrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[YYYYYYTTTTTTRRRRRRSSSSSSTTTTTTWWWWWW______gggggg\\\\\\@@@@@@111111555555666666666666555555------333333333333,,,,,,777777IIIIIIiiiiiiuuuuuu@@@@@@??????______uuuuuuVVVVVV------......000000111111111111000000//////......////////////////////////////////////////////////111111000000//////111111555555777777888888888888AAAAAADDDDDDEEEEEEHHHHHHQQQQQQaaaaaammmmmmqqqqqqvvvvvvqqqqqqffffffZZZZZZWWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF222222333333444444555555444444++++++222222111111......000000333333^^^^^^zzzzzzLLLLLL999999::::::UUUUUUIIIIII::::::,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,,,,,,,------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiirrrrrrnnnnnnccccccXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRROOOOOOOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbssssssiiiiiimmmmmmkkkkkk,,,,,,------............------,,,,,,******))))))((((((((((((((((((((((((((((((******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^VVVVVVTTTTTTUUUUUURRRRRRNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------------222222111111++++++eeeeeeuuuuuu//////000000111111111111000000//////------,,,,,,************))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444000000666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTTTTTTTVVVVVVTTTTTTNNNNNNEEEEEEHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV777777''''''))))))++++++......------''''''%%%%%%&&&&&&ZZZZZZúooooooJJJJJJ333333444444555555666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999666666444444333333777777888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuXXXXXX>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWW^^^^^^777777888888999999::::::::::::999999888888777777666666555555333333111111111111222222444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[[[[[[[eeeeeeqqqqqq~~~~~~]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||wwwwwwSSSSSS888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>FFFFFFFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______XXXXXXZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaawwwwwwyyyyyyoooooowwwwww{{{{{{||||||xxxxxxaaaaaa888888444444666666\\\\\\xxxxxxppppppRRRRRR444444777777<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa[[[[[[______aaaaaa^^^^^^````````````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppvvvvvv{{{{{{}}}}}}~~~~~~jjjjjj[[[[[[KKKKKK}}}}}}ǬqqqqqqZZZZZZ111111222222666666<<<<<>>>>>;;;;;;FFFFFF\\\\\\ccccccUUUUUURRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddppppppttttttxxxxxxyyyyyyyyyyyy||||||}}}}}}llllllԌ111111000000111111777777??????FFFFFFHHHHHHHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC999999555555333333111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX[[[[[[bbbbbbddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddiiiiiippppppuuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{}}}}}}~~~~~~~~~~~~vvvvvv888888333333000000222222999999BBBBBBHHHHHHJJJJJJccccccrrrrrrSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~ooooooaaaaaaYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{ssssssJJJJJJFFFFFFAAAAAA;;;;;;999999======DDDDDDIIIIIIXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddaaaaaacccccciiiiiilllllljjjjjjhhhhhhhhhhhhppppppbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvxxxxxxUUUUUUOOOOOOMMMMMMIIIIIIBBBBBB============BBBBBBHHHHHHTTTTTTxxxxxxssssssjjjjjj^^^^^^ffffff{{{{{{iiiiiimmmmmmiiiiii``````^^^^^^ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttkkkkkklllllldddddd^^^^^^ZZZZZZ\\\\\\llllllHHHHHHIIIIIIOOOOOOPPPPPPJJJJJJHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqppppppjjjjjjkkkkkkffffff``````cccccclllllljjjjjjbbbbbbffffff]]]]]]ffffffppppppeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv{{{{{{vvvvvv]]]]]]aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvrrrrrrUUUUUUrrrrrrooooooxxxxxxzzzzzzjjjjjjbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````bbbbbbaaaaaagggggglllllliiiiii````````````UUUUUU^^^^^^hhhhhh¨PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQRRRRRRPPPPPPKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddiiiiiixxxxxxyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnngggggg``````cccccchhhhhhiiiiiippppppppppppddddddqqqqqqyyyyyytttttthhhhhhaaaaaa^^^^^^ggggggwwwwwwddddddeeeeee\\\\\\______aaaaaa~~~~~~||||||uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJHHHHHHIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUWWWWWWNNNNNNbbbbbbzzzzzzoooooommmmmmrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyynnnnnnggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhffffffwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}}}}}}}qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPKKKKKKLLLLLLOOOOOO]]]]]]ffffffbbbbbbwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______oooooorrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhooooooeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzssssssmmmmmmppppppooooooppppppwwwwwwbbbbbbiiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWWOOOOOOOOOOOOQQQQQQRRRRRROOOOOOLLLLLLTTTTTT^^^^^^xxxxxxuuuuuurrrrrrssssssllllllbbbbbbiiiiiittttttqqqqqqaaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkffffffiiiiiikkkkkkeeeeeeeeeeeehhhhhhllllllllllll``````ffffffrrrrrrBBBBBBJJJJJJzzzzzzPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^aaaaaassssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbddddddpppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmjjjjjj______``````uuuuuuvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{[[[[[[OOOOOOMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddddddddeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllggggggiiiiiiggggggjjjjjjggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooo{{{{{{zzzzzzrrrrrrggggggeeeeeekkkkkk<<<<<>>>>>BBBBBBRRRRRRkkkkkkiiiiii^^^^^^ffffffjjjjjjZZZZZZRRRRRRqqqqqqkkkkkkZZZZZZbbbbbbccccccddddddeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]qqqqqqhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmjjjjjjkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{FFFFFF------hhhhhhxxxxxx{{{{{{~~~~~~yyyyyyttttttttttttxxxxxx//////888888111111>>>>>>____________``````gggggg______[[[[[[pppppp{{{{{{cccccccccccceeeeeeddddddeeeeeeiiiiiiiiiiiieeeeeeccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllqqqqqqlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmnnnnnnjjjjjjbbbbbbaaaaaaddddddaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz||||||zzzzzzxxxxxxvvvvvvwwwwwwyyyyyy......444444++++++444444TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmwwwwww}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~xxxxxxwwwwwwxxxxxx{{{{{{999999======888888======NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______YYYYYY[[[[[[bbbbbbbbbbbb[[[[[[iiiiiillllllaaaaaaffffffeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuunnnnnnkkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUkkkkkkoooooojjjjjj777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||NNNNNNOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffmmmmmmbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffnnnnnnaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooommmmmmiiiiiibbbbbbffffffkkkkkkggggggmmmmmmllllllkkkkkkjjjjjjnnnnnnnnnnnnddddddYYYYYYZZZZZZHHHHHHVVVVVVrrrrrrwwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY______dddddd____________cccccc______cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccaaaaaaqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssiiiiiieeeeee^^^^^^UUUUUU______mmmmmmoooooonnnnnnmmmmmmjjjjjjiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX999999UUUUUUqqqqqqWWWWWWooooooxxxxxx``````))))))......777777::::::>>>>>>pppppp``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXhhhhhh______UUUUUUIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkppppppiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWWZZZZZZ______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQPPPPPPMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{ppppppmmmmmm````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWSSSSSSQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF>>>>>>222222<<<<<>>>>>EEEEEE666666000000111111GGGGGGddddddhhhhhhxxxxxxjjjjjjggggggbbbbbbbbbbbbbbbbbbccccccccccccccccccddddddddddddkkkkkkaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@777777KKKKKKVVVVVVKKKKKK======::::::>>>>>>>>>>>>******333333<<<<<<000000444444444444CCCCCCuuuuuuaaaaaaaaaaaaqqqqqqnnnnnn______bbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeeiiiiii333333nnnnnn^^^^^^hhhhhhppppppllllll______TTTTTTSSSSSSPPPPPPMMMMMMJJJJJJJJJJJJIIIIIIJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMBBBBBB111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<``````aaaaaaYYYYYYddddddrrrrrrYYYYYYddddddeeeeeeeeeeeeeeeeeeddddddddddddffffffhhhhhheeeeeerrrrrrzzzzzzttttttՀVVVVVVhhhhhhttttttdddddd^^^^^^PPPPPPHHHHHHIIIIIIQQQQQQMMMMMMHHHHHHAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX777777333333888888555555111111333333//////------//////444444888888======FFFFFFPPPPPPGGGGGGSSSSSSUUUUUUiiiiiieeeeeeAAAAAAcccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhkkkkkkвkkkkkkPPPPPP^^^^^^PPPPPPRRRRRRYYYYYYXXXXXXMMMMMMDDDDDDIIIIIIOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLvvvvvvRRRRRR444444111111777777333333//////111111000000------------000000222222555555<<<<<>>>>>============??????======::::::999999999999555555000000111111555555;;;;;;BBBBBB::::::HHHHHHLLLLLL666666aaaaaaddddddggggggggggggffffffeeeeeeeeeeeeffffffooooooddddddDDDDDDIIIIII]]]]]]HHHHHHNNNNNNMMMMMMHHHHHHNNNNNN[[[[[[]]]]]]TTTTTT[[[[[[OOOOOOEEEEEEAAAAAA@@@@@@<<<<<<;;;;;;<<<<<<@@@@@@>>>>>>>>>>>>??????<<<<<<666666666666999999LLLLLLPPPPPPAAAAAAIIIIIIMMMMMM:::::: \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..3dd4ef071644059790607fe338fc6a2271503730 GIT binary patch literal 26045 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..86082dc318de78a1ac5121dda50b4ded28879c07 GIT binary patch literal 26045 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog.miff new file mode 100644 index 0000000..8d4383a --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog.miff @@ -0,0 +1,12 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=16 +colorspace=RGB +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:......//////111111333333555555555555444444444444222222222222111111111111000000......,,,,,,,,,,,,111111222222444444999999>>>>>>BBBBBBCCCCCCCCCCCC@@@@@@HHHHHHPPPPPPXXXXXXccccccoooooottttttrrrrrrvvvvvvttttttnnnnnneeeeeeaaaaaaaaaaaa]]]]]]XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXbbbbbbmmmmmm[[[[[[@@@@@@333333555555222222111111333333//////))))))......))))))??????^^^^^^uuuuuussssssSSSSSSTTTTTTwwwwwwvvvvvvOOOOOO......//////111111333333333333333333222222222222111111111111111111111111000000//////............111111000000111111555555999999<<<<<<============BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttuuuuuurrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[YYYYYYTTTTTTRRRRRRSSSSSSTTTTTTWWWWWW______gggggg\\\\\\@@@@@@111111555555666666666666555555------333333333333,,,,,,777777IIIIIIiiiiiiuuuuuu@@@@@@??????______uuuuuuVVVVVV------......000000111111111111000000//////......////////////////////////////////////////////////111111000000//////111111555555777777888888888888AAAAAADDDDDDEEEEEEHHHHHHQQQQQQaaaaaammmmmmqqqqqqvvvvvvqqqqqqffffffZZZZZZWWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF222222333333444444555555444444++++++222222111111......000000333333^^^^^^zzzzzzLLLLLL999999::::::UUUUUUIIIIII::::::,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,,,,,,,------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiirrrrrrnnnnnnccccccXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRROOOOOOOOOOOORRRRRRUUUUUU]]]]]]mmmmmm||||||^^^^^^BBBBBB777777............222222000000++++++,,,,,,222222333333------bbbbbbssssssiiiiiimmmmmmkkkkkk,,,,,,------............------,,,,,,******))))))((((((((((((((((((((((((((((((******++++++,,,,,,------,,,,,,,,,,,,......222222555555666666666666444444888888::::::::::::??????KKKKKKWWWWWW\\\\\\eeeeeedddddd^^^^^^VVVVVVTTTTTTUUUUUURRRRRRNNNNNNOOOOOOQQQQQQTTTTTTUUUUUUVVVVVV______uuuuuu{{{{{{[[[[[[DDDDDD------''''''//////444444------------222222111111++++++eeeeeeuuuuuu//////000000111111111111000000//////------,,,,,,************))))))(((((())))))******,,,,,,------++++++++++++,,,,,,//////333333555555555555444444000000666666888888666666999999CCCCCCMMMMMMRRRRRRVVVVVVXXXXXXWWWWWWTTTTTTTTTTTTVVVVVVTTTTTTNNNNNNEEEEEEHHHHHHNNNNNNTTTTTTZZZZZZjjjjjjnnnnnnVVVVVV777777''''''))))))++++++......------''''''%%%%%%&&&&&&ZZZZZZúooooooJJJJJJ333333444444555555666666666666555555333333222222111111//////......------------......000000222222000000111111333333666666999999999999666666444444333333777777888888444444444444======HHHHHHNNNNNNQQQQQQSSSSSSSSSSSSQQQQQQRRRRRRTTTTTTQQQQQQLLLLLLQQQQQQNNNNNNNNNNNNUUUUUUaaaaaassssssuuuuuuXXXXXX>>>>>>......######))))))++++++""""""&&&&&&111111WWWWWW^^^^^^777777888888999999::::::::::::999999888888777777666666555555333333111111111111222222444444666666777777888888;;;;;;>>>>>>@@@@@@>>>>>>::::::666666777777::::::999999222222111111;;;;;;GGGGGGNNNNNNUUUUUUVVVVVVSSSSSSOOOOOONNNNNNOOOOOOLLLLLLGGGGGGssssssffffff[[[[[[[[[[[[eeeeeeqqqqqq~~~~~~]]]]]]>>>>>>''''''%%%%%%//////******777777JJJJJJaaaaaa}}}}}}||||||wwwwwwSSSSSS888888;;;;;;????????????>>>>>>@@@@@@DDDDDDHHHHHHAAAAAAAAAAAA<<<<<<<<<<<<;;;;;;//////------======555555666666>>>>>>FFFFFFFFFFFF======::::::>>>>>>222222FFFFFF]]]]]]eeeeee______XXXXXXZZZZZZ````````````^^^^^^``````bbbbbbZZZZZZQQQQQQUUUUUUbbbbbbrrrrrrrrrrrraaaaaaaaaaaawwwwwwyyyyyyoooooowwwwww{{{{{{||||||xxxxxxaaaaaa888888444444666666\\\\\\xxxxxxppppppRRRRRR444444777777<<<<<>>>>>;;;;;;>>>>>>HHHHHHCCCCCC888888888888HHHHHHDDDDDDBBBBBBCCCCCCBBBBBB>>>>>>::::::999999>>>>>>UUUUUUeeeeeeaaaaaa[[[[[[______aaaaaa^^^^^^````````````bbbbbbffffffggggggffffffiiiiiioooooo``````iiiiiihhhhhhqqqqqq~~~~~~oooooorrrrrrkkkkkkppppppvvvvvv{{{{{{}}}}}}~~~~~~jjjjjj[[[[[[KKKKKK}}}}}}ǬqqqqqqZZZZZZ111111222222666666<<<<<>>>>>;;;;;;FFFFFF\\\\\\ccccccUUUUUURRRRRR______aaaaaaVVVVVV[[[[[[^^^^^^``````cccccciiiiiippppppppppppkkkkkk^^^^^^jjjjjjrrrrrr{{{{{{rrrrrrbbbbbbddddddppppppttttttxxxxxxyyyyyyyyyyyy||||||}}}}}}llllllԌ111111000000111111777777??????FFFFFFHHHHHHHHHHHH]]]]]]||||||{{{{{{ZZZZZZBBBBBB999999555555666666222222@@@@@@HHHHHHCCCCCC999999555555333333111111MMMMMMXXXXXX[[[[[[SSSSSSTTTTTT^^^^^^``````XXXXXX[[[[[[bbbbbbddddddaaaaaaddddddjjjjjjgggggg]]]]]]ddddddiiiiiippppppuuuuuuoooooo``````[[[[[[bbbbbbxxxxxx{{{{{{}}}}}}~~~~~~~~~~~~vvvvvv888888333333000000222222999999BBBBBBHHHHHHJJJJJJccccccrrrrrrSSSSSS======AAAAAA>>>>>>::::::<<<<<>>>>>FFFFFFKKKKKK^^^^^^¬aaaaaaMMMMMM<<<<<<888888RRRRRRwwwwww~~~~~~ooooooaaaaaaYYYYYY[[[[[[hhhhhhllllllgggggghhhhhhppppppggggggnnnnnnqqqqqqnnnnnnjjjjjjiiiiiiggggggeeeeeehhhhhh``````llllllxxxxxxllllll``````bbbbbbddddddoooooooooooossssss{{{{{{ssssssJJJJJJFFFFFFAAAAAA;;;;;;999999======DDDDDDIIIIIIXXXXXXjjjjjj``````ssssssppppppffffffeeeeeeaaaaaaaaaaaaddddddeeeeeeeeeeeeggggggkkkkkkddddddaaaaaacccccciiiiiilllllljjjjjjhhhhhhhhhhhhppppppbbbbbbnnnnnnsssssseeeeeebbbbbb\\\\\\nnnnnnkkkkkkllllllvvvvvvxxxxxxUUUUUUOOOOOOMMMMMMIIIIIIBBBBBB============BBBBBBHHHHHHTTTTTTxxxxxxssssssjjjjjj^^^^^^ffffff{{{{{{iiiiiimmmmmmiiiiii``````^^^^^^ffffffjjjjjjggggggddddddZZZZZZYYYYYYeeeeeennnnnnllllllhhhhhhiiiiiinnnnnnZZZZZZgggggg||||||ttttttkkkkkklllllldddddd^^^^^^ZZZZZZ\\\\\\llllllHHHHHHIIIIIIOOOOOOPPPPPPJJJJJJHHHHHHJJJJJJKKKKKKGGGGGG[[[[[[rrrrrroooooorrrrrrllllllllllllqqqqqqppppppjjjjjjkkkkkkffffff``````cccccclllllljjjjjjbbbbbbffffff]]]]]]ffffffppppppeeeeeeYYYYYY______ggggggiiiiiiZZZZZZccccccssssssvvvvvv{{{{{{vvvvvv]]]]]]aaaaaa______TTTTTT``````mmmmmmzzzzzzggggggQQQQQQTTTTTTSSSSSSMMMMMMLLLLLLPPPPPPQQQQQQNNNNNNHHHHHHeeeeeevvvvvvrrrrrrUUUUUUrrrrrrooooooxxxxxxzzzzzzjjjjjjbbbbbbffffffgggggghhhhhh______ZZZZZZ^^^^^^eeeeeehhhhhhiiiiiijjjjjjrrrrrrffffffeeeeeeggggggbbbbbbffffffooooooppppppeeeeee^^^^^^``````bbbbbbaaaaaagggggglllllliiiiii````````````UUUUUU^^^^^^hhhhhh¨PPPPPPPPPPPPMMMMMMJJJJJJLLLLLLQQQQQQRRRRRRPPPPPPKKKKKKWWWWWWXXXXXXppppppiiiiiiddddddiiiiiixxxxxxyyyyyyeeeeee\\\\\\ffffffllllllqqqqqqaaaaaaZZZZZZddddddkkkkkkhhhhhhhhhhhhnnnnnngggggg``````cccccchhhhhhiiiiiippppppppppppddddddqqqqqqyyyyyytttttthhhhhhaaaaaa^^^^^^ggggggwwwwwwddddddeeeeee\\\\\\______aaaaaa~~~~~~||||||uuuuuu}}}}}}||||||||||||KKKKKKJJJJJJHHHHHHIIIIIIMMMMMMQQQQQQQQQQQQPPPPPPUUUUUUWWWWWWNNNNNNbbbbbbzzzzzzoooooommmmmmrrrrrrllllll[[[[[[ZZZZZZhhhhhhooooooyyyyyynnnnnnggggggiiiiiimmmmmmkkkkkkggggggeeeeeehhhhhhffffffwwwwwwwwwwwwffffffSSSSSSaaaaaauuuuuurrrrrrdddddd``````VVVVVVXXXXXXoooooohhhhhhllllllggggggdddddd]]]]]]}}}}}}}}}}}}qqqqqq[[[[[[mmmmmmNNNNNNMMMMMMNNNNNNPPPPPPQQQQQQPPPPPPOOOOOONNNNNNGGGGGGRRRRRRRRRRRRkkkkkkttttttllllllccccccXXXXXX\\\\\\eeeeeeccccccmmmmmmrrrrrrooooooffffffhhhhhhppppppllllll______hhhhhhddddddwwwwww~~~~~~eeeeeeVVVVVVMMMMMMZZZZZZlllllljjjjjjbbbbbbffffff``````______rrrrrrggggggmmmmmmmmmmmmjjjjjj^^^^^^ssssss}}}}}}ooooooYYYYYYQQQQQQPPPPPPQQQQQQSSSSSSPPPPPPKKKKKKLLLLLLOOOOOO]]]]]]ffffffbbbbbbwwwwwwzzzzzzooooooiiiiiicccccc^^^^^^ffffffkkkkkkcccccc______oooooorrrrrrffffffhhhhhhyyyyyyzzzzzzlllllleeeeee______hhhhhhooooooeeeeeeaaaaaakkkkkkssssssxxxxxxzzzzzzssssssmmmmmmppppppooooooppppppwwwwwwbbbbbbiiiiiinnnnnnllllll``````mmmmmmzzzzzz]]]]]]WWWWWWOOOOOOOOOOOOQQQQQQRRRRRROOOOOOLLLLLLTTTTTT^^^^^^xxxxxxuuuuuurrrrrrssssssllllllbbbbbbiiiiiittttttqqqqqqaaaaaammmmmmqqqqqqiiiiiihhhhhhtttttt||||||{{{{{{{{{{{{||||||{{{{{{nnnnnngggggg}}}}}}}}}}}}rrrrrrnnnnnnkkkkkkffffffiiiiiikkkkkkeeeeeeeeeeeehhhhhhllllllllllll``````ffffffrrrrrrBBBBBBJJJJJJzzzzzzPPPPPPPPPPPPSSSSSSVVVVVVTTTTTTVVVVVVeeeeeevvvvvvyyyyyy߱tttttt^^^^^^aaaaaassssssxxxxxxhhhhhhkkkkkkllllllggggggbbbbbbddddddpppppp{{{{{{mmmmmmbbbbbbmmmmmm``````ggggggnnnnnnhhhhhhmmmmmmrrrrrrcccccckkkkkkjjjjjjmmmmmmjjjjjj______``````uuuuuuvvvvvv999999;;;;;;xxxxxxxxxxxx{{{{{{[[[[[[OOOOOOMMMMMMQQQQQQUUUUUUQQQQQQSSSSSSjjjjjj}}}}}}{{{{{{eeeeee||||||ٶiiiiiissssss||||||mmmmmmZZZZZZllllllnnnnnnrrrrrrssssssmmmmmmggggggddddddddddddeeeeeejjjjjjoooooovvvvvvqqqqqqeeeeeennnnnnhhhhhhllllllmmmmmmkkkkkkkkkkkknnnnnnllllllggggggiiiiiiggggggjjjjjjggggggggggggkkkkkkwwwwwwQQQQQQVVVVVV555555^^^^^^oooooo{{{{{{zzzzzzrrrrrrggggggeeeeeekkkkkk<<<<<>>>>>BBBBBBRRRRRRkkkkkkiiiiii^^^^^^ffffffjjjjjjZZZZZZRRRRRRqqqqqqkkkkkkZZZZZZbbbbbbccccccddddddeeeeeeeeeeeeeeeeeeggggggiiiiii]]]]]]qqqqqqhhhhhhYYYYYYeeeeeejjjjjjeeeeeelllllljjjjjjmmmmmmmmmmmmjjjjjjkkkkkkllllllhhhhhhbbbbbb``````ddddddnnnnnniiiiiibbbbbbxxxxxx{{{{{{FFFFFF------hhhhhhxxxxxx{{{{{{~~~~~~yyyyyyttttttttttttxxxxxx//////888888111111>>>>>>____________``````gggggg______[[[[[[pppppp{{{{{{cccccccccccceeeeeeddddddeeeeeeiiiiiiiiiiiieeeeeeccccccccccccaaaaaaoooooojjjjjjbbbbbbllllllqqqqqqlllllllllllljjjjjjllllllllllllkkkkkkmmmmmmnnnnnnjjjjjjbbbbbbaaaaaaddddddaaaaaa______pppppprrrrrrffffffCCCCCC))))))KKKKKK}}}}}}zzzzzz||||||zzzzzzxxxxxxvvvvvvwwwwwwyyyyyy......444444++++++444444TTTTTT\\\\\\oooooo~~~~~~hhhhhhUUUUUUccccccbbbbbbjjjjjjzzzzzzuuuuuu````````````iiiiiicccccc______aaaaaahhhhhhjjjjjjdddddd^^^^^^]]]]]]^^^^^^iiiiiillllllmmmmmmwwwwww}}}}}}yyyyyyttttttjjjjjjllllllllllllllllllooooooqqqqqqllllllccccccbbbbbbccccccVVVVVV``````nnnnnnAAAAAA######JJJJJJPPPPPPnnnnnn~~~~~~xxxxxxwwwwwwxxxxxx{{{{{{999999======888888======NNNNNNSSSSSSeeeeee||||||wwwwwwrrrrrr______YYYYYY[[[[[[bbbbbbbbbbbb[[[[[[iiiiiillllllaaaaaaffffffeeeeeedddddd]]]]]]]]]]]]ggggggmmmmmmiiiiiiddddddddddddffffffkkkkkkooooooqqqqqqsssssswwwwwwuuuuuunnnnnnkkkkkkllllllkkkkkkllllllppppppqqqqqqjjjjjj``````^^^^^^ZZZZZZUUUUUUkkkkkkoooooojjjjjj777777MMMMMMyyyyyyZZZZZZ??????vvvvvvxxxxxxzzzzzzyyyyyy||||||NNNNNNOOOOOOPPPPPPRRRRRRRRRRRRQQQQQQYYYYYYffffffmmmmmmbbbbbb______]]]]]]RRRRRRSSSSSS``````ffffffggggggiiiiiiXXXXXXbbbbbbiiiiiiffffffnnnnnnaaaaaajjjjjj]]]]]]YYYYYYccccccllllllkkkkkkjjjjjjmmmmmmssssssoooooommmmmmiiiiiibbbbbbffffffkkkkkkggggggmmmmmmllllllkkkkkkjjjjjjnnnnnnnnnnnnddddddYYYYYYZZZZZZHHHHHHVVVVVVrrrrrrwwwwwwllllllooooooccccccllllll<<<<<<$$$$$$444444xxxxxx~~~~~~]]]]]]YYYYYY______dddddd____________cccccc______cccccc]]]]]]VVVVVVHHHHHHBBBBBBSSSSSS``````XXXXXXnnnnnnvvvvvvaaaaaabbbbbbccccccaaaaaaqqqqqqbbbbbbmmmmmm[[[[[[RRRRRRZZZZZZccccccddddddggggggmmmmmmssssssiiiiiieeeeee^^^^^^UUUUUU______mmmmmmoooooonnnnnnmmmmmmjjjjjjiiiiiikkkkkkjjjjjj______SSSSSSXXXXXX999999UUUUUUqqqqqqWWWWWWooooooxxxxxx``````))))))......777777::::::>>>>>>pppppp``````````````````aaaaaaaaaaaabbbbbbbbbbbbbbbbbbXXXXXXhhhhhh______UUUUUUIIIIIICCCCCCLLLLLLBBBBBBKKKKKKzzzzzz______YYYYYYkkkkkkmmmmmmaaaaaammmmmmWWWWWWNNNNNNUUUUUU^^^^^^kkkkkkppppppiiiiii``````]]]]]]YYYYYYWWWWWWWWWWWWZZZZZZ______bbbbbbrrrrrrrrrrrrnnnnnnffffff\\\\\\TTTTTTQQQQQQPPPPPPMMMMMMKKKKKKQQQQQQaaaaaaoooooollllll[[[[[[KKKKKK""""""EEEEEEHHHHHH>>>>>>,,,,,,@@@@@@{{{{{{ppppppmmmmmm````````````aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbnnnnnnkkkkkk``````ggggggVVVVVV777777::::::@@@@@@FFFFFFXXXXXXeeeeee^^^^^^kkkkkkeeeeeecccccc^^^^^^ddddddllllllmmmmmmqqqqqqoooooobbbbbbYYYYYYWWWWWWSSSSSSQQQQQQPPPPPPRRRRRRUUUUUUWWWWWWaaaaaaaaaaaa______ZZZZZZSSSSSSNNNNNNMMMMMMMMMMMM@@@@@@JJJJJJZZZZZZggggggllllllllllllllllllmmmmmmWWWWWWYYYYYYFFFFFF>>>>>>222222<<<<<>>>>>EEEEEE666666000000111111GGGGGGddddddhhhhhhxxxxxxjjjjjjggggggbbbbbbbbbbbbbbbbbbccccccccccccccccccddddddddddddkkkkkkaaaaaaooooooUUUUUU>>>>>>MMMMMMۍoooooo``````cccccceeeeeeiiiiiinnnnnnkkkkkkPPPPPPOOOOOONNNNNNLLLLLLKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJGGGGGGEEEEEEDDDDDDEEEEEEEEEEEEBBBBBB@@@@@@777777KKKKKKVVVVVVKKKKKK======::::::>>>>>>>>>>>>******333333<<<<<<000000444444444444CCCCCCuuuuuuaaaaaaaaaaaaqqqqqqnnnnnn______bbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddeeeeeeZZZZZZeeeeeeiiiiii333333nnnnnn^^^^^^hhhhhhppppppllllll______TTTTTTSSSSSSPPPPPPMMMMMMJJJJJJJJJJJJIIIIIIJJJJJJFFFFFFDDDDDDBBBBBBCCCCCCFFFFFFGGGGGGEEEEEEBBBBBBMMMMMMMMMMMMBBBBBB111111++++++222222555555000000666666444444;;;;;;777777AAAAAA::::::<<<<<<``````aaaaaaYYYYYYddddddrrrrrrYYYYYYddddddeeeeeeeeeeeeeeeeeeddddddddddddffffffhhhhhheeeeeerrrrrrzzzzzzttttttՀVVVVVVhhhhhhttttttdddddd^^^^^^PPPPPPHHHHHHIIIIIIQQQQQQMMMMMMHHHHHHAAAAAABBBBBB@@@@@@DDDDDDKKKKKKJJJJJJCCCCCCFFFFFFQQQQQQXXXXXX777777333333888888555555111111333333//////------//////444444888888======FFFFFFPPPPPPGGGGGGSSSSSSUUUUUUiiiiiieeeeeeAAAAAAcccccceeeeeeffffffeeeeeeddddddddddddffffffhhhhhhkkkkkkвkkkkkkPPPPPP^^^^^^PPPPPPRRRRRRYYYYYYXXXXXXMMMMMMDDDDDDIIIIIIOOOOOOCCCCCCFFFFFFCCCCCC>>>>>>EEEEEESSSSSSTTTTTTLLLLLLvvvvvvRRRRRR444444111111777777333333//////111111000000------------000000222222555555<<<<<>>>>>============??????======::::::999999999999555555000000111111555555;;;;;;BBBBBB::::::HHHHHHLLLLLL666666aaaaaaddddddggggggggggggffffffeeeeeeeeeeeeffffffooooooddddddDDDDDDIIIIII]]]]]]HHHHHHNNNNNNMMMMMMHHHHHHNNNNNN[[[[[[]]]]]]TTTTTT[[[[[[OOOOOOEEEEEEAAAAAA@@@@@@<<<<<<;;;;;;<<<<<<@@@@@@>>>>>>>>>>>>??????<<<<<<666666666666999999LLLLLLPPPPPPAAAAAAIIIIIIMMMMMM:::::: \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..3dd4ef071644059790607fe338fc6a2271503730 GIT binary patch literal 26045 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..86082dc318de78a1ac5121dda50b4ded28879c07 GIT binary patch literal 26045 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..0d2b689e1b813eda8d43e6a9e81aa391a2e6412c GIT binary patch literal 26045 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..5326e6c380499c069b8ac3008d500e10a2322f67 GIT binary patch literal 26045 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 ZKcAJw?;|jUh_4kgufafF4A&U`+rNJ-{W<^u literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog.miff new file mode 100644 index 0000000..fc03b1a --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog.miff @@ -0,0 +1,12 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=16 +colorspace=RGB +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=0.45455 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 + +:55,,##66--&&77//,,9911//;;2255;;22338822228833//6644((4422##3322 1100..//////##0000&&55--++@@((55AA))77>>..88<<8899;;@@99>>FF77CCFF55KKCC..YY<<**nn;;**==00AA77EE??IICCMMIIMMGGJJ>>EE88AA11??..DD//HH22GG//AA))BB++@@))??((@@))>>&&@@((JJ00WWDD~~MMIIXX6677DD++..@@00006611--1122**2255**..22##,,--4400$$55((""LL<<==ooXXhhmmzz}}llTTQQffNNQQ``qqttsswwHHLLXX55,,##55..&&77//,,9911//9900119900116600006611--5522))4422%%3311""11// ////##0000&&1100++77..//??))55??''44;;,,33;;2233::9944<<>>33@@>>//GG;;++UU;;**dd99((xx99**:://==66DD==JJDDLLGGJJBBEE99??33;;,,??..FF33GG44CC00GG33BB..>>++??**??++BB--JJ55VVEEMMIIXX6677CC))**@@0000<<44116677114477,,,,00""5577))8866))44++$$@@4444UUEEPPttccvvzzpp@@??OO99==HHYY]]hhrrvvPPTT]]33,,""22..%%44//))5500--55////44....33----22--**3300++22//((11..%%00--&&00,,))22..--33..2277..33<<++33==**00<<))//<<,,//@@0000AA3300BB55--CC55**NN;;--VV99))ee77''vv77((88-->>77FF@@KKFFMMIIEE@@==6666--88..>>33AA55@@44<<2266,,44**88++<<00BB44MM??[[NNYYRR__<<::FF**))@@..,,::22//6655003366--((..""2266((1133&&11..%%4411,,772266``]]hhxxzzIINNTT1199;;22::<>66>>55..//..))--//**//44----33))++--""----##6622))6611++00,,++ccaaffnnwwtt``kkcceepphh||~~aammcc//,,##....$$11..''//..))00,,))//++((--))((,,(('',,(()),,(()),,&&**++%%)),,%%,,--&&..//''22--++00))00((((00##//,,%%66++''??----@@0011==3322667711//;;//11??..88BB**EE??''YY::%%ss<<((BB22FF::GG==EE<>II99%%22((,,%%))22--116600//,,%%44++$$<>....@@0033;;2233335522''77--''<<--..??,,88<<%%KK77``66 ||99((??00<<..AA22AA44==11<<22>>66==66::33ss33**ss77--vv==44zzDD::}}KK@@\\PPwwii~~ooaaxx\\II__JJ**>>22--%%""--))((--))11..))44++&&22%%00!!11$$ccXXTTʶ~~ffxx^^==OO553333334444225566116677116677115566004433..3322..44001133//0033--1111++//11++//22,,..33----1111))**66""++774455%%==44--DD4444FF3377>>1188882266//332211880066::,,<<55##II..\\--ww44##;;++<<**AA..AA22>>//::..<<22;;1188//<<33zz::00vv<<11zzDD88RRDDddVV||nnppssllggggKK``QQ33DD<<''22..%%!!++**&&00--&&(($$**((3355''TT\\MM||||{{~~yy~~zzrrPPddHH7766;;8888::999977::;;55::;;3399;;00999911887722::66559955667733446600226611..6611++7733**7755&&77::%%99;;%%AA;;--HH;;33NN::;;LL77<>@@55??AA44DDDD::GGGG??BBAA==BBAA??==<<::??;;88>>;;442200##00//CC>>**??44""CC33$$LL::..UU@@;;WW????OO4499PP//88YY11<><<::==??==>>IIHHCCDDEE7799;;%%<<::##SSFF66RR@@44OO>>44PP??77OO==99OO7777RR//55[[))22ii**55<>>><<@@::<<22DD44::**::--AA88>>9955337766EEBB9955BB>>BB;;KKCC]]WWYYUULLIIKKNN88??88HH??VVEEbbGGkkIIrrNNwwRRxxddOOcc==DDvv??<>>>66CCDD44GGHH88HHII;;GGGG??HHHHHHPPOOUUEECCNN5544<<66668899::445599**6699&&3300!!??99--EECC66HHFF::HHDD99LL??77RR6622ZZ..--qq1122BBFFGGKK88::4422??99@@5544&&<<++66&&44&&:://<<55;;88;;88>>9955..BB88KK??SSHHYYPPJJEE;;88::<<<>9955..55**==33??//66%%::((::''88))66**44--55..33,,//&&66((@@11LL==TTEELL@@::22//++2233HHIIHHOOJJXXKK^^KKccMMiiSSppZZtt^^qqiirrppqqffbbώ¼>>55::9911//66//%%6633"">><<''EEDD00IIII??KKIILLcc``uuᦦъllooMMRRhh77==II>>BBEE==??::==::55DD9933TTBB88ggII>>ttHH;;yyAA22GG88AA11>>..AA11CC11AA00BB22FF44BB..HH44GG77>>1166--66++22))11$$77%%::&&GG55QQ@@FF8877..5511<<99DD@@IIFFLLPPOOYYRRaaVVjjXXmm\\ooXXffcckkppuuZZZZݫII====BB9922<<55%%9944==99 CCAA,,JJGG@@KKJJRR]]ZZyy{{~~]]^^}}PPIIYYFF77>>JJ//44mmFFIIhhggttppii``XXJJKK99??**==''DD00FF33>>//>>22GG99@@00EE44EE88??44881166--66++88))BB11;;((HH66RRBBCC9966116655::99EE??HHBBJJIIQQTTWWaaZZggYYggWWee^^hh^^eerrvvTTXXwwyySSFF@@MMCC77HH@@++BB<<""??;;BB@@++HHEE@@KKIIWWWWRRzz񰰫ᔔwwYYnnII^^WWjjeett]]ffKKMMAA;;AA33==**;;'';;))88))22++//--553333,,44++22--44003311220022..66..GG;;::**FF88UUIIEE@@66660077..33CC??CC>>CC@@KKMMXX^^^^ii\\ffXXaannuuccgg||YY[[zz??CC[[JJBBYYII<>::==OOKK==22BB33??0055&&..$$11++..//))++--,,%%%%""$$----66445533440066//<<44,,$$<<55SSMMIIGG==??77>>005544//33++44//CC@@XXXXffkkhhllddhhttwwhhiittqqff9966]]FF>>ddKKDDggIIIIaaBB@@^^@@88\\EE77VVII66IIJJ::SS____ss˚ꝝ陙٤ΰ{{dd||IITTEEMMLLQQEEGG??>>EEAAHHAAAA88::0044))44++77..77//33..//--**// ''--11;;;;22//**$$11,,9944::66++''3311CCCCGGFFMMKKJJHH33//9900??33--""<<11QQHHppjjXXXXddddssssttppsshhoo__vvccRR^^NN??aaOOEEeeHHJJaaAADDaa??==aaGG::YYNN22OOOO33@@NN==WWjjppggvvȎqq__::^^KK]]??DDJJMMRRPPCC@@8800<<22??66::1111****##,,&&22++77009922443355>>''33,,3344554400::33EE>>EE??7733//,,//0011222211;;77CC<>TTNNBBUUGG>>YYGG99]]NN99ZZTT44TTUU55HHOO==QQYY[[UUTTssvvffwwxxnnIIdd::II88??IINNOONN==::44++<<22DD::AA778800//''--((33..884488773344++44$$..**004466::77CC>>DD>>9922DD??LLGGFFBB::6644//33,,==55NNEE::11:://66,,:://;;..hh]]{{zzzzwwSSZZcc\\vveexxyyZZttee{{ggyyddssϨCCYY33EEVV66IINN88NNKK::VVNN;;YYRR88YYTT44UUTT66UUXXEEXXVVWWTTGGaaqqUU}}mmyyxxYYggCCPP==FFDDIIBBBB22//33**AA66HH<>5566//55446677//33((--1177//55BBHHWWZZLLNN4455''## 00''CC99AA7799--<<3355++22**DD9977))77,,>>::<<88//&&RRJJss}}QQggKK``MMSSJJ;;cc~~qqssrrzzttuuKK[[66MMXX66QQUU::VVTT??VVOO<>>><>??DD44::0033<<==GGCCMMEEQQGGLL>>EE88FF;;CC88AA99FF==00!!33&&8844997722//GGDDmm||SSllIIaa;;BBHH99hhnn__ss``kkXXzzkkzzkk}}nnttrrll\\ZZTT::ZZRR;;__RRAAaaQQBB]]LLBBXXIIDD]]QQQQdd]]dd{{qqŢřqqccUUQQPPOOPPNNEE??9922CC99NNAAFF8877**AA33BB66::007722AA==FFGGIIKKMMNNOOSSJJQQ;;CC11::IIOOddhhkkiiQQJJII??GG99DD44;;//;;00992211''11 33$$33..5555557799@@zzeexxQQjjII]]&&**nn==,,ddtt__tt``vvaass``oo^^||iippttccccRR``MM>>__LL==ccMMBBeeNNHHaaLLKKaaNNTTjj]]nnxxoovvtt{{zz~~ХllddllcciiaaPPGG66--<<22JJ@@KK==77**AA55BB6666**00''9944CCAAHHFFXXZZddggZZaa55??((44FFQQ\\bbOOOO??;;66++??22EE77<>>>[[__NNVV77AA==KK::GG//7799<<7766??77BB88@@44==22<<55662211))66$$77##::..333333??66LLiiOOff[[jj??BBssGG::OO::]]ZZ11{{VVVV99kkSSjjQQiiOO__GGTT{{<>KK5577UU@@??^^KKGGddUURRnnaajjuukkqqkkiihhrrqqԗ䛛ޝϥǔuujjrrxxVVJJPP;;ll\\yyllxxnndd[[88////%%44((99++==//==--;;++;;//>>22??664444LLPP>>FF**4433>>44??--6677<<6666<<99@@88==44;;44::334411//((55""::$$EE66<<::--99GG^^UUppSSiiTTYYZZ55,,RR@@,,9933aaYY22eemm::TTyy44ccIIkkOOkkOOeeHH\\??[[~~>>``CC88//22BB<<<>,,@@..@@11CC44BB884444CCGG55<<$$++--7722::,,4422776677;;::==88::55996699554411//((55""<<((GG66==77,,88YYppEE]]VVffgg::555599bbffEEVVnnNNddHHmmOOllMMiiHHccBBccBBhhGG..//33559988--55((77DD33WWdd]]UUaammVV]]wwxxׅԎ͑Ïuutt__ppuuWWMM~~PP99]]KKqqaallccPPHH44**33''88((::''>>,,CC00EE22AA22==22;;222211==??66::..1188====CC77;;77;;5577889999999966;;::<<99885533++99((??++==,,7711??GG__ooFFWWIIOORR??00//GGXX88Ǥ||RRooQQmmTTjjNNiiJJhhGGeeFFiiHHjjKK++//22006622%%11,,<<""JJ[[IIQQaaaaeennΝۉċ~~ttttccssmmTTZZWWNNQQBBSSEE\\OOOOGG55--33''<<--::&&88"";;''CC//DD55<<0044--00,,..,,7777;;;;>>;;HHFFMMLLHHHHBBDD558877::88::9999====BB>>??99990099**>>,,22$$;;33__bbYY^^PPRRhh11**$$'' >>XX55zzllġxx[[WW11aayyEEiiUUffLLeeIIffGGiiKKooPPqqSS::88====>>8855==%%77EE$$FFVV;;IIYYNN]]eexx{{qqxxjjwwqqttnnaa[[eeWWTTkkOOKKSSIILLBB@@66GG@@EE>>77,,;;--;;))>>''88::!!BB..EE88==66553333338855>>;;DD??EE@@EE@@HHCCDDAA<<<<779966::669988::@@>>DD??AA88;;..88))77''22&&KKAAoollTTOOZZOOMM22EETT33llddzzss]]TT55LLII&&eePPccQQeeNNccIIffJJooSSuuYYww[[YYHHPPWWLLHHVVRR77SSWW22OOYY44MMVVAAUUZZ``cccc}}uuoogg]]ccXXffccZZUU\\VV@@]]XX::bb^^AAppWWAATTKKMMII8855>>99AA;;<<11FF55;;%%HH--<< 88??))AA66;;88559977<>EE>>AA7788..::00==778855::;;77::55;;66::??>>CC>>>>4477))99++((66,,UUKK^^TT[[LLhhSSggffHHwwllddooMM@@AA""**%%88<<jjXXjj\\llVViiPPjjRRrrZZvv\\ssYYkkVV[[ffTTPPii^^HHjjggFFbbccAA``bbJJddcc^^``]]ff^^WWgg__WWdd``XXUUSSLL::GGDD%%VVTT..dddd@@qqYY??ZZRRWWXX>>??<<;;997777..II88<<&&LL00;;2266!!::005544228888>>BB??@@88@@66;;//11$$99--HH??HHCC>>>><<==88<<::;;AA==FF::??1166''==11::33XXOOBB66ccPPuu[[~~ZZnnKK// --660033EEFF&&88BBggVVppbbvv``ppXXmmWWrr\\qq[[iiQQll]]ZZll]]VVkk__QQjjbbMMiiccMMiiddNNiiccSSiiccWW``YYOOooii]]ee__OOZZUUAANNII33HHDD++SSNN88XX>>--}}8833``aabbee;;<<,,++;;77??5588''II44::##,,//88..>><<::??::>>::77>>55::1199//::..<<22>>77>>88HHFFGGFFFFCC@@;;<<1199&&99$$;;''55++33--::55NNEE``TTccSSjjXXDDQQMM44##)) ;;II((??JJ**<>7755FF??BB8877))99**<<..BB66GG@@HHFF@@AA==>>::55==44;;0099..99,,99..88117711<<99==88<<77;;0099))88##~~;;!!||;;%%tt++""~~55//GGAAWWPP``UUddWW{{hhWWttnnXX[[]]EEVV__BB@@MM//::II((,,==44FF jj||TTggtt]]tt^^ww__llXXccMM\\HHii__UUjj``VVjj``TTjjaaRRkkbbQQkkccPPjjccPPjjddNNcc\\IIff__LLcc^^JJttoo\\llffVVNNHH::FFBB66JJ88,,VVMMVVMMmmggvvqqWWSS??<>JJGGNNKKNNKKLLGGMMIIKKGG>>::22**770099//88,,77**66))44))22**11))//**00))11**11((33%%55!!ww99 vv99$$uu22))??99MMHHUULL||TTJJppTTHHhhXXHHcc^^JJkkooXXRR\\AA33@@$$33BB##//@@44EE!!ccssOOkk{{bbqqWWkkPPddLLbbII^^FFjj``VVjj``VVjj``TTkkaaUUkkbbSSjjccQQkkddRRkkddRRff__MMwwrr__jjddTTbb\\LLee__SShhddXX^^ZZQQ>>00''iiGG;;SSDDSSFFTTII__XXZZUUIIGGFFHHDDIIAAHH::AA66::@@>>LLEEDD::66++55++99..99,,99++99++77**66++33))//''//((00))11((44%%{{77$$ss99##qq::&&qq55++{{@@::PPHH]]TTddZZ~~ffZZoobbRR__\\IIPPSS>>@@JJ11//<<""..== //@@ 22CC##UUddCCzzff~~ddkkOO^^BB^^DD``FF^^DDjj``TTjj``TTjjbbUUjjbbUUjjccSSkkddTTkkddTTjjddTTmmggWWxxrrddaa[[OOYYUUIIzzvvmm}}ttUU;;,,II((OO,,``66&&qq;;//LLEERRQQ>>CC@@JJAAMM??LL<>JJ4411??&&,,:: //==##HHUU99uuaa}}ccffJJXX||<<]]CCccII^^DDkkaaUUjjbbUUjjbbUUjjbbUUkkddTTjjddTTjjddTTkkeeWWee__QQaa]]QQ``\\QQܩWW>>**II33PP99''88 qqEE<<||kkmmDDMMFFRRKKWWKKSSGGHHCC==EE88JJ;;33''77,,99,,::..==//||>>11||>>11}}==11}}::11||9900zz77..vv66,,ss77,,ll77))ff55''aa33&&XX,,##nnFF>>}}[[QQrrVVKKXXDD99BB66**22// '')),,33##::EE44AANN::..;;''))77 ,,::!!CCPP66}}llvv^^``DDWWvv;;aaGGffLL\\{{BBjjccSSiiccSSiiccSSjjddTTjjddVVjjddVVkkeeWWiieeYYnnjj__dd``WWssnnhhԤyy``OO==HH;;**XXLL>>ӺrrvvSSYY;;AA99<<@@??DD<>11vv>>11rr99..pp77,,nn55,,ll66,,ll77//ii77..ee55++__33**RR--$$aaCC99jjOODDZZFF;;HH:://AA99..????33==AA33))11"",,99((55BB11,,99((00;;**..::&&??HH33vvhhSSTTpp==RRnn;;aa}}LLbb~~MMRRnn==iiccSSiiccSSiiccSSjjddTTjjddVViieeYYiieeYYiieeZZhhdd[[\\YYRRiiffaaxxmm[[;;55%%ަVVVV@@>>LLFFOOEEDD66>>22::22>>66<<33;;22zz<<11vv<<11ss==11qq??44hh88,,ee66,,dd55++ff77//hh9911ii::22ff7711^^66..ccEE;;^^HH;;PP>>22<<..##22**5533''5577,,--33''22<<11))55''00<<0022>>00==HH88//::))33<<++ssZZnnKKJJcc99OOff<<^^wwOO__uuNNIIbb::hheeRRiiffSSiiffUUiiffUUhheeVVhhddXXjjff[[kkhh__ddaaZZnnmmhh˷~~{{jjzzvvjjƨttii>>33JJ<>55yy??44pp<<11cc44**ee99..``88..cc;;11iiAA99hh==66aa44..ff6622kkBB<>11??EE99EEPP??==MM22GG\\==JJ]]??^^rrVV[[nnRR77KK//ggddQQiiffSSjjggVViiffWWhhddXXggeeYYiiff]]iiiiaaoonnii¸өWWEE<<))KK<<77..??88GG@@FF==yy::33oo66--nn<<33nnBB77__99..__==11\\::00WW55++``;;33ppGGAAttGGBBggBB::rrffXXQQAA9933%%4422%%6688++2255**++22****44++++77--((44**''33))++55,,..55--0088--88>>44??GG88;;JJ55EEWW??GGYYCC[[mmWWWWiiSS33EE//ffeeQQggffRRiihhVVhhffWWggeeXXeeeeYYgggg]]hhhh``ffee``zz{{uuíjjSSAAJJ>>xx==55rr66..vv::22qq6600uu>>77oo==44aa77++__==11]]@@22XX>>//UU;;,,ZZ<<11hhFF<>..eeddPPggffTTiiggXXgghhZZffffZZeeee[[ffff^^gghh``^^__YYffggaaľӾii\\yyJJ@@ff44++nn9911hh11**{{FF>>uuFF<>0088>>2277??4477AA8800::22,,77//++55--,,66..,,33++))00((,,11**1199..--;;,,55FF4422CC33CCTTDDDDUUEE))::**ccddRReeffTTgghhXXhhii[[gggg[[eegg\\eeff^^ffgg__llmmeeoorriiȿ̺ժQQIIll==55ee::11bb>>22bbHH77XXGG33[[PP::ccXXBBXXLL66JJ;;&&ZZEE22ssbbPP\\WWCCGGII44<<==++<>BB44;;AA55::BB77::DD;;88BB::55??7744>>6644>>66229922..55..//44--33;;0077EE44::KK8800AA//<>++<<**bbccQQeeffTThhiiYYhhii[[ffhh[[eegg\\eeff^^ffgg__oorriiyy̻ŷƃWWNNff::11ee==33nnNNAA]]FF44\\PP::WWOO88NNJJ11UUNN44ccYY@@hhXXAA[[OO99aa\\HHQQSS>>EEHH55AAEE44??CC4499??1177??4499AA66==GG??::DD<<::DD<<;;EE==99@@9933::3344992266>>33HHVVEEGGXXEE66GG44==NN;;@@QQ??..??-- \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog_idat.miff new file mode 100644 index 0000000000000000000000000000000000000000..0d2b689e1b813eda8d43e6a9e81aa391a2e6412c GIT binary patch literal 26045 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog_jdaa.miff new file mode 100644 index 0000000000000000000000000000000000000000..5326e6c380499c069b8ac3008d500e10a2322f67 GIT binary patch literal 26045 zcmaI8XINY5xivgF$vHWhB-hEC_ar&VWL&{?1gIe)Av%cOdl$X;-g}h{$4ezSL?(%HROsa;*lev3BkcJ|MCJ+_Pp%(1V$wX|I4%5WZBbN zl+RPc!jojr$I8A;_8~-V9V$LXhxYmJKBxbUOjcJvetdVALebDTabjnON+l4~)h}M8 z(X_P*gbNq+^mKH{JVuC9*k*xc0BB@zjQ%}ol0L{e7X+9Hv3bdDdtaDhnF z(K&MD!Ub(@Ev-X`E?m&mBoGcC-r6F_j^oEKUeuBuCr)f{lgSzyYHB+>1_sK?Wb*d5 zp`nTjmAbvHudk`8t9#)BgQ2TSqphy$=@}T%Xy?x9>zkQTsq^#3#%5+@^4y%2m9ep= z=KQ>e2ZN!iIx`a!qo=2;IyF^V%4BM34G*`p7#dQkU0u`Drlu^GM6$BNW*ZyV*6!}w z*s$4^l{atN*qED_mOgr9X{oPYS$X%asj04RRn^Xpp`o^RUETaVi>0Y4k&KO*m=Fjp zEj>LJ7CJgDEfR^jIf2m8QC*E++}q3L8X2jn_4QR&8W^ak3=C9PvslW?0|R_M9{2b2 z`TF`NP7DkP1o)r!^+~0cmRedZEv>C?ZYCxIK~4^SPiLpQJB31}E-aXssHtgcUbtXj zfHSqRL7`}CYiMk3X>04~sH$GPh^wKhit~!|y|bgPuAy=G@a4-Sl9rZ&!p;tvtgL+O z*yYRC)(i%dxv&r$>+T*F*4kQJ935R;TwY#Vn~~Afl$n{G9TinoRaxom?BEa*GBRRo z>)_z;-`5u(pOjQsSXwF)iN$?=VPT1hsi}p96%`g1*4FOs0|TG%LMCf!{(s?xM$^*L z*1mAz(@LS>|FO08>Hk3{>*%PcY;OZEii+FYM54C#v18lYK--Zc+uL%SY;WUTzzJ{! zoKUGi(#{TxrJ_P6U%0?xDJhXiz^A%8k+``j$LHD_olc{XNJ~o$hQ2!Us-Bq~*1ePcsiT}$iOvAsPqnMzer!Tn32U?q{%)D#r<_6!V2vSW4C#l_Ur z-hOH-DT%{LNf8Qpyxd%|I4vzBBQCD8vb@~DfW@-2o1drAm`n?cxj7FHA0ObWw6wCa zzCJTEAt5CtHwbj$p&{$Y-b*0f%ROaS_gQ-*{rBkO;Qm9mAVDqUR-je&u#E`5C} zwXJP#&dkifpuT=*$I8mgjK{lo57(=#?A9$)Qv-wQ>WvNHtD#|f8WFdnqrYEQS5vd6 zr@I???d(L{B9l8h8X9m#y1MG>7z`bq{{HG}3PoLgbhNUPL{e29ALnv)b=A~HMg#%| zLrbf_Uo18)h}G2({W}I$8kkAHi$(0uFXwlWlhav$M*MibSM;MWyEtL@x%$lA^G_S%8)0h zRQ$!}roX=&2V8DtrBoUh2gH<@7ZtJDwzkgBCr@f?(`b5nYil|>bUK5vylijp?(XT? z-)~}KV`FVSHm0qOJNM*CT+gFNFI~d*1ulUDB_;XwS5^HdF0{4PWXIkf(4?ZWzptsO zEITe=CJ@xrl$H1PG&NOKm6Z1OG&EFHPMnahpPmPv2n66^X9xcaA`!TguW}q-yoj@n zxTCA9Dm!*|fFE^r0Su8}x)m0-ST#s|-Oih8jvuEw?_4JgL z=jMEUX|xk3W@i%S!7Wqja*x5mxsjAxAvam2V=JU^- zVXS}1Wip9mEBzp4V*!oM-mD7NkfB3#C@%%rlE1{ z*riLji;o}Q+oMnr?=M_H{8v-k+{E?8`R8x~0zyKXnp#?#n|pix{7OqJDr#zyl44>~ zQl50KSK9FACwYUTLxOP3Hm zfEVBsc=_}@nR8)Wyb#-NBC8aA@umV5w70;hIp{jcMvYMKrqKXP0D=Mn1 zU%rfJqp5l65`mzkq@x2osi|pc?e40mXldbdm6f%$jvwFO$L~>8+~22A)YO1K77J%W z9-pGGSboM?d|L|Go#a`(!oJ`wsm#w?L1ysSVTm6dPqoJot74Gi|^Og23~b^slvcgpKuP0h_soxVP-h#!@eOeSzr zQGt9jI9OSU`@X-wqy+hDXec+APA3w_#}gBYL{(M9G5n5`CsR@oPsYbHGE7Y9^ufXG zY%41RgYNFCDsOLl`}+Exp48Ov@XXAqsrveYg22GOK75ylM@~*{ZES36YCu3*nzwgN z4V&%fXKC5jr>d&2ucNcJ_V>SQXaFzAj^U2Iaz$Ag>;69OZ{&O6<-`f(1x3X#zr1=? zOY7*-zy0m{b!}}0g+qs~UE^@v-JP8~JKNjE;)aI6K#{1SfzJ;OotxX(n4UH;7#==* zw!53nuC49ttg7<&FDYqg$jJ#04+%+2^Yuj+VP}W?g80A3g$t;T(D#tZh-9Dc-+$Iw zcpmwaL_!53?}Ico(H9|4Y;B=i($bRGH`>~$W7O0L1jH-(s-puWpx!~e_$NM9RVkEX z$F{cA)Noz#d1SJpBB}_)-PKhS6a2FC=TU7^sprq@>uYQ4>aMP$Poq%Q*9io9yuq_t zT5D?*3Z0HTg}eUv@r?~OTT}CkFE%&5y)`tx_+n)xHI+m$IZY%S(%<5@=QU2t}cNvIhmKoU=WF; zqZt`=x|Y_&L`n+c(!>PtqN_VNSXk)jXkyaZDi8z(xw>+>gM(RFF)=AA6B8m)etuwJ zOG{T*Zmz$7Zf-+ETwJ2;sH%#J%E<{0&CLxBt*EfF^7nUe=;8iOZMe^&;Z5g2G?_dh@2LsV}nX1lTVyjU#C)$FYvv3dWwoGD~5)s zUze6FEbzT&&)VAJ7tGIFTT`hF#@VwL7DOV0asIrqF@d0~yS8Rzq^(V*uC4-4Wb*m* zmXwtx3{LozyS3MpN~pvWTd7Bb;9UqT^;Izk&)V3ZEe)E)zzrrPM(~c^zw3Xsi^4a zu(!9c5Q%DQEi9PK_I5ts($c`7txY6yabdF?8rs_f1Kr&#D@RA;;zB~QvnMBWb7Nx@ z5>B6PXvoU)_wVW9a^vEnqtRhyW=2N#_VW2fMd9Imeo9Jma(;enth2L+M|-=YBZ&mu zFc@EcdHndbYgmsRyMEo&6m`P(ww|7n(vc(k`^LuTn^sqCY;0{AjLAtKpYU)Om*!?5 zBR(FVS6&_$S5T0cSWyudhiq6^mzI{4l$KUi6(651J8EiDQc_c+qx18FgG)+GO+7rA z%%LHm!^miPnaN}@jEoi+S^s-1EU;Jx26Xzug1)|i0hxUEEQ^IW4SoP|_Vj6U*}-C+ zI%Q;JXvk#F&tqk=PM^l-(CPSlJw07r!~;D&5@~r^M+f!E))w;G7hh~|8yoBEqt0Nl zNTg%OHa3ini9`j3^>u4&+|P@PE-nTJdU`W6Zf^KNGc$H}BocTSdwbwydD+85TN~%i z*;zpWaW5u@L^3cqd9tFy+}z$C^@p{!y}d+s7#W$Ew6#ejV05~>(O>K8c61C5nwZdN zO-+M?78bg?&CMMhOs1x0XXn5G_#5=!#>S|7XJ)`OwY3clC@LO1HZn3givFdq4`&Mf z`O1o=rG-Uh<>I2PEt}2d4i6g}Gns8|sEb&v*4D*EUtf3kl9Gi5tc8UW6ONA7);!+a zoU^mNeP!j&j;pJaQ%T9SYwqqI9{Kq#81B3N-#0wT{WrfMq(_=8so%@6rLqlU@)ay9w6v~-1rm}-Z zo1Fz-n9NhB7z{l<T3;-aG?fq;1C<%P;` zWhFdZRTX$fzF@Qa`Z_x;ES#Jg8+&?;j4UnD3+U$kTL59{kQ7%eShW4I5Rn}>%{ zm$bD_O(Ek+B;(_VH?6H_&d})^8qLiYFB%%^>ekm^xuUO6qX~sz!iYq%`0`~$WRVE{ zw~-N-yS9eNDwVFU8yV^A*VivD8X4*7H8h+*4@Qy4+u!%`adXSe+}ZK)aB<1YTUoKT zX0!SHD_5+nY;C#RTeoy|SuBCzn{RY=Ei8DvmoHf?SJ(3LmoH6C0|SeSUc4|jkBrRE z|K=MuJ0T%2@6jV$+tk$D+&gz19n;dXv+v&z3d+xqkH;Ow;Z#?1xlE>s$-qEL3X8>H z3=h}WXJo|0QvQUc5LrN2kxv zU$}7kG=X`Wa5#>RZEfgh84T17=&(08kzWws^<@Wzvbbn$ zjPrTsjJY}P!&9d$EZA&4y^|+D#TSeJJx-mnx3{x%aTyviH8nQ2wLN)~Oh(*99Ymq% z>aMTTXmmR25HcBj+UhEWf_@iuD=IVab~KuX#>xub4}4l!pnsX2wXi@OIDOjM8u*!; zb94m47Z*J}!RMSmA0H3qb9PoBFfuYT>*(m|F*moe5{uj0kzWx{P?z=fjgI0Qq|%WQ z#7n8PtBXWBaiYI}Y6^XLOUtQK=paQt93v_`b%*ufIkmBoI7!fOuI`bN@cp z+S)sJfFpt6!Ugob?d{v!Mn<~2LgDtdl@*IsRdwl-laqx-Vd3@b9v=4gxw#iFT3VW# za=GWu;r-3c+uPtd#Nzw+84P1%F89R?@MV>iuU;7#I6Ie?zIb%B9i zUbVIR`-_X?<5cSX`_GWOngUOtpM%*wlnV$CX@%9c1YH!cX%*d#!%FoZp zNK51M^Yh)@+})$2yStIc?Ct00fe!cul>5M6*H0|Qk4s9)98jvl>m!O2NM;qQOHcoF>$`r5iW#EtImwl-YHj*j+r zT*tn?t}gI;eSPEO=)_xEfE)1p;8zqCdwNcuq|=p^+u9Zu=yW9|i3Ey=ib`W6Iy6<) zrlwoBaAw5fd-w2pLgDS(V2yJDZx8m*cU4 zK~2rl5}3EPw)uJVnO$9A#)w3TqfBDNNPdgCIWgZJ-0`|RyotpE0JKmUAi@Y7Ft z{Ns<`efO(h-Mjbr@!h+B`ODngxpQaE7#K`XpFTY~i7J9jrqfZ!g26|9N+2jIfHK+9Q!r*{&Hyhg*7UTM6`O5sJvqtY`1>a(H_48MhM5_E|CyQT>AQCg z4ZFL$x^{P6T`OeA=xBU=R8(v%ms?R`W8>%;7S`WSr81dpHgq8)BU97)c_x#^qSF@_ znM^tz`36yiNL*TScE)`>GZPxhX6x$@4<{v|5*`>xPe&g!GQ#7To1-2P2%!6PcT1&E zpt`yS2JpD01^-8FZPX!#hFV$@2{NmWPGjTJl9?HaBorIuALp~nWs-39RmWgvR=M)b&ZHfO?~?o_hC}fci(w?qh5aW$lX08Bt8Ak9S$cl zGClqJ^|-j?%)h?`R3WPN00vWrw0!nKD=}1FMmO_ zU@~zQ!B;}3K|hQ9K_VSG1b&Q0J91=o)!5k3P+fgt!P3&)9Cf9Ym8GSlMb8|oZpsTyIw77V1fC}XF>G$vT^}D*dyKmlfaLCNe$r%{P$nf#; z_07(1X|cCwvpqb(7*VPE`b$femS8YfSEHlN%-HOqA&Dd`EHt#N32Kb6dWME3CB1v+;eqwd8#lM$;MCOD zuYG-?3O;=3>l+-Lo__y66rZrLp&@5yclWxwiHX$I^z_8UgM+WXzI*r2e@50p9631n z`0?NX>p%YS@#ANoefQnVm%tHF_5ArC{&45c&70S+D=Yu-!`rv7U;pMe@7}$B{q48E z`3>q#1B0n48yj?BGcy(z1_o+s=yw>5W5>|H=;<9gw7hI&gy+%ELT8zoL40v@o0xEO zb9Bte=;D{~T z?gBw|_2Obggg}s*T3?@)RZ-#L5fdX6R#&sxzP>FjgM)5v5fN2Y7cT|}BYW=c`S^r{ z9zB$7|p_3N*7bkx)u z8=pTX5HvJIqHn)N{aRal$H zK1IJS5Zt|sOfC}Ly$j`&%Uxeby)2bpyoh*GTYKvk`sn=pD_3y7pnIc|YitCQMy2BW zG-XzU&d%LkV`CPpwib7!zP?b1PSL=iuI{U^@c%3;d-1~E-Pbog{lf=e-|+CbxSxOa z_6`Y&kAL^h-8~>6CFS5CCMG$V!+G|M!wC(IkAL|xD=RlQFmQa_!^6v~tSlpg#WFS? z9ld{lX$k7W`}fbEzj^at|Mlk0>(}3Z|M};@%fZ1fe(~|+4?nzn_t|HNKQCW?{`t$7 z-+c4<@n8S??%k_bFJAoSHy=I#F~9nimlyQe(NPZ%Hk-j1ABUbvp-fNP*%=sUXq-7? zVZmUWII*}0Rsndiw8Z@~JBv7DYdbY%Z|~p`8#_2yP*7BK@?=s{m+W}?($21@r?>Z~ zpX}^{n4WfVSzC*XD=SM# zn45ERi;gZWU0SlW4G5^JT3$9VaBvU`&z{xM(bq@4fc~qo@&0`~J1eWAqOC0^Q%6T6 z+TS-a!u7v=8N97P0Oj_?iKeFO*P(MrrB9xKITVTBzJ)F>6ux+&qN1jTdQ(F~T^+bm zlpSqt*RLNtrl8Q?{_r7qMTz9)OE@;_>R!A6zG`Y7Jpzt|!mqzZ=5B1fbqo3ckGH(6 zuCAbf9E=Dpkvw_gb#=SDT3U!R3ky(q+uNt7 zQO9+6&&=R)XQv!D0>P6f?y@5*>*L3ekVx5aa1a(26%`hCa1a!Pe;phoC8ehN`#*US z78V{J9sT|Hd_I@!<~Bc{loTHy6B80bqfsae3lAS|ZEbEUDjppC{4?SS;>$n&@!4nJ z%Z_iq{oU_S-+cf5XP4eOooO~C$QOrg8>1EDC6V4z6J)mx>Hl$-sp!XCR|LTot*q+ zM@L6uVqu|JoSO^h#O7v11Tw@o-*|d9H;ctjpL%&UHda?(zaA9S*~#TzyvX51Yy<^mWu>RDt+Cn8&Rp*5s;Q}sO-;@2uC=v;Lq)~bmZ_<^IiJ6|$ztLD+ut`e zH8kY$Zrrf2Ff^>Jymk$JFP;a#3Y?Hgs8_FD14G`@^7YrK8=9K#-Gj5IuI}DF@Y6!! z}us^EcmUXdu75c%dgdc)YK^f<7!1uCJ@ADkyYxT)YUq zq^)g#9~oO9xPBcSCE^0~uFlTOml2O7lKc0KWk+S@!-wYPW@cq&k00CESXmVo-o6dK zrmSpn5sWzMUpPfNI_Bo!qW}*8{cvDldKx@&Tiec#gM)=ddHMVIad8n5fq~DT13xJ# zKl~6RI}#Fp`U#wHVBo`t$k*ZFb90G_VPPpLVsUJ&pI=c?N(%a5k?7T{r%$h6|I?pv z-M{+|c=+k3moI<$OVqdb?)~8pSFYT-v%IXRc=s+U{6?A5Cuez9}B3wuCCtF*ps>hFabwP*!Z9R9+(h`6F?YFV9At9lm@7_g4g@ho!pbH8L z`tSi&Z&1+Qp1;4JUsl$cGbt$%5lKlC6LobtIUEk3556`j>D;-^&CyXh{lbNfjj1UL zWkq&?gX->{oUEyFaY1KLUG3sBHnz0X+-z*TvU2t6!~`4#ckY}yqprTc|KP#dvubK~ zcJA(adc(sG4lXX}Kb)OyZHN=S%E#N&y@si`9)$;m@QX=#IlF)`!gs8Ui= z`uf=HprHEt^XKVwHoLJAbq0%7Uw`Kg92uphUw>_9XKPzjw6=zhsi9$Z7V)B^156+A zvbzhOxu#}+A3i!RcXwBgr=1-r;9Xr;u0R2mNaXQEAb9pnSC>RW-2!G(Bzo}zxI)w4`gIc%-~|pc^jSA= znwYRy)zuFl!WU6oeD|)InUPUN#pTP0JN5Nowg`mg=9LxHNvL<3Ofp#{x^ctS*3`7L zbYlZ}7mKkH2u)4r&%@c#+IsdZ9!n&0+@R(Q3-j?o-I|w|nd#wiaF8K8u%@Qw<+-_C zzwYGZ>6w=|JImpCdlwY6wWXv42WMxerKP7s4^K)eD+>xLUfplasc#R#tR6@(&zIBO`G2KtJ>FkmCiofKKb;;_hy0Ixyhw?&|91 z*4O9kY;GP9FfkDy@8Xi3EtNJmM@Nf9d3mQ#r>8eJ$Hs1Kq@{7W(a}pwsPjupp>){W zqkm;G&CF_QZrm_2VY6}H8p)2DnlopR4>~$#W}rKDcEUM@>#(zf$_n`c{6FAJ14GmA9A`gkh$Uh`fW8 zQ26Ezi)CtBR`&6ulasS^diuL}PEHOEsj2twnVTCMmzHjCLpN(~o}E=xJbbvnA4(bU zaO)N-yYliIH_$)8PlLWnEQTXaQxkOx;$Cm>*|X4@ySuMl1KxSOD_7vlsjI{9MjX3+ zo57$`!Q((jsjC|q(bmS_U%KSu;1>fBt!{f>_4=)^<^hnkxB`0DDQpxoT5sPj7V8+1bvHMjIJ%aRDPgGUDW9XQ!hxHfC>cYfC1Nk0TpH z=W%zpvvYJD9`^CEwDk8M9>#ZOW(tLUeMw1tetP=SQcg}yO=RTWUUqgtL3sG)ChDI2 z{CoFYTzq_Ta&TYT+Lo7JzHDHCytJ}{IMCE|>XfFYnp#iK>@56I?d|B;5dRk!;d?>6 zH#4KrYHP1vmG{9nZ-Pg!*;Ffy{RC@noWaC7tYOi6k3#@gD}HY@AuRpcj;=-fFarQ^p322Pzia^#CI z-~!OnLfwKs2fqV40+lKdKta{eXljBJ1$k_JolI6!lS(%?;lpidxpxovuBy6q3%Z~{ z@bDpgmJJQBU+e1wM|bZ+@8WW&roan!b*-;EI$By*RUI7gcu;dtw`6Dg_`HAb;1C*` zmiFWcl zAt5%ltZZZ?BLmt(Pft=(XlP+!Z*OvPP>?_{GgDIH;!;yHJzZGn>1k!<<%Kw5V*>}N zJTKAdLqo2v&dw~>;GnCkogH)t{94qzj*j3vCMM*0Yh=XV-`m^EtGykySaftlLsXQf zXF`HlTwWd-SzKIFGBlKzCltoSEH9Ur*VS=2J3Hm&g@yk9>+A4yrKaxg;yx}eMjdNq z#pQx0h3{=?2})>F)0s1f4{dGelaNO?H=$qE)-EkU$8KtZBOLJ?j#VO&&%b#SI#hM_ zojYJ48ylZIL4P0;egC~o;LtBA`S_8+V6lpe-@c{OS**Ic+qc12qE11-B9X}Z7t}YX zr}%v2B|05-E&MkU$(=j!Q459gc!N62#>UjNq~!K(2M2TWqN4qMYisz&x3_^`@PB4z z=(my2bamnXG&H2qxZH2QH8W!}OH1$EfgXaM0Dj7bhIj9fH~IW$&+z}}^TCJ{2(7KF ztLEk=CbhK(2Ne}uuASZc_tDW=Ssc#$_fAexQK_j9AF|m20Yydq{d#&vMs00*c@`El zT2D`Tc}-1N7$S&Bk(k)j1co&-QXp`5hYH!<9T^!HCtqV?va`FpV`3sB3kwGa zlai3J(3PMQtE)r&LOlXskEf@jqn_T-ke{EUqoLuzKtOf_@eJ9>MAf_!{}f|{F4OA8AHg7oy_;{1I0h%+ESs-oh;1w^j$axlu!;m|+m z=zwpR^Iq4k+1eT!mX+=AgXiG!;D`Y4arG*A81QLEMidIJ5Beq4L&zVfTcD#?R(|+k zW@c_)Sor=un~i?_*)u5q#l_HNoSbrUz{fi{6c#>uq^DIn@_YlF;s1j^O71h6dCvrKPT}Z{7q4r=>+j zJ$>rn5D}4^ySK+?`}kB%h%H;+H!E-4V`}rj&CndGD`TNJm zr=)as!DE@2*wW(fpO_dME0Os6!WYxk6&@ZF1H8n=ff;OW#(mAFLH8IL;c#qhjEvAH+1grI^z{Ve_U zNl6k(MFsSu?(Y2j+}xa;{{D=Nk&%IcogF*7M~`maeE06ik)MBl{`~#>|MP!dy}EYo z$`vS#U0qF0Ha0UeQBmlqx3;39;9%e14-W?q1;;UbwbRq!RXaL9^+l)?3=GQ4@7}et zVlvChP*13;qJD%ATOhc36L^L~^^b80{NO<^=OlGl!!aH}Al~E5L9GICoIAmuZ9C&*N2FAp^e~%6^ zBjc;Dz-S_WLN7qRVX=VEOP9bu@cH}ua7Y5TaDdg+ym-N4VQ%IAefY8^lIPEK8AdHy~fa2PPJO{WWx3iR8isH8tq!2M1A6xw(FR-+bfkosf{6ytij- z8yt-L%hi>`DJzSMgYRN_+1(xd{L)fJMs~KNBNW4$8aKC$jNstfS{s|(Tu;xcDq~|j z5B$W%MMc%uySl>P(AenZm6;hD%HugWl$4m6#l&c7b#>8b0RhL44-W?ffX{%c3H@|< zI5ZSKj{g3@KvX7p-P+p839*U8Nlq3D^Yc?u8X5`;GBT2qIy;Msd}W7N<^)Yi$;gF7XBGC#k#`2F{oB)WLBqW4{+`5G*7#DZtiklnm|Ghn9V?8}Se{~hU=8lfrx1k>jh0v;? z*WAC4JXKL~=ML^~a6OnH5DG6|#PtGyg1%MWhiGd{rMO>F_d*{)zw`a~US58F;M;9& zU0t)YpFE*b4Gn8*e*BTiw6ZEI`|yEIH#e`WeDZ`qpi+@PXfy@`eG~i*LgBS*(9Z>e zD_7(?_5MEcB6J7viO?0m}-s{?TwQZ>X*3=$GEypaa>~kzh^VV`aF9E*?Cgq* z{rpNwaGyFmXJ#@OB9W6*YASRKaE9<}SXm+7EiJ*H1YeS`ua%X#`N&96kc*3>BXU_l zKtx1iBQjoLAy|~iNRg%iwS7>sMCb_iSr>@$l$$iTe7r zwQt{&NGukQ_vDF&2I?Wi1@vck?tteP2+-F+C;I9u@S6ew`aKe^EiLff)z*4?q90gTfR6|()Y||1f48;*0z5o)bb5M%gQKJA z^!j@Ae7H|IoVq$TyRa}avbGj^79JNnJ9z2J%24lnd*|jt*Yfhp$FL2|;^bsyH8g}uCpK0f2o4Sn&C05;cXRXbC@*ho^Y!)fYj1CC z%+Ait+}=)0D=jT5x^V-%TxI1~UqK-(EQGdRP>_=|HkO*o<(8I?j>g88mS$(Swx*}Y z#2||{G{nZjCxV*X++0g*V4$M|nX$V1#*NI(=xEdl#l@MKZf*w$(b2)dAt9g6|IUtz z%8?^IJy)+1iAqW>E&KbJHv(@4d`Kj4@IV(@TEZlcNHjkWzkyhc2}u&EsR@c0uInef z+`DINY;Mlw-n>aBGZ?_5f&%z?=mJz~W8<@Dn9M;vqpptr`|)EP9mEspkXYf1!RyF7 z_}p8!ptB?Xq29*(;HyF$0bWER^kcv|bcicWg z)YWx$rP6}~50ALGm>A4q`uLQV!f6^3Qdk%oitjmf>dPt(~dkI@>F0vYVTYO?!Jzj=ep6E1jJ_K2}!M)q8vK@d2`VDuW!DgQuXxe>f|f> zV8myE;L#(@?;?-D;f%NdoP5GjZS8{xh(CP(ojba^z|sCb^rGfwlS4}N~Jv2k&mn`UNiZd`6_E9!5t*wGPs+3C}V4-*J~{Nv@z z=H~A1y1Ek+O-b2qg(9V`{pFXK_kcdVxoK(X z<;7+X3^+Ih$c~N<+2D3ebv2(~Uypk^AfUOqq2b02Kfm(w+}!i$Q&K7`b8@DqQ&T09 zs;a4}@Nki+w6v`ac!Jxsun=`nVq$%LbhNXxr)Nh;K>_L$sT9?fkw)#c=5YKr^b z+uP2rv~+LJ&JOu>Z4Gmc@TDQ104JCq5sARl!*>F{=Gd{OCivG7Z{Q;UAGfw1)b#|UVkIAamR!pFP*SUHXe$V>)8#kaEL0{IFIggP)P#2e#y?%{3zk-5S zuV5%FDS7!44przwWHR)t$B*G$ud4%YuzteL{rm8Xpf87ClgmY&179BMDe(VubMPCs zw9L%N<6&>Fj*fytfB)np{O;g~{QLp~)6(|$Jv@AU^YceX?d=^M>*~V7pnohZC@3f? z{qA=+Zs_Z~yOYV2lNlL&epFO)^6c#S^KEUWrkKP`OM};iF?R;oH^M*VR3D zj!b4U;n$~9O-&UP&Yd$eb9L3z8yka5#nyIk(8mXToLF33Tv`hEl2FL!udIZGppWkA zf@cqit*9s}N=*fZ@J&Dp>L4$#hKAr^H#cYJ_V&m~=*!>-oSfKfskE^XeS1@rRBB*A zp>%Y>A#7kE5^ZciuMrCIi{!oo@Gj7c;8$pBT3^@KNB?u?jIQqC!!0edvvm5=qtFfH zJ}5a40$&N{hQJF$XKrb^bP4q&`~|q*#bWS$dV0ts;P-hv`Ft$=wemUHyLaJ3E-$}- z-^9ewu%hDLJ>+j54?G)mpr=m}mw*>I3FW>SI=!~`-aSlwgBOy2uG|+a6wb{-ACgMP z$Kj*t=;-am9B)rgd%KPf=JVk&GBiZL7aJQD6&E))2IiE{Z)ouJw6m+Px3SUDIeZvr z$Jv=k92<*@s;CGGDlV?BmP#`+0t0zGp)fHqIoZd@*_ll4?1XFh#EFH4;NaX`d;797 z4yU35{ZDXkWhHbMJZ7_ti$g-Ht1T@H3Swh{kBkg>;XFK`flH-cUWthw9u^k%_G4pi zZr0Wo7NeuCuHbjU$!{DkP+(g~Rdmba82I_4amkH8AMu@$qqYr_+0S0t0=04Gj@-+}yB=M9$9e z+YSz5j#((|>caJdt`A>jOUuRvd@dppcv9%bmo8y{1|AQ5ouXoE>)M)y1@Hss`H>@1 z>DZXA?w4Qo^k70kMWv->cNhABTqi(X0beDJ2HpepDxd%85p;Mi_x5e*Lwr7TM68&^ z1uu_@NnBS<&cL51uPX!sInL_qA3VUki$EZcFSWH#o{-6iPxtT3@pJ1IboIJA=pI-X z7vX1@NJd7$>vneb_oGhl>8Y>BywIsr?d{Ny`ub*PU0kfJz$f_n!p|!fdwHQhDlH8Q zb8@Pw2@MSiv9Q2>HZoFK>E)H0T2m7hm7X3H6dP+}Q(J3bU}$*k*tv76s)~xg{`FU1 zVSewgf8E%?gc0TyA|h&PyuEXBqM`%>^iAR6@;CxVlA~jGc0xi^lc#5La!N{Do40p- zd}5+h>fw=+5*g|03Vt>u1oI8u-QnTBz7`g(tq~ESp=M?hNnjv{V`$jg>hF&ZyR|ha zh{N&q1xE<~QfsTPubW$FXjhk?A1a;BPJe%QcNZ6A6-G-(5K8poj7n284DR_1Gix6L+2Z9%a{|!z+v+0Z?F71H#T0n1YH1phK`P|E_6j*T{%9Cj94uA zozT|^g{Y4)Z$C2wo~^ZYU;w^L-0$G`;b*Y0fWPVbb;KLsOx};nd0+TjaAj(1uU!L< zpaX#?6bj+Xq|-&Bkr5UP{cTedg`%X?-;X&KZSCIP!oov`{`}{a6^R6WRDb`-h`UT- zsje<71E18>!{>82_VzqpadC38mse?NW201>lY`mXm>4T7sq~942!!AL4s*v8%3uDn zBirYINc`{rhC9T}?8J%l=P@UI`0&}Yp`m$sn461>6AA+Z;SiTf{r%I@;^O2zb9A&= z44x(-p{2#!J2^Q%9&sflB|N;o-oYU+FDeQhx>SnQ)m18ujP&z!aF9yD@7vfkH-p2J zuR%e!woOfV?Bpb0-Q0j14-dGbVq-BsE)oR?`}x_~wY4F-fF}ly|}AODy7i~gr1(37VsfGvIDw!XXnHO_IZF`7x}xX zX>Skp4VQ~b6YK7-nHlEx&!5NqR6_$i1KQf{?U>g`p23{Hg2Kp1c{%DVtk9Ll$4g2u z`8hdRUXFfec(}F}`n6PAU+?el?9AsQgE%?W)kQ?OyPKGFb~-rN*pNt*lgE#%sQmu- z=o;BZ00mE*+M*Tn_6 z!S8Es#_H(U+#C@R5MXcL+zhqH-oB{`D{zC=+PbMJB?S{v;9;VoTwMi%kdS}?;5{lT zG}Otdp~1_`)z#Rzx0k`dyas&!@GUMaIXU6}otp~_!(7$kBKE()y!yFwU;xnv1q1{J zW@er{hssJUUS5X244%cz4DmqDi`CYytRSv8H)Fz5RkghxbuIkc8ylZ^UerO*ad2Is zdm~a;SAY6k;Db!=>JkXRm-O`Tc+iQl?+^IBp&=fRMpIWG9u^AmcyO?#1-f%zAL;XkAbIw0entpr&x@AMg|5dDs**^A0Hdb$A8-;8;qUM23Vg`%0-OLZ zk&%Ic4i0jB051^{a@<5j$m0#%7Hl^18F&-aExx|UTS-Z=vEJTXF5Eq?u0kQy1^6T2 z4xv!s=fu3q;$lI8t1IFc*k~IYk!W@{IvPyR?rus-yv$Fyy6WcU2?nfyoxO-Q=zsvRO;33P)mzSac3IqcK(24u| z8yeuFlH-FwzN7>oXBw#6y)eA zkwiwySK!3PrnNOSH6g*zkIMy)oShpR0|ULit*zVIke{5Knw!JIf`Z)L8ykInJv|*9 z+S~Q@q3djHgonc~Ju;G?@8pEJ^vX&&(9xwkJ7ey6a?;NabqyxeTwF>^mzUv(t*NB{J=ggh$kZ>#l@&YM@QxB_;_(K@H0MMR)+UYOjK54u6kmkx*GnhsVP1m{2RP# zzztppUM43C3rQqJ#i^;xOz1?@(}{^R+VSHjPsYcC2f&K&pP9+bMC8TXKX|6r*79<6 zHud#j);v9HYvr{{U0rN!U?9%FpC9hi&Q5!KCntUVfdK;pOG|C-xj6y>Jjm9TrY4hl zU5wW521OAYgx0Jh@OA?)AqKVow_>W zC-&bsabkWxJ|1~%YDy@?^_EH}CmkIf9Qgc`C-wD>jZr_~Ou;W=Xo$Iir%zcdYwL;% z%nh2Dz+Yl$2;bH9>uk26VO7<}2K+i)?!*Mw>xJ(b2p-=nJExg@yP%V`D`{@W07%q@jWO1G*?4gO``b6E(HTN#F$g>Ln+Ge?ECK zDhl&Tv$J7gczpVFaIm)ai4$kfCMAJa$M?zOZE>-`znhy-n4KLE;OZ(8MMvYjV%Ix+ zdjo@!5mVVbn2rvnp1|{+mF?4pIu2Epr6pGEhjZe@xpV63bUNmN2m~e*`wLoFxVXTN zlAK&x8W50^lbzkv1Z5CBjHP9HIdmchLn!p|$yto*c!~8ww;fTaTht}4>_M)!Q)&1g&-~ayB zt@wEC=QBLKxR{rhl@%4Wyc`)B9i5(zIU^gJx;o5pI68tCv$Aq?D=K>Q$jZveDL?<# zEll!)FUA~vZSDFxd?|eX{51kwf%n`#4bL7bGu9A|9 z3ij)O+Zg*u(&?C=!gLLGv^aTEQxo;{>MC}TJaS}f3%J2tDBO&g|H#fpt&oiF?eG83|6pz)Jv}S zug}vHKC8(|RDA@(xpQz?VgD@bRso#`&Pc2(D)5Kz?WwCnSJ>DflQBQHxF~;o;ewVH z&LdcCkCt++65OV`CW^pKu~y zWxMan;>y%id_3kKCnv+gP#*&azz6o}l;a^J1UNZ;IxGx6Ki~!5bLteH*VaCL+SeEJ zZu9dTj;X1h9_Ds%hm4Qg+v9i5%^@2iZlJn8e0YB!tTguhfm((AF|mK0k`nd}ZPV#0D$C2*Jx5J#X(>0ivNAC-D@)GbNFDsi}5$wYBhA+1d()Y<6HEojx!S78V@r=-AkZ>x}*vtBcF0wXqSeBd*Bn zRm7Q)5KI$AMuvs?`H4h9K>-1to{fz$G11XsVddpuKKlCX?H@jT@Zip!Lx&JmRkhe~rBocFSpn(+^qwa}_sI1)FTw7aQq|p$U zkjLct?6c4C2zdGN$8W#I{5bIQ_U&h~xz39hS5_1idwY|TFrQvlhJ7uedt)vGdJXg` zE_ZYk*GD1|3c=%cbQBk3|A?U>^tH$*Q2jMDPMylm1}`%@nw}1PjE%*`;rdKXaX8RD zu^%Vy``KB4fABnWa~ux#p8`G*5yr>E!k|M;O$7wN_kHF}NCc!@?Bks9!g5sB?LU-KleSrw1S!%_EE)tcBp6Z7;ys*g9{hHv#84UVa2Mhj@OY- z*VnbR<@-EQD2R)2Kf@<<`ZRV~WwEde0hER5X>)ULZzi*^&(hMzhsEmZLT~Nr3O_?k zjH6?HJ(X%@MIf9x6B-&62(dzi%m4uF#nAAb4?*Y)jNOjiE-*Uz3kfByLKpa1;i$+Kto z?)~?FKYsk(cVB<~$3JdvUcI`wh{|$uvP-t-=sDQ|jvpv^^-3OxfVY4AFWy!quXfkt_}`S?*jkM-uwg9rcq@0Tw1^))tHSRgY)-!Co2 zj;*7kVzHGKgVEZWmxnxo`W3#nfq|+j@HL&CaF#Kdy}jw_;9DmrV`EXz&d$cfApT5F z#>8MhiP2F%KRI6f{1A6ep7i!c9y@*7%?)wp>{)+*=!P>hadF^P;5#!nH!>O+2n{td z0>4mH1b0|zsk^&_1Ncq&RuET7vRz0N6|r9-_GN{Nj=CH!J4BrAZMbu=uLbsT!+wx( z0jkRO&%_iJ_Onw{LtX@KpwlAmpq|I>6VM~DUk~;vICDl%5BmYn&6%2FXQt6nb8`<5 zW8>jrFR$om)TeH4;o(kBEiFW%sVRZ5yc`k|9PHo#JcNYE<4jl>@Ddgl65{68&;XnO zFTt_{^$I+Tz)P6y@b_t*sL$u3UNW;L@c-hravn?c3-7 zudK5RX|fIDxU`H(MILt2fnZdwP@Eq#cVKC+Mr=7Ubh-++Ob2092t|Zar$qsr38T*5>E&1#fNn{hTLBGcyXsj~~6gZ{E+0z1wzXZkLSGLb zUv@VAYN3;kj&tWAj=XzE-#Rt5vs0}5y1L5CiASu5;AAq{q0)M#w7E0%g>bQIc$(2L;lv5P?-N=@bS!AqyUCa$0dw;QfqO3L{7fdlk~#>WpH zq_6YkOG*mIe>tR3NQj$oTbSz@98{~}R?y|t>2h=FI>Ilr+YJV@xw!bn3%#CxJ+4c* z7oR>=Rb9LYw+p?Llr%P4t<}|KW$2`)ro0?Iut)LuF?y+}Xl&&8{CRwgLNCls8I4b$ z;=QY^eE6`p*X43JwAxMC#ZA4ku|Z|4P>5sn6NwNn#>S?n-R`6$m+SZM;bFds#l^|V zq@;y~aMm?t0z2CnlCQeK^9Nf(h9$2j=)4h8)Z!#DB`t_wt+_zm_ zwY6jfyIsr;bamaj#rmbWxvq}u-qJ$ep^s{@Fn7*w5Bw0Dt)il+2wf4i^YW-$S-041 zIvw-e{r#1)Z!{yrZl@zwT1vOSwDcdDW|}W^nbOlge#AwWoD7dAI~$%7yB6?;i3{oJ z&_l?J?55!Z?(0iSL)YXf>Lub0`uY6%@L{1V)=w%G(`9Kgx0X2-`iXETiHoD7M~=|X z7#PURgm2<-(5F$WdwTNoOG*j~pyA`FZ*4tvh`#*Lki|mZ?a32n*U$?(Krc12dmEP< z@kGoaR9Bl!=tk%TeO$PJe}uWW`}c8WTCMcc1_!&lH5&902#_~oF`q9!J}UEQs4x8f zU~q0OF|ogYY|QDT5*QhI|6Z$|m{?q#n%cJy&Jl5h^NB0yArRntOOl8$!611l7K1Z@ z9+s9?R(9{^Eb+QHFA{-+gFa%hm6aVkLZQt~zkmC7-dE%+Q8)45=xA%pjOfmgmn43mX~?hLb0sJ-d9F_|x8ARmJ+bv(s$m`q^w|v(QIb8C>{|4yKXm zyRlDy{P?R^tnae2+S*vX!!1BR#G&i5=b5=>lc}^cKfk%Tu#o-<85phsyQ%Pm+0BLv z4t0V#WvBD#QSu=4A^5)Nh`iR@%XE5nHho;`cBTe-q?3UkfjWn}j7mYo7qyzY2JR$! z#!Y$Zlt%O6Ls}YqD5mR)H|$4If!k~<6&%r_A@-lyUle+wuC-c?#{cw!SNH#VA?^sh z2%S87R9}zB^7ieCiErPAhgB-B3;OW+Bx!DrJhZ<4=g*!!zkbcme*K!9>~xOEoHVVr zy}hr`ZqLh`np$3-nc2HH6cX1v6pF=yL4_h34FurX@T|x`A`h{uT3scsh~seB??)Ft zpU1PfxN|3Y$?K)Ajz-tlmCCg>bfQ#xJi*|?LPEma-173zpX9ATV18cYH=!FoFWiFh z@&5j#q`P;S=OV766T7{tiaB$et+p0l3w|5!OX?PM!d%Gd)9k0}_4Hfq_Ooa8`izX$ zR*S`G%*$(P;%;P)gYH{S4*m<1iT=L9K%bUATv1VGCUhgNBeZemM{(7#uieul;)~0b zlf#?_yI^n?yJb2S{Q|DLc+AZ`aRLq{E|i=c-2K#H0|QVa$wSn?a8HYh_#K0{Z<))( ZKcAJw?;|jUh_4kgufafF4A&U`+rNJ-{W<^u literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_jp2.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_jp2.miff new file mode 100644 index 0000000000000000000000000000000000000000..4067846779434dd1b2dfc05761c3b9dd502b4d1f GIT binary patch literal 16011 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 VU~4*Q%@jB%ql@Hh$$G+o{twk#ZGr#* literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_jpc.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_jpc.miff new file mode 100644 index 0000000000000000000000000000000000000000..4067846779434dd1b2dfc05761c3b9dd502b4d1f GIT binary patch literal 16011 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 VU~4*Q%@jB%ql@Hh$$G+o{twk#ZGr#* literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_pgx.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_pgx.miff new file mode 100644 index 0000000000000000000000000000000000000000..1284a4a2158486b379096b829d54ce78988d0a2b GIT binary patch literal 7710 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 MX=xeJaj7By0f@yC@c;k- literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/read_non_interlaced.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/read_non_interlaced.miff new file mode 100644 index 0000000000000000000000000000000000000000..806e109c60eae1aa631ed1253a5a98a44f405754 GIT binary patch literal 13055 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 f7VFiFh5=dtNP#fM@YYy0VAu literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/write_plane_interlaced.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/write_plane_interlaced.miff new file mode 100644 index 0000000000000000000000000000000000000000..9813a40b5b52c1651337f51f37ef326e1dff8b47 GIT binary patch literal 13075 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 f7VFiFh5=dtNP#fM@YYy0VAu literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/output_p7.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/output_p7.miff new file mode 100644 index 0000000000000000000000000000000000000000..2b28e3df141ec95ffe364e4979cf53dc53e929a8 GIT binary patch literal 4198 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 LKz&LFx%lOOz665CIWEDG@1AQb47<#8E_0 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 Yweh7=sARxdutkfAXpk17l{4YL07MAU2LJ#7 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_bmp24.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_bmp24.miff new file mode 100644 index 0000000000000000000000000000000000000000..f2b3257927256590c0caeaa3cf048bf27d783c60 GIT binary patch literal 13002 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_cmyk.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_cmyk.miff new file mode 100644 index 0000000000000000000000000000000000000000..1fa2c1550aacfb8ef30390e3581089696dd80add GIT binary patch literal 16191 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_dcx.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_dcx.miff new file mode 100644 index 0000000000000000000000000000000000000000..33332373cea73b16dbb478d77663244e697c7d67 GIT binary patch literal 12991 zcmbVy2Xqrh+pcU{Af!U_CHYcJvn8#z_p073*>dmQl6$XU8%*!L_g+E?BoJyy=)HsK z&GZfiLNms?EApRwx%Zs=-+TT!&lx?Moz>3smRar0=DJ0DVS2VFBt1JfGe01p%2QUJ zTU;cf5Yj2LAica?H073gGAoQe9uSaOTu@wAE}~RGKw)}Cg-5ic7nFNC$<398Mdc!m z1O${7SC@-~+`;WBsmKu--$D7DlJrcE7-2PZsw~Q_C>O(WdwUAX!#rj7qRgC5Wu9{R z7b<)grjgzR)u}`t(q9xn0Hjk%S#efwfd|aZEEI8+AUbvK#C@YsbhbHji;Dd}RVWIJ zD$3*^4~UCT2PxX#Djg+*?;k8jK+?n1YZ@0R)Ss!ET{+c;%Dv?|wAE%OGM_moYaEA!Vf?^@_d zFIOnqcJ{SbcrtTjj>x=oSyY5k=7K`;LFep$@Qi=(3Quo&oC<}pxTH^6Zgx&ZfHG4R zfU+zTVDnTLcq%Huu=LFQ^fGsVvAD1#y{L~u@t0=bS&GknwhfStOrb1Affyv4|L^kO z9{ju4e@}eA{j10G@b^CR`||LA+WvFyf7*%{Diq8M**4?<)0Qzqq1ZS?q4?^;f7*J^ zS13LitWaz?_76Q@`r;+0qN0R@;p*yYDA$t-`3(AZ`G0o!yXXI%{Ns9%?|OgRF2Ll; zO0O)a2=E!zmqC?f0q=7t0Q^6L_acCkuS)MXaQKly#Mvk)FqHNjSMebZ* zb_V1Y{og$NKRoRpWAM?x;#wwM7Pl(8rb3EOk9AeFd30FOw#$c#Hc4~kBYuDT&Dk+V z;mf?(AMX4W_cE7{zpwwd%72{v)xSJ9JHXd$jED-ztSqbYaXBY^RXar|#V3lcimw&l zD|#rD3Q&P5Xa%p(Da?vsg-a2oh*zX2G8H+BLPeRPT2ZGMpctwcr5LZ6qL`_er&z35 zu2`*DtJtX6s@S2}t2m@Mt~jl@sAyE&Qan&JDPAhx`uX{F@cYQGi{ICNKlt_X1N<;Q z#!vDy`#Jq0{Nnx6{IdOu{3`wG{08}r@|);4({F*_a=%~vHv8@HJK%T1@4VkNzk7bq z{F?pS_;>d2>i?a8pg-)-`0M>0{!#wP{@MPe{x$xC{m1%G_h0D0%726Z4*x^`r~MoK zANap$qiFMCn=jjRYXi1n+8Eoo+9b5eYE#yxUz?F_rnXtwW_6n_ZT7V})uyq{!!~c) zwr|^|Z9rSFE#KDGHo9$Q+tRlE+Kz5Jv+a*0|yFR+|(d&=9d<=bT|JeO;{l~LD-th6sj~{>1 z@snPk=s!vMq~?>UpRD`j*e4G^?f7Znr^ZjyKkfJFtWP(8diK*7pLO{R{mk`Q;b)^i zTk+X}&+dNS;q$=H&7ZqJAN={E&v$)(qf47EJ-QgXWOfeedYOTvtvJ&G>HDcMre+@_XI) zdEZa|{*UkP{m|tH>4)4OCjYSQhx-9v1n2__0;UJ-4ruE3Z8uxD%5Dp~9qsnEdr3+FKryfj?tR9nl?CjCh^M{@xJ?na|?0KPA$6idYoLs7yQhub=Dod3Ml?|%)Dn^yBnxi_d_E(eY9Q7>qF~A?7fLve>a6;2g z!)l5&3pHoK&Y&Kw0#}09pf4dOG!WVdJ%)S23Gf7XAKZ$NNCC1Kxrly_2BQPfE$A~$ zjb&o9um=1i+=AERoA9RuKzN9`#5uAH8A1*tcarZYnku7KQ}^hebQ(RIKFf4v!kE#_ zezqNJVC&hf>>G~aD!8@W6CULA`4#+KAxQ8Di-j9vcQIXDAT~+?QkpbhYSebqrfU~! zuj_i~+`6T@J9?EqPrpk4*nk+y4C@WAjGVEral5IF$!Z#DI%@vh9BrOyzGCTa$+oPt zG+9Y&t#!Mtoy}pJU^{F7&Yo#sZf^>vgZl>Wc64?`I%YbqJJrrI=avxvkl>I>A(ujX zg%*WwbSYeR*Cf~Fu%NKgu;0SlhlhpF3cnqJM$|>@i|i7a8o46!Wt1UmT-3#AWpriq z&X`YPl46#}yoxo&PK<4ggX8+f9g6=ZJ~w_-LWhKygrx~D63vNI5^p7uNkfy)BnKt; zPCk(GO-ez^@2Q`prl+n;YnK+Awj!-1-IcyD{Y8d7V|GSUrZIC`<^#9RJ=uNFBYGx! z?qrEs6SMASi`kR1@8xK7rsh1%HRjIDeVS*>o0s=0-<7{C-&+t{u%_^X!nDH8MV}Yt z7wsXh~x!S30G%smxKfwA`;exqMSaSNYG>;YwxYkjiUSQq`=g*VQrA z>w16IyQuf!KI%Rr`rN6p)GVoOTbo(Cv#wj+fVyja^?eug^Xr$A_FH5{Buz3pe=*H8{B{JjUm<{D~EnOv~1|vVf?Up!`lwe9e#8KK4Qj* z){*X!2S*{JrjBYEojLm87ub#?2kyetgmRGZVBEew_H(#F~jWCWTDe zFgalI$jN_BNu6?FDlv85v`*71r!`J@PTw@6=Zx_)T4v_VJUz=WYt8I$XOEcuYL0u( z$+^0@tLJ?;Z`8cz`MLAYEwC=wurP4p)J5$VRV})`IA-y_CCrlLOTSqSx8zl|SGACGD3pYaMHM zu4C4%{+!Vj*#OC15JGby#*8c|mwrp#+t+Rgr;`ecX zboyiPAKq;>+g@xh+5T`x_Kq7nQ+Hn66}PKlclhq3dmMZA@3rjRwNJlq+kSEX)&tyu z%?Fu-8xK*3HXJ4ouRlT_S$~u|y5SgoY}0Y}_?8pGi9b$iPwqHnI<>dK-f-x2=;;$@ zqR*T=n{>AEocr9}^9ARhUZ}e8_G14_?JkYH{ORSXSH8Wn@T%(SnntSe_iLtWhp$Io zzj!0_#)F&XH(PEEzWvedsds+3v-~c0ck4aNz2o;2@85b*^5E^mp^rX$H2bmg@vl#G zPYyT5HQjnz_SE}q^z*NuFZ+}DbLWe&7gt^uzI^*?KehX?3(-@)ml%2n=EfL}4(4LmUpW7|0+Xi$ZcOgN8LEs3tTjxt4)~K`0bNplX@` zSqj#2utkdp8wjT!3pHTTdaS}k%rxS^>d8H3vC(9GWVE~#4NnE#86Ce#3$N9JKk2|l zdSJQ^n5cy&h?I&jxB4J1)cP8b*qacH77(_$C8pg+E zKs2Nwe2UZ*3{Vh&!)hE+6DUC8AWb3?1DZw5rbX=%&eOSNkjXt%q&wVxSt)$OOQE_q7H7iELG_$liI%3g;+R-aVmklV1 zOt1<%96^*NFY24 z@-QUHz%?Wbv$)2k3CiWbL3(to4xPw@(+${U37aIyGJOFyN`MEmnp$2{#i{%9$WSXk z%wd`m?wT~9Wc>0`BYqlNJ+)6#Z9-^@Rpf9iNC^k2KqY`EHJB1c0R&MaK+q3~S-J@e zt46P=ntx#QoL!R!ujx1Jr-4;tOI(R23BM1QlJPPPZjgf)%EFzL1kH7*7n^7=A1zFS(ji@4EWgZI+;^?6)QLiNj z8>kU_bch5F=YS!+x=K=2F`9A~tkn@CtkUpM^H6t8&BW5$HNyw}GP-JRoo8aUdzdFI zD~u2kbzl#uXCR$j-5eo1lPB^CV^)E18@aK@Nu z29v?EguszHkuh+Lo+U*Z7if|r2^K+E*f)jBa}I?=l$@|MuB9;pi`YaoSR!m9VPFs) zg=#5GUT!z3PED5s&EYOHSKd zuuG4)B-Fv9CJvTFlopZx2Hhh^@*$j@#rN2uC0FstItkxsqL*;W%@TG(VxBPCYl6^V z(mtU13sBH*12@s_8lD+^B{Ss}Z*DXgUsznNklCxTd66hDk>urayj-zYU*@$IdlP!^ zP0UIcahnmYuX4|vH)X=y>C@-W+_3(q6NmOT96t5)FTZ5hdSbJkIF67c$}qSnP$na5 zwMxNuKEzJh&2)$@*rsF6JYZx&EhFDgagjzPme7f;T~CGSK${kHFsP9xNDs&7Np`V{~|{ z-f>l{U(G|i&HO{XsYSBA(}#P-m{uw0tyJ1#u6`3-^e(oyH@^Nza?!9N_o@9m8XNE5 zKGXE#+M9RJ-@NZ@w>0l$T<_Hx+AO;j1NeQcYc(D+)fbX?l((Dt_ zO+5M&t6s+eyR_JDTz!VnTw2Am9?k7m)d82SSCS;3*t>b!Z=2Uxi^hulLoYnTo68zSc^xBg4 zF1V;AqUKdx&AaH*H<8)iw35?~=xZw$%R*Yb-goa>Tbo~ao8PoH{dxb=#V5BfK6rG~ zq$Bkr&QldinY+m(Rt%%Tv@rvyZ#UF=0Cj4mObfTw=*kgZiKU(=8POm zM+AosEuXbw!0Ii@wfh}m>x7`?Y>#!EdIt|S2>3M~zeu6CB=)vIUt-`JCiYJ)@m8g3 z27nuw<`~xNfS^3isT*kUrqg!9sQZoWxs6rsldx0a_T6TwG1Pu1JhCY&{asAa+tA{7 z(Y?K~aw_Gv#Ci_8q83yXHD7C#6*bGk-n{ZQzi58abm{1UH_sa1ynXDFv&PCB6+ zw*SORPfVD;ao29|JMX(zueYW3oiF&BAKkgs{QAnJNO#XretTK&_@`DWtDfeT*B?7&|!&hn5DWcnMs@q;V@F=M|LjpG$=pKPR0LfQs*MD{%I z)L*dKuZB4GG0+Z9`5Pa!kyrmJz`yD6>nSm>iV9z5mpsibeN<8Qwz$$;Givy>I(;~P zdG~f-Dz$pwdRrfRo4npP-qxqBudlyrzMmMTPjupJd^WW1)e?2`C1R?A&Ue^$%y7SZim zWHS#O;h>u=-iX6D3Fri)-ogWWdFr0P9$10~<*A7!B-a0uP9)ixPQPXLuAH zdD$xNV^teD^%?ioD+I zZ*K2-u>bm#)9+s2{`2;kXLm0rhDr&cQevnW7a}A$g;<9+&M6Zn+G%yCR#x|(Ik5kh z5krsE)^5luTv`{Aaf!EhaqT^`^w=1B$za`}BljBl69l@~K>p6F{$P9U;CeMM%3B2R z3dOw|{4Iz+hnTlY>7^1mg#;a8ls9?ou1Fj=QQN7&gQV&PP2PgwGlcpmscs0CHc9Am zO8p}TETsdt+N8&&Wv|NnHJ8=CE3a*h@w_pmPoLkn@67B&hgUaT-@E4EiYc4Mj@vr) z$9*%8p5F5KO2g$tdlH?3j3lQJZ|4&ne4RJwZYFRS16&NZ9uV*&EP9;7w=uvv z2E3D>?;SAWUCkhGS-m&J{YINKaA->Qu<*JeN$LHMDK9g6~Z(qN3 z&-!(V4o*hA3_B~67BZTU}Q@Yv-_8FFe&=!f{h)k*B672I~c* zZY>WjW&)4usD})HH^h7Z%$$T%97zLi--MEGH`S8kQJrtH_X_z?T;h}o#dcoBs=M3 zC!6f#Q$ob#Fdx!GxJ;{*om^T!bp5(vOJ7!&dL7Zvwc&R}>qSA_ClSl#6qeu<41NU% zF0w)QLi8u~_$dy0NVBgnsiiyY4FF$u10MIHU-2>C%#x>}k%u^P0o8LD_|;DwvXi0C z+06%dWFG_k$^bhU_)4(uIu5l!Xfud3VVVO(uRS4V@3`^a+Tq^#3a>W(q)vWJMN6h6 z4p~|}Xhmt=lB|A?Y zDfETWdK(6>X_Qwm{HkO;uQgtxnS(fV(iPm`3O{JK-iwaDVAeMnxGMtv91~yA+Pe~W z2~|JGkk=6Q9D$Ayy|&l{@1!a3N(Xo?IbOj%M{fvBe{s45tko$3-(UD{Na^qz=mVRVv{O-)SiTQ`3|-?gPxo9c${ojGgYmNgsq zZ^B)2Zuih zk9ioAcv@$;&uSll^t0d?Z*h$`tLjcf=vflKq!%ukg+>Bt(QsZ;dxyd=6Y3@mehXnQ zVDJ>FS}WkK!^geOsP;;kf9l;yJnT%BDkr4W&dn^I7F#wmuJ_!OK8q5om&Wv8ncjb1 zj;AgrF+@xa)1^ij(jts$5xOLoAu~R`x_V}H-R8`^Uu$a4tXXyO=Cuv4pDliHcjcz_ z6Xy4EpDD7*Kz%Th(=W1Oa$L?tXW`WF@>vPxbD|2Sg=CC0hvpIXbRx>e z#5)C9QAUg@EmE76oKf3nZbi+n$ysX(s&-7Db9Kk=JLk@xJ$GvV&W&3K4I5sZ=b4e` zzR{=Bo9+42q`xeZI|X!~0XrdpH>{THc1t6T+@O#{EU<->Z#UF&PX9bH`$23E+$6 zx}5$Y)`&2{Yye%UZ0<0pXRIlEf}?0kbj~O9N8$ya>&Oxd6Pgc(yB{r;4Lcf2?;(TRcDEyM=?p>uzWA$IiibW$sT$G zPBY!Y69{*o(A2^D%+aQT@u4|mteHdYnFE8f>g^fzCV~bzj&Pay7^j%+DJaOB5FS1< zF?mU!+M^>zTpm5@#PA_Uh7UM7X2||w1Apq5ke8I`EQvK8i;TIGmH%W&ed~alJv{gu z-(xSYIzs`6dEgMGJi~$e8RZ_i=HP=Ia#Tz1=b$ra&>NWc0%EgTYVFB+1KB20yueXc zdEx;{JSCXx6nvUioo50sP(9DGfen1Gvm((NTi~TLTa0=6xYz^k1ry(;#AEZ<4J;p% zmOMx*oa88(5}rTKmOCoMGdMVFkS%+JRgDD7ucELtX*P-pNx4bM!x9r__o+KGWcY)D z11}61a&XYVlcNS+95ZxhzuqItVe#S{37OA}^3FSS2k5~4LeLooIE^az zNWeBudC|%rWq|{nYCo+!N-NI_@C6=uO!03}?PHL?hf^;|ritdSQRGF2yumR~Xyzrw zUuTG8jQTLAI>H6*6ua#Z0`ECOyoPKqmA%a9!YP6QU{k1S$>u&APR}eIpOidUESnx$ zJUJq3q&a&;h-bJXYlJm_LNJ5{0+13x0Zv4muF$xc!lHtC6UW`3H2&p)`V)f(?;A7b z=-46K22@WfNKZ~lwq_;U^ODTNuaUrhQuVtC>=A$qCUz&I z+RZ5svhodAc@9(E;fbe=@DS!6nuDLjgx}YT*BI<7LtJN=yNvLN7M_soC7#;OsJ4h| z8NaYSHjpZBSlT-=^^iT;p+iBuS1=wlbh_uqhSB3z)HyQQw0f~%vfVw}>KSItAM45; z@5&lyE}0dklMqQH1QFAl)y@zuI!f=!%pN>og6pRU>uOGO zhybq1Pe3$umQtT$Ri`=4CIMJRcHhZ@X9ePvjcYKl=Op%yAUvj+TRgKz#5S_(-+5Uh z`H14~QrvBZy2WC*S?Vss+~LJTI%XNKnZYZ^Fg*uTL5JfLwnoLwjgRP`=}7C%&)HB~ zH9g*y%=03I;Q(($v+AwI(}MFRh7?YU$eU~}o$KhmBD!>5Y-WPPljwsx(dkJH$xaQ< zNwsCCgk&c>vy$v-3D)pX(P^V2!=%InOKPfXYI^*MVCN|U*(k~ZufD(nry2EWTAt{D zts*>){CSKTf?gB6v!aeOyxH)S~3E3(6xi4MEuVB!kiv%(4h;M6w4u zs%M9n%!n+R?kb*P@4Ym-dTD&xD0%#0xoP2lLFV}xQF$4WxoKg!8P41cTTX@}Ey3ap zrgUaPXJd@PQgjHvA4zQB`@b>>qN z{~LvF?(*sL{ppBI3lt4Zd=?7Zss);?QXV)_LbVfaz2^uV@`tr(Zy!!|} zJ~`4lAt7{XeB_Au5Pb*`g!Q5&!4aYpc_q!kj1J5h=%|_#Ryr%JWKM9O#W8(<%*YsR zPaE$1TTWhjL|%G$eriH~YHEIZOn!P)etKL%dPIIkXhMw1WMKp&Ng7eDQ8hKeayvP` zDLCX9kL+iGqXKeLL>naRsE%7J;hT*3MVtP<-F(8VpD)5=E!bcq+D8u#;eZi>W{jwr z%BUA{&}JUlu0=Np&;m+5p4JQ&H1)h%UJNg1)m5Z&qKzNpGR%k!ogEW9p*S_G%5IGz zQu4zc;UvfRU>KM&z`28*)pNp1W`~w74C}i*Eo*FO#>n7|;URx}ryw&bKO?d*BeozT zy1?x!aEBFS#1v*k7iLD~q=(0Z>CAeR(FYB7=(bC`bD^$RxrJ9kgHITRQ)cZsoAHX> za?|Q)bUNv^mnkJj*T4G+|Ez)(grj?qkJlp{EG ze_0L#)Z)rMl%|AGRf*`3aNUR~>&)4;vK!@~VV zxW9l8XRskWJb;JlIk1j{>NvQTMQa(jj)iJCs5c8&GEf->6cg$KET~FH4Uck84iA|W z9n#0+N+=4BE;NOta;#Cwuo_;(2_9isRg7Dzm>Si4aZ=fgq=bRS)M0kd7-v#{t8D+= zjEFpUq+I*Re<||Gkx`f)m6Z@yUXr_L{`6nhEa_XDM@s-MC#DG{L);v?!)BT|!W=13mXs(3SE2&Py)Lhum5k~E`n#^PmD zB5RkVqz$qs^fSudNgv{ftFz|37m}a(zbX1lPJTv&CpmKPfVyKRPBg!LCofa{dHMAG z33bL`jMM@gjmbMX30mn$ef`n6=qoIDO=r4nFkRLg&KR}F&HQBpx6Qze;WhQ5W`N+6 z)0YMNvT$DxspHUU4lifm5=v9dfJHP=M8WxlCL33$K|M zHiQF&gz^q~wHg93m?Qvw2wXlTzG!+>RHZhd&YU{HnL5xOTW!n9jQl6^-UnNuJ6c9T zMtDJxscE}LcUjA_rB?ld=^Ia6A?L*x$Xga)1N zjHGQah!=FiPNOi9M+b;-KRHu4sFsz(45=0H8i6R`(R>EXrNJCV29!@DxfGa=1jPeC z6pBPuRH#)a?`f$}0irpKVkpeFg|DVe7;B?YO5Qu}t_wzMW)-Fk4GAw6V#*CkeXJP+ zo#A=rYnq8XVDrD4SHxzE`{XMNEQX<@K}-4Anz=oga)TUk^*pA1+xIcsv$-VGa5#Z z@kR_mdzwPH;!%0lJkgmiICJ^fN=wFoP-6_Ai53CV@N}$&n?Ha5e?YS_){iK!CF?#K6+jqWnY^rbKB7 zp+S^VBcuk#K_3VRLNyQxVOj#$;kpn`UWqqEGa=bJYX%!v7M$EWiZGGy70IIh3)!CN ze0O4zJ1#pXtZ)B*=da)WYpCy9UfsHT<;MN9O;69CI=S)JpXVJpyzkkwr|*x->**~r z!OAJD(jw;oX#abdyz;ZaWl)?&0G>?X}Su|TB zvMg+7Fqs-c*4O8T$6M5>5}`FH4I-2*M+0J@yz38Q@`gR2!8IyE-qi*%Nrsv-LZ%qr zmMo@}MkEwOY8dEmExB2-GV(kz1(``j*$Fwh;RTf?yN;ZGZ~fNhx6kf9x^(Bs$@_PY zUT)a;r16?>8QoX@OU`>m&2QeXuFI`=8@B$MA2~;Uv4m3BGn!&OUMAAzTDDxz7i*a! zkt$`00uFbJSc-&&@j!GKn;a)5Cu@tUk}w^B(J;n9I4jqnJTu60WN1)%S6d}N`v5o~ zzcm7q8d^uPMgo^KQZSK}6BVB90thhM9W9IcOU_@4iZYW5auTu%B6F&Xx9mOg)+b4} z{ZxedsnV_Uo^k>h|e{D!`CEtl$X_8|1!ga3%gd$uT1V^Lp@Y?53b5% zkpeA|D-k&omZ_&xO=P^4^dwu&7ML{#ne9MHNkmeb6=Q>Fk)%bOmIy||8G)pEisDI( zmbdeLx|EPo4avLR@|z2=XcEO>2GuGJ@&kLA31$(uZ)S+j$&StSK% za90=aI)48B;N+c+XU|?Wo;bN-@3wVKw;#(QTjgB=Z}Z=BeB_-RaxHJXFW$-idw-hT zP44*m&zrZ-?LYDRvYbdh&ZJ3pU`b9Q#>It)(jhJ;CEKBMBBEJs4F+0W1w!(!GZl=nPMop(=60BelCoW?xe?j< zvAH>M1zB+g+41>Vi8NJpZD(`Bih%o_$G&UZ@ur{cw1!R3&NJyf4+QpSB}(H`MXb)Y>>zIZXYSkc0@S9Xcrdg!oxxd zr;D<=NOLIUj6{+>x^#~vCPs{n5~3qmdE3-zAm!I-7(K}tNmfs@dWtj9ypa*i0&nJ6 b9Z8B5WrD3~q%}j}LKs~HXG_u(2K0Xc6$i38 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_dib.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_dib.miff new file mode 100644 index 0000000000000000000000000000000000000000..f2b3257927256590c0caeaa3cf048bf27d783c60 GIT binary patch literal 13002 zcmbVy2Xqrh+pcU{Af!U_CHYcJvn8#z_o`lONtS!>mfU*D!J5SlU8U6KFf%f08^|K9V@dCut3?CkD5^SzWNJ2x{wAfU=q zR-Rj2B%%<~DYGEGyj(QpmU%KOj6NO^kXc+%Tvje30Re^S6%`)Ql3q~m=_Hp{78aF@ zv|L_RTwN{_R6u~+Q&N#5GQNZIDJAKd9x=jd=u}yhTTw2C<@WXzl!tlBjGm&3+(J)< zr>s+%r(C{Hh41bd3t?pM_j#uhxpnfDdlM9Z07$2jvf`}V0uPv*St#NtL3HZeiTg&O z=xlT378Uz{s!$XbRg}p$3W$qO2Lf3eRpOUfz~3coP9HtzP6XUcrA%nPb3N_^!_GVhv^@8kY$ zeY{L=pv=GW@$A32=6#*NxX#Djg+*?;j<3xn?n1YZ@0R)Ss!ET{+c;!Cv?|wAE%OGM z_ms_$EA!Vf?^@_dFIOnqcJ`H5crtTjj>x=oSyY5k=7K`;LFep$@Qi=(3QupjoeG7q zxTH^6Zgx&ZfHG4RfU+zTVDnTLcq%Huu=LFQ^fGsVvAD1#y{L~u@t0=bS&GkneH$Qm zGKI1f1!9og{eP$b_Tb;O{(IuH?O!#XhrhR(-ZKV=y+ z6pD>Q6pF7d{HLtve1+nZ!3xEOWB<_erO#h-Dk@4i7_P3ahH^cbkgr4kPXEsef7krK zlYiU~^4;(6z6&sUveGLHDgu0+>WikzvViyT6afC8PW(SU@gL3lM>{kTo-9w9rzq1C z5F>k8Zc(;u?jm=tFGd4$i~esG{vV$9k2d(|Uw$o<@ST@_U)f$KU7wTjoDb{_9_!n;qaQHbz7RWLB0{`M4Yt zzO0?1lj0LaSH;(g?-e~1N(HFE6tsd@=oDr}h{C0aQp77#6q$+~MWLchQLU&|3{VVJ zj8cqOOi|2K%u_5@ELW^ntW|7OY*p+~>{T3699NuHTvRkFZYdrpniMY;Z~grII{1C$ z*TwH^zaRX1`2l{IALA$anf)Ao5q|N0X@1#$MShijwSI&AM)^(jo9VZ}Z@J$uew+Pv z_#N;&;dkEen%_OYXMWB8ZTvg?clH0yKhPicXZ-d4cK;~{PNTHB_! zt?fQ)_ia0%9oH_nU0l2DcGc~Mwwu~+X}k69_Ov_Q?pC{(?c2BivVBl{y1lJ^eEYoi zHSI^YpVNL#`|a&dw7=2*MTZU@zU}~Y5IeX!q<5(3Fto#r4y!tB>u|Eetq!k0`0#@t zKEOV(e30-#(FX%RnEJtr5B~Vz?c-!&Qj=ef^9bFyW9s6_~*Ku*jEgg?_yw&k- zr_VYCbrL&8b;|2BpwskDt2^!Kbg9$x4?p~{`-kj@;UDIH*#E=nAO8H|{tvHx_@?vc zozT|S0B4*uBv zas9`$KHl*0$&Vj@((#jCpXfhH`K0eBQ$Jbv$+1r!e%kTVz)y{zrhi)Z>8wvTe|q-Q z7oTb1+KU?wHfzR%K-r@7W&&{8^KOg-0qR)4Iexpm9Ep{>j__P{QB}Y zZNE`}6aG#0H*>$)^UcG5cl|g2@63OX{P)^_U-;JlTlKdQ-`0G)=-b2JzWDC@@2uaI zd^h8}UEe+Y{>$%m-{*Zl`TIYKn8&=#ugyrB+$0T&QeNwO28!eAOJ)akamiROhH? zsgD8v00ra%bAS_?b{bYwq*=)h%q7l|T}UT6jND1SqiCv(T20-f zd(vt2Z2BzIl?h`;GyBae>$< z1xRVqe5p~}O`EP=sJ*W1p>yk&>h9=O`aJzA{bK`SC^M`#yfSjee#Y&lHYTfSr0J;n zb91zLrumAcyCvJQ($Zultu@x|wstnVZG!D=@OQzP!OMf2LgF*42PI6uf?G;)Sy3wU@1-mA>E{6q$m4^Km-ab4md{+4F2sENLVqavJ$kfOc zkuReRQRAX6Mk}K$qj$!95|b3OJmyubDRyFPV;mgUFYZwMH}Sdgn-V%C#3U?Dc#&vM zoRWAeiA)-rbS60{xp(q`ly6cBQhrbUBsD#CU0S=e*t8XCE$OcGh3PLcf-`1kG-Vny zr)55H>)eyw_dKF!qUTPQm^Cr$Znl^`Df?cIHfL(i!(3zT%-pAWw!C?Huku~_%ksSi zu?1@iKPXHq++6f|QGU_x;_r)l7oR8rN`{s+mU5+2N}I~;WlPKb%9G1CRdkhKrVdvs zD~D8GtCFf_RlTl`sb1Inv))C$5BE{`8PVrXUrXO5HEnA$Yj)Ols~u2#t)IT%f;zvt zjJlomJ?aP7-|BDe|Kos81M&wP8Hfy=IPlLwv4ge@{%&yp!8e9jhpZg>@zAoNXNU2_ z<_&Kl#4znwi|_NzJWIVb1p=B}Ri-Mmrrn&;=vKexcTV8g<|g;N)`UsSc|_Treu`<5_E zmM{Hg>8PdemK7~){4wIk-OK6a%U686V%$pqm6a>+tx8&T{3p{-n^uFX7p(bm&8VLh zKUe;I|Ch91&aAbs-MNlgxBAy!zs_FYW&OwvejEC1Xxf;wv2j!UrW2b(Ht*cRZ(08v z^xLwn-L}s9{fpnn{n6=ztry1$jhHzo_gimD+{lx zuC8gM8h^iLx_0<_m_fY*Nea)hCmbsGdRTIAd7(v0Vr7K?JI%36P~=EeBh)c!+^;=&?`(7OlrBOvFqh{;QtcV-_1t)<;ImOVRLD z(4Eooo3!v+E%=iTT%-r4>wt+`Xo9GjC<2p2^%N~MLyP}nz<)DQQ!H!*2XiD&V z6mhslqCg!58X3^W!)7xXZ6XRqU@)tkXC}7W#7kz~OF?=liJSGv5}kUv7F;5Mv$UEC zl4`7^87+dN1aJfojnKlg4CpQ$v&(845gRIKNuEGi93pWDC18+{yA^?P7{w4-7Y+i! zP`3hS=*VHe=a=raiS;5HM-n#4VhN56j!$rDKo|gF2n1nJ1*?NVK&eryWk3M%7hnK@ zK@ibs5DW=Tg~hhv+jaT zzsvy7(rM;O;A|0|EP|s&V7LGb6Es5vXrO=%HPUme+!nL$*X-1BBm2a9VvPodCIJ{# zLnt8MTlP5^fe;LWWq=r=)?{a9%$#$yZrJhMlDY9o#c3sF1E-Fz9XBA=6Rv?VK&}VL z?FB(VrBMTb3Qz_q)oMWIGSn)STB!m74J0el0I~%kwMv$WfU;Yn0*>(*Dj|>_gY`6S z;3zwV<gP`nJvg3iW7Fms~L#Y9SG=Nf8s*(l6paufe zFrbph3JO;9I3yAXkAgf5NiuK^$-*qIacP2bIdG639jikp^5Ap>Hd(?Z39?L|gN+j4 z!K|i+*Hm%pempYN$`7-fri8mD4JaAEeAI}a##T@5lT?!snqn0>91BvyK`KxQAW99U zgi!!N)CdstLt>V0!osT2E2`!n7(Hj#q`_)T;$`bWjaE;BXEY!mFz!RTZNtXTcgBF~TYh4>b>U$Ml_8TC-;O zpkGE;&8_uJ%ytj+gk^;hBBBoL0rd<7)M^!=2?F4tAW+q_du)=eZbDwo?7X@~#q~>y z`z@)cTToLxqQDVjq8UsE%Mt=d>O{uCF?yC1Xcy_Pd+ zIg4H}>p8QIvuYW$NSJuk$l)>s24P8JYGIciaY?A1M@<|oi6|{1{SCTD_T)o2Ig9VHLrbpWk#!Qj(L^ud zl$#~&gv2~ywATco!K8ga^B16?-3D%=+ci8hO%Rwh)_+HS>Ux1+|R)JjF#Cl~_V2vcY;POb6Pu zpq)XDG(n1pP75y$)~z9c#YDHI`oQH}&-ql)auHjlM}O8~+jPWXMs*hj-T=UJM0Jho zb&l+|kJapn4sMJNZ`IqcYW1smXt$Yvs5iApws-n)uNc!R<-CY`D9 zMKA4>@YSqxjR>AL>z-TeuT1t$_jxh=7tgRZCr6-CY08f8VzvamO=yv;9~pEO-Mdf?5o z#y4*tyX2^`auyw_m7gpWq8AybnT#|+v5v^WV|OfF{r2az-nGAam#=y=d;X(QW6l-# z-H`4XHY7ClkSq3yBl(go;v_HKmZYN+xmAMqYOw~1IM2ctao_?CUt!?$xatJn^B~*( zqJ*?E{40dKh#^-=;t7dgr-Abld?PI6k~#Rei0@>8tpd2+h;0?YeKzrEXvpoP^wzAZ zcVUIi36)RFdOy!7d0f+fVx=c0Oy9U`xA&d*U8~pI()!Nle9e#UTxx!OE--2tqWE*ZmAk`MIZV^ z(B9(dgF5ttg?}XK8(HD7j@xHuf1{N9G2jw`Ug6=ZwCWVmZ8z0zFCBQ4RGlG#n+$Z1 zz#f3)D>ZTxRUIOGo_FXk*n+P*?fV#L2dDgv58BA9e-+^0bolj@m{&!GFSARYW|uyy zD0^F6>Fqme__SJmIDUEec3&v9df$3mAA6g;-Z$RXr>(EAziYmq7^Y8j>EoT+s1Pp7 z%7$8nh!8eb9vQ-;>ie&lJgs5Mw3{;)KAb%7-0<f>CebfxSF+PhbzQy>_zQj^Tj~Bz%kp z_A`M8MAb!!ysI-jijKT&75A~KjhuRo0Im|CHJtiHjJ2sS?_PTL(~QFAqEfHB;B{YumlH#!git9lRE%>92@WCFu8niZ zgo$=o-Kmw;y=M;Wzh%VGBQ-S}vI>{hMr2&#EnZxE&n!JQhF&sQH|WT{M*akW?lq9V z^Qu4CUOTv64UF;@0lY$SuLge$qR%1btx|faL{1?=M;PTz9=j_N$4%6BD)1nwx&nta>vh%x5^z_?wg|d=hLCLny;Kfo19O>Yj+wYEbkE(q@&FTb zfe3ocLO0}G)ANNY=yfm5`z7@}h5?qYz8 z;no8JeuPDjbNDs}SjT{O^7Fj|M!f4g$XizLb-LeZlLih=$sQJ7J0vN+F5ELFzR!Z3 zp&Kg3Z0<98RsHt$OZTi_muTl?#LEa~Ws)2sq}YWN7cV0MZim^u%DjVAQSUp~Xz#Q62S=;qN-lXTtP5DdjOjeUm~Sqwq77Z3cxGYM}|V zy@6t1hiA4X6+UKMrx9`!9eCJCU5^YsYt$WLp`CQkWqhwyjOvudaD~C2;b=30++xu` zh@kUHvEE^$T51QksOWxUs*itmy&^-i-)WzUB6+* zu5EuL+36%ZB_r8ECp*|=2cO~;lf!&ScXF9lDLc8ee(3sj!pKHVKh}MgO zxKARM%ONbmCm8$+4qRk|?m6`*_4p|cdPuXcFsY?G>}>6Fz}TS-E|ylfzW0UX~HxIh+cb~X79N1-kRaw z_zJH!{iIHwrlKWN5{E1;9<-vgc1c#03|(6^d&7vSi>IYHxql+nL8pYW zF`@eOxcK6nmwRhb~@0`)kSp5~6-etg+bHMLbX^(+DNC8)< zpc@3#XreC(P!ocCO`$K0*4r?6O{2Vm;a4T&d9Cph%^bv`ldg~kSNOqT>%Hjc3ub+T zfx9Bm&oS`@t-UL8mr(U{40#P<&k^Vd(QAuM@J^cYu5^IclH(QJbM)5G454glLZ1bh zmGjc7=A`yr;I3Kfu34TiY+cTX6;%ZTvr}DSs!N;dlHL z@#eJ+ub(Y`aChaV^%Lgzai1y3ei@r^pW-f1`0pJ0n@fKxF8DYabXO9t>*z+L*F7-k zBCbBhl8+-}U&Lg1-NkRyvtPpWOC|Nn64{)R^(rdyDvjTkhXn>Z!yq>~@($16rO0z6 zaGg>=N5E#7c!|IlSZFhYwNwxEMwG|~+7Xf{3W53%B&RO2Vsc#0L`UJ&@bXy+<#VD6 zra3c4nnUx5;B+F&#>6`WSy4ueDJ@c)m7G!2XKqE`Uz4-e6jbe)KIiI=-FMENJ$vrd z{+%1Q4jMMRIL|X9&wZm$r8nF2r%8WVBzFqvJ_B|_0B=|=*MlvMG;)JN4za)%PJY}_ z$2tA;#Ow#LDUCG#(hz)KYq>2)8A&}M(Z@J)jf1c9xUA(q&D^7iixk*ME1#gipE&s^ z0$(K5CrpOsoJue6Zq?=VcUmLD1hWBjrLwuh9G`Vnb7kRzGxKMinLG99lo2~hviqgP zMASywHpPcO>{IUTU;88_;Q$5xLH0Pvt50*tF-|=##l3l24@Zo$*K>|s5cQb$Z>?r z#K$Ul8y2=v|Na88MT&LjEwCX$)c!BD9mJMv+dz}@D*4P3so!Mf{%g4nY za4(qnE+rnDziwdpn6%_UQsE?f$&~Q?akku1PS4kiO?`-Px03~(A%?va3PobsZTKgt3JIMseyd6ZV372pdz@|fb^pxVbEe-Ec#kW3TJ zU!%y240(fNp3uxoioebf#~AftPIZI}+9`J1Aq3vDJH3W%FO|K_=)x(20bo<8YRTq4 z8&1zG9iNmuSS*_!T0A)-Yos}Qgwr$Jo;AXnKOqFd0s%;gpa3T#4p(SgOkq*MyouxP zPa6MnK>dlqgZGUYb9C&GZ3C(&6{IJpBwMqRgY%Ni!{d#&Bf=ku;w1#QNC%#x1Fw<5 zep2?NMs&ZxGCY8k(8t*EtUvT5~V z!Q^1~Xsc(KF@LNpcf2cWoVjFHm`*|@kq|^oZ&o{;Ty&J)lbJnuz{Uxq8|wS6sV-kq z-*<7J;`*Z0*n)U#PLe$@CA2=(wZtx*BcU4zaGg+}WqKYIWk1nu=2h$Iz_TKGC)lu# z4cfw~_Oaj@fw;lb_c`VsL;YzBzLyYp#3(x(eU-&-GQ@p~dB{i)DDff9pV87AcwiYH zw3t^;rFv`+Hnl|OoOH$wOm^XHcZ*9^IXiXYlHB35@`9rT!KTTsGv-aUq>nb|kG2;~ z2rHf%UO2;9wIn9mDao^m7oQU!7Mge;bq>n;07%ksM>qO0X2A z+VbRujs(|F5!Th5<`4l~lV?CQbe2+|VpXR(%_ad@Mt0xHf@cNdl#OdJu;(Q9jvzdy zm|HxvN5nR=>fd=;Bl(Ep?o!-shPuUKw^`~g!`$J;Lpo*|ubIIs$1ptyQ$dI06ShXh z%#DxepJ`9)&Cl6TS~Wf1mCW-Zgy8^hM6>Fx#nVFaCOQizMdVGkmd>^JUJ+e7FE%s5 z?n(5)o#^l+Icc_z-dN(nwAGTV5_o3LcjfIkhNx?1J*hOhXX% zJ;|Un1+y%|8je;mnKAlmI zW`YI_s(!q(8t*5qo$K5Dpk2XvT<|sf>CN2W{q&?OJq$04<=@<7v%cK~vAG<;C!FR$WCZC))TiF2jt- z(AhDu6N*!_s)DUCL`r_RJ)GqD9t;CB1~_++qk2wQ$?VXwg<<`cr)7-|%@`SyG2HpL zbqX@0@-rd}Ghz!eq6^%v0(V$JMoeKwbYW&xPI`Dun9i(68GX=TyKcLrI~VGDm0Nfv zG~|R)IAzwJvl*`hTW(tIjSl;rVA~_T@s>e4Y@E*J5!0$H##oTj zsW}0oS)Ywk`{;Ym2``x&Uj1Wy-jv9s!Pe}tA?ZVcWks@e3S?*V*+{lXdJe4Rpjr;DVbK}}u4SRV9MqeID;cPa0*VQB z0TxuHqlQO0CWkvGMLYX=TnR-X(S;^wD#sd?46ETqoZu0LRmHfaim6e(7blg?NJyM`b01m6zl$nm_&5HB0){b+n-UQ^AwHr$H6k_1W{%`Bt%^4zh7gL? zBLoi-EJ-sOM=V}8C9-BoO4^{{ggT>ao%A90xLRw@dm;Im|C^$}&bVti5$OtdU^K9L<=l!CKoXM+WPwqcIJZD+G-Gz#j%4M_6oiXiM)1BtV zGiORmcZl3UozS4uosqN+2JwPU*l83d^5_5&u9G8$gKAjW&5#-a?<)``Jetpdxipx= z$bj-`B$ooyk)U|sheDC4iVC&ro-&utz zL!IHpLQJ_KsgE^dpd&obob8Uxc1Qe$EO$h1rW`>&Ifd>>dFXSy-OJW(e)6`Z+1t|G z^7wVjBd_<-&5PU1iemL4!qjPFpWnXaZF&1%@~bOr=dN<;*E5J5K}QVY3A1j!mLDhJ z14O(|KAR(MfC&irL-uHSj^zQHZ8-#&fa{9HEEh4Y(A%43Ub^7bD&@L$W%KJ)of)75jo z<)!@00K0Y6J{$X^nHpxG`)jFzJl2oJdNXh(4VBYSF$v_+NRBLlgtIAF)>1&D1p=IH zAqJMF7Ud_ZFeOSu2o0i?8X+|>4*Ebq5UPPl2-6a{4%az3c_rQu%{a4l)(keTEF`&i z6k#IYE0RV17qUIk`R>FbcU*Q(Sik;t=da)WtEul=UfsHT<;MN9O;69CI=S)JpXVJp zyzkkwr|*x->**~r!OAJD(jw;oX#abdyz;ZaW zl)?&0G>?X}Su|TBvMg+72$||6>+5sF<1K1biO?F91`$e@qX98c-t`ADdBYyi;2ISn z?`ngXBtuOZAyW)*OBPc~BN7TCH4OB(mfWmZ8F`+Vg3P3%?1Y@$@Pf*cT}Mv8@BP;1 zx6kf9x^(Bs$@_PYUT)a;r16?>8QquuOU`>m&2QeXuFIu&8@B$MA2~< zkvY}HTlOA#>ysq+{ZxedsnV_Uo^kBh|e^C!&f9%l$X_8|LTSZ7j~_h zUzyy;hI**(9$b~jA_ZC^S0ZvGEK^UXn#g!7=}ESlEih{gG6w@CB@sz!R*VgzMUobA zS|S(;X9SYwDT*gCTHen0=~6;UH6-tL%U>?QqDd4(7*wk?$P@N36U-uR-^dW1lO3Du zi=EhfPfU^9r^uZj;jS*;b^QGM#>qPy&z`+%JaKZv-fioeZa0W1w!(!GZlid4x9=0 zjqNZGC1tx(b0f0zV{>!j3bNt~vg7l!5_7WSJq7W#BZuxkdHzLn^Q-2j$B!>vzOeVe z_SFae*l@4$cB^cU)>avE@(m8}-g@7?@wUjs=Y%b<|9tuIuI#C;@_(NwxkDb`yM3fE z+a6&Dqg_~}3l9q=94^Y{BF&+YBN9pW=+Zrwm>4lON{EhNM71Z^F~H63%r?QbtEZLlnJ(`k=6`>b27RJ&X%Mn4Cwy?L?*Sr literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_fits.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_fits.miff new file mode 100644 index 0000000000000000000000000000000000000000..c33d1501492e5ab1e4665494fccf36a89f7c3061 GIT binary patch literal 7382 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gif.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gif.miff new file mode 100644 index 0000000000000000000000000000000000000000..7b03270e74cad9778ca8f9b4270a1159dbbc485d GIT binary patch literal 7515 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 I@+`{#1#b$M3;+NC literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ico.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ico.miff new file mode 100644 index 0000000000000000000000000000000000000000..7cc8cd95dacf8d12ad3668fabfe160638470afe9 GIT binary patch literal 7406 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 I`_Z_61Dm_^9RL6T literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im1.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im1.miff new file mode 100644 index 0000000000000000000000000000000000000000..b92a698c21c7f969bc6962c5ef400ed0990df613 GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im24.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im24.miff new file mode 100644 index 0000000000000000000000000000000000000000..7106f7a880a3df66873ef2ce229588866a71d6b8 GIT binary patch literal 12970 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_mat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_mat.miff new file mode 100644 index 0000000000000000000000000000000000000000..35e2c8d3eb6f16db87d7a25e0fd125bb7f0382b4 GIT binary patch literal 69620 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%0D9k{h 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 VF4QVPqg+U|LXj^~+xk4d{{vs=Jdywa literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_miff.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_miff.miff new file mode 100644 index 0000000000000000000000000000000000000000..0316d8ab84600246981b603c1538e68e7b333c24 GIT binary patch literal 13013 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 Jq$dpM{{oM?1nO3nUu&!c`N{Ay5t+4 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pbm_p1.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pbm_p1.miff new file mode 100644 index 0000000000000000000000000000000000000000..a8decd1bce07f5786da4cca5cdd04b55b4fd98aa GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pbm_p4.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pbm_p4.miff new file mode 100644 index 0000000000000000000000000000000000000000..a8decd1bce07f5786da4cca5cdd04b55b4fd98aa GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pcx.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pcx.miff new file mode 100644 index 0000000000000000000000000000000000000000..33332373cea73b16dbb478d77663244e697c7d67 GIT binary patch literal 12991 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 b9Z8B5WrD3~q%}j}LKs~HXG_u(2K0Xc6$i38 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pgm_p2.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pgm_p2.miff new file mode 100644 index 0000000000000000000000000000000000000000..d8f4ac8218d07ba9cc9fac5d3a5f93fb2618d4c9 GIT binary patch literal 7300 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 AwEzGB literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pgm_p5.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pgm_p5.miff new file mode 100644 index 0000000000000000000000000000000000000000..d8f4ac8218d07ba9cc9fac5d3a5f93fb2618d4c9 GIT binary patch literal 7300 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 AwEzGB literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pict.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pict.miff new file mode 100644 index 0000000000000000000000000000000000000000..7106f7a880a3df66873ef2ce229588866a71d6b8 GIT binary patch literal 12970 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 Jq$dpM{{oMs2=4CgQl!vA(Hibj+#$F_ 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_sgi.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_sgi.miff new file mode 100644 index 0000000000000000000000000000000000000000..03f4c9c6cf0d2c813677f1e468bb67655c54e48b GIT binary patch literal 15917 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

    }cbwC4 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tile.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tile.miff new file mode 100644 index 0000000000000000000000000000000000000000..dd7674e469c67d0ffd82a01e23b921c96a14f5c7 GIT binary patch literal 41952 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 G^nU@oZY+NQ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tim.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tim.miff new file mode 100644 index 0000000000000000000000000000000000000000..c51dee9420a3670c200a21a6046cc2519530bb4f GIT binary patch literal 5407 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_uyvy.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_uyvy.miff new file mode 100644 index 0000000000000000000000000000000000000000..acfb87a58f63c2a7f353af29e521472e44df1ba9 GIT binary patch literal 12970 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_wpg.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_wpg.miff new file mode 100644 index 0000000000000000000000000000000000000000..8cfd8f2d4826d49a1e33156b994be9579c204ed0 GIT binary patch literal 5113 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 b?Wp*=+?UShgt039VS{SX*PwfS&FudHYW+3O literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xc_black.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xc_black.miff new file mode 100644 index 0000000000000000000000000000000000000000..259f7c4194ed86a62e2c92869344a24d2e341e22 GIT binary patch literal 6533 zcmeH}XH-+!7RS%M>5Y~U0V$W>44n|bNC{OyiU@+J#N-kJB*YZJ-VhZWQB*{*BBLS> zI649{Rz$HdDE2-egNQl~j$*^|Zgeg6y|rfETl3|8VShO5clX)*o_+uO?6s~`%#V}_ zC1{LLA{AvLNFJ(GNpt0VcNaIRC`YJL@#9peMw~0qGJ=S5b8?j`zB_`*glaX)4-@97 zP%7rt$mA-%j~jw0bMsYvFD`JUW80eNkvGV z00tC51nvL`MJh$i#IQtwS!AdHQDH$^{%S9;0Z99FnG+F*AYc9e6X}Z-N;Lpb92V^< zMpYt=3o*{gS1YvsL5x{5vb7B3wXDPn#Mns7lFvNmQ_N=$)UsG67h^HnniXQ1Sj%k~ zFVEAU7~`TbF3OXl`50fp*ankXit%fVSu#|p0sv3f`qii?6Js}w>B__e0mfqiAk!t^ z@QiO*jTT^a0wBm$%u-4vnQFvAo8mZ4pdluDdUn%kgl*A;R)h7R5^M!Epcd4F{h$dP1}DI2 za2{L)SHW%24f?=iFbH0PVF-dq5CdXD#*hVM3pqm`5Dyv$g+kF#0+a%!LlQ_1X`s2# z5~u_!gDRozP%ZQ$bO<^DorSufn@|rl0R0KQg>f()X2E8#9qbD8;2<~(PK2kz5_l#& z8!m)b!4+^dycceSPr&Elt8h2`7#_j_91X|DS>iZ29!`LZ#iimha7x^KTrsX3SB_HAAr;_F5#pH7G9`aH0C2~J` zn4(9qrT9@|DPqbjN-3p=(n7gF>7xu&^{Mt$J~fe=MO{R#pw?4QQSVTn(`Ym+nlCM$ zCZ#Q;RnYd)&d_>jZ|DYeC%S;1M%U0+(Rb00({IwBGZ+jzMj#`Vp=PXN)G|&o?lE5L zFm+sXB6Y+%3v{Y<8g(w|Jk_P>+Uf@BPSc&OTdsRR_k!*dJ&K;4oTGV=Qfzs)nYJ5j+ihRj+1n-CEwgK~duVTDA89|^zRv!R1H&P}VWva1!xcxO zBhNA0akJw^C)ml`DbuOS>4G!t%ypJJZ+7k)Lm1;bMn0x`%ykZ(6U52m)Ny)T*e=m7 zi(Q&rp1Rt&rn;_iZFl|P=Ixf_R^xWt-N1dk`(pPN_dh+HJVYK<9#=dWo?)H~JexhA zc{zKbUR%6wcr(3Yyq9^mdcWuTaFyJ8?tqVtPrA=0pX)ppFOIj8cgC0C8|=Hl_pt99 zKdztJZ@=Fk{v7{o|2_T>$J&oY$JUJP%b8tfLV3_ckAO5i7$CpaF03keS?4(SXv2%QvK8G0|wDoheq7d9B~ z9X==gcmyFLDq>B<^+>ZwQDkl8;CP?$^TxMD(W53tRYu*9c8XR;x5U6P<73vw+?ilI zK|Y}=7Q{xzu8qALXCF5+?&o-7d|Z50{DTDdgt-ar6PXjIPuw%{Wnyq*Y2xik4wE#K zT9b5>(voVEUL}VlmnC;kcAY$L^7#~#6lqFxDk(K7b!Y0(l+Y>br}U+Hrxm4Ln`%F` zVCvavCew1J9ht5>T{!(fIw3tdeNXy3VXUxPI5Z=2#-$EZ0mCTa_REU6`m_LuJ}+aEl8_EZ%%+OW>CJt!7(G zw!Yma-F9Pp`1ZzXyXx{C#2tA%9@He&w13b0zILa{&XS$)cgc5k?@rj=R_jw+yT^1- zX&qdrsTAwM+NbLzJ@up3JDfqj~NkA6)5@!I~V{jCRh2kL*a{b|!d=E34d zsBu=~U{hvOcXLW}*P-!;T3h^E4*u-&^RB~|hpUbl9w|LaJz9A5e z(c3z`_4dihC$F@{w{@P1I(6oB*y)q)LG8!R@Xs7R>v#6hIo`RZ^W5`|9o`)WfARk1 zU?;b;@q*8V=8L`;Te`+}9laEA>BQxb%crkIUO9ht!qu*8ldj#ko_4+ahWN(An>jb1 z-O9T)e0$*?!kyx~dUwn3ncl1Z)$!McZf^IHo{*l7`xEcq?iKYu{!R7UyS~B)j0ffY z7X7skJsut&2phQgXv(9$$BM_pPl|rm|9#U_ho?XN5%@>P;N-!+XUb2WtnS5Y9=>$l}{(@Up#}9bH_AB%+5t1d)QnGXyzk3It^f@?ZdB z#Kk8t2qO?0Qit%6BLpS$M8b%rfl&~!kN_@21O_4g-}dnighI}4+6FIXF#hiUKY7|b zA)E(6sKsEka|&O?1AZCsvkLNrNdFt)(^h37J{pVoFc1iQI^w5&_ibj!eD{43KP6j` z0>&Vkg(=x7h<_IN75QR5@G;@QFVD~57Xbej@J&IQGl2gY__S<(vIv5(B&0u&&r1is z1Mo?3R3sPpo)Dx)O8bYu>K}d{zYyqzAa0JZ2+l}L&tq8dEE$gO?rcUdzaWdBmuI^; znU|Rir!crV*}`N&5d?jY8JPv?Ah~6LB(ogdSu9&8JCOdr?0@|6uTlTAgRJfM5q~b3 zT{G0&D}VR>J@@avoOTFee*n3u`MYmbGXxE8h9LUAzxzygK@hnNf(EYsBc8cPy`<;m z2|euX3knMCGWa|@B%y!V|2p8Wk^kQL$Mx)x>;08GhCe?wS)7%}K$42=7BS42-7gH= z|6auZ?}`7A^$#63k^EFX%op(Zj2KX58Gku7|ut0uqTiP2N5AMM1%AoV`u?n0og)MkQ>B-e4zj+6j}sDLGjQEhzF%Z z*$@mBKqb%ys2r+-YM=(F1=VpQMVdxa}6LcB62Hl44L*vj>=q2<9`Up*- zP$&XQ6GcVop-fOrlr_o;#YTCf0#MOa)6lu-HRv+56y1bwNAE)q zpiiMMqi>_f(J#>-Fc3xqGZ!-tV~b&9xR^zl1WYOh#;n6sV&s^1%mK_%%z4aB%sA#1 z<_i{&rD7RaTPz0~jE%AgFlJCj(>vxKp+tG2-XBI z!XiR4A&*c_XeR6<{7AS#cuM%JrlDq{=A;&=mY^n3+o&d2>ry+Rc0=u%+LSs)ovH4j zzDPYqy+~cAu24U!epUUc`V>){XioGZMiEyNHxQeM2Z-m04~TziXlTsWaMxI(k)g3( zqe-JzT z!97E?p_O5zVX@&J!z+d#jEs$fjD$wbMrVv(8P7HLHC}C8Z+yad!h~w#ZIWS9Z}Owb z3&tFVA0vy=#5l`%GtY2d@I3Ln-SbA~P0cr-A3cBL{GRy_7Z4Y)7o;wzUvPTC8&eb0 z2-6bNZqs{Abtapc&TM3!XMQp>H;XmfVm4^@+?;M6V!p<_+x&rrriG71u0^}WEla#5 z+cML#&GMQR+RD``-Ky2} z(QeT0wY{l*g8er8^Y&jITph9;6b|kP|{1+xyYCfrQjlH9htjk0O%#cT=tf;-NAp?j(Ou=^Je zmPejPpT{2@TTUjYi}T#m+>`IA@O z1{DXL48{eA1#b%;4KWJgg{VT_gt~>U4Luu13R@c1681RUDjW_!8i9@oji`%w@B{M) z!4HFrphY2z>J~j*Y`!>m@v$ZNC5xA|F8M9eF|s7`{8H-Dl}o#pevDceC5yTrZ4oVw zJ{?1jNsLj&e2Vptt&JUzvyWRFcR5}^J|li8fshcB(2?+AS-`S}Wls}b6U!6tEH__X zxcuS@{S{d&j;|!IOkQ~?36~U`)Ri=yyePRn`NOJ^Rohp+;cV6YHjNCG_SO}w25?|bb0!#3~okC#@p4wt9P#cl({IgGxJ+kY*tUUT6R+Q5rK{% zQ*buNIHxe@y3kr!E*#JG$Zg1d1BbyKB9v&kXef^cUZ$>yEySC}kMh0qTk}5`#1tGV z)GibhUMaFF+FJB%P2d`3F}9dje7a;_$%c|gYyH;lUWZz@YTfD51*K)BPuB;n-@Adh zA#=me8yz;*ZhXHfcGJ-^qq6m7Pc{c_?k?9Vhs#H|aJKBMz*b~bjBIt@+Pw8^WlH6x zDu*h0)wF~sxm4{~-BkTenkpTUv1B`H@HK*(JKKD=?XA_WT~qs{E~0Lro>5;}|Gr^m z!$rA^d}kxEQQSD*6y7w{Y}#DYJl&Gsa=Ue5YtMGW?OV5hYD;OmvBP)Aft^M>t9DNA z%GfowJ81VnyIH$@4}MSnp5GKPit|dgQq`f~QPnZiDd-&E8@cza%1x!}GVGFdqr1i3 z6Z;bPUEA-!f9Qbif!#fGd#ZY&UUBb>gGmSP^o8}EKEytB;4t&>_I_%A6NGN zpNTtj>+F)VBj>`-UHB>Rr!(jM&i{D9>%#CwkBdhxu`dl?W?de*;(De3XV;(mM_3~R zSKY1-U30&7^t$Ku6E}QroVw|M^QT)Ow=UoQ;r8`A(Rap16Gz9#QpTR&&AR*cUjDtQ z`|BUz9#lT0Je2=p_)Gi0EdSLr&Kf`d$p6um$4ejIf5Ln6@>kKX(@)EO)BH{T%;cHs zxzqFEiNJ|#FP6P{`cn9E>Q(vg+P`mqZSnf>AHIKFc@y{M>09{iw|A01_5SR9@ACfi zhs7U$`I!B2>Qm)sz0Z5Uu)mz2jGcToRWMDMZkn;2Ir=s1>w|CE-@aMf8{1l2TUnah z+Bw=f+1RqI>|7k2ZLQsGtQ@TzoSki*J#9RkZ9UvASsZ7Ms}qOg%yM&PyN0tDTD$wZ zdIpBaTbua1+Xir)qd9hQ99FoEWd_S;wTE+whppJnrikN|WM|6t`60wx91vs^9OxDt z%Uw84(s77Uv%y5s(lY7`-Gq zF)rhWh>ZC3poH|L@r42LqQ(4W!Rafa3*tgWQ4yI5nd$tn)x4;T)Yz2bptQo++|+1s zUQ9kOe06GCaZyHgjwmipmbhZi^3!tuViLYI!pLM6d>k)sq@=*UR zv7ycWK@Cyijd9VH@iBFo30qPl>$B2S!2yRN!;da6KA0Wfo0omo!}_v^^+h-H^PbM5 zZdPL+uJ`QBzZtNf*;>A`aeL}w{fg!B%$@bg()x>)+n~>D> zvw*;fnAnd2p>t-CN&w0WYq>|92}#_|9+tEFF_{g`t zJ%6^Hsp}f4+k3I+*tv_Rx3pe8AU``ibn!^%x6P7o+v*;5DXxzk`h8;G^IOAXm(E_l zK62{pvl~x;y8HO~%e&VmUfzBC;`Xy&e|!Jz`Q+rp*RM0vlONu`d-vO&Hv}S)L?WrF zfe&~w0|w4D>E?8%xkJ9FQ`NV#K?%b}MfrsSfuJy_xVS)1TV0JrKw$}L`hI06m$7#oO3&ZCnH=Oo zCZJL3z|d9~E$aU*%vDvk!wjfiI@CGq+EymWIpaGN;akite zv584}g@a#cNX6EX3+MT(IGTW>re+ziJRxyaGN4c>G#xsf$wcPTLHfybP%Lyhg-kD5 zC*E9;n_G~Zx5mLZuXmrf$EJfjcI@gua-wJd{_=GOYNqzfmoHzDJdzgVqD`jIo$1cs zDY|4(aeC%@bX^MB;gCe2$Q2a}Mb#}GN_mZ9)25?4d;4|((4IX514H}uY2hOyBcpHM zjRtY>AR?wSlgV@jacEKilgTvIrEAeQ3x!2OVQy}2aaC<&bA3%^XLny4tmxgjYghZ8 zf&QVP{bg^zeVd$_`TFkaN>GK`$V|8EOWE_uYD7(4y1p)nXpk)w3gAkS5U!R;rOmaH z8mY2FSt%5%`uYyF4*)IwXE%MEp0&x*Q8JN0q%bWl*$*E*ydUYTLosDi=D5396bN&L zuvAthlXcWKHr7fdQf0RSh7~GRZ-0OPz|hd(aM$kuGBZ8%@$(lZMN^GT2b6n{9zA+| zdWk!Q;=J_smc6hLu9V58a=Emlxv{ZcB9TbD!M;><7k3{#GB_|aI5@bsY!XmrCf`oZ zfQ*nx6sEb`*!cLP@rQS#e%P@0aFp)wzMAWr>m^E6 zcV#6Ei;9mPJ9gs4@R{?b2xV$!3Q#N%j-{pB$$JkT-W$7iu1((7TCHkRf+R@l>+7X( zbprybl2pkW4l65Rp%Csqapc(WvB4D{pQooky?;OT>5~O8OJL3mBTwFqTD-6o)Pzc; zs8$psQkol^>Y5rQl6tuUH1$%c5>SN2CypOKKG=RS>GgZC7k_>K>Fq4U0w{82FB!Xi zDz8euv$tAUEd%jOq|NoUjZNF?+UlC>>U%+&Dl5CItE*u6$jdXw`w#sTw>)rp%B4#e zMkf#Qzbg1ObjdJ+F%QM6M zyKDnjB=Ii+yYm`}2BBEk+bz6y``Dq~ZL(@1EUS@%6=`VM*4S9Ld+1QLATzgG1yUG(#;WjJ39*t@L?|ui+XT>>(N6yWeQ(s+ zZB0#EtE^Jh)p=N{l-mK47_-rv62CNU`~F)4+2=~55?03DX>lP9Cb?vFmN zQ1ms(M8yY0HMO$(#^%F^4qN4xx#~**(DeF1ZAcM=hB^@2LwKY|T2Zsmin)(I@>*X?;T;2ed4b-3r1XQj` z3rdWS=Piqmv$3|caP_wESsJxC`re-(-%eZ&-+1C!M@OYX(%UPom%xhZ!Gp5CwuYAG z=6YE}gB`+rKwpQ`0r3$Y^Z7KqX-8923y27$MOq`3$_CrpjnFu&D=T8+696VI z4vW%evH|2l^w{0IW08Jb@A8Akl%V8m6qU*<@GX-y?5L}2X^_k04J~qHTU8zg3#6@X zdga%|m}N*raq&1bmg3A_^5DVgv9YlqeZ0NB*B+FE>q#X=5~ZXPVB{@zy$3t$0Yu&) z1G^E12Y2l?g$&OBdeO!S#1kJMpFp9IsZ5u!Yj;mBT^a!(T;DYybZ}FGVQB}9++*bO zzJm%7P6J4;66~T(#bDQ3O>5qz^Jdh*cmPR==UG@eTd};o!y*^Dxp{m0a@TH#CE%_i zmBPYGB`7qYpc;me3);*d(i;ccIug3wd{eMX+!dVp1S3UB5BVjAMpSmL)7p1*_!E_2K#l z`*XR${{H?}rkdi;u4COw6}Z*+_V#tiatgtd+Su3xK_Nm+3>o6Jr5ji_p4L{eyp8j~5M%6^=_w19ksoGQuW%Voq(Sk4#ieafQ zlZM0Ns5B~;XquSd=?S(Y(BU62+l2jwJQqG)G}Uw-nf%-%s%~vn$~pzv##szw2E)j3 z*5=JM^rPc6w6!&GG#U|YniOjTFdiTtE)tS|0DJW7GT1}n*y+S91e>`4v-rcnx~DI7tP4Ge3R${QAz@ud|ft>E~-; zQBJm>k%N(up^1^9k&&I9)k+sEP6H5T4M)Y%YybrZastGJ1q4KZw9Ej?TM!OnGvIhr zks~lRVlW)+98C=M_06rUtb(Xo8d^9!22fBy5sgNrdAZ<#5@0?7UbB>`_wPS}=?G!g zre17xm}h8cXJ}_*{ z-rU^YlF9S{6i}C16fK(894#6RkH=y#Kn;zC;~-KHOM3^F`TdKDFW)C4?aXX&Qy)Xk d&8;lW%uLN}xmH#H2MCDG0U)Z44M?%Ze*ob9y-NT9 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xwd.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xwd.miff new file mode 100644 index 0000000000000000000000000000000000000000..544dbc322030d295e08c28facc45599c9ba714d1 GIT binary patch literal 12990 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/annotate.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/annotate.miff new file mode 100644 index 0000000000000000000000000000000000000000..6227c16baba285d8695fe8dbd68dd8739322fef3 GIT binary patch literal 20150 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:::ppp...333vvvrrrJJJ XXX '''___~~~///rrraaawwwMMM JJJ 000 + + +dddOOO"""NNN]]] 555PPPXXX%%%mmmyyy}}}NNN,,,??? 555 DDD[[[444xxxKKKwwwOOOjjj888XXXJJJ```fff"""uuu(((yyy,,,RRR999$$$ OOOTTT + + +333nnnTTT + + +333...555TTT + + +333xxx OOO IIIcccRRRsss+++RRR,,,TTT + + +333&&&iii gggvvv}}}TTT666kkk<<>>[[[111nnnZZZ+++ !!!:::%%%,,,UUUKKK)))///]]]yyy111xxx!!!ggg'''///QQQFFF 555...'''///QQQ >>>!!! NNNnnnFFF111!!!EEE&&&&&&]]] + + +yyy111***vvv///&&&{{{nnn777qqq 000PPPbbb'''zzz}}}999oooNNNpppVVV```]]]AAA222pppVVV```RRRIII000PPPCCCIII444pppVVV```]]]SSS!!!777~~~nnnFFF + + +BBBddduuukkkxxx fffQQQ\\\pppVVV```000$$$;;;!!! (((###III111"""777MMMBBB<<<&&&888JJJ + + +%%%]]]qqqLLLGGGqqq,,,XXX,,,===>>> ...}}}...ssszzz %%%ZZZ<<>>^^^(((www::::::vvvAAAhhh + + +!!!LLL  ***eee$$$LLLfff+++zzzPPPEEEiiiAAAIIIppplllzzzVVV---???###nnn<<>>[[[OOOaaa ggg^^^fff???---%%%```CCCuuuBBB'''kkkPPP333,,,ddd,,,BBBllleeemmm%%%888...'''###999&&&222TTT```EEEXXXwwwttt777$$$===QQQjjj555%%%lllgggCCCrrr777 555\\\ + + ++++nnnEEEMMMjjj888UUUrrr??? 666ccc~~~'''XXXVVV777iiiDDD"""AAA$$$###---xxx222BBBHHH)))777KKK hhh===nnnddd:::www555JJJOOO~~~TTT+++[[[777fff///uuuppplll111EEE*** TTT!!!777bbbFFF888\\\CCCUUU\\\```555wwwJJJ```TTT::: FFFIIIMMMLLL%%%VVVJJJXXX jjj[[[}}}>>>000555eee}}}uuu777KKKnnnccc rrr ;;;SSS !!!,,,{{{nnn>>>MMM???***000LLL + + +QQQ```LLLlll|||@@@???eee@@@QQQ\\\222 QQQDDDsssUUU 444ggg ,,,hhhwww  llluuu%%%&&&ooo111///DDD###bbb[[[>>>$$$aaa\\\!!!YYY000777 NNN444TTT777###>>>lll$$$HHHvvvAAA000$$$DDDEEE}}}ppp666lll:::ooo---GGGaaannn[[[gggsssKKK111ttt>>>zzz>>>nnn|||vvv[[[nnnJJJlll111TTTpppJJJ555 &&&---DDD>>>HHH@@@JJJ ///111___JJJBBB ddd&&&mmmwwwGGGSSSTTT///SSSOOOtttCCCFFFddd===GGG + + +))) + + + ~~~///DDDUUU(((***###pppCCC***--- )))+++!!!YYYsssCCC:::^^^[[[uuu999DDD]]]&&&nnn222fff 999<<<$$$MMM ```]]]{{{"""eeeOOO %%% &&&SSS???&&&KKKpppMMMJJJ888)))@@@tttZZZ222ppp444VVV>>> + + + 999___eee~~~KKKsssDDD WWW EEECCC{{{###???ttt$$$PPP<<>>222 XXX ttt<<>> 111tttooogggIII---fff111777uuu&&&MMM,,,UUU hhh 000999 XXX + + +^^^UUU///@@@dddYYYZZZgggVVVAAA___999UUU,,,RRR<<<bbb***555000```$$$rrrkkk gggJJJyyylll JJJ444xxxKKKwww gggvvv}}}bbb===!!!^^^^^^"""}}}JJJmmm666###qqqCCCPPP:::CCCPPPCCCPPPPPPLLLCCCPPP))) + + +]]]OOOUUUcccYYY~~~OOOUUU{{{OOOUUUPPP~~~cccYYY~~~PPP~~~cccYYY~~~ cccYYY~~~&&&999\\\___AAAFFFiiiGGGNNN666qqq&&&___AAA___kkk + + +___AAA222888 /// + + +222 + + +dddBBBIIIRRR888 ???/// + + +lllGGGNNN222888 222 + + +dddBBBIIIlllGGGNNN___...////// + + +iiiXXXDDDBBBnnnooo///222 + + +ddd/// + + +RRR888 ???^^^FFFXXXDDDBBBnnnooo///FFF^^^222 + + +dddBBBIIInnnooo///222 + + +dddBBBIIIlllGGGNNN___...////// + + +RRR888 ???222 + + +ddd___...///III'''444111HHHFFFRRRDDD>>>444111<<< '''444111111iiiyyy eee YYY^^^---pppyyy RRR111iiieee YYY^^^RRRoooqqq yyyJJJ)))eee yyy ---pppqqq yyyJJJ)))HHHFFFvvv[[[222eee YYY^^^yyyJJJ)))eee YYY^^^RRRooo ---ppp,,,777eee  ___LLL===///bbb888UUUTTT^^^ttt)))^^^NNN[[[WWW'''BBBtttCCC^^^^^^NNN[[[,,,ttt666###rrr + + +vvv```^^^tttCCCWWW'''gggRRR@@@###rrr + + +vvv___}}}^^^NNN[[[###rrr + + +vvv```^^^NNN[[[,,,tttCCCWWW%%% + + +!!!^^^,,,sss%%%222 [[[222)))```jjjkkkCCC\\\,,,ddd + + + + + +[[[222))) [[[222)))KKKEEEUUU)))}}},,,uuu:::###}}}CCCKKKEEEUUU,,,,,,uuu:::CCC)))}}} + + +vvvsss<<<***,,,uuu)))}}} + + +vvvsss<<<]]]jjj\\\,,,,,,uuu:::sss<<<***,,,uuu:::CCC)))}}},,,,,,uuu"""xxxPPPwwwaaa&&&kkk ggg111III...,,, mmmYYY + + + KKK 888ZZZ777777ccc KKKggg + + + 888gggEEEEEE KKKPPP###sss + + +JJJsss KKKZZZ777777cccWWW PPP###sss + + + QQQ NNN 888###sss + + +QQQ888gggEEEEEE KKKZZZ777777 :::QQQEEEEEEddd)))&&&&&&  + + +666iii[[[yyy444AAA???VVVmmm888___===[[[yyy444SSS[[[yyy444BBB***QQQ333 + + +aaawwwlllsssrrrPPPGGG333 + + +aaammmBBB***QQQwwwlllsssrrrmmmQQQ333 + + +aaa555888<<<)))wwwlll333 + + +aaaPPPGGGZZZ```555888<<<)))AAA???VVVooo555ccctttlllsssrrr888<<<)))wwwlll|||rrrmmmQQQ333 + + +aaaPPPGGG333DDD222wwwlllQQQ,,,iii))))))LLLccc ccc 666bbbbbbPPP KKKKKKKKK111JJJ111JJJ$$$rrrwwwnnnuuuQQQ... rrrvvvttt vvvvvvttt ttt ttt JJJyyywwwUUU```HHHRRR + + +EEEyyy + + +,,,rrr + + +,,,UUU + + +,,,)))rrr)))rrrNNNZZZrrr """TTT333vvvrrr///rrrJJJrrr/////////444xxx]]] 555}}}NNN,,,EEE 555 555[[[}}}NNN,,,EEE[[[}}}NNN,,,EEE DDDPPP}}}NNN,,,EEE ===(((yyy+++ IIIcccyyyyyyRRR,,,TTT + + +333555TTT + + +333 IIIcccRRR,,,555 IIIccc OOOTTT + + +333TTT + + +333sss+++999555555 IIIccc OOOTTT + + +333 OOO"""}}}<<<:::333 ---333dddXXX[[[ hhhAAAMMM ---333dddqqqlllqqq ---333ddd + + +@@@LLL===555===ppp + + +@@@hhh LLL===555hhh!!! + + +@@@YYYNNN888333555 ```333^^^BBBLLL=== + + +@@@===ppp + + +222YYYNNN888333555 ```333^^^BBBXXX[[[ ???QQQLLL===555888333555 ```333^^^BBBLLL===555hhh!!! + + +@@@===pppVVVSSSxxxLLL===!!!,,,QQQyyynnnrrr&&& ;;;zzz666ttt vvvKKKyyyUUUrrr + + +ggg///CCC EEEqqqiii + + +UUUrrrggg///CCC EEEqqqFFF}}} + + +ccc,,, ggg///CCC  + + +iiiuuuccc,,, nnnrrr```tttOOOSSSggg///CCC EEEqqq,,, ggg///CCC EEEqqqFFF}}} + + +iiiLLL===ggg///CCC FFF}}}/// 555nnn>>>!!!FFFYYY!!!iii$$$ 555tttbbblll 555tttFFF111ggg'''///QQQ]]]yyy###\\\UUU>>>111FFFFFFggg'''///QQQ]]]yyyFFF111nnn%%%,,,UUUggg'''///QQQ000###\\\UUU>>> nnn%%%,,,UUU>>>!!!ggg'''///QQQ]]]yyy%%%,,,UUUggg'''///QQQ]]]yyyFFF000###\\\UUU>>>!!!EEEggg'''///QQQ]]]{{{nnn777??? + + +BBBddd!!!AAA777bbb'''777QQQ\\\pppVVV```aaaIII444222pppVVV```!!!QQQ\\\III444!!!SSSpppVVV```xxx fffCCCpppVVV```QQQ222~~~nnnxxx fffCCCFFF + + +BBBdddzzz}}}III444CCCIII444!!!SSSpppVVV```QQQ222000$$$;;;!!!SSS BBB LLL444www)))...ssszzz LLL```,,,LLLbbbNNN444CCCGGGqqqOOO%%%ZZZ<<<)))NNN444IIIGGGqqqOOO)))...www)))BBB"""IIIGGGqqq """ZZZ<<<www)))BBB"""www===IIIGGGqqqOOO"""IIIGGGqqqOOO)))... """ZZZ<<<EEEIIIGGGqqq...sssfff$$$JJJ111kkkWWW!!!ZZZQQQ;;;111xxx ///111===GGG + + + """***CCCBBB333 + + +!!!===GGG """***CCCBBB!!! + + + )))sss999qqq """ + + +bbb333 )))sss999qqqkkkWWWCCC### """***CCCBBBsss999qqq """***CCCBBB!!! + + +bbb333000555;;; """&&&MMM"""xxx'''999+++tttTTT + + +------*** + + ++++tttPPPooo===777+++tttTTT$$$MMMOOOeee555444111[[[OOOeee---$$$MMM555444---000OOOeee'''KKK555dddOOOeee111[[[222sss'''KKK + + +'''555444'''KKK555444---000OOOeee111[[[ 555000&&& FFF<<<333$$$---***LLL777bbbDDD333$$$JJJ###333$$$ UUUEEElll ,,,,,,:::EEERRRlll 777 UUUEEE,,,,,,:::777ooolll qqqLLLSSSNNNNNN,,,RRRlll EEERRR%%%qqqLLLSSSNNNNNN---***LLLOOOooo[[[,,,,,,:::LLLSSSNNNNNN,,,,,,:::777ooolll EEERRR + + +QQQqqq```,,,oooUUU,,,000```zzzkkk333333///aaaaaa)))))))))&&& &&& + + + + + + + + +EEEYYYEEEYYYdddBBB"""mmm111mmmmmm111111444111TTT%%%IIICCCIIICCC]]] UUU+++RRRhhhXXXQQQhhh,,,hhhXXXQQQXXXQQQ888XXXQQQRRR&&&---@@@ KKK... KKK... ***bbb>>> kkk ggg&&&))){{{jjjlllZZZ<<<jjjvvvjjj333TTT '''TTT lllZZZ<<<333'''lllZZZ<<>>ddd$$$&&&BBByyysssuuuPPPhhh000HHHFFFiii---000>>>ddd$$$&&&BBByyysssHHHggg)))hhh000lll"""}}}@@@lll000>>>ddd$$$hhh000uuuPPP ___lll"""}}}@@@lll--- xxxWWW...000>>>ddd$$$&&&BBByyysss@@@lll000>>>ddd$$$&&&BBByyysssHHHggg)))hhh000uuuPPP(((RRR000>>>ddd$$$ggg)))gggvvv}}}666kkk<<<fff'''555444555$$$DDDKKKddd--- '''555444{{{  !!!ccc'''555444kkknnnxxxOOO ```kkkOOOkkknnnxxx ```OOOhhh%%%MMMTTT + + +mmm--- OOOkkkppphhh%%%MMMTTT + + +mmm---555$$$DDDWWW}}}111&&& ```TTT + + +mmm--- ```OOOkkkuuuqqq;;; JJJmmm111ccc{{{[[[MMM^^^(((!!!AAA + + +>>>CCC[[[qqqKKK[[[DDDIII^^^ FFF>>>XXXIII^^^(((DDD FFF>>>(((ppp>>>III^^^ggg,,,(((222 FFFIII^^^XXXGGGggg,,,(((222MMM^^^ FFF>>>222 FFF>>>(((ppp>>>III^^^XXXggg}}}NNN FFFppp>>>))) + + +@@@000444555!!!>>>,,,}}}XXXhhhddd555!!!VVV555!!!))) + + +>>>bbb---;;;MMM hhh))) + + +>>>bbb---;;;MMM  111iii___III(((BBBOOO---;;;MMM hhhdddiii___III(((BBBOOO>>>,,,aaa |||---;;;MMM III(((BBBOOO---;;;MMM  111hhh---;;;MMM 111&&&]]]999jjj + + +555]]]999jjjbbbddd(((999jjjtttccc@@@iii,,,XXXQQQaaa:::[[[<<<BBB@@@iii,,,tttcccXXXQQQaaa:::[[[@@@iii,,,nnn...pppXXX@@@iii,,,<<<BBBnnn...ppp + + +XXXQQQaaa:::[[[...pppXXXQQQaaa:::[[[@@@iii,,,<<<BBBFFFKKKXXXIII"""777MMMBBB<<>>rrr888>>>rrr///CCCKKKKKKeee,,,777,,,777,,,```222222AAAKKK,,,hhh,,,hhhYYYYYYYYYHHHHHHHHHbbb$$$bbb$$${{{]]]AAA$$$ UUU777444 + + +777777444 + + +444 + + +444 + + +```;;;LLLPPP111CCCPPP999PPPfff111CCCfff111CCC555\\\###MMM111CCC\\\... + + + ooo(((YYY (((ooooooooo'''QQQddddddKKKdddjjj jjj  nnn###YYY>>>""" qqq"""  """ mmmqqqmmmqqqYYY qqqHHHuuuSSS???eee```TTTGGGFFFLLLUUU???eee```TTTGGGFFFUUU???eee```TTTGGGFFFwww%%%qqq???eee```TTTGGGFFF fffrrrmmm\\\KKK777|||999###jjjppp"""XXXrrr(((rrr(((mmm\\\KKK777ppp"""XXXmmm\\\KKK777rrr(((rrr(((777 fffrrrmmm\\\KKK777rrr(((rrr---...LLLVVV uuummm !!!JJJppp&&& uuu---VVVmmm !!!JJJ---  uuu uuuppp&&&{{{rrr&&&mmm !!!JJJmmm !!!JJJ---  uuuppp&&&"""'''bbb!!!###]]]###222999$$$]]]---FFF'''bbb!!!###555555[[['''bbb!!!###&&&NNNCCC>>>UUU&&& 888KKK;;;***yyy///qqq>>>999$$$]]]&&&NNNCCCUUU&&& 888KKK;;;999$$$]]]777```BBB[[[>>>$$$SSS"""666[[[OOO]]]zzz999888UUU&&& 888>>>***yyy///qqq###$$$SSS"""666[[[OOO]]]zzz999888]]]###222iiiUUU&&& 888KKK;;;[[[OOO]]]zzz999888UUU&&& 888KKK;;;999$$$]]]777```BBB[[[>>>***yyy///qqq>>>UUU&&& 888111OOO---===jjj)))333yyy111OOOvvv 111OOOaaa###BBBzzz ===ttt---fff###BBB===aaazzz ======yyy TTT###BBB ///555```~~~AAAzzz ###BBBttt---fffzzz ///555```~~~AAA---+++zzz ===555```~~~AAAzzz ======yyy TTT###BBBttt---fffzzz IIITTTCCCfff uuu&&&PPP ??? ^^^\\\CCCfff  :::CCCfff ZZZ;;;{{{..."""]]]ZZZeee)))lll999%%% ###"""]]] ZZZ;;;{{{...ZZZeee)))lll999%%% ,,,bbb"""]]]222 + + +ppp::: ZZZeee)))"""]]] ### + + +222 + + +ppp::: uuu&&&PPP333ZZZeee)))lll999%%%ppp::: ZZZeee)))lll999%%% ,,,bbb"""]]] ###333 qqqZZZeee)))BBBYYY111CCCsssRRRUUUNNNBBBYYY111RRR + + +PPPBBBYYY111ZZZ>>> + + +;;; *** + + +III ;;;RRRUUUZZZ>>> + + + *** + + +RRRUUUjjj;;;JJJ///www,,,999((( ;;;III oooJJJ///www,,,999(((CCCsss:::\\\ }}} *** + + +///www,,,999((( *** + + +RRRUUUjjj;;;III >>> KKK\\\,,,hhhrrr/// jjj444SSS||| + + +ppp jjjjjjJJJ jjj555fffuuu444]]]"""...\\\hhh:::uuu444555fff]]]"""...333MMMuuu444fffiiiDDD}}}]]]"""...uuu444\\\hhh:::fffiiiDDD}}}444SSSrrr kkk]]]"""...DDD}}}]]]"""...333MMMuuu444\\\hhh:::\\\WWW]]]"""...RRR[[[###ppp]]][[[===vvv$$$ooo---JJJppp]]][[[888 yyyppp]]][[[cccmmmkkk{{{ + + +555 ]]]QQQcccmmm$$$oookkk{{{ + + +555 ]]]$$$ooocccmmm666...bbb$$$kkk{{{ + + +cccmmmQQQ|||SSS666...bbb$$$===vvvHHHEEEkkk{{{ + + +555 ]]]...bbb$$$kkk{{{ + + +555 ]]]$$$ooocccmmmQQQUUUkkk{{{ + + + dddOOO '''aaa{{{...fffLLL888+++ '''PPP||| '''444:::LLL +++BBBIII444oooLLL +++444:::BBBIIIDDD LLL +++gggcccBBBIIILLL +++444ooo gggcccaaa{{{...BBBIIIgggcccBBBIIIDDD LLL +++444ooo + + +???~~~BBBIIIDDDOOO```fff000{{{tttVVV@@@^^^ jjj FFF'''ZZZtttVVV)))(((tttVVVZZZ]]]xxxuuu444<<<>>>}}} ``` ZZZ]]]xxxxxx444<<<>>> &&&'''fffFFFxxx444<<<}}} ```www***&&&'''fffFFF@@@^^^VVV|||xxx444<<<>>>'''fffFFFxxx444<<<>>> }}} ```:::CCC xxx444<<<TTTrrrOOO LLLzzz RRR???444GGGPPP LLLzzz222 LLLzzz---~~~)))???mmm QQQeeerrr~~~)))???uuuRRR--- QQQeeeRRRfffHHH~~~)))???uuu YYYTTTAAA QQQ~~~)))???uuurrr + + + YYYTTTAAA lll QQQeeeTTTAAA QQQeeeRRRfffHHH~~~)))???uuurrroooyyy QQQfff]]]555dddYYY\\\~~~cccSSS[[[FFF\\\444yyy~~~ccc XXX666~~~ccc\\\ccc999ZZZ]]]NNNddd777 + + +lll999\\\cccZZZ]]]NNNddd 999JJJ]]]888yyyZZZ999777 + + +lllnnnJJJ]]]888yyySSS[[[FFFeee ZZZ]]]NNNddd]]]888yyyZZZ]]]NNNddd 999777 + + +lll***??? ZZZ ***+++rrrVVV```///!!!zzz~~~vvvVVV```"""SSSVVV```rrroooHHH[[[kkk|||ooo///!!!rrrHHH[[[kkk///!!!===ooo + + + MMM HHH[[[ooo|||MMM + + + MMM zzz~~~HHH[[[kkkMMM HHH[[[kkk///!!!===ooo|||vvvHHH[[[yyy111***>>>yyyfffrrr///888 OOOyyyiii yyy333NNN444@@@mmm666'''333NNN444@@@mmm666666,,,(((ZZZ111}}}444@@@mmm'''rrr,,,(((ZZZ111}}}fffrrr///vvv???444@@@mmm666ZZZ111}}}444@@@mmm666666'''ppp 444@@@mmm666111&&&888JJJRRRNNN!!!###!!!)))bbb///RRRNNN cccRRRNNN + + + + + + JJJiii!!! + + +!!!))) + + + JJJiii!!!!!!)))### + + +???~~~SSS JJJiii666111}}} + + + ???~~~SSS!!!### JJJiii!!!~~~SSS JJJiii!!!!!!)))### + + +333hhhvvv JJJiiiGGGPPPlll:::!!!jjj...222888FFF  999___vvv (((PPP)))<<<___vvv 999 (((PPP___vvvXXX}}} www444uuu 222______vvv)))<<<XXXXXX}}} www444uuu (((PPP www444uuu (((PPP___vvv)))<<<  www***(((uuuAAA"""QQQ000FFF***111???"""QQQ000FFF"""QQQ000FFF/// eeeeee...111xxx$$$ eee***111///eee...111xxx***111/// eee|||YYYvvvkkk$$$sss eee... eee$$$888|||YYYvvvkkk$$$sss jjj999eee...111xxxvvvkkk$$$sss eee...111xxx***111/// eee$$$!!!WWWeee.../// 111RRR~~~((( nnn...___ lllLLL@@@ + + + &&&&&&!!! EEE :::777!!!&&&&&& EEEuuufff!!!___444PPPFFF{{{yyyxxx!!! :::777www ___444PPPFFF{{{yyynnn...___ NNN''' EEEPPPFFF{{{yyy EEEuuufff!!! :::777(((uuufff333"""dddsssTTTmmmlll444]]]DDDLLL%%%)))666RRR"""uuu|||<<<,,,DDD444}}}444]]]DDDLLL&&&yyyfff <<<444]]]DDDLLLeeeOOO'''aaajjj"""!!!VVVkkk&&&***QQQ^^^'''aaa|||<<<eeeOOOjjj"""!!!VVVkkk&&&***QQQ|||<<<###'''aaaAAAkkkRRR111jjj"""!!!VVVPPP'''aaa^^^555bbbAAAkkkRRR111%%%)))666RRR"""uuubbb"""jjj"""!!!VVVkkk&&&***QQQAAAkkkRRR111jjj"""!!!VVVkkk&&&***QQQ|||<<<###'''aaa^^^ggg %%%wwwjjj"""!!!VVV###:::KKKyyyKKK___fff kkkfffccc + + +::: + + +:::MMM ZZZJJJ666<<>>;;;>>>WWW000BBB~~~WWW000{{{;;;>>>;;;>>>UUUJJJ333DDDrrrwww wwwMMMwww>>>\\\&&&///PPP***\\\ >>>&&&///PPP @@@>>>\\\\\\***RRR]]] DDD'''qqq+++WWWyyy999CCC ===UUUlllzzz [[[555 + + + NNNqqq+++WWWvvvPPP777KKKqqq+++WWW~~~ + + +@@@hhhEEEmmmaaa555HHH\\\###bbblll(((^^^EEEmmmCCC ===UUUlllzzz~~~ + + +@@@hhhaaa555HHH\\\###CCC ===UUUlllzzz+++VVVGGGEEEmmm}}}"""000 777 mmmEEE|||aaa555HHHEEEmmmbbblll(((^^^KKK}}}"""000 777 mmmEEE|||yyy999vvvEEE@@@444yyy111IIIbbbzzzwwwFFF$$$ hhhddd@@@ + + +;;;fff@@@;;;DDDYYY~~~BBB???111IIIbbbzzzwww;;;DDDYYY~~~BBB111IIIbbbzzzwww ###888HHH%%%KKKyyycccrrr>>>YYY~~~???EEE888HHH%%%KKKyyycccrrr>>>444yyyqqq ZZZYYYppp'''LLLccc>>>\\\...ppp'''OOOVVV)))ppp'''###+++)))RRRXXXZZZ444JJJXXXccc>>>###+++)))RRRZZZ444ccc>>>"""(((dddXXX&&&LLLUUU ZZZXXXJJJFFF&&&LLLUUU LLL tttZZZZZZ(((NNN pppaaa@@@UUUppp(((NNN|||:::hhhBBBFFF(((NNNfff"""""":::AAA999FFF;;;"""fff""":::AAA999FFF"""FFFCCC444hhh***""":::AAA""";;;///FFFCCC444hhh*** pppaaa>>> FFF\\\000^^^nnnGGGHHHmmm }}}EEEFFF\\\000111999RRRFFF\\\000!!!<<<OOO + + +|||}}}HHH jjj OOO + + +GGGHHH!!!<<<|||}}}HHH jjjGGGHHH...OOO + + +oooFFF + + +###|||}}}HHH OOO + + + FFFoooFFF + + +###^^^nnn"""lll}}}XXX|||222,,, yyy III666$$$ bbbTTTiiiooo >>>|||XXX"""mmmrrrJJJOOO((( EEE///XXX""">>>|||mmmrrrJJJOOO((( XXX"""ddd###hhhmmmrrrJJJXXX""" EEE///ddd###hhhyyy III!!!???mmmrrr ooozzzKKK)))OOOvvvyyy  ooo {{{ + + + ooovvv (((KKKRRRLLLmmm555 nnnKKKRRRLLL)))OOOvvv (((mmm555 )))OOO@@@VVVKKKRRRLLL%%%mmm555KKKRRRLLLnnnIII%%%zzzKKK//////BBB!!!]]] + + +___222LLL333 + + +___EEE gggeeeZZZ + + +___ZZZ444mmm''')))JJJWWW"""SSS444mmmZZZ''')))JJJWWW + + +444mmmEEE444'''444mmm"""SSSEEE444222~~~ooojjjxxx###VVV""" +++YYYjjjxxxIII+++jjjxxx'''PPP ###>>>lll VVV'''PPP ###>>>lllVVVYYYNNN###xxx ###>>> MMMWWWNNN###xxx###@@@GGG  JJJjjjMMMRRR:::hhhDDDVVV JJJ&&& JJJYYYUUU666666```WWWjjjYYYUUU666666```jjjDDDYYYUUU666WWWDDDYYYUUU&&&)))wwwnnn"""GGG111DDD___\\\zzz---kkk111111LLL111%%% %%%555JJJgggjjjiii%%%555JJJ\\\%%% gggjjj\\\|||%%%555JJJ%%%NNNtttggg%%%555JJJiiiPPP%%%NNNtttDDD___QQQqqq```wwwUUU```HHH222$$$FFFGGG 222$$${{{ )))222$$$;;;BBBoooRRR???AAAXXX888ZZZGGG;;;BBBoooRRR???AAAXXXGGG999###JJJuuu<<<RRR???888ZZZ}}}###JJJuuu<<<FFF555RRR000"""TTTKKK%%%LLLuuu```|||444eee,,,LLL iiiLLL,,,fff{{{$$$666VVVJJJ777555{{{$$$666VVV```,,,fffJJJ777555```{{{$$$666VVVXXX}}}***CCCJJJ{{{$$$666VVVTTTXXX}}}***CCCuuudddBBBjjj888XXX111222 lll>>>000RRRppp)))yyyZZZ111222 xxx[[['''???111222 111YYY;;;yyy}}}333NNN;;;nnn###---ccc;;;yyy}}}000111YYY333NNN;;;nnn000MMM...;;;yyy}}}%%%hhh 666333;;;yyy}}}###---ccc333%%%hhh 666lll>>> @@@KKK666kkk<<<===wwwjjjeeeOOO]]]aaa)))@@@ kkkjjjeee 333+++ooojjjeeeeeeNNN + + +111eeeZZZ $$$eeeaaaNNN + + +111eeeZZZ aaaeee000 + + +zzzNNN + + +111eeeZZZeee$$$^^^000 + + +zzzOOO]]]wwwyyy]]]NNN + + +111eee111ccc<<<:::nnn %%%LLL000&&& AAA %%%LLLxxx %%%LLLFFFCCC + + +  + + + XXX---!!!www + + + &&&FFFCCC + + + XXX&&& + + + 111,,,WWW___999{{{ + + + + + + ---!!!www111,,,WWW___999{{{000|||@@@000,,,BBBIIIFFFaaaZZZ!!!BBB sss BBB{{{ + + +\\\TTT+++ggg222 + + +aaa{{{\\\TTT+++gggaaa;;;~~~ + + +---\\\ + + +222:::---IIIFFF~~~vvv]]]///999GGGsss)))000 sssXXX;;;iiisss999...777PPPHHHgggiii666"""777PPPHHH)))999...gggiii)))777PPPHHHZZZDDDQQQggg + + +///777PPPHHH666"""ZZZDDDQQQ666"""777MMMBBB<<<]]](((777///\\\kkk(((ZZZNNN\\\((( + + +QQQaaa%%%(((222RRR888KKK///%%%\\\ + + +QQQaaa(((222RRR888\\\UUU%%%<<<333(((222RRRUUU%%%KKK///<<<333777/// (((222RRR[[[BBB ddd***:::XXX;;;***$$$***777bbbzzz...666???))) + + +:::777bbbzzz...666:::DDD@@@VVV&&&VVV444zzz???))) + + +YYY888@@@VVV&&&VVV444)))JJJzzz===fff$$$XXXxxx}}}OOO%%%...sssVVV///+++RRRxxx}}}===xxx}}}///222///&&&///sssVVV222sssVVV'''///KKKnnn222//////&&&KKKnnnOOO%%%...}}} + + +FFF~~~'''000 rrr[[[777... ~~~ '''VVV DDD+++777888kkk888vvvDDDuuu888kkkDDD+++777888vvv888kkk???zzzMMM!!!~~~ttt,,,555888(((888kkkDDDuuu???zzzMMM!!!~~~ttt,,,555rrrddd + + +GGGWWW^^^555 FFFppp^^^ |||WWWrrr###kkk(((|||???KKKQQQ&&&333sss!!! |||WWWgggKKK"""555{{{ |||WWWjjj ???NNNxxxBBB&&&kkk::: !!!MMMwww,,, 111TTTrrrBBB&&&kkkKKKQQQjjj ???NNNxxx::: !!!MMMwww,,, 111TTTKKKQQQBBB&&&kkk!!!999iii::: !!!MMMrrrBBB&&&kkkrrrAAA:::!!!999iiirrr###kkk(((|||???OOO,,,::: !!!MMMSSSSSSbbbGGGHHHbbbFFF444999CCCFFF444mmm  CCC ;;;;;;SSSSSS((((((000 000 ]]]ttt]]]tttEEEEEEEEEfff222cccfff222cccLLLLLLLLLXXXXXX222qqq555 ]]]222222===qqq555 ]]]===qqq555 ]]]WWWBBBWWWBBBWWWxxx222xxxxxx:::222:::222lllOOO222 666 ...666...666aaa@@@ YYYrrrBBBrrrrrr888BBB888BBBwwwQQQ+++ XXX + + +ttt + + +$$$ttt + + +vvvHHHwwwhhhRRR www))) www555hhhRRR555hhhRRReee333 + + +mmmmmm TTT888___:::AAA222vvv888___222vvv888___{{{ MMMlllllllll777|||jjjHHH///aaajjj///aaajjj^^^lll ~~~ + + +lll >>>444lll ~~~ + + +~~~ + + + + + +111___hhh(((hhh + + + ```TTTHHH;;;..."""yyy$$$KKKhhh + + + ```TTTHHH;;;..."""$$$KKKhhh + + + ```TTTHHH;;;...""" lll...ZZZ222ccclll...lll...TTTZZZ222cccTTTZZZ222ccc$$$SSSiii///RRRBBBUUU666===[[[xxx===[[[///UUU666///AAAqqq ===[[[===%%%nnn===kkkHHHjjjnnn===ooo333nnn===<<<~~~ ppp```***///XXX}}}~~~ pppHHHjjj<<<```***///XXXHHHjjj>>> ~~~ ppp~~~ YYY###jjj___###KKKmmm"""RRR + + +KKK###___###mmm"""RRR###'''KKKKKKJJJuuunnnHHHmmm777PPPsss:::!!! YYY''' + + +^^^999 + + + ;;;YYYHHHmmm777PPPXXXqqq + + +;;;nnnHHHmmm777PPPzzzcccOOOyyymmmCCC OOO000666}}}CCCHHHOOOyyy''' + + +^^^zzzcccmmmCCC OOO000666''' + + +^^^qqq&&&cccOOOyyy >>>ttt + + +HHHIIIWWWWWW///NNNmmmCCC OOOOOOVVV SSSnnn^^^nnnzzz777cccNNN VVV SSSTTTggg!!!VVV SSSvvv888 >>>HHH000eeevvv{{{ggg^^^nnnzzzvvv888 >>>HHH000eee^^^nnnzzz ^^^ppp```000kkk>>>HHHqqqLLLnnn aaafffHHH xxx aaa + + +BBB$$$777+++nnn aaaRRRssshhhDDDhhhRRRsssDDDUUU <<<hhh}}}SSS;;;SSSCCCwwwSSSDDD + + +GGG [[[FFFyyy  + + +GGG LLLpppaaa  + + +GGG <<<<<< lll!!!(((hhhjjj%%%WWWxxx777lll!!!yyy<<<<<< (((hhhjjjyyyJJJlll!!!vvv^^^GGG'''555(((lll"""jjj///ZZZqqq777:::### ///777jjj///BBBjjj```jjjqqqDDD>>>)))DDD444uuu BBBjjj```jjjqqqDDD>>>)))DDDWWWTTTqqqiiiFFF777 qqqDDD>>>---ggg>>>&&&222@@@QQQjjjPPP)))***ggg>>>&&&222"""ggg>>>RRR{{{ ///>>>[[[AAA]]]eee111```///ggg ///QQQRRR{{{>>>[[[AAA]]]eee111```QQQUUU ///mmmttttttXXX@@@...>>>[[[AAA /// + + +YYY###ccc'''(((]]] 999OOO###)))'''zzzMMMYYY###FFFTTT...:::)))"""SSS***...:::(((FFFTTT)))"""SSS(((]]]:::...:::lll~~~TTT@@@rrruuu)))"""...SSSggg(((ppp + + + )))222JJJOOO (((ppp + + +ZZZ^^^ (((ppp + + +mmmHHH+++fff%%%\\\*** fff:::111cccHHH+++fff)))mmm%%%\\\*** fff)))HHH+++fffkkk)))===III%%%\\\***HHH+++WWW nnneee666 tttlllWWW nnnkkk333qqqTTTWWW nnnPPP+++???WWW888sssXXXwww===WWW666PPP+++???888sssXXXwww===666iiiDDDWWWlll%%% <<<XXXBBB888sssXXXwwwzzzEEEsss  '''EEEsss sssPPP""" cccdddRRR + + +WWW666[[[333jjj777  PPP"""cccdddRRR + + +WWW666[[[ ooo mmmTTTUUU&&&;;;cccdddRRR ___}}} + + +kkk'''[[[FFFVVV~~~iii___}}} + + +kkkOOO___}}} + + +kkk***nnn;;;;;;TTT}}}???GGGpppnnn;;;[[[FFF***;;;TTT}}}???[[[FFFzzznnn;;;ooovvv666UUU...;;;TTTnnn%%%(((ttt111sssxxxyyy}}} + + +HHH(((tttsssBBB(((ttt%%%yyy&&& + + +&&&DDD YYYsss///$$$::: + + +&&&DDD%%%yyy&&& YYYssssss + + +&&&DDDrrrBBBYYYHHH''' YYY + + +&&&DDD555mmm ``````AAA000UUUXXXEEE===,,,mmm ```;;;mmm ```"""BBB~~~nnn%%%hhh YYY~~~000UUU"""BBBnnn%%%hhh000UUU777~~~vvv&&&(((@@@nnn%%%~~~ + + +BBB|||///ggg---???GGG--- + + +BBB|||ZZZ---mmm + + +BBB|||###kkk333UUU```bbbNNN///<<<333UUU```###kkkbbbNNN&&&333UUU```{{{XXXQQQ===yyy333UUU\\\uuu~~~BBBccczzzqqqKKK ~~~BBB+++~~~BBB000 ttt~~~ppp @@@bbbccc000 ttt~~~ppp cccBBB000vvvttt~~~,,,hhh$$$ NNNUUULLLVVVuuuCCCzzzqqqNNN333nnnNNNMMMssssss)))QQQ888^^^(((###dddjjj555CCC sss)))QQQuuuMMMsss888^^^(((###dddjjjuuuOOOsss)))QQQdddGGG333TTT888sss)))###RRRZZZ'''&&&'''mmmSSS;;;KKK'''&&& VVV)))'''&&&<<<lllddd:::RRR222ccc&&&<<<llldddmmm:::RRR222cccmmm444<<<lllddd$$$666 +++ccc:::<<<lllddddddOOOaaawwwMMMMMM@@@gggXXXDDD[[[ + + +cccMMM***???MMMrrr$$$]]]iiilll ;;;ppp&&& ???RRRiii[[[ + + +rrr$$$]]]lll ;;;ppp&&& [[[ + + +iiiUUUpppAAA///111lll ;;;ppp&&&```fff>>>:::vvvTTTBBB:::kkk :::fff,,,888HHH333(((:::vvvfff,,,888HHH333(((:::vvv$$$...^^^888HHH333rrrOOO&&&iii>>>---EEE|||EEE333LLL (((ttt(((---EEE---EEE444***HHH___GGGjjjLLLBBBVVVIIInnn000LLL 444***HHH___GGGjjjLLLBBBVVVLLL aaaFFF---___GGGjjjddd"""$$$WWW :::{{{DDDhhhWWW 666 ###WWW ccc$$$666ccc{{{$$$666{{{lll + + +ccchhh888ppp$$$000 ```***ooo444]]]eee???:::sssPPP$$$MMM"""333???:::sss---kkk???:::sss]]]222KKKttt###222 [[[LLLZZZ !!!TTT888KKKttt###222MMM]]]222 [[[LLLZZZ !!!MMMgggKKKttt###222FFFWWW[[[777 [[[LLLZZZ>>>KKKttt###yyy111 + + + ~~~iii ~~~ ~~~{{{~~~???111fff}}})))222 ;;;|||KKK~~~???111fff}}})))222 ;;;|||~~~111OOOjjj111fff}}})))222EEE```&&&888(((###mmmHHH555hhh[[[zzzHHH555hhhooo!!!###$$$ + + +HHH555hhh:::  ~~~BBB555 ``` 555[[[:::  ~~~BBB555 [[[mmm>>>)))MMMCCCppp~~~BBB:::ddd777:::AAA444RRROOO\\\::: :::***~~~... ???---...RRR***~~~ ???RRR...TTT kkkfffLLLeee ddd...(((uuu666kkkGGGfff EEE___555ddd###SSS(((===___555ddd&&&KKK222___555ddd(((iiiIIIZZZRRRddd###PPP888ZZZ(((iiiIIIRRRddd###(((ZZZ333MMM^^^TTT RRRlllZZZ~~~+++777JJJvvvYYY===///...$$$JJJQQQJJJJJJ:::uuu|||CCC&&&oooKKKHHHCCC&&&:::uuu|||oooKKKaaa{{{CCC&&&yyy^^^aaapppoooKKKCCC&&&sssTTT### ccc333&&&???hhhttt,,, 000bbb(((000UUU(((\\\&&&???hhh555qqq444 +++aaa&&&???hhhccc###cccccc%%% + + +$$$___UUU((( """GGG|||ZZZ(((;;;___mmm ccc%%% + + +$$$___UUUccc###cccUUU((( """GGG|||ZZZ(((;;;___UUU{{{ccc%%% + + +$$$___XXXZZZ<<>> 555rrr>>> 555YYYYYYYYY}}}}}}000000000!!!!!!...ddd000 RRR......ddd000 RRRddd000 RRR!!![[[@@@!!![[[!!![[[www@@@www@@@```AAA""" VVVcccBBB!!!EEE$$$EEEEEE]]]$$$]]]$$$~~~YYY555///(((kkkvvv((((((vvvIII;;; ;;;jjj;;;DDD DDD bbb///TTT111}}}///$$$TTT111$$$TTT111ccc---555555 555++++++[[[+++;;;ppp""",,,+++;;;,,,+++;;;999QQQ"""444"""444***bbb"""444333{{{CCC444CCC444CCCXXX***555mmm***555eee***555 + + +mmm + + +mmmPPPMMM222555===jjjMMM===jjjMMM 111RRRpppttt444777JJJ{{{sss444777AAA444777}}}JJJ{{{sss}}}JJJ{{{ssscccKKK~~~444ggguuu```MMM999""",,,mmmmmm888 QQQuuu```MMM999""",,,mmm888 QQQuuu```MMM999""",,,???:::VVV???:::ddd>>>BBBzzz???:::^^^UUU  ...vvvUUU  ...vvvVVV^^^VVVUUU  ...vvvbbbNNN---sss888 BBB777xxx;;; + + +888aaa```sssBBB777xxx;;; + + +888aaasss"""ZZZXXXccc + + +KKK;;;mmm((( + + +CCCBBBBBB___KKK;;;mmm((( + + +CCCYYYKKK;;;mmm((( + + +CCCHHH(((mmmPPPMMM+++(((mmmBBBHHHPPPMMMBBB fff + + +(((mmm'''OOO///rrr,,,OOO///RRR!!!OOO///~~~!!!aaavvv ```'''aaa~~~!!!vvvaaa(((VVV666{{{HHH$$$ 000ccc<<>>JJJYYYFFF???444111444nnnnnnaaa444VVV555]]]$$$ooo(((000OOO"""999aaannnnnn444VVV555]]]$$$ooo(((000OOO888aaa***===oooDDD+++999***/// ***000oooyyyDDDeee333DDDvvv111 + + +uuuNNNwww111lll222,,,FFF###uuuNNN***vvv111 + + +www111lll222,,,***999uuuNNN$$$ttt^^^OOO(((111777|||333www"""MMMjjjZZZIII AAA:::<<<pppZZZIII|||jjj AAA:::<<<ppp|||NNN111ZZZIII///***lllEEE|||555$$$sssLLLIII666 [[[nnn/// + + +:::TTTDDD ddd CCC%%% + + +555[[[nnn///:::TTTDDD ddd 555  + + +999 + + +---&&&}}}'''RRRQQQPPP???***---&&&}}}---&&&}}}XXXQQQ{{{ ```%%%\\\\\\TTT {{{ ```RRRXXXQQQ%%%\\\\\\RRRkkk{{{ ```DDDEEE ***www&&&AAA~~~BBB}}}***,,,jjj(((***lll&&& 111!!!JJJ###CCC***'''zzz&&& AAAlll111!!!JJJ###AAA LLL&&& NNNbbb111HHH:::JJJccc111hhh...^^^GGG + + +888HHH:::JJJHHH:::JJJ 777ttt<<<000///ttt<<<... 777000///...ttt<<<XXX... ...III444zzz```...{{{222...JJJYYYfff^^^CCC + + +JJJ222,,,JJJIIIYYYfff^^^CCC + + +III(((NNNJJJccc""" ___dddeee\\\///iii 444PPPeeeeee\\\ nnndddeee\\\EEE+++!!!VVVBBB777hhhUUUooo VVVBBB777EEE+++!!!hhhUUUoooVVVBBB777mmmYYY )))333www|||QQQ###""" ZZZ>>>)))sssVVV)))JJJIII---$$$XXXEEEXXX"""TTT666---|||QQQJJJIII$$$XXXEEEXXX"""|||QQQYYY@@@---xxxjjj@@@&&&  gggkkk ggg???}}}222yyyVVV !!! }}} ;;;...fff666^^^}}}[[[PPPppprrr|||:::PPP [[[ppprrr||| PPP + + + 444nnn %%%>>>SSSlll&&&TTTddddddhhhXXXPPP$$$ TTTmmmOOOTTTttt```www @@@!!!KKK'''}}}333```JJJ hhhXXXttt```www@@@!!!KKK'''}}}333hhhXXX*** 222 JJJNNNcccccc!!! TTTEEEIII___VVVaaammmvvvRRREEEIII___VVVaaammmvvv999((("""KKKwwwSSS...333***@@@DDDRRRccc]]]999|||...333***mmmddd999```...333***+++]]]]]]EEE oooKKKkkkkkk]]]EEEccc]]]+++]]] oooKKKccc]]]]]]EEE:::oooooogggvvv}}}~~~FFFTTT~~~~~~ pppAAARRRfff + + +'''sss[[[AAARRRfff + + + ppp'''sss|||AAARRRfff + + +PPPPPP(((JJJmmm]]]FFF + + +___$$$???ggg```iii000FFF + + +___ppp---CCCXXXNNNFFF + + +___$$$DDD~~~'''DDDccc kkkuuu~~~ggg```$$$DDD'''DDDccc kkkggg```///~~~iii000---))) + + +nnnrrr ;;;nnnrrr + + + tttLLLnnnrrrBBB{{{bbb TTTUUUBBB{{{bbbXXXvvv&&&000XXX,,,...vvvcccXXX 111XXX???sss+++KKK~~~DDD|||KKKvvvccc???sss+++~~~DDD|||vvvcccKKK + + +%%%IIIJJJ'''bbbBBBSSSfffQQQ###hhh'''bbbBBBSSSiii '''bbbBBBSSS### MMM###### ###555111XXX___ 333eee>>>oooyyy + + +OOOEEE[[[fff111 + + +333eeeOOOEEE[[[333eee + + +mmmWWW%%%222 fff\\\\\\999uuu""""""hhh|||rrrEEE\\\\\\999"""CCC,,,\\\\\\999;;;sss&&&'''FFFpppAAACCC???SSSWWW'''FFF;;;sss&&&pppAAACCC???AAA'''FFF<<<???BBBPPPwww'''TTTeee zzzjjjeeexxx,,,<<<%%%TTTeee444bbb$$$TTTeeefff + + + +++mmmmmmzzzPPP +++jjjeeefff + + +mmmmmmjjjeee666ppp +++rrr&&&  + + +666ppp===```,,,)))555uuuaaaUUU MMM YYY```,,,)))...HHH:::sss```,,,)))555>>>BBBmmmCCC000nnn\\\---///VVVhhh444 ...SSSzzzFFF CCC000nnnMMM555>>>BBBmmm\\\---///VVVhhh444 ...SSSzzzMMMrrrCCC000nnn333ddd666***ttt###TTTiii))) ]]]wwwBBBAAA```000!!! \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/wmf/clock.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/wmf/clock.miff new file mode 100644 index 0000000000000000000000000000000000000000..3a0df1d8de5d7f42af644bd8db01a266470ecfca GIT binary patch literal 547732 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

    <5Y=?V4D$VMEb_qnS_5vt`>EuY+zB%_2oqm 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_8bit.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_8bit.tiff new file mode 100644 index 0000000000000000000000000000000000000000..60294b3399b47cc30191182556b3dcaba34c194b GIT binary patch literal 3462 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_8bit_matte.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_8bit_matte.tiff new file mode 100644 index 0000000000000000000000000000000000000000..96c52419d74f5727e9ca8003e0e0793c291345dd GIT binary patch literal 6860 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 A7ytkO literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_stripped.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_stripped.tiff new file mode 100644 index 0000000000000000000000000000000000000000..98a6722c0ca2c5f0d9042e1b54f9ae9f4c94e534 GIT binary patch literal 9934 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 OG5@qr)w}-w_x}S5P?q!n literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_tiled32x32.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_tiled32x32.tiff new file mode 100644 index 0000000000000000000000000000000000000000..2f62fe90265c6ee0d26a8124231d7ff78ee71537 GIT binary patch literal 9936 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 +# +BEGIN { $| = 1; $test=1; print "1..16\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/tiff' || die 'Cd failed'; + +# +# 1) Test Reading Monochrome +# +print("Monochrome ...\n"); +testRead ( 'input_mono.tiff', + '83175f7bcc43fb71212dee254c85e355c18bcd25f35d3b9caba66fff7341fa64' ); + +# +# 2) Test reading PseudoColor (16 color) +# +++$test; +print("PseudoColor (16 color)...\n"); +testRead( 'input_16.tiff', + '8b75f8ae87df02a676947672d93f49e8272dba3af07d6e7eff3149e11c39a4f7' ); + +# +# 3) Test reading PseudoColor (16 color + matte channel) +# +++$test; +print("PseudoColor (16 color + matte channel)...\n"); +testRead( 'input_16_matte.tiff', + '8b75f8ae87df02a676947672d93f49e8272dba3af07d6e7eff3149e11c39a4f7' ); + +# +# 4) Test reading PseudoColor (256 color) +# +++$test; +print("PseudoColor (256 color) ...\n"); +testRead( 'input_256.tiff', + '08fdfd88b1eb09649ef126c1fe5a8c5b958eb941653daa0b3615f1b9db9966df' ); + +# +# 5) Test reading PseudoColor (256 color + matte channel) +# +++$test; +print("PseudoColor (256 color + matte channel) ...\n"); +testRead( 'input_256_matte.tiff', + 'f28f9d3620babcaf84c61ffbf3f92e83fcc0bc3d5904ac7b8a1318e8d796859f' ); + +# +# 6) Test reading PseudoColor using contiguous planar packing +# +++$test; +print("PseudoColor (256 color) contiguous planes ...\n"); +testRead( 'input_256_planar_contig.tiff', + '08fdfd88b1eb09649ef126c1fe5a8c5b958eb941653daa0b3615f1b9db9966df' ); + +# +# 7) Test reading PseudoColor using seperate planes +# +++$test; +print("PseudoColor (256 color) seperate planes ...\n"); +testRead( 'input_256_planar_separate.tiff', + '08fdfd88b1eb09649ef126c1fe5a8c5b958eb941653daa0b3615f1b9db9966df' ); + +# +# 8) Test Reading TrueColor (8-bit) +# +++$test; +print("TrueColor (8-bit) image ...\n"); +testRead( 'input_truecolor.tiff', + '4002f066656ca5cdb12afa067769bfa432b1d45d0278d1c558cf4a64638eaa6e' ); + +# +# 9) Test Reading TrueColor (16-bit) +# +++$test; +print("TrueColor (16-bit) image ...\n"); +testRead( 'input_truecolor_16.tiff', + '0adb551c0d521ce9e502e7242040463543f1c84b55c6349d3aa4cbd093b1a410', + '725e5f79cd2dea9fd6000df596a1e63790e8ecf48a4a7c303324c176e88c5757' ); + +# +# 10) Test Reading 8-bit TrueColor Tiled (32x32 tiles) +# +++$test; +print("TrueColor (8-bit) tiled image, 32x32 tiles ...\n"); +testRead( 'input_truecolor_tiled32x32.tiff', + '4002f066656ca5cdb12afa067769bfa432b1d45d0278d1c558cf4a64638eaa6e' ); + +# +# 11) Test Reading 8-bit TrueColor Tiled (8 rows per strip) +# +++$test; +print("TrueColor (8-bit) stripped, image, 8 rows per strip ...\n"); +testRead( 'input_truecolor_stripped.tiff', + '4002f066656ca5cdb12afa067769bfa432b1d45d0278d1c558cf4a64638eaa6e' ); + +# +# 12) Test Reading Grayscale 4-bit +# +++$test; +print("Grayscale (4-bit) ...\n"); +testRead( 'input_gray_4bit.tiff', + 'aff256464aeb39a8fd5498d7e296362a11b827f6700b7ad1342b8be8a6304303'); + +# +# 13) Test Reading Grayscale 8-bit +# +++$test; +print("Grayscale (8-bit) ...\n"); +testRead( 'input_gray_8bit.tiff', + '46542d79a23def43c94f4b07452e2d8466abd73a949569596d23bb7130b850f5'); + +# +# 14) Test Reading Grayscale 8-bit + matte +# +++$test; +print("Grayscale (8-bit + matte) ...\n"); +testRead( 'input_gray_8bit_matte.tiff', + '49929da2adbe49c525a7e7f2210187ad496d14d0268c80cddcd201e389fe8171' ); + +# +# 15) Test Reading Grayscale 12-bit +# +++$test; +print("Grayscale (12-bit) ...\n"); +testRead( 'input_gray_12bit.tiff', + 'c29789db13969ddbfc9b588066d6578d87628566a60ffc33dbd43e6c4f747f51', + '0f2c8dfde42ee59deddd126853a8d6f69f6d517cebd8fab28c35836d21227064', + '0f2c8dfde42ee59deddd126853a8d6f69f6d517cebd8fab28c35836d21227064'); + +# +# 16) Test Reading Grayscale 16-bit +# +++$test; +print("Grayscale (16-bit) ...\n"); +testRead( 'input_gray_16bit.tiff', + '7cc1f9e909cd671d0a4d32018fa885997a43de202eafdf4e0bec3dbff9f24a4e', + '5ebfb789a15df77bdd86342617710eb2f685a0ab32886aa4818719c9a84683ed', + '5ebfb789a15df77bdd86342617710eb2f685a0ab32886aa4818719c9a84683ed'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/write.t new file mode 100644 index 0000000..5e2f029 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/write.t @@ -0,0 +1,114 @@ +#!/usr/bin/perl +# +# Test writing TIFF images +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..10\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/tiff' || die 'Cd failed'; + +# +# 1) Test 4-bit pseudocolor image +# +print("PseudoColor image (4 bits/sample) ...\n"); +testReadWrite( 'input_16.tiff', + 'output_16.tiff', + q//, + '8b75f8ae87df02a676947672d93f49e8272dba3af07d6e7eff3149e11c39a4f7'); + +# +# 2) Test 8-bit pseudocolor image +# +++$test; +print("PseudoColor image (8 bits/sample) ...\n"); +testReadWrite( 'input_256.tiff', + 'output_256.tiff', + q//, + '08fdfd88b1eb09649ef126c1fe5a8c5b958eb941653daa0b3615f1b9db9966df'); + +# +# 3) Test 4-bit pseudocolor + matte channel image +# +++$test; +print("PseudoColor image (4 bits/sample + matte channel) ...\n"); +testReadWrite( 'input_16_matte.tiff', + 'output_16_matte.tiff', + q//, + '8b75f8ae87df02a676947672d93f49e8272dba3af07d6e7eff3149e11c39a4f7' ); + +# +# 4) Test 8-bit pseudocolor + matte channel image +# +++$test; +print("PseudoColor image (8 bits/sample + matte channel) ...\n"); +testReadWrite( 'input_256_matte.tiff', + 'output_256_matte.tiff', + q//, + 'f28f9d3620babcaf84c61ffbf3f92e83fcc0bc3d5904ac7b8a1318e8d796859f' ); + +# +# 5) Test truecolor image +# +++$test; +print("TrueColor image (8 bits/sample) ...\n"); +testReadWrite( 'input_truecolor.tiff', + 'output_truecolor.tiff', + q/quality=>55/, + '4002f066656ca5cdb12afa067769bfa432b1d45d0278d1c558cf4a64638eaa6e' ); + +# +# 6) Test monochrome image +# +++$test; +print("Gray image (1 bit per sample) ...\n"); +testReadWrite( 'input_mono.tiff', + 'output_mono.tiff', + q//, + '83175f7bcc43fb71212dee254c85e355c18bcd25f35d3b9caba66fff7341fa64' ); + +# +# 7) Test gray 4 bit image +# +++$test; +print("Gray image (4 bits per sample) ...\n"); +testReadWrite( 'input_gray_4bit.tiff', + 'output_gray_4bit.tiff', + q//, + 'aff256464aeb39a8fd5498d7e296362a11b827f6700b7ad1342b8be8a6304303' ); + +# +# 8) Test gray 8 bit image +# +++$test; +print("Gray image (8 bits per sample) ...\n"); +testReadWrite( 'input_gray_8bit.tiff', + 'output_gray_8bit.tiff', + q//, + '46542d79a23def43c94f4b07452e2d8466abd73a949569596d23bb7130b850f5' ); + +# +# 9) Test gray 4 bit image (with matte channel) +# +++$test; +print("Gray image (4 bits per sample + matte channel) ...\n"); +testReadWrite( 'input_gray_4bit_matte.tiff', + 'output_gray_4bit_matte.tiff', + q//, + 'dc120044b575d24569f3ee5bcdbce4383d14768ad24b44ada5c5a514c7bef3cf' ); + +# +# 10) Test gray 8 bit image (with matte channel) +# +++$test; +print("Gray image (8 bits per sample + matte channel) ...\n"); +testReadWrite( 'input_gray_8bit_matte.tiff', + 'output_gray_8bit_matte.tiff', + q//, + '49929da2adbe49c525a7e7f2210187ad496d14d0268c80cddcd201e389fe8171' ); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/ttf/input.ttf b/ImageMagick-6.9.12-44/PerlMagick/t/ttf/input.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8ea647090f75e7d34bee4c511921299d1f3c1055 GIT binary patch literal 18444 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'512x512', depth=>8/, + 0.14, 1.01); + +# +# 2) Test drawing text using font +# +++$test; +print("Draw text using font ...\n"); +testReadCompare(q!label:The quick brown fox jumps over the lazy dog.!, + q!../reference/ttf/label.miff!, + q!font=>'input.ttf', fill=>'#0000FF', pointsize=>14, size=>'245x16', depth=>8!, + 0.14, 1.01); + +# +# 3) Test drawing text using annotate +# +++$test; +print("Draw text using annotate ...\n"); +testFilterCompare('xc:#FFFFFF', + q!size=>'250x20', depth=>8!, + q!../reference/ttf/annotate.miff!, + 'Annotate', + q!text=>'The quick brown fox jumps over the lazy dog.', + geometry=>'+6+14', + font=>'input.ttf', + fill=>'#FF0000', + pointsize=>14!, + 0.14, 1.01); + +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/wmf/clock.wmf b/ImageMagick-6.9.12-44/PerlMagick/t/wmf/clock.wmf new file mode 100644 index 0000000000000000000000000000000000000000..dead7d921db3172b596d84b9fee263a049c0a42f GIT binary patch literal 12406 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/wmf/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/wmf/read.t new file mode 100644 index 0000000..7d31c6b --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/wmf/read.t @@ -0,0 +1,22 @@ +#!/usr/bin/perl +# +# Test reading WMF files +# +# Whenever a new test is added/removed, be sure to update the +# 1..n ouput. +# +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/wmf' || die 'Cd failed'; + +testReadCompare('wizard.wmf', '../reference/wmf/wizard.miff', + q//, 0.53, 1.0); +++$test; +testReadCompare('clock.wmf', '../reference/wmf/clock.miff', + q//, 0.44, 1.0); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/wmf/wizard.wmf b/ImageMagick-6.9.12-44/PerlMagick/t/wmf/wizard.wmf new file mode 100644 index 0000000000000000000000000000000000000000..6d898e4ce1cc945b5e9fa01b3b2e4b1ddd88885c GIT binary patch literal 14578 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'None'/, + '83175f7bcc43fb71212dee254c85e355c18bcd25f35d3b9caba66fff7341fa64'); + +print("Portable bitmap format (black and white), binary format ...\n"); +++$test; +testReadWrite( 'PBM:input_p4.pbm', + 'PBM:output_p4.pbm', + q//, + '83175f7bcc43fb71212dee254c85e355c18bcd25f35d3b9caba66fff7341fa64'); + +print("ZSoft IBM PC Paintbrush file ...\n"); +++$test; +testReadWrite( 'PCX:input.pcx', + 'PCX:output.pcx', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("Portable graymap format (gray scale), ASCII format ...\n"); +++$test; +testReadWrite( 'PGM:input_p2.pgm', + 'PGM:output_p2.pgm', + q/compression=>'None'/, + '61b18b993c5c4b6c9bd97e1cc95cc756e7b7b840df234ea046b0c5c0fb2930c9'); + +print("Apple Macintosh QuickDraw/PICT file ...\n"); +++$test; +testReadWrite( 'PICT:input.pict', + 'PICT:output.pict', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("Portable pixmap format (color), ASCII format ...\n"); +++$test; +testReadWrite( 'PPM:input_p3.ppm', + 'PPM:output_p3.ppm', + q/compression=>'None'/, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("Portable graymap format (gray scale), binary format ...\n"); +++$test; +testReadWrite( 'PGM:input_p5.pgm', + 'PGM:output_p5.pgm', + q//, + '61b18b993c5c4b6c9bd97e1cc95cc756e7b7b840df234ea046b0c5c0fb2930c9'); + +print("Portable pixmap format (color), binary format ...\n"); +++$test; +testReadWrite( 'PPM:input_p6.ppm', + 'PPM:output_p6.ppm', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("Adobe Photoshop bitmap file ...\n"); +++$test; +testReadWrite( 'PSD:input.psd', + 'PSD:output.psd', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7' ); + +print("Irix RGB image file ...\n"); +++$test; +testReadWrite( 'SGI:input.sgi', + 'SGI:output.sgi', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("SUN 1-bit Rasterfile ...\n"); +++$test; +testReadWrite( 'SUN:input.im1', + 'SUN:output.im1', + q//, + '8922c9505ece06295a015d23e28da3727c3bc7ab22593f98e0fc8784aa16d0c2'); + +print("SUN 8-bit Rasterfile ...\n"); +++$test; +testReadWrite( 'SUN:input.im8', + 'SUN:output.im8', + q//, + 'd28c7104a30c8986c34b98a4209de5d4b8a79911a9b5c46037e62c8a2063a09c'); + +print("SUN True-Color Rasterfile ...\n"); +++$test; +testReadWrite( 'SUN:input.im24', + 'SUN:output.im24', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7', + 'c44fd9695c066798a9dc010010cdff2921b95b67753164f3179352bafee98d10', + '5a5f94a626ee1945ab1d4d2a621aeec4982cccb94e4d68afe4c784abece91b3e'); + +print("Truevision Targa image file ...\n"); +++$test; +testReadWrite( 'TGA:input.tga', + 'TGA:output.tga', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("Khoros Visualization image file ...\n"); +++$test; +testReadWrite( 'VIFF:input.viff', + 'VIFF:output.viff', + q//, + '7f2c98e7ce98983509580eaeb3bb6a420e3f358b39fcec4cdd96982ae1e21882', + 'ede99c6be1a9d82cd2f37b87dfd7cd5369391ff42b566ff1d5491f58e60637cb', + 'aa4a6154f3c314d99c257280faf9097f3863a132ec8bddbc3b68209ce2c19487'); + +print("WBMP (Wireless Bitmap (level 0) image) ...\n"); +++$test; +testReadWrite( 'WBMP:input.wbmp', + 'WBMP:output.wbmp', + q//, + 'b7b682361e82d9d7cf2bed34f76af87576b97590b12d76b961104e53ee18ee74', + '1a3a1f20e9126794a0347d4920c497b5b203767d1a507db728901dc66874ea0d', + 'd818195f73f8d5db624c8f87a706bbcb3179dbb7a7f08abbad5b12cd97de8fe6'); + +print("X Windows system bitmap (black and white only) ...\n"); +++$test; +testReadWrite( 'XBM:input.xbm', + 'XBM:output.xbm', + q//, + '4cc91a24ddcbe4a9563b1ca063f765ec1ca4514cc3e3ba3e710f1226e49a8dd5'); + +print("X Windows system pixmap file (color) ...\n"); +++$test; +testReadWrite( 'XPM:input.xpm', + 'XPM:output.xpm', + q//, + 'd28c7104a30c8986c34b98a4209de5d4b8a79911a9b5c46037e62c8a2063a09c'); + +print("CMYK format ...\n"); +++$test; +testReadWriteSized( 'CMYK:input_70x46.cmyk', + 'CMYK:output_70x46.cmyk', + '70x46', + 8, + q//, + '1d9a2a8b39e8fc584ce24166e4e8a1544a5302b90fd84ff069d0d01c525f3462'); + +print("GRAY format ...\n"); +++$test; +testReadWriteSized( 'GRAY:input_70x46.gray', + 'GRAY:output_70x46.gray', + '70x46', + 8, + q//, + '8365d1242126cb96856a9b4ade0bfad06900b4f42c3f05d589030c1240f37827' ); + +print("RGB format ...\n"); +++$test; +testReadWriteSized( 'RGB:input_70x46.rgb', + 'RGB:output_70x46.rgb', + '70x46', + 8, + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7' ); + + +print("RGBA format ...\n"); +++$test; +testReadWriteSized( 'RGBA:input_70x46.rgba', + 'RGBA:output_70x46.rgba', + '70x46', + 8, + q//, + '1252b2f3facc0fb67fcfacfc01938843566acbb9480bbe077a4c6f6af528eb4e' ); + +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/x11/congrats.fig b/ImageMagick-6.9.12-44/PerlMagick/t/x11/congrats.fig new file mode 100644 index 0000000..ef80007 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/x11/congrats.fig @@ -0,0 +1,18 @@ +#FIG 3.2 +Portrait +Center +Inches +Letter +100.00 +Single +0 +1200 2 +6 2100 1575 8100 2775 +4 1 4 0 0 18 32 0.0000 4 450 6000 5100 2625 You can display an image!\001 +4 1 4 0 0 18 32 0.0000 4 345 5010 5100 1950 CONGRATULATIONS!\001 +-6 +2 4 0 1 0 7 0 0 -1 0.000 0 0 7 0 0 5 + 9150 5850 9150 600 900 600 900 5850 9150 5850 +4 1 0 0 0 18 24 0.0000 4 330 3420 5100 3450 Please Stand By . . .\001 +4 1 0 0 0 18 24 0.0000 4 330 5775 5100 4125 In eight seconds this window will\001 +4 1 0 0 0 18 24 0.0000 4 330 4395 5100 4530 automatically disappear.\001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/x11/congrats.miff b/ImageMagick-6.9.12-44/PerlMagick/t/x11/congrats.miff new file mode 100644 index 0000000..b997daa --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/x11/congrats.miff @@ -0,0 +1,17 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=496 rows=316 depth=8 +type=TrueColor +colorspace=RGB +compression=None quality=0 +resolution=75.0855x74.9556 +page=496x316+58+238 +iterations=1 +delay=800 +comment={ Image generated by GNU Ghostscript (device=pnmraw) +} +date:create={2009-07-31T17:26:02-04:00} +date:modify={2009-07-31T17:26:02-04:00} +signature={3cbcbf0c9d6e06d351746a29fe6c04da2fa3c3622fe0806d33f0e6171a06c5b3} + +:wwwfffwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwfffwwwUUUUUUwwwwwwUUUUUUwwwwwwffffffwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwDDDDwwDD""UUUUff3333ffDDwwwwDD""UUUUDD""DDwwwwwwwwwwww""""ffwwwwwwwwww""wwwwwwww333333""ffwwUU""wwUU""ww33""DDwwwwww33wwUUwwwwUUwwwwUUwwwwww33wwwwwwww""33ww""ffww33""ffwwwwww""ff33wwwwwwUU""3333DD""33DDff""DDff""""3333DDUUwwwwwwffwwwwDDDDDDwwwwwwwwwwwwffwwwwwwwwUU""ffww33ffffwwffffwwwwwwwwUU""""""DDwwwwww33DD33DDww33333333DD33DDwwwwDDwwffDDwwwwwwUU33UUwwDDwwwwwwwwDDwwwwwwffffffwwffffffwwDDffDDwwwwwwwwDD""""ff33wwwwwwww""""""wwDD""""ffffwwwwwwwwDDwwUUffDDDDwwUUUUwwffffffffUUffDDDDww33""33wwwwwwwwwwwwUU""wwww33""wwUUwwwwww33ffwwDDwwDDffwwwwwwwwDD33wwffDD""wwDDUUwwDDffUUUUww33UUffUUwwffDD""33DD33wwwwwwww""33wwDDDD""33wwwwwwwwffffDD33UUwwDDDDDDDDffDD33DDwwwwwwDDww""ww""wwUUUUUUUUUUUUDDDDDDUUUUUUUU""ffwwwwwwwwwwDD""DDUU3333UUwwDDDDwwwwUU""""DDwwDDUU3333UUwwwwDDDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww""wwwwwwwwDDwwwwww""DDwwwwwwwwffwwwwwwDDffwwwwwwww""DD33wwww33UUDD""UUffUUffffwwwwwwwwDD""ffDDDDDDDDUUDDDD""UUww""33DD""UUffUUwwwwwwwwDD33ww""33DD""UUff""wwDDDDDDDDff""33wwwwwwwwUUff""""DDffffffDDffffffww33UUff33ffwwwwww""DD""ff""DD""ff""""DDwwDDwwwwwwffwwDD33""UU""""33""ww33wwUU""33ff33DDww""ww33wwUUff""ww33wwUU333333""ww333333UU""ffDDwwwwww""""""UUDDffwwww""DD""DDffwwwwDDUUDDwwDDwwwwwwwwffwwffUUwwwwwwffwwwwwwwwwwwwffwwwwwwww33ffwwwwwwwwwwwwffwwwwDDDDwwwwww""""3333""33333333wwDD33ww333333DDwwwwwwwwUUffUU""UUUUUUwwwwwwwwDD""DD33DD""33ffDD""DD""33wwwwwwwwwwwwUUffwwwwwwwwwwwwUUwwwwww333333wwwwww3333UUDD33DDww333333DDwwwwwwww33DDwwffUU""ffDD33wwwwwwffwwUU33ffffDDDD""wwwwwwwwwwww33ffffff33wwffDD""""ffUUffUUffwwwwwwwwwwwwffUU""33""UUwwffUU33""3333DD33wwwwwwwwwwffUU33ww3333333333""ww33UUwwww33ww3333DD""UUwwwwwwwwDD33ffff""UUff""UUffUUff""DDUU33""DDww33ffUUffUUffUUDDDDDD33ffwwwwwwUU33""wwwwwwwwwwwwwwDDff33""ffwwwwww""wwwwwwwwDDwwwwwwww""ff33DDffwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwDDDUUU"""UUUUUUwwwwwwfffffffffwwwwwwwwwfffwwwwwwwwwfffwwwwww333333333www333fff"""wwwwwwwww333DDDfff"""ffffff"""333www333DDDfff"""fff333UUU""""""wwwfffUUUfffwwwwww333ffffff333fffDDDwwwfffwwwDDD333"""wwwwww"""wwwDDD333UUUwwwUUU333wwwDDDwwwDDD333UUU333wwwwww"""fff"""fff"""UUUUUUfffwww333fffwwwwwwwwwfff"""wwwDDDfff"""www"""333www333www333333UUUwwwwwwwwwwwwDDDwww333wwwwwwwwwUUUfffwwwDDDfffwww"""333wwwwwwUUUwww333UUUwww"""wwwfff333UUU"""wwwwwwwwwwwwwww333wwwwww333"""wwwwwwDDDDDDUUU333wwwUUUwwwwwwwwwUUU̻wwwwwwUUU̻UUU"""DDD333333www"""333UUUwwwwww"""DDD333"""wwwDDD"""DDD333DDDwwwUUUwwwwwwwww""""""333fff"""333wwwwww"""wwwwwwfff"""333www"""fffwwwwwwwwwDDD333ffffff"""333wwwDDDDDDwww"""www"""fffwwwwwwwwwUUUUUUwwwwwwwww"""fff333UUUwwwwwwwwwwwwwww333wwwwwwUUUwwwwwwwwwwww"""UUUwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww333UUUwww333DDDDDDDDDDDD""""""DDDDDDDDD333ffffff"""333www333DDDDDD"""wwwUUUUUU333UUU""""""wwwfff"""333333fffDDDDDDDDDfff"""333DDDUUUDDDDDDDDD333UUU""""""wwwUUUUUUDDDUUUDDDUUUDDDDDDDDDwwwwwwfff333fffwwwwwwfffDDDwwwfff333fffwww333fffwwwDDDfffDDDwwwffffffwwwwww"""fffwwwDDDwwwwww"""wwwwww"""wwwwwwUUUwwwUUUDDDwwwUUUwwwfffUUUUUUDDDwwwUUUUUUDDDUUU"""UUUDDDUUU"""DDDUUU"""wwwwwwUUUfff"""www333UUUffffff"""fffwww"""wwwUUUfffwww333fffUUUffffff"""fffwwwUUUfffwww333www"""www"""fffwww"""fffwwwwwwwwwfff"""333DDDfff"""333wwwDDDDDD333333333wwwDDDDDDUUUUUU333www333www333333UUUUUU333wwwUUUUUU333wwwwwwwwwwwwwww333wwwwwwwww333wwwwww333wwwDDDDDDDDDwwwwwwwwwwww"""wwwwww"""www"""UUUwwwDDDDDDUUUwwwDDDDDDUUUwwwDDDDDDwwwwwwwwwwwwwww333"""wwwwwwwww333"""www333"""333"""UUUwww333wwwwww333"""UUUwww333wwwwww333"""UUUwww333wwwwwwwwwwwwUUU̻DDD333DDDwwwwwwUUU̻DDDUUU333UUU333UUUUUUDDD333333wwwwwwwwwwwwwwwfff"""DDD333333UUU333UUUUUUwwwfff"""wwwfff"""wwwwww"""DDD333"""wwwDDD"""DDD333333www"""wwwDDD"""wwwDDDwwwwwwwww"""333www333fff"""DDDffffff333fffwww333fff333fffffffff333fff333fffwwwwwwfff"""333wwwwwwUUU"""wwwDDD333ffffff"""333www333"""fffUUUUUUUUUUUUwwwwwwwwwDDD333fff"""wwwDDD333fffDDDfffUUUUUUwwwwwwwwwUUUUUUDDDfffDDDfffwwwwwwwwwwwwwwwwww"""wwwwwwwwwDDDwwwwwwwww333fffwwwwww333UUUwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwfff"""fffUUUUUUwww"""UUU333fff"""fffDDDDDDDDDDDD"""wwwfff"""ffffffUUUfff""""""wwwDDDDDDDDDfff"""333fff"""fffDDDDDDDDDwww""""""wwwDDDDDDDDDwww""""""wwwwww333DDDfff"""fff333wwwwwwDDDwwwDDDwwwDDDwwwwww333"""wwwDDDffffffUUUfffUUU333fffwwwwwwDDD333DDDwww333DDD333DDDwwwfffDDD333333UUUDDD333wwwDDD333wwwwwwwww"""wwwffffffffffffwwwwww333fff333UUU333UUU"""wwwwwwwww333333www333wwwDDDDDDwww333UUU333wwwDDDwww""""""fff"""wwwwwwwwwwwwDDDwwwDDDwwwDDD"""333www333wwwwwwDDDwwwwwwDDDwwwwww333UUU333UUU333UUUwwwwww"""333UUUwww333UUUwwwwww333www333www333wwwUUUwwwwww333"""333wwwwwwwww333wwwwwwwwwUUU333UUUUUUDDDUUU333"""333UUUDDD333333wwwwwwwwwDDDwwwDDDUUU̻wwwwww"""333wwwwww"""wwwDDDwwwwww"""DDD333wwwwww"""wwwwwwffffff"""wwwDDD"""333fff"""""""""wwwwww"""fffwwwwwwwwwwww333"""fffwwwwwwwww"""wwwUUUUUU"""fffwwwwwwwww"""www333"""fff"""fffwwwwwwwww333UUUUUUUUUwwwwwwwwwDDD333fff"""fffwwwwwwwwwwwwwwwfff"""333www"""fffwwwwwwwwwwwwwwwwww""""""""""""wwwwww333wwwwwwUUUwwwwwwwwwwww"""UUUwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwffffffwwwwwwUUUUUUwwwwwwUUUUUUwwwfffwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwfffwww \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/x11/input.xwd b/ImageMagick-6.9.12-44/PerlMagick/t/x11/input.xwd new file mode 100644 index 0000000000000000000000000000000000000000..13a67c23869c4c0c8479915ab251e2d71872281c GIT binary patch literal 9862 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/x11/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/x11/read.t new file mode 100644 index 0000000..b780d8b --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/x11/read.t @@ -0,0 +1,56 @@ +#!/usr/bin/perl +# +# Test accessing X11 server +# +# Contributed by Bob Friesenhahn +# + +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/x11' || die 'Cd failed'; + +# +# 1) Test rendering text using common X11 font +# + +$font = '-*-courier-bold-r-normal-*-14-*-*-*-*-*-iso8859-1'; + +# Ensure that Ghostscript is out of the picture +$SAVEDPATH=$ENV{'PATH'}; +$ENV{'PATH'}=''; + +$image=Image::Magick->new; +$x=$image->Set(font=>"$font", pen=>'#0000FF', dither=>'False'); +if( "$x" ) { + print "$x\n"; + print "not ok $test\n"; +} else { + $x=$image->ReadImage('label:The quick brown fox jumps over the lazy dog.'); + if( "$x" ) { + print "ReadImage: $x\n"; + # If server can't be accessed, ImageMagick returns this warning + # Warning 305: Unable to open X server + $x =~ /(\d+)/; + my $errorCode = $1; + if ( $errorCode > 0 ) { + print "not ok $test\n"; + } else { + print "ok $test\n"; + } + } else { + #$image->Display(); + print "ok $test\n"; + } +} +undef $image; + +$ENV{'PATH'}=$SAVEDPATH; + +print("X Windows system window dump file (color) ...\n"); +++$test; +testReadCompare('input.xwd', '../reference/read/input_xwd.miff', q//, 0.0, 0.0); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/x11/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/x11/write.t new file mode 100644 index 0000000..075db43 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/x11/write.t @@ -0,0 +1,45 @@ +#!/usr/bin/perl +# +# Test accessing X11 server +# +# Contributed by Bob Friesenhahn +# + +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/x11' || die 'Cd failed'; + + +# 1) Test reading and displaying an image +# +if ( 0 && defined($ENV{'DISPLAY'}) && ($^O ne 'MSWin32') ) { + $image=Image::Magick->new; + $x=$image->ReadImage('congrats.miff'); + if( "$x" ) { + print "not ok $test\n"; + } else { + $x = $image->Display(delay=>800); + if( "$x" ) { + print "not ok $test\n"; + } else { + print "ok $test\n"; + } + } + undef $image; +} else { + print "ok $test\n"; +} + +# 2) Test XWD image file +# +print("X Windows system window dump file (color) ...\n"); +++$test; +testReadWrite( 'XWD:input.xwd', + 'XWD:output.xwd', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/xfig/input.fig b/ImageMagick-6.9.12-44/PerlMagick/t/xfig/input.fig new file mode 100644 index 0000000..8bfa2a8 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/xfig/input.fig @@ -0,0 +1,69 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +0 +1200 2 +2 2 0 0 7 0 0 0 44 0.000 0 0 -1 0 0 5 + 900 1200 1500 1200 1500 1800 900 1800 900 1200 +2 2 0 0 7 1 0 0 45 0.000 0 0 -1 0 0 5 + 1500 1200 2100 1200 2100 1800 1500 1800 1500 1200 +2 2 0 0 7 3 0 0 47 0.000 0 0 -1 0 0 5 + 2700 1200 3300 1200 3300 1800 2700 1800 2700 1200 +2 2 0 0 7 2 0 0 46 0.000 0 0 -1 0 0 5 + 2100 1200 2700 1200 2700 1800 2100 1800 2100 1200 +2 2 0 0 7 4 0 0 49 0.000 0 0 -1 0 0 5 + 3300 1200 3900 1200 3900 1800 3300 1800 3300 1200 +2 2 0 0 7 5 0 0 43 0.000 0 0 -1 0 0 5 + 900 1800 1500 1800 1500 2400 900 2400 900 1800 +2 2 0 0 7 6 0 0 43 0.000 0 0 -1 0 0 5 + 1500 1800 2100 1800 2100 2400 1500 2400 1500 1800 +2 2 0 0 7 7 0 0 14 0.000 0 0 -1 0 0 5 + 2100 1800 2700 1800 2700 2400 2100 2400 2100 1800 +2 2 0 0 7 8 0 0 58 0.000 0 0 -1 0 0 5 + 2700 1800 3300 1800 3300 2400 2700 2400 2700 1800 +2 2 0 0 7 9 0 0 59 0.000 0 0 -1 0 0 5 + 3300 1800 3900 1800 3900 2400 3300 2400 3300 1800 +2 2 0 0 7 10 0 0 57 0.000 0 0 -1 0 0 5 + 900 2400 1500 2400 1500 3000 900 3000 900 2400 +2 2 0 0 7 11 0 0 43 0.000 0 0 -1 0 0 5 + 1500 2400 2100 2400 2100 3000 1500 3000 1500 2400 +2 2 0 0 7 12 0 0 61 0.000 0 0 -1 0 0 5 + 2100 2400 2700 2400 2700 3000 2100 3000 2100 2400 +2 2 0 0 7 13 0 0 62 0.000 0 0 -1 0 0 5 + 2700 2400 3300 2400 3300 3000 2700 3000 2700 2400 +2 2 0 0 7 14 0 0 44 0.000 0 0 -1 0 0 5 + 3300 2400 3900 2400 3900 3000 3300 3000 3300 2400 +2 2 0 0 7 15 0 0 54 0.000 0 0 -1 0 0 5 + 900 3000 1500 3000 1500 3600 900 3600 900 3000 +2 2 0 0 7 16 0 0 43 0.000 0 0 -1 0 0 5 + 1500 3000 2100 3000 2100 3600 1500 3600 1500 3000 +2 2 0 0 7 17 0 0 46 0.000 0 0 -1 0 0 5 + 2100 3000 2700 3000 2700 3600 2100 3600 2100 3000 +2 2 0 0 7 18 0 0 50 0.000 0 0 -1 0 0 5 + 2700 3000 3300 3000 3300 3600 2700 3600 2700 3000 +2 2 0 0 7 19 0 0 44 0.000 0 0 -1 0 0 5 + 3300 3000 3900 3000 3900 3600 3300 3600 3300 3000 +2 2 0 0 7 21 0 0 53 0.000 0 0 -1 0 0 5 + 900 3600 1500 3600 1500 4200 900 4200 900 3600 +2 2 0 0 7 22 0 0 43 0.000 0 0 -1 0 0 5 + 1500 3600 2100 3600 2100 4200 1500 4200 1500 3600 +2 2 0 0 7 24 0 0 56 0.000 0 0 -1 0 0 5 + 2100 3600 2700 3600 2700 4200 2100 4200 2100 3600 +2 2 0 0 7 25 0 0 41 0.000 0 0 -1 0 0 5 + 2700 3600 3300 3600 3300 4200 2700 4200 2700 3600 +2 2 0 0 7 26 0 0 49 0.000 0 0 -1 0 0 5 + 3300 3600 3900 3600 3900 4200 3300 4200 3300 3600 +2 2 0 0 7 27 0 0 50 0.000 0 0 -1 0 0 5 + 900 4200 1500 4200 1500 4800 900 4800 900 4200 +2 2 0 0 7 28 0 0 61 0.000 0 0 -1 0 0 5 + 1500 4200 2100 4200 2100 4800 1500 4800 1500 4200 +2 2 0 0 7 30 0 0 48 0.000 0 0 -1 0 0 5 + 2100 4200 2700 4200 2700 4800 2100 4800 2100 4200 +2 2 0 0 7 31 0 0 62 0.000 0 0 -1 0 0 5 + 2700 4200 3300 4200 3300 4800 2700 4800 2700 4200 +2 2 0 0 7 -1 0 0 20 0.000 0 0 -1 0 0 5 + 3300 4200 3900 4200 3900 4800 3300 4800 3300 4200 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/xfig/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/xfig/read.t new file mode 100644 index 0000000..fb91dee --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/xfig/read.t @@ -0,0 +1,28 @@ +#!/usr/bin/perl +# +# Test Reading Xfig files +# +# Contributed by Bob Friesenhahn +# + +BEGIN { $| = 1; $test=1; print "1..1\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/xfig' || die 'Cd failed'; + +# +# 1) Test reading Xfig +# +$image=Image::Magick->new; +$x=$image->ReadImage('input.fig'); +if( "$x" ) { + print "ReadImage: $x\n"; + print "not ok $test\n"; +} else { + print "ok $test\n"; +} +undef $image; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/zlib/input.miff b/ImageMagick-6.9.12-44/PerlMagick/t/zlib/input.miff new file mode 100644 index 0000000..7740ad5 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/zlib/input.miff @@ -0,0 +1,9 @@ +id=ImageMagick +class=DirectClass matte=False +columns=70 rows=46 depth=8 +signature=eb4d6e084afe2835a1ad28ad7fc12ced +background-color=gray74 border-color=gray74 matte-color=gray74 +{ +This is a comment.} + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]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 Og8d&8{9#> +# + +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +use Cwd; +use lib cwd; +require 't/subroutines.pl'; + +chdir 't/zlib' || die 'Cd failed'; + +# +# 1) Test reading Zip compressed MIFF +# +testRead( 'input.miff', + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7' ); + +# +# 3) Test reading Zip stream-compressed MIFF (.gz extension) +# +print("Reading Zip stream-compressed MIFF (.gz extension) ...\n"); +++$test; +testRead( 'input.miff.gz', + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7' ); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/zlib/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/zlib/write.t new file mode 100644 index 0000000..b57aca6 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/zlib/write.t @@ -0,0 +1,27 @@ +#!/usr/bin/perl +# +# Test writing files using zlib-based compression +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..1\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/zlib' || die 'Cd failed'; + +# +# 1) Test writing Zip-compressed MIFF +# + +testReadWrite( 'input.miff', + 'output.miff', + q/compression=>'Zip'/, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7' ); + +$test = 0; # Quench PERL compliaint + diff --git a/ImageMagick-6.9.12-44/PerlMagick/typemap b/ImageMagick-6.9.12-44/PerlMagick/typemap new file mode 100644 index 0000000..89f947b --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/typemap @@ -0,0 +1 @@ +Image::Magick T_PTROBJ diff --git a/ImageMagick-6.9.12-44/QuickStart.txt b/ImageMagick-6.9.12-44/QuickStart.txt new file mode 100644 index 0000000..5a7a055 --- /dev/null +++ b/ImageMagick-6.9.12-44/QuickStart.txt @@ -0,0 +1,136 @@ +This file documents how to use the binary distribution packages built by +ImageMagick Studio LLC, and found in the ImageMagick 'binaries' subdirectory +of ImageMagick download sites. Those who want to build ImageMagick from source +code should refer to https://imagemagick.org/script/install-source.php. + +Unix/Linux/Darwin/Mac OS X/Cygwin/MinGW Install: + + Download the appropriate binary from + + ftp://ftp.imagemagick.org/pub/ImageMagick/binaries + + Create (or choose) a directory to install the package into and change to that + directory, for example: + + cd $HOME + + Extract the contents of the package using the command + + gzip -dc /path/to/package.tar.gz | tar -xf - + + If the 'bin' subdirectory of the extracted package is not already in your + executable search path, add it to your PATH environment variable. For + example + + export PATH; PATH="$HOME/ImageMagick/bin:$PATH" + + Set the MAGICK_HOME environment variable to the path where you extracted the + ImageMagick files. For example + + export MAGICK_HOME="$HOME/ImageMagick-6.9.12" + + On Linux and Solaris machines set the LD_LIBRARY_PATH environment variable: + + export LD_LIBRARY_PATH="$HOME/ImageMagick-6.9.12/lib" + + On Mac OS X (Darwin) machines set the DYLD_LIBRARY_PATH environment variable: + + export DYLD_LIBRARY_PATH="$HOME/ImageMagick-6.9.12/lib" + + Now, test ImageMagick to see if it is working + + convert logo: logo.gif + display logo.gif + + To install PerlMagick type + + cd ImageMagick-6.9.12/PerlMagick + perl Makefile.PL + make + make install + + Additional Information + + Environment Variables: + + In addition to the MAGICK_HOME environment variable defined above, you may + find these variables useful: + + MAGICK_TMPDIR path to store temporary files + LD_LIBRARY_PATH path to libMagick.so and other libraries + + Configuration Files + + ImageMagick depends on a number of external configuration files which + include colors.xml, delegates.xml, magic.xml, coder.xml, and others. + ImageMagick searches for configuration files in the following order, and + loads them if found: + + $MAGICK_CONFIGURE_PATH + $MAGICK_HOME/etc/ImageMagick + $MAGICK_HOME/share/ImageMagick-6.9.12/config + $HOME/.config/ImageMagick + /etc/ImageMagick/ + / + + Font Files + + ImageMagick is able to load raw TrueType and Postscript font files. It + searches for the font configuration file, type.xml, in the following + order, and loads them if found: + + $MAGICK_CONFIGURE_PATH + $MAGICK_HOME/etc/ImageMagick + $MAGICK_HOME/share/ImageMagick-6.9.12/config + $HOME/.config/ImageMagick + /etc/ImageMagick/ + / + $MAGICK_FONT_PATH + + Module Files + + ImageMagick's file format support is usually provided in the form of + loadable modules. It searches for loadable modules in the following order + and it uses the first match found: + + / + $MAGICK_HOME/etc/ImageMagick/modules-Q16/coders/ + $HOME/.config/ImageMagick + /../etc/ImageMagick/modules-Q16/coders/ + $MAGICK_HOME/etc/ImageMagick/modules-Q16/coders + $MAGICK_HOME/share/ImageMagick-6.9.12/modules-Q16/coders + $HOME/.config/ImageMagick + /etc/ImageMagick/modules-Q16/coders + / + +Windows Vista, XP, and NT Install: + + Download one of + + https://download.imagemagick.org/ImageMagick/download/binaries/ImageMagick-6.9.12-0-Q16-windows-dll.exe + https://download.imagemagick.org/ImageMagick/download/binaries/ImageMagick-6.9.12-0-Q16-windows-static.exe + https://download.imagemagick.org/ImageMagick/download/binaries/ImageMagick-6.9.12-0-Q8-windows-dll.exe + https://download.imagemagick.org/ImageMagick/download/binaries/ImageMagick-6.9.12-0-Q8-windows-static.exe + + and execute it (or "open" it from your browser) to start the installation + program. + + Once ImageMagick is installed, Select Start->Programs->Command Prompt. In + the Command Prompt window type + + convert logo: logo.gif + imdisplay logo.gif + + If you have an X11 server, from the Command Prompt window type + + set DISPLAY=:0 + display + +VMS Install: + + Type + + unzip ImageMagick.zip + set default [.imagemagick] + @make + identify -verbose logo: diff --git a/ImageMagick-6.9.12-44/README.txt b/ImageMagick-6.9.12-44/README.txt new file mode 100644 index 0000000..c689666 --- /dev/null +++ b/ImageMagick-6.9.12-44/README.txt @@ -0,0 +1,132 @@ +Introduction to ImageMagick + + ImageMagick® is a software suite to create, edit, compose, or convert + bitmap images. It can read and write images in a variety of formats (over + 200) including PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, + PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, + shear and transform images, adjust image colors, apply various special + effects, or draw text, lines, polygons, ellipses and Bézier curves. + + The functionality of ImageMagick is typically utilized from the command + line or you can use the features from programs written in your favorite + language. Choose from these interfaces: G2F (Ada), MagickCore (C), + MagickWand (C), ChMagick (Ch), Magick++ (C++), + JMagick (Java), L-Magick (Lisp), Lua, NMagick (Neko/haXe), Magick.NET + (.NET), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP + (PHP), IMagick (PHP), PythonMagick (Python), RMagick (Ruby), or TclMagick + (Tcl/TK). With a language interface, use ImageMagick to modify or create + images dynamically and automagically. + + ImageMagick utilizes multiple computational threads to increase performance + and can read, process, or write mega-, giga-, or tera-pixel image sizes. + + ImageMagick is free software delivered as a ready-to-run binary distribution + or as source code that you may use, copy, modify, and distribute in both open + and proprietary applications. It is distributed under a derived Apache 2.0 + license. + + The ImageMagick development process ensures a stable API and ABI. Before + each ImageMagick release, we perform a comprehensive security assessment + that includes memory error and thread data race detection to prevent + security vulnerabilities. + + The current release is the ImageMagick 6.9.12-* series. It runs on Linux, + Windows, Mac Os X, iOS, Android OS, and others. + + The authoritative ImageMagick version 6 web site is + https://legacy.imagemagick.org. The authoritative source code repository + is https://github.com/ImageMagick/ImageMagick6. We maintain a source code + mirror at https://gitlab.com/ImageMagick/ImageMagick6. + + The design of ImageMagick is an evolutionary process, with the design and + implementation efforts serving to influence and guide further progress in + the other. With ImageMagick version 7 we aim to improve the design based + on lessons learned from the version 6 implementation. + + +Features and Capabilities + + Here are just a few examples of what ImageMagick can do: + + * Format conversion: convert an image from one format to another (e.g. + PNG to JPEG). + * Transform: resize, rotate, deskew, crop, flip or trim an image. + * Transparency: render portions of an image invisible. + * Draw: add shapes or text to an image. + * Decorate: add a border or frame to an image. + * Special effects: blur, sharpen, threshold, or tint an image. + * Animation: create a GIF animation sequence from a group of images. + * Text & comments: insert descriptive or artistic text in an image. + * Image gradients: create a gradual blend of one color whose shape is + horizontal, vertical, circular, or ellipical. + * Image identification: describe the format and attributes of an image. + * Composite: overlap one image over another. + * Montage: juxtapose image thumbnails on an image canvas. + * Generalized pixel distortion: correct for, or induce image distortions + including perspective. + * Computer vision: Canny edge detection. + * Morphology of shapes: extract features, describe shapes and recognize + patterns in images. + * Motion picture support: read and write the common image formats used in + digital film work. + * Image calculator: apply a mathematical expression to an image or image + channels. + * Connected component labeling: uniquely label connected regions in an + image. + * Discrete Fourier transform: implements the forward and inverse DFT. + * Perceptual hash: maps visually identical images to the same or similar + hash-- useful in image retrieval, authentication, indexing, or copy + detection as well as digital watermarking. + * Complex text layout: bidirectional text support and shaping. + * Color management: accurate color management with color profiles or in + lieu of-- built-in gamma compression or expansion as demanded by the + colorspace. + * High dynamic-range images: accurately represent the wide range of + intensity levels found in real scenes ranging from the brightest direct + sunlight to the deepest darkest shadows. + * Encipher or decipher an image: convert ordinary images into + unintelligible gibberish and back again. + * Virtual pixel support: convenient access to pixels outside the image + region. + * Large image support: read, process, or write mega-, giga-, or + tera-pixel image sizes. + * Threads of execution support: ImageMagick is thread safe and most + internal algorithms are OpenMP-enabled to take advantage of speed-ups + offered by multicore processor chips. + * Distributed pixel cache: offload intermediate pixel storage to one or + more remote servers. + * Heterogeneous distributed processing: certain algorithms are + OpenCL-enabled to take advantage of speed-ups offered by executing in + concert across heterogeneous platforms consisting of CPUs, GPUs, and + other processors. + * ImageMagick on the iPhone: convert, edit, or compose images on your + iPhone or iPad. + + Examples of ImageMagick Usage shows how to use ImageMagick from the + command-line to accomplish any of these tasks and much more. Also, + see Fred's ImageMagick Scripts: a plethora of command-line scripts that + perform geometric transforms, blurs, sharpens, edging, noise removal, + and color manipulations. With Magick.NET, use ImageMagick without having + to install ImageMagick on your server or desktop. + +News + + ImageMagick version 7 has been released. + + ImageMagick best practices strongly encourages you to configure a security + policy that best suits your local environment. + + As an analog to linear (RGB) and non-linear (sRGB) color colorspaces, as + of ImageMagick 6.9.9-29, we introduce the LinearGray colorspace. Gray is + non-linear grayscale and LinearGray is linear (e.g. -colorspace linear-gray). + + Want more performance from ImageMagick? Try these options: + + Add more memory to your system, see the pixel cache; + Add more cores to your system, see threads of execution support; + push large images to a solid-state drive, see large image support. + + If these options are prohibitive, you can reduce the quality of the + image results. The default build is Q16. If you instead use a Q8 build, + you use half the memory The tradeoff is reduced precision. For a Q8 build + of ImageMagick, use this configure script option: --with-quantum-depth=8. diff --git a/ImageMagick-6.9.12-44/aclocal.m4 b/ImageMagick-6.9.12-44/aclocal.m4 new file mode 100644 index 0000000..4420eb0 --- /dev/null +++ b/ImageMagick-6.9.12-44/aclocal.m4 @@ -0,0 +1,1281 @@ +# generated automatically by aclocal 1.16.1 -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.16' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.16.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.16.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Copyright (C) 2011-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [AC_LANG_PUSH([C]) + am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + AC_LANG_POP([C])]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? + done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll need in +# order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) + + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +AC_DEFUN([AM_WITH_DMALLOC], +[AC_MSG_CHECKING([if malloc debugging is wanted]) +AC_ARG_WITH([dmalloc], +[AS_HELP_STRING([--with-dmalloc], + [use dmalloc, as in http://www.dmalloc.com])], +[if test "$withval" = yes; then + AC_MSG_RESULT([yes]) + AC_DEFINE([WITH_DMALLOC], [1], + [Define if using the dmalloc debugging malloc package]) + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + AC_MSG_RESULT([no]) +fi], [AC_MSG_RESULT([no])]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. +AC_DEFUN([AM_MAKE_INCLUDE], +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/ac_func_fseeko.m4]) +m4_include([m4/ax_c___attribute__.m4]) +m4_include([m4/ax_cflags_warn_all.m4]) +m4_include([m4/ax_check_compile_flag.m4]) +m4_include([m4/ax_check_framework.m4]) +m4_include([m4/ax_compare_version.m4]) +m4_include([m4/ax_compiler_vendor.m4]) +m4_include([m4/ax_cxx_bool.m4]) +m4_include([m4/ax_cxx_namespace_std.m4]) +m4_include([m4/ax_cxx_namespaces.m4]) +m4_include([m4/ax_gcc_archflag.m4]) +m4_include([m4/ax_gcc_x86_cpuid.m4]) +m4_include([m4/ax_have_opencl.m4]) +m4_include([m4/ax_prefix_config_h.m4]) +m4_include([m4/ax_prepend_flag.m4]) +m4_include([m4/ax_prog_perl_version.m4]) +m4_include([m4/ax_pthread.m4]) +m4_include([m4/ax_require_defined.m4]) +m4_include([m4/cxx_have_std_libs.m4]) +m4_include([m4/framework.m4]) +m4_include([m4/ld-version-script.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) +m4_include([m4/pkg.m4]) diff --git a/ImageMagick-6.9.12-44/coders/Makefile.am b/ImageMagick-6.9.12-44/coders/Makefile.am new file mode 100644 index 0000000..d6ebaae --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/Makefile.am @@ -0,0 +1,1123 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building ImageMagick Coder library. + +# Where coder modules get installed +codersdir = $(CODER_PATH) + +if DPS_DELEGATE +MAGICK_DPS_MODULES = coders/dps.la +MAGICK_DPS_SRCS = coders/dps.c +endif + +if DJVU_DELEGATE +MAGICK_DJVU_MODULES = coders/djvu.la +MAGICK_DJVU_SRCS = coders/djvu.c +endif + +if OPENEXR_DELEGATE +MAGICK_EXR_MODULES = coders/exr.la +MAGICK_EXR_SRCS = coders/exr.c +endif + +if FLIF_DELEGATE +MAGICK_FLIF_MODULES = coders/flif.la +MAGICK_FLIF_SRCS = coders/flif.c +endif + +if FPX_DELEGATE +MAGICK_FPX_MODULES = coders/fpx.la +MAGICK_FPX_SRCS = coders/fpx.c +endif + +if HEIC_DELEGATE +MAGICK_HEIC_MODULES = coders/heic.la +MAGICK_HEIC_SRCS = coders/heic.c +endif + +if JBIG_DELEGATE +MAGICK_JBIG_MODULES = coders/jbig.la +MAGICK_JBIG_SRCS = coders/jbig.c +endif + +if JPEG_DELEGATE +MAGICK_JPEG_MODULES = coders/jpeg.la +MAGICK_JPEG_SRCS = coders/jpeg.c +endif + +if LIBOPENJP2_DELEGATE +MAGICK_JP2_MODULES = coders/jp2.la +MAGICK_JP2_SRCS = coders/jp2.c +endif + +if PNG_DELEGATE +MAGICK_PNG_MODULES = coders/png.la +MAGICK_PNG_SRCS = coders/png.c +endif + +if TIFF_DELEGATE +MAGICK_TIFF_MODULES = coders/ept.la coders/tiff.la +MAGICK_TIFF_SRCS = coders/ept.c coders/tiff.c +endif + +if WEBP_DELEGATE +MAGICK_WEBP_MODULES = coders/webp.la +MAGICK_WEBP_SRCS = coders/webp.c +endif + +if WINGDI32_DELEGATE +MAGICK_GDI32_MODULES = coders/clipboard.la coders/emf.la +MAGICK_GDI32_SRCS = coders/clipboard.c coders/emf.c +endif + +if WMF_DELEGATE +MAGICK_WMF_MODULES = coders/wmf.la +MAGICK_WMF_SRCS = coders/wmf.c +endif + +if X11_DELEGATE +MAGICK_X11_MODULES = coders/x.la coders/xwd.la +MAGICK_X11_SRCS = coders/x.c coders/xwd.c +endif + +MAGICK_CODER_CPPFLAGS = \ + $(MODULECOMMONCPPFLAGS) \ + $(MODULE_EXTRA_CPPFLAGS) + +MAGICK_CODER_SRCS = \ + coders/aai.c \ + coders/art.c \ + coders/avs.c \ + coders/bgr.c \ + coders/bmp.c \ + coders/braille.c \ + coders/bytebuffer-private.h \ + coders/cals.c \ + coders/caption.c \ + coders/cin.c \ + coders/cip.c \ + coders/clip.c \ + coders/cmyk.c \ + coders/cut.c \ + coders/dcm.c \ + coders/dds.c \ + coders/debug.c \ + coders/dib.c \ + coders/dng.c \ + coders/dot.c \ + coders/dpx.c \ + coders/fax.c \ + coders/fits.c \ + coders/ghostscript-private.h \ + coders/gif.c \ + coders/gradient.c \ + coders/gray.c \ + coders/hald.c \ + coders/hdr.c \ + coders/histogram.c \ + coders/hrz.c \ + coders/html.c \ + coders/icon.c \ + coders/info.c \ + coders/inline.c \ + coders/ipl.c \ + coders/jnx.c \ + coders/json.c \ + coders/label.c \ + coders/mac.c \ + coders/magick.c \ + coders/map.c \ + coders/mask.c \ + coders/mat.c \ + coders/matte.c \ + coders/meta.c \ + coders/miff.c \ + coders/mono.c \ + coders/mpc.c \ + coders/mpr.c \ + coders/msl.c \ + coders/mtv.c \ + coders/mvg.c \ + coders/null.c \ + coders/otb.c \ + coders/palm.c \ + coders/pango.c \ + coders/pattern.c \ + coders/pcd.c \ + coders/pcl.c \ + coders/pcx.c \ + coders/pdb.c \ + coders/pdf.c \ + coders/pes.c \ + coders/pgx.c \ + coders/pict.c \ + coders/pix.c \ + coders/plasma.c \ + coders/pnm.c \ + coders/preview.c \ + coders/ps.c \ + coders/ps2.c \ + coders/ps3.c \ + coders/psd.c \ + coders/psd-private.h \ + coders/pwp.c \ + coders/raw.c \ + coders/rgb.c \ + coders/rgf.c \ + coders/rla.c \ + coders/rle.c \ + coders/scr.c \ + coders/screenshot.c \ + coders/sct.c \ + coders/sfw.c \ + coders/sgi.c \ + coders/sixel.c \ + coders/stegano.c \ + coders/sun.c \ + coders/svg.c \ + coders/tga.c \ + coders/thumbnail.c \ + coders/tile.c \ + coders/tim.c \ + coders/ttf.c \ + coders/txt.c \ + coders/uil.c \ + coders/url.c \ + coders/uyvy.c \ + coders/vicar.c \ + coders/vid.c \ + coders/video.c \ + coders/viff.c \ + coders/vips.c \ + coders/wbmp.c \ + coders/wpg.c \ + coders/xbm.c \ + coders/xc.c \ + coders/xcf.c \ + coders/xpm.c \ + coders/xps.c \ + coders/ycbcr.c \ + coders/yuv.c \ + $(MAGICK_DPS_SRCS) \ + $(MAGICK_DJVU_SRCS) \ + $(MAGICK_EXR_SRCS) \ + $(MAGICK_FLIF_SRCS) \ + $(MAGICK_FPX_SRCS) \ + $(MAGICK_GDI32_SRCS) \ + $(MAGICK_HEIC_SRCS) \ + $(MAGICK_JBIG_SRCS) \ + $(MAGICK_JPEG_SRCS) \ + $(MAGICK_JP2_SRCS) \ + $(MAGICK_PNG_SRCS) \ + $(MAGICK_TIFF_SRCS) \ + $(MAGICK_WEBP_SRCS) \ + $(MAGICK_WMF_SRCS) \ + $(MAGICK_X11_SRCS) + +CODERS_NOINST_HDRS = \ + coders/bytebuffer-private.h \ + coders/ghostscript-private.h + +if WITH_MODULES +coders_LTLIBRARIES = \ + coders/aai.la \ + coders/art.la \ + coders/avs.la \ + coders/bgr.la \ + coders/bmp.la \ + coders/braille.la \ + coders/cals.la \ + coders/caption.la \ + coders/cin.la \ + coders/cip.la \ + coders/clip.la \ + coders/cmyk.la \ + coders/cut.la \ + coders/dcm.la \ + coders/dds.la \ + coders/debug.la \ + coders/dib.la \ + coders/dng.la \ + coders/dot.la \ + coders/dpx.la \ + coders/fax.la \ + coders/fits.la \ + coders/gif.la \ + coders/gradient.la \ + coders/gray.la \ + coders/hald.la \ + coders/hdr.la \ + coders/histogram.la \ + coders/hrz.la \ + coders/html.la \ + coders/icon.la \ + coders/info.la \ + coders/inline.la \ + coders/ipl.la \ + coders/jnx.la \ + coders/json.la \ + coders/label.la \ + coders/mac.la \ + coders/magick.la \ + coders/map.la \ + coders/mask.la \ + coders/mat.la \ + coders/matte.la \ + coders/meta.la \ + coders/miff.la \ + coders/mono.la \ + coders/mpc.la \ + coders/mpr.la \ + coders/msl.la \ + coders/mtv.la \ + coders/mvg.la \ + coders/null.la \ + coders/otb.la \ + coders/palm.la \ + coders/pango.la \ + coders/pattern.la \ + coders/pcd.la \ + coders/pcl.la \ + coders/pcx.la \ + coders/pdb.la \ + coders/pdf.la \ + coders/pes.la \ + coders/pgx.la \ + coders/pict.la \ + coders/pix.la \ + coders/plasma.la \ + coders/pnm.la \ + coders/preview.la \ + coders/ps.la \ + coders/ps2.la \ + coders/ps3.la \ + coders/psd.la \ + coders/pwp.la \ + coders/raw.la \ + coders/rgb.la \ + coders/rgf.la \ + coders/rla.la \ + coders/rle.la \ + coders/scr.la \ + coders/sct.la \ + coders/sfw.la \ + coders/sgi.la \ + coders/sixel.la \ + coders/stegano.la \ + coders/sun.la \ + coders/svg.la \ + coders/tga.la \ + coders/thumbnail.la \ + coders/tile.la \ + coders/tim.la \ + coders/ttf.la \ + coders/txt.la \ + coders/uil.la \ + coders/url.la \ + coders/uyvy.la \ + coders/vicar.la \ + coders/vid.la \ + coders/video.la \ + coders/viff.la \ + coders/vips.la \ + coders/wbmp.la \ + coders/wpg.la \ + coders/xbm.la \ + coders/xc.la \ + coders/xcf.la \ + coders/xpm.la \ + coders/xps.la \ + coders/ycbcr.la \ + coders/yuv.la \ + $(MAGICK_DPS_MODULES) \ + $(MAGICK_DJVU_MODULES) \ + $(MAGICK_EXR_MODULES) \ + $(MAGICK_FLIF_MODULES) \ + $(MAGICK_FPX_MODULES) \ + $(MAGICK_GDI32_MODULES) \ + $(MAGICK_HEIC_MODULES) \ + $(MAGICK_JBIG_MODULES) \ + $(MAGICK_JPEG_MODULES) \ + $(MAGICK_JP2_MODULES) \ + $(MAGICK_PNG_MODULES) \ + $(MAGICK_TIFF_MODULES) \ + $(MAGICK_WEBP_MODULES) \ + $(MAGICK_WMF_MODULES) \ + $(MAGICK_X11_MODULES) +else +coders_LTLIBRARIES = +endif # WITH_MODULES + +# AAI coder module +coders_aai_la_SOURCES = coders/aai.c +coders_aai_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_aai_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_aai_la_LIBADD = $(MAGICKCORE_LIBS) + +# ART coder module +coders_art_la_SOURCES = coders/art.c +coders_art_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_art_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_art_la_LIBADD = $(MAGICKCORE_LIBS) + +# AVS coder module +coders_avs_la_SOURCES = coders/avs.c +coders_avs_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_avs_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_avs_la_LIBADD = $(MAGICKCORE_LIBS) + +# BRG coder module +coders_bgr_la_SOURCES = coders/bgr.c +coders_bgr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_bgr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_bgr_la_LIBADD = $(MAGICKCORE_LIBS) + +# BMP coder module +coders_bmp_la_SOURCES = coders/bmp.c +coders_bmp_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_bmp_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_bmp_la_LIBADD = $(MAGICKCORE_LIBS) + +# BRAILLE coder module +coders_braille_la_SOURCES = coders/braille.c +coders_braille_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_braille_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_braille_la_LIBADD = $(MAGICKCORE_LIBS) + +# CALS coder module +coders_cals_la_SOURCES = coders/cals.c +coders_cals_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_cals_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_cals_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# CAPTION coder module +coders_caption_la_SOURCES = coders/caption.c +coders_caption_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_caption_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_caption_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# CINEON coder module +coders_cin_la_SOURCES = coders/cin.c +coders_cin_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_cin_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_cin_la_LIBADD = $(MAGICKCORE_LIBS) + +# CIP coder module +coders_cip_la_SOURCES = coders/cip.c +coders_cip_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_cip_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_cip_la_LIBADD = $(MAGICKCORE_LIBS) + +# CLIP coder module +coders_clip_la_SOURCES = coders/clip.c +coders_clip_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_clip_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_clip_la_LIBADD = $(MAGICKCORE_LIBS) + +# CLIPBOARD coder module +coders_clipboard_la_SOURCES= coders/clipboard.c +coders_clipboard_la_CPPFLAGS= $(MAGICK_CODER_CPPFLAGS) +coders_clipboard_la_LDFLAGS= $(MODULECOMMONFLAGS) +coders_clipboard_la_LIBADD = $(MAGICKCORE_LIBS) $(GDI32_LIBS) + +# CMYK coder module +coders_cmyk_la_SOURCES = coders/cmyk.c +coders_cmyk_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_cmyk_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_cmyk_la_LIBADD = $(MAGICKCORE_LIBS) + +# CUT coder module +coders_cut_la_SOURCES = coders/cut.c +coders_cut_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_cut_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_cut_la_LIBADD = $(MAGICKCORE_LIBS) + +# DCM coder module +coders_dcm_la_SOURCES = coders/dcm.c +coders_dcm_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dcm_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dcm_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# DDS coder module +coders_dds_la_SOURCES = coders/dds.c +coders_dds_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dds_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dds_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# DEBUG coder module +coders_debug_la_SOURCES = coders/debug.c +coders_debug_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_debug_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_debug_la_LIBADD = $(MAGICKCORE_LIBS) + +# DIB coder module +coders_dib_la_SOURCES = coders/dib.c +coders_dib_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dib_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dib_la_LIBADD = $(MAGICKCORE_LIBS) + +# DJVU coder module +coders_djvu_la_SOURCES = coders/djvu.c +coders_djvu_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_djvu_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_djvu_la_LIBADD = $(MAGICKCORE_LIBS) $(DJVU_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# DNG coder module +coders_dng_la_SOURCES = coders/dng.c +coders_dng_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dng_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dng_la_LIBADD = $(MAGICKCORE_LIBS) $(RAW_R_LIBS) $(GOMP_LIBS) + +# DPS coder module +coders_dps_la_SOURCES = coders/dps.c +coders_dps_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dps_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dps_la_LIBADD = $(MAGICKCORE_LIBS) $(DPS_LIBS) $(XEXT_LIBS) $(X11_LIBS) + +# DPX coder module +coders_dpx_la_SOURCES = coders/dpx.c +coders_dpx_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_dpx_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dpx_la_LIBADD = $(MAGICKCORE_LIBS) $(GOMP_LIBS) + +# DOT coder module +coders_dot_la_SOURCES = coders/dot.c +coders_dot_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) $(GVC_CFLAGS) +coders_dot_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_dot_la_LIBADD = $(MAGICKCORE_LIBS) $(GVC_LIBS) + +# EMF coder module +coders_emf_la_SOURCES = coders/emf.c +coders_emf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_emf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_emf_la_LIBADD = $(MAGICKCORE_LIBS) $(GDI32_LIBS) + +# EPT coder module +coders_ept_la_SOURCES = coders/ept.c +coders_ept_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ept_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ept_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# EXR coder module +coders_exr_la_SOURCES = coders/exr.c +coders_exr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) $(OPENEXR_CFLAGS) +coders_exr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_exr_la_LIBADD = $(MAGICKCORE_LIBS) $(OPENEXR_LIBS) $(MATH_LIBS) + +# FAX coder module +coders_fax_la_SOURCES = coders/fax.c +coders_fax_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_fax_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_fax_la_LIBADD = $(MAGICKCORE_LIBS) + +# FITS coder module +coders_fits_la_SOURCES = coders/fits.c +coders_fits_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_fits_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_fits_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# FLIF coder module +coders_flif_la_SOURCES = coders/flif.c +coders_flif_la_CPPFLAGS = $(MODULE_EXTRA_CPPFLAGS) +coders_flif_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_flif_la_LIBADD = $(MAGICKCORE_LIBS) $(FLIF_LIBS) + +# FPX coder module +coders_fpx_la_SOURCES = coders/fpx.c +coders_fpx_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_fpx_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_fpx_la_LIBADD = $(MAGICKCORE_LIBS) $(FPX_LIBS) $(MATH_LIBS) -lstdc++ + +# GIF coder module +coders_gif_la_SOURCES = coders/gif.c +coders_gif_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_gif_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_gif_la_LIBADD = $(MAGICKCORE_LIBS) + +# GRAY coder module +coders_gray_la_SOURCES = coders/gray.c +coders_gray_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_gray_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_gray_la_LIBADD = $(MAGICKCORE_LIBS) + +# GRADIENT coder module +coders_gradient_la_SOURCES = coders/gradient.c +coders_gradient_la_CPPFLAGS= $(MAGICK_CODER_CPPFLAGS) +coders_gradient_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_gradient_la_LIBADD = $(MAGICKCORE_LIBS) + +# HISTOGRAM coder module +coders_histogram_la_SOURCES = coders/histogram.c +coders_histogram_la_CPPFLAGS= $(MAGICK_CODER_CPPFLAGS) +coders_histogram_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_histogram_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# HALD coder module +coders_hald_la_SOURCES = coders/hald.c +coders_hald_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_hald_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_hald_la_LIBADD = $(MAGICKCORE_LIBS) $(GOMP_LIBS) + +# HDR coder module +coders_hdr_la_SOURCES = coders/hdr.c +coders_hdr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_hdr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_hdr_la_LIBADD = $(MAGICKCORE_LIBS) $(GOMP_LIBS) $(MATH_LIBS) + +# HEIC coder module +coders_heic_la_SOURCES = coders/heic.c +coders_heic_la_CPPFLAGS = $(MODULE_CODER_CPPFLAGS) +coders_heic_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_heic_la_LIBADD = $(MAGICKCORE_LIBS) $(HEIF_LIBS) + +# HRZ coder module +coders_hrz_la_SOURCES = coders/hrz.c +coders_hrz_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_hrz_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_hrz_la_LIBADD = $(MAGICKCORE_LIBS) + +# HTML coder module +coders_html_la_SOURCES = coders/html.c +coders_html_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_html_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_html_la_LIBADD = $(MAGICKCORE_LIBS) + +# ICON coder module +coders_icon_la_SOURCES = coders/icon.c +coders_icon_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_icon_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_icon_la_LIBADD = $(MAGICKCORE_LIBS) + +# INFO coder module +coders_info_la_SOURCES = coders/info.c +coders_info_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_info_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_info_la_LIBADD = $(MAGICKCORE_LIBS) + +# INLINE coder module +coders_inline_la_SOURCES = coders/inline.c +coders_inline_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_inline_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_inline_la_LIBADD = $(MAGICKCORE_LIBS) + +# IPL coder module +coders_ipl_la_SOURCES = coders/ipl.c +coders_ipl_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ipl_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ipl_la_LIBADD = $(MAGICKCORE_LIBS) + +# JBIG coder module +coders_jbig_la_SOURCES = coders/jbig.c +coders_jbig_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_jbig_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_jbig_la_LIBADD = $(MAGICKCORE_LIBS) $(JBIG_LIBS) $(MATH_LIBS) + +# JPEG coder module +coders_jpeg_la_SOURCES = coders/jpeg.c +coders_jpeg_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_jpeg_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_jpeg_la_LIBADD = $(MAGICKCORE_LIBS) $(JPEG_LIBS) $(MATH_LIBS) + +# JPEG 2000 coder module +coders_jp2_la_SOURCES = coders/jp2.c +coders_jp2_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) $(LIBOPENJP2_CFLAGS) +coders_jp2_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_jp2_la_LIBADD = $(MAGICKCORE_LIBS) $(LIBOPENJP2_LIBS) $(MATH_LIBS) + +# JNX coder module +coders_jnx_la_SOURCES = coders/jnx.c +coders_jnx_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_jnx_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_jnx_la_LIBADD = $(MAGICKCORE_LIBS) + +# JSON coder module +coders_json_la_SOURCES = coders/json.c +coders_json_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_json_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_json_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# LABEL coder module +coders_label_la_SOURCES = coders/label.c +coders_label_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_label_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_label_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# MAC coder module +coders_mac_la_SOURCES = coders/mac.c +coders_mac_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mac_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mac_la_LIBADD = $(MAGICKCORE_LIBS) + +# MAGICK coder module +coders_magick_la_SOURCES = coders/magick.c +coders_magick_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_magick_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_magick_la_LIBADD = $(MAGICKCORE_LIBS) + +# MAP coder module +coders_map_la_SOURCES = coders/map.c +coders_map_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_map_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_map_la_LIBADD = $(MAGICKCORE_LIBS) + +# MASK coder module +coders_mask_la_SOURCES = coders/mask.c +coders_mask_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mask_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mask_la_LIBADD = $(MAGICKCORE_LIBS) + +# MAT coder module +coders_mat_la_SOURCES = coders/mat.c +coders_mat_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mat_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mat_la_LIBADD = $(MAGICKCORE_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# MATTE coder module +coders_matte_la_SOURCES = coders/matte.c +coders_matte_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_matte_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_matte_la_LIBADD = $(MAGICKCORE_LIBS) + +# META coder module +coders_meta_la_SOURCES = coders/meta.c +coders_meta_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_meta_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_meta_la_LIBADD = $(MAGICKCORE_LIBS) + +# MIFF coder module +coders_miff_la_SOURCES = coders/miff.c +coders_miff_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_miff_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_miff_la_LIBADD = $(MAGICKCORE_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(BZLIB_LIBS) + +# MONO coder module +coders_mono_la_SOURCES = coders/mono.c +coders_mono_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mono_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mono_la_LIBADD = $(MAGICKCORE_LIBS) + +# MPC coder module +coders_mpc_la_SOURCES = coders/mpc.c +coders_mpc_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mpc_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mpc_la_LIBADD = $(MAGICKCORE_LIBS) + +# MPR coder module +coders_mpr_la_SOURCES = coders/mpr.c +coders_mpr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mpr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mpr_la_LIBADD = $(MAGICKCORE_LIBS) + +# MSL coder module +coders_msl_la_SOURCES = coders/msl.c +coders_msl_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_msl_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_msl_la_LIBADD = $(MAGICKCORE_LIBS) $(XML_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# MTV coder module +coders_mtv_la_SOURCES = coders/mtv.c +coders_mtv_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mtv_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mtv_la_LIBADD = $(MAGICKCORE_LIBS) + +# MVG coder module +coders_mvg_la_SOURCES = coders/mvg.c +coders_mvg_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_mvg_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_mvg_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# NULL coder module +coders_null_la_SOURCES = coders/null.c +coders_null_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_null_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_null_la_LIBADD = $(MAGICKCORE_LIBS) + +# OTB coder module +coders_otb_la_SOURCES = coders/otb.c +coders_otb_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_otb_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_otb_la_LIBADD = $(MAGICKCORE_LIBS) + +# PALM coder module +coders_palm_la_SOURCES = coders/palm.c +coders_palm_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_palm_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_palm_la_LIBADD = $(MAGICKCORE_LIBS) + +# PANGO coder module +coders_pango_la_SOURCES = coders/pango.c +coders_pango_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) $(PANGO_CFLAGS) +coders_pango_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pango_la_LIBADD = $(MAGICKCORE_LIBS) $(PANGO_LIBS) + +# Pattern module +coders_pattern_la_SOURCES = coders/pattern.c +coders_pattern_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pattern_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pattern_la_LIBADD = $(MAGICKCORE_LIBS) + +# PCD coder module +coders_pcd_la_SOURCES = coders/pcd.c +coders_pcd_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pcd_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pcd_la_LIBADD = $(MAGICKCORE_LIBS) + +# PCL coder module +coders_pcl_la_SOURCES = coders/pcl.c +coders_pcl_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pcl_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pcl_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# PCX coder module +coders_pcx_la_SOURCES = coders/pcx.c +coders_pcx_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pcx_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pcx_la_LIBADD = $(MAGICKCORE_LIBS) + +# PDB coder module +coders_pdb_la_SOURCES = coders/pdb.c +coders_pdb_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pdb_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pdb_la_LIBADD = $(MAGICKCORE_LIBS) + +# PDF coder module +coders_pdf_la_SOURCES = coders/pdf.c +coders_pdf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pdf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pdf_la_LIBADD = $(MAGICKCORE_LIBS) $(JBIG_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(GS_LIBS) $(MATH_LIBS) + +# PES coder module +coders_pes_la_SOURCES = coders/pes.c +coders_pes_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pes_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pes_la_LIBADD = $(MAGICKCORE_LIBS) + +# PGX coder module +coders_pgx_la_SOURCES = coders/pgx.c +coders_pgx_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pgx_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pgx_la_LIBADD = $(MAGICKCORE_LIBS) + +# PICT coder module +coders_pict_la_SOURCES = coders/pict.c +coders_pict_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pict_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pict_la_LIBADD = $(MAGICKCORE_LIBS) + +# PIX coder module +coders_pix_la_SOURCES = coders/pix.c +coders_pix_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pix_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pix_la_LIBADD = $(MAGICKCORE_LIBS) + +# PNG coder module +coders_png_la_SOURCES = coders/png.c +coders_png_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_png_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_png_la_LIBADD = $(MAGICKCORE_LIBS) $(PNG_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# PLASMA coder module +coders_plasma_la_SOURCES = coders/plasma.c +coders_plasma_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_plasma_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_plasma_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# PNM coder module +coders_pnm_la_SOURCES = coders/pnm.c +coders_pnm_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pnm_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pnm_la_LIBADD = $(MAGICKCORE_LIBS) $(GOMP_LIBS) + +# PREVIEW coder module +coders_preview_la_SOURCES = coders/preview.c +coders_preview_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_preview_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_preview_la_LIBADD = $(MAGICKCORE_LIBS) + +# PS coder module +coders_ps_la_SOURCES = coders/ps.c +coders_ps_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ps_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ps_la_LIBADD = $(MAGICKCORE_LIBS) $(GS_LIBS) $(MATH_LIBS) + +# PS2 coder module +coders_ps2_la_SOURCES = coders/ps2.c +coders_ps2_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ps2_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ps2_la_LIBADD = $(MAGICKCORE_LIBS) $(JBIG_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(ZSTD_LIBS) $(WEBPMUX_LIBS) $(WEBP_LIBS) $(MATH_LIBS) + +# PS3 coder module +coders_ps3_la_SOURCES = coders/ps3.c +coders_ps3_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ps3_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ps3_la_LIBADD = $(MAGICKCORE_LIBS) $(JBIG_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(ZSTD_LIBS) $(WEBPMUX_LIBS) $(WEBP_LIBS) $(MATH_LIBS) + +# PSD coder module +coders_psd_la_SOURCES = coders/psd.c coders/psd-private.h +coders_psd_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_psd_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_psd_la_LIBADD = $(MAGICKCORE_LIBS) $(ZLIB_LIBS) + +# PWP coder module +coders_pwp_la_SOURCES = coders/pwp.c +coders_pwp_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_pwp_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_pwp_la_LIBADD = $(MAGICKCORE_LIBS) + +# RAW coder module +coders_raw_la_SOURCES = coders/raw.c +coders_raw_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_raw_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_raw_la_LIBADD = $(MAGICKCORE_LIBS) + +# RGB coder module +coders_rgb_la_SOURCES = coders/rgb.c +coders_rgb_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_rgb_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_rgb_la_LIBADD = $(MAGICKCORE_LIBS) + +# RFG coder module +coders_rgf_la_SOURCES = coders/rgf.c +coders_rgf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_rgf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_rgf_la_LIBADD = $(MAGICKCORE_LIBS) + +# RLA coder module +coders_rla_la_SOURCES = coders/rla.c +coders_rla_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_rla_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_rla_la_LIBADD = $(MAGICKCORE_LIBS) + +# RLE coder module +coders_rle_la_SOURCES = coders/rle.c +coders_rle_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_rle_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_rle_la_LIBADD = $(MAGICKCORE_LIBS) + +# SCR coder module +coders_scr_la_SOURCES = coders/scr.c +coders_scr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_scr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_scr_la_LIBADD = $(MAGICKCORE_LIBS) + +# SCT coder module +coders_sct_la_SOURCES = coders/sct.c +coders_sct_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_sct_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_sct_la_LIBADD = $(MAGICKCORE_LIBS) + +# SFW coder module +coders_sfw_la_SOURCES = coders/sfw.c +coders_sfw_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_sfw_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_sfw_la_LIBADD = $(MAGICKCORE_LIBS) + +# SGI coder module +coders_sgi_la_SOURCES = coders/sgi.c +coders_sgi_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_sgi_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_sgi_la_LIBADD = $(MAGICKCORE_LIBS) + +# STEGANO coder module +coders_stegano_la_SOURCES = coders/stegano.c +coders_stegano_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_stegano_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_stegano_la_LIBADD = $(MAGICKCORE_LIBS) + +# SUN coder module +coders_sun_la_SOURCES = coders/sun.c +coders_sun_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_sun_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_sun_la_LIBADD = $(MAGICKCORE_LIBS) + +# SIXEL coder module +coders_sixel_la_SOURCES = coders/sixel.c +coders_sixel_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_sixel_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_sixel_la_LIBADD = $(MAGICKCORE_LIBS) + +# SVG coder module +coders_svg_la_SOURCES = coders/svg.c +coders_svg_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) $(RSVG_CFLAGS) $(CAIRO_SVG_CFLAGS) +coders_svg_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_svg_la_LIBADD = $(MAGICKCORE_LIBS) $(AUTOTRACE_LIBS) $(RSVG_LIBS) $(XML_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# TGA coder module +coders_tga_la_SOURCES = coders/tga.c +coders_tga_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_tga_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_tga_la_LIBADD = $(MAGICKCORE_LIBS) + +# THUMBNAIL coder module +coders_thumbnail_la_SOURCES= coders/thumbnail.c +coders_thumbnail_la_CPPFLAGS= $(MAGICK_CODER_CPPFLAGS) +coders_thumbnail_la_LDFLAGS= $(MODULECOMMONFLAGS) +coders_thumbnail_la_LIBADD = $(MAGICKCORE_LIBS) + +# TIFF coder module +coders_tiff_la_SOURCES = coders/tiff.c coders/psd.c coders/psd-private.h +coders_tiff_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_tiff_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_tiff_la_LIBADD = $(MAGICKCORE_LIBS) $(TIFF_LIBS) $(JBIG_LIBS) $(JPEG_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(ZSTD_LIBS) $(WEBPMUX_LIBS) $(WEBP_LIBS) $(MATH_LIBS) + +# TILE coder module +coders_tile_la_SOURCES = coders/tile.c +coders_tile_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_tile_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_tile_la_LIBADD = $(MAGICKCORE_LIBS) + +# TIM coder module +coders_tim_la_SOURCES = coders/tim.c +coders_tim_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_tim_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_tim_la_LIBADD = $(MAGICKCORE_LIBS) + +# TTF coder module +coders_ttf_la_SOURCES = coders/ttf.c +coders_ttf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ttf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ttf_la_LIBADD = $(MAGICKCORE_LIBS) + +# TXT coder module +coders_txt_la_SOURCES = coders/txt.c +coders_txt_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_txt_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_txt_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) + +# UIL coder module +coders_uil_la_SOURCES = coders/uil.c +coders_uil_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_uil_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_uil_la_LIBADD = $(MAGICKCORE_LIBS) + +# URL coder module +coders_url_la_SOURCES = coders/url.c +coders_url_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_url_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_url_la_LIBADD = $(MAGICKCORE_LIBS) $(XML_LIBS) $(LZMA_LIBS) $(ZLIB_LIBS) $(MATH_LIBS) + +# UYVY coder module +coders_uyvy_la_SOURCES = coders/uyvy.c +coders_uyvy_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_uyvy_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_uyvy_la_LIBADD = $(MAGICKCORE_LIBS) + +# VICAR coder module +coders_vicar_la_SOURCES = coders/vicar.c +coders_vicar_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_vicar_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_vicar_la_LIBADD = $(MAGICKCORE_LIBS) + +# VID coder module +coders_vid_la_SOURCES = coders/vid.c +coders_vid_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_vid_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_vid_la_LIBADD = $(MAGICKCORE_LIBS) + +# VIDEO coder module +coders_video_la_SOURCES = coders/video.c +coders_video_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_video_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_video_la_LIBADD = $(MAGICKCORE_LIBS) + +# VIFF coder module +coders_viff_la_SOURCES = coders/viff.c +coders_viff_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_viff_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_viff_la_LIBADD = $(MAGICKCORE_LIBS) + +# VIPS coder module +coders_vips_la_SOURCES = coders/vips.c +coders_vips_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_vips_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_vips_la_LIBADD = $(MAGICKCORE_LIBS) + +# WBMP coder module +coders_wbmp_la_SOURCES = coders/wbmp.c +coders_wbmp_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_wbmp_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_wbmp_la_LIBADD = $(MAGICKCORE_LIBS) + +# WEBP coder module +coders_webp_la_SOURCES = coders/webp.c +coders_webp_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_webp_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_webp_la_LIBADD = $(MAGICKCORE_LIBS) $(WEBPMUX_LIBS) $(WEBP_LIBS) $(MATH_LIBS) + +# WMF coder module +coders_wmf_la_SOURCES = coders/wmf.c +coders_wmf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_wmf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_wmf_la_LIBADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(WMF_LIBS) $(MATH_LIBS) + +# WPG coder module +coders_wpg_la_SOURCES = coders/wpg.c +coders_wpg_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_wpg_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_wpg_la_LIBADD = $(MAGICKCORE_LIBS) + +# X coder module +coders_x_la_SOURCES = coders/x.c +coders_x_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_x_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_x_la_LIBADD = $(MAGICKCORE_LIBS) $(X11_LIBS) + +# XBM coder module +coders_xbm_la_SOURCES = coders/xbm.c +coders_xbm_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xbm_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xbm_la_LIBADD = $(MAGICKCORE_LIBS) + +# XC coder module +coders_xc_la_SOURCES = coders/xc.c +coders_xc_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xc_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xc_la_LIBADD = $(MAGICKCORE_LIBS) + +# XCF coder module +coders_xcf_la_SOURCES = coders/xcf.c +coders_xcf_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xcf_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xcf_la_LIBADD = $(MAGICKCORE_LIBS) + +# XPM coder module +coders_xpm_la_SOURCES = coders/xpm.c +coders_xpm_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xpm_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xpm_la_LIBADD = $(MAGICKCORE_LIBS) + +# XPS coder module +coders_xps_la_SOURCES = coders/xps.c +coders_xps_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xps_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xps_la_LIBADD = $(MAGICKCORE_LIBS) $(MUPDF_LIBS) $(FREETYPE_LIBS) $(MATH_LIBS) + +# XWD coder module +coders_xwd_la_SOURCES = coders/xwd.c +coders_xwd_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_xwd_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_xwd_la_LIBADD = $(MAGICKCORE_LIBS) $(X11_LIBS) + +# YCBCR coder module +coders_ycbcr_la_SOURCES = coders/ycbcr.c +coders_ycbcr_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_ycbcr_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_ycbcr_la_LIBADD = $(MAGICKCORE_LIBS) + +# YUV coder module +coders_yuv_la_SOURCES = coders/yuv.c +coders_yuv_la_CPPFLAGS = $(MAGICK_CODER_CPPFLAGS) +coders_yuv_la_LDFLAGS = $(MODULECOMMONFLAGS) +coders_yuv_la_LIBADD = $(MAGICKCORE_LIBS) diff --git a/ImageMagick-6.9.12-44/coders/aai.c b/ImageMagick-6.9.12-44/coders/aai.c new file mode 100644 index 0000000..934b7c6 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/aai.c @@ -0,0 +1,426 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% AAA AAA IIIII % +% A A A A I % +% AAAAA AAAAA I % +% A A A A I % +% A A A A IIIII % +% % +% % +% Read/Write AAI X Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteAAIImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d A A I I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadAAIImage() reads an AAI Dune image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadAAIImage method is: +% +% Image *ReadAAIImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadAAIImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + ssize_t + x; + + PixelPacket + *q; + + unsigned char + *p; + + size_t + height, + length, + width; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read AAI Dune image. + */ + width=ReadBlobLSBLong(image); + height=ReadBlobLSBLong(image); + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((width == 0UL) || (height == 0UL)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + do + { + /* + Convert AAI raster image to pixel packets. + */ + image->columns=width; + image->rows=height; + image->depth=8; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + pixels=(unsigned char *) AcquireQuantumMemory(image->columns, + 4*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + length=(size_t) 4*image->columns; + for (y=0; y < (ssize_t) image->rows; y++) + { + count=ReadBlob(image,length,pixels); + if ((size_t) count != length) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + } + p=pixels; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelRed(q,ScaleCharToQuantum(*p++)); + if (*p == 254) + *p=255; + SetPixelAlpha(q,ScaleCharToQuantum(*p++)); + if (q->opacity != OpaqueOpacity) + image->matte=MagickTrue; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + width=ReadBlobLSBLong(image); + height=ReadBlobLSBLong(image); + if ((width != 0UL) && (height != 0UL)) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + return((Image *) NULL); + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while ((width != 0UL) && (height != 0UL)); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r A A I I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterAAIImage() adds attributes for the AAI Dune image format to the list +% of supported formats. The attributes include the image format tag, a +% method to read and/or write the format, whether the format supports the +% saving of more than one frame to the same file or blob, whether the format +% supports native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterAAIImage method is: +% +% size_t RegisterAAIImage(void) +% +*/ +ModuleExport size_t RegisterAAIImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("AAI"); + entry->decoder=(DecodeImageHandler *) ReadAAIImage; + entry->encoder=(EncodeImageHandler *) WriteAAIImage; + entry->description=ConstantString("AAI Dune image"); + entry->magick_module=ConstantString("AAI"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r A A I I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterAAIImage() removes format registrations made by the +% AAI module from the list of supported formats. +% +% The format of the UnregisterAAIImage method is: +% +% UnregisterAAIImage(void) +% +*/ +ModuleExport void UnregisterAAIImage(void) +{ + (void) UnregisterMagickInfo("AAI"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e A A I I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteAAIImage() writes an image to a file in AAI Dune image format. +% +% The format of the WriteAAIImage method is: +% +% MagickBooleanType WriteAAIImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteAAIImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + status; + + MagickOffsetType + scene; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + unsigned char + *magick_restrict q; + + size_t + imageListLength; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Write AAI header. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + (void) WriteBlobLSBLong(image,(unsigned int) image->columns); + (void) WriteBlobLSBLong(image,(unsigned int) image->rows); + /* + Allocate memory for pixels. + */ + pixels=(unsigned char *) AcquireQuantumMemory(image->columns, + 4*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Convert MIFF to AAI raster pixels. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (PixelPacket *) NULL) + break; + q=pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q=ScaleQuantumToChar((Quantum) (QuantumRange-(image->matte != + MagickFalse ? GetPixelOpacity(p) : OpaqueOpacity))); + if (*q == 255) + *q=254; + p++; + q++; + } + count=WriteBlob(image,(size_t) (q-pixels),pixels); + if (count != (ssize_t) (q-pixels)) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/art.c b/ImageMagick-6.9.12-44/coders/art.c new file mode 100644 index 0000000..7e2ca85 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/art.c @@ -0,0 +1,371 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% AAA RRRR TTTTT % +% A A R R T % +% AAAAA RRRR T % +% A A R R T % +% A A R R T % +% % +% % +% Support PFS: 1st Publisher Clip Art Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteARTImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d A R T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadARTImage() reads an image of raw bits in LSB order and returns it. +% It allocates the memory necessary for the new Image structure and returns +% a pointer to the new image. +% +% The format of the ReadARTImage method is: +% +% Image *ReadARTImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadARTImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + MagickBooleanType + status; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + image->depth=1; + image->endian=MSBEndian; + (void) ReadBlobLSBShort(image); + image->columns=(size_t) ReadBlobLSBShort(image); + (void) ReadBlobLSBShort(image); + image->rows=(size_t) ReadBlobLSBShort(image); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + /* + Initialize image colormap. + */ + if (AcquireImageColormap(image,2) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Convert bi-level image to pixel packets. + */ + SetImageColorspace(image,GRAYColorspace); + quantum_type=IndexQuantum; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + length=GetQuantumExtent(image,quantum_info,quantum_type); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + const void + *stream; + + PixelPacket + *magick_restrict q; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,(unsigned char *) stream,exception); + stream=ReadBlobStream(image,(size_t) (-(ssize_t) length) & 0x01, + pixels,&count); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + SetQuantumImageType(image,quantum_type); + quantum_info=DestroyQuantumInfo(quantum_info); + if (y < (ssize_t) image->rows) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r A R T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterARTImage() adds attributes for the ART image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterARTImage method is: +% +% size_t RegisterARTImage(void) +% +*/ +ModuleExport size_t RegisterARTImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("ART"); + entry->decoder=(DecodeImageHandler *) ReadARTImage; + entry->encoder=(EncodeImageHandler *) WriteARTImage; + entry->raw=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("PFS: 1st Publisher Clip Art"); + entry->magick_module=ConstantString("ART"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r A R T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterARTImage() removes format registrations made by the +% ART module from the list of supported formats. +% +% The format of the UnregisterARTImage method is: +% +% UnregisterARTImage(void) +% +*/ +ModuleExport void UnregisterARTImage(void) +{ + (void) UnregisterMagickInfo("ART"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e A R T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteARTImage() writes an image of raw bits in LSB order to a file. +% +% The format of the WriteARTImage method is: +% +% MagickBooleanType WriteARTImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteARTImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + status; + + QuantumInfo + *quantum_info; + + const PixelPacket + *p; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if ((image->columns > 65535UL) || (image->rows > 65535UL)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + image->endian=MSBEndian; + image->depth=1; + (void) WriteBlobLSBShort(image,0); + (void) WriteBlobLSBShort(image,(unsigned short) image->columns); + (void) WriteBlobLSBShort(image,0); + (void) WriteBlobLSBShort(image,(unsigned short) image->rows); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + length=(image->columns+7)/8; + pixels=(unsigned char *) AcquireQuantumMemory(length,sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Convert image to a bi-level image. + */ + (void) SetImageType(image,BilevelType); + quantum_info=AcquireQuantumInfo(image_info,image); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + GrayQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + (void) WriteBlob(image,(size_t) (-(ssize_t) length) & 0x01,pixels); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (y < (ssize_t) image->rows) + ThrowWriterException(CorruptImageError,"UnableToWriteImageData"); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/avs.c b/ImageMagick-6.9.12-44/coders/avs.c new file mode 100644 index 0000000..9d556f8 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/avs.c @@ -0,0 +1,431 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% AAA V V SSSSS % +% A A V V SS % +% AAAAA V V SSS % +% A A V V SS % +% A A V SSSSS % +% % +% % +% Read/Write AVS X Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteAVSImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d A V S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadAVSImage() reads an AVS X image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadAVSImage method is: +% +% Image *ReadAVSImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadAVSImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + MemoryInfo + *pixel_info; + + PixelPacket + *q; + + ssize_t + x; + + unsigned char + *p; + + size_t + height, + width; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read AVS X image. + */ + width=ReadBlobMSBLong(image); + height=ReadBlobMSBLong(image); + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((width == 0UL) || (height == 0UL)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + do + { + ssize_t + length; + + /* + Convert AVS raster image to pixel packets. + */ + image->columns=width; + image->rows=height; + image->depth=8; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + pixel_info=AcquireVirtualMemory(image->columns,4*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + length=(size_t) 4*image->columns; + for (y=0; y < (ssize_t) image->rows; y++) + { + count=ReadBlob(image,length,pixels); + if (count != length) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + } + p=pixels; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelAlpha(q,ScaleCharToQuantum(*p++)); + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + if (q->opacity != OpaqueOpacity) + image->matte=MagickTrue; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + width=ReadBlobMSBLong(image); + height=ReadBlobMSBLong(image); + if ((width != 0UL) && (height != 0UL)) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while ((width != 0UL) && (height != 0UL)); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r A V S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterAVSImage() adds attributes for the AVS X image format to the list +% of supported formats. The attributes include the image format tag, a +% method to read and/or write the format, whether the format supports the +% saving of more than one frame to the same file or blob, whether the format +% supports native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterAVSImage method is: +% +% size_t RegisterAVSImage(void) +% +*/ +ModuleExport size_t RegisterAVSImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("AVS"); + entry->decoder=(DecodeImageHandler *) ReadAVSImage; + entry->encoder=(EncodeImageHandler *) WriteAVSImage; + entry->description=ConstantString("AVS X image"); + entry->magick_module=ConstantString("AVS"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r A V S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterAVSImage() removes format registrations made by the +% AVS module from the list of supported formats. +% +% The format of the UnregisterAVSImage method is: +% +% UnregisterAVSImage(void) +% +*/ +ModuleExport void UnregisterAVSImage(void) +{ + (void) UnregisterMagickInfo("AVS"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e A V S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteAVSImage() writes an image to a file in AVS X image format. +% +% The format of the WriteAVSImage method is: +% +% MagickBooleanType WriteAVSImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteAVSImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + status; + + MagickOffsetType + scene; + + MemoryInfo + *pixel_info; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + unsigned char + *magick_restrict q; + + size_t + imageListLength; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Write AVS header. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + (void) WriteBlobMSBLong(image,(unsigned int) image->columns); + (void) WriteBlobMSBLong(image,(unsigned int) image->rows); + /* + Allocate memory for pixels. + */ + pixel_info=AcquireVirtualMemory(image->columns,4*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Convert MIFF to AVS raster pixels. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (PixelPacket *) NULL) + break; + q=pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar((Quantum) (QuantumRange-(image->matte != + MagickFalse ? GetPixelOpacity(p) : OpaqueOpacity))); + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + p++; + } + count=WriteBlob(image,(size_t) (q-pixels),pixels); + if (count != (ssize_t) (q-pixels)) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/bgr.c b/ImageMagick-6.9.12-44/coders/bgr.c new file mode 100644 index 0000000..6fd0623 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/bgr.c @@ -0,0 +1,1475 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% BBBB GGGG RRRR % +% B B G R R % +% BBBB G GG RRRR % +% B B G G R R % +% BBBB GGG R R % +% % +% % +% Read/Write Raw BGR Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteBGRImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d B G R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBGRImage() reads an image of raw BGR, or BGRA samples and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadBGRImage method is: +% +% Image *ReadBGRImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadBGRImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + const void + *stream; + + Image + *canvas_image, + *image; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + i; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + if (image_info->interlace != PartitionInterlace) + { + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + } + /* + Create virtual canvas to support cropping (i.e. image.rgb[100x100+10+20]). + */ + canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse, + exception); + if (canvas_image == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + quantum_type=BGRQuantum; + if (LocaleCompare(image_info->magick,"BGRA") == 0) + { + quantum_type=BGRAQuantum; + canvas_image->matte=MagickTrue; + } + if (LocaleCompare(image_info->magick,"BGRO") == 0) + { + quantum_type=BGROQuantum; + canvas_image->matte=MagickTrue; + } + (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod); + quantum_info=AcquireQuantumInfo(image_info,canvas_image); + if (quantum_info == (QuantumInfo *) NULL) + { + canvas_image=DestroyImage(canvas_image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=GetQuantumPixels(quantum_info); + if (image_info->number_scenes != 0) + while (image->scene < image_info->scene) + { + /* + Skip to next image. + */ + image->scene++; + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + for (y=0; y < (ssize_t) image->rows; y++) + { + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + } + count=0; + length=0; + scene=0; + status=MagickTrue; + stream=NULL; + do + { + /* + Read pixels to virtual canvas image then push to image. + */ + image->matte=canvas_image->matte; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + break; + switch (image_info->interlace) + { + case NoInterlace: + default: + { + /* + No interlacing: BGRBGRBGRBGRBGRBGR... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=QueueAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + SetPixelGreen(q,GetPixelGreen(p)); + SetPixelBlue(q,GetPixelBlue(p)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + break; + } + case LineInterlace: + { + static QuantumType + quantum_types[4] = + { + BlueQuantum, + GreenQuantum, + RedQuantum, + AlphaQuantum + }; + + /* + Line interlacing: BBB...GGG...RRR...RRR...GGG...BBB... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + for (i=0; i < (ssize_t) (image->matte != MagickFalse ? 4 : 3); i++) + { + quantum_type=quantum_types[i]; + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + switch (quantum_type) + { + case RedQuantum: + { + SetPixelRed(q,GetPixelRed(p)); + break; + } + case GreenQuantum: + { + SetPixelGreen(q,GetPixelGreen(p)); + break; + } + case BlueQuantum: + { + SetPixelBlue(q,GetPixelBlue(p)); + break; + } + case OpacityQuantum: + { + SetPixelOpacity(q,GetPixelOpacity(p)); + break; + } + case AlphaQuantum: + { + SetPixelAlpha(q,GetPixelAlpha(p)); + break; + } + default: + break; + } + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + { + /* + Plane interlacing: RRRRRR...GGGGGG...BBBBBB... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,RedQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,1,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,GreenQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelGreen(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,2,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlueQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,GetPixelBlue(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,3,6); + if (status == MagickFalse) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,4,6); + if (status == MagickFalse) + break; + } + if (image->matte != MagickFalse) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,AlphaQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x, + 0,canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,5,6); + if (status == MagickFalse) + break; + } + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + case PartitionInterlace: + { + /* + Partition interlacing: BBBBBB..., GGGGGG..., RRRRRR... + */ + AppendImageFormat("B",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + length=GetQuantumExtent(canvas_image,quantum_info,BlueQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlueQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,1,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("G",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,GreenQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,GreenQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelGreen(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,2,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("R",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,RedQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,GetPixelBlue(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,3,5); + if (status == MagickFalse) + break; + } + if (image->matte != MagickFalse) + { + (void) CloseBlob(image); + AppendImageFormat("A",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + canvas_image=DestroyImageList(canvas_image); + image=DestroyImageList(image); + return((Image *) NULL); + } + length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels( + quantum_info),&count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlueQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x, + 0,canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,4,5); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,5,5); + if (status == MagickFalse) + break; + } + break; + } + } + if (status == MagickFalse) + break; + SetQuantumImageType(image,quantum_type); + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (count == (ssize_t) length) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + scene++; + } while (count == (ssize_t) length); + quantum_info=DestroyQuantumInfo(quantum_info); + InheritException(&image->exception,&canvas_image->exception); + canvas_image=DestroyImage(canvas_image); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r B G R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterBGRImage() adds attributes for the BGR image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterBGRImage method is: +% +% size_t RegisterBGRImage(void) +% +*/ +ModuleExport size_t RegisterBGRImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("BGR"); + entry->decoder=(DecodeImageHandler *) ReadBGRImage; + entry->encoder=(EncodeImageHandler *) WriteBGRImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw blue, green, and red samples"); + entry->magick_module=ConstantString("BGR"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("BGRA"); + entry->decoder=(DecodeImageHandler *) ReadBGRImage; + entry->encoder=(EncodeImageHandler *) WriteBGRImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw blue, green, red, and alpha samples"); + entry->magick_module=ConstantString("BGR"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("BGRO"); + entry->decoder=(DecodeImageHandler *) ReadBGRImage; + entry->encoder=(EncodeImageHandler *) WriteBGRImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw blue, green, red, and opacity samples"); + entry->magick_module=ConstantString("BGR"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r B G R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterBGRImage() removes format registrations made by the BGR module +% from the list of supported formats. +% +% The format of the UnregisterBGRImage method is: +% +% UnregisterBGRImage(void) +% +*/ +ModuleExport void UnregisterBGRImage(void) +{ + (void) UnregisterMagickInfo("BGRA"); + (void) UnregisterMagickInfo("BGR"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e B G R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBGRImage() writes an image to a file in the BGR or BGRA +% rasterfile format. +% +% The format of the WriteBGRImage method is: +% +% MagickBooleanType WriteBGRImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteBGRImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + size_t + imageListLength, + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Allocate memory for pixels. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image_info->interlace != PartitionInterlace) + { + /* + Open output image file. + */ + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + } + quantum_type=BGRQuantum; + if (LocaleCompare(image_info->magick,"BGRA") == 0) + { + quantum_type=BGRAQuantum; + image->matte=MagickTrue; + } + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Convert MIFF to BGR raster pixels. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + if ((LocaleCompare(image_info->magick,"BGRA") == 0) && + (image->matte == MagickFalse)) + (void) SetImageAlphaChannel(image,ResetAlphaChannel); + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + switch (image_info->interlace) + { + case NoInterlace: + default: + { + /* + No interlacing: BGRBGRBGRBGRBGRBGR... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case LineInterlace: + { + /* + Line interlacing: BBB...GGG...RRR...RRR...GGG...BBB... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlueQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GreenQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (quantum_type == BGRAQuantum) + { + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + { + /* + Plane interlacing: RRRRRR...GGGGGG...BBBBBB... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GreenQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,2,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlueQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,3,6); + if (status == MagickFalse) + break; + } + if (quantum_type == BGRAQuantum) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,5,6); + if (status == MagickFalse) + break; + } + } + if (image_info->interlace == PartitionInterlace) + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + case PartitionInterlace: + { + /* + Partition interlacing: BBBBBB..., GGGGGG..., RRRRRR... + */ + AppendImageFormat("B",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlueQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,6); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("G",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GreenQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,2,6); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("R",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,3,6); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + if (quantum_type == BGRAQuantum) + { + (void) CloseBlob(image); + AppendImageFormat("A",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,5,6); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/bmp.c b/ImageMagick-6.9.12-44/coders/bmp.c new file mode 100644 index 0000000..6caf95c --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/bmp.c @@ -0,0 +1,2456 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% BBBB M M PPPP % +% B B MM MM P P % +% BBBB M M M PPPP % +% B B M M P % +% BBBB M M P % +% % +% % +% Read/Write Microsoft Windows Bitmap Image Format % +% % +% Software Design % +% Cristy % +% Glenn Randers-Pehrson % +% December 2001 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colormap-private.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/transform.h" + +/* + Macro definitions (from Windows wingdi.h). +*/ +#undef BI_JPEG +#define BI_JPEG 4 +#undef BI_PNG +#define BI_PNG 5 +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__MINGW32__) +#undef BI_RGB +#define BI_RGB 0 +#undef BI_RLE8 +#define BI_RLE8 1 +#undef BI_RLE4 +#define BI_RLE4 2 +#undef BI_BITFIELDS +#define BI_BITFIELDS 3 + +#undef LCS_CALIBRATED_RBG +#define LCS_CALIBRATED_RBG 0 +#undef LCS_sRGB +#define LCS_sRGB 1 +#undef LCS_WINDOWS_COLOR_SPACE +#define LCS_WINDOWS_COLOR_SPACE 2 +#undef PROFILE_LINKED +#define PROFILE_LINKED 3 +#undef PROFILE_EMBEDDED +#define PROFILE_EMBEDDED 4 + +#undef LCS_GM_BUSINESS +#define LCS_GM_BUSINESS 1 /* Saturation */ +#undef LCS_GM_GRAPHICS +#define LCS_GM_GRAPHICS 2 /* Relative */ +#undef LCS_GM_IMAGES +#define LCS_GM_IMAGES 4 /* Perceptual */ +#undef LCS_GM_ABS_COLORIMETRIC +#define LCS_GM_ABS_COLORIMETRIC 8 /* Absolute */ +#endif + +/* + Enumerated declaractions. +*/ +typedef enum +{ + UndefinedSubtype, + RGB555, + RGB565, + ARGB4444, + ARGB1555 +} BMPSubtype; + +/* + Typedef declarations. +*/ +typedef struct _BMPInfo +{ + unsigned int + file_size, + ba_offset, + offset_bits, + size; + + ssize_t + width, + height; + + unsigned short + planes, + bits_per_pixel; + + unsigned int + compression, + image_size, + x_pixels, + y_pixels, + number_colors, + red_mask, + green_mask, + blue_mask, + alpha_mask, + colors_important; + + long + colorspace; + + PrimaryInfo + red_primary, + green_primary, + blue_primary, + gamma_scale; +} BMPInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteBMPImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DecodeImage unpacks the packed image pixels into runlength-encoded +% pixel packets. +% +% The format of the DecodeImage method is: +% +% MagickBooleanType DecodeImage(Image *image, +% const size_t compression,unsigned char *pixels, +% const size_t number_pixels) +% +% A description of each parameter follows: +% +% o image: the address of a structure of type Image. +% +% o compression: Zero means uncompressed. A value of 1 means the +% compressed pixels are runlength encoded for a 256-color bitmap. +% A value of 2 means a 16-color bitmap. A value of 3 means bitfields +% encoding. +% +% o pixels: The address of a byte (8 bits) array of pixel data created by +% the decoding process. +% +% o number_pixels: The number of pixels. +% +*/ +static MagickBooleanType DecodeImage(Image *image,const size_t compression, + unsigned char *pixels,const size_t number_pixels) +{ + int + byte, + count; + + ssize_t + i, + x; + + unsigned char + *p, + *q; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(pixels != (unsigned char *) NULL); + (void) memset(pixels,0,number_pixels*sizeof(*pixels)); + byte=0; + x=0; + p=pixels; + q=pixels+number_pixels; + for (y=0; y < (ssize_t) image->rows; ) + { + MagickBooleanType + status; + + if ((p < pixels) || (p > q)) + break; + count=ReadBlobByte(image); + if (count == EOF) + break; + if (count > 0) + { + /* + Encoded mode. + */ + count=(int) MagickMin((ssize_t) count,(ssize_t) (q-p)); + byte=ReadBlobByte(image); + if (byte == EOF) + break; + if (compression == BI_RLE8) + { + for (i=0; i < (ssize_t) count; i++) + *p++=(unsigned char) byte; + } + else + { + for (i=0; i < (ssize_t) count; i++) + *p++=(unsigned char) ((i & 0x01) != 0 ? (byte & 0x0f) : + ((byte >> 4) & 0x0f)); + } + x+=count; + } + else + { + /* + Escape mode. + */ + count=ReadBlobByte(image); + if (count == EOF) + break; + if (count == 0x01) + return(MagickTrue); + switch (count) + { + case 0x00: + { + /* + End of line. + */ + x=0; + y++; + p=pixels+y*image->columns; + break; + } + case 0x02: + { + /* + Delta mode. + */ + x+=ReadBlobByte(image); + y+=ReadBlobByte(image); + p=pixels+y*image->columns+x; + break; + } + default: + { + /* + Absolute mode. + */ + count=(int) MagickMin((ssize_t) count,(ssize_t) (q-p)); + if (compression == BI_RLE8) + for (i=0; i < (ssize_t) count; i++) + { + byte=ReadBlobByte(image); + if (byte == EOF) + break; + *p++=(unsigned char) byte; + } + else + for (i=0; i < (ssize_t) count; i++) + { + if ((i & 0x01) == 0) + { + byte=ReadBlobByte(image); + if (byte == EOF) + break; + } + *p++=(unsigned char) + ((i & 0x01) != 0 ? (byte & 0x0f) : ((byte >> 4) & 0x0f)); + } + x+=count; + /* + Read pad byte. + */ + if (compression == BI_RLE8) + { + if ((count & 0x01) != 0) + if (ReadBlobByte(image) == EOF) + break; + } + else + if (((count & 0x03) == 1) || ((count & 0x03) == 2)) + if (ReadBlobByte(image) == EOF) + break; + break; + } + } + } + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) ReadBlobByte(image); /* end of line */ + (void) ReadBlobByte(image); + return(y < (ssize_t) image->rows ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E n c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EncodeImage compresses pixels using a runlength encoded format. +% +% The format of the EncodeImage method is: +% +% static MagickBooleanType EncodeImage(Image *image, +% const size_t bytes_per_line,const unsigned char *pixels, +% unsigned char *compressed_pixels) +% +% A description of each parameter follows: +% +% o image: The image. +% +% o bytes_per_line: the number of bytes in a scanline of compressed pixels +% +% o pixels: The address of a byte (8 bits) array of pixel data created by +% the compression process. +% +% o compressed_pixels: The address of a byte (8 bits) array of compressed +% pixel data. +% +*/ +static size_t EncodeImage(Image *image,const size_t bytes_per_line, + const unsigned char *pixels,unsigned char *compressed_pixels) +{ + MagickBooleanType + status; + + const unsigned char + *p; + + ssize_t + i, + x; + + unsigned char + *q; + + ssize_t + y; + + /* + Runlength encode pixels. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(pixels != (const unsigned char *) NULL); + assert(compressed_pixels != (unsigned char *) NULL); + p=pixels; + q=compressed_pixels; + i=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + for (x=0; x < (ssize_t) bytes_per_line; x+=i) + { + /* + Determine runlength. + */ + for (i=1; ((x+i) < (ssize_t) bytes_per_line); i++) + if ((i == 255) || (*(p+i) != *p)) + break; + *q++=(unsigned char) i; + *q++=(*p); + p+=i; + } + /* + End of line. + */ + *q++=(unsigned char) 0x00; + *q++=(unsigned char) 0x00; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + /* + End of bitmap. + */ + *q++=(unsigned char) 0x00; + *q++=(unsigned char) 0x01; + return((size_t) (q-compressed_pixels)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s B M P % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsBMP() returns MagickTrue if the image format type, identified by the +% magick string, is BMP. +% +% The format of the IsBMP method is: +% +% MagickBooleanType IsBMP(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsBMP(const unsigned char *magick,const size_t length) +{ + if (length < 2) + return(MagickFalse); + if ((LocaleNCompare((char *) magick,"BA",2) == 0) || + (LocaleNCompare((char *) magick,"BM",2) == 0) || + (LocaleNCompare((char *) magick,"IC",2) == 0) || + (LocaleNCompare((char *) magick,"PT",2) == 0) || + (LocaleNCompare((char *) magick,"CI",2) == 0) || + (LocaleNCompare((char *) magick,"CP",2) == 0)) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d B M P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBMPImage() reads a Microsoft Windows bitmap image file, Version +% 2, 3 (for Windows or NT), or 4, and returns it. It allocates the memory +% necessary for the new Image structure and returns a pointer to the new +% image. +% +% The format of the ReadBMPImage method is: +% +% image=ReadBMPImage(image_info) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + BMPInfo + bmp_info; + + Image + *image; + + IndexPacket + index; + + MagickBooleanType + status; + + MagickOffsetType + offset, + profile_data, + profile_size, + start_position; + + MagickSizeType + blob_size; + + MemoryInfo + *pixel_info; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + i, + x; + + unsigned char + *p; + + size_t + bit, + bytes_per_line, + length; + + ssize_t + count, + y; + + unsigned char + magick[12], + *pixels; + + unsigned int + blue, + green, + offset_bits, + red; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Determine if this a BMP file. + */ + (void) memset(&bmp_info,0,sizeof(bmp_info)); + bmp_info.ba_offset=0; + start_position=0; + offset_bits=0; + count=ReadBlob(image,2,magick); + if (count != 2) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + blob_size=GetBlobSize(image); + do + { + LongPixelPacket + shift; + + PixelPacket + quantum_bits; + + /* + Verify BMP identifier. + */ + start_position=TellBlob(image)-2; + bmp_info.ba_offset=0; + while (LocaleNCompare((char *) magick,"BA",2) == 0) + { + bmp_info.file_size=ReadBlobLSBLong(image); + bmp_info.ba_offset=ReadBlobLSBLong(image); + bmp_info.offset_bits=ReadBlobLSBLong(image); + count=ReadBlob(image,2,magick); + if (count != 2) + break; + } + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule()," Magick: %c%c", + magick[0],magick[1]); + if ((count != 2) || ((LocaleNCompare((char *) magick,"BM",2) != 0) && + (LocaleNCompare((char *) magick,"CI",2) != 0))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + bmp_info.file_size=ReadBlobLSBLong(image); + (void) ReadBlobLSBLong(image); + bmp_info.offset_bits=ReadBlobLSBLong(image); + bmp_info.size=ReadBlobLSBLong(image); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " BMP header size: %u",bmp_info.size); + if (bmp_info.size > 124) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + profile_data=0; + profile_size=0; + if (bmp_info.size == 12) + { + /* + OS/2 BMP image file. + */ + (void) CopyMagickString(image->magick,"BMP2",MaxTextExtent); + bmp_info.width=(ssize_t) ((short) ReadBlobLSBShort(image)); + bmp_info.height=(ssize_t) ((short) ReadBlobLSBShort(image)); + bmp_info.planes=ReadBlobLSBShort(image); + bmp_info.bits_per_pixel=ReadBlobLSBShort(image); + bmp_info.x_pixels=0; + bmp_info.y_pixels=0; + bmp_info.number_colors=0; + bmp_info.compression=BI_RGB; + bmp_info.image_size=0; + bmp_info.alpha_mask=0; + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Format: OS/2 Bitmap"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Geometry: %.20gx%.20g",(double) bmp_info.width,(double) + bmp_info.height); + } + } + else + { + /* + Microsoft Windows BMP image file. + */ + bmp_info.width=(ssize_t) ReadBlobLSBSignedLong(image); + bmp_info.height=(ssize_t) ReadBlobLSBSignedLong(image); + bmp_info.planes=ReadBlobLSBShort(image); + bmp_info.bits_per_pixel=ReadBlobLSBShort(image); + bmp_info.compression=ReadBlobLSBLong(image); + if (bmp_info.size > 16) + { + bmp_info.image_size=ReadBlobLSBLong(image); + bmp_info.x_pixels=ReadBlobLSBLong(image); + bmp_info.y_pixels=ReadBlobLSBLong(image); + bmp_info.number_colors=ReadBlobLSBLong(image); + if ((MagickSizeType) bmp_info.number_colors > blob_size) + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + bmp_info.colors_important=ReadBlobLSBLong(image); + } + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Format: MS Windows bitmap"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Geometry: %.20gx%.20g",(double) bmp_info.width,(double) + bmp_info.height); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Bits per pixel: %.20g",(double) bmp_info.bits_per_pixel); + switch (bmp_info.compression) + { + case BI_RGB: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression: BI_RGB"); + break; + } + case BI_RLE4: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression: BI_RLE4"); + break; + } + case BI_RLE8: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression: BI_RLE8"); + break; + } + case BI_BITFIELDS: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression: BI_BITFIELDS"); + break; + } + case BI_PNG: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression: BI_PNG"); + break; + } + case BI_JPEG: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression: BI_JPEG"); + break; + } + default: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression: UNKNOWN (%u)",bmp_info.compression); + } + } + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Number of colors: %u",bmp_info.number_colors); + } + if ((bmp_info.size > 40) || (bmp_info.compression == BI_BITFIELDS)) + { + bmp_info.red_mask=ReadBlobLSBLong(image); + bmp_info.green_mask=ReadBlobLSBLong(image); + bmp_info.blue_mask=ReadBlobLSBLong(image); + } + if (bmp_info.size > 40) + { + double + gamma; + + /* + Read color management information. + */ + bmp_info.alpha_mask=ReadBlobLSBLong(image); + bmp_info.colorspace=ReadBlobLSBSignedLong(image); + /* + Decode 2^30 fixed point formatted CIE primaries. + */ +# define BMP_DENOM ((double) 0x40000000) + bmp_info.red_primary.x=(double) ReadBlobLSBLong(image)/BMP_DENOM; + bmp_info.red_primary.y=(double) ReadBlobLSBLong(image)/BMP_DENOM; + bmp_info.red_primary.z=(double) ReadBlobLSBLong(image)/BMP_DENOM; + bmp_info.green_primary.x=(double) ReadBlobLSBLong(image)/BMP_DENOM; + bmp_info.green_primary.y=(double) ReadBlobLSBLong(image)/BMP_DENOM; + bmp_info.green_primary.z=(double) ReadBlobLSBLong(image)/BMP_DENOM; + bmp_info.blue_primary.x=(double) ReadBlobLSBLong(image)/BMP_DENOM; + bmp_info.blue_primary.y=(double) ReadBlobLSBLong(image)/BMP_DENOM; + bmp_info.blue_primary.z=(double) ReadBlobLSBLong(image)/BMP_DENOM; + + gamma=bmp_info.red_primary.x+bmp_info.red_primary.y+ + bmp_info.red_primary.z; + gamma=PerceptibleReciprocal(gamma); + bmp_info.red_primary.x*=gamma; + bmp_info.red_primary.y*=gamma; + image->chromaticity.red_primary.x=bmp_info.red_primary.x; + image->chromaticity.red_primary.y=bmp_info.red_primary.y; + + gamma=bmp_info.green_primary.x+bmp_info.green_primary.y+ + bmp_info.green_primary.z; + gamma=PerceptibleReciprocal(gamma); + bmp_info.green_primary.x*=gamma; + bmp_info.green_primary.y*=gamma; + image->chromaticity.green_primary.x=bmp_info.green_primary.x; + image->chromaticity.green_primary.y=bmp_info.green_primary.y; + + gamma=bmp_info.blue_primary.x+bmp_info.blue_primary.y+ + bmp_info.blue_primary.z; + gamma=PerceptibleReciprocal(gamma); + bmp_info.blue_primary.x*=gamma; + bmp_info.blue_primary.y*=gamma; + image->chromaticity.blue_primary.x=bmp_info.blue_primary.x; + image->chromaticity.blue_primary.y=bmp_info.blue_primary.y; + + /* + Decode 16^16 fixed point formatted gamma_scales. + */ + bmp_info.gamma_scale.x=(double) ReadBlobLSBLong(image)/0x10000; + bmp_info.gamma_scale.y=(double) ReadBlobLSBLong(image)/0x10000; + bmp_info.gamma_scale.z=(double) ReadBlobLSBLong(image)/0x10000; + /* + Compute a single gamma from the BMP 3-channel gamma. + */ + image->gamma=(bmp_info.gamma_scale.x+bmp_info.gamma_scale.y+ + bmp_info.gamma_scale.z)/3.0; + } + else + (void) CopyMagickString(image->magick,"BMP3",MaxTextExtent); + + if (bmp_info.size > 108) + { + size_t + intent; + + /* + Read BMP Version 5 color management information. + */ + intent=ReadBlobLSBLong(image); + switch ((int) intent) + { + case LCS_GM_BUSINESS: + { + image->rendering_intent=SaturationIntent; + break; + } + case LCS_GM_GRAPHICS: + { + image->rendering_intent=RelativeIntent; + break; + } + case LCS_GM_IMAGES: + { + image->rendering_intent=PerceptualIntent; + break; + } + case LCS_GM_ABS_COLORIMETRIC: + { + image->rendering_intent=AbsoluteIntent; + break; + } + } + profile_data=(MagickOffsetType) ReadBlobLSBLong(image); + profile_size=(MagickOffsetType) ReadBlobLSBLong(image); + (void) ReadBlobLSBLong(image); /* Reserved byte */ + } + } + if ((MagickSizeType) bmp_info.file_size != blob_size) + { + const char + *option; + + option=GetImageOption(image_info,"bmp:ignore-filesize"); + if (IsStringTrue(option) == MagickFalse) + (void) ThrowMagickException(exception,GetMagickModule(), + CorruptImageError,"LengthAndFilesizeDoNotMatch","`%s'", + image->filename); + } + if (bmp_info.width <= 0) + ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize"); + if (bmp_info.height == 0) + ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize"); + if (bmp_info.planes != 1) + ThrowReaderException(CorruptImageError,"StaticPlanesValueNotEqualToOne"); + if ((bmp_info.bits_per_pixel != 1) && (bmp_info.bits_per_pixel != 4) && + (bmp_info.bits_per_pixel != 8) && (bmp_info.bits_per_pixel != 16) && + (bmp_info.bits_per_pixel != 24) && (bmp_info.bits_per_pixel != 32)) + ThrowReaderException(CorruptImageError,"UnsupportedBitsPerPixel"); + if (bmp_info.bits_per_pixel < 16 && + bmp_info.number_colors > (1U << bmp_info.bits_per_pixel)) + ThrowReaderException(CorruptImageError,"UnrecognizedNumberOfColors"); + if ((bmp_info.compression == BI_RLE8) && (bmp_info.bits_per_pixel != 8)) + ThrowReaderException(CorruptImageError,"UnsupportedBitsPerPixel"); + if ((bmp_info.compression == BI_RLE4) && (bmp_info.bits_per_pixel != 4)) + ThrowReaderException(CorruptImageError,"UnsupportedBitsPerPixel"); + if ((bmp_info.compression == BI_BITFIELDS) && (bmp_info.bits_per_pixel < 16)) + ThrowReaderException(CorruptImageError,"UnsupportedBitsPerPixel"); + switch (bmp_info.compression) + { + case BI_RGB: + image->compression=NoCompression; + break; + case BI_RLE8: + case BI_RLE4: + image->compression=RLECompression; + break; + case BI_BITFIELDS: + break; + case BI_JPEG: + ThrowReaderException(CoderError,"JPEGCompressNotSupported"); + case BI_PNG: + ThrowReaderException(CoderError,"PNGCompressNotSupported"); + default: + ThrowReaderException(CorruptImageError,"UnrecognizedImageCompression"); + } + image->columns=(size_t) MagickAbsoluteValue(bmp_info.width); + image->rows=(size_t) MagickAbsoluteValue(bmp_info.height); + image->depth=bmp_info.bits_per_pixel <= 8 ? bmp_info.bits_per_pixel : 8; + image->matte=((bmp_info.alpha_mask != 0) && + (bmp_info.compression == BI_BITFIELDS)) ? MagickTrue : MagickFalse; + if (bmp_info.bits_per_pixel < 16) + { + size_t + one; + + image->storage_class=PseudoClass; + image->colors=bmp_info.number_colors; + one=1; + if (image->colors == 0) + image->colors=one << bmp_info.bits_per_pixel; + } + image->x_resolution=(double) bmp_info.x_pixels/100.0; + image->y_resolution=(double) bmp_info.y_pixels/100.0; + image->units=PixelsPerCentimeterResolution; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (image->storage_class == PseudoClass) + { + unsigned char + *bmp_colormap; + + size_t + packet_size; + + /* + Read BMP raster colormap. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading colormap of %.20g colors",(double) image->colors); + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + bmp_colormap=(unsigned char *) AcquireQuantumMemory((size_t) + image->colors,4*sizeof(*bmp_colormap)); + if (bmp_colormap == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if ((bmp_info.size == 12) || (bmp_info.size == 64)) + packet_size=3; + else + packet_size=4; + offset=SeekBlob(image,start_position+14+bmp_info.size,SEEK_SET); + if (offset < 0) + { + bmp_colormap=(unsigned char *) RelinquishMagickMemory(bmp_colormap); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + count=ReadBlob(image,packet_size*image->colors,bmp_colormap); + if (count != (ssize_t) (packet_size*image->colors)) + { + bmp_colormap=(unsigned char *) RelinquishMagickMemory(bmp_colormap); + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + } + p=bmp_colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].blue=ScaleCharToQuantum(*p++); + image->colormap[i].green=ScaleCharToQuantum(*p++); + image->colormap[i].red=ScaleCharToQuantum(*p++); + if (packet_size == 4) + p++; + } + bmp_colormap=(unsigned char *) RelinquishMagickMemory(bmp_colormap); + } + /* + Read image data. + */ + if (bmp_info.offset_bits == offset_bits) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + offset_bits=bmp_info.offset_bits; + offset=SeekBlob(image,start_position+bmp_info.offset_bits,SEEK_SET); + if (offset < 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (bmp_info.compression == BI_RLE4) + bmp_info.bits_per_pixel<<=1; + bytes_per_line=4*((image->columns*bmp_info.bits_per_pixel+31)/32); + length=(size_t) bytes_per_line*image->rows; + if ((MagickSizeType) (length/256) > blob_size) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + if ((bmp_info.compression == BI_RGB) || + (bmp_info.compression == BI_BITFIELDS)) + { + pixel_info=AcquireVirtualMemory(image->rows,MagickMax(bytes_per_line, + image->columns+256UL)*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading pixels (%.20g bytes)",(double) length); + count=ReadBlob(image,length,pixels); + if (count != (ssize_t) length) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + } + } + else + { + /* + Convert run-length encoded raster pixels. + */ + pixel_info=AcquireVirtualMemory(image->rows,MagickMax(bytes_per_line, + image->columns+256UL)*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + status=DecodeImage(image,bmp_info.compression,pixels, + image->columns*image->rows); + if (status == MagickFalse) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError, + "UnableToRunlengthDecodeImage"); + } + } + /* + Convert BMP raster image to pixel packets. + */ + if (bmp_info.compression == BI_RGB) + { + /* + We should ignore the alpha value in BMP3 files but there have been + reports about 32 bit files with alpha. We do a quick check to see if + the alpha channel contains a value that is not zero (default value). + If we find a non zero value we asume the program that wrote the file + wants to use the alpha channel. + */ + if ((image->matte == MagickFalse) && (bmp_info.size == 40) && + (bmp_info.bits_per_pixel == 32)) + { + bytes_per_line=4*(image->columns); + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (*(p+3) != 0) + { + image->matte=MagickTrue; + y=-1; + break; + } + p+=4; + } + } + } + bmp_info.alpha_mask=image->matte != MagickFalse ? 0xff000000U : 0U; + bmp_info.red_mask=0x00ff0000U; + bmp_info.green_mask=0x0000ff00U; + bmp_info.blue_mask=0x000000ffU; + if (bmp_info.bits_per_pixel == 16) + { + /* + RGB555. + */ + bmp_info.red_mask=0x00007c00U; + bmp_info.green_mask=0x000003e0U; + bmp_info.blue_mask=0x0000001fU; + } + } + (void) memset(&shift,0,sizeof(shift)); + (void) memset(&quantum_bits,0,sizeof(quantum_bits)); + if ((bmp_info.bits_per_pixel == 16) || (bmp_info.bits_per_pixel == 32)) + { + size_t + sample; + + /* + Get shift and quantum bits info from bitfield masks. + */ + if (bmp_info.red_mask != 0) + while (((bmp_info.red_mask << shift.red) & 0x80000000UL) == 0) + { + shift.red++; + if (shift.red > 32U) + break; + } + if (bmp_info.green_mask != 0) + while (((bmp_info.green_mask << shift.green) & 0x80000000UL) == 0) + { + shift.green++; + if (shift.green > 32U) + break; + } + if (bmp_info.blue_mask != 0) + while (((bmp_info.blue_mask << shift.blue) & 0x80000000UL) == 0) + { + shift.blue++; + if (shift.blue > 32U) + break; + } + if (bmp_info.alpha_mask != 0) + while (((bmp_info.alpha_mask << shift.opacity) & 0x80000000UL) == 0) + { + shift.opacity++; + if (shift.opacity > 32U) + break; + } + sample=shift.red; + while (((bmp_info.red_mask << sample) & 0x80000000UL) != 0) + { + sample++; + if (sample > 32U) + break; + } + quantum_bits.red=ClampToQuantum((MagickRealType) sample-shift.red); + sample=shift.green; + while (((bmp_info.green_mask << sample) & 0x80000000UL) != 0) + { + sample++; + if (sample >= 32U) + break; + } + quantum_bits.green=ClampToQuantum((MagickRealType) sample-shift.green); + sample=shift.blue; + while (((bmp_info.blue_mask << sample) & 0x80000000UL) != 0) + { + sample++; + if (sample >= 32U) + break; + } + quantum_bits.blue=ClampToQuantum((MagickRealType) sample-shift.blue); + sample=shift.opacity; + while (((bmp_info.alpha_mask << sample) & 0x80000000UL) != 0) + { + sample++; + if (sample >= 32U) + break; + } + quantum_bits.opacity=ClampToQuantum((MagickRealType) sample- + shift.opacity); + } + switch (bmp_info.bits_per_pixel) + { + case 1: + { + /* + Convert bitmap scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < ((ssize_t) image->columns-7); x+=8) + { + for (bit=0; bit < 8; bit++) + { + index=(IndexPacket) (((*p) & (0x80 >> bit)) != 0 ? 0x01 : 0x00); + SetPixelIndex(indexes+x+bit,index); + q++; + } + p++; + } + if ((image->columns % 8) != 0) + { + for (bit=0; bit < (image->columns % 8); bit++) + { + index=(IndexPacket) (((*p) & (0x80 >> bit)) != 0 ? 0x01 : 0x00); + SetPixelIndex(indexes+x+bit,index); + } + p++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + (image->rows-y),image->rows); + if (status == MagickFalse) + break; + } + } + (void) SyncImage(image); + break; + } + case 4: + { + /* + Convert PseudoColor scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < ((ssize_t) image->columns-1); x+=2) + { + (void) IsValidColormapIndex(image,(ssize_t) ((*p >> 4) & 0x0f), + &index,exception); + SetPixelIndex(indexes+x,index); + (void) IsValidColormapIndex(image,(ssize_t) (*p & 0x0f),&index, + exception); + SetPixelIndex(indexes+x+1,index); + p++; + } + if ((image->columns % 2) != 0) + { + (void) IsValidColormapIndex(image,(ssize_t) ((*p >> 4) & 0xf), + &index,exception); + SetPixelIndex(indexes+(x++),index); + p++; + } + if (x < (ssize_t) image->columns) + break; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + (image->rows-y),image->rows); + if (status == MagickFalse) + break; + } + } + (void) SyncImage(image); + break; + } + case 8: + { + /* + Convert PseudoColor scanline. + */ + if ((bmp_info.compression == BI_RLE8) || + (bmp_info.compression == BI_RLE4)) + bytes_per_line=image->columns; + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=(ssize_t) image->columns; x != 0; --x) + { + (void) IsValidColormapIndex(image,(ssize_t) *p,&index,exception); + SetPixelIndex(indexes,index); + indexes++; + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + offset=(MagickOffsetType) (image->rows-y-1); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + (image->rows-y),image->rows); + if (status == MagickFalse) + break; + } + } + (void) SyncImage(image); + break; + } + case 16: + { + unsigned int + alpha, + pixel; + + /* + Convert bitfield encoded 16-bit PseudoColor scanline. + */ + if (bmp_info.compression != BI_RGB && + bmp_info.compression != BI_BITFIELDS) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError, + "UnrecognizedImageCompression"); + } + bytes_per_line=2*(image->columns+image->columns % 2); + image->storage_class=DirectClass; + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=(unsigned int) (*p++); + pixel|=(*p++) << 8; + red=((pixel & bmp_info.red_mask) << shift.red) >> 16; + if (quantum_bits.red == 5) + red|=((red & 0xe000) >> 5); + if (quantum_bits.red <= 8) + red|=((red & 0xff00) >> 8); + green=((pixel & bmp_info.green_mask) << shift.green) >> 16; + if (quantum_bits.green == 5) + green|=((green & 0xe000) >> 5); + if (quantum_bits.green == 6) + green|=((green & 0xc000) >> 6); + if (quantum_bits.green <= 8) + green|=((green & 0xff00) >> 8); + blue=((pixel & bmp_info.blue_mask) << shift.blue) >> 16; + if (quantum_bits.blue == 5) + blue|=((blue & 0xe000) >> 5); + if (quantum_bits.blue <= 8) + blue|=((blue & 0xff00) >> 8); + SetPixelRed(q,ScaleShortToQuantum((unsigned short) red)); + SetPixelGreen(q,ScaleShortToQuantum((unsigned short) green)); + SetPixelBlue(q,ScaleShortToQuantum((unsigned short) blue)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + alpha=((pixel & bmp_info.alpha_mask) << shift.opacity) >> 16; + if (quantum_bits.opacity <= 8) + alpha|=((alpha & 0xff00) >> 8); + SetPixelAlpha(q,ScaleShortToQuantum((unsigned short) alpha)); + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + offset=(MagickOffsetType) (image->rows-y-1); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + (image->rows-y),image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 24: + { + /* + Convert DirectColor scanline. + */ + bytes_per_line=4*((image->columns*24+31)/32); + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + offset=(MagickOffsetType) (image->rows-y-1); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + (image->rows-y),image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 32: + { + /* + Convert bitfield encoded DirectColor scanline. + */ + if ((bmp_info.compression != BI_RGB) && + (bmp_info.compression != BI_BITFIELDS)) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError, + "UnrecognizedImageCompression"); + } + bytes_per_line=4*(image->columns); + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + unsigned int + alpha, + pixel; + + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=(unsigned int) (*p++); + pixel|=((unsigned int) *p++ << 8); + pixel|=((unsigned int) *p++ << 16); + pixel|=((unsigned int) *p++ << 24); + red=((pixel & bmp_info.red_mask) << shift.red) >> 16; + if (quantum_bits.red == 8) + red|=(red >> 8); + green=((pixel & bmp_info.green_mask) << shift.green) >> 16; + if (quantum_bits.green == 8) + green|=(green >> 8); + blue=((pixel & bmp_info.blue_mask) << shift.blue) >> 16; + if (quantum_bits.blue == 8) + blue|=(blue >> 8); + SetPixelRed(q,ScaleShortToQuantum((unsigned short) red)); + SetPixelGreen(q,ScaleShortToQuantum((unsigned short) green)); + SetPixelBlue(q,ScaleShortToQuantum((unsigned short) blue)); + SetPixelAlpha(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + alpha=((pixel & bmp_info.alpha_mask) << shift.opacity) >> 16; + if (quantum_bits.opacity == 8) + alpha|=(alpha >> 8); + SetPixelAlpha(q,ScaleShortToQuantum((unsigned short) alpha)); + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + offset=(MagickOffsetType) (image->rows-y-1); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + (image->rows-y),image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + default: + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + if (y > 0) + break; + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + if (bmp_info.height < 0) + { + Image + *flipped_image; + + /* + Correct image orientation. + */ + flipped_image=FlipImage(image,exception); + if (flipped_image != (Image *) NULL) + { + DuplicateBlob(flipped_image,image); + ReplaceImageInList(&image, flipped_image); + image=flipped_image; + } + } + /* + Read embeded ICC profile + */ + if ((bmp_info.colorspace == 0x4D424544L) && (profile_data > 0) && + (profile_size > 0)) + { + StringInfo + *profile; + + unsigned char + *datum; + + offset=start_position+14+profile_data; + if ((offset < TellBlob(image)) || + (SeekBlob(image,offset,SEEK_SET) != offset) || + (blob_size < (MagickSizeType) (offset+profile_size))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + profile=AcquireStringInfo((size_t) profile_size); + if (profile == (StringInfo *) NULL) + ThrowReaderException(CorruptImageError,"MemoryAllocationFailed"); + datum=GetStringInfoDatum(profile); + if (ReadBlob(image,(size_t) profile_size,datum) == (ssize_t) profile_size) + { + MagickOffsetType + profile_size_orig; + + /* + Trimming padded bytes. + */ + profile_size_orig=(MagickOffsetType) datum[0] << 24; + profile_size_orig|=(MagickOffsetType) datum[1] << 16; + profile_size_orig|=(MagickOffsetType) datum[2] << 8; + profile_size_orig|=(MagickOffsetType) datum[3]; + if (profile_size_orig < profile_size) + SetStringInfoLength(profile,(size_t) profile_size_orig); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Profile: ICC, %u bytes",(unsigned int) profile_size_orig); + (void) SetImageProfile(image,"icc",profile); + } + profile=DestroyStringInfo(profile); + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + offset=(MagickOffsetType) bmp_info.ba_offset; + if (offset != 0) + if ((offset < TellBlob(image)) || + (SeekBlob(image,offset,SEEK_SET) != offset)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + *magick='\0'; + count=ReadBlob(image,2,magick); + if ((count == 2) && (IsBMP(magick,2) != MagickFalse)) + { + /* + Acquire next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image),blob_size); + if (status == MagickFalse) + break; + } + } while (IsBMP(magick,2) != MagickFalse); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r B M P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterBMPImage() adds attributes for the BMP image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterBMPImage method is: +% +% size_t RegisterBMPImage(void) +% +*/ +ModuleExport size_t RegisterBMPImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("BMP"); + entry->decoder=(DecodeImageHandler *) ReadBMPImage; + entry->encoder=(EncodeImageHandler *) WriteBMPImage; + entry->magick=(IsImageFormatHandler *) IsBMP; + entry->description=ConstantString("Microsoft Windows bitmap image"); + entry->magick_module=ConstantString("BMP"); + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("BMP2"); + entry->decoder=(DecodeImageHandler *) ReadBMPImage; + entry->encoder=(EncodeImageHandler *) WriteBMPImage; + entry->magick=(IsImageFormatHandler *) IsBMP; + entry->description=ConstantString("Microsoft Windows bitmap image (V2)"); + entry->magick_module=ConstantString("BMP"); + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("BMP3"); + entry->decoder=(DecodeImageHandler *) ReadBMPImage; + entry->encoder=(EncodeImageHandler *) WriteBMPImage; + entry->magick=(IsImageFormatHandler *) IsBMP; + entry->description=ConstantString("Microsoft Windows bitmap image (V3)"); + entry->magick_module=ConstantString("BMP"); + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r B M P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterBMPImage() removes format registrations made by the +% BMP module from the list of supported formats. +% +% The format of the UnregisterBMPImage method is: +% +% UnregisterBMPImage(void) +% +*/ +ModuleExport void UnregisterBMPImage(void) +{ + (void) UnregisterMagickInfo("BMP"); + (void) UnregisterMagickInfo("BMP2"); + (void) UnregisterMagickInfo("BMP3"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e B M P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBMPImage() writes an image in Microsoft Windows bitmap encoded +% image format, version 3 for Windows or (if the image has a matte channel) +% version 4. +% +% The format of the WriteBMPImage method is: +% +% MagickBooleanType WriteBMPImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteBMPImage(const ImageInfo *image_info,Image *image) +{ + BMPInfo + bmp_info; + + BMPSubtype + bmp_subtype; + + const char + *option; + + const StringInfo + *profile; + + MagickBooleanType + have_color_info, + status; + + MemoryInfo + *pixel_info; + + MagickOffsetType + scene; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + unsigned char + *q; + + size_t + bytes_per_line, + imageListLength, + type; + + ssize_t + y; + + unsigned char + *bmp_data, + *pixels; + + MagickOffsetType + profile_data, + profile_size, + profile_size_pad; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (((image->columns << 3) != (size_t) ((int) (image->columns << 3))) || + ((image->rows << 3) != (size_t) ((int) (image->rows << 3)))) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + type=4; + if (LocaleCompare(image_info->magick,"BMP2") == 0) + type=2; + else + if (LocaleCompare(image_info->magick,"BMP3") == 0) + type=3; + + option=GetImageOption(image_info,"bmp:format"); + if (option != (char *) NULL) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Format=%s",option); + + if (LocaleCompare(option,"bmp2") == 0) + type=2; + if (LocaleCompare(option,"bmp3") == 0) + type=3; + if (LocaleCompare(option,"bmp4") == 0) + type=4; + } + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Initialize BMP raster file header. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + (void) memset(&bmp_info,0,sizeof(bmp_info)); + bmp_info.file_size=14+12; + if (type > 2) + bmp_info.file_size+=28; + bmp_info.offset_bits=bmp_info.file_size; + bmp_info.compression=BI_RGB; + bmp_info.red_mask=0x00ff0000U; + bmp_info.green_mask=0x0000ff00U; + bmp_info.blue_mask=0x000000ffU; + bmp_info.alpha_mask=0xff000000U; + bmp_subtype=UndefinedSubtype; + if ((image->storage_class == PseudoClass) && (image->colors > 256)) + (void) SetImageStorageClass(image,DirectClass); + if (image->storage_class != DirectClass) + { + /* + Colormapped BMP raster. + */ + bmp_info.bits_per_pixel=8; + if (image->colors <= 2) + bmp_info.bits_per_pixel=1; + else + if (image->colors <= 16) + bmp_info.bits_per_pixel=4; + else + if (image->colors <= 256) + bmp_info.bits_per_pixel=8; + if (image_info->compression == RLECompression) + bmp_info.bits_per_pixel=8; + bmp_info.number_colors=1U << bmp_info.bits_per_pixel; + if (image->matte != MagickFalse) + (void) SetImageStorageClass(image,DirectClass); + else + if ((size_t) bmp_info.number_colors < image->colors) + (void) SetImageStorageClass(image,DirectClass); + else + { + bmp_info.file_size+=3*(1UL << bmp_info.bits_per_pixel); + bmp_info.offset_bits+=3*(1UL << bmp_info.bits_per_pixel); + if (type > 2) + { + bmp_info.file_size+=(1UL << bmp_info.bits_per_pixel); + bmp_info.offset_bits+=(1UL << bmp_info.bits_per_pixel); + } + } + } + if (image->storage_class == DirectClass) + { + /* + Full color BMP raster. + */ + bmp_info.number_colors=0; + option=GetImageOption(image_info,"bmp:subtype"); + if (option != (const char *) NULL) + { + if (image->matte != MagickFalse) + { + if (LocaleNCompare(option,"ARGB4444",8) == 0) + { + bmp_subtype=ARGB4444; + bmp_info.red_mask=0x00000f00U; + bmp_info.green_mask=0x000000f0U; + bmp_info.blue_mask=0x0000000fU; + bmp_info.alpha_mask=0x0000f000U; + } + else if (LocaleNCompare(option,"ARGB1555",8) == 0) + { + bmp_subtype=ARGB1555; + bmp_info.red_mask=0x00007c00U; + bmp_info.green_mask=0x000003e0U; + bmp_info.blue_mask=0x0000001fU; + bmp_info.alpha_mask=0x00008000U; + } + } + else + { + if (LocaleNCompare(option,"RGB555",6) == 0) + { + bmp_subtype=RGB555; + bmp_info.red_mask=0x00007c00U; + bmp_info.green_mask=0x000003e0U; + bmp_info.blue_mask=0x0000001fU; + bmp_info.alpha_mask=0U; + } + else if (LocaleNCompare(option,"RGB565",6) == 0) + { + bmp_subtype=RGB565; + bmp_info.red_mask=0x0000f800U; + bmp_info.green_mask=0x000007e0U; + bmp_info.blue_mask=0x0000001fU; + bmp_info.alpha_mask=0U; + } + } + } + if (bmp_subtype != UndefinedSubtype) + { + bmp_info.bits_per_pixel=16; + bmp_info.compression=BI_BITFIELDS; + } + else + { + bmp_info.bits_per_pixel=(unsigned short) + ((type > 3) && (image->matte != MagickFalse) ? 32 : 24); + bmp_info.compression=(unsigned int) ((type > 3) && + (image->matte != MagickFalse) ? BI_BITFIELDS : BI_RGB); + if ((type == 3) && (image->matte != MagickFalse)) + { + option=GetImageOption(image_info,"bmp3:alpha"); + if (IsStringTrue(option)) + bmp_info.bits_per_pixel=32; + } + } + } + bytes_per_line=4*((image->columns*bmp_info.bits_per_pixel+31)/32); + bmp_info.ba_offset=0; + profile=GetImageProfile(image,"icc"); + have_color_info=(image->rendering_intent != UndefinedIntent) || + (profile != (StringInfo *) NULL) || (image->gamma != 0.0) ? MagickTrue : + MagickFalse; + if (type == 2) + bmp_info.size=12; + else + if ((type == 3) || ((image->matte == MagickFalse) && + (have_color_info == MagickFalse))) + { + type=3; + bmp_info.size=40; + } + else + { + int + extra_size; + + bmp_info.size=108; + extra_size=68; + if ((image->rendering_intent != UndefinedIntent) || + (profile != (StringInfo *) NULL)) + { + bmp_info.size=124; + extra_size+=16; + } + bmp_info.file_size+=extra_size; + bmp_info.offset_bits+=extra_size; + } + if (((ssize_t) image->columns != (ssize_t) ((signed int) image->columns)) || + ((ssize_t) image->rows != (ssize_t) ((signed int) image->rows))) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + bmp_info.width=(ssize_t) image->columns; + bmp_info.height=(ssize_t) image->rows; + bmp_info.planes=1; + bmp_info.image_size=(unsigned int) (bytes_per_line*image->rows); + bmp_info.file_size+=bmp_info.image_size; + bmp_info.x_pixels=75*39; + bmp_info.y_pixels=75*39; + switch (image->units) + { + case UndefinedResolution: + case PixelsPerInchResolution: + { + bmp_info.x_pixels=(unsigned int) (100.0*image->x_resolution/2.54); + bmp_info.y_pixels=(unsigned int) (100.0*image->y_resolution/2.54); + break; + } + case PixelsPerCentimeterResolution: + { + bmp_info.x_pixels=(unsigned int) (100.0*image->x_resolution); + bmp_info.y_pixels=(unsigned int) (100.0*image->y_resolution); + break; + } + } + bmp_info.colors_important=bmp_info.number_colors; + /* + Convert MIFF to BMP raster pixels. + */ + pixel_info=AcquireVirtualMemory(image->rows,MagickMax(bytes_per_line, + image->columns+256UL)*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + (void) memset(pixels,0,(size_t) bmp_info.image_size); + switch (bmp_info.bits_per_pixel) + { + case 1: + { + size_t + bit, + byte; + + /* + Convert PseudoClass image to a BMP monochrome image. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + q=pixels+(image->rows-y-1)*bytes_per_line; + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte<<=1; + byte|=GetPixelIndex(indexes+x) != 0 ? 0x01 : 0x00; + bit++; + if (bit == 8) + { + *q++=(unsigned char) byte; + bit=0; + byte=0; + } + } + if (bit != 0) + { + *q++=(unsigned char) (byte << (8-bit)); + x++; + } + for (x=(ssize_t) (image->columns+7)/8; x < (ssize_t) bytes_per_line; x++) + *q++=0x00; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 4: + { + size_t + nibble, + byte; + + /* + Convert PseudoClass image to a BMP monochrome image. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + q=pixels+(image->rows-y-1)*bytes_per_line; + nibble=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte<<=4; + byte|=((size_t) GetPixelIndex(indexes+x) & 0x0f); + nibble++; + if (nibble == 2) + { + *q++=(unsigned char) byte; + nibble=0; + byte=0; + } + } + if (nibble != 0) + { + *q++=(unsigned char) (byte << 4); + x++; + } + for (x=(ssize_t) (image->columns+1)/2; x < (ssize_t) bytes_per_line; x++) + *q++=0x00; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 8: + { + /* + Convert PseudoClass packet to BMP pixel. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + q=pixels+(image->rows-y-1)*bytes_per_line; + for (x=0; x < (ssize_t) image->columns; x++) + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + for ( ; x < (ssize_t) bytes_per_line; x++) + *q++=0x00; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 16: + { + /* + Convert DirectClass packet to BMP BGR888. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=(pixels+(image->rows-y-1)*bytes_per_line); + for (x=0; x < (ssize_t) image->columns; x++) + { + unsigned short + pixel; + + pixel=0; + if (bmp_subtype == ARGB4444) + { + pixel=(unsigned short) (ScaleQuantumToAny( + GetPixelAlpha(p),15) << 12); + pixel|=(unsigned short) (ScaleQuantumToAny( + GetPixelRed(p),15) << 8); + pixel|=(unsigned short) (ScaleQuantumToAny( + GetPixelGreen(p),15) << 4); + pixel|=(unsigned short) (ScaleQuantumToAny( + GetPixelBlue(p),15)); + } + else if (bmp_subtype == RGB565) + { + pixel=(unsigned short) (ScaleQuantumToAny( + GetPixelRed(p),31) << 11); + pixel|=(unsigned short) (ScaleQuantumToAny( + GetPixelGreen(p),63) << 5); + pixel|=(unsigned short) (ScaleQuantumToAny( + GetPixelBlue(p),31)); + } + else + { + if (bmp_subtype == ARGB1555) + pixel=(unsigned short) (ScaleQuantumToAny( + GetPixelAlpha(p),1) << 15); + pixel|=(unsigned short) (ScaleQuantumToAny( + GetPixelRed(p),31) << 10); + pixel|=(unsigned short) (ScaleQuantumToAny( + GetPixelGreen(p),31) << 5); + pixel|=(unsigned short) (ScaleQuantumToAny( + GetPixelBlue(p),31)); + } + *((unsigned short *) q)=pixel; + q+=2; + p++; + } + for (x=2L*(ssize_t) image->columns; x < (ssize_t) bytes_per_line; x++) + *q++=0x00; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 24: + { + /* + Convert DirectClass packet to BMP BGR888. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels+(image->rows-y-1)*bytes_per_line; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelRed(p)); + p++; + } + for (x=3L*(ssize_t) image->columns; x < (ssize_t) bytes_per_line; x++) + *q++=0x00; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 32: + { + /* + Convert DirectClass packet to ARGB8888 pixel. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels+(image->rows-y-1)*bytes_per_line; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelAlpha(p)); + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + } + if ((type > 2) && (bmp_info.bits_per_pixel == 8)) + if (image_info->compression != NoCompression) + { + MemoryInfo + *rle_info; + + /* + Convert run-length encoded raster pixels. + */ + rle_info=AcquireVirtualMemory((size_t) (2*(bytes_per_line+2)+2), + (image->rows+2)*sizeof(*pixels)); + if (rle_info == (MemoryInfo *) NULL) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + bmp_data=(unsigned char *) GetVirtualMemoryBlob(rle_info); + bmp_info.file_size-=bmp_info.image_size; + bmp_info.image_size=(unsigned int) EncodeImage(image,bytes_per_line, + pixels,bmp_data); + bmp_info.file_size+=bmp_info.image_size; + pixel_info=RelinquishVirtualMemory(pixel_info); + pixel_info=rle_info; + pixels=bmp_data; + bmp_info.compression=BI_RLE8; + } + /* + Write BMP for Windows, all versions, 14-byte header. + */ + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing BMP version %.20g datastream",(double) type); + if (image->storage_class == DirectClass) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Storage class=DirectClass"); + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Storage class=PseudoClass"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Image depth=%.20g",(double) image->depth); + if (image->matte != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Matte=True"); + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Matte=MagickFalse"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " BMP bits_per_pixel=%.20g",(double) bmp_info.bits_per_pixel); + switch ((int) bmp_info.compression) + { + case BI_RGB: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression=BI_RGB"); + break; + } + case BI_RLE8: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression=BI_RLE8"); + break; + } + case BI_BITFIELDS: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression=BI_BITFIELDS"); + break; + } + default: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression=UNKNOWN (%u)",bmp_info.compression); + break; + } + } + if (bmp_info.number_colors == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Number_colors=unspecified"); + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Number_colors=%u",bmp_info.number_colors); + } + profile_data=0; + profile_size=0; + profile_size_pad=0; + if (profile) { + profile_data=(MagickOffsetType) bmp_info.file_size-14; /* from head of BMP info header */ + profile_size=(MagickOffsetType) GetStringInfoLength(profile); + if (profile_size%4) { + profile_size_pad=4-(profile_size%4); + } + bmp_info.file_size+=profile_size+profile_size_pad; + } + (void) WriteBlob(image,2,(unsigned char *) "BM"); + (void) WriteBlobLSBLong(image,bmp_info.file_size); + (void) WriteBlobLSBLong(image,bmp_info.ba_offset); /* always 0 */ + (void) WriteBlobLSBLong(image,bmp_info.offset_bits); + if (type == 2) + { + /* + Write 12-byte version 2 bitmap header. + */ + (void) WriteBlobLSBLong(image,bmp_info.size); + (void) WriteBlobLSBSignedShort(image,(signed short) bmp_info.width); + (void) WriteBlobLSBSignedShort(image,(signed short) bmp_info.height); + (void) WriteBlobLSBShort(image,bmp_info.planes); + (void) WriteBlobLSBShort(image,bmp_info.bits_per_pixel); + } + else + { + /* + Write 40-byte version 3+ bitmap header. + */ + (void) WriteBlobLSBLong(image,bmp_info.size); + (void) WriteBlobLSBSignedLong(image,(signed long) bmp_info.width); + (void) WriteBlobLSBSignedLong(image,(signed long) bmp_info.height); + (void) WriteBlobLSBShort(image,bmp_info.planes); + (void) WriteBlobLSBShort(image,bmp_info.bits_per_pixel); + (void) WriteBlobLSBLong(image,bmp_info.compression); + (void) WriteBlobLSBLong(image,bmp_info.image_size); + (void) WriteBlobLSBLong(image,bmp_info.x_pixels); + (void) WriteBlobLSBLong(image,bmp_info.y_pixels); + (void) WriteBlobLSBLong(image,bmp_info.number_colors); + (void) WriteBlobLSBLong(image,bmp_info.colors_important); + } + if ((type > 3) && ((image->matte != MagickFalse) || + (have_color_info != MagickFalse))) + { + /* + Write the rest of the 108-byte BMP Version 4 header. + */ + (void) WriteBlobLSBLong(image,bmp_info.red_mask); + (void) WriteBlobLSBLong(image,bmp_info.green_mask); + (void) WriteBlobLSBLong(image,bmp_info.blue_mask); + (void) WriteBlobLSBLong(image,bmp_info.alpha_mask); + if (profile) { + (void) WriteBlobLSBLong(image,0x4D424544U); /* PROFILE_EMBEDDED */ + } else { + (void) WriteBlobLSBLong(image,0x73524742U); /* sRGB */ + } + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) image->chromaticity.red_primary.x*0x40000000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) image->chromaticity.red_primary.y*0x40000000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) (1.000f-(image->chromaticity.red_primary.x+ + image->chromaticity.red_primary.y))*0x40000000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) image->chromaticity.green_primary.x*0x40000000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) image->chromaticity.green_primary.y*0x40000000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) (1.000f-(image->chromaticity.green_primary.x+ + image->chromaticity.green_primary.y))*0x40000000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) image->chromaticity.blue_primary.x*0x40000000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) image->chromaticity.blue_primary.y*0x40000000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) (1.000f-(image->chromaticity.blue_primary.x+ + image->chromaticity.blue_primary.y))*0x40000000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) bmp_info.gamma_scale.x*0x10000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) bmp_info.gamma_scale.y*0x10000)); + (void) WriteBlobLSBLong(image,(unsigned int) + ((ssize_t) bmp_info.gamma_scale.z*0x10000)); + if ((image->rendering_intent != UndefinedIntent) || + (profile != (StringInfo *) NULL)) + { + ssize_t + intent; + + switch ((int) image->rendering_intent) + { + case SaturationIntent: + { + intent=LCS_GM_BUSINESS; + break; + } + case RelativeIntent: + { + intent=LCS_GM_GRAPHICS; + break; + } + case PerceptualIntent: + { + intent=LCS_GM_IMAGES; + break; + } + case AbsoluteIntent: + { + intent=LCS_GM_ABS_COLORIMETRIC; + break; + } + default: + { + intent=0; + break; + } + } + (void) WriteBlobLSBLong(image,(unsigned int) intent); + (void) WriteBlobLSBLong(image,(unsigned int) profile_data); + (void) WriteBlobLSBLong(image,(unsigned int) (profile_size+ + profile_size_pad)); + (void) WriteBlobLSBLong(image,0x00); /* reserved */ + } + } + if (image->storage_class == PseudoClass) + { + unsigned char + *bmp_colormap; + + /* + Dump colormap to file. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Colormap: %.20g entries",(double) image->colors); + bmp_colormap=(unsigned char *) AcquireQuantumMemory((size_t) (1UL << + bmp_info.bits_per_pixel),4*sizeof(*bmp_colormap)); + if (bmp_colormap == (unsigned char *) NULL) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + q=bmp_colormap; + for (i=0; i < (ssize_t) MagickMin((ssize_t) image->colors,(ssize_t) bmp_info.number_colors); i++) + { + *q++=ScaleQuantumToChar(image->colormap[i].blue); + *q++=ScaleQuantumToChar(image->colormap[i].green); + *q++=ScaleQuantumToChar(image->colormap[i].red); + if (type > 2) + *q++=(unsigned char) 0x0; + } + for ( ; i < (ssize_t) (1UL << bmp_info.bits_per_pixel); i++) + { + *q++=(unsigned char) 0x00; + *q++=(unsigned char) 0x00; + *q++=(unsigned char) 0x00; + if (type > 2) + *q++=(unsigned char) 0x00; + } + if (type <= 2) + (void) WriteBlob(image,(size_t) (3*(1L << bmp_info.bits_per_pixel)), + bmp_colormap); + else + (void) WriteBlob(image,(size_t) (4*(1L << bmp_info.bits_per_pixel)), + bmp_colormap); + bmp_colormap=(unsigned char *) RelinquishMagickMemory(bmp_colormap); + } + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Pixels: %u bytes",bmp_info.image_size); + (void) WriteBlob(image,(size_t) bmp_info.image_size,pixels); + if (profile) { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Profile: %g bytes",(double) profile_size+profile_size_pad); + (void) WriteBlob(image,(size_t) profile_size,GetStringInfoDatum(profile)); + if (profile_size_pad) { /* padding for 4 bytes multiple */ + (void) WriteBlob(image,(size_t) profile_size_pad,(unsigned char *) + "\0\0\0"); + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " File_size: %u bytes",bmp_info.file_size); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/braille.c b/ImageMagick-6.9.12-44/coders/braille.c new file mode 100644 index 0000000..8f9adcd --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/braille.c @@ -0,0 +1,384 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% BBBB RRRR AAA IIIII L L EEEEE % +% B B R R A A I L L E % +% BBBB RRRR AAAAA I L L EEE % +% B B R R A A I L L E % +% BBBB R R A A IIIII LLLLL LLLLL EEEEE % +% % +% % +% Read/Write Braille Format % +% % +% Samuel Thibault % +% February 2008 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteBRAILLEImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r B R A I L L E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterBRAILLEImage() adds values for the Braille format to +% the list of supported formats. The values include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterBRAILLEImage method is: +% +% size_t RegisterBRAILLEImage(void) +% +*/ +ModuleExport size_t RegisterBRAILLEImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("BRF"); + entry->encoder=(EncodeImageHandler *) WriteBRAILLEImage; + entry->adjoin=MagickFalse; + entry->description=AcquireString("BRF ASCII Braille format"); + entry->magick_module=AcquireString("BRAILLE"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("UBRL"); + entry->encoder=(EncodeImageHandler *) WriteBRAILLEImage; + entry->adjoin=MagickFalse; + entry->description=AcquireString("Unicode Text format"); + entry->magick_module=AcquireString("BRAILLE"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("UBRL6"); + entry->encoder=(EncodeImageHandler *) WriteBRAILLEImage; + entry->adjoin=MagickFalse; + entry->description=AcquireString("Unicode Text format 6dot"); + entry->magick_module=AcquireString("BRAILLE"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("ISOBRL"); + entry->encoder=(EncodeImageHandler *) WriteBRAILLEImage; + entry->adjoin=MagickFalse; + entry->description=AcquireString("ISO/TR 11548-1 format"); + entry->magick_module=AcquireString("BRAILLE"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("ISOBRL6"); + entry->encoder=(EncodeImageHandler *) WriteBRAILLEImage; + entry->adjoin=MagickFalse; + entry->description=AcquireString("ISO/TR 11548-1 format 6dot"); + entry->magick_module=AcquireString("BRAILLE"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r B R A I L L E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterBRAILLEImage() removes format registrations made by the +% BRAILLE module from the list of supported formats. +% +% The format of the UnregisterBRAILLEImage method is: +% +% UnregisterBRAILLEImage(void) +% +*/ +ModuleExport void UnregisterBRAILLEImage(void) +{ + (void) UnregisterMagickInfo("BRF"); + (void) UnregisterMagickInfo("UBRL"); + (void) UnregisterMagickInfo("UBRL6"); + (void) UnregisterMagickInfo("ISOBRL"); + (void) UnregisterMagickInfo("ISOBRL6"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e B R A I L L E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBRAILLEImage() writes an image to a file in the Braille format. +% +% The format of the WriteBRAILLEImage method is: +% +% MagickBooleanType WriteBRAILLEImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: The image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteBRAILLEImage(const ImageInfo *image_info, + Image *image) +{ +#define do_cell(dx,dy,bit) \ +{ \ + if (image->storage_class == PseudoClass) \ + cell|=(GetPixelIndex(indexes+x+dx+dy*image->columns) == polarity) << bit; \ + else \ + cell|=(GetPixelGreen(p+x+dx+dy*image->columns) == 0) << bit; \ +} + + char + buffer[MaxTextExtent]; + + const char + *value; + + IndexPacket + polarity; + + int + unicode = 0, + iso_11548_1 = 0; + + MagickBooleanType + status; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + size_t + cell_height = 4; + + ssize_t + y; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (LocaleCompare(image_info->magick,"UBRL") == 0) + unicode=1; + else + if (LocaleCompare(image_info->magick,"UBRL6") == 0) + { + unicode=1; + cell_height=3; + } + else + if (LocaleCompare(image_info->magick,"ISOBRL") == 0) + iso_11548_1=1; + else + if (LocaleCompare(image_info->magick,"ISOBRL6") == 0) + { + iso_11548_1=1; + cell_height=3; + } + else + cell_height=3; + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (!iso_11548_1) + { + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"Title: %s\n", value); + (void) WriteBlobString(image,buffer); + } + if (image->page.x != 0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"X: %.20g\n",(double) + image->page.x); + (void) WriteBlobString(image,buffer); + } + if (image->page.y != 0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"Y: %.20g\n",(double) + image->page.y); + (void) WriteBlobString(image,buffer); + } + (void) FormatLocaleString(buffer,MaxTextExtent,"Width: %.20g\n",(double) + (image->columns+(image->columns % 2))); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"Height: %.20g\n",(double) + image->rows); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"\n"); + } + (void) SetImageType(image,BilevelType); + polarity=0; + if (image->storage_class == PseudoClass) + { + polarity=(IndexPacket) (GetPixelLuma(image,&image->colormap[0]) >= + (QuantumRange/2.0)); + if (image->colors == 2) + polarity=(IndexPacket) (GetPixelLuma(image,&image->colormap[0]) >= + GetPixelLuma(image,&image->colormap[1])); + } + for (y=0; y < (ssize_t) image->rows; y+=(ssize_t) cell_height) + { + if ((y+cell_height) > image->rows) + cell_height = (size_t) (image->rows-y); + p=GetVirtualPixels(image,0,y,image->columns,cell_height,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x+=2) + { + MagickBooleanType + two_columns; + + unsigned char + cell = 0; + + two_columns=(x+1 < (ssize_t) image->columns) ? MagickTrue : MagickFalse; + do_cell(0,0,0) + if (two_columns != MagickFalse) + do_cell(1,0,3) + if (cell_height > 1) + { + do_cell(0,1,1) + if (two_columns != MagickFalse) + do_cell(1,1,4) + if (cell_height > 2) + { + do_cell(0,2,2) + if (two_columns != MagickFalse) + do_cell(1,2,5) + if (cell_height > 3) + { + do_cell(0,3,6) + if (two_columns != MagickFalse) + do_cell(1,3,7) + } + } + } + if (unicode != 0) + { + unsigned char + utf8[3]; + + /* + Unicode text. + */ + utf8[0]=(unsigned char) (0xe0 | ((0x28 >> 4) & 0x0f)); + utf8[1]=0x80 | ((0x28 << 2) & 0x3f) | (cell >> 6); + utf8[2]=0x80 | (cell & 0x3f); + (void) WriteBlob(image,3,utf8); + } + else if (iso_11548_1) + { + /* + ISO/TR 11548-1 binary. + */ + (void) WriteBlobByte(image,cell); + } + else + { + static const unsigned char + iso_to_brf[64] = + { + ' ', 'A', '1', 'B', '\'', 'K', '2', 'L', + '@', 'C', 'I', 'F', '/', 'M', 'S', 'P', + '"', 'E', '3', 'H', '9', 'O', '6', 'R', + '^', 'D', 'J', 'G', '>', 'N', 'T', 'Q', + ',', '*', '5', '<', '-', 'U', '8', 'V', + '.', '%', '[', '$', '+', 'X', '!', '&', + ';', ':', '4', '\\', '0', 'Z', '7', '(', + '_', '?', 'W', ']', '#', 'Y', ')', '=' + }; + + /* + BRF. + */ + (void) WriteBlobByte(image,iso_to_brf[cell]); + } + } + if (iso_11548_1 == 0) + (void) WriteBlobByte(image,'\n'); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/bytebuffer-private.h b/ImageMagick-6.9.12-44/coders/bytebuffer-private.h new file mode 100644 index 0000000..098d516 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/bytebuffer-private.h @@ -0,0 +1,128 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#ifndef MAGICK_BYTE_BUFFER_PRIVATE_H +#define MAGICK_BYTE_BUFFER_PRIVATE_H + +#include "magick/blob.h" + +typedef struct _MagickByteBuffer +{ + Image + *image; + + ssize_t + offset, + count; + + unsigned char + data[MagickMinBufferExtent]; +} MagickByteBuffer; + +static inline int PeekMagickByteBuffer(MagickByteBuffer *buffer) +{ + if ((buffer->offset == buffer->count) && (buffer->offset > 0)) + { + if (buffer->count != (ssize_t) sizeof(buffer->data)-1) + return(EOF); + buffer->offset=0; + buffer->count=0; + } + if ((buffer->offset == 0) && (buffer->count == 0)) + { + buffer->count=ReadBlob(buffer->image,sizeof(buffer->data)-1, + buffer->data); + if (buffer->count < 1) + return(EOF); + } + return((int) buffer->data[buffer->offset]); +} + +static inline int ReadMagickByteBuffer(MagickByteBuffer *buffer) +{ + int + result; + + result=PeekMagickByteBuffer(buffer); + if (result != EOF) + buffer->offset++; + return(result); +} + +static inline char *GetMagickByteBufferDatum(MagickByteBuffer *buffer) +{ + ssize_t + count, + i; + + if (buffer->offset != 0) + { + i=0; + while (buffer->offset < buffer->count) + buffer->data[i++]=buffer->data[buffer->offset++]; + count=ReadBlob(buffer->image,sizeof(buffer->data)-1-i,buffer->data+i); + buffer->count=i; + if (count > 0) + buffer->count+=count; + buffer->offset=0; + } + return((char *) buffer->data); +} + +static void CheckMagickByteBuffer(MagickByteBuffer *buffer, + const size_t length) +{ + if ((buffer->offset+length) > (ssize_t) sizeof(buffer->data)) + (void) GetMagickByteBufferDatum(buffer); +} + +static MagickBooleanType CompareMagickByteBuffer(MagickByteBuffer *buffer, + const char *p,const size_t length) +{ + const char + *q; + + CheckMagickByteBuffer(buffer,length); + q=(const char *) buffer->data+buffer->offset; + if (LocaleNCompare(p,q,length) != 0) + return(MagickFalse); + return(MagickTrue); +} + +static inline void SkipMagickByteBuffer(MagickByteBuffer *buffer, + const size_t length) +{ + CheckMagickByteBuffer(buffer,length); + if ((ssize_t) (buffer->offset+length) < buffer->count) + buffer->offset+=length; +} + +static inline MagickBooleanType SkipMagickByteBufferUntilNewline( + MagickByteBuffer *buffer) +{ + int + c; + + c=ReadMagickByteBuffer(buffer); + while ((c != '\n') && (c != '\r')) + { + c=ReadMagickByteBuffer(buffer); + if (c == EOF) + return(MagickFalse); + } + return(MagickTrue); +} + +#endif diff --git a/ImageMagick-6.9.12-44/coders/cals.c b/ImageMagick-6.9.12-44/coders/cals.c new file mode 100644 index 0000000..6eba79c --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/cals.c @@ -0,0 +1,588 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC AAA L SSSSS % +% C A A L SS % +% C AAAAA L SSS % +% C A A L SS % +% CCCC A A LLLLL SSSSS % +% % +% % +% Read/Write CALS Raster Group 1 Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% The CALS raster format is a standard developed by the Computer Aided +% Acquisition and Logistics Support (CALS) office of the United States +% Department of Defense to standardize graphics data interchange for +% electronic publishing, especially in the areas of technical graphics, +% CAD/CAM, and image processing applications. +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +#if defined(MAGICKCORE_TIFF_DELEGATE) +/* + Forward declarations. +*/ +static MagickBooleanType + WriteCALSImage(const ImageInfo *,Image *); +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s C A L S % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsCALS() returns MagickTrue if the image format type, identified by the +% magick string, is CALS Raster Group 1. +% +% The format of the IsCALS method is: +% +% MagickBooleanType IsCALS(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsCALS(const unsigned char *magick,const size_t length) +{ + if (length < 128) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"version: MIL-STD-1840",21) == 0) + return(MagickTrue); + if (LocaleNCompare((const char *) magick,"srcdocid:",9) == 0) + return(MagickTrue); + if (LocaleNCompare((const char *) magick,"rorient:",8) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d C A L S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadCALSImage() reads an CALS Raster Group 1 image format image file and +% returns it. It allocates the memory necessary for the new Image structure +% and returns a pointer to the new image. +% +% The format of the ReadCALSImage method is: +% +% Image *ReadCALSImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadCALSImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + char + filename[MaxTextExtent], + header[129], + message[MaxTextExtent]; + + FILE + *file; + + Image + *image; + + ImageInfo + *read_info; + + int + c, + unique_file; + + MagickBooleanType + status; + + ssize_t + i; + + unsigned long + density, + direction, + height, + orientation, + pel_path, + type, + width; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read CALS header. + */ + (void) memset(header,0,sizeof(header)); + density=0; + direction=0; + orientation=1; + pel_path=0; + type=1; + width=0; + height=0; + for (i=0; i < 16; i++) + { + if (ReadBlob(image,128,(unsigned char *) header) != 128) + break; + switch (*header) + { + case 'R': + case 'r': + { + if (LocaleNCompare(header,"rdensty:",8) == 0) + { + (void) sscanf(header+8,"%lu",&density); + break; + } + if (LocaleNCompare(header,"rpelcnt:",8) == 0) + { + (void) sscanf(header+8,"%lu,%lu",&width,&height); + break; + } + if (LocaleNCompare(header,"rorient:",8) == 0) + { + (void) sscanf(header+8,"%lu,%lu",&pel_path,&direction); + if (pel_path == 90) + orientation=5; + else + if (pel_path == 180) + orientation=3; + else + if (pel_path == 270) + orientation=7; + if (direction == 90) + orientation++; + break; + } + if (LocaleNCompare(header,"rtype:",6) == 0) + { + (void) sscanf(header+6,"%lu",&type); + break; + } + break; + } + } + } + /* + Read CALS pixels. + */ + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(filename); + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + ThrowImageException(FileOpenError,"UnableToCreateTemporaryFile"); + while ((c=ReadBlobByte(image)) != EOF) + if (fputc(c,file) != c) + break; + (void) fclose(file); + (void) CloseBlob(image); + image=DestroyImage(image); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) FormatLocaleString(read_info->filename,MaxTextExtent,"group4:%s", + filename); + (void) FormatLocaleString(message,MaxTextExtent,"%lux%lu",width,height); + read_info->size=ConstantString(message); + (void) FormatLocaleString(message,MaxTextExtent,"%lu",density); + read_info->density=ConstantString(message); + read_info->orientation=(OrientationType) orientation; + image=ReadImage(read_info,exception); + if (image != (Image *) NULL) + { + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick_filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick,"CALS",MaxTextExtent); + } + read_info=DestroyImageInfo(read_info); + (void) RelinquishUniqueFileResource(filename); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r C A L S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterCALSImage() adds attributes for the CALS Raster Group 1 image file +% image format to the list of supported formats. The attributes include the +% image format tag, a method to read and/or write the format, whether the +% format supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief description +% of the format. +% +% The format of the RegisterCALSImage method is: +% +% size_t RegisterCALSImage(void) +% +*/ +ModuleExport size_t RegisterCALSImage(void) +{ + MagickInfo + *entry; + + static const char + *CALSDescription= + { + "Continuous Acquisition and Life-cycle Support Type 1" + }, + *CALSNote= + { + "Specified in MIL-R-28002 and MIL-PRF-28002" + }; + + entry=SetMagickInfo("CAL"); + entry->decoder=(DecodeImageHandler *) ReadCALSImage; +#if defined(MAGICKCORE_TIFF_DELEGATE) + entry->encoder=(EncodeImageHandler *) WriteCALSImage; +#endif + entry->adjoin=MagickFalse; + entry->magick=(IsImageFormatHandler *) IsCALS; + entry->description=ConstantString(CALSDescription); + entry->note=ConstantString(CALSNote); + entry->magick_module=ConstantString("CALS"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("CALS"); + entry->decoder=(DecodeImageHandler *) ReadCALSImage; +#if defined(MAGICKCORE_TIFF_DELEGATE) + entry->encoder=(EncodeImageHandler *) WriteCALSImage; +#endif + entry->adjoin=MagickFalse; + entry->magick=(IsImageFormatHandler *) IsCALS; + entry->description=ConstantString(CALSDescription); + entry->note=ConstantString(CALSNote); + entry->magick_module=ConstantString("CALS"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r C A L S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterCALSImage() removes format registrations made by the +% CALS module from the list of supported formats. +% +% The format of the UnregisterCALSImage method is: +% +% UnregisterCALSImage(void) +% +*/ +ModuleExport void UnregisterCALSImage(void) +{ + (void) UnregisterMagickInfo("CAL"); + (void) UnregisterMagickInfo("CALS"); +} + +#if defined(MAGICKCORE_TIFF_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e C A L S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteCALSImage() writes an image to a file in CALS Raster Group 1 image +% format. +% +% The format of the WriteCALSImage method is: +% +% MagickBooleanType WriteCALSImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static ssize_t WriteCALSRecord(Image *image,const char *data) +{ + char + pad[128]; + + const char + *p; + + ssize_t + i; + + ssize_t + count; + + i=0; + count=0; + if (data != (const char *) NULL) + { + p=data; + for (i=0; (i < 128) && (p[i] != '\0'); i++); + count=WriteBlob(image,(size_t) i,(const unsigned char *) data); + } + if (i < 128) + { + i=128-i; + (void) memset(pad,' ',(size_t) i); + count=WriteBlob(image,(size_t) i,(const unsigned char *) pad); + } + return(count); +} + +static MagickBooleanType WriteCALSImage(const ImageInfo *image_info, + Image *image) +{ + char + header[MaxTextExtent]; + + Image + *group4_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + ssize_t + i; + + size_t + density, + length, + orient_x, + orient_y; + + ssize_t + count; + + unsigned char + *group4; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + /* + Create standard CALS header. + */ + count=WriteCALSRecord(image,"srcdocid: NONE"); + (void) count; + count=WriteCALSRecord(image,"dstdocid: NONE"); + count=WriteCALSRecord(image,"txtfilid: NONE"); + count=WriteCALSRecord(image,"figid: NONE"); + count=WriteCALSRecord(image,"srcgph: NONE"); + count=WriteCALSRecord(image,"doccls: NONE"); + count=WriteCALSRecord(image,"rtype: 1"); + orient_x=0; + orient_y=0; + switch (image->orientation) + { + case TopRightOrientation: + { + orient_x=180; + orient_y=270; + break; + } + case BottomRightOrientation: + { + orient_x=180; + orient_y=90; + break; + } + case BottomLeftOrientation: + { + orient_y=90; + break; + } + case LeftTopOrientation: + { + orient_x=270; + break; + } + case RightTopOrientation: + { + orient_x=270; + orient_y=180; + break; + } + case RightBottomOrientation: + { + orient_x=90; + orient_y=180; + break; + } + case LeftBottomOrientation: + { + orient_x=90; + break; + } + default: + { + orient_y=270; + break; + } + } + (void) FormatLocaleString(header,sizeof(header),"rorient: %03ld,%03ld", + (long) orient_x,(long) orient_y); + count=WriteCALSRecord(image,header); + (void) FormatLocaleString(header,sizeof(header),"rpelcnt: %06lu,%06lu", + (unsigned long) image->columns,(unsigned long) image->rows); + count=WriteCALSRecord(image,header); + density=200; + if (image_info->density != (char *) NULL) + { + GeometryInfo + geometry_info; + + (void) ParseGeometry(image_info->density,&geometry_info); + density=(size_t) floor(geometry_info.rho+0.5); + } + (void) FormatLocaleString(header,sizeof(header),"rdensty: %04lu", + (unsigned long) density); + count=WriteCALSRecord(image,header); + count=WriteCALSRecord(image,"notes: NONE"); + (void) memset(header,' ',128); + for (i=0; i < 5; i++) + (void) WriteBlob(image,128,(unsigned char *) header); + /* + Write CALS pixels. + */ + write_info=CloneImageInfo(image_info); + (void) CopyMagickString(write_info->filename,"GROUP4:",MaxTextExtent); + (void) CopyMagickString(write_info->magick,"GROUP4",MaxTextExtent); + group4_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (group4_image == (Image *) NULL) + { + write_info=DestroyImageInfo(write_info); + (void) CloseBlob(image); + return(MagickFalse); + } + group4=(unsigned char *) ImageToBlob(write_info,group4_image,&length, + &image->exception); + group4_image=DestroyImage(group4_image); + if (group4 == (unsigned char *) NULL) + { + write_info=DestroyImageInfo(write_info); + (void) CloseBlob(image); + return(MagickFalse); + } + write_info=DestroyImageInfo(write_info); + if (WriteBlob(image,length,group4) != (ssize_t) length) + status=MagickFalse; + group4=(unsigned char *) RelinquishMagickMemory(group4); + (void) CloseBlob(image); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/caption.c b/ImageMagick-6.9.12-44/coders/caption.c new file mode 100644 index 0000000..bd1ba1c --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/caption.c @@ -0,0 +1,402 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC AAA PPPP TTTTT IIIII OOO N N % +% C A A P P T I O O NN N % +% C AAAAA PPPP T I O O N N N % +% C A A P T I O O N NN % +% CCCC A A P T IIIII OOO N N % +% % +% % +% Read Text Caption. % +% % +% Software Design % +% Cristy % +% February 2002 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/annotate.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/composite-private.h" +#include "magick/draw.h" +#include "magick/draw-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/utility.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d C A P T I O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadCAPTIONImage() reads a CAPTION image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadCAPTIONImage method is: +% +% Image *ReadCAPTIONImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline void AdjustTypeMetricBounds(TypeMetric *metrics) +{ + if (metrics->bounds.x1 >= 0.0) + metrics->bounds.x1=0.0; + else + { + double x1 = ceil(-metrics->bounds.x1+0.5); + metrics->width+=x1+x1; + metrics->bounds.x1=x1; + } +} + +static Image *ReadCAPTIONImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + char + *caption, + geometry[MaxTextExtent], + lines[MaxTextExtent], + *text; + + const char + *gravity, + *option; + + DrawInfo + *draw_info; + + Image + *image; + + MagickBooleanType + split, + status; + + ssize_t + i; + + size_t + height, + width; + + TypeMetric + metrics; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + (void) ResetImagePage(image,"0x0+0+0"); + if ((image->columns != 0) && (image->rows != 0)) + (void) SetImageBackgroundColor(image); + /* + Format caption. + */ + option=GetImageOption(image_info,"filename"); + if (option == (const char *) NULL) + caption=InterpretImageProperties(image_info,image,image_info->filename); + else + if (LocaleNCompare(option,"caption:",8) == 0) + caption=InterpretImageProperties(image_info,image,option+8); + else + caption=InterpretImageProperties(image_info,image,option); + if (caption == (char *) NULL) + return(DestroyImageList(image)); + (void) SetImageProperty(image,"caption",caption); + draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL); + width=(size_t) floor(draw_info->pointsize*strlen(caption)+0.5); + if (AcquireMagickResource(WidthResource,width) == MagickFalse) + { + caption=DestroyString(caption); + draw_info=DestroyDrawInfo(draw_info); + ThrowReaderException(ImageError,"WidthOrHeightExceedsLimit"); + } + (void) CloneString(&draw_info->text,caption); + gravity=GetImageOption(image_info,"gravity"); + if (gravity != (char *) NULL) + draw_info->gravity=(GravityType) ParseCommandOption(MagickGravityOptions, + MagickFalse,gravity); + split=IsStringTrue(GetImageOption(image_info,"caption:split")); + status=MagickTrue; + (void) memset(&metrics,0,sizeof(metrics)); + if (image->columns == 0) + { + text=AcquireString(caption); + i=FormatMagickCaption(image,draw_info,split,&metrics,&text); + AdjustTypeMetricBounds(&metrics); + (void) CloneString(&draw_info->text,text); + text=DestroyString(text); + (void) FormatLocaleString(geometry,MaxTextExtent,"%+g%+g", + -metrics.bounds.x1,metrics.ascent); + if (draw_info->gravity == UndefinedGravity) + (void) CloneString(&draw_info->geometry,geometry); + status=GetMultilineTypeMetrics(image,draw_info,&metrics); + AdjustTypeMetricBounds(&metrics); + image->columns=(size_t) floor(metrics.width+draw_info->stroke_width+0.5); + } + if (image->rows == 0) + { + split=MagickTrue; + text=AcquireString(caption); + i=FormatMagickCaption(image,draw_info,split,&metrics,&text); + AdjustTypeMetricBounds(&metrics); + (void) CloneString(&draw_info->text,text); + text=DestroyString(text); + (void) FormatLocaleString(geometry,MaxTextExtent,"%+g%+g", + -metrics.bounds.x1,metrics.ascent); + if (draw_info->gravity == UndefinedGravity) + (void) CloneString(&draw_info->geometry,geometry); + status=GetMultilineTypeMetrics(image,draw_info,&metrics); + AdjustTypeMetricBounds(&metrics); + image->rows=(size_t) ((i+1)*(metrics.ascent-metrics.descent+ + draw_info->interline_spacing+draw_info->stroke_width)+0.5); + } + if (status != MagickFalse) + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + caption=DestroyString(caption); + draw_info=DestroyDrawInfo(draw_info); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (SetImageBackgroundColor(image) == MagickFalse) + { + caption=DestroyString(caption); + draw_info=DestroyDrawInfo(draw_info); + InheritException(exception,&image->exception); + image=DestroyImageList(image); + return((Image *) NULL); + } + if ((fabs(image_info->pointsize) < MagickEpsilon) && (strlen(caption) > 0)) + { + double + high, + low; + + ssize_t + n; + + /* + Auto fit text into bounding box. + */ + for (n=0; n < 32; n++, draw_info->pointsize*=2.0) + { + text=AcquireString(caption); + i=FormatMagickCaption(image,draw_info,split,&metrics,&text); + AdjustTypeMetricBounds(&metrics); + (void) CloneString(&draw_info->text,text); + text=DestroyString(text); + (void) FormatLocaleString(geometry,MaxTextExtent,"%+g%+g", + -metrics.bounds.x1,metrics.ascent); + if (draw_info->gravity == UndefinedGravity) + (void) CloneString(&draw_info->geometry,geometry); + status=GetMultilineTypeMetrics(image,draw_info,&metrics); + AdjustTypeMetricBounds(&metrics); + if (status == MagickFalse) + break; + width=(size_t) floor(metrics.width+draw_info->stroke_width+0.5); + height=(size_t) floor(metrics.height+draw_info->interline_spacing+ + draw_info->stroke_width+0.5); + if ((image->columns != 0) && (image->rows != 0)) + { + if ((width >= image->columns) || (height >= image->rows)) + break; + } + else + if (((image->columns != 0) && (width >= image->columns)) || + ((image->rows != 0) && (height >= image->rows))) + break; + } + high=draw_info->pointsize; + for (low=1.0; (high-low) > 0.5; ) + { + draw_info->pointsize=(low+high)/2.0; + text=AcquireString(caption); + i=FormatMagickCaption(image,draw_info,split,&metrics,&text); + AdjustTypeMetricBounds(&metrics); + (void) CloneString(&draw_info->text,text); + text=DestroyString(text); + (void) FormatLocaleString(geometry,MaxTextExtent,"%+g%+g", + -metrics.bounds.x1,metrics.ascent); + if (draw_info->gravity == UndefinedGravity) + (void) CloneString(&draw_info->geometry,geometry); + status=GetMultilineTypeMetrics(image,draw_info,&metrics); + AdjustTypeMetricBounds(&metrics); + if (status == MagickFalse) + break; + width=(size_t) floor(metrics.width+draw_info->stroke_width+0.5); + height=(size_t) floor(metrics.height+draw_info->interline_spacing+ + draw_info->stroke_width+0.5); + if ((image->columns != 0) && (image->rows != 0)) + { + if ((width < image->columns) && (height < image->rows)) + low=draw_info->pointsize+0.5; + else + high=draw_info->pointsize-0.5; + } + else + if (((image->columns != 0) && (width < image->columns)) || + ((image->rows != 0) && (height < image->rows))) + low=draw_info->pointsize+0.5; + else + high=draw_info->pointsize-0.5; + } + draw_info->pointsize=floor((low+high)/2.0-0.5); + } + /* + Draw caption. + */ + i=FormatMagickCaption(image,draw_info,split,&metrics,&caption); + AdjustTypeMetricBounds(&metrics); + (void) CloneString(&draw_info->text,caption); + caption=DestroyString(caption); + (void) FormatLocaleString(geometry,MagickPathExtent,"%+g%+g", + (draw_info->direction == RightToLeftDirection ? (double) image->columns- + metrics.bounds.x2 : metrics.bounds.x1),(draw_info->gravity == + UndefinedGravity ? MagickMax(metrics.ascent,metrics.bounds.y2) : 0.0)); + (void) CloneString(&draw_info->geometry,geometry); + status=AnnotateImage(image,draw_info); + if (image_info->pointsize == 0.0) + { + char + pointsize[MaxTextExtent]; + + (void) FormatLocaleString(pointsize,MaxTextExtent,"%.20g", + draw_info->pointsize); + (void) SetImageProperty(image,"caption:pointsize",pointsize); + } + (void) FormatLocaleString(lines,MaxTextExtent,"%.20g",((double) i+1)); + (void) SetImageProperty(image,"caption:lines",lines); + draw_info=DestroyDrawInfo(draw_info); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r C A P T I O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterCAPTIONImage() adds attributes for the CAPTION image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterCAPTIONImage method is: +% +% size_t RegisterCAPTIONImage(void) +% +*/ +ModuleExport size_t RegisterCAPTIONImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("CAPTION"); + entry->decoder=(DecodeImageHandler *) ReadCAPTIONImage; + entry->description=ConstantString("Caption"); + entry->adjoin=MagickFalse; + entry->magick_module=ConstantString("CAPTION"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r C A P T I O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterCAPTIONImage() removes format registrations made by the +% CAPTION module from the list of supported formats. +% +% The format of the UnregisterCAPTIONImage method is: +% +% UnregisterCAPTIONImage(void) +% +*/ +ModuleExport void UnregisterCAPTIONImage(void) +{ + (void) UnregisterMagickInfo("CAPTION"); +} diff --git a/ImageMagick-6.9.12-44/coders/cin.c b/ImageMagick-6.9.12-44/coders/cin.c new file mode 100644 index 0000000..13e3cfe --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/cin.c @@ -0,0 +1,1231 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC IIIII N N % +% C I NN N % +% C I N N N % +% C I N NN % +% CCCC IIIII N N % +% % +% % +% Read/Write Kodak Cineon Image Format % +% Cineon Image Format is a subset of SMTPE CIN % +% % +% % +% Software Design % +% Cristy % +% Kelly Bergougnoux % +% October 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Cineon image file format draft is available at +% http://www.cineon.com/ff_draft.php. +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/timer-private.h" + +/* + Typedef declaration. +*/ +typedef struct _CINDataFormatInfo +{ + unsigned char + interleave, + packing, + sign, + sense; + + size_t + line_pad, + channel_pad; + + unsigned char + reserve[20]; +} CINDataFormatInfo; + +typedef struct _CINFileInfo +{ + size_t + magic, + image_offset, + generic_length, + industry_length, + user_length, + file_size; + + char + version[8], + filename[100], + create_date[12], + create_time[12], + reserve[36]; +} CINFileInfo; + +typedef struct _CINFilmInfo +{ + char + id, + type, + offset, + reserve1; + + size_t + prefix, + count; + + char + format[32]; + + size_t + frame_position; + + float + frame_rate; + + char + frame_id[32], + slate_info[200], + reserve[740]; +} CINFilmInfo; + +typedef struct _CINImageChannel +{ + unsigned char + designator[2], + bits_per_pixel, + reserve; + + size_t + pixels_per_line, + lines_per_image; + + float + min_data, + min_quantity, + max_data, + max_quantity; +} CINImageChannel; + +typedef struct _CINImageInfo +{ + unsigned char + orientation, + number_channels, + reserve1[2]; + + CINImageChannel + channel[8]; + + float + white_point[2], + red_primary_chromaticity[2], + green_primary_chromaticity[2], + blue_primary_chromaticity[2]; + + char + label[200], + reserve[28]; +} CINImageInfo; + +typedef struct _CINOriginationInfo +{ + ssize_t + x_offset, + y_offset; + + char + filename[100], + create_date[12], + create_time[12], + device[64], + model[32], + serial[32]; + + float + x_pitch, + y_pitch, + gamma; + + char + reserve[40]; +} CINOriginationInfo; + +typedef struct _CINUserInfo +{ + char + id[32]; +} CINUserInfo; + +typedef struct CINInfo +{ + CINFileInfo + file; + + CINImageInfo + image; + + CINDataFormatInfo + data_format; + + CINOriginationInfo + origination; + + CINFilmInfo + film; + + CINUserInfo + user; +} CINInfo; + +/* + Forward declaractions. +*/ +static MagickBooleanType + WriteCINImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s C I N E O N % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsCIN() returns MagickTrue if the image format type, identified by the magick +% string, is CIN. +% +% The format of the IsCIN method is: +% +% MagickBooleanType IsCIN(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsCIN(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\200\052\137\327",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d C I N E O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadCINImage() reads an CIN X image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a point to the +% new image. +% +% The format of the ReadCINImage method is: +% +% Image *ReadCINImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static size_t GetBytesPerRow(size_t columns, + size_t samples_per_pixel,size_t bits_per_pixel, + MagickBooleanType pad) +{ + size_t + bytes_per_row; + + switch (bits_per_pixel) + { + case 1: + { + bytes_per_row=4*(((size_t) samples_per_pixel*columns* + bits_per_pixel+31)/32); + break; + } + case 8: + default: + { + bytes_per_row=4*(((size_t) samples_per_pixel*columns* + bits_per_pixel+31)/32); + break; + } + case 10: + { + if (pad == MagickFalse) + { + bytes_per_row=4*(((size_t) samples_per_pixel*columns* + bits_per_pixel+31)/32); + break; + } + bytes_per_row=4*(((size_t) (32*((samples_per_pixel*columns+2)/3))+31)/32); + break; + } + case 12: + { + if (pad == MagickFalse) + { + bytes_per_row=4*(((size_t) samples_per_pixel*columns* + bits_per_pixel+31)/32); + break; + } + bytes_per_row=2*(((size_t) (16*samples_per_pixel*columns)+15)/16); + break; + } + case 16: + { + bytes_per_row=2*(((size_t) samples_per_pixel*columns* + bits_per_pixel+8)/16); + break; + } + case 32: + { + bytes_per_row=4*(((size_t) samples_per_pixel*columns* + bits_per_pixel+31)/32); + break; + } + case 64: + { + bytes_per_row=8*(((size_t) samples_per_pixel*columns* + bits_per_pixel+63)/64); + break; + } + } + return(bytes_per_row); +} + +static inline MagickBooleanType IsFloatDefined(const float value) +{ + union + { + unsigned int + unsigned_value; + + double + float_value; + } quantum; + + quantum.unsigned_value=0U; + quantum.float_value=value; + if (quantum.unsigned_value == 0U) + return(MagickFalse); + return(MagickTrue); +} + +static Image *ReadCINImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define MonoColorType 1 +#define RGBColorType 3 + + char + property[MaxTextExtent]; + + CINInfo + cin; + + Image + *image; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + i; + + PixelPacket + *q; + + size_t + extent, + length; + + ssize_t + count, + y; + + unsigned char + magick[4], + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + File information. + */ + offset=0; + count=ReadBlob(image,4,magick); + offset+=count; + if ((count != 4) || + ((LocaleNCompare((char *) magick,"\200\052\137\327",4) != 0))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + memset(&cin,0,sizeof(cin)); + image->endian=(magick[0] == 0x80) && (magick[1] == 0x2a) && + (magick[2] == 0x5f) && (magick[3] == 0xd7) ? MSBEndian : LSBEndian; + cin.file.image_offset=ReadBlobLong(image); + if (cin.file.image_offset < 712) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + offset+=4; + cin.file.generic_length=ReadBlobLong(image); + offset+=4; + cin.file.industry_length=ReadBlobLong(image); + offset+=4; + cin.file.user_length=ReadBlobLong(image); + offset+=4; + cin.file.file_size=ReadBlobLong(image); + offset+=4; + offset+=ReadBlob(image,sizeof(cin.file.version),(unsigned char *) + cin.file.version); + (void) CopyMagickString(property,cin.file.version,sizeof(cin.file.version)); + (void) SetImageProperty(image,"dpx:file.version",property); + offset+=ReadBlob(image,sizeof(cin.file.filename),(unsigned char *) + cin.file.filename); + (void) CopyMagickString(property,cin.file.filename,sizeof(cin.file.filename)); + (void) SetImageProperty(image,"dpx:file.filename",property); + offset+=ReadBlob(image,sizeof(cin.file.create_date),(unsigned char *) + cin.file.create_date); + (void) CopyMagickString(property,cin.file.create_date, + sizeof(cin.file.create_date)); + (void) SetImageProperty(image,"dpx:file.create_date",property); + offset+=ReadBlob(image,sizeof(cin.file.create_time),(unsigned char *) + cin.file.create_time); + (void) CopyMagickString(property,cin.file.create_time, + sizeof(cin.file.create_time)); + (void) SetImageProperty(image,"dpx:file.create_time",property); + offset+=ReadBlob(image,sizeof(cin.file.reserve),(unsigned char *) + cin.file.reserve); + /* + Image information. + */ + cin.image.orientation=(unsigned char) ReadBlobByte(image); + offset++; + if (cin.image.orientation != (unsigned char) (~0)) + (void) FormatImageProperty(image,"dpx:image.orientation","%d", + cin.image.orientation); + switch (cin.image.orientation) + { + default: + case 0: image->orientation=TopLeftOrientation; break; + case 1: image->orientation=TopRightOrientation; break; + case 2: image->orientation=BottomLeftOrientation; break; + case 3: image->orientation=BottomRightOrientation; break; + case 4: image->orientation=LeftTopOrientation; break; + case 5: image->orientation=RightTopOrientation; break; + case 6: image->orientation=LeftBottomOrientation; break; + case 7: image->orientation=RightBottomOrientation; break; + } + cin.image.number_channels=(unsigned char) ReadBlobByte(image); + offset++; + offset+=ReadBlob(image,sizeof(cin.image.reserve1),(unsigned char *) + cin.image.reserve1); + for (i=0; i < 8; i++) + { + cin.image.channel[i].designator[0]=(unsigned char) ReadBlobByte(image); + offset++; + cin.image.channel[i].designator[1]=(unsigned char) ReadBlobByte(image); + offset++; + cin.image.channel[i].bits_per_pixel=(unsigned char) ReadBlobByte(image); + offset++; + cin.image.channel[i].reserve=(unsigned char) ReadBlobByte(image); + offset++; + cin.image.channel[i].pixels_per_line=ReadBlobLong(image); + offset+=4; + cin.image.channel[i].lines_per_image=ReadBlobLong(image); + offset+=4; + cin.image.channel[i].min_data=ReadBlobFloat(image); + offset+=4; + cin.image.channel[i].min_quantity=ReadBlobFloat(image); + offset+=4; + cin.image.channel[i].max_data=ReadBlobFloat(image); + offset+=4; + cin.image.channel[i].max_quantity=ReadBlobFloat(image); + offset+=4; + } + cin.image.white_point[0]=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(cin.image.white_point[0]) != MagickFalse) + image->chromaticity.white_point.x=cin.image.white_point[0]; + cin.image.white_point[1]=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(cin.image.white_point[1]) != MagickFalse) + image->chromaticity.white_point.y=cin.image.white_point[1]; + cin.image.red_primary_chromaticity[0]=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(cin.image.red_primary_chromaticity[0]) != MagickFalse) + image->chromaticity.red_primary.x=cin.image.red_primary_chromaticity[0]; + cin.image.red_primary_chromaticity[1]=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(cin.image.red_primary_chromaticity[1]) != MagickFalse) + image->chromaticity.red_primary.y=cin.image.red_primary_chromaticity[1]; + cin.image.green_primary_chromaticity[0]=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(cin.image.green_primary_chromaticity[0]) != MagickFalse) + image->chromaticity.red_primary.x=cin.image.green_primary_chromaticity[0]; + cin.image.green_primary_chromaticity[1]=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(cin.image.green_primary_chromaticity[1]) != MagickFalse) + image->chromaticity.green_primary.y=cin.image.green_primary_chromaticity[1]; + cin.image.blue_primary_chromaticity[0]=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(cin.image.blue_primary_chromaticity[0]) != MagickFalse) + image->chromaticity.blue_primary.x=cin.image.blue_primary_chromaticity[0]; + cin.image.blue_primary_chromaticity[1]=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(cin.image.blue_primary_chromaticity[1]) != MagickFalse) + image->chromaticity.blue_primary.y=cin.image.blue_primary_chromaticity[1]; + offset+=ReadBlob(image,sizeof(cin.image.label),(unsigned char *) + cin.image.label); + (void) CopyMagickString(property,cin.image.label,sizeof(cin.image.label)); + (void) SetImageProperty(image,"dpx:image.label",property); + offset+=ReadBlob(image,sizeof(cin.image.reserve),(unsigned char *) + cin.image.reserve); + /* + Image data format information. + */ + cin.data_format.interleave=(unsigned char) ReadBlobByte(image); + offset++; + cin.data_format.packing=(unsigned char) ReadBlobByte(image); + offset++; + cin.data_format.sign=(unsigned char) ReadBlobByte(image); + offset++; + cin.data_format.sense=(unsigned char) ReadBlobByte(image); + offset++; + cin.data_format.line_pad=ReadBlobLong(image); + offset+=4; + cin.data_format.channel_pad=ReadBlobLong(image); + offset+=4; + offset+=ReadBlob(image,sizeof(cin.data_format.reserve),(unsigned char *) + cin.data_format.reserve); + /* + Image origination information. + */ + cin.origination.x_offset=ReadBlobSignedLong(image); + offset+=4; + if ((size_t) cin.origination.x_offset != ~0UL) + (void) FormatImageProperty(image,"dpx:origination.x_offset","%.20g", + (double) cin.origination.x_offset); + cin.origination.y_offset=(ssize_t) ReadBlobLong(image); + offset+=4; + if ((size_t) cin.origination.y_offset != ~0UL) + (void) FormatImageProperty(image,"dpx:origination.y_offset","%.20g", + (double) cin.origination.y_offset); + offset+=ReadBlob(image,sizeof(cin.origination.filename),(unsigned char *) + cin.origination.filename); + (void) CopyMagickString(property,cin.origination.filename, + sizeof(cin.origination.filename)); + (void) SetImageProperty(image,"dpx:origination.filename",property); + offset+=ReadBlob(image,sizeof(cin.origination.create_date),(unsigned char *) + cin.origination.create_date); + (void) CopyMagickString(property,cin.origination.create_date, + sizeof(cin.origination.create_date)); + (void) SetImageProperty(image,"dpx:origination.create_date",property); + offset+=ReadBlob(image,sizeof(cin.origination.create_time),(unsigned char *) + cin.origination.create_time); + (void) CopyMagickString(property,cin.origination.create_time, + sizeof(cin.origination.create_time)); + (void) SetImageProperty(image,"dpx:origination.create_time",property); + offset+=ReadBlob(image,sizeof(cin.origination.device),(unsigned char *) + cin.origination.device); + (void) CopyMagickString(property,cin.origination.device, + sizeof(cin.origination.device)); + (void) SetImageProperty(image,"dpx:origination.device",property); + offset+=ReadBlob(image,sizeof(cin.origination.model),(unsigned char *) + cin.origination.model); + (void) CopyMagickString(property,cin.origination.model, + sizeof(cin.origination.model)); + (void) SetImageProperty(image,"dpx:origination.model",property); + (void) memset(cin.origination.serial,0, + sizeof(cin.origination.serial)); + offset+=ReadBlob(image,sizeof(cin.origination.serial),(unsigned char *) + cin.origination.serial); + (void) CopyMagickString(property,cin.origination.serial, + sizeof(cin.origination.serial)); + (void) SetImageProperty(image,"dpx:origination.serial",property); + cin.origination.x_pitch=ReadBlobFloat(image); + offset+=4; + cin.origination.y_pitch=ReadBlobFloat(image); + offset+=4; + cin.origination.gamma=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(cin.origination.gamma) != MagickFalse) + image->gamma=cin.origination.gamma; + offset+=ReadBlob(image,sizeof(cin.origination.reserve),(unsigned char *) + cin.origination.reserve); + if ((cin.file.image_offset > 2048) && (cin.file.user_length != 0)) + { + int + c; + + /* + Image film information. + */ + cin.film.id=ReadBlobByte(image); + offset++; + c=cin.film.id; + if (c != ~0) + (void) FormatImageProperty(image,"dpx:film.id","%d",cin.film.id); + cin.film.type=ReadBlobByte(image); + offset++; + c=cin.film.type; + if (c != ~0) + (void) FormatImageProperty(image,"dpx:film.type","%d",cin.film.type); + cin.film.offset=ReadBlobByte(image); + offset++; + c=cin.film.offset; + if (c != ~0) + (void) FormatImageProperty(image,"dpx:film.offset","%d", + cin.film.offset); + cin.film.reserve1=ReadBlobByte(image); + offset++; + cin.film.prefix=ReadBlobLong(image); + offset+=4; + if (cin.film.prefix != ~0UL) + (void) FormatImageProperty(image,"dpx:film.prefix","%.20g",(double) + cin.film.prefix); + cin.film.count=ReadBlobLong(image); + offset+=4; + offset+=ReadBlob(image,sizeof(cin.film.format),(unsigned char *) + cin.film.format); + (void) CopyMagickString(property,cin.film.format, + sizeof(cin.film.format)); + (void) SetImageProperty(image,"dpx:film.format",property); + cin.film.frame_position=ReadBlobLong(image); + offset+=4; + if (cin.film.frame_position != ~0UL) + (void) FormatImageProperty(image,"dpx:film.frame_position","%.20g", + (double) cin.film.frame_position); + cin.film.frame_rate=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(cin.film.frame_rate) != MagickFalse) + (void) FormatImageProperty(image,"dpx:film.frame_rate","%g", + cin.film.frame_rate); + offset+=ReadBlob(image,sizeof(cin.film.frame_id),(unsigned char *) + cin.film.frame_id); + (void) CopyMagickString(property,cin.film.frame_id, + sizeof(cin.film.frame_id)); + (void) SetImageProperty(image,"dpx:film.frame_id",property); + offset+=ReadBlob(image,sizeof(cin.film.slate_info),(unsigned char *) + cin.film.slate_info); + (void) CopyMagickString(property,cin.film.slate_info, + sizeof(cin.film.slate_info)); + (void) SetImageProperty(image,"dpx:film.slate_info",property); + offset+=ReadBlob(image,sizeof(cin.film.reserve),(unsigned char *) + cin.film.reserve); + } + if ((cin.file.image_offset > 2048) && (cin.file.user_length != 0)) + { + StringInfo + *profile; + + /* + User defined data. + */ + if (cin.file.user_length > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + profile=BlobToStringInfo((const void *) NULL,cin.file.user_length); + if (profile == (StringInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + offset+=ReadBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + (void) SetImageProfile(image,"dpx:user.data",profile); + profile=DestroyStringInfo(profile); + } + image->depth=cin.image.channel[0].bits_per_pixel; + image->columns=cin.image.channel[0].pixels_per_line; + image->rows=cin.image.channel[0].lines_per_image; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(image); + } + if (((MagickSizeType) image->columns*image->rows/8) > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + for ( ; offset < (MagickOffsetType) cin.file.image_offset; offset++) + { + int + c; + + c=ReadBlobByte(image); + if (c == EOF) + break; + } + if (offset < (MagickOffsetType) cin.file.image_offset) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) SetImageBackgroundColor(image); + /* + Convert CIN raster image to pixel packets. + */ + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + SetQuantumQuantum(quantum_info,32); + SetQuantumPack(quantum_info,MagickFalse); + quantum_type=RGBQuantum; + extent=GetQuantumExtent(image,quantum_info,quantum_type); + (void) extent; + length=GetBytesPerRow(image->columns,3,image->depth,MagickTrue); + if (cin.image.number_channels == 1) + { + quantum_type=GrayQuantum; + length=GetBytesPerRow(image->columns,1,image->depth,MagickTrue); + } + status=SetQuantumPad(image,quantum_info,0); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + const void + *stream; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + SetQuantumImageType(image,quantum_type); + quantum_info=DestroyQuantumInfo(quantum_info); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + SetImageColorspace(image,LogColorspace); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r C I N E O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterCINImage() adds attributes for the CIN image format to the list of +% of supported formats. The attributes include the image format tag, a method +% to read and/or write the format, whether the format supports the saving of +% more than one frame to the same file or blob, whether the format supports +% native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterCINImage method is: +% +% size_t RegisterCINImage(void) +% +*/ +ModuleExport size_t RegisterCINImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("CIN"); + entry->decoder=(DecodeImageHandler *) ReadCINImage; + entry->encoder=(EncodeImageHandler *) WriteCINImage; + entry->magick=(IsImageFormatHandler *) IsCIN; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Cineon Image File"); + entry->magick_module=ConstantString("CIN"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r C I N E O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterCINImage() removes format registrations made by the CIN module +% from the list of supported formats. +% +% The format of the UnregisterCINImage method is: +% +% UnregisterCINImage(void) +% +*/ +ModuleExport void UnregisterCINImage(void) +{ + (void) UnregisterMagickInfo("CINEON"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e C I N E O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteCINImage() writes an image in CIN encoded image format. +% +% The format of the WriteCINImage method is: +% +% MagickBooleanType WriteCINImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static inline const char *GetCINProperty(const ImageInfo *image_info, + const Image *image,const char *property) +{ + const char + *value; + + value=GetImageOption(image_info,property); + if (value != (const char *) NULL) + return(value); + return(GetImageProperty(image,property)); +} + +static MagickBooleanType WriteCINImage(const ImageInfo *image_info,Image *image) +{ + char + timestamp[MaxTextExtent]; + + const char + *value; + + CINInfo + cin; + + const StringInfo + *profile; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + const PixelPacket + *p; + + ssize_t + i; + + size_t + length; + + ssize_t + count, + y; + + struct tm + utc_time; + + time_t + seconds; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (image->colorspace != LogColorspace) + (void) TransformImageColorspace(image,LogColorspace); + /* + Write image information. + */ + (void) memset(&cin,0,sizeof(cin)); + offset=0; + cin.file.magic=0x802A5FD7UL; + offset+=WriteBlobLong(image,(unsigned int) cin.file.magic); + cin.file.image_offset=0x800; + offset+=WriteBlobLong(image,(unsigned int) cin.file.image_offset); + cin.file.generic_length=0x400; + offset+=WriteBlobLong(image,(unsigned int) cin.file.generic_length); + cin.file.industry_length=0x400; + offset+=WriteBlobLong(image,(unsigned int) cin.file.industry_length); + cin.file.user_length=0x00; + profile=GetImageProfile(image,"dpx:user.data"); + if (profile != (StringInfo *) NULL) + { + cin.file.user_length+=(size_t) GetStringInfoLength(profile); + cin.file.user_length=(((cin.file.user_length+0x2000-1)/0x2000)*0x2000); + } + offset+=WriteBlobLong(image,(unsigned int) cin.file.user_length); + cin.file.file_size=4*image->columns*image->rows+0x2000; + offset+=WriteBlobLong(image,(unsigned int) cin.file.file_size); + (void) CopyMagickString(cin.file.version,"V4.5",sizeof(cin.file.version)); + offset+=WriteBlob(image,sizeof(cin.file.version),(unsigned char *) + cin.file.version); + value=GetCINProperty(image_info,image,"dpx:file.filename"); + if (value != (const char *) NULL) + (void) CopyMagickString(cin.file.filename,value,sizeof(cin.file.filename)); + else + (void) CopyMagickString(cin.file.filename,image->filename, + sizeof(cin.file.filename)); + offset+=WriteBlob(image,sizeof(cin.file.filename),(unsigned char *) + cin.file.filename); + seconds=GetMagickTime(); + GetMagickUTCtime(&seconds,&utc_time); + (void) memset(timestamp,0,sizeof(timestamp)); + (void) strftime(timestamp,MaxTextExtent,"%Y:%m:%d:%H:%M:%SUTC",&utc_time); + (void) memset(cin.file.create_date,0,sizeof(cin.file.create_date)); + (void) CopyMagickString(cin.file.create_date,timestamp,11); + offset+=WriteBlob(image,sizeof(cin.file.create_date),(unsigned char *) + cin.file.create_date); + (void) memset(cin.file.create_time,0,sizeof(cin.file.create_time)); + (void) CopyMagickString(cin.file.create_time,timestamp+11,11); + offset+=WriteBlob(image,sizeof(cin.file.create_time),(unsigned char *) + cin.file.create_time); + offset+=WriteBlob(image,sizeof(cin.file.reserve),(unsigned char *) + cin.file.reserve); + cin.image.orientation=0x00; + offset+=WriteBlobByte(image,cin.image.orientation); + cin.image.number_channels=3; + offset+=WriteBlobByte(image,cin.image.number_channels); + offset+=WriteBlob(image,sizeof(cin.image.reserve1),(unsigned char *) + cin.image.reserve1); + for (i=0; i < 8; i++) + { + cin.image.channel[i].designator[0]=0; /* universal metric */ + offset+=WriteBlobByte(image,cin.image.channel[0].designator[0]); + cin.image.channel[i].designator[1]=(unsigned char) (i > 3 ? 0 : i+1); /* channel color */; + offset+=WriteBlobByte(image,cin.image.channel[1].designator[0]); + cin.image.channel[i].bits_per_pixel=(unsigned char) image->depth; + offset+=WriteBlobByte(image,cin.image.channel[0].bits_per_pixel); + offset+=WriteBlobByte(image,cin.image.channel[0].reserve); + cin.image.channel[i].pixels_per_line=image->columns; + offset+=WriteBlobLong(image,(unsigned int) + cin.image.channel[0].pixels_per_line); + cin.image.channel[i].lines_per_image=image->rows; + offset+=WriteBlobLong(image,(unsigned int) + cin.image.channel[0].lines_per_image); + cin.image.channel[i].min_data=0; + offset+=WriteBlobFloat(image,cin.image.channel[0].min_data); + cin.image.channel[i].min_quantity=0.0; + offset+=WriteBlobFloat(image,cin.image.channel[0].min_quantity); + cin.image.channel[i].max_data=(float) ((MagickOffsetType) + GetQuantumRange(image->depth)); + offset+=WriteBlobFloat(image,cin.image.channel[0].max_data); + cin.image.channel[i].max_quantity=2.048f; + offset+=WriteBlobFloat(image,cin.image.channel[0].max_quantity); + } + offset+=WriteBlobFloat(image,image->chromaticity.white_point.x); + offset+=WriteBlobFloat(image,image->chromaticity.white_point.y); + offset+=WriteBlobFloat(image,image->chromaticity.red_primary.x); + offset+=WriteBlobFloat(image,image->chromaticity.red_primary.y); + offset+=WriteBlobFloat(image,image->chromaticity.green_primary.x); + offset+=WriteBlobFloat(image,image->chromaticity.green_primary.y); + offset+=WriteBlobFloat(image,image->chromaticity.blue_primary.x); + offset+=WriteBlobFloat(image,image->chromaticity.blue_primary.y); + value=GetCINProperty(image_info,image,"dpx:image.label"); + if (value != (const char *) NULL) + (void) CopyMagickString(cin.image.label,value,sizeof(cin.image.label)); + offset+=WriteBlob(image,sizeof(cin.image.label),(unsigned char *) + cin.image.label); + offset+=WriteBlob(image,sizeof(cin.image.reserve),(unsigned char *) + cin.image.reserve); + /* + Write data format information. + */ + cin.data_format.interleave=0; /* pixel interleave (rgbrgbr...) */ + offset+=WriteBlobByte(image,cin.data_format.interleave); + cin.data_format.packing=5; /* packing ssize_tword (32bit) boundaries */ + offset+=WriteBlobByte(image,cin.data_format.packing); + cin.data_format.sign=0; /* unsigned data */ + offset+=WriteBlobByte(image,cin.data_format.sign); + cin.data_format.sense=0; /* image sense: positive image */ + offset+=WriteBlobByte(image,cin.data_format.sense); + cin.data_format.line_pad=0; + offset+=WriteBlobLong(image,(unsigned int) cin.data_format.line_pad); + cin.data_format.channel_pad=0; + offset+=WriteBlobLong(image,(unsigned int) cin.data_format.channel_pad); + offset+=WriteBlob(image,sizeof(cin.data_format.reserve),(unsigned char *) + cin.data_format.reserve); + /* + Write origination information. + */ + cin.origination.x_offset=0UL; + value=GetCINProperty(image_info,image,"dpx:origination.x_offset"); + if (value != (const char *) NULL) + cin.origination.x_offset=(ssize_t) StringToLong(value); + offset+=WriteBlobLong(image,(unsigned int) cin.origination.x_offset); + cin.origination.y_offset=0UL; + value=GetCINProperty(image_info,image,"dpx:origination.y_offset"); + if (value != (const char *) NULL) + cin.origination.y_offset=(ssize_t) StringToLong(value); + offset+=WriteBlobLong(image,(unsigned int) cin.origination.y_offset); + value=GetCINProperty(image_info,image,"dpx:origination.filename"); + if (value != (const char *) NULL) + (void) CopyMagickString(cin.origination.filename,value, + sizeof(cin.origination.filename)); + else + (void) CopyMagickString(cin.origination.filename,image->filename, + sizeof(cin.origination.filename)); + offset+=WriteBlob(image,sizeof(cin.origination.filename),(unsigned char *) + cin.origination.filename); + (void) memset(timestamp,0,sizeof(timestamp)); + (void) strftime(timestamp,MaxTextExtent,"%Y:%m:%d:%H:%M:%SUTC",&utc_time); + (void) memset(cin.origination.create_date,0, + sizeof(cin.origination.create_date)); + (void) CopyMagickString(cin.origination.create_date,timestamp,11); + offset+=WriteBlob(image,sizeof(cin.origination.create_date),(unsigned char *) + cin.origination.create_date); + (void) memset(cin.origination.create_time,0, + sizeof(cin.origination.create_time)); + (void) CopyMagickString(cin.origination.create_time,timestamp+11,15); + offset+=WriteBlob(image,sizeof(cin.origination.create_time),(unsigned char *) + cin.origination.create_time); + value=GetCINProperty(image_info,image,"dpx:origination.device"); + if (value != (const char *) NULL) + (void) CopyMagickString(cin.origination.device,value, + sizeof(cin.origination.device)); + offset+=WriteBlob(image,sizeof(cin.origination.device),(unsigned char *) + cin.origination.device); + value=GetCINProperty(image_info,image,"dpx:origination.model"); + if (value != (const char *) NULL) + (void) CopyMagickString(cin.origination.model,value, + sizeof(cin.origination.model)); + offset+=WriteBlob(image,sizeof(cin.origination.model),(unsigned char *) + cin.origination.model); + value=GetCINProperty(image_info,image,"dpx:origination.serial"); + if (value != (const char *) NULL) + (void) CopyMagickString(cin.origination.serial,value, + sizeof(cin.origination.serial)); + offset+=WriteBlob(image,sizeof(cin.origination.serial),(unsigned char *) + cin.origination.serial); + cin.origination.x_pitch=0.0f; + value=GetCINProperty(image_info,image,"dpx:origination.x_pitch"); + if (value != (const char *) NULL) + cin.origination.x_pitch=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,cin.origination.x_pitch); + cin.origination.y_pitch=0.0f; + value=GetCINProperty(image_info,image,"dpx:origination.y_pitch"); + if (value != (const char *) NULL) + cin.origination.y_pitch=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,cin.origination.y_pitch); + cin.origination.gamma=image->gamma; + offset+=WriteBlobFloat(image,cin.origination.gamma); + offset+=WriteBlob(image,sizeof(cin.origination.reserve),(unsigned char *) + cin.origination.reserve); + /* + Image film information. + */ + cin.film.id=0; + value=GetCINProperty(image_info,image,"dpx:film.id"); + if (value != (const char *) NULL) + cin.film.id=(char) StringToLong(value); + offset+=WriteBlobByte(image,(unsigned char) cin.film.id); + cin.film.type=0; + value=GetCINProperty(image_info,image,"dpx:film.type"); + if (value != (const char *) NULL) + cin.film.type=(char) StringToLong(value); + offset+=WriteBlobByte(image,(unsigned char) cin.film.type); + cin.film.offset=0; + value=GetCINProperty(image_info,image,"dpx:film.offset"); + if (value != (const char *) NULL) + cin.film.offset=(char) StringToLong(value); + offset+=WriteBlobByte(image,(unsigned char) cin.film.offset); + offset+=WriteBlobByte(image,(unsigned char) cin.film.reserve1); + cin.film.prefix=0UL; + value=GetCINProperty(image_info,image,"dpx:film.prefix"); + if (value != (const char *) NULL) + cin.film.prefix=StringToUnsignedLong(value); + offset+=WriteBlobLong(image,(unsigned int) cin.film.prefix); + cin.film.count=0UL; + value=GetCINProperty(image_info,image,"dpx:film.count"); + if (value != (const char *) NULL) + cin.film.count=StringToUnsignedLong(value); + offset+=WriteBlobLong(image,(unsigned int) cin.film.count); + value=GetCINProperty(image_info,image,"dpx:film.format"); + if (value != (const char *) NULL) + (void) CopyMagickString(cin.film.format,value,sizeof(cin.film.format)); + offset+=WriteBlob(image,sizeof(cin.film.format),(unsigned char *) + cin.film.format); + cin.film.frame_position=0UL; + value=GetCINProperty(image_info,image,"dpx:film.frame_position"); + if (value != (const char *) NULL) + cin.film.frame_position=StringToUnsignedLong(value); + offset+=WriteBlobLong(image,(unsigned int) cin.film.frame_position); + cin.film.frame_rate=0.0f; + value=GetCINProperty(image_info,image,"dpx:film.frame_rate"); + if (value != (const char *) NULL) + cin.film.frame_rate=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,cin.film.frame_rate); + value=GetCINProperty(image_info,image,"dpx:film.frame_id"); + if (value != (const char *) NULL) + (void) CopyMagickString(cin.film.frame_id,value,sizeof(cin.film.frame_id)); + offset+=WriteBlob(image,sizeof(cin.film.frame_id),(unsigned char *) + cin.film.frame_id); + value=GetCINProperty(image_info,image,"dpx:film.slate_info"); + if (value != (const char *) NULL) + (void) CopyMagickString(cin.film.slate_info,value, + sizeof(cin.film.slate_info)); + offset+=WriteBlob(image,sizeof(cin.film.slate_info),(unsigned char *) + cin.film.slate_info); + offset+=WriteBlob(image,sizeof(cin.film.reserve),(unsigned char *) + cin.film.reserve); + if (profile != (StringInfo *) NULL) + offset+=WriteBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + while (offset < (MagickOffsetType) cin.file.image_offset) + offset+=WriteBlobByte(image,0x00); + /* + Convert pixel packets to CIN raster image. + */ + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + quantum_info->quantum=32; + quantum_info->pack=MagickFalse; + quantum_type=RGBQuantum; + pixels=GetQuantumPixels(quantum_info); + length=GetBytesPerRow(image->columns,3,image->depth,MagickTrue); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + quantum_type,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/cip.c b/ImageMagick-6.9.12-44/coders/cip.c new file mode 100644 index 0000000..b1fac5e --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/cip.c @@ -0,0 +1,288 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% CCCC IIIII PPPP % +% C I P P % +% C I PPPP % +% C I P % +% CCCC IIIII P % +% % +% % +% Read/Write Cisco IP Phone Image Format % +% % +% Software Design % +% Cristy % +% April 2004 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteCIPImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r C I P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterCIPImage() adds properties for the CIP IP phone image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterCIPImage method is: +% +% size_t RegisterCIPImage(void) +% +*/ +ModuleExport size_t RegisterCIPImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("CIP"); + entry->encoder=(EncodeImageHandler *) WriteCIPImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Cisco IP phone image format"); + entry->magick_module=ConstantString("CIP"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r C I P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterCIPImage() removes format registrations made by the +% CIP module from the list of supported formats. +% +% The format of the UnregisterCIPImage method is: +% +% UnregisterCIPImage(void) +% +*/ +ModuleExport void UnregisterCIPImage(void) +{ + (void) UnregisterMagickInfo("CIP"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e C I P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Procedure WriteCIPImage() writes an image to a file in the Cisco IP phone +% image format. +% +% The format of the WriteCIPImage method is: +% +% MagickBooleanType WriteCIPImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteCIPImage(const ImageInfo *image_info,Image *image) +{ + char + buffer[MaxTextExtent]; + + const char + *value; + + MagickBooleanType + status; + + const PixelPacket + *p; + + ssize_t + i, + x; + + ssize_t + y; + + unsigned char + byte; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) WriteBlobString(image,"\n"); + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + (void) FormatLocaleString(buffer,MaxTextExtent,"%s\n",value); + else + { + char + basename[MaxTextExtent]; + + GetPathComponent(image->filename,BasePath,basename); + (void) FormatLocaleString(buffer,MaxTextExtent,"%s\n", + basename); + } + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%.20g\n",(double) image->page.x); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%.20g\n",(double) image->page.y); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n", + (double) (image->columns+(image->columns % 2))); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n", + (double) image->rows); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"2\n"); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,""); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < ((ssize_t) image->columns-3); x+=4) + { + byte=(unsigned char) + ((((size_t) (3*ClampToQuantum(GetPixelLuma(image,p+3))/QuantumRange) & 0x03) << 6) | + (((size_t) (3*ClampToQuantum(GetPixelLuma(image,p+2))/QuantumRange) & 0x03) << 4) | + (((size_t) (3*ClampToQuantum(GetPixelLuma(image,p+1))/QuantumRange) & 0x03) << 2) | + (((size_t) (3*ClampToQuantum(GetPixelLuma(image,p+0))/QuantumRange) & 0x03) << 0)); + (void) FormatLocaleString(buffer,MaxTextExtent,"%02x",byte); + (void) WriteBlobString(image,buffer); + p+=4; + } + if ((image->columns % 4) != 0) + { + byte=0; + for ( ; x < (ssize_t) image->columns; x++) + { + i=x % 4; + switch (i) + { + case 0: + { + byte|=(unsigned char) (((size_t) (3*ClampToQuantum(GetPixelLuma( + image,p+MagickMin(i,3)))/QuantumRange) & 0x03) << 6); + break; + } + case 1: + { + byte|=(unsigned char) (((size_t) (3*ClampToQuantum(GetPixelLuma( + image,p+MagickMin(i,2)))/QuantumRange) & 0x03) << 4); + break; + } + case 2: + { + byte|=(unsigned char) (((size_t) (3*ClampToQuantum(GetPixelLuma( + image,p+MagickMin(i,1)))/QuantumRange) & 0x03) << 2); + break; + } + case 3: + { + byte|=(unsigned char) (((size_t) (3*ClampToQuantum(GetPixelLuma( + image,p+MagickMin(i,0)))/QuantumRange) & 0x03) << 0); + break; + } + } + } + (void) FormatLocaleString(buffer,MagickPathExtent,"%02x",~byte); + (void) WriteBlobString(image,buffer); + } + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) WriteBlobString(image,"\n"); + (void) WriteBlobString(image,"\n"); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/clip.c b/ImageMagick-6.9.12-44/coders/clip.c new file mode 100644 index 0000000..61547d7 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/clip.c @@ -0,0 +1,249 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC L IIIII PPPP % +% C L I P P % +% C L I PPPP % +% C L I P % +% CCCC LLLLL IIIII P % +% % +% % +% Write Clip File. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteCLIPImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d C L I P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadCLIPImage returns the rendered clip path associated with the image. +% +% The format of the ReadCLIPImage method is: +% +% Image *ReadCLIPImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadCLIPImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + ImageInfo + *read_info; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) CopyMagickString(read_info->magick,"MIFF",MaxTextExtent); + image=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (image != (Image *) NULL) + { + Image + *clip_image; + + (void) ClipImage(image); + if (image->clip_mask == (Image *) NULL) + ThrowReaderException(CoderError,"ImageDoesNotHaveAClipMask"); + clip_image=CloneImage(image->clip_mask,0,0,MagickTrue,exception); + image=DestroyImage(image); + image=clip_image; + } + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r C L I P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterCLIPImage() adds attributes for the CLIP image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterCLIPImage method is: +% +% size_t RegisterCLIPImage(void) +% +*/ +ModuleExport size_t RegisterCLIPImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("CLIP"); + entry->decoder=(DecodeImageHandler *) ReadCLIPImage; + entry->encoder=(EncodeImageHandler *) WriteCLIPImage; + entry->description=ConstantString("Image Clip Mask"); + entry->magick_module=ConstantString("CLIP"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r C L I P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterCLIPImage() removes format registrations made by the +% CLIP module from the list of supported formats. +% +% The format of the UnregisterCLIPImage method is: +% +% UnregisterCLIPImage(void) +% +*/ +ModuleExport void UnregisterCLIPImage(void) +{ + (void) UnregisterMagickInfo("CLIP"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e C L I P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteCLIPImage() writes an image of clip bytes to a file. It consists of +% data from the clip mask of the image. +% +% The format of the WriteCLIPImage method is: +% +% MagickBooleanType WriteCLIPImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteCLIPImage(const ImageInfo *image_info, + Image *image) +{ + Image + *clip_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + if (image->clip_mask == (Image *) NULL) + (void) ClipImage(image); + if (image->clip_mask == (Image *) NULL) + ThrowWriterException(CoderError,"ImageDoesNotHaveAClipMask"); + clip_image=CloneImage(image->clip_mask,0,0,MagickTrue,&image->exception); + if (clip_image == (Image *) NULL) + return(MagickFalse); + (void) SetImageType(clip_image,TrueColorType); + (void) CopyMagickString(clip_image->filename,image->filename,MaxTextExtent); + write_info=CloneImageInfo(image_info); + *write_info->magick='\0'; + (void) SetImageInfo(write_info,1,&image->exception); + if ((*write_info->magick == '\0') || + (LocaleCompare(write_info->magick,"CLIP") == 0)) + (void) FormatLocaleString(clip_image->filename,MaxTextExtent,"miff:%s", + write_info->filename); + status=WriteImage(write_info,clip_image); + clip_image=DestroyImage(clip_image); + write_info=DestroyImageInfo(write_info); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/clipboard.c b/ImageMagick-6.9.12-44/coders/clipboard.c new file mode 100644 index 0000000..7f78d22 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/clipboard.c @@ -0,0 +1,378 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC L IIIII PPPP BBBB OOO AAA RRRR DDDD % +% C L I P P B B O O A A R R D D % +% C L I PPP BBBB O O AAAAA RRRR D D % +% C L I P B B O O A A R R D D % +% CCCC LLLLL IIIII P BBBB OOO A A R R DDDD % +% % +% % +% Read/Write Windows Clipboard. % +% % +% Software Design % +% Leonard Rosenthol % +% May 2002 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#if defined(MAGICKCORE_WINGDI32_DELEGATE) +# if defined(__CYGWIN__) +# include +# else + /* All MinGW needs ... */ +# include "magick/nt-base-private.h" +# include +# endif +#endif +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/nt-feature.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +#define BMP_HEADER_SIZE 14 + +/* + Forward declarations. +*/ +#if defined(MAGICKCORE_WINGDI32_DELEGATE) +static MagickBooleanType + WriteCLIPBOARDImage(const ImageInfo *,Image *); +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d C L I P B O A R D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadCLIPBOARDImage() reads an image from the system clipboard and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadCLIPBOARDImage method is: +% +% Image *ReadCLIPBOARDImage(const ImageInfo *image_info, +% ExceptionInfo exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +#if defined(MAGICKCORE_WINGDI32_DELEGATE) +static Image *ReadCLIPBOARDImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + unsigned char + *p; + + HANDLE + clip_handle; + + Image + *image; + + ImageInfo + *read_info; + + LPVOID + clip_mem; + + size_t + clip_size, + total_size; + + unsigned char + offset; + + void + *clip_data; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if (!IsClipboardFormatAvailable(CF_DIB) && + !IsClipboardFormatAvailable(CF_DIBV5)) + ThrowReaderException(CoderError,"NoBitmapOnClipboard"); + if (!OpenClipboard(NULL)) + ThrowReaderException(CoderError,"UnableToReadImageData"); + clip_handle=GetClipboardData(CF_DIBV5); + if (!clip_handle) + clip_handle=GetClipboardData(CF_DIB); + if ((clip_handle == NULL) || (clip_handle == INVALID_HANDLE_VALUE)) + { + CloseClipboard(); + ThrowReaderException(CoderError,"UnableToReadImageData"); + } + clip_size=(size_t) GlobalSize(clip_handle); + total_size=clip_size+BMP_HEADER_SIZE; + clip_data=AcquireMagickMemory(total_size); + if (clip_data == (void *) NULL) + { + CloseClipboard(); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + clip_mem=GlobalLock(clip_handle); + if (clip_mem == (LPVOID) NULL) + { + CloseClipboard(); + clip_data=RelinquishMagickMemory(clip_data); + ThrowReaderException(CoderError,"UnableToReadImageData"); + } + p=(unsigned char *) clip_data; + p+=BMP_HEADER_SIZE; + (void) memcpy(p,clip_mem,clip_size); + (void) GlobalUnlock(clip_mem); + (void) CloseClipboard(); + memset(clip_data,0,BMP_HEADER_SIZE); + offset=p[0]; + if ((p[0] == 40) && (p[16] == BI_BITFIELDS)) + offset+=12; + else + { + unsigned int + image_size; + + image_size=(unsigned int) p[20]; + image_size|=(unsigned int) p[21] << 8; + image_size|=(unsigned int) p[22] << 16; + image_size|=(unsigned int) p[23] << 24; + /* Hack for chrome where the offset seems to be incorrect */ + if (clip_size - offset - image_size == 12) + offset+=12; + } + offset+=BMP_HEADER_SIZE; + p-=BMP_HEADER_SIZE; + p[0]='B'; + p[1]='M'; + p[2]=(unsigned char) total_size; + p[3]=(unsigned char) (total_size >> 8); + p[4]=(unsigned char) (total_size >> 16); + p[5]=(unsigned char) (total_size >> 24); + p[10]=offset; + read_info=CloneImageInfo(image_info); + (void) CopyMagickString(read_info->magick,"BMP",MaxTextExtent); + image=BlobToImage(read_info,clip_data,total_size,exception); + read_info=DestroyImageInfo(read_info); + clip_data=RelinquishMagickMemory(clip_data); + return(image); +} +#endif /* MAGICKCORE_WINGDI32_DELEGATE */ + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r C L I P B O A R D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterCLIPBOARDImage() adds attributes for the clipboard "image format" to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterCLIPBOARDImage method is: +% +% size_t RegisterCLIPBOARDImage(void) +% +*/ +ModuleExport size_t RegisterCLIPBOARDImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("CLIPBOARD"); +#if defined(MAGICKCORE_WINGDI32_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadCLIPBOARDImage; + entry->encoder=(EncodeImageHandler *) WriteCLIPBOARDImage; +#endif + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("The system clipboard"); + entry->magick_module=ConstantString("CLIPBOARD"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r C L I P B O A R D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterCLIPBOARDImage() removes format registrations made by the +% RGB module from the list of supported formats. +% +% The format of the UnregisterCLIPBOARDImage method is: +% +% UnregisterCLIPBOARDImage(void) +% +*/ +ModuleExport void UnregisterCLIPBOARDImage(void) +{ + (void) UnregisterMagickInfo("CLIPBOARD"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e C L I P B O A R D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteCLIPBOARDImage() writes an image to the system clipboard. +% +% The format of the WriteCLIPBOARDImage method is: +% +% MagickBooleanType WriteCLIPBOARDImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +#if defined(MAGICKCORE_WINGDI32_DELEGATE) +static MagickBooleanType WriteCLIPBOARDImage(const ImageInfo *image_info, + Image *image) +{ + ExceptionInfo + *sans_exception; + + HANDLE + clip_handle; + + ImageInfo + *write_info; + + LPVOID + clip_mem; + + size_t + length; + + unsigned char + *p; + + void + *clip_data; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + ThrowWriterException(CoderError,"UnableToWriteImageData"); + write_info=CloneImageInfo(image_info); + if (image->matte == MagickFalse) + (void) CopyMagickString(write_info->magick,"BMP3",MaxTextExtent); + else + (void) CopyMagickString(write_info->magick,"BMP",MaxTextExtent); + sans_exception=AcquireExceptionInfo(); + clip_data=ImageToBlob(write_info,image,&length,sans_exception); + sans_exception=DestroyExceptionInfo(sans_exception); + write_info=DestroyImageInfo(write_info); + if (clip_data == (void *) NULL) + ThrowWriterException(CoderError,"UnableToWriteImageData"); + clip_handle=(HANDLE) GlobalAlloc(GMEM_MOVEABLE,length-BMP_HEADER_SIZE); + if (clip_handle == (HANDLE) NULL) + { + clip_data=RelinquishMagickMemory(clip_data); + ThrowWriterException(CoderError,"UnableToWriteImageData"); + } + clip_mem=GlobalLock(clip_handle); + if (clip_mem == (LPVOID) NULL) + { + (void) GlobalFree((HGLOBAL) clip_handle); + clip_data=RelinquishMagickMemory(clip_data); + ThrowWriterException(CoderError,"UnableToWriteImageData"); + } + p=(unsigned char *) clip_data; + p+=BMP_HEADER_SIZE; + (void) memcpy(clip_mem,p,length-BMP_HEADER_SIZE); + (void) GlobalUnlock(clip_mem); + clip_data=RelinquishMagickMemory(clip_data); + if (!OpenClipboard(NULL)) + { + (void) GlobalFree((HGLOBAL) clip_handle); + ThrowWriterException(CoderError,"UnableToWriteImageData"); + } + (void) EmptyClipboard(); + if (image->matte == MagickFalse) + SetClipboardData(CF_DIB,clip_handle); + else + SetClipboardData(CF_DIBV5,clip_handle); + (void) CloseClipboard(); + CatchImageException(image); + return(MagickTrue); +} +#endif /* MAGICKCORE_WINGDI32_DELEGATE */ + diff --git a/ImageMagick-6.9.12-44/coders/cmyk.c b/ImageMagick-6.9.12-44/coders/cmyk.c new file mode 100644 index 0000000..ea92275 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/cmyk.c @@ -0,0 +1,1676 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC M M Y Y K K % +% C MM MM Y Y K K % +% C M M M Y KKK % +% C M M Y K K % +% CCCC M M Y K K % +% % +% % +% Read/Write RAW CMYK Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/colorspace.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteCMYKImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d C M Y K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadCMYKImage() reads an image of raw CMYK or CMYKA samples and returns it. +% It allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadCMYKImage method is: +% +% Image *ReadCMYKImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadCMYKImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + const void + *stream; + + Image + *canvas_image, + *image; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + i; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) SetImageColorspace(image,CMYKColorspace); + if (image_info->interlace != PartitionInterlace) + { + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + } + /* + Create virtual canvas to support cropping (i.e. image.cmyk[100x100+10+20]). + */ + canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse, + exception); + if (canvas_image == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + quantum_type=CMYKQuantum; + if (LocaleCompare(image_info->magick,"CMYKA") == 0) + { + quantum_type=CMYKAQuantum; + canvas_image->matte=MagickTrue; + } + (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod); + quantum_info=AcquireQuantumInfo(image_info,canvas_image); + if (quantum_info == (QuantumInfo *) NULL) + { + canvas_image=DestroyImage(canvas_image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=GetQuantumPixels(quantum_info); + if (image_info->number_scenes != 0) + while (image->scene < image_info->scene) + { + /* + Skip to next image. + */ + image->scene++; + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + for (y=0; y < (ssize_t) image->rows; y++) + { + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + } + count=0; + length=0; + scene=0; + status=MagickTrue; + stream=NULL; + do + { + /* + Read pixels to virtual canvas image then push to image. + */ + image->matte=canvas_image->matte; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + break; + if (SetImageColorspace(image,CMYKColorspace) == MagickFalse) + break; + switch (image_info->interlace) + { + case NoInterlace: + default: + { + /* + No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const IndexPacket + *magick_restrict canvas_indexes; + + const PixelPacket + *magick_restrict p; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=QueueAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + canvas_indexes=GetVirtualIndexQueue(canvas_image); + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + SetPixelGreen(q,GetPixelGreen(p)); + SetPixelBlue(q,GetPixelBlue(p)); + SetPixelBlack(indexes+x,GetPixelBlack( + canvas_indexes+image->extract_info.x+x)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + break; + } + case LineInterlace: + { + static QuantumType + quantum_types[5] = + { + CyanQuantum, + MagentaQuantum, + YellowQuantum, + BlackQuantum, + OpacityQuantum + }; + + /* + Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + for (i=0; i < (ssize_t) (image->matte != MagickFalse ? 5 : 4); i++) + { + const IndexPacket + *magick_restrict canvas_indexes; + + const PixelPacket + *magick_restrict p; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + quantum_type=quantum_types[i]; + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x, + 0,canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + canvas_indexes=GetVirtualIndexQueue(canvas_image); + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + switch (quantum_type) + { + case CyanQuantum: + { + SetPixelCyan(q,GetPixelCyan(p)); + break; + } + case MagentaQuantum: + { + SetPixelMagenta(q,GetPixelMagenta(p)); + break; + } + case YellowQuantum: + { + SetPixelYellow(q,GetPixelYellow(p)); + break; + } + case BlackQuantum: + { + SetPixelIndex(indexes+x,GetPixelIndex( + canvas_indexes+image->extract_info.x+x)); + break; + } + case OpacityQuantum: + { + SetPixelOpacity(q,GetPixelOpacity(p)); + break; + } + default: + break; + } + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + { + /* + Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,CyanQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,1,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,MagentaQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelGreen(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,2,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,YellowQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,GetPixelBlue(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,3,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const IndexPacket + *magick_restrict canvas_indexes; + + const PixelPacket + *magick_restrict p; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlackQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + canvas_indexes=GetVirtualIndexQueue(canvas_image); + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelIndex(indexes+x,GetPixelIndex( + canvas_indexes+image->extract_info.x+x)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,4,6); + if (status == MagickFalse) + break; + } + if (image->matte != MagickFalse) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,AlphaQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image, + canvas_image->extract_info.x,0,canvas_image->columns,1, + exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,5,6); + if (status == MagickFalse) + break; + } + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + case PartitionInterlace: + { + /* + Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK... + */ + AppendImageFormat("C",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,CyanQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,1,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("M",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,MagentaQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,MagentaQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelGreen(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,2,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("Y",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,YellowQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,YellowQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,GetPixelBlue(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,3,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("K",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,BlackQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const IndexPacket + *magick_restrict canvas_indexes; + + const PixelPacket + *magick_restrict p; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlackQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + canvas_indexes=GetVirtualIndexQueue(canvas_image); + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelIndex(indexes+x,GetPixelIndex( + canvas_indexes+image->extract_info.x+x)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,3,5); + if (status == MagickFalse) + break; + } + if (image->matte != MagickFalse) + { + (void) CloseBlob(image); + AppendImageFormat("A",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels( + quantum_info),&count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,YellowQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x, + 0,canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,4,5); + if (status == MagickFalse) + break; + } + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,5,5); + if (status == MagickFalse) + break; + } + break; + } + } + if (status == MagickFalse) + break; + SetQuantumImageType(image,quantum_type); + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (count == (ssize_t) length) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + scene++; + } while (count == (ssize_t) length); + quantum_info=DestroyQuantumInfo(quantum_info); + InheritException(exception,&canvas_image->exception); + InheritException(exception,&image->exception); + canvas_image=DestroyImage(canvas_image); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r C M Y K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterCMYKImage() adds attributes for the CMYK image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterCMYKImage method is: +% +% size_t RegisterCMYKImage(void) +% +*/ +ModuleExport size_t RegisterCMYKImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("CMYK"); + entry->decoder=(DecodeImageHandler *) ReadCMYKImage; + entry->encoder=(EncodeImageHandler *) WriteCMYKImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw cyan, magenta, yellow, and black " + "samples"); + entry->magick_module=ConstantString("CMYK"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("CMYKA"); + entry->decoder=(DecodeImageHandler *) ReadCMYKImage; + entry->encoder=(EncodeImageHandler *) WriteCMYKImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw cyan, magenta, yellow, black, and " + "alpha samples"); + entry->magick_module=ConstantString("CMYK"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r C M Y K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterCMYKImage() removes format registrations made by the +% CMYK module from the list of supported formats. +% +% The format of the UnregisterCMYKImage method is: +% +% UnregisterCMYKImage(void) +% +*/ +ModuleExport void UnregisterCMYKImage(void) +{ + (void) UnregisterMagickInfo("CMYK"); + (void) UnregisterMagickInfo("CMYKA"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e C M Y K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteCMYKImage() writes an image to a file in cyan, magenta, yellow, and +% black,rasterfile format. +% +% The format of the WriteCMYKImage method is: +% +% MagickBooleanType WriteCMYKImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info, + Image *image) +{ + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + count, + y; + + size_t + imageListLength, + length; + + unsigned char + *pixels; + + /* + Allocate memory for pixels. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image_info->interlace != PartitionInterlace) + { + /* + Open output image file. + */ + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + } + quantum_type=CMYKQuantum; + if (LocaleCompare(image_info->magick,"CMYKA") == 0) + { + quantum_type=CMYKAQuantum; + image->matte=MagickTrue; + } + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Convert MIFF to CMYK raster pixels. + */ + if (image->colorspace != CMYKColorspace) + (void) TransformImageColorspace(image,CMYKColorspace); + if ((LocaleCompare(image_info->magick,"CMYKA") == 0) && + (image->matte == MagickFalse)) + (void) SetImageAlphaChannel(image,ResetAlphaChannel); + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + switch (image_info->interlace) + { + case NoInterlace: + default: + { + /* + No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case LineInterlace: + { + /* + Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,CyanQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,MagentaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,YellowQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlackQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (quantum_type == CMYKAQuantum) + { + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + { + /* + Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,CyanQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,MagentaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,2,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,YellowQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,3,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlackQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,4,6); + if (status == MagickFalse) + break; + } + if (quantum_type == CMYKAQuantum) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,5,6); + if (status == MagickFalse) + break; + } + } + if (image_info->interlace == PartitionInterlace) + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + case PartitionInterlace: + { + /* + Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK... + */ + AppendImageFormat("C",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,CyanQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,6); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("M",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,MagentaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,2,6); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("Y",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,YellowQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,3,6); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("K",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlackQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,4,6); + if (status == MagickFalse) + break; + } + if (quantum_type == CMYKAQuantum) + { + (void) CloseBlob(image); + AppendImageFormat("A",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,5,6); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/cut.c b/ImageMagick-6.9.12-44/coders/cut.c new file mode 100644 index 0000000..8463923 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/cut.c @@ -0,0 +1,741 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% CCC U U TTTTT % +% C U U T % +% C U U T % +% C U U T % +% CCC UUU T % +% % +% % +% Read DR Halo Image Format % +% % +% Software Design % +% Jaroslav Fojtik % +% June 2000 % +% % +% % +% Permission is hereby granted, free of charge, to any person obtaining a % +% copy of this software and associated documentation files ("ImageMagick"), % +% to deal in ImageMagick without restriction, including without limitation % +% the rights to use, copy, modify, merge, publish, distribute, sublicense, % +% and/or sell copies of ImageMagick, and to permit persons to whom the % +% ImageMagick is furnished to do so, subject to the following conditions: % +% % +% The above copyright notice and this permission notice shall be included in % +% all copies or substantial portions of ImageMagick. % +% % +% The software is provided "as is", without warranty of any kind, express or % +% implied, including but not limited to the warranties of merchantability, % +% fitness for a particular purpose and noninfringement. In no event shall % +% ImageMagick Studio be liable for any claim, damages or other liability, % +% whether in an action of contract, tort or otherwise, arising from, out of % +% or in connection with ImageMagick or the use or other dealings in % +% ImageMagick. % +% % +% Except as contained in this notice, the name of the ImageMagick Studio % +% shall not be used in advertising or otherwise to promote the sale, use or % +% other dealings in ImageMagick without prior written authorization from the % +% ImageMagick Studio. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" +#include "magick/utility-private.h" + +typedef struct +{ + unsigned Width; + unsigned Height; + unsigned Reserved; +} CUTHeader; + +typedef struct +{ + char FileId[2]; + unsigned Version; + unsigned Size; + char FileType; + char SubType; + unsigned BoardID; + unsigned GraphicsMode; + unsigned MaxIndex; + unsigned MaxRed; + unsigned MaxGreen; + unsigned MaxBlue; + char PaletteId[20]; +} CUTPalHeader; + + +static MagickBooleanType InsertRow(int bpp,unsigned char *p,ssize_t y, + Image *image) +{ + ExceptionInfo + *exception; + + int + bit; + + ssize_t + x; + + PixelPacket + *q; + + IndexPacket + index; + + IndexPacket + *indexes; + + exception=(&image->exception); + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + return(MagickFalse); + indexes=GetAuthenticIndexQueue(image); + switch (bpp) + { + case 1: /* Convert bitmap scanline. */ + { + for (x=0; x < ((ssize_t) image->columns-7); x+=8) + { + for (bit=0; bit < 8; bit++) + { + index=((*p) & (0x80 >> bit) ? 0x01 : 0x00); + SetPixelIndex(indexes+x+bit,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + } + p++; + } + if ((image->columns % 8) != 0) + { + for (bit=0; bit < (ssize_t) (image->columns % 8); bit++) + { + index=((*p) & (0x80 >> bit) ? 0x01 : 0x00); + SetPixelIndex(indexes+x+bit,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + } + p++; + } + break; + } + case 2: /* Convert PseudoColor scanline. */ + { + if ((image->storage_class != PseudoClass) || + (indexes == (IndexPacket *) NULL)) + break; + for (x=0; x < ((ssize_t) image->columns-3); x+=4) + { + index=ConstrainColormapIndex(image,(*p >> 6) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + index=ConstrainColormapIndex(image,(*p >> 4) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + index=ConstrainColormapIndex(image,(*p >> 2) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + index=ConstrainColormapIndex(image,(*p) & 0x3); + SetPixelIndex(indexes+x+1,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + p++; + } + if ((image->columns % 4) != 0) + { + index=ConstrainColormapIndex(image,(*p >> 6) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + if ((image->columns % 4) > 1) + { + index=ConstrainColormapIndex(image,(*p >> 4) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + if ((image->columns % 4) > 2) + { + index=ConstrainColormapIndex(image,(*p >> 2) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + } + } + p++; + } + break; + } + + case 4: /* Convert PseudoColor scanline. */ + { + for (x=0; x < ((ssize_t) image->columns-1); x+=2) + { + index=ConstrainColormapIndex(image,(*p >> 4) & 0x0f); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + index=ConstrainColormapIndex(image,(*p) & 0x0f); + SetPixelIndex(indexes+x+1,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + p++; + q++; + } + if ((image->columns % 2) != 0) + { + index=ConstrainColormapIndex(image,(*p >> 4) & 0x0f); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + p++; + q++; + } + break; + } + case 8: /* Convert PseudoColor scanline. */ + { + for (x=0; x < (ssize_t) image->columns; x++) + { + index=ConstrainColormapIndex(image,*p); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + p++; + q++; + } + } + break; + + case 24: /* Convert DirectColor scanline. */ + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + q++; + } + break; + } + if (!SyncAuthenticPixels(image,exception)) + return(MagickFalse); + return(MagickTrue); +} + + +/* + Compute the number of colors in Grayed R[i]=G[i]=B[i] image +*/ +static int GetCutColors(Image *image) +{ + ExceptionInfo + *exception; + + Quantum + intensity, + scale_intensity; + + PixelPacket + *q; + + ssize_t + x, + y; + + exception=(&image->exception); + intensity=0; + scale_intensity=ScaleCharToQuantum(16); + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (intensity < GetPixelRed(q)) + intensity=GetPixelRed(q); + if (intensity >= scale_intensity) + return(255); + q++; + } + } + if (intensity < ScaleCharToQuantum(2)) + return(2); + if (intensity < ScaleCharToQuantum(16)) + return(16); + return((int) intensity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d C U T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadCUTImage() reads an CUT X image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadCUTImage method is: +% +% Image *ReadCUTImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadCUTImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define ThrowCUTReaderException(severity,tag) \ +{ \ + if (palette != NULL) \ + palette=DestroyImage(palette); \ + if (clone_info != NULL) \ + clone_info=DestroyImageInfo(clone_info); \ + ThrowReaderException(severity,tag); \ +} + + Image *image,*palette; + ImageInfo *clone_info; + MagickBooleanType status; + + MagickOffsetType + offset; + + size_t EncodedByte; + unsigned char RunCount,RunValue,RunCountMasked; + CUTHeader Header; + CUTPalHeader PalHeader; + ssize_t depth; + ssize_t i,j; + ssize_t ldblk; + unsigned char *BImgBuff=NULL,*ptrB; + PixelPacket *q; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read CUT image. + */ + palette=NULL; + clone_info=NULL; + Header.Width=ReadBlobLSBShort(image); + Header.Height=ReadBlobLSBShort(image); + Header.Reserved=ReadBlobLSBShort(image); + + if (Header.Width==0 || Header.Height==0 || Header.Reserved!=0) + CUT_KO: ThrowCUTReaderException(CorruptImageError,"ImproperImageHeader"); + + /*---This code checks first line of image---*/ + EncodedByte=ReadBlobLSBShort(image); + RunCount=(unsigned char) ReadBlobByte(image); + RunCountMasked=RunCount & 0x7F; + ldblk=0; + while((int) RunCountMasked!=0) /*end of line?*/ + { + i=1; + if((int) RunCount<0x80) i=(ssize_t) RunCountMasked; + offset=SeekBlob(image,TellBlob(image)+i,SEEK_SET); + if (offset < 0) + ThrowCUTReaderException(CorruptImageError,"ImproperImageHeader"); + if(EOFBlob(image) != MagickFalse) goto CUT_KO; /*wrong data*/ + EncodedByte-=i+1; + ldblk+=(ssize_t) RunCountMasked; + + RunCount=(unsigned char) ReadBlobByte(image); + if(EOFBlob(image) != MagickFalse) goto CUT_KO; /*wrong data: unexpected eof in line*/ + RunCountMasked=RunCount & 0x7F; + } + if(EncodedByte!=1) goto CUT_KO; /*wrong data: size incorrect*/ + i=0; /*guess a number of bit planes*/ + if(ldblk==(int) Header.Width) i=8; + if(2*ldblk==(int) Header.Width) i=4; + if(8*ldblk==(int) Header.Width) i=1; + if(i==0) goto CUT_KO; /*wrong data: incorrect bit planes*/ + depth=i; + + image->columns=Header.Width; + image->rows=Header.Height; + image->depth=8; + image->colors=(size_t) (GetQuantumRange(1UL*i)+1); + + if (image_info->ping != MagickFalse) goto Finish; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + + /* ----- Do something with palette ----- */ + if ((clone_info=CloneImageInfo(image_info)) == NULL) goto NoPalette; + + + i=(ssize_t) strlen(clone_info->filename); + j=i; + while(--i>0) + { + if(clone_info->filename[i]=='.') + { + break; + } + if(clone_info->filename[i]=='/' || clone_info->filename[i]=='\\' || + clone_info->filename[i]==':' ) + { + i=j; + break; + } + } + + (void) CopyMagickString(clone_info->filename+i,".PAL",(size_t) + (MaxTextExtent-i)); + if((clone_info->file=fopen_utf8(clone_info->filename,"rb"))==NULL) + { + (void) CopyMagickString(clone_info->filename+i,".pal",(size_t) + (MaxTextExtent-i)); + if((clone_info->file=fopen_utf8(clone_info->filename,"rb"))==NULL) + { + clone_info->filename[i]='\0'; + if((clone_info->file=fopen_utf8(clone_info->filename,"rb"))==NULL) + { + clone_info=DestroyImageInfo(clone_info); + clone_info=NULL; + goto NoPalette; + } + } + } + + if( (palette=AcquireImage(clone_info))==NULL ) goto NoPalette; + status=OpenBlob(clone_info,palette,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + ErasePalette: + palette=DestroyImage(palette); + palette=NULL; + goto NoPalette; + } + + + if(palette!=NULL) + { + (void) ReadBlob(palette,2,(unsigned char *) PalHeader.FileId); + if(strncmp(PalHeader.FileId,"AH",2) != 0) goto ErasePalette; + PalHeader.Version=ReadBlobLSBShort(palette); + PalHeader.Size=ReadBlobLSBShort(palette); + PalHeader.FileType=(char) ReadBlobByte(palette); + PalHeader.SubType=(char) ReadBlobByte(palette); + PalHeader.BoardID=ReadBlobLSBShort(palette); + PalHeader.GraphicsMode=ReadBlobLSBShort(palette); + PalHeader.MaxIndex=ReadBlobLSBShort(palette); + PalHeader.MaxRed=ReadBlobLSBShort(palette); + PalHeader.MaxGreen=ReadBlobLSBShort(palette); + PalHeader.MaxBlue=ReadBlobLSBShort(palette); + (void) ReadBlob(palette,20,(unsigned char *) PalHeader.PaletteId); + if (EOFBlob(image)) + ThrowCUTReaderException(CorruptImageError,"UnexpectedEndOfFile"); + + if(PalHeader.MaxIndex<1) goto ErasePalette; + image->colors=PalHeader.MaxIndex+1; + if (AcquireImageColormap(image,image->colors) == MagickFalse) goto NoMemory; + + if(PalHeader.MaxRed==0) PalHeader.MaxRed=(unsigned int) QuantumRange; /*avoid division by 0*/ + if(PalHeader.MaxGreen==0) PalHeader.MaxGreen=(unsigned int) QuantumRange; + if(PalHeader.MaxBlue==0) PalHeader.MaxBlue=(unsigned int) QuantumRange; + + for(i=0;i<=(int) PalHeader.MaxIndex;i++) + { /*this may be wrong- I don't know why is palette such strange*/ + j=(ssize_t) TellBlob(palette); + if((j % 512)>512-6) + { + j=((j / 512)+1)*512; + offset=SeekBlob(palette,j,SEEK_SET); + if (offset < 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + image->colormap[i].red=(Quantum) ReadBlobLSBShort(palette); + if (QuantumRange != (Quantum) PalHeader.MaxRed) + { + image->colormap[i].red=ClampToQuantum(((double) + image->colormap[i].red*QuantumRange+(PalHeader.MaxRed>>1))/ + PalHeader.MaxRed); + } + image->colormap[i].green=(Quantum) ReadBlobLSBShort(palette); + if (QuantumRange != (Quantum) PalHeader.MaxGreen) + { + image->colormap[i].green=ClampToQuantum + (((double) image->colormap[i].green*QuantumRange+(PalHeader.MaxGreen>>1))/PalHeader.MaxGreen); + } + image->colormap[i].blue=(Quantum) ReadBlobLSBShort(palette); + if (QuantumRange != (Quantum) PalHeader.MaxBlue) + { + image->colormap[i].blue=ClampToQuantum + (((double)image->colormap[i].blue*QuantumRange+(PalHeader.MaxBlue>>1))/PalHeader.MaxBlue); + } + + } + if (EOFBlob(image)) + ThrowCUTReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + + + + NoPalette: + if(palette==NULL) + { + + image->colors=256; + if (AcquireImageColormap(image,image->colors) == MagickFalse) + { + NoMemory: + ThrowCUTReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + + for (i=0; i < (ssize_t)image->colors; i++) + { + image->colormap[i].red=ScaleCharToQuantum((unsigned char) i); + image->colormap[i].green=ScaleCharToQuantum((unsigned char) i); + image->colormap[i].blue=ScaleCharToQuantum((unsigned char) i); + } + } + + + /* ----- Load RLE compressed raster ----- */ + BImgBuff=(unsigned char *) AcquireQuantumMemory((size_t) ldblk, + sizeof(*BImgBuff)); /*Ldblk was set in the check phase*/ + if(BImgBuff==NULL) goto NoMemory; + (void) memset(BImgBuff,0,(size_t) ldblk*sizeof(*BImgBuff)); + + offset=SeekBlob(image,6 /*sizeof(Header)*/,SEEK_SET); + if (offset < 0) + { + if (palette != NULL) + palette=DestroyImage(palette); + if (clone_info != NULL) + clone_info=DestroyImageInfo(clone_info); + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + for (i=0; i < (int) Header.Height; i++) + { + EncodedByte=ReadBlobLSBShort(image); + + ptrB=BImgBuff; + j=ldblk; + + RunCount=(unsigned char) ReadBlobByte(image); + RunCountMasked=RunCount & 0x7F; + + while ((int) RunCountMasked != 0) + { + if((ssize_t) RunCountMasked>j) + { /*Wrong Data*/ + RunCountMasked=(unsigned char) j; + if(j==0) + { + break; + } + } + + if((int) RunCount>0x80) + { + RunValue=(unsigned char) ReadBlobByte(image); + (void) memset(ptrB,(int) RunValue,(size_t) RunCountMasked); + } + else { + (void) ReadBlob(image,(size_t) RunCountMasked,ptrB); + } + + ptrB+=(int) RunCountMasked; + j-=(int) RunCountMasked; + + if (EOFBlob(image) != MagickFalse) goto Finish; /* wrong data: unexpected eof in line */ + RunCount=(unsigned char) ReadBlobByte(image); + RunCountMasked=RunCount & 0x7F; + } + + InsertRow(depth,BImgBuff,i,image); + } + (void) SyncImage(image); + + + /*detect monochrome image*/ + + if(palette==NULL) + { /*attempt to detect binary (black&white) images*/ + if ((image->storage_class == PseudoClass) && + (SetImageGray(image,&image->exception) != MagickFalse)) + { + if(GetCutColors(image)==2) + { + for (i=0; i < (ssize_t)image->colors; i++) + { + Quantum + sample; + sample=ScaleCharToQuantum((unsigned char) i); + if(image->colormap[i].red!=sample) goto Finish; + if(image->colormap[i].green!=sample) goto Finish; + if(image->colormap[i].blue!=sample) goto Finish; + } + + image->colormap[1].red=image->colormap[1].green= + image->colormap[1].blue=QuantumRange; + for (i=0; i < (ssize_t)image->rows; i++) + { + q=QueueAuthenticPixels(image,0,i,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (j=0; j < (ssize_t)image->columns; j++) + { + if (GetPixelRed(q) == ScaleCharToQuantum(1)) + { + SetPixelRed(q,QuantumRange); + SetPixelGreen(q,QuantumRange); + SetPixelBlue(q,QuantumRange); + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) goto Finish; + } + } + } + } + + Finish: + if (BImgBuff != NULL) + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + if (palette != NULL) + palette=DestroyImage(palette); + if (clone_info != NULL) + clone_info=DestroyImageInfo(clone_info); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r C U T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterCUTImage() adds attributes for the CUT image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterCUTImage method is: +% +% size_t RegisterCUTImage(void) +% +*/ +ModuleExport size_t RegisterCUTImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("CUT"); + entry->decoder=(DecodeImageHandler *) ReadCUTImage; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("DR Halo"); + entry->magick_module=ConstantString("CUT"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r C U T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterCUTImage() removes format registrations made by the +% CUT module from the list of supported formats. +% +% The format of the UnregisterCUTImage method is: +% +% UnregisterCUTImage(void) +% +*/ +ModuleExport void UnregisterCUTImage(void) +{ + (void) UnregisterMagickInfo("CUT"); +} diff --git a/ImageMagick-6.9.12-44/coders/dcm.c b/ImageMagick-6.9.12-44/coders/dcm.c new file mode 100644 index 0000000..f1a2bc9 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/dcm.c @@ -0,0 +1,4457 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD CCCC M M % +% D D C MM MM % +% D D C M M M % +% D D C M M % +% DDDD CCCC M M % +% % +% % +% Read DICOM Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/constitute.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/module.h" + + +/* + Dicom medical image declarations. +*/ + +typedef struct _DicomInfo +{ + const unsigned short + group, + element; + + const char + *vr, + *description; +} DicomInfo; + +static const DicomInfo + dicom_info[] = + { + { 0x0000, 0x0000, "UL", "Group Length" }, + { 0x0000, 0x0001, "UL", "Command Length to End" }, + { 0x0000, 0x0002, "UI", "Affected SOP Class UID" }, + { 0x0000, 0x0003, "UI", "Requested SOP Class UID" }, + { 0x0000, 0x0010, "LO", "Command Recognition Code" }, + { 0x0000, 0x0100, "US", "Command Field" }, + { 0x0000, 0x0110, "US", "Message ID" }, + { 0x0000, 0x0120, "US", "Message ID Being Responded To" }, + { 0x0000, 0x0200, "AE", "Initiator" }, + { 0x0000, 0x0300, "AE", "Receiver" }, + { 0x0000, 0x0400, "AE", "Find Location" }, + { 0x0000, 0x0600, "AE", "Move Destination" }, + { 0x0000, 0x0700, "US", "Priority" }, + { 0x0000, 0x0800, "US", "Data Set Type" }, + { 0x0000, 0x0850, "US", "Number of Matches" }, + { 0x0000, 0x0860, "US", "Response Sequence Number" }, + { 0x0000, 0x0900, "US", "Status" }, + { 0x0000, 0x0901, "AT", "Offending Element" }, + { 0x0000, 0x0902, "LO", "Exception Comment" }, + { 0x0000, 0x0903, "US", "Exception ID" }, + { 0x0000, 0x1000, "UI", "Affected SOP Instance UID" }, + { 0x0000, 0x1001, "UI", "Requested SOP Instance UID" }, + { 0x0000, 0x1002, "US", "Event Type ID" }, + { 0x0000, 0x1005, "AT", "Attribute Identifier List" }, + { 0x0000, 0x1008, "US", "Action Type ID" }, + { 0x0000, 0x1020, "US", "Number of Remaining Suboperations" }, + { 0x0000, 0x1021, "US", "Number of Completed Suboperations" }, + { 0x0000, 0x1022, "US", "Number of Failed Suboperations" }, + { 0x0000, 0x1023, "US", "Number of Warning Suboperations" }, + { 0x0000, 0x1030, "AE", "Move Originator Application Entity Title" }, + { 0x0000, 0x1031, "US", "Move Originator Message ID" }, + { 0x0000, 0x4000, "LO", "Dialog Receiver" }, + { 0x0000, 0x4010, "LO", "Terminal Type" }, + { 0x0000, 0x5010, "SH", "Message Set ID" }, + { 0x0000, 0x5020, "SH", "End Message Set" }, + { 0x0000, 0x5110, "LO", "Display Format" }, + { 0x0000, 0x5120, "LO", "Page Position ID" }, + { 0x0000, 0x5130, "LO", "Text Format ID" }, + { 0x0000, 0x5140, "LO", "Normal Reverse" }, + { 0x0000, 0x5150, "LO", "Add Gray Scale" }, + { 0x0000, 0x5160, "LO", "Borders" }, + { 0x0000, 0x5170, "IS", "Copies" }, + { 0x0000, 0x5180, "LO", "OldMagnificationType" }, + { 0x0000, 0x5190, "LO", "Erase" }, + { 0x0000, 0x51a0, "LO", "Print" }, + { 0x0000, 0x51b0, "US", "Overlays" }, + { 0x0002, 0x0000, "UL", "Meta Element Group Length" }, + { 0x0002, 0x0001, "OB", "File Meta Information Version" }, + { 0x0002, 0x0002, "UI", "Media Storage SOP Class UID" }, + { 0x0002, 0x0003, "UI", "Media Storage SOP Instance UID" }, + { 0x0002, 0x0010, "UI", "Transfer Syntax UID" }, + { 0x0002, 0x0012, "UI", "Implementation Class UID" }, + { 0x0002, 0x0013, "SH", "Implementation Version Name" }, + { 0x0002, 0x0016, "AE", "Source Application Entity Title" }, + { 0x0002, 0x0100, "UI", "Private Information Creator UID" }, + { 0x0002, 0x0102, "OB", "Private Information" }, + { 0x0003, 0x0000, "US", "?" }, + { 0x0003, 0x0008, "US", "ISI Command Field" }, + { 0x0003, 0x0011, "US", "Attach ID Application Code" }, + { 0x0003, 0x0012, "UL", "Attach ID Message Count" }, + { 0x0003, 0x0013, "DA", "Attach ID Date" }, + { 0x0003, 0x0014, "TM", "Attach ID Time" }, + { 0x0003, 0x0020, "US", "Message Type" }, + { 0x0003, 0x0030, "DA", "Max Waiting Date" }, + { 0x0003, 0x0031, "TM", "Max Waiting Time" }, + { 0x0004, 0x0000, "UL", "File Set Group Length" }, + { 0x0004, 0x1130, "CS", "File Set ID" }, + { 0x0004, 0x1141, "CS", "File Set Descriptor File ID" }, + { 0x0004, 0x1142, "CS", "File Set Descriptor File Specific Character Set" }, + { 0x0004, 0x1200, "UL", "Root Directory Entity First Directory Record Offset" }, + { 0x0004, 0x1202, "UL", "Root Directory Entity Last Directory Record Offset" }, + { 0x0004, 0x1212, "US", "File Set Consistency Flag" }, + { 0x0004, 0x1220, "SQ", "Directory Record Sequence" }, + { 0x0004, 0x1400, "UL", "Next Directory Record Offset" }, + { 0x0004, 0x1410, "US", "Record In Use Flag" }, + { 0x0004, 0x1420, "UL", "Referenced Lower Level Directory Entity Offset" }, + { 0x0004, 0x1430, "CS", "Directory Record Type" }, + { 0x0004, 0x1432, "UI", "Private Record UID" }, + { 0x0004, 0x1500, "CS", "Referenced File ID" }, + { 0x0004, 0x1504, "UL", "MRDR Directory Record Offset" }, + { 0x0004, 0x1510, "UI", "Referenced SOP Class UID In File" }, + { 0x0004, 0x1511, "UI", "Referenced SOP Instance UID In File" }, + { 0x0004, 0x1512, "UI", "Referenced Transfer Syntax UID In File" }, + { 0x0004, 0x1600, "UL", "Number of References" }, + { 0x0005, 0x0000, "US", "?" }, + { 0x0006, 0x0000, "US", "?" }, + { 0x0008, 0x0000, "UL", "Identifying Group Length" }, + { 0x0008, 0x0001, "UL", "Length to End" }, + { 0x0008, 0x0005, "CS", "Specific Character Set" }, + { 0x0008, 0x0008, "CS", "Image Type" }, + { 0x0008, 0x0010, "LO", "Recognition Code" }, + { 0x0008, 0x0012, "DA", "Instance Creation Date" }, + { 0x0008, 0x0013, "TM", "Instance Creation Time" }, + { 0x0008, 0x0014, "UI", "Instance Creator UID" }, + { 0x0008, 0x0016, "UI", "SOP Class UID" }, + { 0x0008, 0x0018, "UI", "SOP Instance UID" }, + { 0x0008, 0x0020, "DA", "Study Date" }, + { 0x0008, 0x0021, "DA", "Series Date" }, + { 0x0008, 0x0022, "DA", "Acquisition Date" }, + { 0x0008, 0x0023, "DA", "Image Date" }, + { 0x0008, 0x0024, "DA", "Overlay Date" }, + { 0x0008, 0x0025, "DA", "Curve Date" }, + { 0x0008, 0x002A, "DT", "Acquisition DateTime" }, + { 0x0008, 0x0030, "TM", "Study Time" }, + { 0x0008, 0x0031, "TM", "Series Time" }, + { 0x0008, 0x0032, "TM", "Acquisition Time" }, + { 0x0008, 0x0033, "TM", "Image Time" }, + { 0x0008, 0x0034, "TM", "Overlay Time" }, + { 0x0008, 0x0035, "TM", "Curve Time" }, + { 0x0008, 0x0040, "xs", "Old Data Set Type" }, + { 0x0008, 0x0041, "xs", "Old Data Set Subtype" }, + { 0x0008, 0x0042, "CS", "Nuclear Medicine Series Type" }, + { 0x0008, 0x0050, "SH", "Accession Number" }, + { 0x0008, 0x0052, "CS", "Query/Retrieve Level" }, + { 0x0008, 0x0054, "AE", "Retrieve AE Title" }, + { 0x0008, 0x0058, "UI", "Failed SOP Instance UID List" }, + { 0x0008, 0x0060, "CS", "Modality" }, + { 0x0008, 0x0062, "SQ", "Modality Subtype" }, + { 0x0008, 0x0064, "CS", "Conversion Type" }, + { 0x0008, 0x0068, "CS", "Presentation Intent Type" }, + { 0x0008, 0x0070, "LO", "Manufacturer" }, + { 0x0008, 0x0080, "LO", "Institution Name" }, + { 0x0008, 0x0081, "ST", "Institution Address" }, + { 0x0008, 0x0082, "SQ", "Institution Code Sequence" }, + { 0x0008, 0x0090, "PN", "Referring Physician's Name" }, + { 0x0008, 0x0092, "ST", "Referring Physician's Address" }, + { 0x0008, 0x0094, "SH", "Referring Physician's Telephone Numbers" }, + { 0x0008, 0x0100, "SH", "Code Value" }, + { 0x0008, 0x0102, "SH", "Coding Scheme Designator" }, + { 0x0008, 0x0103, "SH", "Coding Scheme Version" }, + { 0x0008, 0x0104, "LO", "Code Meaning" }, + { 0x0008, 0x0105, "CS", "Mapping Resource" }, + { 0x0008, 0x0106, "DT", "Context Group Version" }, + { 0x0008, 0x010b, "CS", "Code Set Extension Flag" }, + { 0x0008, 0x010c, "UI", "Private Coding Scheme Creator UID" }, + { 0x0008, 0x010d, "UI", "Code Set Extension Creator UID" }, + { 0x0008, 0x010f, "CS", "Context Identifier" }, + { 0x0008, 0x1000, "LT", "Network ID" }, + { 0x0008, 0x1010, "SH", "Station Name" }, + { 0x0008, 0x1030, "LO", "Study Description" }, + { 0x0008, 0x1032, "SQ", "Procedure Code Sequence" }, + { 0x0008, 0x103e, "LO", "Series Description" }, + { 0x0008, 0x1040, "LO", "Institutional Department Name" }, + { 0x0008, 0x1048, "PN", "Physician of Record" }, + { 0x0008, 0x1050, "PN", "Performing Physician's Name" }, + { 0x0008, 0x1060, "PN", "Name of Physician(s) Reading Study" }, + { 0x0008, 0x1070, "PN", "Operator's Name" }, + { 0x0008, 0x1080, "LO", "Admitting Diagnosis Description" }, + { 0x0008, 0x1084, "SQ", "Admitting Diagnosis Code Sequence" }, + { 0x0008, 0x1090, "LO", "Manufacturer's Model Name" }, + { 0x0008, 0x1100, "SQ", "Referenced Results Sequence" }, + { 0x0008, 0x1110, "SQ", "Referenced Study Sequence" }, + { 0x0008, 0x1111, "SQ", "Referenced Study Component Sequence" }, + { 0x0008, 0x1115, "SQ", "Referenced Series Sequence" }, + { 0x0008, 0x1120, "SQ", "Referenced Patient Sequence" }, + { 0x0008, 0x1125, "SQ", "Referenced Visit Sequence" }, + { 0x0008, 0x1130, "SQ", "Referenced Overlay Sequence" }, + { 0x0008, 0x1140, "SQ", "Referenced Image Sequence" }, + { 0x0008, 0x1145, "SQ", "Referenced Curve Sequence" }, + { 0x0008, 0x1148, "SQ", "Referenced Previous Waveform" }, + { 0x0008, 0x114a, "SQ", "Referenced Simultaneous Waveforms" }, + { 0x0008, 0x114c, "SQ", "Referenced Subsequent Waveform" }, + { 0x0008, 0x1150, "UI", "Referenced SOP Class UID" }, + { 0x0008, 0x1155, "UI", "Referenced SOP Instance UID" }, + { 0x0008, 0x1160, "IS", "Referenced Frame Number" }, + { 0x0008, 0x1195, "UI", "Transaction UID" }, + { 0x0008, 0x1197, "US", "Failure Reason" }, + { 0x0008, 0x1198, "SQ", "Failed SOP Sequence" }, + { 0x0008, 0x1199, "SQ", "Referenced SOP Sequence" }, + { 0x0008, 0x2110, "CS", "Old Lossy Image Compression" }, + { 0x0008, 0x2111, "ST", "Derivation Description" }, + { 0x0008, 0x2112, "SQ", "Source Image Sequence" }, + { 0x0008, 0x2120, "SH", "Stage Name" }, + { 0x0008, 0x2122, "IS", "Stage Number" }, + { 0x0008, 0x2124, "IS", "Number of Stages" }, + { 0x0008, 0x2128, "IS", "View Number" }, + { 0x0008, 0x2129, "IS", "Number of Event Timers" }, + { 0x0008, 0x212a, "IS", "Number of Views in Stage" }, + { 0x0008, 0x2130, "DS", "Event Elapsed Time(s)" }, + { 0x0008, 0x2132, "LO", "Event Timer Name(s)" }, + { 0x0008, 0x2142, "IS", "Start Trim" }, + { 0x0008, 0x2143, "IS", "Stop Trim" }, + { 0x0008, 0x2144, "IS", "Recommended Display Frame Rate" }, + { 0x0008, 0x2200, "CS", "Transducer Position" }, + { 0x0008, 0x2204, "CS", "Transducer Orientation" }, + { 0x0008, 0x2208, "CS", "Anatomic Structure" }, + { 0x0008, 0x2218, "SQ", "Anatomic Region Sequence" }, + { 0x0008, 0x2220, "SQ", "Anatomic Region Modifier Sequence" }, + { 0x0008, 0x2228, "SQ", "Primary Anatomic Structure Sequence" }, + { 0x0008, 0x2230, "SQ", "Primary Anatomic Structure Modifier Sequence" }, + { 0x0008, 0x2240, "SQ", "Transducer Position Sequence" }, + { 0x0008, 0x2242, "SQ", "Transducer Position Modifier Sequence" }, + { 0x0008, 0x2244, "SQ", "Transducer Orientation Sequence" }, + { 0x0008, 0x2246, "SQ", "Transducer Orientation Modifier Sequence" }, + { 0x0008, 0x2251, "SQ", "Anatomic Structure Space Or Region Code Sequence" }, + { 0x0008, 0x2253, "SQ", "Anatomic Portal Of Entrance Code Sequence" }, + { 0x0008, 0x2255, "SQ", "Anatomic Approach Direction Code Sequence" }, + { 0x0008, 0x2256, "ST", "Anatomic Perspective Description" }, + { 0x0008, 0x2257, "SQ", "Anatomic Perspective Code Sequence" }, + { 0x0008, 0x2258, "ST", "Anatomic Location Of Examining Instrument Description" }, + { 0x0008, 0x2259, "SQ", "Anatomic Location Of Examining Instrument Code Sequence" }, + { 0x0008, 0x225a, "SQ", "Anatomic Structure Space Or Region Modifier Code Sequence" }, + { 0x0008, 0x225c, "SQ", "OnAxis Background Anatomic Structure Code Sequence" }, + { 0x0008, 0x4000, "LT", "Identifying Comments" }, + { 0x0009, 0x0000, "xs", "?" }, + { 0x0009, 0x0001, "xs", "?" }, + { 0x0009, 0x0002, "xs", "?" }, + { 0x0009, 0x0003, "xs", "?" }, + { 0x0009, 0x0004, "xs", "?" }, + { 0x0009, 0x0005, "UN", "?" }, + { 0x0009, 0x0006, "UN", "?" }, + { 0x0009, 0x0007, "UN", "?" }, + { 0x0009, 0x0008, "xs", "?" }, + { 0x0009, 0x0009, "LT", "?" }, + { 0x0009, 0x000a, "IS", "?" }, + { 0x0009, 0x000b, "IS", "?" }, + { 0x0009, 0x000c, "IS", "?" }, + { 0x0009, 0x000d, "IS", "?" }, + { 0x0009, 0x000e, "IS", "?" }, + { 0x0009, 0x000f, "UN", "?" }, + { 0x0009, 0x0010, "xs", "?" }, + { 0x0009, 0x0011, "xs", "?" }, + { 0x0009, 0x0012, "xs", "?" }, + { 0x0009, 0x0013, "xs", "?" }, + { 0x0009, 0x0014, "xs", "?" }, + { 0x0009, 0x0015, "xs", "?" }, + { 0x0009, 0x0016, "xs", "?" }, + { 0x0009, 0x0017, "LT", "?" }, + { 0x0009, 0x0018, "LT", "Data Set Identifier" }, + { 0x0009, 0x001a, "US", "?" }, + { 0x0009, 0x001e, "UI", "?" }, + { 0x0009, 0x0020, "xs", "?" }, + { 0x0009, 0x0021, "xs", "?" }, + { 0x0009, 0x0022, "SH", "User Orientation" }, + { 0x0009, 0x0023, "SL", "Initiation Type" }, + { 0x0009, 0x0024, "xs", "?" }, + { 0x0009, 0x0025, "xs", "?" }, + { 0x0009, 0x0026, "xs", "?" }, + { 0x0009, 0x0027, "xs", "?" }, + { 0x0009, 0x0029, "xs", "?" }, + { 0x0009, 0x002a, "SL", "?" }, + { 0x0009, 0x002c, "LO", "Series Comments" }, + { 0x0009, 0x002d, "SL", "Track Beat Average" }, + { 0x0009, 0x002e, "FD", "Distance Prescribed" }, + { 0x0009, 0x002f, "LT", "?" }, + { 0x0009, 0x0030, "xs", "?" }, + { 0x0009, 0x0031, "xs", "?" }, + { 0x0009, 0x0032, "LT", "?" }, + { 0x0009, 0x0034, "xs", "?" }, + { 0x0009, 0x0035, "SL", "Gantry Locus Type" }, + { 0x0009, 0x0037, "SL", "Starting Heart Rate" }, + { 0x0009, 0x0038, "xs", "?" }, + { 0x0009, 0x0039, "SL", "RR Window Offset" }, + { 0x0009, 0x003a, "SL", "Percent Cycle Imaged" }, + { 0x0009, 0x003e, "US", "?" }, + { 0x0009, 0x003f, "US", "?" }, + { 0x0009, 0x0040, "xs", "?" }, + { 0x0009, 0x0041, "xs", "?" }, + { 0x0009, 0x0042, "xs", "?" }, + { 0x0009, 0x0043, "xs", "?" }, + { 0x0009, 0x0050, "LT", "?" }, + { 0x0009, 0x0051, "xs", "?" }, + { 0x0009, 0x0060, "LT", "?" }, + { 0x0009, 0x0061, "LT", "Series Unique Identifier" }, + { 0x0009, 0x0070, "LT", "?" }, + { 0x0009, 0x0080, "LT", "?" }, + { 0x0009, 0x0091, "LT", "?" }, + { 0x0009, 0x00e2, "LT", "?" }, + { 0x0009, 0x00e3, "UI", "Equipment UID" }, + { 0x0009, 0x00e6, "SH", "Genesis Version Now" }, + { 0x0009, 0x00e7, "UL", "Exam Record Checksum" }, + { 0x0009, 0x00e8, "UL", "?" }, + { 0x0009, 0x00e9, "SL", "Actual Series Data Time Stamp" }, + { 0x0009, 0x00f2, "UN", "?" }, + { 0x0009, 0x00f3, "UN", "?" }, + { 0x0009, 0x00f4, "LT", "?" }, + { 0x0009, 0x00f5, "xs", "?" }, + { 0x0009, 0x00f6, "LT", "PDM Data Object Type Extension" }, + { 0x0009, 0x00f8, "US", "?" }, + { 0x0009, 0x00fb, "IS", "?" }, + { 0x0009, 0x1002, "OB", "?" }, + { 0x0009, 0x1003, "OB", "?" }, + { 0x0009, 0x1010, "UN", "?" }, + { 0x0010, 0x0000, "UL", "Patient Group Length" }, + { 0x0010, 0x0010, "PN", "Patient's Name" }, + { 0x0010, 0x0020, "LO", "Patient's ID" }, + { 0x0010, 0x0021, "LO", "Issuer of Patient's ID" }, + { 0x0010, 0x0030, "DA", "Patient's Birth Date" }, + { 0x0010, 0x0032, "TM", "Patient's Birth Time" }, + { 0x0010, 0x0040, "CS", "Patient's Sex" }, + { 0x0010, 0x0050, "SQ", "Patient's Insurance Plan Code Sequence" }, + { 0x0010, 0x1000, "LO", "Other Patient's ID's" }, + { 0x0010, 0x1001, "PN", "Other Patient's Names" }, + { 0x0010, 0x1005, "PN", "Patient's Birth Name" }, + { 0x0010, 0x1010, "AS", "Patient's Age" }, + { 0x0010, 0x1020, "DS", "Patient's Size" }, + { 0x0010, 0x1030, "DS", "Patient's Weight" }, + { 0x0010, 0x1040, "LO", "Patient's Address" }, + { 0x0010, 0x1050, "LT", "Insurance Plan Identification" }, + { 0x0010, 0x1060, "PN", "Patient's Mother's Birth Name" }, + { 0x0010, 0x1080, "LO", "Military Rank" }, + { 0x0010, 0x1081, "LO", "Branch of Service" }, + { 0x0010, 0x1090, "LO", "Medical Record Locator" }, + { 0x0010, 0x2000, "LO", "Medical Alerts" }, + { 0x0010, 0x2110, "LO", "Contrast Allergies" }, + { 0x0010, 0x2150, "LO", "Country of Residence" }, + { 0x0010, 0x2152, "LO", "Region of Residence" }, + { 0x0010, 0x2154, "SH", "Patients Telephone Numbers" }, + { 0x0010, 0x2160, "SH", "Ethnic Group" }, + { 0x0010, 0x2180, "SH", "Occupation" }, + { 0x0010, 0x21a0, "CS", "Smoking Status" }, + { 0x0010, 0x21b0, "LT", "Additional Patient History" }, + { 0x0010, 0x21c0, "US", "Pregnancy Status" }, + { 0x0010, 0x21d0, "DA", "Last Menstrual Date" }, + { 0x0010, 0x21f0, "LO", "Patients Religious Preference" }, + { 0x0010, 0x4000, "LT", "Patient Comments" }, + { 0x0011, 0x0001, "xs", "?" }, + { 0x0011, 0x0002, "US", "?" }, + { 0x0011, 0x0003, "LT", "Patient UID" }, + { 0x0011, 0x0004, "LT", "Patient ID" }, + { 0x0011, 0x000a, "xs", "?" }, + { 0x0011, 0x000b, "SL", "Effective Series Duration" }, + { 0x0011, 0x000c, "SL", "Num Beats" }, + { 0x0011, 0x000d, "LO", "Radio Nuclide Name" }, + { 0x0011, 0x0010, "xs", "?" }, + { 0x0011, 0x0011, "xs", "?" }, + { 0x0011, 0x0012, "LO", "Dataset Name" }, + { 0x0011, 0x0013, "LO", "Dataset Type" }, + { 0x0011, 0x0015, "xs", "?" }, + { 0x0011, 0x0016, "SL", "Energy Number" }, + { 0x0011, 0x0017, "SL", "RR Interval Window Number" }, + { 0x0011, 0x0018, "SL", "MG Bin Number" }, + { 0x0011, 0x0019, "FD", "Radius Of Rotation" }, + { 0x0011, 0x001a, "SL", "Detector Count Zone" }, + { 0x0011, 0x001b, "SL", "Num Energy Windows" }, + { 0x0011, 0x001c, "SL", "Energy Offset" }, + { 0x0011, 0x001d, "SL", "Energy Range" }, + { 0x0011, 0x001f, "SL", "Image Orientation" }, + { 0x0011, 0x0020, "xs", "?" }, + { 0x0011, 0x0021, "xs", "?" }, + { 0x0011, 0x0022, "xs", "?" }, + { 0x0011, 0x0023, "xs", "?" }, + { 0x0011, 0x0024, "SL", "FOV Mask Y Cutoff Angle" }, + { 0x0011, 0x0025, "xs", "?" }, + { 0x0011, 0x0026, "SL", "Table Orientation" }, + { 0x0011, 0x0027, "SL", "ROI Top Left" }, + { 0x0011, 0x0028, "SL", "ROI Bottom Right" }, + { 0x0011, 0x0030, "xs", "?" }, + { 0x0011, 0x0031, "xs", "?" }, + { 0x0011, 0x0032, "UN", "?" }, + { 0x0011, 0x0033, "LO", "Energy Correct Name" }, + { 0x0011, 0x0034, "LO", "Spatial Correct Name" }, + { 0x0011, 0x0035, "xs", "?" }, + { 0x0011, 0x0036, "LO", "Uniformity Correct Name" }, + { 0x0011, 0x0037, "LO", "Acquisition Specific Correct Name" }, + { 0x0011, 0x0038, "SL", "Byte Order" }, + { 0x0011, 0x003a, "SL", "Picture Format" }, + { 0x0011, 0x003b, "FD", "Pixel Scale" }, + { 0x0011, 0x003c, "FD", "Pixel Offset" }, + { 0x0011, 0x003e, "SL", "FOV Shape" }, + { 0x0011, 0x003f, "SL", "Dataset Flags" }, + { 0x0011, 0x0040, "xs", "?" }, + { 0x0011, 0x0041, "LT", "Medical Alerts" }, + { 0x0011, 0x0042, "LT", "Contrast Allergies" }, + { 0x0011, 0x0044, "FD", "Threshold Center" }, + { 0x0011, 0x0045, "FD", "Threshold Width" }, + { 0x0011, 0x0046, "SL", "Interpolation Type" }, + { 0x0011, 0x0055, "FD", "Period" }, + { 0x0011, 0x0056, "FD", "ElapsedTime" }, + { 0x0011, 0x00a1, "DA", "Patient Registration Date" }, + { 0x0011, 0x00a2, "TM", "Patient Registration Time" }, + { 0x0011, 0x00b0, "LT", "Patient Last Name" }, + { 0x0011, 0x00b2, "LT", "Patient First Name" }, + { 0x0011, 0x00b4, "LT", "Patient Hospital Status" }, + { 0x0011, 0x00bc, "TM", "Current Location Time" }, + { 0x0011, 0x00c0, "LT", "Patient Insurance Status" }, + { 0x0011, 0x00d0, "LT", "Patient Billing Type" }, + { 0x0011, 0x00d2, "LT", "Patient Billing Address" }, + { 0x0013, 0x0000, "LT", "Modifying Physician" }, + { 0x0013, 0x0010, "xs", "?" }, + { 0x0013, 0x0011, "SL", "?" }, + { 0x0013, 0x0012, "xs", "?" }, + { 0x0013, 0x0016, "SL", "AutoTrack Peak" }, + { 0x0013, 0x0017, "SL", "AutoTrack Width" }, + { 0x0013, 0x0018, "FD", "Transmission Scan Time" }, + { 0x0013, 0x0019, "FD", "Transmission Mask Width" }, + { 0x0013, 0x001a, "FD", "Copper Attenuator Thickness" }, + { 0x0013, 0x001c, "FD", "?" }, + { 0x0013, 0x001d, "FD", "?" }, + { 0x0013, 0x001e, "FD", "Tomo View Offset" }, + { 0x0013, 0x0020, "LT", "Patient Name" }, + { 0x0013, 0x0022, "LT", "Patient Id" }, + { 0x0013, 0x0026, "LT", "Study Comments" }, + { 0x0013, 0x0030, "DA", "Patient Birthdate" }, + { 0x0013, 0x0031, "DS", "Patient Weight" }, + { 0x0013, 0x0032, "LT", "Patients Maiden Name" }, + { 0x0013, 0x0033, "LT", "Referring Physician" }, + { 0x0013, 0x0034, "LT", "Admitting Diagnosis" }, + { 0x0013, 0x0035, "LT", "Patient Sex" }, + { 0x0013, 0x0040, "LT", "Procedure Description" }, + { 0x0013, 0x0042, "LT", "Patient Rest Direction" }, + { 0x0013, 0x0044, "LT", "Patient Position" }, + { 0x0013, 0x0046, "LT", "View Direction" }, + { 0x0015, 0x0001, "DS", "Stenosis Calibration Ratio" }, + { 0x0015, 0x0002, "DS", "Stenosis Magnification" }, + { 0x0015, 0x0003, "DS", "Cardiac Calibration Ratio" }, + { 0x0018, 0x0000, "UL", "Acquisition Group Length" }, + { 0x0018, 0x0010, "LO", "Contrast/Bolus Agent" }, + { 0x0018, 0x0012, "SQ", "Contrast/Bolus Agent Sequence" }, + { 0x0018, 0x0014, "SQ", "Contrast/Bolus Administration Route Sequence" }, + { 0x0018, 0x0015, "CS", "Body Part Examined" }, + { 0x0018, 0x0020, "CS", "Scanning Sequence" }, + { 0x0018, 0x0021, "CS", "Sequence Variant" }, + { 0x0018, 0x0022, "CS", "Scan Options" }, + { 0x0018, 0x0023, "CS", "MR Acquisition Type" }, + { 0x0018, 0x0024, "SH", "Sequence Name" }, + { 0x0018, 0x0025, "CS", "Angio Flag" }, + { 0x0018, 0x0026, "SQ", "Intervention Drug Information Sequence" }, + { 0x0018, 0x0027, "TM", "Intervention Drug Stop Time" }, + { 0x0018, 0x0028, "DS", "Intervention Drug Dose" }, + { 0x0018, 0x0029, "SQ", "Intervention Drug Code Sequence" }, + { 0x0018, 0x002a, "SQ", "Additional Drug Sequence" }, + { 0x0018, 0x0030, "LO", "Radionuclide" }, + { 0x0018, 0x0031, "LO", "Radiopharmaceutical" }, + { 0x0018, 0x0032, "DS", "Energy Window Centerline" }, + { 0x0018, 0x0033, "DS", "Energy Window Total Width" }, + { 0x0018, 0x0034, "LO", "Intervention Drug Name" }, + { 0x0018, 0x0035, "TM", "Intervention Drug Start Time" }, + { 0x0018, 0x0036, "SQ", "Intervention Therapy Sequence" }, + { 0x0018, 0x0037, "CS", "Therapy Type" }, + { 0x0018, 0x0038, "CS", "Intervention Status" }, + { 0x0018, 0x0039, "CS", "Therapy Description" }, + { 0x0018, 0x0040, "IS", "Cine Rate" }, + { 0x0018, 0x0050, "DS", "Slice Thickness" }, + { 0x0018, 0x0060, "DS", "KVP" }, + { 0x0018, 0x0070, "IS", "Counts Accumulated" }, + { 0x0018, 0x0071, "CS", "Acquisition Termination Condition" }, + { 0x0018, 0x0072, "DS", "Effective Series Duration" }, + { 0x0018, 0x0073, "CS", "Acquisition Start Condition" }, + { 0x0018, 0x0074, "IS", "Acquisition Start Condition Data" }, + { 0x0018, 0x0075, "IS", "Acquisition Termination Condition Data" }, + { 0x0018, 0x0080, "DS", "Repetition Time" }, + { 0x0018, 0x0081, "DS", "Echo Time" }, + { 0x0018, 0x0082, "DS", "Inversion Time" }, + { 0x0018, 0x0083, "DS", "Number of Averages" }, + { 0x0018, 0x0084, "DS", "Imaging Frequency" }, + { 0x0018, 0x0085, "SH", "Imaged Nucleus" }, + { 0x0018, 0x0086, "IS", "Echo Number(s)" }, + { 0x0018, 0x0087, "DS", "Magnetic Field Strength" }, + { 0x0018, 0x0088, "DS", "Spacing Between Slices" }, + { 0x0018, 0x0089, "IS", "Number of Phase Encoding Steps" }, + { 0x0018, 0x0090, "DS", "Data Collection Diameter" }, + { 0x0018, 0x0091, "IS", "Echo Train Length" }, + { 0x0018, 0x0093, "DS", "Percent Sampling" }, + { 0x0018, 0x0094, "DS", "Percent Phase Field of View" }, + { 0x0018, 0x0095, "DS", "Pixel Bandwidth" }, + { 0x0018, 0x1000, "LO", "Device Serial Number" }, + { 0x0018, 0x1004, "LO", "Plate ID" }, + { 0x0018, 0x1010, "LO", "Secondary Capture Device ID" }, + { 0x0018, 0x1012, "DA", "Date of Secondary Capture" }, + { 0x0018, 0x1014, "TM", "Time of Secondary Capture" }, + { 0x0018, 0x1016, "LO", "Secondary Capture Device Manufacturer" }, + { 0x0018, 0x1018, "LO", "Secondary Capture Device Manufacturer Model Name" }, + { 0x0018, 0x1019, "LO", "Secondary Capture Device Software Version(s)" }, + { 0x0018, 0x1020, "LO", "Software Version(s)" }, + { 0x0018, 0x1022, "SH", "Video Image Format Acquired" }, + { 0x0018, 0x1023, "LO", "Digital Image Format Acquired" }, + { 0x0018, 0x1030, "LO", "Protocol Name" }, + { 0x0018, 0x1040, "LO", "Contrast/Bolus Route" }, + { 0x0018, 0x1041, "DS", "Contrast/Bolus Volume" }, + { 0x0018, 0x1042, "TM", "Contrast/Bolus Start Time" }, + { 0x0018, 0x1043, "TM", "Contrast/Bolus Stop Time" }, + { 0x0018, 0x1044, "DS", "Contrast/Bolus Total Dose" }, + { 0x0018, 0x1045, "IS", "Syringe Counts" }, + { 0x0018, 0x1046, "DS", "Contrast Flow Rate" }, + { 0x0018, 0x1047, "DS", "Contrast Flow Duration" }, + { 0x0018, 0x1048, "CS", "Contrast/Bolus Ingredient" }, + { 0x0018, 0x1049, "DS", "Contrast/Bolus Ingredient Concentration" }, + { 0x0018, 0x1050, "DS", "Spatial Resolution" }, + { 0x0018, 0x1060, "DS", "Trigger Time" }, + { 0x0018, 0x1061, "LO", "Trigger Source or Type" }, + { 0x0018, 0x1062, "IS", "Nominal Interval" }, + { 0x0018, 0x1063, "DS", "Frame Time" }, + { 0x0018, 0x1064, "LO", "Framing Type" }, + { 0x0018, 0x1065, "DS", "Frame Time Vector" }, + { 0x0018, 0x1066, "DS", "Frame Delay" }, + { 0x0018, 0x1067, "DS", "Image Trigger Delay" }, + { 0x0018, 0x1068, "DS", "Group Time Offset" }, + { 0x0018, 0x1069, "DS", "Trigger Time Offset" }, + { 0x0018, 0x106a, "CS", "Synchronization Trigger" }, + { 0x0018, 0x106b, "UI", "Synchronization Frame of Reference" }, + { 0x0018, 0x106e, "UL", "Trigger Sample Position" }, + { 0x0018, 0x1070, "LO", "Radiopharmaceutical Route" }, + { 0x0018, 0x1071, "DS", "Radiopharmaceutical Volume" }, + { 0x0018, 0x1072, "TM", "Radiopharmaceutical Start Time" }, + { 0x0018, 0x1073, "TM", "Radiopharmaceutical Stop Time" }, + { 0x0018, 0x1074, "DS", "Radionuclide Total Dose" }, + { 0x0018, 0x1075, "DS", "Radionuclide Half Life" }, + { 0x0018, 0x1076, "DS", "Radionuclide Positron Fraction" }, + { 0x0018, 0x1077, "DS", "Radiopharmaceutical Specific Activity" }, + { 0x0018, 0x1080, "CS", "Beat Rejection Flag" }, + { 0x0018, 0x1081, "IS", "Low R-R Value" }, + { 0x0018, 0x1082, "IS", "High R-R Value" }, + { 0x0018, 0x1083, "IS", "Intervals Acquired" }, + { 0x0018, 0x1084, "IS", "Intervals Rejected" }, + { 0x0018, 0x1085, "LO", "PVC Rejection" }, + { 0x0018, 0x1086, "IS", "Skip Beats" }, + { 0x0018, 0x1088, "IS", "Heart Rate" }, + { 0x0018, 0x1090, "IS", "Cardiac Number of Images" }, + { 0x0018, 0x1094, "IS", "Trigger Window" }, + { 0x0018, 0x1100, "DS", "Reconstruction Diameter" }, + { 0x0018, 0x1110, "DS", "Distance Source to Detector" }, + { 0x0018, 0x1111, "DS", "Distance Source to Patient" }, + { 0x0018, 0x1114, "DS", "Estimated Radiographic Magnification Factor" }, + { 0x0018, 0x1120, "DS", "Gantry/Detector Tilt" }, + { 0x0018, 0x1121, "DS", "Gantry/Detector Slew" }, + { 0x0018, 0x1130, "DS", "Table Height" }, + { 0x0018, 0x1131, "DS", "Table Traverse" }, + { 0x0018, 0x1134, "CS", "Table Motion" }, + { 0x0018, 0x1135, "DS", "Table Vertical Increment" }, + { 0x0018, 0x1136, "DS", "Table Lateral Increment" }, + { 0x0018, 0x1137, "DS", "Table Longitudinal Increment" }, + { 0x0018, 0x1138, "DS", "Table Angle" }, + { 0x0018, 0x113a, "CS", "Table Type" }, + { 0x0018, 0x1140, "CS", "Rotation Direction" }, + { 0x0018, 0x1141, "DS", "Angular Position" }, + { 0x0018, 0x1142, "DS", "Radial Position" }, + { 0x0018, 0x1143, "DS", "Scan Arc" }, + { 0x0018, 0x1144, "DS", "Angular Step" }, + { 0x0018, 0x1145, "DS", "Center of Rotation Offset" }, + { 0x0018, 0x1146, "DS", "Rotation Offset" }, + { 0x0018, 0x1147, "CS", "Field of View Shape" }, + { 0x0018, 0x1149, "IS", "Field of View Dimension(s)" }, + { 0x0018, 0x1150, "IS", "Exposure Time" }, + { 0x0018, 0x1151, "IS", "X-ray Tube Current" }, + { 0x0018, 0x1152, "IS", "Exposure" }, + { 0x0018, 0x1153, "IS", "Exposure in uAs" }, + { 0x0018, 0x1154, "DS", "AveragePulseWidth" }, + { 0x0018, 0x1155, "CS", "RadiationSetting" }, + { 0x0018, 0x1156, "CS", "Rectification Type" }, + { 0x0018, 0x115a, "CS", "RadiationMode" }, + { 0x0018, 0x115e, "DS", "ImageAreaDoseProduct" }, + { 0x0018, 0x1160, "SH", "Filter Type" }, + { 0x0018, 0x1161, "LO", "TypeOfFilters" }, + { 0x0018, 0x1162, "DS", "IntensifierSize" }, + { 0x0018, 0x1164, "DS", "ImagerPixelSpacing" }, + { 0x0018, 0x1166, "CS", "Grid" }, + { 0x0018, 0x1170, "IS", "Generator Power" }, + { 0x0018, 0x1180, "SH", "Collimator/Grid Name" }, + { 0x0018, 0x1181, "CS", "Collimator Type" }, + { 0x0018, 0x1182, "IS", "Focal Distance" }, + { 0x0018, 0x1183, "DS", "X Focus Center" }, + { 0x0018, 0x1184, "DS", "Y Focus Center" }, + { 0x0018, 0x1190, "DS", "Focal Spot(s)" }, + { 0x0018, 0x1191, "CS", "Anode Target Material" }, + { 0x0018, 0x11a0, "DS", "Body Part Thickness" }, + { 0x0018, 0x11a2, "DS", "Compression Force" }, + { 0x0018, 0x1200, "DA", "Date of Last Calibration" }, + { 0x0018, 0x1201, "TM", "Time of Last Calibration" }, + { 0x0018, 0x1210, "SH", "Convolution Kernel" }, + { 0x0018, 0x1240, "IS", "Upper/Lower Pixel Values" }, + { 0x0018, 0x1242, "IS", "Actual Frame Duration" }, + { 0x0018, 0x1243, "IS", "Count Rate" }, + { 0x0018, 0x1244, "US", "Preferred Playback Sequencing" }, + { 0x0018, 0x1250, "SH", "Receiving Coil" }, + { 0x0018, 0x1251, "SH", "Transmitting Coil" }, + { 0x0018, 0x1260, "SH", "Plate Type" }, + { 0x0018, 0x1261, "LO", "Phosphor Type" }, + { 0x0018, 0x1300, "DS", "Scan Velocity" }, + { 0x0018, 0x1301, "CS", "Whole Body Technique" }, + { 0x0018, 0x1302, "IS", "Scan Length" }, + { 0x0018, 0x1310, "US", "Acquisition Matrix" }, + { 0x0018, 0x1312, "CS", "Phase Encoding Direction" }, + { 0x0018, 0x1314, "DS", "Flip Angle" }, + { 0x0018, 0x1315, "CS", "Variable Flip Angle Flag" }, + { 0x0018, 0x1316, "DS", "SAR" }, + { 0x0018, 0x1318, "DS", "dB/dt" }, + { 0x0018, 0x1400, "LO", "Acquisition Device Processing Description" }, + { 0x0018, 0x1401, "LO", "Acquisition Device Processing Code" }, + { 0x0018, 0x1402, "CS", "Cassette Orientation" }, + { 0x0018, 0x1403, "CS", "Cassette Size" }, + { 0x0018, 0x1404, "US", "Exposures on Plate" }, + { 0x0018, 0x1405, "IS", "Relative X-ray Exposure" }, + { 0x0018, 0x1450, "DS", "Column Angulation" }, + { 0x0018, 0x1460, "DS", "Tomo Layer Height" }, + { 0x0018, 0x1470, "DS", "Tomo Angle" }, + { 0x0018, 0x1480, "DS", "Tomo Time" }, + { 0x0018, 0x1490, "CS", "Tomo Type" }, + { 0x0018, 0x1491, "CS", "Tomo Class" }, + { 0x0018, 0x1495, "IS", "Number of Tomosynthesis Source Images" }, + { 0x0018, 0x1500, "CS", "PositionerMotion" }, + { 0x0018, 0x1508, "CS", "Positioner Type" }, + { 0x0018, 0x1510, "DS", "PositionerPrimaryAngle" }, + { 0x0018, 0x1511, "DS", "PositionerSecondaryAngle" }, + { 0x0018, 0x1520, "DS", "PositionerPrimaryAngleIncrement" }, + { 0x0018, 0x1521, "DS", "PositionerSecondaryAngleIncrement" }, + { 0x0018, 0x1530, "DS", "DetectorPrimaryAngle" }, + { 0x0018, 0x1531, "DS", "DetectorSecondaryAngle" }, + { 0x0018, 0x1600, "CS", "Shutter Shape" }, + { 0x0018, 0x1602, "IS", "Shutter Left Vertical Edge" }, + { 0x0018, 0x1604, "IS", "Shutter Right Vertical Edge" }, + { 0x0018, 0x1606, "IS", "Shutter Upper Horizontal Edge" }, + { 0x0018, 0x1608, "IS", "Shutter Lower Horizonta lEdge" }, + { 0x0018, 0x1610, "IS", "Center of Circular Shutter" }, + { 0x0018, 0x1612, "IS", "Radius of Circular Shutter" }, + { 0x0018, 0x1620, "IS", "Vertices of Polygonal Shutter" }, + { 0x0018, 0x1622, "US", "Shutter Presentation Value" }, + { 0x0018, 0x1623, "US", "Shutter Overlay Group" }, + { 0x0018, 0x1700, "CS", "Collimator Shape" }, + { 0x0018, 0x1702, "IS", "Collimator Left Vertical Edge" }, + { 0x0018, 0x1704, "IS", "Collimator Right Vertical Edge" }, + { 0x0018, 0x1706, "IS", "Collimator Upper Horizontal Edge" }, + { 0x0018, 0x1708, "IS", "Collimator Lower Horizontal Edge" }, + { 0x0018, 0x1710, "IS", "Center of Circular Collimator" }, + { 0x0018, 0x1712, "IS", "Radius of Circular Collimator" }, + { 0x0018, 0x1720, "IS", "Vertices of Polygonal Collimator" }, + { 0x0018, 0x1800, "CS", "Acquisition Time Synchronized" }, + { 0x0018, 0x1801, "SH", "Time Source" }, + { 0x0018, 0x1802, "CS", "Time Distribution Protocol" }, + { 0x0018, 0x4000, "LT", "Acquisition Comments" }, + { 0x0018, 0x5000, "SH", "Output Power" }, + { 0x0018, 0x5010, "LO", "Transducer Data" }, + { 0x0018, 0x5012, "DS", "Focus Depth" }, + { 0x0018, 0x5020, "LO", "Processing Function" }, + { 0x0018, 0x5021, "LO", "Postprocessing Function" }, + { 0x0018, 0x5022, "DS", "Mechanical Index" }, + { 0x0018, 0x5024, "DS", "Thermal Index" }, + { 0x0018, 0x5026, "DS", "Cranial Thermal Index" }, + { 0x0018, 0x5027, "DS", "Soft Tissue Thermal Index" }, + { 0x0018, 0x5028, "DS", "Soft Tissue-Focus Thermal Index" }, + { 0x0018, 0x5029, "DS", "Soft Tissue-Surface Thermal Index" }, + { 0x0018, 0x5030, "DS", "Dynamic Range" }, + { 0x0018, 0x5040, "DS", "Total Gain" }, + { 0x0018, 0x5050, "IS", "Depth of Scan Field" }, + { 0x0018, 0x5100, "CS", "Patient Position" }, + { 0x0018, 0x5101, "CS", "View Position" }, + { 0x0018, 0x5104, "SQ", "Projection Eponymous Name Code Sequence" }, + { 0x0018, 0x5210, "DS", "Image Transformation Matrix" }, + { 0x0018, 0x5212, "DS", "Image Translation Vector" }, + { 0x0018, 0x6000, "DS", "Sensitivity" }, + { 0x0018, 0x6011, "IS", "Sequence of Ultrasound Regions" }, + { 0x0018, 0x6012, "US", "Region Spatial Format" }, + { 0x0018, 0x6014, "US", "Region Data Type" }, + { 0x0018, 0x6016, "UL", "Region Flags" }, + { 0x0018, 0x6018, "UL", "Region Location Min X0" }, + { 0x0018, 0x601a, "UL", "Region Location Min Y0" }, + { 0x0018, 0x601c, "UL", "Region Location Max X1" }, + { 0x0018, 0x601e, "UL", "Region Location Max Y1" }, + { 0x0018, 0x6020, "SL", "Reference Pixel X0" }, + { 0x0018, 0x6022, "SL", "Reference Pixel Y0" }, + { 0x0018, 0x6024, "US", "Physical Units X Direction" }, + { 0x0018, 0x6026, "US", "Physical Units Y Direction" }, + { 0x0018, 0x6028, "FD", "Reference Pixel Physical Value X" }, + { 0x0018, 0x602a, "US", "Reference Pixel Physical Value Y" }, + { 0x0018, 0x602c, "US", "Physical Delta X" }, + { 0x0018, 0x602e, "US", "Physical Delta Y" }, + { 0x0018, 0x6030, "UL", "Transducer Frequency" }, + { 0x0018, 0x6031, "CS", "Transducer Type" }, + { 0x0018, 0x6032, "UL", "Pulse Repetition Frequency" }, + { 0x0018, 0x6034, "FD", "Doppler Correction Angle" }, + { 0x0018, 0x6036, "FD", "Steering Angle" }, + { 0x0018, 0x6038, "UL", "Doppler Sample Volume X Position" }, + { 0x0018, 0x603a, "UL", "Doppler Sample Volume Y Position" }, + { 0x0018, 0x603c, "UL", "TM-Line Position X0" }, + { 0x0018, 0x603e, "UL", "TM-Line Position Y0" }, + { 0x0018, 0x6040, "UL", "TM-Line Position X1" }, + { 0x0018, 0x6042, "UL", "TM-Line Position Y1" }, + { 0x0018, 0x6044, "US", "Pixel Component Organization" }, + { 0x0018, 0x6046, "UL", "Pixel Component Mask" }, + { 0x0018, 0x6048, "UL", "Pixel Component Range Start" }, + { 0x0018, 0x604a, "UL", "Pixel Component Range Stop" }, + { 0x0018, 0x604c, "US", "Pixel Component Physical Units" }, + { 0x0018, 0x604e, "US", "Pixel Component Data Type" }, + { 0x0018, 0x6050, "UL", "Number of Table Break Points" }, + { 0x0018, 0x6052, "UL", "Table of X Break Points" }, + { 0x0018, 0x6054, "FD", "Table of Y Break Points" }, + { 0x0018, 0x6056, "UL", "Number of Table Entries" }, + { 0x0018, 0x6058, "UL", "Table of Pixel Values" }, + { 0x0018, 0x605a, "FL", "Table of Parameter Values" }, + { 0x0018, 0x7000, "CS", "Detector Conditions Nominal Flag" }, + { 0x0018, 0x7001, "DS", "Detector Temperature" }, + { 0x0018, 0x7004, "CS", "Detector Type" }, + { 0x0018, 0x7005, "CS", "Detector Configuration" }, + { 0x0018, 0x7006, "LT", "Detector Description" }, + { 0x0018, 0x7008, "LT", "Detector Mode" }, + { 0x0018, 0x700a, "SH", "Detector ID" }, + { 0x0018, 0x700c, "DA", "Date of Last Detector Calibration " }, + { 0x0018, 0x700e, "TM", "Time of Last Detector Calibration" }, + { 0x0018, 0x7010, "IS", "Exposures on Detector Since Last Calibration" }, + { 0x0018, 0x7011, "IS", "Exposures on Detector Since Manufactured" }, + { 0x0018, 0x7012, "DS", "Detector Time Since Last Exposure" }, + { 0x0018, 0x7014, "DS", "Detector Active Time" }, + { 0x0018, 0x7016, "DS", "Detector Activation Offset From Exposure" }, + { 0x0018, 0x701a, "DS", "Detector Binning" }, + { 0x0018, 0x7020, "DS", "Detector Element Physical Size" }, + { 0x0018, 0x7022, "DS", "Detector Element Spacing" }, + { 0x0018, 0x7024, "CS", "Detector Active Shape" }, + { 0x0018, 0x7026, "DS", "Detector Active Dimensions" }, + { 0x0018, 0x7028, "DS", "Detector Active Origin" }, + { 0x0018, 0x7030, "DS", "Field of View Origin" }, + { 0x0018, 0x7032, "DS", "Field of View Rotation" }, + { 0x0018, 0x7034, "CS", "Field of View Horizontal Flip" }, + { 0x0018, 0x7040, "LT", "Grid Absorbing Material" }, + { 0x0018, 0x7041, "LT", "Grid Spacing Material" }, + { 0x0018, 0x7042, "DS", "Grid Thickness" }, + { 0x0018, 0x7044, "DS", "Grid Pitch" }, + { 0x0018, 0x7046, "IS", "Grid Aspect Ratio" }, + { 0x0018, 0x7048, "DS", "Grid Period" }, + { 0x0018, 0x704c, "DS", "Grid Focal Distance" }, + { 0x0018, 0x7050, "LT", "Filter Material" }, + { 0x0018, 0x7052, "DS", "Filter Thickness Minimum" }, + { 0x0018, 0x7054, "DS", "Filter Thickness Maximum" }, + { 0x0018, 0x7060, "CS", "Exposure Control Mode" }, + { 0x0018, 0x7062, "LT", "Exposure Control Mode Description" }, + { 0x0018, 0x7064, "CS", "Exposure Status" }, + { 0x0018, 0x7065, "DS", "Phototimer Setting" }, + { 0x0019, 0x0000, "xs", "?" }, + { 0x0019, 0x0001, "xs", "?" }, + { 0x0019, 0x0002, "xs", "?" }, + { 0x0019, 0x0003, "xs", "?" }, + { 0x0019, 0x0004, "xs", "?" }, + { 0x0019, 0x0005, "xs", "?" }, + { 0x0019, 0x0006, "xs", "?" }, + { 0x0019, 0x0007, "xs", "?" }, + { 0x0019, 0x0008, "xs", "?" }, + { 0x0019, 0x0009, "xs", "?" }, + { 0x0019, 0x000a, "xs", "?" }, + { 0x0019, 0x000b, "DS", "?" }, + { 0x0019, 0x000c, "US", "?" }, + { 0x0019, 0x000d, "TM", "Time" }, + { 0x0019, 0x000e, "xs", "?" }, + { 0x0019, 0x000f, "DS", "Horizontal Frame Of Reference" }, + { 0x0019, 0x0010, "xs", "?" }, + { 0x0019, 0x0011, "xs", "?" }, + { 0x0019, 0x0012, "xs", "?" }, + { 0x0019, 0x0013, "xs", "?" }, + { 0x0019, 0x0014, "xs", "?" }, + { 0x0019, 0x0015, "xs", "?" }, + { 0x0019, 0x0016, "xs", "?" }, + { 0x0019, 0x0017, "xs", "?" }, + { 0x0019, 0x0018, "xs", "?" }, + { 0x0019, 0x0019, "xs", "?" }, + { 0x0019, 0x001a, "xs", "?" }, + { 0x0019, 0x001b, "xs", "?" }, + { 0x0019, 0x001c, "CS", "Dose" }, + { 0x0019, 0x001d, "IS", "Side Mark" }, + { 0x0019, 0x001e, "xs", "?" }, + { 0x0019, 0x001f, "DS", "Exposure Duration" }, + { 0x0019, 0x0020, "xs", "?" }, + { 0x0019, 0x0021, "xs", "?" }, + { 0x0019, 0x0022, "xs", "?" }, + { 0x0019, 0x0023, "xs", "?" }, + { 0x0019, 0x0024, "xs", "?" }, + { 0x0019, 0x0025, "xs", "?" }, + { 0x0019, 0x0026, "xs", "?" }, + { 0x0019, 0x0027, "xs", "?" }, + { 0x0019, 0x0028, "xs", "?" }, + { 0x0019, 0x0029, "IS", "?" }, + { 0x0019, 0x002a, "xs", "?" }, + { 0x0019, 0x002b, "DS", "Xray Off Position" }, + { 0x0019, 0x002c, "xs", "?" }, + { 0x0019, 0x002d, "US", "?" }, + { 0x0019, 0x002e, "xs", "?" }, + { 0x0019, 0x002f, "DS", "Trigger Frequency" }, + { 0x0019, 0x0030, "xs", "?" }, + { 0x0019, 0x0031, "xs", "?" }, + { 0x0019, 0x0032, "xs", "?" }, + { 0x0019, 0x0033, "UN", "ECG 2 Offset 2" }, + { 0x0019, 0x0034, "US", "?" }, + { 0x0019, 0x0036, "US", "?" }, + { 0x0019, 0x0038, "US", "?" }, + { 0x0019, 0x0039, "xs", "?" }, + { 0x0019, 0x003a, "xs", "?" }, + { 0x0019, 0x003b, "LT", "?" }, + { 0x0019, 0x003c, "xs", "?" }, + { 0x0019, 0x003e, "xs", "?" }, + { 0x0019, 0x003f, "UN", "?" }, + { 0x0019, 0x0040, "xs", "?" }, + { 0x0019, 0x0041, "xs", "?" }, + { 0x0019, 0x0042, "xs", "?" }, + { 0x0019, 0x0043, "xs", "?" }, + { 0x0019, 0x0044, "xs", "?" }, + { 0x0019, 0x0045, "xs", "?" }, + { 0x0019, 0x0046, "xs", "?" }, + { 0x0019, 0x0047, "xs", "?" }, + { 0x0019, 0x0048, "xs", "?" }, + { 0x0019, 0x0049, "US", "?" }, + { 0x0019, 0x004a, "xs", "?" }, + { 0x0019, 0x004b, "SL", "Data Size For Scan Data" }, + { 0x0019, 0x004c, "US", "?" }, + { 0x0019, 0x004e, "US", "?" }, + { 0x0019, 0x0050, "xs", "?" }, + { 0x0019, 0x0051, "xs", "?" }, + { 0x0019, 0x0052, "xs", "?" }, + { 0x0019, 0x0053, "LT", "Barcode" }, + { 0x0019, 0x0054, "xs", "?" }, + { 0x0019, 0x0055, "DS", "Receiver Reference Gain" }, + { 0x0019, 0x0056, "xs", "?" }, + { 0x0019, 0x0057, "SS", "CT Water Number" }, + { 0x0019, 0x0058, "xs", "?" }, + { 0x0019, 0x005a, "xs", "?" }, + { 0x0019, 0x005c, "xs", "?" }, + { 0x0019, 0x005d, "US", "?" }, + { 0x0019, 0x005e, "xs", "?" }, + { 0x0019, 0x005f, "SL", "Increment Between Channels" }, + { 0x0019, 0x0060, "xs", "?" }, + { 0x0019, 0x0061, "xs", "?" }, + { 0x0019, 0x0062, "xs", "?" }, + { 0x0019, 0x0063, "xs", "?" }, + { 0x0019, 0x0064, "xs", "?" }, + { 0x0019, 0x0065, "xs", "?" }, + { 0x0019, 0x0066, "xs", "?" }, + { 0x0019, 0x0067, "xs", "?" }, + { 0x0019, 0x0068, "xs", "?" }, + { 0x0019, 0x0069, "UL", "Convolution Mode" }, + { 0x0019, 0x006a, "xs", "?" }, + { 0x0019, 0x006b, "SS", "Field Of View In Detector Cells" }, + { 0x0019, 0x006c, "US", "?" }, + { 0x0019, 0x006e, "US", "?" }, + { 0x0019, 0x0070, "xs", "?" }, + { 0x0019, 0x0071, "xs", "?" }, + { 0x0019, 0x0072, "xs", "?" }, + { 0x0019, 0x0073, "xs", "?" }, + { 0x0019, 0x0074, "xs", "?" }, + { 0x0019, 0x0075, "xs", "?" }, + { 0x0019, 0x0076, "xs", "?" }, + { 0x0019, 0x0077, "US", "?" }, + { 0x0019, 0x0078, "US", "?" }, + { 0x0019, 0x007a, "US", "?" }, + { 0x0019, 0x007c, "US", "?" }, + { 0x0019, 0x007d, "DS", "Second Echo" }, + { 0x0019, 0x007e, "xs", "?" }, + { 0x0019, 0x007f, "DS", "Table Delta" }, + { 0x0019, 0x0080, "xs", "?" }, + { 0x0019, 0x0081, "xs", "?" }, + { 0x0019, 0x0082, "xs", "?" }, + { 0x0019, 0x0083, "xs", "?" }, + { 0x0019, 0x0084, "xs", "?" }, + { 0x0019, 0x0085, "xs", "?" }, + { 0x0019, 0x0086, "xs", "?" }, + { 0x0019, 0x0087, "xs", "?" }, + { 0x0019, 0x0088, "xs", "?" }, + { 0x0019, 0x008a, "xs", "?" }, + { 0x0019, 0x008b, "SS", "Actual Receive Gain Digital" }, + { 0x0019, 0x008c, "US", "?" }, + { 0x0019, 0x008d, "DS", "Delay After Trigger" }, + { 0x0019, 0x008e, "US", "?" }, + { 0x0019, 0x008f, "SS", "Swap Phase Frequency" }, + { 0x0019, 0x0090, "xs", "?" }, + { 0x0019, 0x0091, "xs", "?" }, + { 0x0019, 0x0092, "xs", "?" }, + { 0x0019, 0x0093, "xs", "?" }, + { 0x0019, 0x0094, "xs", "?" }, + { 0x0019, 0x0095, "SS", "Analog Receiver Gain" }, + { 0x0019, 0x0096, "xs", "?" }, + { 0x0019, 0x0097, "xs", "?" }, + { 0x0019, 0x0098, "xs", "?" }, + { 0x0019, 0x0099, "US", "?" }, + { 0x0019, 0x009a, "US", "?" }, + { 0x0019, 0x009b, "SS", "Pulse Sequence Mode" }, + { 0x0019, 0x009c, "xs", "?" }, + { 0x0019, 0x009d, "DT", "Pulse Sequence Date" }, + { 0x0019, 0x009e, "xs", "?" }, + { 0x0019, 0x009f, "xs", "?" }, + { 0x0019, 0x00a0, "xs", "?" }, + { 0x0019, 0x00a1, "xs", "?" }, + { 0x0019, 0x00a2, "xs", "?" }, + { 0x0019, 0x00a3, "xs", "?" }, + { 0x0019, 0x00a4, "xs", "?" }, + { 0x0019, 0x00a5, "xs", "?" }, + { 0x0019, 0x00a6, "xs", "?" }, + { 0x0019, 0x00a7, "xs", "?" }, + { 0x0019, 0x00a8, "xs", "?" }, + { 0x0019, 0x00a9, "xs", "?" }, + { 0x0019, 0x00aa, "xs", "?" }, + { 0x0019, 0x00ab, "xs", "?" }, + { 0x0019, 0x00ac, "xs", "?" }, + { 0x0019, 0x00ad, "xs", "?" }, + { 0x0019, 0x00ae, "xs", "?" }, + { 0x0019, 0x00af, "xs", "?" }, + { 0x0019, 0x00b0, "xs", "?" }, + { 0x0019, 0x00b1, "xs", "?" }, + { 0x0019, 0x00b2, "xs", "?" }, + { 0x0019, 0x00b3, "xs", "?" }, + { 0x0019, 0x00b4, "xs", "?" }, + { 0x0019, 0x00b5, "xs", "?" }, + { 0x0019, 0x00b6, "DS", "User Data" }, + { 0x0019, 0x00b7, "DS", "User Data" }, + { 0x0019, 0x00b8, "DS", "User Data" }, + { 0x0019, 0x00b9, "DS", "User Data" }, + { 0x0019, 0x00ba, "DS", "User Data" }, + { 0x0019, 0x00bb, "DS", "User Data" }, + { 0x0019, 0x00bc, "DS", "User Data" }, + { 0x0019, 0x00bd, "DS", "User Data" }, + { 0x0019, 0x00be, "DS", "Projection Angle" }, + { 0x0019, 0x00c0, "xs", "?" }, + { 0x0019, 0x00c1, "xs", "?" }, + { 0x0019, 0x00c2, "xs", "?" }, + { 0x0019, 0x00c3, "xs", "?" }, + { 0x0019, 0x00c4, "xs", "?" }, + { 0x0019, 0x00c5, "xs", "?" }, + { 0x0019, 0x00c6, "SS", "SAT Location H" }, + { 0x0019, 0x00c7, "SS", "SAT Location F" }, + { 0x0019, 0x00c8, "SS", "SAT Thickness R L" }, + { 0x0019, 0x00c9, "SS", "SAT Thickness A P" }, + { 0x0019, 0x00ca, "SS", "SAT Thickness H F" }, + { 0x0019, 0x00cb, "xs", "?" }, + { 0x0019, 0x00cc, "xs", "?" }, + { 0x0019, 0x00cd, "SS", "Thickness Disclaimer" }, + { 0x0019, 0x00ce, "SS", "Prescan Type" }, + { 0x0019, 0x00cf, "SS", "Prescan Status" }, + { 0x0019, 0x00d0, "SH", "Raw Data Type" }, + { 0x0019, 0x00d1, "DS", "Flow Sensitivity" }, + { 0x0019, 0x00d2, "xs", "?" }, + { 0x0019, 0x00d3, "xs", "?" }, + { 0x0019, 0x00d4, "xs", "?" }, + { 0x0019, 0x00d5, "xs", "?" }, + { 0x0019, 0x00d6, "xs", "?" }, + { 0x0019, 0x00d7, "xs", "?" }, + { 0x0019, 0x00d8, "xs", "?" }, + { 0x0019, 0x00d9, "xs", "?" }, + { 0x0019, 0x00da, "xs", "?" }, + { 0x0019, 0x00db, "DS", "Back Projector Coefficient" }, + { 0x0019, 0x00dc, "SS", "Primary Speed Correction Used" }, + { 0x0019, 0x00dd, "SS", "Overrange Correction Used" }, + { 0x0019, 0x00de, "DS", "Dynamic Z Alpha Value" }, + { 0x0019, 0x00df, "DS", "User Data" }, + { 0x0019, 0x00e0, "DS", "User Data" }, + { 0x0019, 0x00e1, "xs", "?" }, + { 0x0019, 0x00e2, "xs", "?" }, + { 0x0019, 0x00e3, "xs", "?" }, + { 0x0019, 0x00e4, "LT", "?" }, + { 0x0019, 0x00e5, "IS", "?" }, + { 0x0019, 0x00e6, "US", "?" }, + { 0x0019, 0x00e8, "DS", "?" }, + { 0x0019, 0x00e9, "DS", "?" }, + { 0x0019, 0x00eb, "DS", "?" }, + { 0x0019, 0x00ec, "US", "?" }, + { 0x0019, 0x00f0, "xs", "?" }, + { 0x0019, 0x00f1, "xs", "?" }, + { 0x0019, 0x00f2, "xs", "?" }, + { 0x0019, 0x00f3, "xs", "?" }, + { 0x0019, 0x00f4, "LT", "?" }, + { 0x0019, 0x00f9, "DS", "Transmission Gain" }, + { 0x0019, 0x1015, "UN", "?" }, + { 0x0020, 0x0000, "UL", "Relationship Group Length" }, + { 0x0020, 0x000d, "UI", "Study Instance UID" }, + { 0x0020, 0x000e, "UI", "Series Instance UID" }, + { 0x0020, 0x0010, "SH", "Study ID" }, + { 0x0020, 0x0011, "IS", "Series Number" }, + { 0x0020, 0x0012, "IS", "Acquisition Number" }, + { 0x0020, 0x0013, "IS", "Instance (formerly Image) Number" }, + { 0x0020, 0x0014, "IS", "Isotope Number" }, + { 0x0020, 0x0015, "IS", "Phase Number" }, + { 0x0020, 0x0016, "IS", "Interval Number" }, + { 0x0020, 0x0017, "IS", "Time Slot Number" }, + { 0x0020, 0x0018, "IS", "Angle Number" }, + { 0x0020, 0x0020, "CS", "Patient Orientation" }, + { 0x0020, 0x0022, "IS", "Overlay Number" }, + { 0x0020, 0x0024, "IS", "Curve Number" }, + { 0x0020, 0x0026, "IS", "LUT Number" }, + { 0x0020, 0x0030, "DS", "Image Position" }, + { 0x0020, 0x0032, "DS", "Image Position (Patient)" }, + { 0x0020, 0x0035, "DS", "Image Orientation" }, + { 0x0020, 0x0037, "DS", "Image Orientation (Patient)" }, + { 0x0020, 0x0050, "DS", "Location" }, + { 0x0020, 0x0052, "UI", "Frame of Reference UID" }, + { 0x0020, 0x0060, "CS", "Laterality" }, + { 0x0020, 0x0062, "CS", "Image Laterality" }, + { 0x0020, 0x0070, "LT", "Image Geometry Type" }, + { 0x0020, 0x0080, "LO", "Masking Image" }, + { 0x0020, 0x0100, "IS", "Temporal Position Identifier" }, + { 0x0020, 0x0105, "IS", "Number of Temporal Positions" }, + { 0x0020, 0x0110, "DS", "Temporal Resolution" }, + { 0x0020, 0x1000, "IS", "Series in Study" }, + { 0x0020, 0x1001, "DS", "Acquisitions in Series" }, + { 0x0020, 0x1002, "IS", "Images in Acquisition" }, + { 0x0020, 0x1003, "IS", "Images in Series" }, + { 0x0020, 0x1004, "IS", "Acquisitions in Study" }, + { 0x0020, 0x1005, "IS", "Images in Study" }, + { 0x0020, 0x1020, "LO", "Reference" }, + { 0x0020, 0x1040, "LO", "Position Reference Indicator" }, + { 0x0020, 0x1041, "DS", "Slice Location" }, + { 0x0020, 0x1070, "IS", "Other Study Numbers" }, + { 0x0020, 0x1200, "IS", "Number of Patient Related Studies" }, + { 0x0020, 0x1202, "IS", "Number of Patient Related Series" }, + { 0x0020, 0x1204, "IS", "Number of Patient Related Images" }, + { 0x0020, 0x1206, "IS", "Number of Study Related Series" }, + { 0x0020, 0x1208, "IS", "Number of Study Related Series" }, + { 0x0020, 0x3100, "LO", "Source Image IDs" }, + { 0x0020, 0x3401, "LO", "Modifying Device ID" }, + { 0x0020, 0x3402, "LO", "Modified Image ID" }, + { 0x0020, 0x3403, "xs", "Modified Image Date" }, + { 0x0020, 0x3404, "LO", "Modifying Device Manufacturer" }, + { 0x0020, 0x3405, "xs", "Modified Image Time" }, + { 0x0020, 0x3406, "xs", "Modified Image Description" }, + { 0x0020, 0x4000, "LT", "Image Comments" }, + { 0x0020, 0x5000, "AT", "Original Image Identification" }, + { 0x0020, 0x5002, "LO", "Original Image Identification Nomenclature" }, + { 0x0021, 0x0000, "xs", "?" }, + { 0x0021, 0x0001, "xs", "?" }, + { 0x0021, 0x0002, "xs", "?" }, + { 0x0021, 0x0003, "xs", "?" }, + { 0x0021, 0x0004, "DS", "VOI Position" }, + { 0x0021, 0x0005, "xs", "?" }, + { 0x0021, 0x0006, "IS", "CSI Matrix Size Original" }, + { 0x0021, 0x0007, "xs", "?" }, + { 0x0021, 0x0008, "DS", "Spatial Grid Shift" }, + { 0x0021, 0x0009, "DS", "Signal Limits Minimum" }, + { 0x0021, 0x0010, "xs", "?" }, + { 0x0021, 0x0011, "xs", "?" }, + { 0x0021, 0x0012, "xs", "?" }, + { 0x0021, 0x0013, "xs", "?" }, + { 0x0021, 0x0014, "xs", "?" }, + { 0x0021, 0x0015, "xs", "?" }, + { 0x0021, 0x0016, "xs", "?" }, + { 0x0021, 0x0017, "DS", "EPI Operation Mode Flag" }, + { 0x0021, 0x0018, "xs", "?" }, + { 0x0021, 0x0019, "xs", "?" }, + { 0x0021, 0x0020, "xs", "?" }, + { 0x0021, 0x0021, "xs", "?" }, + { 0x0021, 0x0022, "xs", "?" }, + { 0x0021, 0x0024, "xs", "?" }, + { 0x0021, 0x0025, "US", "?" }, + { 0x0021, 0x0026, "IS", "Image Pixel Offset" }, + { 0x0021, 0x0030, "xs", "?" }, + { 0x0021, 0x0031, "xs", "?" }, + { 0x0021, 0x0032, "xs", "?" }, + { 0x0021, 0x0034, "xs", "?" }, + { 0x0021, 0x0035, "SS", "Series From Which Prescribed" }, + { 0x0021, 0x0036, "xs", "?" }, + { 0x0021, 0x0037, "SS", "Screen Format" }, + { 0x0021, 0x0039, "DS", "Slab Thickness" }, + { 0x0021, 0x0040, "xs", "?" }, + { 0x0021, 0x0041, "xs", "?" }, + { 0x0021, 0x0042, "xs", "?" }, + { 0x0021, 0x0043, "xs", "?" }, + { 0x0021, 0x0044, "xs", "?" }, + { 0x0021, 0x0045, "xs", "?" }, + { 0x0021, 0x0046, "xs", "?" }, + { 0x0021, 0x0047, "xs", "?" }, + { 0x0021, 0x0048, "xs", "?" }, + { 0x0021, 0x0049, "xs", "?" }, + { 0x0021, 0x004a, "xs", "?" }, + { 0x0021, 0x004e, "US", "?" }, + { 0x0021, 0x004f, "xs", "?" }, + { 0x0021, 0x0050, "xs", "?" }, + { 0x0021, 0x0051, "xs", "?" }, + { 0x0021, 0x0052, "xs", "?" }, + { 0x0021, 0x0053, "xs", "?" }, + { 0x0021, 0x0054, "xs", "?" }, + { 0x0021, 0x0055, "xs", "?" }, + { 0x0021, 0x0056, "xs", "?" }, + { 0x0021, 0x0057, "xs", "?" }, + { 0x0021, 0x0058, "xs", "?" }, + { 0x0021, 0x0059, "xs", "?" }, + { 0x0021, 0x005a, "SL", "Integer Slop" }, + { 0x0021, 0x005b, "DS", "Float Slop" }, + { 0x0021, 0x005c, "DS", "Float Slop" }, + { 0x0021, 0x005d, "DS", "Float Slop" }, + { 0x0021, 0x005e, "DS", "Float Slop" }, + { 0x0021, 0x005f, "DS", "Float Slop" }, + { 0x0021, 0x0060, "xs", "?" }, + { 0x0021, 0x0061, "DS", "Image Normal" }, + { 0x0021, 0x0062, "IS", "Reference Type Code" }, + { 0x0021, 0x0063, "DS", "Image Distance" }, + { 0x0021, 0x0065, "US", "Image Positioning History Mask" }, + { 0x0021, 0x006a, "DS", "Image Row" }, + { 0x0021, 0x006b, "DS", "Image Column" }, + { 0x0021, 0x0070, "xs", "?" }, + { 0x0021, 0x0071, "xs", "?" }, + { 0x0021, 0x0072, "xs", "?" }, + { 0x0021, 0x0073, "DS", "Second Repetition Time" }, + { 0x0021, 0x0075, "DS", "Light Brightness" }, + { 0x0021, 0x0076, "DS", "Light Contrast" }, + { 0x0021, 0x007a, "IS", "Overlay Threshold" }, + { 0x0021, 0x007b, "IS", "Surface Threshold" }, + { 0x0021, 0x007c, "IS", "Grey Scale Threshold" }, + { 0x0021, 0x0080, "xs", "?" }, + { 0x0021, 0x0081, "DS", "Auto Window Level Alpha" }, + { 0x0021, 0x0082, "xs", "?" }, + { 0x0021, 0x0083, "DS", "Auto Window Level Window" }, + { 0x0021, 0x0084, "DS", "Auto Window Level Level" }, + { 0x0021, 0x0090, "xs", "?" }, + { 0x0021, 0x0091, "xs", "?" }, + { 0x0021, 0x0092, "xs", "?" }, + { 0x0021, 0x0093, "xs", "?" }, + { 0x0021, 0x0094, "DS", "EPI Change Value of X Component" }, + { 0x0021, 0x0095, "DS", "EPI Change Value of Y Component" }, + { 0x0021, 0x0096, "DS", "EPI Change Value of Z Component" }, + { 0x0021, 0x00a0, "xs", "?" }, + { 0x0021, 0x00a1, "DS", "?" }, + { 0x0021, 0x00a2, "xs", "?" }, + { 0x0021, 0x00a3, "LT", "?" }, + { 0x0021, 0x00a4, "LT", "?" }, + { 0x0021, 0x00a7, "LT", "?" }, + { 0x0021, 0x00b0, "IS", "?" }, + { 0x0021, 0x00c0, "IS", "?" }, + { 0x0023, 0x0000, "xs", "?" }, + { 0x0023, 0x0001, "SL", "Number Of Series In Study" }, + { 0x0023, 0x0002, "SL", "Number Of Unarchived Series" }, + { 0x0023, 0x0010, "xs", "?" }, + { 0x0023, 0x0020, "xs", "?" }, + { 0x0023, 0x0030, "xs", "?" }, + { 0x0023, 0x0040, "xs", "?" }, + { 0x0023, 0x0050, "xs", "?" }, + { 0x0023, 0x0060, "xs", "?" }, + { 0x0023, 0x0070, "xs", "?" }, + { 0x0023, 0x0074, "SL", "Number Of Updates To Info" }, + { 0x0023, 0x007d, "SS", "Indicates If Study Has Complete Info" }, + { 0x0023, 0x0080, "xs", "?" }, + { 0x0023, 0x0090, "xs", "?" }, + { 0x0023, 0x00ff, "US", "?" }, + { 0x0025, 0x0000, "UL", "Group Length" }, + { 0x0025, 0x0006, "SS", "Last Pulse Sequence Used" }, + { 0x0025, 0x0007, "SL", "Images In Series" }, + { 0x0025, 0x0010, "SS", "Landmark Counter" }, + { 0x0025, 0x0011, "SS", "Number Of Acquisitions" }, + { 0x0025, 0x0014, "SL", "Indicates Number Of Updates To Info" }, + { 0x0025, 0x0017, "SL", "Series Complete Flag" }, + { 0x0025, 0x0018, "SL", "Number Of Images Archived" }, + { 0x0025, 0x0019, "SL", "Last Image Number Used" }, + { 0x0025, 0x001a, "SH", "Primary Receiver Suite And Host" }, + { 0x0027, 0x0000, "US", "?" }, + { 0x0027, 0x0006, "SL", "Image Archive Flag" }, + { 0x0027, 0x0010, "SS", "Scout Type" }, + { 0x0027, 0x0011, "UN", "?" }, + { 0x0027, 0x0012, "IS", "?" }, + { 0x0027, 0x0013, "IS", "?" }, + { 0x0027, 0x0014, "IS", "?" }, + { 0x0027, 0x0015, "IS", "?" }, + { 0x0027, 0x0016, "LT", "?" }, + { 0x0027, 0x001c, "SL", "Vma Mamp" }, + { 0x0027, 0x001d, "SS", "Vma Phase" }, + { 0x0027, 0x001e, "SL", "Vma Mod" }, + { 0x0027, 0x001f, "SL", "Vma Clip" }, + { 0x0027, 0x0020, "SS", "Smart Scan On Off Flag" }, + { 0x0027, 0x0030, "SH", "Foreign Image Revision" }, + { 0x0027, 0x0031, "SS", "Imaging Mode" }, + { 0x0027, 0x0032, "SS", "Pulse Sequence" }, + { 0x0027, 0x0033, "SL", "Imaging Options" }, + { 0x0027, 0x0035, "SS", "Plane Type" }, + { 0x0027, 0x0036, "SL", "Oblique Plane" }, + { 0x0027, 0x0040, "SH", "RAS Letter Of Image Location" }, + { 0x0027, 0x0041, "FL", "Image Location" }, + { 0x0027, 0x0042, "FL", "Center R Coord Of Plane Image" }, + { 0x0027, 0x0043, "FL", "Center A Coord Of Plane Image" }, + { 0x0027, 0x0044, "FL", "Center S Coord Of Plane Image" }, + { 0x0027, 0x0045, "FL", "Normal R Coord" }, + { 0x0027, 0x0046, "FL", "Normal A Coord" }, + { 0x0027, 0x0047, "FL", "Normal S Coord" }, + { 0x0027, 0x0048, "FL", "R Coord Of Top Right Corner" }, + { 0x0027, 0x0049, "FL", "A Coord Of Top Right Corner" }, + { 0x0027, 0x004a, "FL", "S Coord Of Top Right Corner" }, + { 0x0027, 0x004b, "FL", "R Coord Of Bottom Right Corner" }, + { 0x0027, 0x004c, "FL", "A Coord Of Bottom Right Corner" }, + { 0x0027, 0x004d, "FL", "S Coord Of Bottom Right Corner" }, + { 0x0027, 0x0050, "FL", "Table Start Location" }, + { 0x0027, 0x0051, "FL", "Table End Location" }, + { 0x0027, 0x0052, "SH", "RAS Letter For Side Of Image" }, + { 0x0027, 0x0053, "SH", "RAS Letter For Anterior Posterior" }, + { 0x0027, 0x0054, "SH", "RAS Letter For Scout Start Loc" }, + { 0x0027, 0x0055, "SH", "RAS Letter For Scout End Loc" }, + { 0x0027, 0x0060, "FL", "Image Dimension X" }, + { 0x0027, 0x0061, "FL", "Image Dimension Y" }, + { 0x0027, 0x0062, "FL", "Number Of Excitations" }, + { 0x0028, 0x0000, "UL", "Image Presentation Group Length" }, + { 0x0028, 0x0002, "US", "Samples per Pixel" }, + { 0x0028, 0x0004, "CS", "Photometric Interpretation" }, + { 0x0028, 0x0005, "US", "Image Dimensions" }, + { 0x0028, 0x0006, "US", "Planar Configuration" }, + { 0x0028, 0x0008, "IS", "Number of Frames" }, + { 0x0028, 0x0009, "AT", "Frame Increment Pointer" }, + { 0x0028, 0x0010, "US", "Rows" }, + { 0x0028, 0x0011, "US", "Columns" }, + { 0x0028, 0x0012, "US", "Planes" }, + { 0x0028, 0x0014, "US", "Ultrasound Color Data Present" }, + { 0x0028, 0x0030, "DS", "Pixel Spacing" }, + { 0x0028, 0x0031, "DS", "Zoom Factor" }, + { 0x0028, 0x0032, "DS", "Zoom Center" }, + { 0x0028, 0x0034, "IS", "Pixel Aspect Ratio" }, + { 0x0028, 0x0040, "LO", "Image Format" }, + { 0x0028, 0x0050, "LT", "Manipulated Image" }, + { 0x0028, 0x0051, "CS", "Corrected Image" }, + { 0x0028, 0x005f, "LO", "Compression Recognition Code" }, + { 0x0028, 0x0060, "LO", "Compression Code" }, + { 0x0028, 0x0061, "SH", "Compression Originator" }, + { 0x0028, 0x0062, "SH", "Compression Label" }, + { 0x0028, 0x0063, "SH", "Compression Description" }, + { 0x0028, 0x0065, "LO", "Compression Sequence" }, + { 0x0028, 0x0066, "AT", "Compression Step Pointers" }, + { 0x0028, 0x0068, "US", "Repeat Interval" }, + { 0x0028, 0x0069, "US", "Bits Grouped" }, + { 0x0028, 0x0070, "US", "Perimeter Table" }, + { 0x0028, 0x0071, "xs", "Perimeter Value" }, + { 0x0028, 0x0080, "US", "Predictor Rows" }, + { 0x0028, 0x0081, "US", "Predictor Columns" }, + { 0x0028, 0x0082, "US", "Predictor Constants" }, + { 0x0028, 0x0090, "LO", "Blocked Pixels" }, + { 0x0028, 0x0091, "US", "Block Rows" }, + { 0x0028, 0x0092, "US", "Block Columns" }, + { 0x0028, 0x0093, "US", "Row Overlap" }, + { 0x0028, 0x0094, "US", "Column Overlap" }, + { 0x0028, 0x0100, "US", "Bits Allocated" }, + { 0x0028, 0x0101, "US", "Bits Stored" }, + { 0x0028, 0x0102, "US", "High Bit" }, + { 0x0028, 0x0103, "US", "Pixel Representation" }, + { 0x0028, 0x0104, "xs", "Smallest Valid Pixel Value" }, + { 0x0028, 0x0105, "xs", "Largest Valid Pixel Value" }, + { 0x0028, 0x0106, "xs", "Smallest Image Pixel Value" }, + { 0x0028, 0x0107, "xs", "Largest Image Pixel Value" }, + { 0x0028, 0x0108, "xs", "Smallest Pixel Value in Series" }, + { 0x0028, 0x0109, "xs", "Largest Pixel Value in Series" }, + { 0x0028, 0x0110, "xs", "Smallest Pixel Value in Plane" }, + { 0x0028, 0x0111, "xs", "Largest Pixel Value in Plane" }, + { 0x0028, 0x0120, "xs", "Pixel Padding Value" }, + { 0x0028, 0x0200, "xs", "Image Location" }, + { 0x0028, 0x0300, "CS", "Quality Control Image" }, + { 0x0028, 0x0301, "CS", "Burned In Annotation" }, + { 0x0028, 0x0400, "xs", "?" }, + { 0x0028, 0x0401, "xs", "?" }, + { 0x0028, 0x0402, "xs", "?" }, + { 0x0028, 0x0403, "xs", "?" }, + { 0x0028, 0x0404, "AT", "Details of Coefficients" }, + { 0x0028, 0x0700, "LO", "DCT Label" }, + { 0x0028, 0x0701, "LO", "Data Block Description" }, + { 0x0028, 0x0702, "AT", "Data Block" }, + { 0x0028, 0x0710, "US", "Normalization Factor Format" }, + { 0x0028, 0x0720, "US", "Zonal Map Number Format" }, + { 0x0028, 0x0721, "AT", "Zonal Map Location" }, + { 0x0028, 0x0722, "US", "Zonal Map Format" }, + { 0x0028, 0x0730, "US", "Adaptive Map Format" }, + { 0x0028, 0x0740, "US", "Code Number Format" }, + { 0x0028, 0x0800, "LO", "Code Label" }, + { 0x0028, 0x0802, "US", "Number of Tables" }, + { 0x0028, 0x0803, "AT", "Code Table Location" }, + { 0x0028, 0x0804, "US", "Bits For Code Word" }, + { 0x0028, 0x0808, "AT", "Image Data Location" }, + { 0x0028, 0x1040, "CS", "Pixel Intensity Relationship" }, + { 0x0028, 0x1041, "SS", "Pixel Intensity Relationship Sign" }, + { 0x0028, 0x1050, "DS", "Window Center" }, + { 0x0028, 0x1051, "DS", "Window Width" }, + { 0x0028, 0x1052, "DS", "Rescale Intercept" }, + { 0x0028, 0x1053, "DS", "Rescale Slope" }, + { 0x0028, 0x1054, "LO", "Rescale Type" }, + { 0x0028, 0x1055, "LO", "Window Center & Width Explanation" }, + { 0x0028, 0x1080, "LO", "Gray Scale" }, + { 0x0028, 0x1090, "CS", "Recommended Viewing Mode" }, + { 0x0028, 0x1100, "xs", "Gray Lookup Table Descriptor" }, + { 0x0028, 0x1101, "xs", "Red Palette Color Lookup Table Descriptor" }, + { 0x0028, 0x1102, "xs", "Green Palette Color Lookup Table Descriptor" }, + { 0x0028, 0x1103, "xs", "Blue Palette Color Lookup Table Descriptor" }, + { 0x0028, 0x1111, "OW", "Large Red Palette Color Lookup Table Descriptor" }, + { 0x0028, 0x1112, "OW", "Large Green Palette Color Lookup Table Descriptor" }, + { 0x0028, 0x1113, "OW", "Large Blue Palette Color Lookup Table Descriptor" }, + { 0x0028, 0x1199, "UI", "Palette Color Lookup Table UID" }, + { 0x0028, 0x1200, "xs", "Gray Lookup Table Data" }, + { 0x0028, 0x1201, "OW", "Red Palette Color Lookup Table Data" }, + { 0x0028, 0x1202, "OW", "Green Palette Color Lookup Table Data" }, + { 0x0028, 0x1203, "OW", "Blue Palette Color Lookup Table Data" }, + { 0x0028, 0x1211, "OW", "Large Red Palette Color Lookup Table Data" }, + { 0x0028, 0x1212, "OW", "Large Green Palette Color Lookup Table Data" }, + { 0x0028, 0x1213, "OW", "Large Blue Palette Color Lookup Table Data" }, + { 0x0028, 0x1214, "UI", "Large Palette Color Lookup Table UID" }, + { 0x0028, 0x1221, "OW", "Segmented Red Palette Color Lookup Table Data" }, + { 0x0028, 0x1222, "OW", "Segmented Green Palette Color Lookup Table Data" }, + { 0x0028, 0x1223, "OW", "Segmented Blue Palette Color Lookup Table Data" }, + { 0x0028, 0x1300, "CS", "Implant Present" }, + { 0x0028, 0x2110, "CS", "Lossy Image Compression" }, + { 0x0028, 0x2112, "DS", "Lossy Image Compression Ratio" }, + { 0x0028, 0x3000, "SQ", "Modality LUT Sequence" }, + { 0x0028, 0x3002, "US", "LUT Descriptor" }, + { 0x0028, 0x3003, "LO", "LUT Explanation" }, + { 0x0028, 0x3004, "LO", "Modality LUT Type" }, + { 0x0028, 0x3006, "US", "LUT Data" }, + { 0x0028, 0x3010, "xs", "VOI LUT Sequence" }, + { 0x0028, 0x4000, "LT", "Image Presentation Comments" }, + { 0x0028, 0x5000, "SQ", "Biplane Acquisition Sequence" }, + { 0x0028, 0x6010, "US", "Representative Frame Number" }, + { 0x0028, 0x6020, "US", "Frame Numbers of Interest" }, + { 0x0028, 0x6022, "LO", "Frame of Interest Description" }, + { 0x0028, 0x6030, "US", "Mask Pointer" }, + { 0x0028, 0x6040, "US", "R Wave Pointer" }, + { 0x0028, 0x6100, "SQ", "Mask Subtraction Sequence" }, + { 0x0028, 0x6101, "CS", "Mask Operation" }, + { 0x0028, 0x6102, "US", "Applicable Frame Range" }, + { 0x0028, 0x6110, "US", "Mask Frame Numbers" }, + { 0x0028, 0x6112, "US", "Contrast Frame Averaging" }, + { 0x0028, 0x6114, "FL", "Mask Sub-Pixel Shift" }, + { 0x0028, 0x6120, "SS", "TID Offset" }, + { 0x0028, 0x6190, "ST", "Mask Operation Explanation" }, + { 0x0029, 0x0000, "xs", "?" }, + { 0x0029, 0x0001, "xs", "?" }, + { 0x0029, 0x0002, "xs", "?" }, + { 0x0029, 0x0003, "xs", "?" }, + { 0x0029, 0x0004, "xs", "?" }, + { 0x0029, 0x0005, "xs", "?" }, + { 0x0029, 0x0006, "xs", "?" }, + { 0x0029, 0x0007, "SL", "Lower Range Of Pixels" }, + { 0x0029, 0x0008, "SH", "Lower Range Of Pixels" }, + { 0x0029, 0x0009, "SH", "Lower Range Of Pixels" }, + { 0x0029, 0x000a, "SS", "Lower Range Of Pixels" }, + { 0x0029, 0x000c, "xs", "?" }, + { 0x0029, 0x000e, "CS", "Zoom Enable Status" }, + { 0x0029, 0x000f, "CS", "Zoom Select Status" }, + { 0x0029, 0x0010, "xs", "?" }, + { 0x0029, 0x0011, "xs", "?" }, + { 0x0029, 0x0013, "LT", "?" }, + { 0x0029, 0x0015, "xs", "?" }, + { 0x0029, 0x0016, "SL", "Lower Range Of Pixels" }, + { 0x0029, 0x0017, "SL", "Lower Range Of Pixels" }, + { 0x0029, 0x0018, "SL", "Upper Range Of Pixels" }, + { 0x0029, 0x001a, "SL", "Length Of Total Info In Bytes" }, + { 0x0029, 0x001e, "xs", "?" }, + { 0x0029, 0x001f, "xs", "?" }, + { 0x0029, 0x0020, "xs", "?" }, + { 0x0029, 0x0022, "IS", "Pixel Quality Value" }, + { 0x0029, 0x0025, "LT", "Processed Pixel Data Quality" }, + { 0x0029, 0x0026, "SS", "Version Of Info Structure" }, + { 0x0029, 0x0030, "xs", "?" }, + { 0x0029, 0x0031, "xs", "?" }, + { 0x0029, 0x0032, "xs", "?" }, + { 0x0029, 0x0033, "xs", "?" }, + { 0x0029, 0x0034, "xs", "?" }, + { 0x0029, 0x0035, "SL", "Advantage Comp Underflow" }, + { 0x0029, 0x0038, "US", "?" }, + { 0x0029, 0x0040, "xs", "?" }, + { 0x0029, 0x0041, "DS", "Magnifying Glass Rectangle" }, + { 0x0029, 0x0043, "DS", "Magnifying Glass Factor" }, + { 0x0029, 0x0044, "US", "Magnifying Glass Function" }, + { 0x0029, 0x004e, "CS", "Magnifying Glass Enable Status" }, + { 0x0029, 0x004f, "CS", "Magnifying Glass Select Status" }, + { 0x0029, 0x0050, "xs", "?" }, + { 0x0029, 0x0051, "LT", "Exposure Code" }, + { 0x0029, 0x0052, "LT", "Sort Code" }, + { 0x0029, 0x0053, "LT", "?" }, + { 0x0029, 0x0060, "xs", "?" }, + { 0x0029, 0x0061, "xs", "?" }, + { 0x0029, 0x0067, "LT", "?" }, + { 0x0029, 0x0070, "xs", "?" }, + { 0x0029, 0x0071, "xs", "?" }, + { 0x0029, 0x0072, "xs", "?" }, + { 0x0029, 0x0077, "CS", "Window Select Status" }, + { 0x0029, 0x0078, "LT", "ECG Display Printing ID" }, + { 0x0029, 0x0079, "CS", "ECG Display Printing" }, + { 0x0029, 0x007e, "CS", "ECG Display Printing Enable Status" }, + { 0x0029, 0x007f, "CS", "ECG Display Printing Select Status" }, + { 0x0029, 0x0080, "xs", "?" }, + { 0x0029, 0x0081, "xs", "?" }, + { 0x0029, 0x0082, "IS", "View Zoom" }, + { 0x0029, 0x0083, "IS", "View Transform" }, + { 0x0029, 0x008e, "CS", "Physiological Display Enable Status" }, + { 0x0029, 0x008f, "CS", "Physiological Display Select Status" }, + { 0x0029, 0x0090, "IS", "?" }, + { 0x0029, 0x0099, "LT", "Shutter Type" }, + { 0x0029, 0x00a0, "US", "Rows of Rectangular Shutter" }, + { 0x0029, 0x00a1, "US", "Columns of Rectangular Shutter" }, + { 0x0029, 0x00a2, "US", "Origin of Rectangular Shutter" }, + { 0x0029, 0x00b0, "US", "Radius of Circular Shutter" }, + { 0x0029, 0x00b2, "US", "Origin of Circular Shutter" }, + { 0x0029, 0x00c0, "LT", "Functional Shutter ID" }, + { 0x0029, 0x00c1, "xs", "?" }, + { 0x0029, 0x00c3, "IS", "Scan Resolution" }, + { 0x0029, 0x00c4, "IS", "Field of View" }, + { 0x0029, 0x00c5, "LT", "Field Of Shutter Rectangle" }, + { 0x0029, 0x00ce, "CS", "Shutter Enable Status" }, + { 0x0029, 0x00cf, "CS", "Shutter Select Status" }, + { 0x0029, 0x00d0, "IS", "?" }, + { 0x0029, 0x00d1, "IS", "?" }, + { 0x0029, 0x00d5, "LT", "Slice Thickness" }, + { 0x0031, 0x0010, "LT", "Request UID" }, + { 0x0031, 0x0012, "LT", "Examination Reason" }, + { 0x0031, 0x0030, "DA", "Requested Date" }, + { 0x0031, 0x0032, "TM", "Worklist Request Start Time" }, + { 0x0031, 0x0033, "TM", "Worklist Request End Time" }, + { 0x0031, 0x0045, "LT", "Requesting Physician" }, + { 0x0031, 0x004a, "TM", "Requested Time" }, + { 0x0031, 0x0050, "LT", "Requested Physician" }, + { 0x0031, 0x0080, "LT", "Requested Location" }, + { 0x0032, 0x0000, "UL", "Study Group Length" }, + { 0x0032, 0x000a, "CS", "Study Status ID" }, + { 0x0032, 0x000c, "CS", "Study Priority ID" }, + { 0x0032, 0x0012, "LO", "Study ID Issuer" }, + { 0x0032, 0x0032, "DA", "Study Verified Date" }, + { 0x0032, 0x0033, "TM", "Study Verified Time" }, + { 0x0032, 0x0034, "DA", "Study Read Date" }, + { 0x0032, 0x0035, "TM", "Study Read Time" }, + { 0x0032, 0x1000, "DA", "Scheduled Study Start Date" }, + { 0x0032, 0x1001, "TM", "Scheduled Study Start Time" }, + { 0x0032, 0x1010, "DA", "Scheduled Study Stop Date" }, + { 0x0032, 0x1011, "TM", "Scheduled Study Stop Time" }, + { 0x0032, 0x1020, "LO", "Scheduled Study Location" }, + { 0x0032, 0x1021, "AE", "Scheduled Study Location AE Title(s)" }, + { 0x0032, 0x1030, "LO", "Reason for Study" }, + { 0x0032, 0x1032, "PN", "Requesting Physician" }, + { 0x0032, 0x1033, "LO", "Requesting Service" }, + { 0x0032, 0x1040, "DA", "Study Arrival Date" }, + { 0x0032, 0x1041, "TM", "Study Arrival Time" }, + { 0x0032, 0x1050, "DA", "Study Completion Date" }, + { 0x0032, 0x1051, "TM", "Study Completion Time" }, + { 0x0032, 0x1055, "CS", "Study Component Status ID" }, + { 0x0032, 0x1060, "LO", "Requested Procedure Description" }, + { 0x0032, 0x1064, "SQ", "Requested Procedure Code Sequence" }, + { 0x0032, 0x1070, "LO", "Requested Contrast Agent" }, + { 0x0032, 0x4000, "LT", "Study Comments" }, + { 0x0033, 0x0001, "UN", "?" }, + { 0x0033, 0x0002, "UN", "?" }, + { 0x0033, 0x0005, "UN", "?" }, + { 0x0033, 0x0006, "UN", "?" }, + { 0x0033, 0x0010, "LT", "Patient Study UID" }, + { 0x0037, 0x0010, "LO", "ReferringDepartment" }, + { 0x0037, 0x0020, "US", "ScreenNumber" }, + { 0x0037, 0x0040, "SH", "LeftOrientation" }, + { 0x0037, 0x0042, "SH", "RightOrientation" }, + { 0x0037, 0x0050, "CS", "Inversion" }, + { 0x0037, 0x0060, "US", "DSA" }, + { 0x0038, 0x0000, "UL", "Visit Group Length" }, + { 0x0038, 0x0004, "SQ", "Referenced Patient Alias Sequence" }, + { 0x0038, 0x0008, "CS", "Visit Status ID" }, + { 0x0038, 0x0010, "LO", "Admission ID" }, + { 0x0038, 0x0011, "LO", "Issuer of Admission ID" }, + { 0x0038, 0x0016, "LO", "Route of Admissions" }, + { 0x0038, 0x001a, "DA", "Scheduled Admission Date" }, + { 0x0038, 0x001b, "TM", "Scheduled Admission Time" }, + { 0x0038, 0x001c, "DA", "Scheduled Discharge Date" }, + { 0x0038, 0x001d, "TM", "Scheduled Discharge Time" }, + { 0x0038, 0x001e, "LO", "Scheduled Patient Institution Residence" }, + { 0x0038, 0x0020, "DA", "Admitting Date" }, + { 0x0038, 0x0021, "TM", "Admitting Time" }, + { 0x0038, 0x0030, "DA", "Discharge Date" }, + { 0x0038, 0x0032, "TM", "Discharge Time" }, + { 0x0038, 0x0040, "LO", "Discharge Diagnosis Description" }, + { 0x0038, 0x0044, "SQ", "Discharge Diagnosis Code Sequence" }, + { 0x0038, 0x0050, "LO", "Special Needs" }, + { 0x0038, 0x0300, "LO", "Current Patient Location" }, + { 0x0038, 0x0400, "LO", "Patient's Institution Residence" }, + { 0x0038, 0x0500, "LO", "Patient State" }, + { 0x0038, 0x4000, "LT", "Visit Comments" }, + { 0x0039, 0x0080, "IS", "Private Entity Number" }, + { 0x0039, 0x0085, "DA", "Private Entity Date" }, + { 0x0039, 0x0090, "TM", "Private Entity Time" }, + { 0x0039, 0x0095, "LO", "Private Entity Launch Command" }, + { 0x0039, 0x00aa, "CS", "Private Entity Type" }, + { 0x003a, 0x0002, "SQ", "Waveform Sequence" }, + { 0x003a, 0x0005, "US", "Waveform Number of Channels" }, + { 0x003a, 0x0010, "UL", "Waveform Number of Samples" }, + { 0x003a, 0x001a, "DS", "Sampling Frequency" }, + { 0x003a, 0x0020, "SH", "Group Label" }, + { 0x003a, 0x0103, "CS", "Waveform Sample Value Representation" }, + { 0x003a, 0x0122, "OB", "Waveform Padding Value" }, + { 0x003a, 0x0200, "SQ", "Channel Definition" }, + { 0x003a, 0x0202, "IS", "Waveform Channel Number" }, + { 0x003a, 0x0203, "SH", "Channel Label" }, + { 0x003a, 0x0205, "CS", "Channel Status" }, + { 0x003a, 0x0208, "SQ", "Channel Source" }, + { 0x003a, 0x0209, "SQ", "Channel Source Modifiers" }, + { 0x003a, 0x020a, "SQ", "Differential Channel Source" }, + { 0x003a, 0x020b, "SQ", "Differential Channel Source Modifiers" }, + { 0x003a, 0x0210, "DS", "Channel Sensitivity" }, + { 0x003a, 0x0211, "SQ", "Channel Sensitivity Units" }, + { 0x003a, 0x0212, "DS", "Channel Sensitivity Correction Factor" }, + { 0x003a, 0x0213, "DS", "Channel Baseline" }, + { 0x003a, 0x0214, "DS", "Channel Time Skew" }, + { 0x003a, 0x0215, "DS", "Channel Sample Skew" }, + { 0x003a, 0x0216, "OB", "Channel Minimum Value" }, + { 0x003a, 0x0217, "OB", "Channel Maximum Value" }, + { 0x003a, 0x0218, "DS", "Channel Offset" }, + { 0x003a, 0x021a, "US", "Bits Per Sample" }, + { 0x003a, 0x0220, "DS", "Filter Low Frequency" }, + { 0x003a, 0x0221, "DS", "Filter High Frequency" }, + { 0x003a, 0x0222, "DS", "Notch Filter Frequency" }, + { 0x003a, 0x0223, "DS", "Notch Filter Bandwidth" }, + { 0x003a, 0x1000, "OB", "Waveform Data" }, + { 0x0040, 0x0001, "AE", "Scheduled Station AE Title" }, + { 0x0040, 0x0002, "DA", "Scheduled Procedure Step Start Date" }, + { 0x0040, 0x0003, "TM", "Scheduled Procedure Step Start Time" }, + { 0x0040, 0x0004, "DA", "Scheduled Procedure Step End Date" }, + { 0x0040, 0x0005, "TM", "Scheduled Procedure Step End Time" }, + { 0x0040, 0x0006, "PN", "Scheduled Performing Physician Name" }, + { 0x0040, 0x0007, "LO", "Scheduled Procedure Step Description" }, + { 0x0040, 0x0008, "SQ", "Scheduled Action Item Code Sequence" }, + { 0x0040, 0x0009, "SH", "Scheduled Procedure Step ID" }, + { 0x0040, 0x0010, "SH", "Scheduled Station Name" }, + { 0x0040, 0x0011, "SH", "Scheduled Procedure Step Location" }, + { 0x0040, 0x0012, "LO", "Pre-Medication" }, + { 0x0040, 0x0020, "CS", "Scheduled Procedure Step Status" }, + { 0x0040, 0x0100, "SQ", "Scheduled Procedure Step Sequence" }, + { 0x0040, 0x0302, "US", "Entrance Dose" }, + { 0x0040, 0x0303, "US", "Exposed Area" }, + { 0x0040, 0x0306, "DS", "Distance Source to Entrance" }, + { 0x0040, 0x0307, "DS", "Distance Source to Support" }, + { 0x0040, 0x0310, "ST", "Comments On Radiation Dose" }, + { 0x0040, 0x0312, "DS", "X-Ray Output" }, + { 0x0040, 0x0314, "DS", "Half Value Layer" }, + { 0x0040, 0x0316, "DS", "Organ Dose" }, + { 0x0040, 0x0318, "CS", "Organ Exposed" }, + { 0x0040, 0x0400, "LT", "Comments On Scheduled Procedure Step" }, + { 0x0040, 0x050a, "LO", "Specimen Accession Number" }, + { 0x0040, 0x0550, "SQ", "Specimen Sequence" }, + { 0x0040, 0x0551, "LO", "Specimen Identifier" }, + { 0x0040, 0x0552, "SQ", "Specimen Description Sequence" }, + { 0x0040, 0x0553, "ST", "Specimen Description" }, + { 0x0040, 0x0555, "SQ", "Acquisition Context Sequence" }, + { 0x0040, 0x0556, "ST", "Acquisition Context Description" }, + { 0x0040, 0x059a, "SQ", "Specimen Type Code Sequence" }, + { 0x0040, 0x06fa, "LO", "Slide Identifier" }, + { 0x0040, 0x071a, "SQ", "Image Center Point Coordinates Sequence" }, + { 0x0040, 0x072a, "DS", "X Offset In Slide Coordinate System" }, + { 0x0040, 0x073a, "DS", "Y Offset In Slide Coordinate System" }, + { 0x0040, 0x074a, "DS", "Z Offset In Slide Coordinate System" }, + { 0x0040, 0x08d8, "SQ", "Pixel Spacing Sequence" }, + { 0x0040, 0x08da, "SQ", "Coordinate System Axis Code Sequence" }, + { 0x0040, 0x08ea, "SQ", "Measurement Units Code Sequence" }, + { 0x0040, 0x09f8, "SQ", "Vital Stain Code Sequence" }, + { 0x0040, 0x1001, "SH", "Requested Procedure ID" }, + { 0x0040, 0x1002, "LO", "Reason For Requested Procedure" }, + { 0x0040, 0x1003, "SH", "Requested Procedure Priority" }, + { 0x0040, 0x1004, "LO", "Patient Transport Arrangements" }, + { 0x0040, 0x1005, "LO", "Requested Procedure Location" }, + { 0x0040, 0x1006, "SH", "Placer Order Number of Procedure" }, + { 0x0040, 0x1007, "SH", "Filler Order Number of Procedure" }, + { 0x0040, 0x1008, "LO", "Confidentiality Code" }, + { 0x0040, 0x1009, "SH", "Reporting Priority" }, + { 0x0040, 0x1010, "PN", "Names of Intended Recipients of Results" }, + { 0x0040, 0x1400, "LT", "Requested Procedure Comments" }, + { 0x0040, 0x2001, "LO", "Reason For Imaging Service Request" }, + { 0x0040, 0x2004, "DA", "Issue Date of Imaging Service Request" }, + { 0x0040, 0x2005, "TM", "Issue Time of Imaging Service Request" }, + { 0x0040, 0x2006, "SH", "Placer Order Number of Imaging Service Request" }, + { 0x0040, 0x2007, "SH", "Filler Order Number of Imaging Service Request" }, + { 0x0040, 0x2008, "PN", "Order Entered By" }, + { 0x0040, 0x2009, "SH", "Order Enterer Location" }, + { 0x0040, 0x2010, "SH", "Order Callback Phone Number" }, + { 0x0040, 0x2400, "LT", "Imaging Service Request Comments" }, + { 0x0040, 0x3001, "LO", "Confidentiality Constraint On Patient Data" }, + { 0x0040, 0xa007, "CS", "Findings Flag" }, + { 0x0040, 0xa020, "SQ", "Findings Sequence" }, + { 0x0040, 0xa021, "UI", "Findings Group UID" }, + { 0x0040, 0xa022, "UI", "Referenced Findings Group UID" }, + { 0x0040, 0xa023, "DA", "Findings Group Recording Date" }, + { 0x0040, 0xa024, "TM", "Findings Group Recording Time" }, + { 0x0040, 0xa026, "SQ", "Findings Source Category Code Sequence" }, + { 0x0040, 0xa027, "LO", "Documenting Organization" }, + { 0x0040, 0xa028, "SQ", "Documenting Organization Identifier Code Sequence" }, + { 0x0040, 0xa032, "LO", "History Reliability Qualifier Description" }, + { 0x0040, 0xa043, "SQ", "Concept Name Code Sequence" }, + { 0x0040, 0xa047, "LO", "Measurement Precision Description" }, + { 0x0040, 0xa057, "CS", "Urgency or Priority Alerts" }, + { 0x0040, 0xa060, "LO", "Sequencing Indicator" }, + { 0x0040, 0xa066, "SQ", "Document Identifier Code Sequence" }, + { 0x0040, 0xa067, "PN", "Document Author" }, + { 0x0040, 0xa068, "SQ", "Document Author Identifier Code Sequence" }, + { 0x0040, 0xa070, "SQ", "Identifier Code Sequence" }, + { 0x0040, 0xa073, "LO", "Object String Identifier" }, + { 0x0040, 0xa074, "OB", "Object Binary Identifier" }, + { 0x0040, 0xa075, "PN", "Documenting Observer" }, + { 0x0040, 0xa076, "SQ", "Documenting Observer Identifier Code Sequence" }, + { 0x0040, 0xa078, "SQ", "Observation Subject Identifier Code Sequence" }, + { 0x0040, 0xa080, "SQ", "Person Identifier Code Sequence" }, + { 0x0040, 0xa085, "SQ", "Procedure Identifier Code Sequence" }, + { 0x0040, 0xa088, "LO", "Object Directory String Identifier" }, + { 0x0040, 0xa089, "OB", "Object Directory Binary Identifier" }, + { 0x0040, 0xa090, "CS", "History Reliability Qualifier" }, + { 0x0040, 0xa0a0, "CS", "Referenced Type of Data" }, + { 0x0040, 0xa0b0, "US", "Referenced Waveform Channels" }, + { 0x0040, 0xa110, "DA", "Date of Document or Verbal Transaction" }, + { 0x0040, 0xa112, "TM", "Time of Document Creation or Verbal Transaction" }, + { 0x0040, 0xa121, "DA", "Date" }, + { 0x0040, 0xa122, "TM", "Time" }, + { 0x0040, 0xa123, "PN", "Person Name" }, + { 0x0040, 0xa124, "SQ", "Referenced Person Sequence" }, + { 0x0040, 0xa125, "CS", "Report Status ID" }, + { 0x0040, 0xa130, "CS", "Temporal Range Type" }, + { 0x0040, 0xa132, "UL", "Referenced Sample Offsets" }, + { 0x0040, 0xa136, "US", "Referenced Frame Numbers" }, + { 0x0040, 0xa138, "DS", "Referenced Time Offsets" }, + { 0x0040, 0xa13a, "DT", "Referenced Datetime" }, + { 0x0040, 0xa160, "UT", "Text Value" }, + { 0x0040, 0xa167, "SQ", "Observation Category Code Sequence" }, + { 0x0040, 0xa168, "SQ", "Concept Code Sequence" }, + { 0x0040, 0xa16a, "ST", "Bibliographic Citation" }, + { 0x0040, 0xa170, "CS", "Observation Class" }, + { 0x0040, 0xa171, "UI", "Observation UID" }, + { 0x0040, 0xa172, "UI", "Referenced Observation UID" }, + { 0x0040, 0xa173, "CS", "Referenced Observation Class" }, + { 0x0040, 0xa174, "CS", "Referenced Object Observation Class" }, + { 0x0040, 0xa180, "US", "Annotation Group Number" }, + { 0x0040, 0xa192, "DA", "Observation Date" }, + { 0x0040, 0xa193, "TM", "Observation Time" }, + { 0x0040, 0xa194, "CS", "Measurement Automation" }, + { 0x0040, 0xa195, "SQ", "Concept Name Code Sequence Modifier" }, + { 0x0040, 0xa224, "ST", "Identification Description" }, + { 0x0040, 0xa290, "CS", "Coordinates Set Geometric Type" }, + { 0x0040, 0xa296, "SQ", "Algorithm Code Sequence" }, + { 0x0040, 0xa297, "ST", "Algorithm Description" }, + { 0x0040, 0xa29a, "SL", "Pixel Coordinates Set" }, + { 0x0040, 0xa300, "SQ", "Measured Value Sequence" }, + { 0x0040, 0xa307, "PN", "Current Observer" }, + { 0x0040, 0xa30a, "DS", "Numeric Value" }, + { 0x0040, 0xa313, "SQ", "Referenced Accession Sequence" }, + { 0x0040, 0xa33a, "ST", "Report Status Comment" }, + { 0x0040, 0xa340, "SQ", "Procedure Context Sequence" }, + { 0x0040, 0xa352, "PN", "Verbal Source" }, + { 0x0040, 0xa353, "ST", "Address" }, + { 0x0040, 0xa354, "LO", "Telephone Number" }, + { 0x0040, 0xa358, "SQ", "Verbal Source Identifier Code Sequence" }, + { 0x0040, 0xa380, "SQ", "Report Detail Sequence" }, + { 0x0040, 0xa402, "UI", "Observation Subject UID" }, + { 0x0040, 0xa403, "CS", "Observation Subject Class" }, + { 0x0040, 0xa404, "SQ", "Observation Subject Type Code Sequence" }, + { 0x0040, 0xa600, "CS", "Observation Subject Context Flag" }, + { 0x0040, 0xa601, "CS", "Observer Context Flag" }, + { 0x0040, 0xa603, "CS", "Procedure Context Flag" }, + { 0x0040, 0xa730, "SQ", "Observations Sequence" }, + { 0x0040, 0xa731, "SQ", "Relationship Sequence" }, + { 0x0040, 0xa732, "SQ", "Relationship Type Code Sequence" }, + { 0x0040, 0xa744, "SQ", "Language Code Sequence" }, + { 0x0040, 0xa992, "ST", "Uniform Resource Locator" }, + { 0x0040, 0xb020, "SQ", "Annotation Sequence" }, + { 0x0040, 0xdb73, "SQ", "Relationship Type Code Sequence Modifier" }, + { 0x0041, 0x0000, "LT", "Papyrus Comments" }, + { 0x0041, 0x0010, "xs", "?" }, + { 0x0041, 0x0011, "xs", "?" }, + { 0x0041, 0x0012, "UL", "Pixel Offset" }, + { 0x0041, 0x0013, "SQ", "Image Identifier Sequence" }, + { 0x0041, 0x0014, "SQ", "External File Reference Sequence" }, + { 0x0041, 0x0015, "US", "Number of Images" }, + { 0x0041, 0x0020, "xs", "?" }, + { 0x0041, 0x0021, "UI", "Referenced SOP Class UID" }, + { 0x0041, 0x0022, "UI", "Referenced SOP Instance UID" }, + { 0x0041, 0x0030, "xs", "?" }, + { 0x0041, 0x0031, "xs", "?" }, + { 0x0041, 0x0032, "xs", "?" }, + { 0x0041, 0x0034, "DA", "Modified Date" }, + { 0x0041, 0x0036, "TM", "Modified Time" }, + { 0x0041, 0x0040, "LT", "Owner Name" }, + { 0x0041, 0x0041, "UI", "Referenced Image SOP Class UID" }, + { 0x0041, 0x0042, "UI", "Referenced Image SOP Instance UID" }, + { 0x0041, 0x0050, "xs", "?" }, + { 0x0041, 0x0060, "UL", "Number of Images" }, + { 0x0041, 0x0062, "UL", "Number of Other" }, + { 0x0041, 0x00a0, "LT", "External Folder Element DSID" }, + { 0x0041, 0x00a1, "US", "External Folder Element Data Set Type" }, + { 0x0041, 0x00a2, "LT", "External Folder Element File Location" }, + { 0x0041, 0x00a3, "UL", "External Folder Element Length" }, + { 0x0041, 0x00b0, "LT", "Internal Folder Element DSID" }, + { 0x0041, 0x00b1, "US", "Internal Folder Element Data Set Type" }, + { 0x0041, 0x00b2, "UL", "Internal Offset To Data Set" }, + { 0x0041, 0x00b3, "UL", "Internal Offset To Image" }, + { 0x0043, 0x0001, "SS", "Bitmap Of Prescan Options" }, + { 0x0043, 0x0002, "SS", "Gradient Offset In X" }, + { 0x0043, 0x0003, "SS", "Gradient Offset In Y" }, + { 0x0043, 0x0004, "SS", "Gradient Offset In Z" }, + { 0x0043, 0x0005, "SS", "Image Is Original Or Unoriginal" }, + { 0x0043, 0x0006, "SS", "Number Of EPI Shots" }, + { 0x0043, 0x0007, "SS", "Views Per Segment" }, + { 0x0043, 0x0008, "SS", "Respiratory Rate In BPM" }, + { 0x0043, 0x0009, "SS", "Respiratory Trigger Point" }, + { 0x0043, 0x000a, "SS", "Type Of Receiver Used" }, + { 0x0043, 0x000b, "DS", "Peak Rate Of Change Of Gradient Field" }, + { 0x0043, 0x000c, "DS", "Limits In Units Of Percent" }, + { 0x0043, 0x000d, "DS", "PSD Estimated Limit" }, + { 0x0043, 0x000e, "DS", "PSD Estimated Limit In Tesla Per Second" }, + { 0x0043, 0x000f, "DS", "SAR Avg Head" }, + { 0x0043, 0x0010, "US", "Window Value" }, + { 0x0043, 0x0011, "US", "Total Input Views" }, + { 0x0043, 0x0012, "SS", "Xray Chain" }, + { 0x0043, 0x0013, "SS", "Recon Kernel Parameters" }, + { 0x0043, 0x0014, "SS", "Calibration Parameters" }, + { 0x0043, 0x0015, "SS", "Total Output Views" }, + { 0x0043, 0x0016, "SS", "Number Of Overranges" }, + { 0x0043, 0x0017, "DS", "IBH Image Scale Factors" }, + { 0x0043, 0x0018, "DS", "BBH Coefficients" }, + { 0x0043, 0x0019, "SS", "Number Of BBH Chains To Blend" }, + { 0x0043, 0x001a, "SL", "Starting Channel Number" }, + { 0x0043, 0x001b, "SS", "PPScan Parameters" }, + { 0x0043, 0x001c, "SS", "GE Image Integrity" }, + { 0x0043, 0x001d, "SS", "Level Value" }, + { 0x0043, 0x001e, "xs", "?" }, + { 0x0043, 0x001f, "SL", "Max Overranges In A View" }, + { 0x0043, 0x0020, "DS", "Avg Overranges All Views" }, + { 0x0043, 0x0021, "SS", "Corrected Afterglow Terms" }, + { 0x0043, 0x0025, "SS", "Reference Channels" }, + { 0x0043, 0x0026, "US", "No Views Ref Channels Blocked" }, + { 0x0043, 0x0027, "xs", "?" }, + { 0x0043, 0x0028, "OB", "Unique Image Identifier" }, + { 0x0043, 0x0029, "OB", "Histogram Tables" }, + { 0x0043, 0x002a, "OB", "User Defined Data" }, + { 0x0043, 0x002b, "SS", "Private Scan Options" }, + { 0x0043, 0x002c, "SS", "Effective Echo Spacing" }, + { 0x0043, 0x002d, "SH", "String Slop Field 1" }, + { 0x0043, 0x002e, "SH", "String Slop Field 2" }, + { 0x0043, 0x002f, "SS", "Raw Data Type" }, + { 0x0043, 0x0030, "SS", "Raw Data Type" }, + { 0x0043, 0x0031, "DS", "RA Coord Of Target Recon Centre" }, + { 0x0043, 0x0032, "SS", "Raw Data Type" }, + { 0x0043, 0x0033, "FL", "Neg Scan Spacing" }, + { 0x0043, 0x0034, "IS", "Offset Frequency" }, + { 0x0043, 0x0035, "UL", "User Usage Tag" }, + { 0x0043, 0x0036, "UL", "User Fill Map MSW" }, + { 0x0043, 0x0037, "UL", "User Fill Map LSW" }, + { 0x0043, 0x0038, "FL", "User 25 To User 48" }, + { 0x0043, 0x0039, "IS", "Slop Integer 6 To Slop Integer 9" }, + { 0x0043, 0x0040, "FL", "Trigger On Position" }, + { 0x0043, 0x0041, "FL", "Degree Of Rotation" }, + { 0x0043, 0x0042, "SL", "DAS Trigger Source" }, + { 0x0043, 0x0043, "SL", "DAS Fpa Gain" }, + { 0x0043, 0x0044, "SL", "DAS Output Source" }, + { 0x0043, 0x0045, "SL", "DAS Ad Input" }, + { 0x0043, 0x0046, "SL", "DAS Cal Mode" }, + { 0x0043, 0x0047, "SL", "DAS Cal Frequency" }, + { 0x0043, 0x0048, "SL", "DAS Reg Xm" }, + { 0x0043, 0x0049, "SL", "DAS Auto Zero" }, + { 0x0043, 0x004a, "SS", "Starting Channel Of View" }, + { 0x0043, 0x004b, "SL", "DAS Xm Pattern" }, + { 0x0043, 0x004c, "SS", "TGGC Trigger Mode" }, + { 0x0043, 0x004d, "FL", "Start Scan To Xray On Delay" }, + { 0x0043, 0x004e, "FL", "Duration Of Xray On" }, + { 0x0044, 0x0000, "UI", "?" }, + { 0x0045, 0x0004, "CS", "AES" }, + { 0x0045, 0x0006, "DS", "Angulation" }, + { 0x0045, 0x0009, "DS", "Real Magnification Factor" }, + { 0x0045, 0x000b, "CS", "Senograph Type" }, + { 0x0045, 0x000c, "DS", "Integration Time" }, + { 0x0045, 0x000d, "DS", "ROI Origin X and Y" }, + { 0x0045, 0x0011, "DS", "Receptor Size cm X and Y" }, + { 0x0045, 0x0012, "IS", "Receptor Size Pixels X and Y" }, + { 0x0045, 0x0013, "ST", "Screen" }, + { 0x0045, 0x0014, "DS", "Pixel Pitch Microns" }, + { 0x0045, 0x0015, "IS", "Pixel Depth Bits" }, + { 0x0045, 0x0016, "IS", "Binning Factor X and Y" }, + { 0x0045, 0x001b, "CS", "Clinical View" }, + { 0x0045, 0x001d, "DS", "Mean Of Raw Gray Levels" }, + { 0x0045, 0x001e, "DS", "Mean Of Offset Gray Levels" }, + { 0x0045, 0x001f, "DS", "Mean Of Corrected Gray Levels" }, + { 0x0045, 0x0020, "DS", "Mean Of Region Gray Levels" }, + { 0x0045, 0x0021, "DS", "Mean Of Log Region Gray Levels" }, + { 0x0045, 0x0022, "DS", "Standard Deviation Of Raw Gray Levels" }, + { 0x0045, 0x0023, "DS", "Standard Deviation Of Corrected Gray Levels" }, + { 0x0045, 0x0024, "DS", "Standard Deviation Of Region Gray Levels" }, + { 0x0045, 0x0025, "DS", "Standard Deviation Of Log Region Gray Levels" }, + { 0x0045, 0x0026, "OB", "MAO Buffer" }, + { 0x0045, 0x0027, "IS", "Set Number" }, + { 0x0045, 0x0028, "CS", "WindowingType (LINEAR or GAMMA)" }, + { 0x0045, 0x0029, "DS", "WindowingParameters" }, + { 0x0045, 0x002a, "IS", "Crosshair Cursor X Coordinates" }, + { 0x0045, 0x002b, "IS", "Crosshair Cursor Y Coordinates" }, + { 0x0045, 0x0039, "US", "Vignette Rows" }, + { 0x0045, 0x003a, "US", "Vignette Columns" }, + { 0x0045, 0x003b, "US", "Vignette Bits Allocated" }, + { 0x0045, 0x003c, "US", "Vignette Bits Stored" }, + { 0x0045, 0x003d, "US", "Vignette High Bit" }, + { 0x0045, 0x003e, "US", "Vignette Pixel Representation" }, + { 0x0045, 0x003f, "OB", "Vignette Pixel Data" }, + { 0x0047, 0x0001, "SQ", "Reconstruction Parameters Sequence" }, + { 0x0047, 0x0050, "UL", "Volume Voxel Count" }, + { 0x0047, 0x0051, "UL", "Volume Segment Count" }, + { 0x0047, 0x0053, "US", "Volume Slice Size" }, + { 0x0047, 0x0054, "US", "Volume Slice Count" }, + { 0x0047, 0x0055, "SL", "Volume Threshold Value" }, + { 0x0047, 0x0057, "DS", "Volume Voxel Ratio" }, + { 0x0047, 0x0058, "DS", "Volume Voxel Size" }, + { 0x0047, 0x0059, "US", "Volume Z Position Size" }, + { 0x0047, 0x0060, "DS", "Volume Base Line" }, + { 0x0047, 0x0061, "DS", "Volume Center Point" }, + { 0x0047, 0x0063, "SL", "Volume Skew Base" }, + { 0x0047, 0x0064, "DS", "Volume Registration Transform Rotation Matrix" }, + { 0x0047, 0x0065, "DS", "Volume Registration Transform Translation Vector" }, + { 0x0047, 0x0070, "DS", "KVP List" }, + { 0x0047, 0x0071, "IS", "XRay Tube Current List" }, + { 0x0047, 0x0072, "IS", "Exposure List" }, + { 0x0047, 0x0080, "LO", "Acquisition DLX Identifier" }, + { 0x0047, 0x0085, "SQ", "Acquisition DLX 2D Series Sequence" }, + { 0x0047, 0x0089, "DS", "Contrast Agent Volume List" }, + { 0x0047, 0x008a, "US", "Number Of Injections" }, + { 0x0047, 0x008b, "US", "Frame Count" }, + { 0x0047, 0x0096, "IS", "Used Frames" }, + { 0x0047, 0x0091, "LO", "XA 3D Reconstruction Algorithm Name" }, + { 0x0047, 0x0092, "CS", "XA 3D Reconstruction Algorithm Version" }, + { 0x0047, 0x0093, "DA", "DLX Calibration Date" }, + { 0x0047, 0x0094, "TM", "DLX Calibration Time" }, + { 0x0047, 0x0095, "CS", "DLX Calibration Status" }, + { 0x0047, 0x0098, "US", "Transform Count" }, + { 0x0047, 0x0099, "SQ", "Transform Sequence" }, + { 0x0047, 0x009a, "DS", "Transform Rotation Matrix" }, + { 0x0047, 0x009b, "DS", "Transform Translation Vector" }, + { 0x0047, 0x009c, "LO", "Transform Label" }, + { 0x0047, 0x00b1, "US", "Wireframe Count" }, + { 0x0047, 0x00b2, "US", "Location System" }, + { 0x0047, 0x00b0, "SQ", "Wireframe List" }, + { 0x0047, 0x00b5, "LO", "Wireframe Name" }, + { 0x0047, 0x00b6, "LO", "Wireframe Group Name" }, + { 0x0047, 0x00b7, "LO", "Wireframe Color" }, + { 0x0047, 0x00b8, "SL", "Wireframe Attributes" }, + { 0x0047, 0x00b9, "SL", "Wireframe Point Count" }, + { 0x0047, 0x00ba, "SL", "Wireframe Timestamp" }, + { 0x0047, 0x00bb, "SQ", "Wireframe Point List" }, + { 0x0047, 0x00bc, "DS", "Wireframe Points Coordinates" }, + { 0x0047, 0x00c0, "DS", "Volume Upper Left High Corner RAS" }, + { 0x0047, 0x00c1, "DS", "Volume Slice To RAS Rotation Matrix" }, + { 0x0047, 0x00c2, "DS", "Volume Upper Left High Corner TLOC" }, + { 0x0047, 0x00d1, "OB", "Volume Segment List" }, + { 0x0047, 0x00d2, "OB", "Volume Gradient List" }, + { 0x0047, 0x00d3, "OB", "Volume Density List" }, + { 0x0047, 0x00d4, "OB", "Volume Z Position List" }, + { 0x0047, 0x00d5, "OB", "Volume Original Index List" }, + { 0x0050, 0x0000, "UL", "Calibration Group Length" }, + { 0x0050, 0x0004, "CS", "Calibration Object" }, + { 0x0050, 0x0010, "SQ", "DeviceSequence" }, + { 0x0050, 0x0014, "DS", "DeviceLength" }, + { 0x0050, 0x0016, "DS", "DeviceDiameter" }, + { 0x0050, 0x0017, "CS", "DeviceDiameterUnits" }, + { 0x0050, 0x0018, "DS", "DeviceVolume" }, + { 0x0050, 0x0019, "DS", "InterMarkerDistance" }, + { 0x0050, 0x0020, "LO", "DeviceDescription" }, + { 0x0050, 0x0030, "SQ", "CodedInterventionDeviceSequence" }, + { 0x0051, 0x0010, "xs", "Image Text" }, + { 0x0054, 0x0000, "UL", "Nuclear Acquisition Group Length" }, + { 0x0054, 0x0010, "US", "Energy Window Vector" }, + { 0x0054, 0x0011, "US", "Number of Energy Windows" }, + { 0x0054, 0x0012, "SQ", "Energy Window Information Sequence" }, + { 0x0054, 0x0013, "SQ", "Energy Window Range Sequence" }, + { 0x0054, 0x0014, "DS", "Energy Window Lower Limit" }, + { 0x0054, 0x0015, "DS", "Energy Window Upper Limit" }, + { 0x0054, 0x0016, "SQ", "Radiopharmaceutical Information Sequence" }, + { 0x0054, 0x0017, "IS", "Residual Syringe Counts" }, + { 0x0054, 0x0018, "SH", "Energy Window Name" }, + { 0x0054, 0x0020, "US", "Detector Vector" }, + { 0x0054, 0x0021, "US", "Number of Detectors" }, + { 0x0054, 0x0022, "SQ", "Detector Information Sequence" }, + { 0x0054, 0x0030, "US", "Phase Vector" }, + { 0x0054, 0x0031, "US", "Number of Phases" }, + { 0x0054, 0x0032, "SQ", "Phase Information Sequence" }, + { 0x0054, 0x0033, "US", "Number of Frames In Phase" }, + { 0x0054, 0x0036, "IS", "Phase Delay" }, + { 0x0054, 0x0038, "IS", "Pause Between Frames" }, + { 0x0054, 0x0050, "US", "Rotation Vector" }, + { 0x0054, 0x0051, "US", "Number of Rotations" }, + { 0x0054, 0x0052, "SQ", "Rotation Information Sequence" }, + { 0x0054, 0x0053, "US", "Number of Frames In Rotation" }, + { 0x0054, 0x0060, "US", "R-R Interval Vector" }, + { 0x0054, 0x0061, "US", "Number of R-R Intervals" }, + { 0x0054, 0x0062, "SQ", "Gated Information Sequence" }, + { 0x0054, 0x0063, "SQ", "Data Information Sequence" }, + { 0x0054, 0x0070, "US", "Time Slot Vector" }, + { 0x0054, 0x0071, "US", "Number of Time Slots" }, + { 0x0054, 0x0072, "SQ", "Time Slot Information Sequence" }, + { 0x0054, 0x0073, "DS", "Time Slot Time" }, + { 0x0054, 0x0080, "US", "Slice Vector" }, + { 0x0054, 0x0081, "US", "Number of Slices" }, + { 0x0054, 0x0090, "US", "Angular View Vector" }, + { 0x0054, 0x0100, "US", "Time Slice Vector" }, + { 0x0054, 0x0101, "US", "Number Of Time Slices" }, + { 0x0054, 0x0200, "DS", "Start Angle" }, + { 0x0054, 0x0202, "CS", "Type of Detector Motion" }, + { 0x0054, 0x0210, "IS", "Trigger Vector" }, + { 0x0054, 0x0211, "US", "Number of Triggers in Phase" }, + { 0x0054, 0x0220, "SQ", "View Code Sequence" }, + { 0x0054, 0x0222, "SQ", "View Modifier Code Sequence" }, + { 0x0054, 0x0300, "SQ", "Radionuclide Code Sequence" }, + { 0x0054, 0x0302, "SQ", "Radiopharmaceutical Route Code Sequence" }, + { 0x0054, 0x0304, "SQ", "Radiopharmaceutical Code Sequence" }, + { 0x0054, 0x0306, "SQ", "Calibration Data Sequence" }, + { 0x0054, 0x0308, "US", "Energy Window Number" }, + { 0x0054, 0x0400, "SH", "Image ID" }, + { 0x0054, 0x0410, "SQ", "Patient Orientation Code Sequence" }, + { 0x0054, 0x0412, "SQ", "Patient Orientation Modifier Code Sequence" }, + { 0x0054, 0x0414, "SQ", "Patient Gantry Relationship Code Sequence" }, + { 0x0054, 0x1000, "CS", "Positron Emission Tomography Series Type" }, + { 0x0054, 0x1001, "CS", "Positron Emission Tomography Units" }, + { 0x0054, 0x1002, "CS", "Counts Source" }, + { 0x0054, 0x1004, "CS", "Reprojection Method" }, + { 0x0054, 0x1100, "CS", "Randoms Correction Method" }, + { 0x0054, 0x1101, "LO", "Attenuation Correction Method" }, + { 0x0054, 0x1102, "CS", "Decay Correction" }, + { 0x0054, 0x1103, "LO", "Reconstruction Method" }, + { 0x0054, 0x1104, "LO", "Detector Lines of Response Used" }, + { 0x0054, 0x1105, "LO", "Scatter Correction Method" }, + { 0x0054, 0x1200, "DS", "Axial Acceptance" }, + { 0x0054, 0x1201, "IS", "Axial Mash" }, + { 0x0054, 0x1202, "IS", "Transverse Mash" }, + { 0x0054, 0x1203, "DS", "Detector Element Size" }, + { 0x0054, 0x1210, "DS", "Coincidence Window Width" }, + { 0x0054, 0x1220, "CS", "Secondary Counts Type" }, + { 0x0054, 0x1300, "DS", "Frame Reference Time" }, + { 0x0054, 0x1310, "IS", "Primary Prompts Counts Accumulated" }, + { 0x0054, 0x1311, "IS", "Secondary Counts Accumulated" }, + { 0x0054, 0x1320, "DS", "Slice Sensitivity Factor" }, + { 0x0054, 0x1321, "DS", "Decay Factor" }, + { 0x0054, 0x1322, "DS", "Dose Calibration Factor" }, + { 0x0054, 0x1323, "DS", "Scatter Fraction Factor" }, + { 0x0054, 0x1324, "DS", "Dead Time Factor" }, + { 0x0054, 0x1330, "US", "Image Index" }, + { 0x0054, 0x1400, "CS", "Counts Included" }, + { 0x0054, 0x1401, "CS", "Dead Time Correction Flag" }, + { 0x0055, 0x0046, "LT", "Current Ward" }, + { 0x0058, 0x0000, "SQ", "?" }, + { 0x0060, 0x3000, "SQ", "Histogram Sequence" }, + { 0x0060, 0x3002, "US", "Histogram Number of Bins" }, + { 0x0060, 0x3004, "xs", "Histogram First Bin Value" }, + { 0x0060, 0x3006, "xs", "Histogram Last Bin Value" }, + { 0x0060, 0x3008, "US", "Histogram Bin Width" }, + { 0x0060, 0x3010, "LO", "Histogram Explanation" }, + { 0x0060, 0x3020, "UL", "Histogram Data" }, + { 0x0070, 0x0001, "SQ", "Graphic Annotation Sequence" }, + { 0x0070, 0x0002, "CS", "Graphic Layer" }, + { 0x0070, 0x0003, "CS", "Bounding Box Annotation Units" }, + { 0x0070, 0x0004, "CS", "Anchor Point Annotation Units" }, + { 0x0070, 0x0005, "CS", "Graphic Annotation Units" }, + { 0x0070, 0x0006, "ST", "Unformatted Text Value" }, + { 0x0070, 0x0008, "SQ", "Text Object Sequence" }, + { 0x0070, 0x0009, "SQ", "Graphic Object Sequence" }, + { 0x0070, 0x0010, "FL", "Bounding Box TLHC" }, + { 0x0070, 0x0011, "FL", "Bounding Box BRHC" }, + { 0x0070, 0x0014, "FL", "Anchor Point" }, + { 0x0070, 0x0015, "CS", "Anchor Point Visibility" }, + { 0x0070, 0x0020, "US", "Graphic Dimensions" }, + { 0x0070, 0x0021, "US", "Number Of Graphic Points" }, + { 0x0070, 0x0022, "FL", "Graphic Data" }, + { 0x0070, 0x0023, "CS", "Graphic Type" }, + { 0x0070, 0x0024, "CS", "Graphic Filled" }, + { 0x0070, 0x0040, "IS", "Image Rotation" }, + { 0x0070, 0x0041, "CS", "Image Horizontal Flip" }, + { 0x0070, 0x0050, "US", "Displayed Area TLHC" }, + { 0x0070, 0x0051, "US", "Displayed Area BRHC" }, + { 0x0070, 0x0060, "SQ", "Graphic Layer Sequence" }, + { 0x0070, 0x0062, "IS", "Graphic Layer Order" }, + { 0x0070, 0x0066, "US", "Graphic Layer Recommended Display Value" }, + { 0x0070, 0x0068, "LO", "Graphic Layer Description" }, + { 0x0070, 0x0080, "CS", "Presentation Label" }, + { 0x0070, 0x0081, "LO", "Presentation Description" }, + { 0x0070, 0x0082, "DA", "Presentation Creation Date" }, + { 0x0070, 0x0083, "TM", "Presentation Creation Time" }, + { 0x0070, 0x0084, "PN", "Presentation Creator's Name" }, + { 0x0070, 0x031a, "UI", "Fiducial UID" }, + { 0x0087, 0x0010, "CS", "Media Type" }, + { 0x0087, 0x0020, "CS", "Media Location" }, + { 0x0087, 0x0050, "IS", "Estimated Retrieve Time" }, + { 0x0088, 0x0000, "UL", "Storage Group Length" }, + { 0x0088, 0x0130, "SH", "Storage Media FileSet ID" }, + { 0x0088, 0x0140, "UI", "Storage Media FileSet UID" }, + { 0x0088, 0x0200, "SQ", "Icon Image Sequence" }, + { 0x0088, 0x0904, "LO", "Topic Title" }, + { 0x0088, 0x0906, "ST", "Topic Subject" }, + { 0x0088, 0x0910, "LO", "Topic Author" }, + { 0x0088, 0x0912, "LO", "Topic Key Words" }, + { 0x0095, 0x0001, "LT", "Examination Folder ID" }, + { 0x0095, 0x0004, "UL", "Folder Reported Status" }, + { 0x0095, 0x0005, "LT", "Folder Reporting Radiologist" }, + { 0x0095, 0x0007, "LT", "SIENET ISA PLA" }, + { 0x0099, 0x0002, "UL", "Data Object Attributes" }, + { 0x00e1, 0x0001, "US", "Data Dictionary Version" }, + { 0x00e1, 0x0014, "LT", "?" }, + { 0x00e1, 0x0022, "DS", "?" }, + { 0x00e1, 0x0023, "DS", "?" }, + { 0x00e1, 0x0024, "LT", "?" }, + { 0x00e1, 0x0025, "LT", "?" }, + { 0x00e1, 0x0040, "SH", "Offset From CT MR Images" }, + { 0x0193, 0x0002, "DS", "RIS Key" }, + { 0x0307, 0x0001, "UN", "RIS Worklist IMGEF" }, + { 0x0309, 0x0001, "UN", "RIS Report IMGEF" }, + { 0x0601, 0x0000, "SH", "Implementation Version" }, + { 0x0601, 0x0020, "DS", "Relative Table Position" }, + { 0x0601, 0x0021, "DS", "Relative Table Height" }, + { 0x0601, 0x0030, "SH", "Surview Direction" }, + { 0x0601, 0x0031, "DS", "Surview Length" }, + { 0x0601, 0x0050, "SH", "Image View Type" }, + { 0x0601, 0x0070, "DS", "Batch Number" }, + { 0x0601, 0x0071, "DS", "Batch Size" }, + { 0x0601, 0x0072, "DS", "Batch Slice Number" }, + { 0x1000, 0x0000, "xs", "?" }, + { 0x1000, 0x0001, "US", "Run Length Triplet" }, + { 0x1000, 0x0002, "US", "Huffman Table Size" }, + { 0x1000, 0x0003, "US", "Huffman Table Triplet" }, + { 0x1000, 0x0004, "US", "Shift Table Size" }, + { 0x1000, 0x0005, "US", "Shift Table Triplet" }, + { 0x1010, 0x0000, "xs", "?" }, + { 0x1369, 0x0000, "US", "?" }, + { 0x2000, 0x0000, "UL", "Film Session Group Length" }, + { 0x2000, 0x0010, "IS", "Number of Copies" }, + { 0x2000, 0x0020, "CS", "Print Priority" }, + { 0x2000, 0x0030, "CS", "Medium Type" }, + { 0x2000, 0x0040, "CS", "Film Destination" }, + { 0x2000, 0x0050, "LO", "Film Session Label" }, + { 0x2000, 0x0060, "IS", "Memory Allocation" }, + { 0x2000, 0x0500, "SQ", "Referenced Film Box Sequence" }, + { 0x2010, 0x0000, "UL", "Film Box Group Length" }, + { 0x2010, 0x0010, "ST", "Image Display Format" }, + { 0x2010, 0x0030, "CS", "Annotation Display Format ID" }, + { 0x2010, 0x0040, "CS", "Film Orientation" }, + { 0x2010, 0x0050, "CS", "Film Size ID" }, + { 0x2010, 0x0060, "CS", "Magnification Type" }, + { 0x2010, 0x0080, "CS", "Smoothing Type" }, + { 0x2010, 0x0100, "CS", "Border Density" }, + { 0x2010, 0x0110, "CS", "Empty Image Density" }, + { 0x2010, 0x0120, "US", "Min Density" }, + { 0x2010, 0x0130, "US", "Max Density" }, + { 0x2010, 0x0140, "CS", "Trim" }, + { 0x2010, 0x0150, "ST", "Configuration Information" }, + { 0x2010, 0x0500, "SQ", "Referenced Film Session Sequence" }, + { 0x2010, 0x0510, "SQ", "Referenced Image Box Sequence" }, + { 0x2010, 0x0520, "SQ", "Referenced Basic Annotation Box Sequence" }, + { 0x2020, 0x0000, "UL", "Image Box Group Length" }, + { 0x2020, 0x0010, "US", "Image Box Position" }, + { 0x2020, 0x0020, "CS", "Polarity" }, + { 0x2020, 0x0030, "DS", "Requested Image Size" }, + { 0x2020, 0x0110, "SQ", "Preformatted Grayscale Image Sequence" }, + { 0x2020, 0x0111, "SQ", "Preformatted Color Image Sequence" }, + { 0x2020, 0x0130, "SQ", "Referenced Image Overlay Box Sequence" }, + { 0x2020, 0x0140, "SQ", "Referenced VOI LUT Box Sequence" }, + { 0x2030, 0x0000, "UL", "Annotation Group Length" }, + { 0x2030, 0x0010, "US", "Annotation Position" }, + { 0x2030, 0x0020, "LO", "Text String" }, + { 0x2040, 0x0000, "UL", "Overlay Box Group Length" }, + { 0x2040, 0x0010, "SQ", "Referenced Overlay Plane Sequence" }, + { 0x2040, 0x0011, "US", "Referenced Overlay Plane Groups" }, + { 0x2040, 0x0060, "CS", "Overlay Magnification Type" }, + { 0x2040, 0x0070, "CS", "Overlay Smoothing Type" }, + { 0x2040, 0x0080, "CS", "Overlay Foreground Density" }, + { 0x2040, 0x0090, "CS", "Overlay Mode" }, + { 0x2040, 0x0100, "CS", "Threshold Density" }, + { 0x2040, 0x0500, "SQ", "Referenced Overlay Image Box Sequence" }, + { 0x2050, 0x0010, "SQ", "Presentation LUT Sequence" }, + { 0x2050, 0x0020, "CS", "Presentation LUT Shape" }, + { 0x2100, 0x0000, "UL", "Print Job Group Length" }, + { 0x2100, 0x0020, "CS", "Execution Status" }, + { 0x2100, 0x0030, "CS", "Execution Status Info" }, + { 0x2100, 0x0040, "DA", "Creation Date" }, + { 0x2100, 0x0050, "TM", "Creation Time" }, + { 0x2100, 0x0070, "AE", "Originator" }, + { 0x2100, 0x0500, "SQ", "Referenced Print Job Sequence" }, + { 0x2110, 0x0000, "UL", "Printer Group Length" }, + { 0x2110, 0x0010, "CS", "Printer Status" }, + { 0x2110, 0x0020, "CS", "Printer Status Info" }, + { 0x2110, 0x0030, "LO", "Printer Name" }, + { 0x2110, 0x0099, "SH", "Print Queue ID" }, + { 0x3002, 0x0002, "SH", "RT Image Label" }, + { 0x3002, 0x0003, "LO", "RT Image Name" }, + { 0x3002, 0x0004, "ST", "RT Image Description" }, + { 0x3002, 0x000a, "CS", "Reported Values Origin" }, + { 0x3002, 0x000c, "CS", "RT Image Plane" }, + { 0x3002, 0x000e, "DS", "X-Ray Image Receptor Angle" }, + { 0x3002, 0x0010, "DS", "RTImageOrientation" }, + { 0x3002, 0x0011, "DS", "Image Plane Pixel Spacing" }, + { 0x3002, 0x0012, "DS", "RT Image Position" }, + { 0x3002, 0x0020, "SH", "Radiation Machine Name" }, + { 0x3002, 0x0022, "DS", "Radiation Machine SAD" }, + { 0x3002, 0x0024, "DS", "Radiation Machine SSD" }, + { 0x3002, 0x0026, "DS", "RT Image SID" }, + { 0x3002, 0x0028, "DS", "Source to Reference Object Distance" }, + { 0x3002, 0x0029, "IS", "Fraction Number" }, + { 0x3002, 0x0030, "SQ", "Exposure Sequence" }, + { 0x3002, 0x0032, "DS", "Meterset Exposure" }, + { 0x3004, 0x0001, "CS", "DVH Type" }, + { 0x3004, 0x0002, "CS", "Dose Units" }, + { 0x3004, 0x0004, "CS", "Dose Type" }, + { 0x3004, 0x0006, "LO", "Dose Comment" }, + { 0x3004, 0x0008, "DS", "Normalization Point" }, + { 0x3004, 0x000a, "CS", "Dose Summation Type" }, + { 0x3004, 0x000c, "DS", "GridFrame Offset Vector" }, + { 0x3004, 0x000e, "DS", "Dose Grid Scaling" }, + { 0x3004, 0x0010, "SQ", "RT Dose ROI Sequence" }, + { 0x3004, 0x0012, "DS", "Dose Value" }, + { 0x3004, 0x0040, "DS", "DVH Normalization Point" }, + { 0x3004, 0x0042, "DS", "DVH Normalization Dose Value" }, + { 0x3004, 0x0050, "SQ", "DVH Sequence" }, + { 0x3004, 0x0052, "DS", "DVH Dose Scaling" }, + { 0x3004, 0x0054, "CS", "DVH Volume Units" }, + { 0x3004, 0x0056, "IS", "DVH Number of Bins" }, + { 0x3004, 0x0058, "DS", "DVH Data" }, + { 0x3004, 0x0060, "SQ", "DVH Referenced ROI Sequence" }, + { 0x3004, 0x0062, "CS", "DVH ROI Contribution Type" }, + { 0x3004, 0x0070, "DS", "DVH Minimum Dose" }, + { 0x3004, 0x0072, "DS", "DVH Maximum Dose" }, + { 0x3004, 0x0074, "DS", "DVH Mean Dose" }, + { 0x3006, 0x0002, "SH", "Structure Set Label" }, + { 0x3006, 0x0004, "LO", "Structure Set Name" }, + { 0x3006, 0x0006, "ST", "Structure Set Description" }, + { 0x3006, 0x0008, "DA", "Structure Set Date" }, + { 0x3006, 0x0009, "TM", "Structure Set Time" }, + { 0x3006, 0x0010, "SQ", "Referenced Frame of Reference Sequence" }, + { 0x3006, 0x0012, "SQ", "RT Referenced Study Sequence" }, + { 0x3006, 0x0014, "SQ", "RT Referenced Series Sequence" }, + { 0x3006, 0x0016, "SQ", "Contour Image Sequence" }, + { 0x3006, 0x0020, "SQ", "Structure Set ROI Sequence" }, + { 0x3006, 0x0022, "IS", "ROI Number" }, + { 0x3006, 0x0024, "UI", "Referenced Frame of Reference UID" }, + { 0x3006, 0x0026, "LO", "ROI Name" }, + { 0x3006, 0x0028, "ST", "ROI Description" }, + { 0x3006, 0x002a, "IS", "ROI Display Color" }, + { 0x3006, 0x002c, "DS", "ROI Volume" }, + { 0x3006, 0x0030, "SQ", "RT Related ROI Sequence" }, + { 0x3006, 0x0033, "CS", "RT ROI Relationship" }, + { 0x3006, 0x0036, "CS", "ROI Generation Algorithm" }, + { 0x3006, 0x0038, "LO", "ROI Generation Description" }, + { 0x3006, 0x0039, "SQ", "ROI Contour Sequence" }, + { 0x3006, 0x0040, "SQ", "Contour Sequence" }, + { 0x3006, 0x0042, "CS", "Contour Geometric Type" }, + { 0x3006, 0x0044, "DS", "Contour SlabT hickness" }, + { 0x3006, 0x0045, "DS", "Contour Offset Vector" }, + { 0x3006, 0x0046, "IS", "Number of Contour Points" }, + { 0x3006, 0x0050, "DS", "Contour Data" }, + { 0x3006, 0x0080, "SQ", "RT ROI Observations Sequence" }, + { 0x3006, 0x0082, "IS", "Observation Number" }, + { 0x3006, 0x0084, "IS", "Referenced ROI Number" }, + { 0x3006, 0x0085, "SH", "ROI Observation Label" }, + { 0x3006, 0x0086, "SQ", "RT ROI Identification Code Sequence" }, + { 0x3006, 0x0088, "ST", "ROI Observation Description" }, + { 0x3006, 0x00a0, "SQ", "Related RT ROI Observations Sequence" }, + { 0x3006, 0x00a4, "CS", "RT ROI Interpreted Type" }, + { 0x3006, 0x00a6, "PN", "ROI Interpreter" }, + { 0x3006, 0x00b0, "SQ", "ROI Physical Properties Sequence" }, + { 0x3006, 0x00b2, "CS", "ROI Physical Property" }, + { 0x3006, 0x00b4, "DS", "ROI Physical Property Value" }, + { 0x3006, 0x00c0, "SQ", "Frame of Reference Relationship Sequence" }, + { 0x3006, 0x00c2, "UI", "Related Frame of Reference UID" }, + { 0x3006, 0x00c4, "CS", "Frame of Reference Transformation Type" }, + { 0x3006, 0x00c6, "DS", "Frame of Reference Transformation Matrix" }, + { 0x3006, 0x00c8, "LO", "Frame of Reference Transformation Comment" }, + { 0x300a, 0x0002, "SH", "RT Plan Label" }, + { 0x300a, 0x0003, "LO", "RT Plan Name" }, + { 0x300a, 0x0004, "ST", "RT Plan Description" }, + { 0x300a, 0x0006, "DA", "RT Plan Date" }, + { 0x300a, 0x0007, "TM", "RT Plan Time" }, + { 0x300a, 0x0009, "LO", "Treatment Protocols" }, + { 0x300a, 0x000a, "CS", "Treatment Intent" }, + { 0x300a, 0x000b, "LO", "Treatment Sites" }, + { 0x300a, 0x000c, "CS", "RT Plan Geometry" }, + { 0x300a, 0x000e, "ST", "Prescription Description" }, + { 0x300a, 0x0010, "SQ", "Dose ReferenceSequence" }, + { 0x300a, 0x0012, "IS", "Dose ReferenceNumber" }, + { 0x300a, 0x0014, "CS", "Dose Reference Structure Type" }, + { 0x300a, 0x0016, "LO", "Dose ReferenceDescription" }, + { 0x300a, 0x0018, "DS", "Dose Reference Point Coordinates" }, + { 0x300a, 0x001a, "DS", "Nominal Prior Dose" }, + { 0x300a, 0x0020, "CS", "Dose Reference Type" }, + { 0x300a, 0x0021, "DS", "Constraint Weight" }, + { 0x300a, 0x0022, "DS", "Delivery Warning Dose" }, + { 0x300a, 0x0023, "DS", "Delivery Maximum Dose" }, + { 0x300a, 0x0025, "DS", "Target Minimum Dose" }, + { 0x300a, 0x0026, "DS", "Target Prescription Dose" }, + { 0x300a, 0x0027, "DS", "Target Maximum Dose" }, + { 0x300a, 0x0028, "DS", "Target Underdose Volume Fraction" }, + { 0x300a, 0x002a, "DS", "Organ at Risk Full-volume Dose" }, + { 0x300a, 0x002b, "DS", "Organ at Risk Limit Dose" }, + { 0x300a, 0x002c, "DS", "Organ at Risk Maximum Dose" }, + { 0x300a, 0x002d, "DS", "Organ at Risk Overdose Volume Fraction" }, + { 0x300a, 0x0040, "SQ", "Tolerance Table Sequence" }, + { 0x300a, 0x0042, "IS", "Tolerance Table Number" }, + { 0x300a, 0x0043, "SH", "Tolerance Table Label" }, + { 0x300a, 0x0044, "DS", "Gantry Angle Tolerance" }, + { 0x300a, 0x0046, "DS", "Beam Limiting Device Angle Tolerance" }, + { 0x300a, 0x0048, "SQ", "Beam Limiting Device Tolerance Sequence" }, + { 0x300a, 0x004a, "DS", "Beam Limiting Device Position Tolerance" }, + { 0x300a, 0x004c, "DS", "Patient Support Angle Tolerance" }, + { 0x300a, 0x004e, "DS", "Table Top Eccentric Angle Tolerance" }, + { 0x300a, 0x0051, "DS", "Table Top Vertical Position Tolerance" }, + { 0x300a, 0x0052, "DS", "Table Top Longitudinal Position Tolerance" }, + { 0x300a, 0x0053, "DS", "Table Top Lateral Position Tolerance" }, + { 0x300a, 0x0055, "CS", "RT Plan Relationship" }, + { 0x300a, 0x0070, "SQ", "Fraction Group Sequence" }, + { 0x300a, 0x0071, "IS", "Fraction Group Number" }, + { 0x300a, 0x0078, "IS", "Number of Fractions Planned" }, + { 0x300a, 0x0079, "IS", "Number of Fractions Per Day" }, + { 0x300a, 0x007a, "IS", "Repeat Fraction Cycle Length" }, + { 0x300a, 0x007b, "LT", "Fraction Pattern" }, + { 0x300a, 0x0080, "IS", "Number of Beams" }, + { 0x300a, 0x0082, "DS", "Beam Dose Specification Point" }, + { 0x300a, 0x0084, "DS", "Beam Dose" }, + { 0x300a, 0x0086, "DS", "Beam Meterset" }, + { 0x300a, 0x00a0, "IS", "Number of Brachy Application Setups" }, + { 0x300a, 0x00a2, "DS", "Brachy Application Setup Dose Specification Point" }, + { 0x300a, 0x00a4, "DS", "Brachy Application Setup Dose" }, + { 0x300a, 0x00b0, "SQ", "Beam Sequence" }, + { 0x300a, 0x00b2, "SH", "Treatment Machine Name " }, + { 0x300a, 0x00b3, "CS", "Primary Dosimeter Unit" }, + { 0x300a, 0x00b4, "DS", "Source-Axis Distance" }, + { 0x300a, 0x00b6, "SQ", "Beam Limiting Device Sequence" }, + { 0x300a, 0x00b8, "CS", "RT Beam Limiting Device Type" }, + { 0x300a, 0x00ba, "DS", "Source to Beam Limiting Device Distance" }, + { 0x300a, 0x00bc, "IS", "Number of Leaf/Jaw Pairs" }, + { 0x300a, 0x00be, "DS", "Leaf Position Boundaries" }, + { 0x300a, 0x00c0, "IS", "Beam Number" }, + { 0x300a, 0x00c2, "LO", "Beam Name" }, + { 0x300a, 0x00c3, "ST", "Beam Description" }, + { 0x300a, 0x00c4, "CS", "Beam Type" }, + { 0x300a, 0x00c6, "CS", "Radiation Type" }, + { 0x300a, 0x00c8, "IS", "Reference Image Number" }, + { 0x300a, 0x00ca, "SQ", "Planned Verification Image Sequence" }, + { 0x300a, 0x00cc, "LO", "Imaging Device Specific Acquisition Parameters" }, + { 0x300a, 0x00ce, "CS", "Treatment Delivery Type" }, + { 0x300a, 0x00d0, "IS", "Number of Wedges" }, + { 0x300a, 0x00d1, "SQ", "Wedge Sequence" }, + { 0x300a, 0x00d2, "IS", "Wedge Number" }, + { 0x300a, 0x00d3, "CS", "Wedge Type" }, + { 0x300a, 0x00d4, "SH", "Wedge ID" }, + { 0x300a, 0x00d5, "IS", "Wedge Angle" }, + { 0x300a, 0x00d6, "DS", "Wedge Factor" }, + { 0x300a, 0x00d8, "DS", "Wedge Orientation" }, + { 0x300a, 0x00da, "DS", "Source to Wedge Tray Distance" }, + { 0x300a, 0x00e0, "IS", "Number of Compensators" }, + { 0x300a, 0x00e1, "SH", "Material ID" }, + { 0x300a, 0x00e2, "DS", "Total Compensator Tray Factor" }, + { 0x300a, 0x00e3, "SQ", "Compensator Sequence" }, + { 0x300a, 0x00e4, "IS", "Compensator Number" }, + { 0x300a, 0x00e5, "SH", "Compensator ID" }, + { 0x300a, 0x00e6, "DS", "Source to Compensator Tray Distance" }, + { 0x300a, 0x00e7, "IS", "Compensator Rows" }, + { 0x300a, 0x00e8, "IS", "Compensator Columns" }, + { 0x300a, 0x00e9, "DS", "Compensator Pixel Spacing" }, + { 0x300a, 0x00ea, "DS", "Compensator Position" }, + { 0x300a, 0x00eb, "DS", "Compensator Transmission Data" }, + { 0x300a, 0x00ec, "DS", "Compensator Thickness Data" }, + { 0x300a, 0x00ed, "IS", "Number of Boli" }, + { 0x300a, 0x00f0, "IS", "Number of Blocks" }, + { 0x300a, 0x00f2, "DS", "Total Block Tray Factor" }, + { 0x300a, 0x00f4, "SQ", "Block Sequence" }, + { 0x300a, 0x00f5, "SH", "Block Tray ID" }, + { 0x300a, 0x00f6, "DS", "Source to Block Tray Distance" }, + { 0x300a, 0x00f8, "CS", "Block Type" }, + { 0x300a, 0x00fa, "CS", "Block Divergence" }, + { 0x300a, 0x00fc, "IS", "Block Number" }, + { 0x300a, 0x00fe, "LO", "Block Name" }, + { 0x300a, 0x0100, "DS", "Block Thickness" }, + { 0x300a, 0x0102, "DS", "Block Transmission" }, + { 0x300a, 0x0104, "IS", "Block Number of Points" }, + { 0x300a, 0x0106, "DS", "Block Data" }, + { 0x300a, 0x0107, "SQ", "Applicator Sequence" }, + { 0x300a, 0x0108, "SH", "Applicator ID" }, + { 0x300a, 0x0109, "CS", "Applicator Type" }, + { 0x300a, 0x010a, "LO", "Applicator Description" }, + { 0x300a, 0x010c, "DS", "Cumulative Dose Reference Coefficient" }, + { 0x300a, 0x010e, "DS", "Final Cumulative Meterset Weight" }, + { 0x300a, 0x0110, "IS", "Number of Control Points" }, + { 0x300a, 0x0111, "SQ", "Control Point Sequence" }, + { 0x300a, 0x0112, "IS", "Control Point Index" }, + { 0x300a, 0x0114, "DS", "Nominal Beam Energy" }, + { 0x300a, 0x0115, "DS", "Dose Rate Set" }, + { 0x300a, 0x0116, "SQ", "Wedge Position Sequence" }, + { 0x300a, 0x0118, "CS", "Wedge Position" }, + { 0x300a, 0x011a, "SQ", "Beam Limiting Device Position Sequence" }, + { 0x300a, 0x011c, "DS", "Leaf Jaw Positions" }, + { 0x300a, 0x011e, "DS", "Gantry Angle" }, + { 0x300a, 0x011f, "CS", "Gantry Rotation Direction" }, + { 0x300a, 0x0120, "DS", "Beam Limiting Device Angle" }, + { 0x300a, 0x0121, "CS", "Beam Limiting Device Rotation Direction" }, + { 0x300a, 0x0122, "DS", "Patient Support Angle" }, + { 0x300a, 0x0123, "CS", "Patient Support Rotation Direction" }, + { 0x300a, 0x0124, "DS", "Table Top Eccentric Axis Distance" }, + { 0x300a, 0x0125, "DS", "Table Top Eccentric Angle" }, + { 0x300a, 0x0126, "CS", "Table Top Eccentric Rotation Direction" }, + { 0x300a, 0x0128, "DS", "Table Top Vertical Position" }, + { 0x300a, 0x0129, "DS", "Table Top Longitudinal Position" }, + { 0x300a, 0x012a, "DS", "Table Top Lateral Position" }, + { 0x300a, 0x012c, "DS", "Isocenter Position" }, + { 0x300a, 0x012e, "DS", "Surface Entry Point" }, + { 0x300a, 0x0130, "DS", "Source to Surface Distance" }, + { 0x300a, 0x0134, "DS", "Cumulative Meterset Weight" }, + { 0x300a, 0x0180, "SQ", "Patient Setup Sequence" }, + { 0x300a, 0x0182, "IS", "Patient Setup Number" }, + { 0x300a, 0x0184, "LO", "Patient Additional Position" }, + { 0x300a, 0x0190, "SQ", "Fixation Device Sequence" }, + { 0x300a, 0x0192, "CS", "Fixation Device Type" }, + { 0x300a, 0x0194, "SH", "Fixation Device Label" }, + { 0x300a, 0x0196, "ST", "Fixation Device Description" }, + { 0x300a, 0x0198, "SH", "Fixation Device Position" }, + { 0x300a, 0x01a0, "SQ", "Shielding Device Sequence" }, + { 0x300a, 0x01a2, "CS", "Shielding Device Type" }, + { 0x300a, 0x01a4, "SH", "Shielding Device Label" }, + { 0x300a, 0x01a6, "ST", "Shielding Device Description" }, + { 0x300a, 0x01a8, "SH", "Shielding Device Position" }, + { 0x300a, 0x01b0, "CS", "Setup Technique" }, + { 0x300a, 0x01b2, "ST", "Setup TechniqueDescription" }, + { 0x300a, 0x01b4, "SQ", "Setup Device Sequence" }, + { 0x300a, 0x01b6, "CS", "Setup Device Type" }, + { 0x300a, 0x01b8, "SH", "Setup Device Label" }, + { 0x300a, 0x01ba, "ST", "Setup Device Description" }, + { 0x300a, 0x01bc, "DS", "Setup Device Parameter" }, + { 0x300a, 0x01d0, "ST", "Setup ReferenceDescription" }, + { 0x300a, 0x01d2, "DS", "Table Top Vertical Setup Displacement" }, + { 0x300a, 0x01d4, "DS", "Table Top Longitudinal Setup Displacement" }, + { 0x300a, 0x01d6, "DS", "Table Top Lateral Setup Displacement" }, + { 0x300a, 0x0200, "CS", "Brachy Treatment Technique" }, + { 0x300a, 0x0202, "CS", "Brachy Treatment Type" }, + { 0x300a, 0x0206, "SQ", "Treatment Machine Sequence" }, + { 0x300a, 0x0210, "SQ", "Source Sequence" }, + { 0x300a, 0x0212, "IS", "Source Number" }, + { 0x300a, 0x0214, "CS", "Source Type" }, + { 0x300a, 0x0216, "LO", "Source Manufacturer" }, + { 0x300a, 0x0218, "DS", "Active Source Diameter" }, + { 0x300a, 0x021a, "DS", "Active Source Length" }, + { 0x300a, 0x0222, "DS", "Source Encapsulation Nominal Thickness" }, + { 0x300a, 0x0224, "DS", "Source Encapsulation Nominal Transmission" }, + { 0x300a, 0x0226, "LO", "Source IsotopeName" }, + { 0x300a, 0x0228, "DS", "Source Isotope Half Life" }, + { 0x300a, 0x022a, "DS", "Reference Air Kerma Rate" }, + { 0x300a, 0x022c, "DA", "Air Kerma Rate Reference Date" }, + { 0x300a, 0x022e, "TM", "Air Kerma Rate Reference Time" }, + { 0x300a, 0x0230, "SQ", "Application Setup Sequence" }, + { 0x300a, 0x0232, "CS", "Application Setup Type" }, + { 0x300a, 0x0234, "IS", "Application Setup Number" }, + { 0x300a, 0x0236, "LO", "Application Setup Name" }, + { 0x300a, 0x0238, "LO", "Application Setup Manufacturer" }, + { 0x300a, 0x0240, "IS", "Template Number" }, + { 0x300a, 0x0242, "SH", "Template Type" }, + { 0x300a, 0x0244, "LO", "Template Name" }, + { 0x300a, 0x0250, "DS", "Total Reference Air Kerma" }, + { 0x300a, 0x0260, "SQ", "Brachy Accessory Device Sequence" }, + { 0x300a, 0x0262, "IS", "Brachy Accessory Device Number" }, + { 0x300a, 0x0263, "SH", "Brachy Accessory Device ID" }, + { 0x300a, 0x0264, "CS", "Brachy Accessory Device Type" }, + { 0x300a, 0x0266, "LO", "Brachy Accessory Device Name" }, + { 0x300a, 0x026a, "DS", "Brachy Accessory Device Nominal Thickness" }, + { 0x300a, 0x026c, "DS", "Brachy Accessory Device Nominal Transmission" }, + { 0x300a, 0x0280, "SQ", "Channel Sequence" }, + { 0x300a, 0x0282, "IS", "Channel Number" }, + { 0x300a, 0x0284, "DS", "Channel Length" }, + { 0x300a, 0x0286, "DS", "Channel Total Time" }, + { 0x300a, 0x0288, "CS", "Source Movement Type" }, + { 0x300a, 0x028a, "IS", "Number of Pulses" }, + { 0x300a, 0x028c, "DS", "Pulse Repetition Interval" }, + { 0x300a, 0x0290, "IS", "Source Applicator Number" }, + { 0x300a, 0x0291, "SH", "Source Applicator ID" }, + { 0x300a, 0x0292, "CS", "Source Applicator Type" }, + { 0x300a, 0x0294, "LO", "Source Applicator Name" }, + { 0x300a, 0x0296, "DS", "Source Applicator Length" }, + { 0x300a, 0x0298, "LO", "Source Applicator Manufacturer" }, + { 0x300a, 0x029c, "DS", "Source Applicator Wall Nominal Thickness" }, + { 0x300a, 0x029e, "DS", "Source Applicator Wall Nominal Transmission" }, + { 0x300a, 0x02a0, "DS", "Source Applicator Step Size" }, + { 0x300a, 0x02a2, "IS", "Transfer Tube Number" }, + { 0x300a, 0x02a4, "DS", "Transfer Tube Length" }, + { 0x300a, 0x02b0, "SQ", "Channel Shield Sequence" }, + { 0x300a, 0x02b2, "IS", "Channel Shield Number" }, + { 0x300a, 0x02b3, "SH", "Channel Shield ID" }, + { 0x300a, 0x02b4, "LO", "Channel Shield Name" }, + { 0x300a, 0x02b8, "DS", "Channel Shield Nominal Thickness" }, + { 0x300a, 0x02ba, "DS", "Channel Shield Nominal Transmission" }, + { 0x300a, 0x02c8, "DS", "Final Cumulative Time Weight" }, + { 0x300a, 0x02d0, "SQ", "Brachy Control Point Sequence" }, + { 0x300a, 0x02d2, "DS", "Control Point Relative Position" }, + { 0x300a, 0x02d4, "DS", "Control Point 3D Position" }, + { 0x300a, 0x02d6, "DS", "Cumulative Time Weight" }, + { 0x300c, 0x0002, "SQ", "Referenced RT Plan Sequence" }, + { 0x300c, 0x0004, "SQ", "Referenced Beam Sequence" }, + { 0x300c, 0x0006, "IS", "Referenced Beam Number" }, + { 0x300c, 0x0007, "IS", "Referenced Reference Image Number" }, + { 0x300c, 0x0008, "DS", "Start Cumulative Meterset Weight" }, + { 0x300c, 0x0009, "DS", "End Cumulative Meterset Weight" }, + { 0x300c, 0x000a, "SQ", "Referenced Brachy Application Setup Sequence" }, + { 0x300c, 0x000c, "IS", "Referenced Brachy Application Setup Number" }, + { 0x300c, 0x000e, "IS", "Referenced Source Number" }, + { 0x300c, 0x0020, "SQ", "Referenced Fraction Group Sequence" }, + { 0x300c, 0x0022, "IS", "Referenced Fraction Group Number" }, + { 0x300c, 0x0040, "SQ", "Referenced Verification Image Sequence" }, + { 0x300c, 0x0042, "SQ", "Referenced Reference Image Sequence" }, + { 0x300c, 0x0050, "SQ", "Referenced Dose Reference Sequence" }, + { 0x300c, 0x0051, "IS", "Referenced Dose Reference Number" }, + { 0x300c, 0x0055, "SQ", "Brachy Referenced Dose Reference Sequence" }, + { 0x300c, 0x0060, "SQ", "Referenced Structure Set Sequence" }, + { 0x300c, 0x006a, "IS", "Referenced Patient Setup Number" }, + { 0x300c, 0x0080, "SQ", "Referenced Dose Sequence" }, + { 0x300c, 0x00a0, "IS", "Referenced Tolerance Table Number" }, + { 0x300c, 0x00b0, "SQ", "Referenced Bolus Sequence" }, + { 0x300c, 0x00c0, "IS", "Referenced Wedge Number" }, + { 0x300c, 0x00d0, "IS", "Referenced Compensato rNumber" }, + { 0x300c, 0x00e0, "IS", "Referenced Block Number" }, + { 0x300c, 0x00f0, "IS", "Referenced Control Point" }, + { 0x300e, 0x0002, "CS", "Approval Status" }, + { 0x300e, 0x0004, "DA", "Review Date" }, + { 0x300e, 0x0005, "TM", "Review Time" }, + { 0x300e, 0x0008, "PN", "Reviewer Name" }, + { 0x4000, 0x0000, "UL", "Text Group Length" }, + { 0x4000, 0x0010, "LT", "Text Arbitrary" }, + { 0x4000, 0x4000, "LT", "Text Comments" }, + { 0x4008, 0x0000, "UL", "Results Group Length" }, + { 0x4008, 0x0040, "SH", "Results ID" }, + { 0x4008, 0x0042, "LO", "Results ID Issuer" }, + { 0x4008, 0x0050, "SQ", "Referenced Interpretation Sequence" }, + { 0x4008, 0x00ff, "CS", "Report Production Status" }, + { 0x4008, 0x0100, "DA", "Interpretation Recorded Date" }, + { 0x4008, 0x0101, "TM", "Interpretation Recorded Time" }, + { 0x4008, 0x0102, "PN", "Interpretation Recorder" }, + { 0x4008, 0x0103, "LO", "Reference to Recorded Sound" }, + { 0x4008, 0x0108, "DA", "Interpretation Transcription Date" }, + { 0x4008, 0x0109, "TM", "Interpretation Transcription Time" }, + { 0x4008, 0x010a, "PN", "Interpretation Transcriber" }, + { 0x4008, 0x010b, "ST", "Interpretation Text" }, + { 0x4008, 0x010c, "PN", "Interpretation Author" }, + { 0x4008, 0x0111, "SQ", "Interpretation Approver Sequence" }, + { 0x4008, 0x0112, "DA", "Interpretation Approval Date" }, + { 0x4008, 0x0113, "TM", "Interpretation Approval Time" }, + { 0x4008, 0x0114, "PN", "Physician Approving Interpretation" }, + { 0x4008, 0x0115, "LT", "Interpretation Diagnosis Description" }, + { 0x4008, 0x0117, "SQ", "InterpretationDiagnosis Code Sequence" }, + { 0x4008, 0x0118, "SQ", "Results Distribution List Sequence" }, + { 0x4008, 0x0119, "PN", "Distribution Name" }, + { 0x4008, 0x011a, "LO", "Distribution Address" }, + { 0x4008, 0x0200, "SH", "Interpretation ID" }, + { 0x4008, 0x0202, "LO", "Interpretation ID Issuer" }, + { 0x4008, 0x0210, "CS", "Interpretation Type ID" }, + { 0x4008, 0x0212, "CS", "Interpretation Status ID" }, + { 0x4008, 0x0300, "ST", "Impressions" }, + { 0x4008, 0x4000, "ST", "Results Comments" }, + { 0x4009, 0x0001, "LT", "Report ID" }, + { 0x4009, 0x0020, "LT", "Report Status" }, + { 0x4009, 0x0030, "DA", "Report Creation Date" }, + { 0x4009, 0x0070, "LT", "Report Approving Physician" }, + { 0x4009, 0x00e0, "LT", "Report Text" }, + { 0x4009, 0x00e1, "LT", "Report Author" }, + { 0x4009, 0x00e3, "LT", "Reporting Radiologist" }, + { 0x5000, 0x0000, "UL", "Curve Group Length" }, + { 0x5000, 0x0005, "US", "Curve Dimensions" }, + { 0x5000, 0x0010, "US", "Number of Points" }, + { 0x5000, 0x0020, "CS", "Type of Data" }, + { 0x5000, 0x0022, "LO", "Curve Description" }, + { 0x5000, 0x0030, "SH", "Axis Units" }, + { 0x5000, 0x0040, "SH", "Axis Labels" }, + { 0x5000, 0x0103, "US", "Data Value Representation" }, + { 0x5000, 0x0104, "US", "Minimum Coordinate Value" }, + { 0x5000, 0x0105, "US", "Maximum Coordinate Value" }, + { 0x5000, 0x0106, "SH", "Curve Range" }, + { 0x5000, 0x0110, "US", "Curve Data Descriptor" }, + { 0x5000, 0x0112, "US", "Coordinate Start Value" }, + { 0x5000, 0x0114, "US", "Coordinate Step Value" }, + { 0x5000, 0x1001, "CS", "Curve Activation Layer" }, + { 0x5000, 0x2000, "US", "Audio Type" }, + { 0x5000, 0x2002, "US", "Audio Sample Format" }, + { 0x5000, 0x2004, "US", "Number of Channels" }, + { 0x5000, 0x2006, "UL", "Number of Samples" }, + { 0x5000, 0x2008, "UL", "Sample Rate" }, + { 0x5000, 0x200a, "UL", "Total Time" }, + { 0x5000, 0x200c, "xs", "Audio Sample Data" }, + { 0x5000, 0x200e, "LT", "Audio Comments" }, + { 0x5000, 0x2500, "LO", "Curve Label" }, + { 0x5000, 0x2600, "SQ", "CurveReferenced Overlay Sequence" }, + { 0x5000, 0x2610, "US", "CurveReferenced Overlay Group" }, + { 0x5000, 0x3000, "OW", "Curve Data" }, + { 0x6000, 0x0000, "UL", "Overlay Group Length" }, + { 0x6000, 0x0001, "US", "Gray Palette Color Lookup Table Descriptor" }, + { 0x6000, 0x0002, "US", "Gray Palette Color Lookup Table Data" }, + { 0x6000, 0x0010, "US", "Overlay Rows" }, + { 0x6000, 0x0011, "US", "Overlay Columns" }, + { 0x6000, 0x0012, "US", "Overlay Planes" }, + { 0x6000, 0x0015, "IS", "Number of Frames in Overlay" }, + { 0x6000, 0x0022, "LO", "Overlay Description" }, + { 0x6000, 0x0040, "CS", "Overlay Type" }, + { 0x6000, 0x0045, "CS", "Overlay Subtype" }, + { 0x6000, 0x0050, "SS", "Overlay Origin" }, + { 0x6000, 0x0051, "US", "Image Frame Origin" }, + { 0x6000, 0x0052, "US", "Plane Origin" }, + { 0x6000, 0x0060, "LO", "Overlay Compression Code" }, + { 0x6000, 0x0061, "SH", "Overlay Compression Originator" }, + { 0x6000, 0x0062, "SH", "Overlay Compression Label" }, + { 0x6000, 0x0063, "SH", "Overlay Compression Description" }, + { 0x6000, 0x0066, "AT", "Overlay Compression Step Pointers" }, + { 0x6000, 0x0068, "US", "Overlay Repeat Interval" }, + { 0x6000, 0x0069, "US", "Overlay Bits Grouped" }, + { 0x6000, 0x0100, "US", "Overlay Bits Allocated" }, + { 0x6000, 0x0102, "US", "Overlay Bit Position" }, + { 0x6000, 0x0110, "LO", "Overlay Format" }, + { 0x6000, 0x0200, "xs", "Overlay Location" }, + { 0x6000, 0x0800, "LO", "Overlay Code Label" }, + { 0x6000, 0x0802, "US", "Overlay Number of Tables" }, + { 0x6000, 0x0803, "AT", "Overlay Code Table Location" }, + { 0x6000, 0x0804, "US", "Overlay Bits For Code Word" }, + { 0x6000, 0x1001, "CS", "Overlay Activation Layer" }, + { 0x6000, 0x1100, "US", "Overlay Descriptor - Gray" }, + { 0x6000, 0x1101, "US", "Overlay Descriptor - Red" }, + { 0x6000, 0x1102, "US", "Overlay Descriptor - Green" }, + { 0x6000, 0x1103, "US", "Overlay Descriptor - Blue" }, + { 0x6000, 0x1200, "US", "Overlays - Gray" }, + { 0x6000, 0x1201, "US", "Overlays - Red" }, + { 0x6000, 0x1202, "US", "Overlays - Green" }, + { 0x6000, 0x1203, "US", "Overlays - Blue" }, + { 0x6000, 0x1301, "IS", "ROI Area" }, + { 0x6000, 0x1302, "DS", "ROI Mean" }, + { 0x6000, 0x1303, "DS", "ROI Standard Deviation" }, + { 0x6000, 0x1500, "LO", "Overlay Label" }, + { 0x6000, 0x3000, "OW", "Overlay Data" }, + { 0x6000, 0x4000, "LT", "Overlay Comments" }, + { 0x6001, 0x0000, "UN", "?" }, + { 0x6001, 0x0010, "LO", "?" }, + { 0x6001, 0x1010, "xs", "?" }, + { 0x6001, 0x1030, "xs", "?" }, + { 0x6021, 0x0000, "xs", "?" }, + { 0x6021, 0x0010, "xs", "?" }, + { 0x7001, 0x0010, "LT", "Dummy" }, + { 0x7003, 0x0010, "LT", "Info" }, + { 0x7005, 0x0010, "LT", "Dummy" }, + { 0x7000, 0x0004, "ST", "TextAnnotation" }, + { 0x7000, 0x0005, "IS", "Box" }, + { 0x7000, 0x0007, "IS", "ArrowEnd" }, + { 0x7001, 0x0001, "SL", "Private Group Length To End" }, + { 0x7001, 0x0002, "OB", "Unknown" }, + { 0x7001, 0x0011, "SL", "Private Creator" }, + { 0x7001, 0x0021, "SL", "Private Creator" }, + { 0x7001, 0x0022, "SQ", "Private Creator" }, + { 0x7001, 0x0041, "SL", "Private Creator" }, + { 0x7001, 0x0042, "SL", "Private Creator" }, + { 0x7001, 0x0051, "SL", "Private Creator" }, + { 0x7001, 0x0052, "SL", "Private Creator" }, + { 0x7001, 0x0075, "SL", "Private Creator" }, + { 0x7001, 0x0076, "SL", "Private Creator" }, + { 0x7001, 0x0077, "OB", "Private Creator" }, + { 0x7001, 0x0101, "SL", "Unknown" }, + { 0x7001, 0x0121, "SL", "Unknown" }, + { 0x7001, 0x0122, "SQ", "Unknown" }, + { 0x7fe0, 0x0000, "UL", "Pixel Data Group Length" }, + { 0x7fe0, 0x0010, "xs", "Pixel Data" }, + { 0x7fe0, 0x0020, "OW", "Coefficients SDVN" }, + { 0x7fe0, 0x0030, "OW", "Coefficients SDHN" }, + { 0x7fe0, 0x0040, "OW", "Coefficients SDDN" }, + { 0x7fe1, 0x0010, "xs", "Pixel Data" }, + { 0x7f00, 0x0000, "UL", "Variable Pixel Data Group Length" }, + { 0x7f00, 0x0010, "xs", "Variable Pixel Data" }, + { 0x7f00, 0x0011, "US", "Variable Next Data Group" }, + { 0x7f00, 0x0020, "OW", "Variable Coefficients SDVN" }, + { 0x7f00, 0x0030, "OW", "Variable Coefficients SDHN" }, + { 0x7f00, 0x0040, "OW", "Variable Coefficients SDDN" }, + { 0x7fe1, 0x0000, "OB", "Binary Data" }, + { 0x7fe3, 0x0000, "LT", "Image Graphics Format Code" }, + { 0x7fe3, 0x0010, "OB", "Image Graphics" }, + { 0x7fe3, 0x0020, "OB", "Image Graphics Dummy" }, + { 0x7ff1, 0x0001, "US", "?" }, + { 0x7ff1, 0x0002, "US", "?" }, + { 0x7ff1, 0x0003, "xs", "?" }, + { 0x7ff1, 0x0004, "IS", "?" }, + { 0x7ff1, 0x0005, "US", "?" }, + { 0x7ff1, 0x0007, "US", "?" }, + { 0x7ff1, 0x0008, "US", "?" }, + { 0x7ff1, 0x0009, "US", "?" }, + { 0x7ff1, 0x000a, "LT", "?" }, + { 0x7ff1, 0x000b, "US", "?" }, + { 0x7ff1, 0x000c, "US", "?" }, + { 0x7ff1, 0x000d, "US", "?" }, + { 0x7ff1, 0x0010, "US", "?" }, + { 0xfffc, 0xfffc, "OB", "Data Set Trailing Padding" }, + { 0xfffe, 0xe000, "!!", "Item" }, + { 0xfffe, 0xe00d, "!!", "Item Delimitation Item" }, + { 0xfffe, 0xe0dd, "!!", "Sequence Delimitation Item" }, + { 0xffff, 0xffff, "xs", (char *) NULL } + }; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s D C M % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsDCM() returns MagickTrue if the image format type, identified by the +% magick string, is DCM. +% +% The format of the IsDCM method is: +% +% MagickBooleanType IsDCM(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsDCM(const unsigned char *magick,const size_t length) +{ + if (length < 132) + return(MagickFalse); + if (LocaleNCompare((char *) (magick+128),"DICM",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d D C M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadDCMImage() reads a Digital Imaging and Communications in Medicine +% (DICOM) file and returns it. It allocates the memory necessary for the +% new Image structure and returns a pointer to the new image. +% +% The format of the ReadDCMImage method is: +% +% Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +typedef struct _DCMInfo +{ + MagickBooleanType + polarity; + + Quantum + *scale; + + size_t + bits_allocated, + bytes_per_pixel, + depth, + mask, + max_value, + samples_per_pixel, + scale_size, + signed_data, + significant_bits, + width, + height; + + MagickBooleanType + rescale; + + double + rescale_intercept, + rescale_slope, + window_center, + window_width; +} DCMInfo; + +typedef struct _DCMStreamInfo +{ + size_t + remaining, + segment_count; + + ssize_t + segments[15]; + + size_t + offset_count; + + ssize_t + *offsets; + + ssize_t + count; + + int + byte; +} DCMStreamInfo; + +static int ReadDCMByte(DCMStreamInfo *stream_info,Image *image) +{ + if (image->compression != RLECompression) + return(ReadBlobByte(image)); + if (stream_info->count == 0) + { + int + byte; + + ssize_t + count; + + if (stream_info->remaining <= 2) + stream_info->remaining=0; + else + stream_info->remaining-=2; + count=(ssize_t) ReadBlobByte(image); + byte=ReadBlobByte(image); + if (count == 128) + return(0); + else + if (count < 128) + { + /* + Literal bytes. + */ + stream_info->count=count; + stream_info->byte=(-1); + return(byte); + } + else + { + /* + Repeated bytes. + */ + stream_info->count=256-count; + stream_info->byte=byte; + return(byte); + } + } + stream_info->count--; + if (stream_info->byte >= 0) + return(stream_info->byte); + if (stream_info->remaining > 0) + stream_info->remaining--; + return(ReadBlobByte(image)); +} + +static unsigned short ReadDCMShort(DCMStreamInfo *stream_info,Image *image) +{ + int + byte, + shift; + + unsigned short + value; + + if (image->compression != RLECompression) + return(ReadBlobLSBShort(image)); + shift=image->depth < 16 ? 4 : 8; + value=(unsigned short) ReadDCMByte(stream_info,image); + byte=ReadDCMByte(stream_info,image); + if (byte < 0) + return(0); + value|=(unsigned short) (byte << shift); + return(value); +} + +static signed short ReadDCMSignedShort(DCMStreamInfo *stream_info,Image *image) +{ + union + { + unsigned short + unsigned_value; + + signed short + signed_value; + } quantum; + + quantum.unsigned_value=ReadDCMShort(stream_info,image); + return(quantum.signed_value); +} + +static MagickBooleanType ReadDCMPixels(Image *image,DCMInfo *info, + DCMStreamInfo *stream_info,MagickBooleanType first_segment, + ExceptionInfo *exception) +{ + int + byte, + index; + + MagickBooleanType + status; + + LongPixelPacket + pixel; + + ssize_t + i, + x; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + y; + + /* + Convert DCM Medical image to pixel packets. + */ + byte=0; + i=0; + status=MagickTrue; + + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + if (info->samples_per_pixel == 1) + { + int + pixel_value; + + if (info->bytes_per_pixel == 1) + pixel_value=info->polarity != MagickFalse ? ((int) info->max_value- + ReadDCMByte(stream_info,image)) : + ReadDCMByte(stream_info,image); + else + if ((info->bits_allocated != 12) || (info->significant_bits != 12)) + { + if (info->signed_data != 0) + pixel_value=ReadDCMSignedShort(stream_info,image); + else + pixel_value=(int) ReadDCMShort(stream_info,image); + if (info->polarity != MagickFalse) + pixel_value=(int) info->max_value-pixel_value; + } + else + { + if ((i & 0x01) != 0) + { + pixel_value=byte; + byte=ReadDCMByte(stream_info,image); + if (byte >= 0) + pixel_value|=(byte << 8); + } + else + { + pixel_value=ReadDCMSignedShort(stream_info,image); + byte=(int) (pixel_value & 0x0f); + pixel_value>>=4; + } + i++; + } + if (info->signed_data == 1) + pixel_value-=32767; + index=pixel_value; + if (info->rescale != MagickFalse) + { + double + scaled_value; + + scaled_value=pixel_value*info->rescale_slope+ + info->rescale_intercept; + index=(int) scaled_value; + if (info->window_width != 0) + { + double + window_max, + window_min; + + window_min=ceil(info->window_center- + (info->window_width-1.0)/2.0-0.5); + window_max=floor(info->window_center+ + (info->window_width-1.0)/2.0+0.5); + if (scaled_value <= window_min) + index=0; + else + if (scaled_value > window_max) + index=(int) info->max_value; + else + index=(int) (info->max_value*(((scaled_value- + info->window_center-0.5)/(info->window_width-1))+0.5)); + } + } + index&=info->mask; + index=(int) ConstrainColormapIndex(image,(ssize_t) index); + if (first_segment != MagickFalse) + SetPixelIndex(indexes+x,index); + else + SetPixelIndex(indexes+x,(((size_t) index) | + (((size_t) GetPixelIndex(indexes+x)) << 8))); + pixel.red=1U*image->colormap[index].red; + pixel.green=1U*image->colormap[index].green; + pixel.blue=1U*image->colormap[index].blue; + } + else + { + if (info->bytes_per_pixel == 1) + { + pixel.red=(unsigned int) ReadDCMByte(stream_info,image); + pixel.green=(unsigned int) ReadDCMByte(stream_info,image); + pixel.blue=(unsigned int) ReadDCMByte(stream_info,image); + } + else + { + pixel.red=ReadDCMShort(stream_info,image); + pixel.green=ReadDCMShort(stream_info,image); + pixel.blue=ReadDCMShort(stream_info,image); + } + pixel.red&=info->mask; + pixel.green&=info->mask; + pixel.blue&=info->mask; + if (info->scale != (Quantum *) NULL) + { + if ((MagickSizeType) pixel.red <= GetQuantumRange(info->depth)) + pixel.red=info->scale[pixel.red]; + if ((MagickSizeType) pixel.green <= GetQuantumRange(info->depth)) + pixel.green=info->scale[pixel.green]; + if ((MagickSizeType) pixel.blue <= GetQuantumRange(info->depth)) + pixel.blue=info->scale[pixel.blue]; + } + } + if (first_segment != MagickFalse) + { + SetPixelRed(q,pixel.red); + SetPixelGreen(q,pixel.green); + SetPixelBlue(q,pixel.blue); + } + else + { + SetPixelRed(q,(Quantum) (((size_t) pixel.red) | + (((size_t) GetPixelRed(q)) << 8))); + SetPixelGreen(q,(Quantum) (((size_t) pixel.green) | + (((size_t) GetPixelGreen(q)) << 8))); + SetPixelBlue(q,(Quantum) (((size_t) pixel.blue) | + (((size_t) GetPixelBlue(q)) << 8))); + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + return(status); +} + +static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define ThrowDCMException(exception,message) \ +{ \ + if (info.scale != (Quantum *) NULL) \ + info.scale=(Quantum *) RelinquishMagickMemory(info.scale); \ + if (data != (unsigned char *) NULL) \ + data=(unsigned char *) RelinquishMagickMemory(data); \ + if (graymap != (int *) NULL) \ + graymap=(int *) RelinquishMagickMemory(graymap); \ + if (bluemap != (int *) NULL) \ + bluemap=(int *) RelinquishMagickMemory(bluemap); \ + if (greenmap != (int *) NULL) \ + greenmap=(int *) RelinquishMagickMemory(greenmap); \ + if (redmap != (int *) NULL) \ + redmap=(int *) RelinquishMagickMemory(redmap); \ + if (stream_info->offsets != (ssize_t *) NULL) \ + stream_info->offsets=(ssize_t *) RelinquishMagickMemory( \ + stream_info->offsets); \ + if (stream_info != (DCMStreamInfo *) NULL) \ + stream_info=(DCMStreamInfo *) RelinquishMagickMemory(stream_info); \ + if (stack != (LinkedListInfo *) NULL) \ + stack=DestroyLinkedList(stack,RelinquishMagickMemory); \ + ThrowReaderException((exception),(message)); \ +} + + char + explicit_vr[MaxTextExtent], + implicit_vr[MaxTextExtent], + magick[MaxTextExtent], + photometric[MaxTextExtent]; + + DCMInfo + info; + + DCMStreamInfo + *stream_info; + + Image + *image; + + int + *bluemap, + datum, + *greenmap, + *graymap, + *redmap; + + LinkedListInfo + *stack; + + MagickBooleanType + explicit_file, + explicit_retry, + use_explicit; + + MagickOffsetType + offset; + + unsigned char + *p; + + ssize_t + i; + + size_t + colors, + length, + number_scenes, + quantum, + status; + + ssize_t + count, + scene, + sequence_depth; + + unsigned char + *data; + + unsigned short + group, + element; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + return(DestroyImageList(image)); + image->depth=8UL; + image->endian=LSBEndian; + /* + Read DCM preamble. + */ + (void) memset(&info,0,sizeof(info)); + data=(unsigned char *) NULL; + graymap=(int *) NULL; + redmap=(int *) NULL; + greenmap=(int *) NULL; + bluemap=(int *) NULL; + stream_info=(DCMStreamInfo *) AcquireMagickMemory(sizeof(*stream_info)); + sequence_depth=0; + stack = NewLinkedList(256); + if (stream_info == (DCMStreamInfo *) NULL) + ThrowDCMException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(stream_info,0,sizeof(*stream_info)); + count=ReadBlob(image,128,(unsigned char *) magick); + if (count != 128) + ThrowDCMException(CorruptImageError,"ImproperImageHeader"); + count=ReadBlob(image,4,(unsigned char *) magick); + if ((count != 4) || (LocaleNCompare(magick,"DICM",4) != 0)) + { + offset=SeekBlob(image,0L,SEEK_SET); + if (offset < 0) + ThrowDCMException(CorruptImageError,"ImproperImageHeader"); + } + /* + Read DCM Medical image. + */ + (void) CopyMagickString(photometric,"MONOCHROME1 ",MaxTextExtent); + info.bits_allocated=8; + info.bytes_per_pixel=1; + info.depth=8; + info.mask=0xffff; + info.max_value=255UL; + info.samples_per_pixel=1; + info.signed_data=(~0UL); + info.rescale_slope=1.0; + data=(unsigned char *) NULL; + element=0; + explicit_vr[2]='\0'; + explicit_file=MagickFalse; + colors=0; + redmap=(int *) NULL; + greenmap=(int *) NULL; + bluemap=(int *) NULL; + graymap=(int *) NULL; + number_scenes=1; + use_explicit=MagickFalse; + explicit_retry = MagickFalse; + + while (TellBlob(image) < (MagickOffsetType) GetBlobSize(image)) + { + for (group=0; (group != 0x7FE0) || (element != 0x0010) ; ) + { + /* + Read a group. + */ + image->offset=(ssize_t) TellBlob(image); + group=ReadBlobLSBShort(image); + element=ReadBlobLSBShort(image); + if ((group == 0xfffc) && (element == 0xfffc)) + break; + if ((group != 0x0002) && (image->endian == MSBEndian)) + { + group=(unsigned short) ((group << 8) | ((group >> 8) & 0xFF)); + element=(unsigned short) ((element << 8) | ((element >> 8) & 0xFF)); + } + quantum=0; + /* + Find corresponding VR for this group and element. + */ + for (i=0; dicom_info[i].group < 0xffff; i++) + if ((group == dicom_info[i].group) && + (element == dicom_info[i].element)) + break; + (void) CopyMagickString(implicit_vr,dicom_info[i].vr,MaxTextExtent); + count=ReadBlob(image,2,(unsigned char *) explicit_vr); + if (count != 2) + ThrowDCMException(CorruptImageError,"ImproperImageHeader"); + /* + Check for "explicitness", but meta-file headers always explicit. + */ + if ((explicit_file == MagickFalse) && (group != 0x0002)) + explicit_file=(isupper((int) ((unsigned char) *explicit_vr)) != 0) && + (isupper((int) ((unsigned char) *(explicit_vr+1))) != 0) ? + MagickTrue : MagickFalse; + use_explicit=((group == 0x0002) && (explicit_retry == MagickFalse)) || + (explicit_file != MagickFalse) ? MagickTrue : MagickFalse; + if ((use_explicit != MagickFalse) && (strncmp(implicit_vr,"xs",2) == 0)) + (void) CopyMagickString(implicit_vr,explicit_vr,MaxTextExtent); + if ((use_explicit == MagickFalse) || (strncmp(implicit_vr,"!!",2) == 0)) + { + offset=SeekBlob(image,(MagickOffsetType) -2,SEEK_CUR); + if (offset < 0) + ThrowDCMException(CorruptImageError,"ImproperImageHeader"); + quantum=4; + } + else + { + /* + Assume explicit type. + */ + quantum=2; + if ((strcmp(explicit_vr,"OB") == 0) || + (strcmp(explicit_vr,"OW") == 0) || + (strcmp(explicit_vr,"OF") == 0) || + (strcmp(explicit_vr,"SQ") == 0) || + (strcmp(explicit_vr,"UN") == 0) || + (strcmp(explicit_vr,"UT") == 0)) + { + (void) ReadBlobLSBShort(image); + quantum=4; + } + } + /* + If we're exiting a sequence, restore the previous image parameters, + effectively undoing any parameter changes that happened inside the + sequence. + */ + if ((group == 0xFFFE) && (element == 0xE0DD)) + { + DCMInfo *info_copy = (DCMInfo *) + RemoveLastElementFromLinkedList(stack); + sequence_depth--; + if (info_copy == (DCMInfo *)NULL) + { + /* + The sequence's entry and exit points don't line up (tried to + exit one more sequence than we entered). + */ + ThrowDCMException(CorruptImageError,"ImproperImageHeader"); + } + if (info.scale != (Quantum *) NULL) + info.scale=(Quantum *) RelinquishMagickMemory(info.scale); + (void) memcpy(&info,info_copy,sizeof(info)); + info_copy=(DCMInfo *) RelinquishMagickMemory(info_copy); + } + if (strcmp(explicit_vr,"SQ") == 0) + { + /* + If we're entering a sequence, push the current image parameters + onto the stack, so we can restore them at the end of the sequence. + */ + DCMInfo *clone_info = (DCMInfo *) AcquireMagickMemory(sizeof(info)); + (void) memcpy(clone_info,&info,sizeof(info)); + AppendValueToLinkedList(stack,clone_info); + sequence_depth++; + } + datum=0; + if (quantum == 4) + { + if (group == 0x0002) + datum=ReadBlobLSBSignedLong(image); + else + datum=ReadBlobSignedLong(image); + } + else + if (quantum == 2) + { + if (group == 0x0002) + datum=ReadBlobLSBSignedShort(image); + else + datum=ReadBlobSignedShort(image); + } + quantum=0; + length=1; + if (datum != 0) + { + if ((strncmp(implicit_vr,"OW",2) == 0) || + (strncmp(implicit_vr,"SS",2) == 0) || + (strncmp(implicit_vr,"US",2) == 0)) + quantum=2; + else + if ((strncmp(implicit_vr,"FL",2) == 0) || + (strncmp(implicit_vr,"OF",2) == 0) || + (strncmp(implicit_vr,"SL",2) == 0) || + (strncmp(implicit_vr,"UL",2) == 0)) + quantum=4; + else + if (strncmp(implicit_vr,"FD",2) == 0) + quantum=8; + else + quantum=1; + if (datum != ~0) + length=(size_t) datum/quantum; + else + { + /* + Sequence and item of undefined length. + */ + quantum=0; + length=0; + } + } + if (image_info->verbose != MagickFalse) + { + /* + Display Dicom info. + */ + if (isprint((int) explicit_vr[0]) == 0) + explicit_vr[0]='\0'; + for (i=0; dicom_info[i].description != (char *) NULL; i++) + if ((group == dicom_info[i].group) && + (element == dicom_info[i].element)) + break; + (void) FormatLocaleFile(stdout, + "0x%04lX %4ld S%ld %s-%s (0x%04lx,0x%04lx)", + (unsigned long) image->offset,(long) length,(long) sequence_depth, + implicit_vr,explicit_vr,(unsigned long) group, + (unsigned long) element); + if (dicom_info[i].description != (char *) NULL) + (void) FormatLocaleFile(stdout," %s",dicom_info[i].description); + (void) FormatLocaleFile(stdout,": "); + } + if ((group == 0x7FE0) && (element == 0x0010)) + { + if (image_info->verbose != MagickFalse) + (void) FormatLocaleFile(stdout,"\n"); + break; + } + /* + Allocate space and read an array. + */ + data=(unsigned char *) NULL; + if ((length == 1) && (quantum == 1)) + datum=ReadBlobByte(image); + else + if ((length == 1) && (quantum == 2)) + { + if (group == 0x0002) + datum=ReadBlobLSBSignedShort(image); + else + datum=ReadBlobSignedShort(image); + } + else + if ((length == 1) && (quantum == 4)) + { + if (group == 0x0002) + datum=ReadBlobLSBSignedLong(image); + else + datum=ReadBlobSignedLong(image); + } + else + if ((quantum != 0) && (length != 0)) + { + if (length > (size_t) GetBlobSize(image)) + ThrowDCMException(CorruptImageError, + "InsufficientImageDataInFile"); + if (~length >= 1) + data=(unsigned char *) AcquireQuantumMemory(length+1,quantum* + sizeof(*data)); + if (data == (unsigned char *) NULL) + ThrowDCMException(ResourceLimitError, + "MemoryAllocationFailed"); + count=ReadBlob(image,(size_t) quantum*length,data); + if (count != (ssize_t) (quantum*length)) + { + if (image_info->verbose != MagickFalse) + (void) FormatLocaleFile(stdout,"count=%d quantum=%d " + "length=%d group=%d\n",(int) count,(int) quantum,(int) + length,(int) group); + ThrowDCMException(CorruptImageError, + "InsufficientImageDataInFile"); + } + data[length*quantum]='\0'; + } + if ((((unsigned int) group << 16) | element) == 0xFFFEE0DD) + { + if (data != (unsigned char *) NULL) + data=(unsigned char *) RelinquishMagickMemory(data); + continue; + } + switch (group) + { + case 0x0002: + { + switch (element) + { + case 0x0010: + { + char + transfer_syntax[MaxTextExtent]; + + /* + Transfer Syntax. + */ + if ((datum == 0) && (explicit_retry == MagickFalse)) + { + explicit_retry=MagickTrue; + (void) SeekBlob(image,(MagickOffsetType) 0,SEEK_SET); + group=0; + element=0; + if (image_info->verbose != MagickFalse) + (void) FormatLocaleFile(stdout, + "Corrupted image - trying explicit format\n"); + break; + } + *transfer_syntax='\0'; + if (data != (unsigned char *) NULL) + (void) CopyMagickString(transfer_syntax,(char *) data, + MaxTextExtent); + if (image_info->verbose != MagickFalse) + (void) FormatLocaleFile(stdout,"transfer_syntax=%s\n", + (const char *) transfer_syntax); + if (strncmp(transfer_syntax,"1.2.840.10008.1.2",17) == 0) + { + int + count, + subtype, + type; + + type=1; + subtype=0; + if (strlen(transfer_syntax) > 17) + { + count=sscanf(transfer_syntax+17,".%d.%d",&type,&subtype); + if (count < 1) + ThrowDCMException(CorruptImageError, + "ImproperImageHeader"); + } + switch (type) + { + case 1: + { + image->endian=LSBEndian; + break; + } + case 2: + { + image->endian=MSBEndian; + break; + } + case 4: + { + if ((subtype >= 80) && (subtype <= 81)) + image->compression=JPEGCompression; + else + if ((subtype >= 90) && (subtype <= 93)) + image->compression=JPEG2000Compression; + else + image->compression=JPEGCompression; + break; + } + case 5: + { + image->compression=RLECompression; + break; + } + } + } + break; + } + default: + break; + } + break; + } + case 0x0028: + { + switch (element) + { + case 0x0002: + { + /* + Samples per pixel. + */ + info.samples_per_pixel=(size_t) datum; + if ((info.samples_per_pixel == 0) || (info.samples_per_pixel > 4)) + ThrowDCMException(CorruptImageError,"ImproperImageHeader"); + break; + } + case 0x0004: + { + /* + Photometric interpretation. + */ + if (data == (unsigned char *) NULL) + break; + for (i=0; i < (ssize_t) MagickMin(length,MaxTextExtent-1); i++) + photometric[i]=(char) data[i]; + photometric[i]='\0'; + info.polarity=LocaleCompare(photometric,"MONOCHROME1 ") == 0 ? + MagickTrue : MagickFalse; + break; + } + case 0x0006: + { + /* + Planar configuration. + */ + if (datum == 1) + image->interlace=PlaneInterlace; + break; + } + case 0x0008: + { + /* + Number of frames. + */ + if (data == (unsigned char *) NULL) + break; + number_scenes=StringToUnsignedLong((char *) data); + break; + } + case 0x0010: + { + /* + Image rows. + */ + info.height=(size_t) datum; + break; + } + case 0x0011: + { + /* + Image columns. + */ + info.width=(size_t) datum; + break; + } + case 0x0100: + { + /* + Bits allocated. + */ + info.bits_allocated=(size_t) datum; + info.bytes_per_pixel=1; + if (datum > 8) + info.bytes_per_pixel=2; + info.depth=info.bits_allocated; + if ((info.depth == 0) || (info.depth > 32)) + ThrowDCMException(CorruptImageError,"ImproperImageHeader"); + info.max_value=(1UL << info.bits_allocated)-1; + image->depth=info.depth; + break; + } + case 0x0101: + { + /* + Bits stored. + */ + info.significant_bits=(size_t) datum; + info.bytes_per_pixel=1; + if (info.significant_bits > 8) + info.bytes_per_pixel=2; + info.depth=info.significant_bits; + if ((info.depth == 0) || (info.depth > 16)) + ThrowDCMException(CorruptImageError,"ImproperImageHeader"); + info.max_value=(1UL << info.significant_bits)-1; + info.mask=(size_t) GetQuantumRange(info.significant_bits); + image->depth=info.depth; + break; + } + case 0x0102: + { + /* + High bit. + */ + break; + } + case 0x0103: + { + /* + Pixel representation. + */ + info.signed_data=(size_t) datum; + break; + } + case 0x1050: + { + /* + Visible pixel range: center. + */ + if (data != (unsigned char *) NULL) + info.window_center=StringToDouble((char *) data, + (char **) NULL); + break; + } + case 0x1051: + { + /* + Visible pixel range: width. + */ + if (data != (unsigned char *) NULL) + info.window_width=StringToDouble((char *) data, + (char **) NULL); + break; + } + case 0x1052: + { + /* + Rescale intercept + */ + if (data != (unsigned char *) NULL) + info.rescale_intercept=StringToDouble((char *) data, + (char **) NULL); + break; + } + case 0x1053: + { + /* + Rescale slope + */ + if (data != (unsigned char *) NULL) + info.rescale_slope=StringToDouble((char *) data, + (char **) NULL); + break; + } + case 0x1200: + case 0x3006: + { + /* + Populate graymap. + */ + if (data == (unsigned char *) NULL) + break; + colors=(size_t) (length/info.bytes_per_pixel); + datum=(int) colors; + if (graymap != (int *) NULL) + graymap=(int *) RelinquishMagickMemory(graymap); + graymap=(int *) AcquireQuantumMemory(MagickMax(colors,65536), + sizeof(*graymap)); + if (graymap == (int *) NULL) + ThrowDCMException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(graymap,0,MagickMax(colors,65536)* + sizeof(*graymap)); + for (i=0; i < (ssize_t) colors; i++) + if (info.bytes_per_pixel == 1) + graymap[i]=(int) data[i]; + else + graymap[i]=(int) ((short *) data)[i]; + break; + } + case 0x1201: + { + unsigned short + index; + + /* + Populate redmap. + */ + if (data == (unsigned char *) NULL) + break; + colors=(size_t) (length/info.bytes_per_pixel); + datum=(int) colors; + if (redmap != (int *) NULL) + redmap=(int *) RelinquishMagickMemory(redmap); + redmap=(int *) AcquireQuantumMemory(MagickMax(colors,65536), + sizeof(*redmap)); + if (redmap == (int *) NULL) + ThrowDCMException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(redmap,0,MagickMax(colors,65536)* + sizeof(*redmap)); + p=data; + for (i=0; i < (ssize_t) colors; i++) + { + if (image->endian == MSBEndian) + index=(unsigned short) ((*p << 8) | *(p+1)); + else + index=(unsigned short) (*p | (*(p+1) << 8)); + redmap[i]=(int) index; + p+=2; + } + break; + } + case 0x1202: + { + unsigned short + index; + + /* + Populate greenmap. + */ + if (data == (unsigned char *) NULL) + break; + colors=(size_t) (length/info.bytes_per_pixel); + datum=(int) colors; + if (greenmap != (int *) NULL) + greenmap=(int *) RelinquishMagickMemory(greenmap); + greenmap=(int *) AcquireQuantumMemory(MagickMax(colors,65536), + sizeof(*greenmap)); + if (greenmap == (int *) NULL) + ThrowDCMException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(greenmap,0,MagickMax(colors,65536)* + sizeof(*greenmap)); + p=data; + for (i=0; i < (ssize_t) colors; i++) + { + if (image->endian == MSBEndian) + index=(unsigned short) ((*p << 8) | *(p+1)); + else + index=(unsigned short) (*p | (*(p+1) << 8)); + greenmap[i]=(int) index; + p+=2; + } + break; + } + case 0x1203: + { + unsigned short + index; + + /* + Populate bluemap. + */ + if (data == (unsigned char *) NULL) + break; + colors=(size_t) (length/info.bytes_per_pixel); + datum=(int) colors; + if (bluemap != (int *) NULL) + bluemap=(int *) RelinquishMagickMemory(bluemap); + bluemap=(int *) AcquireQuantumMemory(MagickMax(colors,65536), + sizeof(*bluemap)); + if (bluemap == (int *) NULL) + ThrowDCMException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(bluemap,0,MagickMax(colors,65536)* + sizeof(*bluemap)); + p=data; + for (i=0; i < (ssize_t) colors; i++) + { + if (image->endian == MSBEndian) + index=(unsigned short) ((*p << 8) | *(p+1)); + else + index=(unsigned short) (*p | (*(p+1) << 8)); + bluemap[i]=(int) index; + p+=2; + } + break; + } + default: + break; + } + break; + } + case 0x2050: + { + switch (element) + { + case 0x0020: + { + if ((data != (unsigned char *) NULL) && + (strncmp((char *) data,"INVERSE",7) == 0)) + info.polarity=MagickTrue; + break; + } + default: + break; + } + break; + } + default: + break; + } + if (data != (unsigned char *) NULL) + { + char + *attribute; + + for (i=0; dicom_info[i].description != (char *) NULL; i++) + if ((group == dicom_info[i].group) && + (element == dicom_info[i].element)) + break; + if (dicom_info[i].description != (char *) NULL) + { + attribute=AcquireString("dcm:"); + (void) ConcatenateString(&attribute,dicom_info[i].description); + for (i=0; i < (ssize_t) MagickMax(length,4); i++) + if (isprint((int) data[i]) == 0) + break; + if ((i == (ssize_t) length) || (length > 4)) + { + (void) SubstituteString(&attribute," ",""); + (void) SetImageProperty(image,attribute,(char *) data); + } + attribute=DestroyString(attribute); + } + } + if (image_info->verbose != MagickFalse) + { + if (data == (unsigned char *) NULL) + (void) FormatLocaleFile(stdout,"%d\n",datum); + else + { + /* + Display group data. + */ + for (i=0; i < (ssize_t) MagickMax(length,4); i++) + if (isprint((int) data[i]) == 0) + break; + if ((i != (ssize_t) length) && (length <= 4)) + { + ssize_t + j; + + datum=0; + for (j=(ssize_t) length-1; j >= 0; j--) + datum=(256*datum+data[j]); + (void) FormatLocaleFile(stdout,"%d",datum); + } + else + for (i=0; i < (ssize_t) length; i++) + if (isprint((int) data[i]) != 0) + (void) FormatLocaleFile(stdout,"%c",data[i]); + else + (void) FormatLocaleFile(stdout,"%c",'.'); + (void) FormatLocaleFile(stdout,"\n"); + } + } + if (data != (unsigned char *) NULL) + data=(unsigned char *) RelinquishMagickMemory(data); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + group=0xfffc; + break; + } + } + if ((group == 0xfffc) && (element == 0xfffc)) + { + Image + *last; + + last=RemoveLastImageFromList(&image); + if (last != (Image *) NULL) + last=DestroyImage(last); + break; + } + if ((info.width == 0) || (info.height == 0)) + ThrowDCMException(CorruptImageError,"ImproperImageHeader"); + image->columns=info.width; + image->rows=info.height; + if (info.signed_data == 0xffff) + info.signed_data=(size_t) (info.significant_bits == 16 ? 1 : 0); + if ((image->compression == JPEGCompression) || + (image->compression == JPEG2000Compression)) + { + Image + *images; + + ImageInfo + *read_info; + + int + c; + + size_t + length; + + /* + Read offset table. + */ + for (i=0; i < (ssize_t) stream_info->remaining; i++) + if (ReadBlobByte(image) == EOF) + break; + (void) (((ssize_t) ReadBlobLSBShort(image) << 16) | + ReadBlobLSBShort(image)); + length=(size_t) ReadBlobLSBLong(image); + if (length > (size_t) GetBlobSize(image)) + ThrowDCMException(CorruptImageError,"InsufficientImageDataInFile"); + stream_info->offset_count=length >> 2; + if (stream_info->offset_count != 0) + { + MagickOffsetType + offset; + + if (stream_info->offsets != (ssize_t *) NULL) + stream_info->offsets=(ssize_t *) RelinquishMagickMemory( + stream_info->offsets); + stream_info->offsets=(ssize_t *) AcquireQuantumMemory( + stream_info->offset_count,sizeof(*stream_info->offsets)); + if (stream_info->offsets == (ssize_t *) NULL) + ThrowDCMException(ResourceLimitError,"MemoryAllocationFailed"); + for (i=0; i < (ssize_t) stream_info->offset_count; i++) + stream_info->offsets[i]=(ssize_t) ReadBlobLSBSignedLong(image); + offset=TellBlob(image); + for (i=0; i < (ssize_t) stream_info->offset_count; i++) + stream_info->offsets[i]+=offset; + } + /* + Handle non-native image formats. + */ + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + images=NewImageList(); + for (scene=0; scene < (ssize_t) number_scenes; scene++) + { + char + filename[MaxTextExtent]; + + const char + *property; + + FILE + *file; + + Image + *jpeg_image; + + int + unique_file; + + unsigned int + tag; + + tag=((unsigned int) ReadBlobLSBShort(image) << 16) | + ReadBlobLSBShort(image); + length=(size_t) ReadBlobLSBLong(image); + if (length > (size_t) GetBlobSize(image)) + { + read_info=DestroyImageInfo(read_info); + ThrowDCMException(CorruptImageError, + "InsufficientImageDataInFile"); + } + if (EOFBlob(image) != MagickFalse) + { + status=MagickFalse; + break; + } + if (tag == 0xFFFEE0DD) + break; /* sequence delimiter tag */ + if (tag != 0xFFFEE000) + { + status=MagickFalse; + break; + } + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(filename); + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if (file == (FILE *) NULL) + { + (void) RelinquishUniqueFileResource(filename); + ThrowFileException(exception,FileOpenError, + "UnableToCreateTemporaryFile",filename); + break; + } + for (c=EOF; length != 0; length--) + { + c=ReadBlobByte(image); + if (c == EOF) + { + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + if (fputc(c,file) != c) + break; + } + (void) fclose(file); + if (c == EOF) + break; + (void) FormatLocaleString(read_info->filename,MaxTextExtent,"jpeg:%s", + filename); + if (image->compression == JPEG2000Compression) + (void) FormatLocaleString(read_info->filename,MaxTextExtent, + "j2k:%s",filename); + jpeg_image=ReadImage(read_info,exception); + if (jpeg_image != (Image *) NULL) + { + ResetImagePropertyIterator(image); + property=GetNextImageProperty(image); + while (property != (const char *) NULL) + { + (void) SetImageProperty(jpeg_image,property, + GetImageProperty(image,property)); + property=GetNextImageProperty(image); + } + AppendImageToList(&images,jpeg_image); + } + (void) RelinquishUniqueFileResource(filename); + } + read_info=DestroyImageInfo(read_info); + if (stream_info->offsets != (ssize_t *) NULL) + stream_info->offsets=(ssize_t *) + RelinquishMagickMemory(stream_info->offsets); + stream_info=(DCMStreamInfo *) RelinquishMagickMemory(stream_info); + if (info.scale != (Quantum *) NULL) + info.scale=(Quantum *) RelinquishMagickMemory(info.scale); + if (graymap != (int *) NULL) + graymap=(int *) RelinquishMagickMemory(graymap); + if (bluemap != (int *) NULL) + bluemap=(int *) RelinquishMagickMemory(bluemap); + if (greenmap != (int *) NULL) + greenmap=(int *) RelinquishMagickMemory(greenmap); + if (redmap != (int *) NULL) + redmap=(int *) RelinquishMagickMemory(redmap); + image=DestroyImageList(image); + if ((status == MagickFalse) && (exception->severity < ErrorException)) + { + images=DestroyImageList(images); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + return(GetFirstImageInList(images)); + } + if (info.depth != (1UL*MAGICKCORE_QUANTUM_DEPTH)) + { + QuantumAny + range; + + size_t + length; + + /* + Compute pixel scaling table. + */ + length=(size_t) (GetQuantumRange(info.depth)+1); + if (length > (size_t) GetBlobSize(image)) + ThrowDCMException(CorruptImageError,"InsufficientImageDataInFile"); + if (info.scale != (Quantum *) NULL) + info.scale=(Quantum *) RelinquishMagickMemory(info.scale); + info.scale_size=MagickMax(length,MaxMap); + info.scale=(Quantum *) AcquireQuantumMemory(info.scale_size+1, + sizeof(*info.scale)); + if (info.scale == (Quantum *) NULL) + ThrowDCMException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(info.scale,0,(MagickMax(length,MaxMap)+1)* + sizeof(*info.scale)); + range=GetQuantumRange(info.depth); + for (i=0; i <= (ssize_t) GetQuantumRange(info.depth); i++) + info.scale[i]=ScaleAnyToQuantum((size_t) i,range); + } + if (image->compression == RLECompression) + { + size_t + length; + + unsigned int + tag; + + /* + Read RLE offset table. + */ + for (i=0; i < (ssize_t) stream_info->remaining; i++) + { + int + c; + + c=ReadBlobByte(image); + if (c == EOF) + break; + } + tag=((unsigned int) ReadBlobLSBShort(image) << 16) | + ReadBlobLSBShort(image); + (void) tag; + length=(size_t) ReadBlobLSBLong(image); + if (length > (size_t) GetBlobSize(image)) + ThrowDCMException(CorruptImageError,"InsufficientImageDataInFile"); + stream_info->offset_count=length >> 2; + if (stream_info->offset_count != 0) + { + MagickOffsetType + offset; + + if (stream_info->offsets != (ssize_t *) NULL) + stream_info->offsets=(ssize_t *) + RelinquishMagickMemory(stream_info->offsets); + stream_info->offsets=(ssize_t *) AcquireQuantumMemory( + stream_info->offset_count,sizeof(*stream_info->offsets)); + if (stream_info->offsets == (ssize_t *) NULL) + ThrowDCMException(ResourceLimitError,"MemoryAllocationFailed"); + for (i=0; i < (ssize_t) stream_info->offset_count; i++) + { + MagickOffsetType + offset; + + offset=(MagickOffsetType) ReadBlobLSBSignedLong(image); + if (offset > (MagickOffsetType) GetBlobSize(image)) + ThrowDCMException(CorruptImageError, + "InsufficientImageDataInFile"); + stream_info->offsets[i]=(ssize_t) offset; + if (EOFBlob(image) != MagickFalse) + break; + } + offset=TellBlob(image)+8; + for (i=0; i < (ssize_t) stream_info->offset_count; i++) + stream_info->offsets[i]+=offset; + } + } + for (scene=0; scene < (ssize_t) number_scenes; scene++) + { + image->columns=info.width; + image->rows=info.height; + image->depth=info.depth; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + break; + } + image->colorspace=RGBColorspace; + (void) SetImageBackgroundColor(image); + if ((image->colormap == (PixelPacket *) NULL) && + (info.samples_per_pixel == 1)) + { + int + index; + + size_t + one; + + one=1; + if (colors == 0) + colors=one << info.depth; + if (AcquireImageColormap(image,colors) == MagickFalse) + ThrowDCMException(ResourceLimitError,"MemoryAllocationFailed"); + if (redmap != (int *) NULL) + for (i=0; i < (ssize_t) colors; i++) + { + index=redmap[i]; + if ((info.scale != (Quantum *) NULL) && (index >= 0) && + (index < (int) info.scale_size)) + index=(int) info.scale[index]; + image->colormap[i].red=(Quantum) index; + } + if (greenmap != (int *) NULL) + for (i=0; i < (ssize_t) colors; i++) + { + index=greenmap[i]; + if ((info.scale != (Quantum *) NULL) && (index >= 0) && + (index < (int) info.scale_size)) + index=(int) info.scale[index]; + image->colormap[i].green=(Quantum) index; + } + if (bluemap != (int *) NULL) + for (i=0; i < (ssize_t) colors; i++) + { + index=bluemap[i]; + if ((info.scale != (Quantum *) NULL) && (index >= 0) && + (index < (int) info.scale_size)) + index=(int) info.scale[index]; + image->colormap[i].blue=(Quantum) index; + } + if (graymap != (int *) NULL) + for (i=0; i < (ssize_t) colors; i++) + { + index=graymap[i]; + if ((info.scale != (Quantum *) NULL) && (index >= 0) && + (index < (int) info.scale_size)) + index=(int) info.scale[index]; + image->colormap[i].red=(Quantum) index; + image->colormap[i].green=(Quantum) index; + image->colormap[i].blue=(Quantum) index; + } + } + if (image->compression == RLECompression) + { + unsigned int + tag; + + /* + Read RLE segment table. + */ + for (i=0; i < (ssize_t) stream_info->remaining; i++) + { + int + c; + + c=ReadBlobByte(image); + if (c == EOF) + break; + } + tag=((unsigned int) ReadBlobLSBShort(image) << 16) | + ReadBlobLSBShort(image); + stream_info->remaining=(size_t) ReadBlobLSBLong(image); + if ((tag != 0xFFFEE000) || (stream_info->remaining <= 64) || + (EOFBlob(image) != MagickFalse)) + { + if (stream_info->offsets != (ssize_t *) NULL) + stream_info->offsets=(ssize_t *) + RelinquishMagickMemory(stream_info->offsets); + ThrowDCMException(CorruptImageError,"ImproperImageHeader"); + } + stream_info->count=0; + stream_info->segment_count=ReadBlobLSBLong(image); + for (i=0; i < 15; i++) + stream_info->segments[i]=(ssize_t) ReadBlobLSBSignedLong(image); + stream_info->remaining-=64; + if (stream_info->segment_count > 1) + { + info.bytes_per_pixel=1; + info.depth=8; + if (stream_info->offset_count > 0) + (void) SeekBlob(image,(MagickOffsetType) + stream_info->offsets[0]+stream_info->segments[0],SEEK_SET); + } + } + if ((info.samples_per_pixel > 1) && (image->interlace == PlaneInterlace)) + { + ssize_t + x; + + PixelPacket + *q; + + ssize_t + y; + + /* + Convert Planar RGB DCM Medical image to pixel packets. + */ + for (i=0; i < (ssize_t) info.samples_per_pixel; i++) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + switch ((int) i) + { + case 0: + { + SetPixelRed(q,ScaleCharToQuantum((unsigned char) + ReadDCMByte(stream_info,image))); + break; + } + case 1: + { + SetPixelGreen(q,ScaleCharToQuantum((unsigned char) + ReadDCMByte(stream_info,image))); + break; + } + case 2: + { + SetPixelBlue(q,ScaleCharToQuantum((unsigned char) + ReadDCMByte(stream_info,image))); + break; + } + case 3: + { + SetPixelAlpha(q,ScaleCharToQuantum((unsigned char) + ReadDCMByte(stream_info,image))); + break; + } + default: + break; + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + } + } + else + { + const char + *option; + + /* + Convert DCM Medical image to pixel packets. + */ + option=GetImageOption(image_info,"dcm:display-range"); + if (option != (const char *) NULL) + { + if (LocaleCompare(option,"reset") == 0) + info.window_width=0; + } + option=GetImageOption(image_info,"dcm:window"); + if (option != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(option,&geometry_info); + if (flags & RhoValue) + info.window_center=geometry_info.rho; + if (flags & SigmaValue) + info.window_width=geometry_info.sigma; + info.rescale=MagickTrue; + } + option=GetImageOption(image_info,"dcm:rescale"); + if (option != (char *) NULL) + info.rescale=IsStringTrue(option); + if ((info.window_center != 0) && (info.window_width == 0)) + info.window_width=info.window_center; + status=ReadDCMPixels(image,&info,stream_info,MagickTrue,exception); + if ((status != MagickFalse) && (stream_info->segment_count > 1)) + { + if (stream_info->offset_count > 0) + (void) SeekBlob(image,(MagickOffsetType) + stream_info->offsets[0]+stream_info->segments[1],SEEK_SET); + (void) ReadDCMPixels(image,&info,stream_info,MagickFalse, + exception); + } + } + if (SetImageGray(image,exception) != MagickFalse) + (void) SetImageColorspace(image,GRAYColorspace); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (scene < (ssize_t) (number_scenes-1)) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } + if (TellBlob(image) < (MagickOffsetType) GetBlobSize(image)) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } + /* + Free resources. + */ + if (stream_info->offsets != (ssize_t *) NULL) + stream_info->offsets=(ssize_t *) + RelinquishMagickMemory(stream_info->offsets); + stream_info=(DCMStreamInfo *) RelinquishMagickMemory(stream_info); + DestroyLinkedList(stack,RelinquishMagickMemory); + if (info.scale != (Quantum *) NULL) + info.scale=(Quantum *) RelinquishMagickMemory(info.scale); + if (graymap != (int *) NULL) + graymap=(int *) RelinquishMagickMemory(graymap); + if (bluemap != (int *) NULL) + bluemap=(int *) RelinquishMagickMemory(bluemap); + if (greenmap != (int *) NULL) + greenmap=(int *) RelinquishMagickMemory(greenmap); + if (redmap != (int *) NULL) + redmap=(int *) RelinquishMagickMemory(redmap); + if (image == (Image *) NULL) + return(image); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r D C M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterDCMImage() adds attributes for the DCM image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterDCMImage method is: +% +% size_t RegisterDCMImage(void) +% +*/ +ModuleExport size_t RegisterDCMImage(void) +{ + MagickInfo + *entry; + + static const char + *DCMNote= + { + "DICOM is used by the medical community for images like X-rays. The\n" + "specification, \"Digital Imaging and Communications in Medicine\n" + "(DICOM)\", is available at http://medical.nema.org/. In particular,\n" + "see part 5 which describes the image encoding (RLE, JPEG, JPEG-LS),\n" + "and supplement 61 which adds JPEG-2000 encoding." + }; + + entry=SetMagickInfo("DCM"); + entry->decoder=(DecodeImageHandler *) ReadDCMImage; + entry->magick=(IsImageFormatHandler *) IsDCM; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString( + "Digital Imaging and Communications in Medicine image"); + entry->note=ConstantString(DCMNote); + entry->magick_module=ConstantString("DCM"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r D C M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterDCMImage() removes format registrations made by the +% DCM module from the list of supported formats. +% +% The format of the UnregisterDCMImage method is: +% +% UnregisterDCMImage(void) +% +*/ +ModuleExport void UnregisterDCMImage(void) +{ + (void) UnregisterMagickInfo("DCM"); +} diff --git a/ImageMagick-6.9.12-44/coders/dds.c b/ImageMagick-6.9.12-44/coders/dds.c new file mode 100644 index 0000000..f87f322 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/dds.c @@ -0,0 +1,3108 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD DDDD SSSSS % +% D D D D SS % +% D D D D SSS % +% D D D D SS % +% DDDD DDDD SSSSS % +% % +% % +% Read/Write Microsoft Direct Draw Surface Image Format % +% % +% Software Design % +% Bianca van Schaik % +% March 2008 % +% Dirk Lemstra % +% September 2013 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/quantum.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/module.h" +#include "magick/transform.h" + +/* + Definitions +*/ +#define DDSD_CAPS 0x00000001 +#define DDSD_HEIGHT 0x00000002 +#define DDSD_WIDTH 0x00000004 +#define DDSD_PITCH 0x00000008 +#define DDSD_PIXELFORMAT 0x00001000 +#define DDSD_MIPMAPCOUNT 0x00020000 +#define DDSD_LINEARSIZE 0x00080000 +#define DDSD_DEPTH 0x00800000 + +#define DDPF_ALPHAPIXELS 0x00000001 +#define DDPF_FOURCC 0x00000004 +#define DDPF_RGB 0x00000040 +#define DDPF_LUMINANCE 0x00020000 + +#define FOURCC_DXT1 0x31545844 +#define FOURCC_DXT3 0x33545844 +#define FOURCC_DXT5 0x35545844 + +#define DDSCAPS_COMPLEX 0x00000008 +#define DDSCAPS_TEXTURE 0x00001000 +#define DDSCAPS_MIPMAP 0x00400000 + +#define DDSCAPS2_CUBEMAP 0x00000200 +#define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400 +#define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800 +#define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000 +#define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000 +#define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000 +#define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000 +#define DDSCAPS2_VOLUME 0x00200000 + +#ifndef SIZE_MAX +#define SIZE_MAX ((size_t) -1) +#endif + +/* + Structure declarations. +*/ +typedef struct _DDSPixelFormat +{ + size_t + flags, + fourcc, + rgb_bitcount, + r_bitmask, + g_bitmask, + b_bitmask, + alpha_bitmask; +} DDSPixelFormat; + +typedef struct _DDSInfo +{ + size_t + flags, + height, + width, + pitchOrLinearSize, + depth, + mipmapcount, + ddscaps1, + ddscaps2; + + DDSPixelFormat + pixelformat; +} DDSInfo; + +typedef struct _DDSColors +{ + unsigned char + r[4], + g[4], + b[4], + a[4]; +} DDSColors; + +typedef struct _DDSVector4 +{ + float + x, + y, + z, + w; +} DDSVector4; + +typedef struct _DDSVector3 +{ + float + x, + y, + z; +} DDSVector3; + +typedef struct _DDSSourceBlock +{ + unsigned char + start, + end, + error; +} DDSSourceBlock; + +typedef struct _DDSSingleColourLookup +{ + DDSSourceBlock sources[2]; +} DDSSingleColourLookup; + +typedef MagickBooleanType + DDSDecoder(Image *, DDSInfo *, ExceptionInfo *); + +static const DDSSingleColourLookup DDSLookup_5_4[] = +{ + { { { 0, 0, 0 }, { 0, 0, 0 } } }, + { { { 0, 0, 1 }, { 0, 1, 1 } } }, + { { { 0, 0, 2 }, { 0, 1, 0 } } }, + { { { 0, 0, 3 }, { 0, 1, 1 } } }, + { { { 0, 0, 4 }, { 0, 2, 1 } } }, + { { { 1, 0, 3 }, { 0, 2, 0 } } }, + { { { 1, 0, 2 }, { 0, 2, 1 } } }, + { { { 1, 0, 1 }, { 0, 3, 1 } } }, + { { { 1, 0, 0 }, { 0, 3, 0 } } }, + { { { 1, 0, 1 }, { 1, 2, 1 } } }, + { { { 1, 0, 2 }, { 1, 2, 0 } } }, + { { { 1, 0, 3 }, { 0, 4, 0 } } }, + { { { 1, 0, 4 }, { 0, 5, 1 } } }, + { { { 2, 0, 3 }, { 0, 5, 0 } } }, + { { { 2, 0, 2 }, { 0, 5, 1 } } }, + { { { 2, 0, 1 }, { 0, 6, 1 } } }, + { { { 2, 0, 0 }, { 0, 6, 0 } } }, + { { { 2, 0, 1 }, { 2, 3, 1 } } }, + { { { 2, 0, 2 }, { 2, 3, 0 } } }, + { { { 2, 0, 3 }, { 0, 7, 0 } } }, + { { { 2, 0, 4 }, { 1, 6, 1 } } }, + { { { 3, 0, 3 }, { 1, 6, 0 } } }, + { { { 3, 0, 2 }, { 0, 8, 0 } } }, + { { { 3, 0, 1 }, { 0, 9, 1 } } }, + { { { 3, 0, 0 }, { 0, 9, 0 } } }, + { { { 3, 0, 1 }, { 0, 9, 1 } } }, + { { { 3, 0, 2 }, { 0, 10, 1 } } }, + { { { 3, 0, 3 }, { 0, 10, 0 } } }, + { { { 3, 0, 4 }, { 2, 7, 1 } } }, + { { { 4, 0, 4 }, { 2, 7, 0 } } }, + { { { 4, 0, 3 }, { 0, 11, 0 } } }, + { { { 4, 0, 2 }, { 1, 10, 1 } } }, + { { { 4, 0, 1 }, { 1, 10, 0 } } }, + { { { 4, 0, 0 }, { 0, 12, 0 } } }, + { { { 4, 0, 1 }, { 0, 13, 1 } } }, + { { { 4, 0, 2 }, { 0, 13, 0 } } }, + { { { 4, 0, 3 }, { 0, 13, 1 } } }, + { { { 4, 0, 4 }, { 0, 14, 1 } } }, + { { { 5, 0, 3 }, { 0, 14, 0 } } }, + { { { 5, 0, 2 }, { 2, 11, 1 } } }, + { { { 5, 0, 1 }, { 2, 11, 0 } } }, + { { { 5, 0, 0 }, { 0, 15, 0 } } }, + { { { 5, 0, 1 }, { 1, 14, 1 } } }, + { { { 5, 0, 2 }, { 1, 14, 0 } } }, + { { { 5, 0, 3 }, { 0, 16, 0 } } }, + { { { 5, 0, 4 }, { 0, 17, 1 } } }, + { { { 6, 0, 3 }, { 0, 17, 0 } } }, + { { { 6, 0, 2 }, { 0, 17, 1 } } }, + { { { 6, 0, 1 }, { 0, 18, 1 } } }, + { { { 6, 0, 0 }, { 0, 18, 0 } } }, + { { { 6, 0, 1 }, { 2, 15, 1 } } }, + { { { 6, 0, 2 }, { 2, 15, 0 } } }, + { { { 6, 0, 3 }, { 0, 19, 0 } } }, + { { { 6, 0, 4 }, { 1, 18, 1 } } }, + { { { 7, 0, 3 }, { 1, 18, 0 } } }, + { { { 7, 0, 2 }, { 0, 20, 0 } } }, + { { { 7, 0, 1 }, { 0, 21, 1 } } }, + { { { 7, 0, 0 }, { 0, 21, 0 } } }, + { { { 7, 0, 1 }, { 0, 21, 1 } } }, + { { { 7, 0, 2 }, { 0, 22, 1 } } }, + { { { 7, 0, 3 }, { 0, 22, 0 } } }, + { { { 7, 0, 4 }, { 2, 19, 1 } } }, + { { { 8, 0, 4 }, { 2, 19, 0 } } }, + { { { 8, 0, 3 }, { 0, 23, 0 } } }, + { { { 8, 0, 2 }, { 1, 22, 1 } } }, + { { { 8, 0, 1 }, { 1, 22, 0 } } }, + { { { 8, 0, 0 }, { 0, 24, 0 } } }, + { { { 8, 0, 1 }, { 0, 25, 1 } } }, + { { { 8, 0, 2 }, { 0, 25, 0 } } }, + { { { 8, 0, 3 }, { 0, 25, 1 } } }, + { { { 8, 0, 4 }, { 0, 26, 1 } } }, + { { { 9, 0, 3 }, { 0, 26, 0 } } }, + { { { 9, 0, 2 }, { 2, 23, 1 } } }, + { { { 9, 0, 1 }, { 2, 23, 0 } } }, + { { { 9, 0, 0 }, { 0, 27, 0 } } }, + { { { 9, 0, 1 }, { 1, 26, 1 } } }, + { { { 9, 0, 2 }, { 1, 26, 0 } } }, + { { { 9, 0, 3 }, { 0, 28, 0 } } }, + { { { 9, 0, 4 }, { 0, 29, 1 } } }, + { { { 10, 0, 3 }, { 0, 29, 0 } } }, + { { { 10, 0, 2 }, { 0, 29, 1 } } }, + { { { 10, 0, 1 }, { 0, 30, 1 } } }, + { { { 10, 0, 0 }, { 0, 30, 0 } } }, + { { { 10, 0, 1 }, { 2, 27, 1 } } }, + { { { 10, 0, 2 }, { 2, 27, 0 } } }, + { { { 10, 0, 3 }, { 0, 31, 0 } } }, + { { { 10, 0, 4 }, { 1, 30, 1 } } }, + { { { 11, 0, 3 }, { 1, 30, 0 } } }, + { { { 11, 0, 2 }, { 4, 24, 0 } } }, + { { { 11, 0, 1 }, { 1, 31, 1 } } }, + { { { 11, 0, 0 }, { 1, 31, 0 } } }, + { { { 11, 0, 1 }, { 1, 31, 1 } } }, + { { { 11, 0, 2 }, { 2, 30, 1 } } }, + { { { 11, 0, 3 }, { 2, 30, 0 } } }, + { { { 11, 0, 4 }, { 2, 31, 1 } } }, + { { { 12, 0, 4 }, { 2, 31, 0 } } }, + { { { 12, 0, 3 }, { 4, 27, 0 } } }, + { { { 12, 0, 2 }, { 3, 30, 1 } } }, + { { { 12, 0, 1 }, { 3, 30, 0 } } }, + { { { 12, 0, 0 }, { 4, 28, 0 } } }, + { { { 12, 0, 1 }, { 3, 31, 1 } } }, + { { { 12, 0, 2 }, { 3, 31, 0 } } }, + { { { 12, 0, 3 }, { 3, 31, 1 } } }, + { { { 12, 0, 4 }, { 4, 30, 1 } } }, + { { { 13, 0, 3 }, { 4, 30, 0 } } }, + { { { 13, 0, 2 }, { 6, 27, 1 } } }, + { { { 13, 0, 1 }, { 6, 27, 0 } } }, + { { { 13, 0, 0 }, { 4, 31, 0 } } }, + { { { 13, 0, 1 }, { 5, 30, 1 } } }, + { { { 13, 0, 2 }, { 5, 30, 0 } } }, + { { { 13, 0, 3 }, { 8, 24, 0 } } }, + { { { 13, 0, 4 }, { 5, 31, 1 } } }, + { { { 14, 0, 3 }, { 5, 31, 0 } } }, + { { { 14, 0, 2 }, { 5, 31, 1 } } }, + { { { 14, 0, 1 }, { 6, 30, 1 } } }, + { { { 14, 0, 0 }, { 6, 30, 0 } } }, + { { { 14, 0, 1 }, { 6, 31, 1 } } }, + { { { 14, 0, 2 }, { 6, 31, 0 } } }, + { { { 14, 0, 3 }, { 8, 27, 0 } } }, + { { { 14, 0, 4 }, { 7, 30, 1 } } }, + { { { 15, 0, 3 }, { 7, 30, 0 } } }, + { { { 15, 0, 2 }, { 8, 28, 0 } } }, + { { { 15, 0, 1 }, { 7, 31, 1 } } }, + { { { 15, 0, 0 }, { 7, 31, 0 } } }, + { { { 15, 0, 1 }, { 7, 31, 1 } } }, + { { { 15, 0, 2 }, { 8, 30, 1 } } }, + { { { 15, 0, 3 }, { 8, 30, 0 } } }, + { { { 15, 0, 4 }, { 10, 27, 1 } } }, + { { { 16, 0, 4 }, { 10, 27, 0 } } }, + { { { 16, 0, 3 }, { 8, 31, 0 } } }, + { { { 16, 0, 2 }, { 9, 30, 1 } } }, + { { { 16, 0, 1 }, { 9, 30, 0 } } }, + { { { 16, 0, 0 }, { 12, 24, 0 } } }, + { { { 16, 0, 1 }, { 9, 31, 1 } } }, + { { { 16, 0, 2 }, { 9, 31, 0 } } }, + { { { 16, 0, 3 }, { 9, 31, 1 } } }, + { { { 16, 0, 4 }, { 10, 30, 1 } } }, + { { { 17, 0, 3 }, { 10, 30, 0 } } }, + { { { 17, 0, 2 }, { 10, 31, 1 } } }, + { { { 17, 0, 1 }, { 10, 31, 0 } } }, + { { { 17, 0, 0 }, { 12, 27, 0 } } }, + { { { 17, 0, 1 }, { 11, 30, 1 } } }, + { { { 17, 0, 2 }, { 11, 30, 0 } } }, + { { { 17, 0, 3 }, { 12, 28, 0 } } }, + { { { 17, 0, 4 }, { 11, 31, 1 } } }, + { { { 18, 0, 3 }, { 11, 31, 0 } } }, + { { { 18, 0, 2 }, { 11, 31, 1 } } }, + { { { 18, 0, 1 }, { 12, 30, 1 } } }, + { { { 18, 0, 0 }, { 12, 30, 0 } } }, + { { { 18, 0, 1 }, { 14, 27, 1 } } }, + { { { 18, 0, 2 }, { 14, 27, 0 } } }, + { { { 18, 0, 3 }, { 12, 31, 0 } } }, + { { { 18, 0, 4 }, { 13, 30, 1 } } }, + { { { 19, 0, 3 }, { 13, 30, 0 } } }, + { { { 19, 0, 2 }, { 16, 24, 0 } } }, + { { { 19, 0, 1 }, { 13, 31, 1 } } }, + { { { 19, 0, 0 }, { 13, 31, 0 } } }, + { { { 19, 0, 1 }, { 13, 31, 1 } } }, + { { { 19, 0, 2 }, { 14, 30, 1 } } }, + { { { 19, 0, 3 }, { 14, 30, 0 } } }, + { { { 19, 0, 4 }, { 14, 31, 1 } } }, + { { { 20, 0, 4 }, { 14, 31, 0 } } }, + { { { 20, 0, 3 }, { 16, 27, 0 } } }, + { { { 20, 0, 2 }, { 15, 30, 1 } } }, + { { { 20, 0, 1 }, { 15, 30, 0 } } }, + { { { 20, 0, 0 }, { 16, 28, 0 } } }, + { { { 20, 0, 1 }, { 15, 31, 1 } } }, + { { { 20, 0, 2 }, { 15, 31, 0 } } }, + { { { 20, 0, 3 }, { 15, 31, 1 } } }, + { { { 20, 0, 4 }, { 16, 30, 1 } } }, + { { { 21, 0, 3 }, { 16, 30, 0 } } }, + { { { 21, 0, 2 }, { 18, 27, 1 } } }, + { { { 21, 0, 1 }, { 18, 27, 0 } } }, + { { { 21, 0, 0 }, { 16, 31, 0 } } }, + { { { 21, 0, 1 }, { 17, 30, 1 } } }, + { { { 21, 0, 2 }, { 17, 30, 0 } } }, + { { { 21, 0, 3 }, { 20, 24, 0 } } }, + { { { 21, 0, 4 }, { 17, 31, 1 } } }, + { { { 22, 0, 3 }, { 17, 31, 0 } } }, + { { { 22, 0, 2 }, { 17, 31, 1 } } }, + { { { 22, 0, 1 }, { 18, 30, 1 } } }, + { { { 22, 0, 0 }, { 18, 30, 0 } } }, + { { { 22, 0, 1 }, { 18, 31, 1 } } }, + { { { 22, 0, 2 }, { 18, 31, 0 } } }, + { { { 22, 0, 3 }, { 20, 27, 0 } } }, + { { { 22, 0, 4 }, { 19, 30, 1 } } }, + { { { 23, 0, 3 }, { 19, 30, 0 } } }, + { { { 23, 0, 2 }, { 20, 28, 0 } } }, + { { { 23, 0, 1 }, { 19, 31, 1 } } }, + { { { 23, 0, 0 }, { 19, 31, 0 } } }, + { { { 23, 0, 1 }, { 19, 31, 1 } } }, + { { { 23, 0, 2 }, { 20, 30, 1 } } }, + { { { 23, 0, 3 }, { 20, 30, 0 } } }, + { { { 23, 0, 4 }, { 22, 27, 1 } } }, + { { { 24, 0, 4 }, { 22, 27, 0 } } }, + { { { 24, 0, 3 }, { 20, 31, 0 } } }, + { { { 24, 0, 2 }, { 21, 30, 1 } } }, + { { { 24, 0, 1 }, { 21, 30, 0 } } }, + { { { 24, 0, 0 }, { 24, 24, 0 } } }, + { { { 24, 0, 1 }, { 21, 31, 1 } } }, + { { { 24, 0, 2 }, { 21, 31, 0 } } }, + { { { 24, 0, 3 }, { 21, 31, 1 } } }, + { { { 24, 0, 4 }, { 22, 30, 1 } } }, + { { { 25, 0, 3 }, { 22, 30, 0 } } }, + { { { 25, 0, 2 }, { 22, 31, 1 } } }, + { { { 25, 0, 1 }, { 22, 31, 0 } } }, + { { { 25, 0, 0 }, { 24, 27, 0 } } }, + { { { 25, 0, 1 }, { 23, 30, 1 } } }, + { { { 25, 0, 2 }, { 23, 30, 0 } } }, + { { { 25, 0, 3 }, { 24, 28, 0 } } }, + { { { 25, 0, 4 }, { 23, 31, 1 } } }, + { { { 26, 0, 3 }, { 23, 31, 0 } } }, + { { { 26, 0, 2 }, { 23, 31, 1 } } }, + { { { 26, 0, 1 }, { 24, 30, 1 } } }, + { { { 26, 0, 0 }, { 24, 30, 0 } } }, + { { { 26, 0, 1 }, { 26, 27, 1 } } }, + { { { 26, 0, 2 }, { 26, 27, 0 } } }, + { { { 26, 0, 3 }, { 24, 31, 0 } } }, + { { { 26, 0, 4 }, { 25, 30, 1 } } }, + { { { 27, 0, 3 }, { 25, 30, 0 } } }, + { { { 27, 0, 2 }, { 28, 24, 0 } } }, + { { { 27, 0, 1 }, { 25, 31, 1 } } }, + { { { 27, 0, 0 }, { 25, 31, 0 } } }, + { { { 27, 0, 1 }, { 25, 31, 1 } } }, + { { { 27, 0, 2 }, { 26, 30, 1 } } }, + { { { 27, 0, 3 }, { 26, 30, 0 } } }, + { { { 27, 0, 4 }, { 26, 31, 1 } } }, + { { { 28, 0, 4 }, { 26, 31, 0 } } }, + { { { 28, 0, 3 }, { 28, 27, 0 } } }, + { { { 28, 0, 2 }, { 27, 30, 1 } } }, + { { { 28, 0, 1 }, { 27, 30, 0 } } }, + { { { 28, 0, 0 }, { 28, 28, 0 } } }, + { { { 28, 0, 1 }, { 27, 31, 1 } } }, + { { { 28, 0, 2 }, { 27, 31, 0 } } }, + { { { 28, 0, 3 }, { 27, 31, 1 } } }, + { { { 28, 0, 4 }, { 28, 30, 1 } } }, + { { { 29, 0, 3 }, { 28, 30, 0 } } }, + { { { 29, 0, 2 }, { 30, 27, 1 } } }, + { { { 29, 0, 1 }, { 30, 27, 0 } } }, + { { { 29, 0, 0 }, { 28, 31, 0 } } }, + { { { 29, 0, 1 }, { 29, 30, 1 } } }, + { { { 29, 0, 2 }, { 29, 30, 0 } } }, + { { { 29, 0, 3 }, { 29, 30, 1 } } }, + { { { 29, 0, 4 }, { 29, 31, 1 } } }, + { { { 30, 0, 3 }, { 29, 31, 0 } } }, + { { { 30, 0, 2 }, { 29, 31, 1 } } }, + { { { 30, 0, 1 }, { 30, 30, 1 } } }, + { { { 30, 0, 0 }, { 30, 30, 0 } } }, + { { { 30, 0, 1 }, { 30, 31, 1 } } }, + { { { 30, 0, 2 }, { 30, 31, 0 } } }, + { { { 30, 0, 3 }, { 30, 31, 1 } } }, + { { { 30, 0, 4 }, { 31, 30, 1 } } }, + { { { 31, 0, 3 }, { 31, 30, 0 } } }, + { { { 31, 0, 2 }, { 31, 30, 1 } } }, + { { { 31, 0, 1 }, { 31, 31, 1 } } }, + { { { 31, 0, 0 }, { 31, 31, 0 } } } +}; + +static const DDSSingleColourLookup DDSLookup_6_4[] = +{ + { { { 0, 0, 0 }, { 0, 0, 0 } } }, + { { { 0, 0, 1 }, { 0, 1, 0 } } }, + { { { 0, 0, 2 }, { 0, 2, 0 } } }, + { { { 1, 0, 1 }, { 0, 3, 1 } } }, + { { { 1, 0, 0 }, { 0, 3, 0 } } }, + { { { 1, 0, 1 }, { 0, 4, 0 } } }, + { { { 1, 0, 2 }, { 0, 5, 0 } } }, + { { { 2, 0, 1 }, { 0, 6, 1 } } }, + { { { 2, 0, 0 }, { 0, 6, 0 } } }, + { { { 2, 0, 1 }, { 0, 7, 0 } } }, + { { { 2, 0, 2 }, { 0, 8, 0 } } }, + { { { 3, 0, 1 }, { 0, 9, 1 } } }, + { { { 3, 0, 0 }, { 0, 9, 0 } } }, + { { { 3, 0, 1 }, { 0, 10, 0 } } }, + { { { 3, 0, 2 }, { 0, 11, 0 } } }, + { { { 4, 0, 1 }, { 0, 12, 1 } } }, + { { { 4, 0, 0 }, { 0, 12, 0 } } }, + { { { 4, 0, 1 }, { 0, 13, 0 } } }, + { { { 4, 0, 2 }, { 0, 14, 0 } } }, + { { { 5, 0, 1 }, { 0, 15, 1 } } }, + { { { 5, 0, 0 }, { 0, 15, 0 } } }, + { { { 5, 0, 1 }, { 0, 16, 0 } } }, + { { { 5, 0, 2 }, { 1, 15, 0 } } }, + { { { 6, 0, 1 }, { 0, 17, 0 } } }, + { { { 6, 0, 0 }, { 0, 18, 0 } } }, + { { { 6, 0, 1 }, { 0, 19, 0 } } }, + { { { 6, 0, 2 }, { 3, 14, 0 } } }, + { { { 7, 0, 1 }, { 0, 20, 0 } } }, + { { { 7, 0, 0 }, { 0, 21, 0 } } }, + { { { 7, 0, 1 }, { 0, 22, 0 } } }, + { { { 7, 0, 2 }, { 4, 15, 0 } } }, + { { { 8, 0, 1 }, { 0, 23, 0 } } }, + { { { 8, 0, 0 }, { 0, 24, 0 } } }, + { { { 8, 0, 1 }, { 0, 25, 0 } } }, + { { { 8, 0, 2 }, { 6, 14, 0 } } }, + { { { 9, 0, 1 }, { 0, 26, 0 } } }, + { { { 9, 0, 0 }, { 0, 27, 0 } } }, + { { { 9, 0, 1 }, { 0, 28, 0 } } }, + { { { 9, 0, 2 }, { 7, 15, 0 } } }, + { { { 10, 0, 1 }, { 0, 29, 0 } } }, + { { { 10, 0, 0 }, { 0, 30, 0 } } }, + { { { 10, 0, 1 }, { 0, 31, 0 } } }, + { { { 10, 0, 2 }, { 9, 14, 0 } } }, + { { { 11, 0, 1 }, { 0, 32, 0 } } }, + { { { 11, 0, 0 }, { 0, 33, 0 } } }, + { { { 11, 0, 1 }, { 2, 30, 0 } } }, + { { { 11, 0, 2 }, { 0, 34, 0 } } }, + { { { 12, 0, 1 }, { 0, 35, 0 } } }, + { { { 12, 0, 0 }, { 0, 36, 0 } } }, + { { { 12, 0, 1 }, { 3, 31, 0 } } }, + { { { 12, 0, 2 }, { 0, 37, 0 } } }, + { { { 13, 0, 1 }, { 0, 38, 0 } } }, + { { { 13, 0, 0 }, { 0, 39, 0 } } }, + { { { 13, 0, 1 }, { 5, 30, 0 } } }, + { { { 13, 0, 2 }, { 0, 40, 0 } } }, + { { { 14, 0, 1 }, { 0, 41, 0 } } }, + { { { 14, 0, 0 }, { 0, 42, 0 } } }, + { { { 14, 0, 1 }, { 6, 31, 0 } } }, + { { { 14, 0, 2 }, { 0, 43, 0 } } }, + { { { 15, 0, 1 }, { 0, 44, 0 } } }, + { { { 15, 0, 0 }, { 0, 45, 0 } } }, + { { { 15, 0, 1 }, { 8, 30, 0 } } }, + { { { 15, 0, 2 }, { 0, 46, 0 } } }, + { { { 16, 0, 2 }, { 0, 47, 0 } } }, + { { { 16, 0, 1 }, { 1, 46, 0 } } }, + { { { 16, 0, 0 }, { 0, 48, 0 } } }, + { { { 16, 0, 1 }, { 0, 49, 0 } } }, + { { { 16, 0, 2 }, { 0, 50, 0 } } }, + { { { 17, 0, 1 }, { 2, 47, 0 } } }, + { { { 17, 0, 0 }, { 0, 51, 0 } } }, + { { { 17, 0, 1 }, { 0, 52, 0 } } }, + { { { 17, 0, 2 }, { 0, 53, 0 } } }, + { { { 18, 0, 1 }, { 4, 46, 0 } } }, + { { { 18, 0, 0 }, { 0, 54, 0 } } }, + { { { 18, 0, 1 }, { 0, 55, 0 } } }, + { { { 18, 0, 2 }, { 0, 56, 0 } } }, + { { { 19, 0, 1 }, { 5, 47, 0 } } }, + { { { 19, 0, 0 }, { 0, 57, 0 } } }, + { { { 19, 0, 1 }, { 0, 58, 0 } } }, + { { { 19, 0, 2 }, { 0, 59, 0 } } }, + { { { 20, 0, 1 }, { 7, 46, 0 } } }, + { { { 20, 0, 0 }, { 0, 60, 0 } } }, + { { { 20, 0, 1 }, { 0, 61, 0 } } }, + { { { 20, 0, 2 }, { 0, 62, 0 } } }, + { { { 21, 0, 1 }, { 8, 47, 0 } } }, + { { { 21, 0, 0 }, { 0, 63, 0 } } }, + { { { 21, 0, 1 }, { 1, 62, 0 } } }, + { { { 21, 0, 2 }, { 1, 63, 0 } } }, + { { { 22, 0, 1 }, { 10, 46, 0 } } }, + { { { 22, 0, 0 }, { 2, 62, 0 } } }, + { { { 22, 0, 1 }, { 2, 63, 0 } } }, + { { { 22, 0, 2 }, { 3, 62, 0 } } }, + { { { 23, 0, 1 }, { 11, 47, 0 } } }, + { { { 23, 0, 0 }, { 3, 63, 0 } } }, + { { { 23, 0, 1 }, { 4, 62, 0 } } }, + { { { 23, 0, 2 }, { 4, 63, 0 } } }, + { { { 24, 0, 1 }, { 13, 46, 0 } } }, + { { { 24, 0, 0 }, { 5, 62, 0 } } }, + { { { 24, 0, 1 }, { 5, 63, 0 } } }, + { { { 24, 0, 2 }, { 6, 62, 0 } } }, + { { { 25, 0, 1 }, { 14, 47, 0 } } }, + { { { 25, 0, 0 }, { 6, 63, 0 } } }, + { { { 25, 0, 1 }, { 7, 62, 0 } } }, + { { { 25, 0, 2 }, { 7, 63, 0 } } }, + { { { 26, 0, 1 }, { 16, 45, 0 } } }, + { { { 26, 0, 0 }, { 8, 62, 0 } } }, + { { { 26, 0, 1 }, { 8, 63, 0 } } }, + { { { 26, 0, 2 }, { 9, 62, 0 } } }, + { { { 27, 0, 1 }, { 16, 48, 0 } } }, + { { { 27, 0, 0 }, { 9, 63, 0 } } }, + { { { 27, 0, 1 }, { 10, 62, 0 } } }, + { { { 27, 0, 2 }, { 10, 63, 0 } } }, + { { { 28, 0, 1 }, { 16, 51, 0 } } }, + { { { 28, 0, 0 }, { 11, 62, 0 } } }, + { { { 28, 0, 1 }, { 11, 63, 0 } } }, + { { { 28, 0, 2 }, { 12, 62, 0 } } }, + { { { 29, 0, 1 }, { 16, 54, 0 } } }, + { { { 29, 0, 0 }, { 12, 63, 0 } } }, + { { { 29, 0, 1 }, { 13, 62, 0 } } }, + { { { 29, 0, 2 }, { 13, 63, 0 } } }, + { { { 30, 0, 1 }, { 16, 57, 0 } } }, + { { { 30, 0, 0 }, { 14, 62, 0 } } }, + { { { 30, 0, 1 }, { 14, 63, 0 } } }, + { { { 30, 0, 2 }, { 15, 62, 0 } } }, + { { { 31, 0, 1 }, { 16, 60, 0 } } }, + { { { 31, 0, 0 }, { 15, 63, 0 } } }, + { { { 31, 0, 1 }, { 24, 46, 0 } } }, + { { { 31, 0, 2 }, { 16, 62, 0 } } }, + { { { 32, 0, 2 }, { 16, 63, 0 } } }, + { { { 32, 0, 1 }, { 17, 62, 0 } } }, + { { { 32, 0, 0 }, { 25, 47, 0 } } }, + { { { 32, 0, 1 }, { 17, 63, 0 } } }, + { { { 32, 0, 2 }, { 18, 62, 0 } } }, + { { { 33, 0, 1 }, { 18, 63, 0 } } }, + { { { 33, 0, 0 }, { 27, 46, 0 } } }, + { { { 33, 0, 1 }, { 19, 62, 0 } } }, + { { { 33, 0, 2 }, { 19, 63, 0 } } }, + { { { 34, 0, 1 }, { 20, 62, 0 } } }, + { { { 34, 0, 0 }, { 28, 47, 0 } } }, + { { { 34, 0, 1 }, { 20, 63, 0 } } }, + { { { 34, 0, 2 }, { 21, 62, 0 } } }, + { { { 35, 0, 1 }, { 21, 63, 0 } } }, + { { { 35, 0, 0 }, { 30, 46, 0 } } }, + { { { 35, 0, 1 }, { 22, 62, 0 } } }, + { { { 35, 0, 2 }, { 22, 63, 0 } } }, + { { { 36, 0, 1 }, { 23, 62, 0 } } }, + { { { 36, 0, 0 }, { 31, 47, 0 } } }, + { { { 36, 0, 1 }, { 23, 63, 0 } } }, + { { { 36, 0, 2 }, { 24, 62, 0 } } }, + { { { 37, 0, 1 }, { 24, 63, 0 } } }, + { { { 37, 0, 0 }, { 32, 47, 0 } } }, + { { { 37, 0, 1 }, { 25, 62, 0 } } }, + { { { 37, 0, 2 }, { 25, 63, 0 } } }, + { { { 38, 0, 1 }, { 26, 62, 0 } } }, + { { { 38, 0, 0 }, { 32, 50, 0 } } }, + { { { 38, 0, 1 }, { 26, 63, 0 } } }, + { { { 38, 0, 2 }, { 27, 62, 0 } } }, + { { { 39, 0, 1 }, { 27, 63, 0 } } }, + { { { 39, 0, 0 }, { 32, 53, 0 } } }, + { { { 39, 0, 1 }, { 28, 62, 0 } } }, + { { { 39, 0, 2 }, { 28, 63, 0 } } }, + { { { 40, 0, 1 }, { 29, 62, 0 } } }, + { { { 40, 0, 0 }, { 32, 56, 0 } } }, + { { { 40, 0, 1 }, { 29, 63, 0 } } }, + { { { 40, 0, 2 }, { 30, 62, 0 } } }, + { { { 41, 0, 1 }, { 30, 63, 0 } } }, + { { { 41, 0, 0 }, { 32, 59, 0 } } }, + { { { 41, 0, 1 }, { 31, 62, 0 } } }, + { { { 41, 0, 2 }, { 31, 63, 0 } } }, + { { { 42, 0, 1 }, { 32, 61, 0 } } }, + { { { 42, 0, 0 }, { 32, 62, 0 } } }, + { { { 42, 0, 1 }, { 32, 63, 0 } } }, + { { { 42, 0, 2 }, { 41, 46, 0 } } }, + { { { 43, 0, 1 }, { 33, 62, 0 } } }, + { { { 43, 0, 0 }, { 33, 63, 0 } } }, + { { { 43, 0, 1 }, { 34, 62, 0 } } }, + { { { 43, 0, 2 }, { 42, 47, 0 } } }, + { { { 44, 0, 1 }, { 34, 63, 0 } } }, + { { { 44, 0, 0 }, { 35, 62, 0 } } }, + { { { 44, 0, 1 }, { 35, 63, 0 } } }, + { { { 44, 0, 2 }, { 44, 46, 0 } } }, + { { { 45, 0, 1 }, { 36, 62, 0 } } }, + { { { 45, 0, 0 }, { 36, 63, 0 } } }, + { { { 45, 0, 1 }, { 37, 62, 0 } } }, + { { { 45, 0, 2 }, { 45, 47, 0 } } }, + { { { 46, 0, 1 }, { 37, 63, 0 } } }, + { { { 46, 0, 0 }, { 38, 62, 0 } } }, + { { { 46, 0, 1 }, { 38, 63, 0 } } }, + { { { 46, 0, 2 }, { 47, 46, 0 } } }, + { { { 47, 0, 1 }, { 39, 62, 0 } } }, + { { { 47, 0, 0 }, { 39, 63, 0 } } }, + { { { 47, 0, 1 }, { 40, 62, 0 } } }, + { { { 47, 0, 2 }, { 48, 46, 0 } } }, + { { { 48, 0, 2 }, { 40, 63, 0 } } }, + { { { 48, 0, 1 }, { 41, 62, 0 } } }, + { { { 48, 0, 0 }, { 41, 63, 0 } } }, + { { { 48, 0, 1 }, { 48, 49, 0 } } }, + { { { 48, 0, 2 }, { 42, 62, 0 } } }, + { { { 49, 0, 1 }, { 42, 63, 0 } } }, + { { { 49, 0, 0 }, { 43, 62, 0 } } }, + { { { 49, 0, 1 }, { 48, 52, 0 } } }, + { { { 49, 0, 2 }, { 43, 63, 0 } } }, + { { { 50, 0, 1 }, { 44, 62, 0 } } }, + { { { 50, 0, 0 }, { 44, 63, 0 } } }, + { { { 50, 0, 1 }, { 48, 55, 0 } } }, + { { { 50, 0, 2 }, { 45, 62, 0 } } }, + { { { 51, 0, 1 }, { 45, 63, 0 } } }, + { { { 51, 0, 0 }, { 46, 62, 0 } } }, + { { { 51, 0, 1 }, { 48, 58, 0 } } }, + { { { 51, 0, 2 }, { 46, 63, 0 } } }, + { { { 52, 0, 1 }, { 47, 62, 0 } } }, + { { { 52, 0, 0 }, { 47, 63, 0 } } }, + { { { 52, 0, 1 }, { 48, 61, 0 } } }, + { { { 52, 0, 2 }, { 48, 62, 0 } } }, + { { { 53, 0, 1 }, { 56, 47, 0 } } }, + { { { 53, 0, 0 }, { 48, 63, 0 } } }, + { { { 53, 0, 1 }, { 49, 62, 0 } } }, + { { { 53, 0, 2 }, { 49, 63, 0 } } }, + { { { 54, 0, 1 }, { 58, 46, 0 } } }, + { { { 54, 0, 0 }, { 50, 62, 0 } } }, + { { { 54, 0, 1 }, { 50, 63, 0 } } }, + { { { 54, 0, 2 }, { 51, 62, 0 } } }, + { { { 55, 0, 1 }, { 59, 47, 0 } } }, + { { { 55, 0, 0 }, { 51, 63, 0 } } }, + { { { 55, 0, 1 }, { 52, 62, 0 } } }, + { { { 55, 0, 2 }, { 52, 63, 0 } } }, + { { { 56, 0, 1 }, { 61, 46, 0 } } }, + { { { 56, 0, 0 }, { 53, 62, 0 } } }, + { { { 56, 0, 1 }, { 53, 63, 0 } } }, + { { { 56, 0, 2 }, { 54, 62, 0 } } }, + { { { 57, 0, 1 }, { 62, 47, 0 } } }, + { { { 57, 0, 0 }, { 54, 63, 0 } } }, + { { { 57, 0, 1 }, { 55, 62, 0 } } }, + { { { 57, 0, 2 }, { 55, 63, 0 } } }, + { { { 58, 0, 1 }, { 56, 62, 1 } } }, + { { { 58, 0, 0 }, { 56, 62, 0 } } }, + { { { 58, 0, 1 }, { 56, 63, 0 } } }, + { { { 58, 0, 2 }, { 57, 62, 0 } } }, + { { { 59, 0, 1 }, { 57, 63, 1 } } }, + { { { 59, 0, 0 }, { 57, 63, 0 } } }, + { { { 59, 0, 1 }, { 58, 62, 0 } } }, + { { { 59, 0, 2 }, { 58, 63, 0 } } }, + { { { 60, 0, 1 }, { 59, 62, 1 } } }, + { { { 60, 0, 0 }, { 59, 62, 0 } } }, + { { { 60, 0, 1 }, { 59, 63, 0 } } }, + { { { 60, 0, 2 }, { 60, 62, 0 } } }, + { { { 61, 0, 1 }, { 60, 63, 1 } } }, + { { { 61, 0, 0 }, { 60, 63, 0 } } }, + { { { 61, 0, 1 }, { 61, 62, 0 } } }, + { { { 61, 0, 2 }, { 61, 63, 0 } } }, + { { { 62, 0, 1 }, { 62, 62, 1 } } }, + { { { 62, 0, 0 }, { 62, 62, 0 } } }, + { { { 62, 0, 1 }, { 62, 63, 0 } } }, + { { { 62, 0, 2 }, { 63, 62, 0 } } }, + { { { 63, 0, 1 }, { 63, 63, 1 } } }, + { { { 63, 0, 0 }, { 63, 63, 0 } } } +}; + +static const DDSSingleColourLookup* + DDS_LOOKUP[] = +{ + DDSLookup_5_4, + DDSLookup_6_4, + DDSLookup_5_4 +}; + +/* + Macros +*/ +#define C565_r(x) (((x) & 0xF800) >> 11) +#define C565_g(x) (((x) & 0x07E0) >> 5) +#define C565_b(x) ((x) & 0x001F) + +#define C565_red(x) ( (C565_r(x) << 3 | C565_r(x) >> 2)) +#define C565_green(x) ( (C565_g(x) << 2 | C565_g(x) >> 4)) +#define C565_blue(x) ( (C565_b(x) << 3 | C565_b(x) >> 2)) + +#define DIV2(x) ((x) > 1 ? ((x) >> 1) : 1) + +#define FixRange(min, max, steps) \ +if (min > max) \ + min = max; \ +if ((ssize_t) max - min < steps) \ + max = MagickMin(min + steps, 255); \ +if ((ssize_t) max - min < steps) \ + min = MagickMax(0, (ssize_t) max - steps) + +#define Dot(left, right) (left.x*right.x) + (left.y*right.y) + (left.z*right.z) + +#define VectorInit(vector, value) vector.x = vector.y = vector.z = vector.w \ + = value +#define VectorInit3(vector, value) vector.x = vector.y = vector.z = value + +#define IsBitMask(mask, r, g, b, a) (mask.r_bitmask == r && mask.g_bitmask == \ + g && mask.b_bitmask == b && mask.alpha_bitmask == a) + +/* + Forward declarations +*/ +static MagickBooleanType + ConstructOrdering(const size_t,const DDSVector4 *,const DDSVector3, + DDSVector4 *,DDSVector4 *,unsigned char *,size_t), + ReadDDSInfo(Image *,DDSInfo *), + ReadDXT1(Image *,DDSInfo *,ExceptionInfo *), + ReadDXT3(Image *,DDSInfo *,ExceptionInfo *), + ReadDXT5(Image *,DDSInfo *,ExceptionInfo *), + ReadUncompressedRGB(Image *,DDSInfo *,ExceptionInfo *), + ReadUncompressedRGBA(Image *,DDSInfo *,ExceptionInfo *), + SkipDXTMipmaps(Image *,DDSInfo *,int,ExceptionInfo *), + SkipRGBMipmaps(Image *,DDSInfo *,int,ExceptionInfo *), + WriteDDSImage(const ImageInfo *,Image *), + WriteMipmaps(Image *,const size_t,const size_t,const size_t, + const MagickBooleanType,const MagickBooleanType,ExceptionInfo *); + +static void + RemapIndices(const ssize_t *,const unsigned char *,unsigned char *), + WriteDDSInfo(Image *,const size_t,const size_t,const size_t), + WriteFourCC(Image *,const size_t,const MagickBooleanType, + const MagickBooleanType,ExceptionInfo *), + WriteImageData(Image *,const size_t,const size_t,const MagickBooleanType, + const MagickBooleanType,ExceptionInfo *), + WriteIndices(Image *,const DDSVector3,const DDSVector3, unsigned char *), + WriteSingleColorFit(Image *,const DDSVector4 *,const ssize_t *), + WriteUncompressed(Image *,ExceptionInfo *); + +static inline void VectorAdd(const DDSVector4 left, const DDSVector4 right, + DDSVector4 *destination) +{ + destination->x = left.x + right.x; + destination->y = left.y + right.y; + destination->z = left.z + right.z; + destination->w = left.w + right.w; +} + +static inline void VectorClamp(DDSVector4 *value) +{ + value->x = MagickMin(1.0f,MagickMax(0.0f,value->x)); + value->y = MagickMin(1.0f,MagickMax(0.0f,value->y)); + value->z = MagickMin(1.0f,MagickMax(0.0f,value->z)); + value->w = MagickMin(1.0f,MagickMax(0.0f,value->w)); +} + +static inline void VectorClamp3(DDSVector3 *value) +{ + value->x = MagickMin(1.0f,MagickMax(0.0f,value->x)); + value->y = MagickMin(1.0f,MagickMax(0.0f,value->y)); + value->z = MagickMin(1.0f,MagickMax(0.0f,value->z)); +} + +static inline void VectorCopy43(const DDSVector4 source, + DDSVector3 *destination) +{ + destination->x = source.x; + destination->y = source.y; + destination->z = source.z; +} + +static inline void VectorCopy44(const DDSVector4 source, + DDSVector4 *destination) +{ + destination->x = source.x; + destination->y = source.y; + destination->z = source.z; + destination->w = source.w; +} + +static inline void VectorNegativeMultiplySubtract(const DDSVector4 a, + const DDSVector4 b, const DDSVector4 c, DDSVector4 *destination) +{ + destination->x = c.x - (a.x * b.x); + destination->y = c.y - (a.y * b.y); + destination->z = c.z - (a.z * b.z); + destination->w = c.w - (a.w * b.w); +} + +static inline void VectorMultiply(const DDSVector4 left, + const DDSVector4 right, DDSVector4 *destination) +{ + destination->x = left.x * right.x; + destination->y = left.y * right.y; + destination->z = left.z * right.z; + destination->w = left.w * right.w; +} + +static inline void VectorMultiply3(const DDSVector3 left, + const DDSVector3 right, DDSVector3 *destination) +{ + destination->x = left.x * right.x; + destination->y = left.y * right.y; + destination->z = left.z * right.z; +} + +static inline void VectorMultiplyAdd(const DDSVector4 a, const DDSVector4 b, + const DDSVector4 c, DDSVector4 *destination) +{ + destination->x = (a.x * b.x) + c.x; + destination->y = (a.y * b.y) + c.y; + destination->z = (a.z * b.z) + c.z; + destination->w = (a.w * b.w) + c.w; +} + +static inline void VectorMultiplyAdd3(const DDSVector3 a, const DDSVector3 b, + const DDSVector3 c, DDSVector3 *destination) +{ + destination->x = (a.x * b.x) + c.x; + destination->y = (a.y * b.y) + c.y; + destination->z = (a.z * b.z) + c.z; +} + +static inline void VectorReciprocal(const DDSVector4 value, + DDSVector4 *destination) +{ + destination->x = 1.0f / value.x; + destination->y = 1.0f / value.y; + destination->z = 1.0f / value.z; + destination->w = 1.0f / value.w; +} + +static inline void VectorSubtract(const DDSVector4 left, + const DDSVector4 right, DDSVector4 *destination) +{ + destination->x = left.x - right.x; + destination->y = left.y - right.y; + destination->z = left.z - right.z; + destination->w = left.w - right.w; +} + +static inline void VectorSubtract3(const DDSVector3 left, + const DDSVector3 right, DDSVector3 *destination) +{ + destination->x = left.x - right.x; + destination->y = left.y - right.y; + destination->z = left.z - right.z; +} + +static inline void VectorTruncate(DDSVector4 *value) +{ + value->x = value->x > 0.0f ? floor(value->x) : ceil(value->x); + value->y = value->y > 0.0f ? floor(value->y) : ceil(value->y); + value->z = value->z > 0.0f ? floor(value->z) : ceil(value->z); + value->w = value->w > 0.0f ? floor(value->w) : ceil(value->w); +} + +static inline void VectorTruncate3(DDSVector3 *value) +{ + value->x = value->x > 0.0f ? floor(value->x) : ceil(value->x); + value->y = value->y > 0.0f ? floor(value->y) : ceil(value->y); + value->z = value->z > 0.0f ? floor(value->z) : ceil(value->z); +} + +static void CalculateColors(unsigned short c0, unsigned short c1, + DDSColors *c, MagickBooleanType ignoreAlpha) +{ + c->a[0] = c->a[1] = c->a[2] = c->a[3] = 0; + + c->r[0] = (unsigned char) C565_red(c0); + c->g[0] = (unsigned char) C565_green(c0); + c->b[0] = (unsigned char) C565_blue(c0); + + c->r[1] = (unsigned char) C565_red(c1); + c->g[1] = (unsigned char) C565_green(c1); + c->b[1] = (unsigned char) C565_blue(c1); + + if (ignoreAlpha != MagickFalse || c0 > c1) + { + c->r[2] = (unsigned char) ((2 * c->r[0] + c->r[1]) / 3); + c->g[2] = (unsigned char) ((2 * c->g[0] + c->g[1]) / 3); + c->b[2] = (unsigned char) ((2 * c->b[0] + c->b[1]) / 3); + + c->r[3] = (unsigned char) ((c->r[0] + 2 * c->r[1]) / 3); + c->g[3] = (unsigned char) ((c->g[0] + 2 * c->g[1]) / 3); + c->b[3] = (unsigned char) ((c->b[0] + 2 * c->b[1]) / 3); + } + else + { + c->r[2] = (unsigned char) ((c->r[0] + c->r[1]) / 2); + c->g[2] = (unsigned char) ((c->g[0] + c->g[1]) / 2); + c->b[2] = (unsigned char) ((c->b[0] + c->b[1]) / 2); + + c->r[3] = c->g[3] = c->b[3] = 0; + c->a[3] = 255; + } +} + +static size_t CompressAlpha(const size_t min, const size_t max, + const size_t steps, const ssize_t *alphas, unsigned char* indices) +{ + unsigned char + codes[8]; + + ssize_t + i; + + size_t + error, + index, + j, + least, + value; + + codes[0] = (unsigned char) min; + codes[1] = (unsigned char) max; + codes[6] = 0; + codes[7] = 255; + + for (i=1; i < (ssize_t) steps; i++) + codes[i+1] = (unsigned char) (((steps-i)*min + i*max) / steps); + + error = 0; + for (i=0; i<16; i++) + { + if (alphas[i] == -1) + { + indices[i] = 0; + continue; + } + + value = alphas[i]; + least = SIZE_MAX; + index = 0; + for (j=0; j<8; j++) + { + size_t + dist; + + dist = value - (size_t)codes[j]; + dist *= dist; + + if (dist < least) + { + least = dist; + index = j; + } + } + + indices[i] = (unsigned char)index; + error += least; + } + + return error; +} + +static void CompressClusterFit(const size_t count, + const DDSVector4 *points, const ssize_t *map, const DDSVector3 principle, + const DDSVector4 metric, DDSVector3 *start, DDSVector3 *end, + unsigned char *indices) +{ + DDSVector3 + axis; + + DDSVector4 + grid, + gridrcp, + half, + onethird_onethird2, + pointsWeights[16], + two, + twonineths, + twothirds_twothirds2, + xSumwSum; + + float + bestError = 1e+37f; + + size_t + bestIteration = 0, + besti = 0, + bestj = 0, + bestk = 0, + iterationIndex; + + ssize_t + i; + + unsigned char + *o, + order[128], + unordered[16]; + + VectorInit(half,0.5f); + VectorInit(two,2.0f); + + VectorInit(onethird_onethird2,1.0f/3.0f); + onethird_onethird2.w = 1.0f/9.0f; + VectorInit(twothirds_twothirds2,2.0f/3.0f); + twothirds_twothirds2.w = 4.0f/9.0f; + VectorInit(twonineths,2.0f/9.0f); + + grid.x = 31.0f; + grid.y = 63.0f; + grid.z = 31.0f; + grid.w = 0.0f; + + gridrcp.x = 1.0f/31.0f; + gridrcp.y = 1.0f/63.0f; + gridrcp.z = 1.0f/31.0f; + gridrcp.w = 0.0f; + + xSumwSum.x = 0.0f; + xSumwSum.y = 0.0f; + xSumwSum.z = 0.0f; + xSumwSum.w = 0.0f; + + ConstructOrdering(count,points,principle,pointsWeights,&xSumwSum,order,0); + + for (iterationIndex = 0;;) + { +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(dynamic,1) \ + num_threads(GetMagickResourceLimit(ThreadResource)) +#endif + for (i=0; i < (ssize_t) count; i++) + { + DDSVector4 + part0, + part1, + part2; + + size_t + ii, + j, + k, + kmin; + + VectorInit(part0,0.0f); + for(ii=0; ii < (size_t) i; ii++) + VectorAdd(pointsWeights[ii],part0,&part0); + + VectorInit(part1,0.0f); + for (j=(size_t) i;;) + { + if (j == 0) + { + VectorCopy44(pointsWeights[0],&part2); + kmin = 1; + } + else + { + VectorInit(part2,0.0f); + kmin = j; + } + + for (k=kmin;;) + { + DDSVector4 + a, + alpha2_sum, + alphax_sum, + alphabeta_sum, + b, + beta2_sum, + betax_sum, + e1, + e2, + factor, + part3; + + float + error; + + VectorSubtract(xSumwSum,part2,&part3); + VectorSubtract(part3,part1,&part3); + VectorSubtract(part3,part0,&part3); + + VectorMultiplyAdd(part1,twothirds_twothirds2,part0,&alphax_sum); + VectorMultiplyAdd(part2,onethird_onethird2,alphax_sum,&alphax_sum); + VectorInit(alpha2_sum,alphax_sum.w); + + VectorMultiplyAdd(part2,twothirds_twothirds2,part3,&betax_sum); + VectorMultiplyAdd(part1,onethird_onethird2,betax_sum,&betax_sum); + VectorInit(beta2_sum,betax_sum.w); + + VectorAdd(part1,part2,&alphabeta_sum); + VectorInit(alphabeta_sum,alphabeta_sum.w); + VectorMultiply(twonineths,alphabeta_sum,&alphabeta_sum); + + VectorMultiply(alpha2_sum,beta2_sum,&factor); + VectorNegativeMultiplySubtract(alphabeta_sum,alphabeta_sum,factor, + &factor); + VectorReciprocal(factor,&factor); + + VectorMultiply(alphax_sum,beta2_sum,&a); + VectorNegativeMultiplySubtract(betax_sum,alphabeta_sum,a,&a); + VectorMultiply(a,factor,&a); + + VectorMultiply(betax_sum,alpha2_sum,&b); + VectorNegativeMultiplySubtract(alphax_sum,alphabeta_sum,b,&b); + VectorMultiply(b,factor,&b); + + VectorClamp(&a); + VectorMultiplyAdd(grid,a,half,&a); + VectorTruncate(&a); + VectorMultiply(a,gridrcp,&a); + + VectorClamp(&b); + VectorMultiplyAdd(grid,b,half,&b); + VectorTruncate(&b); + VectorMultiply(b,gridrcp,&b); + + VectorMultiply(b,b,&e1); + VectorMultiply(e1,beta2_sum,&e1); + VectorMultiply(a,a,&e2); + VectorMultiplyAdd(e2,alpha2_sum,e1,&e1); + + VectorMultiply(a,b,&e2); + VectorMultiply(e2,alphabeta_sum,&e2); + VectorNegativeMultiplySubtract(a,alphax_sum,e2,&e2); + VectorNegativeMultiplySubtract(b,betax_sum,e2,&e2); + VectorMultiplyAdd(two,e2,e1,&e2); + VectorMultiply(e2,metric,&e2); + + error = e2.x + e2.y + e2.z; + + if (error < bestError) + { +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp critical (DDS_CompressClusterFit) +#endif + { + if (error < bestError) + { + VectorCopy43(a,start); + VectorCopy43(b,end); + bestError = error; + besti = i; + bestj = j; + bestk = k; + bestIteration = iterationIndex; + } + } + } + + if (k == count) + break; + + VectorAdd(pointsWeights[k],part2,&part2); + k++; + } + + if (j == count) + break; + + VectorAdd(pointsWeights[j],part1,&part1); + j++; + } + } + + if (bestIteration != iterationIndex) + break; + + iterationIndex++; + if (iterationIndex == 8) + break; + + VectorSubtract3(*end,*start,&axis); + if (ConstructOrdering(count,points,axis,pointsWeights,&xSumwSum,order, + iterationIndex) == MagickFalse) + break; + } + + o = order + (16*bestIteration); + + for (i=0; i < (ssize_t) besti; i++) + unordered[o[i]] = 0; + for (i=besti; i < (ssize_t) bestj; i++) + unordered[o[i]] = 2; + for (i=bestj; i < (ssize_t) bestk; i++) + unordered[o[i]] = 3; + for (i=bestk; i < (ssize_t) count; i++) + unordered[o[i]] = 1; + + RemapIndices(map,unordered,indices); +} + +static void CompressRangeFit(const size_t count, + const DDSVector4 *points, const ssize_t *map, const DDSVector3 principle, + const DDSVector4 metric, DDSVector3 *start, DDSVector3 *end, + unsigned char *indices) +{ + float + d, + bestDist, + max, + min, + val; + + DDSVector3 + codes[4], + grid, + gridrcp, + half, + dist; + + ssize_t + i; + + size_t + bestj, + j; + + unsigned char + closest[16]; + + VectorInit3(half,0.5f); + + grid.x = 31.0f; + grid.y = 63.0f; + grid.z = 31.0f; + + gridrcp.x = 1.0f/31.0f; + gridrcp.y = 1.0f/63.0f; + gridrcp.z = 1.0f/31.0f; + + if (count > 0) + { + VectorCopy43(points[0],start); + VectorCopy43(points[0],end); + + min = max = Dot(points[0],principle); + for (i=1; i < (ssize_t) count; i++) + { + val = Dot(points[i],principle); + if (val < min) + { + VectorCopy43(points[i],start); + min = val; + } + else if (val > max) + { + VectorCopy43(points[i],end); + max = val; + } + } + } + + VectorClamp3(start); + VectorMultiplyAdd3(grid,*start,half,start); + VectorTruncate3(start); + VectorMultiply3(*start,gridrcp,start); + + VectorClamp3(end); + VectorMultiplyAdd3(grid,*end,half,end); + VectorTruncate3(end); + VectorMultiply3(*end,gridrcp,end); + + codes[0] = *start; + codes[1] = *end; + codes[2].x = (start->x * (2.0f/3.0f)) + (end->x * (1.0f/3.0f)); + codes[2].y = (start->y * (2.0f/3.0f)) + (end->y * (1.0f/3.0f)); + codes[2].z = (start->z * (2.0f/3.0f)) + (end->z * (1.0f/3.0f)); + codes[3].x = (start->x * (1.0f/3.0f)) + (end->x * (2.0f/3.0f)); + codes[3].y = (start->y * (1.0f/3.0f)) + (end->y * (2.0f/3.0f)); + codes[3].z = (start->z * (1.0f/3.0f)) + (end->z * (2.0f/3.0f)); + + for (i=0; i < (ssize_t) count; i++) + { + bestDist = 1e+37f; + bestj = 0; + for (j=0; j < 4; j++) + { + dist.x = (points[i].x - codes[j].x) * metric.x; + dist.y = (points[i].y - codes[j].y) * metric.y; + dist.z = (points[i].z - codes[j].z) * metric.z; + + d = Dot(dist,dist); + if (d < bestDist) + { + bestDist = d; + bestj = j; + } + } + + closest[i] = (unsigned char) bestj; + } + + RemapIndices(map, closest, indices); +} + +static void ComputeEndPoints(const DDSSingleColourLookup *lookup[], + const unsigned char *color, DDSVector3 *start, DDSVector3 *end, + unsigned char *index) +{ + ssize_t + i; + + size_t + c, + maxError = SIZE_MAX; + + for (i=0; i < 2; i++) + { + const DDSSourceBlock* + sources[3]; + + size_t + error = 0; + + for (c=0; c < 3; c++) + { + sources[c] = &lookup[c][color[c]].sources[i]; + error += ((size_t) sources[c]->error) * ((size_t) sources[c]->error); + } + + if (error > maxError) + continue; + + start->x = (float) sources[0]->start / 31.0f; + start->y = (float) sources[1]->start / 63.0f; + start->z = (float) sources[2]->start / 31.0f; + + end->x = (float) sources[0]->end / 31.0f; + end->y = (float) sources[1]->end / 63.0f; + end->z = (float) sources[2]->end / 31.0f; + + *index = (unsigned char) (2*i); + maxError = error; + } +} + +static void ComputePrincipleComponent(const float *covariance, + DDSVector3 *principle) +{ + DDSVector4 + row0, + row1, + row2, + v; + + ssize_t + i; + + row0.x = covariance[0]; + row0.y = covariance[1]; + row0.z = covariance[2]; + row0.w = 0.0f; + + row1.x = covariance[1]; + row1.y = covariance[3]; + row1.z = covariance[4]; + row1.w = 0.0f; + + row2.x = covariance[2]; + row2.y = covariance[4]; + row2.z = covariance[5]; + row2.w = 0.0f; + + VectorInit(v,1.0f); + + for (i=0; i < 8; i++) + { + DDSVector4 + w; + + float + a; + + w.x = row0.x * v.x; + w.y = row0.y * v.x; + w.z = row0.z * v.x; + w.w = row0.w * v.x; + + w.x = (row1.x * v.y) + w.x; + w.y = (row1.y * v.y) + w.y; + w.z = (row1.z * v.y) + w.z; + w.w = (row1.w * v.y) + w.w; + + w.x = (row2.x * v.z) + w.x; + w.y = (row2.y * v.z) + w.y; + w.z = (row2.z * v.z) + w.z; + w.w = (row2.w * v.z) + w.w; + + a = (float) PerceptibleReciprocal(MagickMax(w.x,MagickMax(w.y,w.z))); + + v.x = w.x * a; + v.y = w.y * a; + v.z = w.z * a; + v.w = w.w * a; + } + + VectorCopy43(v,principle); +} + +static void ComputeWeightedCovariance(const size_t count, + const DDSVector4 *points, float *covariance) +{ + DDSVector3 + centroid; + + float + total; + + size_t + i; + + total = 0.0f; + VectorInit3(centroid,0.0f); + + for (i=0; i < count; i++) + { + total += points[i].w; + centroid.x += (points[i].x * points[i].w); + centroid.y += (points[i].y * points[i].w); + centroid.z += (points[i].z * points[i].w); + } + + if( total > 1.192092896e-07F) + { + centroid.x /= total; + centroid.y /= total; + centroid.z /= total; + } + + for (i=0; i < 6; i++) + covariance[i] = 0.0f; + + for (i = 0; i < count; i++) + { + DDSVector3 + a, + b; + + a.x = points[i].x - centroid.x; + a.y = points[i].y - centroid.y; + a.z = points[i].z - centroid.z; + + b.x = points[i].w * a.x; + b.y = points[i].w * a.y; + b.z = points[i].w * a.z; + + covariance[0] += a.x*b.x; + covariance[1] += a.x*b.y; + covariance[2] += a.x*b.z; + covariance[3] += a.y*b.y; + covariance[4] += a.y*b.z; + covariance[5] += a.z*b.z; + } +} + +static MagickBooleanType ConstructOrdering(const size_t count, + const DDSVector4 *points, const DDSVector3 axis, DDSVector4 *pointsWeights, + DDSVector4 *xSumwSum, unsigned char *order, size_t iteration) +{ + float + dps[16], + f; + + ssize_t + i; + + size_t + j; + + unsigned char + c, + *o, + *p; + + o = order + (16*iteration); + + for (i=0; i < (ssize_t) count; i++) + { + dps[i] = Dot(points[i],axis); + o[i] = (unsigned char)i; + } + + for (i=0; i < (ssize_t) count; i++) + { + for (j=i; j > 0 && dps[j] < dps[j - 1]; j--) + { + f = dps[j]; + dps[j] = dps[j - 1]; + dps[j - 1] = f; + + c = o[j]; + o[j] = o[j - 1]; + o[j - 1] = c; + } + } + + for (i=0; i < (ssize_t) iteration; i++) + { + MagickBooleanType + same; + + p = order + (16*i); + same = MagickTrue; + + for (j=0; j < count; j++) + { + if (o[j] != p[j]) + { + same = MagickFalse; + break; + } + } + + if (same != MagickFalse) + return MagickFalse; + } + + xSumwSum->x = 0; + xSumwSum->y = 0; + xSumwSum->z = 0; + xSumwSum->w = 0; + + for (i=0; i < (ssize_t) count; i++) + { + DDSVector4 + v; + + j = (size_t) o[i]; + + v.x = points[j].w * points[j].x; + v.y = points[j].w * points[j].y; + v.z = points[j].w * points[j].z; + v.w = points[j].w * 1.0f; + + VectorCopy44(v,&pointsWeights[i]); + VectorAdd(*xSumwSum,v,xSumwSum); + } + + return MagickTrue; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s D D S % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsDDS() returns MagickTrue if the image format type, identified by the +% magick string, is DDS. +% +% The format of the IsDDS method is: +% +% MagickBooleanType IsDDS(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsDDS(const unsigned char *magick, const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (LocaleNCompare((char *) magick,"DDS ", 4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d D D S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadDDSImage() reads a DirectDraw Surface image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadDDSImage method is: +% +% Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: The image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status, + cubemap = MagickFalse, + volume = MagickFalse, + matte; + + CompressionType + compression; + + DDSInfo + dds_info; + + DDSDecoder + *decoder; + + size_t + n, + num_images; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + + /* + Initialize image structure. + */ + if (ReadDDSInfo(image, &dds_info) != MagickTrue) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + + if (dds_info.ddscaps2 & DDSCAPS2_CUBEMAP) + cubemap = MagickTrue; + + if (dds_info.ddscaps2 & DDSCAPS2_VOLUME && dds_info.depth > 0) + volume = MagickTrue; + + (void) SeekBlob(image, 128, SEEK_SET); + + /* + Determine pixel format + */ + if (dds_info.pixelformat.flags & DDPF_RGB) + { + compression = NoCompression; + if (dds_info.pixelformat.flags & DDPF_ALPHAPIXELS) + { + matte = MagickTrue; + decoder = ReadUncompressedRGBA; + } + else + { + matte = MagickTrue; + decoder = ReadUncompressedRGB; + } + } + else if (dds_info.pixelformat.flags & DDPF_LUMINANCE) + { + compression = NoCompression; + if (dds_info.pixelformat.flags & DDPF_ALPHAPIXELS) + { + /* Not sure how to handle this */ + ThrowReaderException(CorruptImageError, "ImageTypeNotSupported"); + } + else + { + matte = MagickFalse; + decoder = ReadUncompressedRGB; + } + } + else if (dds_info.pixelformat.flags & DDPF_FOURCC) + { + switch (dds_info.pixelformat.fourcc) + { + case FOURCC_DXT1: + { + matte = MagickFalse; + compression = DXT1Compression; + decoder = ReadDXT1; + break; + } + case FOURCC_DXT3: + { + matte = MagickTrue; + compression = DXT3Compression; + decoder = ReadDXT3; + break; + } + case FOURCC_DXT5: + { + matte = MagickTrue; + compression = DXT5Compression; + decoder = ReadDXT5; + break; + } + default: + { + /* Unknown FOURCC */ + ThrowReaderException(CorruptImageError, "ImageTypeNotSupported"); + } + } + } + else + { + /* Neither compressed nor uncompressed... thus unsupported */ + ThrowReaderException(CorruptImageError, "ImageTypeNotSupported"); + } + + num_images = 1; + if (cubemap) + { + /* + Determine number of faces defined in the cubemap + */ + num_images = 0; + if (dds_info.ddscaps2 & DDSCAPS2_CUBEMAP_POSITIVEX) num_images++; + if (dds_info.ddscaps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) num_images++; + if (dds_info.ddscaps2 & DDSCAPS2_CUBEMAP_POSITIVEY) num_images++; + if (dds_info.ddscaps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) num_images++; + if (dds_info.ddscaps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) num_images++; + if (dds_info.ddscaps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) num_images++; + } + + if (volume) + num_images = dds_info.depth; + + if ((num_images == 0) || (num_images > GetBlobSize(image))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + + if (AcquireMagickResource(ListLengthResource,num_images) == MagickFalse) + ThrowReaderException(ResourceLimitError,"ListLengthExceedsLimit"); + + for (n = 0; n < num_images; n++) + { + if (n != 0) + { + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + /* Start a new image */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + return(DestroyImageList(image)); + image=SyncNextImageInList(image); + } + + image->matte = matte; + image->compression = compression; + image->columns = dds_info.width; + image->rows = dds_info.height; + image->storage_class = DirectClass; + image->endian = LSBEndian; + image->depth = 8; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) SetImageBackgroundColor(image); + if ((decoder)(image, &dds_info, exception) != MagickTrue) + { + (void) CloseBlob(image); + if (n == 0) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); + } + } + + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +static MagickBooleanType ReadDDSInfo(Image *image, DDSInfo *dds_info) +{ + size_t + hdr_size, + required; + + /* Seek to start of header */ + (void) SeekBlob(image, 4, SEEK_SET); + + /* Check header field */ + hdr_size = ReadBlobLSBLong(image); + if (hdr_size != 124) + return MagickFalse; + + /* Fill in DDS info struct */ + dds_info->flags = ReadBlobLSBLong(image); + + /* Check required flags */ + required=(size_t) (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT); + if ((dds_info->flags & required) != required) + return MagickFalse; + + dds_info->height = ReadBlobLSBLong(image); + dds_info->width = ReadBlobLSBLong(image); + dds_info->pitchOrLinearSize = ReadBlobLSBLong(image); + dds_info->depth = ReadBlobLSBLong(image); + dds_info->mipmapcount = ReadBlobLSBLong(image); + + (void) SeekBlob(image, 44, SEEK_CUR); /* reserved region of 11 DWORDs */ + + /* Read pixel format structure */ + hdr_size = ReadBlobLSBLong(image); + if (hdr_size != 32) + return MagickFalse; + + dds_info->pixelformat.flags = ReadBlobLSBLong(image); + dds_info->pixelformat.fourcc = ReadBlobLSBLong(image); + dds_info->pixelformat.rgb_bitcount = ReadBlobLSBLong(image); + dds_info->pixelformat.r_bitmask = ReadBlobLSBLong(image); + dds_info->pixelformat.g_bitmask = ReadBlobLSBLong(image); + dds_info->pixelformat.b_bitmask = ReadBlobLSBLong(image); + dds_info->pixelformat.alpha_bitmask = ReadBlobLSBLong(image); + + dds_info->ddscaps1 = ReadBlobLSBLong(image); + dds_info->ddscaps2 = ReadBlobLSBLong(image); + (void) SeekBlob(image, 12, SEEK_CUR); /* 3 reserved DWORDs */ + + return MagickTrue; +} + +static MagickBooleanType ReadDXT1(Image *image,DDSInfo *dds_info, + ExceptionInfo *exception) +{ + DDSColors + colors; + + PixelPacket + *q; + + ssize_t + i, + x; + + size_t + bits; + + ssize_t + j, + y; + + unsigned char + code; + + unsigned short + c0, + c1; + + for (y = 0; y < (ssize_t) image->rows; y += 4) + { + for (x = 0; x < (ssize_t) image->columns; x += 4) + { + /* Get 4x4 patch of pixels to write on */ + q=QueueAuthenticPixels(image,x,y,MagickMin(4,image->columns-x), + MagickMin(4,image->rows-y),exception); + + if (q == (PixelPacket *) NULL) + return MagickFalse; + + /* Read 8 bytes of data from the image */ + c0 = ReadBlobLSBShort(image); + c1 = ReadBlobLSBShort(image); + bits = ReadBlobLSBLong(image); + + CalculateColors(c0, c1, &colors, MagickFalse); + if (EOFBlob(image) != MagickFalse) + break; + + /* Write the pixels */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 4; i++) + { + if (((x + i) < (ssize_t) image->columns) && + ((y + j) < (ssize_t) image->rows)) + { + code=(unsigned char) ((bits >> ((j*4+i)*2)) & 0x3); + SetPixelRed(q,ScaleCharToQuantum(colors.r[code])); + SetPixelGreen(q,ScaleCharToQuantum(colors.g[code])); + SetPixelBlue(q,ScaleCharToQuantum(colors.b[code])); + SetPixelOpacity(q,ScaleCharToQuantum(colors.a[code])); + if ((colors.a[code] != 0) && (image->matte == MagickFalse)) + image->matte=MagickTrue; /* Correct matte */ + q++; + } + } + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + return MagickFalse; + } + if (EOFBlob(image) != MagickFalse) + break; + } + + return(SkipDXTMipmaps(image,dds_info,8,exception)); +} + +static MagickBooleanType ReadDXT3(Image *image, DDSInfo *dds_info, + ExceptionInfo *exception) +{ + DDSColors + colors; + + ssize_t + j, + y; + + PixelPacket + *q; + + ssize_t + i, + x; + + unsigned char + alpha; + + size_t + a0, + a1, + bits, + code; + + unsigned short + c0, + c1; + + for (y = 0; y < (ssize_t) dds_info->height; y += 4) + { + for (x = 0; x < (ssize_t) dds_info->width; x += 4) + { + /* Get 4x4 patch of pixels to write on */ + q = QueueAuthenticPixels(image, x, y, MagickMin(4, dds_info->width - x), + MagickMin(4, dds_info->height - y),exception); + + if (q == (PixelPacket *) NULL) + return MagickFalse; + + /* Read alpha values (8 bytes) */ + a0 = ReadBlobLSBLong(image); + a1 = ReadBlobLSBLong(image); + + /* Read 8 bytes of data from the image */ + c0 = ReadBlobLSBShort(image); + c1 = ReadBlobLSBShort(image); + bits = ReadBlobLSBLong(image); + + CalculateColors(c0, c1, &colors, MagickTrue); + if (EOFBlob(image) != MagickFalse) + break; + + /* Write the pixels */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 4; i++) + { + if ((x + i) < (ssize_t) dds_info->width && (y + j) < (ssize_t) dds_info->height) + { + code = (bits >> ((4*j+i)*2)) & 0x3; + SetPixelRed(q,ScaleCharToQuantum(colors.r[code])); + SetPixelGreen(q,ScaleCharToQuantum(colors.g[code])); + SetPixelBlue(q,ScaleCharToQuantum(colors.b[code])); + /* + Extract alpha value: multiply 0..15 by 17 to get range 0..255 + */ + if (j < 2) + alpha = 17U * (unsigned char) ((a0 >> (4*(4*j+i))) & 0xf); + else + alpha = 17U * (unsigned char) ((a1 >> (4*(4*(j-2)+i))) & 0xf); + SetPixelAlpha(q,ScaleCharToQuantum((unsigned char) + alpha)); + q++; + } + } + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + return MagickFalse; + } + if (EOFBlob(image) != MagickFalse) + break; + } + + return(SkipDXTMipmaps(image,dds_info,16,exception)); +} + +static MagickBooleanType ReadDXT5(Image *image, DDSInfo *dds_info, + ExceptionInfo *exception) +{ + DDSColors + colors; + + ssize_t + j, + y; + + MagickSizeType + alpha_bits; + + PixelPacket + *q; + + ssize_t + i, + x; + + unsigned char + a0, + a1; + + size_t + alpha, + bits, + code, + alpha_code; + + unsigned short + c0, + c1; + + for (y = 0; y < (ssize_t) dds_info->height; y += 4) + { + for (x = 0; x < (ssize_t) dds_info->width; x += 4) + { + /* Get 4x4 patch of pixels to write on */ + q = QueueAuthenticPixels(image, x, y, MagickMin(4, dds_info->width - x), + MagickMin(4, dds_info->height - y),exception); + + if (q == (PixelPacket *) NULL) + return MagickFalse; + + /* Read alpha values (8 bytes) */ + a0 = (unsigned char) ReadBlobByte(image); + a1 = (unsigned char) ReadBlobByte(image); + + alpha_bits = (MagickSizeType)ReadBlobLSBLong(image); + alpha_bits = alpha_bits | ((MagickSizeType)ReadBlobLSBShort(image) << 32); + + /* Read 8 bytes of data from the image */ + c0 = ReadBlobLSBShort(image); + c1 = ReadBlobLSBShort(image); + bits = ReadBlobLSBLong(image); + + CalculateColors(c0, c1, &colors, MagickTrue); + if (EOFBlob(image) != MagickFalse) + break; + + /* Write the pixels */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 4; i++) + { + if ((x + i) < (ssize_t) dds_info->width && (y + j) < (ssize_t) dds_info->height) + { + code = (bits >> ((4*j+i)*2)) & 0x3; + SetPixelRed(q,ScaleCharToQuantum(colors.r[code])); + SetPixelGreen(q,ScaleCharToQuantum(colors.g[code])); + SetPixelBlue(q,ScaleCharToQuantum(colors.b[code])); + /* Extract alpha value */ + alpha_code = (size_t) (alpha_bits >> (3*(4*j+i))) & 0x7; + if (alpha_code == 0) + alpha = a0; + else if (alpha_code == 1) + alpha = a1; + else if (a0 > a1) + alpha = ((8-alpha_code) * a0 + (alpha_code-1) * a1) / 7; + else if (alpha_code == 6) + alpha = 0; + else if (alpha_code == 7) + alpha = 255; + else + alpha = (((6-alpha_code) * a0 + (alpha_code-1) * a1) / 5); + SetPixelAlpha(q,ScaleCharToQuantum((unsigned char) + alpha)); + q++; + } + } + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + return MagickFalse; + } + if (EOFBlob(image) != MagickFalse) + break; + } + + return(SkipDXTMipmaps(image,dds_info,16,exception)); +} + +static MagickBooleanType ReadUncompressedRGB(Image *image, DDSInfo *dds_info, + ExceptionInfo *exception) +{ + PixelPacket + *q; + + ssize_t + x, y; + + unsigned short + color; + + if (dds_info->pixelformat.rgb_bitcount == 8) + (void) SetImageType(image,GrayscaleType); + else if (dds_info->pixelformat.rgb_bitcount == 16 && !IsBitMask( + dds_info->pixelformat,0xf800,0x07e0,0x001f,0x0000)) + ThrowBinaryException(CorruptImageError,"ImageTypeNotSupported", + image->filename); + + for (y = 0; y < (ssize_t) dds_info->height; y++) + { + q = QueueAuthenticPixels(image, 0, y, dds_info->width, 1,exception); + + if (q == (PixelPacket *) NULL) + return MagickFalse; + + for (x = 0; x < (ssize_t) dds_info->width; x++) + { + if (dds_info->pixelformat.rgb_bitcount == 8) + SetPixelGray(q,ScaleCharToQuantum(ReadBlobByte(image))); + else if (dds_info->pixelformat.rgb_bitcount == 16) + { + color=ReadBlobShort(image); + SetPixelRed(q,ScaleCharToQuantum((unsigned char) + (((color >> 11)/31.0)*255))); + SetPixelGreen(q,ScaleCharToQuantum((unsigned char) + ((((unsigned short)(color << 5) >> 10)/63.0)*255))); + SetPixelBlue(q,ScaleCharToQuantum((unsigned char) + ((((unsigned short)(color << 11) >> 11)/31.0)*255))); + } + else + { + SetPixelBlue(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + SetPixelGreen(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + SetPixelRed(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + if (dds_info->pixelformat.rgb_bitcount == 32) + (void) ReadBlobByte(image); + } + SetPixelAlpha(q,QuantumRange); + q++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + return MagickFalse; + } + + return(SkipRGBMipmaps(image,dds_info,3,exception)); +} + +static MagickBooleanType ReadUncompressedRGBA(Image *image, DDSInfo *dds_info, + ExceptionInfo *exception) +{ + PixelPacket + *q; + + ssize_t + alphaBits, + x, + y; + + unsigned short + color; + + alphaBits=0; + if (dds_info->pixelformat.rgb_bitcount == 16) + { + if (IsBitMask(dds_info->pixelformat,0x7c00,0x03e0,0x001f,0x8000)) + alphaBits=1; + else if (IsBitMask(dds_info->pixelformat,0x00ff,0x00ff,0x00ff,0xff00)) + { + alphaBits=2; + (void) SetImageType(image,GrayscaleMatteType); + } + else if (IsBitMask(dds_info->pixelformat,0x0f00,0x00f0,0x000f,0xf000)) + alphaBits=4; + else + ThrowBinaryException(CorruptImageError,"ImageTypeNotSupported", + image->filename); + } + + for (y = 0; y < (ssize_t) dds_info->height; y++) + { + q = QueueAuthenticPixels(image, 0, y, dds_info->width, 1,exception); + + if (q == (PixelPacket *) NULL) + return MagickFalse; + + for (x = 0; x < (ssize_t) dds_info->width; x++) + { + if (dds_info->pixelformat.rgb_bitcount == 16) + { + color=ReadBlobShort(image); + if (alphaBits == 1) + { + SetPixelAlpha(q,(color & (1 << 15)) ? QuantumRange : 0); + SetPixelRed(q,ScaleCharToQuantum((unsigned char) + ((((unsigned short)(color << 1) >> 11)/31.0)*255))); + SetPixelGreen(q,ScaleCharToQuantum((unsigned char) + ((((unsigned short)(color << 6) >> 11)/31.0)*255))); + SetPixelBlue(q,ScaleCharToQuantum((unsigned char) + ((((unsigned short)(color << 11) >> 11)/31.0)*255))); + } + else if (alphaBits == 2) + { + SetPixelAlpha(q,ScaleCharToQuantum((unsigned char) + (color >> 8))); + SetPixelGray(q,ScaleCharToQuantum((unsigned char)color)); + } + else + { + SetPixelAlpha(q,ScaleCharToQuantum((unsigned char) + (((color >> 12)/15.0)*255))); + SetPixelRed(q,ScaleCharToQuantum((unsigned char) + ((((unsigned short)(color << 4) >> 12)/15.0)*255))); + SetPixelGreen(q,ScaleCharToQuantum((unsigned char) + ((((unsigned short)(color << 8) >> 12)/15.0)*255))); + SetPixelBlue(q,ScaleCharToQuantum((unsigned char) + ((((unsigned short)(color << 12) >> 12)/15.0)*255))); + } + } + else + { + SetPixelBlue(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + SetPixelGreen(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + SetPixelRed(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + SetPixelAlpha(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + } + q++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + return MagickFalse; + } + + return(SkipRGBMipmaps(image,dds_info,4,exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r D D S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterDDSImage() adds attributes for the DDS image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterDDSImage method is: +% +% RegisterDDSImage(void) +% +*/ +ModuleExport size_t RegisterDDSImage(void) +{ + MagickInfo + *entry; + + entry = SetMagickInfo("DDS"); + entry->decoder = (DecodeImageHandler *) ReadDDSImage; + entry->encoder = (EncodeImageHandler *) WriteDDSImage; + entry->magick = (IsImageFormatHandler *) IsDDS; + entry->seekable_stream=MagickTrue; + entry->description = ConstantString("Microsoft DirectDraw Surface"); + entry->magick_module = ConstantString("DDS"); + (void) RegisterMagickInfo(entry); + entry = SetMagickInfo("DXT1"); + entry->decoder = (DecodeImageHandler *) ReadDDSImage; + entry->encoder = (EncodeImageHandler *) WriteDDSImage; + entry->magick = (IsImageFormatHandler *) IsDDS; + entry->seekable_stream=MagickTrue; + entry->description = ConstantString("Microsoft DirectDraw Surface"); + entry->magick_module = ConstantString("DDS"); + (void) RegisterMagickInfo(entry); + entry = SetMagickInfo("DXT5"); + entry->decoder = (DecodeImageHandler *) ReadDDSImage; + entry->encoder = (EncodeImageHandler *) WriteDDSImage; + entry->magick = (IsImageFormatHandler *) IsDDS; + entry->seekable_stream=MagickTrue; + entry->description = ConstantString("Microsoft DirectDraw Surface"); + entry->magick_module = ConstantString("DDS"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +static void RemapIndices(const ssize_t *map, const unsigned char *source, + unsigned char *target) +{ + ssize_t + i; + + for (i = 0; i < 16; i++) + { + if (map[i] == -1) + target[i] = 3; + else + target[i] = source[map[i]]; + } +} + +/* + Skip the mipmap images for compressed (DXTn) dds files +*/ +static MagickBooleanType SkipDXTMipmaps(Image *image,DDSInfo *dds_info, + int texel_size,ExceptionInfo *exception) +{ + ssize_t + i; + + MagickOffsetType + offset; + + size_t + h, + w; + + /* + Only skip mipmaps for textures and cube maps + */ + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageWarning,"UnexpectedEndOfFile", + image->filename); + return(MagickFalse); + } + if (dds_info->ddscaps1 & DDSCAPS_MIPMAP + && (dds_info->ddscaps1 & DDSCAPS_TEXTURE + || dds_info->ddscaps2 & DDSCAPS2_CUBEMAP)) + { + w = DIV2(dds_info->width); + h = DIV2(dds_info->height); + + /* + Mipmapcount includes the main image, so start from one + */ + for (i = 1; (i < (ssize_t) dds_info->mipmapcount) && w && h; i++) + { + offset = (MagickOffsetType) ((w + 3) / 4) * ((h + 3) / 4) * texel_size; + if (SeekBlob(image,offset,SEEK_CUR) < 0) + break; + if ((w == 1) && (h == 1)) + break; + w = DIV2(w); + h = DIV2(h); + } + } + return(MagickTrue); +} + +/* + Skip the mipmap images for uncompressed (RGB or RGBA) dds files +*/ +static MagickBooleanType SkipRGBMipmaps(Image *image,DDSInfo *dds_info, + int pixel_size,ExceptionInfo *exception) +{ + MagickOffsetType + offset; + + ssize_t + i; + + size_t + h, + w; + + /* + Only skip mipmaps for textures and cube maps + */ + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + return(MagickFalse); + } + if (dds_info->ddscaps1 & DDSCAPS_MIPMAP + && (dds_info->ddscaps1 & DDSCAPS_TEXTURE + || dds_info->ddscaps2 & DDSCAPS2_CUBEMAP)) + { + w = DIV2(dds_info->width); + h = DIV2(dds_info->height); + + /* + Mipmapcount includes the main image, so start from one + */ + for (i=1; (i < (ssize_t) dds_info->mipmapcount) && w && h; i++) + { + offset = (MagickOffsetType) w * h * pixel_size; + if (SeekBlob(image,offset,SEEK_CUR) < 0) + break; + w = DIV2(w); + h = DIV2(h); + if ((w == 1) && (h == 1)) + break; + } + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r D D S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterDDSImage() removes format registrations made by the +% DDS module from the list of supported formats. +% +% The format of the UnregisterDDSImage method is: +% +% UnregisterDDSImage(void) +% +*/ +ModuleExport void UnregisterDDSImage(void) +{ + (void) UnregisterMagickInfo("DDS"); + (void) UnregisterMagickInfo("DXT1"); + (void) UnregisterMagickInfo("DXT5"); +} + +static void WriteAlphas(Image *image, const ssize_t* alphas, size_t min5, + size_t max5, size_t min7, size_t max7) +{ + ssize_t + i; + + size_t + err5, + err7, + j; + + unsigned char + indices5[16], + indices7[16]; + + FixRange(min5,max5,5); + err5 = CompressAlpha(min5,max5,5,alphas,indices5); + + FixRange(min7,max7,7); + err7 = CompressAlpha(min7,max7,7,alphas,indices7); + + if (err7 < err5) + { + for (i=0; i < 16; i++) + { + unsigned char + index; + + index = indices7[i]; + if( index == 0 ) + indices5[i] = 1; + else if (index == 1) + indices5[i] = 0; + else + indices5[i] = 9 - index; + } + + min5 = max7; + max5 = min7; + } + + (void) WriteBlobByte(image,(unsigned char) min5); + (void) WriteBlobByte(image,(unsigned char) max5); + + for(i=0; i < 2; i++) + { + size_t + value = 0; + + for (j=0; j < 8; j++) + { + size_t index = (size_t) indices5[j + i*8]; + value |= ( index << 3*j ); + } + + for (j=0; j < 3; j++) + { + size_t byte = (value >> 8*j) & 0xff; + (void) WriteBlobByte(image,(unsigned char) byte); + } + } +} + +static void WriteCompressed(Image *image, const size_t count, + DDSVector4* points, const ssize_t* map, const MagickBooleanType clusterFit) +{ + float + covariance[16]; + + DDSVector3 + end, + principle, + start; + + DDSVector4 + metric; + + unsigned char + indices[16]; + + VectorInit(metric,1.0f); + VectorInit3(start,0.0f); + VectorInit3(end,0.0f); + + ComputeWeightedCovariance(count,points,covariance); + ComputePrincipleComponent(covariance,&principle); + + if (clusterFit == MagickFalse || count == 0) + CompressRangeFit(count,points,map,principle,metric,&start,&end,indices); + else + CompressClusterFit(count,points,map,principle,metric,&start,&end,indices); + + WriteIndices(image,start,end,indices); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e D D S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteDDSImage() writes a DirectDraw Surface image file in the DXT5 format. +% +% The format of the WriteBMPImage method is: +% +% MagickBooleanType WriteDDSImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteDDSImage(const ImageInfo *image_info, + Image *image) +{ + const char + *option; + + size_t + compression, + columns, + maxMipmaps, + mipmaps, + pixelFormat, + rows; + + MagickBooleanType + clusterFit, + status, + weightByAlpha; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + pixelFormat=DDPF_FOURCC; + compression=FOURCC_DXT5; + if (!image->matte) + compression=FOURCC_DXT1; + if (LocaleCompare(image_info->magick,"dxt1") == 0) + compression=FOURCC_DXT1; + if (image_info->compression == DXT1Compression) + compression=FOURCC_DXT1; + else if (image_info->compression == NoCompression) + pixelFormat=DDPF_RGB; + option=GetImageOption(image_info,"dds:compression"); + if (option != (char *) NULL) + { + if (LocaleCompare(option,"dxt1") == 0) + compression=FOURCC_DXT1; + if (LocaleCompare(option,"none") == 0) + pixelFormat=DDPF_RGB; + } + clusterFit=MagickFalse; + weightByAlpha=MagickFalse; + if (pixelFormat == DDPF_FOURCC) + { + option=GetImageOption(image_info,"dds:cluster-fit"); + if (IsStringTrue(option) != MagickFalse) + { + clusterFit=MagickTrue; + if (compression != FOURCC_DXT1) + { + option=GetImageOption(image_info,"dds:weight-by-alpha"); + if (IsStringTrue(option) != MagickFalse) + weightByAlpha=MagickTrue; + } + } + } + maxMipmaps=SIZE_MAX; + mipmaps=0; + if ((image->columns & (image->columns - 1)) == 0 && + (image->rows & (image->rows - 1)) == 0) + { + option=GetImageOption(image_info,"dds:mipmaps"); + if (option != (char *) NULL) + maxMipmaps=StringToUnsignedLong(option); + + if (maxMipmaps != 0) + { + columns=image->columns; + rows=image->rows; + while ((columns != 1 || rows != 1) && mipmaps != maxMipmaps) + { + columns=DIV2(columns); + rows=DIV2(rows); + mipmaps++; + } + } + } + WriteDDSInfo(image,pixelFormat,compression,mipmaps); + WriteImageData(image,pixelFormat,compression,clusterFit,weightByAlpha, + &image->exception); + if (mipmaps > 0 && WriteMipmaps(image,pixelFormat,compression,mipmaps, + clusterFit,weightByAlpha,&image->exception) == MagickFalse) + return(MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} + +static void WriteDDSInfo(Image *image, const size_t pixelFormat, + const size_t compression, const size_t mipmaps) +{ + char + software[MaxTextExtent]; + + ssize_t + i; + + unsigned int + format, + caps, + flags; + + flags=(unsigned int) (DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | + DDSD_PIXELFORMAT); + caps=(unsigned int) DDSCAPS_TEXTURE; + format=(unsigned int) pixelFormat; + + if (format == DDPF_FOURCC) + flags=flags | DDSD_LINEARSIZE; + else + flags=flags | DDSD_PITCH; + + if (mipmaps > 0) + { + flags=flags | (unsigned int) DDSD_MIPMAPCOUNT; + caps=caps | (unsigned int) (DDSCAPS_MIPMAP | DDSCAPS_COMPLEX); + } + + if (format != DDPF_FOURCC && image->matte) + format=format | DDPF_ALPHAPIXELS; + + (void) WriteBlob(image,4,(unsigned char *) "DDS "); + (void) WriteBlobLSBLong(image,124); + (void) WriteBlobLSBLong(image,flags); + (void) WriteBlobLSBLong(image,(unsigned int) image->rows); + (void) WriteBlobLSBLong(image,(unsigned int) image->columns); + + if (pixelFormat == DDPF_FOURCC) + { + /* Compressed DDS requires linear compressed size of first image */ + if (compression == FOURCC_DXT1) + (void) WriteBlobLSBLong(image,(unsigned int) (MagickMax(1, + (image->columns+3)/4)*MagickMax(1,(image->rows+3)/4)*8)); + else /* DXT5 */ + (void) WriteBlobLSBLong(image,(unsigned int) (MagickMax(1, + (image->columns+3)/4)*MagickMax(1,(image->rows+3)/4)*16)); + } + else + { + /* Uncompressed DDS requires byte pitch of first image */ + if (image->matte != MagickFalse) + (void) WriteBlobLSBLong(image,(unsigned int) (image->columns * 4)); + else + (void) WriteBlobLSBLong(image,(unsigned int) (image->columns * 3)); + } + + (void) WriteBlobLSBLong(image,0x00); + (void) WriteBlobLSBLong(image,(unsigned int) mipmaps+1); + (void) memset(software,0,sizeof(software)); + (void) CopyMagickString(software,"IMAGEMAGICK",MaxTextExtent); + (void) WriteBlob(image,44,(unsigned char *) software); + + (void) WriteBlobLSBLong(image,32); + (void) WriteBlobLSBLong(image,format); + + if (pixelFormat == DDPF_FOURCC) + { + (void) WriteBlobLSBLong(image,(unsigned int) compression); + for(i=0;i < 5;i++) /* bitcount / masks */ + (void) WriteBlobLSBLong(image,0x00); + } + else + { + (void) WriteBlobLSBLong(image,0x00); + if (image->matte != MagickFalse) + { + (void) WriteBlobLSBLong(image,32); + (void) WriteBlobLSBLong(image,0xff0000); + (void) WriteBlobLSBLong(image,0xff00); + (void) WriteBlobLSBLong(image,0xff); + (void) WriteBlobLSBLong(image,0xff000000); + } + else + { + (void) WriteBlobLSBLong(image,24); + (void) WriteBlobLSBLong(image,0xff0000); + (void) WriteBlobLSBLong(image,0xff00); + (void) WriteBlobLSBLong(image,0xff); + (void) WriteBlobLSBLong(image,0x00); + } + } + + (void) WriteBlobLSBLong(image,caps); + for(i=0;i < 4;i++) /* ddscaps2 + reserved region */ + (void) WriteBlobLSBLong(image,0x00); +} + +static void WriteFourCC(Image *image, const size_t compression, + const MagickBooleanType clusterFit, const MagickBooleanType weightByAlpha, + ExceptionInfo *exception) +{ + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + i, + y, + bx, + by; + + for (y=0; y < (ssize_t) image->rows; y+=4) + { + for (x=0; x < (ssize_t) image->columns; x+=4) + { + MagickBooleanType + match; + + DDSVector4 + point, + points[16]; + + size_t + count = 0, + max5 = 0, + max7 = 0, + min5 = 255, + min7 = 255, + columns = 4, + rows = 4; + + ssize_t + alphas[16], + map[16]; + + unsigned char + alpha; + + if (x + columns >= image->columns) + columns = image->columns - x; + + if (y + rows >= image->rows) + rows = image->rows - y; + + p=GetVirtualPixels(image,x,y,columns,rows,exception); + if (p == (const PixelPacket *) NULL) + break; + + for (i=0; i<16; i++) + { + map[i] = -1; + alphas[i] = -1; + } + + for (by=0; by < (ssize_t) rows; by++) + { + for (bx=0; bx < (ssize_t) columns; bx++) + { + if (compression == FOURCC_DXT5) + alpha = ScaleQuantumToChar(GetPixelAlpha(p)); + else + alpha = 255; + + if (compression == FOURCC_DXT5) + { + if (alpha < min7) + min7 = alpha; + if (alpha > max7) + max7 = alpha; + if (alpha != 0 && alpha < min5) + min5 = alpha; + if (alpha != 255 && alpha > max5) + max5 = alpha; + } + + alphas[4*by + bx] = (size_t)alpha; + + point.x = (float)ScaleQuantumToChar(GetPixelRed(p)) / 255.0f; + point.y = (float)ScaleQuantumToChar(GetPixelGreen(p)) / 255.0f; + point.z = (float)ScaleQuantumToChar(GetPixelBlue(p)) / 255.0f; + point.w = weightByAlpha ? (float)(alpha + 1) / 256.0f : 1.0f; + p++; + + match = MagickFalse; + for (i=0; i < (ssize_t) count; i++) + { + if ((points[i].x == point.x) && + (points[i].y == point.y) && + (points[i].z == point.z) && + (alpha >= 128 || compression == FOURCC_DXT5)) + { + points[i].w += point.w; + map[4*by + bx] = i; + match = MagickTrue; + break; + } + } + + if (match != MagickFalse) + continue; + + points[count].x = point.x; + points[count].y = point.y; + points[count].z = point.z; + points[count].w = point.w; + map[4*by + bx] = count; + count++; + } + } + + for (i=0; i < (ssize_t) count; i++) + points[i].w = sqrt(points[i].w); + + if (compression == FOURCC_DXT5) + WriteAlphas(image,alphas,min5,max5,min7,max7); + + if (count == 1) + WriteSingleColorFit(image,points,map); + else + WriteCompressed(image,count,points,map,clusterFit); + } + } +} + +static void WriteImageData(Image *image, const size_t pixelFormat, + const size_t compression, const MagickBooleanType clusterFit, + const MagickBooleanType weightByAlpha, ExceptionInfo *exception) +{ + if (pixelFormat == DDPF_FOURCC) + WriteFourCC(image,compression,clusterFit,weightByAlpha,exception); + else + WriteUncompressed(image,exception); +} + +static inline size_t ClampToLimit(const float value, + const size_t limit) +{ + size_t + result = (int) (value + 0.5f); + + if (result < 0.0f) + return(0); + if (result > limit) + return(limit); + return result; +} + +static inline size_t ColorTo565(const DDSVector3 point) +{ + size_t r = ClampToLimit(31.0f*point.x,31); + size_t g = ClampToLimit(63.0f*point.y,63); + size_t b = ClampToLimit(31.0f*point.z,31); + + return (r << 11) | (g << 5) | b; +} + +static void WriteIndices(Image *image, const DDSVector3 start, + const DDSVector3 end, unsigned char* indices) +{ + ssize_t + i; + + size_t + a, + b; + + unsigned char + remapped[16]; + + const unsigned char + *ind; + + a = ColorTo565(start); + b = ColorTo565(end); + + for (i=0; i<16; i++) + { + if( a < b ) + remapped[i] = (indices[i] ^ 0x1) & 0x3; + else if( a == b ) + remapped[i] = 0; + else + remapped[i] = indices[i]; + } + + if( a < b ) + Swap(a,b); + + (void) WriteBlobByte(image,(unsigned char) (a & 0xff)); + (void) WriteBlobByte(image,(unsigned char) (a >> 8)); + (void) WriteBlobByte(image,(unsigned char) (b & 0xff)); + (void) WriteBlobByte(image,(unsigned char) (b >> 8)); + + for (i=0; i<4; i++) + { + ind = remapped + 4*i; + (void) WriteBlobByte(image,ind[0] | (ind[1] << 2) | (ind[2] << 4) | + (ind[3] << 6)); + } +} + +static MagickBooleanType WriteMipmaps(Image *image, const size_t pixelFormat, + const size_t compression, const size_t mipmaps, + const MagickBooleanType clusterFit, const MagickBooleanType weightByAlpha, + ExceptionInfo *exception) +{ + Image* + resize_image; + + ssize_t + i; + + size_t + columns, + rows; + + columns = image->columns; + rows = image->rows; + + for (i=0; i< (ssize_t) mipmaps; i++) + { + resize_image = ResizeImage(image,DIV2(columns),DIV2(rows),TriangleFilter,1.0, + exception); + + if (resize_image == (Image *) NULL) + return(MagickFalse); + + DestroyBlob(resize_image); + resize_image->blob=ReferenceBlob(image->blob); + + WriteImageData(resize_image,pixelFormat,compression,weightByAlpha, + clusterFit,exception); + + resize_image=DestroyImage(resize_image); + + columns = DIV2(columns); + rows = DIV2(rows); + } + + return(MagickTrue); +} + +static void WriteSingleColorFit(Image *image, const DDSVector4* points, + const ssize_t* map) +{ + DDSVector3 + start, + end; + + ssize_t + i; + + unsigned char + color[3], + index, + indexes[16], + indices[16]; + + color[0] = (unsigned char) ClampToLimit(255.0f*points->x,255); + color[1] = (unsigned char) ClampToLimit(255.0f*points->y,255); + color[2] = (unsigned char) ClampToLimit(255.0f*points->z,255); + + index=0; + ComputeEndPoints(DDS_LOOKUP,color,&start,&end,&index); + + for (i=0; i< 16; i++) + indexes[i]=index; + RemapIndices(map,indexes,indices); + WriteIndices(image,start,end,indices); +} + +static void WriteUncompressed(Image *image, ExceptionInfo *exception) +{ + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + y; + + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelBlue(p))); + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelGreen(p))); + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelRed(p))); + if (image->matte) + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelAlpha(p))); + p++; + } + } +} diff --git a/ImageMagick-6.9.12-44/coders/debug.c b/ImageMagick-6.9.12-44/coders/debug.c new file mode 100644 index 0000000..ad11732 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/debug.c @@ -0,0 +1,274 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD EEEEE BBBB U U GGGG % +% D D E B B U U G % +% D D EEE BBBB U U G GG % +% D D E B B U U G G % +% DDDD EEEEE BBBB UUU GGG % +% % +% % +% Image Pixel Values for Debugging. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/annotate.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/constitute.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteDEBUGImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r D E B U G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterDEBUGImage() adds attributes for the DEBUG image format to the +% list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterDEBUGImage method is: +% +% size_t RegisterDEBUGImage(void) +% +*/ +ModuleExport size_t RegisterDEBUGImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("DEBUG"); + entry->encoder=(EncodeImageHandler *) WriteDEBUGImage; + entry->raw=MagickTrue; + entry->stealth=MagickTrue; + entry->description=ConstantString("Image pixel values for debugging"); + entry->magick_module=ConstantString("DEBUG"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r D E B U G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterDEBUGImage() removes format registrations made by the +% DEBUG module from the list of supported format. +% +% The format of the UnregisterDEBUGImage method is: +% +% UnregisterDEBUGImage(void) +% +*/ +ModuleExport void UnregisterDEBUGImage(void) +{ + (void) UnregisterMagickInfo("DEBUG"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e D E B U G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteDEBUGImage writes the image pixel values with 20 places of precision. +% +% The format of the WriteDEBUGImage method is: +% +% MagickBooleanType WriteDEBUGImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteDEBUGImage(const ImageInfo *image_info, + Image *image) +{ + char + buffer[MaxTextExtent], + colorspace[MaxTextExtent], + tuple[MaxTextExtent]; + + ssize_t + y; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + MagickPixelPacket + pixel; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + size_t + imageListLength; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + imageListLength=GetImageListLength(image); + do + { + (void) CopyMagickString(colorspace,CommandOptionToMnemonic( + MagickColorspaceOptions,(ssize_t) image->colorspace),MaxTextExtent); + LocaleLower(colorspace); + image->depth=GetImageQuantumDepth(image,MagickTrue); + if (image->matte != MagickFalse) + (void) ConcatenateMagickString(colorspace,"a",MaxTextExtent); + (void) FormatLocaleString(buffer,MaxTextExtent, + "# ImageMagick pixel debugging: %.20g,%.20g,%.20g,%s\n",(double) + image->columns,(double) image->rows,(double) ((MagickOffsetType) + GetQuantumRange(image->depth)),colorspace); + (void) WriteBlobString(image,buffer); + GetMagickPixelPacket(image,&pixel); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g,%.20g: ",(double) + x,(double) y); + (void) WriteBlobString(image,buffer); + SetMagickPixelPacket(image,p,indexes+x,&pixel); + (void) FormatLocaleString(tuple,MaxTextExtent,"%.20g,%.20g,%.20g ", + (double) pixel.red,(double) pixel.green,(double) pixel.blue); + if (pixel.colorspace == CMYKColorspace) + { + char + black[MaxTextExtent]; + + (void) FormatLocaleString(black,MaxTextExtent,",%.20g ", + (double) pixel.index); + (void) ConcatenateMagickString(tuple,black,MaxTextExtent); + } + if (pixel.matte != MagickFalse) + { + char + alpha[MaxTextExtent]; + + (void) FormatLocaleString(alpha,MaxTextExtent,",%.20g ", + (double) (QuantumRange-pixel.opacity)); + (void) ConcatenateMagickString(tuple,alpha,MaxTextExtent); + } + (void) WriteBlobString(image,tuple); + (void) WriteBlobString(image,"\n"); + p++; + } + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/dib.c b/ImageMagick-6.9.12-44/coders/dib.c new file mode 100644 index 0000000..fb3ab0b --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/dib.c @@ -0,0 +1,1431 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD IIIII BBBB % +% D D I B B % +% D D I BBBB % +% D D I B B % +% DDDD IIIII BBBB % +% % +% % +% Read/Write Windows DIB Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/transform.h" + +/* + Typedef declarations. +*/ +typedef struct _DIBInfo +{ + unsigned int + size; + + int + width, + height; + + unsigned short + planes, + bits_per_pixel; + + unsigned int + compression, + image_size, + x_pixels, + y_pixels, + number_colors, + colors_important; + + unsigned short + red_mask, + green_mask, + blue_mask, + alpha_mask; + + int + colorspace; + + PointInfo + red_primary, + green_primary, + blue_primary, + gamma_scale; +} DIBInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteDIBImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DecodeImage unpacks the packed image pixels into runlength-encoded +% pixel packets. +% +% The format of the DecodeImage method is: +% +% MagickBooleanType DecodeImage(Image *image, +% const MagickBooleanType compression,unsigned char *pixels, +% const size_t number_pixels) +% +% A description of each parameter follows: +% +% o image: the address of a structure of type Image. +% +% o compression: A value of 1 means the compressed pixels are runlength +% encoded for a 256-color bitmap. A value of 2 means a 16-color bitmap. +% +% o pixels: The address of a byte (8 bits) array of pixel data created by +% the decoding process. +% +% o number_pixels: The number of pixels. +% +*/ +static MagickBooleanType DecodeImage(Image *image, + const MagickBooleanType compression,unsigned char *pixels, + const size_t number_pixels) +{ +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__MINGW32__) +#define BI_RGB 0 +#define BI_RLE8 1 +#define BI_RLE4 2 +#define BI_BITFIELDS 3 +#undef BI_JPEG +#define BI_JPEG 4 +#undef BI_PNG +#define BI_PNG 5 +#endif + + int + byte, + count; + + ssize_t + y; + + ssize_t + i, + x; + + unsigned char + *p, + *q; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(pixels != (unsigned char *) NULL); + (void) memset(pixels,0,number_pixels*sizeof(*pixels)); + byte=0; + x=0; + p=pixels; + q=pixels+number_pixels; + for (y=0; y < (ssize_t) image->rows; ) + { + MagickBooleanType + status; + + if ((p < pixels) || (p >= q)) + break; + count=ReadBlobByte(image); + if (count == EOF) + break; + if (count > 0) + { + /* + Encoded mode. + */ + count=(int) MagickMin((size_t) count,(size_t) (q-p)); + byte=ReadBlobByte(image); + if (byte == EOF) + break; + if (compression == BI_RLE8) + { + for (i=0; i < (ssize_t) count; i++) + *p++=(unsigned char) byte; + } + else + { + for (i=0; i < (ssize_t) count; i++) + *p++=(unsigned char) + ((i & 0x01) != 0 ? (byte & 0x0f) : ((byte >> 4) & 0x0f)); + } + x+=count; + } + else + { + /* + Escape mode. + */ + count=ReadBlobByte(image); + if (count == EOF) + break; + if (count == 0x01) + return(MagickTrue); + switch (count) + { + case 0x00: + { + /* + End of line. + */ + x=0; + y++; + p=pixels+y*image->columns; + break; + } + case 0x02: + { + /* + Delta mode. + */ + x+=ReadBlobByte(image); + y+=ReadBlobByte(image); + p=pixels+y*image->columns+x; + break; + } + default: + { + /* + Absolute mode. + */ + count=(int) MagickMin((size_t) count,(size_t) (q-p)); + if (compression == BI_RLE8) + for (i=0; i < (ssize_t) count; i++) + { + byte=ReadBlobByte(image); + if (byte == EOF) + break; + *p++=(unsigned char) byte; + } + else + for (i=0; i < (ssize_t) count; i++) + { + if ((i & 0x01) == 0) + { + byte=ReadBlobByte(image); + if (byte == EOF) + break; + } + *p++=(unsigned char) + ((i & 0x01) != 0 ? (byte & 0x0f) : ((byte >> 4) & 0x0f)); + } + x+=count; + /* + Read pad byte. + */ + if (compression == BI_RLE8) + { + if ((count & 0x01) != 0) + if (ReadBlobByte(image) == EOF) + break; + } + else + if (((count & 0x03) == 1) || ((count & 0x03) == 2)) + if (ReadBlobByte(image) == EOF) + break; + break; + } + } + } + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) ReadBlobByte(image); /* end of line */ + (void) ReadBlobByte(image); + return(y < (ssize_t) image->rows ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E n c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EncodeImage compresses pixels using a runlength encoded format. +% +% The format of the EncodeImage method is: +% +% static MagickBooleanType EncodeImage(Image *image, +% const size_t bytes_per_line,const unsigned char *pixels, +% unsigned char *compressed_pixels) +% +% A description of each parameter follows: +% +% o image: The image. +% +% o bytes_per_line: the number of bytes in a scanline of compressed pixels +% +% o pixels: The address of a byte (8 bits) array of pixel data created by +% the compression process. +% +% o compressed_pixels: The address of a byte (8 bits) array of compressed +% pixel data. +% +*/ +static size_t EncodeImage(Image *image,const size_t bytes_per_line, + const unsigned char *pixels,unsigned char *compressed_pixels) +{ + ssize_t + y; + + const unsigned char + *p; + + ssize_t + i, + x; + + unsigned char + *q; + + /* + Runlength encode pixels. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(pixels != (const unsigned char *) NULL); + assert(compressed_pixels != (unsigned char *) NULL); + p=pixels; + q=compressed_pixels; + i=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + for (x=0; x < (ssize_t) bytes_per_line; x+=i) + { + /* + Determine runlength. + */ + for (i=1; ((x+i) < (ssize_t) bytes_per_line); i++) + if ((*(p+i) != *p) || (i == 255)) + break; + *q++=(unsigned char) i; + *q++=(*p); + p+=i; + } + /* + End of line. + */ + *q++=0x00; + *q++=0x00; + if (SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,image->rows) == MagickFalse) + break; + } + /* + End of bitmap. + */ + *q++=0; + *q++=0x01; + return((size_t) (q-compressed_pixels)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s D I B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsDIB() returns MagickTrue if the image format type, identified by the +% magick string, is DIB. +% +% The format of the IsDIB method is: +% +% MagickBooleanType IsDIB(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsDIB(const unsigned char *magick,const size_t length) +{ + if (length < 2) + return(MagickFalse); + if (memcmp(magick,"\050\000",2) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d D I B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadDIBImage() reads a Microsoft Windows bitmap image file and +% returns it. It allocates the memory necessary for the new Image structure +% and returns a pointer to the new image. +% +% The format of the ReadDIBImage method is: +% +% image=ReadDIBImage(image_info) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadDIBImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + DIBInfo + dib_info; + + Image + *image; + + IndexPacket + index; + + ssize_t + bit, + y; + + MagickBooleanType + status; + + MemoryInfo + *pixel_info; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + i; + + unsigned char + *p; + + size_t + bytes_per_line, + length; + + ssize_t + count; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Determine if this a DIB file. + */ + (void) memset(&dib_info,0,sizeof(dib_info)); + dib_info.size=ReadBlobLSBLong(image); + if (dib_info.size != 40) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + /* + Microsoft Windows 3.X DIB image file. + */ + dib_info.width=ReadBlobLSBSignedLong(image); + dib_info.height=ReadBlobLSBSignedLong(image); + dib_info.planes=ReadBlobLSBShort(image); + dib_info.bits_per_pixel=ReadBlobLSBShort(image); + dib_info.compression=ReadBlobLSBLong(image); + dib_info.image_size=ReadBlobLSBLong(image); + dib_info.x_pixels=ReadBlobLSBLong(image); + dib_info.y_pixels=ReadBlobLSBLong(image); + dib_info.number_colors=ReadBlobLSBLong(image); + dib_info.colors_important=ReadBlobLSBLong(image); + if ((dib_info.bits_per_pixel != 1) && (dib_info.bits_per_pixel != 4) && + (dib_info.bits_per_pixel != 8) && (dib_info.bits_per_pixel != 16) && + (dib_info.bits_per_pixel != 24) && (dib_info.bits_per_pixel != 32)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((dib_info.compression == BI_BITFIELDS) && + ((dib_info.bits_per_pixel == 16) || (dib_info.bits_per_pixel == 32))) + { + dib_info.red_mask=(unsigned short) ReadBlobLSBLong(image); + dib_info.green_mask=(unsigned short) ReadBlobLSBLong(image); + dib_info.blue_mask=(unsigned short) ReadBlobLSBLong(image); + } + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + if (dib_info.width <= 0) + ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize"); + if (dib_info.height == 0) + ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize"); + if (dib_info.planes != 1) + ThrowReaderException(CorruptImageError,"StaticPlanesValueNotEqualToOne"); + if ((dib_info.bits_per_pixel != 1) && (dib_info.bits_per_pixel != 4) && + (dib_info.bits_per_pixel != 8) && (dib_info.bits_per_pixel != 16) && + (dib_info.bits_per_pixel != 24) && (dib_info.bits_per_pixel != 32)) + ThrowReaderException(CorruptImageError,"UnsupportedBitsPerPixel"); + if ((dib_info.bits_per_pixel < 16) && + (dib_info.number_colors > (unsigned int) (1UL << dib_info.bits_per_pixel))) + ThrowReaderException(CorruptImageError,"UnrecognizedNumberOfColors"); + if ((dib_info.compression == 1) && (dib_info.bits_per_pixel != 8)) + ThrowReaderException(CorruptImageError,"UnsupportedBitsPerPixel"); + if ((dib_info.compression == 2) && (dib_info.bits_per_pixel != 4)) + ThrowReaderException(CorruptImageError,"UnsupportedBitsPerPixel"); + if ((dib_info.compression == 3) && (dib_info.bits_per_pixel < 16)) + ThrowReaderException(CorruptImageError,"UnsupportedBitsPerPixel"); + switch (dib_info.compression) + { + case BI_RGB: + case BI_RLE8: + case BI_RLE4: + case BI_BITFIELDS: + break; + case BI_JPEG: + ThrowReaderException(CoderError,"JPEGCompressNotSupported"); + case BI_PNG: + ThrowReaderException(CoderError,"PNGCompressNotSupported"); + default: + ThrowReaderException(CorruptImageError,"UnrecognizedImageCompression"); + } + image->columns=(size_t) MagickAbsoluteValue((ssize_t) dib_info.width); + image->rows=(size_t) MagickAbsoluteValue((ssize_t) dib_info.height); + image->matte=dib_info.bits_per_pixel == 32 ? MagickTrue : MagickFalse; + image->depth=8; + if ((dib_info.number_colors > 256) || (dib_info.colors_important > 256)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((dib_info.number_colors != 0) && (dib_info.bits_per_pixel > 8)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((dib_info.image_size != 0U) && (dib_info.image_size > GetBlobSize(image))) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + if ((dib_info.number_colors != 0) || (dib_info.bits_per_pixel <= 8)) + { + size_t + one; + + image->storage_class=PseudoClass; + image->colors=dib_info.number_colors; + one=1; + if (image->colors == 0) + image->colors=one << dib_info.bits_per_pixel; + } + if (image_info->size != (char *) NULL) + { + RectangleInfo + geometry; + + MagickStatusType + flags; + + flags=ParseAbsoluteGeometry(image_info->size,&geometry); + if (flags & WidthValue) + if ((geometry.width != 0) && (geometry.width < image->columns)) + image->columns=geometry.width; + if (flags & HeightValue) + if ((geometry.height != 0) && (geometry.height < image->rows)) + image->rows=geometry.height; + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (image->storage_class == PseudoClass) + { + size_t + length, + packet_size; + + unsigned char + *dib_colormap; + + /* + Read DIB raster colormap. + */ + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + length=(size_t) image->colors; + dib_colormap=(unsigned char *) AcquireQuantumMemory(length, + 4*sizeof(*dib_colormap)); + if (dib_colormap == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + packet_size=4; + count=ReadBlob(image,packet_size*image->colors,dib_colormap); + if (count != (ssize_t) (packet_size*image->colors)) + { + dib_colormap=(unsigned char *) RelinquishMagickMemory(dib_colormap); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + p=dib_colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].blue=ScaleCharToQuantum(*p++); + image->colormap[i].green=ScaleCharToQuantum(*p++); + image->colormap[i].red=ScaleCharToQuantum(*p++); + if (packet_size == 4) + p++; + } + dib_colormap=(unsigned char *) RelinquishMagickMemory(dib_colormap); + } + /* + Read image data. + */ + if (dib_info.compression == BI_RLE4) + dib_info.bits_per_pixel<<=1; + bytes_per_line=4*((image->columns*dib_info.bits_per_pixel+31)/32); + length=bytes_per_line*image->rows; + if ((MagickSizeType) length > (256*GetBlobSize(image))) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + pixel_info=AcquireVirtualMemory(image->rows,MagickMax(bytes_per_line, + image->columns+256UL)*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + if ((dib_info.compression == BI_RGB) || + (dib_info.compression == BI_BITFIELDS)) + { + count=ReadBlob(image,length,pixels); + if (count != (ssize_t) (length)) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + } + else + { + /* + Convert run-length encoded raster pixels. + */ + status=DecodeImage(image,dib_info.compression ? MagickTrue : MagickFalse, + pixels,image->columns*image->rows); + if (status == MagickFalse) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError, + "UnableToRunlengthDecodeImage"); + } + } + /* + Initialize image structure. + */ + image->units=PixelsPerCentimeterResolution; + image->x_resolution=(double) dib_info.x_pixels/100.0; + image->y_resolution=(double) dib_info.y_pixels/100.0; + /* + Convert DIB raster image to pixel packets. + */ + switch (dib_info.bits_per_pixel) + { + case 1: + { + /* + Convert bitmap scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < ((ssize_t) image->columns-7); x+=8) + { + for (bit=0; bit < 8; bit++) + { + index=(IndexPacket) ((*p) & (0x80 >> bit) ? 0x01 : 0x00); + SetPixelIndex(indexes+x+bit,index); + } + p++; + } + if ((image->columns % 8) != 0) + { + for (bit=0; bit < (ssize_t) (image->columns % 8); bit++) + { + index=(IndexPacket) ((*p) & (0x80 >> bit) ? 0x01 : 0x00); + SetPixelIndex(indexes+x+bit,index); + } + p++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + image->rows-y-1,image->rows); + if (status == MagickFalse) + break; + } + } + (void) SyncImage(image); + break; + } + case 4: + { + /* + Convert PseudoColor scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < ((ssize_t) image->columns-1); x+=2) + { + index=ConstrainColormapIndex(image,(*p >> 4) & 0xf); + SetPixelIndex(indexes+x,index); + index=ConstrainColormapIndex(image,*p & 0xf); + SetPixelIndex(indexes+x+1,index); + p++; + } + if ((image->columns % 2) != 0) + { + index=ConstrainColormapIndex(image,(*p >> 4) & 0xf); + SetPixelIndex(indexes+x,index); + p++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + image->rows-y-1,image->rows); + if (status == MagickFalse) + break; + } + } + (void) SyncImage(image); + break; + } + case 8: + { + /* + Convert PseudoColor scanline. + */ + if ((dib_info.compression == BI_RLE8) || + (dib_info.compression == BI_RLE4)) + bytes_per_line=image->columns; + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + index=ConstrainColormapIndex(image,*p); + SetPixelIndex(indexes+x,index); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + image->rows-y-1,image->rows); + if (status == MagickFalse) + break; + } + } + (void) SyncImage(image); + break; + } + case 16: + { + unsigned short + word; + + /* + Convert PseudoColor scanline. + */ + image->storage_class=DirectClass; + if (dib_info.compression == BI_RLE8) + bytes_per_line=2*image->columns; + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + word=(*p++); + word|=(*p++ << 8); + if (dib_info.red_mask == 0) + { + SetPixelRed(q,ScaleCharToQuantum(ScaleColor5to8( + (unsigned char) ((word >> 10) & 0x1f)))); + SetPixelGreen(q,ScaleCharToQuantum(ScaleColor5to8( + (unsigned char) ((word >> 5) & 0x1f)))); + SetPixelBlue(q,ScaleCharToQuantum(ScaleColor5to8( + (unsigned char) (word & 0x1f)))); + } + else + { + SetPixelRed(q,ScaleCharToQuantum(ScaleColor5to8( + (unsigned char) ((word >> 11) & 0x1f)))); + SetPixelGreen(q,ScaleCharToQuantum(ScaleColor6to8( + (unsigned char) ((word >> 5) & 0x3f)))); + SetPixelBlue(q,ScaleCharToQuantum(ScaleColor5to8( + (unsigned char) (word & 0x1f)))); + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + image->rows-y-1,image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 24: + case 32: + { + /* + Convert DirectColor scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=pixels+(image->rows-y-1)*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelRed(q,ScaleCharToQuantum(*p++)); + if (image->matte != MagickFalse) + SetPixelOpacity(q,ScaleCharToQuantum(*p++)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + image->rows-y-1,image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + default: + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + if (strcmp(image_info->magick,"ICODIB") == 0) + { + int + c; + + /* + Handle ICO mask. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + ssize_t + x; + + PixelPacket + *magick_restrict q; + + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < ((ssize_t) image->columns-7); x+=8) + { + c=ReadBlobByte(image); + for (bit=0; bit < 8; bit++) + { + SetPixelOpacity(q+x+bit,c & (0x80 >> bit) ? TransparentOpacity : + OpaqueOpacity); + if (c & (0x80 >> bit)) + image->matte=MagickTrue; + } + } + if ((image->columns % 8) != 0) + { + c=ReadBlobByte(image); + for (bit=0; bit < (ssize_t) (image->columns % 8); bit++) + { + SetPixelOpacity(q+x+bit,c & (0x80 >> bit) ? TransparentOpacity : + OpaqueOpacity); + if (c & (0x80 >> bit)) + image->matte=MagickTrue; + } + } + if (image->columns % 32) + for (x=0; x < (ssize_t) ((32-(image->columns % 32))/8); x++) + c=ReadBlobByte(image); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if ((image->storage_class == PseudoClass) && (image->matte == MagickTrue)) + image->storage_class=DirectClass; + } + if (dib_info.height < 0) + { + Image + *flipped_image; + + /* + Correct image orientation. + */ + flipped_image=FlipImage(image,exception); + if (flipped_image != (Image *) NULL) + { + DuplicateBlob(flipped_image,image); + image=DestroyImage(image); + image=flipped_image; + } + } + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r D I B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterDIBImage() adds attributes for the DIB image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterDIBImage method is: +% +% size_t RegisterDIBImage(void) +% +*/ +ModuleExport size_t RegisterDIBImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("DIB"); + entry->decoder=(DecodeImageHandler *) ReadDIBImage; + entry->encoder=(EncodeImageHandler *) WriteDIBImage; + entry->magick=(IsImageFormatHandler *) IsDIB; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->stealth=MagickTrue; + entry->description=ConstantString( + "Microsoft Windows 3.X Packed Device-Independent Bitmap"); + entry->magick_module=ConstantString("DIB"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("ICODIB"); + entry->decoder=(DecodeImageHandler *) ReadDIBImage; + entry->magick=(IsImageFormatHandler *) IsDIB; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->stealth=MagickTrue; + entry->description=ConstantString( + "Microsoft Windows 3.X Packed Device-Independent Bitmap"); + entry->magick_module=ConstantString("DIB"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r D I B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterDIBImage() removes format registrations made by the +% DIB module from the list of supported formats. +% +% The format of the UnregisterDIBImage method is: +% +% UnregisterDIBImage(void) +% +*/ +ModuleExport void UnregisterDIBImage(void) +{ + (void) UnregisterMagickInfo("ICODIB"); + (void) UnregisterMagickInfo("DIB"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e D I B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteDIBImage() writes an image in Microsoft Windows bitmap encoded +% image format. +% +% The format of the WriteDIBImage method is: +% +% MagickBooleanType WriteDIBImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteDIBImage(const ImageInfo *image_info,Image *image) +{ + DIBInfo + dib_info; + + MagickBooleanType + status; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + unsigned char + *q; + + size_t + bytes_per_line; + + ssize_t + y; + + unsigned char + *dib_data, + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (((image->columns << 3) != (size_t) ((int) (image->columns << 3))) || + ((image->rows << 3) != (size_t) ((int) (image->rows << 3)))) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + /* + Initialize DIB raster file header. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + if (image->storage_class == DirectClass) + { + /* + Full color DIB raster. + */ + dib_info.number_colors=0; + dib_info.bits_per_pixel=(unsigned short) (image->matte ? 32 : 24); + } + else + { + /* + Colormapped DIB raster. + */ + dib_info.bits_per_pixel=8; + if (image_info->depth > 8) + dib_info.bits_per_pixel=16; + if (SetImageMonochrome(image,&image->exception) != MagickFalse) + dib_info.bits_per_pixel=1; + dib_info.number_colors=(unsigned int) (dib_info.bits_per_pixel == 16 ? 0 : + (1UL << dib_info.bits_per_pixel)); + } + bytes_per_line=4*((image->columns*dib_info.bits_per_pixel+31)/32); + dib_info.size=40; + dib_info.width=(int) image->columns; + dib_info.height=(int) image->rows; + dib_info.planes=1; + dib_info.compression=(unsigned int) (dib_info.bits_per_pixel == 16 ? + BI_BITFIELDS : BI_RGB); + dib_info.image_size=(unsigned int) (bytes_per_line*image->rows); + dib_info.x_pixels=75*39; + dib_info.y_pixels=75*39; + switch (image->units) + { + case UndefinedResolution: + case PixelsPerInchResolution: + { + dib_info.x_pixels=(unsigned int) (100.0*image->x_resolution/2.54); + dib_info.y_pixels=(unsigned int) (100.0*image->y_resolution/2.54); + break; + } + case PixelsPerCentimeterResolution: + { + dib_info.x_pixels=(unsigned int) (100.0*image->x_resolution); + dib_info.y_pixels=(unsigned int) (100.0*image->y_resolution); + break; + } + } + dib_info.colors_important=dib_info.number_colors; + /* + Convert MIFF to DIB raster pixels. + */ + pixels=(unsigned char *) AcquireQuantumMemory(image->rows,MagickMax( + bytes_per_line,image->columns+256UL)*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(pixels,0,dib_info.image_size); + switch (dib_info.bits_per_pixel) + { + case 1: + { + unsigned char + bit, + byte; + + /* + Convert PseudoClass image to a DIB monochrome image. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + q=pixels+(image->rows-y-1)*bytes_per_line; + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte<<=1; + byte|=GetPixelIndex(indexes+x) != 0 ? 0x01 : 0x00; + bit++; + if (bit == 8) + { + *q++=byte; + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + { + *q++=(unsigned char) (byte << (8-bit)); + x++; + } + for (x=(ssize_t) (image->columns+7)/8; x < (ssize_t) bytes_per_line; x++) + *q++=0x00; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + break; + } + case 8: + { + /* + Convert PseudoClass packet to DIB pixel. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + q=pixels+(image->rows-y-1)*bytes_per_line; + for (x=0; x < (ssize_t) image->columns; x++) + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + for ( ; x < (ssize_t) bytes_per_line; x++) + *q++=0x00; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + break; + } + case 16: + { + unsigned short + word; + /* + Convert PseudoClass packet to DIB pixel. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels+(image->rows-y-1)*bytes_per_line; + for (x=0; x < (ssize_t) image->columns; x++) + { + word=(unsigned short) ((ScaleColor8to5((unsigned char) + ScaleQuantumToChar(GetPixelRed(p))) << 11) | + (ScaleColor8to6((unsigned char) ScaleQuantumToChar( + GetPixelGreen(p))) << 5) | (ScaleColor8to5((unsigned char) + ScaleQuantumToChar((unsigned char) GetPixelBlue(p)) << + 0))); + *q++=(unsigned char)(word & 0xff); + *q++=(unsigned char)(word >> 8); + p++; + } + for (x=(ssize_t) (2*image->columns); x < (ssize_t) bytes_per_line; x++) + *q++=0x00; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + break; + } + case 24: + case 32: + { + /* + Convert DirectClass packet to DIB RGB pixel. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels+(image->rows-y-1)*bytes_per_line; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelRed(p)); + if (image->matte != MagickFalse) + *q++=ScaleQuantumToChar(GetPixelOpacity(p)); + p++; + } + if (dib_info.bits_per_pixel == 24) + for (x=(ssize_t) (3*image->columns); x < (ssize_t) bytes_per_line; x++) + *q++=0x00; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + break; + } + } + if (dib_info.bits_per_pixel == 8) + if (image_info->compression != NoCompression) + { + size_t + length; + + /* + Convert run-length encoded raster pixels. + */ + length=2UL*(bytes_per_line+2UL)+2UL; + dib_data=(unsigned char *) AcquireQuantumMemory(length, + (image->rows+2UL)*sizeof(*dib_data)); + if (dib_data == (unsigned char *) NULL) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + dib_info.image_size=(unsigned int) EncodeImage(image,bytes_per_line, + pixels,dib_data); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + pixels=dib_data; + dib_info.compression = BI_RLE8; + } + /* + Write DIB header. + */ + (void) WriteBlobLSBLong(image,dib_info.size); + (void) WriteBlobLSBLong(image,(unsigned int) dib_info.width); + (void) WriteBlobLSBLong(image,(unsigned int) dib_info.height); + (void) WriteBlobLSBShort(image,dib_info.planes); + (void) WriteBlobLSBShort(image,dib_info.bits_per_pixel); + (void) WriteBlobLSBLong(image,dib_info.compression); + (void) WriteBlobLSBLong(image,dib_info.image_size); + (void) WriteBlobLSBLong(image,dib_info.x_pixels); + (void) WriteBlobLSBLong(image,dib_info.y_pixels); + (void) WriteBlobLSBLong(image,dib_info.number_colors); + (void) WriteBlobLSBLong(image,dib_info.colors_important); + if (image->storage_class == PseudoClass) + { + if (dib_info.bits_per_pixel <= 8) + { + unsigned char + *dib_colormap; + + /* + Dump colormap to file. + */ + dib_colormap=(unsigned char *) AcquireQuantumMemory((size_t) + (1UL << dib_info.bits_per_pixel),4*sizeof(*dib_colormap)); + if (dib_colormap == (unsigned char *) NULL) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + q=dib_colormap; + for (i=0; i < (ssize_t) MagickMin(image->colors,dib_info.number_colors); i++) + { + *q++=ScaleQuantumToChar(image->colormap[i].blue); + *q++=ScaleQuantumToChar(image->colormap[i].green); + *q++=ScaleQuantumToChar(image->colormap[i].red); + *q++=(Quantum) 0x0; + } + for ( ; i < (ssize_t) (1L << dib_info.bits_per_pixel); i++) + { + *q++=(Quantum) 0x0; + *q++=(Quantum) 0x0; + *q++=(Quantum) 0x0; + *q++=(Quantum) 0x0; + } + (void) WriteBlob(image,(size_t) (4*(1 << dib_info.bits_per_pixel)), + dib_colormap); + dib_colormap=(unsigned char *) RelinquishMagickMemory(dib_colormap); + } + else + if ((dib_info.bits_per_pixel == 16) && + (dib_info.compression == BI_BITFIELDS)) + { + (void) WriteBlobLSBLong(image,0xf800); + (void) WriteBlobLSBLong(image,0x07e0); + (void) WriteBlobLSBLong(image,0x001f); + } + } + (void) WriteBlob(image,dib_info.image_size,pixels); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/djvu.c b/ImageMagick-6.9.12-44/coders/djvu.c new file mode 100644 index 0000000..32f4f55 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/djvu.c @@ -0,0 +1,995 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD J V V U U % +% D D J V V U U % +% D D J V V U U % +% D D J J V V U U % +% DDDD JJJ V UUU % +% % +% % +% Read DjVu Images. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colormap.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#if defined(MAGICKCORE_DJVU_DELEGATE) +#include +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s D J V U % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsDJVU() returns MagickTrue if the image format type, identified by the +% magick string, is DJVU. +% +% The format of the IsDJVU method is: +% +% MagickBooleanType IsDJVU(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsDJVU(const unsigned char *magick,const size_t length) +{ + if (length < 8) + return(MagickFalse); + if (memcmp(magick,"AT&TFORM",8) == 0) + return(MagickTrue); + return(MagickFalse); +} + +#if defined(MAGICKCORE_DJVU_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d D J V U I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadDJVUImage() reads DJVU image and returns it. It allocates the memory +% necessary for the new Image structure and returns a pointer to the new +% image or set of images. +% +% The format of the ReadDJVUImage method is: +% +% Image *ReadDJVUImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct _LoadContext + LoadContext; + +struct _LoadContext +{ + ddjvu_context_t* context; + ddjvu_document_t *document; + ddjvu_page_t *page; + int streamid; + int pages; + Image *image; +}; + +#define BLOCKSIZE 65536 +#if 0 +static void +pump_data(Image *image, LoadContext* lc) +{ + int blocksize = BLOCKSIZE; + char data[BLOCKSIZE]; + int size; + + /* i might check for a condition! */ + while ((size = (size_t) ReadBlob(image,(size_t) blocksize,data)) == blocksize) { + ddjvu_stream_write(lc->document, lc->streamid, data, size); + } + if (size) + ddjvu_stream_write(lc->document, lc->streamid, data, size); + ddjvu_stream_close(lc->document, lc->streamid, 0); +} +#endif + +/* returns NULL only after all is delivered! */ +static ddjvu_message_t* +pump_data_until_message(LoadContext *lc,Image *image) /* ddjvu_context_t *context, type ddjvu_document_type_t */ +{ + size_t blocksize = BLOCKSIZE; + unsigned char data[BLOCKSIZE]; + size_t size; + ddjvu_message_t *message; + + /* i might check for a condition! */ + size=0; + while (!(message = ddjvu_message_peek(lc->context)) + && (size = (size_t) ReadBlob(image,(size_t) blocksize,data)) == blocksize) { + ddjvu_stream_write(lc->document, lc->streamid, (char *) data, size); + } + if (message) + return message; + if (size) + ddjvu_stream_write(lc->document, lc->streamid, (char *) data, size); + ddjvu_stream_close(lc->document, lc->streamid, 0); + return NULL; +} +#define DEBUG 0 + +#if DEBUG +static const char *message_tag_name(ddjvu_message_tag_t tag) +{ + static char* names[] = + { + "ERROR", + "INFO", + "NEWSTREAM", + "DOCINFO", + "PAGEINFO", + "RELAYOUT", + "REDISPLAY", + "CHUNK", + "THUMBNAIL", + "PROGRESS", + }; + if (tag <= DDJVU_PROGRESS) + return names[tag]; + else { + /* bark! */ + return 0; + } +} +#endif + +/* write out nice info on the message, + * and store in *user* data the info on progress. + * */ +int +process_message(ddjvu_message_t *message) +{ + +#if 0 + ddjvu_context_t* context= message->m_any.context; +#endif + + if (! message) + return(-1); +#if DEBUG + printf("*** %s: %s.\n",__FUNCTION__, message_tag_name(message->m_any.tag)); +#endif + + + switch (message->m_any.tag){ + case DDJVU_DOCINFO: + { + ddjvu_document_t* document= message->m_any.document; + /* ddjvu_document_decoding_status is set by libdjvu! */ + /* we have some info on the document */ + LoadContext *lc = (LoadContext *) ddjvu_document_get_user_data(document); + lc->pages = ddjvu_document_get_pagenum(document); +#if DEBUG + printf("the doc has %d pages\n", ddjvu_document_get_pagenum(document)); +#endif + break; + } + case DDJVU_CHUNK: +#if DEBUG + printf("the name of the chunk is: %s\n", message->m_chunk.chunkid); +#endif + break; + + + case DDJVU_RELAYOUT: + case DDJVU_PAGEINFO: + { +#if 0 + ddjvu_page_t* page = message->m_any.page; + page_info* info = ddjvu_page_get_user_data(page); + + printf("page decoding status: %d %s%s%s\n", + ddjvu_page_decoding_status(page), + status_color, status_name(ddjvu_page_decoding_status(page)), color_reset); + + printf("the page LAYOUT changed: width x height: %d x %d @ %d dpi. Version %d, type %d\n", + // printf("page info:\n width x height: %d x %d @ %d dpi, version %d, type %d\n", + ddjvu_page_get_width(page), + ddjvu_page_get_height(page), + ddjvu_page_get_resolution(page), + ddjvu_page_get_version(page), + /* DDJVU_PAGETYPE_BITONAL */ + ddjvu_page_get_type(page)); + + info->info = 1; +#endif + break; + } + + case DDJVU_REDISPLAY: + { + +#if 0 + ddjvu_page_t* page = message->m_any.page; + page_info* info = ddjvu_page_get_user_data(page); + + printf("the page can/should be REDISPLAYED\n"); + info->display = 1; +#endif + break; + } + + case DDJVU_PROGRESS: +#if DEBUG + printf("PROGRESS:\n"); +#endif + break; + case DDJVU_ERROR: + printf("simply ERROR!\n message:\t%s\nfunction:\t%s(file %s)\nlineno:\t%d\n", + message->m_error.message, + message->m_error.function, + message->m_error.filename, + message->m_error.lineno); + break; + case DDJVU_INFO: +#if DEBUG + printf("INFO: %s!\n", message->m_info.message); +#endif + break; + default: + printf("unexpected\n"); + }; + return(message->m_any.tag); +} + + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + + +#define RGB 1 + +/* + * DjVu advertised readiness to provide bitmap: So get it! + * we use the RGB format! + */ +static void +get_page_image(LoadContext *lc, ddjvu_page_t *page, int x, int y, int w, int h, const ImageInfo *image_info ) { + ddjvu_format_t + *format; + + ddjvu_page_type_t + type; + + Image + *image; + + int + ret, + stride; + + unsigned char + *q; + + ddjvu_rect_t rect; + rect.x = x; + rect.y = y; + rect.w = (unsigned int) w; /* /10 */ + rect.h = (unsigned int) h; /* /10 */ + + image = lc->image; + type = ddjvu_page_get_type(lc->page); + + /* stride of this temporary buffer: */ + stride = (type == DDJVU_PAGETYPE_BITONAL)? + (image->columns + 7)/8 : image->columns *3; + + q = (unsigned char *) AcquireQuantumMemory(image->rows,stride); + if (q == (unsigned char *) NULL) + return; + + format = ddjvu_format_create( + (type == DDJVU_PAGETYPE_BITONAL)?DDJVU_FORMAT_LSBTOMSB : DDJVU_FORMAT_RGB24, + /* DDJVU_FORMAT_RGB24 + * DDJVU_FORMAT_RGBMASK32*/ + /* DDJVU_FORMAT_RGBMASK32 */ + 0, NULL); + +#if 0 + /* fixme: ThrowReaderException is a macro, which uses `exception' variable */ + if (format == NULL) + { + abort(); + /* ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); */ + } + +#endif + ddjvu_format_set_row_order(format, 1); + ddjvu_format_set_y_direction(format, 1); + + ret = ddjvu_page_render(page, + DDJVU_RENDER_COLOR, /* ddjvu_render_mode_t */ + &rect, + &rect, /* mmc: ?? */ + format, + stride, /* ?? */ + (char*)q); + (void) ret; + ddjvu_format_release(format); + + + if (type == DDJVU_PAGETYPE_BITONAL) { + /* */ +#if DEBUG + printf("%s: expanding BITONAL page/image\n", __FUNCTION__); +#endif + IndexPacket *indexes; + size_t bit, byte; + + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket * o = QueueAuthenticPixels(image,0,y,image->columns,1,&image->exception); + if (o == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + bit=0; + byte=0; + + /* fixme: the non-aligned, last =<7 bits ! that's ok!!!*/ + for (x= 0; x < (ssize_t) image->columns; x++) + { + if (bit == 0) byte= (size_t) q[(y * stride) + (x / 8)]; + + if (indexes != (IndexPacket *) NULL) + SetPixelIndex(indexes+x,(IndexPacket) (((byte & 0x01) != 0) ? 0x00 : 0x01)); + bit++; + if (bit == 8) + bit=0; + byte>>=1; + } + if (SyncAuthenticPixels(image,&image->exception) == MagickFalse) + break; + } + if (image->ping == MagickFalse) + SyncImage(image); + } else { +#if DEBUG + printf("%s: expanding PHOTO page/image\n", __FUNCTION__); +#endif + /* now transfer line-wise: */ + ssize_t i; +#if 0 + /* old: */ + char* r; +#else + PixelPacket *r; + unsigned char *s; +#endif + s=q; + for (i = 0;i< (ssize_t) image->rows; i++) + { +#if DEBUG + if (i % 1000 == 0) printf("%d\n",i); +#endif + r = QueueAuthenticPixels(image,0,i,image->columns,1,&image->exception); + if (r == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(r,ScaleCharToQuantum(*s++)); + SetPixelGreen(r,ScaleCharToQuantum(*s++)); + SetPixelBlue(r,ScaleCharToQuantum(*s++)); + r++; + } + + (void) SyncAuthenticPixels(image,&image->exception); + } + } + q=(unsigned char *) RelinquishMagickMemory(q); +} + + +#if defined(MAGICKCORE_DJVU_DELEGATE) + +#if 0 +static int +get_page_line(LoadContext *lc, int row, QuantumInfo* quantum_info) +{ + ddjvu_format_t + *format; + + int + ret; + + size_t + stride; + + unsigned char + *q; + + ddjvu_rect_t rect, pagerect; + rect.x = 0; + rect.y = row; + rect.w = lc->image->columns; /* /10 */ + rect.h = 1; /* /10 */ + + pagerect.x = 0; + pagerect.y = 0; + pagerect.w = lc->image->columns; + pagerect.h = lc->image->rows; + + + format = ddjvu_format_create( +#if RGB + DDJVU_FORMAT_RGB24 +#else + DDJVU_FORMAT_GREY8 +#endif + , + 0, NULL); + ddjvu_format_set_row_order(format, 1); + ddjvu_format_set_y_direction(format, 1); + + stride=1; +#if RGB + stride=3; +#endif + q = (unsigned char *) AcquireQuantumMemory(lc->image->columns,stride); + + ret = ddjvu_page_render(lc->page, + DDJVU_RENDER_COLOR, /* ddjvu_render_mode_t */ + &pagerect, + &rect, /* mmc: ?? */ + format, + pagerect.w * 3, /* ?? */ + (char*)q); + + ImportQuantumPixels(lc->image, + (CacheView *) NULL, + quantum_info, +#if RGB + RGBQuantum +#else + GrayQuantum +#endif + ,q,&lc->image->exception); + q=(unsigned char *) RelinquishMagickMemory(q); + ddjvu_format_release(format); + return ret; +} +#endif +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d O n e D J V U I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadOneDJVUImage() reads a Portable Network Graphics (DJVU) image file +% (minus the 8-byte signature) and returns it. It allocates the memory +% necessary for the new Image structure and returns a pointer to the new +% image. +% +% The format of the ReadOneDJVUImage method is: +% +% Image *ReadOneDJVUImage(MngInfo *mng_info, const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o mng_info: Specifies a pointer to a MngInfo structure. +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static Image *ReadOneDJVUImage(LoadContext* lc,const int pagenum, + const ImageInfo *image_info,ExceptionInfo *exception) +{ + ddjvu_page_type_t + type; + + ddjvu_pageinfo_t info; + ddjvu_message_t *message; + Image *image; + int logging; + int tag; + MagickBooleanType status; + + /* so, we know that the page is there! Get its dimension, and */ + + /* Read one DJVU image */ + image = lc->image; + + /* PixelPacket *q; */ + + logging=LogMagickEvent(CoderEvent,GetMagickModule(), " enter ReadOneDJVUImage()"); + (void) logging; + +#if DEBUG + printf("==== Loading the page %d\n", pagenum); +#endif + lc->page = ddjvu_page_create_by_pageno(lc->document, pagenum); /* 0? */ + + /* pump data untill the page is ready for rendering. */ + tag=(-1); + do { + while ((message = ddjvu_message_peek(lc->context))) + { + tag=process_message(message); + if (tag == 0) break; + ddjvu_message_pop(lc->context); + } + /* fixme: maybe exit? */ + /* if (lc->error) break; */ + + message = pump_data_until_message(lc,image); + if (message) + do { + tag=process_message(message); + if (tag == 0) break; + ddjvu_message_pop(lc->context); + } while ((message = ddjvu_message_peek(lc->context))); + if (tag == 0) break; + } while (!ddjvu_page_decoding_done(lc->page)); + + ddjvu_document_get_pageinfo(lc->document, pagenum, &info); + + image->x_resolution = (float) info.dpi; + image->y_resolution =(float) info.dpi; + if (image_info->density != (char *) NULL) + { + int + flags; + + GeometryInfo + geometry_info; + + /* + Set rendering resolution. + */ + flags=ParseGeometry(image_info->density,&geometry_info); + image->x_resolution=geometry_info.rho; + image->y_resolution=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->y_resolution=image->x_resolution; + info.width=(int) (info.width*image->x_resolution/info.dpi); + info.height=(int) (info.height*image->y_resolution/info.dpi); + info.dpi=(int) MagickMax(image->x_resolution,image->y_resolution); + } + type = ddjvu_page_get_type(lc->page); + + /* double -> float! */ + /* image->gamma = (float)ddjvu_page_get_gamma(lc->page); */ + + /* mmc: set image->depth */ + /* mmc: This from the type */ + + image->columns=(size_t) info.width; + image->rows=(size_t) info.height; + + /* mmc: bitonal should be palettized, and compressed! */ + if (type == DDJVU_PAGETYPE_BITONAL){ + image->colorspace = GRAYColorspace; + image->storage_class = PseudoClass; + image->depth = 8UL; /* i only support that? */ + image->colors= 2; + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + } else { + image->colorspace = RGBColorspace; + image->storage_class = DirectClass; + /* fixme: MAGICKCORE_QUANTUM_DEPTH ?*/ + image->depth = 8UL; /* i only support that? */ + + image->matte = MagickTrue; + /* is this useful? */ + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } +#if DEBUG + printf("now filling %.20g x %.20g\n",(double) image->columns,(double) + image->rows); +#endif + + +#if 1 /* per_line */ + + /* q = QueueAuthenticPixels(image,0,0,image->columns,image->rows); */ + get_page_image(lc, lc->page, 0, 0, info.width, info.height, image_info); +#else + int i; + for (i = 0;i< image->rows; i++) + { + printf("%d\n",i); + q = QueueAuthenticPixels(image,0,i,image->columns,1); + get_page_line(lc, i, quantum_info); + SyncAuthenticPixels(image); + } + +#endif /* per_line */ + + +#if DEBUG + printf("END: finished filling %.20g x %.20g\n",(double) image->columns, + (double) image->rows); +#endif + + if (!image->ping) + SyncImage(image); + /* indexes=GetAuthenticIndexQueue(image); */ + /* mmc: ??? Convert PNM pixels to runlength-encoded MIFF packets. */ + /* image->colors = */ + + /* how is the line padding / stride? */ + + if (lc->page) { + ddjvu_page_release(lc->page); + lc->page = NULL; + } + + /* image->page.y=mng_info->y_off[mng_info->object_id]; */ + if (tag == 0) + image=DestroyImage(image); + return image; + /* end of reading one DJVU page/image */ +} + +#if 0 +/* palette */ + if (AcquireImageColormap(image,2) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Monochrome colormap. mmc: this the default! + */ + image->colormap[0].red=QuantumRange; + image->colormap[0].green=QuantumRange; + image->colormap[0].blue=QuantumRange; + image->colormap[1].red=0; + image->colormap[1].green=0; + image->colormap[1].blue=0; +#endif + +static void djvu_close_lc(LoadContext* lc) +{ + if (lc->document) + ddjvu_document_release(lc->document); + if (lc->context) + ddjvu_context_release(lc->context); + if (lc->page) + ddjvu_page_release(lc->page); + RelinquishMagickMemory(lc); +} + +static Image *ReadDJVUImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + const char + *url; + + ddjvu_message_t + *message; + + Image + *image, + *images; + + int + logging, + use_cache; + + LoadContext + *lc; + + MagickBooleanType + status; + + ssize_t + i; + + /* + * Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + + + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", image_info->filename); + + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + + + logging = LogMagickEvent(CoderEvent,GetMagickModule(),"enter ReadDJVUImage()"); + (void) logging; + + image = AcquireImage(image_info); /* mmc: ?? */ + + + lc = (LoadContext *) NULL; + status = OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + ThrowReaderException(FileOpenError,"UnableToOpenFile"); + /* + Verify DJVU signature. + */ +#if 0 + count = ReadBlob(image,8,(unsigned char *) magic_number); + + /* IsDJVU(const unsigned char *magick,const size_t length) */ + if (memcmp(magic_number,"AT&TFORM",8) != 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); +#endif + + + /* + * Allocate a LoadContext structure. + */ + lc = (LoadContext *) AcquireMagickMemory(sizeof(*lc)); + if (lc == NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + + + /* + * Initialize members of the MngInfo structure. + */ + (void) memset(lc,0,sizeof(LoadContext)); + + lc->image = image; + lc->pages = 0; + lc->context = ddjvu_context_create("ImageMagick djvu loader"); /* g_program_name */ + + ddjvu_cache_set_size(lc->context, 1); /* right? */ + use_cache = 0; + /* document: here we don't have a filename, but, for the sake of generality, a FILE* ! */ + url="https://imagemagick.org/fake.djvu"; + lc->document = ddjvu_document_create(lc->context, url, use_cache); /* don't cache */ + ddjvu_document_set_user_data(lc->document, lc); + + + /* now we wait the message-request for data: */ + message = ddjvu_message_wait(lc->context); + + if (message->m_any.tag != DDJVU_NEWSTREAM) { + /* fixme: the djvu context, document! */ + + ddjvu_document_release(lc->document); + ddjvu_context_release(lc->context); + + RelinquishMagickMemory(lc); + + ThrowReaderException(ResourceLimitError,"Djvu initial message: unexpected type"); + return NULL; /* error! */ + }; + + lc->streamid = message->m_newstream.streamid; + ddjvu_message_pop(lc->context); + + message = pump_data_until_message(lc,image); + /* now process the messages: */ + + + if (message) do { + process_message(message); + ddjvu_message_pop(lc->context); + } while ((message = ddjvu_message_peek(lc->context))); + + /* fixme: i hope we have not read any messages pertinent(?) related to the page itself! */ + + while (lc->pages == 0) { + message = ddjvu_message_wait(lc->context); + process_message(message); + ddjvu_message_pop(lc->context); + } + + images=NewImageList(); + i=0; + if (image_info->number_scenes != 0) + i=image_info->scene; + for ( ; i < (ssize_t) lc->pages; i++) + { + image=ReadOneDJVUImage(lc,i,image_info,exception); + if (image == (Image *) NULL) + break; + image->scene=i; + AppendImageToList(&images,CloneImageList(image,exception)); + images->extent=GetBlobSize(image); + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + } + djvu_close_lc(lc); + if (images != (Image *) NULL) + (void) CloseBlob(images); + if (image != (Image *) NULL) + image=DestroyImageList(image); + +#if 0 + if ((image->page.width == 0) && (image->page.height == 0)) + { + image->page.width = image->columns+image->page.x; + image->page.height = image->rows+image->page.y; + } + if (image->columns == 0 || image->rows == 0) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "exit ReadDJVUImage() with error."); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadDJVUImage()"); +#endif + + + return(GetFirstImageInList(images)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r D J V U I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterDJVUImage() adds attributes for the DJVU image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterDJVUImage method is: +% +% size_t RegisterDJVUImage(void) +% +*/ +ModuleExport size_t RegisterDJVUImage(void) +{ + char + version[MaxTextExtent]; + + MagickInfo + *entry; + + static const char + *DJVUNote = + { + "See http://www.djvuzone.org/ for details about the DJVU format. The\n" + "DJVU 1.2 specification is available there and at\n" + "ftp://swrinde.nde.swri.edu/pub/djvu/documents/." + }; + + *version='\0'; +#if defined(DJVU_LIBDJVU_VER_STRING) + (void) ConcatenateMagickString(version,"libdjvu ",MaxTextExtent); + (void) ConcatenateMagickString(version,DJVU_LIBDJVU_VER_STRING,MaxTextExtent); +#endif + entry=SetMagickInfo("DJVU"); +#if defined(MAGICKCORE_DJVU_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadDJVUImage; +#endif + entry->raw=MagickTrue; + entry->magick=(IsImageFormatHandler *) IsDJVU; + entry->adjoin=MagickFalse; + entry->thread_support=NoThreadSupport; + entry->description=AcquireString("Deja vu"); + entry->magick_module=AcquireString("DJVU"); + if (*version != '\0') + entry->version=AcquireString(version); + entry->note=AcquireString(DJVUNote); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r D J V U I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterDJVUImage() removes format registrations made by the +% DJVU module from the list of supported formats. +% +% The format of the UnregisterDJVUImage method is: +% +% UnregisterDJVUImage(void) +% +*/ +ModuleExport void UnregisterDJVUImage(void) +{ + (void) UnregisterMagickInfo("DJVU"); +} diff --git a/ImageMagick-6.9.12-44/coders/dng.c b/ImageMagick-6.9.12-44/coders/dng.c new file mode 100644 index 0000000..f3dfaa3 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/dng.c @@ -0,0 +1,825 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD N N GGGG % +% D D NN N GS % +% D D N N N G GG % +% D D N NN G G % +% DDDD N N GGGG % +% % +% % +% Read the Digital Negative Image Format % +% % +% Software Design % +% Cristy % +% July 1999 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/constitute.h" +#include "magick/delegate.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/layer.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/opencl.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/transform.h" +#include "magick/utility.h" +#include "magick/xml-tree.h" +#if defined(MAGICKCORE_RAW_R_DELEGATE) +#include +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d D N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadDNGImage() reads an binary file in the Digital Negative format and +% returns it. It allocates the memory necessary for the new Image structure +% and returns a pointer to the new image. +% +% The format of the ReadDNGImage method is: +% +% Image *ReadDNGImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(MAGICKCORE_OPENCL_SUPPORT) +static void InitializeDcrawOpenCL(ExceptionInfo *exception) +{ + MagickCLEnv + clEnv; + + (void) SetEnvironmentVariable("DCR_CL_PLATFORM",NULL); + (void) SetEnvironmentVariable("DCR_CL_DEVICE",NULL); + (void) SetEnvironmentVariable("DCR_CL_DISABLED",NULL); + clEnv=GetDefaultOpenCLEnv(); + if (InitOpenCLEnv(clEnv,exception) != MagickFalse) + { + char + *name; + + MagickBooleanType + opencl_disabled; + + GetMagickOpenCLEnvParam(clEnv,MAGICK_OPENCL_ENV_PARAM_OPENCL_DISABLED, + sizeof(MagickBooleanType),&opencl_disabled,exception); + if (opencl_disabled != MagickFalse) + { + (void)SetEnvironmentVariable("DCR_CL_DISABLED","1"); + return; + } + GetMagickOpenCLEnvParam(clEnv,MAGICK_OPENCL_ENV_PARAM_PLATFORM_VENDOR, + sizeof(char *),&name,exception); + if (name != (char *) NULL) + { + (void) SetEnvironmentVariable("DCR_CL_PLATFORM",name); + name=RelinquishMagickMemory(name); + } + GetMagickOpenCLEnvParam(clEnv,MAGICK_OPENCL_ENV_PARAM_DEVICE_NAME, + sizeof(char *),&name,exception); + if (name != (char *) NULL) + { + (void) SetEnvironmentVariable("DCR_CL_DEVICE",name); + name=RelinquishMagickMemory(name); + } + } +} +#else +#if !defined(MAGICKCORE_RAW_R_DELEGATE) +static void InitializeDcrawOpenCL(ExceptionInfo *magick_unused(exception)) +{ + magick_unreferenced(exception); +#if defined(MAGICKCORE_WINDOWS_SUPPORT) + (void) SetEnvironmentVariable("DCR_CL_DISABLED","1"); +#endif +} +#endif +#endif + +#if defined(MAGICKCORE_RAW_R_DELEGATE) +static void SetDNGProperties(Image *image,const libraw_data_t *raw_info) +{ + char + property[MagickPathExtent], + timestamp[MagickPathExtent]; + + (void) SetImageProperty(image,"dng:make",raw_info->idata.make); + (void) SetImageProperty(image,"dng:camera.model.name",raw_info->idata.model); + (void) FormatMagickTime(raw_info->other.timestamp,MagickPathExtent,timestamp); + (void) SetImageProperty(image,"dng:create.date",timestamp); + (void) SetImageProperty(image,"dng:f.number",property); + (void) FormatLocaleString(property,MagickPathExtent,"%0.1f", + raw_info->other.iso_speed); +#if LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0,18) + (void) SetImageProperty(image,"dng:software",raw_info->idata.software); + if (*raw_info->shootinginfo.BodySerial != '\0') + (void) SetImageProperty(image,"dng:serial.number", + raw_info->shootinginfo.BodySerial); + (void) FormatLocaleString(property,MagickPathExtent,"1/%0.1f", + PerceptibleReciprocal(raw_info->other.shutter)); + (void) SetImageProperty(image,"dng:exposure.time",property); + (void) FormatLocaleString(property,MagickPathExtent,"%0.1f", + raw_info->other.aperture); + (void) SetImageProperty(image,"dng:iso.setting",property); + (void) FormatLocaleString(property,MagickPathExtent,"%0.1f", + raw_info->lens.EXIF_MaxAp); + (void) SetImageProperty(image,"dng:max.aperture.value",property); + (void) FormatLocaleString(property,MagickPathExtent,"%0.1f", + raw_info->other.focal_len); + (void) SetImageProperty(image,"dng:focal.length",property); + (void) FormatLocaleString(property,MagickPathExtent,"%f %f %f %f", + raw_info->color.cam_mul[0],raw_info->color.cam_mul[2], + raw_info->color.cam_mul[1],raw_info->color.cam_mul[3]); + (void) SetImageProperty(image,"dng:wb.rb.levels",property); + (void) FormatLocaleString(property,MagickPathExtent, + "%0.1f-%0.1fmm f/%0.1f-%0.1f",raw_info->lens.makernotes.MinFocal, + raw_info->lens.makernotes.MaxFocal,raw_info->lens.makernotes.MaxAp4MinFocal, + raw_info->lens.makernotes.MaxAp4MaxFocal); + (void) SetImageProperty(image,"dng:lens",property); + (void) FormatLocaleString(property,MagickPathExtent,"%0.2f", + raw_info->lens.makernotes.LensFStops); + (void) SetImageProperty(image,"dng:lens.f.stops",property); + (void) FormatLocaleString(property,MagickPathExtent,"%0.1f mm", + raw_info->lens.makernotes.MinFocal); + (void) SetImageProperty(image,"dng:min.focal.length",property); + (void) FormatLocaleString(property,MagickPathExtent,"%0.1f mm", + raw_info->lens.makernotes.MaxFocal); + (void) SetImageProperty(image,"dng:max.focal.length",property); + (void) SetImageProperty(image,"dng:max.aperture.at.min.focal",property); + (void) FormatLocaleString(property,MagickPathExtent,"%0.1f", + raw_info->lens.makernotes.MaxAp4MaxFocal); + (void) SetImageProperty(image,"dng:max.aperture.at.max.focal",property); + (void) FormatLocaleString(property,MagickPathExtent,"%d mm", + raw_info->lens.FocalLengthIn35mmFormat); + (void) SetImageProperty(image,"dng:focal.length.in.35mm.format",property); +#endif +} + +static void LibRawDataError(void *data,const char *magick_unused(file), + const int offset) +{ + magick_unreferenced(file); + /* Value below zero is an EOF and an exception will be raised instead */ + if (offset >= 0) + { + ExceptionInfo + *exception; + + exception=(ExceptionInfo *) data; + (void) ThrowMagickException(exception,GetMagickModule(), + CorruptImageWarning,"Data corrupted at","`%d'",offset); + } +} +#endif + +static Image *ReadDNGImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + (void) CloseBlob(image); +#if defined(MAGICKCORE_RAW_R_DELEGATE) + { + int + errcode; + + libraw_data_t + *raw_info; + + libraw_processed_image_t + *raw_image; + + ssize_t + y; + + StringInfo + *profile; + + unsigned short + *p; + + errcode=0; + raw_info=libraw_init(LIBRAW_OPIONS_NO_MEMERR_CALLBACK | + LIBRAW_OPIONS_NO_DATAERR_CALLBACK); + if (raw_info == (libraw_data_t *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + libraw_strerror(errcode),"`%s'",image->filename); + libraw_close(raw_info); + return(DestroyImageList(image)); + } + libraw_set_dataerror_handler(raw_info,LibRawDataError,exception); + raw_info->params.use_camera_wb=IsStringTrue(GetImageOption(image_info, + "dng:use-camera-wb")); +#if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_MSC_VER) && (_MSC_VER > 1310) + { + wchar_t + fileName[MagickPathExtent]; + + MultiByteToWideChar(CP_UTF8,0,image->filename,-1,fileName, + MagickPathExtent); + errcode=libraw_open_wfile(raw_info,fileName); + } +#else + errcode=libraw_open_file(raw_info,image->filename); +#endif + if (errcode != LIBRAW_SUCCESS) + { + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + libraw_strerror(errcode),"`%s'",image->filename); + libraw_close(raw_info); + return(DestroyImageList(image)); + } + image->columns=raw_info->sizes.width; + image->rows=raw_info->sizes.height; + image->page.width=raw_info->sizes.raw_width; + image->page.height=raw_info->sizes.raw_height; + image->page.x=raw_info->sizes.left_margin; + image->page.y=raw_info->sizes.top_margin; + if (image_info->ping != MagickFalse) + { + libraw_close(raw_info); + return(image); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + libraw_close(raw_info); + return(image); + } + errcode=libraw_unpack(raw_info); + if (errcode != LIBRAW_SUCCESS) + { + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + libraw_strerror(errcode),"`%s'",image->filename); + libraw_close(raw_info); + return(DestroyImageList(image)); + } + raw_info->params.output_bps=16; + errcode=libraw_dcraw_process(raw_info); + if (errcode != LIBRAW_SUCCESS) + { + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + libraw_strerror(errcode),"`%s'",image->filename); + libraw_close(raw_info); + return(DestroyImageList(image)); + } + raw_image=libraw_dcraw_make_mem_image(raw_info,&errcode); + if ((errcode != LIBRAW_SUCCESS) || + (raw_image == (libraw_processed_image_t *) NULL) || + (raw_image->type != LIBRAW_IMAGE_BITMAP) || (raw_image->bits != 16) || + (raw_image->colors < 3) || (raw_image->colors > 4)) + { + if (raw_image != (libraw_processed_image_t *) NULL) + libraw_dcraw_clear_mem(raw_image); + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + libraw_strerror(errcode),"`%s'",image->filename); + libraw_close(raw_info); + return(DestroyImageList(image)); + } + image->columns=raw_image->width; + image->rows=raw_image->height; + image->depth=raw_image->bits; + image->page.width=raw_info->sizes.width; + image->page.height=raw_info->sizes.height; + image->page.x=raw_info->sizes.left_margin; + image->page.y=raw_info->sizes.top_margin; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + libraw_dcraw_clear_mem(raw_image); + libraw_close(raw_info); + return(DestroyImageList(image)); + } + p=(unsigned short *) raw_image->data; + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *q; + + ssize_t + x; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleShortToQuantum(*p++)); + SetPixelGreen(q,ScaleShortToQuantum(*p++)); + SetPixelBlue(q,ScaleShortToQuantum(*p++)); + if (raw_image->colors > 3) + SetPixelAlpha(q,ScaleShortToQuantum(*p++)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + libraw_dcraw_clear_mem(raw_image); + /* + Set DNG image metadata. + */ + if (raw_info->color.profile != NULL) + { + profile=BlobToStringInfo(raw_info->color.profile, + raw_info->color.profile_length); + if (profile != (StringInfo *) NULL) + { + SetImageProfile(image,"ICC",profile); + profile=DestroyStringInfo(profile); + } + } +#if LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0,18) + if (raw_info->idata.xmpdata != NULL) + { + profile=BlobToStringInfo(raw_info->idata.xmpdata, + raw_info->idata.xmplen); + if (profile != (StringInfo *) NULL) + { + SetImageProfile(image,"XMP",profile); + profile=DestroyStringInfo(profile); + } + } +#endif + SetDNGProperties(image,raw_info); + libraw_close(raw_info); + return(image); + } +#else + { + ExceptionInfo + *sans_exception; + + ImageInfo + *read_info; + + /* + Convert DNG to PPM with delegate. + */ + (void) DestroyImageList(image); + InitializeDcrawOpenCL(exception); + image=AcquireImage(image_info); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) InvokeDelegate(read_info,image,"dng:decode",(char *) NULL,exception); + image=DestroyImage(image); + (void) FormatLocaleString(read_info->filename,MaxTextExtent,"%s.png", + read_info->unique); + sans_exception=AcquireExceptionInfo(); + image=ReadImage(read_info,sans_exception); + sans_exception=DestroyExceptionInfo(sans_exception); + if (image == (Image *) NULL) + { + (void) FormatLocaleString(read_info->filename,MaxTextExtent,"%s.ppm", + read_info->unique); + image=ReadImage(read_info,exception); + } + (void) RelinquishUniqueFileResource(read_info->filename); + if (image != (Image *) NULL) + { + char + filename[MaxTextExtent], + *xml; + + ExceptionInfo + *sans; + + (void) CopyMagickString(image->magick,read_info->magick,MaxTextExtent); + (void) FormatLocaleString(filename,MaxTextExtent,"%s.ufraw", + read_info->unique); + sans=AcquireExceptionInfo(); + xml=FileToString(filename,MaxTextExtent,sans); + (void) RelinquishUniqueFileResource(filename); + if (xml != (char *) NULL) + { + XMLTreeInfo + *ufraw; + + /* + Inject. + */ + ufraw=NewXMLTree(xml,sans); + if (ufraw != (XMLTreeInfo *) NULL) + { + char + *content, + property[MaxTextExtent]; + + const char + *tag; + + XMLTreeInfo + *next; + + if (image->properties == (void *) NULL) + ((Image *) image)->properties=NewSplayTree( + CompareSplayTreeString,RelinquishMagickMemory, + RelinquishMagickMemory); + next=GetXMLTreeChild(ufraw,(const char *) NULL); + while (next != (XMLTreeInfo *) NULL) + { + tag=GetXMLTreeTag(next); + if (tag == (char *) NULL) + tag="unknown"; + (void) FormatLocaleString(property,MaxTextExtent,"dng:%s", + tag); + content=ConstantString(GetXMLTreeContent(next)); + StripString(content); + if ((LocaleCompare(tag,"log") != 0) && + (LocaleCompare(tag,"InputFilename") != 0) && + (LocaleCompare(tag,"OutputFilename") != 0) && + (LocaleCompare(tag,"OutputType") != 0) && + (strlen(content) != 0)) + (void) AddValueToSplayTree((SplayTreeInfo *) + ((Image *) image)->properties,ConstantString(property), + content); + next=GetXMLTreeSibling(next); + } + ufraw=DestroyXMLTree(ufraw); + } + xml=DestroyString(xml); + } + sans=DestroyExceptionInfo(sans); + } + read_info=DestroyImageInfo(read_info); + return(image); + } +#endif +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r D N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterDNGImage() adds attributes for the DNG image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterDNGImage method is: +% +% size_t RegisterDNGImage(void) +% +*/ +ModuleExport size_t RegisterDNGImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("3FR"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Hasselblad CFV/H3D39II"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("ARW"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Sony Alpha Raw Image Format"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("DNG"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Digital Negative"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("CR2"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Canon Digital Camera Raw Image Format"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("CR3"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Canon Digital Camera Raw Image Format"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("CRW"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Canon Digital Camera Raw Image Format"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("DCR"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Kodak Digital Camera Raw Image File"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("ERF"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Epson Raw Format"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("IIQ"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Phase One Raw Image Format"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("KDC"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Kodak Digital Camera Raw Image Format"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("K25"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Kodak Digital Camera Raw Image Format"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("MEF"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Mamiya Raw Image File"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("MRW"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Sony (Minolta) Raw Image File"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("NEF"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Nikon Digital SLR Camera Raw Image File"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("NRW"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Nikon Digital SLR Camera Raw Image File"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("ORF"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Olympus Digital Camera Raw Image File"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PEF"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Pentax Electronic File"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("RAF"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Fuji CCD-RAW Graphic File"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("RAW"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Raw"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("RMF"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Raw Media Format"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("RW2"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Panasonic Lumix Raw Image"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("SRF"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Sony Raw Format"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("SR2"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Sony Raw Format 2"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("X3F"); + entry->decoder=(DecodeImageHandler *) ReadDNGImage; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("Sigma Camera RAW Picture File"); + entry->magick_module=ConstantString("DNG"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r D N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterDNGImage() removes format registrations made by the +% BIM module from the list of supported formats. +% +% The format of the UnregisterBIMImage method is: +% +% UnregisterDNGImage(void) +% +*/ +ModuleExport void UnregisterDNGImage(void) +{ + (void) UnregisterMagickInfo("X3F"); + (void) UnregisterMagickInfo("SR2"); + (void) UnregisterMagickInfo("SRF"); + (void) UnregisterMagickInfo("RW2"); + (void) UnregisterMagickInfo("RMF"); + (void) UnregisterMagickInfo("RAW"); + (void) UnregisterMagickInfo("RAF"); + (void) UnregisterMagickInfo("PEF"); + (void) UnregisterMagickInfo("ORF"); + (void) UnregisterMagickInfo("NRW"); + (void) UnregisterMagickInfo("NEF"); + (void) UnregisterMagickInfo("MRW"); + (void) UnregisterMagickInfo("MEF"); + (void) UnregisterMagickInfo("K25"); + (void) UnregisterMagickInfo("KDC"); + (void) UnregisterMagickInfo("IIQ"); + (void) UnregisterMagickInfo("ERF"); + (void) UnregisterMagickInfo("DCR"); + (void) UnregisterMagickInfo("CRW"); + (void) UnregisterMagickInfo("CR3"); + (void) UnregisterMagickInfo("CR2"); + (void) UnregisterMagickInfo("DNG"); + (void) UnregisterMagickInfo("ARW"); + (void) UnregisterMagickInfo("3FR"); +} diff --git a/ImageMagick-6.9.12-44/coders/dot.c b/ImageMagick-6.9.12-44/coders/dot.c new file mode 100644 index 0000000..84503a6 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/dot.c @@ -0,0 +1,253 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD OOO TTTTT % +% D D O O T % +% D D O O T % +% D D O O T % +% DDDD OOO T % +% % +% % +% Read/Write Graphviz DOT Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/client.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" +#include "magick/xwindow-private.h" +#if defined(MAGICKCORE_GVC_DELEGATE) +#undef HAVE_CONFIG_H +#include +static GVC_t + *graphic_context = (GVC_t *) NULL; +#endif + +#if defined(MAGICKCORE_GVC_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d D O T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadDOTImage() reads a Graphviz image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the ReadDOTImage method is: +% +% Image *ReadDOTImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadDOTImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + command[MaxTextExtent]; + + const char + *option; + + graph_t + *graph; + + Image + *image; + + ImageInfo + *read_info; + + MagickBooleanType + status; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + assert(graphic_context != (GVC_t *) NULL); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + return(DestroyImageList(image)); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) CopyMagickString(read_info->magick,"SVG",MaxTextExtent); + (void) AcquireUniqueFilename(read_info->filename); + (void) FormatLocaleString(command,MaxTextExtent,"-Tsvg -o%s %s", + read_info->filename,image_info->filename); +#if !defined(WITH_CGRAPH) + graph=agread(GetBlobFileHandle(image)); +#else + graph=agread(GetBlobFileHandle(image),(Agdisc_t *) NULL); +#endif + if (graph == (graph_t *) NULL) + { + (void) RelinquishUniqueFileResource(read_info->filename); + read_info=DestroyImageInfo(read_info); + return(DestroyImageList(image)); + } + option=GetImageOption(image_info,"dot:layout-engine"); + if (option == (const char *) NULL) + gvLayout(graphic_context,graph,(char *) "dot"); + else + gvLayout(graphic_context,graph,(char *) option); + gvRenderFilename(graphic_context,graph,(char *) "svg",read_info->filename); + gvFreeLayout(graphic_context,graph); + agclose(graph); + image=DestroyImageList(image); + /* + Read SVG graph. + */ + (void) CopyMagickString(read_info->magick,"SVG",MaxTextExtent); + image=ReadImage(read_info,exception); + (void) RelinquishUniqueFileResource(read_info->filename); + read_info=DestroyImageInfo(read_info); + if (image == (Image *) NULL) + return((Image *) NULL); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r D O T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterDOTImage() adds attributes for the Display Postscript image +% format to the list of supported formats. The attributes include the image +% format tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterDOTImage method is: +% +% size_t RegisterDOTImage(void) +% +*/ +ModuleExport size_t RegisterDOTImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("DOT"); +#if defined(MAGICKCORE_GVC_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadDOTImage; +#endif + entry->blob_support=MagickFalse; + entry->description=ConstantString("Graphviz"); + entry->magick_module=ConstantString("DOT"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("GV"); +#if defined(MAGICKCORE_GVC_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadDOTImage; +#endif + entry->blob_support=MagickFalse; + entry->description=ConstantString("Graphviz"); + entry->magick_module=ConstantString("DOT"); + (void) RegisterMagickInfo(entry); +#if defined(MAGICKCORE_GVC_DELEGATE) + graphic_context=gvContext(); +#endif + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r D O T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterDOTImage() removes format registrations made by the +% DOT module from the list of supported formats. +% +% The format of the UnregisterDOTImage method is: +% +% UnregisterDOTImage(void) +% +*/ +ModuleExport void UnregisterDOTImage(void) +{ + (void) UnregisterMagickInfo("GV"); + (void) UnregisterMagickInfo("DOT"); +#if defined(MAGICKCORE_GVC_DELEGATE) + if (graphic_context != (GVC_t *) NULL) + { + gvFreeContext(graphic_context); + graphic_context=(GVC_t *) NULL; + } +#endif +} diff --git a/ImageMagick-6.9.12-44/coders/dps.c b/ImageMagick-6.9.12-44/coders/dps.c new file mode 100644 index 0000000..79a8fb9 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/dps.c @@ -0,0 +1,597 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD PPPP SSSSS % +% D D P P SS % +% D D PPPP SSS % +% D D P SS % +% DDDD P SSSSS % +% % +% % +% Read Postscript Using the Display Postscript System. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/client.h" +#include "magick/colormap.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" +#include "magick/xwindow-private.h" +#if defined(MAGICKCORE_DPS_DELEGATE) +#include +#include +#endif + +#if defined(MAGICKCORE_DPS_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d D P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadDPSImage() reads a Adobe Postscript image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadDPSImage method is: +% +% Image *ReadDPSImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadDPSImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + const char + *client_name; + + Display + *display; + + float + pixels_per_point; + + Image + *image; + + int + sans, + status; + + Pixmap + pixmap; + + IndexPacket + *indexes; + + ssize_t + i; + + PixelPacket + *q; + + size_t + pixel; + + Screen + *screen; + + ssize_t + x, + y; + + XColor + *colors; + + XImage + *dps_image; + + XRectangle + page, + bits_per_pixel; + + XResourceInfo + resource_info; + + XrmDatabase + resource_database; + + XStandardColormap + *map_info; + + XVisualInfo + *visual_info; + + /* + Open X server connection. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + display=XOpenDisplay(image_info->server_name); + if (display == (Display *) NULL) + return((Image *) NULL); + /* + Set our forgiving exception handler. + */ + (void) XSetErrorHandler(XError); + /* + Open image file. + */ + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Get user defaults from X resource database. + */ + client_name=GetClientName(); + resource_database=XGetResourceDatabase(display,client_name); + XGetResourceInfo(image_info,resource_database,client_name,&resource_info); + /* + Allocate standard colormap. + */ + map_info=XAllocStandardColormap(); + visual_info=(XVisualInfo *) NULL; + if (map_info == (XStandardColormap *) NULL) + ThrowReaderException(ResourceLimitError,"UnableToCreateStandardColormap") + else + { + /* + Initialize visual info. + */ + (void) CloneString(&resource_info.visual_type,"default"); + visual_info=XBestVisualInfo(display,map_info,&resource_info); + map_info->colormap=(Colormap) NULL; + } + if ((map_info == (XStandardColormap *) NULL) || + (visual_info == (XVisualInfo *) NULL)) + { + image=DestroyImage(image); + XFreeResources(display,visual_info,map_info,(XPixelInfo *) NULL, + (XFontStruct *) NULL,&resource_info,(XWindowInfo *) NULL); + return((Image *) NULL); + } + /* + Create a pixmap the appropriate size for the image. + */ + screen=ScreenOfDisplay(display,visual_info->screen); + pixels_per_point=XDPSPixelsPerPoint(screen); + if ((image->x_resolution != 0.0) && (image->y_resolution != 0.0)) + pixels_per_point=MagickMin(image->x_resolution,image->y_resolution)/ + DefaultResolution; + status=XDPSCreatePixmapForEPSF((DPSContext) NULL,screen, + GetBlobFileHandle(image),visual_info->depth,pixels_per_point,&pixmap, + &bits_per_pixel,&page); + if ((status == dps_status_failure) || (status == dps_status_no_extension)) + { + image=DestroyImage(image); + XFreeResources(display,visual_info,map_info,(XPixelInfo *) NULL, + (XFontStruct *) NULL,&resource_info,(XWindowInfo *) NULL); + return((Image *) NULL); + } + /* + Rasterize the file into the pixmap. + */ + status=XDPSImageFileIntoDrawable((DPSContext) NULL,screen,pixmap, + GetBlobFileHandle(image),(int) bits_per_pixel.height,visual_info->depth, + &page,-page.x,-page.y,pixels_per_point,MagickTrue,MagickFalse,MagickTrue, + &sans); + if (status != dps_status_success) + { + image=DestroyImage(image); + XFreeResources(display,visual_info,map_info,(XPixelInfo *) NULL, + (XFontStruct *) NULL,&resource_info,(XWindowInfo *) NULL); + return((Image *) NULL); + } + /* + Initialize DPS X image. + */ + dps_image=XGetImage(display,pixmap,0,0,bits_per_pixel.width, + bits_per_pixel.height,AllPlanes,ZPixmap); + (void) XFreePixmap(display,pixmap); + if (dps_image == (XImage *) NULL) + { + image=DestroyImage(image); + XFreeResources(display,visual_info,map_info,(XPixelInfo *) NULL, + (XFontStruct *) NULL,&resource_info,(XWindowInfo *) NULL); + return((Image *) NULL); + } + /* + Get the colormap colors. + */ + colors=(XColor *) AcquireQuantumMemory(visual_info->colormap_size, + sizeof(*colors)); + if (colors == (XColor *) NULL) + { + image=DestroyImage(image); + XDestroyImage(dps_image); + XFreeResources(display,visual_info,map_info,(XPixelInfo *) NULL, + (XFontStruct *) NULL,&resource_info,(XWindowInfo *) NULL); + return((Image *) NULL); + } + if ((visual_info->klass != DirectColor) && (visual_info->klass != TrueColor)) + for (i=0; i < visual_info->colormap_size; i++) + { + colors[i].pixel=(size_t) i; + colors[i].pad=0; + } + else + { + size_t + blue, + blue_bit, + green, + green_bit, + red, + red_bit; + + /* + DirectColor or TrueColor visual. + */ + red=0; + green=0; + blue=0; + red_bit=visual_info->red_mask & (~(visual_info->red_mask)+1); + green_bit=visual_info->green_mask & (~(visual_info->green_mask)+1); + blue_bit=visual_info->blue_mask & (~(visual_info->blue_mask)+1); + for (i=0; i < visual_info->colormap_size; i++) + { + colors[i].pixel=red | green | blue; + colors[i].pad=0; + red+=red_bit; + if (red > visual_info->red_mask) + red=0; + green+=green_bit; + if (green > visual_info->green_mask) + green=0; + blue+=blue_bit; + if (blue > visual_info->blue_mask) + blue=0; + } + } + (void) XQueryColors(display,XDefaultColormap(display,visual_info->screen), + colors,visual_info->colormap_size); + /* + Convert X image to MIFF format. + */ + if ((visual_info->klass != TrueColor) && (visual_info->klass != DirectColor)) + image->storage_class=PseudoClass; + image->columns=(size_t) dps_image->width; + image->rows=(size_t) dps_image->height; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + colors=(XColor *) RelinquishMagickMemory(colors); + XDestroyImage(dps_image); + XFreeResources(display,visual_info,map_info,(XPixelInfo *) NULL, + (XFontStruct *) NULL,&resource_info,(XWindowInfo *) NULL); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + colors=(XColor *) RelinquishMagickMemory(colors); + XDestroyImage(dps_image); + XFreeResources(display,visual_info,map_info,(XPixelInfo *) NULL, + (XFontStruct *) NULL,&resource_info,(XWindowInfo *) NULL); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + switch (image->storage_class) + { + case DirectClass: + default: + { + size_t + color, + index; + + size_t + blue_mask, + blue_shift, + green_mask, + green_shift, + red_mask, + red_shift; + + /* + Determine shift and mask for red, green, and blue. + */ + red_mask=visual_info->red_mask; + red_shift=0; + while ((red_mask != 0) && ((red_mask & 0x01) == 0)) + { + red_mask>>=1; + red_shift++; + } + green_mask=visual_info->green_mask; + green_shift=0; + while ((green_mask != 0) && ((green_mask & 0x01) == 0)) + { + green_mask>>=1; + green_shift++; + } + blue_mask=visual_info->blue_mask; + blue_shift=0; + while ((blue_mask != 0) && ((blue_mask & 0x01) == 0)) + { + blue_mask>>=1; + blue_shift++; + } + /* + Convert X image to DirectClass packets. + */ + if ((visual_info->colormap_size > 0) && + (visual_info->klass == DirectColor)) + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=XGetPixel(dps_image,x,y); + index=(pixel >> red_shift) & red_mask; + SetPixelRed(q,ScaleShortToQuantum(colors[index].red)); + index=(pixel >> green_shift) & green_mask; + SetPixelGreen(q,ScaleShortToQuantum(colors[index].green)); + index=(pixel >> blue_shift) & blue_mask; + SetPixelBlue(q,ScaleShortToQuantum(colors[index].blue)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse) + break; + } + else + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=XGetPixel(dps_image,x,y); + color=(pixel >> red_shift) & red_mask; + color=(color*65535L)/red_mask; + SetPixelRed(q,ScaleShortToQuantum((unsigned short) color)); + color=(pixel >> green_shift) & green_mask; + color=(color*65535L)/green_mask; + SetPixelGreen(q,ScaleShortToQuantum((unsigned short) + color)); + color=(pixel >> blue_shift) & blue_mask; + color=(color*65535L)/blue_mask; + SetPixelBlue(q,ScaleShortToQuantum((unsigned short) + color)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse) + break; + } + break; + } + case PseudoClass: + { + /* + Create colormap. + */ + if (AcquireImageColormap(image,(size_t) visual_info->colormap_size) == MagickFalse) + { + image=DestroyImage(image); + colors=(XColor *) RelinquishMagickMemory(colors); + XDestroyImage(dps_image); + XFreeResources(display,visual_info,map_info,(XPixelInfo *) NULL, + (XFontStruct *) NULL,&resource_info,(XWindowInfo *) NULL); + return((Image *) NULL); + } + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[colors[i].pixel].red=ScaleShortToQuantum(colors[i].red); + image->colormap[colors[i].pixel].green= + ScaleShortToQuantum(colors[i].green); + image->colormap[colors[i].pixel].blue= + ScaleShortToQuantum(colors[i].blue); + } + /* + Convert X image to PseudoClass packets. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,(unsigned short) + XGetPixel(dps_image,x,y)); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse) + break; + } + break; + } + } + colors=(XColor *) RelinquishMagickMemory(colors); + XDestroyImage(dps_image); + if (image->storage_class == PseudoClass) + (void) SyncImage(image); + /* + Rasterize matte image. + */ + status=XDPSCreatePixmapForEPSF((DPSContext) NULL,screen, + GetBlobFileHandle(image),1,pixels_per_point,&pixmap,&bits_per_pixel,&page); + if ((status != dps_status_failure) && (status != dps_status_no_extension)) + { + status=XDPSImageFileIntoDrawable((DPSContext) NULL,screen,pixmap, + GetBlobFileHandle(image),(int) bits_per_pixel.height,1,&page,-page.x, + -page.y,pixels_per_point,MagickTrue,MagickTrue,MagickTrue,&sans); + if (status == dps_status_success) + { + XImage + *matte_image; + + /* + Initialize image matte. + */ + matte_image=XGetImage(display,pixmap,0,0,bits_per_pixel.width, + bits_per_pixel.height,AllPlanes,ZPixmap); + (void) XFreePixmap(display,pixmap); + if (matte_image != (XImage *) NULL) + { + image->storage_class=DirectClass; + image->matte=MagickTrue; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,OpaqueOpacity); + if (XGetPixel(matte_image,x,y) == 0) + SetPixelOpacity(q,TransparentOpacity); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + XDestroyImage(matte_image); + } + } + } + /* + Relinquish resources. + */ + XFreeResources(display,visual_info,map_info,(XPixelInfo *) NULL, + (XFontStruct *) NULL,&resource_info,(XWindowInfo *) NULL); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r D P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterDPSImage() adds attributes for the Display Postscript image +% format to the list of supported formats. The attributes include the image +% format tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterDPSImage method is: +% +% size_t RegisterDPSImage(void) +% +*/ +ModuleExport size_t RegisterDPSImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("DPS"); +#if defined(MAGICKCORE_DPS_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadDPSImage; +#endif + entry->blob_support=MagickFalse; + entry->description=ConstantString("Display Postscript Interpreter"); + entry->magick_module=ConstantString("DPS"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r D P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterDPSImage() removes format registrations made by the +% DPS module from the list of supported formats. +% +% The format of the UnregisterDPSImage method is: +% +% UnregisterDPSImage(void) +% +*/ +ModuleExport void UnregisterDPSImage(void) +{ + (void) UnregisterMagickInfo("DPS"); +} diff --git a/ImageMagick-6.9.12-44/coders/dpx.c b/ImageMagick-6.9.12-44/coders/dpx.c new file mode 100644 index 0000000..46b2ca0 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/dpx.c @@ -0,0 +1,2087 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD PPPP X X % +% D D P P X X % +% D D PPPP XXX % +% D D P X X % +% DDDD P X X % +% % +% % +% Read/Write SMTPE DPX Image Format % +% % +% Software Design % +% Cristy % +% March 2001 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/timer-private.h" + +/* + Define declaration. +*/ +#define MaxNumberImageElements 8 + +/* + Typedef declaration. +*/ +typedef enum +{ + UserDefinedColorimetric = 0, + PrintingDensityColorimetric = 1, + LinearColorimetric = 2, + LogarithmicColorimetric = 3, + UnspecifiedVideoColorimetric = 4, + SMTPE_274MColorimetric = 5, + ITU_R709Colorimetric = 6, + ITU_R601_625LColorimetric = 7, + ITU_R601_525LColorimetric = 8, + NTSCCompositeVideoColorimetric = 9, + PALCompositeVideoColorimetric = 10, + ZDepthLinearColorimetric = 11, + DepthHomogeneousColorimetric = 12 +} DPXColorimetric; + +typedef enum +{ + UndefinedComponentType = 0, + RedComponentType = 1, + GreenComponentType = 2, + BlueComponentType = 3, + AlphaComponentType = 4, + LumaComponentType = 6, + ColorDifferenceCbCrComponentType = 7, + DepthComponentType = 8, + CompositeVideoComponentType = 9, + RGBComponentType = 50, + RGBAComponentType = 51, + ABGRComponentType = 52, + CbYCrY422ComponentType = 100, + CbYACrYA4224ComponentType = 101, + CbYCr444ComponentType = 102, + CbYCrA4444ComponentType = 103, + UserDef2ElementComponentType = 150, + UserDef3ElementComponentType = 151, + UserDef4ElementComponentType = 152, + UserDef5ElementComponentType = 153, + UserDef6ElementComponentType = 154, + UserDef7ElementComponentType = 155, + UserDef8ElementComponentType = 156 +} DPXComponentType; + +typedef enum +{ + TransferCharacteristicUserDefined = 0, + TransferCharacteristicPrintingDensity = 1, + TransferCharacteristicLinear = 2, + TransferCharacteristicLogarithmic = 3, + TransferCharacteristicUnspecifiedVideo = 4, + TransferCharacteristicSMTPE274M = 5, /* 1920x1080 TV */ + TransferCharacteristicITU_R709 = 6, /* ITU R709 */ + TransferCharacteristicITU_R601_625L = 7, /* 625 Line */ + TransferCharacteristicITU_R601_525L = 8, /* 525 Line */ + TransferCharacteristicNTSCCompositeVideo = 9, + TransferCharacteristicPALCompositeVideo = 10, + TransferCharacteristicZDepthLinear = 11, + TransferCharacteristicZDepthHomogeneous = 12 +} DPXTransferCharacteristic; + +typedef struct _DPXFileInfo +{ + unsigned int + magic, + image_offset; + + char + version[8]; + + unsigned int + file_size, + ditto_key, + generic_size, + industry_size, + user_size; + + char + filename[100], + timestamp[24], + creator[100], + project[200], + copyright[200]; + + unsigned int + encrypt_key; + + char + reserve[104]; +} DPXFileInfo; + +typedef struct _DPXFilmInfo +{ + char + id[2], + type[2], + offset[2], + prefix[6], + count[4], + format[32]; + + unsigned int + frame_position, + sequence_extent, + held_count; + + float + frame_rate, + shutter_angle; + + char + frame_id[32], + slate[100], + reserve[56]; +} DPXFilmInfo; + +typedef struct _DPXImageElement +{ + unsigned int + data_sign, + low_data; + + float + low_quantity; + + unsigned int + high_data; + + float + high_quantity; + + unsigned char + descriptor, + transfer_characteristic, + colorimetric, + bit_size; + + unsigned short + packing, + encoding; + + unsigned int + data_offset, + end_of_line_padding, + end_of_image_padding; + + unsigned char + description[32]; +} DPXImageElement; + +typedef struct _DPXImageInfo +{ + unsigned short + orientation, + number_elements; + + unsigned int + pixels_per_line, + lines_per_element; + + DPXImageElement + image_element[MaxNumberImageElements]; + + unsigned char + reserve[52]; +} DPXImageInfo; + +typedef struct _DPXOrientationInfo +{ + unsigned int + x_offset, + y_offset; + + float + x_center, + y_center; + + unsigned int + x_size, + y_size; + + char + filename[100], + timestamp[24], + device[32], + serial[32]; + + unsigned short + border[4]; + + unsigned int + aspect_ratio[2]; + + unsigned char + reserve[28]; +} DPXOrientationInfo; + +typedef struct _DPXTelevisionInfo +{ + unsigned int + time_code, + user_bits; + + unsigned char + interlace, + field_number, + video_signal, + padding; + + float + horizontal_sample_rate, + vertical_sample_rate, + frame_rate, + time_offset, + gamma, + black_level, + black_gain, + break_point, + white_level, + integration_times; + + char + reserve[76]; +} DPXTelevisionInfo; + +typedef struct _DPXUserInfo +{ + char + id[32]; +} DPXUserInfo; + +typedef struct DPXInfo +{ + DPXFileInfo + file; + + DPXImageInfo + image; + + DPXOrientationInfo + orientation; + + DPXFilmInfo + film; + + DPXTelevisionInfo + television; + + DPXUserInfo + user; +} DPXInfo; + +/* + Forward declaractions. +*/ +static MagickBooleanType + WriteDPXImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s D P X % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsDPX() returns MagickTrue if the image format type, identified by the +% magick string, is DPX. +% +% The format of the IsDPX method is: +% +% MagickBooleanType IsDPX(const unsigned char *magick,const size_t extent) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o extent: Specifies the extent of the magick string. +% +*/ +static MagickBooleanType IsDPX(const unsigned char *magick,const size_t extent) +{ + if (extent < 4) + return(MagickFalse); + if (memcmp(magick,"SDPX",4) == 0) + return(MagickTrue); + if (memcmp(magick,"XPDS",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d D P X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadDPXImage() reads an DPX X image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadDPXImage method is: +% +% Image *ReadDPXImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static size_t GetBytesPerRow(const size_t columns, + const size_t samples_per_pixel,const size_t bits_per_pixel, + const MagickBooleanType pad) +{ + size_t + bytes_per_row; + + switch (bits_per_pixel) + { + case 1: + { + bytes_per_row=4*(((size_t) samples_per_pixel*columns*bits_per_pixel+31)/ + 32); + break; + } + case 8: + default: + { + bytes_per_row=4*(((size_t) samples_per_pixel*columns*bits_per_pixel+31)/ + 32); + break; + } + case 10: + { + if (pad == MagickFalse) + { + bytes_per_row=4*(((size_t) samples_per_pixel*columns*bits_per_pixel+ + 31)/32); + break; + } + bytes_per_row=4*(((size_t) (32*((samples_per_pixel*columns+2)/3))+31)/32); + break; + } + case 12: + { + if (pad == MagickFalse) + { + bytes_per_row=4*(((size_t) samples_per_pixel*columns*bits_per_pixel+ + 31)/32); + break; + } + bytes_per_row=2*(((size_t) (16*samples_per_pixel*columns)+15)/16); + break; + } + case 16: + { + if (pad == MagickFalse) + { + bytes_per_row=2*(((size_t) samples_per_pixel*columns*bits_per_pixel+ + 15)/16); + break; + } + bytes_per_row=4*(((size_t) samples_per_pixel*columns*bits_per_pixel+31)/ + 32); + break; + } + case 32: + { + bytes_per_row=4*(((size_t) samples_per_pixel*columns*bits_per_pixel+31)/ + 32); + break; + } + case 64: + { + bytes_per_row=8*(((size_t) samples_per_pixel*columns*bits_per_pixel+63)/ + 64); + break; + } + } + return(bytes_per_row); +} + +static const char *GetImageTransferCharacteristic( + const DPXTransferCharacteristic characteristic) +{ + const char + *transfer; + + /* + Get the element transfer characteristic. + */ + switch(characteristic) + { + case TransferCharacteristicUserDefined: + { + transfer="UserDefined"; + break; + } + case TransferCharacteristicPrintingDensity: + { + transfer="PrintingDensity"; + break; + } + case TransferCharacteristicLinear: + { + transfer="Linear"; + break; + } + case TransferCharacteristicLogarithmic: + { + transfer="Logarithmic"; + break; + } + case TransferCharacteristicUnspecifiedVideo: + { + transfer="UnspecifiedVideo"; + break; + } + case TransferCharacteristicSMTPE274M: + { + transfer="SMTPE274M"; + break; + } + case TransferCharacteristicITU_R709: + { + transfer="ITU-R709"; + break; + } + case TransferCharacteristicITU_R601_625L: + { + transfer="ITU-R601-625L"; + break; + } + case TransferCharacteristicITU_R601_525L: + { + transfer="ITU-R601-525L"; + break; + } + case TransferCharacteristicNTSCCompositeVideo: + { + transfer="NTSCCompositeVideo"; + break; + } + case TransferCharacteristicPALCompositeVideo: + { + transfer="PALCompositeVideo"; + break; + } + case TransferCharacteristicZDepthLinear: + { + transfer="ZDepthLinear"; + break; + } + case TransferCharacteristicZDepthHomogeneous: + { + transfer="ZDepthHomogeneous"; + break; + } + default: + transfer="Reserved"; + } + return(transfer); +} + +static inline MagickBooleanType IsFloatDefined(const float value) +{ + union + { + unsigned int + unsigned_value; + + float + float_value; + } quantum; + + quantum.unsigned_value=(~0U); + quantum.float_value=value; + if (quantum.unsigned_value == ~0U) + return(MagickFalse); + return(MagickTrue); +} + +static void SetPrimaryChromaticity(const DPXColorimetric colorimetric, + ChromaticityInfo *chromaticity_info) +{ + switch(colorimetric) + { + case SMTPE_274MColorimetric: + case ITU_R709Colorimetric: + { + chromaticity_info->red_primary.x=0.640; + chromaticity_info->red_primary.y=0.330; + chromaticity_info->red_primary.z=0.030; + chromaticity_info->green_primary.x=0.300; + chromaticity_info->green_primary.y=0.600; + chromaticity_info->green_primary.z=0.100; + chromaticity_info->blue_primary.x=0.150; + chromaticity_info->blue_primary.y=0.060; + chromaticity_info->blue_primary.z=0.790; + chromaticity_info->white_point.x=0.3127; + chromaticity_info->white_point.y=0.3290; + chromaticity_info->white_point.z=0.3582; + break; + } + case NTSCCompositeVideoColorimetric: + { + chromaticity_info->red_primary.x=0.67; + chromaticity_info->red_primary.y=0.33; + chromaticity_info->red_primary.z=0.00; + chromaticity_info->green_primary.x=0.21; + chromaticity_info->green_primary.y=0.71; + chromaticity_info->green_primary.z=0.08; + chromaticity_info->blue_primary.x=0.14; + chromaticity_info->blue_primary.y=0.08; + chromaticity_info->blue_primary.z=0.78; + chromaticity_info->white_point.x=0.310; + chromaticity_info->white_point.y=0.316; + chromaticity_info->white_point.z=0.374; + break; + } + case PALCompositeVideoColorimetric: + { + chromaticity_info->red_primary.x=0.640; + chromaticity_info->red_primary.y=0.330; + chromaticity_info->red_primary.z=0.030; + chromaticity_info->green_primary.x=0.290; + chromaticity_info->green_primary.y=0.600; + chromaticity_info->green_primary.z=0.110; + chromaticity_info->blue_primary.x=0.150; + chromaticity_info->blue_primary.y=0.060; + chromaticity_info->blue_primary.z=0.790; + chromaticity_info->white_point.x=0.3127; + chromaticity_info->white_point.y=0.3290; + chromaticity_info->white_point.z=0.3582; + break; + } + default: + break; + } +} + +static void TimeCodeToString(const size_t timestamp,char *code) +{ +#define TimeFields 7 + + unsigned int + shift; + + ssize_t + i; + + *code='\0'; + shift=4*TimeFields; + for (i=0; i <= TimeFields; i++) + { + (void) FormatLocaleString(code,MaxTextExtent-strlen(code),"%x", + (unsigned int) ((timestamp >> shift) & 0x0fU)); + code++; + if (((i % 2) != 0) && (i < TimeFields)) + *code++=':'; + shift-=4; + *code='\0'; + } +} + +static Image *ReadDPXImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + magick[4], + value[MaxTextExtent]; + + DPXInfo + dpx; + + Image + *image; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + i; + + size_t + extent, + samples_per_pixel; + + ssize_t + count, + n, + row, + y; + + unsigned char + component_type; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read DPX file header. + */ + offset=0; + count=ReadBlob(image,4,(unsigned char *) magick); + offset+=count; + if ((count != 4) || ((LocaleNCompare(magick,"SDPX",4) != 0) && + (LocaleNCompare((char *) magick,"XPDS",4) != 0))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + image->endian=LSBEndian; + if (LocaleNCompare(magick,"SDPX",4) == 0) + image->endian=MSBEndian; + (void) memset(&dpx,0,sizeof(dpx)); + dpx.file.image_offset=ReadBlobLong(image); + offset+=4; + offset+=ReadBlob(image,sizeof(dpx.file.version),(unsigned char *) + dpx.file.version); + (void) FormatImageProperty(image,"dpx:file.version","%.8s",dpx.file.version); + dpx.file.file_size=ReadBlobLong(image); + offset+=4; + dpx.file.ditto_key=ReadBlobLong(image); + offset+=4; + if (dpx.file.ditto_key != ~0U) + (void) FormatImageProperty(image,"dpx:file.ditto.key","%u", + dpx.file.ditto_key); + dpx.file.generic_size=ReadBlobLong(image); + offset+=4; + dpx.file.industry_size=ReadBlobLong(image); + offset+=4; + dpx.file.user_size=ReadBlobLong(image); + offset+=4; + offset+=ReadBlob(image,sizeof(dpx.file.filename),(unsigned char *) + dpx.file.filename); + (void) FormatImageProperty(image,"dpx:file.filename","%.100s", + dpx.file.filename); + (void) FormatImageProperty(image,"document","%.100s",dpx.file.filename); + offset+=ReadBlob(image,sizeof(dpx.file.timestamp),(unsigned char *) + dpx.file.timestamp); + if (*dpx.file.timestamp != '\0') + (void) FormatImageProperty(image,"dpx:file.timestamp","%.24s", + dpx.file.timestamp); + offset+=ReadBlob(image,sizeof(dpx.file.creator),(unsigned char *) + dpx.file.creator); + if (*dpx.file.creator == '\0') + { + char + *url; + + url=GetMagickHomeURL(); + (void) FormatImageProperty(image,"dpx:file.creator","%.100s",url); + (void) FormatImageProperty(image,"software","%.100s",url); + url=DestroyString(url); + } + else + { + (void) FormatImageProperty(image,"dpx:file.creator","%.100s", + dpx.file.creator); + (void) FormatImageProperty(image,"software","%.100s",dpx.file.creator); + } + offset+=ReadBlob(image,sizeof(dpx.file.project),(unsigned char *) + dpx.file.project); + if (*dpx.file.project != '\0') + { + (void) FormatImageProperty(image,"dpx:file.project","%.200s", + dpx.file.project); + (void) FormatImageProperty(image,"comment","%.100s",dpx.file.project); + } + offset+=ReadBlob(image,sizeof(dpx.file.copyright),(unsigned char *) + dpx.file.copyright); + if (*dpx.file.copyright != '\0') + { + (void) FormatImageProperty(image,"dpx:file.copyright","%.200s", + dpx.file.copyright); + (void) FormatImageProperty(image,"copyright","%.100s", + dpx.file.copyright); + } + dpx.file.encrypt_key=ReadBlobLong(image); + offset+=4; + if (dpx.file.encrypt_key != ~0U) + (void) FormatImageProperty(image,"dpx:file.encrypt_key","%u", + dpx.file.encrypt_key); + offset+=ReadBlob(image,sizeof(dpx.file.reserve),(unsigned char *) + dpx.file.reserve); + /* + Read DPX image header. + */ + dpx.image.orientation=ReadBlobShort(image); + if (dpx.image.orientation > 7) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + offset+=2; + if (dpx.image.orientation != (unsigned short) ~0) + (void) FormatImageProperty(image,"dpx:image.orientation","%d", + dpx.image.orientation); + switch (dpx.image.orientation) + { + default: + case 0: image->orientation=TopLeftOrientation; break; + case 1: image->orientation=TopRightOrientation; break; + case 2: image->orientation=BottomLeftOrientation; break; + case 3: image->orientation=BottomRightOrientation; break; + case 4: image->orientation=LeftTopOrientation; break; + case 5: image->orientation=RightTopOrientation; break; + case 6: image->orientation=LeftBottomOrientation; break; + case 7: image->orientation=RightBottomOrientation; break; + } + dpx.image.number_elements=ReadBlobShort(image); + if ((dpx.image.number_elements < 1) || + (dpx.image.number_elements > MaxNumberImageElements)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + offset+=2; + dpx.image.pixels_per_line=ReadBlobLong(image); + offset+=4; + image->columns=dpx.image.pixels_per_line; + dpx.image.lines_per_element=ReadBlobLong(image); + offset+=4; + image->rows=dpx.image.lines_per_element; + for (i=0; i < 8; i++) + { + char + property[MaxTextExtent]; + + dpx.image.image_element[i].data_sign=ReadBlobLong(image); + offset+=4; + dpx.image.image_element[i].low_data=ReadBlobLong(image); + offset+=4; + dpx.image.image_element[i].low_quantity=ReadBlobFloat(image); + offset+=4; + dpx.image.image_element[i].high_data=ReadBlobLong(image); + offset+=4; + dpx.image.image_element[i].high_quantity=ReadBlobFloat(image); + offset+=4; + dpx.image.image_element[i].descriptor=(unsigned char) ReadBlobByte(image); + offset++; + dpx.image.image_element[i].transfer_characteristic=(unsigned char) + ReadBlobByte(image); + (void) FormatLocaleString(property,MaxTextExtent, + "dpx:image.element[%lu].transfer-characteristic",(long) i); + (void) FormatImageProperty(image,property,"%s", + GetImageTransferCharacteristic((DPXTransferCharacteristic) + dpx.image.image_element[i].transfer_characteristic)); + offset++; + dpx.image.image_element[i].colorimetric=(unsigned char) ReadBlobByte(image); + offset++; + dpx.image.image_element[i].bit_size=(unsigned char) ReadBlobByte(image); + offset++; + dpx.image.image_element[i].packing=ReadBlobShort(image); + offset+=2; + dpx.image.image_element[i].encoding=ReadBlobShort(image); + offset+=2; + dpx.image.image_element[i].data_offset=ReadBlobLong(image); + offset+=4; + dpx.image.image_element[i].end_of_line_padding=ReadBlobLong(image); + offset+=4; + dpx.image.image_element[i].end_of_image_padding=ReadBlobLong(image); + offset+=4; + offset+=ReadBlob(image,sizeof(dpx.image.image_element[i].description), + (unsigned char *) dpx.image.image_element[i].description); + } + (void) SetImageColorspace(image,RGBColorspace); + offset+=ReadBlob(image,sizeof(dpx.image.reserve),(unsigned char *) + dpx.image.reserve); + if (dpx.file.image_offset >= 1664U) + { + /* + Read DPX orientation header. + */ + dpx.orientation.x_offset=ReadBlobLong(image); + offset+=4; + if (dpx.orientation.x_offset != ~0U) + (void) FormatImageProperty(image,"dpx:orientation.x_offset","%u", + dpx.orientation.x_offset); + dpx.orientation.y_offset=ReadBlobLong(image); + offset+=4; + if (dpx.orientation.y_offset != ~0U) + (void) FormatImageProperty(image,"dpx:orientation.y_offset","%u", + dpx.orientation.y_offset); + dpx.orientation.x_center=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.orientation.x_center) != MagickFalse) + (void) FormatImageProperty(image,"dpx:orientation.x_center","%g", + dpx.orientation.x_center); + dpx.orientation.y_center=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.orientation.y_center) != MagickFalse) + (void) FormatImageProperty(image,"dpx:orientation.y_center","%g", + dpx.orientation.y_center); + dpx.orientation.x_size=ReadBlobLong(image); + offset+=4; + if (dpx.orientation.x_size != ~0U) + (void) FormatImageProperty(image,"dpx:orientation.x_size","%u", + dpx.orientation.x_size); + dpx.orientation.y_size=ReadBlobLong(image); + offset+=4; + if (dpx.orientation.y_size != ~0U) + (void) FormatImageProperty(image,"dpx:orientation.y_size","%u", + dpx.orientation.y_size); + offset+=ReadBlob(image,sizeof(dpx.orientation.filename),(unsigned char *) + dpx.orientation.filename); + if (*dpx.orientation.filename != '\0') + (void) FormatImageProperty(image,"dpx:orientation.filename","%.100s", + dpx.orientation.filename); + offset+=ReadBlob(image,sizeof(dpx.orientation.timestamp),(unsigned char *) + dpx.orientation.timestamp); + if (*dpx.orientation.timestamp != '\0') + (void) FormatImageProperty(image,"dpx:orientation.timestamp","%.24s", + dpx.orientation.timestamp); + offset+=ReadBlob(image,sizeof(dpx.orientation.device),(unsigned char *) + dpx.orientation.device); + if (*dpx.orientation.device != '\0') + (void) FormatImageProperty(image,"dpx:orientation.device","%.32s", + dpx.orientation.device); + offset+=ReadBlob(image,sizeof(dpx.orientation.serial),(unsigned char *) + dpx.orientation.serial); + if (*dpx.orientation.serial != '\0') + (void) FormatImageProperty(image,"dpx:orientation.serial","%.32s", + dpx.orientation.serial); + for (i=0; i < 4; i++) + { + dpx.orientation.border[i]=ReadBlobShort(image); + offset+=2; + } + if ((dpx.orientation.border[0] != (unsigned short) (~0)) && + (dpx.orientation.border[1] != (unsigned short) (~0))) + (void) FormatImageProperty(image,"dpx:orientation.border","%dx%d%+d%+d", dpx.orientation.border[0],dpx.orientation.border[1], + dpx.orientation.border[2],dpx.orientation.border[3]); + for (i=0; i < 2; i++) + { + dpx.orientation.aspect_ratio[i]=ReadBlobLong(image); + offset+=4; + } + if ((dpx.orientation.aspect_ratio[0] != ~0U) && + (dpx.orientation.aspect_ratio[1] != ~0U)) + (void) FormatImageProperty(image,"dpx:orientation.aspect_ratio", + "%ux%u",dpx.orientation.aspect_ratio[0], + dpx.orientation.aspect_ratio[1]); + offset+=ReadBlob(image,sizeof(dpx.orientation.reserve),(unsigned char *) + dpx.orientation.reserve); + } + if (dpx.file.image_offset >= 1920U) + { + /* + Read DPX film header. + */ + offset+=ReadBlob(image,sizeof(dpx.film.id),(unsigned char *) dpx.film.id); + if (*dpx.film.id != '\0') + (void) FormatImageProperty(image,"dpx:film.id","%.2s",dpx.film.id); + offset+=ReadBlob(image,sizeof(dpx.film.type),(unsigned char *) + dpx.film.type); + if (*dpx.film.type != '\0') + (void) FormatImageProperty(image,"dpx:film.type","%.2s",dpx.film.type); + offset+=ReadBlob(image,sizeof(dpx.film.offset),(unsigned char *) + dpx.film.offset); + if (*dpx.film.offset != '\0') + (void) FormatImageProperty(image,"dpx:film.offset","%.2s", + dpx.film.offset); + offset+=ReadBlob(image,sizeof(dpx.film.prefix),(unsigned char *) + dpx.film.prefix); + if (*dpx.film.prefix != '\0') + (void) FormatImageProperty(image,"dpx:film.prefix","%.6s", + dpx.film.prefix); + offset+=ReadBlob(image,sizeof(dpx.film.count),(unsigned char *) + dpx.film.count); + if (*dpx.film.count != '\0') + (void) FormatImageProperty(image,"dpx:film.count","%.4s", + dpx.film.count); + offset+=ReadBlob(image,sizeof(dpx.film.format),(unsigned char *) + dpx.film.format); + if (*dpx.film.format != '\0') + (void) FormatImageProperty(image,"dpx:film.format","%.4s", + dpx.film.format); + dpx.film.frame_position=ReadBlobLong(image); + offset+=4; + if (dpx.film.frame_position != ~0U) + (void) FormatImageProperty(image,"dpx:film.frame_position","%u", + dpx.film.frame_position); + dpx.film.sequence_extent=ReadBlobLong(image); + offset+=4; + if (dpx.film.sequence_extent != ~0U) + (void) FormatImageProperty(image,"dpx:film.sequence_extent","%u", + dpx.film.sequence_extent); + dpx.film.held_count=ReadBlobLong(image); + offset+=4; + if (dpx.film.held_count != ~0U) + (void) FormatImageProperty(image,"dpx:film.held_count","%u", + dpx.film.held_count); + dpx.film.frame_rate=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.film.frame_rate) != MagickFalse) + (void) FormatImageProperty(image,"dpx:film.frame_rate","%g", + dpx.film.frame_rate); + dpx.film.shutter_angle=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.film.shutter_angle) != MagickFalse) + (void) FormatImageProperty(image,"dpx:film.shutter_angle","%g", + dpx.film.shutter_angle); + offset+=ReadBlob(image,sizeof(dpx.film.frame_id),(unsigned char *) + dpx.film.frame_id); + if (*dpx.film.frame_id != '\0') + (void) FormatImageProperty(image,"dpx:film.frame_id","%.32s", + dpx.film.frame_id); + offset+=ReadBlob(image,sizeof(dpx.film.slate),(unsigned char *) + dpx.film.slate); + if (*dpx.film.slate != '\0') + (void) FormatImageProperty(image,"dpx:film.slate","%.100s", + dpx.film.slate); + offset+=ReadBlob(image,sizeof(dpx.film.reserve),(unsigned char *) + dpx.film.reserve); + } + if (dpx.file.image_offset >= 2048U) + { + /* + Read DPX television header. + */ + dpx.television.time_code=(unsigned int) ReadBlobLong(image); + offset+=4; + TimeCodeToString(dpx.television.time_code,value); + (void) SetImageProperty(image,"dpx:television.time.code",value); + dpx.television.user_bits=(unsigned int) ReadBlobLong(image); + offset+=4; + TimeCodeToString(dpx.television.user_bits,value); + (void) SetImageProperty(image,"dpx:television.user.bits",value); + dpx.television.interlace=(unsigned char) ReadBlobByte(image); + offset++; + if (dpx.television.interlace != 0) + (void) FormatImageProperty(image,"dpx:television.interlace","%.20g", + (double) dpx.television.interlace); + dpx.television.field_number=(unsigned char) ReadBlobByte(image); + offset++; + if (dpx.television.field_number != 0) + (void) FormatImageProperty(image,"dpx:television.field_number","%.20g", + (double) dpx.television.field_number); + dpx.television.video_signal=(unsigned char) ReadBlobByte(image); + offset++; + if (dpx.television.video_signal != 0) + (void) FormatImageProperty(image,"dpx:television.video_signal","%.20g", + (double) dpx.television.video_signal); + dpx.television.padding=(unsigned char) ReadBlobByte(image); + offset++; + if (dpx.television.padding != 0) + (void) FormatImageProperty(image,"dpx:television.padding","%d", + dpx.television.padding); + dpx.television.horizontal_sample_rate=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.television.horizontal_sample_rate) != MagickFalse) + (void) FormatImageProperty(image, + "dpx:television.horizontal_sample_rate","%g", + dpx.television.horizontal_sample_rate); + dpx.television.vertical_sample_rate=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.television.vertical_sample_rate) != MagickFalse) + (void) FormatImageProperty(image,"dpx:television.vertical_sample_rate", + "%g",dpx.television.vertical_sample_rate); + dpx.television.frame_rate=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.television.frame_rate) != MagickFalse) + (void) FormatImageProperty(image,"dpx:television.frame_rate","%g", + dpx.television.frame_rate); + dpx.television.time_offset=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.television.time_offset) != MagickFalse) + (void) FormatImageProperty(image,"dpx:television.time_offset","%g", + dpx.television.time_offset); + dpx.television.gamma=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.television.gamma) != MagickFalse) + (void) FormatImageProperty(image,"dpx:television.gamma","%g", + dpx.television.gamma); + dpx.television.black_level=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.television.black_level) != MagickFalse) + (void) FormatImageProperty(image,"dpx:television.black_level","%g", + dpx.television.black_level); + dpx.television.black_gain=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.television.black_gain) != MagickFalse) + (void) FormatImageProperty(image,"dpx:television.black_gain","%g", + dpx.television.black_gain); + dpx.television.break_point=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.television.break_point) != MagickFalse) + (void) FormatImageProperty(image,"dpx:television.break_point","%g", + dpx.television.break_point); + dpx.television.white_level=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.television.white_level) != MagickFalse) + (void) FormatImageProperty(image,"dpx:television.white_level","%g", + dpx.television.white_level); + dpx.television.integration_times=ReadBlobFloat(image); + offset+=4; + if (IsFloatDefined(dpx.television.integration_times) != MagickFalse) + (void) FormatImageProperty(image,"dpx:television.integration_times", + "%g",dpx.television.integration_times); + offset+=ReadBlob(image,sizeof(dpx.television.reserve),(unsigned char *) + dpx.television.reserve); + } + if (dpx.file.image_offset > 2080U) + { + /* + Read DPX user header. + */ + offset+=ReadBlob(image,sizeof(dpx.user.id),(unsigned char *) dpx.user.id); + if (*dpx.user.id != '\0') + (void) FormatImageProperty(image,"dpx:user.id","%.32s",dpx.user.id); + if ((dpx.file.user_size != ~0U) && + ((size_t) dpx.file.user_size > sizeof(dpx.user.id))) + { + StringInfo + *profile; + + if ((MagickSizeType) dpx.file.user_size > GetBlobSize(image)) + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + profile=BlobToStringInfo((const void *) NULL, + dpx.file.user_size-sizeof(dpx.user.id)); + if (profile == (StringInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + offset+=ReadBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + if (EOFBlob(image) != MagickFalse) + (void) SetImageProfile(image,"dpx:user-data",profile); + profile=DestroyStringInfo(profile); + } + } + for ( ; offset < (MagickOffsetType) dpx.file.image_offset; offset++) + if (ReadBlobByte(image) == EOF) + break; + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(&image->exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + return(DestroyImageList(image)); + } + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + for (n=0; n < (ssize_t) dpx.image.number_elements; n++) + { + unsigned char + *pixels; + + /* + Convert DPX raster image to pixel packets. + */ + if ((dpx.image.image_element[n].data_offset != ~0U) && + (dpx.image.image_element[n].data_offset != 0U)) + { + MagickOffsetType + data_offset; + + data_offset=(MagickOffsetType) dpx.image.image_element[n].data_offset; + if (data_offset < offset) + offset=SeekBlob(image,data_offset,SEEK_SET); + else + for ( ; offset < data_offset; offset++) + if (ReadBlobByte(image) == EOF) + break; + if (offset != data_offset) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + } + SetPrimaryChromaticity((DPXColorimetric) + dpx.image.image_element[n].colorimetric,&image->chromaticity); + image->depth=dpx.image.image_element[n].bit_size; + if ((image->depth == 0) || (image->depth > 32)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + samples_per_pixel=1; + quantum_type=GrayQuantum; + component_type=dpx.image.image_element[n].descriptor; + switch (component_type) + { + case CbYCrY422ComponentType: + { + samples_per_pixel=2; + quantum_type=CbYCrYQuantum; + break; + } + case CbYACrYA4224ComponentType: + case CbYCr444ComponentType: + { + samples_per_pixel=3; + quantum_type=CbYCrQuantum; + break; + } + case RGBComponentType: + { + samples_per_pixel=3; + quantum_type=RGBQuantum; + break; + } + case ABGRComponentType: + case RGBAComponentType: + { + image->matte=MagickTrue; + samples_per_pixel=4; + quantum_type=RGBAQuantum; + break; + } + default: + break; + } + switch (component_type) + { + case CbYCrY422ComponentType: + case CbYACrYA4224ComponentType: + case CbYCr444ComponentType: + { + (void) SetImageColorspace(image,Rec709YCbCrColorspace); + break; + } + case LumaComponentType: + { + (void) SetImageColorspace(image,GRAYColorspace); + break; + } + default: + { + (void) SetImageColorspace(image,RGBColorspace); + if (dpx.image.image_element[n].transfer_characteristic == LogarithmicColorimetric) + (void) SetImageColorspace(image,LogColorspace); + if (dpx.image.image_element[n].transfer_characteristic == PrintingDensityColorimetric) + (void) SetImageColorspace(image,LogColorspace); + break; + } + } + extent=GetBytesPerRow(image->columns,samples_per_pixel,image->depth, + dpx.image.image_element[n].packing == 0 ? MagickFalse : MagickTrue); + /* + DPX any-bit pixel format. + */ + row=0; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + SetQuantumQuantum(quantum_info,32); + SetQuantumPack(quantum_info,dpx.image.image_element[n].packing == 0 ? + MagickTrue : MagickFalse); + status=SetQuantumPad(image,quantum_info,0); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + const void + *stream; + + MagickBooleanType + sync; + + PixelPacket + *q; + + size_t + length; + + ssize_t + count, + row_offset; + + stream=ReadBlobStream(image,extent,pixels,&count); + if (count != (ssize_t) extent) + break; + if ((image->progress_monitor != (MagickProgressMonitor) NULL) && + (image->previous == (Image *) NULL)) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType) row, + image->rows); + if (proceed == MagickFalse) + break; + } + row_offset=row++; + q=QueueAuthenticPixels(image,0,row_offset,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,(unsigned char *) stream,exception); + (void) length; + sync=SyncAuthenticPixels(image,exception); + if (sync == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (y < (ssize_t) image->rows) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + SetQuantumImageType(image,quantum_type); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + if ((i+1) < (ssize_t) dpx.image.number_elements) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + image->columns=dpx.image.pixels_per_line; + image->rows=dpx.image.lines_per_element; + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r D P X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterDPXImage() adds properties for the DPX image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterDPXImage method is: +% +% size_t RegisterDPXImage(void) +% +*/ +ModuleExport size_t RegisterDPXImage(void) +{ + MagickInfo + *entry; + + static const char + *DPXNote = + { + "Digital Moving Picture Exchange Bitmap, Version 2.0.\n" + "See SMPTE 268M-2003 specification at http://www.smtpe.org\n" + }; + + entry=SetMagickInfo("DPX"); + entry->decoder=(DecodeImageHandler *) ReadDPXImage; + entry->encoder=(EncodeImageHandler *) WriteDPXImage; + entry->magick=(IsImageFormatHandler *) IsDPX; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("SMPTE 268M-2003 (DPX 2.0)"); + entry->note=ConstantString(DPXNote); + entry->magick_module=ConstantString("DPX"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r D P X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterDPXImage() removes format registrations made by the +% DPX module from the list of supported formats. +% +% The format of the UnregisterDPXImage method is: +% +% UnregisterDPXImage(void) +% +*/ +ModuleExport void UnregisterDPXImage(void) +{ + (void) UnregisterMagickInfo("DPX"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e D P X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteDPXImage() writes an image in DPX encoded image format. +% +% The format of the WriteDPXImage method is: +% +% MagickBooleanType WriteDPXImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static unsigned int StringToTimeCode(const char *key) +{ + char + buffer[2]; + + ssize_t + i; + + unsigned int + shift, + value; + + value=0; + shift=28; + buffer[1]='\0'; + for (i=0; (*key != 0) && (i < 11); i++) + { + if (isxdigit((int) ((unsigned char) *key)) == 0) + { + key++; + continue; + } + buffer[0]=(*key++); + value|=(unsigned int) ((strtol(buffer,(char **) NULL,16)) << shift); + shift-=4; + } + return(value); +} + +static inline const char *GetDPXProperty(const Image *image, + const char *property) +{ + const char + *value; + + value=GetImageArtifact(image,property); + if (value != (const char *) NULL) + return(value); + return(GetImageProperty(image,property)); +} + +static MagickBooleanType WriteDPXImage(const ImageInfo *image_info, + Image *image) +{ + const char + *value; + + const StringInfo + *profile; + + DPXInfo + dpx; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + MagickStatusType + flags; + + GeometryInfo + geometry_info; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + const PixelPacket + *p; + + ssize_t + i; + + ssize_t + count, + horizontal_factor, + vertical_factor, + y; + + size_t + channels, + extent, + samples_per_pixel; + + time_t + seconds; + + unsigned char + component_type, + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + horizontal_factor=4; + vertical_factor=4; + if (image_info->sampling_factor != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(image_info->sampling_factor,&geometry_info); + if ((flags & RhoValue) != 0) + horizontal_factor=(ssize_t) geometry_info.rho; + vertical_factor=horizontal_factor; + if ((flags & SigmaValue) != 0) + vertical_factor=(ssize_t) geometry_info.sigma; + if ((horizontal_factor != 1) && (horizontal_factor != 2) && + (horizontal_factor != 4) && (vertical_factor != 1) && + (vertical_factor != 2) && (vertical_factor != 4)) + ThrowWriterException(CorruptImageError,"UnexpectedSamplingFactor"); + } + if ((IsYCbCrCompatibleColorspace(image->colorspace) != MagickFalse) && + ((horizontal_factor == 2) || (vertical_factor == 2))) + if ((image->columns % 2) != 0) + image->columns++; + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + /* + Write file header. + */ + (void) memset(&dpx,0,sizeof(dpx)); + offset=0; + dpx.file.magic=0x53445058U; + offset+=WriteBlobLong(image,dpx.file.magic); + dpx.file.image_offset=0x2000U; + profile=GetImageProfile(image,"dpx:user-data"); + if (profile != (StringInfo *) NULL) + { + if (GetStringInfoLength(profile) > 1048576) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + dpx.file.image_offset+=(unsigned int) GetStringInfoLength(profile); + dpx.file.image_offset=(((dpx.file.image_offset+0x2000-1)/0x2000)*0x2000); + } + offset+=WriteBlobLong(image,dpx.file.image_offset); + (void) strncpy(dpx.file.version,"V2.0",sizeof(dpx.file.version)-1); + offset+=WriteBlob(image,8,(unsigned char *) &dpx.file.version); + channels=1; + if (IsGrayImage(image,&image->exception) == MagickFalse) + channels=3; + if (image->matte != MagickFalse) + channels++; + dpx.file.file_size=(unsigned int) (channels*image->columns*image->rows+ + dpx.file.image_offset); + offset+=WriteBlobLong(image,dpx.file.file_size); + dpx.file.ditto_key=1U; /* new frame */ + offset+=WriteBlobLong(image,dpx.file.ditto_key); + dpx.file.generic_size=0x00000680U; + offset+=WriteBlobLong(image,dpx.file.generic_size); + dpx.file.industry_size=0x00000180U; + offset+=WriteBlobLong(image,dpx.file.industry_size); + dpx.file.user_size=0; + if (profile != (StringInfo *) NULL) + { + dpx.file.user_size+=(unsigned int) GetStringInfoLength(profile); + dpx.file.user_size=(((dpx.file.user_size+0x2000-1)/0x2000)*0x2000); + } + offset+=WriteBlobLong(image,dpx.file.user_size); + value=GetDPXProperty(image,"dpx:file.filename"); + if (value != (const char *) NULL) + (void) strncpy(dpx.file.filename,value,sizeof(dpx.file.filename)-1); + offset+=WriteBlob(image,sizeof(dpx.file.filename),(unsigned char *) + dpx.file.filename); + seconds=GetMagickTime(); + (void) FormatMagickTime(seconds,sizeof(dpx.file.timestamp), + dpx.file.timestamp); + offset+=WriteBlob(image,sizeof(dpx.file.timestamp),(unsigned char *) + dpx.file.timestamp); + (void) strncpy(dpx.file.creator,MagickAuthoritativeURL, + sizeof(dpx.file.creator)-1); + value=GetDPXProperty(image,"dpx:file.creator"); + if (value != (const char *) NULL) + (void) strncpy(dpx.file.creator,value,sizeof(dpx.file.creator)-1); + offset+=WriteBlob(image,sizeof(dpx.file.creator),(unsigned char *) + dpx.file.creator); + value=GetDPXProperty(image,"dpx:file.project"); + if (value != (const char *) NULL) + (void) strncpy(dpx.file.project,value,sizeof(dpx.file.project)-1); + offset+=WriteBlob(image,sizeof(dpx.file.project),(unsigned char *) + dpx.file.project); + value=GetDPXProperty(image,"dpx:file.copyright"); + if (value != (const char *) NULL) + (void) strncpy(dpx.file.copyright,value,sizeof(dpx.file.copyright)-1); + offset+=WriteBlob(image,sizeof(dpx.file.copyright),(unsigned char *) + dpx.file.copyright); + dpx.file.encrypt_key=(~0U); + offset+=WriteBlobLong(image,dpx.file.encrypt_key); + offset+=WriteBlob(image,sizeof(dpx.file.reserve),(unsigned char *) + dpx.file.reserve); + /* + Write image header. + */ + switch (image->orientation) + { + default: + case TopLeftOrientation: dpx.image.orientation=0; break; + case TopRightOrientation: dpx.image.orientation=1; break; + case BottomLeftOrientation: dpx.image.orientation=2; break; + case BottomRightOrientation: dpx.image.orientation=3; break; + case LeftTopOrientation: dpx.image.orientation=4; break; + case RightTopOrientation: dpx.image.orientation=5; break; + case LeftBottomOrientation: dpx.image.orientation=6; break; + case RightBottomOrientation: dpx.image.orientation=7; break; + } + offset+=WriteBlobShort(image,dpx.image.orientation); + dpx.image.number_elements=1; + offset+=WriteBlobShort(image,dpx.image.number_elements); + if ((image->columns != (unsigned int) image->columns) || + (image->rows != (unsigned int) image->rows)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + offset+=WriteBlobLong(image,(unsigned int) image->columns); + offset+=WriteBlobLong(image,(unsigned int) image->rows); + for (i=0; i < 8; i++) + { + dpx.image.image_element[i].data_sign=0U; + offset+=WriteBlobLong(image,dpx.image.image_element[i].data_sign); + dpx.image.image_element[i].low_data=0U; + offset+=WriteBlobLong(image,dpx.image.image_element[i].low_data); + dpx.image.image_element[i].low_quantity=0.0f; + offset+=WriteBlobFloat(image,dpx.image.image_element[i].low_quantity); + dpx.image.image_element[i].high_data=0U; + offset+=WriteBlobLong(image,dpx.image.image_element[i].high_data); + dpx.image.image_element[i].high_quantity=0.0f; + offset+=WriteBlobFloat(image,dpx.image.image_element[i].high_quantity); + dpx.image.image_element[i].descriptor=0; + if (i == 0) + switch (image->colorspace) + { + case Rec601YCbCrColorspace: + case Rec709YCbCrColorspace: + case YCbCrColorspace: + { + dpx.image.image_element[i].descriptor=CbYCr444ComponentType; + if (image->matte != MagickFalse) + dpx.image.image_element[i].descriptor=CbYCrA4444ComponentType; + break; + } + default: + { + dpx.image.image_element[i].descriptor=RGBComponentType; + if (image->matte != MagickFalse) + dpx.image.image_element[i].descriptor=RGBAComponentType; + if ((image_info->type != TrueColorType) && + (image->matte == MagickFalse) && + (SetImageGray(image,&image->exception) != MagickFalse)) + dpx.image.image_element[i].descriptor=LumaComponentType; + break; + } + } + offset+=WriteBlobByte(image,dpx.image.image_element[i].descriptor); + dpx.image.image_element[i].transfer_characteristic=0; + if (image->colorspace == LogColorspace) + dpx.image.image_element[0].transfer_characteristic= + PrintingDensityColorimetric; + offset+=WriteBlobByte(image, + dpx.image.image_element[i].transfer_characteristic); + dpx.image.image_element[i].colorimetric=0; + offset+=WriteBlobByte(image,dpx.image.image_element[i].colorimetric); + dpx.image.image_element[i].bit_size=0; + if (i == 0) + dpx.image.image_element[i].bit_size=(unsigned char) image->depth; + offset+=WriteBlobByte(image,dpx.image.image_element[i].bit_size); + dpx.image.image_element[i].packing=0; + if ((image->depth == 10) || (image->depth == 12)) + dpx.image.image_element[i].packing=1; + offset+=WriteBlobShort(image,dpx.image.image_element[i].packing); + dpx.image.image_element[i].encoding=0; + offset+=WriteBlobShort(image,dpx.image.image_element[i].encoding); + dpx.image.image_element[i].data_offset=0U; + if (i == 0) + dpx.image.image_element[i].data_offset=dpx.file.image_offset; + offset+=WriteBlobLong(image,dpx.image.image_element[i].data_offset); + dpx.image.image_element[i].end_of_line_padding=0U; + offset+=WriteBlobLong(image,dpx.image.image_element[i].end_of_line_padding); + offset+=WriteBlobLong(image, + dpx.image.image_element[i].end_of_image_padding); + offset+=WriteBlob(image,sizeof(dpx.image.image_element[i].description), + (unsigned char *) dpx.image.image_element[i].description); + } + offset+=WriteBlob(image,sizeof(dpx.image.reserve),(unsigned char *) + dpx.image.reserve); + /* + Write orientation header. + */ + if ((image->rows != image->magick_rows) || + (image->columns != image->magick_columns)) + { + /* + These properties are not valid if image size changed. + */ + (void) DeleteImageProperty(image,"dpx:orientation.x_offset"); + (void) DeleteImageProperty(image,"dpx:orientation.y_offset"); + (void) DeleteImageProperty(image,"dpx:orientation.x_center"); + (void) DeleteImageProperty(image,"dpx:orientation.y_center"); + (void) DeleteImageProperty(image,"dpx:orientation.x_size"); + (void) DeleteImageProperty(image,"dpx:orientation.y_size"); + } + dpx.orientation.x_offset=0U; + value=GetDPXProperty(image,"dpx:orientation.x_offset"); + if (value != (const char *) NULL) + dpx.orientation.x_offset=(unsigned int) StringToUnsignedLong(value); + offset+=WriteBlobLong(image,dpx.orientation.x_offset); + dpx.orientation.y_offset=0U; + value=GetDPXProperty(image,"dpx:orientation.y_offset"); + if (value != (const char *) NULL) + dpx.orientation.y_offset=(unsigned int) StringToUnsignedLong(value); + offset+=WriteBlobLong(image,dpx.orientation.y_offset); + dpx.orientation.x_center=0.0f; + value=GetDPXProperty(image,"dpx:orientation.x_center"); + if (value != (const char *) NULL) + dpx.orientation.x_center=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.orientation.x_center); + dpx.orientation.y_center=0.0f; + value=GetDPXProperty(image,"dpx:orientation.y_center"); + if (value != (const char *) NULL) + dpx.orientation.y_center=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.orientation.y_center); + dpx.orientation.x_size=0U; + value=GetDPXProperty(image,"dpx:orientation.x_size"); + if (value != (const char *) NULL) + dpx.orientation.x_size=(unsigned int) StringToUnsignedLong(value); + offset+=WriteBlobLong(image,dpx.orientation.x_size); + dpx.orientation.y_size=0U; + value=GetDPXProperty(image,"dpx:orientation.y_size"); + if (value != (const char *) NULL) + dpx.orientation.y_size=(unsigned int) StringToUnsignedLong(value); + offset+=WriteBlobLong(image,dpx.orientation.y_size); + value=GetDPXProperty(image,"dpx:orientation.filename"); + if (value != (const char *) NULL) + (void) strncpy(dpx.orientation.filename,value, + sizeof(dpx.orientation.filename)-1); + offset+=WriteBlob(image,sizeof(dpx.orientation.filename),(unsigned char *) + dpx.orientation.filename); + offset+=WriteBlob(image,sizeof(dpx.orientation.timestamp),(unsigned char *) + dpx.orientation.timestamp); + value=GetDPXProperty(image,"dpx:orientation.device"); + if (value != (const char *) NULL) + (void) strncpy(dpx.orientation.device,value, + sizeof(dpx.orientation.device)-1); + offset+=WriteBlob(image,sizeof(dpx.orientation.device),(unsigned char *) + dpx.orientation.device); + value=GetDPXProperty(image,"dpx:orientation.serial"); + if (value != (const char *) NULL) + (void) strncpy(dpx.orientation.serial,value, + sizeof(dpx.orientation.serial)-1); + offset+=WriteBlob(image,sizeof(dpx.orientation.serial),(unsigned char *) + dpx.orientation.serial); + for (i=0; i < 4; i++) + dpx.orientation.border[i]=0; + value=GetDPXProperty(image,"dpx:orientation.border"); + if (value != (const char *) NULL) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + dpx.orientation.border[0]=(unsigned short) (geometry_info.rho+0.5); + dpx.orientation.border[1]=(unsigned short) (geometry_info.sigma+0.5); + dpx.orientation.border[2]=(unsigned short) (geometry_info.xi+0.5); + dpx.orientation.border[3]=(unsigned short) (geometry_info.psi+0.5); + } + for (i=0; i < 4; i++) + offset+=WriteBlobShort(image,dpx.orientation.border[i]); + for (i=0; i < 2; i++) + dpx.orientation.aspect_ratio[i]=0U; + value=GetDPXProperty(image,"dpx:orientation.aspect_ratio"); + if (value != (const char *) NULL) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + dpx.orientation.aspect_ratio[0]=(unsigned int) (geometry_info.rho+0.5); + dpx.orientation.aspect_ratio[1]=(unsigned int) (geometry_info.sigma+0.5); + } + for (i=0; i < 2; i++) + offset+=WriteBlobLong(image,dpx.orientation.aspect_ratio[i]); + offset+=WriteBlob(image,sizeof(dpx.orientation.reserve),(unsigned char *) + dpx.orientation.reserve); + /* + Write film header. + */ + (void) memset(dpx.film.id,0,sizeof(dpx.film.id)); + value=GetDPXProperty(image,"dpx:film.id"); + if (value != (const char *) NULL) + (void) strncpy(dpx.film.id,value,sizeof(dpx.film.id)-1); + offset+=WriteBlob(image,sizeof(dpx.film.id),(unsigned char *) dpx.film.id); + (void) memset(dpx.film.type,0,sizeof(dpx.film.type)); + value=GetDPXProperty(image,"dpx:film.type"); + if (value != (const char *) NULL) + (void) strncpy(dpx.film.type,value,sizeof(dpx.film.type)-1); + offset+=WriteBlob(image,sizeof(dpx.film.type),(unsigned char *) + dpx.film.type); + (void) memset(dpx.film.offset,0,sizeof(dpx.film.offset)); + value=GetDPXProperty(image,"dpx:film.offset"); + if (value != (const char *) NULL) + (void) strncpy(dpx.film.offset,value,sizeof(dpx.film.offset)-1); + offset+=WriteBlob(image,sizeof(dpx.film.offset),(unsigned char *) + dpx.film.offset); + (void) memset(dpx.film.prefix,0,sizeof(dpx.film.prefix)); + value=GetDPXProperty(image,"dpx:film.prefix"); + if (value != (const char *) NULL) + (void) strncpy(dpx.film.prefix,value,sizeof(dpx.film.prefix)-1); + offset+=WriteBlob(image,sizeof(dpx.film.prefix),(unsigned char *) + dpx.film.prefix); + (void) memset(dpx.film.count,0,sizeof(dpx.film.count)); + value=GetDPXProperty(image,"dpx:film.count"); + if (value != (const char *) NULL) + (void) strncpy(dpx.film.count,value,sizeof(dpx.film.count)-1); + offset+=WriteBlob(image,sizeof(dpx.film.count),(unsigned char *) + dpx.film.count); + (void) memset(dpx.film.format,0,sizeof(dpx.film.format)); + value=GetDPXProperty(image,"dpx:film.format"); + if (value != (const char *) NULL) + (void) strncpy(dpx.film.format,value,sizeof(dpx.film.format)-1); + offset+=WriteBlob(image,sizeof(dpx.film.format),(unsigned char *) + dpx.film.format); + dpx.film.frame_position=0U; + value=GetDPXProperty(image,"dpx:film.frame_position"); + if (value != (const char *) NULL) + dpx.film.frame_position=(unsigned int) StringToUnsignedLong(value); + offset+=WriteBlobLong(image,dpx.film.frame_position); + dpx.film.sequence_extent=0U; + value=GetDPXProperty(image,"dpx:film.sequence_extent"); + if (value != (const char *) NULL) + dpx.film.sequence_extent=(unsigned int) StringToUnsignedLong(value); + offset+=WriteBlobLong(image,dpx.film.sequence_extent); + dpx.film.held_count=0U; + value=GetDPXProperty(image,"dpx:film.held_count"); + if (value != (const char *) NULL) + dpx.film.held_count=(unsigned int) StringToUnsignedLong(value); + offset+=WriteBlobLong(image,dpx.film.held_count); + dpx.film.frame_rate=0.0f; + value=GetDPXProperty(image,"dpx:film.frame_rate"); + if (value != (const char *) NULL) + dpx.film.frame_rate=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.film.frame_rate); + dpx.film.shutter_angle=0.0f; + value=GetDPXProperty(image,"dpx:film.shutter_angle"); + if (value != (const char *) NULL) + dpx.film.shutter_angle=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.film.shutter_angle); + (void) memset(dpx.film.frame_id,0,sizeof(dpx.film.frame_id)); + value=GetDPXProperty(image,"dpx:film.frame_id"); + if (value != (const char *) NULL) + (void) strncpy(dpx.film.frame_id,value,sizeof(dpx.film.frame_id)-1); + offset+=WriteBlob(image,sizeof(dpx.film.frame_id),(unsigned char *) + dpx.film.frame_id); + value=GetDPXProperty(image,"dpx:film.slate"); + if (value != (const char *) NULL) + (void) strncpy(dpx.film.slate,value,sizeof(dpx.film.slate)-1); + offset+=WriteBlob(image,sizeof(dpx.film.slate),(unsigned char *) + dpx.film.slate); + offset+=WriteBlob(image,sizeof(dpx.film.reserve),(unsigned char *) + dpx.film.reserve); + /* + Write television header. + */ + value=GetDPXProperty(image,"dpx:television.time.code"); + if (value != (const char *) NULL) + dpx.television.time_code=StringToTimeCode(value); + offset+=WriteBlobLong(image,dpx.television.time_code); + value=GetDPXProperty(image,"dpx:television.user.bits"); + if (value != (const char *) NULL) + dpx.television.user_bits=StringToTimeCode(value); + offset+=WriteBlobLong(image,dpx.television.user_bits); + value=GetDPXProperty(image,"dpx:television.interlace"); + if (value != (const char *) NULL) + dpx.television.interlace=(unsigned char) StringToLong(value); + offset+=WriteBlobByte(image,dpx.television.interlace); + value=GetDPXProperty(image,"dpx:television.field_number"); + if (value != (const char *) NULL) + dpx.television.field_number=(unsigned char) StringToLong(value); + offset+=WriteBlobByte(image,dpx.television.field_number); + dpx.television.video_signal=0; + value=GetDPXProperty(image,"dpx:television.video_signal"); + if (value != (const char *) NULL) + dpx.television.video_signal=(unsigned char) StringToLong(value); + offset+=WriteBlobByte(image,dpx.television.video_signal); + dpx.television.padding=0; + value=GetDPXProperty(image,"dpx:television.padding"); + if (value != (const char *) NULL) + dpx.television.padding=(unsigned char) StringToLong(value); + offset+=WriteBlobByte(image,dpx.television.padding); + dpx.television.horizontal_sample_rate=0.0f; + value=GetDPXProperty(image,"dpx:television.horizontal_sample_rate"); + if (value != (const char *) NULL) + dpx.television.horizontal_sample_rate=StringToDouble(value, + (char **) NULL); + offset+=WriteBlobFloat(image,dpx.television.horizontal_sample_rate); + dpx.television.vertical_sample_rate=0.0f; + value=GetDPXProperty(image,"dpx:television.vertical_sample_rate"); + if (value != (const char *) NULL) + dpx.television.vertical_sample_rate=StringToDouble(value, + (char **) NULL); + offset+=WriteBlobFloat(image,dpx.television.vertical_sample_rate); + dpx.television.frame_rate=0.0f; + value=GetDPXProperty(image,"dpx:television.frame_rate"); + if (value != (const char *) NULL) + dpx.television.frame_rate=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.television.frame_rate); + dpx.television.time_offset=0.0f; + value=GetDPXProperty(image,"dpx:television.time_offset"); + if (value != (const char *) NULL) + dpx.television.time_offset=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.television.time_offset); + dpx.television.gamma=0.0f; + value=GetDPXProperty(image,"dpx:television.gamma"); + if (value != (const char *) NULL) + dpx.television.gamma=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.television.gamma); + dpx.television.black_level=0.0f; + value=GetDPXProperty(image,"dpx:television.black_level"); + if (value != (const char *) NULL) + dpx.television.black_level=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.television.black_level); + dpx.television.black_gain=0.0f; + value=GetDPXProperty(image,"dpx:television.black_gain"); + if (value != (const char *) NULL) + dpx.television.black_gain=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.television.black_gain); + dpx.television.break_point=0.0f; + value=GetDPXProperty(image,"dpx:television.break_point"); + if (value != (const char *) NULL) + dpx.television.break_point=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.television.break_point); + dpx.television.white_level=0.0f; + value=GetDPXProperty(image,"dpx:television.white_level"); + if (value != (const char *) NULL) + dpx.television.white_level=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.television.white_level); + dpx.television.integration_times=0.0f; + value=GetDPXProperty(image,"dpx:television.integration_times"); + if (value != (const char *) NULL) + dpx.television.integration_times=StringToDouble(value,(char **) NULL); + offset+=WriteBlobFloat(image,dpx.television.integration_times); + offset+=WriteBlob(image,sizeof(dpx.television.reserve),(unsigned char *) + dpx.television.reserve); + /* + Write user header. + */ + value=GetDPXProperty(image,"dpx:user.id"); + if (value != (const char *) NULL) + (void) strncpy(dpx.user.id,value,sizeof(dpx.user.id)-1); + offset+=WriteBlob(image,sizeof(dpx.user.id),(unsigned char *) dpx.user.id); + if (profile != (StringInfo *) NULL) + offset+=WriteBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + while (offset < (MagickOffsetType) dpx.image.image_element[0].data_offset) + { + count=WriteBlobByte(image,0x00); + if (count != 1) + { + ThrowFileException(&image->exception,FileOpenError,"UnableToWriteFile", + image->filename); + break; + } + offset+=count; + } + /* + Convert pixel packets to DPX raster image. + */ + quantum_info=AcquireQuantumInfo(image_info,image); + SetQuantumQuantum(quantum_info,32); + SetQuantumPack(quantum_info,dpx.image.image_element[0].packing == 0 ? + MagickTrue : MagickFalse); + quantum_type=RGBQuantum; + if (image->matte != MagickFalse) + quantum_type=RGBAQuantum; + if (IsYCbCrCompatibleColorspace(image->colorspace) != MagickFalse) + { + quantum_type=CbYCrQuantum; + if (image->matte != MagickFalse) + quantum_type=CbYCrAQuantum; + if ((horizontal_factor == 2) || (vertical_factor == 2)) + quantum_type=CbYCrYQuantum; + } + samples_per_pixel=1; + quantum_type=GrayQuantum; + component_type=dpx.image.image_element[0].descriptor; + switch (component_type) + { + case CbYCrY422ComponentType: + { + samples_per_pixel=2; + quantum_type=CbYCrYQuantum; + break; + } + case CbYACrYA4224ComponentType: + case CbYCr444ComponentType: + { + samples_per_pixel=3; + quantum_type=CbYCrQuantum; + break; + } + case RGBComponentType: + { + samples_per_pixel=3; + quantum_type=RGBQuantum; + break; + } + case ABGRComponentType: + case RGBAComponentType: + { + samples_per_pixel=4; + quantum_type=RGBAQuantum; + break; + } + default: + break; + } + extent=GetBytesPerRow(image->columns,samples_per_pixel,image->depth, + dpx.image.image_element[0].packing == 0 ? MagickFalse : MagickTrue); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + size_t + length; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + quantum_type,pixels,&image->exception); + if (length == 0) + break; + count=WriteBlob(image,extent,pixels); + if (count != (ssize_t) extent) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (y < (ssize_t) image->rows) + ThrowWriterException(CorruptImageError,"UnableToWriteImageData"); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/emf.c b/ImageMagick-6.9.12-44/coders/emf.c new file mode 100644 index 0000000..efc92c3 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/emf.c @@ -0,0 +1,900 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% EEEEE M M FFFFF % +% E MM MM F % +% EEE M M M FFF % +% E M M F % +% EEEEE M M F % +% % +% % +% Read Windows Enahanced Metafile Format % +% % +% Software Design % +% Bill Radcliffe % +% 2001 % +% Dirk Lemstra % +% January 2014 % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +/* + * Include declarations. + */ + +#include "magick/studio.h" +#if defined(MAGICKCORE_WINGDI32_DELEGATE) +# if !defined(_MSC_VER) +# if defined(__CYGWIN__) +# include +# else +# include +# endif +# else +# include +# pragma comment(lib, "gdiplus.lib") +# endif +#endif +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s E F M % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsEMF() returns MagickTrue if the image format type, identified by the +% magick string, is a Microsoft Windows Enhanced MetaFile (EMF) file. +% +% The format of the ReadEMFImage method is: +% +% MagickBooleanType IsEMF(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsEMF(const unsigned char *magick,const size_t length) +{ + if (length < 48) + return(MagickFalse); + if (memcmp(magick+40,"\040\105\115\106\000\000\001\000",8) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s W M F % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsWMF() returns MagickTrue if the image format type, identified by the +% magick string, is a Windows MetaFile (WMF) file. +% +% The format of the ReadEMFImage method is: +% +% MagickBooleanType IsEMF(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsWMF(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\327\315\306\232",4) == 0) + return(MagickTrue); + if (memcmp(magick,"\001\000\011\000",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d E M F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadEMFImage() reads an Microsoft Windows Enhanced MetaFile (EMF) or +% Windows MetaFile (WMF) file using the Windows API and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadEMFImage method is: +% +% Image *ReadEMFImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info.. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(MAGICKCORE_WINGDI32_DELEGATE) +# if !defined(_MSC_VER) +# if defined(MAGICKCORE_HAVE__WFOPEN) +static size_t UTF8ToUTF16(const unsigned char *utf8,wchar_t *utf16) +{ + const unsigned char + *p; + + if (utf16 != (wchar_t *) NULL) + { + wchar_t + *q; + + wchar_t + c; + + /* + Convert UTF-8 to UTF-16. + */ + q=utf16; + for (p=utf8; *p != '\0'; p++) + { + if ((*p & 0x80) == 0) + *q=(*p); + else + if ((*p & 0xE0) == 0xC0) + { + c=(*p); + *q=(c & 0x1F) << 6; + p++; + if ((*p & 0xC0) != 0x80) + return(0); + *q|=(*p & 0x3F); + } + else + if ((*p & 0xF0) == 0xE0) + { + c=(*p); + *q=c << 12; + p++; + if ((*p & 0xC0) != 0x80) + return(0); + c=(*p); + *q|=(c & 0x3F) << 6; + p++; + if ((*p & 0xC0) != 0x80) + return(0); + *q|=(*p & 0x3F); + } + else + return(0); + q++; + } + *q++='\0'; + return(q-utf16); + } + /* + Compute UTF-16 string length. + */ + for (p=utf8; *p != '\0'; p++) + { + if ((*p & 0x80) == 0) + ; + else + if ((*p & 0xE0) == 0xC0) + { + p++; + if ((*p & 0xC0) != 0x80) + return(0); + } + else + if ((*p & 0xF0) == 0xE0) + { + p++; + if ((*p & 0xC0) != 0x80) + return(0); + p++; + if ((*p & 0xC0) != 0x80) + return(0); + } + else + return(0); + } + return(p-utf8); +} + +static wchar_t *ConvertUTF8ToUTF16(const unsigned char *source) +{ + size_t + length; + + wchar_t + *utf16; + + length=UTF8ToUTF16(source,(wchar_t *) NULL); + if (length == 0) + { + ssize_t + i; + + /* + Not UTF-8, just copy. + */ + length=strlen((char *) source); + utf16=(wchar_t *) AcquireQuantumMemory(length+1,sizeof(*utf16)); + if (utf16 == (wchar_t *) NULL) + return((wchar_t *) NULL); + for (i=0; i <= (ssize_t) length; i++) + utf16[i]=source[i]; + return(utf16); + } + utf16=(wchar_t *) AcquireQuantumMemory(length+1,sizeof(*utf16)); + if (utf16 == (wchar_t *) NULL) + return((wchar_t *) NULL); + length=UTF8ToUTF16(source,utf16); + return(utf16); +} +# endif /* MAGICKCORE_HAVE__WFOPEN */ + +static HENHMETAFILE ReadEnhMetaFile(const char *path,ssize_t *width, + ssize_t *height) +{ +#pragma pack( push, 2 ) + typedef struct + { + DWORD dwKey; + WORD hmf; + SMALL_RECT bbox; + WORD wInch; + DWORD dwReserved; + WORD wCheckSum; + } APMHEADER, *PAPMHEADER; +#pragma pack( pop ) + + DWORD + dwSize; + + ENHMETAHEADER + emfh; + + HANDLE + hFile; + + HDC + hDC; + + HENHMETAFILE + hTemp; + + LPBYTE + pBits; + + METAFILEPICT + mp; + + HMETAFILE + hOld; + + *width=512; + *height=512; + hTemp=GetEnhMetaFile(path); +#if defined(MAGICKCORE_HAVE__WFOPEN) + if (hTemp == (HENHMETAFILE) NULL) + { + wchar_t + *unicode_path; + + unicode_path=ConvertUTF8ToUTF16((const unsigned char *) path); + if (unicode_path != (wchar_t *) NULL) + { + hTemp=GetEnhMetaFileW(unicode_path); + unicode_path=(wchar_t *) RelinquishMagickMemory(unicode_path); + } + } +#endif + if (hTemp != (HENHMETAFILE) NULL) + { + /* + Enhanced metafile. + */ + GetEnhMetaFileHeader(hTemp,sizeof(ENHMETAHEADER),&emfh); + *width=emfh.rclFrame.right-emfh.rclFrame.left; + *height=emfh.rclFrame.bottom-emfh.rclFrame.top; + return(hTemp); + } + hOld=GetMetaFile(path); + if (hOld != (HMETAFILE) NULL) + { + /* + 16bit windows metafile. + */ + dwSize=GetMetaFileBitsEx(hOld,0,NULL); + if (dwSize == 0) + { + DeleteMetaFile(hOld); + return((HENHMETAFILE) NULL); + } + pBits=(LPBYTE) AcquireQuantumMemory(dwSize,sizeof(*pBits)); + if (pBits == (LPBYTE) NULL) + { + DeleteMetaFile(hOld); + return((HENHMETAFILE) NULL); + } + if (GetMetaFileBitsEx(hOld,dwSize,pBits) == 0) + { + pBits=(BYTE *) DestroyString((char *) pBits); + DeleteMetaFile(hOld); + return((HENHMETAFILE) NULL); + } + /* + Make an enhanced metafile from the windows metafile. + */ + mp.mm=MM_ANISOTROPIC; + mp.xExt=1000; + mp.yExt=1000; + mp.hMF=NULL; + hDC=GetDC(NULL); + hTemp=SetWinMetaFileBits(dwSize,pBits,hDC,&mp); + ReleaseDC(NULL,hDC); + DeleteMetaFile(hOld); + pBits=(BYTE *) DestroyString((char *) pBits); + GetEnhMetaFileHeader(hTemp,sizeof(ENHMETAHEADER),&emfh); + *width=emfh.rclFrame.right-emfh.rclFrame.left; + *height=emfh.rclFrame.bottom-emfh.rclFrame.top; + return(hTemp); + } + /* + Aldus Placeable metafile. + */ + hFile=CreateFile(path,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, + NULL); + if (hFile == INVALID_HANDLE_VALUE) + return(NULL); + dwSize=GetFileSize(hFile,NULL); + pBits=(LPBYTE) AcquireQuantumMemory(dwSize,sizeof(*pBits)); + if (pBits == (LPBYTE) NULL) + { + CloseHandle(hFile); + return((HENHMETAFILE) NULL); + } + ReadFile(hFile,pBits,dwSize,&dwSize,NULL); + CloseHandle(hFile); + if (((PAPMHEADER) pBits)->dwKey != 0x9ac6cdd7l || + (((PAPMHEADER) pBits)->wInch == 0)) + { + pBits=(BYTE *) DestroyString((char *) pBits); + return((HENHMETAFILE) NULL); + } + /* + Make an enhanced metafile from the placable metafile. + */ + mp.mm=MM_ANISOTROPIC; + mp.xExt=((PAPMHEADER) pBits)->bbox.Right-((PAPMHEADER) pBits)->bbox.Left; + *width=mp.xExt; + mp.xExt=(mp.xExt*2540l)/(DWORD) (((PAPMHEADER) pBits)->wInch); + mp.yExt=((PAPMHEADER)pBits)->bbox.Bottom-((PAPMHEADER) pBits)->bbox.Top; + *height=mp.yExt; + mp.yExt=(mp.yExt*2540l)/(DWORD) (((PAPMHEADER) pBits)->wInch); + mp.hMF=NULL; + hDC=GetDC(NULL); + hTemp=SetWinMetaFileBits(dwSize,&(pBits[sizeof(APMHEADER)]),hDC,&mp); + ReleaseDC(NULL,hDC); + pBits=(BYTE *) DestroyString((char *) pBits); + return(hTemp); +} + +#define CENTIMETERS_INCH 2.54 + +static Image *ReadEMFImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + BITMAPINFO + DIBinfo; + + HBITMAP + hBitmap, + hOldBitmap; + + HDC + hDC; + + HENHMETAFILE + hemf; + + Image + *image; + + MagickBooleanType + status; + + RECT + rect; + + ssize_t + x; + + PixelPacket + *q; + + RGBQUAD + *pBits, + *ppBits; + + ssize_t + height, + width, + y; + + image=AcquireImage(image_info); + hemf=ReadEnhMetaFile(image_info->filename,&width,&height); + if (hemf == (HENHMETAFILE) NULL) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((image->columns == 0) || (image->rows == 0)) + { + double + y_resolution, + x_resolution; + + y_resolution=DefaultResolution; + x_resolution=DefaultResolution; + if (image->y_resolution > 0) + { + y_resolution=image->y_resolution; + if (image->units == PixelsPerCentimeterResolution) + y_resolution*=CENTIMETERS_INCH; + } + if (image->x_resolution > 0) + { + x_resolution=image->x_resolution; + if (image->units == PixelsPerCentimeterResolution) + x_resolution*=CENTIMETERS_INCH; + } + image->rows=(size_t) ((height/1000.0/CENTIMETERS_INCH)*y_resolution+0.5); + image->columns=(size_t) ((width/1000.0/CENTIMETERS_INCH)* + x_resolution+0.5); + } + if (image_info->size != (char *) NULL) + { + image->columns=width; + image->rows=height; + (void) GetGeometry(image_info->size,(ssize_t *) NULL,(ssize_t *) NULL, + &image->columns,&image->rows); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (image_info->page != (char *) NULL) + { + char + *geometry; + + char + *p; + + MagickStatusType + flags; + + ssize_t + sans; + + geometry=GetPageGeometry(image_info->page); + p=strchr(geometry,'>'); + if (p == (char *) NULL) + { + flags=ParseMetaGeometry(geometry,&sans,&sans,&image->columns, + &image->rows); + if (image->x_resolution != 0.0) + image->columns=(size_t) floor((image->columns*image->x_resolution)+ + 0.5); + if (image->y_resolution != 0.0) + image->rows=(size_t) floor((image->rows*image->y_resolution)+0.5); + } + else + { + *p='\0'; + flags=ParseMetaGeometry(geometry,&sans,&sans,&image->columns, + &image->rows); + if (image->x_resolution != 0.0) + image->columns=(size_t) floor(((image->columns*image->x_resolution)/ + DefaultResolution)+0.5); + if (image->y_resolution != 0.0) + image->rows=(size_t) floor(((image->rows*image->y_resolution)/ + DefaultResolution)+0.5); + } + (void) flags; + geometry=DestroyString(geometry); + } + hDC=GetDC(NULL); + if (hDC == (HDC) NULL) + { + DeleteEnhMetaFile(hemf); + ThrowReaderException(ResourceLimitError,"UnableToCreateADC"); + } + /* + Initialize the bitmap header info. + */ + (void) memset(&DIBinfo,0,sizeof(BITMAPINFO)); + DIBinfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); + DIBinfo.bmiHeader.biWidth=(LONG) image->columns; + DIBinfo.bmiHeader.biHeight=(-1)*(LONG) image->rows; + DIBinfo.bmiHeader.biPlanes=1; + DIBinfo.bmiHeader.biBitCount=32; + DIBinfo.bmiHeader.biCompression=BI_RGB; + hBitmap=CreateDIBSection(hDC,&DIBinfo,DIB_RGB_COLORS,(void **) &ppBits,NULL, + 0); + ReleaseDC(NULL,hDC); + if (hBitmap == (HBITMAP) NULL) + { + DeleteEnhMetaFile(hemf); + ThrowReaderException(ResourceLimitError,"UnableToCreateBitmap"); + } + hDC=CreateCompatibleDC(NULL); + if (hDC == (HDC) NULL) + { + DeleteEnhMetaFile(hemf); + DeleteObject(hBitmap); + ThrowReaderException(ResourceLimitError,"UnableToCreateADC"); + } + hOldBitmap=(HBITMAP) SelectObject(hDC,hBitmap); + if (hOldBitmap == (HBITMAP) NULL) + { + DeleteEnhMetaFile(hemf); + DeleteDC(hDC); + DeleteObject(hBitmap); + ThrowReaderException(ResourceLimitError,"UnableToCreateBitmap"); + } + /* + Initialize the bitmap to the image background color. + */ + pBits=ppBits; + for (y=0; y < (ssize_t) image->rows; y++) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + pBits->rgbRed=ScaleQuantumToChar(image->background_color.red); + pBits->rgbGreen=ScaleQuantumToChar(image->background_color.green); + pBits->rgbBlue=ScaleQuantumToChar(image->background_color.blue); + pBits++; + } + } + rect.top=0; + rect.left=0; + rect.right=(LONG) image->columns; + rect.bottom=(LONG) image->rows; + /* + Convert metafile pixels. + */ + PlayEnhMetaFile(hDC,hemf,&rect); + pBits=ppBits; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(pBits->rgbRed)); + SetPixelGreen(q,ScaleCharToQuantum(pBits->rgbGreen)); + SetPixelBlue(q,ScaleCharToQuantum(pBits->rgbBlue)); + SetPixelOpacity(q,OpaqueOpacity); + pBits++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + DeleteEnhMetaFile(hemf); + SelectObject(hDC,hOldBitmap); + DeleteDC(hDC); + DeleteObject(hBitmap); + return(GetFirstImageInList(image)); +} +# else + +static inline void EMFSetDimensions(Image * image,Gdiplus::Image *source) +{ + if ((image->x_resolution <= 0.0) || (image->y_resolution <= 0.0)) + return; + + image->columns=(size_t) floor((Gdiplus::REAL) source->GetWidth()/ + source->GetHorizontalResolution()*image->x_resolution+0.5); + image->rows=(size_t)floor((Gdiplus::REAL) source->GetHeight()/ + source->GetVerticalResolution()*image->y_resolution+0.5); +} + +static Image *ReadEMFImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Gdiplus::Bitmap + *bitmap; + + Gdiplus::BitmapData + bitmap_data; + + Gdiplus::GdiplusStartupInput + startup_input; + + Gdiplus::Graphics + *graphics; + + Gdiplus::Image + *source; + + Gdiplus::Rect + rect; + + GeometryInfo + geometry_info; + + Image + *image; + + MagickStatusType + flags; + + PixelPacket + *q; + + ssize_t + x; + + ssize_t + y; + + ULONG_PTR + token; + + unsigned char + *p; + + wchar_t + fileName[MaxTextExtent]; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + + image=AcquireImage(image_info); + if (Gdiplus::GdiplusStartup(&token,&startup_input,NULL) != + Gdiplus::Status::Ok) + ThrowReaderException(CoderError, "GdiplusStartupFailed"); + MultiByteToWideChar(CP_UTF8,0,image->filename,-1,fileName,MaxTextExtent); + source=Gdiplus::Image::FromFile(fileName); + if (source == (Gdiplus::Image *) NULL) + { + Gdiplus::GdiplusShutdown(token); + ThrowReaderException(FileOpenError,"UnableToOpenFile"); + } + + image->x_resolution=source->GetHorizontalResolution(); + image->y_resolution=source->GetVerticalResolution(); + image->columns=(size_t) source->GetWidth(); + image->rows=(size_t) source->GetHeight(); + if (image_info->size != (char *) NULL) + { + (void) GetGeometry(image_info->size,(ssize_t *) NULL,(ssize_t *) NULL, + &image->columns,&image->rows); + image->x_resolution=source->GetHorizontalResolution()*image->columns/ + source->GetWidth(); + image->y_resolution=source->GetVerticalResolution()*image->rows/ + source->GetHeight(); + if (image->x_resolution == 0) + image->x_resolution=image->y_resolution; + else if (image->y_resolution == 0) + image->y_resolution=image->x_resolution; + else + image->x_resolution=image->y_resolution=MagickMin( + image->x_resolution,image->y_resolution); + EMFSetDimensions(image,source); + } + else if (image_info->density != (char *) NULL) + { + flags=ParseGeometry(image_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + EMFSetDimensions(image,source); + } + if (SetImageExtent(image,image->columns,image->rows) == MagickFalse) + { + delete source; + Gdiplus::GdiplusShutdown(token); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + image->matte=MagickTrue; + if (image->ping != MagickFalse) + { + delete source; + Gdiplus::GdiplusShutdown(token); + return(image); + } + + bitmap=new Gdiplus::Bitmap((INT) image->columns,(INT) image->rows, + PixelFormat32bppARGB); + graphics=Gdiplus::Graphics::FromImage(bitmap); + graphics->SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic); + graphics->SetSmoothingMode(Gdiplus::SmoothingModeHighQuality); + graphics->SetTextRenderingHint(Gdiplus::TextRenderingHintClearTypeGridFit); + graphics->Clear(Gdiplus::Color((BYTE) ScaleQuantumToChar(QuantumRange- + image->background_color.opacity),(BYTE) ScaleQuantumToChar( + image->background_color.red),(BYTE) ScaleQuantumToChar( + image->background_color.green),(BYTE) ScaleQuantumToChar( + image->background_color.blue))); + graphics->DrawImage(source,0,0,(INT) image->columns,(INT) image->rows); + delete graphics; + delete source; + + rect=Gdiplus::Rect(0,0,(INT) image->columns,(INT) image->rows); + if (bitmap->LockBits(&rect,Gdiplus::ImageLockModeRead,PixelFormat32bppARGB, + &bitmap_data) != Gdiplus::Ok) + { + delete bitmap; + Gdiplus::GdiplusShutdown(token); + ThrowReaderException(FileOpenError,"UnableToReadImageData"); + } + + for (y=0; y < (ssize_t) image->rows; y++) + { + p=(unsigned char *) bitmap_data.Scan0+(y*abs(bitmap_data.Stride)); + if (bitmap_data.Stride < 0) + q=GetAuthenticPixels(image,0,image->rows-y-1,image->columns,1,exception); + else + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelAlpha(q,ScaleCharToQuantum(*p++)); + q++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + + bitmap->UnlockBits(&bitmap_data); + delete bitmap; + Gdiplus::GdiplusShutdown(token); + return(image); +} +# endif /* _MSC_VER */ +#endif /* MAGICKCORE_WINGDI32_DELEGATE */ + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r E M F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterEMFImage() adds attributes for the EMF image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterEMFImage method is: +% +% size_t RegisterEMFImage(void) +% +*/ +ModuleExport size_t RegisterEMFImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("EMF"); +#if defined(MAGICKCORE_WINGDI32_DELEGATE) + entry->decoder=ReadEMFImage; +#endif + entry->description=ConstantString( + "Windows Enhanced Meta File"); + entry->magick=(IsImageFormatHandler *) IsEMF; + entry->blob_support=MagickFalse; + entry->magick_module=ConstantString("EMF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("WMF"); +#if defined(MAGICKCORE_WINGDI32_DELEGATE) + entry->decoder=ReadEMFImage; +#endif + entry->description=ConstantString("Windows Meta File"); + entry->magick=(IsImageFormatHandler *) IsWMF; + entry->blob_support=MagickFalse; + entry->magick_module=ConstantString("EMF"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r E M F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterEMFImage() removes format registrations made by the +% EMF module from the list of supported formats. +% +% The format of the UnregisterEMFImage method is: +% +% UnregisterEMFImage(void) +% +*/ +ModuleExport void UnregisterEMFImage(void) +{ + (void) UnregisterMagickInfo("EMF"); + (void) UnregisterMagickInfo("WMF"); +} diff --git a/ImageMagick-6.9.12-44/coders/ept.c b/ImageMagick-6.9.12-44/coders/ept.c new file mode 100644 index 0000000..4050561 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/ept.c @@ -0,0 +1,502 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% EEEEE PPPP TTTTT % +% E P P T % +% EEE PPPP T % +% E P T % +% EEEEE P T % +% % +% % +% Read/Write Encapsulated Postscript Format (with preview). % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/color.h" +#include "magick/constitute.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/delegate.h" +#include "magick/geometry.h" +#include "magick/histogram.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantize.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/transform.h" +#include "magick/utility.h" + +/* + Typedef declarations. +*/ +typedef struct _EPTInfo +{ + size_t + magick; + + MagickOffsetType + postscript_offset, + tiff_offset; + + size_t + postscript_length, + tiff_length; + + unsigned char + *postscript, + *tiff; +} EPTInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteEPTImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s E P T % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsEPT() returns MagickTrue if the image format type, identified by the +% magick string, is EPT. +% +% The format of the IsEPT method is: +% +% MagickBooleanType IsEPT(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsEPT(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\305\320\323\306",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d E P T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadEPTImage() reads a binary Postscript image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadEPTImage method is: +% +% Image *ReadEPTImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadEPTImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + const void + *postscript_data, + *tiff_data; + + EPTInfo + ept_info; + + Image + *image; + + ImageInfo + *read_info; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + ssize_t + count; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + ept_info.magick=ReadBlobLSBLong(image); + if (ept_info.magick != 0xc6d3d0c5ul) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + ept_info.postscript_offset=(MagickOffsetType) ReadBlobLSBLong(image); + ept_info.postscript_length=ReadBlobLSBLong(image); + if ((MagickSizeType) ept_info.postscript_length > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + (void) ReadBlobLSBLong(image); + (void) ReadBlobLSBLong(image); + ept_info.tiff_offset=(MagickOffsetType) ReadBlobLSBLong(image); + ept_info.tiff_length=ReadBlobLSBLong(image); + if ((MagickSizeType) ept_info.tiff_length > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + (void) ReadBlobLSBShort(image); + ept_info.postscript=(unsigned char *) AcquireQuantumMemory( + ept_info.postscript_length+1,sizeof(*ept_info.postscript)); + if (ept_info.postscript == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(ept_info.postscript,0,(ept_info.postscript_length+1)* + sizeof(*ept_info.postscript)); + ept_info.tiff=(unsigned char *) AcquireQuantumMemory(ept_info.tiff_length+1, + sizeof(*ept_info.tiff)); + if (ept_info.tiff == (unsigned char *) NULL) + { + ept_info.postscript=(unsigned char *) RelinquishMagickMemory( + ept_info.postscript); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(ept_info.tiff,0,(ept_info.tiff_length+1)* + sizeof(*ept_info.tiff)); + offset=SeekBlob(image,ept_info.tiff_offset,SEEK_SET); + if ((ept_info.tiff_length != 0) && (offset < 30)) + { + ept_info.tiff=(unsigned char *) RelinquishMagickMemory(ept_info.tiff); + ept_info.postscript=(unsigned char *) RelinquishMagickMemory( + ept_info.postscript); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + tiff_data=ReadBlobStream(image,ept_info.tiff_length,ept_info.tiff,&count); + if (count != (ssize_t) (ept_info.tiff_length)) + (void) ThrowMagickException(exception,GetMagickModule(),CorruptImageWarning, + "InsufficientImageDataInFile","`%s'",image->filename); + offset=SeekBlob(image,ept_info.postscript_offset,SEEK_SET); + if ((ept_info.postscript_length != 0) && (offset < 30)) + { + ept_info.tiff=(unsigned char *) RelinquishMagickMemory(ept_info.tiff); + ept_info.postscript=(unsigned char *) RelinquishMagickMemory( + ept_info.postscript); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + postscript_data=ReadBlobStream(image,ept_info.postscript_length, + ept_info.postscript,&count); + if (count != (ssize_t) (ept_info.postscript_length)) + { + ept_info.tiff=(unsigned char *) RelinquishMagickMemory(ept_info.tiff); + ept_info.postscript=(unsigned char *) RelinquishMagickMemory( + ept_info.postscript); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + (void) CloseBlob(image); + image=DestroyImage(image); + read_info=CloneImageInfo(image_info); + (void) CopyMagickString(read_info->magick,"EPS",MagickPathExtent); + image=BlobToImage(read_info,postscript_data,ept_info.postscript_length, + exception); + if (image == (Image *) NULL) + { + (void) CopyMagickString(read_info->magick,"TIFF",MagickPathExtent); + image=BlobToImage(read_info,tiff_data,ept_info.tiff_length,exception); + } + read_info=DestroyImageInfo(read_info); + if (image != (Image *) NULL) + { + (void) CopyMagickString(image->filename,image_info->filename, + MagickPathExtent); + (void) CopyMagickString(image->magick,"EPT",MagickPathExtent); + } + ept_info.tiff=(unsigned char *) RelinquishMagickMemory(ept_info.tiff); + ept_info.postscript=(unsigned char *) RelinquishMagickMemory( + ept_info.postscript); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r E P T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterEPTImage() adds attributes for the EPT image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterEPTImage method is: +% +% size_t RegisterEPTImage(void) +% +*/ +ModuleExport size_t RegisterEPTImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("EPT"); + entry->decoder=(DecodeImageHandler *) ReadEPTImage; + entry->encoder=(EncodeImageHandler *) WriteEPTImage; + entry->magick=(IsImageFormatHandler *) IsEPT; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->blob_support=MagickFalse; + entry->description=ConstantString( + "Encapsulated PostScript with TIFF preview"); + entry->magick_module=ConstantString("EPT"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("EPT2"); + entry->decoder=(DecodeImageHandler *) ReadEPTImage; + entry->encoder=(EncodeImageHandler *) WriteEPTImage; + entry->magick=(IsImageFormatHandler *) IsEPT; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->description=ConstantString( + "Encapsulated PostScript Level II with TIFF preview"); + entry->magick_module=ConstantString("EPT"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("EPT3"); + entry->decoder=(DecodeImageHandler *) ReadEPTImage; + entry->encoder=(EncodeImageHandler *) WriteEPTImage; + entry->magick=(IsImageFormatHandler *) IsEPT; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->description=ConstantString( + "Encapsulated PostScript Level III with TIFF preview"); + entry->magick_module=ConstantString("EPT"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r E P T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterEPTImage() removes format registrations made by the +% EPT module from the list of supported formats. +% +% The format of the UnregisterEPTImage method is: +% +% UnregisterEPTImage(void) +% +*/ +ModuleExport void UnregisterEPTImage(void) +{ + (void) UnregisterMagickInfo("EPT"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e E P T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteEPTImage() writes an image in the Encapsulated Postscript format +% with a TIFF preview. +% +% The format of the WriteEPTImage method is: +% +% MagickBooleanType WriteEPTImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteEPTImage(const ImageInfo *image_info,Image *image) +{ + char + filename[MaxTextExtent]; + + EPTInfo + ept_info; + + Image + *write_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + /* + Write EPT image. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + write_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (write_image == (Image *) NULL) + return(MagickFalse); + write_info=CloneImageInfo(image_info); + (void) CopyMagickString(write_info->filename,"EPS:",MagickPathExtent); + (void) CopyMagickString(write_info->magick,"EPS",MagickPathExtent); + if (LocaleCompare(image_info->magick,"EPT2") == 0) + { + (void) CopyMagickString(write_info->filename,"EPS2:",MagickPathExtent); + (void) CopyMagickString(write_info->magick,"EPS2",MagickPathExtent); + } + if (LocaleCompare(image_info->magick,"EPT3") == 0) + { + (void) CopyMagickString(write_info->filename,"EPS3:",MagickPathExtent); + (void) CopyMagickString(write_info->magick,"EPS3",MagickPathExtent); + } + (void) memset(&ept_info,0,sizeof(ept_info)); + ept_info.magick=0xc6d3d0c5ul; + ept_info.postscript=(unsigned char *) ImageToBlob(write_info,write_image, + &ept_info.postscript_length,&image->exception); + write_image=DestroyImage(write_image); + write_info=DestroyImageInfo(write_info); + if (ept_info.postscript == (void *) NULL) + return(MagickFalse); + write_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (write_image == (Image *) NULL) + return(MagickFalse); + write_info=CloneImageInfo(image_info); + (void) CopyMagickString(write_info->magick,"TIFF",MaxTextExtent); + (void) FormatLocaleString(filename,MaxTextExtent,"tiff:%s", + write_info->filename); + (void) CopyMagickString(write_info->filename,filename,MaxTextExtent); + (void) TransformImage(&write_image,(char *) NULL,"512x512>"); + if ((write_image->storage_class == DirectClass) || + (write_image->colors > 256)) + { + QuantizeInfo + quantize_info; + + /* + EPT preview requires that the image is colormapped. + */ + GetQuantizeInfo(&quantize_info); + quantize_info.dither=IsPaletteImage(write_image,&image->exception) == + MagickFalse ? MagickTrue : MagickFalse; + (void) QuantizeImage(&quantize_info,write_image); + } + write_info->compression=NoCompression; + ept_info.tiff=(unsigned char *) ImageToBlob(write_info,write_image, + &ept_info.tiff_length,&image->exception); + write_image=DestroyImage(write_image); + write_info=DestroyImageInfo(write_info); + if (ept_info.tiff == (void *) NULL) + { + ept_info.postscript=(unsigned char *) RelinquishMagickMemory( + ept_info.postscript); + return(MagickFalse); + } + /* + Write EPT image. + */ + (void) WriteBlobLSBLong(image,(unsigned int) ept_info.magick); + (void) WriteBlobLSBLong(image,30); + (void) WriteBlobLSBLong(image,(unsigned int) ept_info.postscript_length); + (void) WriteBlobLSBLong(image,0); + (void) WriteBlobLSBLong(image,0); + (void) WriteBlobLSBLong(image,(unsigned int) ept_info.postscript_length+30); + (void) WriteBlobLSBLong(image,(unsigned int) ept_info.tiff_length); + (void) WriteBlobLSBShort(image,0xffff); + (void) WriteBlob(image,ept_info.postscript_length,ept_info.postscript); + (void) WriteBlob(image,ept_info.tiff_length,ept_info.tiff); + /* + Relinquish resources. + */ + ept_info.postscript=(unsigned char *) RelinquishMagickMemory( + ept_info.postscript); + ept_info.tiff=(unsigned char *) RelinquishMagickMemory(ept_info.tiff); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/exr.c b/ImageMagick-6.9.12-44/coders/exr.c new file mode 100644 index 0000000..2b9ea5d --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/exr.c @@ -0,0 +1,623 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% EEEEE X X RRRR % +% E X X R R % +% EEE X RRRR % +% E X X R R % +% EEEEE X X R R % +% % +% % +% Read/Write High Dynamic-Range (HDR) Image File Format % +% % +% Software Design % +% Cristy % +% April 2007 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/resource_.h" +#include "magick/utility.h" +#if defined(MAGICKCORE_OPENEXR_DELEGATE) +#include +#if IMF_VERSION_NUMBER > 1 +#include +#endif + +/* + Typedef declaractions. +*/ +typedef struct _EXRWindowInfo +{ + int + max_x, + max_y, + min_x, + min_y; +} EXRWindowInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteEXRImage(const ImageInfo *,Image *); +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s E X R % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsEXR() returns MagickTrue if the image format type, identified by the +% magick string, is EXR. +% +% The format of the IsEXR method is: +% +% MagickBooleanType IsEXR(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsEXR(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\166\057\061\001",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +#if defined(MAGICKCORE_OPENEXR_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d E X R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadEXRImage reads an image in the high dynamic-range (HDR) file format +% developed by Industrial Light & Magic. It allocates the memory necessary +% for the new Image structure and returns a pointer to the new image. +% +% The format of the ReadEXRImage method is: +% +% Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + const ImfHeader + *hdr_info; + + EXRWindowInfo + data_window, + display_window; + + Image + *image; + + ImfInputFile + *file; + + ImfRgba + *scanline; + + MagickBooleanType + status; + + PixelPacket + *q; + + size_t + columns; + + ssize_t + y; + + /* + Open image. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + file=ImfOpenInputFile(image->filename); + if (file == (ImfInputFile *) NULL) + { + ThrowFileException(exception,BlobError,"UnableToOpenBlob", + ImfErrorMessage()); + image=DestroyImageList(image); + return((Image *) NULL); + } + hdr_info=ImfInputHeader(file); + ImfHeaderDataWindow(hdr_info,&display_window.min_x,&display_window.min_y, + &display_window.max_x,&display_window.max_y); + image->columns=(size_t) (display_window.max_x-display_window.min_x+1UL); + image->rows=(size_t) (display_window.max_y-display_window.min_y+1UL); + image->matte=MagickTrue; + (void) SetImageColorspace(image,RGBColorspace); + image->gamma=1.0; + if (image_info->ping != MagickFalse) + { + (void) ImfCloseInputFile(file); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + (void) ImfCloseInputFile(file); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + ImfHeaderDataWindow(hdr_info,&data_window.min_x,&data_window.min_y, + &data_window.max_x,&data_window.max_y); + columns=(size_t) (data_window.max_x-data_window.min_x+1UL); + if ((display_window.min_x > data_window.max_x) || + (display_window.min_x+(int) image->columns <= data_window.min_x)) + scanline=(ImfRgba *) NULL; + else + { + scanline=(ImfRgba *) AcquireQuantumMemory(columns,sizeof(*scanline)); + if (scanline == (ImfRgba *) NULL) + { + (void) ImfCloseInputFile(file); + image=DestroyImageList(image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + for (y=0; y < (ssize_t) image->rows; y++) + { + int + yy; + + ssize_t + x; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + yy=(int) (display_window.min_y+y); + if ((yy < data_window.min_y) || (yy > data_window.max_y) || + (scanline == (ImfRgba *) NULL)) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,image->background_color.red); + SetPixelGreen(q,image->background_color.green); + SetPixelBlue(q,image->background_color.blue); + SetPixelOpacity(q,image->background_color.opacity); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + continue; + } + (void) memset(scanline,0,columns*sizeof(*scanline)); + if (ImfInputSetFrameBuffer(file,scanline-data_window.min_x-columns*yy,1, + columns) == 0) + { + status=MagickFalse; + break; + } + if (ImfInputReadPixels(file,yy,yy) == 0) + { + status=MagickFalse; + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + int + xx; + + xx=(int) (display_window.min_x+x-data_window.min_x); + if ((xx < 0) || (display_window.min_x+(int) x > data_window.max_x)) + { + SetPixelRed(q,image->background_color.red); + SetPixelGreen(q,image->background_color.green); + SetPixelBlue(q,image->background_color.blue); + SetPixelOpacity(q,image->background_color.opacity); + } + else + { + SetPixelRed(q,ClampToQuantum((MagickRealType) QuantumRange* + ImfHalfToFloat(scanline[xx].r))); + SetPixelGreen(q,ClampToQuantum((MagickRealType) QuantumRange* + ImfHalfToFloat(scanline[xx].g))); + SetPixelBlue(q,ClampToQuantum((MagickRealType) QuantumRange* + ImfHalfToFloat(scanline[xx].b))); + SetPixelAlpha(q,ClampToQuantum((MagickRealType) QuantumRange* + ImfHalfToFloat(scanline[xx].a))); + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + scanline=(ImfRgba *) RelinquishMagickMemory(scanline); + (void) ImfCloseInputFile(file); + if (status == MagickFalse) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r E X R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterEXRImage() adds properties for the EXR image format +% to the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterEXRImage method is: +% +% size_t RegisterEXRImage(void) +% +*/ +ModuleExport size_t RegisterEXRImage(void) +{ + char + version[MagickPathExtent]; + + MagickInfo + *entry; + + *version='\0'; + entry=SetMagickInfo("EXR"); +#if defined(MAGICKCORE_OPENEXR_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadEXRImage; + entry->encoder=(EncodeImageHandler *) WriteEXRImage; +#if defined( OPENEXR_PACKAGE_STRING) + (void) FormatLocaleString(version,MagickPathExtent,OPENEXR_PACKAGE_STRING); +#endif +#endif + entry->magick=(IsImageFormatHandler *) IsEXR; + if (*version != '\0') + entry->version=ConstantString(version); + entry->adjoin=MagickFalse; + entry->description=ConstantString("High Dynamic-range (HDR)"); + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->magick_module=ConstantString("EXR"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r E X R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterEXRImage() removes format registrations made by the +% EXR module from the list of supported formats. +% +% The format of the UnregisterEXRImage method is: +% +% UnregisterEXRImage(void) +% +*/ +ModuleExport void UnregisterEXRImage(void) +{ + (void) UnregisterMagickInfo("EXR"); +} + +#if defined(MAGICKCORE_OPENEXR_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e E X R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteEXRImage() writes an image to a file the in the high dynamic-range +% (HDR) file format developed by Industrial Light & Magic. +% +% The format of the WriteEXRImage method is: +% +% MagickBooleanType WriteEXRImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteEXRImage(const ImageInfo *image_info,Image *image) +{ + const char + *sampling_factor, + *value; + + ImageInfo + *write_info; + + ImfHalf + half_quantum; + + ImfHeader + *hdr_info; + + ImfOutputFile + *file; + + ImfRgba + *scanline; + + int + channels, + compression, + factors[3]; + + MagickBooleanType + status; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + y; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) SetImageColorspace(image,RGBColorspace); + write_info=CloneImageInfo(image_info); + (void) AcquireUniqueFilename(write_info->filename); + hdr_info=ImfNewHeader(); + ImfHeaderSetDataWindow(hdr_info,0,0,(int) image->columns-1,(int) + image->rows-1); + ImfHeaderSetDisplayWindow(hdr_info,0,0,(int) image->columns-1,(int) + image->rows-1); + compression=IMF_NO_COMPRESSION; + if (write_info->compression == ZipSCompression) + compression=IMF_ZIPS_COMPRESSION; + if (write_info->compression == ZipCompression) + compression=IMF_ZIP_COMPRESSION; + if (write_info->compression == PizCompression) + compression=IMF_PIZ_COMPRESSION; + if (write_info->compression == Pxr24Compression) + compression=IMF_PXR24_COMPRESSION; +#if defined(B44Compression) + if (write_info->compression == B44Compression) + compression=IMF_B44_COMPRESSION; +#endif +#if defined(B44ACompression) + if (write_info->compression == B44ACompression) + compression=IMF_B44A_COMPRESSION; +#endif + channels=0; + value=GetImageOption(image_info,"exr:color-type"); + if (value != (const char *) NULL) + { + if (LocaleCompare(value,"RGB") == 0) + channels=IMF_WRITE_RGB; + else if (LocaleCompare(value,"RGBA") == 0) + channels=IMF_WRITE_RGBA; + else if (LocaleCompare(value,"YC") == 0) + channels=IMF_WRITE_YC; + else if (LocaleCompare(value,"YCA") == 0) + channels=IMF_WRITE_YCA; + else if (LocaleCompare(value,"Y") == 0) + channels=IMF_WRITE_Y; + else if (LocaleCompare(value,"YA") == 0) + channels=IMF_WRITE_YA; + else if (LocaleCompare(value,"R") == 0) + channels=IMF_WRITE_R; + else if (LocaleCompare(value,"G") == 0) + channels=IMF_WRITE_G; + else if (LocaleCompare(value,"B") == 0) + channels=IMF_WRITE_B; + else if (LocaleCompare(value,"A") == 0) + channels=IMF_WRITE_A; + else + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CoderWarning,"ignoring invalid defined exr:color-type","=%s",value); + } + sampling_factor=(const char *) NULL; + factors[0]=0; + if (image_info->sampling_factor != (char *) NULL) + sampling_factor=image_info->sampling_factor; + if (sampling_factor != NULL) + { + /* + Sampling factors, valid values are 1x1 or 2x2. + */ + if (sscanf(sampling_factor,"%d:%d:%d",factors,factors+1,factors+2) == 3) + { + if ((factors[0] == factors[1]) && (factors[1] == factors[2])) + factors[0]=1; + else + if ((factors[0] == (2*factors[1])) && (factors[2] == 0)) + factors[0]=2; + } + else + if (sscanf(sampling_factor,"%dx%d",factors,factors+1) == 2) + { + if (factors[0] != factors[1]) + factors[0]=0; + } + if ((factors[0] != 1) && (factors[0] != 2)) + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CoderWarning,"ignoring sampling-factor","=%s",sampling_factor); + else if (channels != 0) + { + /* + Cross check given color type and subsampling. + */ + factors[1]=((channels == IMF_WRITE_YCA) || + (channels == IMF_WRITE_YC)) ? 2 : 1; + if (factors[0] != factors[1]) + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CoderWarning,"sampling-factor and color type mismatch","=%s", + sampling_factor); + } + } + if (channels == 0) + { + /* + If no color type given, select it now. + */ + if (factors[0] == 2) + channels=image->matte ? IMF_WRITE_YCA : IMF_WRITE_YC; + else + channels=image->matte ? IMF_WRITE_RGBA : IMF_WRITE_RGB; + } + ImfHeaderSetCompression(hdr_info,compression); + ImfHeaderSetLineOrder(hdr_info,IMF_INCREASING_Y); + file=ImfOpenOutputFile(write_info->filename,hdr_info,channels); + ImfDeleteHeader(hdr_info); + if (file == (ImfOutputFile *) NULL) + { + (void) RelinquishUniqueFileResource(write_info->filename); + write_info=DestroyImageInfo(write_info); + ThrowFileException(&image->exception,BlobError,"UnableToOpenBlob", + ImfErrorMessage()); + return(MagickFalse); + } + scanline=(ImfRgba *) AcquireQuantumMemory(image->columns,sizeof(*scanline)); + if (scanline == (ImfRgba *) NULL) + { + (void) ImfCloseOutputFile(file); + (void) RelinquishUniqueFileResource(write_info->filename); + write_info=DestroyImageInfo(write_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + memset(scanline,0,image->columns*sizeof(*scanline)); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + ImfFloatToHalf(QuantumScale*GetPixelRed(p),&half_quantum); + scanline[x].r=half_quantum; + ImfFloatToHalf(QuantumScale*GetPixelGreen(p),&half_quantum); + scanline[x].g=half_quantum; + ImfFloatToHalf(QuantumScale*GetPixelBlue(p),&half_quantum); + scanline[x].b=half_quantum; + if (image->matte == MagickFalse) + ImfFloatToHalf(1.0,&half_quantum); + else + ImfFloatToHalf(1.0-QuantumScale*GetPixelOpacity(p),&half_quantum); + scanline[x].a=half_quantum; + p++; + } + ImfOutputSetFrameBuffer(file,scanline-(y*image->columns),1,image->columns); + ImfOutputWritePixels(file,1); + } + (void) ImfCloseOutputFile(file); + scanline=(ImfRgba *) RelinquishMagickMemory(scanline); + (void) FileToImage(image,write_info->filename); + (void) RelinquishUniqueFileResource(write_info->filename); + write_info=DestroyImageInfo(write_info); + (void) CloseBlob(image); + return(MagickTrue); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/fax.c b/ImageMagick-6.9.12-44/coders/fax.c new file mode 100644 index 0000000..a5441a9 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/fax.c @@ -0,0 +1,407 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% FFFFF AAA X X % +% F A A X X % +% FFF AAAAA X % +% F A A X X % +% F A A X X % +% % +% % +% Read/Write Group 3 Fax Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/compress.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteFAXImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s F A X % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsFAX() returns MagickTrue if the image format type, identified by the +% magick string, is FAX. +% +% The format of the IsFAX method is: +% +% MagickBooleanType IsFAX(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +% +*/ +static MagickBooleanType IsFAX(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (LocaleNCompare((char *) magick,"DFAX",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d F A X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadFAXImage() reads a Group 3 FAX image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadFAXImage method is: +% +% Image *ReadFAXImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image* FaxReadG3(Image *image,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + status=HuffmanDecodeImage(image); + if (status == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnableToReadImageData", + image->filename); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +static Image* FaxReadG4(Image *image,const ImageInfo *image_info, + ExceptionInfo *exception) +{ + char + filename[MaxTextExtent]; + + ImageInfo + *read_info; + + filename[0]='\0'; + if (ImageToFile(image,filename,exception) == MagickFalse) + ThrowImageException(FileOpenError,"UnableToCreateTemporaryFile"); + (void) CloseBlob(image); + image=DestroyImage(image); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) FormatLocaleString(read_info->filename,MaxTextExtent,"group4:%s", + filename); + read_info->orientation=TopLeftOrientation; + image=ReadImage(read_info,exception); + if (image != (Image *) NULL) + { + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick_filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick,"G4",MaxTextExtent); + } + read_info=DestroyImageInfo(read_info); + (void) RelinquishUniqueFileResource(filename); + return(GetFirstImageInList(image)); +} + +static Image *ReadFAXImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Initialize image structure. + */ + image->storage_class=PseudoClass; + if (image->columns == 0) + image->columns=2592; + if (image->rows == 0) + image->rows=3508; + image->depth=8; + if (AcquireImageColormap(image,2) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Monochrome colormap. + */ + image->colormap[0].red=QuantumRange; + image->colormap[0].green=QuantumRange; + image->colormap[0].blue=QuantumRange; + image->colormap[1].red=(Quantum) 0; + image->colormap[1].green=(Quantum) 0; + image->colormap[1].blue=(Quantum) 0; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (LocaleCompare(image_info->magick,"G4") == 0) + return(FaxReadG4(image,image_info,exception)); + else + return(FaxReadG3(image,exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r F A X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterFAXImage() adds attributes for the FAX image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterFAXImage method is: +% +% size_t RegisterFAXImage(void) +% +*/ +ModuleExport size_t RegisterFAXImage(void) +{ + MagickInfo + *entry; + + static const char + *Note= + { + "FAX machines use non-square pixels which are 1.5 times wider than\n" + "they are tall but computer displays use square pixels, therefore\n" + "FAX images may appear to be narrow unless they are explicitly\n" + "resized using a geometry of \"150x100%\".\n" + }; + + entry=SetMagickInfo("FAX"); + entry->decoder=(DecodeImageHandler *) ReadFAXImage; + entry->encoder=(EncodeImageHandler *) WriteFAXImage; + entry->magick=(IsImageFormatHandler *) IsFAX; + entry->description=ConstantString("Group 3 FAX"); + entry->note=ConstantString(Note); + entry->magick_module=ConstantString("FAX"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("G3"); + entry->decoder=(DecodeImageHandler *) ReadFAXImage; + entry->encoder=(EncodeImageHandler *) WriteFAXImage; + entry->magick=(IsImageFormatHandler *) IsFAX; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Group 3 FAX"); + entry->magick_module=ConstantString("FAX"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("G4"); + entry->decoder=(DecodeImageHandler *) ReadFAXImage; + entry->encoder=(EncodeImageHandler *) WriteFAXImage; + entry->magick=(IsImageFormatHandler *) IsFAX; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Group 4 FAX"); + entry->magick_module=ConstantString("FAX"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r F A X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterFAXImage() removes format registrations made by the +% FAX module from the list of supported formats. +% +% The format of the UnregisterFAXImage method is: +% +% UnregisterFAXImage(void) +% +*/ +ModuleExport void UnregisterFAXImage(void) +{ + (void) UnregisterMagickInfo("FAX"); + (void) UnregisterMagickInfo("G3"); + (void) UnregisterMagickInfo("G4"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e F A X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteFAXImage() writes an image to a file in 1 dimensional Huffman encoded +% format. +% +% The format of the WriteFAXImage method is: +% +% MagickBooleanType WriteFAXImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteFAXImage(const ImageInfo *image_info,Image *image) +{ + ImageInfo + *write_info; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + size_t + imageListLength; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + write_info=CloneImageInfo(image_info); + (void) CopyMagickString(write_info->magick,"FAX",MaxTextExtent); + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Convert MIFF to monochrome. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + status=HuffmanEncodeImage(write_info,image,image); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (write_info->adjoin != MagickFalse); + write_info=DestroyImageInfo(write_info); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/fits.c b/ImageMagick-6.9.12-44/coders/fits.c new file mode 100644 index 0000000..1c7b568 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/fits.c @@ -0,0 +1,876 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% FFFFF IIIII TTTTT SSSSS % +% F I T SS % +% FFF I T SSS % +% F I T SS % +% F IIIII T SSSSS % +% % +% % +% Read/Write Flexible Image Transport System Images. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/locale-private.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +#define FITSBlocksize 2880UL + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteFITSImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s F I T S % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsFITS() returns MagickTrue if the image format type, identified by the +% magick string, is FITS. +% +% The format of the IsFITS method is: +% +% MagickBooleanType IsFITS(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsFITS(const unsigned char *magick,const size_t length) +{ + if (length < 6) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"IT0",3) == 0) + return(MagickTrue); + if (LocaleNCompare((const char *) magick,"SIMPLE",6) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d F I T S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadFITSImage() reads a FITS image file and returns it. It allocates the +% memory necessary for the new Image structure and returns a pointer to the +% new image. +% +% The format of the ReadFITSImage method is: +% +% Image *ReadFITSImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline double GetFITSPixel(Image *image,int bits_per_pixel) +{ + switch (image->depth >> 3) + { + case 1: + return((double) ReadBlobByte(image)); + case 2: + return((double) ((short) ReadBlobShort(image))); + case 4: + { + if (bits_per_pixel > 0) + return((double) ReadBlobSignedLong(image)); + return((double) ReadBlobFloat(image)); + } + case 8: + { + if (bits_per_pixel > 0) + return((double) ((MagickOffsetType) ReadBlobLongLong(image))); + } + default: + break; + } + return(ReadBlobDouble(image)); +} + +static MagickOffsetType GetFITSPixelExtrema(Image *image, + const int bits_per_pixel,double *minima,double *maxima) +{ + double + pixel; + + MagickOffsetType + offset; + + MagickSizeType + number_pixels; + + MagickOffsetType + i; + + offset=TellBlob(image); + if (offset == -1) + return(-1); + number_pixels=(MagickSizeType) image->columns*image->rows; + *minima=GetFITSPixel(image,bits_per_pixel); + *maxima=(*minima); + for (i=1; i < (MagickOffsetType) number_pixels; i++) + { + pixel=GetFITSPixel(image,bits_per_pixel); + if (pixel < *minima) + *minima=pixel; + if (pixel > *maxima) + *maxima=pixel; + } + return(SeekBlob(image,offset,SEEK_SET)); +} + +static inline double GetFITSPixelRange(const size_t depth) +{ + return((double) ((MagickOffsetType) GetQuantumRange(depth))); +} + +static void SetFITSUnsignedPixels(const size_t length, + const size_t bits_per_pixel,const EndianType endian,unsigned char *pixels) +{ + ssize_t + i; + + if (endian != MSBEndian) + pixels+=(bits_per_pixel >> 3)-1; + for (i=0; i < (ssize_t) length; i++) + { + *pixels^=0x80; + pixels+=bits_per_pixel >> 3; + } +} + +static Image *ReadFITSImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + typedef struct _FITSInfo + { + MagickBooleanType + extend, + simple; + + int + bits_per_pixel, + columns, + rows, + number_axes, + number_planes; + + double + min_data, + max_data, + zero, + scale; + + EndianType + endian; + } FITSInfo; + + char + *comment, + keyword[9], + property[MaxTextExtent], + value[73]; + + double + pixel, + scale; + + FITSInfo + fits_info; + + Image + *image; + + int + c; + + MagickBooleanType + status; + + MagickSizeType + number_pixels; + + ssize_t + i, + x; + + PixelPacket + *q; + + ssize_t + count, + scene, + y; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Initialize image header. + */ + (void) memset(&fits_info,0,sizeof(fits_info)); + fits_info.extend=MagickFalse; + fits_info.simple=MagickFalse; + fits_info.bits_per_pixel=8; + fits_info.columns=1; + fits_info.rows=1; + fits_info.number_axes=1; + fits_info.number_planes=1; + fits_info.min_data=0.0; + fits_info.max_data=0.0; + fits_info.zero=0.0; + fits_info.scale=1.0; + fits_info.endian=MSBEndian; + /* + Decode image header. + */ + for (comment=(char *) NULL; EOFBlob(image) == MagickFalse; ) + { + for ( ; EOFBlob(image) == MagickFalse; ) + { + char + *p; + + count=ReadBlob(image,8,(unsigned char *) keyword); + if (count != 8) + break; + for (i=0; i < 8; i++) + { + if (isspace((int) ((unsigned char) keyword[i])) != 0) + break; + keyword[i]=LocaleToLowercase((int) ((unsigned char) keyword[i])); + } + keyword[i]='\0'; + count=ReadBlob(image,72,(unsigned char *) value); + value[72]='\0'; + if (count != 72) + break; + p=value; + if (*p == '=') + { + p+=2; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + } + if (LocaleCompare(keyword,"end") == 0) + break; + if (LocaleCompare(keyword,"extend") == 0) + fits_info.extend=(*p == 'T') || (*p == 't') ? MagickTrue : MagickFalse; + if (LocaleCompare(keyword,"simple") == 0) + fits_info.simple=(*p == 'T') || (*p == 't') ? MagickTrue : MagickFalse; + if (LocaleCompare(keyword,"bitpix") == 0) + fits_info.bits_per_pixel=StringToLong(p); + if (LocaleCompare(keyword,"naxis") == 0) + fits_info.number_axes=StringToLong(p); + if (LocaleCompare(keyword,"naxis1") == 0) + fits_info.columns=StringToLong(p); + if (LocaleCompare(keyword,"naxis2") == 0) + fits_info.rows=StringToLong(p); + if (LocaleCompare(keyword,"naxis3") == 0) + fits_info.number_planes=StringToLong(p); + if (LocaleCompare(keyword,"datamax") == 0) + fits_info.max_data=StringToDouble(p,(char **) NULL); + if (LocaleCompare(keyword,"datamin") == 0) + fits_info.min_data=StringToDouble(p,(char **) NULL); + if (LocaleCompare(keyword,"bzero") == 0) + fits_info.zero=StringToDouble(p,(char **) NULL); + if (LocaleCompare(keyword,"bscale") == 0) + fits_info.scale=StringToDouble(p,(char **) NULL); + if (LocaleCompare(keyword,"comment") == 0) + { + if (comment == (char *) NULL) + comment=ConstantString(p); + else + (void) ConcatenateString(&comment,p); + } + if (LocaleCompare(keyword,"xendian") == 0) + { + if (LocaleNCompare(p,"big",3) == 0) + fits_info.endian=MSBEndian; + else + fits_info.endian=LSBEndian; + } + (void) FormatLocaleString(property,MaxTextExtent,"fits:%s",keyword); + (void) SetImageProperty(image,property,p); + } + c=0; + while (((TellBlob(image) % FITSBlocksize) != 0) && (c != EOF)) + c=ReadBlobByte(image); + if (fits_info.extend == MagickFalse) + break; + if ((fits_info.bits_per_pixel != 8) && (fits_info.bits_per_pixel != 16) && + (fits_info.bits_per_pixel != 32) && (fits_info.bits_per_pixel != 64) && + (fits_info.bits_per_pixel != -32) && (fits_info.bits_per_pixel != -64)) + { + if (comment != (char *) NULL) + comment=DestroyString(comment); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + if ((fits_info.columns <= 0) || (fits_info.rows <= 0) || + (fits_info.number_axes <= 0) || (fits_info.number_planes <= 0)) + { + if (comment != (char *) NULL) + comment=DestroyString(comment); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + number_pixels=(MagickSizeType) fits_info.columns*fits_info.rows; + if ((fits_info.simple != MagickFalse) && (fits_info.number_axes >= 1) && + (fits_info.number_axes <= 4) && (number_pixels != 0)) + break; + } + /* + Verify that required image information is defined. + */ + if (comment != (char *) NULL) + { + (void) SetImageProperty(image,"comment",comment); + comment=DestroyString(comment); + } + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + number_pixels=(MagickSizeType) fits_info.columns*fits_info.rows; + if ((fits_info.simple == MagickFalse) || (fits_info.number_axes < 1) || + (fits_info.number_axes > 4) || (number_pixels == 0) || + (fits_info.number_planes <= 0)) + ThrowReaderException(CorruptImageError,"ImageTypeNotSupported"); + for (scene=0; scene < (ssize_t) fits_info.number_planes; scene++) + { + image->columns=(size_t) fits_info.columns; + image->rows=(size_t) fits_info.rows; + image->depth=(size_t) (fits_info.bits_per_pixel < 0 ? -1 : 1)* + fits_info.bits_per_pixel; + image->endian=fits_info.endian; + image->scene=(size_t) scene; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Initialize image structure. + */ + (void) SetImageColorspace(image,GRAYColorspace); + if ((fits_info.min_data == 0.0) && (fits_info.max_data == 0.0)) + { + if ((fits_info.bits_per_pixel == -32) || + (fits_info.bits_per_pixel == -64)) + (void) GetFITSPixelExtrema(image,fits_info.bits_per_pixel, + &fits_info.min_data,&fits_info.max_data); + else + fits_info.max_data=GetFITSPixelRange((size_t) + fits_info.bits_per_pixel); + } + else + fits_info.max_data=GetFITSPixelRange((size_t) fits_info.bits_per_pixel); + /* + Convert FITS pixels to pixel packets. + */ + scale=QuantumRange*PerceptibleReciprocal(fits_info.max_data- + fits_info.min_data); + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=GetFITSPixel(image,fits_info.bits_per_pixel); + if ((image->depth == 16) || (image->depth == 32) || + (image->depth == 64)) + SetFITSUnsignedPixels(1,image->depth,image->endian,(unsigned char *) + &pixel); + SetPixelRed(q,ClampToQuantum(scale*(fits_info.scale*(pixel- + fits_info.min_data)+fits_info.zero))); + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (scene < (ssize_t) (fits_info.number_planes-1)) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r F I T S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterFITSImage() adds attributes for the FITS image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterFITSImage method is: +% +% size_t RegisterFITSImage(void) +% +*/ +ModuleExport size_t RegisterFITSImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("FITS"); + entry->decoder=(DecodeImageHandler *) ReadFITSImage; + entry->encoder=(EncodeImageHandler *) WriteFITSImage; + entry->magick=(IsImageFormatHandler *) IsFITS; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Flexible Image Transport System"); + entry->magick_module=ConstantString("FITS"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("FTS"); + entry->decoder=(DecodeImageHandler *) ReadFITSImage; + entry->encoder=(EncodeImageHandler *) WriteFITSImage; + entry->magick=(IsImageFormatHandler *) IsFITS; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Flexible Image Transport System"); + entry->magick_module=ConstantString("FITS"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r F I T S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterFITSImage() removes format registrations made by the +% FITS module from the list of supported formats. +% +% The format of the UnregisterFITSImage method is: +% +% UnregisterFITSImage(void) +% +*/ +ModuleExport void UnregisterFITSImage(void) +{ + (void) UnregisterMagickInfo("FITS"); + (void) UnregisterMagickInfo("FTS"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e F I T S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteFITSImage() writes a Flexible Image Transport System image to a +% file as gray scale intensities [0..255]. +% +% The format of the WriteFITSImage method is: +% +% MagickBooleanType WriteFITSImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static inline void CopyFitsRecord(char *buffer,const char *data, + const ssize_t offset) +{ + size_t + length; + + if (data == (char *) NULL) + return; + length=MagickMin(strlen(data),80); + if (length > (size_t) (FITSBlocksize-offset)) + length=(size_t) (FITSBlocksize-offset); + (void) strncpy(buffer+offset,data,length); +} + +static MagickBooleanType WriteFITSImage(const ImageInfo *image_info, + Image *image) +{ + char + *fits_info, + header[FITSBlocksize]; + + MagickBooleanType + status; + + QuantumInfo + *quantum_info; + + const PixelPacket + *p; + + size_t + length; + + ssize_t + count, + offset, + y; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Allocate image memory. + */ + fits_info=(char *) AcquireQuantumMemory(FITSBlocksize,sizeof(*fits_info)); + if (fits_info == (char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(fits_info,' ',FITSBlocksize*sizeof(*fits_info)); + /* + Initialize image header. + */ + image->depth=GetImageQuantumDepth(image,MagickFalse); + image->endian=MSBEndian; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + { + fits_info=DestroyString(fits_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + offset=0; + (void) FormatLocaleString(header,FITSBlocksize, + "SIMPLE = T"); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + (void) FormatLocaleString(header,FITSBlocksize,"BITPIX = %10ld", + (long) ((quantum_info->format == FloatingPointQuantumFormat ? -1 : 1)* + image->depth)); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + (void) FormatLocaleString(header,FITSBlocksize,"NAXIS = %10lu", + SetImageGray(image,&image->exception) != MagickFalse ? 2UL : 3UL); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + (void) FormatLocaleString(header,FITSBlocksize,"NAXIS1 = %10lu", + (unsigned long) image->columns); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + (void) FormatLocaleString(header,FITSBlocksize,"NAXIS2 = %10lu", + (unsigned long) image->rows); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + if (SetImageGray(image,&image->exception) == MagickFalse) + { + (void) FormatLocaleString(header,FITSBlocksize, + "NAXIS3 = %10lu",3UL); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + } + (void) FormatLocaleString(header,FITSBlocksize,"BSCALE = %E",1.0); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + (void) FormatLocaleString(header,FITSBlocksize,"BZERO = %E", + image->depth > 8 ? (GetFITSPixelRange(image->depth)+1)/2.0 : 0.0); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + (void) FormatLocaleString(header,FITSBlocksize,"DATAMAX = %E", + 1.0*((MagickOffsetType) GetQuantumRange(image->depth))); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + (void) FormatLocaleString(header,FITSBlocksize,"DATAMIN = %E",0.0); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + if (image->endian == LSBEndian) + { + (void) FormatLocaleString(header,FITSBlocksize,"XENDIAN = 'SMALL'"); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + } + (void) FormatLocaleString(header,FITSBlocksize,"HISTORY %.72s", + MagickAuthoritativeURL); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + (void) strncpy(header,"END",FITSBlocksize); + CopyFitsRecord(fits_info,header,offset); + offset+=80; + (void) WriteBlob(image,FITSBlocksize,(unsigned char *) fits_info); + /* + Convert image to fits scale PseudoColor class. + */ + pixels=GetQuantumPixels(quantum_info); + if (SetImageGray(image,&image->exception) != MagickFalse) + { + length=GetQuantumExtent(image,quantum_info,GrayQuantum); + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + GrayQuantum,pixels,&image->exception); + if (image->depth == 16) + SetFITSUnsignedPixels(image->columns,image->depth,image->endian, + pixels); + if (((image->depth == 32) || (image->depth == 64)) && + (quantum_info->format != FloatingPointQuantumFormat)) + SetFITSUnsignedPixels(image->columns,image->depth,image->endian, + pixels); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + else + { + length=GetQuantumExtent(image,quantum_info,RedQuantum); + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + RedQuantum,pixels,&image->exception); + if (image->depth == 16) + SetFITSUnsignedPixels(image->columns,image->depth,image->endian, + pixels); + if (((image->depth == 32) || (image->depth == 64)) && + (quantum_info->format != FloatingPointQuantumFormat)) + SetFITSUnsignedPixels(image->columns,image->depth,image->endian, + pixels); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + length=GetQuantumExtent(image,quantum_info,GreenQuantum); + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + GreenQuantum,pixels,&image->exception); + if (image->depth == 16) + SetFITSUnsignedPixels(image->columns,image->depth,image->endian, + pixels); + if (((image->depth == 32) || (image->depth == 64)) && + (quantum_info->format != FloatingPointQuantumFormat)) + SetFITSUnsignedPixels(image->columns,image->depth,image->endian, + pixels); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + length=GetQuantumExtent(image,quantum_info,BlueQuantum); + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + BlueQuantum,pixels,&image->exception); + if (image->depth == 16) + SetFITSUnsignedPixels(image->columns,image->depth,image->endian, + pixels); + if (((image->depth == 32) || (image->depth == 64)) && + (quantum_info->format != FloatingPointQuantumFormat)) + SetFITSUnsignedPixels(image->columns,image->depth,image->endian, + pixels); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + length=(size_t) (FITSBlocksize-TellBlob(image) % FITSBlocksize); + if (length != 0) + { + (void) memset(fits_info,0,length*sizeof(*fits_info)); + (void) WriteBlob(image,length,(unsigned char *) fits_info); + } + fits_info=DestroyString(fits_info); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/flif.c b/ImageMagick-6.9.12-44/coders/flif.c new file mode 100644 index 0000000..b576b86 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/flif.c @@ -0,0 +1,544 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% FFFFF L IIIII FFFFF % +% F L I F % +% FFF L I FFF % +% F L I F % +% F LLLLL IIIII F % +% % +% % +% Read/Write Free Lossless Image Format % +% % +% Software Design % +% Jon Sneyers % +% April 2016 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/client.h" +#include "magick/colorspace-private.h" +#include "magick/display.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/memory_.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/module.h" +#include "magick/utility.h" +#include "magick/xwindow.h" +#include "magick/xwindow-private.h" +#if defined(MAGICKCORE_FLIF_DELEGATE) +#include +#endif + +/* + Forward declarations. +*/ +#if defined(MAGICKCORE_FLIF_DELEGATE) +static MagickBooleanType + WriteFLIFImage(const ImageInfo *,Image *,ExceptionInfo *); +#endif + +#if defined(MAGICKCORE_FLIF_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d F L I F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadFLIFImage() reads an image in the FLIF image format. +% +% The format of the ReadFLIFImage method is: +% +% Image *ReadFLIFImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadFLIFImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + FLIF_DECODER + *flifdec; + + FLIF_IMAGE + *flifimage; + + Image + *image; + + MagickBooleanType + status; + + PixelPacket + *q; + + ssize_t + x; + + unsigned short + *p; + + size_t + count, + image_count, + length; + + ssize_t + y; + + unsigned char + *stream; + + unsigned short + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + length=(size_t) GetBlobSize(image); + stream=(unsigned char *) AcquireQuantumMemory(length,sizeof(*stream)); + if (stream == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,length,stream); + if (count != length) + { + stream=(unsigned char *) RelinquishMagickMemory(stream); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + flifdec=flif_create_decoder(); + if (image_info->quality != UndefinedCompressionQuality) + flif_decoder_set_quality(flifdec,image_info->quality); + if (!flif_decoder_decode_memory(flifdec,stream,length)) + { + flif_destroy_decoder(flifdec); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + image_count=flif_decoder_num_images(flifdec); + flifimage=flif_decoder_get_image(flifdec,0); + length=sizeof(unsigned short)*4*flif_image_get_width(flifimage); + pixels=(unsigned short *) AcquireQuantumMemory(1,length); + if (pixels == (unsigned short *) NULL) + { + flif_destroy_decoder(flifdec); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + + for (count=0; count < image_count; count++) + { + if (count > 0) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + } + flifimage=flif_decoder_get_image(flifdec,count); + image->columns=(size_t) flif_image_get_width(flifimage); + image->rows=(size_t) flif_image_get_height(flifimage); + image->depth=flif_image_get_depth(flifimage); + image->matte=(flif_image_get_nb_channels(flifimage) > 3 ? + MagickTrue : MagickFalse); + image->delay=flif_image_get_frame_delay(flifimage); + image->ticks_per_second=1000; + image->scene=count; + image->dispose=BackgroundDispose; + for (y=0; y < (ssize_t) image->rows; y++) + { + flif_image_read_row_RGBA16(flifimage,y,pixels,length); + p=pixels; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleShortToQuantum(*p++)); + SetPixelGreen(q,ScaleShortToQuantum(*p++)); + SetPixelBlue(q,ScaleShortToQuantum(*p++)); + SetPixelAlpha(q,ScaleShortToQuantum(*p++)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + flif_destroy_decoder(flifdec); + pixels=(unsigned short *) RelinquishMagickMemory(pixels); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(image); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s F L I F % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsFLIF() returns MagickTrue if the image format type, identified by the +% magick string, is FLIF. +% +% The format of the IsFLIF method is: +% +% MagickBooleanType IsFLIF(const unsigned char *magick, +% const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsFLIF(const unsigned char *magick, + const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (LocaleNCompare((char *) magick,"FLIF",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r F L I F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterFLIFImage() adds attributes for the FLIF image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterFLIFImage method is: +% +% size_t RegisterFLIFImage(void) +% +*/ +ModuleExport size_t RegisterFLIFImage(void) +{ + char + version[MaxTextExtent]; + + MagickInfo + *entry; + + *version='\0'; + entry=SetMagickInfo("FLIF"); +#if defined(MAGICKCORE_FLIF_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadFLIFImage; + entry->encoder=(EncodeImageHandler *) WriteFLIFImage; + (void) FormatLocaleString(version,MaxTextExtent,"libflif %d.%d.%d [%04X]", + (FLIF_VERSION >> 16) & 0xff, + (FLIF_VERSION >> 8) & 0xff, + (FLIF_VERSION >> 0) & 0xff,FLIF_ABI_VERSION); +#endif + entry->description=ConstantString("Free Lossless Image Format"); + entry->adjoin=MagickTrue; + entry->magick_module=ConstantString("FLIF"); + entry->mime_type=ConstantString("image/flif"); + entry->magick=(IsImageFormatHandler *) IsFLIF; + if (*version != '\0') + entry->version=ConstantString(version); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r F L I F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterFLIFImage() removes format registrations made by the FLIF module +% from the list of supported formats. +% +% The format of the UnregisterFLIFImage method is: +% +% UnregisterFLIFImage(void) +% +*/ +ModuleExport void UnregisterFLIFImage(void) +{ + (void) UnregisterMagickInfo("FLIF"); +} + +#if defined(MAGICKCORE_FLIF_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e F L I F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteFLIFImage() writes an image in the FLIF image format. +% +% The format of the WriteFLIFImage method is: +% +% MagickBooleanType WriteFLIFImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteFLIFImage(const ImageInfo *image_info, + Image *image, ExceptionInfo *exception) +{ + FLIF_ENCODER + *flifenc; + + FLIF_IMAGE + *flifimage; + + int + flif_status; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + unsigned char + *magick_restrict qc; + + unsigned short + *magick_restrict qs; + + size_t + columns, + imageListLength, + length, + rows; + + ssize_t + y; + + void + *buffer; + + void + *pixels; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((image->columns > 0xFFFF) || (image->rows > 0xFFFF)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); + if (status == MagickFalse) + return(status); + flifenc=flif_create_encoder(); + if (image_info->quality != UndefinedCompressionQuality) + flif_encoder_set_lossy(flifenc,3*(100-image_info->quality)); + + /* relatively fast encoding */ + flif_encoder_set_learn_repeat(flifenc,1); + flif_encoder_set_split_threshold(flifenc,5461*8*5); + + columns=image->columns; + rows=image->rows; + + /* Convert image to FLIFIMAGE */ + if (image->depth > 8) + { + flifimage=flif_create_image_HDR(image->columns,image->rows); + length=sizeof(unsigned short)*4*image->columns; + } + else + { + flifimage=flif_create_image(image->columns,image->rows); + length=sizeof(unsigned char)*4*image->columns; + } + if (flifimage == (FLIF_IMAGE *) NULL) + { + flif_destroy_encoder(flifenc); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=AcquireMagickMemory(length); + if (pixels == (void *) NULL) + { + flif_destroy_image(flifimage); + flif_destroy_encoder(flifenc); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + scene=0; + imageListLength=GetImageListLength(image); + do + { + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (PixelPacket *) NULL) + break; + + if (image->depth > 8) + { + qs=(unsigned short *) pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + *qs++=ScaleQuantumToShort(GetPixelRed(p)); + *qs++=ScaleQuantumToShort(GetPixelGreen(p)); + *qs++=ScaleQuantumToShort(GetPixelBlue(p)); + if (image->matte != MagickFalse) + *qs++=ScaleQuantumToShort(GetPixelAlpha(p)); + else + *qs++=0xFFFF; + p++; + } + flif_image_write_row_RGBA16(flifimage,y,pixels,length); + } + else + { + qc=pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + *qc++=ScaleQuantumToChar(GetPixelRed(p)); + *qc++=ScaleQuantumToChar(GetPixelGreen(p)); + *qc++=ScaleQuantumToChar(GetPixelBlue(p)); + if (image->matte != MagickFalse) + *qc++=ScaleQuantumToChar(GetPixelAlpha(p)); + else + *qc++=0xFF; + p++; + } + flif_image_write_row_RGBA8(flifimage,y,pixels,length); + } + } + flif_image_set_frame_delay(flifimage,image->delay*100/ + image->ticks_per_second); + flif_encoder_add_image(flifenc,flifimage); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + if ((columns != image->columns) || (rows != image->rows)) + { + flif_destroy_image(flifimage); + flif_destroy_encoder(flifenc); + pixels=RelinquishMagickMemory(pixels); + ThrowWriterException(ImageError,"FramesNotSameDimensions"); + } + scene++; + status=SetImageProgress(image,SaveImagesTag,scene,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + flif_destroy_image(flifimage); + pixels=RelinquishMagickMemory(pixels); + flif_status=flif_encoder_encode_memory(flifenc,&buffer,&length); + if (flif_status) + WriteBlob(image,length,buffer); + CloseBlob(image); + flif_destroy_encoder(flifenc); + buffer=RelinquishMagickMemory(buffer); + return(flif_status == 0 ? MagickFalse : MagickTrue); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/fpx.c b/ImageMagick-6.9.12-44/coders/fpx.c new file mode 100644 index 0000000..dcd9b98 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/fpx.c @@ -0,0 +1,1123 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% FFFFF PPPP X X % +% F P P X X % +% FFF PPPP X % +% F P X X % +% F P X X % +% % +% % +% Read/Write FlashPIX Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#if defined(MAGICKCORE_FPX_DELEGATE) +#if !defined(vms) && !defined(macintosh) && !defined(MAGICKCORE_WINDOWS_SUPPORT) +#include +#else +#include "Fpxlib.h" +#endif +#endif + +#if defined(MAGICKCORE_FPX_DELEGATE) +/* + Forward declarations. +*/ +static MagickBooleanType + WriteFPXImage(const ImageInfo *,Image *); +#endif + +#if defined(MAGICKCORE_FPX_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d F P X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadFPXImage() reads a FlashPix image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. This method was contributed by BillR@corbis.com. +% +% The format of the ReadFPXImage method is: +% +% Image *ReadFPXImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadFPXImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + const char + *option; + + FPXColorspace + colorspace; + + FPXImageComponentDesc + *alpha_component, + *blue_component, + *green_component, + *red_component; + + FPXImageDesc + fpx_info; + + FPXImageHandle + *flashpix; + + FPXStatus + fpx_status; + + FPXSummaryInformation + summary_info; + + Image + *image; + + IndexPacket + index; + + MagickBooleanType + status; + + IndexPacket + *indexes; + + ssize_t + i, + x; + + PixelPacket + *q; + + unsigned char + *a, + *b, + *g, + *r; + + size_t + memory_limit; + + ssize_t + y; + + unsigned char + *pixels; + + unsigned int + height, + tile_width, + tile_height, + width; + + size_t + scene; + + /* + Open image. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + (void) CloseBlob(image); + /* + Initialize FPX toolkit. + */ + fpx_status=FPX_InitSystem(); + if (fpx_status != FPX_OK) + ThrowReaderException(CoderError,"UnableToInitializeFPXLibrary"); + memory_limit=20000000; + fpx_status=FPX_SetToolkitMemoryLimit(&memory_limit); + if (fpx_status != FPX_OK) + { + FPX_ClearSystem(); + ThrowReaderException(CoderError,"UnableToInitializeFPXLibrary"); + } + tile_width=64; + tile_height=64; + flashpix=(FPXImageHandle *) NULL; + { +#if defined(macintosh) + FSSpec + fsspec; + + FilenameToFSSpec(image->filename,&fsspec); + fpx_status=FPX_OpenImageByFilename((const FSSpec &) fsspec,(char *) NULL, +#else + fpx_status=FPX_OpenImageByFilename(image->filename,(char *) NULL, +#endif + &width,&height,&tile_width,&tile_height,&colorspace,&flashpix); + } + if (fpx_status == FPX_LOW_MEMORY_ERROR) + { + FPX_ClearSystem(); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + if (fpx_status != FPX_OK) + { + FPX_ClearSystem(); + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + image->filename); + image=DestroyImageList(image); + return((Image *) NULL); + } + if (colorspace.numberOfComponents == 0) + { + FPX_ClearSystem(); + ThrowReaderException(CorruptImageError,"ImageTypeNotSupported"); + } + option=image_info->view; + if (option == (const char *) NULL) + option=GetImageOption(image_info,"fpx:view"); + if (option == (const char *) NULL) + { + float + aspect_ratio; + + /* + Get the aspect ratio. + */ + aspect_ratio=(float) width/height; + fpx_status=FPX_GetImageResultAspectRatio(flashpix,&aspect_ratio); + if (fpx_status != FPX_OK) + ThrowReaderException(DelegateError,"UnableToReadAspectRatio"); + if (width != (size_t) floor((aspect_ratio*height)+0.5)) + Swap(width,height); + } + fpx_status=FPX_GetSummaryInformation(flashpix,&summary_info); + if (fpx_status != FPX_OK) + { + FPX_ClearSystem(); + ThrowReaderException(DelegateError,"UnableToReadSummaryInfo"); + } + if (summary_info.title_valid) + if ((summary_info.title.length != 0) && + (summary_info.title.ptr != (unsigned char *) NULL)) + { + char + *label; + + /* + Note image label. + */ + label=(char *) NULL; + if (~summary_info.title.length >= (MaxTextExtent-1)) + label=(char *) AcquireQuantumMemory(summary_info.title.length+ + MaxTextExtent,sizeof(*label)); + if (label == (char *) NULL) + { + FPX_ClearSystem(); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) CopyMagickString(label,(char *) summary_info.title.ptr, + summary_info.title.length+1); + (void) SetImageProperty(image,"label",label); + label=DestroyString(label); + } + if (summary_info.comments_valid) + if ((summary_info.comments.length != 0) && + (summary_info.comments.ptr != (unsigned char *) NULL)) + { + char + *comments; + + /* + Note image comment. + */ + comments=(char *) NULL; + if (~summary_info.comments.length >= (MaxTextExtent-1)) + comments=(char *) AcquireQuantumMemory(summary_info.comments.length+ + MaxTextExtent,sizeof(*comments)); + if (comments == (char *) NULL) + { + FPX_ClearSystem(); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) CopyMagickString(comments,(char *) summary_info.comments.ptr, + summary_info.comments.length+1); + (void) SetImageProperty(image,"comment",comments); + comments=DestroyString(comments); + } + /* + Determine resolution by scene specification. + */ + for (i=1; ; i++) + if (((width >> i) < tile_width) || ((height >> i) < tile_height)) + break; + scene=i; + if (image_info->number_scenes != 0) + while (scene > image_info->scene) + { + width>>=1; + height>>=1; + scene--; + } + if (image_info->size != (char *) NULL) + while ((width > image->columns) || (height > image->rows)) + { + width>>=1; + height>>=1; + scene--; + } + image->depth=8; + image->columns=width; + image->rows=height; + if ((colorspace.numberOfComponents % 2) == 0) + image->matte=MagickTrue; + if (colorspace.numberOfComponents == 1) + { + /* + Create linear colormap. + */ + if (AcquireImageColormap(image,MaxColormapSize) == MagickFalse) + { + FPX_ClearSystem(); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + if (image_info->ping != MagickFalse) + { + (void) FPX_CloseImage(flashpix); + FPX_ClearSystem(); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Allocate memory for the image and pixel buffer. + */ + pixels=(unsigned char *) AcquireQuantumMemory(image->columns,(tile_height+ + 1UL)*colorspace.numberOfComponents*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + { + FPX_ClearSystem(); + (void) FPX_CloseImage(flashpix); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Initialize FlashPix image description. + */ + fpx_info.numberOfComponents=colorspace.numberOfComponents; + for (i=0; i < 4; i++) + { + fpx_info.components[i].myColorType.myDataType=DATA_TYPE_UNSIGNED_BYTE; + fpx_info.components[i].horzSubSampFactor=1; + fpx_info.components[i].vertSubSampFactor=1; + fpx_info.components[i].columnStride=fpx_info.numberOfComponents; + fpx_info.components[i].lineStride=image->columns* + fpx_info.components[i].columnStride; + fpx_info.components[i].theData=pixels+i; + } + fpx_info.components[0].myColorType.myColor=fpx_info.numberOfComponents > 2 ? + NIFRGB_R : MONOCHROME; + red_component=(&fpx_info.components[0]); + fpx_info.components[1].myColorType.myColor=fpx_info.numberOfComponents > 2 ? + NIFRGB_G : ALPHA; + green_component=(&fpx_info.components[1]); + fpx_info.components[2].myColorType.myColor=NIFRGB_B; + blue_component=(&fpx_info.components[2]); + fpx_info.components[3].myColorType.myColor=ALPHA; + alpha_component=(&fpx_info.components[fpx_info.numberOfComponents-1]); + FPX_SetResampleMethod(FPX_LINEAR_INTERPOLATION); + /* + Initialize image pixels. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + if ((y % tile_height) == 0) + { + /* + Read FPX image tile (with or without viewing affine). + */ + if (option != (const char *) NULL) + fpx_status=FPX_ReadImageRectangle(flashpix,0,y,image->columns,y+ + tile_height-1,scene,&fpx_info); + else + fpx_status=FPX_ReadImageTransformRectangle(flashpix,0.0F, + (float) y/image->rows,(float) image->columns/image->rows, + (float) (y+tile_height-1)/image->rows,(ssize_t) image->columns, + (ssize_t) tile_height,&fpx_info); + if (fpx_status == FPX_LOW_MEMORY_ERROR) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + (void) FPX_CloseImage(flashpix); + FPX_ClearSystem(); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + /* + Transfer a FPX pixels. + */ + r=red_component->theData+(y % tile_height)*red_component->lineStride; + g=green_component->theData+(y % tile_height)*green_component->lineStride; + b=blue_component->theData+(y % tile_height)*blue_component->lineStride; + a=alpha_component->theData+(y % tile_height)*alpha_component->lineStride; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (fpx_info.numberOfComponents > 2) + { + SetPixelRed(q,ScaleCharToQuantum(*r)); + SetPixelGreen(q,ScaleCharToQuantum(*g)); + SetPixelBlue(q,ScaleCharToQuantum(*b)); + } + else + { + index=ScaleCharToQuantum(*r); + SetPixelIndex(indexes+x,index); + SetPixelRed(q,index); + SetPixelGreen(q,index); + SetPixelBlue(q,index); + } + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + SetPixelAlpha(q,ScaleCharToQuantum(*a)); + q++; + r+=red_component->columnStride; + g+=green_component->columnStride; + b+=blue_component->columnStride; + a+=alpha_component->columnStride; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + (void) FPX_CloseImage(flashpix); + FPX_ClearSystem(); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r F P X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterFPXImage() adds attributes for the FPX image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterFPXImage method is: +% +% size_t RegisterFPXImage(void) +% +*/ +ModuleExport size_t RegisterFPXImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("FPX"); +#if defined(MAGICKCORE_FPX_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadFPXImage; + entry->encoder=(EncodeImageHandler *) WriteFPXImage; +#endif + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->description=ConstantString("FlashPix Format"); + entry->magick_module=ConstantString("FPX"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r F P X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterFPXImage() removes format registrations made by the +% FPX module from the list of supported formats. +% +% The format of the UnregisterFPXImage method is: +% +% UnregisterFPXImage(void) +% +*/ +ModuleExport void UnregisterFPXImage(void) +{ + (void) UnregisterMagickInfo("FPX"); +} + +#if defined(MAGICKCORE_FPX_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e F P X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteFPXImage() writes an image in the FlashPix image format. This +% method was contributed by BillR@corbis.com. +% +% The format of the WriteFPXImage method is: +% +% MagickBooleanType WriteFPXImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static void ColorTwistMultiply(FPXColorTwistMatrix first, + FPXColorTwistMatrix second,FPXColorTwistMatrix *color_twist) +{ + /* + Matrix multiply. + */ + assert(color_twist != (FPXColorTwistMatrix *) NULL); + color_twist->byy=(first.byy*second.byy)+(first.byc1*second.bc1y)+ + (first.byc2*second.bc2y)+(first.dummy1_zero*second.dummy4_zero); + color_twist->byc1=(first.byy*second.byc1)+(first.byc1*second.bc1c1)+ + (first.byc2*second.bc2c1)+(first.dummy1_zero*second.dummy5_zero); + color_twist->byc2=(first.byy*second.byc2)+(first.byc1*second.bc1c2)+ + (first.byc2*second.bc2c2)+(first.dummy1_zero*second.dummy6_zero); + color_twist->dummy1_zero=(first.byy*second.dummy1_zero)+ + (first.byc1*second.dummy2_zero)+(first.byc2*second.dummy3_zero)+ + (first.dummy1_zero*second.dummy7_one); + color_twist->bc1y=(first.bc1y*second.byy)+(first.bc1c1*second.bc1y)+ + (first.bc1c2*second.bc2y)+(first.dummy2_zero*second.dummy4_zero); + color_twist->bc1c1=(first.bc1y*second.byc1)+(first.bc1c1*second.bc1c1)+ + (first.bc1c2*second.bc2c1)+(first.dummy2_zero*second.dummy5_zero); + color_twist->bc1c2=(first.bc1y*second.byc2)+(first.bc1c1*second.bc1c2)+ + (first.bc1c2*second.bc2c2)+(first.dummy2_zero*second.dummy6_zero); + color_twist->dummy2_zero=(first.bc1y*second.dummy1_zero)+ + (first.bc1c1*second.dummy2_zero)+(first.bc1c2*second.dummy3_zero)+ + (first.dummy2_zero*second.dummy7_one); + color_twist->bc2y=(first.bc2y*second.byy)+(first.bc2c1*second.bc1y)+ + (first.bc2c2*second.bc2y)+(first.dummy3_zero*second.dummy4_zero); + color_twist->bc2c1=(first.bc2y*second.byc1)+(first.bc2c1*second.bc1c1)+ + (first.bc2c2*second.bc2c1)+(first.dummy3_zero*second.dummy5_zero); + color_twist->bc2c2=(first.bc2y*second.byc2)+(first.bc2c1*second.bc1c2)+ + (first.bc2c2*second.bc2c2)+(first.dummy3_zero*second.dummy6_zero); + color_twist->dummy3_zero=(first.bc2y*second.dummy1_zero)+ + (first.bc2c1*second.dummy2_zero)+(first.bc2c2*second.dummy3_zero)+ + (first.dummy3_zero*second.dummy7_one); + color_twist->dummy4_zero=(first.dummy4_zero*second.byy)+ + (first.dummy5_zero*second.bc1y)+(first.dummy6_zero*second.bc2y)+ + (first.dummy7_one*second.dummy4_zero); + color_twist->dummy5_zero=(first.dummy4_zero*second.byc1)+ + (first.dummy5_zero*second.bc1c1)+(first.dummy6_zero*second.bc2c1)+ + (first.dummy7_one*second.dummy5_zero); + color_twist->dummy6_zero=(first.dummy4_zero*second.byc2)+ + (first.dummy5_zero*second.bc1c2)+(first.dummy6_zero*second.bc2c2)+ + (first.dummy7_one*second.dummy6_zero); + color_twist->dummy7_one=(first.dummy4_zero*second.dummy1_zero)+ + (first.dummy5_zero*second.dummy2_zero)+ + (first.dummy6_zero*second.dummy3_zero)+(first.dummy7_one*second.dummy7_one); +} + +static void SetBrightness(double brightness,FPXColorTwistMatrix *color_twist) +{ + FPXColorTwistMatrix + effect, + result; + + /* + Set image brightness in color twist matrix. + */ + assert(color_twist != (FPXColorTwistMatrix *) NULL); + brightness=sqrt((double) brightness); + effect.byy=brightness; + effect.byc1=0.0; + effect.byc2=0.0; + effect.dummy1_zero=0.0; + effect.bc1y=0.0; + effect.bc1c1=brightness; + effect.bc1c2=0.0; + effect.dummy2_zero=0.0; + effect.bc2y=0.0; + effect.bc2c1=0.0; + effect.bc2c2=brightness; + effect.dummy3_zero=0.0; + effect.dummy4_zero=0.0; + effect.dummy5_zero=0.0; + effect.dummy6_zero=0.0; + effect.dummy7_one=1.0; + ColorTwistMultiply(*color_twist,effect,&result); + *color_twist=result; +} + +static void SetColorBalance(double red,double green,double blue, + FPXColorTwistMatrix *color_twist) +{ + FPXColorTwistMatrix + blue_effect, + green_effect, + result, + rgb_effect, + rg_effect, + red_effect; + + /* + Set image color balance in color twist matrix. + */ + assert(color_twist != (FPXColorTwistMatrix *) NULL); + red=sqrt((double) red)-1.0; + green=sqrt((double) green)-1.0; + blue=sqrt((double) blue)-1.0; + red_effect.byy=1.0; + red_effect.byc1=0.0; + red_effect.byc2=0.299*red; + red_effect.dummy1_zero=0.0; + red_effect.bc1y=(-0.299)*red; + red_effect.bc1c1=1.0-0.299*red; + red_effect.bc1c2=(-0.299)*red; + red_effect.dummy2_zero=0.0; + red_effect.bc2y=0.701*red; + red_effect.bc2c1=0.0; + red_effect.bc2c2=1.0+0.402*red; + red_effect.dummy3_zero=0.0; + red_effect.dummy4_zero=0.0; + red_effect.dummy5_zero=0.0; + red_effect.dummy6_zero=0.0; + red_effect.dummy7_one=1.0; + green_effect.byy=1.0; + green_effect.byc1=(-0.114)*green; + green_effect.byc2=(-0.299)*green; + green_effect.dummy1_zero=0.0; + green_effect.bc1y=(-0.587)*green; + green_effect.bc1c1=1.0-0.473*green; + green_effect.bc1c2=0.299*green; + green_effect.dummy2_zero=0.0; + green_effect.bc2y=(-0.587)*green; + green_effect.bc2c1=0.114*green; + green_effect.bc2c2=1.0-0.288*green; + green_effect.dummy3_zero=0.0; + green_effect.dummy4_zero=0.0; + green_effect.dummy5_zero=0.0; + green_effect.dummy6_zero=0.0; + green_effect.dummy7_one=1.0; + blue_effect.byy=1.0; + blue_effect.byc1=0.114*blue; + blue_effect.byc2=0.0; + blue_effect.dummy1_zero=0.0; + blue_effect.bc1y=0.886*blue; + blue_effect.bc1c1=1.0+0.772*blue; + blue_effect.bc1c2=0.0; + blue_effect.dummy2_zero=0.0; + blue_effect.bc2y=(-0.114)*blue; + blue_effect.bc2c1=(-0.114)*blue; + blue_effect.bc2c2=1.0-0.114*blue; + blue_effect.dummy3_zero=0.0; + blue_effect.dummy4_zero=0.0; + blue_effect.dummy5_zero=0.0; + blue_effect.dummy6_zero=0.0; + blue_effect.dummy7_one=1.0; + ColorTwistMultiply(red_effect,green_effect,&rg_effect); + ColorTwistMultiply(rg_effect,blue_effect,&rgb_effect); + ColorTwistMultiply(*color_twist,rgb_effect,&result); + *color_twist=result; +} + +static void SetSaturation(double saturation,FPXColorTwistMatrix *color_twist) +{ + FPXColorTwistMatrix + effect, + result; + + /* + Set image saturation in color twist matrix. + */ + assert(color_twist != (FPXColorTwistMatrix *) NULL); + effect.byy=1.0; + effect.byc1=0.0; + effect.byc2=0.0; + effect.dummy1_zero=0.0; + effect.bc1y=0.0; + effect.bc1c1=saturation; + effect.bc1c2=0.0; + effect.dummy2_zero=0.0; + effect.bc2y=0.0; + effect.bc2c1=0.0; + effect.bc2c2=saturation; + effect.dummy3_zero=0.0; + effect.dummy4_zero=0.0; + effect.dummy5_zero=0.0; + effect.dummy6_zero=0.0; + effect.dummy7_one=1.0; + ColorTwistMultiply(*color_twist,effect,&result); + *color_twist=result; +} + +static MagickBooleanType WriteFPXImage(const ImageInfo *image_info,Image *image) +{ + FPXBackground + background_color; + + FPXColorspace + colorspace = + { + TRUE, 4, + { + { NIFRGB_R, DATA_TYPE_UNSIGNED_BYTE }, + { NIFRGB_G, DATA_TYPE_UNSIGNED_BYTE }, + { NIFRGB_B, DATA_TYPE_UNSIGNED_BYTE }, + { ALPHA, DATA_TYPE_UNSIGNED_BYTE } + } + }; + + const char + *comment, + *label, + *option; + + FPXCompressionOption + compression; + + FPXImageDesc + fpx_info; + + FPXImageHandle + *flashpix; + + FPXStatus + fpx_status; + + FPXSummaryInformation + summary_info; + + MagickBooleanType + status; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + const PixelPacket + *p; + + ssize_t + i; + + size_t + memory_limit; + + ssize_t + y; + + unsigned char + *pixels; + + unsigned int + tile_height, + tile_width; + + /* + Open input file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + (void) CloseBlob(image); + /* + Initialize FPX toolkit. + */ + image->depth=8; + memory_limit=20000000; + fpx_status=FPX_SetToolkitMemoryLimit(&memory_limit); + if (fpx_status != FPX_OK) + ThrowWriterException(DelegateError,"UnableToInitializeFPXLibrary"); + tile_width=64; + tile_height=64; + colorspace.numberOfComponents=3; + if (image->matte != MagickFalse) + colorspace.numberOfComponents=4; + if ((image_info->type != TrueColorType) && + SetImageGray(image,&image->exception)) + { + colorspace.numberOfComponents=1; + colorspace.theComponents[0].myColor=MONOCHROME; + } + background_color.color1_value=0; + background_color.color2_value=0; + background_color.color3_value=0; + background_color.color4_value=0; + compression=NONE; + if (image->compression == JPEGCompression) + compression=JPEG_UNSPECIFIED; + if (image_info->compression == JPEGCompression) + compression=JPEG_UNSPECIFIED; + { +#if defined(macintosh) + FSSpec + fsspec; + + FilenameToFSSpec(filename,&fsspec); + fpx_status=FPX_CreateImageByFilename((const FSSpec &) fsspec,image->columns, +#else + fpx_status=FPX_CreateImageByFilename(image->filename,image->columns, +#endif + image->rows,tile_width,tile_height,colorspace,background_color, + compression,&flashpix); + } + if (fpx_status != FPX_OK) + return(status); + if (compression == JPEG_UNSPECIFIED) + { + /* + Initialize the compression by quality for the entire image. + */ + fpx_status=FPX_SetJPEGCompression(flashpix,(unsigned short) + image->quality == UndefinedCompressionQuality ? 75 : image->quality); + if (fpx_status != FPX_OK) + ThrowWriterException(DelegateError,"UnableToSetJPEGLevel"); + } + /* + Set image summary info. + */ + summary_info.title_valid=MagickFalse; + summary_info.subject_valid=MagickFalse; + summary_info.author_valid=MagickFalse; + summary_info.comments_valid=MagickFalse; + summary_info.keywords_valid=MagickFalse; + summary_info.OLEtemplate_valid=MagickFalse; + summary_info.last_author_valid=MagickFalse; + summary_info.rev_number_valid=MagickFalse; + summary_info.edit_time_valid=MagickFalse; + summary_info.last_printed_valid=MagickFalse; + summary_info.create_dtm_valid=MagickFalse; + summary_info.last_save_dtm_valid=MagickFalse; + summary_info.page_count_valid=MagickFalse; + summary_info.word_count_valid=MagickFalse; + summary_info.char_count_valid=MagickFalse; + summary_info.thumbnail_valid=MagickFalse; + summary_info.appname_valid=MagickFalse; + summary_info.security_valid=MagickFalse; + summary_info.title.ptr=(unsigned char *) NULL; + label=GetImageProperty(image,"label"); + if (label != (const char *) NULL) + { + size_t + length; + + /* + Note image label. + */ + summary_info.title_valid=MagickTrue; + length=strlen(label); + summary_info.title.length=length; + if (~length >= (MaxTextExtent-1)) + summary_info.title.ptr=(unsigned char *) AcquireQuantumMemory( + length+MaxTextExtent,sizeof(*summary_info.title.ptr)); + if (summary_info.title.ptr == (unsigned char *) NULL) + ThrowWriterException(DelegateError,"UnableToSetImageTitle"); + (void) CopyMagickString((char *) summary_info.title.ptr,label, + MaxTextExtent); + } + comment=GetImageProperty(image,"comment"); + if (comment != (const char *) NULL) + { + /* + Note image comment. + */ + summary_info.comments_valid=MagickTrue; + summary_info.comments.ptr=(unsigned char *) AcquireString(comment); + summary_info.comments.length=strlen(comment); + } + fpx_status=FPX_SetSummaryInformation(flashpix,&summary_info); + if (fpx_status != FPX_OK) + ThrowWriterException(DelegateError,"UnableToSetSummaryInfo"); + /* + Initialize FlashPix image description. + */ + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + fpx_info.numberOfComponents=colorspace.numberOfComponents; + for (i=0; i < (ssize_t) fpx_info.numberOfComponents; i++) + { + fpx_info.components[i].myColorType.myDataType=DATA_TYPE_UNSIGNED_BYTE; + fpx_info.components[i].horzSubSampFactor=1; + fpx_info.components[i].vertSubSampFactor=1; + fpx_info.components[i].columnStride=fpx_info.numberOfComponents; + fpx_info.components[i].lineStride= + image->columns*fpx_info.components[i].columnStride; + fpx_info.components[i].theData=pixels+i; + } + fpx_info.components[0].myColorType.myColor=fpx_info.numberOfComponents != 1 ? + NIFRGB_R : MONOCHROME; + fpx_info.components[1].myColorType.myColor=NIFRGB_G; + fpx_info.components[2].myColorType.myColor=NIFRGB_B; + fpx_info.components[3].myColorType.myColor=ALPHA; + /* + Write image pixels. + */ + quantum_type=RGBQuantum; + if (image->matte != MagickFalse) + quantum_type=RGBAQuantum; + if (fpx_info.numberOfComponents == 1) + quantum_type=GrayQuantum; + for (y=0; y < (ssize_t) image->rows; y++) + { + size_t + length; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + quantum_type,pixels,&image->exception); + (void) length; + fpx_status=FPX_WriteImageLine(flashpix,&fpx_info); + if (fpx_status != FPX_OK) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + option=image_info->view; + if (option == (const char *) NULL) + option=GetImageOption(image_info,"fpx:view"); + if (option != (const char *) NULL) + { + FPXAffineMatrix + affine; + + FPXColorTwistMatrix + color_twist; + + FPXContrastAdjustment + contrast; + + FPXFilteringValue + sharpen; + + FPXResultAspectRatio + aspect_ratio; + + FPXROI + view_rect; + + MagickBooleanType + affine_valid, + aspect_ratio_valid, + color_twist_valid, + contrast_valid, + sharpen_valid, + view_rect_valid; + + /* + Initialize default viewing parameters. + */ + contrast=1.0; + contrast_valid=MagickTrue; + color_twist.byy=1.0; + color_twist.byc1=0.0; + color_twist.byc2=0.0; + color_twist.dummy1_zero=0.0; + color_twist.bc1y=0.0; + color_twist.bc1c1=1.0; + color_twist.bc1c2=0.0; + color_twist.dummy2_zero=0.0; + color_twist.bc2y=0.0; + color_twist.bc2c1=0.0; + color_twist.bc2c2=1.0; + color_twist.dummy3_zero=0.0; + color_twist.dummy4_zero=0.0; + color_twist.dummy5_zero=0.0; + color_twist.dummy6_zero=0.0; + color_twist.dummy7_one=1.0; + color_twist_valid=MagickTrue; + sharpen=0.0; + sharpen_valid=MagickTrue; + aspect_ratio=(double) image->columns/image->rows; + aspect_ratio_valid=MagickTrue; + view_rect.left=(float) 0.1; + view_rect.width=aspect_ratio-0.2; + view_rect.top=(float) 0.1; + view_rect.height=(float) 0.8; /* 1.0-0.2 */ + view_rect_valid=MagickTrue; + affine.a11=1.0; + affine.a12=0.0; + affine.a13=0.0; + affine.a14=0.0; + affine.a21=0.0; + affine.a22=1.0; + affine.a23=0.0; + affine.a24=0.0; + affine.a31=0.0; + affine.a32=0.0; + affine.a33=1.0; + affine.a34=0.0; + affine.a41=0.0; + affine.a42=0.0; + affine.a43=0.0; + affine.a44=1.0; + affine_valid=MagickTrue; + if (0) + { + /* + Color color twist. + */ + SetBrightness(0.5,&color_twist); + SetSaturation(0.5,&color_twist); + SetColorBalance(0.5,1.0,1.0,&color_twist); + color_twist_valid=MagickTrue; + } + if (affine_valid != MagickFalse) + { + fpx_status=FPX_SetImageAffineMatrix(flashpix,&affine); + if (fpx_status != FPX_OK) + ThrowWriterException(DelegateError,"UnableToSetAffineMatrix"); + } + if (aspect_ratio_valid != MagickFalse) + { + fpx_status=FPX_SetImageResultAspectRatio(flashpix,&aspect_ratio); + if (fpx_status != FPX_OK) + ThrowWriterException(DelegateError,"UnableToSetAspectRatio"); + } + if (color_twist_valid != MagickFalse) + { + fpx_status=FPX_SetImageColorTwistMatrix(flashpix,&color_twist); + if (fpx_status != FPX_OK) + ThrowWriterException(DelegateError,"UnableToSetColorTwist"); + } + if (contrast_valid != MagickFalse) + { + fpx_status=FPX_SetImageContrastAdjustment(flashpix,&contrast); + if (fpx_status != FPX_OK) + ThrowWriterException(DelegateError,"UnableToSetContrast"); + } + if (sharpen_valid != MagickFalse) + { + fpx_status=FPX_SetImageFilteringValue(flashpix,&sharpen); + if (fpx_status != FPX_OK) + ThrowWriterException(DelegateError,"UnableToSetFilteringValue"); + } + if (view_rect_valid != MagickFalse) + { + fpx_status=FPX_SetImageROI(flashpix,&view_rect); + if (fpx_status != FPX_OK) + ThrowWriterException(DelegateError,"UnableToSetRegionOfInterest"); + } + } + (void) FPX_CloseImage(flashpix); + FPX_ClearSystem(); + return(MagickTrue); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/ghostscript-private.h b/ImageMagick-6.9.12-44/coders/ghostscript-private.h new file mode 100644 index 0000000..0bb1421 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/ghostscript-private.h @@ -0,0 +1,271 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#ifndef MAGICK_GHOSTSCRIPT_BUFFER_PRIVATE_H +#define MAGICK_GHOSTSCRIPT_BUFFER_PRIVATE_H + +#include "coders/bytebuffer-private.h" + +#if defined(MAGICKCORE_GS_DELEGATE) || defined(MAGICKCORE_WINDOWS_SUPPORT) +static int MagickDLLCall GhostscriptDelegateMessage(void *handle, + const char *message,int length) +{ + char + **messages; + + ssize_t + offset; + + offset=0; + messages=(char **) handle; + if (*messages == (char *) NULL) + *messages=(char *) AcquireQuantumMemory((size_t) length+1,sizeof(char *)); + else + { + offset=(ssize_t) strlen(*messages); + *messages=(char *) ResizeQuantumMemory(*messages,(size_t) (offset+length+ + 1),sizeof(char *)); + } + if (*messages == (char *) NULL) + return(0); + (void) memcpy(*messages+offset,message,(size_t) length); + (*messages)[length+offset] ='\0'; + return(length); +} + +static double GhostscriptVersion(const GhostInfo *ghost_info) +{ + gsapi_revision_t + revision; + + if ((ghost_info->revision)(&revision,(int) sizeof(revision)) != 0) + return(0.0); + if (revision.revision > 1000) + return(revision.revision/1000.0); + return(revision.revision/100.0); +} +#endif + +static inline MagickBooleanType InvokeGhostscriptDelegate( + const MagickBooleanType verbose,const char *command,char *message, + ExceptionInfo *exception) +{ + int + status; + +#if defined(MAGICKCORE_GS_DELEGATE) || defined(MAGICKCORE_WINDOWS_SUPPORT) +#define SetArgsStart(command,args_start) \ + if (args_start == (const char *) NULL) \ + { \ + if (*command != '"') \ + args_start=strchr(command,' '); \ + else \ + { \ + args_start=strchr(command+1,'"'); \ + if (args_start != (const char *) NULL) \ + args_start++; \ + } \ + } + +#define ExecuteGhostscriptCommand(command,status) \ +{ \ + status=ExternalDelegateCommand(MagickFalse,verbose,command,message, \ + exception); \ + if (status == 0) \ + return(MagickTrue); \ + if (status < 0) \ + return(MagickFalse); \ + (void) ThrowMagickException(exception,GetMagickModule(),DelegateError, \ + "FailedToExecuteCommand","`%s' (%d)",command,status); \ + return(MagickFalse); \ +} + + char + **argv, + *errors; + + const char + *args_start = (const char *) NULL; + + const GhostInfo + *ghost_info; + + gs_main_instance + *interpreter; + + int + argc, + code; + + ssize_t + i; + +#if defined(MAGICKCORE_WINDOWS_SUPPORT) + ghost_info=NTGhostscriptDLLVectors(); +#else + GhostInfo + ghost_info_struct; + + ghost_info=(&ghost_info_struct); + (void) memset(&ghost_info_struct,0,sizeof(ghost_info_struct)); + ghost_info_struct.delete_instance=(void (*)(gs_main_instance *)) + gsapi_delete_instance; + ghost_info_struct.exit=(int (*)(gs_main_instance *)) gsapi_exit; + ghost_info_struct.new_instance=(int (*)(gs_main_instance **,void *)) + gsapi_new_instance; + ghost_info_struct.init_with_args=(int (*)(gs_main_instance *,int,char **)) + gsapi_init_with_args; + ghost_info_struct.run_string=(int (*)(gs_main_instance *,const char *,int, + int *)) gsapi_run_string; + ghost_info_struct.set_stdio=(int (*)(gs_main_instance *,int (*)(void *,char *, + int),int (*)(void *,const char *,int),int (*)(void *, const char *, int))) + gsapi_set_stdio; + ghost_info_struct.revision=(int (*)(gsapi_revision_t *,int)) gsapi_revision; +#endif + if (ghost_info == (GhostInfo *) NULL) + ExecuteGhostscriptCommand(command,status); + if (verbose != MagickFalse) + { + (void) fprintf(stdout,"[ghostscript library %.2f]", + GhostscriptVersion(ghost_info)); + SetArgsStart(command,args_start); + (void) fputs(args_start,stdout); + } + interpreter=(gs_main_instance *) NULL; + errors=(char *) NULL; + status=(ghost_info->new_instance)(&interpreter,(void *) &errors); + if (status < 0) + ExecuteGhostscriptCommand(command,status); + code=0; + argv=StringToArgv(command,&argc); + if (argv == (char **) NULL) + { + (ghost_info->delete_instance)(interpreter); + return(MagickFalse); + } + (void) (ghost_info->set_stdio)(interpreter,(int (MagickDLLCall *)(void *, + char *,int)) NULL,GhostscriptDelegateMessage,GhostscriptDelegateMessage); + status=(ghost_info->init_with_args)(interpreter,argc-1,argv+1); + if (status == 0) + status=(ghost_info->run_string)(interpreter,"systemdict /start get exec\n", + 0,&code); + (ghost_info->exit)(interpreter); + (ghost_info->delete_instance)(interpreter); + for (i=0; i < (ssize_t) argc; i++) + argv[i]=DestroyString(argv[i]); + argv=(char **) RelinquishMagickMemory(argv); + if (status != 0) + { + SetArgsStart(command,args_start); + if (status == -101) /* quit */ + (void) FormatLocaleString(message,MaxTextExtent, + "[ghostscript library %.2f]%s: %s",GhostscriptVersion(ghost_info), + args_start,errors); + else + { + (void) ThrowMagickException(exception,GetMagickModule(), + DelegateError,"PostscriptDelegateFailed", + "`[ghostscript library %.2f]%s': %s",GhostscriptVersion(ghost_info), + args_start,errors); + if (errors != (char *) NULL) + errors=DestroyString(errors); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Ghostscript returns status %d, exit code %d",status,code); + return(MagickFalse); + } + } + if (errors != (char *) NULL) + errors=DestroyString(errors); + return(MagickTrue); +#else + status=ExternalDelegateCommand(MagickFalse,verbose,command,(char *) NULL, + exception); + return(status == 0 ? MagickTrue : MagickFalse); +#endif +} + +static MagickBooleanType IsGhostscriptRendered(const char *path) +{ + MagickBooleanType + status; + + struct stat + attributes; + + if ((path == (const char *) NULL) || (*path == '\0')) + return(MagickFalse); + status=GetPathAttributes(path,&attributes); + if ((status != MagickFalse) && S_ISREG(attributes.st_mode) && + (attributes.st_size > 0)) + return(MagickTrue); + return(MagickFalse); +} + +static inline void ReadGhostScriptXMPProfile(MagickByteBuffer *buffer, + StringInfo **profile) +{ +#define BeginXMPPacket "?xpacket begin=" +#define EndXMPPacket "') + break; + } + } + SetStringInfoLength(*profile,(size_t) count); +} + +#endif diff --git a/ImageMagick-6.9.12-44/coders/gif.c b/ImageMagick-6.9.12-44/coders/gif.c new file mode 100644 index 0000000..4010cab --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/gif.c @@ -0,0 +1,1974 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% GGGG IIIII FFFFF % +% G I F % +% G GG I FFF % +% G G I F % +% GGG IIIII F % +% % +% % +% Read/Write Compuserv Graphics Interchange Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/profile.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/module.h" + +/* + Define declarations. +*/ +#define MaximumLZWBits 12 +#define MaximumLZWCode (1UL << MaximumLZWBits) + +/* + Typdef declarations. +*/ +typedef struct _LZWCodeInfo +{ + unsigned char + buffer[280]; + + size_t + count, + bit; + + MagickBooleanType + eof; +} LZWCodeInfo; + +typedef struct _LZWStack +{ + size_t + *codes, + *index, + *top; +} LZWStack; + +typedef struct _LZWInfo +{ + Image + *image; + + LZWStack + *stack; + + MagickBooleanType + genesis; + + size_t + data_size, + maximum_data_value, + clear_code, + end_code, + bits, + first_code, + last_code, + maximum_code, + slot, + *table[2]; + + LZWCodeInfo + code_info; +} LZWInfo; + +/* + Forward declarations. +*/ +static inline int + GetNextLZWCode(LZWInfo *,const size_t); + +static MagickBooleanType + WriteGIFImage(const ImageInfo *,Image *); + +static ssize_t + ReadBlobBlock(Image *,unsigned char *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DecodeImage uncompresses an image via GIF-coding. +% +% The format of the DecodeImage method is: +% +% MagickBooleanType DecodeImage(Image *image,const ssize_t opacity) +% +% A description of each parameter follows: +% +% o image: the address of a structure of type Image. +% +% o opacity: The colormap index associated with the transparent color. +% +*/ + +static LZWInfo *RelinquishLZWInfo(LZWInfo *lzw_info) +{ + if (lzw_info->table[0] != (size_t *) NULL) + lzw_info->table[0]=(size_t *) RelinquishMagickMemory( + lzw_info->table[0]); + if (lzw_info->table[1] != (size_t *) NULL) + lzw_info->table[1]=(size_t *) RelinquishMagickMemory( + lzw_info->table[1]); + if (lzw_info->stack != (LZWStack *) NULL) + { + if (lzw_info->stack->codes != (size_t *) NULL) + lzw_info->stack->codes=(size_t *) RelinquishMagickMemory( + lzw_info->stack->codes); + lzw_info->stack=(LZWStack *) RelinquishMagickMemory(lzw_info->stack); + } + lzw_info=(LZWInfo *) RelinquishMagickMemory(lzw_info); + return((LZWInfo *) NULL); +} + +static inline void ResetLZWInfo(LZWInfo *lzw_info) +{ + size_t + one; + + lzw_info->bits=lzw_info->data_size+1; + one=1; + lzw_info->maximum_code=one << lzw_info->bits; + lzw_info->slot=lzw_info->maximum_data_value+3; + lzw_info->genesis=MagickTrue; +} + +static LZWInfo *AcquireLZWInfo(Image *image,const size_t data_size) +{ + LZWInfo + *lzw_info; + + ssize_t + i; + + size_t + one; + + lzw_info=(LZWInfo *) AcquireMagickMemory(sizeof(*lzw_info)); + if (lzw_info == (LZWInfo *) NULL) + return((LZWInfo *) NULL); + (void) memset(lzw_info,0,sizeof(*lzw_info)); + lzw_info->image=image; + lzw_info->data_size=data_size; + one=1; + lzw_info->maximum_data_value=(one << data_size)-1; + lzw_info->clear_code=lzw_info->maximum_data_value+1; + lzw_info->end_code=lzw_info->maximum_data_value+2; + lzw_info->table[0]=(size_t *) AcquireQuantumMemory(MaximumLZWCode, + sizeof(**lzw_info->table)); + lzw_info->table[1]=(size_t *) AcquireQuantumMemory(MaximumLZWCode, + sizeof(**lzw_info->table)); + if ((lzw_info->table[0] == (size_t *) NULL) || + (lzw_info->table[1] == (size_t *) NULL)) + { + lzw_info=RelinquishLZWInfo(lzw_info); + return((LZWInfo *) NULL); + } + (void) memset(lzw_info->table[0],0,MaximumLZWCode* + sizeof(**lzw_info->table)); + (void) memset(lzw_info->table[1],0,MaximumLZWCode* + sizeof(**lzw_info->table)); + for (i=0; i <= (ssize_t) lzw_info->maximum_data_value; i++) + { + lzw_info->table[0][i]=0; + lzw_info->table[1][i]=(size_t) i; + } + ResetLZWInfo(lzw_info); + lzw_info->code_info.buffer[0]='\0'; + lzw_info->code_info.buffer[1]='\0'; + lzw_info->code_info.count=2; + lzw_info->code_info.bit=8*lzw_info->code_info.count; + lzw_info->code_info.eof=MagickFalse; + lzw_info->genesis=MagickTrue; + lzw_info->stack=(LZWStack *) AcquireMagickMemory(sizeof(*lzw_info->stack)); + if (lzw_info->stack == (LZWStack *) NULL) + { + lzw_info=RelinquishLZWInfo(lzw_info); + return((LZWInfo *) NULL); + } + lzw_info->stack->codes=(size_t *) AcquireQuantumMemory(2UL* + MaximumLZWCode,sizeof(*lzw_info->stack->codes)); + if (lzw_info->stack->codes == (size_t *) NULL) + { + lzw_info=RelinquishLZWInfo(lzw_info); + return((LZWInfo *) NULL); + } + lzw_info->stack->index=lzw_info->stack->codes; + lzw_info->stack->top=lzw_info->stack->codes+2*MaximumLZWCode; + return(lzw_info); +} + +static inline int GetNextLZWCode(LZWInfo *lzw_info,const size_t bits) +{ + int + code; + + ssize_t + i; + + size_t + one; + + while (((lzw_info->code_info.bit+bits) > (8*lzw_info->code_info.count)) && + (lzw_info->code_info.eof == MagickFalse)) + { + ssize_t + count; + + lzw_info->code_info.buffer[0]=lzw_info->code_info.buffer[ + lzw_info->code_info.count-2]; + lzw_info->code_info.buffer[1]=lzw_info->code_info.buffer[ + lzw_info->code_info.count-1]; + lzw_info->code_info.bit-=8*(lzw_info->code_info.count-2); + lzw_info->code_info.count=2; + count=ReadBlobBlock(lzw_info->image,&lzw_info->code_info.buffer[ + lzw_info->code_info.count]); + if (count > 0) + lzw_info->code_info.count+=count; + else + lzw_info->code_info.eof=MagickTrue; + } + if ((lzw_info->code_info.bit+bits) > (8*lzw_info->code_info.count)) + return(-1); + code=0; + one=1; + for (i=0; i < (ssize_t) bits; i++) + { + code|=((lzw_info->code_info.buffer[lzw_info->code_info.bit/8] & + (one << (lzw_info->code_info.bit % 8))) != 0) << i; + lzw_info->code_info.bit++; + } + return(code); +} + +static inline int PopLZWStack(LZWStack *stack_info) +{ + if (stack_info->index <= stack_info->codes) + return(-1); + stack_info->index--; + return((int) *stack_info->index); +} + +static inline void PushLZWStack(LZWStack *stack_info,const size_t value) +{ + if (stack_info->index >= stack_info->top) + return; + *stack_info->index=value; + stack_info->index++; +} + +static int ReadBlobLZWByte(LZWInfo *lzw_info) +{ + int + code; + + size_t + one, + value; + + ssize_t + count; + + if (lzw_info->stack->index != lzw_info->stack->codes) + return(PopLZWStack(lzw_info->stack)); + if (lzw_info->genesis != MagickFalse) + { + lzw_info->genesis=MagickFalse; + do + { + lzw_info->first_code=(size_t) GetNextLZWCode(lzw_info,lzw_info->bits); + lzw_info->last_code=lzw_info->first_code; + } while (lzw_info->first_code == lzw_info->clear_code); + return((int) lzw_info->first_code); + } + code=GetNextLZWCode(lzw_info,lzw_info->bits); + if (code < 0) + return(code); + if ((size_t) code == lzw_info->clear_code) + { + ResetLZWInfo(lzw_info); + return(ReadBlobLZWByte(lzw_info)); + } + if ((size_t) code == lzw_info->end_code) + return(-1); + if ((size_t) code < lzw_info->slot) + value=(size_t) code; + else + { + PushLZWStack(lzw_info->stack,lzw_info->first_code); + value=lzw_info->last_code; + } + count=0; + while (value > lzw_info->maximum_data_value) + { + if ((size_t) count > MaximumLZWCode) + return(-1); + count++; + if ((size_t) value > MaximumLZWCode) + return(-1); + PushLZWStack(lzw_info->stack,lzw_info->table[1][value]); + value=lzw_info->table[0][value]; + } + lzw_info->first_code=lzw_info->table[1][value]; + PushLZWStack(lzw_info->stack,lzw_info->first_code); + one=1; + if (lzw_info->slot < MaximumLZWCode) + { + lzw_info->table[0][lzw_info->slot]=lzw_info->last_code; + lzw_info->table[1][lzw_info->slot]=lzw_info->first_code; + lzw_info->slot++; + if ((lzw_info->slot >= lzw_info->maximum_code) && + (lzw_info->bits < MaximumLZWBits)) + { + lzw_info->bits++; + lzw_info->maximum_code=one << lzw_info->bits; + } + } + lzw_info->last_code=(size_t) code; + return(PopLZWStack(lzw_info->stack)); +} + +static MagickBooleanType DecodeImage(Image *image,const ssize_t opacity) +{ + ExceptionInfo + *exception; + + IndexPacket + index; + + int + c; + + LZWInfo + *lzw_info; + + ssize_t + offset, + y; + + unsigned char + data_size; + + size_t + pass; + + /* + Allocate decoder tables. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=(&image->exception); + data_size=(unsigned char) ReadBlobByte(image); + if (data_size > MaximumLZWBits) + ThrowBinaryException(CorruptImageError,"CorruptImage",image->filename); + lzw_info=AcquireLZWInfo(image,data_size); + if (lzw_info == (LZWInfo *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + pass=0; + offset=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict q; + + q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; ) + { + c=ReadBlobLZWByte(lzw_info); + if (c < 0) + break; + index=ConstrainColormapIndex(image,(ssize_t) c); + SetPixelIndex(indexes+x,index); + SetPixelRGBO(q,image->colormap+(ssize_t) index); + SetPixelOpacity(q,(ssize_t) index == opacity ? TransparentOpacity : + OpaqueOpacity); + x++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (x < (ssize_t) image->columns) + break; + if (image->interlace == NoInterlace) + offset++; + else + { + switch (pass) + { + case 0: + default: + { + offset+=8; + break; + } + case 1: + { + offset+=8; + break; + } + case 2: + { + offset+=4; + break; + } + case 3: + { + offset+=2; + break; + } + } + if ((pass == 0) && (offset >= (ssize_t) image->rows)) + { + pass++; + offset=4; + } + if ((pass == 1) && (offset >= (ssize_t) image->rows)) + { + pass++; + offset=2; + } + if ((pass == 2) && (offset >= (ssize_t) image->rows)) + { + pass++; + offset=1; + } + } + } + lzw_info=RelinquishLZWInfo(lzw_info); + if (y < (ssize_t) image->rows) + ThrowBinaryException(CorruptImageError,"CorruptImage",image->filename); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E n c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EncodeImage compresses an image via GIF-coding. +% +% The format of the EncodeImage method is: +% +% MagickBooleanType EncodeImage(const ImageInfo *image_info,Image *image, +% const size_t data_size) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the address of a structure of type Image. +% +% o data_size: The number of bits in the compressed packet. +% +*/ +static MagickBooleanType EncodeImage(const ImageInfo *image_info,Image *image, + const size_t data_size) +{ +#define MaxCode(number_bits) ((one << (number_bits))-1) +#define MaxHashTable 5003 +#define MaxGIFBits 12UL +#define MaxGIFTable (1UL << MaxGIFBits) +#define GIFOutputCode(code) \ +{ \ + /* \ + Emit a code. \ + */ \ + if (bits > 0) \ + datum|=(size_t) (code) << bits; \ + else \ + datum=(size_t) (code); \ + bits+=number_bits; \ + while (bits >= 8) \ + { \ + /* \ + Add a character to current packet. \ + */ \ + packet[length++]=(unsigned char) (datum & 0xff); \ + if (length == 255) \ + { \ + (void) WriteBlobByte(image,(unsigned char) length); \ + (void) WriteBlob(image,length,packet); \ + length=0; \ + } \ + datum>>=8; \ + bits-=8; \ + } \ + if (free_code > max_code) \ + { \ + number_bits++; \ + if (number_bits == MaxGIFBits) \ + max_code=MaxGIFTable; \ + else \ + max_code=MaxCode(number_bits); \ + } \ +} + + IndexPacket + index; + + short + *hash_code, + *hash_prefix, + waiting_code; + + size_t + bits, + clear_code, + datum, + end_of_information_code, + free_code, + length, + max_code, + next_pixel, + number_bits, + one, + pass; + + ssize_t + displacement, + offset, + k, + y; + + unsigned char + *packet, + *hash_suffix; + + /* + Allocate encoder tables. + */ + assert(image != (Image *) NULL); + one=1; + packet=(unsigned char *) AcquireQuantumMemory(256,sizeof(*packet)); + hash_code=(short *) AcquireQuantumMemory(MaxHashTable,sizeof(*hash_code)); + hash_prefix=(short *) AcquireQuantumMemory(MaxHashTable,sizeof(*hash_prefix)); + hash_suffix=(unsigned char *) AcquireQuantumMemory(MaxHashTable, + sizeof(*hash_suffix)); + if ((packet == (unsigned char *) NULL) || (hash_code == (short *) NULL) || + (hash_prefix == (short *) NULL) || + (hash_suffix == (unsigned char *) NULL)) + { + if (packet != (unsigned char *) NULL) + packet=(unsigned char *) RelinquishMagickMemory(packet); + if (hash_code != (short *) NULL) + hash_code=(short *) RelinquishMagickMemory(hash_code); + if (hash_prefix != (short *) NULL) + hash_prefix=(short *) RelinquishMagickMemory(hash_prefix); + if (hash_suffix != (unsigned char *) NULL) + hash_suffix=(unsigned char *) RelinquishMagickMemory(hash_suffix); + return(MagickFalse); + } + /* + Initialize GIF encoder. + */ + (void) memset(packet,0,256*sizeof(*packet)); + (void) memset(hash_code,0,MaxHashTable*sizeof(*hash_code)); + (void) memset(hash_prefix,0,MaxHashTable*sizeof(*hash_prefix)); + (void) memset(hash_suffix,0,MaxHashTable*sizeof(*hash_suffix)); + number_bits=data_size; + max_code=MaxCode(number_bits); + clear_code=((short) one << (data_size-1)); + end_of_information_code=clear_code+1; + free_code=clear_code+2; + length=0; + datum=0; + bits=0; + GIFOutputCode(clear_code); + /* + Encode pixels. + */ + offset=0; + pass=0; + waiting_code=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,offset,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + if (y == 0) + { + waiting_code=(short) (*indexes); + p++; + } + for (x=(ssize_t) (y == 0 ? 1 : 0); x < (ssize_t) image->columns; x++) + { + /* + Probe hash table. + */ + next_pixel=MagickFalse; + displacement=1; + index=(IndexPacket) ((size_t) GetPixelIndex(indexes+x) & 0xff); + p++; + k=(ssize_t) (((size_t) index << (MaxGIFBits-8))+waiting_code); + if (k >= MaxHashTable) + k-=MaxHashTable; + if (k < 0) + continue; + if (hash_code[k] > 0) + { + if ((hash_prefix[k] == waiting_code) && + (hash_suffix[k] == (unsigned char) index)) + { + waiting_code=hash_code[k]; + continue; + } + if (k != 0) + displacement=MaxHashTable-k; + for ( ; ; ) + { + k-=displacement; + if (k < 0) + k+=MaxHashTable; + if (hash_code[k] == 0) + break; + if ((hash_prefix[k] == waiting_code) && + (hash_suffix[k] == (unsigned char) index)) + { + waiting_code=hash_code[k]; + next_pixel=MagickTrue; + break; + } + } + if (next_pixel != MagickFalse) + continue; + } + GIFOutputCode(waiting_code); + if (free_code < MaxGIFTable) + { + hash_code[k]=(short) free_code++; + hash_prefix[k]=waiting_code; + hash_suffix[k]=(unsigned char) index; + } + else + { + /* + Fill the hash table with empty entries. + */ + for (k=0; k < MaxHashTable; k++) + hash_code[k]=0; + /* + Reset compressor and issue a clear code. + */ + free_code=clear_code+2; + GIFOutputCode(clear_code); + number_bits=data_size; + max_code=MaxCode(number_bits); + } + waiting_code=(short) index; + } + if (image_info->interlace == NoInterlace) + offset++; + else + switch (pass) + { + case 0: + default: + { + offset+=8; + if (offset >= (ssize_t) image->rows) + { + pass++; + offset=4; + } + break; + } + case 1: + { + offset+=8; + if (offset >= (ssize_t) image->rows) + { + pass++; + offset=2; + } + break; + } + case 2: + { + offset+=4; + if (offset >= (ssize_t) image->rows) + { + pass++; + offset=1; + } + break; + } + case 3: + { + offset+=2; + break; + } + } + } + /* + Flush out the buffered code. + */ + GIFOutputCode(waiting_code); + GIFOutputCode(end_of_information_code); + if (bits > 0) + { + /* + Add a character to current packet. + */ + packet[length++]=(unsigned char) (datum & 0xff); + if (length == 255) + { + (void) WriteBlobByte(image,(unsigned char) length); + (void) WriteBlob(image,length,packet); + length=0; + } + } + /* + Flush accumulated data. + */ + if (length > 0) + { + (void) WriteBlobByte(image,(unsigned char) length); + (void) WriteBlob(image,length,packet); + } + /* + Free encoder memory. + */ + hash_suffix=(unsigned char *) RelinquishMagickMemory(hash_suffix); + hash_prefix=(short *) RelinquishMagickMemory(hash_prefix); + hash_code=(short *) RelinquishMagickMemory(hash_code); + packet=(unsigned char *) RelinquishMagickMemory(packet); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s G I F % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsGIF() returns MagickTrue if the image format type, identified by the +% magick string, is GIF. +% +% The format of the IsGIF method is: +% +% MagickBooleanType IsGIF(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsGIF(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (LocaleNCompare((char *) magick,"GIF8",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b B l o c k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobBlock() reads data from the image file and returns it. The +% amount of data is determined by first reading a count byte. The number +% of bytes read is returned. +% +% The format of the ReadBlobBlock method is: +% +% ssize_t ReadBlobBlock(Image *image,unsigned char *data) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o data: Specifies an area to place the information requested from +% the file. +% +*/ +static ssize_t ReadBlobBlock(Image *image,unsigned char *data) +{ + ssize_t + count; + + unsigned char + block_count; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(data != (unsigned char *) NULL); + count=ReadBlob(image,1,&block_count); + if (count != 1) + return(0); + count=ReadBlob(image,(size_t) block_count,data); + if (count != (ssize_t) block_count) + return(0); + return(count); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d G I F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadGIFImage() reads a Compuserve Graphics image file and returns it. +% It allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadGIFImage method is: +% +% Image *ReadGIFImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static void *DestroyGIFProfile(void *profile) +{ + return((void *) DestroyStringInfo((StringInfo *) profile)); +} + +static MagickBooleanType PingGIFImage(Image *image) +{ + unsigned char + buffer[256], + length, + data_size; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (ReadBlob(image,1,&data_size) != 1) + ThrowBinaryImageException(CorruptImageError,"CorruptImage", + image->filename); + if (data_size > MaximumLZWBits) + ThrowBinaryImageException(CorruptImageError,"CorruptImage", + image->filename); + if (ReadBlob(image,1,&length) != 1) + ThrowBinaryImageException(CorruptImageError,"CorruptImage", + image->filename); + while (length != 0) + { + if (ReadBlob(image,length,buffer) != (ssize_t) length) + ThrowBinaryImageException(CorruptImageError,"CorruptImage", + image->filename); + if (ReadBlob(image,1,&length) != 1) + ThrowBinaryImageException(CorruptImageError,"CorruptImage", + image->filename); + } + return(MagickTrue); +} + +static Image *ReadGIFImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define BitSet(byte,bit) (((byte) & (bit)) == (bit)) +#define LSBFirstOrder(x,y) (((y) << 8) | (x)) +#define ThrowGIFException(exception,message) \ +{ \ + if (profiles != (LinkedListInfo *) NULL) \ + profiles=DestroyLinkedList(profiles,DestroyGIFProfile); \ + if (global_colormap != (unsigned char *) NULL) \ + global_colormap=(unsigned char *) RelinquishMagickMemory(global_colormap); \ + if (meta_image != (Image *) NULL) \ + meta_image=DestroyImage(meta_image); \ + ThrowReaderException((exception),(message)); \ +} + + Image + *image, + *meta_image; + + LinkedListInfo + *profiles; + + MagickBooleanType + status; + + ssize_t + i; + + unsigned char + *p; + + size_t + duration, + global_colors, + image_count, + local_colors, + one; + + ssize_t + count, + opacity; + + unsigned char + background, + buffer[257], + c, + flag, + *global_colormap, + magick[12]; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Determine if this a GIF file. + */ + count=ReadBlob(image,6,magick); + if ((count != 6) || ((LocaleNCompare((char *) magick,"GIF87",5) != 0) && + (LocaleNCompare((char *) magick,"GIF89",5) != 0))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + (void) memset(buffer,0,sizeof(buffer)); + meta_image=AcquireImage(image_info); /* metadata container */ + meta_image->page.width=ReadBlobLSBShort(image); + meta_image->page.height=ReadBlobLSBShort(image); + meta_image->iterations=1; + flag=(unsigned char) ReadBlobByte(image); + background=(unsigned char) ReadBlobByte(image); + c=(unsigned char) ReadBlobByte(image); /* reserved */ + profiles=(LinkedListInfo *) NULL; + one=1; + global_colors=one << (((size_t) flag & 0x07)+1); + global_colormap=(unsigned char *) AcquireQuantumMemory((size_t) + MagickMax(global_colors,256),3UL*sizeof(*global_colormap)); + if (global_colormap == (unsigned char *) NULL) + ThrowGIFException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(global_colormap,0,3*MagickMax(global_colors,256)* + sizeof(*global_colormap)); + if (BitSet((int) flag,0x80) != 0) + { + count=ReadBlob(image,(size_t) (3*global_colors),global_colormap); + if (count != (ssize_t) (3*global_colors)) + ThrowGIFException(CorruptImageError,"InsufficientImageDataInFile"); + } + duration=0; + opacity=(-1); + image_count=0; + for ( ; ; ) + { + count=ReadBlob(image,1,&c); + if (count != 1) + break; + if (c == (unsigned char) ';') + break; /* terminator */ + if (c == (unsigned char) '!') + { + /* + GIF Extension block. + */ + count=ReadBlob(image,1,&c); + if (count != 1) + ThrowGIFException(CorruptImageError,"UnableToReadExtensionBlock"); + (void) memset(buffer,0,sizeof(buffer)); + switch (c) + { + case 0xf9: + { + /* + Read graphics control extension. + */ + while (ReadBlobBlock(image,buffer) != 0) ; + meta_image->dispose=(DisposeType) ((buffer[0] >> 2) & 0x07); + meta_image->delay=((size_t) buffer[2] << 8) | buffer[1]; + if ((ssize_t) (buffer[0] & 0x01) == 0x01) + opacity=(ssize_t) buffer[3]; + break; + } + case 0xfe: + { + char + *comments; + + size_t + extent, + offset; + + comments=AcquireString((char *) NULL); + extent=MagickPathExtent; + for (offset=0; ; offset+=count) + { + count=ReadBlobBlock(image,buffer); + if (count == 0) + break; + buffer[count]='\0'; + if (((ssize_t) (count+offset+MagickPathExtent)) >= (ssize_t) extent) + { + extent<<=1; + comments=(char *) ResizeQuantumMemory(comments, + OverAllocateMemory(extent+MagickPathExtent), + sizeof(*comments)); + if (comments == (char *) NULL) + ThrowGIFException(ResourceLimitError, + "MemoryAllocationFailed"); + } + (void) CopyMagickString(&comments[offset],(char *) buffer,extent- + offset); + } + (void) SetImageProperty(meta_image,"comment",comments); + comments=DestroyString(comments); + break; + } + case 0xff: + { + MagickBooleanType + loop; + + /* + Read Netscape Loop extension. + */ + loop=MagickFalse; + if (ReadBlobBlock(image,buffer) != 0) + loop=LocaleNCompare((char *) buffer,"NETSCAPE2.0",11) == 0 ? + MagickTrue : MagickFalse; + if (loop != MagickFalse) + while (ReadBlobBlock(image,buffer) != 0) + { + meta_image->iterations=((size_t) buffer[2] << 8) | buffer[1]; + if (meta_image->iterations != 0) + meta_image->iterations++; + } + else + { + char + name[MaxTextExtent]; + + int + block_length, + info_length, + reserved_length; + + MagickBooleanType + i8bim, + icc, + iptc, + magick; + + StringInfo + *profile; + + unsigned char + *info; + + /* + Store GIF application extension as a generic profile. + */ + icc=LocaleNCompare((char *) buffer,"ICCRGBG1012",11) == 0 ? + MagickTrue : MagickFalse; + magick=LocaleNCompare((char *) buffer,"ImageMagick",11) == 0 ? + MagickTrue : MagickFalse; + i8bim=LocaleNCompare((char *) buffer,"MGK8BIM0000",11) == 0 ? + MagickTrue : MagickFalse; + iptc=LocaleNCompare((char *) buffer,"MGKIPTC0000",11) == 0 ? + MagickTrue : MagickFalse; + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading GIF application extension"); + reserved_length=255; + info=(unsigned char *) AcquireQuantumMemory((size_t) + reserved_length,sizeof(*info)); + if (info == (unsigned char *) NULL) + ThrowGIFException(ResourceLimitError, + "MemoryAllocationFailed"); + (void) memset(info,0,reserved_length*sizeof(*info)); + for (info_length=0; ; ) + { + block_length=(int) ReadBlobBlock(image,info+info_length); + if (block_length == 0) + break; + info_length+=block_length; + if (info_length > (reserved_length-255)) + { + reserved_length+=4096; + info=(unsigned char *) ResizeQuantumMemory(info,(size_t) + reserved_length,sizeof(*info)); + if (info == (unsigned char *) NULL) + { + info=(unsigned char *) RelinquishMagickMemory(info); + ThrowGIFException(ResourceLimitError, + "MemoryAllocationFailed"); + } + } + } + profile=BlobToStringInfo(info,(size_t) info_length); + if (profile == (StringInfo *) NULL) + { + info=(unsigned char *) RelinquishMagickMemory(info); + ThrowGIFException(ResourceLimitError, + "MemoryAllocationFailed"); + } + if (i8bim != MagickFalse) + (void) CopyMagickString(name,"8bim",sizeof(name)); + else if (icc != MagickFalse) + (void) CopyMagickString(name,"icc",sizeof(name)); + else if (iptc != MagickFalse) + (void) CopyMagickString(name,"iptc",sizeof(name)); + else if (magick != MagickFalse) + { + (void) CopyMagickString(name,"magick",sizeof(name)); + meta_image->gamma=StringToDouble((char *) info+6, + (char **) NULL); + } + else + (void) FormatLocaleString(name,sizeof(name),"gif:%.11s", + buffer); + info=(unsigned char *) RelinquishMagickMemory(info); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " profile name=%s",name); + if (magick != MagickFalse) + profile=DestroyStringInfo(profile); + else + { + if (profiles == (LinkedListInfo *) NULL) + profiles=NewLinkedList(0); + SetStringInfoName(profile,name); + (void) AppendValueToLinkedList(profiles,profile); + } + } + break; + } + default: + { + while (ReadBlobBlock(image,buffer) != 0) ; + break; + } + } + } + if (c != (unsigned char) ',') + continue; + if (image_count != 0) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + } + image_count++; + /* + Read image attributes. + */ + meta_image->page.x=(ssize_t) ReadBlobLSBShort(image); + meta_image->page.y=(ssize_t) ReadBlobLSBShort(image); + meta_image->scene=image->scene; + (void) CloneImageProperties(image,meta_image); + DestroyImageProperties(meta_image); + image->storage_class=PseudoClass; + image->compression=LZWCompression; + image->columns=ReadBlobLSBShort(image); + image->rows=ReadBlobLSBShort(image); + image->depth=8; + flag=(unsigned char) ReadBlobByte(image); + image->interlace=BitSet((int) flag,0x40) != 0 ? GIFInterlace : NoInterlace; + local_colors=BitSet((int) flag,0x80) == 0 ? global_colors : one << + ((size_t) (flag & 0x07)+1); + image->colors=local_colors; + if (opacity == (ssize_t) image->colors) + image->colors++; + else if (opacity > (ssize_t) image->colors) + opacity=(-1); + image->ticks_per_second=100; + image->matte=opacity >= 0 ? MagickTrue : MagickFalse; + if ((image->columns == 0) || (image->rows == 0)) + ThrowGIFException(CorruptImageError,"NegativeOrZeroImageSize"); + /* + Inititialize colormap. + */ + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowGIFException(ResourceLimitError,"MemoryAllocationFailed"); + if (BitSet((int) flag,0x80) == 0) + { + /* + Use global colormap. + */ + p=global_colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=ScaleCharToQuantum(*p++); + image->colormap[i].green=ScaleCharToQuantum(*p++); + image->colormap[i].blue=ScaleCharToQuantum(*p++); + if (i == opacity) + { + image->colormap[i].opacity=(Quantum) TransparentOpacity; + image->transparent_color=image->colormap[opacity]; + } + } + image->background_color=image->colormap[MagickMin((ssize_t) background, + (ssize_t) image->colors-1)]; + } + else + { + unsigned char + *colormap; + + /* + Read local colormap. + */ + colormap=(unsigned char *) AcquireQuantumMemory((size_t) + MagickMax(local_colors,256),3UL*sizeof(*colormap)); + if (colormap == (unsigned char *) NULL) + ThrowGIFException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(colormap,0,3*MagickMax(local_colors,256)* + sizeof(*colormap)); + count=ReadBlob(image,(3*local_colors)*sizeof(*colormap),colormap); + if (count != (ssize_t) (3*local_colors)) + { + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + ThrowGIFException(CorruptImageError,"InsufficientImageDataInFile"); + } + p=colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=ScaleCharToQuantum(*p++); + image->colormap[i].green=ScaleCharToQuantum(*p++); + image->colormap[i].blue=ScaleCharToQuantum(*p++); + if (i == opacity) + image->colormap[i].opacity=(Quantum) TransparentOpacity; + } + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + } + if (image->gamma == 1.0) + { + for (i=0; i < (ssize_t) image->colors; i++) + if (IsGrayPixel(image->colormap+i) == MagickFalse) + break; + (void) SetImageColorspace(image,i == (ssize_t) image->colors ? + LinearGRAYColorspace : RGBColorspace); + } + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + if (profiles != (LinkedListInfo *) NULL) + profiles=DestroyLinkedList(profiles,DestroyGIFProfile); + global_colormap=(unsigned char *) RelinquishMagickMemory( + global_colormap); + meta_image=DestroyImage(meta_image); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Decode image. + */ + if (image_info->ping != MagickFalse) + status=PingGIFImage(image); + else + status=DecodeImage(image,opacity); + InheritException(exception,&image->exception); + if ((image_info->ping == MagickFalse) && (status == MagickFalse)) + ThrowGIFException(CorruptImageError,"CorruptImage"); + if (profiles != (LinkedListInfo *) NULL) + { + StringInfo + *profile; + + /* + Set image profiles. + */ + ResetLinkedListIterator(profiles); + profile=(StringInfo *) GetNextValueInLinkedList(profiles); + while (profile != (StringInfo *) NULL) + { + (void) SetImageProfile(image,GetStringInfoName(profile),profile); + profile=(StringInfo *) GetNextValueInLinkedList(profiles); + } + profiles=DestroyLinkedList(profiles,DestroyGIFProfile); + } + duration+=image->delay*image->iterations; + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + opacity=(-1); + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) image->scene- + 1,image->scene); + if (status == MagickFalse) + break; + } + image->duration=duration; + if (profiles != (LinkedListInfo *) NULL) + profiles=DestroyLinkedList(profiles,DestroyGIFProfile); + meta_image=DestroyImage(meta_image); + global_colormap=(unsigned char *) RelinquishMagickMemory(global_colormap); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize"); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r G I F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterGIFImage() adds properties for the GIF image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterGIFImage method is: +% +% size_t RegisterGIFImage(void) +% +*/ +ModuleExport size_t RegisterGIFImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("GIF"); + entry->decoder=(DecodeImageHandler *) ReadGIFImage; + entry->encoder=(EncodeImageHandler *) WriteGIFImage; + entry->magick=(IsImageFormatHandler *) IsGIF; + entry->description=ConstantString("CompuServe graphics interchange format"); + entry->mime_type=ConstantString("image/gif"); + entry->magick_module=ConstantString("GIF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("GIF87"); + entry->decoder=(DecodeImageHandler *) ReadGIFImage; + entry->encoder=(EncodeImageHandler *) WriteGIFImage; + entry->magick=(IsImageFormatHandler *) IsGIF; + entry->adjoin=MagickFalse; + entry->description=ConstantString("CompuServe graphics interchange format"); + entry->version=ConstantString("version 87a"); + entry->mime_type=ConstantString("image/gif"); + entry->magick_module=ConstantString("GIF"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r G I F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterGIFImage() removes format registrations made by the +% GIF module from the list of supported formats. +% +% The format of the UnregisterGIFImage method is: +% +% UnregisterGIFImage(void) +% +*/ +ModuleExport void UnregisterGIFImage(void) +{ + (void) UnregisterMagickInfo("GIF"); + (void) UnregisterMagickInfo("GIF87"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e G I F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteGIFImage() writes an image to a file in the Compuserve Graphics +% image format. +% +% The format of the WriteGIFImage method is: +% +% MagickBooleanType WriteGIFImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteGIFImage(const ImageInfo *image_info,Image *image) +{ + int + c; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + RectangleInfo + page; + + ssize_t + i; + + unsigned char + *q; + + size_t + bits_per_pixel, + delay, + imageListLength, + length, + one; + + ssize_t + j, + opacity; + + unsigned char + *colormap, + *global_colormap; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + /* + Allocate colormap. + */ + global_colormap=(unsigned char *) AcquireQuantumMemory(768UL, + sizeof(*global_colormap)); + colormap=(unsigned char *) AcquireQuantumMemory(768UL,sizeof(*colormap)); + if ((global_colormap == (unsigned char *) NULL) || + (colormap == (unsigned char *) NULL)) + { + if (global_colormap != (unsigned char *) NULL) + global_colormap=(unsigned char *) RelinquishMagickMemory( + global_colormap); + if (colormap != (unsigned char *) NULL) + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (i=0; i < 768; i++) + colormap[i]=(unsigned char) 0; + /* + Write GIF header. + */ + write_info=CloneImageInfo(image_info); + if (LocaleCompare(write_info->magick,"GIF87") != 0) + (void) WriteBlob(image,6,(unsigned char *) "GIF89a"); + else + { + (void) WriteBlob(image,6,(unsigned char *) "GIF87a"); + write_info->adjoin=MagickFalse; + } + /* + Determine image bounding box. + */ + page.width=image->columns; + if (image->page.width > page.width) + page.width=image->page.width; + page.height=image->rows; + if (image->page.height > page.height) + page.height=image->page.height; + page.x=image->page.x; + page.y=image->page.y; + (void) WriteBlobLSBShort(image,(unsigned short) page.width); + (void) WriteBlobLSBShort(image,(unsigned short) page.height); + /* + Write images to file. + */ + scene=0; + one=1; + imageListLength=GetImageListLength(image); + do + { + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + opacity=(-1); + if (IsOpaqueImage(image,&image->exception) != MagickFalse) + { + if ((image->storage_class == DirectClass) || (image->colors > 256)) + (void) SetImageType(image,PaletteType); + } + else + { + double + alpha, + beta; + + /* + Identify transparent colormap index. + */ + if ((image->storage_class == DirectClass) || (image->colors > 256)) + (void) SetImageType(image,PaletteBilevelMatteType); + for (i=0; i < (ssize_t) image->colors; i++) + if (image->colormap[i].opacity != OpaqueOpacity) + { + if (opacity < 0) + { + opacity=i; + continue; + } + alpha=fabs((double) image->colormap[i].opacity- + TransparentOpacity); + beta=fabs((double) image->colormap[opacity].opacity- + TransparentOpacity); + if (alpha < beta) + opacity=i; + } + if (opacity == -1) + { + (void) SetImageType(image,PaletteBilevelMatteType); + for (i=0; i < (ssize_t) image->colors; i++) + if (image->colormap[i].opacity != OpaqueOpacity) + { + if (opacity < 0) + { + opacity=i; + continue; + } + alpha=fabs((double) image->colormap[i].opacity- + TransparentOpacity); + beta=fabs((double) image->colormap[opacity].opacity- + TransparentOpacity); + if (alpha < beta) + opacity=i; + } + } + if (opacity >= 0) + { + image->colormap[opacity].red=image->transparent_color.red; + image->colormap[opacity].green=image->transparent_color.green; + image->colormap[opacity].blue=image->transparent_color.blue; + } + } + if ((image->storage_class == DirectClass) || (image->colors > 256)) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + for (bits_per_pixel=1; bits_per_pixel < 8; bits_per_pixel++) + if ((one << bits_per_pixel) >= image->colors) + break; + q=colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + *q++=ScaleQuantumToChar(image->colormap[i].red); + *q++=ScaleQuantumToChar(image->colormap[i].green); + *q++=ScaleQuantumToChar(image->colormap[i].blue); + } + for ( ; i < (ssize_t) (one << bits_per_pixel); i++) + { + *q++=(unsigned char) 0x0; + *q++=(unsigned char) 0x0; + *q++=(unsigned char) 0x0; + } + if ((GetPreviousImageInList(image) == (Image *) NULL) || + (write_info->adjoin == MagickFalse)) + { + /* + Write global colormap. + */ + c=0x80; + c|=(8-1) << 4; /* color resolution */ + c|=(bits_per_pixel-1); /* size of global colormap */ + (void) WriteBlobByte(image,(unsigned char) c); + for (j=0; j < (ssize_t) image->colors; j++) + if (IsColorEqual(&image->background_color,image->colormap+j)) + break; + (void) WriteBlobByte(image,(unsigned char) + (j == (ssize_t) image->colors ? 0 : j)); /* background color */ + (void) WriteBlobByte(image,(unsigned char) 0x00); /* reserved */ + length=(size_t) (3*(one << bits_per_pixel)); + (void) WriteBlob(image,length,colormap); + for (j=0; j < 768; j++) + global_colormap[j]=colormap[j]; + } + if (LocaleCompare(write_info->magick,"GIF87") != 0) + { + const char + *value; + + if ((GetPreviousImageInList(image) == (Image *) NULL) && + (GetNextImageInList(image) != (Image *) NULL) && + (image->iterations != 1)) + { + /* + Write Netscape Loop extension. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing GIF Extension %s","NETSCAPE2.0"); + (void) WriteBlobByte(image,(unsigned char) 0x21); + (void) WriteBlobByte(image,(unsigned char) 0xff); + (void) WriteBlobByte(image,(unsigned char) 0x0b); + (void) WriteBlob(image,11,(unsigned char *) "NETSCAPE2.0"); + (void) WriteBlobByte(image,(unsigned char) 0x03); + (void) WriteBlobByte(image,(unsigned char) 0x01); + (void) WriteBlobLSBShort(image,(unsigned short) (image->iterations ? + image->iterations-1 : 0)); + (void) WriteBlobByte(image,(unsigned char) 0x00); + } + /* + Write graphics control extension. + */ + (void) WriteBlobByte(image,(unsigned char) 0x21); + (void) WriteBlobByte(image,(unsigned char) 0xf9); + (void) WriteBlobByte(image,(unsigned char) 0x04); + c=image->dispose << 2; + if (opacity >= 0) + c|=0x01; + (void) WriteBlobByte(image,(unsigned char) c); + delay=(size_t) (100*image->delay/MagickMax((size_t) + image->ticks_per_second,1)); + (void) WriteBlobLSBShort(image,(unsigned short) delay); + (void) WriteBlobByte(image,(unsigned char) (opacity >= 0 ? opacity : + 0)); + (void) WriteBlobByte(image,(unsigned char) 0x00); + if (fabs(image->gamma - 1.0f/2.2f) > MagickEpsilon) + { + char + attributes[MaxTextExtent]; + + ssize_t + count; + + /* + Write ImageMagick extension. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing GIF Extension %s","ImageMagick"); + (void) WriteBlobByte(image,(unsigned char) 0x21); + (void) WriteBlobByte(image,(unsigned char) 0xff); + (void) WriteBlobByte(image,(unsigned char) 0x0b); + (void) WriteBlob(image,11,(unsigned char *) "ImageMagick"); + count=FormatLocaleString(attributes,MaxTextExtent,"gamma=%g", + image->gamma); + (void) WriteBlobByte(image,(unsigned char) count); + (void) WriteBlob(image,(size_t) count,(unsigned char *) attributes); + (void) WriteBlobByte(image,(unsigned char) 0x00); + } + value=GetImageProperty(image,"comment"); + if (value != (const char *) NULL) + { + const char + *p; + + size_t + count; + + /* + Write comment extension. + */ + (void) WriteBlobByte(image,(unsigned char) 0x21); + (void) WriteBlobByte(image,(unsigned char) 0xfe); + for (p=value; *p != '\0'; ) + { + count=MagickMin(strlen(p),255); + (void) WriteBlobByte(image,(unsigned char) count); + for (i=0; i < (ssize_t) count; i++) + (void) WriteBlobByte(image,(unsigned char) *p++); + } + (void) WriteBlobByte(image,(unsigned char) 0x00); + } + ResetImageProfileIterator(image); + for ( ; ; ) + { + char + *name; + + const StringInfo + *profile; + + name=GetNextImageProfile(image); + if (name == (const char *) NULL) + break; + profile=GetImageProfile(image,name); + if (profile != (StringInfo *) NULL) + { + if ((LocaleCompare(name,"ICC") == 0) || + (LocaleCompare(name,"ICM") == 0) || + (LocaleCompare(name,"IPTC") == 0) || + (LocaleCompare(name,"8BIM") == 0) || + (LocaleNCompare(name,"gif:",4) == 0)) + { + size_t + length; + + ssize_t + offset; + + unsigned char + *datum; + + datum=GetStringInfoDatum(profile); + length=GetStringInfoLength(profile); + (void) WriteBlobByte(image,(unsigned char) 0x21); + (void) WriteBlobByte(image,(unsigned char) 0xff); + (void) WriteBlobByte(image,(unsigned char) 0x0b); + if ((LocaleCompare(name,"ICC") == 0) || + (LocaleCompare(name,"ICM") == 0)) + { + /* + Write ICC extension. + */ + (void) WriteBlob(image,11,(unsigned char *) "ICCRGBG1012"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing GIF Extension %s","ICCRGBG1012"); + } + else + if ((LocaleCompare(name,"IPTC") == 0)) + { + /* + Write IPTC extension. + */ + (void) WriteBlob(image,11,(unsigned char *) "MGKIPTC0000"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing GIF Extension %s","MGKIPTC0000"); + } + else + if ((LocaleCompare(name,"8BIM") == 0)) + { + /* + Write 8BIM extension. + */ + (void) WriteBlob(image,11,(unsigned char *) + "MGK8BIM0000"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing GIF Extension %s","MGK8BIM0000"); + } + else + { + char + extension[MaxTextExtent]; + + /* + Write generic extension. + */ + (void) memset(extension,0,sizeof(extension)); + (void) CopyMagickString(extension,name+4, + sizeof(extension)); + (void) WriteBlob(image,11,(unsigned char *) extension); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing GIF Extension %s",name); + } + offset=0; + while ((ssize_t) length > offset) + { + size_t + block_length; + + if ((length-offset) < 255) + block_length=length-offset; + else + block_length=255; + (void) WriteBlobByte(image,(unsigned char) block_length); + (void) WriteBlob(image,(size_t) block_length,datum+offset); + offset+=(ssize_t) block_length; + } + (void) WriteBlobByte(image,(unsigned char) 0x00); + } + } + } + } + (void) WriteBlobByte(image,','); /* image separator */ + /* + Write the image header. + */ + page.x=image->page.x; + page.y=image->page.y; + if ((image->page.width != 0) && (image->page.height != 0)) + page=image->page; + (void) WriteBlobLSBShort(image,(unsigned short) (page.x < 0 ? 0 : page.x)); + (void) WriteBlobLSBShort(image,(unsigned short) (page.y < 0 ? 0 : page.y)); + (void) WriteBlobLSBShort(image,(unsigned short) image->columns); + (void) WriteBlobLSBShort(image,(unsigned short) image->rows); + c=0x00; + if (write_info->interlace != NoInterlace) + c|=0x40; /* pixel data is interlaced */ + for (j=0; j < (ssize_t) (3*image->colors); j++) + if (colormap[j] != global_colormap[j]) + break; + if (j == (ssize_t) (3*image->colors)) + (void) WriteBlobByte(image,(unsigned char) c); + else + { + c|=0x80; + c|=(bits_per_pixel-1); /* size of local colormap */ + (void) WriteBlobByte(image,(unsigned char) c); + length=(size_t) (3*(one << bits_per_pixel)); + (void) WriteBlob(image,length,colormap); + } + /* + Write the image data. + */ + c=(int) MagickMax(bits_per_pixel,2); + (void) WriteBlobByte(image,(unsigned char) c); + status=EncodeImage(write_info,image,(size_t) MagickMax(bits_per_pixel,2)+1); + if (status == MagickFalse) + { + global_colormap=(unsigned char *) RelinquishMagickMemory( + global_colormap); + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + write_info=DestroyImageInfo(write_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) WriteBlobByte(image,(unsigned char) 0x00); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + scene++; + status=SetImageProgress(image,SaveImagesTag,scene,imageListLength); + if (status == MagickFalse) + break; + } while (write_info->adjoin != MagickFalse); + (void) WriteBlobByte(image,';'); /* terminator */ + global_colormap=(unsigned char *) RelinquishMagickMemory(global_colormap); + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + write_info=DestroyImageInfo(write_info); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/gradient.c b/ImageMagick-6.9.12-44/coders/gradient.c new file mode 100644 index 0000000..c2326cd --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/gradient.c @@ -0,0 +1,331 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% GGGG RRRR AAA DDDD IIIII EEEEE N N TTTTT % +% G R R A A D D I E NN N T % +% G GG RRRR AAAAA D D I EEE N N N T % +% G G R R A A D D I E N NN T % +% GGG R R A A DDDD IIIII EEEEE N N T % +% % +% % +% Read An Image Filled Using Gradient. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace-private.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/paint.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/studio.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d G R A D I E N T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadGRADIENTImage creates a gradient image and initializes it to +% the color range as specified by the filename. It allocates the memory +% necessary for the new Image structure and returns a pointer to the new +% image. +% +% The format of the ReadGRADIENTImage method is: +% +% Image *ReadGRADIENTImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static Image *ReadXCImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + IndexPacket + index, + *indexes; + + MagickBooleanType + status; + + MagickPixelPacket + color; + + PixelPacket + pixel; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + y; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if (image->columns == 0) + image->columns=1; + if (image->rows == 0) + image->rows=1; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent); + status=QueryMagickColor((char *) image_info->filename,&color,exception); + if (status == MagickFalse) + { + image=DestroyImage(image); + return((Image *) NULL); + } + (void) SetImageColorspace(image,color.colorspace); + image->matte=color.matte; + (void) memset(&pixel,0,sizeof(pixel)); + index=0; + SetPixelPacket(image,&color,&pixel,&index); + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + *q++=pixel; + if (image->colorspace == CMYKColorspace) + { + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,index); + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + return(GetFirstImageInList(image)); +} + +static Image *ReadGRADIENTImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + char + colorname[MaxTextExtent+4]; + + Image + *image; + + ImageInfo + *read_info; + + MagickBooleanType + icc_color, + status; + + MagickPixelPacket + start_pixel, + stop_pixel; + + PixelPacket + start_color, + stop_color; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) CopyMagickString(colorname,image_info->filename,MaxTextExtent); + (void) sscanf(image_info->filename,"%[^-]",colorname); + (void) CopyMagickString(read_info->filename,colorname,MaxTextExtent); + image=ReadXCImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (image == (Image *) NULL) + return((Image *) NULL); + (void) SetImageOpacity(image,(Quantum) TransparentOpacity); + (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent); + icc_color=MagickFalse; + if (LocaleCompare(colorname,"icc") == 0) + { + (void) ConcatenateMagickString(colorname,"-",MaxTextExtent); + (void) sscanf(image_info->filename,"%*[^-]-%[^-]",colorname+4); + icc_color=MagickTrue; + } + if (QueryColorDatabase(colorname,&start_color,exception) == MagickFalse) + { + image=DestroyImage(image); + return((Image *) NULL); + } + (void) QueryMagickColor(colorname,&start_pixel,exception); + (void) CopyMagickString(colorname,"white",MaxTextExtent); + if (GetPixelLuma(image,&start_color) > (QuantumRange/2.0)) + (void) CopyMagickString(colorname,"black",MaxTextExtent); + if (icc_color == MagickFalse) + (void) sscanf(image_info->filename,"%*[^-]-%[^-]",colorname); + else + (void) sscanf(image_info->filename,"%*[^-]-%*[^-]-%[^-]",colorname); + if (QueryColorDatabase(colorname,&stop_color,exception) == MagickFalse) + { + image=DestroyImage(image); + return((Image *) NULL); + } + (void) QueryMagickColor(colorname,&stop_pixel,exception); + (void) SetImageColorspace(image,start_pixel.colorspace); + image->matte=start_pixel.matte; + if (stop_pixel.matte != MagickFalse) + image->matte=MagickTrue; + status=GradientImage(image,LocaleCompare(image_info->magick,"GRADIENT") == 0 ? + LinearGradient : RadialGradient,PadSpread,&start_color,&stop_color); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r G R A D I E N T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterGRADIENTImage() adds attributes for the GRADIENT image format +% to the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterGRADIENTImage method is: +% +% size_t RegisterGRADIENTImage(void) +% +*/ +ModuleExport size_t RegisterGRADIENTImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("GRADIENT"); + entry->decoder=(DecodeImageHandler *) ReadGRADIENTImage; + entry->adjoin=MagickFalse; + entry->raw=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Gradual linear passing from one shade to " + "another"); + entry->magick_module=ConstantString("GRADIENT"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("RADIAL-GRADIENT"); + entry->decoder=(DecodeImageHandler *) ReadGRADIENTImage; + entry->adjoin=MagickFalse; + entry->raw=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Gradual radial passing from one shade to " + "another"); + entry->magick_module=ConstantString("GRADIENT"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r G R A D I E N T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterGRADIENTImage() removes format registrations made by the +% GRADIENT module from the list of supported formats. +% +% The format of the UnregisterGRADIENTImage method is: +% +% UnregisterGRADIENTImage(void) +% +*/ +ModuleExport void UnregisterGRADIENTImage(void) +{ + (void) UnregisterMagickInfo("RADIAL-GRADIENT"); + (void) UnregisterMagickInfo("GRADIENT"); +} diff --git a/ImageMagick-6.9.12-44/coders/gray.c b/ImageMagick-6.9.12-44/coders/gray.c new file mode 100644 index 0000000..55c8ede --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/gray.c @@ -0,0 +1,1135 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% GGGG RRRR AAA Y Y % +% G R R A A Y Y % +% G GG RRRR AAAAA Y % +% G G R R A A Y % +% GGG R R A A Y % +% % +% % +% Read/Write Raw GRAY Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/channel.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteGRAYImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d G R A Y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadGRAYImage() reads an image of raw GRAY, GRAYA, or GRAYO samples and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadGRAYImage method is: +% +% Image *ReadGRAYImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadGRAYImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + const void + *stream; + + Image + *canvas_image, + *image; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + i; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + image->colorspace=GRAYColorspace; + if (image_info->interlace != PartitionInterlace) + { + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + } + /* + Create virtual canvas to support cropping (i.e. image.rgb[100x100+10+20]). + */ + canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse, + exception); + if (canvas_image == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + quantum_type=GrayQuantum; + if (LocaleCompare(image_info->magick,"GRAYA") == 0) + { + quantum_type=GrayAlphaQuantum; + canvas_image->matte=MagickTrue; + } + (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod); + quantum_info=AcquireQuantumInfo(image_info,canvas_image); + if (quantum_info == (QuantumInfo *) NULL) + { + canvas_image=DestroyImage(canvas_image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=GetQuantumPixels(quantum_info); + if (image_info->number_scenes != 0) + while (image->scene < image_info->scene) + { + /* + Skip to next image. + */ + image->scene++; + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + for (y=0; y < (ssize_t) image->rows; y++) + { + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + } + count=0; + length=0; + scene=0; + status=MagickTrue; + stream=NULL; + do + { + /* + Read pixels to virtual canvas image then push to image. + */ + image->matte=canvas_image->matte; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + break; + switch (image_info->interlace) + { + case NoInterlace: + default: + { + /* + No interlacing: GGG... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=QueueAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + SetPixelGreen(q,GetPixelGreen(p)); + SetPixelBlue(q,GetPixelBlue(p)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + break; + } + case LineInterlace: + { + static QuantumType + quantum_types[4] = + { + GrayQuantum, + AlphaQuantum + }; + + /* + Line interlacing: G...G...G... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + for (i=0; i < (ssize_t) (image->matte != MagickFalse ? 4 : 3); i++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + quantum_type=quantum_types[i]; + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x, + 0,canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + switch (quantum_type) + { + case GrayQuantum: + { + SetPixelGray(q,GetPixelGray(p)); + break; + } + case AlphaQuantum: + { + SetPixelAlpha(q,GetPixelAlpha(p)); + break; + } + default: + break; + } + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + { + /* + Plane interlacing: GGG...GGG...GGG... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,RedQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGray(q,GetPixelGray(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,1,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,GreenQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelGreen(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,2,6); + if (status == MagickFalse) + break; + } + if (image->matte != MagickFalse) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,AlphaQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image, + canvas_image->extract_info.x,0,canvas_image->columns,1, + exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,5,6); + if (status == MagickFalse) + break; + } + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + case PartitionInterlace: + { + /* + Partition interlacing: GGG..., GGG..., GGG... + */ + AppendImageFormat("G",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,RedQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGray(q,GetPixelGray(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,1,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + if (image->matte != MagickFalse) + { + (void) CloseBlob(image); + AppendImageFormat("A",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels( + quantum_info),&count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlueQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x, + 0,canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelAlpha(q,GetPixelAlpha(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,4,5); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,5,5); + if (status == MagickFalse) + break; + } + break; + } + } + if (status == MagickFalse) + break; + SetQuantumImageType(image,quantum_type); + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (count == (ssize_t) length) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + scene++; + } while (count == (ssize_t) length); + quantum_info=DestroyQuantumInfo(quantum_info); + InheritException(&image->exception,&canvas_image->exception); + canvas_image=DestroyImage(canvas_image); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r G R A Y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterGRAYImage() adds attributes for the GRAY image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterGRAYImage method is: +% +% size_t RegisterGRAYImage(void) +% +*/ +ModuleExport size_t RegisterGRAYImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("GRAY"); + entry->decoder=(DecodeImageHandler *) ReadGRAYImage; + entry->encoder=(EncodeImageHandler *) WriteGRAYImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw gray samples"); + entry->magick_module=ConstantString("GRAY"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("GRAYA"); + entry->decoder=(DecodeImageHandler *) ReadGRAYImage; + entry->encoder=(EncodeImageHandler *) WriteGRAYImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw gray and alpha samples"); + entry->magick_module=ConstantString("GRAY"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r G R A Y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterGRAYImage() removes format registrations made by the GRAY module +% from the list of supported formats. +% +% The format of the UnregisterGRAYImage method is: +% +% UnregisterGRAYImage(void) +% +*/ +ModuleExport void UnregisterGRAYImage(void) +{ + (void) UnregisterMagickInfo("GRAYA"); + (void) UnregisterMagickInfo("GRAY"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e G R A Y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteGRAYImage() writes an image to a file in the GRAY, GRAYA, or GRAYO +% rasterfile format. +% +% The format of the WriteGRAYImage method is: +% +% MagickBooleanType WriteGRAYImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteGRAYImage(const ImageInfo *image_info, + Image *image) +{ + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + size_t + imageListLength, + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Allocate memory for pixels. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image_info->interlace != PartitionInterlace) + { + /* + Open output image file. + */ + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + } + quantum_type=GrayQuantum; + if (LocaleCompare(image_info->magick,"GRAYA") == 0) + quantum_type=GrayAlphaQuantum; + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Convert MIFF to GRAY raster pixels. + */ + (void) TransformImageColorspace(image,GRAYColorspace); + if ((LocaleCompare(image_info->magick,"GRAYA") == 0) && + (image->matte == MagickFalse)) + (void) SetImageAlphaChannel(image,ResetAlphaChannel); + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + switch (image_info->interlace) + { + case NoInterlace: + default: + { + /* + No interlacing: GGG... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case LineInterlace: + { + /* + Line interlacing: GGG...GGG...GGG... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (quantum_type == GrayAlphaQuantum) + { + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + { + /* + Plane interlacing: GGGGG..., GGGGG..., GGGGG... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,6); + if (status == MagickFalse) + break; + } + if (quantum_type == GrayAlphaQuantum) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,5,6); + if (status == MagickFalse) + break; + } + } + if (image_info->interlace == PartitionInterlace) + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + case PartitionInterlace: + { + /* + Partition interlacing: GGG... + */ + AppendImageFormat("G",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,6); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + if (quantum_type == GrayAlphaQuantum) + { + (void) CloseBlob(image); + AppendImageFormat("A",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,5,6); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/hald.c b/ImageMagick-6.9.12-44/coders/hald.c new file mode 100644 index 0000000..c71cf60 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/hald.c @@ -0,0 +1,244 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H H AAA L DDDD % +% H H A A L D D % +% HHHHH AAAAA L D D % +% H H A A L D D % +% H H A A LLLLL DDDD % +% % +% % +% Create Identity Hald CLUT Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/thread-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d H A L D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadHALDImage() creates a Hald color lookup table image and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadHALDImage method is: +% +% Image *ReadHALDImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadHALDImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + size_t + cube_size, + level; + + ssize_t + i, + y; + + /* + Create HALD color lookup table image. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + level=0; + if (*image_info->filename != '\0') + level=StringToUnsignedLong(image_info->filename); + if (image_info->scene != 0) + level=image_info->scene; + if ((level < 2) || (level > 256)) + level=8; + status=MagickTrue; + cube_size=level*level; + image->columns=(size_t) (level*cube_size); + image->rows=(size_t) (level*cube_size); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + for (y=0; y < (ssize_t) image->rows; y+=(ssize_t) level) + { + ssize_t + blue, + green, + red; + + PixelPacket + *magick_restrict q; + + if (status == MagickFalse) + continue; + q=QueueAuthenticPixels(image,0,y,image->columns,(size_t) level,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + blue=y/(ssize_t) level; + for (green=0; green < (ssize_t) cube_size; green++) + { + for (red=0; red < (ssize_t) cube_size; red++) + { + SetPixelRed(q,ClampToQuantum((MagickRealType) + (QuantumRange*red/(cube_size-1.0)))); + SetPixelGreen(q,ClampToQuantum((MagickRealType) + (QuantumRange*green/(cube_size-1.0)))); + SetPixelBlue(q,ClampToQuantum((MagickRealType) + (QuantumRange*blue/(cube_size-1.0)))); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + status=MagickFalse; + } + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + if (image_info->scene != 0) + for (i=0; i < (ssize_t) image_info->scene; i++) + AppendImageToList(&image,CloneImage(image,0,0,MagickTrue,exception)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r H A L D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterHALDImage() adds attributes for the Hald color lookup table image +% format to the list of supported formats. The attributes include the image +% format tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, whether +% the format supports native in-memory I/O, and a brief description of the +% format. +% +% The format of the RegisterHALDImage method is: +% +% size_t RegisterHALDImage(void) +% +*/ +ModuleExport size_t RegisterHALDImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("HALD"); + entry->decoder=(DecodeImageHandler *) ReadHALDImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Identity Hald color lookup table image"); + entry->magick_module=ConstantString("HALD"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r H A L D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterHALDImage() removes format registrations made by the +% HALD module from the list of supported formats. +% +% The format of the UnregisterHALDImage method is: +% +% UnregisterHALDImage(void) +% +*/ +ModuleExport void UnregisterHALDImage(void) +{ + (void) UnregisterMagickInfo("HALD"); +} diff --git a/ImageMagick-6.9.12-44/coders/hdr.c b/ImageMagick-6.9.12-44/coders/hdr.c new file mode 100644 index 0000000..e20dad9 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/hdr.c @@ -0,0 +1,833 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H H DDDD RRRR % +% H H D D R R % +% HHHHH D D RRRR % +% H H D D R R % +% H H DDDD R R % +% % +% % +% Read/Write Radiance RGBE Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteHDRImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s H D R % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsHDR() returns MagickTrue if the image format type, identified by the +% magick string, is Radiance RGBE image format. +% +% The format of the IsHDR method is: +% +% MagickBooleanType IsHDR(const unsigned char *magick, +% const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsHDR(const unsigned char *magick, + const size_t length) +{ + if (length < 10) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"#?RADIANCE",10) == 0) + return(MagickTrue); + if (LocaleNCompare((const char *) magick,"#?RGBE",6) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d H D R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadHDRImage() reads the Radiance RGBE image format and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadHDRImage method is: +% +% Image *ReadHDRImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadHDRImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + format[MaxTextExtent], + keyword[MaxTextExtent], + tag[MaxTextExtent], + value[MaxTextExtent]; + + double + gamma; + + Image + *image; + + int + c; + + MagickBooleanType + status, + value_expected; + + PixelPacket + *q; + + unsigned char + *p; + + ssize_t + i, + x; + + ssize_t + count, + y; + + unsigned char + *end, + pixel[4], + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Decode image header. + */ + image->columns=0; + image->rows=0; + *format='\0'; + c=ReadBlobByte(image); + if (c == EOF) + { + image=DestroyImage(image); + return((Image *) NULL); + } + while (isgraph((int) ((unsigned char) c)) && (image->columns == 0) && (image->rows == 0)) + { + if (c == (int) '#') + { + char + *comment; + + char + *p; + + size_t + length; + + /* + Read comment-- any text between # and end-of-line. + */ + length=MaxTextExtent; + comment=AcquireString((char *) NULL); + for (p=comment; comment != (char *) NULL; p++) + { + c=ReadBlobByte(image); + if ((c == EOF) || (c == (int) '\n')) + break; + if ((size_t) (p-comment+1) >= length) + { + *p='\0'; + length<<=1; + comment=(char *) ResizeQuantumMemory(comment,length+ + MaxTextExtent,sizeof(*comment)); + if (comment == (char *) NULL) + break; + p=comment+strlen(comment); + } + *p=(char) c; + } + if (comment == (char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + *p='\0'; + (void) SetImageProperty(image,"comment",comment); + comment=DestroyString(comment); + c=ReadBlobByte(image); + } + else + if (isalnum((int) ((unsigned char) c)) == MagickFalse) + c=ReadBlobByte(image); + else + { + char + *p; + + /* + Determine a keyword and its value. + */ + p=keyword; + do + { + if ((size_t) (p-keyword) < (MaxTextExtent-1)) + *p++=c; + c=ReadBlobByte(image); + } while (isalnum((int) ((unsigned char) c)) || (c == '_')); + *p='\0'; + value_expected=MagickFalse; + while ((isspace((int) ((unsigned char) c)) != 0) || (c == '=')) + { + if (c == '=') + value_expected=MagickTrue; + c=ReadBlobByte(image); + } + if (LocaleCompare(keyword,"Y") == 0) + value_expected=MagickTrue; + if (value_expected == MagickFalse) + continue; + p=value; + while ((c != '\n') && (c != '\0') && (c != EOF)) + { + if ((size_t) (p-value) < (MaxTextExtent-1)) + *p++=c; + c=ReadBlobByte(image); + } + *p='\0'; + /* + Assign a value to the specified keyword. + */ + switch (*keyword) + { + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"format") == 0) + { + (void) CopyMagickString(format,value,MaxTextExtent); + break; + } + (void) FormatLocaleString(tag,MaxTextExtent,"hdr:%s",keyword); + (void) SetImageProperty(image,tag,value); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"gamma") == 0) + { + image->gamma=StringToDouble(value,(char **) NULL); + break; + } + (void) FormatLocaleString(tag,MaxTextExtent,"hdr:%s",keyword); + (void) SetImageProperty(image,tag,value); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(keyword,"primaries") == 0) + { + float + chromaticity[6], + white_point[2]; + + int + count; + + count=sscanf(value,"%g %g %g %g %g %g %g %g",&chromaticity[0], + &chromaticity[1],&chromaticity[2],&chromaticity[3], + &chromaticity[4],&chromaticity[5],&white_point[0], + &white_point[1]); + if (count == 8) + { + image->chromaticity.red_primary.x=chromaticity[0]; + image->chromaticity.red_primary.y=chromaticity[1]; + image->chromaticity.green_primary.x=chromaticity[2]; + image->chromaticity.green_primary.y=chromaticity[3]; + image->chromaticity.blue_primary.x=chromaticity[4]; + image->chromaticity.blue_primary.y=chromaticity[5]; + image->chromaticity.white_point.x=white_point[0], + image->chromaticity.white_point.y=white_point[1]; + } + break; + } + (void) FormatLocaleString(tag,MaxTextExtent,"hdr:%s",keyword); + (void) SetImageProperty(image,tag,value); + break; + } + case 'Y': + case 'y': + { + char + target[] = "Y"; + + if (strcmp(keyword,target) == 0) + { + int + height, + width; + + if (sscanf(value,"%d +X %d",&height,&width) == 2) + { + image->columns=(size_t) width; + image->rows=(size_t) height; + } + break; + } + (void) FormatLocaleString(tag,MaxTextExtent,"hdr:%s",keyword); + (void) SetImageProperty(image,tag,value); + break; + } + default: + { + (void) FormatLocaleString(tag,MaxTextExtent,"hdr:%s",keyword); + (void) SetImageProperty(image,tag,value); + break; + } + } + } + if ((image->columns == 0) && (image->rows == 0)) + while (isspace((int) ((unsigned char) c)) != 0) + c=ReadBlobByte(image); + } + if ((LocaleCompare(format,"32-bit_rle_rgbe") != 0) && + (LocaleCompare(format,"32-bit_rle_xyze") != 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize"); + (void) SetImageColorspace(image,RGBColorspace); + if (LocaleCompare(format,"32-bit_rle_xyze") == 0) + (void) SetImageColorspace(image,XYZColorspace); + image->compression=(image->columns < 8) || (image->columns > 0x7ffff) ? + NoCompression : RLECompression; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Read RGBE (red+green+blue+exponent) pixels. + */ + pixels=(unsigned char *) AcquireQuantumMemory(image->columns,4* + sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(pixels,0,4*image->columns*sizeof(*pixels)); + for (y=0; y < (ssize_t) image->rows; y++) + { + if (image->compression != RLECompression) + { + count=ReadBlob(image,4*image->columns*sizeof(*pixels),pixels); + if (count != (ssize_t) (4*image->columns*sizeof(*pixels))) + break; + } + else + { + count=ReadBlob(image,4*sizeof(*pixel),pixel); + if (count != 4) + break; + if ((size_t) ((((size_t) pixel[2]) << 8) | pixel[3]) != image->columns) + { + (void) memcpy(pixels,pixel,4*sizeof(*pixel)); + (void) ReadBlob(image,4*(image->columns-1)*sizeof(*pixels),pixels+4); + image->compression=NoCompression; + } + else + { + p=pixels; + for (i=0; i < 4; i++) + { + end=&pixels[(i+1)*image->columns]; + while (p < end) + { + count=ReadBlob(image,2*sizeof(*pixel),pixel); + if (count < 1) + break; + if (pixel[0] > 128) + { + count=(ssize_t) pixel[0]-128; + if ((count == 0) || (count > (ssize_t) (end-p))) + break; + while (count-- > 0) + *p++=pixel[1]; + } + else + { + count=(ssize_t) pixel[0]; + if ((count == 0) || (count > (ssize_t) (end-p))) + break; + *p++=pixel[1]; + if (--count > 0) + { + count=ReadBlob(image,(size_t) count*sizeof(*p),p); + if (count < 1) + break; + p+=count; + } + } + } + } + } + } + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + i=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (image->compression == RLECompression) + { + pixel[0]=pixels[x]; + pixel[1]=pixels[x+image->columns]; + pixel[2]=pixels[x+2*image->columns]; + pixel[3]=pixels[x+3*image->columns]; + } + else + { + pixel[0]=pixels[i++]; + pixel[1]=pixels[i++]; + pixel[2]=pixels[i++]; + pixel[3]=pixels[i++]; + } + SetPixelRed(q,0); + SetPixelGreen(q,0); + SetPixelBlue(q,0); + if (pixel[3] != 0) + { + gamma=pow(2.0,pixel[3]-(128.0+8.0)); + SetPixelRed(q,ClampToQuantum(QuantumRange*gamma*pixel[0])); + SetPixelGreen(q,ClampToQuantum(QuantumRange*gamma*pixel[1])); + SetPixelBlue(q,ClampToQuantum(QuantumRange*gamma*pixel[2])); + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r H D R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterHDRImage() adds attributes for the Radiance RGBE image format to the +% list of supported formats. The attributes include the image format tag, a +% method to read and/or write the format, whether the format supports the +% saving of more than one frame to the same file or blob, whether the format +% supports native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterHDRImage method is: +% +% size_t RegisterHDRImage(void) +% +*/ +ModuleExport size_t RegisterHDRImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("HDR"); + entry->decoder=(DecodeImageHandler *) ReadHDRImage; + entry->encoder=(EncodeImageHandler *) WriteHDRImage; + entry->description=ConstantString("Radiance RGBE image format"); + entry->magick_module=ConstantString("HDR"); + entry->magick=(IsImageFormatHandler *) IsHDR; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r H D R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterHDRImage() removes format registrations made by the +% HDR module from the list of supported formats. +% +% The format of the UnregisterHDRImage method is: +% +% UnregisterHDRImage(void) +% +*/ +ModuleExport void UnregisterHDRImage(void) +{ + (void) UnregisterMagickInfo("HDR"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e H D R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteHDRImage() writes an image in the Radience RGBE image format. +% +% The format of the WriteHDRImage method is: +% +% MagickBooleanType WriteHDRImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static size_t HDRWriteRunlengthPixels(Image *image,unsigned char *pixels) +{ +#define MinimumRunlength 4 + + size_t + p, + q; + + size_t + runlength; + + ssize_t + count, + previous_count; + + unsigned char + pixel[2]; + + for (p=0; p < image->columns; ) + { + q=p; + runlength=0; + previous_count=0; + while ((runlength < MinimumRunlength) && (q < image->columns)) + { + q+=runlength; + previous_count=(ssize_t) runlength; + runlength=1; + while ((pixels[q] == pixels[q+runlength]) && + ((q+runlength) < image->columns) && (runlength < 127)) + runlength++; + } + if ((previous_count > 1) && (previous_count == (ssize_t) (q-p))) + { + pixel[0]=(unsigned char) (128+previous_count); + pixel[1]=pixels[p]; + if (WriteBlob(image,2*sizeof(*pixel),pixel) < 1) + break; + p=q; + } + while (p < q) + { + count=(ssize_t) (q-p); + if (count > 128) + count=128; + pixel[0]=(unsigned char) count; + if (WriteBlob(image,sizeof(*pixel),pixel) < 1) + break; + if (WriteBlob(image,(size_t) count*sizeof(*pixel),&pixels[p]) < 1) + break; + p+=count; + } + if (runlength >= MinimumRunlength) + { + pixel[0]=(unsigned char) (128+runlength); + pixel[1]=pixels[q]; + if (WriteBlob(image,2*sizeof(*pixel),pixel) < 1) + break; + p+=runlength; + } + } + return(p); +} + +static MagickBooleanType WriteHDRImage(const ImageInfo *image_info,Image *image) +{ + char + header[MaxTextExtent]; + + const char + *property; + + MagickBooleanType + status; + + const PixelPacket + *p; + + ssize_t + i, + x; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + pixel[4], + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IsRGBColorspace(image->colorspace) == MagickFalse) + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Write header. + */ + (void) memset(header,' ',MaxTextExtent); + length=CopyMagickString(header,"#?RADIANCE\n",MaxTextExtent); + (void) WriteBlob(image,length,(unsigned char *) header); + property=GetImageProperty(image,"comment"); + if ((property != (const char *) NULL) && + (strchr(property,'\n') == (char *) NULL)) + { + count=FormatLocaleString(header,MagickPathExtent,"#%.*s\n", + MagickPathExtent-3,property); + (void) WriteBlob(image,(size_t) count,(unsigned char *) header); + } + property=GetImageProperty(image,"hdr:exposure"); + if (property != (const char *) NULL) + { + count=FormatLocaleString(header,MaxTextExtent,"EXPOSURE=%g\n", + strtod(property,(char **) NULL)); + (void) WriteBlob(image,(size_t) count,(unsigned char *) header); + } + if (image->gamma != 0.0) + { + count=FormatLocaleString(header,MaxTextExtent,"GAMMA=%g\n",image->gamma); + (void) WriteBlob(image,(size_t) count,(unsigned char *) header); + } + count=FormatLocaleString(header,MaxTextExtent, + "PRIMARIES=%g %g %g %g %g %g %g %g\n", + image->chromaticity.red_primary.x,image->chromaticity.red_primary.y, + image->chromaticity.green_primary.x,image->chromaticity.green_primary.y, + image->chromaticity.blue_primary.x,image->chromaticity.blue_primary.y, + image->chromaticity.white_point.x,image->chromaticity.white_point.y); + (void) WriteBlob(image,(size_t) count,(unsigned char *) header); + length=CopyMagickString(header,"FORMAT=32-bit_rle_rgbe\n\n",MaxTextExtent); + (void) WriteBlob(image,length,(unsigned char *) header); + count=FormatLocaleString(header,MaxTextExtent,"-Y %.20g +X %.20g\n", + (double) image->rows,(double) image->columns); + (void) WriteBlob(image,(size_t) count,(unsigned char *) header); + /* + Write HDR pixels. + */ + pixels=(unsigned char *) AcquireQuantumMemory(image->columns+128,4* + sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(pixels,0,4*(image->columns+128)*sizeof(*pixels)); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + if ((image->columns >= 8) && (image->columns <= 0x7ffff)) + { + pixel[0]=2; + pixel[1]=2; + pixel[2]=(unsigned char) (image->columns >> 8); + pixel[3]=(unsigned char) (image->columns & 0xff); + count=WriteBlob(image,4*sizeof(*pixel),pixel); + if (count != (ssize_t) (4*sizeof(*pixel))) + break; + } + i=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + double + gamma; + + pixel[0]=0; + pixel[1]=0; + pixel[2]=0; + pixel[3]=0; + gamma=QuantumScale*GetPixelRed(p); + if ((QuantumScale*GetPixelGreen(p)) > gamma) + gamma=QuantumScale*GetPixelGreen(p); + if ((QuantumScale*GetPixelBlue(p)) > gamma) + gamma=QuantumScale*GetPixelBlue(p); + if (gamma > MagickEpsilon) + { + int + exponent; + + gamma=frexp(gamma,&exponent)*256.0/gamma; + if (GetPixelRed(p) > 0) + pixel[0]=(unsigned char) (gamma*QuantumScale*GetPixelRed(p)); + if (GetPixelGreen(p) > 0) + pixel[1]=(unsigned char) (gamma*QuantumScale*GetPixelGreen(p)); + if (GetPixelBlue(p) > 0) + pixel[2]=(unsigned char) (gamma*QuantumScale*GetPixelBlue(p)); + pixel[3]=(unsigned char) (exponent+128); + } + if ((image->columns >= 8) && (image->columns <= 0x7ffff)) + { + pixels[x]=pixel[0]; + pixels[x+image->columns]=pixel[1]; + pixels[x+2*image->columns]=pixel[2]; + pixels[x+3*image->columns]=pixel[3]; + } + else + { + pixels[i++]=pixel[0]; + pixels[i++]=pixel[1]; + pixels[i++]=pixel[2]; + pixels[i++]=pixel[3]; + } + p++; + } + if ((image->columns >= 8) && (image->columns <= 0x7ffff)) + { + for (i=0; i < 4; i++) + length=HDRWriteRunlengthPixels(image,&pixels[i*image->columns]); + } + else + { + count=WriteBlob(image,4*image->columns*sizeof(*pixels),pixels); + if (count != (ssize_t) (4*image->columns*sizeof(*pixels))) + break; + } + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/heic.c b/ImageMagick-6.9.12-44/coders/heic.c new file mode 100644 index 0000000..dffbc59 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/heic.c @@ -0,0 +1,787 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H H EEEEE IIIII CCCC % +% H H E I C % +% HHHHH EEE I C % +% H H E I C % +% H H EEEEE IIIII CCCC % +% % +% % +% Read/Write Heic Image Format % +% % +% Dirk Farin % +% April 2018 % +% % +% Copyright 2018 Struktur AG % +% % +% Anton Kortunov % +% December 2017 % +% % +% Copyright 2017-2018 YANDEX LLC. % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/client.h" +#include "magick/colorspace-private.h" +#include "magick/property.h" +#include "magick/display.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/montage.h" +#include "magick/transform.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/module.h" +#include "magick/utility.h" +#if defined(MAGICKCORE_HEIC_DELEGATE) +#if defined(MAGICKCORE_WINDOWS_SUPPORT) +#include +#else +#include +#endif +#endif + +#if defined(MAGICKCORE_HEIC_DELEGATE) +static MagickBooleanType + WriteHEICImage(const ImageInfo *,Image *,ExceptionInfo *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d H E I C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadHEICImage retrieves an image via a file descriptor, decodes the image, +% and returns it. It allocates the memory necessary for the new Image +% structure and returns a pointer to the new image. +% +% The format of the ReadHEICImage method is: +% +% Image *ReadHEICImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType IsHeifSuccess(struct heif_error *error, Image *image) +{ + if (error->code == 0) + return(MagickTrue); + ThrowBinaryImageException(CorruptImageError,error->message,image->filename); +} + +static Image *ReadHEICImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + const StringInfo + *profile; + + heif_item_id + exif_id; + + Image + *image; + + int + count, + stride_y, + stride_cb, + stride_cr; + + MagickBooleanType + preserve_orientation, + status; + + size_t + length; + + ssize_t + y; + + struct heif_context + *heif_context; + + struct heif_decoding_options + *decode_options; + + struct heif_error + error; + + struct heif_image + *heif_image; + + struct heif_image_handle + *image_handle; + + const uint8_t + *p_y, + *p_cb, + *p_cr; + + void + *file_data; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + return(DestroyImageList(image)); + if (GetBlobSize(image) > (MagickSizeType) MAGICK_SSIZE_MAX) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + length=(size_t) GetBlobSize(image); + file_data=AcquireMagickMemory(length); + if (file_data == (void *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (ReadBlob(image,length,(unsigned char *) file_data) != (ssize_t) length) + { + file_data=RelinquishMagickMemory(file_data); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + /* + Decode HEIF file + */ + heif_context=heif_context_alloc(); + error=heif_context_read_from_memory_without_copy(heif_context,file_data, + length,NULL); + if (IsHeifSuccess(&error,image) == MagickFalse) + { + heif_context_free(heif_context); + file_data=RelinquishMagickMemory(file_data); + return(DestroyImageList(image)); + } + image_handle=(struct heif_image_handle *) NULL; + error=heif_context_get_primary_image_handle(heif_context,&image_handle); + if (IsHeifSuccess(&error,image) == MagickFalse) + { + heif_context_free(heif_context); + file_data=RelinquishMagickMemory(file_data); + return(DestroyImageList(image)); + } +#if LIBHEIF_NUMERIC_VERSION >= 0x01040000 + length=heif_image_handle_get_raw_color_profile_size(image_handle); + if (length > 0) + { + unsigned char + *color_buffer; + + /* + Read color profile. + */ + if ((MagickSizeType) length > GetBlobSize(image)) + { + heif_image_handle_release(image_handle); + heif_context_free(heif_context); + file_data=RelinquishMagickMemory(file_data); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + color_buffer=(unsigned char *) AcquireQuantumMemory(1,length); + if (color_buffer != (unsigned char *) NULL) + { + error=heif_image_handle_get_raw_color_profile(image_handle, + color_buffer); + if (error.code == 0) + { + StringInfo + *profile; + + profile=BlobToStringInfo(color_buffer,length); + if (profile != (StringInfo*) NULL) + { + (void) SetImageProfile(image,"icc",profile); + profile=DestroyStringInfo(profile); + } + } + } + color_buffer=(unsigned char *) RelinquishMagickMemory(color_buffer); + } +#endif + count=heif_image_handle_get_list_of_metadata_block_IDs(image_handle,"Exif", + &exif_id,1); + if (count > 0) + { + size_t + exif_size; + + unsigned char + *exif_buffer; + + /* + Read Exif profile. + */ + exif_size=heif_image_handle_get_metadata_size(image_handle,exif_id); + if ((MagickSizeType) exif_size > GetBlobSize(image)) + { + heif_image_handle_release(image_handle); + heif_context_free(heif_context); + file_data=RelinquishMagickMemory(file_data); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + exif_buffer=(unsigned char*) AcquireQuantumMemory(1,exif_size); + if (exif_buffer != (unsigned char*) NULL) + { + error=heif_image_handle_get_metadata(image_handle, + exif_id,exif_buffer); + if (error.code == 0) + { + StringInfo + *profile; + + /* + The first 4 byte should be skipped since they indicate the + offset to the start of the TIFF header of the Exif data. + */ + profile=(StringInfo*) NULL; + if (exif_size > 8) + profile=BlobToStringInfo(exif_buffer+4,(size_t) exif_size-4); + if (profile != (StringInfo*) NULL) + { + (void) SetImageProfile(image,"exif",profile); + profile=DestroyStringInfo(profile); + } + } + } + exif_buffer=(unsigned char *) RelinquishMagickMemory(exif_buffer); + } + /* + Set image size. + */ + image->columns=(size_t) heif_image_handle_get_width(image_handle); + image->rows=(size_t) heif_image_handle_get_height(image_handle); +#if LIBHEIF_NUMERIC_VERSION > 0x01040000 + image->depth=(size_t) heif_image_handle_get_luma_bits_per_pixel(image_handle); +#else + image->depth=8; +#endif + preserve_orientation=IsStringTrue(GetImageOption(image_info, + "heic:preserve-orientation")); + if (preserve_orientation == MagickFalse) + (void) SetImageProperty(image,"exif:Orientation","1"); + if (image_info->ping != MagickFalse) + { + image->colorspace=YCbCrColorspace; + heif_image_handle_release(image_handle); + heif_context_free(heif_context); + file_data=RelinquishMagickMemory(file_data); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + heif_image_handle_release(image_handle); + heif_context_free(heif_context); + file_data=RelinquishMagickMemory(file_data); + return(DestroyImageList(image)); + } + /* + Copy HEIF image into ImageMagick data structures + */ + (void) SetImageColorspace(image,YCbCrColorspace); + decode_options=heif_decoding_options_alloc(); +#if LIBHEIF_NUMERIC_VERSION > 0x01070000 + decode_options->convert_hdr_to_8bit=1; +#endif + if (preserve_orientation == MagickTrue) + decode_options->ignore_transformations=1; + error=heif_decode_image(image_handle,&heif_image,heif_colorspace_YCbCr, + heif_chroma_420,decode_options); + heif_decoding_options_free(decode_options); + if (IsHeifSuccess(&error,image) == MagickFalse) + { + heif_image_handle_release(image_handle); + heif_context_free(heif_context); + file_data=RelinquishMagickMemory(file_data); + return(DestroyImageList(image)); + } + /* + Correct the width and height of the image. + */ + image->columns=(size_t) heif_image_get_width(heif_image,heif_channel_Y); + image->rows=(size_t) heif_image_get_height(heif_image,heif_channel_Y); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + heif_image_release(heif_image); + heif_image_handle_release(image_handle); + heif_context_free(heif_context); + file_data=RelinquishMagickMemory(file_data); + return(DestroyImageList(image)); + } + p_y=heif_image_get_plane_readonly(heif_image,heif_channel_Y,&stride_y); + p_cb=heif_image_get_plane_readonly(heif_image,heif_channel_Cb,&stride_cb); + p_cr=heif_image_get_plane_readonly(heif_image,heif_channel_Cr,&stride_cr); + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *q; + + ssize_t + x; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum((unsigned char) p_y[y* + stride_y+x])); + SetPixelGreen(q,ScaleCharToQuantum((unsigned char) p_cb[(y/2)* + stride_cb+x/2])); + SetPixelBlue(q,ScaleCharToQuantum((unsigned char) p_cr[(y/2)* + stride_cr+x/2])); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + heif_image_release(heif_image); + heif_image_handle_release(image_handle); + heif_context_free(heif_context); + file_data=RelinquishMagickMemory(file_data); + profile=GetImageProfile(image,"icc"); + if (profile != (const StringInfo *) NULL) + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s H E I C % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsHEIC() returns MagickTrue if the image format type, identified by the +% magick string, is Heic. +% +% The format of the IsHEIC method is: +% +% MagickBooleanType IsHEIC(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsHEIC(const unsigned char *magick,const size_t length) +{ +#if defined(MAGICKCORE_HEIC_DELEGATE) +#if LIBHEIF_NUMERIC_VERSION >= 0x01040000 + enum heif_filetype_result + heif_filetype; + + if (length < 12) + return(MagickFalse); + heif_filetype=heif_check_filetype(magick,(int) length); + if (heif_filetype == heif_filetype_yes_supported) + return(MagickTrue); +#endif +#endif + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r H E I C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterHEICImage() adds attributes for the HEIC image format to the list of +% supported formats. The attributes include the image format tag, a method +% to read and/or write the format, whether the format supports the saving of +% more than one frame to the same file or blob, whether the format supports +% native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterHEICImage method is: +% +% size_t RegisterHEICImage(void) +% +*/ +ModuleExport size_t RegisterHEICImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("HEIC"); +#if defined(MAGICKCORE_HEIC_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadHEICImage; +#if LIBHEIF_NUMERIC_VERSION >= 0x01030000 + if (heif_have_encoder_for_format(heif_compression_HEVC)) + entry->encoder=(EncodeImageHandler *) WriteHEICImage; +#else + entry->encoder=(EncodeImageHandler *) WriteHEICImage; +#endif +#endif + entry->magick=(IsImageFormatHandler *) IsHEIC; + entry->description=ConstantString("Apple High efficiency Image Format"); + entry->mime_type=ConstantString("image/x-heic"); +#if defined(LIBHEIF_VERSION) + entry->version=ConstantString(LIBHEIF_VERSION); +#endif + entry->magick_module=ConstantString("HEIC"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); +#if LIBHEIF_NUMERIC_VERSION > 0x01060200 + entry=SetMagickInfo("AVIF"); +#if defined(MAGICKCORE_HEIC_DELEGATE) + if (heif_have_decoder_for_format(heif_compression_AV1)) + entry->decoder=(DecodeImageHandler *) ReadHEICImage; + if (heif_have_encoder_for_format(heif_compression_AV1)) + entry->encoder=(EncodeImageHandler *) WriteHEICImage; +#endif + entry->magick=(IsImageFormatHandler *) IsHEIC; + entry->description=ConstantString("AV1 Image File Format"); + entry->mime_type=ConstantString("image/x-heic"); +#if defined(LIBHEIF_VERSION) + entry->version=ConstantString(LIBHEIF_VERSION); +#endif + entry->magick_module=ConstantString("HEIC"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); +#endif + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r H E I C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterHEICImage() removes format registrations made by the HEIC module +% from the list of supported formats. +% +% The format of the UnregisterHEICImage method is: +% +% UnregisterHEICImage(void) +% +*/ +ModuleExport void UnregisterHEICImage(void) +{ + (void) UnregisterMagickInfo("AVIF"); + (void) UnregisterMagickInfo("HEIC"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e H E I C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteHEICImage() writes an HEIF image using the libheif library. +% +% The format of the WriteHEICImage method is: +% +% MagickBooleanType WriteHEICImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +#if defined(MAGICKCORE_HEIC_DELEGATE) +static struct heif_error heif_write_func(struct heif_context *context, + const void* data,size_t size,void* userdata) +{ + Image + *image; + + struct heif_error + error_ok; + + (void) context; + image=(Image*) userdata; + (void) WriteBlob(image,size,(const unsigned char *) data); + error_ok.code=heif_error_Ok; + error_ok.subcode=heif_suberror_Unspecified; + error_ok.message="ok"; + return(error_ok); +} + +static MagickBooleanType WriteHEICImage(const ImageInfo *image_info, + Image *image,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + MagickOffsetType + scene; + + ssize_t + y; + + struct heif_context + *heif_context; + + struct heif_encoder + *heif_encoder; + + struct heif_error + error; + + struct heif_image + *heif_image; + + struct heif_writer + writer; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); + if (status == MagickFalse) + return(status); + scene=0; + heif_context=heif_context_alloc(); + heif_image=(struct heif_image*) NULL; + heif_encoder=(struct heif_encoder*) NULL; + do + { + const PixelPacket + *p; + +#if LIBHEIF_NUMERIC_VERSION >= 0x01040000 + const StringInfo + *profile; +#endif + + int + stride_y, + stride_cb, + stride_cr; + + uint8_t + *p_y, + *p_cb, + *p_cr; + + /* + Get encoder for the specified format. + */ +#if LIBHEIF_NUMERIC_VERSION > 0x01060200 + if (LocaleCompare(image_info->magick,"AVIF") == 0) + error=heif_context_get_encoder_for_format(heif_context, + heif_compression_AV1,&heif_encoder); + else +#endif + error=heif_context_get_encoder_for_format(heif_context, + heif_compression_HEVC,&heif_encoder); + status=IsHeifSuccess(&error,image); + if (status == MagickFalse) + break; + /* + Transform colorspace to YCbCr. + */ + if (image->colorspace != YCbCrColorspace) + status=TransformImageColorspace(image,YCbCrColorspace); + if (status == MagickFalse) + break; + /* + Initialize HEIF encoder context. + */ + error=heif_image_create((int) image->columns,(int) image->rows, + heif_colorspace_YCbCr,heif_chroma_420,&heif_image); + status=IsHeifSuccess(&error,image); + if (status == MagickFalse) + break; +#if LIBHEIF_NUMERIC_VERSION >= 0x01040000 + profile=GetImageProfile(image,"icc"); + if (profile != (StringInfo *) NULL) + (void) heif_image_set_raw_color_profile(heif_image,"prof", + GetStringInfoDatum(profile),GetStringInfoLength(profile)); +#endif + error=heif_image_add_plane(heif_image,heif_channel_Y,(int) image->columns, + (int) image->rows,8); + status=IsHeifSuccess(&error,image); + if (status == MagickFalse) + break; + error=heif_image_add_plane(heif_image,heif_channel_Cb, + ((int) image->columns+1)/2,((int) image->rows+1)/2,8); + status=IsHeifSuccess(&error,image); + if (status == MagickFalse) + break; + error=heif_image_add_plane(heif_image,heif_channel_Cr, + ((int) image->columns+1)/2,((int) image->rows+1)/2,8); + status=IsHeifSuccess(&error,image); + if (status == MagickFalse) + break; + p_y=heif_image_get_plane(heif_image,heif_channel_Y,&stride_y); + p_cb=heif_image_get_plane(heif_image,heif_channel_Cb,&stride_cb); + p_cr=heif_image_get_plane(heif_image,heif_channel_Cr,&stride_cr); + /* + Copy image to heif_image + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + { + status=MagickFalse; + break; + } + if ((y & 0x01) == 0) + for (x=0; x < (ssize_t) image->columns; x+=2) + { + p_y[y*stride_y+x]=ScaleQuantumToChar(GetPixelRed(p)); + p_cb[y/2*stride_cb+x/2]=ScaleQuantumToChar(GetPixelGreen(p)); + p_cr[y/2*stride_cr+x/2]=ScaleQuantumToChar(GetPixelBlue(p)); + p++; + if ((x+1) < (ssize_t) image->columns) + { + p_y[y*stride_y+x+1]=ScaleQuantumToChar(GetPixelRed(p)); + p++; + } + } + else + for (x=0; x < (ssize_t) image->columns; x++) + { + p_y[y*stride_y+x]=ScaleQuantumToChar(GetPixelRed(p)); + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (status == MagickFalse) + break; + /* + Code and actually write the HEIC image + */ + if (image_info->quality != UndefinedCompressionQuality) + { + error=heif_encoder_set_lossy_quality(heif_encoder, + (int) image_info->quality); + status=IsHeifSuccess(&error,image); + if (status == MagickFalse) + break; + } + error=heif_context_encode_image(heif_context,heif_image,heif_encoder, + (const struct heif_encoding_options*) NULL, + (struct heif_image_handle**) NULL); + status=IsHeifSuccess(&error,image); + if (status == MagickFalse) + break; + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene, + GetImageListLength(image)); + if (status == MagickFalse) + break; + heif_encoder_release(heif_encoder); + heif_encoder=(struct heif_encoder*) NULL; + heif_image_release(heif_image); + heif_image=(struct heif_image*) NULL; + scene++; + } while (image_info->adjoin != MagickFalse); + writer.writer_api_version=1; + writer.write=heif_write_func; + error=heif_context_write(heif_context,&writer,image); + status=IsHeifSuccess(&error,image); + if (heif_encoder != (struct heif_encoder*) NULL) + heif_encoder_release(heif_encoder); + if (heif_image != (struct heif_image*) NULL) + heif_image_release(heif_image); + heif_context_free(heif_context); + (void) CloseBlob(image); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/histogram.c b/ImageMagick-6.9.12-44/coders/histogram.c new file mode 100644 index 0000000..abda65e --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/histogram.c @@ -0,0 +1,397 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H H IIIII SSSSS TTTTT OOO GGGG RRRR AAA M M % +% H H I SS T O O G R R A A MM MM % +% HHHHH I SSS T O O G GG RRRR AAAAA M M M % +% H H I SS T O O G G R R A A M M % +% H H IIIII SSSSS T OOO GGG R R A A M M % +% % +% % +% Write A Histogram Image. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/histogram.h" +#include "magick/image-private.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/token.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteHISTOGRAMImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r H I S T O G R A M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterHISTOGRAMImage() adds attributes for the Histogram image format +% to the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterHISTOGRAMImage method is: +% +% size_t RegisterHISTOGRAMImage(void) +% +*/ +ModuleExport size_t RegisterHISTOGRAMImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("HISTOGRAM"); + entry->encoder=(EncodeImageHandler *) WriteHISTOGRAMImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Histogram of the image"); + entry->magick_module=ConstantString("HISTOGRAM"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r H I S T O G R A M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterHISTOGRAMImage() removes format registrations made by the +% HISTOGRAM module from the list of supported formats. +% +% The format of the UnregisterHISTOGRAMImage method is: +% +% UnregisterHISTOGRAMImage(void) +% +*/ +ModuleExport void UnregisterHISTOGRAMImage(void) +{ + (void) UnregisterMagickInfo("HISTOGRAM"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e H I S T O G R A M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteHISTOGRAMImage() writes an image to a file in Histogram format. +% The image shows a histogram of the color (or gray) values in the image. The +% image consists of three overlaid histograms: a red one for the red channel, +% a green one for the green channel, and a blue one for the blue channel. The +% image comment contains a list of unique pixel values and the number of times +% each occurs in the image. +% +% This method is strongly based on a similar one written by +% muquit@warm.semcor.com which in turn is based on ppmhistmap of netpbm. +% +% The format of the WriteHISTOGRAMImage method is: +% +% MagickBooleanType WriteHISTOGRAMImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteHISTOGRAMImage(const ImageInfo *image_info, + Image *image) +{ +#define HistogramDensity "256x200" + + ChannelType + channel; + + char + filename[MaxTextExtent]; + + const char + *option; + + ExceptionInfo + *exception; + + Image + *histogram_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + MagickPixelPacket + *histogram; + + MagickRealType + maximum, + scale; + + RectangleInfo + geometry; + + const PixelPacket + *p; + + PixelPacket + *q, + *r; + + ssize_t + x; + + size_t + length; + + ssize_t + y; + + /* + Allocate histogram image. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + SetGeometry(image,&geometry); + if (image_info->density == (char *) NULL) + (void) ParseAbsoluteGeometry(HistogramDensity,&geometry); + else + (void) ParseAbsoluteGeometry(image_info->density,&geometry); + histogram_image=CloneImage(image,geometry.width,geometry.height,MagickTrue, + &image->exception); + if (histogram_image == (Image *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) SetImageStorageClass(histogram_image,DirectClass); + /* + Allocate histogram count arrays. + */ + length=MagickMax((size_t) ScaleQuantumToChar(QuantumRange)+1UL, + histogram_image->columns); + histogram=(MagickPixelPacket *) AcquireQuantumMemory(length, + sizeof(*histogram)); + if (histogram == (MagickPixelPacket *) NULL) + { + histogram_image=DestroyImage(histogram_image); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Initialize histogram count arrays. + */ + channel=image_info->channel; + (void) memset(histogram,0,length*sizeof(*histogram)); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + histogram[ScaleQuantumToChar(GetPixelRed(p))].red++; + if ((channel & GreenChannel) != 0) + histogram[ScaleQuantumToChar(GetPixelGreen(p))].green++; + if ((channel & BlueChannel) != 0) + histogram[ScaleQuantumToChar(GetPixelBlue(p))].blue++; + p++; + } + } + maximum=histogram[0].red; + for (x=0; x < (ssize_t) histogram_image->columns; x++) + { + if (((channel & RedChannel) != 0) && (maximum < histogram[x].red)) + maximum=histogram[x].red; + if (((channel & GreenChannel) != 0) && (maximum < histogram[x].green)) + maximum=histogram[x].green; + if (((channel & BlueChannel) != 0) && (maximum < histogram[x].blue)) + maximum=histogram[x].blue; + } + scale=0.0; + if (fabs((double) maximum) >= MagickEpsilon) + scale=(MagickRealType) histogram_image->rows/maximum; + /* + Initialize histogram image. + */ + exception=(&image->exception); + (void) QueryColorDatabase("#000",&histogram_image->background_color, + &image->exception); + (void) SetImageBackgroundColor(histogram_image); + for (x=0; x < (ssize_t) histogram_image->columns; x++) + { + q=GetAuthenticPixels(histogram_image,x,0,1,histogram_image->rows,exception); + if (q == (PixelPacket *) NULL) + break; + if ((channel & RedChannel) != 0) + { + y=CastDoubleToLong(ceil((double) histogram_image->rows-scale* + histogram[x].red-0.5)); + r=q+y; + for ( ; y < (ssize_t) histogram_image->rows; y++) + { + SetPixelRed(r,QuantumRange); + r++; + } + } + if ((channel & GreenChannel) != 0) + { + y=CastDoubleToLong(ceil((double) histogram_image->rows-scale* + histogram[x].green-0.5)); + r=q+y; + for ( ; y < (ssize_t) histogram_image->rows; y++) + { + SetPixelGreen(r,QuantumRange); + r++; + } + } + if ((channel & BlueChannel) != 0) + { + y=CastDoubleToLong(ceil((double) histogram_image->rows-scale* + histogram[x].blue-0.5)); + r=q+y; + for ( ; y < (ssize_t) histogram_image->rows; y++) + { + SetPixelBlue(r,QuantumRange); + r++; + } + } + if (SyncAuthenticPixels(histogram_image,exception) == MagickFalse) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + histogram_image->rows); + if (status == MagickFalse) + break; + } + /* + Relinquish resources. + */ + histogram=(MagickPixelPacket *) RelinquishMagickMemory(histogram); + option=GetImageOption(image_info,"histogram:unique-colors"); + if ((IsHistogramImage(image,exception) != MagickFalse) || + (IsMagickTrue(option) != MagickFalse) || + (GetImageOption(image_info,"format") != (const char *) NULL)) + { + FILE + *file; + + int + unique_file; + + /* + Add a unique colors as an image comment. + */ + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(filename); + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if ((unique_file != -1) && (file != (FILE *) NULL)) + { + char + *property; + + (void) GetNumberColors(image,file,&image->exception); + (void) fclose(file); + property=FileToString(filename,~0UL,&image->exception); + if (property != (char *) NULL) + { + (void) SetImageProperty(histogram_image,"comment",property); + property=DestroyString(property); + } + } + (void) RelinquishUniqueFileResource(filename); + } + /* + Write Histogram image. + */ + (void) CopyMagickString(histogram_image->filename,image_info->filename, + MaxTextExtent); + (void) ResetImagePage(histogram_image,"0x0+0+0"); + write_info=CloneImageInfo(image_info); + *write_info->magick='\0'; + (void) SetImageInfo(write_info,1,&image->exception); + if ((*write_info->magick == '\0') || + (LocaleCompare(write_info->magick,"HISTOGRAM") == 0)) + (void) FormatLocaleString(histogram_image->filename,MaxTextExtent, + "miff:%s",write_info->filename); + status=WriteImage(write_info,histogram_image); + histogram_image=DestroyImage(histogram_image); + write_info=DestroyImageInfo(write_info); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/hrz.c b/ImageMagick-6.9.12-44/coders/hrz.c new file mode 100644 index 0000000..4b74a91 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/hrz.c @@ -0,0 +1,352 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H H RRRR ZZZZZ % +% H H R R ZZ % +% HHHHH RRRR Z % +% H H R R ZZ % +% H H R R ZZZZZ % +% % +% % +% Read/Write Slow Scan TeleVision Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteHRZImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d H R Z I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadHRZImage() reads a Slow Scan TeleVision image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadHRZImage method is: +% +% Image *ReadHRZImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadHRZImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + ssize_t + x; + + PixelPacket + *q; + + unsigned char + *p; + + ssize_t + count, + y; + + size_t + length; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Convert HRZ raster image to pixel packets. + */ + image->columns=256; + image->rows=240; + image->depth=8; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + pixels=(unsigned char *) AcquireQuantumMemory(image->columns,3* + sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + length=(size_t) (3*image->columns); + for (y=0; y < (ssize_t) image->rows; y++) + { + count=ReadBlob(image,length,pixels); + if ((size_t) count != length) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + } + p=pixels; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(4**p++)); + SetPixelGreen(q,ScaleCharToQuantum(4**p++)); + SetPixelBlue(q,ScaleCharToQuantum(4**p++)); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse) + break; + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r H R Z I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterHRZImage() adds attributes for the HRZ X image format to the list +% of supported formats. The attributes include the image format tag, a +% method to read and/or write the format, whether the format supports the +% saving of more than one frame to the same file or blob, whether the format +% supports native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterHRZImage method is: +% +% size_t RegisterHRZImage(void) +% +*/ +ModuleExport size_t RegisterHRZImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("HRZ"); + entry->decoder=(DecodeImageHandler *) ReadHRZImage; + entry->encoder=(EncodeImageHandler *) WriteHRZImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Slow Scan TeleVision"); + entry->magick_module=ConstantString("HRZ"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r H R Z I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterHRZImage() removes format registrations made by the +% HRZ module from the list of supported formats. +% +% The format of the UnregisterHRZImage method is: +% +% UnregisterHRZImage(void) +% +*/ +ModuleExport void UnregisterHRZImage(void) +{ + (void) UnregisterMagickInfo("HRZ"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e H R Z I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteHRZImage() writes an image to a file in HRZ X image format. +% +% The format of the WriteHRZImage method is: +% +% MagickBooleanType WriteHRZImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteHRZImage(const ImageInfo *image_info,Image *image) +{ + Image + *hrz_image; + + MagickBooleanType + status; + + const PixelPacket + *p; + + ssize_t + x, + y; + + unsigned char + *q; + + ssize_t + count; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + hrz_image=ResizeImage(image,256,240,image->filter,image->blur, + &image->exception); + if (hrz_image == (Image *) NULL) + return(MagickFalse); + (void) TransformImageColorspace(hrz_image,sRGBColorspace); + /* + Allocate memory for pixels. + */ + pixels=(unsigned char *) AcquireQuantumMemory((size_t) hrz_image->columns, + 3*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + { + hrz_image=DestroyImage(hrz_image); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Convert MIFF to HRZ raster pixels. + */ + for (y=0; y < (ssize_t) hrz_image->rows; y++) + { + p=GetVirtualPixels(hrz_image,0,y,hrz_image->columns,1,&image->exception); + if (p == (PixelPacket *) NULL) + break; + q=pixels; + for (x=0; x < (ssize_t) hrz_image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelRed(p)/4); + *q++=ScaleQuantumToChar(GetPixelGreen(p)/4); + *q++=ScaleQuantumToChar(GetPixelBlue(p)/4); + p++; + } + count=WriteBlob(image,(size_t) (q-pixels),pixels); + if (count != (ssize_t) (q-pixels)) + break; + status=SetImageProgress(image,SaveImageTag,y,hrz_image->rows); + if (status == MagickFalse) + break; + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + hrz_image=DestroyImage(hrz_image); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/html.c b/ImageMagick-6.9.12-44/coders/html.c new file mode 100644 index 0000000..cd3db90 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/html.c @@ -0,0 +1,471 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H H TTTTT M M L % +% H H T MM MM L % +% HHHHH T M M M L % +% H H T M M L % +% H H T M M LLLLL % +% % +% % +% Write A Client-Side Image Map Using % +% Image Montage & Directory Information. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/paint.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteHTMLImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s H T M L % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsHTML() returns MagickTrue if the image format type, identified by the +% magick string, is HTML. +% +% The format of the IsHTML method is: +% +% MagickBooleanType IsHTML(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsHTML(const unsigned char *magick,const size_t length) +{ + if (length < 6) + return(MagickFalse); + if (LocaleNCompare((char *) magick+1,"html",5) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r H T M L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterHTMLImage() adds properties for the HTML image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterHTMLImage method is: +% +% size_t RegisterHTMLImage(void) +% +*/ +ModuleExport size_t RegisterHTMLImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("HTM"); + entry->encoder=(EncodeImageHandler *) WriteHTMLImage; + entry->magick=(IsImageFormatHandler *) IsHTML; + entry->adjoin=MagickFalse; + entry->description=ConstantString( + "Hypertext Markup Language and a client-side image map"); + entry->magick_module=ConstantString("HTML"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("HTML"); + entry->encoder=(EncodeImageHandler *) WriteHTMLImage; + entry->magick=(IsImageFormatHandler *) IsHTML; + entry->adjoin=MagickFalse; + entry->description=ConstantString( + "Hypertext Markup Language and a client-side image map"); + entry->magick_module=ConstantString("HTML"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("SHTML"); + entry->encoder=(EncodeImageHandler *) WriteHTMLImage; + entry->magick=(IsImageFormatHandler *) IsHTML; + entry->adjoin=MagickFalse; + entry->description=ConstantString( + "Hypertext Markup Language and a client-side image map"); + entry->magick_module=ConstantString("HTML"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r H T M L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterHTMLImage() removes format registrations made by the +% HTML module from the list of supported formats. +% +% The format of the UnregisterHTMLImage method is: +% +% UnregisterHTMLImage(void) +% +*/ +ModuleExport void UnregisterHTMLImage(void) +{ + (void) UnregisterMagickInfo("HTM"); + (void) UnregisterMagickInfo("HTML"); + (void) UnregisterMagickInfo("SHTML"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e H T M L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteHTMLImage() writes an image in the HTML encoded image format. +% +% The format of the WriteHTMLImage method is: +% +% MagickBooleanType WriteHTMLImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% +*/ + +static ssize_t WriteURLComponent(Image *image,const int c) +{ + char + encoding[MagickPathExtent], + html5; + + html5=isalnum(c) != 0 || (c == '-') || (c == '_') || (c == '.') || + (c == '!') || (c == '~') || (c == '*') || (c == '\'') || (c == '(') || + (c == ')') ? c : 0; + if (html5 != 0) + (void) FormatLocaleString(encoding,MagickPathExtent,"%c",html5); + else + (void) FormatLocaleString(encoding,MagickPathExtent,"%%%02X",c); + return(WriteBlobString(image,encoding)); +} + +static MagickBooleanType WriteHTMLImage(const ImageInfo *image_info, + Image *image) +{ + char + basename[MaxTextExtent], + buffer[MaxTextExtent], + filename[MaxTextExtent], + mapname[MaxTextExtent], + url[MaxTextExtent]; + + Image + *next; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + RectangleInfo + geometry; + + char + *p; + + /* + Open image. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) CloseBlob(image); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + *url='\0'; + if ((LocaleCompare(image_info->magick,"FTP") == 0) || + (LocaleCompare(image_info->magick,"HTTP") == 0)) + { + /* + Extract URL base from filename. + */ + p=strrchr(image->filename,'/'); + if (p != (char *) NULL) + { + p++; + (void) CopyMagickString(url,image_info->magick,MaxTextExtent); + (void) ConcatenateMagickString(url,":",MaxTextExtent); + url[strlen(url)+p-image->filename]='\0'; + (void) ConcatenateMagickString(url,image->filename, + p-image->filename+2); + (void) CopyMagickString(image->filename,p,MaxTextExtent); + } + } + /* + Refer to image map file. + */ + (void) CopyMagickString(filename,image->filename,MaxTextExtent); + AppendImageFormat("map",filename); + GetPathComponent(filename,BasePath,basename); + (void) CopyMagickString(mapname,basename,MaxTextExtent); + (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent); + (void) CopyMagickString(filename,image->filename,MaxTextExtent); + write_info=CloneImageInfo(image_info); + *write_info->magick='\0'; + write_info->adjoin=MagickTrue; + status=MagickTrue; + if (LocaleCompare(image_info->magick,"SHTML") != 0) + { + const char + *value; + + /* + Open output image file. + */ + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + /* + Write the HTML image file. + */ + (void) WriteBlobString(image,"\n"); + (void) WriteBlobString(image,"\n"); + (void) WriteBlobString(image,"\n"); + (void) WriteBlobString(image,"\n"); + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + (void) FormatLocaleString(buffer,MaxTextExtent,"%s\n", + value); + else + { + GetPathComponent(filename,BasePath,basename); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%s\n",basename); + } + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"\n"); + (void) WriteBlobString(image,"\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"

    %s

    \n", + image->filename); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"
    \n"); + (void) CopyMagickString(filename,image->filename,MaxTextExtent); + AppendImageFormat("png",filename); + (void) FormatLocaleString(buffer,MaxTextExtent,"\"Image\n",mapname, + filename); + (void) WriteBlobString(image,buffer); + /* + Determine the size and location of each image tile. + */ + SetGeometry(image,&geometry); + if (image->montage != (char *) NULL) + (void) ParseAbsoluteGeometry(image->montage,&geometry); + /* + Write an image map. + */ + (void) FormatLocaleString(buffer,MaxTextExtent, + "\n",mapname,mapname); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent," directory == (char *) NULL) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "%s\" shape=\"rect\" coords=\"0,0,%.20g,%.20g\" alt=\"\" />\n", + image->filename,(double) geometry.width-1,(double) geometry.height- + 1); + (void) WriteBlobString(image,buffer); + } + else + for (p=image->directory; *p != '\0'; p++) + if (*p != '\xff') + (void) WriteURLComponent(image,(unsigned char) *p); + else + { + (void) FormatLocaleString(buffer,MaxTextExtent,"\" shape=" + "\"rect\" coords=\"%.20g,%.20g,%.20g,%.20g\" alt=\"\" />\n", + (double) geometry.x,(double) geometry.y,(double) (geometry.x+ + geometry.width-1),(double) (geometry.y+geometry.height-1)); + (void) WriteBlobString(image,buffer); + if (*(p+1) != '\0') + { + (void) FormatLocaleString(buffer,MaxTextExtent, + " = (ssize_t) image->columns) + { + geometry.x=0; + geometry.y+=(ssize_t) geometry.height; + } + } + (void) WriteBlobString(image,"\n"); + (void) CopyMagickString(filename,image->filename,MaxTextExtent); + (void) WriteBlobString(image,"
    \n"); + (void) WriteBlobString(image,"\n"); + (void) WriteBlobString(image,"\n"); + (void) CloseBlob(image); + /* + Write the image as PNG. + */ + (void) CopyMagickString(image->filename,filename,MaxTextExtent); + AppendImageFormat("png",image->filename); + next=GetNextImageInList(image); + image->next=NewImageList(); + (void) CopyMagickString(image->magick,"PNG",MaxTextExtent); + (void) WriteImage(write_info,image); + image->next=next; + /* + Determine image map filename. + */ + GetPathComponent(image->filename,BasePath,filename); + (void) ConcatenateMagickString(filename,"_map.shtml",MaxTextExtent); + (void) CopyMagickString(image->filename,filename,MaxTextExtent); + } + /* + Open image map. + */ + status=OpenBlob(write_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + write_info=DestroyImageInfo(write_info); + /* + Determine the size and location of each image tile. + */ + SetGeometry(image,&geometry); + if (image->montage != (char *) NULL) + (void) ParseAbsoluteGeometry(image->montage,&geometry); + /* + Write an image map. + */ + (void) FormatLocaleString(buffer,MaxTextExtent, + "\n",mapname,mapname); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent," directory == (char *) NULL) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "%s\" shape=\"rect\" coords=\"0,0,%.20g,%.20g\" alt=\"\" />\n", + image->filename,(double) geometry.width-1,(double) geometry.height-1); + (void) WriteBlobString(image,buffer); + } + else + for (p=image->directory; *p != '\0'; p++) + if (*p != '\xff') + (void) WriteURLComponent(image,(unsigned char) *p); + else + { + (void) FormatLocaleString(buffer,MaxTextExtent,"\" shape=\"rect\"" + " coords=\"%.20g,%.20g,%.20g,%.20g\" alt=\"\" />\n", + (double) geometry.x,(double) geometry.y,geometry.x+(double) + geometry.width-1,geometry.y+(double) geometry.height-1); + (void) WriteBlobString(image,buffer); + if (*(p+1) != '\0') + { + (void) FormatLocaleString(buffer,MaxTextExtent, + " = (ssize_t) image->columns) + { + geometry.x=0; + geometry.y+=(ssize_t) geometry.height; + } + } + (void) WriteBlobString(image,"\n"); + (void) CloseBlob(image); + (void) CopyMagickString(image->filename,filename,MaxTextExtent); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/icon.c b/ImageMagick-6.9.12-44/coders/icon.c new file mode 100644 index 0000000..7e1d198 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/icon.c @@ -0,0 +1,1392 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% IIIII CCCC OOO N N % +% I C O O NN N % +% I C O O N N N % +% I C O O N NN % +% IIIII CCCC OOO N N % +% % +% % +% Read Microsoft Windows Icon Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/nt-base-private.h" +#include "magick/nt-feature.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/quantize.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Define declarations. +*/ +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__MINGW32__) +#define BI_RGB 0 +#define BI_RLE8 1 +#define BI_BITFIELDS 3 +#endif +#define MaxIcons 1024 + +/* + Typedef declarations. +*/ +typedef struct _IconEntry +{ + unsigned char + width, + height, + colors, + reserved; + + unsigned short int + planes, + bits_per_pixel; + + size_t + size, + offset; +} IconEntry; + +typedef struct _IconFile +{ + short + reserved, + resource_type, + count; + + IconEntry + directory[MaxIcons]; +} IconFile; + +typedef struct _IconInfo +{ + size_t + file_size, + ba_offset, + offset_bits, + size; + + ssize_t + width, + height; + + unsigned short + planes, + bits_per_pixel; + + size_t + compression, + image_size, + x_pixels, + y_pixels, + number_colors, + red_mask, + green_mask, + blue_mask, + alpha_mask, + colors_important; + + ssize_t + colorspace; +} IconInfo; + +/* + Forward declaractions. +*/ +static Image + *AutoResizeImage(const Image *,const char *,MagickOffsetType *, + ExceptionInfo *); + +static MagickBooleanType + WriteICONImage(const ImageInfo *,Image *); + +Image *AutoResizeImage(const Image *image,const char *option, + MagickOffsetType *count,ExceptionInfo *exception) +{ + #define MAX_SIZES 16 + + char + *q; + + const char + *p; + + Image + *resized, + *images; + + ssize_t + i; + + size_t + sizes[MAX_SIZES]={256,192,128,96,64,48,40,32,24,16}; + + images=NULL; + *count=0; + i=0; + p=option; + while (*p != '\0' && i < MAX_SIZES) + { + size_t + size; + + while ((isspace((int) ((unsigned char) *p)) != 0)) + p++; + + size=(size_t)strtol(p,&q,10); + if ((p == q) || (size < 16) || (size > 256)) + return((Image *) NULL); + + p=q; + sizes[i++]=size; + + while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ',')) + p++; + } + + if (i==0) + i=10; + *count=i; + for (i=0; i < *count; i++) + { + resized=ResizeImage(image,sizes[i],sizes[i],image->filter,image->blur, + exception); + if (resized == (Image *) NULL) + return(DestroyImageList(images)); + + if (images == (Image *) NULL) + images=resized; + else + AppendImageToList(&images,resized); + } + return(images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d I C O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadICONImage() reads a Microsoft icon image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadICONImage method is: +% +% Image *ReadICONImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadICONImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + IconFile + icon_file; + + IconInfo + icon_info; + + Image + *image; + + MagickBooleanType + status; + + MagickSizeType + extent; + + IndexPacket + *indexes; + + ssize_t + i, + x; + + PixelPacket + *q; + + unsigned char + *p; + + size_t + bit, + byte, + bytes_per_line, + one, + scanline_pad; + + ssize_t + count, + offset, + y; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"%s",image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + icon_file.reserved=(short) ReadBlobLSBShort(image); + icon_file.resource_type=(short) ReadBlobLSBShort(image); + icon_file.count=(short) ReadBlobLSBShort(image); + if ((icon_file.reserved != 0) || + ((icon_file.resource_type != 1) && (icon_file.resource_type != 2)) || + (icon_file.count > MaxIcons)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + extent=0; + for (i=0; i < icon_file.count; i++) + { + icon_file.directory[i].width=(unsigned char) ReadBlobByte(image); + icon_file.directory[i].height=(unsigned char) ReadBlobByte(image); + icon_file.directory[i].colors=(unsigned char) ReadBlobByte(image); + icon_file.directory[i].reserved=(unsigned char) ReadBlobByte(image); + icon_file.directory[i].planes=(unsigned short) ReadBlobLSBShort(image); + icon_file.directory[i].bits_per_pixel=(unsigned short) + ReadBlobLSBShort(image); + icon_file.directory[i].size=ReadBlobLSBLong(image); + icon_file.directory[i].offset=ReadBlobLSBLong(image); + if (EOFBlob(image) != MagickFalse) + break; + extent=MagickMax(extent,icon_file.directory[i].size); + } + if ((EOFBlob(image) != MagickFalse) || (extent > GetBlobSize(image))) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + one=1; + for (i=0; i < icon_file.count; i++) + { + /* + Verify Icon identifier. + */ + offset=(ssize_t) SeekBlob(image,(MagickOffsetType) + icon_file.directory[i].offset,SEEK_SET); + if (offset < 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + icon_info.size=ReadBlobLSBLong(image); + icon_info.width=(unsigned char) ReadBlobLSBSignedLong(image); + icon_info.height=(unsigned char) (ReadBlobLSBSignedLong(image)/2); + icon_info.planes=ReadBlobLSBShort(image); + icon_info.bits_per_pixel=ReadBlobLSBShort(image); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + if (((icon_info.planes == 18505) && (icon_info.bits_per_pixel == 21060)) || + (icon_info.size == 0x474e5089)) + { + Image + *icon_image; + + ImageInfo + *read_info; + + size_t + length; + + unsigned char + *png; + + /* + Icon image encoded as a compressed PNG image. + */ + length=icon_file.directory[i].size; + if ((length < 16) || (~length < 16)) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + png=(unsigned char *) AcquireQuantumMemory(length,sizeof(*png)); + if (png == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memcpy(png,"\211PNG\r\n\032\n\000\000\000\015",12); + png[12]=(unsigned char) icon_info.planes; + png[13]=(unsigned char) (icon_info.planes >> 8); + png[14]=(unsigned char) icon_info.bits_per_pixel; + png[15]=(unsigned char) (icon_info.bits_per_pixel >> 8); + count=ReadBlob(image,length-16,png+16); + if (count != (ssize_t) (length-16)) + { + png=(unsigned char *) RelinquishMagickMemory(png); + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + } + read_info=CloneImageInfo(image_info); + (void) CopyMagickString(read_info->magick,"PNG",MaxTextExtent); + icon_image=BlobToImage(read_info,png,length,exception); + read_info=DestroyImageInfo(read_info); + png=(unsigned char *) RelinquishMagickMemory(png); + if (icon_image == (Image *) NULL) + return(DestroyImageList(image)); + DestroyBlob(icon_image); + icon_image->blob=ReferenceBlob(image->blob); + ReplaceImageInList(&image,icon_image); + icon_image->scene=i; + } + else + { + if (icon_info.bits_per_pixel > 32) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + icon_info.compression=ReadBlobLSBLong(image); + icon_info.image_size=ReadBlobLSBLong(image); + icon_info.x_pixels=ReadBlobLSBLong(image); + icon_info.y_pixels=ReadBlobLSBLong(image); + icon_info.number_colors=ReadBlobLSBLong(image); + if (icon_info.number_colors > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + icon_info.colors_important=ReadBlobLSBLong(image); + image->matte=MagickTrue; + image->columns=(size_t) icon_file.directory[i].width; + if ((ssize_t) image->columns > icon_info.width) + image->columns=(size_t) icon_info.width; + if (image->columns == 0) + image->columns=256; + image->rows=(size_t) icon_file.directory[i].height; + if ((ssize_t) image->rows > icon_info.height) + image->rows=(size_t) icon_info.height; + if (image->rows == 0) + image->rows=256; + image->depth=icon_info.bits_per_pixel; + if (image->depth > 16) + image->depth=8; + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " scene = %.20g",(double) i); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " size = %.20g",(double) icon_info.size); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " width = %.20g",(double) icon_file.directory[i].width); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " height = %.20g",(double) icon_file.directory[i].height); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " colors = %.20g",(double ) icon_info.number_colors); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " planes = %.20g",(double) icon_info.planes); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " bpp = %.20g",(double) icon_info.bits_per_pixel); + } + if ((icon_info.number_colors != 0) || (icon_info.bits_per_pixel <= 16U)) + { + image->storage_class=PseudoClass; + image->colors=icon_info.number_colors; + if ((image->colors == 0) || (image->colors > 256)) + image->colors=one << icon_info.bits_per_pixel; + } + if (image->storage_class == PseudoClass) + { + ssize_t + i; + + unsigned char + *icon_colormap; + + /* + Read Icon raster colormap. + */ + if (image->colors > GetBlobSize(image)) + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + icon_colormap=(unsigned char *) AcquireQuantumMemory((size_t) + image->colors,4UL*sizeof(*icon_colormap)); + if (icon_colormap == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,(size_t) (4*image->colors),icon_colormap); + if (count != (ssize_t) (4*image->colors)) + { + icon_colormap=(unsigned char *) RelinquishMagickMemory( + icon_colormap); + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + } + p=icon_colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].blue=(Quantum) ScaleCharToQuantum(*p++); + image->colormap[i].green=(Quantum) ScaleCharToQuantum(*p++); + image->colormap[i].red=(Quantum) ScaleCharToQuantum(*p++); + p++; + } + icon_colormap=(unsigned char *) RelinquishMagickMemory(icon_colormap); + } + /* + Convert Icon raster image to pixel packets. + */ + if ((image_info->ping != MagickFalse) && + (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + bytes_per_line=(((image->columns*icon_info.bits_per_pixel)+31) & + ~31) >> 3; + (void) bytes_per_line; + scanline_pad=((((image->columns*icon_info.bits_per_pixel)+31) & ~31)- + (image->columns*icon_info.bits_per_pixel)) >> 3; + switch (icon_info.bits_per_pixel) + { + case 1: + { + /* + Convert bitmap scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) (image->columns-7); x+=8) + { + byte=(size_t) ReadBlobByte(image); + for (bit=0; bit < 8; bit++) + SetPixelIndex(indexes+x+bit,((byte & (0x80 >> bit)) != 0 ? + 0x01 : 0x00)); + } + if ((image->columns % 8) != 0) + { + byte=(size_t) ReadBlobByte(image); + for (bit=0; bit < (image->columns % 8); bit++) + SetPixelIndex(indexes+x+bit,((byte & (0x80 >> bit)) != 0 ? + 0x01 : 0x00)); + } + for (x=0; x < (ssize_t) scanline_pad; x++) + (void) ReadBlobByte(image); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,image->rows-y-1, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 4: + { + /* + Read 4-bit Icon scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < ((ssize_t) image->columns-1); x+=2) + { + byte=(size_t) ReadBlobByte(image); + SetPixelIndex(indexes+x,((byte >> 4) & 0xf)); + SetPixelIndex(indexes+x+1,((byte) & 0xf)); + } + if ((image->columns % 2) != 0) + { + byte=(size_t) ReadBlobByte(image); + SetPixelIndex(indexes+x,((byte >> 4) & 0xf)); + } + for (x=0; x < (ssize_t) scanline_pad; x++) + (void) ReadBlobByte(image); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,image->rows-y-1, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 8: + { + /* + Convert PseudoColor scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + byte=(size_t) ReadBlobByte(image); + SetPixelIndex(indexes+x,byte); + } + for (x=0; x < (ssize_t) scanline_pad; x++) + (void) ReadBlobByte(image); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,image->rows-y-1, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 16: + { + /* + Convert PseudoColor scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + byte=(size_t) ReadBlobByte(image); + byte|=((size_t) ReadBlobByte(image) << 8); + SetPixelIndex(indexes+x,byte); + } + for (x=0; x < (ssize_t) scanline_pad; x++) + (void) ReadBlobByte(image); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,image->rows-y-1, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 24: + case 32: + { + /* + Convert DirectColor scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + SetPixelGreen(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + SetPixelRed(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + if (icon_info.bits_per_pixel == 32) + SetPixelAlpha(q,ScaleCharToQuantum((unsigned char) + ReadBlobByte(image))); + q++; + } + if (icon_info.bits_per_pixel == 24) + for (x=0; x < (ssize_t) scanline_pad; x++) + (void) ReadBlobByte(image); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,image->rows-y-1, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + default: + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + if ((image_info->ping == MagickFalse) && + (icon_info.bits_per_pixel <= 16)) + (void) SyncImage(image); + if (icon_info.bits_per_pixel != 32) + { + /* + Read the ICON alpha mask. + */ + image->storage_class=DirectClass; + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < ((ssize_t) image->columns-7); x+=8) + { + byte=(size_t) ReadBlobByte(image); + for (bit=0; bit < 8; bit++) + SetPixelOpacity(q+x+bit,(((byte & (0x80 >> bit)) != 0) ? + TransparentOpacity : OpaqueOpacity)); + } + if ((image->columns % 8) != 0) + { + byte=(size_t) ReadBlobByte(image); + for (bit=0; bit < (image->columns % 8); bit++) + SetPixelOpacity(q+x+bit,(((byte & (0x80 >> bit)) != 0) ? + TransparentOpacity : OpaqueOpacity)); + } + if ((image->columns % 32) != 0) + for (x=0; x < (ssize_t) ((32-(image->columns % 32))/8); x++) + (void) ReadBlobByte(image); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (i < (ssize_t) (icon_file.count-1)) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r I C O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterICONImage() adds attributes for the Icon image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterICONImage method is: +% +% size_t RegisterICONImage(void) +% +*/ +ModuleExport size_t RegisterICONImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("CUR"); + entry->decoder=(DecodeImageHandler *) ReadICONImage; + entry->encoder=(EncodeImageHandler *) WriteICONImage; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Microsoft icon"); + entry->magick_module=ConstantString("ICON"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("ICO"); + entry->decoder=(DecodeImageHandler *) ReadICONImage; + entry->encoder=(EncodeImageHandler *) WriteICONImage; + entry->adjoin=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Microsoft icon"); + entry->magick_module=ConstantString("ICON"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("ICON"); + entry->decoder=(DecodeImageHandler *) ReadICONImage; + entry->encoder=(EncodeImageHandler *) WriteICONImage; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Microsoft icon"); + entry->magick_module=ConstantString("ICON"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r I C O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterICONImage() removes format registrations made by the +% ICON module from the list of supported formats. +% +% The format of the UnregisterICONImage method is: +% +% UnregisterICONImage(void) +% +*/ +ModuleExport void UnregisterICONImage(void) +{ + (void) UnregisterMagickInfo("CUR"); + (void) UnregisterMagickInfo("ICO"); + (void) UnregisterMagickInfo("ICON"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e I C O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteICONImage() writes an image in Microsoft Windows bitmap encoded +% image format, version 3 for Windows or (if the image has a matte channel) +% version 4. +% +% It encodes any subimage as a compressed PNG image ("BI_PNG)", only when its +% dimensions are 256x256 and image->compression is undefined or is defined as +% ZipCompression. +% +% The format of the WriteICONImage method is: +% +% MagickBooleanType WriteICONImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteICONImage(const ImageInfo *image_info, + Image *image) +{ + const char + *option; + + IconFile + icon_file; + + IconInfo + icon_info; + + Image + *images, + *next; + + MagickBooleanType + status; + + MagickOffsetType + offset, + scene; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + unsigned char + *q; + + size_t + bytes_per_line, + imageListLength, + scanline_pad; + + ssize_t + y; + + unsigned char + bit, + byte, + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + images=(Image *) NULL; + option=GetImageOption(image_info,"icon:auto-resize"); + if (option != (const char *) NULL) + { + images=AutoResizeImage(image,option,&scene,&image->exception); + if (images == (Image *) NULL) + ThrowWriterException(ImageError,"InvalidDimensions"); + } + else + { + scene=0; + next=image; + do + { + if ((image->columns > 256L) || (image->rows > 256L)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + scene++; + next=SyncNextImageInList(next); + } while ((next != (Image *) NULL) && (image_info->adjoin != + MagickFalse)); + } + /* + Dump out a ICON header template to be properly initialized later. + */ + (void) WriteBlobLSBShort(image,0); + (void) WriteBlobLSBShort(image,1); + (void) WriteBlobLSBShort(image,(unsigned char) scene); + (void) memset(&icon_file,0,sizeof(icon_file)); + (void) memset(&icon_info,0,sizeof(icon_info)); + scene=0; + next=(images != (Image *) NULL) ? images : image; + do + { + (void) WriteBlobByte(image,icon_file.directory[scene].width); + (void) WriteBlobByte(image,icon_file.directory[scene].height); + (void) WriteBlobByte(image,icon_file.directory[scene].colors); + (void) WriteBlobByte(image,icon_file.directory[scene].reserved); + (void) WriteBlobLSBShort(image,icon_file.directory[scene].planes); + (void) WriteBlobLSBShort(image,icon_file.directory[scene].bits_per_pixel); + (void) WriteBlobLSBLong(image,(unsigned int) + icon_file.directory[scene].size); + (void) WriteBlobLSBLong(image,(unsigned int) + icon_file.directory[scene].offset); + scene++; + next=SyncNextImageInList(next); + } while ((next != (Image *) NULL) && (image_info->adjoin != MagickFalse)); + scene=0; + next=(images != (Image *) NULL) ? images : image; + imageListLength=GetImageListLength(image); + do + { + if ((next->columns > 255L) && (next->rows > 255L) && + ((next->compression == UndefinedCompression) || + (next->compression == ZipCompression))) + { + Image + *write_image; + + ImageInfo + *write_info; + + size_t + length; + + unsigned char + *png; + + write_image=CloneImage(next,0,0,MagickTrue,&image->exception); + if (write_image == (Image *) NULL) + { + images=DestroyImageList(images); + return(MagickFalse); + } + write_info=CloneImageInfo(image_info); + (void) CopyMagickString(write_info->magick,"PNG",MagickPathExtent); + length=0; + + /* Don't write any ancillary chunks except for gAMA */ + (void) SetImageArtifact(write_image,"png:include-chunk","none,gama"); + + /* Only write PNG32 formatted PNG (32-bit RGBA), 8 bits per channel */ + (void) SetImageArtifact(write_image,"png:format","png32"); + (void) SetImageArtifact(write_image,"png:color-type","6"); + png=(unsigned char *) ImageToBlob(write_info,write_image,&length, + &image->exception); + write_image=DestroyImageList(write_image); + write_info=DestroyImageInfo(write_info); + if (png == (unsigned char *) NULL) + { + images=DestroyImageList(images); + return(MagickFalse); + } + icon_file.directory[scene].width=0; + icon_file.directory[scene].height=0; + icon_file.directory[scene].colors=0; + icon_file.directory[scene].reserved=0; + icon_file.directory[scene].planes=1; + icon_file.directory[scene].bits_per_pixel=32; + icon_file.directory[scene].size=(size_t) length; + icon_file.directory[scene].offset=(size_t) TellBlob(image); + (void) WriteBlob(image,(size_t) length,png); + png=(unsigned char *) RelinquishMagickMemory(png); + } + else + { + /* + Initialize ICON raster file header. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + icon_info.file_size=14+12+28; + icon_info.offset_bits=icon_info.file_size; + icon_info.compression=BI_RGB; + if ((next->storage_class != DirectClass) && (next->colors > 256)) + (void) SetImageStorageClass(next,DirectClass); + if (next->storage_class == DirectClass) + { + /* + Full color ICON raster. + */ + icon_info.number_colors=0; + icon_info.bits_per_pixel=32; + icon_info.compression=(size_t) BI_RGB; + } + else + { + size_t + one; + + /* + Colormapped ICON raster. + */ + icon_info.bits_per_pixel=8; + if (next->colors <= 16) + icon_info.bits_per_pixel=4; + if (next->colors <= 2) + icon_info.bits_per_pixel=1; + one=1; + icon_info.number_colors=one << icon_info.bits_per_pixel; + if (icon_info.number_colors < next->colors) + { + (void) SetImageStorageClass(next,DirectClass); + icon_info.number_colors=0; + icon_info.bits_per_pixel=(unsigned short) 24; + icon_info.compression=(size_t) BI_RGB; + } + else + { + size_t + one; + + one=1; + icon_info.file_size+=3*(one << icon_info.bits_per_pixel); + icon_info.offset_bits+=3*(one << icon_info.bits_per_pixel); + icon_info.file_size+=(one << icon_info.bits_per_pixel); + icon_info.offset_bits+=(one << icon_info.bits_per_pixel); + } + } + bytes_per_line=(((next->columns*icon_info.bits_per_pixel)+31) & + ~31) >> 3; + icon_info.ba_offset=0; + icon_info.width=(ssize_t) next->columns; + icon_info.height=(ssize_t) next->rows; + icon_info.planes=1; + icon_info.image_size=bytes_per_line*next->rows; + icon_info.size=40; + icon_info.size+=(4*icon_info.number_colors); + icon_info.size+=icon_info.image_size; + icon_info.size+=(((icon_info.width+31) & ~31) >> 3)*icon_info.height; + icon_info.file_size+=icon_info.image_size; + icon_info.x_pixels=0; + icon_info.y_pixels=0; + switch (next->units) + { + case UndefinedResolution: + case PixelsPerInchResolution: + { + icon_info.x_pixels=(size_t) (100.0*next->x_resolution/2.54); + icon_info.y_pixels=(size_t) (100.0*next->y_resolution/2.54); + break; + } + case PixelsPerCentimeterResolution: + { + icon_info.x_pixels=(size_t) (100.0*next->x_resolution); + icon_info.y_pixels=(size_t) (100.0*next->y_resolution); + break; + } + } + icon_info.colors_important=icon_info.number_colors; + /* + Convert MIFF to ICON raster pixels. + */ + pixels=(unsigned char *) AcquireQuantumMemory((size_t) + icon_info.image_size,sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + { + images=DestroyImageList(images); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(pixels,0,(size_t) icon_info.image_size); + switch (icon_info.bits_per_pixel) + { + case 1: + { + size_t + bit, + byte; + + /* + Convert PseudoClass image to a ICON monochrome image. + */ + for (y=0; y < (ssize_t) next->rows; y++) + { + p=GetVirtualPixels(next,0,y,next->columns,1,&next->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(next); + q=pixels+(next->rows-y-1)*bytes_per_line; + bit=0; + byte=0; + for (x=0; x < (ssize_t) next->columns; x++) + { + byte<<=1; + byte|=GetPixelIndex(indexes+x) != 0 ? 0x01 : 0x00; + bit++; + if (bit == 8) + { + *q++=(unsigned char) byte; + bit=0; + byte=0; + } + } + if (bit != 0) + *q++=(unsigned char) (byte << (8-bit)); + if (next->previous == (Image *) NULL) + { + status=SetImageProgress(next,SaveImageTag,y,next->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 4: + { + size_t + nibble, + byte; + + /* + Convert PseudoClass image to a ICON monochrome image. + */ + for (y=0; y < (ssize_t) next->rows; y++) + { + p=GetVirtualPixels(next,0,y,next->columns,1,&next->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(next); + q=pixels+(next->rows-y-1)*bytes_per_line; + nibble=0; + byte=0; + for (x=0; x < (ssize_t) next->columns; x++) + { + byte<<=4; + byte|=((size_t) GetPixelIndex(indexes+x) & 0x0f); + nibble++; + if (nibble == 2) + { + *q++=(unsigned char) byte; + nibble=0; + byte=0; + } + } + if (nibble != 0) + *q++=(unsigned char) (byte << 4); + if (next->previous == (Image *) NULL) + { + status=SetImageProgress(next,SaveImageTag,y,next->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 8: + { + /* + Convert PseudoClass packet to ICON pixel. + */ + for (y=0; y < (ssize_t) next->rows; y++) + { + p=GetVirtualPixels(next,0,y,next->columns,1,&next->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(next); + q=pixels+(next->rows-y-1)*bytes_per_line; + for (x=0; x < (ssize_t) next->columns; x++) + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + if (next->previous == (Image *) NULL) + { + status=SetImageProgress(next,SaveImageTag,y,next->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 24: + case 32: + { + /* + Convert DirectClass packet to ICON BGR888 or BGRA8888 pixel. + */ + for (y=0; y < (ssize_t) next->rows; y++) + { + p=GetVirtualPixels(next,0,y,next->columns,1,&next->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels+(next->rows-y-1)*bytes_per_line; + for (x=0; x < (ssize_t) next->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelRed(p)); + if (next->matte == MagickFalse) + *q++=ScaleQuantumToChar(QuantumRange); + else + *q++=ScaleQuantumToChar(GetPixelAlpha(p)); + p++; + } + if (icon_info.bits_per_pixel == 24) + for (x=3L*(ssize_t) next->columns; x < (ssize_t) bytes_per_line; x++) + *q++=0x00; + if (next->previous == (Image *) NULL) + { + status=SetImageProgress(next,SaveImageTag,y,next->rows); + if (status == MagickFalse) + break; + } + } + break; + } + } + /* + Write 40-byte version 3+ bitmap header. + */ + icon_file.directory[scene].width=(unsigned char) icon_info.width; + icon_file.directory[scene].height=(unsigned char) icon_info.height; + icon_file.directory[scene].colors=(unsigned char) + icon_info.number_colors; + icon_file.directory[scene].reserved=0; + icon_file.directory[scene].planes=icon_info.planes; + icon_file.directory[scene].bits_per_pixel=icon_info.bits_per_pixel; + icon_file.directory[scene].size=icon_info.size; + icon_file.directory[scene].offset=(size_t) TellBlob(image); + (void) WriteBlobLSBLong(image,(unsigned int) 40); + (void) WriteBlobLSBLong(image,(unsigned int) icon_info.width); + (void) WriteBlobLSBLong(image,(unsigned int) icon_info.height*2); + (void) WriteBlobLSBShort(image,icon_info.planes); + (void) WriteBlobLSBShort(image,icon_info.bits_per_pixel); + (void) WriteBlobLSBLong(image,(unsigned int) icon_info.compression); + (void) WriteBlobLSBLong(image,(unsigned int) icon_info.image_size); + (void) WriteBlobLSBLong(image,(unsigned int) icon_info.x_pixels); + (void) WriteBlobLSBLong(image,(unsigned int) icon_info.y_pixels); + (void) WriteBlobLSBLong(image,(unsigned int) icon_info.number_colors); + (void) WriteBlobLSBLong(image,(unsigned int) icon_info.colors_important); + if (next->storage_class == PseudoClass) + { + unsigned char + *icon_colormap; + + /* + Dump colormap to file. + */ + icon_colormap=(unsigned char *) AcquireQuantumMemory((size_t) + (1UL << icon_info.bits_per_pixel),4UL*sizeof(*icon_colormap)); + if (icon_colormap == (unsigned char *) NULL) + { + images=DestroyImageList(images); + ThrowWriterException(ResourceLimitError, + "MemoryAllocationFailed"); + } + q=icon_colormap; + for (i=0; i < (ssize_t) next->colors; i++) + { + *q++=ScaleQuantumToChar(next->colormap[i].blue); + *q++=ScaleQuantumToChar(next->colormap[i].green); + *q++=ScaleQuantumToChar(next->colormap[i].red); + *q++=(unsigned char) 0x0; + } + for ( ; i < (ssize_t) (1UL << icon_info.bits_per_pixel); i++) + { + *q++=(unsigned char) 0x00; + *q++=(unsigned char) 0x00; + *q++=(unsigned char) 0x00; + *q++=(unsigned char) 0x00; + } + (void) WriteBlob(image,(size_t) (4UL*(1UL << + icon_info.bits_per_pixel)),icon_colormap); + icon_colormap=(unsigned char *) RelinquishMagickMemory( + icon_colormap); + } + (void) WriteBlob(image,(size_t) icon_info.image_size,pixels); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + /* + Write matte mask. + */ + scanline_pad=(((next->columns+31) & ~31)-next->columns) >> 3; + for (y=((ssize_t) next->rows - 1); y >= 0; y--) + { + p=GetVirtualPixels(next,0,y,next->columns,1,&next->exception); + if (p == (const PixelPacket *) NULL) + break; + bit=0; + byte=0; + for (x=0; x < (ssize_t) next->columns; x++) + { + byte<<=1; + if ((next->matte != MagickFalse) && + (GetPixelOpacity(p) == (Quantum) TransparentOpacity)) + byte|=0x01; + bit++; + if (bit == 8) + { + (void) WriteBlobByte(image,(unsigned char) byte); + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + (void) WriteBlobByte(image,(unsigned char) (byte << (8-bit))); + for (i=0; i < (ssize_t) scanline_pad; i++) + (void) WriteBlobByte(image,(unsigned char) 0); + } + } + if (GetNextImageInList(next) == (Image *) NULL) + break; + status=SetImageProgress(next,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + next=SyncNextImageInList(next); + } while ((next != (Image *) NULL) && (image_info->adjoin != MagickFalse)); + offset=SeekBlob(image,0,SEEK_SET); + (void) offset; + (void) WriteBlobLSBShort(image,0); + (void) WriteBlobLSBShort(image,1); + (void) WriteBlobLSBShort(image,(unsigned short) (scene+1)); + scene=0; + next=(images != (Image *) NULL) ? images : image; + do + { + (void) WriteBlobByte(image,icon_file.directory[scene].width); + (void) WriteBlobByte(image,icon_file.directory[scene].height); + (void) WriteBlobByte(image,icon_file.directory[scene].colors); + (void) WriteBlobByte(image,icon_file.directory[scene].reserved); + (void) WriteBlobLSBShort(image,icon_file.directory[scene].planes); + (void) WriteBlobLSBShort(image,icon_file.directory[scene].bits_per_pixel); + (void) WriteBlobLSBLong(image,(unsigned int) + icon_file.directory[scene].size); + (void) WriteBlobLSBLong(image,(unsigned int) + icon_file.directory[scene].offset); + scene++; + next=SyncNextImageInList(next); + } while ((next != (Image *) NULL) && (image_info->adjoin != MagickFalse)); + (void) CloseBlob(image); + images=DestroyImageList(images); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/info.c b/ImageMagick-6.9.12-44/coders/info.c new file mode 100644 index 0000000..e27fb19 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/info.c @@ -0,0 +1,220 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% IIIII N N FFFFF OOO % +% I NN N F O O % +% I N N N FFF O O % +% I N NN F O O % +% IIIII N N F OOO % +% % +% % +% Write Info About the Image. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/colorspace.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/identify.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteINFOImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r I N F O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterINFOImage() adds attributes for the INFO image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterINFOImage method is: +% +% size_t RegisterINFOImage(void) +% +*/ +ModuleExport size_t RegisterINFOImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("INFO"); + entry->encoder=(EncodeImageHandler *) WriteINFOImage; + entry->blob_support=MagickFalse; + entry->description=ConstantString("The image format and characteristics"); + entry->magick_module=ConstantString("INFO"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r I N F O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterINFOImage() removes format registrations made by the +% INFO module from the list of supported formats. +% +% The format of the UnregisterINFOImage method is: +% +% UnregisterINFOImage(void) +% +*/ +ModuleExport void UnregisterINFOImage(void) +{ + (void) UnregisterMagickInfo("INFO"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e I N F O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteINFOImage writes the pixel values as text numbers. +% +% The format of the WriteINFOImage method is: +% +% MagickBooleanType WriteINFOImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteINFOImage(const ImageInfo *image_info, + Image *image) +{ + const char + *format; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + size_t + imageListLength; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + imageListLength=GetImageListLength(image); + do + { + format=GetImageOption(image_info,"format"); + if (format == (char *) NULL) + { + (void) CopyMagickString(image->filename,image->magick_filename, + MaxTextExtent); + image->magick_columns=image->columns; + image->magick_rows=image->rows; + (void) IdentifyImage(image,GetBlobFileHandle(image), + image_info->verbose); + } + else + { + char + *text; + + text=InterpretImageProperties(image_info,image,format); + if (text != (char *) NULL) + { + (void) WriteBlobString(image,text); + text=DestroyString(text); + } + } + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/inline.c b/ImageMagick-6.9.12-44/coders/inline.c new file mode 100644 index 0000000..473d5b4 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/inline.c @@ -0,0 +1,363 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% IIIII N N L IIIII N N EEEEE % +% I NN N L I NN N E % +% I N N N L I N N N EEE % +% I N NN L I N NN E % +% IIIII N N LLLLL IIIII N N EEEEE % +% % +% % +% Read/Write Inline Images % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/client.h" +#include "magick/display.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" +#include "magick/xwindow.h" +#include "magick/xwindow-private.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteINLINEImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d I N L I N E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadINLINEImage() reads base64-encoded inlines images. +% +% The format of the ReadINLINEImage method is: +% +% Image *ReadINLINEImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadINLINEImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + size_t + i; + + size_t + quantum; + + ssize_t + count; + + unsigned char + *inline_image; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if (LocaleNCompare(image_info->filename,"data:",5) == 0) + { + char + *filename; + + Image + *data_image; + + filename=AcquireString("data:"); + (void) ConcatenateMagickString(filename,image_info->filename, + MagickPathExtent); + data_image=ReadInlineImage(image_info,filename,exception); + filename=DestroyString(filename); + return(data_image); + } + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + quantum=MagickMin((size_t) GetBlobSize(image),MagickMaxBufferExtent); + if (quantum == 0) + quantum=MagickMaxBufferExtent; + inline_image=(unsigned char *) AcquireQuantumMemory(quantum, + sizeof(*inline_image)); + count=0; + for (i=0; inline_image != (unsigned char *) NULL; i+=count) + { + count=(ssize_t) ReadBlob(image,quantum,inline_image+i); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + if (~((size_t) i) < (quantum+1)) + { + inline_image=(unsigned char *) RelinquishMagickMemory(inline_image); + break; + } + inline_image=(unsigned char *) ResizeQuantumMemory(inline_image,i+count+ + quantum+1,sizeof(*inline_image)); + } + if (inline_image == (unsigned char *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return((Image *) NULL); + } + inline_image[i+count]='\0'; + image=DestroyImageList(image); + image=ReadInlineImage(image_info,(char *) inline_image,exception); + inline_image=(unsigned char *) RelinquishMagickMemory(inline_image); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r I N L I N E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterINLINEImage() adds attributes for the INLINE image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterINLINEImage method is: +% +% size_t RegisterINLINEImage(void) +% +*/ +ModuleExport size_t RegisterINLINEImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("DATA"); + entry->decoder=(DecodeImageHandler *) ReadINLINEImage; + entry->encoder=(EncodeImageHandler *) WriteINLINEImage; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Base64-encoded inline images"); + entry->magick_module=ConstantString("INLINE"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("INLINE"); + entry->decoder=(DecodeImageHandler *) ReadINLINEImage; + entry->encoder=(EncodeImageHandler *) WriteINLINEImage; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Base64-encoded inline images"); + entry->magick_module=ConstantString("INLINE"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r I N L I N E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterINLINEImage() removes format registrations made by the +% INLINE module from the list of supported formats. +% +% The format of the UnregisterINLINEImage method is: +% +% UnregisterINLINEImage(void) +% +*/ +ModuleExport void UnregisterINLINEImage(void) +{ + (void) UnregisterMagickInfo("INLINE"); + (void) UnregisterMagickInfo("DATA"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e I N L I N E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteINLINEImage() writes an image to a file in INLINE format (Base64). +% +% The format of the WriteINLINEImage method is: +% +% MagickBooleanType WriteINLINEImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteINLINEImage(const ImageInfo *image_info, + Image *image) +{ + char + *base64, + message[MaxTextExtent]; + + const MagickInfo + *magick_info; + + ExceptionInfo + *exception; + + Image + *write_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + size_t + blob_length, + encode_length; + + unsigned char + *blob; + + /* + Convert image to base64-encoding. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=(&image->exception); + write_info=CloneImageInfo(image_info); + (void) SetImageInfo(write_info,1,exception); + if (LocaleCompare(write_info->magick,"INLINE") == 0) + (void) CopyMagickString(write_info->magick,image->magick,MaxTextExtent); + magick_info=GetMagickInfo(write_info->magick,exception); + if ((magick_info == (const MagickInfo *) NULL) || + (GetMagickMimeType(magick_info) == (const char *) NULL)) + { + write_info=DestroyImageInfo(write_info); + ThrowWriterException(CorruptImageError,"ImageTypeNotSupported"); + } + (void) CopyMagickString(image->filename,write_info->filename,MaxTextExtent); + blob_length=2048; + write_image=CloneImage(image,0,0,MagickTrue,exception); + if (write_image == (Image *) NULL) + { + write_info=DestroyImageInfo(write_info); + return(MagickTrue); + } + blob=(unsigned char *) ImageToBlob(write_info,write_image,&blob_length, + exception); + write_image=DestroyImage(write_image); + write_info=DestroyImageInfo(write_info); + if (blob == (unsigned char *) NULL) + return(MagickFalse); + encode_length=0; + base64=Base64Encode(blob,blob_length,&encode_length); + blob=(unsigned char *) RelinquishMagickMemory(blob); + if (base64 == (char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Write base64-encoded image. + */ + status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); + if (status == MagickFalse) + { + base64=DestroyString(base64); + return(status); + } + (void) FormatLocaleString(message,MaxTextExtent,"data:%s;base64,", + GetMagickMimeType(magick_info)); + (void) WriteBlobString(image,message); + (void) WriteBlobString(image,base64); + base64=DestroyString(base64); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/ipl.c b/ImageMagick-6.9.12-44/coders/ipl.c new file mode 100644 index 0000000..e4ca76c --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/ipl.c @@ -0,0 +1,712 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% IIIIIIIIII PPPPPPPP LL % +% II PP PP LL % +% II PP PP LL % +% II PP PP LL % +% II PPPPPPPP LL % +% II PP LL % +% II PP LL % +% IIIIIIIIII PP LLLLLLLL % +% % +% % +% % +% Read/Write Scanalytics IPLab Image Format % +% Sean Burke % +% 2008.05.07 % +% v 0.9 % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. + */ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Typedef declarations. +*/ + +typedef struct _IPLInfo +{ + unsigned int + tag, + size, + time, + z, + width, + height, + colors, + depth, + byteType; +} IPLInfo; + +static MagickBooleanType + WriteIPLImage(const ImageInfo *,Image *); + +/* +static void increase (void *pixel, int byteType){ + switch(byteType){ + case 0:(*((unsigned char *) pixel))++; break; + case 1:(*((signed int *) pixel))++; break; + case 2:(*((unsigned int *) pixel))++; break; + case 3:(*((signed long *) pixel))++; break; + default:(*((unsigned int *) pixel))++; break; + } +} +*/ + +/* + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % % + % % + % % + % I s I P L % + % % + % % + % % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % IsIPL() returns MagickTrue if the image format type, identified by the + % magick string, is IPL. + % + % The format of the IsIPL method is: + % + % MagickBooleanType IsIPL(const unsigned char *magick,const size_t length) + % + % A description of each parameter follows: + % + % o magick: compare image format pattern against these bytes. + % + % o length: Specifies the length of the magick string. + % + */ +static MagickBooleanType IsIPL(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"data",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % % + % % + % % + % R e a d I P L I m a g e % + % % + % % + % % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % ReadIPLImage() reads a Scanalytics IPLab image file and returns it. It + % allocates the memory necessary for the new Image structure and returns a + % pointer to the new image. + % + % According to the IPLab spec, the data is blocked out in five dimensions: + % { t, z, c, y, x }. When we return the image, the latter three are folded + % into the standard "Image" structure. The "scenes" (image_info->scene) + % correspond to the order: { {t0,z0}, {t0, z1}, ..., {t1,z0}, {t1,z1}... } + % The number of scenes is t*z. + % + % The format of the ReadIPLImage method is: + % + % Image *ReadIPLImage(const ImageInfo *image_info,ExceptionInfo *exception) + % + % A description of each parameter follows: + % + % o image_info: The image info. + % + % o exception: return any errors or warnings in this structure. + % + */ + +static void SetHeaderFromIPL(Image *image, IPLInfo *ipl){ + image->columns = ipl->width; + image->rows = ipl->height; + image->depth = ipl->depth; + image->x_resolution = 1; + image->y_resolution = 1; +} + + +static Image *ReadIPLImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + + /* + Declare variables. + */ + Image *image; + + MagickBooleanType status; + PixelPacket *q; + unsigned char magick[12], *pixels; + ssize_t count; + ssize_t y; + size_t t_count=0; + size_t length; + IPLInfo + ipl_info; + QuantumFormatType + quantum_format; + QuantumInfo + *quantum_info; + QuantumType + quantum_type; + + size_t + extent; + + /* + Open Image + */ + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if ( image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent, GetMagickModule(), "%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + + /* + Read IPL image + */ + + /* + Determine endianness + If we get back "iiii", we have LSB,"mmmm", MSB + */ + count=ReadBlob(image,4,magick); + if (count != 4) + ThrowReaderException(CorruptImageError, "ImproperImageHeader"); + if((LocaleNCompare((char *) magick,"iiii",4) == 0)) + image->endian=LSBEndian; + else{ + if((LocaleNCompare((char *) magick,"mmmm",4) == 0)) + image->endian=MSBEndian; + else{ + ThrowReaderException(CorruptImageError, "ImproperImageHeader"); + } + } + /* Skip o'er the next 8 bytes (garbage) */ + count=ReadBlob(image, 8, magick); + /* + Excellent, now we read the header unimpeded. + */ + count=ReadBlob(image,4,magick); + if((count != 4) || (LocaleNCompare((char *) magick,"data",4) != 0)) + ThrowReaderException(CorruptImageError, "ImproperImageHeader"); + ipl_info.size=ReadBlobLong(image); + ipl_info.width=ReadBlobLong(image); + ipl_info.height=ReadBlobLong(image); + if((ipl_info.width == 0UL) || (ipl_info.height == 0UL)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + ipl_info.colors=ReadBlobLong(image); + if(ipl_info.colors == 3) + { + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) SetImageColorspace(image,sRGBColorspace); + } + else + image->colorspace = GRAYColorspace; + ipl_info.z=ReadBlobLong(image); + ipl_info.time=ReadBlobLong(image); + + ipl_info.byteType=ReadBlobLong(image); + + + /* Initialize Quantum Info */ + + switch (ipl_info.byteType) { + case 0: + ipl_info.depth=8; + quantum_format = UnsignedQuantumFormat; + break; + case 1: + ipl_info.depth=16; + quantum_format = SignedQuantumFormat; + break; + case 2: + ipl_info.depth=16; + quantum_format = UnsignedQuantumFormat; + break; + case 3: + ipl_info.depth=32; + quantum_format = SignedQuantumFormat; + break; + case 4: ipl_info.depth=32; + quantum_format = FloatingPointQuantumFormat; + break; + case 5: + ipl_info.depth=8; + quantum_format = UnsignedQuantumFormat; + break; + case 6: + ipl_info.depth=16; + quantum_format = UnsignedQuantumFormat; + break; + case 10: + ipl_info.depth=64; + quantum_format = FloatingPointQuantumFormat; + break; + default: + ipl_info.depth=16; + quantum_format = UnsignedQuantumFormat; + break; + } + extent=ipl_info.width*ipl_info.height*ipl_info.z*ipl_info.depth/8; + if (extent > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + + /* + Set number of scenes of image + */ + SetHeaderFromIPL(image, &ipl_info); + + /* Thats all we need if we are pinging. */ + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + length=image->columns; + quantum_type=GetQuantumType(image,exception); + do + { + SetHeaderFromIPL(image, &ipl_info); + + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } +/* + printf("Length: %.20g, Memory size: %.20g\n", (double) length,(double) + image->depth); +*/ + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + status=SetQuantumFormat(image,quantum_info,quantum_format); + if (status == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + if(image->columns != ipl_info.width){ +/* + printf("Columns not set correctly! Wanted: %.20g, got: %.20g\n", + (double) ipl_info.width, (double) image->columns); +*/ + } + + /* + Covert IPL binary to pixel packets + */ + + if(ipl_info.colors == 1){ + for(y = 0; y < (ssize_t) image->rows; y++){ + (void) ReadBlob(image, length*image->depth/8, pixels); + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + GrayQuantum,pixels,exception); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } + else{ + for(y = 0; y < (ssize_t) image->rows; y++){ + (void) ReadBlob(image, length*image->depth/8, pixels); + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + RedQuantum,pixels,exception); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + for(y = 0; y < (ssize_t) image->rows; y++){ + (void) ReadBlob(image, length*image->depth/8, pixels); + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + GreenQuantum,pixels,exception); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + for(y = 0; y < (ssize_t) image->rows; y++){ + (void) ReadBlob(image, length*image->depth/8, pixels); + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + BlueQuantum,pixels,exception); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } + SetQuantumImageType(image,quantum_type); + + t_count++; + quantum_info = DestroyQuantumInfo(quantum_info); + + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + if (t_count < (size_t) (ipl_info.z*ipl_info.time)) + { + /* + Proceed to next image. + */ + AcquireNextImage(image_info, image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while (t_count < (size_t) (ipl_info.z*ipl_info.time)); + CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % % + % % + % % + % R e g i s t e r I P L I m a g e % + % % + % % + % % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % RegisterIPLImage() add attributes for the Scanalytics IPL image format to the + % list of supported formats. + % + % + */ +ModuleExport size_t RegisterIPLImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("IPL"); + entry->decoder=(DecodeImageHandler *) ReadIPLImage; + entry->encoder=(EncodeImageHandler *) WriteIPLImage; + entry->magick=(IsImageFormatHandler *) IsIPL; + entry->adjoin=MagickTrue; + entry->description=ConstantString("IPL Image Sequence"); + entry->magick_module=ConstantString("IPL"); + entry->endian_support=MagickTrue; + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % % + % % + % % + % U n r e g i s t e r I P L I m a g e % + % % + % % + % % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % UnregisterIPLImage() removes format registrations made by the + % IPL module from the list of supported formats. + % + % The format of the UnregisterIPLImage method is: + % + % UnregisterIPLImage(void) + % + */ +ModuleExport void UnregisterIPLImage(void) +{ + (void) UnregisterMagickInfo("IPL"); +} + +/* + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % % + % % + % % + % W r i t e I P L I m a g e % + % % + % % + % % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % WriteIPLImage() writes an image to a file in Scanalytics IPLabimage format. + % + % The format of the WriteIPLImage method is: + % + % MagickBooleanType WriteIPLImage(const ImageInfo *image_info,Image *image) + % + % A description of each parameter follows. + % + % o image_info: The image info. + % + % o image: The image. + % + */ + +static MagickBooleanType WriteIPLImage(const ImageInfo *image_info,Image *image) +{ + ExceptionInfo + *exception; + + IPLInfo + ipl_info; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + const PixelPacket + *p; + + QuantumInfo + *quantum_info; + + size_t + imageListLength; + + ssize_t + y; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + + quantum_info=AcquireQuantumInfo(image_info, image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + if ((quantum_info->format == UndefinedQuantumFormat) && + (IsHighDynamicRangeImage(image,&image->exception) != MagickFalse)) + SetQuantumFormat(image,quantum_info,FloatingPointQuantumFormat); + switch(quantum_info->depth){ + case 8: + ipl_info.byteType = 0; + break; + case 16: + if(quantum_info->format == SignedQuantumFormat){ + ipl_info.byteType = 2; + } + else{ + ipl_info.byteType = 1; + } + break; + case 32: + if(quantum_info->format == FloatingPointQuantumFormat){ + ipl_info.byteType = 3; + } + else{ + ipl_info.byteType = 4; + } + break; + case 64: + ipl_info.byteType = 10; + break; + default: + ipl_info.byteType = 2; + break; + + } + imageListLength=GetImageListLength(image); + ipl_info.z = (unsigned int) imageListLength; + /* There is no current method for detecting whether we have T or Z stacks */ + ipl_info.time = 1; + ipl_info.width = (unsigned int) image->columns; + ipl_info.height = (unsigned int) image->rows; + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + if(IssRGBCompatibleColorspace(image->colorspace) != MagickFalse) { ipl_info.colors = 3; } + else{ ipl_info.colors = 1; } + + ipl_info.size = (unsigned int) (28 + + ((image->depth)/8)*ipl_info.height*ipl_info.width*ipl_info.colors*ipl_info.z); + + /* Ok! Calculations are done. Lets write this puppy down! */ + + /* + Write IPL header. + */ + /* Shockingly (maybe not if you have used IPLab), IPLab itself CANNOT read MSBEndian + files! The reader above can, but they cannot. For compatability reasons, I will leave + the code in here, but it is all but useless if you want to use IPLab. */ + + if(image_info->endian == MSBEndian) + (void) WriteBlob(image, 4, (const unsigned char *) "mmmm"); + else{ + image->endian = LSBEndian; + (void) WriteBlob(image, 4, (const unsigned char *) "iiii"); + } + (void) WriteBlobLong(image, 4); + (void) WriteBlob(image, 4, (const unsigned char *) "100f"); + (void) WriteBlob(image, 4, (const unsigned char *) "data"); + (void) WriteBlobLong(image, ipl_info.size); + (void) WriteBlobLong(image, ipl_info.width); + (void) WriteBlobLong(image, ipl_info.height); + (void) WriteBlobLong(image, ipl_info.colors); + if(image_info->adjoin == MagickFalse) + (void) WriteBlobLong(image, 1); + else + (void) WriteBlobLong(image, ipl_info.z); + (void) WriteBlobLong(image, ipl_info.time); + (void) WriteBlobLong(image, ipl_info.byteType); + + exception=(&image->exception); + do + { + /* + Convert MIFF to IPL raster pixels. + */ + pixels=GetQuantumPixels(quantum_info); + if(ipl_info.colors == 1){ + /* Red frame */ + for(y = 0; y < (ssize_t) ipl_info.height; y++){ + p=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (p == (PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, quantum_info, + GrayQuantum, pixels,&image->exception); + (void) WriteBlob(image, image->columns*image->depth/8, pixels); + } + +} + if(ipl_info.colors == 3){ + /* Red frame */ + for(y = 0; y < (ssize_t) ipl_info.height; y++){ + p=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (p == (PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, quantum_info, + RedQuantum, pixels,&image->exception); + (void) WriteBlob(image, image->columns*image->depth/8, pixels); + } + + /* Green frame */ + for(y = 0; y < (ssize_t) ipl_info.height; y++){ + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, quantum_info, + GreenQuantum, pixels,&image->exception); + (void) WriteBlob(image, image->columns*image->depth/8, pixels); + } + /* Blue frame */ + for(y = 0; y < (ssize_t) ipl_info.height; y++){ + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, quantum_info, + BlueQuantum, pixels,&image->exception); + (void) WriteBlob(image, image->columns*image->depth/8, pixels); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + }while (image_info->adjoin != MagickFalse); + + quantum_info=DestroyQuantumInfo(quantum_info); + (void) WriteBlob(image, 4, (const unsigned char *) "fini"); + (void) WriteBlobLong(image, 0); + +CloseBlob(image); +return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/jbig.c b/ImageMagick-6.9.12-44/coders/jbig.c new file mode 100644 index 0000000..2f69261 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/jbig.c @@ -0,0 +1,576 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% JJJJJ BBBB IIIII GGGG % +% J B B I G % +% J BBBB I G GG % +% J J B B I G G % +% JJJ BBBB IIIII GGG % +% % +% % +% Read/Write JBIG Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/nt-base-private.h" +#include "magick/nt-feature.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/module.h" +#if defined(MAGICKCORE_JBIG_DELEGATE) +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif +#include +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif +#endif + +/* + Forward declarations. +*/ +#if defined(MAGICKCORE_JBIG_DELEGATE) +static MagickBooleanType + WriteJBIGImage(const ImageInfo *,Image *); +#endif + +#if defined(MAGICKCORE_JBIG_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d J B I G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadJBIGImage() reads a JBIG image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadJBIGImage method is: +% +% Image *ReadJBIGImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadJBIGImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + IndexPacket + index; + + MagickStatusType + status; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + unsigned char + *p; + + ssize_t + length, + y; + + struct jbg_dec_state + jbig_info; + + unsigned char + bit, + *buffer, + byte; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Initialize JBIG toolkit. + */ + jbg_dec_init(&jbig_info); + jbg_dec_maxsize(&jbig_info,(unsigned long) image->columns,(unsigned long) + image->rows); + image->columns=jbg_dec_getwidth(&jbig_info); + image->rows=jbg_dec_getheight(&jbig_info); + image->depth=8; + image->storage_class=PseudoClass; + image->colors=2; + /* + Read JBIG file. + */ + buffer=(unsigned char *) AcquireQuantumMemory(MagickMaxBufferExtent, + sizeof(*buffer)); + if (buffer == (unsigned char *) NULL) + { + jbg_dec_free(&jbig_info); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + status=JBG_EAGAIN; + do + { + length=(ssize_t) ReadBlob(image,MagickMaxBufferExtent,buffer); + if (length == 0) + break; + p=buffer; + while ((length > 0) && ((status == JBG_EAGAIN) || (status == JBG_EOK))) + { + size_t + count; + + status=jbg_dec_in(&jbig_info,p,length,&count); + p+=count; + length-=(ssize_t) count; + } + } while ((status == JBG_EAGAIN) || (status == JBG_EOK)); + /* + Create colormap. + */ + image->columns=jbg_dec_getwidth(&jbig_info); + image->rows=jbg_dec_getheight(&jbig_info); + image->compression=JBIG2Compression; + if (AcquireImageColormap(image,2) == MagickFalse) + { + jbg_dec_free(&jbig_info); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + image->colormap[0].red=0; + image->colormap[0].green=0; + image->colormap[0].blue=0; + image->colormap[1].red=QuantumRange; + image->colormap[1].green=QuantumRange; + image->colormap[1].blue=QuantumRange; + image->x_resolution=300; + image->y_resolution=300; + if (image_info->ping != MagickFalse) + { + jbg_dec_free(&jbig_info); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + jbg_dec_free(&jbig_info); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Convert X bitmap image to pixel packets. + */ + p=jbg_dec_getimage(&jbig_info,0); + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (bit == 0) + byte=(*p++); + index=(byte & 0x80) ? 0 : 1; + bit++; + byte<<=1; + if (bit == 8) + bit=0; + SetPixelIndex(indexes+x,index); + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + /* + Free scale resource. + */ + jbg_dec_free(&jbig_info); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r J B I G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterJBIGImage() adds attributes for the JBIG image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterJBIGImage method is: +% +% size_t RegisterJBIGImage(void) +% +*/ +ModuleExport size_t RegisterJBIGImage(void) +{ +#define JBIGDescription "Joint Bi-level Image experts Group interchange format" + + char + version[MaxTextExtent]; + + MagickInfo + *entry; + + *version='\0'; +#if defined(JBG_VERSION) + (void) CopyMagickString(version,JBG_VERSION,MaxTextExtent); +#endif + entry=SetMagickInfo("BIE"); +#if defined(MAGICKCORE_JBIG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJBIGImage; + entry->encoder=(EncodeImageHandler *) WriteJBIGImage; +#endif + entry->adjoin=MagickFalse; + entry->description=ConstantString(JBIGDescription); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick_module=ConstantString("JBIG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("JBG"); +#if defined(MAGICKCORE_JBIG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJBIGImage; + entry->encoder=(EncodeImageHandler *) WriteJBIGImage; +#endif + entry->description=ConstantString(JBIGDescription); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick_module=ConstantString("JBIG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("JBIG"); +#if defined(MAGICKCORE_JBIG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJBIGImage; + entry->encoder=(EncodeImageHandler *) WriteJBIGImage; +#endif + entry->description=ConstantString(JBIGDescription); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick_module=ConstantString("JBIG"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r J B I G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterJBIGImage() removes format registrations made by the +% JBIG module from the list of supported formats. +% +% The format of the UnregisterJBIGImage method is: +% +% UnregisterJBIGImage(void) +% +*/ +ModuleExport void UnregisterJBIGImage(void) +{ + (void) UnregisterMagickInfo("BIE"); + (void) UnregisterMagickInfo("JBG"); + (void) UnregisterMagickInfo("JBIG"); +} + +#if defined(MAGICKCORE_JBIG_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e J B I G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteJBIGImage() writes an image in the JBIG encoded image format. +% +% The format of the WriteJBIGImage method is: +% +% MagickBooleanType WriteJBIGImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% +*/ + +static void JBIGEncode(unsigned char *pixels,size_t length,void *data) +{ + Image + *image; + + image=(Image *) data; + (void) WriteBlob(image,length,pixels); +} + +static MagickBooleanType WriteJBIGImage(const ImageInfo *image_info, + Image *image) +{ + double + version; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + MemoryInfo + *pixel_info; + + const PixelPacket + *p; + + ssize_t + x; + + unsigned char + *q; + + size_t + number_images, + number_packets; + + ssize_t + y; + + struct jbg_enc_state + jbig_info; + + unsigned char + bit, + byte, + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + version=StringToDouble(JBG_VERSION,(char **) NULL); + scene=0; + number_images=GetImageListLength(image); + do + { + /* + Allocate pixel data. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + number_packets=(image->columns+7)/8; + pixel_info=AcquireVirtualMemory(number_packets,image->rows*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Convert pixels to a bitmap. + */ + (void) SetImageType(image,BilevelType); + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte<<=1; + if (GetPixelLuma(image,p) < (QuantumRange/2.0)) + byte|=0x01; + bit++; + if (bit == 8) + { + *q++=byte; + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + *q++=byte << (8-bit); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + /* + Initialize JBIG info structure. + */ + jbg_enc_init(&jbig_info,(unsigned long) image->columns,(unsigned long) + image->rows,1,&pixels,(void (*)(unsigned char *,size_t,void *)) + JBIGEncode,image); + if (image_info->scene != 0) + jbg_enc_layers(&jbig_info,(int) image_info->scene); + else + { + size_t + x_resolution, + y_resolution; + + x_resolution=640; + y_resolution=480; + if (image_info->density != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(image_info->density,&geometry_info); + x_resolution=geometry_info.rho; + y_resolution=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + y_resolution=x_resolution; + } + if (image->units == PixelsPerCentimeterResolution) + { + x_resolution=(size_t) (100.0*2.54*x_resolution+0.5)/100.0; + y_resolution=(size_t) (100.0*2.54*y_resolution+0.5)/100.0; + } + (void) jbg_enc_lrlmax(&jbig_info,(unsigned long) x_resolution, + (unsigned long) y_resolution); + } + (void) jbg_enc_lrange(&jbig_info,-1,-1); + jbg_enc_options(&jbig_info,JBG_ILEAVE | JBG_SMID,JBG_TPDON | JBG_TPBON | + JBG_DPON,version < 1.6 ? -1 : 0,-1,-1); + /* + Write JBIG image. + */ + jbg_enc_out(&jbig_info); + jbg_enc_free(&jbig_info); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,number_images); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/jnx.c b/ImageMagick-6.9.12-44/coders/jnx.c new file mode 100644 index 0000000..ed29283 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/jnx.c @@ -0,0 +1,398 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% JJJ N N X X % +% J NN N X X % +% J N N N X % +% J J N NN X X % +% JJ N N X X % +% % +% % +% Read/Write Garmin Image Format % +% % +% Cristy % +% July 2012 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" + +typedef struct _JNXInfo +{ + int + version, + serial; + + PointInfo + northeast, + southwest; + + int + levels, + expire, + id, + crc, + signature; + + unsigned int + offset; + + int + order; +} JNXInfo; + +typedef struct _JNXLevelInfo +{ + int + count, + offset; + + unsigned int + scale; + + unsigned short + copyright[MaxTextExtent]; +} JNXLevelInfo; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d J N X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadJNXImage() reads an image in the Garmin tile storage format and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadJNXImage method is: +% +% Image *ReadJNXImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadJNXImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define JNXMaxLevels 20 + + Image + *image, + *images; + + JNXInfo + jnx_info; + + JNXLevelInfo + jnx_level_info[JNXMaxLevels]; + + MagickBooleanType + status; + + ssize_t + i; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read JNX header. + */ + (void) memset(&jnx_info,0,sizeof(jnx_info)); + jnx_info.version=ReadBlobLSBSignedLong(image); + if ((jnx_info.version != 3) && (jnx_info.version != 4)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + jnx_info.serial=ReadBlobLSBSignedLong(image); + jnx_info.northeast.x=180.0*ReadBlobLSBSignedLong(image)/0x7fffffff; + jnx_info.northeast.y=180.0*ReadBlobLSBSignedLong(image)/0x7fffffff; + jnx_info.southwest.x=180.0*ReadBlobLSBSignedLong(image)/0x7fffffff; + jnx_info.southwest.y=180.0*ReadBlobLSBSignedLong(image)/0x7fffffff; + jnx_info.levels=ReadBlobLSBSignedLong(image); + if (jnx_info.levels > JNXMaxLevels) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + jnx_info.expire=ReadBlobLSBSignedLong(image); + jnx_info.id=ReadBlobLSBSignedLong(image); + jnx_info.crc=ReadBlobLSBSignedLong(image); + jnx_info.signature=ReadBlobLSBSignedLong(image); + jnx_info.offset=ReadBlobLSBLong(image); + if (jnx_info.version > 3) + jnx_info.order=ReadBlobLSBSignedLong(image); + else + if (jnx_info.version == 3) + jnx_info.order=30; + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + /* + Read JNX levels. + */ + (void) memset(&jnx_level_info,0,sizeof(jnx_level_info)); + for (i=0; i < (ssize_t) jnx_info.levels; i++) + { + jnx_level_info[i].count=ReadBlobLSBSignedLong(image); + if (jnx_level_info[i].count > 50000) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + jnx_level_info[i].offset=ReadBlobLSBSignedLong(image); + jnx_level_info[i].scale=ReadBlobLSBLong(image); + *jnx_level_info[i].copyright='\0'; + if (jnx_info.version > 3) + { + ssize_t + j; + + unsigned short + c; + + (void) ReadBlobLSBLong(image); + j=0; + while ((c=ReadBlobLSBShort(image)) != 0) + if (j < (MaxTextExtent-1)) + jnx_level_info[i].copyright[j++]=c; + jnx_level_info[i].copyright[j]='\0'; + } + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + /* + Read JNX tiles. + */ + images=NewImageList(); + for (i=0; i < (ssize_t) jnx_info.levels; i++) + { + MagickOffsetType + offset; + + ssize_t + j; + + offset=SeekBlob(image,(MagickOffsetType) jnx_level_info[i].offset,SEEK_SET); + if (offset != (MagickOffsetType) jnx_level_info[i].offset) + continue; + for (j=0; j < (ssize_t) jnx_level_info[i].count; j++) + { + Image + *tile_image; + + ImageInfo + *read_info; + + int + tile_offset; + + MagickOffsetType + restore_offset; + + PointInfo + northeast, + southwest; + + ssize_t + count; + + unsigned char + *blob; + + unsigned int + tile_length; + + northeast.x=180.0*ReadBlobLSBSignedLong(image)/0x7fffffff; + northeast.y=180.0*ReadBlobLSBSignedLong(image)/0x7fffffff; + southwest.x=180.0*ReadBlobLSBSignedLong(image)/0x7fffffff; + southwest.y=180.0*ReadBlobLSBSignedLong(image)/0x7fffffff; + (void) ReadBlobLSBShort(image); /* width */ + (void) ReadBlobLSBShort(image); /* height */ + if (EOFBlob(image) != MagickFalse) + { + images=DestroyImageList(images); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + tile_length=ReadBlobLSBLong(image); + tile_offset=ReadBlobLSBSignedLong(image); + if (tile_offset == -1) + continue; + restore_offset=TellBlob(image); + if (restore_offset < 0) + continue; + offset=SeekBlob(image,(MagickOffsetType) tile_offset,SEEK_SET); + if (offset != (MagickOffsetType) tile_offset) + continue; + /* + Read a tile. + */ + if (((MagickSizeType) tile_length) > GetBlobSize(image)) + { + images=DestroyImageList(images); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + blob=(unsigned char *) AcquireQuantumMemory((size_t) tile_length+2, + sizeof(*blob)); + if (blob == (unsigned char *) NULL) + { + images=DestroyImageList(images); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + blob[0]=0xFF; + blob[1]=0xD8; + count=ReadBlob(image,tile_length,blob+2); + if (count != (ssize_t) tile_length) + { + images=DestroyImageList(images); + blob=(unsigned char *) RelinquishMagickMemory(blob); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + read_info=CloneImageInfo(image_info); + (void) CopyMagickString(read_info->magick,"JPEG",MaxTextExtent); + tile_image=BlobToImage(read_info,blob,tile_length+2,exception); + read_info=DestroyImageInfo(read_info); + blob=(unsigned char *) RelinquishMagickMemory(blob); + (void) SeekBlob(image,restore_offset,SEEK_SET); + if (tile_image == (Image *) NULL) + continue; + tile_image->depth=8; + (void) CopyMagickString(tile_image->magick,image->magick,MaxTextExtent); + (void) FormatImageProperty(tile_image,"jnx:northeast","%.20g,%.20g", + northeast.x,northeast.y); + (void) FormatImageProperty(tile_image,"jnx:southwest","%.20g,%.20g", + southwest.x,southwest.y); + AppendImageToList(&images,tile_image); + } + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType) i, + (MagickSizeType) jnx_info.levels); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + (void) CloseBlob(image); + image=DestroyImage(image); + return(GetFirstImageInList(images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r J N X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterJNXImage() adds attributes for the JNX image format to the list +% of supported formats. The attributes include the image format tag, a +% method to read and/or write the format, whether the format supports the +% saving of more than one frame to the same file or blob, whether the format +% supports native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterJNXImage method is: +% +% size_t RegisterJNXImage(void) +% +*/ +ModuleExport size_t RegisterJNXImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("JNX"); + entry->decoder=(DecodeImageHandler *) ReadJNXImage; + entry->description=ConstantString("Garmin tile format"); + entry->seekable_stream=MagickTrue; + entry->magick_module=ConstantString("JNX"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r J N X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterJNXImage() removes format registrations made by the +% JNX module from the list of supported formats. +% +% The format of the UnregisterJNXImage method is: +% +% UnregisterJNXImage(void) +% +*/ +ModuleExport void UnregisterJNXImage(void) +{ + (void) UnregisterMagickInfo("JNX"); +} diff --git a/ImageMagick-6.9.12-44/coders/jp2.c b/ImageMagick-6.9.12-44/coders/jp2.c new file mode 100644 index 0000000..287b61a --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/jp2.c @@ -0,0 +1,1156 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% JJJ PPPP 222 % +% J P P 2 2 % +% J PPPP 22 % +% J J P 2 % +% JJ P 22222 % +% % +% % +% Read/Write JPEG-2000 Image Format % +% % +% Cristy % +% Nathan Brown % +% June 2001 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/semaphore.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/module.h" +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) +#include +#endif + +/* + Forward declarations. +*/ +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) +static MagickBooleanType + WriteJP2Image(const ImageInfo *,Image *); +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s J 2 K % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsJ2K() returns MagickTrue if the image format type, identified by the +% magick string, is J2K. +% +% The format of the IsJ2K method is: +% +% MagickBooleanType IsJ2K(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsJ2K(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\xff\x4f\xff\x51",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s J P 2 % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsJP2() returns MagickTrue if the image format type, identified by the +% magick string, is JP2. +% +% The format of the IsJP2 method is: +% +% MagickBooleanType IsJP2(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsJP2(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\x0d\x0a\x87\x0a",4) == 0) + return(MagickTrue); + if (length < 12) + return(MagickFalse); + if (memcmp(magick,"\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a",12) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d J P 2 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadJP2Image() reads a JPEG 2000 Image file (JP2) or JPEG 2000 +% codestream (JPC) image file and returns it. It allocates the memory +% necessary for the new Image structure and returns a pointer to the new +% image or set of images. +% +% JP2 support is originally written by Nathan Brown, nathanbrown@letu.edu. +% +% The format of the ReadJP2Image method is: +% +% Image *ReadJP2Image(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) +static void JP2ErrorHandler(const char *message,void *client_data) +{ + ExceptionInfo + *exception; + + exception=(ExceptionInfo *) client_data; + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + message,"`%s'","OpenJP2"); +} + +static OPJ_SIZE_T JP2ReadHandler(void *buffer,OPJ_SIZE_T length,void *context) +{ + Image + *image; + + ssize_t + count; + + image=(Image *) context; + count=ReadBlob(image,(ssize_t) length,(unsigned char *) buffer); + if (count == 0) + return((OPJ_SIZE_T) -1); + return((OPJ_SIZE_T) count); +} + +static OPJ_BOOL JP2SeekHandler(OPJ_OFF_T offset,void *context) +{ + Image + *image; + + image=(Image *) context; + return(SeekBlob(image,offset,SEEK_SET) < 0 ? OPJ_FALSE : OPJ_TRUE); +} + +static OPJ_OFF_T JP2SkipHandler(OPJ_OFF_T offset,void *context) +{ + Image + *image; + + image=(Image *) context; + return(SeekBlob(image,offset,SEEK_CUR) < 0 ? -1 : offset); +} + +static void JP2WarningHandler(const char *message,void *client_data) +{ + ExceptionInfo + *exception; + + exception=(ExceptionInfo *) client_data; + (void) ThrowMagickException(exception,GetMagickModule(),CoderWarning, + message,"`%s'","OpenJP2"); +} + +static OPJ_SIZE_T JP2WriteHandler(void *buffer,OPJ_SIZE_T length,void *context) +{ + Image + *image; + + ssize_t + count; + + image=(Image *) context; + count=WriteBlob(image,(ssize_t) length,(unsigned char *) buffer); + return((OPJ_SIZE_T) count); +} + +static Image *ReadJP2Image(const ImageInfo *image_info,ExceptionInfo *exception) +{ + const char + *option; + + Image + *image; + + int + jp2_status; + + MagickBooleanType + status; + + opj_codec_t + *jp2_codec; + + opj_dparameters_t + parameters; + + opj_image_t + *jp2_image; + + opj_stream_t + *jp2_stream; + + ssize_t + i; + + ssize_t + y; + + unsigned char + sans[4]; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Initialize JP2 codec. + */ + if (ReadBlob(image,4,sans) != 4) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + (void) SeekBlob(image,SEEK_SET,0); + if (LocaleCompare(image_info->magick,"JPT") == 0) + jp2_codec=opj_create_decompress(OPJ_CODEC_JPT); + else + if (IsJ2K(sans,4) != MagickFalse) + jp2_codec=opj_create_decompress(OPJ_CODEC_J2K); + else + jp2_codec=opj_create_decompress(OPJ_CODEC_JP2); + opj_set_warning_handler(jp2_codec,JP2WarningHandler,exception); + opj_set_error_handler(jp2_codec,JP2ErrorHandler,exception); + opj_set_default_decoder_parameters(¶meters); + option=GetImageOption(image_info,"jp2:reduce-factor"); + if (option != (const char *) NULL) + parameters.cp_reduce=StringToInteger(option); + option=GetImageOption(image_info,"jp2:quality-layers"); + if (option == (const char *) NULL) + option=GetImageOption(image_info,"jp2:layer-number"); + if (option != (const char *) NULL) + parameters.cp_layer=StringToInteger(option); + if (opj_setup_decoder(jp2_codec,¶meters) == 0) + { + opj_destroy_codec(jp2_codec); + ThrowReaderException(DelegateError,"UnableToManageJP2Stream"); + } + jp2_stream=opj_stream_create(OPJ_J2K_STREAM_CHUNK_SIZE,OPJ_TRUE); + opj_stream_set_read_function(jp2_stream,JP2ReadHandler); + opj_stream_set_write_function(jp2_stream,JP2WriteHandler); + opj_stream_set_seek_function(jp2_stream,JP2SeekHandler); + opj_stream_set_skip_function(jp2_stream,JP2SkipHandler); + opj_stream_set_user_data(jp2_stream,image,NULL); + opj_stream_set_user_data_length(jp2_stream,GetBlobSize(image)); + if (opj_read_header(jp2_stream,jp2_codec,&jp2_image) == 0) + { + opj_stream_destroy(jp2_stream); + opj_destroy_codec(jp2_codec); + ThrowReaderException(DelegateError,"UnableToDecodeImageFile"); + } + if ((AcquireMagickResource(WidthResource,(size_t) jp2_image->comps[0].w) == MagickFalse) || + (AcquireMagickResource(HeightResource,(size_t) jp2_image->comps[0].h) == MagickFalse)) + { + opj_stream_destroy(jp2_stream); + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + ThrowReaderException(DelegateError,"UnableToDecodeImageFile"); + } + jp2_status=OPJ_TRUE; + if (image->ping == MagickFalse) + { + if ((image->columns != 0) && (image->rows != 0)) + /* + Extract an area from the image. + */ + jp2_status=opj_set_decode_area(jp2_codec,jp2_image, + (OPJ_INT32) image->extract_info.x,(OPJ_INT32) image->extract_info.y, + (OPJ_INT32) image->extract_info.x+(ssize_t) image->columns, + (OPJ_INT32) image->extract_info.y+(ssize_t) image->rows); + else + jp2_status=opj_set_decode_area(jp2_codec,jp2_image,0,0, + jp2_image->comps[0].w,jp2_image->comps[0].h); + if (jp2_status == OPJ_FALSE) + { + opj_stream_destroy(jp2_stream); + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + ThrowReaderException(DelegateError,"UnableToDecodeImageFile"); + } + } + if ((image_info->number_scenes != 0) && (image_info->scene != 0)) + jp2_status=opj_get_decoded_tile(jp2_codec,jp2_stream,jp2_image, + (unsigned int) image_info->scene-1); + else + if (image->ping == MagickFalse) + { + jp2_status=opj_decode(jp2_codec,jp2_stream,jp2_image); + if (jp2_status != OPJ_FALSE) + jp2_status=opj_end_decompress(jp2_codec,jp2_stream); + } + if (jp2_status == OPJ_FALSE) + { + opj_stream_destroy(jp2_stream); + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + ThrowReaderException(DelegateError,"UnableToDecodeImageFile"); + } + opj_stream_destroy(jp2_stream); + for (i=0; i < (ssize_t) jp2_image->numcomps; i++) + { + if ((jp2_image->comps[i].dx == 0) || (jp2_image->comps[i].dy == 0) || + (jp2_image->comps[0].prec != jp2_image->comps[i].prec) || + (jp2_image->comps[0].prec > 64) || + (jp2_image->comps[0].sgnd != jp2_image->comps[i].sgnd) || + ((image->ping == MagickFalse) && (jp2_image->comps[i].data == NULL))) + { + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + ThrowReaderException(CoderError,"IrregularChannelGeometryNotSupported") + } + } + /* + Convert JP2 image. + */ + image->columns=(size_t) jp2_image->comps[0].w; + image->rows=(size_t) jp2_image->comps[0].h; + image->depth=jp2_image->comps[0].prec; + image->compression=JPEG2000Compression; + if (jp2_image->numcomps == 1) + SetImageColorspace(image,GRAYColorspace); + else + if (jp2_image->color_space == 2) + { + SetImageColorspace(image,GRAYColorspace); + if (jp2_image->numcomps > 1) + image->matte=MagickTrue; + } + else + if (jp2_image->color_space == 3) + SetImageColorspace(image,Rec601YCbCrColorspace); + if (jp2_image->numcomps > 3) + image->matte=MagickTrue; + if (jp2_image->icc_profile_buf != (unsigned char *) NULL) + { + StringInfo + *profile; + + profile=BlobToStringInfo(jp2_image->icc_profile_buf, + jp2_image->icc_profile_len); + if (profile != (StringInfo *) NULL) + { + SetImageProfile(image,"icc",profile); + profile=DestroyStringInfo(profile); + } + } + if (image->ping != MagickFalse) + { + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + ssize_t + i; + + for (i=0; i < (ssize_t) jp2_image->numcomps; i++) + { + double + pixel, + scale; + + ssize_t + index, + pad; + + pad=image->columns % jp2_image->comps[i].dx; + index=y/jp2_image->comps[i].dy*(image->columns+pad)/ + jp2_image->comps[i].dx+x/jp2_image->comps[i].dx; + if ((index < 0) || + (index >= (jp2_image->comps[i].h * jp2_image->comps[i].w))) + { + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + ThrowReaderException(CoderError, + "IrregularChannelGeometryNotSupported") + } + scale=QuantumRange/(double) ((1UL << jp2_image->comps[i].prec)-1); + pixel=scale*(jp2_image->comps[i].data[index]+ + (jp2_image->comps[i].sgnd ? 1UL << (jp2_image->comps[i].prec-1) : 0)); + switch (i) + { + case 0: + { + if (jp2_image->numcomps == 1) + { + SetPixelGray(q,ClampToQuantum(pixel)); + SetPixelOpacity(q,OpaqueOpacity); + break; + } + q->red=ClampToQuantum(pixel); + q->green=q->red; + q->blue=q->red; + q->opacity=OpaqueOpacity; + break; + } + case 1: + { + if (jp2_image->numcomps == 2) + { + q->opacity=ClampToQuantum(QuantumRange-pixel); + break; + } + q->green=ClampToQuantum(pixel); + break; + } + case 2: + { + q->blue=ClampToQuantum(pixel); + break; + } + case 3: + { + q->opacity=ClampToQuantum(QuantumRange-pixel); + break; + } + } + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + /* + Free resources. + */ + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + (void) CloseBlob(image); + if ((image_info->number_scenes != 0) && (image_info->scene != 0)) + AppendImageToList(&image,CloneImage(image,0,0,MagickTrue,exception)); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r J P 2 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterJP2Image() adds attributes for the JP2 image format to the list of +% supported formats. The attributes include the image format tag, a method +% method to read and/or write the format, whether the format supports the +% saving of more than one frame to the same file or blob, whether the format +% supports native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterJP2Image method is: +% +% size_t RegisterJP2Image(void) +% +*/ +ModuleExport size_t RegisterJP2Image(void) +{ + char + version[MaxTextExtent]; + + MagickInfo + *entry; + + *version='\0'; +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) + (void) FormatLocaleString(version,MaxTextExtent,"%s",opj_version()); +#endif + entry=SetMagickInfo("JP2"); + entry->description=ConstantString("JPEG-2000 File Format Syntax"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jp2"); + entry->magick_module=ConstantString("JP2"); + entry->magick=(IsImageFormatHandler *) IsJP2; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJP2Image; + entry->encoder=(EncodeImageHandler *) WriteJP2Image; +#endif + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("J2C"); + entry->description=ConstantString("JPEG-2000 Code Stream Syntax"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jp2"); + entry->magick_module=ConstantString("JP2"); + entry->magick=(IsImageFormatHandler *) IsJ2K; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJP2Image; + entry->encoder=(EncodeImageHandler *) WriteJP2Image; +#endif + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("J2K"); + entry->description=ConstantString("JPEG-2000 Code Stream Syntax"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jp2"); + entry->magick_module=ConstantString("JP2"); + entry->magick=(IsImageFormatHandler *) IsJ2K; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJP2Image; + entry->encoder=(EncodeImageHandler *) WriteJP2Image; +#endif + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("JPM"); + entry->description=ConstantString("JPEG-2000 Code Stream Syntax"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jp2"); + entry->magick_module=ConstantString("JP2"); + entry->magick=(IsImageFormatHandler *) IsJP2; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJP2Image; + entry->encoder=(EncodeImageHandler *) WriteJP2Image; +#endif + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("JPT"); + entry->description=ConstantString("JPEG-2000 File Format Syntax"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jp2"); + entry->magick_module=ConstantString("JP2"); + entry->magick=(IsImageFormatHandler *) IsJP2; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJP2Image; + entry->encoder=(EncodeImageHandler *) WriteJP2Image; +#endif + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("JPC"); + entry->description=ConstantString("JPEG-2000 Code Stream Syntax"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jp2"); + entry->magick_module=ConstantString("JP2"); + entry->magick=(IsImageFormatHandler *) IsJP2; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJP2Image; + entry->encoder=(EncodeImageHandler *) WriteJP2Image; +#endif + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r J P 2 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterJP2Image() removes format registrations made by the JP2 module +% from the list of supported formats. +% +% The format of the UnregisterJP2Image method is: +% +% UnregisterJP2Image(void) +% +*/ +ModuleExport void UnregisterJP2Image(void) +{ + (void) UnregisterMagickInfo("JPC"); + (void) UnregisterMagickInfo("JPT"); + (void) UnregisterMagickInfo("JPM"); + (void) UnregisterMagickInfo("JP2"); + (void) UnregisterMagickInfo("J2K"); +} + +#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e J P 2 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteJP2Image() writes an image in the JPEG 2000 image format. +% +% JP2 support originally written by Nathan Brown, nathanbrown@letu.edu +% +% The format of the WriteJP2Image method is: +% +% MagickBooleanType WriteJP2Image(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static void CinemaProfileCompliance(const opj_image_t *jp2_image, + opj_cparameters_t *parameters) +{ + /* + Digital Cinema 4K profile compliant codestream. + */ + parameters->tile_size_on=OPJ_FALSE; + parameters->cp_tdx=1; + parameters->cp_tdy=1; + parameters->tp_flag='C'; + parameters->tp_on=1; + parameters->cp_tx0=0; + parameters->cp_ty0=0; + parameters->image_offset_x0=0; + parameters->image_offset_y0=0; + parameters->cblockw_init=32; + parameters->cblockh_init=32; + parameters->csty|=0x01; + parameters->prog_order=OPJ_CPRL; + parameters->roi_compno=(-1); + parameters->subsampling_dx=1; + parameters->subsampling_dy=1; + parameters->irreversible=1; + if ((jp2_image->comps[0].w == 2048) || (jp2_image->comps[0].h == 1080)) + { + /* + Digital Cinema 2K. + */ + parameters->cp_cinema=OPJ_CINEMA2K_24; + parameters->cp_rsiz=OPJ_CINEMA2K; + parameters->max_comp_size=1041666; + if (parameters->numresolution > 6) + parameters->numresolution=6; + + } + if ((jp2_image->comps[0].w == 4096) || (jp2_image->comps[0].h == 2160)) + { + /* + Digital Cinema 4K. + */ + parameters->cp_cinema=OPJ_CINEMA4K_24; + parameters->cp_rsiz=OPJ_CINEMA4K; + parameters->max_comp_size=1041666; + if (parameters->numresolution < 1) + parameters->numresolution=1; + if (parameters->numresolution > 7) + parameters->numresolution=7; + parameters->numpocs=2; + parameters->POC[0].tile=1; + parameters->POC[0].resno0=0; + parameters->POC[0].compno0=0; + parameters->POC[0].layno1=1; + parameters->POC[0].resno1=parameters->numresolution-1; + parameters->POC[0].compno1=3; + parameters->POC[0].prg1=OPJ_CPRL; + parameters->POC[1].tile=1; + parameters->POC[1].resno0=parameters->numresolution-1; + parameters->POC[1].compno0=0; + parameters->POC[1].layno1=1; + parameters->POC[1].resno1=parameters->numresolution; + parameters->POC[1].compno1=3; + parameters->POC[1].prg1=OPJ_CPRL; + } + parameters->tcp_numlayers=1; + parameters->tcp_rates[0]=((float) (jp2_image->numcomps*jp2_image->comps[0].w* + jp2_image->comps[0].h*jp2_image->comps[0].prec))/(parameters->max_comp_size* + 8*jp2_image->comps[0].dx*jp2_image->comps[0].dy); + parameters->cp_disto_alloc=1; +} + +static inline int CalculateNumResolutions(size_t width,size_t height) +{ + int + i; + + for (i=1; i < 6; i++) + if ((width < ((size_t) 1UL << i)) || (height < ((size_t) 1UL << i))) + break; + return(i); +} + +static MagickBooleanType WriteJP2Image(const ImageInfo *image_info,Image *image) +{ + const char + *option, + *property; + + int + jp2_status; + + MagickBooleanType + status; + + opj_codec_t + *jp2_codec; + + OPJ_COLOR_SPACE + jp2_colorspace; + + opj_cparameters_t + *parameters; + + opj_image_cmptparm_t + jp2_info[5]; + + opj_image_t + *jp2_image; + + opj_stream_t + *jp2_stream; + + ssize_t + i; + + ssize_t + y; + + unsigned int + channels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + /* + Initialize JPEG 2000 encoder parameters. + */ + parameters=(opj_cparameters_t *) AcquireMagickMemory(sizeof(*parameters)); + if (parameters == (opj_cparameters_t *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + opj_set_default_encoder_parameters(parameters); + option=GetImageOption(image_info,"jp2:number-resolutions"); + if (option != (const char *) NULL) + parameters->numresolution=StringToInteger(option); + else + parameters->numresolution=CalculateNumResolutions(image->columns, + image->rows); + parameters->tcp_numlayers=1; + parameters->tcp_rates[0]=0; /* lossless */ + parameters->cp_disto_alloc=1; + if ((image_info->quality != 0) && (image_info->quality != 100)) + { + parameters->tcp_distoratio[0]=(double) image_info->quality; + parameters->cp_fixed_quality=OPJ_TRUE; + parameters->cp_disto_alloc=0; + } + if (image_info->extract != (char *) NULL) + { + RectangleInfo + geometry; + + int + flags; + + /* + Set tile size. + */ + (void) memset(&geometry,0,sizeof(geometry)); + flags=ParseAbsoluteGeometry(image_info->extract,&geometry); + parameters->cp_tdx=(int) geometry.width; + parameters->cp_tdy=(int) geometry.width; + if ((flags & HeightValue) != 0) + parameters->cp_tdy=(int) geometry.height; + if ((flags & XValue) != 0) + parameters->cp_tx0=geometry.x; + if ((flags & YValue) != 0) + parameters->cp_ty0=geometry.y; + parameters->tile_size_on=OPJ_TRUE; + parameters->numresolution=CalculateNumResolutions(parameters->cp_tdx, + parameters->cp_tdy); + } + option=GetImageOption(image_info,"jp2:quality"); + if (option != (const char *) NULL) + { + const char + *p; + + /* + Set quality PSNR. + */ + p=option; + for (i=0; sscanf(p,"%f",¶meters->tcp_distoratio[i]) == 1; i++) + { + if (i >= 100) + break; + while ((*p != '\0') && (*p != ',')) + p++; + if (*p == '\0') + break; + p++; + } + parameters->tcp_numlayers=i+1; + parameters->cp_fixed_quality=OPJ_TRUE; + parameters->cp_disto_alloc=0; + } + option=GetImageOption(image_info,"jp2:progression-order"); + if (option != (const char *) NULL) + { + if (LocaleCompare(option,"LRCP") == 0) + parameters->prog_order=OPJ_LRCP; + if (LocaleCompare(option,"RLCP") == 0) + parameters->prog_order=OPJ_RLCP; + if (LocaleCompare(option,"RPCL") == 0) + parameters->prog_order=OPJ_RPCL; + if (LocaleCompare(option,"PCRL") == 0) + parameters->prog_order=OPJ_PCRL; + if (LocaleCompare(option,"CPRL") == 0) + parameters->prog_order=OPJ_CPRL; + } + option=GetImageOption(image_info,"jp2:rate"); + if (option != (const char *) NULL) + { + const char + *p; + + /* + Set compression rate. + */ + p=option; + for (i=0; sscanf(p,"%f",¶meters->tcp_rates[i]) == 1; i++) + { + if (i > 100) + break; + while ((*p != '\0') && (*p != ',')) + p++; + if (*p == '\0') + break; + p++; + } + parameters->tcp_numlayers=i+1; + parameters->cp_disto_alloc=OPJ_TRUE; + } + if (image_info->sampling_factor != (const char *) NULL) + (void) sscanf(image_info->sampling_factor,"%d:%d", + ¶meters->subsampling_dx,¶meters->subsampling_dy); + property=GetImageProperty(image,"comment"); + if (property != (const char *) NULL) + parameters->cp_comment=(char *) property; + channels=3; + jp2_colorspace=OPJ_CLRSPC_SRGB; + if (image->colorspace == YUVColorspace) + { + jp2_colorspace=OPJ_CLRSPC_SYCC; + parameters->subsampling_dx=2; + } + else + { + if (IsGrayColorspace(image->colorspace) != MagickFalse) + { + channels=1; + jp2_colorspace=OPJ_CLRSPC_GRAY; + } + else + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + if (image->matte != MagickFalse) + channels++; + } + parameters->tcp_mct=channels == 3 ? 1 : 0; + memset(jp2_info,0,sizeof(jp2_info)); + for (i=0; i < (ssize_t) channels; i++) + { + jp2_info[i].prec=(unsigned int) image->depth; + jp2_info[i].bpp=(unsigned int) image->depth; + if ((image->depth == 1) && + ((LocaleCompare(image_info->magick,"JPT") == 0) || + (LocaleCompare(image_info->magick,"JP2") == 0))) + { + jp2_info[i].prec++; /* OpenJPEG returns exception for depth @ 1 */ + jp2_info[i].bpp++; + } + jp2_info[i].sgnd=0; + jp2_info[i].dx=parameters->subsampling_dx; + jp2_info[i].dy=parameters->subsampling_dy; + jp2_info[i].w=(unsigned int) image->columns; + jp2_info[i].h=(unsigned int) image->rows; + } + jp2_image=opj_image_create(channels,jp2_info,jp2_colorspace); + if (jp2_image == (opj_image_t *) NULL) + { + parameters=(opj_cparameters_t *) RelinquishMagickMemory(parameters); + ThrowWriterException(DelegateError,"UnableToEncodeImageFile"); + } + jp2_image->x0=parameters->image_offset_x0; + jp2_image->y0=parameters->image_offset_y0; + jp2_image->x1=(unsigned int) (2*parameters->image_offset_x0+ + (image->columns-1)*parameters->subsampling_dx+1); + jp2_image->y1=(unsigned int) (2*parameters->image_offset_y0+ + (image->rows-1)*parameters->subsampling_dx+1); + if ((image->depth == 12) && + ((image->columns == 2048) || (image->rows == 1080) || + (image->columns == 4096) || (image->rows == 2160))) + CinemaProfileCompliance(jp2_image,parameters); + if (channels == 4) + jp2_image->comps[3].alpha=1; + else + if ((channels == 2) && (jp2_colorspace == OPJ_CLRSPC_GRAY)) + jp2_image->comps[1].alpha=1; + /* + Convert to JP2 pixels. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + for (i=0; i < (ssize_t) channels; i++) + { + double + scale; + + int + *q; + + scale=(double) (((size_t) 1UL << jp2_image->comps[i].prec)-1)/ + QuantumRange; + q=jp2_image->comps[i].data+(ssize_t) (y*PerceptibleReciprocal( + jp2_image->comps[i].dy)*image->columns*PerceptibleReciprocal( + jp2_image->comps[i].dx)+x*PerceptibleReciprocal( + jp2_image->comps[i].dx)); + switch (i) + { + case 0: + { + if (jp2_colorspace == OPJ_CLRSPC_GRAY) + { + *q=(int) (scale*GetPixelGray(p)); + break; + } + *q=(int) (scale*p->red); + break; + } + case 1: + { + if (jp2_colorspace == OPJ_CLRSPC_GRAY) + { + *q=(int) (scale*(QuantumRange-p->opacity)); + break; + } + *q=(int) (scale*p->green); + break; + } + case 2: + { + *q=(int) (scale*p->blue); + break; + } + case 3: + { + *q=(int) (scale*(QuantumRange-p->opacity)); + break; + } + } + } + p++; + } + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + if (LocaleCompare(image_info->magick,"JPT") == 0) + jp2_codec=opj_create_compress(OPJ_CODEC_JPT); + else + if (LocaleCompare(image_info->magick,"J2K") == 0) + jp2_codec=opj_create_compress(OPJ_CODEC_J2K); + else + jp2_codec=opj_create_compress(OPJ_CODEC_JP2); + opj_set_warning_handler(jp2_codec,JP2WarningHandler,&image->exception); + opj_set_error_handler(jp2_codec,JP2ErrorHandler,&image->exception); + opj_setup_encoder(jp2_codec,parameters,jp2_image); + jp2_stream=opj_stream_create(OPJ_J2K_STREAM_CHUNK_SIZE,OPJ_FALSE); + if (jp2_stream == (opj_stream_t *) NULL) + { + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + parameters=(opj_cparameters_t *) RelinquishMagickMemory(parameters); + ThrowWriterException(DelegateError,"UnableToEncodeImageFile"); + } + opj_stream_set_read_function(jp2_stream,JP2ReadHandler); + opj_stream_set_write_function(jp2_stream,JP2WriteHandler); + opj_stream_set_seek_function(jp2_stream,JP2SeekHandler); + opj_stream_set_skip_function(jp2_stream,JP2SkipHandler); + opj_stream_set_user_data(jp2_stream,image,NULL); + jp2_status=opj_start_compress(jp2_codec,jp2_image,jp2_stream); + if ((jp2_status == 0) || (opj_encode(jp2_codec,jp2_stream) == 0) || + (opj_end_compress(jp2_codec,jp2_stream) == 0)) + { + opj_stream_destroy(jp2_stream); + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + parameters=(opj_cparameters_t *) RelinquishMagickMemory(parameters); + ThrowWriterException(DelegateError,"UnableToEncodeImageFile"); + } + /* + Free resources. + */ + opj_stream_destroy(jp2_stream); + opj_destroy_codec(jp2_codec); + opj_image_destroy(jp2_image); + parameters=(opj_cparameters_t *) RelinquishMagickMemory(parameters); + (void) CloseBlob(image); + return(MagickTrue); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/jpeg.c b/ImageMagick-6.9.12-44/coders/jpeg.c new file mode 100644 index 0000000..4a3b31b --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/jpeg.c @@ -0,0 +1,3106 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% JJJJJ PPPP EEEEE GGGG % +% J P P E G % +% J PPPP EEE G GG % +% J J P E G G % +% JJJ P EEEEE GGG % +% % +% % +% Read/Write JPEG Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% This software is based in part on the work of the Independent JPEG Group. +% See ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz for copyright and +% licensing restrictions. Blob support contributed by Glenn Randers-Pehrson. +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/colormap-private.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/option-private.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/semaphore.h" +#include "magick/splay-tree.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/xml-tree.h" +#include +#if defined(MAGICKCORE_JPEG_DELEGATE) +#define JPEG_INTERNAL_OPTIONS +#if defined(__MINGW32__) +# define XMD_H 1 /* Avoid conflicting typedef for INT32 */ +#endif +#undef HAVE_STDLIB_H +#include "jpeglib.h" +#include "jerror.h" +#endif + +/* + Define declarations. +*/ +#define ICC_MARKER (JPEG_APP0+2) +#define ICC_PROFILE "ICC_PROFILE" +#define IPTC_MARKER (JPEG_APP0+13) +#define XML_MARKER (JPEG_APP0+1) +#define MaxJPEGScans 1024 + +/* + Typedef declarations. +*/ +#if defined(MAGICKCORE_JPEG_DELEGATE) +typedef struct _DestinationManager +{ + struct jpeg_destination_mgr + manager; + + Image + *image; + + JOCTET + *buffer; +} DestinationManager; + +typedef struct _JPEGClientInfo +{ + jmp_buf + error_recovery; + + Image + *image; + + MagickBooleanType + finished; + + StringInfo + *profile; +} JPEGClientInfo; + +typedef struct _SourceManager +{ + struct jpeg_source_mgr + manager; + + Image + *image; + + JOCTET + *buffer; + + boolean + start_of_blob; +} SourceManager; +#endif + +typedef struct _QuantizationTable +{ + char + *slot, + *description; + + size_t + width, + height; + + double + divisor; + + unsigned int + *levels; +} QuantizationTable; + +/* + Const declarations. +*/ +static const char + xmp_namespace[] = "http://ns.adobe.com/xap/1.0/ "; + #define XMPNamespaceExtent 28 + +/* + Forward declarations. +*/ +#if defined(MAGICKCORE_JPEG_DELEGATE) +static MagickBooleanType + WriteJPEGImage(const ImageInfo *,Image *); +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s J P E G % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsJPEG() returns MagickTrue if the image format type, identified by the +% magick string, is JPEG. +% +% The format of the IsJPEG method is: +% +% MagickBooleanType IsJPEG(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsJPEG(const unsigned char *magick,const size_t length) +{ + if (length < 3) + return(MagickFalse); + if (memcmp(magick,"\377\330\377",3) == 0) + return(MagickTrue); + return(MagickFalse); +} + +#if defined(MAGICKCORE_JPEG_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d J P E G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadJPEGImage() reads a JPEG image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the ReadJPEGImage method is: +% +% Image *ReadJPEGImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static boolean FillInputBuffer(j_decompress_ptr compress_info) +{ + SourceManager + *source; + + source=(SourceManager *) compress_info->src; + source->manager.bytes_in_buffer=(size_t) ReadBlob(source->image, + MagickMinBufferExtent,source->buffer); + if (source->manager.bytes_in_buffer == 0) + { + if (source->start_of_blob != FALSE) + ERREXIT(compress_info,JERR_INPUT_EMPTY); + WARNMS(compress_info,JWRN_JPEG_EOF); + source->buffer[0]=(JOCTET) 0xff; + source->buffer[1]=(JOCTET) JPEG_EOI; + source->manager.bytes_in_buffer=2; + } + source->manager.next_input_byte=source->buffer; + source->start_of_blob=FALSE; + return(TRUE); +} + +static int GetCharacter(j_decompress_ptr jpeg_info) +{ + if (jpeg_info->src->bytes_in_buffer == 0) + { + (void) (*jpeg_info->src->fill_input_buffer)(jpeg_info); + if (jpeg_info->err->msg_code == JWRN_JPEG_EOF) + return EOF; + } + jpeg_info->src->bytes_in_buffer--; + return((int) GETJOCTET(*jpeg_info->src->next_input_byte++)); +} + +static void InitializeSource(j_decompress_ptr compress_info) +{ + SourceManager + *source; + + source=(SourceManager *) compress_info->src; + source->start_of_blob=TRUE; +} + +static MagickBooleanType IsITUFaxImage(const Image *image) +{ + const StringInfo + *profile; + + const unsigned char + *datum; + + profile=GetImageProfile(image,"8bim"); + if (profile == (const StringInfo *) NULL) + return(MagickFalse); + if (GetStringInfoLength(profile) < 5) + return(MagickFalse); + datum=GetStringInfoDatum(profile); + if ((datum[0] == 0x47) && (datum[1] == 0x33) && (datum[2] == 0x46) && + (datum[3] == 0x41) && (datum[4] == 0x58)) + return(MagickTrue); + return(MagickFalse); +} + +static void JPEGErrorHandler(j_common_ptr jpeg_info) +{ + char + message[JMSG_LENGTH_MAX]; + + ExceptionInfo + *exception; + + Image + *image; + + JPEGClientInfo + *client_info; + + *message='\0'; + client_info=(JPEGClientInfo *) jpeg_info->client_data; + image=client_info->image; + exception=(&image->exception); + (jpeg_info->err->format_message)(jpeg_info,message); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "[%s] JPEG Trace: \"%s\"",image->filename,message); + if (client_info->finished != MagickFalse) + (void) ThrowMagickException(exception,GetMagickModule(),CorruptImageWarning, + (char *) message,"`%s'",image->filename); + else + (void) ThrowMagickException(exception,GetMagickModule(),CorruptImageError, + (char *) message,"`%s'",image->filename); + longjmp(client_info->error_recovery,1); +} + +static void JPEGProgressHandler(j_common_ptr jpeg_info) +{ + ExceptionInfo + *exception; + + Image + *image; + + JPEGClientInfo + *client_info; + + client_info=(JPEGClientInfo *) jpeg_info->client_data; + image=client_info->image; + exception=(&image->exception); + if (jpeg_info->is_decompressor == 0) + return; + if (((j_decompress_ptr) jpeg_info)->input_scan_number < MaxJPEGScans) + return; + (void) ThrowMagickException(exception,GetMagickModule(),CorruptImageError, + "too many scans","`%s'",image->filename); + longjmp(client_info->error_recovery,1); +} + +static MagickBooleanType JPEGWarningHandler(j_common_ptr jpeg_info,int level) +{ +#define JPEGExcessiveWarnings 1000 + + char + message[JMSG_LENGTH_MAX]; + + Image + *image; + + JPEGClientInfo + *client_info; + + *message='\0'; + client_info=(JPEGClientInfo *) jpeg_info->client_data; + image=client_info->image; + if (level < 0) + { + /* + Process warning message. + */ + (jpeg_info->err->format_message)(jpeg_info,message); + if (jpeg_info->err->num_warnings++ < JPEGExcessiveWarnings) + ThrowBinaryImageException(CorruptImageWarning,(char *) message, + image->filename); + } + else + if (level >= jpeg_info->err->trace_level) + { + /* + Process trace message. + */ + (jpeg_info->err->format_message)(jpeg_info,message); + if ((image != (Image *) NULL) && (image->debug != MagickFalse)) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "[%s] JPEG Trace: \"%s\"",image->filename,message); + } + return(MagickTrue); +} + +static boolean ReadComment(j_decompress_ptr jpeg_info) +{ +#define GetProfileLength(jpeg_info,length) \ +{ \ + int \ + c[2]; \ +\ + length=0; \ + c[0]=GetCharacter(jpeg_info); \ + c[1]=GetCharacter(jpeg_info); \ + if ((c[0] >= 0) && (c[1] >= 0)) \ + length=(size_t) ((c[0] << 8) | c[1]); \ +} + + Image + *image; + + JPEGClientInfo + *client_info; + + unsigned char + *p; + + ssize_t + i; + + size_t + length; + + StringInfo + *comment; + + /* + Determine length of comment. + */ + client_info=(JPEGClientInfo *) jpeg_info->client_data; + image=client_info->image; + GetProfileLength(jpeg_info,length); + if (length <= 2) + return(TRUE); + length-=2; + comment=BlobToStringInfo((const void *) NULL,length); + if (comment == (StringInfo *) NULL) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(FALSE); + } + /* + Read comment. + */ + client_info->profile=comment; + p=GetStringInfoDatum(comment); + for (i=0; i < (ssize_t) length; i++) + { + int + c; + + c=GetCharacter(jpeg_info); + if (c == EOF) + break; + *p++=(unsigned char) c; + } + *p='\0'; + client_info->profile=NULL; + if (i != (ssize_t) length) + { + comment=DestroyStringInfo(comment); + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CorruptImageError,"InsufficientImageDataInFile","`%s'", + image->filename); + return(FALSE); + } + p=GetStringInfoDatum(comment); + (void) SetImageProperty(image,"comment",(const char *) p); + comment=DestroyStringInfo(comment); + return(TRUE); +} + +static boolean ReadICCProfile(j_decompress_ptr jpeg_info) +{ + char + magick[13]; + + Image + *image; + + JPEGClientInfo + *client_info; + + MagickBooleanType + status; + + ssize_t + i; + + unsigned char + *p; + + size_t + length; + + StringInfo + *icc_profile, + *profile; + + /* + Read color profile. + */ + GetProfileLength(jpeg_info,length); + if (length <= 2) + return(TRUE); + length-=2; + if (length <= 14) + { + while (length-- > 0) + if (GetCharacter(jpeg_info) == EOF) + break; + return(TRUE); + } + for (i=0; i < 12; i++) + magick[i]=(char) GetCharacter(jpeg_info); + magick[i]='\0'; + if (LocaleCompare(magick,ICC_PROFILE) != 0) + { + /* + Not a ICC profile, return. + */ + for (i=0; i < (ssize_t) (length-12); i++) + if (GetCharacter(jpeg_info) == EOF) + break; + return(TRUE); + } + (void) GetCharacter(jpeg_info); /* id */ + (void) GetCharacter(jpeg_info); /* markers */ + length-=14; + client_info=(JPEGClientInfo *) jpeg_info->client_data; + image=client_info->image; + profile=BlobToStringInfo((const void *) NULL,length); + if (profile == (StringInfo *) NULL) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(FALSE); + } + client_info->profile=profile; + p=GetStringInfoDatum(profile); + for (i=0; i < (ssize_t) length; i++) + { + int + c; + + c=GetCharacter(jpeg_info); + if (c == EOF) + break; + *p++=(unsigned char) c; + } + client_info->profile=NULL; + if (i != (ssize_t) length) + { + profile=DestroyStringInfo(profile); + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CorruptImageError,"InsufficientImageDataInFile","`%s'", + image->filename); + return(FALSE); + } + icc_profile=(StringInfo *) GetImageProfile(image,"icc"); + if (icc_profile != (StringInfo *) NULL) + { + ConcatenateStringInfo(icc_profile,profile); + profile=DestroyStringInfo(profile); + } + else + { + status=SetImageProfile(image,"icc",profile); + profile=DestroyStringInfo(profile); + if (status == MagickFalse) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(FALSE); + } + } + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Profile: ICC, %.20g bytes",(double) length); + return(TRUE); +} + +static boolean ReadIPTCProfile(j_decompress_ptr jpeg_info) +{ + char + magick[MaxTextExtent]; + + Image + *image; + + JPEGClientInfo + *client_info; + + MagickBooleanType + status; + + ssize_t + i; + + unsigned char + *p; + + size_t + length; + + StringInfo + *iptc_profile, + *profile; + + /* + Determine length of binary data stored here. + */ + GetProfileLength(jpeg_info,length); + if (length <= 2) + return(TRUE); + length-=2; + if (length <= 14) + { + while (length-- > 0) + if (GetCharacter(jpeg_info) == EOF) + break; + return(TRUE); + } + /* + Validate that this was written as a Photoshop resource format slug. + */ + for (i=0; i < 10; i++) + magick[i]=(char) GetCharacter(jpeg_info); + magick[10]='\0'; + length-=10; + if (length <= 10) + return(TRUE); + if (LocaleCompare(magick,"Photoshop ") != 0) + { + /* + Not a IPTC profile, return. + */ + for (i=0; i < (ssize_t) length; i++) + if (GetCharacter(jpeg_info) == EOF) + break; + return(TRUE); + } + /* + Remove the version number. + */ + for (i=0; i < 4; i++) + if (GetCharacter(jpeg_info) == EOF) + break; + if (length <= 11) + return(TRUE); + length-=4; + client_info=(JPEGClientInfo *) jpeg_info->client_data; + image=client_info->image; + profile=BlobToStringInfo((const void *) NULL,length); + if (profile == (StringInfo *) NULL) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(FALSE); + } + client_info->profile=profile; + p=GetStringInfoDatum(profile); + for (i=0; i < (ssize_t) length; i++) + { + int + c; + + c=GetCharacter(jpeg_info); + if (c == EOF) + break; + *p++=(unsigned char) c; + } + client_info->profile=NULL; + if (i != (ssize_t) length) + { + profile=DestroyStringInfo(profile); + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CorruptImageError,"InsufficientImageDataInFile","`%s'", + image->filename); + return(FALSE); + } + /* + The IPTC profile is actually an 8bim. + */ + iptc_profile=(StringInfo *) GetImageProfile(image,"8bim"); + if (iptc_profile != (StringInfo *) NULL) + { + ConcatenateStringInfo(iptc_profile,profile); + profile=DestroyStringInfo(profile); + } + else + { + status=SetImageProfile(image,"8bim",profile); + profile=DestroyStringInfo(profile); + if (status == MagickFalse) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(FALSE); + } + } + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Profile: iptc, %.20g bytes",(double) length); + return(TRUE); +} + +static boolean ReadProfile(j_decompress_ptr jpeg_info) +{ + char + name[MaxTextExtent]; + + const StringInfo + *previous_profile; + + Image + *image; + + int + marker; + + JPEGClientInfo + *client_info; + + MagickBooleanType + status; + + ssize_t + i; + + unsigned char + *p; + + size_t + length; + + StringInfo + *profile; + + /* + Read generic profile. + */ + GetProfileLength(jpeg_info,length); + if (length <= 2) + return(TRUE); + length-=2; + marker=jpeg_info->unread_marker-JPEG_APP0; + (void) FormatLocaleString(name,MaxTextExtent,"APP%d",marker); + client_info=(JPEGClientInfo *) jpeg_info->client_data; + image=client_info->image; + profile=BlobToStringInfo((const void *) NULL,length); + if (profile == (StringInfo *) NULL) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(FALSE); + } + client_info->profile=profile; + p=GetStringInfoDatum(profile); + for (i=0; i < (ssize_t) length; i++) + { + int + c; + + c=GetCharacter(jpeg_info); + if (c == EOF) + break; + *p++=(unsigned char) c; + } + client_info->profile=NULL; + if (i != (ssize_t) length) + { + profile=DestroyStringInfo(profile); + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CorruptImageError,"InsufficientImageDataInFile","`%s'", + image->filename); + return(FALSE); + } + if (marker == 1) + { + p=GetStringInfoDatum(profile); + if ((length > 4) && (LocaleNCompare((char *) p,"exif",4) == 0)) + (void) CopyMagickString(name,"exif",MaxTextExtent); + else + if ((length > XMPNamespaceExtent) && + (LocaleNCompare((char *) p,xmp_namespace,XMPNamespaceExtent-1) == 0)) + { + ssize_t + j; + + /* + Extract namespace from XMP profile. + */ + p=GetStringInfoDatum(profile)+XMPNamespaceExtent; + for (j=XMPNamespaceExtent; j < (ssize_t) GetStringInfoLength(profile); j++) + { + if (*p == '\0') + break; + p++; + } + if (j < (ssize_t) GetStringInfoLength(profile)) + (void) DestroyStringInfo(SplitStringInfo(profile,(size_t) (j+1))); + (void) CopyMagickString(name,"xmp",MaxTextExtent); + } + } + previous_profile=GetImageProfile(image,name); + if ((previous_profile != (const StringInfo *) NULL) && + (CompareStringInfo(previous_profile,profile) != 0)) + { + size_t + length; + + length=GetStringInfoLength(profile); + SetStringInfoLength(profile,GetStringInfoLength(profile)+ + GetStringInfoLength(previous_profile)); + (void) memmove(GetStringInfoDatum(profile)+ + GetStringInfoLength(previous_profile),GetStringInfoDatum(profile), + length); + (void) memcpy(GetStringInfoDatum(profile), + GetStringInfoDatum(previous_profile), + GetStringInfoLength(previous_profile)); + GetStringInfoDatum(profile)[GetStringInfoLength(profile)]='\0'; + } + status=SetImageProfile(image,name,profile); + profile=DestroyStringInfo(profile); + if (status == MagickFalse) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(FALSE); + } + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Profile: %s, %.20g bytes",name,(double) length); + return(TRUE); +} + +static void SkipInputData(j_decompress_ptr compress_info,long number_bytes) +{ + SourceManager + *source; + + if (number_bytes <= 0) + return; + source=(SourceManager *) compress_info->src; + while (number_bytes > (long) source->manager.bytes_in_buffer) + { + number_bytes-=(long) source->manager.bytes_in_buffer; + (void) FillInputBuffer(compress_info); + } + source->manager.next_input_byte+=number_bytes; + source->manager.bytes_in_buffer-=number_bytes; +} + +static void TerminateSource(j_decompress_ptr compress_info) +{ + (void) compress_info; +} + +static void JPEGSourceManager(j_decompress_ptr compress_info,Image *image) +{ + SourceManager + *source; + + compress_info->src=(struct jpeg_source_mgr *) (* + compress_info->mem->alloc_small) ((j_common_ptr) compress_info,JPOOL_IMAGE, + sizeof(SourceManager)); + source=(SourceManager *) compress_info->src; + source->buffer=(JOCTET *) (*compress_info->mem->alloc_small) ((j_common_ptr) + compress_info,JPOOL_IMAGE,MagickMinBufferExtent*sizeof(JOCTET)); + source=(SourceManager *) compress_info->src; + source->manager.init_source=InitializeSource; + source->manager.fill_input_buffer=FillInputBuffer; + source->manager.skip_input_data=SkipInputData; + source->manager.resync_to_restart=jpeg_resync_to_restart; + source->manager.term_source=TerminateSource; + source->manager.bytes_in_buffer=0; + source->manager.next_input_byte=NULL; + source->image=image; +} + +static void JPEGSetImageQuality(struct jpeg_decompress_struct *jpeg_info, + Image *image) +{ + image->quality=UndefinedCompressionQuality; +#if defined(D_PROGRESSIVE_SUPPORTED) + if (image->compression == LosslessJPEGCompression) + { + image->quality=100; + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Quality: 100 (lossless)"); + } + else +#endif + { + ssize_t + j, + qvalue, + sum; + + ssize_t + i; + + /* + Determine the JPEG compression quality from the quantization tables. + */ + sum=0; + for (i=0; i < NUM_QUANT_TBLS; i++) + { + if (jpeg_info->quant_tbl_ptrs[i] != NULL) + for (j=0; j < DCTSIZE2; j++) + sum+=jpeg_info->quant_tbl_ptrs[i]->quantval[j]; + } + if ((jpeg_info->quant_tbl_ptrs[0] != NULL) && + (jpeg_info->quant_tbl_ptrs[1] != NULL)) + { + ssize_t + hash[101] = + { + 1020, 1015, 932, 848, 780, 735, 702, 679, 660, 645, + 632, 623, 613, 607, 600, 594, 589, 585, 581, 571, + 555, 542, 529, 514, 494, 474, 457, 439, 424, 410, + 397, 386, 373, 364, 351, 341, 334, 324, 317, 309, + 299, 294, 287, 279, 274, 267, 262, 257, 251, 247, + 243, 237, 232, 227, 222, 217, 213, 207, 202, 198, + 192, 188, 183, 177, 173, 168, 163, 157, 153, 148, + 143, 139, 132, 128, 125, 119, 115, 108, 104, 99, + 94, 90, 84, 79, 74, 70, 64, 59, 55, 49, + 45, 40, 34, 30, 25, 20, 15, 11, 6, 4, + 0 + }, + sums[101] = + { + 32640, 32635, 32266, 31495, 30665, 29804, 29146, 28599, 28104, + 27670, 27225, 26725, 26210, 25716, 25240, 24789, 24373, 23946, + 23572, 22846, 21801, 20842, 19949, 19121, 18386, 17651, 16998, + 16349, 15800, 15247, 14783, 14321, 13859, 13535, 13081, 12702, + 12423, 12056, 11779, 11513, 11135, 10955, 10676, 10392, 10208, + 9928, 9747, 9564, 9369, 9193, 9017, 8822, 8639, 8458, + 8270, 8084, 7896, 7710, 7527, 7347, 7156, 6977, 6788, + 6607, 6422, 6236, 6054, 5867, 5684, 5495, 5305, 5128, + 4945, 4751, 4638, 4442, 4248, 4065, 3888, 3698, 3509, + 3326, 3139, 2957, 2775, 2586, 2405, 2216, 2037, 1846, + 1666, 1483, 1297, 1109, 927, 735, 554, 375, 201, + 128, 0 + }; + + qvalue=(ssize_t) (jpeg_info->quant_tbl_ptrs[0]->quantval[2]+ + jpeg_info->quant_tbl_ptrs[0]->quantval[53]+ + jpeg_info->quant_tbl_ptrs[1]->quantval[0]+ + jpeg_info->quant_tbl_ptrs[1]->quantval[DCTSIZE2-1]); + for (i=0; i < 100; i++) + { + if ((qvalue < hash[i]) && (sum < sums[i])) + continue; + if (((qvalue <= hash[i]) && (sum <= sums[i])) || (i >= 50)) + image->quality=(size_t) i+1; + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Quality: %.20g (%s)",(double) i+1,(qvalue <= hash[i]) && + (sum <= sums[i]) ? "exact" : "approximate"); + break; + } + } + else + if (jpeg_info->quant_tbl_ptrs[0] != NULL) + { + ssize_t + hash[101] = + { + 510, 505, 422, 380, 355, 338, 326, 318, 311, 305, + 300, 297, 293, 291, 288, 286, 284, 283, 281, 280, + 279, 278, 277, 273, 262, 251, 243, 233, 225, 218, + 211, 205, 198, 193, 186, 181, 177, 172, 168, 164, + 158, 156, 152, 148, 145, 142, 139, 136, 133, 131, + 129, 126, 123, 120, 118, 115, 113, 110, 107, 105, + 102, 100, 97, 94, 92, 89, 87, 83, 81, 79, + 76, 74, 70, 68, 66, 63, 61, 57, 55, 52, + 50, 48, 44, 42, 39, 37, 34, 31, 29, 26, + 24, 21, 18, 16, 13, 11, 8, 6, 3, 2, + 0 + }, + sums[101] = + { + 16320, 16315, 15946, 15277, 14655, 14073, 13623, 13230, 12859, + 12560, 12240, 11861, 11456, 11081, 10714, 10360, 10027, 9679, + 9368, 9056, 8680, 8331, 7995, 7668, 7376, 7084, 6823, + 6562, 6345, 6125, 5939, 5756, 5571, 5421, 5240, 5086, + 4976, 4829, 4719, 4616, 4463, 4393, 4280, 4166, 4092, + 3980, 3909, 3835, 3755, 3688, 3621, 3541, 3467, 3396, + 3323, 3247, 3170, 3096, 3021, 2952, 2874, 2804, 2727, + 2657, 2583, 2509, 2437, 2362, 2290, 2211, 2136, 2068, + 1996, 1915, 1858, 1773, 1692, 1620, 1552, 1477, 1398, + 1326, 1251, 1179, 1109, 1031, 961, 884, 814, 736, + 667, 592, 518, 441, 369, 292, 221, 151, 86, + 64, 0 + }; + + qvalue=(ssize_t) (jpeg_info->quant_tbl_ptrs[0]->quantval[2]+ + jpeg_info->quant_tbl_ptrs[0]->quantval[53]); + for (i=0; i < 100; i++) + { + if ((qvalue < hash[i]) && (sum < sums[i])) + continue; + if (((qvalue <= hash[i]) && (sum <= sums[i])) || (i >= 50)) + image->quality=(size_t) i+1; + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Quality: %.20g (%s)",(double) i+1,(qvalue <= hash[i]) && + (sum <= sums[i]) ? "exact" : "approximate"); + break; + } + } + } +} + +static void JPEGSetImageSamplingFactor(struct jpeg_decompress_struct *jpeg_info, Image *image) +{ + char + sampling_factor[MaxTextExtent]; + + switch (jpeg_info->out_color_space) + { + case JCS_CMYK: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Colorspace: CMYK"); + (void) FormatLocaleString(sampling_factor,MaxTextExtent, + "%dx%d,%dx%d,%dx%d,%dx%d",jpeg_info->comp_info[0].h_samp_factor, + jpeg_info->comp_info[0].v_samp_factor, + jpeg_info->comp_info[1].h_samp_factor, + jpeg_info->comp_info[1].v_samp_factor, + jpeg_info->comp_info[2].h_samp_factor, + jpeg_info->comp_info[2].v_samp_factor, + jpeg_info->comp_info[3].h_samp_factor, + jpeg_info->comp_info[3].v_samp_factor); + break; + } + case JCS_GRAYSCALE: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Colorspace: GRAYSCALE"); + (void) FormatLocaleString(sampling_factor,MaxTextExtent,"%dx%d", + jpeg_info->comp_info[0].h_samp_factor, + jpeg_info->comp_info[0].v_samp_factor); + break; + } + case JCS_RGB: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Colorspace: RGB"); + (void) FormatLocaleString(sampling_factor,MaxTextExtent, + "%dx%d,%dx%d,%dx%d",jpeg_info->comp_info[0].h_samp_factor, + jpeg_info->comp_info[0].v_samp_factor, + jpeg_info->comp_info[1].h_samp_factor, + jpeg_info->comp_info[1].v_samp_factor, + jpeg_info->comp_info[2].h_samp_factor, + jpeg_info->comp_info[2].v_samp_factor); + break; + } + default: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Colorspace: %d", + jpeg_info->out_color_space); + (void) FormatLocaleString(sampling_factor,MaxTextExtent, + "%dx%d,%dx%d,%dx%d,%dx%d",jpeg_info->comp_info[0].h_samp_factor, + jpeg_info->comp_info[0].v_samp_factor, + jpeg_info->comp_info[1].h_samp_factor, + jpeg_info->comp_info[1].v_samp_factor, + jpeg_info->comp_info[2].h_samp_factor, + jpeg_info->comp_info[2].v_samp_factor, + jpeg_info->comp_info[3].h_samp_factor, + jpeg_info->comp_info[3].v_samp_factor); + break; + } + } + (void) SetImageProperty(image,"jpeg:sampling-factor",sampling_factor); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Sampling Factors: %s", + sampling_factor); +} + +static Image *ReadJPEGImage_(const ImageInfo *image_info, + struct jpeg_decompress_struct *jpeg_info,ExceptionInfo *exception) +{ +#define ThrowJPEGReaderException(exception,message) \ +{ \ + if (client_info != (JPEGClientInfo *) NULL) \ + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); \ + ThrowReaderException((exception),(message)); \ +} + + char + value[MaxTextExtent]; + + const char + *dct_method, + *option; + + Image + *image; + + JPEGClientInfo + *client_info = (JPEGClientInfo *) NULL; + + IndexPacket + index; + + JSAMPLE + *volatile jpeg_pixels; + + JSAMPROW + scanline[1]; + + MagickBooleanType + debug, + status; + + MagickSizeType + number_pixels; + + MemoryInfo + *memory_info; + + ssize_t + i; + + struct jpeg_error_mgr + jpeg_error; + + struct jpeg_progress_mgr + jpeg_progress; + + JSAMPLE + *p; + + size_t + units; + + ssize_t + y; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + debug=IsEventLogging(); + (void) debug; + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Verify that file size large enough to contain a JPEG datastream. + */ + if (GetBlobSize(image) < 107) + ThrowJPEGReaderException(CorruptImageError,"InsufficientImageDataInFile"); + /* + Initialize JPEG parameters. + */ + client_info=(JPEGClientInfo *) AcquireMagickMemory(sizeof(*client_info)); + if (client_info == (JPEGClientInfo *) NULL) + ThrowJPEGReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(client_info,0,sizeof(*client_info)); + (void) memset(&jpeg_error,0,sizeof(jpeg_error)); + (void) memset(&jpeg_progress,0,sizeof(jpeg_progress)); + jpeg_info->err=jpeg_std_error(&jpeg_error); + jpeg_info->err->emit_message=(void (*)(j_common_ptr,int)) JPEGWarningHandler; + jpeg_info->err->error_exit=(void (*)(j_common_ptr)) JPEGErrorHandler; + memory_info=(MemoryInfo *) NULL; + client_info->image=image; + if (setjmp(client_info->error_recovery) != 0) + { + jpeg_destroy_decompress(jpeg_info); + if (client_info->profile != (StringInfo *) NULL) + client_info->profile=DestroyStringInfo(client_info->profile); + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); + (void) CloseBlob(image); + if (exception->severity < ErrorException) + return(GetFirstImageInList(image)); + InheritException(exception,&image->exception); + return(DestroyImage(image)); + } + jpeg_info->client_data=(void *) client_info; + jpeg_create_decompress(jpeg_info); + if (GetMaxMemoryRequest() != ~0UL) + jpeg_info->mem->max_memory_to_use=(long) GetMaxMemoryRequest(); + jpeg_progress.progress_monitor=(void (*)(j_common_ptr)) JPEGProgressHandler; + jpeg_info->progress=(&jpeg_progress); + JPEGSourceManager(jpeg_info,image); + jpeg_set_marker_processor(jpeg_info,JPEG_COM,ReadComment); + option=GetImageOption(image_info,"profile:skip"); + if (IsOptionMember("ICC",option) == MagickFalse) + jpeg_set_marker_processor(jpeg_info,ICC_MARKER,ReadICCProfile); + if (IsOptionMember("IPTC",option) == MagickFalse) + jpeg_set_marker_processor(jpeg_info,IPTC_MARKER,ReadIPTCProfile); + for (i=1; i < 16; i++) + if ((i != 2) && (i != 13) && (i != 14)) + if (IsOptionMember("APP",option) == MagickFalse) + jpeg_set_marker_processor(jpeg_info,(int) (JPEG_APP0+i),ReadProfile); + i=(ssize_t) jpeg_read_header(jpeg_info,TRUE); + if (IsYCbCrCompatibleColorspace(image_info->colorspace) != MagickFalse) + jpeg_info->out_color_space=JCS_YCbCr; + /* + Set image resolution. + */ + units=0; + if ((jpeg_info->saw_JFIF_marker != 0) && (jpeg_info->X_density != 1) && + (jpeg_info->Y_density != 1)) + { + image->x_resolution=(double) jpeg_info->X_density; + image->y_resolution=(double) jpeg_info->Y_density; + units=(size_t) jpeg_info->density_unit; + } + if (units == 1) + image->units=PixelsPerInchResolution; + if (units == 2) + image->units=PixelsPerCentimeterResolution; + number_pixels=(MagickSizeType) image->columns*image->rows; + option=GetImageOption(image_info,"jpeg:size"); + if ((option != (const char *) NULL) && + (jpeg_info->out_color_space != JCS_YCbCr)) + { + double + scale_factor; + + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + /* + Scale the image. + */ + flags=ParseGeometry(option,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + jpeg_calc_output_dimensions(jpeg_info); + image->magick_columns=jpeg_info->output_width; + image->magick_rows=jpeg_info->output_height; + scale_factor=1.0; + if (geometry_info.rho != 0.0) + scale_factor=jpeg_info->output_width/geometry_info.rho; + if ((geometry_info.sigma != 0.0) && + (scale_factor > (jpeg_info->output_height/geometry_info.sigma))) + scale_factor=jpeg_info->output_height/geometry_info.sigma; + jpeg_info->scale_num=1U; + jpeg_info->scale_denom=(unsigned int) scale_factor; + jpeg_calc_output_dimensions(jpeg_info); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Scale factor: %.20g",(double) scale_factor); + } +#if (JPEG_LIB_VERSION >= 61) && defined(D_PROGRESSIVE_SUPPORTED) +#if defined(D_LOSSLESS_SUPPORTED) + image->interlace=jpeg_info->process == JPROC_PROGRESSIVE ? + JPEGInterlace : NoInterlace; + image->compression=jpeg_info->process == JPROC_LOSSLESS ? + LosslessJPEGCompression : JPEGCompression; + if (jpeg_info->data_precision > 8) + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "12-bit JPEG not supported. Reducing pixel data to 8 bits","`%s'", + image->filename); + if (jpeg_info->data_precision == 16) + jpeg_info->data_precision=12; +#else + image->interlace=jpeg_info->progressive_mode != 0 ? JPEGInterlace : + NoInterlace; + image->compression=JPEGCompression; +#endif +#else + image->compression=JPEGCompression; + image->interlace=JPEGInterlace; +#endif + option=GetImageOption(image_info,"jpeg:colors"); + if (option != (const char *) NULL) + { + /* + Let the JPEG library quantize for us. + */ + jpeg_info->quantize_colors=TRUE; + jpeg_info->desired_number_of_colors=(int) StringToUnsignedLong(option); + } + option=GetImageOption(image_info,"jpeg:block-smoothing"); + if (option != (const char *) NULL) + jpeg_info->do_block_smoothing=IsStringTrue(option) != MagickFalse ? TRUE : + FALSE; + dct_method=GetImageOption(image_info,"jpeg:dct-method"); + if (dct_method != (const char *) NULL) + switch (*dct_method) + { + case 'D': + case 'd': + { + if (LocaleCompare(dct_method,"default") == 0) + jpeg_info->dct_method=JDCT_DEFAULT; + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(dct_method,"fastest") == 0) + jpeg_info->dct_method=JDCT_FASTEST; + if (LocaleCompare(dct_method,"float") == 0) + jpeg_info->dct_method=JDCT_FLOAT; + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(dct_method,"ifast") == 0) + jpeg_info->dct_method=JDCT_IFAST; + if (LocaleCompare(dct_method,"islow") == 0) + jpeg_info->dct_method=JDCT_ISLOW; + break; + } + } + option=GetImageOption(image_info,"jpeg:fancy-upsampling"); + if (option != (const char *) NULL) + jpeg_info->do_fancy_upsampling=IsStringTrue(option) != MagickFalse ? TRUE : + FALSE; + jpeg_calc_output_dimensions(jpeg_info); + image->columns=jpeg_info->output_width; + image->rows=jpeg_info->output_height; + image->depth=(size_t) jpeg_info->data_precision; + switch (jpeg_info->out_color_space) + { + case JCS_RGB: + default: + { + (void) SetImageColorspace(image,sRGBColorspace); + break; + } + case JCS_GRAYSCALE: + { + (void) SetImageColorspace(image,GRAYColorspace); + break; + } + case JCS_YCbCr: + { + (void) SetImageColorspace(image,YCbCrColorspace); + break; + } + case JCS_CMYK: + { + (void) SetImageColorspace(image,CMYKColorspace); + break; + } + } + if (IsITUFaxImage(image) != MagickFalse) + { + (void) SetImageColorspace(image,LabColorspace); + jpeg_info->out_color_space=JCS_YCbCr; + } + option=GetImageOption(image_info,"jpeg:colors"); + if (option != (const char *) NULL) + if (AcquireImageColormap(image,StringToUnsignedLong(option)) == MagickFalse) + { + jpeg_destroy_decompress(jpeg_info); + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if ((jpeg_info->output_components == 1) && (jpeg_info->quantize_colors == 0)) + { + size_t + colors; + + colors=(size_t) GetQuantumRange(image->depth)+1; + if (AcquireImageColormap(image,colors) == MagickFalse) + { + jpeg_destroy_decompress(jpeg_info); + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + } + if (image->debug != MagickFalse) + { + if (image->interlace != NoInterlace) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Interlace: progressive"); + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Interlace: nonprogressive"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Data precision: %d", + (int) jpeg_info->data_precision); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Geometry: %dx%d", + (int) jpeg_info->output_width,(int) jpeg_info->output_height); + } + JPEGSetImageQuality(jpeg_info,image); + JPEGSetImageSamplingFactor(jpeg_info,image); + (void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double) + jpeg_info->out_color_space); + (void) SetImageProperty(image,"jpeg:colorspace",value); + if (image_info->ping != MagickFalse) + { + jpeg_destroy_decompress(jpeg_info); + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + jpeg_destroy_decompress(jpeg_info); + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) jpeg_start_decompress(jpeg_info); + if ((jpeg_info->output_components != 1) && + (jpeg_info->output_components != 3) && (jpeg_info->output_components != 4)) + { + jpeg_destroy_decompress(jpeg_info); + ThrowJPEGReaderException(CorruptImageError,"ImageTypeNotSupported"); + } + memory_info=AcquireVirtualMemory((size_t) image->columns, + jpeg_info->output_components*sizeof(*jpeg_pixels)); + if (memory_info == (MemoryInfo *) NULL) + { + jpeg_destroy_decompress(jpeg_info); + ThrowJPEGReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + jpeg_pixels=(JSAMPLE *) GetVirtualMemoryBlob(memory_info); + (void) memset(jpeg_pixels,0,image->columns*jpeg_info->output_components* + sizeof(*jpeg_pixels)); + /* + Convert JPEG pixels to pixel packets. + */ + if (setjmp(client_info->error_recovery) != 0) + { + if (memory_info != (MemoryInfo *) NULL) + memory_info=RelinquishVirtualMemory(memory_info); + jpeg_destroy_decompress(jpeg_info); + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); + (void) CloseBlob(image); + number_pixels=(MagickSizeType) image->columns*image->rows; + if (number_pixels != 0) + return(GetFirstImageInList(image)); + return(DestroyImage(image)); + } + if (jpeg_info->quantize_colors != 0) + { + image->colors=(size_t) jpeg_info->actual_number_of_colors; + if (jpeg_info->out_color_space == JCS_GRAYSCALE) + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=ScaleCharToQuantum(jpeg_info->colormap[0][i]); + image->colormap[i].green=image->colormap[i].red; + image->colormap[i].blue=image->colormap[i].red; + image->colormap[i].opacity=OpaqueOpacity; + } + else + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=ScaleCharToQuantum(jpeg_info->colormap[0][i]); + image->colormap[i].green=ScaleCharToQuantum(jpeg_info->colormap[1][i]); + image->colormap[i].blue=ScaleCharToQuantum(jpeg_info->colormap[2][i]); + image->colormap[i].opacity=OpaqueOpacity; + } + } + scanline[0]=(JSAMPROW) jpeg_pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict q; + + if (jpeg_read_scanlines(jpeg_info,scanline,1) != 1) + { + (void) ThrowMagickException(exception,GetMagickModule(), + CorruptImageWarning,"SkipToSyncByte","`%s'",image->filename); + continue; + } + p=jpeg_pixels; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + if (jpeg_info->data_precision > 8) + { + unsigned short + scale; + + scale=65535/(unsigned short) GetQuantumRange((size_t) + jpeg_info->data_precision); + if (jpeg_info->output_components == 1) + for (x=0; x < (ssize_t) image->columns; x++) + { + ssize_t + pixel; + + pixel=(ssize_t) (scale*GETJSAMPLE(*p)); + index=ConstrainColormapIndex(image,pixel); + SetPixelIndex(indexes+x,index); + SetPixelRGBO(q,image->colormap+(ssize_t) index); + p++; + q++; + } + else + if (image->colorspace != CMYKColorspace) + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleShortToQuantum((unsigned short) + (scale*GETJSAMPLE(*p++)))); + SetPixelGreen(q,ScaleShortToQuantum((unsigned short) + (scale*GETJSAMPLE(*p++)))); + SetPixelBlue(q,ScaleShortToQuantum((unsigned short) + (scale*GETJSAMPLE(*p++)))); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + else + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelCyan(q,QuantumRange-ScaleShortToQuantum( + (unsigned short) (scale*GETJSAMPLE(*p++)))); + SetPixelMagenta(q,QuantumRange-ScaleShortToQuantum( + (unsigned short) (scale*GETJSAMPLE(*p++)))); + SetPixelYellow(q,QuantumRange-ScaleShortToQuantum( + (unsigned short) (scale*GETJSAMPLE(*p++)))); + SetPixelBlack(indexes+x,QuantumRange-ScaleShortToQuantum( + (unsigned short) (scale*GETJSAMPLE(*p++)))); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + } + else + if (jpeg_info->output_components == 1) + for (x=0; x < (ssize_t) image->columns; x++) + { + ssize_t + pixel; + + pixel=(size_t) GETJSAMPLE(*p); + index=ConstrainColormapIndex(image,pixel); + SetPixelIndex(indexes+x,index); + SetPixelRGBO(q,image->colormap+(ssize_t) index); + p++; + q++; + } + else + if (image->colorspace != CMYKColorspace) + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum((unsigned char) + GETJSAMPLE(*p++))); + SetPixelGreen(q,ScaleCharToQuantum((unsigned char) + GETJSAMPLE(*p++))); + SetPixelBlue(q,ScaleCharToQuantum((unsigned char) + GETJSAMPLE(*p++))); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + else + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelCyan(q,QuantumRange-ScaleCharToQuantum((unsigned char) + GETJSAMPLE(*p++))); + SetPixelMagenta(q,QuantumRange-ScaleCharToQuantum((unsigned char) + GETJSAMPLE(*p++))); + SetPixelYellow(q,QuantumRange-ScaleCharToQuantum((unsigned char) + GETJSAMPLE(*p++))); + SetPixelBlack(indexes+x,QuantumRange-ScaleCharToQuantum( + (unsigned char) GETJSAMPLE(*p++))); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + { + jpeg_abort_decompress(jpeg_info); + break; + } + } + if (status != MagickFalse) + { + client_info->finished=MagickTrue; + if (setjmp(client_info->error_recovery) == 0) + (void) jpeg_finish_decompress(jpeg_info); + } + /* + Free jpeg resources. + */ + jpeg_destroy_decompress(jpeg_info); + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); + memory_info=RelinquishVirtualMemory(memory_info); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +static Image *ReadJPEGImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + struct jpeg_decompress_struct + jpeg_info; + + return(ReadJPEGImage_(image_info,&jpeg_info,exception)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r J P E G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterJPEGImage() adds properties for the JPEG image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterJPEGImage method is: +% +% size_t RegisterJPEGImage(void) +% +*/ +ModuleExport size_t RegisterJPEGImage(void) +{ +#define JPEGDescription "Joint Photographic Experts Group JFIF format" +#define JPEGStringify(macro_or_string) JPEGStringifyArg(macro_or_string) +#define JPEGStringifyArg(contents) #contents + + char + version[MaxTextExtent]; + + MagickInfo + *entry; + + *version='\0'; +#if defined(LIBJPEG_TURBO_VERSION) + (void) CopyMagickString(version,"libjpeg-turbo " JPEGStringify( + LIBJPEG_TURBO_VERSION),MagickPathExtent); +#elif defined(JPEG_LIB_VERSION) + (void) FormatLocaleString(version,MagickPathExtent,"libjpeg %d", + JPEG_LIB_VERSION); +#endif + entry=SetMagickInfo("JPE"); +#if (JPEG_LIB_VERSION < 80) && !defined(LIBJPEG_TURBO_VERSION) + entry->thread_support=NoThreadSupport; +#endif +#if defined(MAGICKCORE_JPEG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJPEGImage; + entry->encoder=(EncodeImageHandler *) WriteJPEGImage; +#endif + entry->magick=(IsImageFormatHandler *) IsJPEG; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString(JPEGDescription); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jpeg"); + entry->magick_module=ConstantString("JPEG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("JPEG"); +#if (JPEG_LIB_VERSION < 80) && !defined(LIBJPEG_TURBO_VERSION) + entry->thread_support=NoThreadSupport; +#endif +#if defined(MAGICKCORE_JPEG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJPEGImage; + entry->encoder=(EncodeImageHandler *) WriteJPEGImage; +#endif + entry->magick=(IsImageFormatHandler *) IsJPEG; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString(JPEGDescription); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jpeg"); + entry->magick_module=ConstantString("JPEG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("JPG"); +#if (JPEG_LIB_VERSION < 80) && !defined(LIBJPEG_TURBO_VERSION) + entry->thread_support=NoThreadSupport; +#endif +#if defined(MAGICKCORE_JPEG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJPEGImage; + entry->encoder=(EncodeImageHandler *) WriteJPEGImage; +#endif + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString(JPEGDescription); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jpeg"); + entry->magick_module=ConstantString("JPEG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("JPS"); +#if (JPEG_LIB_VERSION < 80) && !defined(LIBJPEG_TURBO_VERSION) + entry->thread_support=NoThreadSupport; +#endif +#if defined(MAGICKCORE_JPEG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJPEGImage; + entry->encoder=(EncodeImageHandler *) WriteJPEGImage; +#endif + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString(JPEGDescription); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jpeg"); + entry->magick_module=ConstantString("JPEG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PJPEG"); +#if (JPEG_LIB_VERSION < 80) && !defined(LIBJPEG_TURBO_VERSION) + entry->thread_support=NoThreadSupport; +#endif +#if defined(MAGICKCORE_JPEG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJPEGImage; + entry->encoder=(EncodeImageHandler *) WriteJPEGImage; +#endif + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString(JPEGDescription); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/jpeg"); + entry->magick_module=ConstantString("JPEG"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r J P E G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterJPEGImage() removes format registrations made by the +% JPEG module from the list of supported formats. +% +% The format of the UnregisterJPEGImage method is: +% +% UnregisterJPEGImage(void) +% +*/ +ModuleExport void UnregisterJPEGImage(void) +{ + (void) UnregisterMagickInfo("PJPG"); + (void) UnregisterMagickInfo("JPS"); + (void) UnregisterMagickInfo("JPG"); + (void) UnregisterMagickInfo("JPG"); + (void) UnregisterMagickInfo("JPEG"); + (void) UnregisterMagickInfo("JPE"); +} + +#if defined(MAGICKCORE_JPEG_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e J P E G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteJPEGImage() writes a JPEG image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the WriteJPEGImage method is: +% +% MagickBooleanType WriteJPEGImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o jpeg_image: The image. +% +% +*/ + +static QuantizationTable *DestroyQuantizationTable(QuantizationTable *table) +{ + assert(table != (QuantizationTable *) NULL); + if (table->slot != (char *) NULL) + table->slot=DestroyString(table->slot); + if (table->description != (char *) NULL) + table->description=DestroyString(table->description); + if (table->levels != (unsigned int *) NULL) + table->levels=(unsigned int *) RelinquishMagickMemory(table->levels); + table=(QuantizationTable *) RelinquishMagickMemory(table); + return(table); +} + +static boolean EmptyOutputBuffer(j_compress_ptr compress_info) +{ + DestinationManager + *destination; + + destination=(DestinationManager *) compress_info->dest; + destination->manager.free_in_buffer=(size_t) WriteBlob(destination->image, + MagickMinBufferExtent,destination->buffer); + if (destination->manager.free_in_buffer != MagickMinBufferExtent) + ERREXIT(compress_info,JERR_FILE_WRITE); + destination->manager.next_output_byte=destination->buffer; + return(TRUE); +} + +static QuantizationTable *GetQuantizationTable(const char *filename, + const char *slot,ExceptionInfo *exception) +{ + char + *p, + *xml; + + const char + *attribute, + *content; + + double + value; + + ssize_t + i; + + QuantizationTable + *table; + + size_t + length; + + ssize_t + j; + + XMLTreeInfo + *description, + *levels, + *quantization_tables, + *table_iterator; + + (void) LogMagickEvent(ConfigureEvent,GetMagickModule(), + "Loading quantization tables \"%s\" ...",filename); + table=(QuantizationTable *) NULL; + xml=FileToString(filename,~0UL,exception); + if (xml == (char *) NULL) + return(table); + quantization_tables=NewXMLTree(xml,exception); + if (quantization_tables == (XMLTreeInfo *) NULL) + { + xml=DestroyString(xml); + return(table); + } + for (table_iterator=GetXMLTreeChild(quantization_tables,"table"); + table_iterator != (XMLTreeInfo *) NULL; + table_iterator=GetNextXMLTreeTag(table_iterator)) + { + attribute=GetXMLTreeAttribute(table_iterator,"slot"); + if ((attribute != (char *) NULL) && (LocaleCompare(slot,attribute) == 0)) + break; + attribute=GetXMLTreeAttribute(table_iterator,"alias"); + if ((attribute != (char *) NULL) && (LocaleCompare(slot,attribute) == 0)) + break; + } + if (table_iterator == (XMLTreeInfo *) NULL) + { + xml=DestroyString(xml); + return(table); + } + description=GetXMLTreeChild(table_iterator,"description"); + if (description == (XMLTreeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "XmlMissingElement",", slot \"%s\"",slot); + quantization_tables=DestroyXMLTree(quantization_tables); + xml=DestroyString(xml); + return(table); + } + levels=GetXMLTreeChild(table_iterator,"levels"); + if (levels == (XMLTreeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "XmlMissingElement",", slot \"%s\"",slot); + quantization_tables=DestroyXMLTree(quantization_tables); + xml=DestroyString(xml); + return(table); + } + table=(QuantizationTable *) AcquireMagickMemory(sizeof(*table)); + if (table == (QuantizationTable *) NULL) + ThrowFatalException(ResourceLimitFatalError, + "UnableToAcquireQuantizationTable"); + table->slot=(char *) NULL; + table->description=(char *) NULL; + table->levels=(unsigned int *) NULL; + attribute=GetXMLTreeAttribute(table_iterator,"slot"); + if (attribute != (char *) NULL) + table->slot=ConstantString(attribute); + content=GetXMLTreeContent(description); + if (content != (char *) NULL) + table->description=ConstantString(content); + attribute=GetXMLTreeAttribute(levels,"width"); + if (attribute == (char *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "XmlMissingAttribute",", slot \"%s\"",slot); + quantization_tables=DestroyXMLTree(quantization_tables); + table=DestroyQuantizationTable(table); + xml=DestroyString(xml); + return(table); + } + table->width=StringToUnsignedLong(attribute); + if (table->width == 0) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "XmlInvalidAttribute",", table \"%s\"",slot); + quantization_tables=DestroyXMLTree(quantization_tables); + table=DestroyQuantizationTable(table); + xml=DestroyString(xml); + return(table); + } + attribute=GetXMLTreeAttribute(levels,"height"); + if (attribute == (char *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "XmlMissingAttribute",", table \"%s\"",slot); + quantization_tables=DestroyXMLTree(quantization_tables); + table=DestroyQuantizationTable(table); + xml=DestroyString(xml); + return(table); + } + table->height=StringToUnsignedLong(attribute); + if (table->height == 0) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "XmlInvalidAttribute",", table \"%s\"",slot); + quantization_tables=DestroyXMLTree(quantization_tables); + table=DestroyQuantizationTable(table); + xml=DestroyString(xml); + return(table); + } + attribute=GetXMLTreeAttribute(levels,"divisor"); + if (attribute == (char *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "XmlMissingAttribute",", table \"%s\"",slot); + quantization_tables=DestroyXMLTree(quantization_tables); + table=DestroyQuantizationTable(table); + xml=DestroyString(xml); + return(table); + } + table->divisor=InterpretLocaleValue(attribute,(char **) NULL); + if (table->divisor == 0.0) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "XmlInvalidAttribute",", table \"%s\"",slot); + quantization_tables=DestroyXMLTree(quantization_tables); + table=DestroyQuantizationTable(table); + xml=DestroyString(xml); + return(table); + } + content=GetXMLTreeContent(levels); + if (content == (char *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "XmlMissingContent",", table \"%s\"",slot); + quantization_tables=DestroyXMLTree(quantization_tables); + table=DestroyQuantizationTable(table); + xml=DestroyString(xml); + return(table); + } + length=(size_t) table->width*table->height; + if (length < 64) + length=64; + table->levels=(unsigned int *) AcquireQuantumMemory(length, + sizeof(*table->levels)); + if (table->levels == (unsigned int *) NULL) + ThrowFatalException(ResourceLimitFatalError, + "UnableToAcquireQuantizationTable"); + for (i=0; i < (ssize_t) (table->width*table->height); i++) + { + table->levels[i]=(unsigned int) (InterpretLocaleValue(content,&p)/ + table->divisor+0.5); + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == ',') + p++; + content=p; + } + value=InterpretLocaleValue(content,&p); + (void) value; + if (p != content) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "XmlInvalidContent"," too many values, table \"%s\"",slot); + quantization_tables=DestroyXMLTree(quantization_tables); + table=DestroyQuantizationTable(table); + xml=DestroyString(xml); + return(table); + } + for (j=i; j < 64; j++) + table->levels[j]=table->levels[j-1]; + quantization_tables=DestroyXMLTree(quantization_tables); + xml=DestroyString(xml); + return(table); +} + +static void InitializeDestination(j_compress_ptr compress_info) +{ + DestinationManager + *destination; + + destination=(DestinationManager *) compress_info->dest; + destination->buffer=(JOCTET *) (*compress_info->mem->alloc_small) + ((j_common_ptr) compress_info,JPOOL_IMAGE,MagickMinBufferExtent* + sizeof(JOCTET)); + destination->manager.next_output_byte=destination->buffer; + destination->manager.free_in_buffer=MagickMinBufferExtent; +} + +static void TerminateDestination(j_compress_ptr compress_info) +{ + DestinationManager + *destination; + + destination=(DestinationManager *) compress_info->dest; + if ((MagickMinBufferExtent-(int) destination->manager.free_in_buffer) > 0) + { + ssize_t + count; + + count=WriteBlob(destination->image,MagickMinBufferExtent- + destination->manager.free_in_buffer,destination->buffer); + if (count != (ssize_t) + (MagickMinBufferExtent-destination->manager.free_in_buffer)) + ERREXIT(compress_info,JERR_FILE_WRITE); + } +} + +static void WriteProfiles(j_compress_ptr jpeg_info,Image *image) +{ + const char + *name; + + const StringInfo + *profile; + + MagickBooleanType + iptc; + + ssize_t + i; + + size_t + length, + tag_length; + + StringInfo + *custom_profile; + + /* + Save image profile as a APP marker. + */ + iptc=MagickFalse; + custom_profile=AcquireStringInfo(65535L); + ResetImageProfileIterator(image); + for (name=GetNextImageProfile(image); name != (const char *) NULL; ) + { + unsigned char + *p; + + profile=GetImageProfile(image,name); + p=GetStringInfoDatum(custom_profile); + length=GetStringInfoLength(profile); + if (LocaleNCompare(name,"APP",3) == 0) + { + int + id; + + id=JPEG_APP0+StringToInteger(name+3); + for (i=0; i < (ssize_t) length; i+=65533L) + jpeg_write_marker(jpeg_info,id,GetStringInfoDatum(profile)+i, + (unsigned int) MagickMin(length-i,65533)); + } + if (LocaleCompare(name,"EXIF") == 0) + { + length=GetStringInfoLength(profile); + if (length > 65533L) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CoderWarning,"ExifProfileSizeExceedsLimit","`%s'", + image->filename); + length=65533L; + } + jpeg_write_marker(jpeg_info,XML_MARKER,GetStringInfoDatum(profile), + (unsigned int) length); + } + if (LocaleCompare(name,"ICC") == 0) + { + unsigned char + *p; + + tag_length=strlen(ICC_PROFILE); + p=GetStringInfoDatum(custom_profile); + (void) memcpy(p,ICC_PROFILE,tag_length); + p[tag_length]='\0'; + for (i=0; i < (ssize_t) GetStringInfoLength(profile); i+=65519L) + { + length=MagickMin(GetStringInfoLength(profile)-i,65519L); + p[12]=(unsigned char) ((i/65519L)+1); + p[13]=(unsigned char) (GetStringInfoLength(profile)/65519L+1); + (void) memcpy(p+tag_length+3,GetStringInfoDatum(profile)+i, + length); + jpeg_write_marker(jpeg_info,ICC_MARKER,GetStringInfoDatum( + custom_profile),(unsigned int) (length+tag_length+3)); + } + } + if (((LocaleCompare(name,"IPTC") == 0) || + (LocaleCompare(name,"8BIM") == 0)) && (iptc == MagickFalse)) + { + size_t + roundup; + + iptc=MagickTrue; + for (i=0; i < (ssize_t) GetStringInfoLength(profile); i+=65500L) + { + length=MagickMin(GetStringInfoLength(profile)-i,65500L); + roundup=(size_t) (length & 0x01); + if (LocaleNCompare((char *) GetStringInfoDatum(profile),"8BIM",4) == 0) + { + (void) memcpy(p,"Photoshop 3.0 ",14); + tag_length=14; + } + else + { + (void) memcpy(p,"Photoshop 3.0 8BIM\04\04\0\0\0\0",24); + tag_length=26; + p[24]=(unsigned char) (length >> 8); + p[25]=(unsigned char) (length & 0xff); + } + p[13]=0x00; + (void) memcpy(p+tag_length,GetStringInfoDatum(profile)+i,length); + if (roundup != 0) + p[length+tag_length]='\0'; + jpeg_write_marker(jpeg_info,IPTC_MARKER,GetStringInfoDatum( + custom_profile),(unsigned int) (length+tag_length+roundup)); + } + } + if ((LocaleCompare(name,"XMP") == 0) && + (GetStringInfoLength(profile) < (65533 - sizeof(xmp_namespace)))) + { + StringInfo + *xmp_profile; + + /* + Add namespace to XMP profile. + */ + xmp_profile=StringToStringInfo(xmp_namespace); + if (xmp_profile != (StringInfo *) NULL) + { + ConcatenateStringInfo(xmp_profile,profile); + GetStringInfoDatum(xmp_profile)[XMPNamespaceExtent]='\0'; + length=GetStringInfoLength(xmp_profile); + jpeg_write_marker(jpeg_info,XML_MARKER, + GetStringInfoDatum(xmp_profile),(unsigned int) length); + xmp_profile=DestroyStringInfo(xmp_profile); + } + } + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "%s profile: %.20g bytes",name,(double) GetStringInfoLength(profile)); + name=GetNextImageProfile(image); + } + custom_profile=DestroyStringInfo(custom_profile); +} + +static void JPEGDestinationManager(j_compress_ptr compress_info,Image * image) +{ + DestinationManager + *destination; + + compress_info->dest=(struct jpeg_destination_mgr *) (* + compress_info->mem->alloc_small) ((j_common_ptr) compress_info,JPOOL_IMAGE, + sizeof(DestinationManager)); + destination=(DestinationManager *) compress_info->dest; + destination->manager.init_destination=InitializeDestination; + destination->manager.empty_output_buffer=EmptyOutputBuffer; + destination->manager.term_destination=TerminateDestination; + destination->image=image; +} + +static char **SamplingFactorToList(const char *text) +{ + char + **textlist; + + char + *q; + + const char + *p; + + ssize_t + i; + + if (text == (char *) NULL) + return((char **) NULL); + /* + Convert string to an ASCII list. + */ + textlist=(char **) AcquireQuantumMemory((size_t) MAX_COMPONENTS, + sizeof(*textlist)); + if (textlist == (char **) NULL) + ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText"); + p=text; + for (i=0; i < (ssize_t) MAX_COMPONENTS; i++) + { + for (q=(char *) p; *q != '\0'; q++) + if (*q == ',') + break; + textlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent, + sizeof(*textlist[i])); + if (textlist[i] == (char *) NULL) + ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText"); + (void) CopyMagickString(textlist[i],p,(size_t) (q-p+1)); + if (*q == '\r') + q++; + if (*q == '\0') + break; + p=q+1; + } + for (i++; i < (ssize_t) MAX_COMPONENTS; i++) + textlist[i]=ConstantString("1x1"); + return(textlist); +} + +static MagickBooleanType WriteJPEGImage_(const ImageInfo *image_info, + Image *image,struct jpeg_compress_struct *jpeg_info) +{ +#define ThrowJPEGWriterException(exception,message) \ +{ \ + if (client_info != (JPEGClientInfo *) NULL) \ + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); \ + ThrowWriterException((exception),(message)); \ +} + + const char + *dct_method, + *option, + *sampling_factor, + *value; + + ExceptionInfo + *exception; + + Image + *volatile volatile_image; + + int + colorspace, + quality; + + JPEGClientInfo + *client_info = (JPEGClientInfo *) NULL; + + JSAMPLE + *volatile jpeg_pixels; + + JSAMPROW + scanline[1]; + + MagickBooleanType + status; + + MemoryInfo + *memory_info; + + JSAMPLE + *q; + + ssize_t + i; + + ssize_t + y; + + struct jpeg_error_mgr + jpeg_error; + + unsigned short + scale; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=(&image->exception); + if ((LocaleCompare(image_info->magick,"JPS") == 0) && + (image->next != (Image *) NULL)) + image=AppendImages(image,MagickFalse,exception); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); + if (status == MagickFalse) + return(status); + /* + Initialize JPEG parameters. + */ + client_info=(JPEGClientInfo *) AcquireMagickMemory(sizeof(*client_info)); + if (client_info == (JPEGClientInfo *) NULL) + ThrowJPEGWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(client_info,0,sizeof(*client_info)); + (void) memset(jpeg_info,0,sizeof(*jpeg_info)); + (void) memset(&jpeg_error,0,sizeof(jpeg_error)); + volatile_image=image; + jpeg_info->client_data=(void *) volatile_image; + jpeg_info->err=jpeg_std_error(&jpeg_error); + jpeg_info->err->emit_message=(void (*)(j_common_ptr,int)) JPEGWarningHandler; + jpeg_info->err->error_exit=(void (*)(j_common_ptr)) JPEGErrorHandler; + client_info->image=volatile_image; + memory_info=(MemoryInfo *) NULL; + if (setjmp(client_info->error_recovery) != 0) + { + jpeg_destroy_compress(jpeg_info); + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); + (void) CloseBlob(volatile_image); + return(MagickFalse); + } + jpeg_info->client_data=(void *) client_info; + jpeg_create_compress(jpeg_info); + JPEGDestinationManager(jpeg_info,image); + if ((image->columns != (unsigned int) image->columns) || + (image->rows != (unsigned int) image->rows)) + ThrowJPEGWriterException(ImageError,"WidthOrHeightExceedsLimit"); + jpeg_info->image_width=(unsigned int) image->columns; + jpeg_info->image_height=(unsigned int) image->rows; + jpeg_info->input_components=3; + jpeg_info->data_precision=8; + jpeg_info->in_color_space=JCS_RGB; + switch (image->colorspace) + { + case CMYKColorspace: + { + jpeg_info->input_components=4; + jpeg_info->in_color_space=JCS_CMYK; + break; + } + case YCbCrColorspace: + case Rec601YCbCrColorspace: + case Rec709YCbCrColorspace: + { + jpeg_info->in_color_space=JCS_YCbCr; + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + case Rec601LumaColorspace: + case Rec709LumaColorspace: + { + if (image_info->type == TrueColorType) + break; + jpeg_info->input_components=1; + jpeg_info->in_color_space=JCS_GRAYSCALE; + break; + } + default: + { + ImageType + type; + + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + if (image_info->type == TrueColorType) + break; + type=IdentifyImageType(image,&image->exception); + if ((type == GrayscaleType) || (type == BilevelType)) + { + jpeg_info->input_components=1; + jpeg_info->in_color_space=JCS_GRAYSCALE; + } + break; + } + } + jpeg_set_defaults(jpeg_info); + if (jpeg_info->in_color_space == JCS_CMYK) + jpeg_set_colorspace(jpeg_info,JCS_YCCK); + if ((jpeg_info->data_precision != 12) && (image->depth <= 8)) + jpeg_info->data_precision=8; + else + jpeg_info->data_precision=BITS_IN_JSAMPLE; + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Image resolution: %.20g,%.20g",image->x_resolution,image->y_resolution); + if ((image->x_resolution != 0.0) && (image->y_resolution != 0.0)) + { + /* + Set image resolution. + */ + jpeg_info->write_JFIF_header=TRUE; + jpeg_info->X_density=(UINT16) image->x_resolution; + jpeg_info->Y_density=(UINT16) image->y_resolution; + /* + Set image resolution units. + */ + if (image->units == PixelsPerInchResolution) + jpeg_info->density_unit=(UINT8) 1; + if (image->units == PixelsPerCentimeterResolution) + jpeg_info->density_unit=(UINT8) 2; + } + dct_method=GetImageOption(image_info,"jpeg:dct-method"); + if (dct_method != (const char *) NULL) + switch (*dct_method) + { + case 'D': + case 'd': + { + if (LocaleCompare(dct_method,"default") == 0) + jpeg_info->dct_method=JDCT_DEFAULT; + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(dct_method,"fastest") == 0) + jpeg_info->dct_method=JDCT_FASTEST; + if (LocaleCompare(dct_method,"float") == 0) + jpeg_info->dct_method=JDCT_FLOAT; + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(dct_method,"ifast") == 0) + jpeg_info->dct_method=JDCT_IFAST; + if (LocaleCompare(dct_method,"islow") == 0) + jpeg_info->dct_method=JDCT_ISLOW; + break; + } + } + option=GetImageOption(image_info,"jpeg:optimize-coding"); + if (option != (const char *) NULL) + jpeg_info->optimize_coding=IsStringTrue(option) != MagickFalse ? TRUE : + FALSE; + else + { + MagickSizeType + length; + + length=(MagickSizeType) jpeg_info->input_components*image->columns* + image->rows*sizeof(JSAMPLE); + if (length == (MagickSizeType) ((size_t) length)) + { + /* + Perform optimization only if available memory resources permit it. + */ + status=AcquireMagickResource(MemoryResource,length); + if (status != MagickFalse) + RelinquishMagickResource(MemoryResource,length); + jpeg_info->optimize_coding=status == MagickFalse ? FALSE : TRUE; + } + } +#if (JPEG_LIB_VERSION >= 61) && defined(C_PROGRESSIVE_SUPPORTED) + if ((LocaleCompare(image_info->magick,"PJPEG") == 0) || + (image_info->interlace != NoInterlace)) + { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Interlace: progressive"); + jpeg_simple_progression(jpeg_info); + } + else + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Interlace: non-progressive"); +#else + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Interlace: nonprogressive"); +#endif + quality=92; + if ((image_info->compression != LosslessJPEGCompression) && + (image->quality <= 100)) + { + if (image->quality != UndefinedCompressionQuality) + quality=(int) image->quality; + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Quality: %.20g", + (double) image->quality); + } + else + { +#if !defined(C_LOSSLESS_SUPPORTED) + quality=100; + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Quality: 100"); +#else + if (image->quality < 100) + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CoderWarning,"LosslessToLossyJPEGConversion","`%s'",image->filename); + else + { + int + point_transform, + predictor; + + predictor=image->quality/100; /* range 1-7 */ + point_transform=image->quality % 20; /* range 0-15 */ + jpeg_simple_lossless(jpeg_info,predictor,point_transform); + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Compression: lossless"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Predictor: %d",predictor); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Point Transform: %d",point_transform); + } + } +#endif + } + option=GetImageOption(image_info,"jpeg:extent"); + if (option != (const char *) NULL) + { + Image + *jpeg_image; + + ImageInfo + *jpeg_info; + + jpeg_info=CloneImageInfo(image_info); + jpeg_info->blob=NULL; + jpeg_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (jpeg_image != (Image *) NULL) + { + MagickSizeType + extent; + + size_t + maximum, + minimum; + + /* + Search for compression quality that does not exceed image extent. + */ + jpeg_image->quality=0; + extent=(MagickSizeType) SiPrefixToDoubleInterval(option,100.0); + (void) DeleteImageOption(jpeg_info,"jpeg:extent"); + (void) DeleteImageArtifact(jpeg_image,"jpeg:extent"); + maximum=image_info->quality; + if (maximum < 2) + maximum=101; + for (minimum=2; minimum < maximum; ) + { + (void) AcquireUniqueFilename(jpeg_image->filename); + jpeg_image->quality=minimum+(maximum-minimum+1)/2; + (void) WriteJPEGImage(jpeg_info,jpeg_image); + if (GetBlobSize(jpeg_image) <= extent) + minimum=jpeg_image->quality+1; + else + maximum=jpeg_image->quality-1; + (void) RelinquishUniqueFileResource(jpeg_image->filename); + } + quality=(int) minimum-1; + jpeg_image=DestroyImage(jpeg_image); + } + jpeg_info=DestroyImageInfo(jpeg_info); + } + jpeg_set_quality(jpeg_info,quality,TRUE); + if ((dct_method == (const char *) NULL) && (quality <= 90)) + jpeg_info->dct_method=JDCT_IFAST; +#if (JPEG_LIB_VERSION >= 70) + option=GetImageOption(image_info,"quality"); + if (option != (const char *) NULL) + { + GeometryInfo + geometry_info; + + int + flags; + + /* + Set quality scaling for luminance and chrominance separately. + */ + flags=ParseGeometry(option,&geometry_info); + if (((flags & RhoValue) != 0) && ((flags & SigmaValue) != 0)) + { + jpeg_info->q_scale_factor[0]=jpeg_quality_scaling((int) + (geometry_info.rho+0.5)); + jpeg_info->q_scale_factor[1]=jpeg_quality_scaling((int) + (geometry_info.sigma+0.5)); + jpeg_default_qtables(jpeg_info,TRUE); + } + } +#endif + colorspace=jpeg_info->in_color_space; + value=GetImageOption(image_info,"jpeg:colorspace"); + if (value == (char *) NULL) + value=GetImageProperty(image,"jpeg:colorspace"); + if (value != (char *) NULL) + colorspace=StringToInteger(value); + sampling_factor=(const char *) NULL; + if ((J_COLOR_SPACE) colorspace == jpeg_info->in_color_space) + { + value=GetImageOption(image_info,"jpeg:sampling-factor"); + if (value == (char *) NULL) + value=GetImageProperty(image,"jpeg:sampling-factor"); + if (value != (char *) NULL) + { + sampling_factor=value; + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Input sampling-factors=%s",sampling_factor); + } + } + if (image_info->sampling_factor != (char *) NULL) + sampling_factor=image_info->sampling_factor; + if (sampling_factor == (const char *) NULL) + { + if (quality >= 90) + for (i=0; i < MAX_COMPONENTS; i++) + { + jpeg_info->comp_info[i].h_samp_factor=1; + jpeg_info->comp_info[i].v_samp_factor=1; + } + } + else + { + char + **factors; + + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + /* + Set sampling factor. + */ + i=0; + factors=SamplingFactorToList(sampling_factor); + if (factors != (char **) NULL) + { + for (i=0; i < MAX_COMPONENTS; i++) + { + if (factors[i] == (char *) NULL) + break; + flags=ParseGeometry(factors[i],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + jpeg_info->comp_info[i].h_samp_factor=(int) geometry_info.rho; + jpeg_info->comp_info[i].v_samp_factor=(int) geometry_info.sigma; + factors[i]=(char *) RelinquishMagickMemory(factors[i]); + } + factors=(char **) RelinquishMagickMemory(factors); + } + for ( ; i < MAX_COMPONENTS; i++) + { + jpeg_info->comp_info[i].h_samp_factor=1; + jpeg_info->comp_info[i].v_samp_factor=1; + } + } + option=GetImageOption(image_info,"jpeg:q-table"); + if (option != (const char *) NULL) + { + QuantizationTable + *table; + + /* + Custom quantization tables. + */ + table=GetQuantizationTable(option,"0",&image->exception); + if (table != (QuantizationTable *) NULL) + { + for (i=0; i < MAX_COMPONENTS; i++) + jpeg_info->comp_info[i].quant_tbl_no=0; + jpeg_add_quant_table(jpeg_info,0,table->levels, + jpeg_quality_scaling(quality),0); + table=DestroyQuantizationTable(table); + } + table=GetQuantizationTable(option,"1",&image->exception); + if (table != (QuantizationTable *) NULL) + { + for (i=1; i < MAX_COMPONENTS; i++) + jpeg_info->comp_info[i].quant_tbl_no=1; + jpeg_add_quant_table(jpeg_info,1,table->levels, + jpeg_quality_scaling(quality),0); + table=DestroyQuantizationTable(table); + } + table=GetQuantizationTable(option,"2",&image->exception); + if (table != (QuantizationTable *) NULL) + { + for (i=2; i < MAX_COMPONENTS; i++) + jpeg_info->comp_info[i].quant_tbl_no=2; + jpeg_add_quant_table(jpeg_info,2,table->levels, + jpeg_quality_scaling(quality),0); + table=DestroyQuantizationTable(table); + } + table=GetQuantizationTable(option,"3",&image->exception); + if (table != (QuantizationTable *) NULL) + { + for (i=3; i < MAX_COMPONENTS; i++) + jpeg_info->comp_info[i].quant_tbl_no=3; + jpeg_add_quant_table(jpeg_info,3,table->levels, + jpeg_quality_scaling(quality),0); + table=DestroyQuantizationTable(table); + } + } + jpeg_start_compress(jpeg_info,TRUE); + if (image->debug != MagickFalse) + { + if (image->storage_class == PseudoClass) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Storage class: PseudoClass"); + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Storage class: DirectClass"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Depth: %.20g", + (double) image->depth); + if (image->colors != 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Number of colors: %.20g",(double) image->colors); + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Number of colors: unspecified"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "JPEG data precision: %d",(int) jpeg_info->data_precision); + switch (image->colorspace) + { + case CMYKColorspace: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Storage class: DirectClass"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Colorspace: CMYK"); + break; + } + case YCbCrColorspace: + case Rec601YCbCrColorspace: + case Rec709YCbCrColorspace: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Colorspace: YCbCr"); + break; + } + default: + break; + } + switch (image->colorspace) + { + case CMYKColorspace: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Colorspace: CMYK"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Sampling factors: %dx%d,%dx%d,%dx%d,%dx%d", + jpeg_info->comp_info[0].h_samp_factor, + jpeg_info->comp_info[0].v_samp_factor, + jpeg_info->comp_info[1].h_samp_factor, + jpeg_info->comp_info[1].v_samp_factor, + jpeg_info->comp_info[2].h_samp_factor, + jpeg_info->comp_info[2].v_samp_factor, + jpeg_info->comp_info[3].h_samp_factor, + jpeg_info->comp_info[3].v_samp_factor); + break; + } + case GRAYColorspace: + case Rec601LumaColorspace: + case Rec709LumaColorspace: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Colorspace: GRAY"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Sampling factors: %dx%d",jpeg_info->comp_info[0].h_samp_factor, + jpeg_info->comp_info[0].v_samp_factor); + break; + } + case sRGBColorspace: + case RGBColorspace: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Image colorspace is RGB"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Sampling factors: %dx%d,%dx%d,%dx%d", + jpeg_info->comp_info[0].h_samp_factor, + jpeg_info->comp_info[0].v_samp_factor, + jpeg_info->comp_info[1].h_samp_factor, + jpeg_info->comp_info[1].v_samp_factor, + jpeg_info->comp_info[2].h_samp_factor, + jpeg_info->comp_info[2].v_samp_factor); + break; + } + case YCbCrColorspace: + case Rec601YCbCrColorspace: + case Rec709YCbCrColorspace: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Colorspace: YCbCr"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Sampling factors: %dx%d,%dx%d,%dx%d", + jpeg_info->comp_info[0].h_samp_factor, + jpeg_info->comp_info[0].v_samp_factor, + jpeg_info->comp_info[1].h_samp_factor, + jpeg_info->comp_info[1].v_samp_factor, + jpeg_info->comp_info[2].h_samp_factor, + jpeg_info->comp_info[2].v_samp_factor); + break; + } + default: + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Colorspace: %d", + image->colorspace); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Sampling factors: %dx%d,%dx%d,%dx%d,%dx%d", + jpeg_info->comp_info[0].h_samp_factor, + jpeg_info->comp_info[0].v_samp_factor, + jpeg_info->comp_info[1].h_samp_factor, + jpeg_info->comp_info[1].v_samp_factor, + jpeg_info->comp_info[2].h_samp_factor, + jpeg_info->comp_info[2].v_samp_factor, + jpeg_info->comp_info[3].h_samp_factor, + jpeg_info->comp_info[3].v_samp_factor); + break; + } + } + } + /* + Write JPEG profiles. + */ + value=GetImageProperty(image,"comment"); + if (value != (char *) NULL) + { + size_t + length; + + length=strlen(value); + for (i=0; i < (ssize_t) length; i+=65533L) + jpeg_write_marker(jpeg_info,JPEG_COM,(unsigned char *) value+i, + (unsigned int) MagickMin((size_t) strlen(value+i),65533L)); + } + if (image->profiles != (void *) NULL) + WriteProfiles(jpeg_info,image); + /* + Convert MIFF to JPEG raster pixels. + */ + memory_info=AcquireVirtualMemory((size_t) image->columns, + jpeg_info->input_components*sizeof(*jpeg_pixels)); + if (memory_info == (MemoryInfo *) NULL) + ThrowJPEGWriterException(ResourceLimitError,"MemoryAllocationFailed"); + jpeg_pixels=(JSAMPLE *) GetVirtualMemoryBlob(memory_info); + if (setjmp(client_info->error_recovery) != 0) + { + jpeg_destroy_compress(jpeg_info); + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); + if (memory_info != (MemoryInfo *) NULL) + memory_info=RelinquishVirtualMemory(memory_info); + (void) CloseBlob(image); + return(MagickFalse); + } + scanline[0]=(JSAMPROW) jpeg_pixels; + scale=65535/(unsigned short) GetQuantumRange((size_t) + jpeg_info->data_precision); + if (scale == 0) + scale=1; + if (jpeg_info->data_precision <= 8) + { + if ((jpeg_info->in_color_space == JCS_RGB) || + (jpeg_info->in_color_space == JCS_YCbCr)) + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=jpeg_pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=(JSAMPLE) ScaleQuantumToChar(GetPixelRed(p)); + *q++=(JSAMPLE) ScaleQuantumToChar(GetPixelGreen(p)); + *q++=(JSAMPLE) ScaleQuantumToChar(GetPixelBlue(p)); + p++; + } + (void) jpeg_write_scanlines(jpeg_info,scanline,1); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + else + if (jpeg_info->in_color_space == JCS_GRAYSCALE) + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=jpeg_pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=(JSAMPLE) ScaleQuantumToChar(ClampToQuantum( + GetPixelLuma(image,p))); + p++; + } + (void) jpeg_write_scanlines(jpeg_info,scanline,1); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + else + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=jpeg_pixels; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + /* + Convert DirectClass packets to contiguous CMYK scanlines. + */ + *q++=(JSAMPLE) (ScaleQuantumToChar((Quantum) (QuantumRange- + GetPixelCyan(p)))); + *q++=(JSAMPLE) (ScaleQuantumToChar((Quantum) (QuantumRange- + GetPixelMagenta(p)))); + *q++=(JSAMPLE) (ScaleQuantumToChar((Quantum) (QuantumRange- + GetPixelYellow(p)))); + *q++=(JSAMPLE) (ScaleQuantumToChar((Quantum) (QuantumRange- + GetPixelBlack(indexes+x)))); + p++; + } + (void) jpeg_write_scanlines(jpeg_info,scanline,1); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + else + if (jpeg_info->in_color_space == JCS_GRAYSCALE) + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=jpeg_pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=(JSAMPLE) (ScaleQuantumToShort(ClampToQuantum( + GetPixelLuma(image,p)))/scale); + p++; + } + (void) jpeg_write_scanlines(jpeg_info,scanline,1); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + else + if ((jpeg_info->in_color_space == JCS_RGB) || + (jpeg_info->in_color_space == JCS_YCbCr)) + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=jpeg_pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=(JSAMPLE) (ScaleQuantumToShort(GetPixelRed(p))/scale); + *q++=(JSAMPLE) (ScaleQuantumToShort(GetPixelGreen(p))/scale); + *q++=(JSAMPLE) (ScaleQuantumToShort(GetPixelBlue(p))/scale); + p++; + } + (void) jpeg_write_scanlines(jpeg_info,scanline,1); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + else + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=jpeg_pixels; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + /* + Convert DirectClass packets to contiguous CMYK scanlines. + */ + *q++=(JSAMPLE) (ScaleQuantumToShort(QuantumRange-GetPixelRed(p))/ + scale); + *q++=(JSAMPLE) (ScaleQuantumToShort(QuantumRange-GetPixelGreen(p))/ + scale); + *q++=(JSAMPLE) (ScaleQuantumToShort(QuantumRange-GetPixelBlue(p))/ + scale); + *q++=(JSAMPLE) (ScaleQuantumToShort(QuantumRange- + GetPixelIndex(indexes+x))/scale); + p++; + } + (void) jpeg_write_scanlines(jpeg_info,scanline,1); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + if (y == (ssize_t) image->rows) + jpeg_finish_compress(jpeg_info); + /* + Relinquish resources. + */ + jpeg_destroy_compress(jpeg_info); + client_info=(JPEGClientInfo *) RelinquishMagickMemory(client_info); + memory_info=RelinquishVirtualMemory(memory_info); + (void) CloseBlob(image); + return(MagickTrue); +} + +static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info, + Image *image) +{ + struct jpeg_compress_struct + jpeg_info; + + return(WriteJPEGImage_(image_info,image,&jpeg_info)); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/json.c b/ImageMagick-6.9.12-44/coders/json.c new file mode 100644 index 0000000..fe2b5ff --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/json.c @@ -0,0 +1,1798 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% JJJJJ SSSSS OOO N N % +% J SS O O NN N % +% J SSS O O N N N % +% J J SS O O N NN % +% JJJ SSSSS OOO N N % +% % +% % +% Write Info About the Image in JSON Format. % +% % +% Software Design % +% Cristy % +% January 2014 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/feature.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/locale-private.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/prepress.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/registry.h" +#include "magick/signature.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/utility.h" +#include "magick/version.h" +#include "magick/module.h" + +/* + Typedef declarations. +*/ +typedef struct _IPTCInfo +{ + long + dataset, + record; + + size_t + values_length; + + char + tag[32], + ***values; +} IPTCInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteJSONImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r J S O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterJSONImage() adds attributes for the JSON image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterJSONImage method is: +% +% size_t RegisterJSONImage(void) +% +*/ +ModuleExport size_t RegisterJSONImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("JSON"); + entry->encoder=(EncodeImageHandler *) WriteJSONImage; + entry->blob_support=MagickFalse; + entry->description=ConstantString("The image format and characteristics"); + entry->mime_type=ConstantString("application/json"); + entry->magick_module=ConstantString("JSON"); + entry->endian_support=MagickTrue; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r J S O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterJSONImage() removes format registrations made by the +% JSON module from the list of supported formats. +% +% The format of the UnregisterJSONImage method is: +% +% UnregisterJSONImage(void) +% +*/ +ModuleExport void UnregisterJSONImage(void) +{ + (void) UnregisterMagickInfo("JSON"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e J S O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteJSONImage writes the pixel values as text numbers. +% +% The format of the WriteJSONImage method is: +% +% MagickBooleanType WriteJSONImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static void JSONFormatLocaleFile(FILE *file,const char *format, + const char *value) +{ + char + *escaped_json; + + char + *q; + + const char + *p; + + size_t + length; + + assert(format != (const char *) NULL); + if (value == (char *) NULL || *value == '\0') + { + (void) FormatLocaleFile(file,format,"null"); + return; + } + length=strlen(value)+2; + /* + Find all the chars that need escaping and increase the dest length counter. + */ + for (p=value; *p != '\0'; p++) + { + switch (*p) + { + case '"': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + case '\\': + { + if (~length < 1) + return; + length++; + break; + } + default: + { + if (((int) *p >= 0x00) && ((int) *p <= 0x1f)) + length+=6; + break; + } + } + } + escaped_json=(char *) NULL; + if (~length >= (MaxTextExtent-1)) + escaped_json=(char *) AcquireQuantumMemory(length+MaxTextExtent, + sizeof(*escaped_json)); + if (escaped_json == (char *) NULL) + { + (void) FormatLocaleFile(file,format,"null"); + return; + } + q=escaped_json; + *q++='"'; + for (p=value; *p != '\0'; p++) + { + switch (*p) + { + case '"': + { + *q++='\\'; + *q++=(*p); + break; + } + case '\b': + { + *q++='\\'; + *q++='b'; + break; + } + case '\f': + { + *q++='\\'; + *q++='f'; + break; + } + case '\n': + { + *q++='\\'; + *q++='n'; + break; + } + case '\r': + { + *q++='\\'; + *q++='r'; + break; + } + case '\t': + { + *q++='\\'; + *q++='t'; + break; + } + case '\\': + { + *q++='\\'; + *q++='\\'; + break; + } + default: + { + if (((int) *p >= 0x00) && ((int) *p <= 0x1f)) + { + (void) FormatLocaleString(q,7,"\\u%04X",(int) *p); + q+=6; + break; + } + *q++=(*p); + break; + } + } + } + *q++='"'; + *q='\0'; + (void) FormatLocaleFile(file,format,escaped_json); + (void) DestroyString(escaped_json); +} + +static void ColorFormatLocaleFile(FILE *file,const char *format,Image *image, + const PixelPacket *p,const IndexPacket *index) +{ + char + color[MaxTextExtent]; + + MagickPixelPacket + pixel; + + GetMagickPixelPacket(image,&pixel); + SetMagickPixelPacket(image,p,index,&pixel); + GetColorTuple(&pixel,MagickTrue,color); + (void) FormatLocaleFile(file,format,color); +} + +static ChannelStatistics *GetLocationStatistics(const Image *image, + const StatisticType type,ExceptionInfo *exception) +{ + ChannelStatistics + *channel_statistics; + + ssize_t + i; + + size_t + length; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + length=CompositeChannels+1UL; + channel_statistics=(ChannelStatistics *) AcquireQuantumMemory(length, + sizeof(*channel_statistics)); + if (channel_statistics == (ChannelStatistics *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(channel_statistics,0,length* + sizeof(*channel_statistics)); + for (i=0; i <= (ssize_t) CompositeChannels; i++) + { + switch (type) + { + case MaximumStatistic: + default: + { + channel_statistics[i].maxima=(-MagickMaximumValue); + break; + } + case MinimumStatistic: + { + channel_statistics[i].minima=MagickMaximumValue; + break; + } + } + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + switch (type) + { + case MaximumStatistic: + default: + { + if ((double) GetPixelRed(p) > channel_statistics[RedChannel].maxima) + channel_statistics[RedChannel].maxima=(double) GetPixelRed(p); + if ((double) GetPixelGreen(p) > channel_statistics[GreenChannel].maxima) + channel_statistics[GreenChannel].maxima=(double) GetPixelGreen(p); + if ((double) GetPixelBlue(p) > channel_statistics[BlueChannel].maxima) + channel_statistics[BlueChannel].maxima=(double) GetPixelBlue(p); + if ((image->matte != MagickFalse) && + ((double) GetPixelOpacity(p) > channel_statistics[OpacityChannel].maxima)) + channel_statistics[OpacityChannel].maxima=(double) + GetPixelOpacity(p); + if ((image->colorspace == CMYKColorspace) && + ((double) GetPixelIndex(indexes+x) > channel_statistics[BlackChannel].maxima)) + channel_statistics[BlackChannel].maxima=(double) + GetPixelIndex(indexes+x); + break; + } + case MinimumStatistic: + { + if ((double) GetPixelRed(p) < channel_statistics[RedChannel].minima) + channel_statistics[RedChannel].minima=(double) GetPixelRed(p); + if ((double) GetPixelGreen(p) < channel_statistics[GreenChannel].minima) + channel_statistics[GreenChannel].minima=(double) GetPixelGreen(p); + if ((double) GetPixelBlue(p) < channel_statistics[BlueChannel].minima) + channel_statistics[BlueChannel].minima=(double) GetPixelBlue(p); + if ((image->matte != MagickFalse) && + ((double) GetPixelOpacity(p) < channel_statistics[OpacityChannel].minima)) + channel_statistics[OpacityChannel].minima=(double) + GetPixelOpacity(p); + if ((image->colorspace == CMYKColorspace) && + ((double) GetPixelIndex(indexes+x) < channel_statistics[BlackChannel].minima)) + channel_statistics[BlackChannel].minima=(double) + GetPixelIndex(indexes+x); + break; + } + } + p++; + } + } + return(channel_statistics); +} + +static ssize_t PrintChannelFeatures(FILE *file,const ChannelType channel, + const char *name,const MagickBooleanType separator, + const ChannelFeatures *channel_features) +{ +#define PrintFeature(feature) \ + GetMagickPrecision(),(feature)[0], \ + GetMagickPrecision(),(feature)[1], \ + GetMagickPrecision(),(feature)[2], \ + GetMagickPrecision(),(feature)[3], \ + GetMagickPrecision(),((feature)[0]+(feature)[1]+(feature)[2]+(feature)[3])/4.0 \ + +#define FeaturesFormat " \"%s\": {\n" \ + " \"angularSecondMoment\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"contrast\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"correlation\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"sumOfSquaresVariance\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"inverseDifferenceMoment\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"sumAverage\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"sumVariance\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"sumEntropy\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"entropy\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"differenceVariance\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"differenceEntropy\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"informationMeasureOfCorrelation1\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"informationMeasureOfCorrelation2\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " },\n" \ + " \"maximumCorrelationCoefficient\": {\n" \ + " \"horizontal\": %.*g,\n" \ + " \"vertical\": %.*g,\n" \ + " \"leftDiagonal\": %.*g,\n" \ + " \"rightDiagonal\": %.*g,\n" \ + " \"average\": %.*g\n" \ + " }\n" + + ssize_t + n; + + n=FormatLocaleFile(file,FeaturesFormat,name, + PrintFeature(channel_features[channel].angular_second_moment), + PrintFeature(channel_features[channel].contrast), + PrintFeature(channel_features[channel].correlation), + PrintFeature(channel_features[channel].variance_sum_of_squares), + PrintFeature(channel_features[channel].inverse_difference_moment), + PrintFeature(channel_features[channel].sum_average), + PrintFeature(channel_features[channel].sum_variance), + PrintFeature(channel_features[channel].sum_entropy), + PrintFeature(channel_features[channel].entropy), + PrintFeature(channel_features[channel].difference_variance), + PrintFeature(channel_features[channel].difference_entropy), + PrintFeature(channel_features[channel].measure_of_correlation_1), + PrintFeature(channel_features[channel].measure_of_correlation_2), + PrintFeature(channel_features[channel].maximum_correlation_coefficient)); + (void) FormatLocaleFile(file," }"); + if (separator != MagickFalse) + (void) FormatLocaleFile(file,","); + (void) FormatLocaleFile(file,"\n"); + return(n); +} + +static ssize_t PrintChannelLocations(FILE *file,const Image *image, + const ChannelType channel,const char *name,const StatisticType type, + const size_t max_locations,const MagickBooleanType separator, + const ChannelStatistics *channel_statistics) +{ + double + target; + + ExceptionInfo + *exception; + + ssize_t + n, + y; + + switch (type) + { + case MaximumStatistic: + default: + { + target=channel_statistics[channel].maxima; + break; + } + case MeanStatistic: + { + target=channel_statistics[channel].mean; + break; + } + case MinimumStatistic: + { + target=channel_statistics[channel].minima; + break; + } + } + (void) FormatLocaleFile(file," \"%s\": {\n \"intensity\": " + "%.*g,\n",name,GetMagickPrecision(),QuantumScale*target); + exception=AcquireExceptionInfo(); + n=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + MagickBooleanType + match; + + match=MagickFalse; + switch (channel) + { + case RedChannel: + { + match=fabs((double) (p->red-target)) < 0.5 ? MagickTrue : MagickFalse; + break; + } + case GreenChannel: + { + match=fabs((double) (p->green-target)) < 0.5 ? MagickTrue : + MagickFalse; + break; + } + case BlueChannel: + { + match=fabs((double) (p->blue-target)) < 0.5 ? MagickTrue : + MagickFalse; + break; + } + case AlphaChannel: + { + match=fabs((double) (p->opacity-target)) < 0.5 ? MagickTrue : + MagickFalse; + break; + } + default: + break; + } + if (match != MagickFalse) + { + if ((max_locations != 0) && (n >= (ssize_t) max_locations)) + break; + if (n != 0) + (void) FormatLocaleFile(file,",\n"); + (void) FormatLocaleFile(file," \"location%.20g\": {\n" + " \"x\": \"%.20g,\n \"y\": %.20g\n" + " }",(double) n,(double) x,(double) y); + n++; + } + p++; + } + if (x < (ssize_t) image->columns) + break; + } + (void) FormatLocaleFile(file,"\n }"); + if (separator != MagickFalse) + (void) FormatLocaleFile(file,","); + (void) FormatLocaleFile(file,"\n"); + return(n); +} + +static ssize_t PrintChannelMoments(FILE *file,const ChannelType channel, + const char *name,const MagickBooleanType separator, + const ChannelMoments *channel_moments) +{ + ssize_t + i; + + ssize_t + n; + + n=FormatLocaleFile(file," \"%s\": {\n",name); + n+=FormatLocaleFile(file," \"centroid\": {\n " + " \"x\": %.*g,\n" + " \"y\": %.*g\n },\n", + GetMagickPrecision(),channel_moments[channel].centroid.x, + GetMagickPrecision(),channel_moments[channel].centroid.y); + n+=FormatLocaleFile(file," \"ellipseSemiMajorMinorAxis\": {\n" + " \"x\": %.*g,\n" + " \"y\": %.*g\n },\n", + GetMagickPrecision(),channel_moments[channel].ellipse_axis.x, + GetMagickPrecision(),channel_moments[channel].ellipse_axis.y); + n+=FormatLocaleFile(file," \"ellipseAngle\": %.*g,\n", + GetMagickPrecision(),channel_moments[channel].ellipse_angle); + n+=FormatLocaleFile(file," \"ellipseEccentricity\": %.*g,\n", + GetMagickPrecision(),channel_moments[channel].ellipse_eccentricity); + n+=FormatLocaleFile(file," \"ellipseIntensity\": %.*g,\n", + GetMagickPrecision(),channel_moments[channel].ellipse_intensity); + for (i=0; i < 7; i++) + n+=FormatLocaleFile(file," \"I%.20g\": %.*g,\n",i+1.0, + GetMagickPrecision(),channel_moments[channel].I[i]); + n+=FormatLocaleFile(file," \"I%.20g\": %.*g\n",i+1.0, + GetMagickPrecision(),channel_moments[channel].I[i]); + (void) FormatLocaleFile(file," }"); + if (separator != MagickFalse) + (void) FormatLocaleFile(file,","); + (void) FormatLocaleFile(file,"\n"); + return(n); +} + +static ssize_t PrintChannelPerceptualHash(FILE *file,const ChannelType channel, + const char *name,const MagickBooleanType separator, + const ChannelPerceptualHash *channel_phash) +{ + ssize_t + i; + + ssize_t + n; + + n=FormatLocaleFile(file," \"%s\": {\n",name); + for (i=0; i < 6; i++) + n+=FormatLocaleFile(file, + " \"PH%.20g\": [ %.*g, %.*g ],\n",i+1.0, + GetMagickPrecision(),channel_phash[channel].P[i], + GetMagickPrecision(),channel_phash[channel].Q[i]); + n+=FormatLocaleFile(file, + " \"PH%.20g\": [ %.*g, %.*g ]\n",i+1.0, + GetMagickPrecision(),channel_phash[channel].P[i], + GetMagickPrecision(),channel_phash[channel].Q[i]); + (void) FormatLocaleFile(file," }"); + if (separator != MagickFalse) + (void) FormatLocaleFile(file,","); + (void) FormatLocaleFile(file,"\n"); + return(n); +} + +static ssize_t PrintChannelStatistics(FILE *file,const ChannelType channel, + const char *name,const double scale,const MagickBooleanType separator, + const ChannelStatistics *channel_statistics) +{ +#define StatisticsFormat " \"%s\": {\n \"min\": %.*g,\n" \ + " \"max\": %.*g,\n \"mean\": %.*g,\n " \ + "\"standardDeviation\": %.*g,\n \"kurtosis\": %.*g,\n "\ + "\"skewness\": %.*g,\n \"entropy\": %.*g\n }" + + ssize_t + n; + + if (channel == AlphaChannel) + n=FormatLocaleFile(file,StatisticsFormat,name,GetMagickPrecision(), + (double) ClampToQuantum(scale*(QuantumRange- + channel_statistics[channel].minima)),GetMagickPrecision(),(double) + ClampToQuantum(scale*(QuantumRange-channel_statistics[channel].maxima)), + GetMagickPrecision(),scale*(QuantumRange- + channel_statistics[channel].mean),GetMagickPrecision(), + IsNaN(channel_statistics[channel].standard_deviation) != 0 ? MagickEpsilon : + scale*channel_statistics[channel].standard_deviation,GetMagickPrecision(), + channel_statistics[channel].kurtosis,GetMagickPrecision(), + channel_statistics[channel].skewness,GetMagickPrecision(), + channel_statistics[channel].entropy); + else + n=FormatLocaleFile(file,StatisticsFormat,name,GetMagickPrecision(), + (double) ClampToQuantum(scale*channel_statistics[channel].minima), + GetMagickPrecision(),(double) ClampToQuantum(scale* + channel_statistics[channel].maxima),GetMagickPrecision(),scale* + channel_statistics[channel].mean,GetMagickPrecision(), + IsNaN(channel_statistics[channel].standard_deviation) != 0 ? MagickEpsilon : + scale*channel_statistics[channel].standard_deviation,GetMagickPrecision(), + channel_statistics[channel].kurtosis,GetMagickPrecision(), + channel_statistics[channel].skewness,GetMagickPrecision(), + channel_statistics[channel].entropy); + if (separator != MagickFalse) + (void) FormatLocaleFile(file,","); + (void) FormatLocaleFile(file,"\n"); + return(n); +} + +static void EncodeIptcProfile(FILE *file,const StringInfo *profile) +{ + char + *attribute, + **attribute_list; + + const char + *tag; + + IPTCInfo + *value, + **values; + + long + dataset, + record, + sentinel; + + ssize_t + i, + j, + k; + + size_t + count, + length, + profile_length; + + values=(IPTCInfo **) NULL; + count=0; + profile_length=GetStringInfoLength(profile); + for (i=0; i < (ssize_t) profile_length; i+=(ssize_t) length) + { + length=1; + sentinel=GetStringInfoDatum(profile)[i++]; + if (sentinel != 0x1c) + continue; + dataset=GetStringInfoDatum(profile)[i++]; + record=GetStringInfoDatum(profile)[i++]; + value=(IPTCInfo *) NULL; + for (j=0; j < (ssize_t) count; j++) + { + if ((values[j]->record == record) && (values[j]->dataset == dataset)) + value=values[j]; + } + if (value == (IPTCInfo *) NULL) + { + values=(IPTCInfo **) ResizeQuantumMemory(values,count+1, + sizeof(*values)); + if (values == (IPTCInfo **) NULL) + break; + value=(IPTCInfo *) AcquireMagickMemory(sizeof(*value)); + if (value == (IPTCInfo *) NULL) + break; + /* Check the tag length in IPTCInfo when a new tag is added */ + switch (record) + { + case 5: tag="Image Name"; break; + case 7: tag="Edit Status"; break; + case 10: tag="Priority"; break; + case 15: tag="Category"; break; + case 20: tag="Supplemental Category"; break; + case 22: tag="Fixture Identifier"; break; + case 25: tag="Keyword"; break; + case 30: tag="Release Date"; break; + case 35: tag="Release Time"; break; + case 40: tag="Special Instructions"; break; + case 45: tag="Reference Service"; break; + case 47: tag="Reference Date"; break; + case 50: tag="Reference Number"; break; + case 55: tag="Created Date"; break; + case 60: tag="Created Time"; break; + case 65: tag="Originating Program"; break; + case 70: tag="Program Version"; break; + case 75: tag="Object Cycle"; break; + case 80: tag="Byline"; break; + case 85: tag="Byline Title"; break; + case 90: tag="City"; break; + case 92: tag="Sub-Location"; break; + case 95: tag="Province State"; break; + case 100: tag="Country Code"; break; + case 101: tag="Country"; break; + case 103: tag="Original Transmission Reference"; break; + case 105: tag="Headline"; break; + case 110: tag="Credit"; break; + case 115: tag="Src"; break; + case 116: tag="Copyright String"; break; + case 120: tag="Caption"; break; + case 121: tag="Local Caption"; break; + case 122: tag="Caption Writer"; break; + case 200: tag="Custom Field 1"; break; + case 201: tag="Custom Field 2"; break; + case 202: tag="Custom Field 3"; break; + case 203: tag="Custom Field 4"; break; + case 204: tag="Custom Field 5"; break; + case 205: tag="Custom Field 6"; break; + case 206: tag="Custom Field 7"; break; + case 207: tag="Custom Field 8"; break; + case 208: tag="Custom Field 9"; break; + case 209: tag="Custom Field 10"; break; + case 210: tag="Custom Field 11"; break; + case 211: tag="Custom Field 12"; break; + case 212: tag="Custom Field 13"; break; + case 213: tag="Custom Field 14"; break; + case 214: tag="Custom Field 15"; break; + case 215: tag="Custom Field 16"; break; + case 216: tag="Custom Field 17"; break; + case 217: tag="Custom Field 18"; break; + case 218: tag="Custom Field 19"; break; + case 219: tag="Custom Field 20"; break; + default: tag="Unknown"; break; + } + (void) CopyMagickString(value->tag,tag,strlen(tag)+1); + value->record=record; + value->dataset=dataset; + value->values=(char ***) NULL; + value->values_length=0; + values[count++]=value; + } + length=(size_t) (GetStringInfoDatum(profile)[i++] << 8); + length|=GetStringInfoDatum(profile)[i++]; + attribute=(char *) NULL; + if (~length >= (MagickPathExtent-1)) + attribute=(char *) AcquireQuantumMemory(length+MagickPathExtent, + sizeof(*attribute)); + if (attribute != (char *) NULL) + { + (void) CopyMagickString(attribute,(char *) + GetStringInfoDatum(profile)+i,length+1); + attribute_list=StringToList(attribute); + if (attribute_list != (char **) NULL) + { + value->values=(char ***) ResizeQuantumMemory(value->values, + value->values_length+1, + sizeof(*value->values)); + if (value->values == (char ***) NULL) + break; + value->values[value->values_length++]=attribute_list; + } + attribute=DestroyString(attribute); + } + } + if (values != (IPTCInfo **) NULL) + { + for (i=0; i < (ssize_t) count; i++) + { + value=values[i]; + (void) FormatLocaleFile(file," \"%s[%.20g,%.20g]\": ", + value->tag,(double) value->dataset,(double) value->record); + if (value->values_length == 0) + (void) FormatLocaleFile(file,"null,"); + else + { + (void) FormatLocaleFile(file,"["); + for (j=0; j < (ssize_t) value->values_length; j++) + { + for (k=0; value->values[j][k] != (char *) NULL; k++) + { + if (j > 0 || k > 0) + (void) FormatLocaleFile(file,","); + JSONFormatLocaleFile(file,"%s",value->values[j][k]); + value->values[j][k]=(char *) RelinquishMagickMemory( + value->values[j][k]); + } + value->values[j]=(char **) RelinquishMagickMemory( + value->values[j]); + } + value->values=(char ***) RelinquishMagickMemory(value->values); + (void) FormatLocaleFile(file,"],\n"); + } + values[i]=(IPTCInfo *) RelinquishMagickMemory(values[i]); + } + values=(IPTCInfo **) RelinquishMagickMemory(values); + } +} + +static MagickBooleanType EncodeImageAttributes(Image *image,FILE *file) +{ + char + format[MaxTextExtent], + key[MaxTextExtent]; + + ChannelFeatures + *channel_features; + + ChannelMoments + *channel_moments; + + ChannelPerceptualHash + *channel_phash; + + ChannelStatistics + *channel_statistics; + + const char + *artifact, + *locate, + *name, + *property, + *registry, + *value; + + const MagickInfo + *magick_info; + + double + elapsed_time, + user_time, + version; + + ExceptionInfo + *exception; + + ImageType + type; + + ssize_t + i, + x; + + size_t + depth, + distance, + scale; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (file == (FILE *) NULL) + file=stdout; + exception=AcquireExceptionInfo(); + *format='\0'; + elapsed_time=GetElapsedTime(&image->timer); + user_time=GetUserTime(&image->timer); + GetTimerInfo(&image->timer); + (void) GetVirtualPixels(image,0,0,1,1,exception); + exception=DestroyExceptionInfo(exception); + exception=(&image->exception); + (void) SignatureImage(image); + (void) FormatLocaleFile(file,"{\n"); + version=1.0; + artifact=GetImageArtifact(image,"json:version"); + if (artifact != (const char *) NULL) + version=StringToDouble(artifact,(char **) NULL); + if (version >= 1.0) + (void) FormatLocaleFile(file," \"version\": \"%.1f\",\n",version); + if (*image->magick_filename == '\0') + JSONFormatLocaleFile(file," \"image\": {\n \"name\": %s,\n", + image->filename); + else + { + JSONFormatLocaleFile(file," \"image\": {\n \"name\": %s,\n", + image->magick_filename); + if (LocaleCompare(image->magick_filename,image->filename) != 0) + { + char + filename[MaxTextExtent]; + + GetPathComponent(image->magick_filename,TailPath,filename); + JSONFormatLocaleFile(file," \"baseName\": %s,\n",filename); + } + } + magick_info=GetMagickInfo(image->magick,exception); + JSONFormatLocaleFile(file," \"format\": %s,\n",image->magick); + if ((magick_info != (const MagickInfo *) NULL) && + (GetMagickDescription(magick_info) != (const char *) NULL)) + JSONFormatLocaleFile(file," \"formatDescription\": %s,\n", + GetMagickDescription(magick_info)); + if ((magick_info != (const MagickInfo *) NULL) && + (GetMagickMimeType(magick_info) != (const char *) NULL)) + JSONFormatLocaleFile(file," \"mimeType\": %s,\n", + GetMagickMimeType(magick_info)); + JSONFormatLocaleFile(file," \"class\": %s,\n",CommandOptionToMnemonic( + MagickClassOptions,(ssize_t) image->storage_class)); + (void) FormatLocaleFile(file," \"geometry\": {\n" + " \"width\": %.20g,\n \"height\": %.20g,\n" + " \"x\": %.20g,\n \"y\": %.20g\n },\n", + (double) image->columns,(double) image->rows,(double) image->tile_offset.x, + (double) image->tile_offset.y); + if ((image->magick_columns != 0) || (image->magick_rows != 0)) + if ((image->magick_columns != image->columns) || + (image->magick_rows != image->rows)) + (void) FormatLocaleFile(file," \"baseGeometry\": {\n" + " \"width\": %g,\n \"height\": %g\n },\n",(double) + image->magick_columns,(double) image->magick_rows); + if ((image->x_resolution != 0.0) && (image->y_resolution != 0.0)) + { + (void) FormatLocaleFile(file," \"resolution\": {\n" + " \"x\": %g,\n \"y\": %g\n },\n",image->x_resolution, + image->y_resolution); + (void) FormatLocaleFile(file," \"printSize\": {\n" + " \"x\": %.*g,\n \"y\": %.*g\n },\n",GetMagickPrecision(), + image->columns/image->x_resolution,GetMagickPrecision(),(double) + image->rows/image->y_resolution); + } + JSONFormatLocaleFile(file," \"units\": %s,\n",CommandOptionToMnemonic( + MagickResolutionOptions,(ssize_t) image->units)); + type=IdentifyImageType(image,exception); + JSONFormatLocaleFile(file," \"type\": %s,\n",CommandOptionToMnemonic( + MagickTypeOptions,(ssize_t) type)); + if (image->type != UndefinedType) + JSONFormatLocaleFile(file," \"baseType\": %s,\n", + CommandOptionToMnemonic(MagickTypeOptions,(ssize_t) image->type)); + if (version < 1.0) + JSONFormatLocaleFile(file," \"endianness\": %s,\n", + CommandOptionToMnemonic(MagickEndianOptions,(ssize_t) image->endian)); + else + JSONFormatLocaleFile(file," \"endianness\": %s,\n", + CommandOptionToMnemonic(MagickEndianOptions,(ssize_t) image->endian)); + locate=GetImageArtifact(image,"identify:locate"); + if (locate == (const char *) NULL) + locate=GetImageArtifact(image,"json:locate"); + if (locate != (const char *) NULL) + { + char + target[MaxTextExtent]; + + const char + *limit; + + size_t + max_locations; + + StatisticType + type; + + /* + Display minimum, maximum, or mean pixel locations. + */ + type=(StatisticType) ParseCommandOption(MagickStatisticOptions, + MagickFalse,locate); + max_locations=0; + limit=GetImageArtifact(image,"identify:limit"); + if (limit == (const char *) NULL) + limit=GetImageArtifact(image,"json:limit"); + if (limit != (const char *) NULL) + max_locations=StringToUnsignedLong(limit); + channel_statistics=GetLocationStatistics(image,type,exception); + if (channel_statistics == (ChannelStatistics *) NULL) + return(MagickFalse); + (void) CopyMagickString(target,locate,MaxTextExtent); + *target=(char) LocaleToUppercase((int) ((unsigned char) *target)); + (void) FormatLocaleFile(file," \"channel%s\": {\n",target); + if (image->matte != MagickFalse) + (void) PrintChannelLocations(file,image,AlphaChannel,"alpha", + type,max_locations,MagickTrue,channel_statistics); + switch (image->colorspace) + { + case RGBColorspace: + default: + { + (void) PrintChannelLocations(file,image,RedChannel,"red", + type,max_locations,MagickTrue,channel_statistics); + (void) PrintChannelLocations(file,image,GreenChannel,"Green", + type,max_locations,MagickTrue,channel_statistics); + (void) PrintChannelLocations(file,image,BlueChannel,"blue", + type,max_locations,MagickFalse,channel_statistics); + break; + } + case CMYKColorspace: + { + (void) PrintChannelLocations(file,image,CyanChannel,"cyan", + type,max_locations,MagickTrue,channel_statistics); + (void) PrintChannelLocations(file,image,MagentaChannel,"magenta", + type,max_locations,MagickTrue,channel_statistics); + (void) PrintChannelLocations(file,image,YellowChannel,"yellow", + type,max_locations,MagickTrue,channel_statistics); + (void) PrintChannelLocations(file,image,BlackChannel,"black", + type,max_locations,MagickFalse,channel_statistics); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) PrintChannelLocations(file,image,GrayChannel,"gray", + type,max_locations,MagickFalse,channel_statistics); + break; + } + } + (void) FormatLocaleFile(file," },\n"); + channel_statistics=(ChannelStatistics *) RelinquishMagickMemory( + channel_statistics); + } + /* + Detail channel depth and extrema. + */ + JSONFormatLocaleFile(file," \"colorspace\": %s,\n", + CommandOptionToMnemonic(MagickColorspaceOptions,(ssize_t) + image->colorspace)); + channel_statistics=(ChannelStatistics *) NULL; + channel_moments=(ChannelMoments *) NULL; + channel_phash=(ChannelPerceptualHash *) NULL; + channel_features=(ChannelFeatures *) NULL; + scale=1; + channel_statistics=GetImageChannelStatistics(image,exception); + if (channel_statistics == (ChannelStatistics *) NULL) + return(MagickFalse); + artifact=GetImageArtifact(image,"identify:moments"); + if (artifact == (const char *) NULL) + artifact=GetImageArtifact(image,"json:moments"); + if (artifact != (const char *) NULL) + { + channel_moments=GetImageChannelMoments(image,exception); + channel_phash=GetImageChannelPerceptualHash(image,exception); + } + artifact=GetImageArtifact(image,"identify:features"); + if (artifact == (const char *) NULL) + artifact=GetImageArtifact(image,"json:features"); + if (artifact != (const char *) NULL) + { + distance=StringToUnsignedLong(artifact); + channel_features=GetImageChannelFeatures(image,distance,exception); + } + depth=GetImageDepth(image,exception); + (void) FormatLocaleFile(file," \"depth\": %.20g,\n",(double) depth); + (void) FormatLocaleFile(file," \"baseDepth\": %.20g,\n",(double) + image->depth); + (void) FormatLocaleFile(file," \"channelDepth\": {\n"); + if (image->matte != MagickFalse) + (void) FormatLocaleFile(file," \"alpha\": %.20g,\n",(double) + channel_statistics[OpacityChannel].depth); + switch (image->colorspace) + { + case RGBColorspace: + default: + { + (void) FormatLocaleFile(file," \"red\": %.20g,\n",(double) + channel_statistics[RedChannel].depth); + (void) FormatLocaleFile(file," \"green\": %.20g,\n",(double) + channel_statistics[GreenChannel].depth); + (void) FormatLocaleFile(file," \"blue\": %.20g\n",(double) + channel_statistics[BlueChannel].depth); + break; + } + case CMYKColorspace: + { + (void) FormatLocaleFile(file," \"cyan\": %.20g,\n",(double) + channel_statistics[CyanChannel].depth); + (void) FormatLocaleFile(file," \"magenta\": %.20g,\n",(double) + channel_statistics[MagentaChannel].depth); + (void) FormatLocaleFile(file," \"yellow\": %.20g,\n",(double) + channel_statistics[YellowChannel].depth); + (void) FormatLocaleFile(file," \"black\": %.20g\n",(double) + channel_statistics[BlackChannel].depth); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) FormatLocaleFile(file," \"gray\": %.20g\n",(double) + channel_statistics[GrayChannel].depth); + break; + } + } + (void) FormatLocaleFile(file," },\n"); + scale=1; + if (image->depth <= MAGICKCORE_QUANTUM_DEPTH) + scale=QuantumRange/((size_t) QuantumRange >> ((size_t) + MAGICKCORE_QUANTUM_DEPTH-image->depth)); + if (channel_statistics != (ChannelStatistics *) NULL) + { + (void) FormatLocaleFile(file," \"pixels\": %.20g,\n", + (double) image->columns*image->rows); + if ((image->colorspace != LinearGRAYColorspace) && + (image->colorspace != GRAYColorspace)) + { + (void) FormatLocaleFile(file," \"imageStatistics\": {\n"); + (void) PrintChannelStatistics(file,CompositeChannels,"all",1.0/ + scale,MagickFalse,channel_statistics); + (void) FormatLocaleFile(file," },\n"); + } + (void) FormatLocaleFile(file," \"channelStatistics\": {\n"); + if (image->matte != MagickFalse) + (void) PrintChannelStatistics(file,AlphaChannel,"alpha",1.0/scale, + MagickTrue,channel_statistics); + switch (image->colorspace) + { + case RGBColorspace: + default: + { + (void) PrintChannelStatistics(file,RedChannel,"red",1.0/scale, + MagickTrue,channel_statistics); + (void) PrintChannelStatistics(file,GreenChannel,"green",1.0/scale, + MagickTrue,channel_statistics); + (void) PrintChannelStatistics(file,BlueChannel,"blue",1.0/scale, + MagickFalse,channel_statistics); + break; + } + case CMYKColorspace: + { + (void) PrintChannelStatistics(file,CyanChannel,"cyan",1.0/scale, + MagickTrue,channel_statistics); + (void) PrintChannelStatistics(file,MagentaChannel,"magenta",1.0/scale, + MagickTrue,channel_statistics); + (void) PrintChannelStatistics(file,YellowChannel,"yellow",1.0/scale, + MagickTrue,channel_statistics); + (void) PrintChannelStatistics(file,BlackChannel,"black",1.0/scale, + MagickFalse,channel_statistics); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) PrintChannelStatistics(file,GrayChannel,"gray",1.0/scale, + MagickFalse,channel_statistics); + break; + } + } + (void) FormatLocaleFile(file," },\n"); + channel_statistics=(ChannelStatistics *) RelinquishMagickMemory( + channel_statistics); + } + if (channel_moments != (ChannelMoments *) NULL) + { + (void) FormatLocaleFile(file," \"channelMoments\": {\n"); + if (image->matte != MagickFalse) + (void) PrintChannelMoments(file,AlphaChannel,"alpha",MagickTrue, + channel_moments); + switch (image->colorspace) + { + case RGBColorspace: + default: + { + (void) PrintChannelMoments(file,RedChannel,"red",MagickTrue, + channel_moments); + (void) PrintChannelMoments(file,GreenChannel,"green",MagickTrue, + channel_moments); + (void) PrintChannelMoments(file,BlueChannel,"blue",MagickFalse, + channel_moments); + break; + } + case CMYKColorspace: + { + (void) PrintChannelMoments(file,CyanChannel,"cyan",MagickTrue, + channel_moments); + (void) PrintChannelMoments(file,MagentaChannel,"magenta",MagickTrue, + channel_moments); + (void) PrintChannelMoments(file,YellowChannel,"yellow",MagickTrue, + channel_moments); + (void) PrintChannelMoments(file,BlackChannel,"black",MagickFalse, + channel_moments); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) PrintChannelMoments(file,GrayChannel,"gray",MagickFalse, + channel_moments); + break; + } + } + (void) FormatLocaleFile(file," },\n"); + channel_moments=(ChannelMoments *) RelinquishMagickMemory( + channel_moments); + } + if (channel_phash != (ChannelPerceptualHash *) NULL) + { + (void) FormatLocaleFile(file," \"channelPerceptualHash\": {\n"); + if (image->matte != MagickFalse) + (void) PrintChannelPerceptualHash(file,AlphaChannel,"alphaAlpha", + MagickTrue,channel_phash); + (void) PrintChannelPerceptualHash(file,RedChannel,"redHue",MagickTrue, + channel_phash); + (void) PrintChannelPerceptualHash(file,GreenChannel,"greenChroma", + MagickTrue,channel_phash); + (void) PrintChannelPerceptualHash(file,BlueChannel,"blueLuma",MagickFalse, + channel_phash); + (void) FormatLocaleFile(file," },\n"); + channel_phash=(ChannelPerceptualHash *) RelinquishMagickMemory( + channel_phash); + } + if (channel_features != (ChannelFeatures *) NULL) + { + (void) FormatLocaleFile(file," \"channelFeatures\": {\n"); + if (image->matte != MagickFalse) + (void) PrintChannelFeatures(file,AlphaChannel,"alpha",MagickTrue, + channel_features); + switch (image->colorspace) + { + case RGBColorspace: + default: + { + (void) PrintChannelFeatures(file,RedChannel,"red",MagickTrue, + channel_features); + (void) PrintChannelFeatures(file,GreenChannel,"green",MagickTrue, + channel_features); + (void) PrintChannelFeatures(file,BlueChannel,"blue",MagickFalse, + channel_features); + break; + } + case CMYKColorspace: + { + (void) PrintChannelFeatures(file,CyanChannel,"cyan",MagickTrue, + channel_features); + (void) PrintChannelFeatures(file,MagentaChannel,"magenta",MagickTrue, + channel_features); + (void) PrintChannelFeatures(file,YellowChannel,"yellow",MagickTrue, + channel_features); + (void) PrintChannelFeatures(file,BlackChannel,"black",MagickFalse, + channel_features); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) PrintChannelFeatures(file,GrayChannel,"gray",MagickFalse, + channel_features); + break; + } + } + (void) FormatLocaleFile(file," },\n"); + channel_features=(ChannelFeatures *) RelinquishMagickMemory( + channel_features); + } + if (image->colorspace == CMYKColorspace) + (void) FormatLocaleFile(file," \"totalInkDensity\": \"%.*g%%\",\n", + GetMagickPrecision(),100.0*GetImageTotalInkDensity(image)/(double) + QuantumRange); + x=0; + if (image->matte != MagickFalse) + { + const IndexPacket + *indexes; + + const PixelPacket + *p; + + p=(PixelPacket *) NULL; + indexes=(IndexPacket *) NULL; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelOpacity(p) == (Quantum) TransparentOpacity) + break; + p++; + } + if (x < (ssize_t) image->columns) + break; + } + if ((x < (ssize_t) image->columns) || (y < (ssize_t) image->rows)) + ColorFormatLocaleFile(file," \"alpha\": \"%s\",\n",image,p, + indexes+x); + } + if (image->storage_class == PseudoClass) + { + PixelPacket + *magick_restrict p; + + (void) FormatLocaleFile(file," \"colormapEntries\": %.20g,\n", + (double) image->colors); + (void) FormatLocaleFile(file," \"colormap\": [\n "); + p=image->colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + ColorFormatLocaleFile(file,"\"%s\"",image,p,(IndexPacket *) NULL); + if (i < (ssize_t) (image->colors-1)) + (void) FormatLocaleFile(file,","); + if (((i+1) % 5) == 0) + (void) FormatLocaleFile(file,"\n "); + p++; + } + (void) FormatLocaleFile(file,"\n ],\n"); + } + if (image->error.mean_error_per_pixel != 0.0) + (void) FormatLocaleFile(file," \"meanErrorPerPixel\": %g,\n", + image->error.mean_error_per_pixel); + if (image->error.normalized_mean_error != 0.0) + (void) FormatLocaleFile(file," \"normalizedMeanError\": %g,\n", + image->error.normalized_mean_error); + if (image->error.normalized_maximum_error != 0.0) + (void) FormatLocaleFile(file," \"normalizedMaximumError\": %g,\n", + image->error.normalized_maximum_error); + JSONFormatLocaleFile(file," \"renderingIntent\": %s,\n", + CommandOptionToMnemonic(MagickIntentOptions,(ssize_t) + image->rendering_intent)); + if (image->gamma != 0.0) + (void) FormatLocaleFile(file," \"gamma\": %g,\n",image->gamma); + if ((image->chromaticity.red_primary.x != 0.0) || + (image->chromaticity.green_primary.x != 0.0) || + (image->chromaticity.blue_primary.x != 0.0) || + (image->chromaticity.white_point.x != 0.0)) + { + /* + Display image chromaticity. + */ + (void) FormatLocaleFile(file," \"chromaticity\": {\n"); + (void) FormatLocaleFile(file," \"redPrimary\": {\n" + " \"x\": %g,\n \"y\": %g\n },\n", + image->chromaticity.red_primary.x,image->chromaticity.red_primary.y); + (void) FormatLocaleFile(file," \"greenPrimary\": {\n" + " \"x\": %g,\n \"y\": %g\n },\n", + image->chromaticity.green_primary.x, + image->chromaticity.green_primary.y); + (void) FormatLocaleFile(file," \"bluePrimary\": {\n" + " \"x\": %g,\n \"y\": %g\n },\n", + image->chromaticity.blue_primary.x,image->chromaticity.blue_primary.y); + (void) FormatLocaleFile(file," \"whitePrimary\": {\n" + " \"x\": %g,\n \"y\": %g\n }\n", + image->chromaticity.white_point.x,image->chromaticity.white_point.y); + (void) FormatLocaleFile(file," },\n"); + } + if ((image->extract_info.width*image->extract_info.height) != 0) + (void) FormatLocaleFile(file," \"tileGeometry\": {\n" + " \"width\": %.20g,\n \"height\": %.20g,\n" + " \"x\": %.20g,\n \"y\": %.20g\n },\n", + (double) image->extract_info.width,(double) image->extract_info.height, + (double) image->extract_info.x,(double) image->extract_info.y); + ColorFormatLocaleFile(file," \"backgroundColor\": \"%s\",\n",image, + &image->background_color,(IndexPacket *) NULL); + ColorFormatLocaleFile(file," \"borderColor\": \"%s\",\n",image, + &image->border_color,(IndexPacket *) NULL); + ColorFormatLocaleFile(file," \"matteColor\": \"%s\",\n",image, + &image->matte_color,(IndexPacket *) NULL); + ColorFormatLocaleFile(file," \"transparentColor\": \"%s\",\n",image, + &image->transparent_color,(IndexPacket *) NULL); + JSONFormatLocaleFile(file," \"interlace\": %s,\n",CommandOptionToMnemonic( + MagickInterlaceOptions,(ssize_t) image->interlace)); + JSONFormatLocaleFile(file," \"intensity\": %s,\n",CommandOptionToMnemonic( + MagickPixelIntensityOptions,(ssize_t) + image->intensity)); + JSONFormatLocaleFile(file," \"compose\": %s,\n", + CommandOptionToMnemonic(MagickComposeOptions,(ssize_t) image->compose)); + if ((image->page.width != 0) || (image->page.height != 0) || + (image->page.x != 0) || (image->page.y != 0)) + (void) FormatLocaleFile(file," \"pageGeometry\": {\n" + " \"width\": %.20g,\n \"height\": %.20g,\n" + " \"x\": %.20g,\n \"y\": %.20g\n },\n", + (double) image->page.width,(double) image->page.height, + (double) image->page.x,(double) image->page.y); + if ((image->page.x != 0) || (image->page.y != 0)) + (void) FormatLocaleFile(file," \"originGeometry\": \"%+.20g%+.20g\",\n", + (double) image->page.x,(double) image->page.y); + JSONFormatLocaleFile(file," \"dispose\": %s,\n", + CommandOptionToMnemonic(MagickDisposeOptions,(ssize_t) image->dispose)); + if (image->delay != 0) + (void) FormatLocaleFile(file," \"delay\": \"%.20gx%.20g\",\n", + (double) image->delay,(double) image->ticks_per_second); + if (image->iterations != 1) + (void) FormatLocaleFile(file," \"iterations\": %.20g,\n",(double) + image->iterations); + if ((image->next != (Image *) NULL) || (image->previous != (Image *) NULL)) + (void) FormatLocaleFile(file," \"scene\": %.20g,\n \"scenes\": " + "%.20g,\n",(double) image->scene,(double) GetImageListLength(image)); + else + if (image->scene != 0) + (void) FormatLocaleFile(file," \"scene\": %.20g,\n",(double) + image->scene); + JSONFormatLocaleFile(file," \"compression\": %s,\n", + CommandOptionToMnemonic(MagickCompressOptions,(ssize_t) + image->compression)); + if (image->quality != UndefinedCompressionQuality) + (void) FormatLocaleFile(file," \"quality\": %.20g,\n",(double) + image->quality); + JSONFormatLocaleFile(file," \"orientation\": %s,\n", + CommandOptionToMnemonic(MagickOrientationOptions,(ssize_t) + image->orientation)); + if (image->montage != (char *) NULL) + JSONFormatLocaleFile(file," \"montage\": \"%s\",\n",image->montage); + if (image->directory != (char *) NULL) + { + Image + *tile; + + ImageInfo + *image_info; + + char + *p, + *q; + + WarningHandler + handler; + + /* + Display visual image directory. + */ + image_info=AcquireImageInfo(); + (void) CloneString(&image_info->size,"64x64"); + (void) FormatLocaleFile(file," \"montageDirectory\": ["); + p=image->directory; + while (*p != '\0') + { + q=p; + while ((*q != '\xff') && (*q != '\0')) + q++; + (void) CopyMagickString(image_info->filename,p,(size_t) (q-p+1)); + p=q+1; + JSONFormatLocaleFile(file,"{\n \"name\": %s", + image_info->filename); + handler=SetWarningHandler((WarningHandler) NULL); + tile=ReadImage(image_info,exception); + (void) SetWarningHandler(handler); + if (tile == (Image *) NULL) + { + (void) FormatLocaleFile(file," }"); + continue; + } + (void) FormatLocaleFile(file,",\n \"info\": \"%.20gx%.20g %s\"", + (double) tile->magick_columns,(double) tile->magick_rows, + tile->magick); + (void) SignatureImage(tile); + ResetImagePropertyIterator(tile); + property=GetNextImageProperty(tile); + while (property != (const char *) NULL) + { + JSONFormatLocaleFile(file,",\n %s: ",property); + value=GetImageProperty(tile,property); + JSONFormatLocaleFile(file,"%s",value); + property=GetNextImageProperty(tile); + } + tile=DestroyImageList(tile); + if (*p != '\0') + (void) FormatLocaleFile(file,"\n },"); + else + (void) FormatLocaleFile(file,"\n }"); + } + (void) FormatLocaleFile(file,"],\n"); + image_info=DestroyImageInfo(image_info); + } + ResetImagePropertyIterator(image); + property=GetNextImageProperty(image); + if (property != (const char *) NULL) + { + size_t + n; + + /* + Display image properties. + */ + n=0; + (void) FormatLocaleFile(file," \"properties\": {\n"); + while (property != (const char *) NULL) + { + if (n++ != 0) + (void) FormatLocaleFile(file,",\n"); + JSONFormatLocaleFile(file," %s: ",property); + value=GetImageProperty(image,property); + JSONFormatLocaleFile(file,"%s",value); + property=GetNextImageProperty(image); + } + (void) FormatLocaleFile(file,"\n },\n"); + } + (void) FormatLocaleString(key,MaxTextExtent,"8BIM:1999,2998:#1"); + value=GetImageProperty(image,key); + if (value != (const char *) NULL) + { + /* + Display clipping path. + */ + JSONFormatLocaleFile(file," \"clipping path\": %s,\n",value); + } + ResetImageProfileIterator(image); + name=GetNextImageProfile(image); + if (name != (char *) NULL) + { + const StringInfo + *profile; + + size_t + n; + + /* + Identify image profiles. + */ + n=0; + (void) FormatLocaleFile(file," \"profiles\": {\n"); + while (name != (char *) NULL) + { + profile=GetImageProfile(image,name); + if (profile == (StringInfo *) NULL) + continue; + if (n++ != 0) + (void) FormatLocaleFile(file,",\n"); + JSONFormatLocaleFile(file," %s: {\n",name); + if (LocaleCompare(name,"iptc") == 0) + EncodeIptcProfile(file,profile); + (void) FormatLocaleFile(file," \"length\": %.20g",(double) + GetStringInfoLength(profile)); + (void) FormatLocaleFile(file,"\n }"); + name=GetNextImageProfile(image); + } + (void) FormatLocaleFile(file,"\n },\n"); + } + ResetImageArtifactIterator(image); + artifact=GetNextImageArtifact(image); + if (artifact != (const char *) NULL) + { + ssize_t + n; + + /* + Display image artifacts. + */ + n=0; + (void) FormatLocaleFile(file," \"artifacts\": {\n"); + while (artifact != (const char *) NULL) + { + if (n++ != 0) + (void) FormatLocaleFile(file,",\n"); + JSONFormatLocaleFile(file," %s: ",artifact); + value=GetImageArtifact(image,artifact); + JSONFormatLocaleFile(file,"%s",value); + artifact=GetNextImageArtifact(image); + } + (void) FormatLocaleFile(file,"\n },\n"); + } + ResetImageRegistryIterator(); + registry=GetNextImageRegistry(); + if (registry != (const char *) NULL) + { + ssize_t + n; + + /* + Display image registry. + */ + (void) FormatLocaleFile(file," \"registry\": {\n"); + n=0; + while (registry != (const char *) NULL) + { + if (n++ != 0) + (void) FormatLocaleFile(file,",\n"); + JSONFormatLocaleFile(file," %s: ",registry); + value=(const char *) GetImageRegistry(StringRegistryType,registry, + exception); + JSONFormatLocaleFile(file,"%s",value); + registry=GetNextImageRegistry(); + } + (void) FormatLocaleFile(file," },\n"); + } + (void) FormatLocaleFile(file," \"tainted\": %s,\n", + image->taint != MagickFalse ? "true" : "false"); + (void) FormatMagickSize(image->extent,MagickFalse,format); + JSONFormatLocaleFile(file," \"filesize\": %s,\n",format); + (void) FormatMagickSize((MagickSizeType) image->columns*image->rows, + MagickFalse,format); + if (strlen(format) > 1) + format[strlen(format)-1]='\0'; + JSONFormatLocaleFile(file," \"numberPixels\": %s,\n",format); + (void) FormatMagickSize((MagickSizeType) ((double) image->columns*image->rows/ + elapsed_time+0.5),MagickFalse,format); + JSONFormatLocaleFile(file," \"pixelsPerSecond\": %s,\n",format); + (void) FormatLocaleFile(file," \"userTime\": \"%0.3fu\",\n",user_time); + (void) FormatLocaleFile(file," \"elapsedTime\": \"%lu:%02lu.%03lu\",\n", + (unsigned long) (elapsed_time/60.0),(unsigned long) ceil(fmod( + elapsed_time,60.0)),(unsigned long) (1000.0*(elapsed_time-floor( + elapsed_time)))); + JSONFormatLocaleFile(file," \"version\": %s\n",GetMagickVersion( + (size_t *) NULL)); + (void) FormatLocaleFile(file," }\n}\n"); + (void) fflush(file); + return(ferror(file) != 0 ? MagickFalse : MagickTrue); +} + +static MagickBooleanType WriteJSONImage(const ImageInfo *image_info, + Image *image) +{ + MagickBooleanType + status; + + MagickOffsetType + scene; + + size_t + number_scenes; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + number_scenes=GetImageListLength(image); + do + { + if (scene == 0) + (void) WriteBlobString(image,"["); + (void) CopyMagickString(image->filename,image->magick_filename, + MaxTextExtent); + image->magick_columns=image->columns; + image->magick_rows=image->rows; + (void) EncodeImageAttributes(image,GetBlobFileHandle(image)); + if (GetNextImageInList(image) == (Image *) NULL) + { + (void) WriteBlobString(image,"]"); + break; + } + (void) WriteBlobString(image,",\n"); + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,number_scenes); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/label.c b/ImageMagick-6.9.12-44/coders/label.c new file mode 100644 index 0000000..7133d55 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/label.c @@ -0,0 +1,359 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L AAA BBBB EEEEE L % +% L A A B B E L % +% L AAAAA BBBB EEE L % +% L A A B B E L % +% LLLLL A A BBBB EEEEE LLLLL % +% % +% % +% Read ASCII String As An Image. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/annotate.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d L A B E L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadLABELImage() reads a LABEL image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadLABELImage method is: +% +% Image *ReadLABELImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline void AdjustTypeMetricBounds(TypeMetric *metrics) +{ + if (metrics->bounds.x1 >= 0.0) + metrics->bounds.x1=0.0; + else + { + double x1 = ceil(-metrics->bounds.x1+0.5); + metrics->width+=x1+x1; + metrics->bounds.x1=x1; + } +} + +static Image *ReadLABELImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + char + geometry[MagickPathExtent], + *label; + + DrawInfo + *draw_info; + + Image + *image; + + MagickBooleanType + status; + + size_t + height, + width; + + TypeMetric + metrics; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + (void) ResetImagePage(image,"0x0+0+0"); + if ((image->columns != 0) && (image->rows != 0)) + { + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + return(DestroyImageList(image)); + (void) SetImageBackgroundColor(image); + } + label=InterpretImageProperties(image_info,image,image_info->filename); + if (label == (char *) NULL) + return(DestroyImageList(image)); + (void) SetImageProperty(image,"label",label); + draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL); + width=(size_t) floor(0.5*draw_info->pointsize*strlen(label)+0.5); + if (AcquireMagickResource(WidthResource,width) == MagickFalse) + { + label=DestroyString(label); + draw_info=DestroyDrawInfo(draw_info); + ThrowReaderException(ImageError,"WidthOrHeightExceedsLimit"); + } + draw_info->text=ConstantString(label); + (void) memset(&metrics,0,sizeof(metrics)); + status=GetMultilineTypeMetrics(image,draw_info,&metrics); + AdjustTypeMetricBounds(&metrics); + if ((image->columns == 0) && (image->rows == 0)) + { + image->columns=(size_t) floor(metrics.width+draw_info->stroke_width+0.5); + image->rows=(size_t) floor(metrics.height+draw_info->stroke_width+0.5); + } + else + if ((status != MagickFalse) && (strlen(label) > 0) && + (((image->columns == 0) || (image->rows == 0)) || + (fabs(image_info->pointsize) < MagickEpsilon))) + { + double + high, + low; + + ssize_t + n; + + /* + Auto fit text into bounding box. + */ + for (n=0; n < 32; n++, draw_info->pointsize*=2.0) + { + (void) FormatLocaleString(geometry,MagickPathExtent,"%+g%+g", + -metrics.bounds.x1,metrics.ascent); + if (draw_info->gravity == UndefinedGravity) + (void) CloneString(&draw_info->geometry,geometry); + status=GetMultilineTypeMetrics(image,draw_info,&metrics); + AdjustTypeMetricBounds(&metrics); + if (status == MagickFalse) + break; + width=(size_t) floor(metrics.width+draw_info->stroke_width+0.5); + height=(size_t) floor(metrics.height+draw_info->stroke_width+0.5); + if ((image->columns != 0) && (image->rows != 0)) + { + if ((width >= image->columns) || (height >= image->rows)) + break; + } + else + if (((image->columns != 0) && (width >= image->columns)) || + ((image->rows != 0) && (height >= image->rows))) + break; + } + if (status == MagickFalse) + { + label=DestroyString(label); + draw_info=DestroyDrawInfo(draw_info); + image=DestroyImageList(image); + return((Image *) NULL); + } + high=draw_info->pointsize; + for (low=1.0; (high-low) > 0.5; ) + { + draw_info->pointsize=(low+high)/2.0; + (void) FormatLocaleString(geometry,MagickPathExtent,"%+g%+g", + -metrics.bounds.x1,metrics.ascent); + if (draw_info->gravity == UndefinedGravity) + (void) CloneString(&draw_info->geometry,geometry); + status=GetMultilineTypeMetrics(image,draw_info,&metrics); + AdjustTypeMetricBounds(&metrics); + if (status == MagickFalse) + break; + width=(size_t) floor(metrics.width+draw_info->stroke_width+0.5); + height=(size_t) floor(metrics.height+draw_info->stroke_width+0.5); + if ((image->columns != 0) && (image->rows != 0)) + { + if ((width < image->columns) && (height < image->rows)) + low=draw_info->pointsize+0.5; + else + high=draw_info->pointsize-0.5; + } + else + if (((image->columns != 0) && (width < image->columns)) || + ((image->rows != 0) && (height < image->rows))) + low=draw_info->pointsize+0.5; + else + high=draw_info->pointsize-0.5; + } + if (status != MagickFalse) + { + draw_info->pointsize=floor((low+high)/2.0-0.5); + status=GetMultilineTypeMetrics(image,draw_info,&metrics); + AdjustTypeMetricBounds(&metrics); + } + } + label=DestroyString(label); + if (status == MagickFalse) + { + draw_info=DestroyDrawInfo(draw_info); + InheritException(exception,&image->exception); + image=DestroyImageList(image); + return((Image *) NULL); + } + if (image->columns == 0) + image->columns=(size_t) floor(metrics.width+draw_info->stroke_width+0.5); + if (image->columns == 0) + image->columns=(size_t) floor(draw_info->pointsize+draw_info->stroke_width+ + 0.5); + if (image->rows == 0) + image->rows=(size_t) floor(metrics.height+draw_info->stroke_width+0.5); + if (image->rows == 0) + image->rows=(size_t) floor(draw_info->pointsize+draw_info->stroke_width+ + 0.5); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + draw_info=DestroyDrawInfo(draw_info); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (SetImageBackgroundColor(image) == MagickFalse) + { + draw_info=DestroyDrawInfo(draw_info); + InheritException(exception,&image->exception); + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Draw label. + */ + (void) FormatLocaleString(geometry,MagickPathExtent,"%+g%+g", + (draw_info->direction == RightToLeftDirection ? (double) image->columns- + metrics.bounds.x2 : metrics.bounds.x1),(draw_info->gravity == + UndefinedGravity ? MagickMax(metrics.ascent,metrics.bounds.y2) : 0.0)); + (void) CloneString(&draw_info->geometry,geometry); + status=AnnotateImage(image,draw_info); + if (image_info->pointsize == 0.0) + (void) FormatImageProperty(image,"label:pointsize","%.20g", + draw_info->pointsize); + draw_info=DestroyDrawInfo(draw_info); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r L A B E L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterLABELImage() adds properties for the LABEL image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterLABELImage method is: +% +% size_t RegisterLABELImage(void) +% +*/ +ModuleExport size_t RegisterLABELImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("LABEL"); + entry->decoder=(DecodeImageHandler *) ReadLABELImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Image label"); + entry->magick_module=ConstantString("LABEL"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r L A B E L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterLABELImage() removes format registrations made by the +% LABEL module from the list of supported formats. +% +% The format of the UnregisterLABELImage method is: +% +% UnregisterLABELImage(void) +% +*/ +ModuleExport void UnregisterLABELImage(void) +{ + (void) UnregisterMagickInfo("LABEL"); +} diff --git a/ImageMagick-6.9.12-44/coders/mac.c b/ImageMagick-6.9.12-44/coders/mac.c new file mode 100644 index 0000000..366a57f --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/mac.c @@ -0,0 +1,320 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% % +% M M AAA CCCC % +% MM MM A A C % +% M M M AAAAA C % +% M M A A C % +% M M A A CCCC % +% % +% % +% Read MacPaint Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M A C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMACImage() reads an MacPaint image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadMACImage method is: +% +% Image *ReadMACImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMACImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + x; + + unsigned char + *p; + + size_t + length; + + ssize_t + offset, + y; + + unsigned char + count, + bit, + byte, + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read MAC X image. + */ + length=ReadBlobLSBShort(image); + if ((length & 0xff) != 0) + ThrowReaderException(CorruptImageError,"CorruptImage"); + for (x=0; x < (ssize_t) 638; x++) + if (ReadBlobByte(image) == EOF) + ThrowReaderException(CorruptImageError,"CorruptImage"); + image->columns=576; + image->rows=720; + image->depth=1; + if (AcquireImageColormap(image,2) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Convert MAC raster image to pixel packets. + */ + length=(image->columns+7)/8; + pixels=(unsigned char *) AcquireQuantumMemory(length+257,sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(pixels,0,(length+257)*sizeof(*pixels)); + p=pixels; + offset=0; + for (y=0; y < (ssize_t) image->rows; ) + { + count=(unsigned char) ReadBlobByte(image); + if (EOFBlob(image) != MagickFalse) + break; + if ((count <= 0) || (count >= 128)) + { + byte=(unsigned char) (~ReadBlobByte(image)); + count=(~count)+2; + while (count != 0) + { + *p++=byte; + offset++; + count--; + if (offset >= (ssize_t) length) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + p=pixels; + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (bit == 0) + byte=(*p++); + SetPixelIndex(indexes+x,((byte & 0x80) != 0 ? 0x01 : 0x00)); + bit++; + byte<<=1; + if (bit == 8) + bit=0; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + offset=0; + p=pixels; + y++; + } + } + continue; + } + count++; + while (count != 0) + { + byte=(unsigned char) (~ReadBlobByte(image)); + *p++=byte; + offset++; + count--; + if (offset >= (ssize_t) length) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + p=pixels; + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (bit == 0) + byte=(*p++); + SetPixelIndex(indexes+x,((byte & 0x80) != 0 ? 0x01 : 0x00)); + bit++; + byte<<=1; + if (bit == 8) + bit=0; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + offset=0; + p=pixels; + y++; + } + } + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + (void) SyncImage(image); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M A C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMACImage() adds attributes for the MAC X image format to the list +% of supported formats. The attributes include the image format tag, a +% method to read and/or write the format, whether the format supports the +% saving of more than one frame to the same file or blob, whether the format +% supports native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterMACImage method is: +% +% size_t RegisterMACImage(void) +% +*/ +ModuleExport size_t RegisterMACImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MAC"); + entry->decoder=(DecodeImageHandler *) ReadMACImage; + entry->description=ConstantString("MAC Paint"); + entry->magick_module=ConstantString("MAC"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M A C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMACImage() removes format registrations made by the +% MAC module from the list of supported formats. +% +% The format of the UnregisterMACImage method is: +% +% UnregisterMACImage(void) +% +*/ +ModuleExport void UnregisterMACImage(void) +{ + (void) UnregisterMagickInfo("MAC"); +} diff --git a/ImageMagick-6.9.12-44/coders/magick.c b/ImageMagick-6.9.12-44/coders/magick.c new file mode 100644 index 0000000..9df60d8 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/magick.c @@ -0,0 +1,13329 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M AAA GGGG IIIII CCCC K K % +% MM MM A A G I C K K % +% M M M AAAAA G GGG I C KKK % +% M M A A G G I C K K % +% M M A A GGGG IIIII CCCC K K % +% % +% % +% Read Embedded ImageMagick Images. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Predefined ImageMagick images. +*/ +static const unsigned char + GraniteImage[] = + { + 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x80, 0x00, 0x80, 0x00, 0xf3, 0x00, + 0x00, 0xa0, 0xa0, 0xa0, 0xa0, 0x98, 0xa0, 0xa9, 0xb2, 0xa9, 0xa0, 0xa9, + 0xa0, 0xbb, 0xbb, 0xc3, 0xbb, 0xbb, 0xbb, 0xa9, 0xb2, 0xb2, 0xa9, 0xa9, + 0xb2, 0xbb, 0xb2, 0xbb, 0xb2, 0xb2, 0xb2, 0xb2, 0xbb, 0xb2, 0xb2, 0xa9, + 0xb2, 0xb2, 0xa9, 0xb2, 0xb2, 0xa9, 0xb2, 0xb2, 0xa9, 0xb2, 0xb2, 0xa9, + 0xb2, 0x21, 0xf9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xfe, 0x29, + 0x20, 0x20, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x47, 0x49, 0x46, 0x20, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x3a, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2e, 0x67, 0x69, 0x66, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x04, 0xfe, 0x70, 0x15, 0x54, 0x52, 0x2a, 0xea, + 0x24, 0x64, 0x13, 0x39, 0x9a, 0x64, 0x21, 0xc6, 0xb2, 0x9d, 0x8b, 0x30, + 0x9e, 0x88, 0xb2, 0x28, 0x45, 0x11, 0x76, 0xef, 0x45, 0x58, 0x45, 0xca, + 0x99, 0x0b, 0x38, 0x00, 0x07, 0x53, 0x48, 0x60, 0xfa, 0xcc, 0x7a, 0x08, + 0xe0, 0xe5, 0xc0, 0x01, 0x81, 0x10, 0xc4, 0xc4, 0xa1, 0x70, 0xe3, 0xec, + 0x14, 0x56, 0xc0, 0x02, 0xa8, 0xb8, 0x60, 0x78, 0x0a, 0x42, 0x2c, 0x61, + 0x20, 0x79, 0x62, 0x94, 0x43, 0x18, 0x4b, 0x35, 0x1c, 0x06, 0xea, 0x16, + 0x86, 0x4c, 0xc0, 0xc2, 0xca, 0x06, 0xcf, 0x85, 0x4c, 0x21, 0xef, 0xcb, + 0x5d, 0x04, 0x04, 0x79, 0x6e, 0x06, 0x62, 0x83, 0x52, 0x7e, 0x65, 0x32, + 0x86, 0x40, 0x32, 0x54, 0x19, 0x70, 0x06, 0x63, 0x09, 0x00, 0x02, 0x6a, + 0x75, 0x54, 0x62, 0x09, 0x61, 0x54, 0x9e, 0x82, 0x05, 0x3f, 0x13, 0x2a, + 0x5d, 0x00, 0x09, 0x03, 0x36, 0x31, 0x48, 0x9d, 0x62, 0x26, 0x3b, 0x41, + 0x4c, 0x1b, 0x5a, 0x00, 0x14, 0x5b, 0x53, 0x55, 0x09, 0xae, 0x13, 0x31, + 0x58, 0x67, 0x55, 0x39, 0x63, 0x3d, 0xb6, 0x41, 0xb9, 0x67, 0x3b, 0xb9, + 0x53, 0x1b, 0xc4, 0x37, 0x15, 0x14, 0xb5, 0x13, 0xc4, 0x05, 0x8e, 0x37, + 0x12, 0x15, 0xc2, 0x07, 0x55, 0xc4, 0x0b, 0x03, 0x12, 0x1f, 0x42, 0xb1, + 0x12, 0x12, 0x79, 0x5d, 0x9f, 0x15, 0x15, 0x91, 0x64, 0x6f, 0xea, 0x79, + 0x15, 0x44, 0x5d, 0x30, 0x90, 0x9b, 0x15, 0x06, 0x4a, 0x97, 0x31, 0x6e, + 0xac, 0x39, 0x40, 0xe3, 0x88, 0xf3, 0x09, 0x2a, 0x41, 0x4c, 0xb9, 0x91, + 0x61, 0xe1, 0x52, 0x40, 0x25, 0x9e, 0x4e, 0x01, 0x38, 0xe7, 0x84, 0xcb, + 0x9e, 0x79, 0x1a, 0x4e, 0x81, 0xc0, 0x00, 0xa4, 0x45, 0x9d, 0x87, 0x39, + 0x7c, 0xed, 0x3a, 0x40, 0x2b, 0x8a, 0x90, 0x0d, 0xfe, 0x5d, 0x12, 0x09, + 0x73, 0x11, 0x64, 0x97, 0x15, 0x2a, 0x95, 0x98, 0xb8, 0xd0, 0xd7, 0xe3, + 0xc6, 0x8d, 0x37, 0x38, 0x3c, 0x7a, 0x92, 0xd0, 0x90, 0xa6, 0x8b, 0x5c, + 0x5d, 0xa6, 0x80, 0x58, 0xd0, 0xaa, 0x64, 0xae, 0x1e, 0x3b, 0x8b, 0xd5, + 0xf2, 0x22, 0x86, 0x02, 0x01, 0x20, 0x1c, 0xb5, 0x50, 0x01, 0x11, 0x52, + 0x82, 0x29, 0x19, 0x3f, 0x7c, 0x1c, 0x98, 0xb4, 0x2b, 0xc6, 0x45, 0x36, + 0x87, 0xac, 0x1e, 0x2a, 0x31, 0x60, 0xd0, 0x16, 0x00, 0xb4, 0xdc, 0x48, + 0x41, 0x55, 0x46, 0x92, 0x99, 0x0a, 0x3f, 0x0c, 0x45, 0x9a, 0xca, 0xa9, + 0x92, 0x18, 0x98, 0x03, 0xd2, 0xec, 0xda, 0x3a, 0xb5, 0xce, 0xd5, 0x54, + 0x75, 0x91, 0x6e, 0x53, 0x33, 0xc6, 0x45, 0x1e, 0xb2, 0x64, 0x30, 0x14, + 0x28, 0xc1, 0x2e, 0x87, 0xca, 0x6c, 0x45, 0x94, 0xf1, 0x98, 0x70, 0x46, + 0x57, 0x51, 0x62, 0x08, 0x1a, 0x32, 0x89, 0x65, 0x45, 0xd6, 0xd0, 0x9e, + 0x26, 0xac, 0x21, 0xab, 0x56, 0x72, 0x8b, 0x2b, 0x58, 0x34, 0x99, 0x54, + 0x65, 0x7c, 0xf2, 0xe3, 0xcb, 0xcd, 0x32, 0x94, 0x1e, 0x73, 0x69, 0x98, + 0x42, 0x05, 0x31, 0xe3, 0x52, 0xa5, 0xc3, 0x61, 0x61, 0x41, 0x9e, 0x29, + 0x9d, 0xf8, 0x76, 0x71, 0xf3, 0x03, 0xd5, 0x6e, 0xa4, 0x1a, 0x80, 0xec, + 0x03, 0x9b, 0x8e, 0x2c, 0x47, 0x0d, 0x57, 0x09, 0x74, 0xf5, 0xc4, 0x56, + 0x54, 0x52, 0x6c, 0xec, 0x44, 0x30, 0x47, 0xcb, 0x17, 0x2c, 0x97, 0x64, + 0x77, 0x4e, 0xfd, 0x71, 0x92, 0x61, 0x37, 0x1a, 0x72, 0xcb, 0x3c, 0x59, + 0x35, 0x99, 0x10, 0x52, 0xed, 0x58, 0x31, 0x8e, 0xcb, 0xd0, 0x80, 0x52, + 0x55, 0x90, 0x12, 0x44, 0x60, 0x69, 0x48, 0x0a, 0x67, 0xc3, 0xa5, 0x0b, + 0x2a, 0xd6, 0xef, 0x8c, 0x46, 0x92, 0x26, 0xce, 0x6e, 0x0a, 0x2c, 0xfe, + 0xc4, 0x41, 0x4c, 0x3c, 0xdc, 0x27, 0x82, 0x46, 0xd4, 0x18, 0xc6, 0x89, + 0x66, 0x2f, 0x50, 0x23, 0xc0, 0x53, 0x6f, 0x00, 0x00, 0x07, 0x3c, 0xa7, + 0xbc, 0xd0, 0x57, 0x1d, 0x2d, 0xd8, 0x40, 0x4f, 0x5c, 0x20, 0xb0, 0x33, + 0x48, 0x0b, 0x00, 0xc4, 0xb6, 0x06, 0x27, 0x83, 0x54, 0xa4, 0x81, 0x21, + 0xb7, 0xa5, 0x03, 0x0b, 0x52, 0x92, 0x48, 0xc1, 0x91, 0x08, 0x58, 0xe4, + 0x01, 0x4a, 0x3f, 0x6d, 0x9d, 0x73, 0x08, 0x28, 0x0f, 0x7d, 0x78, 0xcf, + 0x20, 0x82, 0x88, 0x11, 0x22, 0x26, 0x80, 0x24, 0x02, 0xd6, 0x8b, 0xa9, + 0x85, 0x53, 0xe4, 0x2e, 0x40, 0x79, 0xc2, 0x41, 0x33, 0xc7, 0x45, 0x16, + 0x02, 0x2d, 0x27, 0xfc, 0xf2, 0x12, 0x38, 0xc7, 0x69, 0x81, 0x84, 0x50, + 0x19, 0xf5, 0xa0, 0x9f, 0x91, 0x1f, 0x3c, 0x73, 0x5a, 0x12, 0x49, 0x08, + 0x53, 0x95, 0x31, 0x2c, 0xa0, 0xe6, 0x9a, 0x8b, 0x1c, 0xb4, 0x72, 0x46, + 0x05, 0x41, 0x50, 0xf0, 0xd7, 0x1f, 0x89, 0xcc, 0x63, 0xdb, 0x05, 0x29, + 0x0c, 0xe6, 0xc7, 0x3b, 0x16, 0x96, 0xa2, 0x86, 0x86, 0x5e, 0xd0, 0x03, + 0xc0, 0x5b, 0x84, 0xf5, 0xa0, 0x1d, 0x6f, 0x21, 0x98, 0x63, 0x1b, 0x26, + 0xe4, 0xf4, 0xf1, 0x8e, 0x44, 0x03, 0x58, 0x85, 0x0f, 0xa2, 0x87, 0x04, + 0x18, 0x06, 0x8a, 0x7c, 0xc5, 0x50, 0xde, 0x78, 0xb7, 0x74, 0x31, 0x92, + 0x06, 0x7d, 0x30, 0x81, 0xca, 0x05, 0x19, 0x30, 0x51, 0x42, 0x25, 0x0b, + 0x19, 0x06, 0x02, 0x58, 0x3c, 0x18, 0x92, 0xcb, 0xa7, 0xaf, 0xa1, 0x54, + 0x84, 0x61, 0xdf, 0x7c, 0x81, 0x02, 0x08, 0xb9, 0x24, 0x84, 0x93, 0x4b, + 0x1e, 0x05, 0x07, 0x40, 0x06, 0xd6, 0x71, 0x9a, 0x81, 0x14, 0x48, 0x76, + 0xd0, 0x8a, 0xa5, 0x46, 0x99, 0x93, 0x55, 0x51, 0x29, 0x95, 0x70, 0x4e, + 0x22, 0x30, 0xfe, 0x58, 0x50, 0x88, 0x0d, 0x19, 0xb8, 0xa1, 0x02, 0x21, + 0x17, 0x44, 0xc6, 0x09, 0x02, 0xa8, 0xc0, 0xe1, 0x5b, 0x1f, 0x8b, 0x8c, + 0x71, 0x8e, 0x19, 0xbb, 0x4d, 0x45, 0x02, 0x5b, 0x86, 0x08, 0x42, 0x88, + 0x74, 0x6c, 0x09, 0x02, 0x47, 0xaf, 0xcf, 0x2d, 0xf0, 0x02, 0x36, 0x07, + 0xe4, 0xf7, 0x2e, 0xa5, 0x86, 0xd8, 0x48, 0xad, 0xb3, 0xa9, 0x58, 0x64, + 0xc2, 0x08, 0x8c, 0xa9, 0xb2, 0x87, 0x6b, 0x28, 0x39, 0xa3, 0x87, 0x91, + 0xae, 0x9c, 0x70, 0x0b, 0x31, 0x53, 0x7c, 0xb6, 0x1a, 0x96, 0xc7, 0xf0, + 0xd0, 0x19, 0xc2, 0x2f, 0x6e, 0xe1, 0x0d, 0x32, 0x68, 0x00, 0xb1, 0x00, + 0x02, 0x18, 0xeb, 0x83, 0xed, 0x57, 0xb4, 0x4c, 0x91, 0x5a, 0x1c, 0x8d, + 0xe9, 0x51, 0x19, 0x35, 0xa2, 0x51, 0x01, 0x87, 0x3f, 0xb7, 0x5d, 0x44, + 0x08, 0x1a, 0x54, 0xc9, 0x43, 0x07, 0x2f, 0x18, 0x44, 0x2a, 0x86, 0x2a, + 0xcb, 0x0d, 0x86, 0x86, 0x0c, 0x61, 0x00, 0xd4, 0x20, 0x74, 0x9b, 0x84, + 0x1a, 0x21, 0x36, 0x9f, 0x92, 0x11, 0xe2, 0x3f, 0x48, 0x11, 0x04, 0x27, + 0x44, 0x49, 0x80, 0xa5, 0x5f, 0xa8, 0x42, 0xbb, 0xdb, 0x06, 0x8f, 0xa9, + 0x55, 0xcb, 0x11, 0x1a, 0x5e, 0x64, 0x06, 0x8c, 0x35, 0x32, 0xc4, 0x57, + 0xac, 0x45, 0xbc, 0x2c, 0x56, 0xad, 0x1d, 0xd9, 0xbc, 0xe8, 0xc5, 0x8b, + 0x08, 0x4d, 0x00, 0xc4, 0x83, 0x20, 0x5c, 0x02, 0x65, 0xa9, 0xb4, 0x62, + 0x62, 0x98, 0xc5, 0x03, 0x97, 0x54, 0x4b, 0x10, 0xbf, 0xbe, 0xab, 0x44, + 0x6d, 0x97, 0xb8, 0x9b, 0x87, 0x07, 0x6b, 0x58, 0xcb, 0x9d, 0x56, 0x47, + 0x71, 0x72, 0x8b, 0x34, 0x39, 0x29, 0x51, 0x2f, 0x06, 0xa7, 0x52, 0x4b, + 0xce, 0xa0, 0x8a, 0x54, 0xeb, 0xe7, 0x8f, 0xd7, 0xc5, 0x76, 0xb2, 0x11, + 0x6e, 0x40, 0x08, 0xdd, 0xd0, 0xfe, 0xbf, 0x4a, 0xe8, 0xc1, 0x26, 0xf4, + 0xa8, 0x04, 0xd6, 0x20, 0x4e, 0xc8, 0xc2, 0x11, 0xb4, 0x17, 0x7d, 0x32, + 0x90, 0xe0, 0x43, 0xc2, 0x34, 0x5e, 0x64, 0x3b, 0x40, 0xa9, 0x86, 0x09, + 0x5a, 0x2c, 0x49, 0xde, 0x92, 0x4e, 0x9c, 0x44, 0xf2, 0x0d, 0x43, 0x42, + 0x71, 0x6a, 0x52, 0x40, 0xf5, 0x80, 0xea, 0x66, 0x2e, 0x22, 0x81, 0xf0, + 0x42, 0xbd, 0xd2, 0x42, 0x9a, 0x0c, 0x01, 0x2c, 0x16, 0x19, 0x70, 0x9e, + 0x6d, 0xd0, 0x2f, 0x92, 0x58, 0xd0, 0xca, 0xfa, 0x4f, 0xc5, 0x02, 0x46, + 0x55, 0x60, 0x38, 0xdc, 0xb0, 0x07, 0x60, 0x63, 0x09, 0x07, 0x96, 0xe2, + 0x7d, 0xfa, 0xa8, 0xd4, 0x51, 0xb6, 0xd5, 0x71, 0x1c, 0x6e, 0xaf, 0x93, + 0xa3, 0xb2, 0x44, 0x52, 0x8d, 0x33, 0x95, 0x9d, 0xd4, 0x0a, 0x97, 0xce, + 0xb4, 0xc7, 0x75, 0xe2, 0xc7, 0x3d, 0x6c, 0x99, 0xe3, 0x62, 0xb4, 0x7d, + 0xf0, 0x72, 0xc8, 0x62, 0x3c, 0x90, 0x05, 0x83, 0x8a, 0xc4, 0x0d, 0xe0, + 0x90, 0x2a, 0x33, 0xc8, 0x48, 0x58, 0x31, 0x5e, 0x05, 0xa6, 0xbd, 0x09, + 0x4a, 0x25, 0xbe, 0xea, 0x52, 0x18, 0x56, 0x15, 0x94, 0x11, 0xb8, 0x40, + 0x09, 0x57, 0x02, 0x8a, 0xf4, 0x32, 0x52, 0x11, 0x24, 0xd9, 0x6a, 0x5f, + 0xb5, 0xd2, 0x12, 0x9b, 0xe2, 0x65, 0x81, 0xac, 0xd4, 0xa9, 0x2e, 0x1b, + 0x18, 0x87, 0xa2, 0x6a, 0x00, 0x0f, 0xaf, 0xf0, 0xc2, 0x22, 0x84, 0x98, + 0xca, 0xa1, 0xde, 0x93, 0x2c, 0x1e, 0x95, 0xa2, 0x2d, 0x04, 0xc8, 0x50, + 0xbd, 0xae, 0x45, 0xa8, 0x90, 0xb4, 0x80, 0x56, 0x31, 0x68, 0x51, 0x8c, + 0xee, 0xc7, 0x1e, 0xb5, 0xd8, 0xf0, 0x10, 0x27, 0x92, 0x87, 0xb7, 0xec, + 0xf2, 0x0e, 0x1d, 0x92, 0xe0, 0x2d, 0x79, 0x3b, 0x81, 0x0c, 0x86, 0xf2, + 0x8c, 0xc8, 0x24, 0xa6, 0x1b, 0x8c, 0x31, 0xcd, 0xfe, 0xaa, 0x9a, 0x20, + 0xc5, 0x32, 0x59, 0xcd, 0x19, 0xb1, 0x78, 0x89, 0x12, 0x9e, 0x21, 0x0c, + 0x91, 0x24, 0x30, 0x23, 0x69, 0xca, 0x92, 0x7c, 0x90, 0x71, 0x12, 0x8c, + 0xe9, 0xa2, 0x60, 0xe1, 0x58, 0xa0, 0xf3, 0x5c, 0x43, 0x0c, 0x54, 0xa5, + 0x27, 0x38, 0xcf, 0x19, 0x8c, 0x84, 0xec, 0x58, 0xba, 0x2f, 0xc0, 0xe0, + 0x44, 0x52, 0x80, 0x42, 0x5b, 0x6e, 0x33, 0x95, 0xf7, 0xe5, 0x41, 0x0b, + 0xbb, 0xb9, 0x9f, 0xf9, 0x16, 0x85, 0x8f, 0x0e, 0xb8, 0xcf, 0x02, 0x89, + 0x4c, 0x64, 0x0e, 0x1a, 0x75, 0x48, 0x19, 0x5e, 0x4f, 0x53, 0x96, 0xe0, + 0x11, 0x3f, 0xda, 0xf0, 0x0f, 0xc1, 0x3d, 0x2b, 0x7e, 0x4b, 0xd8, 0x42, + 0x13, 0x3a, 0xb3, 0x2a, 0x2d, 0xd5, 0x4a, 0x4d, 0x4c, 0x72, 0x46, 0x7a, + 0x4a, 0x78, 0x13, 0x27, 0x54, 0xc9, 0x11, 0x9c, 0x52, 0x56, 0x0a, 0x7c, + 0x25, 0x05, 0x8e, 0xbd, 0x6b, 0x55, 0x2e, 0x12, 0xca, 0x29, 0x3b, 0x50, + 0x01, 0x3a, 0xa9, 0x60, 0x0f, 0x45, 0xe9, 0x84, 0x69, 0xb0, 0x32, 0x01, + 0x61, 0x9e, 0x81, 0x3d, 0x13, 0x81, 0x99, 0xb1, 0x18, 0xf1, 0xc4, 0xa5, + 0x90, 0x48, 0x2c, 0x76, 0xe9, 0xd6, 0xe2, 0x46, 0x54, 0x16, 0x0b, 0x78, + 0x6f, 0x57, 0x64, 0x68, 0x90, 0x1d, 0xae, 0x15, 0x2d, 0x98, 0x9c, 0xea, + 0x47, 0x13, 0x2a, 0x1d, 0xe8, 0x4c, 0xa6, 0x06, 0x09, 0xb1, 0x25, 0x10, + 0xca, 0x49, 0x06, 0x24, 0xca, 0x97, 0x90, 0x0e, 0x19, 0x85, 0x10, 0xe2, + 0xdc, 0x07, 0xb6, 0xb0, 0xf1, 0xab, 0x51, 0x16, 0x2c, 0x4c, 0x72, 0xb4, + 0x06, 0x38, 0x12, 0x71, 0xa6, 0x34, 0x25, 0xb0, 0x4c, 0xab, 0x21, 0xcd, + 0x64, 0x3e, 0xa3, 0x8b, 0x26, 0xe8, 0x25, 0x4b, 0x6c, 0x34, 0xd5, 0x64, + 0x12, 0x34, 0xc0, 0x89, 0x15, 0x45, 0x2f, 0xca, 0xa8, 0x88, 0xf3, 0xfe, + 0xae, 0xe8, 0x05, 0xda, 0xed, 0x82, 0x13, 0x73, 0x9a, 0x80, 0x88, 0xd6, + 0x41, 0x2e, 0x72, 0xed, 0x41, 0x7d, 0xcf, 0x4a, 0xa4, 0x71, 0x22, 0x99, + 0x8e, 0x45, 0xf1, 0x4a, 0x37, 0x77, 0xda, 0xd3, 0xd9, 0x86, 0x06, 0x91, + 0xb5, 0x08, 0xe4, 0x4e, 0x24, 0x32, 0xc7, 0x18, 0xdc, 0xa0, 0x81, 0xee, + 0x20, 0x4a, 0x77, 0xf5, 0x3a, 0x67, 0x60, 0x84, 0x93, 0x93, 0x78, 0x3d, + 0xa1, 0x3f, 0x66, 0x8b, 0x88, 0x7d, 0x46, 0x52, 0x1b, 0x1c, 0x00, 0x85, + 0x05, 0x96, 0xe2, 0x94, 0xbc, 0x22, 0xb2, 0x13, 0x2e, 0x78, 0x46, 0x4f, + 0x8e, 0xd8, 0x97, 0x4a, 0xc0, 0x70, 0x3e, 0xa0, 0x70, 0x23, 0x20, 0x2e, + 0xd2, 0x02, 0x6a, 0x6a, 0x40, 0xb7, 0x00, 0x96, 0x11, 0x07, 0x47, 0xd2, + 0xa0, 0x11, 0xa5, 0xb0, 0xb2, 0x2e, 0x70, 0x83, 0x90, 0xf3, 0x68, 0x66, + 0x9e, 0xf2, 0x17, 0x18, 0x88, 0x74, 0xe5, 0x36, 0x46, 0xf1, 0x0b, 0x0f, + 0x87, 0x54, 0x08, 0x8b, 0xac, 0xc5, 0x59, 0x18, 0x42, 0x8b, 0x6d, 0xf6, + 0x12, 0x0b, 0x75, 0x38, 0x8b, 0x5c, 0xbb, 0x9a, 0x67, 0x06, 0xee, 0xf1, + 0x07, 0x27, 0x1a, 0x40, 0x00, 0xd7, 0x53, 0x4a, 0x5f, 0xe0, 0xb5, 0x1f, + 0x04, 0x36, 0xcf, 0xab, 0x58, 0xba, 0x86, 0x04, 0x8e, 0x21, 0xb0, 0xc9, + 0x42, 0xa9, 0x16, 0x5a, 0x2d, 0xe3, 0x51, 0x81, 0x92, 0xba, 0x81, 0x16, + 0xc3, 0x62, 0x03, 0x0d, 0x82, 0x00, 0x96, 0xa7, 0x8d, 0x38, 0x01, 0x51, + 0x97, 0x61, 0x9a, 0x4b, 0x2e, 0x50, 0xd5, 0x26, 0x63, 0xcc, 0xe4, 0x04, + 0xd1, 0xda, 0x86, 0x29, 0xd8, 0x32, 0x91, 0x74, 0xc4, 0x66, 0x20, 0x88, + 0x78, 0xd3, 0xb2, 0xa8, 0x45, 0xd8, 0xc9, 0xf9, 0xa3, 0x0d, 0xb4, 0xfa, + 0x64, 0x0a, 0xe6, 0x54, 0x82, 0xdf, 0x70, 0x83, 0x42, 0x1a, 0x98, 0x90, + 0x6d, 0x53, 0xfe, 0xc0, 0x87, 0x4b, 0xc4, 0x90, 0x1f, 0x95, 0x6c, 0x69, + 0x49, 0x18, 0x92, 0x03, 0xb5, 0xf0, 0x49, 0xa6, 0x42, 0x60, 0x43, 0x32, + 0x40, 0x65, 0x83, 0x53, 0x72, 0x63, 0x09, 0x56, 0x3a, 0x1e, 0xc1, 0x9c, + 0x67, 0x81, 0xd7, 0x75, 0x0d, 0x27, 0x60, 0x75, 0xd8, 0x4e, 0x5a, 0x43, + 0x53, 0xcf, 0x20, 0xac, 0xba, 0x56, 0x50, 0xd6, 0x0f, 0x91, 0xfa, 0x8a, + 0x17, 0x7c, 0x63, 0x0a, 0x50, 0xf8, 0xa2, 0x14, 0x9e, 0x32, 0xc5, 0x0b, + 0x4c, 0x02, 0x11, 0x82, 0x58, 0x94, 0xc9, 0x3e, 0x3a, 0xc8, 0x4e, 0xa9, + 0x63, 0x0a, 0x9b, 0x14, 0x9a, 0x29, 0xc8, 0xeb, 0xb3, 0xd9, 0x5a, 0xea, + 0x5c, 0x0e, 0x54, 0x2e, 0x3d, 0xd4, 0x12, 0x07, 0x55, 0xed, 0xb1, 0x43, + 0x18, 0x12, 0x40, 0x51, 0x08, 0x61, 0x86, 0x67, 0x89, 0xca, 0x0f, 0x70, + 0xc8, 0xe1, 0x88, 0x7a, 0xb9, 0x0d, 0x47, 0xf6, 0x48, 0x13, 0xbb, 0xcc, + 0x0a, 0x65, 0x81, 0x23, 0x37, 0x5a, 0x75, 0xa3, 0x33, 0xc2, 0x99, 0x8f, + 0x52, 0x8e, 0x13, 0xbc, 0x0e, 0x58, 0x71, 0x54, 0x4e, 0x72, 0xa5, 0x8b, + 0x49, 0xb3, 0xc0, 0xf8, 0x20, 0x01, 0x8d, 0x7d, 0x45, 0x2a, 0x7e, 0x8f, + 0x47, 0xb5, 0x32, 0xe2, 0x17, 0x16, 0x55, 0xa4, 0x82, 0xee, 0x1e, 0x61, + 0x97, 0xb9, 0xb4, 0xe3, 0x65, 0x5f, 0xd3, 0x15, 0x89, 0xcc, 0x3a, 0x95, + 0x1f, 0x85, 0xe4, 0x2d, 0x92, 0x60, 0x2b, 0x21, 0x21, 0xe9, 0x15, 0xb2, + 0x66, 0xb3, 0x1d, 0xc4, 0x69, 0x2f, 0x60, 0xd6, 0x60, 0xce, 0xc5, 0x2d, + 0x6b, 0x25, 0xca, 0x61, 0x27, 0x1d, 0xde, 0x51, 0x48, 0xde, 0xca, 0x23, + 0xb7, 0x24, 0x52, 0x4a, 0x53, 0x7a, 0x31, 0x1e, 0x15, 0x1b, 0xc4, 0xbe, + 0x4e, 0x05, 0x89, 0x98, 0x92, 0x20, 0xd4, 0xfc, 0xd2, 0xed, 0x3c, 0xe1, + 0x40, 0x05, 0x31, 0xfe, 0x71, 0xfe, 0x92, 0x02, 0xc4, 0x27, 0x5e, 0x7b, + 0x2e, 0x66, 0xb5, 0x46, 0xdb, 0xa1, 0xda, 0x4c, 0xd0, 0x8a, 0xa3, 0xcd, + 0xd2, 0xa1, 0x7f, 0xc9, 0x45, 0xab, 0x50, 0xe6, 0x38, 0x01, 0xd8, 0x8f, + 0x19, 0x66, 0xe6, 0x01, 0x70, 0x81, 0x4e, 0x0b, 0xff, 0x2d, 0xdd, 0x12, + 0x62, 0x28, 0xd7, 0xda, 0xe2, 0xa1, 0x15, 0x30, 0xe8, 0x66, 0x09, 0x62, + 0xac, 0x0d, 0x36, 0x95, 0x50, 0x3f, 0x7b, 0x2b, 0xef, 0x6c, 0x6d, 0x01, + 0xea, 0xfb, 0xd1, 0x49, 0x06, 0x39, 0x94, 0x5c, 0x73, 0xdc, 0xf6, 0xcc, + 0xc1, 0xcc, 0x69, 0x44, 0x1f, 0x38, 0x9d, 0x80, 0xd8, 0x28, 0x1a, 0x6a, + 0xa0, 0x60, 0x8e, 0x04, 0x81, 0xa3, 0x19, 0x21, 0x3b, 0xb7, 0x3d, 0xff, + 0x53, 0xbd, 0x71, 0xd9, 0x0c, 0x4d, 0x57, 0x40, 0xab, 0xef, 0x86, 0x03, + 0x61, 0x21, 0x94, 0xcf, 0x18, 0x8c, 0xe2, 0x3c, 0x4e, 0x21, 0xe0, 0x9e, + 0xc0, 0x28, 0x16, 0xb2, 0x26, 0xbb, 0x04, 0x0d, 0xdc, 0x27, 0x1d, 0xed, + 0xd8, 0x93, 0xfd, 0x2c, 0x75, 0x14, 0xcd, 0x75, 0xa7, 0xc4, 0x21, 0x45, + 0x37, 0x9c, 0x51, 0xf1, 0x64, 0xde, 0xda, 0x16, 0x5a, 0x85, 0x9c, 0x16, + 0x2f, 0x61, 0xaa, 0x2b, 0x1a, 0x9a, 0xa7, 0x10, 0x7b, 0x9a, 0x09, 0x3b, + 0x88, 0xa6, 0xac, 0x3a, 0x68, 0xb3, 0x67, 0x8d, 0x73, 0x86, 0x81, 0x1e, + 0xed, 0xc3, 0x95, 0xbc, 0xb8, 0x05, 0x1a, 0x74, 0xc2, 0x77, 0xe7, 0xe0, + 0x2a, 0x93, 0x65, 0xe6, 0x00, 0x01, 0xc0, 0x49, 0x9a, 0x48, 0x02, 0x13, + 0xf4, 0x6e, 0x30, 0x28, 0x10, 0xcf, 0x05, 0xa5, 0x13, 0xc1, 0xa9, 0xea, + 0xfe, 0xb8, 0x36, 0x19, 0x11, 0x1b, 0xdc, 0x44, 0xd0, 0x55, 0x1f, 0xd4, + 0xb2, 0x33, 0xaa, 0x90, 0x53, 0x27, 0xcc, 0x20, 0xaa, 0xd7, 0x61, 0x83, + 0xb0, 0x0c, 0x5e, 0x07, 0x81, 0x77, 0x63, 0x60, 0xfe, 0x49, 0xd8, 0x29, + 0x21, 0xb0, 0xf1, 0x0a, 0x5c, 0xf7, 0x36, 0x91, 0xd8, 0x98, 0xab, 0x5a, + 0x80, 0x79, 0x84, 0xf7, 0xce, 0xf9, 0xae, 0x80, 0xe8, 0x84, 0xe7, 0x6d, + 0x30, 0x83, 0x97, 0x9f, 0xc5, 0x88, 0x32, 0xe9, 0xf3, 0x33, 0x9c, 0x92, + 0x45, 0x00, 0xe7, 0x73, 0xec, 0x8f, 0xf0, 0xd9, 0x09, 0x93, 0xdd, 0xf1, + 0xc4, 0xb6, 0xb6, 0xcf, 0xcf, 0xac, 0x40, 0xd9, 0x46, 0x80, 0x8c, 0x8d, + 0x5d, 0xf4, 0x04, 0x16, 0xa8, 0xc7, 0xc5, 0x7f, 0x52, 0x92, 0xf3, 0x58, + 0x03, 0xc6, 0xfa, 0x7a, 0xb2, 0x46, 0xda, 0x41, 0xc7, 0x84, 0x2a, 0xbc, + 0x66, 0x46, 0x2d, 0xa4, 0x71, 0xb1, 0x3d, 0xa9, 0xb9, 0x11, 0x5d, 0x5e, + 0xc4, 0xfd, 0x60, 0x1f, 0x89, 0x78, 0x90, 0x0b, 0x82, 0xb6, 0x1b, 0x84, + 0xe3, 0x03, 0x71, 0x3b, 0x8c, 0x21, 0x5a, 0xea, 0xc1, 0x16, 0x0d, 0x33, + 0x24, 0x99, 0xea, 0xab, 0x6e, 0x21, 0x9f, 0x52, 0x51, 0x6b, 0x8f, 0xfc, + 0x38, 0x87, 0xb6, 0xf1, 0x04, 0x43, 0x97, 0x98, 0x3e, 0x64, 0x36, 0x6d, + 0xf6, 0xd4, 0x76, 0x1f, 0xc6, 0xf2, 0x22, 0x38, 0x88, 0x26, 0xbd, 0x1e, + 0x7b, 0x42, 0x91, 0x8c, 0x7a, 0x13, 0x0c, 0x64, 0x8c, 0x56, 0x04, 0x30, + 0x50, 0xcd, 0x48, 0x2c, 0xdf, 0x99, 0x64, 0x84, 0x64, 0x4b, 0x02, 0x3c, + 0xad, 0x7c, 0x96, 0x93, 0x1a, 0x78, 0xd8, 0xa3, 0xe3, 0xa0, 0xeb, 0x3c, + 0xe1, 0x43, 0x82, 0x8a, 0x68, 0xab, 0x90, 0x51, 0x59, 0x10, 0x16, 0xa2, + 0x62, 0x9b, 0xc1, 0x48, 0xbd, 0x41, 0x84, 0xf2, 0x89, 0x7f, 0x6d, 0xd8, + 0x01, 0xdf, 0x94, 0x88, 0x3d, 0x1e, 0x78, 0x41, 0x0b, 0x32, 0x54, 0xcc, + 0xf6, 0xe4, 0xb5, 0xd3, 0x32, 0xe5, 0x22, 0xb7, 0x83, 0x92, 0x75, 0x92, + 0x7d, 0x55, 0xed, 0x70, 0x43, 0x03, 0x68, 0xf2, 0x29, 0x14, 0x5a, 0xfe, + 0x75, 0x90, 0xb2, 0xd1, 0x46, 0x95, 0x56, 0x81, 0x1f, 0xb2, 0x57, 0x14, + 0xca, 0xd8, 0x50, 0xa0, 0x58, 0x9a, 0xb5, 0x1e, 0x1f, 0xe1, 0x58, 0x90, + 0x21, 0x77, 0x61, 0x50, 0x53, 0x52, 0xa0, 0x1c, 0x8c, 0x73, 0x32, 0xba, + 0x51, 0x48, 0x29, 0x47, 0x18, 0x15, 0xd2, 0x42, 0x36, 0xb2, 0x38, 0xdb, + 0x37, 0x0e, 0x73, 0xc0, 0x66, 0xbd, 0x61, 0x27, 0x37, 0xe1, 0x07, 0x2a, + 0x10, 0x15, 0x85, 0xd4, 0x68, 0x62, 0xd1, 0x20, 0x31, 0x60, 0x0f, 0x6d, + 0xc1, 0x13, 0xe8, 0x10, 0x43, 0xa6, 0xb0, 0x2e, 0x95, 0x40, 0x7e, 0xff, + 0xc0, 0x39, 0xc2, 0x42, 0x41, 0x9e, 0xa2, 0x6c, 0x3a, 0x70, 0x47, 0xfb, + 0x05, 0x14, 0x02, 0x30, 0x42, 0x5e, 0xd5, 0x35, 0xc4, 0x32, 0x30, 0xe5, + 0x01, 0x71, 0x13, 0xe0, 0x7a, 0xca, 0x33, 0x7a, 0x44, 0xa0, 0x36, 0x35, + 0xa0, 0x55, 0x32, 0x84, 0x1b, 0xfb, 0x55, 0x5a, 0x44, 0xa5, 0x67, 0x53, + 0xf5, 0x7b, 0x19, 0x31, 0x02, 0x6d, 0xd3, 0x1f, 0xd8, 0xb0, 0x0d, 0x4c, + 0xa4, 0x07, 0xec, 0xa0, 0x0e, 0xd3, 0x37, 0x34, 0xcf, 0xd5, 0x17, 0x75, + 0xd2, 0x4b, 0xe9, 0x54, 0x5c, 0x3d, 0x82, 0x4e, 0x32, 0xb7, 0x1e, 0x13, + 0x42, 0x5c, 0x7c, 0x56, 0x5c, 0x49, 0x98, 0x30, 0xb0, 0xa4, 0x2d, 0x87, + 0xb2, 0x0f, 0xe2, 0x52, 0x08, 0x3b, 0xa3, 0x06, 0xe9, 0xd3, 0x16, 0x61, + 0x90, 0x6b, 0x7c, 0xc0, 0x2b, 0x82, 0x51, 0x7e, 0x16, 0x93, 0x45, 0x59, + 0x92, 0x1a, 0xa5, 0xc1, 0x46, 0x20, 0x41, 0x2a, 0xae, 0xe4, 0x3a, 0x18, + 0xa4, 0x24, 0xc2, 0x11, 0x40, 0x56, 0xc0, 0x04, 0xb9, 0x52, 0x1b, 0x16, + 0xb3, 0x7e, 0x68, 0xc2, 0x30, 0xc7, 0x36, 0x38, 0x06, 0xe7, 0x0b, 0x29, + 0x01, 0x37, 0xd3, 0xd3, 0x46, 0x09, 0xe5, 0x7f, 0x8c, 0x01, 0x1d, 0xd2, + 0x00, 0x2d, 0xfe, 0x7b, 0xa0, 0x61, 0x31, 0x82, 0x4d, 0xf6, 0xe6, 0x7a, + 0xa3, 0x93, 0x48, 0x9c, 0xf7, 0x09, 0xa9, 0xb6, 0x04, 0xc7, 0xd5, 0x0f, + 0x88, 0x40, 0x04, 0x84, 0x80, 0x4d, 0xec, 0x36, 0x70, 0x23, 0x46, 0x27, + 0xbb, 0x51, 0x0d, 0x5d, 0x60, 0x10, 0x3d, 0x13, 0x2f, 0x12, 0xa4, 0x48, + 0xf0, 0xa1, 0x53, 0x93, 0x84, 0x77, 0x70, 0xf0, 0x58, 0x5e, 0x50, 0x8c, + 0x5d, 0x32, 0x2a, 0x2e, 0x91, 0x55, 0x5a, 0xa5, 0x7f, 0x71, 0xc4, 0x45, + 0xea, 0x15, 0x63, 0xa7, 0x77, 0x0c, 0x44, 0xe2, 0x24, 0xf9, 0xd4, 0x4b, + 0xe3, 0x11, 0x47, 0x54, 0x33, 0x38, 0x5f, 0xb0, 0x0c, 0x22, 0x57, 0x41, + 0x60, 0x37, 0x68, 0xb5, 0x42, 0x27, 0xca, 0xf2, 0x1a, 0x63, 0xa1, 0x3f, + 0xe0, 0xc7, 0x0a, 0x8b, 0x73, 0x74, 0x5c, 0x91, 0x87, 0x6d, 0xf7, 0x21, + 0x13, 0xb4, 0x17, 0x12, 0x68, 0x07, 0x1c, 0x85, 0x07, 0x6b, 0x48, 0x58, + 0xb8, 0xc5, 0x0e, 0x21, 0x32, 0x27, 0x38, 0xd2, 0x09, 0x7e, 0xe4, 0x8e, + 0xdc, 0x84, 0x21, 0x62, 0x91, 0x12, 0x8b, 0x27, 0x08, 0x2f, 0x03, 0x43, + 0xd8, 0xf2, 0x32, 0xbb, 0x16, 0x76, 0x05, 0xe3, 0x7e, 0xb3, 0xd2, 0x3c, + 0x95, 0x75, 0x73, 0x8b, 0x68, 0x0b, 0x37, 0x51, 0x5f, 0x41, 0xe5, 0x76, + 0x65, 0xc4, 0x01, 0x43, 0x72, 0x55, 0xa6, 0x40, 0x5a, 0x69, 0x34, 0x42, + 0xa6, 0x70, 0x25, 0x8b, 0x58, 0x13, 0xf4, 0x77, 0x25, 0x6a, 0x02, 0x80, + 0xe9, 0xf1, 0x45, 0xdb, 0x06, 0x3f, 0x9a, 0x23, 0x5a, 0xf3, 0x41, 0x0a, + 0xf7, 0xe3, 0x2d, 0x77, 0xf2, 0x69, 0xef, 0x63, 0x0e, 0x1d, 0x55, 0x6a, + 0xc9, 0x00, 0x4f, 0x39, 0xd0, 0x0b, 0xea, 0xf0, 0x03, 0x83, 0x48, 0x0f, + 0x93, 0x62, 0x29, 0xfa, 0xe3, 0x5f, 0x24, 0x44, 0x41, 0xf1, 0x28, 0x38, + 0x59, 0x26, 0x79, 0xf2, 0xf0, 0xfe, 0x02, 0x16, 0x33, 0x0d, 0xc6, 0x02, + 0x18, 0xb0, 0xa3, 0x04, 0x3a, 0x16, 0x3d, 0x7b, 0x55, 0x4c, 0x48, 0xe0, + 0x21, 0x13, 0x19, 0x12, 0xaf, 0x33, 0x89, 0x72, 0x14, 0x40, 0x74, 0xe2, + 0x74, 0x44, 0x30, 0x24, 0x99, 0x96, 0x20, 0x1b, 0x53, 0x0c, 0x85, 0xb8, + 0x0f, 0xd9, 0xe5, 0x0a, 0x40, 0xc5, 0x67, 0x36, 0x16, 0x1f, 0xee, 0xd1, + 0x71, 0xc5, 0x42, 0x8e, 0xcd, 0x13, 0x2f, 0xd2, 0x60, 0x3c, 0xf3, 0xc3, + 0x3e, 0xe3, 0x72, 0x22, 0xb1, 0x74, 0x93, 0x71, 0x80, 0x8a, 0xee, 0xf6, + 0x3a, 0xc6, 0xa1, 0x42, 0x6e, 0xa0, 0x8e, 0xda, 0x01, 0x0d, 0x3a, 0x65, + 0x8c, 0x9e, 0x56, 0x39, 0x33, 0x39, 0x6a, 0x25, 0x35, 0x27, 0xa6, 0xa6, + 0x56, 0x95, 0xd3, 0x16, 0xb5, 0x82, 0x29, 0x8f, 0xf7, 0x01, 0xa8, 0x10, + 0x3b, 0x00, 0xb5, 0x41, 0xac, 0xe3, 0x62, 0x22, 0xe3, 0x45, 0xa7, 0x12, + 0x71, 0x9d, 0x09, 0x2a, 0xdc, 0xd6, 0x0d, 0x5a, 0x15, 0x35, 0xe0, 0x66, + 0x6c, 0xc2, 0x13, 0x9a, 0x65, 0x32, 0x03, 0xd2, 0xb8, 0x95, 0x91, 0x15, + 0x1e, 0x05, 0xc5, 0x84, 0xf2, 0xd1, 0x31, 0xae, 0x36, 0x22, 0xdd, 0xa1, + 0x08, 0x73, 0x20, 0x86, 0xfe, 0x30, 0x78, 0x89, 0x44, 0x1b, 0x6b, 0x41, + 0x8b, 0x83, 0xb4, 0x07, 0xed, 0xf3, 0x73, 0x76, 0x38, 0x1b, 0xe8, 0xf6, + 0x0f, 0xea, 0xe6, 0x07, 0x60, 0xe1, 0x1b, 0x7e, 0x79, 0x6f, 0xe1, 0xc2, + 0x49, 0x37, 0x57, 0x4b, 0x93, 0xd2, 0x49, 0x05, 0x01, 0x62, 0xd9, 0xc4, + 0x3a, 0xcf, 0x13, 0x13, 0x5e, 0x40, 0x67, 0xfd, 0xd1, 0x53, 0x0d, 0x07, + 0x14, 0xbd, 0xb0, 0x75, 0x7a, 0x72, 0x67, 0x23, 0x84, 0x66, 0x51, 0x90, + 0x34, 0x69, 0x03, 0x06, 0x55, 0xd0, 0x9d, 0x9d, 0xa9, 0x63, 0x6f, 0x90, + 0x19, 0xea, 0xe3, 0x5d, 0x01, 0x94, 0x20, 0x71, 0xfe, 0x44, 0x50, 0xa3, + 0x23, 0x04, 0xe5, 0xa2, 0x09, 0x87, 0x19, 0x7e, 0x01, 0x19, 0x08, 0x79, + 0x07, 0x17, 0x74, 0x68, 0x0a, 0x54, 0x26, 0x0a, 0x8a, 0xf0, 0x43, 0x6a, + 0xa8, 0x17, 0x97, 0x10, 0x05, 0x6c, 0xf7, 0x06, 0x5e, 0x31, 0x73, 0x43, + 0xc7, 0x77, 0x39, 0xd7, 0x22, 0x67, 0xc6, 0x07, 0xe3, 0x79, 0x7e, 0x1e, + 0x53, 0x14, 0x4b, 0x01, 0x17, 0x35, 0xa0, 0x4a, 0x8f, 0x05, 0x9b, 0x62, + 0x03, 0x92, 0x4b, 0xa8, 0x76, 0x53, 0x32, 0x03, 0xbf, 0x80, 0x4f, 0xb6, + 0x30, 0x5a, 0xc1, 0x23, 0x1f, 0x9a, 0xc9, 0x90, 0xd4, 0x58, 0x19, 0x47, + 0xd5, 0x30, 0xfc, 0xc4, 0x62, 0x61, 0xf7, 0x24, 0x04, 0x35, 0x9a, 0x40, + 0x06, 0x59, 0x26, 0x85, 0x51, 0x06, 0x21, 0x11, 0x86, 0x30, 0x66, 0xc3, + 0xc7, 0x1d, 0xca, 0x98, 0x36, 0x80, 0x47, 0x57, 0x3a, 0x1a, 0x2f, 0xcd, + 0x07, 0x34, 0xf3, 0xf8, 0x6a, 0xdb, 0x63, 0x94, 0x12, 0xc1, 0x2b, 0x6d, + 0xa1, 0x2d, 0x7f, 0xa7, 0x38, 0x32, 0x24, 0x78, 0x3a, 0x2a, 0xa4, 0x1f, + 0x03, 0x11, 0x16, 0x40, 0x16, 0x2c, 0x47, 0x03, 0xd1, 0xf1, 0x4b, 0x1f, + 0x11, 0x11, 0x28, 0xc1, 0x7e, 0x0d, 0x59, 0x5e, 0x35, 0x90, 0x12, 0x56, + 0xf3, 0x72, 0x90, 0x25, 0x2b, 0xf3, 0xf5, 0x06, 0x3b, 0xf0, 0x79, 0x67, + 0x83, 0x96, 0x21, 0x5a, 0x0c, 0xbf, 0x50, 0x09, 0xea, 0x65, 0xa2, 0xdd, + 0xc0, 0x37, 0xc2, 0xe3, 0x38, 0x16, 0xea, 0x0d, 0x30, 0x29, 0x57, 0x24, + 0x85, 0x8e, 0x06, 0xc7, 0x9f, 0x1c, 0x71, 0x32, 0xf7, 0x93, 0x2a, 0x73, + 0x72, 0x5c, 0x5a, 0x31, 0x65, 0xab, 0x37, 0x18, 0xfe, 0x88, 0x05, 0x7f, + 0xa2, 0x9c, 0x35, 0xe5, 0xa3, 0xdf, 0x24, 0x82, 0x77, 0xa2, 0x7c, 0x92, + 0xa0, 0x03, 0xf4, 0x60, 0x1e, 0xaa, 0x06, 0x7d, 0x95, 0x52, 0x23, 0xfe, + 0x18, 0x43, 0x88, 0x28, 0xa0, 0x55, 0x95, 0xe1, 0xa2, 0x8f, 0xb1, 0xa6, + 0xce, 0x98, 0x36, 0x3a, 0xb8, 0x40, 0xc1, 0xd0, 0x83, 0x09, 0x62, 0xa1, + 0xc5, 0xe2, 0x18, 0x35, 0x16, 0x4b, 0xef, 0x57, 0x30, 0x99, 0xf6, 0x45, + 0xf3, 0x57, 0x30, 0x0c, 0x82, 0x64, 0xb5, 0x32, 0x8d, 0x24, 0xd1, 0x5e, + 0x8a, 0x83, 0x2a, 0x11, 0x86, 0x51, 0x93, 0xb0, 0x8e, 0x7a, 0xe2, 0x2c, + 0x83, 0x91, 0x98, 0x19, 0x90, 0x83, 0x60, 0x58, 0xa9, 0xe8, 0x28, 0x1b, + 0x79, 0x20, 0x8a, 0x76, 0x02, 0x7e, 0xf0, 0x61, 0x03, 0x5d, 0x91, 0x79, + 0xe3, 0xd4, 0x16, 0x3e, 0x21, 0x8f, 0x91, 0x37, 0x4b, 0x03, 0xa7, 0x6f, + 0xba, 0x65, 0x5b, 0x88, 0x94, 0x57, 0x14, 0xf1, 0x77, 0x5d, 0x79, 0x72, + 0x83, 0x98, 0x42, 0x25, 0x01, 0x19, 0xa5, 0xc0, 0x62, 0x0b, 0x46, 0x63, + 0x58, 0x34, 0x4f, 0x99, 0x15, 0x25, 0xfc, 0x74, 0xa2, 0xe5, 0x95, 0x0c, + 0x00, 0x63, 0x21, 0xd2, 0x13, 0x11, 0x1a, 0x64, 0x5f, 0x1d, 0xd2, 0x84, + 0x19, 0xf2, 0x1f, 0x1b, 0xe0, 0x7a, 0x4d, 0x06, 0x30, 0x87, 0x93, 0x01, + 0xa0, 0x50, 0xac, 0x75, 0xc5, 0x0b, 0x82, 0x53, 0x6a, 0x83, 0xb4, 0x09, + 0xa6, 0x08, 0xa0, 0x66, 0x90, 0x8a, 0x91, 0x62, 0x7b, 0x50, 0x51, 0x03, + 0x96, 0x32, 0xaf, 0xe4, 0xe6, 0x0a, 0x54, 0xd7, 0x69, 0x3f, 0x20, 0x57, + 0xa7, 0xc1, 0x1b, 0xf2, 0x66, 0x95, 0xcd, 0xd7, 0x28, 0x6c, 0x06, 0x16, + 0x3e, 0x73, 0x2a, 0x72, 0x0a, 0x47, 0x48, 0xe6, 0x7b, 0x94, 0x25, 0x88, + 0x18, 0x49, 0x69, 0x46, 0xe8, 0x27, 0x9e, 0x81, 0x46, 0xcb, 0xb6, 0x3b, + 0x89, 0xa8, 0x4b, 0xac, 0x8a, 0xaa, 0x45, 0xf1, 0x6d, 0xab, 0x05, 0x40, + 0x22, 0xa3, 0x31, 0xc8, 0x80, 0x19, 0xd8, 0xd0, 0xb3, 0xd6, 0xe0, 0x08, + 0x4e, 0x02, 0xfe, 0x0d, 0x61, 0x12, 0x00, 0x01, 0xa2, 0x14, 0xb2, 0x41, + 0x21, 0x5c, 0xd6, 0x48, 0x1d, 0xa2, 0x04, 0xfc, 0x48, 0x65, 0xd2, 0xf2, + 0x15, 0x64, 0x91, 0x4e, 0x0f, 0xc2, 0x7a, 0x4c, 0x40, 0x1c, 0xdb, 0xf1, + 0x56, 0x50, 0x66, 0x2c, 0x09, 0x38, 0x06, 0xfb, 0xf0, 0x60, 0x12, 0xea, + 0x04, 0xbd, 0xf4, 0x07, 0x77, 0xa1, 0x38, 0x90, 0x57, 0x23, 0xb9, 0x55, + 0x48, 0xe4, 0xc3, 0x6e, 0x67, 0x64, 0x0b, 0x62, 0xda, 0x14, 0x43, 0x32, + 0x27, 0x09, 0x84, 0x10, 0x2e, 0x60, 0x10, 0x43, 0xa9, 0xa1, 0x96, 0x47, + 0x7e, 0x0e, 0x33, 0x5c, 0x60, 0xb7, 0x12, 0x5f, 0x53, 0x0b, 0x58, 0x40, + 0x04, 0x68, 0x94, 0x45, 0x40, 0xd5, 0x03, 0x01, 0x20, 0x5e, 0x1a, 0x17, + 0x85, 0x7b, 0x00, 0x14, 0xaa, 0xf2, 0x94, 0x5a, 0xb2, 0x27, 0x65, 0x51, + 0x61, 0xbd, 0xc2, 0x07, 0x75, 0xc5, 0x1b, 0x4e, 0xe2, 0x02, 0x3c, 0x31, + 0x6d, 0x3e, 0x86, 0x07, 0xaa, 0x20, 0x23, 0x4f, 0x14, 0x60, 0xdd, 0xd7, + 0x69, 0x8d, 0x84, 0x0a, 0x2f, 0x61, 0x7b, 0x02, 0x8a, 0x9f, 0x08, 0xf0, + 0x21, 0x62, 0xa1, 0x39, 0x87, 0x53, 0x5b, 0x1e, 0x43, 0x07, 0x91, 0x37, + 0x07, 0xf4, 0x16, 0xba, 0xd6, 0x2a, 0x2e, 0x45, 0x10, 0x10, 0x42, 0xa0, + 0x05, 0x18, 0x97, 0xb5, 0x6f, 0x54, 0x1f, 0xdb, 0x80, 0xb1, 0x3d, 0xe1, + 0x88, 0xa3, 0x73, 0x10, 0xa2, 0x91, 0x46, 0xd6, 0x39, 0x03, 0xaa, 0x49, + 0x96, 0xae, 0x63, 0x26, 0x66, 0x73, 0x26, 0x59, 0xb7, 0x88, 0x69, 0xb0, + 0x40, 0xdf, 0x06, 0x1a, 0xb8, 0x87, 0x5a, 0xa5, 0xb5, 0xb2, 0xc1, 0x2a, + 0x34, 0x80, 0xb1, 0xaf, 0x15, 0xeb, 0x0f, 0x93, 0x32, 0x35, 0x14, 0x12, + 0x06, 0x59, 0xe6, 0x1b, 0xb7, 0xf6, 0x32, 0x34, 0x92, 0x93, 0x98, 0xb2, + 0x38, 0x6f, 0xc2, 0x0f, 0x39, 0xfe, 0x43, 0x27, 0x15, 0x81, 0x08, 0x66, + 0xe5, 0x07, 0x52, 0x70, 0x43, 0x03, 0x21, 0x18, 0x39, 0x91, 0x9d, 0xcf, + 0x24, 0x7c, 0xf6, 0x26, 0x04, 0xcd, 0x90, 0x04, 0x8e, 0x16, 0x4c, 0x55, + 0x09, 0x2d, 0xba, 0xe0, 0x53, 0x41, 0x50, 0x1f, 0xd3, 0x33, 0x59, 0x04, + 0xd1, 0x6c, 0x86, 0xc2, 0x06, 0xa1, 0x4a, 0x62, 0xdf, 0xf9, 0x5d, 0x43, + 0x31, 0x4b, 0x7d, 0x30, 0x12, 0x2f, 0x31, 0x91, 0xa2, 0x61, 0x5f, 0xe5, + 0x7a, 0x20, 0x95, 0x65, 0x6d, 0x37, 0x11, 0x1a, 0xdf, 0x13, 0x22, 0x60, + 0xa1, 0x3b, 0x22, 0x35, 0x1b, 0xe3, 0xd2, 0x52, 0x19, 0xc2, 0x71, 0x52, + 0xa0, 0x02, 0x5c, 0xfa, 0x1b, 0xd4, 0x32, 0x70, 0xe8, 0xf5, 0x26, 0xe3, + 0xcb, 0x2d, 0xe3, 0xb7, 0x28, 0x62, 0xd0, 0x78, 0x03, 0x61, 0x11, 0x68, + 0xe3, 0x6b, 0x20, 0xb0, 0x8f, 0x7b, 0x31, 0x22, 0xe4, 0xb5, 0xbd, 0xe6, + 0x91, 0x43, 0xe6, 0xc0, 0x35, 0x13, 0xe0, 0x2e, 0x12, 0x0c, 0x91, 0x29, + 0x0a, 0x50, 0xab, 0x75, 0x04, 0x59, 0x08, 0x56, 0xd8, 0xdb, 0x58, 0xc0, + 0x83, 0x40, 0xb2, 0x73, 0x91, 0xc7, 0xf4, 0xa9, 0xfe, 0x82, 0x0b, 0xf2, + 0x27, 0x7b, 0xdc, 0x06, 0x7c, 0xbc, 0x3b, 0xc1, 0x63, 0x62, 0x24, 0xf5, + 0x35, 0x05, 0x98, 0x13, 0x53, 0xc3, 0x89, 0x9b, 0x7e, 0xa0, 0x9b, 0x7b, + 0x01, 0x8b, 0xd6, 0xaa, 0xbf, 0x8c, 0xf0, 0x16, 0x00, 0xea, 0x49, 0xcc, + 0x15, 0x49, 0xa0, 0x93, 0x5c, 0x89, 0xc0, 0x5b, 0x3d, 0x7c, 0x8f, 0xd0, + 0x32, 0x1e, 0x31, 0x13, 0x49, 0x71, 0x20, 0x44, 0x18, 0xc5, 0x3f, 0x26, + 0xe8, 0x21, 0x00, 0x21, 0x3d, 0x2e, 0xb0, 0x4d, 0x07, 0x8c, 0x03, 0xdb, + 0xb9, 0x3f, 0x16, 0x34, 0x02, 0xa4, 0x80, 0x21, 0xa2, 0x25, 0x0c, 0xa3, + 0xd2, 0x76, 0xf6, 0x45, 0x58, 0xd0, 0xe0, 0x58, 0xfe, 0x63, 0x20, 0x96, + 0x3e, 0x51, 0x76, 0x24, 0xd7, 0x1f, 0x73, 0xc7, 0x2b, 0x9a, 0x13, 0x4a, + 0xb0, 0x92, 0x08, 0xbe, 0xe4, 0xa6, 0x28, 0x11, 0x48, 0x9a, 0x02, 0x61, + 0xea, 0xc6, 0x81, 0x7a, 0xa0, 0x9c, 0xd9, 0xa2, 0x6e, 0xb2, 0x85, 0x60, + 0x1d, 0xe5, 0x92, 0x78, 0x30, 0x02, 0xd0, 0x65, 0x49, 0x00, 0x09, 0x8a, + 0x89, 0x52, 0x2f, 0xd6, 0x91, 0x13, 0xde, 0xd2, 0x61, 0x35, 0x90, 0x43, + 0xa3, 0xd5, 0x1d, 0xab, 0xbb, 0x42, 0x39, 0xfa, 0x49, 0x9d, 0x86, 0x15, + 0x2a, 0x24, 0x03, 0x78, 0x56, 0x50, 0xca, 0x40, 0xa2, 0x94, 0xf1, 0xa1, + 0xd7, 0xc0, 0x6d, 0x43, 0x32, 0x30, 0xa7, 0x87, 0xb2, 0x6a, 0xf2, 0x11, + 0xcd, 0x20, 0x47, 0x11, 0x29, 0xb3, 0x6a, 0xc2, 0xa2, 0xff, 0x12, 0x6e, + 0xd2, 0x70, 0x73, 0x5c, 0x12, 0x0d, 0x3b, 0xc6, 0x01, 0x01, 0xd0, 0x31, + 0xa4, 0x17, 0x77, 0x8c, 0xb4, 0x2b, 0xe4, 0xa2, 0x43, 0x82, 0xf3, 0xa8, + 0x4c, 0xb1, 0x80, 0x56, 0xc9, 0x11, 0x91, 0x62, 0x09, 0xb6, 0x46, 0x21, + 0x54, 0x11, 0x22, 0x69, 0x20, 0x10, 0x17, 0x42, 0x2f, 0x46, 0x41, 0x43, + 0x9f, 0x44, 0x42, 0x25, 0x88, 0x5f, 0x89, 0x44, 0xb8, 0xc3, 0xe9, 0xb5, + 0x8a, 0xa0, 0x0e, 0x40, 0xa0, 0x2d, 0x1e, 0xb8, 0x09, 0x18, 0x39, 0x1f, + 0x0d, 0x42, 0x0b, 0x9f, 0xe2, 0xa5, 0x53, 0xe2, 0x75, 0xe4, 0xb0, 0x57, + 0x73, 0xf7, 0x3d, 0x2b, 0x50, 0x19, 0x01, 0x2c, 0xcd, 0x85, 0x4b, 0x0d, + 0x0b, 0x16, 0x76, 0x96, 0x10, 0x02, 0x72, 0x43, 0x96, 0xec, 0x31, 0x14, + 0x43, 0x89, 0x96, 0x17, 0x69, 0x12, 0x17, 0x74, 0x20, 0x31, 0xc3, 0x6e, + 0xec, 0x56, 0x07, 0xfc, 0x4c, 0xbe, 0xe2, 0x17, 0x1b, 0x40, 0x73, 0x0a, + 0x0f, 0xab, 0x13, 0x64, 0x21, 0x6e, 0xd1, 0x92, 0x0e, 0x00, 0x6a, 0xfe, + 0x4e, 0x67, 0x65, 0x70, 0x49, 0xf4, 0xc6, 0x9d, 0x03, 0x95, 0xd9, 0x99, + 0x49, 0x34, 0x25, 0x2e, 0xae, 0x4c, 0x71, 0x0f, 0x66, 0x04, 0x05, 0xd1, + 0xa2, 0xf8, 0x20, 0xbf, 0x73, 0xd2, 0xd0, 0xb2, 0x41, 0x00, 0xe2, 0x57, + 0x24, 0x1a, 0x4a, 0x1c, 0xa9, 0x83, 0x4f, 0x0d, 0x43, 0xa7, 0x09, 0x6a, + 0x4f, 0xff, 0x32, 0x51, 0xf5, 0xe7, 0x4f, 0x8b, 0xe1, 0x2f, 0x2f, 0xd2, + 0x6a, 0xad, 0x72, 0x6d, 0x27, 0x81, 0x1c, 0x96, 0x72, 0x71, 0x40, 0x5b, + 0x77, 0x61, 0x94, 0xb2, 0xc8, 0x72, 0x08, 0x53, 0xcc, 0x1c, 0xc5, 0x92, + 0x14, 0x17, 0x04, 0x62, 0x21, 0x82, 0x70, 0xa8, 0x20, 0x8a, 0x66, 0xdc, + 0x48, 0x10, 0xd2, 0xb4, 0x30, 0x85, 0x27, 0x87, 0x07, 0x3a, 0xcd, 0x0a, + 0x8a, 0x86, 0x60, 0x82, 0xf2, 0x13, 0x0f, 0xe7, 0xf2, 0xd3, 0xdb, 0x5a, + 0x3a, 0xea, 0x21, 0x1b, 0xcb, 0x24, 0xbb, 0xe3, 0xb1, 0xd0, 0x82, 0x22, + 0x1e, 0xe8, 0x17, 0x3d, 0x15, 0xa0, 0x58, 0x81, 0xf4, 0x87, 0x60, 0xe0, + 0x3b, 0x31, 0xd6, 0xd9, 0xfa, 0xca, 0xc1, 0x8f, 0xb6, 0xae, 0x64, 0xfb, + 0xc1, 0x33, 0x41, 0xb2, 0x9b, 0xe0, 0x08, 0xb4, 0xa1, 0x26, 0xa0, 0x15, + 0xbb, 0xb6, 0x88, 0x8b, 0x12, 0xf3, 0x29, 0x19, 0x42, 0xaf, 0xe4, 0x65, + 0xa7, 0x10, 0x24, 0x43, 0x6a, 0x53, 0x29, 0x5b, 0x61, 0x0a, 0x8e, 0xd7, + 0x27, 0xa7, 0x82, 0xa5, 0x66, 0xc3, 0x59, 0x01, 0x37, 0x33, 0xd2, 0x70, + 0x1b, 0xfa, 0x98, 0x06, 0xd6, 0x95, 0x6b, 0xbd, 0xd4, 0x39, 0x85, 0x6d, + 0xb9, 0x53, 0x76, 0x0b, 0xb1, 0xb1, 0x10, 0x37, 0x50, 0x2e, 0x46, 0x21, + 0x06, 0x69, 0x71, 0x9c, 0xab, 0xe8, 0x3e, 0x35, 0xc5, 0x55, 0xfb, 0xe5, + 0x3d, 0xdb, 0x1c, 0x3a, 0xcd, 0x50, 0x24, 0x41, 0xd6, 0xd2, 0xd6, 0x69, + 0x59, 0x64, 0xfe, 0xcb, 0x3a, 0x17, 0x53, 0x51, 0x28, 0xed, 0x4a, 0x04, + 0x85, 0x50, 0x34, 0xd1, 0x31, 0x52, 0x62, 0x12, 0x3c, 0x21, 0xdf, 0xb8, + 0xba, 0x18, 0x55, 0xf0, 0x8b, 0xa7, 0xc2, 0x91, 0x3e, 0xa6, 0x0c, 0xc9, + 0xc5, 0x55, 0x3a, 0xd5, 0x78, 0x89, 0x32, 0x0f, 0xe9, 0xa1, 0x9c, 0x87, + 0xfc, 0x4a, 0xb9, 0x58, 0x87, 0x0a, 0x98, 0x93, 0x5b, 0xcb, 0x5c, 0x90, + 0x54, 0x1c, 0xd9, 0x44, 0x52, 0x30, 0xfc, 0x16, 0x43, 0x04, 0x70, 0x90, + 0x70, 0x9b, 0x8a, 0x80, 0xd8, 0xf0, 0x2d, 0x63, 0xa3, 0x78, 0x5c, 0x7c, + 0x40, 0x57, 0xb8, 0x23, 0x6b, 0xfb, 0x57, 0xbf, 0x6f, 0x88, 0x09, 0xe4, + 0xb5, 0x22, 0xd0, 0xb8, 0x60, 0x7c, 0x83, 0x72, 0xe9, 0x69, 0x55, 0x8e, + 0x96, 0x4b, 0x69, 0x80, 0xae, 0x3c, 0xb0, 0x60, 0x59, 0xbc, 0x1e, 0xd4, + 0xa8, 0x59, 0x3e, 0x84, 0x03, 0xdc, 0x16, 0x0a, 0xf0, 0x2d, 0x72, 0xd7, + 0x50, 0x3f, 0x6c, 0xa7, 0x0f, 0x2e, 0x82, 0x22, 0x09, 0x3b, 0x4f, 0xc1, + 0x26, 0x21, 0xba, 0x93, 0x16, 0xce, 0x30, 0x52, 0xe8, 0xbb, 0x06, 0x71, + 0xc0, 0x26, 0x9a, 0xb3, 0x23, 0x12, 0xf8, 0x61, 0x2e, 0xc2, 0xca, 0xe6, + 0x42, 0x02, 0x3a, 0x34, 0x43, 0x2c, 0x54, 0x25, 0x66, 0xcb, 0x10, 0x32, + 0x22, 0x34, 0x8f, 0xd9, 0x78, 0x37, 0xc0, 0x3f, 0xe7, 0x60, 0x85, 0x7c, + 0x0c, 0x2f, 0x0a, 0xcc, 0x26, 0xc9, 0xe6, 0x01, 0xf8, 0x3a, 0x19, 0x40, + 0x24, 0x30, 0xe3, 0x06, 0xa7, 0x46, 0x3b, 0x2b, 0x2e, 0x6a, 0x2d, 0xc7, + 0xb6, 0x1a, 0x2e, 0x06, 0x1a, 0x13, 0xa0, 0xb3, 0x11, 0x8d, 0x9a, 0xfa, + 0xb1, 0x5e, 0x56, 0x84, 0xaa, 0x58, 0x27, 0x84, 0x46, 0x7b, 0x73, 0xec, + 0xa0, 0x28, 0x53, 0x26, 0x0f, 0x5f, 0xa7, 0x85, 0x6d, 0x75, 0x60, 0x67, + 0xcc, 0x2c, 0x86, 0x34, 0x7c, 0xfe, 0xc0, 0x2a, 0xa4, 0xe6, 0xb6, 0x2b, + 0x25, 0x16, 0xe1, 0x3b, 0x04, 0x36, 0x02, 0x26, 0x02, 0x03, 0x01, 0x23, + 0x9c, 0x03, 0x04, 0xe6, 0x13, 0x77, 0x75, 0x51, 0x81, 0xdc, 0x6b, 0x70, + 0xcb, 0x21, 0x9a, 0xb8, 0x0d, 0x9d, 0xe8, 0x99, 0xb5, 0xbf, 0xe3, 0x7c, + 0xec, 0x31, 0x67, 0x8e, 0x16, 0x0e, 0xf9, 0xd1, 0xaf, 0xb7, 0x0d, 0xb7, + 0x0c, 0xcd, 0x57, 0x89, 0x6a, 0x18, 0x77, 0x94, 0x5f, 0x67, 0xb0, 0x02, + 0x84, 0x86, 0xaf, 0x58, 0x52, 0x4b, 0xc2, 0x82, 0x46, 0xad, 0x54, 0xeb, + 0x20, 0x2a, 0xdf, 0x30, 0xd0, 0x7c, 0x1e, 0xb2, 0x2c, 0x20, 0xee, 0x01, + 0x51, 0x41, 0x00, 0xe9, 0x0c, 0x2a, 0xe2, 0x72, 0x52, 0x84, 0x22, 0x23, + 0x19, 0x48, 0x87, 0x80, 0x70, 0x4e, 0xa8, 0x6b, 0x31, 0xc1, 0x7a, 0x7d, + 0xe1, 0x5b, 0xb5, 0xf3, 0x40, 0xd5, 0x27, 0xe2, 0x1a, 0xb1, 0x01, 0x11, + 0x3e, 0x71, 0x5b, 0x90, 0xc9, 0x2d, 0x40, 0x81, 0x87, 0xc8, 0x5a, 0x5a, + 0xc9, 0xf8, 0x19, 0x48, 0x81, 0x48, 0x92, 0x61, 0xbd, 0x18, 0x97, 0xce, + 0x5f, 0x95, 0xe7, 0x2c, 0x0b, 0xe0, 0xc7, 0x2b, 0x14, 0xf9, 0x37, 0x0b, + 0x57, 0x14, 0x0b, 0xb3, 0x45, 0x2b, 0xf8, 0x8e, 0xaa, 0x3b, 0xd0, 0x89, + 0x28, 0x10, 0x30, 0xb9, 0x5a, 0x5a, 0xe0, 0x57, 0xa7, 0x11, 0xf9, 0xa4, + 0x5f, 0x91, 0xce, 0x48, 0xf1, 0x0f, 0x71, 0xf9, 0x8b, 0x26, 0x40, 0x48, + 0x71, 0x5c, 0x7c, 0xdd, 0x01, 0x3a, 0x54, 0x36, 0x16, 0x42, 0xf3, 0xa8, + 0x1b, 0x38, 0x0e, 0xc6, 0xd7, 0x49, 0xa9, 0x13, 0x28, 0xc6, 0x81, 0x0d, + 0xf4, 0x33, 0x6d, 0xe0, 0x8b, 0xa3, 0x30, 0xb5, 0x5f, 0x63, 0x60, 0xbe, + 0x3f, 0xed, 0x92, 0x49, 0xab, 0x07, 0x5f, 0x30, 0x0c, 0x26, 0x9e, 0xe2, + 0x6c, 0xb1, 0xb3, 0x27, 0x50, 0xe4, 0x48, 0xa7, 0xfe, 0x54, 0x2c, 0x9d, + 0x9c, 0x44, 0x15, 0x84, 0x41, 0x31, 0x59, 0x44, 0x38, 0x4b, 0x20, 0x7e, + 0x0e, 0x73, 0x30, 0x88, 0xf4, 0xe4, 0xd6, 0xfc, 0xc2, 0x6c, 0x51, 0x20, + 0x36, 0x7c, 0x2b, 0x47, 0xc4, 0xfe, 0x63, 0x03, 0x17, 0x6b, 0x78, 0x20, + 0x21, 0xad, 0x0d, 0x24, 0x3f, 0xd4, 0x68, 0xe6, 0x5b, 0xcb, 0x28, 0xd3, + 0x51, 0xc6, 0x71, 0x78, 0x5a, 0x88, 0x86, 0x66, 0x19, 0x5b, 0x13, 0x21, + 0x31, 0xe1, 0xbb, 0x49, 0x3e, 0xd2, 0xe2, 0xfa, 0xfc, 0xce, 0x2b, 0xd3, + 0x48, 0x98, 0x4b, 0x0f, 0xf8, 0xb2, 0x32, 0x80, 0xc4, 0x20, 0x09, 0xc4, + 0x0d, 0x3c, 0xd6, 0x54, 0xae, 0xaa, 0x30, 0xb5, 0x02, 0xce, 0x6d, 0x39, + 0xc5, 0x2b, 0xec, 0x30, 0xc4, 0x7b, 0x31, 0x5f, 0x1a, 0x89, 0x3f, 0x96, + 0x63, 0x55, 0x7c, 0x6c, 0xf2, 0x39, 0x47, 0x7a, 0x70, 0x1a, 0xb7, 0x93, + 0x11, 0x54, 0x13, 0xef, 0x55, 0xe1, 0x32, 0x36, 0x82, 0xb0, 0x87, 0x9c, + 0x4e, 0xac, 0xe0, 0x10, 0x8c, 0x34, 0x3a, 0x48, 0x6f, 0x3f, 0x97, 0x40, + 0x6f, 0x51, 0xca, 0x9c, 0x0b, 0xab, 0xca, 0x1a, 0x95, 0x3f, 0x18, 0x92, + 0x0f, 0x5c, 0x08, 0x24, 0x2f, 0x48, 0x2c, 0x39, 0x68, 0x5d, 0x09, 0x31, + 0x09, 0x96, 0x37, 0x53, 0x8a, 0x9a, 0x79, 0xc6, 0x30, 0x73, 0xb5, 0xe7, + 0x70, 0xc7, 0x63, 0x50, 0xb3, 0x3a, 0x13, 0x2d, 0x3c, 0xf5, 0x39, 0x79, + 0xfa, 0x5f, 0x01, 0x14, 0xce, 0x20, 0x4c, 0x93, 0x01, 0x37, 0x45, 0xf5, + 0x62, 0xc2, 0x50, 0xc8, 0x4b, 0x88, 0x63, 0x39, 0x31, 0xe8, 0x19, 0xc4, + 0x06, 0x59, 0xfd, 0x15, 0xda, 0x80, 0x1b, 0x65, 0x2a, 0xd3, 0x71, 0x91, + 0xd8, 0x05, 0x4b, 0xc4, 0xb6, 0x17, 0x12, 0x43, 0xa2, 0x5d, 0x3f, 0xad, + 0xcc, 0x8a, 0x12, 0xba, 0x72, 0xf0, 0xb7, 0xa7, 0xf0, 0x01, 0x6d, 0xfe, + 0x9c, 0xb4, 0x87, 0x32, 0x21, 0x56, 0xa1, 0x02, 0xcc, 0xd0, 0x38, 0xb9, + 0xf6, 0x50, 0x6d, 0xb6, 0xb6, 0xfa, 0x33, 0x09, 0x89, 0xa2, 0x5d, 0xec, + 0xe1, 0x85, 0xcb, 0xca, 0xcc, 0xe4, 0xc1, 0xaa, 0x32, 0x3b, 0x4a, 0xdf, + 0x76, 0xb1, 0x10, 0x90, 0x50, 0xa1, 0xe4, 0xac, 0x32, 0x29, 0x3a, 0xbd, + 0xaf, 0x64, 0xe9, 0x42, 0x29, 0x01, 0x00, 0x10, 0x45, 0x96, 0xe5, 0x4c, + 0x88, 0xa4, 0x20, 0x65, 0x04, 0x21, 0x8a, 0x9b, 0x50, 0x90, 0xb8, 0x38, + 0x92, 0x0e, 0x02, 0x20, 0xbb, 0x81, 0x02, 0x00, 0x5e, 0xd2, 0x27, 0x39, + 0x4c, 0x40, 0x13, 0x4e, 0x72, 0x97, 0x50, 0x50, 0x13, 0x86, 0xc4, 0x60, + 0x31, 0x00, 0x28, 0x0a, 0x55, 0xac, 0xe0, 0x80, 0xc5, 0x16, 0x16, 0x06, + 0x5d, 0xac, 0x87, 0x2b, 0xeb, 0x6e, 0xd7, 0x84, 0x00, 0x68, 0xed, 0x88, + 0x15, 0xad, 0xdf, 0x79, 0xe4, 0xc3, 0xfe, 0x64, 0xff, 0xb7, 0xb2, 0x98, + 0xb4, 0xaa, 0x2a, 0x81, 0x93, 0x0f, 0x85, 0x37, 0x45, 0x03, 0x8c, 0xac, + 0x03, 0x85, 0x13, 0x84, 0x2a, 0x1c, 0x80, 0xab, 0x05, 0xc5, 0x0c, 0x85, + 0xb1, 0x09, 0x13, 0x94, 0x8b, 0x03, 0x44, 0xa0, 0x83, 0x37, 0x89, 0x8c, + 0x8c, 0x26, 0x9f, 0x8b, 0x90, 0xbb, 0x97, 0xaa, 0x55, 0x10, 0x1d, 0x91, + 0x03, 0xb3, 0x8e, 0xaa, 0x98, 0x56, 0x11, 0x11, 0x8e, 0x3c, 0x14, 0x9c, + 0xd6, 0xaf, 0xa0, 0x51, 0xc8, 0xd9, 0x10, 0x1f, 0x94, 0x85, 0xb7, 0xa6, + 0x97, 0x8e, 0xc6, 0x04, 0xb5, 0x26, 0x4a, 0x98, 0x18, 0x4c, 0xa1, 0x2c, + 0x0b, 0x0d, 0x5d, 0x53, 0x27, 0xac, 0x4c, 0x9b, 0xb8, 0x82, 0xc6, 0x1d, + 0xac, 0x01, 0xc8, 0x0a, 0x82, 0x1b, 0xc8, 0x49, 0x82, 0xc6, 0x66, 0x04, + 0xb9, 0x1f, 0x3f, 0x8a, 0x17, 0x84, 0x81, 0xb9, 0x2a, 0x74, 0x32, 0xde, + 0x4d, 0x9f, 0xfe, 0x3b, 0x43, 0xcc, 0x03, 0xf6, 0x0c, 0xf8, 0x38, 0x83, + 0x23, 0x90, 0x0e, 0x75, 0xdd, 0x72, 0xf0, 0x83, 0xe3, 0xc2, 0x83, 0x25, + 0x19, 0xe5, 0x0c, 0x00, 0xb8, 0x31, 0x21, 0x07, 0x85, 0x53, 0x30, 0x62, + 0x19, 0x03, 0x81, 0xa1, 0x62, 0xa5, 0x0f, 0x4d, 0x3a, 0xe0, 0xf0, 0x90, + 0x24, 0x04, 0x28, 0x0c, 0x05, 0x7c, 0x11, 0x39, 0xa5, 0x8d, 0xc7, 0xae, + 0x65, 0xb1, 0x32, 0x2a, 0x22, 0xd1, 0x71, 0x84, 0xc9, 0x8e, 0x2f, 0xb6, + 0xe1, 0x78, 0x06, 0x04, 0x09, 0xa2, 0x6a, 0xa9, 0xa0, 0x00, 0x03, 0x60, + 0xab, 0x22, 0x1a, 0x45, 0x45, 0x0f, 0x9d, 0x28, 0x27, 0xa6, 0x91, 0x25, + 0x72, 0x63, 0xa8, 0x00, 0xe0, 0x72, 0xa4, 0x90, 0x9a, 0x3e, 0x67, 0x06, + 0x91, 0xb1, 0x22, 0x83, 0x0c, 0xa1, 0x05, 0x72, 0x7e, 0x41, 0x3a, 0x48, + 0x01, 0x4b, 0xd1, 0x50, 0x06, 0x46, 0xa0, 0xf1, 0x9a, 0x28, 0xe0, 0x3b, + 0x38, 0x11, 0x29, 0xd0, 0x82, 0xd3, 0xed, 0x4a, 0xc0, 0x2e, 0x2a, 0x01, + 0x1c, 0xc1, 0x50, 0xf4, 0x89, 0x31, 0x21, 0x7b, 0xf3, 0x34, 0xe1, 0x72, + 0xc1, 0x0e, 0xa6, 0x67, 0xef, 0x74, 0x2d, 0x0d, 0x15, 0x0a, 0x80, 0x00, + 0x28, 0x1e, 0x30, 0xe9, 0xd2, 0xf2, 0x02, 0x47, 0x06, 0x13, 0x14, 0x5a, + 0xc1, 0x80, 0xb1, 0x21, 0x86, 0xd8, 0x33, 0x20, 0x7c, 0xf0, 0x18, 0x13, + 0x0a, 0x84, 0x89, 0x03, 0x02, 0xfe, 0x22, 0x08, 0x00, 0xa9, 0x28, 0x87, + 0xc4, 0x66, 0x6a, 0xe9, 0x0a, 0xf2, 0xc3, 0x50, 0x60, 0x45, 0xfe, 0xba, + 0x74, 0x6a, 0x72, 0x42, 0xce, 0x44, 0x39, 0x55, 0x2c, 0x15, 0xdd, 0x51, + 0xf4, 0x04, 0x5a, 0xaa, 0x04, 0x9a, 0x72, 0xc2, 0x57, 0x80, 0xcb, 0xb8, + 0x1f, 0x68, 0xef, 0xfc, 0xb1, 0xb8, 0x83, 0x4d, 0xc5, 0xdc, 0x69, 0x8a, + 0x1a, 0x78, 0x37, 0x66, 0x51, 0xfe, 0x00, 0xee, 0x6c, 0xd5, 0xe0, 0xd0, + 0x32, 0xf0, 0x86, 0x22, 0x81, 0x52, 0xd5, 0x9a, 0xae, 0x05, 0x85, 0x45, + 0xaa, 0x58, 0x0b, 0x34, 0x6c, 0xbb, 0xb9, 0x8d, 0xe3, 0x85, 0x00, 0x7c, + 0x49, 0xbc, 0x44, 0x9d, 0x93, 0x97, 0x4f, 0xc7, 0x8a, 0x02, 0xac, 0x07, + 0x02, 0x50, 0xe0, 0xe8, 0x24, 0x99, 0x60, 0xa0, 0x45, 0xa3, 0x79, 0x68, + 0xb3, 0xa8, 0x16, 0xd5, 0x38, 0xf0, 0xcf, 0x98, 0xb9, 0x4e, 0xfa, 0x01, + 0x9d, 0x3b, 0xd6, 0xc3, 0x23, 0x14, 0xaf, 0xe0, 0x00, 0x23, 0x86, 0x77, + 0xba, 0xb0, 0xe2, 0x19, 0x2f, 0x22, 0x11, 0x08, 0xb1, 0x53, 0xe2, 0xa2, + 0x05, 0xa3, 0x10, 0x4e, 0x68, 0x44, 0x0c, 0x7b, 0x32, 0xb1, 0x02, 0x3d, + 0x76, 0x7a, 0x20, 0x31, 0x06, 0xba, 0xd0, 0x50, 0x4b, 0x86, 0x4d, 0x3a, + 0x20, 0x0e, 0xc7, 0x4d, 0x74, 0x24, 0xcb, 0x2b, 0x44, 0xb6, 0xd3, 0x43, + 0x46, 0x2c, 0x18, 0xb4, 0x49, 0x3a, 0x20, 0x26, 0xb3, 0xd1, 0x14, 0x0c, + 0x9c, 0xb8, 0xe0, 0x0e, 0x5a, 0x76, 0x98, 0xd2, 0x8d, 0x57, 0x30, 0xd0, + 0x32, 0x1e, 0x9b, 0x40, 0xc8, 0xa3, 0x15, 0x1e, 0x9e, 0xd9, 0x25, 0x03, + 0x39, 0x58, 0x19, 0x85, 0xa4, 0xd4, 0x6c, 0xfa, 0x60, 0x3f, 0x33, 0x58, + 0xe1, 0x81, 0x02, 0x14, 0x1e, 0xeb, 0x48, 0x06, 0x52, 0xee, 0x58, 0x89, + 0x94, 0x79, 0x3a, 0x24, 0x25, 0x9a, 0x33, 0x11, 0x50, 0x4b, 0x2d, 0xa8, + 0xdc, 0x88, 0x28, 0x8e, 0x26, 0xa1, 0xa2, 0xe5, 0x87, 0x09, 0xa4, 0xc2, + 0x87, 0x00, 0x01, 0x94, 0x3b, 0xa2, 0xb4, 0x3f, 0x3b, 0x79, 0xaa, 0xa8, + 0x74, 0x4c, 0x08, 0x12, 0x91, 0x0a, 0x8f, 0x88, 0x54, 0x1a, 0x3e, 0x0a, + 0xdc, 0x83, 0x9d, 0x1b, 0x1e, 0x3b, 0x6e, 0x80, 0x49, 0xea, 0xca, 0xc2, + 0x4f, 0xa9, 0xfe, 0xb0, 0x4f, 0x34, 0xcc, 0x4c, 0xfe, 0xe2, 0xe1, 0xa2, + 0x1b, 0x08, 0x32, 0xe5, 0x21, 0x0c, 0xf2, 0xd8, 0xaf, 0x04, 0x56, 0xf9, + 0x13, 0xc1, 0xaf, 0x0b, 0x8e, 0x89, 0x87, 0x09, 0x0f, 0x50, 0x93, 0xd0, + 0x42, 0x91, 0x60, 0x72, 0x62, 0x0e, 0x05, 0x11, 0xbc, 0xf5, 0x84, 0x31, + 0x67, 0x41, 0xa9, 0xa5, 0x93, 0xc0, 0x98, 0x0b, 0xa9, 0xd4, 0xb0, 0xd2, + 0x4a, 0xb3, 0x8a, 0xb6, 0xa3, 0xe2, 0x0b, 0x13, 0xd2, 0xb1, 0x87, 0x54, + 0x16, 0xdb, 0x00, 0xd4, 0x54, 0x32, 0x1e, 0xcb, 0xe2, 0x0a, 0x46, 0xef, + 0x6a, 0x66, 0x8e, 0x7e, 0xe2, 0x58, 0x4b, 0xaa, 0x18, 0xf5, 0x22, 0x8e, + 0x2e, 0x46, 0xd8, 0x99, 0x67, 0x00, 0x6e, 0xc9, 0x19, 0x24, 0xb7, 0x05, + 0x35, 0xd3, 0xc9, 0x11, 0x5c, 0xa8, 0x70, 0xe2, 0xb2, 0x85, 0x10, 0x05, + 0xea, 0x14, 0x82, 0xcc, 0x30, 0x50, 0x31, 0x9e, 0xc4, 0x2c, 0x41, 0x96, + 0x1e, 0xbc, 0xb4, 0x12, 0x93, 0x22, 0xa6, 0x00, 0xd8, 0x22, 0x28, 0xab, + 0xfc, 0x6b, 0x24, 0xd5, 0x42, 0x10, 0xc3, 0x98, 0x67, 0x82, 0xf0, 0x01, + 0xb2, 0x03, 0x9d, 0x0c, 0x93, 0xc5, 0x5e, 0x3b, 0xbb, 0x62, 0x5a, 0x35, + 0x6e, 0x50, 0x8b, 0x12, 0x48, 0xee, 0xb2, 0x0c, 0x9d, 0x74, 0xce, 0x1a, + 0xc2, 0xb1, 0x26, 0xc6, 0xe5, 0x29, 0x9c, 0x1c, 0x69, 0xf1, 0x13, 0xc4, + 0x7e, 0xd6, 0x81, 0xa1, 0x0f, 0x0f, 0x2d, 0x22, 0xc3, 0xbb, 0x88, 0x1c, + 0xc9, 0x84, 0x66, 0x55, 0xd9, 0xd0, 0x4a, 0x35, 0x3a, 0x63, 0xfd, 0xc3, + 0x20, 0x1f, 0xc9, 0x52, 0xa2, 0x22, 0x35, 0x3c, 0x22, 0x21, 0xa0, 0x78, + 0x8c, 0x7b, 0x35, 0x03, 0xb4, 0xb4, 0x91, 0x41, 0x97, 0xbd, 0x7c, 0x79, + 0x09, 0xa8, 0x39, 0x5a, 0x88, 0xb2, 0xd7, 0x25, 0x47, 0xf8, 0x8b, 0xec, + 0x35, 0x53, 0x80, 0xa5, 0xd7, 0xf9, 0xb0, 0xc6, 0x09, 0x3e, 0x8c, 0xfe, + 0x5e, 0xda, 0x59, 0xc0, 0x8b, 0x18, 0x09, 0x10, 0x12, 0xba, 0x9c, 0xca, + 0x41, 0xb5, 0x46, 0x04, 0xb2, 0x02, 0x11, 0xae, 0xa3, 0xf2, 0x65, 0x14, + 0xe3, 0xca, 0xfe, 0xb3, 0x07, 0x71, 0xfa, 0xba, 0x2c, 0x1c, 0xaa, 0x7a, + 0xf2, 0xe1, 0xb2, 0xc6, 0x14, 0x02, 0xed, 0xe5, 0x21, 0x2b, 0x88, 0xa4, + 0x5e, 0x2c, 0x2c, 0xa3, 0x8b, 0xb8, 0x45, 0x4a, 0xbd, 0xec, 0x12, 0x0a, + 0xb6, 0x38, 0xa1, 0x02, 0x68, 0x4b, 0x99, 0xac, 0xc1, 0xb4, 0xe7, 0x2e, + 0x40, 0x0c, 0xb6, 0x95, 0xf2, 0x40, 0x8b, 0x26, 0xbc, 0x9c, 0xe4, 0x09, + 0x31, 0x2e, 0x9b, 0x65, 0xba, 0xb0, 0x36, 0x12, 0x66, 0x58, 0x2d, 0x01, + 0xdb, 0x04, 0x9c, 0x63, 0x9f, 0x29, 0xa2, 0xcd, 0xc4, 0x28, 0xe1, 0xb6, + 0x55, 0x33, 0x68, 0x1f, 0x29, 0x55, 0x0e, 0x00, 0xe0, 0xca, 0xa8, 0x97, + 0x6d, 0xc0, 0x06, 0x86, 0x4d, 0xb8, 0xf8, 0xe3, 0xc8, 0x34, 0x08, 0xd8, + 0xe2, 0x8a, 0x9f, 0x1b, 0xd1, 0xec, 0x0c, 0xaa, 0x56, 0x8c, 0x6e, 0x32, + 0x2f, 0x74, 0x2e, 0x9f, 0x37, 0xeb, 0x65, 0xf9, 0x61, 0x3d, 0x1d, 0x78, + 0xc9, 0x87, 0x1d, 0x80, 0x9a, 0xde, 0x77, 0x9e, 0x35, 0x3e, 0x64, 0x71, + 0x17, 0x9f, 0x74, 0x04, 0x5c, 0xf5, 0x5b, 0x42, 0x94, 0x76, 0xc2, 0x1f, + 0x57, 0xb5, 0x2a, 0x6d, 0x35, 0xa1, 0x5b, 0x63, 0x24, 0x44, 0xa5, 0xda, + 0x68, 0x49, 0x36, 0xb1, 0x88, 0x89, 0xdb, 0x40, 0x21, 0x84, 0x22, 0x00, + 0x81, 0x27, 0x29, 0x41, 0x50, 0x2a, 0x8a, 0x30, 0x12, 0x21, 0x50, 0xd0, + 0x23, 0xab, 0xb8, 0x90, 0x29, 0x54, 0xe6, 0x15, 0xd6, 0xa5, 0xe1, 0x2c, + 0xdb, 0x82, 0xca, 0x17, 0xb0, 0x73, 0x09, 0xb6, 0x08, 0xca, 0x5d, 0xcf, + 0x78, 0x9c, 0x70, 0xd8, 0x15, 0x33, 0xb5, 0xa4, 0xa7, 0x0f, 0x2b, 0x92, + 0x51, 0xfb, 0x18, 0x72, 0x84, 0xba, 0x69, 0xd8, 0x83, 0x47, 0x0f, 0x89, + 0x19, 0x20, 0x78, 0x64, 0x85, 0x89, 0x20, 0xc9, 0x02, 0xe9, 0x8b, 0x0a, + 0x29, 0x22, 0x00, 0x00, 0x3b + }, + LogoImage[] = + { + 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x80, 0x02, 0xE0, 0x01, 0xF7, 0x00, + 0x00, 0x04, 0x07, 0x07, 0x06, 0x09, 0x0E, 0x0A, 0x0B, 0x0B, 0x14, 0x0B, + 0x0A, 0x13, 0x12, 0x0C, 0x1E, 0x14, 0x0D, 0x06, 0x0A, 0x10, 0x09, 0x0D, + 0x13, 0x09, 0x0E, 0x19, 0x14, 0x17, 0x17, 0x18, 0x1B, 0x1B, 0x0D, 0x11, + 0x16, 0x23, 0x19, 0x13, 0x33, 0x10, 0x0D, 0x35, 0x24, 0x18, 0x31, 0x32, + 0x11, 0x22, 0x24, 0x11, 0x0B, 0x11, 0x22, 0x0D, 0x14, 0x2A, 0x0E, 0x1A, + 0x37, 0x13, 0x17, 0x38, 0x0F, 0x11, 0x29, 0x1E, 0x21, 0x21, 0x23, 0x26, + 0x26, 0x29, 0x2B, 0x2B, 0x2E, 0x31, 0x32, 0x33, 0x36, 0x36, 0x39, 0x3B, + 0x3C, 0x33, 0x32, 0x2A, 0x26, 0x1E, 0x22, 0x51, 0x0D, 0x0E, 0x64, 0x0C, + 0x0D, 0x79, 0x12, 0x14, 0x6D, 0x10, 0x12, 0x41, 0x2B, 0x1F, 0x46, 0x29, + 0x18, 0x4E, 0x32, 0x17, 0x5F, 0x3D, 0x2B, 0x51, 0x34, 0x25, 0x4C, 0x3A, + 0x36, 0x6F, 0x3A, 0x1F, 0x45, 0x45, 0x14, 0x5E, 0x5E, 0x19, 0x50, 0x44, + 0x16, 0x6A, 0x51, 0x1B, 0x7D, 0x7B, 0x1F, 0x6D, 0x6C, 0x1C, 0x6E, 0x46, + 0x31, 0x7E, 0x50, 0x38, 0x77, 0x48, 0x2A, 0x6E, 0x5F, 0x2A, 0x12, 0x1E, + 0x43, 0x1A, 0x1B, 0x4B, 0x1E, 0x1E, 0x56, 0x14, 0x23, 0x4D, 0x17, 0x29, + 0x5E, 0x19, 0x25, 0x57, 0x21, 0x20, 0x5F, 0x2E, 0x2A, 0x5D, 0x3C, 0x35, + 0x5A, 0x19, 0x2D, 0x67, 0x1B, 0x30, 0x6F, 0x1C, 0x34, 0x78, 0x1F, 0x31, + 0x72, 0x22, 0x23, 0x63, 0x24, 0x27, 0x69, 0x25, 0x2A, 0x6D, 0x23, 0x2A, + 0x65, 0x26, 0x2D, 0x73, 0x27, 0x30, 0x77, 0x27, 0x32, 0x7C, 0x34, 0x38, + 0x6D, 0x48, 0x3A, 0x58, 0x3F, 0x41, 0x42, 0x37, 0x47, 0x7E, 0x45, 0x46, + 0x46, 0x4B, 0x4B, 0x4B, 0x47, 0x4A, 0x4A, 0x53, 0x55, 0x55, 0x5A, 0x5B, + 0x5C, 0x57, 0x55, 0x57, 0x51, 0x49, 0x55, 0x6D, 0x55, 0x51, 0x72, 0x68, + 0x54, 0x4F, 0x52, 0x6C, 0x57, 0x69, 0x7A, 0x5D, 0x61, 0x66, 0x62, 0x64, + 0x64, 0x6A, 0x6C, 0x6C, 0x67, 0x69, 0x67, 0x67, 0x74, 0x74, 0x72, 0x74, + 0x74, 0x79, 0x7B, 0x7B, 0x71, 0x76, 0x6A, 0x68, 0x56, 0x63, 0x98, 0x1A, + 0x1E, 0x88, 0x16, 0x19, 0xAF, 0x1E, 0x23, 0xBD, 0x20, 0x25, 0xAF, 0x19, + 0x1D, 0xFF, 0x00, 0x00, 0xFF, 0x10, 0x10, 0xCB, 0x1E, 0x24, 0xED, 0x1F, + 0x24, 0xCD, 0x20, 0x27, 0xC3, 0x20, 0x26, 0xD3, 0x20, 0x27, 0xFF, 0x20, + 0x20, 0xFF, 0x30, 0x30, 0x8D, 0x59, 0x3E, 0x8D, 0x4C, 0x2A, 0xAE, 0x59, + 0x2E, 0x97, 0x6A, 0x28, 0xB3, 0x6D, 0x33, 0x88, 0x5A, 0x1E, 0xCF, 0x67, + 0x33, 0xC4, 0x64, 0x33, 0xD1, 0x69, 0x35, 0xD5, 0x6D, 0x39, 0xD0, 0x67, + 0x34, 0xD9, 0x71, 0x3E, 0xC0, 0x7E, 0x32, 0x9C, 0x63, 0x44, 0x8D, 0x73, + 0x4F, 0xBA, 0x74, 0x50, 0xAD, 0x6E, 0x48, 0x84, 0x5B, 0x48, 0xFF, 0x40, + 0x40, 0xFF, 0x50, 0x50, 0xDD, 0x76, 0x43, 0xC9, 0x7D, 0x56, 0xC6, 0x6F, + 0x44, 0xE3, 0x7C, 0x49, 0xFF, 0x60, 0x60, 0xFF, 0x70, 0x70, 0xFF, 0x7F, + 0x7F, 0x7E, 0x8A, 0x6A, 0x71, 0x80, 0x70, 0x96, 0x90, 0x23, 0xB3, 0xAE, + 0x29, 0xB3, 0x90, 0x2B, 0xD1, 0x8F, 0x34, 0xD1, 0xAD, 0x3A, 0xF9, 0xA4, + 0x37, 0xF9, 0xB9, 0x37, 0xE8, 0xB1, 0x38, 0xEB, 0x98, 0x37, 0xFE, 0xCD, + 0x08, 0xFE, 0xD0, 0x17, 0xD8, 0xD2, 0x32, 0xCB, 0xC4, 0x30, 0xFA, 0xC9, + 0x37, 0xF7, 0xD4, 0x38, 0xF9, 0xDA, 0x37, 0xF1, 0xD2, 0x30, 0xE8, 0xE3, + 0x3C, 0xE6, 0xE0, 0x33, 0xF5, 0xE4, 0x37, 0xF5, 0xEE, 0x36, 0xFB, 0xE3, + 0x31, 0xFB, 0xE5, 0x2F, 0x93, 0x8D, 0x54, 0xAE, 0x8C, 0x49, 0x99, 0xA1, + 0x5E, 0xA6, 0xAC, 0x59, 0xA7, 0xA9, 0x54, 0xB3, 0xB7, 0x53, 0xB0, 0xAA, + 0x4C, 0x8C, 0x96, 0x64, 0x8B, 0x85, 0x62, 0xD5, 0x89, 0x56, 0xE8, 0x81, + 0x4E, 0xED, 0x86, 0x53, 0xF3, 0x8C, 0x59, 0xF5, 0x91, 0x5E, 0xC5, 0xB0, + 0x48, 0xE8, 0x8F, 0x62, 0xF7, 0x95, 0x64, 0xF7, 0x98, 0x68, 0xF7, 0x98, + 0x67, 0xCD, 0xCD, 0x47, 0xC0, 0xC2, 0x4D, 0xDB, 0xD8, 0x42, 0xDB, 0xC8, + 0x43, 0xFE, 0xDB, 0x4B, 0xFE, 0xE1, 0x6C, 0x1E, 0x37, 0x81, 0x26, 0x36, + 0x82, 0x26, 0x38, 0x86, 0x24, 0x3B, 0x8B, 0x22, 0x3E, 0x92, 0x2F, 0x49, + 0x8C, 0x3C, 0x54, 0x87, 0x33, 0x46, 0x85, 0x4A, 0x5F, 0x81, 0x7D, 0x7F, + 0x81, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x8A, 0x8C, 0x8F, 0x86, 0x88, + 0x89, 0x8C, 0x8E, 0x91, 0x8F, 0x90, 0x93, 0x92, 0x93, 0x94, 0x94, 0x96, + 0x99, 0x96, 0x98, 0x9B, 0x9A, 0x9B, 0x9D, 0x98, 0x97, 0x97, 0x90, 0x90, + 0x8F, 0x9C, 0x9E, 0xA1, 0x9E, 0xA0, 0xA3, 0xA1, 0xA3, 0xA4, 0xA4, 0xA6, + 0xA9, 0xA7, 0xA9, 0xAC, 0xAA, 0xAB, 0xAD, 0xAC, 0xAE, 0xB1, 0xAF, 0xB0, + 0xB3, 0xB1, 0xB3, 0xB4, 0xB5, 0xB6, 0xB9, 0xB7, 0xB8, 0xBB, 0xBA, 0xBB, + 0xBD, 0x9F, 0xA0, 0x9F, 0xFF, 0x8F, 0x8F, 0xFF, 0x9F, 0x9F, 0xFF, 0xAF, + 0xAF, 0xFF, 0xBF, 0xBF, 0xFE, 0xE7, 0x89, 0xFF, 0xEF, 0xB2, 0xFF, 0xEC, + 0xA2, 0xBD, 0xBE, 0xC1, 0xBF, 0xC0, 0xC3, 0xC1, 0xC2, 0xC3, 0xC5, 0xC6, + 0xC9, 0xCB, 0xCB, 0xCD, 0xC7, 0xC8, 0xCA, 0xCE, 0xCF, 0xD0, 0xCF, 0xD0, + 0xD2, 0xD2, 0xD2, 0xD3, 0xD6, 0xD7, 0xD8, 0xD7, 0xD8, 0xD9, 0xDB, 0xDC, + 0xDD, 0xFF, 0xCF, 0xCF, 0xFF, 0xDF, 0xDF, 0xFF, 0xF2, 0xC1, 0xFF, 0xF6, + 0xD1, 0xDE, 0xDF, 0xE0, 0xDF, 0xE0, 0xE1, 0xE2, 0xE2, 0xE3, 0xED, 0xED, + 0xEE, 0xE7, 0xE7, 0xE8, 0xFF, 0xEF, 0xEF, 0xEF, 0xEF, 0xF0, 0xEF, 0xF0, + 0xF0, 0xF3, 0xF4, 0xF4, 0xFF, 0xFF, 0xFF, 0xFB, 0xFA, 0xF4, 0xFF, 0xF9, + 0xE0, 0x21, 0xF9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x02, 0xE0, 0x01, 0x00, 0x08, 0xFE, 0x00, 0xFB, 0x09, + 0x1C, 0x48, 0xB0, 0xA0, 0xC1, 0x83, 0x08, 0x13, 0x2A, 0x5C, 0xC8, 0xB0, + 0xA1, 0xC3, 0x87, 0x10, 0x23, 0x4A, 0x9C, 0x48, 0xB1, 0xE2, 0xC1, 0x71, + 0xE1, 0x2C, 0x6A, 0xDC, 0xC8, 0xB1, 0xA3, 0xC7, 0x8F, 0x20, 0x43, 0x8A, + 0x1C, 0x49, 0xB2, 0xA4, 0xC9, 0x93, 0x28, 0x53, 0xAA, 0x5C, 0xC9, 0x12, + 0x61, 0xA6, 0x49, 0xF3, 0x5A, 0xCA, 0x9C, 0x49, 0xB3, 0xA6, 0xCD, 0x9B, + 0x38, 0x73, 0xEA, 0xDC, 0xC9, 0xB3, 0xA7, 0x42, 0x7F, 0xF2, 0x72, 0x4D, + 0x9A, 0x44, 0x09, 0x17, 0x2E, 0x71, 0x3E, 0x93, 0x2A, 0x5D, 0xCA, 0xB4, + 0xA9, 0xD3, 0xA7, 0x50, 0xA3, 0x9E, 0x14, 0x3A, 0xB4, 0x6A, 0x2E, 0xA9, + 0x58, 0xB3, 0x6A, 0xDD, 0xCA, 0xB5, 0xAB, 0xD7, 0xAF, 0x0C, 0xC7, 0x55, + 0xA5, 0x94, 0x09, 0xAC, 0xD9, 0xB3, 0x68, 0xD3, 0xAA, 0x5D, 0xCB, 0xD6, + 0xA1, 0x3F, 0x5C, 0x63, 0xDB, 0xCA, 0x9D, 0x4B, 0xB7, 0xAE, 0xDD, 0xBB, + 0x2B, 0x33, 0x51, 0x0A, 0x27, 0x34, 0x26, 0xDE, 0xBF, 0x80, 0x03, 0x0B, + 0x1E, 0x3C, 0x37, 0x97, 0x3F, 0x81, 0xFE, 0x0E, 0x13, 0x5E, 0xCC, 0xB8, + 0xB1, 0xE3, 0xC7, 0x90, 0x23, 0x4B, 0x9E, 0x4C, 0xB9, 0xB2, 0xE5, 0xCB, + 0x98, 0x33, 0x6B, 0xDE, 0xCC, 0xB9, 0xB3, 0xE7, 0xCF, 0xA0, 0x43, 0x8B, + 0x1E, 0x4D, 0xBA, 0xB4, 0x69, 0xA9, 0xB8, 0x14, 0x6F, 0xDC, 0xA7, 0xEC, + 0xB4, 0xEB, 0xD7, 0xB0, 0x2D, 0x8B, 0x9B, 0x74, 0x95, 0x23, 0x37, 0x00, + 0xEA, 0x62, 0xEB, 0xDE, 0xCD, 0x3B, 0x61, 0x6E, 0xB4, 0xFF, 0xC6, 0xBD, + 0x9C, 0x64, 0xB4, 0x76, 0x45, 0x0D, 0x00, 0x96, 0xF4, 0x5E, 0xCE, 0x3C, + 0x36, 0x00, 0x6E, 0x67, 0xC5, 0x51, 0xAA, 0x3A, 0x94, 0x92, 0x5F, 0x8A, + 0xF4, 0x00, 0x68, 0x87, 0xDE, 0xBC, 0xBB, 0xF7, 0xCF, 0xD9, 0x01, 0xFE, + 0x5C, 0x39, 0x48, 0x6F, 0x5F, 0xD6, 0x7F, 0xC3, 0x87, 0x22, 0xB5, 0xD8, + 0x05, 0x80, 0x0B, 0x00, 0x09, 0xF6, 0xA9, 0xFE, 0x4E, 0xBF, 0xBE, 0xE4, + 0x72, 0xDA, 0x01, 0x68, 0xB8, 0x27, 0x70, 0x5D, 0x2A, 0xE4, 0xF4, 0x68, + 0x25, 0x0F, 0x75, 0xEB, 0x55, 0x94, 0x00, 0x00, 0x9C, 0xBC, 0x77, 0x85, + 0x39, 0xE5, 0x94, 0xC3, 0x9F, 0x7D, 0x10, 0x46, 0x28, 0x18, 0x7E, 0x2E, + 0x3C, 0x00, 0xDF, 0x15, 0x17, 0x00, 0x60, 0x80, 0x01, 0xCA, 0x69, 0x25, + 0x16, 0x2E, 0xE1, 0x68, 0x62, 0x5C, 0x44, 0xE6, 0xFC, 0xE7, 0x9E, 0x27, + 0x9C, 0x40, 0x90, 0x5F, 0x7E, 0x17, 0x98, 0x27, 0xE1, 0x8B, 0x30, 0xB2, + 0x85, 0x5F, 0x0B, 0x9E, 0xA8, 0xA0, 0x5D, 0x00, 0x29, 0x58, 0xC8, 0x5D, + 0x56, 0xE3, 0x14, 0x78, 0x5D, 0x43, 0xEC, 0x10, 0x93, 0x84, 0x76, 0x02, + 0x00, 0x00, 0xC1, 0x22, 0x9E, 0x78, 0xB2, 0x48, 0x0B, 0x4C, 0x5A, 0x98, + 0x00, 0x3A, 0x31, 0x46, 0x29, 0x25, 0x58, 0x33, 0x26, 0xB9, 0xC8, 0x22, + 0x9D, 0x78, 0x42, 0x40, 0x02, 0x0F, 0xE2, 0x75, 0xCF, 0x12, 0xDA, 0xA5, + 0xA0, 0x48, 0x25, 0x49, 0x96, 0x99, 0xA4, 0x25, 0x04, 0x00, 0x60, 0xCE, + 0x94, 0x6C, 0xB6, 0xC9, 0xD1, 0x7C, 0x26, 0xAD, 0x83, 0x1C, 0x8D, 0x65, + 0x72, 0xB2, 0x88, 0x78, 0x83, 0x6D, 0xA1, 0x9D, 0x22, 0x66, 0x96, 0x59, + 0x49, 0x9A, 0xD2, 0xB8, 0x29, 0xE8, 0xA0, 0x10, 0xCD, 0x43, 0x09, 0x4A, + 0xFB, 0xB4, 0x07, 0x80, 0x0A, 0x9C, 0xF4, 0x99, 0x02, 0x00, 0xD7, 0x10, + 0xC6, 0xCD, 0x81, 0x2A, 0xF4, 0xE9, 0x89, 0x85, 0x5D, 0x10, 0xAA, 0xE9, + 0xA6, 0x08, 0x85, 0x33, 0x49, 0x46, 0x25, 0x99, 0x63, 0x01, 0x00, 0x04, + 0x20, 0x69, 0xA9, 0x8D, 0x5B, 0x2C, 0xC6, 0xCE, 0x81, 0xA6, 0x96, 0x69, + 0xE1, 0x3B, 0xFE, 0x9C, 0xC6, 0xAA, 0x29, 0x50, 0xE1, 0x4C, 0x37, 0x09, + 0x26, 0x98, 0x80, 0x0A, 0x12, 0x36, 0xF9, 0x89, 0xD9, 0x68, 0x9F, 0x9C, + 0xA4, 0x49, 0xCE, 0x62, 0xC4, 0x00, 0xD0, 0x6A, 0x92, 0x2D, 0x00, 0x10, + 0xA8, 0xAC, 0xCC, 0xB6, 0x69, 0x28, 0x75, 0x93, 0x64, 0x02, 0xA7, 0x47, + 0xEF, 0x28, 0x93, 0x61, 0x98, 0x96, 0xDE, 0x79, 0x41, 0x97, 0x81, 0x6D, + 0x21, 0x00, 0x92, 0x8A, 0x10, 0xA0, 0x82, 0x25, 0x96, 0xE0, 0x29, 0x53, + 0x81, 0xCD, 0xA6, 0x1B, 0x19, 0x7A, 0xD4, 0x4D, 0x1B, 0x92, 0x3A, 0x5B, + 0x64, 0xE8, 0x08, 0x8A, 0x2B, 0xA4, 0x60, 0x6F, 0x9A, 0x4E, 0x10, 0x06, + 0xE6, 0x22, 0x16, 0xF6, 0x0A, 0xDF, 0x4C, 0x7B, 0xA9, 0x2B, 0x30, 0x64, + 0x9E, 0x56, 0xF5, 0x63, 0x49, 0xB7, 0xD1, 0xF8, 0xE8, 0x8A, 0xDA, 0x45, + 0x2A, 0x18, 0x98, 0xDA, 0x39, 0x71, 0x0F, 0x37, 0xC8, 0x69, 0xC7, 0x4E, + 0x4B, 0xF2, 0x4C, 0x27, 0x8E, 0x38, 0xEE, 0x0E, 0xEC, 0xB1, 0x5D, 0xB5, + 0x86, 0x13, 0x72, 0x4A, 0xD9, 0x89, 0xA9, 0xDF, 0x83, 0xE4, 0x90, 0x63, + 0xCE, 0x6F, 0x81, 0x81, 0x99, 0x80, 0xC3, 0x02, 0xA9, 0x73, 0x05, 0x00, + 0xAD, 0xA5, 0x34, 0x4F, 0x2E, 0x70, 0x51, 0x57, 0xD6, 0xC7, 0x3C, 0xE3, + 0x25, 0xCE, 0x75, 0x1D, 0x8B, 0x74, 0x6D, 0x02, 0x2C, 0x37, 0x06, 0x80, + 0xC4, 0x07, 0xDD, 0x53, 0xF4, 0x49, 0x62, 0xE9, 0x1C, 0x74, 0xCF, 0x50, + 0x97, 0xA6, 0xE7, 0x73, 0x91, 0x95, 0xB3, 0xD3, 0x3C, 0xD4, 0x8D, 0x13, + 0xF5, 0xD6, 0xB1, 0x5D, 0x63, 0xAE, 0x9B, 0x89, 0x51, 0x87, 0x0B, 0xD7, + 0x64, 0x9F, 0x76, 0x8F, 0x06, 0x9A, 0x66, 0xAC, 0xF5, 0x38, 0x23, 0x96, + 0xED, 0xF6, 0xDB, 0x8B, 0x25, 0x06, 0xF7, 0xDC, 0x74, 0xD7, 0x6D, 0xF7, + 0xDD, 0x78, 0xE7, 0xAD, 0xF7, 0xFE, 0xDE, 0x7C, 0xF7, 0xED, 0xF7, 0x49, + 0xF9, 0xE4, 0xF3, 0xF7, 0xE0, 0x84, 0xE7, 0x04, 0xCF, 0x37, 0x87, 0x14, + 0xF2, 0x47, 0x19, 0x64, 0x1C, 0x52, 0xF8, 0xE3, 0x90, 0xAB, 0x04, 0x0E, + 0x19, 0x94, 0x57, 0x4E, 0x79, 0x21, 0x91, 0x67, 0xAE, 0xF9, 0x44, 0xE0, + 0x08, 0x8E, 0x90, 0x37, 0x96, 0x5B, 0xFE, 0xC7, 0xE6, 0xA4, 0x97, 0x3E, + 0x50, 0x3C, 0xE0, 0x1C, 0x62, 0xC8, 0x1F, 0x6B, 0x50, 0xEE, 0x4D, 0x42, + 0x87, 0x84, 0x5E, 0x79, 0x19, 0xA6, 0xD7, 0x9E, 0xB9, 0x21, 0xB2, 0x53, + 0xCE, 0x06, 0xEC, 0xB9, 0x53, 0x6E, 0xFB, 0xEF, 0x85, 0x77, 0xD3, 0x3B, + 0x19, 0xF0, 0x20, 0x84, 0x3B, 0xE5, 0xAD, 0x5B, 0x0E, 0x0E, 0xF0, 0xCC, + 0xF7, 0x3D, 0x79, 0xEF, 0x98, 0x1F, 0xF4, 0x47, 0xE5, 0xD3, 0x5B, 0xFE, + 0xBA, 0x52, 0xF9, 0x00, 0xD2, 0x4D, 0x3C, 0xCD, 0x77, 0xEF, 0x5A, 0x3C, + 0xC3, 0x97, 0xE1, 0x79, 0x41, 0xD5, 0x93, 0x71, 0x7C, 0xE5, 0x8E, 0x27, + 0x04, 0xCF, 0x21, 0x7F, 0x54, 0xDF, 0xFE, 0x21, 0xC5, 0xA3, 0xF4, 0x4D, + 0xE5, 0x6B, 0x14, 0xB2, 0xBC, 0xF7, 0xF8, 0x87, 0x16, 0x7A, 0xF2, 0xAE, + 0x1F, 0xC4, 0x46, 0xE5, 0xF3, 0xB3, 0x1C, 0x20, 0x10, 0x92, 0x8F, 0xF2, + 0xE5, 0x6E, 0x0D, 0xD7, 0x2B, 0xC9, 0xF9, 0x28, 0xF7, 0x8D, 0xFC, 0x39, + 0xD0, 0x33, 0xFF, 0xA3, 0x1E, 0xFF, 0x76, 0x67, 0x10, 0xE5, 0x19, 0x90, + 0x82, 0x05, 0x89, 0x07, 0xE3, 0x86, 0x47, 0xBD, 0xF1, 0x1D, 0xC4, 0x1B, + 0x80, 0x68, 0xDD, 0x1A, 0xFE, 0xD0, 0x0D, 0x0F, 0x32, 0x24, 0x82, 0x95, + 0x33, 0xE1, 0x03, 0x57, 0x58, 0x19, 0x40, 0x84, 0x4E, 0x78, 0x95, 0x8B, + 0x1F, 0x41, 0x94, 0xE7, 0x42, 0xCB, 0x49, 0x8F, 0x83, 0xA1, 0x33, 0x04, + 0x42, 0xE0, 0xC1, 0x3F, 0xCB, 0x95, 0xA1, 0x81, 0xFE, 0xFD, 0xE8, 0x9C, + 0x42, 0xF2, 0x11, 0xBA, 0xD1, 0xB1, 0xF0, 0x88, 0x21, 0xB9, 0x02, 0xB7, + 0xBA, 0x12, 0x3B, 0xCB, 0x81, 0xAF, 0x72, 0xD1, 0x9B, 0x61, 0xE5, 0xE2, + 0xD1, 0xC4, 0x29, 0x16, 0x24, 0x80, 0xFB, 0x43, 0x61, 0xE8, 0x54, 0x08, + 0x8E, 0x0D, 0xF6, 0xEE, 0x1B, 0xF0, 0xA0, 0x5C, 0x19, 0xFE, 0x60, 0x88, + 0xFB, 0x11, 0x24, 0x1F, 0x20, 0xDC, 0x60, 0xFA, 0x90, 0xC8, 0xC6, 0x8D, + 0x64, 0x27, 0x53, 0x60, 0x01, 0x9D, 0xF2, 0x0A, 0x31, 0x3B, 0x0F, 0x3E, + 0xCF, 0x77, 0x58, 0xA4, 0x9C, 0x19, 0x05, 0x52, 0xC3, 0xCA, 0xB1, 0x81, + 0x7B, 0x02, 0x01, 0x47, 0x0F, 0xC9, 0x00, 0xC4, 0x81, 0xC0, 0xC3, 0x8B, + 0xBD, 0x2B, 0x83, 0x1C, 0x01, 0xA8, 0x10, 0x78, 0x74, 0x43, 0x86, 0x6D, + 0x8C, 0xE4, 0x44, 0x94, 0x61, 0x31, 0xB0, 0xDC, 0x91, 0x72, 0xDD, 0xC8, + 0x63, 0x02, 0x83, 0x68, 0xC3, 0x4B, 0x92, 0xA1, 0x1B, 0x05, 0x41, 0x24, + 0x19, 0x00, 0x39, 0x90, 0x45, 0x52, 0x6E, 0x8D, 0x02, 0xD1, 0x62, 0xF8, + 0x42, 0x07, 0x49, 0x81, 0x3C, 0x52, 0x92, 0xB0, 0xD4, 0xC8, 0xB5, 0xD0, + 0x06, 0x96, 0xD0, 0x39, 0x6E, 0x82, 0x04, 0xB9, 0xA4, 0x40, 0x72, 0x58, + 0x90, 0x43, 0x1C, 0x02, 0x10, 0xED, 0xD3, 0xE1, 0x15, 0x6D, 0x49, 0x10, + 0x53, 0xEA, 0xEE, 0x1B, 0xF9, 0x80, 0x87, 0x37, 0x06, 0x59, 0x39, 0x83, + 0x3C, 0xB1, 0x0C, 0xDA, 0x6B, 0x65, 0x2C, 0xA7, 0x99, 0x10, 0x72, 0x00, + 0xA0, 0x5E, 0x34, 0x03, 0x0B, 0x22, 0x47, 0x57, 0x45, 0xE2, 0x0D, 0x04, + 0x86, 0x64, 0x30, 0x62, 0x0F, 0x8D, 0xE8, 0x90, 0x78, 0xA8, 0x12, 0x95, + 0xAA, 0x24, 0xA7, 0x40, 0xF2, 0xA1, 0x4A, 0x32, 0x60, 0xB0, 0x94, 0xC4, + 0xA4, 0xA6, 0x3C, 0x13, 0x32, 0xB3, 0x31, 0x01, 0x40, 0x02, 0xA9, 0xFE, + 0x68, 0x90, 0x39, 0xCC, 0x01, 0xAB, 0xAC, 0x18, 0x70, 0x0D, 0xFD, 0x78, + 0xE2, 0xE5, 0x06, 0x52, 0x45, 0x23, 0xFE, 0x33, 0x21, 0xF9, 0x48, 0xDD, + 0x2F, 0x59, 0x97, 0xBB, 0x04, 0x86, 0xD1, 0x87, 0xA4, 0x3C, 0x9D, 0xEC, + 0x06, 0x58, 0x10, 0x3A, 0x2A, 0x6F, 0x9E, 0x18, 0x1D, 0x48, 0x39, 0x8A, + 0x01, 0x26, 0x02, 0x20, 0x8B, 0x61, 0x95, 0xC4, 0x8A, 0x45, 0x9B, 0xD9, + 0x8F, 0x3E, 0x8A, 0x4F, 0x20, 0x05, 0x15, 0xC8, 0x02, 0xC9, 0xF0, 0xC1, + 0x76, 0xF6, 0xCE, 0x8C, 0xE0, 0x1C, 0xA8, 0xFF, 0xE2, 0x49, 0x90, 0x41, + 0x8E, 0x24, 0xA2, 0x19, 0x1D, 0x5C, 0x17, 0x2A, 0xA6, 0x1D, 0x08, 0xF0, + 0x09, 0x45, 0x57, 0x6A, 0xC1, 0x0A, 0xB4, 0x13, 0x0D, 0xAD, 0x74, 0xD3, + 0x9B, 0x9A, 0x14, 0xC8, 0x48, 0x85, 0x79, 0xD4, 0x3D, 0x66, 0x0F, 0x87, + 0xA1, 0x33, 0x63, 0x1F, 0x19, 0x68, 0xBC, 0xD0, 0x6D, 0x32, 0xA0, 0xA1, + 0xA3, 0xA8, 0x41, 0xBC, 0x51, 0x88, 0xFF, 0x8D, 0x10, 0x7E, 0x0F, 0x99, + 0xDC, 0x1F, 0xF6, 0x98, 0xD3, 0xBE, 0x49, 0xE3, 0x40, 0xA5, 0x22, 0xD3, + 0xAF, 0xEA, 0x64, 0x21, 0x62, 0x6C, 0xC5, 0x93, 0x40, 0xC4, 0x65, 0x3F, + 0xCA, 0x97, 0x3E, 0xB8, 0x12, 0x64, 0xAA, 0xFB, 0x2B, 0xC4, 0x48, 0xF5, + 0x38, 0x10, 0x55, 0xAA, 0x10, 0xA5, 0x51, 0x2D, 0x88, 0x31, 0x41, 0x59, + 0x10, 0x41, 0xF6, 0x8E, 0x0D, 0x85, 0x54, 0xC8, 0x48, 0xC7, 0x5A, 0xD6, + 0xBF, 0xA9, 0x23, 0x43, 0x0F, 0x58, 0xAB, 0x99, 0x2C, 0x34, 0x1E, 0x99, + 0xA0, 0x0E, 0x1C, 0x64, 0x8D, 0xC8, 0x43, 0xD1, 0xA7, 0x52, 0xCB, 0x15, + 0x8F, 0xAE, 0x02, 0x11, 0xE8, 0x29, 0x0D, 0x29, 0xBB, 0x3F, 0x78, 0xC3, + 0x8C, 0x4D, 0x1D, 0x88, 0xEC, 0x12, 0xB2, 0x57, 0x96, 0x16, 0x04, 0xAF, + 0xAD, 0x34, 0xFE, 0x66, 0xEE, 0xFE, 0xF0, 0x57, 0x89, 0xFA, 0xB0, 0xB6, + 0x8D, 0xB5, 0x9B, 0x3E, 0x86, 0x44, 0x00, 0x4B, 0xF4, 0x49, 0x11, 0x00, + 0xC8, 0x40, 0x4B, 0xE2, 0x61, 0x88, 0x41, 0x16, 0x42, 0x9A, 0x0E, 0x09, + 0x5D, 0xF4, 0x44, 0x8B, 0x39, 0xFE, 0x11, 0xB6, 0x1F, 0x59, 0x1D, 0xC8, + 0x4A, 0xA3, 0x48, 0xD0, 0xC0, 0xEE, 0xD2, 0x72, 0xEF, 0x24, 0x9F, 0xE5, + 0x00, 0x1A, 0x4A, 0x1F, 0x0A, 0x16, 0xAA, 0x62, 0x44, 0xAE, 0x52, 0x69, + 0x9A, 0xDB, 0xBE, 0xCD, 0x2C, 0x05, 0xBF, 0x05, 0x80, 0x5B, 0x55, 0x92, + 0x8F, 0x95, 0xF2, 0x52, 0x22, 0x5A, 0x24, 0x67, 0xF9, 0xC4, 0x77, 0xD1, + 0x54, 0x8A, 0x6E, 0x20, 0x06, 0x24, 0x83, 0x0A, 0xF1, 0x6A, 0xC6, 0xD5, + 0x22, 0xA4, 0x88, 0x05, 0xD9, 0x2C, 0xE5, 0xB4, 0x1A, 0x50, 0x51, 0x72, + 0x70, 0x0D, 0x7F, 0x15, 0x2D, 0x19, 0x4E, 0x5A, 0x5E, 0xBF, 0x59, 0x93, + 0x4E, 0x7E, 0x4A, 0x8E, 0x4A, 0x78, 0x08, 0x55, 0x36, 0xE0, 0x16, 0x21, + 0x06, 0xA4, 0x9D, 0x40, 0x4C, 0x69, 0x4A, 0xA9, 0x86, 0x0E, 0xBF, 0x1F, + 0x2E, 0x48, 0x3E, 0x44, 0x69, 0xC6, 0x41, 0xE2, 0x54, 0x20, 0x79, 0x6C, + 0x5C, 0x41, 0x62, 0xFA, 0x49, 0x82, 0xE4, 0x97, 0x0C, 0x85, 0xE0, 0x1E, + 0x3C, 0xDC, 0x8B, 0x4A, 0xE9, 0x92, 0xB7, 0xC1, 0x7B, 0x7B, 0xB0, 0x27, + 0xC2, 0xE5, 0x53, 0x4E, 0x58, 0x68, 0x89, 0x23, 0x39, 0x24, 0x78, 0xC9, + 0x40, 0xE0, 0x86, 0x1C, 0x75, 0x7C, 0x5E, 0xD4, 0x22, 0x6A, 0xB7, 0x28, + 0x90, 0xFC, 0xE2, 0xB4, 0xB5, 0xA3, 0x1C, 0x08, 0x5E, 0x6B, 0x6C, 0x5F, + 0xEB, 0xBD, 0x96, 0x95, 0x03, 0xF1, 0x64, 0x8B, 0x73, 0x19, 0x3A, 0x0D, + 0x9F, 0x51, 0x94, 0x27, 0xC6, 0x31, 0xDE, 0xAC, 0xA9, 0x82, 0x85, 0x69, + 0x87, 0x00, 0x69, 0xC2, 0x06, 0xFE, 0xE0, 0x98, 0x39, 0x42, 0x66, 0x6E, + 0xD9, 0x21, 0x2C, 0x36, 0xA3, 0x7B, 0x7D, 0x07, 0xCF, 0xFA, 0xB6, 0xF6, + 0x8F, 0x28, 0x7E, 0xB1, 0x6B, 0x37, 0x2C, 0x3B, 0xB2, 0x42, 0x99, 0xAC, + 0x88, 0xF4, 0x72, 0x49, 0x01, 0x6C, 0x10, 0x27, 0xF7, 0x52, 0xB9, 0x75, + 0xBB, 0x47, 0x39, 0xD6, 0x24, 0xE6, 0x82, 0x14, 0x23, 0x3F, 0x1A, 0x40, + 0x87, 0x3D, 0xB6, 0x70, 0x20, 0x00, 0xA4, 0xCA, 0x24, 0x47, 0x65, 0x83, + 0x19, 0xBB, 0xD8, 0xE5, 0x0B, 0x17, 0xD6, 0xAA, 0xB6, 0xF5, 0x6F, 0x20, + 0x5F, 0x38, 0xEA, 0x21, 0x93, 0x74, 0x9D, 0x06, 0x2E, 0xC4, 0x37, 0xC0, + 0xB1, 0xCC, 0xDC, 0x05, 0x38, 0xBA, 0xEB, 0xEC, 0xF3, 0x41, 0x52, 0x3B, + 0x90, 0x11, 0x87, 0x2E, 0xCC, 0x3D, 0xBB, 0xC7, 0x35, 0xB6, 0x00, 0x31, + 0xED, 0x5C, 0xA0, 0x1E, 0x8D, 0x1E, 0xC8, 0xA3, 0x13, 0x50, 0x8C, 0x82, + 0x48, 0x43, 0x03, 0xB4, 0x2C, 0x09, 0x22, 0x8B, 0xDC, 0x0F, 0x21, 0x5B, + 0x8E, 0xBA, 0x0B, 0x21, 0xA2, 0xE5, 0xD0, 0xE9, 0xEA, 0x5A, 0xD3, 0x14, + 0xCA, 0x3E, 0x6C, 0x2D, 0x24, 0x59, 0x0C, 0x55, 0x41, 0xF7, 0x83, 0xC5, + 0x09, 0x34, 0x66, 0x76, 0x6D, 0x5C, 0x5F, 0x3E, 0x3F, 0x9B, 0x6C, 0xF4, + 0x50, 0x46, 0xAF, 0xF3, 0x13, 0x00, 0xED, 0x0C, 0x2B, 0xD8, 0xFD, 0xE0, + 0x68, 0x3F, 0x0D, 0x02, 0xA5, 0x92, 0x78, 0xF2, 0xC4, 0x86, 0xBD, 0xF5, + 0x43, 0x08, 0x6D, 0x6E, 0xEC, 0x76, 0x17, 0x8A, 0x04, 0xC1, 0x76, 0x38, + 0x13, 0xAA, 0x5C, 0x0F, 0x0A, 0xBC, 0x77, 0xEA, 0x1C, 0xB4, 0x13, 0x07, + 0xD2, 0xDA, 0xAB, 0x12, 0x64, 0xC6, 0xC9, 0xF3, 0xE0, 0x20, 0x33, 0x3B, + 0xB0, 0x7A, 0x28, 0x83, 0xA7, 0xDA, 0x41, 0xC0, 0x04, 0x68, 0x30, 0x01, + 0xED, 0x70, 0x09, 0xDE, 0xFD, 0xB0, 0x47, 0x4D, 0xFE, 0xBA, 0x99, 0x5D, + 0x70, 0xBC, 0x98, 0xB1, 0x0F, 0xB9, 0xE0, 0x97, 0xF9, 0xED, 0xCA, 0x43, + 0x80, 0x23, 0xCC, 0xE0, 0x28, 0x44, 0xF2, 0xEA, 0x87, 0x5A, 0x5F, 0x26, + 0xEE, 0x0F, 0xAD, 0x9C, 0x33, 0x26, 0xDF, 0xAB, 0xDA, 0xED, 0x12, 0x44, + 0x95, 0xB8, 0x7E, 0xB8, 0x30, 0xFB, 0x4D, 0xB9, 0x84, 0xAF, 0xB3, 0x59, + 0xF5, 0x48, 0x06, 0xC6, 0x01, 0x70, 0x00, 0x1A, 0xE0, 0x00, 0x08, 0x34, + 0x40, 0x80, 0xC7, 0x97, 0x06, 0x72, 0x99, 0x74, 0x93, 0x9C, 0x26, 0x2F, + 0x2D, 0xC5, 0x17, 0xD2, 0xDA, 0x8A, 0x52, 0x0F, 0x10, 0x0E, 0xB7, 0x37, + 0x5E, 0xD7, 0xB0, 0x6A, 0x52, 0x67, 0x19, 0xD1, 0x3D, 0xA7, 0xDF, 0x44, + 0x26, 0x7E, 0xC5, 0xE9, 0xA1, 0x9C, 0x50, 0xF7, 0x90, 0xC6, 0xBA, 0x01, + 0x10, 0x00, 0x0A, 0xE0, 0x20, 0x08, 0x39, 0xA8, 0x41, 0x05, 0x58, 0x74, + 0xB1, 0xAA, 0xCB, 0x4F, 0xBC, 0xDD, 0x04, 0x68, 0xD6, 0x8B, 0xB8, 0x47, + 0xD4, 0x39, 0xE4, 0xA8, 0x11, 0x45, 0x5D, 0xD0, 0x53, 0x82, 0x59, 0x70, + 0xC4, 0x2F, 0xCE, 0x04, 0x39, 0xEA, 0x26, 0x59, 0xEE, 0x90, 0x14, 0xAB, + 0xB3, 0xD5, 0xA2, 0xDB, 0x3A, 0x8C, 0xB0, 0x31, 0x33, 0x86, 0x45, 0x80, + 0x06, 0x40, 0x08, 0x7D, 0x0D, 0x28, 0xB0, 0x22, 0xA4, 0xF9, 0xFD, 0x24, + 0xA0, 0x2B, 0x43, 0x98, 0xC5, 0xAD, 0x75, 0x82, 0xC4, 0x83, 0x8E, 0x43, + 0x5F, 0xC8, 0x37, 0xCA, 0xC0, 0x86, 0x42, 0x1C, 0x02, 0x99, 0x34, 0xE9, + 0xC6, 0x1F, 0x6C, 0xFF, 0xF2, 0x84, 0xE0, 0xD5, 0x83, 0x86, 0x4E, 0x7B, + 0xD1, 0x25, 0x92, 0xDF, 0xD7, 0xE5, 0xA3, 0x1B, 0x6E, 0x46, 0xDE, 0xE2, + 0x27, 0x72, 0xB0, 0xCE, 0xBC, 0x83, 0xD2, 0x0C, 0x23, 0x80, 0x0B, 0x9C, + 0x80, 0xF7, 0xBC, 0x93, 0x3E, 0x3F, 0x18, 0x80, 0xD9, 0xE9, 0x4B, 0xFE, + 0x32, 0x52, 0x0B, 0x1B, 0x44, 0xC0, 0xB2, 0xD3, 0xB4, 0xEB, 0x17, 0x8B, + 0x15, 0x4F, 0x52, 0xB9, 0x1F, 0xD2, 0x56, 0xBB, 0x14, 0xD5, 0xDF, 0x57, + 0x9F, 0x1B, 0x04, 0xB7, 0x9E, 0x44, 0xF0, 0x21, 0x0C, 0x4C, 0xBF, 0x12, + 0x82, 0xC4, 0x50, 0x4F, 0xA3, 0x4C, 0xDC, 0xE7, 0x0E, 0x00, 0x31, 0x75, + 0x02, 0x13, 0x97, 0x10, 0x05, 0x39, 0x00, 0x04, 0x52, 0xE7, 0x71, 0x7B, + 0xC0, 0x0F, 0xDB, 0x67, 0x12, 0x05, 0x04, 0x6B, 0x05, 0xE1, 0x66, 0x08, + 0x64, 0x10, 0x3D, 0x74, 0x7E, 0x4C, 0xA1, 0x60, 0x08, 0x66, 0x10, 0xAD, + 0x45, 0x5D, 0xAF, 0xE7, 0x45, 0xD0, 0xD6, 0x5A, 0x89, 0xD5, 0x6C, 0xEE, + 0xB4, 0x3D, 0x85, 0xB6, 0x3F, 0x1C, 0x64, 0x3F, 0x23, 0x21, 0x14, 0x6D, + 0x73, 0x19, 0xF4, 0x70, 0x05, 0x95, 0x96, 0x1F, 0x06, 0x40, 0x01, 0x44, + 0xB0, 0x09, 0x9D, 0x90, 0x09, 0x00, 0xD8, 0x07, 0x3D, 0x30, 0x03, 0xF9, + 0x71, 0x05, 0x01, 0x92, 0x80, 0x27, 0x01, 0x65, 0xB1, 0x07, 0x58, 0xA0, + 0xE6, 0x4C, 0x3F, 0x28, 0x15, 0xF9, 0xB5, 0x06, 0xAF, 0xD4, 0x6C, 0x78, + 0x45, 0x06, 0x14, 0xE7, 0x48, 0x60, 0xF7, 0x69, 0x3E, 0xF4, 0x5C, 0xE6, + 0x24, 0x3A, 0x85, 0xA4, 0x60, 0xC3, 0xB3, 0x06, 0x87, 0xE0, 0x69, 0x14, + 0xF1, 0x0F, 0xE1, 0x80, 0x0B, 0xB6, 0x32, 0x14, 0x27, 0x18, 0x19, 0xD0, + 0xC0, 0x7F, 0x12, 0x80, 0x03, 0xBB, 0x40, 0x04, 0x41, 0xE0, 0x09, 0x9B, + 0xA0, 0x09, 0x97, 0x00, 0x09, 0xAA, 0x30, 0x04, 0xED, 0x06, 0x00, 0xEF, + 0xA6, 0x83, 0x24, 0xA1, 0x50, 0x98, 0x67, 0x65, 0xAE, 0x27, 0x3B, 0x1D, + 0xC8, 0x47, 0x4C, 0x86, 0x15, 0xCE, 0x36, 0x64, 0x46, 0xC7, 0x10, 0x2F, + 0x36, 0x46, 0x8B, 0x23, 0x3B, 0x09, 0x74, 0x70, 0xD4, 0x73, 0x87, 0x1F, + 0x31, 0x0F, 0xFE, 0xE9, 0xC1, 0x85, 0x95, 0xB1, 0x0F, 0xC5, 0x70, 0x2D, + 0xEC, 0x36, 0x01, 0x3F, 0x30, 0x86, 0x42, 0x10, 0x04, 0x40, 0xC0, 0x09, + 0xB8, 0x70, 0x09, 0x97, 0xF0, 0x08, 0xA2, 0x50, 0x80, 0xF9, 0xE2, 0x40, + 0x3D, 0x82, 0x15, 0xDF, 0x90, 0x7C, 0x9E, 0x55, 0x10, 0x2B, 0x55, 0x06, + 0x4E, 0x85, 0x57, 0xD0, 0x16, 0x15, 0x7B, 0x88, 0x43, 0x65, 0x20, 0x5E, + 0x43, 0x44, 0x7F, 0xB9, 0xA3, 0x55, 0x52, 0x98, 0x3B, 0x9A, 0xE7, 0x11, + 0xFF, 0x90, 0x33, 0x43, 0x41, 0x19, 0xF5, 0xD0, 0x79, 0x2B, 0x82, 0x00, + 0x38, 0xC0, 0x0B, 0xBC, 0x60, 0x04, 0x44, 0x30, 0x89, 0x39, 0x90, 0x03, + 0xA1, 0x90, 0x86, 0x90, 0xF0, 0x08, 0x27, 0x90, 0x1F, 0x39, 0x98, 0x3F, + 0x64, 0x91, 0x7F, 0x3C, 0x41, 0x88, 0x10, 0xB5, 0x72, 0x59, 0xE5, 0x4B, + 0x50, 0xA6, 0x7A, 0x5C, 0xF1, 0x7A, 0xDD, 0x66, 0x88, 0x0D, 0xF1, 0x84, + 0x38, 0xE4, 0x7D, 0xE3, 0x05, 0x55, 0xB5, 0xE8, 0x11, 0x05, 0xA3, 0x1E, + 0x91, 0x61, 0x0E, 0x60, 0xD8, 0x03, 0xBE, 0xC0, 0x0B, 0xBB, 0x50, 0x04, + 0xC3, 0x48, 0x89, 0xC5, 0x98, 0x03, 0x7B, 0x10, 0x09, 0x8D, 0x20, 0x05, + 0x45, 0x62, 0x69, 0x0E, 0x84, 0x85, 0x43, 0x81, 0x0B, 0xB9, 0x10, 0x0E, + 0xCD, 0xD7, 0x13, 0x3A, 0x77, 0x58, 0x1E, 0x94, 0x62, 0x38, 0x74, 0x87, + 0x9F, 0x18, 0x15, 0xF1, 0xD0, 0x0D, 0x2E, 0x55, 0x06, 0x31, 0xA6, 0x11, + 0xF3, 0x37, 0x3C, 0xB1, 0x97, 0x7E, 0xB3, 0x63, 0x08, 0xC6, 0x24, 0x81, + 0x20, 0x11, 0x0E, 0x99, 0x20, 0x0F, 0xE2, 0x00, 0x22, 0x8F, 0x21, 0x0D, + 0x8E, 0x98, 0x1F, 0x13, 0xA0, 0x0B, 0xBE, 0xD0, 0x0B, 0xBA, 0x60, 0x04, + 0xEE, 0x38, 0x89, 0xA1, 0x17, 0x8F, 0x39, 0x10, 0x04, 0x44, 0x20, 0x01, + 0x1E, 0x07, 0x64, 0xC0, 0x83, 0xFE, 0x8B, 0xD5, 0xD1, 0x85, 0x3C, 0x91, + 0x62, 0x8A, 0xB4, 0x4E, 0xDE, 0x60, 0x60, 0x45, 0xC6, 0x6D, 0xB9, 0xF3, + 0x43, 0x07, 0x41, 0x09, 0x94, 0x00, 0x8D, 0x49, 0x01, 0x0F, 0xAC, 0xE6, + 0x72, 0xAE, 0x28, 0x11, 0x68, 0x34, 0x55, 0x0C, 0x49, 0x56, 0x47, 0x45, + 0x51, 0xE6, 0x87, 0x12, 0x1C, 0x03, 0x19, 0x71, 0xF7, 0x91, 0x74, 0x67, + 0x03, 0x22, 0x39, 0x92, 0xB4, 0x40, 0x05, 0x44, 0xF0, 0x8E, 0xD5, 0x17, + 0x8F, 0x40, 0x20, 0x04, 0x38, 0x90, 0x1F, 0xCF, 0xE0, 0x40, 0xFE, 0x40, + 0x15, 0xFB, 0xE8, 0x14, 0x3D, 0x84, 0x8D, 0x67, 0xD4, 0x4E, 0x3D, 0x28, + 0x5B, 0x45, 0x74, 0x62, 0xE2, 0x50, 0x30, 0x45, 0x61, 0x18, 0x91, 0xA1, + 0x78, 0x07, 0x61, 0x6B, 0x0B, 0x87, 0x7E, 0x37, 0xB6, 0x1C, 0xF7, 0x50, + 0x0C, 0x2B, 0x98, 0x71, 0x37, 0x70, 0x95, 0xBD, 0xD0, 0x0B, 0xA9, 0xD0, + 0x09, 0xA1, 0x30, 0x8C, 0x42, 0x90, 0x92, 0x5E, 0x29, 0x04, 0x42, 0xC0, + 0x22, 0x2C, 0x24, 0x36, 0x4D, 0x01, 0x7E, 0x14, 0xC7, 0x4E, 0x82, 0x18, + 0x60, 0x7A, 0x06, 0x08, 0x14, 0x27, 0x93, 0x8A, 0xB8, 0x19, 0x47, 0x45, + 0x5D, 0x94, 0xC7, 0x1B, 0xFC, 0xE0, 0x97, 0x0C, 0x23, 0x01, 0x3C, 0xE0, + 0x0B, 0xA6, 0x69, 0x9A, 0xBC, 0xA0, 0x04, 0x9B, 0xE0, 0x09, 0x95, 0x40, + 0x86, 0xF0, 0xA8, 0x92, 0x5F, 0xD9, 0x71, 0xDA, 0xA1, 0x66, 0x2B, 0x44, + 0x14, 0xB9, 0xA0, 0x17, 0x4D, 0x61, 0x4C, 0x08, 0x65, 0x60, 0xD2, 0x94, + 0x50, 0x36, 0x27, 0x44, 0x09, 0x61, 0x96, 0xC4, 0xD1, 0x19, 0x26, 0xB6, + 0x7E, 0xC3, 0xC7, 0x97, 0xA2, 0xB9, 0x22, 0x12, 0xD0, 0x03, 0xBD, 0x70, + 0x9A, 0xA8, 0xB9, 0x0B, 0xA5, 0xD0, 0x09, 0xD2, 0x79, 0x05, 0xAF, 0xA9, + 0x92, 0x42, 0x90, 0x03, 0xF9, 0xD1, 0x21, 0x2B, 0xFE, 0x84, 0x0B, 0x7E, + 0x21, 0x0E, 0xFF, 0xC0, 0x14, 0x81, 0xA7, 0x10, 0x04, 0xA9, 0x96, 0x15, + 0xB1, 0x85, 0x63, 0xB3, 0x19, 0xF9, 0xF0, 0x90, 0x03, 0x56, 0x10, 0x9F, + 0xF9, 0x1A, 0x7D, 0xF9, 0x97, 0x00, 0x30, 0x01, 0xEA, 0xE8, 0x9C, 0xBE, + 0xA0, 0x0B, 0xC1, 0x60, 0x05, 0x57, 0x20, 0x9D, 0x31, 0x78, 0x0A, 0x94, + 0xC8, 0x03, 0x2A, 0xC9, 0x92, 0x05, 0x08, 0x00, 0x56, 0x03, 0x87, 0x23, + 0x61, 0x4C, 0x17, 0xD6, 0x4E, 0xE0, 0x48, 0x11, 0x44, 0x81, 0x91, 0x93, + 0xE0, 0x19, 0xE9, 0xC9, 0x38, 0x64, 0x95, 0x5F, 0xBC, 0xA1, 0x0C, 0xF0, + 0x19, 0x92, 0xF4, 0xE9, 0x0B, 0xB5, 0x90, 0x25, 0x66, 0xD2, 0x09, 0x9F, + 0x90, 0x09, 0x99, 0x70, 0x0A, 0x7B, 0x20, 0x05, 0x3A, 0x50, 0x8C, 0x40, + 0x40, 0x04, 0xD7, 0xF7, 0x35, 0x04, 0x1A, 0x12, 0x9E, 0x14, 0x76, 0xDF, + 0x14, 0x8B, 0x16, 0x41, 0x97, 0xFD, 0x30, 0x0F, 0x42, 0x39, 0x19, 0x77, + 0x28, 0xA1, 0xB1, 0x11, 0x0D, 0x54, 0x69, 0xA1, 0x17, 0xEA, 0x0B, 0x55, + 0xB0, 0x9A, 0x65, 0x22, 0x9D, 0x1E, 0x8A, 0x2B, 0x42, 0x1A, 0x09, 0x52, + 0x10, 0x04, 0x41, 0xD0, 0x86, 0x00, 0xD0, 0x8C, 0x29, 0x1A, 0x12, 0xFB, + 0xA3, 0x10, 0x5A, 0x46, 0x39, 0x3D, 0x08, 0x11, 0x33, 0xEA, 0x19, 0x36, + 0xEA, 0x1A, 0xE5, 0x90, 0xA3, 0x22, 0xF9, 0x0B, 0x3B, 0x3A, 0x98, 0x54, + 0xB0, 0x9A, 0x9D, 0x00, 0x83, 0x30, 0x28, 0x83, 0x00, 0x08, 0x80, 0x53, + 0xC0, 0x92, 0x11, 0x90, 0x1F, 0xC5, 0xB6, 0xA4, 0x23, 0x31, 0x65, 0x09, + 0x41, 0x90, 0x95, 0x33, 0x8E, 0xF4, 0xC1, 0x5F, 0xA7, 0x51, 0x0E, 0x49, + 0x80, 0xA4, 0x00, 0x30, 0x03, 0x57, 0xB9, 0xA3, 0x23, 0xD9, 0x0B, 0xC1, + 0x88, 0x05, 0xFA, 0x19, 0x83, 0x41, 0x0A, 0x80, 0x95, 0x20, 0x05, 0xFE, + 0x2B, 0x59, 0x03, 0xF9, 0xF1, 0x71, 0x6A, 0x2A, 0x12, 0x5A, 0xC6, 0x8D, + 0x16, 0xC5, 0x06, 0xA2, 0x54, 0x81, 0x51, 0x62, 0x4C, 0x70, 0x9A, 0x19, + 0x29, 0x38, 0x9A, 0x79, 0xAA, 0xA7, 0x83, 0x09, 0x8C, 0x26, 0x19, 0x0A, + 0x9E, 0x00, 0xA8, 0x42, 0x8A, 0x09, 0x91, 0x80, 0x04, 0x3C, 0x60, 0xA4, + 0x01, 0x5A, 0x33, 0x89, 0x2A, 0x12, 0xF9, 0xE5, 0x93, 0xAF, 0x56, 0x74, + 0xE0, 0xA7, 0x62, 0x5A, 0x21, 0x72, 0x6A, 0xA1, 0x8D, 0x7C, 0x25, 0x1A, + 0xF7, 0x40, 0x0C, 0x7F, 0xB9, 0x9C, 0xBE, 0xA0, 0xA5, 0xA7, 0xA9, 0xAB, + 0xBB, 0xAA, 0x0B, 0xEC, 0x68, 0x92, 0x44, 0x10, 0x0A, 0x99, 0x10, 0xA6, + 0x9F, 0x1A, 0x05, 0xA1, 0x27, 0x04, 0x27, 0x7A, 0x01, 0xA7, 0xAA, 0x11, + 0x97, 0x75, 0x10, 0xAD, 0x6A, 0x3E, 0xE3, 0x33, 0x7B, 0x95, 0x33, 0x40, + 0x2C, 0xC6, 0x5D, 0x1A, 0x01, 0x93, 0x1C, 0xA1, 0xA4, 0x04, 0xF1, 0x0E, + 0x4B, 0x90, 0xA6, 0x6B, 0x91, 0x81, 0x16, 0x99, 0x19, 0x1E, 0xB9, 0x22, + 0x11, 0xA0, 0x8E, 0x55, 0x60, 0x0B, 0x9B, 0x60, 0x9A, 0xBF, 0x20, 0x0C, + 0xA6, 0x50, 0x0B, 0xC2, 0x70, 0x9A, 0x7C, 0xFA, 0xAB, 0x45, 0x20, 0x04, + 0xB4, 0x90, 0x09, 0xFF, 0x27, 0xA6, 0x98, 0x68, 0xAC, 0x78, 0xB7, 0x22, + 0xB4, 0xB9, 0xAC, 0x12, 0x31, 0x78, 0x0B, 0x46, 0x65, 0x6E, 0x19, 0x4E, + 0x0C, 0x45, 0x87, 0xC5, 0x69, 0x11, 0xD2, 0xE0, 0xAD, 0x20, 0x71, 0x01, + 0x57, 0x30, 0xA0, 0x8A, 0x41, 0xA1, 0x00, 0xA0, 0xB0, 0x6B, 0x91, 0x4C, + 0xA0, 0xA1, 0x0E, 0xEB, 0x86, 0x00, 0xA5, 0xF9, 0x0B, 0xA3, 0x90, 0x24, + 0xA4, 0x90, 0xAB, 0xA6, 0x50, 0x26, 0xB6, 0x00, 0xAF, 0xC1, 0x08, 0xAC, + 0x47, 0x00, 0xA4, 0x62, 0x0A, 0x80, 0x97, 0x50, 0xA6, 0x44, 0xB0, 0x77, + 0xDA, 0xA1, 0xFE, 0x9D, 0xFE, 0xFA, 0x10, 0x4F, 0x15, 0x7E, 0x4F, 0x36, + 0x64, 0x18, 0x24, 0xA9, 0x1A, 0xE1, 0x04, 0xB8, 0x21, 0x12, 0x9D, 0x77, + 0x01, 0xCF, 0xB0, 0x0F, 0xF5, 0xD0, 0x6B, 0xC9, 0xA0, 0x39, 0xFA, 0x30, + 0x35, 0x19, 0x67, 0x95, 0xBE, 0x20, 0x0C, 0xB6, 0xE0, 0x09, 0xB6, 0xA0, + 0x05, 0xB9, 0x4A, 0x0B, 0x9E, 0x40, 0x0B, 0xE7, 0xEA, 0x09, 0xA6, 0x19, + 0xAF, 0x26, 0xE9, 0x8E, 0x57, 0x20, 0x83, 0x9A, 0xB0, 0x07, 0x43, 0xB0, + 0x07, 0x98, 0x78, 0x09, 0x7B, 0x20, 0x04, 0x34, 0xB0, 0x22, 0x8C, 0xF6, + 0xB2, 0x0E, 0x41, 0x99, 0x89, 0xE4, 0x67, 0xDD, 0x26, 0x43, 0x9E, 0x34, + 0xA9, 0x09, 0x11, 0x1E, 0x2E, 0xEB, 0x11, 0xD2, 0x40, 0x2A, 0x87, 0x0A, + 0x00, 0x0F, 0x60, 0x23, 0x03, 0x0A, 0x39, 0x67, 0xB5, 0x22, 0x16, 0xAA, + 0xB1, 0x49, 0x32, 0x0A, 0x5A, 0xFA, 0x0B, 0x4E, 0x4B, 0x0A, 0xBF, 0x50, + 0x05, 0x9E, 0x60, 0x0A, 0x23, 0xC9, 0x0B, 0xA8, 0x50, 0x0B, 0xA7, 0x70, + 0x04, 0x5B, 0x19, 0x0A, 0x8E, 0x30, 0x05, 0x8A, 0xB9, 0x03, 0xAF, 0x00, + 0x09, 0x5F, 0x8B, 0xA4, 0x95, 0x45, 0xB6, 0x0D, 0x61, 0xB6, 0x1C, 0x54, + 0x63, 0x3C, 0x49, 0x3F, 0xDB, 0x16, 0x62, 0x15, 0x51, 0x2C, 0x69, 0xB2, + 0x23, 0x1E, 0x71, 0x0F, 0x74, 0x5B, 0x09, 0x2D, 0x80, 0x66, 0x7C, 0x92, + 0x2C, 0x77, 0x4B, 0x38, 0xDC, 0xAA, 0x9C, 0x3E, 0x60, 0x9A, 0x48, 0xAB, + 0xB4, 0x55, 0x70, 0x9A, 0xA4, 0x50, 0xB8, 0xA6, 0xE9, 0xB4, 0x5A, 0xD0, + 0x0B, 0x58, 0xE0, 0xA3, 0x9E, 0x70, 0x98, 0x3C, 0x40, 0x05, 0x41, 0xC0, + 0x03, 0x40, 0xA0, 0x92, 0x39, 0x20, 0x05, 0xA2, 0x70, 0xA2, 0x49, 0x8A, + 0xB9, 0x0E, 0x71, 0x84, 0xBD, 0x03, 0x08, 0x1E, 0x04, 0x0F, 0x7A, 0x56, + 0x08, 0x1E, 0x94, 0x0F, 0x3D, 0xFE, 0x94, 0x8A, 0x11, 0x91, 0x21, 0x77, + 0x12, 0x1F, 0x21, 0x81, 0x1C, 0xBF, 0x42, 0x26, 0x9E, 0xF0, 0x1E, 0xAD, + 0xAB, 0x19, 0xCA, 0x80, 0xAD, 0x5E, 0xF1, 0x68, 0xF9, 0x81, 0xB1, 0xEA, + 0x9A, 0x08, 0x49, 0x62, 0x0A, 0xBC, 0x2A, 0x0C, 0x4A, 0xAB, 0xA5, 0xB7, + 0x5B, 0x0B, 0xBF, 0xD0, 0x05, 0x7D, 0x7B, 0x05, 0xBF, 0xCB, 0x98, 0x46, + 0x5A, 0xBC, 0xC6, 0x2B, 0x04, 0x43, 0xB0, 0x22, 0x97, 0xC6, 0xBC, 0xB2, + 0x17, 0x3A, 0x88, 0x95, 0x93, 0x07, 0xD4, 0x4A, 0x09, 0xA9, 0x38, 0x85, + 0x00, 0x82, 0x6B, 0xA9, 0x6F, 0x15, 0x81, 0x1F, 0x2B, 0x10, 0xBE, 0xFA, + 0x41, 0x0C, 0xC5, 0x50, 0xC1, 0xD2, 0x30, 0xB6, 0x15, 0xA1, 0x27, 0x3F, + 0x55, 0x26, 0x8F, 0x72, 0xB9, 0x5D, 0x81, 0x2E, 0x27, 0x71, 0x01, 0x70, + 0x74, 0x16, 0xE6, 0xF0, 0x91, 0x46, 0x9B, 0xAB, 0x5A, 0x60, 0x86, 0x89, + 0x90, 0xAB, 0xA7, 0xF9, 0xB1, 0x55, 0xF0, 0x0B, 0xA8, 0x80, 0x22, 0xBF, + 0x90, 0xC2, 0x9E, 0xD0, 0x05, 0x46, 0x50, 0x0A, 0x9E, 0x30, 0x05, 0x93, + 0xA8, 0x03, 0xA1, 0x30, 0x04, 0xC6, 0x3B, 0x04, 0x44, 0x70, 0xA6, 0x2F, + 0x29, 0xC0, 0xD1, 0x86, 0x48, 0xE0, 0xF8, 0xA4, 0xFD, 0xB3, 0x10, 0x80, + 0x04, 0x0F, 0xE7, 0x34, 0x11, 0xF4, 0x20, 0x0D, 0x18, 0xA2, 0x1D, 0x48, + 0x92, 0x22, 0x20, 0x65, 0xAA, 0x15, 0x81, 0xB3, 0x10, 0x76, 0x26, 0x69, + 0x92, 0x04, 0xE6, 0x0B, 0x15, 0x01, 0x83, 0x12, 0x5E, 0x23, 0xA0, 0x66, + 0xB1, 0x0F, 0x44, 0x1B, 0x9F, 0x97, 0xEA, 0x0B, 0x5A, 0xE0, 0xAE, 0x17, + 0xAA, 0xB4, 0xEC, 0x6A, 0x86, 0x55, 0xD0, 0x0B, 0xAB, 0x69, 0xC3, 0x56, + 0xA0, 0xB4, 0x42, 0xD0, 0x03, 0x40, 0xF0, 0x0A, 0x39, 0x0C, 0x9B, 0x60, + 0xB9, 0x22, 0x12, 0x4B, 0xC4, 0x5B, 0x75, 0x5B, 0xFE, 0xA1, 0x96, 0x3B, + 0xD4, 0xCB, 0x5A, 0x80, 0x28, 0x3B, 0xD8, 0xBB, 0x10, 0xD6, 0xB2, 0x22, + 0x0F, 0x90, 0xC5, 0x95, 0x70, 0x25, 0x69, 0xE2, 0xC1, 0x14, 0x31, 0x33, + 0x91, 0x65, 0x29, 0x3E, 0x06, 0x00, 0x17, 0x40, 0x75, 0x51, 0x21, 0x1D, + 0x94, 0x30, 0x0E, 0xF2, 0xF0, 0x9D, 0x25, 0x81, 0xB3, 0xFA, 0x01, 0x16, + 0xD7, 0xB0, 0x82, 0x08, 0x30, 0x9F, 0x7A, 0xBA, 0xC6, 0x30, 0xD8, 0x09, + 0xB4, 0x20, 0x0C, 0xBF, 0x80, 0xC3, 0xA1, 0xB0, 0x0B, 0x47, 0x40, 0x26, + 0x57, 0x30, 0x89, 0xA7, 0xE0, 0x09, 0x96, 0xA0, 0x03, 0xFE, 0x39, 0x80, + 0x43, 0x20, 0x04, 0x07, 0xE0, 0x98, 0x7E, 0xAC, 0x10, 0x06, 0x14, 0x7B, + 0x4D, 0x54, 0x06, 0xF4, 0xC7, 0x06, 0xBD, 0xE9, 0x52, 0x32, 0x25, 0x11, + 0x53, 0x53, 0x29, 0x96, 0x92, 0x24, 0x36, 0x22, 0x5C, 0x1A, 0x11, 0xB7, + 0x04, 0x00, 0xBE, 0xC0, 0xB2, 0x08, 0x69, 0x92, 0x00, 0xCB, 0x12, 0x15, + 0xFF, 0x80, 0x33, 0xD0, 0x72, 0x9E, 0x23, 0x61, 0xBA, 0x10, 0xF0, 0x28, + 0x63, 0xC9, 0x15, 0xFA, 0x00, 0xCA, 0xDA, 0x81, 0xA7, 0xA7, 0xAC, 0xA7, + 0x89, 0xB0, 0x09, 0xB6, 0x80, 0x0A, 0x5A, 0xAA, 0x04, 0x4A, 0x6B, 0x04, + 0x4A, 0xE0, 0xB4, 0xA7, 0x30, 0x89, 0x53, 0x60, 0x86, 0x3E, 0xBC, 0x98, + 0xCA, 0x4B, 0xBA, 0xBF, 0x5C, 0x41, 0xE5, 0x86, 0x97, 0xC7, 0xB5, 0x90, + 0x87, 0xE0, 0x0D, 0xD7, 0x43, 0x61, 0xD0, 0x83, 0xB0, 0xDA, 0xE1, 0x02, + 0xCD, 0xFC, 0x1E, 0xFB, 0xA1, 0x11, 0xF8, 0xB1, 0x28, 0x57, 0xD2, 0x2A, + 0x8A, 0xD0, 0x2F, 0xDA, 0xA1, 0x01, 0x5B, 0xD0, 0xC5, 0x49, 0xD1, 0x34, + 0x55, 0x21, 0x2D, 0x25, 0x41, 0x49, 0x2D, 0x50, 0x09, 0xF0, 0x61, 0x0E, + 0x29, 0x93, 0x15, 0xA3, 0x9C, 0x1F, 0xE5, 0x9A, 0xCE, 0x28, 0x0D, 0xFE, + 0xAF, 0x84, 0x8B, 0x0A, 0x59, 0xD0, 0x28, 0xA5, 0xC0, 0x98, 0x4F, 0x60, + 0x86, 0x51, 0x50, 0x03, 0xD6, 0x39, 0x04, 0xBD, 0x5C, 0xD1, 0xFD, 0xAC, + 0x10, 0x68, 0xD7, 0x0F, 0xE7, 0xB3, 0x3C, 0x9A, 0xDB, 0x65, 0xC5, 0x63, + 0xBD, 0x89, 0xC4, 0xA2, 0x10, 0xA1, 0x0E, 0x07, 0x92, 0x02, 0x92, 0xC5, + 0x09, 0xF0, 0xB1, 0x0E, 0x1A, 0x61, 0xD4, 0x20, 0x45, 0x27, 0x2A, 0x62, + 0xD1, 0xD7, 0x80, 0xD1, 0x4C, 0x31, 0x1B, 0x55, 0xA1, 0x35, 0x22, 0x41, + 0x0F, 0xD8, 0xD0, 0x05, 0x09, 0x20, 0x00, 0x64, 0x92, 0x2C, 0x20, 0xC5, + 0xCF, 0x49, 0x71, 0x0F, 0xE6, 0x0C, 0x00, 0x36, 0x90, 0xD2, 0x68, 0xFD, + 0x0B, 0xBD, 0x30, 0xC7, 0x65, 0x12, 0x0A, 0x8C, 0xE9, 0x04, 0xAB, 0x09, + 0xB9, 0x38, 0x10, 0x8F, 0x41, 0x20, 0x04, 0x2C, 0xAB, 0x1D, 0xE3, 0x9B, + 0xD3, 0x04, 0x41, 0x62, 0x58, 0x75, 0x9C, 0x7D, 0x6D, 0x87, 0x86, 0xC4, + 0x4C, 0x83, 0xCC, 0x11, 0xF7, 0x90, 0x21, 0x92, 0xE5, 0x09, 0x2A, 0xE2, + 0x46, 0xE5, 0xA0, 0x32, 0x09, 0x9B, 0x08, 0x07, 0xD2, 0xC8, 0x28, 0xCA, + 0x15, 0x58, 0x63, 0x15, 0x20, 0xC1, 0x0D, 0x51, 0x9C, 0x1F, 0xCC, 0xCC, + 0x09, 0x4C, 0xD2, 0x02, 0x36, 0x12, 0xD9, 0x49, 0x71, 0xA5, 0x26, 0x1D, + 0xBB, 0x3B, 0xCA, 0xCA, 0x68, 0x7D, 0x9A, 0xBE, 0xCA, 0x0B, 0xA6, 0x50, + 0x09, 0xA6, 0x70, 0x05, 0x44, 0xD0, 0x03, 0x47, 0xE0, 0xB4, 0xA1, 0x40, + 0xA2, 0x24, 0x7A, 0x9D, 0x2B, 0xF2, 0xB6, 0x7A, 0x7D, 0x57, 0xF7, 0x35, + 0x57, 0x6F, 0xEA, 0x62, 0xB2, 0x13, 0xA5, 0x88, 0x63, 0x7B, 0xDE, 0x60, + 0x85, 0x11, 0x01, 0x26, 0x49, 0xC2, 0x09, 0xBE, 0x55, 0x23, 0x6E, 0x18, + 0x12, 0x94, 0x94, 0x02, 0x36, 0x62, 0x0D, 0x60, 0x21, 0x1D, 0x48, 0x31, + 0x0E, 0xDE, 0xFE, 0xDC, 0x11, 0x71, 0xAB, 0x1D, 0x2D, 0xB0, 0x08, 0x87, + 0x9D, 0x24, 0x43, 0x65, 0xDB, 0x3D, 0x71, 0x0F, 0x65, 0x7C, 0xD6, 0xEA, + 0xEC, 0x09, 0xBC, 0x9A, 0xD2, 0x99, 0x1A, 0x8C, 0x45, 0x70, 0x92, 0x44, + 0x80, 0xC7, 0xA7, 0x40, 0xD3, 0x37, 0x20, 0x05, 0x53, 0x90, 0x03, 0xBB, + 0xBC, 0x00, 0x2B, 0xA2, 0xAD, 0xB7, 0x7D, 0x76, 0xC8, 0x23, 0x38, 0x9B, + 0x95, 0x5D, 0x16, 0x65, 0x08, 0x8C, 0xD3, 0x87, 0x26, 0x41, 0xDC, 0xD6, + 0x6C, 0x24, 0x8A, 0x00, 0x5C, 0x23, 0xFC, 0x11, 0x10, 0x73, 0x01, 0x53, + 0xCA, 0x14, 0x72, 0x43, 0x12, 0xAB, 0xD2, 0x7F, 0xD9, 0x2D, 0xC1, 0x0D, + 0xBD, 0x14, 0x72, 0x12, 0xDA, 0xA7, 0x2C, 0x0C, 0xAB, 0x39, 0xDE, 0x7A, + 0xAA, 0xA5, 0x99, 0xBA, 0x0B, 0x55, 0x7B, 0x92, 0x9C, 0x7A, 0xCB, 0xC5, + 0x18, 0x05, 0xA0, 0xA0, 0x09, 0xBB, 0x6C, 0x03, 0x2B, 0x02, 0xC9, 0xF5, + 0x4D, 0x10, 0xC7, 0x13, 0x3F, 0x23, 0x55, 0x63, 0x11, 0x54, 0x85, 0xF6, + 0xC7, 0x12, 0xA4, 0x32, 0x54, 0x00, 0x30, 0x24, 0x90, 0x26, 0x12, 0xEA, + 0xA0, 0x1D, 0x01, 0x8C, 0x19, 0xF5, 0x80, 0x1C, 0x0F, 0x70, 0xDC, 0x65, + 0xB2, 0xBD, 0xF4, 0xCD, 0x13, 0x94, 0x94, 0x1F, 0xE0, 0xAD, 0xA7, 0x16, + 0x9E, 0x24, 0xEF, 0x4A, 0xDE, 0xF1, 0xCA, 0xE1, 0xEE, 0x38, 0x8C, 0x4F, + 0xF0, 0xA5, 0xB8, 0x9C, 0x03, 0x3A, 0x50, 0x09, 0xA0, 0xA0, 0xC3, 0x42, + 0x80, 0xA4, 0x09, 0x30, 0xE4, 0x29, 0xCE, 0x47, 0x09, 0xE4, 0x45, 0xA8, + 0x24, 0x50, 0xE1, 0x6A, 0x12, 0x2C, 0x32, 0x2C, 0xF5, 0xC0, 0xD5, 0xDA, + 0xA1, 0x0F, 0x22, 0xA1, 0x27, 0x5C, 0xAE, 0x7F, 0x92, 0xDC, 0x27, 0x77, + 0xB2, 0xE3, 0xDD, 0xDD, 0x6B, 0xA5, 0x9C, 0xCE, 0x80, 0x5B, 0x26, 0x2B, + 0xCC, 0xE4, 0x54, 0xC0, 0xE1, 0xFE, 0xC2, 0xB8, 0x95, 0x42, 0xF0, 0x04, + 0xAF, 0xE0, 0x04, 0x40, 0x40, 0xD3, 0x8E, 0xF0, 0x09, 0xA2, 0x90, 0x03, + 0x26, 0xCA, 0xC7, 0x5D, 0x8E, 0x50, 0xC6, 0x99, 0xA0, 0xA0, 0x35, 0x13, + 0xDA, 0x51, 0x0C, 0x4B, 0x74, 0x6C, 0xFD, 0xFA, 0x11, 0x64, 0xFD, 0x19, + 0xFD, 0x07, 0x2C, 0xA1, 0xFC, 0xD9, 0x2B, 0xA8, 0xA3, 0xBB, 0x4A, 0x9F, + 0x4E, 0x5B, 0x26, 0xA8, 0x80, 0xD6, 0x1B, 0xDB, 0xA9, 0xA5, 0x70, 0x04, + 0x27, 0x89, 0x92, 0xFC, 0x2B, 0xAC, 0x8E, 0xF0, 0x95, 0xFF, 0x7B, 0xA8, + 0x2E, 0xB2, 0xE8, 0x0B, 0x41, 0xC0, 0xDF, 0xF0, 0x0D, 0x06, 0xF4, 0x5C, + 0x2C, 0x21, 0x27, 0x7D, 0x47, 0x28, 0xEB, 0xB0, 0x28, 0xB6, 0xFC, 0x00, + 0x62, 0x72, 0x29, 0xCB, 0xDB, 0x13, 0xC5, 0x72, 0x23, 0x3C, 0xB0, 0xAE, + 0x18, 0xEE, 0x9C, 0xB7, 0x6B, 0x26, 0x1D, 0x8B, 0xD2, 0x31, 0x6C, 0x26, + 0xAF, 0xE0, 0xE7, 0x94, 0xC8, 0xBF, 0x50, 0xF0, 0x09, 0xB6, 0x90, 0x04, + 0x25, 0xEA, 0x92, 0x62, 0x29, 0xEB, 0x0D, 0x01, 0x8B, 0x79, 0x49, 0x3A, + 0x33, 0x02, 0xD6, 0x3D, 0xA5, 0x23, 0x3C, 0xF1, 0x25, 0x14, 0x0E, 0xBF, + 0x9E, 0x50, 0x0B, 0xA3, 0x80, 0x08, 0xB5, 0x7B, 0x9A, 0xCF, 0x6E, 0x26, + 0xB5, 0x80, 0xD2, 0x70, 0xFC, 0xA3, 0x30, 0xC8, 0x95, 0x29, 0xA9, 0x03, + 0x9C, 0x00, 0x0A, 0x4F, 0x90, 0x03, 0xB4, 0xED, 0xCB, 0xDC, 0xCE, 0x75, + 0x38, 0xE4, 0xDF, 0x51, 0xC1, 0x0D, 0x18, 0x1C, 0x1B, 0xD6, 0xE4, 0x71, + 0x04, 0xCF, 0x8B, 0x28, 0x5E, 0x13, 0xE6, 0xB0, 0x82, 0x33, 0xE0, 0x9C, + 0xB5, 0x60, 0x29, 0xB5, 0x40, 0x0A, 0xA5, 0xDE, 0x27, 0x21, 0x7B, 0xCA, + 0x83, 0x99, 0xB4, 0x9D, 0x0A, 0xA4, 0xFA, 0xFB, 0x9A, 0x8E, 0x00, 0x0A, + 0x8A, 0xB0, 0x92, 0x41, 0xBC, 0x22, 0x62, 0x9D, 0xFE, 0xD3, 0xC7, 0x37, + 0x3D, 0x6B, 0xB0, 0x84, 0x77, 0xE9, 0xED, 0xAD, 0xE8, 0x15, 0x57, 0xB0, + 0xF0, 0x4D, 0x71, 0x0F, 0x6D, 0xDE, 0x13, 0xD5, 0x6D, 0x7A, 0xFD, 0xD0, + 0x97, 0x17, 0xA0, 0xAC, 0x39, 0x81, 0xBE, 0x74, 0x77, 0x03, 0xF4, 0x49, + 0xB8, 0xCD, 0x1C, 0xF4, 0x52, 0x8B, 0xF1, 0x88, 0xBB, 0xF1, 0x31, 0xF8, + 0x0A, 0xAA, 0x5E, 0xBC, 0xA1, 0xF0, 0x09, 0x8E, 0x40, 0x89, 0x42, 0x60, + 0xA8, 0x37, 0xDE, 0xE5, 0xAB, 0x28, 0x46, 0x55, 0xF8, 0x7D, 0xB0, 0x18, + 0x76, 0x0B, 0xFE, 0x14, 0x4E, 0x90, 0x00, 0x58, 0x71, 0x36, 0x7D, 0xAC, + 0x14, 0xA9, 0xF0, 0x32, 0x08, 0x51, 0xE9, 0x34, 0x61, 0xEE, 0xDA, 0x11, + 0x01, 0xA2, 0xED, 0x9C, 0xBF, 0xF0, 0xB1, 0x42, 0x6F, 0x29, 0x4B, 0x7E, + 0xA1, 0x83, 0xC9, 0xE1, 0xA3, 0x90, 0xCA, 0xA7, 0x0E, 0x04, 0xC3, 0x5B, + 0xBC, 0x50, 0x90, 0x09, 0x9A, 0xA0, 0x03, 0x5F, 0x49, 0x04, 0x37, 0x8D, + 0xD7, 0x52, 0xEF, 0xED, 0x30, 0x86, 0x53, 0xF1, 0x30, 0x84, 0x5B, 0xC7, + 0x36, 0x51, 0x51, 0x0C, 0x0E, 0x90, 0xCD, 0x4E, 0x71, 0x36, 0x00, 0x50, + 0xE0, 0x4C, 0x61, 0x0E, 0x54, 0x5D, 0x13, 0xEC, 0xE0, 0x88, 0x13, 0x70, + 0xCA, 0xEC, 0xDB, 0xF6, 0x7D, 0xA2, 0x05, 0xC9, 0x7E, 0xB8, 0xF2, 0xFA, + 0xE4, 0x93, 0x38, 0xED, 0x39, 0x30, 0x05, 0x9F, 0x40, 0xA8, 0x5F, 0x19, + 0xB6, 0xD9, 0xB9, 0xE8, 0xC8, 0x9C, 0x55, 0x64, 0x05, 0x0E, 0xAB, 0x53, + 0x08, 0x44, 0xDD, 0x0F, 0x2F, 0x01, 0xC2, 0x4B, 0x51, 0x0C, 0x72, 0xD0, + 0x89, 0x4E, 0xB1, 0x0F, 0x15, 0xC3, 0xDD, 0x9E, 0x11, 0x0D, 0x2B, 0x78, + 0xE4, 0x7A, 0xAA, 0xF1, 0x9A, 0x5F, 0x26, 0xA4, 0x00, 0x0C, 0xF4, 0xD9, + 0xE4, 0x46, 0x50, 0xB5, 0x1D, 0xAF, 0x98, 0x03, 0x78, 0x03, 0x5F, 0xFE, + 0x99, 0xE5, 0x2B, 0xB2, 0xEB, 0xB7, 0x3D, 0xB0, 0x87, 0x15, 0xFB, 0x05, + 0x31, 0x0F, 0x7C, 0x21, 0x36, 0xFF, 0xC8, 0x13, 0x5C, 0xD0, 0x08, 0x0E, + 0x30, 0xF9, 0x2D, 0xC1, 0x6B, 0x5B, 0xA0, 0x0C, 0x0E, 0xA2, 0xFB, 0x74, + 0x4B, 0x00, 0x3A, 0x2F, 0x1A, 0x44, 0x6B, 0x00, 0xA5, 0x89, 0xD2, 0x99, + 0x3F, 0xFC, 0x65, 0xB2, 0x09, 0xEE, 0x2C, 0xB2, 0xBB, 0xD0, 0x8E, 0x4F, + 0x6E, 0xEF, 0xC6, 0x3B, 0x80, 0xC8, 0x7A, 0xE2, 0x8B, 0xEE, 0xBC, 0x38, + 0x44, 0x84, 0x00, 0x91, 0xAF, 0xDF, 0x40, 0x82, 0x05, 0x07, 0x8E, 0x9B, + 0x94, 0x50, 0x61, 0x2E, 0x83, 0x0D, 0x1D, 0x3E, 0x84, 0x18, 0x51, 0xA2, + 0x41, 0x72, 0x2E, 0xE0, 0x70, 0x9B, 0x98, 0x51, 0xE3, 0xC6, 0x7E, 0xF4, + 0x00, 0x7C, 0x04, 0x09, 0xE0, 0x01, 0xA7, 0x14, 0x00, 0x38, 0x9E, 0x44, + 0x99, 0x52, 0xE5, 0xCA, 0x87, 0xFA, 0x92, 0x80, 0x5C, 0xE0, 0xC3, 0xD7, + 0x4C, 0x9A, 0x35, 0x69, 0xFE, 0xB2, 0xE5, 0x49, 0xE7, 0x4E, 0x9E, 0x3D, + 0x77, 0x6E, 0xDA, 0xF2, 0xCB, 0x17, 0x2F, 0x5E, 0xBB, 0x8C, 0x14, 0x29, + 0x42, 0x84, 0x88, 0x90, 0x20, 0x41, 0x80, 0x00, 0xC9, 0x11, 0x35, 0x2A, + 0x90, 0x21, 0x44, 0x0E, 0x84, 0xA4, 0xC7, 0x52, 0xEB, 0x56, 0xAE, 0x5D, + 0xBD, 0x7E, 0x05, 0x1B, 0x56, 0xAC, 0xC4, 0x32, 0x64, 0xCC, 0x92, 0x29, + 0xF4, 0xAD, 0xDB, 0x9F, 0xB3, 0x6D, 0xDD, 0x96, 0x31, 0x14, 0x4F, 0xA2, + 0x38, 0x4A, 0x0A, 0x33, 0x8D, 0x0D, 0xBB, 0xCE, 0x85, 0x23, 0x0E, 0x78, + 0xB5, 0x5A, 0x11, 0xE9, 0x22, 0x05, 0x81, 0x91, 0x9E, 0x54, 0x00, 0x20, + 0xE7, 0x57, 0xF1, 0xE2, 0x89, 0xEA, 0x2E, 0x80, 0x8C, 0xD0, 0xCB, 0xE6, + 0xE4, 0x9A, 0x88, 0x7C, 0x5E, 0xBE, 0x6C, 0xAB, 0x4A, 0x51, 0xA3, 0x48, + 0x97, 0x32, 0xFE, 0x7D, 0x2A, 0x55, 0x6A, 0x10, 0x21, 0x12, 0x42, 0x76, + 0x61, 0x9C, 0x5A, 0xF5, 0x6A, 0xD6, 0xAD, 0x57, 0xB7, 0x3D, 0x54, 0x10, + 0x5E, 0x21, 0xB7, 0xB5, 0xD1, 0x4E, 0xC4, 0xA5, 0x90, 0x92, 0xEB, 0x94, + 0xFE, 0x48, 0x40, 0x22, 0x91, 0x95, 0x77, 0x44, 0x8F, 0x04, 0x38, 0xF5, + 0x6C, 0x01, 0x20, 0x41, 0xB1, 0x7B, 0xC3, 0x9D, 0x6B, 0xBD, 0x96, 0x00, + 0xE4, 0x04, 0xCA, 0xD5, 0x67, 0xFE, 0xDA, 0x84, 0x59, 0x3B, 0x4F, 0x53, + 0x54, 0x8E, 0x26, 0xFD, 0xEC, 0x14, 0xAA, 0xE8, 0x1C, 0x42, 0x86, 0x84, + 0x4C, 0xA0, 0xEF, 0xF9, 0x7A, 0xF6, 0xED, 0xDD, 0x8F, 0x3D, 0x5B, 0x46, + 0xA0, 0xC1, 0x78, 0x87, 0xCA, 0xDA, 0x26, 0x23, 0x57, 0x22, 0x2E, 0x4C, + 0xE2, 0xC2, 0x69, 0x9A, 0xE7, 0xBD, 0x88, 0x92, 0xC8, 0x04, 0x8E, 0x62, + 0x04, 0x24, 0xA8, 0x0B, 0x00, 0x5A, 0xE8, 0xA9, 0x92, 0xC3, 0x94, 0x63, + 0x0E, 0x41, 0x09, 0x07, 0x7A, 0x26, 0x24, 0x1B, 0xAC, 0xB3, 0x0E, 0x98, + 0xED, 0x36, 0xDC, 0x04, 0x15, 0x25, 0x3C, 0x0B, 0xCF, 0x29, 0xF2, 0xA8, + 0x22, 0xC2, 0x34, 0x90, 0x0E, 0x9C, 0x30, 0x45, 0x15, 0x57, 0x9C, 0x48, + 0x9F, 0xE6, 0xC6, 0x62, 0xC3, 0xAC, 0x3F, 0x20, 0xCA, 0xA7, 0x9B, 0x35, + 0x6A, 0x03, 0x24, 0xA3, 0x70, 0x0A, 0xF2, 0x87, 0xC5, 0x81, 0xAE, 0x88, + 0x24, 0x92, 0xBE, 0xBC, 0xA2, 0x67, 0x8B, 0xAE, 0xF6, 0x21, 0xC0, 0x38, + 0x9F, 0x1C, 0xFC, 0x68, 0x39, 0x1F, 0xD7, 0xBB, 0x22, 0xA4, 0x1B, 0x84, + 0xC2, 0x90, 0x32, 0x54, 0x36, 0xD4, 0xEE, 0x14, 0xA3, 0xBE, 0x53, 0x8A, + 0x29, 0xF1, 0x46, 0x14, 0x22, 0x07, 0xF4, 0xD4, 0x7B, 0xB2, 0x4C, 0x33, + 0x05, 0x94, 0x06, 0x45, 0xB1, 0xBA, 0x31, 0x8B, 0x8D, 0x89, 0xBC, 0x61, + 0xEB, 0x2C, 0x70, 0xDE, 0x5B, 0xFE, 0xE7, 0xAB, 0x64, 0x14, 0xD1, 0x64, + 0x85, 0x3A, 0xBB, 0x4A, 0x05, 0x80, 0x3D, 0xB5, 0xF2, 0x08, 0x82, 0xCB, + 0x16, 0x29, 0x09, 0x80, 0x25, 0x12, 0x3B, 0x93, 0x35, 0x7D, 0x96, 0x00, + 0xC9, 0x80, 0x1E, 0xAA, 0xAC, 0x0E, 0x3B, 0x2C, 0x7D, 0xAA, 0x85, 0x8A, + 0x5D, 0xB6, 0x54, 0x6A, 0xA9, 0xA6, 0xC6, 0x23, 0xAF, 0xAA, 0x08, 0x42, + 0x52, 0x26, 0x51, 0x51, 0x47, 0x75, 0x4D, 0x03, 0x00, 0xD4, 0x19, 0x0B, + 0x9C, 0xFB, 0xE0, 0xC9, 0x08, 0x1C, 0xDA, 0xDC, 0x74, 0x8F, 0x9B, 0x04, + 0x5E, 0xE4, 0x6A, 0x1D, 0x15, 0x32, 0x61, 0xE4, 0x0A, 0xAF, 0x1E, 0x4B, + 0x82, 0xAB, 0x28, 0x15, 0xE9, 0xC9, 0x92, 0x42, 0x93, 0x40, 0x94, 0x54, + 0xC6, 0xE8, 0x31, 0xF5, 0x23, 0x03, 0x64, 0x82, 0x94, 0x32, 0xCB, 0x26, + 0xDD, 0x89, 0x96, 0x2A, 0x7A, 0xE9, 0xE5, 0xD2, 0xA3, 0x32, 0x25, 0x62, + 0x53, 0x4E, 0xA7, 0x0A, 0x33, 0xA4, 0x0B, 0x8C, 0x05, 0x37, 0x5C, 0xB1, + 0xD4, 0xF9, 0x68, 0x09, 0xB0, 0xF2, 0x29, 0xE4, 0x3E, 0xB3, 0xCA, 0x98, + 0x33, 0xA3, 0x78, 0xDA, 0x65, 0x8F, 0x9B, 0x8F, 0x8A, 0xE5, 0xEA, 0x81, + 0x4C, 0x2E, 0x19, 0x72, 0x2B, 0x6B, 0x40, 0x92, 0x46, 0xAB, 0x72, 0x00, + 0x10, 0xD4, 0x93, 0x4A, 0x2A, 0xD1, 0x29, 0xB9, 0x43, 0xC5, 0x5D, 0x4C, + 0x1D, 0xE9, 0x3E, 0x8A, 0x80, 0xD9, 0x66, 0x27, 0xCB, 0x0E, 0x5A, 0x5B, + 0xB8, 0xF0, 0x85, 0xDA, 0xA2, 0x8C, 0xB8, 0x36, 0x5B, 0x6D, 0x47, 0x0C, + 0x82, 0x88, 0x4F, 0xF9, 0x45, 0x38, 0x64, 0x91, 0x53, 0xDA, 0x02, 0x00, + 0x02, 0x00, 0xC0, 0xA8, 0xAB, 0x7C, 0x62, 0xB4, 0xAD, 0x10, 0x56, 0x25, + 0xA4, 0xE7, 0x1A, 0x7B, 0x0C, 0x92, 0x06, 0xA4, 0x72, 0xBE, 0x72, 0xA2, + 0x12, 0x4C, 0x58, 0x48, 0x59, 0xAB, 0x28, 0x93, 0xFE, 0x9B, 0x95, 0x25, + 0x46, 0x21, 0x28, 0x94, 0x00, 0x4B, 0x3C, 0x59, 0xE1, 0xD4, 0x91, 0xC7, + 0x8A, 0x0E, 0x32, 0xC9, 0x1E, 0x9E, 0x2C, 0x11, 0x68, 0x75, 0x12, 0xA6, + 0xE2, 0x5E, 0x38, 0xCB, 0x58, 0xD3, 0xD0, 0xC0, 0xC4, 0xC1, 0xDB, 0xA5, + 0xBF, 0x06, 0xFB, 0xA1, 0x04, 0x08, 0x58, 0x44, 0x80, 0xA0, 0xB9, 0x02, + 0x04, 0xBF, 0xB3, 0xFE, 0xF8, 0x46, 0xC2, 0xC7, 0x2E, 0x70, 0x22, 0x99, + 0x72, 0xA2, 0x31, 0xF9, 0xB0, 0x50, 0xBD, 0x72, 0x46, 0x91, 0x4C, 0x1C, + 0x71, 0x62, 0xAB, 0x7B, 0x00, 0xF6, 0xC4, 0x05, 0x43, 0x9F, 0x31, 0x87, + 0x1C, 0xC3, 0x85, 0xCB, 0xE8, 0x5F, 0x90, 0x2E, 0x30, 0xD5, 0xE8, 0x92, + 0xC2, 0xFE, 0x4A, 0x5E, 0xA7, 0xA1, 0xA6, 0x2C, 0xA7, 0xA9, 0xAB, 0xBE, + 0xFA, 0xD2, 0x5D, 0x40, 0x14, 0x02, 0xB4, 0x6D, 0x73, 0x00, 0xA2, 0x63, + 0x04, 0x42, 0x32, 0x07, 0x72, 0xD3, 0xBF, 0xAE, 0x50, 0x85, 0xC0, 0x01, + 0xD0, 0x20, 0x89, 0x2D, 0x8A, 0x81, 0x5D, 0x4D, 0x8E, 0xC0, 0x51, 0xDB, + 0xAD, 0x35, 0xBC, 0x99, 0xAF, 0xBD, 0x9A, 0x43, 0x32, 0xD9, 0x92, 0x45, + 0x0C, 0x48, 0xE5, 0x2B, 0x7B, 0x56, 0xE8, 0xE4, 0x12, 0x07, 0x10, 0x3F, + 0xE9, 0x1D, 0x6E, 0xAE, 0x78, 0x8C, 0x41, 0x4E, 0x20, 0xE0, 0x9D, 0xF5, + 0x8D, 0x52, 0x21, 0x26, 0x9A, 0x9B, 0x7F, 0x34, 0x19, 0x00, 0x0B, 0x4E, + 0xDF, 0x4A, 0x99, 0x90, 0x22, 0xA0, 0x9C, 0x32, 0xA9, 0xA7, 0xF6, 0xA4, + 0x62, 0xA2, 0x2E, 0x05, 0x51, 0xE3, 0xAD, 0x45, 0x03, 0x82, 0x08, 0x1A, + 0x42, 0x32, 0x97, 0x7B, 0xF9, 0x49, 0x2D, 0x27, 0x95, 0x25, 0x16, 0x3E, + 0x9A, 0x93, 0x93, 0x79, 0xEF, 0x17, 0x25, 0xDA, 0x6A, 0x7F, 0xCB, 0x21, + 0xF4, 0xB3, 0x9E, 0x7D, 0x24, 0x40, 0x00, 0x8B, 0x50, 0x84, 0x0A, 0xFE, + 0x52, 0x70, 0xB4, 0x45, 0x04, 0xC0, 0x48, 0x5F, 0xE1, 0x80, 0x27, 0x34, + 0x01, 0x87, 0x67, 0x9C, 0xC4, 0x1C, 0x4E, 0x58, 0x18, 0x00, 0x04, 0x90, + 0x02, 0x82, 0x09, 0x0C, 0x81, 0x8A, 0x78, 0x00, 0xEB, 0x68, 0xD5, 0x9B, + 0x28, 0x19, 0x6A, 0x7E, 0x2A, 0xC9, 0x42, 0x48, 0x24, 0xA0, 0x8B, 0xF0, + 0x4D, 0x86, 0x16, 0x3D, 0xA9, 0x05, 0x29, 0x10, 0xA1, 0x85, 0x88, 0xF1, + 0xC4, 0x16, 0xE6, 0xB3, 0x96, 0x67, 0x84, 0xA0, 0xBE, 0xCF, 0xE5, 0xA0, + 0x63, 0x57, 0x01, 0x09, 0xBD, 0x4E, 0x38, 0x44, 0x15, 0xD1, 0xCD, 0x00, + 0x1F, 0x21, 0x1A, 0xB0, 0x7A, 0xB2, 0x88, 0x93, 0xC9, 0x8E, 0x23, 0xEA, + 0x32, 0xCB, 0x8D, 0x00, 0x88, 0x96, 0x01, 0x3A, 0x07, 0x11, 0x02, 0x60, + 0x50, 0x4F, 0x3E, 0x72, 0x85, 0x11, 0x6A, 0xA5, 0x0B, 0x8B, 0xE8, 0x84, + 0x26, 0xBE, 0xC5, 0x91, 0x7B, 0x94, 0x30, 0x05, 0x8B, 0xC0, 0x8C, 0x22, + 0x94, 0x83, 0xAA, 0xAD, 0x44, 0xE9, 0x81, 0x44, 0xD4, 0x48, 0x09, 0x3F, + 0x42, 0x9D, 0x16, 0xDA, 0xA4, 0x0A, 0x9E, 0xA8, 0xC5, 0x28, 0x12, 0x51, + 0xB5, 0x9A, 0x8C, 0x8F, 0x27, 0xB5, 0xB8, 0x1A, 0x67, 0xD2, 0xD7, 0x94, + 0x20, 0x44, 0x21, 0x0A, 0x48, 0x10, 0x4D, 0xC7, 0x6C, 0x00, 0x3F, 0x38, + 0x36, 0x52, 0x45, 0x25, 0x5B, 0x90, 0x76, 0x42, 0xA8, 0x2B, 0x95, 0xB4, + 0x85, 0x0D, 0xF3, 0x81, 0xD3, 0x14, 0xFF, 0xF0, 0xB2, 0xE1, 0xDC, 0x63, + 0x6C, 0xC7, 0xE1, 0x89, 0x22, 0x4E, 0x96, 0x00, 0x54, 0x90, 0xC9, 0x5F, + 0x2E, 0xF0, 0xC4, 0xCE, 0xD8, 0xC8, 0x91, 0x3E, 0x01, 0x40, 0x89, 0xC1, + 0xFA, 0xC8, 0x2A, 0xDB, 0xE8, 0x44, 0x47, 0x36, 0x64, 0x1F, 0x4E, 0x08, + 0x09, 0x1D, 0x67, 0x22, 0x0C, 0x2A, 0xD1, 0x04, 0x18, 0xA8, 0xA8, 0x05, + 0x22, 0xEA, 0xFE, 0x48, 0x13, 0x3F, 0xEA, 0x64, 0x14, 0x44, 0xB9, 0x18, + 0x78, 0x34, 0xA5, 0x03, 0x51, 0x5C, 0xC2, 0x99, 0xA2, 0x18, 0x0D, 0x11, + 0x06, 0x10, 0x00, 0x90, 0xC8, 0xB2, 0x96, 0xD7, 0x64, 0x8F, 0x34, 0xA4, + 0xA3, 0x3A, 0x9F, 0x1C, 0x46, 0x03, 0x2C, 0x69, 0x4B, 0x15, 0xFB, 0x31, + 0x1B, 0x00, 0xC2, 0x6B, 0x38, 0xBF, 0xF2, 0x09, 0x27, 0x5A, 0x40, 0x00, + 0x03, 0x5C, 0x20, 0x1A, 0x13, 0xF1, 0x07, 0x2E, 0x24, 0xF2, 0x00, 0x4F, + 0x6C, 0x22, 0x57, 0x29, 0xB1, 0xC6, 0x36, 0x41, 0xB9, 0x93, 0x93, 0xF5, + 0xAC, 0x2B, 0x5D, 0xC4, 0xE6, 0x40, 0xEE, 0x91, 0xAC, 0x39, 0xF6, 0xD1, + 0x13, 0xA8, 0xA8, 0xC9, 0x28, 0x78, 0x82, 0xD0, 0x61, 0xFA, 0x82, 0x14, + 0x0B, 0x3D, 0xDF, 0xE6, 0x92, 0xB2, 0x43, 0xD2, 0xEC, 0xC1, 0x99, 0x90, + 0xC0, 0xE8, 0x1E, 0x7C, 0x28, 0x84, 0x1A, 0x84, 0x84, 0x92, 0x01, 0x05, + 0xE9, 0x73, 0xD8, 0xF1, 0x18, 0x7A, 0xF2, 0xC4, 0x12, 0xDA, 0x03, 0x28, + 0x47, 0xA4, 0x98, 0x23, 0x87, 0xC4, 0xC3, 0x10, 0x50, 0x3C, 0x0B, 0xAC, + 0x9C, 0x53, 0x9C, 0x7D, 0xEE, 0xC4, 0x41, 0x0B, 0xB3, 0x82, 0x29, 0x1F, + 0x82, 0x90, 0x1D, 0x41, 0xE4, 0x0A, 0x96, 0x28, 0x1E, 0x07, 0x74, 0xBA, + 0x11, 0x75, 0x98, 0x0A, 0x8D, 0x3C, 0x09, 0x61, 0x4A, 0x43, 0xFA, 0x4F, + 0x82, 0x06, 0x40, 0x97, 0xBE, 0x90, 0xDA, 0x26, 0xF8, 0xF8, 0x8B, 0x17, + 0x6E, 0x62, 0x8F, 0x78, 0xA4, 0x0C, 0x1F, 0x9B, 0xF5, 0x50, 0x9D, 0x24, + 0x02, 0x6B, 0x9C, 0x23, 0xCD, 0x25, 0x30, 0x2A, 0x56, 0x48, 0xBC, 0xA2, + 0x3C, 0x45, 0x00, 0xE2, 0x47, 0x90, 0xB7, 0x54, 0xB6, 0xAE, 0xE6, 0x1E, + 0x8F, 0xF1, 0x09, 0x04, 0x12, 0xB0, 0x12, 0xB9, 0x1C, 0xC2, 0x2C, 0xB1, + 0xA1, 0x91, 0x8D, 0xDC, 0xE2, 0xFE, 0x8D, 0xF5, 0xBC, 0xE4, 0x95, 0x3A, + 0xA9, 0x44, 0xA1, 0x12, 0x40, 0x8C, 0xB5, 0x36, 0x64, 0x1E, 0x74, 0x99, + 0x04, 0x25, 0x70, 0x81, 0x0B, 0x71, 0x38, 0xE4, 0x1A, 0xA8, 0xCC, 0x84, + 0x0B, 0xFC, 0xC9, 0x91, 0x92, 0x1D, 0x15, 0x94, 0x82, 0xBB, 0x46, 0x5B, + 0xC1, 0x32, 0xD0, 0x90, 0xCC, 0xC0, 0xA0, 0x9E, 0xA8, 0xC2, 0x75, 0x5E, + 0x48, 0x0B, 0xA1, 0xFC, 0x02, 0xAB, 0x36, 0x91, 0x9A, 0x30, 0x9B, 0x45, + 0x55, 0x9D, 0x6C, 0x06, 0x7D, 0xCA, 0xDC, 0xD4, 0x25, 0x70, 0x81, 0x51, + 0x48, 0x3C, 0x02, 0x12, 0xA4, 0x79, 0x1F, 0x48, 0x3E, 0xAA, 0x59, 0xDE, + 0x32, 0x86, 0x51, 0x80, 0x45, 0xE3, 0x26, 0x54, 0x60, 0x80, 0xEB, 0xA1, + 0xE4, 0x0F, 0x6B, 0x78, 0xE9, 0x6D, 0xDE, 0x14, 0xA7, 0x35, 0xAC, 0x87, + 0x1C, 0x22, 0xE1, 0xC4, 0x22, 0xA4, 0xAB, 0x13, 0x35, 0xBA, 0x53, 0xA9, + 0x05, 0x11, 0x87, 0x42, 0x74, 0xF3, 0x8F, 0x87, 0x08, 0xAA, 0x13, 0x91, + 0x88, 0x1F, 0x4A, 0x7E, 0xCB, 0x89, 0xA4, 0xA9, 0x40, 0xBA, 0x00, 0xD8, + 0x6D, 0x6F, 0x57, 0xC2, 0xD9, 0xE9, 0xD4, 0x44, 0x18, 0xD9, 0x49, 0x04, + 0x4D, 0x4C, 0xE1, 0x09, 0xD2, 0xCE, 0x44, 0x0B, 0x9E, 0x18, 0x05, 0x6A, + 0xA9, 0x36, 0x99, 0x5F, 0xA0, 0x02, 0x18, 0xFC, 0xCD, 0xC9, 0x2F, 0x5E, + 0x0B, 0x1E, 0x2F, 0x01, 0x21, 0x12, 0xB4, 0xB5, 0xED, 0x2B, 0x84, 0x50, + 0x84, 0xD1, 0x81, 0xA4, 0xB0, 0xEA, 0x85, 0xF0, 0x57, 0x12, 0x20, 0x28, + 0x51, 0x02, 0xAC, 0x05, 0x6A, 0x0C, 0x1E, 0x4A, 0x68, 0xE7, 0x16, 0x73, + 0x46, 0xC4, 0x55, 0x78, 0x75, 0xCE, 0x63, 0x78, 0x07, 0xAC, 0xE4, 0x94, + 0x4E, 0x23, 0xF3, 0xA8, 0x8B, 0x42, 0x02, 0xF4, 0x90, 0x2D, 0xA0, 0x11, + 0x13, 0x0F, 0x78, 0xF0, 0x44, 0x18, 0xA5, 0x08, 0xFE, 0x01, 0x84, 0x04, + 0x7A, 0x63, 0x8C, 0x70, 0x4A, 0xF4, 0x41, 0x50, 0x00, 0x48, 0xA0, 0x97, + 0xEF, 0xF5, 0x44, 0x7C, 0x67, 0x72, 0xA5, 0xFA, 0xCE, 0x64, 0xBE, 0x42, + 0xDE, 0xE5, 0x7E, 0x6D, 0xC2, 0x5A, 0x24, 0xBB, 0x77, 0x13, 0xBA, 0xE0, + 0x05, 0xC6, 0x08, 0xBC, 0xA9, 0x1C, 0xEC, 0x61, 0xB6, 0x18, 0x7D, 0x84, + 0x1F, 0xDC, 0xE7, 0xD1, 0x1C, 0x77, 0x19, 0x2C, 0x00, 0x2B, 0x49, 0x02, + 0x70, 0x09, 0x92, 0xF0, 0x72, 0xE4, 0x7F, 0x6E, 0x29, 0x84, 0x38, 0x53, + 0x54, 0x8C, 0x8F, 0x68, 0x60, 0x09, 0x5B, 0x80, 0xA4, 0xB0, 0x00, 0x70, + 0x5D, 0x87, 0x84, 0x43, 0xBB, 0x2B, 0x76, 0x88, 0x3A, 0x54, 0x97, 0x09, + 0x45, 0xBC, 0x91, 0x23, 0x8C, 0xFA, 0x48, 0x22, 0xFA, 0x61, 0x8D, 0x31, + 0x03, 0x20, 0xC6, 0x5E, 0x7E, 0x08, 0x3F, 0x78, 0x1C, 0x01, 0x16, 0xEE, + 0x32, 0x3B, 0xAA, 0xF5, 0x85, 0x30, 0xEA, 0xD9, 0x4B, 0x0D, 0xDD, 0x90, + 0x26, 0x40, 0x6E, 0xB2, 0x68, 0x3D, 0x41, 0x0A, 0xCA, 0x50, 0x4B, 0x09, + 0x45, 0x41, 0xCA, 0x44, 0x0B, 0x0C, 0x15, 0x3D, 0xD0, 0x76, 0x0F, 0x0B, + 0x4E, 0xEB, 0xD9, 0x10, 0xBD, 0xEA, 0x95, 0x80, 0x64, 0x03, 0x59, 0xA1, + 0x07, 0x31, 0x44, 0x4C, 0xE7, 0x96, 0xD6, 0xCE, 0x65, 0xAA, 0xC9, 0x05, + 0x77, 0x51, 0xC2, 0x8E, 0xA1, 0xCA, 0x2B, 0x49, 0x38, 0xD6, 0x88, 0x9D, + 0x71, 0x91, 0x0B, 0x4A, 0xF4, 0xF4, 0x21, 0x1C, 0x20, 0x18, 0x26, 0x20, + 0x90, 0x92, 0x36, 0xB3, 0xA3, 0x20, 0xF4, 0x28, 0x46, 0x02, 0xFA, 0x27, + 0x21, 0x7F, 0xE0, 0xD9, 0x4C, 0xEC, 0x65, 0x58, 0x4D, 0x24, 0xC5, 0x69, + 0x9A, 0xE4, 0xA4, 0xC9, 0xB5, 0x08, 0xF2, 0x4D, 0x72, 0x02, 0xE9, 0x9A, + 0x3C, 0xB4, 0xC8, 0x37, 0xB1, 0x58, 0x32, 0x09, 0xEC, 0xB9, 0xA9, 0xFE, + 0xE4, 0x20, 0x0A, 0xA0, 0xDB, 0xF2, 0x89, 0x58, 0x3D, 0xEF, 0x94, 0x78, + 0x24, 0x01, 0x77, 0x2B, 0xC8, 0x35, 0x0E, 0xC6, 0x11, 0xBB, 0x02, 0x90, + 0x6D, 0x8C, 0x99, 0x84, 0x3C, 0xBB, 0xC2, 0x66, 0x00, 0xF4, 0x8D, 0x23, + 0xE3, 0x90, 0xC7, 0x40, 0xAA, 0x1D, 0x91, 0x62, 0x00, 0xAB, 0x13, 0x2C, + 0x98, 0xF6, 0x46, 0x9C, 0xF4, 0x90, 0x99, 0x4D, 0xE8, 0x3F, 0x89, 0xC2, + 0x76, 0x00, 0x18, 0x7D, 0x93, 0x17, 0x72, 0x7B, 0x26, 0x52, 0x33, 0x45, + 0x4D, 0x86, 0x41, 0x5F, 0x8E, 0x6F, 0x9A, 0x32, 0xE6, 0xEE, 0x65, 0x4D, + 0xAA, 0x50, 0x85, 0x1C, 0x82, 0xF5, 0x29, 0x3D, 0x5C, 0x70, 0x83, 0x95, + 0x43, 0x6B, 0x7A, 0xD7, 0xBC, 0x20, 0xE5, 0x58, 0xC2, 0xA1, 0x53, 0x42, + 0x4E, 0x00, 0xDE, 0x2E, 0x77, 0x60, 0x99, 0x47, 0x2E, 0x12, 0x92, 0x8B, + 0x70, 0x18, 0x9B, 0x25, 0x51, 0xCA, 0xB0, 0x58, 0xEC, 0x91, 0x02, 0x4F, + 0x7C, 0xC2, 0x11, 0x65, 0xD6, 0xC8, 0x3B, 0x46, 0xA5, 0x89, 0x49, 0xE4, + 0x42, 0x1C, 0xD6, 0x56, 0x11, 0xB6, 0x7B, 0xDC, 0x68, 0x5F, 0xB0, 0x36, + 0xE4, 0x35, 0xC9, 0xC9, 0x7F, 0xAF, 0x93, 0x1D, 0xAD, 0x82, 0xFB, 0xEB, + 0x36, 0xB1, 0xCC, 0x26, 0xC4, 0x5E, 0x13, 0x54, 0x58, 0x8E, 0x16, 0x9D, + 0x99, 0xF2, 0x97, 0xC8, 0xD3, 0x31, 0x31, 0xC9, 0xDB, 0xE6, 0x77, 0xE7, + 0x4D, 0x7D, 0x60, 0x5A, 0x9B, 0x32, 0x08, 0x10, 0x2C, 0x29, 0xD6, 0xEE, + 0x38, 0xBA, 0xE2, 0x84, 0xCC, 0xE2, 0x25, 0x67, 0x4D, 0x0F, 0x8E, 0xE9, + 0xC6, 0x81, 0x0B, 0xC0, 0x27, 0x16, 0xEB, 0x12, 0xD2, 0x3A, 0x02, 0xB8, + 0xEE, 0x0B, 0x70, 0x9F, 0x1B, 0xAA, 0x9E, 0x38, 0x3B, 0x6B, 0x19, 0xEA, + 0x50, 0xFA, 0xA6, 0xFC, 0xE3, 0xF5, 0xD4, 0xEA, 0x75, 0xE6, 0xEB, 0x89, + 0x52, 0xBC, 0xFE, 0xF0, 0x0A, 0x9B, 0xEB, 0x52, 0x81, 0xC9, 0x03, 0xBA, + 0x1D, 0x56, 0x00, 0x24, 0xAA, 0xC6, 0x7B, 0xEC, 0x57, 0x93, 0x0F, 0x6F, + 0x48, 0xD1, 0xD6, 0x6A, 0x5E, 0xC9, 0x3F, 0x32, 0xA1, 0x5D, 0x86, 0x1C, + 0x89, 0xE6, 0x2C, 0x91, 0x06, 0x2A, 0x3B, 0xD1, 0x67, 0xD3, 0xCD, 0x63, + 0xF7, 0x81, 0x67, 0xD1, 0x3E, 0x78, 0xBC, 0xAC, 0x84, 0x76, 0xDE, 0x26, + 0x57, 0xD2, 0x82, 0xA6, 0x3D, 0x6E, 0x19, 0x5B, 0x78, 0xFE, 0x17, 0x92, + 0xF6, 0x44, 0xE8, 0xBB, 0x3E, 0x5A, 0x61, 0xF0, 0xE2, 0x4A, 0x56, 0xE0, + 0x1C, 0xBB, 0x47, 0x44, 0x84, 0xBA, 0x7F, 0x84, 0x96, 0xB2, 0x47, 0x3F, + 0x63, 0xBE, 0x11, 0xA7, 0xDA, 0xB5, 0xAD, 0x2B, 0xFE, 0xD0, 0xAE, 0xD1, + 0x59, 0x14, 0x30, 0x65, 0x9F, 0xCE, 0x1F, 0x80, 0xBF, 0xCB, 0x8A, 0xB4, + 0x1E, 0x00, 0x87, 0x19, 0xD9, 0xF2, 0x33, 0x01, 0xB7, 0x5D, 0x1A, 0x2D, + 0x2A, 0x89, 0x2A, 0xED, 0x8B, 0x34, 0xF8, 0x5A, 0xB2, 0x8E, 0x0B, 0x86, + 0xAB, 0x29, 0x05, 0x4F, 0x00, 0x3F, 0x51, 0x93, 0x3B, 0xA9, 0xC0, 0x01, + 0x20, 0xD8, 0xA1, 0x8F, 0x51, 0x8E, 0x7D, 0x48, 0xBF, 0x0C, 0x64, 0x0D, + 0x9E, 0xB3, 0x8D, 0xE6, 0xF2, 0x0A, 0x79, 0x48, 0x2C, 0x62, 0x13, 0xB8, + 0x27, 0xD9, 0x02, 0x87, 0x73, 0x81, 0x88, 0x03, 0x9B, 0xDC, 0x50, 0x88, + 0x1E, 0x51, 0x11, 0x1E, 0xE3, 0xBF, 0xEA, 0x10, 0x06, 0x72, 0xF3, 0x85, + 0x23, 0x43, 0x84, 0xEC, 0x20, 0x85, 0xD2, 0xC2, 0x3E, 0x03, 0x94, 0x14, + 0x19, 0x9C, 0x41, 0xCC, 0x33, 0x1F, 0x5E, 0xD8, 0x84, 0x4D, 0x08, 0x3F, + 0x2A, 0x63, 0x9F, 0xF6, 0x11, 0x82, 0x90, 0x38, 0x3F, 0x0D, 0x54, 0xC2, + 0x89, 0xE8, 0x06, 0x43, 0x70, 0x3F, 0x8E, 0x70, 0xA9, 0xBD, 0xEB, 0x86, + 0xAF, 0x10, 0x87, 0x5C, 0xE8, 0xFE, 0x11, 0x7F, 0x10, 0xBC, 0x32, 0xA1, + 0x07, 0xA6, 0xFB, 0xAE, 0x6F, 0x32, 0x9D, 0x61, 0xAB, 0x36, 0xAB, 0x53, + 0x11, 0x39, 0xFA, 0x88, 0xFE, 0xDB, 0xA5, 0x51, 0x18, 0x37, 0xFD, 0xD2, + 0x89, 0x4D, 0x80, 0x34, 0x60, 0x40, 0xC0, 0x04, 0x34, 0x39, 0x9B, 0x48, + 0x85, 0xCE, 0xB3, 0x98, 0x2E, 0xE8, 0x84, 0x52, 0xD0, 0xA1, 0x51, 0x03, + 0x13, 0x22, 0xA0, 0x80, 0xD7, 0x1B, 0xAA, 0x25, 0x04, 0xC4, 0x88, 0x60, + 0x19, 0x32, 0xF8, 0x83, 0x43, 0xE0, 0xA4, 0x8C, 0xA8, 0x11, 0xDB, 0x93, + 0x8F, 0x90, 0x72, 0x82, 0xA3, 0xE9, 0x84, 0x15, 0xB0, 0xA6, 0xA5, 0xD1, + 0x35, 0x16, 0x21, 0x43, 0x00, 0xE0, 0x01, 0x6D, 0x13, 0x06, 0x70, 0x5B, + 0x43, 0xCF, 0x83, 0x2A, 0x54, 0x40, 0x84, 0x94, 0x7B, 0x2F, 0x1E, 0xEC, + 0xC1, 0xB3, 0xF3, 0xA5, 0x20, 0x14, 0x06, 0x6A, 0xE9, 0x85, 0x60, 0x20, + 0x18, 0x2A, 0x40, 0x8A, 0xCE, 0x79, 0x85, 0x4F, 0xE8, 0xA1, 0x1C, 0x18, + 0x02, 0xA6, 0x40, 0xC2, 0x40, 0xB4, 0x45, 0x89, 0x88, 0x07, 0xDB, 0x28, + 0x03, 0x40, 0xE8, 0x06, 0xDC, 0x7B, 0x88, 0x4C, 0x32, 0x84, 0xA5, 0xC2, + 0x06, 0x6E, 0x5A, 0x84, 0xF4, 0xBA, 0xC5, 0x87, 0x20, 0x06, 0xDE, 0xB9, + 0xC4, 0x4B, 0xD3, 0xC4, 0x9D, 0xD8, 0xBC, 0x86, 0x22, 0x32, 0x4E, 0x7C, + 0x28, 0x84, 0xFA, 0x05, 0xA2, 0xB8, 0x92, 0x52, 0x20, 0x82, 0x22, 0xE8, + 0x9C, 0x29, 0xF8, 0x04, 0x4B, 0x10, 0x11, 0xF2, 0xD8, 0xA1, 0x3E, 0x6C, + 0x92, 0xDF, 0x3B, 0x46, 0x0D, 0xF4, 0x86, 0x9E, 0x4B, 0x8B, 0x9F, 0x83, + 0x08, 0x70, 0xF0, 0x45, 0x47, 0x42, 0x36, 0x4F, 0xC8, 0x04, 0x06, 0xF8, + 0xC3, 0x72, 0x24, 0x08, 0xBA, 0x91, 0x12, 0xB6, 0xBB, 0x0C, 0x4E, 0x6C, + 0x21, 0x44, 0xA8, 0xBE, 0xC9, 0xA8, 0x34, 0x9A, 0xFE, 0xD8, 0x85, 0x2A, + 0xE8, 0x84, 0x4D, 0x38, 0x82, 0x6C, 0x24, 0x02, 0x2A, 0xE8, 0x84, 0x4F, + 0x88, 0x82, 0x1E, 0xEA, 0x18, 0x22, 0xA0, 0x26, 0xF3, 0xA3, 0xC7, 0x88, + 0x1C, 0x88, 0x33, 0x9B, 0x22, 0x36, 0x30, 0x84, 0x0E, 0x8B, 0xB0, 0x3B, + 0x69, 0x3A, 0x45, 0x48, 0xC2, 0x72, 0x7C, 0x2E, 0x0B, 0xB9, 0x89, 0xD1, + 0xEB, 0x89, 0xFC, 0x6A, 0x28, 0x48, 0x51, 0xA8, 0x2D, 0x98, 0x09, 0x5E, + 0x08, 0x86, 0xEC, 0xC0, 0x02, 0x10, 0x59, 0x84, 0x4F, 0x08, 0x85, 0x58, + 0xEC, 0x98, 0x19, 0x78, 0x3D, 0x72, 0x94, 0x48, 0xD9, 0xB3, 0xBD, 0x29, + 0x6A, 0x8B, 0x3F, 0xE8, 0x86, 0x43, 0xEC, 0xAD, 0x7D, 0x28, 0x29, 0x21, + 0xB9, 0x49, 0x82, 0x50, 0x98, 0x5C, 0xBA, 0x0E, 0xD6, 0xBA, 0x0C, 0x03, + 0x2C, 0xC9, 0xC9, 0x08, 0x30, 0x5F, 0xD0, 0x05, 0x55, 0xC4, 0xAF, 0x50, + 0x23, 0x82, 0x3D, 0x00, 0x05, 0x6F, 0xEC, 0xA1, 0xF6, 0x61, 0x30, 0xBB, + 0x1B, 0xCA, 0x63, 0xF4, 0x86, 0x42, 0xC8, 0x49, 0x9D, 0x8C, 0x0F, 0x40, + 0xF0, 0x86, 0x76, 0x0C, 0xA8, 0x2B, 0x00, 0x96, 0x4F, 0x90, 0xAC, 0xA1, + 0xD4, 0xBA, 0x09, 0xE8, 0x25, 0x91, 0xEC, 0x89, 0xFF, 0x5B, 0xCA, 0x25, + 0xC3, 0x23, 0xA1, 0x00, 0x06, 0x5A, 0xB8, 0xC3, 0xEF, 0x28, 0x82, 0x23, + 0xE0, 0x04, 0x4C, 0xD8, 0x81, 0x20, 0x20, 0x8F, 0x1A, 0xA0, 0x40, 0x22, + 0xE8, 0x9A, 0x71, 0xDC, 0x4A, 0x89, 0x8C, 0x87, 0x6E, 0x00, 0x84, 0xBD, + 0x03, 0x4B, 0xE4, 0xC2, 0xC8, 0x80, 0x7A, 0x07, 0xA6, 0x73, 0x3A, 0xA8, + 0x2B, 0xC7, 0x42, 0xEB, 0xB1, 0x9B, 0xB8, 0x12, 0xCC, 0x10, 0xC5, 0xB8, + 0xA4, 0x89, 0x3B, 0xE2, 0xB4, 0x2E, 0xC8, 0x8E, 0x52, 0xE0, 0x92, 0x22, + 0xB0, 0x84, 0x4F, 0xD8, 0x03, 0xBF, 0x1C, 0x11, 0x0A, 0xCC, 0x4A, 0xFE, + 0x88, 0x2C, 0xCC, 0xAD, 0x84, 0x87, 0x43, 0x60, 0x3F, 0xB0, 0x34, 0x8B, + 0x60, 0xD4, 0xAC, 0x27, 0x40, 0xA3, 0x4C, 0x58, 0x01, 0x13, 0xA3, 0x47, + 0x82, 0xCB, 0x36, 0x71, 0xD3, 0x8E, 0xB5, 0xD3, 0x4C, 0xCA, 0xC8, 0x8E, + 0x88, 0x09, 0x05, 0x29, 0x4B, 0x8A, 0x50, 0x70, 0x3A, 0x1E, 0xE0, 0x94, + 0x29, 0x78, 0x85, 0x46, 0x10, 0x05, 0x20, 0x28, 0x82, 0xF2, 0x83, 0xBD, + 0xD5, 0xDC, 0xCA, 0x6F, 0x30, 0x84, 0x41, 0x9C, 0xA2, 0x27, 0x64, 0x2B, + 0x73, 0x58, 0x01, 0x4F, 0xE8, 0x84, 0x7B, 0xA2, 0xC7, 0x6B, 0x08, 0x89, + 0x03, 0x78, 0x9A, 0x99, 0xE0, 0xAA, 0xCB, 0xA0, 0x85, 0xDF, 0xC4, 0x10, + 0x2D, 0xB0, 0x85, 0x4D, 0x20, 0x05, 0x2A, 0x50, 0xB7, 0x28, 0x00, 0x85, + 0x4D, 0x58, 0x48, 0xA8, 0x88, 0x02, 0x47, 0xC0, 0x04, 0x67, 0xC2, 0x84, + 0x29, 0x28, 0x02, 0xD7, 0x53, 0x4D, 0xE9, 0xF4, 0xCF, 0x7E, 0xA0, 0x3D, + 0xAF, 0x04, 0x20, 0x75, 0x5C, 0xAA, 0x25, 0x48, 0x36, 0x07, 0xA8, 0x87, + 0x72, 0xA4, 0x87, 0x0C, 0x62, 0xBE, 0x9B, 0xD8, 0x0E, 0x92, 0x44, 0x4F, + 0xEB, 0x40, 0x26, 0x89, 0x4A, 0x8A, 0xD1, 0x9C, 0x82, 0x21, 0x78, 0x8A, + 0x28, 0x70, 0x26, 0x47, 0xD8, 0x01, 0x0D, 0x0D, 0x05, 0x21, 0xA8, 0xB1, + 0x99, 0xFB, 0xCF, 0x11, 0x25, 0x08, 0x78, 0x40, 0xCC, 0xBD, 0x9B, 0x91, + 0xDE, 0xB2, 0x06, 0xD5, 0x19, 0x3E, 0x3F, 0x0B, 0x44, 0x1E, 0x5B, 0x46, + 0x62, 0xDA, 0x8E, 0xE8, 0x8B, 0xD0, 0xEA, 0x08, 0xA4, 0xD7, 0x22, 0x82, + 0x50, 0xE8, 0x04, 0x47, 0x18, 0x02, 0x0C, 0x45, 0x02, 0x48, 0xB8, 0x04, + 0x8D, 0x72, 0x37, 0x4C, 0xD8, 0x03, 0x71, 0x04, 0x80, 0x8E, 0x24, 0x51, + 0xE9, 0x04, 0x07, 0xD7, 0x3C, 0x0B, 0x10, 0xE3, 0xAD, 0x0B, 0xA8, 0x84, + 0x4E, 0xC0, 0xFE, 0x04, 0x0E, 0xB0, 0xC9, 0x9A, 0x83, 0xA4, 0x8F, 0xB8, + 0x10, 0x9B, 0x28, 0xCF, 0x7C, 0xAC, 0x51, 0xFE, 0xFA, 0x41, 0x0A, 0xA5, + 0x82, 0x4C, 0xD0, 0x84, 0x23, 0xC0, 0xD0, 0x1D, 0xB8, 0x84, 0xFC, 0x8C, + 0x8A, 0x1A, 0x68, 0xA6, 0x29, 0x08, 0x51, 0x43, 0x4B, 0xD2, 0x37, 0x35, + 0x88, 0x7C, 0xA0, 0x4E, 0x9F, 0x6C, 0xAB, 0xE0, 0xE3, 0x4E, 0x38, 0x10, + 0xB4, 0x40, 0x54, 0x1C, 0x00, 0x70, 0x2A, 0xCA, 0x68, 0xC6, 0xCB, 0xE8, + 0xD2, 0xC9, 0x40, 0x45, 0xCD, 0xD9, 0x9C, 0x23, 0xA8, 0x84, 0x4F, 0x98, + 0x82, 0x4D, 0x71, 0x84, 0x20, 0x95, 0x8A, 0x1B, 0x88, 0x04, 0x4D, 0xD0, + 0x01, 0xDD, 0x82, 0xD3, 0x49, 0x65, 0x35, 0x0E, 0xE0, 0x84, 0x30, 0x5A, + 0x36, 0x40, 0xF4, 0x24, 0xC8, 0xA8, 0x8E, 0xED, 0xA8, 0x85, 0x2E, 0x2D, + 0x2D, 0x9B, 0x88, 0x28, 0xA4, 0xD8, 0x83, 0x4F, 0x38, 0x05, 0xF1, 0xB0, + 0x28, 0x47, 0x10, 0x8D, 0x29, 0xB8, 0x04, 0x51, 0xC8, 0xA0, 0x8A, 0xA3, + 0xD4, 0x58, 0x8D, 0x30, 0x69, 0x60, 0x10, 0x4C, 0x90, 0x01, 0x14, 0x4C, + 0xBF, 0x42, 0x33, 0x80, 0xC9, 0xAB, 0x09, 0x4F, 0xAD, 0xD1, 0xEB, 0x43, + 0x05, 0x52, 0x78, 0x05, 0x53, 0xA0, 0x05, 0x4C, 0xC8, 0x84, 0x57, 0x40, + 0xD6, 0x52, 0xD8, 0x03, 0x2F, 0xA0, 0x82, 0x0F, 0x6D, 0x0A, 0x24, 0xC0, + 0x04, 0x48, 0xD0, 0x01, 0xA9, 0xD0, 0x81, 0x33, 0xDD, 0x81, 0x10, 0x35, + 0x38, 0x59, 0xD5, 0x56, 0xF5, 0x82, 0x80, 0xE3, 0x10, 0x4A, 0x25, 0xAC, + 0x10, 0x90, 0x78, 0x94, 0x4E, 0xD5, 0x8E, 0x4F, 0xD5, 0xCC, 0x5F, 0x48, + 0x84, 0x17, 0xAA, 0xA7, 0x4E, 0xE8, 0x84, 0x4C, 0x70, 0xD7, 0x4C, 0xB8, + 0x4F, 0x67, 0xBA, 0x84, 0x57, 0x38, 0x35, 0xD0, 0x10, 0x05, 0x34, 0x95, + 0x8A, 0x66, 0x12, 0x85, 0x09, 0xFE, 0x00, 0x09, 0xDC, 0xDC, 0xD6, 0x7F, + 0x65, 0xAB, 0x62, 0x60, 0x90, 0x4C, 0x80, 0x38, 0x0D, 0x5C, 0x50, 0x90, + 0xC8, 0xD2, 0xEA, 0x50, 0xD7, 0xCB, 0x30, 0xD7, 0xA5, 0x44, 0x85, 0x88, + 0xE9, 0x04, 0xEE, 0x64, 0xD7, 0x63, 0x7D, 0x85, 0x50, 0x48, 0x05, 0x2C, + 0xF0, 0x82, 0x6B, 0xE9, 0x1C, 0xA7, 0x40, 0x82, 0x4B, 0x88, 0x84, 0x55, + 0xD5, 0x84, 0x48, 0x38, 0x02, 0x90, 0xF0, 0x42, 0x80, 0x35, 0xD9, 0x90, + 0xE2, 0x87, 0x6E, 0xDD, 0x51, 0x60, 0x93, 0x3D, 0x40, 0x03, 0x00, 0xC9, + 0xC3, 0x10, 0xB7, 0x84, 0xA1, 0xA5, 0x44, 0x4A, 0x4F, 0xB0, 0x05, 0x53, + 0x40, 0x85, 0x2D, 0xA8, 0x02, 0xA1, 0x08, 0x24, 0x75, 0x53, 0x0A, 0x42, + 0xF2, 0x03, 0x4C, 0xF0, 0x83, 0x34, 0xD5, 0xD0, 0x4B, 0xA0, 0x82, 0x45, + 0xFA, 0x88, 0x77, 0x3A, 0xD9, 0xA5, 0x0D, 0x28, 0x81, 0x0D, 0x23, 0x9E, + 0x49, 0xBF, 0x70, 0x2D, 0xC3, 0x2A, 0xB9, 0xCC, 0xCB, 0xD8, 0x84, 0x61, + 0x2A, 0x2D, 0x5A, 0xA8, 0x05, 0x54, 0xE0, 0xA5, 0x50, 0xED, 0x3A, 0x8B, + 0x69, 0xB9, 0x10, 0x01, 0x02, 0xFB, 0xDC, 0x01, 0xD0, 0xE9, 0xD8, 0x4B, + 0x98, 0x02, 0xAB, 0x68, 0x12, 0xA6, 0x65, 0xDB, 0x6B, 0xBA, 0x87, 0x6E, + 0xDD, 0x1B, 0x96, 0xB5, 0xB9, 0xA2, 0xC4, 0x52, 0x48, 0xC1, 0x3E, 0xCC, + 0xD0, 0xC7, 0x48, 0x01, 0x06, 0x61, 0xE0, 0xDB, 0xAE, 0xCB, 0x5B, 0x9A, + 0x20, 0x8A, 0x6A, 0x91, 0xCA, 0x8D, 0x7D, 0x0A, 0xFB, 0x9C, 0x56, 0x8B, + 0x42, 0xDB, 0x22, 0x38, 0x8F, 0x8F, 0x70, 0xD1, 0xB6, 0x75, 0xDC, 0xF9, + 0x39, 0x06, 0x06, 0xB9, 0x84, 0x82, 0x8D, 0x3D, 0x82, 0x82, 0x59, 0x48, + 0xB1, 0x9C, 0xA4, 0xAC, 0x12, 0x61, 0x00, 0xA6, 0x1A, 0xB2, 0x59, 0x60, + 0xF0, 0x3C, 0x60, 0x40, 0x04, 0x52, 0xB8, 0x05, 0xFE, 0x63, 0xC5, 0x84, + 0xFB, 0x2C, 0x2B, 0x51, 0xD8, 0x83, 0x2B, 0x38, 0x82, 0xCE, 0x19, 0x8F, + 0x57, 0xD0, 0x84, 0x3D, 0x58, 0x54, 0xB4, 0x0D, 0x82, 0x22, 0xE0, 0x57, + 0xB5, 0x7A, 0xDC, 0xDC, 0x3D, 0x21, 0x7D, 0xB0, 0x54, 0x4C, 0x70, 0x04, + 0xB9, 0x9D, 0xB7, 0x64, 0x14, 0xD7, 0xBF, 0xC5, 0x47, 0xCC, 0xB4, 0x8E, + 0x5F, 0xF8, 0xD3, 0xB7, 0xEC, 0xA5, 0xFE, 0x6A, 0xD7, 0x77, 0x8D, 0x57, + 0x79, 0x05, 0x52, 0x8C, 0x8A, 0x04, 0x51, 0xF0, 0x83, 0x23, 0xD0, 0x01, + 0x29, 0x90, 0xD7, 0x57, 0x40, 0x02, 0xD4, 0x0C, 0xD1, 0x92, 0xD5, 0xDD, + 0xEF, 0x35, 0x1D, 0x6E, 0x68, 0x81, 0xE2, 0x59, 0x81, 0xC9, 0x62, 0x35, + 0x76, 0x30, 0xCA, 0x87, 0x91, 0x94, 0xCB, 0x20, 0x45, 0x2D, 0xDD, 0x90, + 0x22, 0x33, 0x05, 0x52, 0x40, 0x05, 0x2E, 0x10, 0x86, 0x95, 0xEB, 0x82, + 0x54, 0x48, 0x05, 0x64, 0x8D, 0x5E, 0x04, 0x4B, 0x30, 0x3D, 0x90, 0x82, + 0x43, 0xAA, 0x01, 0x1F, 0x12, 0x4C, 0x90, 0xC0, 0x37, 0xF0, 0x35, 0x60, + 0xB0, 0x41, 0xB6, 0x4B, 0xF8, 0xDD, 0xBB, 0xE3, 0x31, 0x5E, 0xA5, 0x5A, + 0xED, 0xD0, 0x47, 0x0D, 0xC1, 0x12, 0xB8, 0x4C, 0x49, 0xCE, 0x28, 0x54, + 0x2F, 0xD8, 0x03, 0x51, 0x50, 0x05, 0xDB, 0x7A, 0x84, 0x0E, 0x7E, 0x84, + 0x41, 0x90, 0x82, 0xA8, 0x58, 0x30, 0x13, 0x51, 0x9A, 0x03, 0x36, 0xE1, + 0xA5, 0x89, 0x86, 0x5B, 0xB9, 0x04, 0x39, 0x30, 0x5F, 0x2F, 0xD3, 0x4D, + 0x00, 0xB0, 0x81, 0xF1, 0x7C, 0x98, 0xCC, 0xED, 0x89, 0x4C, 0xFB, 0x3C, + 0x2C, 0xE9, 0x04, 0x8F, 0xA3, 0x09, 0x54, 0xB4, 0x60, 0xCE, 0x99, 0xC5, + 0x28, 0xF0, 0x83, 0x3E, 0x68, 0x04, 0x0F, 0x96, 0x84, 0x28, 0x58, 0xB0, + 0x87, 0x9C, 0xAB, 0x13, 0x56, 0x62, 0x91, 0x81, 0x52, 0x8F, 0xCD, 0xFE, + 0x80, 0x79, 0x8C, 0xB0, 0x75, 0x08, 0x09, 0x03, 0xA8, 0xA3, 0xBB, 0x9D, + 0xD9, 0xC9, 0x50, 0xA8, 0x49, 0xE9, 0x04, 0x2A, 0x11, 0x86, 0x54, 0x38, + 0x05, 0x64, 0x3D, 0x05, 0x55, 0x50, 0x85, 0x50, 0x58, 0x56, 0x23, 0x08, + 0x8F, 0xCF, 0x01, 0x62, 0x3D, 0x18, 0x04, 0x2F, 0xE0, 0x01, 0x32, 0x5B, + 0xE2, 0x37, 0x16, 0x97, 0x15, 0xFD, 0x04, 0x48, 0x90, 0x03, 0x24, 0xE5, + 0x2D, 0xAD, 0x4B, 0xD8, 0xF0, 0x29, 0x26, 0x9E, 0xF0, 0xCD, 0x21, 0x83, + 0x96, 0x4E, 0x08, 0x8A, 0x53, 0xC8, 0x04, 0x5C, 0xB8, 0x17, 0x67, 0xC2, + 0x85, 0x8B, 0xC2, 0xA8, 0x57, 0xE8, 0x03, 0x2F, 0x08, 0x82, 0x21, 0x58, + 0x3D, 0xD6, 0x23, 0x82, 0x8E, 0xFA, 0x08, 0x62, 0x80, 0xE3, 0x4A, 0x36, + 0x96, 0x25, 0x58, 0x04, 0x8F, 0x75, 0x80, 0x2A, 0x0D, 0xA8, 0x2B, 0x7D, + 0x59, 0x07, 0x86, 0x9A, 0x2D, 0xDD, 0x09, 0x1D, 0x4E, 0xB2, 0x0D, 0x61, + 0xD7, 0x4E, 0x18, 0x05, 0x2D, 0xA8, 0x02, 0xBE, 0xAD, 0x5F, 0x2C, 0xD8, + 0x83, 0x52, 0x38, 0x30, 0xB2, 0xC2, 0xB2, 0x47, 0xE0, 0x83, 0x10, 0x06, + 0x1D, 0xA9, 0x08, 0x4C, 0x9A, 0xFC, 0x88, 0xC2, 0xB3, 0xE4, 0x5E, 0x36, + 0x13, 0x73, 0x78, 0x80, 0x68, 0x85, 0x83, 0xC6, 0x55, 0x2F, 0x6C, 0x50, + 0xC6, 0xA5, 0x14, 0x65, 0x9D, 0xE8, 0x63, 0x09, 0x36, 0xE5, 0x4E, 0x08, + 0xB9, 0x5E, 0x10, 0x06, 0x2E, 0x48, 0x85, 0x3D, 0xC0, 0x02, 0x2B, 0xE8, + 0x0C, 0x2A, 0xD8, 0x03, 0x55, 0x98, 0xE5, 0x0E, 0x96, 0x04, 0x3D, 0x28, + 0x5B, 0x6E, 0x21, 0x02, 0xFE, 0xF4, 0x13, 0x5F, 0x26, 0xE7, 0x32, 0x71, + 0x82, 0x4C, 0x86, 0x84, 0xE3, 0xE9, 0xB2, 0x77, 0xC8, 0xA0, 0xCA, 0x8C, + 0xCB, 0x67, 0xE1, 0x09, 0x52, 0xF6, 0x05, 0xCF, 0xF5, 0x09, 0x76, 0xDD, + 0x84, 0x41, 0xFE, 0x16, 0x86, 0x57, 0x38, 0xE4, 0x33, 0xBD, 0x28, 0x7A, + 0xFD, 0x10, 0x1E, 0x08, 0x02, 0x2F, 0xD0, 0x83, 0x0D, 0xF6, 0xE0, 0x47, + 0x88, 0x83, 0x77, 0x43, 0x4D, 0x12, 0x2E, 0xE7, 0x85, 0x66, 0x11, 0x7A, + 0x80, 0x80, 0x4C, 0x80, 0x84, 0x38, 0x90, 0x4C, 0xDE, 0x72, 0x41, 0x33, + 0x6C, 0x28, 0x20, 0xE3, 0x63, 0xF7, 0xD5, 0x8E, 0x53, 0xBE, 0x97, 0xA7, + 0xA9, 0xDF, 0x54, 0xD0, 0x66, 0x59, 0x56, 0x05, 0x29, 0xD0, 0x98, 0x1C, + 0xD8, 0x01, 0x29, 0x88, 0x83, 0x82, 0xEE, 0x83, 0x1D, 0xC8, 0xC6, 0x06, + 0x03, 0x5E, 0x86, 0x86, 0xE9, 0xF6, 0xD8, 0x02, 0x38, 0xB8, 0x84, 0x47, + 0x20, 0x81, 0x6D, 0x88, 0xB0, 0x4A, 0xBC, 0x81, 0x08, 0xFD, 0x85, 0x2D, + 0x3D, 0x4F, 0x6D, 0x5B, 0x58, 0x9E, 0x38, 0xE5, 0xE6, 0xBD, 0x85, 0x1D, + 0x46, 0xA6, 0x23, 0xC0, 0x02, 0x6D, 0xAE, 0xAD, 0x0E, 0xDE, 0x03, 0x1D, + 0xD8, 0x16, 0x29, 0x18, 0xE8, 0x47, 0x90, 0x04, 0x29, 0x28, 0x02, 0x37, + 0x8E, 0xE9, 0xAB, 0x7E, 0x8F, 0xB7, 0x15, 0xAB, 0x46, 0xC8, 0x17, 0xDE, + 0xAA, 0xC4, 0x18, 0xBE, 0x0E, 0x44, 0x88, 0x21, 0xE2, 0x6D, 0x16, 0x61, + 0x10, 0x49, 0xED, 0xEB, 0x2F, 0x1A, 0x96, 0xD8, 0x4E, 0xB0, 0x85, 0x57, + 0x38, 0x05, 0x2C, 0xD8, 0xE1, 0xCC, 0x31, 0x8A, 0x1F, 0xA0, 0x02, 0x51, + 0x58, 0x6A, 0xA9, 0xF6, 0x83, 0x69, 0x25, 0x0F, 0x24, 0xF0, 0x03, 0x55, + 0xF0, 0x02, 0x49, 0xC5, 0xEA, 0xC0, 0x66, 0x8F, 0x67, 0x70, 0x81, 0xDA, + 0x62, 0x01, 0x3B, 0x76, 0x24, 0xE5, 0x0B, 0x89, 0x00, 0x90, 0x01, 0x92, + 0xA4, 0xA1, 0x9D, 0x80, 0xD0, 0xAE, 0x43, 0x43, 0x5B, 0xC8, 0x34, 0x61, + 0xB0, 0x61, 0x5F, 0x9A, 0x6C, 0x7D, 0xFC, 0x85, 0x95, 0xAB, 0xDF, 0x55, + 0xAE, 0x0E, 0x64, 0x02, 0xB5, 0xFE, 0x4C, 0x39, 0x82, 0x3E, 0x28, 0xE8, + 0xA9, 0x5E, 0x3D, 0xD4, 0x54, 0x16, 0x4A, 0x16, 0xEC, 0xD5, 0x76, 0x0E, + 0x0E, 0x70, 0x84, 0xDA, 0x52, 0xE7, 0xEC, 0x6C, 0x67, 0x03, 0x90, 0x81, + 0x7A, 0xBA, 0x3C, 0xFC, 0x92, 0xB4, 0x86, 0xAD, 0x82, 0xE0, 0xB4, 0xED, + 0x9B, 0xC8, 0x8E, 0xA8, 0xC1, 0x59, 0x5F, 0x22, 0xEB, 0xEB, 0xE8, 0x34, + 0xB9, 0xCE, 0x98, 0xCE, 0x21, 0x82, 0x1D, 0x20, 0x6D, 0x6E, 0x6E, 0x04, + 0x44, 0xC2, 0xE5, 0x6E, 0x01, 0x00, 0xE0, 0x61, 0xED, 0xE9, 0x76, 0x0D, + 0x73, 0xF8, 0x0D, 0x83, 0x9E, 0xE8, 0x5A, 0x4A, 0x04, 0xDE, 0x91, 0x80, + 0x02, 0x8C, 0xAA, 0xE8, 0x93, 0x1A, 0x86, 0x1A, 0x9F, 0x51, 0x60, 0xAD, + 0x9A, 0x98, 0xAF, 0xC8, 0xAE, 0xCB, 0x9D, 0xC8, 0xCC, 0xF0, 0x49, 0x37, + 0xB8, 0xEB, 0x12, 0xF1, 0x50, 0xEE, 0x82, 0x1E, 0x5A, 0x6E, 0x19, 0x4C, + 0x00, 0xC0, 0x06, 0xEA, 0xC6, 0xEF, 0xD5, 0x70, 0x02, 0x46, 0xE8, 0x60, + 0x16, 0x88, 0x06, 0x16, 0xBC, 0x26, 0x7B, 0xE0, 0x31, 0x18, 0x2E, 0x40, + 0x20, 0xE3, 0xA3, 0x9C, 0xA8, 0x1A, 0x4C, 0xF3, 0x05, 0x0D, 0x69, 0xD8, + 0xFB, 0xEA, 0xC7, 0xEB, 0xC8, 0x89, 0x5A, 0x08, 0xEF, 0xC9, 0x10, 0x06, + 0x62, 0x68, 0xA1, 0x88, 0xE2, 0x12, 0x2F, 0x31, 0x4D, 0x20, 0x88, 0xEF, + 0x0E, 0x0E, 0x84, 0xB2, 0xA5, 0xC0, 0xF2, 0xF3, 0xD7, 0xFC, 0x26, 0xF1, + 0xB1, 0xA0, 0x07, 0x07, 0x88, 0x04, 0xA9, 0x2E, 0x00, 0x4E, 0xFE, 0x1A, + 0x6D, 0x0A, 0x4F, 0x1F, 0x88, 0xAA, 0xD0, 0x7A, 0x21, 0xD5, 0xB2, 0x8C, + 0x4F, 0x95, 0x14, 0x21, 0x7B, 0x28, 0x21, 0x93, 0x94, 0xD0, 0xEB, 0x38, + 0x5F, 0xB8, 0xAF, 0x67, 0x3C, 0xC0, 0xAB, 0xC5, 0x44, 0x54, 0xB8, 0xEC, + 0x5F, 0xB8, 0x51, 0x29, 0xFB, 0x0C, 0x2F, 0x21, 0xFE, 0x8F, 0x0E, 0x97, + 0x04, 0x24, 0xC0, 0x01, 0xE8, 0x06, 0x80, 0x11, 0x2F, 0x71, 0x25, 0xBC, + 0x06, 0x21, 0xBA, 0x26, 0x62, 0x90, 0x83, 0x0E, 0x8E, 0x83, 0x6C, 0x6D, + 0xA4, 0x4A, 0x9C, 0x80, 0x5E, 0x78, 0x28, 0xA9, 0xBA, 0x3C, 0x73, 0x35, + 0x70, 0xCE, 0x23, 0xC9, 0x3B, 0x7A, 0xF0, 0xF3, 0xEE, 0xA5, 0x2B, 0x31, + 0xD7, 0x87, 0xA2, 0x51, 0x4D, 0x23, 0x37, 0xE4, 0x55, 0x6F, 0x41, 0x3D, + 0x72, 0x97, 0x8B, 0xC5, 0x0E, 0x97, 0x02, 0x21, 0x68, 0xE3, 0x79, 0x99, + 0x72, 0x5B, 0x5C, 0x82, 0x97, 0x76, 0x24, 0x0D, 0x18, 0x62, 0x9B, 0xAE, + 0x20, 0x38, 0xDA, 0x31, 0xDE, 0xD9, 0xE9, 0x30, 0xE7, 0xA3, 0x17, 0xFA, + 0x2F, 0x9C, 0xF0, 0x04, 0x61, 0xAA, 0xB4, 0xD2, 0xCA, 0x0E, 0x1A, 0x4D, + 0x84, 0x4D, 0xF8, 0xE9, 0x99, 0xD0, 0x90, 0x4D, 0x90, 0x74, 0x21, 0xA7, + 0x89, 0x87, 0x22, 0x45, 0x20, 0xB3, 0x85, 0x2D, 0x38, 0xAD, 0x9A, 0x00, + 0x5B, 0xF7, 0xDE, 0xD8, 0x6F, 0x7C, 0xE4, 0x1D, 0xF0, 0x83, 0x55, 0xD8, + 0x81, 0xC5, 0x35, 0x89, 0x3E, 0x07, 0x44, 0x8F, 0x38, 0xD2, 0xA5, 0xB2, + 0x6E, 0x6E, 0x46, 0x50, 0x22, 0x72, 0x8C, 0xC5, 0x7E, 0x14, 0x45, 0xC7, + 0x74, 0x92, 0x03, 0x32, 0x6E, 0x53, 0xA8, 0xF8, 0x62, 0x2D, 0x92, 0x74, + 0xC3, 0xEC, 0x2B, 0xB7, 0x83, 0x9A, 0x09, 0x85, 0x7A, 0x46, 0xA9, 0x79, + 0xF0, 0x03, 0x34, 0x39, 0xCE, 0x44, 0x2D, 0x53, 0x08, 0x24, 0xE2, 0x3C, + 0xE3, 0x58, 0x24, 0x8F, 0x23, 0x30, 0x52, 0x58, 0x07, 0xC4, 0x54, 0x38, + 0xA2, 0x04, 0xD0, 0x39, 0x22, 0xDA, 0x82, 0x2C, 0x37, 0xE8, 0x0C, 0x18, + 0xA2, 0x75, 0x68, 0xE7, 0x8D, 0xE3, 0xF5, 0x99, 0xE0, 0xCC, 0xCB, 0xF4, + 0xB8, 0x00, 0x14, 0x86, 0x1E, 0x07, 0x40, 0x64, 0xAF, 0x89, 0x20, 0xFE, + 0x14, 0x0A, 0x49, 0xD3, 0x74, 0xDF, 0xEE, 0x84, 0xD0, 0x92, 0x3E, 0xF2, + 0x0C, 0xB7, 0xAE, 0x5B, 0xF0, 0x20, 0xC4, 0x70, 0xD8, 0x42, 0xF5, 0x47, + 0x1E, 0x0D, 0x0A, 0x08, 0x51, 0x6D, 0x5F, 0xC2, 0xC7, 0x70, 0x01, 0x03, + 0xE0, 0x72, 0x6C, 0xDA, 0x07, 0x0E, 0x18, 0x74, 0x39, 0x40, 0x0D, 0x87, + 0xB8, 0x87, 0x72, 0xB0, 0xF8, 0x72, 0x30, 0x87, 0x8C, 0xBF, 0xF8, 0xE2, + 0x32, 0x93, 0x43, 0x87, 0x8C, 0x46, 0x1B, 0x85, 0x5A, 0xF8, 0x85, 0x94, + 0x8B, 0x18, 0x36, 0x04, 0x3B, 0xF6, 0xD4, 0x89, 0xE9, 0x23, 0x39, 0x95, + 0x33, 0x39, 0x49, 0x79, 0x73, 0x5F, 0x78, 0xA1, 0x67, 0x54, 0xA8, 0xAF, + 0x93, 0x34, 0x4B, 0xAB, 0x98, 0x1E, 0x44, 0x85, 0xF3, 0xC1, 0x18, 0x2A, + 0x10, 0xDB, 0xBF, 0x7C, 0xE4, 0x20, 0xD0, 0xE5, 0x57, 0x47, 0xF8, 0xF4, + 0x03, 0x4F, 0xD5, 0x09, 0x21, 0xC2, 0x29, 0x1C, 0x2B, 0x27, 0xA2, 0x72, + 0x18, 0x01, 0x0F, 0x26, 0x01, 0x69, 0x58, 0x07, 0x69, 0x20, 0x86, 0x25, + 0x70, 0xD9, 0xE8, 0xD1, 0x20, 0xDE, 0x59, 0x82, 0x2B, 0x90, 0x06, 0x16, + 0x77, 0x8D, 0x24, 0x78, 0xC8, 0xAD, 0xAB, 0x92, 0x5F, 0xD2, 0x02, 0xCF, + 0xCB, 0x62, 0x93, 0xA7, 0x89, 0x5A, 0x10, 0x73, 0x7C, 0xDC, 0xA3, 0x17, + 0x8A, 0x6C, 0x85, 0x6A, 0x58, 0x5F, 0x40, 0xF3, 0xAC, 0xF5, 0x04, 0x2D, + 0x78, 0x9A, 0x5E, 0xB8, 0x2F, 0x5A, 0x98, 0x50, 0x23, 0x10, 0x85, 0x4C, + 0xE0, 0x79, 0xD5, 0x93, 0x8A, 0x0A, 0x08, 0x80, 0x00, 0x1E, 0x91, 0xA0, + 0x1F, 0x7A, 0xD9, 0xAB, 0x87, 0xE5, 0x79, 0x0C, 0x34, 0x5A, 0x04, 0xAB, + 0x27, 0xE6, 0x13, 0xEA, 0x02, 0x71, 0x97, 0x84, 0x02, 0xB0, 0xFA, 0x8F, + 0x20, 0x00, 0x11, 0xB0, 0x7C, 0xCB, 0x77, 0x80, 0x11, 0x60, 0x00, 0xAB, + 0xE7, 0xA2, 0xFE, 0x22, 0x32, 0xCA, 0xE1, 0xF6, 0x77, 0x0A, 0xD7, 0xF7, + 0x9A, 0x00, 0x86, 0xD1, 0x97, 0x51, 0xB4, 0x8F, 0xC3, 0xCF, 0xBB, 0x77, + 0xF9, 0xF2, 0x84, 0x2E, 0xA8, 0x98, 0x06, 0x94, 0x76, 0x54, 0x84, 0xCA, + 0xCD, 0xE0, 0x0C, 0x2B, 0xF8, 0x84, 0x48, 0x98, 0xA8, 0x08, 0xCC, 0x81, + 0xF7, 0xA9, 0x80, 0xD3, 0xCE, 0xF6, 0xC2, 0xAF, 0xB9, 0x68, 0xC0, 0xA0, + 0x8F, 0x10, 0x80, 0x0D, 0xDA, 0x09, 0x4B, 0x50, 0x84, 0x16, 0x58, 0xA7, + 0x82, 0xC3, 0xA6, 0x7B, 0x80, 0xF8, 0x0E, 0x6E, 0x84, 0x01, 0x28, 0x80, + 0x11, 0x78, 0x01, 0x18, 0xE0, 0x03, 0x3E, 0x90, 0x85, 0x58, 0x98, 0x85, + 0xED, 0x97, 0x85, 0xEE, 0xF7, 0x7E, 0x59, 0x10, 0x04, 0x3D, 0x28, 0x81, + 0x90, 0xD0, 0x00, 0xAE, 0x67, 0x8C, 0x4D, 0xDD, 0xCD, 0x9A, 0xD0, 0x85, + 0x1E, 0xE8, 0x01, 0x1B, 0x70, 0x7F, 0x1B, 0x98, 0x00, 0x09, 0x90, 0x7F, + 0x09, 0x88, 0xFF, 0xF9, 0xA7, 0xFF, 0xF7, 0xB7, 0x01, 0x1C, 0x60, 0xFF, + 0x71, 0x5D, 0xB2, 0xE0, 0xDC, 0x3C, 0x5D, 0x00, 0x08, 0x60, 0xB6, 0x3C, + 0x55, 0xF9, 0xA5, 0xCB, 0x97, 0xAF, 0x5E, 0x9E, 0x6C, 0xF1, 0x0A, 0x56, + 0xCA, 0x13, 0xAD, 0x60, 0xBD, 0x7A, 0xF1, 0xE2, 0x85, 0xCA, 0x53, 0x29, + 0x5E, 0xBB, 0x76, 0x69, 0x7C, 0x75, 0x69, 0x4A, 0x11, 0x21, 0x42, 0x82, + 0x00, 0xC9, 0x61, 0xD2, 0x64, 0x0D, 0x00, 0x00, 0x68, 0x9C, 0x3C, 0x49, + 0x41, 0x25, 0x80, 0x7E, 0x32, 0x67, 0xD2, 0xAC, 0x69, 0xF3, 0x26, 0xCE, + 0x9C, 0x3A, 0x77, 0xF2, 0xEC, 0xE9, 0xF3, 0x27, 0xD0, 0xA0, 0x42, 0x87, + 0x12, 0x2D, 0x6A, 0xF4, 0x28, 0xD2, 0xA4, 0xEB, 0x2E, 0xA8, 0x6C, 0xB1, + 0xC8, 0x13, 0xD4, 0xA8, 0x50, 0x55, 0x00, 0xD0, 0x70, 0x2F, 0x29, 0xD6, + 0xAC, 0x43, 0xA1, 0x34, 0x90, 0xFE, 0xF4, 0x48, 0x52, 0x1C, 0x07, 0xB0, + 0x66, 0xC9, 0x2A, 0x2B, 0x6B, 0x16, 0x59, 0xB3, 0x6A, 0xCB, 0xA2, 0x85, + 0x55, 0x02, 0xA6, 0x13, 0xAD, 0x5A, 0x95, 0xC1, 0x94, 0x70, 0xB0, 0x87, + 0x0D, 0x09, 0x08, 0x60, 0xF2, 0xED, 0xEB, 0xF7, 0x2F, 0xDF, 0x00, 0x08, + 0x24, 0x48, 0xB0, 0x61, 0xA3, 0x47, 0x8F, 0x2A, 0x08, 0x17, 0xFF, 0x32, + 0xE5, 0x09, 0x15, 0x2F, 0x23, 0x15, 0x75, 0x55, 0xF1, 0x64, 0xAA, 0x0A, + 0x2D, 0x88, 0x4A, 0x34, 0xEE, 0x32, 0x42, 0xC5, 0xD3, 0xA6, 0xCD, 0x1B, + 0x77, 0xED, 0xC1, 0xF4, 0x8A, 0x08, 0xEA, 0x20, 0x24, 0x79, 0xE0, 0x68, + 0x69, 0x00, 0x00, 0x82, 0x92, 0x2D, 0x23, 0xA8, 0x5C, 0x22, 0xF7, 0x36, + 0xEE, 0xDC, 0xBA, 0x77, 0xF3, 0xEE, 0xED, 0x5B, 0xEE, 0xBD, 0x25, 0x00, + 0x08, 0x58, 0x92, 0x1A, 0x55, 0x11, 0x80, 0x04, 0xFC, 0x7E, 0x33, 0x27, + 0xBA, 0x45, 0x25, 0x89, 0x47, 0xD2, 0xE1, 0x88, 0x5D, 0x6B, 0xFD, 0x7A, + 0xD9, 0x17, 0x30, 0xCD, 0x35, 0xFF, 0xA9, 0x41, 0x65, 0x00, 0x1F, 0xBE, + 0xF6, 0x02, 0x2E, 0x6F, 0xFE, 0x3C, 0x78, 0x03, 0x12, 0x66, 0xD8, 0xE0, + 0xF1, 0xE3, 0x0A, 0xA2, 0x1E, 0x45, 0xE6, 0x13, 0x29, 0x72, 0x44, 0xAA, + 0xA9, 0x23, 0x46, 0xE6, 0x77, 0xAE, 0xE5, 0xA9, 0x8B, 0x7E, 0x46, 0x08, + 0x58, 0x49, 0x26, 0x54, 0xA0, 0x46, 0x44, 0x10, 0x47, 0xEC, 0xA1, 0x4A, + 0x23, 0x48, 0x9C, 0x54, 0x81, 0x4A, 0x33, 0xC8, 0x96, 0x03, 0x10, 0xB4, + 0x01, 0x60, 0x5B, 0x77, 0x19, 0x6A, 0xB8, 0x21, 0x87, 0x1D, 0x7A, 0x38, + 0x54, 0x17, 0x2A, 0x29, 0x62, 0x9C, 0x25, 0xC9, 0xA1, 0xF3, 0x21, 0x8A, + 0xE5, 0xA8, 0xE4, 0x00, 0x0A, 0x70, 0x48, 0xF7, 0x08, 0x75, 0x6D, 0x88, + 0x30, 0x9C, 0x09, 0x7C, 0x60, 0x77, 0x9D, 0x03, 0xFE, 0xB5, 0xA1, 0x58, + 0x93, 0x3D, 0x30, 0xD9, 0xE0, 0x4B, 0x0F, 0x30, 0x21, 0x70, 0x98, 0x78, + 0x08, 0x05, 0x69, 0x82, 0x5A, 0xB1, 0xC0, 0xC2, 0x07, 0x93, 0x7D, 0xC0, + 0xF0, 0x24, 0x07, 0x23, 0xE4, 0x88, 0xDE, 0x5F, 0x07, 0x1C, 0x30, 0xC1, + 0x0C, 0x14, 0x02, 0xB1, 0xE5, 0x14, 0xA6, 0x2C, 0xF2, 0x84, 0x48, 0xF5, + 0xA1, 0xD6, 0x85, 0x27, 0xB5, 0xD4, 0x37, 0x9F, 0x11, 0xA1, 0x64, 0x22, + 0x8A, 0x98, 0x42, 0x20, 0x11, 0x09, 0x24, 0x97, 0x40, 0xD2, 0xC8, 0x49, + 0x29, 0x01, 0x10, 0x40, 0x10, 0x27, 0xF1, 0x40, 0x1E, 0x86, 0x3B, 0xFA, + 0xF9, 0x27, 0xA0, 0x81, 0x0A, 0xCA, 0x13, 0x37, 0x2A, 0x19, 0xC7, 0x09, + 0x00, 0x19, 0x0C, 0x9A, 0x21, 0x53, 0x04, 0xA8, 0x02, 0x4B, 0x07, 0x2E, + 0xC2, 0x38, 0x80, 0x5F, 0x30, 0xDC, 0xB8, 0x96, 0x2A, 0x30, 0xAD, 0x03, + 0xA8, 0x34, 0x30, 0x89, 0x17, 0x24, 0x6C, 0x8B, 0x2D, 0xA6, 0x0B, 0x02, + 0x0A, 0xC0, 0x12, 0x8B, 0x59, 0xA8, 0x5E, 0x5A, 0x96, 0x20, 0x7C, 0xE8, + 0x01, 0x43, 0x09, 0x22, 0x30, 0x70, 0x27, 0x95, 0x00, 0x18, 0x50, 0x01, + 0x05, 0x35, 0xB4, 0xA4, 0x25, 0x10, 0x43, 0x24, 0xD1, 0x89, 0x27, 0x06, + 0xA2, 0x26, 0x84, 0x12, 0x9A, 0x68, 0x72, 0xC4, 0xB0, 0x54, 0xC0, 0xC9, + 0xC8, 0x0E, 0x90, 0x44, 0x32, 0x9B, 0x4A, 0x14, 0x08, 0x61, 0x12, 0x10, + 0x30, 0xF5, 0xB9, 0x28, 0xB6, 0xD9, 0x6A, 0xBB, 0x6D, 0x6E, 0xDF, 0x19, + 0xE7, 0xC9, 0x03, 0x00, 0x5C, 0xC5, 0xAD, 0x6E, 0xC5, 0xA8, 0xD4, 0x47, + 0x59, 0xB0, 0x38, 0x00, 0xC7, 0x1B, 0xE5, 0xBD, 0xB0, 0xAA, 0x59, 0x6F, + 0x01, 0xB0, 0x05, 0xA0, 0xE6, 0xAA, 0xC4, 0x83, 0x2F, 0x3E, 0xA8, 0x84, + 0xC0, 0x41, 0xA2, 0x4E, 0x00, 0x80, 0x8D, 0xB2, 0xC0, 0xA2, 0x47, 0xFE, + 0x1B, 0x6D, 0x08, 0x02, 0xAF, 0x2C, 0xAA, 0xAA, 0xA5, 0x0A, 0x1F, 0x6D, + 0xC0, 0x20, 0x6B, 0x00, 0xE8, 0xDD, 0x4A, 0xC1, 0xAE, 0x40, 0x4C, 0xE1, + 0x49, 0x28, 0x5A, 0x06, 0x21, 0x84, 0x28, 0x98, 0x84, 0x72, 0x60, 0x14, + 0x8F, 0x40, 0x32, 0x45, 0x10, 0xCD, 0x36, 0xD2, 0x9A, 0x49, 0x34, 0x80, + 0x97, 0x67, 0x0E, 0x76, 0x02, 0x50, 0x0C, 0xB9, 0x31, 0xCB, 0x3C, 0x33, + 0xCD, 0x35, 0x01, 0x90, 0x82, 0x27, 0x96, 0xA4, 0x40, 0x40, 0x0B, 0x95, + 0xB8, 0x00, 0xC0, 0x35, 0x35, 0x6B, 0xC5, 0x94, 0x09, 0x69, 0x09, 0x2C, + 0xEF, 0x70, 0x30, 0x08, 0x12, 0xCB, 0x00, 0x11, 0x03, 0xA0, 0x07, 0xC2, + 0x7C, 0xA8, 0x74, 0x01, 0xA0, 0x4E, 0xD4, 0x85, 0x90, 0x04, 0x2A, 0x4D, + 0xC0, 0x58, 0x90, 0x2F, 0xA0, 0xDA, 0x06, 0x01, 0x7C, 0x89, 0x10, 0x30, + 0xC2, 0x97, 0xBA, 0xFA, 0xF0, 0x01, 0xE7, 0x21, 0x40, 0x01, 0x4B, 0x40, + 0x3C, 0x71, 0x8A, 0x0E, 0x2D, 0x41, 0xF1, 0x49, 0x24, 0x1B, 0x0B, 0xA1, + 0x03, 0x24, 0x90, 0xF8, 0xA1, 0x5A, 0x1F, 0x97, 0x48, 0x71, 0x12, 0x12, + 0x8D, 0x84, 0x0B, 0x00, 0x05, 0x5B, 0xBE, 0xA4, 0x92, 0x32, 0x42, 0x2B, + 0xBE, 0x38, 0xE3, 0x1F, 0x0A, 0xF0, 0x40, 0x0B, 0x7D, 0x85, 0x7B, 0x45, + 0xE3, 0x46, 0x5D, 0xA3, 0x92, 0x2A, 0x6B, 0xE9, 0xB1, 0xA2, 0x2A, 0x68, + 0xCD, 0x02, 0x03, 0x5F, 0x07, 0xC3, 0x9B, 0x36, 0x00, 0xF4, 0xFC, 0x69, + 0x35, 0x4C, 0x37, 0xFC, 0x02, 0x2A, 0x00, 0x13, 0x1C, 0xA4, 0x8B, 0x01, + 0xA6, 0xC6, 0x22, 0xAF, 0x02, 0x25, 0x94, 0x30, 0x2B, 0x00, 0xEF, 0x96, + 0x7D, 0x23, 0xC3, 0x4C, 0x12, 0xA2, 0x8A, 0x93, 0x33, 0x96, 0x77, 0xEB, + 0xAE, 0x26, 0x39, 0x92, 0xC9, 0x14, 0x14, 0x06, 0x21, 0x0A, 0x24, 0xA2, + 0x8C, 0x14, 0xFE, 0x85, 0xB3, 0x2D, 0xBD, 0x02, 0x89, 0x0C, 0x2A, 0x1D, + 0x30, 0x2D, 0x84, 0x2A, 0x91, 0x53, 0x39, 0xF7, 0xDD, 0x7B, 0x9F, 0xD5, + 0x3E, 0x30, 0x25, 0xA0, 0xCC, 0x3D, 0xCA, 0x30, 0x05, 0x00, 0xD5, 0xDF, + 0x03, 0x65, 0x75, 0x09, 0xD6, 0xCD, 0x6A, 0xC0, 0xD2, 0x66, 0xC1, 0x42, + 0xA9, 0x4A, 0x03, 0x88, 0x7E, 0xA9, 0x09, 0x2A, 0x71, 0x73, 0xD3, 0x3D, + 0xD2, 0x14, 0xF3, 0xFF, 0x89, 0x7E, 0x43, 0x17, 0xBE, 0xF4, 0xC0, 0x17, + 0x33, 0x80, 0x49, 0x04, 0x78, 0x71, 0x40, 0x3E, 0xC4, 0x02, 0x06, 0x01, + 0x60, 0x00, 0xD9, 0x64, 0xE1, 0x86, 0x88, 0xB5, 0x6F, 0x77, 0x9A, 0x9B, + 0x92, 0x4A, 0x0C, 0xC0, 0x80, 0x17, 0x64, 0x4E, 0x16, 0x0D, 0x13, 0x81, + 0xD3, 0xFC, 0xB2, 0x80, 0x2C, 0x99, 0x04, 0x09, 0x9A, 0x70, 0x44, 0x0D, + 0x78, 0x90, 0x03, 0x24, 0x38, 0x4B, 0x07, 0x77, 0x93, 0x04, 0x24, 0xFE, + 0x96, 0x03, 0x1E, 0x48, 0xE1, 0x12, 0x74, 0x7A, 0x4D, 0xEB, 0x5C, 0x96, + 0x00, 0xF5, 0xF1, 0xB0, 0x87, 0x3E, 0xC4, 0x89, 0x8A, 0x00, 0xE0, 0x04, + 0xD3, 0xC9, 0xC4, 0x1F, 0xE6, 0xB0, 0x1A, 0x11, 0x7F, 0x98, 0x93, 0x04, + 0x00, 0xA0, 0x83, 0x66, 0x11, 0x84, 0x4A, 0x4A, 0xA0, 0xB0, 0xB2, 0xB4, + 0x81, 0x2F, 0x0B, 0xB8, 0x1F, 0x76, 0x40, 0x07, 0x00, 0xCA, 0xD1, 0xE4, + 0x1E, 0xCF, 0xE9, 0x0B, 0xBD, 0x7C, 0x73, 0x8F, 0x05, 0xF0, 0xC5, 0x00, + 0xF8, 0xCA, 0x9A, 0x4A, 0x68, 0xD3, 0x3E, 0xA9, 0x55, 0x47, 0x2D, 0xAD, + 0x78, 0x03, 0xA5, 0x74, 0x67, 0x41, 0x41, 0xCC, 0x28, 0x84, 0xB6, 0xBA, + 0x53, 0x00, 0x60, 0x00, 0x0B, 0xB5, 0xF4, 0xA1, 0x04, 0x61, 0xF3, 0x4B, + 0x00, 0x2A, 0x50, 0x03, 0x1D, 0x88, 0xC2, 0x41, 0xBA, 0x62, 0xDE, 0xDF, + 0x74, 0xE0, 0x88, 0xE6, 0xC9, 0xFE, 0xA6, 0x06, 0x91, 0xB8, 0x04, 0x14, + 0x72, 0x70, 0xC0, 0x7D, 0xC1, 0x24, 0x8C, 0x4A, 0xBC, 0x24, 0x26, 0x1B, + 0x67, 0x8E, 0x04, 0x60, 0x03, 0x27, 0xF4, 0xD8, 0x47, 0x26, 0x6D, 0x42, + 0x0E, 0x00, 0x74, 0x60, 0x2D, 0xB1, 0xD8, 0x1C, 0x00, 0xDA, 0x30, 0xC5, + 0xB2, 0x80, 0x10, 0x26, 0x03, 0x80, 0x81, 0x13, 0xAD, 0xD3, 0x87, 0xA9, + 0xD1, 0x04, 0x1D, 0xE7, 0xF3, 0x4B, 0xD0, 0x7C, 0x33, 0x40, 0xBE, 0xB4, + 0xA7, 0x2F, 0x7B, 0x64, 0xC0, 0x00, 0xF6, 0x68, 0x1D, 0x3B, 0xB8, 0x41, + 0x25, 0xC2, 0x2C, 0x9B, 0x20, 0x04, 0xA0, 0x12, 0x11, 0xE8, 0xA1, 0x83, + 0x03, 0x9B, 0x92, 0x03, 0xEE, 0xA7, 0x2A, 0x3E, 0xFC, 0xD1, 0x2F, 0x08, + 0x60, 0xC9, 0x49, 0xE0, 0x84, 0x83, 0x1D, 0x2C, 0x92, 0x4E, 0x27, 0xD9, + 0xC3, 0x25, 0xFA, 0x70, 0x12, 0x03, 0xD8, 0x11, 0x00, 0x9B, 0x0A, 0x25, + 0x3A, 0xD3, 0xC9, 0xAD, 0x7B, 0x8C, 0x4B, 0x9D, 0x3B, 0x51, 0x46, 0x00, + 0x62, 0x60, 0xCA, 0x2A, 0x02, 0x00, 0x5D, 0xD6, 0x51, 0x57, 0x60, 0x00, + 0xE0, 0x80, 0x12, 0xC0, 0x40, 0x0F, 0x7C, 0xB8, 0x9F, 0xD4, 0x54, 0x32, + 0x2E, 0x76, 0x30, 0xF1, 0x4E, 0x3C, 0xE8, 0x85, 0x0F, 0xFE, 0x85, 0x3E, + 0xE6, 0x5C, 0x01, 0x3D, 0xAE, 0x12, 0x00, 0xD4, 0xAE, 0x13, 0x88, 0x39, + 0x8C, 0x20, 0x00, 0x11, 0x45, 0x98, 0x20, 0x28, 0x15, 0xCD, 0xEB, 0xB8, + 0xC2, 0x0D, 0x4D, 0xB3, 0xDF, 0x5A, 0x66, 0x21, 0x88, 0x82, 0xFE, 0x25, + 0x02, 0x14, 0xCB, 0x01, 0x24, 0x1C, 0xD1, 0x07, 0x91, 0x89, 0x22, 0x6E, + 0x26, 0xC1, 0x5B, 0x24, 0x76, 0xE0, 0x92, 0xBE, 0x5C, 0xCB, 0x9D, 0x36, + 0xBD, 0x29, 0x4E, 0xB3, 0x65, 0x2E, 0x4B, 0xAD, 0x85, 0x9E, 0x31, 0x50, + 0x15, 0x5A, 0xE4, 0x87, 0xC1, 0xBF, 0x5C, 0x54, 0xFE, 0x16, 0x30, 0xD9, + 0x1E, 0x3B, 0xC8, 0x08, 0x80, 0x08, 0x08, 0xC1, 0x08, 0x8B, 0x51, 0x68, + 0x34, 0x18, 0x7A, 0x1E, 0x3D, 0x5C, 0x80, 0x01, 0xB3, 0xD0, 0x83, 0x09, + 0x0A, 0xA0, 0xCF, 0x12, 0xA0, 0x8B, 0x10, 0x75, 0x68, 0x57, 0x09, 0x8C, + 0x76, 0xA9, 0x8C, 0x06, 0x20, 0xAC, 0x62, 0x35, 0x8B, 0x2B, 0x08, 0x41, + 0x87, 0x05, 0x04, 0x80, 0x00, 0x58, 0x2C, 0x8B, 0x2A, 0xA6, 0xE4, 0x04, + 0x92, 0xC2, 0xE4, 0x00, 0x34, 0x60, 0x9E, 0xB3, 0xF4, 0xB0, 0x2B, 0x51, + 0x5C, 0x62, 0x0F, 0x2D, 0x91, 0x02, 0xFD, 0x54, 0xC2, 0x8E, 0x9C, 0x12, + 0xB6, 0xB0, 0x86, 0xF5, 0x90, 0xB9, 0x90, 0xA4, 0x39, 0xE8, 0x10, 0x02, + 0x55, 0x41, 0x55, 0x8B, 0x1E, 0x70, 0xC7, 0x17, 0x06, 0xD8, 0xD3, 0x2C, + 0x30, 0x21, 0x86, 0x3E, 0xCE, 0x57, 0x81, 0x93, 0xF4, 0x0B, 0x76, 0x17, + 0x6A, 0xCE, 0x17, 0x01, 0x33, 0x4B, 0x11, 0x28, 0x00, 0x90, 0x0E, 0xE8, + 0x43, 0x1D, 0xEA, 0xD0, 0x00, 0x11, 0x9C, 0xF5, 0x3A, 0xEA, 0x2A, 0xAB, + 0xE7, 0xAE, 0x13, 0x0B, 0x56, 0x10, 0xA2, 0x98, 0x00, 0x10, 0x81, 0x6B, + 0x67, 0x94, 0x00, 0x76, 0x48, 0xE3, 0x96, 0x30, 0x51, 0xC0, 0x0B, 0xA4, + 0xE0, 0x52, 0xC0, 0x5D, 0x22, 0x12, 0xC3, 0x85, 0x43, 0x23, 0x58, 0x00, + 0x13, 0x98, 0x1D, 0xB6, 0xB9, 0xCE, 0x7D, 0x2E, 0x6E, 0x88, 0xA1, 0x92, + 0xB7, 0x06, 0x74, 0x00, 0x75, 0x20, 0x44, 0x2B, 0x1E, 0xBB, 0x16, 0x41, + 0x38, 0xEC, 0x49, 0x11, 0x34, 0x8B, 0x5C, 0x51, 0xB7, 0xD9, 0x93, 0x10, + 0x61, 0x31, 0x93, 0x4C, 0xA2, 0x6F, 0xC8, 0xE1, 0x5B, 0x98, 0xE8, 0xC1, + 0xB6, 0x7C, 0x59, 0xC2, 0x77, 0xEA, 0xF7, 0x86, 0x39, 0xE4, 0xA8, 0xB5, + 0xD6, 0xD1, 0xCE, 0x01, 0x5E, 0x20, 0xBC, 0x15, 0x71, 0xB5, 0x2C, 0xFE, + 0xAE, 0xA0, 0xAD, 0x1D, 0x50, 0xA0, 0x92, 0xEF, 0xC6, 0x2B, 0x39, 0x9D, + 0xEC, 0xAD, 0x5F, 0xC6, 0xDB, 0x92, 0x46, 0xF8, 0xED, 0x24, 0x2F, 0x68, + 0x44, 0x1D, 0x4E, 0xA0, 0xCC, 0x85, 0x42, 0xB7, 0xC2, 0x16, 0xBE, 0xF0, + 0x4F, 0x9E, 0x51, 0x3F, 0x18, 0x30, 0x49, 0x0F, 0x7E, 0x84, 0xC9, 0x1B, + 0xAE, 0xDB, 0x0A, 0x85, 0xD9, 0xF7, 0x46, 0xC2, 0x2B, 0xA8, 0x82, 0x4D, + 0x82, 0x2F, 0x84, 0xE8, 0x42, 0x25, 0xC9, 0xC8, 0x90, 0x34, 0xE6, 0x3A, + 0xB5, 0x26, 0x0E, 0x55, 0x25, 0x09, 0x50, 0x47, 0x3B, 0x84, 0x03, 0x80, + 0x01, 0xD0, 0xA1, 0xBE, 0xAB, 0xCA, 0xD4, 0x79, 0x0E, 0xE0, 0x86, 0x56, + 0x10, 0x82, 0x10, 0x76, 0xB8, 0x83, 0x56, 0x2B, 0x78, 0x1D, 0x79, 0x6D, + 0xAF, 0x1F, 0x08, 0xE6, 0x8B, 0x00, 0x14, 0x1C, 0x05, 0x1B, 0x9E, 0x44, + 0x07, 0x79, 0x68, 0x50, 0x0E, 0x24, 0xCB, 0x5C, 0x0C, 0x73, 0xB9, 0xCB, + 0x18, 0xAE, 0x07, 0x5D, 0xFF, 0x32, 0x82, 0x39, 0xCC, 0x21, 0x10, 0xAB, + 0x70, 0x45, 0x2C, 0xB4, 0x8B, 0x30, 0x7A, 0xA6, 0xB1, 0x78, 0x39, 0x60, + 0x4C, 0xD6, 0x34, 0xE0, 0x21, 0x15, 0x05, 0x14, 0x71, 0xE5, 0x10, 0x8E, + 0x13, 0xF8, 0xC1, 0x0E, 0x2E, 0xA8, 0x64, 0x04, 0x0D, 0x10, 0xC0, 0x2A, + 0x4D, 0xF9, 0x16, 0x28, 0x5C, 0x43, 0xC7, 0x53, 0xA3, 0x2B, 0x03, 0xE8, + 0x10, 0x08, 0x3B, 0xCC, 0x41, 0xC0, 0x04, 0xB8, 0xD4, 0x5B, 0x6E, 0x3C, + 0x93, 0x62, 0x84, 0x79, 0x01, 0x2C, 0x61, 0x70, 0x14, 0x50, 0xD2, 0x86, + 0x46, 0xB4, 0x41, 0x57, 0x71, 0x10, 0x5F, 0x3B, 0xBD, 0x2C, 0xEA, 0x51, + 0x17, 0x56, 0x1D, 0x4E, 0x58, 0xC2, 0x12, 0x4E, 0x0D, 0x13, 0x41, 0xE0, + 0x6E, 0xBE, 0x75, 0xC0, 0x03, 0x21, 0x58, 0xE1, 0x8A, 0x12, 0x63, 0x07, + 0x95, 0xB0, 0xFE, 0xD1, 0x55, 0xF1, 0x78, 0xC1, 0x62, 0x1C, 0x08, 0xB4, + 0x43, 0x2A, 0xDA, 0x2F, 0x86, 0xCC, 0xA1, 0x12, 0x7E, 0xB8, 0x63, 0x1B, + 0x5F, 0xD4, 0x2A, 0xAD, 0x65, 0x01, 0x64, 0xF3, 0xF9, 0x05, 0x1B, 0x85, + 0xE6, 0x8B, 0x1B, 0xEA, 0x70, 0x87, 0x76, 0x01, 0xE0, 0xAD, 0x6A, 0x99, + 0x45, 0xA4, 0xCF, 0xD9, 0x0F, 0x7D, 0x34, 0xB4, 0x2F, 0x14, 0x70, 0xC4, + 0x2B, 0xEA, 0x34, 0x87, 0x46, 0xC4, 0x2D, 0x70, 0x23, 0x58, 0x2E, 0xA9, + 0xD3, 0xAD, 0x6E, 0xC2, 0x42, 0x41, 0x25, 0xAA, 0x84, 0x22, 0x00, 0x0A, + 0x40, 0x07, 0x32, 0xDB, 0x81, 0x10, 0xAB, 0x90, 0x75, 0x2C, 0xF2, 0x0D, + 0x2F, 0x20, 0x03, 0x20, 0xC5, 0x27, 0xA1, 0xC1, 0x2E, 0x16, 0xA3, 0x2F, + 0x00, 0x44, 0xB5, 0x43, 0x00, 0x90, 0x6C, 0x02, 0xF4, 0xD1, 0x0F, 0xBA, + 0x04, 0x80, 0x1F, 0xF4, 0x20, 0x07, 0x36, 0x8E, 0x9D, 0x6C, 0x7A, 0x16, + 0x74, 0x09, 0xC5, 0x38, 0x5F, 0xC2, 0xFB, 0x71, 0x0D, 0x92, 0xA2, 0xE0, + 0x0E, 0x73, 0x18, 0xF0, 0x8D, 0x66, 0x31, 0xBB, 0xAA, 0x80, 0x72, 0x26, + 0xEA, 0xED, 0xCB, 0x35, 0x01, 0xC7, 0x69, 0x93, 0x6C, 0x1A, 0x69, 0x19, + 0x5F, 0x37, 0xCC, 0x63, 0x8E, 0xC9, 0x65, 0x96, 0xE5, 0x94, 0x2A, 0x11, + 0xC0, 0x7C, 0xE7, 0x70, 0x07, 0x58, 0xDB, 0x9B, 0x15, 0xAD, 0x40, 0x98, + 0x56, 0xEF, 0x54, 0xBC, 0x1A, 0x50, 0xA0, 0x5F, 0x08, 0xD9, 0x4B, 0x5C, + 0x0C, 0x6E, 0x1E, 0x7F, 0xD0, 0xC3, 0x1C, 0xD6, 0xC0, 0x86, 0xB9, 0x58, + 0x7B, 0xA9, 0xA1, 0xA6, 0x4F, 0x1F, 0x05, 0xDD, 0x5F, 0x3F, 0xEC, 0xC1, + 0x04, 0x98, 0xB8, 0xE1, 0xE3, 0x00, 0xE0, 0x69, 0x48, 0xD1, 0xF2, 0xDF, + 0x06, 0x08, 0xD1, 0x26, 0xF6, 0x82, 0x89, 0x00, 0x4E, 0xBA, 0xE9, 0x4C, + 0x5B, 0x99, 0xDC, 0xA4, 0x23, 0xFE, 0xB8, 0xCC, 0xE3, 0x2E, 0x77, 0xEF, + 0x8D, 0xB2, 0x9E, 0x6A, 0x91, 0x97, 0x00, 0xDC, 0x70, 0x07, 0x8F, 0xEF, + 0x1C, 0xD6, 0xAC, 0x48, 0xB3, 0x9A, 0x7B, 0xEA, 0x34, 0x12, 0xB6, 0x84, + 0x02, 0x2B, 0x46, 0x88, 0x42, 0x3D, 0x64, 0x1E, 0x0D, 0x38, 0xDC, 0x1C, + 0xD7, 0xB8, 0xC6, 0x34, 0x00, 0xA0, 0x64, 0xD7, 0xD2, 0x74, 0x26, 0x3A, + 0x66, 0x2E, 0x3F, 0xDE, 0xF1, 0xC5, 0x01, 0x50, 0x1B, 0xEC, 0xD6, 0x89, + 0x45, 0x5A, 0x03, 0x41, 0xA9, 0x17, 0xD7, 0x84, 0x1D, 0xEB, 0x8D, 0x40, + 0x0D, 0xE2, 0x40, 0xEE, 0x1C, 0x20, 0xB7, 0xD3, 0x2A, 0xA3, 0xE5, 0xDC, + 0x63, 0x2F, 0x7B, 0x9A, 0x0D, 0xD0, 0x3A, 0x39, 0x8A, 0x18, 0x09, 0x3C, + 0xAE, 0xF3, 0x3B, 0x04, 0x42, 0xD6, 0x64, 0xA1, 0xF5, 0xFC, 0x54, 0xE2, + 0xEF, 0x1C, 0x54, 0x80, 0x06, 0xA2, 0xE2, 0x81, 0x4A, 0x72, 0xA9, 0xA1, + 0x6E, 0x03, 0x46, 0x1A, 0xC4, 0x26, 0xC7, 0x35, 0xB2, 0xF1, 0x9C, 0x36, + 0x98, 0xAD, 0x2F, 0x17, 0x50, 0xB8, 0xD5, 0x75, 0xD4, 0x0F, 0x87, 0x9F, + 0x83, 0x0B, 0x64, 0xC4, 0x9D, 0xE7, 0x4D, 0x49, 0xE4, 0x40, 0xB4, 0xEB, + 0xE5, 0x34, 0xD9, 0x07, 0xF3, 0xAD, 0x87, 0xDC, 0x15, 0x36, 0xC2, 0x0E, + 0x2D, 0xAB, 0xD6, 0x51, 0x67, 0x2F, 0xFF, 0xF9, 0x63, 0xCB, 0x5E, 0x67, + 0xC5, 0x27, 0x00, 0x04, 0xD0, 0x80, 0xF9, 0xEE, 0x3D, 0x10, 0xD8, 0x9D, + 0x75, 0xB2, 0x69, 0x11, 0x00, 0xE0, 0x9A, 0x4B, 0x48, 0x80, 0xA8, 0x0C, + 0x1C, 0x17, 0x65, 0x08, 0x5D, 0x10, 0x40, 0xFE, 0xF8, 0x85, 0x9C, 0xE9, + 0x19, 0x39, 0x58, 0x03, 0x39, 0x34, 0x41, 0xB5, 0x5D, 0x8A, 0x00, 0xC2, + 0xC4, 0x05, 0x6C, 0xC1, 0x2D, 0x31, 0x17, 0xD3, 0x9D, 0xC3, 0x35, 0x24, + 0x43, 0x69, 0xA9, 0x44, 0xF8, 0xA5, 0xCA, 0x7F, 0xFE, 0x11, 0x02, 0x1E, + 0xE0, 0xC1, 0x8C, 0x24, 0x60, 0x4D, 0x48, 0x03, 0x5D, 0x11, 0x40, 0x1C, + 0x44, 0x41, 0x23, 0x34, 0x42, 0xA6, 0x99, 0x44, 0xF6, 0x6C, 0x11, 0xFD, + 0xDD, 0x20, 0x0E, 0xA2, 0x88, 0xBD, 0x8C, 0x45, 0x92, 0x54, 0x91, 0xD3, + 0x0C, 0x40, 0xC7, 0xED, 0x5C, 0xAC, 0xB5, 0x02, 0x9A, 0x5D, 0x0A, 0x2C, + 0xE0, 0xCE, 0x49, 0xB9, 0x84, 0x01, 0x88, 0x8A, 0x2F, 0x44, 0x4C, 0xFA, + 0x74, 0x07, 0x3B, 0x4C, 0xD7, 0x05, 0xD6, 0xC6, 0x55, 0xDC, 0x03, 0x3B, + 0x44, 0x60, 0x36, 0xEC, 0xD8, 0xAA, 0x68, 0xC7, 0x79, 0x48, 0x83, 0x4C, + 0x70, 0x5F, 0x36, 0x5C, 0x03, 0x36, 0x64, 0xC0, 0xB9, 0x60, 0x07, 0xE8, + 0xD1, 0x96, 0x91, 0xCD, 0x12, 0x00, 0x28, 0x9C, 0x4D, 0x18, 0x11, 0x19, + 0xF2, 0x85, 0x1C, 0xE0, 0xC1, 0x0B, 0x10, 0xE0, 0xEB, 0x25, 0x47, 0x0E, + 0xDE, 0x21, 0x1E, 0x36, 0x47, 0xA7, 0x7C, 0xDD, 0x62, 0x49, 0xDE, 0x7E, + 0x39, 0xC0, 0x1C, 0xD4, 0x81, 0x99, 0xC9, 0x5A, 0x11, 0xDE, 0x88, 0x1A, + 0x1A, 0xC0, 0xAE, 0xBC, 0x04, 0x13, 0x2A, 0x94, 0x3A, 0x74, 0xC7, 0x3D, + 0x30, 0x45, 0x1B, 0x7C, 0x0E, 0x00, 0x90, 0xC3, 0x15, 0xA4, 0x5A, 0xC1, + 0x65, 0x9D, 0x3A, 0x64, 0x83, 0x35, 0x10, 0x43, 0x59, 0xAD, 0xCA, 0x7E, + 0x95, 0x07, 0x11, 0x35, 0xDE, 0x35, 0x58, 0xC3, 0x36, 0x3C, 0x01, 0xC8, + 0xC9, 0x56, 0x2B, 0xD0, 0x16, 0x1E, 0xD4, 0x01, 0x2B, 0xCC, 0x4A, 0xE2, + 0xD8, 0x04, 0x3F, 0xD8, 0x43, 0x3A, 0x18, 0x9A, 0x4A, 0x64, 0xC0, 0x84, + 0x50, 0x08, 0x5F, 0x28, 0x5F, 0x1E, 0xEE, 0x22, 0x2F, 0x66, 0xC5, 0x3D, + 0x14, 0xD4, 0xFD, 0x08, 0x60, 0xE6, 0x04, 0xD4, 0x98, 0xD9, 0x81, 0xFF, + 0xAD, 0x02, 0x11, 0x06, 0xDA, 0x5A, 0x4C, 0x49, 0x12, 0x12, 0x1F, 0xFE, + 0x00, 0x14, 0xD0, 0x62, 0xF0, 0xDA, 0xCB, 0x74, 0xC7, 0x73, 0x20, 0x89, + 0x24, 0x72, 0x47, 0x4D, 0x34, 0x9E, 0x35, 0x68, 0x83, 0x70, 0x58, 0xDB, + 0x5A, 0x7C, 0xE2, 0x5F, 0x24, 0xE0, 0xF3, 0x8D, 0x62, 0x39, 0x60, 0x80, + 0x4A, 0x98, 0xA1, 0x2B, 0x10, 0x99, 0x09, 0x5E, 0x57, 0x31, 0x25, 0x5D, + 0x4D, 0xE8, 0x03, 0x3D, 0xA8, 0x43, 0x39, 0x44, 0x81, 0x1D, 0x55, 0xC0, + 0x84, 0x0C, 0x41, 0x0D, 0x5A, 0x52, 0x2F, 0xEE, 0x23, 0x3F, 0x0E, 0xC5, + 0xC6, 0x45, 0xD1, 0x0B, 0xCC, 0x0A, 0x53, 0x38, 0x80, 0x65, 0xE9, 0xD3, + 0x1D, 0xD8, 0x01, 0xCF, 0xF9, 0x5C, 0x21, 0x62, 0x07, 0x2C, 0x64, 0x10, + 0x01, 0x42, 0x08, 0x34, 0x22, 0xC4, 0xC0, 0xC9, 0x19, 0x73, 0xA8, 0x48, + 0x30, 0x9D, 0xC5, 0x2C, 0x75, 0x52, 0x4D, 0xDC, 0xC3, 0x3A, 0x44, 0x60, + 0x34, 0x44, 0x11, 0x81, 0xA9, 0x85, 0x6E, 0x01, 0x86, 0xF9, 0xE1, 0x43, + 0x47, 0x5A, 0xC3, 0x28, 0xD2, 0x1C, 0x47, 0x95, 0xA0, 0x91, 0x5D, 0xD7, + 0x2C, 0xED, 0x50, 0x36, 0xE2, 0x43, 0x3B, 0x9C, 0x43, 0x36, 0x54, 0x43, + 0xFA, 0x01, 0x80, 0x04, 0x0C, 0x81, 0x6C, 0x1C, 0x0E, 0x00, 0x24, 0x41, + 0x3F, 0xFE, 0x24, 0x50, 0xFA, 0x84, 0x3D, 0x5C, 0x41, 0x41, 0x5D, 0x40, + 0x31, 0xE8, 0x43, 0xEE, 0xA4, 0x4B, 0x9F, 0xDD, 0xC1, 0xAB, 0x15, 0xD9, + 0xBD, 0x25, 0xA3, 0x05, 0x46, 0xCB, 0x49, 0xEC, 0xC5, 0xE1, 0x21, 0x84, + 0xD3, 0xD4, 0x03, 0x73, 0x30, 0x05, 0xBA, 0xA0, 0x05, 0x14, 0xE9, 0xE3, + 0xB6, 0xB9, 0x83, 0x07, 0x6A, 0x01, 0x5D, 0xC9, 0x51, 0x48, 0xCD, 0x48, + 0x31, 0xC4, 0x17, 0x5F, 0x24, 0x80, 0xB6, 0x31, 0x5D, 0x3A, 0x60, 0x83, + 0x04, 0x6E, 0x41, 0xC4, 0x50, 0xDF, 0xE7, 0xA5, 0xA3, 0x3A, 0xDA, 0xC1, + 0xAB, 0x0D, 0xFE, 0x82, 0x4A, 0xB0, 0xE1, 0x4C, 0xEC, 0x03, 0x3D, 0xAC, + 0x43, 0x39, 0x40, 0x9E, 0x33, 0x60, 0xC1, 0xDB, 0xF5, 0xDB, 0xB4, 0x98, + 0x04, 0x5F, 0x04, 0x25, 0x62, 0x26, 0x66, 0x4F, 0x7C, 0x1D, 0x59, 0x04, + 0x54, 0x03, 0xD0, 0x5B, 0x20, 0x1C, 0xA3, 0x42, 0x02, 0x1E, 0x76, 0x4C, + 0x09, 0xAE, 0xED, 0x85, 0xF1, 0xF9, 0x8B, 0x8B, 0xFD, 0x46, 0x62, 0xAD, + 0x05, 0x85, 0x7D, 0x21, 0x3D, 0xA4, 0x83, 0x36, 0x3C, 0x03, 0x5B, 0x0D, + 0xC0, 0x0B, 0x70, 0xE1, 0xE4, 0x89, 0xE4, 0xCB, 0xE8, 0x03, 0x2D, 0x5E, + 0x41, 0xC9, 0xC9, 0xC4, 0x3D, 0xB4, 0x43, 0x04, 0x5A, 0xC3, 0x39, 0x98, + 0x23, 0x00, 0x1C, 0x53, 0x92, 0xA4, 0x63, 0x91, 0x79, 0x55, 0x1D, 0xD8, + 0x01, 0x2B, 0x68, 0xCF, 0x46, 0x82, 0x25, 0x39, 0x54, 0x03, 0x34, 0x20, + 0x83, 0x31, 0x68, 0xC1, 0x60, 0x56, 0x40, 0x48, 0xE4, 0x00, 0x5F, 0x84, + 0x9A, 0x62, 0x3E, 0xE7, 0x73, 0xDE, 0x16, 0x59, 0x00, 0x59, 0x01, 0x90, + 0x59, 0x6F, 0x46, 0x66, 0xCF, 0xB5, 0x02, 0x11, 0x96, 0x18, 0xBC, 0x21, + 0x80, 0x49, 0x60, 0x26, 0x13, 0xDA, 0x80, 0x4A, 0xB8, 0xE3, 0x6E, 0x58, + 0xDD, 0x00, 0xC4, 0x12, 0xA4, 0x54, 0x05, 0xAA, 0x65, 0x81, 0x33, 0x9C, + 0x83, 0x36, 0x5C, 0x03, 0x19, 0x56, 0x87, 0x48, 0x91, 0x91, 0x5C, 0xAE, + 0xC5, 0x5B, 0x24, 0x1D, 0x3D, 0x94, 0x83, 0x39, 0xBC, 0x26, 0x68, 0xD2, + 0xE4, 0x36, 0x32, 0x43, 0x14, 0xA1, 0x23, 0x2B, 0xA0, 0xA1, 0x5D, 0xD6, + 0xC1, 0x2A, 0x50, 0x8A, 0x2E, 0xC6, 0x62, 0x3B, 0xFC, 0x65, 0x34, 0x2C, + 0x83, 0x31, 0x20, 0x03, 0x32, 0x6C, 0x81, 0x05, 0xF0, 0x45, 0x05, 0x08, + 0x81, 0x34, 0xAA, 0x44, 0x39, 0x40, 0xA7, 0x86, 0x3E, 0xA7, 0x06, 0x5C, + 0xA4, 0x51, 0xA9, 0xC4, 0x1B, 0xFE, 0x78, 0xDC, 0xAB, 0x61, 0x67, 0x76, + 0xA2, 0x99, 0x32, 0xD2, 0x13, 0xC5, 0xEC, 0xC5, 0x8F, 0x88, 0x4A, 0x8B, + 0xF5, 0x1A, 0x6F, 0x48, 0x17, 0xD8, 0xF1, 0x41, 0x03, 0xFA, 0x85, 0x02, + 0x28, 0x03, 0x32, 0x60, 0x8E, 0x5A, 0x48, 0xCD, 0x79, 0x5A, 0x07, 0xE8, + 0x50, 0x64, 0x4E, 0xD8, 0x43, 0x26, 0xA2, 0xE4, 0x39, 0xC4, 0x57, 0x2C, + 0x91, 0xA0, 0x76, 0xEE, 0xA6, 0x5D, 0xCE, 0x01, 0x21, 0x98, 0x25, 0x4D, + 0xF0, 0x43, 0x3D, 0xA8, 0xC3, 0x70, 0x16, 0xA7, 0x31, 0x4C, 0xA9, 0x31, + 0x10, 0xC3, 0x84, 0x0A, 0x89, 0x85, 0x60, 0xE8, 0x86, 0x6E, 0x69, 0x50, + 0xB2, 0x0F, 0x5A, 0xC0, 0x44, 0x0C, 0xEC, 0x5D, 0x20, 0x22, 0x24, 0xCF, + 0x95, 0xA8, 0x7D, 0xD5, 0x91, 0x9D, 0x6C, 0x0D, 0x13, 0x92, 0x87, 0x17, + 0xEE, 0xC6, 0x2F, 0x9A, 0x0A, 0x15, 0xC1, 0x84, 0x08, 0xCC, 0xA9, 0x08, + 0x04, 0x56, 0xA2, 0x48, 0x1E, 0x8F, 0x26, 0xE5, 0x5A, 0xA8, 0xA1, 0x5E, + 0xD6, 0x84, 0x3F, 0xE0, 0x03, 0x94, 0x5A, 0x83, 0x04, 0x42, 0x83, 0x4A, + 0x90, 0xA5, 0x5A, 0xD0, 0xA5, 0x3A, 0xAE, 0x22, 0x99, 0x11, 0xC2, 0xB9, + 0x6D, 0x59, 0x3F, 0xC4, 0x26, 0x4D, 0x36, 0x28, 0x95, 0x4E, 0x29, 0x32, + 0x08, 0x26, 0xDA, 0xF5, 0x05, 0x97, 0x66, 0x6A, 0x3F, 0xEE, 0x61, 0x5F, + 0x14, 0x40, 0x1D, 0x90, 0x99, 0x75, 0xBE, 0xDA, 0x09, 0xFA, 0x5F, 0x91, + 0xB1, 0x82, 0x6B, 0x91, 0x91, 0x85, 0x18, 0xA0, 0xA8, 0xF4, 0x82, 0x78, + 0x96, 0xDD, 0x6E, 0xD0, 0xC5, 0x45, 0x11, 0x02, 0x1F, 0x14, 0xA9, 0xC0, + 0xF4, 0x41, 0x40, 0x9E, 0x4B, 0xA0, 0xCD, 0xE9, 0x3D, 0xE9, 0xCF, 0x4D, + 0x30, 0x1D, 0x3A, 0x6C, 0x83, 0xA0, 0x66, 0x83, 0x3A, 0x90, 0x21, 0x03, + 0xE0, 0xE6, 0xA1, 0x1E, 0x29, 0x21, 0x04, 0x02, 0xFE, 0x1E, 0x30, 0x9A, + 0x92, 0x92, 0xC0, 0x34, 0x7E, 0xA1, 0x3D, 0x9C, 0x24, 0x34, 0x6C, 0x01, + 0x06, 0x18, 0xC3, 0x16, 0x34, 0x81, 0x6D, 0x96, 0xC7, 0x13, 0x6A, 0x2A, + 0xB7, 0xE2, 0xE1, 0x3D, 0x10, 0xA5, 0x5F, 0x74, 0x1D, 0xA8, 0x82, 0xAA, + 0xEE, 0xA5, 0x56, 0xBD, 0x65, 0x97, 0x75, 0xD4, 0x19, 0x4E, 0x32, 0x61, + 0xBE, 0xD8, 0x18, 0x6F, 0x54, 0x95, 0x6B, 0x31, 0xC9, 0x5B, 0xC1, 0x9B, + 0xB1, 0xA6, 0xCB, 0x08, 0xCE, 0x42, 0x8E, 0x5C, 0x9F, 0x4C, 0x94, 0x43, + 0x39, 0x6C, 0xC3, 0x35, 0x70, 0x03, 0x39, 0x68, 0xA2, 0x35, 0x08, 0xEB, + 0x17, 0x85, 0x64, 0xC2, 0xE8, 0x66, 0x91, 0x29, 0xAB, 0xEE, 0x11, 0x42, + 0x0C, 0x3C, 0xEB, 0xA3, 0x82, 0x25, 0x36, 0x4C, 0x03, 0x17, 0x1C, 0x40, + 0x02, 0x84, 0x59, 0x79, 0xA4, 0x42, 0xB7, 0x66, 0x6C, 0x2F, 0xF6, 0x88, + 0x7C, 0x8D, 0xAB, 0xC7, 0x82, 0x2A, 0xAC, 0xFD, 0x9C, 0x75, 0xB0, 0x99, + 0xAA, 0x32, 0x21, 0xE9, 0xE8, 0xA2, 0x5C, 0xD0, 0x43, 0x2A, 0x4D, 0x91, + 0x1E, 0x84, 0x20, 0x4C, 0x30, 0x80, 0x09, 0x34, 0x93, 0x8E, 0xCA, 0xD6, + 0x2A, 0x58, 0x07, 0x5A, 0xA0, 0xD2, 0x05, 0xAC, 0xD7, 0xD4, 0x38, 0x01, + 0x37, 0xB0, 0x03, 0x35, 0xA8, 0x44, 0x51, 0x99, 0x12, 0xC2, 0x2A, 0xEB, + 0x91, 0xF5, 0x9F, 0x76, 0x60, 0xDE, 0x93, 0x46, 0xE9, 0x95, 0xD6, 0x8A, + 0x8F, 0x6A, 0xAC, 0xD3, 0xDE, 0x61, 0x68, 0x15, 0x40, 0xCE, 0x7D, 0x2C, + 0xA8, 0x0A, 0xE2, 0x99, 0x2D, 0x99, 0x4A, 0x94, 0xAC, 0xA8, 0x4C, 0x92, + 0x0A, 0xCA, 0x05, 0x5D, 0xA8, 0x82, 0xAA, 0xC0, 0x02, 0x07, 0x9C, 0x47, + 0x07, 0xDC, 0xD6, 0xE7, 0x79, 0x15, 0x21, 0x84, 0x94, 0x1E, 0x80, 0x63, + 0x79, 0xEC, 0x00, 0x13, 0xA5, 0x66, 0x6E, 0xA6, 0x62, 0xC2, 0xE2, 0xFE, + 0x01, 0xDF, 0xDD, 0x01, 0xC3, 0x02, 0x00, 0x31, 0xC0, 0x66, 0x3B, 0x38, + 0x1E, 0x34, 0xA0, 0x8E, 0x4A, 0x2C, 0x80, 0x09, 0xB4, 0x01, 0x1F, 0xEC, + 0x11, 0x59, 0xB0, 0xD9, 0x12, 0x38, 0xE7, 0xD3, 0x26, 0xAE, 0xFC, 0xDD, + 0xC3, 0x1B, 0x0E, 0xC7, 0x1B, 0x1C, 0xD9, 0xA7, 0x8E, 0xEB, 0xDE, 0xED, + 0x5D, 0x91, 0xA1, 0x99, 0xE7, 0xA0, 0x45, 0x40, 0x69, 0xED, 0xA8, 0xD8, + 0x18, 0xE2, 0x62, 0xC5, 0x15, 0x10, 0x24, 0xAB, 0x54, 0xD3, 0x05, 0x5C, + 0xC1, 0xFF, 0x14, 0x03, 0x31, 0x2C, 0x01, 0x49, 0x81, 0x2E, 0x5A, 0x11, + 0x02, 0x99, 0x05, 0xC2, 0xC2, 0xE0, 0xCE, 0x00, 0x38, 0x00, 0x9D, 0xCA, + 0xCA, 0x84, 0xF9, 0x05, 0x03, 0x5C, 0xCA, 0x19, 0xEE, 0xE6, 0xB2, 0x4A, + 0x5B, 0xEB, 0x36, 0x2C, 0xC6, 0x3A, 0x5C, 0x3A, 0x64, 0xC3, 0x34, 0x1C, + 0x43, 0xDA, 0x6C, 0x10, 0xBA, 0xC0, 0x42, 0x00, 0x38, 0x40, 0x20, 0x08, + 0xD3, 0x2C, 0x70, 0xA1, 0xA3, 0x2A, 0x2E, 0xF4, 0xCE, 0xDE, 0x3D, 0xA0, + 0x25, 0x00, 0x98, 0x00, 0x1D, 0x9C, 0xA0, 0x1D, 0x64, 0xEF, 0x1D, 0xB8, + 0x41, 0x88, 0x1E, 0xE4, 0xFF, 0x3D, 0x96, 0x24, 0xAE, 0x2B, 0xBB, 0xFA, + 0x02, 0x1A, 0x91, 0xDE, 0x6D, 0x2C, 0x41, 0x05, 0x09, 0xC2, 0x1F, 0x2D, + 0x41, 0x93, 0xD9, 0x44, 0x34, 0x08, 0x47, 0x00, 0x10, 0x82, 0x2B, 0x24, + 0x0C, 0x91, 0xE1, 0xC1, 0x1C, 0xBC, 0x41, 0x7D, 0x0A, 0x0C, 0x93, 0xD4, + 0x2B, 0xAB, 0xD8, 0x6A, 0x8D, 0xC1, 0x6D, 0xC2, 0xE4, 0x1B, 0xB2, 0x2E, + 0x9A, 0xB4, 0xF1, 0x1D, 0x21, 0x98, 0x80, 0x01, 0x1C, 0x83, 0xC3, 0xA9, + 0x83, 0x36, 0x4C, 0x83, 0x32, 0x44, 0xC1, 0x74, 0x99, 0x85, 0x76, 0x04, + 0xA1, 0x1D, 0xC4, 0xA9, 0xC3, 0x46, 0x2F, 0x06, 0xCB, 0xDE, 0x4D, 0x36, + 0x80, 0x09, 0xFE, 0xA0, 0x80, 0x09, 0x4C, 0xC9, 0x98, 0x91, 0x19, 0x1E, + 0x20, 0xA3, 0x76, 0x69, 0x91, 0xE6, 0x2E, 0x06, 0xF2, 0x7D, 0xA6, 0x5C, + 0xF0, 0xA1, 0xFA, 0x1A, 0xD8, 0x4E, 0x20, 0x25, 0x00, 0xBC, 0xC1, 0x6E, + 0xF2, 0xA6, 0x80, 0x95, 0xC0, 0xAC, 0x5A, 0x50, 0xBA, 0xF4, 0x11, 0xFD, + 0x18, 0x6A, 0x00, 0xB3, 0xE4, 0x3A, 0x4E, 0x2E, 0xE5, 0xE6, 0xC8, 0x30, + 0xC4, 0x63, 0x03, 0x2F, 0x03, 0x32, 0x30, 0xD1, 0xED, 0xB2, 0x0A, 0x00, + 0xE4, 0xDE, 0xDE, 0xFD, 0x5C, 0xF8, 0x3E, 0x6F, 0x06, 0x47, 0x71, 0xCC, + 0x3D, 0x03, 0x1A, 0xE5, 0x13, 0xB4, 0x91, 0x19, 0xEF, 0x29, 0xA4, 0x04, + 0x67, 0xED, 0xF8, 0x1E, 0x9D, 0x4A, 0xE4, 0xED, 0x6D, 0x7C, 0x5D, 0x0B, + 0x5B, 0x45, 0x4F, 0x7C, 0x07, 0x0A, 0xA4, 0xD6, 0xDE, 0xD1, 0x81, 0xB3, + 0xFE, 0x85, 0xEC, 0x9A, 0x80, 0x77, 0xF1, 0x41, 0xB2, 0xC9, 0x82, 0x20, + 0x94, 0xC0, 0x02, 0x7C, 0xD7, 0x19, 0xAE, 0x42, 0x91, 0x2D, 0x6B, 0xDD, + 0x32, 0x25, 0x21, 0xE4, 0x48, 0x35, 0x40, 0x29, 0x35, 0xD8, 0x28, 0x16, + 0x14, 0x2A, 0x78, 0x85, 0x30, 0x1D, 0x98, 0xEA, 0x59, 0x34, 0xE0, 0x2B, + 0x4A, 0x31, 0x23, 0xC3, 0xDC, 0x05, 0xF4, 0xC0, 0x9E, 0x98, 0x87, 0xBC, + 0x59, 0xE7, 0x10, 0x82, 0x97, 0x4A, 0xAC, 0xE8, 0xF8, 0xDE, 0xC0, 0xDF, + 0xF6, 0x29, 0x56, 0xE8, 0xD3, 0xAC, 0x68, 0x00, 0x27, 0xE7, 0xC4, 0x47, + 0x02, 0x00, 0x0A, 0xBC, 0xC1, 0x1B, 0xA0, 0xC0, 0x00, 0xD4, 0x2E, 0x95, + 0x30, 0xC0, 0x08, 0xC0, 0x40, 0x1F, 0xD0, 0xAA, 0x59, 0xC4, 0xD2, 0x19, + 0xD2, 0x16, 0xD1, 0xEE, 0xDE, 0xB8, 0x06, 0x42, 0xD8, 0x50, 0x03, 0x3A, + 0x68, 0x43, 0x34, 0x24, 0x03, 0x32, 0x6C, 0x40, 0x19, 0x4A, 0xD0, 0x08, + 0x4C, 0x2E, 0x22, 0x97, 0xC5, 0xFE, 0x1F, 0x05, 0x50, 0x23, 0x27, 0xF3, + 0xA8, 0xA9, 0x6C, 0x01, 0xF1, 0x42, 0x5E, 0xE0, 0x50, 0x20, 0x91, 0xC7, + 0x00, 0x90, 0x00, 0x16, 0xD7, 0xDB, 0xDF, 0x95, 0xC5, 0x94, 0x60, 0x32, + 0xBB, 0xFE, 0x02, 0x1A, 0x75, 0x6D, 0x52, 0x60, 0x60, 0xE7, 0xE6, 0x84, + 0xA1, 0x4D, 0x58, 0x01, 0x48, 0x43, 0x3D, 0xF0, 0xAB, 0xFF, 0x10, 0xC3, + 0xA9, 0xE9, 0x6C, 0x60, 0x30, 0x40, 0x09, 0xE8, 0x01, 0xFF, 0xA6, 0xCA, + 0x6C, 0xE5, 0xF1, 0x91, 0xD9, 0x32, 0xBD, 0xAD, 0x82, 0x4A, 0xAC, 0x43, + 0x3A, 0x5C, 0x83, 0x94, 0x1E, 0x40, 0x00, 0x0C, 0x00, 0xAB, 0x24, 0xEF, + 0x08, 0xD0, 0x81, 0xC8, 0x96, 0x05, 0x2A, 0xC1, 0xA4, 0x32, 0x27, 0x74, + 0x97, 0xD1, 0x85, 0x78, 0xF0, 0x82, 0x10, 0xDC, 0x62, 0x0E, 0xD4, 0x21, + 0x00, 0x74, 0x9D, 0xC7, 0xF9, 0xDF, 0x88, 0xCD, 0x82, 0x8F, 0x74, 0xB1, + 0x91, 0x6C, 0x87, 0x5C, 0x14, 0x54, 0x23, 0x02, 0x85, 0x3E, 0xF8, 0xED, + 0x85, 0x7C, 0x74, 0x4E, 0xE8, 0x03, 0x39, 0xF8, 0x8F, 0xAA, 0xFD, 0x85, + 0x09, 0x54, 0xD6, 0xE7, 0xC9, 0xED, 0xA2, 0x89, 0xE9, 0xB8, 0xDA, 0x01, + 0xB5, 0x81, 0xA5, 0x35, 0x34, 0xC3, 0x33, 0x0C, 0x32, 0x9E, 0xCA, 0xC2, + 0xED, 0xE9, 0xD3, 0x32, 0x46, 0x8C, 0x37, 0x2B, 0x34, 0x50, 0x3B, 0x97, + 0x70, 0x20, 0xC4, 0x2E, 0x10, 0x01, 0x44, 0x3B, 0xA3, 0x4A, 0x34, 0xC0, + 0xE4, 0xD6, 0x1B, 0x32, 0xC6, 0x42, 0x46, 0x6B, 0xB4, 0x2F, 0x28, 0xD4, + 0x05, 0x84, 0xF3, 0x50, 0xFC, 0xE2, 0x05, 0x03, 0x85, 0x3D, 0x90, 0x03, + 0x39, 0x60, 0xE5, 0x50, 0xAC, 0x03, 0x36, 0x70, 0xC1, 0x0E, 0xB4, 0xB3, + 0xC1, 0xC6, 0x42, 0xA2, 0x46, 0xEE, 0xB8, 0xE2, 0x41, 0x31, 0xED, 0xC0, + 0x82, 0x52, 0x83, 0x33, 0x1C, 0x43, 0x58, 0x3F, 0xFE, 0x4D, 0xAA, 0xD0, + 0x53, 0x65, 0xD5, 0x99, 0x46, 0x06, 0xB5, 0x5D, 0x3B, 0x97, 0x4A, 0x10, + 0xF5, 0x43, 0x0F, 0x1D, 0x5F, 0x04, 0xA1, 0xF7, 0xAE, 0x42, 0x1F, 0xD0, + 0x0F, 0x0E, 0xF4, 0x02, 0x54, 0x7B, 0x96, 0x0D, 0x62, 0x85, 0xB9, 0x98, + 0x1F, 0x4F, 0xF0, 0x03, 0x7F, 0x22, 0x05, 0x63, 0xDB, 0x03, 0x3D, 0x30, + 0x03, 0x14, 0x28, 0x55, 0x4E, 0x0B, 0xAD, 0x2A, 0x26, 0xE9, 0x59, 0x3B, + 0xEB, 0x15, 0x74, 0xA4, 0x03, 0x1B, 0xC3, 0x95, 0x1A, 0xAB, 0x03, 0x04, + 0x40, 0x7D, 0x0A, 0xCF, 0xB6, 0xDE, 0xB5, 0x69, 0xE7, 0x54, 0xDD, 0xE9, + 0xF5, 0x51, 0xE7, 0x00, 0x4F, 0xC6, 0xF0, 0xE4, 0x8E, 0xB0, 0x1A, 0x3E, + 0x23, 0x54, 0x23, 0x44, 0xAB, 0x02, 0x80, 0x35, 0x24, 0xC5, 0x3E, 0x30, + 0x11, 0x14, 0xEB, 0x44, 0x3D, 0xB4, 0x43, 0x56, 0xF8, 0xC3, 0x3E, 0xE0, + 0xC3, 0x3B, 0xE8, 0x73, 0x3A, 0xA8, 0x83, 0x31, 0x14, 0x14, 0xDC, 0xDE, + 0xF1, 0x3A, 0x8E, 0xEB, 0x75, 0x85, 0x0D, 0x32, 0xA0, 0x83, 0xF0, 0x26, + 0x83, 0x31, 0xAC, 0x88, 0xFB, 0xF0, 0xA1, 0x07, 0xA1, 0xDB, 0x69, 0x67, + 0x37, 0x4E, 0xD1, 0x45, 0x04, 0xA8, 0xB6, 0x9B, 0xE5, 0x40, 0xED, 0x86, + 0xF0, 0x1C, 0xC0, 0x5A, 0xC3, 0xAA, 0x44, 0x44, 0x42, 0xB5, 0x85, 0x24, + 0x80, 0x3D, 0x20, 0x45, 0xA1, 0xAC, 0xE1, 0x4F, 0x00, 0xEA, 0x56, 0xFB, + 0x43, 0x52, 0xF0, 0xC3, 0x3D, 0xF4, 0x36, 0x3A, 0x94, 0x43, 0x18, 0x92, + 0x83, 0x39, 0x5C, 0x29, 0x81, 0x91, 0x35, 0x1E, 0x2F, 0x6B, 0x4C, 0x7F, + 0x1A, 0x00, 0x94, 0x43, 0x3A, 0x58, 0x03, 0x34, 0x24, 0x03, 0x4E, 0x07, + 0xAD, 0xBC, 0xC8, 0xE5, 0x89, 0x51, 0xB5, 0x76, 0x3F, 0xF8, 0x0F, 0x59, + 0x8D, 0xAA, 0xEE, 0x42, 0x61, 0xBA, 0x99, 0x44, 0xA3, 0x00, 0x16, 0xFE, + 0xE3, 0x81, 0x80, 0xA9, 0x84, 0xD1, 0x41, 0xF5, 0xC0, 0x55, 0x85, 0x83, + 0xF7, 0x84, 0xD5, 0x90, 0xA7, 0x4E, 0xFC, 0xA9, 0x6C, 0x46, 0x03, 0x3A, + 0x84, 0x78, 0x4F, 0xD0, 0x77, 0x3D, 0x0C, 0x77, 0x3A, 0x00, 0x2B, 0x34, + 0x40, 0x43, 0x36, 0x98, 0xA2, 0x75, 0x27, 0x49, 0x2B, 0xE0, 0xF1, 0x4B, + 0x83, 0x6A, 0x20, 0x14, 0x53, 0x06, 0xEC, 0xAD, 0x81, 0x1B, 0x03, 0x05, + 0x36, 0x91, 0x59, 0xE8, 0xC1, 0xED, 0x15, 0xAB, 0x2C, 0xD8, 0xDA, 0x6E, + 0x43, 0xB8, 0x92, 0xFB, 0xD0, 0x77, 0xA8, 0xAA, 0x2E, 0xEC, 0xF5, 0x77, + 0xD7, 0x21, 0x8F, 0xD1, 0x1B, 0x06, 0xCD, 0xF6, 0xD6, 0xC2, 0xC4, 0x4F, + 0x03, 0x05, 0x13, 0x2D, 0xF2, 0x4E, 0xC8, 0x64, 0x39, 0x50, 0x03, 0x34, + 0x68, 0x43, 0x3B, 0x84, 0x32, 0x50, 0xD0, 0x37, 0x3E, 0xD0, 0x43, 0x3B, + 0xDC, 0x37, 0x36, 0x10, 0x67, 0x8C, 0x5B, 0x81, 0xBB, 0xB5, 0x34, 0x2D, + 0x63, 0x36, 0xEF, 0xCD, 0xCA, 0x15, 0x5C, 0xE1, 0x8F, 0x03, 0xB3, 0x91, + 0x2B, 0x5B, 0x77, 0x05, 0x0C, 0x2C, 0xFC, 0x51, 0x02, 0xA8, 0xF8, 0x92, + 0x07, 0x7A, 0xE3, 0x70, 0xB1, 0x2F, 0x50, 0xF8, 0x77, 0x3F, 0x08, 0x4C, + 0x84, 0xF0, 0x1D, 0x54, 0xB9, 0x95, 0x2F, 0x46, 0x96, 0xB6, 0xE9, 0x50, + 0xA8, 0xEC, 0x80, 0x2F, 0xB6, 0x4C, 0x7A, 0x60, 0x8C, 0x47, 0xC3, 0x39, + 0xBC, 0x03, 0x99, 0xAF, 0x78, 0x70, 0xD3, 0x83, 0x3B, 0xA8, 0xC3, 0x39, + 0x40, 0xDC, 0x34, 0x40, 0x43, 0x33, 0x40, 0xC3, 0x1B, 0xE6, 0xAF, 0x7F, + 0xB9, 0x74, 0x92, 0xF6, 0xE6, 0x20, 0x44, 0x4C, 0x36, 0xA0, 0x03, 0x39, + 0x50, 0x83, 0x83, 0x9A, 0x23, 0x00, 0xB3, 0xC5, 0x8C, 0x72, 0xB9, 0xA0, + 0xE7, 0xBA, 0xF7, 0xA8, 0xC3, 0x25, 0xFF, 0x42, 0x2F, 0x18, 0x01, 0xCB, + 0x1C, 0x7A, 0xFE, 0x0E, 0x64, 0xA9, 0xB8, 0x5E, 0x4D, 0xA3, 0x4B, 0x24, + 0x5F, 0x64, 0xE8, 0x50, 0x04, 0xD1, 0xA6, 0xCF, 0x04, 0x3F, 0x78, 0x39, + 0x3F, 0x37, 0x03, 0x33, 0x44, 0x03, 0x36, 0xA4, 0x03, 0x3D, 0x2C, 0x47, + 0x50, 0xF0, 0x83, 0x3E, 0xE0, 0x43, 0x3D, 0xB8, 0x83, 0x3E, 0xF7, 0xAB, + 0x35, 0x8C, 0x7A, 0x33, 0x34, 0xC3, 0x1B, 0xDA, 0xF1, 0x6C, 0xFD, 0x77, + 0x3D, 0x8F, 0x77, 0x31, 0x59, 0x80, 0x3B, 0x04, 0xEF, 0x34, 0x48, 0x37, + 0xD0, 0x1A, 0x22, 0x4C, 0x34, 0xAD, 0xAE, 0xD7, 0x7B, 0xE5, 0x04, 0x91, + 0x0D, 0x1C, 0x84, 0x11, 0x40, 0xB9, 0xB0, 0x5B, 0x88, 0xBC, 0xD1, 0x81, + 0xB1, 0x1F, 0xBB, 0x2F, 0xE8, 0x10, 0x49, 0x03, 0x85, 0xB0, 0x95, 0x4E, + 0x4E, 0x00, 0xB7, 0x3D, 0xCC, 0x64, 0x36, 0x44, 0x03, 0x33, 0x90, 0x7A, + 0x33, 0x4C, 0x83, 0x36, 0xA0, 0xC3, 0x3B, 0xDC, 0x83, 0x7C, 0xFB, 0x04, + 0x63, 0x73, 0xBB, 0xB7, 0xCB, 0x23, 0xF4, 0x81, 0xF9, 0xB8, 0x37, 0x83, + 0x4A, 0x14, 0x80, 0x29, 0x91, 0x35, 0x2B, 0xA0, 0x3B, 0xBD, 0xF5, 0x31, + 0xDE, 0xEE, 0x2D, 0x3F, 0xC3, 0xFB, 0x6D, 0x62, 0x87, 0x2A, 0x04, 0xD6, + 0x60, 0xD9, 0xBB, 0xCC, 0x37, 0x8E, 0xBD, 0xAC, 0x68, 0x11, 0x04, 0xBB, + 0xB0, 0x23, 0x35, 0x0A, 0xB8, 0xD7, 0x0C, 0x08, 0xFC, 0x62, 0x54, 0xF1, + 0x05, 0x34, 0x76, 0x4F, 0x04, 0x51, 0x34, 0xAC, 0x43, 0x28, 0x77, 0xBA, + 0x5F, 0x36, 0x3C, 0xC4, 0x8F, 0x7B, 0x34, 0x44, 0x03, 0x39, 0xA0, 0x83, + 0x3B, 0xE0, 0x03, 0xB6, 0xEB, 0x04, 0x3F, 0x98, 0x39, 0x9A, 0xAF, 0x03, + 0xC7, 0xD7, 0x64, 0x34, 0x70, 0xC3, 0xB8, 0x6B, 0x41, 0x80, 0xE6, 0x66, + 0xC9, 0x27, 0xAB, 0x5D, 0x52, 0x6E, 0x1F, 0x04, 0xC0, 0x02, 0xB0, 0x43, + 0x47, 0x82, 0x79, 0xA5, 0x8A, 0xFE, 0x60, 0x65, 0x62, 0xF7, 0xCC, 0xBF, + 0xBD, 0xD0, 0x48, 0x17, 0x00, 0xFC, 0x48, 0x2F, 0x18, 0x7A, 0xCE, 0xFF, + 0x9B, 0x4A, 0x6C, 0xF8, 0x4A, 0xF8, 0x3C, 0x42, 0xF4, 0x02, 0x0E, 0x81, + 0x78, 0x50, 0xDC, 0x83, 0x4A, 0x70, 0xC1, 0x34, 0x9C, 0x43, 0xD4, 0xB3, + 0x13, 0xB7, 0xD3, 0x03, 0x3B, 0x9C, 0x03, 0x83, 0x3E, 0xFC, 0xB8, 0x27, + 0x43, 0xA9, 0x43, 0x43, 0x34, 0x68, 0xC3, 0x39, 0xB0, 0x43, 0x3D, 0xDC, + 0xC3, 0xD4, 0x67, 0xA3, 0x99, 0xD7, 0xC3, 0xD5, 0xDF, 0x37, 0x39, 0xBC, + 0x27, 0x35, 0x44, 0xC3, 0xC7, 0x27, 0xC1, 0xB9, 0x18, 0xCD, 0x2C, 0xA4, + 0x23, 0x1A, 0x02, 0x38, 0x1F, 0xCF, 0x8A, 0x16, 0xD0, 0x03, 0xAC, 0xAB, + 0x3D, 0x4E, 0x57, 0xA0, 0x7D, 0xCE, 0x3B, 0xDC, 0xD7, 0x7E, 0xCD, 0xE8, + 0x98, 0xF1, 0xD5, 0x3D, 0x49, 0xDC, 0xFD, 0xBF, 0x65, 0xA9, 0x6C, 0xF3, + 0x7D, 0xBB, 0xD2, 0x7E, 0x50, 0x7C, 0x47, 0x13, 0xC4, 0x78, 0x36, 0xA4, + 0xC3, 0x3A, 0xB4, 0x03, 0xDA, 0x33, 0xBE, 0x36, 0xB0, 0x39, 0x34, 0x4C, + 0x3B, 0x51, 0x2A, 0x00, 0x16, 0x5C, 0x7A, 0x36, 0x94, 0x03, 0x3A, 0xB4, + 0x03, 0x3D, 0xE0, 0x83, 0x3E, 0x54, 0x3D, 0xF7, 0xEB, 0xC3, 0x3D, 0x24, + 0xFE, 0xC6, 0x33, 0x7E, 0xC0, 0x5A, 0x43, 0xE8, 0x43, 0xFC, 0x31, 0xA8, + 0x84, 0x55, 0xFD, 0xDE, 0xE9, 0xBB, 0xF4, 0xEE, 0xEA, 0xDC, 0xDD, 0x2E, + 0x80, 0xF2, 0xFF, 0xA5, 0xAC, 0x1B, 0x43, 0xEC, 0xE7, 0x79, 0x59, 0xB8, + 0xDC, 0x7A, 0xDB, 0xBE, 0xFE, 0x93, 0x8B, 0x8E, 0xD5, 0x40, 0x42, 0x14, + 0x01, 0x40, 0x00, 0x01, 0x92, 0x83, 0x60, 0x41, 0x83, 0x07, 0x09, 0x22, + 0x00, 0xB0, 0xD0, 0x87, 0x2F, 0x87, 0x0F, 0x21, 0x46, 0x8C, 0x78, 0x63, + 0xE1, 0xC2, 0x2B, 0xFD, 0x30, 0x66, 0xD4, 0xB8, 0xFE, 0x11, 0x63, 0x31, + 0x00, 0x04, 0x96, 0x41, 0x83, 0x56, 0x2D, 0x9B, 0xB6, 0x72, 0xE5, 0xB2, + 0x59, 0x8B, 0x16, 0x8D, 0x99, 0xC8, 0x2D, 0x09, 0x2A, 0x02, 0xC0, 0x70, + 0x0C, 0x5A, 0xB4, 0x6A, 0xDB, 0xCA, 0xA1, 0x6B, 0xF7, 0xAE, 0x9E, 0x3D, + 0x7C, 0xF6, 0xEA, 0xD5, 0xA3, 0xE7, 0xCE, 0xDD, 0x3A, 0x75, 0xE8, 0xCE, + 0x95, 0x23, 0x97, 0x92, 0x9A, 0x48, 0x68, 0xCD, 0x9C, 0xED, 0x58, 0xA8, + 0x67, 0xD6, 0x2C, 0x59, 0xB1, 0x62, 0xB1, 0x5A, 0x45, 0x88, 0x50, 0x20, + 0x3B, 0x73, 0xEA, 0xD4, 0x09, 0xF4, 0x66, 0x21, 0xB4, 0x77, 0xEA, 0xC8, + 0x5D, 0x8B, 0xB6, 0xCC, 0x18, 0x16, 0x99, 0x0B, 0x19, 0x08, 0x92, 0x25, + 0xAB, 0x44, 0xC5, 0x04, 0xEC, 0x38, 0xE6, 0xD5, 0xBB, 0x97, 0x6F, 0x5F, + 0xBF, 0x7F, 0x01, 0x07, 0x16, 0x3C, 0x98, 0x70, 0x61, 0xC3, 0x87, 0x11, + 0x27, 0x56, 0xBC, 0x98, 0x71, 0x63, 0xC7, 0x8F, 0x21, 0x03, 0xD6, 0xB0, + 0xB0, 0x87, 0xAF, 0x5E, 0x45, 0x04, 0x22, 0xD4, 0x5C, 0xB0, 0x86, 0xC2, + 0x85, 0x12, 0x41, 0x87, 0xF6, 0x35, 0x21, 0xE6, 0xC5, 0xC0, 0xFB, 0x60, + 0x5E, 0x08, 0x59, 0x33, 0xDA, 0xB4, 0x95, 0x4F, 0x9B, 0x41, 0xC3, 0x82, + 0x61, 0xE1, 0x92, 0x6B, 0xD7, 0x92, 0x2C, 0x74, 0xA2, 0x2C, 0x9A, 0x34, + 0x6B, 0xD9, 0xCA, 0x9D, 0x43, 0xA7, 0x6E, 0x5D, 0xBB, 0x76, 0xEB, 0x8C, + 0xAA, 0x4B, 0x67, 0x8E, 0xDC, 0xD2, 0x6C, 0xD5, 0x5C, 0x8B, 0x0C, 0xC9, + 0x65, 0xA1, 0x88, 0xB9, 0x57, 0x5B, 0xB1, 0xE2, 0x4A, 0x08, 0x4F, 0x9D, + 0x3B, 0x60, 0xC7, 0xC2, 0x7C, 0x52, 0xAF, 0xDD, 0xB9, 0x6D, 0x4D, 0x93, + 0xB5, 0x45, 0x30, 0xCC, 0x33, 0x00, 0x07, 0x0C, 0x62, 0x5E, 0x8B, 0x3C, + 0x9F, 0x7E, 0x7D, 0xFB, 0xF7, 0xF1, 0xE7, 0xD7, 0xBF, 0x9F, 0x7F, 0xFE, + 0xFF, 0xC6, 0x15, 0x2B, 0xEB, 0x65, 0x17, 0x21, 0x06, 0xDA, 0x6C, 0xB3, + 0x8A, 0x10, 0x10, 0x4D, 0xC1, 0x87, 0x7E, 0x89, 0xA0, 0x34, 0xC1, 0x88, + 0x59, 0xE8, 0x02, 0x62, 0x60, 0x6B, 0xC6, 0xC2, 0x66, 0x8E, 0x79, 0x02, + 0x26, 0x00, 0x96, 0x28, 0x47, 0xA3, 0x64, 0x16, 0x3A, 0xC0, 0x8A, 0xD8, + 0x7C, 0xBB, 0x66, 0x1B, 0x72, 0x4E, 0x3A, 0x29, 0x29, 0xA5, 0x96, 0xBA, + 0xC6, 0x9A, 0x6A, 0xA2, 0x71, 0xAA, 0x25, 0x62, 0x08, 0x00, 0x60, 0x00, + 0xB9, 0xB0, 0xD2, 0x8A, 0xAB, 0xEE, 0xEA, 0xA0, 0xA3, 0x0E, 0x3B, 0x02, + 0x71, 0x63, 0xA1, 0x27, 0xF0, 0x71, 0x47, 0x1D, 0x94, 0xD0, 0x6B, 0x6B, + 0x03, 0x63, 0xAC, 0x38, 0x20, 0xA6, 0x85, 0x12, 0x30, 0xC7, 0xBF, 0x29, + 0xA9, 0xAC, 0xD2, 0xCA, 0x2B, 0xB1, 0xCC, 0x52, 0x4B, 0xFF, 0x00, 0xB4, + 0x0C, 0x33, 0x03, 0x37, 0xA3, 0xA1, 0x22, 0x09, 0x16, 0x2C, 0x53, 0x17, + 0x07, 0x2B, 0x32, 0x0D, 0xB0, 0xDC, 0x16, 0xB2, 0xC0, 0x09, 0x2C, 0xB8, + 0x70, 0x62, 0x07, 0x08, 0x2A, 0xBA, 0xC0, 0x43, 0x8E, 0xD6, 0xB9, 0xA0, + 0xCD, 0x2D, 0x62, 0x83, 0x66, 0x1A, 0x6A, 0xAC, 0xB9, 0x0D, 0x9B, 0x6C, + 0xB2, 0x71, 0xF1, 0x45, 0xD7, 0x62, 0x6C, 0xA9, 0xA5, 0x61, 0x9C, 0x04, + 0x40, 0x0F, 0xEC, 0xB6, 0xB3, 0xA3, 0x8E, 0x39, 0xC0, 0xBA, 0x63, 0x2C, + 0x07, 0x86, 0xB4, 0x87, 0x1E, 0x76, 0xD2, 0x21, 0x07, 0x9B, 0xA6, 0x90, + 0x69, 0xCB, 0x09, 0x63, 0x8C, 0x79, 0xE2, 0xC9, 0x25, 0xDE, 0xD9, 0x52, + 0xD5, 0x55, 0x59, 0x6D, 0xD5, 0xD5, 0x57, 0x61, 0x4D, 0xAC, 0x4B, 0x01, + 0x83, 0x00, 0x53, 0xB3, 0x19, 0x2A, 0xB2, 0xA1, 0x4C, 0x33, 0x0D, 0x78, + 0x10, 0xB0, 0x7B, 0x36, 0x78, 0xF2, 0xC9, 0x0B, 0xA2, 0xE1, 0x6B, 0x1F, + 0x27, 0x00, 0xFE, 0x08, 0x40, 0xA6, 0x2D, 0x9E, 0x62, 0xAD, 0xB5, 0x95, + 0xA6, 0xA9, 0xC9, 0x29, 0x68, 0x14, 0x95, 0xAD, 0x51, 0x3D, 0x5C, 0xD1, + 0xCE, 0x2B, 0x49, 0xBF, 0xB3, 0x03, 0x0F, 0x42, 0xDE, 0xC0, 0x14, 0x80, + 0x05, 0x8E, 0xC1, 0x87, 0x9E, 0x76, 0xD4, 0x31, 0x47, 0x1B, 0x95, 0x96, + 0x09, 0x15, 0x0B, 0x2C, 0x8C, 0x21, 0x66, 0x43, 0x00, 0xB6, 0x50, 0x27, + 0xD6, 0x7B, 0xF1, 0xCD, 0x57, 0xDF, 0x7D, 0xF9, 0x75, 0xAC, 0x4B, 0x5F, + 0x8C, 0xA8, 0xD5, 0xD6, 0x83, 0x2A, 0x50, 0x16, 0x00, 0x1E, 0x76, 0x2D, + 0xD3, 0x87, 0x5E, 0x2B, 0xB2, 0x42, 0x9F, 0xC0, 0x84, 0x05, 0x20, 0x81, + 0x2B, 0xEE, 0xF4, 0xEB, 0x9A, 0x79, 0x31, 0xE0, 0x33, 0xB6, 0xD8, 0x96, + 0x09, 0xE9, 0xC2, 0xD8, 0x5A, 0x82, 0xE6, 0x18, 0xDA, 0x16, 0x72, 0x83, + 0x3B, 0x49, 0x7F, 0x04, 0x92, 0x8E, 0x37, 0x5E, 0x20, 0xC1, 0x49, 0x65, + 0x9F, 0x50, 0xC7, 0xDC, 0xA2, 0xCE, 0x49, 0x8B, 0x9A, 0xB5, 0x48, 0xCD, + 0x39, 0x83, 0x8A, 0x96, 0xE8, 0xD7, 0xE7, 0x9F, 0x81, 0x0E, 0x5A, 0xE8, + 0x55, 0xFF, 0x0D, 0x78, 0xE0, 0x83, 0xDA, 0x6B, 0x28, 0xE1, 0x05, 0x17, + 0x8E, 0x49, 0x83, 0x87, 0xFF, 0x82, 0xB2, 0x98, 0x62, 0x92, 0xA9, 0xF8, + 0x34, 0x64, 0x2B, 0x52, 0xE0, 0x89, 0x64, 0xA0, 0x59, 0x4D, 0xA4, 0x0B, + 0xA1, 0x49, 0xC6, 0x0A, 0x92, 0xE1, 0x72, 0xC0, 0x81, 0x11, 0x46, 0x38, + 0xDB, 0x81, 0x02, 0x92, 0x8D, 0xE9, 0x02, 0x2C, 0xD8, 0xB9, 0xC7, 0x9E, + 0x77, 0x8E, 0x43, 0xA7, 0x39, 0x6B, 0x92, 0xCC, 0x39, 0x8B, 0xF8, 0x86, + 0xEE, 0xDB, 0xEF, 0xBF, 0x01, 0x0F, 0x7C, 0x30, 0x73, 0x8A, 0x0E, 0xA2, + 0xC0, 0xA3, 0x73, 0x30, 0x18, 0x80, 0xA5, 0x77, 0x6D, 0xBA, 0x22, 0x0D, + 0xE8, 0xF1, 0xAB, 0x9C, 0xDA, 0xFE, 0x14, 0x23, 0x67, 0x89, 0x27, 0x37, + 0xB0, 0x62, 0x18, 0xE8, 0xA2, 0xD9, 0x02, 0x0B, 0x27, 0xC8, 0x96, 0x98, + 0x98, 0x75, 0xAE, 0x29, 0xE6, 0x8A, 0x24, 0x26, 0x5B, 0x48, 0x59, 0x0D, + 0x92, 0xC0, 0xE2, 0x18, 0x73, 0xEE, 0xB9, 0xC7, 0x5C, 0xBA, 0xD7, 0x41, + 0x87, 0x39, 0x17, 0x63, 0x4C, 0x4F, 0xE7, 0x3A, 0x05, 0xEF, 0xDD, 0xF7, + 0xDF, 0x81, 0xE7, 0x97, 0x9C, 0x59, 0x03, 0x3E, 0x7C, 0xE0, 0x1A, 0x2A, + 0xAA, 0x40, 0xA2, 0x5E, 0x18, 0x97, 0xC8, 0x71, 0x28, 0xED, 0xE5, 0x6B, + 0x72, 0x0E, 0x19, 0x33, 0x07, 0xEB, 0x88, 0x85, 0xD5, 0x20, 0x99, 0x7D, + 0xFA, 0xE2, 0x47, 0x9F, 0xD8, 0xF1, 0xC1, 0x47, 0xA8, 0x77, 0x68, 0x57, + 0xAE, 0x39, 0xDC, 0xDB, 0x25, 0x15, 0x19, 0xEA, 0x2A, 0x92, 0x26, 0xF8, + 0xF7, 0xE1, 0x8F, 0x5F, 0x7E, 0xFE, 0x86, 0xA7, 0xCC, 0xB2, 0xE2, 0x11, + 0xCF, 0x01, 0xD7, 0x85, 0x66, 0x90, 0x88, 0x97, 0xE6, 0x9D, 0xC7, 0xB0, + 0x8A, 0x14, 0x6B, 0x2F, 0xF5, 0x53, 0xD3, 0x62, 0xE8, 0x21, 0x0D, 0x27, + 0xCC, 0xCB, 0x69, 0x57, 0x50, 0x86, 0x3D, 0x00, 0xE3, 0x3D, 0xD9, 0xD1, + 0x83, 0x82, 0x43, 0x61, 0xC7, 0x51, 0x92, 0xB2, 0x8D, 0x94, 0xC4, 0x28, + 0x7D, 0xC6, 0x40, 0xC6, 0xF5, 0x12, 0xC0, 0xBD, 0xF9, 0x8D, 0x90, 0x84, + 0x25, 0x34, 0x61, 0x60, 0xEA, 0x07, 0x80, 0xCA, 0xF8, 0xA2, 0x08, 0x42, + 0xC8, 0x5F, 0x0E, 0x28, 0x50, 0x91, 0x1B, 0x48, 0xA4, 0x08, 0x00, 0x04, + 0x0D, 0x9A, 0xD2, 0x74, 0x0F, 0xBD, 0x78, 0x04, 0x00, 0xC5, 0xA0, 0xCF, + 0x49, 0x98, 0x53, 0x18, 0x7F, 0x78, 0x4F, 0x7C, 0x43, 0x39, 0x8E, 0x51, + 0x90, 0xA2, 0x14, 0x6C, 0xBC, 0x88, 0x83, 0x39, 0x33, 0x86, 0x9E, 0x2C, + 0x72, 0x42, 0x29, 0x4E, 0x91, 0x8A, 0x23, 0x54, 0xFE, 0x47, 0xD1, 0x08, + 0x94, 0xBF, 0xF6, 0xE8, 0x42, 0x22, 0x42, 0xE0, 0xA2, 0x0D, 0x21, 0xA2, + 0x0B, 0xD2, 0x38, 0x2D, 0x7A, 0x1B, 0xE1, 0xA1, 0x0F, 0x5B, 0xE5, 0x0F, + 0x7D, 0xFC, 0x64, 0x28, 0x48, 0x5C, 0x4E, 0x73, 0xB4, 0xE1, 0xA2, 0x68, + 0x85, 0xCD, 0x89, 0x31, 0x29, 0x63, 0x15, 0xF1, 0x98, 0x47, 0x3D, 0x0A, + 0x6D, 0x56, 0xBB, 0x30, 0x5C, 0xFE, 0x2A, 0x12, 0x00, 0xD0, 0x04, 0xE1, + 0x8B, 0x60, 0x64, 0x10, 0x0E, 0x84, 0x95, 0x0C, 0x8E, 0xA4, 0x62, 0x21, + 0x68, 0x64, 0x15, 0x11, 0x85, 0x52, 0xB7, 0xA4, 0x34, 0xC7, 0x53, 0xD6, + 0x50, 0x49, 0xD7, 0x74, 0x67, 0x8C, 0x2D, 0xF0, 0x6E, 0x8F, 0x9D, 0xF4, + 0xE4, 0x27, 0x61, 0x45, 0x3C, 0x22, 0xF0, 0x00, 0x71, 0xC8, 0x5B, 0xC8, + 0x04, 0x40, 0x03, 0x84, 0x20, 0x30, 0xCF, 0x90, 0x10, 0xD9, 0x45, 0x05, + 0x04, 0x08, 0x80, 0x24, 0xDC, 0xF1, 0x8C, 0xAE, 0xE2, 0x07, 0x3F, 0x8A, + 0x78, 0x1C, 0x75, 0xD4, 0xCC, 0x39, 0x96, 0xBC, 0x59, 0xD7, 0x90, 0x41, + 0x0C, 0x62, 0x2C, 0xA3, 0x0A, 0x69, 0x02, 0xE5, 0x31, 0x91, 0x99, 0xCC, + 0x29, 0xE5, 0xCA, 0x21, 0x03, 0xCA, 0x5F, 0x0C, 0x17, 0x82, 0x83, 0xE5, + 0x01, 0x61, 0x17, 0xAD, 0x5C, 0x9E, 0x98, 0x9E, 0x54, 0x0C, 0xA8, 0x5D, + 0xA1, 0x91, 0x69, 0xE4, 0xC7, 0x3E, 0x72, 0xB9, 0x8E, 0x74, 0xD4, 0x4C, + 0x1B, 0x29, 0xB1, 0xC6, 0x34, 0xA2, 0xC5, 0x8C, 0x76, 0xAD, 0xB3, 0x09, + 0x0C, 0x73, 0xA4, 0x32, 0xE1, 0x19, 0x4F, 0x79, 0x2E, 0x86, 0x99, 0x02, + 0xCA, 0xE2, 0xD1, 0x2A, 0x50, 0x11, 0xA5, 0x41, 0xA4, 0x17, 0x39, 0x58, + 0xA5, 0x35, 0x25, 0xA2, 0x0B, 0x09, 0x3C, 0x29, 0x01, 0xEE, 0xBB, 0x5C, + 0x0F, 0x6D, 0xB9, 0x8F, 0x09, 0x16, 0x65, 0x97, 0xCD, 0x29, 0x14, 0xFE, + 0x35, 0xA2, 0xD3, 0x31, 0x64, 0x2C, 0x43, 0x98, 0x4D, 0x68, 0xDF, 0x3C, + 0x31, 0x9A, 0x51, 0x8D, 0xFA, 0x25, 0x57, 0x5C, 0xDC, 0x05, 0x11, 0x8C, + 0x07, 0xA6, 0x8A, 0x18, 0x00, 0x34, 0xBC, 0xF0, 0x27, 0x2B, 0x01, 0x1A, + 0x91, 0x1E, 0x8C, 0xB1, 0x4E, 0x50, 0x7C, 0xA7, 0xAA, 0xBE, 0x59, 0x44, + 0x77, 0x5C, 0x90, 0x39, 0x4B, 0xC1, 0x9B, 0x6B, 0xD4, 0x99, 0x8C, 0x60, + 0xB6, 0x0B, 0x8A, 0x00, 0x20, 0xC7, 0x46, 0x81, 0x1A, 0x54, 0x8D, 0x1E, + 0x54, 0x57, 0xBE, 0xF8, 0xA8, 0xC0, 0x6C, 0x65, 0x4A, 0x00, 0xA0, 0x32, + 0x22, 0xBC, 0xD8, 0x45, 0x0E, 0x80, 0x80, 0xD2, 0x94, 0x46, 0x44, 0x17, + 0x35, 0xC0, 0x61, 0x45, 0x5E, 0xBA, 0xA5, 0x5B, 0x86, 0xAF, 0x8D, 0xE6, + 0x2B, 0xE7, 0x4D, 0xA5, 0x13, 0xAA, 0x9C, 0x91, 0xED, 0xA7, 0x42, 0x35, + 0xEB, 0x59, 0x8F, 0x79, 0x50, 0xA6, 0x7E, 0x34, 0xA4, 0x9A, 0xA9, 0x01, + 0x34, 0x0F, 0xE6, 0xBF, 0xA7, 0x46, 0x75, 0xAA, 0x0B, 0xEA, 0x81, 0x0D, + 0x3C, 0x93, 0x55, 0x2D, 0xC5, 0x54, 0x28, 0x33, 0x45, 0x47, 0xA7, 0x6C, + 0x0A, 0x51, 0x96, 0xB0, 0xC5, 0x89, 0x3D, 0x2D, 0x2B, 0x5A, 0x11, 0x9B, + 0x58, 0x2A, 0x1E, 0x94, 0x4C, 0xBE, 0xE0, 0x05, 0x11, 0x90, 0x0A, 0x26, + 0x1C, 0x16, 0xD2, 0x95, 0xAA, 0xFC, 0x5F, 0x5D, 0x17, 0x34, 0x50, 0x00, + 0xA4, 0xC2, 0x96, 0xB8, 0xD4, 0x94, 0x24, 0x1D, 0x0A, 0x56, 0x75, 0x8A, + 0x95, 0x54, 0x64, 0x55, 0xEC, 0x69, 0x51, 0x3B, 0x42, 0x1E, 0x36, 0xB6, + 0x17, 0x44, 0x70, 0x61, 0x52, 0x0D, 0xC6, 0xD4, 0xA6, 0xD6, 0x2A, 0x08, + 0x97, 0xC5, 0xAC, 0x68, 0x34, 0x3B, 0x0C, 0x57, 0x0D, 0x71, 0xA1, 0x46, + 0xE1, 0xE5, 0x43, 0xD3, 0xB9, 0x8C, 0x4C, 0x3E, 0x91, 0x61, 0xCA, 0x48, + 0xED, 0x71, 0xFE, 0x91, 0xEB, 0x3B, 0x1E, 0x2E, 0xCE, 0xB1, 0xF8, 0x03, + 0x13, 0x5C, 0x79, 0x40, 0xD9, 0x66, 0x12, 0x84, 0x9A, 0x52, 0xBD, 0x6D, + 0x44, 0x34, 0xBB, 0x83, 0xDD, 0x2A, 0x54, 0x7C, 0x33, 0x6D, 0xA8, 0x4D, + 0x61, 0x24, 0x1D, 0x27, 0x1A, 0x23, 0x75, 0x08, 0x4D, 0xEE, 0x79, 0xD1, + 0x1B, 0xB4, 0x6B, 0x54, 0xC4, 0x21, 0xBD, 0x30, 0xC2, 0x6B, 0x25, 0x5B, + 0x11, 0xE9, 0x4E, 0xD7, 0x9F, 0xBC, 0xB0, 0xEE, 0x75, 0x1F, 0xA2, 0xD9, + 0x24, 0x6C, 0x57, 0x76, 0xF5, 0x28, 0x0A, 0x52, 0x42, 0xAB, 0x12, 0x0E, + 0x0E, 0xD7, 0xA2, 0xDD, 0x4C, 0xEF, 0x81, 0x11, 0x8C, 0x2F, 0xC2, 0x31, + 0xA4, 0x99, 0x20, 0x05, 0x93, 0x52, 0x65, 0x1B, 0x91, 0x3F, 0xD6, 0x16, + 0xBF, 0xA1, 0x41, 0x53, 0xCF, 0x5A, 0x75, 0xCB, 0x09, 0xD2, 0xCD, 0x7C, + 0xE0, 0x9D, 0x23, 0x61, 0x73, 0x56, 0x60, 0x00, 0x38, 0x21, 0xC1, 0x25, + 0x36, 0x31, 0xAB, 0xFE, 0xC5, 0xD6, 0xE7, 0x56, 0x04, 0x61, 0x12, 0xD9, + 0x45, 0x81, 0x84, 0xB0, 0x8B, 0x5E, 0xDC, 0x17, 0xBF, 0x9A, 0xBD, 0xC0, + 0xAB, 0xB8, 0xDB, 0xD5, 0x74, 0xB0, 0xC8, 0x92, 0x1F, 0x1E, 0xAE, 0xA9, + 0x28, 0x77, 0x62, 0x21, 0x0F, 0x99, 0x4A, 0x0B, 0x58, 0x48, 0x51, 0x79, + 0x51, 0x84, 0xC8, 0x22, 0xC4, 0x33, 0x09, 0x02, 0x0D, 0x11, 0x0A, 0x22, + 0x04, 0xFB, 0xD2, 0xF8, 0xBA, 0x9A, 0x05, 0x40, 0x67, 0xC1, 0x19, 0xC9, + 0xA3, 0x28, 0x25, 0x8E, 0xD0, 0x09, 0xAB, 0x13, 0xDD, 0x02, 0x25, 0x22, + 0x8F, 0x99, 0xCC, 0xF8, 0x29, 0x30, 0x53, 0x2F, 0xB3, 0x64, 0x83, 0x60, + 0x13, 0x00, 0x45, 0x8D, 0x88, 0x1F, 0x0B, 0x42, 0x04, 0x5E, 0xD8, 0xB7, + 0xC2, 0xD8, 0xAD, 0xC8, 0xAB, 0xF8, 0x7A, 0x2E, 0xE5, 0xF0, 0xD2, 0x45, + 0x4D, 0xC1, 0xA4, 0x13, 0x37, 0xFE, 0x59, 0x11, 0xA8, 0x95, 0x99, 0xD0, + 0x85, 0x5E, 0x4C, 0xA0, 0x23, 0xF0, 0x90, 0x01, 0xB5, 0x35, 0x21, 0x0B, + 0x31, 0x80, 0x6D, 0x21, 0x52, 0x84, 0x82, 0x00, 0xA1, 0x08, 0xBB, 0x98, + 0x33, 0x95, 0x31, 0x6B, 0x65, 0xAB, 0xC1, 0x34, 0xCB, 0x1C, 0x46, 0x87, + 0x52, 0x0A, 0x75, 0x4E, 0xE9, 0xE8, 0x4E, 0xAC, 0x31, 0x39, 0xAC, 0xA1, + 0x51, 0x9D, 0xEA, 0xC0, 0x70, 0x83, 0xBD, 0x0E, 0x79, 0x2C, 0xA3, 0xD9, + 0xEC, 0x66, 0x7E, 0xC2, 0x17, 0x08, 0x47, 0xD8, 0x85, 0xA5, 0xE7, 0x4C, + 0x67, 0xFC, 0xFE, 0xC2, 0x06, 0x15, 0xD9, 0xB4, 0x56, 0x15, 0x3A, 0x37, + 0x5D, 0xF2, 0x59, 0xD4, 0x22, 0x19, 0xAF, 0x31, 0x62, 0xE2, 0x3E, 0x55, + 0x2F, 0x9B, 0xD9, 0x7A, 0xB9, 0xA2, 0xFD, 0x9A, 0xAB, 0xE6, 0x1A, 0x30, + 0xCC, 0x00, 0xF3, 0x35, 0x2A, 0x29, 0xA9, 0x4B, 0x84, 0x5B, 0x1B, 0x01, + 0xD7, 0x90, 0xBE, 0x6D, 0xAF, 0xCB, 0x92, 0x50, 0xAE, 0xBA, 0xE3, 0x38, + 0x27, 0x21, 0x87, 0x2F, 0x07, 0x9C, 0x0C, 0x75, 0xA7, 0xA7, 0xA7, 0x5B, + 0x68, 0xF6, 0xBB, 0xE1, 0xDD, 0x8F, 0x0D, 0x49, 0xB3, 0x99, 0x42, 0xA8, + 0x81, 0x41, 0x80, 0x90, 0xCF, 0x68, 0x86, 0x06, 0xCA, 0x93, 0x2E, 0xC2, + 0xBF, 0x2B, 0xDD, 0x6D, 0x4C, 0xB7, 0x12, 0xDC, 0xE6, 0x7D, 0x24, 0x3F, + 0xE4, 0x66, 0xC4, 0x76, 0x98, 0xFB, 0xDC, 0xBF, 0xEC, 0x18, 0x31, 0x92, + 0x01, 0x71, 0x64, 0xEC, 0x6C, 0x21, 0xFB, 0x8D, 0xF7, 0xC5, 0x53, 0xAD, + 0x56, 0x88, 0x10, 0xA1, 0x06, 0x15, 0xA8, 0x01, 0x10, 0xAC, 0x9A, 0xBC, + 0xD0, 0xC0, 0x79, 0xD2, 0x44, 0xF8, 0xF7, 0xAD, 0xBB, 0x6D, 0x99, 0xEB, + 0x16, 0xFC, 0x80, 0xAB, 0x42, 0x78, 0x77, 0x17, 0x6E, 0xEE, 0x9B, 0x36, + 0xA5, 0x63, 0xC2, 0x8D, 0x17, 0x32, 0x44, 0x7C, 0xFE, 0x65, 0x8C, 0xEF, + 0x9C, 0xD0, 0x11, 0x5A, 0x48, 0x21, 0x5B, 0x1B, 0xC3, 0xAB, 0x56, 0xC0, + 0xDA, 0x2C, 0x3C, 0x9C, 0x40, 0x88, 0x60, 0xF2, 0x80, 0xE7, 0x9A, 0xE9, + 0x03, 0x6F, 0x1E, 0x0F, 0x78, 0x86, 0xE7, 0x4E, 0x1B, 0x87, 0x45, 0xCD, + 0xA1, 0x86, 0x9F, 0x1F, 0x8E, 0x8C, 0xF4, 0x00, 0x79, 0x21, 0xEB, 0xE0, + 0xF9, 0xD7, 0x89, 0xBC, 0x0E, 0x19, 0xF2, 0x73, 0x17, 0x56, 0x06, 0x40, + 0x04, 0x8A, 0xCE, 0x03, 0xF8, 0x52, 0x57, 0x08, 0x49, 0x3F, 0x79, 0x11, + 0xB8, 0x2D, 0x70, 0x95, 0x03, 0xB4, 0x07, 0x76, 0x91, 0xFA, 0x4F, 0x68, + 0x27, 0xF3, 0x73, 0x3A, 0x1C, 0x19, 0xA1, 0xD2, 0x69, 0x98, 0x17, 0xA2, + 0x6C, 0xB0, 0x0F, 0xBE, 0xC4, 0x1B, 0x8A, 0xF0, 0x43, 0x56, 0x3A, 0x81, + 0x16, 0x83, 0xA6, 0x07, 0x06, 0x58, 0x72, 0x10, 0x92, 0x1E, 0xF9, 0x7F, + 0x1B, 0x21, 0xEE, 0xB9, 0x9E, 0xB1, 0xD3, 0x77, 0x55, 0xF7, 0x3B, 0x77, + 0x16, 0xEF, 0xC7, 0x59, 0x38, 0x25, 0xD1, 0x39, 0x58, 0xDD, 0x11, 0x23, + 0x98, 0x31, 0x71, 0x37, 0xE1, 0x51, 0x7F, 0x60, 0x6E, 0xFE, 0xDC, 0x86, + 0xF9, 0xBC, 0xB7, 0x41, 0x82, 0x20, 0x04, 0xC8, 0xBB, 0x1D, 0xE0, 0x94, + 0xBF, 0xB5, 0xE5, 0x2F, 0x6F, 0x48, 0x5D, 0xC4, 0xE4, 0xD7, 0x7B, 0x05, + 0xE7, 0x67, 0xCB, 0x4D, 0xC9, 0xAB, 0x0F, 0x78, 0xBC, 0x35, 0x5A, 0x88, + 0x06, 0x52, 0x9F, 0xFC, 0xF3, 0xAE, 0x77, 0x21, 0x34, 0x00, 0x20, 0xD4, + 0x01, 0x40, 0x03, 0x7C, 0xAB, 0x32, 0x08, 0x90, 0x6F, 0x7B, 0xED, 0x29, + 0x6F, 0x84, 0xA6, 0xCF, 0xB8, 0x95, 0x7C, 0xCB, 0xF0, 0xCB, 0xC9, 0x43, + 0xF5, 0xBB, 0x91, 0xC3, 0xE1, 0x3A, 0xF5, 0x20, 0xA9, 0x7A, 0xAA, 0x73, + 0xE5, 0xAF, 0x1F, 0xB5, 0x50, 0x0C, 0x40, 0xD1, 0x43, 0xA3, 0x0B, 0xFE, + 0xCF, 0x20, 0x44, 0x20, 0xB1, 0x8F, 0xBC, 0xE4, 0x4F, 0x8E, 0xF2, 0xDB, + 0x4F, 0x19, 0xF3, 0xA0, 0x89, 0x89, 0x5E, 0xB3, 0x44, 0xC3, 0x60, 0x6E, + 0x1D, 0x52, 0xA4, 0xE1, 0x9A, 0x42, 0x9D, 0xC6, 0x8B, 0x4D, 0x16, 0xE2, + 0xD4, 0xD8, 0xAF, 0x01, 0xCD, 0x2A, 0xD0, 0x96, 0x8A, 0x71, 0xC6, 0xE8, + 0x00, 0xE8, 0xAF, 0xFE, 0xAA, 0x4F, 0x08, 0xDA, 0xCE, 0xE4, 0xDC, 0x6E, + 0x17, 0x8E, 0x20, 0xE0, 0x70, 0x2D, 0xF7, 0x9A, 0xC7, 0xCA, 0x48, 0xCC, + 0x9B, 0x62, 0xC7, 0xBF, 0x74, 0xC9, 0xDC, 0x70, 0x67, 0xB0, 0x48, 0xAB, + 0x54, 0x62, 0x42, 0xB7, 0x1C, 0xF0, 0x05, 0x85, 0x8A, 0x1E, 0x62, 0x62, + 0x86, 0x76, 0xE5, 0x06, 0x0C, 0x66, 0x06, 0x34, 0xC3, 0x02, 0xAB, 0xCF, + 0xFE, 0xEE, 0x2F, 0xFF, 0xF6, 0x0F, 0xF7, 0x18, 0xC7, 0xCA, 0x90, 0x2F, + 0xA1, 0xEE, 0x21, 0x92, 0x08, 0x90, 0xC7, 0xF0, 0xE6, 0xCB, 0x72, 0x06, + 0xF0, 0xA8, 0x07, 0x06, 0x9D, 0x70, 0xA3, 0x56, 0x6F, 0x21, 0x16, 0x4F, + 0x34, 0xA0, 0x0F, 0x00, 0x0C, 0xC0, 0x40, 0x04, 0x82, 0xFA, 0x2E, 0x30, + 0x03, 0x95, 0x4E, 0xE9, 0x50, 0x0E, 0xF7, 0xFA, 0xCF, 0x21, 0xF6, 0x67, + 0x21, 0xF0, 0xEC, 0x9B, 0x8C, 0xF0, 0x48, 0xCE, 0x07, 0x6F, 0x38, 0x28, + 0x54, 0x48, 0xEB, 0x49, 0x9E, 0xF0, 0x0D, 0x31, 0xCA, 0x1E, 0x9E, 0xC4, + 0x06, 0x8A, 0xAE, 0x17, 0xC6, 0x10, 0x00, 0x28, 0xC0, 0x56, 0x74, 0x30, + 0xF6, 0x30, 0xF0, 0xFE, 0x36, 0x50, 0xFF, 0x2C, 0x8D, 0xFB, 0x76, 0xA5, + 0xE0, 0x7C, 0x0A, 0xC7, 0xFA, 0xCB, 0xBB, 0x0A, 0xF0, 0x1A, 0x7E, 0x29, + 0x6C, 0x56, 0xD0, 0x02, 0x4C, 0x0D, 0x0E, 0x21, 0x11, 0x9E, 0x96, 0xAB, + 0x22, 0x22, 0x20, 0xBA, 0x1E, 0x42, 0x17, 0x68, 0x40, 0x71, 0x92, 0xE5, + 0xF5, 0xC0, 0xFE, 0x24, 0x0B, 0x77, 0x90, 0x0F, 0xB9, 0x50, 0xE9, 0x3C, + 0x30, 0x10, 0x05, 0x71, 0x41, 0xAA, 0x10, 0x00, 0x08, 0xE8, 0xE0, 0x8A, + 0xD0, 0x04, 0xD5, 0x01, 0x0D, 0x6D, 0xE6, 0x66, 0x98, 0xC1, 0xFC, 0xD4, + 0xA7, 0xBC, 0x0C, 0x2E, 0x12, 0x6D, 0xF1, 0x93, 0x68, 0x31, 0x26, 0x0C, + 0xC0, 0xEC, 0x9E, 0x04, 0x01, 0xA4, 0xEF, 0x68, 0x3C, 0x71, 0x0B, 0xFD, + 0xB0, 0xF6, 0xBE, 0x90, 0x17, 0x74, 0xE1, 0x17, 0xEC, 0xCA, 0xF4, 0xF0, + 0x6C, 0x8D, 0x8C, 0x10, 0x05, 0xFB, 0x2C, 0x77, 0x56, 0xD0, 0x0A, 0x62, + 0x02, 0xC3, 0x6E, 0xB1, 0x1A, 0xF7, 0xE8, 0x1E, 0x72, 0x11, 0x7B, 0x84, + 0x25, 0x00, 0x0C, 0x20, 0x0F, 0x07, 0x66, 0x0F, 0x31, 0xB0, 0x0F, 0x45, + 0x11, 0xEE, 0xBE, 0x70, 0xEE, 0x14, 0x64, 0x1A, 0xA5, 0xAE, 0x08, 0xCF, + 0x25, 0xF8, 0xD2, 0x42, 0x0D, 0x31, 0x89, 0xB4, 0xB4, 0xC0, 0x0D, 0xAD, + 0x71, 0x1E, 0xF3, 0xE8, 0x1E, 0x0E, 0x4A, 0x1B, 0xA7, 0xF1, 0x49, 0x0C, + 0x60, 0x02, 0x38, 0x71, 0x33, 0xB2, 0x50, 0x20, 0x64, 0xCF, 0xFE, 0x32, + 0x10, 0xFB, 0x6E, 0xAF, 0x14, 0x43, 0x23, 0x96, 0x5E, 0x85, 0xB7, 0x82, + 0x82, 0x1E, 0x8C, 0xC2, 0xDC, 0x98, 0x62, 0xC0, 0x56, 0xB0, 0x51, 0x16, + 0xA2, 0xF7, 0xE8, 0xB1, 0x22, 0x49, 0x88, 0x1D, 0xB6, 0x20, 0x1B, 0xEB, + 0x64, 0x0B, 0x22, 0x47, 0x1D, 0xEE, 0x71, 0x21, 0x04, 0x80, 0x02, 0x18, + 0xED, 0x20, 0xC0, 0x31, 0x14, 0x27, 0x2F, 0xEE, 0x40, 0x30, 0x34, 0xCC, + 0xEE, 0x8E, 0x54, 0x85, 0xB7, 0xC2, 0xE9, 0xD3, 0xEE, 0xE6, 0x92, 0x18, + 0xD1, 0x89, 0x28, 0x4E, 0x37, 0x2C, 0xF2, 0x26, 0xA9, 0xE8, 0x1E, 0xCA, + 0x41, 0x19, 0x8A, 0x21, 0x15, 0xA6, 0x86, 0x1C, 0x22, 0x67, 0x23, 0xCA, + 0x21, 0x17, 0x03, 0x40, 0x24, 0xFE, 0x47, 0x72, 0xD2, 0xB4, 0x50, 0x20, + 0x69, 0xAF, 0xF2, 0x2E, 0x0F, 0x19, 0x41, 0xE3, 0x0E, 0x8D, 0xCB, 0x96, + 0x98, 0xF1, 0x5C, 0xC4, 0x09, 0x05, 0x05, 0x0C, 0x98, 0x9C, 0xE8, 0x7A, + 0xA2, 0x08, 0x27, 0xB9, 0x12, 0x99, 0xA4, 0x21, 0xFD, 0x92, 0xC5, 0x28, + 0x3B, 0x11, 0x1C, 0xF1, 0x0F, 0x25, 0xE1, 0xCF, 0x17, 0x08, 0xB1, 0xE5, + 0x38, 0x2D, 0x9C, 0x94, 0x03, 0xD4, 0x14, 0x91, 0xF8, 0x72, 0x06, 0x02, + 0x2B, 0xC2, 0x09, 0x74, 0xA8, 0x2B, 0xED, 0xB2, 0x93, 0xEE, 0xA1, 0x18, + 0x18, 0x28, 0x2C, 0x33, 0x03, 0x0B, 0xB5, 0x30, 0x1C, 0x97, 0xB2, 0x20, + 0x45, 0x43, 0xF3, 0x24, 0xA4, 0x0C, 0x57, 0x51, 0xCF, 0xD0, 0xF0, 0x19, + 0xD7, 0x62, 0xB8, 0x8C, 0x41, 0x22, 0x1F, 0x67, 0xD0, 0xEE, 0x32, 0x32, + 0xAB, 0x88, 0x1E, 0xB4, 0x52, 0x75, 0xC4, 0xD2, 0x1F, 0x2D, 0x10, 0x30, + 0xDD, 0x8E, 0xDB, 0x74, 0x2D, 0x34, 0x9E, 0x04, 0x32, 0x5D, 0xAE, 0xBF, + 0xA8, 0x12, 0x26, 0x43, 0xED, 0x97, 0x64, 0x91, 0x54, 0x6A, 0x92, 0x8C, + 0x24, 0x73, 0x35, 0xAB, 0xC8, 0x1C, 0xB2, 0x31, 0x00, 0x66, 0x40, 0xCD, + 0xA6, 0x6F, 0x07, 0x07, 0x32, 0xFF, 0x0C, 0x32, 0x22, 0x1C, 0x13, 0x1B, + 0x76, 0x0B, 0xFC, 0xF4, 0x6C, 0xC7, 0xD2, 0xB0, 0xFC, 0x72, 0xE6, 0x83, + 0xB0, 0x27, 0x01, 0x28, 0x92, 0x35, 0x8D, 0x33, 0x7E, 0x94, 0x61, 0x2F, + 0xAD, 0xF0, 0xE3, 0xFC, 0x92, 0xFA, 0xFA, 0xD0, 0x36, 0x31, 0x8D, 0xA5, + 0xE8, 0x25, 0x21, 0x11, 0x4E, 0x28, 0x18, 0xB2, 0xC3, 0x9E, 0x51, 0x24, + 0x86, 0x8B, 0x7D, 0x28, 0x31, 0x26, 0xA2, 0xF2, 0x38, 0xC1, 0x73, 0x7E, + 0xEE, 0xA1, 0x32, 0x17, 0xA2, 0x02, 0x70, 0x60, 0x24, 0x83, 0xB1, 0x36, + 0x71, 0x4D, 0x34, 0x10, 0xE9, 0x71, 0x0C, 0x73, 0xFE, 0x21, 0x8F, 0xC3, + 0x37, 0xDB, 0x31, 0x46, 0x80, 0x89, 0xB4, 0xAE, 0xCA, 0x06, 0xAE, 0xEA, + 0x0A, 0xEA, 0x32, 0x3C, 0xF9, 0xF3, 0x7D, 0xC8, 0x01, 0x2C, 0x17, 0x42, + 0x24, 0x31, 0xF3, 0x02, 0xEF, 0x6F, 0x3D, 0x43, 0x83, 0x30, 0x17, 0x02, + 0x34, 0x39, 0x4D, 0x1D, 0xE3, 0xD3, 0x2D, 0xDD, 0xD1, 0xE6, 0x72, 0x26, + 0x58, 0xC6, 0xE4, 0x4C, 0x54, 0xB3, 0x3F, 0x2D, 0xF4, 0x77, 0xF2, 0x32, + 0x62, 0x02, 0x80, 0x06, 0x18, 0xCD, 0x02, 0x25, 0xEF, 0x03, 0x45, 0xE3, + 0x49, 0x74, 0x73, 0x37, 0x19, 0xD4, 0x28, 0x7C, 0x53, 0x31, 0x63, 0x91, + 0xB4, 0xA4, 0x31, 0x26, 0x74, 0x41, 0x8C, 0x9E, 0xE4, 0x3B, 0x2F, 0x34, + 0x46, 0x01, 0x87, 0x1D, 0x34, 0xD2, 0x1B, 0x73, 0x90, 0x0F, 0xBD, 0x70, + 0xCE, 0x44, 0xE3, 0xAA, 0x4E, 0xEF, 0xFB, 0x16, 0x0A, 0x5D, 0x00, 0xAC, + 0x34, 0xA1, 0xB1, 0x8E, 0x62, 0x62, 0x85, 0xA4, 0x93, 0x43, 0x82, 0x52, + 0x46, 0x95, 0xB4, 0x6F, 0x7C, 0x4E, 0x1F, 0x7F, 0x91, 0xFE, 0x78, 0xB0, + 0xF2, 0x44, 0x83, 0x10, 0x87, 0xD0, 0x55, 0xF6, 0x21, 0xCB, 0xF4, 0xEC, + 0xD3, 0x94, 0x42, 0x8E, 0xE0, 0x12, 0x35, 0x63, 0x42, 0xB6, 0x4E, 0x51, + 0x62, 0x9E, 0x61, 0x49, 0xC9, 0x54, 0x68, 0x68, 0x34, 0x62, 0x2A, 0xE0, + 0x46, 0xA3, 0x54, 0xC6, 0xA8, 0x2C, 0x4C, 0x93, 0xF4, 0x91, 0xB0, 0xD4, + 0x38, 0x00, 0xAC, 0x45, 0x7E, 0x09, 0x01, 0x73, 0x86, 0xEB, 0x00, 0xC0, + 0xC9, 0x1C, 0xC2, 0x07, 0xDA, 0xA3, 0x36, 0xDE, 0xB4, 0x4C, 0x01, 0x55, + 0x5F, 0xE4, 0x12, 0x41, 0xFA, 0x11, 0xAA, 0x08, 0x54, 0xDB, 0x02, 0x31, + 0xFE, 0x9E, 0x84, 0x1B, 0x0C, 0xB3, 0xBB, 0x90, 0xC8, 0x41, 0x83, 0xCB, + 0x89, 0x9A, 0x94, 0xF5, 0x2E, 0x91, 0x10, 0x25, 0x06, 0x00, 0x03, 0xFE, + 0x35, 0x53, 0x5B, 0x85, 0x1C, 0x94, 0x73, 0x43, 0x49, 0x92, 0x07, 0x2B, + 0xED, 0x36, 0x21, 0xE2, 0xAA, 0x46, 0xD0, 0x9B, 0xE2, 0xB4, 0x21, 0x7B, + 0x09, 0x38, 0x49, 0x25, 0x19, 0x52, 0x93, 0x06, 0x19, 0xA4, 0x07, 0x1C, + 0x13, 0x00, 0xEC, 0x44, 0x53, 0x69, 0x15, 0x56, 0xEC, 0x31, 0x62, 0x6C, + 0x94, 0xBA, 0x78, 0xF0, 0xD6, 0x30, 0xED, 0x0E, 0x13, 0xA0, 0x0C, 0xAB, + 0xD3, 0x82, 0x76, 0xC9, 0x2D, 0x61, 0x84, 0x25, 0x86, 0x8B, 0x0A, 0x62, + 0xA2, 0x7F, 0x02, 0xCA, 0x06, 0x62, 0x49, 0x96, 0xEA, 0xA1, 0x56, 0xA1, + 0x95, 0x55, 0x06, 0xB5, 0x3C, 0xF1, 0x6D, 0x57, 0x75, 0xF4, 0x40, 0x9F, + 0xA4, 0x38, 0xB1, 0x44, 0x00, 0x29, 0xA8, 0x41, 0xC9, 0x61, 0x1B, 0xAE, + 0xA1, 0x1A, 0xF8, 0x2E, 0x67, 0x26, 0x35, 0xD1, 0xE2, 0x8F, 0x17, 0x01, + 0x40, 0x3F, 0xA3, 0x75, 0x5D, 0xB3, 0x84, 0x1B, 0x94, 0x33, 0x4D, 0xA9, + 0x4B, 0x95, 0x92, 0x2E, 0x51, 0x15, 0x55, 0x19, 0x77, 0x73, 0x8D, 0x28, + 0xE8, 0xBF, 0x92, 0xA2, 0x9C, 0xC2, 0xB5, 0x4B, 0x59, 0x95, 0x45, 0x15, + 0xA4, 0x07, 0xFA, 0xF4, 0x52, 0xF9, 0x81, 0x5D, 0x0D, 0x96, 0x4A, 0xD8, + 0x41, 0x39, 0x11, 0xE0, 0xF5, 0x54, 0xA9, 0xED, 0xB8, 0x6D, 0xE0, 0xCC, + 0xEE, 0xC6, 0xEE, 0xAE, 0xAF, 0x4C, 0x54, 0x89, 0x52, 0x70, 0xB4, 0xEE, + 0xB4, 0x48, 0xCB, 0x84, 0x07, 0x06, 0x36, 0x01, 0x8A, 0x61, 0x3F, 0x0F, + 0x36, 0x64, 0xF1, 0x03, 0x1B, 0x85, 0x05, 0x5E, 0xFD, 0xE9, 0xFA, 0x2C, + 0x4D, 0x41, 0xDA, 0xB3, 0x22, 0x9E, 0x95, 0x44, 0x67, 0xC6, 0x5B, 0xBF, + 0x6A, 0x25, 0x8C, 0x55, 0x7D, 0x88, 0xC1, 0xC8, 0x4E, 0x29, 0x61, 0x6E, + 0xA0, 0x59, 0x13, 0x60, 0x0B, 0x52, 0x45, 0x64, 0x7D, 0xB6, 0x3E, 0x48, + 0xF6, 0x49, 0xFE, 0xE0, 0x55, 0x5E, 0x2B, 0xCD, 0xDB, 0x22, 0xC2, 0x07, + 0x9E, 0x44, 0x91, 0x3A, 0x6B, 0x8D, 0x34, 0x85, 0xA1, 0x7E, 0x2B, 0x05, + 0x67, 0x92, 0x54, 0x24, 0x34, 0x4F, 0x19, 0xE7, 0x06, 0x62, 0x35, 0x5D, + 0xA5, 0xE4, 0x67, 0xB5, 0xF6, 0x31, 0xEE, 0x21, 0x0A, 0x2B, 0xC2, 0x1B, + 0x21, 0x8F, 0x33, 0x17, 0xA4, 0x4F, 0xAB, 0x34, 0xC3, 0xBE, 0x07, 0x28, + 0xC8, 0x6D, 0xCF, 0x3C, 0xA5, 0x5F, 0x73, 0x47, 0x16, 0x57, 0x94, 0xC1, + 0xAA, 0x76, 0x60, 0x01, 0x40, 0x03, 0x04, 0x6F, 0x6B, 0xED, 0x36, 0x31, + 0xBC, 0x16, 0x00, 0x04, 0x40, 0xFA, 0x80, 0xA0, 0xED, 0x52, 0x56, 0x41, + 0xEE, 0x10, 0x00, 0xFE, 0xB4, 0x25, 0x21, 0x89, 0xDC, 0xC4, 0x89, 0x9C, + 0xCC, 0x09, 0x22, 0xD5, 0x67, 0x5E, 0x94, 0xB5, 0x79, 0x7A, 0x00, 0x5D, + 0x77, 0x96, 0x25, 0xEF, 0x76, 0x72, 0x03, 0x23, 0x17, 0x05, 0x00, 0xAA, + 0x84, 0xA0, 0x68, 0x07, 0x2E, 0x4C, 0x61, 0xF4, 0x91, 0x64, 0xE7, 0xB3, + 0x7C, 0x8B, 0xCB, 0xB2, 0xD3, 0xE6, 0x42, 0x45, 0xC4, 0xF4, 0x14, 0x80, + 0x7C, 0xE0, 0x48, 0x8F, 0x0F, 0x19, 0x06, 0x97, 0x72, 0x5D, 0x37, 0x2F, + 0x82, 0x36, 0x79, 0xFA, 0x56, 0xDB, 0x30, 0x4F, 0x13, 0xCB, 0x16, 0x4E, + 0x0F, 0x31, 0x3E, 0x89, 0x4D, 0x66, 0x21, 0xD4, 0x18, 0xB8, 0x13, 0x00, + 0xF6, 0xC9, 0x86, 0x74, 0x81, 0x59, 0x23, 0xC6, 0x09, 0xA4, 0x01, 0x64, + 0x5F, 0x37, 0x79, 0x33, 0x42, 0x1F, 0xF6, 0x92, 0x06, 0xC2, 0xD6, 0x68, + 0x25, 0xE2, 0x48, 0x5B, 0x77, 0xAF, 0x20, 0x69, 0x34, 0x77, 0x8C, 0x5F, + 0x05, 0x4C, 0xB8, 0x48, 0xAB, 0x26, 0x1B, 0xB7, 0x95, 0x78, 0xE0, 0xAA, + 0xA6, 0x51, 0x19, 0xA6, 0x57, 0x79, 0xEF, 0x36, 0x61, 0x2B, 0x42, 0x00, + 0x2A, 0x00, 0xF2, 0x64, 0x6C, 0xFE, 0x63, 0x5F, 0x14, 0x56, 0x34, 0xAC, + 0x69, 0x1B, 0xB4, 0x1C, 0xE2, 0x48, 0x2D, 0x56, 0x42, 0xDD, 0xD4, 0xE7, + 0x6D, 0x49, 0x6A, 0xAA, 0x56, 0x4A, 0x1B, 0xD5, 0x92, 0x7C, 0x27, 0x97, + 0xD5, 0x62, 0x22, 0x07, 0x88, 0x40, 0xFB, 0x76, 0xC5, 0x76, 0xDD, 0x97, + 0x37, 0x75, 0x17, 0x25, 0x1E, 0x72, 0x48, 0x8D, 0x21, 0x19, 0xE6, 0x65, + 0x0A, 0x01, 0x6A, 0x78, 0xAF, 0xB6, 0x16, 0xFD, 0x97, 0x72, 0xA1, 0x20, + 0x26, 0x2A, 0x20, 0xC6, 0xA0, 0x57, 0x22, 0x02, 0x17, 0x2F, 0xF0, 0x4C, + 0x34, 0x19, 0x6A, 0xC7, 0x50, 0xE2, 0x36, 0x78, 0x37, 0x93, 0x44, 0xAC, + 0xB1, 0x6E, 0xEB, 0x7B, 0x09, 0xAA, 0x82, 0x93, 0xF7, 0x1E, 0xE6, 0x25, + 0x00, 0x82, 0x60, 0x7D, 0x15, 0xE6, 0x49, 0x7A, 0xF4, 0xE0, 0xC0, 0x09, + 0xE6, 0xDA, 0x52, 0x7E, 0x17, 0x38, 0x45, 0x3D, 0x68, 0x52, 0xE1, 0xCF, + 0x29, 0x01, 0xC8, 0xBD, 0x80, 0x40, 0x13, 0x47, 0x94, 0x85, 0x29, 0x37, + 0x0A, 0x07, 0xA0, 0x06, 0x64, 0xB8, 0x4C, 0xFA, 0x54, 0x62, 0x3B, 0x0B, + 0x84, 0x1B, 0xD2, 0x41, 0x4B, 0x38, 0x42, 0x2B, 0xA2, 0x7B, 0x01, 0xEA, + 0x17, 0x66, 0xAC, 0x85, 0xEE, 0xB0, 0x7F, 0x8D, 0xF8, 0x67, 0x53, 0x08, + 0x00, 0x2A, 0xA0, 0x08, 0xC2, 0x70, 0x65, 0x17, 0x42, 0x3E, 0xEE, 0x55, + 0x7C, 0x4C, 0x30, 0x74, 0xDB, 0xF1, 0x66, 0xDA, 0x96, 0x54, 0xB4, 0xC0, + 0x60, 0x0C, 0x20, 0x0C, 0x13, 0xA6, 0x17, 0x1E, 0xCB, 0x70, 0x14, 0x87, + 0x1A, 0xBB, 0xF8, 0x6E, 0xE7, 0xC5, 0x00, 0xC4, 0x38, 0x61, 0x76, 0x2F, + 0x26, 0x4A, 0x95, 0x55, 0x86, 0xA8, 0x70, 0xEB, 0xC6, 0x21, 0xA1, 0xB6, + 0x77, 0xC9, 0x86, 0xDE, 0xA6, 0x4A, 0x40, 0x20, 0x2B, 0x07, 0xFA, 0x34, + 0x8F, 0x8F, 0x38, 0x26, 0x80, 0x60, 0x83, 0x41, 0xFE, 0xE3, 0x48, 0x45, + 0x48, 0x2A, 0xC7, 0x0D, 0x39, 0x56, 0x44, 0x48, 0x17, 0x53, 0xAC, 0xDE, + 0x76, 0x01, 0x30, 0x8B, 0x91, 0x6B, 0x05, 0xAE, 0xD4, 0x0F, 0x92, 0xB7, + 0x56, 0x1A, 0x62, 0xC2, 0x06, 0x28, 0x19, 0x22, 0xB0, 0x38, 0x4C, 0x95, + 0x96, 0x08, 0xC7, 0xA7, 0x90, 0xDD, 0x92, 0x8D, 0xA3, 0xD6, 0x18, 0xE6, + 0xC5, 0x55, 0x17, 0x44, 0x54, 0x9B, 0xAA, 0x08, 0x1C, 0x8C, 0xCD, 0x0A, + 0xD1, 0x94, 0xB7, 0x56, 0x0E, 0x93, 0x67, 0x95, 0x25, 0xA2, 0x89, 0x0F, + 0x18, 0x84, 0x2F, 0x48, 0x4B, 0x43, 0x2D, 0xBC, 0x96, 0x41, 0x19, 0x32, + 0x76, 0x21, 0xCC, 0xD5, 0xAE, 0x10, 0x20, 0x78, 0x97, 0xE7, 0xA3, 0xB2, + 0xC8, 0x97, 0x19, 0x10, 0x98, 0x45, 0x96, 0x81, 0xE4, 0x18, 0x2D, 0x9F, + 0xC4, 0x8C, 0xBF, 0x6F, 0x8D, 0x5E, 0xB6, 0x76, 0x26, 0x29, 0xD4, 0x5E, + 0xA3, 0x5D, 0xD8, 0x50, 0x22, 0x57, 0xE8, 0x40, 0x07, 0xEA, 0x74, 0x41, + 0x83, 0x91, 0xB3, 0x48, 0xA9, 0x00, 0x20, 0x6B, 0xB5, 0xF9, 0x67, 0x3F, + 0x12, 0x82, 0x17, 0xE4, 0x8F, 0xE7, 0x12, 0x56, 0x5C, 0xD2, 0x04, 0xD9, + 0x41, 0x4B, 0xC9, 0x21, 0x8E, 0xAE, 0x52, 0x7B, 0x3D, 0xE8, 0x84, 0xDF, + 0xF9, 0x06, 0xD0, 0xE4, 0x00, 0xA8, 0xD9, 0xC5, 0x8E, 0x8A, 0x20, 0xB0, + 0xB9, 0x9E, 0xB5, 0x76, 0x12, 0x65, 0x6D, 0x57, 0xA4, 0xB7, 0x0C, 0xB1, + 0xB4, 0x28, 0x6A, 0xC7, 0x2A, 0x65, 0x32, 0x7D, 0x82, 0x49, 0x9D, 0x21, + 0x62, 0xA5, 0x04, 0x68, 0x02, 0x16, 0x3A, 0x22, 0x18, 0xB9, 0x91, 0x73, + 0xE0, 0xA1, 0x21, 0xDA, 0x67, 0xAD, 0xE1, 0x4B, 0x1D, 0x97, 0x86, 0x81, + 0x55, 0x34, 0x91, 0xE3, 0xAF, 0x1C, 0xB4, 0xFC, 0xC4, 0xCA, 0xA0, 0x7D, + 0x60, 0x06, 0xFA, 0x54, 0x02, 0x46, 0x5A, 0xAE, 0x92, 0x4E, 0x60, 0xFE, + 0x7C, 0x59, 0x5B, 0x53, 0x9A, 0x56, 0xDF, 0x41, 0x17, 0x01, 0xC8, 0xEC, + 0x42, 0x28, 0x1D, 0x8B, 0x28, 0x4B, 0x59, 0x24, 0x71, 0x95, 0xB0, 0x66, + 0x11, 0x24, 0x90, 0x22, 0x60, 0x06, 0x16, 0xDA, 0x07, 0x6E, 0xC0, 0x06, + 0xAC, 0xCB, 0x18, 0x79, 0xB9, 0x40, 0x50, 0x3A, 0xA8, 0x43, 0x96, 0x81, + 0x76, 0x9A, 0x0A, 0x93, 0xD6, 0x7D, 0x73, 0x8C, 0x21, 0xC9, 0x99, 0x45, + 0x46, 0xD7, 0xFC, 0x70, 0x2E, 0x90, 0x6C, 0xC0, 0x06, 0x7A, 0x40, 0xBA, + 0xA8, 0x7A, 0x02, 0x14, 0x42, 0xA1, 0x59, 0xD9, 0xB1, 0x78, 0xF9, 0x9E, + 0x7C, 0x99, 0x9E, 0xB9, 0xDA, 0x60, 0x3F, 0x12, 0x97, 0x13, 0x26, 0x96, + 0x9C, 0xF8, 0xE0, 0x5E, 0xAE, 0x82, 0x2A, 0x76, 0x84, 0xDD, 0xF1, 0xCF, + 0x82, 0xC9, 0x66, 0x55, 0xE8, 0x21, 0xA8, 0x7A, 0x06, 0x78, 0xD1, 0x8A, + 0x7D, 0xE1, 0x18, 0x8D, 0x80, 0x97, 0xFF, 0xE8, 0xA4, 0x63, 0x22, 0xAF, + 0x45, 0x56, 0x2E, 0x1D, 0x9B, 0x7D, 0x93, 0x8D, 0x3A, 0xF1, 0xB5, 0x5B, + 0xA3, 0x38, 0x2D, 0xB2, 0x33, 0x6C, 0x74, 0x47, 0xC4, 0x22, 0x60, 0x02, + 0xD0, 0x75, 0x5C, 0x6C, 0x60, 0xA4, 0xDD, 0x2B, 0xB2, 0x65, 0xAF, 0x20, + 0x7C, 0xD9, 0xB2, 0x43, 0x56, 0x19, 0x62, 0x02, 0x85, 0x19, 0x87, 0x6C, + 0xA9, 0x53, 0xA1, 0xE0, 0xB3, 0x76, 0x60, 0xD2, 0xA6, 0x36, 0x7A, 0xF4, + 0x24, 0x12, 0x01, 0x24, 0x20, 0xB8, 0x25, 0x60, 0x02, 0x6C, 0x80, 0x07, + 0xBE, 0xBA, 0x99, 0xEA, 0xBA, 0x40, 0x80, 0xE0, 0xB5, 0x61, 0xDB, 0x60, + 0xBF, 0x98, 0xB9, 0x9A, 0x27, 0x70, 0x81, 0xDA, 0x4A, 0x04, 0x30, 0x92, + 0xD0, 0xC5, 0x15, 0x4B, 0x53, 0x24, 0x78, 0x38, 0xAD, 0x17, 0xC2, 0x9D, + 0x77, 0x65, 0xDB, 0x5C, 0xEB, 0x70, 0xE0, 0xEA, 0x76, 0x9B, 0xBB, 0x56, + 0xEF, 0xE1, 0xFE, 0x49, 0x8E, 0x3B, 0xFE, 0xFA, 0x14, 0x8F, 0x1F, 0xA9, + 0xB3, 0xA9, 0x72, 0x58, 0x7B, 0xE9, 0x92, 0x72, 0x8A, 0x54, 0x8E, 0x01, + 0xB1, 0x15, 0x79, 0x57, 0x56, 0xBB, 0x08, 0x7A, 0x60, 0xB2, 0xDF, 0x2A, + 0xEA, 0xCA, 0x9B, 0x5D, 0x9F, 0x04, 0x9F, 0x77, 0x85, 0x8C, 0x7F, 0x59, + 0x90, 0xBF, 0x69, 0x2A, 0x7B, 0xB3, 0x9C, 0xC3, 0x75, 0x11, 0x95, 0xA1, + 0xA6, 0x2B, 0xE2, 0x00, 0xCE, 0x92, 0x9F, 0x9C, 0xAA, 0xAE, 0x27, 0x1B, + 0x86, 0x8C, 0xE9, 0xBF, 0xD7, 0xF5, 0x23, 0x27, 0xDA, 0x8F, 0x63, 0x89, + 0xBD, 0x5D, 0x4E, 0x9C, 0x85, 0x22, 0xA6, 0xCB, 0xD9, 0x9C, 0x47, 0x6D, + 0x71, 0x99, 0x69, 0x57, 0x9C, 0xCA, 0x08, 0x7A, 0xDA, 0x78, 0xDA, 0x83, + 0x18, 0x30, 0x7C, 0x5D, 0xAF, 0x40, 0x80, 0x68, 0xBB, 0x6A, 0x9F, 0x24, + 0x9B, 0xB5, 0x0A, 0x97, 0x72, 0x09, 0x5D, 0xC6, 0xC9, 0xA1, 0xC2, 0x75, + 0x8E, 0x44, 0x9B, 0x54, 0x90, 0xD5, 0xD1, 0x22, 0xDC, 0xD5, 0x76, 0x41, + 0xC5, 0x21, 0xCB, 0x78, 0x70, 0xA8, 0x6E, 0x5F, 0x5C, 0x53, 0x53, 0x41, + 0x80, 0xBC, 0x7B, 0x69, 0xD6, 0xDB, 0x96, 0xFA, 0x81, 0x37, 0xDF, 0x7B, + 0xC4, 0x99, 0xA8, 0x8D, 0x49, 0x05, 0xB1, 0x33, 0xBB, 0xA9, 0x6E, 0x8D, + 0xC2, 0x0F, 0x42, 0x71, 0xA6, 0x7B, 0xC9, 0x63, 0x74, 0xA5, 0x63, 0xC2, + 0x90, 0xC2, 0xD4, 0xC6, 0x03, 0x30, 0xA6, 0xCC, 0x05, 0x31, 0x57, 0x64, + 0x6D, 0xC5, 0x75, 0x25, 0x98, 0x41, 0x19, 0x74, 0x87, 0x09, 0x8F, 0x9B, + 0x8E, 0x8B, 0x5C, 0xB2, 0x8D, 0x07, 0x08, 0x62, 0x02, 0x79, 0xC5, 0x1C, + 0x50, 0xA7, 0xE7, 0x5F, 0x6C, 0xE8, 0xAA, 0xFE, 0x9A, 0x70, 0xF7, 0xC1, + 0xBD, 0x91, 0x08, 0x26, 0xF9, 0xB5, 0x58, 0xFF, 0xAC, 0xB4, 0xC6, 0x44, + 0x41, 0xEC, 0xDC, 0xCB, 0x0D, 0xFE, 0x42, 0xA9, 0x7E, 0xB5, 0xCF, 0x6B, + 0x35, 0xC0, 0x0D, 0x09, 0x41, 0x01, 0x40, 0xC9, 0x61, 0x0A, 0xC1, 0x91, + 0x43, 0x6D, 0x5B, 0xE4, 0xCD, 0xA3, 0xA1, 0x19, 0x20, 0x34, 0x1E, 0x59, + 0x2C, 0x34, 0x9C, 0x6A, 0x17, 0xFE, 0x0D, 0xB2, 0x96, 0x8C, 0xCD, 0x3C, + 0x9C, 0xD2, 0xCB, 0x94, 0x81, 0x36, 0x7C, 0x69, 0x7A, 0x41, 0x3A, 0x2F, + 0x40, 0x41, 0x7D, 0x6F, 0x82, 0x3C, 0x7B, 0xB7, 0x09, 0x85, 0x6D, 0x45, + 0x3D, 0x93, 0xA6, 0xF6, 0xC9, 0xED, 0x3C, 0xB2, 0x5B, 0xA8, 0xC2, 0x09, + 0x02, 0xAE, 0x6A, 0xD8, 0xD5, 0x01, 0xF5, 0x23, 0x67, 0xBC, 0x79, 0xF4, + 0x79, 0x21, 0x5C, 0xDC, 0xC0, 0xF9, 0xAA, 0x1E, 0xCA, 0xE7, 0x1C, 0x9E, + 0xF6, 0xCD, 0xA9, 0x45, 0xDD, 0x42, 0x65, 0x18, 0x04, 0x68, 0xA2, 0x67, + 0x6C, 0xC2, 0x5D, 0xAB, 0xFA, 0x42, 0x4A, 0xDF, 0x00, 0x80, 0x51, 0x91, + 0x3D, 0x53, 0xDF, 0x96, 0x6A, 0x09, 0x2E, 0x26, 0x12, 0xC0, 0xD6, 0xB7, + 0xF5, 0x9B, 0x44, 0xD3, 0x38, 0xC4, 0xC9, 0x37, 0xB1, 0xE1, 0x36, 0x14, + 0x9D, 0x87, 0x8D, 0x41, 0xC4, 0xE2, 0xF8, 0x21, 0xBA, 0xFD, 0xCE, 0x57, + 0x1C, 0x21, 0x70, 0xC8, 0x83, 0xCB, 0x1D, 0x50, 0x27, 0x11, 0xBA, 0xC1, + 0x88, 0x42, 0x2F, 0xDC, 0xE5, 0x04, 0x10, 0x6D, 0x75, 0xC9, 0x37, 0xBF, + 0x4A, 0x0D, 0xB1, 0x5C, 0x5E, 0x2A, 0x42, 0xB6, 0x4E, 0x3D, 0xB2, 0x93, + 0xEE, 0x9E, 0xBE, 0x7C, 0xF3, 0x02, 0x1E, 0x50, 0xB1, 0x01, 0xBD, 0xAD, + 0x29, 0x4C, 0xC3, 0xDC, 0x3F, 0x86, 0xE8, 0x86, 0x29, 0x76, 0xCF, 0xB8, + 0xEC, 0xA1, 0xE8, 0x53, 0x7B, 0xFB, 0x8E, 0xEB, 0x02, 0xA0, 0x07, 0xE8, + 0x78, 0xE2, 0x5D, 0x4B, 0xF6, 0xDA, 0x4A, 0xA9, 0x5A, 0x3D, 0xE3, 0x63, + 0xF4, 0xCF, 0xA5, 0x10, 0xA0, 0xCC, 0x8E, 0xBC, 0xFE, 0x7D, 0x2F, 0x7C, + 0xAC, 0x1B, 0x83, 0x10, 0x77, 0xC1, 0xCF, 0x39, 0x93, 0x7A, 0x2A, 0x02, + 0x72, 0x0D, 0xD5, 0x29, 0x1C, 0xD6, 0x2A, 0xE2, 0xD8, 0x69, 0x5E, 0x49, + 0xE7, 0x30, 0x82, 0xDB, 0x17, 0x77, 0xD1, 0xD8, 0x70, 0x95, 0x83, 0xE1, + 0x0D, 0x45, 0x66, 0xED, 0x9D, 0xD4, 0xA3, 0xA9, 0xCB, 0x53, 0xDD, 0x70, + 0xDA, 0x0A, 0x08, 0xE0, 0x0A, 0x9C, 0x97, 0x7E, 0x49, 0x13, 0x40, 0x71, + 0x0E, 0x0F, 0x8C, 0x28, 0xC2, 0x2E, 0xC6, 0xB7, 0x4A, 0x6E, 0x49, 0xE4, + 0x8D, 0xA8, 0xAC, 0x03, 0x9A, 0x93, 0x7F, 0x5C, 0x6A, 0x47, 0x0A, 0xE0, + 0x5E, 0x9E, 0xD8, 0x0D, 0x42, 0xDC, 0xD3, 0x3E, 0xEC, 0xC3, 0x53, 0x01, + 0x01, 0x60, 0xD9, 0x01, 0x08, 0x8B, 0x49, 0x15, 0xB0, 0x3F, 0x37, 0x8D, + 0xDB, 0x32, 0xA0, 0x05, 0x9A, 0x96, 0x85, 0x4B, 0x77, 0xB4, 0xBD, 0x22, + 0x68, 0x80, 0x97, 0x5F, 0xBE, 0x2F, 0x49, 0xD2, 0x60, 0x06, 0x5D, 0xEF, + 0x63, 0x34, 0x6F, 0xA7, 0x0A, 0x69, 0x63, 0xC2, 0x1A, 0x56, 0x65, 0x90, + 0x71, 0x9D, 0x2A, 0x51, 0x35, 0x26, 0x0B, 0xBB, 0x77, 0x83, 0x7C, 0x21, + 0xAC, 0xAF, 0xFA, 0x0C, 0xA4, 0x06, 0x0C, 0x86, 0x8B, 0x29, 0x9F, 0x3F, + 0x07, 0xFE, 0x18, 0x53, 0x8A, 0x10, 0xD7, 0x9D, 0x70, 0xDD, 0x7D, 0xCD, + 0xE1, 0xBD, 0xC3, 0x62, 0x12, 0xA2, 0x46, 0x4D, 0xAC, 0x88, 0x41, 0x01, + 0xC6, 0x24, 0x20, 0xC1, 0x64, 0x0C, 0x35, 0x7D, 0xF5, 0xFB, 0x93, 0xF9, + 0x00, 0x1D, 0xA0, 0x02, 0xDF, 0xE5, 0xC6, 0xBA, 0xF6, 0xE5, 0xF3, 0x1A, + 0xC8, 0xEF, 0xEA, 0xB4, 0xDB, 0xE6, 0x86, 0xC9, 0x6B, 0x3F, 0xEE, 0x28, + 0xF3, 0x8D, 0x65, 0x85, 0x5F, 0x49, 0x9F, 0x5B, 0xC0, 0x0B, 0x3E, 0x96, + 0x52, 0xF1, 0xD6, 0xD5, 0xD1, 0xB3, 0x45, 0x98, 0x92, 0x7C, 0x09, 0xFE, + 0xEB, 0xD0, 0x99, 0xA7, 0x10, 0x04, 0xF2, 0x11, 0x22, 0x08, 0x1A, 0x45, + 0xE7, 0xAF, 0x9F, 0x3F, 0x9B, 0xBE, 0xAE, 0xCE, 0x1E, 0x4A, 0x5A, 0x96, + 0x7A, 0x4B, 0xD0, 0xB3, 0x93, 0x23, 0x45, 0x6E, 0x03, 0xDD, 0x4A, 0x9C, + 0x18, 0x7C, 0x37, 0x26, 0x72, 0x55, 0x33, 0x00, 0x02, 0x80, 0xC0, 0x2D, + 0xFD, 0x0A, 0x1A, 0x3C, 0x88, 0x30, 0xA1, 0xC2, 0x85, 0x0C, 0x1B, 0x3A, + 0x7C, 0x08, 0x31, 0xA2, 0xC4, 0x89, 0x14, 0x2B, 0x5A, 0xBC, 0x88, 0x31, + 0xA3, 0xC6, 0x8D, 0x1C, 0x3B, 0x7A, 0xFC, 0x08, 0x32, 0xA4, 0xC8, 0x7E, + 0x17, 0x04, 0x0A, 0x94, 0xE0, 0x2B, 0xA5, 0xCA, 0x95, 0x2C, 0x5B, 0xBA, + 0xF4, 0x35, 0xC1, 0x24, 0x80, 0x24, 0x23, 0x31, 0xFA, 0xE3, 0xB7, 0xEF, + 0x1E, 0xBE, 0x7A, 0xF4, 0xE8, 0xB5, 0x5B, 0xA7, 0x0E, 0x5D, 0xB9, 0xA1, + 0xE4, 0xAC, 0x19, 0xA5, 0x16, 0x0D, 0x1A, 0xB4, 0x65, 0xCB, 0x90, 0x21, + 0x33, 0x66, 0x6C, 0x89, 0xC9, 0x00, 0x39, 0xAA, 0x5A, 0xB5, 0x0A, 0x84, + 0x82, 0x49, 0x73, 0x35, 0xBB, 0x7A, 0xFD, 0x0A, 0x36, 0xAC, 0xD8, 0xB1, + 0x64, 0xCB, 0x9A, 0x3D, 0xEB, 0x55, 0xAA, 0x49, 0x94, 0x2F, 0xDB, 0xBA, + 0xF5, 0xA5, 0x0B, 0x81, 0xCC, 0x62, 0x68, 0x15, 0xF2, 0xE3, 0xA7, 0x4F, + 0x1F, 0x3E, 0x7C, 0x3E, 0xDB, 0xFD, 0x54, 0x37, 0xB4, 0xDC, 0x35, 0x72, + 0xD7, 0xAC, 0x51, 0x9B, 0xA6, 0x94, 0xD9, 0xB2, 0x64, 0x4F, 0x8D, 0x15, + 0x3B, 0x60, 0x92, 0xC2, 0xD5, 0xAB, 0x40, 0x2A, 0x08, 0x4C, 0x50, 0x37, + 0xB3, 0xE6, 0xCD, 0x9C, 0x3B, 0x7B, 0xFE, 0x0C, 0x5A, 0xF3, 0x16, 0x99, + 0x00, 0xDE, 0x9A, 0x6E, 0xF9, 0xCB, 0x07, 0x69, 0xAE, 0x9D, 0xEF, 0xEA, + 0xDD, 0xD9, 0xF3, 0x2F, 0x3A, 0xA1, 0xE4, 0x6A, 0x1F, 0xA5, 0x06, 0x4D, + 0xF1, 0x32, 0xFE, 0xA8, 0x50, 0xA3, 0xC8, 0xAC, 0x31, 0x39, 0x07, 0x10, + 0x20, 0x26, 0xAF, 0x84, 0x3E, 0x8E, 0x3C, 0xB9, 0xF2, 0xE5, 0xCC, 0x9B, + 0x87, 0x2C, 0x46, 0x5A, 0xD7, 0xE9, 0xE9, 0x2A, 0x71, 0xC8, 0x4C, 0xA0, + 0x8F, 0xF3, 0x5D, 0xBC, 0xF7, 0xEA, 0xF1, 0xF4, 0x09, 0x54, 0x28, 0xD1, + 0xA2, 0xD3, 0xCA, 0x27, 0x55, 0xEC, 0x94, 0x77, 0x04, 0x93, 0x11, 0x82, + 0x03, 0xA1, 0x61, 0x12, 0x9B, 0xF3, 0xF9, 0xF4, 0xEB, 0xDB, 0xBF, 0x8F, + 0xFF, 0xAB, 0x39, 0xD2, 0x3D, 0xA8, 0xFB, 0x8F, 0x69, 0x92, 0x06, 0x9E, + 0x71, 0x07, 0x1B, 0x78, 0x41, 0x89, 0x67, 0x1B, 0x39, 0x87, 0x25, 0xB5, + 0x54, 0x53, 0xBC, 0x61, 0x21, 0x13, 0x0D, 0x93, 0x01, 0xB1, 0x1E, 0x00, + 0x98, 0xE5, 0x87, 0x61, 0x86, 0x1A, 0x6E, 0xC8, 0xA1, 0x73, 0xF4, 0x90, + 0xC6, 0x83, 0x7F, 0xD4, 0xE9, 0x52, 0xA1, 0x40, 0xC6, 0x6D, 0x76, 0x93, + 0x3E, 0x3A, 0xF1, 0x15, 0x1B, 0x50, 0xE5, 0xA0, 0x53, 0x5B, 0x51, 0x86, + 0x2D, 0x98, 0xDB, 0x62, 0xBC, 0x19, 0x83, 0x81, 0x49, 0x08, 0x50, 0x46, + 0x9C, 0x89, 0x1D, 0xFE, 0x08, 0x64, 0x90, 0x42, 0x0E, 0x09, 0x12, 0x69, + 0x38, 0x88, 0x48, 0x9D, 0x0F, 0x06, 0xC8, 0x24, 0x8D, 0x76, 0x78, 0x15, + 0xF8, 0x13, 0x3B, 0xEA, 0x00, 0x16, 0xE3, 0x35, 0xD4, 0x28, 0x38, 0xCD, + 0x79, 0xCB, 0x28, 0xC3, 0x1B, 0x32, 0xA3, 0x99, 0x24, 0x21, 0x10, 0x35, + 0x64, 0x65, 0x12, 0x3A, 0x44, 0x9E, 0x89, 0x66, 0x9A, 0x6A, 0x0A, 0x99, + 0x81, 0x4C, 0x6C, 0x21, 0x79, 0x5A, 0x0F, 0xA4, 0x91, 0xA3, 0x99, 0x6B, + 0xAF, 0xF5, 0x64, 0x20, 0x3A, 0xE7, 0x94, 0x13, 0xE3, 0x51, 0xE6, 0x35, + 0x98, 0xCC, 0x8D, 0x1A, 0x98, 0x74, 0x80, 0x55, 0x41, 0x40, 0x06, 0xC0, + 0x05, 0x6B, 0x2E, 0xCA, 0x68, 0xFE, 0xA3, 0x8E, 0x1E, 0xE7, 0x84, 0x4C, + 0x11, 0xC0, 0x49, 0x9D, 0x75, 0x26, 0x25, 0xA0, 0x4E, 0x9D, 0xFC, 0xDC, + 0xA3, 0x53, 0x6C, 0x7E, 0xAD, 0x83, 0x4E, 0x3A, 0xE3, 0x29, 0x68, 0x58, + 0x96, 0x80, 0x36, 0x66, 0xCC, 0x30, 0x01, 0x44, 0x26, 0x1C, 0x7C, 0x03, + 0xED, 0xF3, 0x68, 0xAC, 0xB2, 0xCE, 0x4A, 0xEB, 0x73, 0xA4, 0x51, 0x3A, + 0xDD, 0x2F, 0x33, 0xC8, 0x74, 0x01, 0x3F, 0x99, 0xB9, 0xD6, 0x69, 0x4F, + 0xEB, 0xB0, 0x03, 0x94, 0xA8, 0xB5, 0x0D, 0x76, 0x25, 0x8D, 0x4B, 0x31, + 0x66, 0x4C, 0x63, 0x49, 0x10, 0x5A, 0x15, 0xA2, 0x26, 0x2D, 0x71, 0x4F, + 0xAD, 0xD6, 0x5E, 0x8B, 0x6D, 0xB6, 0x06, 0x5D, 0x13, 0x1D, 0xAE, 0xA7, + 0xE9, 0x22, 0x81, 0x4C, 0x1A, 0x54, 0x8B, 0x16, 0xB0, 0x7B, 0xE1, 0xF9, + 0x57, 0x3A, 0xE9, 0xF4, 0xA9, 0xE0, 0x61, 0x88, 0xD5, 0x18, 0x28, 0x6F, + 0xC4, 0x48, 0x4B, 0x83, 0x56, 0x02, 0x99, 0xF0, 0x02, 0x01, 0x00, 0x38, + 0xA1, 0x6D, 0xBF, 0xFE, 0xFE, 0x8B, 0xA6, 0x3A, 0xFC, 0x79, 0xFB, 0x6D, + 0xB8, 0x01, 0xC2, 0x5A, 0x6E, 0x4E, 0x3B, 0xD5, 0xF3, 0x8E, 0x3B, 0xB2, + 0x8D, 0x4A, 0x0D, 0x35, 0xA5, 0x32, 0x98, 0x4C, 0xBC, 0xBC, 0x35, 0x41, + 0xA8, 0x49, 0x03, 0xC0, 0x22, 0x8B, 0x1E, 0x02, 0x01, 0x0C, 0x72, 0xC8, + 0x22, 0xE3, 0x47, 0x9A, 0x0D, 0x04, 0x7F, 0x2B, 0x97, 0x49, 0xFC, 0x9A, + 0xB5, 0x9D, 0xC2, 0xB0, 0x39, 0x1C, 0x1E, 0x95, 0x31, 0x16, 0x15, 0x71, + 0x34, 0x0C, 0xDA, 0xC8, 0x1B, 0x74, 0xA4, 0x01, 0x00, 0x83, 0x2C, 0x3E, + 0x0B, 0x54, 0xCC, 0x12, 0x49, 0x2C, 0x71, 0xCD, 0xC8, 0x46, 0x1F, 0x8D, + 0xB4, 0x66, 0x83, 0x9A, 0x34, 0xC1, 0xC9, 0xA7, 0x29, 0x29, 0x93, 0x15, + 0x09, 0xEB, 0x64, 0x0F, 0x4F, 0x30, 0x07, 0x25, 0xFE, 0x2A, 0x9F, 0xED, + 0x46, 0x4C, 0x63, 0x32, 0x8B, 0xA1, 0x6A, 0xCC, 0x06, 0xA4, 0x29, 0xE0, + 0xF3, 0xCF, 0x3B, 0x97, 0x93, 0x74, 0xDA, 0x6A, 0xAF, 0x2D, 0x52, 0xA4, + 0x6B, 0x39, 0xFD, 0xF4, 0x92, 0xC5, 0x95, 0xD5, 0xF2, 0x8A, 0x56, 0xCB, + 0xB6, 0xAE, 0xD6, 0xB6, 0xD5, 0x7C, 0x33, 0xB3, 0x50, 0x1D, 0x33, 0x0C, + 0x69, 0x7C, 0x94, 0x2D, 0x88, 0x4C, 0x26, 0x0C, 0x00, 0xC0, 0x12, 0x6C, + 0x2F, 0xCE, 0x78, 0xE3, 0x12, 0xE9, 0x2C, 0x10, 0x02, 0xBF, 0xC0, 0x6D, + 0x1A, 0xD4, 0xC5, 0x21, 0x1C, 0x16, 0x3F, 0x37, 0xD9, 0x7D, 0xF7, 0x94, + 0xA1, 0xAE, 0x5B, 0x9B, 0xC4, 0x5C, 0x9B, 0x0A, 0x4D, 0xC5, 0x16, 0x43, + 0xD5, 0xE6, 0xBD, 0x65, 0xCB, 0xF2, 0x82, 0x49, 0x7A, 0xC8, 0x82, 0x82, + 0x40, 0xF5, 0x38, 0x4E, 0x7B, 0xED, 0xB4, 0x5B, 0xD3, 0x2D, 0xE5, 0x6F, + 0xE9, 0x22, 0xB7, 0x40, 0x1A, 0x60, 0x0E, 0x96, 0x3F, 0xFB, 0x28, 0x5C, + 0x35, 0x3D, 0x57, 0x87, 0x3A, 0xB3, 0x6D, 0x13, 0x2F, 0x55, 0xBA, 0xDF, + 0x50, 0x59, 0x21, 0x13, 0xC7, 0xB2, 0xC0, 0xA2, 0x2F, 0x00, 0xAF, 0xCB, + 0x32, 0x87, 0x40, 0xC9, 0xD8, 0xCE, 0x7D, 0xF7, 0x49, 0x7F, 0x28, 0x53, + 0x7F, 0x2A, 0x4D, 0xAE, 0x7B, 0x4B, 0x96, 0xFB, 0x0E, 0x7C, 0x57, 0xDB, + 0x71, 0xEE, 0x8E, 0xC3, 0x9E, 0x83, 0x5E, 0x94, 0x8C, 0xCB, 0x33, 0x55, + 0xF1, 0x8D, 0x50, 0x49, 0xDB, 0x86, 0xCF, 0xAD, 0x03, 0x50, 0x82, 0xCF, + 0xB3, 0xD8, 0xE1, 0x80, 0x7D, 0x79, 0x6F, 0x80, 0x04, 0x04, 0x58, 0xC9, + 0xCA, 0x57, 0xB9, 0xDE, 0x25, 0x8A, 0x1D, 0x5F, 0xD1, 0x1C, 0x4E, 0xEC, + 0x46, 0x8F, 0x86, 0xB5, 0xE3, 0x7D, 0xF0, 0x33, 0xCA, 0x8C, 0xCA, 0xA3, + 0x94, 0x65, 0x81, 0x2D, 0x6C, 0x26, 0x71, 0x80, 0x2C, 0xF8, 0x20, 0xFE, + 0x10, 0x0F, 0xFA, 0x2C, 0x16, 0x75, 0x70, 0x43, 0xA2, 0x0A, 0x88, 0xC2, + 0x14, 0xD6, 0x4A, 0x2D, 0x02, 0x99, 0x01, 0x02, 0x13, 0x78, 0x1D, 0xB4, + 0x75, 0xE5, 0x26, 0x9B, 0xDA, 0x4B, 0xD5, 0xDA, 0xE7, 0xBE, 0xCF, 0x25, + 0xCF, 0x82, 0xCA, 0x6A, 0xDE, 0x06, 0xAD, 0xD0, 0x3B, 0x3E, 0xE8, 0x6B, + 0x01, 0xAA, 0x28, 0x1B, 0x2B, 0xE6, 0xF0, 0x86, 0x8F, 0xA9, 0x70, 0x89, + 0x4C, 0x5C, 0xD3, 0x97, 0x4E, 0xF2, 0x42, 0x18, 0xCA, 0x44, 0x19, 0x35, + 0xF1, 0xC7, 0x4D, 0x86, 0xB7, 0x97, 0xEF, 0x1C, 0x4F, 0x5D, 0x7D, 0xB2, + 0x86, 0x8C, 0xDC, 0xA5, 0x14, 0xFA, 0x9D, 0x2E, 0x55, 0x32, 0xA9, 0xDE, + 0xE0, 0xFC, 0x17, 0x88, 0x39, 0x64, 0x0F, 0x00, 0x4D, 0x6C, 0xA3, 0x1B, + 0x83, 0x14, 0x8D, 0x5B, 0x45, 0x71, 0x77, 0x25, 0x12, 0x88, 0x15, 0xD2, + 0xC7, 0x11, 0x1A, 0xD6, 0xF0, 0x5C, 0xC6, 0xFB, 0xCB, 0x94, 0xD2, 0x71, + 0x8E, 0x99, 0x79, 0x71, 0x1A, 0x11, 0x23, 0x1D, 0x53, 0x76, 0x63, 0x3F, + 0x63, 0x24, 0x80, 0x34, 0xD7, 0xF3, 0x99, 0x2B, 0xEA, 0xA0, 0x46, 0x25, + 0xBE, 0x71, 0x92, 0x94, 0xBC, 0x8F, 0xC0, 0x64, 0x22, 0x9D, 0x39, 0xB6, + 0xE5, 0x17, 0x24, 0x22, 0x8D, 0x06, 0xD6, 0x11, 0x92, 0xBB, 0xEC, 0x63, + 0x2F, 0x2C, 0x92, 0x60, 0x78, 0xB8, 0x28, 0x48, 0x0B, 0xFE, 0x69, 0x59, + 0xF5, 0xB3, 0x5F, 0x8E, 0x04, 0x32, 0x80, 0x3E, 0xAC, 0x6E, 0x16, 0x84, + 0x50, 0x63, 0x12, 0xD9, 0x58, 0xC9, 0x5C, 0xEA, 0x92, 0x39, 0x20, 0xD2, + 0xA4, 0x69, 0x76, 0x75, 0x9D, 0xED, 0x75, 0x64, 0x3B, 0xAF, 0x61, 0x51, + 0x1F, 0xD7, 0x51, 0xAC, 0x51, 0x59, 0xD0, 0x28, 0xE5, 0x31, 0xE4, 0x62, + 0xC6, 0x88, 0x23, 0x93, 0x88, 0xA0, 0x6C, 0xB3, 0x98, 0x85, 0x2B, 0xEC, + 0xA0, 0x46, 0xFE, 0x13, 0x2A, 0x6E, 0x97, 0xDC, 0xEC, 0xA6, 0x67, 0x58, + 0x08, 0x00, 0x93, 0xF9, 0xF2, 0x2D, 0x36, 0xD8, 0xD9, 0x12, 0x66, 0xA7, + 0x91, 0xF5, 0xAD, 0xA8, 0x27, 0xED, 0xF3, 0xA3, 0x0E, 0x93, 0x37, 0x8D, + 0x52, 0x91, 0x0E, 0x50, 0x89, 0x34, 0x46, 0x49, 0x04, 0x32, 0x4D, 0xFF, + 0xC5, 0x62, 0x15, 0x6A, 0x9C, 0x43, 0x03, 0x00, 0x40, 0x45, 0x6F, 0x0A, + 0x74, 0xA0, 0x66, 0x81, 0x1C, 0x00, 0xDE, 0x34, 0xCE, 0xB6, 0xF0, 0x60, + 0x55, 0xC1, 0xCC, 0x08, 0x4E, 0xB0, 0x98, 0x45, 0xE3, 0x5D, 0x4D, 0x1D, + 0xF0, 0x4B, 0xD0, 0x95, 0x98, 0x89, 0xC1, 0x06, 0x3D, 0x13, 0x6C, 0x4E, + 0xB1, 0x80, 0x34, 0xA9, 0xF9, 0xC8, 0x6C, 0x0A, 0xE4, 0x1D, 0x04, 0x2D, + 0xA9, 0x49, 0xBD, 0xC2, 0x2D, 0x1D, 0x25, 0xF4, 0x2D, 0x9C, 0xAC, 0xA3, + 0x40, 0xCE, 0x49, 0x11, 0x3D, 0x72, 0xAA, 0x40, 0x0E, 0x6B, 0x07, 0xB1, + 0xB0, 0x16, 0xC8, 0xE4, 0x91, 0x47, 0x9E, 0x0C, 0x3A, 0x95, 0xFD, 0x90, + 0x61, 0xD0, 0x9E, 0x39, 0x32, 0x8D, 0x73, 0xA0, 0x83, 0xBE, 0x08, 0x72, + 0xD2, 0xA4, 0x2A, 0xB5, 0x23, 0xF7, 0x90, 0x49, 0x00, 0x32, 0xB9, 0x52, + 0xB7, 0xD8, 0x80, 0xA1, 0x32, 0xD9, 0x02, 0x1E, 0x15, 0x42, 0xC3, 0x62, + 0x7A, 0xC7, 0x53, 0xC8, 0xFC, 0xA3, 0xA8, 0x72, 0x7A, 0xAC, 0xC2, 0xCC, + 0x08, 0x29, 0x19, 0x64, 0x86, 0x6E, 0xA0, 0x69, 0x0C, 0xDF, 0x98, 0x44, + 0x10, 0x23, 0x5C, 0x05, 0x24, 0xE9, 0xC0, 0x80, 0x44, 0x91, 0x6B, 0xA9, + 0x74, 0xAD, 0x2B, 0x45, 0x96, 0x26, 0x90, 0x10, 0x45, 0xF5, 0x2D, 0x3C, + 0x30, 0x00, 0x55, 0x2F, 0x43, 0x8C, 0x85, 0xD0, 0x30, 0x27, 0x9C, 0xC3, + 0x93, 0x3B, 0x80, 0xF2, 0xBE, 0xC0, 0xD4, 0x26, 0x1B, 0xE4, 0xC8, 0x86, + 0x35, 0xC4, 0x3A, 0xD6, 0x9E, 0xFE, 0x9E, 0x15, 0xAD, 0x8B, 0xBC, 0x4C, + 0x35, 0x65, 0xC1, 0x0A, 0x3B, 0x94, 0x10, 0x71, 0x05, 0xC8, 0x94, 0x5D, + 0x3F, 0x0B, 0xDA, 0x86, 0x5C, 0x41, 0x26, 0xE2, 0xDC, 0xAB, 0x5B, 0xC0, + 0xB5, 0xB3, 0x44, 0x45, 0xC3, 0x81, 0xFB, 0x28, 0x26, 0x9E, 0x24, 0xFA, + 0xA9, 0x29, 0x79, 0x2E, 0x30, 0x7A, 0x6B, 0x6C, 0x36, 0xB2, 0x21, 0x56, + 0xAE, 0xE1, 0xA6, 0xAC, 0x8A, 0x69, 0x65, 0x2B, 0xA1, 0x82, 0x31, 0x99, + 0xBC, 0xCE, 0x15, 0x81, 0x70, 0xC3, 0x3F, 0x2D, 0xE4, 0xD9, 0xD0, 0x2A, + 0x77, 0xB9, 0xFD, 0xE0, 0x86, 0x9B, 0x4C, 0x7B, 0x1A, 0x1C, 0x28, 0xD0, + 0x24, 0x16, 0xD8, 0x42, 0x39, 0x90, 0x89, 0x5D, 0x64, 0xCE, 0x66, 0xBB, + 0xE9, 0x10, 0x8F, 0x62, 0x67, 0x76, 0x8D, 0xDB, 0x42, 0x76, 0x74, 0x3D, + 0xAD, 0xD1, 0x33, 0x6F, 0x44, 0x0C, 0xDE, 0x3C, 0x21, 0xB5, 0x2F, 0x70, + 0x80, 0x00, 0xA6, 0x95, 0x1D, 0xE6, 0xCA, 0x17, 0xB4, 0xE0, 0x13, 0x88, + 0x01, 0xA0, 0xFB, 0x2D, 0x00, 0xED, 0x6C, 0x01, 0x4D, 0x58, 0x86, 0xC4, + 0xAC, 0x71, 0x5B, 0x6B, 0x68, 0x63, 0xC0, 0xDA, 0x68, 0xAC, 0x6D, 0x6F, + 0x2B, 0xDE, 0x65, 0x8E, 0x15, 0x29, 0xE5, 0x55, 0x8A, 0xD7, 0x2A, 0x96, + 0x9E, 0x44, 0xAE, 0x37, 0xB5, 0xBC, 0x6A, 0xD2, 0x7C, 0x2F, 0xFC, 0x59, + 0xBC, 0x02, 0xC0, 0x07, 0xF8, 0x7D, 0x5A, 0xCA, 0x52, 0x8B, 0x81, 0x27, + 0x1C, 0x83, 0x29, 0x19, 0x4C, 0x8A, 0xCD, 0x90, 0x82, 0xE2, 0x68, 0xA4, + 0xD8, 0x66, 0x36, 0xCB, 0x60, 0x18, 0x01, 0x05, 0xE1, 0x0D, 0x36, 0xE6, + 0x18, 0xE5, 0x74, 0x2A, 0x69, 0x2E, 0x60, 0x61, 0x0C, 0xEB, 0x98, 0xAE, + 0x4F, 0x04, 0xC0, 0x0D, 0x3A, 0x3C, 0x9D, 0x1B, 0xFC, 0x75, 0x67, 0x19, + 0x78, 0x42, 0x7A, 0x9B, 0x85, 0x0C, 0xD3, 0x79, 0xFE, 0xED, 0x90, 0x87, + 0x64, 0x9E, 0x46, 0x99, 0xA2, 0x0C, 0xC6, 0x30, 0xA6, 0x31, 0x32, 0x46, + 0xC6, 0x31, 0x9A, 0x50, 0x3D, 0x93, 0x18, 0x20, 0x07, 0x75, 0x54, 0x40, + 0x72, 0x77, 0x0C, 0x66, 0x93, 0x62, 0x43, 0x26, 0x4D, 0x03, 0xF2, 0xB7, + 0x6C, 0x30, 0xDD, 0x9D, 0x61, 0xA0, 0x09, 0x58, 0x38, 0x86, 0x53, 0x36, + 0x58, 0xCF, 0x1B, 0xC1, 0x39, 0xCE, 0x56, 0xD0, 0x80, 0xB4, 0xA6, 0x22, + 0xA1, 0x1C, 0x7C, 0x18, 0xB9, 0x61, 0xEE, 0x73, 0x49, 0x65, 0x82, 0x00, + 0x33, 0x8F, 0xE8, 0x06, 0x7B, 0xA6, 0x70, 0xA2, 0x76, 0xF0, 0x84, 0x2D, + 0x44, 0x38, 0xCE, 0x6F, 0x8E, 0x73, 0xB3, 0x88, 0x81, 0x85, 0x26, 0x64, + 0xE0, 0xCE, 0x32, 0x39, 0x40, 0x9E, 0xAB, 0xB2, 0xE7, 0x04, 0x30, 0xD0, + 0xCF, 0x9C, 0xE6, 0xA6, 0xDB, 0x04, 0x02, 0x55, 0x41, 0xBB, 0x85, 0x7C, + 0x3C, 0xD0, 0xAF, 0xA1, 0xAF, 0x73, 0x81, 0x24, 0x34, 0x81, 0xCD, 0x58, + 0x68, 0x35, 0x16, 0xAA, 0xA0, 0x85, 0x44, 0xB8, 0xDA, 0xD5, 0xAB, 0xDE, + 0x00, 0x06, 0x2A, 0x7B, 0xEA, 0x1D, 0x05, 0x27, 0xD3, 0x9B, 0xEE, 0xB4, + 0xAF, 0x27, 0x99, 0x0C, 0xD2, 0x8A, 0x5A, 0x44, 0xBA, 0xB0, 0x41, 0xA1, + 0x4F, 0x0D, 0x80, 0x34, 0x23, 0x7B, 0xD9, 0x02, 0x91, 0x4C, 0x70, 0x30, + 0x7D, 0x9D, 0x2F, 0xFF, 0x7A, 0xDA, 0x2A, 0xAC, 0x2F, 0x00, 0xCA, 0x3C, + 0x6C, 0x11, 0xF9, 0x60, 0x06, 0xC7, 0x66, 0xB6, 0xB7, 0x4F, 0x2D, 0x01, + 0xE0, 0x3C, 0xBB, 0x2A, 0x35, 0xC8, 0x34, 0x37, 0xA8, 0x8D, 0x6E, 0x15, + 0xE2, 0xF5, 0xBE, 0xD9, 0xA6, 0xD4, 0xB6, 0x5D, 0xFA, 0xED, 0x78, 0x03, + 0x20, 0x00, 0x12, 0x18, 0x0E, 0x10, 0xC6, 0x6D, 0x95, 0x72, 0x93, 0x26, + 0xC7, 0xE9, 0xEE, 0x37, 0xF7, 0x82, 0x6D, 0x12, 0xF1, 0xB5, 0x9B, 0xFE, + 0x52, 0xBA, 0x28, 0xF5, 0x02, 0xE4, 0xED, 0x6D, 0x09, 0xE0, 0xA0, 0x08, + 0x45, 0x20, 0x42, 0x10, 0xEE, 0x8D, 0x6F, 0x72, 0x53, 0x9A, 0x2E, 0xFE, + 0xAE, 0x38, 0xED, 0xEA, 0x21, 0x13, 0x17, 0x0E, 0xFC, 0x64, 0xBD, 0xE8, + 0x81, 0x0D, 0x26, 0xD0, 0xED, 0x6F, 0x47, 0x60, 0x06, 0x3C, 0xE0, 0x85, + 0xC9, 0x8D, 0xD0, 0x70, 0x21, 0x3C, 0x3C, 0xE2, 0x56, 0xB1, 0x8C, 0x4C, + 0x4E, 0x64, 0xF1, 0x98, 0xB3, 0x0D, 0xAF, 0x81, 0xDE, 0x78, 0xF9, 0x7C, + 0xE0, 0xF1, 0x8F, 0x4B, 0x60, 0xE7, 0x12, 0x58, 0x92, 0x01, 0x78, 0x2E, + 0x81, 0x19, 0xD8, 0x80, 0x07, 0x1C, 0x56, 0x49, 0x2F, 0x7A, 0xB1, 0x0B, + 0x23, 0xA0, 0x9C, 0x08, 0x2A, 0x1F, 0x0E, 0xCB, 0x2B, 0xE3, 0xC9, 0xB9, + 0xCA, 0x7C, 0xEA, 0x46, 0x53, 0x86, 0x4C, 0x8A, 0x6E, 0xF3, 0x6C, 0xF7, + 0xC2, 0xE4, 0xBB, 0xD8, 0x05, 0x11, 0x8C, 0xC0, 0xF4, 0x95, 0xB3, 0x3C, + 0x07, 0xF6, 0x32, 0xC9, 0x05, 0x40, 0x49, 0xF5, 0xB4, 0x87, 0xCC, 0xDA, + 0x47, 0xCA, 0xBA, 0xD6, 0xB9, 0xDE, 0x75, 0x22, 0xC8, 0x5D, 0xE5, 0x41, + 0x18, 0x7B, 0x0E, 0x5C, 0x65, 0x12, 0x05, 0x14, 0x4D, 0xED, 0x7C, 0xF7, + 0xD7, 0xA7, 0x11, 0xD0, 0x0B, 0xB7, 0xBF, 0xBD, 0xEB, 0x4B, 0x67, 0x3A, + 0xDD, 0xED, 0x5E, 0x76, 0x93, 0x04, 0xB6, 0xEF, 0x8C, 0xBF, 0x96, 0x34, + 0xAE, 0x2E, 0x78, 0x51, 0x1F, 0x9D, 0x17, 0x5D, 0xEF, 0x3A, 0xC3, 0xC3, + 0x1E, 0x84, 0xBA, 0x8F, 0x9D, 0x06, 0x43, 0x5E, 0x82, 0xAF, 0x1A, 0x0F, + 0x7A, 0x59, 0xE1, 0x5A, 0xE3, 0x91, 0x37, 0xF3, 0xE4, 0x2B, 0x7F, 0x79, + 0xCC, 0x6B, 0x9E, 0xE5, 0x35, 0x98, 0x6E, 0x02, 0x64, 0x18, 0xFA, 0xD8, + 0x2F, 0xEA, 0x89, 0x06, 0x08, 0x7C, 0xE9, 0x81, 0x3C, 0x79, 0xCA, 0xA3, + 0x3C, 0xF5, 0xFE, 0x0E, 0x7F, 0x38, 0xC4, 0x23, 0xCE, 0xF9, 0x9D, 0x51, + 0x5C, 0xF6, 0xC4, 0x3F, 0x13, 0xC6, 0x4D, 0xA2, 0xD7, 0xDB, 0x77, 0xF8, + 0xF4, 0xBB, 0x28, 0x42, 0xE1, 0x83, 0x40, 0x77, 0xA7, 0xB3, 0x7E, 0xC8, + 0x89, 0xA3, 0x47, 0xF1, 0xAF, 0x2F, 0x24, 0xE8, 0x41, 0x51, 0xF9, 0xD0, + 0x3D, 0xFA, 0xD6, 0xB9, 0x6E, 0x84, 0xE6, 0x13, 0xA1, 0xE1, 0x72, 0xCF, + 0xBC, 0xF4, 0xF1, 0xFD, 0x9E, 0xD4, 0x26, 0x60, 0xEF, 0xD8, 0x6F, 0xBF, + 0x86, 0xCA, 0x01, 0x79, 0xEE, 0x77, 0xBF, 0x17, 0xC1, 0xA0, 0x7C, 0xD2, + 0x19, 0x4E, 0xFE, 0xDE, 0xFB, 0xFE, 0xE9, 0xFA, 0xDE, 0x99, 0x13, 0xA4, + 0xEE, 0x7E, 0x01, 0x58, 0x1F, 0x2C, 0x84, 0x6D, 0xF2, 0xB7, 0x52, 0xDE, + 0x07, 0x77, 0x4A, 0x57, 0x78, 0x0E, 0x17, 0x7D, 0xBF, 0x87, 0x7E, 0x14, + 0xF0, 0x5E, 0xA4, 0x91, 0x00, 0xF2, 0x21, 0x80, 0x15, 0x38, 0x1F, 0xE4, + 0x30, 0x15, 0xA1, 0x66, 0x80, 0xBE, 0x84, 0x80, 0xF6, 0x97, 0x74, 0xBB, + 0x37, 0x77, 0x74, 0xB7, 0x7F, 0x4F, 0x97, 0x03, 0x2E, 0x47, 0x1A, 0xFF, + 0x67, 0x81, 0x29, 0xB8, 0x1C, 0x6A, 0x11, 0x00, 0xA5, 0xB5, 0x81, 0xE3, + 0x94, 0x7B, 0xF6, 0xA7, 0x74, 0x0D, 0x47, 0x7E, 0x42, 0xD0, 0x80, 0x76, + 0x07, 0x04, 0x43, 0xC0, 0x65, 0x3B, 0x93, 0x00, 0xFC, 0xA6, 0x82, 0x3F, + 0xD8, 0x19, 0xF0, 0x67, 0x5F, 0x1A, 0xF8, 0x82, 0x73, 0x14, 0x83, 0xE1, + 0x87, 0x7F, 0xF9, 0x67, 0x83, 0xE6, 0x77, 0x7E, 0xE8, 0x07, 0x7D, 0x36, + 0x10, 0x81, 0x97, 0x42, 0x52, 0x40, 0x48, 0x85, 0x9C, 0xC1, 0x42, 0xA4, + 0x57, 0x84, 0x46, 0xF8, 0x7D, 0x09, 0x08, 0x82, 0x21, 0x98, 0x79, 0xBE, + 0xE7, 0x80, 0xE3, 0x06, 0x04, 0xD0, 0x47, 0x04, 0x2E, 0x05, 0x73, 0x55, + 0x88, 0x86, 0x67, 0xB1, 0x0E, 0xFE, 0x98, 0x94, 0x85, 0x9A, 0xD4, 0x81, + 0xBA, 0x37, 0x83, 0xA9, 0x27, 0x04, 0xAA, 0xD7, 0x84, 0x11, 0x17, 0x04, + 0xE3, 0x67, 0x6A, 0x00, 0x60, 0x0F, 0x69, 0xC8, 0x87, 0x66, 0xA1, 0x7D, + 0x07, 0xD5, 0x86, 0x51, 0x14, 0x78, 0xB9, 0x57, 0x79, 0x1F, 0xC8, 0x7B, + 0x4B, 0xC8, 0x84, 0x61, 0x88, 0x6F, 0x77, 0x58, 0x04, 0x26, 0x08, 0x50, + 0x7D, 0x08, 0x89, 0x62, 0x71, 0x0F, 0xB8, 0x96, 0x7C, 0x81, 0x58, 0x3E, + 0x5B, 0xF7, 0x7D, 0x84, 0xA7, 0x80, 0xA9, 0x77, 0x87, 0x5F, 0x98, 0x88, + 0x63, 0x37, 0x86, 0x4C, 0x27, 0x13, 0x2B, 0x13, 0x89, 0xA5, 0xD8, 0x15, + 0x56, 0x27, 0x10, 0x07, 0x40, 0x84, 0x96, 0xC8, 0x71, 0x5B, 0xA8, 0x89, + 0x71, 0x28, 0x77, 0x0E, 0xA7, 0x7F, 0x60, 0x68, 0x77, 0x8C, 0x58, 0x22, + 0x17, 0x62, 0x8A, 0xB9, 0x28, 0x12, 0x04, 0xC8, 0x8A, 0x94, 0x33, 0x88, + 0xBC, 0x90, 0x89, 0xAF, 0xC8, 0x7B, 0xD0, 0x27, 0x82, 0xC3, 0xA1, 0x03, + 0x38, 0x38, 0x87, 0x14, 0x80, 0x38, 0x92, 0xA4, 0x8B, 0xCD, 0xD8, 0x11, + 0xE8, 0x20, 0x13, 0x6D, 0xD7, 0x8B, 0x27, 0xC3, 0x0B, 0xBE, 0xE0, 0x8A, + 0xC2, 0x48, 0x7E, 0x29, 0xA7, 0x7F, 0xF6, 0xA6, 0x88, 0xCF, 0x26, 0x77, + 0x35, 0x26, 0x10, 0xAC, 0xE1, 0x8C, 0xE3, 0xA8, 0x11, 0xA8, 0x28, 0x10, + 0x58, 0x37, 0x8D, 0x94, 0x72, 0x74, 0xBE, 0x00, 0x8C, 0x5C, 0x98, 0x84, + 0xB1, 0xD8, 0x89, 0xD1, 0x27, 0x76, 0x63, 0x37, 0x87, 0x3C, 0x20, 0x13, + 0x74, 0x42, 0x8E, 0xF9, 0x88, 0x11, 0x2C, 0xF4, 0x54, 0xE9, 0x48, 0x30, + 0x31, 0x58, 0x79, 0x71, 0x78, 0x79, 0x45, 0x40, 0x86, 0xC5, 0x58, 0x87, + 0xE3, 0x36, 0x87, 0x39, 0x20, 0x13, 0xE2, 0xA8, 0x8F, 0x0D, 0x29, 0x11, + 0x93, 0xB8, 0x16, 0xAB, 0xE8, 0x8F, 0x6F, 0x11, 0xFE, 0x0C, 0xD6, 0x08, + 0x90, 0x1F, 0x28, 0x90, 0xB1, 0x38, 0x8B, 0xB4, 0x48, 0x8F, 0x45, 0xA0, + 0x90, 0x26, 0x01, 0x7B, 0x0E, 0x29, 0x92, 0x0F, 0xB1, 0x1F, 0xF6, 0x35, + 0x29, 0x13, 0x09, 0x27, 0x5B, 0xE8, 0x81, 0x02, 0xA9, 0x8D, 0x77, 0xB8, + 0x8D, 0xDC, 0xC8, 0x72, 0x73, 0x78, 0x03, 0x32, 0x31, 0x92, 0x35, 0x09, + 0x11, 0x8F, 0xC7, 0x1E, 0xE8, 0x88, 0x92, 0x6E, 0x31, 0x88, 0x2A, 0x09, + 0x87, 0xBB, 0x97, 0x7F, 0xE5, 0x27, 0x82, 0x60, 0xD8, 0x8D, 0x58, 0x31, + 0x7E, 0xE0, 0x88, 0x8B, 0x36, 0xA9, 0x94, 0x0A, 0x31, 0x5A, 0x5A, 0x26, + 0x70, 0x3B, 0xC9, 0x93, 0x3E, 0x29, 0x83, 0x40, 0x19, 0x8B, 0x36, 0x68, + 0x78, 0xE6, 0x37, 0x82, 0xE8, 0x77, 0x94, 0x2A, 0xB3, 0x94, 0x5D, 0xC9, + 0x94, 0x25, 0x43, 0x3E, 0x50, 0xD9, 0x16, 0x17, 0x69, 0x88, 0x34, 0xA8, + 0x91, 0x1B, 0xC9, 0x8D, 0x45, 0x59, 0x15, 0x40, 0xF0, 0x75, 0x26, 0xE8, + 0x83, 0x5E, 0xE9, 0x95, 0x7F, 0x78, 0x12, 0x12, 0x09, 0x95, 0xD5, 0x78, + 0x8D, 0x9A, 0xF8, 0x8E, 0x4C, 0x37, 0x77, 0xB3, 0x68, 0x6F, 0x11, 0x07, + 0x04, 0x73, 0xB8, 0x0B, 0xD5, 0x43, 0x00, 0xEF, 0xB0, 0x0F, 0x9F, 0x07, + 0x97, 0x70, 0xD9, 0x94, 0x5A, 0xF6, 0x63, 0x62, 0xD9, 0x12, 0x26, 0xE7, + 0x98, 0x01, 0xA9, 0x80, 0x5D, 0xA8, 0x97, 0xD0, 0xF7, 0x85, 0x30, 0xA9, + 0x95, 0x45, 0x20, 0x04, 0x2A, 0xC3, 0x0E, 0xEE, 0xF0, 0x0E, 0xF8, 0x70, + 0x0F, 0x56, 0x74, 0x98, 0x5D, 0x69, 0x50, 0x02, 0x31, 0x01, 0x74, 0xE9, + 0x8F, 0xD5, 0xC8, 0x8E, 0x70, 0x87, 0x91, 0xF8, 0xA7, 0x91, 0x36, 0x38, + 0x94, 0x7D, 0x69, 0x87, 0x44, 0xC0, 0x0B, 0x65, 0xC7, 0x0D, 0xDB, 0x50, + 0x0E, 0xE7, 0xA0, 0x0E, 0xED, 0x60, 0x0F, 0x9F, 0x19, 0x9A, 0x4B, 0xFE, + 0x09, 0x0D, 0xB8, 0x66, 0x5F, 0xD2, 0x88, 0x92, 0x83, 0x98, 0x12, 0x8E, + 0x39, 0x95, 0x19, 0xB9, 0x97, 0x7C, 0x69, 0x99, 0xE3, 0xC6, 0x70, 0xBC, + 0x90, 0x32, 0x3B, 0xC0, 0x0D, 0xD2, 0x50, 0x0D, 0xD8, 0xB0, 0x0D, 0xE6, + 0x80, 0x0E, 0xEC, 0xB0, 0x9B, 0xFE, 0xD0, 0x9B, 0x36, 0x89, 0x0E, 0x1A, + 0x36, 0x6F, 0x12, 0xA0, 0x93, 0xFE, 0x28, 0x95, 0xAF, 0x78, 0x04, 0xAC, + 0x29, 0x8B, 0x94, 0x59, 0x99, 0x07, 0x79, 0x15, 0x38, 0x30, 0x04, 0xCE, + 0x67, 0x29, 0x00, 0xD0, 0x05, 0xC7, 0xF0, 0x0C, 0xCA, 0xE0, 0x0C, 0xDC, + 0x30, 0x9D, 0xD6, 0xD9, 0x0E, 0xF8, 0x60, 0x98, 0xDB, 0xE9, 0x90, 0xFA, + 0x90, 0x98, 0x19, 0x67, 0x7B, 0xE9, 0xF8, 0x86, 0x2B, 0xB9, 0x89, 0x67, + 0x79, 0x9E, 0xE9, 0xA9, 0x96, 0x6B, 0x49, 0x04, 0xBB, 0x10, 0x17, 0x02, + 0x81, 0x01, 0x58, 0xD0, 0x05, 0xC3, 0xB0, 0x07, 0xC5, 0xF0, 0x0C, 0xCB, + 0xC0, 0x0D, 0x57, 0x62, 0x0E, 0xEC, 0x40, 0x0F, 0xFB, 0xA0, 0x9D, 0xFC, + 0x59, 0x8A, 0xF7, 0x70, 0x0D, 0xC4, 0x90, 0x04, 0xDE, 0x79, 0x6A, 0x07, + 0x50, 0x89, 0xBD, 0x48, 0x96, 0xE1, 0x07, 0x94, 0x4A, 0x38, 0x94, 0xE9, + 0x19, 0x93, 0x45, 0xB0, 0x0B, 0x35, 0x20, 0x10, 0x02, 0xB0, 0x04, 0x4E, + 0x00, 0x05, 0x56, 0x70, 0x05, 0x58, 0xB0, 0x05, 0xE9, 0xB5, 0x0C, 0xD0, + 0x80, 0x0D, 0xE6, 0xA0, 0x0E, 0xF4, 0x00, 0x80, 0x1E, 0x5A, 0x85, 0xE5, + 0xF0, 0x69, 0xD4, 0xB7, 0x6C, 0x07, 0xF0, 0x94, 0x6D, 0xF8, 0x86, 0xA8, + 0xC7, 0x92, 0x55, 0xC9, 0x80, 0x9E, 0x08, 0x9B, 0xF8, 0xC6, 0x03, 0x30, + 0x4A, 0x04, 0x0C, 0x85, 0x01, 0x4B, 0xA0, 0xA5, 0x51, 0x10, 0x05, 0x50, + 0x90, 0xA3, 0x5C, 0x90, 0x0A, 0x16, 0x5A, 0x0D, 0xDB, 0x80, 0x0E, 0xEF, + 0x30, 0xA4, 0xFE, 0x44, 0x9A, 0x82, 0xF7, 0xF0, 0x69, 0x00, 0xD0, 0x00, + 0x21, 0x00, 0x02, 0x5F, 0x30, 0x06, 0x71, 0x0A, 0x02, 0x73, 0xEA, 0x01, + 0x0D, 0x10, 0x85, 0x3B, 0x23, 0x01, 0x4B, 0xFA, 0x82, 0x31, 0x28, 0x83, + 0xF7, 0xC7, 0x7B, 0x7A, 0x59, 0x7E, 0x08, 0xFA, 0x74, 0x30, 0xCA, 0x0B, + 0x15, 0xB2, 0x00, 0x5A, 0xAA, 0xA5, 0x49, 0x30, 0x34, 0x4C, 0xE0, 0x04, + 0x57, 0xB0, 0x05, 0x5C, 0xF0, 0x0C, 0xCE, 0x50, 0x0D, 0xDA, 0x90, 0x0E, + 0x66, 0xDA, 0xA1, 0x68, 0xAA, 0x82, 0x9F, 0x16, 0x02, 0x66, 0x50, 0x06, + 0x67, 0xE0, 0xA9, 0x9F, 0x0A, 0xAA, 0x67, 0xB0, 0x06, 0x67, 0x30, 0x06, + 0x20, 0xB0, 0x8C, 0xA4, 0x91, 0xA7, 0x59, 0x48, 0x7F, 0x77, 0xB9, 0x89, + 0x7F, 0x8A, 0x88, 0x0F, 0x47, 0x94, 0x2C, 0xB7, 0xA0, 0xBC, 0xA0, 0x5F, + 0x27, 0xD0, 0x04, 0x88, 0x7A, 0xAB, 0x88, 0x1A, 0x05, 0x4F, 0x80, 0x05, + 0x5C, 0x70, 0x0C, 0x92, 0x4A, 0xA6, 0xEF, 0x90, 0x0F, 0x98, 0xAA, 0x82, + 0x18, 0x28, 0x10, 0x60, 0x10, 0xAA, 0xC9, 0xAA, 0xAC, 0x66, 0xF0, 0x01, + 0x14, 0x96, 0xAA, 0xF2, 0xF7, 0x8B, 0xF6, 0x67, 0x7F, 0xCE, 0x67, 0x9E, + 0x86, 0xF7, 0xAA, 0x9F, 0x28, 0xAB, 0xBB, 0x40, 0xAB, 0x32, 0xA1, 0x00, + 0x88, 0xBA, 0x04, 0xAB, 0xE6, 0xAD, 0x4C, 0xF0, 0x04, 0x57, 0x00, 0xA6, + 0xC0, 0xCA, 0x0E, 0xF5, 0xB0, 0x9F, 0xC4, 0xEA, 0x7E, 0x3A, 0x53, 0x00, + 0xCA, 0xEA, 0xAE, 0xC9, 0x3A, 0x06, 0x1E, 0xE0, 0xAC, 0x27, 0xEA, 0x76, + 0x7C, 0x3A, 0xAD, 0xEF, 0xC8, 0xA2, 0xAF, 0xA9, 0x9E, 0x13, 0x32, 0xAB, + 0x89, 0x27, 0x10, 0x87, 0xEA, 0xAD, 0x01, 0xBB, 0x04, 0x50, 0x90, 0x05, + 0xC3, 0x60, 0x0C, 0xCE, 0xF0, 0xA3, 0xD8, 0x79, 0xA9, 0xEA, 0xDA, 0x7E, + 0x3A, 0xD3, 0x00, 0xEF, 0x3A, 0xFE, 0xAA, 0xEF, 0xFA, 0xA9, 0x63, 0x70, + 0x5C, 0x3B, 0x83, 0x00, 0x3C, 0x60, 0x9A, 0xA6, 0x87, 0x89, 0xC6, 0x59, + 0x88, 0x79, 0x39, 0x87, 0x2D, 0x9A, 0x95, 0x7E, 0x49, 0xA8, 0xFE, 0x6A, + 0x12, 0x00, 0xFB, 0xAD, 0x27, 0x8B, 0xAB, 0x50, 0xD0, 0xAB, 0xCF, 0xC0, + 0x0D, 0x3F, 0xDA, 0x0E, 0x67, 0xCA, 0xB0, 0xB2, 0xA7, 0x33, 0x03, 0x20, + 0xB1, 0x35, 0x0B, 0xAA, 0xF1, 0x6A, 0x68, 0x33, 0x10, 0x9E, 0x82, 0x86, + 0x80, 0x85, 0x58, 0x79, 0xE3, 0x77, 0x96, 0xAE, 0x69, 0x90, 0x76, 0x57, + 0x15, 0x41, 0x10, 0x7E, 0xBA, 0x60, 0x82, 0x0D, 0x40, 0xB1, 0xD7, 0x31, + 0x34, 0x02, 0xAB, 0xA5, 0xE2, 0xDA, 0x05, 0x7B, 0x00, 0x0D, 0xD3, 0xA0, + 0x0D, 0xE8, 0x80, 0xAE, 0x31, 0xDB, 0x7E, 0x29, 0x05, 0x00, 0x63, 0x60, + 0xB3, 0x5D, 0xAB, 0x06, 0x5F, 0x50, 0xB1, 0x3B, 0x33, 0x01, 0x8B, 0xC9, + 0xB3, 0x64, 0x69, 0xA5, 0xAE, 0xBA, 0x84, 0x4D, 0xB7, 0x9C, 0x31, 0x19, + 0x7E, 0x3D, 0xD0, 0x3B, 0x0D, 0x20, 0x06, 0x66, 0xB0, 0xB4, 0x1A, 0xA3, + 0x6A, 0xE1, 0x8A, 0xA8, 0x4E, 0xF0, 0x04, 0x06, 0xDB, 0x0C, 0xD7, 0x60, + 0x0E, 0xF9, 0x89, 0xB5, 0xED, 0x77, 0x4F, 0x70, 0xAB, 0x06, 0x5D, 0x2B, + 0xB1, 0x68, 0x10, 0x06, 0x5F, 0x10, 0x02, 0x61, 0x4B, 0x1A, 0x06, 0xA0, + 0xB3, 0x19, 0x6B, 0x84, 0xED, 0xE8, 0x81, 0x96, 0x07, 0xB4, 0x1A, 0xE9, + 0x89, 0x1C, 0x49, 0xB4, 0x40, 0x50, 0x79, 0x89, 0x07, 0xB7, 0x68, 0x60, + 0x06, 0x68, 0x00, 0x06, 0x61, 0x9B, 0x00, 0x4D, 0x2B, 0xB0, 0x4C, 0x70, + 0xA3, 0xC3, 0x80, 0x0C, 0xD2, 0x90, 0x0D, 0x65, 0x9A, 0xAE, 0x7F, 0x1B, + 0x7A, 0xCE, 0x25, 0x10, 0x0D, 0x00, 0x06, 0x66, 0x40, 0xB8, 0xCA, 0xAA, + 0x06, 0x62, 0x30, 0x06, 0x5F, 0x00, 0x02, 0x1F, 0xFE, 0x50, 0xA7, 0x48, + 0x1A, 0x39, 0x38, 0xE0, 0xB8, 0xBA, 0xE3, 0x7D, 0xDA, 0xCA, 0x75, 0x30, + 0x6A, 0x9E, 0x1F, 0x5B, 0xB9, 0x2B, 0x97, 0xA0, 0xFC, 0xAA, 0xAD, 0x39, + 0x70, 0xAA, 0x06, 0xE0, 0x01, 0x9D, 0x8B, 0x06, 0xD1, 0x3B, 0x06, 0x89, + 0x5B, 0x69, 0xA2, 0x1B, 0xB0, 0x4C, 0x60, 0x05, 0x5B, 0x70, 0x0C, 0xCD, + 0x60, 0x0D, 0xE7, 0xE0, 0xB7, 0xAC, 0x5B, 0x7C, 0x2C, 0xD4, 0x00, 0x6F, + 0x2A, 0xBB, 0xB3, 0x7B, 0x06, 0x6A, 0x50, 0xBB, 0x87, 0x0B, 0x06, 0x21, + 0xF0, 0x01, 0xED, 0xFB, 0x01, 0x0D, 0x70, 0xAA, 0xA9, 0xA5, 0x70, 0xBF, + 0x4B, 0x30, 0x94, 0xA7, 0x9A, 0xCD, 0x17, 0x94, 0xAE, 0x59, 0x99, 0xF3, + 0x48, 0xB4, 0x55, 0xB1, 0xA0, 0xBB, 0x90, 0x03, 0xD3, 0x15, 0x02, 0xD1, + 0x4B, 0xC0, 0xD1, 0xFB, 0x05, 0xBA, 0x2B, 0x13, 0x0B, 0x70, 0x02, 0x4E, + 0x4B, 0xBA, 0x58, 0x40, 0x0C, 0xCA, 0x30, 0x0D, 0xDB, 0x80, 0x9D, 0xAB, + 0x0B, 0xBE, 0x8C, 0x77, 0x0F, 0xF7, 0x04, 0x00, 0x03, 0xF0, 0x01, 0x60, + 0x10, 0x06, 0x68, 0x40, 0xB8, 0x6A, 0x60, 0x06, 0x61, 0xA0, 0xBE, 0xB9, + 0xEB, 0xBE, 0xEE, 0x5B, 0xA7, 0x77, 0x6A, 0xB1, 0x3A, 0xFB, 0x42, 0x8F, + 0x89, 0x7A, 0x41, 0xA9, 0x7A, 0x96, 0xDB, 0xBF, 0x38, 0xC0, 0x96, 0x4A, + 0x57, 0x6E, 0x77, 0x2A, 0x00, 0x5F, 0x50, 0xC0, 0x05, 0x1C, 0x06, 0x60, + 0xF0, 0xBE, 0xD7, 0xE1, 0xB4, 0x35, 0x9A, 0x05, 0x90, 0xCA, 0x0D, 0xD9, + 0x50, 0xA9, 0x57, 0x55, 0xC1, 0x7D, 0xA7, 0x0E, 0xC0, 0xD9, 0x00, 0x1F, + 0xF0, 0xA6, 0x62, 0x30, 0xB8, 0xB4, 0x0B, 0xC2, 0x69, 0x10, 0x06, 0xB7, + 0xBB, 0xBE, 0x25, 0x6C, 0xC5, 0xBA, 0x1B, 0xBF, 0x14, 0x66, 0x00, 0x13, + 0x80, 0xB1, 0xF5, 0xFB, 0x98, 0xF7, 0x9A, 0xAF, 0xB1, 0x9A, 0xBC, 0xFE, + 0xE3, 0x16, 0x04, 0x30, 0x2A, 0x04, 0x14, 0x90, 0x66, 0x1E, 0x20, 0x06, + 0x39, 0xAC, 0xC3, 0x88, 0x8B, 0xC0, 0x26, 0xC1, 0x00, 0x01, 0x7B, 0xAB, + 0x51, 0x40, 0xAE, 0xBF, 0xFA, 0xA3, 0xEE, 0x00, 0xB3, 0x47, 0xCC, 0x77, + 0xEA, 0x90, 0x3A, 0x26, 0xB1, 0xC4, 0x20, 0x00, 0x06, 0x70, 0x1A, 0x06, + 0x66, 0x60, 0x06, 0x69, 0x90, 0x06, 0x62, 0x20, 0xC2, 0x54, 0x3C, 0xA7, + 0x57, 0x6C, 0xC2, 0xF0, 0x8B, 0x70, 0x08, 0x30, 0xB6, 0xF4, 0xAB, 0x12, + 0xC6, 0xD9, 0xAA, 0x5E, 0xC8, 0x84, 0xFD, 0x8B, 0x7E, 0x42, 0x60, 0x04, + 0x42, 0x60, 0x03, 0xF0, 0x96, 0xC1, 0x38, 0xCC, 0xC6, 0x05, 0x2C, 0x06, + 0xB8, 0xDB, 0xBE, 0x15, 0x2B, 0x00, 0x17, 0x30, 0xBA, 0x4F, 0x50, 0xAE, + 0xD5, 0x90, 0xA1, 0xFA, 0xA9, 0xC7, 0xB2, 0xA7, 0xA6, 0x3B, 0xD3, 0x00, + 0x1E, 0xF0, 0x01, 0x21, 0x10, 0x02, 0x60, 0x80, 0xCB, 0x5F, 0x80, 0xCB, + 0xB8, 0x0C, 0x02, 0xEC, 0x7B, 0xC5, 0x75, 0xEA, 0xC8, 0xA9, 0x35, 0x00, + 0x18, 0xC0, 0x01, 0xC0, 0x69, 0x68, 0x90, 0x8C, 0x03, 0x7A, 0x9A, 0x12, + 0x84, 0x58, 0xC9, 0x74, 0x28, 0x1C, 0x98, 0x9C, 0xC9, 0x1E, 0x49, 0x01, + 0x9E, 0x9C, 0xC1, 0x21, 0xB0, 0xC6, 0xA1, 0x2C, 0xCA, 0xBA, 0x4C, 0xC2, + 0x61, 0x9B, 0xA5, 0x4B, 0xC0, 0x04, 0x4F, 0x9B, 0x68, 0xC5, 0x00, 0xAC, + 0xEA, 0x60, 0x0F, 0x14, 0xFC, 0xCA, 0x7D, 0x27, 0x0D, 0xC6, 0x9C, 0xC1, + 0xB3, 0xCC, 0xC8, 0x25, 0xEC, 0x01, 0xEF, 0x0C, 0xBF, 0x59, 0x3C, 0x36, + 0x1A, 0x10, 0xB0, 0x19, 0xC0, 0x00, 0x28, 0x6C, 0x63, 0xEC, 0x31, 0x01, + 0xC9, 0x6C, 0x04, 0xE0, 0xB7, 0x74, 0xAE, 0x39, 0xA5, 0xD0, 0x2C, 0x86, + 0x63, 0xA8, 0x83, 0x33, 0x50, 0x22, 0xF8, 0x0C, 0x00, 0x1E, 0xD0, 0xC1, + 0xD8, 0x5C, 0xFE, 0xC0, 0x52, 0x3C, 0x06, 0x60, 0x40, 0xC2, 0x3D, 0x3C, + 0xA3, 0xD6, 0x0B, 0xB5, 0xE2, 0x3C, 0xA6, 0xE4, 0x6C, 0xCE, 0xE7, 0xCC, + 0x77, 0xF7, 0x50, 0x0C, 0xEA, 0x0C, 0x4B, 0x03, 0x00, 0xD2, 0xF1, 0x0C, + 0xD2, 0xDE, 0xA6, 0x00, 0xDD, 0xFC, 0xC3, 0x4B, 0xA0, 0x01, 0xB7, 0x26, + 0x6F, 0x08, 0x40, 0x03, 0x2D, 0x4D, 0x03, 0xF7, 0x36, 0xC6, 0xD0, 0x1C, + 0x04, 0x2D, 0x3D, 0x03, 0x15, 0x40, 0x69, 0xC2, 0xAC, 0xC6, 0x0C, 0xCD, + 0xC6, 0x88, 0xFC, 0x05, 0xB8, 0xEB, 0xCB, 0x1F, 0x70, 0xAA, 0xDD, 0x8A, + 0xA8, 0x15, 0xED, 0x0C, 0xD2, 0x40, 0xA6, 0x57, 0xAB, 0xD1, 0xC4, 0x77, + 0x0F, 0xCD, 0xD0, 0xC7, 0x08, 0x57, 0x69, 0x0C, 0x40, 0xCF, 0x27, 0xED, + 0xB4, 0xB6, 0x66, 0x01, 0x37, 0x2D, 0xCC, 0x23, 0xAD, 0x23, 0x0B, 0x50, + 0x01, 0x14, 0xC0, 0xD5, 0x2E, 0xDD, 0xD2, 0x3C, 0x22, 0x1C, 0x35, 0xE0, + 0xD5, 0x5C, 0x3D, 0xCD, 0x15, 0xF0, 0x5E, 0x08, 0x2D, 0xCC, 0x60, 0x10, + 0xB7, 0x3A, 0x9D, 0xC3, 0x88, 0xAC, 0xBE, 0x55, 0xDC, 0xBE, 0xF2, 0x3A, + 0x2D, 0x43, 0xED, 0xA8, 0xBF, 0x3A, 0xA6, 0xE7, 0x9A, 0xD1, 0x49, 0x6D, + 0xC1, 0xDC, 0xB0, 0x05, 0x4B, 0xE0, 0xD1, 0x14, 0x96, 0x00, 0x09, 0x70, + 0x01, 0x19, 0xF0, 0xC3, 0xDF, 0x2C, 0xD5, 0x28, 0xBB, 0x04, 0x27, 0x90, + 0x01, 0x0A, 0x90, 0x65, 0x4E, 0xED, 0xD8, 0x8F, 0xDD, 0x00, 0x61, 0xA0, + 0x06, 0x6C, 0xCD, 0xB9, 0x87, 0x2C, 0xC2, 0x3D, 0x0D, 0xD1, 0x3F, 0x0D, + 0xD4, 0x01, 0x82, 0xA8, 0x5E, 0xEA, 0xAB, 0x08, 0x2B, 0xC1, 0xF1, 0x60, + 0xC4, 0x7A, 0x4D, 0x7C, 0xDB, 0x80, 0x0D, 0xC7, 0x90, 0x05, 0x4F, 0xF0, + 0x04, 0x4E, 0x90, 0xD8, 0x4B, 0x10, 0x05, 0x4F, 0x9B, 0xAB, 0x87, 0xED, + 0xCD, 0x52, 0x9D, 0xAB, 0xDF, 0xFE, 0x7C, 0xAB, 0x23, 0x7A, 0x01, 0x09, + 0x30, 0x00, 0x68, 0xFD, 0xD8, 0x8F, 0x4D, 0x00, 0x18, 0xAC, 0x65, 0x0A, + 0x3D, 0xD9, 0xA1, 0x5C, 0xC8, 0x69, 0x30, 0x06, 0x22, 0x7C, 0xB8, 0xB8, + 0xDB, 0xCB, 0x25, 0xBC, 0xDB, 0xBE, 0xF3, 0xB4, 0x04, 0x2B, 0xC4, 0x09, + 0x6B, 0x0F, 0x0B, 0x4B, 0xDA, 0x01, 0xC8, 0x0F, 0xEF, 0x80, 0x0E, 0xA6, + 0x2D, 0x0D, 0xCE, 0xE0, 0x18, 0x5C, 0xB0, 0x05, 0x57, 0x70, 0x05, 0x54, + 0x10, 0x05, 0x4C, 0x60, 0xD8, 0xB2, 0x6D, 0xDE, 0x02, 0x9B, 0xD2, 0x0C, + 0xF0, 0xD7, 0xBD, 0xBD, 0x6C, 0x05, 0xD0, 0x01, 0x51, 0xAD, 0xA5, 0x1E, + 0x35, 0x15, 0xAB, 0xD2, 0x00, 0x5F, 0x60, 0xC8, 0x86, 0x2C, 0x06, 0xF9, + 0x9D, 0xC8, 0xB7, 0x8B, 0xD9, 0x73, 0x1A, 0xD1, 0xED, 0x7B, 0xAA, 0x1C, + 0xF0, 0xAD, 0x74, 0x8C, 0x05, 0xC5, 0xA0, 0x0C, 0x2D, 0xEB, 0xBD, 0xF8, + 0x40, 0xDD, 0xD5, 0x1D, 0x80, 0xFE, 0x80, 0x0F, 0xED, 0x00, 0x23, 0xD8, + 0x80, 0x18, 0x4D, 0x71, 0x0C, 0x7B, 0xB0, 0x05, 0x5D, 0x90, 0xDA, 0xAB, + 0x3D, 0xDE, 0xE5, 0x5D, 0xDE, 0x27, 0x1D, 0xDB, 0xB8, 0x2A, 0xC7, 0x5A, + 0xBA, 0x03, 0x1C, 0x80, 0x01, 0x17, 0xA0, 0x00, 0xEB, 0xED, 0xD8, 0x09, + 0xA0, 0x00, 0x17, 0x80, 0x01, 0x1B, 0xA0, 0xA5, 0x1F, 0xAE, 0xA5, 0x1B, + 0x00, 0xDC, 0x26, 0x51, 0x00, 0x21, 0xF0, 0x05, 0xC9, 0x7D, 0xE3, 0x3D, + 0x8D, 0xD9, 0x10, 0xDD, 0xCB, 0x9A, 0xDD, 0xAC, 0x26, 0xB1, 0x03, 0xAB, + 0x66, 0x05, 0x5A, 0xB0, 0x07, 0xC6, 0xC0, 0x0C, 0x63, 0x5A, 0xA6, 0xBC, + 0xC9, 0xE0, 0x2A, 0x78, 0x13, 0xF6, 0x80, 0xDD, 0xE6, 0x90, 0x0D, 0xD5, + 0x20, 0x0D, 0xCD, 0xA0, 0x0C, 0xCF, 0x50, 0x0C, 0xA9, 0xE0, 0xDD, 0x58, + 0x90, 0x05, 0x56, 0x60, 0x05, 0x50, 0xC0, 0xA5, 0xFE, 0x4C, 0x00, 0xE3, + 0x0C, 0x7C, 0xDE, 0x3F, 0xAC, 0x01, 0x27, 0x50, 0xE2, 0x2C, 0xDE, 0x01, + 0x05, 0x10, 0xD8, 0x6B, 0x5E, 0x00, 0x0A, 0xE0, 0xE6, 0x0C, 0x70, 0x01, + 0x71, 0xCE, 0x01, 0x1A, 0x10, 0xD5, 0x1D, 0x7E, 0xBD, 0x01, 0xBB, 0x01, + 0xF2, 0x4D, 0x1A, 0x02, 0xF0, 0xC7, 0x73, 0xCA, 0xCB, 0x73, 0x6A, 0xCB, + 0xBF, 0x7C, 0xAA, 0x07, 0xF0, 0xAD, 0x8D, 0x3A, 0x0C, 0xC3, 0xA0, 0x0C, + 0xD1, 0xE0, 0xB2, 0x48, 0xBD, 0xE4, 0x40, 0x28, 0x3C, 0xF8, 0xE0, 0x0E, + 0xEA, 0x70, 0x0E, 0xA6, 0x5D, 0x0D, 0x88, 0x51, 0xE5, 0x56, 0x2E, 0xA1, + 0x5B, 0xA0, 0xE5, 0x57, 0xE0, 0x05, 0xAB, 0xED, 0x04, 0xE4, 0x6D, 0xE7, + 0x63, 0xEE, 0xAD, 0x61, 0x2E, 0xB0, 0xE0, 0x2A, 0xEA, 0x77, 0x2E, 0xD5, + 0x49, 0x70, 0x01, 0x56, 0x3D, 0x00, 0xEC, 0xDC, 0xCE, 0xA5, 0x9C, 0xC5, + 0x84, 0xDD, 0xA8, 0x5B, 0x90, 0x0A, 0xCF, 0x00, 0x0D, 0xD6, 0x40, 0xA6, + 0x78, 0xBC, 0xE0, 0x8D, 0xCE, 0xE4, 0xFC, 0x80, 0x0F, 0xEF, 0xC0, 0x0E, + 0xEB, 0x42, 0xE9, 0xDC, 0xC0, 0x0D, 0xCE, 0xF0, 0x0C, 0xC6, 0x70, 0x0C, + 0xC5, 0xE0, 0xDD, 0x5B, 0xA0, 0xE9, 0x59, 0x70, 0x05, 0xAA, 0xED, 0xE5, + 0xE4, 0xDD, 0x04, 0xA1, 0x6E, 0xB7, 0xA3, 0x7E, 0xD8, 0xD4, 0x7E, 0xEA, + 0xA2, 0x9E, 0x01, 0x7F, 0xDD, 0xEA, 0xAE, 0x1E, 0xD7, 0xC1, 0x2C, 0x13, + 0x0C, 0x40, 0xBA, 0x39, 0x5A, 0xEB, 0xC0, 0x7A, 0x0E, 0x13, 0xCC, 0xEB, + 0x90, 0x88, 0x13, 0xF6, 0x40, 0x0F, 0xEC, 0xA0, 0x27, 0x50, 0x8E, 0x0D, + 0xD4, 0x20, 0x0D, 0xC5, 0x6E, 0xEC, 0xC8, 0x8E, 0xE5, 0xCB, 0x8E, 0xE1, + 0xCE, 0xFE, 0x04, 0x50, 0xC0, 0xEF, 0x9F, 0x0E, 0xE6, 0xB3, 0x9D, 0xED, + 0xD9, 0xDE, 0xE1, 0xD8, 0x5E, 0xED, 0x78, 0x8E, 0x01, 0xF2, 0xFC, 0xFE, + 0x6D, 0x16, 0x60, 0xA3, 0x3A, 0x3A, 0x0C, 0xCB, 0x20, 0xA9, 0xD2, 0x1D, + 0x5F, 0xE9, 0x1E, 0x89, 0xC2, 0x73, 0x0F, 0x4E, 0xEE, 0xEE, 0x7B, 0xA2, + 0x0D, 0xD8, 0x50, 0xE9, 0xC4, 0xEE, 0x0C, 0xC6, 0xFE, 0x0C, 0xC9, 0x7E, + 0xE8, 0x16, 0xDE, 0x05, 0x18, 0x0E, 0xDE, 0x5D, 0xEE, 0xE9, 0xFE, 0x2E, + 0xED, 0x2F, 0x2E, 0xF0, 0xD7, 0x7E, 0xD2, 0xA0, 0xCE, 0x04, 0x51, 0xB0, + 0x6A, 0xB7, 0x1A, 0xE6, 0x32, 0x8E, 0xF0, 0x86, 0x96, 0x00, 0x1B, 0xE0, + 0xA5, 0x5B, 0x30, 0x0C, 0x14, 0x6A, 0x9F, 0xDA, 0x70, 0xEE, 0x42, 0x2A, + 0xF1, 0xCD, 0x78, 0x17, 0x15, 0xDF, 0x30, 0xEE, 0x2E, 0xEC, 0xD9, 0xA0, + 0xF1, 0xF3, 0xCE, 0x0D, 0x0D, 0xF2, 0xF1, 0xC9, 0x4E, 0x0C, 0x5C, 0xB0, + 0xEC, 0x9B, 0x5E, 0x05, 0xCF, 0xBE, 0xEF, 0x4F, 0xC0, 0xA5, 0xD3, 0x4E, + 0xDE, 0x00, 0x1F, 0xF0, 0x1E, 0x0E, 0xEA, 0x36, 0xFA, 0x04, 0x5E, 0x70, + 0x05, 0x5A, 0xA0, 0x05, 0xA9, 0xFD, 0xE9, 0xA4, 0x2E, 0x34, 0x18, 0x60, + 0x01, 0xCD, 0x9D, 0x5A, 0xA7, 0xBC, 0x04, 0xE3, 0xFA, 0xA8, 0xC5, 0xE0, + 0x35, 0xD2, 0x40, 0x9D, 0xE9, 0xC0, 0x0E, 0xEF, 0x10, 0xF1, 0x41, 0xEF, + 0x8C, 0x0F, 0xC4, 0xEE, 0x36, 0xF5, 0xEE, 0xE4, 0xA0, 0x0D, 0x8E, 0x55, + 0x0D, 0xD4, 0xC0, 0xF1, 0xCE, 0x10, 0x65, 0x4F, 0x41, 0x0C, 0xC5, 0xB0, + 0x07, 0x7B, 0x40, 0x0C, 0x87, 0xAE, 0xE9, 0x5A, 0x80, 0x05, 0xE0, 0x4D, + 0xF5, 0xFD, 0x1E, 0xED, 0x2E, 0xFF, 0xEF, 0xE7, 0xED, 0xF2, 0x4E, 0xE0, + 0xF5, 0x57, 0x90, 0x05, 0x3A, 0xFA, 0xA8, 0x8A, 0x2F, 0x9F, 0xC7, 0x90, + 0xE5, 0x5C, 0xEE, 0xE5, 0xAF, 0x6D, 0xE7, 0x1A, 0xC0, 0x01, 0x71, 0x9E, + 0x01, 0x84, 0x0D, 0x05, 0x4F, 0x50, 0x05, 0x8F, 0xEA, 0xAB, 0xF4, 0x19, + 0x0D, 0x93, 0xFE, 0x0A, 0xA4, 0xF9, 0x99, 0xD7, 0x78, 0x6F, 0x8A, 0x56, + 0x94, 0x0F, 0x15, 0xCF, 0x30, 0xC4, 0xD2, 0xF7, 0xDB, 0x90, 0xF1, 0xD5, + 0x10, 0xF8, 0x0C, 0xC2, 0x0C, 0xD0, 0xF0, 0x0C, 0xCF, 0x40, 0x0C, 0xC9, + 0x40, 0x0C, 0x89, 0x0F, 0xF5, 0x59, 0xDE, 0x05, 0x5A, 0xEE, 0xEC, 0x90, + 0xAF, 0xDA, 0xFB, 0xCE, 0xEF, 0x50, 0x80, 0xF9, 0xD4, 0x8F, 0xF9, 0x5D, + 0x1A, 0x05, 0xD5, 0x3F, 0xFD, 0x52, 0x00, 0xF9, 0x10, 0xDA, 0xF9, 0xC5, + 0x20, 0x9F, 0xF5, 0xC9, 0x0D, 0xF1, 0x64, 0x0D, 0x49, 0xC1, 0x14, 0xC9, + 0x9F, 0xE5, 0xCE, 0xFF, 0xFC, 0x9A, 0xBF, 0xF9, 0x23, 0xCF, 0x05, 0x45, + 0x8E, 0x0C, 0xF4, 0x29, 0x9D, 0xD4, 0x79, 0x0E, 0xEB, 0xE0, 0x0E, 0xF6, + 0x90, 0x0F, 0xBB, 0x6E, 0xFB, 0xF9, 0x48, 0x43, 0x54, 0x23, 0x41, 0x14, + 0x05, 0x10, 0xE9, 0xCC, 0x6D, 0xDB, 0xA6, 0x0D, 0x1B, 0xB6, 0x6A, 0xD3, + 0xA4, 0x71, 0x83, 0x06, 0xCD, 0x99, 0x33, 0x65, 0xCF, 0x8C, 0x1D, 0x3B, + 0x96, 0xEA, 0xD8, 0xB0, 0x61, 0x5C, 0xF6, 0x60, 0xD4, 0x82, 0xC5, 0xE3, + 0xB0, 0x2A, 0x57, 0xAA, 0x60, 0xC9, 0xE2, 0xC5, 0xCA, 0x15, 0x94, 0x28, + 0x4B, 0x66, 0x19, 0x89, 0x45, 0xCB, 0x16, 0x98, 0xC3, 0x2C, 0x1E, 0x5B, + 0xB6, 0xAC, 0xE1, 0xB4, 0x6B, 0xD9, 0xB6, 0x99, 0x53, 0xA7, 0x0E, 0xDD, + 0x39, 0x72, 0x07, 0x15, 0x72, 0x83, 0x18, 0xF1, 0xD9, 0x51, 0xA4, 0xCA, + 0x1E, 0x72, 0x93, 0x46, 0xED, 0xE0, 0xCE, 0x74, 0xEC, 0xDE, 0xE1, 0xDB, + 0xC7, 0xAF, 0xDF, 0x55, 0xAC, 0x59, 0xB5, 0x6E, 0xE5, 0xDA, 0xD5, 0xEB, + 0x57, 0xB0, 0x61, 0xC5, 0x8E, 0x25, 0x5B, 0xD6, 0xEC, 0x59, 0xB4, 0x69, + 0xD5, 0xAE, 0x65, 0xDB, 0xD6, 0xED, 0x5B, 0xB8, 0x71, 0xE5, 0xCE, 0xA5, + 0x5B, 0xF7, 0xAA, 0x3F, 0x7E, 0xFE, 0xF7, 0xEE, 0xD9, 0xB3, 0xF7, 0xAE, + 0x1D, 0x3B, 0x76, 0xE8, 0x04, 0x96, 0x23, 0x98, 0xCD, 0x9A, 0xB5, 0x6A, + 0xD4, 0xA4, 0x2D, 0x24, 0xEA, 0x6C, 0x59, 0xC4, 0x89, 0x14, 0x87, 0x15, + 0xA3, 0xBC, 0x87, 0xCB, 0xB0, 0x3D, 0x5B, 0xB8, 0x70, 0x81, 0xD9, 0xD9, + 0x33, 0xE6, 0x62, 0x32, 0x8B, 0x1D, 0x33, 0xF6, 0xEC, 0x61, 0x34, 0x6A, + 0xD6, 0xAE, 0x69, 0x33, 0x17, 0xD5, 0x9D, 0xBD, 0x7B, 0xFC, 0xF2, 0xE2, + 0xA3, 0xF7, 0xF7, 0xA7, 0x39, 0x72, 0xDB, 0xB2, 0x65, 0x3B, 0x88, 0x2D, + 0x9B, 0x36, 0x82, 0xE6, 0xCE, 0xA5, 0x43, 0x27, 0x95, 0x1E, 0x55, 0xAB, + 0x76, 0x95, 0x2F, 0x67, 0xDE, 0xDC, 0xF9, 0x73, 0xE8, 0xD1, 0xA5, 0x4F, + 0xA7, 0x5E, 0x7D, 0x2E, 0xDE, 0x7D, 0xF7, 0xF0, 0xF5, 0x7D, 0x07, 0x18, + 0xDD, 0xED, 0xDC, 0xBA, 0x0F, 0x56, 0x4B, 0x38, 0x94, 0x1B, 0xB7, 0x65, + 0x0F, 0x95, 0x45, 0x44, 0x36, 0x51, 0x22, 0x2A, 0x8A, 0xF1, 0xE5, 0x97, + 0x4E, 0x85, 0x2C, 0x99, 0xD2, 0x66, 0xD0, 0xA6, 0x55, 0xCB, 0xB9, 0xED, + 0x5C, 0xF1, 0x77, 0xEA, 0xB9, 0xC7, 0x9F, 0xAC, 0x08, 0xEC, 0x87, 0x1F, + 0xEC, 0xB4, 0xE3, 0x8B, 0x9E, 0x05, 0xE9, 0x71, 0xD0, 0x1E, 0x7C, 0xF4, + 0x42, 0xD0, 0x3A, 0x0A, 0x2B, 0xB4, 0xF0, 0x42, 0x0C, 0x33, 0xD4, 0x70, + 0x43, 0x0E, 0xA3, 0xF3, 0x27, 0x41, 0x7C, 0xF0, 0xA9, 0x87, 0x1E, 0xC0, + 0x02, 0x4B, 0xE7, 0x1C, 0x73, 0x06, 0x2A, 0x88, 0x37, 0xC4, 0xA8, 0xA1, + 0x66, 0x1A, 0xF3, 0xCE, 0x6B, 0xAC, 0x99, 0x87, 0x6A, 0x7C, 0x88, 0x19, + 0x66, 0x9C, 0x39, 0x2F, 0x9A, 0x69, 0xA8, 0xA9, 0xC6, 0x1A, 0x6C, 0xB6, + 0x29, 0x87, 0x38, 0xA9, 0x04, 0x9C, 0xD0, 0x2C, 0x03, 0x3B, 0x54, 0x72, + 0x49, 0x26, 0x9B, 0x74, 0xF2, 0x49, 0x28, 0xA3, 0xE9, 0x44, 0x0B, 0x2F, + 0x7E, 0xF6, 0x89, 0x90, 0xAF, 0x77, 0xFC, 0x62, 0x67, 0x1D, 0x9F, 0xCE, + 0xF1, 0xB2, 0x1C, 0x15, 0xB5, 0xE1, 0x6D, 0x3C, 0xF2, 0xCA, 0x4C, 0xCC, + 0x45, 0x17, 0xCD, 0xBC, 0xC6, 0xB7, 0x6D, 0xC8, 0x29, 0x67, 0x38, 0x75, + 0xDA, 0x99, 0x2A, 0x36, 0x29, 0xEB, 0xB4, 0xF3, 0x4E, 0x3C, 0xF3, 0xD4, + 0x73, 0x4F, 0x0F, 0xF3, 0xC9, 0x4B, 0x41, 0xEE, 0xDA, 0x69, 0x67, 0x9D, + 0xC0, 0xBE, 0xF3, 0x32, 0x45, 0x44, 0x55, 0x24, 0x68, 0xD1, 0x45, 0x53, + 0x04, 0xD3, 0x1C, 0x74, 0xD4, 0x59, 0x47, 0x4E, 0x08, 0xE9, 0xE4, 0xF3, + 0x52, 0x4C, 0x33, 0xD5, 0x74, 0x53, 0x4E, 0x9D, 0x24, 0x90, 0x40, 0xD9, + 0xB2, 0x0B, 0x71, 0xC1, 0x77, 0xDC, 0x31, 0xF5, 0x2F, 0x76, 0x7A, 0xEA, + 0xE9, 0x3B, 0x56, 0x59, 0x55, 0xA7, 0x44, 0x77, 0xDE, 0xA1, 0xA7, 0x9E, + 0x08, 0x8F, 0xEC, 0xF4, 0x56, 0x5C, 0x73, 0xD5, 0x75, 0x57, 0x5E, 0xD7, + 0xFA, 0xD0, 0xCF, 0x7B, 0xF2, 0xD1, 0x2B, 0xC4, 0xED, 0xEC, 0x71, 0x50, + 0xD6, 0x00, 0xB3, 0xAC, 0x67, 0x59, 0xBE, 0x42, 0x8C, 0x4D, 0xB6, 0x24, + 0x7B, 0x95, 0x76, 0x5A, 0x6A, 0xAB, 0xB5, 0xF6, 0x52, 0x50, 0x65, 0xD3, + 0xB6, 0xCA, 0x7F, 0xF2, 0xD2, 0x87, 0x9F, 0x6F, 0xA1, 0xBD, 0x76, 0x5C, + 0x72, 0xCB, 0x35, 0xF7, 0x5C, 0x74, 0xD3, 0x55, 0x77, 0x5D, 0x76, 0xDB, + 0x75, 0xF7, 0x5D, 0x78, 0xE3, 0x95, 0x77, 0x5E, 0x7A, 0xEB, 0xB5, 0xF7, + 0x5E, 0x7C, 0xF3, 0xD5, 0x77, 0x5F, 0x7E, 0xFB, 0xF5, 0xF7, 0x5F, 0x80, + 0x03, 0x16, 0x78, 0x60, 0x82, 0x0B, 0x36, 0xF8, 0x60, 0x84, 0x13, 0x3E, + 0x38, 0x20, 0x00, 0x3B + }, + NetscapeImage[] = + { + 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0xd8, 0x00, 0x90, 0x00, 0xf7, 0x00, + 0x00, 0xcc, 0xff, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0x99, 0x00, 0xcc, 0x66, + 0x00, 0xcc, 0x33, 0x00, 0xcc, 0x00, 0x00, 0x99, 0x00, 0x00, 0x99, 0x33, + 0x00, 0x99, 0x66, 0x00, 0x99, 0x99, 0x00, 0x99, 0xcc, 0x00, 0x99, 0xff, + 0x00, 0x00, 0xff, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x99, 0x00, 0x00, 0x66, + 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xff, 0x33, 0xcc, 0xcc, + 0x33, 0xcc, 0x99, 0x33, 0xcc, 0x66, 0x33, 0xcc, 0x33, 0x33, 0xcc, 0x00, + 0x33, 0x99, 0x00, 0x33, 0x99, 0x33, 0x33, 0x99, 0x66, 0x33, 0x99, 0x99, + 0x33, 0x99, 0xcc, 0x33, 0x99, 0xff, 0x33, 0x00, 0xff, 0x33, 0x00, 0xcc, + 0x33, 0x00, 0x99, 0x33, 0x00, 0x66, 0x33, 0x00, 0x33, 0x33, 0x00, 0x00, + 0x33, 0xcc, 0xff, 0x66, 0xcc, 0xcc, 0x66, 0xcc, 0x99, 0x66, 0xcc, 0x66, + 0x66, 0xcc, 0x33, 0x66, 0xcc, 0x00, 0x66, 0x99, 0x00, 0x66, 0x99, 0x33, + 0x66, 0x99, 0x66, 0x66, 0x99, 0x99, 0x66, 0x99, 0xcc, 0x66, 0x99, 0xff, + 0x66, 0x00, 0xff, 0x66, 0x00, 0xcc, 0x66, 0x00, 0x99, 0x66, 0x00, 0x66, + 0x66, 0x00, 0x33, 0x66, 0x00, 0x00, 0x66, 0xcc, 0xff, 0x99, 0xcc, 0xcc, + 0x99, 0xcc, 0x99, 0x99, 0xcc, 0x66, 0x99, 0xcc, 0x33, 0x99, 0xcc, 0x00, + 0x99, 0x99, 0x00, 0x99, 0x99, 0x33, 0x99, 0x99, 0x66, 0x99, 0x99, 0x99, + 0x99, 0x99, 0xcc, 0x99, 0x99, 0xff, 0x99, 0x00, 0xff, 0x99, 0x00, 0xcc, + 0x99, 0x00, 0x99, 0x99, 0x00, 0x66, 0x99, 0x00, 0x33, 0x99, 0x00, 0x00, + 0x99, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x99, 0xcc, 0xcc, 0x66, + 0xcc, 0xcc, 0x33, 0xcc, 0xcc, 0x00, 0xcc, 0x99, 0x00, 0xcc, 0x99, 0x33, + 0xcc, 0x99, 0x66, 0xcc, 0x99, 0x99, 0xcc, 0x99, 0xcc, 0xcc, 0x99, 0xff, + 0xcc, 0x00, 0xff, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0x99, 0xcc, 0x00, 0x66, + 0xcc, 0x00, 0x33, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xff, 0xff, 0xcc, 0xcc, + 0xff, 0xcc, 0x99, 0xff, 0xcc, 0x66, 0xff, 0xcc, 0x33, 0xff, 0xcc, 0x00, + 0xff, 0x99, 0x00, 0xff, 0x99, 0x33, 0xff, 0x99, 0x66, 0xff, 0x99, 0x99, + 0xff, 0x99, 0xcc, 0xff, 0x99, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xcc, + 0xff, 0x00, 0x99, 0xff, 0x00, 0x66, 0xff, 0x00, 0x33, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xff, 0xff, 0x99, 0xff, 0xff, 0x66, + 0xff, 0xff, 0x33, 0xff, 0xff, 0x00, 0xff, 0x66, 0x00, 0xff, 0x66, 0x33, + 0xff, 0x66, 0x66, 0xff, 0x66, 0x99, 0xff, 0x66, 0xcc, 0xff, 0x66, 0xff, + 0xff, 0x33, 0xff, 0xff, 0x33, 0xcc, 0xff, 0x33, 0x99, 0xff, 0x33, 0x66, + 0xff, 0x33, 0x33, 0xff, 0x33, 0x00, 0xff, 0xff, 0xff, 0xcc, 0xff, 0xcc, + 0xcc, 0xff, 0x99, 0xcc, 0xff, 0x66, 0xcc, 0xff, 0x33, 0xcc, 0xff, 0x00, + 0xcc, 0x66, 0x00, 0xcc, 0x66, 0x33, 0xcc, 0x66, 0x66, 0xcc, 0x66, 0x99, + 0xcc, 0x66, 0xcc, 0xcc, 0x66, 0xff, 0xcc, 0x33, 0xff, 0xcc, 0x33, 0xcc, + 0xcc, 0x33, 0x99, 0xcc, 0x33, 0x66, 0xcc, 0x33, 0x33, 0xcc, 0x33, 0x00, + 0xcc, 0xff, 0xff, 0x99, 0xff, 0xcc, 0x99, 0xff, 0x99, 0x99, 0xff, 0x66, + 0x99, 0xff, 0x33, 0x99, 0xff, 0x00, 0x99, 0x66, 0x00, 0x99, 0x66, 0x33, + 0x99, 0x66, 0x66, 0x99, 0x66, 0x99, 0x99, 0x66, 0xcc, 0x99, 0x66, 0xff, + 0x99, 0x33, 0xff, 0x99, 0x33, 0xcc, 0x99, 0x33, 0x99, 0x99, 0x33, 0x66, + 0x99, 0x33, 0x33, 0x99, 0x33, 0x00, 0x99, 0xff, 0xff, 0x66, 0xff, 0xcc, + 0x66, 0xff, 0x99, 0x66, 0xff, 0x66, 0x66, 0xff, 0x33, 0x66, 0xff, 0x00, + 0x66, 0x66, 0x00, 0x66, 0x66, 0x33, 0x66, 0x66, 0x66, 0x66, 0x66, 0x99, + 0x66, 0x66, 0xcc, 0x66, 0x66, 0xff, 0x66, 0x33, 0xff, 0x66, 0x33, 0xcc, + 0x66, 0x33, 0x99, 0x66, 0x33, 0x66, 0x66, 0x33, 0x33, 0x66, 0x33, 0x00, + 0x66, 0xff, 0xff, 0x33, 0xff, 0xcc, 0x33, 0xff, 0x99, 0x33, 0xff, 0x66, + 0x33, 0xff, 0x33, 0x33, 0xff, 0x00, 0x33, 0x66, 0x00, 0x33, 0x66, 0x33, + 0x33, 0x66, 0x66, 0x33, 0x66, 0x99, 0x33, 0x66, 0xcc, 0x33, 0x66, 0xff, + 0x33, 0x33, 0xff, 0x33, 0x33, 0xcc, 0x33, 0x33, 0x99, 0x33, 0x33, 0x66, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x33, 0xff, 0xff, 0x00, 0xff, 0xcc, + 0x00, 0xff, 0x99, 0x00, 0xff, 0x66, 0x00, 0xff, 0x33, 0x00, 0xff, 0x00, + 0x00, 0x66, 0x00, 0x00, 0x66, 0x33, 0x00, 0x66, 0x66, 0x00, 0x66, 0x99, + 0x00, 0x66, 0xcc, 0x00, 0x66, 0xff, 0x00, 0x33, 0xff, 0x00, 0x33, 0xcc, + 0x00, 0x33, 0x99, 0x00, 0x33, 0x66, 0x00, 0x33, 0x33, 0x00, 0x33, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x21, 0xfe, 0x1b, 0x20, 0x20, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x47, 0x49, 0x46, 0x20, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x00, 0xd8, 0x00, 0x90, 0x00, 0x40, 0x08, 0xfe, 0x00, 0x01, 0x08, 0x1c, + 0x48, 0x50, 0x60, 0x80, 0x83, 0x08, 0x13, 0x1e, 0x14, 0xc0, 0xb0, 0xa1, + 0x43, 0x86, 0x03, 0x22, 0x4a, 0x9c, 0x18, 0x91, 0x80, 0xc5, 0x8b, 0x18, + 0x2d, 0x16, 0xd8, 0xc8, 0xb1, 0xe3, 0x46, 0x03, 0x20, 0x43, 0x8a, 0x04, + 0x79, 0xa0, 0xa4, 0xc9, 0x93, 0x25, 0x11, 0xa8, 0x5c, 0xc9, 0x52, 0x65, + 0x82, 0x97, 0x30, 0x63, 0xbe, 0x54, 0x40, 0xb3, 0xa6, 0x4d, 0x9a, 0x0b, + 0x72, 0xea, 0xdc, 0x99, 0x93, 0x81, 0xcf, 0x9f, 0x40, 0x7d, 0x36, 0x18, + 0x4a, 0xb4, 0xe8, 0x50, 0x07, 0x48, 0x93, 0x2a, 0x45, 0xfa, 0xa0, 0xa9, + 0xd3, 0xa7, 0x4d, 0x21, 0x48, 0x9d, 0x4a, 0x55, 0x6a, 0x84, 0xab, 0x58, + 0xb3, 0x5e, 0x2d, 0xc8, 0x15, 0x80, 0xc2, 0xaf, 0x01, 0x1e, 0x8a, 0x15, + 0x40, 0xb1, 0xec, 0x80, 0x8c, 0x68, 0x09, 0x78, 0x5c, 0x5b, 0x60, 0xa4, + 0x5b, 0x03, 0x28, 0xe3, 0x1e, 0x68, 0x49, 0x17, 0x81, 0xcc, 0xbb, 0x09, + 0x6e, 0xea, 0x55, 0xc0, 0xb3, 0xef, 0x82, 0xa0, 0x80, 0x19, 0x18, 0x1d, + 0xdc, 0x60, 0xa9, 0x61, 0x07, 0x50, 0x13, 0x3f, 0xa8, 0xca, 0x18, 0x82, + 0xd6, 0xc7, 0x11, 0x24, 0x48, 0x9e, 0x4c, 0x59, 0xf2, 0x84, 0xcb, 0x98, + 0x33, 0x5f, 0xa6, 0xc0, 0xb9, 0xb3, 0x67, 0xce, 0x15, 0x42, 0x8b, 0x1e, + 0x1d, 0xda, 0x82, 0xe9, 0xd3, 0xa8, 0x4d, 0x5f, 0x58, 0xcd, 0xba, 0xf5, + 0x6a, 0x0c, 0xb0, 0x63, 0xcb, 0x86, 0x9d, 0xa1, 0xb6, 0xed, 0xdb, 0xb5, + 0x35, 0xe8, 0xde, 0xcd, 0x5b, 0xf7, 0x86, 0xdf, 0xc0, 0x83, 0xff, 0xe6, + 0x40, 0xbc, 0xb8, 0x71, 0xe2, 0x1d, 0x92, 0x2b, 0x5f, 0x9e, 0xdc, 0x83, + 0xf3, 0xe7, 0xd0, 0x9d, 0x7f, 0x98, 0x4e, 0xbd, 0xfa, 0x74, 0x10, 0xd8, + 0xb3, 0x6b, 0xc7, 0x1e, 0xa2, 0xbb, 0xf7, 0xef, 0xdd, 0x45, 0xfe, 0x88, + 0x1f, 0x4f, 0x5e, 0xfc, 0x88, 0xf3, 0xe8, 0xd3, 0x9f, 0x27, 0xc1, 0xbe, + 0xbd, 0x7b, 0xf6, 0x25, 0xe2, 0xcb, 0x9f, 0x1f, 0xdf, 0x84, 0xfd, 0xfb, + 0xf8, 0xed, 0x9f, 0xd8, 0xcf, 0xbf, 0xff, 0x7e, 0x14, 0x00, 0x06, 0x28, + 0x20, 0x80, 0x29, 0x14, 0x68, 0xe0, 0x81, 0x05, 0xaa, 0xa0, 0xe0, 0x82, + 0x0c, 0x2a, 0xb8, 0xc2, 0x83, 0x10, 0x46, 0xf8, 0x20, 0x0b, 0x14, 0x56, + 0x68, 0x21, 0x85, 0x2d, 0x64, 0xa8, 0xe1, 0x86, 0x19, 0xba, 0xe0, 0xe1, + 0x87, 0x20, 0x7a, 0xf8, 0xc2, 0x88, 0x24, 0x96, 0x38, 0x22, 0x0c, 0x28, + 0xa6, 0xa8, 0x22, 0x8a, 0x31, 0xb4, 0xe8, 0xe2, 0x8b, 0x2d, 0xca, 0x20, + 0xe3, 0x8c, 0x34, 0xca, 0x38, 0xc3, 0x8d, 0x38, 0xe6, 0x78, 0x23, 0x0d, + 0x3c, 0xf6, 0xe8, 0x23, 0x8f, 0x35, 0x04, 0x29, 0xe4, 0x90, 0x41, 0xbe, + 0x67, 0x24, 0x09, 0xf4, 0x25, 0x59, 0x42, 0x7e, 0x4c, 0x9a, 0xe0, 0xdf, + 0x93, 0x27, 0x0c, 0x28, 0x25, 0x0a, 0x08, 0x56, 0x99, 0x42, 0x83, 0x58, + 0xaa, 0x20, 0xe1, 0x96, 0x2b, 0x5c, 0xe8, 0x25, 0x0b, 0x1c, 0x86, 0xd9, + 0x42, 0x88, 0x64, 0xba, 0x60, 0xe2, 0x99, 0x2f, 0xac, 0xa8, 0x26, 0x0c, + 0x30, 0xb6, 0x19, 0x43, 0x8d, 0x70, 0xca, 0xa0, 0xe3, 0x9c, 0x33, 0xfc, + 0x68, 0x27, 0x0d, 0x44, 0xe6, 0x59, 0x83, 0x0d, 0x7c, 0xf6, 0xe9, 0x27, + 0x9f, 0x37, 0x04, 0x2a, 0xe8, 0xa0, 0x81, 0xe2, 0x60, 0xe8, 0xa1, 0x88, + 0x1a, 0x9a, 0xc3, 0xa2, 0x8c, 0x36, 0xba, 0xa8, 0x0e, 0x90, 0x46, 0x2a, + 0x29, 0xa4, 0x3b, 0x54, 0x6a, 0xe9, 0xa5, 0x95, 0xf2, 0xa0, 0xe9, 0xa6, + 0x9c, 0x6a, 0xda, 0xc3, 0xa7, 0xa0, 0x86, 0xfa, 0xa9, 0x0f, 0xa4, 0x96, + 0x6a, 0x2a, 0xa9, 0x3f, 0xa4, 0xaa, 0xea, 0xaa, 0xa9, 0x02, 0xe1, 0xea, + 0xab, 0xfe, 0xb0, 0xba, 0x1a, 0xc4, 0xac, 0xb4, 0xd6, 0x3a, 0xab, 0x10, + 0xb8, 0xe6, 0xaa, 0x2b, 0xae, 0x43, 0xf4, 0xea, 0xeb, 0xaf, 0xbd, 0x12, + 0x21, 0xec, 0xb0, 0xc4, 0x0a, 0x5b, 0xc4, 0xb1, 0xc8, 0x26, 0x7b, 0xac, + 0x11, 0xcc, 0x36, 0xeb, 0x2c, 0xb3, 0x47, 0x44, 0x2b, 0xed, 0xb4, 0xd1, + 0x22, 0x61, 0xed, 0xb5, 0xd8, 0x5a, 0x9b, 0xc4, 0xb6, 0xdc, 0x76, 0xbb, + 0xad, 0x12, 0xe0, 0x86, 0x2b, 0x2e, 0xb8, 0x4b, 0x94, 0x6b, 0xee, 0xb9, + 0xe5, 0x32, 0xa1, 0xee, 0xba, 0xec, 0xaa, 0xdb, 0xc4, 0xbb, 0xf0, 0xc6, + 0xfb, 0xae, 0x13, 0xf4, 0xd6, 0x6b, 0x2f, 0xbd, 0x4f, 0xe4, 0xab, 0xef, + 0xbe, 0xf9, 0x42, 0xe1, 0xef, 0xbf, 0x00, 0xfb, 0x1b, 0xc5, 0xc0, 0x04, + 0x17, 0x3c, 0xb0, 0x14, 0x08, 0x27, 0xac, 0x30, 0xc2, 0x53, 0x34, 0xec, + 0xf0, 0xc3, 0x0d, 0x53, 0x21, 0xf1, 0xc4, 0x14, 0x4b, 0x5c, 0xc5, 0xc5, + 0x18, 0x67, 0x7c, 0xb1, 0x15, 0x1c, 0x77, 0xec, 0x31, 0xc7, 0x57, 0x84, + 0x2c, 0xf2, 0xc8, 0x21, 0x63, 0x61, 0xf2, 0xc9, 0x28, 0x9b, 0x9c, 0xc5, + 0xca, 0x2c, 0xb7, 0xbc, 0x72, 0xb6, 0x30, 0x23, 0xe1, 0xed, 0xcc, 0x49, + 0x8c, 0x6b, 0xb3, 0x12, 0xe8, 0xe6, 0xbc, 0x44, 0xbb, 0x3c, 0x33, 0x21, + 0xef, 0xcf, 0x4d, 0xdc, 0x2b, 0xb4, 0x13, 0xfc, 0x16, 0xfd, 0x44, 0xc0, + 0x48, 0x43, 0x61, 0xf0, 0xd2, 0x51, 0x2c, 0xec, 0xb4, 0x14, 0x10, 0x47, + 0x3d, 0x45, 0xc5, 0x54, 0x53, 0xa1, 0xf1, 0xd5, 0x55, 0x7c, 0xac, 0xb5, + 0x15, 0x24, 0x77, 0x7d, 0x45, 0xca, 0x60, 0x63, 0xe1, 0xf2, 0xd8, 0x59, + 0x68, 0x61, 0xf6, 0xd9, 0x68, 0x9b, 0xbd, 0xc5, 0xda, 0x6c, 0xb7, 0xbd, + 0x36, 0x17, 0x70, 0xc7, 0x2d, 0x37, 0xdc, 0x5d, 0xd4, 0x6d, 0xf7, 0xdd, + 0x75, 0x7b, 0xa1, 0xf7, 0xfe, 0xde, 0x7c, 0xeb, 0xfd, 0xc5, 0xdf, 0x80, + 0x07, 0xfe, 0x37, 0x18, 0x84, 0x17, 0x6e, 0x38, 0xe1, 0x61, 0x24, 0xae, + 0xf8, 0xe2, 0x89, 0x8b, 0xe1, 0xf8, 0xe3, 0x90, 0x3b, 0x3e, 0xc6, 0xe4, + 0x94, 0x57, 0x3e, 0x39, 0x19, 0x98, 0x67, 0xae, 0x39, 0xe6, 0x65, 0x74, + 0xee, 0xf9, 0xe7, 0x9d, 0x9b, 0x21, 0xfa, 0xe8, 0xa4, 0x8b, 0x7e, 0xc6, + 0xe9, 0xa8, 0xa7, 0x7e, 0x3a, 0x1a, 0xac, 0xb7, 0xee, 0x3a, 0xeb, 0x69, + 0xc4, 0x2e, 0xfb, 0xec, 0xb1, 0xab, 0x61, 0xfb, 0xed, 0xb8, 0xdb, 0xbe, + 0xc6, 0xee, 0xbc, 0xf7, 0xbe, 0x3b, 0x1b, 0xc0, 0x07, 0x2f, 0x3c, 0xf0, + 0x6d, 0x14, 0x6f, 0xfc, 0xf1, 0xc5, 0xbb, 0xa1, 0xfc, 0xf2, 0xcc, 0x2b, + 0xff, 0xc6, 0xf3, 0xd0, 0x47, 0xff, 0x3c, 0x1c, 0xd4, 0x57, 0x6f, 0x3d, + 0xf5, 0x71, 0x64, 0xaf, 0xfd, 0xf6, 0xd9, 0xcb, 0xe1, 0xfd, 0xf7, 0xe0, + 0x7b, 0x3f, 0xc7, 0xf8, 0xe4, 0x97, 0x3f, 0x3e, 0x1d, 0xe8, 0xa7, 0xaf, + 0x3e, 0xfa, 0x75, 0xb4, 0xef, 0xfe, 0xfb, 0xed, 0xdb, 0x21, 0xff, 0xfc, + 0xf4, 0xcb, 0x7f, 0xc7, 0xfd, 0xf8, 0xe7, 0x7f, 0x3f, 0x1e, 0xfc, 0xf7, + 0xef, 0x3f, 0xff, 0x79, 0x08, 0xa0, 0x00, 0x07, 0x18, 0x40, 0x3d, 0x18, + 0xf0, 0x80, 0x08, 0x34, 0xe0, 0x1e, 0x16, 0xc8, 0xc0, 0x06, 0x2e, 0x90, + 0x0f, 0x10, 0x8c, 0xa0, 0x04, 0x21, 0xd8, 0x87, 0x0a, 0x5a, 0xf0, 0x82, + 0x15, 0x1c, 0x9e, 0x06, 0xd9, 0x80, 0xbc, 0x0e, 0xb6, 0xa1, 0x79, 0x20, + 0x74, 0x83, 0xf4, 0x46, 0xf8, 0x86, 0xeb, 0x99, 0x10, 0x0e, 0xdc, 0x4b, + 0x61, 0x1c, 0xc2, 0xc7, 0x42, 0x39, 0x98, 0xef, 0x85, 0x73, 0x58, 0x9f, + 0x0c, 0xe9, 0x00, 0xbf, 0x1a, 0xd6, 0xa1, 0x7e, 0x38, 0xb4, 0x83, 0xfe, + 0x76, 0x78, 0x87, 0xff, 0xf9, 0x10, 0x0f, 0xfe, 0x04, 0x0c, 0x62, 0x1e, + 0x12, 0x48, 0x44, 0x3d, 0x38, 0xf0, 0x88, 0x7b, 0x98, 0xa0, 0x12, 0xf9, + 0x80, 0xc1, 0x26, 0xf6, 0xc1, 0x0f, 0x50, 0x8c, 0xa2, 0x14, 0xa1, 0xf8, + 0x87, 0x2a, 0x5a, 0xf1, 0x8a, 0x55, 0x04, 0x84, 0x16, 0xb7, 0xc8, 0x45, + 0x2d, 0x06, 0xe2, 0x8b, 0x60, 0x0c, 0xe3, 0x17, 0x05, 0x41, 0xc6, 0x32, + 0x9a, 0x91, 0x8c, 0x83, 0x48, 0xa3, 0x1a, 0xd7, 0x98, 0x46, 0x42, 0xb8, + 0xf1, 0x8d, 0x70, 0x74, 0x63, 0x21, 0xe6, 0x48, 0xc7, 0x3a, 0xce, 0xd1, + 0x10, 0x78, 0xcc, 0xa3, 0x1e, 0xf1, 0x78, 0x88, 0x3e, 0xfa, 0xf1, 0x8f, + 0x7d, 0x44, 0x84, 0x20, 0x07, 0x49, 0x48, 0x41, 0x26, 0xe2, 0x90, 0x88, + 0x4c, 0xe4, 0x21, 0x15, 0xc1, 0xc8, 0x46, 0x3a, 0x92, 0x91, 0x8b, 0x88, + 0xa4, 0x24, 0x27, 0x19, 0x49, 0x46, 0x58, 0xf2, 0x92, 0x98, 0xb4, 0x64, + 0x23, 0x36, 0xc9, 0xc9, 0x4e, 0x6e, 0xd2, 0x11, 0xa0, 0x0c, 0xa5, 0x28, + 0x41, 0xf9, 0x88, 0x52, 0x9a, 0xf2, 0x94, 0xa5, 0x84, 0x84, 0x2a, 0x57, + 0xc9, 0x4a, 0x55, 0x46, 0xe2, 0x95, 0xb0, 0x8c, 0xe5, 0x2b, 0x25, 0x41, + 0xcb, 0x5a, 0xda, 0x92, 0x96, 0x93, 0xc8, 0xa5, 0x2e, 0x77, 0x99, 0x4b, + 0x4a, 0xf8, 0xf2, 0x97, 0xc0, 0xf4, 0x65, 0x25, 0x86, 0x49, 0xcc, 0x62, + 0x0e, 0xd3, 0x12, 0xc8, 0x4c, 0xa6, 0x32, 0x91, 0x79, 0x89, 0x66, 0x3a, + 0xf3, 0x99, 0xcd, 0xc4, 0x84, 0x34, 0xa7, 0x49, 0x4d, 0x69, 0x66, 0xe2, + 0x9a, 0xd8, 0xcc, 0xe6, 0x35, 0x35, 0xc1, 0xcd, 0x6e, 0x7a, 0x93, 0x9b, + 0x9b, 0x08, 0xa7, 0x38, 0xc7, 0x19, 0x4e, 0x4e, 0x98, 0xf3, 0x9c, 0xe8, + 0x34, 0x67, 0x27, 0xd6, 0xc9, 0xce, 0x76, 0xae, 0xd3, 0x13, 0xf0, 0x8c, + 0xa7, 0x3c, 0xe1, 0xf9, 0x89, 0x7a, 0xda, 0xf3, 0x9e, 0xf5, 0xfe, 0x04, + 0x85, 0x3e, 0xf7, 0xc9, 0x4f, 0x7d, 0x86, 0xe2, 0x9f, 0x00, 0x0d, 0xe8, + 0x3f, 0x5b, 0x49, 0x50, 0x48, 0xc8, 0xf2, 0xa0, 0x91, 0xb8, 0xa5, 0x42, + 0x25, 0xc1, 0xcb, 0x86, 0x4e, 0x22, 0x98, 0x10, 0xa5, 0x84, 0x31, 0x27, + 0x5a, 0x89, 0x65, 0x5a, 0xd4, 0x12, 0xd0, 0xcc, 0xe8, 0x25, 0xaa, 0xc9, + 0x51, 0x4c, 0x68, 0xf3, 0xa3, 0x99, 0xf8, 0xa6, 0x48, 0x35, 0x41, 0xce, + 0x92, 0x6e, 0x22, 0x9d, 0x28, 0xe5, 0x84, 0x3b, 0x57, 0xda, 0x89, 0x79, + 0xba, 0xd4, 0x13, 0xf8, 0x8c, 0xe9, 0x27, 0xfa, 0x49, 0x53, 0x50, 0x08, + 0xf4, 0xa6, 0xa1, 0x10, 0x85, 0x4e, 0x77, 0xca, 0x53, 0x9d, 0x8e, 0xe2, + 0xa7, 0x40, 0x0d, 0xea, 0x4f, 0x49, 0x41, 0xd4, 0xa2, 0x1a, 0x95, 0xa8, + 0xa5, 0x48, 0xaa, 0x52, 0x97, 0x9a, 0x54, 0x53, 0x38, 0xf5, 0xa9, 0x50, + 0x75, 0xea, 0x29, 0xa6, 0x4a, 0xd5, 0xaa, 0x4e, 0x15, 0x15, 0x58, 0xcd, + 0xaa, 0x56, 0xb1, 0x9a, 0x8a, 0xae, 0x7a, 0xf5, 0xab, 0x5d, 0x55, 0x85, + 0x58, 0xc7, 0x4a, 0x56, 0xb1, 0xae, 0xe2, 0xac, 0x68, 0x4d, 0xeb, 0x59, + 0x59, 0xc1, 0xd6, 0xb6, 0xba, 0x95, 0xad, 0xad, 0x88, 0xab, 0x5c, 0xe7, + 0x1a, 0x57, 0x57, 0xd8, 0xf5, 0xae, 0x78, 0xb5, 0xeb, 0x2b, 0xf6, 0xca, + 0xd7, 0xbe, 0xee, 0x15, 0x16, 0x80, 0x0d, 0xac, 0x60, 0x01, 0x1b, 0x8b, + 0xc2, 0x1a, 0xf6, 0xb0, 0x85, 0x95, 0x85, 0x62, 0x17, 0xcb, 0x58, 0xc5, + 0xce, 0xe2, 0xb1, 0x90, 0x8d, 0xec, 0x63, 0x69, 0x41, 0xd9, 0xca, 0x5a, + 0x96, 0xb2, 0xb5, 0xc8, 0xac, 0x66, 0x37, 0x9b, 0x59, 0x5b, 0x78, 0xf6, + 0xb3, 0xa0, 0xf5, 0xec, 0x2d, 0x46, 0x4b, 0xda, 0xd2, 0x8e, 0x16, 0x17, + 0xa8, 0x4d, 0xad, 0x6a, 0x51, 0x9b, 0x8b, 0xd6, 0xba, 0xf6, 0xb5, 0xad, + 0xd5, 0xfe, 0x85, 0x6c, 0x67, 0x4b, 0x5b, 0xd9, 0xee, 0xe2, 0xb6, 0xb8, + 0xcd, 0xed, 0x6d, 0x79, 0xc1, 0xdb, 0xde, 0xfa, 0x96, 0xb7, 0xbd, 0x08, + 0xae, 0x70, 0x87, 0x1b, 0x5c, 0x5f, 0x18, 0xf7, 0xb8, 0xc8, 0x35, 0xee, + 0x2f, 0x96, 0xcb, 0xdc, 0xe6, 0x2e, 0x17, 0x18, 0xd0, 0x8d, 0xae, 0x74, + 0xa1, 0x1b, 0x8c, 0xea, 0x5a, 0xf7, 0xba, 0xd5, 0x15, 0x86, 0x76, 0xb7, + 0xcb, 0x5d, 0xed, 0x0e, 0xe3, 0xbb, 0xe0, 0x0d, 0xef, 0x77, 0x89, 0x41, + 0xde, 0xf2, 0x9a, 0x97, 0xbc, 0xc5, 0x48, 0xaf, 0x7a, 0xd7, 0x9b, 0xde, + 0xcb, 0xba, 0x97, 0x16, 0x9c, 0x8d, 0x6f, 0x2d, 0x42, 0x4b, 0x5f, 0x5b, + 0x98, 0xf6, 0xbe, 0xb7, 0x58, 0xad, 0x7e, 0x71, 0x01, 0xdb, 0xfe, 0xe6, + 0xa2, 0xb6, 0x00, 0xd6, 0x85, 0x6e, 0x07, 0xbc, 0x8b, 0xdf, 0x1a, 0x98, + 0x17, 0xc4, 0x4d, 0x70, 0x2f, 0x92, 0xcb, 0x60, 0x5f, 0x38, 0xf7, 0xc1, + 0xbf, 0x98, 0xae, 0x84, 0x81, 0x81, 0xdd, 0x0a, 0x07, 0xa3, 0xbb, 0x18, + 0x16, 0x86, 0x78, 0x37, 0x3c, 0x8c, 0xf3, 0x7a, 0x98, 0x18, 0xec, 0x0d, + 0x71, 0x31, 0x8c, 0x41, 0xe2, 0x12, 0x9b, 0x98, 0xc4, 0xc7, 0x48, 0xb1, + 0x8a, 0x57, 0x9c, 0x62, 0x64, 0xb8, 0xf8, 0xc5, 0x30, 0x76, 0x71, 0x32, + 0x66, 0x4c, 0xe3, 0x1a, 0xcf, 0x58, 0x19, 0x38, 0xce, 0xb1, 0x8e, 0x71, + 0xbc, 0x8c, 0x1e, 0xfb, 0xf8, 0xc7, 0x3d, 0x66, 0x86, 0x90, 0x87, 0x4c, + 0x64, 0x21, 0x37, 0xe3, 0xc8, 0x48, 0x4e, 0xf2, 0x91, 0x9d, 0xc1, 0xe4, + 0x26, 0x3b, 0x99, 0xc9, 0xcf, 0x88, 0xb2, 0x94, 0xa7, 0x1c, 0x65, 0x68, + 0x58, 0xf9, 0xca, 0x58, 0xb6, 0x72, 0x34, 0xb6, 0xcc, 0xe5, 0x2e, 0x6f, + 0x59, 0x1a, 0x60, 0x0e, 0xb3, 0x98, 0xc1, 0x3c, 0x8d, 0x32, 0x9b, 0xf9, + 0xcc, 0x65, 0xa6, 0x86, 0xfe, 0x9a, 0xd7, 0xcc, 0x66, 0x35, 0x57, 0xe3, + 0xcd, 0x70, 0x8e, 0xf3, 0x9b, 0xad, 0x41, 0xe7, 0x3a, 0xdb, 0x99, 0xce, + 0xd7, 0xc8, 0xb3, 0x9e, 0xf7, 0x9c, 0xe7, 0xae, 0x14, 0x04, 0x2c, 0x0a, + 0x19, 0xcb, 0x43, 0xcc, 0x42, 0x91, 0xb4, 0x64, 0x84, 0x2d, 0x1e, 0x79, + 0xcb, 0x48, 0xe4, 0x82, 0x92, 0xba, 0xb4, 0x04, 0x2f, 0x32, 0xd9, 0xcb, + 0x4d, 0xfc, 0xc2, 0x93, 0xc0, 0x04, 0x85, 0x30, 0x46, 0x39, 0xcc, 0x52, + 0x14, 0x03, 0x95, 0xc6, 0x54, 0x05, 0x32, 0x5a, 0xa9, 0x8c, 0xa8, 0x25, + 0xa0, 0x99, 0x52, 0x4f, 0xe0, 0x33, 0xa8, 0xa6, 0x00, 0x69, 0x56, 0x5d, + 0x81, 0xd4, 0xb8, 0xda, 0x02, 0xae, 0x89, 0xf5, 0x05, 0x66, 0x43, 0x6b, + 0x0c, 0xe0, 0xe6, 0xd6, 0x19, 0xe8, 0x8d, 0xae, 0x35, 0x20, 0x9c, 0x5e, + 0x6f, 0xe0, 0x38, 0xc0, 0xe6, 0x00, 0x73, 0x86, 0xdd, 0x81, 0xe8, 0x18, + 0xdb, 0x03, 0xd6, 0x49, 0xf6, 0x07, 0xb6, 0xc3, 0x6c, 0x10, 0x80, 0xe7, + 0xd9, 0x21, 0x28, 0x8f, 0xb4, 0x45, 0xa0, 0x9e, 0x6a, 0x8f, 0x60, 0xd4, + 0x95, 0x31, 0xb5, 0x66, 0x52, 0xfd, 0x19, 0x56, 0x93, 0xe6, 0xd5, 0xa9, + 0x91, 0xb5, 0x6b, 0x6a, 0x3d, 0x1b, 0x5c, 0xe3, 0x66, 0xd7, 0xbd, 0xf1, + 0xb5, 0x70, 0x82, 0x7d, 0x1c, 0x62, 0x33, 0xe7, 0xd8, 0xd1, 0x51, 0xb6, + 0x75, 0x9a, 0xbd, 0x1d, 0x68, 0x83, 0x67, 0xda, 0xe5, 0xb1, 0xb6, 0x7a, + 0x8e, 0xf4, 0x1e, 0x25, 0xd1, 0xa7, 0x49, 0xf9, 0x81, 0x92, 0x7f, 0xa6, + 0x34, 0x20, 0x2b, 0x21, 0x28, 0x4b, 0x0d, 0xe2, 0x92, 0x84, 0xbe, 0x74, + 0x21, 0x31, 0x71, 0xa8, 0x4c, 0x21, 0x42, 0x93, 0x89, 0xd6, 0xb4, 0x22, + 0x37, 0xc1, 0x28, 0x4e, 0x35, 0xa2, 0x93, 0x8e, 0xee, 0xf4, 0x23, 0x3d, + 0x11, 0xe9, 0x4f, 0x20, 0xb7, 0x01, 0xa1, 0xfe, 0x46, 0x7e, 0x83, 0x44, + 0x99, 0x1c, 0x07, 0x8e, 0x4a, 0x79, 0x0e, 0x26, 0xc5, 0x72, 0x1d, 0x60, + 0xea, 0xe5, 0x3b, 0xe8, 0x94, 0xcc, 0x79, 0x20, 0xaa, 0x9a, 0xf7, 0xe0, + 0x54, 0x38, 0xf7, 0x01, 0xab, 0x76, 0xfe, 0x83, 0x58, 0xf9, 0x1c, 0x08, + 0xb6, 0x0a, 0x7a, 0x10, 0x76, 0x45, 0x74, 0x21, 0x00, 0xeb, 0xe8, 0x43, + 0x28, 0x96, 0xd2, 0x89, 0xa0, 0xac, 0xa6, 0x17, 0xe1, 0x59, 0x50, 0x37, + 0x02, 0xb5, 0xa6, 0x7e, 0x84, 0x90, 0xff, 0x89, 0xe4, 0x84, 0x3a, 0x79, + 0xa2, 0x54, 0xee, 0xa8, 0x96, 0x4f, 0x0a, 0xe6, 0x98, 0x9a, 0x79, 0xa7, + 0x6c, 0x2e, 0xaa, 0x9c, 0x9f, 0x8a, 0xe7, 0xac, 0xfa, 0x79, 0xac, 0x84, + 0x6e, 0xab, 0xa2, 0xef, 0x0a, 0xe9, 0xc0, 0x5a, 0x7a, 0xb1, 0x9c, 0xae, + 0xac, 0xa8, 0x3f, 0x8b, 0xea, 0xd4, 0x8a, 0x59, 0xb6, 0x68, 0xe6, 0xad, + 0x9b, 0x8d, 0x4b, 0x67, 0xe8, 0xea, 0x59, 0xbb, 0x80, 0x26, 0xaf, 0xa1, + 0xdd, 0xcb, 0x68, 0xfc, 0x4a, 0x5a, 0xc0, 0x98, 0x66, 0xb0, 0xa7, 0x2d, + 0x4c, 0x6a, 0x10, 0xab, 0x5a, 0xc5, 0xb0, 0xa6, 0xb1, 0xad, 0x7d, 0xcc, + 0x6b, 0x24, 0x0b, 0x5b, 0xca, 0xc8, 0xe6, 0xb2, 0xb4, 0x79, 0x5e, 0x0b, + 0x6e, 0x0b, 0xfd, 0x16, 0xe6, 0x46, 0x7a, 0x2e, 0xe0, 0xed, 0xf4, 0x5d, + 0xe8, 0x9b, 0xea, 0xbd, 0x20, 0xb8, 0xd6, 0x7f, 0xe1, 0x70, 0xb0, 0x07, + 0x03, 0xe3, 0x66, 0x1f, 0x86, 0xc8, 0xd9, 0x5e, 0x0c, 0x96, 0xcb, 0xfd, + 0x18, 0x36, 0xc7, 0x7b, 0x32, 0x80, 0xee, 0xf7, 0x65, 0x28, 0x9d, 0xf0, + 0xcd, 0xa0, 0xba, 0xe2, 0x9f, 0xe1, 0x75, 0xc8, 0x47, 0x03, 0xed, 0x96, + 0x9f, 0x86, 0xdc, 0x39, 0x5f, 0x0d, 0xbe, 0x8b, 0xfe, 0x1a, 0x3e, 0x9f, + 0x36, 0xd1, 0xbb, 0xad, 0xf4, 0x73, 0x43, 0x3d, 0xde, 0x56, 0xfe, 0xdf, + 0x37, 0xd7, 0x0b, 0x2e, 0xf6, 0x87, 0xa3, 0x3d, 0xe3, 0x6e, 0x1f, 0x39, + 0xdd, 0x5b, 0xae, 0xf7, 0x9b, 0x03, 0x3e, 0xe8, 0x86, 0x5f, 0x3a, 0xe3, + 0xab, 0x2e, 0xf9, 0xaf, 0x63, 0x3e, 0xed, 0x9e, 0x9f, 0x3b, 0xe9, 0xfb, + 0x6e, 0x83, 0xc3, 0xf3, 0x20, 0xf2, 0x42, 0xd8, 0x3c, 0x12, 0x4a, 0xef, + 0x84, 0xd7, 0xa3, 0x42, 0xdc, 0xd3, 0x42, 0xe1, 0x03, 0x43, 0xe6, 0x33, + 0x43, 0xeb, 0x63, 0x43, 0xf0, 0x93, 0x43, 0xf5, 0xc3, 0x43, 0xfa, 0xf3, + 0x43, 0xff, 0x23, 0x44, 0x04, 0x54, 0x44, 0x09, 0x84, 0x44, 0x0e, 0xb4, + 0x44, 0x13, 0xe4, 0x44, 0x18, 0x34, 0x45, 0x1c, 0xe8, 0x07, 0x58, 0xf4, + 0x81, 0x7f, 0xd0, 0x45, 0x22, 0x08, 0x08, 0x62, 0x54, 0x82, 0x81, 0x70, + 0x46, 0x28, 0x28, 0x08, 0x6c, 0xb4, 0x82, 0x83, 0x10, 0x47, 0x2e, 0x48, + 0x08, 0x76, 0x14, 0x83, 0x85, 0xb0, 0x47, 0x34, 0x68, 0x08, 0x80, 0x74, + 0x83, 0x87, 0x50, 0x48, 0x3a, 0x88, 0x08, 0x8a, 0xd4, 0x83, 0x89, 0xf0, + 0x48, 0x40, 0xa8, 0x08, 0x94, 0x34, 0x84, 0x8b, 0x90, 0x49, 0x46, 0xc8, + 0x08, 0x9e, 0x94, 0x84, 0x8d, 0x30, 0x4a, 0x4c, 0xe8, 0x08, 0xa8, 0xf4, + 0x84, 0x8f, 0xd0, 0x81, 0x53, 0x04, 0x82, 0x58, 0x34, 0x82, 0x5d, 0x64, + 0x82, 0x62, 0x94, 0x82, 0x67, 0xc4, 0x82, 0x6c, 0xf4, 0x82, 0x71, 0x24, + 0x83, 0x76, 0x54, 0x83, 0x7b, 0x84, 0x83, 0x80, 0xb4, 0x83, 0x85, 0xe4, + 0x83, 0x8a, 0x14, 0x84, 0x8f, 0x44, 0x84, 0x94, 0x74, 0x84, 0x99, 0xa4, + 0x84, 0x9e, 0xd4, 0x84, 0xa3, 0x04, 0x85, 0xa8, 0x54, 0x50, 0xad, 0x84, + 0x50, 0xb2, 0xb4, 0x50, 0xb7, 0xe4, 0x50, 0xbc, 0x14, 0x51, 0xc1, 0x44, + 0x51, 0xc6, 0x74, 0x51, 0xcb, 0xa4, 0x51, 0xd0, 0xd4, 0x51, 0xd5, 0x04, + 0x52, 0xfe, 0xda, 0x34, 0x52, 0xdf, 0x64, 0x52, 0xe4, 0x94, 0x52, 0xe9, + 0xc4, 0x52, 0xee, 0xf4, 0x52, 0xf3, 0x24, 0x53, 0xf8, 0x54, 0x53, 0xfd, + 0x84, 0x53, 0x02, 0xd5, 0x53, 0x9a, 0x28, 0x0a, 0x42, 0xd5, 0x89, 0xa3, + 0x70, 0x54, 0xa0, 0x48, 0x0a, 0x4c, 0x35, 0x8a, 0xa5, 0x10, 0x55, 0xa6, + 0x68, 0x0a, 0x56, 0x95, 0x8a, 0xa7, 0xb0, 0x55, 0xac, 0x88, 0x0a, 0x60, + 0xf5, 0x8a, 0xa9, 0x50, 0x56, 0xb2, 0xa8, 0x0a, 0x6a, 0x55, 0x8b, 0xab, + 0xf0, 0x56, 0xb8, 0xc8, 0x0a, 0x74, 0xb5, 0x8b, 0xad, 0x90, 0x57, 0xbe, + 0xe8, 0x0a, 0x7e, 0x15, 0x8c, 0xaf, 0x30, 0x58, 0xc4, 0x08, 0x0b, 0x88, + 0x75, 0x8c, 0xb1, 0xd0, 0x58, 0xca, 0x28, 0x0b, 0x92, 0xd5, 0x8c, 0xb3, + 0xb0, 0x89, 0x3d, 0xe5, 0x89, 0x42, 0x15, 0x8a, 0x47, 0x45, 0x8a, 0x4c, + 0x75, 0x8a, 0x51, 0xa5, 0x8a, 0x56, 0xd5, 0x8a, 0x5b, 0x05, 0x8b, 0x60, + 0x35, 0x8b, 0x65, 0x65, 0x8b, 0x6a, 0x95, 0x8b, 0x6f, 0xc5, 0x8b, 0x74, + 0xf5, 0x8b, 0x79, 0x25, 0x8c, 0x7e, 0x55, 0x8c, 0x83, 0x85, 0x8c, 0x88, + 0xb5, 0x8c, 0x8d, 0xe5, 0x8c, 0x92, 0xf5, 0x5e, 0x97, 0x25, 0x5f, 0x9c, + 0x55, 0x5f, 0xa1, 0x85, 0x5f, 0xa6, 0xb5, 0x5f, 0xab, 0xe5, 0x5f, 0xb0, + 0x15, 0x60, 0xb5, 0x45, 0x60, 0xba, 0x75, 0x60, 0xbf, 0xa5, 0x60, 0xc4, + 0xd5, 0x60, 0xc9, 0x05, 0x61, 0xce, 0x35, 0x61, 0xd3, 0x65, 0x61, 0xd8, + 0x95, 0x61, 0xdd, 0xc5, 0x61, 0xe2, 0xf5, 0x61, 0xe7, 0x25, 0x62, 0xec, + 0x75, 0x62, 0x18, 0x69, 0x0c, 0x2c, 0xb6, 0x91, 0xc7, 0x10, 0x63, 0x1e, + 0x89, 0x0c, 0x36, 0x16, 0x92, 0xc9, 0xb0, 0x63, 0x24, 0xa9, 0x0c, 0x40, + 0x76, 0x92, 0xcb, 0x50, 0x64, 0x2a, 0xc9, 0x0c, 0x4a, 0xd6, 0x92, 0xcd, + 0xf0, 0x64, 0x30, 0xe9, 0xfe, 0x0c, 0x54, 0x36, 0x93, 0xcf, 0x90, 0x65, + 0x36, 0x09, 0x0d, 0x5e, 0x96, 0x93, 0xd1, 0x30, 0x66, 0x3c, 0x29, 0x0d, + 0x68, 0xf6, 0x93, 0xd3, 0xd0, 0x66, 0x42, 0x49, 0x0d, 0x72, 0x56, 0x94, + 0xd5, 0x70, 0x67, 0x48, 0x69, 0x0d, 0x7c, 0xb6, 0x94, 0xd7, 0x90, 0x91, + 0x27, 0xc6, 0x91, 0x2c, 0xf6, 0x91, 0x31, 0x26, 0x92, 0x36, 0x56, 0x92, + 0x3b, 0x86, 0x92, 0x40, 0xb6, 0x92, 0x45, 0xe6, 0x92, 0x4a, 0x16, 0x93, + 0x4f, 0x46, 0x93, 0x54, 0x76, 0x93, 0x59, 0xa6, 0x93, 0x5e, 0xd6, 0x93, + 0x63, 0x06, 0x94, 0x68, 0x36, 0x94, 0x6d, 0x66, 0x94, 0x72, 0x96, 0x94, + 0x77, 0xc6, 0x94, 0x7c, 0xe6, 0x67, 0x04, 0x01, 0x68, 0x09, 0x21, 0x68, + 0x0e, 0x41, 0x68, 0x13, 0x61, 0x68, 0x18, 0x81, 0x68, 0x1d, 0xa1, 0x68, + 0x22, 0xc1, 0x68, 0x27, 0xe1, 0x68, 0x2c, 0x01, 0x69, 0x31, 0x21, 0x69, + 0x36, 0x41, 0x69, 0x3b, 0x61, 0x69, 0x40, 0x81, 0x69, 0x45, 0xa1, 0x69, + 0x4a, 0xc1, 0x69, 0x4f, 0xe1, 0x69, 0x54, 0x01, 0x6a, 0x59, 0x21, 0x97, + 0x03, 0x41, 0x97, 0x08, 0x61, 0x97, 0x0d, 0x81, 0x97, 0x12, 0xa1, 0x97, + 0x17, 0xc1, 0x97, 0x1c, 0xe1, 0x97, 0x21, 0x01, 0x98, 0x26, 0x21, 0x98, + 0x2b, 0x41, 0x98, 0x30, 0x61, 0x98, 0x35, 0x81, 0x98, 0x3a, 0xa1, 0x98, + 0x3f, 0xc1, 0x98, 0x44, 0xe1, 0x98, 0x49, 0x01, 0x99, 0x4e, 0x21, 0x99, + 0x53, 0x41, 0x99, 0x58, 0x61, 0x99, 0x06, 0x81, 0x99, 0x61, 0xa1, 0x99, + 0x64, 0xc1, 0x99, 0x67, 0xe1, 0x99, 0x6a, 0x01, 0x9a, 0x6d, 0x21, 0x9a, + 0x70, 0x41, 0x9a, 0x73, 0x61, 0x9a, 0x76, 0x81, 0x9a, 0x79, 0xa1, 0x9a, + 0x7c, 0xc1, 0x9a, 0x7f, 0xe1, 0x9a, 0x82, 0x01, 0x9b, 0x85, 0x21, 0x9b, + 0x88, 0x41, 0x9b, 0x8b, 0x61, 0x9b, 0x8e, 0xfe, 0x81, 0x9b, 0x91, 0x81, + 0x6d, 0x93, 0xa1, 0x6d, 0x99, 0xc1, 0x6d, 0x9e, 0xe1, 0x6d, 0xa3, 0x01, + 0x6e, 0xa8, 0x21, 0x6e, 0xad, 0x41, 0x6e, 0xb2, 0x61, 0x6e, 0xb7, 0x81, + 0x6e, 0xbc, 0xa1, 0x6e, 0xc1, 0xc1, 0x6e, 0xc6, 0xe1, 0x6e, 0xcb, 0x01, + 0x6f, 0xd0, 0x21, 0x6f, 0xd5, 0x41, 0x6f, 0xda, 0x61, 0x6f, 0xdf, 0x81, + 0x6f, 0xe4, 0xa1, 0x6f, 0xe9, 0xe1, 0x9d, 0xdf, 0x09, 0x9e, 0x9b, 0x21, + 0x9e, 0xa0, 0x41, 0x9e, 0xa5, 0x61, 0x9e, 0xaa, 0x81, 0x9e, 0xaf, 0xa1, + 0x9e, 0xb4, 0xc1, 0x9e, 0xb9, 0xe1, 0x9e, 0xbe, 0x01, 0x9f, 0xc3, 0x21, + 0x9f, 0xc8, 0x41, 0x9f, 0xcd, 0x61, 0x9f, 0xd2, 0x81, 0x9f, 0xd7, 0xa1, + 0x9f, 0xdc, 0xc1, 0x9f, 0xe1, 0xe1, 0x9f, 0xe6, 0x01, 0xa0, 0xe7, 0x21, + 0xa0, 0x96, 0x41, 0xa0, 0xa7, 0x66, 0xa0, 0xaa, 0x86, 0xa0, 0xad, 0xa6, + 0xa0, 0xb0, 0xc6, 0xa0, 0xb3, 0xe6, 0xa0, 0xb6, 0x06, 0xa1, 0xb9, 0x26, + 0xa1, 0xbc, 0x46, 0xa1, 0xbf, 0x66, 0xa1, 0xc2, 0x86, 0xa1, 0xc5, 0xa6, + 0xa1, 0xc8, 0xc6, 0xa1, 0xcb, 0xe6, 0xa1, 0xce, 0x06, 0xa2, 0xd1, 0x26, + 0xa2, 0xd4, 0x46, 0xa2, 0x23, 0xc0, 0x6f, 0xee, 0xe1, 0x6f, 0xf3, 0x01, + 0x70, 0xf8, 0x21, 0x70, 0xfd, 0x41, 0x70, 0x02, 0x62, 0x70, 0x07, 0x82, + 0x70, 0x0c, 0xa2, 0x70, 0x11, 0xc2, 0x70, 0x16, 0xe2, 0x70, 0x1b, 0x02, + 0x71, 0x20, 0x22, 0x71, 0x25, 0x42, 0x71, 0x2a, 0x62, 0x71, 0x2f, 0x82, + 0x71, 0x34, 0xa2, 0x71, 0x39, 0xc2, 0x71, 0x3e, 0xe2, 0x71, 0x43, 0xa2, + 0xa4, 0xed, 0xc1, 0xa4, 0xf2, 0xe1, 0xa4, 0xf7, 0x01, 0xa5, 0xfc, 0x21, + 0xa5, 0x01, 0x42, 0xa5, 0x06, 0x62, 0xa5, 0x0b, 0x82, 0xa5, 0x10, 0xa2, + 0xa5, 0x15, 0xc2, 0xa5, 0x1a, 0xe2, 0xa5, 0x1f, 0x02, 0xa6, 0xfe, 0x24, + 0x22, 0xa6, 0x29, 0x42, 0xa6, 0x2e, 0x62, 0xa6, 0x33, 0x82, 0xa6, 0x38, + 0xa2, 0xa6, 0x3d, 0xc2, 0xa6, 0x42, 0xe2, 0xa6, 0xf0, 0x01, 0xa7, 0x4b, + 0x22, 0xa7, 0x4e, 0x42, 0xa7, 0x51, 0x62, 0xa7, 0x54, 0x82, 0xa7, 0x57, + 0xa2, 0xa7, 0x5a, 0xc2, 0xa7, 0x5d, 0xe2, 0xa7, 0x60, 0x02, 0xa8, 0x63, + 0x22, 0xa8, 0x66, 0x42, 0xa8, 0x69, 0x62, 0xa8, 0x6c, 0x82, 0xa8, 0x6f, + 0xa2, 0xa8, 0x72, 0xc2, 0xa8, 0x75, 0xe2, 0xa8, 0x78, 0x02, 0xa9, 0x7b, + 0x62, 0x75, 0x7d, 0x82, 0x75, 0x83, 0xa2, 0x75, 0x88, 0xc2, 0x75, 0x8d, + 0xe2, 0x75, 0x92, 0x02, 0x76, 0x97, 0x22, 0x76, 0x9c, 0x42, 0x76, 0xa1, + 0x62, 0x76, 0xa6, 0x82, 0x76, 0xab, 0xa2, 0x76, 0xb0, 0xc2, 0x76, 0xb5, + 0xe2, 0x76, 0xba, 0x02, 0x77, 0xbf, 0x22, 0x77, 0xc4, 0x42, 0x77, 0xc9, + 0x62, 0x77, 0xce, 0x82, 0x77, 0xd3, 0x62, 0xab, 0xb7, 0x8a, 0xab, 0x85, + 0xa2, 0xab, 0x8a, 0xc2, 0xab, 0x8f, 0xe2, 0xab, 0x94, 0x02, 0xac, 0x99, + 0x22, 0xac, 0x9e, 0x42, 0xac, 0xa3, 0x62, 0xac, 0xa8, 0x82, 0xac, 0xad, + 0xa2, 0xac, 0xb2, 0xc2, 0xac, 0xb7, 0xe2, 0xac, 0xbc, 0x02, 0xad, 0xc1, + 0x22, 0xad, 0xc6, 0x42, 0xad, 0xcb, 0x62, 0xad, 0xd0, 0x82, 0xad, 0xd1, + 0xa2, 0xad, 0x80, 0xc2, 0xad, 0x25, 0xe7, 0xad, 0x28, 0x07, 0xae, 0x2b, + 0x27, 0xae, 0x2e, 0x47, 0xae, 0x31, 0x67, 0xae, 0x34, 0x87, 0xae, 0x37, + 0xa7, 0xae, 0x3a, 0xc7, 0xae, 0x3d, 0xe7, 0xae, 0x40, 0x07, 0xaf, 0x43, + 0x27, 0xaf, 0x46, 0x47, 0xaf, 0x49, 0x67, 0xaf, 0x4c, 0x87, 0xaf, 0x4f, + 0xa7, 0xaf, 0x52, 0xc7, 0xaf, 0x47, 0xa0, 0x77, 0xd8, 0xc2, 0x77, 0xdd, + 0xe2, 0x77, 0xe2, 0x02, 0x78, 0xe7, 0x22, 0x78, 0xec, 0x42, 0x78, 0xf1, + 0x62, 0xfe, 0x78, 0xf6, 0x82, 0x78, 0xfb, 0xa2, 0x78, 0x00, 0xc3, 0x78, + 0x05, 0xe3, 0x78, 0x0a, 0x03, 0x79, 0x0f, 0x23, 0x79, 0x14, 0x43, 0x79, + 0x19, 0x63, 0x79, 0x1e, 0x83, 0x79, 0x23, 0xa3, 0x79, 0x28, 0xc3, 0x79, + 0x2d, 0x23, 0xb2, 0xd7, 0x42, 0xb2, 0xdc, 0x62, 0xb2, 0xe1, 0x82, 0xb2, + 0xe6, 0xa2, 0xb2, 0xeb, 0xc2, 0xb2, 0xf0, 0xe2, 0xb2, 0xf5, 0x02, 0xb3, + 0xfa, 0x22, 0xb3, 0xff, 0x42, 0xb3, 0x04, 0x63, 0xb3, 0x09, 0x83, 0xb3, + 0x0e, 0xa3, 0xb3, 0x13, 0xc3, 0xb3, 0x18, 0xe3, 0xb3, 0x1d, 0x03, 0xb4, + 0x22, 0x23, 0xb4, 0x27, 0x43, 0xb4, 0x2c, 0x63, 0xb4, 0xda, 0x82, 0xb4, + 0x35, 0xa3, 0xb4, 0x38, 0xc3, 0xb4, 0x3b, 0xe3, 0xb4, 0x3e, 0x03, 0xb5, + 0x41, 0x23, 0xb5, 0x44, 0x43, 0xb5, 0x47, 0x63, 0xb5, 0x4a, 0x83, 0xb5, + 0x4d, 0xa3, 0xb5, 0x50, 0xc3, 0xb5, 0x53, 0xe3, 0xb5, 0x56, 0x03, 0xb6, + 0x59, 0x23, 0xb6, 0x5c, 0x43, 0xb6, 0x5f, 0x63, 0xb6, 0x62, 0x83, 0xb6, + 0x65, 0x43, 0x7d, 0x67, 0x63, 0x7d, 0x6d, 0x83, 0x7d, 0x72, 0xa3, 0x7d, + 0x77, 0xc3, 0x7d, 0x7c, 0xe3, 0x7d, 0x81, 0x03, 0x7e, 0x86, 0x23, 0x7e, + 0x8b, 0x43, 0x7e, 0x90, 0x63, 0x7e, 0x95, 0x83, 0x7e, 0x9a, 0xa3, 0x7e, + 0x9f, 0xc3, 0x7e, 0xa4, 0xe3, 0x7e, 0xa9, 0x03, 0x7f, 0xae, 0x23, 0x7f, + 0xb3, 0x43, 0x7f, 0xb8, 0x63, 0x7f, 0xbd, 0xe3, 0xb8, 0x8f, 0x0b, 0xb9, + 0x6f, 0x23, 0xb9, 0x74, 0x43, 0xb9, 0x79, 0x63, 0xb9, 0x7e, 0x83, 0xb9, + 0x83, 0xa3, 0xb9, 0x88, 0xc3, 0xb9, 0x8d, 0xe3, 0xb9, 0x92, 0x03, 0xba, + 0x97, 0x23, 0xba, 0x9c, 0x43, 0xba, 0xa1, 0x63, 0xba, 0xa6, 0x83, 0xba, + 0xab, 0xa3, 0xba, 0xb0, 0xc3, 0xba, 0xb5, 0xe3, 0xba, 0xba, 0x03, 0xbb, + 0xbb, 0x23, 0xbb, 0x6a, 0xfe, 0x43, 0xbb, 0xa3, 0x67, 0xbb, 0xa6, 0x87, + 0xbb, 0xa9, 0xa7, 0xbb, 0xac, 0xc7, 0xbb, 0xaf, 0xe7, 0xbb, 0xb2, 0x07, + 0xbc, 0xb5, 0x27, 0xbc, 0xb8, 0x47, 0xbc, 0xbb, 0x67, 0xbc, 0xbe, 0x87, + 0xbc, 0xc1, 0xa7, 0xbc, 0xc4, 0xc7, 0xbc, 0xc7, 0xe7, 0xbc, 0xca, 0x07, + 0xbd, 0xcd, 0x27, 0xbd, 0xd0, 0x47, 0xbd, 0x6b, 0x80, 0x7f, 0xc2, 0xa3, + 0x7f, 0xc7, 0xc3, 0x7f, 0xcc, 0xe3, 0x7f, 0xd1, 0x03, 0x80, 0xd6, 0x23, + 0x80, 0xdb, 0x43, 0x80, 0xe0, 0x63, 0x80, 0xe5, 0x83, 0x80, 0xea, 0xa3, + 0x80, 0xef, 0xc3, 0x80, 0xf4, 0xe3, 0x80, 0xf9, 0x03, 0x81, 0xfe, 0x23, + 0x81, 0x03, 0x44, 0x81, 0x08, 0x64, 0x81, 0x0d, 0x84, 0x81, 0x12, 0xa4, + 0x81, 0x17, 0xa4, 0xbf, 0xc1, 0xc3, 0xbf, 0xc6, 0xe3, 0xbf, 0xcb, 0x03, + 0xc0, 0xd0, 0x23, 0xc0, 0xd5, 0x43, 0xc0, 0xda, 0x63, 0xc0, 0xdf, 0x83, + 0xc0, 0xe4, 0xa3, 0xc0, 0xe9, 0xc3, 0xc0, 0xee, 0xe3, 0xc0, 0xf3, 0x03, + 0xc1, 0xf8, 0x23, 0xc1, 0xfd, 0x43, 0xc1, 0x02, 0x64, 0xc1, 0x07, 0x84, + 0xc1, 0x0c, 0xa4, 0xc1, 0x11, 0xc4, 0xc1, 0x16, 0xe4, 0xc1, 0xc4, 0x03, + 0xc2, 0x1f, 0x24, 0xc2, 0x22, 0x44, 0xc2, 0x25, 0x64, 0xc2, 0x28, 0x84, + 0xc2, 0x2b, 0xa4, 0xc2, 0x2e, 0xc4, 0xc2, 0x31, 0xe4, 0xc2, 0x34, 0x04, + 0xc3, 0x37, 0x24, 0xc3, 0x3a, 0x44, 0xc3, 0x3d, 0x64, 0xc3, 0x40, 0x84, + 0xc3, 0x43, 0xa4, 0xc3, 0x46, 0xc4, 0xc3, 0x49, 0xe4, 0xc3, 0x4c, 0x04, + 0xc4, 0x4f, 0x24, 0x85, 0x51, 0x44, 0x85, 0x57, 0x64, 0x85, 0x5c, 0x84, + 0x85, 0x61, 0xa4, 0x85, 0x66, 0xc4, 0x85, 0x6b, 0xe4, 0x85, 0x70, 0x04, + 0x86, 0x75, 0x24, 0x86, 0x7a, 0x44, 0x86, 0x7f, 0x64, 0x86, 0x84, 0x84, + 0x86, 0x89, 0xa4, 0x86, 0x8e, 0xc4, 0x86, 0xfe, 0x93, 0xe4, 0x86, 0x98, + 0x04, 0x87, 0x9d, 0x24, 0x87, 0xa2, 0x44, 0x87, 0xa7, 0x64, 0xc6, 0x67, + 0x8c, 0xc6, 0x59, 0xa4, 0xc6, 0x5e, 0xc4, 0xc6, 0x63, 0xe4, 0xc6, 0x68, + 0x04, 0xc7, 0x6d, 0x24, 0xc7, 0x72, 0x44, 0xc7, 0x77, 0x64, 0xc7, 0x7c, + 0x84, 0xc7, 0x81, 0xa4, 0xc7, 0x86, 0xc4, 0xc7, 0x8b, 0xe4, 0xc7, 0x90, + 0x04, 0xc8, 0x95, 0x24, 0xc8, 0x9a, 0x44, 0xc8, 0x9f, 0x64, 0xc8, 0xa4, + 0x84, 0xc8, 0xa5, 0xa4, 0xc8, 0x54, 0xc4, 0xc8, 0x21, 0xe8, 0xc8, 0x24, + 0x08, 0xc9, 0x27, 0x28, 0xc9, 0x2a, 0x48, 0xc9, 0x2d, 0x68, 0xc9, 0x30, + 0x88, 0xc9, 0x33, 0xa8, 0xc9, 0x36, 0xc8, 0xc9, 0x39, 0xe8, 0xc9, 0x3c, + 0x08, 0xca, 0x3f, 0x28, 0xca, 0x42, 0x48, 0xca, 0x45, 0x68, 0xca, 0x48, + 0x88, 0xca, 0x4b, 0xa8, 0xca, 0x4e, 0xc8, 0xca, 0x8f, 0x60, 0x87, 0xac, + 0x84, 0x87, 0xb1, 0xa4, 0x87, 0xb6, 0xc4, 0x87, 0xbb, 0xe4, 0x87, 0xc0, + 0x04, 0x88, 0xc5, 0x24, 0x88, 0xca, 0x44, 0x88, 0xcf, 0x64, 0x88, 0xd4, + 0x84, 0x88, 0xd9, 0xa4, 0x88, 0xde, 0xc4, 0x88, 0xe3, 0xe4, 0x88, 0xe8, + 0x04, 0x89, 0xed, 0x24, 0x89, 0xf2, 0x44, 0x89, 0xf7, 0x64, 0x89, 0xfc, + 0x84, 0x89, 0x01, 0x25, 0xcd, 0xab, 0x44, 0xcd, 0xb0, 0x64, 0xcd, 0xb5, + 0x84, 0xcd, 0xba, 0xa4, 0xcd, 0xbf, 0xc4, 0xcd, 0xc4, 0xe4, 0xcd, 0xc9, + 0x04, 0xce, 0xce, 0x24, 0xce, 0xd3, 0x44, 0xce, 0xd8, 0x64, 0xce, 0xdd, + 0x84, 0xce, 0xe2, 0xa4, 0xce, 0xe7, 0xc4, 0xce, 0xec, 0xe4, 0xce, 0xf1, + 0x04, 0xcf, 0xf6, 0x24, 0xcf, 0xfb, 0x44, 0xcf, 0x00, 0x65, 0xcf, 0xae, + 0x84, 0xcf, 0x09, 0xa5, 0xcf, 0x0c, 0xc5, 0xcf, 0x0f, 0xe5, 0xcf, 0x12, + 0x05, 0xd0, 0x15, 0x25, 0xd0, 0x18, 0x45, 0xd0, 0x1b, 0x65, 0xfe, 0xd0, + 0x1e, 0x85, 0xd0, 0x21, 0xa5, 0xd0, 0x24, 0xc5, 0xd0, 0x27, 0xe5, 0xd0, + 0x2a, 0x05, 0xd1, 0x2d, 0x25, 0xd1, 0x30, 0x45, 0xd1, 0x33, 0x65, 0xd1, + 0x36, 0x85, 0xd1, 0x39, 0x05, 0x8d, 0x3b, 0x25, 0x8d, 0x41, 0x45, 0x8d, + 0x46, 0x65, 0x8d, 0x4b, 0x85, 0x8d, 0x50, 0xa5, 0x8d, 0x55, 0xc5, 0x8d, + 0x5a, 0xe5, 0x8d, 0x5f, 0x05, 0x8e, 0x64, 0x25, 0x8e, 0x69, 0x45, 0x8e, + 0x6e, 0x65, 0x8e, 0x73, 0x85, 0x8e, 0x78, 0xa5, 0x8e, 0x7d, 0xc5, 0x8e, + 0x82, 0xe5, 0x8e, 0x87, 0x05, 0x8f, 0x8c, 0x25, 0x8f, 0x91, 0xe5, 0xd3, + 0x3f, 0x0d, 0xd4, 0x43, 0x25, 0xd4, 0x48, 0x45, 0xd4, 0x4d, 0x65, 0xd4, + 0x52, 0x85, 0xd4, 0x57, 0xa5, 0xd4, 0x5c, 0xc5, 0xd4, 0x61, 0xe5, 0xd4, + 0x66, 0x05, 0xd5, 0x6b, 0x25, 0xd5, 0x70, 0x45, 0xd5, 0x75, 0x65, 0xd5, + 0x7a, 0x85, 0xd5, 0x7f, 0xa5, 0xd5, 0x84, 0xc5, 0xd5, 0x89, 0xe5, 0xd5, + 0x8e, 0x05, 0xd6, 0x8f, 0x25, 0xd6, 0x3e, 0x45, 0xd6, 0x9f, 0x68, 0xd6, + 0xa2, 0x88, 0xd6, 0xa5, 0xa8, 0xd6, 0xa8, 0xc8, 0xd6, 0xab, 0xe8, 0xd6, + 0xae, 0x08, 0xd7, 0xb1, 0x28, 0xd7, 0xb4, 0x48, 0xd7, 0xb7, 0x68, 0xd7, + 0xba, 0x88, 0xd7, 0xbd, 0xa8, 0xd7, 0xc0, 0xc8, 0xd7, 0xc3, 0xe8, 0xd7, + 0xc6, 0x08, 0xd8, 0xc9, 0x28, 0xd8, 0xcc, 0x48, 0xd8, 0xb3, 0x40, 0x8f, + 0x96, 0x65, 0x8f, 0x9b, 0x85, 0x8f, 0xa0, 0xa5, 0x8f, 0xa5, 0xc5, 0x8f, + 0xaa, 0xe5, 0x8f, 0xaf, 0x05, 0x90, 0xb4, 0x25, 0x90, 0xb9, 0x45, 0x90, + 0xbe, 0x65, 0x90, 0xc3, 0x85, 0x90, 0xc8, 0xa5, 0x90, 0xcd, 0xc5, 0x90, + 0xd2, 0xe5, 0x90, 0xd7, 0x05, 0x91, 0xdc, 0x25, 0x91, 0xe1, 0x45, 0x91, + 0xe6, 0x65, 0x91, 0xeb, 0xa5, 0xda, 0x95, 0xc5, 0xda, 0x9a, 0xe5, 0xda, + 0x9f, 0xfe, 0x05, 0xdb, 0xa4, 0x25, 0xdb, 0xa9, 0x45, 0xdb, 0xae, 0x65, + 0xdb, 0xb3, 0x85, 0xdb, 0xb8, 0xa5, 0xdb, 0xbd, 0xc5, 0xdb, 0xc2, 0xe5, + 0xdb, 0xc7, 0x05, 0xdc, 0xcc, 0x25, 0xdc, 0xd1, 0x45, 0xdc, 0xd6, 0x65, + 0xdc, 0xdb, 0x85, 0xdc, 0xe0, 0xa5, 0xdc, 0xe5, 0xc5, 0xdc, 0xea, 0xe5, + 0xdc, 0x98, 0x05, 0xdd, 0xf3, 0x25, 0xdd, 0xf6, 0x45, 0xdd, 0xf9, 0x65, + 0xdd, 0xfc, 0x85, 0xdd, 0xff, 0xa5, 0xdd, 0x02, 0xc6, 0xdd, 0x05, 0xe6, + 0xdd, 0x08, 0x06, 0xde, 0x0b, 0x26, 0xde, 0x0e, 0x46, 0xde, 0x11, 0x66, + 0xde, 0x14, 0x86, 0xde, 0x17, 0xa6, 0xde, 0x1a, 0xc6, 0xde, 0x1d, 0xe6, + 0xde, 0x20, 0x06, 0xdf, 0x23, 0xe6, 0x94, 0x25, 0x06, 0x95, 0x2b, 0x26, + 0x95, 0x30, 0x46, 0x95, 0x35, 0x66, 0x95, 0x3a, 0x86, 0x95, 0x3f, 0xa6, + 0x95, 0x44, 0xc6, 0x95, 0x49, 0xe6, 0x95, 0x4e, 0x06, 0x96, 0x53, 0x26, + 0x96, 0x58, 0x46, 0x96, 0x5d, 0x66, 0x96, 0x62, 0x86, 0x96, 0x67, 0xa6, + 0x96, 0x6c, 0xc6, 0x96, 0x71, 0xe6, 0x96, 0x76, 0x06, 0x97, 0x7b, 0x66, + 0xe1, 0x17, 0x8e, 0xe1, 0x2d, 0xa6, 0xe1, 0x32, 0xc6, 0xe1, 0x37, 0xe6, + 0xe1, 0x3c, 0x06, 0xe2, 0x41, 0x26, 0xe2, 0x46, 0x46, 0xe2, 0x4b, 0x66, + 0xe2, 0x50, 0x86, 0xe2, 0x55, 0xa6, 0xe2, 0x5a, 0xc6, 0xe2, 0x5f, 0xe6, + 0xe2, 0x64, 0x06, 0xe3, 0x69, 0x26, 0xe3, 0x6e, 0x46, 0xe3, 0x73, 0x66, + 0xe3, 0x78, 0x86, 0xe3, 0x79, 0xa6, 0xe3, 0x28, 0xc6, 0xe3, 0x1d, 0xe9, + 0xe3, 0x20, 0x09, 0xe4, 0x23, 0x29, 0xe4, 0x26, 0x49, 0xe4, 0x29, 0x69, + 0xe4, 0x2c, 0x89, 0xe4, 0x2f, 0xa9, 0xe4, 0x32, 0xc9, 0xe4, 0x35, 0xe9, + 0xe4, 0x38, 0x09, 0xe5, 0x3b, 0x29, 0xe5, 0x3e, 0x49, 0xe5, 0x41, 0x69, + 0xe5, 0x44, 0x89, 0xe5, 0xfe, 0x47, 0xa9, 0xe5, 0x4a, 0xc9, 0xe5, 0xd7, + 0xa0, 0x9b, 0x5e, 0xc1, 0x9b, 0xbe, 0xf9, 0x9b, 0x9c, 0x29, 0x9c, 0xc3, + 0x09, 0x9a, 0xc6, 0x79, 0x9c, 0xa4, 0xa9, 0x9c, 0xcb, 0x89, 0x9a, 0xce, + 0xf9, 0x9c, 0xac, 0x29, 0x9d, 0xd3, 0x09, 0x9b, 0xd6, 0x79, 0x9d, 0xb4, + 0xa9, 0x9d, 0xdb, 0x89, 0x9b, 0x82, 0xce, 0x9b, 0xbd, 0xa9, 0x99, 0xc0, + 0x19, 0x9c, 0x9e, 0x49, 0x9c, 0xc5, 0x29, 0x9a, 0xc8, 0x99, 0x9c, 0xa6, + 0xc9, 0x9c, 0xcd, 0xa9, 0x9a, 0xd0, 0x19, 0x9d, 0xae, 0x49, 0x9d, 0xd5, + 0x29, 0x9b, 0xd8, 0x99, 0x9d, 0xb6, 0xc9, 0x9d, 0x11, 0xd0, 0xe9, 0x84, + 0xee, 0x9b, 0xa1, 0x8e, 0xe8, 0xa4, 0xbe, 0xe8, 0xa7, 0xee, 0xe8, 0xaa, + 0x1e, 0xe9, 0xad, 0x4e, 0xe9, 0xb0, 0x7e, 0xe9, 0xb3, 0xae, 0xe9, 0xb6, + 0x8e, 0xeb, 0x98, 0x59, 0xe8, 0xbb, 0x2e, 0x9c, 0xbd, 0x6e, 0x9c, 0xbf, + 0xae, 0x9c, 0xc1, 0xee, 0x9c, 0xc3, 0x2e, 0x9d, 0xc5, 0x6e, 0x9d, 0xc7, + 0xae, 0x9d, 0xc9, 0xae, 0x9b, 0x9e, 0xce, 0xec, 0xc0, 0xc9, 0xeb, 0xc4, + 0xe9, 0xeb, 0xc8, 0x09, 0xec, 0xcc, 0x29, 0xec, 0xd0, 0x49, 0xec, 0xd4, + 0x69, 0xec, 0xd8, 0x89, 0xec, 0xdc, 0xa9, 0xec, 0x74, 0xe9, 0xed, 0x87, + 0xee, 0xec, 0xe1, 0x0e, 0xed, 0xe3, 0x2e, 0xed, 0xe5, 0x4e, 0xed, 0xe7, + 0x6e, 0xed, 0xe9, 0x8e, 0xed, 0xeb, 0xae, 0xed, 0xdc, 0x69, 0xa2, 0xa4, + 0x86, 0xa2, 0x2a, 0xba, 0xa2, 0x08, 0xea, 0xa2, 0x2f, 0xca, 0xa0, 0x32, + 0x3a, 0xa3, 0x10, 0x6a, 0xa3, 0x37, 0x4a, 0xa1, 0x3a, 0xba, 0xa3, 0x18, + 0xea, 0xa3, 0x3f, 0xca, 0xa1, 0x42, 0x3a, 0xa4, 0x20, 0x6a, 0xa4, 0x47, + 0x4a, 0xa2, 0x00, 0x8f, 0xa2, 0x29, 0x6a, 0xa0, 0x2c, 0xda, 0xa2, 0x0a, + 0x0a, 0xa3, 0x31, 0xea, 0xa0, 0x34, 0x5a, 0xfe, 0xa3, 0x12, 0x8a, 0xa3, + 0x39, 0x6a, 0xa1, 0x3c, 0xda, 0xa3, 0x1a, 0x0a, 0xa4, 0x41, 0xea, 0xa1, + 0x44, 0x5a, 0xa4, 0x22, 0x8a, 0xa4, 0xd7, 0x66, 0xa2, 0x1c, 0x3f, 0xf0, + 0x1f, 0x6f, 0xf0, 0x22, 0x9f, 0xf0, 0x25, 0xcf, 0xf0, 0x28, 0xff, 0xf0, + 0x2b, 0x2f, 0xf1, 0x2e, 0x5f, 0xf1, 0x31, 0x8f, 0xf1, 0x34, 0xbf, 0xf1, + 0x02, 0xaf, 0xa2, 0x39, 0xef, 0xa2, 0x3b, 0x2f, 0xa3, 0x3d, 0x6f, 0xa3, + 0x3f, 0xaf, 0xa3, 0x41, 0xef, 0xa3, 0x43, 0x2f, 0xa4, 0x45, 0x6f, 0xa4, + 0x47, 0x6f, 0xf3, 0x49, 0xef, 0xf1, 0x2c, 0xaa, 0xf3, 0x30, 0xca, 0xf3, + 0x34, 0xea, 0xf3, 0x38, 0x0a, 0xf4, 0x3c, 0x2a, 0xf4, 0x40, 0x4a, 0xf4, + 0x44, 0x6a, 0xf4, 0x48, 0x8a, 0xf4, 0x04, 0x8a, 0xf3, 0x5d, 0xcf, 0xf4, + 0x5f, 0xef, 0xf4, 0x61, 0x0f, 0xf5, 0x63, 0x2f, 0xf5, 0x65, 0x4f, 0xf5, + 0x67, 0x6f, 0xf5, 0x69, 0x8f, 0xf5, 0x48, 0x2a, 0xa9, 0x48, 0x42, 0xa9, + 0x96, 0x7a, 0xa9, 0x74, 0xaa, 0xa9, 0x9b, 0x8a, 0xa7, 0x9e, 0xfa, 0xa9, + 0x7c, 0x2a, 0xaa, 0xa3, 0x0a, 0xa8, 0xa6, 0x7a, 0xaa, 0x84, 0xaa, 0xaa, + 0xab, 0x8a, 0xa8, 0xae, 0xfa, 0xaa, 0x8c, 0x2a, 0xab, 0xb3, 0x0a, 0xa9, + 0x7e, 0x4f, 0xa9, 0x95, 0x2a, 0xa7, 0x98, 0x9a, 0xa9, 0x76, 0xca, 0xa9, + 0x9d, 0xaa, 0xa7, 0xa0, 0x1a, 0xaa, 0x7e, 0x4a, 0xaa, 0xa5, 0x2a, 0xa8, + 0xa8, 0x9a, 0xaa, 0x86, 0xca, 0xaa, 0xad, 0xaa, 0xa8, 0xb0, 0x1a, 0xab, + 0x8e, 0x4a, 0xab, 0x35, 0x90, 0xf9, 0x80, 0x6f, 0xa9, 0x9d, 0x4f, 0xf8, + 0xa0, 0x7f, 0xf8, 0xa3, 0xaf, 0xf8, 0xa6, 0xdf, 0xf8, 0xa9, 0x0f, 0xf9, + 0xac, 0x3f, 0xf9, 0xaf, 0x6f, 0xf9, 0xb2, 0x4f, 0xfb, 0x70, 0x1a, 0xf8, + 0xb7, 0xaf, 0xa9, 0xb9, 0xef, 0xa9, 0xbb, 0x2f, 0xaa, 0xbd, 0xfe, 0x6f, + 0xaa, 0xbf, 0xaf, 0xaa, 0xc1, 0xef, 0xaa, 0xc3, 0x2f, 0xab, 0xc5, 0x2f, + 0xa9, 0x9a, 0x8f, 0xfc, 0x98, 0x8a, 0xfb, 0x9c, 0xaa, 0xfb, 0xa0, 0xca, + 0xfb, 0xa4, 0xea, 0xfb, 0xa8, 0x0a, 0xfc, 0xac, 0x2a, 0xfc, 0xb0, 0x4a, + 0xfc, 0xb4, 0x6a, 0xfc, 0x4c, 0xaa, 0xfd, 0x83, 0xaf, 0xfc, 0xdd, 0xcf, + 0xfc, 0xdf, 0xef, 0xfc, 0xe1, 0x0f, 0xfd, 0xe3, 0x2f, 0xfd, 0xe5, 0x4f, + 0xfd, 0xe7, 0x6f, 0xfd, 0xb4, 0xea, 0xaf, 0x22, 0x07, 0xb0, 0x02, 0x3b, + 0xb0, 0x00, 0x91, 0x43, 0xe0, 0x40, 0x82, 0x3a, 0x0c, 0x1e, 0x44, 0x68, + 0x70, 0xc7, 0x42, 0x86, 0x0d, 0x17, 0xf2, 0x80, 0x18, 0x51, 0x22, 0xc4, + 0x1e, 0x15, 0x2d, 0x5e, 0xac, 0xe8, 0x43, 0xe3, 0x46, 0x8e, 0x1a, 0x7f, + 0x7c, 0x04, 0x19, 0xf2, 0x23, 0x10, 0x92, 0x25, 0x4d, 0x92, 0x0c, 0x92, + 0x52, 0xe5, 0xca, 0x94, 0x42, 0x5c, 0xbe, 0x84, 0xe9, 0x72, 0xc8, 0x4c, + 0x9a, 0x35, 0x67, 0x12, 0xc1, 0x99, 0x53, 0x27, 0xce, 0x22, 0x3d, 0x7d, + 0xfe, 0xec, 0x69, 0x44, 0xe8, 0x50, 0xa2, 0x42, 0x8f, 0x1c, 0x45, 0x9a, + 0xf4, 0xa8, 0x0d, 0xa6, 0x4d, 0x9d, 0x32, 0xbd, 0x11, 0x55, 0xea, 0xd4, + 0xa8, 0x38, 0xac, 0x5e, 0xc5, 0x6a, 0x95, 0xe0, 0xd6, 0x81, 0x09, 0xbd, + 0xea, 0x70, 0x18, 0x76, 0xc7, 0x44, 0xb2, 0x3c, 0x30, 0x9e, 0xed, 0xd1, + 0x51, 0xad, 0x0f, 0x91, 0x6d, 0x7f, 0x9c, 0x84, 0x0b, 0x84, 0xe5, 0xdc, + 0x20, 0x31, 0xed, 0x0a, 0xb1, 0x99, 0x77, 0xc8, 0x4e, 0xbe, 0x44, 0x80, + 0xfe, 0x2d, 0x52, 0x54, 0xb0, 0x11, 0xa5, 0x85, 0x8f, 0x3c, 0x45, 0x6c, + 0x83, 0xea, 0xe2, 0x1b, 0x59, 0x1d, 0xe3, 0xe0, 0xca, 0xf5, 0x6b, 0x42, + 0xb1, 0x0e, 0xcb, 0x4e, 0x44, 0x8b, 0x71, 0x6d, 0x47, 0xb7, 0x22, 0xe3, + 0x9e, 0xfe, 0xa4, 0xcb, 0xf2, 0x6e, 0x4c, 0xbd, 0x36, 0xfb, 0xee, 0x04, + 0x0c, 0x74, 0x70, 0x51, 0xc3, 0x4a, 0x13, 0x3f, 0x65, 0x4c, 0xf5, 0x71, + 0xd6, 0xc8, 0x5b, 0x27, 0x23, 0xac, 0xdc, 0xf0, 0xb2, 0xc4, 0xcc, 0x17, + 0x37, 0x73, 0xec, 0x1c, 0xf2, 0xb3, 0xc9, 0xd0, 0x2b, 0x47, 0xc3, 0x2c, + 0x5d, 0xf3, 0xb4, 0xce, 0xd4, 0x3f, 0x57, 0x13, 0x6d, 0x9d, 0xf4, 0xb5, + 0xd3, 0xd8, 0x53, 0x67, 0x63, 0xad, 0x5d, 0xf0, 0xb6, 0xc2, 0xdc, 0x0f, + 0x77, 0x53, 0xec, 0x9d, 0xf1, 0xb7, 0xc7, 0xe0, 0x23, 0x87, 0xa3, 0x2c, + 0xde, 0xf2, 0xb8, 0xcc, 0xe4, 0x37, 0x97, 0xf3, 0x6c, 0x1e, 0xf4, 0xb9, + 0xd1, 0xe8, 0x4b, 0xa7, 0x43, 0xad, 0x5e, 0xf5, 0xba, 0xd6, 0xec, 0x02, + 0xb7, 0x73, 0xef, 0xee, 0x3b, 0xf0, 0xc2, 0x1b, 0x8f, 0xbc, 0xf2, 0xce, + 0x43, 0x2f, 0xbd, 0xf5, 0xd8, 0x6b, 0xef, 0x3d, 0xf8, 0xe2, 0x9b, 0x8f, + 0xbe, 0xfa, 0x90, 0xa0, 0xb0, 0x42, 0x0b, 0x29, 0x4c, 0x22, 0x43, 0x0d, + 0x37, 0xcc, 0x50, 0x09, 0x0f, 0x3f, 0x04, 0xd1, 0xc3, 0x25, 0x46, 0x24, + 0xb1, 0xc4, 0x11, 0x99, 0x40, 0x31, 0x45, 0x15, 0x51, 0x6c, 0xa2, 0x45, + 0x17, 0x5f, 0x6c, 0xd1, 0x09, 0x19, 0x67, 0xa4, 0x51, 0xc6, 0x27, 0x6e, + 0xc4, 0x31, 0xc7, 0x1b, 0xa1, 0xe0, 0xb1, 0x47, 0x1f, 0x79, 0x8c, 0x22, + 0x48, 0x21, 0x87, 0x0c, 0x52, 0x0a, 0x23, 0x8f, 0x44, 0xd2, 0xc8, 0x29, + 0x96, 0x64, 0xb2, 0xc9, 0x25, 0xa9, 0x80, 0x32, 0x4a, 0x29, 0xa1, 0xac, + 0xa2, 0x4a, 0x2b, 0xaf, 0xac, 0xd2, 0x0a, 0x2d, 0xb7, 0xe4, 0x52, 0xcb, + 0x2b, 0xbe, 0x04, 0x33, 0xcc, 0x2f, 0xb1, 0x20, 0xb3, 0x4c, 0x33, 0xc9, + 0xcc, 0x22, 0x4d, 0x35, 0xd7, 0x4c, 0xf3, 0x42, 0x37, 0x91, 0xe0, 0x30, + 0xce, 0x24, 0x42, 0xa4, 0xfe, 0x53, 0x09, 0x13, 0xef, 0x5c, 0x62, 0x45, + 0x3d, 0x99, 0x80, 0xb1, 0xcf, 0x26, 0x6a, 0x04, 0xd4, 0x09, 0x1d, 0x07, + 0x7d, 0xe2, 0x47, 0x43, 0xa1, 0x20, 0x32, 0xd1, 0x28, 0x92, 0x64, 0x54, + 0x0a, 0x27, 0x1f, 0x9d, 0x62, 0x4a, 0x49, 0xa9, 0xc0, 0xb2, 0xd2, 0x2a, + 0xba, 0xc4, 0xd4, 0x0a, 0x31, 0x37, 0xbd, 0xe2, 0x4c, 0x4f, 0xb1, 0x60, + 0x33, 0xd4, 0x2c, 0xde, 0xbc, 0x50, 0x4e, 0x0e, 0xeb, 0x0c, 0x11, 0x4f, + 0x13, 0xf7, 0x5c, 0xd1, 0x4f, 0x18, 0x03, 0xad, 0x91, 0x50, 0x1d, 0x0f, + 0xfd, 0x51, 0x51, 0x22, 0x1b, 0x4d, 0x12, 0x52, 0x27, 0x27, 0x9d, 0xd2, + 0x52, 0x2c, 0x33, 0xed, 0x92, 0x53, 0x31, 0x3f, 0x3d, 0x53, 0x54, 0x36, + 0x49, 0xb5, 0xd0, 0xd4, 0x0d, 0x51, 0x05, 0x51, 0xd5, 0x12, 0x59, 0x55, + 0xd1, 0xd5, 0x17, 0x61, 0xa5, 0x51, 0xd6, 0x1c, 0x69, 0xf5, 0xd1, 0xd6, + 0x21, 0x71, 0x45, 0x52, 0xd7, 0x26, 0x79, 0x95, 0xd2, 0xd7, 0x2b, 0x81, + 0xe5, 0x52, 0xd8, 0x30, 0x89, 0x35, 0xd3, 0xd8, 0x35, 0x91, 0xad, 0x50, + 0x59, 0x0d, 0x99, 0xfd, 0xd0, 0x59, 0x12, 0xa1, 0x4d, 0x51, 0x5a, 0x17, + 0xa9, 0x9d, 0xd1, 0x5a, 0x1c, 0xb1, 0xed, 0x51, 0x5b, 0x21, 0xb9, 0x3d, + 0xd2, 0x5b, 0x26, 0xc1, 0x8d, 0x52, 0x5c, 0x2b, 0xc9, 0xdd, 0xd2, 0x5c, + 0x30, 0xd1, 0x2d, 0x53, 0x5d, 0x35, 0xd9, 0xc5, 0xd0, 0xdd, 0x39, 0xe1, + 0xb5, 0x53, 0xde, 0x3c, 0xe9, 0xe5, 0xd3, 0xde, 0x3f, 0xf1, 0x15, 0x54, + 0xdf, 0x42, 0xf9, 0x45, 0xd4, 0xdf, 0x45, 0x01, 0x76, 0x54, 0xe0, 0x48, + 0x09, 0xa6, 0xd4, 0xe0, 0x4b, 0x11, 0xd6, 0x54, 0xe1, 0x4e, 0x19, 0x06, + 0xd5, 0xe1, 0x2c, 0xb4, 0xa0, 0xb9, 0x66, 0x9b, 0x69, 0xde, 0x22, 0x67, + 0x9d, 0x77, 0xce, 0x99, 0x0b, 0x9f, 0x7f, 0xfe, 0x06, 0xda, 0xe7, 0x2e, + 0x86, 0x26, 0xba, 0xe8, 0xa1, 0xbd, 0x40, 0x3a, 0x69, 0xa5, 0x91, 0xfe, + 0xa2, 0x69, 0xa7, 0x9f, 0x6e, 0x1a, 0x0c, 0xa9, 0xa7, 0xa6, 0x5a, 0xea, + 0x30, 0xae, 0xc6, 0x3a, 0xeb, 0xab, 0xc5, 0xe0, 0xba, 0x6b, 0xaf, 0xb9, + 0x1e, 0x23, 0x6c, 0xb1, 0xc7, 0x0e, 0x9b, 0x0c, 0xb3, 0xcf, 0x46, 0xdb, + 0xec, 0x32, 0xd6, 0x66, 0xbb, 0xed, 0xb5, 0xcd, 0x80, 0x3b, 0x6e, 0xb9, + 0xe1, 0x3e, 0xa3, 0x6e, 0xbb, 0xef, 0xae, 0x1b, 0x0d, 0xbd, 0xf7, 0xe6, + 0x5b, 0xef, 0x34, 0xfe, 0x06, 0x3c, 0xf0, 0xbf, 0xd5, 0x20, 0xbc, 0x70, + 0xc3, 0x09, 0x5f, 0x23, 0x71, 0xc5, 0x17, 0x4f, 0xfc, 0x66, 0xc7, 0xb5, + 0xe0, 0x39, 0xf2, 0x2d, 0x82, 0xa6, 0x9c, 0x0b, 0xa3, 0x2f, 0xef, 0x62, + 0x69, 0xcd, 0xbd, 0x80, 0xba, 0xf3, 0x2f, 0xaa, 0x06, 0x1d, 0x0c, 0xad, + 0x47, 0x0f, 0xe3, 0x6b, 0xd3, 0xc5, 0x20, 0x3b, 0xf5, 0x31, 0xd2, 0x66, + 0x9d, 0x0c, 0xb7, 0x5f, 0x2f, 0x63, 0x6e, 0xd9, 0xcd, 0xc0, 0xbb, 0xf6, + 0x33, 0xfa, 0xc6, 0x1d, 0x0d, 0xc1, 0x77, 0x4f, 0xe3, 0x70, 0xdf, 0xd5, + 0x60, 0x3c, 0xf8, 0x35, 0x1e, 0xbf, 0x59, 0x72, 0x9e, 0x2b, 0x0f, 0x1a, + 0x73, 0xa3, 0x37, 0x5f, 0xda, 0x73, 0xa8, 0x43, 0xaf, 0x9a, 0x74, 0xad, + 0x4f, 0xff, 0x5a, 0x75, 0xb2, 0x5b, 0x4f, 0x1b, 0x76, 0xb7, 0x67, 0x9f, + 0xdb, 0x76, 0xbc, 0x73, 0xef, 0x9b, 0x77, 0xc1, 0x7f, 0x3f, 0x5c, 0x78, + 0xc6, 0x89, 0xb7, 0xd9, 0xf8, 0x9d, 0x91, 0x07, 0x5a, 0xf9, 0xa2, 0x99, + 0x57, 0xda, 0xf9, 0xa7, 0xa1, 0xa7, 0x5a, 0xfa, 0xac, 0xa9, 0xf7, 0xda, + 0xfa, 0xb1, 0xb1, 0x47, 0x5b, 0xfb, 0xb6, 0xb9, 0x97, 0x9b, 0xf7, 0xee, + 0x06, 0x3e, 0xbe, 0x89, 0x2f, 0x70, 0xe4, 0x33, 0x9c, 0xf9, 0xfe, 0x16, + 0x87, 0xbe, 0x9a, 0xa9, 0x4f, 0x67, 0xec, 0xfb, 0x99, 0xfb, 0x88, 0x06, + 0xbf, 0xa4, 0xc9, 0xcf, 0x69, 0xf4, 0x9b, 0x9a, 0xfd, 0xb0, 0x86, 0xbf, + 0xae, 0xe9, 0x4f, 0x6c, 0xfc, 0x3b, 0x9b, 0xff, 0xd8, 0x06, 0xc0, 0xb8, + 0x09, 0xd0, 0x6e, 0x04, 0xdc, 0x9b, 0x01, 0x01, 0x87, 0xc0, 0xc2, 0x29, + 0x50, 0x71, 0x0c, 0xc4, 0x99, 0x03, 0x27, 0x07, 0x41, 0xcb, 0x49, 0x30, + 0x73, 0x14, 0xe4, 0x9c, 0x05, 0x3f, 0x87, 0x41, 0xd1, 0x69, 0xb0, 0x74, + 0x1c, 0x44, 0x9d, 0x07, 0x57, 0x07, 0x42, 0xd7, 0x89, 0x30, 0x76, 0x24, + 0xa4, 0x9d, 0x09, 0x6f, 0x87, 0x42, 0xdd, 0xa9, 0xb0, 0x77, 0x2c, 0x04, + 0x9e, 0x0b, 0xd7, 0xc0, 0x06, 0x2a, 0x56, 0xd1, 0x8a, 0x54, 0x6c, 0x43, + 0x16, 0xb5, 0xb8, 0xc5, 0x2c, 0xba, 0xc1, 0x8b, 0x5f, 0x04, 0xa3, 0x17, + 0xdf, 0x30, 0x46, 0x32, 0x96, 0x71, 0x8c, 0x70, 0x40, 0x63, 0x1a, 0xd5, + 0x88, 0xc6, 0x38, 0xb4, 0xd1, 0x8d, 0x6f, 0x6c, 0xa3, 0x1c, 0xe4, 0x38, + 0x47, 0x3a, 0xca, 0x71, 0x0e, 0x77, 0xc4, 0x63, 0x1e, 0xef, 0x48, 0x07, + 0x3e, 0xf6, 0xd1, 0x8f, 0x7c, 0xac, 0x43, 0x20, 0x05, 0x39, 0xc8, 0x40, + 0xda, 0xc1, 0x90, 0x87, 0x44, 0xa4, 0x21, 0xef, 0xb0, 0x48, 0x46, 0x36, + 0x72, 0x91, 0x78, 0x80, 0x64, 0x24, 0x25, 0x09, 0xc9, 0x3c, 0x54, 0xd2, + 0x92, 0x97, 0xac, 0xa4, 0x1e, 0x34, 0xb9, 0x49, 0x4e, 0x6a, 0x72, 0x0f, + 0x9f, 0x04, 0x65, 0x28, 0x3f, 0xc9, 0x07, 0x52, 0x96, 0xd2, 0x94, 0xa4, + 0xec, 0x43, 0x2a, 0x55, 0xb9, 0xca, 0x54, 0x5e, 0xd1, 0x95, 0x6c, 0xe0, + 0x62, 0x2c, 0xdb, 0x10, 0x46, 0x5a, 0xba, 0xc1, 0x8c, 0xb7, 0x7c, 0xc3, + 0x1a, 0x75, 0x09, 0x07, 0x38, 0xf6, 0x32, 0x0e, 0x75, 0x04, 0xa6, 0x1c, + 0xf4, 0xfe, 0x38, 0xcc, 0x39, 0xfc, 0xd1, 0x98, 0x74, 0x20, 0x64, 0x32, + 0xeb, 0x90, 0x48, 0x66, 0xda, 0xc1, 0x91, 0xcf, 0xbc, 0xc3, 0x24, 0xa5, + 0x89, 0x07, 0x4c, 0x56, 0x33, 0x0f, 0x9d, 0xc4, 0xa6, 0x1e, 0x44, 0xb9, + 0xcd, 0x3d, 0x9c, 0xd2, 0x9b, 0x7c, 0x60, 0x65, 0x38, 0xfb, 0xf0, 0xca, + 0x2b, 0xca, 0x92, 0x8b, 0xb5, 0x0c, 0x23, 0x2e, 0xcd, 0xb8, 0xcb, 0x35, + 0xfa, 0x12, 0x8e, 0xc1, 0xac, 0x23, 0x31, 0xf5, 0x78, 0xcc, 0x3f, 0x2a, + 0x93, 0x90, 0xcd, 0x4c, 0x24, 0x34, 0x1d, 0x39, 0xcd, 0x49, 0x5a, 0x13, + 0x93, 0xd9, 0xec, 0x24, 0x37, 0x45, 0xf9, 0xcd, 0x53, 0x8a, 0x93, 0x95, + 0xe4, 0xb4, 0xa2, 0x39, 0xb7, 0x88, 0x4e, 0x30, 0xaa, 0xb3, 0x8c, 0xec, + 0x54, 0xa3, 0x3b, 0xdf, 0x08, 0x4f, 0x3a, 0xca, 0x33, 0x8f, 0xf4, 0xf4, + 0xa3, 0x3d, 0x07, 0x89, 0x4f, 0x44, 0xea, 0xb3, 0x91, 0xfc, 0x94, 0xa4, + 0x3f, 0x2f, 0x09, 0x50, 0x4e, 0x0a, 0x34, 0x94, 0x04, 0x35, 0xa5, 0x41, + 0x57, 0x89, 0xd0, 0x2a, 0x2a, 0x54, 0x8b, 0x0c, 0xfd, 0xa2, 0x43, 0xc9, + 0x08, 0xd1, 0x34, 0x4a, 0xd4, 0x8d, 0x14, 0x9d, 0xa3, 0x45, 0xf1, 0x88, + 0xd1, 0x3e, 0x6a, 0x54, 0x90, 0x1c, 0x3d, 0xa4, 0x47, 0x19, 0x09, 0xd2, + 0x48, 0x8a, 0xd4, 0x92, 0x24, 0xdd, 0xa4, 0x49, 0x41, 0x89, 0xd2, 0x52, + 0xaa, 0x54, 0x95, 0x2c, 0xc5, 0xa2, 0x4b, 0x67, 0x09, 0x53, 0x5b, 0xca, + 0x34, 0x97, 0x34, 0xe5, 0xa5, 0x4d, 0x7f, 0x89, 0x53, 0x61, 0xea, 0xb4, + 0x98, 0x3c, 0x45, 0xa6, 0x4f, 0x97, 0x09, 0x54, 0x67, 0x0a, 0x35, 0x9a, + 0x44, 0xa5, 0xa6, 0x51, 0xaf, 0x89, 0x54, 0x6d, 0x2a, 0xb5, 0x9b, 0x4c, + 0x05, 0xa7, 0x53, 0xfb, 0xe0, 0x07, 0xba, 0xd6, 0xd5, 0xae, 0x74, 0xfd, + 0x43, 0x5e, 0xf5, 0xba, 0xfe, 0xd7, 0xbc, 0x02, 0xc2, 0xaf, 0x7f, 0x05, + 0xac, 0x5f, 0x03, 0x31, 0x58, 0xc2, 0x16, 0x76, 0xb0, 0x82, 0x40, 0x6c, + 0x62, 0x15, 0x8b, 0xd8, 0x41, 0x34, 0xd6, 0xb1, 0x8f, 0x6d, 0x2c, 0x21, + 0x24, 0x3b, 0x59, 0xca, 0x4a, 0xb6, 0x10, 0x97, 0xc5, 0x6c, 0x66, 0x2f, + 0x6b, 0x08, 0xce, 0x76, 0xd6, 0xb3, 0x9c, 0x3d, 0x44, 0x68, 0x45, 0x3b, + 0xda, 0xd0, 0x22, 0xc2, 0xb4, 0xa7, 0x45, 0xad, 0x69, 0x13, 0xb1, 0x5a, + 0xd6, 0xb6, 0x76, 0xb5, 0x8a, 0x80, 0x6d, 0x6c, 0x65, 0x0b, 0xdb, 0x45, + 0xd4, 0xd6, 0xb6, 0xb7, 0xad, 0x2d, 0x23, 0x74, 0xbb, 0x5b, 0xde, 0xea, + 0xb6, 0x11, 0xbf, 0x05, 0x6e, 0x70, 0x7f, 0xeb, 0x08, 0xe2, 0x16, 0xd7, + 0xb8, 0xc4, 0x7d, 0x44, 0x72, 0x95, 0xbb, 0xdc, 0xe4, 0xde, 0xd5, 0xb9, + 0x7e, 0xe0, 0x6b, 0x74, 0xff, 0x10, 0x58, 0xea, 0x02, 0xc2, 0xb0, 0xd7, + 0x0d, 0xc4, 0x62, 0xb5, 0x2b, 0x08, 0xc8, 0x76, 0x77, 0x10, 0x95, 0x05, + 0x2f, 0x21, 0x34, 0x3b, 0xde, 0x42, 0x7c, 0xd6, 0xbc, 0x86, 0x20, 0x6d, + 0x7a, 0x0f, 0x91, 0x5a, 0xf6, 0x22, 0xc2, 0xb5, 0xef, 0x4d, 0xc4, 0x6c, + 0xe5, 0xab, 0x08, 0xdc, 0xd6, 0x77, 0x11, 0xbd, 0xc5, 0x2f, 0x23, 0x84, + 0xbb, 0xdf, 0x46, 0x1c, 0xd7, 0xbf, 0x8e, 0x60, 0x6e, 0x80, 0x1f, 0xf1, + 0xdc, 0xbb, 0x4a, 0x97, 0xaf, 0xd5, 0x0d, 0x2c, 0x76, 0x0d, 0xbb, 0xdd, + 0xc5, 0x7a, 0x17, 0xb2, 0xe1, 0xad, 0x2c, 0x79, 0x35, 0x7b, 0xde, 0xcf, + 0xaa, 0x97, 0xb4, 0xed, 0x4d, 0x2d, 0x7c, 0x5d, 0x3b, 0xdf, 0xd9, 0xda, + 0x17, 0xb7, 0xf9, 0xed, 0x2d, 0x7f, 0x85, 0xfb, 0xdf, 0xe3, 0x0a, 0x98, + 0xb9, 0x04, 0xb6, 0xab, 0x81, 0xf7, 0x8a, 0x60, 0xc0, 0x2a, 0xb8, 0xb0, + 0x0c, 0x56, 0xac, 0x83, 0x1f, 0x0b, 0x61, 0xfe, 0xca, 0x4a, 0x38, 0xb3, + 0x14, 0xf6, 0xac, 0x85, 0x47, 0x8b, 0x61, 0xd4, 0x6a, 0xb8, 0xb5, 0x1c, + 0x96, 0xad, 0x87, 0x6f, 0x0b, 0x62, 0xde, 0x8a, 0x38, 0xb8, 0x24, 0x36, + 0xae, 0x89, 0x97, 0x8b, 0xe2, 0xba, 0xaa, 0x58, 0xaf, 0x2c, 0xfe, 0xab, + 0x8b, 0x09, 0x0b, 0xe3, 0xc4, 0xca, 0xd8, 0xb1, 0x34, 0x9e, 0xac, 0x8d, + 0x31, 0x8b, 0xe3, 0xce, 0xea, 0x58, 0xb4, 0x3c, 0x3e, 0xad, 0x8f, 0x59, + 0x0b, 0xe4, 0xd8, 0x0a, 0xd9, 0xb6, 0x44, 0xde, 0xad, 0x91, 0x81, 0x8b, + 0xe4, 0xe2, 0x2a, 0x59, 0xb9, 0x4c, 0xc6, 0xab, 0x93, 0xa7, 0x0b, 0x65, + 0xeb, 0x4a, 0x39, 0xbb, 0x54, 0xe6, 0xae, 0x95, 0xbf, 0x8b, 0x65, 0xf1, + 0x6a, 0xb9, 0xbc, 0x5c, 0x46, 0xaf, 0x97, 0xd7, 0x0b, 0x66, 0xf7, 0x8a, + 0x39, 0xbe, 0x64, 0xa6, 0xaf, 0x99, 0xef, 0x8b, 0x66, 0xfd, 0xaa, 0xb9, + 0xbf, 0x6c, 0x06, 0xb0, 0x9b, 0x1f, 0x01, 0x09, 0x4a, 0x57, 0xda, 0xd2, + 0x94, 0x8e, 0x44, 0xa6, 0x35, 0xbd, 0xe9, 0x4c, 0x4b, 0xc2, 0xd3, 0x9f, + 0x06, 0xb5, 0xa7, 0x27, 0x31, 0x6a, 0x52, 0x97, 0x7a, 0xd4, 0x94, 0x40, + 0x75, 0xaa, 0x55, 0x8d, 0xea, 0x4a, 0xb4, 0xda, 0xd5, 0xaf, 0x6e, 0xb5, + 0x25, 0x64, 0x3d, 0x6b, 0x5a, 0xcb, 0xfa, 0x12, 0xb7, 0xc6, 0x75, 0xae, + 0x6f, 0x8d, 0x09, 0x5e, 0xf7, 0xda, 0xd7, 0xbc, 0xce, 0x44, 0xb0, 0x85, + 0x3d, 0xec, 0x60, 0x6b, 0xc2, 0xd8, 0xc7, 0x46, 0xb6, 0xb1, 0x37, 0xb1, + 0x6c, 0x66, 0x37, 0x7b, 0xd9, 0x9c, 0x80, 0x76, 0xb4, 0xa5, 0x0d, 0xed, + 0x4e, 0x54, 0xdb, 0xda, 0xd7, 0xae, 0xb6, 0x27, 0xb4, 0xbd, 0x6d, 0x6e, + 0x6b, 0xfb, 0x13, 0xdf, 0x06, 0x77, 0xb8, 0xbf, 0x0d, 0x0a, 0x72, 0x97, + 0xdb, 0xdc, 0xe4, 0x0e, 0x45, 0xba, 0xd5, 0xbd, 0xee, 0x74, 0xfe, 0x5f, + 0xda, 0xdd, 0x90, 0xe0, 0x74, 0xbc, 0x23, 0x11, 0x6a, 0x7a, 0x4b, 0xc2, + 0xd4, 0xf7, 0x9e, 0xc4, 0xaa, 0xf5, 0x4d, 0x09, 0x58, 0xf7, 0xbb, 0x12, + 0xb5, 0x06, 0xb8, 0x25, 0x74, 0x3d, 0xf0, 0x4b, 0xfc, 0xda, 0xe0, 0x98, + 0x20, 0x76, 0xc2, 0x33, 0x91, 0x6c, 0x86, 0x6b, 0xc2, 0xd9, 0x0f, 0xdf, + 0xc4, 0xb4, 0x25, 0xce, 0x09, 0x6c, 0x57, 0xbc, 0x13, 0xdd, 0xc6, 0xb8, + 0x27, 0xc4, 0xbd, 0xf1, 0x4f, 0x9c, 0xdb, 0xe3, 0xa0, 0x60, 0x77, 0xc8, + 0x43, 0xf1, 0xee, 0x4b, 0xcb, 0x9b, 0xd3, 0xf5, 0x0e, 0x35, 0xbe, 0x4d, + 0xbd, 0xef, 0x55, 0xfb, 0x1b, 0xd6, 0x01, 0xaf, 0x35, 0xc1, 0x75, 0x7d, + 0xf0, 0x5f, 0x2b, 0x9c, 0xd8, 0x0d, 0x4f, 0x36, 0xc4, 0x9d, 0x3d, 0xf1, + 0x69, 0x5b, 0x1c, 0xdb, 0x19, 0xef, 0x36, 0xc7, 0xc5, 0xfd, 0xf1, 0x73, + 0x8b, 0x9c, 0xdd, 0x24, 0xb7, 0xb4, 0xc9, 0x37, 0x8d, 0x72, 0x50, 0xab, + 0xbc, 0xd4, 0x2c, 0x57, 0xb5, 0xcb, 0x5f, 0x0d, 0x73, 0x5a, 0xcb, 0x3c, + 0xd7, 0x34, 0xf7, 0xb5, 0xcd, 0x87, 0x8d, 0x73, 0x64, 0xeb, 0xbc, 0xd9, + 0x3c, 0x97, 0xb6, 0xcf, 0xaf, 0x0d, 0x74, 0x6e, 0x0b, 0x3d, 0xdc, 0x44, + 0x37, 0xb7, 0xd1, 0xd7, 0x8d, 0xf4, 0x4a, 0x2b, 0x5d, 0xd3, 0x4c, 0xff, + 0xb4, 0xd3, 0x49, 0x0d, 0xf5, 0x54, 0x4b, 0xdd, 0xd5, 0x54, 0x9f, 0xb5, + 0xd5, 0x71, 0x8d, 0xf5, 0x5e, 0x6b, 0x5d, 0xd8, 0x5c, 0x3f, 0xb6, 0xd7, + 0x99, 0x0d, 0xf6, 0x68, 0x8b, 0xdd, 0xda, 0x64, 0xdf, 0xb6, 0xd9, 0xc1, + 0x8d, 0xf6, 0x72, 0xab, 0x5d, 0xdd, 0x6c, 0xc7, 0xb4, 0xdb, 0xe7, 0x0d, + 0x77, 0x7b, 0xcb, 0x3d, 0xdf, 0x74, 0xe7, 0xb7, 0xdd, 0xff, 0x8d, 0x77, + 0x81, 0xeb, 0xbd, 0xe0, 0x7c, 0x47, 0xb8, 0xdf, 0x17, 0x0e, 0x78, 0x87, + 0x0b, 0xfe, 0x3e, 0xe2, 0x84, 0xa7, 0xb8, 0xe1, 0x2f, 0x8e, 0x78, 0x8d, + 0x2b, 0xbe, 0xe3, 0x8c, 0x07, 0xb9, 0xe3, 0x43, 0x21, 0x0a, 0xda, 0xd7, + 0xde, 0xf6, 0xb4, 0x1f, 0x45, 0xee, 0x75, 0xbf, 0xfb, 0xdc, 0x93, 0xc2, + 0xf7, 0xbf, 0x07, 0xbe, 0xef, 0x4b, 0x31, 0x7c, 0xe2, 0x17, 0x7f, 0xf8, + 0xa6, 0x40, 0x7e, 0xf2, 0x95, 0x8f, 0xfc, 0x53, 0x34, 0xdf, 0xf9, 0xcf, + 0x6f, 0x3e, 0x2a, 0xa4, 0x3f, 0x7d, 0xea, 0x4b, 0x3f, 0x15, 0xd7, 0xc7, + 0x7e, 0xf6, 0xaf, 0xaf, 0x0a, 0xee, 0x77, 0xdf, 0xfb, 0xdc, 0x5f, 0x45, + 0xf8, 0xc5, 0x3f, 0xfe, 0xf0, 0xb3, 0xc2, 0xfc, 0xe7, 0x47, 0xbf, 0xf9, + 0x5b, 0xb1, 0x7e, 0xf6, 0xb7, 0x7f, 0xfd, 0xae, 0x80, 0x7f, 0xfc, 0xe5, + 0x0f, 0xff, 0x57, 0xd4, 0xdf, 0xfe, 0xf7, 0xaf, 0x3f, 0x2c, 0xf4, 0xbf, + 0x7f, 0xfe, 0xeb, 0x3f, 0x16, 0xff, 0x07, 0xc0, 0x00, 0xfc, 0x3f, 0x59, + 0x20, 0xc0, 0x02, 0x34, 0x40, 0x02, 0x9c, 0x85, 0x04, 0x54, 0xc0, 0x05, + 0x4c, 0xc0, 0xdb, 0x73, 0x40, 0x51, 0xe0, 0xbd, 0x08, 0x1c, 0x85, 0xe0, + 0xa3, 0x40, 0x52, 0x30, 0xbe, 0x0b, 0x2c, 0x85, 0xe5, 0xd3, 0x40, 0x53, + 0x80, 0xbe, 0x0e, 0x3c, 0x85, 0xea, 0x03, 0x41, 0x54, 0xd0, 0xbe, 0x11, + 0x4c, 0x85, 0xef, 0x33, 0x41, 0x55, 0x20, 0xbf, 0x14, 0x5c, 0x85, 0xf4, + 0x63, 0x41, 0x56, 0x70, 0xbf, 0x17, 0x6c, 0x85, 0xf9, 0x93, 0x41, 0x57, + 0xc0, 0xbf, 0x1a, 0x7c, 0x85, 0xfe, 0xc3, 0x41, 0x58, 0x10, 0xc0, 0x1d, + 0x8c, 0x85, 0x03, 0xf4, 0x41, 0x59, 0x60, 0xc0, 0x20, 0x9c, 0x85, 0x07, + 0xbc, 0x3d, 0x09, 0xe4, 0xbd, 0x0a, 0x0c, 0x3e, 0x0c, 0x34, 0xbe, 0x0d, + 0x5c, 0x3e, 0x0f, 0x84, 0xbe, 0x10, 0xac, 0x3e, 0x12, 0xd4, 0xbe, 0x13, + 0xfc, 0x3e, 0x15, 0x24, 0xfe, 0xbf, 0x16, 0x4c, 0x3f, 0x18, 0x74, 0xbf, + 0x19, 0x9c, 0x3f, 0x1b, 0xc4, 0xbf, 0x1c, 0xec, 0x3f, 0x1e, 0x14, 0xc0, + 0x1f, 0x3c, 0x40, 0x21, 0x64, 0x40, 0x22, 0xb4, 0x3d, 0x23, 0xdc, 0x3d, + 0x24, 0x04, 0x3e, 0x25, 0x2c, 0x3e, 0x26, 0x54, 0x3e, 0x27, 0x7c, 0x3e, + 0x28, 0xa4, 0x3e, 0x29, 0xcc, 0x3e, 0x2a, 0xf4, 0x3e, 0x2b, 0x1c, 0x3f, + 0x2c, 0x44, 0x3f, 0x2d, 0x6c, 0x3f, 0x2e, 0x94, 0x3f, 0x2f, 0xbc, 0x3f, + 0x30, 0xe4, 0x3f, 0x31, 0x0c, 0x40, 0x32, 0x34, 0x40, 0x33, 0x5c, 0x40, + 0x34, 0xac, 0x3d, 0x35, 0xd4, 0x3d, 0x36, 0xfc, 0x3d, 0x37, 0x24, 0x3e, + 0x38, 0x4c, 0x3e, 0x39, 0x74, 0x3e, 0x3a, 0x9c, 0x3e, 0x3b, 0xc4, 0x3e, + 0x3c, 0xec, 0x3e, 0x3d, 0x14, 0x3f, 0x3e, 0x3c, 0x3f, 0x3f, 0x64, 0x3f, + 0x40, 0x8c, 0x3f, 0x41, 0xb4, 0x3f, 0x42, 0xdc, 0x3f, 0x43, 0x04, 0x40, + 0x44, 0x2c, 0x40, 0x45, 0x54, 0x40, 0x46, 0xc4, 0x3d, 0x47, 0x9c, 0x40, + 0x48, 0xb4, 0x40, 0x49, 0xcc, 0x40, 0x4a, 0xe4, 0x40, 0x4b, 0xfc, 0x40, + 0x4c, 0x14, 0x41, 0x4d, 0x2c, 0x41, 0x4e, 0x44, 0x41, 0x4f, 0x5c, 0x41, + 0x50, 0x74, 0x41, 0x51, 0x8c, 0x41, 0x52, 0xa4, 0x41, 0x53, 0xbc, 0x41, + 0x54, 0xd4, 0x41, 0x55, 0xec, 0x41, 0x56, 0x04, 0x42, 0x57, 0x9c, 0x05, + 0x5a, 0xa0, 0xc6, 0x6a, 0xb4, 0x46, 0x6a, 0xac, 0x85, 0x6c, 0xd4, 0xc6, + 0x6d, 0xcc, 0x46, 0x5b, 0xf0, 0xc6, 0x6f, 0x04, 0x47, 0x6f, 0xbc, 0x85, + 0x71, 0x24, 0xc7, 0x72, 0x1c, 0x47, 0x5c, 0x40, 0xc7, 0x74, 0x54, 0x47, + 0x74, 0xcc, 0x85, 0x76, 0x74, 0xc7, 0x77, 0x6c, 0x47, 0x5d, 0x90, 0xc7, + 0x79, 0xa4, 0x47, 0x79, 0xdc, 0x85, 0x7b, 0xc4, 0xc7, 0x7c, 0xbc, 0x47, + 0x5e, 0xe0, 0xc7, 0x7e, 0xf4, 0x47, 0x7e, 0xfe, 0xec, 0x85, 0x80, 0x14, + 0xc8, 0x81, 0x0c, 0x48, 0x5f, 0x30, 0xc8, 0x83, 0x44, 0x48, 0x83, 0xfc, + 0x85, 0x85, 0x64, 0xc8, 0x86, 0x5c, 0x48, 0x60, 0x80, 0xc8, 0x88, 0x94, + 0x48, 0x88, 0x0c, 0x86, 0x8a, 0xb4, 0xc8, 0x8b, 0xac, 0x48, 0x61, 0xd0, + 0xc8, 0x8d, 0xe4, 0x48, 0x8d, 0x1c, 0x86, 0x8f, 0x04, 0xc9, 0x90, 0xfc, + 0x48, 0x62, 0x20, 0xc9, 0x92, 0x34, 0x49, 0x92, 0x2c, 0x86, 0x94, 0x54, + 0xc9, 0x95, 0x4c, 0xc9, 0x6b, 0x74, 0x49, 0x5a, 0xe0, 0xc6, 0x98, 0xac, + 0x85, 0x70, 0xa4, 0x49, 0x5b, 0x30, 0xc7, 0x9b, 0xbc, 0x85, 0x75, 0xd4, + 0x49, 0x5c, 0x80, 0xc7, 0x9e, 0xcc, 0x85, 0x7a, 0x04, 0x4a, 0x5d, 0xd0, + 0xc7, 0xa1, 0xdc, 0x85, 0x7f, 0x34, 0x4a, 0x5e, 0x20, 0xc8, 0xa4, 0xec, + 0x85, 0x84, 0x64, 0x4a, 0x5f, 0x70, 0xc8, 0xa7, 0xfc, 0x85, 0x89, 0x94, + 0x4a, 0x60, 0xc0, 0xc8, 0xaa, 0x0c, 0x86, 0x8e, 0xc4, 0x4a, 0x61, 0x10, + 0xc9, 0xad, 0x1c, 0x86, 0x93, 0xf4, 0x4a, 0x62, 0x60, 0xc9, 0xb0, 0x2c, + 0x86, 0x97, 0xbc, 0x46, 0x99, 0xe4, 0xc6, 0x9a, 0x0c, 0x47, 0x9c, 0x34, + 0xc7, 0x9d, 0x5c, 0x47, 0x9f, 0x84, 0xc7, 0xa0, 0xac, 0x47, 0xa2, 0xd4, + 0xc7, 0xa3, 0xfc, 0x47, 0xa5, 0x24, 0xc8, 0xa6, 0x4c, 0x48, 0xa8, 0x74, + 0xc8, 0xa9, 0x9c, 0x48, 0xab, 0xc4, 0xc8, 0xac, 0xec, 0x48, 0xae, 0x14, + 0xc9, 0xaf, 0x3c, 0x49, 0xb1, 0x64, 0x49, 0xb2, 0xb4, 0x46, 0xb3, 0xdc, + 0x46, 0xb4, 0x04, 0x47, 0xb5, 0x2c, 0x47, 0xb6, 0x54, 0x47, 0xb7, 0x7c, + 0x47, 0xb8, 0xa4, 0x47, 0xb9, 0xcc, 0x47, 0xba, 0xf4, 0x47, 0xbb, 0x1c, + 0x48, 0xbc, 0x44, 0x48, 0xbd, 0x6c, 0x48, 0xbe, 0x94, 0x48, 0xbf, 0xbc, + 0x48, 0xc0, 0xe4, 0x48, 0xc1, 0x0c, 0x49, 0xc2, 0x34, 0x49, 0xfe, 0xc3, + 0x5c, 0x49, 0xc4, 0xac, 0x46, 0xc5, 0xd4, 0x46, 0xc6, 0xfc, 0x46, 0xc7, + 0x24, 0x47, 0xc8, 0x4c, 0x47, 0xc9, 0x74, 0x47, 0xca, 0x9c, 0x47, 0xcb, + 0xc4, 0x47, 0xcc, 0xec, 0x47, 0xcd, 0x14, 0x48, 0xce, 0x3c, 0x48, 0xcf, + 0x64, 0x48, 0xd0, 0x8c, 0x48, 0xd1, 0xb4, 0x48, 0xd2, 0xdc, 0x48, 0xd3, + 0x04, 0x49, 0xd4, 0x2c, 0x49, 0xd5, 0x54, 0x49, 0xd6, 0xc4, 0x46, 0xd7, + 0x9c, 0x49, 0xd8, 0xb4, 0x49, 0xd9, 0xcc, 0x49, 0xda, 0xe4, 0x49, 0xdb, + 0xfc, 0x49, 0xdc, 0x14, 0x4a, 0xdd, 0x2c, 0x4a, 0xde, 0x44, 0x4a, 0xdf, + 0x5c, 0x4a, 0xe0, 0x74, 0x4a, 0xe1, 0x8c, 0x4a, 0xe2, 0xa4, 0x4a, 0xe3, + 0xbc, 0x4a, 0xe4, 0xd4, 0x4a, 0xe5, 0xec, 0x4a, 0xe6, 0x04, 0x4b, 0xe7, + 0x2c, 0x06, 0x63, 0xa0, 0xcf, 0xfa, 0xb4, 0x4f, 0xfa, 0x3c, 0x86, 0xfc, + 0xd4, 0xcf, 0xfd, 0xcc, 0x4f, 0x64, 0xf0, 0xcf, 0xff, 0x04, 0x50, 0xff, + 0x4c, 0x86, 0x01, 0x25, 0xd0, 0x02, 0x1d, 0x50, 0x65, 0x40, 0xd0, 0x04, + 0x55, 0x50, 0x04, 0x5d, 0x86, 0x06, 0x75, 0xd0, 0x07, 0x6d, 0x50, 0x66, + 0x90, 0xd0, 0x09, 0xa5, 0x50, 0x09, 0x6d, 0x86, 0x0b, 0xc5, 0xd0, 0x0c, + 0xbd, 0x50, 0x67, 0xe0, 0xd0, 0x0e, 0xf5, 0x50, 0x0e, 0x7d, 0x86, 0x10, + 0x15, 0xd1, 0x11, 0x0d, 0x51, 0x68, 0x30, 0xd1, 0x13, 0x45, 0x51, 0x13, + 0x8d, 0x86, 0x15, 0x65, 0xd1, 0x16, 0x5d, 0x51, 0x69, 0x80, 0xd1, 0x18, + 0x95, 0x51, 0x18, 0x9d, 0x86, 0x1a, 0xb5, 0xd1, 0x1b, 0xad, 0x51, 0x6a, + 0xd0, 0xd1, 0x1d, 0xe5, 0x51, 0x1d, 0xad, 0x86, 0x1f, 0x05, 0xd2, 0x20, + 0xfd, 0x51, 0x6b, 0x20, 0xd2, 0x22, 0x35, 0x52, 0x22, 0xbd, 0x86, 0x24, + 0x55, 0xd2, 0x25, 0x4d, 0xd2, 0xfb, 0x74, 0x52, 0x63, 0xe0, 0xcf, 0x28, + 0x3d, 0xfe, 0x86, 0x00, 0xa5, 0x52, 0x64, 0x30, 0xd0, 0x2b, 0x4d, 0x86, + 0x05, 0xd5, 0x52, 0x65, 0x80, 0xd0, 0x2e, 0x5d, 0x86, 0x0a, 0x05, 0x53, + 0x66, 0xd0, 0xd0, 0x31, 0x6d, 0x86, 0x0f, 0x35, 0x53, 0x67, 0x20, 0xd1, + 0x34, 0x7d, 0x86, 0x14, 0x65, 0x53, 0x68, 0x70, 0xd1, 0x37, 0x8d, 0x86, + 0x19, 0x95, 0x53, 0x69, 0xc0, 0xd1, 0x3a, 0x9d, 0x86, 0x1e, 0xc5, 0x53, + 0x6a, 0x10, 0xd2, 0x3d, 0xad, 0x86, 0x23, 0xf5, 0x53, 0x6b, 0x60, 0xd2, + 0x40, 0xbd, 0x86, 0x27, 0xbd, 0x4f, 0x29, 0xe5, 0xcf, 0x2a, 0x0d, 0x50, + 0x2c, 0x35, 0xd0, 0x2d, 0x5d, 0x50, 0x2f, 0x85, 0xd0, 0x30, 0xad, 0x50, + 0x32, 0xd5, 0xd0, 0x33, 0xfd, 0x50, 0x35, 0x25, 0xd1, 0x36, 0x4d, 0x51, + 0x38, 0x75, 0xd1, 0x39, 0x9d, 0x51, 0x3b, 0xc5, 0xd1, 0x3c, 0xed, 0x51, + 0x3e, 0x15, 0xd2, 0x3f, 0x3d, 0x52, 0x41, 0x65, 0x52, 0x42, 0xb5, 0x4f, + 0x43, 0xdd, 0x4f, 0x44, 0x05, 0x50, 0x45, 0x2d, 0x50, 0x46, 0x55, 0x50, + 0x47, 0x7d, 0x50, 0x48, 0xa5, 0x50, 0x49, 0xcd, 0x50, 0x4a, 0xf5, 0x50, + 0x4b, 0x1d, 0x51, 0x4c, 0x45, 0x51, 0x4d, 0x6d, 0x51, 0x4e, 0x95, 0x51, + 0x4f, 0xbd, 0x51, 0x50, 0xe5, 0x51, 0x51, 0x0d, 0x52, 0x52, 0x35, 0x52, + 0x53, 0x5d, 0x52, 0x54, 0xad, 0x4f, 0x55, 0xd5, 0x4f, 0x56, 0xfd, 0x4f, + 0x57, 0x25, 0x50, 0x58, 0x4d, 0x50, 0x59, 0x75, 0x50, 0x5a, 0x9d, 0x50, + 0x5b, 0xc5, 0x50, 0x5c, 0xed, 0x50, 0x5d, 0x15, 0x51, 0x5e, 0x3d, 0x51, + 0x5f, 0x65, 0x51, 0x60, 0x8d, 0x51, 0x61, 0xb5, 0x51, 0x62, 0xdd, 0x51, + 0x63, 0x05, 0x52, 0x64, 0x2d, 0x52, 0x65, 0x55, 0x52, 0x66, 0xc5, 0x4f, + 0x67, 0x9d, 0x52, 0x68, 0xb5, 0x52, 0x69, 0xcd, 0x52, 0x6a, 0xe5, 0x52, + 0x6b, 0xfd, 0x52, 0x6c, 0x25, 0x15, 0x53, 0x6d, 0x2d, 0x53, 0x6e, 0x45, + 0x53, 0x6f, 0x5d, 0x53, 0x70, 0x75, 0x53, 0x71, 0x8d, 0x53, 0x72, 0xa5, + 0x53, 0x73, 0xbd, 0x53, 0x74, 0xd5, 0x53, 0x75, 0xed, 0x53, 0x76, 0x05, + 0x54, 0x77, 0xbd, 0x86, 0x80, 0x00, 0x00, 0x3b + }, + RoseImage[] = + { + 0x50, 0x36, 0x0a, 0x37, 0x30, 0x20, 0x34, 0x36, 0x0a, 0x32, 0x35, 0x35, + 0x0a, 0x30, 0x2f, 0x2d, 0x32, 0x30, 0x2e, 0x36, 0x32, 0x2f, 0x38, 0x33, + 0x2e, 0x3a, 0x33, 0x2d, 0x39, 0x32, 0x2d, 0x38, 0x30, 0x2d, 0x39, 0x31, + 0x2e, 0x38, 0x30, 0x2d, 0x38, 0x30, 0x2d, 0x37, 0x2f, 0x2c, 0x35, 0x2d, + 0x2a, 0x34, 0x2c, 0x29, 0x35, 0x2d, 0x2a, 0x35, 0x2d, 0x2a, 0x31, 0x2d, + 0x27, 0x31, 0x2e, 0x27, 0x34, 0x31, 0x2a, 0x37, 0x34, 0x2d, 0x39, 0x36, + 0x2f, 0x3f, 0x3a, 0x2f, 0x46, 0x3f, 0x33, 0x4a, 0x42, 0x34, 0x4c, 0x41, + 0x32, 0x4e, 0x42, 0x32, 0x55, 0x41, 0x32, 0x74, 0x44, 0x34, 0x9a, 0x43, + 0x33, 0xb4, 0x41, 0x35, 0xc5, 0x45, 0x3d, 0xe0, 0x44, 0x47, 0xed, 0x43, + 0x46, 0xf6, 0x3d, 0x42, 0xf1, 0x3c, 0x40, 0xd6, 0x40, 0x3b, 0xb8, 0x3f, + 0x2f, 0xb2, 0x3f, 0x2d, 0xad, 0x40, 0x2d, 0xa3, 0x41, 0x2b, 0x98, 0x40, + 0x2b, 0x92, 0x3f, 0x2e, 0x91, 0x3d, 0x2c, 0x92, 0x3d, 0x2b, 0x93, 0x3d, + 0x2a, 0x95, 0x3f, 0x2e, 0x99, 0x3f, 0x33, 0xb1, 0x42, 0x33, 0xbb, 0x44, + 0x36, 0x95, 0x46, 0x39, 0x52, 0x3a, 0x2f, 0x3a, 0x35, 0x33, 0x37, 0x32, + 0x31, 0x37, 0x32, 0x2f, 0x36, 0x31, 0x2e, 0x33, 0x30, 0x2c, 0x2f, 0x2f, + 0x2d, 0x30, 0x2f, 0x2d, 0x33, 0x2c, 0x2d, 0x36, 0x2b, 0x2d, 0x50, 0x37, + 0x38, 0x82, 0x49, 0x47, 0x9d, 0x62, 0x6e, 0x8c, 0x7c, 0xa6, 0x6c, 0x70, + 0xa5, 0x50, 0x48, 0x6e, 0x52, 0x4c, 0x61, 0x75, 0x77, 0x7c, 0x95, 0x9a, + 0x90, 0x7a, 0x7c, 0x6c, 0x59, 0x56, 0x53, 0x2f, 0x2e, 0x2c, 0x30, 0x2f, + 0x2d, 0x35, 0x30, 0x2d, 0x37, 0x31, 0x2d, 0x38, 0x31, 0x2c, 0x38, 0x30, + 0x2c, 0x36, 0x2f, 0x2c, 0x38, 0x31, 0x2d, 0x38, 0x31, 0x2d, 0x38, 0x31, + 0x2e, 0x37, 0x2e, 0x2c, 0x34, 0x2d, 0x2a, 0x34, 0x2c, 0x2a, 0x36, 0x2f, + 0x2b, 0x36, 0x2e, 0x2b, 0x33, 0x2f, 0x2a, 0x33, 0x30, 0x2a, 0x34, 0x31, + 0x2b, 0x36, 0x33, 0x2d, 0x37, 0x35, 0x30, 0x3e, 0x38, 0x2d, 0x45, 0x3d, + 0x32, 0x48, 0x3f, 0x31, 0x49, 0x3e, 0x2e, 0x4b, 0x40, 0x2f, 0x4d, 0x44, + 0x33, 0x69, 0x45, 0x34, 0x8c, 0x40, 0x2e, 0xa6, 0x3c, 0x2d, 0xba, 0x47, + 0x3c, 0xdc, 0x44, 0x47, 0xeb, 0x42, 0x45, 0xfc, 0x3c, 0x41, 0xf7, 0x3c, + 0x40, 0xd1, 0x41, 0x3b, 0xb1, 0x3f, 0x2d, 0xb0, 0x3f, 0x2b, 0xad, 0x3f, + 0x2c, 0xa2, 0x40, 0x2b, 0x97, 0x3f, 0x2b, 0x91, 0x3e, 0x2e, 0x90, 0x3d, + 0x2c, 0x91, 0x3d, 0x2a, 0x90, 0x3b, 0x2a, 0x91, 0x3e, 0x2d, 0x98, 0x3e, + 0x33, 0xba, 0x40, 0x34, 0xc8, 0x44, 0x38, 0x93, 0x48, 0x3b, 0x44, 0x37, + 0x2c, 0x39, 0x35, 0x35, 0x39, 0x33, 0x31, 0x36, 0x32, 0x2f, 0x36, 0x32, + 0x2e, 0x31, 0x31, 0x2d, 0x2d, 0x31, 0x2e, 0x30, 0x30, 0x2e, 0x35, 0x2f, + 0x2e, 0x32, 0x2a, 0x2c, 0x45, 0x32, 0x31, 0x78, 0x41, 0x35, 0x94, 0x59, + 0x5c, 0x86, 0x7d, 0xab, 0x63, 0x6c, 0xac, 0x4a, 0x3e, 0x6b, 0x4b, 0x40, + 0x5c, 0x5d, 0x5e, 0x67, 0x80, 0x86, 0x7e, 0x6c, 0x70, 0x5f, 0x59, 0x57, + 0x53, 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, 0x2b, 0x30, 0x2f, 0x2c, 0x31, 0x2e, + 0x2b, 0x32, 0x2c, 0x28, 0x32, 0x2d, 0x2a, 0x30, 0x2c, 0x2b, 0x32, 0x2c, + 0x2b, 0x32, 0x2b, 0x2b, 0x32, 0x2c, 0x2b, 0x32, 0x2c, 0x2b, 0x31, 0x2c, + 0x2b, 0x31, 0x2c, 0x29, 0x33, 0x2d, 0x2c, 0x33, 0x2d, 0x2c, 0x33, 0x2f, + 0x2c, 0x33, 0x31, 0x2c, 0x34, 0x30, 0x2c, 0x35, 0x32, 0x2d, 0x37, 0x35, + 0x30, 0x3a, 0x33, 0x2c, 0x3e, 0x36, 0x2d, 0x40, 0x36, 0x2d, 0x43, 0x38, + 0x2d, 0x48, 0x3b, 0x2f, 0x45, 0x45, 0x35, 0x55, 0x44, 0x34, 0x6d, 0x3d, + 0x2b, 0x84, 0x39, 0x28, 0x9f, 0x45, 0x34, 0xc0, 0x48, 0x3d, 0xdc, 0x45, + 0x40, 0xf6, 0x3c, 0x3e, 0xec, 0x3e, 0x3d, 0xb9, 0x41, 0x30, 0xa5, 0x40, + 0x2a, 0xa9, 0x3f, 0x2d, 0xa5, 0x3e, 0x2d, 0x9b, 0x3f, 0x2c, 0x91, 0x3e, + 0x29, 0x8e, 0x3e, 0x2c, 0x8c, 0x3d, 0x2d, 0x8b, 0x3c, 0x2d, 0x89, 0x3b, + 0x2e, 0x89, 0x3f, 0x2f, 0x9b, 0x42, 0x31, 0xc3, 0x40, 0x38, 0xc3, 0x47, + 0x44, 0x89, 0x57, 0x4e, 0x3c, 0x3f, 0x35, 0x3b, 0x34, 0x31, 0x39, 0x33, + 0x2e, 0x35, 0x33, 0x2e, 0x31, 0x34, 0x2f, 0x2d, 0x34, 0x2e, 0x2c, 0x34, + 0x30, 0x2f, 0x33, 0x2f, 0x31, 0x32, 0x30, 0x30, 0x30, 0x2e, 0x33, 0x2d, + 0x2b, 0x49, 0x2e, 0x21, 0x6c, 0x4d, 0x4e, 0x8a, 0x87, 0xbd, 0x6b, 0x71, + 0xc6, 0x48, 0x3d, 0x7f, 0x3d, 0x31, 0x58, 0x35, 0x34, 0x48, 0x3e, 0x46, + 0x46, 0x49, 0x53, 0x49, 0x59, 0x5a, 0x4f, 0x2c, 0x2d, 0x2f, 0x2b, 0x2d, + 0x2f, 0x2e, 0x2d, 0x2d, 0x2f, 0x2d, 0x29, 0x2f, 0x2a, 0x27, 0x2d, 0x2b, + 0x28, 0x2c, 0x2a, 0x2a, 0x2c, 0x2a, 0x2a, 0x2e, 0x2b, 0x2b, 0x2e, 0x2b, + 0x2b, 0x2e, 0x2b, 0x2b, 0x2f, 0x2b, 0x2b, 0x2f, 0x2d, 0x2d, 0x30, 0x2c, + 0x2c, 0x30, 0x2d, 0x2e, 0x2f, 0x2d, 0x2a, 0x32, 0x2e, 0x2c, 0x32, 0x2e, + 0x2b, 0x32, 0x2d, 0x2c, 0x33, 0x30, 0x2e, 0x38, 0x32, 0x2f, 0x3c, 0x34, + 0x2f, 0x3e, 0x34, 0x2f, 0x41, 0x35, 0x2d, 0x46, 0x39, 0x31, 0x48, 0x3e, + 0x37, 0x51, 0x3c, 0x35, 0x5f, 0x37, 0x30, 0x79, 0x37, 0x2d, 0x93, 0x3b, + 0x2f, 0xa3, 0x41, 0x33, 0xbc, 0x45, 0x39, 0xde, 0x45, 0x40, 0xda, 0x48, + 0x41, 0xa7, 0x42, 0x2f, 0x9b, 0x40, 0x2c, 0x9e, 0x3e, 0x2d, 0x9c, 0x3d, + 0x2f, 0x94, 0x3d, 0x2d, 0x8c, 0x3d, 0x2b, 0x88, 0x3c, 0x2b, 0x87, 0x3c, + 0x2c, 0x85, 0x3c, 0x2e, 0x82, 0x3c, 0x32, 0x86, 0x43, 0x37, 0x9d, 0x47, + 0x3a, 0xba, 0x45, 0x40, 0xb4, 0x67, 0x5f, 0x8f, 0x8a, 0x79, 0x57, 0x65, + 0x57, 0x43, 0x42, 0x38, 0x37, 0x35, 0x2b, 0x2f, 0x31, 0x2a, 0x2e, 0x31, + 0x2b, 0x2d, 0x30, 0x2c, 0x2d, 0x30, 0x2f, 0x2f, 0x30, 0x2e, 0x30, 0x32, + 0x2e, 0x2f, 0x32, 0x2e, 0x2f, 0x2d, 0x32, 0x34, 0x2a, 0x2c, 0x67, 0x63, + 0x62, 0x9a, 0x9d, 0xce, 0x7e, 0x87, 0xd0, 0x69, 0x70, 0x9e, 0x59, 0x5c, + 0x6f, 0x60, 0x70, 0x72, 0x82, 0x96, 0x8c, 0x7c, 0x8f, 0x81, 0x5f, 0x65, + 0x51, 0x2c, 0x2f, 0x32, 0x2b, 0x2f, 0x32, 0x2e, 0x2e, 0x30, 0x2d, 0x2e, + 0x2d, 0x2d, 0x2b, 0x29, 0x2c, 0x2a, 0x2b, 0x2b, 0x29, 0x2b, 0x28, 0x27, + 0x28, 0x2a, 0x2a, 0x2b, 0x2c, 0x2a, 0x2b, 0x2c, 0x2a, 0x2b, 0x2a, 0x29, + 0x29, 0x2a, 0x28, 0x29, 0x2d, 0x2b, 0x2c, 0x2e, 0x2d, 0x2e, 0x2f, 0x2c, + 0x2b, 0x30, 0x2c, 0x2b, 0x2e, 0x2a, 0x29, 0x2f, 0x2b, 0x2b, 0x30, 0x2d, + 0x2d, 0x38, 0x31, 0x31, 0x3c, 0x33, 0x32, 0x3b, 0x32, 0x31, 0x3e, 0x30, + 0x2e, 0x41, 0x32, 0x2f, 0x41, 0x37, 0x33, 0x42, 0x3a, 0x36, 0x4b, 0x36, + 0x32, 0x68, 0x37, 0x2f, 0x89, 0x3d, 0x30, 0x95, 0x3e, 0x35, 0x98, 0x41, + 0x33, 0xaf, 0x44, 0x37, 0xba, 0x47, 0x3c, 0x9e, 0x3f, 0x33, 0x92, 0x3f, + 0x2c, 0x94, 0x3d, 0x2b, 0x95, 0x3b, 0x2d, 0x8e, 0x3c, 0x2d, 0x87, 0x3b, + 0x2c, 0x87, 0x39, 0x29, 0x82, 0x39, 0x2a, 0x7f, 0x3a, 0x2e, 0x7f, 0x3f, + 0x37, 0x86, 0x47, 0x40, 0x97, 0x45, 0x3e, 0xae, 0x55, 0x52, 0xa3, 0x91, + 0x7b, 0x8c, 0xab, 0x8c, 0x72, 0x81, 0x70, 0x53, 0x5a, 0x47, 0x3c, 0x40, + 0x33, 0x30, 0x31, 0x28, 0x2d, 0x29, 0x27, 0x32, 0x2c, 0x2b, 0x32, 0x2c, + 0x2b, 0x30, 0x2c, 0x2a, 0x30, 0x2d, 0x2b, 0x30, 0x2f, 0x2b, 0x32, 0x2a, + 0x31, 0x30, 0x29, 0x28, 0x65, 0x71, 0x52, 0x95, 0xa1, 0x9c, 0x8f, 0xa5, + 0xa3, 0xa6, 0xca, 0xb3, 0xa4, 0xc7, 0xb0, 0x8f, 0xb6, 0x97, 0x99, 0xba, + 0x98, 0x85, 0xa1, 0x84, 0x59, 0x64, 0x4a, 0x2e, 0x30, 0x2e, 0x2f, 0x2f, + 0x2d, 0x2f, 0x31, 0x2e, 0x32, 0x31, 0x2e, 0x33, 0x30, 0x2d, 0x33, 0x2f, + 0x2c, 0x32, 0x2d, 0x2a, 0x2d, 0x2a, 0x2b, 0x2c, 0x2b, 0x2c, 0x2a, 0x29, + 0x2d, 0x2b, 0x28, 0x2c, 0x2d, 0x27, 0x2c, 0x2b, 0x28, 0x29, 0x2c, 0x2a, + 0x29, 0x2d, 0x2d, 0x2b, 0x2f, 0x2d, 0x2c, 0x2e, 0x2b, 0x2a, 0x2f, 0x2b, + 0x29, 0x34, 0x2c, 0x29, 0x36, 0x2f, 0x2a, 0x3b, 0x33, 0x2e, 0x3d, 0x34, + 0x30, 0x3b, 0x31, 0x2d, 0x3b, 0x2f, 0x2e, 0x3e, 0x2f, 0x2e, 0x3e, 0x33, + 0x2c, 0x35, 0x39, 0x2f, 0x39, 0x33, 0x2c, 0x4f, 0x2c, 0x27, 0x69, 0x3a, + 0x2d, 0x83, 0x41, 0x31, 0x8e, 0x40, 0x31, 0x92, 0x3b, 0x2d, 0x98, 0x42, + 0x32, 0x94, 0x3e, 0x32, 0x93, 0x3c, 0x2f, 0x89, 0x3d, 0x2e, 0x89, 0x3f, + 0x2f, 0x8b, 0x3c, 0x2f, 0x84, 0x39, 0x2c, 0x7b, 0x3b, 0x2c, 0x76, 0x3a, + 0x2a, 0x7d, 0x3b, 0x30, 0x86, 0x47, 0x3b, 0x87, 0x4b, 0x44, 0x95, 0x51, + 0x4f, 0x93, 0x81, 0x70, 0x90, 0xa9, 0x8b, 0x89, 0xad, 0x8e, 0x77, 0x96, + 0x79, 0x5c, 0x7b, 0x5a, 0x4e, 0x5e, 0x47, 0x3d, 0x3a, 0x33, 0x32, 0x27, + 0x28, 0x2f, 0x27, 0x29, 0x2d, 0x28, 0x2b, 0x30, 0x28, 0x2c, 0x32, 0x28, + 0x2f, 0x31, 0x2b, 0x30, 0x30, 0x2a, 0x30, 0x2b, 0x27, 0x1f, 0x5b, 0x66, + 0x40, 0x91, 0xa2, 0x76, 0x8c, 0xaa, 0x76, 0xa0, 0xc9, 0x8c, 0x9d, 0xc3, + 0x93, 0x84, 0xaf, 0x7e, 0x87, 0xad, 0x82, 0x76, 0x8e, 0x70, 0x4f, 0x5b, + 0x44, 0x32, 0x33, 0x2d, 0x33, 0x34, 0x2d, 0x35, 0x33, 0x2e, 0x39, 0x36, + 0x31, 0x39, 0x36, 0x31, 0x3a, 0x32, 0x2e, 0x38, 0x30, 0x2d, 0x33, 0x2e, + 0x2c, 0x33, 0x30, 0x30, 0x2d, 0x2e, 0x30, 0x2f, 0x28, 0x2f, 0x31, 0x29, + 0x2e, 0x2f, 0x2a, 0x2c, 0x31, 0x2e, 0x2a, 0x31, 0x30, 0x2a, 0x30, 0x31, + 0x2e, 0x2f, 0x30, 0x30, 0x34, 0x2f, 0x2b, 0x3b, 0x31, 0x2b, 0x41, 0x35, + 0x2c, 0x43, 0x38, 0x2f, 0x41, 0x39, 0x30, 0x3d, 0x35, 0x2d, 0x3b, 0x30, + 0x2f, 0x3c, 0x31, 0x2f, 0x45, 0x31, 0x2d, 0x52, 0x29, 0x2e, 0x46, 0x2a, + 0x2e, 0x37, 0x30, 0x29, 0x52, 0x2f, 0x28, 0x6a, 0x39, 0x2e, 0x83, 0x3a, + 0x37, 0x86, 0x39, 0x34, 0x7f, 0x3f, 0x35, 0x84, 0x42, 0x36, 0x89, 0x41, + 0x31, 0x85, 0x3e, 0x2d, 0x88, 0x3a, 0x2b, 0x85, 0x3b, 0x2a, 0x76, 0x3e, + 0x29, 0x76, 0x38, 0x2c, 0x73, 0x39, 0x2d, 0x7b, 0x40, 0x34, 0x89, 0x47, + 0x3e, 0x88, 0x4e, 0x45, 0x86, 0x64, 0x56, 0x7a, 0x92, 0x71, 0x7b, 0xaf, + 0x88, 0x83, 0xb1, 0x8c, 0x76, 0x9e, 0x7c, 0x65, 0x92, 0x67, 0x64, 0x87, + 0x65, 0x50, 0x66, 0x50, 0x34, 0x3d, 0x30, 0x2a, 0x26, 0x23, 0x2e, 0x24, + 0x26, 0x2b, 0x2a, 0x2a, 0x29, 0x2b, 0x2c, 0x27, 0x2b, 0x2f, 0x27, 0x27, + 0x2d, 0x29, 0x24, 0x22, 0x57, 0x5c, 0x48, 0x7e, 0x91, 0x6a, 0x7b, 0x9c, + 0x6a, 0x7e, 0xa3, 0x6f, 0x7f, 0xa5, 0x6f, 0x7d, 0xa5, 0x74, 0x7e, 0xa1, + 0x7b, 0x6f, 0x89, 0x6c, 0x4c, 0x56, 0x44, 0x37, 0x38, 0x32, 0x37, 0x38, + 0x32, 0x39, 0x39, 0x34, 0x3c, 0x3a, 0x35, 0x40, 0x3d, 0x38, 0x42, 0x3a, + 0x38, 0x41, 0x39, 0x35, 0x3d, 0x37, 0x33, 0x3c, 0x37, 0x35, 0x3a, 0x35, + 0x34, 0x39, 0x30, 0x30, 0x39, 0x2f, 0x2f, 0x36, 0x31, 0x2e, 0x36, 0x32, + 0x2e, 0x36, 0x33, 0x2e, 0x36, 0x34, 0x31, 0x39, 0x37, 0x33, 0x3f, 0x37, + 0x32, 0x42, 0x39, 0x30, 0x48, 0x3d, 0x31, 0x4a, 0x3e, 0x34, 0x48, 0x3d, + 0x34, 0x42, 0x38, 0x30, 0x40, 0x36, 0x31, 0x3f, 0x36, 0x32, 0x3c, 0x39, + 0x34, 0x43, 0x35, 0x34, 0x41, 0x35, 0x30, 0x3c, 0x36, 0x2a, 0x45, 0x35, + 0x27, 0x63, 0x36, 0x2d, 0x87, 0x3d, 0x3b, 0x90, 0x42, 0x41, 0x84, 0x43, + 0x3b, 0x84, 0x3e, 0x36, 0x7f, 0x41, 0x35, 0x7e, 0x3a, 0x2f, 0x79, 0x3b, + 0x2f, 0x75, 0x3e, 0x2e, 0x7a, 0x34, 0x29, 0xb9, 0x50, 0x4c, 0xac, 0x5b, + 0x56, 0x70, 0x4a, 0x39, 0x6b, 0x53, 0x40, 0x73, 0x60, 0x49, 0x7f, 0x7a, + 0x58, 0xb6, 0x66, 0x60, 0xbf, 0x7a, 0x72, 0xa2, 0xa1, 0x85, 0x8f, 0xa0, + 0x7e, 0x8b, 0x97, 0x76, 0x80, 0x9e, 0x78, 0x6f, 0x93, 0x6f, 0x58, 0x69, + 0x4d, 0x3f, 0x3b, 0x29, 0x33, 0x29, 0x22, 0x25, 0x2b, 0x21, 0x2b, 0x2f, + 0x26, 0x3a, 0x26, 0x2a, 0x43, 0x29, 0x29, 0x54, 0x4e, 0x3a, 0x68, 0x71, + 0x52, 0x68, 0x83, 0x57, 0x6b, 0x91, 0x5c, 0x6e, 0x9a, 0x63, 0x6b, 0x98, + 0x68, 0x73, 0x9c, 0x74, 0x74, 0x95, 0x74, 0x68, 0x86, 0x64, 0x4e, 0x58, + 0x43, 0x38, 0x39, 0x33, 0x39, 0x3a, 0x34, 0x3e, 0x3e, 0x38, 0x41, 0x3f, + 0x3a, 0x44, 0x3f, 0x3a, 0x46, 0x41, 0x3c, 0x45, 0x41, 0x3a, 0x45, 0x40, + 0x3a, 0x47, 0x3f, 0x38, 0x45, 0x3d, 0x34, 0x44, 0x3b, 0x31, 0x43, 0x3a, + 0x33, 0x43, 0x3a, 0x33, 0x3c, 0x38, 0x30, 0x39, 0x35, 0x2f, 0x39, 0x34, + 0x2f, 0x3c, 0x37, 0x30, 0x42, 0x3c, 0x30, 0x49, 0x3d, 0x30, 0x4f, 0x41, + 0x32, 0x50, 0x40, 0x35, 0x4b, 0x3c, 0x34, 0x45, 0x3a, 0x31, 0x41, 0x3a, + 0x31, 0x3d, 0x3c, 0x33, 0x47, 0x37, 0x30, 0x8b, 0x45, 0x4a, 0x9a, 0x47, + 0x49, 0x86, 0x43, 0x3a, 0xab, 0x4b, 0x48, 0xa2, 0x46, 0x39, 0xa6, 0x3f, + 0x33, 0xa8, 0x43, 0x35, 0xa2, 0x45, 0x31, 0xaa, 0x40, 0x32, 0xac, 0x3e, + 0x42, 0x9e, 0x43, 0x45, 0x76, 0x43, 0x39, 0x79, 0x3a, 0x34, 0xbf, 0x3c, + 0x48, 0xe1, 0x45, 0x47, 0xc3, 0x55, 0x50, 0x70, 0x59, 0x43, 0x60, 0x6a, + 0x48, 0x90, 0x6c, 0x53, 0xe8, 0x53, 0x5a, 0xff, 0x28, 0x48, 0xff, 0x29, + 0x4b, 0xf9, 0x40, 0x56, 0xf0, 0x4d, 0x5f, 0xe4, 0x59, 0x68, 0xdb, 0x66, + 0x6e, 0xd4, 0x6a, 0x72, 0xd2, 0x5f, 0x6d, 0xd4, 0x57, 0x6b, 0xc2, 0x50, + 0x62, 0x96, 0x46, 0x4f, 0x52, 0x2e, 0x28, 0x3e, 0x33, 0x28, 0x47, 0x40, + 0x2d, 0x65, 0x5e, 0x3a, 0x77, 0x83, 0x5c, 0x6e, 0x87, 0x5c, 0x6d, 0x89, + 0x59, 0x73, 0x8f, 0x64, 0x7e, 0x98, 0x7b, 0x8c, 0xa2, 0x8e, 0x80, 0x96, + 0x81, 0x64, 0x7d, 0x5f, 0x53, 0x5f, 0x47, 0x36, 0x37, 0x31, 0x36, 0x38, + 0x31, 0x3d, 0x3d, 0x38, 0x42, 0x40, 0x3b, 0x46, 0x41, 0x3f, 0x48, 0x43, + 0x3e, 0x48, 0x43, 0x3e, 0x4a, 0x44, 0x3c, 0x4d, 0x42, 0x37, 0x4a, 0x3d, + 0x30, 0x48, 0x3c, 0x2d, 0x46, 0x3d, 0x2f, 0x45, 0x3b, 0x30, 0x41, 0x39, + 0x31, 0x3c, 0x37, 0x31, 0x3a, 0x37, 0x2e, 0x3e, 0x39, 0x2c, 0x45, 0x3c, + 0x2f, 0x4d, 0x3f, 0x2f, 0x4f, 0x41, 0x30, 0x4f, 0x3e, 0x31, 0x4b, 0x3b, + 0x31, 0x44, 0x3a, 0x2f, 0x3e, 0x3d, 0x31, 0x37, 0x3d, 0x30, 0x80, 0x42, + 0x40, 0xed, 0x4b, 0x5d, 0xcb, 0x33, 0x35, 0x9b, 0x3b, 0x23, 0xc1, 0x3f, + 0x35, 0xac, 0x3b, 0x30, 0xb3, 0x3e, 0x33, 0xb7, 0x44, 0x37, 0xa5, 0x3a, + 0x28, 0xb9, 0x3e, 0x32, 0xd1, 0x3e, 0x38, 0xef, 0x38, 0x3f, 0xe1, 0x3c, + 0x3c, 0xd4, 0x44, 0x3f, 0xeb, 0x37, 0x3b, 0xda, 0x2e, 0x27, 0xc4, 0x42, + 0x3a, 0x92, 0x64, 0x4f, 0x88, 0x63, 0x4a, 0xde, 0x63, 0x5e, 0xf7, 0x3b, + 0x45, 0xe0, 0x42, 0x43, 0xf5, 0x46, 0x4f, 0xfe, 0x2e, 0x45, 0xff, 0x2c, + 0x48, 0xff, 0x30, 0x54, 0xff, 0x34, 0x5c, 0xff, 0x3a, 0x68, 0xff, 0x3a, + 0x6f, 0xff, 0x41, 0x72, 0xff, 0x47, 0x6f, 0xff, 0x5a, 0x78, 0xc6, 0x5b, + 0x66, 0x61, 0x3d, 0x33, 0x48, 0x43, 0x2f, 0x7f, 0x76, 0x64, 0x9a, 0x9f, + 0x95, 0x91, 0x9e, 0x98, 0x98, 0xa0, 0x9a, 0xb6, 0xb5, 0xad, 0xd1, 0xcb, + 0xc6, 0xd4, 0xcc, 0xd3, 0xb0, 0xb1, 0xb1, 0x67, 0x7b, 0x65, 0x57, 0x67, + 0x4c, 0x33, 0x33, 0x30, 0x35, 0x35, 0x31, 0x38, 0x38, 0x33, 0x3d, 0x3c, + 0x36, 0x44, 0x43, 0x39, 0x47, 0x47, 0x3e, 0x4a, 0x49, 0x3b, 0x4d, 0x49, + 0x36, 0x49, 0x45, 0x37, 0x4d, 0x48, 0x4a, 0x48, 0x40, 0x39, 0x45, 0x3b, + 0x2b, 0x43, 0x39, 0x2d, 0x3f, 0x38, 0x30, 0x3e, 0x38, 0x33, 0x3d, 0x37, + 0x31, 0x3e, 0x39, 0x34, 0x40, 0x3d, 0x39, 0x49, 0x41, 0x36, 0x50, 0x40, + 0x2d, 0x48, 0x3f, 0x2d, 0x4b, 0x38, 0x31, 0x43, 0x37, 0x34, 0x35, 0x3d, + 0x30, 0x40, 0x3f, 0x2f, 0xa6, 0x49, 0x40, 0xaf, 0x34, 0x2b, 0xa4, 0x34, + 0x21, 0xa6, 0x41, 0x26, 0xa9, 0x3a, 0x24, 0xa0, 0x36, 0x27, 0xa9, 0x3d, + 0x32, 0xac, 0x41, 0x31, 0xb0, 0x40, 0x32, 0xbf, 0x40, 0x34, 0xcc, 0x38, + 0x29, 0xe8, 0x31, 0x2b, 0xf9, 0x2b, 0x2b, 0xf3, 0x30, 0x29, 0xe1, 0x36, + 0x25, 0xd8, 0x35, 0x21, 0xc7, 0x39, 0x2c, 0xc5, 0x55, 0x49, 0xe0, 0x55, + 0x51, 0xfe, 0x41, 0x4b, 0xdf, 0x3f, 0x41, 0xae, 0x3b, 0x2e, 0xc4, 0x45, + 0x3b, 0xec, 0x41, 0x44, 0xfc, 0x3e, 0x48, 0xfd, 0x41, 0x51, 0xff, 0x3d, + 0x56, 0xfe, 0x3e, 0x68, 0xfb, 0x3e, 0x71, 0xfc, 0x45, 0x77, 0xf9, 0x4a, + 0x6e, 0xfd, 0x57, 0x78, 0xff, 0x59, 0x7f, 0xcd, 0x5d, 0x6e, 0x87, 0x6e, + 0x64, 0xd3, 0xc8, 0xc1, 0xe0, 0xe0, 0xea, 0xe6, 0xd6, 0xf0, 0xf5, 0xe1, + 0xf9, 0xfd, 0xf3, 0xf9, 0xfd, 0xf4, 0xf3, 0xf5, 0xe7, 0xf0, 0xd3, 0xce, + 0xd2, 0x85, 0x8d, 0x83, 0x75, 0x81, 0x6e, 0x31, 0x30, 0x2d, 0x2f, 0x2e, + 0x2c, 0x34, 0x33, 0x2f, 0x38, 0x39, 0x32, 0x3e, 0x3f, 0x35, 0x47, 0x44, + 0x3b, 0x4f, 0x4b, 0x38, 0x4d, 0x4b, 0x34, 0x58, 0x57, 0x57, 0x80, 0x83, + 0xa5, 0x7c, 0x78, 0xa0, 0x5b, 0x54, 0x6f, 0x46, 0x3f, 0x4f, 0x39, 0x34, + 0x34, 0x36, 0x32, 0x26, 0x35, 0x32, 0x29, 0x3a, 0x39, 0x2e, 0x42, 0x3d, + 0x2d, 0x4b, 0x40, 0x2f, 0x50, 0x40, 0x2f, 0x43, 0x3b, 0x2a, 0x3a, 0x34, + 0x29, 0x30, 0x34, 0x30, 0x42, 0x31, 0x2d, 0x8a, 0x36, 0x3c, 0xae, 0x3b, + 0x2f, 0xa4, 0x3c, 0x27, 0xa1, 0x3b, 0x25, 0xb5, 0x3e, 0x2c, 0xc7, 0x3d, + 0x31, 0xb8, 0x3b, 0x31, 0xad, 0x39, 0x2a, 0xb3, 0x3a, 0x2b, 0xc3, 0x3f, + 0x32, 0xc4, 0x33, 0x2a, 0xd6, 0x34, 0x2c, 0xdc, 0x38, 0x2e, 0xf1, 0x31, + 0x2b, 0xf0, 0x2f, 0x28, 0xd4, 0x35, 0x20, 0xda, 0x34, 0x21, 0xd4, 0x39, + 0x2c, 0xd0, 0x3f, 0x36, 0xdb, 0x43, 0x41, 0xde, 0x41, 0x3e, 0xc7, 0x3e, + 0x33, 0xae, 0x39, 0x28, 0xaf, 0x3d, 0x2d, 0xd5, 0x45, 0x40, 0xf3, 0x46, + 0x4b, 0xf7, 0x44, 0x4b, 0xfe, 0x44, 0x58, 0xfe, 0x42, 0x62, 0xff, 0x4a, + 0x74, 0xff, 0x4b, 0x7d, 0xfe, 0x4d, 0x7a, 0xfe, 0x54, 0x74, 0xf3, 0x43, + 0x63, 0xe4, 0x7b, 0x88, 0x89, 0x5f, 0x54, 0xf1, 0xd3, 0xc9, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, + 0xfb, 0xff, 0xf9, 0xfd, 0xf2, 0xe9, 0xec, 0xc0, 0xbf, 0xb8, 0xb5, 0xba, + 0xb0, 0x3a, 0x38, 0x31, 0x36, 0x33, 0x2d, 0x33, 0x30, 0x2b, 0x37, 0x34, + 0x2c, 0x3c, 0x3b, 0x32, 0x49, 0x41, 0x36, 0x56, 0x4a, 0x39, 0x54, 0x48, + 0x3a, 0x64, 0x61, 0x72, 0x9e, 0xa5, 0xe4, 0xac, 0xb2, 0xff, 0x9d, 0xa1, + 0xec, 0x8f, 0x8f, 0xc5, 0x6e, 0x6d, 0x8e, 0x4c, 0x49, 0x58, 0x40, 0x3f, + 0x4d, 0x3c, 0x39, 0x39, 0x41, 0x3d, 0x28, 0x42, 0x43, 0x2e, 0x38, 0x41, + 0x39, 0x3a, 0x45, 0x51, 0x45, 0x55, 0x61, 0x46, 0x53, 0x52, 0x61, 0x47, + 0x3c, 0x94, 0x46, 0x37, 0xa8, 0x3d, 0x2b, 0xae, 0x41, 0x2d, 0xb0, 0x3b, + 0x28, 0xbf, 0x36, 0x2a, 0xd4, 0x38, 0x30, 0xd2, 0x3a, 0x34, 0xce, 0x38, + 0x32, 0xd3, 0x3a, 0x33, 0xd7, 0x3b, 0x32, 0xdf, 0x3f, 0x37, 0xeb, 0x31, + 0x27, 0xf4, 0x2d, 0x28, 0xf9, 0x2d, 0x28, 0xeb, 0x32, 0x28, 0xd2, 0x37, + 0x21, 0xcf, 0x37, 0x22, 0xd1, 0x35, 0x28, 0xd9, 0x43, 0x3c, 0xdd, 0x56, + 0x4d, 0xba, 0x3e, 0x32, 0xb3, 0x3a, 0x23, 0xb9, 0x3a, 0x29, 0xc6, 0x40, + 0x37, 0xd2, 0x48, 0x46, 0xd8, 0x47, 0x48, 0xed, 0x46, 0x4a, 0xfb, 0x4f, + 0x5c, 0xf8, 0x46, 0x60, 0xfd, 0x4a, 0x6e, 0xfc, 0x52, 0x7a, 0xf7, 0x58, + 0x7a, 0xfd, 0x55, 0x71, 0xf9, 0x53, 0x67, 0xff, 0x60, 0x70, 0xd5, 0x4b, + 0x55, 0xe1, 0xaa, 0xa4, 0xff, 0xff, 0xfe, 0xfc, 0xff, 0xff, 0xfd, 0xfd, + 0xfe, 0xfe, 0xfa, 0xf5, 0xff, 0xfa, 0xf9, 0xfe, 0xf0, 0xf4, 0xea, 0xdc, + 0xdb, 0xef, 0xe6, 0xdb, 0xeb, 0xed, 0xe4, 0x44, 0x40, 0x35, 0x41, 0x3d, + 0x33, 0x3b, 0x36, 0x2d, 0x35, 0x32, 0x28, 0x3a, 0x35, 0x2f, 0x46, 0x3d, + 0x37, 0x54, 0x47, 0x36, 0x57, 0x46, 0x37, 0x5d, 0x55, 0x6a, 0x90, 0x99, + 0xde, 0xab, 0xb8, 0xff, 0xb5, 0xbe, 0xff, 0xb9, 0xbe, 0xff, 0xa7, 0xa7, + 0xef, 0x80, 0x7c, 0xc2, 0x66, 0x5c, 0x9e, 0x52, 0x4c, 0x73, 0x37, 0x3a, + 0x43, 0x3a, 0x39, 0x37, 0x52, 0x4a, 0x4e, 0x86, 0x73, 0x9b, 0xaa, 0x81, + 0xae, 0xba, 0x5d, 0x7b, 0xc8, 0x4b, 0x50, 0xb3, 0x3c, 0x27, 0xa9, 0x39, + 0x23, 0xb3, 0x3a, 0x2a, 0xc1, 0x3b, 0x2d, 0xd4, 0x3c, 0x33, 0xe1, 0x3b, + 0x33, 0xdb, 0x36, 0x31, 0xe5, 0x3e, 0x39, 0xe6, 0x3c, 0x37, 0xdc, 0x38, + 0x2f, 0xe3, 0x44, 0x39, 0xf4, 0x3f, 0x34, 0xfb, 0x29, 0x29, 0xfa, 0x2b, + 0x2b, 0xe3, 0x32, 0x2c, 0xcf, 0x32, 0x25, 0xc9, 0x3c, 0x28, 0xd0, 0x3a, + 0x2a, 0xd4, 0x37, 0x2d, 0xe4, 0x4c, 0x48, 0xd1, 0x43, 0x40, 0xbb, 0x39, + 0x24, 0xbf, 0x39, 0x28, 0xc7, 0x3e, 0x32, 0xd3, 0x51, 0x49, 0xc4, 0x45, + 0x3e, 0xe0, 0x4e, 0x49, 0xe7, 0x51, 0x53, 0xf0, 0x54, 0x61, 0xfd, 0x56, + 0x6e, 0xfb, 0x4e, 0x6f, 0xfd, 0x55, 0x78, 0xff, 0x57, 0x6f, 0xff, 0x5a, + 0x69, 0xfc, 0x57, 0x65, 0xca, 0x4f, 0x54, 0xa1, 0x74, 0x6e, 0xfa, 0xe1, + 0xe0, 0xfc, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfe, 0xf9, 0xf7, 0xff, 0xfa, + 0xf5, 0xfa, 0xef, 0xf0, 0xdc, 0xce, 0xc9, 0xf9, 0xf2, 0xe0, 0xf9, 0xfb, + 0xee, 0x4f, 0x49, 0x3b, 0x4d, 0x47, 0x3a, 0x46, 0x40, 0x35, 0x3f, 0x39, + 0x30, 0x3d, 0x36, 0x30, 0x41, 0x3d, 0x38, 0x4d, 0x45, 0x35, 0x53, 0x44, + 0x2e, 0x57, 0x4c, 0x53, 0x84, 0x8e, 0xc1, 0xa6, 0xae, 0xfb, 0xb0, 0xb2, + 0xff, 0xb2, 0xb4, 0xff, 0xa9, 0xac, 0xf9, 0x9c, 0xa0, 0xed, 0x8b, 0x8d, + 0xd8, 0x6f, 0x7a, 0xb6, 0x61, 0x65, 0x87, 0x85, 0x4e, 0x5f, 0xcb, 0x4f, + 0x57, 0xef, 0x4c, 0x5d, 0xdc, 0x48, 0x52, 0xd2, 0x3b, 0x3e, 0xe6, 0x3e, + 0x3e, 0xce, 0x3e, 0x35, 0xbc, 0x3e, 0x2f, 0xc6, 0x3f, 0x32, 0xd4, 0x3e, + 0x34, 0xd9, 0x39, 0x2f, 0xdb, 0x33, 0x2b, 0xda, 0x37, 0x2f, 0xde, 0x38, + 0x2f, 0xd9, 0x33, 0x29, 0xd1, 0x33, 0x24, 0xca, 0x39, 0x22, 0xdb, 0x3e, + 0x30, 0xfe, 0x38, 0x3b, 0xf7, 0x30, 0x35, 0xdb, 0x32, 0x30, 0xdf, 0x35, + 0x34, 0xef, 0x35, 0x33, 0xe2, 0x37, 0x2b, 0xd9, 0x3e, 0x2f, 0xe3, 0x50, + 0x4a, 0xdc, 0x45, 0x49, 0xd0, 0x3d, 0x33, 0xc2, 0x38, 0x2b, 0xbc, 0x3c, + 0x2d, 0xc0, 0x43, 0x32, 0xbc, 0x3d, 0x2d, 0xc7, 0x48, 0x3d, 0xce, 0x4e, + 0x4a, 0xe6, 0x5c, 0x61, 0xfe, 0x66, 0x76, 0xfd, 0x50, 0x6d, 0xfa, 0x5a, + 0x75, 0xf1, 0x72, 0x78, 0xf3, 0x62, 0x70, 0xee, 0x7b, 0x80, 0x92, 0x75, + 0x65, 0x56, 0x50, 0x41, 0xe0, 0xc3, 0xc4, 0xff, 0xfd, 0xff, 0xfd, 0xfe, + 0xff, 0xff, 0xfc, 0xfe, 0xfd, 0xff, 0xf8, 0xff, 0xff, 0xfa, 0xed, 0xe7, + 0xdc, 0xfa, 0xf8, 0xde, 0xfb, 0xfc, 0xe9, 0x57, 0x4e, 0x3f, 0x56, 0x4d, + 0x3f, 0x50, 0x49, 0x3a, 0x4b, 0x42, 0x34, 0x46, 0x3c, 0x31, 0x45, 0x40, + 0x37, 0x4c, 0x47, 0x35, 0x53, 0x47, 0x2e, 0x56, 0x4e, 0x51, 0x83, 0x8b, + 0xbd, 0xa3, 0xa4, 0xf6, 0xa4, 0xa4, 0xff, 0xa4, 0xad, 0xff, 0xa4, 0xad, + 0xf0, 0xae, 0xad, 0xf6, 0xa0, 0xaf, 0xfe, 0xa1, 0xab, 0xe0, 0xba, 0x76, + 0x8d, 0xde, 0x41, 0x4e, 0xef, 0x3c, 0x3f, 0xe5, 0x3b, 0x37, 0xca, 0x40, + 0x31, 0xd1, 0x46, 0x3b, 0xed, 0x3d, 0x41, 0xe0, 0x39, 0x3c, 0xcc, 0x40, + 0x3a, 0xc7, 0x45, 0x39, 0xbb, 0x36, 0x28, 0xc8, 0x32, 0x2b, 0xdc, 0x34, + 0x31, 0xde, 0x3b, 0x2f, 0xdf, 0x37, 0x29, 0xd3, 0x34, 0x21, 0xc4, 0x36, + 0x21, 0xc6, 0x37, 0x26, 0xce, 0x35, 0x29, 0xd6, 0x35, 0x2b, 0xe4, 0x38, + 0x2e, 0xe9, 0x34, 0x32, 0xeb, 0x2d, 0x35, 0xf7, 0x2a, 0x30, 0xe4, 0x31, + 0x29, 0xcb, 0x35, 0x24, 0xd9, 0x4c, 0x41, 0xda, 0x48, 0x49, 0xdf, 0x4d, + 0x4b, 0xc7, 0x38, 0x2e, 0xc1, 0x3a, 0x28, 0xbb, 0x3b, 0x27, 0xb7, 0x3b, + 0x2a, 0xb4, 0x3c, 0x2f, 0xbb, 0x40, 0x33, 0xe2, 0x5e, 0x56, 0xf7, 0x6e, + 0x6d, 0xf6, 0x67, 0x70, 0xf1, 0x67, 0x71, 0xed, 0x74, 0x72, 0xfb, 0x6f, + 0x75, 0xff, 0x7a, 0x8b, 0x88, 0x97, 0x7c, 0x41, 0x51, 0x33, 0xdd, 0xc4, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xee, 0xff, + 0xf0, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xf1, 0xfe, 0xf8, 0xe2, 0xfd, 0xfa, + 0xea, 0x5b, 0x50, 0x41, 0x5b, 0x4f, 0x41, 0x59, 0x4d, 0x3f, 0x54, 0x4a, + 0x3a, 0x54, 0x47, 0x39, 0x4e, 0x47, 0x3c, 0x52, 0x4a, 0x39, 0x57, 0x4b, + 0x34, 0x58, 0x51, 0x54, 0x7f, 0x80, 0xaa, 0x94, 0x97, 0xd4, 0x95, 0x97, + 0xe4, 0x99, 0xa2, 0xec, 0x94, 0x9f, 0xd8, 0x88, 0x90, 0xd0, 0x87, 0x85, + 0xbe, 0xc5, 0x69, 0x95, 0xe6, 0x3d, 0x50, 0xe2, 0x40, 0x3a, 0xe7, 0x3e, + 0x43, 0xe1, 0x3f, 0x46, 0xc3, 0x3e, 0x3b, 0xd6, 0x47, 0x46, 0xe8, 0x3e, + 0x41, 0xd7, 0x3f, 0x3b, 0xc4, 0x3d, 0x31, 0xc0, 0x3f, 0x30, 0xb9, 0x3b, + 0x2b, 0xcd, 0x3a, 0x2e, 0xe4, 0x39, 0x33, 0xe0, 0x33, 0x2f, 0xe4, 0x34, + 0x2e, 0xd1, 0x38, 0x2a, 0xba, 0x3b, 0x2b, 0xc6, 0x3b, 0x36, 0xe9, 0x3c, + 0x39, 0xc9, 0x39, 0x25, 0xc2, 0x39, 0x21, 0xcf, 0x33, 0x26, 0xd4, 0x35, + 0x2f, 0xcf, 0x37, 0x2b, 0xc8, 0x38, 0x26, 0xc9, 0x3d, 0x29, 0xdb, 0x3e, + 0x35, 0xe8, 0x40, 0x42, 0xed, 0x55, 0x53, 0xdd, 0x47, 0x3d, 0xc7, 0x39, + 0x29, 0xb7, 0x3a, 0x2a, 0xaf, 0x3c, 0x2d, 0xac, 0x3c, 0x2e, 0xaf, 0x3a, + 0x2a, 0xd1, 0x56, 0x47, 0xf0, 0x6d, 0x6a, 0xe9, 0x61, 0x67, 0xf1, 0x62, + 0x6d, 0xfa, 0x6e, 0x71, 0xff, 0x64, 0x6c, 0xf8, 0x57, 0x70, 0x75, 0x88, + 0x69, 0x58, 0x6e, 0x45, 0xf1, 0xe5, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0xf9, 0xe6, 0xc5, 0xeb, 0xc8, 0xe2, 0xef, 0xd5, 0xfd, 0xf8, + 0xe6, 0xf4, 0xe6, 0xd6, 0xf2, 0xe8, 0xdd, 0x5b, 0x4e, 0x3e, 0x5a, 0x4e, + 0x3e, 0x5b, 0x4e, 0x3d, 0x58, 0x4d, 0x3c, 0x5a, 0x4c, 0x3c, 0x57, 0x4b, + 0x3f, 0x58, 0x4c, 0x3c, 0x5a, 0x4c, 0x38, 0x55, 0x4c, 0x47, 0x64, 0x5f, + 0x75, 0x77, 0x78, 0x9a, 0x82, 0x80, 0xba, 0x89, 0x86, 0xcd, 0x7b, 0x7b, + 0xb6, 0x66, 0x6d, 0xa6, 0x7c, 0x52, 0x62, 0xdc, 0x3b, 0x46, 0xff, 0x33, + 0x3f, 0xe9, 0x45, 0x3e, 0xee, 0x43, 0x4e, 0xdc, 0x42, 0x47, 0xb6, 0x40, + 0x35, 0xc6, 0x43, 0x3b, 0xd1, 0x34, 0x31, 0xc6, 0x42, 0x35, 0xbd, 0x3b, + 0x29, 0xbe, 0x39, 0x25, 0xc1, 0x3a, 0x25, 0xd4, 0x38, 0x28, 0xe5, 0x34, + 0x2b, 0xf7, 0x31, 0x33, 0xff, 0x2c, 0x33, 0xfb, 0x2d, 0x31, 0xf3, 0x2e, + 0x38, 0xfb, 0x28, 0x3e, 0xf6, 0x28, 0x30, 0xd3, 0x30, 0x27, 0xcd, 0x38, + 0x28, 0xe4, 0x3b, 0x32, 0xe8, 0x3d, 0x34, 0xd0, 0x44, 0x36, 0xc0, 0x36, + 0x26, 0xca, 0x35, 0x29, 0xe3, 0x37, 0x35, 0xe5, 0x2e, 0x2f, 0xd6, 0x34, + 0x2a, 0xce, 0x35, 0x2a, 0xd4, 0x4a, 0x3e, 0xb8, 0x3e, 0x31, 0xa9, 0x36, + 0x2a, 0xa8, 0x3a, 0x2b, 0xa6, 0x37, 0x26, 0xbc, 0x48, 0x3e, 0xee, 0x71, + 0x72, 0xf7, 0x73, 0x7e, 0xfa, 0x72, 0x7b, 0xfd, 0x73, 0x7b, 0xfe, 0x56, + 0x65, 0xf9, 0x44, 0x61, 0x98, 0xa0, 0x7d, 0x7d, 0x9a, 0x67, 0xcb, 0xcc, + 0xae, 0xd4, 0xe2, 0xc6, 0xaf, 0xca, 0xaa, 0x95, 0xb8, 0x8e, 0x8f, 0xbc, + 0x86, 0xa8, 0xc7, 0x9a, 0xce, 0xd5, 0xba, 0xee, 0xde, 0xd4, 0xdd, 0xcb, + 0xc5, 0x5b, 0x4c, 0x3c, 0x5b, 0x4c, 0x3c, 0x5c, 0x4c, 0x3c, 0x59, 0x49, + 0x3b, 0x5a, 0x4b, 0x3b, 0x5b, 0x4c, 0x3e, 0x5e, 0x4d, 0x3c, 0x5e, 0x50, + 0x3c, 0x5b, 0x4e, 0x41, 0x59, 0x4c, 0x49, 0x5e, 0x53, 0x64, 0x6d, 0x65, + 0x9b, 0x87, 0x7f, 0xc4, 0x9b, 0x7e, 0xb4, 0xab, 0x71, 0xa3, 0xb5, 0x40, + 0x47, 0xc9, 0x3e, 0x2b, 0xe8, 0x40, 0x39, 0xfc, 0x3c, 0x40, 0xe9, 0x42, + 0x4a, 0xbf, 0x3c, 0x37, 0xa6, 0x39, 0x28, 0xc7, 0x42, 0x38, 0xdd, 0x3b, + 0x38, 0xcf, 0x44, 0x3a, 0xba, 0x37, 0x24, 0xc4, 0x3b, 0x28, 0xc9, 0x38, + 0x27, 0xda, 0x34, 0x27, 0xee, 0x39, 0x2e, 0xe3, 0x34, 0x27, 0xee, 0x2c, + 0x24, 0xf5, 0x29, 0x27, 0xf8, 0x25, 0x32, 0xff, 0x16, 0x36, 0xf3, 0x27, + 0x36, 0xed, 0x3c, 0x44, 0xed, 0x31, 0x3a, 0xfe, 0x30, 0x3a, 0xf3, 0x2b, + 0x2e, 0xdf, 0x38, 0x35, 0xe8, 0x47, 0x47, 0xd9, 0x36, 0x34, 0xdd, 0x3b, + 0x36, 0xd5, 0x35, 0x2a, 0xc4, 0x38, 0x26, 0xc3, 0x38, 0x2b, 0xdb, 0x51, + 0x47, 0xc9, 0x3c, 0x33, 0xcd, 0x39, 0x31, 0xd0, 0x3a, 0x33, 0xbf, 0x38, + 0x2b, 0xb3, 0x38, 0x2d, 0xe7, 0x6b, 0x6b, 0xff, 0x81, 0x89, 0xfd, 0x7a, + 0x83, 0xff, 0x72, 0x7f, 0xff, 0x4d, 0x64, 0xf9, 0x3f, 0x5c, 0x82, 0x86, + 0x5e, 0x67, 0x87, 0x51, 0x7c, 0x85, 0x5c, 0x61, 0x7e, 0x51, 0x65, 0x8d, + 0x59, 0x79, 0xa1, 0x68, 0x86, 0xb6, 0x74, 0x8d, 0xb9, 0x79, 0x94, 0xac, + 0x7f, 0xc0, 0xb5, 0xa6, 0xc5, 0xb5, 0xb3, 0x5b, 0x4b, 0x3a, 0x5b, 0x4b, + 0x3a, 0x59, 0x4b, 0x3a, 0x59, 0x49, 0x39, 0x5b, 0x4b, 0x3a, 0x5d, 0x4a, + 0x3c, 0x5e, 0x4b, 0x3c, 0x5e, 0x4f, 0x3b, 0x5e, 0x4f, 0x3b, 0x5f, 0x4e, + 0x3a, 0x5f, 0x4b, 0x48, 0x61, 0x57, 0x77, 0x7c, 0x77, 0x9b, 0xc2, 0x87, + 0x9b, 0xf5, 0x65, 0x77, 0xff, 0x34, 0x4b, 0xe4, 0x40, 0x46, 0xd1, 0x43, + 0x40, 0xef, 0x42, 0x47, 0xda, 0x43, 0x40, 0xb2, 0x3b, 0x2e, 0xa4, 0x38, + 0x26, 0xce, 0x40, 0x36, 0xec, 0x38, 0x3b, 0xe8, 0x4d, 0x45, 0xd6, 0x50, + 0x41, 0xc2, 0x36, 0x28, 0xcf, 0x34, 0x2a, 0xe4, 0x36, 0x30, 0xee, 0x31, + 0x2f, 0xf2, 0x31, 0x39, 0xfa, 0x2d, 0x3c, 0xf5, 0x2a, 0x3c, 0xf0, 0x2d, + 0x48, 0xf9, 0x2e, 0x57, 0xf8, 0x51, 0x63, 0xfe, 0x5c, 0x6d, 0xee, 0x38, + 0x4f, 0xd5, 0x30, 0x35, 0xb8, 0x37, 0x26, 0xcc, 0x43, 0x36, 0xe2, 0x53, + 0x4e, 0xd7, 0x43, 0x40, 0xcb, 0x39, 0x2e, 0xc2, 0x37, 0x24, 0xa7, 0x3b, + 0x25, 0xac, 0x38, 0x29, 0xd3, 0x46, 0x42, 0xde, 0x38, 0x33, 0xf2, 0x33, + 0x31, 0xfa, 0x30, 0x30, 0xe5, 0x39, 0x31, 0xbe, 0x34, 0x27, 0xd9, 0x5c, + 0x57, 0xff, 0x87, 0x8b, 0xfc, 0x7c, 0x84, 0xfc, 0x6b, 0x7c, 0xfb, 0x48, + 0x61, 0xf3, 0x3e, 0x55, 0x59, 0x61, 0x37, 0x65, 0x80, 0x4e, 0x81, 0x8b, + 0x64, 0x7e, 0x9d, 0x6d, 0x7f, 0xab, 0x70, 0x88, 0xab, 0x6f, 0x87, 0xb1, + 0x70, 0x82, 0xb9, 0x6f, 0x85, 0xaa, 0x71, 0xb5, 0xb6, 0x99, 0xc3, 0xbf, + 0xbe, 0x5c, 0x4b, 0x37, 0x5c, 0x4b, 0x36, 0x5c, 0x4b, 0x36, 0x5d, 0x4c, + 0x37, 0x5d, 0x4c, 0x39, 0x5d, 0x4c, 0x3b, 0x5e, 0x4d, 0x3d, 0x5d, 0x50, + 0x3d, 0x5d, 0x50, 0x3d, 0x61, 0x4d, 0x3a, 0x63, 0x47, 0x3e, 0x67, 0x5d, + 0x71, 0x7f, 0x86, 0xb5, 0xb3, 0x87, 0xa6, 0xf6, 0x75, 0x71, 0xff, 0x4b, + 0x55, 0xf3, 0x3f, 0x51, 0xe7, 0x3d, 0x47, 0xdb, 0x3c, 0x3d, 0xc7, 0x3e, + 0x34, 0xa9, 0x3b, 0x2a, 0xb4, 0x3e, 0x2f, 0xd1, 0x38, 0x33, 0xde, 0x33, + 0x2b, 0xdb, 0x39, 0x27, 0xe9, 0x4d, 0x41, 0xd2, 0x41, 0x33, 0xd3, 0x3a, + 0x2e, 0xec, 0x37, 0x39, 0xf7, 0x32, 0x3e, 0xfc, 0x22, 0x2f, 0xff, 0x20, + 0x2d, 0xf6, 0x21, 0x2b, 0xee, 0x25, 0x37, 0xf7, 0x3b, 0x56, 0xff, 0x63, + 0x70, 0xf1, 0x4e, 0x53, 0xcb, 0x3a, 0x35, 0xa1, 0x36, 0x24, 0x87, 0x2d, + 0x18, 0xad, 0x3a, 0x30, 0xc2, 0x38, 0x36, 0xd8, 0x49, 0x45, 0xc9, 0x3b, + 0x30, 0xc7, 0x38, 0x2b, 0xb4, 0x38, 0x2b, 0xc1, 0x38, 0x2f, 0xde, 0x4a, + 0x40, 0xe2, 0x33, 0x2e, 0xfc, 0x2e, 0x31, 0xfa, 0x2d, 0x30, 0xf0, 0x32, + 0x2c, 0xc9, 0x34, 0x25, 0xc5, 0x4d, 0x45, 0xff, 0x8f, 0x90, 0xff, 0x7b, + 0x88, 0xff, 0x59, 0x74, 0xff, 0x3f, 0x61, 0xd2, 0x40, 0x53, 0x49, 0x59, + 0x31, 0x70, 0x95, 0x5b, 0x85, 0xa6, 0x6f, 0x83, 0xaa, 0x71, 0x7c, 0xa5, + 0x66, 0x7e, 0xa3, 0x66, 0x7f, 0xa8, 0x6b, 0x7e, 0xb0, 0x65, 0x86, 0xb2, + 0x6e, 0x9c, 0xb6, 0x89, 0x96, 0xa4, 0x97, 0x5e, 0x4d, 0x3a, 0x5e, 0x4d, + 0x3a, 0x5e, 0x4d, 0x3a, 0x5e, 0x4d, 0x3a, 0x5e, 0x4d, 0x3a, 0x5f, 0x4c, + 0x37, 0x5e, 0x4e, 0x39, 0x56, 0x4e, 0x41, 0x61, 0x58, 0x59, 0x6f, 0x60, + 0x6d, 0x6d, 0x64, 0x70, 0x70, 0x78, 0xa8, 0x83, 0x8c, 0xea, 0x99, 0x83, + 0xcd, 0xb9, 0x76, 0x7c, 0xe8, 0x64, 0x5c, 0xfd, 0x4d, 0x55, 0xf2, 0x39, + 0x41, 0xde, 0x37, 0x37, 0xc3, 0x42, 0x32, 0xa9, 0x3a, 0x2b, 0xbd, 0x47, + 0x3e, 0xc5, 0x42, 0x39, 0xca, 0x36, 0x2b, 0xde, 0x36, 0x27, 0xe3, 0x34, + 0x2e, 0xe0, 0x44, 0x37, 0xdc, 0x3c, 0x2e, 0xf0, 0x30, 0x33, 0xff, 0x44, + 0x4e, 0xf5, 0x43, 0x47, 0xe6, 0x2f, 0x2d, 0xe1, 0x2c, 0x28, 0xde, 0x32, + 0x33, 0xdf, 0x3e, 0x43, 0xd9, 0x3f, 0x43, 0xdc, 0x37, 0x38, 0xca, 0x33, + 0x2e, 0xd2, 0x4f, 0x4a, 0xd4, 0x4f, 0x51, 0xca, 0x49, 0x47, 0xe9, 0x55, + 0x55, 0xda, 0x45, 0x41, 0xd4, 0x42, 0x3a, 0xde, 0x3c, 0x37, 0xf3, 0x32, + 0x3d, 0xf5, 0x37, 0x3f, 0xe8, 0x3e, 0x3a, 0xdc, 0x31, 0x2a, 0xf3, 0x32, + 0x30, 0xf8, 0x2e, 0x32, 0xf3, 0x30, 0x2e, 0xcd, 0x34, 0x25, 0xba, 0x48, + 0x3c, 0xff, 0x93, 0x95, 0xfd, 0x71, 0x81, 0xff, 0x46, 0x68, 0xff, 0x3c, + 0x64, 0x9d, 0x41, 0x47, 0x4e, 0x62, 0x3c, 0x72, 0x96, 0x5a, 0x79, 0xa1, + 0x63, 0x75, 0x9f, 0x60, 0x76, 0x9d, 0x5f, 0x7a, 0xa1, 0x64, 0x7b, 0xa6, + 0x64, 0x7b, 0xa9, 0x5a, 0x87, 0xb3, 0x68, 0x89, 0xaa, 0x76, 0x6c, 0x82, + 0x67, 0x5f, 0x4f, 0x3d, 0x5f, 0x4f, 0x3f, 0x5f, 0x4f, 0x3e, 0x5f, 0x4f, + 0x3d, 0x5f, 0x4f, 0x3d, 0x60, 0x50, 0x37, 0x5c, 0x4c, 0x39, 0x5f, 0x5b, + 0x61, 0x7d, 0x7c, 0xa0, 0x81, 0x7d, 0xb2, 0x71, 0x76, 0xb8, 0x7c, 0x86, + 0xc6, 0x9a, 0x9b, 0xc7, 0xba, 0xaf, 0xb7, 0xc8, 0xb6, 0x96, 0xb2, 0x70, + 0x52, 0xc6, 0x4c, 0x41, 0xf0, 0x48, 0x4a, 0xe8, 0x37, 0x39, 0xd5, 0x3a, + 0x32, 0xbb, 0x37, 0x2e, 0xba, 0x49, 0x3f, 0xcd, 0x66, 0x58, 0xc1, 0x40, + 0x33, 0xda, 0x32, 0x2b, 0xe4, 0x31, 0x2c, 0xe1, 0x3d, 0x31, 0xe4, 0x37, + 0x29, 0xf0, 0x2d, 0x29, 0xf0, 0x35, 0x35, 0xf1, 0x52, 0x58, 0xea, 0x4a, + 0x51, 0xeb, 0x51, 0x56, 0xec, 0x56, 0x5b, 0xd5, 0x40, 0x42, 0xea, 0x39, + 0x3f, 0xeb, 0x2d, 0x37, 0xf2, 0x4a, 0x56, 0xff, 0x6f, 0x7a, 0xff, 0x66, + 0x76, 0xe7, 0x52, 0x4e, 0xd7, 0x35, 0x33, 0xdc, 0x41, 0x3c, 0xdc, 0x45, + 0x3c, 0xe0, 0x34, 0x30, 0xfc, 0x2c, 0x3a, 0xff, 0x35, 0x3f, 0xe7, 0x36, + 0x33, 0xdd, 0x34, 0x2a, 0xf0, 0x32, 0x2f, 0xfb, 0x2e, 0x32, 0xf5, 0x2f, + 0x2d, 0xd3, 0x35, 0x29, 0xb2, 0x3c, 0x33, 0xfe, 0x88, 0x8f, 0xf8, 0x62, + 0x77, 0xff, 0x3e, 0x63, 0xf4, 0x41, 0x64, 0x5c, 0x3b, 0x2f, 0x4c, 0x5f, + 0x3e, 0x75, 0x91, 0x5e, 0x7b, 0x9e, 0x63, 0x6f, 0x97, 0x57, 0x72, 0x9a, + 0x58, 0x78, 0x9e, 0x5e, 0x79, 0xa3, 0x5b, 0x77, 0xa6, 0x56, 0x80, 0xab, + 0x61, 0x80, 0x9f, 0x68, 0x65, 0x7c, 0x56, 0x5b, 0x4d, 0x3d, 0x5f, 0x50, + 0x40, 0x5f, 0x52, 0x42, 0x60, 0x52, 0x43, 0x60, 0x52, 0x40, 0x5c, 0x4f, + 0x42, 0x63, 0x59, 0x61, 0x77, 0x77, 0x9a, 0x77, 0x7c, 0xb9, 0x63, 0x6a, + 0xb4, 0x7a, 0x7a, 0xd6, 0xaf, 0xac, 0xdb, 0xe4, 0xe1, 0xb6, 0xf8, 0xf2, + 0xa4, 0xeb, 0xe8, 0xab, 0xb8, 0xb5, 0x91, 0xa0, 0x79, 0x64, 0xd6, 0x6c, + 0x67, 0xf6, 0x57, 0x5a, 0xea, 0x36, 0x3a, 0xda, 0x36, 0x33, 0xbd, 0x3a, + 0x31, 0xbb, 0x4f, 0x41, 0xd3, 0x58, 0x49, 0xd0, 0x31, 0x27, 0xe8, 0x3e, + 0x3c, 0xe2, 0x40, 0x37, 0xe0, 0x30, 0x25, 0xe9, 0x2d, 0x27, 0xdb, 0x33, + 0x2a, 0xcf, 0x39, 0x35, 0xee, 0x53, 0x57, 0xf5, 0x56, 0x62, 0xff, 0x64, + 0x6f, 0xfb, 0x61, 0x67, 0xf6, 0x2f, 0x37, 0xf6, 0x28, 0x36, 0xf7, 0x46, + 0x53, 0xfa, 0x5e, 0x66, 0xf7, 0x54, 0x5b, 0xdf, 0x37, 0x33, 0xe6, 0x36, + 0x34, 0xdd, 0x38, 0x32, 0xd6, 0x38, 0x30, 0xe4, 0x3a, 0x35, 0xe7, 0x3b, + 0x3b, 0xe8, 0x36, 0x35, 0xd8, 0x35, 0x2b, 0xe2, 0x36, 0x2a, 0xf3, 0x30, + 0x2d, 0xfa, 0x2f, 0x34, 0xf6, 0x30, 0x2f, 0xda, 0x39, 0x2e, 0xb9, 0x38, + 0x32, 0xfc, 0x77, 0x82, 0xff, 0x52, 0x70, 0xff, 0x3c, 0x64, 0xc1, 0x4a, + 0x5b, 0x3d, 0x3c, 0x26, 0x41, 0x4a, 0x30, 0x68, 0x7e, 0x53, 0x74, 0x94, + 0x58, 0x68, 0x92, 0x4c, 0x6d, 0x96, 0x51, 0x73, 0x9b, 0x5a, 0x73, 0x9d, + 0x54, 0x6c, 0x97, 0x4d, 0x62, 0x8a, 0x45, 0x4e, 0x6a, 0x34, 0x49, 0x61, + 0x34, 0x54, 0x48, 0x38, 0x59, 0x4c, 0x3c, 0x5f, 0x52, 0x42, 0x62, 0x56, + 0x44, 0x60, 0x53, 0x3f, 0x66, 0x5d, 0x62, 0x7b, 0x79, 0x9e, 0x74, 0x7a, + 0xb4, 0x5d, 0x66, 0xaf, 0x6c, 0x76, 0xc1, 0x98, 0x9d, 0xdf, 0xc1, 0xc4, + 0xe7, 0xd8, 0xd7, 0xd7, 0xd8, 0xd3, 0xc8, 0xc2, 0xb7, 0xbc, 0x83, 0x87, + 0x88, 0x6f, 0x6a, 0x65, 0x99, 0x6a, 0x64, 0xe3, 0x79, 0x75, 0xff, 0x67, + 0x65, 0xf4, 0x44, 0x41, 0xdd, 0x3d, 0x35, 0xc2, 0x3c, 0x31, 0xc7, 0x42, + 0x32, 0xd1, 0x3c, 0x2d, 0xe3, 0x47, 0x46, 0xe2, 0x49, 0x46, 0xe0, 0x37, + 0x30, 0xe3, 0x36, 0x30, 0xcb, 0x39, 0x2b, 0xba, 0x3a, 0x26, 0xc9, 0x3d, + 0x36, 0xd0, 0x3a, 0x41, 0xf3, 0x5b, 0x67, 0xeb, 0x57, 0x5e, 0xe0, 0x37, + 0x33, 0xf6, 0x42, 0x49, 0xea, 0x3f, 0x46, 0xe6, 0x37, 0x39, 0xf7, 0x35, + 0x36, 0xef, 0x35, 0x31, 0xee, 0x33, 0x30, 0xe1, 0x3a, 0x2f, 0xdf, 0x3b, + 0x33, 0xe8, 0x36, 0x35, 0xea, 0x37, 0x38, 0xe9, 0x36, 0x34, 0xdb, 0x36, + 0x2d, 0xe0, 0x37, 0x28, 0xef, 0x31, 0x2b, 0xf4, 0x33, 0x35, 0xf4, 0x30, + 0x2f, 0xdb, 0x34, 0x2a, 0xd1, 0x44, 0x42, 0xfa, 0x68, 0x75, 0xff, 0x3b, + 0x64, 0xfe, 0x40, 0x68, 0x80, 0x4d, 0x47, 0x52, 0x50, 0x3c, 0x45, 0x42, + 0x2d, 0x4f, 0x5f, 0x39, 0x69, 0x87, 0x4c, 0x65, 0x8e, 0x44, 0x67, 0x91, + 0x4b, 0x6e, 0x95, 0x55, 0x68, 0x8f, 0x4c, 0x5e, 0x87, 0x45, 0x59, 0x7d, + 0x43, 0x57, 0x6f, 0x42, 0x5b, 0x73, 0x44, 0x44, 0x42, 0x36, 0x4a, 0x45, + 0x3c, 0x5c, 0x4d, 0x3e, 0x60, 0x53, 0x3e, 0x65, 0x5f, 0x58, 0x7a, 0x74, + 0x91, 0x73, 0x70, 0xa7, 0x5d, 0x5f, 0xa1, 0x69, 0x69, 0xbb, 0x8b, 0x88, + 0xdf, 0x9d, 0x9d, 0xde, 0xa2, 0xa1, 0xd6, 0xa0, 0x9b, 0xd6, 0x9e, 0x96, + 0xce, 0x95, 0x89, 0xc1, 0x70, 0x67, 0x7d, 0x5e, 0x56, 0x52, 0x7c, 0x53, + 0x48, 0xb8, 0x59, 0x51, 0xec, 0x79, 0x73, 0xff, 0x80, 0x7c, 0xef, 0x5e, + 0x5a, 0xc9, 0x36, 0x2d, 0xbe, 0x35, 0x23, 0xca, 0x3b, 0x2a, 0xd5, 0x3a, + 0x30, 0xcf, 0x37, 0x2c, 0xdc, 0x39, 0x2f, 0xdc, 0x38, 0x2f, 0xc5, 0x3c, + 0x2a, 0xc2, 0x40, 0x31, 0xc5, 0x3d, 0x34, 0xc1, 0x37, 0x33, 0xd9, 0x50, + 0x4c, 0xd2, 0x4b, 0x42, 0xcc, 0x36, 0x24, 0xeb, 0x2f, 0x30, 0xf8, 0x28, + 0x3a, 0xfc, 0x27, 0x3f, 0xff, 0x1f, 0x3a, 0xff, 0x23, 0x38, 0xf3, 0x2e, + 0x36, 0xdf, 0x3a, 0x35, 0xe0, 0x3c, 0x35, 0xea, 0x37, 0x35, 0xee, 0x33, + 0x35, 0xe4, 0x34, 0x30, 0xdb, 0x37, 0x29, 0xdc, 0x39, 0x26, 0xe5, 0x36, + 0x26, 0xef, 0x35, 0x2d, 0xed, 0x35, 0x29, 0xd7, 0x34, 0x27, 0xed, 0x56, + 0x5c, 0xff, 0x50, 0x6b, 0xff, 0x38, 0x65, 0xcd, 0x40, 0x58, 0x39, 0x35, + 0x23, 0x41, 0x42, 0x33, 0x37, 0x38, 0x21, 0x51, 0x5a, 0x34, 0x64, 0x79, + 0x4e, 0x5f, 0x84, 0x41, 0x63, 0x8c, 0x44, 0x6c, 0x90, 0x4e, 0x68, 0x8d, + 0x47, 0x63, 0x86, 0x49, 0x63, 0x82, 0x4a, 0x66, 0x7f, 0x49, 0x62, 0x7f, + 0x44, 0x34, 0x37, 0x2d, 0x3a, 0x3a, 0x34, 0x4f, 0x44, 0x3b, 0x56, 0x4c, + 0x3d, 0x67, 0x65, 0x6c, 0x6c, 0x6a, 0x91, 0x51, 0x51, 0x8a, 0x5b, 0x5d, + 0xa5, 0x79, 0x7b, 0xce, 0x89, 0x89, 0xdd, 0x8c, 0x8b, 0xd1, 0x88, 0x85, + 0xcd, 0x88, 0x81, 0xd2, 0x8d, 0x85, 0xc8, 0x87, 0x82, 0xad, 0x7e, 0x5a, + 0x6a, 0x5c, 0x5b, 0x4c, 0x70, 0x57, 0x44, 0xcf, 0x53, 0x56, 0xe7, 0x66, + 0x6b, 0xef, 0x85, 0x7f, 0xfe, 0x81, 0x7a, 0xc5, 0x3b, 0x2d, 0xbb, 0x3b, + 0x23, 0xc6, 0x3b, 0x29, 0xd6, 0x36, 0x2b, 0xcc, 0x3b, 0x2b, 0xcb, 0x36, + 0x28, 0xd6, 0x3a, 0x2d, 0xc8, 0x38, 0x28, 0xc5, 0x3a, 0x2d, 0xc8, 0x3a, + 0x2f, 0xca, 0x3a, 0x30, 0xce, 0x3f, 0x35, 0xc8, 0x3a, 0x2e, 0xd6, 0x31, + 0x27, 0xf9, 0x2f, 0x37, 0xff, 0x2b, 0x3d, 0xfa, 0x2a, 0x3e, 0xfe, 0x24, + 0x3a, 0xff, 0x26, 0x39, 0xf0, 0x35, 0x3d, 0xda, 0x3a, 0x36, 0xdf, 0x3b, + 0x34, 0xeb, 0x35, 0x34, 0xf1, 0x34, 0x38, 0xe2, 0x36, 0x2f, 0xd5, 0x37, + 0x29, 0xd9, 0x38, 0x26, 0xda, 0x36, 0x24, 0xd7, 0x39, 0x26, 0xd4, 0x3b, + 0x25, 0xd7, 0x3d, 0x34, 0xfe, 0x57, 0x6c, 0xff, 0x37, 0x63, 0xfc, 0x43, + 0x6a, 0x6b, 0x33, 0x3d, 0x23, 0x2f, 0x25, 0x2f, 0x34, 0x1d, 0x5e, 0x59, + 0x32, 0xa0, 0xb3, 0x82, 0x73, 0x8d, 0x60, 0x5d, 0x83, 0x3e, 0x6d, 0x93, + 0x4b, 0x70, 0x95, 0x51, 0x6b, 0x8f, 0x48, 0x69, 0x8b, 0x4d, 0x65, 0x84, + 0x4a, 0x66, 0x83, 0x48, 0x67, 0x89, 0x47, 0x2a, 0x30, 0x26, 0x2b, 0x30, + 0x2b, 0x39, 0x37, 0x35, 0x45, 0x43, 0x3d, 0x5a, 0x5c, 0x69, 0x5c, 0x5d, + 0x87, 0x5b, 0x5a, 0x9c, 0x79, 0x7c, 0xd6, 0x85, 0x88, 0xeb, 0x82, 0x82, + 0xda, 0x81, 0x85, 0xca, 0x83, 0x82, 0xd2, 0x8b, 0x82, 0xdb, 0x8d, 0x86, + 0xc2, 0x7e, 0x78, 0x89, 0x73, 0x57, 0x52, 0x60, 0x5f, 0x48, 0x64, 0x5f, + 0x43, 0xae, 0x57, 0x50, 0xec, 0x5a, 0x63, 0xf3, 0x6e, 0x6a, 0xd9, 0x4b, + 0x40, 0xc9, 0x37, 0x26, 0xc8, 0x3c, 0x27, 0xd6, 0x38, 0x2b, 0xd5, 0x31, + 0x28, 0xc5, 0x3e, 0x2b, 0xbf, 0x3a, 0x28, 0xdb, 0x47, 0x3b, 0xce, 0x39, + 0x2b, 0xc9, 0x3a, 0x29, 0xc8, 0x37, 0x28, 0xce, 0x37, 0x28, 0xd7, 0x3c, + 0x2f, 0xda, 0x3b, 0x30, 0xee, 0x36, 0x3b, 0xf9, 0x31, 0x3f, 0xee, 0x2d, + 0x3b, 0xe9, 0x33, 0x36, 0xf5, 0x35, 0x38, 0xf0, 0x37, 0x3b, 0xe1, 0x36, + 0x35, 0xdb, 0x38, 0x35, 0xe3, 0x3a, 0x38, 0xef, 0x37, 0x38, 0xf6, 0x36, + 0x3b, 0xe2, 0x38, 0x34, 0xcf, 0x38, 0x2a, 0xcc, 0x3a, 0x29, 0xcd, 0x3a, + 0x27, 0xc2, 0x3d, 0x21, 0xc1, 0x3c, 0x26, 0xe9, 0x4b, 0x4d, 0xff, 0x42, + 0x67, 0xff, 0x36, 0x67, 0xa7, 0x43, 0x4f, 0x33, 0x36, 0x34, 0x38, 0x2b, + 0x2f, 0x44, 0x4e, 0x29, 0xa5, 0xb9, 0x79, 0xb6, 0xd5, 0x9a, 0x71, 0x90, + 0x5c, 0x5d, 0x84, 0x3d, 0x72, 0x98, 0x4e, 0x6f, 0x94, 0x52, 0x66, 0x8a, + 0x45, 0x67, 0x89, 0x4d, 0x65, 0x88, 0x4b, 0x66, 0x89, 0x47, 0x6b, 0x91, + 0x4a, 0x2e, 0x32, 0x26, 0x2b, 0x2e, 0x28, 0x30, 0x31, 0x2b, 0x3a, 0x3d, + 0x30, 0x4c, 0x4f, 0x4e, 0x58, 0x56, 0x6d, 0x6e, 0x6c, 0x9f, 0x92, 0x8f, + 0xea, 0x93, 0x90, 0xf6, 0x81, 0x7f, 0xd1, 0x84, 0x84, 0xc7, 0x8d, 0x8d, + 0xce, 0x8e, 0x85, 0xbf, 0x81, 0x77, 0x93, 0x6c, 0x61, 0x5d, 0x5e, 0x5d, + 0x47, 0x66, 0x5d, 0x49, 0x6a, 0x5c, 0x45, 0x88, 0x59, 0x43, 0xe6, 0x52, + 0x51, 0xeb, 0x3d, 0x3d, 0xdc, 0x30, 0x2b, 0xdb, 0x37, 0x26, 0xd3, 0x37, + 0x26, 0xe1, 0x35, 0x2b, 0xc8, 0x35, 0x29, 0xbd, 0x3d, 0x2b, 0xc5, 0x3c, + 0x2b, 0xda, 0x44, 0x39, 0xc2, 0x38, 0x29, 0xc4, 0x3a, 0x28, 0xca, 0x39, + 0x28, 0xcf, 0x34, 0x28, 0xd8, 0x32, 0x29, 0xe7, 0x3b, 0x34, 0xf1, 0x38, + 0x3c, 0xec, 0x2f, 0x3a, 0xec, 0x45, 0x4a, 0xef, 0x56, 0x51, 0xea, 0x41, + 0x3d, 0xe1, 0x38, 0x32, 0xdf, 0x38, 0x34, 0xe2, 0x38, 0x38, 0xe8, 0x38, + 0x3c, 0xed, 0x37, 0x3c, 0xef, 0x35, 0x39, 0xdc, 0x3b, 0x36, 0xc0, 0x38, + 0x29, 0xba, 0x3d, 0x2a, 0xba, 0x3d, 0x2a, 0xb1, 0x39, 0x23, 0xb6, 0x35, + 0x29, 0xff, 0x50, 0x60, 0xfd, 0x3d, 0x5f, 0xcb, 0x49, 0x5d, 0x4b, 0x40, + 0x31, 0x2d, 0x33, 0x25, 0x4a, 0x33, 0x27, 0x86, 0x98, 0x65, 0xa8, 0xd4, + 0x8c, 0x8f, 0xaa, 0x7c, 0x4b, 0x63, 0x39, 0x60, 0x7f, 0x3d, 0x6c, 0x94, + 0x49, 0x64, 0x8c, 0x47, 0x65, 0x87, 0x43, 0x6b, 0x8e, 0x4f, 0x69, 0x90, + 0x4f, 0x66, 0x8f, 0x45, 0x70, 0x9b, 0x50, 0x40, 0x3e, 0x30, 0x3e, 0x3d, + 0x34, 0x3c, 0x3d, 0x32, 0x41, 0x45, 0x2a, 0x4c, 0x4d, 0x3a, 0x55, 0x54, + 0x41, 0x65, 0x63, 0x67, 0x84, 0x81, 0xb7, 0x91, 0x8c, 0xd4, 0x7f, 0x7a, + 0xaf, 0x77, 0x73, 0xa5, 0x7f, 0x7a, 0xa4, 0x79, 0x6f, 0x7f, 0x6e, 0x5f, + 0x57, 0x6c, 0x59, 0x47, 0x68, 0x5c, 0x4b, 0x6a, 0x5e, 0x4e, 0x7f, 0x5f, + 0x4f, 0xa5, 0x4b, 0x3c, 0xd8, 0x35, 0x2e, 0xe3, 0x30, 0x2b, 0xe2, 0x34, + 0x2a, 0xd7, 0x38, 0x24, 0xca, 0x3d, 0x24, 0xd7, 0x39, 0x2c, 0xb9, 0x3b, + 0x29, 0xb5, 0x37, 0x26, 0xd7, 0x3d, 0x35, 0xe7, 0x49, 0x42, 0xb3, 0x39, + 0x27, 0xba, 0x3a, 0x29, 0xc7, 0x39, 0x2d, 0xd6, 0x3c, 0x34, 0xe3, 0x3b, + 0x37, 0xea, 0x3a, 0x38, 0xe9, 0x38, 0x36, 0xf4, 0x48, 0x49, 0xe9, 0x5a, + 0x58, 0xcd, 0x43, 0x3d, 0xda, 0x3a, 0x37, 0xdf, 0x39, 0x32, 0xe4, 0x38, + 0x34, 0xea, 0x36, 0x38, 0xec, 0x38, 0x3e, 0xeb, 0x36, 0x3d, 0xec, 0x37, + 0x3b, 0xd6, 0x3f, 0x37, 0xb6, 0x3b, 0x2b, 0xa7, 0x3b, 0x27, 0xa4, 0x3b, + 0x28, 0x96, 0x36, 0x23, 0xc0, 0x49, 0x44, 0xfc, 0x55, 0x68, 0xd2, 0x4d, + 0x58, 0x82, 0x5d, 0x4f, 0x33, 0x39, 0x22, 0x46, 0x4f, 0x29, 0x75, 0x9c, + 0x5f, 0x92, 0xa5, 0x69, 0x88, 0x9b, 0x6a, 0x49, 0x54, 0x3c, 0x3c, 0x48, + 0x2c, 0x67, 0x7e, 0x43, 0x6a, 0x94, 0x46, 0x61, 0x8c, 0x45, 0x6b, 0x8c, + 0x4b, 0x6c, 0x91, 0x50, 0x6f, 0x96, 0x51, 0x6d, 0x99, 0x4d, 0x76, 0xa5, + 0x56, 0x55, 0x4d, 0x3e, 0x56, 0x4d, 0x3f, 0x56, 0x4e, 0x3f, 0x56, 0x50, + 0x3d, 0x5c, 0x52, 0x43, 0x60, 0x57, 0x42, 0x62, 0x59, 0x4b, 0x6d, 0x63, + 0x6b, 0x77, 0x6a, 0x7c, 0x70, 0x64, 0x6d, 0x5d, 0x57, 0x5b, 0x57, 0x55, + 0x52, 0x5d, 0x56, 0x47, 0x66, 0x5a, 0x46, 0x6e, 0x5f, 0x48, 0x6a, 0x64, + 0x4f, 0x88, 0x5a, 0x4f, 0xad, 0x52, 0x47, 0xae, 0x3a, 0x2c, 0xcb, 0x34, + 0x2b, 0xe1, 0x37, 0x2f, 0xde, 0x37, 0x2e, 0xd7, 0x36, 0x2a, 0xd3, 0x39, + 0x29, 0xd5, 0x3a, 0x2c, 0xb8, 0x3c, 0x2b, 0xa7, 0x35, 0x22, 0xc2, 0x39, + 0x2d, 0xd7, 0x3c, 0x34, 0xd3, 0x48, 0x3a, 0xd4, 0x42, 0x39, 0xd8, 0x3e, + 0x39, 0xe7, 0x3c, 0x3c, 0xee, 0x36, 0x38, 0xe5, 0x3b, 0x38, 0xc5, 0x3d, + 0x32, 0xb7, 0x39, 0x2a, 0xbd, 0x3b, 0x2d, 0xd6, 0x3c, 0x35, 0xed, 0x36, + 0x3a, 0xe8, 0x36, 0x3a, 0xe6, 0x38, 0x36, 0xe5, 0x39, 0x32, 0xe6, 0x39, + 0x36, 0xe8, 0x38, 0x38, 0xe7, 0x3b, 0x3d, 0xcb, 0x40, 0x38, 0xa7, 0x3b, + 0x2c, 0x99, 0x3b, 0x28, 0x8d, 0x38, 0x24, 0x84, 0x36, 0x27, 0xcc, 0x59, + 0x5a, 0xbc, 0x54, 0x56, 0x9e, 0x59, 0x52, 0x80, 0x63, 0x4b, 0x60, 0x78, + 0x3b, 0x9d, 0xb6, 0x71, 0x76, 0x98, 0x59, 0x4f, 0x5d, 0x3b, 0x3b, 0x3d, + 0x2e, 0x32, 0x33, 0x2b, 0x3b, 0x43, 0x31, 0x66, 0x7f, 0x47, 0x6f, 0x97, + 0x4a, 0x6a, 0x92, 0x4d, 0x6d, 0x93, 0x52, 0x6a, 0x94, 0x47, 0x71, 0x9e, + 0x4b, 0x78, 0xaa, 0x55, 0x71, 0x9f, 0x57, 0x63, 0x5a, 0x4b, 0x65, 0x5b, + 0x4b, 0x65, 0x5b, 0x4b, 0x64, 0x5b, 0x4c, 0x65, 0x5b, 0x4d, 0x67, 0x5f, + 0x4a, 0x68, 0x5f, 0x48, 0x67, 0x5e, 0x4d, 0x67, 0x5d, 0x4c, 0x66, 0x5c, + 0x49, 0x60, 0x5a, 0x47, 0x51, 0x4e, 0x3d, 0x4c, 0x48, 0x37, 0x53, 0x50, + 0x3e, 0x5b, 0x5a, 0x46, 0x5f, 0x5f, 0x4f, 0x96, 0x61, 0x59, 0xd1, 0x4a, + 0x4c, 0xd3, 0x34, 0x30, 0xb7, 0x3d, 0x29, 0xcd, 0x3a, 0x2a, 0xda, 0x39, + 0x2b, 0xd5, 0x38, 0x2a, 0xd5, 0x37, 0x2a, 0xd5, 0x3a, 0x2b, 0xbc, 0x3d, + 0x2f, 0x97, 0x35, 0x1e, 0xaa, 0x3f, 0x29, 0xc1, 0x37, 0x2a, 0xd1, 0x39, + 0x2f, 0xe9, 0x34, 0x39, 0xe8, 0x36, 0x3c, 0xed, 0x36, 0x3b, 0xef, 0x35, + 0x3c, 0xd6, 0x36, 0x34, 0xad, 0x38, 0x26, 0xa7, 0x39, 0x26, 0xb5, 0x3a, + 0x29, 0xd7, 0x3e, 0x34, 0xee, 0x39, 0x38, 0xf2, 0x36, 0x37, 0xeb, 0x38, + 0x35, 0xe5, 0x3c, 0x33, 0xe0, 0x3e, 0x39, 0xda, 0x3e, 0x3e, 0xc9, 0x40, + 0x3b, 0xa9, 0x38, 0x2b, 0x95, 0x3a, 0x28, 0x8d, 0x3a, 0x28, 0x81, 0x37, + 0x22, 0x7e, 0x3a, 0x2a, 0xa6, 0x52, 0x4a, 0x95, 0x54, 0x49, 0x8f, 0x5c, + 0x53, 0x96, 0x6e, 0x5d, 0x8e, 0xa1, 0x73, 0x53, 0x63, 0x42, 0x27, 0x32, + 0x1e, 0x35, 0x38, 0x31, 0x37, 0x36, 0x2f, 0x39, 0x39, 0x30, 0x39, 0x43, + 0x30, 0x67, 0x82, 0x4b, 0x77, 0x9c, 0x51, 0x70, 0x99, 0x53, 0x70, 0x98, + 0x4f, 0x6f, 0x99, 0x49, 0x78, 0xa6, 0x55, 0x77, 0xa6, 0x59, 0x60, 0x8b, + 0x4a, 0x68, 0x5f, 0x50, 0x69, 0x60, 0x51, 0x69, 0x60, 0x51, 0x69, 0x60, + 0x51, 0x68, 0x5f, 0x50, 0x6b, 0x62, 0x54, 0x6a, 0x62, 0x53, 0x69, 0x60, + 0x50, 0x69, 0x62, 0x4c, 0x69, 0x62, 0x48, 0x68, 0x62, 0x4b, 0x60, 0x5a, + 0x46, 0x4c, 0x4a, 0x36, 0x40, 0x45, 0x34, 0x40, 0x48, 0x38, 0x43, 0x4a, + 0x3e, 0x55, 0x4d, 0x3b, 0xb6, 0x58, 0x4f, 0xef, 0x44, 0x46, 0xc8, 0x3a, + 0x2c, 0xc3, 0x37, 0x25, 0xd2, 0x38, 0x29, 0xd1, 0x3a, 0x29, 0xd1, 0x3a, + 0x28, 0xd2, 0x39, 0x29, 0xbb, 0x3b, 0x2f, 0x91, 0x36, 0x1e, 0x94, 0x39, + 0x1f, 0xbb, 0x38, 0x2a, 0xda, 0x3b, 0x35, 0xee, 0x40, 0x45, 0xd3, 0x3e, + 0x3b, 0xbb, 0x36, 0x31, 0xb7, 0x3a, 0x35, 0xa2, 0x39, 0x2d, 0x9d, 0x3e, + 0x2a, 0x9f, 0x41, 0x2b, 0xa5, 0x3c, 0x27, 0xb7, 0x36, 0x29, 0xd3, 0x3c, + 0x35, 0xec, 0x3d, 0x37, 0xeb, 0x3f, 0x36, 0xdf, 0x44, 0x39, 0xca, 0x41, + 0x39, 0xb2, 0x38, 0x33, 0x98, 0x38, 0x2a, 0x8c, 0x38, 0x27, 0x84, 0x3c, + 0x29, 0x7d, 0x3b, 0x28, 0x77, 0x33, 0x22, 0x89, 0x41, 0x33, 0x94, 0x53, + 0x47, 0x91, 0x5a, 0x4e, 0x96, 0x59, 0x53, 0x89, 0x59, 0x4d, 0x41, 0x4d, + 0x2b, 0x27, 0x32, 0x25, 0x37, 0x3e, 0x3c, 0x4b, 0x4d, 0x40, 0x3d, 0x3b, + 0x28, 0x37, 0x3a, 0x2f, 0x38, 0x40, 0x2d, 0x68, 0x82, 0x4b, 0x76, 0x9d, + 0x50, 0x71, 0x9b, 0x50, 0x70, 0x9d, 0x4a, 0x79, 0xa4, 0x56, 0x7d, 0xa8, + 0x62, 0x62, 0x8c, 0x49, 0x60, 0x88, 0x4c, 0x69, 0x60, 0x51, 0x69, 0x60, + 0x51, 0x69, 0x60, 0x51, 0x6a, 0x61, 0x52, 0x6a, 0x61, 0x51, 0x6b, 0x5f, + 0x5a, 0x6b, 0x5f, 0x5f, 0x6b, 0x61, 0x56, 0x6b, 0x61, 0x54, 0x6b, 0x61, + 0x58, 0x6c, 0x61, 0x52, 0x6b, 0x62, 0x4e, 0x5a, 0x56, 0x44, 0x44, 0x46, + 0x38, 0x3c, 0x43, 0x35, 0x35, 0x43, 0x31, 0x3f, 0x43, 0x29, 0x96, 0x5a, + 0x46, 0xe6, 0x5d, 0x59, 0xf0, 0x4a, 0x4d, 0xcf, 0x3b, 0x30, 0xc8, 0x39, + 0x2b, 0xce, 0x3c, 0x30, 0xd2, 0x3d, 0x31, 0xd4, 0x3e, 0x32, 0xce, 0x40, + 0x3a, 0xb2, 0x3e, 0x33, 0xb8, 0x43, 0x33, 0xdb, 0x48, 0x41, 0xea, 0x49, + 0x45, 0xd1, 0x45, 0x41, 0xa0, 0x3d, 0x2f, 0x8e, 0x46, 0x32, 0x84, 0x43, + 0x31, 0x79, 0x41, 0x2d, 0x85, 0x3a, 0x2b, 0x89, 0x3c, 0x2c, 0x8d, 0x3d, + 0x2c, 0x96, 0x38, 0x2a, 0xa3, 0x3a, 0x2e, 0xb9, 0x3b, 0x30, 0xc0, 0x3f, + 0x31, 0xb6, 0x3c, 0x2e, 0xa1, 0x36, 0x2a, 0x90, 0x37, 0x2c, 0x84, 0x3c, + 0x2c, 0x7f, 0x3b, 0x2a, 0x7b, 0x3b, 0x2c, 0x73, 0x39, 0x2a, 0x76, 0x35, + 0x28, 0x92, 0x48, 0x3b, 0x8d, 0x4f, 0x42, 0x99, 0x53, 0x4e, 0x9c, 0x56, + 0x57, 0x91, 0x6f, 0x5f, 0x66, 0x76, 0x49, 0x47, 0x56, 0x34, 0x5e, 0x6b, + 0x51, 0x4b, 0x51, 0x35, 0x3a, 0x3b, 0x23, 0x38, 0x38, 0x2f, 0x38, 0x42, + 0x2f, 0x69, 0x83, 0x4c, 0x77, 0x9d, 0x50, 0x70, 0x9c, 0x4e, 0x72, 0xa2, + 0x50, 0x7d, 0xa9, 0x60, 0x66, 0x8e, 0x4e, 0x62, 0x8a, 0x4a, 0x62, 0x88, + 0x4d, 0x69, 0x60, 0x51, 0x69, 0x60, 0x51, 0x68, 0x5f, 0x50, 0x6c, 0x63, + 0x54, 0x6b, 0x62, 0x53, 0x6d, 0x62, 0x57, 0x6c, 0x62, 0x55, 0x6c, 0x64, + 0x4f, 0x6c, 0x64, 0x50, 0x6c, 0x62, 0x56, 0x6d, 0x62, 0x55, 0x6d, 0x63, + 0x54, 0x68, 0x61, 0x51, 0x56, 0x50, 0x40, 0x45, 0x41, 0x31, 0x38, 0x41, + 0x27, 0x84, 0x4b, 0x40, 0xc0, 0x3e, 0x40, 0xd8, 0x4e, 0x4f, 0xf7, 0x69, + 0x6d, 0xde, 0x4e, 0x4a, 0xd1, 0x43, 0x3c, 0xd3, 0x45, 0x3f, 0xd8, 0x48, + 0x43, 0xde, 0x49, 0x46, 0xe4, 0x47, 0x4b, 0xe0, 0x4c, 0x4b, 0xe7, 0x49, + 0x48, 0xed, 0x41, 0x43, 0xe5, 0x42, 0x41, 0xcc, 0x40, 0x3d, 0x9f, 0x3d, + 0x30, 0x8a, 0x41, 0x32, 0x85, 0x3c, 0x31, 0x81, 0x3a, 0x33, 0x7f, 0x3b, + 0x32, 0x7e, 0x3b, 0x31, 0x7a, 0x3b, 0x2f, 0x7a, 0x3b, 0x2b, 0x7b, 0x3a, + 0x2b, 0x86, 0x38, 0x2c, 0x8f, 0x38, 0x2c, 0x94, 0x38, 0x28, 0x89, 0x3a, + 0x2a, 0x80, 0x3c, 0x2c, 0x7f, 0x38, 0x2b, 0x7b, 0x33, 0x28, 0x79, 0x36, + 0x2c, 0x70, 0x34, 0x29, 0x76, 0x3d, 0x31, 0x85, 0x51, 0x40, 0x89, 0x54, + 0x47, 0x9a, 0x51, 0x4d, 0x8c, 0x5b, 0x53, 0x57, 0x58, 0x40, 0x4f, 0x65, + 0x3d, 0x60, 0x76, 0x46, 0x43, 0x57, 0x2d, 0x36, 0x40, 0x2a, 0x3a, 0x3c, + 0x32, 0x37, 0x39, 0x2f, 0x38, 0x40, 0x2d, 0x5f, 0x79, 0x41, 0x78, 0x9d, + 0x51, 0x70, 0x9e, 0x51, 0x77, 0xa8, 0x59, 0x6a, 0x95, 0x53, 0x5c, 0x84, + 0x47, 0x67, 0x8e, 0x4a, 0x61, 0x85, 0x49, 0x69, 0x60, 0x51, 0x6a, 0x61, + 0x52, 0x6c, 0x62, 0x54, 0x6a, 0x61, 0x52, 0x6a, 0x61, 0x52, 0x6b, 0x62, + 0x53, 0x6b, 0x62, 0x53, 0x6b, 0x62, 0x52, 0x6c, 0x63, 0x53, 0x6c, 0x63, + 0x54, 0x70, 0x62, 0x52, 0x70, 0x61, 0x55, 0x66, 0x5f, 0x52, 0x66, 0x61, + 0x50, 0x5f, 0x59, 0x43, 0x41, 0x40, 0x25, 0x72, 0x4d, 0x3c, 0x9c, 0x45, + 0x43, 0xae, 0x42, 0x43, 0xc1, 0x4f, 0x4e, 0xcb, 0x4c, 0x4c, 0xd2, 0x43, + 0x42, 0xcf, 0x40, 0x39, 0xcb, 0x45, 0x3b, 0xd9, 0x44, 0x45, 0xe0, 0x40, + 0x45, 0xe1, 0x43, 0x45, 0xe2, 0x44, 0x43, 0xe3, 0x41, 0x3e, 0xe2, 0x42, + 0x3e, 0xcd, 0x41, 0x3c, 0x9d, 0x39, 0x2f, 0x80, 0x3d, 0x2f, 0x80, 0x3c, + 0x33, 0x88, 0x38, 0x32, 0x85, 0x3b, 0x2f, 0x81, 0x3b, 0x2e, 0x7f, 0x3a, + 0x2d, 0x7c, 0x3a, 0x2e, 0x7c, 0x3a, 0x2f, 0x7b, 0x39, 0x31, 0x7b, 0x38, + 0x2f, 0x7c, 0x39, 0x2e, 0x7a, 0x3a, 0x2e, 0x78, 0x39, 0x2f, 0x75, 0x38, + 0x2e, 0x72, 0x36, 0x2b, 0x6f, 0x34, 0x2a, 0x6c, 0x32, 0x27, 0x76, 0x40, + 0x36, 0x88, 0x54, 0x4c, 0x94, 0x51, 0x4d, 0x93, 0x55, 0x4d, 0x79, 0x65, + 0x4f, 0x5a, 0x6e, 0x4a, 0x55, 0x6d, 0x44, 0x4d, 0x5f, 0x3a, 0x39, 0x43, + 0x28, 0x38, 0x39, 0x2c, 0x3b, 0x3d, 0x33, 0x34, 0x3b, 0x30, 0x38, 0x39, + 0x29, 0x56, 0x64, 0x3e, 0x74, 0x96, 0x54, 0x78, 0xa4, 0x5c, 0x72, 0x99, + 0x5c, 0x5a, 0x82, 0x43, 0x5f, 0x87, 0x49, 0x65, 0x8d, 0x4c, 0x5c, 0x80, + 0x47, 0x68, 0x61, 0x51, 0x69, 0x62, 0x52, 0x6a, 0x64, 0x53, 0x69, 0x62, + 0x52, 0x69, 0x62, 0x52, 0x6a, 0x62, 0x53, 0x6b, 0x62, 0x53, 0x6b, 0x62, + 0x53, 0x6c, 0x63, 0x54, 0x6c, 0x63, 0x54, 0x6d, 0x61, 0x54, 0x66, 0x5a, + 0x50, 0x73, 0x70, 0x69, 0xa3, 0xa0, 0x98, 0xb4, 0xaf, 0xa5, 0x7d, 0x7b, + 0x6a, 0x37, 0x3e, 0x2b, 0x33, 0x3c, 0x28, 0x3c, 0x3d, 0x2f, 0x3f, 0x3b, + 0x2e, 0x5e, 0x42, 0x35, 0xa5, 0x48, 0x45, 0xd5, 0x41, 0x45, 0xd9, 0x3e, + 0x3c, 0xdd, 0x44, 0x41, 0xde, 0x44, 0x44, 0xde, 0x44, 0x44, 0xda, 0x46, + 0x44, 0xd5, 0x46, 0x3f, 0xd4, 0x46, 0x3d, 0xd8, 0x44, 0x3e, 0xb0, 0x3d, + 0x34, 0x84, 0x3d, 0x2c, 0x7e, 0x3e, 0x2f, 0x85, 0x39, 0x2e, 0x85, 0x3a, + 0x2b, 0x81, 0x3a, 0x2b, 0x7f, 0x3a, 0x2c, 0x7e, 0x3a, 0x2f, 0x7e, 0x3a, + 0x30, 0x7b, 0x39, 0x30, 0x79, 0x38, 0x2f, 0x77, 0x39, 0x2f, 0x76, 0x39, + 0x30, 0x74, 0x3a, 0x2e, 0x71, 0x36, 0x2d, 0x6e, 0x33, 0x2b, 0x6b, 0x34, + 0x29, 0x65, 0x31, 0x25, 0x73, 0x3d, 0x32, 0x95, 0x52, 0x4e, 0x91, 0x59, + 0x52, 0x7f, 0x5f, 0x52, 0x5f, 0x5c, 0x48, 0x45, 0x53, 0x3b, 0x32, 0x3f, + 0x29, 0x3b, 0x45, 0x30, 0x42, 0x4a, 0x36, 0x39, 0x41, 0x30, 0x34, 0x3b, + 0x2e, 0x34, 0x39, 0x35, 0x37, 0x38, 0x2c, 0x4c, 0x57, 0x33, 0x72, 0x95, + 0x53, 0x7b, 0xa5, 0x5e, 0x60, 0x83, 0x49, 0x5a, 0x7e, 0x43, 0x61, 0x85, + 0x49, 0x61, 0x85, 0x4b, 0x58, 0x7c, 0x47, 0x68, 0x62, 0x52, 0x69, 0x62, + 0x52, 0x6b, 0x63, 0x53, 0x69, 0x62, 0x52, 0x69, 0x62, 0x52, 0x6a, 0x62, + 0x53, 0x6b, 0x62, 0x53, 0x6c, 0x63, 0x54, 0x6c, 0x63, 0x54, 0x6b, 0x62, + 0x52, 0x65, 0x5d, 0x53, 0x84, 0x81, 0x7c, 0xcf, 0xd1, 0xd1, 0xfa, 0xfb, + 0xfd, 0xff, 0xff, 0xff, 0xf4, 0xdd, 0xd5, 0xa0, 0x91, 0x7c, 0x43, 0x4a, + 0x32, 0x35, 0x3f, 0x2b, 0x3a, 0x37, 0x32, 0x2a, 0x30, 0x2b, 0x5a, 0x3f, + 0x3e, 0xcd, 0x7f, 0x7f, 0xce, 0x58, 0x55, 0xde, 0x39, 0x3a, 0xe1, 0x40, + 0x44, 0xdd, 0x42, 0x44, 0xdd, 0x41, 0x42, 0xd6, 0x43, 0x3f, 0xd0, 0x45, + 0x3b, 0xdd, 0x42, 0x3a, 0xbf, 0x42, 0x38, 0x8d, 0x3b, 0x2c, 0x7f, 0x3d, + 0x2c, 0x81, 0x3c, 0x2b, 0x81, 0x3a, 0x2b, 0x7d, 0x39, 0x2d, 0x7d, 0x39, + 0x2f, 0x7d, 0x3a, 0x30, 0x7c, 0x3a, 0x31, 0x77, 0x3a, 0x33, 0x73, 0x38, + 0x2f, 0x70, 0x36, 0x2c, 0x6f, 0x38, 0x2d, 0x6e, 0x37, 0x2b, 0x6e, 0x36, + 0x2f, 0x6b, 0x34, 0x2c, 0x67, 0x33, 0x2a, 0x60, 0x2e, 0x24, 0x70, 0x38, + 0x2f, 0x96, 0x55, 0x51, 0x7a, 0x5c, 0x4f, 0x4e, 0x4f, 0x3e, 0x35, 0x40, + 0x31, 0x2f, 0x35, 0x2c, 0x33, 0x33, 0x30, 0x2e, 0x33, 0x2b, 0x34, 0x3e, + 0x31, 0x3b, 0x4b, 0x38, 0x30, 0x3e, 0x2e, 0x2d, 0x32, 0x2f, 0x35, 0x34, + 0x2b, 0x41, 0x4d, 0x2f, 0x73, 0x95, 0x59, 0x6e, 0x98, 0x54, 0x54, 0x75, + 0x3f, 0x5a, 0x7c, 0x45, 0x5f, 0x81, 0x4c, 0x5f, 0x82, 0x49, 0x57, 0x77, + 0x48, 0x68, 0x63, 0x53, 0x68, 0x63, 0x53, 0x68, 0x63, 0x53, 0x68, 0x63, + 0x53, 0x68, 0x63, 0x53, 0x6a, 0x63, 0x53, 0x6c, 0x63, 0x54, 0x6d, 0x64, + 0x55, 0x6d, 0x64, 0x55, 0x6c, 0x62, 0x51, 0x6c, 0x6a, 0x65, 0xbc, 0xc3, + 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xef, 0xea, 0xf3, 0xcc, 0x9d, 0xa7, 0x7f, 0x4b, 0x4f, 0x31, 0x3d, 0x36, + 0x29, 0x4f, 0x48, 0x46, 0x9e, 0x99, 0x97, 0xf2, 0xf0, 0xe7, 0xfa, 0xe0, + 0xd6, 0xd6, 0x71, 0x71, 0xc1, 0x3d, 0x3a, 0xca, 0x40, 0x3c, 0xd4, 0x40, + 0x40, 0xd6, 0x3e, 0x3f, 0xd4, 0x42, 0x3d, 0xda, 0x40, 0x3c, 0xc2, 0x43, + 0x3c, 0x92, 0x3b, 0x31, 0x81, 0x3d, 0x2f, 0x7e, 0x3c, 0x2c, 0x7f, 0x3a, + 0x2e, 0x7b, 0x39, 0x2f, 0x7c, 0x39, 0x30, 0x7b, 0x3c, 0x33, 0x7a, 0x3c, + 0x34, 0x70, 0x3b, 0x31, 0x6b, 0x38, 0x2d, 0x69, 0x37, 0x2d, 0x68, 0x38, + 0x2d, 0x68, 0x38, 0x2e, 0x6b, 0x37, 0x30, 0x69, 0x36, 0x2d, 0x61, 0x30, + 0x27, 0x59, 0x2b, 0x1f, 0x6d, 0x3d, 0x34, 0x76, 0x54, 0x4e, 0x47, 0x40, + 0x33, 0x2e, 0x39, 0x29, 0x31, 0x3c, 0x2e, 0x37, 0x3a, 0x32, 0x36, 0x38, + 0x36, 0x32, 0x38, 0x30, 0x2d, 0x39, 0x2a, 0x36, 0x44, 0x32, 0x39, 0x48, + 0x36, 0x31, 0x36, 0x2c, 0x2c, 0x2d, 0x22, 0x40, 0x4a, 0x31, 0x7a, 0x9b, + 0x6d, 0x5e, 0x86, 0x4d, 0x51, 0x6f, 0x3c, 0x56, 0x73, 0x42, 0x5c, 0x79, + 0x47, 0x62, 0x82, 0x4c, 0x51, 0x6a, 0x45, 0x67, 0x64, 0x53, 0x67, 0x64, + 0x52, 0x67, 0x64, 0x52, 0x67, 0x64, 0x52, 0x66, 0x64, 0x52, 0x69, 0x63, + 0x52, 0x6c, 0x63, 0x55, 0x6d, 0x64, 0x55, 0x6d, 0x64, 0x53, 0x6a, 0x61, + 0x51, 0x64, 0x64, 0x64, 0xa7, 0xb3, 0xb9, 0xef, 0xfb, 0xfc, 0xfa, 0xff, + 0xfc, 0xfa, 0xfc, 0xee, 0xf8, 0xfc, 0xed, 0xff, 0xff, 0xed, 0xe4, 0xdb, + 0xc0, 0x72, 0x6e, 0x57, 0x41, 0x4a, 0x3c, 0x96, 0x97, 0x8e, 0xf3, 0xe6, + 0xe5, 0xff, 0xfc, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xde, 0xb2, + 0x9e, 0xac, 0x4f, 0x41, 0xb5, 0x38, 0x30, 0xcd, 0x41, 0x3c, 0xcd, 0x42, + 0x3d, 0xd1, 0x45, 0x40, 0xb5, 0x3f, 0x3b, 0x8f, 0x3c, 0x33, 0x81, 0x3d, + 0x33, 0x7e, 0x3c, 0x31, 0x7e, 0x3a, 0x2e, 0x7c, 0x39, 0x2f, 0x7c, 0x39, + 0x30, 0x7a, 0x39, 0x32, 0x76, 0x38, 0x30, 0x6a, 0x38, 0x2f, 0x68, 0x38, + 0x2f, 0x66, 0x37, 0x2c, 0x65, 0x37, 0x2d, 0x65, 0x37, 0x2c, 0x69, 0x36, + 0x30, 0x69, 0x37, 0x30, 0x66, 0x36, 0x2e, 0x68, 0x3b, 0x32, 0x6e, 0x4c, + 0x42, 0x38, 0x38, 0x33, 0x31, 0x34, 0x2c, 0x33, 0x37, 0x2d, 0x35, 0x36, + 0x2b, 0x33, 0x37, 0x29, 0x2f, 0x39, 0x2b, 0x30, 0x39, 0x2a, 0x2e, 0x38, + 0x2a, 0x2f, 0x38, 0x2c, 0x38, 0x41, 0x32, 0x3b, 0x43, 0x32, 0x30, 0x31, + 0x24, 0x44, 0x4d, 0x3a, 0x6f, 0x8b, 0x6a, 0x47, 0x6a, 0x3d, 0x4c, 0x6b, + 0x3c, 0x4c, 0x69, 0x3b, 0x57, 0x75, 0x46, 0x62, 0x81, 0x4e, 0x43, 0x56, + 0x3b, 0x68, 0x65, 0x56, 0x68, 0x65, 0x57, 0x68, 0x65, 0x57, 0x68, 0x65, + 0x57, 0x68, 0x65, 0x57, 0x69, 0x65, 0x56, 0x6b, 0x64, 0x5a, 0x6e, 0x65, + 0x57, 0x68, 0x66, 0x51, 0x6e, 0x6c, 0x68, 0xa0, 0xa7, 0xaf, 0xe2, 0xe7, + 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf8, 0xfb, 0xf1, 0xf8, 0xfa, + 0xf3, 0xff, 0xff, 0xef, 0xda, 0xd9, 0xb8, 0x70, 0x73, 0x57, 0x6f, 0x7b, + 0x6a, 0xc8, 0xcd, 0xc9, 0xff, 0xfe, 0xfc, 0xff, 0xff, 0xfd, 0xfd, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xd8, 0xbb, 0x6a, + 0x5e, 0xb0, 0x38, 0x2b, 0xc4, 0x40, 0x36, 0xc7, 0x48, 0x39, 0xa8, 0x45, + 0x36, 0x87, 0x42, 0x37, 0x80, 0x3f, 0x36, 0x82, 0x3b, 0x32, 0x7d, 0x39, + 0x32, 0x78, 0x38, 0x2f, 0x75, 0x37, 0x2e, 0x73, 0x37, 0x2e, 0x6f, 0x35, + 0x2b, 0x6a, 0x37, 0x30, 0x68, 0x37, 0x30, 0x66, 0x35, 0x2f, 0x67, 0x36, + 0x2f, 0x69, 0x37, 0x30, 0x6c, 0x37, 0x31, 0x6c, 0x3c, 0x2f, 0x67, 0x46, + 0x34, 0x82, 0x71, 0x5f, 0x6e, 0x6b, 0x5b, 0x29, 0x32, 0x28, 0x31, 0x37, + 0x2e, 0x30, 0x37, 0x2d, 0x31, 0x36, 0x2a, 0x30, 0x35, 0x2c, 0x2f, 0x33, + 0x2d, 0x2f, 0x33, 0x2d, 0x2f, 0x34, 0x2e, 0x2e, 0x31, 0x2c, 0x2e, 0x35, + 0x2e, 0x32, 0x3f, 0x34, 0x33, 0x40, 0x33, 0x40, 0x4d, 0x3a, 0x49, 0x58, + 0x40, 0x42, 0x55, 0x38, 0x4d, 0x67, 0x40, 0x47, 0x62, 0x39, 0x58, 0x72, + 0x4a, 0x5d, 0x78, 0x54, 0x34, 0x44, 0x35, 0x68, 0x65, 0x56, 0x68, 0x65, + 0x56, 0x68, 0x65, 0x56, 0x68, 0x65, 0x56, 0x68, 0x65, 0x56, 0x67, 0x65, + 0x55, 0x6b, 0x64, 0x5b, 0x6e, 0x64, 0x58, 0x67, 0x68, 0x50, 0x7d, 0x80, + 0x7e, 0xd9, 0xe2, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfc, + 0xf7, 0xe5, 0xe8, 0xde, 0xe3, 0xea, 0xd7, 0xf0, 0xf1, 0xd9, 0xd3, 0xd2, + 0xb7, 0xb4, 0xb0, 0x9f, 0xcd, 0xcc, 0xc7, 0xf2, 0xf2, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0xfc, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xf7, 0xc7, 0xa3, 0x8e, 0xa3, 0x45, + 0x34, 0xbd, 0x39, 0x2e, 0xb6, 0x3c, 0x39, 0x98, 0x3a, 0x3b, 0x7f, 0x40, + 0x3d, 0x70, 0x42, 0x3c, 0x71, 0x40, 0x36, 0x71, 0x3f, 0x35, 0x6f, 0x3f, + 0x34, 0x6a, 0x3c, 0x32, 0x68, 0x3a, 0x31, 0x71, 0x36, 0x32, 0x6d, 0x35, + 0x31, 0x6a, 0x37, 0x2f, 0x67, 0x39, 0x31, 0x67, 0x3e, 0x34, 0x66, 0x46, + 0x39, 0x63, 0x4a, 0x35, 0x5f, 0x4d, 0x35, 0x7f, 0x7f, 0x69, 0x51, 0x59, + 0x46, 0x2a, 0x31, 0x28, 0x30, 0x37, 0x2c, 0x31, 0x37, 0x2d, 0x30, 0x36, + 0x2c, 0x2f, 0x33, 0x2c, 0x2d, 0x32, 0x2d, 0x2e, 0x33, 0x2d, 0x2d, 0x32, + 0x2c, 0x2c, 0x30, 0x2b, 0x2c, 0x33, 0x2c, 0x29, 0x34, 0x2d, 0x2d, 0x38, + 0x2d, 0x32, 0x3e, 0x2d, 0x32, 0x3e, 0x2a, 0x36, 0x43, 0x2e, 0x44, 0x56, + 0x3b, 0x48, 0x5d, 0x3d, 0x5e, 0x71, 0x52, 0x5a, 0x6c, 0x53, 0x2c, 0x38, + 0x2e, 0x68, 0x65, 0x56, 0x68, 0x65, 0x56, 0x68, 0x65, 0x56, 0x69, 0x66, + 0x57, 0x69, 0x66, 0x57, 0x6a, 0x65, 0x56, 0x6c, 0x63, 0x5c, 0x6e, 0x67, + 0x5a, 0x68, 0x69, 0x51, 0x6c, 0x75, 0x70, 0xc3, 0xcd, 0xd5, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xfa, 0xfb, 0xf2, 0xe9, 0xed, 0xdc, 0xe7, 0xef, + 0xd2, 0xea, 0xe8, 0xce, 0xdd, 0xd4, 0xc7, 0xef, 0xe0, 0xe1, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, + 0xfc, 0xfe, 0xfe, 0xfc, 0xff, 0xfd, 0xfa, 0xf9, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0xd4, 0xbc, 0xb4, 0x6b, 0x53, 0x9d, 0x3f, + 0x2e, 0x91, 0x36, 0x2a, 0x7f, 0x38, 0x2c, 0x6f, 0x41, 0x33, 0x72, 0x3d, + 0x37, 0x73, 0x3f, 0x39, 0x73, 0x41, 0x3b, 0x6f, 0x3f, 0x38, 0x6e, 0x3d, + 0x36, 0x71, 0x39, 0x34, 0x6c, 0x3a, 0x33, 0x64, 0x3d, 0x32, 0x5e, 0x3e, + 0x32, 0x50, 0x3b, 0x2b, 0x55, 0x50, 0x39, 0x5d, 0x58, 0x3d, 0x5d, 0x5d, + 0x3f, 0x6e, 0x76, 0x5c, 0x32, 0x40, 0x2b, 0x32, 0x37, 0x2f, 0x32, 0x38, + 0x2e, 0x33, 0x39, 0x2f, 0x32, 0x38, 0x2d, 0x2f, 0x35, 0x2c, 0x2e, 0x33, + 0x2d, 0x2e, 0x33, 0x2d, 0x2c, 0x31, 0x2b, 0x2a, 0x2f, 0x29, 0x2b, 0x30, + 0x2b, 0x2b, 0x33, 0x2b, 0x2a, 0x34, 0x2c, 0x2d, 0x35, 0x2c, 0x37, 0x40, + 0x35, 0x39, 0x43, 0x34, 0x33, 0x3e, 0x2c, 0x3e, 0x4a, 0x34, 0x5c, 0x68, + 0x54, 0x51, 0x5d, 0x4f, 0x2b, 0x34, 0x2d, 0x67, 0x64, 0x55, 0x68, 0x65, + 0x56, 0x69, 0x66, 0x57, 0x69, 0x66, 0x57, 0x69, 0x66, 0x57, 0x6a, 0x65, + 0x56, 0x6e, 0x63, 0x5c, 0x6c, 0x68, 0x5a, 0x66, 0x6c, 0x53, 0x68, 0x77, + 0x6f, 0xba, 0xc6, 0xcd, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xf2, 0xf0, 0xf7, 0xe1, 0xdd, 0xe3, 0xc3, 0xda, 0xd7, 0xc1, 0xe9, 0xde, + 0xde, 0xff, 0xf5, 0xfa, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xfe, 0xfe, + 0xfc, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0xfc, 0xfa, 0xff, + 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xeb, 0xda, 0xc3, 0xac, 0xa0, 0x75, 0x5d, 0x79, 0x48, + 0x31, 0x65, 0x36, 0x22, 0x65, 0x33, 0x29, 0x6a, 0x39, 0x30, 0x6c, 0x3f, + 0x34, 0x69, 0x3e, 0x34, 0x68, 0x3e, 0x32, 0x63, 0x41, 0x37, 0x5f, 0x44, + 0x35, 0x59, 0x47, 0x35, 0x65, 0x5d, 0x47, 0x45, 0x46, 0x2f, 0x39, 0x43, + 0x27, 0x45, 0x49, 0x2b, 0x70, 0x70, 0x52, 0x5c, 0x60, 0x47, 0x32, 0x39, + 0x27, 0x37, 0x3d, 0x35, 0x37, 0x3d, 0x33, 0x37, 0x3e, 0x34, 0x38, 0x3e, + 0x33, 0x38, 0x3c, 0x35, 0x37, 0x3b, 0x36, 0x36, 0x3b, 0x35, 0x32, 0x37, + 0x31, 0x2e, 0x33, 0x2d, 0x2c, 0x31, 0x2b, 0x28, 0x2e, 0x28, 0x2a, 0x2e, + 0x2a, 0x2c, 0x31, 0x2c, 0x2f, 0x32, 0x2f, 0x3d, 0x44, 0x3d, 0x3d, 0x4a, + 0x38, 0x31, 0x3f, 0x28, 0x42, 0x50, 0x3c, 0x45, 0x50, 0x44, 0x2f, 0x39, + 0x30, 0x64, 0x64, 0x53, 0x67, 0x64, 0x55, 0x68, 0x67, 0x57, 0x69, 0x65, + 0x57, 0x68, 0x66, 0x57, 0x6b, 0x65, 0x56, 0x6e, 0x64, 0x5c, 0x6c, 0x68, + 0x5a, 0x64, 0x6b, 0x52, 0x64, 0x77, 0x6f, 0xc3, 0xd0, 0xd9, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xf2, 0xf2, 0xf7, 0xe0, 0xd1, 0xd2, + 0xb6, 0xc6, 0xbf, 0xb3, 0xf0, 0xe6, 0xee, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xfc, 0xfe, 0xff, 0xfa, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, + 0xfc, 0xfe, 0xfe, 0xfc, 0xfe, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xf9, 0xff, + 0xf5, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xf8, 0xf4, 0xe4, 0xe5, 0xd8, 0xc8, 0xd1, 0xbd, + 0xa7, 0x68, 0x53, 0x3b, 0x58, 0x44, 0x2c, 0x5d, 0x4b, 0x32, 0x5c, 0x4c, + 0x34, 0x56, 0x4f, 0x3a, 0x51, 0x4e, 0x37, 0x4d, 0x4f, 0x38, 0x5e, 0x67, + 0x4b, 0x40, 0x4c, 0x30, 0x3d, 0x45, 0x2a, 0x47, 0x4a, 0x2b, 0x69, 0x67, + 0x4a, 0x60, 0x59, 0x44, 0x46, 0x46, 0x35, 0x3a, 0x3f, 0x35, 0x3a, 0x3e, + 0x35, 0x38, 0x3e, 0x34, 0x39, 0x3f, 0x35, 0x39, 0x40, 0x38, 0x3b, 0x41, + 0x3b, 0x3a, 0x3e, 0x39, 0x3a, 0x40, 0x3a, 0x39, 0x3d, 0x38, 0x37, 0x3b, + 0x36, 0x30, 0x36, 0x32, 0x2c, 0x31, 0x2c, 0x2b, 0x2f, 0x2e, 0x29, 0x2d, + 0x2e, 0x29, 0x33, 0x29, 0x36, 0x4a, 0x32, 0x39, 0x4c, 0x33, 0x38, 0x49, + 0x31, 0x3b, 0x4b, 0x38, 0x2f, 0x3b, 0x2e, 0x5c, 0x67, 0x4f, 0x5f, 0x69, + 0x52, 0x67, 0x6b, 0x57, 0x69, 0x68, 0x58, 0x6c, 0x66, 0x58, 0x6c, 0x67, + 0x59, 0x6b, 0x66, 0x5b, 0x68, 0x67, 0x59, 0x65, 0x6c, 0x59, 0x7c, 0x8a, + 0x86, 0xc8, 0xd2, 0xd9, 0xf5, 0xfa, 0xfa, 0xf7, 0xfa, 0xf0, 0xee, 0xee, + 0xdc, 0xdd, 0xda, 0xc6, 0xc9, 0xc0, 0xae, 0xc9, 0xbe, 0xb6, 0xe9, 0xe0, + 0xe6, 0xfe, 0xfa, 0xff, 0xfd, 0xfe, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, + 0xfe, 0xff, 0xfe, 0xfc, 0xff, 0xfd, 0xfb, 0xff, 0xfd, 0xf9, 0xff, 0xfc, + 0xfc, 0xff, 0xfd, 0xfd, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf4, 0xf6, 0xec, + 0xe8, 0xfe, 0xfa, 0xfb, 0xfe, 0xff, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xee, 0xe9, 0xe6, 0xcd, 0x6d, 0x67, 0x4b, 0x52, 0x4b, + 0x2d, 0x55, 0x4f, 0x32, 0x53, 0x4f, 0x33, 0x50, 0x4e, 0x34, 0x4c, 0x4f, + 0x36, 0x48, 0x4f, 0x35, 0x45, 0x4e, 0x2e, 0x4c, 0x53, 0x30, 0x5d, 0x65, + 0x40, 0x61, 0x65, 0x46, 0x56, 0x56, 0x3d, 0x57, 0x54, 0x3c, 0x55, 0x52, + 0x39, 0x4d, 0x49, 0x36, 0x43, 0x42, 0x35, 0x3c, 0x3f, 0x35, 0x38, 0x41, + 0x35, 0x38, 0x43, 0x35, 0x39, 0x41, 0x37, 0x39, 0x41, 0x36, 0x3a, 0x42, + 0x37, 0x3b, 0x43, 0x38, 0x3c, 0x45, 0x3c, 0x3b, 0x45, 0x3a, 0x39, 0x40, + 0x35, 0x35, 0x3d, 0x36, 0x36, 0x44, 0x2f, 0x47, 0x60, 0x35, 0x47, 0x62, + 0x3c, 0x3a, 0x4d, 0x38, 0x40, 0x52, 0x3a, 0x48, 0x5c, 0x41, 0x34, 0x42, + 0x31 + }, + WizardImage[] = + { + 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0xE0, 0x01, 0x80, 0x02, 0xF7, 0x00, + 0x00, 0x0C, 0x0A, 0x0B, 0x06, 0x05, 0x08, 0x13, 0x0C, 0x0C, 0x0C, 0x0B, + 0x18, 0x19, 0x16, 0x16, 0x15, 0x10, 0x10, 0x26, 0x1A, 0x17, 0x2F, 0x19, + 0x14, 0x2F, 0x26, 0x19, 0x0E, 0x0E, 0x23, 0x14, 0x13, 0x29, 0x15, 0x15, + 0x33, 0x19, 0x19, 0x3C, 0x18, 0x18, 0x38, 0x0F, 0x0F, 0x27, 0x2A, 0x26, + 0x26, 0x34, 0x2B, 0x29, 0x3A, 0x36, 0x37, 0x30, 0x2D, 0x31, 0x24, 0x1E, + 0x27, 0x4A, 0x32, 0x18, 0x42, 0x3C, 0x3B, 0x4D, 0x2E, 0x2B, 0x66, 0x38, + 0x38, 0x4B, 0x27, 0x1C, 0x4E, 0x4A, 0x35, 0x6D, 0x53, 0x2F, 0x69, 0x58, + 0x28, 0x1B, 0x1C, 0x44, 0x1D, 0x1E, 0x4A, 0x15, 0x16, 0x47, 0x1C, 0x1D, + 0x56, 0x1F, 0x20, 0x4D, 0x1F, 0x21, 0x52, 0x23, 0x24, 0x4A, 0x21, 0x22, + 0x54, 0x24, 0x25, 0x5C, 0x28, 0x2A, 0x59, 0x35, 0x37, 0x4C, 0x25, 0x27, + 0x61, 0x27, 0x28, 0x64, 0x29, 0x2B, 0x6C, 0x28, 0x29, 0x67, 0x2C, 0x2E, + 0x73, 0x2A, 0x2C, 0x78, 0x2E, 0x31, 0x7B, 0x2E, 0x30, 0x76, 0x30, 0x33, + 0x7E, 0x34, 0x39, 0x77, 0x31, 0x35, 0x69, 0x1E, 0x1F, 0x5F, 0x42, 0x3E, + 0x45, 0x6C, 0x3D, 0x45, 0x3C, 0x45, 0x6F, 0x3B, 0x42, 0x58, 0x49, 0x46, + 0x47, 0x52, 0x4D, 0x4A, 0x59, 0x56, 0x58, 0x51, 0x4E, 0x52, 0x62, 0x5D, + 0x5A, 0x71, 0x4E, 0x47, 0x6F, 0x68, 0x54, 0x5B, 0x59, 0x65, 0x48, 0x50, + 0x72, 0x61, 0x5E, 0x65, 0x68, 0x66, 0x68, 0x72, 0x6D, 0x69, 0x6B, 0x69, + 0x74, 0x78, 0x76, 0x78, 0x74, 0x71, 0x6F, 0x5C, 0x61, 0x68, 0x3D, 0x44, + 0x27, 0x92, 0x6B, 0x2A, 0xAB, 0x78, 0x2E, 0x8C, 0x5D, 0x26, 0x8D, 0x50, + 0x53, 0x88, 0x76, 0x55, 0x85, 0x7C, 0x74, 0xB4, 0x67, 0x6D, 0xA7, 0x60, + 0x5D, 0xCA, 0x73, 0x75, 0xD6, 0x78, 0x67, 0xB6, 0x86, 0x37, 0xC8, 0x8F, + 0x39, 0x94, 0x8C, 0x54, 0xAD, 0x95, 0x53, 0x8E, 0x87, 0x74, 0xAA, 0x97, + 0x6F, 0xB5, 0xA9, 0x70, 0xB0, 0xA9, 0x5B, 0xCD, 0x96, 0x48, 0xD7, 0xA8, + 0x54, 0xC9, 0xB5, 0x74, 0xEA, 0xB8, 0x69, 0xE6, 0xA4, 0x60, 0xEF, 0xC9, + 0x73, 0xE2, 0xDB, 0x73, 0x32, 0x34, 0x83, 0x34, 0x37, 0x8A, 0x35, 0x39, + 0x8D, 0x36, 0x3B, 0x87, 0x36, 0x3A, 0x92, 0x38, 0x3C, 0x95, 0x3A, 0x3E, + 0x9B, 0x36, 0x3B, 0x99, 0x2D, 0x31, 0x85, 0x3B, 0x3F, 0xA1, 0x3C, 0x42, + 0x9A, 0x3C, 0x44, 0x89, 0x3D, 0x41, 0xA4, 0x3F, 0x43, 0xAA, 0x3F, 0x48, + 0xA4, 0x3E, 0x45, 0xB2, 0x48, 0x53, 0x91, 0x58, 0x66, 0x93, 0x7B, 0x7A, + 0x84, 0x6D, 0x72, 0x90, 0x40, 0x45, 0xAD, 0x43, 0x4A, 0xA9, 0x4B, 0x56, + 0xA9, 0x42, 0x46, 0xB3, 0x44, 0x4A, 0xB5, 0x45, 0x4A, 0xBB, 0x47, 0x4D, + 0xBC, 0x4B, 0x55, 0xB8, 0x51, 0x5D, 0xB3, 0x58, 0x67, 0xB8, 0x58, 0x68, + 0xA9, 0x65, 0x77, 0xB2, 0x67, 0x49, 0x87, 0x47, 0x4C, 0xC1, 0x48, 0x4E, + 0xC5, 0x49, 0x4F, 0xC9, 0x4B, 0x52, 0xCC, 0x4B, 0x54, 0xC5, 0x4D, 0x54, + 0xD3, 0x4F, 0x56, 0xD9, 0x51, 0x59, 0xDA, 0x51, 0x5B, 0xC9, 0x59, 0x67, + 0xC8, 0x5A, 0x66, 0xD7, 0x5F, 0x70, 0xC9, 0x65, 0x78, 0xC8, 0x66, 0x78, + 0xD8, 0x61, 0x6E, 0xD6, 0x54, 0x5B, 0xE5, 0x57, 0x5E, 0xF2, 0x5A, 0x66, + 0xE7, 0x5B, 0x65, 0xF5, 0x66, 0x75, 0xEB, 0x68, 0x59, 0xCE, 0x46, 0x3B, + 0x8A, 0x81, 0x7E, 0x85, 0xD4, 0x7A, 0x84, 0x75, 0x83, 0xA8, 0x73, 0x89, + 0xD8, 0x74, 0x8A, 0xD0, 0x75, 0x8B, 0xE9, 0x87, 0x86, 0x89, 0x8C, 0x8C, + 0x93, 0x88, 0x88, 0x95, 0x94, 0x94, 0x9C, 0x98, 0x97, 0x98, 0x93, 0x90, + 0x8F, 0xA3, 0x9D, 0x96, 0xA7, 0xA3, 0x9B, 0xB7, 0xAF, 0x8E, 0x9B, 0x9C, + 0xA3, 0x98, 0x99, 0xA6, 0x91, 0x91, 0xAD, 0xA1, 0x9F, 0xA5, 0x9E, 0xA1, + 0xAA, 0x9F, 0xA3, 0xB0, 0xA3, 0xA4, 0xAC, 0xA9, 0xA7, 0xA8, 0xB7, 0xB3, + 0xAB, 0xAB, 0xAC, 0xB3, 0xA8, 0xAA, 0xB6, 0xAE, 0xB1, 0xBB, 0xB3, 0xB4, + 0xBC, 0xB8, 0xB8, 0xB7, 0xB1, 0xAE, 0xAE, 0x9D, 0xAD, 0x89, 0xCB, 0xB6, + 0x8C, 0xC2, 0xBD, 0xB3, 0xE3, 0xAD, 0x95, 0xBE, 0xC2, 0xB3, 0xD3, 0xCA, + 0x92, 0xE9, 0xCF, 0x96, 0xFD, 0xF9, 0x86, 0xEF, 0xEB, 0x96, 0xC5, 0xC3, + 0xBB, 0xD6, 0xCF, 0xAC, 0xF7, 0xDA, 0xA9, 0xED, 0xD3, 0xAB, 0xFC, 0xE2, + 0xAD, 0xFE, 0xFB, 0xBD, 0xF9, 0xF5, 0xBA, 0xF8, 0xEA, 0xB0, 0x84, 0x9A, + 0xD7, 0xB3, 0xB5, 0xC2, 0xBB, 0xBC, 0xC4, 0xBB, 0xBD, 0xCB, 0xB6, 0xB9, + 0xC5, 0xB0, 0xB2, 0xC8, 0x82, 0x9C, 0xE9, 0x8D, 0xA7, 0xED, 0x8C, 0xA4, + 0xDF, 0xBE, 0xC1, 0xC9, 0xBD, 0xC2, 0xD2, 0xC3, 0xC4, 0xC3, 0xC3, 0xC4, + 0xCB, 0xCB, 0xCC, 0xCC, 0xC9, 0xC9, 0xC7, 0xCF, 0xD0, 0xCD, 0xD2, 0xD2, + 0xCD, 0xD9, 0xD6, 0xC9, 0xCB, 0xCC, 0xD3, 0xC6, 0xC8, 0xD5, 0xCE, 0xD0, + 0xD6, 0xD3, 0xD3, 0xD4, 0xD3, 0xD4, 0xDB, 0xDB, 0xDA, 0xD8, 0xD1, 0xCE, + 0xC9, 0xE2, 0xDE, 0xD4, 0xFF, 0xFB, 0xC3, 0xFF, 0xFB, 0xCB, 0xF8, 0xF5, + 0xC8, 0xE6, 0xE4, 0xDA, 0xFF, 0xFC, 0xD4, 0xFF, 0xFC, 0xDC, 0xF7, 0xF4, + 0xD7, 0xEE, 0xE9, 0xCF, 0xDD, 0xDE, 0xEA, 0xD9, 0xDA, 0xE4, 0xCD, 0xD0, + 0xE3, 0xDF, 0xE0, 0xED, 0xDF, 0xE0, 0xE4, 0xE2, 0xE3, 0xEE, 0xEC, 0xEB, + 0xEC, 0xE8, 0xE7, 0xE4, 0xFF, 0xFD, 0xE4, 0xF4, 0xF3, 0xED, 0xFE, 0xFE, + 0xEE, 0xF7, 0xF4, 0xE6, 0xE5, 0xE6, 0xF1, 0xEB, 0xEC, 0xF2, 0xE7, 0xE9, + 0xF2, 0xF4, 0xF4, 0xF2, 0xFD, 0xFD, 0xF3, 0xFF, 0xFF, 0xFF, 0xF6, 0xF7, + 0xF9, 0xF0, 0xEF, 0xEF, 0xE0, 0xE0, 0xDF, 0xC0, 0xBF, 0xC4, 0x7B, 0x82, + 0x65, 0x21, 0xF9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xFF, 0x0B, + 0x49, 0x43, 0x43, 0x52, 0x47, 0x42, 0x47, 0x31, 0x30, 0x31, 0x32, 0xFF, + 0x00, 0x00, 0x0C, 0x48, 0x4C, 0x69, 0x6E, 0x6F, 0x02, 0x10, 0x00, 0x00, + 0x6D, 0x6E, 0x74, 0x72, 0x52, 0x47, 0x42, 0x20, 0x58, 0x59, 0x5A, 0x20, + 0x07, 0xCE, 0x00, 0x02, 0x00, 0x09, 0x00, 0x06, 0x00, 0x31, 0x00, 0x00, + 0x61, 0x63, 0x73, 0x70, 0x4D, 0x53, 0x46, 0x54, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x45, 0x43, 0x20, 0x73, 0x52, 0x47, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xD6, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xD3, 0x2D, 0x48, 0x50, 0x20, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, + 0x63, 0x70, 0x72, 0x74, 0x00, 0x00, 0x01, 0x50, 0x00, 0x00, 0x00, 0x33, + 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x01, 0x84, 0x00, 0x00, 0x00, 0x6C, + 0x77, 0x74, 0x70, 0x74, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x14, + 0x62, 0x6B, 0x70, 0x74, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x14, + 0x72, 0x58, 0x59, 0x5A, 0x00, 0x00, 0x02, 0x18, 0x00, 0x00, 0x00, 0x14, + 0x67, 0x58, 0x59, 0x5A, 0x00, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x00, 0x14, + 0x62, 0x58, 0x59, 0x5A, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x14, + 0x64, 0x6D, 0x6E, 0x64, 0x00, 0x00, 0x02, 0x54, 0x00, 0x00, 0x00, 0x70, + 0x64, 0x6D, 0x64, 0x64, 0x00, 0x00, 0x02, 0xC4, 0x00, 0x00, 0x00, 0x88, + 0x76, 0x75, 0x65, 0x64, 0x00, 0x00, 0x03, 0x4C, 0x00, 0x00, 0x00, 0x86, + 0x76, 0x69, 0x65, 0xFF, 0x77, 0x00, 0x00, 0x03, 0xD4, 0x00, 0x00, 0x00, + 0x24, 0x6C, 0x75, 0x6D, 0x69, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, + 0x14, 0x6D, 0x65, 0x61, 0x73, 0x00, 0x00, 0x04, 0x0C, 0x00, 0x00, 0x00, + 0x24, 0x74, 0x65, 0x63, 0x68, 0x00, 0x00, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x0C, 0x72, 0x54, 0x52, 0x43, 0x00, 0x00, 0x04, 0x3C, 0x00, 0x00, 0x08, + 0x0C, 0x67, 0x54, 0x52, 0x43, 0x00, 0x00, 0x04, 0x3C, 0x00, 0x00, 0x08, + 0x0C, 0x62, 0x54, 0x52, 0x43, 0x00, 0x00, 0x04, 0x3C, 0x00, 0x00, 0x08, + 0x0C, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x43, 0x6F, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, + 0x39, 0x39, 0x38, 0x20, 0x48, 0x65, 0x77, 0x6C, 0x65, 0x74, 0x74, 0x2D, + 0x50, 0x61, 0x63, 0x6B, 0x61, 0x72, 0x64, 0x20, 0x43, 0x6F, 0x6D, 0x70, + 0x61, 0x6E, 0x79, 0x00, 0x00, 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x12, 0x73, 0x52, 0x47, 0x42, 0x20, 0x49, 0x45, + 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, 0x31, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x73, 0x52, + 0x47, 0x42, 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, + 0x32, 0x2E, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x59, 0x5A, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF3, 0x51, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x01, + 0x16, 0xCC, 0x58, 0x59, 0x5A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x59, + 0x5A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xA2, 0x00, 0x00, + 0x38, 0xF5, 0x00, 0x00, 0x03, 0x90, 0x58, 0x59, 0x5A, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x62, 0x99, 0x00, 0x00, 0xB7, 0x85, 0x00, 0x00, + 0x18, 0xDA, 0x58, 0x59, 0x5A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0xA0, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0xB6, 0xCF, 0x64, 0x65, + 0x73, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x49, 0x45, + 0x43, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, + 0x2E, 0x69, 0x65, 0x63, 0x2E, 0x63, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x49, 0x45, 0x43, 0x20, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x69, 0x65, + 0x63, 0x2E, 0x63, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2E, 0x49, 0x45, 0x43, 0x20, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, + 0x32, 0x2E, 0x31, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x20, + 0x52, 0x47, 0x42, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x75, 0x72, 0x20, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x2D, 0x20, 0x73, 0x52, 0x47, 0x42, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, + 0x49, 0x45, 0x43, 0x20, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x20, 0x52, 0x47, + 0x42, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x75, 0x72, 0x20, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x2D, 0x20, 0x73, 0x52, 0x47, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x65, 0x73, 0x63, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6E, 0x63, 0x65, 0x20, 0x56, 0x69, 0x65, 0x77, 0x69, 0x6E, 0x67, + 0x20, 0x43, 0x6F, 0x6E, 0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, + 0x6E, 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, + 0x2E, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2C, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x63, 0x65, 0x20, + 0x56, 0x69, 0x65, 0x77, 0x69, 0x6E, 0x67, 0x20, 0x43, 0x6F, 0x6E, 0x64, + 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x49, 0x45, 0x43, + 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, 0x31, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, + 0x69, 0x65, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xA4, 0xFE, 0x00, + 0x14, 0x5F, 0x2E, 0x00, 0x10, 0xCF, 0x14, 0x00, 0x03, 0xED, 0xCC, 0x00, + 0x04, 0x13, 0x0B, 0x00, 0x03, 0x5C, 0x9E, 0x00, 0x00, 0x00, 0x01, 0x58, + 0x59, 0x5A, 0x20, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x09, 0x56, + 0x00, 0x50, 0x00, 0x00, 0x00, 0x57, 0x1F, 0xE7, 0x6D, 0x65, 0x61, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x8F, 0x00, 0x00, 0x00, 0x02, 0x73, 0x69, 0x67, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x52, 0x54, 0x20, 0x63, 0x75, 0x72, 0x76, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x0A, 0x00, 0x0F, 0x00, 0x14, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x23, + 0x00, 0x28, 0x00, 0x2D, 0x00, 0x32, 0x00, 0x37, 0x00, 0x3B, 0x00, 0x40, + 0x00, 0x45, 0x00, 0x4A, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x59, 0x00, 0x5E, + 0x00, 0x63, 0x00, 0x68, 0x00, 0x6D, 0x00, 0x72, 0x00, 0x77, 0x00, 0x7C, + 0x00, 0x81, 0x00, 0x86, 0x00, 0x8B, 0x00, 0x90, 0x00, 0x95, 0x00, 0x9A, + 0x00, 0x9F, 0x00, 0xA4, 0x00, 0xA9, 0x00, 0xAE, 0x00, 0xB2, 0x00, 0xB7, + 0x00, 0xBC, 0x00, 0xC1, 0x00, 0xC6, 0x00, 0xCB, 0x00, 0xD0, 0x00, 0xD5, + 0x00, 0xDB, 0x00, 0xE0, 0x00, 0xE5, 0x00, 0xEB, 0x00, 0xF0, 0x00, 0xF6, + 0x00, 0xFB, 0x01, 0x01, 0x01, 0x07, 0x01, 0x0D, 0x01, 0x13, 0x01, 0x19, + 0x01, 0x1F, 0x01, 0x25, 0x01, 0x2B, 0x01, 0x32, 0x01, 0x38, 0x01, 0x3E, + 0x01, 0x45, 0x01, 0x4C, 0x01, 0x52, 0x01, 0x59, 0x01, 0x60, 0x01, 0x67, + 0x01, 0x6E, 0x01, 0x75, 0x01, 0x7C, 0x01, 0x83, 0x01, 0x8B, 0x01, 0x92, + 0x01, 0x9A, 0x01, 0xA1, 0x01, 0xA9, 0x01, 0xB1, 0x01, 0xB9, 0x01, 0xC1, + 0x01, 0xC9, 0x01, 0xD1, 0x01, 0xD9, 0x01, 0xE1, 0x01, 0xE9, 0x01, 0xF2, + 0x01, 0xFA, 0x02, 0x03, 0x02, 0x0C, 0x02, 0xFF, 0x14, 0x02, 0x1D, 0x02, + 0x26, 0x02, 0x2F, 0x02, 0x38, 0x02, 0x41, 0x02, 0x4B, 0x02, 0x54, 0x02, + 0x5D, 0x02, 0x67, 0x02, 0x71, 0x02, 0x7A, 0x02, 0x84, 0x02, 0x8E, 0x02, + 0x98, 0x02, 0xA2, 0x02, 0xAC, 0x02, 0xB6, 0x02, 0xC1, 0x02, 0xCB, 0x02, + 0xD5, 0x02, 0xE0, 0x02, 0xEB, 0x02, 0xF5, 0x03, 0x00, 0x03, 0x0B, 0x03, + 0x16, 0x03, 0x21, 0x03, 0x2D, 0x03, 0x38, 0x03, 0x43, 0x03, 0x4F, 0x03, + 0x5A, 0x03, 0x66, 0x03, 0x72, 0x03, 0x7E, 0x03, 0x8A, 0x03, 0x96, 0x03, + 0xA2, 0x03, 0xAE, 0x03, 0xBA, 0x03, 0xC7, 0x03, 0xD3, 0x03, 0xE0, 0x03, + 0xEC, 0x03, 0xF9, 0x04, 0x06, 0x04, 0x13, 0x04, 0x20, 0x04, 0x2D, 0x04, + 0x3B, 0x04, 0x48, 0x04, 0x55, 0x04, 0x63, 0x04, 0x71, 0x04, 0x7E, 0x04, + 0x8C, 0x04, 0x9A, 0x04, 0xA8, 0x04, 0xB6, 0x04, 0xC4, 0x04, 0xD3, 0x04, + 0xE1, 0x04, 0xF0, 0x04, 0xFE, 0x05, 0x0D, 0x05, 0x1C, 0x05, 0x2B, 0x05, + 0x3A, 0x05, 0x49, 0x05, 0x58, 0x05, 0x67, 0x05, 0x77, 0x05, 0x86, 0x05, + 0x96, 0x05, 0xA6, 0x05, 0xB5, 0x05, 0xC5, 0x05, 0xD5, 0x05, 0xE5, 0x05, + 0xF6, 0x06, 0x06, 0x06, 0x16, 0x06, 0x27, 0x06, 0x37, 0x06, 0x48, 0x06, + 0x59, 0x06, 0x6A, 0x06, 0x7B, 0x06, 0x8C, 0x06, 0x9D, 0x06, 0xAF, 0x06, + 0xC0, 0x06, 0xD1, 0x06, 0xE3, 0x06, 0xF5, 0x07, 0x07, 0x07, 0x19, 0x07, + 0x2B, 0x07, 0x3D, 0x07, 0x4F, 0x07, 0x61, 0x07, 0x74, 0x07, 0x86, 0x07, + 0x99, 0x07, 0xAC, 0x07, 0xBF, 0x07, 0xD2, 0x07, 0xE5, 0x07, 0xF8, 0x08, + 0x0B, 0x08, 0x1F, 0x08, 0x32, 0x08, 0x46, 0x08, 0x5A, 0x08, 0x6E, 0x08, + 0x82, 0x08, 0x96, 0x08, 0xAA, 0x08, 0xBE, 0x08, 0xD2, 0x08, 0xE7, 0x08, + 0xFB, 0x09, 0x10, 0x09, 0x25, 0x09, 0x3A, 0x09, 0x4F, 0x09, 0x64, 0xFF, + 0x09, 0x79, 0x09, 0x8F, 0x09, 0xA4, 0x09, 0xBA, 0x09, 0xCF, 0x09, 0xE5, + 0x09, 0xFB, 0x0A, 0x11, 0x0A, 0x27, 0x0A, 0x3D, 0x0A, 0x54, 0x0A, 0x6A, + 0x0A, 0x81, 0x0A, 0x98, 0x0A, 0xAE, 0x0A, 0xC5, 0x0A, 0xDC, 0x0A, 0xF3, + 0x0B, 0x0B, 0x0B, 0x22, 0x0B, 0x39, 0x0B, 0x51, 0x0B, 0x69, 0x0B, 0x80, + 0x0B, 0x98, 0x0B, 0xB0, 0x0B, 0xC8, 0x0B, 0xE1, 0x0B, 0xF9, 0x0C, 0x12, + 0x0C, 0x2A, 0x0C, 0x43, 0x0C, 0x5C, 0x0C, 0x75, 0x0C, 0x8E, 0x0C, 0xA7, + 0x0C, 0xC0, 0x0C, 0xD9, 0x0C, 0xF3, 0x0D, 0x0D, 0x0D, 0x26, 0x0D, 0x40, + 0x0D, 0x5A, 0x0D, 0x74, 0x0D, 0x8E, 0x0D, 0xA9, 0x0D, 0xC3, 0x0D, 0xDE, + 0x0D, 0xF8, 0x0E, 0x13, 0x0E, 0x2E, 0x0E, 0x49, 0x0E, 0x64, 0x0E, 0x7F, + 0x0E, 0x9B, 0x0E, 0xB6, 0x0E, 0xD2, 0x0E, 0xEE, 0x0F, 0x09, 0x0F, 0x25, + 0x0F, 0x41, 0x0F, 0x5E, 0x0F, 0x7A, 0x0F, 0x96, 0x0F, 0xB3, 0x0F, 0xCF, + 0x0F, 0xEC, 0x10, 0x09, 0x10, 0x26, 0x10, 0x43, 0x10, 0x61, 0x10, 0x7E, + 0x10, 0x9B, 0x10, 0xB9, 0x10, 0xD7, 0x10, 0xF5, 0x11, 0x13, 0x11, 0x31, + 0x11, 0x4F, 0x11, 0x6D, 0x11, 0x8C, 0x11, 0xAA, 0x11, 0xC9, 0x11, 0xE8, + 0x12, 0x07, 0x12, 0x26, 0x12, 0x45, 0x12, 0x64, 0x12, 0x84, 0x12, 0xA3, + 0x12, 0xC3, 0x12, 0xE3, 0x13, 0x03, 0x13, 0x23, 0x13, 0x43, 0x13, 0x63, + 0x13, 0x83, 0x13, 0xA4, 0x13, 0xC5, 0x13, 0xE5, 0x14, 0x06, 0x14, 0x27, + 0x14, 0x49, 0x14, 0x6A, 0x14, 0x8B, 0x14, 0xAD, 0x14, 0xCE, 0x14, 0xF0, + 0x15, 0x12, 0x15, 0x34, 0x15, 0x56, 0x15, 0x78, 0x15, 0x9B, 0x15, 0xBD, + 0x15, 0xE0, 0x16, 0x03, 0x16, 0x26, 0x16, 0x49, 0x16, 0x6C, 0x16, 0x8F, + 0x16, 0xB2, 0x16, 0xD6, 0x16, 0xFA, 0x17, 0x1D, 0x17, 0x41, 0x17, 0x65, + 0x17, 0x89, 0x17, 0xFF, 0xAE, 0x17, 0xD2, 0x17, 0xF7, 0x18, 0x1B, 0x18, + 0x40, 0x18, 0x65, 0x18, 0x8A, 0x18, 0xAF, 0x18, 0xD5, 0x18, 0xFA, 0x19, + 0x20, 0x19, 0x45, 0x19, 0x6B, 0x19, 0x91, 0x19, 0xB7, 0x19, 0xDD, 0x1A, + 0x04, 0x1A, 0x2A, 0x1A, 0x51, 0x1A, 0x77, 0x1A, 0x9E, 0x1A, 0xC5, 0x1A, + 0xEC, 0x1B, 0x14, 0x1B, 0x3B, 0x1B, 0x63, 0x1B, 0x8A, 0x1B, 0xB2, 0x1B, + 0xDA, 0x1C, 0x02, 0x1C, 0x2A, 0x1C, 0x52, 0x1C, 0x7B, 0x1C, 0xA3, 0x1C, + 0xCC, 0x1C, 0xF5, 0x1D, 0x1E, 0x1D, 0x47, 0x1D, 0x70, 0x1D, 0x99, 0x1D, + 0xC3, 0x1D, 0xEC, 0x1E, 0x16, 0x1E, 0x40, 0x1E, 0x6A, 0x1E, 0x94, 0x1E, + 0xBE, 0x1E, 0xE9, 0x1F, 0x13, 0x1F, 0x3E, 0x1F, 0x69, 0x1F, 0x94, 0x1F, + 0xBF, 0x1F, 0xEA, 0x20, 0x15, 0x20, 0x41, 0x20, 0x6C, 0x20, 0x98, 0x20, + 0xC4, 0x20, 0xF0, 0x21, 0x1C, 0x21, 0x48, 0x21, 0x75, 0x21, 0xA1, 0x21, + 0xCE, 0x21, 0xFB, 0x22, 0x27, 0x22, 0x55, 0x22, 0x82, 0x22, 0xAF, 0x22, + 0xDD, 0x23, 0x0A, 0x23, 0x38, 0x23, 0x66, 0x23, 0x94, 0x23, 0xC2, 0x23, + 0xF0, 0x24, 0x1F, 0x24, 0x4D, 0x24, 0x7C, 0x24, 0xAB, 0x24, 0xDA, 0x25, + 0x09, 0x25, 0x38, 0x25, 0x68, 0x25, 0x97, 0x25, 0xC7, 0x25, 0xF7, 0x26, + 0x27, 0x26, 0x57, 0x26, 0x87, 0x26, 0xB7, 0x26, 0xE8, 0x27, 0x18, 0x27, + 0x49, 0x27, 0x7A, 0x27, 0xAB, 0x27, 0xDC, 0x28, 0x0D, 0x28, 0x3F, 0x28, + 0x71, 0x28, 0xA2, 0x28, 0xD4, 0x29, 0x06, 0x29, 0x38, 0x29, 0x6B, 0x29, + 0x9D, 0x29, 0xD0, 0x2A, 0x02, 0x2A, 0x35, 0x2A, 0x68, 0x2A, 0x9B, 0x2A, + 0xCF, 0x2B, 0x02, 0x2B, 0x36, 0x2B, 0x69, 0x2B, 0x9D, 0x2B, 0xD1, 0x2C, + 0x05, 0x2C, 0x39, 0x2C, 0x6E, 0x2C, 0xA2, 0x2C, 0xD7, 0x2D, 0x0C, 0x2D, + 0x41, 0x2D, 0x76, 0x2D, 0xAB, 0x2D, 0xE1, 0xFF, 0x2E, 0x16, 0x2E, 0x4C, + 0x2E, 0x82, 0x2E, 0xB7, 0x2E, 0xEE, 0x2F, 0x24, 0x2F, 0x5A, 0x2F, 0x91, + 0x2F, 0xC7, 0x2F, 0xFE, 0x30, 0x35, 0x30, 0x6C, 0x30, 0xA4, 0x30, 0xDB, + 0x31, 0x12, 0x31, 0x4A, 0x31, 0x82, 0x31, 0xBA, 0x31, 0xF2, 0x32, 0x2A, + 0x32, 0x63, 0x32, 0x9B, 0x32, 0xD4, 0x33, 0x0D, 0x33, 0x46, 0x33, 0x7F, + 0x33, 0xB8, 0x33, 0xF1, 0x34, 0x2B, 0x34, 0x65, 0x34, 0x9E, 0x34, 0xD8, + 0x35, 0x13, 0x35, 0x4D, 0x35, 0x87, 0x35, 0xC2, 0x35, 0xFD, 0x36, 0x37, + 0x36, 0x72, 0x36, 0xAE, 0x36, 0xE9, 0x37, 0x24, 0x37, 0x60, 0x37, 0x9C, + 0x37, 0xD7, 0x38, 0x14, 0x38, 0x50, 0x38, 0x8C, 0x38, 0xC8, 0x39, 0x05, + 0x39, 0x42, 0x39, 0x7F, 0x39, 0xBC, 0x39, 0xF9, 0x3A, 0x36, 0x3A, 0x74, + 0x3A, 0xB2, 0x3A, 0xEF, 0x3B, 0x2D, 0x3B, 0x6B, 0x3B, 0xAA, 0x3B, 0xE8, + 0x3C, 0x27, 0x3C, 0x65, 0x3C, 0xA4, 0x3C, 0xE3, 0x3D, 0x22, 0x3D, 0x61, + 0x3D, 0xA1, 0x3D, 0xE0, 0x3E, 0x20, 0x3E, 0x60, 0x3E, 0xA0, 0x3E, 0xE0, + 0x3F, 0x21, 0x3F, 0x61, 0x3F, 0xA2, 0x3F, 0xE2, 0x40, 0x23, 0x40, 0x64, + 0x40, 0xA6, 0x40, 0xE7, 0x41, 0x29, 0x41, 0x6A, 0x41, 0xAC, 0x41, 0xEE, + 0x42, 0x30, 0x42, 0x72, 0x42, 0xB5, 0x42, 0xF7, 0x43, 0x3A, 0x43, 0x7D, + 0x43, 0xC0, 0x44, 0x03, 0x44, 0x47, 0x44, 0x8A, 0x44, 0xCE, 0x45, 0x12, + 0x45, 0x55, 0x45, 0x9A, 0x45, 0xDE, 0x46, 0x22, 0x46, 0x67, 0x46, 0xAB, + 0x46, 0xF0, 0x47, 0x35, 0x47, 0x7B, 0x47, 0xC0, 0x48, 0x05, 0x48, 0x4B, + 0x48, 0x91, 0x48, 0xD7, 0x49, 0x1D, 0x49, 0x63, 0x49, 0xA9, 0x49, 0xF0, + 0x4A, 0x37, 0x4A, 0x7D, 0x4A, 0xC4, 0x4B, 0x0C, 0x4B, 0x53, 0x4B, 0x9A, + 0x4B, 0xE2, 0x4C, 0x2A, 0x4C, 0x72, 0x4C, 0xBA, 0x4D, 0x02, 0x4D, 0xFF, + 0x4A, 0x4D, 0x93, 0x4D, 0xDC, 0x4E, 0x25, 0x4E, 0x6E, 0x4E, 0xB7, 0x4F, + 0x00, 0x4F, 0x49, 0x4F, 0x93, 0x4F, 0xDD, 0x50, 0x27, 0x50, 0x71, 0x50, + 0xBB, 0x51, 0x06, 0x51, 0x50, 0x51, 0x9B, 0x51, 0xE6, 0x52, 0x31, 0x52, + 0x7C, 0x52, 0xC7, 0x53, 0x13, 0x53, 0x5F, 0x53, 0xAA, 0x53, 0xF6, 0x54, + 0x42, 0x54, 0x8F, 0x54, 0xDB, 0x55, 0x28, 0x55, 0x75, 0x55, 0xC2, 0x56, + 0x0F, 0x56, 0x5C, 0x56, 0xA9, 0x56, 0xF7, 0x57, 0x44, 0x57, 0x92, 0x57, + 0xE0, 0x58, 0x2F, 0x58, 0x7D, 0x58, 0xCB, 0x59, 0x1A, 0x59, 0x69, 0x59, + 0xB8, 0x5A, 0x07, 0x5A, 0x56, 0x5A, 0xA6, 0x5A, 0xF5, 0x5B, 0x45, 0x5B, + 0x95, 0x5B, 0xE5, 0x5C, 0x35, 0x5C, 0x86, 0x5C, 0xD6, 0x5D, 0x27, 0x5D, + 0x78, 0x5D, 0xC9, 0x5E, 0x1A, 0x5E, 0x6C, 0x5E, 0xBD, 0x5F, 0x0F, 0x5F, + 0x61, 0x5F, 0xB3, 0x60, 0x05, 0x60, 0x57, 0x60, 0xAA, 0x60, 0xFC, 0x61, + 0x4F, 0x61, 0xA2, 0x61, 0xF5, 0x62, 0x49, 0x62, 0x9C, 0x62, 0xF0, 0x63, + 0x43, 0x63, 0x97, 0x63, 0xEB, 0x64, 0x40, 0x64, 0x94, 0x64, 0xE9, 0x65, + 0x3D, 0x65, 0x92, 0x65, 0xE7, 0x66, 0x3D, 0x66, 0x92, 0x66, 0xE8, 0x67, + 0x3D, 0x67, 0x93, 0x67, 0xE9, 0x68, 0x3F, 0x68, 0x96, 0x68, 0xEC, 0x69, + 0x43, 0x69, 0x9A, 0x69, 0xF1, 0x6A, 0x48, 0x6A, 0x9F, 0x6A, 0xF7, 0x6B, + 0x4F, 0x6B, 0xA7, 0x6B, 0xFF, 0x6C, 0x57, 0x6C, 0xAF, 0x6D, 0x08, 0x6D, + 0x60, 0x6D, 0xB9, 0x6E, 0x12, 0x6E, 0x6B, 0x6E, 0xC4, 0x6F, 0x1E, 0x6F, + 0x78, 0x6F, 0xD1, 0x70, 0x2B, 0x70, 0x86, 0x70, 0xE0, 0x71, 0x3A, 0x71, + 0x95, 0x71, 0xF0, 0x72, 0x4B, 0x72, 0xA6, 0x73, 0x01, 0x73, 0x5D, 0x73, + 0xB8, 0x74, 0x14, 0x74, 0x70, 0x74, 0xCC, 0x75, 0x28, 0x75, 0x85, 0x75, + 0xE1, 0x76, 0x3E, 0xFF, 0x76, 0x9B, 0x76, 0xF8, 0x77, 0x56, 0x77, 0xB3, + 0x78, 0x11, 0x78, 0x6E, 0x78, 0xCC, 0x79, 0x2A, 0x79, 0x89, 0x79, 0xE7, + 0x7A, 0x46, 0x7A, 0xA5, 0x7B, 0x04, 0x7B, 0x63, 0x7B, 0xC2, 0x7C, 0x21, + 0x7C, 0x81, 0x7C, 0xE1, 0x7D, 0x41, 0x7D, 0xA1, 0x7E, 0x01, 0x7E, 0x62, + 0x7E, 0xC2, 0x7F, 0x23, 0x7F, 0x84, 0x7F, 0xE5, 0x80, 0x47, 0x80, 0xA8, + 0x81, 0x0A, 0x81, 0x6B, 0x81, 0xCD, 0x82, 0x30, 0x82, 0x92, 0x82, 0xF4, + 0x83, 0x57, 0x83, 0xBA, 0x84, 0x1D, 0x84, 0x80, 0x84, 0xE3, 0x85, 0x47, + 0x85, 0xAB, 0x86, 0x0E, 0x86, 0x72, 0x86, 0xD7, 0x87, 0x3B, 0x87, 0x9F, + 0x88, 0x04, 0x88, 0x69, 0x88, 0xCE, 0x89, 0x33, 0x89, 0x99, 0x89, 0xFE, + 0x8A, 0x64, 0x8A, 0xCA, 0x8B, 0x30, 0x8B, 0x96, 0x8B, 0xFC, 0x8C, 0x63, + 0x8C, 0xCA, 0x8D, 0x31, 0x8D, 0x98, 0x8D, 0xFF, 0x8E, 0x66, 0x8E, 0xCE, + 0x8F, 0x36, 0x8F, 0x9E, 0x90, 0x06, 0x90, 0x6E, 0x90, 0xD6, 0x91, 0x3F, + 0x91, 0xA8, 0x92, 0x11, 0x92, 0x7A, 0x92, 0xE3, 0x93, 0x4D, 0x93, 0xB6, + 0x94, 0x20, 0x94, 0x8A, 0x94, 0xF4, 0x95, 0x5F, 0x95, 0xC9, 0x96, 0x34, + 0x96, 0x9F, 0x97, 0x0A, 0x97, 0x75, 0x97, 0xE0, 0x98, 0x4C, 0x98, 0xB8, + 0x99, 0x24, 0x99, 0x90, 0x99, 0xFC, 0x9A, 0x68, 0x9A, 0xD5, 0x9B, 0x42, + 0x9B, 0xAF, 0x9C, 0x1C, 0x9C, 0x89, 0x9C, 0xF7, 0x9D, 0x64, 0x9D, 0xD2, + 0x9E, 0x40, 0x9E, 0xAE, 0x9F, 0x1D, 0x9F, 0x8B, 0x9F, 0xFA, 0xA0, 0x69, + 0xA0, 0xD8, 0xA1, 0x47, 0xA1, 0xB6, 0xA2, 0x26, 0xA2, 0x96, 0xA3, 0x06, + 0xA3, 0x76, 0xA3, 0xE6, 0xA4, 0x56, 0xA4, 0xC7, 0xA5, 0x38, 0xA5, 0xA9, + 0xA6, 0x1A, 0xA6, 0x8B, 0xA6, 0xFD, 0xA7, 0x6E, 0xA7, 0xE0, 0xA8, 0x52, + 0xA8, 0xC4, 0xA9, 0x37, 0xA9, 0xA9, 0xAA, 0xFF, 0x1C, 0xAA, 0x8F, 0xAB, + 0x02, 0xAB, 0x75, 0xAB, 0xE9, 0xAC, 0x5C, 0xAC, 0xD0, 0xAD, 0x44, 0xAD, + 0xB8, 0xAE, 0x2D, 0xAE, 0xA1, 0xAF, 0x16, 0xAF, 0x8B, 0xB0, 0x00, 0xB0, + 0x75, 0xB0, 0xEA, 0xB1, 0x60, 0xB1, 0xD6, 0xB2, 0x4B, 0xB2, 0xC2, 0xB3, + 0x38, 0xB3, 0xAE, 0xB4, 0x25, 0xB4, 0x9C, 0xB5, 0x13, 0xB5, 0x8A, 0xB6, + 0x01, 0xB6, 0x79, 0xB6, 0xF0, 0xB7, 0x68, 0xB7, 0xE0, 0xB8, 0x59, 0xB8, + 0xD1, 0xB9, 0x4A, 0xB9, 0xC2, 0xBA, 0x3B, 0xBA, 0xB5, 0xBB, 0x2E, 0xBB, + 0xA7, 0xBC, 0x21, 0xBC, 0x9B, 0xBD, 0x15, 0xBD, 0x8F, 0xBE, 0x0A, 0xBE, + 0x84, 0xBE, 0xFF, 0xBF, 0x7A, 0xBF, 0xF5, 0xC0, 0x70, 0xC0, 0xEC, 0xC1, + 0x67, 0xC1, 0xE3, 0xC2, 0x5F, 0xC2, 0xDB, 0xC3, 0x58, 0xC3, 0xD4, 0xC4, + 0x51, 0xC4, 0xCE, 0xC5, 0x4B, 0xC5, 0xC8, 0xC6, 0x46, 0xC6, 0xC3, 0xC7, + 0x41, 0xC7, 0xBF, 0xC8, 0x3D, 0xC8, 0xBC, 0xC9, 0x3A, 0xC9, 0xB9, 0xCA, + 0x38, 0xCA, 0xB7, 0xCB, 0x36, 0xCB, 0xB6, 0xCC, 0x35, 0xCC, 0xB5, 0xCD, + 0x35, 0xCD, 0xB5, 0xCE, 0x36, 0xCE, 0xB6, 0xCF, 0x37, 0xCF, 0xB8, 0xD0, + 0x39, 0xD0, 0xBA, 0xD1, 0x3C, 0xD1, 0xBE, 0xD2, 0x3F, 0xD2, 0xC1, 0xD3, + 0x44, 0xD3, 0xC6, 0xD4, 0x49, 0xD4, 0xCB, 0xD5, 0x4E, 0xD5, 0xD1, 0xD6, + 0x55, 0xD6, 0xD8, 0xD7, 0x5C, 0xD7, 0xE0, 0xD8, 0x64, 0xD8, 0xE8, 0xD9, + 0x6C, 0xD9, 0xF1, 0xDA, 0x76, 0xDA, 0xFB, 0xDB, 0x80, 0xDC, 0x05, 0xDC, + 0x8A, 0xDD, 0x10, 0xDD, 0x96, 0xDE, 0x1C, 0xDE, 0xA2, 0xDF, 0x29, 0xDF, + 0xAF, 0xE0, 0x36, 0xE0, 0xBD, 0xE1, 0x44, 0xE1, 0xCC, 0xE2, 0x53, 0xE2, + 0xDB, 0xE3, 0x63, 0xE3, 0xEB, 0xE4, 0x73, 0xE4, 0xFC, 0xE5, 0x84, 0xE6, + 0x0D, 0xE6, 0x96, 0xE7, 0x1F, 0xE7, 0xA9, 0xE8, 0x32, 0xE8, 0xBC, 0x54, + 0xE9, 0x46, 0xE9, 0xD0, 0xEA, 0x5B, 0xEA, 0xE5, 0xEB, 0x70, 0xEB, 0xFB, + 0xEC, 0x86, 0xED, 0x11, 0xED, 0x9C, 0xEE, 0x28, 0xEE, 0xB4, 0xEF, 0x40, + 0xEF, 0xCC, 0xF0, 0x58, 0xF0, 0xE5, 0xF1, 0x72, 0xF1, 0xFF, 0xF2, 0x8C, + 0xF3, 0x19, 0xF3, 0xA7, 0xF4, 0x34, 0xF4, 0xC2, 0xF5, 0x50, 0xF5, 0xDE, + 0xF6, 0x6D, 0xF6, 0xFB, 0xF7, 0x8A, 0xF8, 0x19, 0xF8, 0xA8, 0xF9, 0x38, + 0xF9, 0xC7, 0xFA, 0x57, 0xFA, 0xE7, 0xFB, 0x77, 0xFC, 0x07, 0xFC, 0x98, + 0xFD, 0x29, 0xFD, 0xBA, 0xFE, 0x4B, 0xFE, 0xDC, 0xFF, 0x6D, 0xFF, 0xFF, + 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x80, 0x02, 0x00, 0x08, + 0xFE, 0x00, 0xF5, 0x09, 0x1C, 0x48, 0xB0, 0xA0, 0xC1, 0x83, 0x08, 0x13, + 0x2A, 0x5C, 0xC8, 0xB0, 0xA1, 0xC3, 0x87, 0x10, 0x23, 0x4A, 0x9C, 0x48, + 0xB1, 0xA2, 0xC5, 0x8B, 0x18, 0x33, 0x6A, 0xDC, 0xC8, 0xB1, 0xA3, 0xC7, + 0x8F, 0x20, 0x43, 0x8A, 0x1C, 0x49, 0xB2, 0xA4, 0xC9, 0x93, 0x28, 0x53, + 0xAA, 0x5C, 0xC9, 0xB2, 0xA5, 0xCB, 0x97, 0x30, 0x63, 0xCA, 0x9C, 0x49, + 0xB3, 0xA6, 0xCD, 0x9B, 0x38, 0x73, 0xEA, 0xDC, 0xC9, 0xB3, 0xA7, 0xCF, + 0x9F, 0x40, 0x83, 0x0A, 0x1D, 0x4A, 0xB4, 0xA8, 0xD1, 0xA3, 0x48, 0x93, + 0x2A, 0x5D, 0xCA, 0xB4, 0xA9, 0xD3, 0xA7, 0x50, 0xA3, 0x4A, 0x9D, 0x4A, + 0xB5, 0xAA, 0xD5, 0xAB, 0x58, 0xB3, 0x6A, 0xDD, 0xCA, 0xB5, 0xAB, 0xD7, + 0xAF, 0x60, 0xC3, 0x8A, 0x1D, 0x4B, 0xB6, 0xAC, 0xD9, 0x99, 0xFB, 0xCE, + 0xAA, 0x5D, 0xCB, 0xB6, 0xAD, 0xDB, 0xB7, 0x70, 0xE3, 0xCA, 0x9D, 0x4B, + 0xB7, 0xAE, 0xDD, 0xBB, 0x78, 0xF3, 0xEA, 0x9D, 0x9A, 0x76, 0xAF, 0xDF, + 0xBF, 0x80, 0x03, 0x0B, 0x1E, 0x4C, 0xB8, 0xB0, 0xE1, 0xC3, 0x88, 0x13, + 0x2B, 0x5E, 0xCC, 0xB8, 0xB1, 0xE3, 0xC7, 0x90, 0x3F, 0xEE, 0xEB, 0x1B, + 0xB9, 0xB2, 0x65, 0xB4, 0xF9, 0x2E, 0x6B, 0xDE, 0x8C, 0x33, 0x33, 0xE7, + 0xCF, 0xA0, 0x45, 0xEE, 0xC3, 0x17, 0xBA, 0xB4, 0xE9, 0xD3, 0xA8, 0x53, + 0xAB, 0x5E, 0xCD, 0xBA, 0xB5, 0xEB, 0xD7, 0xB0, 0x63, 0xEB, 0xA5, 0x2C, + 0xBB, 0xB6, 0x6D, 0x9D, 0x93, 0x6F, 0xEB, 0xDE, 0xCD, 0xBB, 0xB7, 0xEF, + 0xDF, 0xC0, 0x83, 0x0B, 0x1F, 0x4E, 0xBC, 0xB8, 0xF1, 0xE3, 0xC8, 0x93, + 0x2B, 0x5F, 0xCE, 0xBC, 0xB9, 0xF3, 0xBA, 0xB9, 0x9F, 0x4B, 0x9F, 0x4E, + 0xDD, 0x20, 0xED, 0xBD, 0xD7, 0xAB, 0x23, 0x8F, 0xAE, 0xBD, 0xBB, 0xF7, + 0xEF, 0xE0, 0xC3, 0xFE, 0x8B, 0x77, 0x9D, 0x7D, 0xBC, 0xF9, 0xF3, 0xE8, + 0x35, 0x97, 0x4F, 0xCF, 0xBE, 0xBD, 0xFB, 0xF7, 0xF0, 0xE3, 0xCB, 0x9F, + 0x4F, 0xBF, 0xBE, 0xFD, 0xFB, 0xF8, 0xF3, 0xEB, 0xDF, 0xCF, 0xBF, 0xBF, + 0xFF, 0xFF, 0xA6, 0xAD, 0x07, 0xE0, 0x80, 0x4E, 0x91, 0x46, 0xE0, 0x81, + 0x08, 0x26, 0xA8, 0xE0, 0x82, 0x0C, 0xA2, 0x26, 0x60, 0x83, 0x10, 0x46, + 0x88, 0xD0, 0x83, 0x12, 0x26, 0xE8, 0x59, 0x85, 0x18, 0x66, 0xA8, 0xE1, + 0x86, 0x1C, 0x76, 0xE8, 0xE1, 0x87, 0x20, 0x86, 0x28, 0xE2, 0x88, 0x24, + 0x96, 0x68, 0xE2, 0x89, 0x28, 0xA6, 0xA8, 0xE2, 0x8A, 0x25, 0x51, 0xC8, + 0xE2, 0x8B, 0x30, 0xC6, 0x28, 0xE3, 0x8C, 0x34, 0xD6, 0x68, 0xE3, 0x8D, + 0x38, 0xE6, 0xA8, 0xE3, 0x8E, 0x3E, 0x5D, 0xC8, 0xE3, 0x7C, 0x2E, 0x0A, + 0x35, 0xDA, 0x8F, 0x76, 0xD1, 0xE6, 0x23, 0x91, 0xD2, 0xA5, 0xE5, 0x59, + 0x5A, 0x7D, 0x35, 0x89, 0xE4, 0x5C, 0x41, 0x76, 0x66, 0x50, 0x66, 0xA3, + 0x51, 0xC6, 0x0F, 0x43, 0x51, 0x3E, 0xF9, 0x1A, 0x2D, 0x9E, 0xCC, 0xF1, + 0xC9, 0x2A, 0xA1, 0x80, 0x02, 0xCA, 0x27, 0xB6, 0x84, 0x32, 0xCA, 0x29, + 0xA1, 0x9C, 0x52, 0x0B, 0x2D, 0xC9, 0x68, 0x93, 0x8D, 0x3A, 0xF7, 0xD8, + 0xC3, 0xDD, 0x41, 0x47, 0x6A, 0xC9, 0x9A, 0x37, 0x39, 0xD4, 0x10, 0x07, + 0x19, 0x66, 0x90, 0xC1, 0x04, 0x15, 0x3D, 0x50, 0x91, 0x81, 0x0B, 0x31, + 0xC0, 0x00, 0x03, 0x1B, 0x71, 0xD4, 0x90, 0x81, 0x10, 0xFF, 0x50, 0xF1, + 0xCF, 0x3F, 0xB6, 0x5C, 0x61, 0x4B, 0x2D, 0xD0, 0x78, 0x73, 0x4D, 0x3F, + 0xB9, 0x4D, 0xB6, 0x4F, 0x9D, 0x76, 0x96, 0x96, 0x9B, 0x11, 0x6C, 0x30, + 0xC2, 0xC7, 0x24, 0x95, 0x50, 0xE2, 0x07, 0x17, 0x60, 0x80, 0xC1, 0x05, + 0x1F, 0x7C, 0x28, 0xA2, 0x48, 0x25, 0xFE, 0xA4, 0x52, 0x91, 0x6A, 0x16, + 0x3D, 0x18, 0x21, 0x6B, 0x16, 0x3A, 0xC8, 0x41, 0x07, 0x1D, 0xA0, 0xAC, + 0x22, 0x8B, 0x37, 0xED, 0xBC, 0x73, 0x64, 0x96, 0x9D, 0x3A, 0x06, 0x8F, + 0x0E, 0x89, 0x50, 0xA2, 0x08, 0x1F, 0x79, 0xF0, 0x71, 0x08, 0x1B, 0x58, + 0xA8, 0xEA, 0x07, 0x1C, 0x8A, 0xEC, 0x31, 0x49, 0x22, 0x89, 0x58, 0x41, + 0x45, 0x11, 0x72, 0x30, 0x72, 0xC7, 0x0F, 0x59, 0x50, 0xF1, 0x03, 0x27, + 0x80, 0xFC, 0x51, 0xEE, 0x0F, 0xBB, 0x82, 0x22, 0x0B, 0x34, 0xD6, 0x78, + 0x03, 0x8F, 0x81, 0x04, 0x11, 0x5B, 0xAC, 0x61, 0xF0, 0xEC, 0x10, 0x43, + 0x0B, 0x70, 0x18, 0xC2, 0xAC, 0x1D, 0x6F, 0xD4, 0x00, 0xC6, 0x16, 0x7F, + 0x20, 0x62, 0x47, 0x1E, 0x85, 0xE8, 0x71, 0xC8, 0x1D, 0x77, 0x44, 0xA2, + 0x08, 0x23, 0x95, 0xFC, 0x81, 0xC3, 0x11, 0x77, 0x38, 0xD2, 0x09, 0x27, + 0x9B, 0x90, 0xDB, 0xC9, 0x26, 0x72, 0x98, 0xAB, 0xAB, 0x1C, 0x62, 0xAE, + 0x42, 0xCB, 0xA5, 0xA4, 0x95, 0x27, 0xEF, 0x8F, 0xF8, 0x8C, 0xBC, 0x56, + 0x5F, 0xF8, 0x5C, 0x23, 0x8A, 0x0E, 0x24, 0xB0, 0x40, 0xC6, 0x1A, 0x6B, + 0xA4, 0x51, 0x43, 0x15, 0x81, 0x08, 0xF2, 0x46, 0x22, 0x7B, 0xE4, 0x61, + 0x88, 0x21, 0x8C, 0x30, 0xA2, 0x2F, 0x23, 0x8A, 0xB0, 0xC1, 0x46, 0x23, + 0x7E, 0x3C, 0xE2, 0x08, 0x27, 0x9C, 0xFC, 0xE1, 0x08, 0x20, 0x9C, 0x34, + 0x83, 0x34, 0xD2, 0x80, 0x2C, 0x6D, 0xAE, 0x26, 0x74, 0xA0, 0x22, 0x8B, + 0x3B, 0x4A, 0xCE, 0xDB, 0x10, 0xA7, 0x79, 0x59, 0xF9, 0xCA, 0x10, 0x25, + 0x9C, 0xB0, 0x86, 0x1D, 0x68, 0xEC, 0xE0, 0x43, 0x1A, 0x65, 0xEC, 0x61, + 0xC8, 0x1B, 0x79, 0x2C, 0x8B, 0x48, 0x22, 0x86, 0x28, 0x12, 0xB7, 0xAB, + 0x8D, 0x18, 0xFD, 0x48, 0xC5, 0xE4, 0x1E, 0x0D, 0xC8, 0xFE, 0x26, 0x47, + 0xE3, 0x8D, 0xF4, 0x26, 0x9B, 0x00, 0x22, 0x87, 0x1C, 0x43, 0xA0, 0xF2, + 0x0B, 0x3C, 0x26, 0x6B, 0x6D, 0x97, 0x8F, 0x94, 0x75, 0x13, 0x84, 0x08, + 0x6C, 0xF0, 0x41, 0x06, 0x0C, 0x2D, 0xB0, 0x70, 0xC2, 0x0B, 0x6B, 0xBC, + 0x01, 0x07, 0x1C, 0x85, 0x18, 0x52, 0x48, 0x22, 0x3E, 0xDB, 0xA1, 0x08, + 0x24, 0x8B, 0x3C, 0xD2, 0x48, 0x27, 0x47, 0x73, 0xE2, 0x48, 0x23, 0x14, + 0x6F, 0xF2, 0xC7, 0xC4, 0x4B, 0x0B, 0xEE, 0x87, 0xB9, 0x49, 0x27, 0x6A, + 0xC4, 0x1C, 0xA7, 0x7C, 0x23, 0x27, 0x7E, 0x89, 0x17, 0x77, 0xE1, 0xA6, + 0xFA, 0xEC, 0xF3, 0xCA, 0x0D, 0x25, 0xBC, 0xF1, 0x46, 0xE6, 0x2F, 0xA4, + 0xD0, 0x42, 0x18, 0x70, 0x68, 0xFE, 0x86, 0x21, 0xD8, 0x2A, 0x22, 0x48, + 0xF3, 0x6A, 0x97, 0xEE, 0xC8, 0xF5, 0x7D, 0x03, 0x7E, 0xB4, 0x23, 0x15, + 0x0B, 0xFE, 0x4F, 0x13, 0x71, 0x84, 0xFF, 0xC3, 0x0E, 0x35, 0xFC, 0x11, + 0x87, 0x0F, 0x9E, 0xC0, 0x72, 0x4D, 0xEF, 0x8A, 0xD7, 0x95, 0x0F, 0xCA, + 0xA3, 0x44, 0x00, 0x83, 0x1D, 0x76, 0xD4, 0x91, 0xC7, 0x18, 0x2F, 0x88, + 0x61, 0x47, 0x1B, 0x6D, 0xAC, 0x01, 0xBD, 0x1E, 0x76, 0x30, 0x42, 0x11, + 0x76, 0xF0, 0x83, 0x1F, 0x20, 0xAC, 0x11, 0x80, 0x7B, 0xC4, 0xDD, 0x00, + 0xD7, 0x89, 0xD3, 0x41, 0xED, 0x06, 0xAA, 0xFA, 0x47, 0x0F, 0xB2, 0xC0, + 0x85, 0x1A, 0xEC, 0xED, 0x0F, 0x72, 0x88, 0x83, 0x11, 0x44, 0xE1, 0x0D, + 0xAE, 0xB1, 0x88, 0x7D, 0x5F, 0x01, 0xA1, 0x75, 0xE2, 0xD5, 0x17, 0x6E, + 0x08, 0x21, 0x02, 0x97, 0xB8, 0x43, 0x1E, 0xEC, 0x67, 0x07, 0x32, 0x88, + 0x01, 0x66, 0x6E, 0xC0, 0x03, 0x1A, 0x74, 0xF0, 0x27, 0x30, 0xF4, 0x02, + 0x0C, 0x80, 0x8A, 0x03, 0x23, 0x1C, 0xB1, 0xC0, 0x47, 0x50, 0x8C, 0x7B, + 0xFE, 0x7C, 0xEB, 0x04, 0x1B, 0xB2, 0x70, 0xC3, 0x54, 0x81, 0xC1, 0x06, + 0x72, 0x88, 0xDA, 0x0F, 0x35, 0x88, 0x09, 0x69, 0x38, 0xA9, 0x7D, 0x80, + 0xF1, 0x8C, 0x8F, 0x32, 0x93, 0x0F, 0x5A, 0xE8, 0xC0, 0x04, 0x35, 0xA8, + 0x5F, 0xCE, 0xCA, 0x30, 0x86, 0x36, 0x90, 0xC1, 0x05, 0x6B, 0x58, 0x41, + 0x0C, 0x62, 0x60, 0x83, 0x7F, 0xD8, 0xB0, 0x17, 0x59, 0x10, 0xC2, 0x1F, + 0x4A, 0xF7, 0x08, 0x3F, 0x34, 0x02, 0x7B, 0x3E, 0x74, 0x1D, 0x04, 0x6F, + 0xD8, 0x8B, 0x1B, 0xF6, 0x20, 0x0E, 0x4C, 0xE3, 0x44, 0x27, 0x9C, 0x81, + 0xB1, 0x1F, 0x18, 0x61, 0x16, 0xF0, 0x82, 0xE2, 0x60, 0x7E, 0x27, 0x90, + 0x7D, 0xD4, 0x22, 0x07, 0x12, 0x80, 0xC1, 0x1E, 0x6C, 0xD6, 0x86, 0x37, + 0x8C, 0x81, 0x0C, 0x65, 0x58, 0x43, 0x09, 0x5C, 0x90, 0x06, 0x15, 0xB0, + 0xC0, 0x0A, 0x75, 0xCC, 0x82, 0x15, 0xFE, 0x00, 0x89, 0x4A, 0xBC, 0xB1, + 0x11, 0x51, 0xE3, 0x21, 0x20, 0x6C, 0x40, 0xC4, 0x3A, 0x16, 0x11, 0x87, + 0x49, 0x64, 0x60, 0xC5, 0x9C, 0xC1, 0x09, 0x13, 0xE4, 0x40, 0x14, 0xF0, + 0x18, 0x88, 0x08, 0x05, 0x09, 0x15, 0xE0, 0x65, 0xA4, 0x8A, 0x3B, 0x30, + 0x81, 0x0B, 0xDA, 0xC0, 0x07, 0x3D, 0xE8, 0xC1, 0x0D, 0x2F, 0x20, 0x43, + 0x1B, 0xC4, 0xE0, 0x02, 0x36, 0xB4, 0x40, 0x06, 0x9E, 0xB8, 0x61, 0x16, + 0xFE, 0x51, 0x3A, 0x48, 0x28, 0xD0, 0x0F, 0x7E, 0x00, 0x84, 0x1F, 0x6C, + 0xB0, 0x03, 0x4C, 0x0C, 0x01, 0x55, 0x60, 0x30, 0x82, 0x0D, 0x8C, 0xA0, + 0x09, 0x25, 0xEA, 0xB1, 0x19, 0x80, 0x68, 0x06, 0x2B, 0xFF, 0xF0, 0x03, + 0x1D, 0x60, 0x42, 0x17, 0x25, 0x0B, 0x1E, 0x2D, 0xF1, 0x42, 0x19, 0x29, + 0x16, 0xB2, 0x2F, 0xD7, 0x28, 0x82, 0x09, 0x56, 0x20, 0x88, 0x82, 0xD5, + 0x61, 0x0C, 0x65, 0xFE, 0xC8, 0x83, 0x18, 0x5A, 0xF0, 0x02, 0x18, 0xB0, + 0xC0, 0x16, 0xA9, 0xA2, 0x42, 0x1C, 0x5E, 0xF5, 0x08, 0x67, 0x42, 0x33, + 0x51, 0xE1, 0xEB, 0x83, 0x19, 0xA9, 0x20, 0x87, 0x4E, 0x18, 0x0D, 0x70, + 0x10, 0x75, 0x5A, 0x27, 0xC2, 0xD9, 0x34, 0x40, 0x94, 0xF3, 0x1F, 0xAF, + 0x98, 0xE5, 0x3A, 0xBF, 0x32, 0x45, 0x59, 0x12, 0xC4, 0x1B, 0x44, 0x30, + 0x01, 0x0B, 0xCE, 0x30, 0x08, 0x3D, 0x98, 0x21, 0x9F, 0x6B, 0x88, 0x24, + 0x0B, 0x4C, 0x30, 0xAB, 0x1F, 0x18, 0xA2, 0x0F, 0xA4, 0xAB, 0x5B, 0x25, + 0x66, 0x97, 0x31, 0x4E, 0xE0, 0x00, 0x0C, 0xFF, 0xF8, 0x03, 0x03, 0x3B, + 0x71, 0xB1, 0x89, 0x01, 0xCE, 0x69, 0x4E, 0xE3, 0x04, 0x2B, 0x73, 0xB0, + 0x01, 0x23, 0x0C, 0xE1, 0x17, 0x48, 0xD1, 0xE8, 0x46, 0x23, 0xF2, 0xC4, + 0x78, 0x0D, 0xE4, 0x42, 0xDF, 0x98, 0x83, 0x09, 0xC4, 0x20, 0x88, 0x3C, + 0xB8, 0x01, 0x0D, 0x79, 0x98, 0xDE, 0x1A, 0x46, 0x50, 0x05, 0x5F, 0x80, + 0x41, 0x07, 0x92, 0x58, 0xD6, 0xE8, 0xEA, 0xB6, 0x88, 0xD9, 0x41, 0xD3, + 0x06, 0x0C, 0xF5, 0x83, 0xEA, 0x20, 0xBA, 0x89, 0x66, 0xEC, 0xB4, 0xAD, + 0x9D, 0xE8, 0xE6, 0x1F, 0x26, 0x68, 0x84, 0x3F, 0x18, 0x61, 0x14, 0xB1, + 0x5C, 0xAA, 0x5C, 0x3C, 0x78, 0x9D, 0x0B, 0xD1, 0x62, 0x06, 0x29, 0x28, + 0x04, 0x21, 0xF0, 0xB0, 0x86, 0x3A, 0x98, 0x21, 0x0C, 0x30, 0xA8, 0x42, + 0x2F, 0xB8, 0x70, 0x83, 0x43, 0x4C, 0x42, 0x11, 0x77, 0x58, 0x58, 0x25, + 0x16, 0x01, 0x89, 0xBA, 0x39, 0xE2, 0x0F, 0x36, 0x60, 0x03, 0xF7, 0x36, + 0x1B, 0x44, 0xBE, 0x6D, 0xC2, 0xA7, 0xC7, 0x48, 0x9A, 0x1C, 0xB2, 0x90, + 0x4D, 0xA4, 0xD1, 0xC1, 0x08, 0xDB, 0x98, 0x93, 0x47, 0xAE, 0xA4, 0xD7, + 0xA8, 0x28, 0x69, 0x49, 0x06, 0xE9, 0xFE, 0x07, 0x0E, 0x52, 0x70, 0x08, + 0x42, 0xE4, 0x21, 0x0F, 0x67, 0x10, 0x43, 0x0C, 0xB0, 0xB0, 0x8B, 0x2C, + 0xFC, 0xA0, 0x91, 0x6A, 0xAB, 0xC3, 0x1D, 0x18, 0xB1, 0x88, 0x45, 0xF4, + 0xC1, 0x8D, 0x97, 0x3D, 0x1D, 0x10, 0x51, 0x27, 0x07, 0xC0, 0x01, 0x62, + 0x81, 0xDA, 0xF3, 0xC3, 0x3F, 0x88, 0x98, 0x05, 0xB5, 0x86, 0xF6, 0x07, + 0xB6, 0x08, 0xA4, 0x47, 0x94, 0xDA, 0xDA, 0x98, 0x64, 0x67, 0x53, 0xB6, + 0x74, 0xEA, 0x3B, 0x72, 0xC0, 0x00, 0x38, 0x24, 0x62, 0x10, 0x75, 0x08, + 0x43, 0x0A, 0xB0, 0xE0, 0x0B, 0x2A, 0xB0, 0x21, 0x0F, 0x65, 0xD0, 0x9C, + 0x21, 0x10, 0xC6, 0x87, 0x9E, 0x31, 0xA2, 0xB2, 0x65, 0x3D, 0x5D, 0x03, + 0x1D, 0x41, 0x87, 0x38, 0xFC, 0xE1, 0x74, 0x41, 0xA4, 0x18, 0x20, 0x34, + 0x68, 0xC3, 0x0A, 0x22, 0x2D, 0xB4, 0x72, 0xD0, 0x84, 0x35, 0xBA, 0x1B, + 0x17, 0x77, 0x8E, 0xD0, 0xA3, 0xF8, 0xC8, 0xC1, 0x02, 0xDC, 0x50, 0x08, + 0x41, 0x84, 0x61, 0x04, 0xBB, 0xF0, 0xC5, 0x0F, 0xD4, 0x30, 0xCC, 0x35, + 0xB4, 0xA1, 0x0E, 0x82, 0x50, 0x44, 0x1E, 0xEC, 0x10, 0xB7, 0x45, 0x54, + 0xE2, 0x11, 0x8B, 0x68, 0x04, 0xD1, 0x3C, 0x41, 0x41, 0x23, 0xDC, 0xE1, + 0x0F, 0x8F, 0x38, 0x31, 0x5B, 0xE5, 0xD0, 0x83, 0x33, 0x0A, 0xC1, 0x82, + 0x8E, 0x68, 0xC6, 0x31, 0x34, 0x31, 0x84, 0x59, 0x70, 0x97, 0xC1, 0x63, + 0xC9, 0xC7, 0x10, 0x18, 0x50, 0x87, 0x43, 0xA0, 0xA1, 0x09, 0xBB, 0xD8, + 0x70, 0x18, 0xC2, 0x50, 0x06, 0xCC, 0xE5, 0xC1, 0x60, 0xE7, 0xAD, 0xDF, + 0xC2, 0x20, 0xBB, 0x08, 0x3E, 0x00, 0xD4, 0x86, 0xEE, 0xFD, 0xAF, 0xE9, + 0x1C, 0xCA, 0xD3, 0x46, 0xE4, 0xC0, 0x94, 0x60, 0x28, 0x41, 0xF9, 0x9E, + 0xC6, 0x09, 0x39, 0xB0, 0x22, 0x9D, 0x40, 0x76, 0x4B, 0xFE, 0x96, 0xF6, + 0x31, 0xE4, 0x3C, 0xAC, 0xC0, 0x07, 0x31, 0x48, 0x43, 0x1E, 0x5E, 0xB0, + 0xE4, 0xFC, 0x95, 0x41, 0x10, 0x82, 0xD0, 0x03, 0x1E, 0x06, 0x91, 0xB3, + 0x66, 0xF5, 0x72, 0x0E, 0xA4, 0xCD, 0xE4, 0x0F, 0x4A, 0xD7, 0x40, 0x9E, + 0xDE, 0xAD, 0x13, 0x36, 0x38, 0xE3, 0x62, 0x6D, 0x10, 0x87, 0x24, 0x72, + 0x22, 0xB4, 0xBC, 0x8A, 0xE5, 0x8F, 0xE1, 0x32, 0xE9, 0x06, 0xBD, 0x0F, + 0x4B, 0xA3, 0x29, 0x02, 0x07, 0xEA, 0x20, 0x43, 0x15, 0xA8, 0x20, 0x05, + 0x2A, 0x20, 0xC1, 0x09, 0xE0, 0x50, 0x83, 0x02, 0xC6, 0xE1, 0x07, 0x19, + 0x34, 0x9E, 0xF1, 0xA6, 0x6B, 0xC3, 0x56, 0xDB, 0xE0, 0x0E, 0xA7, 0x53, + 0xE0, 0x23, 0x0C, 0xDD, 0x87, 0x1E, 0x98, 0xF2, 0x86, 0x43, 0xA8, 0x41, + 0xC6, 0x00, 0xC1, 0x6B, 0x4D, 0x84, 0xA2, 0x1A, 0xAC, 0x4D, 0xF3, 0x58, + 0xDA, 0x49, 0x90, 0x4B, 0x2B, 0x24, 0x1F, 0x11, 0x46, 0xC1, 0x20, 0xEE, + 0xF7, 0x86, 0x16, 0x30, 0x60, 0x04, 0xFE, 0xF4, 0x01, 0x16, 0xAA, 0xF0, + 0x27, 0x2A, 0x00, 0xEA, 0x1F, 0x41, 0x60, 0xB5, 0x2F, 0xC0, 0xDC, 0x83, + 0xC8, 0x9E, 0xB8, 0x12, 0xCE, 0x44, 0x9D, 0x23, 0x6A, 0x50, 0x4A, 0x53, + 0x8A, 0xAB, 0xD4, 0x7F, 0x20, 0xD7, 0x0F, 0x88, 0xC0, 0x8D, 0xA1, 0xEC, + 0xE3, 0x1D, 0xC2, 0x4E, 0x09, 0x85, 0xD2, 0xE2, 0x0D, 0x09, 0xB4, 0x00, + 0x11, 0x6E, 0x28, 0xC3, 0x61, 0x47, 0x40, 0xE7, 0x12, 0x98, 0xC2, 0x17, + 0xB7, 0xD8, 0x05, 0x18, 0x6C, 0x61, 0x6D, 0x2A, 0x90, 0xD6, 0x17, 0x08, + 0x3F, 0x63, 0x0F, 0x6A, 0x00, 0x6B, 0x13, 0x17, 0xF7, 0x99, 0x8E, 0xF8, + 0x81, 0xA2, 0xEB, 0x18, 0xC1, 0x1E, 0x48, 0xD0, 0x04, 0x80, 0x48, 0x05, + 0x2D, 0xB4, 0xEB, 0x92, 0x7D, 0xC8, 0x03, 0x1E, 0xA5, 0x90, 0x47, 0x78, + 0xFE, 0x87, 0xF4, 0x8E, 0x5A, 0xE8, 0x02, 0x71, 0xF1, 0x1E, 0x89, 0xBC, + 0x68, 0x21, 0x02, 0x35, 0xEC, 0xC1, 0x0C, 0xF8, 0x3B, 0x01, 0x09, 0x5A, + 0x90, 0x06, 0x2B, 0x20, 0x3C, 0xC3, 0x60, 0xF0, 0x45, 0x86, 0x33, 0x8C, + 0xF0, 0x9E, 0xF7, 0x82, 0x0A, 0x35, 0x68, 0x95, 0x89, 0x19, 0xD1, 0x88, + 0xD2, 0xA9, 0xD8, 0x0F, 0xE0, 0xBA, 0xF5, 0xAD, 0xC1, 0x90, 0x83, 0x1F, + 0x1C, 0xE3, 0x18, 0x74, 0x88, 0x45, 0x5E, 0x5D, 0xD2, 0x0F, 0x5A, 0x8C, + 0x82, 0x08, 0x44, 0x88, 0x00, 0x26, 0xFA, 0x52, 0xF2, 0x5A, 0xBC, 0xA2, + 0x14, 0xA3, 0xB0, 0x02, 0x11, 0xAC, 0xE0, 0x0A, 0x6F, 0x88, 0x3C, 0x34, + 0x95, 0xBE, 0x4D, 0x5A, 0x3C, 0xD1, 0x80, 0x3C, 0x10, 0xE2, 0x10, 0xF0, + 0x5D, 0x41, 0x0A, 0xD2, 0x40, 0x87, 0x5D, 0xD8, 0x7D, 0x17, 0xC0, 0xE8, + 0x39, 0xCF, 0x73, 0xDE, 0xF3, 0x2C, 0xD8, 0x80, 0x55, 0xF5, 0x65, 0x58, + 0x71, 0x49, 0x57, 0x34, 0x36, 0xF4, 0x00, 0x9B, 0xAD, 0xF6, 0xBB, 0x4E, + 0x9D, 0xE1, 0x34, 0x4D, 0xCC, 0x21, 0x1B, 0xFA, 0xF0, 0x60, 0x48, 0x32, + 0xE3, 0x0D, 0x21, 0xE8, 0xE0, 0x06, 0x37, 0xD8, 0x01, 0x11, 0x6E, 0x20, + 0x84, 0x77, 0x7C, 0x63, 0x14, 0x9E, 0xB0, 0x42, 0x10, 0x72, 0xB0, 0x83, + 0x1E, 0xEC, 0x00, 0x07, 0x37, 0xE8, 0x41, 0x29, 0xC0, 0x91, 0x72, 0x99, + 0xC0, 0x03, 0x08, 0x27, 0x38, 0xC4, 0x21, 0x04, 0x21, 0x06, 0x15, 0x94, + 0x21, 0x0C, 0x31, 0xB0, 0xC5, 0xDD, 0x79, 0x9E, 0xF7, 0x9E, 0xFB, 0x9E, + 0xE9, 0x70, 0x00, 0x3C, 0x1F, 0x16, 0x21, 0x37, 0x57, 0x51, 0xD6, 0x0F, + 0x77, 0xA8, 0x81, 0x11, 0x2C, 0xFE, 0x8F, 0x1F, 0xE8, 0xBA, 0x69, 0x8C, + 0x77, 0x46, 0x27, 0x74, 0xB5, 0x0D, 0x64, 0xAB, 0x04, 0x1F, 0xA3, 0xA8, + 0x40, 0x05, 0x6E, 0xFE, 0x80, 0x03, 0x23, 0x78, 0xC2, 0x13, 0x98, 0x2F, + 0xBD, 0x10, 0x84, 0x30, 0x0A, 0x52, 0x80, 0xBE, 0x09, 0x56, 0x20, 0x7F, + 0x10, 0x46, 0x41, 0x0D, 0xC9, 0xB7, 0x9E, 0x24, 0xF4, 0x9E, 0x41, 0x1A, + 0x10, 0x81, 0xEF, 0x16, 0x98, 0xE1, 0x05, 0x27, 0xD8, 0xC1, 0xEE, 0x75, + 0xEF, 0xFB, 0xFE, 0xEF, 0x82, 0x0A, 0x36, 0xC0, 0x3C, 0xC6, 0x33, 0x7C, + 0x93, 0xC0, 0x08, 0x05, 0x48, 0x74, 0x8D, 0xD0, 0x07, 0xAC, 0x72, 0x07, + 0x65, 0xE5, 0x07, 0x11, 0x25, 0x4E, 0xCE, 0xF0, 0x0C, 0x80, 0x40, 0x07, + 0xD1, 0x20, 0x0F, 0x1C, 0x37, 0x79, 0xFA, 0x20, 0x0D, 0x39, 0xF0, 0x00, + 0x0F, 0x20, 0x01, 0x37, 0x30, 0x7A, 0x98, 0x77, 0x03, 0x19, 0x40, 0x04, + 0xAF, 0xE0, 0x0A, 0xAF, 0xA0, 0x0B, 0xBF, 0xA0, 0x0B, 0xB4, 0x40, 0x0B, + 0xBF, 0xF0, 0x0B, 0xD5, 0x70, 0x75, 0xAE, 0x30, 0x75, 0xEF, 0xC7, 0x12, + 0xA2, 0x20, 0x02, 0x78, 0x10, 0x09, 0x84, 0x20, 0x06, 0x65, 0xA0, 0x83, + 0x36, 0x80, 0x05, 0xA6, 0x70, 0x77, 0xBA, 0x07, 0x0C, 0x19, 0x26, 0x84, + 0xBE, 0xD7, 0x5B, 0x0B, 0x87, 0x06, 0x68, 0xC0, 0x2A, 0x3C, 0xB3, 0x08, + 0x77, 0x30, 0x2A, 0x95, 0x40, 0x5C, 0x29, 0x76, 0x62, 0x12, 0x73, 0x31, + 0xCD, 0x50, 0x85, 0xCE, 0x70, 0x85, 0xFF, 0x20, 0x04, 0xD1, 0xA0, 0x4E, + 0x27, 0x91, 0x7D, 0x98, 0x17, 0x01, 0x0F, 0xC0, 0x7D, 0x15, 0x80, 0x03, + 0x44, 0xE0, 0x09, 0xB4, 0xF0, 0x0D, 0x2D, 0xB8, 0x82, 0xBA, 0xF0, 0x0A, + 0xAF, 0xF0, 0x0B, 0x6D, 0xF8, 0x0B, 0xA6, 0x50, 0x7E, 0xE0, 0x90, 0x76, + 0x33, 0xC8, 0x10, 0xFD, 0x10, 0x04, 0x2B, 0x10, 0x09, 0x91, 0x80, 0x06, + 0x2B, 0xD0, 0x02, 0x68, 0x50, 0x03, 0xA6, 0x10, 0x88, 0x42, 0xB8, 0x7B, + 0xFD, 0xE7, 0x0B, 0xC6, 0x90, 0x70, 0xFE, 0x54, 0x90, 0x03, 0x6C, 0x10, + 0x7C, 0xCF, 0xE3, 0x2A, 0x71, 0x63, 0x5F, 0x4F, 0x38, 0x09, 0x6C, 0x74, + 0x68, 0x9D, 0x50, 0x85, 0xCD, 0xD0, 0x09, 0x9F, 0x50, 0x05, 0x9E, 0x10, + 0x0B, 0x67, 0x57, 0x12, 0xF9, 0x10, 0x04, 0x11, 0xE0, 0x09, 0x40, 0x20, + 0x01, 0x0F, 0x10, 0x01, 0x15, 0x90, 0x03, 0x44, 0x20, 0x0A, 0xB4, 0x00, + 0x0D, 0xD2, 0x50, 0x0D, 0xD5, 0xF0, 0x0D, 0xD4, 0x50, 0x0D, 0x2E, 0xF8, + 0x0B, 0x2B, 0x48, 0x8B, 0xA4, 0x60, 0x05, 0xA4, 0xF0, 0x0B, 0x17, 0xD8, + 0x1F, 0x74, 0x48, 0x15, 0xB3, 0xA0, 0x03, 0x61, 0x20, 0x09, 0x7A, 0xB0, + 0x02, 0x2C, 0x00, 0x03, 0x3D, 0xC0, 0x5B, 0xBB, 0xB7, 0x7B, 0x79, 0x07, + 0x0C, 0xBD, 0xE7, 0x7B, 0x80, 0x62, 0x04, 0x6F, 0x70, 0x08, 0x22, 0x56, + 0x5F, 0x8A, 0x40, 0x09, 0x6F, 0xC0, 0x07, 0x4F, 0x38, 0x59, 0x75, 0x23, + 0x6B, 0x3C, 0x75, 0x89, 0xCF, 0xC0, 0x09, 0x54, 0xC0, 0x05, 0x54, 0xE0, + 0x09, 0x92, 0x56, 0x12, 0xBF, 0x20, 0x01, 0xB8, 0xA3, 0x03, 0x61, 0x58, + 0x01, 0x44, 0x00, 0x0B, 0xAE, 0xB0, 0x82, 0xD2, 0x10, 0x8B, 0xB2, 0xF8, + 0x0D, 0xD7, 0x80, 0x0D, 0xD8, 0xD0, 0x82, 0xBA, 0x50, 0x0D, 0xB8, 0x20, + 0x0A, 0xDF, 0x57, 0x0A, 0xE4, 0x50, 0x87, 0xD7, 0x37, 0x0A, 0x25, 0x50, + 0x08, 0x88, 0x50, 0x39, 0xFF, 0xA0, 0x0B, 0xC9, 0x88, 0x77, 0x77, 0x87, + 0x70, 0xBD, 0xD7, 0x8C, 0x08, 0x97, 0x05, 0x4C, 0x90, 0x03, 0x37, 0x73, + 0x08, 0x7C, 0xA0, 0x2F, 0xAE, 0xB2, 0x06, 0x07, 0x58, 0x80, 0xCE, 0xF4, + 0x59, 0x95, 0xE8, 0x56, 0x97, 0x08, 0x68, 0x38, 0x64, 0x05, 0xFD, 0xC0, + 0x85, 0x22, 0xF1, 0x0E, 0x15, 0x10, 0x01, 0x44, 0x10, 0x04, 0xA8, 0x67, + 0x04, 0x9F, 0x00, 0x0D, 0xD3, 0x90, 0x0C, 0xB2, 0x90, 0xFE, 0x8F, 0xD5, + 0x90, 0x8F, 0xD4, 0x70, 0x0D, 0x2E, 0x88, 0x0D, 0x68, 0xE8, 0x0A, 0xA5, + 0xC0, 0x86, 0xA5, 0x60, 0x05, 0xA3, 0x00, 0x0D, 0xBD, 0x08, 0x90, 0x06, + 0x01, 0x0F, 0x41, 0x10, 0x58, 0x63, 0x50, 0x03, 0xB6, 0xE0, 0x0B, 0xCC, + 0xC8, 0x8C, 0xB6, 0xA0, 0x0B, 0x3A, 0xB7, 0x0B, 0x49, 0xC9, 0x7B, 0x0C, + 0x79, 0x88, 0x88, 0xD8, 0x03, 0xD7, 0x98, 0x08, 0xAD, 0xF2, 0x2A, 0x6F, + 0xC0, 0x08, 0x94, 0x40, 0x2A, 0x95, 0xF0, 0x95, 0xB3, 0xD6, 0x8D, 0xC7, + 0xE0, 0x34, 0x80, 0x20, 0x2B, 0x68, 0x64, 0x05, 0xED, 0x40, 0x92, 0x92, + 0xA1, 0x0F, 0xFF, 0x10, 0x86, 0x3A, 0x10, 0x04, 0x43, 0xF0, 0x25, 0xD0, + 0x00, 0x0D, 0xB4, 0x20, 0x0B, 0xAB, 0x58, 0x0D, 0xD0, 0xE0, 0x82, 0xD6, + 0x60, 0x93, 0xBF, 0xE0, 0x0D, 0xB4, 0xB0, 0x86, 0x27, 0xF8, 0x75, 0x61, + 0xF7, 0x0A, 0xF0, 0x26, 0x94, 0x26, 0xE1, 0x0A, 0x26, 0x50, 0x06, 0x67, + 0xF0, 0x0F, 0xCB, 0xC8, 0x8C, 0x4A, 0x99, 0x61, 0x08, 0xB9, 0x90, 0x3D, + 0x77, 0x88, 0x7C, 0xD7, 0x73, 0x55, 0xF0, 0x0F, 0x6C, 0x90, 0x08, 0x8F, + 0xC5, 0x07, 0x94, 0x90, 0x08, 0x77, 0x30, 0x09, 0xA4, 0xC2, 0x30, 0x95, + 0xC0, 0x53, 0xA4, 0x39, 0x31, 0xE4, 0x92, 0x03, 0x67, 0xC4, 0x05, 0x56, + 0x80, 0x0F, 0xC6, 0x16, 0x12, 0xFB, 0x30, 0x07, 0x37, 0x90, 0x03, 0xDE, + 0xC7, 0x0A, 0xA8, 0xD0, 0x0A, 0xB0, 0x20, 0x0B, 0xB0, 0x30, 0x0B, 0xBA, + 0x60, 0x0D, 0xBC, 0xD9, 0x8A, 0xD4, 0xC0, 0x0D, 0xF9, 0x98, 0x8F, 0x96, + 0x82, 0x86, 0x3C, 0x39, 0x0A, 0x31, 0x68, 0x98, 0x25, 0xC1, 0x0F, 0x43, + 0x30, 0x02, 0x56, 0x80, 0x77, 0x4B, 0xA9, 0x90, 0x51, 0x19, 0x84, 0xBE, + 0x60, 0x0B, 0x41, 0x50, 0x04, 0x45, 0x40, 0x04, 0x73, 0xE0, 0x7C, 0x35, + 0xFE, 0x20, 0x34, 0x8D, 0x66, 0x03, 0x26, 0x00, 0x07, 0x8C, 0x90, 0x08, + 0xAE, 0x32, 0x09, 0x3C, 0x03, 0x9A, 0x79, 0x20, 0x9A, 0xA3, 0xD9, 0x8D, + 0x4B, 0xB3, 0x03, 0x55, 0xA0, 0x68, 0x59, 0x30, 0x0A, 0x69, 0xE9, 0x7E, + 0x17, 0xF1, 0x6E, 0xA3, 0x90, 0x03, 0x43, 0x20, 0x0B, 0xC8, 0xF0, 0x25, + 0xAB, 0x30, 0x0B, 0x75, 0x39, 0x0B, 0xC9, 0x00, 0x0D, 0xB1, 0x28, 0x0D, + 0xD2, 0xB0, 0x97, 0x28, 0xA8, 0x0B, 0xD7, 0x70, 0x0D, 0xDE, 0xC0, 0x0D, + 0xD7, 0x40, 0x0B, 0xC5, 0xF9, 0x0B, 0xF2, 0xF9, 0x10, 0x1D, 0x55, 0x6C, + 0xEF, 0x37, 0x19, 0xD6, 0xA0, 0x03, 0xFF, 0xE0, 0x9C, 0xCC, 0xE8, 0x9C, + 0x78, 0x17, 0x99, 0x4A, 0x69, 0x0B, 0x69, 0x80, 0x84, 0x69, 0xF0, 0xA1, + 0x62, 0x30, 0x06, 0x63, 0x90, 0x06, 0x2C, 0xF0, 0xA1, 0x6B, 0xA0, 0x07, + 0xF9, 0x92, 0x08, 0x7A, 0xA0, 0x08, 0x87, 0x40, 0x2D, 0xE1, 0x29, 0x59, + 0xA3, 0xF9, 0x08, 0xBC, 0x16, 0x28, 0xE5, 0x66, 0x4A, 0x59, 0x40, 0x04, + 0xDD, 0xD0, 0x9A, 0x1F, 0xD1, 0x0F, 0x56, 0xE0, 0x03, 0x51, 0x17, 0x0A, + 0xFA, 0x39, 0x0B, 0xB0, 0xE0, 0x8E, 0xAE, 0xA0, 0x82, 0xF1, 0x98, 0x82, + 0xBF, 0xC0, 0x0D, 0x2D, 0xE8, 0x8A, 0xD8, 0xC0, 0x0D, 0xDE, 0xF0, 0x0D, + 0x6B, 0xC8, 0xA0, 0xA3, 0x20, 0x0D, 0x0F, 0xFA, 0x54, 0x02, 0x41, 0x45, + 0x59, 0x5A, 0x10, 0x17, 0x52, 0x27, 0x5A, 0x9A, 0x66, 0xFB, 0xB0, 0x0A, + 0x47, 0x60, 0x0B, 0x8E, 0xE9, 0x98, 0xBA, 0x10, 0x95, 0x50, 0x99, 0x61, + 0x9E, 0x90, 0x06, 0x7B, 0x80, 0x06, 0x84, 0xA0, 0x07, 0x83, 0xF0, 0x36, + 0x87, 0xF0, 0x06, 0x9D, 0x13, 0x09, 0xF5, 0xA4, 0x99, 0x86, 0x80, 0x08, + 0x86, 0x40, 0x09, 0x3E, 0x53, 0x80, 0xA0, 0xF3, 0x95, 0x8D, 0x20, 0x07, + 0x4C, 0x40, 0x5A, 0xFE, 0x13, 0x07, 0x66, 0x60, 0x80, 0x09, 0xDE, 0x20, + 0x1A, 0xD2, 0xB0, 0x03, 0x43, 0x10, 0x0A, 0xA1, 0xE0, 0x09, 0x8F, 0xBA, + 0x0A, 0xB1, 0x20, 0x0B, 0xA2, 0x20, 0x0B, 0xB3, 0x60, 0x97, 0xD0, 0x50, + 0x0D, 0xD6, 0xC0, 0x82, 0x07, 0xDA, 0xA4, 0xD5, 0x80, 0x0D, 0x96, 0x72, + 0x8F, 0x3B, 0xF9, 0x0A, 0x45, 0xE0, 0x0A, 0x51, 0xC2, 0x29, 0x5D, 0xAA, + 0xA5, 0x52, 0xE4, 0x60, 0x58, 0x9A, 0x0F, 0x5F, 0xBA, 0x51, 0xC7, 0xD2, + 0x03, 0xCC, 0x88, 0x0D, 0xC5, 0xE0, 0x98, 0x1A, 0x7A, 0x77, 0x46, 0x20, + 0x03, 0x2C, 0xA0, 0x02, 0x68, 0x80, 0x08, 0x7A, 0x58, 0x4F, 0x2F, 0xEA, + 0x4B, 0x86, 0xC0, 0x39, 0x89, 0x80, 0x08, 0x8A, 0xF0, 0x06, 0x93, 0x40, + 0x09, 0x7C, 0x10, 0x09, 0x06, 0x88, 0x8D, 0x77, 0x10, 0x8E, 0x4A, 0x17, + 0xAD, 0x75, 0xC4, 0x05, 0xA0, 0x70, 0x0D, 0x21, 0x21, 0x0F, 0xA5, 0x30, + 0x04, 0x2C, 0xE9, 0x09, 0x63, 0xE2, 0x25, 0x9F, 0x10, 0x0B, 0xB0, 0x70, + 0x0A, 0xD0, 0xC0, 0x9F, 0x2E, 0x49, 0x0D, 0xD9, 0x20, 0x0D, 0xBF, 0x40, + 0xA0, 0xBF, 0x80, 0x0D, 0xD6, 0x00, 0xA5, 0x51, 0xFA, 0x0D, 0xA5, 0x50, + 0x0A, 0xAA, 0xE0, 0x93, 0x32, 0x78, 0x6C, 0x91, 0x77, 0xAF, 0xAB, 0x4A, + 0x45, 0xAE, 0x1A, 0x79, 0xFB, 0xEA, 0xAA, 0xFA, 0x7A, 0xAF, 0x60, 0x2A, + 0x0B, 0x47, 0x40, 0x05, 0x50, 0x19, 0x84, 0xB6, 0x40, 0xA6, 0x76, 0x67, + 0x0B, 0x12, 0xC4, 0x00, 0x0B, 0xF0, 0xA1, 0x2C, 0x20, 0x08, 0x88, 0x00, + 0x77, 0x68, 0x30, 0x3D, 0xC6, 0x93, 0x08, 0x87, 0xA0, 0xA7, 0xC5, 0xAA, + 0x36, 0x94, 0x60, 0x08, 0x76, 0x20, 0x9E, 0x8A, 0xD0, 0x07, 0x71, 0x00, + 0x50, 0xD2, 0x2A, 0xAD, 0xA6, 0x00, 0x0A, 0xDC, 0x70, 0xA5, 0x11, 0xF1, + 0x0E, 0x9E, 0xD0, 0xA8, 0xCC, 0xF0, 0xFE, 0x09, 0x98, 0xE0, 0x09, 0x65, + 0x28, 0xA4, 0xAB, 0x70, 0x0A, 0xAE, 0x60, 0xA9, 0xAB, 0xA8, 0x0B, 0x00, + 0xDA, 0x8A, 0xD6, 0xF0, 0x0D, 0x33, 0x99, 0x8F, 0xF6, 0x88, 0x93, 0xDF, + 0x50, 0x0B, 0x26, 0x18, 0x7A, 0xD8, 0xB0, 0xA5, 0x00, 0xFB, 0xAF, 0xFC, + 0xCA, 0xAF, 0xFE, 0xBA, 0xB4, 0xFE, 0x3A, 0x0F, 0x4C, 0xFB, 0xB4, 0xFA, + 0xEA, 0x4E, 0xFB, 0xBA, 0x4E, 0x45, 0x20, 0x01, 0x7F, 0x70, 0x09, 0x35, + 0x50, 0x03, 0x97, 0x10, 0x03, 0x40, 0x20, 0x0C, 0x4B, 0x89, 0x05, 0xFF, + 0x60, 0x02, 0x28, 0x90, 0x33, 0x62, 0xA0, 0x07, 0x05, 0x83, 0x07, 0xBE, + 0x34, 0x58, 0x7A, 0x90, 0x07, 0x87, 0x30, 0x08, 0x82, 0x60, 0x08, 0x7B, + 0x20, 0x8D, 0x91, 0x80, 0x33, 0xD2, 0xA8, 0x08, 0xA0, 0xC9, 0x08, 0xA3, + 0x35, 0xB2, 0xD1, 0x4A, 0x05, 0xAC, 0x90, 0xA8, 0x1E, 0x01, 0x0F, 0x45, + 0x60, 0x04, 0xA1, 0xC0, 0x0A, 0x61, 0x12, 0x0A, 0x43, 0x40, 0x04, 0xA1, + 0x40, 0x04, 0x9F, 0x80, 0x0A, 0xA7, 0x70, 0x9B, 0xBA, 0xB0, 0x0C, 0xD3, + 0xC0, 0x8A, 0xD5, 0x30, 0x0D, 0xD5, 0x70, 0x0D, 0xD6, 0xD0, 0xB3, 0x7D, + 0x09, 0xAA, 0xBC, 0xF9, 0x0A, 0xB6, 0xF0, 0x0A, 0xA4, 0x40, 0x04, 0xAC, + 0xF7, 0xAA, 0x47, 0xCB, 0xB4, 0xF3, 0xE0, 0xB4, 0xA5, 0x7B, 0xBA, 0xA8, + 0x9B, 0xBA, 0xAA, 0x9B, 0x0F, 0x4E, 0xBB, 0xB4, 0xF8, 0xBA, 0x51, 0xDD, + 0x20, 0x01, 0x6A, 0x90, 0x83, 0x6E, 0x20, 0x06, 0x69, 0x90, 0x02, 0xFF, + 0x96, 0xA1, 0xA6, 0x60, 0x02, 0x69, 0x30, 0x08, 0x65, 0x90, 0x06, 0x6A, + 0xB0, 0x67, 0x83, 0x80, 0xB6, 0x75, 0xA0, 0x06, 0xBE, 0xA4, 0x07, 0x7B, + 0xD0, 0x39, 0x87, 0xA0, 0x36, 0x04, 0xF9, 0x58, 0xCA, 0x72, 0x08, 0x89, + 0x50, 0x2A, 0x8A, 0x50, 0x04, 0x81, 0xA6, 0xB7, 0x37, 0xFE, 0x24, 0x04, + 0xAD, 0xF0, 0x8F, 0x1D, 0xD1, 0x0F, 0x3B, 0x90, 0x03, 0x9E, 0xC0, 0x0A, + 0xAC, 0x30, 0x07, 0xDF, 0x57, 0x04, 0x73, 0x30, 0x04, 0x43, 0xE0, 0x09, + 0xA7, 0xC0, 0x0A, 0x45, 0x1A, 0x93, 0xD2, 0xC0, 0x8A, 0xF2, 0xC8, 0x9B, + 0x29, 0xA8, 0x0B, 0xBA, 0x00, 0xAA, 0x96, 0x52, 0x0D, 0xB4, 0x50, 0x0A, + 0xF7, 0x5B, 0x04, 0xB4, 0x90, 0xA5, 0x51, 0xBB, 0xB4, 0xAA, 0x1B, 0x0F, + 0xA5, 0x1B, 0x0F, 0x00, 0x2C, 0xC0, 0xF3, 0x20, 0xC0, 0x04, 0x6C, 0xC0, + 0xAB, 0xEB, 0xAA, 0xAD, 0xEB, 0xAF, 0x4A, 0x0B, 0xB0, 0xC5, 0x92, 0x16, + 0xA8, 0xC0, 0x00, 0x87, 0x50, 0x07, 0x65, 0xD0, 0x02, 0x2E, 0xA0, 0x02, + 0x44, 0xF0, 0x9C, 0xB6, 0x30, 0x02, 0xF8, 0xA2, 0x83, 0x63, 0x50, 0xB6, + 0x84, 0xA0, 0x06, 0x87, 0x50, 0x08, 0x85, 0x80, 0x07, 0x88, 0xF0, 0x76, + 0x17, 0x6B, 0xB1, 0x39, 0xF3, 0x39, 0x3B, 0x83, 0x2D, 0x86, 0x50, 0x80, + 0xB0, 0xF2, 0x07, 0xAC, 0x66, 0xBD, 0x69, 0x44, 0x98, 0x1D, 0x61, 0x0D, + 0x3B, 0xB0, 0x03, 0xA1, 0x20, 0x0B, 0xB1, 0x80, 0x0A, 0xA0, 0x40, 0xBE, + 0x46, 0xD5, 0x25, 0x8B, 0x2B, 0xA9, 0xCB, 0x80, 0xB3, 0x99, 0xDA, 0x8A, + 0x94, 0x7B, 0xB9, 0xD5, 0xD0, 0x8A, 0x32, 0x89, 0xAE, 0x29, 0xB8, 0x93, + 0xAE, 0x50, 0x04, 0x0E, 0xAA, 0xB4, 0xAC, 0x9B, 0xBA, 0x03, 0x5C, 0xC0, + 0x02, 0x6C, 0x0E, 0x06, 0x6C, 0x0E, 0x5C, 0x1C, 0x0F, 0x5C, 0xDC, 0xC5, + 0x06, 0x1C, 0xC6, 0x01, 0x5C, 0xBA, 0x4C, 0x7B, 0xB4, 0x46, 0x3B, 0x2F, + 0x39, 0xC0, 0x02, 0x92, 0x50, 0x07, 0x2C, 0x30, 0x02, 0x1F, 0x50, 0x02, + 0x64, 0xCA, 0x8C, 0x57, 0x00, 0x02, 0x61, 0xE0, 0x06, 0x30, 0x87, 0x06, + 0x6E, 0xA0, 0x67, 0x67, 0xA0, 0x06, 0x20, 0x56, 0x07, 0x84, 0x80, 0x08, + 0xFE, 0x83, 0x00, 0xBD, 0x91, 0x20, 0x09, 0x7B, 0x50, 0x07, 0x85, 0x30, + 0x09, 0x91, 0xD0, 0x2C, 0x92, 0x80, 0x2D, 0x5E, 0x99, 0x80, 0x34, 0x76, + 0xA3, 0xD1, 0x9A, 0x46, 0x1B, 0xA7, 0x11, 0x69, 0x51, 0x0D, 0x40, 0x60, + 0x04, 0xAC, 0x30, 0xA9, 0x3C, 0xFC, 0x09, 0x73, 0x30, 0x07, 0xDE, 0xC7, + 0xAD, 0xA0, 0x10, 0x0A, 0x9A, 0xFC, 0xB8, 0x2E, 0x99, 0xA9, 0xAE, 0xE8, + 0x8A, 0xDF, 0x60, 0x0D, 0xD8, 0xA0, 0xA9, 0x07, 0xFA, 0x0D, 0xAE, 0xFC, + 0x75, 0xAF, 0x40, 0x7E, 0xC2, 0x62, 0xC5, 0x61, 0xFC, 0xC5, 0xB6, 0x6C, + 0x0E, 0xE5, 0x50, 0x0E, 0xB8, 0x8C, 0xCB, 0xB9, 0xCC, 0xC5, 0xBA, 0xAC, + 0xCB, 0x5F, 0xEC, 0xC5, 0x08, 0x0C, 0xC0, 0xA7, 0xCB, 0xC0, 0xFD, 0xEA, + 0xC0, 0x28, 0x2B, 0x23, 0xEA, 0xC0, 0x01, 0x06, 0x53, 0x06, 0x24, 0x40, + 0x02, 0x2A, 0x00, 0x03, 0xA6, 0xE0, 0xB5, 0xB6, 0x40, 0x02, 0x61, 0xE0, + 0x76, 0x4B, 0xA6, 0x67, 0x70, 0x50, 0x07, 0x9C, 0xA6, 0x07, 0xDC, 0xFC, + 0xA6, 0x82, 0x20, 0x7B, 0x73, 0x0B, 0x77, 0x91, 0x40, 0x09, 0x84, 0xAC, + 0x87, 0xCE, 0x4B, 0x09, 0xE0, 0xC6, 0x3A, 0x74, 0x60, 0x70, 0x85, 0x6A, + 0x4A, 0x4C, 0x60, 0x04, 0xFD, 0xC0, 0xA3, 0x16, 0x21, 0x0F, 0x58, 0xB7, + 0xB8, 0xB2, 0xC0, 0xC3, 0xAC, 0xF0, 0x7D, 0x73, 0x50, 0x86, 0x9F, 0xF0, + 0xCF, 0xAC, 0x20, 0xA9, 0x31, 0x69, 0xC4, 0x99, 0x0A, 0x0D, 0x28, 0xC8, + 0x9B, 0xAA, 0x8C, 0xA0, 0x08, 0x6A, 0x29, 0x6E, 0x58, 0x0A, 0xA4, 0xD0, + 0x03, 0x56, 0x80, 0x0E, 0x01, 0xBC, 0xC5, 0xB6, 0x9C, 0xCB, 0x16, 0x7D, + 0xD1, 0xE2, 0x20, 0x0E, 0xE5, 0xA0, 0xD1, 0xB9, 0xAC, 0xD1, 0x1E, 0xDD, + 0xCB, 0xC0, 0x1C, 0xCC, 0x04, 0x8C, 0xBA, 0xAE, 0x2B, 0xB5, 0x4F, 0x92, + 0x16, 0x73, 0xE0, 0xFE, 0x01, 0x91, 0x80, 0x07, 0x24, 0x30, 0x02, 0x2E, + 0xD0, 0x02, 0x80, 0xE8, 0x0B, 0xA3, 0xA0, 0x3C, 0x4F, 0x46, 0xA2, 0x61, + 0x80, 0x07, 0x9C, 0x53, 0x08, 0xDC, 0x6C, 0x06, 0x66, 0x50, 0x07, 0x7B, + 0xA0, 0x67, 0x84, 0xB0, 0x07, 0xCB, 0xB6, 0x07, 0x71, 0x1B, 0x09, 0x70, + 0xA7, 0x99, 0xE5, 0xAC, 0xCE, 0x5F, 0x09, 0x08, 0x8D, 0x60, 0x57, 0x66, + 0x29, 0xAD, 0x23, 0x48, 0x1A, 0xC9, 0xAC, 0x10, 0xB5, 0x70, 0x03, 0x43, + 0xA0, 0x2E, 0xCC, 0x10, 0x0B, 0x92, 0x0A, 0x0A, 0x9E, 0x3C, 0x04, 0x98, + 0x80, 0x09, 0x9F, 0x30, 0x0A, 0x92, 0xAA, 0xC9, 0x73, 0x69, 0xD0, 0xD5, + 0x50, 0x82, 0xAD, 0xC8, 0xCA, 0xD8, 0x80, 0xA0, 0x6B, 0x8D, 0x86, 0xB4, + 0x40, 0x0A, 0xA5, 0x50, 0x04, 0x42, 0x80, 0x0E, 0x5E, 0xFC, 0xC5, 0x18, + 0xED, 0xD1, 0x19, 0x9D, 0xD1, 0xE1, 0x90, 0xD7, 0x7A, 0xBD, 0xD7, 0x7B, + 0xCD, 0xD7, 0x79, 0x6D, 0xD1, 0xE6, 0x70, 0x0E, 0x22, 0x4D, 0xCC, 0x64, + 0xEC, 0xBA, 0x5C, 0x8A, 0x24, 0xD4, 0xA0, 0x00, 0xC6, 0xBB, 0x02, 0x24, + 0x90, 0x02, 0x61, 0x90, 0x06, 0x71, 0xB0, 0x0B, 0xA1, 0xC0, 0x02, 0x62, + 0x90, 0x07, 0x6D, 0x80, 0x06, 0x15, 0xCC, 0x3F, 0x67, 0x60, 0x4F, 0xDC, + 0x7C, 0x06, 0x75, 0x60, 0xC7, 0x82, 0x90, 0xBC, 0x55, 0x95, 0x07, 0x6F, + 0x60, 0x30, 0x11, 0x3B, 0xB7, 0x5C, 0xF9, 0x95, 0x60, 0xF9, 0x5C, 0x3E, + 0x00, 0xC9, 0x60, 0x56, 0x01, 0x9E, 0xA0, 0x54, 0xDC, 0x90, 0xC3, 0x98, + 0x80, 0x0A, 0xCB, 0xC0, 0x0C, 0xB2, 0xC0, 0x0C, 0x60, 0xA2, 0xAD, 0x8A, + 0xEB, 0x25, 0x56, 0x33, 0xA9, 0xBA, 0xB0, 0x2E, 0x65, 0x4D, 0x97, 0xB5, + 0x60, 0x0D, 0xE9, 0x7A, 0xA0, 0xDE, 0xE0, 0x0D, 0x6B, 0x3D, 0x93, 0x29, + 0xE8, 0x09, 0xA5, 0xD0, 0x03, 0x42, 0xFE, 0x80, 0x0D, 0xBC, 0x6C, 0xD1, + 0x7C, 0x1D, 0x0E, 0x7E, 0x8D, 0xDD, 0xDA, 0xBD, 0xDD, 0xDC, 0x8D, 0xDD, + 0xC4, 0xF0, 0xD7, 0x81, 0x7D, 0xD1, 0x60, 0x3C, 0xD2, 0x4F, 0xEB, 0xC0, + 0x0E, 0xF2, 0x17, 0x41, 0x10, 0x02, 0x83, 0xA0, 0x5E, 0x2B, 0xE0, 0x02, + 0x66, 0xC0, 0x02, 0x1B, 0x64, 0xD9, 0x63, 0xD0, 0x02, 0x29, 0x70, 0x06, + 0x68, 0xDB, 0x06, 0x67, 0xE0, 0x06, 0x75, 0x70, 0x06, 0xA0, 0xCD, 0xCD, + 0xCD, 0xE3, 0x06, 0x6C, 0xFB, 0xA2, 0x31, 0x03, 0x07, 0x6D, 0x93, 0x08, + 0x73, 0x9B, 0xAC, 0x5D, 0x69, 0x62, 0x9B, 0xE0, 0x07, 0x8E, 0x60, 0x04, + 0xED, 0x29, 0xAD, 0xB6, 0x20, 0x04, 0x26, 0xF0, 0x09, 0x94, 0x9C, 0x0F, + 0xAE, 0x70, 0x3B, 0x73, 0x80, 0x0A, 0xCA, 0xB0, 0x0C, 0xB2, 0x00, 0xBE, + 0xA8, 0xF0, 0x09, 0xB7, 0xF3, 0x09, 0xDF, 0xB7, 0x0A, 0xAB, 0xC0, 0x0A, + 0xC8, 0x80, 0x0C, 0xFF, 0x49, 0x97, 0x73, 0xF9, 0x8E, 0xF9, 0xA8, 0xCA, + 0xBC, 0x89, 0x86, 0x6E, 0xC8, 0x82, 0x60, 0x47, 0x0A, 0x45, 0x20, 0xAB, + 0x79, 0xED, 0xD7, 0xE2, 0xD0, 0xDD, 0xDF, 0xED, 0xDD, 0xDF, 0xDD, 0xE3, + 0xDC, 0x4D, 0x0C, 0x3B, 0xAE, 0xDD, 0x39, 0x1E, 0xDE, 0x21, 0x8D, 0xC0, + 0x0B, 0x7C, 0xCC, 0x53, 0x2D, 0x13, 0x41, 0x19, 0x1C, 0xB4, 0xD0, 0x00, + 0x63, 0xB0, 0x02, 0x72, 0xB7, 0x3C, 0x65, 0xC0, 0x02, 0x81, 0xC0, 0x4F, + 0x2F, 0x40, 0x73, 0x68, 0xD0, 0x06, 0x7C, 0xEC, 0x02, 0x7C, 0x1C, 0x06, + 0xC6, 0x8B, 0x07, 0x75, 0xD0, 0x3C, 0x6B, 0xE0, 0x06, 0xCB, 0x86, 0x06, + 0xD8, 0xF5, 0x03, 0x68, 0xF0, 0x06, 0x68, 0xB0, 0x39, 0x6B, 0x9B, 0x2F, + 0x76, 0xAB, 0x40, 0xE6, 0x43, 0x05, 0x4B, 0x57, 0x47, 0xBA, 0xC0, 0x06, + 0x9A, 0xF0, 0x03, 0x11, 0x60, 0xAA, 0x19, 0x81, 0x0F, 0xFE, 0xEF, 0x20, + 0x0A, 0x70, 0xF9, 0x09, 0x26, 0xBE, 0x0C, 0xB1, 0xE0, 0xE1, 0x9F, 0x10, + 0x04, 0xBF, 0x2D, 0xB3, 0x93, 0x4A, 0xA4, 0x2E, 0x19, 0xB9, 0xB2, 0x30, + 0x0A, 0xF8, 0xBB, 0x9F, 0xB5, 0xE0, 0x82, 0xF3, 0x58, 0x82, 0xA2, 0x30, + 0x0A, 0x8E, 0xDE, 0x04, 0x3B, 0xC0, 0x0B, 0x39, 0xAE, 0xDD, 0x40, 0xDE, + 0xE9, 0x9E, 0xFE, 0xE9, 0x3D, 0x0E, 0xEA, 0xA1, 0xDE, 0xDD, 0x44, 0x5E, + 0xD8, 0xC5, 0x6C, 0xCC, 0xA2, 0xCB, 0x13, 0x4B, 0xDE, 0x1A, 0xA7, 0x9A, + 0x03, 0x23, 0x50, 0x06, 0xCA, 0x43, 0xDF, 0x66, 0x80, 0x06, 0x2C, 0x90, + 0xD9, 0x2A, 0x10, 0x06, 0x28, 0x10, 0x06, 0x68, 0x70, 0x09, 0x67, 0x80, + 0x06, 0x61, 0x70, 0x06, 0x6D, 0xF0, 0xC1, 0x61, 0xA0, 0xA2, 0x79, 0x4C, + 0x08, 0x36, 0x83, 0x06, 0xA8, 0xB9, 0x0B, 0x41, 0x10, 0x03, 0x05, 0x94, + 0x03, 0x3D, 0xA0, 0x03, 0x65, 0xB0, 0x2C, 0x8B, 0x40, 0x5C, 0x7E, 0x40, + 0x63, 0xEF, 0xAC, 0x09, 0x09, 0x26, 0x07, 0x3F, 0x30, 0x03, 0xD2, 0x90, + 0x11, 0x9B, 0x02, 0x0F, 0xA3, 0x70, 0xBE, 0x9B, 0x98, 0xDB, 0xF8, 0x49, + 0xB8, 0xA1, 0x90, 0x03, 0x39, 0x90, 0xE1, 0xA1, 0x90, 0xE1, 0xEA, 0x2B, + 0x0B, 0xCB, 0xB0, 0x0C, 0xD1, 0x60, 0xD0, 0x45, 0x5A, 0x0A, 0xAE, 0x30, + 0x29, 0x2D, 0x28, 0x0D, 0xA3, 0xBA, 0x86, 0xF2, 0x3B, 0x0A, 0x11, 0x8E, + 0x03, 0xA6, 0x10, 0x0E, 0xA1, 0x2E, 0xEA, 0x02, 0x3F, 0xF0, 0xA3, 0x1E, + 0xE4, 0xD8, 0x5D, 0xEA, 0x5A, 0x6C, 0xE4, 0x48, 0x9E, 0xEA, 0x25, 0x12, + 0x24, 0x69, 0x41, 0x0B, 0x0C, 0xF0, 0x02, 0x2B, 0x10, 0x06, 0x2D, 0x20, + 0x77, 0x28, 0xD0, 0x02, 0x97, 0x60, 0x06, 0x72, 0x97, 0x02, 0x29, 0x20, + 0x06, 0xB9, 0xD5, 0x06, 0x4B, 0x16, 0x06, 0xF3, 0xAD, 0x02, 0x2F, 0xC4, + 0xFE, 0x36, 0x04, 0xBE, 0x06, 0x65, 0xC3, 0x73, 0x58, 0x10, 0x2E, 0x54, + 0x80, 0x05, 0x35, 0xB0, 0x06, 0xE2, 0x39, 0x09, 0x7D, 0x50, 0x56, 0x7D, + 0xE0, 0xE0, 0x13, 0xE7, 0x0B, 0x7F, 0x40, 0x07, 0x9C, 0xA0, 0x09, 0x7F, + 0xE0, 0x4A, 0x23, 0xA9, 0x11, 0x3E, 0x3A, 0x04, 0x5E, 0x82, 0x0C, 0xEF, + 0x3E, 0xA9, 0xE0, 0xEB, 0xC9, 0x3A, 0xC0, 0xCF, 0xA2, 0x0C, 0xAE, 0x96, + 0x0A, 0x0D, 0xF0, 0xBE, 0x0C, 0xA2, 0xF0, 0x09, 0xA2, 0xA0, 0x0A, 0x33, + 0x69, 0x82, 0xA5, 0x20, 0xBF, 0xAF, 0xF0, 0xD6, 0x70, 0xFD, 0x0A, 0xDF, + 0x20, 0x04, 0x10, 0x80, 0x05, 0x00, 0x4F, 0xF0, 0x62, 0x2F, 0xF6, 0x00, + 0xCF, 0xDD, 0x7C, 0xDD, 0xCB, 0x09, 0x5F, 0xC0, 0xA7, 0xFE, 0x24, 0xF8, + 0x40, 0x3C, 0x2F, 0x10, 0xEC, 0x2D, 0xD0, 0x02, 0x23, 0x40, 0x02, 0xF9, + 0xB3, 0x02, 0x2A, 0x60, 0x06, 0x29, 0x70, 0xF1, 0x2F, 0xF0, 0xC1, 0xB7, + 0x77, 0x52, 0xF8, 0x53, 0x06, 0x4D, 0x46, 0xDF, 0x16, 0x6C, 0x73, 0xFD, + 0xD7, 0x0B, 0xBB, 0xC0, 0x02, 0x6C, 0xE3, 0x2A, 0x8C, 0x60, 0x09, 0x90, + 0xC0, 0x07, 0xB6, 0xA2, 0x74, 0xAF, 0x20, 0x07, 0x3B, 0xAF, 0x6E, 0x0F, + 0xE0, 0x0A, 0x15, 0xFE, 0x0D, 0x70, 0xE9, 0x09, 0xA8, 0xC0, 0x0C, 0xCA, + 0xC0, 0x0C, 0xC8, 0xA0, 0xCF, 0x20, 0x9E, 0x03, 0x45, 0xE0, 0xD5, 0x99, + 0x9C, 0xC9, 0x1D, 0xEE, 0x2B, 0xB1, 0x70, 0x0A, 0x9E, 0xA0, 0x8A, 0xBA, + 0x00, 0x0B, 0x56, 0x20, 0xF5, 0xAA, 0x5F, 0xE3, 0x3B, 0x10, 0x04, 0x4D, + 0x20, 0x0A, 0x9F, 0x7A, 0x42, 0xBB, 0x50, 0x0C, 0x63, 0xBF, 0xFB, 0xBB, + 0x2F, 0xE4, 0x19, 0x2D, 0xD8, 0x60, 0x7C, 0xEA, 0xC6, 0x7C, 0xC6, 0x35, + 0x52, 0x04, 0x22, 0x50, 0xB6, 0x6D, 0xB0, 0x02, 0x62, 0xB0, 0xF1, 0x4B, + 0x76, 0x02, 0x4B, 0xFE, 0x46, 0xDF, 0xA0, 0xE6, 0xFC, 0xFA, 0x66, 0xC7, + 0xBA, 0xF5, 0xA1, 0x25, 0x90, 0x01, 0x16, 0x27, 0x95, 0x3D, 0xF7, 0x03, + 0x69, 0xD0, 0x06, 0xA2, 0xB3, 0x30, 0x8C, 0x00, 0x53, 0x8E, 0x60, 0x96, + 0x67, 0x64, 0x0B, 0x80, 0x70, 0x0C, 0x80, 0xF0, 0x0C, 0x9A, 0x70, 0x0C, + 0x36, 0xA0, 0x03, 0x3F, 0x8F, 0x11, 0x7C, 0x9E, 0x03, 0x37, 0x00, 0x0A, + 0xDF, 0xFB, 0xEE, 0xEF, 0xDE, 0xE1, 0xA8, 0x10, 0x0A, 0xDA, 0x64, 0xE8, + 0x8A, 0xFB, 0xE1, 0x80, 0x1E, 0xD0, 0x00, 0x21, 0x2B, 0x56, 0xAB, 0x53, + 0xA2, 0x44, 0x8D, 0xB2, 0x82, 0x89, 0xC8, 0x8E, 0x20, 0x3D, 0x76, 0xE4, + 0xC0, 0x81, 0x03, 0xE2, 0xA8, 0x5F, 0x3A, 0xFE, 0xF1, 0x32, 0x46, 0x4C, + 0xE3, 0x46, 0x8E, 0x1D, 0x3D, 0x7E, 0x04, 0x49, 0x2C, 0xDC, 0x48, 0x92, + 0xE2, 0x4C, 0x96, 0x2B, 0x67, 0xCE, 0x5C, 0x3C, 0x96, 0xF3, 0x5C, 0xE6, + 0x83, 0xA9, 0x4F, 0x5F, 0x3E, 0x99, 0x33, 0x6B, 0xDE, 0xC4, 0x99, 0x53, + 0xE7, 0x4E, 0x9E, 0x3D, 0x7D, 0xFE, 0x04, 0x1A, 0x54, 0xE8, 0x50, 0xA2, + 0x45, 0x8D, 0x1E, 0x45, 0x9A, 0x74, 0x28, 0xCD, 0x51, 0x22, 0xD6, 0x14, + 0xC2, 0x23, 0xE6, 0x8C, 0x99, 0x16, 0x29, 0x5A, 0xB4, 0x78, 0xB1, 0x22, + 0xC5, 0x09, 0x15, 0x20, 0x40, 0x8C, 0xE8, 0x60, 0xD5, 0x4C, 0x9A, 0x15, + 0x25, 0x76, 0xF4, 0xA0, 0x42, 0x65, 0xD7, 0x2E, 0x5F, 0x6D, 0xDD, 0xFA, + 0xE2, 0x52, 0xE3, 0xCC, 0xA0, 0x3C, 0x79, 0xF8, 0x28, 0x5A, 0xB4, 0xC8, + 0xCF, 0x23, 0x2A, 0x60, 0x7A, 0xFD, 0x05, 0x23, 0x87, 0xD3, 0x31, 0x4E, + 0x9C, 0x52, 0x35, 0x93, 0x43, 0x00, 0x13, 0xBF, 0x7C, 0xFB, 0x94, 0xEA, + 0x93, 0x76, 0xE3, 0x41, 0x84, 0x39, 0x9F, 0x62, 0x2D, 0x93, 0xB5, 0x8C, + 0x99, 0x2C, 0x56, 0xAB, 0x30, 0xCD, 0xFE, 0x21, 0x12, 0x7A, 0x8E, 0xA7, + 0x55, 0xAC, 0x42, 0xAD, 0x3A, 0xDD, 0xF9, 0x13, 0x11, 0x85, 0xAC, 0x8B, + 0x58, 0xF1, 0x44, 0x44, 0x48, 0x85, 0x0A, 0x19, 0x70, 0x64, 0x80, 0xD0, + 0x63, 0x54, 0x06, 0x63, 0xC5, 0x42, 0xFE, 0x06, 0xFE, 0x9B, 0xE4, 0xC8, + 0x93, 0x28, 0x55, 0xB2, 0x8C, 0xF7, 0x12, 0x26, 0x4D, 0x9A, 0x8F, 0x9D, + 0x2B, 0x75, 0xFC, 0x5C, 0xFA, 0x74, 0xEA, 0xD5, 0xAD, 0x3B, 0x97, 0x26, + 0x01, 0x4F, 0x21, 0x3D, 0x67, 0xCE, 0x84, 0xD9, 0xBA, 0xB5, 0x85, 0x8A, + 0x15, 0x24, 0x48, 0x34, 0xE0, 0xC0, 0x81, 0x6B, 0x0A, 0x15, 0x24, 0x5E, + 0xB0, 0xA8, 0x91, 0xC3, 0x16, 0x5B, 0x5F, 0xF4, 0xDF, 0x62, 0xE9, 0xE1, + 0x62, 0x4D, 0x22, 0x41, 0x85, 0x14, 0x29, 0xAA, 0x64, 0x11, 0x48, 0x98, + 0xF0, 0xEB, 0x2F, 0x5B, 0x00, 0x29, 0x8C, 0xB0, 0xC2, 0xE4, 0xF8, 0xE1, + 0x01, 0x22, 0xE0, 0x51, 0x8A, 0xA6, 0x6A, 0x6E, 0x40, 0x80, 0x00, 0x23, + 0x3E, 0x09, 0x25, 0x16, 0x59, 0x94, 0x51, 0x06, 0x19, 0xCE, 0x56, 0xF1, + 0x64, 0x0E, 0x23, 0x86, 0x00, 0xED, 0x13, 0x54, 0x30, 0xFC, 0xC4, 0xC4, + 0xD8, 0x30, 0x19, 0xC5, 0x13, 0x2B, 0xAC, 0x10, 0xA2, 0x88, 0x1E, 0x82, + 0x08, 0x42, 0x08, 0x2B, 0x48, 0xF9, 0xC6, 0x14, 0x5B, 0x70, 0xB0, 0xE2, + 0x88, 0x5D, 0xC6, 0x09, 0x2E, 0x48, 0x21, 0x35, 0x0A, 0x47, 0x24, 0xE2, + 0x8A, 0x4B, 0xA9, 0x25, 0xE5, 0x62, 0x6A, 0xAE, 0xB9, 0xEB, 0x9E, 0x84, + 0x32, 0x4A, 0x29, 0xA7, 0xA4, 0xF2, 0x28, 0x78, 0x20, 0x20, 0xE3, 0x90, + 0x41, 0xEA, 0x68, 0xC3, 0x85, 0x15, 0x56, 0x68, 0x6F, 0x04, 0x15, 0x46, + 0x18, 0x01, 0xCC, 0x11, 0xDC, 0x0B, 0x63, 0x05, 0x17, 0x54, 0x70, 0xA1, + 0x0C, 0x16, 0x64, 0xF8, 0xA0, 0x84, 0x1C, 0xAC, 0x60, 0xFE, 0x0B, 0x98, + 0xB7, 0x7A, 0x01, 0x63, 0x06, 0x19, 0xD6, 0x38, 0xC4, 0xBF, 0x49, 0x26, + 0x81, 0x04, 0x92, 0x20, 0xB8, 0x00, 0x4C, 0x8E, 0x4D, 0x34, 0x29, 0xEC, + 0x50, 0xC2, 0x34, 0x91, 0x63, 0x02, 0x1D, 0xBC, 0x81, 0xEE, 0x95, 0x09, + 0x22, 0x78, 0x60, 0x02, 0x4C, 0x40, 0x41, 0x25, 0x16, 0x66, 0x90, 0xF1, + 0x30, 0x96, 0x55, 0x50, 0x51, 0x68, 0x08, 0xD1, 0x40, 0xF9, 0xC4, 0xB4, + 0x14, 0x3D, 0x69, 0x91, 0x88, 0x22, 0x24, 0xCA, 0x81, 0x08, 0x57, 0xA4, + 0x21, 0x07, 0x1E, 0x72, 0xD0, 0x29, 0x07, 0x9B, 0x78, 0x60, 0xC4, 0x61, + 0x17, 0xDF, 0x86, 0xFC, 0xA8, 0x98, 0x5D, 0x79, 0x2D, 0xB2, 0xA4, 0xE2, + 0x54, 0x5A, 0x29, 0xB9, 0xE5, 0x98, 0xAB, 0x32, 0x59, 0x65, 0x97, 0x65, + 0xB6, 0xD9, 0xA3, 0xF6, 0xA9, 0x20, 0x06, 0x44, 0x06, 0xD9, 0xC3, 0x85, + 0x17, 0x5E, 0x70, 0x61, 0x84, 0xF4, 0x46, 0x58, 0x2F, 0x85, 0x10, 0x56, + 0x08, 0xC3, 0x05, 0xAB, 0xC2, 0x40, 0x41, 0x85, 0x17, 0xC4, 0x78, 0x81, + 0x84, 0x38, 0xB1, 0x70, 0xEB, 0x8A, 0x1E, 0xB2, 0x68, 0x8B, 0x0B, 0x12, + 0xC4, 0xC8, 0x23, 0x11, 0x3E, 0xF6, 0x50, 0x84, 0x11, 0x46, 0xDE, 0xF5, + 0x05, 0x8C, 0x39, 0x1C, 0xD9, 0x04, 0xC1, 0xC1, 0x36, 0x19, 0x4C, 0x93, + 0x63, 0x34, 0x31, 0xA1, 0x82, 0x69, 0x9E, 0xDD, 0xE6, 0x86, 0x0A, 0x1E, + 0xB8, 0xE1, 0x06, 0x02, 0x22, 0xF8, 0x04, 0x14, 0x56, 0x32, 0x5B, 0x66, + 0x19, 0x64, 0x62, 0x61, 0x05, 0x15, 0x50, 0x3C, 0x21, 0x91, 0x88, 0x39, + 0xE6, 0x08, 0x65, 0x88, 0x22, 0x46, 0x8E, 0x4D, 0x07, 0x1C, 0x66, 0x2C, + 0xA5, 0x9D, 0x7D, 0x68, 0x82, 0x07, 0x1C, 0x74, 0xCE, 0x01, 0xE6, 0x9C, + 0x5F, 0xAC, 0xF8, 0x07, 0x8B, 0x70, 0x7E, 0xE5, 0x75, 0x23, 0x9E, 0x7B, + 0xFE, 0x26, 0xF2, 0x48, 0x71, 0x52, 0x2A, 0x36, 0xB9, 0x79, 0x96, 0xB3, + 0xC9, 0x59, 0xA5, 0x97, 0x66, 0xBA, 0xE9, 0x27, 0x77, 0x90, 0x56, 0xCB, + 0x31, 0xC8, 0x23, 0x81, 0x3D, 0xF3, 0xC2, 0x38, 0x43, 0x8C, 0x13, 0xAE, + 0x0E, 0x01, 0x85, 0x32, 0x5A, 0x50, 0xE3, 0x85, 0xAB, 0xCE, 0xB8, 0x16, + 0x06, 0x2C, 0xD6, 0x32, 0xC5, 0x04, 0x19, 0x64, 0xB0, 0xE1, 0x07, 0x2B, + 0x72, 0x58, 0x61, 0x8D, 0x3A, 0xEC, 0xF8, 0x6F, 0x12, 0x46, 0xE8, 0xE8, + 0x0B, 0x94, 0x38, 0x9A, 0x69, 0xA6, 0x30, 0x4E, 0x9A, 0x51, 0x90, 0xB0, + 0x63, 0x8E, 0x31, 0x21, 0x82, 0x6E, 0x8C, 0xDA, 0xE6, 0x08, 0x00, 0x2A, + 0xCD, 0x41, 0x87, 0x08, 0x08, 0xB8, 0x01, 0x95, 0xD3, 0x3A, 0x5C, 0x46, + 0x53, 0x59, 0x24, 0xF7, 0x24, 0x44, 0x1A, 0x45, 0x26, 0x62, 0x88, 0x20, + 0x64, 0x5C, 0x35, 0x08, 0x2B, 0x68, 0x79, 0x07, 0x9F, 0xE8, 0xCE, 0x91, + 0xD9, 0x1C, 0x74, 0x56, 0xB7, 0xA2, 0x07, 0x5D, 0x7D, 0xFE, 0x19, 0x68, + 0xD9, 0x8D, 0x3C, 0xD2, 0xB8, 0xA2, 0x8F, 0x3E, 0xD6, 0x26, 0x27, 0x9D, + 0xE6, 0xBD, 0xCA, 0xE8, 0x7A, 0x07, 0x1E, 0x28, 0x21, 0x62, 0x88, 0xE4, + 0x10, 0x3C, 0x5E, 0x48, 0xC1, 0x0C, 0x35, 0xC0, 0x55, 0x21, 0x4C, 0xB0, + 0x50, 0x18, 0x01, 0x05, 0xE4, 0xC1, 0x23, 0x01, 0xDC, 0xAB, 0x94, 0x6F, + 0x81, 0x0A, 0x5F, 0x6E, 0xA9, 0x61, 0x0C, 0x31, 0x52, 0x48, 0x81, 0x05, + 0x16, 0x52, 0x10, 0x81, 0x0C, 0x33, 0xD6, 0xE0, 0x23, 0x2F, 0x46, 0xE4, + 0x90, 0xC2, 0x95, 0x3B, 0x00, 0x79, 0x84, 0xE0, 0x67, 0xFE, 0xE6, 0xBB, + 0x99, 0xF9, 0x8F, 0x71, 0x86, 0x93, 0x02, 0x44, 0xD1, 0x87, 0x9F, 0xA1, + 0xA4, 0x79, 0xC0, 0x03, 0x2A, 0x40, 0xA9, 0x0A, 0xEC, 0xE0, 0x06, 0x12, + 0x00, 0x40, 0x0E, 0xFE, 0x3C, 0x26, 0x0B, 0x4E, 0x79, 0x48, 0x19, 0xAC, + 0x20, 0xD5, 0x1C, 0x8A, 0x10, 0x04, 0x23, 0x54, 0xB0, 0x08, 0x39, 0x28, + 0x82, 0x27, 0x8C, 0x20, 0x91, 0x22, 0x64, 0xC3, 0x74, 0x35, 0x99, 0x07, + 0x3D, 0xCE, 0x71, 0x0E, 0x95, 0xD0, 0xCC, 0x16, 0xAE, 0xF3, 0xD5, 0xAE, + 0x52, 0xD8, 0xAB, 0xD9, 0x09, 0x69, 0x38, 0x26, 0x19, 0x1A, 0xB1, 0x8C, + 0x86, 0x3B, 0x99, 0xEC, 0x2E, 0x78, 0x37, 0xC4, 0x61, 0x0E, 0xA9, 0x44, + 0x93, 0x22, 0x88, 0x40, 0x12, 0x88, 0xC0, 0x83, 0x1B, 0xCE, 0x90, 0x82, + 0xB0, 0xB1, 0x67, 0x04, 0x5F, 0x49, 0x81, 0x79, 0xB6, 0xF2, 0x82, 0x31, + 0x24, 0xF1, 0x6B, 0x66, 0xC8, 0x5A, 0x1D, 0xD4, 0xA0, 0x06, 0x4F, 0xF8, + 0x42, 0x0E, 0x69, 0xD8, 0x03, 0x1A, 0xDE, 0xF0, 0x86, 0x16, 0xA0, 0x01, + 0x0E, 0x6B, 0x10, 0x83, 0x18, 0xEC, 0x90, 0x07, 0x43, 0xFC, 0xE9, 0x0F, + 0x3B, 0x60, 0xC3, 0x5E, 0xFC, 0x40, 0x30, 0x04, 0x1D, 0xA3, 0x13, 0xCD, + 0x70, 0x86, 0x33, 0x06, 0x47, 0x18, 0x13, 0xE4, 0xC0, 0x1B, 0xFC, 0xF8, + 0x5D, 0x4F, 0xF6, 0x51, 0x0D, 0x1D, 0x3C, 0x40, 0x07, 0x9F, 0x90, 0x58, + 0x05, 0x28, 0x18, 0x01, 0x09, 0x14, 0x60, 0x08, 0x26, 0x62, 0x05, 0x32, + 0x32, 0x26, 0x8B, 0xCB, 0xB1, 0xE2, 0x13, 0x73, 0xC0, 0x04, 0x89, 0x24, + 0x68, 0x84, 0x39, 0xFC, 0x23, 0x62, 0x4D, 0xE8, 0xC7, 0x3E, 0x7E, 0x97, + 0x0F, 0x96, 0xCC, 0x2C, 0x1E, 0xE7, 0x88, 0xC7, 0x2B, 0x5E, 0xA4, 0x2B, + 0x5F, 0x11, 0xC3, 0x57, 0xBD, 0x31, 0x65, 0xEC, 0x4A, 0x69, 0xCA, 0x16, + 0x86, 0x44, 0x58, 0x43, 0x23, 0x5A, 0x4B, 0x72, 0xE7, 0x24, 0x1B, 0xEA, + 0xD0, 0x96, 0xB7, 0xC4, 0xE5, 0x52, 0xF4, 0x61, 0x85, 0x06, 0x44, 0x22, + 0x12, 0x84, 0x10, 0x44, 0x1E, 0xD6, 0xFE, 0x80, 0x06, 0x31, 0xA4, 0xC9, + 0x05, 0x2E, 0xE8, 0x40, 0x07, 0xAA, 0x06, 0x3E, 0x12, 0xA8, 0x80, 0x5C, + 0x62, 0xC0, 0xC3, 0x97, 0xCC, 0x90, 0x87, 0x36, 0xA8, 0xA1, 0x09, 0x44, + 0x48, 0x83, 0x18, 0xDA, 0x50, 0x87, 0x32, 0xEC, 0xA1, 0x10, 0x6D, 0x58, + 0xC3, 0x1B, 0xD6, 0x40, 0xC6, 0xBB, 0xD8, 0x6D, 0x12, 0x77, 0xB0, 0x03, + 0x24, 0x1E, 0x01, 0xB0, 0x4E, 0x38, 0xE2, 0x18, 0x7C, 0x8B, 0xA3, 0x33, + 0x9E, 0x31, 0xC7, 0x1A, 0x48, 0xE0, 0x1A, 0xF8, 0x08, 0x8A, 0x35, 0x76, + 0x20, 0x81, 0x1B, 0x78, 0x02, 0x13, 0x12, 0x1B, 0x40, 0x04, 0x66, 0x30, + 0x40, 0x03, 0x10, 0x40, 0x08, 0x98, 0x62, 0x24, 0x33, 0x2A, 0xC7, 0x99, + 0x50, 0x10, 0x01, 0x14, 0x24, 0x5A, 0x4D, 0xAB, 0x0C, 0x48, 0x04, 0x97, + 0xED, 0x6E, 0x1E, 0x9F, 0x5C, 0xDD, 0x4A, 0xD0, 0x61, 0x0B, 0x2B, 0x60, + 0xA1, 0x37, 0x2B, 0x34, 0xE5, 0x47, 0x45, 0xA2, 0x11, 0x15, 0x6A, 0x04, + 0x95, 0xAD, 0xF4, 0x48, 0x91, 0x68, 0x37, 0xAC, 0x95, 0xB8, 0x04, 0x77, + 0xB5, 0xCC, 0x65, 0x4C, 0x65, 0x3A, 0xD3, 0x9C, 0x10, 0x61, 0x02, 0x92, + 0x48, 0xC4, 0x1F, 0x7E, 0xB0, 0x53, 0x1B, 0xD4, 0xE0, 0x12, 0x31, 0x40, + 0xC1, 0x0A, 0x4E, 0xA0, 0x2D, 0xB0, 0x74, 0x60, 0x04, 0x29, 0x58, 0x41, + 0x0B, 0x4E, 0x10, 0x86, 0x30, 0x8C, 0xC0, 0x0C, 0x87, 0xD0, 0x03, 0x1E, + 0x62, 0x00, 0x87, 0x3D, 0x84, 0xC1, 0x0C, 0x6D, 0x18, 0x83, 0x19, 0xEA, + 0x00, 0x07, 0x38, 0xBC, 0x21, 0x0C, 0x7C, 0xDA, 0x83, 0x21, 0xF4, 0xC5, + 0x08, 0x45, 0xDC, 0xC1, 0x0F, 0x8D, 0x68, 0x84, 0x23, 0xD4, 0xFA, 0x46, + 0x78, 0xDA, 0x6F, 0x70, 0xCE, 0x30, 0x82, 0x04, 0xBE, 0xF1, 0x13, 0xC7, + 0x58, 0x23, 0x07, 0x13, 0xA8, 0xC0, 0xC8, 0x1C, 0x26, 0xFE, 0x19, 0x02, + 0x00, 0xA0, 0x08, 0x98, 0x10, 0x05, 0x2D, 0xAC, 0x30, 0x04, 0xC9, 0x31, + 0x32, 0x1A, 0xCC, 0x40, 0xE4, 0x43, 0x89, 0x60, 0x04, 0x54, 0x09, 0x41, + 0x08, 0x38, 0x28, 0x82, 0x37, 0xF0, 0xB1, 0xBB, 0x7C, 0x5C, 0xD4, 0x93, + 0x2C, 0xD1, 0xC5, 0xCD, 0x5E, 0x77, 0x4A, 0xDF, 0xA4, 0x70, 0x67, 0xA9, + 0x4C, 0x65, 0x67, 0x63, 0xE7, 0x33, 0x94, 0xD2, 0x2E, 0x1C, 0x27, 0x39, + 0xCE, 0x0C, 0x99, 0x04, 0x53, 0x9C, 0xE4, 0x91, 0xA6, 0xAF, 0x85, 0x6D, + 0xB3, 0x44, 0x21, 0x01, 0x40, 0xF4, 0xE0, 0x1F, 0x56, 0xB8, 0xC2, 0x3F, + 0xA8, 0xD0, 0x03, 0x87, 0xE0, 0x40, 0x07, 0x30, 0x60, 0x41, 0x03, 0x18, + 0x00, 0x82, 0x14, 0x9C, 0xA1, 0x89, 0x61, 0x18, 0xC3, 0x09, 0xCE, 0x90, + 0x07, 0x29, 0x0A, 0xA2, 0x0C, 0x69, 0xC0, 0x43, 0x58, 0xBF, 0xA7, 0xD5, + 0xE5, 0xD6, 0x45, 0x98, 0x86, 0xE0, 0xC3, 0x21, 0xFE, 0x93, 0x2F, 0x48, + 0x2C, 0xA2, 0x11, 0x95, 0xE8, 0x44, 0x27, 0x36, 0xC1, 0x56, 0x38, 0xCA, + 0x51, 0x70, 0x74, 0x90, 0x00, 0x2C, 0xF4, 0xE1, 0xDA, 0x9C, 0x78, 0x23, + 0x08, 0x0F, 0x90, 0x40, 0x65, 0x72, 0x70, 0x83, 0x08, 0x18, 0x21, 0x08, + 0x06, 0xF0, 0x44, 0xD2, 0xC8, 0x21, 0xB2, 0x52, 0x69, 0x08, 0x19, 0x1D, + 0x5B, 0xC5, 0x6A, 0x40, 0x41, 0x84, 0x20, 0x60, 0x02, 0x08, 0x0F, 0x71, + 0xC5, 0x7A, 0x71, 0x72, 0xD1, 0x78, 0xCC, 0x6C, 0x25, 0xE7, 0x40, 0x87, + 0x29, 0x4C, 0x51, 0x8C, 0xDE, 0x88, 0x34, 0xB4, 0xBE, 0xFA, 0x2C, 0x48, + 0x79, 0xB6, 0x4A, 0x92, 0x86, 0xD4, 0xA4, 0x3D, 0x0B, 0x96, 0xD0, 0x88, + 0xD6, 0xD2, 0x97, 0x52, 0x36, 0xB6, 0x27, 0x46, 0xB1, 0xD2, 0x68, 0x42, + 0x0B, 0x02, 0xFC, 0x63, 0x17, 0xB6, 0x00, 0xC6, 0x5A, 0x74, 0x11, 0xE3, + 0xFE, 0x2B, 0xE0, 0xB6, 0x07, 0x38, 0x28, 0x41, 0x18, 0xAE, 0x16, 0xBE, + 0x13, 0x5C, 0x05, 0x0D, 0x79, 0x08, 0x43, 0x1D, 0xBC, 0x23, 0x06, 0x33, + 0x84, 0x61, 0x10, 0x88, 0x10, 0xC4, 0x34, 0xDB, 0x20, 0x88, 0x3D, 0xD4, + 0x6B, 0x0F, 0x6E, 0x10, 0xEB, 0x24, 0x12, 0xC1, 0x88, 0x4A, 0x4C, 0xA2, + 0x12, 0xEA, 0x7C, 0x44, 0x27, 0xE2, 0x57, 0x3F, 0x67, 0xF0, 0x6D, 0x7E, + 0x9C, 0x70, 0x84, 0x04, 0x12, 0xEC, 0x13, 0xBB, 0x4E, 0xC6, 0x13, 0xA0, + 0x08, 0xC2, 0x01, 0x7D, 0x10, 0x04, 0x08, 0x8C, 0xA2, 0x86, 0x30, 0x99, + 0x07, 0x36, 0xFE, 0xA1, 0x09, 0x54, 0xAC, 0x42, 0x16, 0xA5, 0x41, 0xC5, + 0x89, 0x2A, 0x13, 0x9B, 0x22, 0x44, 0xAC, 0x07, 0x90, 0x5A, 0x30, 0x4B, + 0xCC, 0x41, 0xC2, 0x78, 0xAC, 0x04, 0x1C, 0xFF, 0xC8, 0x48, 0x48, 0x57, + 0x98, 0x42, 0x46, 0xEF, 0x6C, 0x67, 0x8C, 0x26, 0x6D, 0x87, 0x25, 0x4D, + 0x8C, 0x44, 0x03, 0xED, 0x85, 0xB0, 0x2C, 0x96, 0x4B, 0x91, 0xC5, 0xDA, + 0x14, 0x77, 0xDA, 0xD3, 0x4F, 0xAA, 0x86, 0x01, 0xAE, 0x00, 0x0C, 0x52, + 0xEF, 0x82, 0xD4, 0xA6, 0xD8, 0x85, 0x8E, 0x4C, 0x01, 0x0C, 0x53, 0xF4, + 0xA0, 0x06, 0x5D, 0x49, 0x4F, 0x0A, 0xC2, 0x50, 0x86, 0x30, 0x96, 0x81, + 0x4B, 0x67, 0x28, 0x03, 0x14, 0xCD, 0x80, 0x87, 0x3C, 0x4C, 0x6B, 0x0C, + 0x76, 0x78, 0x43, 0x5D, 0x0A, 0x71, 0x88, 0x31, 0xF2, 0x81, 0xAC, 0xE6, + 0x0C, 0x54, 0x23, 0x1E, 0x51, 0x89, 0x2C, 0x87, 0xB7, 0x13, 0xF1, 0x9C, + 0x1F, 0xA2, 0x4C, 0x40, 0x04, 0x3D, 0x62, 0xC3, 0x08, 0x06, 0xB8, 0x01, + 0x86, 0x8C, 0x70, 0xC0, 0x1B, 0x10, 0x21, 0x02, 0xF9, 0x6D, 0x52, 0x65, + 0xF3, 0xA1, 0x8B, 0x7F, 0xA4, 0x42, 0x72, 0x78, 0xFE, 0x54, 0x88, 0x3C, + 0xD1, 0xD0, 0x0C, 0xFE, 0x14, 0xE1, 0x17, 0xAE, 0xE5, 0x24, 0x72, 0x8A, + 0x46, 0x8F, 0x52, 0xEC, 0x22, 0xC3, 0x8D, 0x56, 0x21, 0x86, 0xF5, 0xED, + 0xD9, 0xD0, 0x1A, 0x49, 0xB4, 0xFF, 0x16, 0x8E, 0x70, 0x4A, 0x62, 0x3B, + 0x25, 0x21, 0xAD, 0x86, 0x9F, 0x46, 0x78, 0xC2, 0xAB, 0x03, 0x8F, 0x07, + 0x58, 0x81, 0xD4, 0x0F, 0xF7, 0x45, 0x8C, 0x77, 0xF1, 0x0A, 0x53, 0x47, + 0xDC, 0x16, 0x26, 0x48, 0x01, 0x19, 0x4E, 0xB0, 0x54, 0x35, 0x98, 0xC1, + 0x0C, 0x52, 0x21, 0xC3, 0x18, 0xDC, 0xD0, 0x71, 0x3D, 0xD4, 0x61, 0x6E, + 0xDB, 0xA4, 0xE6, 0x53, 0x0E, 0x61, 0x88, 0x43, 0xE4, 0x61, 0x8C, 0x62, + 0xD5, 0x57, 0xA0, 0x20, 0xD1, 0x08, 0x2D, 0xD3, 0x9C, 0xAD, 0xCF, 0x8E, + 0xB6, 0x1C, 0x74, 0xA0, 0x03, 0xF6, 0xDA, 0x84, 0x1A, 0x41, 0x90, 0xC0, + 0x0C, 0x42, 0x81, 0x8A, 0x21, 0x44, 0xAC, 0x55, 0x11, 0x70, 0x73, 0x4D, + 0x98, 0xE3, 0x12, 0x79, 0x98, 0x22, 0x08, 0x9D, 0x41, 0x8D, 0xE4, 0x3E, + 0x71, 0xE6, 0x14, 0x01, 0x21, 0x08, 0xB4, 0xC0, 0xE7, 0x4D, 0x2A, 0x2B, + 0xE8, 0x62, 0x3D, 0x78, 0xC2, 0x8C, 0x6E, 0xF4, 0x85, 0x8B, 0xE1, 0xE8, + 0xB1, 0x7F, 0xD6, 0x94, 0x8F, 0xCE, 0xF0, 0xA3, 0x49, 0xBA, 0x61, 0x57, + 0x76, 0x64, 0x24, 0x41, 0x3B, 0x2D, 0xA6, 0x0B, 0x8E, 0x2C, 0x85, 0xD7, + 0xDD, 0xEE, 0x49, 0xC1, 0x87, 0x04, 0xFE, 0xF1, 0xF0, 0x87, 0xEB, 0x22, + 0xD5, 0x12, 0x2E, 0xB5, 0x31, 0x6C, 0x31, 0x02, 0x34, 0x58, 0x95, 0x05, + 0x65, 0x60, 0xEA, 0x0B, 0xCA, 0x30, 0x06, 0x35, 0xE4, 0x5A, 0x0D, 0x6E, + 0x68, 0x03, 0x1E, 0xC6, 0x70, 0x06, 0x43, 0x0C, 0x42, 0x10, 0x5B, 0x0C, + 0xAB, 0x37, 0x15, 0xC1, 0x07, 0x43, 0x44, 0xD9, 0x12, 0x32, 0xD7, 0xF2, + 0x78, 0xC3, 0xDB, 0x56, 0x4E, 0xD4, 0xFE, 0x20, 0x0B, 0x59, 0xB8, 0x01, + 0x84, 0x74, 0x62, 0x8D, 0xF7, 0x46, 0x00, 0x13, 0x25, 0x73, 0x58, 0x0E, + 0xE6, 0xE0, 0xFA, 0xE8, 0x30, 0x07, 0xCE, 0x0C, 0xB6, 0x85, 0x10, 0x56, + 0xB1, 0x0A, 0x50, 0x0C, 0x7D, 0xE8, 0x23, 0xEB, 0xB3, 0x28, 0x32, 0xA9, + 0xF4, 0x10, 0xD2, 0x43, 0xDE, 0x85, 0xFE, 0xA4, 0x2E, 0x3E, 0x0A, 0x52, + 0x56, 0x8E, 0x04, 0xEC, 0x65, 0x57, 0xFB, 0xDB, 0xC7, 0x0E, 0xF6, 0xB5, + 0xAF, 0x72, 0x95, 0xCE, 0x07, 0x89, 0x4A, 0x39, 0x72, 0x69, 0xE3, 0xCC, + 0x3D, 0x69, 0x77, 0x07, 0x7F, 0xF8, 0x7D, 0x92, 0x8F, 0x08, 0xFC, 0x23, + 0xE2, 0xA6, 0x2E, 0xF5, 0x2E, 0xFC, 0x0E, 0xE3, 0xB5, 0xD8, 0x69, 0x07, + 0x2C, 0x18, 0x83, 0x57, 0xCD, 0xA3, 0x82, 0x16, 0x78, 0xC7, 0x0C, 0x7B, + 0x68, 0xBC, 0xC7, 0x4D, 0x8E, 0x07, 0x5E, 0xC3, 0xC1, 0x0E, 0x6B, 0x38, + 0x83, 0x3A, 0x48, 0x04, 0xE6, 0xA2, 0x8B, 0x3B, 0xB8, 0x8B, 0xEE, 0xCA, + 0x97, 0x47, 0x80, 0x04, 0x67, 0x1B, 0xBD, 0x4E, 0xE0, 0x84, 0x38, 0xF8, + 0x07, 0x3C, 0x39, 0x82, 0x59, 0xF8, 0xBE, 0x15, 0x1B, 0x82, 0x00, 0x3A, + 0xA4, 0xA2, 0xAB, 0x2F, 0x22, 0x98, 0x01, 0x6A, 0x4B, 0x1A, 0xDB, 0x63, + 0x30, 0x73, 0x28, 0x87, 0xC1, 0x42, 0x85, 0xCE, 0x08, 0x05, 0x92, 0x81, + 0x24, 0x22, 0xE8, 0x81, 0x57, 0x60, 0x8C, 0x99, 0x60, 0x30, 0xE4, 0x2B, + 0x9A, 0x95, 0x88, 0x31, 0xB2, 0x03, 0xA9, 0xB7, 0x73, 0xBE, 0x62, 0x18, + 0x87, 0x1B, 0xD4, 0x37, 0x1D, 0xF4, 0xAC, 0xB2, 0xE3, 0xB0, 0x15, 0x2A, + 0x12, 0x0C, 0xB3, 0xC1, 0xB7, 0x1B, 0x29, 0x22, 0xE4, 0xBE, 0x58, 0x32, + 0x1A, 0x26, 0xF9, 0x3E, 0xF1, 0x63, 0x42, 0xF1, 0x7B, 0x87, 0x07, 0xE8, + 0x81, 0x87, 0xDB, 0x85, 0x5B, 0xD0, 0x11, 0x2A, 0xB8, 0xFE, 0x02, 0x09, + 0xDB, 0x05, 0x61, 0x20, 0x35, 0x5F, 0xB0, 0x05, 0x18, 0x78, 0x01, 0x34, + 0x18, 0x03, 0x14, 0x10, 0xC3, 0x5C, 0x93, 0xA2, 0x31, 0x90, 0xA2, 0x33, + 0xD8, 0x83, 0x41, 0xA0, 0x96, 0x3C, 0xD0, 0x03, 0x43, 0x88, 0x84, 0x44, + 0x28, 0x84, 0xBA, 0x98, 0x04, 0x3F, 0xB1, 0x97, 0x43, 0x60, 0x84, 0x40, + 0x59, 0x84, 0x4A, 0xD8, 0x04, 0x65, 0x13, 0x2F, 0xF1, 0xE2, 0x04, 0x39, + 0x88, 0x40, 0x30, 0x00, 0x83, 0x0D, 0xC0, 0x84, 0xA4, 0x71, 0x8C, 0x57, + 0x88, 0x80, 0x44, 0xCC, 0x81, 0x13, 0xD4, 0x81, 0x19, 0x18, 0x02, 0x4F, + 0xB8, 0x81, 0x20, 0x68, 0x92, 0x99, 0x58, 0x0E, 0x97, 0x28, 0x34, 0x94, + 0x18, 0x07, 0x21, 0xC0, 0x84, 0x4F, 0xF9, 0x98, 0xD5, 0x00, 0x11, 0x1C, + 0xD0, 0x05, 0x78, 0x78, 0x07, 0xE4, 0x1B, 0xA1, 0xE3, 0x43, 0x3E, 0x70, + 0x10, 0x86, 0xE7, 0x53, 0x29, 0x92, 0xF0, 0xB7, 0xB2, 0x03, 0x06, 0x63, + 0x18, 0x07, 0x63, 0x40, 0x3B, 0xE7, 0x1B, 0x07, 0x21, 0xF4, 0x41, 0xDF, + 0xB8, 0x37, 0x92, 0xD8, 0x15, 0x23, 0x1C, 0xA9, 0x5E, 0x0C, 0x31, 0xEE, + 0x3B, 0x0E, 0x4D, 0x9B, 0xC4, 0x26, 0x24, 0x46, 0xF0, 0xA3, 0x85, 0x04, + 0x70, 0xB1, 0x17, 0xC3, 0x04, 0x3A, 0x90, 0x83, 0x38, 0xA8, 0x81, 0x1F, + 0xB0, 0x81, 0x1D, 0xB0, 0x05, 0x2D, 0x2C, 0x35, 0x18, 0x50, 0x2A, 0x17, + 0x48, 0x03, 0x6C, 0xB1, 0x0A, 0x59, 0x9B, 0x35, 0xEF, 0x38, 0x83, 0x36, + 0x40, 0x39, 0x35, 0xA8, 0x83, 0x3C, 0x18, 0x04, 0xCE, 0xB3, 0x03, 0x3B, + 0x78, 0xC3, 0x42, 0xB0, 0x9B, 0xF4, 0x51, 0x84, 0xEE, 0x52, 0x27, 0xF0, + 0x0A, 0xBD, 0x66, 0x00, 0x04, 0x1B, 0xF8, 0x07, 0xDD, 0x4A, 0x0B, 0x1C, + 0x78, 0x87, 0x9B, 0x40, 0xC4, 0x08, 0xD0, 0x01, 0xD6, 0xC0, 0x04, 0x03, + 0xFE, 0x92, 0xBD, 0x0A, 0xB8, 0x81, 0xAC, 0x53, 0x3A, 0x38, 0xE3, 0xBA, + 0x72, 0x30, 0x89, 0x62, 0x10, 0x82, 0x39, 0x68, 0x05, 0x50, 0xB0, 0x98, + 0x4F, 0x58, 0x85, 0x7F, 0x10, 0x82, 0x5F, 0x90, 0x99, 0xD5, 0x19, 0x21, + 0x50, 0x42, 0x3E, 0xE4, 0x40, 0x07, 0x60, 0x78, 0xB4, 0x1C, 0x1C, 0xBB, + 0x1C, 0x1C, 0x8E, 0xE1, 0xB8, 0x45, 0x8F, 0xF4, 0x8D, 0x5A, 0x7C, 0x34, + 0x58, 0x9C, 0x45, 0x21, 0xE4, 0x88, 0x46, 0x0B, 0x96, 0x22, 0xA4, 0x1D, + 0x97, 0x5C, 0x45, 0x18, 0x22, 0xB8, 0x25, 0xE1, 0xB4, 0x62, 0xB4, 0x49, + 0x14, 0x9B, 0x03, 0x03, 0x98, 0x11, 0x40, 0x78, 0x03, 0x38, 0x38, 0x04, + 0x41, 0x40, 0x84, 0x43, 0x80, 0x03, 0x35, 0x68, 0x01, 0x18, 0x00, 0x82, + 0x55, 0x23, 0xB5, 0x1F, 0x60, 0x01, 0x15, 0x38, 0x01, 0xF0, 0x79, 0x81, + 0xF6, 0xC0, 0x1A, 0xE4, 0x31, 0xAE, 0x16, 0xF0, 0x1E, 0x28, 0x9A, 0xBC, + 0x3A, 0x08, 0x2B, 0x6A, 0x59, 0x03, 0x3B, 0xC0, 0xAE, 0x3C, 0xC8, 0x17, + 0xBC, 0xC8, 0x97, 0x4E, 0x40, 0xAB, 0x4E, 0x00, 0x2F, 0x82, 0x71, 0x84, + 0x66, 0xFC, 0x83, 0x3F, 0x00, 0x04, 0x23, 0x80, 0x00, 0x6B, 0xA8, 0x09, + 0x5A, 0xA0, 0x14, 0x1D, 0x20, 0x19, 0x03, 0x9B, 0x01, 0x20, 0x20, 0x02, + 0x95, 0x81, 0x10, 0xBA, 0xBB, 0xBD, 0x83, 0x84, 0xA1, 0x56, 0xDB, 0xC4, + 0xA1, 0xFB, 0x84, 0x22, 0x10, 0x02, 0x5B, 0x00, 0x07, 0x6C, 0x00, 0x06, + 0x6C, 0xC0, 0x06, 0x07, 0x93, 0xB7, 0x12, 0x02, 0x06, 0x1C, 0xDC, 0x19, + 0x20, 0x09, 0x07, 0x90, 0x3C, 0x92, 0xE1, 0x00, 0x49, 0xC9, 0x0C, 0x49, + 0xCF, 0xD2, 0x45, 0xE8, 0xA3, 0xC1, 0xB0, 0xFB, 0xC5, 0x91, 0x82, 0x3E, + 0x23, 0x81, 0xBB, 0xDA, 0x49, 0x92, 0x24, 0xA4, 0xBB, 0x9B, 0x34, 0xCD, + 0x14, 0x83, 0x87, 0xFE, 0x08, 0x30, 0x81, 0x38, 0x80, 0x03, 0x60, 0x4A, + 0x84, 0x5F, 0xD2, 0x03, 0x35, 0x40, 0x03, 0x34, 0x68, 0x01, 0x17, 0x58, + 0x4A, 0x5B, 0x68, 0x0B, 0x23, 0x60, 0x81, 0x10, 0x50, 0x01, 0xAD, 0x71, + 0x01, 0x31, 0xB8, 0x8A, 0x16, 0xF8, 0xB8, 0x5C, 0x43, 0x2E, 0x31, 0x28, + 0x83, 0x00, 0x9C, 0x1B, 0xB9, 0xB1, 0x03, 0x3D, 0xE0, 0x83, 0x71, 0xC4, + 0x97, 0x3D, 0xD8, 0x03, 0xB2, 0x32, 0xB6, 0xEF, 0x1A, 0x4B, 0x3F, 0x74, + 0xA7, 0xC2, 0x00, 0x04, 0x44, 0x11, 0x01, 0x52, 0x90, 0x89, 0x6B, 0xA0, + 0x94, 0x19, 0xC0, 0x84, 0xF0, 0xF4, 0x01, 0x1C, 0x00, 0x02, 0x4C, 0x98, + 0x2F, 0x40, 0x2B, 0x48, 0x83, 0x2C, 0x34, 0x11, 0x1C, 0x1A, 0x71, 0x18, + 0x09, 0xA7, 0x0B, 0x05, 0x54, 0x19, 0x85, 0x51, 0x10, 0xCC, 0x51, 0x40, + 0x87, 0xC4, 0x1C, 0x07, 0x73, 0xA0, 0x87, 0x95, 0x28, 0x9A, 0x8D, 0xC4, + 0x41, 0x5F, 0xA9, 0x45, 0xC9, 0x74, 0xCF, 0x90, 0x2C, 0x89, 0x17, 0x0A, + 0xC9, 0x71, 0xB0, 0x4C, 0x91, 0xD4, 0x45, 0xC9, 0xC4, 0x45, 0x56, 0x24, + 0xD0, 0x90, 0x34, 0xAD, 0x57, 0xEA, 0x3E, 0xD2, 0xFC, 0xC0, 0xD3, 0xB4, + 0x50, 0x9A, 0x9A, 0x05, 0x03, 0x48, 0x03, 0x42, 0x40, 0x04, 0x42, 0x10, + 0x03, 0x2D, 0x69, 0x03, 0x42, 0xD0, 0x03, 0x71, 0x61, 0xAA, 0x30, 0x48, + 0x83, 0x18, 0xB8, 0x05, 0x61, 0xF0, 0x01, 0x16, 0xA8, 0x9A, 0xF1, 0xD0, + 0x8A, 0x63, 0x42, 0x81, 0xAF, 0x0A, 0x03, 0xF2, 0x98, 0x51, 0x14, 0x38, + 0x81, 0x18, 0x40, 0x97, 0x90, 0x13, 0xA7, 0x3D, 0xE0, 0x03, 0x71, 0xB2, + 0x03, 0xFF, 0x50, 0x04, 0xBB, 0xC9, 0x8B, 0x3B, 0xA0, 0x39, 0x47, 0xD8, + 0xB2, 0xF1, 0x72, 0x84, 0xBE, 0xE1, 0x04, 0x3A, 0xB0, 0x01, 0x1D, 0xE0, + 0x07, 0x72, 0x90, 0x18, 0x09, 0x20, 0xFE, 0x82, 0x50, 0xC0, 0x04, 0x23, + 0x88, 0x80, 0x56, 0xB1, 0x52, 0x48, 0xA1, 0x25, 0x4A, 0xB4, 0xC4, 0xF5, + 0x44, 0x09, 0x18, 0x12, 0x87, 0x71, 0xC8, 0x3D, 0x52, 0x78, 0x05, 0x52, + 0xB0, 0x82, 0xD7, 0xB0, 0x82, 0x19, 0xC3, 0x06, 0x12, 0x2A, 0x9A, 0x42, + 0x03, 0x07, 0x60, 0xC8, 0xC1, 0x5A, 0xC4, 0xC1, 0x1C, 0x74, 0xCF, 0x3A, + 0x1D, 0x50, 0x93, 0x88, 0x3B, 0x30, 0x85, 0xA1, 0xD3, 0xE2, 0xD3, 0x07, + 0x2D, 0x50, 0x93, 0xC4, 0x41, 0x94, 0x4C, 0x50, 0x3F, 0x25, 0x54, 0x11, + 0x0B, 0x46, 0x1A, 0xBA, 0xD0, 0x44, 0xA5, 0x29, 0x21, 0x50, 0x00, 0x3D, + 0xD0, 0x83, 0x0E, 0xFD, 0x46, 0x3C, 0x28, 0x03, 0x3D, 0xA0, 0x26, 0xC4, + 0x03, 0x0F, 0x15, 0x90, 0x01, 0x23, 0xD8, 0x85, 0x57, 0x23, 0x01, 0x14, + 0x68, 0x01, 0x25, 0x22, 0x01, 0x2F, 0x59, 0x13, 0x36, 0x28, 0x03, 0xA6, + 0x64, 0xCA, 0x8C, 0x83, 0x01, 0x32, 0x78, 0x01, 0x18, 0xD8, 0x4A, 0x3B, + 0x30, 0x03, 0xDB, 0x64, 0x83, 0x35, 0x90, 0xD5, 0x3B, 0x58, 0x84, 0x65, + 0x7B, 0x84, 0xBD, 0x58, 0xA7, 0x3F, 0x00, 0x18, 0xC4, 0x40, 0x90, 0x80, + 0xF9, 0x01, 0x02, 0xD0, 0x20, 0x02, 0x38, 0x82, 0x47, 0x7C, 0xA8, 0x1B, + 0xD0, 0x01, 0xCF, 0x89, 0x80, 0x6A, 0xC0, 0x89, 0x63, 0xE9, 0x52, 0x95, + 0x40, 0x48, 0x84, 0x34, 0x89, 0x71, 0x10, 0x87, 0x62, 0x78, 0x11, 0x2B, + 0x28, 0x05, 0x52, 0xD0, 0x0D, 0x21, 0x78, 0x05, 0x74, 0x00, 0x07, 0x8C, + 0x64, 0x09, 0x08, 0x63, 0xB5, 0xC8, 0x3C, 0x2D, 0x04, 0xB5, 0x4C, 0x3D, + 0x35, 0x57, 0x99, 0x3C, 0x57, 0x30, 0xE5, 0x53, 0x69, 0x7D, 0x50, 0x39, + 0x2D, 0xD4, 0x02, 0x2D, 0x54, 0x3C, 0x1D, 0x96, 0xB9, 0x53, 0x42, 0x45, + 0xB5, 0x57, 0x1C, 0xBA, 0x92, 0x05, 0xC0, 0x03, 0x42, 0xFE, 0xE0, 0x3F, + 0x41, 0x40, 0xCE, 0xEE, 0x80, 0x03, 0x37, 0x58, 0x83, 0x16, 0xB0, 0x51, + 0x1B, 0xED, 0x01, 0x12, 0x90, 0x01, 0xB0, 0x08, 0x81, 0xB0, 0x00, 0x13, + 0x22, 0xCB, 0x8A, 0x16, 0x48, 0x03, 0x16, 0x60, 0x00, 0x06, 0xE0, 0x80, + 0x05, 0x50, 0x00, 0x05, 0x68, 0x80, 0x06, 0x50, 0x00, 0xA7, 0x18, 0x83, + 0x55, 0x65, 0x83, 0x37, 0x30, 0x40, 0x3E, 0xE8, 0x83, 0x35, 0xB8, 0x83, + 0x92, 0xF5, 0x83, 0x93, 0x15, 0x2F, 0x40, 0x00, 0x04, 0x47, 0xA0, 0x83, + 0x3F, 0x90, 0x03, 0x39, 0x60, 0xC6, 0x02, 0x20, 0x00, 0x02, 0x90, 0x80, + 0x1C, 0x38, 0x95, 0x19, 0xC8, 0x01, 0xCF, 0x99, 0x81, 0x04, 0xCB, 0xA3, + 0xA5, 0x0B, 0x41, 0x67, 0x85, 0xD6, 0x93, 0x48, 0xC8, 0xB7, 0xB1, 0x82, + 0x56, 0x1B, 0x85, 0x1E, 0x30, 0x05, 0x08, 0xE3, 0xCF, 0x8D, 0x34, 0x85, + 0x52, 0x30, 0x05, 0x69, 0x4D, 0x57, 0x3D, 0x7D, 0x56, 0x94, 0xA0, 0xDA, + 0xAA, 0xB5, 0xDA, 0x67, 0xD5, 0xD3, 0x57, 0x5A, 0x57, 0xC7, 0x0C, 0x49, + 0x3B, 0x7D, 0x57, 0x3F, 0x95, 0xC9, 0xD4, 0x52, 0x8E, 0x25, 0xBC, 0x57, + 0xD8, 0xEA, 0xB9, 0x4E, 0xB3, 0x06, 0x02, 0x58, 0x01, 0x3C, 0x88, 0xD4, + 0x3A, 0x48, 0x83, 0xB1, 0xE0, 0xBF, 0xB7, 0x35, 0x03, 0x6C, 0x69, 0x0F, + 0x10, 0x10, 0x81, 0xA4, 0x22, 0x01, 0x0E, 0x50, 0x80, 0xAA, 0x99, 0x9E, + 0xAF, 0x6A, 0x01, 0x10, 0x58, 0x80, 0x09, 0x20, 0x80, 0x02, 0x40, 0x00, + 0x09, 0x88, 0x00, 0xDA, 0x80, 0x00, 0x08, 0x18, 0x5C, 0x02, 0x18, 0x00, + 0x8C, 0x2D, 0x01, 0x17, 0x48, 0xD5, 0x3B, 0x60, 0x84, 0x75, 0xF2, 0x83, + 0x3B, 0xF8, 0x03, 0x3F, 0x50, 0x4B, 0x47, 0x00, 0x33, 0x40, 0x70, 0x59, + 0x06, 0x69, 0x90, 0xC5, 0xD1, 0x01, 0x52, 0xF9, 0xA7, 0x0E, 0xCC, 0x81, + 0xFE, 0x36, 0xAB, 0x40, 0x10, 0xB4, 0x44, 0xA0, 0xA5, 0x5A, 0x04, 0x6D, + 0x4F, 0xF7, 0x34, 0x85, 0x1C, 0x98, 0x91, 0xD6, 0x19, 0x05, 0x52, 0xD3, + 0x05, 0x5D, 0x30, 0x85, 0x6A, 0x35, 0x05, 0x63, 0x88, 0x5A, 0x68, 0x9D, + 0xDA, 0xAA, 0x25, 0x96, 0xDF, 0x05, 0xDE, 0xAB, 0x05, 0x53, 0x01, 0x1D, + 0xD7, 0xB2, 0x63, 0x57, 0x3C, 0xED, 0xD3, 0x3A, 0x4D, 0xDE, 0x3B, 0x5D, + 0x5E, 0x99, 0x1C, 0xCD, 0x12, 0x2B, 0xDB, 0xE8, 0x05, 0x1E, 0x55, 0x20, + 0x80, 0x10, 0x75, 0x03, 0x37, 0xD0, 0x83, 0x36, 0x00, 0xCE, 0x15, 0x30, + 0x83, 0x32, 0x20, 0x81, 0x0E, 0xF8, 0xD4, 0x11, 0xF8, 0xD4, 0x13, 0x58, + 0xCA, 0x30, 0x08, 0x81, 0x05, 0x68, 0x00, 0xA4, 0x4A, 0xA2, 0x0E, 0xF8, + 0x00, 0x0E, 0xC0, 0xAB, 0x0C, 0x88, 0x80, 0x1E, 0x70, 0x85, 0x7E, 0x80, + 0x07, 0x7B, 0xD8, 0x07, 0x7B, 0x50, 0x86, 0xA9, 0xFB, 0x47, 0xBE, 0x32, + 0x80, 0x02, 0x18, 0x80, 0x02, 0xD8, 0x58, 0x36, 0xB8, 0xDC, 0x3F, 0x88, + 0x83, 0x38, 0x68, 0x46, 0x03, 0xFE, 0x01, 0x04, 0x8E, 0x83, 0x1F, 0xA8, + 0x01, 0x05, 0x00, 0x00, 0x1C, 0x30, 0x0D, 0x4C, 0x68, 0xC4, 0x21, 0xC8, + 0x81, 0x07, 0x48, 0xBA, 0x83, 0x0B, 0xB7, 0x17, 0x54, 0xDD, 0x93, 0x60, + 0x5D, 0x18, 0x1A, 0x07, 0x2B, 0xD8, 0x81, 0x0C, 0xF8, 0x87, 0x52, 0x78, + 0x11, 0x8E, 0x12, 0x82, 0x7F, 0x80, 0x31, 0x61, 0x80, 0xDA, 0xD6, 0x85, + 0x25, 0x58, 0x32, 0x8E, 0x11, 0x93, 0x21, 0xE4, 0x90, 0xE1, 0xF5, 0xE4, + 0x3A, 0x11, 0xAC, 0x5A, 0x0F, 0x26, 0x57, 0x1C, 0x64, 0xDE, 0x02, 0xB5, + 0x53, 0xE5, 0xF5, 0xE1, 0x1F, 0x16, 0xCD, 0x43, 0xCD, 0x1D, 0xE9, 0x25, + 0x62, 0x67, 0x71, 0x8C, 0x26, 0x20, 0x80, 0x42, 0x40, 0x84, 0x92, 0xEB, + 0xB8, 0x3A, 0xB8, 0xFE, 0x0A, 0xF2, 0xF8, 0xD4, 0x59, 0x63, 0x2A, 0x14, + 0x48, 0x81, 0x32, 0xD9, 0x8A, 0x33, 0x61, 0x8F, 0xF4, 0x90, 0x00, 0x1E, + 0x10, 0x82, 0x5A, 0x28, 0x05, 0x22, 0xA8, 0x85, 0x2B, 0x20, 0x05, 0x51, + 0x20, 0x08, 0x52, 0x18, 0x85, 0x26, 0xE8, 0x81, 0x1C, 0xC8, 0xD9, 0x50, + 0x88, 0x06, 0x50, 0xC9, 0x01, 0x03, 0x0A, 0xA0, 0xBE, 0x22, 0x00, 0x03, + 0x98, 0x80, 0x09, 0x48, 0x80, 0x3A, 0x16, 0xDC, 0x09, 0x08, 0x20, 0x09, + 0xB0, 0x81, 0x07, 0x18, 0x5C, 0x23, 0x60, 0x05, 0x4F, 0xD0, 0x81, 0x0A, + 0x18, 0x02, 0x2B, 0x25, 0x02, 0x9A, 0x80, 0xB7, 0xBD, 0x3C, 0xC8, 0x2F, + 0x2D, 0x87, 0x71, 0x68, 0xE4, 0x73, 0x68, 0x61, 0x60, 0x68, 0x9D, 0x0C, + 0x20, 0x82, 0x33, 0x85, 0x11, 0x3A, 0x01, 0x06, 0x61, 0x40, 0x07, 0xA9, + 0x6D, 0x4F, 0xDF, 0x8D, 0x61, 0x25, 0x49, 0x8E, 0x19, 0x72, 0xA9, 0x2E, + 0xAD, 0x61, 0xAA, 0xD5, 0xD3, 0x58, 0xD4, 0xE1, 0xE1, 0x55, 0xD7, 0x1E, + 0xCE, 0xD3, 0xB8, 0xE3, 0xD3, 0x3B, 0x05, 0xD3, 0x09, 0x35, 0x16, 0x0C, + 0x2E, 0x62, 0x28, 0x39, 0x5B, 0x22, 0xAE, 0x05, 0x01, 0xC0, 0x83, 0x43, + 0xE0, 0xD7, 0xEE, 0xA8, 0x83, 0x30, 0x10, 0x03, 0xAD, 0x18, 0x03, 0xA6, + 0x5A, 0x03, 0xA6, 0x52, 0x0F, 0x15, 0xE0, 0x80, 0x10, 0x50, 0xE6, 0xE8, + 0x71, 0xDF, 0x08, 0x68, 0x82, 0x5B, 0xB8, 0x02, 0x4F, 0xB8, 0x02, 0x1E, + 0x10, 0x1D, 0x2C, 0x58, 0x82, 0x0C, 0xB8, 0x82, 0x2B, 0xB8, 0x05, 0x5E, + 0x10, 0x06, 0x5E, 0xB8, 0x82, 0x10, 0x1E, 0x82, 0x0C, 0x09, 0x05, 0x6D, + 0x88, 0x05, 0x64, 0xD0, 0x06, 0x64, 0x20, 0x30, 0x2B, 0x60, 0x82, 0x1E, + 0xE0, 0x81, 0x0C, 0x70, 0xE7, 0x23, 0xA8, 0x80, 0x99, 0x05, 0x00, 0x00, + 0x98, 0xD9, 0x09, 0xE8, 0xA7, 0xF9, 0xFE, 0x52, 0x63, 0x09, 0xB8, 0x60, + 0xAD, 0xA3, 0xC4, 0xCA, 0xFA, 0xD9, 0x94, 0xB8, 0x61, 0x48, 0x6E, 0x64, + 0xA8, 0x45, 0x07, 0x5D, 0xC0, 0x02, 0x53, 0xC8, 0x66, 0x53, 0xC0, 0x82, + 0xC3, 0x2C, 0x06, 0x60, 0xD8, 0x64, 0x17, 0xB6, 0x5A, 0xE0, 0x95, 0x61, + 0x61, 0x14, 0xB7, 0x63, 0xF1, 0x67, 0x7F, 0xD6, 0x60, 0xD5, 0x0D, 0xDA, + 0x30, 0x85, 0xDA, 0x15, 0x36, 0x57, 0xA8, 0x6D, 0xE5, 0x30, 0x5D, 0xE5, + 0x1E, 0xA6, 0xDA, 0xDB, 0x41, 0x9A, 0x98, 0xA8, 0xE5, 0xEB, 0x20, 0xC8, + 0x94, 0x96, 0x09, 0x7E, 0x80, 0x80, 0x15, 0xA0, 0x04, 0xD8, 0xDC, 0xA6, + 0x15, 0xF8, 0x1E, 0xA6, 0x12, 0x2A, 0xFA, 0x33, 0x8F, 0x8D, 0x73, 0x80, + 0x06, 0x20, 0x81, 0x23, 0x5A, 0x00, 0x01, 0x72, 0x9D, 0x5B, 0xA0, 0x02, + 0x0D, 0xE8, 0x28, 0x26, 0xB8, 0x82, 0x5D, 0xE0, 0x85, 0x60, 0x18, 0x06, + 0x5E, 0x18, 0x06, 0x63, 0x08, 0x06, 0x61, 0x18, 0x86, 0x60, 0xB8, 0x05, + 0x26, 0xC0, 0x01, 0x03, 0x42, 0x85, 0x68, 0x40, 0x86, 0x74, 0xA8, 0x87, + 0x13, 0x34, 0x05, 0x5E, 0xB8, 0x05, 0x2C, 0xE0, 0x05, 0xAF, 0x66, 0x82, + 0x0C, 0x90, 0x00, 0x29, 0x35, 0x82, 0x99, 0x9D, 0x81, 0x39, 0xC8, 0x81, + 0x19, 0xD8, 0xB9, 0x07, 0xF8, 0x07, 0x4D, 0x5A, 0xD6, 0x37, 0x73, 0xA9, + 0xF5, 0x04, 0x5A, 0x1B, 0x5E, 0xDD, 0x46, 0xDE, 0x64, 0x04, 0x45, 0x87, + 0x62, 0x58, 0xD3, 0x5A, 0xCC, 0x6B, 0x47, 0xBE, 0x5A, 0x18, 0xBE, 0x1D, + 0x8A, 0x3E, 0x69, 0xDD, 0xB1, 0xBD, 0x8A, 0x26, 0x65, 0x8D, 0x1E, 0x68, + 0x8E, 0x46, 0x48, 0x8F, 0x8E, 0xDA, 0x3D, 0xED, 0xE1, 0x73, 0x2D, 0x69, + 0xD5, 0x22, 0x5B, 0x96, 0xB6, 0x6C, 0xEB, 0x70, 0x0C, 0x4F, 0x08, 0x00, + 0x3C, 0x40, 0x04, 0x24, 0x43, 0x83, 0x36, 0xB0, 0x2A, 0xFE, 0xF0, 0x60, + 0xAA, 0x2A, 0x4E, 0x13, 0x14, 0xE8, 0x00, 0x10, 0xD8, 0xDB, 0x30, 0x60, + 0x00, 0x02, 0xC8, 0x81, 0x51, 0x58, 0x19, 0xAF, 0x9E, 0x6A, 0x53, 0x08, + 0x86, 0x60, 0x48, 0x6A, 0xA5, 0x1E, 0x86, 0xA8, 0x8E, 0xEA, 0xB0, 0x16, + 0x06, 0x61, 0x90, 0x6A, 0x77, 0xE1, 0x01, 0x6D, 0x48, 0xA4, 0x65, 0x78, + 0x63, 0x21, 0x10, 0x86, 0x5C, 0x00, 0xEB, 0xD9, 0xBE, 0x02, 0x03, 0xA8, + 0x00, 0x4F, 0x88, 0x85, 0x68, 0xD0, 0x01, 0x01, 0x98, 0x83, 0x1D, 0xD8, + 0x39, 0xC7, 0xD9, 0x01, 0xD5, 0xD3, 0x89, 0x4A, 0xFC, 0x59, 0xBB, 0x46, + 0x09, 0x81, 0x6E, 0xE4, 0xD5, 0xD5, 0xEB, 0xBD, 0xBE, 0x4F, 0x72, 0x0D, + 0x6C, 0xDB, 0x69, 0x53, 0x9A, 0x5C, 0xAD, 0x25, 0x9C, 0xC4, 0xC3, 0x9E, + 0x6B, 0xBA, 0x16, 0x41, 0xD6, 0xDD, 0xE8, 0x4E, 0x66, 0xE1, 0x74, 0x7D, + 0x6F, 0x4E, 0x9E, 0x6C, 0xCA, 0xBE, 0xEC, 0xFB, 0x86, 0x92, 0x27, 0x5C, + 0x80, 0x42, 0x90, 0x84, 0x42, 0xF8, 0xEC, 0xE3, 0xFC, 0x9A, 0xEF, 0xF8, + 0x92, 0xAA, 0xE0, 0x80, 0x50, 0x85, 0x22, 0x0E, 0x88, 0x00, 0x2B, 0x78, + 0x85, 0x52, 0xC0, 0x01, 0x21, 0xD8, 0x85, 0x5C, 0x08, 0x6B, 0xA6, 0x4E, + 0x6A, 0xDC, 0xBE, 0xED, 0x0A, 0x7F, 0x6A, 0xA6, 0xA6, 0xED, 0xB0, 0xAE, + 0xB1, 0x83, 0x8A, 0x85, 0x20, 0xD8, 0x81, 0x22, 0xA0, 0x6D, 0x53, 0x10, + 0x06, 0x5F, 0x08, 0x86, 0x1E, 0x80, 0x9C, 0x37, 0x0E, 0x02, 0x42, 0xDA, + 0x36, 0xB6, 0x8E, 0x98, 0x6B, 0xD8, 0x09, 0xF5, 0xCE, 0x6E, 0xE0, 0xB5, + 0xE1, 0x73, 0x28, 0x87, 0x73, 0x90, 0x56, 0x5A, 0xB1, 0xF1, 0x71, 0xD8, + 0xEB, 0x70, 0x70, 0x30, 0xD5, 0x95, 0x71, 0x25, 0x81, 0xDE, 0x61, 0x54, + 0xBA, 0x9C, 0x18, 0xC6, 0xDB, 0xFB, 0x67, 0xED, 0x16, 0x5A, 0x0E, 0x16, + 0xFE, 0xDA, 0x2F, 0x6D, 0xE1, 0x25, 0x4F, 0x72, 0xE7, 0x25, 0x38, 0x63, + 0x19, 0x62, 0xFC, 0xA6, 0x72, 0xE7, 0x70, 0x0C, 0x57, 0x08, 0x00, 0x35, + 0x88, 0x04, 0x20, 0x42, 0x83, 0xA9, 0x30, 0x83, 0x15, 0x98, 0x0A, 0xE0, + 0x74, 0x01, 0x14, 0xE0, 0x80, 0x30, 0x90, 0x4D, 0x7D, 0x7E, 0x85, 0x6B, + 0x28, 0x05, 0x6C, 0x50, 0xE7, 0x5B, 0xC8, 0x85, 0xDD, 0x66, 0xEA, 0x0A, + 0xB7, 0x70, 0x39, 0xCF, 0xED, 0x0C, 0xE7, 0x66, 0x6F, 0xBE, 0xA6, 0xF1, + 0xBC, 0x82, 0xDB, 0xBE, 0x85, 0xD9, 0x1E, 0x86, 0x5B, 0xB0, 0x80, 0x04, + 0xFF, 0xEA, 0x0A, 0x58, 0xEB, 0x88, 0x51, 0x19, 0x65, 0x25, 0xF2, 0x37, + 0xF3, 0x67, 0x41, 0x63, 0xEF, 0xE0, 0xA5, 0x71, 0x11, 0xB4, 0x71, 0x1A, + 0x1F, 0x68, 0x74, 0x80, 0x45, 0x80, 0x16, 0xEC, 0x89, 0xA6, 0xE8, 0xCA, + 0x16, 0x8A, 0x4D, 0x5B, 0xF4, 0xE0, 0xBD, 0x61, 0xC0, 0xD6, 0x71, 0xE1, + 0xE5, 0x5D, 0x53, 0x0E, 0x5A, 0xDE, 0xED, 0x64, 0x24, 0x7C, 0x29, 0xDD, + 0xA9, 0xF2, 0x55, 0x57, 0x0A, 0x6F, 0x90, 0x00, 0x0F, 0xF0, 0x25, 0x20, + 0x22, 0xB2, 0xC5, 0x3B, 0x83, 0xC6, 0x03, 0x1F, 0x22, 0xFA, 0xE5, 0x1B, + 0xE0, 0x1F, 0x78, 0xA8, 0x85, 0x57, 0x00, 0x07, 0x57, 0x60, 0x02, 0x5E, + 0x40, 0xEA, 0x09, 0xA7, 0xF3, 0xDB, 0xB6, 0xED, 0x39, 0xBF, 0xF0, 0x08, + 0xE7, 0x05, 0x85, 0xBE, 0x02, 0x09, 0x8F, 0xF3, 0xB0, 0x66, 0x02, 0x26, + 0x50, 0x6A, 0x26, 0x30, 0x82, 0x1C, 0x48, 0x44, 0xFA, 0x7A, 0x85, 0x9E, + 0xF0, 0xD9, 0xC4, 0x76, 0xD6, 0x6E, 0x27, 0x9A, 0x1A, 0x1F, 0xA1, 0x19, + 0x1F, 0xA1, 0xD5, 0x41, 0x07, 0x62, 0x81, 0x61, 0xE4, 0xC8, 0xF4, 0xD2, + 0x4C, 0x0A, 0x18, 0x3F, 0x48, 0x8D, 0x36, 0x07, 0x91, 0x1E, 0x68, 0x46, + 0xBE, 0xE1, 0xDE, 0xFE, 0x9D, 0xF7, 0xDE, 0x15, 0x5B, 0x44, 0x65, 0xF5, + 0x7C, 0x3F, 0x0A, 0x7C, 0x90, 0x07, 0x21, 0x18, 0x00, 0x3C, 0x90, 0x84, + 0x48, 0xC0, 0xAA, 0xFC, 0xAB, 0xF5, 0xEF, 0x49, 0x01, 0xE8, 0x8C, 0x81, + 0x0A, 0xA8, 0x85, 0x76, 0x90, 0x07, 0x78, 0xB0, 0x82, 0x26, 0xF8, 0x85, + 0x5F, 0x68, 0x02, 0xA6, 0xEE, 0xE6, 0x63, 0xA7, 0x73, 0x3F, 0x9F, 0x6D, + 0xD8, 0xAE, 0x6D, 0x3B, 0xCF, 0x05, 0xA4, 0xEE, 0xE6, 0x6D, 0xF6, 0x73, + 0x61, 0xD8, 0x66, 0x63, 0xC0, 0x02, 0x7E, 0x82, 0x18, 0x1C, 0x88, 0x80, + 0x04, 0x63, 0x2D, 0xF5, 0x96, 0x61, 0xFE, 0x94, 0x71, 0x19, 0xAF, 0x71, + 0x62, 0x81, 0x30, 0xA2, 0x09, 0xF7, 0x4F, 0x56, 0xAD, 0x7A, 0x95, 0x0E, + 0x76, 0xA7, 0xEB, 0xAB, 0xDD, 0xE4, 0x77, 0x1F, 0xEF, 0x9F, 0x07, 0xFA, + 0x7B, 0x3F, 0x6F, 0x7D, 0x27, 0xFA, 0xA0, 0xC8, 0x07, 0x7C, 0x18, 0x85, + 0x09, 0x60, 0x01, 0x49, 0x90, 0x84, 0x41, 0x80, 0xAE, 0xC2, 0x9B, 0x35, + 0xB0, 0xD1, 0x03, 0x33, 0x10, 0x81, 0x23, 0x20, 0x02, 0x6E, 0xE8, 0x07, + 0x79, 0x78, 0x07, 0x5A, 0x88, 0x88, 0xB3, 0xE8, 0x28, 0xA8, 0x2E, 0xF6, + 0x39, 0x37, 0xF6, 0x60, 0x40, 0xE8, 0x6C, 0xC6, 0x02, 0x08, 0x0F, 0x86, + 0x5C, 0xB8, 0x05, 0x2E, 0xD8, 0xE6, 0xB0, 0x06, 0x86, 0xB0, 0xBE, 0x85, + 0x14, 0x15, 0x06, 0x2E, 0x80, 0x80, 0x44, 0x3C, 0x5C, 0x7D, 0x7E, 0x71, + 0xC3, 0x36, 0xF2, 0xE3, 0x73, 0xF9, 0x70, 0x67, 0xD3, 0x41, 0x2B, 0xA1, + 0x6E, 0xFF, 0xDD, 0x73, 0x27, 0x4D, 0x94, 0xDE, 0x74, 0xA3, 0x50, 0x64, + 0x2F, 0x2D, 0x21, 0x50, 0x07, 0xFA, 0xC6, 0x0F, 0xEC, 0xD4, 0xA2, 0xD0, + 0xA2, 0x97, 0x7C, 0xA0, 0x78, 0x07, 0x51, 0x80, 0x80, 0x11, 0xF0, 0x25, + 0x0F, 0x55, 0x03, 0x5C, 0xFB, 0x9A, 0xFE, 0x49, 0x85, 0x01, 0x08, 0xC8, + 0x80, 0x0A, 0x38, 0x05, 0x75, 0x68, 0x07, 0x78, 0x90, 0x87, 0x5F, 0x80, + 0x5F, 0xFA, 0xD2, 0xE3, 0x0C, 0x20, 0x85, 0x60, 0x30, 0x86, 0x0A, 0x77, + 0x6A, 0x2C, 0x88, 0xFB, 0x2B, 0x3C, 0x68, 0x68, 0xBE, 0x82, 0x8E, 0xC7, + 0x0F, 0x26, 0x30, 0x85, 0xAF, 0x76, 0x73, 0x5E, 0x80, 0xF0, 0x6E, 0xF6, + 0x66, 0x2A, 0x80, 0x66, 0x1E, 0xD0, 0x63, 0x08, 0x18, 0x64, 0x37, 0xE3, + 0xB4, 0x93, 0x5E, 0xEF, 0xC5, 0x5C, 0xCF, 0x70, 0xB7, 0x48, 0x99, 0xFF, + 0x7B, 0x19, 0xFA, 0x5D, 0x7A, 0xDD, 0xD2, 0xA0, 0x70, 0x8C, 0x5B, 0xBE, + 0x6E, 0x2E, 0x8D, 0xF1, 0x92, 0xB6, 0x61, 0xED, 0x8E, 0x68, 0xC7, 0x7F, + 0xE1, 0x18, 0x7E, 0x89, 0x83, 0x9B, 0xFC, 0xF2, 0xD7, 0x09, 0x7E, 0x20, + 0x85, 0x0A, 0x50, 0x01, 0xA6, 0x47, 0x84, 0x29, 0xAA, 0x03, 0x68, 0xFA, + 0xE5, 0x12, 0x30, 0x00, 0x04, 0x88, 0x80, 0x1B, 0x80, 0x06, 0x77, 0xD8, + 0x87, 0x58, 0xC1, 0x06, 0xC7, 0xF1, 0x81, 0x42, 0x9E, 0x83, 0xA2, 0x03, + 0x88, 0x1D, 0x56, 0x84, 0x15, 0x1B, 0x76, 0xCB, 0x0A, 0x95, 0x0C, 0x19, + 0xA8, 0x30, 0x69, 0xC8, 0x43, 0x03, 0x13, 0x2B, 0x57, 0x6E, 0x5D, 0xA1, + 0x90, 0x81, 0xC9, 0x15, 0x2C, 0xB7, 0x76, 0xDD, 0xE2, 0xE5, 0xD1, 0x94, + 0x06, 0x88, 0xA4, 0x22, 0x3C, 0x80, 0x00, 0x04, 0x82, 0x27, 0x7D, 0x2A, + 0x57, 0xB2, 0x64, 0x99, 0xEF, 0xE5, 0xBC, 0x79, 0xF1, 0x66, 0xCE, 0x34, + 0x57, 0x93, 0xE6, 0x39, 0x73, 0xE5, 0xCE, 0xF1, 0x44, 0x67, 0xD3, 0x1C, + 0xD0, 0x78, 0x40, 0x73, 0xFE, 0xA4, 0x19, 0x6F, 0xDE, 0xCB, 0x7C, 0xFA, + 0x94, 0xB6, 0x6C, 0xEA, 0x74, 0xE9, 0xD3, 0xA8, 0x50, 0x61, 0xCA, 0x14, + 0x0A, 0xF4, 0x6A, 0x39, 0x73, 0x3C, 0xB3, 0x02, 0xE5, 0xFE, 0xAA, 0x33, + 0x2B, 0xD7, 0x72, 0x60, 0xBF, 0x7E, 0x15, 0x1B, 0x74, 0x66, 0xCC, 0xA4, + 0x2A, 0x99, 0x4A, 0x6D, 0xEB, 0xF6, 0x2D, 0xDC, 0xB8, 0x72, 0xE7, 0xD2, + 0xAD, 0x6B, 0xF7, 0x2E, 0xDE, 0xBC, 0x6F, 0xF7, 0xE9, 0x73, 0xB5, 0x23, + 0x06, 0x25, 0x49, 0x91, 0x10, 0xE1, 0x51, 0xA3, 0x06, 0x11, 0x99, 0x07, + 0x25, 0x33, 0x40, 0xD8, 0xD1, 0xED, 0xDE, 0x3E, 0x7C, 0xF9, 0xBE, 0xF5, + 0xC8, 0x11, 0x01, 0x47, 0x86, 0x1C, 0x73, 0x42, 0x0D, 0x89, 0x10, 0xA1, + 0xC9, 0x2E, 0x53, 0x14, 0x78, 0x64, 0xB0, 0x30, 0xBA, 0x82, 0x05, 0xD4, + 0x0F, 0x99, 0x50, 0xC1, 0xC2, 0x64, 0xF5, 0xC4, 0x5B, 0x1D, 0x83, 0xDD, + 0xBA, 0x40, 0x61, 0xA2, 0x95, 0x0A, 0x10, 0x82, 0x34, 0xE6, 0x1B, 0x95, + 0xED, 0xD2, 0x98, 0x31, 0x8D, 0xDE, 0x14, 0x5A, 0x7C, 0x28, 0xCF, 0xE3, + 0x39, 0xCF, 0x19, 0x4D, 0xAB, 0x14, 0xB8, 0x5B, 0xDF, 0x79, 0x93, 0x0E, + 0x37, 0x7E, 0x75, 0xA8, 0xCF, 0xAC, 0xE7, 0xCC, 0x5E, 0xEF, 0xEE, 0x95, + 0x6C, 0x77, 0x9B, 0x47, 0x91, 0xB2, 0x85, 0xAE, 0xF7, 0x3C, 0xFA, 0xF4, + 0xEA, 0xD7, 0xB3, 0x6F, 0x9F, 0xF7, 0x55, 0x91, 0x1A, 0x88, 0x24, 0x49, + 0x22, 0x2C, 0x28, 0xD2, 0x0B, 0x08, 0x0A, 0x6F, 0xE8, 0xC7, 0x31, 0xCD, + 0x1E, 0x3E, 0x7C, 0x5D, 0xE3, 0x89, 0x29, 0xDF, 0x34, 0x41, 0x1A, 0x04, + 0x10, 0xE8, 0xE0, 0x83, 0x0E, 0x04, 0x3C, 0x90, 0x01, 0x02, 0x37, 0xE0, + 0x70, 0xC4, 0x0D, 0x37, 0x94, 0x20, 0x82, 0x04, 0x72, 0xDC, 0x21, 0x82, + 0x10, 0x42, 0xD0, 0x80, 0xC5, 0x15, 0x17, 0xC9, 0x96, 0xC9, 0x28, 0xAC, + 0xF5, 0x00, 0xC1, 0x11, 0x16, 0x1C, 0x91, 0xC1, 0x0D, 0x44, 0x3C, 0x70, + 0x43, 0x3F, 0x6F, 0x25, 0x45, 0x15, 0x71, 0x35, 0x1A, 0x45, 0x8F, 0x51, + 0xFE, 0x3C, 0x15, 0x65, 0x94, 0x78, 0xE3, 0xA9, 0xE5, 0x9E, 0x5B, 0x54, + 0x55, 0x65, 0x55, 0x57, 0x44, 0x85, 0xA7, 0x13, 0x56, 0xD7, 0x8D, 0x95, + 0x24, 0x57, 0xE3, 0x91, 0x67, 0x1E, 0x90, 0x51, 0x4A, 0x39, 0x25, 0x95, + 0x55, 0xB6, 0x24, 0x5D, 0x5E, 0xDE, 0x60, 0x62, 0x83, 0x20, 0x81, 0x11, + 0x72, 0xC8, 0x21, 0x31, 0x58, 0x90, 0xC1, 0x15, 0x45, 0xE4, 0xD6, 0x58, + 0x29, 0xF6, 0x44, 0x96, 0xCF, 0x3B, 0xA5, 0x7C, 0x93, 0x0F, 0x11, 0x4D, + 0x90, 0x72, 0x45, 0x0F, 0xBA, 0x2D, 0x68, 0x00, 0x01, 0x79, 0x0A, 0x20, + 0x44, 0x0F, 0x3A, 0xFC, 0x70, 0xE1, 0x2A, 0x74, 0xD4, 0x10, 0xA3, 0x2B, + 0x3D, 0xF4, 0x70, 0x11, 0x13, 0x19, 0x44, 0xA0, 0xC3, 0x10, 0x12, 0x4C, + 0x00, 0x81, 0x08, 0x0C, 0x58, 0x80, 0xC0, 0x0E, 0x33, 0xEC, 0xF9, 0x0E, + 0x96, 0x4F, 0xBD, 0xB4, 0x54, 0x3E, 0xC3, 0x55, 0x67, 0x23, 0x4E, 0x35, + 0xE6, 0x04, 0xEA, 0x51, 0x6A, 0x41, 0x49, 0xE5, 0x73, 0x30, 0xF1, 0x78, + 0x24, 0xAB, 0xAD, 0xB2, 0x4A, 0xDC, 0x93, 0x6B, 0x59, 0x39, 0x2B, 0xAD, + 0xB5, 0xDA, 0x6A, 0xEB, 0x3E, 0x4D, 0x3C, 0x90, 0x86, 0x97, 0x7A, 0x98, + 0x00, 0x41, 0x05, 0x54, 0x18, 0x8A, 0x03, 0x0E, 0x28, 0x79, 0xD2, 0xCD, + 0x3E, 0xF2, 0xE4, 0x43, 0x8E, 0x2B, 0xE4, 0xCC, 0x63, 0x45, 0x0F, 0xA6, + 0x8C, 0x62, 0x05, 0x29, 0x4D, 0x44, 0x00, 0xC1, 0x0D, 0x0F, 0x48, 0x10, + 0x41, 0x05, 0xA4, 0x78, 0x8B, 0x89, 0x1C, 0x43, 0x04, 0xF2, 0xC3, 0x1C, + 0xB5, 0x94, 0xE2, 0x97, 0x06, 0x3C, 0xF4, 0x80, 0x40, 0x01, 0x2F, 0xDE, + 0xA0, 0x43, 0x04, 0x04, 0xE4, 0x40, 0x84, 0xA1, 0x41, 0x28, 0x0A, 0x41, + 0x11, 0xA7, 0x42, 0xB5, 0x96, 0x90, 0x32, 0xF9, 0x8B, 0x56, 0x3C, 0x38, + 0xA2, 0x35, 0x4F, 0xFE, 0x72, 0x43, 0xCE, 0x23, 0x30, 0xAC, 0x07, 0x93, + 0x77, 0x6B, 0x4B, 0x9D, 0x7E, 0x2A, 0x5E, 0x50, 0x11, 0xBB, 0x3A, 0xF1, + 0x75, 0x03, 0xCF, 0xC8, 0x30, 0xC6, 0x19, 0x6B, 0xBC, 0xB1, 0x5C, 0xAF, + 0x54, 0xD0, 0x40, 0x24, 0x94, 0xA8, 0x61, 0x02, 0x0E, 0x37, 0x18, 0xC0, + 0x84, 0x10, 0xA5, 0x05, 0x51, 0x81, 0x15, 0xA2, 0xC8, 0x92, 0x2C, 0x39, + 0xDE, 0x7C, 0x03, 0x4E, 0x3E, 0xB4, 0xE0, 0x60, 0x8A, 0x29, 0xAF, 0xE0, + 0x6C, 0x4A, 0x0E, 0x10, 0x20, 0x30, 0x41, 0x04, 0x41, 0xF0, 0x43, 0x0E, + 0x3D, 0xD8, 0x7C, 0xF3, 0xCA, 0x2B, 0xBF, 0xE0, 0xF2, 0x0B, 0x36, 0xD2, + 0x54, 0xF3, 0x4D, 0x05, 0x08, 0x20, 0x00, 0xC1, 0xA1, 0x19, 0x58, 0x81, + 0xC9, 0x65, 0xE7, 0xE2, 0xF2, 0x0E, 0x38, 0xBF, 0xE4, 0x50, 0x0A, 0x3D, + 0x52, 0x3D, 0xC7, 0xA9, 0xC3, 0x9E, 0xD2, 0x54, 0x15, 0x3D, 0xCC, 0x01, + 0x3C, 0xE4, 0xD9, 0x34, 0xF5, 0x18, 0xAB, 0xBE, 0x99, 0xB6, 0x97, 0x6A, + 0xD9, 0x3C, 0xC6, 0x33, 0xEA, 0x55, 0x37, 0xFD, 0xB4, 0x37, 0x91, 0x44, + 0xE6, 0x6D, 0x93, 0x70, 0x9B, 0xEA, 0xCB, 0x31, 0xE1, 0x85, 0x1B, 0x4E, + 0x65, 0x11, 0x09, 0xB4, 0xA0, 0x47, 0x0D, 0x33, 0xCC, 0xD0, 0x84, 0x04, + 0x16, 0x30, 0xD1, 0x03, 0x66, 0x19, 0x20, 0x4D, 0x0A, 0x3C, 0xFB, 0xC0, + 0xF3, 0x0B, 0x3D, 0x31, 0xD3, 0xC2, 0x44, 0x13, 0xB8, 0x7C, 0x83, 0xCD, + 0x2B, 0xA5, 0xBC, 0xD2, 0x04, 0x04, 0x06, 0x48, 0xE0, 0x03, 0x36, 0x44, + 0x63, 0x83, 0x4B, 0xE9, 0x4C, 0x93, 0xA3, 0x6C, 0x3E, 0xF4, 0x54, 0x40, + 0x00, 0x04, 0x18, 0x18, 0x6A, 0x81, 0x6C, 0x3D, 0x8C, 0xD9, 0x04, 0x38, + 0xD8, 0xBC, 0xF3, 0x4D, 0x0E, 0xAE, 0x28, 0x1B, 0x24, 0x75, 0x66, 0x1F, + 0x35, 0xDE, 0x4C, 0xF4, 0x38, 0x7F, 0xFE, 0xF7, 0xC0, 0xCD, 0x2F, 0x5F, + 0x95, 0x70, 0x0B, 0x43, 0x27, 0xB7, 0x95, 0xAA, 0x12, 0x77, 0x96, 0xDE, + 0xD6, 0x41, 0x6C, 0x95, 0x71, 0xE0, 0xF7, 0x68, 0xB1, 0xE0, 0xB2, 0x1E, + 0x7E, 0x3E, 0xFA, 0xE9, 0x9F, 0xE7, 0x8D, 0x04, 0x03, 0x44, 0xB0, 0x2D, + 0x26, 0xEC, 0x60, 0x62, 0x80, 0x15, 0xD4, 0x56, 0x90, 0x03, 0x2E, 0xB8, + 0x8C, 0x42, 0x0B, 0x3C, 0xEF, 0xA0, 0x43, 0x0E, 0x3C, 0xE0, 0x31, 0x8A, + 0x53, 0xF0, 0x60, 0x14, 0xC0, 0xF8, 0x06, 0x30, 0x70, 0x51, 0x0A, 0x53, + 0x38, 0x61, 0x02, 0x0F, 0xD8, 0x01, 0x39, 0xCE, 0x91, 0x36, 0xA5, 0xFD, + 0x02, 0x1C, 0xF4, 0x90, 0x87, 0x4C, 0xD0, 0x81, 0x0D, 0x47, 0x65, 0x00, + 0x07, 0x4C, 0xB8, 0x85, 0x06, 0x76, 0x51, 0x0C, 0x2C, 0x48, 0xAE, 0x14, + 0xD8, 0x90, 0x93, 0x37, 0x6E, 0xA0, 0x0A, 0x72, 0x38, 0x85, 0x29, 0xA9, + 0xE2, 0x94, 0x70, 0x9C, 0xB4, 0xB6, 0x21, 0x3D, 0xAF, 0x39, 0xD4, 0x9B, + 0x9E, 0x73, 0x36, 0xD5, 0x94, 0xC1, 0xB9, 0x67, 0x46, 0x31, 0x74, 0x1B, + 0xC4, 0xC6, 0x57, 0x93, 0xEF, 0xF5, 0xE8, 0x6F, 0xE1, 0x3B, 0xDB, 0xC5, + 0xD4, 0xA7, 0xC4, 0x25, 0x32, 0x31, 0x3A, 0xFA, 0x20, 0xC5, 0x04, 0x54, + 0x47, 0x84, 0x6C, 0xDC, 0x43, 0x15, 0x08, 0xE8, 0xC1, 0x15, 0xAE, 0x80, + 0x3A, 0x21, 0xE8, 0x22, 0x08, 0xB5, 0xF8, 0x05, 0xD7, 0xE8, 0x61, 0xC1, + 0x38, 0x4D, 0xCB, 0x84, 0xD8, 0xC0, 0x46, 0x2E, 0x70, 0x16, 0x81, 0x09, + 0xEC, 0x00, 0x1D, 0x16, 0xA4, 0x47, 0xF5, 0x08, 0x16, 0xBC, 0xA5, 0xBD, + 0x2F, 0x03, 0x1A, 0x30, 0x05, 0x2F, 0x26, 0x32, 0x0C, 0x61, 0xF4, 0x00, + 0x17, 0xC0, 0xB8, 0x05, 0x2E, 0x82, 0xE0, 0x0F, 0x1D, 0x84, 0x82, 0x85, + 0x62, 0xE3, 0x57, 0xD9, 0x3C, 0xE5, 0xAF, 0x45, 0xCA, 0xFE, 0x04, 0x47, + 0x70, 0x0C, 0xD8, 0x22, 0x99, 0x57, 0x3D, 0x1D, 0x52, 0x09, 0x7B, 0x9A, + 0xAA, 0xDE, 0xF2, 0x48, 0x55, 0x1C, 0x4D, 0x82, 0x2A, 0x70, 0x2E, 0x6C, + 0x22, 0x28, 0x43, 0xC9, 0xC4, 0x97, 0x88, 0xE2, 0x08, 0x3A, 0x90, 0x40, + 0x34, 0xB6, 0xA1, 0x0E, 0x75, 0x58, 0xE0, 0x02, 0xB7, 0x68, 0xC2, 0x28, + 0x28, 0x67, 0x05, 0x4F, 0xFC, 0xA2, 0x1A, 0xDE, 0x90, 0x07, 0x3C, 0xE4, + 0x41, 0x8F, 0x52, 0x90, 0xC9, 0x14, 0xB7, 0xF8, 0x86, 0x30, 0xB0, 0x21, + 0x0C, 0xD9, 0x44, 0xA0, 0x42, 0xD8, 0x40, 0x07, 0x32, 0x89, 0x96, 0x36, + 0x37, 0x02, 0x03, 0x18, 0xE0, 0xA0, 0xC5, 0x0C, 0x22, 0x60, 0x01, 0x2B, + 0x00, 0xC3, 0x23, 0xC2, 0x08, 0x46, 0x30, 0x1A, 0x92, 0x40, 0xFD, 0x89, + 0x42, 0x07, 0x60, 0x6C, 0x0B, 0xDD, 0xFA, 0xA5, 0xC8, 0x38, 0x0A, 0x07, + 0x47, 0x0A, 0x93, 0x24, 0x23, 0x4D, 0x85, 0xAA, 0xB8, 0x08, 0x89, 0x93, + 0x77, 0x53, 0x9B, 0x3B, 0x3B, 0x69, 0x3D, 0xF3, 0x89, 0xB2, 0x9E, 0xF6, + 0xDC, 0x98, 0x3C, 0x8C, 0x60, 0x84, 0x1C, 0xB0, 0x62, 0x1D, 0xAB, 0x54, + 0xC7, 0x0E, 0x20, 0xC0, 0x0B, 0x68, 0x59, 0xA1, 0x83, 0xAE, 0xE0, 0xC6, + 0x3E, 0xC0, 0x81, 0xC1, 0xB0, 0x55, 0xE3, 0x06, 0xB7, 0xC8, 0x85, 0x30, + 0x84, 0x01, 0x0E, 0x61, 0xE4, 0xA2, 0xA2, 0x37, 0x30, 0x02, 0x06, 0x46, + 0xB1, 0x34, 0x61, 0xC0, 0xA3, 0x86, 0xC8, 0x94, 0xA0, 0x2B, 0x4A, 0x22, + 0x84, 0x5B, 0x00, 0x23, 0xA2, 0xBB, 0x10, 0x86, 0x31, 0x48, 0xB1, 0xA2, + 0x1B, 0x44, 0x20, 0x07, 0x12, 0xC0, 0x01, 0x2D, 0x0E, 0xB9, 0x92, 0xE4, + 0x91, 0xB3, 0x7A, 0xE6, 0x64, 0x64, 0x4D, 0xC9, 0x59, 0xBE, 0x2B, 0x59, + 0x52, 0x53, 0x74, 0xD1, 0x17, 0xDD, 0x30, 0x39, 0xBD, 0xA3, 0xA4, 0x8D, + 0xFE, 0x79, 0x00, 0x6B, 0x5B, 0x26, 0x13, 0x96, 0xC3, 0x7D, 0xDD, 0xB3, + 0xA9, 0xE9, 0xDB, 0x87, 0x6F, 0x7A, 0x4A, 0x2B, 0x57, 0x60, 0x82, 0x51, + 0xF6, 0x58, 0x07, 0x3B, 0xD8, 0xD1, 0x0E, 0x55, 0x1C, 0xA1, 0x09, 0xC0, + 0x60, 0x51, 0x06, 0x2A, 0x40, 0x04, 0x68, 0xEC, 0x03, 0x80, 0xF3, 0x78, + 0x47, 0x3E, 0xE0, 0x91, 0x03, 0x2A, 0xDC, 0x22, 0xA2, 0x6E, 0xCD, 0xC4, + 0x2D, 0x98, 0xF0, 0x00, 0x02, 0x4C, 0x00, 0x07, 0x11, 0x50, 0xD7, 0x12, + 0x84, 0xD0, 0x04, 0x21, 0xA0, 0x8C, 0x4F, 0x3E, 0xA3, 0x16, 0x2E, 0x72, + 0x81, 0x0B, 0x61, 0x78, 0x64, 0x8F, 0x16, 0x30, 0x40, 0x01, 0x26, 0x40, + 0x00, 0x09, 0x58, 0xA1, 0x1B, 0x3E, 0x9D, 0xE9, 0x8C, 0x3A, 0x55, 0xB6, + 0xBA, 0x61, 0x30, 0xA7, 0x96, 0x75, 0x0E, 0x53, 0xF1, 0x92, 0x0F, 0x7C, + 0xA8, 0x27, 0xA8, 0x49, 0x45, 0x1B, 0x3A, 0x1E, 0x59, 0x23, 0xB6, 0x65, + 0x52, 0x79, 0x9E, 0xCC, 0xAC, 0x53, 0x53, 0x5B, 0xB8, 0xF2, 0x6C, 0x0C, + 0x1F, 0xAE, 0xF0, 0x84, 0x11, 0xA2, 0xB1, 0x0F, 0x7F, 0xDA, 0x83, 0x1C, + 0xB5, 0xC0, 0x8C, 0x30, 0x4A, 0x11, 0x35, 0x0B, 0x14, 0xA1, 0x1F, 0x65, + 0x95, 0xC7, 0x3B, 0x8E, 0x67, 0x0A, 0x52, 0xE0, 0xCC, 0xAD, 0xC3, 0xBC, + 0x82, 0x13, 0x78, 0xC0, 0x83, 0x1B, 0x58, 0xE0, 0x06, 0xBA, 0x41, 0x80, + 0x01, 0x30, 0xD0, 0x41, 0x1C, 0x5C, 0x40, 0x20, 0xF5, 0x2B, 0x05, 0x29, + 0x4A, 0x51, 0x52, 0x8F, 0x04, 0xC3, 0x18, 0x86, 0xEA, 0x41, 0x13, 0xD4, + 0xC1, 0x0F, 0x7D, 0xEC, 0x83, 0x87, 0x9F, 0x8C, 0x2C, 0x39, 0xE5, 0x41, + 0x54, 0x38, 0x92, 0x27, 0x2D, 0x48, 0xD1, 0x69, 0x12, 0xCF, 0xC3, 0xC3, + 0xB9, 0xA0, 0xB7, 0x3A, 0xD4, 0xE3, 0x89, 0xC1, 0x4C, 0xFB, 0x29, 0x58, + 0x39, 0x49, 0x9D, 0xFE, 0xF4, 0x54, 0x2D, 0x80, 0x35, 0x26, 0x55, 0x2B, + 0xED, 0xA3, 0x1A, 0x44, 0x98, 0x83, 0x36, 0xF6, 0x71, 0x8F, 0x74, 0xDC, + 0xE3, 0x1E, 0xEB, 0x18, 0x05, 0x04, 0x6E, 0x61, 0x0C, 0x60, 0x08, 0x01, + 0x02, 0xA3, 0x50, 0x53, 0x3B, 0x70, 0x49, 0x8F, 0x97, 0xD0, 0xA3, 0x1A, + 0x58, 0xCC, 0x45, 0x5B, 0x2B, 0x4A, 0x11, 0x8A, 0x42, 0xB4, 0xA2, 0x25, + 0xE6, 0x45, 0x30, 0x0C, 0x92, 0x8B, 0x66, 0x0E, 0x97, 0x14, 0xF5, 0x2B, + 0x69, 0x44, 0x53, 0x2C, 0x0C, 0x26, 0x60, 0xA1, 0x09, 0x61, 0x93, 0x29, + 0xD9, 0x10, 0x99, 0xC3, 0x79, 0xE8, 0x92, 0xBD, 0x3C, 0x76, 0xEF, 0x7B, + 0x83, 0xEC, 0xB0, 0x24, 0xCE, 0x37, 0x3A, 0xE7, 0xE8, 0x2C, 0x22, 0xEB, + 0x16, 0xC3, 0xEA, 0x98, 0x73, 0x60, 0xFF, 0x42, 0x67, 0x69, 0x03, 0xC7, + 0xA9, 0x00, 0x53, 0xB9, 0xCA, 0xE8, 0xD9, 0x87, 0x35, 0x86, 0x80, 0x0A, + 0x59, 0x34, 0x98, 0x1D, 0xF6, 0xB0, 0x87, 0x3A, 0xFA, 0x11, 0x04, 0x1E, + 0x4C, 0x18, 0x1B, 0x3B, 0x70, 0x05, 0x80, 0xE4, 0x91, 0x2C, 0x5D, 0x6E, + 0x36, 0x1F, 0xA3, 0xB8, 0x02, 0x29, 0x84, 0x61, 0x8A, 0x4C, 0x80, 0xD8, + 0xC4, 0x26, 0xE6, 0x05, 0x44, 0x87, 0x31, 0x8C, 0x14, 0xF3, 0x82, 0xA4, + 0x48, 0xB3, 0xC2, 0x28, 0x82, 0xD0, 0x83, 0x52, 0x08, 0x03, 0x1D, 0xD8, + 0x4C, 0xF1, 0x15, 0x78, 0x60, 0x05, 0x43, 0x06, 0x09, 0xB2, 0x3E, 0xF4, + 0x61, 0xE7, 0x94, 0xE9, 0xBC, 0x0B, 0xBE, 0x37, 0xB2, 0x30, 0xB1, 0x74, + 0x66, 0x07, 0xEC, 0x14, 0x5F, 0xEC, 0xE2, 0xC8, 0x33, 0x8D, 0x8A, 0xA6, + 0xCD, 0x27, 0x4E, 0x48, 0x36, 0xF2, 0x5F, 0x31, 0x69, 0x32, 0x3A, 0x4D, + 0x3D, 0x49, 0x1D, 0x16, 0xD9, 0xCA, 0xAE, 0xBE, 0x4B, 0xA8, 0x31, 0xA6, + 0x94, 0x52, 0x78, 0x62, 0x15, 0xB2, 0xFE, 0x58, 0x87, 0x82, 0xEF, 0x61, + 0x8F, 0x76, 0x74, 0x43, 0x1A, 0x38, 0x18, 0x08, 0x2E, 0x88, 0x40, 0x0B, + 0x7B, 0xF0, 0x03, 0x53, 0x17, 0x54, 0xD6, 0x3E, 0xE8, 0x51, 0x0B, 0xE2, + 0xE6, 0xA2, 0x09, 0x21, 0x36, 0x05, 0x88, 0xA1, 0x5D, 0xD1, 0x43, 0x63, + 0x73, 0xCF, 0x2C, 0x2E, 0x42, 0xE8, 0x84, 0xA0, 0xAE, 0xC1, 0x1A, 0xE3, + 0x9A, 0x29, 0x4E, 0x14, 0x36, 0xE8, 0x4B, 0x36, 0x4B, 0x47, 0xB6, 0xBC, + 0x0B, 0xA5, 0x07, 0x3C, 0x72, 0x48, 0x9D, 0x8B, 0x51, 0xF2, 0x2E, 0xE7, + 0x00, 0x83, 0x2F, 0xD0, 0x31, 0x8F, 0xF5, 0xF8, 0x10, 0x93, 0x4B, 0x8E, + 0xE3, 0xDD, 0xC8, 0x19, 0x65, 0x1C, 0xB2, 0xFB, 0xD5, 0xFE, 0xFE, 0xB7, + 0x54, 0xA0, 0x1A, 0x0A, 0x56, 0xF8, 0x60, 0x1D, 0xD1, 0x68, 0xB0, 0xAE, + 0xD3, 0xD1, 0x0D, 0x6A, 0xD4, 0xE2, 0x01, 0x57, 0x10, 0x86, 0x15, 0x68, + 0xB1, 0x8F, 0xE0, 0x4E, 0x1C, 0x1E, 0x69, 0x7D, 0x09, 0x37, 0x88, 0xEB, + 0x8A, 0x39, 0xD9, 0xB9, 0xA2, 0xDE, 0x0E, 0x46, 0x9D, 0xB1, 0x60, 0x85, + 0x86, 0xD4, 0xAF, 0x07, 0xAF, 0x80, 0x1D, 0x29, 0x46, 0xA1, 0xDD, 0x8F, + 0x07, 0x63, 0xC6, 0x39, 0x18, 0xAF, 0x8C, 0xC6, 0x26, 0x38, 0x72, 0xD7, + 0xCE, 0x79, 0x54, 0xA1, 0xB9, 0xA9, 0xDA, 0x7D, 0x97, 0x78, 0xF8, 0xA2, + 0x17, 0xBD, 0x30, 0x06, 0x73, 0xC6, 0x81, 0x8E, 0x71, 0x00, 0x23, 0xDC, + 0x7A, 0xA1, 0x69, 0x39, 0x9D, 0x54, 0x53, 0xA5, 0x5F, 0x16, 0x6E, 0xA8, + 0x05, 0xF8, 0xAC, 0x62, 0x0D, 0xF5, 0xBC, 0xF0, 0x85, 0x1B, 0x40, 0x08, + 0x02, 0x26, 0xAE, 0xAA, 0x8E, 0x06, 0xDB, 0xC3, 0xC1, 0xD0, 0x80, 0x87, + 0x27, 0x5E, 0x8A, 0x83, 0x26, 0xB8, 0x03, 0x1F, 0xFC, 0xD8, 0x07, 0x3F, + 0x74, 0xF9, 0x0E, 0x78, 0xE8, 0x83, 0x1E, 0xDF, 0x28, 0xFE, 0xC5, 0x28, + 0x44, 0xE1, 0x4B, 0x3C, 0x53, 0xB4, 0xE5, 0xD7, 0x34, 0x48, 0x13, 0xF2, + 0x2E, 0x27, 0x51, 0x04, 0xE1, 0x06, 0x5E, 0xFD, 0x86, 0xD2, 0x60, 0x07, + 0xD1, 0x18, 0xCB, 0x98, 0x07, 0x4D, 0x88, 0xB5, 0xCC, 0xD9, 0x6D, 0x69, + 0xA4, 0x28, 0x6B, 0xC7, 0xB4, 0xCB, 0xF1, 0x0B, 0xED, 0x92, 0x0F, 0xAD, + 0x14, 0xC3, 0xE7, 0xC6, 0xF8, 0x79, 0x2F, 0xC0, 0xA0, 0x79, 0x24, 0x60, + 0x41, 0xEA, 0x2D, 0x1C, 0xF7, 0x7B, 0x9D, 0xD7, 0xF4, 0xD1, 0xAF, 0xDA, + 0xBF, 0x53, 0xBF, 0x95, 0x37, 0x60, 0x7E, 0xFA, 0xF6, 0xF0, 0x63, 0x14, + 0xA3, 0xA8, 0x00, 0x2A, 0x66, 0xBB, 0x0E, 0x84, 0xA7, 0x52, 0x1D, 0xBA, + 0x18, 0x45, 0x11, 0x74, 0x40, 0xAC, 0x69, 0xEC, 0x03, 0x40, 0xFC, 0xC0, + 0x87, 0xB2, 0x58, 0xF8, 0x0B, 0x5A, 0x90, 0xA3, 0x14, 0x58, 0x74, 0x42, + 0x16, 0x41, 0x7C, 0x0B, 0x27, 0x34, 0xA4, 0x07, 0x42, 0xC0, 0x84, 0x28, + 0x6A, 0xE1, 0x58, 0x7D, 0xD8, 0xC3, 0x13, 0x56, 0x58, 0x1A, 0x02, 0x0F, + 0x88, 0x8B, 0x87, 0x0A, 0x63, 0x17, 0x29, 0x1E, 0x06, 0x2F, 0x7A, 0x40, + 0x0D, 0xB8, 0xB0, 0x7A, 0x2A, 0x90, 0x9F, 0x79, 0x64, 0x31, 0x88, 0xF3, + 0x4F, 0xC7, 0xE5, 0x98, 0xC5, 0xF0, 0x45, 0xCF, 0x2D, 0x4F, 0x8C, 0x5E, + 0xCC, 0xBF, 0xE7, 0x9A, 0xCF, 0x02, 0x15, 0x6E, 0x5C, 0x17, 0x17, 0xCE, + 0xA8, 0xA3, 0x3E, 0x9E, 0x6C, 0xA5, 0x91, 0x9E, 0x27, 0x51, 0x52, 0xAB, + 0xAD, 0xDE, 0x7A, 0xF0, 0x03, 0xDB, 0x19, 0xE0, 0x7A, 0xC0, 0x83, 0x35, + 0x78, 0x03, 0x2D, 0x08, 0xC0, 0x2A, 0xDC, 0x43, 0x34, 0xB0, 0x02, 0x33, + 0xAC, 0x83, 0x3B, 0x6C, 0x03, 0x2D, 0x68, 0x83, 0x36, 0x78, 0x82, 0x10, + 0x78, 0x02, 0x2D, 0x88, 0x82, 0x2B, 0xD4, 0x83, 0x37, 0xAC, 0x1D, 0x3E, + 0xFE, 0x6C, 0xD8, 0x86, 0x5D, 0x43, 0x11, 0x30, 0xCD, 0x37, 0x08, 0xC1, + 0x0E, 0xF0, 0x80, 0xE4, 0xF4, 0x00, 0x13, 0xD8, 0xC2, 0x28, 0x60, 0x82, + 0x2A, 0x6C, 0xDC, 0x2B, 0x64, 0x43, 0x3D, 0xF4, 0x9E, 0x3D, 0x74, 0x43, + 0x13, 0x98, 0x02, 0x2E, 0x9C, 0x11, 0x10, 0xEE, 0xC2, 0x49, 0xE5, 0xC2, + 0x15, 0xF0, 0x82, 0x30, 0x5C, 0xC1, 0x28, 0x78, 0x83, 0x5C, 0xB0, 0x1A, + 0xDD, 0xF0, 0x4B, 0xE3, 0x25, 0x05, 0x67, 0x95, 0x0F, 0xFA, 0x99, 0x5F, + 0xC7, 0x50, 0x81, 0xE6, 0xF9, 0x1C, 0xFD, 0x15, 0x03, 0x31, 0x6C, 0x21, + 0xE6, 0x81, 0x41, 0x16, 0x64, 0x81, 0x29, 0x78, 0x9E, 0xA6, 0x50, 0x47, + 0x3C, 0xD0, 0x54, 0xBF, 0x0C, 0x59, 0x7B, 0x3D, 0x5A, 0xA5, 0x29, 0x9E, + 0xE1, 0x88, 0xA1, 0x02, 0xBE, 0x21, 0x79, 0x29, 0x05, 0x2D, 0x10, 0x00, + 0x2A, 0x2C, 0x18, 0x3B, 0x44, 0x03, 0x32, 0x6C, 0x5D, 0x36, 0xD0, 0x42, + 0x35, 0x84, 0x42, 0x13, 0x04, 0xC1, 0x28, 0xE8, 0x03, 0x0E, 0xFE, 0x1E, + 0xDA, 0xC9, 0x83, 0x9A, 0x85, 0x4D, 0x29, 0x58, 0x41, 0xD2, 0xD0, 0xC2, + 0x28, 0xBC, 0x42, 0x07, 0x36, 0x41, 0x11, 0x90, 0x82, 0x37, 0x54, 0x03, + 0x38, 0xC0, 0x83, 0x37, 0xA8, 0x09, 0x54, 0x41, 0x55, 0x3B, 0xB8, 0x82, + 0x10, 0xE0, 0x40, 0x05, 0xC8, 0x09, 0xD2, 0xB4, 0x15, 0x61, 0xBD, 0x12, + 0x17, 0xF0, 0x40, 0x29, 0xC4, 0xDC, 0x54, 0x4C, 0xE1, 0xB8, 0x71, 0x8A, + 0x64, 0x5C, 0x9A, 0xE2, 0xBD, 0x50, 0x01, 0xAE, 0xC4, 0x39, 0x5C, 0x01, + 0x17, 0x68, 0x5E, 0xFC, 0x69, 0xE1, 0x16, 0x16, 0xC3, 0xE5, 0x71, 0x41, + 0x16, 0x5C, 0x81, 0x3C, 0x34, 0xDA, 0x63, 0x85, 0xD3, 0x64, 0x49, 0xD6, + 0x93, 0xAC, 0x1B, 0x31, 0xBA, 0x62, 0x1A, 0xE6, 0x98, 0x4B, 0xC0, 0x21, + 0x33, 0xDA, 0x93, 0xFE, 0x37, 0x18, 0x40, 0x0E, 0xD4, 0xC3, 0x3A, 0xD4, + 0x03, 0x3B, 0x40, 0x03, 0x34, 0x44, 0x43, 0x37, 0xB8, 0x83, 0x3D, 0x40, + 0x43, 0x32, 0x60, 0xC2, 0x28, 0xB8, 0xC3, 0x3E, 0xA4, 0x43, 0xEF, 0xA9, + 0xD9, 0xD0, 0xE4, 0x43, 0xDA, 0xC9, 0x83, 0x28, 0x98, 0x4E, 0xD2, 0xFC, + 0xC2, 0x2B, 0x9C, 0x03, 0x36, 0xFC, 0xC2, 0x37, 0x90, 0x03, 0x39, 0xBC, + 0x03, 0x37, 0xF4, 0x03, 0x3E, 0x40, 0x06, 0x54, 0xED, 0x5A, 0x37, 0x78, + 0x03, 0xDF, 0x45, 0xC0, 0x01, 0x58, 0x00, 0x0E, 0xF0, 0x00, 0x13, 0x18, + 0x21, 0x45, 0x51, 0x01, 0x0E, 0x64, 0x4E, 0xC0, 0x3D, 0x07, 0x5F, 0x48, + 0xE1, 0x94, 0x09, 0xA3, 0x39, 0x22, 0x9B, 0x3A, 0x49, 0xE1, 0xD8, 0xB0, + 0xD3, 0x3C, 0xE8, 0xC2, 0x2E, 0xF0, 0x02, 0x17, 0xF4, 0x9C, 0x31, 0x10, + 0x43, 0x31, 0x74, 0xE4, 0x16, 0xFA, 0x02, 0x18, 0x60, 0x41, 0xD8, 0xC4, + 0xA2, 0x4F, 0xE1, 0x9C, 0x49, 0x9E, 0xA4, 0x31, 0x52, 0x61, 0x33, 0xAE, + 0xE4, 0x32, 0xAA, 0x4F, 0x5A, 0xF5, 0x83, 0x4B, 0x61, 0x02, 0x26, 0x0C, + 0x81, 0x0E, 0xD8, 0xC0, 0x0D, 0xCC, 0x80, 0x0E, 0x18, 0xC1, 0x1C, 0x9C, + 0x8B, 0x4C, 0x22, 0x94, 0x3D, 0xB8, 0xC3, 0x3B, 0xD8, 0xC3, 0x4B, 0xCC, + 0x63, 0xD1, 0xD0, 0x03, 0x3E, 0x58, 0x81, 0x37, 0xE0, 0x83, 0xE8, 0x60, + 0xC3, 0xB2, 0xE9, 0x02, 0x3D, 0xF4, 0x03, 0x39, 0x5C, 0x83, 0x3D, 0x06, + 0x48, 0x26, 0xDA, 0x83, 0x37, 0xB4, 0x83, 0x3A, 0xEC, 0x61, 0x2D, 0xE0, + 0x1E, 0x11, 0x78, 0x82, 0x07, 0xDD, 0x02, 0x16, 0x38, 0xDF, 0x37, 0xBC, + 0x03, 0x53, 0x61, 0x49, 0x79, 0x41, 0x95, 0xAC, 0xF0, 0xDF, 0xA7, 0x9D, + 0xD7, 0x49, 0xEE, 0x0B, 0x49, 0xB2, 0x44, 0xC0, 0x60, 0x43, 0x31, 0x78, + 0xA1, 0xCF, 0x71, 0x24, 0x2E, 0x1A, 0xFE, 0x03, 0x48, 0x1A, 0xC3, 0xD3, + 0xFD, 0x54, 0x5A, 0x86, 0x53, 0x4C, 0xE0, 0x43, 0x19, 0xA2, 0x64, 0x5B, + 0x7E, 0x12, 0x4B, 0x16, 0x66, 0xFA, 0xE4, 0xC3, 0x3E, 0xFC, 0x42, 0x10, + 0xCC, 0x40, 0x03, 0x28, 0xC0, 0x02, 0x2C, 0x80, 0x07, 0x7C, 0xC0, 0x07, + 0xA8, 0xC0, 0x09, 0x84, 0xC0, 0x07, 0x70, 0x00, 0x03, 0x48, 0x00, 0x4E, + 0x8A, 0x42, 0x3B, 0x40, 0x55, 0x3D, 0x14, 0x9B, 0x3E, 0xAC, 0x1D, 0x3C, + 0x74, 0x8D, 0x3C, 0x78, 0x43, 0x29, 0x2C, 0xCB, 0x2B, 0x00, 0xDE, 0xB4, + 0xF0, 0xCF, 0x3B, 0x90, 0x43, 0xB2, 0x50, 0x25, 0x54, 0xDD, 0x83, 0x3B, + 0xF4, 0x03, 0x35, 0x54, 0x43, 0x2D, 0x88, 0xC2, 0x29, 0x54, 0x03, 0x29, + 0xA8, 0x82, 0x2A, 0x34, 0x01, 0x78, 0x09, 0x41, 0x0E, 0x24, 0xA0, 0x53, + 0xBC, 0xA6, 0x64, 0xC4, 0xE1, 0x52, 0x94, 0x55, 0x13, 0xE6, 0x83, 0x21, + 0xA6, 0xD5, 0x05, 0xA1, 0x1B, 0x3E, 0x3C, 0xE7, 0x4B, 0xB4, 0x62, 0xCE, + 0xED, 0x65, 0xC3, 0xB4, 0xC4, 0x3C, 0x88, 0x43, 0xFC, 0x65, 0x1E, 0x17, + 0xF4, 0x82, 0x2E, 0xBE, 0x9F, 0x08, 0x61, 0xA1, 0x31, 0x70, 0x56, 0x75, + 0x3E, 0x45, 0xA6, 0x48, 0xE4, 0xB8, 0x41, 0x21, 0x1C, 0xAD, 0x9F, 0x60, + 0x12, 0xA6, 0x61, 0xB6, 0x27, 0xFA, 0xE0, 0x43, 0x10, 0x28, 0x40, 0x03, + 0xA0, 0x40, 0x0B, 0x9C, 0x41, 0x1B, 0x9C, 0xC1, 0x1A, 0xAC, 0x41, 0x19, + 0xB8, 0x41, 0x1E, 0xE4, 0xC1, 0x1B, 0xC0, 0x40, 0x18, 0xB4, 0x00, 0x0A, + 0x8C, 0xC0, 0x0F, 0x34, 0x81, 0x3F, 0x40, 0x55, 0x80, 0xF0, 0xC3, 0x3C, + 0x90, 0x03, 0x38, 0x90, 0xC3, 0x2F, 0xC0, 0x03, 0x36, 0xC0, 0x11, 0x05, + 0x89, 0x82, 0x15, 0xFC, 0x1A, 0x2D, 0x84, 0x8D, 0x9A, 0xA1, 0x25, 0x54, + 0xA9, 0x03, 0xB2, 0xB4, 0x03, 0x2D, 0xD0, 0x02, 0x42, 0xFE, 0xE9, 0x02, + 0x37, 0xD8, 0x03, 0x3C, 0x24, 0x18, 0x2E, 0x1C, 0x01, 0x37, 0x0C, 0x67, + 0xDA, 0x15, 0xE7, 0x4C, 0xF1, 0xC3, 0x37, 0x88, 0xC2, 0x5E, 0x95, 0x02, + 0xDB, 0x31, 0x85, 0x3C, 0xE0, 0xC3, 0x3C, 0x20, 0xE0, 0x72, 0x26, 0x45, + 0x79, 0x75, 0xCA, 0x73, 0x8A, 0x1A, 0xBF, 0x04, 0x49, 0x3C, 0xCC, 0x1F, + 0x16, 0x66, 0xDE, 0x15, 0xFA, 0x9C, 0x2F, 0x50, 0xC1, 0x06, 0x50, 0x41, + 0x2D, 0x82, 0x41, 0x2F, 0x78, 0x9A, 0x3E, 0x04, 0x48, 0x8F, 0xF2, 0x25, + 0x1B, 0x32, 0xE1, 0x79, 0xBE, 0xE2, 0x14, 0x4E, 0xA4, 0xCE, 0xB9, 0xA7, + 0x96, 0xB6, 0x47, 0xA8, 0x71, 0x83, 0x0F, 0x34, 0x40, 0x1A, 0x1C, 0x86, + 0x97, 0x8C, 0x81, 0x18, 0x0C, 0x82, 0x20, 0xB4, 0x81, 0x1A, 0xB8, 0x81, + 0x1E, 0x0C, 0x82, 0x1E, 0xD4, 0x01, 0x1E, 0xE8, 0x81, 0x18, 0xA4, 0x40, + 0x0D, 0x34, 0x81, 0x34, 0x98, 0x9B, 0xB2, 0x08, 0x8F, 0x3C, 0xCE, 0x54, + 0x3F, 0xFC, 0x02, 0x11, 0x58, 0x41, 0x29, 0x34, 0x81, 0x0E, 0x08, 0x01, + 0x29, 0x58, 0x03, 0x59, 0x6A, 0x8E, 0xE6, 0xC0, 0x43, 0x35, 0xC0, 0x02, + 0x2D, 0x74, 0xE6, 0x34, 0x78, 0x23, 0x35, 0xD8, 0x03, 0x35, 0xB8, 0x02, + 0x3F, 0x50, 0x03, 0x8C, 0x34, 0x0C, 0x02, 0x06, 0xD0, 0x37, 0xE0, 0x02, + 0x37, 0xC0, 0xE3, 0x2B, 0x8C, 0xC2, 0x9C, 0xF8, 0x52, 0x58, 0xEE, 0x00, + 0x2E, 0xD0, 0xCC, 0x66, 0xE1, 0x92, 0xA9, 0xB6, 0xA2, 0x74, 0x1A, 0x62, + 0x8F, 0x12, 0x60, 0x90, 0x98, 0x43, 0x38, 0x10, 0x43, 0x76, 0xFA, 0x1C, + 0xBC, 0xBD, 0x1F, 0x16, 0xE2, 0x1F, 0x43, 0x64, 0x01, 0x2F, 0x32, 0x29, + 0x42, 0xBA, 0x1D, 0x59, 0x4A, 0x9E, 0xCC, 0xAD, 0x62, 0xF9, 0xA5, 0x62, + 0xF9, 0x45, 0x56, 0x43, 0x6E, 0xA9, 0xB1, 0x6A, 0x8C, 0x3C, 0xBC, 0x82, + 0xFE, 0x0D, 0xA4, 0x40, 0x19, 0x10, 0x02, 0x22, 0xE8, 0x01, 0x1E, 0xE0, + 0x41, 0x1D, 0xA8, 0x41, 0x19, 0x0C, 0x02, 0x1C, 0x08, 0x42, 0x21, 0x9C, + 0x41, 0x1A, 0xD4, 0xC1, 0x20, 0x0C, 0x02, 0x22, 0x0C, 0xC6, 0x21, 0xB4, + 0x81, 0x0C, 0x98, 0xC0, 0x10, 0x54, 0x83, 0x3E, 0xA8, 0xDD, 0x3C, 0xB6, + 0x17, 0x39, 0xE0, 0x83, 0x35, 0xB8, 0x02, 0x38, 0x80, 0xC3, 0x37, 0x1C, + 0xCD, 0x0E, 0xBC, 0x8B, 0x15, 0x10, 0xC1, 0x28, 0xD4, 0x82, 0x37, 0x62, + 0xC2, 0x0E, 0xF8, 0x43, 0x3D, 0x04, 0x5A, 0x06, 0x1C, 0x40, 0x63, 0xC8, + 0x64, 0x13, 0xCC, 0x81, 0x15, 0xA8, 0x44, 0x79, 0x99, 0x5D, 0xFF, 0x8C, + 0xE6, 0x28, 0xE4, 0x1D, 0x9C, 0x91, 0x02, 0x17, 0xE4, 0x02, 0x9F, 0xE9, + 0x99, 0x31, 0xDC, 0x42, 0x0F, 0x58, 0xC1, 0x35, 0xD0, 0x0E, 0x3E, 0xBC, + 0xC3, 0xB1, 0x69, 0x18, 0xF0, 0xBD, 0x83, 0xC6, 0x76, 0xD4, 0x4B, 0x40, + 0xD5, 0xAF, 0x66, 0x9A, 0x3C, 0xA0, 0x83, 0x2E, 0x5E, 0x1E, 0x16, 0xFA, + 0x02, 0x31, 0x88, 0x83, 0x39, 0x28, 0x45, 0x38, 0xC8, 0x2A, 0x15, 0xEC, + 0x82, 0x2D, 0x98, 0x82, 0x10, 0x6A, 0x1E, 0x18, 0x08, 0x0F, 0xA7, 0xA8, + 0xDE, 0x12, 0x12, 0x26, 0x13, 0x0E, 0x26, 0xB1, 0x8E, 0xEC, 0x4E, 0x1D, + 0xAB, 0xD0, 0x56, 0xC9, 0xC4, 0x85, 0x82, 0x08, 0xA4, 0x01, 0x21, 0x18, + 0x86, 0x20, 0xA4, 0xC1, 0x09, 0xBC, 0xC0, 0x0B, 0xB8, 0x81, 0x18, 0xB4, + 0x01, 0x1C, 0x9C, 0x01, 0x9B, 0xBA, 0xA9, 0x1A, 0xE0, 0xC1, 0x20, 0x14, + 0x82, 0x1E, 0x38, 0xAB, 0x1E, 0x08, 0xA8, 0x09, 0x8C, 0x82, 0xB2, 0x18, + 0x22, 0x1C, 0xD1, 0x8E, 0xF5, 0x28, 0xE7, 0x86, 0x91, 0x83, 0x15, 0x24, + 0x08, 0x0F, 0xE4, 0x80, 0x73, 0x55, 0x40, 0x06, 0xEC, 0x00, 0x11, 0xE0, + 0xC0, 0xA0, 0x99, 0xFE, 0x02, 0x13, 0x1C, 0x01, 0x04, 0x00, 0x67, 0x05, + 0x78, 0x02, 0xA3, 0xE9, 0x43, 0x3F, 0xC8, 0x03, 0x38, 0xD4, 0x42, 0x13, + 0xEC, 0x00, 0x10, 0x38, 0xC1, 0x8A, 0xA5, 0x18, 0x3A, 0xEC, 0x99, 0x9E, + 0x09, 0x83, 0xC4, 0x06, 0x83, 0x16, 0x95, 0x02, 0x38, 0x70, 0x56, 0xB2, + 0x68, 0x4E, 0x3F, 0x78, 0x03, 0x3C, 0x30, 0x68, 0x83, 0x82, 0x43, 0x3F, + 0x60, 0x4A, 0x7C, 0x5D, 0x09, 0x3F, 0x14, 0x8D, 0x2F, 0xE0, 0x25, 0x77, + 0x7E, 0xAE, 0x31, 0x88, 0xC3, 0xBC, 0xB1, 0x84, 0x90, 0x56, 0x01, 0x16, + 0x00, 0xC3, 0xD9, 0xE1, 0x43, 0x3F, 0xE8, 0x82, 0x29, 0x88, 0x5C, 0x14, + 0x66, 0x29, 0xF2, 0xB8, 0x65, 0x13, 0x36, 0x24, 0x91, 0xA9, 0xA5, 0xED, + 0xB2, 0xE7, 0xD0, 0xEE, 0xEE, 0x94, 0x90, 0x83, 0x0F, 0x88, 0xC0, 0x09, + 0x08, 0x42, 0xD2, 0xE2, 0x81, 0x18, 0xB0, 0x40, 0x18, 0x88, 0x41, 0x18, + 0x98, 0x41, 0x18, 0x84, 0xC1, 0x19, 0x88, 0x81, 0x18, 0x8C, 0x81, 0x19, + 0xD4, 0x01, 0xB4, 0x0A, 0x82, 0x1E, 0x08, 0x82, 0x20, 0xE0, 0x01, 0x21, + 0xF8, 0x67, 0x18, 0x34, 0x40, 0x10, 0xE8, 0xC2, 0x2F, 0x1E, 0x9B, 0x79, + 0x96, 0x60, 0xF0, 0x15, 0x8A, 0xDC, 0xEA, 0xD5, 0x0E, 0x64, 0x06, 0x0F, + 0x90, 0xC2, 0xC9, 0x45, 0x54, 0x06, 0x18, 0xC0, 0x0D, 0xEC, 0x00, 0x02, + 0x90, 0x42, 0x79, 0xF1, 0xED, 0x37, 0x40, 0x28, 0x7F, 0x60, 0x00, 0x04, + 0xC4, 0x59, 0x8C, 0x21, 0xAE, 0x9E, 0xF5, 0xAF, 0xC4, 0x0E, 0xC3, 0x2E, + 0x58, 0x81, 0x9C, 0x54, 0x43, 0x3E, 0xBC, 0xEB, 0xD1, 0xCC, 0x82, 0x2B, + 0xBC, 0x02, 0x37, 0x80, 0x83, 0x37, 0x60, 0x43, 0x03, 0xA3, 0x95, 0x5B, + 0xAE, 0xC4, 0xC4, 0x61, 0x83, 0x2E, 0x94, 0x14, 0x30, 0x18, 0x03, 0x06, + 0x8F, 0x43, 0x39, 0xC0, 0xD1, 0xD3, 0xFE, 0xCD, 0xDF, 0x17, 0xF2, 0x82, + 0x78, 0x2E, 0xA4, 0x25, 0x32, 0x1A, 0x62, 0x6A, 0xD6, 0x79, 0x99, 0x1F, + 0x6B, 0x25, 0x5E, 0x2A, 0xA2, 0xF0, 0xC8, 0xE2, 0x0A, 0xEF, 0x32, 0x23, + 0x5F, 0x8C, 0x82, 0x03, 0xB0, 0x00, 0x22, 0xB0, 0xA9, 0x1A, 0xDC, 0x67, + 0x18, 0x8C, 0x41, 0x19, 0xBC, 0xC0, 0x19, 0x98, 0xC1, 0x19, 0xD4, 0x41, + 0x19, 0xAC, 0x40, 0xF2, 0x8E, 0x01, 0x1A, 0x44, 0xAB, 0x9A, 0xB6, 0x81, + 0x18, 0x10, 0x02, 0x21, 0xD4, 0x41, 0x24, 0xD8, 0x01, 0x86, 0x8C, 0x82, + 0x64, 0x84, 0x6D, 0x2B, 0xA6, 0x25, 0xD9, 0xA0, 0x9B, 0x2B, 0x14, 0x41, + 0x66, 0x08, 0xC1, 0x28, 0xE4, 0x8C, 0xCE, 0x98, 0x42, 0x85, 0x0A, 0xF0, + 0x03, 0x39, 0xC8, 0xFE, 0x5C, 0x83, 0xA0, 0x5E, 0xC3, 0x0D, 0x64, 0x40, + 0x5E, 0x0D, 0x9E, 0x5B, 0x7D, 0x1F, 0xE2, 0x06, 0x03, 0x8A, 0x1D, 0xDA, + 0x9E, 0x51, 0x6C, 0x0F, 0x4C, 0x8B, 0x15, 0x48, 0x0B, 0x46, 0x00, 0x0F, + 0xD7, 0xC4, 0x8C, 0xC5, 0x45, 0xEE, 0x4A, 0xF8, 0x2D, 0xD2, 0xCC, 0xAC, + 0x2F, 0x15, 0x1D, 0x3A, 0x40, 0x70, 0x5B, 0x10, 0x43, 0x16, 0x78, 0xE1, + 0x37, 0x50, 0xA7, 0x4A, 0x48, 0x06, 0x42, 0x2E, 0x61, 0x5F, 0x0A, 0xEB, + 0x14, 0x2B, 0x27, 0x53, 0x9D, 0xB0, 0x0A, 0xBF, 0xB0, 0x25, 0xBB, 0x07, + 0x5F, 0x6C, 0x03, 0x03, 0xA8, 0x80, 0x24, 0x68, 0x2D, 0x9C, 0x2E, 0xEF, + 0x0A, 0x94, 0x41, 0x9C, 0x3A, 0xEF, 0xB4, 0x96, 0xC1, 0xF2, 0x9E, 0xC1, + 0xF2, 0x92, 0x69, 0x18, 0xB8, 0x01, 0x1E, 0x1C, 0x6F, 0x21, 0xD4, 0xF0, + 0x24, 0x4C, 0x82, 0x18, 0x48, 0x40, 0x0E, 0xA8, 0xC2, 0x50, 0xB2, 0x10, + 0xCD, 0x05, 0xC7, 0x82, 0xBA, 0x5D, 0x0E, 0xAC, 0x08, 0x0E, 0xEC, 0x40, + 0x13, 0x34, 0xC4, 0x05, 0xE4, 0xC0, 0x2B, 0xB8, 0x42, 0xFE, 0x05, 0xDC, + 0x00, 0x00, 0x18, 0xC0, 0x03, 0x60, 0x06, 0xB6, 0x40, 0x80, 0x05, 0xD0, + 0x49, 0x89, 0xAD, 0xB1, 0xFF, 0x1E, 0x9A, 0x6C, 0xE4, 0xC2, 0x1B, 0x1F, + 0x9A, 0x47, 0x88, 0x98, 0x46, 0x30, 0x6E, 0x13, 0x30, 0xA8, 0x3C, 0x4A, + 0xC6, 0x8E, 0x6E, 0x4E, 0x29, 0xD8, 0x42, 0x44, 0x64, 0x11, 0x16, 0xE8, + 0x82, 0x42, 0x91, 0x17, 0x5C, 0xA0, 0x43, 0x2D, 0x5A, 0x81, 0x78, 0xB2, + 0x04, 0x5A, 0x1A, 0x2C, 0x2E, 0x4B, 0x1D, 0x96, 0xB2, 0xE7, 0x4E, 0x29, + 0xE7, 0x73, 0x20, 0x45, 0xB1, 0x02, 0xED, 0x44, 0x5E, 0xB2, 0x3F, 0xEB, + 0xC5, 0x3E, 0xFC, 0x80, 0x03, 0xA8, 0x41, 0x27, 0x13, 0x82, 0x20, 0x28, + 0x6F, 0x0A, 0xB4, 0x80, 0x19, 0xB4, 0x40, 0x7D, 0x8E, 0x01, 0x1E, 0x98, + 0x81, 0x1A, 0xE8, 0xB0, 0x10, 0xAF, 0xC0, 0x0B, 0x84, 0x81, 0x10, 0x2F, + 0x6F, 0x0A, 0xA8, 0x41, 0x22, 0x20, 0x82, 0x1D, 0xEC, 0x41, 0x25, 0xC0, + 0x00, 0x86, 0xD8, 0x98, 0x18, 0xC1, 0xCD, 0xC5, 0x34, 0xE7, 0x3C, 0x92, + 0x83, 0xFE, 0x2C, 0x6C, 0xDE, 0x89, 0xC2, 0x2F, 0x14, 0x41, 0x0F, 0xE8, + 0x42, 0x6E, 0xCC, 0x15, 0x01, 0x4C, 0x0D, 0x02, 0x58, 0x80, 0x05, 0xE4, + 0xDD, 0x12, 0xA8, 0x71, 0x44, 0x19, 0xDA, 0xF7, 0x61, 0x93, 0x47, 0xEC, + 0x02, 0xC4, 0x12, 0x24, 0xB5, 0x81, 0x5C, 0x9E, 0x0D, 0x53, 0x0E, 0x54, + 0x50, 0xFF, 0xE8, 0x03, 0xA2, 0xBA, 0xC2, 0x27, 0x2C, 0x2C, 0xBD, 0x44, + 0x4B, 0xEB, 0xBC, 0xF3, 0x12, 0xC2, 0xAB, 0x12, 0x82, 0x1A, 0xA6, 0xB8, + 0xE1, 0xE7, 0x51, 0x71, 0xC8, 0x06, 0xEB, 0xB0, 0xFE, 0x68, 0x4B, 0xFE, + 0x33, 0x58, 0xDF, 0x05, 0x2C, 0x9C, 0x40, 0x07, 0xCC, 0x47, 0x24, 0x38, + 0xAB, 0x19, 0x88, 0x41, 0x45, 0x93, 0xE9, 0x19, 0xB4, 0x72, 0x19, 0x28, + 0xFE, 0x34, 0xF4, 0xAE, 0x00, 0xF4, 0xBE, 0x80, 0x18, 0xAC, 0x40, 0x0A, + 0x84, 0x41, 0x1B, 0xB4, 0x40, 0x18, 0x94, 0x41, 0x1E, 0xEC, 0x01, 0x1F, + 0xDC, 0x81, 0x22, 0x2C, 0x02, 0x0C, 0x28, 0x80, 0x0E, 0xBC, 0x82, 0xC6, + 0xA6, 0xDD, 0xCC, 0x4D, 0xC5, 0x3C, 0x04, 0x90, 0xE5, 0xC2, 0x43, 0x3C, + 0x54, 0x6E, 0x00, 0xE5, 0xC3, 0x2F, 0xDC, 0xC0, 0x28, 0x54, 0x43, 0x06, + 0x48, 0xC0, 0x5C, 0xA1, 0x08, 0xCA, 0x44, 0x0B, 0xE8, 0x34, 0x93, 0x5B, + 0xF1, 0xB4, 0x4F, 0xD3, 0x06, 0x2F, 0x68, 0xC4, 0x46, 0x78, 0x04, 0x77, + 0x0D, 0x75, 0x8A, 0xE5, 0xC2, 0x13, 0x34, 0xC1, 0x37, 0xB0, 0xEE, 0x2F, + 0x24, 0x62, 0x10, 0xE4, 0x40, 0xFD, 0xF8, 0xA9, 0x2E, 0xA0, 0x83, 0x22, + 0xB3, 0x93, 0xD8, 0xBC, 0x65, 0x04, 0x4F, 0x72, 0x66, 0x01, 0x47, 0x3F, + 0xB7, 0x5B, 0x79, 0x40, 0x87, 0x6E, 0x87, 0xB5, 0x3F, 0x07, 0xF4, 0x07, + 0xB0, 0x80, 0x60, 0x9C, 0xF5, 0x20, 0xA4, 0x41, 0xB4, 0x86, 0xA9, 0xF2, + 0xBA, 0x81, 0xF1, 0xA6, 0xC0, 0x5D, 0xB7, 0x80, 0xD3, 0xB6, 0xC0, 0x09, + 0xA4, 0xC1, 0x25, 0x08, 0x31, 0x9A, 0x42, 0xB4, 0x1D, 0xD8, 0x41, 0x22, + 0xFC, 0x75, 0x1F, 0x2C, 0xC2, 0x86, 0x3C, 0x40, 0x13, 0xA4, 0x1B, 0x5A, + 0xED, 0x68, 0xCE, 0xC9, 0xC3, 0xCC, 0x90, 0x03, 0xA1, 0x06, 0x88, 0xB2, + 0xB4, 0xA6, 0x3E, 0x78, 0xC2, 0x28, 0xFC, 0x82, 0x15, 0x5C, 0x4B, 0x82, + 0xE8, 0xD5, 0x27, 0xBE, 0x92, 0x0F, 0xA6, 0x66, 0x1B, 0xBB, 0xF1, 0x15, + 0x60, 0x04, 0x13, 0x68, 0x00, 0x02, 0x54, 0x00, 0x44, 0x60, 0x01, 0xC4, + 0xBA, 0x71, 0x8A, 0xC1, 0x71, 0x2E, 0x8C, 0x5C, 0x23, 0x8E, 0x82, 0x27, + 0x34, 0xC1, 0x10, 0xB0, 0xE0, 0x0E, 0x90, 0xC2, 0x83, 0xB2, 0x96, 0xAD, + 0x30, 0x45, 0x4F, 0xFE, 0x61, 0x29, 0x6F, 0xFB, 0xD7, 0x8E, 0xB2, 0x5F, + 0x3F, 0xEF, 0x10, 0x71, 0x87, 0x38, 0x3B, 0x75, 0x43, 0x09, 0x7C, 0xC0, + 0x20, 0xD0, 0x47, 0x7D, 0x0C, 0xC2, 0x7D, 0xAA, 0x41, 0x1A, 0xF4, 0xF0, + 0x0A, 0x14, 0x06, 0x99, 0xB6, 0xC0, 0x25, 0x30, 0xB4, 0xF1, 0xA6, 0x41, + 0x42, 0x87, 0x81, 0x20, 0xB8, 0xC1, 0x19, 0x9C, 0x41, 0x21, 0xE0, 0xC1, + 0x19, 0xE4, 0x81, 0x25, 0x30, 0x82, 0x22, 0xF4, 0x41, 0x1F, 0xF8, 0x41, + 0x09, 0x28, 0x00, 0x0E, 0xFC, 0x82, 0x72, 0xEA, 0xD2, 0xFC, 0x92, 0x8D, + 0x3C, 0x9C, 0x91, 0x03, 0xF6, 0x0F, 0x9B, 0x48, 0xA7, 0x35, 0x94, 0xC2, + 0x3B, 0xD0, 0xC2, 0x6E, 0x91, 0x89, 0x72, 0xB5, 0xD8, 0x2B, 0x78, 0x5C, + 0x82, 0xB7, 0x5C, 0xA2, 0xF4, 0x00, 0x69, 0x90, 0xC9, 0xE4, 0x78, 0x50, + 0x46, 0x18, 0xE1, 0x1B, 0x7B, 0xC4, 0x2B, 0xE1, 0x00, 0x10, 0xE4, 0x40, + 0x34, 0xB1, 0xC8, 0x0D, 0x00, 0x01, 0x29, 0x80, 0x03, 0xE1, 0xC8, 0xEE, + 0x57, 0xB7, 0x45, 0x80, 0x4C, 0x99, 0x74, 0xF8, 0xF6, 0x8F, 0xB6, 0xB0, + 0x88, 0xFF, 0x39, 0xA8, 0xE9, 0x43, 0x2C, 0x78, 0x80, 0x1E, 0x44, 0x42, + 0x24, 0xD0, 0x47, 0x24, 0xBC, 0x72, 0x1D, 0x9C, 0xC1, 0x25, 0xF4, 0x70, + 0x5B, 0x9B, 0x81, 0x1B, 0xB8, 0x81, 0x1A, 0xA0, 0x81, 0x1A, 0x20, 0xB4, + 0x18, 0xA8, 0x81, 0x18, 0xD4, 0x27, 0x21, 0x10, 0x2F, 0x1E, 0x24, 0xC2, + 0x21, 0xD8, 0x01, 0x1F, 0x18, 0x02, 0x23, 0x58, 0x82, 0x1F, 0xF8, 0xC1, + 0x1D, 0xB0, 0x41, 0x09, 0x3C, 0xC0, 0x28, 0xB0, 0x10, 0xED, 0xB0, 0x1A, + 0x3E, 0x54, 0x62, 0x35, 0x58, 0x01, 0x37, 0x90, 0xC3, 0x39, 0xB2, 0x6B, + 0x09, 0x9A, 0x51, 0x05, 0x18, 0x40, 0x06, 0x04, 0xF3, 0xD8, 0xFD, 0xE9, + 0x2B, 0x00, 0xC3, 0xAF, 0x2B, 0xAE, 0xFE, 0xC4, 0x5E, 0xC1, 0x98, 0x94, + 0x06, 0x13, 0x5C, 0xA4, 0x47, 0x90, 0xC6, 0x43, 0xE0, 0x80, 0x06, 0x18, + 0x0A, 0x82, 0x94, 0xC4, 0x31, 0xE7, 0x00, 0x0E, 0x04, 0x81, 0x28, 0xD0, + 0x82, 0x37, 0x64, 0x6E, 0x26, 0xC6, 0x45, 0x64, 0xCC, 0x4D, 0x19, 0x92, + 0x9F, 0x8F, 0x42, 0x45, 0xC6, 0xA2, 0xD5, 0x8F, 0xDC, 0xF9, 0x78, 0x02, + 0xBA, 0xB9, 0x4B, 0x05, 0x3F, 0x0C, 0x81, 0x07, 0xD4, 0x41, 0xB8, 0x62, + 0x2F, 0x22, 0xD4, 0x30, 0x21, 0x08, 0x06, 0x98, 0x6C, 0x3A, 0x1E, 0x44, + 0x7A, 0xA5, 0xFB, 0xF0, 0xF2, 0xAE, 0xB2, 0x18, 0x74, 0xAD, 0x1B, 0x24, + 0x6D, 0x1B, 0xE4, 0xC1, 0x21, 0x44, 0xC2, 0x1E, 0xDC, 0x41, 0x91, 0x33, + 0xC2, 0x22, 0x2C, 0xC2, 0x1F, 0xF4, 0x41, 0x0D, 0x2C, 0x33, 0x2D, 0xE0, + 0x5C, 0xDA, 0x51, 0x43, 0x29, 0x5C, 0x43, 0xFD, 0xAE, 0x09, 0x3F, 0x28, + 0x67, 0xA6, 0x92, 0xC3, 0x0E, 0x50, 0x40, 0xC5, 0x06, 0xE4, 0x9F, 0x2E, + 0xC1, 0xC9, 0x0D, 0x96, 0xB0, 0x03, 0xB0, 0x80, 0x07, 0x24, 0x16, 0x60, + 0x01, 0x61, 0xF1, 0x82, 0x31, 0x5C, 0xC1, 0x27, 0x62, 0xF1, 0xD4, 0x18, + 0x00, 0x00, 0xB4, 0x8B, 0xB6, 0x54, 0xC0, 0x10, 0x88, 0x42, 0x35, 0xFC, + 0x1E, 0xFA, 0x7D, 0x38, 0x8E, 0xA9, 0x33, 0x6E, 0x4B, 0xDE, 0x12, 0xD6, + 0x68, 0x26, 0x4E, 0xE7, 0x23, 0xDF, 0xF6, 0xB9, 0x9B, 0x7B, 0x79, 0x29, + 0x83, 0x09, 0x78, 0x80, 0x0C, 0x28, 0x80, 0x02, 0x8C, 0xC0, 0x0A, 0x9C, + 0x81, 0x1E, 0x04, 0x3C, 0x7D, 0x50, 0xC2, 0xB7, 0x06, 0x86, 0x60, 0xBC, + 0xBB, 0x12, 0xAB, 0xC1, 0x25, 0xB0, 0xB8, 0x18, 0xD8, 0x78, 0x0B, 0x8C, + 0x81, 0x9B, 0xB2, 0x7B, 0x24, 0x18, 0x02, 0xC1, 0x2F, 0x82, 0x1F, 0x40, + 0x02, 0x24, 0x10, 0x79, 0x1C, 0x98, 0x80, 0x04, 0x78, 0xFE, 0x42, 0x70, + 0x9D, 0x43, 0xBA, 0x3D, 0x07, 0xF0, 0x61, 0xC3, 0x85, 0x46, 0xF6, 0xFC, + 0x26, 0x0B, 0x3D, 0xB0, 0xE3, 0x0E, 0x58, 0x40, 0x0E, 0x28, 0x84, 0x9C, + 0x80, 0x0E, 0x2E, 0x98, 0x42, 0x49, 0xE9, 0x19, 0x36, 0x25, 0x0A, 0x0F, + 0x60, 0x01, 0x15, 0x5C, 0x01, 0x5B, 0x5D, 0x01, 0xC4, 0xEE, 0x02, 0x0E, + 0x88, 0xC2, 0xED, 0x14, 0x40, 0x32, 0x5F, 0x4B, 0x4B, 0x11, 0x81, 0x2B, + 0xC0, 0x43, 0xC7, 0xD6, 0x28, 0x2E, 0x81, 0xB3, 0xC1, 0x4A, 0xF5, 0xDC, + 0xD0, 0xDB, 0x71, 0x56, 0xBC, 0x04, 0x23, 0xA8, 0x86, 0x0F, 0x3D, 0xE9, + 0xD3, 0x05, 0x54, 0xC1, 0x03, 0x26, 0x48, 0x40, 0x02, 0x24, 0x80, 0x03, + 0x24, 0xC0, 0x00, 0x38, 0x00, 0x64, 0xA6, 0x80, 0x18, 0xB4, 0x35, 0x21, + 0x6C, 0xED, 0xBB, 0x4B, 0x42, 0x60, 0x04, 0x46, 0xC0, 0x1B, 0x3A, 0x61, + 0xA8, 0x01, 0x75, 0x5B, 0x34, 0x19, 0xD8, 0x01, 0x23, 0x30, 0x02, 0x60, + 0x2F, 0x02, 0x24, 0x34, 0x02, 0x24, 0x2C, 0x42, 0x1F, 0xA4, 0xFD, 0x11, + 0xA4, 0x20, 0x25, 0xFE, 0xE2, 0x8C, 0xF8, 0x6D, 0x79, 0x6D, 0x58, 0xF9, + 0xA8, 0x37, 0x36, 0x14, 0xC1, 0x11, 0x78, 0x22, 0x0E, 0xB8, 0xDE, 0x0E, + 0x94, 0x02, 0xEC, 0x44, 0x54, 0xFF, 0x92, 0x82, 0x06, 0x04, 0xCB, 0x43, + 0x34, 0x81, 0x15, 0x68, 0x44, 0x9F, 0x91, 0x82, 0x05, 0x08, 0x40, 0x9E, + 0x2C, 0x96, 0x04, 0xE8, 0x40, 0x05, 0x54, 0x40, 0x29, 0x70, 0x3E, 0x02, + 0x6E, 0x98, 0x04, 0x97, 0x70, 0xC3, 0x0C, 0xB7, 0xE7, 0xF3, 0x14, 0x4B, + 0xE0, 0x43, 0x00, 0x3D, 0x1E, 0x40, 0xE4, 0xD3, 0x37, 0x50, 0xDF, 0x3E, + 0x82, 0xFA, 0x04, 0x1E, 0x54, 0x38, 0x30, 0xE1, 0x42, 0x87, 0x0F, 0x21, + 0x46, 0x94, 0x38, 0x91, 0x62, 0x45, 0x8B, 0x17, 0x31, 0x66, 0xD4, 0xB8, + 0xFE, 0x91, 0x63, 0xC7, 0x85, 0xF9, 0xF0, 0xED, 0x53, 0x27, 0xC1, 0x01, + 0x83, 0x05, 0x0A, 0x3A, 0x70, 0x60, 0xC0, 0x40, 0x81, 0x83, 0x04, 0x0A, + 0x14, 0x30, 0x08, 0x21, 0x63, 0x44, 0x8A, 0x15, 0x61, 0xD2, 0x8C, 0x69, + 0x73, 0x06, 0x4F, 0x1D, 0x44, 0x91, 0x10, 0x1D, 0x3A, 0x84, 0x88, 0xD0, + 0x19, 0x18, 0x97, 0xF8, 0xF4, 0xE9, 0xE3, 0x67, 0xD1, 0x22, 0x48, 0x8F, + 0x1A, 0xF9, 0x89, 0x63, 0x43, 0x82, 0x27, 0x5D, 0xBA, 0xE8, 0xD1, 0x03, + 0x29, 0x4F, 0xE0, 0x3B, 0x7A, 0xF8, 0xE4, 0xE1, 0xCB, 0x37, 0x76, 0x2C, + 0x3D, 0x70, 0xE7, 0x4A, 0x3D, 0xC0, 0xC1, 0xC3, 0x8A, 0xA9, 0x22, 0x42, + 0x70, 0xBD, 0x12, 0x26, 0x2C, 0xD8, 0xB0, 0x61, 0xB7, 0x78, 0x50, 0x38, + 0x92, 0xC1, 0x02, 0x13, 0x2C, 0xB7, 0x76, 0x5D, 0xE9, 0x81, 0x23, 0x48, + 0x04, 0x03, 0x10, 0x24, 0xE4, 0x20, 0x52, 0xC4, 0x8A, 0x95, 0x26, 0x56, + 0x46, 0xD5, 0xAA, 0x56, 0xED, 0xDB, 0xB7, 0x5F, 0xBF, 0xBE, 0x5D, 0x53, + 0xD7, 0x8F, 0x9C, 0xD7, 0x90, 0xFC, 0x0C, 0x5E, 0x14, 0xD8, 0xD0, 0xE3, + 0xC7, 0x87, 0xA4, 0x09, 0xEE, 0x7B, 0xD7, 0x99, 0xDF, 0xBB, 0x7C, 0xA1, + 0x11, 0xC6, 0x3E, 0xD8, 0x90, 0x34, 0xEA, 0xD2, 0xB7, 0x71, 0xE7, 0xD6, + 0xBD, 0x9B, 0x77, 0x6F, 0x8E, 0xFB, 0x5E, 0x63, 0x5A, 0xD0, 0xA0, 0xC1, + 0x87, 0x31, 0x66, 0xC6, 0xAC, 0xB0, 0x79, 0x82, 0xC4, 0x08, 0x0E, 0x0D, + 0x1C, 0x0C, 0x80, 0xE9, 0xA0, 0xA5, 0x82, 0x06, 0x1C, 0x64, 0x9C, 0x38, + 0xA1, 0xC2, 0xE6, 0x19, 0x37, 0x83, 0x22, 0x45, 0x6A, 0xB3, 0x66, 0xCD, + 0xA5, 0x3B, 0x7D, 0x9C, 0x2E, 0xF2, 0xB3, 0xFE, 0x0F, 0x55, 0x22, 0xAF, + 0x74, 0x61, 0x93, 0x37, 0x8F, 0x2C, 0x70, 0xB2, 0x08, 0xC7, 0xEE, 0x93, + 0xE7, 0xED, 0x1C, 0xFE, 0x2D, 0x04, 0x19, 0x8A, 0x20, 0xA5, 0x14, 0x0D, + 0x46, 0xC1, 0x05, 0x17, 0x6C, 0x8C, 0xA9, 0x6B, 0x17, 0x26, 0x32, 0x38, + 0x02, 0x01, 0x08, 0x34, 0xE0, 0x61, 0x30, 0x0B, 0x26, 0x98, 0xA0, 0x02, + 0x1D, 0x74, 0xC0, 0xA1, 0x87, 0x26, 0x4C, 0xD9, 0x85, 0x97, 0x5B, 0x6E, + 0x31, 0x85, 0x0A, 0x1E, 0x48, 0x21, 0xC5, 0x94, 0x57, 0x5E, 0x29, 0x51, + 0x40, 0x53, 0x4A, 0x19, 0x85, 0x94, 0x51, 0x46, 0x29, 0xA5, 0x94, 0x12, + 0x5D, 0x41, 0x91, 0x16, 0x6B, 0xB8, 0xB9, 0x86, 0x1C, 0x72, 0xF8, 0x81, + 0x27, 0x24, 0xD8, 0x1C, 0xB2, 0x4D, 0x21, 0x21, 0x81, 0x3C, 0x6D, 0xA2, + 0xAD, 0xE4, 0x91, 0x07, 0xB8, 0xD0, 0x84, 0xF4, 0xCD, 0xC9, 0x27, 0xA1, + 0x8C, 0x52, 0xCA, 0x29, 0x23, 0xC2, 0x47, 0x9F, 0x77, 0x7C, 0xF0, 0x60, + 0x00, 0x15, 0xF4, 0x18, 0xA4, 0x0E, 0x35, 0xCA, 0x28, 0x23, 0x8D, 0x15, + 0xC4, 0x58, 0xE1, 0x04, 0x14, 0x42, 0xB0, 0xA9, 0x85, 0x17, 0x5A, 0x50, + 0xA1, 0x85, 0x14, 0x46, 0x38, 0x21, 0x8C, 0x36, 0xC2, 0x50, 0x2E, 0x85, + 0x14, 0x5C, 0x28, 0xA3, 0x0E, 0x3B, 0xF8, 0xE0, 0x43, 0x91, 0x45, 0xFA, + 0x38, 0x0F, 0x12, 0xF5, 0x00, 0xF9, 0xA3, 0x06, 0x1B, 0x14, 0xC8, 0xA1, + 0x9A, 0x6B, 0xE8, 0xE1, 0xEA, 0xB5, 0xD7, 0x1C, 0x1D, 0x2D, 0x3F, 0x72, + 0xE6, 0xF9, 0x06, 0x81, 0x1B, 0x48, 0x79, 0xA5, 0x09, 0xB8, 0x70, 0x99, + 0xCB, 0x98, 0x61, 0x78, 0xA1, 0xA2, 0x09, 0x0B, 0x10, 0x38, 0x82, 0x87, + 0x0A, 0x20, 0x40, 0x80, 0x80, 0x07, 0x1E, 0x90, 0xC0, 0x80, 0x1B, 0x7A, + 0xB8, 0x62, 0x17, 0xBA, 0x82, 0x09, 0x46, 0x18, 0x5E, 0x70, 0xB5, 0x82, + 0x14, 0x6C, 0xC0, 0xE1, 0x15, 0x1B, 0x74, 0x7A, 0xC5, 0x06, 0x9B, 0x6F, + 0xB0, 0x31, 0x10, 0x97, 0x52, 0x58, 0xFE, 0x94, 0x91, 0x14, 0x03, 0x67, + 0x94, 0xD1, 0xD9, 0x66, 0x51, 0xFC, 0x45, 0x97, 0xCB, 0x68, 0xF9, 0xA5, + 0x16, 0x5A, 0x70, 0xA9, 0x86, 0x1B, 0x6F, 0xC0, 0xF1, 0x86, 0x33, 0x6F, + 0x08, 0x22, 0x07, 0x1B, 0x72, 0x32, 0xBB, 0x06, 0x9B, 0x6A, 0xC8, 0xD1, + 0x8A, 0xA0, 0xD7, 0x30, 0x12, 0x6B, 0xA0, 0x7D, 0xF4, 0x1B, 0xCB, 0x34, + 0x2A, 0xE9, 0xAD, 0xD7, 0xDE, 0x7B, 0xF1, 0x75, 0xC8, 0xA0, 0x5A, 0x54, + 0xE8, 0x80, 0x04, 0x3D, 0xDA, 0x68, 0xA3, 0x8E, 0x4B, 0xD4, 0x48, 0x23, + 0x85, 0x16, 0xCE, 0x08, 0x03, 0x04, 0x12, 0x54, 0x38, 0x61, 0x05, 0x12, + 0x48, 0x08, 0x23, 0x85, 0x32, 0xDA, 0x50, 0x43, 0x8C, 0x30, 0x5A, 0x10, + 0xA3, 0x8D, 0x31, 0xEA, 0x4C, 0x81, 0x8C, 0x32, 0xC2, 0x20, 0x83, 0x0D, + 0xA4, 0x20, 0x81, 0x44, 0x29, 0x3F, 0x1A, 0x01, 0xA4, 0x50, 0x39, 0xE2, + 0x10, 0xE1, 0x86, 0x51, 0xBC, 0x21, 0x2B, 0x2B, 0xAE, 0xF0, 0x23, 0xAB, + 0xAC, 0x79, 0xFC, 0xCB, 0xA1, 0xC4, 0x1E, 0x48, 0xC1, 0x4C, 0x18, 0xBB, + 0x84, 0xB9, 0xE5, 0x0A, 0x1E, 0x10, 0x40, 0x80, 0x89, 0x1E, 0x08, 0x98, + 0xA0, 0x00, 0x01, 0x08, 0x30, 0x20, 0x02, 0x26, 0x78, 0xB8, 0xE5, 0xD3, + 0x61, 0xEA, 0xBA, 0xE5, 0x68, 0x26, 0x40, 0xB4, 0x82, 0x9C, 0x7C, 0xE6, + 0xE9, 0xBA, 0x6B, 0xAE, 0xE3, 0x99, 0x27, 0x9E, 0xB1, 0xE9, 0x39, 0x07, + 0x9E, 0xAC, 0xB2, 0x3A, 0x67, 0x6C, 0x74, 0xE0, 0x39, 0x87, 0x1C, 0x74, + 0x80, 0xED, 0x35, 0x58, 0x62, 0x71, 0x01, 0xE6, 0x17, 0x6C, 0x5F, 0x89, + 0x0B, 0x45, 0x57, 0x4A, 0x2C, 0xA5, 0x46, 0x5A, 0x68, 0x79, 0x05, 0x9C, + 0xCB, 0x0C, 0xFC, 0xE5, 0x95, 0x5F, 0x28, 0x23, 0xD6, 0x1A, 0x6F, 0x8A, + 0x2C, 0x92, 0xA1, 0x77, 0x13, 0x6A, 0xC8, 0xF1, 0x7C, 0xFE, 0x29, 0xAF, + 0xDC, 0xF2, 0xCB, 0x39, 0x6A, 0x68, 0x08, 0x0F, 0x48, 0x10, 0x44, 0x0F, + 0x3D, 0xEA, 0xD0, 0x23, 0x0D, 0x19, 0x50, 0x60, 0xA1, 0x85, 0x9C, 0x64, + 0xB8, 0xE4, 0xE1, 0x86, 0x5F, 0x00, 0x5D, 0x0D, 0x33, 0x28, 0xAE, 0x58, + 0x0D, 0x81, 0x7B, 0x3A, 0xA3, 0x8C, 0x17, 0xC8, 0x20, 0x0F, 0x86, 0xDD, + 0xD9, 0x78, 0xA3, 0x8F, 0x38, 0xFE, 0xF0, 0x43, 0x65, 0x40, 0x38, 0x01, + 0xE4, 0x07, 0x09, 0x8A, 0xC0, 0x66, 0xE6, 0xAC, 0xE8, 0xAB, 0xD9, 0x3E, + 0x7A, 0xE6, 0x29, 0x05, 0x82, 0x1E, 0x5E, 0xB1, 0x82, 0xD3, 0xB9, 0x14, + 0xE4, 0xE5, 0x0A, 0x0A, 0x1E, 0x64, 0xE2, 0x8A, 0x09, 0x1E, 0x20, 0x80, + 0x80, 0x0C, 0xA8, 0xB8, 0x02, 0xEB, 0x04, 0xED, 0x1A, 0x26, 0x97, 0x2B, + 0x72, 0xE1, 0x65, 0x7D, 0x2B, 0x70, 0xC9, 0x67, 0x3E, 0xAF, 0xE9, 0xE7, + 0xFA, 0x6B, 0xFA, 0xBF, 0x0E, 0x1B, 0x7F, 0xE8, 0xF5, 0xF7, 0xBA, 0x7F, + 0xFA, 0xC7, 0x76, 0x0E, 0x7A, 0xB4, 0xAD, 0x6C, 0xC1, 0xDA, 0x9A, 0xCD, + 0xF2, 0x61, 0x96, 0x5F, 0xE0, 0x62, 0x81, 0x71, 0xB9, 0x8C, 0xB0, 0xB0, + 0x61, 0x0D, 0x5E, 0xE1, 0xC8, 0x1B, 0x15, 0x84, 0x07, 0x39, 0xC0, 0xD1, + 0x8F, 0x77, 0xD4, 0x03, 0x1F, 0x60, 0x01, 0x0B, 0xBC, 0xE0, 0x65, 0x25, + 0xCC, 0x8D, 0x90, 0x84, 0x25, 0x34, 0xA1, 0x3E, 0xEC, 0x11, 0x83, 0x0F, + 0xF8, 0x44, 0x0F, 0x84, 0xF8, 0x9C, 0xEA, 0x58, 0x90, 0x06, 0x31, 0x5C, + 0xA2, 0x0D, 0x2C, 0x40, 0x43, 0x1A, 0xCE, 0x60, 0x31, 0x33, 0x9C, 0xE1, + 0x0C, 0x6D, 0x30, 0x83, 0x18, 0xD4, 0xE0, 0x86, 0x36, 0xE0, 0xA1, 0x0D, + 0x5D, 0x2A, 0xC4, 0x20, 0x0C, 0x91, 0xC4, 0x3C, 0xE4, 0xE1, 0x0E, 0x6F, + 0x88, 0xC3, 0xC8, 0x6A, 0x10, 0x07, 0x96, 0x09, 0x0F, 0x10, 0x8E, 0x50, + 0xFE, 0x99, 0x1C, 0x24, 0x70, 0x83, 0x57, 0xE4, 0xC3, 0x35, 0xF3, 0x88, + 0xD4, 0x58, 0xE6, 0xB3, 0x0F, 0xAD, 0x8C, 0xE2, 0x08, 0x3B, 0xC0, 0x85, + 0x10, 0x0A, 0x34, 0x2B, 0xAA, 0xDD, 0x4A, 0x18, 0x58, 0x78, 0x90, 0x5E, + 0xCC, 0x67, 0x85, 0xBF, 0x08, 0x86, 0x07, 0x58, 0x40, 0x5F, 0xFA, 0x70, + 0x75, 0x8B, 0x1E, 0x78, 0x0F, 0x18, 0x02, 0xC4, 0xDF, 0x1F, 0x01, 0x19, + 0x48, 0xFC, 0xF5, 0x0F, 0x7A, 0x83, 0x04, 0xA4, 0xBC, 0x1A, 0xD2, 0xBC, + 0xC8, 0x71, 0xCD, 0x7E, 0x0A, 0x5C, 0x20, 0xDE, 0x64, 0x14, 0x2D, 0x6C, + 0x7D, 0xE3, 0x15, 0xD5, 0x6A, 0xE0, 0xA2, 0xAA, 0xE1, 0x8D, 0x1D, 0xAD, + 0x06, 0x1E, 0xF2, 0x80, 0xC7, 0x3B, 0xE0, 0xD1, 0x8F, 0x0B, 0x7E, 0xF2, + 0x93, 0xF2, 0x03, 0xCD, 0xA3, 0xD6, 0x75, 0x42, 0x55, 0xAE, 0x92, 0x95, + 0x12, 0x31, 0xC8, 0x36, 0x56, 0x28, 0x89, 0x41, 0x08, 0x05, 0x0F, 0x66, + 0xB8, 0x84, 0xC1, 0x66, 0x88, 0x06, 0x35, 0xA8, 0xA1, 0x0E, 0x6D, 0x28, + 0x83, 0x1B, 0x78, 0x39, 0x44, 0x42, 0x78, 0xE9, 0x0C, 0x62, 0xC0, 0x03, + 0xE8, 0xEA, 0xF0, 0x1D, 0x3D, 0x1C, 0xC2, 0x10, 0x79, 0x28, 0x44, 0x9F, + 0x14, 0xA1, 0x88, 0x3E, 0xB0, 0x81, 0x0D, 0x71, 0x88, 0x43, 0x0D, 0x7E, + 0xF0, 0x03, 0x39, 0x0C, 0x0F, 0x10, 0x9A, 0xB0, 0x41, 0x05, 0xAA, 0xC1, + 0x15, 0xFD, 0xD0, 0x87, 0x2C, 0x62, 0x91, 0x5F, 0x3E, 0x48, 0x91, 0x81, + 0x1C, 0xBC, 0xC2, 0x13, 0xA5, 0xA8, 0x1B, 0x30, 0xD6, 0x48, 0x97, 0x5D, + 0xA4, 0x0A, 0x01, 0x06, 0xC8, 0x80, 0x87, 0x82, 0x61, 0x85, 0xBE, 0x70, + 0x61, 0x18, 0x3F, 0x4B, 0x1F, 0xD5, 0x98, 0x00, 0x81, 0x1C, 0x58, 0x01, + 0x1D, 0xCC, 0x13, 0xE4, 0xFD, 0xEA, 0x97, 0x50, 0x41, 0xDA, 0xEF, 0x6B, + 0x35, 0xFB, 0xDA, 0xFE, 0x7D, 0x26, 0xF7, 0x11, 0x49, 0x21, 0xB0, 0x6B, + 0x61, 0x63, 0x68, 0x3C, 0xBC, 0x42, 0x8F, 0x82, 0x06, 0xCB, 0x57, 0xC3, + 0xAA, 0x86, 0xB0, 0xBE, 0xF1, 0xD1, 0x07, 0x12, 0x6E, 0x32, 0xD6, 0xE8, + 0x87, 0x26, 0x2F, 0xF8, 0x8E, 0x24, 0x8D, 0x46, 0x36, 0xEB, 0x82, 0x0D, + 0x70, 0x5A, 0xFA, 0x38, 0x7A, 0x35, 0xA9, 0x95, 0x35, 0xB5, 0xDC, 0x27, + 0x64, 0x10, 0x89, 0x43, 0xE0, 0x21, 0x28, 0x70, 0xB8, 0x65, 0x0C, 0x6F, + 0x89, 0x06, 0x41, 0xE0, 0xA1, 0x0C, 0x6A, 0xC0, 0x83, 0x20, 0xDC, 0xA0, + 0x07, 0xCF, 0x0D, 0x13, 0x11, 0xC0, 0x14, 0x22, 0x1E, 0xF6, 0xB0, 0xCC, + 0x42, 0xE4, 0x41, 0x0F, 0x7C, 0x38, 0x62, 0x1E, 0x0C, 0xD1, 0x27, 0x3F, + 0xDC, 0xE1, 0x0F, 0x7F, 0x60, 0xD9, 0xA1, 0x7E, 0x10, 0x07, 0x40, 0x6C, + 0x93, 0x13, 0x36, 0xD0, 0x22, 0x3C, 0xE6, 0xD1, 0xC9, 0x79, 0x98, 0x93, + 0x2C, 0xF3, 0xD8, 0x47, 0x0F, 0x8E, 0xF0, 0x80, 0x1C, 0xE8, 0xC2, 0x14, + 0xA6, 0x60, 0xE3, 0xCF, 0xEA, 0x62, 0x0A, 0xBE, 0x3C, 0x08, 0x01, 0x3D, + 0xB0, 0xDA, 0x11, 0xAE, 0x10, 0x8C, 0xA9, 0xD5, 0x45, 0xB0, 0xB7, 0xC8, + 0x00, 0x04, 0x46, 0x01, 0x0E, 0xB4, 0x15, 0x72, 0x6C, 0xF8, 0x63, 0xE8, + 0x42, 0x0F, 0x49, 0x1F, 0xC7, 0x0E, 0x89, 0xA6, 0x16, 0x79, 0xAC, 0xD7, + 0x1E, 0x6B, 0x3F, 0x04, 0xDA, 0x8C, 0x90, 0x65, 0x83, 0x07, 0x38, 0x40, + 0x0B, 0x8E, 0x6F, 0xE0, 0xC2, 0x32, 0x79, 0x5B, 0xA0, 0x8D, 0x5E, 0x71, + 0xAD, 0x52, 0x5C, 0x66, 0x32, 0xDC, 0xF2, 0x16, 0x39, 0xE0, 0xC1, 0x0F, + 0xB0, 0xF4, 0x28, 0x49, 0x22, 0x3C, 0x8D, 0x40, 0x60, 0x5A, 0x59, 0x9B, + 0xEE, 0x96, 0xB7, 0x07, 0x31, 0x88, 0x41, 0xE4, 0xE1, 0x03, 0x35, 0x44, + 0x82, 0x10, 0x42, 0x39, 0x04, 0x1A, 0xFE, 0x66, 0x18, 0xC3, 0x1B, 0x1A, + 0x35, 0x0D, 0xBB, 0x54, 0x03, 0xC0, 0xF0, 0x30, 0x88, 0x41, 0x10, 0x82, + 0xBA, 0x83, 0xD8, 0x43, 0xC0, 0xF6, 0x40, 0x08, 0x44, 0x14, 0x42, 0x28, + 0x48, 0x3C, 0x44, 0x22, 0xF2, 0xD0, 0x27, 0x3B, 0x04, 0x8A, 0x65, 0xC0, + 0x8B, 0xC3, 0x0F, 0x0E, 0x65, 0x03, 0x39, 0xC8, 0xE1, 0x07, 0x80, 0x30, + 0x6B, 0x62, 0x7F, 0x71, 0xC0, 0x72, 0x8E, 0x05, 0x1F, 0x41, 0x10, 0x1F, + 0x01, 0xFE, 0x81, 0x8D, 0x5B, 0xDC, 0xAA, 0x2E, 0x6B, 0x04, 0x51, 0x06, + 0xDE, 0xC8, 0x03, 0x0D, 0x58, 0x20, 0xB0, 0xC1, 0xE0, 0xC5, 0x30, 0x06, + 0xCB, 0x8B, 0xC3, 0x8E, 0x02, 0x18, 0xE0, 0xB0, 0xE8, 0x7D, 0x14, 0x1A, + 0x61, 0x84, 0x62, 0xF6, 0xA0, 0xA8, 0x71, 0xCD, 0x6D, 0x2E, 0x7B, 0xD0, + 0x3F, 0x16, 0x92, 0xC2, 0x9B, 0x65, 0xA4, 0xCD, 0xC4, 0x36, 0x40, 0x7A, + 0x60, 0x10, 0xA4, 0xBF, 0xC0, 0x86, 0xE1, 0x64, 0x54, 0xA3, 0x14, 0xA7, + 0xB8, 0x16, 0x91, 0x7C, 0x45, 0x48, 0x11, 0x77, 0x0D, 0x6E, 0xC0, 0xF6, + 0x1D, 0xEF, 0xE0, 0x47, 0x7D, 0x7E, 0xF4, 0x9A, 0x90, 0xC8, 0x4B, 0x3F, + 0x06, 0x61, 0xD7, 0x45, 0x22, 0xDA, 0x5B, 0x21, 0xFB, 0x66, 0x1F, 0xDF, + 0x28, 0x01, 0x21, 0xC2, 0x43, 0x94, 0x43, 0x8C, 0x21, 0x0D, 0x4D, 0x76, + 0x03, 0x1A, 0xD0, 0x70, 0x09, 0x37, 0x10, 0x0C, 0x0F, 0x3D, 0xFC, 0x5C, + 0x74, 0x09, 0x51, 0x07, 0x41, 0xB8, 0x70, 0x10, 0x78, 0xC0, 0xC3, 0x30, + 0xBD, 0x5B, 0xD5, 0x43, 0x4C, 0x22, 0x11, 0x86, 0x10, 0xC4, 0x1D, 0xEE, + 0x10, 0x87, 0x46, 0xDC, 0x41, 0x0E, 0x7F, 0x58, 0x59, 0x7A, 0x67, 0xA0, + 0x5E, 0x3A, 0x98, 0xB5, 0x09, 0xAE, 0xD8, 0x5A, 0xCD, 0xEA, 0x23, 0x84, + 0x07, 0x0C, 0x40, 0x02, 0x0F, 0xB0, 0x02, 0x88, 0x78, 0xFE, 0x41, 0x97, + 0x03, 0xE7, 0x02, 0x18, 0xC0, 0xD0, 0xE3, 0x11, 0x70, 0x80, 0xE8, 0x2B, + 0xD8, 0xA5, 0x56, 0xB5, 0xA2, 0xDA, 0x30, 0xAE, 0xE0, 0xB4, 0x1C, 0x44, + 0x00, 0xD1, 0x42, 0x20, 0x82, 0x15, 0x3C, 0xE1, 0xA2, 0xAD, 0xFD, 0x31, + 0xB3, 0x8E, 0xAD, 0x70, 0x43, 0x15, 0x02, 0x0F, 0xDD, 0x1E, 0xE9, 0x7E, + 0x0C, 0xD5, 0xAC, 0x86, 0x51, 0xBD, 0xD0, 0x0F, 0xDF, 0x67, 0xA2, 0x08, + 0x91, 0x2C, 0xDA, 0x76, 0x14, 0xAC, 0x6A, 0x54, 0x0B, 0x17, 0xB5, 0x78, + 0x45, 0x29, 0x5A, 0x2C, 0x8A, 0x17, 0x89, 0x42, 0xD7, 0xB8, 0x2E, 0x91, + 0xAD, 0x49, 0xAB, 0xAD, 0x0A, 0x62, 0xE3, 0x1A, 0x19, 0xEC, 0x07, 0x67, + 0x3E, 0x79, 0x63, 0x78, 0x0D, 0x99, 0xD9, 0x94, 0x13, 0x88, 0x28, 0x52, + 0x20, 0x14, 0x49, 0x1C, 0xA2, 0xB8, 0x51, 0xD6, 0x25, 0x1A, 0xBC, 0x6C, + 0xD4, 0x20, 0x0A, 0x42, 0x0D, 0x67, 0x20, 0xC4, 0x31, 0xA9, 0x5B, 0x07, + 0xEA, 0x6E, 0xB9, 0xB8, 0x83, 0x80, 0x43, 0x24, 0x0A, 0x51, 0x88, 0x24, + 0xEE, 0x01, 0x11, 0x65, 0xCE, 0x2A, 0x9A, 0x1F, 0xB1, 0x89, 0xAE, 0xFE, + 0xC1, 0x11, 0x8E, 0x58, 0x6F, 0x7A, 0x4D, 0xB0, 0x5E, 0x13, 0x94, 0xF1, + 0x17, 0x1E, 0x1E, 0x0B, 0x11, 0x08, 0x20, 0x81, 0x3E, 0x63, 0x2D, 0x17, + 0xF8, 0xA4, 0xCB, 0x5C, 0x0A, 0xFD, 0x3E, 0x1C, 0x30, 0x01, 0xAF, 0xFD, + 0x7C, 0xB4, 0xAD, 0x32, 0x40, 0x80, 0x1B, 0xE0, 0x00, 0x55, 0xAC, 0x12, + 0x1F, 0x02, 0x1E, 0x10, 0x01, 0x1C, 0x90, 0x42, 0x1F, 0x9C, 0x8E, 0x70, + 0x86, 0x3B, 0xDD, 0x3C, 0x85, 0xD8, 0x36, 0x73, 0x13, 0x96, 0x2C, 0x85, + 0x51, 0x2E, 0x59, 0x53, 0x9B, 0x3A, 0x90, 0x19, 0x4E, 0x35, 0x66, 0x11, + 0x18, 0x1B, 0x44, 0x32, 0x84, 0xA1, 0x5E, 0x89, 0x35, 0x38, 0xC4, 0x55, + 0xFE, 0xE2, 0xCB, 0x18, 0xCE, 0x46, 0x80, 0xD3, 0x1B, 0xE0, 0x76, 0xFE, + 0x51, 0x6E, 0x74, 0x32, 0x2C, 0xA3, 0x6E, 0x76, 0x45, 0x82, 0x2C, 0x64, + 0x83, 0x00, 0x41, 0x0C, 0xDA, 0x95, 0x04, 0x21, 0xB6, 0x0C, 0xE5, 0x1B, + 0x62, 0x5B, 0x0F, 0x5E, 0x46, 0xC3, 0xE7, 0xAE, 0xFC, 0xED, 0x2D, 0x2B, + 0xD5, 0x85, 0x50, 0x47, 0x04, 0x22, 0x06, 0xA1, 0x07, 0x43, 0x00, 0xE5, + 0x10, 0x62, 0x4F, 0x84, 0xBA, 0x15, 0xB1, 0x55, 0x94, 0x35, 0xC2, 0x11, + 0x86, 0xDA, 0xE6, 0x7A, 0x7F, 0x60, 0x04, 0x1B, 0x3C, 0x80, 0xBD, 0x35, + 0x90, 0x80, 0x15, 0xDC, 0x0A, 0xD1, 0x04, 0xEE, 0x80, 0x00, 0xE8, 0x55, + 0x80, 0x04, 0xAE, 0x00, 0xA2, 0x5D, 0xF4, 0x93, 0x2E, 0x09, 0xAF, 0x2B, + 0x0F, 0x98, 0x70, 0x60, 0xAA, 0x05, 0xBA, 0xD1, 0xC1, 0xB8, 0x05, 0x04, + 0x1E, 0x70, 0x04, 0xC5, 0x58, 0xA1, 0x08, 0x15, 0x60, 0x55, 0x04, 0x22, + 0x90, 0x81, 0x07, 0x04, 0x01, 0x1C, 0x9F, 0x8E, 0x6C, 0xCB, 0x7B, 0x03, + 0x72, 0xC8, 0xBE, 0xDC, 0xD3, 0xA2, 0x37, 0x39, 0xAA, 0x5D, 0x8E, 0xFA, + 0x98, 0x4F, 0xB4, 0xAD, 0x64, 0xBB, 0xE0, 0xB0, 0xBE, 0x01, 0x8C, 0x63, + 0xD9, 0x1A, 0xD7, 0x28, 0xAA, 0x45, 0x2D, 0x5C, 0x71, 0x2D, 0x69, 0xC8, + 0xD6, 0xE8, 0x47, 0x57, 0x48, 0xD2, 0x85, 0xFC, 0x0E, 0x1B, 0x08, 0x35, + 0x12, 0x92, 0x40, 0x84, 0x20, 0x04, 0x71, 0x09, 0x6C, 0xA7, 0x41, 0xCA, + 0x55, 0x77, 0xC3, 0x97, 0x87, 0x1A, 0xFD, 0xA1, 0x12, 0x85, 0xDC, 0x50, + 0x27, 0x44, 0x21, 0x90, 0x2F, 0x88, 0x43, 0x84, 0x87, 0x99, 0xED, 0xCE, + 0xEA, 0x22, 0xEE, 0xB0, 0x1E, 0x47, 0x6C, 0xC2, 0xDE, 0x52, 0x8C, 0xC3, + 0x31, 0xC6, 0x2A, 0x07, 0xAA, 0x64, 0x73, 0xDF, 0xAE, 0x41, 0x24, 0xF4, + 0xC0, 0x61, 0x79, 0xFE, 0x6D, 0xFE, 0x40, 0x01, 0x19, 0x68, 0xDF, 0x2D, + 0x72, 0xE1, 0xF8, 0xA0, 0x15, 0xFA, 0x16, 0xA3, 0x60, 0xF8, 0x3F, 0x41, + 0xC5, 0x43, 0x6E, 0x81, 0x17, 0x98, 0x00, 0x01, 0x24, 0xA0, 0x02, 0x76, + 0xA0, 0x07, 0xD0, 0xA8, 0x09, 0x32, 0xE0, 0x06, 0x22, 0x00, 0x02, 0x32, + 0xEF, 0x08, 0x68, 0xA1, 0xE3, 0x46, 0x4F, 0xC2, 0x54, 0x0E, 0xD4, 0x74, + 0x63, 0x2C, 0x4E, 0xCE, 0xE3, 0x3C, 0xCD, 0xF3, 0x2C, 0x90, 0xF4, 0x38, + 0xF0, 0x03, 0x45, 0xF0, 0xE5, 0x4C, 0x0D, 0xCF, 0x34, 0x70, 0x1E, 0xCE, + 0xE1, 0x1D, 0x80, 0xC5, 0x70, 0x5C, 0xC1, 0x13, 0x82, 0xA0, 0x08, 0xBE, + 0xC1, 0xF7, 0x64, 0xF0, 0x37, 0xF4, 0xC1, 0x15, 0x3E, 0xA0, 0x10, 0x82, + 0xE2, 0xEB, 0xB6, 0xCC, 0xA8, 0xDC, 0x20, 0x0D, 0xDC, 0x80, 0xBA, 0xBC, + 0xCC, 0xB8, 0xF0, 0xC0, 0x0D, 0x9E, 0x0F, 0xF9, 0xA8, 0x0B, 0xEA, 0x04, + 0x81, 0xB8, 0xCA, 0x6D, 0xEC, 0xCC, 0x2C, 0x12, 0x26, 0x01, 0x11, 0x0C, + 0xE1, 0x10, 0x14, 0xC1, 0x10, 0xD4, 0x63, 0x3D, 0xD8, 0xEE, 0x11, 0x54, + 0xE6, 0xBC, 0xE4, 0xC0, 0x19, 0x8E, 0x81, 0x0E, 0xE4, 0x40, 0xEE, 0xD6, + 0xEB, 0x01, 0x7E, 0xC1, 0x04, 0x7F, 0xC1, 0x15, 0x20, 0xCF, 0x06, 0xBC, + 0xD0, 0x04, 0x06, 0xE0, 0x0A, 0x70, 0x65, 0x56, 0x76, 0x01, 0x18, 0x76, + 0x61, 0x17, 0xEA, 0x4A, 0x6A, 0xA6, 0xC6, 0x2E, 0x8C, 0x41, 0x18, 0xE2, + 0x88, 0x0B, 0x22, 0x2E, 0x02, 0x74, 0x80, 0x08, 0x82, 0x60, 0x07, 0x30, + 0xA1, 0x09, 0x46, 0xC1, 0x0A, 0x06, 0xC3, 0x0A, 0x04, 0xEA, 0xB2, 0x52, + 0x6F, 0x03, 0xC9, 0x29, 0x90, 0x42, 0x8F, 0xE5, 0x36, 0x30, 0x11, 0x19, + 0xA9, 0x02, 0x4F, 0xEE, 0xD4, 0x14, 0x71, 0x12, 0x4B, 0xED, 0x03, 0x13, + 0x11, 0x04, 0x5B, 0x4E, 0x7F, 0x32, 0xFE, 0xF1, 0x1D, 0x68, 0x01, 0x13, + 0x30, 0x21, 0x07, 0x70, 0x40, 0x15, 0xF8, 0x61, 0x06, 0x4D, 0xD1, 0x22, + 0x0C, 0x62, 0x08, 0x58, 0x00, 0x28, 0xB4, 0xEB, 0xF8, 0xBE, 0x0D, 0x98, + 0x74, 0xC9, 0x73, 0xEA, 0x40, 0x09, 0xC9, 0xCD, 0xCB, 0xBE, 0x84, 0xDA, + 0xC8, 0x6D, 0x99, 0xB6, 0x0F, 0x0E, 0xE0, 0x60, 0x17, 0xC7, 0x2E, 0xC9, + 0xA8, 0x70, 0x29, 0xF8, 0x20, 0x78, 0xD8, 0x6E, 0x13, 0x1A, 0xA1, 0xCD, + 0xD4, 0xCB, 0x19, 0x9E, 0xA1, 0x9B, 0x6C, 0xC0, 0x06, 0x34, 0xC1, 0x04, + 0x8C, 0x00, 0x81, 0xE8, 0x61, 0x5A, 0x1E, 0x00, 0x00, 0x9C, 0xF1, 0x07, + 0xE8, 0xA0, 0x01, 0x1E, 0xE0, 0x16, 0x7C, 0x01, 0x57, 0x02, 0xCD, 0x0D, + 0xE7, 0x22, 0x7D, 0xEA, 0xE2, 0x56, 0x6E, 0x81, 0x0B, 0x9A, 0x80, 0x07, + 0x78, 0x40, 0x7C, 0x22, 0x20, 0x08, 0x44, 0x61, 0x53, 0xD0, 0x68, 0x14, + 0x3C, 0x01, 0x07, 0x20, 0x03, 0x02, 0x68, 0x21, 0xE4, 0x2C, 0x71, 0x11, + 0x35, 0x8C, 0x91, 0x42, 0x2F, 0xD5, 0x32, 0xB1, 0xF4, 0x52, 0x2F, 0x12, + 0x15, 0xCA, 0x11, 0xFB, 0x11, 0xF5, 0x52, 0xCE, 0x6B, 0x38, 0x6C, 0xC2, + 0xB8, 0x46, 0x2B, 0x22, 0x31, 0x6C, 0xE2, 0x01, 0x7A, 0x1A, 0x45, 0x1E, + 0xE8, 0x41, 0x1D, 0x3E, 0x41, 0x08, 0x30, 0x01, 0x14, 0x86, 0xE0, 0x06, + 0x3C, 0x41, 0x1E, 0xF0, 0xE3, 0x14, 0x39, 0xD2, 0x34, 0xB8, 0x21, 0x06, + 0x08, 0x41, 0x12, 0x74, 0xEA, 0x27, 0xC0, 0xCD, 0xB9, 0xF0, 0x40, 0x0D, + 0x08, 0x46, 0xBB, 0xAA, 0x0E, 0xC9, 0xA0, 0x0E, 0x0F, 0x88, 0x0F, 0xF9, + 0x80, 0x42, 0xA9, 0xBE, 0x2E, 0x07, 0xBF, 0x6E, 0xFB, 0xC2, 0x43, 0x11, + 0x92, 0x82, 0x29, 0xFC, 0x60, 0x29, 0x50, 0x26, 0xFD, 0xD4, 0x8F, 0x13, + 0x94, 0x91, 0x13, 0x34, 0x21, 0x9B, 0x7E, 0xE0, 0x01, 0xFE, 0xC8, 0x41, + 0x36, 0xF2, 0x21, 0xBE, 0x72, 0x00, 0x00, 0x24, 0x40, 0x9B, 0xD6, 0x6B, + 0x00, 0x7A, 0xE0, 0x56, 0x78, 0xC1, 0x56, 0xE6, 0xC2, 0x9F, 0xD2, 0x47, + 0x2A, 0xDD, 0x67, 0x00, 0xA9, 0x80, 0x02, 0x0C, 0xA0, 0x54, 0x84, 0xC0, + 0x13, 0x3C, 0xE1, 0x1F, 0x9A, 0xC0, 0x16, 0x44, 0xC1, 0x0A, 0x32, 0xE0, + 0x15, 0x70, 0x60, 0x14, 0x28, 0xB0, 0x03, 0x49, 0xEF, 0x04, 0xBB, 0xA6, + 0x22, 0x68, 0x63, 0xD9, 0x0A, 0x02, 0x22, 0x34, 0x10, 0x11, 0xEF, 0x11, + 0x20, 0x55, 0x6E, 0x20, 0x3F, 0x8F, 0x04, 0x25, 0x2C, 0x12, 0xF5, 0xF2, + 0x04, 0x29, 0x0A, 0x21, 0xE9, 0x07, 0x1F, 0x24, 0x6B, 0x3E, 0xB4, 0x82, + 0x1F, 0x5A, 0x21, 0x07, 0x3E, 0x61, 0x08, 0x7C, 0x80, 0x08, 0x86, 0x20, + 0x07, 0x54, 0xA1, 0x23, 0x25, 0xD3, 0x21, 0x44, 0xE1, 0x03, 0x92, 0x6C, + 0x28, 0xBE, 0xAD, 0xEC, 0x92, 0xEA, 0x24, 0xD5, 0x40, 0x10, 0xB0, 0xAD, + 0x25, 0x8B, 0xAB, 0x85, 0x76, 0xEA, 0xA8, 0x8A, 0xEB, 0x08, 0xA9, 0x6D, + 0x26, 0xBF, 0xCE, 0x09, 0x15, 0xE1, 0x27, 0x12, 0x41, 0x3D, 0xF8, 0xA0, + 0x11, 0xFA, 0xA0, 0xAB, 0x1A, 0xA1, 0x18, 0xED, 0xCD, 0x06, 0x7E, 0x40, + 0x13, 0x9E, 0x41, 0x19, 0x35, 0x41, 0x02, 0xE6, 0xCE, 0x15, 0x64, 0x2E, + 0x1F, 0xC0, 0xE1, 0x1A, 0xAC, 0x60, 0x00, 0x02, 0x8E, 0x0E, 0x8C, 0xC0, + 0x0B, 0x09, 0xC0, 0x0A, 0x1C, 0x8D, 0x2E, 0x00, 0x30, 0x18, 0xBA, 0x31, + 0xD0, 0x6E, 0x45, 0x44, 0x0C, 0x43, 0x02, 0xF8, 0x10, 0x2C, 0x45, 0xA1, + 0x15, 0x5C, 0x41, 0x17, 0x5E, 0xE1, 0x06, 0x88, 0x60, 0x14, 0x72, 0xA0, + 0x20, 0x2F, 0x11, 0xE5, 0x06, 0xF2, 0x49, 0x28, 0x91, 0x2D, 0xC3, 0xB3, + 0x12, 0xEF, 0x11, 0x3D, 0xED, 0xB1, 0xE5, 0x2E, 0x90, 0x1F, 0x0F, 0x49, + 0xFE, 0x20, 0x29, 0xD1, 0x9C, 0xB8, 0x82, 0x30, 0xB9, 0x82, 0x7E, 0xB2, + 0x82, 0x1F, 0x92, 0x21, 0x08, 0x7C, 0x20, 0x08, 0x80, 0x60, 0x3F, 0x81, + 0x60, 0x08, 0x84, 0xA0, 0x1D, 0x26, 0x73, 0x40, 0xF5, 0x01, 0x1F, 0x72, + 0xA0, 0x0C, 0xA6, 0x6D, 0x26, 0x5D, 0xE8, 0x10, 0x8C, 0xAA, 0x0E, 0x92, + 0xA9, 0x85, 0xB6, 0xEC, 0xCB, 0x80, 0x90, 0x25, 0x3B, 0xB3, 0x27, 0x7E, + 0xC2, 0x08, 0x0D, 0x01, 0x0E, 0x7E, 0xD1, 0x10, 0x10, 0x41, 0x12, 0x24, + 0x21, 0x89, 0x18, 0x81, 0x11, 0xAC, 0x10, 0xCD, 0x50, 0xA6, 0xED, 0x6A, + 0xC0, 0x04, 0x9A, 0xD1, 0x06, 0x8C, 0x60, 0xBD, 0x80, 0x52, 0x0E, 0x22, + 0xA0, 0x06, 0x8A, 0x00, 0xCF, 0xE4, 0xE1, 0xC4, 0x6E, 0x20, 0x00, 0x14, + 0x40, 0xBD, 0xE4, 0xE0, 0x18, 0x24, 0xE0, 0x08, 0x84, 0xA1, 0x0E, 0xED, + 0xF0, 0x53, 0x68, 0xA5, 0x56, 0x82, 0x86, 0x0A, 0x20, 0x60, 0x55, 0x20, + 0x40, 0x07, 0x76, 0xC0, 0x13, 0x60, 0xC1, 0x15, 0x68, 0xA1, 0x16, 0xA0, + 0x61, 0x14, 0x76, 0x40, 0x17, 0x22, 0xA0, 0xDF, 0x46, 0x10, 0xB2, 0x56, + 0x0E, 0xB7, 0x9C, 0xC4, 0x2D, 0xD1, 0x53, 0x13, 0x43, 0xB0, 0x12, 0x43, + 0x0E, 0x2F, 0x23, 0xCB, 0xF4, 0x14, 0x11, 0x20, 0xEB, 0xD2, 0x7E, 0xEA, + 0xF3, 0xD4, 0x4C, 0x6D, 0x3E, 0xEA, 0x33, 0x2C, 0xBC, 0x41, 0x3F, 0x31, + 0x61, 0x08, 0xE0, 0x74, 0x08, 0xE6, 0x60, 0x08, 0x46, 0xE1, 0x1D, 0x08, + 0xB4, 0x23, 0x0D, 0xE2, 0x17, 0x38, 0xA0, 0x10, 0xA6, 0x4D, 0xA7, 0xA8, + 0x0D, 0xEA, 0x7E, 0x69, 0x08, 0x21, 0x94, 0xBA, 0xDC, 0x20, 0x42, 0x97, + 0x69, 0x50, 0x4D, 0x93, 0xB8, 0x8E, 0x2A, 0x09, 0x93, 0x2C, 0x35, 0x99, + 0x49, 0x11, 0x18, 0xA1, 0x11, 0x1E, 0xE1, 0x0F, 0xAA, 0x89, 0xCD, 0x6C, + 0x40, 0x04, 0x6A, 0xFE, 0x40, 0x0E, 0x38, 0xE1, 0x18, 0xD8, 0x8B, 0xBD, + 0x6C, 0x60, 0x53, 0x79, 0xD3, 0x06, 0xB0, 0xC1, 0x5D, 0xC6, 0x42, 0x58, + 0x6A, 0x21, 0x00, 0x92, 0xE6, 0x07, 0x86, 0x00, 0xFD, 0x12, 0xE0, 0x0A, + 0x12, 0xA4, 0x2E, 0x3E, 0x05, 0x56, 0x1B, 0x2F, 0x68, 0x48, 0xE1, 0x01, + 0x0A, 0x80, 0x55, 0x66, 0x20, 0x08, 0x30, 0x61, 0x0E, 0x6C, 0x01, 0x16, + 0x60, 0x01, 0x45, 0x76, 0xC0, 0x15, 0x1C, 0x63, 0x2D, 0x05, 0x52, 0x04, + 0x11, 0x51, 0x4A, 0xCA, 0xD3, 0x1F, 0x53, 0xAE, 0xD3, 0xD6, 0xF3, 0xF4, + 0x38, 0xCD, 0x11, 0x3D, 0x90, 0x4C, 0x1F, 0xEA, 0x2E, 0xD7, 0xCA, 0x8B, + 0xDA, 0xCA, 0x66, 0xB4, 0xC2, 0x8B, 0xE6, 0xA1, 0x51, 0xC0, 0x28, 0x2C, + 0x5C, 0x61, 0x07, 0x88, 0x60, 0x4E, 0x31, 0x01, 0x08, 0x88, 0x00, 0x13, + 0x76, 0xE0, 0x1A, 0x52, 0xE9, 0x4E, 0x4D, 0xB1, 0x08, 0x52, 0x40, 0x24, + 0x7F, 0x02, 0xEA, 0xA8, 0x6D, 0x08, 0x81, 0x49, 0x0D, 0x10, 0x41, 0x0F, + 0x2A, 0x14, 0xF9, 0xBC, 0x0C, 0x42, 0x3D, 0xE7, 0x4F, 0x97, 0xCA, 0x85, + 0xF4, 0xE0, 0x27, 0x00, 0x56, 0x12, 0xC8, 0xEC, 0x26, 0xEF, 0xA0, 0x11, + 0xDE, 0xE0, 0x0D, 0xFC, 0x80, 0x52, 0x45, 0xC0, 0x06, 0xC4, 0xAA, 0x78, + 0x8E, 0x41, 0x13, 0xBE, 0x90, 0xBD, 0x8E, 0x40, 0x28, 0x25, 0xC0, 0x04, + 0x74, 0x21, 0xB7, 0xF2, 0x81, 0x5C, 0xE4, 0x01, 0x07, 0x00, 0x20, 0xDF, + 0x38, 0x21, 0x47, 0x4B, 0xA0, 0x02, 0x70, 0xC5, 0x56, 0x04, 0x8B, 0x6A, + 0x48, 0x76, 0x18, 0x0C, 0xED, 0x16, 0x2C, 0x80, 0x00, 0x22, 0xE0, 0x01, + 0x2E, 0x84, 0x1D, 0x3F, 0x61, 0x15, 0x4A, 0x41, 0x17, 0x5C, 0xE1, 0x2D, + 0x6A, 0xA1, 0x02, 0xC0, 0x61, 0x20, 0xD7, 0xB3, 0x2E, 0xBD, 0xC6, 0xB2, + 0x80, 0xAC, 0xA5, 0x38, 0x50, 0x2F, 0xFE, 0xC1, 0xB3, 0x4B, 0x2F, 0xF1, + 0x2F, 0xCD, 0xF3, 0xF3, 0x56, 0x8D, 0x91, 0x08, 0x93, 0x6B, 0xC4, 0xA2, + 0x6B, 0xC0, 0xE2, 0x9C, 0x92, 0x84, 0x2B, 0x56, 0x6A, 0x5B, 0x93, 0x84, + 0x1E, 0xBA, 0x41, 0x3F, 0x87, 0x20, 0x5C, 0x87, 0x20, 0x08, 0xE0, 0x34, + 0x32, 0x61, 0x4A, 0x5D, 0x87, 0xCC, 0x71, 0xE0, 0xE1, 0x06, 0xD4, 0x80, + 0x12, 0x80, 0x82, 0xB8, 0xBE, 0xCE, 0xCB, 0x9E, 0x0F, 0x0D, 0xDC, 0xE0, + 0xE9, 0xBC, 0xAC, 0x16, 0xD5, 0x60, 0x34, 0x89, 0x02, 0x0F, 0x86, 0x02, + 0xF9, 0x9E, 0xEF, 0x5F, 0x93, 0xCC, 0xF8, 0x7E, 0x62, 0x12, 0x22, 0x01, + 0x52, 0x15, 0x81, 0x0D, 0xEE, 0xA0, 0x13, 0xFC, 0xA0, 0x04, 0x1E, 0x80, + 0x0D, 0xD6, 0x83, 0x13, 0x1C, 0xA1, 0x78, 0x38, 0xE1, 0x19, 0x38, 0x55, + 0x0E, 0x0E, 0x65, 0x28, 0x1F, 0xE0, 0x15, 0xEC, 0x03, 0x21, 0xE8, 0xE1, + 0x1B, 0xF2, 0x01, 0x1E, 0x70, 0xA0, 0x29, 0xD1, 0x8F, 0x13, 0x1E, 0x61, + 0x02, 0x62, 0x85, 0xF0, 0x7A, 0xB4, 0x9F, 0xB0, 0x41, 0x18, 0x5E, 0xE1, + 0x0D, 0x83, 0x00, 0x00, 0x2A, 0xE0, 0x06, 0x10, 0x10, 0x5C, 0x3D, 0xA1, + 0x16, 0x46, 0x61, 0x15, 0x60, 0x21, 0x1E, 0x6B, 0x01, 0x08, 0x7A, 0x00, + 0x12, 0xF3, 0x71, 0x5B, 0x47, 0x0C, 0x1B, 0xF4, 0x11, 0x59, 0x29, 0x51, + 0x4C, 0x87, 0xB6, 0xC3, 0x8E, 0x76, 0x4B, 0x5D, 0xEE, 0xC3, 0xF8, 0x52, + 0xB3, 0x92, 0x96, 0x30, 0x4F, 0x4E, 0x2C, 0xC4, 0x62, 0x6A, 0xA5, 0x96, + 0x9C, 0x80, 0x23, 0x49, 0xDE, 0x21, 0x14, 0x74, 0xE0, 0x3F, 0x73, 0x00, + 0x08, 0x40, 0xE1, 0x13, 0xE6, 0xC0, 0x13, 0x4A, 0x71, 0x2E, 0xC1, 0x76, + 0x06, 0x69, 0x41, 0x04, 0x10, 0xC1, 0x6C, 0x83, 0x42, 0x10, 0xA8, 0xEF, + 0xDB, 0xD4, 0xE0, 0xEA, 0x82, 0x62, 0x25, 0xBF, 0xED, 0xFE, 0x98, 0x3C, + 0x47, 0x42, 0xB5, 0x8F, 0x28, 0x82, 0xA2, 0x0D, 0xDC, 0x00, 0x35, 0xC3, + 0x37, 0x3C, 0x8C, 0x0F, 0x0E, 0x92, 0x22, 0x0E, 0xD6, 0xE3, 0x52, 0x0D, + 0x97, 0xDE, 0x0A, 0x05, 0x10, 0x8E, 0xE1, 0x19, 0x16, 0xF7, 0x18, 0x3E, + 0xF6, 0x07, 0x9C, 0x51, 0x02, 0xFE, 0x41, 0xA5, 0x78, 0x4C, 0x3E, 0xF4, + 0x81, 0x16, 0x08, 0xC0, 0x06, 0x88, 0xE7, 0x0F, 0x9A, 0x21, 0x06, 0x08, + 0x0C, 0xE1, 0x84, 0x61, 0x74, 0xB1, 0xA1, 0xD0, 0x5E, 0x01, 0x1B, 0x48, + 0x41, 0x02, 0x08, 0x20, 0x43, 0x2A, 0x20, 0x07, 0x8C, 0xA0, 0x08, 0x88, + 0xA0, 0x05, 0x61, 0xA1, 0x14, 0xAA, 0xD7, 0x15, 0x2A, 0x20, 0x66, 0x88, + 0xB6, 0x77, 0xCB, 0xE2, 0x1C, 0xD0, 0xA1, 0x52, 0x4A, 0x01, 0xFE, 0xE0, + 0x61, 0x4A, 0x9A, 0x95, 0x3D, 0x4B, 0x6F, 0x2F, 0xB7, 0x74, 0x87, 0x87, + 0x17, 0xA1, 0x8A, 0x15, 0x30, 0x9D, 0xB6, 0x6B, 0xE0, 0x65, 0xAD, 0xC0, + 0xC8, 0x5A, 0xA1, 0x56, 0x6A, 0xC1, 0xA2, 0x51, 0x3A, 0x88, 0x16, 0xB8, + 0x36, 0x07, 0xF8, 0x13, 0x14, 0x52, 0x61, 0x08, 0x74, 0xA0, 0x14, 0x5E, + 0xAA, 0x7B, 0x8F, 0x2E, 0x15, 0x65, 0x40, 0x12, 0x28, 0x41, 0x12, 0xB6, + 0xEC, 0xF8, 0x0C, 0xD5, 0xA8, 0xD0, 0x80, 0x50, 0x87, 0xA2, 0x5E, 0x8F, + 0xE9, 0x6D, 0x87, 0xEA, 0x4F, 0x95, 0x4C, 0xA9, 0xE0, 0xE0, 0x0D, 0x80, + 0xE2, 0x17, 0x93, 0xEC, 0x60, 0xEF, 0xA0, 0x12, 0xFA, 0x80, 0x25, 0xE2, + 0x00, 0x2A, 0xE6, 0xCD, 0xCD, 0x08, 0x38, 0x80, 0x9F, 0x81, 0x71, 0xD5, + 0x8F, 0xBD, 0xA6, 0xF4, 0xA1, 0xB8, 0x88, 0x2B, 0xC8, 0x01, 0x02, 0x6A, + 0x80, 0x0E, 0xAC, 0xA8, 0x12, 0x00, 0x01, 0x02, 0x9A, 0xE0, 0x16, 0x48, + 0xCB, 0x6E, 0x64, 0xEF, 0x15, 0x4C, 0x41, 0x5A, 0x72, 0x80, 0x65, 0x75, + 0xFE, 0x20, 0x75, 0x8D, 0x40, 0x08, 0x8C, 0x80, 0x08, 0x42, 0xC1, 0x16, + 0x4E, 0x81, 0x08, 0x6E, 0x60, 0x15, 0x72, 0x60, 0x14, 0xEC, 0x12, 0x3C, + 0x4D, 0x0D, 0x86, 0xD1, 0x26, 0x1E, 0xC0, 0xE1, 0x15, 0xB6, 0x75, 0x1E, + 0x6C, 0x38, 0x04, 0xB5, 0x94, 0x68, 0x5B, 0x78, 0x94, 0x1F, 0xF1, 0x77, + 0x49, 0x59, 0xE5, 0x96, 0xF6, 0x7E, 0x6E, 0x59, 0x6A, 0xB7, 0x02, 0x52, + 0xF6, 0xC1, 0x8B, 0xA2, 0x56, 0x49, 0xAA, 0x56, 0x1E, 0xDA, 0xA1, 0x08, + 0xE0, 0x74, 0x0E, 0x82, 0x60, 0x15, 0x58, 0xE1, 0x31, 0x25, 0x60, 0x02, + 0xAD, 0xD8, 0x14, 0xFB, 0xC1, 0x04, 0xD0, 0x60, 0x8B, 0x8F, 0xEF, 0x27, + 0x74, 0xB1, 0xDB, 0x8A, 0xC8, 0xCB, 0x86, 0x90, 0x7C, 0xB5, 0x2F, 0x5F, + 0xD7, 0x37, 0xFA, 0xEA, 0xB5, 0xB8, 0xC8, 0x17, 0x0E, 0xD0, 0xE0, 0xEB, + 0xE0, 0xE0, 0x27, 0x38, 0xF4, 0x86, 0xDE, 0x60, 0xCD, 0x1A, 0x20, 0x06, + 0x80, 0x67, 0x36, 0x1B, 0x21, 0x78, 0x12, 0x37, 0x8F, 0x03, 0xD8, 0x19, + 0x94, 0x31, 0x9B, 0xE4, 0xC0, 0x04, 0x82, 0xC0, 0x51, 0x28, 0x17, 0xA6, + 0x6E, 0xC0, 0x04, 0xB8, 0xE9, 0x11, 0x44, 0xA0, 0x07, 0x70, 0xC1, 0x14, + 0x8C, 0x05, 0x92, 0x51, 0xE4, 0x15, 0x88, 0x40, 0x55, 0x8C, 0x00, 0xF3, + 0x74, 0xA0, 0x08, 0x40, 0x31, 0x7B, 0x51, 0x61, 0x0E, 0x2A, 0xC0, 0x13, + 0x30, 0x21, 0x03, 0xF8, 0xA1, 0x20, 0x33, 0x91, 0x6B, 0x80, 0x05, 0x6D, + 0xCC, 0x01, 0x7A, 0x3A, 0x9A, 0xD8, 0xBC, 0xC1, 0x47, 0x28, 0x02, 0xF8, + 0xE8, 0xB2, 0x2D, 0xFD, 0xD2, 0x3C, 0x85, 0xD6, 0x58, 0x83, 0x36, 0xA1, + 0x88, 0x77, 0xD5, 0x94, 0x97, 0x3E, 0xC4, 0xC2, 0x3E, 0x3A, 0x88, 0x88, + 0xE5, 0x07, 0x7A, 0xF9, 0xE1, 0x97, 0x93, 0x84, 0x1F, 0xF8, 0xE1, 0x14, + 0xE0, 0x34, 0x08, 0xFE, 0x2C, 0x32, 0xA2, 0x33, 0xA4, 0x00, 0x4A, 0x81, + 0x7B, 0x43, 0x03, 0x48, 0x48, 0xBA, 0x99, 0x2D, 0xC7, 0x15, 0x3C, 0x60, + 0x10, 0x3C, 0xB4, 0x85, 0x88, 0x4B, 0xFB, 0x08, 0xA1, 0xDB, 0xCE, 0xE0, + 0x10, 0x86, 0xEA, 0x98, 0x44, 0x13, 0x11, 0xBC, 0xCC, 0x85, 0xB8, 0x8D, + 0xBA, 0x3E, 0x87, 0xFA, 0x70, 0x51, 0xBB, 0x04, 0xE1, 0xDC, 0xCE, 0x39, + 0x0D, 0xDE, 0x60, 0x12, 0xFA, 0xA0, 0x01, 0x60, 0x60, 0x36, 0x63, 0x33, + 0x78, 0x1E, 0xC1, 0x8A, 0x54, 0xE6, 0x18, 0xE0, 0x7A, 0x8F, 0x9D, 0x61, + 0x1D, 0x36, 0x41, 0x07, 0xD6, 0xCB, 0x00, 0x4A, 0x81, 0x88, 0x3B, 0x6E, + 0x47, 0xF6, 0xE1, 0x06, 0x44, 0x80, 0x0E, 0xBA, 0xCA, 0x0F, 0x1C, 0x21, + 0x06, 0x70, 0x00, 0x45, 0x8C, 0xC5, 0x40, 0x50, 0xC4, 0x0A, 0x8E, 0x00, + 0x00, 0x1E, 0x40, 0x07, 0x26, 0x2E, 0x07, 0xE6, 0x80, 0x08, 0xC0, 0xD2, + 0x13, 0x3E, 0x61, 0x07, 0x76, 0xE0, 0x14, 0x8E, 0xE0, 0x15, 0x28, 0x90, + 0x59, 0x3D, 0x8E, 0x6B, 0x7E, 0x65, 0x1E, 0x3A, 0xBA, 0xA3, 0xE3, 0xE1, + 0x1C, 0x20, 0xC8, 0x1B, 0xAA, 0x41, 0x1A, 0x00, 0x87, 0x16, 0xFC, 0x41, + 0x1A, 0xB4, 0x45, 0x83, 0x48, 0x2E, 0x73, 0x78, 0xD6, 0x59, 0x7F, 0x77, + 0xE5, 0x70, 0x18, 0x4C, 0xED, 0x32, 0xA5, 0x8B, 0x16, 0x2F, 0x99, 0x16, + 0x24, 0xC8, 0x62, 0x3E, 0x96, 0x57, 0x49, 0x3C, 0xA8, 0xB6, 0x7E, 0xF9, + 0xA6, 0xAB, 0xC1, 0x31, 0x41, 0x61, 0x0E, 0x50, 0x61, 0x57, 0x8D, 0xA0, + 0x02, 0x0C, 0x43, 0x2D, 0x19, 0xE2, 0xA8, 0x91, 0xBA, 0x84, 0xF2, 0x01, + 0x08, 0x52, 0xA0, 0xF8, 0x0E, 0xE1, 0xDC, 0x68, 0xC9, 0x73, 0x7A, 0x28, + 0x8C, 0xB7, 0xFA, 0xCB, 0xE6, 0xF7, 0xA9, 0x89, 0x42, 0x97, 0xA8, 0x0B, + 0xAB, 0xC7, 0x4D, 0xA9, 0x0E, 0x41, 0xFE, 0xDD, 0xE0, 0x40, 0x10, 0x0C, + 0x21, 0x11, 0xDE, 0x60, 0x05, 0x80, 0xE2, 0x0D, 0x14, 0x80, 0x0C, 0x1E, + 0xA1, 0x0A, 0xD3, 0xCC, 0x0F, 0x36, 0x81, 0xFC, 0x54, 0x46, 0x13, 0xF4, + 0x58, 0xAE, 0x9D, 0xC1, 0xBD, 0xD8, 0x0B, 0x9C, 0xEE, 0xE3, 0xC4, 0xB0, + 0xE1, 0x01, 0x20, 0xF8, 0x0F, 0xF4, 0x17, 0x10, 0x2E, 0xC1, 0x02, 0x0C, + 0xE4, 0x16, 0xF2, 0xE6, 0x58, 0x9A, 0x60, 0x07, 0x2A, 0x80, 0xB1, 0x31, + 0xEF, 0x06, 0x44, 0xD8, 0x08, 0x3E, 0x41, 0xB2, 0x43, 0xC1, 0x13, 0x74, + 0x60, 0x15, 0x76, 0x40, 0x08, 0x7A, 0xD9, 0x3D, 0xBF, 0x66, 0xA3, 0x1B, + 0x12, 0x6D, 0xE8, 0x03, 0x59, 0xE8, 0xA1, 0x71, 0xEC, 0x01, 0x1E, 0xBC, + 0x81, 0x1B, 0x4E, 0x1B, 0x70, 0x92, 0x41, 0x1A, 0xA4, 0x61, 0x71, 0xC8, + 0xE1, 0x47, 0x7C, 0x96, 0xA5, 0x90, 0xF2, 0x95, 0x31, 0xB1, 0x21, 0x57, + 0x19, 0x4C, 0x61, 0x79, 0x2F, 0x5F, 0xF9, 0xA4, 0x41, 0x62, 0x11, 0x41, + 0xC2, 0x9C, 0x7E, 0x3B, 0x2C, 0x3C, 0xA8, 0x83, 0x6A, 0xAB, 0x83, 0x90, + 0x3C, 0x6A, 0x7B, 0x64, 0x0E, 0x76, 0x40, 0x4E, 0xE7, 0x20, 0x14, 0x9C, + 0x3C, 0x02, 0x24, 0x60, 0x02, 0x0C, 0x40, 0x67, 0xAA, 0xE1, 0xB5, 0x63, + 0x2A, 0xBA, 0x55, 0xA9, 0x1A, 0x4C, 0xC0, 0x0D, 0x8A, 0x4F, 0x26, 0xC9, + 0xF7, 0x4B, 0xCE, 0x97, 0x97, 0x34, 0x73, 0xA7, 0x94, 0x6A, 0xCB, 0x74, + 0x6A, 0xDC, 0xE0, 0x00, 0x9C, 0x87, 0xAA, 0xCD, 0xBB, 0x78, 0xCB, 0xCA, + 0x6E, 0xA8, 0x64, 0xA0, 0x9C, 0xD1, 0xA0, 0x03, 0xF8, 0x40, 0x3D, 0x18, + 0x61, 0x11, 0xFE, 0x60, 0x36, 0xFB, 0xBC, 0xDE, 0xAC, 0x28, 0x9E, 0xF7, + 0x98, 0x71, 0xE9, 0xD9, 0x08, 0x8E, 0x40, 0xFD, 0xFE, 0x21, 0x67, 0x05, + 0xE2, 0x82, 0x48, 0x01, 0x00, 0x54, 0xE6, 0x07, 0xFE, 0xFE, 0xA0, 0x13, + 0x1E, 0xE1, 0x12, 0x6E, 0xE0, 0x1F, 0x76, 0x40, 0x07, 0x1A, 0xF0, 0x06, + 0x54, 0x85, 0x00, 0x00, 0xA0, 0x00, 0xB2, 0xE8, 0x06, 0x74, 0xC0, 0x89, + 0x77, 0xE0, 0xB8, 0xE7, 0x40, 0x14, 0x74, 0xC0, 0x13, 0x44, 0xE1, 0x08, + 0x36, 0x6D, 0x4C, 0x1D, 0x4B, 0xB3, 0xC4, 0x65, 0xB1, 0x04, 0xC8, 0x1C, + 0xC8, 0x01, 0x45, 0xD4, 0x65, 0xA4, 0xF1, 0xE1, 0x1D, 0xFA, 0x21, 0x47, + 0x66, 0x4D, 0xB5, 0x61, 0xBC, 0xB5, 0xDF, 0x41, 0xCB, 0xE1, 0x52, 0xC2, + 0xE2, 0x01, 0x11, 0xC9, 0x41, 0x80, 0x32, 0x38, 0xB6, 0xC5, 0x73, 0x96, + 0x05, 0x33, 0xD9, 0x7D, 0x78, 0xD5, 0x22, 0x45, 0x79, 0x87, 0x5C, 0x7E, + 0x94, 0x1C, 0x1F, 0x64, 0x4B, 0xC9, 0x8D, 0x5C, 0xB6, 0xE4, 0x41, 0xA5, + 0xC2, 0x42, 0x16, 0x14, 0x63, 0x0E, 0xE6, 0x00, 0x14, 0x5C, 0xF0, 0x06, + 0xC0, 0xE7, 0xCA, 0x8F, 0x80, 0x3A, 0x71, 0xC0, 0x15, 0x6A, 0x18, 0xBA, + 0xB9, 0xFC, 0x67, 0x79, 0x23, 0x14, 0x64, 0x40, 0x0F, 0x8C, 0x4F, 0xBB, + 0xC6, 0xBB, 0x60, 0xF4, 0x60, 0xCA, 0xB0, 0xAD, 0x08, 0x8F, 0xE9, 0x4F, + 0x43, 0x12, 0x17, 0xA7, 0x6F, 0x51, 0x91, 0x50, 0x28, 0x8E, 0xD0, 0x85, + 0x52, 0xE0, 0x5F, 0xD9, 0xE0, 0x03, 0x14, 0x81, 0x12, 0x1A, 0xA1, 0x29, + 0xA2, 0x42, 0x52, 0x37, 0x21, 0x61, 0x1F, 0x81, 0x13, 0x20, 0x7E, 0x80, + 0x73, 0x33, 0xAE, 0x8F, 0xC1, 0x36, 0xE5, 0x6E, 0x0C, 0x25, 0x85, 0x14, + 0x06, 0xC0, 0xCD, 0xA2, 0xA8, 0x12, 0x9A, 0xE1, 0x0E, 0x1E, 0x20, 0x03, + 0x76, 0x20, 0x07, 0x8E, 0xC0, 0x00, 0xEE, 0xCB, 0x00, 0x04, 0x2E, 0xF2, + 0x30, 0xC4, 0x08, 0x2A, 0x3C, 0x14, 0x42, 0xC1, 0x93, 0x3F, 0xE1, 0x65, + 0x6C, 0x3B, 0x1F, 0xBF, 0x21, 0x86, 0x43, 0xBB, 0x6C, 0xD0, 0xA1, 0x09, + 0xFE, 0x7E, 0x61, 0x1E, 0x76, 0x44, 0x80, 0xDC, 0x45, 0xA6, 0x46, 0x1A, + 0x94, 0x72, 0xBD, 0xC5, 0x01, 0x07, 0xC6, 0xA9, 0xC1, 0x5B, 0xDE, 0x01, + 0xF8, 0xA0, 0x35, 0x59, 0xE9, 0xA3, 0xA0, 0xE8, 0x21, 0x1E, 0x2E, 0xE3, + 0x86, 0x71, 0x58, 0xA5, 0xF1, 0xB1, 0x69, 0xC9, 0xE9, 0x69, 0x09, 0x53, + 0x79, 0xC3, 0xC2, 0xC8, 0xA7, 0x3D, 0x2C, 0x6E, 0x9A, 0xDA, 0x75, 0x5A, + 0xA5, 0xF8, 0x61, 0x1B, 0x16, 0xC3, 0x13, 0xE4, 0x34, 0x14, 0xB6, 0xB6, + 0x65, 0x25, 0x2E, 0x1E, 0x1F, 0x00, 0x02, 0x20, 0xC0, 0x00, 0xAC, 0x60, + 0xDD, 0x77, 0x8B, 0x1F, 0x74, 0x80, 0x05, 0x18, 0x55, 0xDE, 0x83, 0xA2, + 0x60, 0x8E, 0x2A, 0xDB, 0xCA, 0x00, 0xF9, 0x8C, 0x8A, 0x28, 0x12, 0xF5, + 0xF8, 0xBE, 0x0C, 0x0E, 0x8E, 0x6A, 0xA7, 0xAA, 0x3A, 0xE0, 0x99, 0x4F, + 0x10, 0x56, 0x00, 0x04, 0x92, 0x30, 0x44, 0x13, 0x1E, 0x65, 0x1E, 0xA1, + 0xAD, 0x7B, 0xB2, 0x11, 0xEE, 0x1B, 0xE2, 0xE3, 0x5A, 0x19, 0x03, 0xD8, + 0x36, 0xBF, 0x70, 0x8B, 0x26, 0x77, 0x14, 0x02, 0x80, 0x65, 0x18, 0xD6, + 0x0F, 0x1E, 0xA1, 0x06, 0x0E, 0xA3, 0x00, 0x00, 0xA0, 0xD3, 0x3D, 0x3D, + 0x7C, 0xE2, 0xAA, 0x55, 0x22, 0x20, 0x07, 0x86, 0xC0, 0x08, 0x76, 0xC0, + 0x08, 0xCC, 0x7E, 0xA2, 0x8B, 0x00, 0x07, 0xAC, 0x1E, 0xA5, 0x11, 0x8A, + 0x1E, 0x7E, 0x01, 0x1D, 0x86, 0x05, 0xB4, 0x67, 0x74, 0x57, 0x3A, 0x2E, + 0x1F, 0x80, 0xC1, 0x14, 0xB8, 0x80, 0x0B, 0x00, 0xA3, 0xD0, 0x70, 0x8E, + 0x5B, 0xE9, 0x32, 0x22, 0xF6, 0x81, 0x1F, 0x4E, 0x8A, 0x1B, 0xA4, 0xC1, + 0x1F, 0x00, 0x67, 0xB5, 0x17, 0x45, 0x1D, 0x3E, 0x09, 0x36, 0x02, 0xB3, + 0x2F, 0xE5, 0xA1, 0xA3, 0xE1, 0xEF, 0x1C, 0x9C, 0x55, 0x96, 0x47, 0x0F, + 0x3E, 0x97, 0x97, 0xFE, 0xB7, 0xC9, 0x7F, 0x2B, 0x8E, 0x7C, 0xDA, 0x3B, + 0xC8, 0x1E, 0xC0, 0x5E, 0xA7, 0xD9, 0xBF, 0x35, 0xF8, 0xC1, 0x13, 0x34, + 0x19, 0x15, 0xAE, 0x17, 0x13, 0x88, 0x40, 0x07, 0x22, 0xE0, 0x83, 0xE1, + 0xDF, 0x0A, 0x72, 0x00, 0x01, 0x98, 0x3B, 0x08, 0xB0, 0x54, 0xEE, 0x01, + 0x42, 0x9F, 0xC0, 0x81, 0x04, 0x0B, 0x1A, 0x3C, 0x88, 0x30, 0xA1, 0x42, + 0x81, 0xD5, 0x4A, 0x98, 0x11, 0x24, 0x09, 0x91, 0xA0, 0x43, 0x84, 0x24, + 0x9E, 0xB9, 0xA4, 0x47, 0x0D, 0x1A, 0x3D, 0x78, 0xDC, 0xE8, 0x71, 0x23, + 0x28, 0x52, 0x24, 0x3D, 0x84, 0x28, 0x1E, 0x42, 0x14, 0x89, 0x10, 0x9E, + 0x43, 0x82, 0x04, 0x21, 0x3A, 0x84, 0xA7, 0x23, 0xA1, 0x94, 0x82, 0x2E, + 0xA5, 0xB9, 0x24, 0xE3, 0x03, 0xC4, 0x42, 0x8C, 0x2A, 0xF9, 0xF1, 0xB3, + 0xA8, 0xD1, 0x23, 0x47, 0x7E, 0x1A, 0x11, 0x05, 0xC4, 0x69, 0x13, 0xA7, + 0x63, 0x4C, 0x8F, 0x3D, 0x73, 0xF6, 0x54, 0xCE, 0x11, 0x39, 0x3F, 0x54, + 0xE5, 0xCB, 0xA7, 0x0F, 0x6B, 0xA9, 0x00, 0x3F, 0x02, 0xD9, 0x60, 0x53, + 0x34, 0x0E, 0x81, 0x00, 0x06, 0x08, 0x00, 0x28, 0x50, 0xC0, 0xC0, 0x03, + 0x00, 0x04, 0x08, 0x4C, 0x90, 0x70, 0x23, 0x47, 0x90, 0x1D, 0x46, 0x82, + 0xD4, 0x9D, 0x81, 0xEA, 0xC6, 0xAB, 0x7C, 0xF3, 0xFA, 0xF6, 0xE5, 0xEB, + 0x17, 0xB0, 0xDF, 0xC1, 0xF9, 0xE8, 0x99, 0x02, 0x37, 0xEF, 0x1C, 0x2E, + 0x5C, 0xF4, 0xF8, 0xEA, 0x43, 0x77, 0xCB, 0x14, 0x97, 0xC9, 0x58, 0x28, + 0x4B, 0xBE, 0xB5, 0x2B, 0x33, 0x30, 0x6C, 0xE8, 0xE0, 0xC9, 0xC3, 0x9A, + 0x70, 0x5F, 0xC2, 0x7C, 0xFC, 0xE0, 0xA9, 0xE3, 0x66, 0xAD, 0x1A, 0xAD, + 0xD5, 0xD2, 0xA4, 0x55, 0xC3, 0x06, 0x8E, 0x1C, 0xBD, 0x79, 0x57, 0xB1, + 0xD6, 0xE6, 0x9B, 0x8F, 0x1C, 0xBA, 0xFE, 0x78, 0xF4, 0x7A, 0x9F, 0x03, + 0xD7, 0x78, 0xB0, 0x70, 0xC1, 0x7F, 0x09, 0x17, 0x1F, 0x4E, 0x9B, 0x36, + 0xEE, 0xBF, 0xB8, 0xF1, 0x5D, 0xC5, 0x07, 0x3D, 0x1F, 0xF4, 0xE9, 0xFC, + 0xA0, 0xF3, 0xAB, 0x5E, 0xDD, 0x1E, 0xBE, 0xEB, 0xEF, 0xF8, 0x75, 0x77, + 0x15, 0xC4, 0xD3, 0xA7, 0x4F, 0xB2, 0x88, 0xCC, 0x19, 0x12, 0xE1, 0x81, + 0x81, 0x22, 0xA3, 0xD8, 0x97, 0x2A, 0x72, 0xE3, 0xC8, 0x0D, 0x6B, 0x0B, + 0xEB, 0xDB, 0xBF, 0x8F, 0x3F, 0xBF, 0xFE, 0xFD, 0xFC, 0xF3, 0x63, 0x92, + 0x71, 0x06, 0x44, 0x2C, 0x99, 0xA4, 0x86, 0x19, 0x68, 0xB8, 0xE1, 0xC6, + 0x46, 0x1C, 0xE1, 0x21, 0x48, 0x45, 0x1E, 0x21, 0x42, 0xC8, 0x4C, 0x87, + 0x4C, 0x08, 0x47, 0x84, 0x84, 0x34, 0x68, 0xE1, 0x85, 0x78, 0x88, 0x91, + 0xC6, 0x18, 0x1D, 0x80, 0x50, 0x48, 0x44, 0x86, 0x24, 0xB2, 0xC8, 0x1D, + 0x77, 0x08, 0xD5, 0x88, 0x1F, 0x8E, 0xA4, 0xB8, 0x89, 0x23, 0x80, 0x38, + 0xD2, 0xCC, 0x33, 0xC7, 0x2C, 0xF5, 0xCC, 0x53, 0xCE, 0x38, 0x63, 0x83, + 0x11, 0x72, 0x78, 0x22, 0x4F, 0x56, 0xF9, 0xEC, 0x83, 0x4D, 0x01, 0x26, + 0xC4, 0x51, 0x43, 0x0D, 0x7E, 0x3C, 0xE2, 0x47, 0x04, 0x11, 0x04, 0x71, + 0x43, 0x5B, 0x04, 0xA0, 0x75, 0x16, 0x5A, 0x04, 0x3C, 0x10, 0x81, 0x0E, + 0x41, 0x14, 0xC1, 0x64, 0x04, 0x44, 0xEC, 0x20, 0x04, 0x71, 0xC8, 0x25, + 0x67, 0x1C, 0x60, 0xDF, 0xA0, 0xF3, 0xCA, 0x2B, 0xE0, 0xF8, 0x78, 0x15, + 0x30, 0x93, 0x45, 0x46, 0x19, 0x17, 0xA6, 0xDC, 0xC2, 0xC5, 0x2E, 0x93, + 0xCD, 0x59, 0xD9, 0x64, 0x6F, 0x02, 0xB3, 0xD9, 0x39, 0xF4, 0xF4, 0x88, + 0x90, 0x68, 0x59, 0xF5, 0xF9, 0x0E, 0x3C, 0xDC, 0x48, 0xF3, 0xCB, 0x6A, + 0xAF, 0xD0, 0xF2, 0x4B, 0x35, 0xD6, 0x60, 0xD3, 0xCF, 0xFE, 0x3B, 0x57, + 0x65, 0x05, 0x0E, 0x6F, 0x92, 0xA2, 0x83, 0x8D, 0x97, 0xC2, 0x5D, 0x8A, + 0x29, 0x98, 0xC3, 0xE1, 0xC6, 0xE9, 0x73, 0xB4, 0x4D, 0x27, 0xDD, 0x74, + 0xD6, 0x4D, 0xA7, 0xDD, 0x3B, 0xDA, 0x5D, 0xC7, 0x8F, 0x3D, 0xF6, 0x78, + 0x67, 0x0F, 0x26, 0x44, 0x80, 0x12, 0x4A, 0x28, 0xE6, 0x19, 0x71, 0xC3, + 0x5A, 0x11, 0xCC, 0xF1, 0xC9, 0x28, 0x9E, 0x94, 0xA2, 0x4B, 0x29, 0x11, + 0x40, 0xF0, 0x0A, 0x3E, 0x7E, 0x2A, 0x04, 0xCF, 0xB0, 0xFD, 0x1D, 0x8B, + 0x6C, 0xB2, 0xCA, 0x1E, 0xCB, 0x4F, 0x0D, 0x69, 0x10, 0x22, 0x89, 0x24, + 0x7A, 0xE8, 0x71, 0xC8, 0xB4, 0x75, 0x94, 0x91, 0xC6, 0x81, 0xD3, 0x12, + 0xE2, 0x06, 0x1E, 0x17, 0x66, 0x44, 0x12, 0xB4, 0x28, 0x21, 0x02, 0x87, + 0x1A, 0xDC, 0x36, 0xE8, 0xC6, 0x85, 0x15, 0xE1, 0x71, 0x09, 0x09, 0x6A, + 0x78, 0x30, 0x02, 0x1E, 0x92, 0x44, 0x72, 0x08, 0x1C, 0x24, 0xFE, 0x61, + 0x14, 0x51, 0x28, 0x0A, 0xF5, 0x48, 0x23, 0x7F, 0x70, 0x02, 0x15, 0x53, + 0x35, 0x42, 0xE5, 0x0C, 0x20, 0x36, 0xC8, 0x31, 0x47, 0x3F, 0xFB, 0x5C, + 0x45, 0x0F, 0x3C, 0x11, 0x2C, 0xF0, 0x43, 0x1C, 0x36, 0xF8, 0x51, 0x89, + 0x25, 0x12, 0x54, 0x30, 0xC4, 0x0C, 0x0F, 0x48, 0xF0, 0xC0, 0x04, 0x05, + 0xB4, 0xF5, 0x40, 0x5B, 0x1F, 0x4F, 0x19, 0xC1, 0x0D, 0x13, 0x44, 0x30, + 0x44, 0x05, 0xE0, 0x00, 0x76, 0x95, 0xA6, 0x97, 0x5A, 0x3A, 0xCF, 0x37, + 0xA6, 0x94, 0x82, 0x0E, 0x9A, 0xF9, 0xA0, 0x23, 0x27, 0x9C, 0x73, 0xEE, + 0x3C, 0xA7, 0xCE, 0x95, 0x5D, 0x81, 0x45, 0xD0, 0x58, 0x54, 0xC1, 0x04, + 0x12, 0x4C, 0x2C, 0xC1, 0x44, 0x0F, 0x3D, 0x34, 0x31, 0x4A, 0x29, 0xBF, + 0x80, 0xC3, 0xE7, 0x40, 0xA0, 0x49, 0x3D, 0x75, 0x41, 0xD2, 0xBD, 0xD3, + 0xFE, 0x0F, 0x6A, 0xD5, 0x14, 0xBA, 0xDA, 0xD6, 0xDF, 0xCC, 0xD3, 0x5B, + 0x6F, 0xD8, 0x9C, 0x13, 0x98, 0x72, 0xC7, 0x2D, 0x27, 0x98, 0xA5, 0x9D, + 0xF2, 0x85, 0x8F, 0x72, 0x9F, 0x85, 0x1A, 0x9D, 0xA8, 0xF8, 0xC8, 0xB3, + 0x5D, 0x75, 0xF8, 0x98, 0x8A, 0xCF, 0xA9, 0xAA, 0x7A, 0xE7, 0x5D, 0x77, + 0xD3, 0x9C, 0xA2, 0xCD, 0x1C, 0xB2, 0xC4, 0x02, 0x44, 0x28, 0x37, 0x48, + 0x50, 0x80, 0x04, 0xFF, 0x78, 0xE2, 0x09, 0xD3, 0xAF, 0xFC, 0xC2, 0x4D, + 0x29, 0x47, 0xB8, 0xF2, 0xE7, 0x42, 0xD7, 0xC0, 0xB3, 0x6C, 0xE6, 0x9A, + 0x6F, 0xBE, 0x39, 0x33, 0x2A, 0xB8, 0x71, 0x48, 0xB4, 0x24, 0x51, 0xF4, + 0xD1, 0x25, 0x1B, 0x31, 0x58, 0x47, 0x47, 0xAA, 0x0B, 0xC2, 0xA0, 0x4B, + 0x28, 0x45, 0x5B, 0x2E, 0x22, 0x1C, 0xA9, 0xA4, 0x12, 0x22, 0x88, 0xE0, + 0x71, 0x82, 0x19, 0x1C, 0xAC, 0x00, 0x6D, 0x21, 0x85, 0x48, 0x64, 0x88, + 0x22, 0x77, 0xF4, 0xD1, 0x88, 0x51, 0xFD, 0xE6, 0xDB, 0x88, 0x52, 0x48, + 0xDD, 0xE8, 0x4C, 0x53, 0x35, 0x3E, 0xF3, 0x83, 0x0D, 0x43, 0xD0, 0x77, + 0xD5, 0x3E, 0xF4, 0x14, 0xA1, 0x40, 0x0D, 0x97, 0xB0, 0xE1, 0x48, 0x25, + 0x8B, 0x4C, 0x30, 0x01, 0x04, 0x0F, 0x40, 0x10, 0x41, 0x5B, 0x65, 0x3D, + 0x80, 0x3E, 0xFA, 0x22, 0x8F, 0x7C, 0x43, 0x05, 0xA4, 0x78, 0x09, 0xB3, + 0xCB, 0x9A, 0x82, 0x63, 0xE6, 0x6D, 0x69, 0xDE, 0xE2, 0x73, 0x9C, 0x3C, + 0xCB, 0x49, 0xE7, 0x16, 0x43, 0x53, 0xC1, 0x83, 0x0C, 0x50, 0x00, 0x03, + 0x07, 0x28, 0x60, 0x01, 0x04, 0x50, 0xC0, 0x03, 0x14, 0xE0, 0x00, 0x14, + 0xA0, 0x00, 0x0F, 0xAE, 0x70, 0x8B, 0xCD, 0x60, 0x03, 0x1E, 0x8D, 0x11, + 0x48, 0xD5, 0xA4, 0xB6, 0x90, 0xD2, 0xA8, 0x03, 0x1B, 0xF1, 0x30, 0x47, + 0x6F, 0xE2, 0xF1, 0xFE, 0x1B, 0x2F, 0xCD, 0x26, 0x39, 0x2D, 0x0B, 0x93, + 0xCB, 0x5A, 0xD6, 0xA9, 0xBE, 0x38, 0x07, 0x85, 0x70, 0x9B, 0x9B, 0xA8, + 0xBA, 0xA3, 0xAA, 0xBC, 0xA1, 0xCA, 0x1E, 0xDD, 0x79, 0x87, 0x0D, 0x69, + 0x08, 0x0F, 0x4C, 0xC0, 0xA2, 0x15, 0x98, 0x60, 0xC6, 0x79, 0xE6, 0xA0, + 0x03, 0xB7, 0xE4, 0x60, 0x08, 0xB9, 0xC2, 0x84, 0x27, 0x1E, 0xA7, 0x0B, + 0x6F, 0x6C, 0x89, 0x73, 0x4C, 0x6C, 0xA2, 0x13, 0x37, 0x47, 0x07, 0x16, + 0xE8, 0x21, 0x12, 0x11, 0xC1, 0x43, 0x4A, 0x08, 0xD1, 0x86, 0x34, 0xB0, + 0xA0, 0x0C, 0x67, 0x40, 0x03, 0x1A, 0x54, 0xF2, 0x11, 0x92, 0x30, 0x88, + 0x23, 0x88, 0x88, 0x56, 0x44, 0x08, 0xA1, 0x06, 0x6F, 0xA5, 0x71, 0x22, + 0x78, 0xB0, 0xC4, 0x20, 0x56, 0x70, 0x09, 0x15, 0x90, 0x40, 0x24, 0x28, + 0x31, 0x44, 0x24, 0x82, 0xC7, 0x87, 0x3B, 0xC8, 0xE1, 0x27, 0x2A, 0x12, + 0xCA, 0x8A, 0x8A, 0xA7, 0xBC, 0x63, 0xDC, 0xA8, 0x19, 0xB6, 0x18, 0x98, + 0x33, 0xE4, 0x60, 0x03, 0x1F, 0xD0, 0x62, 0x1F, 0xA2, 0xB1, 0x9E, 0x27, + 0x08, 0x60, 0x82, 0x1F, 0xFC, 0x80, 0x62, 0x76, 0x90, 0x00, 0x01, 0x20, + 0x00, 0x01, 0x5B, 0x58, 0x41, 0x69, 0x38, 0xC8, 0x00, 0x0E, 0x2A, 0x70, + 0x84, 0x8D, 0xA1, 0x4F, 0x02, 0x12, 0x88, 0x40, 0x0E, 0x72, 0x80, 0x03, + 0x79, 0x64, 0x4A, 0x53, 0xF1, 0xF3, 0x0B, 0x3D, 0xBE, 0xD1, 0x98, 0xDB, + 0x60, 0x83, 0x67, 0xF8, 0xDB, 0x85, 0x29, 0x24, 0x93, 0x19, 0xFE, 0xCD, + 0xA9, 0x0A, 0x1A, 0x20, 0x60, 0x02, 0x31, 0xE0, 0xCB, 0x04, 0x1A, 0x60, + 0x98, 0x07, 0x20, 0x80, 0x01, 0x04, 0x50, 0x00, 0x04, 0x68, 0x00, 0x68, + 0x55, 0xC8, 0x02, 0x16, 0x4C, 0xA1, 0x0B, 0x5D, 0x6C, 0x46, 0x36, 0x51, + 0x43, 0xC8, 0x05, 0xE5, 0x81, 0x98, 0xFE, 0xDE, 0x78, 0x90, 0x83, 0x2C, + 0x03, 0x5B, 0xDA, 0x8A, 0x13, 0xBF, 0x6F, 0xE2, 0xE6, 0x6D, 0xCF, 0x91, + 0xDB, 0x74, 0xE8, 0x96, 0x2A, 0x51, 0xA5, 0x33, 0x55, 0xAA, 0x32, 0xD5, + 0x0D, 0xBB, 0x53, 0x0B, 0x51, 0x44, 0xE3, 0x13, 0xAD, 0x60, 0x85, 0xAB, + 0x74, 0xF0, 0x80, 0x02, 0x44, 0xE0, 0x08, 0x46, 0x58, 0xC5, 0x28, 0x44, + 0x61, 0x05, 0x5B, 0x78, 0xC2, 0x0A, 0xA5, 0x78, 0x85, 0x5E, 0xF4, 0x61, + 0xAC, 0x27, 0x2A, 0x74, 0xA1, 0x0C, 0x25, 0xC8, 0x3E, 0xE2, 0xC0, 0x82, + 0x41, 0x50, 0x91, 0x5B, 0xE7, 0xC2, 0x43, 0x18, 0x52, 0x20, 0x83, 0x34, + 0x88, 0xC1, 0x5C, 0x75, 0x98, 0x16, 0x1E, 0xC4, 0xA8, 0x06, 0x92, 0x44, + 0x2B, 0x12, 0x0D, 0x6A, 0x89, 0x20, 0x34, 0x12, 0xA1, 0x06, 0xD5, 0x81, + 0x05, 0x61, 0x50, 0x80, 0x1E, 0x6C, 0x17, 0x89, 0x42, 0x08, 0x62, 0x0F, + 0x6B, 0x08, 0x9E, 0x89, 0xFC, 0xF5, 0x87, 0x45, 0x3C, 0xA2, 0x5F, 0x8E, + 0xD8, 0xC4, 0x50, 0x38, 0x01, 0x54, 0x4E, 0xD8, 0xC8, 0x29, 0x35, 0xD2, + 0x44, 0xF4, 0x6C, 0x51, 0x8F, 0x7B, 0xFC, 0x48, 0x1E, 0xA3, 0x80, 0xC0, + 0x02, 0x6A, 0x10, 0x87, 0x38, 0x2C, 0x82, 0x0D, 0x1C, 0x7B, 0x80, 0x15, + 0xCE, 0x11, 0x8F, 0x78, 0xCC, 0x83, 0x1C, 0xE4, 0xC0, 0xC6, 0x2F, 0x7A, + 0x45, 0x0A, 0x21, 0xEC, 0x20, 0x03, 0x10, 0xD8, 0xC1, 0x0E, 0x6E, 0xF0, + 0x0D, 0xE2, 0x2C, 0x07, 0x53, 0xF1, 0x7B, 0xE5, 0xCA, 0x6A, 0x93, 0x15, + 0x5B, 0xCA, 0x49, 0x32, 0x92, 0x89, 0xD3, 0x2E, 0x74, 0x31, 0x19, 0x30, + 0xD4, 0x89, 0x0A, 0x17, 0x38, 0x66, 0x01, 0x81, 0xE9, 0x4B, 0x01, 0x08, + 0x76, 0xB0, 0x84, 0xF5, 0xEB, 0x5F, 0x91, 0x80, 0x85, 0x2C, 0x28, 0xD6, + 0x16, 0x54, 0xA0, 0x42, 0x15, 0xAA, 0x00, 0xB4, 0xA0, 0xFE, 0x45, 0x30, + 0x4F, 0x9F, 0xB1, 0x26, 0x38, 0xD0, 0x01, 0x36, 0x73, 0xC4, 0x03, 0x1B, + 0xB8, 0x48, 0x1B, 0xA7, 0x48, 0x78, 0x1C, 0xD0, 0x82, 0xE9, 0x36, 0xF3, + 0x20, 0xE7, 0x0A, 0x43, 0xB5, 0x0F, 0xE8, 0xA0, 0x73, 0x3B, 0x79, 0x93, + 0x21, 0x3B, 0xAB, 0x03, 0x43, 0x78, 0xD8, 0xD0, 0x86, 0xFD, 0xF8, 0x84, + 0x36, 0x54, 0xA1, 0x8A, 0x54, 0xA8, 0x62, 0x08, 0x3B, 0x88, 0x40, 0x01, + 0x1E, 0x70, 0x84, 0x08, 0x78, 0x42, 0x16, 0xA7, 0x60, 0x5C, 0x11, 0x76, + 0x60, 0x05, 0x21, 0x94, 0xC2, 0x0A, 0x3B, 0x48, 0x68, 0x43, 0x9F, 0x0B, + 0xDD, 0xCD, 0xD5, 0xE3, 0x05, 0x2B, 0x08, 0xD1, 0x48, 0x18, 0x94, 0xC6, + 0x3A, 0xA8, 0x21, 0x8E, 0x67, 0x70, 0x43, 0x47, 0x3F, 0x5A, 0x07, 0x37, + 0xBC, 0xA4, 0x0D, 0x32, 0x79, 0xC9, 0x4C, 0x22, 0xE4, 0x2D, 0x3C, 0xA4, + 0x61, 0x8A, 0x87, 0x70, 0x83, 0x19, 0x74, 0x27, 0x06, 0xDF, 0x0D, 0x62, + 0xBE, 0x85, 0x78, 0x43, 0x1E, 0xF6, 0x60, 0x88, 0x3C, 0xF2, 0xD1, 0x8F, + 0x3B, 0xDD, 0xA9, 0x23, 0x1C, 0x01, 0x54, 0x39, 0x00, 0x2C, 0x60, 0x82, + 0x3C, 0x86, 0x11, 0x8E, 0xF0, 0x8F, 0x7B, 0xDC, 0x83, 0x91, 0xF8, 0xC0, + 0x46, 0x0E, 0x08, 0x10, 0x03, 0xA8, 0xFA, 0x81, 0x0D, 0x37, 0xF8, 0x15, + 0x36, 0x02, 0xF3, 0x23, 0x0C, 0xC7, 0x03, 0x1D, 0xD5, 0x78, 0x05, 0x3D, + 0x28, 0xB5, 0xD6, 0x97, 0xB1, 0x75, 0x38, 0xE7, 0xF8, 0x45, 0x2C, 0x6B, + 0x23, 0x0C, 0xFD, 0xD5, 0xC9, 0xAE, 0xB9, 0xD4, 0x65, 0x15, 0x2C, 0x30, + 0xD8, 0x04, 0x2A, 0x50, 0x00, 0x01, 0x08, 0xC0, 0x60, 0x9F, 0x24, 0xD8, + 0x27, 0xA5, 0x85, 0x81, 0x14, 0x38, 0x80, 0x60, 0x35, 0x50, 0x05, 0x2C, + 0xD8, 0x62, 0xC8, 0xB6, 0xC0, 0x82, 0x63, 0xAB, 0xD0, 0xD8, 0x24, 0x3B, + 0xFE, 0x56, 0xB1, 0x57, 0x30, 0x05, 0x9E, 0xB0, 0x41, 0x0E, 0xDB, 0xC8, + 0xE3, 0x17, 0xE8, 0xA0, 0x87, 0x56, 0xE7, 0xD1, 0x84, 0x95, 0x8D, 0x76, + 0x53, 0x2C, 0xEB, 0x26, 0x09, 0xF9, 0x62, 0xDA, 0xAB, 0xD0, 0xCD, 0x9C, + 0xE6, 0xD4, 0x8E, 0x99, 0xB5, 0x93, 0xB7, 0x55, 0xD9, 0x03, 0x1E, 0xF5, + 0x30, 0x95, 0x3B, 0xF8, 0x21, 0x8A, 0x56, 0xCC, 0x62, 0x70, 0x98, 0x68, + 0xC5, 0x0E, 0x66, 0x80, 0x00, 0x00, 0x68, 0x6C, 0x06, 0xA0, 0x90, 0xC5, + 0x27, 0x1A, 0x87, 0x83, 0x08, 0x90, 0xA2, 0x3D, 0xA2, 0xB8, 0x81, 0x37, + 0xA2, 0x8B, 0xE8, 0x44, 0x23, 0x4B, 0x34, 0xEA, 0x58, 0xC1, 0x18, 0xC6, + 0x45, 0x5E, 0x2C, 0x6A, 0xF7, 0x12, 0x63, 0x60, 0x41, 0x0B, 0xF0, 0x70, + 0x20, 0xF4, 0x8E, 0xA1, 0x41, 0x6A, 0x40, 0x50, 0x45, 0xC2, 0x55, 0x11, + 0x95, 0xE0, 0x21, 0x8D, 0x92, 0x60, 0x49, 0x18, 0x56, 0x90, 0x02, 0x3D, + 0xD8, 0xA1, 0xA3, 0x75, 0x68, 0xC3, 0x1B, 0x66, 0x9A, 0xDF, 0x3C, 0xE2, + 0xAB, 0x78, 0xC5, 0x7B, 0x44, 0x8B, 0x7A, 0xEA, 0xA2, 0xA0, 0xDA, 0xC8, + 0x19, 0x9A, 0x60, 0x8A, 0x26, 0x4C, 0x90, 0x83, 0x7B, 0xD8, 0xA3, 0x91, + 0xFA, 0x18, 0x85, 0x02, 0x44, 0xF0, 0x95, 0xA9, 0x36, 0xC9, 0x0A, 0xE6, + 0x58, 0x65, 0x60, 0x6C, 0xB6, 0xE5, 0x4C, 0x95, 0x50, 0xB4, 0xF3, 0x88, + 0x07, 0x2E, 0x7E, 0x61, 0xBF, 0x73, 0xB4, 0xB8, 0xC5, 0x93, 0x91, 0x13, + 0x18, 0xC0, 0xC0, 0x85, 0x2C, 0xF4, 0xC0, 0x00, 0x36, 0xF6, 0x31, 0x61, + 0x01, 0x30, 0xD8, 0x8F, 0xA1, 0x65, 0xC7, 0x06, 0x90, 0xB1, 0x12, 0x36, + 0x60, 0x6E, 0x01, 0x28, 0x21, 0x0B, 0x45, 0xBE, 0x82, 0x2D, 0xB2, 0x00, + 0xD9, 0x2B, 0x40, 0xB6, 0xB1, 0x48, 0x56, 0x32, 0x13, 0x92, 0x0C, 0x0C, + 0x7D, 0xD0, 0xE6, 0xFE, 0x1D, 0xA3, 0x60, 0xCC, 0x37, 0x5E, 0x81, 0x0D, + 0x6C, 0x04, 0x27, 0x4C, 0xF0, 0x2B, 0x9B, 0x68, 0xD7, 0x26, 0x1D, 0xB8, + 0xC1, 0x8D, 0x1F, 0xE8, 0x4C, 0x67, 0x0C, 0xF7, 0x66, 0xAA, 0x76, 0xC2, + 0x03, 0x87, 0xEF, 0xF0, 0x87, 0x27, 0x66, 0x81, 0x0A, 0x1E, 0x82, 0x02, + 0x13, 0x34, 0x30, 0x01, 0x00, 0x1E, 0x60, 0x83, 0x2A, 0x81, 0x22, 0x16, + 0xA7, 0xD0, 0xD5, 0x03, 0x8C, 0xE0, 0x0D, 0x57, 0x58, 0xC1, 0x13, 0x39, + 0xA0, 0x8F, 0xA2, 0x6F, 0x8E, 0x73, 0xFB, 0xEC, 0x43, 0x1B, 0x29, 0x28, + 0x43, 0x19, 0x25, 0x61, 0x06, 0x8F, 0x74, 0x1A, 0x0D, 0x62, 0x08, 0x83, + 0xA5, 0xDB, 0x50, 0x06, 0x06, 0x0D, 0xC2, 0xBD, 0xDE, 0x42, 0x83, 0x19, + 0x18, 0x94, 0xA1, 0x50, 0xB3, 0x0E, 0x0F, 0x65, 0x48, 0x97, 0x20, 0xCC, + 0xE0, 0x02, 0x33, 0x14, 0x48, 0x0F, 0x79, 0x20, 0x43, 0x1B, 0x5A, 0x80, + 0x06, 0x45, 0xC0, 0xE1, 0x0D, 0x8A, 0xF0, 0xC3, 0x1D, 0xE2, 0x40, 0x6B, + 0x47, 0xF4, 0xF7, 0xBF, 0x9B, 0x00, 0xC4, 0xBF, 0x9A, 0x21, 0x48, 0xE6, + 0xF5, 0x5A, 0x13, 0x88, 0x64, 0x07, 0x23, 0x17, 0xA6, 0x0F, 0x5A, 0xB8, + 0x25, 0x06, 0x6C, 0xB8, 0x03, 0x0C, 0x6E, 0x50, 0x04, 0x2B, 0x3B, 0x5B, + 0xC4, 0xAB, 0x0C, 0xB1, 0xC3, 0x03, 0x03, 0x8E, 0x52, 0xA4, 0x15, 0x85, + 0xC0, 0xD8, 0xF6, 0x5D, 0x75, 0x91, 0x19, 0x2E, 0xD8, 0x02, 0xDC, 0x54, + 0xC8, 0xB3, 0x00, 0x8C, 0x79, 0x40, 0x74, 0x13, 0x36, 0x2D, 0x52, 0x6A, + 0x37, 0x02, 0x10, 0x20, 0x4C, 0x0C, 0x28, 0xA1, 0xC7, 0x05, 0x44, 0x20, + 0x15, 0xEE, 0x5D, 0x64, 0x7C, 0x27, 0x16, 0xC9, 0xFB, 0xA6, 0x82, 0x14, + 0x92, 0x7C, 0x85, 0x2B, 0x50, 0x01, 0x0B, 0xCE, 0xA1, 0x0D, 0x2D, 0xAC, + 0x00, 0x8C, 0x51, 0x58, 0x41, 0xE1, 0xFE, 0x65, 0x2B, 0xA1, 0x38, 0x41, + 0x5B, 0x1B, 0xE5, 0x7C, 0xD6, 0x39, 0x6D, 0x93, 0xCE, 0x3C, 0x52, 0x2B, + 0xB7, 0xEB, 0xB4, 0x76, 0x55, 0xEC, 0x4C, 0xF3, 0x0D, 0xD9, 0x6C, 0x2A, + 0x78, 0xB8, 0x43, 0x87, 0xA1, 0x40, 0x05, 0x26, 0x30, 0x31, 0x04, 0x1F, + 0xDC, 0xA0, 0x2C, 0x37, 0x98, 0xC1, 0x11, 0x74, 0x50, 0xFD, 0x55, 0x30, + 0xEE, 0x01, 0x37, 0x88, 0x26, 0x96, 0x32, 0x50, 0x0B, 0x84, 0xE6, 0x7C, + 0xFD, 0x02, 0x71, 0x2E, 0xA2, 0x45, 0xC3, 0x8A, 0xCF, 0x51, 0x51, 0x12, + 0x21, 0x3D, 0x69, 0x1B, 0xD4, 0xC0, 0x02, 0x31, 0xB0, 0x60, 0x05, 0x9D, + 0x6E, 0xC9, 0x21, 0xDA, 0xD0, 0x06, 0x42, 0x97, 0x46, 0x50, 0x57, 0x12, + 0x33, 0xD1, 0x12, 0x31, 0xC1, 0x02, 0x18, 0x31, 0x6A, 0x61, 0x70, 0x06, + 0x6A, 0xB0, 0x6A, 0x67, 0x10, 0x06, 0xF6, 0xE5, 0x02, 0x6B, 0x80, 0x07, + 0x79, 0xA0, 0x08, 0xC2, 0x93, 0x53, 0x45, 0x31, 0x14, 0x6A, 0x77, 0x6B, + 0x00, 0x06, 0x54, 0x32, 0x12, 0x77, 0xCD, 0x73, 0x0C, 0x9A, 0xA0, 0x03, + 0xDC, 0x70, 0x77, 0xA2, 0xF1, 0x0B, 0x11, 0x90, 0x00, 0x0C, 0xF0, 0x03, + 0x6B, 0x10, 0x03, 0x41, 0xB0, 0x1B, 0xC6, 0xB1, 0x29, 0x83, 0x47, 0x83, + 0x22, 0x46, 0x0B, 0x95, 0x02, 0x57, 0xE7, 0xD0, 0x78, 0x2D, 0x86, 0x27, + 0x91, 0xB7, 0x0B, 0x5F, 0x80, 0x05, 0x1B, 0x20, 0x00, 0x67, 0xA1, 0x63, + 0x05, 0x00, 0x00, 0xE8, 0x46, 0x00, 0xE9, 0x66, 0x3E, 0xC3, 0x54, 0x16, + 0x08, 0x00, 0x4C, 0x08, 0x40, 0x01, 0x1B, 0xA0, 0x04, 0x04, 0x04, 0x7A, + 0x3E, 0x76, 0x04, 0x8A, 0x95, 0x05, 0x5A, 0x10, 0x34, 0xCE, 0x54, 0x05, + 0x52, 0xB0, 0x7A, 0x8F, 0xE5, 0x58, 0xB1, 0xA7, 0x6F, 0xD8, 0xF0, 0x27, + 0xF4, 0x40, 0x50, 0x85, 0x62, 0x05, 0x27, 0x24, 0x3F, 0xFE, 0xC2, 0x37, + 0x18, 0xFB, 0xC0, 0x1C, 0x6F, 0x18, 0x71, 0xCE, 0xE1, 0x86, 0xFB, 0x30, + 0x66, 0xD4, 0xA1, 0x7C, 0xEF, 0x70, 0x37, 0x67, 0xC6, 0x4E, 0xAA, 0xC2, + 0x71, 0xEF, 0xD0, 0x0E, 0xEF, 0x50, 0x0B, 0xA3, 0xD0, 0x0A, 0xA1, 0x00, + 0x0B, 0xE3, 0x11, 0x04, 0x1A, 0x63, 0x00, 0x1C, 0xA3, 0x31, 0x11, 0x80, + 0x09, 0xA1, 0x50, 0x5C, 0xA2, 0x10, 0x04, 0x12, 0x80, 0x03, 0x5B, 0x62, + 0x56, 0xED, 0xC0, 0x7E, 0x97, 0x88, 0x89, 0x74, 0x90, 0x02, 0xF2, 0x12, + 0x11, 0x20, 0xD1, 0x11, 0x05, 0xD2, 0x02, 0x65, 0xA0, 0x02, 0xA1, 0x88, + 0x07, 0x6D, 0xA0, 0x07, 0xAC, 0x43, 0x5E, 0x53, 0x17, 0x13, 0x25, 0x05, + 0x2D, 0xEA, 0xC2, 0x3A, 0x2C, 0x90, 0x06, 0xEA, 0x75, 0x06, 0x2F, 0x50, + 0x07, 0x79, 0x90, 0x07, 0xAA, 0xF6, 0x02, 0x63, 0xD0, 0x06, 0x82, 0xF0, + 0x06, 0x6B, 0xB0, 0x06, 0x7C, 0x60, 0x07, 0x6F, 0xF0, 0x13, 0x29, 0xB2, + 0x22, 0x2A, 0xF2, 0x08, 0x9C, 0x90, 0x6B, 0x9C, 0x00, 0x08, 0x05, 0xB6, + 0x6B, 0xCF, 0xC0, 0x09, 0x36, 0x20, 0x0B, 0x77, 0x27, 0x1D, 0xDE, 0x20, + 0x04, 0x00, 0x30, 0x01, 0x7C, 0x37, 0x02, 0x42, 0x80, 0x0E, 0xDF, 0x54, + 0x83, 0xD4, 0x16, 0x5A, 0xE0, 0xF4, 0x32, 0x9C, 0x75, 0x62, 0x57, 0x21, + 0x0C, 0xC0, 0x60, 0x0C, 0xB9, 0xD4, 0x83, 0xBB, 0x00, 0x06, 0x72, 0x42, + 0x05, 0x18, 0x10, 0x00, 0x6C, 0x71, 0x63, 0x05, 0x30, 0x00, 0x82, 0x75, + 0x40, 0xC8, 0xA4, 0x6E, 0x68, 0x21, 0x58, 0x07, 0xF0, 0x79, 0x9F, 0x17, + 0x85, 0x1B, 0xD0, 0x63, 0x0D, 0x84, 0x00, 0x06, 0x70, 0x04, 0x48, 0x80, + 0x85, 0x40, 0x13, 0x7B, 0xF8, 0x86, 0x6F, 0x8F, 0xA5, 0x58, 0x54, 0x90, + 0x05, 0x8D, 0x65, 0x0A, 0xC2, 0x77, 0x0A, 0x56, 0x20, 0x0D, 0xE4, 0x70, + 0xFE, 0x0E, 0x59, 0xF1, 0x70, 0xE0, 0x04, 0x3F, 0xE2, 0x14, 0x71, 0x1B, + 0xF9, 0x19, 0xF2, 0xF0, 0x19, 0xE6, 0x94, 0x1D, 0x16, 0xA7, 0x66, 0x6A, + 0x96, 0x2A, 0xEF, 0x64, 0x0F, 0x6D, 0x06, 0x0F, 0xDD, 0x80, 0x09, 0xB3, + 0x10, 0x67, 0xB3, 0x80, 0x7D, 0x40, 0xE0, 0x5B, 0x15, 0xD0, 0x7D, 0xE8, + 0xA3, 0x67, 0xE3, 0xF1, 0x09, 0xA2, 0xE0, 0x09, 0x67, 0xA5, 0x03, 0x9D, + 0x44, 0x0A, 0x98, 0xE8, 0x93, 0x39, 0xF7, 0x50, 0x2D, 0x30, 0x08, 0xD1, + 0x82, 0x08, 0x09, 0x92, 0x46, 0x05, 0x62, 0x13, 0xA7, 0x16, 0x52, 0x97, + 0x20, 0x06, 0x00, 0xE8, 0x69, 0x21, 0x45, 0x08, 0x68, 0xD0, 0x20, 0x03, + 0x42, 0x11, 0x2D, 0x41, 0x08, 0xB0, 0x68, 0x13, 0xDA, 0xB5, 0x06, 0x7B, + 0x90, 0x07, 0xDA, 0x75, 0x06, 0x64, 0x50, 0x06, 0x65, 0xB0, 0x07, 0x2D, + 0xD1, 0x06, 0x76, 0xD0, 0x07, 0x27, 0x92, 0x22, 0xC5, 0xB3, 0x22, 0x1D, + 0xE8, 0x81, 0x1F, 0x18, 0x82, 0xCE, 0xF0, 0x8C, 0xB6, 0x70, 0x82, 0xEF, + 0xF0, 0x0A, 0x56, 0x90, 0x00, 0x0A, 0x60, 0x02, 0x6C, 0x00, 0x03, 0x42, + 0xA0, 0x65, 0x87, 0xE7, 0x8D, 0x6B, 0xC8, 0x4A, 0xD2, 0xE6, 0x4A, 0xBF, + 0x10, 0x65, 0x70, 0x85, 0x0E, 0x3B, 0xB8, 0x0B, 0xE9, 0x98, 0x4B, 0x5C, + 0x80, 0x04, 0x07, 0x34, 0x00, 0xE8, 0x56, 0x8F, 0xF8, 0xA8, 0x84, 0x04, + 0x70, 0x00, 0xED, 0xD6, 0x40, 0x52, 0xA8, 0x01, 0x48, 0xA0, 0x04, 0x3C, + 0xA0, 0x04, 0x4A, 0xA0, 0x99, 0x0D, 0x44, 0x01, 0xA0, 0xF7, 0x24, 0x19, + 0x10, 0x59, 0x89, 0x95, 0x58, 0x5A, 0xA0, 0x05, 0xCD, 0xF4, 0x58, 0x90, + 0xD5, 0x4C, 0x8A, 0x55, 0x33, 0xB4, 0x01, 0x0E, 0x41, 0x50, 0x0A, 0xD7, + 0x90, 0x0F, 0x8E, 0x82, 0x61, 0xE0, 0xF8, 0x59, 0x6B, 0xD5, 0x4D, 0x68, + 0xD3, 0x36, 0x1D, 0xFE, 0xE9, 0x86, 0xD4, 0x31, 0x66, 0x68, 0x46, 0x92, + 0x7C, 0xB3, 0x37, 0x69, 0xC6, 0x87, 0xAA, 0x52, 0x2C, 0xA5, 0x70, 0x0A, + 0xB2, 0x10, 0x0A, 0xC8, 0x90, 0x0C, 0x73, 0x00, 0x04, 0x3A, 0x60, 0x00, + 0x13, 0x10, 0x0A, 0x9F, 0x30, 0x04, 0x39, 0xB0, 0x16, 0x04, 0x70, 0x03, + 0x73, 0x00, 0x2B, 0xA2, 0xF0, 0x09, 0x3D, 0x40, 0x04, 0x33, 0x90, 0x03, + 0xEF, 0x50, 0x39, 0x3F, 0x69, 0x9E, 0xCF, 0x95, 0x0E, 0x2B, 0x10, 0x06, + 0x2B, 0x31, 0x2F, 0x19, 0x31, 0x80, 0x67, 0xA0, 0x45, 0x62, 0xF0, 0x02, + 0x1C, 0x51, 0x06, 0x62, 0x60, 0x06, 0x75, 0x10, 0x5E, 0xD5, 0xD2, 0x2D, + 0x99, 0x56, 0x95, 0x91, 0x70, 0x3B, 0xAC, 0x63, 0x3A, 0x68, 0xA0, 0x06, + 0x7B, 0x70, 0x06, 0x5B, 0x59, 0x81, 0x63, 0x10, 0x5E, 0x78, 0xB0, 0x06, + 0x2F, 0xC0, 0x06, 0x6E, 0xF0, 0x8B, 0x7C, 0xD0, 0x07, 0x45, 0xA1, 0x96, + 0xF9, 0xF2, 0x5F, 0xCA, 0x18, 0x54, 0x1F, 0x48, 0x30, 0xD1, 0xF0, 0x0C, + 0x46, 0x80, 0x09, 0xC2, 0xC2, 0x48, 0xFA, 0xA0, 0x44, 0x13, 0xA0, 0x00, + 0x0C, 0x20, 0x02, 0x25, 0x10, 0x04, 0x88, 0xD1, 0x8D, 0x82, 0x39, 0x62, + 0x7E, 0x99, 0x0F, 0xD8, 0xF0, 0x35, 0xA4, 0x25, 0x0C, 0xC2, 0x90, 0x19, + 0x90, 0x87, 0x8E, 0x72, 0xD2, 0x98, 0xE8, 0x16, 0x25, 0x8E, 0x39, 0x84, + 0x90, 0xF9, 0x31, 0xFA, 0x88, 0x01, 0x14, 0xA0, 0x04, 0x49, 0x30, 0x05, + 0xA8, 0xB9, 0x05, 0x45, 0xBA, 0x05, 0x5E, 0xB0, 0x05, 0x5A, 0x20, 0x05, + 0x48, 0xE0, 0x8F, 0xC5, 0xE4, 0x63, 0x14, 0x60, 0x05, 0x95, 0x81, 0x05, + 0xA5, 0x39, 0x34, 0xF8, 0xA6, 0x6F, 0x60, 0x48, 0x05, 0xB7, 0xD0, 0x32, + 0xC5, 0x56, 0x04, 0x63, 0x23, 0x78, 0x17, 0x89, 0x36, 0x67, 0x63, 0x36, + 0x6E, 0xD8, 0x1C, 0x2B, 0xB4, 0x30, 0xFE, 0xC4, 0x57, 0x87, 0xEA, 0xC4, + 0x7C, 0x17, 0x77, 0x66, 0x19, 0xE7, 0x4E, 0xC8, 0x69, 0x0F, 0xDB, 0x80, + 0x09, 0xA7, 0x10, 0x0A, 0xB2, 0x60, 0xA7, 0x73, 0x21, 0x01, 0x13, 0x40, + 0x04, 0x43, 0x30, 0x04, 0x44, 0x40, 0x04, 0x46, 0xB0, 0x16, 0x7A, 0x66, + 0x04, 0xA0, 0x60, 0x0B, 0xB2, 0xE0, 0x0A, 0x39, 0x00, 0x2C, 0xEA, 0x77, + 0x9E, 0x8B, 0xAA, 0x50, 0xA2, 0xC1, 0x0C, 0x32, 0x50, 0x07, 0x15, 0x21, + 0x09, 0x83, 0xA0, 0x07, 0x41, 0xC7, 0x11, 0x44, 0xD7, 0x02, 0xA8, 0x26, + 0x06, 0x6E, 0x50, 0x06, 0x6A, 0xD0, 0x80, 0x6D, 0x10, 0x74, 0x6A, 0xA0, + 0x06, 0x82, 0xD0, 0x2D, 0x11, 0x42, 0x12, 0x10, 0x42, 0xA9, 0x78, 0x70, + 0x06, 0x6D, 0xD0, 0x94, 0x6E, 0xD0, 0x02, 0x7B, 0x60, 0x5F, 0x7B, 0x50, + 0x06, 0x2B, 0xC0, 0x02, 0x64, 0xB0, 0x06, 0x5E, 0x97, 0x02, 0x64, 0xF0, + 0x06, 0x6C, 0xF0, 0x06, 0x68, 0x49, 0xA1, 0x15, 0x6A, 0xA1, 0x40, 0xB5, + 0x09, 0x33, 0xD2, 0x3C, 0xBD, 0xC6, 0x6B, 0x42, 0xE0, 0x0E, 0x27, 0xA8, + 0x0F, 0xB6, 0x00, 0x3E, 0x0D, 0x30, 0x01, 0x23, 0xA0, 0x03, 0xDB, 0xE8, + 0x97, 0x5F, 0x42, 0x78, 0xD3, 0x1A, 0x5A, 0x37, 0x63, 0x62, 0xB7, 0xB1, + 0x0F, 0x8D, 0x07, 0x06, 0xBE, 0x90, 0x4B, 0xEB, 0x98, 0x4B, 0x1A, 0x70, + 0x84, 0xE3, 0x2A, 0x8F, 0x47, 0x28, 0x58, 0x9A, 0xB7, 0x40, 0x50, 0xB8, + 0x01, 0x1B, 0x20, 0xA4, 0x53, 0x30, 0x05, 0x46, 0xDA, 0x05, 0x5B, 0xD0, + 0x05, 0xF3, 0x3A, 0xAF, 0x5E, 0xA0, 0x05, 0x4C, 0x40, 0x01, 0xC3, 0x84, + 0x40, 0x57, 0x40, 0x19, 0x5B, 0x98, 0x85, 0x57, 0xA0, 0x58, 0x0A, 0x29, + 0x7B, 0x59, 0x80, 0x39, 0x57, 0x81, 0x0D, 0x3D, 0x40, 0x0B, 0x7A, 0x72, + 0x65, 0x5E, 0xC6, 0xB0, 0x66, 0xB3, 0x65, 0xC6, 0x57, 0xFE, 0x4E, 0xB5, + 0x21, 0x2A, 0x69, 0xDA, 0x5A, 0xD7, 0x31, 0x9C, 0x7C, 0x68, 0xB1, 0xFC, + 0xD0, 0x66, 0x7B, 0xB3, 0x66, 0xAD, 0xE2, 0x0A, 0xAA, 0x10, 0x0B, 0xB1, + 0xA0, 0x0A, 0x98, 0x00, 0x04, 0x12, 0x10, 0x00, 0x44, 0xC0, 0x0C, 0xB1, + 0x10, 0x0A, 0x46, 0x30, 0x07, 0x7B, 0x5A, 0x3E, 0x6D, 0xB1, 0x9D, 0x9F, + 0x40, 0x04, 0x15, 0x30, 0x0A, 0x98, 0xC3, 0xA8, 0x37, 0xAB, 0x50, 0x74, + 0x20, 0x03, 0x11, 0x32, 0x2F, 0x1E, 0x61, 0x06, 0x4D, 0x59, 0x07, 0x62, + 0x80, 0x06, 0x97, 0x90, 0x7F, 0xF0, 0x29, 0x06, 0x63, 0x30, 0x06, 0xDD, + 0x95, 0x06, 0x2D, 0x70, 0x06, 0x4F, 0xE7, 0x06, 0xE6, 0x52, 0x94, 0x13, + 0x32, 0x08, 0x87, 0xB0, 0x07, 0x7B, 0xA0, 0x5D, 0x62, 0x40, 0x06, 0x2B, + 0xE0, 0x02, 0x6D, 0x00, 0x07, 0x63, 0xB7, 0x02, 0x6F, 0x40, 0x06, 0x29, + 0xA0, 0x02, 0x2E, 0x70, 0x08, 0x6F, 0x50, 0x69, 0xBC, 0xFA, 0x06, 0x3A, + 0xA5, 0x76, 0x8D, 0xF0, 0x22, 0xFF, 0xF5, 0x22, 0x4A, 0x01, 0x54, 0xCE, + 0xC3, 0x09, 0xA9, 0x00, 0x97, 0x39, 0xD0, 0x0D, 0x77, 0x87, 0x0F, 0xFA, + 0xE0, 0x0A, 0x0C, 0xD0, 0x00, 0x22, 0xD0, 0x00, 0x0D, 0x00, 0x04, 0xE7, + 0x00, 0x33, 0x5E, 0x96, 0xA2, 0xD6, 0xDA, 0x17, 0xF4, 0x80, 0x0B, 0x8B, + 0x57, 0x1B, 0xF4, 0x20, 0x27, 0x99, 0x51, 0x64, 0xDD, 0x26, 0x27, 0x19, + 0x60, 0x63, 0x43, 0x08, 0x25, 0xE3, 0x4A, 0x8F, 0x3B, 0xD6, 0x40, 0x9D, + 0xD9, 0xAE, 0x5B, 0xF0, 0x05, 0xF4, 0xFA, 0x05, 0x9F, 0xFB, 0xB9, 0x5D, + 0xF0, 0x05, 0x5C, 0xD0, 0x05, 0xF6, 0xAA, 0x04, 0x95, 0x89, 0x00, 0x59, + 0x6A, 0x0A, 0xCF, 0x64, 0x9A, 0xAB, 0x67, 0xA5, 0x54, 0x00, 0xB0, 0xBA, + 0x20, 0x70, 0x57, 0x41, 0x04, 0xA3, 0xF0, 0x0E, 0xE4, 0xC0, 0x86, 0xF6, + 0xFE, 0xA3, 0xBB, 0x2D, 0x73, 0x5A, 0xA4, 0xE5, 0x1C, 0xE4, 0x94, 0x0F, + 0x74, 0x53, 0x5A, 0xCF, 0xB1, 0x5A, 0xDB, 0x61, 0x66, 0x32, 0xC4, 0x87, + 0xC6, 0x49, 0x43, 0xED, 0xE4, 0x66, 0xFC, 0x50, 0x0B, 0x4D, 0xD0, 0x0A, + 0xB0, 0xA0, 0x0A, 0xCA, 0x10, 0x0A, 0x98, 0x70, 0x03, 0x05, 0x00, 0x01, + 0xCA, 0xB0, 0x0C, 0xCA, 0xB0, 0x0A, 0x43, 0x60, 0x04, 0x43, 0x70, 0x03, + 0x3A, 0x10, 0x01, 0x08, 0x40, 0x00, 0xA5, 0x14, 0x5C, 0x93, 0x78, 0x41, + 0x38, 0xAB, 0xBE, 0x99, 0x13, 0x08, 0xCF, 0x12, 0x3A, 0x91, 0xD0, 0x69, + 0x66, 0xD0, 0x80, 0x6A, 0x10, 0x06, 0x63, 0xB0, 0x02, 0x66, 0xB0, 0x9E, + 0x1C, 0x11, 0x74, 0x66, 0x40, 0x08, 0x36, 0x81, 0x06, 0xEB, 0xE9, 0x69, + 0x15, 0x81, 0x08, 0x83, 0x00, 0x21, 0xD5, 0xA2, 0xAA, 0x61, 0x50, 0x06, + 0x20, 0x80, 0x6A, 0x6F, 0x80, 0x9F, 0x17, 0x15, 0x06, 0x64, 0xE0, 0x02, + 0x25, 0x90, 0x06, 0x64, 0x60, 0xAB, 0x6F, 0xF0, 0x06, 0x35, 0x90, 0x47, + 0x7E, 0xF4, 0x07, 0x6D, 0x8B, 0x14, 0x17, 0xBA, 0x14, 0x34, 0x02, 0x30, + 0xCF, 0x90, 0x03, 0xD4, 0x70, 0x82, 0x53, 0x26, 0x01, 0x2B, 0x28, 0x02, + 0x0A, 0x90, 0x03, 0x7D, 0xE9, 0x70, 0xAD, 0xA4, 0xA2, 0xD5, 0xDA, 0xA2, + 0x1E, 0x76, 0x1B, 0xFA, 0xE0, 0x0B, 0x41, 0xB3, 0x0B, 0x59, 0x00, 0x6E, + 0x43, 0x96, 0x19, 0x1B, 0x10, 0x00, 0x46, 0x78, 0x16, 0x3F, 0xBC, 0x6E, + 0xC7, 0x24, 0x00, 0x06, 0x00, 0x85, 0x40, 0x9A, 0x04, 0x42, 0x0A, 0xAF, + 0x60, 0xF0, 0xB9, 0x4A, 0xCC, 0x0B, 0xBE, 0xF0, 0x05, 0xBC, 0xD0, 0xB9, + 0x5D, 0xC0, 0x05, 0xA9, 0xA9, 0x01, 0x44, 0xCC, 0x04, 0x92, 0x67, 0x4B, + 0x42, 0x33, 0xA5, 0x01, 0x9B, 0x05, 0xFA, 0x86, 0x05, 0xC1, 0x91, 0x0F, + 0xBF, 0x20, 0x04, 0xFE, 0x84, 0x39, 0x5A, 0xBE, 0x97, 0x9B, 0x21, 0xC6, + 0x91, 0xC1, 0xFB, 0x29, 0x71, 0x28, 0x37, 0x14, 0x8B, 0xBC, 0x31, 0x64, + 0x71, 0x19, 0x4B, 0x43, 0x37, 0x74, 0x92, 0xEF, 0x30, 0x7D, 0xAA, 0x80, + 0x0A, 0xAA, 0x00, 0x0B, 0xB2, 0xB0, 0x03, 0x3E, 0x20, 0x01, 0x07, 0x70, + 0x03, 0xCB, 0xC0, 0x0C, 0xB2, 0x80, 0x0C, 0x2A, 0xEB, 0xBD, 0x46, 0x40, + 0x2B, 0x70, 0x11, 0x01, 0x33, 0x80, 0x09, 0xA2, 0x30, 0x0A, 0xE5, 0xB9, + 0xBE, 0x91, 0x7C, 0x2C, 0xFB, 0x50, 0x0F, 0x30, 0xF0, 0x45, 0x13, 0xE5, + 0x95, 0x2B, 0x20, 0x06, 0x2A, 0x50, 0x74, 0x29, 0x70, 0xB4, 0xEF, 0xE5, + 0x06, 0xDD, 0xE5, 0x11, 0x78, 0xD0, 0x02, 0x1B, 0x35, 0x06, 0x98, 0xD6, + 0x20, 0xB6, 0x13, 0x21, 0x04, 0xDC, 0x51, 0x5C, 0xA4, 0x06, 0x22, 0x80, + 0x6A, 0x2F, 0x50, 0xA0, 0x79, 0xE0, 0x06, 0x6C, 0xF0, 0xBF, 0x29, 0xB0, + 0x02, 0x2A, 0x70, 0x02, 0x6B, 0xA0, 0x08, 0x16, 0x7C, 0x07, 0x7C, 0x90, + 0x76, 0x6C, 0x8B, 0x2F, 0xC8, 0x98, 0x14, 0x41, 0x05, 0x77, 0x34, 0xB2, + 0xA1, 0xD0, 0x70, 0x82, 0xF9, 0x40, 0x0B, 0x33, 0xD0, 0x00, 0x12, 0x20, + 0x02, 0x23, 0x90, 0x03, 0xB8, 0xFB, 0x8D, 0x2E, 0x5C, 0x83, 0x6A, 0x43, + 0x0E, 0xB8, 0x50, 0x98, 0xB8, 0x71, 0x0E, 0xAB, 0x9B, 0x58, 0x93, 0xB7, + 0x58, 0x41, 0x68, 0xB9, 0x47, 0xB8, 0x3E, 0x94, 0xD9, 0x6E, 0xFA, 0x98, + 0xB9, 0x41, 0xEA, 0xAE, 0x45, 0xFA, 0x6D, 0x5F, 0x00, 0x06, 0xBD, 0xF0, + 0x05, 0xBD, 0xD0, 0x0B, 0xBC, 0xD0, 0xC4, 0xF4, 0xCC, 0x0B, 0x5E, 0x30, + 0x05, 0x49, 0x80, 0x04, 0x05, 0xC4, 0x04, 0x95, 0x61, 0x0B, 0x73, 0x82, + 0x90, 0x00, 0x0B, 0xBB, 0x63, 0xE8, 0x23, 0xD7, 0x53, 0x0B, 0xE4, 0xF0, + 0x0E, 0x5F, 0xD6, 0xB0, 0x0F, 0x4B, 0xFE, 0x5A, 0xF6, 0xF3, 0x91, 0xF3, + 0x00, 0x1D, 0x9F, 0x52, 0x66, 0x68, 0x96, 0x4E, 0x69, 0xB6, 0x87, 0x7B, + 0x78, 0x92, 0x1A, 0xB7, 0x0F, 0xA4, 0x20, 0x0A, 0xD7, 0x27, 0x0B, 0xDA, + 0x80, 0x09, 0x3E, 0x60, 0x01, 0x13, 0x70, 0x03, 0x37, 0x50, 0xA7, 0xB1, + 0x50, 0xC8, 0xA8, 0x60, 0x04, 0x33, 0x70, 0x03, 0xDE, 0x3B, 0x03, 0x75, + 0x51, 0x04, 0xA7, 0x20, 0x0A, 0xA2, 0x20, 0xC9, 0x35, 0x9D, 0x2C, 0xEB, + 0xC0, 0x7F, 0x53, 0xE4, 0x9F, 0x54, 0x77, 0x06, 0x9E, 0xDC, 0x02, 0x69, + 0x10, 0x06, 0x2D, 0x10, 0x06, 0x2A, 0x60, 0x3A, 0x6D, 0xB0, 0xAA, 0xBB, + 0x58, 0x07, 0x69, 0xA0, 0x06, 0x63, 0x10, 0x8B, 0x69, 0x54, 0x12, 0x2F, + 0x51, 0x08, 0xA6, 0x2A, 0x08, 0x67, 0x50, 0x07, 0x27, 0x40, 0x02, 0xB8, + 0x4C, 0x06, 0x41, 0x0D, 0x07, 0x86, 0xF0, 0x06, 0x85, 0x00, 0x07, 0xF5, + 0x9B, 0x02, 0x23, 0x70, 0x02, 0x6C, 0xC0, 0xAB, 0x7C, 0xC0, 0x07, 0x41, + 0xA1, 0x22, 0x8E, 0xB0, 0xC1, 0x1D, 0x2C, 0xAC, 0x71, 0x7B, 0xCC, 0x35, + 0x62, 0x04, 0xB5, 0xA0, 0xAC, 0xD5, 0xA0, 0x03, 0x25, 0x20, 0x02, 0x77, + 0x1D, 0x01, 0xD8, 0x16, 0x6D, 0xD7, 0x6A, 0xCD, 0x83, 0x77, 0x15, 0x4F, + 0x43, 0x1B, 0x68, 0xB2, 0x0B, 0x8C, 0x85, 0x85, 0x85, 0xBD, 0x01, 0xE3, + 0x4A, 0xAE, 0x46, 0xB8, 0x6E, 0x09, 0xA4, 0xAE, 0x9E, 0xB9, 0xB9, 0x60, + 0x30, 0xAF, 0x4C, 0xFC, 0xC4, 0x50, 0xEC, 0x0B, 0xF5, 0xEC, 0xC4, 0xF1, + 0x3A, 0x05, 0x1B, 0xD0, 0x6E, 0xB3, 0x77, 0x4B, 0x6E, 0x82, 0x05, 0x5B, + 0xC0, 0x05, 0xAD, 0x09, 0xB0, 0x59, 0x60, 0x0A, 0xF1, 0xE0, 0x18, 0xA3, + 0xB0, 0x03, 0xE0, 0x90, 0xD0, 0xBB, 0xC9, 0x1C, 0x67, 0x8C, 0x42, 0x2B, + 0x04, 0xDB, 0xC1, 0xFB, 0x23, 0xF4, 0xF0, 0xBB, 0x64, 0xFE, 0xD6, 0x5A, + 0xCB, 0xC7, 0xB1, 0x72, 0x5C, 0x92, 0x75, 0xAC, 0x2A, 0xEE, 0x80, 0x0F, + 0xD3, 0xB0, 0x92, 0x75, 0xA6, 0x0D, 0xA9, 0xB0, 0x25, 0x04, 0x20, 0x04, + 0x42, 0x10, 0x01, 0xAC, 0x10, 0x0B, 0xCA, 0x2D, 0x7E, 0x23, 0xD7, 0xA7, + 0xDE, 0x5B, 0x04, 0x9E, 0x20, 0x0A, 0xAE, 0xE0, 0xC8, 0x36, 0x6D, 0xDD, + 0xFC, 0x11, 0x0D, 0x2C, 0xA0, 0x06, 0xA1, 0x13, 0x11, 0xA0, 0x0A, 0x81, + 0x62, 0x70, 0xB4, 0xE0, 0x8D, 0x6A, 0x4C, 0xAB, 0x07, 0x00, 0xF8, 0x10, + 0xA2, 0x7A, 0x09, 0x67, 0xA0, 0x8B, 0xDE, 0x15, 0x21, 0x57, 0x34, 0x08, + 0x84, 0x50, 0x08, 0x79, 0x00, 0xAA, 0x24, 0xA0, 0x9E, 0x2E, 0xB0, 0x02, + 0x79, 0x60, 0xBF, 0x6B, 0x60, 0x5F, 0xBD, 0xC8, 0x8B, 0x59, 0x9D, 0x06, + 0x30, 0x00, 0x03, 0xBD, 0x8A, 0x76, 0xF9, 0xF2, 0x07, 0x6A, 0xCD, 0xD6, + 0x49, 0xA1, 0x14, 0xC7, 0x00, 0x77, 0xBD, 0x66, 0x04, 0xA2, 0x70, 0x82, + 0xFB, 0xF0, 0x0E, 0x41, 0x10, 0x03, 0x22, 0xD0, 0x01, 0x0A, 0x70, 0x04, + 0xA6, 0xE0, 0xC2, 0xD6, 0xCC, 0x8D, 0x2C, 0x0A, 0x0E, 0x5F, 0x23, 0x7C, + 0xFA, 0x00, 0x0E, 0x46, 0xD6, 0x58, 0x59, 0xF0, 0x0F, 0x54, 0xF0, 0x0F, + 0xE2, 0x36, 0x00, 0x8F, 0x89, 0xD8, 0xEB, 0x86, 0x84, 0x05, 0x94, 0xCE, + 0x47, 0xEC, 0xAE, 0xEF, 0x2A, 0xAF, 0x5D, 0xA0, 0xC4, 0xF0, 0x3C, 0xD9, + 0x50, 0x6C, 0xCF, 0x9D, 0x8B, 0xCF, 0xF0, 0x86, 0x00, 0x88, 0xF5, 0x26, + 0x97, 0x11, 0x6E, 0xAE, 0xAB, 0x6F, 0x67, 0x32, 0x0F, 0xFA, 0x70, 0xB0, + 0xAE, 0x80, 0xBB, 0xAC, 0x8D, 0x42, 0x18, 0xE9, 0x17, 0xB5, 0xC7, 0x29, + 0xAA, 0xB4, 0x54, 0xE5, 0x64, 0xDB, 0xD0, 0x11, 0x43, 0x15, 0x7B, 0xD1, + 0xC7, 0xD9, 0x4E, 0xF5, 0x40, 0x43, 0x5A, 0x8E, 0x09, 0xB5, 0x40, 0xA7, + 0xFE, 0xB0, 0xE0, 0x0F, 0x4D, 0x00, 0x93, 0x10, 0x50, 0x0D, 0x44, 0x20, + 0x01, 0xCA, 0x3D, 0x38, 0x32, 0x8B, 0x09, 0x23, 0x37, 0x07, 0x39, 0x70, + 0x03, 0x44, 0xB0, 0x0A, 0xB0, 0xA0, 0x0B, 0xB0, 0x40, 0xD3, 0xD7, 0x6D, + 0xE7, 0xF7, 0x81, 0x0A, 0xB1, 0xF8, 0x3A, 0xDC, 0x22, 0xBF, 0x10, 0x18, + 0xD4, 0x46, 0x8D, 0xCB, 0x09, 0x7A, 0xD4, 0x01, 0x68, 0xD4, 0xD8, 0x32, + 0xBF, 0xD4, 0x32, 0xC0, 0x25, 0x11, 0xD5, 0x55, 0xA7, 0x02, 0xEA, 0x09, + 0xC1, 0x61, 0x10, 0x81, 0x63, 0x70, 0x6A, 0x61, 0xB0, 0x06, 0x69, 0xE0, + 0xA0, 0x90, 0x8E, 0x06, 0x6C, 0x10, 0x03, 0x28, 0x50, 0x03, 0x60, 0x61, + 0x14, 0x6C, 0xAB, 0x8C, 0x07, 0xBE, 0x14, 0x09, 0xDE, 0x0C, 0x9C, 0x40, + 0x77, 0x56, 0xF0, 0xE0, 0xF2, 0x40, 0x04, 0x77, 0x1D, 0x03, 0x0D, 0xA0, + 0x03, 0x1E, 0x0E, 0x98, 0xDF, 0x58, 0xB8, 0x81, 0x51, 0x62, 0xD4, 0xDC, + 0x32, 0xF2, 0xA0, 0x49, 0xB2, 0x97, 0x64, 0x25, 0x4E, 0x05, 0x66, 0xE1, + 0xC3, 0x3F, 0x7C, 0xB9, 0x3B, 0x26, 0x85, 0x9A, 0xD9, 0xAE, 0x32, 0xBE, + 0x05, 0xDF, 0x26, 0xAF, 0x9F, 0xCB, 0x0B, 0xBD, 0xE0, 0xC4, 0x37, 0x4E, + 0xCF, 0xF6, 0x2A, 0x05, 0x42, 0x28, 0x00, 0x88, 0xD5, 0x6D, 0x93, 0x51, + 0xD8, 0x01, 0xAB, 0xA5, 0x62, 0xD6, 0x03, 0x9E, 0xD0, 0x0F, 0x49, 0xBE, + 0xE4, 0xBB, 0xFB, 0x1C, 0x0D, 0x7D, 0x1B, 0xC4, 0x57, 0xDB, 0x0B, 0x83, + 0x7C, 0x72, 0x73, 0xBC, 0xC6, 0x69, 0xD1, 0x23, 0xC9, 0x4E, 0x6F, 0x5A, + 0x0F, 0x1B, 0xE7, 0x0A, 0xD4, 0x37, 0x0B, 0xCC, 0x80, 0x0A, 0x19, 0x63, + 0x00, 0x34, 0x1D, 0x89, 0xAC, 0xC0, 0x0C, 0xCA, 0x7D, 0x0A, 0x2C, 0x8B, + 0xC8, 0x46, 0x90, 0x03, 0x46, 0x50, 0x04, 0x9F, 0x80, 0x0C, 0xD0, 0xB0, + 0x0A, 0xA5, 0x70, 0xFE, 0xE7, 0x09, 0x3F, 0x1A, 0xFA, 0x00, 0x08, 0x96, + 0x2E, 0x12, 0x92, 0x40, 0x08, 0x41, 0x2B, 0xBF, 0xD4, 0x25, 0x06, 0xDA, + 0x15, 0x06, 0x96, 0x4E, 0xD5, 0x1B, 0xD5, 0x2D, 0x27, 0x75, 0x06, 0x1B, + 0xB5, 0xA9, 0x09, 0x52, 0x2D, 0x11, 0xA2, 0xCA, 0x46, 0xCD, 0x01, 0x47, + 0x7B, 0x51, 0x65, 0x90, 0x02, 0x2F, 0xE0, 0x8B, 0x7B, 0x40, 0x06, 0x25, + 0xA0, 0x02, 0x66, 0xD0, 0x8B, 0xBA, 0xCA, 0x07, 0x6B, 0xD0, 0x77, 0xBE, + 0xFC, 0x07, 0x1B, 0xFC, 0x5F, 0xC9, 0x78, 0xA1, 0x33, 0xB2, 0xE0, 0x72, + 0x40, 0x04, 0x0F, 0x9E, 0x0F, 0xAF, 0x20, 0x02, 0x12, 0x50, 0x02, 0x0B, + 0xD0, 0x03, 0x57, 0x26, 0x83, 0x7D, 0x9D, 0xA2, 0xF9, 0x50, 0x0D, 0x88, + 0x61, 0x3F, 0xD8, 0xE0, 0x4C, 0x0D, 0x69, 0xE2, 0x1B, 0xD0, 0x58, 0x47, + 0x80, 0xD8, 0x47, 0x68, 0x84, 0x82, 0x65, 0x00, 0x69, 0x81, 0x00, 0x8E, + 0x0D, 0xE3, 0x31, 0x6E, 0xEC, 0x34, 0xAE, 0xC4, 0xCA, 0x4E, 0xF6, 0x50, + 0xDC, 0xB9, 0x5B, 0x90, 0xCF, 0x14, 0x70, 0x84, 0x3D, 0xE0, 0x26, 0x92, + 0xD7, 0xAF, 0x9F, 0xCD, 0x05, 0x40, 0x43, 0x0E, 0x7F, 0x52, 0x0A, 0x30, + 0x97, 0xE4, 0x0A, 0xFD, 0x65, 0x66, 0xC3, 0xBB, 0x12, 0x1B, 0x2A, 0x71, + 0xF8, 0x23, 0xAA, 0x45, 0x66, 0xC2, 0x79, 0x71, 0x18, 0x7D, 0x9C, 0x19, + 0xD7, 0x4E, 0x7C, 0xA8, 0x0E, 0x4D, 0xA0, 0x0A, 0xA4, 0x80, 0x0A, 0xB3, + 0x30, 0x0A, 0x24, 0x07, 0x01, 0x38, 0xE0, 0x28, 0x41, 0x00, 0x01, 0xA0, + 0x80, 0x0C, 0xA8, 0xC0, 0x0A, 0xA7, 0xE0, 0xA7, 0x45, 0x60, 0x04, 0x44, + 0x10, 0xF0, 0xE2, 0xE1, 0x0A, 0xD1, 0x50, 0x0A, 0xAB, 0xF0, 0xA1, 0x0A, + 0x6F, 0xFA, 0x04, 0x21, 0x07, 0xA7, 0xFC, 0xF0, 0x45, 0x79, 0x09, 0x05, + 0x22, 0x06, 0x5C, 0xD4, 0x06, 0x63, 0xFE, 0xD0, 0x02, 0xB2, 0xAC, 0xB4, + 0xF7, 0x97, 0x2E, 0xA1, 0xEC, 0x06, 0xAD, 0x6F, 0x06, 0x59, 0xE4, 0x06, + 0xEF, 0x3D, 0x5F, 0x91, 0x30, 0x08, 0x5F, 0xD7, 0x01, 0xF8, 0x8B, 0x6A, + 0xB7, 0x9A, 0x02, 0x42, 0x6D, 0x08, 0x79, 0xF0, 0xC0, 0x66, 0x40, 0x06, + 0x92, 0xFE, 0x06, 0x8C, 0x90, 0x5F, 0x8A, 0x40, 0x3C, 0x77, 0xF0, 0x07, + 0x45, 0x91, 0xF3, 0x39, 0xEF, 0xC1, 0x33, 0x32, 0x23, 0x74, 0x40, 0x04, + 0xDB, 0x30, 0xD7, 0x11, 0x60, 0xD7, 0x0A, 0x80, 0xF0, 0x48, 0xEF, 0x59, + 0x2D, 0xEC, 0x6C, 0xE1, 0x84, 0x0E, 0xDF, 0xA0, 0x55, 0xB7, 0x41, 0x0F, + 0x00, 0x7B, 0xE2, 0x26, 0x7E, 0x04, 0x1B, 0xF0, 0x0F, 0x87, 0x8D, 0xF5, + 0x57, 0x8F, 0xF5, 0x0B, 0x64, 0xC4, 0xEE, 0xAA, 0x05, 0x46, 0x0A, 0xAF, + 0xA2, 0x0B, 0xBA, 0x66, 0x0F, 0x10, 0x5F, 0xBA, 0x7C, 0x21, 0x28, 0xD0, + 0xCB, 0x16, 0x29, 0x3C, 0x0E, 0x00, 0x38, 0xD0, 0x63, 0x97, 0xAD, 0x5D, + 0xBA, 0xB8, 0x3C, 0xC4, 0x52, 0xB1, 0x22, 0x30, 0x7D, 0xF9, 0xF4, 0x81, + 0xB3, 0x22, 0xEB, 0x9D, 0x3C, 0x7A, 0xF9, 0xF2, 0xCD, 0x13, 0x59, 0x72, + 0xE4, 0xC8, 0x7D, 0xF3, 0x54, 0xAA, 0x2C, 0x89, 0x0F, 0x5F, 0xCA, 0x79, + 0xFB, 0xF6, 0xC9, 0xDB, 0x87, 0x4F, 0x1E, 0x4D, 0x79, 0x2E, 0x75, 0xDA, + 0xC3, 0xC7, 0xD3, 0x1E, 0xCF, 0x9E, 0x3F, 0xF9, 0xFD, 0xB4, 0x37, 0x94, + 0xE8, 0xCF, 0x7B, 0xEF, 0xDE, 0xFD, 0xAC, 0xB7, 0x0F, 0x93, 0xAB, 0x53, + 0x9F, 0xB4, 0xC5, 0x12, 0x35, 0x44, 0x42, 0x84, 0x6F, 0x22, 0x83, 0x3C, + 0xF0, 0x14, 0x2B, 0x16, 0xAB, 0x50, 0x44, 0x86, 0x0C, 0x31, 0x42, 0xC4, + 0xC8, 0x8E, 0x4F, 0xA7, 0x60, 0x51, 0x53, 0x45, 0x4A, 0xDF, 0x5B, 0xB8, + 0x71, 0xE5, 0xCE, 0xA5, 0x5B, 0xD7, 0xEE, 0x5D, 0xBC, 0xFE, 0x79, 0xF5, + 0xEE, 0xE5, 0xDB, 0x17, 0xEF, 0xBE, 0x38, 0x68, 0xEA, 0x48, 0x42, 0x14, + 0xE9, 0x90, 0x9A, 0x34, 0x65, 0xCA, 0xA4, 0x49, 0x73, 0xA9, 0xCD, 0x99, + 0x14, 0x29, 0xCC, 0x9C, 0x51, 0xE3, 0xC6, 0x8D, 0x9A, 0x33, 0x83, 0xDC, + 0x98, 0xA9, 0xEC, 0x86, 0x85, 0x9A, 0x30, 0x65, 0xDC, 0x10, 0x22, 0x24, + 0x08, 0x91, 0x9A, 0x3A, 0x1E, 0x4E, 0x98, 0x29, 0x03, 0x83, 0x84, 0x19, + 0x31, 0xAD, 0x57, 0x98, 0x21, 0xF3, 0x22, 0x05, 0x19, 0x35, 0x6B, 0x5A, + 0xBC, 0x81, 0xF3, 0x86, 0xCD, 0x1D, 0x3E, 0x77, 0xDE, 0x34, 0x6A, 0xF4, + 0xC7, 0xCF, 0x26, 0x4E, 0x9B, 0x90, 0x3B, 0xE2, 0xD4, 0xBC, 0x79, 0x33, + 0x4E, 0xC7, 0xE4, 0xFC, 0x83, 0xD5, 0x4E, 0xE6, 0x3E, 0x7D, 0xD6, 0x70, + 0x94, 0x10, 0x31, 0xE1, 0x95, 0xBE, 0x95, 0xE1, 0xC5, 0x8F, 0x27, 0x49, + 0x3E, 0xFC, 0x48, 0x96, 0xF1, 0xBE, 0x81, 0x0B, 0x59, 0x52, 0x9F, 0x2E, + 0x2B, 0x54, 0x8E, 0xFC, 0x3B, 0x42, 0x85, 0xFE, 0x06, 0x02, 0x00, 0x0A, + 0x14, 0x20, 0x50, 0x00, 0xC0, 0xFF, 0xFF, 0x04, 0x28, 0xC0, 0x00, 0x0A, + 0x36, 0x48, 0x62, 0x8A, 0x29, 0xB4, 0xD8, 0x62, 0x0B, 0x2F, 0xBA, 0x70, + 0xD0, 0xC1, 0x82, 0x22, 0x2C, 0x88, 0x17, 0x07, 0x29, 0xF4, 0x42, 0x8B, + 0x24, 0x2C, 0x28, 0x40, 0x80, 0x0D, 0xA8, 0xB0, 0x45, 0x17, 0x10, 0x4D, + 0x31, 0xA5, 0x22, 0x2E, 0x2A, 0xBA, 0x85, 0xA4, 0x7C, 0xE4, 0x21, 0x45, + 0x14, 0x78, 0xF0, 0x59, 0xA9, 0x24, 0x14, 0x4D, 0x12, 0x29, 0xA6, 0x7C, + 0xF6, 0xC9, 0x07, 0x9F, 0x1A, 0x67, 0xAC, 0xE9, 0xA6, 0x14, 0x75, 0xCA, + 0x49, 0x27, 0x97, 0x6A, 0x7A, 0xE9, 0x25, 0xA2, 0x5C, 0xE2, 0x67, 0x28, + 0x24, 0x7F, 0x5A, 0xCA, 0x9E, 0xA5, 0xEA, 0x79, 0xA7, 0x29, 0x6A, 0x30, + 0xFE, 0xA9, 0x06, 0x15, 0x65, 0xFC, 0xF9, 0x04, 0x93, 0x1B, 0x08, 0xB0, + 0x42, 0x1F, 0x79, 0xF4, 0xD9, 0xE1, 0x06, 0x4F, 0x50, 0x61, 0x65, 0x15, + 0x4F, 0xC4, 0x32, 0x62, 0x88, 0x22, 0x74, 0x30, 0x22, 0x2A, 0x58, 0xB4, + 0x71, 0x45, 0x15, 0xBF, 0xE2, 0x94, 0x73, 0x4E, 0x3A, 0xEB, 0xB4, 0x93, + 0xAE, 0x7B, 0x2E, 0x41, 0x4D, 0x12, 0x41, 0x24, 0x89, 0x04, 0x8F, 0xD0, + 0xCC, 0x08, 0xE3, 0x12, 0x31, 0xD0, 0x18, 0x63, 0x85, 0x14, 0x5E, 0x38, + 0xC3, 0x0D, 0x38, 0xCE, 0xC0, 0x43, 0x0D, 0x3D, 0xF0, 0x58, 0xB4, 0x0D, + 0x41, 0xC6, 0x50, 0x43, 0x8C, 0x14, 0xD4, 0xC0, 0xE3, 0x90, 0x43, 0xF4, + 0x80, 0x2D, 0x01, 0x34, 0xCA, 0xE0, 0xAC, 0x85, 0x32, 0x56, 0x58, 0xA3, + 0x8D, 0x15, 0x5C, 0xB8, 0x6D, 0x05, 0x32, 0xF4, 0x18, 0x03, 0x86, 0x34, + 0x78, 0x63, 0x63, 0x56, 0x36, 0xE2, 0xF0, 0xA3, 0x38, 0x3F, 0xFC, 0x70, + 0xC4, 0x91, 0xE5, 0x9C, 0x7B, 0xAE, 0x39, 0x3A, 0x8C, 0x70, 0xC5, 0x3A, + 0x99, 0xF4, 0xE1, 0x26, 0x08, 0x11, 0x18, 0x40, 0x00, 0x1C, 0xF4, 0xC6, + 0x6B, 0xD6, 0x3C, 0x68, 0xE3, 0x11, 0x2F, 0x1F, 0x6C, 0xD8, 0x93, 0xF1, + 0x1C, 0x5B, 0x7A, 0xF8, 0x67, 0xDB, 0x0D, 0x8E, 0xD8, 0x80, 0xBE, 0x01, + 0xFA, 0x03, 0x20, 0x3F, 0x00, 0x05, 0x30, 0x57, 0x80, 0x03, 0x28, 0x50, + 0x22, 0x09, 0x29, 0x12, 0x5C, 0xF0, 0x41, 0x08, 0x07, 0x92, 0x30, 0xC2, + 0x5C, 0xBA, 0x68, 0xD0, 0x8B, 0x29, 0x94, 0x40, 0x00, 0x00, 0x04, 0x90, + 0xF0, 0x10, 0x44, 0x5D, 0x46, 0xB4, 0xA8, 0x22, 0x6C, 0x44, 0xD2, 0xE7, + 0x15, 0x21, 0x68, 0xC1, 0x31, 0xC6, 0x93, 0xD0, 0x9B, 0x51, 0x46, 0x91, + 0x70, 0x44, 0xC9, 0x26, 0x1C, 0x67, 0x12, 0x12, 0x48, 0x20, 0x7D, 0xFA, + 0x29, 0xA8, 0xA0, 0xFE, 0x8E, 0x2A, 0x8A, 0xA8, 0x7B, 0x92, 0x5A, 0xD2, + 0x49, 0x4C, 0x54, 0x69, 0xE5, 0x94, 0x59, 0x62, 0x09, 0x65, 0xAB, 0x1B, + 0xDE, 0xA9, 0x11, 0x1F, 0x21, 0x7C, 0xF8, 0x24, 0x94, 0x50, 0x56, 0x99, + 0xC3, 0x13, 0x21, 0x88, 0xC0, 0x64, 0x88, 0x1C, 0x86, 0xF8, 0x44, 0x14, + 0x59, 0xB6, 0x71, 0xE5, 0xBB, 0x3B, 0x8B, 0x36, 0xFA, 0x68, 0xA4, 0xFB, + 0x72, 0x27, 0x0C, 0x3D, 0xF4, 0x88, 0x84, 0x90, 0xC2, 0xF4, 0x58, 0x21, + 0x8D, 0x36, 0xC4, 0x48, 0xCC, 0xEA, 0x30, 0x54, 0x58, 0x21, 0x8C, 0xCA, + 0xD2, 0xC0, 0x63, 0x34, 0x3D, 0x50, 0xC3, 0x03, 0x0F, 0x31, 0xC6, 0x38, + 0x23, 0x84, 0x33, 0x4C, 0x2B, 0x44, 0x8F, 0x30, 0x38, 0x50, 0x80, 0x10, + 0xD0, 0xD6, 0x70, 0xE1, 0x05, 0x32, 0xC6, 0xB0, 0x83, 0x8C, 0x30, 0x4A, + 0x20, 0x01, 0x86, 0x0E, 0x60, 0xB0, 0xE3, 0x85, 0x37, 0xF8, 0x78, 0xC3, + 0x37, 0x1B, 0x68, 0xAD, 0x21, 0x8E, 0x3B, 0xE4, 0x68, 0x44, 0xB9, 0x4D, + 0x98, 0xE3, 0xD5, 0xB9, 0x63, 0x38, 0x01, 0x24, 0x07, 0x5D, 0xAE, 0x93, + 0x89, 0x1A, 0x2B, 0x6C, 0x48, 0x00, 0x87, 0x90, 0xA6, 0x35, 0x6F, 0x46, + 0x68, 0xA1, 0xA5, 0xE7, 0x17, 0x7A, 0xE6, 0x91, 0xC7, 0x24, 0x5B, 0xFE, + 0xE9, 0x61, 0x83, 0x6E, 0xFF, 0x61, 0xFD, 0x88, 0x23, 0xF2, 0xE3, 0x0F, + 0xC0, 0x00, 0xCD, 0x2D, 0x80, 0x02, 0x75, 0x91, 0x60, 0x77, 0x8A, 0x05, + 0x7B, 0x77, 0x70, 0x0B, 0x79, 0xE7, 0xE5, 0x85, 0xC2, 0x5C, 0x72, 0xE1, + 0x02, 0x43, 0x0D, 0x08, 0x20, 0x00, 0x81, 0x0E, 0x21, 0xDA, 0x65, 0x17, + 0x2E, 0xB8, 0xC8, 0x22, 0x8B, 0x12, 0x6F, 0xC9, 0xF1, 0x1D, 0x22, 0x46, + 0xE9, 0xA7, 0xF4, 0xD3, 0x1B, 0x86, 0x18, 0x3D, 0x1B, 0x5D, 0x12, 0x49, + 0x9E, 0x98, 0x72, 0xBA, 0x31, 0xC5, 0xFE, 0x8B, 0x81, 0xE4, 0x07, 0x9F, + 0xF5, 0x81, 0xF2, 0x89, 0x63, 0xA1, 0x3C, 0x56, 0x12, 0x29, 0x7B, 0xE0, + 0xD9, 0xA7, 0x16, 0x4C, 0x66, 0x31, 0xF9, 0x93, 0x56, 0x86, 0xB8, 0x01, + 0x81, 0x5A, 0xE8, 0xC3, 0x46, 0xF0, 0xD0, 0x41, 0x0E, 0x6A, 0xF6, 0x09, + 0x04, 0x62, 0xA2, 0x2C, 0x44, 0x30, 0x4B, 0x10, 0x46, 0x81, 0xB2, 0x6D, + 0xC4, 0x82, 0x16, 0x02, 0x4C, 0x5A, 0x05, 0x2D, 0x78, 0x41, 0x3B, 0xA9, + 0xA3, 0x0C, 0x70, 0x50, 0x83, 0x20, 0xD0, 0x30, 0x08, 0x44, 0xE0, 0x61, + 0x05, 0x62, 0xA8, 0x9A, 0x18, 0xB6, 0xF6, 0x82, 0x16, 0xA4, 0xE0, 0x04, + 0x6A, 0x68, 0x83, 0x9E, 0x5C, 0xA5, 0x07, 0x42, 0x2C, 0x4A, 0x0F, 0x6D, + 0x28, 0xC3, 0x18, 0x2E, 0x21, 0x03, 0x16, 0x38, 0xAD, 0x10, 0x6A, 0x50, + 0x41, 0x02, 0x48, 0x30, 0x88, 0x36, 0x84, 0xC6, 0x05, 0x93, 0x19, 0x83, + 0x19, 0xD6, 0xA0, 0x06, 0x32, 0x90, 0xC1, 0x05, 0x28, 0xE0, 0x40, 0x12, + 0x03, 0xC7, 0x07, 0x3E, 0xF4, 0x01, 0x71, 0x8D, 0xB8, 0x83, 0xAD, 0x8A, + 0xF3, 0x07, 0xE5, 0x70, 0xE2, 0x0F, 0x8B, 0x6B, 0x4E, 0x16, 0xA5, 0x63, + 0x83, 0x55, 0x58, 0xAE, 0x27, 0xBA, 0x28, 0xC2, 0x04, 0x6C, 0x01, 0x93, + 0xF2, 0xBC, 0x48, 0x8D, 0xA1, 0x63, 0xC9, 0xE7, 0xB0, 0x41, 0x8E, 0xD2, + 0xA9, 0xC4, 0x26, 0xE4, 0x70, 0xDD, 0xEA, 0x36, 0xD0, 0x03, 0x6F, 0xE1, + 0xC7, 0x3F, 0xFA, 0xE1, 0xE3, 0x7E, 0x00, 0x20, 0xA0, 0x02, 0x20, 0xA0, + 0x40, 0x4A, 0x20, 0xA4, 0xEE, 0x10, 0x84, 0xA0, 0x2D, 0x1C, 0x12, 0x78, + 0xF3, 0x22, 0xC8, 0x83, 0xBC, 0x10, 0x05, 0x0C, 0x59, 0x20, 0x00, 0x06, + 0x10, 0xA4, 0x14, 0xAA, 0xF0, 0xBC, 0xE8, 0x95, 0x08, 0x0B, 0x25, 0x42, + 0xC7, 0x75, 0x44, 0xD1, 0x04, 0x6B, 0xDC, 0x04, 0x45, 0xFE, 0x0C, 0x93, + 0x91, 0xC4, 0xE6, 0x51, 0xB1, 0x1C, 0xD1, 0xE4, 0x65, 0x18, 0x63, 0x65, + 0x4F, 0x5C, 0xF9, 0xBE, 0x57, 0x6A, 0x4C, 0x7E, 0x4A, 0xBA, 0x87, 0x3D, + 0xEA, 0x71, 0x8F, 0x74, 0x34, 0xE1, 0x64, 0xB2, 0x80, 0x85, 0x2A, 0x30, + 0x91, 0x83, 0x07, 0x34, 0x41, 0x80, 0xD8, 0xC1, 0x07, 0x0E, 0x82, 0xA0, + 0x32, 0x50, 0x7C, 0xA2, 0x4C, 0x46, 0x38, 0x93, 0x27, 0x72, 0x90, 0x03, + 0xB5, 0xCC, 0x62, 0x1B, 0xB2, 0x98, 0x20, 0x06, 0xAD, 0x79, 0x4D, 0x6C, + 0xD6, 0x65, 0x1D, 0x97, 0xE0, 0xA0, 0x20, 0x58, 0x30, 0x88, 0x48, 0xB8, + 0x61, 0x84, 0x82, 0x10, 0x43, 0x0B, 0xC2, 0xB0, 0x35, 0x16, 0x84, 0x81, + 0x05, 0x63, 0xBB, 0xCC, 0xA3, 0xDA, 0x00, 0x44, 0x49, 0xE1, 0x61, 0x32, + 0x65, 0x48, 0x01, 0x08, 0xC4, 0x50, 0x88, 0x48, 0xA8, 0xE1, 0x03, 0x0B, + 0x68, 0x01, 0x1E, 0x5C, 0xD5, 0x06, 0x18, 0x98, 0xA1, 0x0E, 0x64, 0x80, + 0x41, 0x0B, 0xD6, 0xB0, 0x06, 0x33, 0xE4, 0x81, 0x0C, 0x2B, 0xE0, 0x40, + 0x09, 0x62, 0xF5, 0x06, 0xE1, 0xDC, 0xE1, 0x0E, 0x54, 0x9C, 0x28, 0x15, + 0x1B, 0xF1, 0x88, 0x47, 0xE4, 0xCA, 0x11, 0x9D, 0xE8, 0x22, 0x74, 0x38, + 0x21, 0x07, 0x1B, 0x04, 0xC1, 0x72, 0xD8, 0x81, 0x87, 0x15, 0x70, 0xE0, + 0x8A, 0x67, 0xB5, 0x71, 0x8D, 0xCD, 0x4A, 0xA9, 0xE7, 0x5E, 0x74, 0x0E, + 0x6C, 0x94, 0x2E, 0x24, 0x36, 0xE2, 0x87, 0x2D, 0x98, 0xB0, 0x3A, 0x6D, + 0xCD, 0xA7, 0x07, 0xFB, 0x0A, 0x10, 0xED, 0xF6, 0xB3, 0x21, 0x02, 0xA9, + 0x6B, 0x03, 0x14, 0x10, 0x64, 0x81, 0x36, 0xA0, 0x04, 0x24, 0xE8, 0x2E, + 0x09, 0x4B, 0x45, 0x50, 0xF0, 0x20, 0x24, 0x90, 0x2E, 0x70, 0xA1, 0x0B, + 0x5A, 0x98, 0x02, 0x12, 0x08, 0x30, 0xC9, 0x03, 0x6C, 0x00, 0x09, 0x58, + 0xFE, 0xC0, 0x64, 0xF4, 0x2C, 0xB2, 0x0B, 0x1B, 0xBD, 0x47, 0x08, 0xAE, + 0xE0, 0x07, 0x3C, 0x48, 0x29, 0x12, 0x1B, 0x41, 0xEC, 0x25, 0x2A, 0x99, + 0x09, 0x5A, 0x5F, 0x76, 0x23, 0x9D, 0xAC, 0x8F, 0x7D, 0xF0, 0xCB, 0x98, + 0x4B, 0x66, 0xD9, 0xB1, 0xA5, 0x34, 0x89, 0x28, 0xF6, 0x03, 0x45, 0x54, + 0x54, 0xA1, 0x8D, 0x59, 0x7C, 0x02, 0x08, 0x33, 0xB8, 0x01, 0x3F, 0xDE, + 0xA2, 0x11, 0x7E, 0xDC, 0x60, 0x08, 0xCB, 0xF0, 0x04, 0x26, 0x74, 0x46, + 0x96, 0xB2, 0x18, 0x01, 0x07, 0x43, 0xF0, 0x44, 0x2B, 0xA0, 0x21, 0x34, + 0x5D, 0x64, 0x53, 0xB3, 0x9B, 0xC5, 0xE0, 0x3A, 0xC4, 0x80, 0x87, 0x36, + 0xCC, 0x50, 0x0F, 0x88, 0x68, 0x83, 0x0A, 0xC4, 0x70, 0x06, 0x4C, 0xBD, + 0x40, 0x05, 0x2D, 0x68, 0xC1, 0x25, 0x5A, 0xA0, 0x28, 0xD1, 0x68, 0xCA, + 0x0C, 0x61, 0xBB, 0xCC, 0x65, 0xF4, 0x64, 0x06, 0x10, 0xAC, 0x00, 0x84, + 0x64, 0xE0, 0x00, 0x03, 0xC6, 0xF0, 0xCE, 0x36, 0xD8, 0x61, 0x0D, 0x0A, + 0x9D, 0x8D, 0x18, 0x8E, 0x98, 0x82, 0x35, 0x90, 0x61, 0x0D, 0x2F, 0xD8, + 0x1B, 0xAD, 0x84, 0x13, 0x87, 0x3F, 0xDC, 0xC1, 0x0F, 0x19, 0x6D, 0xC4, + 0xAE, 0x1A, 0x01, 0x08, 0xC6, 0x71, 0x94, 0x71, 0x1F, 0xB5, 0x81, 0x0E, + 0x88, 0x75, 0x9D, 0x77, 0x94, 0xA2, 0x08, 0xAF, 0x58, 0x23, 0x79, 0x9E, + 0x75, 0x12, 0x97, 0x96, 0xF7, 0x8D, 0x29, 0x72, 0x59, 0x3E, 0xE0, 0x81, + 0x0D, 0xFB, 0xE0, 0xB1, 0x5B, 0x19, 0xE8, 0xD6, 0x7F, 0xFC, 0x08, 0x80, + 0x00, 0xD8, 0x77, 0x43, 0x81, 0xA4, 0x80, 0xEE, 0x90, 0x40, 0x01, 0x74, + 0xA5, 0x8B, 0x90, 0xEC, 0x52, 0xC2, 0x51, 0xD7, 0xC5, 0x3B, 0x78, 0xD9, + 0xCB, 0x0B, 0x0D, 0xB2, 0x17, 0x86, 0x20, 0x10, 0x00, 0x01, 0x20, 0x20, + 0xAB, 0x52, 0xD8, 0xFE, 0xE4, 0x44, 0x32, 0x89, 0x05, 0x53, 0xA0, 0x23, + 0x23, 0xF2, 0x10, 0x85, 0x15, 0x42, 0x49, 0x8F, 0xF6, 0x3C, 0xCC, 0x24, + 0x2F, 0x31, 0x89, 0x4C, 0x82, 0xD4, 0x56, 0xF3, 0xB1, 0x52, 0xAE, 0x76, + 0x65, 0xB1, 0xC6, 0x5C, 0xD9, 0xB1, 0xF8, 0x31, 0xC9, 0x1E, 0x49, 0x61, + 0xD2, 0x93, 0xF6, 0xE1, 0x8F, 0x26, 0xA8, 0x42, 0x14, 0xD1, 0x68, 0x05, + 0x28, 0x9A, 0x70, 0x83, 0x03, 0x9C, 0x22, 0x23, 0x70, 0x81, 0x47, 0x05, + 0xE6, 0xB0, 0x8C, 0x50, 0x80, 0x62, 0x0E, 0x63, 0x21, 0xCB, 0x0E, 0x82, + 0xA0, 0xA6, 0x39, 0x88, 0xE2, 0xB2, 0xB1, 0x08, 0x20, 0x76, 0x38, 0x7B, + 0x65, 0x2C, 0xD3, 0x29, 0x1D, 0x61, 0x80, 0x5B, 0x0C, 0x37, 0xD5, 0x86, + 0x14, 0x9C, 0x13, 0x51, 0x61, 0x90, 0x0C, 0x0B, 0x58, 0xA0, 0xB5, 0x15, + 0x68, 0xAA, 0x0C, 0x75, 0x10, 0x03, 0xDC, 0x34, 0xD5, 0x86, 0x36, 0xA8, + 0xE1, 0x52, 0x24, 0x20, 0xC1, 0xA6, 0xC2, 0x40, 0x02, 0x0E, 0xFC, 0x16, + 0x88, 0x7A, 0x18, 0x6E, 0x1E, 0x58, 0x45, 0x86, 0xBB, 0xB9, 0x20, 0x0F, + 0x6B, 0xB0, 0x83, 0x1D, 0x60, 0x10, 0x03, 0x34, 0x48, 0xB4, 0x8A, 0xBF, + 0xB9, 0x95, 0x1F, 0xFA, 0xF0, 0x88, 0x4D, 0x14, 0xA7, 0x11, 0x9D, 0xE8, + 0xC4, 0x26, 0x2A, 0x9D, 0x9C, 0xE6, 0x00, 0xC2, 0x06, 0x36, 0x70, 0xC5, + 0x48, 0xF1, 0xE1, 0x0A, 0x2B, 0x94, 0xE2, 0x1C, 0xE6, 0x65, 0x63, 0x79, + 0xD3, 0xF8, 0x22, 0x72, 0x80, 0x83, 0x7C, 0x21, 0x26, 0x87, 0x2D, 0xEE, + 0xE8, 0xBA, 0xF9, 0x1E, 0xE1, 0x3F, 0xFD, 0xD9, 0xA3, 0x7D, 0x0D, 0xB0, + 0xA1, 0x74, 0x19, 0x08, 0x41, 0xFF, 0x3D, 0x40, 0xAF, 0x29, 0x70, 0x80, + 0x03, 0x2B, 0x01, 0x77, 0x48, 0x40, 0x70, 0x83, 0x12, 0x99, 0x04, 0x2D, + 0x28, 0xE8, 0x42, 0x55, 0xD0, 0x80, 0xFE, 0x7F, 0x0C, 0x40, 0x20, 0x24, + 0x5C, 0x12, 0x7A, 0x60, 0xE8, 0x2A, 0x30, 0x8A, 0x45, 0x8B, 0x26, 0xD4, + 0x02, 0x1F, 0x70, 0x14, 0x71, 0x29, 0x5B, 0x52, 0x93, 0x53, 0xA6, 0xA4, + 0x47, 0xE9, 0x6B, 0xE5, 0xC6, 0x5A, 0xDC, 0x93, 0x7D, 0x6C, 0xAC, 0x48, + 0x1F, 0x03, 0x19, 0x8D, 0x43, 0x56, 0x0F, 0x27, 0xE9, 0x12, 0x13, 0xAD, + 0xE8, 0xE5, 0x27, 0x72, 0x30, 0x81, 0x20, 0xE0, 0x03, 0x2E, 0xD8, 0xE9, + 0x47, 0x04, 0xE6, 0x80, 0x8C, 0xB0, 0xCC, 0xA1, 0x08, 0x02, 0x0F, 0x42, + 0x0E, 0x8A, 0x70, 0x03, 0x23, 0x54, 0x56, 0x9A, 0xAD, 0x08, 0x60, 0x96, + 0x1D, 0xFE, 0xF0, 0xBD, 0xE4, 0x49, 0x0D, 0x68, 0x38, 0x44, 0x19, 0x3A, + 0x78, 0x06, 0x14, 0x86, 0xE1, 0xCE, 0x24, 0x50, 0x81, 0x98, 0xC3, 0x70, + 0x82, 0x32, 0xC4, 0x39, 0xE4, 0xC0, 0x3D, 0x43, 0x1B, 0x2C, 0x83, 0x99, + 0x3A, 0xAC, 0x80, 0x01, 0x2F, 0x38, 0x84, 0x1B, 0xCA, 0x00, 0x02, 0xD1, + 0xCC, 0x70, 0x10, 0x75, 0xD8, 0xC3, 0x1E, 0x68, 0x93, 0x44, 0x33, 0xBC, + 0x00, 0xA1, 0xC3, 0x25, 0x43, 0x09, 0xC8, 0x10, 0x45, 0x46, 0xF8, 0xC1, + 0x8A, 0x12, 0x5D, 0x04, 0x46, 0x89, 0x33, 0x69, 0x4A, 0x5B, 0x9A, 0x71, + 0x8E, 0xF8, 0x83, 0x0D, 0x4C, 0x60, 0x04, 0x62, 0xD9, 0x03, 0x3B, 0x9E, + 0xD8, 0xC1, 0x2B, 0xCE, 0xF1, 0x30, 0x53, 0xB7, 0x54, 0xA5, 0xA7, 0x3E, + 0xCF, 0x7A, 0xE9, 0x71, 0x3A, 0x7D, 0xEB, 0xA2, 0x07, 0x76, 0xBC, 0x23, + 0x1E, 0x65, 0xAD, 0xBC, 0x5A, 0x03, 0xC8, 0x3F, 0xE8, 0xEA, 0x2F, 0x22, + 0x8F, 0x2D, 0x6C, 0x00, 0x1B, 0x68, 0xA9, 0xB8, 0x53, 0x02, 0xEF, 0x18, + 0x94, 0x04, 0x42, 0x16, 0x52, 0x0A, 0xC9, 0x56, 0x82, 0x00, 0x20, 0xBC, + 0xBC, 0x0D, 0x30, 0x81, 0x7A, 0xBB, 0xA0, 0xB6, 0x85, 0xFE, 0x77, 0xF1, + 0x0E, 0x1B, 0x91, 0x63, 0x14, 0xA2, 0x20, 0x07, 0x3C, 0xF8, 0x01, 0xA3, + 0xEF, 0x8D, 0x38, 0x62, 0x70, 0x05, 0x52, 0xFA, 0x80, 0xF2, 0x62, 0x9F, + 0xA4, 0x5B, 0xEA, 0xEB, 0x96, 0x3A, 0x8C, 0x3D, 0x56, 0x8F, 0xA3, 0xDC, + 0x63, 0x1F, 0xB0, 0x10, 0x05, 0x2C, 0x30, 0xD1, 0x8D, 0x58, 0x7C, 0x22, + 0x08, 0x10, 0x88, 0x80, 0x37, 0xF6, 0x8D, 0x1D, 0x6A, 0x44, 0xC0, 0x13, + 0xCB, 0xF8, 0x04, 0x11, 0xE6, 0x60, 0xFB, 0x22, 0x8C, 0xC5, 0x08, 0x08, + 0xF7, 0x84, 0x2B, 0x2E, 0xCB, 0x0A, 0x57, 0x40, 0x5C, 0xF8, 0xC3, 0xA7, + 0x4B, 0x1C, 0xD4, 0x60, 0x06, 0x0F, 0x52, 0x46, 0x0D, 0x88, 0x12, 0x03, + 0x73, 0x5F, 0xB0, 0x82, 0x16, 0x94, 0xAD, 0x0C, 0x23, 0xC8, 0xCC, 0x19, + 0x98, 0x46, 0x29, 0xB2, 0x71, 0x46, 0x0F, 0x67, 0xB0, 0xBE, 0x18, 0x3A, + 0x30, 0x02, 0x37, 0x00, 0xAA, 0x03, 0x2D, 0xD0, 0x03, 0xCD, 0x13, 0x21, + 0x08, 0x3E, 0xAC, 0x81, 0x0D, 0x76, 0x68, 0x81, 0x11, 0x5D, 0x70, 0x87, + 0x3C, 0xC4, 0xE0, 0x0D, 0x76, 0x60, 0x43, 0x0C, 0xA0, 0x48, 0x45, 0xC4, + 0x3D, 0x42, 0xBA, 0x17, 0x25, 0x0E, 0xAF, 0x30, 0x9A, 0x74, 0xA5, 0x73, + 0x04, 0x4D, 0x13, 0x81, 0x08, 0xA8, 0x9C, 0x19, 0x93, 0x09, 0x2B, 0xD8, + 0x01, 0x51, 0xFB, 0x1C, 0x67, 0xD9, 0x3A, 0x52, 0x53, 0x09, 0x78, 0x20, + 0x87, 0x7C, 0x88, 0x87, 0x96, 0x38, 0x87, 0x2B, 0xA0, 0x02, 0xFB, 0xA8, + 0xA3, 0x6E, 0x51, 0x1E, 0x71, 0xA1, 0x1D, 0xDA, 0x11, 0x00, 0x75, 0x39, + 0x10, 0x63, 0x9B, 0x82, 0x03, 0x99, 0x02, 0x29, 0x90, 0x02, 0xE0, 0x21, + 0x41, 0x61, 0xAB, 0xBB, 0x05, 0xC1, 0x3B, 0xA4, 0x22, 0x30, 0x0D, 0x60, + 0x02, 0x25, 0xC0, 0x80, 0xFC, 0x1A, 0x17, 0x0A, 0xD0, 0x00, 0x24, 0xE0, + 0xFE, 0x02, 0x5E, 0xA0, 0xB6, 0xE7, 0x31, 0x85, 0x5D, 0xC0, 0x86, 0xEB, + 0x10, 0x2F, 0x69, 0xE0, 0x07, 0x72, 0xA0, 0x40, 0xC9, 0x3B, 0x1F, 0x1C, + 0x19, 0x92, 0x97, 0xA9, 0x89, 0x55, 0x7A, 0x89, 0x15, 0xDB, 0x09, 0x16, + 0xD3, 0x3C, 0x17, 0xD3, 0x3C, 0xCF, 0x9B, 0xA5, 0x25, 0x21, 0x0A, 0x75, + 0x68, 0x02, 0x58, 0x88, 0x05, 0x6D, 0xD0, 0x06, 0x50, 0xC0, 0x04, 0x1C, + 0x90, 0x00, 0x51, 0xA0, 0xA0, 0xB7, 0xC0, 0x0E, 0x5C, 0xF0, 0xB7, 0x59, + 0xC0, 0x04, 0x4F, 0x08, 0x85, 0x4F, 0xB8, 0xBD, 0x7F, 0x88, 0xAC, 0xB2, + 0x58, 0x85, 0xCB, 0x6A, 0x05, 0xA2, 0x21, 0x3E, 0x3B, 0x14, 0xBE, 0x3F, + 0x40, 0x83, 0xD0, 0x2A, 0x14, 0x34, 0x40, 0xAD, 0xAD, 0x49, 0x01, 0x12, + 0x18, 0x21, 0x16, 0x58, 0x81, 0x17, 0x20, 0xB3, 0x3A, 0x08, 0x9B, 0x32, + 0xD0, 0x83, 0xF0, 0x73, 0x03, 0xE5, 0xC3, 0x0C, 0x79, 0x52, 0x01, 0x15, + 0x60, 0x80, 0x30, 0x78, 0x01, 0x35, 0x60, 0x00, 0xF2, 0xAB, 0x03, 0x70, + 0x32, 0x84, 0x3A, 0x80, 0x83, 0x83, 0x52, 0x2E, 0x33, 0x50, 0x01, 0x3B, + 0x50, 0x28, 0x18, 0x50, 0x3F, 0x18, 0x60, 0x83, 0xE0, 0xA8, 0x22, 0xE9, + 0xFA, 0x03, 0xA3, 0xD3, 0x15, 0x5E, 0xD9, 0x04, 0x48, 0x4B, 0xBA, 0x4E, + 0x68, 0x06, 0x40, 0x18, 0x40, 0x09, 0xC0, 0x84, 0xA3, 0x28, 0x29, 0x1C, + 0x28, 0x85, 0x98, 0xEA, 0x9C, 0x52, 0xE3, 0xBA, 0xF4, 0x52, 0x09, 0xF6, + 0xA0, 0x07, 0xB3, 0x02, 0x0F, 0x7C, 0x80, 0x8F, 0x2C, 0xC0, 0x40, 0x64, + 0xCC, 0x00, 0xFD, 0x20, 0x17, 0x9F, 0xAA, 0x41, 0x86, 0x08, 0xC1, 0x05, + 0x39, 0x88, 0x63, 0x73, 0xBB, 0xB7, 0xDB, 0x80, 0x29, 0x70, 0x10, 0x12, + 0x04, 0x30, 0x01, 0xC0, 0x00, 0x42, 0xC2, 0x80, 0x03, 0xC0, 0x80, 0x3F, + 0x2A, 0x80, 0x03, 0xFE, 0x38, 0x82, 0x02, 0xA1, 0x82, 0x4D, 0x02, 0x83, + 0x89, 0x40, 0xC7, 0x5D, 0xB0, 0x9F, 0x7D, 0xA8, 0x06, 0x2B, 0xF0, 0x84, + 0x7E, 0x20, 0x07, 0x1E, 0x69, 0x09, 0x24, 0x9C, 0xBC, 0x24, 0x0C, 0x12, + 0x56, 0x22, 0x37, 0xBB, 0x72, 0x9F, 0xCE, 0x53, 0x37, 0x7F, 0x84, 0x1F, + 0xF9, 0xC9, 0x2B, 0x78, 0x03, 0x3D, 0x51, 0xA0, 0x37, 0x58, 0x50, 0x07, + 0x54, 0x08, 0x05, 0x4C, 0xA8, 0x80, 0x1D, 0xD0, 0x88, 0xB9, 0xF8, 0x05, + 0x08, 0x20, 0x02, 0x59, 0x40, 0x05, 0x59, 0x60, 0x05, 0x65, 0x2A, 0x93, + 0x21, 0x98, 0x83, 0x1C, 0x08, 0x82, 0xA7, 0x08, 0x9A, 0x58, 0xF8, 0x05, + 0x32, 0xBC, 0x43, 0x91, 0xBC, 0x32, 0x4D, 0x48, 0x83, 0x3C, 0xA8, 0x0C, + 0x3D, 0x94, 0xA7, 0x11, 0x08, 0xB3, 0xD7, 0x7A, 0x3E, 0x33, 0x68, 0x81, + 0x15, 0x38, 0x81, 0x15, 0x18, 0x83, 0x31, 0x28, 0xBF, 0x91, 0x6B, 0x83, + 0xAF, 0x91, 0xB3, 0x38, 0x3B, 0x81, 0x16, 0xE0, 0x80, 0x0E, 0x40, 0x21, + 0x11, 0x40, 0x81, 0x3A, 0xC0, 0xC4, 0x44, 0xD8, 0x83, 0x3C, 0xA8, 0x03, + 0xBB, 0xA1, 0x1B, 0x43, 0x63, 0x15, 0x3B, 0xE0, 0x83, 0x18, 0x20, 0x83, + 0x37, 0x20, 0x03, 0x36, 0xE8, 0x83, 0x46, 0xF8, 0x0D, 0xE9, 0xBA, 0x95, + 0x46, 0xB8, 0x15, 0x57, 0xDC, 0x4A, 0x4B, 0xAB, 0xB4, 0x66, 0x90, 0x45, + 0xA7, 0x7B, 0x3A, 0xD1, 0x23, 0x8A, 0x52, 0xC0, 0x81, 0x57, 0x00, 0x07, + 0x69, 0x61, 0x40, 0xAD, 0xF3, 0xC5, 0xF3, 0x00, 0x87, 0xAB, 0x2B, 0x42, + 0x83, 0x41, 0x07, 0xD5, 0xF9, 0x07, 0xFA, 0xCA, 0x80, 0xB1, 0x7B, 0x80, + 0x59, 0xF3, 0x40, 0xFF, 0xA8, 0xC1, 0x02, 0xC0, 0x00, 0x0A, 0x28, 0xC1, + 0x77, 0x21, 0x88, 0x05, 0xB1, 0x3B, 0x15, 0x5C, 0x17, 0xE0, 0x49, 0x24, + 0x29, 0x48, 0x82, 0x0B, 0xB0, 0x80, 0xFE, 0x7C, 0x39, 0x80, 0x09, 0xA0, + 0x80, 0xFC, 0x30, 0x80, 0x74, 0x61, 0x9E, 0x0E, 0x89, 0x1E, 0xE7, 0x89, + 0x1E, 0x20, 0xC4, 0x87, 0x77, 0xB0, 0x82, 0x51, 0xE0, 0x06, 0x78, 0x08, + 0xB1, 0xC9, 0xCB, 0x91, 0xD0, 0x0C, 0x12, 0xCA, 0x13, 0x92, 0x9A, 0x90, + 0x3A, 0xB9, 0xBA, 0xBC, 0x57, 0xE2, 0x18, 0x74, 0x7B, 0x9F, 0xCD, 0x73, + 0x4D, 0x8F, 0x79, 0x92, 0x27, 0xB1, 0x07, 0x6D, 0x68, 0x82, 0x69, 0xC0, + 0x84, 0x69, 0x90, 0x85, 0x56, 0x68, 0x82, 0x19, 0x90, 0x00, 0x6E, 0x98, + 0x0B, 0x8D, 0xA0, 0x85, 0x07, 0x98, 0x03, 0x68, 0x40, 0x05, 0xAF, 0x50, + 0xA6, 0x50, 0xF0, 0x04, 0xE5, 0x34, 0x02, 0x4C, 0xC0, 0x04, 0x59, 0xB8, + 0xAC, 0x55, 0xA8, 0xA6, 0x91, 0x8C, 0x13, 0x2B, 0x9B, 0xCE, 0xBE, 0xC0, + 0x8E, 0x54, 0x60, 0x81, 0x31, 0x10, 0x03, 0x72, 0x6A, 0x03, 0x33, 0x48, + 0x83, 0x10, 0x90, 0x49, 0x42, 0x94, 0xBE, 0x30, 0x70, 0x83, 0x14, 0x12, + 0x83, 0x30, 0x68, 0x3F, 0xEE, 0x03, 0xAD, 0xF0, 0x2B, 0x9B, 0x3A, 0x00, + 0x94, 0x14, 0xE2, 0x80, 0x11, 0x80, 0x44, 0x12, 0x38, 0x83, 0x35, 0x30, + 0x84, 0x43, 0xC8, 0x83, 0x3D, 0x78, 0x83, 0x31, 0x70, 0x03, 0x36, 0x08, + 0x03, 0x40, 0xE3, 0x38, 0x3B, 0x30, 0x04, 0x18, 0x50, 0x01, 0x36, 0x78, + 0x03, 0x18, 0x88, 0xA2, 0x37, 0x40, 0x9C, 0x5C, 0xB9, 0x95, 0x47, 0xA8, + 0xAE, 0xC6, 0x59, 0x9C, 0xAE, 0xDC, 0xAE, 0x1A, 0xD8, 0x34, 0x1B, 0xA8, + 0x1C, 0x76, 0x48, 0x0A, 0x69, 0x08, 0x02, 0x57, 0x60, 0x16, 0x36, 0xD2, + 0x3A, 0x96, 0x9A, 0x16, 0x7A, 0x28, 0xC2, 0xD2, 0x71, 0x0F, 0x5B, 0x80, + 0x1D, 0x14, 0x85, 0x1D, 0x0E, 0xF4, 0xC0, 0x73, 0x11, 0x00, 0xFD, 0xCA, + 0x2A, 0xC0, 0xDC, 0x02, 0x82, 0xE0, 0x85, 0x5E, 0x28, 0xFE, 0x88, 0x2E, + 0x40, 0x08, 0xBC, 0x9B, 0x02, 0x81, 0x38, 0xB6, 0x03, 0x61, 0x90, 0xAA, + 0x4A, 0x82, 0x0D, 0x08, 0x00, 0x08, 0x93, 0x4C, 0x04, 0x38, 0x82, 0x1E, + 0xA0, 0x9E, 0x89, 0x20, 0x3C, 0x1F, 0xBC, 0x0E, 0x5A, 0xE8, 0x08, 0x78, + 0x50, 0xB5, 0xEE, 0x91, 0xBC, 0x7B, 0xBC, 0x91, 0x8B, 0xA9, 0x09, 0x21, + 0xE1, 0x07, 0x99, 0x38, 0x92, 0x74, 0x23, 0x12, 0x7E, 0xBC, 0xBC, 0x59, + 0x92, 0xBA, 0x5A, 0x62, 0xB7, 0xD8, 0x04, 0x3D, 0x32, 0x6D, 0x82, 0x58, + 0x98, 0x85, 0x59, 0xF0, 0x87, 0x56, 0xE8, 0x9F, 0x0A, 0x10, 0x26, 0xE0, + 0xD4, 0x87, 0x52, 0xB8, 0x81, 0x39, 0x88, 0x86, 0x50, 0xF8, 0x8A, 0x51, + 0x60, 0xC3, 0xDB, 0x33, 0x8B, 0x51, 0xF0, 0x04, 0x58, 0x48, 0x86, 0x6D, + 0x58, 0x85, 0x3A, 0xB4, 0x4E, 0x41, 0xB5, 0xA6, 0x68, 0x48, 0x01, 0x52, + 0x41, 0xCA, 0x36, 0xA0, 0xC9, 0x3F, 0x3C, 0x81, 0x17, 0x40, 0x21, 0xD8, + 0x30, 0x83, 0xED, 0xEC, 0xCF, 0xD2, 0xD2, 0x38, 0x41, 0xE9, 0xA0, 0x15, + 0x58, 0x00, 0x8B, 0x1B, 0x83, 0xC8, 0x28, 0x81, 0x13, 0xA8, 0x8D, 0x0E, + 0xB8, 0x04, 0x3D, 0x18, 0x84, 0x42, 0x58, 0x83, 0x3D, 0x10, 0x04, 0x37, + 0x78, 0x83, 0x83, 0x7A, 0x01, 0x3E, 0xB0, 0x03, 0x11, 0x48, 0x50, 0x3B, + 0x90, 0x3F, 0xDF, 0x08, 0x1C, 0xC4, 0xA1, 0x4A, 0x3F, 0xD8, 0x22, 0x8C, + 0xDA, 0x95, 0x5D, 0x51, 0x3A, 0x4B, 0xF3, 0xA8, 0x1A, 0x38, 0x02, 0x1B, + 0x90, 0x80, 0x33, 0x6A, 0x87, 0x19, 0xFB, 0x05, 0x1C, 0xB0, 0x02, 0x57, + 0x80, 0x87, 0x10, 0xCD, 0xBA, 0x06, 0xDC, 0xBA, 0x7C, 0x00, 0x87, 0x77, + 0x10, 0x46, 0xF7, 0xF8, 0x86, 0x0C, 0x98, 0x56, 0xD8, 0x79, 0x80, 0x23, + 0x40, 0x00, 0x66, 0x64, 0x51, 0xFC, 0xB2, 0xAF, 0x6F, 0x1C, 0x30, 0x04, + 0xFE, 0x0B, 0x1E, 0x1B, 0x45, 0x90, 0x76, 0x39, 0x4C, 0x6C, 0x64, 0xAA, + 0x64, 0x6B, 0x17, 0x0A, 0xC8, 0x2F, 0x71, 0xBC, 0x1D, 0x24, 0x98, 0x9E, + 0x2C, 0xB0, 0x05, 0x5F, 0xB0, 0x05, 0x88, 0xE8, 0x07, 0x92, 0xE2, 0x4C, + 0x6F, 0x68, 0x07, 0x64, 0xA5, 0x47, 0xF1, 0x79, 0x09, 0x1B, 0x09, 0x1F, + 0x24, 0x34, 0x12, 0x2C, 0x65, 0x9F, 0x80, 0x75, 0x9F, 0xD3, 0x8C, 0xA5, + 0x22, 0x69, 0xCD, 0x2A, 0x24, 0x8A, 0x2B, 0x64, 0x8A, 0x5A, 0x72, 0x05, + 0x4C, 0xD0, 0x86, 0x56, 0x50, 0x86, 0x58, 0x40, 0x85, 0x4F, 0xC0, 0x81, + 0x93, 0xAA, 0x4E, 0xB9, 0x88, 0x53, 0xE2, 0x6C, 0x85, 0x58, 0x58, 0x85, + 0x50, 0x38, 0x05, 0x51, 0x40, 0x20, 0xB2, 0x50, 0x4E, 0x58, 0x58, 0x86, + 0x6D, 0x60, 0x85, 0x09, 0xC2, 0xD8, 0x41, 0x5D, 0xD9, 0xA3, 0x59, 0x07, + 0x15, 0x18, 0x03, 0xAF, 0x81, 0xD9, 0x33, 0x70, 0xAD, 0x13, 0x88, 0x8C, + 0x74, 0x0A, 0x0D, 0x51, 0x31, 0x83, 0x99, 0x4C, 0x03, 0x3D, 0x10, 0x03, + 0xCE, 0x10, 0x94, 0x31, 0xA8, 0x03, 0x37, 0xE8, 0x00, 0x15, 0x9A, 0x9A, + 0x13, 0x60, 0x01, 0xF1, 0x64, 0x00, 0xD1, 0x38, 0x04, 0x38, 0x40, 0xBE, + 0x37, 0x28, 0x83, 0x3D, 0x48, 0xBF, 0xE5, 0x52, 0x2E, 0x10, 0xB0, 0x03, + 0x45, 0x78, 0x83, 0x15, 0x10, 0x1C, 0x18, 0x78, 0xAE, 0xFD, 0x53, 0xC5, + 0x07, 0xED, 0x3F, 0xE5, 0x78, 0x84, 0x56, 0xEC, 0x04, 0xE6, 0x00, 0x04, + 0x09, 0xA8, 0x50, 0x23, 0xB0, 0x07, 0x75, 0xE0, 0x09, 0x69, 0xA8, 0x00, + 0x5B, 0xC0, 0x86, 0x5F, 0x48, 0x4B, 0xF4, 0x02, 0x51, 0x06, 0x64, 0x09, + 0x7A, 0x08, 0x46, 0x86, 0x11, 0x82, 0x23, 0xA8, 0x80, 0x14, 0x7D, 0x00, + 0xE5, 0xF1, 0xC0, 0x65, 0xFC, 0x23, 0x17, 0x15, 0x10, 0x04, 0xF0, 0x56, + 0xDE, 0x69, 0x10, 0xFE, 0x09, 0xB9, 0x51, 0x45, 0xFA, 0x1D, 0xE0, 0x51, + 0xB0, 0x05, 0xDB, 0x02, 0x0C, 0xF1, 0xBB, 0x00, 0x1B, 0x47, 0x2C, 0xB0, + 0x85, 0x77, 0xAD, 0xDC, 0x2C, 0xC0, 0x02, 0x6B, 0x93, 0x89, 0x57, 0x10, + 0x85, 0x5F, 0xF0, 0x06, 0x6E, 0x93, 0x18, 0xF1, 0x11, 0xCD, 0x7D, 0x55, + 0x1F, 0xD3, 0xCC, 0xBC, 0xCD, 0x8B, 0xA5, 0xD5, 0x4C, 0x58, 0xCE, 0x93, + 0xB1, 0xD0, 0xB3, 0xA5, 0xD9, 0xCC, 0xA5, 0x59, 0x60, 0x06, 0x7F, 0x48, + 0x06, 0x7A, 0x13, 0x82, 0x0A, 0x18, 0x05, 0x87, 0xA4, 0x0B, 0x52, 0x90, + 0xBD, 0xE2, 0x94, 0x85, 0x55, 0x38, 0x85, 0x03, 0x12, 0x85, 0x7F, 0xB0, + 0xBD, 0x4F, 0x90, 0x05, 0x3F, 0x65, 0x85, 0xCC, 0x62, 0x59, 0xE6, 0xB5, + 0x93, 0xB0, 0x7A, 0x8B, 0xA5, 0xD9, 0xCE, 0xE3, 0x43, 0x94, 0x15, 0x58, + 0x81, 0x40, 0xE4, 0x00, 0x10, 0x40, 0xA1, 0x32, 0x08, 0x83, 0x33, 0x28, + 0x03, 0xD3, 0xBA, 0x14, 0x31, 0x70, 0x83, 0xF2, 0x33, 0x39, 0x16, 0x28, + 0x83, 0x16, 0x60, 0x80, 0x13, 0x58, 0xAD, 0x14, 0x42, 0x81, 0xF4, 0xED, + 0x00, 0xD3, 0x1A, 0x84, 0xDE, 0x40, 0x84, 0xC1, 0xC9, 0xCF, 0x35, 0xB8, + 0x83, 0x35, 0xB0, 0xBF, 0x18, 0x50, 0x81, 0xE0, 0x48, 0x81, 0x37, 0x58, + 0x04, 0xDF, 0x90, 0xA8, 0xE1, 0xC8, 0x4A, 0xA3, 0xAB, 0x2E, 0x47, 0x78, + 0x04, 0xB2, 0x6D, 0xC5, 0x4D, 0x98, 0x45, 0x40, 0x10, 0x81, 0x0A, 0x3D, + 0x82, 0x69, 0xD8, 0x87, 0xF5, 0xA9, 0x86, 0x1D, 0x08, 0xA0, 0x73, 0x40, + 0xD6, 0xBA, 0xF5, 0x9C, 0x96, 0x1A, 0x09, 0x6C, 0x38, 0x07, 0x10, 0x73, + 0x0F, 0x5D, 0x38, 0x82, 0x1B, 0x40, 0xD1, 0x07, 0xF0, 0xDB, 0x0E, 0x54, + 0xBB, 0xFC, 0x30, 0x17, 0xFC, 0x12, 0x00, 0x4A, 0x52, 0x97, 0xBA, 0xFB, + 0xD6, 0x81, 0x78, 0x90, 0xDE, 0x71, 0xFE, 0x17, 0xA8, 0x7A, 0x10, 0x81, + 0x20, 0x88, 0x0B, 0x49, 0x57, 0x73, 0x39, 0x00, 0x04, 0x80, 0x80, 0x0D, + 0xC0, 0x82, 0xE9, 0xD9, 0x96, 0xD5, 0xC9, 0x02, 0xFB, 0xD1, 0x07, 0x6F, + 0x30, 0x56, 0x6E, 0xF0, 0x06, 0xF3, 0x09, 0x4D, 0x26, 0xD4, 0x09, 0xCA, + 0x3B, 0xB1, 0x2D, 0xC5, 0xD2, 0xD4, 0x95, 0x3A, 0x29, 0x5C, 0xCD, 0x75, + 0x33, 0xD8, 0xD0, 0xCB, 0xAB, 0xF9, 0x79, 0x87, 0xA4, 0x00, 0x3D, 0x52, + 0x00, 0x05, 0x34, 0x5D, 0x87, 0x58, 0x30, 0xBD, 0x1B, 0xD8, 0x01, 0xD7, + 0xB3, 0x8B, 0x57, 0x90, 0xD3, 0x65, 0x88, 0x05, 0x64, 0xA0, 0x8A, 0xB4, + 0xF0, 0xD8, 0x4F, 0x30, 0x82, 0x39, 0x08, 0x05, 0x64, 0x58, 0x86, 0x75, + 0x80, 0x85, 0xCA, 0x69, 0x5E, 0x3C, 0xAE, 0x13, 0xEC, 0x00, 0x8C, 0xC6, + 0x40, 0xAD, 0x34, 0x80, 0x49, 0x40, 0x54, 0x01, 0x12, 0x30, 0x54, 0x15, + 0x60, 0x01, 0xD6, 0x72, 0x81, 0x72, 0x12, 0x03, 0xCC, 0x80, 0xB3, 0x4B, + 0x70, 0x83, 0x41, 0x18, 0x01, 0xD6, 0xEA, 0x80, 0x41, 0x6E, 0x80, 0x15, + 0xB2, 0x5E, 0x11, 0x38, 0x81, 0x13, 0x18, 0x83, 0x3D, 0x30, 0x04, 0x38, + 0x48, 0x04, 0xDE, 0x30, 0x84, 0x37, 0xE0, 0x64, 0x38, 0x48, 0x83, 0x9F, + 0x2B, 0x81, 0x04, 0x45, 0x50, 0x43, 0xE0, 0x83, 0x03, 0xED, 0x03, 0x46, + 0xBB, 0xA8, 0x4E, 0x10, 0x60, 0xE5, 0xD8, 0x15, 0x4E, 0xA0, 0x34, 0x59, + 0x04, 0x04, 0x4E, 0x10, 0x01, 0x1B, 0xF8, 0x81, 0x07, 0xF8, 0x04, 0x74, + 0xBB, 0x06, 0x22, 0x28, 0x98, 0xF2, 0x38, 0xAF, 0xF3, 0x58, 0x56, 0x95, + 0xCA, 0x07, 0x72, 0x80, 0xA3, 0x77, 0x40, 0x11, 0xF0, 0xE8, 0x01, 0x1C, + 0x98, 0xD6, 0x6E, 0x51, 0x51, 0xFC, 0xCA, 0x2F, 0x21, 0x15, 0xDC, 0x69, + 0x1E, 0xDC, 0x5C, 0x7B, 0x41, 0x2D, 0x58, 0x30, 0x06, 0xFE, 0x73, 0x90, + 0x83, 0xA8, 0x82, 0x2A, 0xC8, 0xE6, 0x2F, 0xD8, 0x05, 0x06, 0x71, 0xAA, + 0x83, 0xD0, 0x02, 0x24, 0x90, 0x5C, 0x73, 0x31, 0x2A, 0x2A, 0xC8, 0x82, + 0xD7, 0x59, 0x1D, 0x53, 0x18, 0xA6, 0x52, 0xF0, 0x84, 0x6A, 0x00, 0x07, + 0x09, 0x3C, 0x1F, 0xB8, 0x42, 0x42, 0x72, 0xBB, 0x98, 0xA1, 0x80, 0x60, + 0xCD, 0xDB, 0x52, 0x29, 0xEC, 0xE7, 0x9F, 0xD8, 0xD2, 0xA2, 0x08, 0xD3, + 0x59, 0xDA, 0xE2, 0x2B, 0xAC, 0x25, 0x78, 0x13, 0xBD, 0xDA, 0x54, 0x53, + 0x7F, 0x50, 0x86, 0x50, 0x68, 0x85, 0x1C, 0xA8, 0x80, 0xEF, 0x50, 0xD9, + 0x7D, 0x13, 0x05, 0x1D, 0x20, 0x82, 0x59, 0x68, 0x85, 0x65, 0x58, 0x06, + 0x58, 0xA0, 0x99, 0x55, 0x10, 0x85, 0x25, 0x23, 0x02, 0x51, 0x98, 0x05, + 0x59, 0x58, 0x07, 0x40, 0x0D, 0xC9, 0x3C, 0x4E, 0x69, 0xBF, 0x90, 0x83, + 0x34, 0x10, 0x83, 0xD8, 0x18, 0x03, 0x7A, 0xAA, 0x27, 0x10, 0x20, 0x01, + 0x73, 0xCA, 0x39, 0x39, 0x4B, 0xA1, 0x14, 0x70, 0x01, 0x98, 0x9E, 0xAD, + 0x38, 0x53, 0x83, 0x31, 0x00, 0x81, 0x43, 0x69, 0x00, 0xE6, 0xEA, 0x00, + 0xEB, 0x4D, 0x81, 0x0E, 0x00, 0x81, 0x12, 0x10, 0x03, 0x38, 0xD8, 0x64, + 0x4E, 0xD6, 0x83, 0x3C, 0x10, 0x84, 0x54, 0x86, 0xA2, 0x16, 0x80, 0x83, + 0x3B, 0x40, 0x81, 0xC0, 0x81, 0x81, 0xC1, 0xF1, 0x0D, 0x45, 0xF8, 0x0D, + 0xA3, 0xAB, 0x04, 0xE2, 0xB0, 0x34, 0xAF, 0x1E, 0x5B, 0xE8, 0x90, 0x03, + 0x4E, 0xF8, 0xD5, 0x1A, 0x30, 0x01, 0x1C, 0xA8, 0x07, 0x77, 0xD8, 0x07, + 0x51, 0x10, 0x02, 0x70, 0x00, 0x8F, 0xF1, 0x70, 0x91, 0xF4, 0x12, 0xE6, + 0x95, 0xB8, 0x5B, 0x7A, 0xE0, 0xE0, 0x19, 0x81, 0xD3, 0x0C, 0x68, 0xE6, + 0x14, 0xFD, 0xDB, 0x68, 0x16, 0x52, 0x21, 0xF5, 0xBB, 0x69, 0x66, 0x88, + 0xFE, 0x74, 0x09, 0xC1, 0x1E, 0x6D, 0x5C, 0x6E, 0x46, 0x88, 0xBD, 0x03, + 0x67, 0x1A, 0x6E, 0xA4, 0x0B, 0x21, 0xC1, 0x03, 0x00, 0x6C, 0x74, 0x19, + 0xAA, 0x0E, 0xC9, 0x00, 0x6F, 0xB1, 0xA3, 0x7E, 0x10, 0xA0, 0x6E, 0x18, + 0x05, 0x57, 0x68, 0x3C, 0x7A, 0x60, 0xC2, 0x7B, 0x1E, 0x92, 0xCA, 0xE3, + 0x57, 0x9D, 0x80, 0xE0, 0xCD, 0x93, 0x09, 0xF9, 0xE9, 0x18, 0x29, 0xFC, + 0xD2, 0xD0, 0xAB, 0x25, 0x82, 0x16, 0x19, 0x77, 0xB3, 0x07, 0x4C, 0x38, + 0x05, 0x7F, 0x60, 0x86, 0x64, 0x08, 0x05, 0x55, 0x10, 0x82, 0x08, 0xC0, + 0x04, 0x8A, 0x8E, 0x0B, 0x6F, 0x10, 0x02, 0x1C, 0x28, 0x02, 0x92, 0x56, + 0x06, 0x92, 0x16, 0x85, 0x53, 0xE8, 0x58, 0xC7, 0xC2, 0x84, 0x55, 0x58, + 0x06, 0x69, 0x3A, 0x85, 0x86, 0x53, 0x69, 0xE8, 0xDE, 0x0B, 0xEC, 0xD0, + 0x04, 0x19, 0x50, 0x83, 0x14, 0xC0, 0x83, 0x32, 0x78, 0x3E, 0x3A, 0x03, + 0x81, 0x11, 0x00, 0x81, 0x14, 0x18, 0x03, 0x4A, 0x44, 0x4F, 0x79, 0x2A, + 0x44, 0x44, 0xC6, 0x83, 0x41, 0x10, 0x83, 0x3C, 0x38, 0x04, 0x14, 0x48, + 0x01, 0x3D, 0x60, 0x22, 0x12, 0xF8, 0xBE, 0xEE, 0x6E, 0x00, 0x06, 0x58, + 0x49, 0x38, 0x80, 0x03, 0x43, 0x40, 0x84, 0xF4, 0x83, 0x03, 0x3E, 0x00, + 0xE5, 0x43, 0x98, 0x84, 0x34, 0x60, 0x03, 0x45, 0x20, 0x28, 0x50, 0x26, + 0x03, 0xAA, 0x3E, 0xD0, 0xFC, 0x23, 0x0E, 0xB1, 0x9D, 0x2E, 0x57, 0x2C, + 0x60, 0x5D, 0xDD, 0x84, 0x3F, 0x00, 0xA9, 0x07, 0xF8, 0x81, 0x5F, 0x95, + 0x06, 0x01, 0xCA, 0x81, 0x1E, 0xB8, 0x3A, 0xD3, 0x21, 0xE6, 0x53, 0x5B, + 0x4B, 0x60, 0x24, 0x87, 0x77, 0x90, 0xC0, 0x21, 0xEB, 0x07, 0xBA, 0x5C, + 0x1D, 0xD8, 0xC1, 0x56, 0x72, 0x01, 0xEC, 0x6D, 0x4D, 0x61, 0x08, 0x83, + 0xB0, 0xC2, 0xCE, 0xFE, 0x9D, 0x03, 0x51, 0x10, 0x78, 0xC1, 0x97, 0x76, + 0x71, 0xE1, 0x6D, 0xE6, 0x66, 0x2F, 0x48, 0x02, 0x1C, 0x0E, 0x30, 0xD8, + 0xC9, 0x00, 0x0D, 0x30, 0xBB, 0x6F, 0x39, 0x02, 0x2C, 0x80, 0x67, 0x51, + 0xA8, 0x86, 0x08, 0x6C, 0x89, 0x7B, 0x6C, 0xA5, 0x8C, 0x41, 0xED, 0xD3, + 0x9C, 0xE2, 0x74, 0x6B, 0xF2, 0xD7, 0x44, 0x8A, 0xD5, 0x06, 0x19, 0xA4, + 0x78, 0x92, 0x84, 0x76, 0x92, 0x19, 0x93, 0x4D, 0xD1, 0xC3, 0x1F, 0x7F, + 0x50, 0x85, 0x59, 0x08, 0x05, 0x59, 0xF0, 0x04, 0x1D, 0xD8, 0x81, 0xCC, + 0xBE, 0x0B, 0x78, 0x18, 0x05, 0xC5, 0x62, 0x6E, 0xE2, 0x86, 0x85, 0x55, + 0xE0, 0x1F, 0x51, 0x28, 0x93, 0xAE, 0x98, 0x05, 0x64, 0x58, 0x07, 0x51, + 0x78, 0xEE, 0xE8, 0xAE, 0x73, 0xBB, 0x90, 0x09, 0x66, 0x90, 0x01, 0x44, + 0x11, 0x84, 0x1A, 0x32, 0xD4, 0x30, 0xE8, 0x00, 0x11, 0x28, 0x01, 0x44, + 0x79, 0x01, 0x31, 0x48, 0xDF, 0x53, 0x19, 0x83, 0x47, 0x99, 0x1A, 0x33, + 0x08, 0x81, 0x30, 0x28, 0x04, 0x31, 0x50, 0x01, 0x33, 0x68, 0x83, 0x11, + 0x08, 0xCF, 0xEF, 0x83, 0x81, 0x13, 0x68, 0x80, 0x86, 0x0A, 0x65, 0x41, + 0xE0, 0x94, 0x35, 0xE0, 0x0D, 0x3E, 0x80, 0x83, 0x49, 0x30, 0x84, 0x3B, + 0x70, 0x81, 0xC1, 0xB1, 0x6A, 0x43, 0x88, 0x15, 0x28, 0x62, 0xB4, 0x45, + 0x58, 0x84, 0xEA, 0x12, 0xDB, 0x05, 0x67, 0x9C, 0xAD, 0x64, 0x3A, 0x40, + 0xA8, 0x81, 0x07, 0xA8, 0x81, 0x1A, 0x20, 0x80, 0x51, 0xD8, 0x07, 0x6F, + 0x90, 0x3D, 0xF2, 0x61, 0xD6, 0x0C, 0x67, 0xCB, 0xB5, 0xB4, 0x6B, 0x72, + 0x48, 0x2B, 0x8D, 0x38, 0xD1, 0x67, 0x56, 0xD1, 0x6C, 0xAD, 0x41, 0x14, + 0x47, 0x67, 0xB6, 0x33, 0x30, 0x73, 0x45, 0xEC, 0x2E, 0x90, 0x82, 0x75, + 0xE9, 0xD1, 0x81, 0x60, 0x10, 0x2F, 0xFE, 0xF8, 0x82, 0x05, 0xB3, 0x97, + 0x29, 0x08, 0x52, 0x74, 0x11, 0xC7, 0x16, 0xC7, 0x01, 0x14, 0x65, 0x9D, + 0x0C, 0x78, 0x07, 0x01, 0x92, 0x06, 0x51, 0x70, 0x85, 0x7E, 0xD8, 0x9E, + 0xB6, 0x52, 0xC2, 0x7D, 0xAD, 0x52, 0x13, 0x63, 0x31, 0x28, 0x0E, 0xE8, + 0x28, 0x47, 0x8A, 0xB1, 0xFC, 0xD2, 0x85, 0x55, 0x12, 0xA5, 0x48, 0x8A, + 0x2D, 0xAE, 0x25, 0x77, 0x50, 0xDB, 0x20, 0x68, 0x05, 0xDD, 0xE4, 0x25, + 0x59, 0xD0, 0x81, 0x1B, 0xA0, 0xF3, 0xBA, 0x78, 0x87, 0x51, 0xC8, 0x80, + 0x1C, 0x90, 0x85, 0x59, 0x50, 0x86, 0x65, 0x60, 0x78, 0x57, 0x60, 0x85, + 0x90, 0x65, 0x20, 0x59, 0x78, 0xF8, 0x6D, 0x10, 0x85, 0x94, 0xB5, 0x73, + 0x8D, 0xAF, 0x8B, 0x68, 0x90, 0x01, 0x12, 0x18, 0x81, 0x3A, 0xF0, 0x4E, + 0x31, 0x40, 0x81, 0x15, 0x90, 0x64, 0x15, 0x50, 0x95, 0x22, 0x6A, 0x03, + 0x73, 0x72, 0x81, 0x12, 0xD8, 0x4E, 0xCA, 0xE8, 0xD9, 0x06, 0x70, 0x81, + 0x33, 0x70, 0x01, 0x12, 0x08, 0xDA, 0x31, 0xE8, 0xEE, 0x95, 0x4C, 0x81, + 0x11, 0x70, 0x9B, 0x35, 0x68, 0x9A, 0x43, 0x50, 0x04, 0x3D, 0xF8, 0xF4, + 0xFA, 0x56, 0x84, 0xFB, 0x86, 0x03, 0x18, 0x80, 0x03, 0x36, 0x28, 0x01, + 0xDF, 0x40, 0x03, 0x28, 0x1A, 0x9C, 0x5C, 0x39, 0xBA, 0x4A, 0xC0, 0x28, + 0x57, 0x4F, 0x3A, 0x5E, 0x01, 0x84, 0x3F, 0xF8, 0x28, 0x09, 0xB0, 0x01, + 0x39, 0x40, 0xEB, 0x7D, 0x98, 0x85, 0x0A, 0x20, 0x9D, 0x67, 0xE9, 0x75, + 0xB6, 0x74, 0x40, 0x95, 0x3A, 0x87, 0x0A, 0xEE, 0x1E, 0x79, 0xE0, 0x07, + 0x6C, 0x90, 0x2F, 0x14, 0x45, 0x80, 0xFB, 0xFA, 0xEB, 0xFC, 0x1A, 0x5C, + 0x08, 0xCB, 0x61, 0xBA, 0x7B, 0xC1, 0x76, 0x49, 0xB6, 0xC6, 0xDD, 0x02, + 0x0A, 0xC0, 0x00, 0xBF, 0x44, 0x02, 0x19, 0x4D, 0x24, 0xFE, 0x6B, 0xD7, + 0xE6, 0x29, 0xD0, 0x80, 0xC0, 0x3E, 0x00, 0x02, 0x78, 0x36, 0x1D, 0xAE, + 0x56, 0xD8, 0xE9, 0x96, 0xE0, 0xDB, 0x87, 0x76, 0xD8, 0xD3, 0x5F, 0x50, + 0x8A, 0xB4, 0x12, 0x6D, 0xCA, 0x2F, 0x6D, 0x28, 0xC6, 0x52, 0xCD, 0xDB, + 0xE7, 0x27, 0x9F, 0xF7, 0x82, 0x7E, 0xDD, 0x2B, 0x27, 0xD3, 0x2B, 0xD7, + 0x77, 0x2D, 0x26, 0xC8, 0xFC, 0x41, 0xD3, 0x5A, 0x98, 0x85, 0x20, 0xB8, + 0x01, 0x22, 0xD8, 0x5D, 0xBB, 0xC0, 0x87, 0x51, 0xC0, 0x01, 0x21, 0x90, + 0x05, 0x64, 0x20, 0xE9, 0x92, 0x55, 0x73, 0x4F, 0xF8, 0x84, 0x51, 0x98, + 0x03, 0xCB, 0x0A, 0x9A, 0x50, 0x00, 0xC9, 0x8D, 0xFF, 0xFD, 0x7D, 0xD3, + 0x07, 0x75, 0x50, 0x81, 0x14, 0x50, 0x81, 0xDC, 0x50, 0xE4, 0x16, 0x50, + 0x83, 0x41, 0xE6, 0x49, 0x44, 0x61, 0x21, 0x4D, 0x61, 0xB3, 0x31, 0x70, + 0x81, 0x11, 0xA2, 0x0C, 0x95, 0x2B, 0x22, 0xA3, 0x46, 0x81, 0x17, 0xE8, + 0x6E, 0x44, 0x29, 0x81, 0x06, 0xE8, 0xFE, 0x15, 0x08, 0x65, 0x43, 0xC0, + 0xCF, 0x3D, 0xA8, 0xEF, 0x4F, 0xDF, 0xEF, 0x49, 0x40, 0x03, 0x00, 0x8F, + 0x0C, 0xC1, 0xC9, 0xEA, 0xC0, 0xE9, 0x83, 0x3B, 0x60, 0x75, 0x03, 0x7E, + 0xD0, 0x00, 0x44, 0x8E, 0xE6, 0xB8, 0x7A, 0xB3, 0xB5, 0x81, 0x1A, 0xF8, + 0x01, 0x09, 0xB8, 0x06, 0x4C, 0xC8, 0x00, 0xF2, 0x62, 0x09, 0x80, 0x90, + 0x37, 0x2F, 0xDF, 0xBC, 0x81, 0xF3, 0x04, 0x1A, 0x4C, 0x58, 0x70, 0x21, + 0xC1, 0x7C, 0xF4, 0xC8, 0xD1, 0x7B, 0x97, 0x6F, 0x22, 0x3E, 0x7C, 0xB6, + 0x8E, 0x60, 0xDC, 0x80, 0x11, 0x01, 0x01, 0x00, 0x1E, 0x03, 0x04, 0xF0, + 0xE8, 0xB1, 0x00, 0x00, 0x90, 0x01, 0x04, 0x14, 0x38, 0x40, 0x81, 0x82, + 0x12, 0x24, 0x49, 0x92, 0x4C, 0xD1, 0x32, 0x25, 0xE6, 0x16, 0x2F, 0x52, + 0xFE, 0x28, 0x18, 0x40, 0xB9, 0x21, 0x89, 0x14, 0x29, 0x53, 0xB6, 0xD4, + 0xF4, 0x32, 0x45, 0x8A, 0x92, 0x02, 0x26, 0x51, 0x16, 0x48, 0x4A, 0x80, + 0xC0, 0x83, 0x23, 0x08, 0x30, 0xF6, 0xD8, 0x57, 0x11, 0x5A, 0x29, 0x52, + 0xDE, 0xDE, 0xD1, 0xAB, 0x28, 0xAF, 0x62, 0xBE, 0x8A, 0x15, 0xA5, 0x7A, + 0xDD, 0x67, 0x8F, 0x1F, 0x3F, 0x7B, 0x63, 0xF9, 0x89, 0x35, 0xAB, 0xD6, + 0xDE, 0xBD, 0xB5, 0x6E, 0xCD, 0xB6, 0xBD, 0x57, 0x76, 0x6D, 0xDB, 0x77, + 0xF5, 0xDA, 0xD6, 0xB3, 0x7B, 0x77, 0x6F, 0x3D, 0x7B, 0xDA, 0x9E, 0x30, + 0x63, 0xE6, 0x2F, 0x56, 0xAC, 0x50, 0x3A, 0x74, 0x60, 0xD3, 0xA7, 0x78, + 0x31, 0xE3, 0xC5, 0xFB, 0x5E, 0xDD, 0xC0, 0x04, 0xED, 0xD4, 0x32, 0x58, + 0xB0, 0x66, 0xC5, 0x82, 0x15, 0xEA, 0x13, 0x91, 0x39, 0xAE, 0x66, 0xCD, + 0xCA, 0x76, 0x4A, 0x5A, 0xE3, 0xD2, 0xA6, 0x4F, 0xA3, 0x4E, 0xAD, 0x7A, + 0x35, 0xEB, 0xD6, 0xAE, 0x5F, 0xC3, 0x2E, 0xDD, 0x2F, 0xC6, 0x08, 0x11, + 0x61, 0xDA, 0x8C, 0x51, 0xA3, 0xA6, 0x4C, 0x09, 0x12, 0x31, 0x54, 0xA4, + 0x08, 0x93, 0x62, 0x8C, 0x19, 0x35, 0x78, 0xCC, 0xB8, 0x71, 0x63, 0xE6, + 0xCC, 0x99, 0x31, 0x2E, 0xC4, 0xA0, 0x30, 0x53, 0x27, 0x0C, 0x08, 0x12, + 0x2B, 0x18, 0x88, 0x10, 0x03, 0x83, 0x43, 0x02, 0x05, 0x20, 0xC8, 0x18, + 0x32, 0x24, 0x48, 0xBC, 0x21, 0x38, 0x86, 0xF8, 0xA0, 0x57, 0x64, 0x88, + 0x0C, 0x9F, 0x37, 0x27, 0xDE, 0xC0, 0x8F, 0x7F, 0xE7, 0x0E, 0x1B, 0x3E, + 0x8D, 0x18, 0x35, 0x6A, 0xD4, 0xA9, 0xD3, 0xA6, 0x46, 0x8E, 0x9A, 0x6D, + 0xC2, 0x09, 0x20, 0x72, 0x00, 0xC2, 0x89, 0x04, 0x36, 0xFC, 0xF0, 0x83, + 0x09, 0x45, 0x54, 0x10, 0xC1, 0x2B, 0x04, 0xC9, 0x93, 0x4F, 0x84, 0x07, + 0x21, 0x54, 0x10, 0xFE, 0x41, 0x05, 0x55, 0x68, 0xE1, 0x42, 0xF3, 0x90, + 0x03, 0xD1, 0x44, 0xF9, 0xEC, 0xA3, 0x8F, 0x2E, 0x18, 0x1D, 0xB1, 0x41, + 0x0F, 0x4E, 0x2D, 0x45, 0x52, 0x48, 0x25, 0x89, 0x24, 0x40, 0x48, 0x02, + 0xC0, 0x98, 0x12, 0x05, 0x1B, 0x6C, 0xE0, 0x12, 0x4C, 0x5A, 0x48, 0x91, + 0x04, 0x12, 0x3E, 0xE9, 0x48, 0x01, 0x02, 0x06, 0x50, 0x90, 0xC4, 0x16, + 0x5D, 0x00, 0x15, 0xD3, 0x14, 0x49, 0x28, 0x71, 0x80, 0x49, 0x29, 0x11, + 0x80, 0x40, 0x01, 0x4B, 0x11, 0xE0, 0x54, 0x53, 0x47, 0xE8, 0xA2, 0x0F, + 0x3E, 0xFC, 0xB8, 0x22, 0x0A, 0x2D, 0xE4, 0xBC, 0x23, 0xCF, 0x56, 0x5E, + 0x81, 0x79, 0xA5, 0x3D, 0x62, 0xED, 0xB3, 0x4F, 0x59, 0x68, 0x95, 0x95, + 0xD6, 0x98, 0x6B, 0xBE, 0x75, 0xCF, 0x5D, 0x6C, 0xA9, 0x15, 0x97, 0x3D, + 0x7D, 0xB5, 0x05, 0x67, 0x3D, 0x77, 0xBE, 0x73, 0x0F, 0x3C, 0xF7, 0xE8, + 0x65, 0xD7, 0x3D, 0x98, 0xA8, 0x02, 0x1A, 0x61, 0xB1, 0xE4, 0x70, 0x03, + 0x29, 0xAD, 0xED, 0x83, 0xCD, 0x0E, 0x44, 0x40, 0x03, 0x4B, 0x65, 0xC8, + 0xC8, 0x62, 0x99, 0x28, 0x98, 0x74, 0xD6, 0x0A, 0x68, 0xD9, 0xAC, 0xF2, + 0x8B, 0x3E, 0x21, 0xC6, 0xD6, 0xA9, 0xA7, 0x9F, 0x82, 0x1A, 0x6A, 0xA8, + 0xFB, 0xFC, 0xE0, 0x41, 0x74, 0x75, 0x14, 0x67, 0xC6, 0x25, 0x28, 0x8C, + 0x30, 0x42, 0x0A, 0xAF, 0xAE, 0xD0, 0x82, 0x0A, 0x61, 0x88, 0xF1, 0xC2, + 0x0B, 0x67, 0xA8, 0xE1, 0x86, 0x20, 0x6E, 0x9C, 0x81, 0xC7, 0x18, 0x21, + 0xA8, 0x70, 0x46, 0x0A, 0x25, 0x94, 0xB1, 0x02, 0x09, 0x2D, 0x84, 0x81, + 0x82, 0x03, 0x0D, 0x38, 0xC0, 0xC2, 0x1B, 0xE6, 0xE9, 0xC1, 0xC7, 0x21, + 0x7A, 0x84, 0x67, 0x9E, 0x21, 0x89, 0xBC, 0xE1, 0x2C, 0x1B, 0xF5, 0xD5, + 0x70, 0xC7, 0x1B, 0x7D, 0xBC, 0xE1, 0xFE, 0x2D, 0x1B, 0x8B, 0xE0, 0xF7, + 0x48, 0x25, 0x9D, 0x38, 0xE2, 0xC8, 0x26, 0x01, 0x16, 0x48, 0x20, 0x27, + 0x36, 0x20, 0x28, 0x47, 0x0D, 0x11, 0x64, 0xB0, 0x03, 0x39, 0x12, 0x6E, + 0x78, 0xE1, 0x44, 0x18, 0x32, 0xD4, 0x2F, 0x43, 0xF1, 0x80, 0x03, 0x8F, + 0x3C, 0xFA, 0x7C, 0x98, 0xCF, 0x3F, 0x1B, 0xFC, 0x73, 0xB0, 0x53, 0x4E, + 0x8A, 0xB4, 0xA2, 0x49, 0x22, 0x01, 0x10, 0xA3, 0x4A, 0x2C, 0x29, 0xF1, + 0xD2, 0x4C, 0x5A, 0x68, 0x91, 0xC4, 0x06, 0x15, 0xBF, 0x84, 0x84, 0x12, + 0x4A, 0x4C, 0xD1, 0x85, 0xC8, 0x5B, 0xCC, 0x74, 0xA4, 0x12, 0x18, 0x38, + 0x6C, 0xC0, 0x01, 0x24, 0x01, 0xF0, 0x24, 0x94, 0x08, 0x20, 0xD0, 0x83, + 0x3C, 0x21, 0x4A, 0x83, 0x09, 0x29, 0xDC, 0xF4, 0xD3, 0x15, 0x88, 0x61, + 0x86, 0xC9, 0x0F, 0x3E, 0x66, 0xA1, 0xA5, 0xA6, 0x58, 0x73, 0xB1, 0xA5, + 0x66, 0x9D, 0x77, 0xC6, 0x79, 0x8F, 0xD2, 0x4A, 0xF7, 0xD5, 0xD7, 0x9C, + 0x78, 0xDA, 0xA3, 0xD7, 0x5E, 0x7A, 0xED, 0x03, 0x0B, 0x26, 0x97, 0x4D, + 0x53, 0x4B, 0x2C, 0x44, 0xDC, 0x00, 0x04, 0xA7, 0xAC, 0x49, 0x93, 0x03, + 0xA3, 0xB2, 0x44, 0xB3, 0x0C, 0x2D, 0x95, 0x85, 0x02, 0x8B, 0x27, 0x9E, + 0x10, 0x71, 0xCA, 0x2C, 0xD0, 0x68, 0xD3, 0x0A, 0x69, 0xA2, 0xD2, 0x5D, + 0xB7, 0xDD, 0x77, 0xBF, 0x06, 0xA2, 0x3E, 0xA9, 0x34, 0x2B, 0x46, 0x71, + 0x6A, 0x8C, 0x21, 0x46, 0x0B, 0x22, 0x9C, 0x40, 0xC2, 0xAB, 0x61, 0xD4, + 0xD1, 0x46, 0x0A, 0x2F, 0xAC, 0x70, 0xC2, 0x0B, 0x62, 0x08, 0x6E, 0x46, + 0x1B, 0x79, 0xE8, 0xE1, 0x06, 0xAD, 0x2B, 0x74, 0x10, 0x42, 0x0B, 0x29, + 0x40, 0x57, 0x82, 0x02, 0x0C, 0x70, 0xC0, 0x81, 0x1D, 0x89, 0x88, 0xB7, + 0x87, 0x21, 0x7B, 0x14, 0x72, 0xFA, 0xB5, 0xEA, 0xB9, 0xFE, 0xB0, 0x86, + 0x22, 0x30, 0xAC, 0x11, 0xC6, 0x1A, 0x6C, 0x18, 0x72, 0x47, 0x1C, 0xF0, + 0xF9, 0x71, 0xC7, 0x22, 0x8D, 0x54, 0xF2, 0x48, 0x23, 0x9B, 0xA0, 0x2B, + 0xA0, 0x80, 0x7F, 0x00, 0x52, 0x83, 0x0D, 0x35, 0xC8, 0xF1, 0x83, 0x02, + 0x47, 0x18, 0x71, 0x4E, 0x45, 0xF4, 0xEC, 0x6B, 0x10, 0x3D, 0xFB, 0x5C, + 0x98, 0x6F, 0x43, 0x03, 0x5D, 0x48, 0x0E, 0x38, 0xD0, 0x4F, 0x14, 0xE2, + 0x2F, 0x1B, 0xEC, 0x60, 0x22, 0x46, 0x4D, 0x76, 0x04, 0x31, 0x48, 0x2C, + 0x96, 0xF4, 0xA2, 0xCA, 0x08, 0xD0, 0xD8, 0x52, 0x4F, 0x5E, 0x90, 0x2C, + 0xC5, 0x06, 0x2B, 0x51, 0x3C, 0x93, 0xC8, 0x5E, 0xC8, 0x94, 0xC4, 0x13, + 0x48, 0xA2, 0x7C, 0xBE, 0x48, 0x04, 0x90, 0xE4, 0x49, 0x4F, 0x89, 0xD2, + 0x11, 0xAC, 0xF1, 0x8E, 0x7D, 0xC0, 0x43, 0x14, 0x9E, 0xC0, 0x45, 0x3F, + 0xE0, 0xC1, 0x33, 0xAF, 0xF8, 0xCC, 0x1E, 0x60, 0x1A, 0xCB, 0xCF, 0xD4, + 0xC4, 0xA6, 0xB7, 0xA8, 0x05, 0x69, 0x1A, 0x9C, 0x13, 0x07, 0x95, 0x66, + 0xA7, 0xA6, 0x99, 0x05, 0x4F, 0x77, 0x72, 0x53, 0x3D, 0xD4, 0x01, 0x28, + 0xB7, 0x21, 0x43, 0x15, 0xA8, 0xD8, 0x01, 0x0E, 0xBE, 0xF1, 0x9A, 0x5F, + 0xEC, 0x60, 0x0E, 0xD0, 0x78, 0x1B, 0x34, 0x6A, 0xB8, 0x0A, 0x51, 0xAC, + 0x02, 0x13, 0x6B, 0x6B, 0x45, 0x0D, 0xE3, 0x56, 0x0D, 0xBC, 0x01, 0x31, + 0x88, 0x42, 0xBC, 0x5B, 0x2C, 0x1C, 0x30, 0x82, 0x34, 0xB4, 0xC0, 0x0E, + 0x7A, 0x30, 0xC3, 0xAB, 0x5C, 0x55, 0x1D, 0x12, 0xBC, 0xA0, 0x0C, 0x75, + 0xC0, 0x83, 0x72, 0x6A, 0x15, 0xB8, 0x30, 0xD0, 0xAA, 0x05, 0x62, 0xC0, + 0x15, 0x21, 0xDA, 0x80, 0x07, 0x31, 0xF4, 0xA6, 0x05, 0x23, 0x40, 0x41, + 0x03, 0x16, 0x80, 0x9D, 0x31, 0x50, 0x02, 0x11, 0x7C, 0x30, 0x44, 0x21, + 0xFE, 0xF2, 0xC0, 0x46, 0x3E, 0xE4, 0x41, 0x11, 0x8A, 0xC8, 0x43, 0x1E, + 0x60, 0x30, 0xC7, 0x12, 0xD8, 0xE1, 0x0D, 0x30, 0x58, 0x63, 0x1C, 0xF2, + 0xA8, 0x3B, 0x48, 0x3C, 0xC2, 0x77, 0x8F, 0xE0, 0x0F, 0x27, 0x36, 0x51, + 0x20, 0x4E, 0xC8, 0x41, 0x5E, 0xC7, 0x4B, 0x9E, 0x04, 0x24, 0x60, 0x04, + 0x78, 0x48, 0x68, 0x22, 0x11, 0xDA, 0x07, 0xF7, 0x16, 0x12, 0x21, 0x7C, + 0xF5, 0x0B, 0x7A, 0xF3, 0xA0, 0x07, 0x36, 0xC8, 0x81, 0x3D, 0x49, 0xF6, + 0x20, 0x94, 0x3D, 0xD0, 0xC8, 0x52, 0x20, 0x66, 0xCA, 0x87, 0xAD, 0x28, + 0x25, 0x08, 0xA0, 0x9F, 0xFB, 0xA4, 0x80, 0x31, 0x99, 0x10, 0x85, 0x62, + 0x15, 0x3B, 0xD2, 0x4B, 0x5E, 0x92, 0xA3, 0x24, 0x50, 0xC0, 0x45, 0xE7, + 0x7B, 0xD1, 0x93, 0x04, 0xB8, 0x14, 0x8E, 0xFC, 0x63, 0x1F, 0x07, 0x94, + 0x86, 0x28, 0x44, 0xE1, 0x0D, 0x6E, 0xBC, 0x03, 0x1F, 0x5F, 0xAA, 0xE0, + 0x95, 0x9A, 0xA9, 0x16, 0xB1, 0xFC, 0x0C, 0x83, 0x17, 0x84, 0x4B, 0x08, + 0xDD, 0x41, 0xCD, 0xA6, 0x35, 0xCD, 0x4D, 0xF6, 0xB0, 0x66, 0x5E, 0xEE, + 0xE4, 0xCD, 0x6F, 0xBA, 0x63, 0x84, 0xA9, 0x08, 0x45, 0xA0, 0x40, 0x63, + 0xB5, 0x19, 0x8C, 0xE2, 0x6B, 0xAC, 0xC1, 0x06, 0x10, 0xE6, 0xA0, 0x0D, + 0x59, 0x40, 0x43, 0x16, 0x6F, 0x6B, 0xC5, 0x29, 0x6E, 0xB8, 0x19, 0x58, + 0xD4, 0x70, 0x1A, 0xA7, 0xD0, 0x94, 0x3A, 0x87, 0xE8, 0xCF, 0x7F, 0x02, + 0xB4, 0x34, 0xCC, 0xF0, 0xC0, 0x07, 0x5E, 0x30, 0x86, 0x30, 0xE4, 0x41, + 0x0C, 0x29, 0x50, 0x01, 0x08, 0x38, 0x00, 0x82, 0x11, 0x00, 0xE7, 0x05, + 0xBA, 0x09, 0x43, 0xAE, 0x02, 0x67, 0x06, 0x33, 0x8C, 0x01, 0x57, 0x67, + 0xA8, 0xD5, 0xDF, 0xCE, 0xD0, 0x82, 0x15, 0xA4, 0x00, 0xA2, 0x1C, 0x60, + 0x80, 0x02, 0x38, 0xFE, 0x90, 0x02, 0x45, 0x14, 0x22, 0x11, 0xE3, 0xD9, + 0x83, 0x20, 0x12, 0x91, 0x07, 0x3E, 0x90, 0x2E, 0x0F, 0x8C, 0x28, 0x03, + 0x19, 0xF2, 0x10, 0x03, 0xF6, 0xAC, 0x61, 0x8D, 0x7C, 0x58, 0xC3, 0x1B, + 0xE2, 0xA0, 0x88, 0x4A, 0xE4, 0xA7, 0x11, 0x83, 0xDC, 0x84, 0x23, 0x84, + 0x87, 0x48, 0x45, 0xC6, 0xE1, 0x07, 0x72, 0x30, 0x41, 0x03, 0x24, 0x30, + 0x8A, 0x48, 0xD2, 0xE3, 0x20, 0xD8, 0xFB, 0xE4, 0x44, 0xA6, 0x47, 0x8F, + 0xA8, 0x46, 0x6F, 0x20, 0xD8, 0xC0, 0x06, 0x3E, 0xF4, 0x16, 0xA2, 0x8B, + 0x64, 0x20, 0xAC, 0x47, 0x28, 0x65, 0xCB, 0x4C, 0xD9, 0xB0, 0x15, 0x8D, + 0x04, 0x66, 0xF4, 0xDB, 0x18, 0x4F, 0x7A, 0xC2, 0x93, 0x5A, 0x96, 0xAC, + 0x64, 0x48, 0xF2, 0xC9, 0x91, 0x36, 0x10, 0x80, 0x01, 0x0C, 0x20, 0x62, + 0x03, 0x38, 0xC9, 0x00, 0x3A, 0xF2, 0x32, 0x02, 0xB6, 0xA3, 0x4C, 0xDE, + 0x70, 0xC5, 0x28, 0xB6, 0xD4, 0x8F, 0x65, 0xFA, 0xAC, 0x99, 0x3F, 0x5B, + 0x6C, 0x34, 0xDF, 0x62, 0x41, 0x0F, 0xC2, 0x29, 0x83, 0x74, 0x41, 0x1A, + 0x07, 0xBB, 0x79, 0x8F, 0x70, 0x6A, 0x50, 0x84, 0xDF, 0xB4, 0x87, 0x3F, + 0x9E, 0x10, 0xA9, 0x69, 0xCC, 0xC2, 0x1F, 0x9F, 0xF0, 0xC1, 0x0E, 0xBC, + 0x01, 0x1B, 0x6F, 0xEC, 0xC0, 0x13, 0xDA, 0x80, 0x45, 0x34, 0x1A, 0x35, + 0x0B, 0xCB, 0x68, 0x26, 0x14, 0xA3, 0x68, 0x05, 0x3E, 0xB7, 0xA1, 0x8A, + 0xB9, 0x05, 0x34, 0xB7, 0xBA, 0xF5, 0x67, 0x2C, 0x16, 0xE0, 0x81, 0x16, + 0x8C, 0xA1, 0x0C, 0xB8, 0x1A, 0x83, 0x18, 0x39, 0x30, 0x82, 0x87, 0xB6, + 0x4A, 0x8B, 0x2B, 0x10, 0x43, 0x1B, 0x76, 0x83, 0x1B, 0x35, 0x20, 0x6B, + 0xA3, 0x6A, 0x10, 0x43, 0xAC, 0x46, 0x80, 0xAC, 0x15, 0x94, 0xA1, 0x05, + 0xA1, 0x5B, 0xC0, 0x02, 0x46, 0x80, 0xFE, 0x87, 0x6B, 0x89, 0x07, 0xA5, + 0x86, 0xB0, 0x83, 0x1D, 0x0E, 0xB1, 0x46, 0xF3, 0xAA, 0x80, 0x0C, 0x6F, + 0x40, 0x81, 0x1D, 0xD8, 0xC0, 0x1E, 0x45, 0xB0, 0x21, 0x0E, 0x7C, 0x50, + 0xC4, 0x7D, 0xFA, 0x30, 0xD4, 0x00, 0xA5, 0x8B, 0x13, 0x9C, 0xF8, 0xC3, + 0x1F, 0x7E, 0x70, 0x04, 0x39, 0xC4, 0x81, 0x91, 0x36, 0xB8, 0x01, 0x36, + 0xF0, 0x75, 0x21, 0x81, 0xC8, 0x83, 0x7B, 0x58, 0xB5, 0x10, 0x41, 0xA2, + 0x5A, 0x10, 0x78, 0xFC, 0x82, 0x1F, 0x05, 0xD3, 0x07, 0x39, 0x70, 0x20, + 0xD6, 0x0C, 0x3C, 0x80, 0xAC, 0x66, 0xFD, 0x08, 0x5A, 0x43, 0x52, 0x00, + 0x98, 0xAD, 0x72, 0x46, 0x2D, 0x79, 0x6B, 0x2D, 0x3F, 0x36, 0xCB, 0x9F, + 0x74, 0x41, 0x28, 0x33, 0x49, 0xC2, 0x05, 0x8E, 0xA2, 0x32, 0x92, 0xC0, + 0xE8, 0x97, 0x03, 0x1C, 0x6B, 0x28, 0xCA, 0xB4, 0x8F, 0x5F, 0x8C, 0x42, + 0x15, 0xD6, 0xE8, 0x47, 0x97, 0xCA, 0x52, 0x11, 0xB2, 0x44, 0x73, 0xB1, + 0x6A, 0x89, 0xA6, 0x05, 0xDB, 0x04, 0x97, 0xB8, 0xE0, 0x05, 0x84, 0x95, + 0xE5, 0x0B, 0x09, 0x9F, 0x86, 0xCD, 0x6F, 0xDE, 0x05, 0x50, 0xC9, 0x18, + 0x8C, 0x32, 0x5A, 0x11, 0x84, 0x1B, 0x94, 0x62, 0x53, 0xAF, 0xF1, 0x46, + 0x11, 0xDC, 0x09, 0x4F, 0x73, 0x9E, 0x42, 0x16, 0xA7, 0x18, 0x85, 0x27, + 0x70, 0x58, 0x43, 0xDB, 0xFE, 0x70, 0xB7, 0x6A, 0x5E, 0x73, 0xDD, 0x52, + 0x61, 0xC6, 0x58, 0xE9, 0x66, 0x39, 0xB2, 0x62, 0xC0, 0x09, 0xAA, 0xC3, + 0x2A, 0x88, 0x2E, 0x74, 0x73, 0x24, 0xA8, 0xD5, 0x16, 0xCD, 0x10, 0x86, + 0x33, 0x84, 0xC1, 0x56, 0x21, 0x4D, 0x56, 0x09, 0xC8, 0xB0, 0x82, 0xD0, + 0x31, 0x00, 0x74, 0x6B, 0x30, 0xDD, 0x78, 0x12, 0xE1, 0xD2, 0x3C, 0xD4, + 0xE1, 0xA5, 0x2E, 0xE5, 0x03, 0x19, 0x62, 0xA0, 0x88, 0xFE, 0x31, 0xC0, + 0x00, 0x06, 0xEC, 0x81, 0xCF, 0x1D, 0xFA, 0xA0, 0x88, 0x3E, 0xF8, 0xC1, + 0x0F, 0xE6, 0xDA, 0xC4, 0x23, 0x8A, 0xCA, 0x2E, 0xFE, 0xC6, 0xE1, 0x08, + 0xC8, 0x53, 0xEA, 0xF1, 0x74, 0x90, 0xCE, 0x08, 0x71, 0x4F, 0x5F, 0x05, + 0xD3, 0xD0, 0x26, 0xA5, 0x9A, 0xA8, 0x02, 0x83, 0x08, 0x2C, 0x17, 0x21, + 0x51, 0x86, 0x09, 0x90, 0x57, 0xF4, 0x99, 0xEF, 0x23, 0x02, 0x48, 0x5F, + 0x01, 0x80, 0xE4, 0xA3, 0x95, 0x68, 0x80, 0x63, 0x39, 0x72, 0xEB, 0x4B, + 0x2A, 0xA6, 0x05, 0xA0, 0xC0, 0x12, 0x97, 0x26, 0x39, 0x89, 0x01, 0x0A, + 0xE0, 0xA2, 0x61, 0x93, 0xAF, 0x49, 0x0F, 0x78, 0x40, 0x06, 0xEE, 0x51, + 0x26, 0x75, 0xC0, 0x62, 0x14, 0xD5, 0xC8, 0x46, 0x32, 0x25, 0x08, 0x41, + 0x1F, 0x5F, 0x89, 0x2C, 0x66, 0x69, 0x6C, 0x63, 0xA5, 0x59, 0x97, 0x6D, + 0xE6, 0xE9, 0xC9, 0x4E, 0x76, 0xF2, 0x65, 0xA1, 0x7C, 0x27, 0xCC, 0xE6, + 0x65, 0x4F, 0xB5, 0xC0, 0xC4, 0x2C, 0xB4, 0xF1, 0x5A, 0xAB, 0xD1, 0x40, + 0x08, 0xF8, 0x88, 0xCD, 0x3B, 0x82, 0x40, 0x84, 0x77, 0xB6, 0xB6, 0x51, + 0xAB, 0x80, 0x85, 0x28, 0xC6, 0xFC, 0x09, 0x58, 0x24, 0x63, 0x1A, 0xDB, + 0x80, 0xC5, 0x0F, 0xFB, 0x89, 0x37, 0x8B, 0xB3, 0x39, 0xE3, 0xB1, 0x09, + 0x51, 0x2A, 0x3C, 0xD0, 0x00, 0xEB, 0xF6, 0xB9, 0x0E, 0x9B, 0x7B, 0x62, + 0xAB, 0xCC, 0xC0, 0x38, 0x15, 0xB4, 0x20, 0xE5, 0x2B, 0x18, 0x41, 0x18, + 0x5A, 0x85, 0x02, 0x15, 0x28, 0x14, 0xA4, 0x20, 0x00, 0x01, 0x0A, 0x40, + 0x10, 0x82, 0x12, 0x8C, 0x00, 0x74, 0xDC, 0x55, 0x00, 0x0A, 0xF6, 0x30, + 0x88, 0xF3, 0x44, 0x22, 0x11, 0x75, 0xB0, 0x43, 0x1E, 0x5C, 0x17, 0x89, + 0xD3, 0xE5, 0x81, 0x0C, 0x62, 0xB0, 0x03, 0x0C, 0x56, 0x60, 0x87, 0x3B, + 0xFE, 0xA8, 0xD7, 0x5B, 0xE4, 0x52, 0xC4, 0x22, 0x02, 0xF9, 0x88, 0x4D, + 0x10, 0x8F, 0xA8, 0x80, 0x70, 0x84, 0x1C, 0xFE, 0x60, 0xBC, 0xA4, 0xCA, + 0xC1, 0x06, 0x26, 0xB0, 0x41, 0x0F, 0x24, 0x22, 0xC9, 0xAB, 0x82, 0xE8, + 0x20, 0xD0, 0xA3, 0x24, 0x84, 0x40, 0xF4, 0xA1, 0x73, 0xFC, 0x62, 0x66, + 0x1F, 0xDA, 0xC7, 0x35, 0x7A, 0x90, 0x03, 0x8C, 0x3C, 0xA0, 0x00, 0x78, + 0x05, 0x40, 0x5E, 0xFD, 0x77, 0x4A, 0x8F, 0xC0, 0x28, 0x62, 0x1F, 0x0E, + 0xF1, 0x8C, 0x6A, 0xD4, 0xD6, 0x67, 0xD7, 0x04, 0x28, 0xF0, 0x83, 0x25, + 0x12, 0x2E, 0xA0, 0xA4, 0x69, 0xB7, 0x8C, 0x00, 0x21, 0xE9, 0x6B, 0x93, + 0xC6, 0xCA, 0x14, 0x02, 0xC8, 0xC2, 0xC6, 0xBA, 0x68, 0xC5, 0x2B, 0xFA, + 0xE1, 0x0D, 0xB2, 0xF8, 0xCC, 0xC7, 0x12, 0x7C, 0x0B, 0xD1, 0x8C, 0xCC, + 0x96, 0xA5, 0xC9, 0xE9, 0x1D, 0xEE, 0xF0, 0xA0, 0x36, 0xB7, 0x89, 0xCD, + 0x39, 0x5D, 0x56, 0x6A, 0xDE, 0xC4, 0xF7, 0x08, 0xD5, 0x51, 0x84, 0x59, + 0x30, 0x03, 0x16, 0xFE, 0x60, 0x06, 0x26, 0x6E, 0x70, 0x83, 0x34, 0xAF, + 0xA6, 0x4C, 0x8B, 0xC9, 0xC7, 0x10, 0x0E, 0x0E, 0xCF, 0x1A, 0x42, 0x23, + 0x33, 0x9F, 0x58, 0x45, 0x28, 0x3C, 0x31, 0x0B, 0x65, 0x54, 0x63, 0x1D, + 0xB1, 0x00, 0xBE, 0x10, 0xF7, 0xD1, 0x0F, 0x8D, 0x63, 0xDF, 0x53, 0xF9, + 0xD0, 0x07, 0x1D, 0x3C, 0xC0, 0x80, 0x0E, 0xB8, 0xE0, 0xCF, 0x75, 0x18, + 0xC3, 0x42, 0x4F, 0xD0, 0x81, 0x11, 0xAC, 0x60, 0x05, 0xB4, 0xC2, 0x15, + 0x75, 0x97, 0xDB, 0x02, 0xC0, 0xBD, 0x00, 0x05, 0xC2, 0x41, 0x81, 0x18, + 0x84, 0xD3, 0xAA, 0x9B, 0xAB, 0xA0, 0x03, 0xA0, 0x63, 0x80, 0x19, 0x19, + 0xB0, 0x86, 0x43, 0xA0, 0x0E, 0x25, 0x28, 0x82, 0x4B, 0x4D, 0x8E, 0xA3, + 0x29, 0xC2, 0x20, 0xFE, 0xEC, 0x81, 0x1D, 0xA4, 0xC0, 0x1A, 0xAC, 0x41, + 0x09, 0x84, 0x07, 0x1B, 0xE4, 0x94, 0xEB, 0x28, 0xC2, 0x1D, 0xF8, 0xC1, + 0xEE, 0x10, 0x95, 0x23, 0xFC, 0x81, 0x7E, 0x11, 0x4F, 0x7F, 0xD5, 0xC0, + 0x11, 0x24, 0x48, 0xF2, 0x24, 0x88, 0x0E, 0x58, 0x83, 0x84, 0x44, 0xC8, + 0xCC, 0xD0, 0xC3, 0x84, 0x60, 0x0F, 0xF5, 0x50, 0xCF, 0x87, 0x14, 0x04, + 0x36, 0xE4, 0xCC, 0xDC, 0xE9, 0xC3, 0x3F, 0x84, 0x95, 0x46, 0xF4, 0x1A, + 0x00, 0xF8, 0xDA, 0x47, 0x98, 0x52, 0xE0, 0x01, 0x9E, 0x01, 0xE4, 0x04, + 0x4A, 0x84, 0x58, 0x88, 0x8D, 0x98, 0x4F, 0x0C, 0xC9, 0x17, 0x88, 0x4C, + 0x17, 0xC8, 0x04, 0x12, 0xE0, 0xC4, 0xB4, 0xF9, 0x0F, 0x00, 0xF5, 0xD2, + 0x2F, 0x8D, 0x55, 0x86, 0xE5, 0x80, 0x8D, 0x41, 0x43, 0x2D, 0xB8, 0x82, + 0x35, 0xC0, 0xC3, 0x3B, 0x44, 0x50, 0x04, 0x01, 0xCD, 0x16, 0x8E, 0x85, + 0x34, 0xD1, 0x05, 0x9C, 0x2C, 0x4D, 0x9E, 0xA0, 0x9E, 0xD3, 0x20, 0x8D, + 0x35, 0xB9, 0x5E, 0x19, 0xBA, 0x83, 0xD4, 0xC0, 0x03, 0x94, 0xB1, 0xC3, + 0x3E, 0x84, 0x82, 0x28, 0x4C, 0xC3, 0x34, 0xF8, 0x43, 0xDC, 0x0C, 0x01, + 0x3A, 0x69, 0x1F, 0x11, 0x1C, 0xDC, 0x32, 0x20, 0xDF, 0x2C, 0xC8, 0x82, + 0x98, 0x9D, 0x82, 0x02, 0x41, 0x9C, 0x32, 0x4C, 0x9C, 0xA6, 0x64, 0x5F, + 0x21, 0x1A, 0xA2, 0x63, 0xE8, 0x83, 0x1C, 0xC8, 0xC0, 0x08, 0x74, 0xC0, + 0x0A, 0x9C, 0x81, 0x1D, 0xD4, 0x41, 0x19, 0x98, 0x5C, 0x07, 0x74, 0x80, + 0x71, 0x91, 0x80, 0x75, 0x08, 0x4E, 0x72, 0x14, 0x4B, 0x0A, 0x1C, 0xCB, + 0xB1, 0x84, 0x01, 0x48, 0x15, 0xC2, 0x1E, 0xE0, 0xC1, 0x27, 0x0A, 0x47, + 0xA0, 0x81, 0x8E, 0x08, 0x90, 0xD4, 0x02, 0xB8, 0x00, 0x4B, 0x15, 0xC2, + 0x21, 0x38, 0x9A, 0x21, 0xAC, 0x81, 0xFE, 0x21, 0x88, 0xD7, 0x1E, 0x30, + 0x42, 0x22, 0xB8, 0x40, 0x0C, 0xD8, 0xC1, 0x0B, 0xB8, 0x51, 0x1E, 0x29, + 0x42, 0xB8, 0x30, 0x02, 0x1F, 0x50, 0xA0, 0x7E, 0xA4, 0x4B, 0xD6, 0x6D, + 0xDD, 0x1F, 0x28, 0x92, 0x09, 0x28, 0x55, 0xF2, 0xC8, 0x8B, 0x2D, 0xE8, + 0x03, 0xF4, 0x68, 0xD2, 0x40, 0x4C, 0x8F, 0x54, 0x45, 0x15, 0xF4, 0x78, + 0x89, 0x43, 0xBC, 0xC3, 0x37, 0xC4, 0xDA, 0x3C, 0xE8, 0x43, 0x35, 0x88, + 0xD5, 0xF8, 0x78, 0x44, 0xF9, 0x00, 0x5B, 0x8B, 0xA4, 0x84, 0xB5, 0x15, + 0x9B, 0xB5, 0xC1, 0x08, 0x88, 0x11, 0x5E, 0x2B, 0xA1, 0xD8, 0x90, 0x4C, + 0x01, 0x12, 0x6C, 0xC0, 0x01, 0xE8, 0x92, 0x12, 0xA6, 0xD2, 0x87, 0x55, + 0x1E, 0x89, 0x34, 0x09, 0x34, 0x94, 0xC9, 0x3D, 0xFC, 0x21, 0x2D, 0x6C, + 0xC3, 0x15, 0x02, 0xD9, 0x99, 0x74, 0xA1, 0x9A, 0x94, 0x1E, 0x35, 0xB1, + 0xDE, 0xE9, 0x9D, 0x1E, 0xEA, 0x8D, 0x21, 0x94, 0x3D, 0x0D, 0x09, 0xE1, + 0x89, 0x3B, 0xE0, 0xDB, 0x43, 0xB2, 0x83, 0x3D, 0x24, 0xC3, 0xED, 0x69, + 0x03, 0x33, 0x4C, 0x83, 0x36, 0x60, 0x02, 0x0D, 0x04, 0x41, 0x3D, 0x7C, + 0x8A, 0x10, 0x04, 0x81, 0x36, 0x20, 0x03, 0x32, 0x40, 0x03, 0x32, 0xCC, + 0xD3, 0x1F, 0x8E, 0x02, 0x39, 0x45, 0xDC, 0x3A, 0xB8, 0x02, 0x6E, 0x1D, + 0x62, 0x4B, 0x62, 0xDF, 0x0F, 0xB0, 0x40, 0x0A, 0x34, 0x00, 0x16, 0x39, + 0x62, 0x1B, 0xC4, 0xCE, 0x09, 0x84, 0x4E, 0x02, 0x2C, 0x40, 0x03, 0x84, + 0x0E, 0x09, 0x74, 0x00, 0xAD, 0xF4, 0xC6, 0x08, 0x70, 0x00, 0x0A, 0xA4, + 0x80, 0x0B, 0x94, 0x41, 0x18, 0x14, 0x8E, 0x9F, 0xB5, 0xCE, 0x1A, 0xB4, + 0x40, 0x1B, 0xBC, 0x00, 0x07, 0xA0, 0xA2, 0x03, 0x2C, 0x00, 0x07, 0x0C, + 0x42, 0x24, 0x0C, 0x02, 0x1F, 0x20, 0x42, 0x21, 0x0C, 0xFE, 0x1D, 0x1F, + 0x14, 0x02, 0x57, 0x5E, 0x4B, 0x21, 0xAC, 0xC1, 0x0A, 0xEC, 0x14, 0x0C, + 0xEC, 0x41, 0x1F, 0xAC, 0xC1, 0x2F, 0xF2, 0xC1, 0x22, 0xF0, 0x81, 0x1F, + 0xA4, 0x65, 0x20, 0x35, 0x02, 0x7F, 0x19, 0x12, 0xF1, 0xC8, 0xCB, 0xAA, + 0x29, 0x63, 0x22, 0xFD, 0x43, 0x5F, 0x70, 0xC5, 0x09, 0x66, 0x15, 0x09, + 0x36, 0x58, 0x09, 0x62, 0x03, 0x38, 0x50, 0x55, 0x3E, 0x58, 0xC1, 0x28, + 0x8D, 0x4F, 0x52, 0x24, 0xC5, 0xB0, 0xE5, 0xD5, 0xAF, 0x0D, 0xDB, 0x39, + 0x82, 0x58, 0xB1, 0xAD, 0xCC, 0xB0, 0xB5, 0x0C, 0x3A, 0xAE, 0x92, 0xE1, + 0x09, 0x61, 0xC6, 0x68, 0x80, 0x51, 0x28, 0x61, 0xFA, 0x3C, 0x8C, 0xCB, + 0x3C, 0x05, 0x89, 0x70, 0x44, 0x11, 0x08, 0x1F, 0x8E, 0x85, 0x02, 0x37, + 0x78, 0x03, 0x3C, 0x9C, 0x89, 0xBA, 0xA9, 0x05, 0xD1, 0x0C, 0xE4, 0x3B, + 0x98, 0x05, 0x6B, 0x46, 0xD6, 0x06, 0x81, 0x90, 0x5E, 0x24, 0x99, 0x66, + 0x9D, 0xA1, 0x43, 0xDA, 0x9B, 0x37, 0xC1, 0x03, 0x3B, 0xD4, 0x83, 0x3B, + 0x60, 0x02, 0x2A, 0x84, 0x96, 0x3F, 0xAC, 0x83, 0x95, 0xE5, 0x40, 0x2D, + 0x78, 0x4A, 0x88, 0x34, 0x41, 0x11, 0x68, 0x03, 0xDC, 0xC4, 0xD3, 0x0C, + 0xC9, 0x42, 0x2B, 0x88, 0xC2, 0x1B, 0xAA, 0x82, 0x32, 0x24, 0xC3, 0xC4, + 0x51, 0x9F, 0x4B, 0x5A, 0xA7, 0x6E, 0xE5, 0x83, 0x3D, 0xC4, 0x00, 0x12, + 0x0D, 0x00, 0x76, 0x85, 0xC1, 0x18, 0xC0, 0xC1, 0x72, 0xA0, 0xC0, 0xF9, + 0x51, 0x22, 0x07, 0x90, 0xC0, 0x09, 0x2C, 0x0E, 0x75, 0x38, 0x94, 0xE1, + 0xA0, 0x00, 0x0A, 0xAC, 0x80, 0x0B, 0xB4, 0x80, 0x9F, 0xD9, 0xCA, 0xE3, + 0xA4, 0x01, 0x09, 0xAC, 0x01, 0x1A, 0x8C, 0x14, 0x07, 0x38, 0x80, 0x02, + 0x2C, 0x80, 0x19, 0x44, 0x42, 0x1B, 0x21, 0x42, 0x1E, 0xD8, 0x81, 0x56, + 0xFE, 0xB6, 0xD1, 0x79, 0x28, 0xC2, 0x4E, 0xD9, 0xC1, 0x1A, 0x90, 0x9F, + 0xEB, 0xBC, 0xC1, 0x21, 0xBC, 0x81, 0x1D, 0x28, 0x02, 0x5B, 0x56, 0x60, + 0xEF, 0x84, 0xDA, 0x1F, 0x18, 0x12, 0x06, 0x26, 0x52, 0x0D, 0x00, 0x02, + 0x20, 0x28, 0x95, 0x26, 0x10, 0x08, 0x95, 0xEC, 0xC3, 0x56, 0xCC, 0x03, + 0xF5, 0x78, 0xC9, 0x56, 0x34, 0x84, 0x84, 0x74, 0x15, 0x41, 0xBC, 0x03, + 0x36, 0x40, 0x0F, 0xC1, 0x84, 0x88, 0x2B, 0x50, 0x40, 0x06, 0x1C, 0x41, + 0x86, 0x8D, 0x84, 0x00, 0xE4, 0xC4, 0x48, 0xB4, 0x0C, 0x39, 0xDA, 0x28, + 0xE1, 0xC1, 0xCC, 0xCA, 0x58, 0x5B, 0x49, 0xA0, 0xC4, 0x01, 0xA8, 0xD5, + 0x4A, 0xB0, 0x55, 0x12, 0x68, 0x00, 0x02, 0xC8, 0x23, 0xCB, 0xFC, 0x68, + 0x48, 0x18, 0x00, 0xCC, 0x10, 0x90, 0x67, 0x1E, 0x81, 0x37, 0x94, 0x49, + 0x3A, 0x14, 0x13, 0x2D, 0x78, 0x83, 0x3A, 0x9C, 0x45, 0xD4, 0x8C, 0xDE, + 0x5C, 0x94, 0x9E, 0xD3, 0x84, 0xD0, 0x9B, 0xE0, 0x05, 0x5B, 0x90, 0xA1, + 0x93, 0x79, 0x13, 0x43, 0x42, 0xD9, 0x43, 0x9E, 0xE1, 0xBD, 0x85, 0x93, + 0x43, 0x46, 0xA4, 0x2B, 0x34, 0x81, 0x3F, 0xC0, 0xA9, 0xBF, 0x09, 0x01, + 0x0E, 0x08, 0x01, 0xC6, 0xB9, 0xC6, 0x1C, 0x0C, 0x01, 0xC2, 0xCD, 0xD0, + 0x0C, 0xCD, 0x82, 0x02, 0x85, 0xC2, 0x1B, 0x26, 0x03, 0x34, 0xA8, 0x64, + 0x75, 0x5E, 0x67, 0xA1, 0x0E, 0x51, 0x88, 0xA8, 0x03, 0x07, 0x6C, 0x91, + 0x02, 0x90, 0xC0, 0x77, 0x32, 0x87, 0x18, 0xA4, 0x81, 0x0A, 0x30, 0x00, + 0x4F, 0x76, 0x40, 0x09, 0x38, 0x4E, 0x0A, 0xA4, 0xDF, 0xE3, 0x20, 0xE5, + 0xAB, 0xC8, 0xCA, 0x25, 0x56, 0x87, 0x0A, 0x9C, 0x67, 0xA0, 0xC9, 0x5F, + 0x03, 0x8E, 0x11, 0x77, 0x91, 0x80, 0x19, 0x20, 0xC2, 0x20, 0x10, 0x42, + 0x80, 0xE6, 0xC1, 0xFE, 0x21, 0xE4, 0xC1, 0x1E, 0xB8, 0x91, 0x20, 0x1C, + 0xC2, 0x79, 0x14, 0xC2, 0x0B, 0xC0, 0x8E, 0x7A, 0x41, 0x68, 0x7B, 0x2C, + 0xC2, 0x1D, 0xF0, 0x01, 0x23, 0xDC, 0x41, 0xEF, 0x34, 0x42, 0x85, 0x62, + 0xA0, 0x5C, 0x6A, 0xE8, 0x51, 0x25, 0x52, 0xD8, 0x1D, 0xCA, 0x56, 0x9C, + 0x20, 0xF6, 0x6C, 0x45, 0x35, 0xE6, 0x03, 0x3C, 0x54, 0xC3, 0x2F, 0x1C, + 0xD6, 0x2F, 0x54, 0xC3, 0xC0, 0x7C, 0x08, 0x3C, 0x3C, 0xA1, 0x01, 0x9C, + 0x8F, 0xCB, 0xDC, 0x28, 0xDF, 0xE5, 0xE8, 0x39, 0xAE, 0xD5, 0x4A, 0x2C, + 0x8C, 0x39, 0xEA, 0x92, 0x61, 0xF6, 0xE0, 0x01, 0x08, 0x29, 0x66, 0xCA, + 0x23, 0x00, 0x09, 0xC0, 0x52, 0x2C, 0x26, 0xCC, 0x64, 0x84, 0x67, 0x12, + 0x80, 0x27, 0xD8, 0x58, 0x35, 0x8C, 0x82, 0x28, 0x6C, 0x03, 0x37, 0x98, + 0xA6, 0x6B, 0xA2, 0x66, 0x6B, 0x62, 0x90, 0x97, 0x5E, 0x93, 0x41, 0xC2, + 0xE6, 0x9C, 0x48, 0x0D, 0x99, 0xDA, 0x1B, 0xBE, 0xC1, 0x83, 0x43, 0xDA, + 0xA6, 0x3B, 0xC0, 0x83, 0x3D, 0xA4, 0x83, 0x10, 0xA8, 0x02, 0x32, 0xCC, + 0xA1, 0x68, 0x0D, 0xC1, 0x0E, 0xB0, 0xE4, 0x6A, 0x54, 0x04, 0x63, 0xE4, + 0x03, 0x11, 0xE4, 0xE9, 0x32, 0x44, 0x83, 0xBF, 0x41, 0xC3, 0x32, 0xF4, + 0x69, 0xF3, 0x91, 0xD3, 0x2C, 0x48, 0x9C, 0x2A, 0x24, 0x86, 0x9D, 0x1A, + 0xEA, 0xCA, 0xD6, 0x0D, 0x2C, 0x2C, 0x80, 0x18, 0xA8, 0x01, 0x23, 0x86, + 0xC1, 0xFB, 0xB5, 0x40, 0xE1, 0xBC, 0x40, 0x2A, 0x72, 0x80, 0x0A, 0xA8, + 0x00, 0x7A, 0xBA, 0x80, 0x0A, 0x2C, 0xD7, 0x18, 0xD8, 0x0A, 0x19, 0xB4, + 0x41, 0x19, 0xE0, 0x01, 0x19, 0xC0, 0xA7, 0x4F, 0x8E, 0x54, 0x07, 0x90, + 0x40, 0x19, 0xA0, 0xC1, 0xE0, 0x90, 0x80, 0x08, 0x24, 0x40, 0x0A, 0x98, + 0xC1, 0x20, 0xE4, 0x41, 0x28, 0xA6, 0xFE, 0xCE, 0x4B, 0x09, 0xA8, 0x2C, + 0xDA, 0x01, 0x4B, 0x29, 0x42, 0x03, 0xD6, 0x87, 0x1D, 0x80, 0x07, 0x23, + 0xBC, 0x81, 0x7A, 0xCC, 0xD7, 0x1D, 0x30, 0x42, 0x84, 0xE6, 0x8E, 0x7F, + 0x00, 0x02, 0xB1, 0x02, 0x82, 0x87, 0x26, 0x92, 0x87, 0xDA, 0xC0, 0x53, + 0x99, 0x68, 0x89, 0x5E, 0x92, 0x40, 0x74, 0x95, 0xF6, 0xFC, 0x82, 0x27, + 0xC0, 0x5D, 0xAC, 0x85, 0xC8, 0x28, 0xD8, 0xA0, 0x51, 0xA0, 0x0F, 0x90, + 0x54, 0x1B, 0xE0, 0x91, 0xE3, 0x87, 0x11, 0x29, 0x8D, 0xD0, 0xC8, 0x11, + 0xF8, 0x08, 0x02, 0x1C, 0x40, 0xB5, 0x05, 0xDE, 0x49, 0x9C, 0x44, 0x3C, + 0xCA, 0xE3, 0xF9, 0x0C, 0xC0, 0xB0, 0x19, 0x26, 0x8C, 0x34, 0x69, 0xBC, + 0x6A, 0xC4, 0x11, 0x74, 0x5B, 0x99, 0xD8, 0x83, 0x02, 0x49, 0x83, 0x3A, + 0x5C, 0x61, 0x96, 0xA6, 0xE6, 0xBF, 0xBA, 0x66, 0x08, 0x71, 0x10, 0x6B, + 0x26, 0x99, 0xC1, 0x76, 0xD3, 0x6D, 0x82, 0xD3, 0x6E, 0xA6, 0xE1, 0x6E, + 0xCE, 0xDE, 0xBD, 0x45, 0x24, 0x26, 0x84, 0x42, 0x1C, 0x5E, 0x46, 0x2B, + 0xCC, 0xE9, 0x28, 0x8C, 0x0A, 0x26, 0x9C, 0x42, 0x72, 0xD6, 0x90, 0x1E, + 0x2A, 0x03, 0x34, 0xB4, 0xC2, 0x27, 0x9C, 0xC2, 0xC3, 0xA5, 0x24, 0x2C, + 0x98, 0x16, 0xCB, 0x32, 0x6F, 0x10, 0xD1, 0xC1, 0x07, 0x90, 0xC1, 0xCC, + 0xBE, 0x6C, 0x0B, 0xA0, 0x01, 0x74, 0x9C, 0x27, 0x25, 0x36, 0x00, 0x7A, + 0xBE, 0xCA, 0x0B, 0x70, 0x8E, 0xCF, 0xBE, 0x80, 0x1B, 0x44, 0x11, 0xCC, + 0x9A, 0x81, 0xFC, 0xB5, 0x01, 0x09, 0xA8, 0x40, 0xFC, 0x85, 0x40, 0x07, + 0xA0, 0x40, 0x19, 0x8C, 0x01, 0x07, 0xA8, 0x6F, 0x02, 0xD8, 0x86, 0x1E, + 0x40, 0x9A, 0x1D, 0x64, 0xA5, 0x1B, 0xE1, 0xC1, 0x1E, 0xC8, 0xD1, 0x78, + 0xBC, 0x2A, 0x53, 0x8E, 0x81, 0x79, 0x85, 0x81, 0x1C, 0xFE, 0xB1, 0x81, + 0x22, 0x88, 0xED, 0x04, 0xF6, 0x22, 0x1F, 0xF4, 0xC1, 0x1F, 0xF8, 0x41, + 0x7E, 0xF0, 0xD7, 0x0F, 0xD8, 0x00, 0x81, 0x24, 0x52, 0xDB, 0x72, 0xC2, + 0x0F, 0x08, 0x81, 0x33, 0x6E, 0x05, 0xF5, 0x28, 0x13, 0x8A, 0xBE, 0xC2, + 0x37, 0x48, 0x88, 0x3E, 0x90, 0x42, 0x29, 0x80, 0xC3, 0x44, 0x10, 0x8C, + 0x3E, 0xF4, 0x03, 0x04, 0x28, 0x40, 0x47, 0xAC, 0x48, 0x5F, 0xF9, 0x08, + 0x13, 0xC6, 0x08, 0x0F, 0x02, 0xA1, 0x3B, 0xBA, 0x23, 0x8D, 0xAC, 0x04, + 0xCC, 0x54, 0xDB, 0x8F, 0x80, 0xD8, 0x4A, 0x68, 0xEB, 0xE4, 0x66, 0x26, + 0x48, 0xD8, 0xA8, 0x00, 0x75, 0x26, 0x89, 0x60, 0x84, 0x2B, 0x48, 0xC5, + 0x3E, 0x54, 0x03, 0x11, 0x90, 0x82, 0xE8, 0xE6, 0x45, 0xD4, 0x0C, 0xA4, + 0xBF, 0x56, 0xD6, 0x9C, 0x98, 0x61, 0x1A, 0x32, 0x0D, 0x19, 0xF6, 0x85, + 0x5E, 0x44, 0x8D, 0xEB, 0xBE, 0xAE, 0xEC, 0x3E, 0xA4, 0x15, 0xBB, 0x43, + 0x44, 0xFA, 0x83, 0x10, 0x98, 0x6C, 0x32, 0xB4, 0x42, 0x2B, 0x78, 0x82, + 0x0E, 0x08, 0x9C, 0xA8, 0x08, 0x01, 0x2A, 0x64, 0x43, 0xC2, 0x05, 0x2A, + 0x34, 0x28, 0x43, 0xB8, 0x9D, 0x02, 0x26, 0x88, 0x82, 0xC4, 0x4E, 0x1C, + 0x37, 0xDC, 0x8D, 0xCA, 0x36, 0xAF, 0xC6, 0xF5, 0x13, 0x4C, 0x9E, 0xC1, + 0xAD, 0x28, 0x40, 0x7C, 0xBE, 0x01, 0x18, 0x75, 0xC0, 0x43, 0xF1, 0x1F, + 0x72, 0x95, 0x00, 0xA6, 0xB6, 0x00, 0x09, 0xB8, 0xC0, 0x70, 0x18, 0x94, + 0x1D, 0x20, 0x8B, 0x79, 0x06, 0xDA, 0xCE, 0x86, 0xC0, 0x21, 0x97, 0xC0, + 0x1A, 0x94, 0x01, 0x09, 0x30, 0x40, 0x09, 0xF0, 0x5F, 0x0A, 0xE8, 0xC1, + 0x20, 0x4C, 0xAD, 0x24, 0x9C, 0xC7, 0x21, 0xD8, 0x01, 0x57, 0xA2, 0x4E, + 0x21, 0x90, 0x57, 0x82, 0x4A, 0x20, 0x19, 0x40, 0xE8, 0xB7, 0xF8, 0xEA, + 0xFE, 0x24, 0xA0, 0x07, 0x30, 0x86, 0x4B, 0x02, 0xFF, 0x01, 0x06, 0xC6, + 0xC1, 0x22, 0x1D, 0x6B, 0x22, 0x19, 0x81, 0x0E, 0x80, 0x43, 0x10, 0x97, + 0xE8, 0x3C, 0x70, 0xC5, 0x3B, 0xE0, 0xC2, 0x25, 0x51, 0x58, 0x0F, 0xDC, + 0xCB, 0x87, 0xE8, 0x83, 0x10, 0x6C, 0xA6, 0xAF, 0x11, 0xC0, 0x4A, 0x7C, + 0x58, 0xE3, 0x26, 0x45, 0x93, 0x4E, 0x26, 0x12, 0x38, 0xB3, 0x8E, 0xBC, + 0xB0, 0xE2, 0x6E, 0x44, 0x88, 0xCD, 0xA0, 0x12, 0x68, 0x80, 0x66, 0xE2, + 0x30, 0xC4, 0xEC, 0xF0, 0x93, 0x3C, 0x80, 0x89, 0x6C, 0x2E, 0x46, 0xE0, + 0x00, 0x3E, 0x94, 0x09, 0x3E, 0xAC, 0x42, 0x13, 0xD0, 0x02, 0x3C, 0xA4, + 0x03, 0x16, 0xCE, 0x85, 0x6B, 0xB2, 0xB3, 0x12, 0x9F, 0xEE, 0x36, 0x75, + 0x90, 0x99, 0x52, 0xF1, 0xC1, 0xAE, 0xA1, 0x37, 0xD9, 0x05, 0x66, 0x29, + 0xEC, 0x9A, 0xD6, 0x03, 0x3B, 0x84, 0x13, 0xC4, 0xC6, 0x61, 0x2D, 0x24, + 0x03, 0x2A, 0x10, 0x41, 0x0E, 0xBC, 0x82, 0x96, 0x7D, 0xCA, 0x3E, 0x78, + 0x42, 0x2C, 0x24, 0x67, 0x34, 0x24, 0x1C, 0x34, 0x24, 0xC3, 0x2C, 0xBC, + 0xE1, 0x28, 0x5C, 0x86, 0x3F, 0x4C, 0x1C, 0x35, 0xD4, 0xF1, 0x45, 0x83, + 0x0A, 0xA7, 0xDC, 0x83, 0x09, 0x8C, 0xC1, 0x1A, 0xA0, 0x40, 0x1B, 0x2C, + 0xC0, 0x47, 0xAF, 0x41, 0x1A, 0xBC, 0x81, 0xE1, 0xBC, 0x40, 0x07, 0x34, + 0xC0, 0xC7, 0x95, 0x40, 0x07, 0xA4, 0xC0, 0x25, 0xC8, 0xCA, 0x42, 0x01, + 0x2D, 0x71, 0xA5, 0xDF, 0x08, 0xBC, 0x40, 0xCA, 0x9D, 0x80, 0xCE, 0x86, + 0x40, 0x0A, 0xB0, 0xEF, 0x18, 0xA8, 0x40, 0x03, 0x30, 0x00, 0x08, 0x0C, + 0x00, 0x0A, 0xA8, 0xC1, 0x21, 0xD4, 0xC1, 0x20, 0xCC, 0xEA, 0x20, 0x0C, + 0x42, 0x1D, 0xD4, 0x01, 0x1C, 0x1D, 0x02, 0x00, 0xC2, 0x2A, 0x7C, 0x7C, + 0xF2, 0x1B, 0x90, 0xFE, 0x41, 0xD7, 0xE6, 0x81, 0x2A, 0x9F, 0xED, 0x1B, + 0xAC, 0x32, 0x05, 0xF6, 0xC1, 0x1D, 0xE4, 0x47, 0x1C, 0xC4, 0x81, 0x09, + 0x38, 0x70, 0x58, 0xCF, 0xC0, 0x2F, 0x44, 0xD2, 0xDC, 0xB6, 0xDD, 0x35, + 0xFC, 0x82, 0x44, 0xD0, 0x83, 0x3E, 0xB8, 0x42, 0x41, 0x17, 0x4C, 0xDE, + 0xE6, 0x40, 0x04, 0xEC, 0x15, 0x48, 0x00, 0x89, 0x5A, 0xA9, 0xCC, 0x5D, + 0x03, 0x49, 0x8D, 0xD8, 0x48, 0xC7, 0x20, 0x6E, 0xE2, 0x22, 0xAE, 0x33, + 0x03, 0x36, 0x05, 0xE4, 0xB0, 0x12, 0xFE, 0xDA, 0x49, 0x44, 0x9E, 0x01, + 0x78, 0xF3, 0x28, 0x9D, 0x08, 0x95, 0xE0, 0xC3, 0x5D, 0x6C, 0x43, 0x13, + 0x8C, 0x82, 0x3A, 0xF4, 0x43, 0x3D, 0x34, 0xAC, 0x5A, 0xB0, 0xE6, 0xE9, + 0xBE, 0xC3, 0xE9, 0x2A, 0x99, 0x5D, 0xC4, 0xDB, 0x9B, 0x2C, 0xB1, 0xEB, + 0x2E, 0xEC, 0xEC, 0xE1, 0xF3, 0x9A, 0xDA, 0x26, 0x16, 0x47, 0xE4, 0xA4, + 0x4C, 0xC3, 0x43, 0x23, 0x03, 0x2C, 0x10, 0x41, 0x10, 0x34, 0xC1, 0x3B, + 0xD0, 0x8D, 0x27, 0x40, 0x43, 0x6B, 0x31, 0x74, 0x0F, 0x25, 0x83, 0x17, + 0x7F, 0x42, 0xC4, 0x9A, 0xEC, 0x36, 0xCC, 0xC2, 0xF5, 0x61, 0xF4, 0x6F, + 0xBB, 0x06, 0xF5, 0x2C, 0x86, 0x36, 0x74, 0x00, 0xE0, 0x84, 0xDF, 0x08, + 0x34, 0x40, 0xF4, 0xC2, 0xE7, 0xF9, 0xAE, 0x00, 0x2A, 0x36, 0x22, 0xA6, + 0x3E, 0x07, 0xA8, 0xBE, 0x80, 0x51, 0x42, 0xC7, 0x09, 0xAC, 0x80, 0xCE, + 0x36, 0x2A, 0x09, 0x98, 0x94, 0xCE, 0xC2, 0x00, 0x1A, 0x7C, 0xE2, 0xCD, + 0x76, 0x57, 0x02, 0x70, 0xC0, 0x18, 0x54, 0x6D, 0x53, 0x47, 0x1A, 0x57, + 0xD2, 0x91, 0xB4, 0xC0, 0x51, 0x1D, 0x94, 0x47, 0xD7, 0xC6, 0x22, 0xD8, + 0xDE, 0xC1, 0x1A, 0x4C, 0x82, 0x1C, 0x61, 0xCB, 0x1D, 0x50, 0x1D, 0x7A, + 0xB0, 0x01, 0x05, 0xFA, 0x41, 0x1C, 0xFE, 0xF4, 0x17, 0xF1, 0x0C, 0x88, + 0x03, 0xDB, 0x40, 0x29, 0x74, 0x45, 0x56, 0x7C, 0xC9, 0x97, 0xE4, 0x03, + 0x38, 0x94, 0x82, 0x37, 0x7C, 0x88, 0x3C, 0x90, 0x02, 0x6C, 0x0B, 0xF3, + 0xA6, 0xC8, 0xC3, 0x35, 0xC0, 0x82, 0x15, 0xEC, 0x40, 0x06, 0x38, 0x09, + 0x05, 0x08, 0x29, 0x88, 0x01, 0x09, 0xC7, 0xC0, 0x44, 0x4F, 0xE4, 0x08, + 0x60, 0x2B, 0x41, 0x8D, 0xE8, 0x35, 0x4F, 0x54, 0x41, 0x15, 0x58, 0x00, + 0x0E, 0x67, 0xF3, 0x37, 0x46, 0x09, 0x8D, 0x28, 0x36, 0x46, 0xFC, 0x43, + 0x66, 0x8F, 0x49, 0x0E, 0xF9, 0x83, 0xE8, 0x8E, 0x2E, 0x3F, 0xBC, 0x33, + 0x8C, 0x87, 0x10, 0x6B, 0x8E, 0x29, 0x37, 0xC9, 0xE6, 0x3C, 0x83, 0x36, + 0x16, 0x2F, 0xAC, 0x3E, 0x93, 0x36, 0x3B, 0xDC, 0x83, 0x36, 0x04, 0x81, + 0xC4, 0x56, 0x19, 0x2C, 0x34, 0x81, 0x10, 0x00, 0xC1, 0xF2, 0x86, 0x4A, + 0x3E, 0x78, 0x82, 0x2C, 0x54, 0xC3, 0xC7, 0x22, 0xDF, 0x48, 0xFA, 0x83, + 0x2A, 0xA8, 0x82, 0x65, 0x20, 0x83, 0x20, 0xBA, 0x82, 0x93, 0x03, 0xF7, + 0x97, 0xB7, 0x06, 0x28, 0x7C, 0x00, 0xE0, 0xA8, 0x40, 0x6F, 0x28, 0x80, + 0x24, 0x07, 0x47, 0x1E, 0xB4, 0x80, 0x4B, 0x9F, 0x00, 0x03, 0x2C, 0x94, + 0xE1, 0xB4, 0x80, 0x0C, 0x5C, 0x02, 0xE3, 0x30, 0x4E, 0xCD, 0x76, 0xC0, + 0x0B, 0x5C, 0x02, 0x14, 0x5D, 0x62, 0x09, 0x80, 0x80, 0xAD, 0xAC, 0x00, + 0x71, 0xA5, 0x40, 0xA2, 0x75, 0x80, 0x78, 0xA7, 0xC0, 0x19, 0xFC, 0x27, + 0x02, 0xEE, 0x01, 0x00, 0x42, 0x5A, 0x78, 0xEC, 0x41, 0x2C, 0x86, 0x87, + 0x7A, 0xE4, 0x14, 0x1F, 0xC4, 0x00, 0x4F, 0x5D, 0x75, 0x7A, 0xF4, 0xE2, + 0x7C, 0xBC, 0x01, 0x24, 0x54, 0xA8, 0x1F, 0x74, 0x5D, 0x81, 0x0C, 0x08, + 0x20, 0xD0, 0x81, 0x0D, 0x90, 0x42, 0x88, 0x2A, 0x93, 0xFE, 0x32, 0xD9, + 0xED, 0x05, 0x7F, 0x03, 0x2E, 0x60, 0xC8, 0x36, 0xD6, 0x42, 0xC1, 0x5C, + 0x70, 0x63, 0xF0, 0x03, 0x36, 0xBC, 0xC2, 0x28, 0xF4, 0x80, 0x05, 0xA8, + 0x8C, 0x4A, 0x04, 0x61, 0x16, 0x0C, 0xC5, 0x50, 0x7C, 0x38, 0x60, 0xEF, + 0x88, 0x87, 0x67, 0x41, 0x15, 0xD8, 0x15, 0x8A, 0xDF, 0x15, 0xE0, 0xED, + 0x12, 0x01, 0x18, 0xC0, 0x11, 0x88, 0xD2, 0x28, 0x59, 0x58, 0x01, 0x69, + 0x19, 0x37, 0x10, 0x81, 0x2A, 0x74, 0x43, 0x37, 0xC0, 0x38, 0x16, 0x6A, + 0xA9, 0xEA, 0xF2, 0x09, 0xC1, 0x6A, 0x69, 0x5F, 0x38, 0x31, 0x9E, 0xB8, + 0x89, 0xEA, 0x4D, 0xF1, 0x8F, 0xEB, 0x33, 0x65, 0x93, 0x36, 0xEC, 0x9A, + 0x7B, 0x90, 0xAF, 0x9E, 0x1B, 0xC3, 0x29, 0x33, 0xD4, 0x82, 0x27, 0x54, + 0xEC, 0xA1, 0xD0, 0x0D, 0x3F, 0x10, 0x81, 0x2C, 0x68, 0xC3, 0xC7, 0x2E, + 0x03, 0x35, 0x20, 0x5F, 0x32, 0x60, 0x79, 0xC4, 0xD6, 0x02, 0x32, 0x74, + 0x43, 0x2B, 0xC8, 0x31, 0x98, 0x0B, 0x3C, 0x6A, 0xB8, 0x9D, 0x0F, 0xC8, + 0x80, 0xE4, 0x94, 0x6F, 0x0A, 0xE4, 0x2C, 0x19, 0x04, 0x07, 0xF9, 0x5D, + 0xD4, 0x09, 0xF0, 0xA4, 0x0A, 0x8C, 0xC0, 0x79, 0x42, 0x51, 0x18, 0x00, + 0x87, 0xAB, 0xD4, 0x5F, 0xAD, 0xA0, 0xE7, 0x09, 0x9C, 0x00, 0xE4, 0xA4, + 0xC0, 0x09, 0x8C, 0x00, 0xD0, 0x56, 0x62, 0x03, 0x74, 0xC0, 0x02, 0x0C, + 0xC0, 0xA9, 0x1E, 0xC2, 0x20, 0x64, 0x65, 0x26, 0x4F, 0x4B, 0xB4, 0xD8, + 0x01, 0x1E, 0xAC, 0x01, 0x22, 0x08, 0x9D, 0x21, 0xE8, 0x01, 0x79, 0x89, + 0x4B, 0x00, 0x8B, 0xED, 0x2A, 0x33, 0x82, 0x81, 0x02, 0xE3, 0x5A, 0xDE, + 0xC1, 0x1F, 0xC4, 0xC1, 0xDA, 0x16, 0x95, 0x1C, 0x1C, 0xC3, 0x1F, 0xD8, + 0x40, 0x13, 0xE8, 0x83, 0x97, 0x94, 0xBA, 0x57, 0x7C, 0x09, 0x3C, 0xB8, + 0xFE, 0x02, 0x24, 0x7D, 0x88, 0x28, 0xC0, 0x43, 0x63, 0x7C, 0xC8, 0x57, + 0x68, 0xEC, 0x35, 0x96, 0x82, 0x15, 0x30, 0x01, 0x5D, 0xFD, 0xC4, 0x2B, + 0x45, 0x5B, 0x2D, 0x79, 0x78, 0x89, 0x57, 0x81, 0x12, 0x48, 0x6E, 0x49, + 0xE0, 0xD5, 0x51, 0xF0, 0x9D, 0xE4, 0xAD, 0x08, 0x01, 0xB1, 0xB8, 0x89, + 0xF4, 0x40, 0x06, 0x88, 0xC2, 0xA6, 0x8C, 0x89, 0x2A, 0x98, 0xB3, 0x3A, + 0x90, 0xC3, 0x5B, 0x60, 0x76, 0xD4, 0xD4, 0x89, 0x9B, 0x64, 0x3B, 0xD3, + 0xF0, 0xC9, 0x66, 0xC9, 0xEE, 0xEB, 0xD2, 0x9E, 0x90, 0x9B, 0x3B, 0x16, + 0x5B, 0x31, 0xEC, 0xDE, 0xC3, 0x2C, 0x34, 0x41, 0x68, 0xF9, 0x1B, 0x26, + 0x08, 0x41, 0x11, 0x14, 0xC1, 0xD4, 0xD3, 0xCD, 0x3B, 0x78, 0x02, 0x32, + 0x68, 0xC3, 0x3A, 0xB4, 0x96, 0x36, 0x4C, 0x43, 0xC8, 0x26, 0xC3, 0x29, + 0xC0, 0x82, 0x2A, 0xDC, 0xB6, 0x3F, 0x74, 0x83, 0xF2, 0x1A, 0xF4, 0xC0, + 0x9B, 0xFE, 0xD7, 0xF0, 0x83, 0x0D, 0xA4, 0xC1, 0x18, 0xB4, 0x01, 0x22, + 0xC4, 0x9F, 0x08, 0x80, 0x80, 0x0B, 0x94, 0xC0, 0x21, 0xAF, 0xC0, 0x72, + 0xE0, 0xE4, 0x25, 0xAE, 0x00, 0x0B, 0x34, 0xE2, 0x08, 0xA0, 0x67, 0x07, + 0x48, 0x7C, 0x70, 0x40, 0x6A, 0xF9, 0x05, 0xC7, 0xC7, 0x2F, 0x54, 0x18, + 0x68, 0x37, 0x43, 0x4D, 0x2A, 0x00, 0x8C, 0x00, 0xCC, 0xD6, 0x81, 0x1E, + 0x4C, 0xCB, 0x1E, 0xEC, 0x01, 0xB5, 0xA8, 0xC1, 0x52, 0x1B, 0xC2, 0x21, + 0x84, 0x62, 0x22, 0x24, 0x20, 0x56, 0x27, 0x28, 0x1E, 0xB5, 0x07, 0xAF, + 0xFA, 0xE2, 0x79, 0xF8, 0x6A, 0xA7, 0xC9, 0x01, 0x7D, 0x20, 0xF0, 0x2B, + 0xC7, 0x81, 0x23, 0x14, 0x8F, 0x0D, 0xD0, 0x02, 0x8A, 0x2E, 0x7D, 0xB3, + 0x46, 0xC8, 0x2F, 0xE0, 0x42, 0x24, 0xE9, 0x03, 0x36, 0x94, 0x02, 0x35, + 0xBC, 0x02, 0x2E, 0xFE, 0x54, 0x43, 0x3F, 0x88, 0xB3, 0xC6, 0x82, 0x45, + 0x3F, 0xC9, 0x03, 0x3A, 0x00, 0x84, 0x30, 0x5E, 0x5B, 0x08, 0x6A, 0x99, + 0xA2, 0x45, 0x0A, 0xC2, 0x2C, 0x52, 0xB2, 0x54, 0x99, 0x52, 0xA5, 0x0A, + 0x92, 0x23, 0x01, 0x28, 0x56, 0xB4, 0x58, 0x11, 0x40, 0x81, 0x02, 0x00, + 0x38, 0x22, 0xC8, 0x90, 0x61, 0x43, 0x48, 0x90, 0x3D, 0x36, 0xF4, 0x80, + 0xA7, 0xCF, 0xDE, 0xBE, 0x6E, 0x44, 0x54, 0xF5, 0xEB, 0xF7, 0xCE, 0x1E, + 0xCC, 0x77, 0xF7, 0x64, 0xC6, 0xB4, 0x77, 0x8F, 0x66, 0xBD, 0x77, 0xF5, + 0x70, 0xE2, 0x9C, 0x89, 0xD3, 0xDD, 0x4E, 0x77, 0xF5, 0x86, 0xD6, 0xD3, + 0x59, 0x94, 0x68, 0x52, 0x77, 0x43, 0xDD, 0xB1, 0x63, 0x6A, 0x74, 0x69, + 0xD1, 0xA2, 0x4E, 0x97, 0xD6, 0x4B, 0x27, 0x24, 0x99, 0xBF, 0x69, 0xFE, + 0x44, 0x11, 0x29, 0x92, 0xE3, 0x95, 0x3E, 0xB1, 0x63, 0xC9, 0x96, 0x35, + 0x6B, 0x76, 0x1F, 0x91, 0x65, 0xD9, 0xB4, 0x69, 0x83, 0xF6, 0x16, 0xDA, + 0x2C, 0x59, 0xA1, 0x54, 0x21, 0xF3, 0x67, 0x77, 0x1D, 0x2C, 0x6F, 0x67, + 0xF9, 0xF6, 0xF5, 0xFB, 0x17, 0x70, 0x60, 0xC1, 0x83, 0x09, 0x17, 0x1E, + 0x7C, 0xAD, 0xC4, 0x18, 0x32, 0x76, 0x06, 0x99, 0x19, 0x31, 0xA2, 0x81, + 0x0B, 0x12, 0x29, 0x5C, 0x84, 0x59, 0x71, 0xE9, 0x04, 0x87, 0x14, 0x23, + 0x2C, 0x93, 0xF0, 0x4C, 0x02, 0x84, 0xE6, 0x30, 0x29, 0x48, 0x88, 0x69, + 0x31, 0x22, 0xC5, 0x89, 0x14, 0x2D, 0x36, 0xAF, 0x38, 0xF1, 0x82, 0xC4, + 0x02, 0x15, 0x25, 0x16, 0x8C, 0x70, 0xA0, 0xE0, 0x85, 0x9E, 0x33, 0x6A, + 0x06, 0x19, 0x32, 0xB4, 0x87, 0xB1, 0x1D, 0x3B, 0x7B, 0x12, 0x29, 0x52, + 0xB4, 0x47, 0x51, 0x9E, 0x4B, 0xC2, 0xD7, 0x30, 0x22, 0xD3, 0xE2, 0xCE, + 0x9D, 0x35, 0x7C, 0xD6, 0xC0, 0x59, 0xFE, 0xA4, 0x88, 0x51, 0x9F, 0x37, + 0x8B, 0xFA, 0xB0, 0x61, 0x13, 0xA7, 0x06, 0x20, 0xF1, 0x80, 0x38, 0x71, + 0xFA, 0x21, 0x62, 0x07, 0x3E, 0x7C, 0xF2, 0xD6, 0xCB, 0x63, 0xCF, 0x9E, + 0xDF, 0x3E, 0x78, 0xAE, 0xE8, 0xE5, 0xB3, 0x2F, 0xAF, 0x49, 0x11, 0x4F, + 0x4D, 0x84, 0x08, 0xB1, 0x32, 0xAA, 0x14, 0x51, 0x5C, 0xE1, 0x86, 0x1F, + 0xB2, 0xF2, 0xD9, 0x07, 0x9F, 0x7D, 0x14, 0x1C, 0x2B, 0x9F, 0x78, 0xC6, + 0x31, 0x86, 0x17, 0x2E, 0xB4, 0x30, 0x68, 0x8A, 0x0A, 0x0D, 0xAA, 0x42, + 0x0A, 0x24, 0x36, 0x20, 0x00, 0x80, 0x8B, 0x2A, 0x1A, 0x00, 0x00, 0x01, + 0x06, 0xA0, 0xA8, 0x43, 0x8F, 0x40, 0x3A, 0xA2, 0x07, 0x90, 0x32, 0x20, + 0x29, 0xAC, 0x05, 0x5D, 0xC1, 0xA4, 0x9A, 0x74, 0xEA, 0xB1, 0x87, 0x46, + 0x9B, 0x68, 0x9C, 0xD1, 0xA8, 0x9F, 0xEE, 0x89, 0x69, 0xA7, 0x9D, 0x88, + 0xCA, 0xC9, 0xA8, 0x20, 0x85, 0x64, 0x8A, 0xC8, 0xA8, 0x84, 0x74, 0x4A, + 0x29, 0xA2, 0x8A, 0x5C, 0x2A, 0x1D, 0x7B, 0x30, 0xC1, 0xC4, 0x1F, 0x6D, + 0xFC, 0x99, 0x05, 0x93, 0x21, 0x80, 0x20, 0xC2, 0x30, 0xBF, 0xE4, 0x29, + 0x02, 0x9A, 0xB6, 0xB2, 0xE9, 0x52, 0x9B, 0x69, 0xA6, 0xA1, 0x45, 0x14, + 0x58, 0x5C, 0x49, 0x66, 0x96, 0x64, 0xB6, 0xD1, 0x2B, 0xCB, 0x36, 0xDD, + 0x7C, 0x13, 0xCE, 0x38, 0x0D, 0x3B, 0x25, 0x85, 0x17, 0x52, 0x60, 0xAC, + 0x10, 0x15, 0x3A, 0x68, 0x00, 0x05, 0x12, 0x50, 0x70, 0x4D, 0x8C, 0x15, + 0x52, 0x23, 0x61, 0x04, 0x16, 0x40, 0x23, 0x41, 0x50, 0x0E, 0x42, 0x78, + 0x61, 0x05, 0x15, 0x10, 0x65, 0xD4, 0x35, 0x10, 0x3A, 0x48, 0x21, 0x05, + 0x10, 0x54, 0x68, 0x41, 0x85, 0x05, 0x38, 0x18, 0x81, 0x03, 0x0E, 0x16, + 0x18, 0xE0, 0x03, 0x44, 0xD6, 0x50, 0x63, 0x8F, 0x42, 0xFE, 0x04, 0xC1, + 0xA3, 0x90, 0x3C, 0xEA, 0xB0, 0xA3, 0x90, 0x44, 0x0E, 0x41, 0x44, 0x0F, + 0x3B, 0xF2, 0x00, 0x8E, 0x0F, 0x35, 0x0C, 0xB9, 0x03, 0x85, 0xE9, 0xDE, + 0xB8, 0xE3, 0x0D, 0x3E, 0xF8, 0x58, 0x84, 0x11, 0x3E, 0xEE, 0xE0, 0xC3, + 0x0F, 0x36, 0x62, 0xA8, 0xE1, 0x87, 0x3F, 0xFE, 0xE8, 0x64, 0x93, 0x66, + 0x36, 0x01, 0xCF, 0x84, 0xB0, 0xDE, 0x61, 0x6F, 0x3D, 0xF5, 0xF0, 0xE1, + 0x87, 0x9F, 0x7C, 0x70, 0xC1, 0xC5, 0xBE, 0x7C, 0xC8, 0xC1, 0xC5, 0x1F, + 0x7D, 0xF0, 0xF1, 0xC6, 0x9F, 0x5F, 0x68, 0xA1, 0x85, 0x94, 0x22, 0x82, + 0x68, 0xC2, 0x93, 0x51, 0x5C, 0xF9, 0x86, 0x3D, 0xB4, 0xCC, 0xA2, 0x07, + 0x1D, 0x5F, 0x76, 0xE1, 0x62, 0x0B, 0x83, 0xA4, 0x48, 0x22, 0x09, 0x89, + 0x04, 0xE8, 0xD0, 0xC3, 0x00, 0x32, 0xE2, 0x68, 0xE0, 0x23, 0x0C, 0x0E, + 0xE9, 0x1F, 0x14, 0x3F, 0xFA, 0x67, 0x1F, 0x7D, 0x14, 0x64, 0x07, 0x13, + 0x52, 0xE0, 0x81, 0x87, 0xC7, 0x9B, 0xDE, 0xA9, 0x89, 0xA7, 0x1E, 0xED, + 0xD1, 0x49, 0xC8, 0x1C, 0x39, 0xEE, 0xD8, 0x28, 0x78, 0x8C, 0x84, 0xAA, + 0x1E, 0xAA, 0x86, 0x62, 0x87, 0x1D, 0xA3, 0x52, 0x46, 0x19, 0x2A, 0x93, + 0xDD, 0x49, 0xE7, 0x1E, 0x64, 0x76, 0xA8, 0x65, 0x96, 0xAD, 0x50, 0x29, + 0x62, 0x88, 0x1D, 0xB8, 0x91, 0x73, 0xAC, 0x77, 0x3C, 0x89, 0x66, 0x9D, + 0x6D, 0xB4, 0xA1, 0x66, 0xE8, 0x64, 0xA0, 0x49, 0x46, 0x95, 0x53, 0x44, + 0x49, 0xD3, 0x9F, 0x6E, 0x66, 0xE9, 0x87, 0xE7, 0xA8, 0xA5, 0x9E, 0x9A, + 0xEA, 0xB2, 0xF2, 0xD1, 0x67, 0x08, 0x16, 0x60, 0x78, 0xA1, 0x0E, 0x44, + 0x28, 0x79, 0x43, 0x04, 0x0E, 0x18, 0x20, 0xA1, 0x81, 0x11, 0x5C, 0x58, + 0xE1, 0x85, 0xD1, 0x42, 0x18, 0xE1, 0x04, 0x15, 0x1E, 0x5B, 0x01, 0x05, + 0xFE, 0xB7, 0x59, 0x60, 0x94, 0xED, 0x14, 0xC2, 0x50, 0xED, 0x84, 0x05, + 0x18, 0x20, 0xED, 0x84, 0xBB, 0x39, 0x50, 0x60, 0x01, 0x0F, 0x18, 0x58, + 0x40, 0x00, 0x05, 0xF0, 0xD0, 0x03, 0xF1, 0x3D, 0x04, 0x31, 0xA4, 0x10, + 0x3B, 0xDE, 0xC8, 0xC3, 0x38, 0x3E, 0x7C, 0x93, 0x55, 0x11, 0xDF, 0xD6, + 0x90, 0x95, 0x0D, 0x18, 0xC8, 0x60, 0x83, 0x8F, 0x37, 0xDE, 0x50, 0xC4, + 0x0E, 0x45, 0x16, 0x11, 0xF6, 0x0E, 0xEF, 0x4C, 0x5F, 0xB6, 0x93, 0xD4, + 0xE5, 0xF8, 0xC1, 0x04, 0x1D, 0xFA, 0x51, 0xCF, 0xBD, 0x6B, 0xD5, 0xC3, + 0x76, 0x1F, 0x70, 0x5C, 0xD9, 0x47, 0x1E, 0x6F, 0xBC, 0xF9, 0xA5, 0x16, + 0x6F, 0xF6, 0xC1, 0x96, 0x9F, 0x89, 0xDF, 0x21, 0x87, 0x9B, 0x5A, 0x46, + 0xB1, 0xC2, 0x13, 0x4F, 0x44, 0x19, 0x65, 0x14, 0x5A, 0xAA, 0xE9, 0xA7, + 0xE1, 0xBE, 0x10, 0xDC, 0x87, 0x5E, 0x61, 0x72, 0xE1, 0x22, 0x8B, 0x24, + 0x36, 0xA0, 0x80, 0xA2, 0x11, 0x03, 0xA6, 0x48, 0x00, 0x01, 0x0A, 0xA0, + 0xC0, 0x60, 0x15, 0x8F, 0x28, 0x29, 0x03, 0x5D, 0x0E, 0x54, 0x70, 0x16, + 0x21, 0x68, 0x81, 0xB9, 0xC6, 0xF8, 0x6F, 0xB2, 0xF1, 0x1E, 0xA3, 0x62, + 0xF2, 0x09, 0xC8, 0xFA, 0x3B, 0x7E, 0x4A, 0x28, 0x25, 0x8D, 0x7C, 0x8A, + 0x64, 0x55, 0x89, 0xCA, 0x00, 0xA9, 0x02, 0x04, 0x54, 0xCC, 0x02, 0x16, + 0xFE, 0xA8, 0x05, 0x26, 0x84, 0x00, 0x84, 0xDB, 0x49, 0x0D, 0x1E, 0x73, + 0x68, 0xCB, 0x04, 0xC3, 0xA4, 0x8C, 0xB8, 0xAC, 0xC2, 0x15, 0xAD, 0x48, + 0x93, 0x9A, 0x6A, 0x71, 0x92, 0xAA, 0x7D, 0x10, 0x84, 0x21, 0x04, 0xCC, + 0xD5, 0xC4, 0x65, 0x83, 0x33, 0xBC, 0xC0, 0x56, 0x91, 0x88, 0x44, 0x1D, + 0xFA, 0xC4, 0xA7, 0xCD, 0xA4, 0xA6, 0x05, 0x27, 0xB8, 0x04, 0x09, 0xDC, + 0x86, 0x82, 0x13, 0xFE, 0x8C, 0x00, 0x05, 0x23, 0x80, 0x5B, 0x0A, 0x04, + 0xD5, 0x81, 0x11, 0x4C, 0x86, 0x04, 0x27, 0x20, 0x81, 0x02, 0x40, 0x30, + 0x82, 0x22, 0x0A, 0x71, 0x04, 0x0A, 0x60, 0x40, 0x03, 0x3A, 0xC0, 0x81, + 0x01, 0x2C, 0xE0, 0x12, 0x87, 0x23, 0x04, 0x1E, 0xEA, 0xA0, 0x87, 0x3A, + 0xE4, 0x01, 0x8B, 0xA5, 0x2A, 0x04, 0x1F, 0x62, 0x55, 0x07, 0x45, 0x14, + 0x87, 0x0C, 0x97, 0x28, 0x5D, 0x1A, 0xD8, 0x90, 0x02, 0x32, 0xBC, 0x81, + 0x0D, 0x6B, 0xE8, 0x95, 0x21, 0x82, 0x95, 0xB9, 0x38, 0x78, 0x27, 0x0E, + 0x7F, 0x68, 0xC4, 0x26, 0x52, 0xF7, 0x07, 0x13, 0x48, 0x60, 0x02, 0xBF, + 0xC8, 0x07, 0x3F, 0xE0, 0x33, 0x3B, 0x6C, 0x5D, 0x4B, 0x77, 0xF0, 0xD8, + 0xCB, 0xEF, 0x6A, 0x74, 0xAD, 0x9B, 0xE8, 0x04, 0x1E, 0xEF, 0x80, 0x87, + 0x34, 0xCE, 0x45, 0x8B, 0x52, 0x30, 0x6F, 0x3F, 0x9E, 0xA0, 0x85, 0x37, + 0xC8, 0xF1, 0x3A, 0x94, 0xD8, 0xC3, 0x61, 0xD1, 0x33, 0xD0, 0x39, 0xD0, + 0x71, 0x0B, 0x2B, 0x64, 0xC0, 0x7B, 0xDF, 0x03, 0x18, 0x02, 0x8E, 0x40, + 0xCA, 0x0D, 0xA0, 0x68, 0x03, 0x0B, 0xCB, 0xE4, 0x3E, 0xDC, 0x41, 0x84, + 0x51, 0x4C, 0x8C, 0x47, 0x34, 0xD9, 0xD1, 0xC5, 0x72, 0xF2, 0x93, 0x99, + 0x04, 0xE9, 0x96, 0x40, 0xD9, 0x9F, 0x92, 0x78, 0xE9, 0x3F, 0xFF, 0x49, + 0xA5, 0x64, 0x2B, 0x6B, 0xCA, 0xC9, 0x78, 0xD9, 0x24, 0x06, 0xD2, 0xAC, + 0x15, 0xAD, 0xE8, 0xCA, 0x12, 0x84, 0x50, 0x20, 0x08, 0x7A, 0x62, 0x82, + 0x42, 0xD3, 0x46, 0x35, 0xA0, 0x31, 0x8D, 0x59, 0x9C, 0x02, 0x16, 0xA7, + 0x40, 0x13, 0x32, 0xB4, 0x01, 0x0B, 0x0F, 0x8A, 0x10, 0x9C, 0xE1, 0x0C, + 0x61, 0xC3, 0xB8, 0x91, 0x82, 0x33, 0x94, 0xC0, 0x0E, 0x2A, 0x8C, 0x44, + 0x1B, 0x5C, 0xC0, 0x29, 0x11, 0xBC, 0xFE, 0xC0, 0x88, 0x97, 0x52, 0x81, + 0x0A, 0x52, 0x20, 0x82, 0x13, 0xA0, 0xA0, 0x4F, 0x7A, 0x6A, 0xDB, 0x25, + 0x1C, 0x45, 0xC3, 0x10, 0xA4, 0x40, 0x05, 0x62, 0xE3, 0x00, 0xA1, 0x3A, + 0xC5, 0x01, 0x7A, 0x32, 0xA0, 0x89, 0x9B, 0x1A, 0x40, 0x07, 0xD4, 0xA0, + 0x87, 0xC3, 0xE9, 0xA1, 0x0D, 0x6B, 0x30, 0x04, 0x16, 0x13, 0x21, 0xB9, + 0x2D, 0xE6, 0xC1, 0x0E, 0x86, 0x38, 0x84, 0x21, 0x14, 0xA1, 0x06, 0x36, + 0x08, 0x02, 0x8D, 0x9D, 0x83, 0xC1, 0x0A, 0x5C, 0xB0, 0x06, 0xCE, 0x19, + 0x67, 0x11, 0x6B, 0x10, 0x01, 0x0C, 0xD8, 0xE0, 0x87, 0x3B, 0xF8, 0xC1, + 0x0F, 0x8E, 0xE8, 0x44, 0x33, 0x1A, 0x11, 0x03, 0x1B, 0xD4, 0x00, 0x13, + 0xEE, 0xE1, 0xE3, 0xB5, 0xF8, 0xF1, 0x0E, 0x7E, 0xE0, 0xC3, 0xA7, 0xFB, + 0xB0, 0x87, 0x1F, 0x7F, 0x6A, 0xAD, 0xA1, 0x0A, 0x95, 0x47, 0xEF, 0x70, + 0x87, 0x4B, 0xD4, 0x41, 0x0D, 0x6F, 0xD0, 0x42, 0x15, 0xAA, 0x20, 0x85, + 0x28, 0xBA, 0x52, 0x04, 0x51, 0x40, 0x63, 0x14, 0xB8, 0x50, 0x90, 0x26, + 0xAD, 0x26, 0x96, 0x7D, 0x14, 0x8F, 0x08, 0x37, 0x30, 0x40, 0xC0, 0x46, + 0x44, 0x00, 0x04, 0x90, 0x32, 0x03, 0x06, 0x53, 0x58, 0x35, 0xF4, 0xB1, + 0xA3, 0x7D, 0xD4, 0x22, 0x08, 0xD2, 0xE0, 0x49, 0xFC, 0xEA, 0xF7, 0x93, + 0xB9, 0xF6, 0x88, 0x27, 0x40, 0x0A, 0x19, 0x4F, 0x8A, 0x02, 0x0F, 0x92, + 0x25, 0x25, 0x80, 0xBC, 0x64, 0xCA, 0xCA, 0x54, 0xF6, 0x4B, 0x94, 0xA1, + 0x4C, 0x46, 0xDA, 0xD8, 0x81, 0x2A, 0x60, 0x31, 0x0B, 0x55, 0x88, 0xE2, + 0x49, 0x40, 0x40, 0x86, 0xC3, 0x78, 0xA6, 0x20, 0x78, 0x7C, 0xA2, 0x1A, + 0x5E, 0x1A, 0xDA, 0x34, 0xC2, 0x24, 0x0D, 0xC6, 0x9E, 0x62, 0x19, 0x5A, + 0xD9, 0x46, 0x2C, 0xF6, 0x22, 0x4E, 0xD3, 0x9E, 0xD6, 0xFE, 0x2F, 0x5C, + 0xFD, 0x4B, 0xC3, 0x66, 0xD1, 0x82, 0x35, 0xA0, 0xE0, 0x0C, 0x89, 0x98, + 0xC4, 0x3A, 0x2F, 0x81, 0x02, 0xBD, 0x39, 0x8A, 0x9E, 0x9B, 0xD1, 0x61, + 0x9F, 0x42, 0xC0, 0x01, 0x10, 0x30, 0xF1, 0x86, 0x36, 0x04, 0xC1, 0x0A, + 0xCC, 0x20, 0x02, 0xCF, 0x74, 0x8A, 0x01, 0x9C, 0x2A, 0x9B, 0x11, 0x09, + 0xB5, 0x80, 0xDE, 0x36, 0xC0, 0x01, 0x0E, 0x08, 0xC3, 0x20, 0xF0, 0x80, + 0x07, 0x42, 0xE8, 0x21, 0x0D, 0x6A, 0xC8, 0x43, 0x21, 0x26, 0xA1, 0x2A, + 0xE0, 0xCC, 0x6A, 0x71, 0x8A, 0x38, 0xD5, 0xE3, 0x3A, 0xF7, 0x38, 0x5E, + 0xAD, 0x21, 0x0F, 0x64, 0x80, 0xDC, 0xAE, 0xDE, 0x00, 0x83, 0x14, 0xD4, + 0xC0, 0x3B, 0x77, 0x70, 0xC4, 0x23, 0x66, 0xFA, 0x08, 0x64, 0xC5, 0x41, + 0x02, 0xA2, 0x88, 0x0F, 0xF0, 0x7E, 0x8A, 0x2D, 0x7B, 0xFC, 0x91, 0x1F, + 0x43, 0x3D, 0xEA, 0x50, 0xF1, 0x41, 0x23, 0xA4, 0xD2, 0xA8, 0xA7, 0x43, + 0xA5, 0xC9, 0x3B, 0xBC, 0x91, 0x0D, 0x69, 0xFC, 0x22, 0x19, 0xB8, 0x50, + 0x85, 0x10, 0x96, 0x17, 0x31, 0x52, 0xD4, 0xC2, 0x1F, 0xDF, 0xF0, 0x06, + 0x3C, 0xF0, 0xC1, 0x61, 0x7D, 0x90, 0x90, 0x84, 0x63, 0xE1, 0x87, 0x35, + 0x54, 0x11, 0xD6, 0x09, 0x00, 0x2C, 0x00, 0x05, 0x20, 0x80, 0x01, 0x10, + 0x40, 0x80, 0xF3, 0xA5, 0x95, 0x61, 0xFB, 0xD8, 0xD1, 0x55, 0x84, 0x90, + 0x8E, 0x76, 0xCC, 0x72, 0x96, 0xF3, 0x93, 0x25, 0x4C, 0x74, 0x82, 0x13, + 0x5C, 0x22, 0x85, 0x28, 0x4A, 0x05, 0xAC, 0x52, 0x04, 0x18, 0xCC, 0x22, + 0x0F, 0x70, 0x80, 0xC1, 0x2C, 0x59, 0x53, 0xD8, 0x91, 0x8E, 0x1C, 0x34, + 0x61, 0x16, 0x51, 0x86, 0x45, 0x28, 0x30, 0x31, 0x87, 0x26, 0x54, 0x8D, + 0x1B, 0x44, 0xD0, 0x06, 0x5B, 0xB8, 0xDC, 0x96, 0x69, 0x40, 0xC3, 0x15, + 0xFE, 0xB0, 0xD0, 0x20, 0x34, 0xA8, 0xB1, 0x26, 0xA8, 0xA1, 0x16, 0xCD, + 0x69, 0xCE, 0x52, 0x28, 0xD2, 0x70, 0x06, 0x17, 0xE4, 0xC1, 0x55, 0xD4, + 0x35, 0x43, 0x18, 0x04, 0xEA, 0xB6, 0xC7, 0xA0, 0xA0, 0x05, 0x7E, 0x72, + 0x1B, 0x07, 0x3A, 0xC0, 0x00, 0xDF, 0x8E, 0x80, 0x01, 0xC9, 0xFD, 0x61, + 0xDB, 0xF4, 0xD4, 0x80, 0xE4, 0x32, 0x71, 0x04, 0x82, 0xEB, 0x13, 0x9F, + 0x3D, 0xE5, 0x80, 0x00, 0xB8, 0x40, 0x10, 0x84, 0x38, 0x83, 0x43, 0xC7, + 0x50, 0x87, 0x3D, 0x18, 0x02, 0x56, 0x75, 0xE0, 0x03, 0x16, 0x0D, 0x61, + 0x69, 0x41, 0x80, 0x2E, 0x74, 0x86, 0x30, 0x69, 0x1E, 0xDE, 0x80, 0x5E, + 0xEA, 0xAC, 0x21, 0x11, 0xC2, 0xC9, 0x9C, 0xE4, 0xFC, 0xB0, 0x88, 0x97, + 0x3E, 0xA2, 0x12, 0xA9, 0x7B, 0xE3, 0x0F, 0x6A, 0x20, 0x01, 0x4F, 0x58, + 0x23, 0x41, 0x3C, 0x0D, 0x30, 0x4F, 0x09, 0x2C, 0xBF, 0x42, 0xD2, 0x48, + 0x3D, 0x74, 0xAD, 0xD8, 0xC5, 0xD8, 0xD1, 0x0E, 0x75, 0x7C, 0x83, 0x16, + 0xD9, 0xA8, 0x45, 0x2D, 0xA2, 0x4A, 0x55, 0x4C, 0x24, 0x4F, 0x15, 0xAE, + 0xA8, 0xB1, 0x20, 0xDF, 0x31, 0x96, 0x05, 0x95, 0xE5, 0x1D, 0xD2, 0x28, + 0xC5, 0x10, 0x6E, 0xF0, 0x00, 0x80, 0x15, 0xC0, 0x60, 0x0A, 0x38, 0x02, + 0xF4, 0x14, 0xE4, 0x0E, 0x6E, 0x08, 0xA1, 0x14, 0xF6, 0xA0, 0x98, 0x4C, + 0x7C, 0x8C, 0x57, 0xFD, 0x75, 0xCC, 0x47, 0x43, 0x0A, 0xD2, 0x50, 0xFC, + 0x9A, 0xA4, 0xAA, 0xF4, 0x92, 0x2A, 0xBF, 0x8C, 0x0A, 0xCA, 0x98, 0xEC, + 0x0E, 0x75, 0xDC, 0x03, 0x13, 0x39, 0x98, 0x12, 0x2C, 0x16, 0x38, 0x84, + 0x22, 0xEC, 0x40, 0x1A, 0x55, 0xF3, 0x86, 0x27, 0xB8, 0x9C, 0x0D, 0x87, + 0x67, 0xE3, 0xCB, 0xD0, 0x88, 0xB6, 0x06, 0x93, 0xA1, 0x8D, 0x6D, 0xB4, + 0x82, 0x1C, 0x6A, 0xFE, 0xD6, 0xF8, 0xC6, 0xA5, 0xA7, 0x8F, 0x39, 0xB4, + 0x20, 0x0C, 0x2E, 0xD0, 0x83, 0xAB, 0xF4, 0x20, 0x08, 0x31, 0x9C, 0x21, + 0x05, 0x7E, 0x26, 0x54, 0x66, 0x3C, 0xD3, 0x81, 0x49, 0x8D, 0xA0, 0x89, + 0x31, 0x07, 0xE8, 0xA6, 0x1E, 0x43, 0x4F, 0x47, 0xC5, 0x9C, 0x50, 0xCD, + 0x6D, 0xAE, 0xA6, 0x14, 0x90, 0x80, 0x00, 0x84, 0x00, 0x0F, 0x87, 0xA8, + 0xEE, 0x19, 0xCE, 0xB0, 0xD1, 0x41, 0x14, 0xA2, 0x71, 0x7C, 0x10, 0x44, + 0x1D, 0xB6, 0xB8, 0x87, 0x3C, 0xE0, 0xC1, 0xE9, 0x86, 0x38, 0xF5, 0x44, + 0xD1, 0x60, 0x07, 0xEA, 0xB0, 0xC1, 0x71, 0x9E, 0x83, 0x81, 0xE6, 0xDE, + 0xE0, 0x87, 0x46, 0x2C, 0x22, 0x75, 0xB1, 0xE6, 0x03, 0xAD, 0x1B, 0x51, + 0xEB, 0x99, 0x79, 0xA3, 0x1F, 0xFF, 0x55, 0x3B, 0xB0, 0x05, 0xDC, 0xEB, + 0x94, 0xFC, 0x3A, 0x25, 0xF7, 0x28, 0xB0, 0xAF, 0x67, 0xB4, 0x31, 0x77, + 0xC0, 0x23, 0x1D, 0xDD, 0xD0, 0x7B, 0x35, 0x96, 0x5D, 0x0B, 0x5A, 0xB8, + 0x82, 0x14, 0x9E, 0x78, 0x72, 0x28, 0xD8, 0xE5, 0xBB, 0xE8, 0x6D, 0xB5, + 0x2C, 0xD1, 0x7B, 0xC7, 0x2F, 0x6C, 0x31, 0x04, 0x1C, 0x1C, 0x81, 0x43, + 0x31, 0x96, 0xB1, 0x3D, 0x46, 0xD1, 0x84, 0x6F, 0xC0, 0xA4, 0x27, 0x3D, + 0x9E, 0x09, 0x5E, 0x3F, 0x66, 0x3F, 0x20, 0x1F, 0x59, 0xDF, 0x82, 0x55, + 0xD2, 0xCA, 0x5C, 0x36, 0xCC, 0x61, 0x12, 0x25, 0x65, 0x2F, 0x73, 0xC7, + 0x34, 0x70, 0x40, 0x17, 0x57, 0xA8, 0x02, 0x13, 0x4D, 0x68, 0xC2, 0x0E, + 0x44, 0x41, 0xD9, 0xA9, 0x71, 0xA3, 0x09, 0xD2, 0x7C, 0x38, 0xC4, 0xA7, + 0x91, 0x8C, 0x53, 0xB8, 0xC2, 0x15, 0xB3, 0x50, 0xC6, 0x34, 0xD6, 0x54, + 0x6D, 0x8E, 0x1F, 0xFF, 0xF8, 0x57, 0xA3, 0x43, 0x1A, 0x60, 0x20, 0xD1, + 0xA3, 0xEF, 0x01, 0x0F, 0x66, 0x68, 0xFE, 0x03, 0x68, 0x3A, 0xC5, 0x29, + 0x4A, 0x89, 0xC0, 0xD0, 0xB1, 0x11, 0xC1, 0x02, 0xF4, 0x36, 0x82, 0x17, + 0xE0, 0xF6, 0x33, 0x27, 0x10, 0xE2, 0x09, 0x92, 0x4B, 0x82, 0x81, 0xC6, + 0xC6, 0x03, 0xE6, 0x6F, 0x80, 0x02, 0x3C, 0x05, 0x00, 0x05, 0xB4, 0x41, + 0x10, 0x83, 0x50, 0xC3, 0x15, 0x5D, 0x85, 0xF4, 0x37, 0xB4, 0x21, 0x71, + 0x88, 0x20, 0x75, 0x1E, 0x7C, 0xE3, 0xAB, 0x37, 0xA4, 0xE1, 0x73, 0x84, + 0x85, 0xD4, 0xEC, 0x80, 0x0D, 0x16, 0xE3, 0x0D, 0x62, 0x80, 0xA5, 0xD8, + 0xEB, 0xEB, 0x2A, 0x01, 0xD6, 0x3A, 0xA1, 0x11, 0xD8, 0xC0, 0x06, 0xFC, + 0x60, 0x13, 0x62, 0x40, 0x02, 0x72, 0x40, 0x40, 0xBC, 0x21, 0xC0, 0xD4, + 0x2E, 0x03, 0x7D, 0x0D, 0xEE, 0x7C, 0xED, 0xC0, 0xE4, 0x47, 0x26, 0x94, + 0x04, 0x1E, 0xD8, 0xA1, 0x1F, 0xD4, 0xA1, 0x1B, 0xEE, 0x02, 0x16, 0x48, + 0xE1, 0xB1, 0x48, 0xE1, 0x13, 0xDA, 0x45, 0x15, 0x68, 0x61, 0x1B, 0xDE, + 0xA1, 0x61, 0x10, 0xCF, 0xDA, 0xCC, 0x62, 0x1B, 0x74, 0xC1, 0x16, 0xDA, + 0x41, 0x41, 0xEE, 0x61, 0x1F, 0x90, 0xA1, 0x09, 0x60, 0xA1, 0x1B, 0x74, + 0x62, 0x26, 0xEE, 0x47, 0xAF, 0xDE, 0x8D, 0x27, 0xFC, 0xAA, 0x2A, 0x14, + 0x89, 0xAF, 0x44, 0x8F, 0xC8, 0xA0, 0x62, 0xDF, 0x04, 0x0B, 0xC9, 0x4C, + 0x8F, 0xDF, 0x0E, 0xEB, 0x1E, 0x86, 0x80, 0x08, 0x60, 0x61, 0x14, 0x4E, + 0x81, 0xCA, 0x30, 0xE1, 0xE0, 0xBE, 0x69, 0x6A, 0xAE, 0x61, 0x0E, 0xD6, + 0x61, 0xCB, 0x1A, 0x4E, 0x4C, 0x10, 0x48, 0x15, 0x62, 0x21, 0x19, 0x92, + 0x81, 0xF8, 0x54, 0xC1, 0x0B, 0x91, 0xCF, 0x0D, 0x51, 0x6B, 0x1F, 0xF2, + 0x61, 0xF9, 0xCC, 0x89, 0x10, 0x0A, 0xA1, 0x0E, 0x05, 0xC1, 0x0C, 0x58, + 0x20, 0xCF, 0x00, 0xAD, 0x03, 0x68, 0xE8, 0x31, 0x40, 0xFE, 0x80, 0x04, + 0x42, 0x00, 0xA1, 0x1A, 0x60, 0x01, 0x82, 0xC8, 0xFC, 0x1E, 0xE3, 0x87, + 0x5A, 0xCE, 0xE6, 0x52, 0x8E, 0xCF, 0x42, 0x80, 0x10, 0x19, 0xE0, 0x04, + 0x3A, 0x60, 0x01, 0x1C, 0xC0, 0x89, 0x1C, 0x60, 0x0C, 0x46, 0xEE, 0x0C, + 0xAE, 0xE8, 0x10, 0x0A, 0xC1, 0x10, 0x04, 0x01, 0xBD, 0x66, 0x65, 0x10, + 0x04, 0x01, 0xA3, 0xF6, 0x60, 0x0F, 0x36, 0x31, 0x0F, 0xE0, 0xC0, 0x73, + 0x2A, 0xCA, 0x73, 0x86, 0xE5, 0x0D, 0xC8, 0xC0, 0xFF, 0xCE, 0xE6, 0x0E, + 0x12, 0x81, 0x11, 0x16, 0xA1, 0x11, 0x1A, 0x81, 0x11, 0x1A, 0x01, 0x12, + 0x1A, 0xE1, 0x0E, 0x62, 0x20, 0x0E, 0x1E, 0x61, 0xBE, 0x62, 0xE0, 0x06, + 0x46, 0xE1, 0x17, 0x80, 0x4A, 0x03, 0x6B, 0x84, 0x1F, 0x76, 0x84, 0x03, + 0x6B, 0xE4, 0x03, 0x95, 0x31, 0x19, 0x91, 0xAA, 0x7E, 0x26, 0xC6, 0x1D, + 0xBC, 0x81, 0x1B, 0xA6, 0x01, 0x17, 0x92, 0xA1, 0x16, 0x5A, 0xC1, 0x4C, + 0x5E, 0x8F, 0xAA, 0x6A, 0x81, 0x1B, 0x64, 0x70, 0x7A, 0xCE, 0x82, 0xAB, + 0xB6, 0xEA, 0x1E, 0xB6, 0x81, 0x3F, 0x2E, 0xAC, 0x1E, 0x26, 0x4F, 0x96, + 0xEC, 0xA7, 0xF3, 0xEA, 0x6D, 0xDE, 0x94, 0xC4, 0xEE, 0xA4, 0xE2, 0x29, + 0xA2, 0x50, 0x1E, 0xFB, 0xCD, 0x64, 0xEA, 0x11, 0xB1, 0xEA, 0x61, 0x1A, + 0x74, 0x60, 0x79, 0x46, 0x01, 0x16, 0x3E, 0x81, 0x08, 0x9A, 0x20, 0x08, + 0x5C, 0xA1, 0x6A, 0xC8, 0x69, 0x14, 0x1A, 0x6E, 0x1B, 0xD8, 0x82, 0x1A, + 0xE2, 0x22, 0xAA, 0x5A, 0x41, 0x0D, 0x2D, 0xCE, 0x15, 0x8C, 0xEF, 0x0D, + 0x23, 0xF2, 0xB4, 0xF2, 0x41, 0x0E, 0x58, 0xE0, 0x32, 0xF4, 0x20, 0x14, + 0x23, 0x61, 0x10, 0xEA, 0x60, 0x35, 0x30, 0xA5, 0x36, 0x46, 0x20, 0x04, + 0x42, 0xA0, 0x6D, 0x00, 0x6D, 0x12, 0xCB, 0xEF, 0x86, 0x16, 0x40, 0x01, + 0xFE, 0xD8, 0xA6, 0x03, 0x54, 0x00, 0x04, 0x88, 0xC8, 0x51, 0x56, 0x20, + 0x36, 0x94, 0x68, 0xFD, 0x50, 0xC3, 0x87, 0x1C, 0x80, 0x10, 0x03, 0x60, + 0x04, 0x04, 0xE1, 0x10, 0xF4, 0xC0, 0x0C, 0x82, 0x0E, 0xE9, 0x12, 0xA1, + 0x0E, 0x2C, 0x6D, 0x10, 0x66, 0x25, 0x28, 0xE1, 0xCC, 0x10, 0xE0, 0xE0, + 0x14, 0x3B, 0x87, 0xA3, 0xE0, 0x00, 0xBD, 0x54, 0xED, 0x73, 0x78, 0x45, + 0x72, 0x66, 0xB1, 0x11, 0x2A, 0x01, 0x12, 0x60, 0xED, 0x11, 0x20, 0xC1, + 0x0F, 0xE2, 0x00, 0x06, 0x60, 0x6A, 0x13, 0x1C, 0xA1, 0x06, 0x66, 0xA0, + 0x08, 0x68, 0x81, 0x90, 0x36, 0x66, 0x08, 0x93, 0xD1, 0x2C, 0x85, 0xED, + 0x2C, 0x69, 0x44, 0x7F, 0x96, 0x42, 0x64, 0xBC, 0x41, 0x1D, 0xDC, 0xB2, + 0x1A, 0xFE, 0x8E, 0xD9, 0xDA, 0xC5, 0x13, 0x5C, 0xA1, 0x16, 0xAA, 0x01, + 0x22, 0x33, 0x89, 0x2C, 0x16, 0x64, 0x1F, 0xB4, 0x81, 0x16, 0x92, 0xE7, + 0x15, 0xE2, 0x92, 0x16, 0xA8, 0x01, 0x47, 0x32, 0x26, 0xDE, 0x3A, 0x86, + 0x1D, 0x85, 0x2C, 0xC9, 0x44, 0x66, 0x49, 0xE4, 0x31, 0x65, 0x96, 0x4C, + 0x80, 0x90, 0x2C, 0x1D, 0xD2, 0xC1, 0x29, 0x9C, 0x42, 0x1D, 0xEC, 0x61, + 0x08, 0x9A, 0xA0, 0x15, 0x3C, 0x01, 0x13, 0x60, 0x8F, 0x08, 0x88, 0x40, + 0x08, 0x42, 0x8C, 0x6A, 0xAA, 0xC1, 0x13, 0x84, 0xC6, 0xE1, 0x2C, 0x6E, + 0xB3, 0x1C, 0x6B, 0x15, 0x6A, 0x21, 0x2B, 0x2C, 0xCE, 0x9B, 0x6C, 0x4F, + 0x22, 0x63, 0x33, 0x84, 0xF2, 0xC1, 0x07, 0xFA, 0xA6, 0x0C, 0x06, 0xE1, + 0x10, 0x08, 0x01, 0x56, 0xDC, 0x00, 0x0F, 0xCE, 0xC0, 0x22, 0x25, 0xF1, + 0x04, 0x42, 0x60, 0x32, 0x42, 0x60, 0x01, 0x3A, 0x00, 0xFB, 0x3A, 0xA0, + 0x4F, 0x1E, 0x63, 0x01, 0x1A, 0xE0, 0xFC, 0x1E, 0x43, 0x6C, 0x26, 0x63, + 0x04, 0x64, 0xC0, 0xFE, 0x05, 0x68, 0xCE, 0xE5, 0x6A, 0x83, 0x04, 0x18, + 0xC0, 0x01, 0x3E, 0x45, 0x01, 0xD4, 0x80, 0x10, 0x0E, 0x81, 0x37, 0x23, + 0xA1, 0x10, 0x50, 0x65, 0xE9, 0xEA, 0x40, 0x10, 0x30, 0xB2, 0xD2, 0xE0, + 0xAC, 0x10, 0x9C, 0x8E, 0x0F, 0x0E, 0x01, 0x0E, 0x84, 0xC3, 0x73, 0x40, + 0xA7, 0x57, 0xDE, 0x60, 0x12, 0x3A, 0x47, 0x11, 0xF8, 0x60, 0x12, 0x18, + 0x81, 0x11, 0x18, 0xF0, 0x11, 0xF6, 0xF3, 0x11, 0x1A, 0xA1, 0x0F, 0xE2, + 0x20, 0x0E, 0x62, 0xAA, 0x13, 0x1C, 0x61, 0x75, 0x70, 0xA0, 0x14, 0xD4, + 0x01, 0x1F, 0xDA, 0xC1, 0x1F, 0xD6, 0x2E, 0x2D, 0x1B, 0xD4, 0x41, 0x6B, + 0x04, 0x97, 0xD4, 0xA1, 0x1F, 0xDA, 0x21, 0x1B, 0xAA, 0xC1, 0x1A, 0x18, + 0x49, 0x15, 0x4A, 0x81, 0x33, 0xDB, 0xE5, 0x17, 0x26, 0xE6, 0x1A, 0xB6, + 0x4A, 0x41, 0x12, 0x44, 0x1F, 0xBA, 0xC1, 0x13, 0x48, 0x81, 0x1C, 0x36, + 0x2C, 0x1F, 0xE0, 0x81, 0x1B, 0x4A, 0x81, 0x5D, 0x2E, 0xF3, 0x96, 0x10, + 0x13, 0x64, 0x7E, 0xC9, 0x09, 0xA1, 0x70, 0x1E, 0x4F, 0xE6, 0xB0, 0x82, + 0x89, 0xF4, 0x5E, 0x46, 0x1D, 0x2A, 0x93, 0x1D, 0x2E, 0x13, 0x16, 0x72, + 0x40, 0x99, 0x9E, 0x2D, 0x14, 0x3E, 0x73, 0x07, 0xD8, 0x6A, 0x20, 0xF5, + 0x81, 0x34, 0x85, 0xE6, 0x20, 0xD9, 0xC2, 0xCB, 0x6A, 0x41, 0xCC, 0x62, + 0xA1, 0x66, 0xD8, 0xA2, 0x16, 0xF2, 0x52, 0x36, 0xAB, 0x94, 0x6A, 0xF0, + 0xC1, 0x04, 0x18, 0xE0, 0x0C, 0x2E, 0x51, 0x37, 0x11, 0xA1, 0xBA, 0xAC, + 0xE8, 0x12, 0x28, 0x25, 0x34, 0x74, 0x48, 0x4F, 0x02, 0x6D, 0x33, 0xFA, + 0x50, 0x4F, 0x46, 0x60, 0x01, 0x64, 0x00, 0x89, 0x60, 0x2E, 0x05, 0x96, + 0xAB, 0x0F, 0x57, 0x20, 0xB9, 0x32, 0x85, 0x03, 0x6E, 0x63, 0x52, 0x96, + 0x28, 0x00, 0x06, 0xE0, 0x04, 0xD4, 0xFE, 0x20, 0x12, 0x08, 0xA1, 0x0D, + 0x36, 0x11, 0xEA, 0x4E, 0xA5, 0x10, 0xDE, 0xC0, 0x0E, 0xEA, 0xA0, 0x0D, + 0xB0, 0x88, 0x13, 0xF7, 0x00, 0x0E, 0x0C, 0x41, 0x15, 0xB3, 0x4E, 0x15, + 0xEB, 0x93, 0xA3, 0x86, 0x85, 0x0F, 0xF0, 0x33, 0x3F, 0x17, 0xA1, 0x12, + 0x18, 0x90, 0x2A, 0x03, 0x34, 0x0E, 0xFA, 0x80, 0xBE, 0xE8, 0x0B, 0x10, + 0xF0, 0x8B, 0x08, 0xBC, 0xA1, 0x1E, 0x90, 0x4D, 0x1D, 0x8E, 0x11, 0x26, + 0xE6, 0x87, 0x03, 0x91, 0x51, 0x2D, 0x1F, 0xF4, 0x2C, 0xEF, 0x01, 0x1E, + 0xDA, 0xA1, 0x1E, 0xEA, 0x0D, 0xEF, 0xB8, 0xA1, 0x1B, 0xA8, 0x81, 0x4C, + 0x92, 0x27, 0x79, 0x88, 0x60, 0x16, 0xD6, 0x81, 0x07, 0x15, 0xC4, 0x1E, + 0xAA, 0x21, 0xAB, 0xE4, 0xA1, 0x5B, 0xBA, 0x45, 0x1F, 0x5E, 0xC1, 0x0A, + 0xFE, 0x2D, 0x48, 0xD8, 0x71, 0x7F, 0xEE, 0x4E, 0x49, 0x94, 0x2A, 0x28, + 0x6A, 0xB4, 0x31, 0x99, 0x4C, 0x65, 0x52, 0xEF, 0xB0, 0x98, 0x84, 0x32, + 0x9B, 0x82, 0x32, 0xBB, 0x21, 0x07, 0x30, 0x01, 0x16, 0x9E, 0x64, 0x33, + 0x01, 0x72, 0x14, 0x44, 0xE8, 0x1B, 0x4A, 0x73, 0x0C, 0xB3, 0x61, 0x1B, + 0xB6, 0x41, 0x4C, 0xB2, 0x49, 0x14, 0x68, 0x01, 0x19, 0x38, 0x4B, 0x1B, + 0x66, 0x81, 0x4A, 0xAD, 0x54, 0x5E, 0xE5, 0x04, 0x4B, 0x17, 0x20, 0x0C, + 0xD4, 0xA0, 0x0D, 0xBA, 0x93, 0x10, 0xEA, 0xE0, 0xBA, 0xCA, 0xA0, 0x0E, + 0xC4, 0x80, 0x05, 0x88, 0x33, 0xE6, 0x3A, 0x00, 0x04, 0x02, 0x2D, 0xA1, + 0x1E, 0xA3, 0xCF, 0xF8, 0x8C, 0x50, 0xD8, 0xC6, 0xCE, 0x38, 0xA5, 0x53, + 0xD6, 0xCF, 0x53, 0xF4, 0x46, 0xE5, 0x18, 0xE0, 0x03, 0x12, 0x20, 0x01, + 0x38, 0x40, 0x0F, 0x24, 0xA1, 0x10, 0x1A, 0x0A, 0x50, 0xB1, 0x08, 0x11, + 0xEA, 0xE0, 0x0C, 0xC4, 0xE0, 0x0D, 0xF4, 0x8F, 0x31, 0xFE, 0x06, 0xA1, + 0x54, 0x0C, 0x01, 0x0F, 0xA6, 0xC3, 0x10, 0x32, 0xEA, 0xBB, 0x18, 0xC1, + 0xEA, 0xF8, 0xC0, 0x0E, 0x2E, 0x41, 0x58, 0x66, 0xF1, 0x52, 0x2F, 0x75, + 0x3F, 0xFF, 0x73, 0x53, 0x2B, 0x61, 0x13, 0x1A, 0x81, 0x59, 0x1E, 0x01, + 0x10, 0x6C, 0x60, 0x07, 0x5E, 0xE1, 0x1E, 0xA4, 0x01, 0x1A, 0x28, 0x66, + 0x47, 0x72, 0x4C, 0x55, 0x71, 0x02, 0x55, 0x97, 0x96, 0x55, 0x93, 0xF1, + 0x68, 0x01, 0xCB, 0x47, 0x96, 0xEA, 0x1B, 0xFC, 0x81, 0x14, 0x9E, 0x04, + 0x13, 0x46, 0x41, 0x14, 0xD4, 0x90, 0x2B, 0x70, 0x01, 0x1C, 0xE4, 0x01, + 0x41, 0xEC, 0x23, 0x41, 0xE8, 0xE1, 0x1B, 0x70, 0x01, 0x1B, 0xDC, 0x61, + 0xC1, 0xA0, 0xE2, 0x1E, 0xE2, 0xB1, 0x09, 0x89, 0x0C, 0x5A, 0xF7, 0x6D, + 0x29, 0x4A, 0x8F, 0xC9, 0x78, 0xB4, 0xDF, 0xD4, 0x41, 0x1D, 0x6E, 0x0C, + 0x13, 0x80, 0x40, 0x14, 0x60, 0x0F, 0xF6, 0x62, 0x2F, 0x08, 0x52, 0xE2, + 0x83, 0x1A, 0xA6, 0x1A, 0xE6, 0x40, 0xF7, 0x96, 0x14, 0xE2, 0x66, 0x41, + 0x99, 0xEC, 0x82, 0xB3, 0xD6, 0xA1, 0x83, 0xE6, 0x95, 0x71, 0x79, 0x06, + 0x1F, 0x6C, 0xC0, 0x03, 0xCE, 0xA0, 0x0D, 0x50, 0xE5, 0xBA, 0xCC, 0x00, + 0x71, 0xDA, 0xC0, 0x0C, 0xCE, 0x40, 0x4E, 0xC5, 0x06, 0x04, 0x42, 0xE3, + 0x3A, 0xF5, 0x26, 0x61, 0x03, 0xCA, 0x87, 0xD8, 0xEF, 0x31, 0x3C, 0x23, + 0x04, 0x3E, 0x00, 0xE6, 0x52, 0x17, 0xE6, 0x40, 0xC0, 0xB9, 0xFA, 0x2C, + 0x34, 0x6E, 0x92, 0x01, 0xCA, 0x00, 0xE9, 0xDC, 0x00, 0x0D, 0x06, 0xC1, + 0x4B, 0xE1, 0xEF, 0x10, 0xEA, 0x60, 0x0C, 0xC4, 0x80, 0xE9, 0x06, 0xC1, + 0x0D, 0x30, 0xD2, 0x55, 0x9C, 0x0E, 0xCE, 0x22, 0xC1, 0xEA, 0x84, 0x23, + 0x74, 0x7C, 0xC5, 0xEA, 0x2E, 0x47, 0x74, 0x20, 0x21, 0xD6, 0x18, 0x10, + 0xFE, 0x12, 0x20, 0x61, 0x11, 0x8A, 0xA5, 0x17, 0x1F, 0xC1, 0x0F, 0x52, + 0xC7, 0x11, 0x36, 0x81, 0x13, 0x6A, 0xA0, 0x02, 0x30, 0x81, 0x1B, 0xA8, + 0x81, 0x1A, 0x90, 0xB1, 0x7E, 0xC0, 0x57, 0x55, 0x6F, 0xA9, 0x46, 0x8E, + 0x16, 0x55, 0x55, 0xB5, 0x7C, 0xD3, 0x17, 0x7D, 0x39, 0x30, 0x56, 0xEF, + 0x6E, 0x32, 0x7B, 0x34, 0x1D, 0xA4, 0xB1, 0x1A, 0x7E, 0x81, 0x14, 0x48, + 0x81, 0xC2, 0xBC, 0x81, 0x1E, 0xE4, 0x81, 0x1E, 0xF0, 0x21, 0x1F, 0xDC, + 0x43, 0x5B, 0x9A, 0x00, 0x13, 0xA4, 0x01, 0x1C, 0x04, 0x48, 0xC8, 0x84, + 0x44, 0x64, 0x9C, 0xF5, 0x97, 0x46, 0xB0, 0x6D, 0xF9, 0x4D, 0x0A, 0xDD, + 0xF6, 0xB0, 0x2A, 0x33, 0x6E, 0x4D, 0xF0, 0x1E, 0x60, 0x61, 0x07, 0xAA, + 0x36, 0x14, 0x54, 0x10, 0x80, 0x83, 0xA0, 0x16, 0x60, 0x93, 0x6A, 0xF6, + 0x61, 0x1A, 0xC8, 0xF5, 0x5C, 0x09, 0x77, 0x1A, 0x90, 0xE1, 0x14, 0x54, + 0xA1, 0x66, 0xC4, 0x64, 0x1B, 0x5C, 0xA1, 0x0D, 0x1B, 0x97, 0x85, 0x0B, + 0x63, 0x1F, 0x22, 0xC0, 0x03, 0xEA, 0x40, 0x0D, 0x04, 0x21, 0xD2, 0x06, + 0xA1, 0x0D, 0xAA, 0x48, 0x86, 0xC5, 0x80, 0x34, 0x7A, 0xCB, 0xE5, 0x7C, + 0x4B, 0x89, 0x18, 0xA0, 0x60, 0x27, 0xA5, 0x04, 0x10, 0xB6, 0x88, 0xF8, + 0x8C, 0x05, 0x00, 0x8A, 0x6D, 0x6A, 0x83, 0xD1, 0x84, 0x93, 0x75, 0x25, + 0xB6, 0x89, 0x06, 0x40, 0x01, 0x54, 0x00, 0x55, 0xF4, 0xC0, 0x5F, 0xC3, + 0xD3, 0x0D, 0xD2, 0xD3, 0x10, 0xCE, 0x40, 0xFA, 0xF6, 0xC0, 0x64, 0xAD, + 0xCB, 0x14, 0x2F, 0x4D, 0xB6, 0x4A, 0x0D, 0xA3, 0x8E, 0x97, 0xFF, 0x84, + 0x23, 0x72, 0x14, 0xA1, 0x66, 0x2F, 0x35, 0x17, 0x17, 0xE1, 0x0F, 0x6A, + 0xC0, 0x0F, 0x20, 0x21, 0x75, 0x98, 0xE5, 0x7A, 0x9B, 0x41, 0x0E, 0xD0, + 0xE3, 0x15, 0xAC, 0xFE, 0xA1, 0x68, 0x6F, 0x42, 0x69, 0xE7, 0x27, 0xAF, + 0xF4, 0x58, 0xC7, 0x56, 0x35, 0x7D, 0xE5, 0xC7, 0x7C, 0x01, 0xD9, 0xD7, + 0xD6, 0xB7, 0x7E, 0x98, 0xCC, 0x25, 0x78, 0x02, 0x17, 0x82, 0x95, 0x1E, + 0xC8, 0x01, 0x1C, 0xC0, 0x36, 0x1F, 0xD0, 0xC1, 0x15, 0x7E, 0x90, 0x56, + 0x87, 0x0C, 0x98, 0x68, 0xF4, 0x7F, 0xF4, 0xAD, 0x46, 0xA9, 0xC2, 0x1E, + 0x1F, 0xB8, 0x1D, 0x2A, 0x93, 0x32, 0x9B, 0x8C, 0x32, 0xD5, 0x61, 0x5B, + 0x9F, 0xA4, 0x09, 0x20, 0x4B, 0x08, 0x8A, 0xA0, 0x08, 0xF0, 0x01, 0x9C, + 0x74, 0x21, 0x14, 0x94, 0xD4, 0x4B, 0x10, 0x92, 0xE0, 0x96, 0x46, 0x4C, + 0xB6, 0xAC, 0x15, 0x56, 0xB8, 0x85, 0x73, 0x39, 0x30, 0x2A, 0x20, 0x86, + 0xD1, 0xE0, 0xBA, 0x0E, 0x21, 0x12, 0xF4, 0x00, 0x0D, 0xDA, 0x60, 0xFE, + 0xC4, 0x60, 0x0C, 0xEC, 0x26, 0xD0, 0x96, 0xE8, 0x6F, 0x98, 0x73, 0xFD, + 0x14, 0x80, 0x50, 0x42, 0xA3, 0x53, 0x7E, 0x8B, 0x04, 0x7C, 0x68, 0x9E, + 0xB8, 0x2F, 0xD0, 0x14, 0x56, 0x52, 0x9A, 0x08, 0x25, 0x23, 0x76, 0x00, + 0x4A, 0xA3, 0x0E, 0xF0, 0xA0, 0x0D, 0xC2, 0x20, 0x0F, 0xCA, 0x13, 0x0F, + 0x0C, 0x41, 0xFE, 0xF4, 0x20, 0x0C, 0xC8, 0x73, 0x0F, 0xF4, 0xA0, 0x3B, + 0x9F, 0xEE, 0xE8, 0x12, 0x21, 0x11, 0x54, 0x85, 0x8C, 0x61, 0xF6, 0x0E, + 0x42, 0xA7, 0x38, 0xAE, 0x83, 0x79, 0x6D, 0x16, 0x7A, 0xEF, 0xC0, 0x12, + 0xA2, 0xA3, 0x01, 0xE3, 0x98, 0x8E, 0x9C, 0xC1, 0x11, 0x24, 0xA0, 0x02, + 0x3E, 0xE1, 0x15, 0xA8, 0xC1, 0x1D, 0x74, 0xAC, 0x27, 0x2C, 0x06, 0x7C, + 0xFD, 0x58, 0x7C, 0xE9, 0x2A, 0x69, 0x99, 0xB6, 0x55, 0xD9, 0xF7, 0x31, + 0xB9, 0x21, 0x91, 0xE0, 0x81, 0x1E, 0xF2, 0x97, 0x7F, 0xF3, 0x01, 0x58, + 0x45, 0xA1, 0x1A, 0xD4, 0x81, 0x1B, 0xFE, 0x64, 0x24, 0x49, 0x90, 0x30, + 0x32, 0x1D, 0x33, 0x0A, 0x5D, 0x86, 0x81, 0xAB, 0x55, 0xA5, 0x1F, 0x98, + 0xA5, 0xDD, 0xA1, 0x1D, 0xD2, 0xE1, 0xDF, 0x46, 0xE1, 0x06, 0x3E, 0x61, + 0x14, 0x9E, 0x44, 0x15, 0x32, 0x13, 0x08, 0x12, 0x4E, 0xB5, 0xA4, 0xA6, + 0x61, 0x74, 0xE1, 0x13, 0x60, 0x79, 0xF7, 0xFC, 0xC1, 0x84, 0x5B, 0xC1, + 0x15, 0xDC, 0xF5, 0xE2, 0xCE, 0x4C, 0x97, 0x93, 0x1A, 0x30, 0xF6, 0xE1, + 0x06, 0x3C, 0x40, 0x0F, 0xC6, 0xA0, 0x10, 0xD8, 0xB9, 0x4F, 0xDB, 0x40, + 0x0C, 0xD4, 0x20, 0xFA, 0xD4, 0x40, 0x0C, 0x5E, 0x40, 0x10, 0x5D, 0xCE, + 0xE5, 0x06, 0x27, 0x01, 0x1A, 0x00, 0xAC, 0x4F, 0x40, 0x06, 0x3A, 0x37, + 0xE6, 0xC2, 0x20, 0x04, 0x3A, 0x40, 0x06, 0x06, 0xEA, 0xB7, 0x3A, 0x60, + 0x6D, 0xAE, 0x59, 0x9B, 0x09, 0x71, 0x00, 0x12, 0x60, 0xA1, 0x24, 0x63, + 0x0C, 0xDC, 0x20, 0x0C, 0xC4, 0xE0, 0x10, 0xE4, 0x8F, 0x8B, 0xED, 0xC0, + 0x0D, 0x50, 0x6E, 0xD2, 0xBC, 0xD8, 0x50, 0x07, 0x21, 0x12, 0x10, 0x21, + 0x3C, 0x9D, 0x2E, 0x11, 0x0A, 0x41, 0x11, 0x0A, 0xE1, 0x0E, 0xF2, 0x80, + 0x0F, 0x12, 0x81, 0x12, 0x14, 0x81, 0x12, 0xEE, 0x33, 0x9F, 0x99, 0xD7, + 0x12, 0xFA, 0xA0, 0x0F, 0x52, 0xAA, 0x2A, 0x3B, 0x21, 0xD6, 0x34, 0x3B, + 0x75, 0xB0, 0xF7, 0x07, 0x22, 0x20, 0x08, 0x54, 0x01, 0x1A, 0x5C, 0xBA, + 0x8F, 0xF5, 0x38, 0xF3, 0x7A, 0x42, 0x69, 0x1B, 0xDA, 0x7C, 0xF7, 0xD8, + 0xA1, 0x25, 0x1A, 0x7D, 0x17, 0x7A, 0x90, 0x8D, 0xE2, 0x1E, 0xD2, 0x81, + 0x6B, 0xC1, 0x01, 0x1C, 0xF6, 0x57, 0x1E, 0xD0, 0x81, 0x14, 0x46, 0xE1, + 0x15, 0xD2, 0xA1, 0x1F, 0x90, 0x04, 0x09, 0x83, 0xAC, 0x6D, 0x09, 0xC8, + 0xF4, 0x88, 0x9B, 0x93, 0xA7, 0x90, 0x47, 0x43, 0x79, 0xFE, 0xA5, 0xE3, + 0x36, 0x08, 0xA3, 0x01, 0x07, 0x30, 0x01, 0xB2, 0x30, 0xA1, 0x15, 0x8A, + 0xC0, 0x2B, 0x48, 0x01, 0x9C, 0xAE, 0x86, 0x16, 0x7E, 0xBA, 0x5C, 0xD9, + 0x62, 0x1B, 0xFC, 0x41, 0x83, 0xA8, 0xAA, 0x96, 0x2F, 0x0E, 0x97, 0x95, + 0x9A, 0xBC, 0x19, 0xA4, 0xA9, 0xF1, 0x00, 0x0E, 0x30, 0xB2, 0x0E, 0xFA, + 0x74, 0x23, 0xD5, 0xC0, 0x0D, 0x2E, 0x81, 0x98, 0x19, 0x85, 0x01, 0x58, + 0x12, 0x70, 0xFA, 0xAC, 0x01, 0x3C, 0xC0, 0xD0, 0xE6, 0x34, 0x12, 0x99, + 0x73, 0x05, 0xC2, 0x00, 0x05, 0x9A, 0xE8, 0x88, 0x65, 0x80, 0x50, 0xFA, + 0x2C, 0xE5, 0x18, 0x20, 0x04, 0x6C, 0x6B, 0x01, 0xF2, 0x34, 0x01, 0x14, + 0xE0, 0x6C, 0x88, 0xCB, 0x0C, 0x72, 0x63, 0x23, 0xCD, 0x60, 0x63, 0xD7, + 0xE0, 0x12, 0xEA, 0x80, 0x0C, 0xDA, 0x60, 0xD2, 0x76, 0xF2, 0x0D, 0x08, + 0x01, 0x9E, 0x0F, 0xE1, 0x71, 0x18, 0xF5, 0x37, 0x26, 0x0A, 0xA3, 0xBE, + 0x08, 0xB2, 0x8B, 0x23, 0x3F, 0xD5, 0xB8, 0x12, 0xB8, 0xA3, 0x0F, 0xEE, + 0xA0, 0x0F, 0x2E, 0xB5, 0x19, 0x3A, 0x3B, 0x8E, 0x67, 0x4A, 0x0E, 0x24, + 0x40, 0x07, 0xEA, 0x32, 0x19, 0xFA, 0xA1, 0x66, 0x9A, 0xE4, 0x68, 0x51, + 0x3B, 0xB5, 0x77, 0xBC, 0xA1, 0x4D, 0xFB, 0x8F, 0x01, 0x99, 0xB5, 0x17, + 0xBA, 0x7C, 0x95, 0xB6, 0x30, 0xED, 0x81, 0x5C, 0xB6, 0x85, 0x1E, 0xF6, + 0x81, 0x1C, 0x5E, 0x61, 0x14, 0x42, 0x3A, 0x1D, 0x2E, 0x79, 0xB8, 0x91, + 0x0C, 0x82, 0xA5, 0x10, 0x6E, 0x1F, 0xF8, 0x6D, 0xD9, 0x01, 0xEF, 0x90, + 0x3B, 0xCA, 0x45, 0x79, 0x94, 0xEB, 0xE1, 0x49, 0x94, 0xC6, 0x6A, 0x77, + 0x00, 0x08, 0x84, 0x20, 0x5E, 0x3F, 0xA8, 0x16, 0x4E, 0xC1, 0x34, 0xCD, + 0xF5, 0xE1, 0xAC, 0x49, 0x6F, 0x6B, 0x39, 0x1B, 0x5E, 0xB3, 0xBC, 0xE7, + 0xFE, 0xDC, 0x2C, 0x74, 0xC0, 0x01, 0xCC, 0x40, 0x0D, 0x6A, 0xD7, 0x0D, + 0x06, 0x3B, 0xD2, 0xF0, 0xA0, 0x0C, 0xF0, 0x5C, 0x0D, 0xD2, 0xC0, 0x6F, + 0x08, 0x71, 0x04, 0x54, 0x20, 0x04, 0xD8, 0xCF, 0xE5, 0x08, 0xB1, 0x0F, + 0x9D, 0xB3, 0x4F, 0xFA, 0xDB, 0x4F, 0xD2, 0x80, 0x9F, 0xFC, 0xA4, 0x03, + 0x4E, 0x03, 0x04, 0x42, 0x40, 0x4F, 0x26, 0x31, 0xAE, 0x07, 0x80, 0x03, + 0x58, 0x23, 0x9D, 0x5D, 0xA0, 0x0C, 0xB8, 0xD8, 0x0C, 0x36, 0x51, 0x0D, + 0x48, 0xC5, 0xA1, 0xF0, 0x95, 0x10, 0x4C, 0xF6, 0x10, 0x0E, 0x61, 0xBB, + 0x4A, 0x0E, 0x9E, 0xA5, 0x0E, 0xA3, 0x42, 0xBC, 0xB1, 0x27, 0xC1, 0x38, + 0x26, 0xE1, 0x79, 0x6B, 0xB6, 0x0F, 0x20, 0x21, 0x40, 0xF9, 0xB9, 0x66, + 0x01, 0x1A, 0xC6, 0x39, 0x21, 0x10, 0x6E, 0x20, 0x08, 0x9A, 0xA7, 0x14, + 0x48, 0x41, 0x1A, 0xBC, 0xA1, 0x1B, 0xD4, 0x21, 0xAF, 0x60, 0xFB, 0x8F, + 0x07, 0x39, 0x90, 0x77, 0x3C, 0x55, 0x4D, 0x9B, 0xC7, 0xA3, 0xDD, 0xC7, + 0xEC, 0x01, 0x17, 0x6E, 0x07, 0x1B, 0x2E, 0x4C, 0x1D, 0xD2, 0x81, 0x31, + 0xE1, 0x71, 0xCA, 0x89, 0x7B, 0xDB, 0xB1, 0xB5, 0xDF, 0x98, 0x4C, 0xB9, + 0xE9, 0xB1, 0x5A, 0xC5, 0x7D, 0x32, 0x27, 0x13, 0xD9, 0x5B, 0xC1, 0x07, + 0x9C, 0x4D, 0xBA, 0x1B, 0x28, 0xAE, 0xC2, 0xE9, 0x6A, 0x6A, 0x41, 0x14, + 0x76, 0x6F, 0xF7, 0x7A, 0xAF, 0x15, 0x46, 0x41, 0x15, 0x96, 0x81, 0xB3, + 0x52, 0x78, 0xBC, 0xE9, 0x5C, 0xA9, 0x83, 0xC0, 0x01, 0x40, 0xAE, 0x0C, + 0xF2, 0x80, 0x37, 0x1D, 0xAA, 0x3B, 0xC1, 0x19, 0xCF, 0x2F, 0x21, 0xAB, + 0x15, 0xC0, 0xE5, 0x28, 0xA5, 0x0F, 0x91, 0xCB, 0x01, 0x08, 0xD6, 0x52, + 0x56, 0xA0, 0xFA, 0xDE, 0x06, 0x9F, 0x78, 0x28, 0x88, 0xFA, 0xC9, 0xFC, + 0x3E, 0x80, 0x05, 0xFE, 0x24, 0x51, 0x01, 0x46, 0x24, 0x01, 0x5C, 0x40, + 0x0C, 0x60, 0x2B, 0xAB, 0x8B, 0x32, 0x0C, 0x32, 0xD7, 0x05, 0x2C, 0xB7, + 0x37, 0xDB, 0x60, 0x10, 0x8E, 0x2E, 0x12, 0x0E, 0xA1, 0x54, 0xF4, 0xA0, + 0x54, 0x0E, 0x5B, 0x14, 0xBD, 0x08, 0x8B, 0xD6, 0x40, 0x0F, 0x0A, 0x21, + 0x12, 0x18, 0x81, 0x12, 0x6A, 0xBD, 0x12, 0x2A, 0xDB, 0x57, 0x6E, 0x3D, + 0x0E, 0x76, 0x7D, 0xB3, 0x61, 0x7C, 0xA6, 0x7E, 0x76, 0x06, 0x82, 0x80, + 0x08, 0x30, 0x21, 0x14, 0xAA, 0x61, 0x1A, 0xA8, 0x81, 0x1D, 0xA4, 0x1D, + 0xDA, 0x97, 0xFD, 0xA1, 0xCF, 0x57, 0x2D, 0x7B, 0x5C, 0xDA, 0x7D, 0x5C, + 0x7F, 0x76, 0xC4, 0x78, 0x7E, 0x61, 0x14, 0x6A, 0x21, 0xDC, 0xA3, 0x75, + 0x1E, 0x8F, 0xDB, 0x81, 0xC5, 0x7D, 0x98, 0xCA, 0xFD, 0x5A, 0xC9, 0xFD, + 0x7D, 0x1F, 0xF8, 0xDC, 0x61, 0xDA, 0xD8, 0x06, 0x2F, 0xF6, 0x50, 0xB9, + 0x08, 0x9A, 0x80, 0x95, 0xC5, 0xE9, 0x15, 0xD4, 0x7C, 0xBB, 0x99, 0x74, + 0x16, 0x6A, 0xE1, 0x13, 0x5A, 0x21, 0xBC, 0x5B, 0xC1, 0x99, 0xFC, 0xDD, + 0xDF, 0x89, 0x60, 0x00, 0x56, 0x40, 0x0C, 0xC4, 0xC0, 0x0D, 0xDC, 0xA0, + 0x0C, 0xDC, 0x60, 0x86, 0x0F, 0x67, 0x3C, 0xC3, 0x19, 0x26, 0x01, 0x11, + 0xE6, 0x56, 0x72, 0x53, 0x34, 0xA5, 0x74, 0x4B, 0x23, 0x05, 0xCE, 0x5A, + 0x88, 0x68, 0xAE, 0x74, 0x09, 0xB6, 0x53, 0x8E, 0x2B, 0x88, 0x7A, 0x6E, + 0x00, 0x46, 0x5F, 0x05, 0xD2, 0x80, 0x52, 0xE0, 0x49, 0x05, 0x40, 0x56, + 0x87, 0x5F, 0x60, 0x0C, 0x50, 0x40, 0x0C, 0xF0, 0x60, 0x0C, 0x2E, 0x81, + 0x9D, 0x11, 0x41, 0x12, 0x08, 0xC1, 0x0D, 0x68, 0xF8, 0xE8, 0x76, 0x72, + 0xBB, 0xE0, 0x39, 0x0F, 0xD0, 0xAB, 0x55, 0x8A, 0x23, 0xB2, 0x2B, 0x61, + 0x12, 0x2C, 0x21, 0xC5, 0xED, 0x00, 0xFE, 0x12, 0xB6, 0xE3, 0xB2, 0x31, + 0xB5, 0x19, 0x5C, 0xBC, 0x12, 0x96, 0xBF, 0x19, 0x8E, 0xA1, 0x19, 0x9A, + 0x21, 0x0E, 0x22, 0xC0, 0x06, 0x66, 0xE0, 0x08, 0x8C, 0x20, 0x16, 0xB2, + 0xE1, 0x32, 0xEB, 0xA7, 0xB5, 0xB5, 0xDE, 0xA1, 0xF7, 0xD8, 0xD9, 0xC5, + 0x37, 0xDA, 0x93, 0x5D, 0xB6, 0x63, 0xF4, 0x1E, 0xD4, 0xA1, 0x2D, 0x66, + 0x3B, 0xCA, 0xC5, 0x9E, 0x93, 0x8B, 0x3B, 0x2A, 0xD2, 0x5E, 0xF5, 0xC6, + 0x3D, 0xA5, 0x9B, 0x22, 0xDB, 0xCF, 0x5E, 0xB9, 0xDF, 0x77, 0x32, 0x47, + 0x10, 0xDD, 0xF3, 0xCE, 0x1D, 0x30, 0x21, 0xB4, 0x41, 0x01, 0x20, 0x9A, + 0x88, 0x1A, 0x05, 0xA4, 0x48, 0x11, 0x6F, 0xFA, 0x12, 0x2A, 0x5C, 0xC8, + 0xB0, 0xA1, 0xC3, 0x87, 0x0B, 0x69, 0x89, 0xDA, 0x06, 0x4D, 0x9B, 0xB6, + 0x6C, 0x18, 0xB3, 0x69, 0x9B, 0x35, 0xEB, 0x53, 0x2B, 0x7F, 0xCB, 0x2E, + 0xBA, 0x7A, 0x07, 0xB1, 0xA4, 0xC9, 0x93, 0x28, 0x53, 0xAA, 0x5C, 0xC9, + 0x92, 0xE1, 0xBE, 0x96, 0x0A, 0x5F, 0x62, 0x1A, 0xA0, 0xC2, 0xCC, 0x25, + 0x35, 0x6E, 0xCE, 0xE0, 0xD4, 0x23, 0x08, 0x4F, 0x1D, 0x9F, 0x7A, 0xCE, + 0xBC, 0x08, 0xC3, 0x60, 0x04, 0x03, 0x06, 0x1D, 0x4E, 0x74, 0x40, 0x4A, + 0x22, 0x04, 0x89, 0x13, 0x1C, 0x4E, 0x84, 0x51, 0x41, 0x42, 0x45, 0x0A, + 0x12, 0x20, 0x56, 0x90, 0xE8, 0x30, 0xC2, 0xC3, 0x08, 0x10, 0x0C, 0x38, + 0x8C, 0x08, 0xB1, 0x40, 0xEC, 0x82, 0x04, 0x01, 0x02, 0x14, 0x75, 0x81, + 0xC2, 0x2A, 0x83, 0x30, 0x67, 0x4E, 0x98, 0x71, 0xD1, 0xC2, 0x4C, 0x98, + 0x3A, 0x61, 0xD4, 0xE0, 0xD1, 0x43, 0xA8, 0x90, 0x20, 0x37, 0x7A, 0xF8, + 0x26, 0x12, 0x54, 0x67, 0x4F, 0x24, 0x4A, 0x89, 0xEC, 0xAC, 0xA9, 0x33, + 0x69, 0x52, 0x22, 0x3E, 0x8C, 0x26, 0x55, 0xAA, 0x04, 0xFE, 0x69, 0xF2, + 0x9D, 0x4A, 0x7D, 0xE2, 0x40, 0xEA, 0x33, 0x79, 0x72, 0xB3, 0x66, 0x95, + 0x40, 0x7F, 0x06, 0x7D, 0xCC, 0x19, 0x20, 0x13, 0x36, 0x6C, 0x10, 0x78, + 0x10, 0x64, 0x94, 0xAA, 0x6C, 0xDE, 0xD4, 0xDD, 0xAB, 0xD7, 0x2E, 0x9D, + 0x3B, 0x76, 0xE9, 0xEA, 0xD5, 0xBB, 0xC7, 0xDB, 0x5E, 0x6F, 0xDE, 0xBF, + 0x81, 0xFB, 0xBE, 0x37, 0x1C, 0xF8, 0x6E, 0xE3, 0xBA, 0x67, 0xEB, 0x5E, + 0x5E, 0xCF, 0xDD, 0xF1, 0x74, 0xEA, 0x9C, 0xBB, 0x9B, 0x4E, 0x9D, 0x7A, + 0x73, 0xE9, 0xB7, 0xD9, 0x69, 0x67, 0xE7, 0x2E, 0x9D, 0xF6, 0xE9, 0xB6, + 0xA7, 0x6F, 0x17, 0xDF, 0xDD, 0xB6, 0xBA, 0xE8, 0xDF, 0xB3, 0x6F, 0xC7, + 0xAD, 0x1D, 0xBA, 0x3A, 0xF7, 0xD3, 0x76, 0x7C, 0xFA, 0x24, 0x0A, 0x53, + 0x2B, 0x83, 0x45, 0x6A, 0xC1, 0xDC, 0xFF, 0x92, 0xD6, 0xA9, 0x6D, 0xD5, + 0x50, 0xB3, 0x0D, 0x46, 0xDA, 0x50, 0x33, 0x0D, 0x2D, 0xB5, 0xA8, 0xA2, + 0x4A, 0x32, 0xD3, 0x64, 0xB3, 0x8D, 0x2A, 0x24, 0xED, 0x27, 0xE1, 0x84, + 0x14, 0x56, 0x68, 0x61, 0x49, 0xA2, 0x0C, 0xF0, 0x41, 0x19, 0x62, 0x98, + 0x21, 0x86, 0x1B, 0x6A, 0x98, 0xE1, 0x86, 0x20, 0x7A, 0x00, 0x86, 0x47, + 0x1B, 0x78, 0x88, 0x21, 0x06, 0x09, 0x0C, 0xC8, 0x40, 0xC2, 0x08, 0x4B, + 0xB5, 0xB8, 0x14, 0x07, 0x54, 0x85, 0x00, 0x02, 0x09, 0x2F, 0xBC, 0x48, + 0x55, 0x18, 0x2D, 0x8C, 0x40, 0x82, 0x08, 0x58, 0x71, 0x50, 0x94, 0x02, + 0x0E, 0x30, 0x90, 0xC2, 0x08, 0x0E, 0x0C, 0x10, 0xC0, 0x00, 0x24, 0xA4, + 0x20, 0x06, 0x0A, 0x24, 0xAC, 0x30, 0x42, 0x0A, 0x65, 0xA4, 0x10, 0x46, + 0x09, 0x29, 0xF8, 0x74, 0x46, 0x5E, 0x7B, 0x05, 0x46, 0xC8, 0x21, 0x81, + 0x15, 0x32, 0x88, 0x1E, 0x85, 0x48, 0x12, 0xC9, 0x1E, 0x76, 0xD8, 0xB1, + 0xFE, 0x47, 0x22, 0x89, 0x14, 0x52, 0x07, 0x1F, 0x8D, 0x51, 0xD2, 0xD9, + 0x22, 0x96, 0x3C, 0x72, 0x09, 0x24, 0x9B, 0x55, 0xF2, 0x48, 0x67, 0xA0, + 0x85, 0x56, 0x49, 0x27, 0xCD, 0x6C, 0x52, 0x1A, 0x27, 0x9C, 0x1C, 0x23, + 0x87, 0x09, 0x22, 0x98, 0x80, 0x5A, 0x0D, 0x73, 0xC0, 0x42, 0x8D, 0x3B, + 0xED, 0xD4, 0x03, 0x8F, 0x3D, 0xD4, 0xB0, 0x83, 0x8F, 0x3D, 0xF6, 0xD4, + 0x83, 0x29, 0x70, 0xC4, 0x75, 0xCA, 0xE9, 0xA7, 0xC7, 0xCD, 0xA6, 0x1C, + 0x73, 0xA4, 0xEA, 0x56, 0xDD, 0x75, 0xD4, 0x71, 0xA7, 0x2A, 0x3B, 0xF5, + 0xB0, 0xBA, 0x1E, 0x77, 0xB7, 0xA5, 0x4A, 0x9D, 0x6D, 0xB4, 0xAA, 0x17, + 0x9E, 0x77, 0xB1, 0xC2, 0xDA, 0x5E, 0x74, 0xE9, 0xF4, 0xCA, 0xCE, 0x79, + 0xBF, 0x76, 0x73, 0x0F, 0x26, 0x43, 0xD4, 0x37, 0x0A, 0x2C, 0x98, 0x14, + 0x11, 0x04, 0x26, 0x11, 0x5E, 0x88, 0x92, 0x44, 0xDB, 0x4C, 0x33, 0x60, + 0x46, 0x18, 0xCD, 0x22, 0x8A, 0x2A, 0xA2, 0xC8, 0xE2, 0x8F, 0x45, 0xA4, + 0xE0, 0xE3, 0xEC, 0xB7, 0xE0, 0x86, 0x2B, 0xAE, 0x3E, 0xAE, 0x0C, 0xD0, + 0x81, 0x87, 0x76, 0xB9, 0x81, 0xC7, 0x18, 0x78, 0xE0, 0xA1, 0x2E, 0x88, + 0x3D, 0x09, 0xB5, 0x14, 0x09, 0x24, 0x70, 0xC0, 0x41, 0x90, 0x47, 0xDD, + 0x3B, 0x65, 0x08, 0x1C, 0x88, 0xA1, 0x42, 0x07, 0x2A, 0xAC, 0x70, 0x42, + 0xC0, 0x2C, 0x74, 0xE0, 0x01, 0x57, 0x1C, 0x90, 0xC5, 0x00, 0x8B, 0x23, + 0x70, 0xE0, 0xC0, 0x92, 0x03, 0x9C, 0xD0, 0x82, 0x0A, 0x25, 0x08, 0x3C, + 0xC2, 0x08, 0x2D, 0x9C, 0xA0, 0x46, 0x0A, 0x2B, 0xD4, 0x71, 0x46, 0x19, + 0x3A, 0xB5, 0xE1, 0xC6, 0x20, 0x82, 0x10, 0x42, 0x88, 0x1E, 0x7B, 0xD5, + 0xA1, 0xC7, 0x1E, 0x75, 0xD4, 0xB1, 0x86, 0x21, 0x89, 0x1C, 0x32, 0x48, + 0x1E, 0x77, 0x20, 0xFE, 0x32, 0x89, 0x25, 0x92, 0x4D, 0x72, 0x47, 0x1F, + 0x8A, 0x6C, 0xC6, 0x99, 0x1F, 0x8E, 0xE8, 0x09, 0x49, 0x27, 0x7E, 0x3A, + 0x62, 0x49, 0x27, 0x80, 0x6E, 0x32, 0xDA, 0x31, 0xCD, 0x1C, 0x03, 0x08, + 0x1D, 0x72, 0xFC, 0x90, 0xDA, 0x0F, 0x41, 0xC0, 0xB2, 0x4F, 0x3D, 0xEA, + 0xAC, 0xA3, 0x8D, 0x2C, 0xD9, 0x4C, 0xA3, 0xCC, 0x3D, 0x59, 0x5F, 0xFD, + 0xE9, 0xD8, 0xBC, 0x25, 0xB7, 0xDB, 0xD9, 0xA3, 0x92, 0xEA, 0x1C, 0x77, + 0xA8, 0x56, 0xE7, 0x76, 0xAA, 0xDF, 0xE9, 0xAA, 0xAA, 0x78, 0xB8, 0x65, + 0xD7, 0x5D, 0x79, 0xB0, 0x82, 0xE7, 0x1D, 0xAC, 0x7B, 0x73, 0xA7, 0xCE, + 0x76, 0xD0, 0xF5, 0xEA, 0x1E, 0x3B, 0xC8, 0xE8, 0x70, 0xCA, 0xB5, 0x98, + 0x9C, 0xB2, 0x43, 0x10, 0x42, 0xBC, 0x32, 0xEE, 0x43, 0xF9, 0xE8, 0xE3, + 0xDF, 0x36, 0x17, 0x6D, 0xC3, 0x0D, 0xB5, 0xB0, 0xB8, 0xD2, 0x4A, 0x2B, + 0xB2, 0xD4, 0x62, 0x91, 0x28, 0xFC, 0x3C, 0x2E, 0xFA, 0xE8, 0xA4, 0x37, + 0xF4, 0x52, 0x2D, 0x03, 0x34, 0x70, 0x49, 0x18, 0x65, 0xB0, 0xB0, 0x97, + 0x19, 0x6D, 0x10, 0x86, 0x87, 0x1A, 0x7A, 0xE9, 0xA1, 0xC6, 0x25, 0x17, + 0x77, 0x70, 0x64, 0x58, 0x1C, 0xC8, 0xD0, 0x80, 0x8F, 0xFA, 0x76, 0x10, + 0xC2, 0x94, 0x2B, 0xA8, 0x70, 0xC2, 0x0A, 0x1D, 0xA0, 0x90, 0x82, 0x0A, + 0x1C, 0xA0, 0x00, 0xE5, 0xC5, 0x47, 0x85, 0xD5, 0x00, 0x03, 0x0B, 0x28, + 0xB9, 0x40, 0x0A, 0x57, 0xB5, 0x20, 0xD6, 0x08, 0x25, 0x84, 0x91, 0xC2, + 0x25, 0x69, 0x94, 0xD1, 0x82, 0x18, 0x75, 0x98, 0xD1, 0x6E, 0x60, 0xB3, + 0x97, 0xE8, 0x86, 0x1B, 0x32, 0x9F, 0xAC, 0x47, 0x24, 0x88, 0xA0, 0x9C, + 0x47, 0x21, 0x8D, 0x25, 0x22, 0xA7, 0xCE, 0x90, 0x28, 0xB2, 0x08, 0x24, + 0x77, 0x40, 0xD2, 0xC8, 0xFE, 0x8F, 0xFE, 0xD8, 0x13, 0xD2, 0x88, 0xD6, + 0x89, 0x47, 0x0C, 0x70, 0x34, 0x9F, 0x71, 0x86, 0xD3, 0x00, 0xA1, 0x89, + 0xA8, 0xFD, 0xC0, 0x04, 0x12, 0x08, 0xC5, 0x28, 0x7A, 0xC0, 0x83, 0x1E, + 0xE4, 0x80, 0x07, 0x4D, 0xB0, 0x82, 0x27, 0x9A, 0x70, 0x03, 0x5A, 0xE8, + 0xE3, 0x38, 0xC9, 0x19, 0x9B, 0xD9, 0xD2, 0xA6, 0x1B, 0x56, 0x99, 0xAA, + 0x55, 0x25, 0x7C, 0x5B, 0xDE, 0x62, 0x25, 0xAB, 0x55, 0xA5, 0x87, 0x85, + 0xDC, 0xE9, 0x55, 0xAE, 0x64, 0x68, 0xB7, 0xF2, 0xE0, 0x6A, 0x3C, 0xDD, + 0xC1, 0x4D, 0xAF, 0xDE, 0x73, 0x1E, 0x75, 0x74, 0xA3, 0x1B, 0xEC, 0x00, + 0x02, 0x26, 0x54, 0xE1, 0x09, 0x4C, 0x88, 0x42, 0x59, 0x44, 0xC0, 0x44, + 0xE8, 0x4A, 0x97, 0x90, 0xC8, 0xD5, 0xE2, 0x3F, 0x17, 0x71, 0x10, 0xE6, + 0x60, 0xA1, 0x0A, 0x57, 0xCC, 0x22, 0x19, 0x18, 0x19, 0x05, 0x3C, 0x98, + 0xC8, 0xC5, 0x2E, 0x82, 0xEB, 0x19, 0x0E, 0x70, 0x80, 0x56, 0x4E, 0x70, + 0x02, 0xC0, 0xB8, 0xA1, 0x0C, 0x28, 0x2B, 0xC3, 0x89, 0xDA, 0xD0, 0x86, + 0x33, 0xB4, 0x41, 0x0C, 0x2B, 0x60, 0x40, 0x08, 0x56, 0xD0, 0x80, 0xEB, + 0x5D, 0x8C, 0x03, 0x4B, 0xE9, 0x40, 0xC2, 0x9E, 0x72, 0x82, 0x14, 0xB4, + 0x05, 0x46, 0x23, 0x90, 0xC1, 0x08, 0x4E, 0xF0, 0x81, 0x10, 0x2C, 0xEC, + 0x48, 0x66, 0x49, 0x80, 0x03, 0x14, 0x90, 0x96, 0x01, 0x8C, 0xC0, 0x05, + 0xF4, 0x52, 0xC1, 0x02, 0x46, 0x20, 0x25, 0x15, 0xF8, 0x88, 0x63, 0x43, + 0xC9, 0x0B, 0xEC, 0xF4, 0x30, 0x88, 0x32, 0x78, 0x12, 0x0F, 0x83, 0x38, + 0x44, 0xFC, 0xF0, 0x50, 0x88, 0x48, 0x1C, 0x22, 0x0F, 0x76, 0xE0, 0x43, + 0x22, 0x22, 0x31, 0x89, 0xC8, 0x54, 0x62, 0x12, 0x8A, 0xA8, 0x84, 0x1F, + 0xF8, 0xC0, 0x3F, 0x4B, 0x50, 0x66, 0x7F, 0x9D, 0xF1, 0xFE, 0xD3, 0x00, + 0x91, 0x16, 0xA8, 0xCF, 0x1C, 0x43, 0x50, 0x9C, 0xF8, 0x01, 0x20, 0x86, + 0x09, 0x08, 0x39, 0xF8, 0x00, 0x01, 0x3D, 0xE8, 0x01, 0x13, 0x96, 0x79, + 0x8B, 0x5C, 0xDC, 0xA2, 0x99, 0x56, 0x90, 0x80, 0xD5, 0xEA, 0xB1, 0x8F, + 0x7D, 0x28, 0x87, 0x53, 0x67, 0x2B, 0x95, 0xDA, 0x9C, 0x53, 0x42, 0x56, + 0xBD, 0xED, 0x9B, 0xAF, 0xC2, 0xA1, 0xDC, 0xC2, 0x13, 0xCE, 0xBA, 0xDD, + 0x2D, 0x86, 0xE1, 0x81, 0x61, 0x7B, 0x74, 0xB8, 0x43, 0xC1, 0x75, 0x43, + 0x1D, 0xA1, 0xB8, 0x00, 0x26, 0x30, 0x31, 0x8A, 0x53, 0x60, 0x42, 0x08, + 0x02, 0x71, 0x9C, 0x17, 0xC9, 0xF5, 0x1F, 0x6B, 0x48, 0x31, 0x1B, 0xFE, + 0x9C, 0x46, 0x2D, 0x6A, 0xF1, 0x09, 0x58, 0x70, 0x44, 0x1B, 0xC9, 0x08, + 0x45, 0xB3, 0xF6, 0x09, 0x91, 0x97, 0x30, 0xF4, 0xA1, 0x09, 0xD9, 0xC7, + 0x31, 0xAA, 0x47, 0xAF, 0x13, 0xA4, 0xA1, 0x8D, 0xEB, 0x03, 0x51, 0x19, + 0xE2, 0xD5, 0x06, 0xD8, 0xB1, 0xC0, 0x05, 0x0D, 0x4B, 0x41, 0x07, 0xE8, + 0xD5, 0x01, 0xED, 0x21, 0x25, 0x29, 0x1F, 0x50, 0xC1, 0x25, 0xAE, 0xB2, + 0x02, 0x8E, 0xC9, 0x00, 0x60, 0x0D, 0x53, 0x01, 0x08, 0xB8, 0x32, 0xA5, + 0x86, 0x71, 0x20, 0x01, 0x03, 0xC0, 0x29, 0x00, 0x02, 0xE0, 0x80, 0x3E, + 0x52, 0x52, 0x05, 0x45, 0x21, 0x41, 0x18, 0xE8, 0xC5, 0x81, 0x16, 0xBC, + 0xC0, 0x05, 0x1C, 0x6B, 0x01, 0x1B, 0x09, 0x91, 0x07, 0x31, 0xB0, 0x40, + 0x27, 0xF3, 0x6B, 0x17, 0x21, 0x06, 0x53, 0x87, 0x3C, 0x20, 0x42, 0x94, + 0x92, 0x98, 0xC4, 0x61, 0x28, 0x01, 0x19, 0x4B, 0xC4, 0xD2, 0x10, 0x9C, + 0x11, 0xDA, 0xD0, 0x88, 0xF6, 0x27, 0xA4, 0x55, 0x62, 0x13, 0x03, 0x54, + 0x9A, 0x2F, 0x09, 0xF5, 0x03, 0x4D, 0x70, 0x02, 0x10, 0x9C, 0x90, 0xC3, + 0xFE, 0x05, 0xAF, 0x70, 0x85, 0x5B, 0x08, 0x63, 0x18, 0xC1, 0x08, 0xC6, + 0x30, 0xF0, 0x7A, 0x81, 0x0A, 0xA8, 0xC3, 0x1E, 0xDA, 0xF0, 0x87, 0x3B, + 0x7C, 0x13, 0x42, 0x6D, 0x6A, 0x93, 0x9B, 0xAE, 0x6A, 0x55, 0x0D, 0x5F, + 0xA8, 0x2B, 0xF5, 0xD0, 0xAD, 0x3A, 0x7D, 0xA3, 0x1B, 0xDF, 0xE0, 0x66, + 0xC3, 0xDB, 0xDC, 0xB0, 0x3D, 0x82, 0x63, 0x27, 0x0F, 0xD5, 0x31, 0x0D, + 0x1D, 0xD8, 0x67, 0x14, 0xA3, 0xC0, 0x44, 0x10, 0x5A, 0xC3, 0x2C, 0x2F, + 0xBE, 0xC4, 0x15, 0xAE, 0x88, 0x96, 0xB4, 0x00, 0x4A, 0xA0, 0x5A, 0xB8, + 0xE2, 0x14, 0xB1, 0x80, 0xC5, 0x47, 0x92, 0xE1, 0x0A, 0x6F, 0x41, 0xF4, + 0xB6, 0xB8, 0x35, 0x5D, 0x2A, 0x1C, 0x90, 0x00, 0xAD, 0xB0, 0x40, 0x45, + 0x3A, 0x01, 0x51, 0x1B, 0xF4, 0xD2, 0x13, 0x35, 0x0C, 0x17, 0x0D, 0x3C, + 0xBA, 0xD8, 0x07, 0xF0, 0xD8, 0x81, 0xE6, 0x0A, 0x29, 0x90, 0x64, 0x54, + 0x01, 0x24, 0x65, 0x80, 0xBD, 0xE2, 0x5D, 0x8C, 0x04, 0x2D, 0x48, 0x41, + 0x03, 0xB6, 0x02, 0x15, 0x12, 0x9C, 0xA5, 0x2C, 0x49, 0x0A, 0x80, 0x00, + 0x90, 0xA2, 0x95, 0x2A, 0x85, 0xE5, 0x05, 0x2D, 0x58, 0x81, 0xF2, 0x5E, + 0x90, 0x06, 0x31, 0x8C, 0xE0, 0x05, 0x68, 0x00, 0x99, 0x71, 0x73, 0x92, + 0x17, 0x35, 0x44, 0xE2, 0x64, 0x85, 0x50, 0x43, 0x1D, 0x10, 0x11, 0x89, + 0x36, 0x4D, 0x82, 0x12, 0x71, 0x52, 0x84, 0x21, 0x18, 0x01, 0x09, 0x02, + 0xFB, 0x81, 0x32, 0x94, 0xA9, 0x4C, 0x2E, 0x27, 0x53, 0xC0, 0x4E, 0xA0, + 0x15, 0xAD, 0xA3, 0xE1, 0xC4, 0x26, 0xE2, 0xFA, 0x07, 0x4E, 0x68, 0x02, + 0x10, 0x3F, 0xC0, 0x01, 0x13, 0x76, 0x71, 0xD7, 0xBD, 0xE6, 0x42, 0x18, + 0x20, 0xCE, 0x05, 0x06, 0x4B, 0x41, 0x0A, 0x1E, 0x00, 0x61, 0x19, 0xD9, + 0x34, 0x2C, 0x73, 0xFE, 0x4C, 0x28, 0x1E, 0x14, 0xBE, 0x10, 0x9C, 0x71, + 0x93, 0x9B, 0xAD, 0xD4, 0xB3, 0x1E, 0xF2, 0xE8, 0x6D, 0x6E, 0xB6, 0x29, + 0xE7, 0xAF, 0xBC, 0xF3, 0x37, 0xF7, 0x40, 0x67, 0x1D, 0xEE, 0x10, 0x02, + 0x10, 0x60, 0x51, 0x9F, 0x79, 0x06, 0xA1, 0x09, 0x98, 0xF8, 0x06, 0x43, + 0xF7, 0x51, 0x8A, 0x53, 0x40, 0xA3, 0x1A, 0x00, 0x1D, 0x10, 0x35, 0x34, + 0x42, 0x0B, 0x58, 0x84, 0x42, 0x73, 0xB1, 0x30, 0x10, 0x84, 0x72, 0xCB, + 0xE5, 0xDC, 0xEE, 0x23, 0x15, 0x32, 0x50, 0x00, 0x08, 0x46, 0x10, 0x86, + 0x31, 0xA4, 0xE0, 0x05, 0x65, 0x60, 0x63, 0x1B, 0x4A, 0x34, 0xBB, 0x10, + 0x9D, 0xE1, 0xCD, 0x97, 0xA8, 0xD7, 0x1D, 0x73, 0x17, 0xBC, 0xAA, 0x04, + 0x2C, 0x05, 0x2C, 0xB0, 0x4A, 0x0B, 0x3E, 0x6A, 0xB0, 0x16, 0x0C, 0xF5, + 0x5E, 0x1E, 0x50, 0x40, 0xC2, 0xA8, 0xC7, 0x01, 0x05, 0xA0, 0x65, 0x00, + 0x03, 0x58, 0xC0, 0x48, 0x55, 0xD0, 0x06, 0xA8, 0x74, 0x40, 0x0C, 0x61, + 0x58, 0x81, 0x08, 0xD2, 0x1B, 0x69, 0x12, 0x88, 0x61, 0x0C, 0x67, 0xF8, + 0x10, 0x98, 0xCC, 0x10, 0xDC, 0x48, 0x04, 0x66, 0x44, 0xFC, 0xBD, 0x2F, + 0xFC, 0x10, 0x21, 0x09, 0xC4, 0x24, 0xA2, 0x31, 0xAE, 0x44, 0x70, 0x00, + 0x27, 0x13, 0x40, 0xFF, 0x11, 0xD0, 0x80, 0x8E, 0xD8, 0x04, 0x84, 0x03, + 0xA5, 0xB4, 0x62, 0x12, 0x53, 0x0E, 0x12, 0xC0, 0x81, 0x29, 0xEA, 0xBA, + 0x0B, 0x5E, 0xDC, 0xE2, 0x0A, 0x58, 0x70, 0x02, 0x13, 0x9A, 0x40, 0xD7, + 0x5C, 0xE4, 0xA2, 0x07, 0x15, 0xF0, 0x44, 0xD9, 0x4A, 0x85, 0xD8, 0x12, + 0xBA, 0x18, 0x85, 0x7B, 0x73, 0x5B, 0x7A, 0x56, 0xA5, 0x9E, 0x56, 0xC5, + 0xCD, 0x6E, 0xDF, 0xB1, 0x36, 0x8D, 0x73, 0x45, 0x63, 0xED, 0xC0, 0x63, + 0x3D, 0xD0, 0x61, 0xCF, 0xAF, 0xC6, 0xFE, 0xDD, 0x8D, 0x74, 0xC0, 0xA2, + 0x02, 0xA2, 0xB0, 0xA7, 0x2A, 0x9A, 0x00, 0x04, 0x24, 0x93, 0x62, 0xC9, + 0xFA, 0x20, 0x85, 0x28, 0xA8, 0x01, 0x0D, 0x07, 0x6D, 0xC3, 0x9F, 0x1A, + 0x99, 0x05, 0x2D, 0x3C, 0x71, 0x65, 0x59, 0x40, 0x63, 0x1A, 0xA2, 0xD8, + 0x62, 0x97, 0x07, 0xBE, 0x64, 0x3A, 0x48, 0x72, 0x78, 0x56, 0x92, 0x58, + 0x1D, 0xC4, 0x87, 0x07, 0xC2, 0xE4, 0xE4, 0x8C, 0x6E, 0x30, 0x43, 0x7C, + 0x81, 0x3A, 0xA5, 0xAD, 0x38, 0x05, 0x46, 0x2B, 0xB0, 0x57, 0x0A, 0xEE, + 0x45, 0x53, 0x14, 0xF0, 0x68, 0x62, 0x3E, 0x42, 0x41, 0x1A, 0x44, 0xBA, + 0x3B, 0x18, 0x19, 0x5A, 0x01, 0x88, 0x06, 0x00, 0x00, 0x16, 0x39, 0x52, + 0x31, 0x94, 0x81, 0x03, 0x0D, 0x50, 0xC1, 0x54, 0x96, 0xE7, 0x2F, 0x15, + 0x88, 0x21, 0x05, 0x7E, 0x6E, 0x43, 0x5E, 0x5A, 0xD6, 0xA1, 0x8C, 0x96, + 0x68, 0x10, 0x26, 0x3B, 0xC4, 0x97, 0x70, 0x52, 0xEA, 0x48, 0x0C, 0xA2, + 0x31, 0x03, 0xAE, 0x0C, 0x9E, 0x18, 0xCC, 0x6A, 0x48, 0xEC, 0x69, 0x68, + 0x7A, 0x92, 0xF5, 0x01, 0x8F, 0xC1, 0x34, 0xA7, 0xC9, 0x21, 0x6A, 0x9A, + 0xF8, 0xC1, 0x03, 0xA8, 0x70, 0x0B, 0x2E, 0xEC, 0x82, 0xAE, 0x4F, 0xB0, + 0x42, 0x5D, 0x8D, 0x0D, 0x62, 0xBC, 0x9A, 0xA2, 0x02, 0x9F, 0x40, 0x21, + 0x37, 0x97, 0x63, 0x42, 0x57, 0x25, 0xF6, 0xED, 0xD4, 0xAE, 0x8E, 0x38, + 0x5D, 0x88, 0xC3, 0xC7, 0xD2, 0x3D, 0xC6, 0x3A, 0x16, 0x37, 0x3B, 0x77, + 0xF8, 0xAB, 0x1E, 0xBE, 0x27, 0x07, 0x41, 0x10, 0x85, 0xE0, 0x3D, 0x31, + 0x04, 0x81, 0x60, 0x82, 0x1B, 0x10, 0x75, 0xC5, 0x2A, 0xB6, 0x31, 0xE5, + 0x69, 0x61, 0x84, 0x1A, 0x08, 0xFA, 0x84, 0x27, 0x96, 0xC1, 0x11, 0x80, + 0x0B, 0x9C, 0xE0, 0x98, 0xE7, 0x62, 0x20, 0xD2, 0xC0, 0xFE, 0x81, 0xAC, + 0xD0, 0x6B, 0x4A, 0x78, 0x38, 0xF3, 0x19, 0xF4, 0xF0, 0x13, 0x76, 0x85, + 0xCC, 0x43, 0x71, 0xBC, 0x91, 0x1E, 0x17, 0xA6, 0x02, 0xAA, 0x9C, 0x40, + 0x06, 0xC8, 0x6B, 0x2E, 0x25, 0xB5, 0xA2, 0x3C, 0x4A, 0x82, 0x34, 0x4A, + 0xCD, 0xAB, 0xD7, 0xBD, 0x3E, 0x50, 0xC7, 0x24, 0x21, 0x3A, 0xA7, 0x62, + 0x21, 0x41, 0x19, 0x56, 0xA0, 0x80, 0xA2, 0xB4, 0xFE, 0x29, 0x20, 0x28, + 0xCB, 0x56, 0x5A, 0x50, 0x86, 0x3A, 0x8C, 0x41, 0x0C, 0x6A, 0x40, 0x19, + 0x21, 0xC0, 0x77, 0x09, 0xE9, 0xDF, 0x37, 0x30, 0x6D, 0x20, 0x44, 0x24, + 0x24, 0x81, 0x08, 0x42, 0x70, 0x5F, 0x11, 0x8A, 0xC0, 0x19, 0x23, 0x26, + 0x63, 0x4B, 0x3D, 0x59, 0x42, 0xE9, 0x95, 0x29, 0xE0, 0x23, 0x64, 0x2D, + 0xF5, 0x66, 0x10, 0x8A, 0x50, 0x9A, 0xF8, 0xC3, 0x0F, 0xE4, 0x70, 0x9A, + 0x0C, 0x70, 0xD8, 0xD7, 0x76, 0xD5, 0xAB, 0xFE, 0x85, 0x91, 0x57, 0x10, + 0x67, 0x22, 0x03, 0xA3, 0xC0, 0x1B, 0x6B, 0x73, 0x42, 0xCF, 0xA6, 0x1D, + 0xDD, 0xE4, 0x62, 0x30, 0x46, 0x1E, 0xEB, 0xE1, 0x62, 0x06, 0x38, 0x1E, + 0x2E, 0x54, 0x0F, 0x7D, 0x73, 0x77, 0xAF, 0xD2, 0x63, 0x7F, 0xC3, 0x0E, + 0xEB, 0xF0, 0x37, 0xE7, 0xF1, 0x4E, 0xD1, 0x21, 0x0A, 0x3A, 0xA0, 0x0A, + 0x9F, 0x90, 0x2C, 0x47, 0x66, 0x44, 0xB8, 0x70, 0x5B, 0xAE, 0xF0, 0x1A, + 0x8D, 0x87, 0x6F, 0xDB, 0x10, 0x0D, 0xD0, 0xF0, 0x44, 0xA3, 0xC0, 0x11, + 0xB4, 0x00, 0x0D, 0x9E, 0xB0, 0x50, 0x99, 0x37, 0x83, 0xE3, 0xA2, 0x0E, + 0x25, 0x90, 0x06, 0x3E, 0x32, 0x06, 0x63, 0x74, 0x02, 0x68, 0xB0, 0x52, + 0x77, 0xA1, 0x5F, 0x7A, 0x20, 0x06, 0x67, 0x60, 0x06, 0x70, 0xF0, 0x21, + 0xEE, 0x75, 0x02, 0x0D, 0xB3, 0x14, 0x21, 0x80, 0x3D, 0xFC, 0x72, 0x24, + 0xFE, 0x83, 0x44, 0x48, 0x7A, 0x46, 0x02, 0x69, 0x90, 0x5D, 0x02, 0xB3, + 0x00, 0x4D, 0x81, 0x15, 0x5F, 0x31, 0x52, 0x1E, 0x10, 0x16, 0x8A, 0xE4, + 0x00, 0x02, 0x80, 0x68, 0xF7, 0x52, 0x46, 0x62, 0x60, 0x2F, 0x47, 0x31, + 0x66, 0x15, 0xB7, 0x00, 0x31, 0xB7, 0x02, 0x61, 0xA0, 0x22, 0x2A, 0xB2, + 0x66, 0xB3, 0x03, 0x17, 0xA1, 0x04, 0x3F, 0xED, 0xE2, 0x06, 0xDA, 0xC7, + 0x7D, 0x96, 0x80, 0x08, 0x88, 0x50, 0x08, 0x85, 0x90, 0x08, 0x02, 0xC6, + 0x08, 0x04, 0xF6, 0x27, 0x95, 0xD0, 0x08, 0x93, 0xB1, 0x74, 0x8F, 0xD0, + 0x08, 0x01, 0x94, 0x56, 0x0E, 0x56, 0x28, 0x9F, 0x31, 0x4C, 0x35, 0x10, + 0x35, 0x26, 0xD0, 0x03, 0xBC, 0x80, 0x57, 0x7A, 0x65, 0x0C, 0x92, 0xC8, + 0x7F, 0xFC, 0x17, 0x0C, 0xC2, 0xC0, 0x0B, 0x56, 0x90, 0x01, 0xA0, 0x70, + 0x36, 0xD3, 0xF6, 0x76, 0x07, 0xB8, 0x1D, 0x8A, 0xC5, 0x6D, 0xD4, 0x36, + 0x77, 0xE5, 0x94, 0x2B, 0x79, 0xD7, 0x6D, 0x3A, 0xE6, 0x2B, 0xE3, 0xE6, + 0x77, 0x7F, 0xA3, 0x0D, 0x37, 0xF0, 0x09, 0xA4, 0x30, 0x4F, 0x39, 0x90, + 0x03, 0x40, 0x00, 0x5A, 0x0E, 0xB5, 0x4F, 0x91, 0x23, 0x0A, 0xAE, 0x90, + 0x0D, 0x02, 0x62, 0x0D, 0xD3, 0x42, 0x0D, 0x90, 0x27, 0x0B, 0xA1, 0x80, + 0x09, 0xCB, 0x90, 0x0C, 0xC8, 0x38, 0x0A, 0x32, 0x48, 0x83, 0xCC, 0x68, + 0x21, 0x2F, 0x91, 0x0C, 0x1D, 0x50, 0x07, 0x32, 0x55, 0x06, 0x61, 0x70, + 0x31, 0x54, 0x81, 0x02, 0x37, 0xB7, 0x02, 0x63, 0xA0, 0x07, 0x87, 0xF0, + 0x46, 0x22, 0x92, 0x13, 0x75, 0x90, 0x06, 0xD4, 0x85, 0x84, 0x0B, 0x20, + 0x47, 0x52, 0x02, 0x48, 0x0C, 0xB0, 0x02, 0xEA, 0x18, 0x06, 0x27, 0x10, + 0x7A, 0x2C, 0xD0, 0x02, 0xE3, 0xC3, 0x02, 0x0A, 0xE0, 0x14, 0x1D, 0xD0, + 0x00, 0x21, 0xA0, 0xFE, 0x47, 0xBF, 0x03, 0x73, 0x0E, 0x20, 0x24, 0x03, + 0x80, 0x72, 0x09, 0x70, 0x2F, 0x2B, 0x30, 0x08, 0x1B, 0x63, 0x14, 0x20, + 0x70, 0x24, 0x96, 0xA6, 0x02, 0x8B, 0x34, 0x02, 0xC3, 0x27, 0x31, 0x2D, + 0x10, 0x5F, 0x67, 0xE0, 0x06, 0x2A, 0x33, 0x5C, 0x83, 0x30, 0x08, 0xA0, + 0x44, 0x08, 0x25, 0x13, 0x6A, 0x87, 0xD0, 0x5F, 0xA7, 0xD6, 0x4A, 0xE0, + 0x17, 0x19, 0x95, 0xB1, 0x27, 0x09, 0xF6, 0x74, 0xAB, 0x26, 0x75, 0x68, + 0xE5, 0x08, 0x9C, 0xF0, 0x0C, 0x13, 0x16, 0x35, 0x15, 0xF6, 0x03, 0x15, + 0xC0, 0x75, 0x5C, 0xF0, 0x4C, 0xB7, 0xC0, 0x0B, 0x20, 0x26, 0x93, 0xCE, + 0x64, 0x0A, 0xBB, 0x96, 0x0B, 0x99, 0x10, 0x01, 0x98, 0xB0, 0x0D, 0x83, + 0xC5, 0x76, 0xCF, 0xC6, 0x80, 0xA2, 0x38, 0x6D, 0x36, 0xE6, 0x80, 0xB7, + 0x61, 0x6D, 0xD6, 0x26, 0x94, 0xE1, 0x54, 0x81, 0xA6, 0xB8, 0x4E, 0xE0, + 0x86, 0x1B, 0x3E, 0xB4, 0x59, 0xE7, 0x21, 0x04, 0x44, 0xA0, 0x0A, 0x46, + 0x24, 0x04, 0x37, 0x20, 0x44, 0x87, 0xF7, 0x50, 0xD5, 0xA4, 0x0F, 0xA2, + 0xB0, 0x0A, 0xFE, 0xB4, 0x0D, 0x60, 0x89, 0x11, 0xD5, 0x00, 0x0D, 0xD2, + 0xE0, 0x0A, 0xA2, 0xE0, 0x09, 0x1C, 0x91, 0x0C, 0xB3, 0x30, 0x0A, 0x4B, + 0xD4, 0x8C, 0x6E, 0x79, 0x21, 0x9F, 0xD0, 0x01, 0x76, 0x80, 0x49, 0x91, + 0xC6, 0x15, 0x46, 0x72, 0x06, 0xCB, 0x93, 0x02, 0x63, 0x20, 0x08, 0x1D, + 0x15, 0x22, 0x6D, 0xE4, 0x21, 0xEF, 0x85, 0x3D, 0x63, 0xB0, 0x00, 0xB0, + 0x07, 0x3C, 0x3A, 0x82, 0x02, 0xD9, 0x85, 0x54, 0x12, 0x53, 0x15, 0x69, + 0xB0, 0x02, 0x2D, 0x30, 0x52, 0x56, 0xF8, 0x2F, 0xD4, 0x43, 0x02, 0xC5, + 0x07, 0x02, 0x09, 0x10, 0x68, 0xBF, 0x37, 0x00, 0x62, 0x51, 0x7D, 0x62, + 0x90, 0x23, 0x0B, 0xE0, 0x14, 0x34, 0xFE, 0xC2, 0x02, 0xDE, 0xB5, 0x00, + 0xE3, 0xB3, 0x02, 0xD4, 0xF8, 0x7C, 0x2B, 0x20, 0x06, 0x78, 0xD0, 0x7D, + 0xB3, 0x63, 0x06, 0x6A, 0x30, 0x08, 0x91, 0x10, 0x09, 0x78, 0xA0, 0x46, + 0x26, 0x23, 0x09, 0x92, 0xB0, 0x4A, 0xDB, 0xC7, 0x08, 0x8A, 0x10, 0x19, + 0x5E, 0x35, 0x7E, 0x90, 0x80, 0x4B, 0x20, 0xE9, 0x74, 0x8C, 0x60, 0x40, + 0x0E, 0xD6, 0x09, 0x7F, 0xE0, 0x60, 0x29, 0x29, 0x07, 0xCE, 0xC0, 0x09, + 0x36, 0xC0, 0x03, 0x30, 0xF9, 0x6B, 0x56, 0xC0, 0x04, 0x3D, 0xB0, 0x04, + 0x3C, 0xB0, 0x04, 0x4B, 0xC0, 0x04, 0xC2, 0x46, 0x6C, 0x4C, 0xB0, 0x03, + 0x3D, 0xD0, 0x04, 0xB3, 0xD0, 0x0E, 0x6C, 0x03, 0x77, 0x46, 0xE9, 0x6C, + 0x2B, 0x44, 0x8A, 0xA8, 0xD8, 0x6D, 0xAA, 0x78, 0x8A, 0x79, 0xC7, 0x8A, + 0xAF, 0xE2, 0x1E, 0x50, 0xE9, 0x0E, 0xA8, 0xA0, 0x03, 0xF5, 0x01, 0x0A, + 0x98, 0x50, 0x8B, 0x47, 0x36, 0x82, 0xB8, 0x45, 0x0A, 0xBD, 0x58, 0x0D, + 0xD5, 0x00, 0x96, 0xFE, 0x64, 0x0D, 0xD2, 0x00, 0x0D, 0x6B, 0x19, 0x0A, + 0x06, 0x35, 0x0B, 0xD3, 0x10, 0x83, 0x6F, 0x99, 0xA0, 0x15, 0x22, 0x0A, + 0x23, 0x80, 0x97, 0xDE, 0x53, 0x66, 0xCB, 0xD3, 0x01, 0x05, 0x69, 0x15, + 0x55, 0xB1, 0x51, 0xAA, 0xE9, 0x9A, 0x7A, 0x00, 0x3E, 0xA2, 0xB9, 0x3C, + 0x4D, 0x72, 0x23, 0x27, 0x70, 0x71, 0x51, 0x72, 0x15, 0x27, 0x80, 0x54, + 0x42, 0x95, 0x5E, 0x1A, 0xC3, 0x02, 0x2C, 0xD0, 0x00, 0xBA, 0x83, 0x02, + 0x27, 0x00, 0x02, 0x42, 0x62, 0x2F, 0x1E, 0x00, 0x5E, 0x09, 0xF0, 0x85, + 0x03, 0x50, 0x24, 0x24, 0x10, 0x7D, 0xAC, 0xD3, 0x47, 0x29, 0x00, 0x24, + 0x03, 0xA3, 0x02, 0x0A, 0xA0, 0x00, 0x2B, 0xF0, 0x02, 0x42, 0x98, 0x69, + 0x7E, 0x86, 0x13, 0x75, 0x40, 0x22, 0x20, 0xB2, 0x5F, 0xFE, 0x92, 0x70, + 0x08, 0x87, 0xA0, 0x06, 0x65, 0xA0, 0x2E, 0xA5, 0x64, 0x3F, 0x89, 0x70, + 0x74, 0xB0, 0x64, 0x09, 0x7E, 0xE8, 0x55, 0x3D, 0x53, 0x60, 0x8D, 0xE0, + 0x74, 0xBF, 0x29, 0x40, 0x90, 0xB0, 0x09, 0x26, 0xE9, 0x0C, 0x13, 0x06, + 0x08, 0x36, 0x00, 0x08, 0xCD, 0x20, 0x07, 0x15, 0x70, 0x05, 0xC1, 0xC0, + 0x0B, 0xBC, 0x90, 0x57, 0xBB, 0xF0, 0xA6, 0xA6, 0x70, 0x0B, 0x62, 0x77, + 0x05, 0xCE, 0xC4, 0x04, 0x19, 0xB0, 0x04, 0x57, 0x60, 0x41, 0xA4, 0xE0, + 0x6C, 0xDD, 0x14, 0x94, 0x0D, 0x98, 0x37, 0x0E, 0x88, 0x94, 0x3A, 0xA6, + 0x4E, 0x79, 0xB7, 0x9E, 0x49, 0x79, 0x1E, 0x3E, 0xE6, 0x43, 0x39, 0x40, + 0x4F, 0xA0, 0xD0, 0x04, 0x3A, 0x90, 0x03, 0x42, 0x50, 0x44, 0xB6, 0x75, + 0x5B, 0xC7, 0xD2, 0x35, 0x0E, 0x02, 0x8C, 0x94, 0x33, 0x0D, 0xD2, 0xC0, + 0x82, 0x6A, 0x69, 0xA0, 0x9E, 0x20, 0x0F, 0x0A, 0x1A, 0xAA, 0xFB, 0x11, + 0x0A, 0x32, 0xE7, 0x67, 0x4E, 0x12, 0x06, 0x43, 0xC5, 0x22, 0x96, 0x14, + 0x30, 0xED, 0x85, 0x07, 0x68, 0xF0, 0x90, 0x6A, 0x70, 0x06, 0x75, 0xA0, + 0x06, 0xD5, 0x78, 0x85, 0x56, 0xF1, 0xA1, 0x4D, 0x62, 0x15, 0x23, 0x47, + 0x02, 0x32, 0x20, 0x15, 0xBF, 0xC5, 0x15, 0x23, 0xA7, 0x02, 0x1B, 0xA3, + 0x15, 0x20, 0x30, 0x54, 0x0C, 0x90, 0x00, 0x0B, 0x23, 0x68, 0x24, 0xB0, + 0x48, 0x09, 0x00, 0x00, 0x38, 0xA5, 0x00, 0x84, 0x89, 0x07, 0x43, 0x18, + 0x17, 0xCA, 0x73, 0x09, 0x8E, 0x69, 0x3C, 0xF5, 0x38, 0xA4, 0x63, 0xB0, + 0x86, 0xF5, 0x65, 0x06, 0xE6, 0x63, 0x32, 0x7C, 0xF9, 0x13, 0xA2, 0x54, + 0x22, 0x40, 0xC8, 0x5F, 0x92, 0x40, 0x3F, 0x91, 0xC0, 0x08, 0x86, 0xD0, + 0x18, 0xAF, 0xE4, 0x87, 0x7D, 0xC0, 0x07, 0x8A, 0x20, 0x19, 0x8C, 0xB0, + 0xFE, 0x08, 0x7A, 0x32, 0x19, 0x8B, 0xB0, 0x7E, 0x48, 0x43, 0x28, 0x71, + 0x10, 0x07, 0xB1, 0x66, 0x02, 0x19, 0x60, 0x57, 0xBB, 0x90, 0x0B, 0x6C, + 0xAA, 0x57, 0xC3, 0x40, 0x89, 0xC1, 0x80, 0x0E, 0x1E, 0x16, 0x9D, 0x3C, + 0x80, 0x9D, 0xCB, 0xD2, 0x0D, 0x47, 0xD9, 0x76, 0x7F, 0xDA, 0x80, 0x2D, + 0x74, 0x77, 0xD5, 0x86, 0x63, 0xD8, 0x06, 0x38, 0xED, 0x59, 0xA8, 0xDA, + 0xF1, 0x1E, 0xE1, 0x86, 0xA8, 0xE7, 0x31, 0x2C, 0x41, 0xA0, 0x0A, 0xA1, + 0x15, 0x04, 0x38, 0x10, 0x04, 0x44, 0xD0, 0x04, 0x4A, 0x76, 0x5B, 0x2F, + 0xC1, 0x8B, 0xD6, 0xC0, 0x9F, 0x97, 0xEA, 0x8B, 0xD0, 0x90, 0x0C, 0xB2, + 0xE0, 0x1A, 0x57, 0x44, 0x0B, 0xC9, 0x40, 0x04, 0x6D, 0x29, 0xAA, 0x3A, + 0x8B, 0x12, 0x60, 0x06, 0x69, 0x8D, 0x09, 0x8F, 0x61, 0xC0, 0xA2, 0x49, + 0xF1, 0x22, 0x91, 0xA6, 0x86, 0x1F, 0x33, 0x3B, 0x22, 0x53, 0x3E, 0xC5, + 0xB3, 0x3C, 0x21, 0x60, 0x54, 0x57, 0xE1, 0x24, 0x76, 0x96, 0x06, 0x61, + 0xE0, 0x22, 0x69, 0x80, 0x02, 0x72, 0xC4, 0x23, 0x6A, 0x08, 0x07, 0xD9, + 0x45, 0x02, 0xEF, 0x68, 0xB5, 0x56, 0xD8, 0x14, 0x0D, 0xB3, 0x00, 0x49, + 0x02, 0x00, 0x88, 0xA6, 0x00, 0x0D, 0x90, 0x02, 0x12, 0xD7, 0x06, 0x7B, + 0xC6, 0x7C, 0x69, 0xE0, 0xAD, 0xD0, 0x57, 0x8F, 0xDF, 0xE8, 0x72, 0x2F, + 0x30, 0x7A, 0xFE, 0xB2, 0x02, 0xB2, 0x1A, 0x33, 0x6A, 0xD0, 0x21, 0x82, + 0x20, 0x74, 0x5D, 0x42, 0x32, 0x5F, 0x82, 0x08, 0xA7, 0xC6, 0x4A, 0x8D, + 0x21, 0x19, 0x94, 0xE0, 0x87, 0x7C, 0xC0, 0x07, 0x8B, 0xE0, 0x87, 0x93, + 0x50, 0x19, 0x92, 0x81, 0x60, 0x48, 0xD3, 0x08, 0x7F, 0xC0, 0x06, 0x71, + 0x00, 0x08, 0x35, 0x70, 0x04, 0x56, 0xE0, 0x0B, 0x79, 0x95, 0x57, 0x7B, + 0x45, 0xB0, 0x20, 0xFE, 0xD6, 0xB9, 0xB9, 0x10, 0x0C, 0x4E, 0x40, 0x03, + 0xBC, 0x70, 0x76, 0xC8, 0x70, 0x0F, 0x2F, 0xE6, 0x2A, 0x45, 0xE9, 0x76, + 0x0A, 0x28, 0x37, 0x12, 0xA8, 0xB1, 0xE5, 0x14, 0x81, 0xAB, 0x88, 0x81, + 0xDA, 0xD1, 0x0D, 0xDA, 0xE0, 0x43, 0xEE, 0xE0, 0x0F, 0x40, 0x80, 0x0A, + 0xF5, 0x11, 0x04, 0x80, 0x27, 0x95, 0x9E, 0x90, 0x8B, 0xB7, 0x25, 0x0A, + 0xAD, 0xB0, 0x0D, 0xD2, 0x60, 0x6F, 0xF7, 0x96, 0x0D, 0xD2, 0x40, 0x0B, + 0xD3, 0x10, 0x0A, 0xAA, 0x30, 0x0B, 0xC8, 0xC0, 0x11, 0xA2, 0xB0, 0x8C, + 0x3B, 0x3B, 0xBD, 0x0D, 0xA1, 0x09, 0x1F, 0xA0, 0x22, 0xD6, 0x8A, 0x3D, + 0x3C, 0xF2, 0xB4, 0x95, 0x04, 0x8F, 0x2D, 0xD0, 0xAA, 0x3F, 0x31, 0x5C, + 0x6F, 0x64, 0x49, 0x2B, 0x10, 0x02, 0x27, 0xF0, 0x22, 0xE8, 0x4B, 0x2F, + 0x29, 0x80, 0x17, 0xE7, 0x8B, 0x47, 0xC7, 0x93, 0x06, 0xCF, 0x87, 0x02, + 0x6C, 0xB1, 0x7A, 0x4D, 0xA2, 0x14, 0xD3, 0xE3, 0x5D, 0xF6, 0x62, 0x68, + 0x01, 0x40, 0xB6, 0x8A, 0xC4, 0x01, 0x01, 0x39, 0x26, 0x29, 0x12, 0x06, + 0xD6, 0x3A, 0x7C, 0x98, 0xB6, 0x15, 0xCF, 0x37, 0x3B, 0x2D, 0x30, 0x06, + 0x6D, 0xC0, 0x02, 0xB0, 0x97, 0x23, 0xE6, 0xB3, 0x3E, 0xC6, 0x25, 0x08, + 0x63, 0x32, 0x26, 0xDC, 0x68, 0x3B, 0x9C, 0x64, 0x33, 0xFF, 0x15, 0x09, + 0x96, 0x40, 0x09, 0x88, 0xD1, 0x4A, 0x86, 0x9B, 0x08, 0x7E, 0xD8, 0x33, + 0xBE, 0xD9, 0x19, 0x9D, 0xE0, 0x07, 0x35, 0xC0, 0xAF, 0x72, 0x60, 0x03, + 0x3D, 0xB0, 0x0B, 0xC6, 0x40, 0xB0, 0x2E, 0xBC, 0xB9, 0x98, 0xD8, 0xB9, + 0xC5, 0xC0, 0x04, 0x75, 0xD5, 0x03, 0xD3, 0x00, 0xA8, 0xB0, 0xF2, 0xB0, + 0x8F, 0x85, 0x6D, 0x8B, 0x85, 0xC3, 0x0F, 0xEB, 0xBA, 0xAB, 0xC8, 0x1E, + 0x18, 0x28, 0xBB, 0x4F, 0x69, 0xBB, 0xFE, 0x47, 0xD6, 0x0A, 0xC9, 0xB2, + 0x03, 0x39, 0xE0, 0x03, 0xF7, 0xE4, 0x0F, 0xB9, 0x15, 0x39, 0xC7, 0x22, + 0x8C, 0xD4, 0x60, 0x0D, 0x54, 0x0C, 0x96, 0xD2, 0x80, 0x8C, 0x67, 0x29, + 0x0B, 0x57, 0x94, 0x0C, 0xA3, 0x00, 0xAA, 0xD4, 0xFB, 0xC5, 0x0C, 0x11, + 0x39, 0x74, 0x20, 0x03, 0x98, 0xB6, 0x25, 0xEA, 0x08, 0x49, 0x4F, 0xD1, + 0x23, 0x20, 0x70, 0x02, 0x4E, 0x75, 0x09, 0x63, 0x80, 0xA1, 0xB6, 0xA3, + 0x17, 0x22, 0xC3, 0x02, 0x29, 0xD0, 0xA2, 0x32, 0xC0, 0x23, 0x5B, 0xD1, + 0x14, 0x0D, 0xF0, 0x02, 0xE4, 0xDB, 0x52, 0xE9, 0x55, 0x25, 0xE3, 0x03, + 0x02, 0x53, 0xC8, 0x15, 0xF4, 0x82, 0x02, 0x2C, 0x80, 0x47, 0xF4, 0x52, + 0x3C, 0x2C, 0xF2, 0x30, 0x89, 0x86, 0x53, 0x23, 0xA0, 0x32, 0x0D, 0x67, + 0x06, 0x73, 0x1B, 0x06, 0x6E, 0x30, 0x06, 0x24, 0x70, 0x09, 0x66, 0x10, + 0x52, 0x6E, 0xD0, 0x06, 0x97, 0x70, 0x09, 0x62, 0xB0, 0xC0, 0x56, 0x12, + 0xA4, 0x1C, 0xB2, 0x17, 0x73, 0x48, 0x22, 0x88, 0x30, 0x08, 0x75, 0xB0, + 0xC9, 0x75, 0x30, 0xC1, 0x87, 0xE0, 0x18, 0xFF, 0x55, 0x3F, 0xA7, 0xA6, + 0x9B, 0xAF, 0xDC, 0x87, 0xED, 0xCA, 0x60, 0x8F, 0x00, 0x03, 0x71, 0xD0, + 0x09, 0x8D, 0x50, 0x03, 0x38, 0xA0, 0xA6, 0x7B, 0x85, 0x57, 0x7B, 0x45, + 0x89, 0xC3, 0x20, 0x0C, 0xE8, 0xD0, 0xB9, 0x77, 0x75, 0x6C, 0x57, 0x00, + 0x04, 0x37, 0x8C, 0x2B, 0x84, 0xBA, 0xC3, 0x13, 0xBB, 0x6D, 0x40, 0x9C, + 0xB1, 0x4D, 0x29, 0xCD, 0x44, 0xEC, 0x94, 0x3D, 0x54, 0x0F, 0xA1, 0x40, + 0x03, 0xF3, 0xE4, 0x09, 0x80, 0x17, 0x04, 0x05, 0xF1, 0x6E, 0x5E, 0xA6, + 0x0F, 0x56, 0xB0, 0x78, 0xC5, 0x0B, 0x8C, 0x55, 0x7C, 0xC5, 0x44, 0x56, + 0x45, 0xC8, 0xB8, 0x96, 0x93, 0x0A, 0xC6, 0xEE, 0xAC, 0xFE, 0x0F, 0x77, + 0xA0, 0x02, 0x98, 0xF6, 0x71, 0xA8, 0x7A, 0x24, 0x2D, 0x85, 0x84, 0xC7, + 0xC3, 0x8E, 0x6B, 0x98, 0xB4, 0xE6, 0x13, 0xAB, 0x3F, 0xE1, 0x2F, 0xD9, + 0x53, 0x25, 0xBA, 0x73, 0x24, 0x4A, 0x81, 0x3D, 0x20, 0xC0, 0x02, 0x69, + 0x00, 0x02, 0x2A, 0x50, 0x06, 0x52, 0x8B, 0x73, 0x55, 0xDB, 0xA2, 0x62, + 0x91, 0x67, 0x22, 0x35, 0x48, 0x52, 0xE2, 0x01, 0x0E, 0x23, 0x00, 0xC5, + 0x97, 0x24, 0x59, 0xE2, 0x13, 0xA9, 0x6C, 0x5C, 0x7B, 0xB1, 0x02, 0x69, + 0x90, 0x06, 0x9E, 0xA9, 0x06, 0x87, 0x20, 0xD2, 0x2C, 0x00, 0x22, 0x7E, + 0x16, 0x69, 0x6B, 0xD8, 0x83, 0x10, 0x49, 0x22, 0xA0, 0xA4, 0x07, 0x6D, + 0xF0, 0x13, 0x78, 0x90, 0x08, 0xB7, 0x19, 0x4A, 0x7B, 0xCB, 0x26, 0x00, + 0x86, 0x9B, 0x87, 0x30, 0x7E, 0x00, 0xC6, 0x07, 0x86, 0x70, 0x3F, 0x8B, + 0xC0, 0xC1, 0x9D, 0x70, 0x07, 0x35, 0x70, 0x07, 0x8F, 0x50, 0x03, 0x11, + 0x70, 0x05, 0x91, 0x08, 0xC3, 0xBF, 0x2C, 0x89, 0x98, 0x18, 0xC3, 0xC3, + 0x70, 0x05, 0x1A, 0x20, 0x04, 0xB2, 0xAB, 0x4E, 0x6B, 0xB3, 0x36, 0x31, + 0x96, 0x9E, 0xDB, 0xE6, 0x58, 0xD1, 0x0C, 0xBB, 0x7B, 0xB7, 0x37, 0x3C, + 0xB6, 0x0D, 0x3C, 0xE4, 0x0E, 0xD3, 0xB0, 0xA8, 0x98, 0xD0, 0x04, 0x24, + 0xAB, 0x2C, 0x42, 0x20, 0x04, 0xE4, 0xC0, 0x65, 0x91, 0xE3, 0x09, 0xA9, + 0x35, 0x0D, 0xD5, 0xC0, 0x0D, 0x98, 0x4A, 0xBC, 0xB5, 0x50, 0x65, 0xA3, + 0x10, 0x0B, 0xB3, 0xE0, 0x0F, 0x6B, 0x09, 0xBC, 0xEF, 0x4C, 0xBD, 0xDD, + 0x50, 0x31, 0x38, 0x01, 0x69, 0x1C, 0x73, 0x06, 0xC8, 0xB3, 0x02, 0x74, + 0xDC, 0x7A, 0x52, 0x51, 0xAA, 0x22, 0x52, 0x3E, 0x73, 0xA8, 0x06, 0x82, + 0xA0, 0x06, 0x07, 0x69, 0x69, 0x65, 0x80, 0x84, 0x78, 0xC6, 0x8E, 0x8D, + 0xFE, 0x59, 0x90, 0xD8, 0xD8, 0x24, 0x66, 0x90, 0x31, 0x1B, 0x87, 0x73, + 0xC6, 0x83, 0x3D, 0x9E, 0xD4, 0xA2, 0xB7, 0x9A, 0x7C, 0x0D, 0xF0, 0xAC, + 0x0C, 0xC0, 0x5B, 0x2A, 0xD0, 0x32, 0x10, 0xB9, 0x3E, 0x31, 0xDD, 0xC6, + 0xC2, 0x0A, 0x15, 0x3E, 0xE1, 0xC9, 0x1F, 0xA2, 0x06, 0x46, 0xB5, 0x67, + 0x6D, 0x30, 0x08, 0x3C, 0x72, 0x17, 0xEE, 0x62, 0x32, 0x6E, 0xD4, 0x70, + 0x83, 0x40, 0x6A, 0x4B, 0x3A, 0x18, 0xA4, 0x57, 0x08, 0x91, 0xC1, 0x26, + 0x8C, 0x60, 0x09, 0x91, 0x50, 0x09, 0x94, 0x50, 0x08, 0xF1, 0x4A, 0xB8, + 0xE3, 0x37, 0x19, 0x30, 0xC0, 0x06, 0x7D, 0xC0, 0x06, 0x26, 0xC0, 0x04, + 0x6D, 0xDA, 0xD4, 0x4D, 0x7D, 0xB0, 0x97, 0xF8, 0xD4, 0xBC, 0xC0, 0x03, + 0xAA, 0x30, 0x8A, 0x35, 0xB4, 0xBA, 0x35, 0x86, 0x77, 0xA5, 0xD8, 0xA7, + 0xD1, 0xCC, 0x94, 0x13, 0x38, 0x6E, 0xDB, 0x91, 0x81, 0xBD, 0xF2, 0x43, + 0xEE, 0x40, 0x04, 0x73, 0x20, 0x5A, 0x45, 0x90, 0x03, 0x38, 0x90, 0x03, + 0x44, 0x50, 0x04, 0x1E, 0x34, 0x70, 0x9E, 0x00, 0x0B, 0x00, 0x25, 0x20, + 0x60, 0x79, 0x6F, 0xD5, 0xA0, 0x96, 0xAD, 0x70, 0x0A, 0xB3, 0x00, 0x0B, + 0xC9, 0x80, 0x0C, 0xA3, 0xE0, 0xD7, 0x7F, 0xBD, 0xB3, 0xD5, 0x10, 0x25, + 0x6B, 0x16, 0x22, 0xEC, 0x78, 0x09, 0xFF, 0x32, 0x25, 0x19, 0xA3, 0xA3, + 0x28, 0xBA, 0x86, 0x63, 0xA0, 0x17, 0x20, 0x22, 0xAD, 0x2C, 0x30, 0x06, + 0x23, 0x60, 0x3C, 0xDE, 0xD5, 0x52, 0x15, 0x67, 0xD8, 0x15, 0xF7, 0x22, + 0x8F, 0x99, 0x3D, 0x9F, 0x5C, 0xC7, 0xA2, 0xA9, 0x8D, 0x2A, 0xB0, 0xD9, + 0xF5, 0x22, 0x54, 0x22, 0xC5, 0x00, 0xFE, 0x08, 0xAD, 0x49, 0xF2, 0x01, + 0xEA, 0x62, 0xA4, 0x6D, 0x84, 0x07, 0x6A, 0xA8, 0x54, 0x87, 0xF0, 0x01, + 0x0C, 0x20, 0x06, 0xFE, 0x7E, 0x26, 0x84, 0x3A, 0x67, 0x73, 0x63, 0x50, + 0x06, 0x02, 0xA9, 0x22, 0x61, 0xE0, 0x13, 0x90, 0x76, 0x06, 0x25, 0x23, + 0x08, 0x7B, 0x2B, 0x4A, 0x86, 0x70, 0x18, 0x87, 0x60, 0x09, 0x32, 0x73, + 0x08, 0x86, 0x30, 0xE5, 0x38, 0xCD, 0x91, 0x91, 0x21, 0x27, 0x8B, 0xC0, + 0x07, 0x93, 0x51, 0x03, 0x6F, 0x70, 0x07, 0x77, 0x60, 0x02, 0x38, 0x90, + 0xB9, 0xC0, 0x9C, 0xE6, 0x4E, 0xBD, 0x7F, 0xC6, 0x60, 0x05, 0x3B, 0xF0, + 0x1E, 0xED, 0x21, 0x77, 0xD6, 0xF1, 0x89, 0xAA, 0x78, 0xB1, 0xE9, 0xAD, + 0xB1, 0xE1, 0x76, 0xA8, 0x1D, 0xEB, 0x0E, 0xB2, 0x90, 0x03, 0xA1, 0x30, + 0x04, 0x43, 0x50, 0xDF, 0x3B, 0x90, 0x2C, 0x4D, 0xC0, 0xE0, 0xB7, 0xE5, + 0x09, 0xA2, 0x80, 0xBC, 0x53, 0xBC, 0x0D, 0xD7, 0x30, 0x20, 0x36, 0x5B, + 0x96, 0x56, 0x04, 0x0B, 0xB5, 0x90, 0x0C, 0xA2, 0x10, 0x39, 0x0D, 0x3E, + 0xBD, 0x2F, 0x01, 0x0B, 0x1C, 0xE0, 0xC6, 0xFA, 0x15, 0x06, 0x09, 0x4D, + 0xC7, 0x21, 0x7E, 0x5D, 0xF4, 0x12, 0xA2, 0x2A, 0x20, 0xA4, 0x9A, 0x74, + 0x06, 0x68, 0x00, 0x47, 0xE5, 0x7B, 0xBE, 0x36, 0xC2, 0xAB, 0x1C, 0x70, + 0x15, 0x61, 0x60, 0x06, 0xD6, 0x95, 0x02, 0x21, 0xF0, 0x01, 0x15, 0x45, + 0x02, 0x28, 0xA0, 0xB6, 0x2C, 0x60, 0xC8, 0x9F, 0x6C, 0xC8, 0x94, 0xF4, + 0x15, 0x00, 0x39, 0x66, 0x0E, 0x93, 0x00, 0x86, 0x66, 0x2F, 0x02, 0xD0, + 0x2F, 0x25, 0xB2, 0x66, 0x31, 0x9D, 0x06, 0x0B, 0x2D, 0x06, 0x84, 0xD0, + 0x06, 0x54, 0xF1, 0xBD, 0x65, 0x86, 0xC9, 0xAD, 0x67, 0x06, 0x0C, 0x9D, + 0x9A, 0x43, 0xB1, 0xE1, 0x4E, 0x55, 0x06, 0x6A, 0xE0, 0x3E, 0x37, 0x2D, + 0x08, 0xA5, 0x14, 0x9B, 0x6C, 0xB2, 0x4A, 0x59, 0x8E, 0xDC, 0x21, 0x1C, + 0x19, 0x8B, 0x5B, 0x09, 0x8B, 0x10, 0xFE, 0x4B, 0x6F, 0x40, 0xDD, 0x35, + 0x10, 0x03, 0x37, 0x60, 0x57, 0xB7, 0xB0, 0xA6, 0x77, 0x25, 0x0C, 0xB7, + 0x80, 0x57, 0xE8, 0xA0, 0xB9, 0x30, 0x1C, 0x0C, 0x83, 0x6E, 0xBA, 0x59, + 0x4D, 0x1E, 0x8A, 0x45, 0xE7, 0xE5, 0x7D, 0xE7, 0xEC, 0xF9, 0xBA, 0xC0, + 0xD2, 0xDE, 0x1B, 0xEB, 0x8A, 0xE7, 0x51, 0x8B, 0x67, 0x1D, 0x04, 0x8B, + 0x13, 0x04, 0x9E, 0x20, 0x04, 0x08, 0x41, 0x70, 0xA3, 0x50, 0x0A, 0xD4, + 0x90, 0x0C, 0x98, 0x7A, 0xCE, 0x31, 0xAB, 0x0A, 0xA7, 0x90, 0x0C, 0x05, + 0xBA, 0xE0, 0x97, 0xFE, 0xC5, 0xA0, 0x20, 0x03, 0x6F, 0x14, 0x06, 0x41, + 0xD1, 0x47, 0xD9, 0x15, 0xE2, 0x4D, 0x72, 0x31, 0x28, 0x10, 0x02, 0x2A, + 0x35, 0x30, 0xCF, 0x77, 0x09, 0x68, 0x60, 0xED, 0x1E, 0x83, 0xD8, 0x4F, + 0x71, 0x66, 0xD9, 0xA5, 0x3C, 0x78, 0x96, 0x02, 0x6A, 0xD0, 0x98, 0x2F, + 0xEE, 0x3C, 0x03, 0xED, 0x01, 0xBB, 0x4E, 0x66, 0x63, 0x30, 0x06, 0xCC, + 0x37, 0x15, 0xCE, 0x73, 0x15, 0x8A, 0x76, 0xBE, 0x23, 0x60, 0x68, 0x89, + 0xF6, 0x22, 0x0D, 0x30, 0x00, 0x0C, 0xF0, 0x13, 0xA9, 0xDC, 0x2E, 0x42, + 0xAA, 0x06, 0x2F, 0x10, 0xAB, 0x86, 0x1D, 0x02, 0x9F, 0x8C, 0x2E, 0x91, + 0x36, 0x5C, 0xEA, 0x08, 0x47, 0x9C, 0xB6, 0x25, 0x97, 0x10, 0x5C, 0x31, + 0x8D, 0x07, 0x7D, 0x31, 0x08, 0x86, 0x20, 0x74, 0x89, 0x60, 0x33, 0x85, + 0xB0, 0x07, 0xAD, 0xCC, 0x87, 0x6C, 0x12, 0xF7, 0xE8, 0xFE, 0x5F, 0x7C, + 0xE0, 0x07, 0x7D, 0x00, 0x03, 0x93, 0x90, 0xF7, 0x26, 0x40, 0x05, 0xBB, + 0x60, 0x0A, 0x58, 0xC0, 0x0B, 0xBD, 0x06, 0x62, 0xB8, 0xF0, 0x61, 0xC3, + 0xAC, 0xEF, 0x79, 0x95, 0x0B, 0x17, 0xB0, 0x0E, 0xFE, 0x2E, 0xE7, 0x5C, + 0x5D, 0x8A, 0xE5, 0x9D, 0x9E, 0xAF, 0xEB, 0xD5, 0xED, 0xFE, 0x7D, 0xF0, + 0x87, 0xCA, 0x43, 0x5A, 0x93, 0x0E, 0x4D, 0x80, 0x03, 0x43, 0x90, 0xDF, + 0x25, 0x6B, 0xB2, 0x42, 0x50, 0x0A, 0x04, 0x07, 0xC5, 0xA7, 0xC0, 0x9F, + 0xD4, 0xC0, 0x0D, 0xD7, 0xC0, 0x0D, 0x02, 0x4E, 0x0B, 0xD2, 0x80, 0x2D, + 0xCB, 0x60, 0x50, 0x94, 0x6E, 0xE8, 0x21, 0xFF, 0x96, 0xFC, 0x30, 0x04, + 0xD7, 0xEB, 0x06, 0x1F, 0x12, 0x7A, 0x1C, 0xF3, 0x22, 0x0A, 0xAD, 0xD8, + 0x79, 0x2C, 0x30, 0xAF, 0x1E, 0x06, 0x73, 0x2B, 0x84, 0x39, 0xD1, 0x02, + 0x67, 0x94, 0x5E, 0xB4, 0xAA, 0xE1, 0x94, 0xC4, 0x02, 0x6F, 0x94, 0x71, + 0x4D, 0xAB, 0xBD, 0xCB, 0x13, 0xE2, 0xC5, 0x03, 0xD2, 0x8E, 0xE9, 0x67, + 0x2D, 0x50, 0x15, 0x5F, 0xB1, 0x00, 0x01, 0x63, 0x14, 0x0B, 0x20, 0x00, + 0xFB, 0x18, 0x15, 0x23, 0x90, 0x00, 0x0B, 0x70, 0x06, 0x14, 0xD9, 0x06, + 0x85, 0xE0, 0x46, 0x84, 0xB0, 0x86, 0x82, 0xF0, 0x21, 0xFF, 0x32, 0x7A, + 0x3D, 0xFF, 0x02, 0xC7, 0x33, 0xBE, 0x6B, 0xB8, 0x02, 0x97, 0x30, 0x7C, + 0x3C, 0x4F, 0x22, 0x6A, 0xF0, 0xC6, 0x87, 0x20, 0x09, 0x5E, 0x22, 0x33, + 0xF3, 0x63, 0x07, 0x00, 0xD1, 0x26, 0xCF, 0x21, 0x43, 0x76, 0xF6, 0x24, + 0x2A, 0xC4, 0x88, 0xD1, 0x24, 0x46, 0x91, 0x26, 0x4D, 0xAA, 0x74, 0x27, + 0x0E, 0x0C, 0x88, 0x31, 0x4C, 0x34, 0xB9, 0x92, 0xD1, 0xCA, 0xAD, 0x8C, + 0xB7, 0x4C, 0xDD, 0x12, 0x06, 0x8C, 0x57, 0x2E, 0x61, 0xC1, 0x82, 0x0D, + 0x13, 0x36, 0xEC, 0x0A, 0x26, 0x77, 0xEC, 0xDC, 0xBD, 0x7C, 0xC9, 0x8E, + 0x5D, 0x3D, 0x99, 0x2D, 0x5B, 0xBA, 0xAC, 0x29, 0x13, 0xE7, 0x4E, 0x99, + 0xEA, 0x74, 0xFE, 0x64, 0xA7, 0x2E, 0x1D, 0x50, 0x76, 0xE9, 0xD2, 0x09, + 0x1D, 0x5A, 0x54, 0xA6, 0x51, 0xA3, 0xEA, 0x9C, 0xB2, 0xCB, 0xD6, 0xAD, + 0xFE, 0x5B, 0x3D, 0x58, 0x11, 0x8A, 0x0C, 0x21, 0x42, 0x24, 0x47, 0x90, + 0x26, 0x42, 0x6E, 0x78, 0xD3, 0x17, 0x56, 0xEC, 0x58, 0xB2, 0x65, 0xCD, + 0x9E, 0x45, 0x8B, 0x76, 0x54, 0x29, 0x69, 0xD5, 0xAA, 0x71, 0xBB, 0xB6, + 0x6D, 0x9B, 0xB5, 0x69, 0xB4, 0x68, 0xC1, 0x82, 0xB5, 0x4C, 0xD6, 0xAC, + 0x64, 0xAA, 0xF2, 0xA5, 0x05, 0x1C, 0x58, 0xF0, 0x60, 0xC2, 0x85, 0x0D, + 0x1F, 0x36, 0xCC, 0x6D, 0xC6, 0x87, 0x4B, 0x6A, 0xCE, 0xB4, 0xD1, 0x93, + 0x62, 0xC5, 0x8A, 0x30, 0x21, 0x4E, 0x9C, 0x58, 0xD1, 0x82, 0x44, 0x88, + 0x11, 0x21, 0x48, 0x30, 0xE0, 0x90, 0x22, 0x4C, 0x0B, 0x31, 0x61, 0xC2, + 0x88, 0x11, 0x93, 0x79, 0x8C, 0x8A, 0xCC, 0x66, 0x5A, 0x94, 0x09, 0x73, + 0x42, 0x05, 0x89, 0x15, 0x66, 0x58, 0x5C, 0xEE, 0xB0, 0x82, 0xC4, 0x0B, + 0x19, 0x23, 0x46, 0xAC, 0x50, 0x71, 0x66, 0x0C, 0xE5, 0x11, 0x2D, 0xC2, + 0xBC, 0xE8, 0x30, 0x42, 0x8C, 0x6C, 0x12, 0x29, 0x4E, 0x30, 0x60, 0xE0, + 0x60, 0xC0, 0x00, 0x0F, 0x0C, 0x54, 0x30, 0x48, 0xB0, 0xA0, 0x85, 0x1E, + 0x31, 0x6D, 0x08, 0xE1, 0x11, 0x74, 0x28, 0x8C, 0x1A, 0x3D, 0x66, 0xDA, + 0xA8, 0xE0, 0x70, 0x09, 0x8D, 0x18, 0x35, 0x9A, 0x5B, 0xD4, 0x91, 0x1C, + 0x46, 0x45, 0x98, 0x36, 0x2C, 0x58, 0x94, 0x71, 0xD3, 0xC6, 0x0D, 0x1E, + 0x37, 0x75, 0x08, 0xB5, 0xC1, 0x63, 0x10, 0x42, 0xDC, 0xB8, 0x64, 0x10, + 0x3C, 0xF2, 0xD8, 0xA3, 0x10, 0x43, 0xF2, 0x30, 0x84, 0x91, 0x44, 0x0C, + 0x31, 0x24, 0x12, 0x85, 0x18, 0xAA, 0x64, 0x12, 0x3B, 0x60, 0x58, 0x84, + 0x12, 0x18, 0x44, 0xE8, 0xE1, 0x16, 0x8F, 0xA8, 0x60, 0xA2, 0x09, 0x53, + 0x48, 0x31, 0x05, 0x97, 0x90, 0x70, 0x01, 0x06, 0x45, 0x61, 0x52, 0xE2, + 0x45, 0x98, 0x25, 0xFE, 0x42, 0xB9, 0xC7, 0x25, 0x9B, 0x7E, 0xBA, 0x09, + 0xA7, 0x9B, 0x6C, 0xAA, 0x91, 0x28, 0x1D, 0x8B, 0x4A, 0x4A, 0x27, 0xA6, + 0x92, 0x32, 0x6A, 0x1D, 0x9F, 0x8E, 0x42, 0x6A, 0xA8, 0x69, 0x60, 0xE9, + 0x26, 0x9D, 0x6E, 0x70, 0xB8, 0x41, 0x08, 0x1D, 0x80, 0x00, 0x62, 0x07, + 0x21, 0x86, 0xA8, 0x80, 0x14, 0xC4, 0xAE, 0x24, 0x6C, 0x1F, 0x4F, 0x60, + 0xC9, 0xA6, 0x1A, 0x6A, 0xB8, 0xD9, 0xE6, 0x9A, 0xB8, 0xDC, 0xBA, 0xAB, + 0x16, 0x65, 0x6A, 0x49, 0x66, 0x16, 0x55, 0xB0, 0x64, 0xB3, 0x4D, 0x37, + 0xDF, 0x84, 0x53, 0x9F, 0x7D, 0xF4, 0xA1, 0x85, 0x83, 0x13, 0xC6, 0xA8, + 0xA3, 0x8D, 0x33, 0xF4, 0x48, 0x83, 0x04, 0x15, 0xCA, 0x38, 0x81, 0x04, + 0x0E, 0xC2, 0x30, 0xA3, 0xB9, 0x11, 0x3A, 0x08, 0x81, 0x03, 0x12, 0x8A, + 0x5B, 0x41, 0xB4, 0xD3, 0xCE, 0x48, 0x21, 0x05, 0xDB, 0xC2, 0xF8, 0x8D, + 0x85, 0x34, 0xD4, 0x30, 0x03, 0xBD, 0xCC, 0x52, 0x60, 0x41, 0x85, 0x0E, + 0x56, 0xFB, 0xA0, 0x8C, 0xCC, 0xCE, 0x68, 0x61, 0x8C, 0x30, 0xEA, 0x28, + 0x4D, 0x8C, 0x17, 0xD0, 0x60, 0x21, 0x05, 0x15, 0x6E, 0xF3, 0xED, 0x84, + 0x43, 0x17, 0x58, 0x60, 0x80, 0xEC, 0x46, 0x10, 0x01, 0x3B, 0x07, 0x4E, + 0x68, 0xA3, 0x0D, 0x41, 0xFE, 0xC3, 0x03, 0x8F, 0x17, 0xDC, 0x50, 0x83, + 0x3F, 0x41, 0xEF, 0xC3, 0x34, 0x0D, 0x33, 0xCE, 0xB8, 0xE4, 0x85, 0x30, + 0x26, 0x4B, 0xA3, 0x85, 0x4B, 0xA2, 0xBD, 0xE4, 0xB1, 0x65, 0xF1, 0x38, + 0xA3, 0x58, 0x44, 0x0E, 0xC1, 0x53, 0x8F, 0x3D, 0x0C, 0xD9, 0x63, 0x0D, + 0x43, 0x0A, 0x49, 0x64, 0x92, 0x48, 0x12, 0x51, 0x84, 0xA1, 0x85, 0x14, + 0x61, 0xA4, 0x12, 0x36, 0xF2, 0xE8, 0x64, 0xC3, 0x1D, 0x84, 0xB9, 0x05, + 0x18, 0x8F, 0x4C, 0xC9, 0xC5, 0x94, 0xFE, 0x8F, 0x7E, 0xC1, 0xC5, 0x94, + 0x57, 0x6E, 0xC1, 0xA5, 0xDE, 0x60, 0x84, 0xE1, 0x05, 0x8B, 0x20, 0xD6, + 0xA9, 0x07, 0x26, 0x19, 0x17, 0x66, 0x38, 0x26, 0x1B, 0x77, 0xDC, 0xB1, + 0x47, 0x9F, 0x78, 0x34, 0x8A, 0x47, 0xA1, 0x9C, 0x4A, 0x47, 0xC8, 0xA0, + 0xD4, 0xE1, 0x06, 0x99, 0x6E, 0x64, 0x02, 0x22, 0x82, 0x26, 0xA2, 0x0C, + 0x42, 0x88, 0x1D, 0x8A, 0xD0, 0xA1, 0x89, 0x39, 0xE3, 0x84, 0x73, 0x1F, + 0x22, 0x68, 0x71, 0xCB, 0x1A, 0x6E, 0xC0, 0x9C, 0x4B, 0x1A, 0x69, 0xF0, + 0x82, 0x45, 0x99, 0x59, 0x90, 0x59, 0xA6, 0x14, 0x96, 0x7F, 0x06, 0x3A, + 0xE8, 0x36, 0x57, 0xAE, 0x45, 0x3B, 0x37, 0x04, 0x69, 0xA3, 0x0C, 0x3D, + 0x5A, 0xE8, 0x80, 0x35, 0x12, 0x04, 0x95, 0x74, 0xB9, 0x34, 0x54, 0xE0, + 0x4C, 0x51, 0x15, 0x66, 0x6B, 0xA3, 0x3D, 0x35, 0x26, 0x4B, 0xA1, 0x34, + 0xE7, 0xBE, 0xC6, 0xE3, 0x3C, 0xCD, 0x26, 0x53, 0x41, 0x59, 0x53, 0xE5, + 0xC3, 0xA3, 0x8E, 0x16, 0x58, 0xD0, 0xA3, 0x0E, 0x16, 0x50, 0xBB, 0xB4, + 0x8D, 0xE1, 0x22, 0x4D, 0x01, 0x34, 0xCE, 0x1C, 0x70, 0x40, 0x81, 0x01, + 0x14, 0xE0, 0x80, 0x83, 0x05, 0x14, 0x48, 0x20, 0x81, 0x15, 0xF4, 0x20, + 0xE4, 0x10, 0x37, 0xCE, 0xC0, 0x43, 0x0F, 0xC7, 0xEA, 0x28, 0x43, 0x54, + 0x0E, 0x54, 0x30, 0x43, 0x8D, 0x5E, 0x19, 0x5F, 0xE1, 0x85, 0x16, 0x58, + 0x13, 0xE3, 0x8C, 0xD4, 0x6A, 0x73, 0x43, 0x0C, 0x33, 0xC2, 0x50, 0x7A, + 0x10, 0x3D, 0x06, 0x91, 0x3C, 0xF1, 0x41, 0xEC, 0xD0, 0xE3, 0xDC, 0x72, + 0x27, 0x41, 0x37, 0x5D, 0x46, 0x16, 0x59, 0xA8, 0x12, 0x3B, 0xDE, 0xE8, + 0x84, 0x8D, 0x12, 0x68, 0xC0, 0xE5, 0x95, 0xDC, 0x3D, 0x22, 0x51, 0x77, + 0x5C, 0x7E, 0xFF, 0x5D, 0xDF, 0x5C, 0xD0, 0x11, 0x66, 0xFE, 0x17, 0x2B, + 0x44, 0xC9, 0x31, 0x26, 0x9A, 0x72, 0xE2, 0x89, 0xA8, 0x1C, 0x21, 0xE6, + 0xB1, 0x27, 0x22, 0x7F, 0x3A, 0x0A, 0x48, 0x8A, 0xA5, 0xCA, 0x46, 0x9D, + 0x6E, 0xDC, 0x69, 0x25, 0x02, 0x1F, 0x9C, 0x8C, 0x72, 0x86, 0x22, 0x82, + 0x98, 0xE1, 0x15, 0xA1, 0xDB, 0xCC, 0x67, 0x94, 0x5A, 0x6C, 0xB6, 0x46, + 0x4C, 0x6E, 0xAC, 0xA1, 0x4B, 0x9A, 0x5A, 0x60, 0x71, 0x45, 0x9A, 0x64, + 0x64, 0x59, 0xC6, 0x95, 0xF3, 0xF7, 0xE7, 0xBF, 0xFF, 0xB2, 0xE6, 0xF0, + 0x40, 0x18, 0xF4, 0x70, 0x08, 0x3D, 0xB8, 0x41, 0x54, 0x27, 0x68, 0xC1, + 0x65, 0x5E, 0x45, 0x28, 0x31, 0x8C, 0xC0, 0x39, 0x0C, 0x20, 0x01, 0x08, + 0x40, 0xE0, 0x19, 0xE5, 0xD4, 0xC1, 0x3C, 0x67, 0x08, 0x03, 0x0B, 0xCC, + 0x50, 0x07, 0xCB, 0xBD, 0xCD, 0x0C, 0x65, 0xB0, 0xCD, 0x08, 0x16, 0x48, + 0xA8, 0x3A, 0xA4, 0x21, 0x0C, 0x29, 0xC8, 0x8D, 0xD7, 0xCC, 0x90, 0x06, + 0x3D, 0x45, 0x6E, 0x59, 0x66, 0x10, 0x03, 0x09, 0x4E, 0xE0, 0xAA, 0x16, + 0x70, 0xC0, 0x33, 0x0B, 0xC0, 0xDB, 0x74, 0x14, 0xF0, 0xB7, 0x1D, 0x3A, + 0x20, 0x05, 0xBF, 0x12, 0x44, 0xDA, 0xFA, 0x53, 0x07, 0x35, 0x10, 0x62, + 0x0C, 0x2C, 0x58, 0x01, 0x03, 0x56, 0x20, 0x86, 0xF7, 0x90, 0x6E, 0x89, + 0x2F, 0xE8, 0x9A, 0x71, 0x2E, 0x21, 0x83, 0xF9, 0x7C, 0x0E, 0x36, 0x61, + 0x38, 0x9A, 0x20, 0xDC, 0x60, 0x06, 0x33, 0x10, 0x44, 0x0F, 0x78, 0x20, + 0x97, 0x22, 0x1C, 0x12, 0x09, 0x09, 0xA5, 0x8B, 0x21, 0x10, 0x61, 0x84, + 0x22, 0x60, 0x50, 0x89, 0x38, 0x88, 0x20, 0x07, 0xAF, 0x80, 0xE3, 0x2D, + 0x4A, 0x51, 0x8A, 0xDF, 0x61, 0x23, 0x45, 0xA5, 0x30, 0x99, 0x15, 0x7E, + 0xF7, 0x8B, 0x15, 0xED, 0xE2, 0x0A, 0xC8, 0xAB, 0x11, 0x4C, 0x66, 0x14, + 0xFE, 0x48, 0xE8, 0x41, 0xAF, 0x25, 0xD5, 0x5B, 0x8A, 0x52, 0x7C, 0xC4, + 0x94, 0xA0, 0x54, 0x4C, 0x49, 0xDD, 0xD8, 0x86, 0x53, 0xD4, 0x31, 0x0D, + 0x1D, 0xE0, 0x00, 0x08, 0x3A, 0xC8, 0x41, 0x26, 0x73, 0x20, 0x04, 0x08, + 0x14, 0x01, 0x1F, 0xFE, 0x3B, 0x8C, 0x96, 0x6A, 0x51, 0x8D, 0x5F, 0x5C, + 0x63, 0x66, 0x33, 0xB3, 0x46, 0x35, 0xA4, 0x41, 0x8B, 0x56, 0xB4, 0x42, + 0x67, 0xD0, 0x90, 0x45, 0x2D, 0x40, 0x39, 0x4B, 0x5A, 0xC6, 0x69, 0x08, + 0x0B, 0x50, 0xC3, 0x20, 0x22, 0x61, 0xC4, 0x16, 0x58, 0xCE, 0x38, 0x2B, + 0xE0, 0x55, 0x1D, 0x4E, 0xF8, 0x38, 0x37, 0x8C, 0xE0, 0x04, 0x1D, 0x60, + 0x00, 0xA2, 0x5A, 0x90, 0x82, 0x31, 0x94, 0xA1, 0x58, 0x2C, 0x08, 0xC3, + 0x18, 0xB8, 0xB3, 0xA7, 0x16, 0xB4, 0xE0, 0x03, 0x62, 0xE0, 0xD4, 0xA1, + 0xD8, 0xD3, 0x02, 0x35, 0x8C, 0x21, 0x05, 0x2D, 0x98, 0xCC, 0x09, 0x9F, + 0x35, 0x1A, 0xCF, 0x8D, 0x81, 0x34, 0x4C, 0xEC, 0xD4, 0xE3, 0x58, 0x13, + 0x82, 0x0E, 0x80, 0x20, 0x99, 0x09, 0x10, 0xC0, 0x00, 0x68, 0xE5, 0x00, + 0xD0, 0x0C, 0x80, 0x04, 0x75, 0x10, 0x10, 0x1E, 0xD4, 0x50, 0x07, 0xFE, + 0x98, 0x61, 0x0C, 0x6A, 0xD8, 0x9A, 0x08, 0x8C, 0xE3, 0x06, 0x03, 0x89, + 0xE1, 0x12, 0x62, 0x50, 0xC1, 0x09, 0x4E, 0xB8, 0x35, 0x04, 0x66, 0x2E, + 0x05, 0x2F, 0x30, 0x03, 0x78, 0x0C, 0x88, 0xA7, 0x42, 0x0C, 0x62, 0x10, + 0x0A, 0xD2, 0x25, 0x25, 0x24, 0x91, 0x88, 0x72, 0xA1, 0x8B, 0x12, 0x67, + 0xAC, 0x84, 0x22, 0xD8, 0x00, 0x89, 0x3B, 0x88, 0xE0, 0x06, 0xAF, 0xD0, + 0x05, 0x1C, 0x5F, 0x51, 0x8A, 0x5F, 0x7C, 0x03, 0x1B, 0xAF, 0xD8, 0x01, + 0x04, 0x26, 0x30, 0x01, 0x08, 0xF4, 0xC0, 0x15, 0xC0, 0x58, 0x11, 0x30, + 0x9A, 0xC0, 0x92, 0xFE, 0x40, 0x2A, 0xEC, 0x46, 0xCD, 0x03, 0x6A, 0x21, + 0x33, 0x56, 0x24, 0x45, 0xFE, 0xC8, 0x91, 0x3F, 0x92, 0x64, 0x37, 0xB4, + 0x31, 0x8D, 0x6D, 0x14, 0x01, 0x02, 0x41, 0xD8, 0x41, 0x0E, 0x80, 0x50, + 0x84, 0x1C, 0xEC, 0xA0, 0x02, 0x15, 0xE0, 0x86, 0x9C, 0x6A, 0x29, 0x98, + 0x7D, 0x58, 0x61, 0x16, 0x6E, 0x31, 0xA5, 0x29, 0xE1, 0x67, 0x8D, 0x34, + 0xCD, 0x6F, 0x1A, 0x69, 0x9A, 0x85, 0x95, 0xB6, 0xBA, 0x56, 0xB6, 0x0A, + 0x86, 0x1F, 0x3A, 0x58, 0x80, 0x19, 0x08, 0x31, 0xA0, 0x46, 0x41, 0x6B, + 0x0C, 0x4C, 0x2C, 0x03, 0x42, 0xC3, 0xC0, 0x00, 0xCC, 0x50, 0xCA, 0x98, + 0x7D, 0x0B, 0x43, 0x07, 0x68, 0x58, 0x06, 0x4B, 0x9D, 0xA1, 0x0C, 0xBD, + 0x4C, 0xCD, 0x0B, 0xE6, 0x03, 0x3A, 0xCA, 0x8C, 0xA1, 0x99, 0xA7, 0xF9, + 0xA6, 0xAB, 0x50, 0x13, 0x86, 0x6C, 0x95, 0x6A, 0x32, 0xE0, 0x8C, 0xD4, + 0x0C, 0x53, 0xC0, 0x01, 0xCD, 0xA4, 0xE0, 0x6F, 0x0E, 0xF0, 0x5B, 0x02, + 0xA4, 0x03, 0xDA, 0x06, 0x7C, 0x26, 0x01, 0x0C, 0x38, 0x83, 0x20, 0x48, + 0x57, 0x87, 0x3A, 0xB8, 0x61, 0x8B, 0xCE, 0x6C, 0x43, 0x0B, 0x64, 0xD0, + 0xB5, 0x5C, 0x76, 0x4E, 0x0C, 0x26, 0x3C, 0xAC, 0x68, 0x68, 0xE3, 0xAC, + 0x19, 0x6E, 0xF0, 0x8B, 0x97, 0xE8, 0x95, 0x20, 0x04, 0x31, 0xC0, 0x44, + 0x0C, 0x42, 0x12, 0x94, 0xA0, 0x44, 0x24, 0x10, 0x31, 0x09, 0x43, 0xF0, + 0x21, 0x11, 0x15, 0x52, 0x88, 0x1A, 0x23, 0x22, 0x82, 0x0A, 0xBC, 0xE2, + 0x17, 0xBF, 0xD0, 0x05, 0x36, 0xAE, 0xFB, 0x0B, 0x4E, 0x12, 0x80, 0x03, + 0x2F, 0x70, 0xC1, 0x04, 0x10, 0x60, 0x05, 0x6C, 0xAC, 0x28, 0x17, 0x4D, + 0x20, 0xC5, 0xF2, 0x6A, 0xE2, 0x30, 0x1A, 0x15, 0x12, 0x7A, 0x19, 0x5B, + 0x07, 0x23, 0x0F, 0x49, 0xB1, 0xA5, 0xFE, 0x18, 0x35, 0xA9, 0xDD, 0xC8, + 0x86, 0x3F, 0xBA, 0x01, 0x8B, 0x0A, 0xDC, 0x60, 0x2B, 0x99, 0x04, 0x42, + 0x10, 0x74, 0xF0, 0x00, 0x4C, 0xFC, 0xA5, 0xAD, 0x69, 0xC1, 0x47, 0x28, + 0x68, 0xD1, 0x16, 0x31, 0x89, 0xD5, 0x1A, 0xD9, 0xD0, 0xC5, 0x5D, 0x60, + 0x31, 0x0D, 0x68, 0x24, 0x03, 0x16, 0x6A, 0x3D, 0x70, 0x86, 0x35, 0xDC, + 0x8F, 0x08, 0x78, 0xC0, 0x0D, 0x88, 0x10, 0x04, 0x13, 0x47, 0xE0, 0x27, + 0x31, 0x8C, 0xE1, 0xA0, 0x93, 0xA1, 0x4D, 0x42, 0x8B, 0x93, 0x82, 0x10, + 0x80, 0xC6, 0x4F, 0x2B, 0x90, 0x01, 0x09, 0x4C, 0xA3, 0xB9, 0xC3, 0x9E, + 0x66, 0x05, 0x68, 0x80, 0x14, 0x0B, 0x5A, 0x60, 0x86, 0xCE, 0x79, 0x73, + 0x6D, 0x08, 0x3C, 0x4D, 0xB4, 0x66, 0x93, 0xB9, 0xC7, 0x2C, 0xD3, 0x72, + 0x09, 0x95, 0xCD, 0x0A, 0x7C, 0xC3, 0x4E, 0x12, 0x74, 0x40, 0x6F, 0x38, + 0x74, 0x40, 0x03, 0xF2, 0xD6, 0x37, 0x0E, 0x60, 0x87, 0x01, 0x62, 0x18, + 0x84, 0xE1, 0xF4, 0x13, 0xAC, 0x32, 0x34, 0x06, 0x86, 0xAC, 0x71, 0xAD, + 0x61, 0xCF, 0x60, 0xD8, 0x17, 0x00, 0xC7, 0x0D, 0x2F, 0x08, 0xD4, 0x0C, + 0x9D, 0xB5, 0x42, 0x80, 0xF6, 0x4A, 0x0F, 0x6F, 0x8E, 0xC4, 0x21, 0xFC, + 0x83, 0x5C, 0xD6, 0x3D, 0x68, 0x0D, 0x7C, 0x78, 0x48, 0xBA, 0x14, 0x11, + 0x03, 0x85, 0x94, 0x20, 0x03, 0x28, 0xC2, 0x06, 0x38, 0x7E, 0x01, 0x8C, + 0x52, 0xD0, 0x00, 0x00, 0x09, 0xE0, 0x00, 0x08, 0x54, 0x90, 0x82, 0x06, + 0x4C, 0x80, 0x06, 0xA6, 0xC0, 0xA9, 0x30, 0x8E, 0x57, 0x8F, 0xA1, 0xE0, + 0x28, 0x27, 0xEC, 0x7D, 0x9E, 0x7B, 0xEB, 0x2B, 0x5F, 0xA3, 0x2E, 0x05, + 0x29, 0x45, 0xC1, 0x98, 0x3A, 0xB2, 0xA1, 0x8D, 0x6D, 0x74, 0x43, 0xD4, + 0x41, 0x88, 0x40, 0x55, 0xA3, 0x7A, 0xB2, 0x1D, 0x1C, 0xFE, 0xE0, 0x01, + 0x3B, 0x10, 0xC5, 0x28, 0x44, 0xE1, 0x8D, 0x95, 0x69, 0x38, 0x2C, 0xF8, + 0x18, 0x85, 0x2E, 0xB0, 0x6B, 0x4A, 0xB8, 0x3C, 0x38, 0x1B, 0xD4, 0x98, + 0x85, 0x2B, 0x6A, 0xA1, 0x0D, 0x65, 0xC0, 0x52, 0x14, 0xB6, 0x46, 0xF6, + 0x56, 0xE7, 0xD4, 0x8F, 0x07, 0x74, 0x80, 0x3F, 0xAC, 0x5A, 0xC1, 0x19, + 0x74, 0xB3, 0x02, 0x35, 0x34, 0xCE, 0x3C, 0x4F, 0xF3, 0xCD, 0xA2, 0x4D, + 0x83, 0x9E, 0xA7, 0xC5, 0x98, 0x6E, 0x1F, 0x4C, 0x43, 0xAB, 0xA0, 0x88, + 0x1A, 0x3C, 0x35, 0xD3, 0x9B, 0x62, 0xF8, 0xC0, 0x37, 0x59, 0x93, 0x86, + 0x17, 0x94, 0xD9, 0x84, 0x94, 0xA5, 0x6C, 0x35, 0xA9, 0x9D, 0xC1, 0x15, + 0xA8, 0xC7, 0x05, 0x76, 0x62, 0xC0, 0xA1, 0x18, 0xA0, 0x37, 0x07, 0x2C, + 0xA0, 0x01, 0x3B, 0x5C, 0x80, 0xDF, 0xAA, 0xAC, 0x00, 0x06, 0xB4, 0xC1, + 0x70, 0x62, 0x70, 0xED, 0x80, 0xEC, 0xF3, 0xC1, 0x4B, 0x90, 0xA0, 0x05, + 0x67, 0x20, 0x16, 0xA1, 0x9E, 0x35, 0x99, 0x62, 0xA5, 0x60, 0x51, 0xD5, + 0x3C, 0xCE, 0xE5, 0xF2, 0x84, 0x41, 0x35, 0x6C, 0x4B, 0x0D, 0x6E, 0x80, + 0x83, 0x1E, 0x24, 0x21, 0x89, 0x42, 0x14, 0x62, 0x0F, 0x70, 0x68, 0xAE, + 0x22, 0xD8, 0xA5, 0x46, 0x76, 0xA1, 0x60, 0x06, 0xB6, 0xF0, 0xC4, 0x1C, + 0x5F, 0x61, 0x05, 0x03, 0x00, 0xA0, 0x01, 0x22, 0x18, 0xF1, 0x7C, 0x5C, + 0xA0, 0x00, 0x08, 0x30, 0xC1, 0xBC, 0x3D, 0xF0, 0xC4, 0x7C, 0x77, 0x62, + 0x69, 0xA2, 0xF4, 0x48, 0x91, 0x8B, 0x74, 0xA4, 0x50, 0xA8, 0xC7, 0x48, + 0xA4, 0x36, 0xE5, 0x29, 0xDA, 0xD3, 0x86, 0x54, 0x22, 0xA9, 0x8A, 0x08, + 0x58, 0x52, 0x08, 0x38, 0x08, 0x42, 0x10, 0x8C, 0x20, 0x81, 0x09, 0x04, + 0x61, 0x08, 0x03, 0x26, 0x40, 0x05, 0xC0, 0x52, 0xEB, 0x0C, 0xBF, 0xC3, + 0xFE, 0x0A, 0xD0, 0xB8, 0xEE, 0x29, 0xB1, 0x31, 0x17, 0x6A, 0x40, 0xA3, + 0x16, 0xAE, 0xA0, 0x45, 0x85, 0xCB, 0x9A, 0x6C, 0xBA, 0xD3, 0x92, 0x1A, + 0x09, 0x50, 0x81, 0x7E, 0x3A, 0x97, 0x06, 0x42, 0xC0, 0x30, 0x72, 0x2F, + 0x68, 0x4C, 0x1A, 0x28, 0xF3, 0x34, 0x15, 0x2C, 0x33, 0xDA, 0x94, 0x5A, + 0x81, 0x0B, 0x3A, 0xE0, 0x70, 0xD6, 0x50, 0xDB, 0x0C, 0xAE, 0x02, 0x1D, + 0x08, 0xDB, 0x90, 0xA7, 0xCC, 0x35, 0x8E, 0x34, 0x94, 0x01, 0x4E, 0xD9, + 0x80, 0x03, 0xC5, 0xF1, 0x64, 0xD0, 0x3C, 0x4C, 0x4C, 0xCD, 0x0A, 0x91, + 0x38, 0x06, 0x59, 0x8D, 0x60, 0x87, 0xD9, 0x01, 0x78, 0xE0, 0x68, 0x45, + 0x2B, 0x44, 0x5F, 0x82, 0x58, 0x5A, 0x14, 0x83, 0x3E, 0x4D, 0x93, 0x1F, + 0x84, 0x9E, 0x60, 0x9F, 0xAA, 0x32, 0x43, 0x66, 0xBA, 0x89, 0x07, 0xF5, + 0x34, 0x47, 0x34, 0xBA, 0x51, 0x41, 0x1D, 0xF4, 0x70, 0xD8, 0x33, 0x58, + 0x74, 0x3C, 0x79, 0xC8, 0x03, 0x22, 0x12, 0x71, 0x08, 0x41, 0x30, 0xE8, + 0x10, 0x6B, 0x20, 0x83, 0x1D, 0x12, 0xC1, 0x07, 0x18, 0xDC, 0x81, 0x11, + 0x30, 0x38, 0x82, 0x11, 0x70, 0xC0, 0xA4, 0x07, 0x04, 0x60, 0x00, 0x7D, + 0x13, 0x6C, 0x0B, 0xD6, 0x70, 0x2A, 0x0F, 0xDC, 0xA0, 0x24, 0x2D, 0xE2, + 0x01, 0x11, 0xEA, 0x31, 0xB1, 0x9F, 0xDA, 0x28, 0xD3, 0xD6, 0x5B, 0x3A, + 0x23, 0x7D, 0x34, 0x31, 0xA6, 0x14, 0xC9, 0xE9, 0x4F, 0x97, 0x8A, 0x53, + 0x94, 0xCA, 0x8E, 0x6D, 0xE8, 0xC0, 0xBF, 0x51, 0xF5, 0xBA, 0x1D, 0xB8, + 0x01, 0x02, 0x88, 0x80, 0x39, 0xB8, 0x8A, 0x1B, 0x78, 0x80, 0x1C, 0x20, + 0x07, 0xB2, 0xCB, 0x30, 0x78, 0x20, 0x82, 0xB6, 0x90, 0x86, 0x06, 0x83, + 0x0B, 0x6E, 0xA8, 0x86, 0x57, 0xB8, 0x8B, 0x64, 0xC0, 0x40, 0x68, 0x08, + 0xB6, 0xBA, 0xE3, 0xFE, 0xC0, 0xFD, 0xF9, 0x24, 0x51, 0x18, 0x80, 0x14, + 0xC8, 0x25, 0x42, 0x80, 0x03, 0xCF, 0x19, 0x84, 0x19, 0x8B, 0xBD, 0x33, + 0xC0, 0x0C, 0xAE, 0x31, 0x0D, 0xCC, 0x50, 0x83, 0x06, 0xFA, 0xA6, 0xA7, + 0x21, 0x01, 0x68, 0xAA, 0x9C, 0xCF, 0x91, 0x31, 0xD4, 0x68, 0x37, 0xCA, + 0x3A, 0x03, 0xF3, 0x28, 0x03, 0x3D, 0x31, 0xA1, 0xCC, 0xA0, 0x0F, 0xF8, + 0x88, 0xA2, 0xC9, 0xB8, 0xAB, 0xBC, 0xE2, 0xA2, 0x11, 0x23, 0xC2, 0xD8, + 0x68, 0xA7, 0x11, 0xE0, 0x80, 0x06, 0x58, 0x80, 0x0E, 0xE0, 0x80, 0xD3, + 0x0A, 0x1C, 0xE8, 0x00, 0x0D, 0x5A, 0x49, 0x83, 0x2F, 0x22, 0x04, 0x34, + 0x00, 0x2E, 0xC3, 0xD2, 0x8F, 0x6A, 0x3B, 0x81, 0x10, 0x50, 0x03, 0x41, + 0x30, 0x8D, 0xD1, 0x70, 0xAC, 0x36, 0xF0, 0x27, 0x17, 0x90, 0x8C, 0xCC, + 0x58, 0x34, 0xCF, 0xD1, 0x1C, 0x37, 0xD0, 0x83, 0x3C, 0x78, 0x81, 0x31, + 0xC8, 0x83, 0x42, 0x38, 0x84, 0x48, 0x08, 0x97, 0x92, 0x3B, 0x04, 0x3E, + 0x60, 0x83, 0x35, 0x98, 0xBE, 0x18, 0x60, 0x83, 0x45, 0x70, 0x01, 0x13, + 0x78, 0x00, 0x02, 0x50, 0x00, 0x00, 0x00, 0x80, 0xE9, 0x68, 0x80, 0x11, + 0x78, 0x81, 0x35, 0xB0, 0x9C, 0x45, 0x61, 0x80, 0x08, 0xC8, 0x84, 0x8F, + 0xC8, 0x85, 0x0A, 0x68, 0x82, 0xA2, 0x68, 0x07, 0xA0, 0x52, 0x18, 0xEA, + 0xD1, 0xC4, 0x44, 0x32, 0x0A, 0xA9, 0x00, 0x0A, 0x8C, 0x31, 0xAA, 0xA1, + 0x68, 0x0A, 0x53, 0x13, 0x8A, 0x6E, 0x98, 0x06, 0xFD, 0x5B, 0x87, 0x6E, + 0x68, 0x87, 0x7B, 0xF0, 0x84, 0x08, 0xD8, 0x81, 0x57, 0xD4, 0x81, 0x20, + 0x20, 0x82, 0x23, 0x78, 0x00, 0x04, 0x78, 0x00, 0x09, 0x78, 0x80, 0x07, + 0x30, 0x00, 0x1F, 0x88, 0x00, 0x57, 0x60, 0xC0, 0x03, 0x33, 0x3B, 0x68, + 0xA8, 0x86, 0x6F, 0x80, 0x0B, 0xB1, 0xFE, 0xA2, 0x40, 0x5A, 0xC8, 0x9F, + 0x59, 0xD0, 0xC0, 0x59, 0x88, 0xA5, 0x0E, 0x74, 0x46, 0xA0, 0xF9, 0x8B, + 0x21, 0x18, 0x00, 0x15, 0x20, 0x1C, 0x41, 0xD8, 0x42, 0xCF, 0xA1, 0x36, + 0xCF, 0xC1, 0x96, 0x17, 0xC8, 0x9C, 0xD2, 0xC8, 0x20, 0x07, 0x0A, 0x03, + 0x19, 0x0A, 0x83, 0x0F, 0x80, 0xA2, 0xE6, 0x68, 0x14, 0x6E, 0x14, 0x83, + 0x32, 0x48, 0x01, 0xD8, 0x18, 0xB3, 0xBC, 0x52, 0x96, 0xCF, 0x19, 0x83, + 0xC9, 0xC3, 0x20, 0x00, 0xE1, 0x31, 0x69, 0x13, 0x0D, 0xCF, 0x79, 0x81, + 0xDB, 0x98, 0x8D, 0xAB, 0x69, 0x14, 0xE7, 0x60, 0xC2, 0x09, 0xE2, 0x00, + 0x26, 0xF4, 0x37, 0x06, 0xC0, 0xA1, 0x43, 0x5B, 0x00, 0xD0, 0xA8, 0x32, + 0x07, 0x28, 0x83, 0x20, 0x1A, 0x90, 0x6C, 0x31, 0x8F, 0x65, 0xE9, 0x95, + 0x70, 0xDC, 0x41, 0x17, 0x60, 0xC3, 0x68, 0xFA, 0x27, 0x37, 0x90, 0x0D, + 0x0E, 0x70, 0x81, 0x70, 0xB4, 0x48, 0x65, 0x91, 0x9C, 0xE5, 0x90, 0xC3, + 0xB9, 0x3A, 0xB3, 0x0F, 0x83, 0x90, 0x37, 0x78, 0x83, 0x49, 0xE0, 0x83, + 0x37, 0xE0, 0x83, 0x45, 0x88, 0x01, 0xBF, 0xB1, 0x15, 0x05, 0x50, 0x80, + 0x29, 0xEB, 0x00, 0x31, 0x58, 0x83, 0x65, 0x72, 0x01, 0x14, 0x48, 0x00, + 0x05, 0x60, 0x02, 0x2C, 0xB8, 0x02, 0x1E, 0xC8, 0x00, 0x4F, 0xA0, 0xB4, + 0xA4, 0x68, 0x3F, 0x4E, 0x14, 0x45, 0xF8, 0xEB, 0x34, 0xA3, 0x23, 0x92, + 0x89, 0x21, 0xAA, 0xA0, 0x48, 0x45, 0x9F, 0x10, 0x35, 0x52, 0x34, 0xB5, + 0x4A, 0x9B, 0x85, 0x1B, 0xC0, 0x3A, 0x20, 0xC8, 0xA4, 0xA8, 0x92, 0x00, + 0x02, 0xB8, 0xC5, 0x19, 0x38, 0x82, 0x54, 0xC3, 0x84, 0x08, 0x20, 0x85, + 0x4F, 0x42, 0xB6, 0x77, 0xF8, 0x04, 0x5D, 0xF8, 0x86, 0x6F, 0x08, 0xAB, + 0x99, 0xB9, 0x06, 0x08, 0xBB, 0x8B, 0x59, 0x98, 0x06, 0xFE, 0x65, 0xB8, + 0x1F, 0x5A, 0x78, 0xC6, 0xB9, 0x8C, 0x13, 0x7C, 0xB8, 0x01, 0x07, 0x58, + 0x01, 0x41, 0x40, 0x04, 0x52, 0xF9, 0xC8, 0x38, 0x8C, 0x26, 0x16, 0x70, + 0x43, 0x33, 0xD0, 0x83, 0x36, 0x90, 0x8F, 0x69, 0x6B, 0x01, 0x07, 0x02, + 0xA6, 0xAB, 0x79, 0x81, 0xA7, 0x81, 0x22, 0x85, 0x7A, 0x81, 0x6A, 0x23, + 0x94, 0x78, 0x4C, 0x83, 0xBC, 0x92, 0xBD, 0x7F, 0x52, 0x96, 0x16, 0x98, + 0xBC, 0xB6, 0x21, 0x2C, 0x0D, 0x1A, 0x4C, 0x2E, 0x7A, 0x96, 0xAB, 0xE9, + 0x0D, 0x10, 0x88, 0x14, 0x28, 0x6C, 0x80, 0x7D, 0x13, 0x94, 0x06, 0xE8, + 0x80, 0xD1, 0x02, 0x1C, 0x79, 0x72, 0x27, 0x0E, 0x20, 0xB8, 0x60, 0x49, + 0x9C, 0xAC, 0x79, 0x33, 0x0C, 0x8A, 0xBD, 0x2C, 0x94, 0x81, 0x76, 0x6B, + 0x81, 0xB0, 0x71, 0x8D, 0x7F, 0x12, 0x84, 0x14, 0xF0, 0x8D, 0x11, 0x50, + 0xC7, 0xCC, 0x70, 0x96, 0x25, 0x5A, 0x83, 0x83, 0x22, 0x03, 0x39, 0xFC, + 0x22, 0x41, 0x58, 0x83, 0x3A, 0xD8, 0x83, 0x37, 0x58, 0x83, 0x3C, 0x60, + 0x04, 0x3B, 0xB8, 0x03, 0x3E, 0x50, 0x23, 0x82, 0x3C, 0xC8, 0x10, 0x28, + 0x01, 0x11, 0x00, 0x01, 0x11, 0x52, 0x01, 0x67, 0xA1, 0x49, 0x38, 0x20, + 0x81, 0x04, 0xA8, 0x80, 0x2B, 0x60, 0x02, 0x1E, 0xC8, 0x01, 0x5A, 0xA0, + 0xB4, 0x1D, 0x71, 0x07, 0x51, 0x5C, 0x07, 0x1F, 0xD9, 0x34, 0xF9, 0x23, + 0x0A, 0x8C, 0x71, 0xCF, 0xFA, 0x92, 0xA4, 0x9E, 0xC8, 0x1E, 0xED, 0x91, + 0xA4, 0x47, 0x1A, 0x82, 0x1B, 0xF0, 0xBA, 0x20, 0xE0, 0xCF, 0x98, 0x32, + 0x80, 0x02, 0x20, 0x00, 0x5C, 0x7C, 0x80, 0x1B, 0x18, 0x82, 0x1C, 0x78, + 0x80, 0x5F, 0xF8, 0xC5, 0xB6, 0xE2, 0x87, 0x51, 0x10, 0x46, 0x09, 0xC4, + 0x86, 0xF7, 0x21, 0x25, 0xBB, 0x80, 0x86, 0x0A, 0xD5, 0x40, 0x59, 0xA2, + 0xFE, 0xCB, 0x0C, 0xC5, 0x92, 0x7D, 0x80, 0x87, 0x08, 0x68, 0x00, 0x16, + 0xC0, 0x03, 0x13, 0xFA, 0x9C, 0xF1, 0x30, 0xAC, 0x32, 0x18, 0x03, 0x13, + 0x4A, 0x03, 0xCF, 0x71, 0x83, 0x4E, 0xD1, 0x8D, 0x65, 0x12, 0x21, 0x63, + 0x92, 0x15, 0xC9, 0x08, 0x14, 0x3F, 0x91, 0xA1, 0x34, 0x30, 0x95, 0xFA, + 0x50, 0x15, 0xCF, 0xDB, 0xC1, 0x7D, 0xCA, 0x2B, 0xCA, 0x2A, 0x16, 0xC3, + 0x4A, 0x03, 0x0C, 0x62, 0x01, 0x61, 0xC2, 0x14, 0xC7, 0x7A, 0x96, 0xCB, + 0x71, 0x8E, 0x26, 0x23, 0x48, 0x82, 0x1B, 0x01, 0x5A, 0x49, 0xCD, 0x01, + 0xE8, 0xB7, 0x01, 0x10, 0x80, 0x27, 0xEC, 0x1B, 0x7B, 0x12, 0x84, 0x8F, + 0x43, 0x1A, 0xFE, 0x38, 0x1C, 0x2C, 0x22, 0x16, 0x15, 0x54, 0x81, 0x78, + 0x44, 0x83, 0x6A, 0x4B, 0x01, 0xC4, 0x51, 0x83, 0xA7, 0xB9, 0x8F, 0x31, + 0x70, 0x16, 0x34, 0xF8, 0x9C, 0x8D, 0x8C, 0x1C, 0xC2, 0xC4, 0xA2, 0x8B, + 0x1A, 0x04, 0xC2, 0x7C, 0x83, 0xD9, 0x49, 0x49, 0x3E, 0x58, 0x49, 0x18, + 0xD8, 0xB7, 0x05, 0x28, 0x01, 0x36, 0x80, 0x01, 0x09, 0x12, 0x01, 0xE7, + 0x08, 0x83, 0x37, 0x70, 0x81, 0xB2, 0x59, 0x83, 0x05, 0x08, 0x00, 0x1E, + 0xE0, 0x81, 0x53, 0x98, 0x85, 0x8B, 0x61, 0x9E, 0x9B, 0xF8, 0x91, 0x45, + 0xA2, 0x98, 0xA3, 0x4A, 0x24, 0x49, 0x8A, 0x2F, 0xA5, 0x5B, 0x24, 0x49, + 0xBA, 0x18, 0xA9, 0xC8, 0xBF, 0xFC, 0x8C, 0x3A, 0x57, 0xF8, 0x4F, 0x01, + 0xC3, 0x01, 0xAF, 0xD0, 0x4A, 0xAD, 0x1C, 0xC4, 0x5B, 0x8C, 0x80, 0x07, + 0x88, 0x00, 0xB0, 0x48, 0x36, 0x79, 0x10, 0x05, 0x5D, 0x6B, 0x30, 0xF7, + 0x49, 0x25, 0xB7, 0x9B, 0x05, 0x65, 0x84, 0x4B, 0x58, 0x90, 0x4B, 0x0D, + 0xC5, 0xD5, 0xC3, 0xF8, 0x06, 0x04, 0x68, 0x00, 0x6D, 0x29, 0x83, 0xE1, + 0x7C, 0xC1, 0x1D, 0xFE, 0x3C, 0xA1, 0x13, 0x88, 0xC3, 0x32, 0xD8, 0xC1, + 0xD2, 0x00, 0x8E, 0x15, 0x8C, 0x94, 0xCC, 0x03, 0xA6, 0xCD, 0x92, 0x21, + 0x07, 0x52, 0x2C, 0x16, 0x78, 0x81, 0x32, 0x40, 0x83, 0x36, 0xB8, 0xAD, + 0x12, 0x8B, 0xA8, 0x1D, 0x64, 0xAD, 0xF6, 0x10, 0x8D, 0xF8, 0x18, 0x8D, + 0xAE, 0x39, 0x83, 0x3A, 0x30, 0x2C, 0xE3, 0x88, 0x2D, 0xD4, 0x58, 0x14, + 0x26, 0xB4, 0xCE, 0xCF, 0x58, 0xCD, 0xBC, 0x49, 0x00, 0x28, 0xED, 0x1B, + 0x1C, 0x3A, 0x81, 0xFC, 0x18, 0xA0, 0xFD, 0xD0, 0x93, 0xBE, 0x63, 0x96, + 0x15, 0x72, 0x38, 0xDE, 0x7B, 0x4C, 0xD8, 0xF8, 0xA7, 0x4B, 0xE8, 0x9A, + 0xC6, 0x19, 0x33, 0xD6, 0x0A, 0x83, 0xE3, 0x8C, 0x3D, 0xA4, 0x21, 0x83, + 0x1E, 0xE4, 0x27, 0x3C, 0x08, 0x83, 0x3B, 0xB3, 0x83, 0x94, 0x54, 0x04, + 0x43, 0x50, 0x04, 0x14, 0xD8, 0x37, 0x0E, 0x10, 0x01, 0x32, 0x78, 0x83, + 0x46, 0x21, 0x03, 0x3F, 0x49, 0x01, 0xC1, 0x53, 0xC4, 0x12, 0x20, 0x81, + 0x05, 0xD0, 0x4A, 0x22, 0xC8, 0x86, 0x75, 0x70, 0x87, 0x7B, 0x58, 0x9E, + 0x89, 0x89, 0x54, 0x46, 0xFA, 0xB4, 0xF8, 0xAA, 0x18, 0x9D, 0xD0, 0x98, + 0xA6, 0x68, 0x0A, 0xEA, 0x01, 0xC5, 0xA4, 0xD4, 0x9E, 0xA8, 0x74, 0x8A, + 0x51, 0x13, 0x0A, 0x23, 0x28, 0x02, 0xAA, 0xBC, 0x3A, 0x01, 0xCB, 0xC5, + 0x1B, 0x98, 0x03, 0x4C, 0xC0, 0x04, 0x23, 0x30, 0x82, 0x1C, 0x18, 0x02, + 0x23, 0x10, 0x02, 0x7D, 0x30, 0xB0, 0x0C, 0xFB, 0x0B, 0x7E, 0x68, 0xD5, + 0x52, 0x8A, 0xD0, 0xB4, 0xAC, 0x06, 0x5A, 0x70, 0x05, 0x68, 0x80, 0x05, + 0x65, 0x64, 0x46, 0x0C, 0xCD, 0xD5, 0xAD, 0x15, 0x8C, 0x6A, 0x98, 0x00, + 0x0F, 0x28, 0x16, 0x49, 0x50, 0x03, 0xC1, 0x23, 0x01, 0xD7, 0x90, 0xB8, + 0xC5, 0x9C, 0x8F, 0x34, 0xC0, 0x83, 0xFE, 0x66, 0x4A, 0x0D, 0xD9, 0xC0, + 0x8C, 0x26, 0x33, 0xA6, 0x45, 0x9B, 0xA1, 0xED, 0x64, 0x81, 0xE4, 0x38, + 0x21, 0x47, 0xF1, 0x46, 0xC8, 0x09, 0x83, 0x34, 0x08, 0xD2, 0x3C, 0xC9, + 0x1A, 0x6B, 0x2D, 0x8D, 0x31, 0xD0, 0x1C, 0xCA, 0x30, 0x0D, 0xC7, 0x20, + 0x96, 0x12, 0x7B, 0x01, 0xCD, 0x19, 0x01, 0x19, 0xE8, 0xC7, 0x0F, 0x50, + 0x00, 0x27, 0x64, 0x3D, 0x79, 0xFA, 0x9B, 0xE9, 0x08, 0x38, 0xBD, 0xB1, + 0xBD, 0x84, 0xDD, 0x0F, 0x3D, 0xF8, 0x15, 0xD3, 0xF0, 0xA7, 0xD5, 0xF8, + 0xA6, 0x15, 0x48, 0x03, 0x37, 0x18, 0x0E, 0x69, 0x12, 0xBC, 0x2D, 0x22, + 0x0F, 0x6C, 0x29, 0x0D, 0x3C, 0xF8, 0xA0, 0x90, 0x3B, 0x83, 0x35, 0x80, + 0x8C, 0xE6, 0x84, 0x83, 0x31, 0x78, 0x83, 0x32, 0xB0, 0x53, 0x43, 0x58, + 0x84, 0x3B, 0x30, 0x81, 0x5A, 0x29, 0xCD, 0x13, 0x58, 0x03, 0x14, 0xA0, + 0x0D, 0x59, 0x69, 0x32, 0x12, 0x10, 0x08, 0x15, 0x70, 0x01, 0x17, 0x08, + 0x80, 0x5B, 0x94, 0x80, 0x19, 0xF0, 0x01, 0x4C, 0x88, 0x85, 0x99, 0xE8, + 0x89, 0x50, 0x43, 0x24, 0xF9, 0x0B, 0x45, 0x47, 0x02, 0xB5, 0xA5, 0x54, + 0x07, 0x96, 0x4D, 0x07, 0x77, 0xA8, 0x59, 0xA1, 0x10, 0x92, 0x4E, 0x34, + 0x45, 0x6D, 0x98, 0x09, 0x4C, 0xD0, 0x01, 0x27, 0xD9, 0x81, 0x19, 0xD0, + 0x01, 0x23, 0xA0, 0xC5, 0x19, 0xC0, 0x04, 0x54, 0x60, 0x05, 0x51, 0x20, + 0x5A, 0x23, 0x20, 0x82, 0x22, 0x10, 0x82, 0x4F, 0x5A, 0xD0, 0xB5, 0x7A, + 0x07, 0x51, 0xF8, 0x85, 0x6A, 0x70, 0x9F, 0x5E, 0xE3, 0x06, 0x6A, 0xB0, + 0x8B, 0x0B, 0xAC, 0x30, 0x59, 0xB8, 0x55, 0xAE, 0x25, 0x60, 0xB4, 0xA0, + 0x85, 0x02, 0x60, 0x00, 0x7E, 0x3A, 0xD1, 0x16, 0x08, 0x01, 0xD6, 0x80, + 0xC7, 0x36, 0x60, 0xB7, 0x46, 0x91, 0x01, 0xCA, 0x1A, 0xFE, 0x03, 0x37, + 0x10, 0x3C, 0x70, 0x52, 0x01, 0x07, 0x6A, 0x32, 0x10, 0x18, 0x54, 0x07, + 0xF2, 0x4D, 0x26, 0x5C, 0x01, 0x16, 0x4D, 0xD1, 0x67, 0x31, 0x2C, 0xD0, + 0x31, 0xA0, 0x17, 0x7C, 0x01, 0xC1, 0x23, 0x94, 0x4B, 0x71, 0x83, 0xF1, + 0x90, 0x94, 0xC8, 0x4C, 0xC7, 0xDA, 0x4B, 0xA0, 0xAB, 0x91, 0x8C, 0xCF, + 0x69, 0x52, 0x74, 0x65, 0x00, 0x1D, 0xC2, 0x21, 0x28, 0xCD, 0x9B, 0x5A, + 0x19, 0x01, 0x80, 0x2A, 0xA0, 0x0F, 0x63, 0x3E, 0xEE, 0x08, 0xDD, 0x6E, + 0x4A, 0x81, 0x74, 0x33, 0x2C, 0xC7, 0xA0, 0xB6, 0x33, 0xD0, 0x42, 0x31, + 0x20, 0x84, 0x20, 0xC2, 0x83, 0x74, 0x0C, 0xD7, 0x12, 0xF3, 0xDB, 0x3C, + 0xD0, 0x56, 0x42, 0x28, 0x04, 0x3B, 0x88, 0x81, 0x86, 0x55, 0x39, 0x32, + 0x10, 0x81, 0x5A, 0x41, 0xB4, 0x12, 0x80, 0x01, 0x68, 0xF5, 0x94, 0xCB, + 0x00, 0x5D, 0x3D, 0x28, 0x84, 0x34, 0x40, 0x83, 0x01, 0x00, 0x80, 0x23, + 0xE0, 0x4A, 0x5C, 0x44, 0x80, 0x1B, 0x28, 0x02, 0x22, 0xD0, 0x86, 0x92, + 0x35, 0x59, 0x50, 0x9B, 0x9E, 0x4B, 0x85, 0x59, 0xFB, 0x9B, 0x5E, 0xA5, + 0x6B, 0x8A, 0xA8, 0xAB, 0xDE, 0x4E, 0x5C, 0x87, 0x6C, 0xD8, 0x06, 0x99, + 0x98, 0x06, 0x1C, 0xC8, 0x01, 0xFF, 0x12, 0x82, 0xAA, 0xC2, 0x45, 0x09, + 0x40, 0x05, 0x59, 0x60, 0x85, 0x50, 0xF8, 0x84, 0xA2, 0xD5, 0x01, 0x4F, + 0x20, 0x82, 0x1D, 0x20, 0x07, 0xAD, 0xCA, 0xB0, 0x39, 0x81, 0x87, 0x51, + 0xF8, 0x05, 0x69, 0x70, 0x29, 0xF7, 0x11, 0x13, 0x6B, 0xD0, 0x85, 0x59, + 0xAD, 0x5A, 0x64, 0x9C, 0x05, 0xAD, 0x2D, 0xE0, 0x55, 0x0E, 0x8B, 0x39, + 0xA1, 0x85, 0x00, 0x08, 0x01, 0xC0, 0x43, 0x03, 0x66, 0x5A, 0xB4, 0xC2, + 0x83, 0xA6, 0xD1, 0x70, 0x16, 0xF9, 0x28, 0xBC, 0x6C, 0x89, 0xBD, 0x54, + 0xFE, 0x99, 0x0F, 0xCD, 0xF8, 0x0D, 0x34, 0x6D, 0x14, 0x0F, 0x90, 0x8C, + 0x4E, 0xD1, 0x8C, 0x4B, 0x41, 0x01, 0x14, 0x48, 0x47, 0x33, 0x44, 0x03, + 0x34, 0xC8, 0x20, 0x17, 0xD8, 0x22, 0x42, 0x81, 0x21, 0x04, 0x9A, 0x8C, + 0xD2, 0xF0, 0x5B, 0x37, 0x60, 0xE0, 0xB2, 0x5D, 0x34, 0x57, 0xA9, 0x8D, + 0x36, 0xF8, 0x42, 0x77, 0x2A, 0xCD, 0x80, 0xA3, 0x15, 0x82, 0x03, 0x9C, + 0x9C, 0xD4, 0x1B, 0xC1, 0x92, 0x9C, 0xFD, 0x38, 0x04, 0x01, 0x69, 0xE1, + 0x78, 0xFC, 0x32, 0xD6, 0xF8, 0xA6, 0xD1, 0xA0, 0x0F, 0x80, 0xE2, 0x3B, + 0x39, 0x13, 0xD7, 0x31, 0x9B, 0xBC, 0x3A, 0xC0, 0x93, 0xC9, 0xDB, 0x83, + 0x0F, 0x12, 0xB9, 0x44, 0x08, 0x83, 0x82, 0x50, 0x04, 0x3E, 0x88, 0x81, + 0x7F, 0x4B, 0x80, 0x7F, 0x13, 0x81, 0x12, 0x70, 0xA0, 0x34, 0x18, 0xB1, + 0x19, 0xBA, 0x31, 0x15, 0x78, 0x83, 0x34, 0x28, 0x54, 0x00, 0x20, 0x80, + 0x09, 0xB8, 0x45, 0x08, 0x88, 0x80, 0x8C, 0x46, 0xD5, 0x1C, 0x20, 0x82, + 0x53, 0x40, 0x86, 0x6D, 0x48, 0x87, 0x18, 0xA1, 0xD9, 0x50, 0xE3, 0x11, + 0xED, 0x4D, 0x92, 0xA2, 0xCC, 0xCF, 0xA4, 0xB8, 0x2F, 0x22, 0xB9, 0x3F, + 0x48, 0x7A, 0x8A, 0x22, 0x48, 0xB5, 0x19, 0x98, 0x2A, 0xF2, 0x31, 0x00, + 0x03, 0x98, 0x83, 0x65, 0x88, 0x64, 0xA1, 0xD5, 0x0A, 0x23, 0x00, 0x05, + 0xAD, 0xB3, 0x86, 0x5F, 0x28, 0x05, 0x51, 0xA0, 0x85, 0x77, 0xC8, 0x30, + 0x72, 0xF0, 0xE4, 0x61, 0x94, 0xC0, 0x6B, 0x80, 0x1F, 0xF9, 0xA9, 0x85, + 0x56, 0xD0, 0x40, 0x59, 0xB0, 0x55, 0x56, 0x96, 0x6A, 0xA5, 0xA5, 0x93, + 0x02, 0x08, 0x01, 0x67, 0x02, 0xA6, 0xE5, 0x88, 0x94, 0x32, 0x33, 0x0E, + 0x3C, 0x81, 0x21, 0x60, 0x2A, 0x95, 0xF5, 0x00, 0xA8, 0xBD, 0x55, 0x01, + 0x83, 0xF2, 0x8D, 0xFE, 0x48, 0x39, 0x0E, 0x4A, 0xD9, 0x0D, 0xCC, 0x99, + 0x56, 0x53, 0x79, 0x8C, 0x1D, 0x34, 0x8E, 0x13, 0xCA, 0xAB, 0xC3, 0x45, + 0x1C, 0x48, 0x39, 0x21, 0xFB, 0x20, 0x56, 0xD3, 0x38, 0xAC, 0x57, 0x59, + 0x26, 0x84, 0x5A, 0x14, 0xCC, 0x13, 0x14, 0x64, 0x42, 0xA6, 0x7E, 0xCB, + 0x61, 0x82, 0xC3, 0x1B, 0x7A, 0x5A, 0x80, 0x29, 0x15, 0x41, 0xE1, 0x1B, + 0x9D, 0x75, 0x1E, 0x10, 0x1E, 0xBD, 0x2B, 0xDD, 0x50, 0x28, 0xB5, 0x2D, + 0x8D, 0x70, 0x45, 0x83, 0x60, 0x01, 0x10, 0x22, 0x0A, 0x90, 0x42, 0x78, + 0x83, 0x70, 0xCD, 0x83, 0x41, 0xC8, 0x03, 0x3C, 0x78, 0x03, 0x5D, 0x22, + 0x03, 0x3E, 0xD8, 0x83, 0x3B, 0xB0, 0x83, 0x5C, 0xE1, 0x00, 0x02, 0xA0, + 0x15, 0xDF, 0xE5, 0x00, 0x14, 0x50, 0x14, 0xC7, 0x32, 0x26, 0x93, 0x84, + 0x03, 0x1B, 0x6D, 0x00, 0x00, 0xC8, 0x45, 0x09, 0xE8, 0x4A, 0x1C, 0xC8, + 0xE8, 0x08, 0xA8, 0x00, 0x08, 0x30, 0x00, 0x08, 0x90, 0x80, 0x54, 0xF3, + 0x84, 0x58, 0x00, 0xDF, 0x96, 0xC0, 0xD4, 0xFA, 0xCB, 0x4F, 0xFD, 0x4B, + 0x69, 0xE5, 0x66, 0xEE, 0xFB, 0x13, 0x8A, 0x52, 0xF3, 0x89, 0x53, 0x88, + 0x80, 0x1B, 0xA0, 0xCA, 0xED, 0xCB, 0x01, 0x09, 0x80, 0x80, 0x1B, 0x88, + 0x06, 0x48, 0xFE, 0x84, 0x50, 0x20, 0x02, 0x4F, 0x80, 0x5F, 0x50, 0x30, + 0x82, 0x20, 0xD8, 0x59, 0xAA, 0xAC, 0x80, 0xF3, 0xA4, 0xEA, 0xB5, 0xEA, + 0x07, 0x4F, 0xB8, 0xAE, 0x6B, 0x88, 0xDA, 0x51, 0xB6, 0x86, 0x55, 0x62, + 0xA5, 0x0A, 0x9D, 0x85, 0xA8, 0x9E, 0x6A, 0xA9, 0xA6, 0x85, 0x01, 0x48, + 0x60, 0xC2, 0xF2, 0xE0, 0xC2, 0x03, 0x27, 0x85, 0xEA, 0x0E, 0x35, 0x00, + 0x9D, 0xFB, 0x70, 0x43, 0x7E, 0x22, 0xCC, 0xC9, 0x4C, 0x47, 0xC2, 0x45, + 0xB3, 0xCA, 0x39, 0x21, 0xC2, 0x73, 0xFE, 0x01, 0xFB, 0xF0, 0x57, 0x84, + 0x0B, 0xD7, 0x1D, 0xF4, 0x26, 0x1B, 0xF5, 0x4B, 0xCF, 0x79, 0x14, 0x3D, + 0xB1, 0xD6, 0x10, 0x7E, 0x96, 0x56, 0x01, 0x27, 0xD2, 0x40, 0xA1, 0x05, + 0xD8, 0x8C, 0x45, 0xE9, 0x1B, 0x10, 0x80, 0x42, 0xEB, 0xE4, 0xA1, 0x98, + 0x1C, 0xC8, 0x1C, 0x76, 0x80, 0x21, 0x65, 0x2D, 0x2C, 0x8C, 0xB3, 0xB5, + 0xBD, 0x84, 0xCF, 0xDB, 0xC7, 0x17, 0xE8, 0x15, 0xCF, 0x21, 0x84, 0x2F, + 0x02, 0x8F, 0xE6, 0xD3, 0x03, 0x3B, 0xC8, 0x25, 0x44, 0x08, 0x9B, 0x33, + 0x48, 0x3E, 0x38, 0x35, 0x04, 0x18, 0x68, 0x2E, 0xEA, 0xBB, 0x39, 0xEC, + 0x70, 0x4D, 0xDF, 0x05, 0x81, 0xBE, 0x09, 0x01, 0x14, 0x38, 0x04, 0x38, + 0x70, 0x81, 0x34, 0x20, 0x08, 0x16, 0x40, 0x04, 0x17, 0x00, 0x00, 0x4C, + 0xF0, 0x84, 0x20, 0xD8, 0x8A, 0xF8, 0xF5, 0x04, 0x4F, 0xB8, 0x24, 0xFF, + 0x8B, 0x00, 0xE0, 0x96, 0x80, 0xE1, 0x0E, 0x02, 0x50, 0x50, 0x06, 0x76, + 0xB8, 0x87, 0x7B, 0x58, 0xCF, 0xEA, 0x31, 0xAA, 0x6D, 0x10, 0x92, 0xE6, + 0xBE, 0xDE, 0x4E, 0x44, 0x0A, 0x4C, 0xBD, 0x5E, 0x68, 0x38, 0x8A, 0x6E, + 0x48, 0xB5, 0x1B, 0xE8, 0xAF, 0xAD, 0xA8, 0x80, 0x33, 0x0F, 0x85, 0x65, + 0x88, 0x05, 0x56, 0xF0, 0x04, 0x54, 0x98, 0x83, 0x21, 0xC0, 0x0A, 0xFF, + 0xAC, 0x80, 0x1D, 0x00, 0x3A, 0x51, 0xB0, 0x02, 0x29, 0x31, 0x1F, 0xB6, + 0x6A, 0x6F, 0xB0, 0x0A, 0x2B, 0xF9, 0x9E, 0x06, 0x57, 0x80, 0x6A, 0xFB, + 0x16, 0xE0, 0xF5, 0xCE, 0x6F, 0x02, 0xDE, 0x6F, 0x0E, 0x18, 0xCC, 0x04, + 0x6A, 0x95, 0x0E, 0x10, 0x2C, 0xD0, 0x81, 0xBC, 0xC4, 0x35, 0xC3, 0x0A, + 0x26, 0x1D, 0xC7, 0x80, 0xB7, 0x11, 0x5E, 0xA6, 0x45, 0x29, 0x3C, 0x85, + 0x6A, 0x15, 0x14, 0x9A, 0x21, 0xAF, 0x41, 0x0D, 0xF6, 0xFE, 0x60, 0x8F, + 0x34, 0x68, 0x8C, 0x87, 0x5A, 0x0F, 0x0C, 0x1A, 0x0F, 0x80, 0x1A, 0xB3, + 0x87, 0x33, 0x52, 0xAF, 0x51, 0xB2, 0x0F, 0x78, 0x0E, 0x3B, 0x59, 0x94, + 0x27, 0x6F, 0x32, 0x7C, 0xB3, 0x21, 0xBF, 0x71, 0x80, 0x9C, 0xEC, 0x80, + 0x83, 0xD4, 0x15, 0x85, 0x2A, 0x03, 0xFE, 0xD0, 0x4B, 0x44, 0x18, 0xCC, + 0x33, 0x48, 0x61, 0xE1, 0xF8, 0xD6, 0xB2, 0x1E, 0x03, 0x34, 0x08, 0x1D, + 0x0B, 0x22, 0x9C, 0xFE, 0x28, 0x83, 0x3D, 0x88, 0x84, 0x02, 0x62, 0xAD, + 0x44, 0x10, 0x04, 0x8E, 0x1A, 0x84, 0x16, 0x68, 0x2E, 0x46, 0x28, 0x81, + 0x04, 0x28, 0x81, 0xBF, 0x11, 0x01, 0x2A, 0xEB, 0x00, 0x14, 0xD8, 0x58, + 0x12, 0x28, 0x04, 0x6D, 0x4F, 0x83, 0x37, 0xA8, 0x6D, 0x46, 0x58, 0x01, + 0x02, 0x40, 0x06, 0x7D, 0xC0, 0x87, 0x7E, 0xA0, 0x05, 0x4F, 0x90, 0xDF, + 0xAC, 0x6B, 0x82, 0x22, 0x18, 0x1F, 0xA8, 0xCA, 0x00, 0x09, 0x40, 0x80, + 0x00, 0x85, 0x80, 0x1C, 0xC0, 0x84, 0x09, 0x0B, 0xE9, 0x3B, 0x27, 0xE9, + 0x22, 0xD1, 0xDE, 0x52, 0x94, 0x1E, 0xE8, 0xD6, 0x54, 0x75, 0xB8, 0x07, + 0x22, 0x90, 0x80, 0x1D, 0xA8, 0x3A, 0xFE, 0x1C, 0x30, 0x08, 0x98, 0x81, + 0x1D, 0xC0, 0x24, 0x4C, 0x4A, 0xE4, 0xFE, 0xD2, 0x81, 0x0A, 0xA8, 0xBA, + 0x20, 0xF0, 0x04, 0x57, 0x10, 0x85, 0x52, 0x18, 0x85, 0x1E, 0x10, 0x82, + 0x49, 0xAF, 0xA5, 0x7C, 0xF0, 0x06, 0x4C, 0x68, 0x29, 0x6C, 0xB0, 0x06, + 0x6C, 0x78, 0x55, 0x6B, 0xA0, 0x85, 0x5A, 0xB8, 0x8B, 0xB8, 0x83, 0xA5, + 0x01, 0xFE, 0x74, 0x02, 0x6E, 0x87, 0x08, 0x70, 0x00, 0x35, 0x5D, 0x41, + 0xDA, 0x10, 0x21, 0xE3, 0x28, 0x0D, 0x67, 0x29, 0x9B, 0x22, 0xEC, 0xD2, + 0x14, 0x9D, 0xAC, 0xF8, 0xF8, 0xE0, 0xCB, 0x50, 0xC4, 0x4C, 0x39, 0x94, + 0xFE, 0xA6, 0x01, 0xA7, 0xD2, 0x28, 0x15, 0x23, 0xBC, 0x94, 0x8F, 0xF3, + 0x1C, 0xCF, 0x59, 0x16, 0xC3, 0xCA, 0x1C, 0xC1, 0x63, 0x0F, 0x32, 0x6D, + 0x61, 0x70, 0xAA, 0x1C, 0x8D, 0x15, 0x2C, 0x76, 0x62, 0x00, 0xDF, 0xAC, + 0x32, 0xF0, 0xDB, 0xB7, 0x98, 0x74, 0xC2, 0x9C, 0xAC, 0x15, 0xFE, 0x16, + 0x5C, 0xFF, 0x20, 0x04, 0x44, 0xA8, 0x83, 0xE1, 0xC2, 0x14, 0x72, 0x3B, + 0xA8, 0x56, 0x41, 0xB8, 0xAC, 0x49, 0x1C, 0xC9, 0xD1, 0x5C, 0xD6, 0xAA, + 0x03, 0x43, 0x18, 0x04, 0x37, 0x14, 0x1D, 0x41, 0xE8, 0xF7, 0x3D, 0x50, + 0x81, 0x81, 0x56, 0x84, 0x7D, 0x13, 0x01, 0x42, 0x2C, 0x4D, 0xBF, 0x21, + 0x81, 0xE2, 0x0D, 0x37, 0xBD, 0xCC, 0x83, 0xDA, 0x7E, 0x03, 0x34, 0x88, + 0x84, 0x81, 0xD7, 0x05, 0xB1, 0x14, 0x0B, 0x72, 0xA0, 0x85, 0x51, 0x18, + 0x9F, 0x21, 0x68, 0x82, 0x4F, 0x00, 0x05, 0x4C, 0x38, 0x50, 0x1D, 0x88, + 0x00, 0xED, 0xBE, 0xC5, 0x0A, 0x58, 0x5E, 0x2E, 0x61, 0x73, 0x9A, 0xC0, + 0x54, 0x8B, 0x51, 0x87, 0xF5, 0xFC, 0x18, 0x3C, 0xDF, 0xF3, 0x9A, 0x65, + 0x73, 0x64, 0x88, 0x00, 0x22, 0xB0, 0xEE, 0x46, 0x8F, 0xA9, 0x07, 0xD8, + 0xEE, 0x19, 0xB0, 0xEE, 0x1B, 0x38, 0x73, 0x98, 0x47, 0x40, 0xFE, 0xC4, + 0x81, 0x52, 0xD0, 0x05, 0x5D, 0x28, 0x05, 0x57, 0x08, 0x05, 0xAC, 0x73, + 0x7D, 0x5A, 0x82, 0x07, 0xF7, 0xFE, 0x06, 0xFD, 0xBD, 0x06, 0x6F, 0x68, + 0xB0, 0xF9, 0xC6, 0x19, 0x0D, 0x24, 0x74, 0x5D, 0x68, 0xFA, 0x02, 0xDE, + 0x87, 0x7D, 0xD0, 0x81, 0x01, 0x48, 0x20, 0x46, 0x59, 0x01, 0x44, 0xD9, + 0x2D, 0xD0, 0x65, 0xA2, 0xD8, 0x10, 0x03, 0x41, 0x00, 0x08, 0x33, 0x61, + 0xC4, 0x98, 0x11, 0xD3, 0xC6, 0x4C, 0x9B, 0x33, 0x03, 0xCD, 0xBC, 0x90, + 0x91, 0xA2, 0x85, 0xFE, 0x8A, 0x14, 0x61, 0x52, 0x9C, 0x18, 0xA1, 0x82, + 0x04, 0x89, 0x16, 0x12, 0xCB, 0xB8, 0x58, 0x91, 0x86, 0x45, 0x98, 0x17, + 0x66, 0xDC, 0xA8, 0x11, 0xE3, 0x26, 0xCC, 0x98, 0x36, 0x6D, 0xDC, 0xD4, + 0x49, 0x33, 0x50, 0x45, 0x98, 0x98, 0x62, 0x56, 0x84, 0x29, 0xA3, 0x66, + 0x05, 0x4D, 0x81, 0x2D, 0x42, 0xA8, 0x50, 0x31, 0x62, 0xC1, 0x88, 0x0E, + 0x0B, 0x1C, 0x28, 0x18, 0xDA, 0x40, 0x01, 0x87, 0x05, 0x0C, 0x38, 0x28, + 0x70, 0x40, 0xD4, 0x41, 0x82, 0x10, 0x63, 0xD4, 0xE0, 0x11, 0xA4, 0xA7, + 0x8E, 0x20, 0x44, 0x7A, 0xC6, 0x9C, 0x39, 0x83, 0x46, 0x8D, 0x1B, 0x16, + 0x2F, 0xB8, 0xEA, 0xC1, 0x23, 0xE6, 0xCC, 0x20, 0x3D, 0x57, 0xF3, 0x08, + 0x2A, 0xC4, 0xB2, 0x90, 0x9E, 0x42, 0x91, 0xF0, 0xE4, 0x49, 0x94, 0x47, + 0x45, 0x22, 0x3E, 0x30, 0x1A, 0x1C, 0x55, 0xC0, 0x40, 0x01, 0xD2, 0x05, + 0x0B, 0x52, 0xA8, 0x58, 0xF1, 0x46, 0x0D, 0x9C, 0xAC, 0x86, 0xC2, 0xA4, + 0x99, 0xA4, 0x62, 0x82, 0xAE, 0x7D, 0xFA, 0xF6, 0xE5, 0xD3, 0x57, 0xD9, + 0xF2, 0x3E, 0x6F, 0xB5, 0x46, 0x15, 0xD9, 0x91, 0x23, 0x08, 0x11, 0x4C, + 0x98, 0x82, 0xDC, 0x28, 0x5D, 0xE1, 0x46, 0x85, 0x0A, 0x3A, 0x7C, 0x78, + 0x92, 0xD5, 0x4D, 0xDD, 0xBD, 0x7A, 0xEC, 0xD4, 0xAD, 0x53, 0xA7, 0x6E, + 0xB6, 0xED, 0xDC, 0xDD, 0xD2, 0xD1, 0xD6, 0x8D, 0x3B, 0xC7, 0x8E, 0x20, + 0xAA, 0x6F, 0xE4, 0x98, 0xF1, 0xE0, 0x41, 0x8E, 0x21, 0x37, 0x66, 0xE8, + 0xA8, 0xF0, 0x40, 0x42, 0x05, 0x09, 0x37, 0x24, 0x3C, 0x08, 0xF2, 0x99, + 0x16, 0x2D, 0x68, 0xBA, 0x44, 0xD5, 0x2A, 0x22, 0x81, 0x96, 0x65, 0x7D, + 0xE2, 0xC7, 0x93, 0x2F, 0x6F, 0xFE, 0x3C, 0xFA, 0xF1, 0x92, 0xBD, 0x11, + 0x91, 0x56, 0xCD, 0x1A, 0xB7, 0x6B, 0xFE, 0xF2, 0xE5, 0x5B, 0xAB, 0x56, + 0xCB, 0x95, 0x2C, 0x68, 0xB3, 0xA0, 0xE5, 0x4F, 0xEF, 0xFF, 0x3F, 0x80, + 0x01, 0x0A, 0x38, 0x20, 0x81, 0x05, 0x1A, 0x68, 0x9E, 0x64, 0x98, 0x04, + 0x80, 0x02, 0x0B, 0x1D, 0xAC, 0x90, 0x42, 0x0A, 0x24, 0xC8, 0x70, 0x02, + 0x0A, 0x12, 0xB5, 0x70, 0xE1, 0x18, 0x61, 0xE0, 0x71, 0x48, 0x1D, 0x63, + 0x88, 0x91, 0x61, 0x1B, 0x2D, 0x85, 0xD1, 0x95, 0x1A, 0x6D, 0xB4, 0xF0, + 0x02, 0x45, 0x27, 0x96, 0xF1, 0x60, 0x19, 0x65, 0xA8, 0x20, 0x46, 0x0B, + 0x1E, 0x41, 0x54, 0x93, 0x19, 0x65, 0x84, 0xE4, 0x92, 0x4B, 0x62, 0xA8, + 0x81, 0x46, 0x18, 0x2C, 0xA8, 0xE1, 0xE1, 0x19, 0x19, 0x8E, 0x71, 0xE1, + 0x09, 0x31, 0xAD, 0x70, 0x96, 0x19, 0x27, 0x52, 0x84, 0xD1, 0x52, 0x24, + 0x30, 0x40, 0xD4, 0x02, 0x7E, 0x45, 0x19, 0x65, 0x60, 0x44, 0x29, 0x30, + 0x80, 0x00, 0x1D, 0x20, 0xD9, 0x86, 0x20, 0x84, 0x48, 0x22, 0x48, 0x19, + 0x6E, 0xB4, 0x71, 0x49, 0x89, 0x6E, 0x90, 0x74, 0xC9, 0x4A, 0x25, 0xD5, + 0x81, 0x07, 0x21, 0x66, 0x0A, 0x72, 0x08, 0x49, 0x78, 0x20, 0x22, 0x48, + 0x22, 0x91, 0xC0, 0x31, 0x48, 0x1E, 0x31, 0x24, 0xF2, 0x06, 0x07, 0x09, + 0x88, 0x20, 0x02, 0x03, 0x22, 0x2C, 0xC0, 0x41, 0x07, 0x1D, 0x30, 0xD0, + 0x02, 0x0B, 0x2C, 0x94, 0x01, 0x07, 0x1C, 0x88, 0x48, 0x32, 0x89, 0x1D, + 0x27, 0x30, 0x42, 0x86, 0x02, 0xB0, 0xF0, 0x83, 0x20, 0x3F, 0xF2, 0xBC, + 0x83, 0x8F, 0x3E, 0xFC, 0xF4, 0x53, 0x8D, 0x28, 0x41, 0xEC, 0x80, 0x03, + 0x0E, 0x41, 0xE8, 0xA0, 0x03, 0x0E, 0x11, 0xE0, 0x00, 0xDC, 0x0E, 0xA5, + 0xE5, 0x00, 0xC4, 0x27, 0xAA, 0x4C, 0xA3, 0x4E, 0x3D, 0xF7, 0xA8, 0xF3, + 0xDA, 0x6D, 0xB7, 0xAA, 0xC3, 0x1B, 0xAE, 0xB9, 0x6E, 0xFE, 0xA3, 0xCE, + 0x27, 0x15, 0x10, 0x71, 0x83, 0xAA, 0xCB, 0x3D, 0x57, 0xC1, 0x1C, 0x44, + 0xE4, 0x50, 0x41, 0x04, 0x11, 0x3C, 0x40, 0x80, 0x04, 0xD1, 0x12, 0xF0, + 0x80, 0xB2, 0xA3, 0x24, 0x53, 0x4D, 0x32, 0xAF, 0x88, 0x32, 0x8A, 0x2B, + 0x15, 0xEC, 0xC0, 0xE9, 0x81, 0xE1, 0x8A, 0x47, 0xCD, 0x3F, 0xD5, 0x7C, + 0x73, 0x0D, 0x37, 0xD8, 0xCC, 0x77, 0x0D, 0x35, 0xD5, 0xC0, 0x22, 0xCB, + 0x7E, 0xD0, 0xF0, 0xA7, 0x8B, 0xB8, 0xF5, 0xDA, 0x7B, 0x2F, 0xBE, 0xF9, + 0x4A, 0xE6, 0xCA, 0x00, 0x1E, 0x84, 0x31, 0x02, 0x09, 0x62, 0x5C, 0x14, + 0x42, 0x84, 0x32, 0xBC, 0x30, 0x10, 0x48, 0x61, 0xD4, 0xD1, 0xC6, 0x20, + 0x82, 0xE0, 0xB1, 0xD5, 0x88, 0x66, 0x94, 0xA4, 0x86, 0x19, 0x63, 0x64, + 0xE8, 0x53, 0x0A, 0x2F, 0xB4, 0x30, 0x46, 0x1A, 0x27, 0xB4, 0x40, 0x02, + 0x4E, 0x2E, 0xA4, 0x31, 0x93, 0x18, 0x2F, 0x88, 0x21, 0x46, 0x1D, 0x66, + 0xA4, 0x81, 0x07, 0x1E, 0x68, 0xC4, 0x69, 0x86, 0x0A, 0x26, 0xAF, 0x80, + 0x46, 0x42, 0x67, 0xBC, 0xC0, 0x42, 0x0B, 0x65, 0x9C, 0x2C, 0x46, 0x18, + 0x27, 0x14, 0x19, 0xE3, 0x08, 0x61, 0x80, 0x10, 0xC2, 0x4C, 0x0C, 0x2C, + 0x90, 0x00, 0xA1, 0x47, 0x27, 0xB0, 0xC0, 0x00, 0x45, 0x2D, 0xD0, 0xC0, + 0xD1, 0x03, 0x0C, 0xC0, 0x81, 0x58, 0x65, 0xE8, 0x91, 0x55, 0x9B, 0x6E, + 0x58, 0x15, 0xD3, 0x19, 0x66, 0x9A, 0x51, 0x87, 0x98, 0x0F, 0x87, 0x88, + 0x48, 0x1D, 0x6B, 0xE2, 0xB1, 0x07, 0xCB, 0x65, 0x23, 0x92, 0x88, 0x20, + 0x6A, 0xEC, 0x41, 0x49, 0x1E, 0x0D, 0x10, 0xC0, 0x40, 0x03, 0x1C, 0x88, + 0xD0, 0x81, 0x4F, 0x24, 0xA0, 0x18, 0xC6, 0xCC, 0x89, 0x19, 0x12, 0xC9, + 0x24, 0x7C, 0xB0, 0x00, 0xC7, 0x1A, 0x0A, 0xA0, 0x72, 0xD9, 0x79, 0xF9, + 0xFE, 0xEC, 0x83, 0xCF, 0x3E, 0xF2, 0x50, 0x96, 0x0F, 0x3C, 0xD5, 0x94, + 0xE2, 0x89, 0xA8, 0xA8, 0xE6, 0x80, 0xC3, 0x0E, 0x45, 0x10, 0x21, 0xC4, + 0x10, 0xA6, 0xE2, 0x50, 0x41, 0x0E, 0x4D, 0x9C, 0xA2, 0x0D, 0x3B, 0xEC, + 0xD4, 0xA3, 0x8E, 0x36, 0xB8, 0x76, 0xB3, 0x5B, 0xE9, 0xDD, 0xA4, 0x0E, + 0xCD, 0x0D, 0x3A, 0xE4, 0x90, 0xC3, 0x0D, 0x38, 0x1C, 0xE1, 0x6C, 0x04, + 0x46, 0x14, 0x41, 0xEC, 0x74, 0x10, 0x48, 0x30, 0x2D, 0x75, 0x04, 0x44, + 0xB0, 0xF9, 0x2A, 0xC9, 0xD0, 0x02, 0x4B, 0x29, 0xA5, 0x88, 0xE2, 0xCA, + 0x0E, 0x10, 0xB8, 0x32, 0x59, 0xBE, 0x02, 0xFE, 0xD2, 0xDE, 0xB9, 0xD7, + 0x60, 0x13, 0x5F, 0x7C, 0xD7, 0x54, 0xA3, 0xCB, 0xF1, 0xD0, 0x24, 0xA3, + 0x0C, 0x2C, 0xE0, 0x45, 0x3F, 0x3E, 0xF9, 0xE5, 0x8F, 0xEF, 0xCD, 0x04, + 0x0E, 0x60, 0x34, 0x82, 0x0C, 0x24, 0xA4, 0x10, 0x42, 0x07, 0x24, 0x70, + 0x00, 0xF2, 0xC1, 0x03, 0xCD, 0xA4, 0x16, 0x9B, 0x78, 0x9C, 0xD1, 0x06, + 0x58, 0x08, 0xB5, 0x64, 0x86, 0x40, 0x52, 0xD4, 0x02, 0x31, 0xB8, 0x40, + 0x05, 0x2E, 0x20, 0x4C, 0x0A, 0x2A, 0xC4, 0x98, 0x16, 0x0C, 0x64, 0x05, + 0x15, 0x0B, 0x53, 0x1B, 0x08, 0x71, 0xB5, 0x39, 0x95, 0x48, 0x0F, 0x64, + 0x12, 0x43, 0x1A, 0x6E, 0x06, 0xA1, 0x4B, 0xA0, 0xA1, 0x2B, 0x62, 0x20, + 0x8C, 0xFB, 0x40, 0x42, 0x13, 0x9C, 0xBC, 0x60, 0x05, 0x1C, 0x60, 0x00, + 0x0A, 0x55, 0xB0, 0x14, 0x05, 0x24, 0x80, 0x85, 0x47, 0x81, 0xDA, 0x02, + 0x00, 0x30, 0x80, 0x06, 0xA4, 0xC0, 0x26, 0x6A, 0x18, 0xC4, 0x20, 0x58, + 0x26, 0x41, 0x35, 0x24, 0xCC, 0x0C, 0x67, 0xC0, 0x20, 0xC3, 0xBA, 0x74, + 0x89, 0x41, 0x24, 0x02, 0x6D, 0x66, 0x28, 0x84, 0x24, 0x56, 0x52, 0x07, + 0x3D, 0x44, 0xA2, 0xFE, 0x0E, 0x6B, 0x38, 0x04, 0x25, 0xF8, 0x50, 0x14, + 0x11, 0x14, 0x25, 0x7E, 0x2A, 0x20, 0x54, 0x0B, 0x50, 0x00, 0x23, 0x34, + 0x30, 0x2A, 0x31, 0x51, 0x7C, 0xC3, 0x1D, 0xDE, 0xA0, 0x00, 0x5B, 0x08, + 0x48, 0x71, 0xF2, 0xC0, 0x47, 0x3E, 0x2A, 0x03, 0xB9, 0x5F, 0x90, 0xA2, + 0x33, 0xA5, 0x21, 0x4E, 0x0E, 0x8A, 0x60, 0x9D, 0x21, 0x28, 0x0B, 0x35, + 0xC4, 0x69, 0xCD, 0x34, 0xBA, 0x71, 0x3A, 0xDE, 0xF0, 0x46, 0x1D, 0xDB, + 0xD0, 0xC6, 0xAF, 0x88, 0x10, 0x81, 0x38, 0x36, 0x87, 0x59, 0xCF, 0xB9, + 0x41, 0x10, 0x8C, 0xA0, 0x03, 0xD4, 0x38, 0x6B, 0x02, 0x04, 0x38, 0x82, + 0x73, 0x08, 0x80, 0xC8, 0x20, 0xC8, 0x42, 0x17, 0xAD, 0x70, 0x85, 0x2B, + 0x4E, 0x81, 0x09, 0x51, 0x08, 0x21, 0x02, 0x45, 0x40, 0x9C, 0xF9, 0xCA, + 0x53, 0x19, 0x69, 0x34, 0x41, 0x1A, 0xEB, 0x52, 0x17, 0x7D, 0xA4, 0x51, + 0x8B, 0x64, 0xC4, 0x6B, 0x1A, 0xE1, 0x0B, 0x25, 0x2C, 0x63, 0x29, 0x4B, + 0xF4, 0xA4, 0x31, 0x07, 0x03, 0x90, 0x48, 0x08, 0x1A, 0xA0, 0x82, 0x13, + 0x74, 0xE0, 0x04, 0xF3, 0x23, 0x4C, 0x08, 0x72, 0x26, 0x06, 0x16, 0xC4, + 0xAC, 0x2C, 0x84, 0x18, 0x44, 0x1A, 0xCA, 0x70, 0x06, 0x3C, 0xA8, 0xE1, + 0x0C, 0x65, 0x48, 0x43, 0x1B, 0xF0, 0x20, 0x10, 0x12, 0xBC, 0xC8, 0x20, + 0x69, 0xA0, 0x49, 0x16, 0x2B, 0x44, 0x90, 0x32, 0xC4, 0x08, 0x45, 0x29, + 0xC0, 0x83, 0x1B, 0x74, 0x24, 0x08, 0x87, 0x81, 0x53, 0x0D, 0x69, 0xC0, + 0x4A, 0x49, 0x00, 0xA8, 0x06, 0x84, 0xE1, 0x04, 0x27, 0x3C, 0x5B, 0x81, + 0x0A, 0x62, 0x94, 0x82, 0x44, 0xBD, 0xA0, 0x9E, 0x2A, 0x38, 0xCA, 0xFC, + 0x64, 0xC0, 0x01, 0xA8, 0xA1, 0x50, 0x30, 0x82, 0x49, 0xC0, 0x00, 0x02, + 0xA0, 0xBE, 0x83, 0xA9, 0x61, 0x4D, 0xFE, 0x0E, 0xD3, 0x03, 0x58, 0x38, + 0x34, 0x92, 0x9D, 0x01, 0x50, 0x4C, 0x57, 0xCB, 0x21, 0x1E, 0xEA, 0x70, + 0xCC, 0xB2, 0x21, 0xD1, 0x0E, 0x65, 0xD8, 0xC3, 0x25, 0x4A, 0x90, 0x80, + 0x40, 0x0D, 0xAA, 0x01, 0x20, 0xC0, 0x88, 0xFB, 0x40, 0x30, 0x86, 0xBE, + 0x21, 0x82, 0x0F, 0x82, 0x60, 0x84, 0x21, 0xDE, 0x40, 0x09, 0x43, 0x30, + 0xE0, 0x1F, 0x92, 0x29, 0xD0, 0xE2, 0xF6, 0xF1, 0x52, 0x78, 0x78, 0xE3, + 0x15, 0xA3, 0x68, 0x15, 0x74, 0x2A, 0x30, 0x03, 0xD5, 0x00, 0x67, 0x08, + 0xB4, 0x63, 0x16, 0x04, 0x70, 0x40, 0x84, 0x53, 0xAC, 0xA3, 0x74, 0xB3, + 0xD9, 0xC6, 0x36, 0xBC, 0x31, 0x8B, 0xD3, 0x8C, 0x0A, 0x55, 0x47, 0xA0, + 0x4E, 0x04, 0x82, 0x20, 0xD5, 0x56, 0x31, 0x0B, 0x01, 0x00, 0x28, 0xC0, + 0x03, 0xA6, 0x43, 0x00, 0xD5, 0xEC, 0xE0, 0x14, 0xAD, 0x38, 0x05, 0x26, + 0x4B, 0x31, 0x8A, 0xD1, 0x44, 0xA0, 0x07, 0xFD, 0x98, 0x65, 0x79, 0x7E, + 0x11, 0x84, 0x5F, 0xAC, 0x2B, 0x7B, 0xD7, 0xB0, 0x06, 0x35, 0xB2, 0x13, + 0x2F, 0x64, 0xB4, 0x42, 0x7C, 0x68, 0xBD, 0x2B, 0x5E, 0xC7, 0x47, 0x84, + 0x00, 0x00, 0xCC, 0x8A, 0x2D, 0x38, 0x21, 0x07, 0x2C, 0xE2, 0x24, 0x0E, + 0x3C, 0x44, 0x0C, 0x24, 0x08, 0x43, 0x41, 0x1F, 0x26, 0xB1, 0xAE, 0xD5, + 0x81, 0x31, 0x63, 0x30, 0x03, 0x42, 0xCB, 0x10, 0xA1, 0x18, 0x05, 0x2C, + 0x67, 0x28, 0x0A, 0x9A, 0x4D, 0x9C, 0xC9, 0x02, 0x9A, 0xFC, 0xD0, 0x9C, + 0x24, 0x71, 0xC3, 0xD5, 0xC4, 0x74, 0x06, 0xB0, 0x91, 0x04, 0x2B, 0x0E, + 0xAB, 0x83, 0x18, 0xCA, 0xC0, 0x82, 0x6B, 0x16, 0x06, 0x27, 0x46, 0x8A, + 0x48, 0x18, 0x48, 0x70, 0x82, 0x9E, 0x84, 0x80, 0x01, 0xF1, 0x1B, 0x01, + 0x07, 0x4E, 0x18, 0xA5, 0x06, 0x3C, 0x69, 0x28, 0x32, 0xFE, 0xE4, 0x40, + 0xCC, 0x74, 0x54, 0x15, 0x37, 0xB0, 0x4C, 0x0F, 0x88, 0x20, 0x44, 0x1D, + 0x28, 0x46, 0x5C, 0x8A, 0xE9, 0x48, 0x0F, 0x84, 0xC8, 0x83, 0x1E, 0x0E, + 0xB1, 0x07, 0xD0, 0xC6, 0x05, 0x2E, 0x83, 0x20, 0x83, 0x1D, 0x60, 0xC0, + 0x80, 0x01, 0x88, 0x60, 0x02, 0x45, 0x69, 0xC0, 0x09, 0x3E, 0xCA, 0x81, + 0x03, 0xA2, 0x61, 0x70, 0x85, 0x20, 0x44, 0x24, 0x10, 0x61, 0x08, 0x44, + 0xBC, 0x81, 0x11, 0x8A, 0xE0, 0x80, 0x27, 0x38, 0x05, 0x4A, 0x02, 0xC9, + 0x74, 0x3C, 0xF9, 0x78, 0x47, 0x35, 0x5C, 0xD1, 0x84, 0xCB, 0x55, 0x00, + 0x02, 0xC7, 0xC1, 0x1D, 0xB1, 0x08, 0x00, 0x80, 0x01, 0x4F, 0xC0, 0x06, + 0x4E, 0xA8, 0x05, 0x2D, 0x68, 0xD3, 0x8E, 0xDD, 0x7D, 0x66, 0x35, 0x11, + 0x88, 0xD6, 0x03, 0x74, 0x40, 0x84, 0x44, 0x5E, 0x6E, 0x3A, 0x0F, 0x28, + 0x00, 0x00, 0x26, 0xF0, 0xD4, 0x02, 0xCC, 0xE0, 0x06, 0x42, 0x10, 0x85, + 0x28, 0x3C, 0xE1, 0x8A, 0x55, 0x8C, 0xC2, 0x13, 0x6E, 0xD4, 0x41, 0x35, + 0xF2, 0xAA, 0x0F, 0x69, 0x04, 0xC1, 0x3D, 0xF0, 0x41, 0xE5, 0x5B, 0xAD, + 0x21, 0x0D, 0x68, 0xD0, 0x22, 0x3F, 0xCA, 0x50, 0x86, 0x2A, 0xEC, 0xAA, + 0xE2, 0x1D, 0xF3, 0x78, 0x40, 0xB4, 0x98, 0xC0, 0xD4, 0x46, 0xC0, 0xCB, + 0x07, 0x85, 0x60, 0x05, 0x21, 0x00, 0x98, 0x0C, 0x0A, 0x45, 0x02, 0x9C, + 0xA5, 0x96, 0x62, 0x6D, 0x18, 0xC3, 0x25, 0x46, 0x66, 0xA3, 0x01, 0x3E, + 0x76, 0x22, 0x1A, 0xF1, 0x59, 0x3B, 0x4F, 0xE6, 0xC0, 0x34, 0xAC, 0x53, + 0x0C, 0x97, 0x38, 0x43, 0x49, 0xC4, 0x70, 0x88, 0x41, 0x84, 0xD3, 0x0C, + 0x0F, 0x5B, 0x58, 0x1B, 0x9E, 0xF9, 0xA1, 0xAF, 0xAD, 0x49, 0x25, 0x66, + 0x53, 0x83, 0x1A, 0x06, 0x38, 0x91, 0x15, 0x80, 0x6C, 0xB6, 0x3E, 0xF1, + 0xFE, 0xD9, 0x09, 0x92, 0x5C, 0x28, 0x9F, 0x8C, 0x60, 0x29, 0x82, 0x41, + 0xE1, 0x51, 0x1C, 0x20, 0xC3, 0x06, 0x10, 0x4C, 0x0C, 0x6C, 0x82, 0x83, + 0x1B, 0x8E, 0x4B, 0x08, 0xE4, 0x12, 0x57, 0xA2, 0xC9, 0x75, 0x73, 0xC3, + 0x0E, 0x41, 0x88, 0x43, 0x3C, 0x4C, 0x2E, 0x39, 0x94, 0x44, 0x8B, 0x04, + 0x85, 0xB4, 0xA3, 0x0D, 0xEA, 0x04, 0x24, 0x00, 0x14, 0x09, 0x5C, 0xB0, + 0x86, 0xC1, 0xCD, 0x29, 0x11, 0x89, 0x50, 0x04, 0x1F, 0xE0, 0xC0, 0x88, + 0x44, 0x88, 0xC0, 0x13, 0xF0, 0xD0, 0x17, 0xE2, 0x20, 0x27, 0x8D, 0x52, + 0xD4, 0xA2, 0x09, 0x38, 0x80, 0x00, 0x02, 0x1E, 0xE0, 0x5F, 0x08, 0x44, + 0x00, 0x02, 0x06, 0x30, 0x00, 0x01, 0x04, 0x30, 0xAD, 0xE4, 0x60, 0xA2, + 0x55, 0x38, 0xA8, 0xDD, 0x0E, 0x9C, 0xC5, 0x6B, 0x4F, 0xCC, 0x41, 0x08, + 0x46, 0xA0, 0xAA, 0xB3, 0x04, 0xFC, 0x80, 0xD4, 0x14, 0xC0, 0x39, 0x46, + 0x08, 0x71, 0x89, 0x89, 0x30, 0x61, 0x21, 0x04, 0xE1, 0x08, 0x42, 0xB8, + 0x54, 0x5E, 0xD5, 0xEA, 0x62, 0xEB, 0xAD, 0xAB, 0x3E, 0xD2, 0xA0, 0x45, + 0xBC, 0xA0, 0x51, 0xD7, 0x1E, 0xB3, 0xBB, 0xDD, 0xE9, 0xE1, 0x87, 0x2D, + 0x81, 0xDB, 0x02, 0x7D, 0x62, 0x84, 0x60, 0x1E, 0x60, 0x00, 0xC0, 0x86, + 0x36, 0xA1, 0x98, 0xF8, 0x4F, 0x0C, 0x68, 0x38, 0x99, 0x08, 0x53, 0x02, + 0xC0, 0x07, 0xA5, 0x41, 0x23, 0x2E, 0xE0, 0x1B, 0x4E, 0x48, 0xA0, 0xB3, + 0x1A, 0xAD, 0x80, 0x05, 0x06, 0xD1, 0x11, 0x3A, 0xF9, 0x87, 0x07, 0x86, + 0xE1, 0x21, 0x4C, 0x29, 0x61, 0x99, 0x3A, 0x97, 0xF9, 0x30, 0x3D, 0xD4, + 0xCC, 0xCB, 0xFA, 0x83, 0x91, 0xC0, 0x3E, 0x8A, 0x11, 0x5F, 0x56, 0x84, + 0xB7, 0x4A, 0x21, 0x14, 0xDD, 0x04, 0xA3, 0xDB, 0x01, 0x00, 0x40, 0x00, + 0x0A, 0x78, 0xD1, 0xFE, 0x25, 0xCC, 0x24, 0xA7, 0x43, 0x64, 0x65, 0x10, + 0x6A, 0x10, 0xC4, 0x9A, 0xAE, 0x12, 0xC1, 0x10, 0x1D, 0x42, 0x12, 0x12, + 0xC4, 0xC3, 0x20, 0x22, 0x11, 0x89, 0x33, 0x18, 0xE2, 0x10, 0x6B, 0x78, + 0x01, 0x53, 0x66, 0xC8, 0xC2, 0xA5, 0x04, 0xB6, 0x50, 0x23, 0x60, 0xC1, + 0x1A, 0xC2, 0xE0, 0x86, 0x49, 0xFF, 0x2D, 0x12, 0x7C, 0x78, 0x03, 0x22, + 0x18, 0x51, 0x02, 0x57, 0x43, 0xCF, 0x7C, 0x32, 0xC5, 0x07, 0x3C, 0xA8, + 0x51, 0x0B, 0x4F, 0xEC, 0x20, 0x3A, 0xB9, 0x46, 0x00, 0x04, 0x26, 0x30, + 0x01, 0xFF, 0x12, 0x60, 0x5A, 0x3E, 0x10, 0xC2, 0x0E, 0x16, 0xE9, 0x2C, + 0x04, 0x48, 0x20, 0x08, 0xA1, 0x98, 0x43, 0x11, 0x8A, 0xB0, 0xC8, 0xE8, + 0xB4, 0xBD, 0x00, 0x12, 0x88, 0xC0, 0x0D, 0xFC, 0x2E, 0x49, 0x66, 0x9F, + 0xC2, 0x13, 0xDA, 0xCE, 0xBB, 0x20, 0x89, 0xD0, 0xF5, 0x59, 0x4A, 0x46, + 0x17, 0x41, 0x78, 0x4F, 0x5B, 0xD1, 0x25, 0xE3, 0x64, 0xE8, 0x47, 0x5E, + 0xD0, 0x78, 0xA5, 0xBB, 0x33, 0xAF, 0x79, 0x22, 0x0C, 0xC0, 0x01, 0x0D, + 0x1A, 0x41, 0x08, 0x48, 0x30, 0x82, 0x8F, 0xA2, 0x90, 0x01, 0x29, 0x00, + 0x41, 0x60, 0x19, 0xC0, 0x82, 0x94, 0x98, 0x84, 0x7F, 0x5D, 0x2B, 0x83, + 0x0F, 0x11, 0x32, 0x88, 0x3A, 0xB4, 0xE0, 0x04, 0x3F, 0xB4, 0x3D, 0x37, + 0x5F, 0x50, 0x98, 0x12, 0x22, 0x16, 0x42, 0x17, 0x6A, 0x01, 0xC5, 0x62, + 0x32, 0xC0, 0x93, 0x4D, 0x9D, 0x25, 0x69, 0x53, 0x89, 0x32, 0x1F, 0x56, + 0xCE, 0x66, 0x82, 0x13, 0x0D, 0xB0, 0xFF, 0xE1, 0x19, 0x2E, 0x01, 0xA1, + 0x07, 0x5D, 0x04, 0x04, 0xB8, 0x05, 0x2F, 0xC0, 0x44, 0xDF, 0x81, 0x06, + 0x38, 0xC0, 0x03, 0x83, 0x52, 0x0A, 0x40, 0x19, 0x10, 0x86, 0x13, 0xA9, + 0xC1, 0xB9, 0x12, 0x3C, 0x2E, 0x68, 0xFE, 0x59, 0x76, 0x5A, 0xE8, 0x6E, + 0x28, 0x12, 0x85, 0xC0, 0xA1, 0x97, 0xD6, 0xC4, 0x21, 0x08, 0x81, 0x40, + 0x01, 0x13, 0x48, 0xCA, 0x00, 0x4C, 0xDF, 0x4B, 0xEB, 0x8F, 0x1F, 0x83, + 0x68, 0xC8, 0x4A, 0x22, 0x18, 0xC2, 0x24, 0x18, 0x02, 0x17, 0x29, 0x02, + 0x0C, 0xD0, 0xC1, 0xA5, 0xCC, 0x17, 0xF9, 0x50, 0xC6, 0x78, 0xC8, 0x83, + 0x37, 0xB8, 0x02, 0x11, 0xE8, 0x40, 0x04, 0x1C, 0x80, 0x01, 0x4C, 0xC0, + 0x01, 0x40, 0x00, 0x06, 0x1A, 0x40, 0x84, 0x8D, 0xCA, 0xAD, 0xF9, 0x8E, + 0x0E, 0x60, 0x82, 0x27, 0x18, 0xDE, 0x10, 0x18, 0x01, 0x23, 0xF5, 0xDD, + 0x11, 0xCC, 0x00, 0x0E, 0x14, 0xC0, 0xB4, 0x20, 0x40, 0x11, 0xFC, 0x43, + 0x68, 0x64, 0x8E, 0x11, 0x60, 0x42, 0x04, 0xBE, 0xC2, 0x8E, 0xB1, 0x18, + 0xE4, 0xB9, 0xD5, 0x5B, 0x65, 0x43, 0x35, 0xE8, 0x47, 0x7E, 0x2C, 0xC3, + 0x32, 0xB4, 0x82, 0x34, 0x68, 0x9E, 0x10, 0xB6, 0xDB, 0x28, 0x10, 0x80, + 0x03, 0x7C, 0xCC, 0x0A, 0xB4, 0x00, 0x03, 0x84, 0x00, 0x70, 0x81, 0x00, + 0xBE, 0xA1, 0x10, 0xC0, 0x44, 0x44, 0x3C, 0x29, 0x53, 0x1B, 0x84, 0xC1, + 0x48, 0x8C, 0x96, 0x59, 0x2C, 0xD6, 0x19, 0x1C, 0x09, 0x8A, 0x24, 0x53, + 0x93, 0x0D, 0x44, 0x1A, 0x54, 0x13, 0x00, 0xB9, 0x08, 0xA2, 0x34, 0x9C, + 0x44, 0xA4, 0x41, 0x1A, 0x38, 0x93, 0xD5, 0x10, 0x17, 0x38, 0x99, 0x49, + 0x1B, 0x5C, 0x8D, 0x20, 0x20, 0x84, 0x39, 0x31, 0x53, 0x1A, 0xA2, 0x44, + 0x0A, 0x50, 0xC5, 0x66, 0x99, 0x4C, 0xC9, 0x50, 0x13, 0x6E, 0x11, 0x8A, + 0xE8, 0x39, 0x49, 0x9F, 0x2D, 0xC0, 0xBD, 0x35, 0x40, 0x02, 0x38, 0x80, + 0xD4, 0x30, 0x40, 0xC3, 0x49, 0x1D, 0x21, 0x1C, 0x57, 0x97, 0x14, 0x57, + 0x04, 0x15, 0x82, 0xFE, 0xB0, 0x05, 0x22, 0xE0, 0x50, 0xFE, 0x74, 0x91, + 0xCD, 0x25, 0x4C, 0xA2, 0x1A, 0x90, 0xC1, 0x0B, 0x50, 0x91, 0xD1, 0x08, + 0xC6, 0x08, 0xB4, 0xC0, 0xE8, 0x91, 0x00, 0x08, 0xA4, 0x01, 0x0C, 0xB4, + 0x00, 0x1A, 0xFC, 0x1F, 0x22, 0x44, 0x82, 0x22, 0x64, 0x1D, 0x1C, 0x80, + 0x51, 0x0C, 0x90, 0x51, 0x78, 0xA0, 0x95, 0xE2, 0x88, 0xC7, 0x7D, 0x7D, + 0x43, 0x2B, 0x60, 0xC2, 0x4F, 0xF5, 0x5A, 0x24, 0x4D, 0x00, 0xB1, 0x88, + 0x4A, 0x05, 0xC4, 0x20, 0x11, 0x78, 0x82, 0xEE, 0xFC, 0xD4, 0x11, 0x10, + 0xC0, 0x04, 0x60, 0x15, 0x0E, 0x18, 0x07, 0x00, 0xB4, 0x9D, 0x0E, 0x7C, + 0xC2, 0x08, 0x66, 0x8E, 0xB6, 0xED, 0x00, 0x11, 0x28, 0x60, 0x2C, 0x55, + 0x46, 0x35, 0x18, 0x81, 0x34, 0x50, 0x43, 0x5B, 0x59, 0x83, 0x35, 0xE8, + 0x20, 0x35, 0xC8, 0x02, 0xE5, 0xE5, 0x07, 0xE6, 0x0D, 0x21, 0x39, 0xE6, + 0x15, 0x11, 0x3C, 0x40, 0x02, 0xC4, 0x0F, 0xD5, 0xA4, 0xC0, 0x02, 0xC8, + 0x00, 0x0A, 0xAC, 0x0F, 0x0C, 0x59, 0x5F, 0x02, 0x9D, 0xC0, 0x59, 0x9C, + 0x01, 0x03, 0xFD, 0x90, 0x03, 0xD1, 0x04, 0x62, 0xBD, 0x40, 0x57, 0xAC, + 0x80, 0x87, 0x70, 0x05, 0x4A, 0xC8, 0xC4, 0x07, 0x98, 0xC4, 0x32, 0xE9, + 0xC1, 0x40, 0x74, 0x19, 0x37, 0xE9, 0x48, 0x4D, 0xBC, 0x80, 0x34, 0xD9, + 0x04, 0x41, 0xB8, 0x81, 0xC4, 0x08, 0x02, 0x75, 0xE1, 0x9C, 0x1B, 0x5C, + 0x82, 0x58, 0x60, 0xD0, 0x91, 0x14, 0x84, 0xC3, 0x5D, 0x53, 0x92, 0x5C, + 0x88, 0xEE, 0x8D, 0x00, 0x84, 0xF8, 0x12, 0x46, 0x24, 0x00, 0xE9, 0xB1, + 0xD0, 0x00, 0x00, 0xD4, 0x02, 0x9C, 0x00, 0x0B, 0xA4, 0x80, 0x1B, 0x44, + 0x02, 0x21, 0x08, 0xC2, 0x20, 0x48, 0x90, 0x98, 0x0C, 0xC2, 0x9C, 0x00, + 0x5D, 0x22, 0x20, 0xC2, 0x79, 0xA5, 0x45, 0x63, 0x11, 0xC2, 0x1E, 0x8C, + 0xFE, 0x88, 0x1A, 0xB8, 0x40, 0x5F, 0x14, 0x45, 0x02, 0x51, 0xC4, 0x47, + 0x3D, 0x1D, 0x1A, 0xBE, 0x01, 0x1A, 0x60, 0x9D, 0xD0, 0x19, 0x02, 0xDB, + 0xE4, 0xC1, 0x1B, 0xD4, 0xC0, 0xF3, 0xF4, 0xD8, 0x4B, 0x89, 0x07, 0x3E, + 0x90, 0x83, 0xE4, 0x14, 0x81, 0x10, 0xA0, 0xC6, 0x73, 0x04, 0x81, 0x72, + 0x90, 0x06, 0x26, 0x7C, 0x82, 0x1C, 0x91, 0xA0, 0x71, 0x3C, 0x4B, 0x01, + 0xA8, 0x20, 0x24, 0x1D, 0x41, 0x59, 0x66, 0x55, 0x28, 0x50, 0x0E, 0x10, + 0x14, 0x01, 0x26, 0x14, 0x41, 0x0E, 0x44, 0x25, 0x5E, 0x71, 0x0A, 0x2D, + 0xB4, 0x18, 0xE4, 0xC5, 0x18, 0x37, 0x5A, 0xC3, 0x34, 0x58, 0xC3, 0x32, + 0xC8, 0x42, 0x34, 0x20, 0x83, 0x32, 0x9C, 0x82, 0x8E, 0x95, 0x23, 0x61, + 0xC6, 0xD2, 0x28, 0x54, 0xC0, 0x04, 0x78, 0x80, 0x13, 0xF2, 0xD6, 0x00, + 0x74, 0x40, 0x50, 0xBC, 0x23, 0xA1, 0xA0, 0xC0, 0x51, 0x74, 0x40, 0x85, + 0x54, 0xA1, 0x0B, 0x5C, 0x88, 0x42, 0x1C, 0x49, 0xC1, 0xA1, 0x88, 0xDE, + 0xA4, 0xC1, 0x3C, 0xC1, 0xC4, 0x40, 0x88, 0x84, 0xC6, 0x98, 0x8C, 0x1B, + 0x28, 0xC4, 0x19, 0x08, 0x04, 0xFF, 0xC0, 0x19, 0xCF, 0xC0, 0x99, 0xFE, + 0x84, 0x93, 0x8E, 0xAC, 0x00, 0xF4, 0x31, 0xC6, 0x0A, 0x94, 0x44, 0x34, + 0xD9, 0x0C, 0x9C, 0xB9, 0x66, 0x92, 0x0C, 0xD3, 0x25, 0xAC, 0x48, 0x0A, + 0xB8, 0x84, 0xC5, 0x94, 0x81, 0xEE, 0xAD, 0x40, 0x45, 0xCC, 0x93, 0x90, + 0xC5, 0x56, 0x9F, 0x6C, 0x14, 0x01, 0x60, 0xC9, 0x07, 0x9C, 0x40, 0x0A, + 0x44, 0x97, 0x1E, 0xD0, 0xE4, 0xC4, 0x71, 0xC9, 0x31, 0x55, 0xC5, 0x98, + 0xB1, 0xC9, 0xEC, 0x49, 0x54, 0xF2, 0xED, 0xC1, 0x26, 0x02, 0x86, 0x02, + 0xD4, 0x5F, 0x85, 0xB8, 0x40, 0x45, 0x44, 0xC4, 0x51, 0xA2, 0x41, 0x1A, + 0xA8, 0xD4, 0x24, 0xFE, 0x20, 0x82, 0x22, 0x18, 0x02, 0x1F, 0x30, 0x02, + 0x1F, 0xD4, 0x00, 0xBD, 0x4C, 0xA5, 0xE6, 0xDD, 0xD7, 0xAC, 0x35, 0x0F, + 0x0E, 0xF4, 0xC0, 0x28, 0x8C, 0x42, 0xDD, 0x25, 0xDB, 0x0D, 0x8C, 0xCA, + 0x59, 0x0E, 0x58, 0x59, 0x42, 0x8B, 0x73, 0x04, 0xC0, 0x32, 0xE6, 0x80, + 0x28, 0x84, 0xC2, 0x5A, 0x8E, 0xC2, 0x1C, 0x04, 0xC1, 0xAB, 0xE5, 0x55, + 0x1A, 0xD5, 0xA5, 0x34, 0x64, 0x83, 0x35, 0xC8, 0xC7, 0x36, 0x58, 0xC3, + 0x84, 0x52, 0xC3, 0x34, 0x44, 0xC3, 0x32, 0xE8, 0xC2, 0x32, 0xC4, 0x42, + 0x34, 0xAC, 0xC2, 0x60, 0x16, 0x26, 0x88, 0x96, 0x4F, 0x29, 0x48, 0xC0, + 0xD3, 0x54, 0x09, 0x51, 0x50, 0x66, 0x9F, 0x11, 0x4A, 0xA1, 0x50, 0x26, + 0x31, 0x35, 0x50, 0x4D, 0xD8, 0xC8, 0x8B, 0x80, 0x8C, 0x46, 0x70, 0x45, + 0xC9, 0x30, 0xD0, 0x89, 0xC4, 0x48, 0x3B, 0xA1, 0x44, 0x8D, 0x72, 0x0D, + 0xF4, 0x11, 0x44, 0x0E, 0x81, 0xCD, 0xBF, 0xA9, 0x81, 0x4D, 0x2C, 0x51, + 0x1D, 0x7C, 0x45, 0x41, 0xBC, 0x00, 0x1A, 0x98, 0x81, 0x0C, 0x5C, 0xC8, + 0x40, 0xAC, 0x88, 0xCE, 0x30, 0x46, 0x1B, 0x0C, 0xD3, 0x08, 0x7D, 0x88, + 0xC9, 0xC8, 0xE8, 0x2E, 0x3D, 0x44, 0x0B, 0x1C, 0x50, 0x0A, 0x08, 0x85, + 0x60, 0x18, 0xE2, 0x00, 0x00, 0x45, 0x0A, 0x9C, 0x45, 0x97, 0x94, 0x66, + 0xF4, 0x45, 0x94, 0xC4, 0x81, 0x4D, 0x4C, 0x16, 0x42, 0x1B, 0x24, 0xA9, + 0x5A, 0xA8, 0x01, 0x0A, 0x24, 0x1D, 0x03, 0xA0, 0x00, 0x4D, 0xC4, 0x4C, + 0x0A, 0x04, 0xCD, 0x28, 0xB2, 0x01, 0x1C, 0xA0, 0x01, 0x19, 0x90, 0x41, + 0x24, 0x50, 0xC2, 0xA9, 0xA1, 0x1A, 0x4A, 0x95, 0x40, 0x34, 0xC4, 0xA2, + 0xE6, 0x4D, 0xE5, 0x3B, 0x08, 0xC1, 0xE4, 0x8C, 0x02, 0x39, 0x48, 0x43, + 0x06, 0x38, 0x8B, 0xAE, 0x19, 0x92, 0xFE, 0x04, 0xA0, 0xA5, 0x0A, 0x16, + 0x40, 0xAE, 0x3D, 0xC7, 0x7F, 0x1A, 0x40, 0x0E, 0x88, 0x98, 0x2A, 0x70, + 0x46, 0x8A, 0xA9, 0x98, 0x64, 0xD0, 0x42, 0x11, 0xD0, 0x42, 0x5E, 0x72, + 0x43, 0x5E, 0x4E, 0xE8, 0x0E, 0xCA, 0x82, 0x0F, 0xE6, 0x07, 0x2B, 0x7C, + 0x68, 0x88, 0xB6, 0xEA, 0xBD, 0x34, 0x4E, 0x10, 0x38, 0x40, 0x08, 0x30, + 0x8D, 0x03, 0xF8, 0x93, 0x02, 0x84, 0x40, 0xF7, 0x25, 0x00, 0xD4, 0x68, + 0x1F, 0x48, 0xB6, 0xC8, 0x90, 0xEC, 0x0C, 0x03, 0x85, 0xA9, 0x0B, 0xB8, + 0x00, 0x3F, 0x16, 0xC4, 0x0F, 0x19, 0xD6, 0x0A, 0x1C, 0x8C, 0x44, 0x7C, + 0xD0, 0x1D, 0xAE, 0x48, 0x3B, 0x31, 0xD0, 0x59, 0xD8, 0xC4, 0x18, 0xC0, + 0x1E, 0x97, 0xF0, 0x4F, 0xDB, 0x98, 0xD9, 0x55, 0x50, 0x85, 0xFE, 0xA8, + 0x4C, 0xED, 0x31, 0x50, 0x96, 0xC5, 0x48, 0x19, 0x5C, 0x90, 0x3C, 0x5D, + 0x26, 0x61, 0x30, 0x46, 0x0A, 0x5C, 0xC2, 0xC1, 0xBC, 0x40, 0x47, 0x80, + 0x62, 0x27, 0x5E, 0x89, 0xCB, 0x01, 0x97, 0x49, 0x38, 0xD7, 0x99, 0xE1, + 0x41, 0x21, 0xCC, 0xC9, 0x73, 0x16, 0x42, 0x11, 0x11, 0xD7, 0x79, 0x11, + 0x02, 0x1E, 0xB4, 0x00, 0xA0, 0x28, 0x40, 0x03, 0x80, 0xA4, 0xCD, 0x78, + 0x24, 0x73, 0x92, 0xC0, 0x51, 0x96, 0x27, 0x1A, 0x08, 0xE0, 0x24, 0x4C, + 0x02, 0x7B, 0x2A, 0x82, 0x22, 0xC4, 0x00, 0x32, 0xA4, 0x51, 0x61, 0xC2, + 0x03, 0x78, 0xA4, 0x51, 0x3F, 0xE0, 0x83, 0x2B, 0xE8, 0x40, 0xDF, 0x3D, + 0x4B, 0xDB, 0xB5, 0xDD, 0x55, 0x4D, 0x80, 0x01, 0xFC, 0xE7, 0x85, 0x11, + 0xC0, 0xAF, 0x09, 0xD5, 0xE6, 0xD0, 0x60, 0x79, 0xC0, 0x67, 0x2C, 0xB9, + 0xC2, 0x10, 0xFC, 0x02, 0x35, 0x70, 0x23, 0x52, 0xE5, 0xE5, 0x34, 0xC8, + 0x8B, 0x2E, 0xA0, 0xAA, 0x5F, 0xC6, 0x02, 0xAB, 0xBA, 0xFE, 0xAA, 0xCE, + 0x8A, 0x8B, 0x2A, 0x38, 0x00, 0x2F, 0x79, 0xC0, 0x46, 0x09, 0x85, 0x0B, + 0xDD, 0x5B, 0x07, 0xE4, 0xDF, 0xBF, 0x80, 0xC0, 0xC6, 0xC0, 0x19, 0x8A, + 0x38, 0xDC, 0x0B, 0x70, 0x44, 0x61, 0x0C, 0x09, 0x4D, 0x00, 0xE7, 0x40, + 0x78, 0x0C, 0xDF, 0xB8, 0xC4, 0x25, 0x84, 0x44, 0x33, 0xED, 0xCC, 0xC1, + 0x95, 0x10, 0x4E, 0x8C, 0x41, 0x85, 0x48, 0xE1, 0xD7, 0xD4, 0x48, 0x41, + 0xE9, 0x01, 0x71, 0x81, 0x99, 0x99, 0x78, 0x88, 0x8D, 0x8C, 0xDF, 0x19, + 0xD0, 0x63, 0x09, 0xA5, 0x80, 0x6B, 0xD5, 0xD3, 0x89, 0x18, 0xC9, 0x01, + 0x1D, 0x09, 0x41, 0x5C, 0xE6, 0x8A, 0xC4, 0x16, 0x46, 0xC0, 0x50, 0x02, + 0xB4, 0x10, 0x09, 0x8C, 0x2D, 0x25, 0xDE, 0x50, 0x24, 0x58, 0x45, 0xD9, + 0xB0, 0x49, 0x22, 0x9C, 0x97, 0x25, 0x24, 0x17, 0x09, 0x14, 0x85, 0x02, + 0x94, 0x80, 0xC6, 0x8C, 0x01, 0x3F, 0xD6, 0x9E, 0x0B, 0x7C, 0x40, 0x0A, + 0xBC, 0xC1, 0x1B, 0xB0, 0xC0, 0x29, 0x1A, 0x02, 0x1C, 0x24, 0x02, 0xC3, + 0x4E, 0x82, 0xC3, 0xF6, 0x01, 0x0C, 0x0C, 0xAA, 0xCA, 0x96, 0xE3, 0xE2, + 0xA0, 0x91, 0x3C, 0x08, 0x01, 0x01, 0x04, 0x00, 0xEA, 0x0A, 0xE8, 0x80, + 0xAD, 0x2E, 0x00, 0xA8, 0x6E, 0xB5, 0x55, 0x40, 0xB0, 0x6D, 0xD5, 0x0E, + 0x88, 0x02, 0x38, 0x84, 0x2E, 0x5A, 0x51, 0x06, 0x04, 0x42, 0x03, 0x35, + 0xBC, 0xEC, 0x84, 0x52, 0xA8, 0x85, 0x52, 0x03, 0x34, 0x84, 0x82, 0x5F, + 0x22, 0xC3, 0x32, 0xB0, 0xC2, 0x7B, 0xEE, 0x2C, 0xF2, 0x8A, 0x8B, 0xE2, + 0x0C, 0x81, 0x03, 0xD0, 0x4D, 0x51, 0x70, 0x40, 0xE7, 0xB1, 0xD0, 0xD3, + 0xEC, 0x93, 0x63, 0x5E, 0x5F, 0x07, 0x34, 0xD0, 0x08, 0x44, 0xED, 0x3A, + 0x49, 0x6B, 0xC9, 0xA4, 0x01, 0x43, 0x80, 0x19, 0x43, 0x8C, 0x81, 0x44, + 0xFE, 0x24, 0xCA, 0x4C, 0xAC, 0x40, 0x19, 0x70, 0x0C, 0xC8, 0x65, 0x88, + 0xFD, 0x1C, 0xDC, 0xC1, 0x2D, 0xD9, 0x91, 0x34, 0x53, 0x33, 0x3D, 0x56, + 0x57, 0x9C, 0x41, 0x9B, 0x12, 0x17, 0xCF, 0x28, 0xC4, 0xCE, 0x78, 0x88, + 0xB2, 0xC2, 0xD6, 0xF0, 0x65, 0x91, 0x01, 0xC5, 0x44, 0x09, 0x5D, 0x53, + 0x12, 0xD2, 0x99, 0x18, 0x8C, 0x80, 0xD3, 0x00, 0xD4, 0xF5, 0xDE, 0x1C, + 0x44, 0x2D, 0x8C, 0x19, 0x5C, 0x42, 0xD9, 0x24, 0x02, 0x25, 0x04, 0xAE, + 0xC3, 0x80, 0x22, 0x60, 0xE0, 0x5B, 0x4E, 0xE0, 0xC1, 0x54, 0x80, 0x62, + 0x1A, 0x60, 0x04, 0x52, 0x9E, 0xE2, 0x1B, 0xAC, 0x97, 0x21, 0x50, 0x02, + 0xC3, 0xB2, 0xE7, 0x1D, 0xC4, 0xC0, 0x32, 0x2C, 0x5E, 0x61, 0x82, 0x5B, + 0x3E, 0xC8, 0x43, 0x11, 0x9C, 0x46, 0x04, 0x10, 0x40, 0x59, 0x0A, 0x68, + 0xEA, 0x42, 0x4B, 0xB3, 0x20, 0x92, 0x0E, 0xB8, 0xC2, 0xAA, 0x90, 0xC2, + 0x35, 0x50, 0xE3, 0x5D, 0x49, 0x46, 0x29, 0x14, 0x01, 0x5B, 0x45, 0x28, + 0xCC, 0x6E, 0xC3, 0xEE, 0x4A, 0xC3, 0x32, 0x9C, 0xC2, 0x32, 0x44, 0x03, + 0xAA, 0xAE, 0x82, 0x5C, 0x26, 0xAF, 0x13, 0x1B, 0xC8, 0x36, 0x98, 0x00, + 0xF4, 0x7E, 0xA9, 0x03, 0x6C, 0x1F, 0xCB, 0x09, 0x46, 0x51, 0xD4, 0x2A, + 0xC0, 0x22, 0x85, 0x02, 0x81, 0x66, 0x18, 0x54, 0xE1, 0x18, 0xB8, 0xC1, + 0x18, 0x1C, 0x50, 0x3C, 0xF5, 0xC8, 0x18, 0x98, 0x85, 0x18, 0xF8, 0x4C, + 0x61, 0x8C, 0x8C, 0x70, 0x8A, 0x81, 0x44, 0xF2, 0xDB, 0xF8, 0xD9, 0xC8, + 0xCE, 0xCC, 0x44, 0x8F, 0xC8, 0x48, 0x32, 0xB5, 0xC0, 0xC8, 0xF0, 0x1B, + 0x3A, 0xB5, 0xCD, 0xC8, 0x18, 0x04, 0xC5, 0xCC, 0xAF, 0xCD, 0x20, 0xD0, + 0x0B, 0xCC, 0x56, 0x9D, 0x2E, 0x09, 0xCE, 0xB0, 0x71, 0xFB, 0x44, 0x08, + 0x3D, 0xFE, 0x04, 0xFE, 0x60, 0x40, 0x85, 0x02, 0x8C, 0xC0, 0x59, 0x18, + 0x97, 0x1E, 0x20, 0x84, 0x99, 0x2D, 0x62, 0x44, 0xDD, 0x9E, 0xD0, 0x26, + 0x45, 0x07, 0x30, 0x90, 0x73, 0x59, 0xCC, 0x18, 0x8C, 0xC0, 0x01, 0xE1, + 0x71, 0x52, 0x5E, 0xAE, 0x22, 0x24, 0x02, 0x23, 0x8C, 0x30, 0x23, 0xB0, + 0x01, 0x09, 0x30, 0x03, 0xA1, 0x12, 0x26, 0x03, 0x52, 0x25, 0x11, 0xE0, + 0xC0, 0x28, 0xE4, 0xC0, 0x84, 0xCD, 0x4E, 0x6A, 0xE4, 0x80, 0x0E, 0x18, + 0x41, 0x08, 0x8E, 0x02, 0x34, 0x9C, 0x42, 0x06, 0xBC, 0x03, 0xE4, 0x80, + 0x9B, 0xBB, 0xA9, 0x42, 0x10, 0xE8, 0x42, 0x35, 0xC4, 0x6C, 0xEF, 0xEA, + 0xA5, 0x36, 0x2C, 0x43, 0x28, 0x40, 0x43, 0x34, 0xB0, 0x82, 0x2C, 0xAC, + 0x42, 0x2D, 0xD8, 0xEE, 0x13, 0x57, 0xB3, 0x7F, 0x0C, 0x41, 0xD3, 0x5C, + 0xC9, 0x49, 0x0E, 0x0A, 0x54, 0xB4, 0x90, 0x21, 0x3A, 0x85, 0x21, 0x76, + 0x00, 0x84, 0x40, 0x48, 0xCC, 0xF0, 0x8D, 0x15, 0x4E, 0x6B, 0x1B, 0x40, + 0x48, 0x6A, 0x85, 0x04, 0x62, 0xB5, 0x81, 0x0A, 0xF4, 0x12, 0x0A, 0x04, + 0x4D, 0xC9, 0xAC, 0xC0, 0x72, 0xE9, 0x4C, 0x33, 0xE9, 0x8C, 0x0B, 0x7C, + 0x48, 0x6B, 0x71, 0xD0, 0x8A, 0x9C, 0x71, 0x90, 0xE8, 0x21, 0x63, 0xEC, + 0xA6, 0x4F, 0x16, 0xC4, 0x8F, 0x94, 0x44, 0x19, 0x08, 0xAE, 0xC6, 0x34, + 0x53, 0x00, 0x45, 0x88, 0x28, 0x1E, 0x16, 0x3C, 0xE9, 0x5E, 0x44, 0x94, + 0xC0, 0x45, 0xD4, 0x5E, 0xA1, 0x3C, 0x89, 0x36, 0x73, 0xC0, 0x09, 0x98, + 0x4C, 0x40, 0x22, 0x5C, 0x45, 0xF4, 0x21, 0xA1, 0x34, 0x80, 0x08, 0xB8, + 0x00, 0x19, 0x18, 0x04, 0xA5, 0x49, 0x4C, 0x19, 0x50, 0x53, 0x19, 0x90, + 0x27, 0xE5, 0xC2, 0x41, 0x1A, 0x18, 0x82, 0x21, 0xB8, 0x17, 0x23, 0x54, + 0x02, 0x23, 0x3C, 0x42, 0x1F, 0x8C, 0xFE, 0x40, 0x2C, 0xA0, 0x70, 0x88, + 0x32, 0xCE, 0x3F, 0x04, 0x81, 0x27, 0x48, 0xC0, 0x3F, 0x0C, 0x41, 0x11, + 0xDC, 0x67, 0x10, 0x8C, 0xC2, 0x3F, 0xC4, 0xA0, 0x0C, 0x42, 0xA0, 0x0E, + 0x9C, 0x15, 0x2D, 0xF6, 0xD8, 0x2C, 0xEA, 0x03, 0x04, 0xFE, 0xC2, 0x7B, + 0x6C, 0xC3, 0x5B, 0x11, 0xB1, 0x36, 0x58, 0xA8, 0x32, 0xAC, 0x02, 0x32, + 0xF0, 0x47, 0x34, 0x47, 0x86, 0x35, 0x77, 0xF5, 0x7F, 0x48, 0x86, 0x27, + 0x74, 0xDE, 0x53, 0x18, 0x22, 0x03, 0x24, 0x6E, 0x47, 0xE9, 0x2A, 0x51, + 0xE8, 0xAA, 0xF5, 0xC5, 0x93, 0x6C, 0x7D, 0x50, 0xD3, 0x6E, 0x04, 0x4C, + 0x68, 0x74, 0x8C, 0x9C, 0x8C, 0x0B, 0xA0, 0x40, 0x85, 0xD4, 0xE9, 0xC6, + 0x7C, 0x48, 0x32, 0x8D, 0x81, 0x0A, 0x38, 0x93, 0xF3, 0xC5, 0x84, 0x1E, + 0xD8, 0xE3, 0x38, 0x53, 0x69, 0x3D, 0xB9, 0x44, 0x19, 0x24, 0x17, 0x49, + 0xA4, 0xD6, 0x19, 0x78, 0x6F, 0xDB, 0xB2, 0x80, 0x0C, 0x5C, 0x42, 0x59, + 0x30, 0x53, 0xD4, 0x12, 0x44, 0x98, 0x42, 0x88, 0x8F, 0xB4, 0xC1, 0x91, + 0xB4, 0xD3, 0x6A, 0x09, 0x8C, 0x0A, 0x94, 0x81, 0xA7, 0x95, 0x40, 0x6E, + 0x31, 0x72, 0x53, 0xB4, 0x10, 0x52, 0x90, 0x80, 0x63, 0x1E, 0x05, 0x08, + 0x94, 0x00, 0x84, 0xB8, 0x80, 0x44, 0xE7, 0x81, 0x0E, 0xE5, 0x90, 0x1A, + 0x10, 0xC2, 0x19, 0x64, 0x2F, 0xF0, 0x25, 0x65, 0xA3, 0x50, 0xEE, 0x7A, + 0x2A, 0xC2, 0x22, 0x30, 0xEC, 0x22, 0x2C, 0x42, 0x09, 0xB0, 0x02, 0x4E, + 0x83, 0x28, 0x1A, 0x35, 0xC1, 0xEC, 0x7E, 0xC6, 0xEC, 0x18, 0xC1, 0x28, + 0xC4, 0x8E, 0x27, 0xEC, 0xA7, 0xB6, 0x19, 0x5E, 0x10, 0xC8, 0x43, 0xE6, + 0xC9, 0x97, 0x3E, 0x90, 0x82, 0x27, 0xD0, 0x82, 0x34, 0x4C, 0x28, 0x76, + 0x67, 0x03, 0x35, 0x44, 0x03, 0x86, 0xA2, 0xC2, 0x8D, 0xFE, 0xC9, 0x82, + 0x2C, 0x84, 0xC2, 0x2F, 0x04, 0xB7, 0x57, 0x7B, 0xF5, 0x4B, 0xA9, 0x82, + 0x04, 0x98, 0x40, 0x72, 0x66, 0xF3, 0xD2, 0x70, 0x40, 0x15, 0xF3, 0x05, + 0x6E, 0x1D, 0xCD, 0x0A, 0xE9, 0x12, 0x28, 0xD6, 0x90, 0x67, 0x16, 0x5C, + 0x49, 0x9C, 0x66, 0xD3, 0x0A, 0x44, 0x12, 0x7E, 0x88, 0x2F, 0x8D, 0xB3, + 0xCF, 0x84, 0xE9, 0x66, 0xD1, 0x08, 0x8C, 0x5C, 0x88, 0x90, 0x0E, 0x42, + 0x43, 0x6C, 0xD6, 0xAF, 0x96, 0x10, 0x03, 0x99, 0x01, 0x1A, 0x90, 0x49, + 0x89, 0xAC, 0xE9, 0x67, 0x9D, 0x45, 0x6F, 0x2E, 0xF6, 0x0B, 0x54, 0xA1, + 0x0A, 0xA4, 0x01, 0x57, 0x5C, 0xC2, 0x30, 0xA5, 0x80, 0x0C, 0xA0, 0x44, + 0x1A, 0xEC, 0xE6, 0x4C, 0x7C, 0xD9, 0x25, 0x5C, 0x51, 0x9D, 0x82, 0xCC, + 0x3D, 0x01, 0x17, 0x09, 0x94, 0x00, 0x35, 0x5D, 0x44, 0x9F, 0x41, 0x4D, + 0x0B, 0x11, 0x96, 0x01, 0x75, 0xC4, 0x68, 0x45, 0x90, 0x4C, 0xE6, 0xCF, + 0x06, 0x37, 0xF0, 0x29, 0x36, 0x0A, 0x1F, 0xA0, 0x81, 0x22, 0x30, 0x6C, + 0x23, 0x34, 0x42, 0x25, 0x2C, 0x82, 0x1F, 0xC4, 0xC0, 0x2A, 0x24, 0x2F, + 0xA7, 0x24, 0x8B, 0x28, 0xC8, 0xB2, 0x27, 0xE0, 0x40, 0x06, 0x00, 0x41, + 0x10, 0x08, 0xD5, 0x69, 0xE8, 0xCE, 0x28, 0x7C, 0x42, 0x10, 0xBC, 0x32, + 0x53, 0x4B, 0x86, 0x64, 0x88, 0x42, 0x13, 0x58, 0x77, 0x5E, 0x66, 0x03, + 0x84, 0x6A, 0xC3, 0x8C, 0x45, 0x83, 0x2D, 0xB0, 0x82, 0x32, 0xC4, 0x02, + 0x32, 0x84, 0x42, 0xCE, 0x96, 0xB7, 0x57, 0x57, 0xC6, 0x28, 0xCC, 0x40, + 0x71, 0x48, 0x80, 0x23, 0x7D, 0x33, 0x54, 0x74, 0xE9, 0x46, 0x79, 0xE9, + 0xDE, 0x22, 0x4D, 0xC1, 0xC2, 0x99, 0x91, 0x9C, 0x6F, 0x8D, 0x1C, 0xCC, + 0x61, 0x13, 0xC4, 0x29, 0xEA, 0x1E, 0x31, 0x49, 0x61, 0x0A, 0xE4, 0x73, + 0xFE, 0x8B, 0x8C, 0x88, 0x3E, 0x52, 0xC5, 0x69, 0xF6, 0x0C, 0x06, 0x8D, + 0x88, 0x15, 0x26, 0x57, 0xC5, 0xF4, 0xB1, 0x8E, 0x80, 0x05, 0x1C, 0x28, + 0x57, 0x42, 0x84, 0x89, 0xCD, 0xC0, 0x48, 0x4C, 0x30, 0xA7, 0xFA, 0xCA, + 0x04, 0xBF, 0x7D, 0x08, 0xCF, 0x84, 0x84, 0xFC, 0x64, 0x2F, 0x46, 0xB8, + 0xC0, 0x09, 0x75, 0x80, 0xDD, 0x80, 0x00, 0x0A, 0x14, 0x46, 0x94, 0x8A, + 0x01, 0x08, 0xE4, 0x9F, 0x8A, 0xE2, 0xC4, 0xFE, 0x54, 0xC5, 0xA4, 0x45, + 0xB6, 0x73, 0x25, 0x09, 0x63, 0x20, 0x25, 0xE6, 0x5E, 0xDD, 0x4B, 0x2F, + 0x82, 0x7B, 0x35, 0x02, 0x23, 0x78, 0xAE, 0x2C, 0x90, 0xB7, 0x2B, 0xEB, + 0x83, 0x15, 0x10, 0x81, 0x2E, 0x78, 0xC2, 0x28, 0x94, 0xC2, 0x84, 0x19, + 0xC1, 0xE5, 0x14, 0x47, 0x0E, 0x08, 0x41, 0x11, 0xB4, 0x02, 0x51, 0x67, + 0x1E, 0x65, 0xD4, 0x17, 0x75, 0xBB, 0xC7, 0xCB, 0x4E, 0xC3, 0xEE, 0x6A, + 0xC3, 0x34, 0xE8, 0x82, 0xBC, 0xAC, 0x02, 0x2C, 0x28, 0xC3, 0x2C, 0x28, + 0x03, 0x2A, 0xAC, 0x39, 0x9B, 0x7B, 0xF5, 0x28, 0x44, 0x80, 0x0F, 0xE8, + 0xC0, 0x10, 0xF8, 0x80, 0x04, 0x0C, 0x40, 0x72, 0x42, 0x85, 0xD4, 0x00, + 0xC6, 0xF7, 0x41, 0x85, 0x00, 0xA8, 0x1C, 0x09, 0x00, 0x89, 0x1C, 0x9B, + 0xC4, 0x4D, 0x8C, 0x1F, 0x92, 0x52, 0x05, 0x21, 0x9C, 0x2F, 0xA2, 0xE0, + 0x4D, 0x0A, 0x60, 0x34, 0xC8, 0x9C, 0xEF, 0x3B, 0xD5, 0x04, 0x98, 0xED, + 0x4F, 0x8D, 0xAF, 0x13, 0xFE, 0x66, 0x48, 0xC5, 0xD4, 0x48, 0x42, 0x8C, + 0x4C, 0x03, 0x8F, 0x84, 0x99, 0x90, 0x29, 0x44, 0x1E, 0x04, 0x44, 0xAE, + 0x00, 0x48, 0x8E, 0xB3, 0xFB, 0xAC, 0x71, 0x9A, 0xC1, 0x59, 0x49, 0x54, + 0x84, 0xFB, 0x44, 0x48, 0x07, 0x7C, 0x54, 0x09, 0x64, 0xAF, 0x4F, 0x38, + 0xA1, 0x63, 0x16, 0xFE, 0x06, 0x02, 0xB9, 0x80, 0xFB, 0x28, 0xCC, 0x1B, + 0x2E, 0x9A, 0xA4, 0x91, 0xAD, 0x44, 0xC6, 0xD9, 0xC6, 0x5C, 0x2E, 0x22, + 0xC0, 0x01, 0x1F, 0xE8, 0x36, 0x23, 0x40, 0x02, 0x7B, 0x2E, 0x42, 0x23, + 0xC0, 0x00, 0x2C, 0xB4, 0x72, 0x88, 0xDE, 0x57, 0x11, 0x78, 0x82, 0x35, + 0xD4, 0x02, 0x29, 0xB8, 0xC2, 0xB6, 0x90, 0x86, 0x0E, 0xE8, 0x1D, 0x1D, + 0xC5, 0xC2, 0x2A, 0x24, 0x4B, 0xA1, 0xCA, 0x43, 0x3F, 0x58, 0x83, 0xA8, + 0x14, 0x01, 0x2C, 0x70, 0x03, 0x37, 0x74, 0x83, 0x35, 0x54, 0xF5, 0x34, + 0xF8, 0x20, 0x34, 0xAC, 0x42, 0x2C, 0x28, 0x03, 0x32, 0x68, 0x83, 0x9A, + 0xAF, 0x3B, 0xDC, 0x93, 0x07, 0x29, 0xCC, 0xC0, 0x1C, 0x0D, 0xC1, 0x1C, + 0xCC, 0xC0, 0x0C, 0x4C, 0x40, 0x00, 0x18, 0xA3, 0x00, 0x7C, 0xE9, 0xBD, + 0x15, 0xC5, 0x08, 0x18, 0xE2, 0x46, 0x05, 0xEC, 0x61, 0xBD, 0x48, 0xCE, + 0xB8, 0x0C, 0x8C, 0xE8, 0x4C, 0x1B, 0xB8, 0xB6, 0x1E, 0x7C, 0x90, 0xE5, + 0xAA, 0x7A, 0x6E, 0xC5, 0x0F, 0x03, 0x78, 0x80, 0x18, 0xE8, 0xC1, 0xBF, + 0x55, 0x0C, 0x9C, 0x91, 0x09, 0xF2, 0xB5, 0x88, 0xBC, 0xA6, 0x0C, 0x06, + 0x9D, 0xA6, 0x8E, 0xB4, 0x00, 0x42, 0x90, 0xC4, 0xE8, 0x83, 0x8D, 0x4D, + 0x8C, 0x84, 0x83, 0x93, 0xC4, 0x44, 0x74, 0x45, 0x41, 0xF0, 0x0F, 0xD8, + 0x80, 0x45, 0x4A, 0xD8, 0xC8, 0x83, 0xA0, 0x40, 0xFC, 0xB0, 0x38, 0x08, + 0x25, 0x6B, 0x09, 0xAC, 0xC0, 0x3B, 0x76, 0x80, 0x08, 0x44, 0x6D, 0xCA, + 0xA7, 0xC0, 0x18, 0xE4, 0x81, 0x1D, 0xD8, 0x41, 0x44, 0xD5, 0x2B, 0x22, + 0x10, 0x57, 0x9A, 0x75, 0xB8, 0x18, 0x20, 0x25, 0x8F, 0xDF, 0x41, 0x6F, + 0x03, 0xFB, 0x90, 0xC7, 0x41, 0x91, 0x37, 0xB1, 0xAB, 0x32, 0x4E, 0x50, + 0x7B, 0x03, 0x2D, 0xB8, 0xC2, 0x2C, 0xFE, 0xD4, 0xC2, 0x2B, 0x14, 0x9E, + 0xA8, 0x10, 0x01, 0x50, 0xCF, 0xC2, 0x29, 0x04, 0x81, 0x15, 0x30, 0x9E, + 0xD2, 0x77, 0x0A, 0x37, 0xFC, 0x42, 0x89, 0xFD, 0xC3, 0x57, 0x32, 0x5B, + 0x0F, 0x4C, 0xFB, 0x27, 0xD8, 0xC2, 0xF2, 0x00, 0xAF, 0xBC, 0x44, 0x33, + 0x2B, 0x28, 0x71, 0x34, 0x84, 0x02, 0xCA, 0xC6, 0x3D, 0x9B, 0x4B, 0x06, + 0x7A, 0x0F, 0x01, 0x40, 0xE8, 0xD0, 0x91, 0xC3, 0x47, 0xC1, 0x82, 0x26, + 0x7C, 0x44, 0x90, 0x30, 0x20, 0x41, 0x82, 0x01, 0x0A, 0x16, 0x38, 0x68, + 0xE8, 0x80, 0xE1, 0x00, 0x0E, 0x0B, 0x52, 0xA4, 0x10, 0x23, 0x06, 0x4F, + 0x19, 0x17, 0x6A, 0xCE, 0xA8, 0x19, 0x53, 0x46, 0x0D, 0x9A, 0x32, 0x29, + 0x46, 0x90, 0x58, 0x81, 0x62, 0xC4, 0x82, 0x0E, 0x17, 0xC3, 0x94, 0xC1, + 0xD3, 0x11, 0x8D, 0x9B, 0x3A, 0x78, 0xD4, 0xA8, 0x29, 0x53, 0xC7, 0xCD, + 0x99, 0x36, 0x6D, 0xDC, 0xE0, 0xA9, 0x23, 0xA8, 0x4E, 0x4E, 0x33, 0x78, + 0x6C, 0x9A, 0xF1, 0xD9, 0x46, 0x8D, 0x19, 0x9D, 0x46, 0xC5, 0xB8, 0xB9, + 0x54, 0xE6, 0xCC, 0x99, 0x30, 0x63, 0x2E, 0x9D, 0x71, 0x2A, 0x46, 0xE4, + 0x99, 0x3A, 0x65, 0xCC, 0x84, 0x39, 0x01, 0x42, 0x85, 0x8B, 0x15, 0x24, + 0x54, 0x64, 0x7C, 0xE1, 0x62, 0xC4, 0x89, 0x13, 0x2A, 0x4E, 0xA0, 0x38, + 0x21, 0xE6, 0xC5, 0x8A, 0x13, 0x25, 0x5C, 0x94, 0x50, 0xB1, 0x06, 0xE7, + 0x19, 0x3C, 0x67, 0x0E, 0x45, 0x2A, 0xA4, 0xC7, 0x4D, 0x9B, 0x30, 0x66, + 0xCC, 0xAC, 0x38, 0xF3, 0x86, 0x31, 0x9F, 0x49, 0x6F, 0xEE, 0x30, 0x5A, + 0xC4, 0xA8, 0xD1, 0xA2, 0x3B, 0x6C, 0x4C, 0xD4, 0xD2, 0xB7, 0x4F, 0x5F, + 0x67, 0xCF, 0x9F, 0x41, 0x87, 0x16, 0x3D, 0x9A, 0x74, 0xE9, 0xD0, 0xFC, + 0xDE, 0x09, 0x19, 0xC5, 0x8D, 0x1A, 0x2D, 0x5D, 0xD0, 0xFE, 0xA0, 0xB9, + 0x3A, 0xB5, 0x83, 0x48, 0x10, 0x22, 0x42, 0x5A, 0xC1, 0xCA, 0x41, 0xC4, + 0x74, 0x6F, 0xD2, 0x9C, 0x41, 0xEF, 0x7B, 0xC7, 0x4D, 0x97, 0x2B, 0x4F, + 0x9E, 0x88, 0x78, 0x3A, 0x15, 0x6B, 0x19, 0xB4, 0x59, 0xBA, 0x60, 0x9D, + 0x1A, 0x55, 0x64, 0x48, 0x8E, 0x1B, 0x98, 0xA6, 0x41, 0xA3, 0x35, 0xCB, + 0x15, 0xAA, 0x55, 0xD1, 0x98, 0x87, 0xA2, 0xE5, 0x9B, 0x7C, 0x79, 0xF3, + 0xE7, 0xD1, 0xA7, 0x57, 0x5F, 0x9E, 0xF3, 0xAF, 0x08, 0x45, 0x82, 0x58, + 0xB7, 0xE1, 0x63, 0x86, 0x0E, 0x3A, 0x43, 0x80, 0xF8, 0xD0, 0x11, 0x61, + 0x42, 0xC3, 0x04, 0x0B, 0x20, 0x6A, 0x40, 0x01, 0x05, 0x2A, 0x72, 0x60, + 0x01, 0x06, 0x3A, 0x28, 0xA3, 0x05, 0x17, 0xD0, 0x38, 0x63, 0x84, 0x16, + 0x5A, 0x40, 0x23, 0x0C, 0x34, 0xC4, 0x38, 0x81, 0x84, 0x0B, 0x47, 0xF0, + 0x60, 0x81, 0x01, 0x42, 0x70, 0xC9, 0xAD, 0x30, 0xD2, 0xC8, 0xA9, 0x0C, + 0x92, 0x6E, 0x42, 0xCA, 0x8D, 0x31, 0xC2, 0x70, 0x43, 0x0F, 0x3C, 0x04, + 0x21, 0x84, 0x10, 0x37, 0xD4, 0x08, 0x8A, 0x90, 0x43, 0x66, 0x02, 0x4A, + 0x10, 0x3D, 0xD4, 0xB8, 0x84, 0xA7, 0x90, 0xCE, 0x10, 0x83, 0x24, 0x33, + 0xC4, 0xF0, 0xAB, 0x0E, 0x33, 0xDC, 0x70, 0x0A, 0xA8, 0x33, 0xC6, 0xC8, + 0xA9, 0x85, 0x0E, 0x50, 0xB8, 0xC4, 0x05, 0x96, 0x54, 0x18, 0xE1, 0x85, + 0x30, 0x54, 0xE8, 0x40, 0x84, 0xB4, 0x46, 0x70, 0x01, 0xA5, 0x2C, 0x51, + 0x8A, 0xE9, 0xA7, 0xAA, 0xEA, 0x10, 0x0C, 0x11, 0x42, 0xDA, 0xE8, 0x48, + 0x0F, 0x33, 0xD2, 0x18, 0x03, 0x0D, 0x34, 0xDE, 0x50, 0x64, 0x92, 0x3B, + 0xF8, 0x68, 0x44, 0x11, 0x3F, 0x20, 0xF1, 0xC3, 0x8F, 0x3E, 0x4A, 0xD0, + 0x6C, 0xBD, 0x3D, 0xD3, 0x93, 0xE7, 0x9D, 0x1D, 0x54, 0xE1, 0x66, 0x1B, + 0xFE, 0x69, 0x60, 0xA3, 0x85, 0x16, 0x51, 0x84, 0x20, 0x62, 0x0E, 0xDB, + 0x6A, 0x91, 0xC6, 0x93, 0x22, 0xF8, 0xFC, 0x2C, 0x9F, 0xD0, 0xF0, 0x51, + 0xA7, 0x1A, 0x5A, 0x4A, 0x19, 0x85, 0x88, 0x51, 0x46, 0x81, 0x85, 0x96, + 0x6A, 0xBA, 0xE9, 0x66, 0x9D, 0x6D, 0x62, 0x79, 0x2D, 0x36, 0x51, 0x9A, + 0x10, 0xC2, 0x88, 0x1C, 0x2A, 0xF0, 0xC4, 0x39, 0x68, 0x96, 0x41, 0x45, + 0x56, 0x68, 0x64, 0x49, 0x66, 0x95, 0x5F, 0x22, 0xCD, 0x55, 0xD7, 0x5D, + 0x79, 0x45, 0x2F, 0x9F, 0x6A, 0xEA, 0x8B, 0xCF, 0xBA, 0x0A, 0x74, 0xA8, + 0x2F, 0x87, 0x21, 0x7C, 0xC8, 0xEF, 0x86, 0x08, 0x1E, 0x90, 0xA0, 0x01, + 0x06, 0x18, 0x70, 0x40, 0x01, 0x0F, 0x9E, 0x45, 0x70, 0x81, 0x06, 0x38, + 0xF0, 0x80, 0x84, 0x11, 0x46, 0x10, 0x83, 0x84, 0x98, 0x52, 0xE8, 0x20, + 0x85, 0x16, 0x4E, 0x48, 0x81, 0x04, 0x19, 0x48, 0x08, 0xE1, 0x22, 0x0E, + 0x14, 0x30, 0xD0, 0x03, 0x06, 0x54, 0x1A, 0x31, 0x27, 0x42, 0x06, 0xD1, + 0x83, 0x10, 0x3C, 0xDA, 0x38, 0x43, 0x0F, 0xC2, 0x06, 0x19, 0x64, 0x26, + 0x37, 0x46, 0x24, 0x4C, 0x8F, 0x1B, 0x59, 0x7C, 0x71, 0x27, 0x7A, 0x61, + 0x0C, 0xAA, 0x8C, 0x31, 0xD4, 0x64, 0x2A, 0xC9, 0xC2, 0xCE, 0x48, 0x13, + 0x45, 0x15, 0xC4, 0xB0, 0x8B, 0x84, 0x14, 0xC2, 0x78, 0x81, 0xDB, 0x12, + 0x4E, 0xC8, 0xF8, 0xAD, 0x12, 0x50, 0x2A, 0x61, 0x84, 0x15, 0xC6, 0x40, + 0x0C, 0xB1, 0x3A, 0xBC, 0x2A, 0xA4, 0x10, 0x44, 0x06, 0x39, 0xC4, 0x45, + 0x3D, 0xB4, 0x6A, 0x43, 0x29, 0xC6, 0x20, 0x63, 0x84, 0x8F, 0x3B, 0xEE, + 0x98, 0xCC, 0xCE, 0x3E, 0x1A, 0x11, 0x41, 0x33, 0xE0, 0x7A, 0x0D, 0x1A, + 0x1F, 0x7A, 0x82, 0x70, 0x25, 0x1B, 0x6B, 0xA8, 0xA9, 0x46, 0x1A, 0x69, + 0x92, 0x39, 0x85, 0xFE, 0x88, 0x22, 0x3C, 0xC9, 0x01, 0x08, 0x58, 0x56, + 0x41, 0x6E, 0x4F, 0xA0, 0x3D, 0xE3, 0xE7, 0x1A, 0x4C, 0x8F, 0xB3, 0x62, + 0x14, 0x55, 0x1A, 0x95, 0x86, 0x1A, 0x6B, 0xB6, 0xC9, 0x26, 0x1B, 0x6D, + 0xA6, 0xD1, 0x25, 0x96, 0x53, 0x4E, 0x09, 0x05, 0x39, 0x23, 0x82, 0x80, + 0x1B, 0x13, 0x1D, 0x88, 0xA0, 0x95, 0x56, 0x59, 0x42, 0x59, 0x65, 0x19, + 0x59, 0x90, 0x09, 0x05, 0xD7, 0xA0, 0x01, 0x0F, 0x5C, 0xF0, 0x3D, 0xBD, + 0x11, 0x22, 0x07, 0x4C, 0x82, 0x18, 0x62, 0x88, 0x62, 0xEB, 0x13, 0xC8, + 0x87, 0x21, 0xEE, 0x43, 0xD6, 0x07, 0x1B, 0x26, 0x10, 0xE1, 0x25, 0x03, + 0x1B, 0x70, 0x00, 0xC1, 0x0E, 0x9E, 0xE5, 0x40, 0x84, 0x11, 0xC2, 0x40, + 0xA1, 0x05, 0x9C, 0x52, 0x38, 0xC1, 0xAE, 0x16, 0x56, 0x30, 0x97, 0x83, + 0xD5, 0x43, 0xE8, 0xE0, 0x83, 0x0E, 0x4E, 0x70, 0xC0, 0x81, 0x10, 0x4E, + 0xF0, 0x40, 0xB1, 0x30, 0xA2, 0xB2, 0x69, 0x60, 0x17, 0x55, 0x1C, 0x58, + 0x10, 0x41, 0x80, 0x04, 0xA9, 0xF7, 0x12, 0xDD, 0x08, 0x8A, 0xB0, 0xAA, + 0x7C, 0x1A, 0xC3, 0x47, 0x33, 0xDA, 0x28, 0xA3, 0x8D, 0x37, 0xD2, 0x58, + 0xE3, 0x8C, 0x8C, 0xC2, 0x48, 0x41, 0x05, 0x95, 0xCE, 0x4A, 0x01, 0x85, + 0xD4, 0x4B, 0x40, 0x01, 0x84, 0x0E, 0xC2, 0x80, 0x81, 0x04, 0x10, 0xDC, + 0x7A, 0x8B, 0x8C, 0x31, 0x7E, 0x6A, 0x63, 0x47, 0x3D, 0xC6, 0x24, 0x64, + 0x5F, 0x1A, 0x61, 0x06, 0x72, 0x4D, 0x38, 0xD0, 0x80, 0x43, 0x11, 0x3E, + 0xFA, 0xE8, 0xC3, 0x0F, 0xC9, 0x16, 0xF1, 0xE3, 0x0E, 0x3F, 0x44, 0x60, + 0x8B, 0xC1, 0xF5, 0x6A, 0x1F, 0xE0, 0xC8, 0x41, 0x2D, 0xAA, 0xB1, 0x0D, + 0x7F, 0x4C, 0x83, 0x1A, 0xFE, 0x98, 0x85, 0x28, 0x30, 0x51, 0x04, 0x22, + 0xEC, 0x60, 0x07, 0xA2, 0xF8, 0x84, 0xFE, 0x27, 0x9A, 0x30, 0x29, 0xDF, + 0x60, 0xCD, 0x33, 0xC2, 0xF1, 0x06, 0x2D, 0x4E, 0x81, 0xB8, 0x20, 0xFC, + 0x43, 0x14, 0xAE, 0x48, 0x60, 0xD9, 0xAA, 0x91, 0x8D, 0x6A, 0x40, 0x83, + 0x1A, 0xCE, 0x79, 0xE0, 0x71, 0xE6, 0xA0, 0xA8, 0x21, 0x14, 0x61, 0x0E, + 0xC7, 0xC1, 0x44, 0x28, 0x46, 0x61, 0x04, 0x4C, 0xE8, 0x62, 0x19, 0xD1, + 0x58, 0x46, 0x2C, 0x42, 0x81, 0x8A, 0x68, 0x20, 0x03, 0x19, 0xA7, 0xA8, + 0xC6, 0x00, 0x91, 0x98, 0x44, 0x25, 0x7A, 0x06, 0x1F, 0xB5, 0xD8, 0x81, + 0x0F, 0xA8, 0x83, 0x09, 0x4C, 0x34, 0x01, 0x3F, 0x3E, 0x20, 0x48, 0xB2, + 0x1E, 0x37, 0x87, 0x21, 0x60, 0x02, 0x08, 0x34, 0xA0, 0x0F, 0x7F, 0x26, + 0x00, 0x91, 0x28, 0x71, 0x80, 0x01, 0x1E, 0x18, 0x41, 0x07, 0x46, 0xC0, + 0x81, 0x0E, 0x5C, 0x2C, 0x0C, 0xD5, 0x2B, 0xDD, 0x08, 0xAE, 0x77, 0xBD, + 0x32, 0x2A, 0x00, 0x04, 0xDC, 0xE2, 0x80, 0x03, 0xB0, 0xD5, 0x81, 0x0E, + 0xB0, 0xA0, 0x8D, 0x88, 0x41, 0x92, 0x19, 0x06, 0x76, 0x88, 0x43, 0x20, + 0x82, 0x90, 0xED, 0x1B, 0x98, 0x1A, 0x04, 0x31, 0x88, 0xE2, 0xCD, 0xC4, + 0x7D, 0x78, 0x20, 0x4C, 0x8C, 0xE0, 0xA0, 0x87, 0x3C, 0xE4, 0x01, 0x0E, + 0x6D, 0x40, 0xC3, 0xF3, 0x5A, 0xA0, 0x02, 0xDC, 0xAD, 0x60, 0x05, 0x0F, + 0xAA, 0x5E, 0x1A, 0x39, 0x50, 0x3A, 0xB8, 0x88, 0x60, 0x75, 0x1C, 0xB8, + 0x98, 0x1E, 0x49, 0x50, 0x82, 0x17, 0x8C, 0x41, 0x7A, 0x6A, 0xA8, 0xC3, + 0x1E, 0x04, 0x51, 0x3C, 0x41, 0xEA, 0x01, 0x0E, 0x82, 0xF8, 0x0B, 0x21, + 0xCA, 0x90, 0x06, 0x9F, 0x94, 0x84, 0x4D, 0x8B, 0x58, 0x04, 0x1F, 0xFC, + 0x80, 0xBF, 0xFE, 0xDD, 0xA1, 0x11, 0x7F, 0x28, 0x01, 0x2B, 0x36, 0xD3, + 0xC1, 0xCD, 0x70, 0x70, 0x89, 0xA5, 0xD9, 0x47, 0x3F, 0xFE, 0x76, 0xE0, + 0x8A, 0x6B, 0x34, 0x30, 0x69, 0xD3, 0xF0, 0x87, 0x2A, 0x34, 0x65, 0x04, + 0x23, 0x78, 0xA2, 0x16, 0xA1, 0xD8, 0x94, 0x69, 0x98, 0xB9, 0x0F, 0x78, + 0x48, 0x83, 0x14, 0xC8, 0x09, 0x42, 0x10, 0xA0, 0xE6, 0x0A, 0x58, 0x68, + 0x03, 0x69, 0x65, 0x23, 0xDB, 0x0A, 0x75, 0x21, 0x0B, 0xAA, 0x7D, 0x62, + 0x14, 0x98, 0xB0, 0x61, 0x0D, 0x43, 0xF1, 0x89, 0x7C, 0x7E, 0xE2, 0x82, + 0x98, 0xF8, 0xC4, 0x10, 0x88, 0xB0, 0x8C, 0xE6, 0xC8, 0x42, 0x16, 0xAC, + 0x60, 0x45, 0x34, 0x64, 0x11, 0x0B, 0x54, 0x8C, 0xA7, 0x99, 0x0D, 0x75, + 0xA8, 0xAE, 0xAE, 0x21, 0x04, 0x1C, 0xEC, 0x60, 0x8B, 0x52, 0xC4, 0xC4, + 0x16, 0x15, 0x07, 0x04, 0x20, 0xDC, 0x87, 0x0E, 0x73, 0x08, 0x04, 0x1D, + 0x30, 0x41, 0x87, 0xFB, 0xCC, 0x20, 0x02, 0x06, 0x50, 0xC0, 0x04, 0x0C, + 0x70, 0x2D, 0x11, 0x40, 0xAB, 0x01, 0x1D, 0x50, 0x40, 0x4B, 0xB9, 0xF5, + 0xBA, 0xB7, 0x64, 0xC4, 0x8E, 0x67, 0xE4, 0xC0, 0x08, 0x1A, 0x10, 0x82, + 0x0F, 0x2C, 0x60, 0x01, 0x1E, 0x68, 0xDD, 0x4D, 0x65, 0x70, 0x02, 0x08, + 0x5D, 0x22, 0x44, 0x28, 0x2B, 0xD3, 0x5F, 0x60, 0xF4, 0x02, 0xC4, 0x5C, + 0x02, 0x31, 0x1B, 0xC9, 0x49, 0x1B, 0xD3, 0x40, 0x86, 0x32, 0xB9, 0x41, + 0x0C, 0x44, 0x72, 0x43, 0x0B, 0x52, 0x10, 0xBD, 0x35, 0xB0, 0xA0, 0x5C, + 0xAB, 0x84, 0x50, 0x0A, 0x56, 0x00, 0x02, 0x07, 0x98, 0xB2, 0x03, 0x20, + 0x58, 0x5D, 0x07, 0x16, 0x40, 0x02, 0x17, 0xB4, 0x00, 0x04, 0xDF, 0xD3, + 0xE4, 0x1B, 0xE0, 0x80, 0x98, 0x32, 0xE4, 0x01, 0x27, 0x2D, 0xBA, 0x97, + 0xBD, 0xF4, 0x30, 0x18, 0xB0, 0xA8, 0xA9, 0x24, 0x8C, 0xE9, 0x83, 0x2F, + 0x7D, 0x89, 0xB3, 0x3B, 0xFC, 0xC1, 0x0F, 0x7F, 0x10, 0x01, 0x32, 0x1F, + 0xFE, 0x9A, 0x1E, 0x7E, 0x80, 0x23, 0x08, 0xB5, 0xA0, 0x86, 0x02, 0xA9, + 0x31, 0x0D, 0x6B, 0x8A, 0x62, 0x14, 0x41, 0x10, 0x02, 0x10, 0x42, 0x01, + 0x8D, 0xE3, 0x8C, 0x22, 0x34, 0xCC, 0xD4, 0x07, 0x3C, 0x7E, 0xA1, 0x0A, + 0x4C, 0x08, 0x41, 0x08, 0xB6, 0x11, 0x45, 0x2D, 0x68, 0x41, 0x8D, 0x64, + 0x54, 0xE3, 0x17, 0xD3, 0xC8, 0x06, 0x34, 0x56, 0xC8, 0x1D, 0xB6, 0xB1, + 0xE2, 0x14, 0xA2, 0xB0, 0x85, 0xDB, 0x14, 0x35, 0x87, 0x1A, 0x7A, 0x02, + 0x15, 0xF9, 0x94, 0x15, 0x28, 0xF4, 0x79, 0xC3, 0x20, 0x78, 0x22, 0x19, + 0xC8, 0x80, 0xC6, 0x2A, 0x58, 0x91, 0x0A, 0x82, 0xC6, 0x42, 0x16, 0xA8, + 0xF8, 0x5B, 0x62, 0xA1, 0x1B, 0x5D, 0xF2, 0xE0, 0x42, 0x08, 0x14, 0xA5, + 0x22, 0x26, 0x5A, 0xA1, 0x8A, 0xDE, 0x62, 0x02, 0x14, 0x45, 0x48, 0x56, + 0xE2, 0x30, 0x31, 0x07, 0x3A, 0x10, 0x41, 0x8A, 0xE2, 0xD5, 0xCF, 0x0C, + 0x66, 0x20, 0x81, 0x07, 0x18, 0x20, 0x8C, 0x0A, 0x20, 0xE3, 0x81, 0x3A, + 0xA0, 0x53, 0x10, 0xB0, 0x20, 0xA8, 0x17, 0x7A, 0xC9, 0x4D, 0x77, 0x1A, + 0x11, 0xCD, 0xF1, 0x34, 0x22, 0xED, 0x1A, 0x80, 0xEC, 0xCA, 0xA8, 0xA1, + 0x0F, 0x90, 0x91, 0x01, 0xCF, 0x9A, 0x00, 0x01, 0x1A, 0xF0, 0xB9, 0x12, + 0xAC, 0x34, 0xC1, 0x12, 0x10, 0x81, 0x08, 0x1C, 0xCC, 0x80, 0x3A, 0x5E, + 0x88, 0x03, 0x2D, 0x25, 0xE3, 0x1A, 0xCB, 0x42, 0x82, 0xF8, 0xA6, 0x8B, + 0x73, 0x2C, 0x25, 0x63, 0xE7, 0xAE, 0xD7, 0x01, 0x2D, 0xB1, 0xA0, 0x04, + 0x68, 0x39, 0xC1, 0xC2, 0xD6, 0x60, 0x07, 0x9E, 0x0C, 0x09, 0x0F, 0x87, + 0xF8, 0xDD, 0xBE, 0x08, 0x11, 0x09, 0x5B, 0x1E, 0xC5, 0x29, 0x7A, 0x60, + 0x13, 0x64, 0x7C, 0x29, 0x19, 0x3B, 0x11, 0xF6, 0x0E, 0x72, 0x38, 0x6C, + 0x32, 0x3B, 0xA3, 0xFE, 0x41, 0xE9, 0x8E, 0x06, 0x1E, 0xDC, 0x68, 0xEC, + 0xD8, 0xA4, 0x31, 0x0D, 0xA5, 0x25, 0x63, 0x14, 0xA2, 0x80, 0x0F, 0x0E, + 0x42, 0x01, 0x0B, 0xA8, 0x79, 0x02, 0xC8, 0x9E, 0xC9, 0x07, 0x3F, 0xFA, + 0x51, 0x0D, 0x55, 0x34, 0x81, 0x3A, 0x41, 0x68, 0x82, 0x28, 0x5A, 0xE1, + 0x8F, 0x14, 0x26, 0x2D, 0x1B, 0xC9, 0xA0, 0x45, 0x76, 0x68, 0x21, 0x1B, + 0x7A, 0xBA, 0x8D, 0x53, 0xA7, 0xF8, 0x04, 0x28, 0x90, 0x93, 0x9C, 0x50, + 0xE4, 0xAD, 0x15, 0xAD, 0x90, 0xD5, 0x2A, 0x50, 0x21, 0x8A, 0x55, 0xAC, + 0x42, 0x9F, 0xA1, 0x18, 0x82, 0x27, 0xF6, 0x16, 0x0B, 0xE4, 0xDE, 0x36, + 0x16, 0xCC, 0x39, 0x85, 0x34, 0x86, 0x9C, 0x68, 0x45, 0x7B, 0xE6, 0x1D, + 0xB4, 0x18, 0xC5, 0x0E, 0x68, 0x70, 0x83, 0x0A, 0x1C, 0x2E, 0x14, 0xAC, + 0xC8, 0x6E, 0x2C, 0x52, 0x61, 0xD1, 0x21, 0x68, 0x11, 0x3F, 0x74, 0x08, + 0x84, 0x6E, 0x41, 0x11, 0x08, 0x4C, 0x64, 0x5A, 0x71, 0xC5, 0x82, 0xC0, + 0x03, 0x1E, 0x80, 0xD2, 0x93, 0x4E, 0x80, 0x03, 0x12, 0xE0, 0xC0, 0x04, + 0x18, 0x00, 0x6B, 0x00, 0x61, 0x4B, 0x01, 0x0C, 0x30, 0x01, 0x84, 0x39, + 0x60, 0x02, 0x13, 0x48, 0x40, 0x02, 0x13, 0xA8, 0x5C, 0xAF, 0x27, 0x20, + 0x01, 0x0B, 0xE8, 0x5A, 0x02, 0x11, 0xF8, 0x81, 0x0D, 0xBC, 0xA8, 0x03, + 0x5D, 0xD7, 0xA7, 0x3E, 0x3F, 0xC8, 0x81, 0x0E, 0x6E, 0xA0, 0x03, 0xFA, + 0x38, 0x04, 0xBE, 0xEF, 0x82, 0xD6, 0xB5, 0xD5, 0xC5, 0x00, 0x9E, 0xD6, + 0xFA, 0x40, 0x08, 0x72, 0x41, 0x59, 0x05, 0x74, 0x56, 0x16, 0xA0, 0x20, + 0x4A, 0x2A, 0x71, 0x41, 0x1B, 0x53, 0xF4, 0xA5, 0x32, 0x09, 0x42, 0x65, + 0xB6, 0x8C, 0x04, 0x22, 0x68, 0xA9, 0x06, 0x1C, 0x89, 0x24, 0x0D, 0x90, + 0x79, 0x43, 0x30, 0x19, 0xE1, 0x87, 0xFE, 0x46, 0xF8, 0xEF, 0x0F, 0x7F, + 0x88, 0x43, 0x03, 0x04, 0xE8, 0xD9, 0x45, 0x7B, 0x06, 0x1C, 0xE0, 0x28, + 0x82, 0x63, 0xB9, 0x21, 0x0D, 0x31, 0xFB, 0x83, 0x16, 0x9E, 0x80, 0xA0, + 0xD4, 0x5C, 0xE1, 0x44, 0x22, 0x88, 0x22, 0x6B, 0xD7, 0xA8, 0x05, 0x97, + 0xCF, 0xA9, 0x28, 0x51, 0xC0, 0x42, 0xCC, 0xD6, 0xD4, 0x46, 0x64, 0xA7, + 0xB1, 0x1D, 0x58, 0xA8, 0x42, 0x14, 0x25, 0x6F, 0x72, 0xDB, 0x44, 0x31, + 0xE7, 0x51, 0x78, 0x62, 0x9F, 0xB6, 0x60, 0x85, 0xA0, 0xF3, 0xC6, 0x8A, + 0x3D, 0xAF, 0x02, 0x19, 0xB0, 0x60, 0x45, 0xA5, 0xE7, 0x9C, 0xCF, 0x20, + 0xCC, 0xA1, 0xA0, 0xDE, 0x29, 0x74, 0x28, 0x98, 0xB3, 0x8C, 0x55, 0x50, + 0x63, 0xE0, 0x45, 0x0F, 0x9C, 0xC0, 0x41, 0x03, 0x0F, 0x57, 0xE0, 0x40, + 0x02, 0x33, 0xC8, 0x41, 0x04, 0x2A, 0xE0, 0x03, 0x50, 0xA0, 0xC2, 0xA0, + 0xAA, 0x28, 0x74, 0xA6, 0xB9, 0xAB, 0xB8, 0x21, 0x04, 0xA1, 0x20, 0x43, + 0x00, 0x05, 0x28, 0x3A, 0x3A, 0xEA, 0x90, 0x2A, 0x6E, 0xBC, 0x5B, 0xD7, + 0x28, 0xAB, 0x74, 0x00, 0x04, 0x1C, 0xE4, 0x20, 0x08, 0x17, 0x2D, 0x02, + 0x17, 0x41, 0xC1, 0x5D, 0x50, 0x00, 0x61, 0x71, 0xE9, 0x8D, 0x00, 0xD4, + 0xE7, 0x43, 0x90, 0x1F, 0x18, 0xA4, 0x20, 0x3A, 0xF8, 0x81, 0x40, 0x9E, + 0x0D, 0xED, 0xBF, 0x5F, 0xF1, 0xEF, 0x35, 0x98, 0x41, 0x43, 0x06, 0xC0, + 0x90, 0x01, 0x11, 0x28, 0x01, 0x0C, 0xF8, 0x8F, 0xB6, 0x35, 0x64, 0xA0, + 0x76, 0xB9, 0x97, 0xC0, 0x02, 0xC2, 0x29, 0x08, 0x4C, 0x9C, 0xA5, 0x31, + 0xAC, 0x72, 0x0D, 0x2D, 0x58, 0x03, 0x53, 0x7E, 0x82, 0x06, 0x7B, 0xDD, + 0x48, 0x10, 0x63, 0xBA, 0x91, 0x1A, 0xDC, 0x07, 0x87, 0x15, 0xA4, 0x81, + 0x0D, 0x82, 0x5D, 0xC4, 0x23, 0x88, 0xE9, 0x88, 0x38, 0xFE, 0xC4, 0xE1, + 0x0F, 0x6C, 0x10, 0x81, 0x2C, 0x8C, 0x4E, 0x1A, 0x6F, 0x14, 0x8E, 0x16, + 0xAC, 0x91, 0x46, 0x36, 0xFC, 0x41, 0x0D, 0x51, 0x4C, 0x9C, 0x08, 0x40, + 0x20, 0x42, 0xD3, 0x62, 0x78, 0xF0, 0x47, 0xD1, 0x9D, 0x08, 0xA8, 0x98, + 0x85, 0x34, 0x12, 0x48, 0x0D, 0x15, 0x26, 0x63, 0x1A, 0xB8, 0x98, 0x46, + 0x32, 0x60, 0x01, 0x0B, 0xCA, 0x8E, 0x82, 0x6D, 0x24, 0xD7, 0xB3, 0x2A, + 0x56, 0xA1, 0xE7, 0x50, 0xB8, 0x02, 0xB9, 0xEA, 0x8C, 0x85, 0x41, 0x63, + 0x61, 0x73, 0x56, 0x88, 0xC2, 0xD2, 0xB2, 0x32, 0x68, 0x6F, 0x4F, 0xD1, + 0xDB, 0x50, 0x68, 0xB3, 0xD2, 0x06, 0x95, 0x85, 0x3E, 0x5F, 0x8E, 0x37, + 0xA2, 0xE7, 0x9E, 0xFF, 0xCD, 0xA4, 0x86, 0x46, 0xF7, 0x83, 0x3E, 0x26, + 0x60, 0x06, 0x7C, 0x60, 0xD4, 0x80, 0xAE, 0xD0, 0x6E, 0x08, 0x15, 0xC2, + 0xCB, 0xA2, 0xB8, 0x8B, 0x01, 0x41, 0xCA, 0xA2, 0x52, 0xE1, 0xEB, 0xE6, + 0x2C, 0xEE, 0xB8, 0xA8, 0xED, 0x30, 0x41, 0x15, 0xF6, 0x69, 0x01, 0xE5, + 0x0E, 0x3E, 0xF4, 0xC3, 0x04, 0x66, 0xE0, 0x06, 0xA2, 0xED, 0x06, 0xD0, + 0x6B, 0xD7, 0xEA, 0x83, 0x3E, 0x6C, 0x80, 0xD9, 0x6C, 0xE0, 0xEF, 0xFC, + 0xAE, 0x20, 0x9E, 0xED, 0xBC, 0xD6, 0xEB, 0x3F, 0x2A, 0x22, 0x00, 0x06, + 0x20, 0x00, 0x64, 0xD0, 0x21, 0x00, 0x80, 0x21, 0xF0, 0x28, 0xF1, 0x12, + 0x80, 0x22, 0x30, 0xEF, 0x8C, 0x16, 0xE0, 0xA6, 0xA0, 0xA5, 0x04, 0x38, + 0x40, 0x05, 0xCA, 0x82, 0x0C, 0x5E, 0xE0, 0x0D, 0x70, 0x07, 0x31, 0x6A, + 0xE2, 0x27, 0xF6, 0xA5, 0x5F, 0xF0, 0x00, 0x11, 0x0A, 0xC1, 0x91, 0xDC, + 0x80, 0x10, 0x10, 0x69, 0x4D, 0x60, 0x00, 0x67, 0xEC, 0xA4, 0x98, 0x1A, + 0xE1, 0x11, 0xFA, 0xAD, 0xDF, 0x00, 0x0E, 0xC8, 0xF6, 0x41, 0xC8, 0x8A, + 0xFE, 0x2E, 0x1F, 0xDE, 0xE1, 0x1A, 0x88, 0x20, 0xF8, 0x80, 0x2F, 0xB2, + 0xFC, 0xC1, 0x13, 0x30, 0xC1, 0x15, 0xD0, 0x29, 0x14, 0x6A, 0x0B, 0x51, + 0x70, 0x80, 0x08, 0xA2, 0x0C, 0x1A, 0xB6, 0xE1, 0x0E, 0xB3, 0x41, 0xFA, + 0xAC, 0x29, 0x1B, 0x90, 0xA1, 0x16, 0x60, 0xA1, 0x15, 0xB6, 0xEF, 0x6B, + 0xBA, 0xC9, 0x15, 0x4A, 0x21, 0x14, 0xC0, 0xCC, 0x15, 0x54, 0xC1, 0x15, + 0xF8, 0x46, 0x9E, 0x96, 0xEB, 0xFC, 0x98, 0x4B, 0xE6, 0x62, 0x01, 0x19, + 0x14, 0xAA, 0xB7, 0x50, 0xA1, 0x6D, 0x58, 0x41, 0x56, 0xE2, 0x6F, 0x15, + 0x8C, 0xE0, 0x1F, 0xE6, 0x40, 0x9F, 0x50, 0x01, 0x19, 0xBC, 0xE3, 0xE5, + 0x62, 0xE1, 0x13, 0xAC, 0x01, 0xE9, 0xD2, 0xC3, 0x14, 0xFB, 0xCF, 0xE8, + 0xF6, 0xE1, 0x15, 0x82, 0xC0, 0xF8, 0x7C, 0xA0, 0xE9, 0x74, 0xA0, 0x02, + 0x78, 0xED, 0x06, 0xE8, 0xEE, 0x86, 0x98, 0x81, 0x19, 0x54, 0x21, 0x17, + 0x51, 0x21, 0x15, 0x50, 0x01, 0x14, 0x78, 0x31, 0x15, 0xB0, 0x0E, 0xA4, + 0xB4, 0x68, 0x51, 0xB6, 0x4E, 0x71, 0xC8, 0x4B, 0x6A, 0xCE, 0x29, 0xA3, + 0x5A, 0x11, 0x3F, 0xF2, 0x63, 0x20, 0x9C, 0x91, 0xD9, 0x66, 0xC0, 0x04, + 0x2A, 0xC0, 0x04, 0xA2, 0x8D, 0x71, 0x7C, 0xE0, 0x06, 0xF8, 0xAE, 0x20, + 0x36, 0xAA, 0xEB, 0x86, 0xE0, 0xEF, 0x24, 0xA0, 0x00, 0x08, 0x80, 0x00, + 0x06, 0x00, 0x40, 0xFE, 0x8B, 0x22, 0x7A, 0x8A, 0x01, 0x46, 0xC0, 0x40, + 0x1C, 0x40, 0x00, 0x1C, 0xA0, 0x03, 0xC6, 0x51, 0xDB, 0xC8, 0xE2, 0x8C, + 0x70, 0x0A, 0x8D, 0x5C, 0x42, 0xDB, 0xDC, 0xE2, 0xDC, 0xC8, 0x60, 0x0D, + 0xCA, 0x00, 0x77, 0xC6, 0xC0, 0x27, 0xEA, 0xC0, 0x92, 0x06, 0xA1, 0x10, + 0xA8, 0x70, 0x4C, 0xF0, 0xA0, 0x10, 0x86, 0x42, 0x0D, 0xE0, 0x20, 0x21, + 0x59, 0xEF, 0x0E, 0xFE, 0xF4, 0xC7, 0x7F, 0x1A, 0xC1, 0x11, 0xFC, 0x47, + 0x0E, 0xE4, 0xA0, 0x01, 0x3E, 0x41, 0x1F, 0xF0, 0x21, 0x15, 0x99, 0x08, + 0x1B, 0x82, 0x80, 0x16, 0xB2, 0x61, 0x1B, 0x5A, 0xAB, 0x1A, 0xA6, 0x61, + 0x14, 0x48, 0x21, 0x14, 0x82, 0x60, 0x14, 0x9A, 0xE0, 0x82, 0x88, 0x40, + 0x51, 0x6A, 0x41, 0x3B, 0xAA, 0x21, 0x19, 0xF4, 0xD0, 0xCC, 0x46, 0xAE, + 0xE4, 0x4A, 0x8E, 0x9E, 0x4A, 0xAE, 0x6D, 0x3E, 0x41, 0x14, 0x72, 0x51, + 0x15, 0x60, 0x41, 0x16, 0x9C, 0x43, 0x16, 0x74, 0x61, 0x16, 0xE4, 0x69, + 0x27, 0xF9, 0x86, 0xB9, 0x08, 0x4A, 0x16, 0x90, 0x6B, 0x15, 0x62, 0xA1, + 0x15, 0x2A, 0x8D, 0xEA, 0x90, 0xAB, 0xE7, 0x64, 0x41, 0x9B, 0x58, 0x6E, + 0xCE, 0x6E, 0x4E, 0x14, 0x81, 0x08, 0xD1, 0x50, 0x11, 0x23, 0xB1, 0x52, + 0xB1, 0x86, 0x0F, 0x08, 0x2A, 0xA0, 0xED, 0x9A, 0x0E, 0x3F, 0x6E, 0xA0, + 0xD8, 0x66, 0x40, 0xA3, 0x40, 0x21, 0x14, 0x80, 0x6B, 0x14, 0xF4, 0x49, + 0xBB, 0x50, 0x21, 0x37, 0x12, 0x4A, 0xA1, 0xF4, 0x49, 0x29, 0x15, 0x85, + 0xEB, 0x80, 0x20, 0x07, 0x9E, 0x2D, 0x08, 0x28, 0x88, 0x2E, 0x93, 0x85, + 0xED, 0x86, 0x60, 0x07, 0x92, 0xB1, 0x08, 0x72, 0x60, 0x07, 0x08, 0x42, + 0x6A, 0x12, 0x42, 0xDA, 0x1E, 0x47, 0x72, 0x24, 0x27, 0x10, 0x34, 0x4A, + 0xEB, 0xB4, 0xE9, 0x1A, 0x7B, 0x2D, 0x1C, 0x0F, 0xAC, 0x00, 0x00, 0xC4, + 0x40, 0xB4, 0x8D, 0x01, 0x56, 0x07, 0x41, 0xA0, 0xE5, 0x5A, 0xDA, 0xE5, + 0x07, 0x49, 0x40, 0xC2, 0xF4, 0x28, 0x04, 0xD0, 0x71, 0x04, 0x40, 0xA0, + 0x04, 0x10, 0xC4, 0x74, 0xD6, 0xE0, 0x2A, 0xCC, 0x00, 0x0D, 0x98, 0x6A, + 0x0C, 0x4E, 0xA4, 0x29, 0x50, 0xAF, 0x5E, 0xF0, 0x20, 0x12, 0xEE, 0x45, + 0x10, 0xD4, 0x60, 0x10, 0x42, 0x04, 0xFE, 0x21, 0x19, 0xE3, 0x7F, 0x0A, + 0xEB, 0x0E, 0x1C, 0xC1, 0x11, 0x78, 0xEC, 0x0F, 0x38, 0xC0, 0x13, 0xF6, + 0x81, 0x33, 0xAE, 0xF2, 0x3C, 0x86, 0xD3, 0x3C, 0xF6, 0x81, 0x1B, 0x84, + 0x40, 0x1A, 0x04, 0x25, 0xC9, 0xA0, 0xAF, 0xC9, 0x60, 0x21, 0x55, 0x88, + 0x40, 0x15, 0xD8, 0xB0, 0x08, 0x76, 0x40, 0x3C, 0xA4, 0x61, 0x3B, 0xBC, + 0x8F, 0xCD, 0x30, 0x81, 0x53, 0x72, 0x12, 0x11, 0x5B, 0x41, 0x3A, 0x54, + 0xA1, 0x15, 0x14, 0x51, 0x9D, 0x60, 0x21, 0x16, 0x66, 0x61, 0x16, 0x60, + 0x65, 0x16, 0xF6, 0xA6, 0x28, 0x87, 0xB2, 0x11, 0xA9, 0xD2, 0xFE, 0x04, + 0x6D, 0x15, 0xF2, 0x26, 0x14, 0x74, 0x60, 0x08, 0x3E, 0x41, 0xFE, 0x58, + 0xE1, 0x13, 0x58, 0x21, 0xA1, 0x40, 0x11, 0x17, 0xB2, 0xF2, 0x3F, 0x77, + 0x45, 0x9C, 0x2E, 0x08, 0x59, 0x08, 0x30, 0x10, 0x22, 0x00, 0xA4, 0xAC, + 0x23, 0x08, 0xC2, 0x12, 0x04, 0x29, 0x8A, 0x08, 0xCA, 0x32, 0x6F, 0xF2, + 0xEC, 0x9F, 0xE6, 0x4C, 0xBB, 0x7C, 0x4B, 0x56, 0x54, 0x81, 0x6D, 0xDA, + 0x06, 0x14, 0xEA, 0x09, 0x13, 0x52, 0x92, 0x2F, 0xE7, 0x40, 0x82, 0x86, + 0x40, 0x08, 0xF0, 0x83, 0x08, 0xB4, 0x4E, 0x82, 0xFC, 0x69, 0x01, 0x41, + 0x2A, 0x45, 0x43, 0x2A, 0xBC, 0xE8, 0x4E, 0xA4, 0x86, 0x20, 0x10, 0x74, + 0x40, 0x02, 0x14, 0x80, 0x00, 0x56, 0x2D, 0x1C, 0xC5, 0xF1, 0xBF, 0xAE, + 0x85, 0xA7, 0x1A, 0x40, 0x43, 0xAE, 0xCD, 0x03, 0xEE, 0x68, 0xDB, 0x1A, + 0x20, 0x76, 0x6E, 0x0A, 0x8D, 0xCA, 0x05, 0x34, 0xB9, 0x85, 0x0C, 0xCE, + 0x6D, 0x24, 0x96, 0x07, 0x49, 0x7E, 0x42, 0x0C, 0xCA, 0x84, 0x7D, 0x14, + 0xE9, 0x35, 0x23, 0x81, 0x45, 0x38, 0x62, 0x35, 0xF9, 0x80, 0x0F, 0x2C, + 0x23, 0x7F, 0xFA, 0xAD, 0x11, 0x8A, 0x09, 0x10, 0xFE, 0xFE, 0xC0, 0xC7, + 0x8C, 0xA0, 0x1A, 0x8E, 0x28, 0xC8, 0x3A, 0xA3, 0x38, 0x9B, 0xE9, 0x57, + 0x88, 0xA0, 0x1A, 0x04, 0x45, 0x4C, 0xAB, 0xC1, 0x1A, 0x44, 0xC1, 0x13, + 0x3E, 0x81, 0x8B, 0xE6, 0x40, 0x15, 0x86, 0x8B, 0x08, 0x74, 0xE0, 0x38, + 0x42, 0xC1, 0x9E, 0x28, 0x0B, 0x87, 0x3C, 0x81, 0x53, 0x1C, 0x6E, 0xE3, + 0x66, 0x81, 0xE4, 0x7A, 0x2B, 0x11, 0xB3, 0x6B, 0x15, 0x5A, 0x21, 0x16, + 0x14, 0xF1, 0x3C, 0x67, 0x01, 0x19, 0x9A, 0x03, 0x56, 0x04, 0x8A, 0x6F, + 0x7C, 0x88, 0x3F, 0xDB, 0x32, 0xA1, 0x8C, 0x72, 0xCF, 0x50, 0x41, 0x3F, + 0xE9, 0x33, 0x39, 0x7A, 0xCB, 0x13, 0x90, 0x01, 0x14, 0x62, 0x81, 0x19, + 0x16, 0x15, 0x15, 0xC6, 0x14, 0x40, 0x49, 0x75, 0x4F, 0xBE, 0x81, 0x9F, + 0x80, 0x80, 0xEB, 0x1C, 0x27, 0x08, 0xE8, 0x20, 0xDA, 0xA4, 0x41, 0x1E, + 0x5C, 0xA1, 0x08, 0x44, 0xF0, 0xEE, 0xEA, 0x63, 0x07, 0xA4, 0x08, 0x03, + 0xD1, 0xC9, 0xCE, 0x52, 0x2E, 0x17, 0xE1, 0xF0, 0x14, 0x72, 0xF1, 0x0F, + 0xEB, 0x2C, 0x58, 0xB3, 0x8B, 0x6D, 0x2C, 0x68, 0x53, 0xEC, 0xC9, 0xE1, + 0xF2, 0x34, 0x84, 0xE4, 0x2E, 0x02, 0xE3, 0x4E, 0x71, 0xE6, 0xE0, 0xA2, + 0x7C, 0x20, 0x72, 0x04, 0x70, 0x02, 0xC0, 0x91, 0x00, 0x50, 0x4A, 0xBD, + 0x08, 0x00, 0x1C, 0x09, 0x24, 0x5A, 0x22, 0xE2, 0x07, 0xD7, 0xA5, 0x5D, + 0x80, 0x30, 0x25, 0xD4, 0xA8, 0xC2, 0xDE, 0xC2, 0x73, 0x40, 0xB3, 0x32, + 0x49, 0x60, 0x4A, 0x62, 0x22, 0x63, 0x48, 0x02, 0x24, 0xF4, 0xA0, 0x0E, + 0x2E, 0xA1, 0x0D, 0x60, 0xEC, 0x10, 0xDE, 0x15, 0x11, 0xA6, 0x34, 0x27, + 0x44, 0x22, 0x27, 0xE0, 0x00, 0x4B, 0x71, 0xA6, 0xDF, 0x68, 0x0F, 0x10, + 0xFC, 0x00, 0x22, 0xFF, 0xC0, 0x04, 0x6C, 0x00, 0x15, 0x86, 0x20, 0x14, + 0xFE, 0x7E, 0xD2, 0x1A, 0xE0, 0x41, 0x1E, 0x40, 0x43, 0x0C, 0x13, 0x6B, + 0x1F, 0xF8, 0xA1, 0x1A, 0xAC, 0xC0, 0x1A, 0xB8, 0x21, 0xE1, 0x5C, 0x12, + 0x1A, 0xDE, 0xB4, 0x14, 0x8A, 0xA0, 0x08, 0x6E, 0x12, 0x83, 0x64, 0x15, + 0x9D, 0xB6, 0xF3, 0x4D, 0x8F, 0x43, 0x14, 0x34, 0x94, 0x0D, 0xFB, 0x94, + 0xB2, 0xC4, 0x53, 0x27, 0x5D, 0x21, 0x65, 0x15, 0x91, 0x16, 0xB4, 0xA3, + 0x39, 0x18, 0xD5, 0x39, 0x94, 0x41, 0x19, 0xA2, 0xA1, 0x66, 0xA3, 0x01, + 0x56, 0x7C, 0xE8, 0x16, 0x97, 0xCB, 0xA0, 0x64, 0x6E, 0xCF, 0x20, 0xB4, + 0x3E, 0x6F, 0x08, 0xB8, 0x58, 0x01, 0x14, 0x8A, 0x92, 0x19, 0x42, 0x61, + 0xFF, 0x4A, 0x35, 0x69, 0xD1, 0x43, 0x1A, 0xDE, 0x54, 0x71, 0xA4, 0x06, + 0x3F, 0x90, 0x25, 0x02, 0x86, 0x80, 0x1C, 0x3C, 0xA3, 0x1F, 0x2E, 0x2E, + 0x07, 0x2C, 0xE0, 0xEE, 0x2A, 0x60, 0x06, 0x26, 0x2D, 0x07, 0xD6, 0x6E, + 0x0E, 0x82, 0xD5, 0xEA, 0x46, 0x2E, 0x3C, 0x53, 0x36, 0x27, 0x73, 0x31, + 0x37, 0x72, 0x6E, 0x14, 0xF2, 0xA9, 0x9E, 0xE2, 0x14, 0x0E, 0xFB, 0x2C, + 0x4F, 0xA5, 0x48, 0xA4, 0x80, 0x40, 0xDA, 0xB8, 0x0E, 0x07, 0x98, 0xA5, + 0x3F, 0x0E, 0x8C, 0x00, 0x9A, 0xA5, 0xE9, 0xD4, 0x2B, 0x6F, 0x77, 0x70, + 0x07, 0xC9, 0x68, 0x07, 0x3D, 0x93, 0x47, 0x4F, 0x60, 0x75, 0x40, 0x93, + 0x04, 0x4E, 0xE0, 0x25, 0xB6, 0x64, 0x2D, 0x2E, 0x04, 0x05, 0xD0, 0x11, + 0x06, 0x5C, 0x80, 0x0D, 0xCC, 0x80, 0x49, 0xCE, 0x00, 0x46, 0xC6, 0xA0, + 0x46, 0x08, 0xA3, 0x0D, 0x08, 0x49, 0x0F, 0x5A, 0x06, 0xDE, 0x9A, 0x27, + 0x97, 0xF4, 0x05, 0x0D, 0x14, 0x61, 0x11, 0xDE, 0xA0, 0x0F, 0xFC, 0xF5, + 0x0F, 0xB4, 0x10, 0x10, 0x1E, 0xC1, 0x06, 0x8E, 0x20, 0xA1, 0xF0, 0x4C, + 0x82, 0x3C, 0x81, 0xFE, 0x14, 0x5E, 0xE1, 0x17, 0xB8, 0x01, 0x1E, 0xCC, + 0x74, 0x70, 0x84, 0x83, 0x1A, 0x88, 0x80, 0x62, 0xAD, 0xE1, 0x3A, 0xA9, + 0x41, 0x17, 0x52, 0x2E, 0x56, 0xED, 0x69, 0xCE, 0x3C, 0x21, 0x21, 0x68, + 0xA3, 0x08, 0x34, 0x25, 0x39, 0xDE, 0x94, 0x08, 0x9A, 0xC0, 0x9F, 0x46, + 0x61, 0x2D, 0xC1, 0xA6, 0x53, 0xFC, 0x01, 0x16, 0xCE, 0x93, 0x27, 0x61, + 0x03, 0x56, 0xAE, 0x17, 0x1A, 0x8C, 0xCB, 0x66, 0xB5, 0xC1, 0x66, 0xBD, + 0x77, 0x3D, 0x1F, 0x91, 0x67, 0x57, 0xA1, 0x2C, 0xE7, 0x40, 0x07, 0x8C, + 0x60, 0x0E, 0x32, 0x94, 0x15, 0xE6, 0x00, 0x15, 0x62, 0x61, 0x66, 0x4F, + 0x81, 0x1B, 0x54, 0xF1, 0x76, 0x95, 0xB6, 0x37, 0x4A, 0xA1, 0x15, 0x30, + 0x08, 0x13, 0x0C, 0x42, 0xDA, 0x6C, 0x20, 0x02, 0x88, 0xE0, 0x22, 0xB1, + 0xA6, 0x1D, 0xFC, 0x21, 0x08, 0x16, 0x80, 0x00, 0x78, 0xED, 0xD4, 0x24, + 0xCD, 0xE9, 0x06, 0x02, 0x08, 0xA4, 0x88, 0x0D, 0xF9, 0xE9, 0x38, 0x92, + 0x63, 0x15, 0x2E, 0x94, 0x3C, 0x0D, 0x71, 0x15, 0x4E, 0x61, 0x58, 0x29, + 0x8B, 0x64, 0xA5, 0xA8, 0x79, 0xA5, 0x48, 0x55, 0x2B, 0x60, 0xBD, 0x7C, + 0x0D, 0xF2, 0x30, 0xC2, 0x03, 0xB2, 0x75, 0x02, 0x08, 0x53, 0x07, 0x14, + 0xE0, 0x01, 0x6C, 0x54, 0x5A, 0xB2, 0x45, 0xDB, 0x5A, 0xCA, 0x7B, 0x52, + 0x42, 0x05, 0xD0, 0x95, 0x03, 0xDC, 0x22, 0xAD, 0x4A, 0x40, 0xC4, 0xD0, + 0x08, 0x06, 0x54, 0x80, 0x93, 0xCC, 0xA0, 0x05, 0xCE, 0xA0, 0x05, 0x4A, + 0x40, 0x0C, 0xB2, 0xC2, 0x2A, 0x30, 0xD7, 0x27, 0x0A, 0x81, 0x46, 0x08, + 0x21, 0x11, 0xE0, 0xAD, 0x24, 0xC4, 0x60, 0x4D, 0xD4, 0xE0, 0x0D, 0xDE, + 0xE4, 0xDE, 0xEC, 0x84, 0xF6, 0xF4, 0x8D, 0x37, 0x1D, 0xC1, 0x06, 0x24, + 0x60, 0x3F, 0x2B, 0xCD, 0xCD, 0xE4, 0xFE, 0xCF, 0x6D, 0xAC, 0x40, 0x76, + 0xAD, 0xE1, 0x1D, 0xE4, 0x97, 0x57, 0xF0, 0x21, 0x1F, 0xA4, 0x61, 0x35, + 0xB8, 0xC1, 0x1A, 0x94, 0xA6, 0x25, 0x39, 0xC5, 0x15, 0xA4, 0xA8, 0xC9, + 0xF2, 0x34, 0x08, 0x22, 0x60, 0xED, 0xA6, 0x6C, 0x0E, 0x34, 0x98, 0xFB, + 0x2E, 0x14, 0x9B, 0x72, 0xC3, 0x15, 0x5C, 0x21, 0x19, 0xF8, 0x38, 0x19, + 0xD0, 0x13, 0x1A, 0x7E, 0xF2, 0x8F, 0x8D, 0xEB, 0x7A, 0xA3, 0xA1, 0x7B, + 0xBB, 0xF7, 0x7B, 0x05, 0x4A, 0xA0, 0x98, 0xA1, 0xD0, 0x2E, 0xD1, 0xA0, + 0x82, 0x68, 0x08, 0x66, 0xC0, 0x3E, 0xA9, 0xCE, 0x2C, 0xCB, 0x92, 0x19, + 0x04, 0x2A, 0x14, 0xE0, 0x77, 0x7E, 0x35, 0xB9, 0x37, 0xDE, 0x61, 0xE3, + 0xF8, 0xC9, 0xCF, 0x08, 0xC2, 0x3E, 0x8A, 0x05, 0x13, 0xDE, 0x21, 0x99, + 0x26, 0x05, 0x38, 0x98, 0x41, 0x5B, 0x14, 0x40, 0x06, 0x03, 0x00, 0x00, + 0x6C, 0x14, 0xD5, 0x0C, 0x40, 0x02, 0x20, 0x40, 0x21, 0x22, 0xA0, 0x1A, + 0xA3, 0xAD, 0x15, 0xAD, 0x88, 0xED, 0xD8, 0xAE, 0x36, 0xF8, 0x92, 0x2E, + 0xA1, 0xAD, 0x02, 0x22, 0x60, 0x96, 0x2B, 0x00, 0xA5, 0x50, 0xAA, 0x01, + 0x48, 0x40, 0x8D, 0xD2, 0x60, 0x23, 0x36, 0x73, 0xAC, 0x1C, 0xC0, 0x95, + 0x1F, 0x40, 0x71, 0x1E, 0xC7, 0x06, 0xF4, 0x96, 0x46, 0x19, 0xA0, 0x43, + 0x0E, 0xE4, 0x59, 0xEE, 0x4B, 0x86, 0xD7, 0xC8, 0xA5, 0x44, 0xE0, 0x40, + 0x5A, 0x42, 0x05, 0x42, 0xC0, 0x8E, 0x54, 0xA9, 0x7B, 0x58, 0xE9, 0x05, + 0x3C, 0x82, 0x62, 0xB4, 0xC2, 0x24, 0xDC, 0x40, 0x10, 0x7C, 0xA2, 0x2A, + 0xF0, 0x60, 0x10, 0xEA, 0x80, 0x90, 0x08, 0xC1, 0x96, 0x74, 0x82, 0x2B, + 0xC4, 0x00, 0x0E, 0x6C, 0xE6, 0x66, 0x8A, 0x49, 0x8A, 0x39, 0x81, 0xB0, + 0x1C, 0xA1, 0x04, 0x4C, 0xC0, 0x6D, 0x20, 0x91, 0xA0, 0xFE, 0xB2, 0x0F, + 0x28, 0xD3, 0xEF, 0x14, 0x46, 0xF6, 0x15, 0x14, 0xD6, 0x61, 0x91, 0x28, + 0x0C, 0x7F, 0x61, 0x14, 0xB0, 0x81, 0x1B, 0xAE, 0x81, 0x50, 0xAC, 0x01, + 0x1A, 0x46, 0xC1, 0x15, 0x46, 0xA1, 0x86, 0x28, 0xAB, 0x4F, 0xAD, 0x23, + 0x02, 0x1E, 0x47, 0x82, 0x92, 0xE3, 0x6B, 0x68, 0x21, 0x19, 0x54, 0x61, + 0x16, 0x60, 0x61, 0x8F, 0xFF, 0x50, 0x19, 0xA6, 0x61, 0x16, 0xB0, 0x8F, + 0x8F, 0x77, 0xF2, 0x3C, 0xA1, 0xE1, 0x66, 0x09, 0xD9, 0x7B, 0xBF, 0xB7, + 0x66, 0x91, 0x41, 0x16, 0x16, 0xD9, 0xA0, 0x4E, 0x81, 0x15, 0x90, 0x21, + 0x3F, 0x91, 0xE3, 0x06, 0x3A, 0xB1, 0xD2, 0xBE, 0x0E, 0x14, 0xF6, 0x93, + 0x19, 0x94, 0x21, 0x14, 0xAC, 0x41, 0x1F, 0x18, 0x7A, 0x93, 0x99, 0x5A, + 0x1F, 0xFA, 0x01, 0x27, 0xB3, 0xEF, 0x14, 0x7C, 0x40, 0x8B, 0x0A, 0xE2, + 0x03, 0x9B, 0x00, 0x1E, 0x3A, 0x4B, 0x1F, 0x60, 0x81, 0x01, 0xC4, 0x20, + 0x05, 0x12, 0x8F, 0x21, 0x68, 0xB0, 0x95, 0x01, 0xA0, 0x00, 0x26, 0x20, + 0x02, 0x4C, 0x4D, 0x02, 0xB2, 0x95, 0xBD, 0xD8, 0x6B, 0xBD, 0xC2, 0xB1, + 0x5A, 0xAD, 0xD5, 0xD7, 0x50, 0xCA, 0x5A, 0x9F, 0xC5, 0xF2, 0x52, 0x80, + 0x05, 0x38, 0x20, 0x0C, 0xCE, 0x40, 0x05, 0x5E, 0x60, 0x26, 0x5E, 0xE2, + 0x07, 0x47, 0x20, 0x01, 0x02, 0x40, 0x6F, 0x8D, 0x80, 0x0E, 0x92, 0x05, + 0x08, 0xE0, 0x9A, 0xD5, 0x3C, 0xF3, 0x40, 0x34, 0xC7, 0x03, 0xE8, 0x08, + 0x04, 0x50, 0xA0, 0xAC, 0x3A, 0x80, 0x01, 0x1E, 0x9B, 0xA7, 0xD0, 0x88, + 0x25, 0x98, 0x84, 0x93, 0x52, 0xA7, 0x64, 0x56, 0x00, 0x75, 0x30, 0x06, + 0x31, 0x0C, 0x83, 0x27, 0xC2, 0xE0, 0x4B, 0xEA, 0xC0, 0x35, 0xE5, 0x75, + 0x60, 0xFE, 0x02, 0x27, 0xEA, 0x6D, 0x74, 0x19, 0xD2, 0x74, 0xBF, 0xF4, + 0xFE, 0x0F, 0xB8, 0xF0, 0x0F, 0x1C, 0xC1, 0x04, 0x8E, 0xC0, 0x6D, 0x28, + 0x98, 0x15, 0xB4, 0x23, 0x7B, 0x61, 0x01, 0xB5, 0x0C, 0x05, 0x16, 0x48, + 0x81, 0x53, 0x46, 0xA1, 0x14, 0x7E, 0x81, 0x1C, 0x2E, 0x12, 0x89, 0xDE, + 0x21, 0x1F, 0x1A, 0xAE, 0x1B, 0xCE, 0x78, 0x69, 0xAC, 0x01, 0x78, 0x6B, + 0x61, 0xE5, 0xEC, 0xE9, 0x13, 0x36, 0x85, 0x55, 0xCC, 0x3A, 0x07, 0x90, + 0x83, 0x63, 0x55, 0x81, 0x16, 0x1C, 0x88, 0x8F, 0x6B, 0x61, 0xA5, 0xA9, + 0x37, 0x19, 0x62, 0xA1, 0xB8, 0x6A, 0xC1, 0x8F, 0x01, 0x39, 0x19, 0xB2, + 0x37, 0xA6, 0x61, 0xA3, 0x90, 0xD1, 0x9B, 0x66, 0x69, 0x7A, 0x19, 0x94, + 0x81, 0xA0, 0x7E, 0x88, 0x15, 0xA2, 0x46, 0x20, 0x06, 0x42, 0x51, 0xD8, + 0x97, 0xE5, 0xE6, 0xE0, 0xFC, 0x6E, 0xDA, 0x13, 0xBC, 0xA1, 0xA9, 0xF9, + 0xDB, 0xCA, 0xF4, 0xC1, 0x1F, 0x42, 0x61, 0x19, 0xB4, 0x81, 0x19, 0xA0, + 0xBB, 0x8A, 0x72, 0x60, 0x06, 0x70, 0x80, 0xE2, 0x42, 0x63, 0x52, 0x5A, + 0xE1, 0x03, 0x06, 0x41, 0x0D, 0x08, 0x24, 0xF1, 0x68, 0xF0, 0x06, 0x03, + 0x40, 0x00, 0x74, 0x00, 0x9D, 0x78, 0xEB, 0x38, 0x82, 0x40, 0x07, 0x0C, + 0xC0, 0x00, 0x52, 0xCD, 0x00, 0x68, 0x94, 0x06, 0xC7, 0xF1, 0x3F, 0x4A, + 0xC7, 0x03, 0x3E, 0x20, 0x05, 0xCC, 0xE2, 0x05, 0x52, 0xC0, 0x0C, 0x1E, + 0xDC, 0x0D, 0xD4, 0x62, 0x79, 0x64, 0xA0, 0x1C, 0x71, 0x2A, 0x00, 0x0A, + 0xE0, 0x01, 0x1E, 0xA7, 0xEB, 0xD0, 0x3A, 0xD8, 0x0A, 0x0C, 0xAD, 0xAE, + 0xE5, 0x47, 0xBF, 0x67, 0x86, 0xE3, 0x4B, 0x75, 0xB6, 0x05, 0x04, 0x52, + 0x40, 0x2F, 0x62, 0x60, 0xB3, 0xC7, 0x65, 0x0D, 0xD6, 0x80, 0x93, 0x30, + 0xE6, 0x30, 0x50, 0x26, 0x2A, 0xF4, 0xE0, 0x05, 0x72, 0x64, 0xAF, 0x13, + 0x61, 0x26, 0x56, 0xFE, 0xC4, 0x91, 0xDC, 0x35, 0x27, 0xD0, 0x20, 0x67, + 0xEE, 0x8D, 0x21, 0x69, 0x8F, 0x4B, 0xE5, 0x00, 0xB6, 0x47, 0x40, 0x02, + 0x3C, 0xE1, 0xE6, 0x56, 0x41, 0x11, 0xC9, 0x9B, 0xFA, 0x24, 0x0B, 0x36, + 0x66, 0xC1, 0x0F, 0x57, 0x72, 0x3B, 0x6A, 0xC1, 0x15, 0x28, 0xAB, 0x16, + 0x5E, 0x41, 0x1A, 0x6C, 0x37, 0x70, 0xF8, 0x61, 0x1F, 0x60, 0xC1, 0x0A, + 0xBC, 0xE1, 0x8C, 0xD3, 0x18, 0x1A, 0x4A, 0x41, 0x14, 0x10, 0x9A, 0x63, + 0xBD, 0xC9, 0x13, 0x74, 0x00, 0x02, 0x2A, 0xE0, 0x06, 0x68, 0x03, 0x82, + 0x88, 0xC0, 0x57, 0x63, 0x61, 0x1A, 0x6A, 0x61, 0x16, 0xAE, 0x6F, 0x16, + 0x68, 0x01, 0x16, 0xF8, 0x98, 0x16, 0x22, 0xDD, 0x8F, 0x8D, 0xCB, 0x65, + 0xAB, 0x81, 0x1A, 0x6A, 0x36, 0xA6, 0xD1, 0x9B, 0xA6, 0x6D, 0xB6, 0xBD, + 0x1D, 0xF9, 0x13, 0x8C, 0x40, 0x04, 0x09, 0x00, 0x00, 0x22, 0xE0, 0xD4, + 0x81, 0xDA, 0x41, 0x87, 0x56, 0xA0, 0xF5, 0x86, 0xC0, 0xAF, 0xA1, 0xBF, + 0x69, 0x5D, 0x1F, 0x14, 0xB1, 0x1B, 0xA6, 0xC1, 0x68, 0xFD, 0xAC, 0x84, + 0x75, 0xC0, 0x1F, 0xAA, 0xAC, 0x4C, 0xF5, 0xE1, 0x13, 0x3E, 0x80, 0x5E, + 0x51, 0xBC, 0x05, 0x1C, 0xE2, 0xAB, 0x65, 0xB0, 0x2B, 0x6B, 0x63, 0xEB, + 0xE6, 0xAC, 0x08, 0x50, 0x6A, 0x3F, 0xF2, 0x36, 0x00, 0xC6, 0x2A, 0x2E, + 0x78, 0xCA, 0x03, 0x5C, 0xC0, 0x2A, 0x48, 0x00, 0x42, 0x52, 0x67, 0xC5, + 0x0D, 0x03, 0x63, 0x56, 0x20, 0x87, 0x77, 0xEA, 0x22, 0xDE, 0x85, 0xC6, + 0x49, 0xF8, 0x1A, 0x1F, 0xC7, 0x84, 0x27, 0xE0, 0x01, 0x28, 0x13, 0x05, + 0xC8, 0xE8, 0x98, 0x1B, 0xA0, 0x2D, 0x42, 0x40, 0x75, 0x2E, 0xAC, 0xDB, + 0x6E, 0x6A, 0x05, 0x4A, 0x0C, 0x06, 0xE2, 0x22, 0x05, 0x94, 0x9C, 0x0C, + 0x52, 0x40, 0xC5, 0xC9, 0x80, 0x0C, 0xFE, 0xDE, 0xC0, 0x0D, 0x28, 0x64, + 0x0D, 0xF2, 0x20, 0x0C, 0x2E, 0x01, 0x46, 0x5C, 0x66, 0x28, 0x86, 0xC2, + 0x5F, 0xDA, 0x80, 0x7E, 0x2E, 0x69, 0x5F, 0x21, 0x43, 0xB0, 0xBA, 0xB0, + 0xB0, 0x50, 0x57, 0x04, 0x8E, 0xE0, 0x13, 0x6C, 0xA1, 0xB7, 0x0A, 0x0D, + 0x36, 0x96, 0x61, 0x1A, 0xD0, 0x06, 0xE4, 0x00, 0x79, 0x19, 0xA0, 0xA3, + 0x16, 0x7C, 0x12, 0x36, 0x74, 0x61, 0x15, 0xAC, 0x00, 0x13, 0xAC, 0x60, + 0x15, 0xA4, 0x21, 0xCF, 0x83, 0x53, 0x52, 0xD6, 0x43, 0x1E, 0xF2, 0xA1, + 0xB9, 0xFB, 0x3C, 0x1B, 0x7E, 0x21, 0x8D, 0x29, 0x0B, 0xBA, 0xFD, 0xE9, + 0x38, 0x86, 0x60, 0x59, 0x2A, 0x00, 0x07, 0x70, 0x00, 0x7D, 0x47, 0x16, + 0x50, 0xCF, 0x6C, 0x19, 0x5A, 0x81, 0xBC, 0x69, 0x41, 0x19, 0xB4, 0xC3, + 0x65, 0x61, 0x83, 0xBC, 0xA1, 0xA1, 0x7B, 0xB3, 0xC1, 0x66, 0xCF, 0x5B, + 0xD4, 0xF7, 0x06, 0x15, 0x48, 0xD4, 0x3A, 0x1A, 0xB3, 0x00, 0x9A, 0xEE, + 0x71, 0xE8, 0x72, 0x7C, 0xE7, 0x8C, 0xCF, 0x3C, 0x61, 0x0E, 0x68, 0x8E, + 0x88, 0x90, 0xFA, 0xE5, 0x6B, 0x7D, 0x93, 0xF7, 0x41, 0x14, 0xA6, 0x61, + 0x1B, 0x94, 0x21, 0x16, 0x44, 0xAB, 0x20, 0x66, 0x55, 0x08, 0xB0, 0x7A, + 0xC1, 0xF7, 0x01, 0x14, 0x64, 0xA0, 0x78, 0x46, 0x00, 0x05, 0x58, 0xE0, + 0xD8, 0x67, 0xB0, 0x95, 0x23, 0x00, 0x08, 0x1E, 0x25, 0x3E, 0x38, 0xD6, + 0x07, 0x04, 0x60, 0x02, 0xAC, 0x03, 0x02, 0x0E, 0x8C, 0x21, 0x1A, 0x4F, + 0xAC, 0x6E, 0x4A, 0x93, 0x42, 0x07, 0x77, 0x42, 0x60, 0x0C, 0x5A, 0x20, + 0x0D, 0x26, 0x7F, 0x0D, 0x52, 0x80, 0x8C, 0x52, 0xC0, 0x33, 0xD3, 0xA8, + 0xC0, 0x68, 0x90, 0x00, 0xEC, 0x43, 0x3F, 0x7C, 0x80, 0x08, 0x72, 0x1C, + 0x23, 0xBE, 0xED, 0x98, 0xB7, 0x45, 0x2E, 0x4A, 0xA7, 0xFE, 0x8E, 0x46, + 0x80, 0x32, 0x1B, 0xC0, 0x25, 0xB0, 0x45, 0xC3, 0x64, 0x98, 0x76, 0xC8, + 0xED, 0x05, 0xD6, 0xA2, 0x05, 0x68, 0x3F, 0x0D, 0xD8, 0x64, 0x0C, 0x58, + 0x20, 0x05, 0x24, 0xFF, 0x05, 0x6C, 0xE2, 0x9D, 0x1D, 0xC9, 0x91, 0x06, + 0xC1, 0x96, 0x04, 0x01, 0xF7, 0xD1, 0x80, 0x0F, 0x14, 0x81, 0x0D, 0x2C, + 0x63, 0xB0, 0x88, 0xC9, 0x4B, 0xC3, 0xFC, 0x11, 0x20, 0x4C, 0x13, 0xF8, + 0x0C, 0x15, 0xD6, 0xB3, 0x85, 0x60, 0x03, 0x19, 0xA2, 0x81, 0x1A, 0xA8, + 0x41, 0x1A, 0x3E, 0x4E, 0x1B, 0xA0, 0x21, 0x6D, 0x48, 0xFE, 0x15, 0x64, + 0x81, 0x50, 0x8A, 0xC3, 0x16, 0x7C, 0xBB, 0x14, 0x68, 0xE1, 0x8B, 0xC3, + 0x18, 0x34, 0xC6, 0xD8, 0x15, 0x48, 0xE1, 0x8C, 0xB9, 0x41, 0x4C, 0xA5, + 0xE1, 0x17, 0x44, 0xC1, 0x0A, 0xD8, 0x70, 0x53, 0x44, 0x16, 0xDA, 0x6E, + 0x20, 0x3E, 0x9E, 0xE6, 0x6B, 0xEE, 0x93, 0x16, 0x00, 0x42, 0x16, 0xAD, + 0x64, 0x04, 0x93, 0xCD, 0x9A, 0x36, 0x4D, 0x19, 0x34, 0x68, 0xC9, 0x16, + 0xEA, 0x82, 0x56, 0xAD, 0x5A, 0x34, 0x88, 0xD4, 0xA2, 0x69, 0xBB, 0xA8, + 0x2D, 0x9A, 0x32, 0x59, 0xA7, 0x3C, 0x11, 0xC9, 0x51, 0x21, 0xC2, 0x83, + 0x91, 0x37, 0x76, 0x40, 0xA8, 0xE0, 0xC9, 0x13, 0x2A, 0x8F, 0x98, 0x58, + 0xC5, 0x42, 0xC6, 0x2C, 0x14, 0x2B, 0x54, 0x43, 0x50, 0x21, 0x8B, 0x16, + 0x73, 0xDB, 0xBE, 0x7D, 0xFA, 0x7A, 0xFA, 0xFC, 0x09, 0x34, 0xA8, 0xD0, + 0xA1, 0x44, 0x8B, 0x1A, 0x3D, 0x8A, 0x34, 0xA9, 0xD2, 0xA5, 0x46, 0xE1, + 0xA9, 0xBA, 0x38, 0x4D, 0x96, 0x2A, 0x4C, 0x3E, 0x7C, 0xCC, 0xF8, 0x61, + 0xC3, 0x13, 0xCF, 0xA0, 0xF9, 0xF4, 0x0D, 0x59, 0x40, 0x02, 0x04, 0x87, + 0x05, 0x27, 0x06, 0x0C, 0x70, 0x90, 0x20, 0x40, 0x80, 0x02, 0x33, 0x82, + 0xFE, 0xE4, 0xD8, 0x11, 0x64, 0x47, 0x8E, 0x8F, 0x02, 0x24, 0xE4, 0xB8, + 0x21, 0xE1, 0x81, 0x02, 0x00, 0x0E, 0xC6, 0x82, 0x58, 0xD0, 0xA1, 0xC5, + 0x98, 0x30, 0x84, 0xC3, 0xB0, 0x08, 0x23, 0xA6, 0x4C, 0x9B, 0x15, 0x2E, + 0xD0, 0xA4, 0x61, 0x30, 0x22, 0x44, 0x8A, 0x0E, 0x0B, 0x16, 0x34, 0x60, + 0x10, 0x00, 0x00, 0x81, 0x19, 0x43, 0x7C, 0xE8, 0xB0, 0x61, 0x24, 0x07, + 0x01, 0xBD, 0x2A, 0xE0, 0xA8, 0xE8, 0xD0, 0x61, 0x04, 0x87, 0x11, 0x20, + 0xC4, 0x32, 0xE0, 0x10, 0x82, 0x43, 0x87, 0xB1, 0x1C, 0x40, 0x44, 0x66, + 0x00, 0xA2, 0x04, 0x09, 0x12, 0x23, 0x4E, 0x80, 0x50, 0xD1, 0x22, 0x8C, + 0x8B, 0xC1, 0xC3, 0xD7, 0xA8, 0x58, 0x91, 0xC6, 0x4C, 0x8B, 0x36, 0x82, + 0xF0, 0x0C, 0x72, 0xA3, 0x67, 0x90, 0x73, 0x42, 0x83, 0xD4, 0xA8, 0x81, + 0xA3, 0x07, 0xCE, 0x1B, 0x3E, 0x7E, 0xDE, 0xDC, 0xF1, 0x73, 0xA7, 0x91, + 0x9F, 0x3F, 0x71, 0xE2, 0xFC, 0x69, 0x70, 0x63, 0x88, 0x2D, 0x56, 0xA1, + 0x5C, 0xE9, 0x62, 0x35, 0x4D, 0x1A, 0x32, 0x56, 0xBA, 0xA8, 0x69, 0x9B, + 0x06, 0x2D, 0xDA, 0x36, 0x6A, 0xD4, 0xB6, 0x69, 0x83, 0x46, 0xCD, 0x34, + 0xBA, 0xD4, 0x52, 0x8B, 0x2E, 0xB2, 0xE8, 0x82, 0x60, 0x2D, 0xA5, 0x90, + 0x32, 0x8A, 0x27, 0xA3, 0x94, 0x42, 0x8B, 0x37, 0xF2, 0x6C, 0xB5, 0x14, + 0x3F, 0xFA, 0x88, 0x42, 0xCA, 0x35, 0xD6, 0x5C, 0xF3, 0x4B, 0x35, 0xBF, + 0xD0, 0xD2, 0xD1, 0x28, 0x73, 0x04, 0xB1, 0xCA, 0x28, 0x98, 0x78, 0xA2, + 0xC3, 0x0D, 0x15, 0x18, 0x01, 0x57, 0x10, 0xA3, 0x88, 0x42, 0xC4, 0x28, + 0xA3, 0xB8, 0x02, 0xCB, 0x2C, 0x07, 0x35, 0xC4, 0x50, 0x2D, 0x04, 0x41, + 0x43, 0x8B, 0x2C, 0x10, 0xDD, 0x67, 0xDF, 0x34, 0x18, 0x41, 0x83, 0x4C, + 0x2C, 0xA1, 0xCC, 0xFE, 0x61, 0xC4, 0x0D, 0x26, 0x1C, 0x51, 0x92, 0x10, + 0x9E, 0x88, 0xF2, 0x4A, 0x35, 0x4D, 0x48, 0x30, 0xC3, 0x1C, 0x44, 0x84, + 0xB2, 0x0A, 0x2A, 0xAB, 0xC4, 0xF2, 0x52, 0x34, 0x46, 0x86, 0x42, 0x07, + 0x2B, 0xCB, 0x44, 0xB3, 0x4C, 0x28, 0xDE, 0x30, 0x85, 0x66, 0x9A, 0x6A, + 0xAE, 0xC9, 0x66, 0x9B, 0x44, 0x49, 0xD3, 0x4A, 0x37, 0xF7, 0xC5, 0x82, + 0x0A, 0x26, 0x74, 0xE8, 0x30, 0x03, 0x0D, 0x33, 0xB8, 0x32, 0x14, 0x4F, + 0x81, 0x7C, 0x60, 0xC6, 0x09, 0x23, 0x90, 0x50, 0x46, 0x02, 0x0C, 0x2C, + 0xA0, 0xC0, 0x00, 0x01, 0x18, 0x70, 0x83, 0x0E, 0x39, 0xE8, 0x50, 0x04, + 0x48, 0x42, 0xDC, 0xC0, 0x96, 0x0E, 0x3A, 0xE0, 0x30, 0x01, 0x01, 0x03, + 0x2C, 0xF0, 0xD7, 0x02, 0x29, 0xC8, 0x70, 0x42, 0x19, 0x29, 0x94, 0x91, + 0x58, 0x0A, 0x63, 0x94, 0x01, 0x5D, 0x18, 0x2D, 0x88, 0xA1, 0xC2, 0xA0, + 0x1E, 0xAC, 0x10, 0x82, 0x02, 0x0C, 0x34, 0x90, 0xC0, 0x00, 0x00, 0x14, + 0x00, 0x41, 0x20, 0x3A, 0x78, 0xF6, 0x43, 0x0E, 0x0F, 0x68, 0x1A, 0x42, + 0x1E, 0x29, 0xD8, 0x46, 0x42, 0x0A, 0xBB, 0x71, 0xF0, 0xDA, 0x58, 0x0A, + 0x20, 0xDB, 0x00, 0xB2, 0xB2, 0xA5, 0x86, 0x82, 0x0A, 0x61, 0x94, 0xE0, + 0x82, 0x0B, 0x23, 0x84, 0x41, 0x86, 0x0B, 0x2F, 0xB0, 0x91, 0x06, 0x19, + 0x2F, 0x8C, 0x20, 0xC6, 0xA9, 0x2F, 0xE0, 0x41, 0x08, 0x21, 0x6E, 0xD4, + 0x41, 0x9D, 0x20, 0x83, 0x1C, 0x42, 0x88, 0x75, 0x70, 0x08, 0xF2, 0x06, + 0x19, 0x8C, 0xBC, 0x11, 0xC7, 0x77, 0xDF, 0x8D, 0x17, 0x87, 0x1C, 0x71, + 0x28, 0xA0, 0x03, 0x2A, 0x73, 0xC4, 0x72, 0x8A, 0x2C, 0xAD, 0x20, 0xA3, + 0x8B, 0x80, 0xB2, 0xD8, 0x47, 0x8D, 0x35, 0xD4, 0x14, 0x9C, 0x8D, 0x36, + 0x09, 0x5B, 0x03, 0x31, 0xC4, 0xD0, 0xFE, 0x48, 0x03, 0xCD, 0x32, 0xB0, + 0xB8, 0xE2, 0xCA, 0x2B, 0xBA, 0xFC, 0xA2, 0xCB, 0x2B, 0xAE, 0x8C, 0x62, + 0x85, 0x27, 0xA5, 0xD4, 0x42, 0xCD, 0x3B, 0x42, 0x51, 0xF8, 0xD3, 0x3B, + 0xFB, 0x3C, 0xC8, 0xCD, 0x35, 0xDB, 0xFC, 0x22, 0x4D, 0x35, 0xB4, 0xBC, + 0x22, 0x63, 0x10, 0x57, 0xA6, 0x84, 0x89, 0x0E, 0x47, 0xE4, 0x10, 0xDA, + 0x0E, 0x27, 0x12, 0xE1, 0x09, 0x2C, 0xB0, 0x40, 0x23, 0x4B, 0x41, 0xF8, + 0x25, 0xB3, 0x8C, 0x2C, 0xAC, 0x2C, 0x04, 0x8D, 0x36, 0xD5, 0x60, 0x04, + 0xD5, 0x2C, 0xAC, 0x8C, 0x42, 0x44, 0x10, 0x37, 0xCC, 0x30, 0xC3, 0x0E, + 0x42, 0x8C, 0xD2, 0x8A, 0x37, 0xF0, 0xC0, 0xE3, 0x93, 0x37, 0x4D, 0x3C, + 0x30, 0x83, 0x27, 0x73, 0xCC, 0x11, 0x0A, 0x2A, 0x2E, 0xC9, 0x82, 0x4C, + 0x99, 0xA8, 0x1C, 0xB9, 0xCA, 0x98, 0xC8, 0x84, 0xC2, 0x8D, 0x9B, 0x76, + 0xDF, 0x8D, 0x77, 0xDE, 0x69, 0xBA, 0x32, 0x0B, 0x37, 0xD9, 0x28, 0x43, + 0x27, 0x26, 0x43, 0xEC, 0x6A, 0x29, 0x36, 0x44, 0xD5, 0x03, 0x83, 0x0C, + 0x6D, 0xA8, 0x20, 0x06, 0x0A, 0x93, 0x25, 0xE0, 0x80, 0x03, 0x8A, 0x1A, + 0xB0, 0xC3, 0x0D, 0x8F, 0x0E, 0x31, 0x04, 0x0E, 0x93, 0x16, 0x60, 0x42, + 0x0E, 0x33, 0xE8, 0x30, 0x81, 0x02, 0x01, 0x38, 0x30, 0xEB, 0x02, 0x2C, + 0x70, 0x10, 0x86, 0x1A, 0x63, 0xAC, 0x40, 0xD8, 0x60, 0x65, 0x9C, 0xD1, + 0x42, 0xEC, 0x2C, 0x08, 0xAA, 0x02, 0x07, 0xBC, 0x2D, 0x70, 0x28, 0x07, + 0x8A, 0x02, 0x20, 0xC1, 0x10, 0x36, 0xE0, 0x69, 0xC4, 0x1C, 0x99, 0x26, + 0xC0, 0x01, 0x1C, 0x2F, 0x9C, 0x80, 0x02, 0x09, 0x2D, 0xF8, 0x46, 0x02, + 0xB2, 0x0B, 0x78, 0xA0, 0xC0, 0x02, 0x1C, 0x28, 0x30, 0x42, 0x07, 0x24, + 0x84, 0xC1, 0x5B, 0x09, 0x28, 0xC0, 0x80, 0x42, 0xF2, 0xFE, 0x21, 0xB8, + 0x90, 0xAD, 0x0B, 0x89, 0x8D, 0xF1, 0x82, 0x0A, 0x6D, 0x24, 0x66, 0x86, + 0x1A, 0x84, 0xE0, 0x81, 0x87, 0x1E, 0xEC, 0x0E, 0x32, 0x48, 0x21, 0x7A, + 0xD4, 0xA1, 0x06, 0x1E, 0x82, 0xA0, 0xC1, 0x06, 0x1F, 0x6C, 0xB0, 0x71, + 0x47, 0xFF, 0x7D, 0x88, 0x57, 0x03, 0x7D, 0x11, 0xE0, 0x06, 0x6F, 0x63, + 0x85, 0x2D, 0x62, 0x21, 0x0B, 0x59, 0xC0, 0xC2, 0x40, 0x14, 0xE9, 0x0F, + 0x90, 0x20, 0xC6, 0x1F, 0x08, 0x6A, 0x03, 0x82, 0x09, 0x43, 0x10, 0x34, + 0x66, 0xF1, 0x8A, 0x57, 0xD4, 0xE2, 0x15, 0xB4, 0xB0, 0xA0, 0x2B, 0x6C, + 0xF1, 0x09, 0x07, 0xB9, 0xA7, 0x1B, 0xF8, 0x00, 0x4A, 0x57, 0x7C, 0x22, + 0x0F, 0x7D, 0x78, 0x82, 0x14, 0xD8, 0xE0, 0x06, 0x37, 0xAA, 0x21, 0x0D, + 0x6B, 0xE8, 0x62, 0x15, 0xA5, 0xA0, 0xDA, 0x93, 0x44, 0x94, 0x03, 0x1C, + 0xDC, 0x20, 0x08, 0x2C, 0x32, 0xC2, 0x89, 0x42, 0x28, 0x8A, 0x55, 0xC0, + 0xA2, 0x15, 0xB4, 0xB0, 0x91, 0x02, 0x67, 0xC1, 0xA3, 0x59, 0xF4, 0x68, + 0x21, 0xF1, 0x99, 0x45, 0x2C, 0x56, 0xE1, 0x89, 0x21, 0x18, 0x41, 0x87, + 0x39, 0x70, 0x12, 0x29, 0x5E, 0xF1, 0x8D, 0x12, 0xFE, 0xA4, 0x2B, 0xF9, + 0x90, 0x87, 0x2B, 0x1E, 0x50, 0x01, 0xB4, 0x9D, 0x88, 0x15, 0xAC, 0x68, + 0xDB, 0x32, 0x96, 0xC1, 0x8A, 0x4F, 0x7C, 0x02, 0x14, 0xA1, 0x88, 0x06, + 0x4E, 0x46, 0x51, 0x37, 0xBD, 0xC9, 0x71, 0x8E, 0x74, 0xB4, 0xDB, 0x3E, + 0x48, 0xA1, 0x8D, 0x6C, 0x6C, 0xC3, 0x1F, 0xB1, 0x50, 0x05, 0x28, 0x86, + 0xD0, 0xB9, 0x19, 0xF0, 0x00, 0x6C, 0x3C, 0x39, 0xA1, 0x4F, 0xB4, 0xE1, + 0x81, 0x14, 0xB4, 0x61, 0x55, 0x24, 0x58, 0x01, 0x6A, 0x3C, 0x10, 0x00, + 0x45, 0xD9, 0x05, 0x07, 0x41, 0xC0, 0xC1, 0x5C, 0x1C, 0x15, 0x01, 0x00, + 0xFE, 0x44, 0xE0, 0x77, 0x78, 0x29, 0x00, 0xE4, 0x18, 0xF0, 0x81, 0x05, + 0xF4, 0xA6, 0x05, 0x8E, 0x5B, 0x01, 0xEB, 0x5A, 0xB0, 0x02, 0x33, 0xB8, + 0x80, 0x75, 0x2F, 0x30, 0x16, 0x08, 0x5C, 0xB0, 0x9A, 0x11, 0x1C, 0xCA, + 0x03, 0x0C, 0x70, 0x00, 0x00, 0x04, 0x30, 0x01, 0x1D, 0xFC, 0xC0, 0x33, + 0x3A, 0x00, 0xC5, 0x0C, 0x08, 0x20, 0xAB, 0x17, 0xA4, 0xC1, 0x03, 0x1C, + 0x40, 0xC1, 0xA0, 0x92, 0xD7, 0x01, 0x06, 0x24, 0x8B, 0x01, 0xD1, 0x6B, + 0x0D, 0x07, 0x60, 0xC9, 0x00, 0x17, 0xA8, 0x00, 0x05, 0x27, 0xD0, 0x8D, + 0x0A, 0xCA, 0x90, 0x06, 0x17, 0xC0, 0x60, 0x0D, 0x6C, 0x08, 0x43, 0x0A, + 0x5E, 0xB0, 0x86, 0x36, 0xA4, 0x41, 0x0D, 0x6D, 0x70, 0x03, 0xFB, 0xEA, + 0x80, 0x88, 0x48, 0x14, 0x62, 0x10, 0x7A, 0x50, 0xC3, 0xB9, 0xDC, 0x20, + 0x08, 0x32, 0x90, 0x61, 0x11, 0xFB, 0xFB, 0xC3, 0x1F, 0xEE, 0xB0, 0x88, + 0x46, 0x38, 0x02, 0x5F, 0x03, 0x08, 0x42, 0xDA, 0x3E, 0xA1, 0x36, 0x64, + 0xC0, 0x22, 0x81, 0x07, 0x6A, 0x5A, 0x35, 0x12, 0xC6, 0x9F, 0xFE, 0x28, + 0x0C, 0x82, 0x14, 0x64, 0x68, 0x44, 0xA4, 0x01, 0x51, 0x5D, 0xCC, 0xA2, + 0x16, 0xAE, 0x50, 0x45, 0x2D, 0x0E, 0x64, 0x20, 0x9A, 0x79, 0xC2, 0x0A, + 0x57, 0xBC, 0x06, 0x3C, 0x50, 0xA6, 0x0F, 0x7E, 0xEC, 0x43, 0x64, 0xD7, + 0xE0, 0x86, 0x35, 0x7E, 0xA1, 0xB0, 0x6A, 0xB8, 0xA2, 0x14, 0x98, 0xC0, + 0x04, 0x11, 0x56, 0x51, 0x84, 0x22, 0xEC, 0x20, 0x45, 0x94, 0x14, 0xC2, + 0x0E, 0x88, 0x20, 0x8A, 0x9C, 0xBA, 0xA2, 0x15, 0xAA, 0x10, 0x05, 0x2B, + 0x56, 0xD1, 0x8A, 0xA0, 0x5E, 0x4C, 0x16, 0xB5, 0x10, 0x5A, 0x10, 0xA7, + 0x22, 0x84, 0x24, 0x65, 0x60, 0x07, 0xFF, 0x18, 0x45, 0x2D, 0x68, 0x81, + 0x0D, 0x78, 0xE0, 0xFE, 0x03, 0x1F, 0xFB, 0x30, 0xE4, 0x4F, 0x78, 0x52, + 0x0A, 0x30, 0xCE, 0xE1, 0x13, 0xB1, 0x00, 0x05, 0x28, 0x98, 0x31, 0x26, + 0xB0, 0xCA, 0xC2, 0xAB, 0x9F, 0x58, 0x85, 0x1B, 0x97, 0xF1, 0x89, 0x6B, + 0xD4, 0x71, 0xAD, 0x6C, 0x6D, 0x6B, 0x51, 0xFA, 0xE1, 0x0A, 0xFF, 0xCC, + 0x29, 0x14, 0x98, 0x98, 0x41, 0x04, 0x52, 0x84, 0x09, 0x94, 0x6D, 0xA5, + 0x84, 0xAC, 0xF0, 0xC0, 0x1A, 0xDE, 0x20, 0x86, 0x16, 0x78, 0xE0, 0x34, + 0x1F, 0x20, 0x41, 0x00, 0xD2, 0x22, 0x01, 0x16, 0x11, 0xA1, 0x08, 0x43, + 0x20, 0x82, 0x25, 0x33, 0x79, 0x83, 0xC8, 0xDA, 0xE0, 0x01, 0x9E, 0x5C, + 0x16, 0x07, 0x56, 0xC3, 0x82, 0x61, 0xA5, 0xA1, 0x95, 0xAA, 0x0A, 0xC3, + 0x62, 0xCA, 0x10, 0x86, 0x13, 0xB4, 0xC0, 0x58, 0x27, 0x20, 0x41, 0x08, + 0x7C, 0x73, 0x59, 0x5A, 0xDD, 0x32, 0x97, 0x98, 0xB3, 0x14, 0x55, 0x06, + 0x30, 0x01, 0xD3, 0xC5, 0xA6, 0x03, 0x2E, 0x98, 0x4D, 0x08, 0x42, 0xD0, + 0x00, 0x05, 0x38, 0x73, 0x2C, 0x0B, 0x40, 0xC1, 0x6A, 0x6A, 0x13, 0x82, + 0xE0, 0xA4, 0x80, 0x35, 0x27, 0x80, 0x81, 0x3C, 0x59, 0xB0, 0x02, 0x34, + 0x80, 0x76, 0x04, 0x66, 0x18, 0x83, 0x19, 0x10, 0x73, 0x06, 0x3C, 0xD4, + 0xC1, 0x0D, 0x84, 0x88, 0x04, 0x22, 0x06, 0x21, 0x08, 0x3D, 0xB4, 0xE1, + 0x12, 0xF3, 0xC3, 0x03, 0xFE, 0xEE, 0xF0, 0x06, 0x36, 0x2C, 0xA2, 0x3B, + 0x90, 0xC8, 0xE7, 0x78, 0x62, 0x50, 0x80, 0x39, 0xBC, 0x4D, 0x26, 0x09, + 0x14, 0xDA, 0x81, 0xA2, 0x41, 0x8D, 0x6A, 0x4C, 0xC3, 0x3E, 0xFB, 0x79, + 0x58, 0xC4, 0xEE, 0xFB, 0xB0, 0xF8, 0x46, 0x4C, 0xBE, 0x08, 0xA1, 0xC6, + 0x05, 0x85, 0xA6, 0x8A, 0xF5, 0x3C, 0xF5, 0x15, 0xB3, 0x70, 0x05, 0x83, + 0x9E, 0xD4, 0x51, 0xAA, 0xF2, 0xC4, 0xFE, 0x0A, 0xAE, 0xB8, 0x86, 0x86, + 0x22, 0x52, 0x0D, 0x5D, 0xD0, 0xC2, 0x13, 0x36, 0x4B, 0x49, 0x10, 0x30, + 0x91, 0xA4, 0x08, 0xDC, 0xA0, 0x08, 0x53, 0x04, 0x5A, 0x28, 0x54, 0x01, + 0x0B, 0x10, 0x2B, 0xB0, 0x15, 0xA7, 0x38, 0x85, 0x2A, 0x54, 0x51, 0xE2, + 0xA0, 0x8A, 0x62, 0x14, 0x42, 0xB8, 0x54, 0x0E, 0xFE, 0x51, 0x8A, 0x6A, + 0x78, 0xA3, 0x1F, 0xFD, 0x90, 0xAA, 0x48, 0x7D, 0x62, 0x55, 0xA0, 0x88, + 0xE2, 0x01, 0x39, 0x08, 0x45, 0xDA, 0x8C, 0x14, 0x0B, 0x8D, 0xC4, 0xE2, + 0x8C, 0xA1, 0xA8, 0x09, 0x97, 0x64, 0xC1, 0x8C, 0x51, 0x9C, 0xC9, 0xAD, + 0x4C, 0x6E, 0xF2, 0x1C, 0x79, 0xE2, 0x0F, 0x58, 0x74, 0x63, 0x1B, 0x09, + 0x91, 0x05, 0x2A, 0xE8, 0x30, 0x03, 0x13, 0x58, 0x85, 0x16, 0xFA, 0xC8, + 0xB1, 0x3E, 0x78, 0x42, 0x07, 0x0F, 0x38, 0xA6, 0x0C, 0x2C, 0x68, 0x64, + 0x58, 0x3A, 0x60, 0x96, 0x00, 0x48, 0xA0, 0x08, 0x40, 0x33, 0x5B, 0xA4, + 0x74, 0x10, 0x81, 0x01, 0x58, 0x2A, 0x45, 0x12, 0x98, 0xC0, 0x59, 0x2E, + 0x2B, 0x28, 0x33, 0xB0, 0x00, 0x04, 0xC1, 0x79, 0xC1, 0x19, 0x52, 0x67, + 0x06, 0x31, 0xAC, 0x60, 0x50, 0xD5, 0x1A, 0x41, 0x0B, 0x5A, 0x55, 0xBD, + 0xD5, 0x54, 0x06, 0x00, 0x00, 0x98, 0x80, 0x0F, 0x3A, 0xB3, 0x2B, 0x3A, + 0x0C, 0x81, 0x00, 0x13, 0x70, 0x40, 0x0B, 0xD2, 0x10, 0x06, 0x61, 0x5E, + 0x36, 0x04, 0x1D, 0xE8, 0xD4, 0xA1, 0x2A, 0xC3, 0x00, 0x0F, 0x80, 0x20, + 0x04, 0x23, 0x88, 0x4C, 0xB5, 0x86, 0x2B, 0x19, 0x69, 0xA6, 0x60, 0x05, + 0x28, 0x68, 0x83, 0x19, 0xD2, 0x80, 0x82, 0x35, 0x28, 0x77, 0x05, 0x62, + 0x30, 0x27, 0x1E, 0xE0, 0x19, 0x89, 0x48, 0x9C, 0xA1, 0x0D, 0x83, 0xA8, + 0x43, 0x18, 0x04, 0x51, 0x07, 0x33, 0xBC, 0xC1, 0x3B, 0xFE, 0x6C, 0x80, + 0x81, 0x78, 0xC2, 0xB3, 0x88, 0xF1, 0xFE, 0x81, 0x03, 0x0F, 0x30, 0x42, + 0xF0, 0x42, 0x21, 0x8B, 0x33, 0xBE, 0x67, 0xC8, 0x12, 0x11, 0x92, 0xC2, + 0xFA, 0x13, 0xC1, 0x6D, 0xDC, 0x77, 0xDB, 0xDC, 0x8E, 0x98, 0x7F, 0x1F, + 0x52, 0x1F, 0x6A, 0x2C, 0x83, 0xC4, 0xA8, 0x20, 0x05, 0x88, 0x69, 0xF1, + 0xA1, 0x8F, 0x79, 0xC4, 0x0A, 0xB6, 0x58, 0xC5, 0x0E, 0x4A, 0xD1, 0x42, + 0x6E, 0x74, 0x88, 0x63, 0xEA, 0x16, 0x02, 0x26, 0x3E, 0x11, 0x84, 0x39, + 0x4C, 0x2A, 0x45, 0x2C, 0xCA, 0x01, 0x63, 0x4F, 0xA4, 0x12, 0x57, 0xB0, + 0x02, 0xC5, 0xA2, 0x68, 0xC5, 0x2A, 0x7C, 0xEC, 0x91, 0x48, 0x95, 0xC4, + 0x13, 0xB5, 0xF8, 0x86, 0x37, 0xDE, 0xF1, 0x35, 0x78, 0xC8, 0xC3, 0xCB, + 0x7D, 0xD2, 0x87, 0x2A, 0x8E, 0x60, 0x84, 0x99, 0xB0, 0xC2, 0xCA, 0xB2, + 0xC0, 0x49, 0x90, 0xCB, 0x34, 0x07, 0x31, 0x6D, 0x1C, 0xAD, 0x71, 0x74, + 0xB2, 0xC9, 0x4F, 0xDE, 0x26, 0x57, 0xF8, 0x63, 0x1B, 0xD9, 0xF0, 0x07, + 0xE0, 0xEC, 0xF4, 0x39, 0xCF, 0x7C, 0xC3, 0x84, 0x3D, 0xC9, 0x07, 0x3E, + 0x62, 0x30, 0x82, 0x14, 0x98, 0xE1, 0x05, 0x87, 0x4E, 0x81, 0x31, 0x17, + 0xED, 0x00, 0x1A, 0x4C, 0xE5, 0xC3, 0x43, 0x68, 0xC2, 0x0E, 0x4C, 0x42, + 0x00, 0x4B, 0xCD, 0xE0, 0x06, 0x10, 0x48, 0x40, 0xAD, 0x2E, 0xFB, 0x81, + 0x14, 0xA4, 0xE0, 0x04, 0x52, 0x0F, 0x03, 0x63, 0x08, 0x93, 0x3C, 0x15, + 0x94, 0xD9, 0x05, 0x87, 0x16, 0x4C, 0xA9, 0x63, 0x73, 0x59, 0x06, 0x0C, + 0x40, 0x00, 0x05, 0x00, 0x42, 0x2A, 0x86, 0xB0, 0x4B, 0x3A, 0x80, 0x62, + 0x02, 0x05, 0xE8, 0xAD, 0x18, 0xC4, 0x10, 0x86, 0xEE, 0xD9, 0x0E, 0x04, + 0xD6, 0xAB, 0x8D, 0x65, 0x1A, 0x80, 0xF7, 0xD7, 0xC8, 0x92, 0x01, 0xC6, + 0xFE, 0x84, 0x4D, 0x58, 0xAA, 0x35, 0x4D, 0x45, 0x56, 0xEB, 0x05, 0x64, + 0x78, 0x03, 0x1A, 0x68, 0xED, 0x4E, 0x77, 0x0E, 0x42, 0x12, 0x84, 0x30, + 0x03, 0x1E, 0xF6, 0x70, 0x06, 0xC7, 0xB7, 0x41, 0x0F, 0x68, 0x40, 0x83, + 0xFE, 0xD8, 0xD0, 0x88, 0xFE, 0x35, 0x22, 0xD9, 0x7C, 0xB8, 0x83, 0x02, + 0x08, 0x80, 0x80, 0x02, 0x4C, 0x40, 0x02, 0x3A, 0xF0, 0x61, 0x2C, 0xFC, + 0x03, 0x0D, 0x84, 0x48, 0x23, 0xA1, 0x09, 0xCB, 0x86, 0x7D, 0x37, 0xA4, + 0x21, 0x6B, 0x60, 0xA3, 0xDB, 0xF7, 0x8D, 0xF0, 0xB7, 0x7D, 0x54, 0x8D, + 0x86, 0x1C, 0x88, 0x46, 0xA7, 0x58, 0xCF, 0x02, 0x25, 0xEC, 0x0A, 0x4F, + 0x08, 0x21, 0x02, 0xA4, 0x68, 0xD9, 0x35, 0xAA, 0x61, 0x0D, 0x69, 0xD0, + 0xC2, 0x15, 0xA7, 0x10, 0x45, 0x10, 0x1C, 0x64, 0xB3, 0xBB, 0x5C, 0x2D, + 0x07, 0x3C, 0x6B, 0x6C, 0x28, 0x1A, 0x14, 0x8A, 0x26, 0xA4, 0x24, 0x25, + 0x9F, 0x28, 0x42, 0x10, 0x80, 0x80, 0x03, 0x4A, 0x36, 0x01, 0x17, 0xE4, + 0x78, 0x87, 0x3C, 0xDE, 0xF1, 0x0E, 0x7C, 0x50, 0x1C, 0x29, 0xAF, 0xB8, + 0xC1, 0x1C, 0x64, 0x81, 0xC0, 0x20, 0x9F, 0xB5, 0xE3, 0xC8, 0x00, 0x85, + 0x27, 0x36, 0x8E, 0x0A, 0x66, 0x30, 0xE3, 0x13, 0xFD, 0x40, 0xB9, 0xFF, + 0xFF, 0xAF, 0x14, 0xFC, 0xD0, 0x0A, 0xDB, 0xE0, 0x1F, 0x09, 0x31, 0x15, + 0x83, 0xF3, 0x19, 0x3E, 0x60, 0x32, 0x20, 0xD5, 0x13, 0xEB, 0x10, 0x02, + 0x25, 0xB0, 0x02, 0x2F, 0x20, 0x68, 0x1C, 0xB0, 0x2A, 0x1C, 0xE0, 0x00, + 0x0B, 0x30, 0x00, 0xFC, 0x32, 0x0D, 0x53, 0x51, 0x27, 0x43, 0x30, 0x53, + 0x12, 0x30, 0x00, 0x37, 0xE0, 0x03, 0xBB, 0x34, 0x03, 0x0A, 0x10, 0x39, + 0x95, 0xA1, 0x02, 0x93, 0x71, 0x2D, 0x82, 0x46, 0x6B, 0x62, 0x20, 0x75, + 0x83, 0x22, 0x06, 0xFE, 0x27, 0x70, 0x1C, 0x2B, 0x18, 0x1B, 0x62, 0x51, + 0x1B, 0x0A, 0x90, 0x00, 0xB7, 0x92, 0x03, 0xD1, 0x90, 0x33, 0xE9, 0xC1, + 0x0A, 0x3A, 0x50, 0x00, 0x03, 0x40, 0x02, 0xC1, 0x66, 0x2C, 0x28, 0x90, + 0x4C, 0xCD, 0x13, 0x1B, 0x24, 0x70, 0x02, 0xCD, 0xA2, 0x4C, 0xB2, 0x82, + 0x1A, 0x80, 0xD1, 0x01, 0x21, 0x00, 0x02, 0xBB, 0xD1, 0x02, 0x2F, 0xE0, + 0x02, 0xDA, 0x33, 0x06, 0x29, 0xA0, 0x02, 0x64, 0xA0, 0x18, 0xC1, 0x81, + 0x06, 0x6E, 0x50, 0x3F, 0x82, 0x20, 0x08, 0x91, 0x40, 0x1D, 0x88, 0x40, + 0x08, 0x6D, 0x40, 0x4E, 0x6A, 0x40, 0x79, 0xC3, 0xB6, 0x3F, 0x8B, 0xF0, + 0x1D, 0xC9, 0xB6, 0x08, 0x7D, 0xC0, 0x06, 0x03, 0x30, 0x0A, 0xDF, 0xE0, + 0x0A, 0x56, 0x80, 0x03, 0x98, 0x24, 0x01, 0x11, 0xA0, 0x1E, 0xDA, 0xE0, + 0x37, 0xDA, 0xE0, 0x1F, 0xD5, 0x00, 0x0D, 0xD6, 0xE0, 0x7A, 0xF7, 0xE5, + 0x60, 0xC8, 0xA7, 0x21, 0xB1, 0xF7, 0x60, 0x10, 0x83, 0x7C, 0x07, 0x65, + 0x0D, 0xD0, 0xF0, 0x10, 0xD3, 0x30, 0x10, 0xB2, 0x30, 0x0B, 0xCB, 0xC0, + 0x44, 0x4A, 0xF3, 0x53, 0x16, 0xD5, 0x31, 0x41, 0xA0, 0x0B, 0x25, 0xC5, + 0x21, 0x11, 0x26, 0x61, 0x0E, 0x62, 0x04, 0x0D, 0xE2, 0x7D, 0x91, 0x55, + 0x01, 0x37, 0x90, 0x24, 0x46, 0x20, 0x04, 0x6C, 0x86, 0x09, 0x5B, 0x95, + 0x12, 0x1E, 0x58, 0x39, 0x15, 0xB0, 0x03, 0x33, 0x72, 0x0D, 0xE4, 0x20, + 0x0F, 0xF2, 0x20, 0x55, 0x55, 0xB5, 0x26, 0x3C, 0x41, 0x0B, 0x3A, 0x30, + 0x04, 0x68, 0xC4, 0x0C, 0xD1, 0xD0, 0x71, 0xCA, 0xB0, 0x0C, 0x60, 0xC5, + 0x0C, 0xAB, 0x10, 0x72, 0x08, 0x24, 0x0B, 0xCA, 0x60, 0x26, 0x5D, 0x06, + 0x80, 0xCF, 0x08, 0x8D, 0x3F, 0x01, 0x0F, 0xA4, 0xC0, 0x72, 0xD9, 0x30, + 0x0D, 0xB3, 0x90, 0x0A, 0x98, 0x00, 0xFE, 0x04, 0x4B, 0xA7, 0x03, 0xA2, + 0x50, 0x48, 0x27, 0xC4, 0x13, 0x3C, 0xF1, 0x0C, 0x83, 0x55, 0x3E, 0xDE, + 0x44, 0x02, 0x1F, 0x80, 0x3D, 0x0B, 0x80, 0x16, 0x22, 0xE0, 0x03, 0xCA, + 0x70, 0x62, 0xA2, 0xA0, 0x8D, 0x42, 0xE0, 0x03, 0x0F, 0x20, 0x00, 0x7C, + 0x98, 0x03, 0x56, 0x51, 0x69, 0x02, 0xB0, 0x00, 0x21, 0xB0, 0x02, 0xBC, + 0x21, 0x75, 0x2A, 0x70, 0x3D, 0x67, 0xB0, 0x3A, 0x00, 0xB9, 0x6A, 0x2B, + 0x40, 0x75, 0x27, 0x60, 0x85, 0x24, 0x20, 0x3D, 0xC8, 0x42, 0x4B, 0xB6, + 0x44, 0x00, 0x3E, 0x10, 0x0D, 0xA9, 0xE0, 0x03, 0x39, 0xF0, 0x2F, 0x40, + 0x80, 0x83, 0x8A, 0xB4, 0x06, 0x2E, 0x40, 0x02, 0xC7, 0x63, 0x3D, 0x24, + 0x90, 0x4C, 0xB4, 0x84, 0x5B, 0xD2, 0x43, 0x3C, 0x7A, 0x37, 0x77, 0x20, + 0xE0, 0x73, 0x28, 0x40, 0x06, 0xB3, 0xE3, 0x02, 0xD8, 0xA3, 0x2A, 0x2D, + 0xB0, 0x06, 0x6F, 0x77, 0x09, 0x70, 0x50, 0x07, 0xED, 0x63, 0x5D, 0x87, + 0x50, 0x08, 0xD6, 0x35, 0x5D, 0xD1, 0xE5, 0x06, 0x70, 0xF0, 0x5D, 0x71, + 0x00, 0x1E, 0xFF, 0xE3, 0x07, 0x7E, 0xB0, 0x08, 0x30, 0x30, 0x01, 0x4B, + 0xA6, 0x0F, 0xE4, 0xA0, 0x7E, 0xFC, 0x20, 0x0D, 0x9E, 0x60, 0x04, 0x11, + 0x10, 0x01, 0x39, 0xE0, 0x09, 0xD1, 0xD6, 0x0D, 0xEA, 0x40, 0x0D, 0xD2, + 0x50, 0x88, 0x04, 0x08, 0x7B, 0xDA, 0xE6, 0x60, 0xD7, 0x30, 0x7B, 0xD7, + 0xF0, 0x0D, 0xDE, 0x86, 0x50, 0xFC, 0xB1, 0x10, 0x82, 0xC8, 0x34, 0xCB, + 0xC0, 0x37, 0x49, 0xB3, 0x10, 0x09, 0x24, 0x0A, 0xA5, 0xE0, 0x09, 0x3D, + 0x20, 0x0D, 0xDF, 0x80, 0x0D, 0xDF, 0x00, 0x43, 0xD2, 0x40, 0x51, 0x9E, + 0xF0, 0x09, 0x46, 0x00, 0x34, 0x44, 0x40, 0x04, 0x3B, 0xC0, 0x24, 0x20, + 0xB1, 0x03, 0x6C, 0x66, 0x33, 0xFD, 0x96, 0x22, 0x37, 0xFE, 0x90, 0x01, + 0x39, 0x80, 0x09, 0xB5, 0xC0, 0x0D, 0xF0, 0x90, 0x0F, 0xFB, 0xC0, 0x0F, + 0x5A, 0x64, 0x47, 0xAF, 0x60, 0x04, 0xFF, 0x80, 0x46, 0x1D, 0x37, 0x26, + 0xC5, 0x28, 0x56, 0xA1, 0x00, 0x0A, 0xAC, 0x00, 0x38, 0xC1, 0xF8, 0x09, + 0x46, 0x19, 0x8D, 0x9F, 0xF9, 0x7F, 0xDF, 0x10, 0x0A, 0xDD, 0xD0, 0x30, + 0xD3, 0xC0, 0x0C, 0x53, 0xB1, 0x03, 0x3F, 0xA0, 0x6F, 0x7C, 0x02, 0x52, + 0x5B, 0x41, 0x07, 0x1F, 0xA0, 0x02, 0x2F, 0xD0, 0x48, 0x2A, 0xE0, 0x02, + 0x27, 0x80, 0x3D, 0x68, 0x91, 0x00, 0x22, 0x30, 0x04, 0xCA, 0x20, 0x0A, + 0xA8, 0xD0, 0x0A, 0x26, 0x32, 0x04, 0x40, 0x60, 0x00, 0x13, 0x20, 0x82, + 0x55, 0x21, 0x01, 0x04, 0xA0, 0x8E, 0x90, 0xC1, 0x1B, 0xC5, 0xB2, 0x1B, + 0x27, 0xF0, 0x76, 0x52, 0xC7, 0x3C, 0x2D, 0x90, 0x59, 0x32, 0xC8, 0x02, + 0x2D, 0x40, 0x02, 0xB9, 0x43, 0x1B, 0x0A, 0x40, 0x76, 0x10, 0xC9, 0x0C, + 0x74, 0xE0, 0x83, 0x44, 0x60, 0x67, 0x24, 0x70, 0x06, 0x70, 0xB0, 0x59, + 0x8D, 0x33, 0x5C, 0x54, 0x87, 0x5B, 0xB3, 0x61, 0x28, 0x1D, 0x10, 0x3D, + 0xB2, 0xB1, 0x1B, 0xD5, 0x03, 0x90, 0x23, 0xB0, 0x02, 0x6C, 0x30, 0x75, + 0xA3, 0x45, 0x28, 0xAB, 0x74, 0x2A, 0xA4, 0x42, 0x5D, 0xEC, 0x83, 0x08, + 0x88, 0xA0, 0x2E, 0x8C, 0x87, 0x07, 0xD1, 0xA5, 0x07, 0xD9, 0xC1, 0x06, + 0x68, 0x00, 0x5E, 0xFE, 0xC3, 0x08, 0x8B, 0xC0, 0x07, 0x8D, 0x00, 0x03, + 0x12, 0xE0, 0x0D, 0x85, 0xF4, 0x65, 0x86, 0xB4, 0x0F, 0xF5, 0x00, 0x0B, + 0x46, 0x60, 0x57, 0x18, 0x27, 0x0A, 0xD0, 0xA0, 0x47, 0xDD, 0x60, 0x0D, + 0xC8, 0xB7, 0x6D, 0x89, 0xB8, 0x21, 0xB4, 0x57, 0x95, 0x4E, 0x23, 0x11, + 0x4F, 0xF3, 0x10, 0x0E, 0xB1, 0x0C, 0x0F, 0xB1, 0x0C, 0xB4, 0x30, 0x50, + 0xFE, 0xCB, 0xB7, 0x03, 0xBF, 0xE0, 0x60, 0x72, 0x19, 0x61, 0xB4, 0x50, + 0x0B, 0x56, 0x80, 0x6F, 0x73, 0xE0, 0x09, 0x82, 0xD3, 0x94, 0x8D, 0xA2, + 0x22, 0x91, 0x15, 0x01, 0xA7, 0xE8, 0x94, 0x38, 0xE0, 0x33, 0xAE, 0xD0, + 0x0F, 0xF4, 0xB0, 0x98, 0x8B, 0x29, 0x47, 0xF9, 0x40, 0x0B, 0x45, 0x30, + 0x07, 0xC8, 0xE0, 0xA4, 0xC1, 0x98, 0x1F, 0x67, 0xA4, 0x0C, 0xC8, 0x80, + 0x36, 0x2E, 0x21, 0x26, 0xD1, 0xD0, 0x99, 0xA0, 0xA9, 0xA5, 0xFE, 0x57, + 0x0B, 0xC8, 0x30, 0x65, 0x09, 0x81, 0x0C, 0x53, 0xE1, 0x03, 0x74, 0x70, + 0x76, 0x5C, 0x06, 0x14, 0xE1, 0x98, 0x0F, 0x97, 0x30, 0x02, 0xC7, 0x11, + 0x81, 0x2A, 0x60, 0x92, 0x66, 0xA0, 0x90, 0x03, 0x90, 0x00, 0x0D, 0x20, + 0x04, 0xD3, 0x10, 0x62, 0xA7, 0xD0, 0x52, 0x6C, 0xF6, 0x00, 0x12, 0x20, + 0x82, 0x46, 0xF0, 0x03, 0x15, 0x70, 0x16, 0xD2, 0x93, 0x02, 0x0C, 0x70, + 0x3D, 0xF2, 0xD9, 0x75, 0xA4, 0x04, 0x90, 0x54, 0x97, 0x02, 0xFC, 0x38, + 0x75, 0x2B, 0xB0, 0x6A, 0x1D, 0xD0, 0x00, 0x4B, 0x28, 0x3D, 0x0B, 0x20, + 0x7A, 0x40, 0xC0, 0x0C, 0xCA, 0x90, 0x0A, 0x3A, 0x40, 0x07, 0xB2, 0x80, + 0x09, 0x0F, 0x30, 0x00, 0x20, 0x20, 0x06, 0x82, 0xE0, 0x06, 0x83, 0x41, + 0x4A, 0x82, 0xD2, 0x02, 0xBD, 0x71, 0x1A, 0xD2, 0x83, 0x1A, 0xB6, 0x33, + 0x28, 0xB7, 0x65, 0x3B, 0x51, 0x48, 0x18, 0xA5, 0x55, 0x4D, 0x29, 0x10, + 0x3B, 0x61, 0xE0, 0x5C, 0xE1, 0x54, 0x07, 0xCF, 0x81, 0x4E, 0x88, 0xC0, + 0x2E, 0x91, 0xC0, 0x3E, 0x62, 0x30, 0x79, 0x78, 0x30, 0x6C, 0x69, 0xA0, + 0x3F, 0x7F, 0xD0, 0x07, 0xE1, 0xA1, 0x08, 0xFF, 0x13, 0x03, 0x36, 0x40, + 0x21, 0xCD, 0xBA, 0x13, 0x3E, 0x81, 0x0F, 0xDB, 0xE0, 0x0A, 0x1F, 0x71, + 0x03, 0x94, 0xF4, 0xFE, 0x09, 0xB3, 0x60, 0x0D, 0xEA, 0xC0, 0xA1, 0xDB, + 0xA6, 0x95, 0xDB, 0x66, 0x5F, 0x01, 0x62, 0x0D, 0xDA, 0x80, 0x20, 0xDA, + 0x00, 0x51, 0xD3, 0x30, 0x11, 0xBA, 0x70, 0x46, 0x44, 0xA2, 0x40, 0x00, + 0x13, 0x04, 0x30, 0x6A, 0x0D, 0xDF, 0xF0, 0x0B, 0x1C, 0x33, 0x0B, 0xB6, + 0x20, 0x0A, 0x9E, 0xB0, 0x03, 0x38, 0x3A, 0x22, 0x56, 0x13, 0xA4, 0x15, + 0x30, 0x12, 0x0F, 0xA0, 0x61, 0x44, 0x60, 0x0B, 0xBF, 0x20, 0x21, 0x48, + 0x4A, 0x73, 0x77, 0xD3, 0x15, 0xBA, 0xF0, 0x0F, 0x73, 0xB0, 0x0C, 0x6D, + 0x93, 0x1F, 0x67, 0x85, 0x13, 0xCC, 0xE0, 0x09, 0xEC, 0x15, 0x0B, 0xC1, + 0xD8, 0x8C, 0x5B, 0x6A, 0xB1, 0x4C, 0xB6, 0x0F, 0xAA, 0xE0, 0x0F, 0xA4, + 0x19, 0x0D, 0x06, 0xC1, 0x0A, 0x82, 0x03, 0x0A, 0x98, 0xD0, 0x04, 0x9E, + 0x09, 0x14, 0xEA, 0x70, 0x02, 0x2C, 0x50, 0x06, 0x2F, 0x80, 0x18, 0xA7, + 0xE1, 0x4D, 0x95, 0x21, 0x00, 0x0A, 0x30, 0x01, 0x75, 0xAA, 0x0C, 0xB3, + 0x30, 0x15, 0x98, 0xA0, 0x0A, 0x9F, 0xF0, 0x2B, 0x15, 0xF0, 0x68, 0x78, + 0x62, 0x00, 0x90, 0xD3, 0x2C, 0x9E, 0x12, 0x5A, 0x2B, 0xD0, 0x75, 0x45, + 0xC8, 0x02, 0xC7, 0xA1, 0x91, 0xC7, 0x71, 0x3C, 0xC5, 0x32, 0xA8, 0x17, + 0x48, 0x4C, 0x0B, 0x10, 0x00, 0xB9, 0x34, 0xB1, 0xA1, 0x60, 0x98, 0xCC, + 0x80, 0x09, 0xE1, 0xE9, 0x78, 0x63, 0x40, 0x4A, 0x65, 0x06, 0xAA, 0xDE, + 0xB4, 0xA6, 0xC9, 0x03, 0x1B, 0x52, 0x18, 0x19, 0xD5, 0xE3, 0x91, 0x1D, + 0x99, 0x2D, 0xD1, 0x02, 0x81, 0xF8, 0xB9, 0x06, 0x61, 0xF0, 0x85, 0x6A, + 0x60, 0x06, 0x82, 0x50, 0x4E, 0xFD, 0x09, 0xB7, 0x7B, 0x80, 0x07, 0x70, + 0xD7, 0xB6, 0x82, 0xA0, 0x1D, 0xFA, 0xF3, 0x1D, 0x6F, 0x00, 0x87, 0x8C, + 0x50, 0x02, 0xCC, 0x8A, 0x32, 0x14, 0xFE, 0xF7, 0xAC, 0x3D, 0xD1, 0x0F, + 0x34, 0xB3, 0x03, 0x79, 0x28, 0x04, 0xA1, 0x20, 0x0D, 0xDB, 0xD0, 0x0D, + 0x7E, 0x13, 0x31, 0xB1, 0xE7, 0x6D, 0xF7, 0x35, 0x0D, 0x8C, 0xF8, 0x23, + 0xF2, 0x25, 0x5F, 0x02, 0x01, 0x89, 0x48, 0xD3, 0x23, 0xB6, 0x50, 0x04, + 0x88, 0x78, 0x52, 0x32, 0xB4, 0x7C, 0x2F, 0xF2, 0x97, 0x1E, 0xE1, 0x16, + 0x04, 0x40, 0x00, 0x12, 0x10, 0x12, 0xA4, 0x8B, 0x00, 0x38, 0x20, 0x0A, + 0xDC, 0xB0, 0x0F, 0x53, 0x15, 0xB8, 0x56, 0xC5, 0x80, 0x6D, 0x02, 0x0D, + 0x43, 0xD0, 0xA4, 0x96, 0xE8, 0x46, 0x64, 0x72, 0x46, 0x0B, 0xAB, 0x12, + 0x1B, 0xB7, 0x8C, 0xCC, 0x48, 0x0E, 0x17, 0x0B, 0xBC, 0x6C, 0xF5, 0x0E, + 0xA4, 0x90, 0x0C, 0x2C, 0x37, 0x0D, 0xC8, 0x80, 0x64, 0x74, 0xE0, 0x03, + 0x98, 0x10, 0x08, 0xA3, 0xF0, 0xBB, 0x41, 0xC1, 0x13, 0xB0, 0x80, 0x8E, + 0xE6, 0xB2, 0x02, 0x6E, 0x80, 0x4A, 0x2E, 0x18, 0x4A, 0x01, 0x80, 0x3B, + 0x41, 0x60, 0x8D, 0xB0, 0x10, 0x0B, 0x2D, 0x55, 0xAF, 0x06, 0xF0, 0x00, + 0xBF, 0x03, 0x04, 0x78, 0x32, 0x01, 0x4E, 0xC7, 0x01, 0x1E, 0xD0, 0x01, + 0xB1, 0xE9, 0x9C, 0xA8, 0x84, 0x3C, 0x52, 0x98, 0xA8, 0xAD, 0x92, 0x82, + 0x8E, 0x1A, 0x16, 0x83, 0x02, 0xA9, 0x63, 0xE1, 0x01, 0xB8, 0x34, 0x03, + 0x9A, 0xF9, 0xBD, 0x98, 0x10, 0x13, 0x20, 0x18, 0x06, 0x78, 0xA0, 0x06, + 0xCB, 0xA3, 0x02, 0x27, 0xE0, 0x1B, 0xD6, 0xA9, 0x75, 0x3E, 0x17, 0x19, + 0x1D, 0x60, 0xC0, 0x23, 0x80, 0x4C, 0x94, 0xE1, 0x91, 0x0C, 0x40, 0x06, + 0x62, 0xC0, 0x1B, 0x28, 0x10, 0x3B, 0x2A, 0xBB, 0x06, 0xCD, 0xF5, 0x06, + 0x01, 0x5A, 0x4E, 0xBB, 0xCA, 0xAB, 0x84, 0xC0, 0x2E, 0xAE, 0xC6, 0x02, + 0x75, 0xA0, 0x1D, 0xDA, 0x41, 0x2F, 0xC8, 0xB6, 0x79, 0xFE, 0x8B, 0xA0, + 0x9B, 0xF7, 0x10, 0xB8, 0x7D, 0xD2, 0x15, 0xBA, 0xF8, 0x13, 0xF2, 0x20, + 0x0D, 0xA2, 0x30, 0x53, 0x46, 0x10, 0x0A, 0xB4, 0xB0, 0x0D, 0x2E, 0xA4, + 0x6D, 0xDC, 0xFA, 0x30, 0xD9, 0x00, 0x31, 0x17, 0x11, 0x5F, 0x79, 0x24, + 0x5F, 0xF9, 0x71, 0xA2, 0x4C, 0x03, 0x0B, 0xA3, 0x50, 0x04, 0x5E, 0x79, + 0x7C, 0xBF, 0x40, 0x0D, 0xF4, 0x86, 0x09, 0xA1, 0xA0, 0x97, 0x9F, 0x30, + 0x22, 0x37, 0x00, 0x00, 0x08, 0x20, 0x01, 0x7C, 0x5A, 0x7A, 0x73, 0x50, + 0xB8, 0x46, 0x60, 0x0B, 0xD6, 0xF0, 0x0E, 0x5E, 0x06, 0xC3, 0x78, 0xB3, + 0x0F, 0xBF, 0xF0, 0x0F, 0x9F, 0x10, 0x6D, 0xB7, 0x7B, 0xBB, 0x95, 0x09, + 0x0A, 0x6A, 0xC3, 0x0A, 0x60, 0x15, 0x0D, 0xA3, 0xD0, 0x7F, 0xC1, 0x2B, + 0xC7, 0x72, 0x84, 0x0D, 0xAA, 0x30, 0x0D, 0xA4, 0xA9, 0x0D, 0xC9, 0xA0, + 0x0A, 0xCC, 0xE0, 0x03, 0x81, 0x70, 0x24, 0xB5, 0x60, 0x32, 0x43, 0xF1, + 0x9A, 0x6D, 0x10, 0x09, 0x6D, 0x80, 0x86, 0xB4, 0x9A, 0x06, 0x11, 0x7C, + 0x16, 0x12, 0xC0, 0xBD, 0x2D, 0x77, 0xC4, 0x4F, 0xBC, 0x76, 0x4B, 0x67, + 0x03, 0x68, 0x77, 0x03, 0x9A, 0x32, 0x00, 0x1F, 0x80, 0x1A, 0xAF, 0xD4, + 0x02, 0x65, 0x30, 0x5A, 0xD6, 0x83, 0x02, 0x8E, 0x6A, 0x9B, 0x05, 0xDC, + 0x8F, 0xAD, 0x42, 0x5A, 0x27, 0xE0, 0x48, 0x0D, 0x00, 0x18, 0x09, 0xC0, + 0x16, 0x13, 0x0B, 0x0B, 0x2D, 0x65, 0x24, 0x71, 0x36, 0x06, 0xD9, 0xF1, + 0xC9, 0x67, 0x40, 0x02, 0x9F, 0x1C, 0x06, 0x00, 0x59, 0xC0, 0xD5, 0xC3, + 0x69, 0xD5, 0xD2, 0x00, 0xB2, 0x64, 0x3D, 0x1E, 0xC0, 0x69, 0xBD, 0xD5, + 0x2A, 0x1C, 0x60, 0x9B, 0x82, 0x36, 0x06, 0xCE, 0x65, 0x06, 0x75, 0xA0, + 0x07, 0xB7, 0x26, 0x08, 0x70, 0x7B, 0x93, 0x84, 0xC0, 0xAB, 0x75, 0x10, + 0xFE, 0x79, 0x65, 0xF0, 0x06, 0x3C, 0x69, 0x79, 0x6F, 0x60, 0xAC, 0xC9, + 0xF6, 0x3F, 0x22, 0xF0, 0x0F, 0x2D, 0xBC, 0x14, 0x20, 0x45, 0x0E, 0x34, + 0x23, 0x53, 0x44, 0x70, 0x0A, 0xBA, 0xB0, 0x0E, 0xDD, 0x30, 0x65, 0xF5, + 0x15, 0xAE, 0x0B, 0x35, 0x41, 0x10, 0x33, 0x0D, 0x82, 0xE8, 0x30, 0x07, + 0x65, 0x89, 0x4C, 0x04, 0x89, 0x48, 0xDC, 0xB9, 0xEF, 0x0A, 0x43, 0xBF, + 0x00, 0x0B, 0x73, 0x60, 0x0B, 0x36, 0x03, 0x23, 0x40, 0x70, 0x03, 0xBF, + 0x72, 0x03, 0x57, 0x82, 0x31, 0x50, 0xB4, 0x0A, 0xB2, 0x70, 0x70, 0xD7, + 0xE7, 0x0A, 0xD6, 0xE0, 0x35, 0xAD, 0x19, 0xBB, 0x4C, 0xB1, 0x13, 0xD3, + 0x30, 0x07, 0x3A, 0x10, 0x0B, 0xBA, 0x70, 0x11, 0x67, 0x55, 0x8C, 0x49, + 0xE3, 0x55, 0xF0, 0x87, 0x0C, 0xCA, 0x10, 0x0D, 0xA1, 0x10, 0xC7, 0x73, + 0x2C, 0xD2, 0x76, 0x43, 0x51, 0xD9, 0xD0, 0x30, 0xFE, 0xC0, 0x0C, 0xB1, + 0x70, 0x76, 0x64, 0x4A, 0x04, 0xAF, 0xC0, 0x80, 0x3C, 0xF1, 0x0E, 0x35, + 0x80, 0x02, 0x66, 0xB0, 0x07, 0xE4, 0x74, 0x06, 0xC0, 0x71, 0x06, 0x23, + 0x00, 0x3D, 0x19, 0xD8, 0x3B, 0x72, 0xE2, 0x0F, 0xB3, 0xD0, 0x52, 0x9C, + 0x3A, 0x01, 0x9F, 0x93, 0x03, 0x08, 0x78, 0xBE, 0x03, 0xD0, 0xCB, 0xBB, + 0x91, 0x02, 0x88, 0x71, 0xCB, 0x23, 0x50, 0x3E, 0x32, 0x18, 0x9B, 0x8D, + 0x34, 0x75, 0x24, 0xC0, 0x38, 0x6C, 0xBA, 0x1B, 0x26, 0x48, 0x02, 0x0D, + 0x20, 0x00, 0x15, 0x70, 0xA9, 0xCC, 0x90, 0x0A, 0x5C, 0xE2, 0x4B, 0x03, + 0x90, 0x02, 0x03, 0x9A, 0x06, 0x32, 0xA0, 0x5C, 0x69, 0x20, 0x90, 0xB0, + 0x52, 0x9D, 0xAB, 0xDA, 0x01, 0xC6, 0x44, 0x6A, 0xD6, 0x33, 0x02, 0x0A, + 0x40, 0x6A, 0xCB, 0x19, 0x16, 0xCA, 0x63, 0x06, 0x8C, 0xE3, 0x6A, 0x70, + 0xF7, 0x06, 0xEC, 0xFE, 0xC4, 0xAB, 0xE9, 0xC4, 0xAB, 0x63, 0x18, 0x09, + 0x6E, 0x90, 0x06, 0x2B, 0x30, 0x06, 0x69, 0x50, 0xC2, 0x8A, 0xE0, 0x1D, + 0x7D, 0x30, 0x5E, 0x7E, 0xA0, 0x08, 0x20, 0x40, 0x04, 0x5C, 0x41, 0x14, + 0xB1, 0xDB, 0x9A, 0xDE, 0xB0, 0xA4, 0x96, 0x84, 0x09, 0xAE, 0x00, 0x0D, + 0xE8, 0x3C, 0x65, 0xD7, 0x46, 0x88, 0x0E, 0x33, 0x41, 0x24, 0x9A, 0x47, + 0xA9, 0xB7, 0x10, 0x4E, 0xB3, 0x10, 0x9E, 0xB0, 0xB9, 0x1A, 0x02, 0xAF, + 0x33, 0xFA, 0x0A, 0x4D, 0x10, 0x0A, 0x66, 0x93, 0xA3, 0xA1, 0x41, 0xBA, + 0x46, 0x40, 0x34, 0x56, 0xB6, 0x1E, 0x08, 0x84, 0x0C, 0xF8, 0x41, 0x0B, + 0xEC, 0x21, 0x38, 0x4D, 0x15, 0x25, 0x5F, 0xBC, 0x45, 0xEB, 0x97, 0x14, + 0xD7, 0xF0, 0x0F, 0x37, 0xE0, 0x23, 0x68, 0x4C, 0x26, 0xC1, 0x98, 0x46, + 0x07, 0x94, 0xD2, 0x6E, 0x14, 0x0A, 0xED, 0x30, 0xD2, 0xCF, 0xCD, 0x26, + 0x19, 0xEB, 0x0F, 0xDC, 0x40, 0x9A, 0x3F, 0xAD, 0x0A, 0x12, 0x89, 0x09, + 0x7F, 0x34, 0x73, 0x43, 0xA1, 0x0D, 0x39, 0x77, 0x3F, 0x6E, 0x30, 0x08, + 0x67, 0x60, 0x2A, 0xD4, 0x74, 0x28, 0x00, 0x20, 0x2B, 0x44, 0x20, 0x27, + 0xD4, 0x30, 0x0B, 0xF0, 0x38, 0x15, 0x54, 0x62, 0x29, 0x23, 0x38, 0x03, + 0x06, 0x20, 0xA7, 0x21, 0x90, 0x3C, 0x1B, 0x09, 0x5A, 0xD6, 0x39, 0x02, + 0x69, 0x30, 0x5C, 0x33, 0x18, 0x06, 0x65, 0x60, 0x4A, 0x2A, 0x30, 0xD8, + 0x2A, 0x90, 0x82, 0xA2, 0xD5, 0x00, 0x03, 0x30, 0x1B, 0x04, 0x10, 0x01, + 0xCC, 0xA0, 0x0D, 0xB3, 0x80, 0x64, 0xCC, 0xC0, 0x0A, 0x34, 0x30, 0x00, + 0x2C, 0x90, 0x5D, 0x97, 0x90, 0x02, 0x97, 0x90, 0x06, 0x69, 0x10, 0x3B, + 0x54, 0xAD, 0x85, 0x0C, 0x6C, 0x92, 0xA7, 0xE3, 0x91, 0xA6, 0x25, 0x3D, + 0xA4, 0x16, 0xB6, 0x4A, 0x58, 0x75, 0xFE, 0x2E, 0xD0, 0x06, 0x19, 0x69, + 0x06, 0xA4, 0xD2, 0x06, 0x79, 0xD0, 0x9F, 0xD6, 0x55, 0x08, 0x82, 0x70, + 0x08, 0xB9, 0xA6, 0x07, 0x2C, 0xC0, 0x02, 0x97, 0x80, 0x06, 0x70, 0x00, + 0x07, 0x86, 0xC0, 0x08, 0x77, 0xC0, 0x07, 0x8C, 0xC0, 0x08, 0x8A, 0x10, + 0x94, 0x0D, 0x30, 0x07, 0x7A, 0x63, 0x55, 0xEF, 0x80, 0x0B, 0x14, 0x06, + 0x17, 0x41, 0x13, 0x0D, 0xE9, 0xDC, 0x30, 0x01, 0x82, 0x30, 0x4E, 0x43, + 0x0D, 0xAE, 0x07, 0x51, 0x14, 0xC3, 0x34, 0x56, 0xF0, 0x0F, 0x89, 0xB8, + 0xC4, 0x32, 0x43, 0x0B, 0x54, 0x43, 0x04, 0x18, 0x66, 0x36, 0x95, 0x4C, + 0x00, 0x46, 0x80, 0x20, 0xCB, 0x30, 0x64, 0xC2, 0x98, 0x40, 0xAC, 0x00, + 0x0B, 0x42, 0x04, 0x11, 0x1C, 0x41, 0x35, 0x15, 0x56, 0x0A, 0x02, 0x0B, + 0x52, 0x25, 0x74, 0x42, 0x13, 0x52, 0x14, 0x3C, 0xF1, 0x0A, 0x39, 0xC0, + 0x89, 0x63, 0x72, 0xD1, 0xC5, 0xE8, 0x46, 0xB2, 0xA0, 0x09, 0x64, 0xC4, + 0x0C, 0x67, 0x0C, 0xD2, 0xD0, 0x4D, 0xE8, 0x68, 0xF2, 0x0E, 0xA2, 0x90, + 0x0D, 0xDD, 0xB0, 0x0E, 0xFE, 0x80, 0xD2, 0x75, 0x02, 0x04, 0xFE, 0x82, + 0x09, 0x84, 0x74, 0xA6, 0xFA, 0xD0, 0x57, 0x66, 0x30, 0x08, 0xE7, 0x33, + 0xB7, 0x2C, 0x90, 0x85, 0x65, 0x80, 0x02, 0x92, 0x93, 0x00, 0x12, 0xF0, + 0x09, 0xA4, 0x99, 0x0D, 0xAD, 0x40, 0x57, 0xA7, 0x30, 0x04, 0xB9, 0xF4, + 0x03, 0xBB, 0xE2, 0x03, 0x36, 0x60, 0x67, 0x0E, 0xD0, 0x01, 0x2B, 0x50, + 0x4C, 0x69, 0x00, 0x5A, 0xA5, 0x95, 0x02, 0x67, 0x80, 0x06, 0xD7, 0x84, + 0x4D, 0x78, 0x10, 0x68, 0x2B, 0x30, 0xBF, 0x9F, 0xEC, 0x48, 0x2D, 0x60, + 0x81, 0x29, 0x50, 0x02, 0x08, 0x2E, 0x0B, 0xDA, 0x20, 0x0B, 0x2E, 0x07, + 0x38, 0x3A, 0x30, 0x00, 0x27, 0xD0, 0x3E, 0x6A, 0x20, 0xFE, 0x06, 0xD2, + 0x65, 0x06, 0x8E, 0x1A, 0x5C, 0x02, 0x6E, 0x3B, 0xAB, 0xC6, 0x1B, 0x00, + 0xC9, 0x1B, 0x90, 0x2A, 0x85, 0xD3, 0x23, 0x16, 0xCA, 0x43, 0x9B, 0x5C, + 0x77, 0x06, 0x64, 0x20, 0x08, 0x61, 0x70, 0x06, 0x75, 0x90, 0x07, 0x87, + 0x90, 0x4E, 0x85, 0x70, 0x08, 0xE8, 0x6E, 0x5D, 0x6E, 0x80, 0x5C, 0x62, + 0x30, 0x6C, 0x70, 0x00, 0xC2, 0x9D, 0xB7, 0x08, 0x8F, 0xD0, 0x07, 0x7E, + 0xD0, 0x07, 0x0B, 0x80, 0x09, 0x74, 0xA4, 0x57, 0xD6, 0xE0, 0x0A, 0x4D, + 0x60, 0x53, 0x45, 0x30, 0x0A, 0x43, 0x83, 0xCE, 0xFB, 0x01, 0xC4, 0xD1, + 0x40, 0x88, 0x7A, 0xF4, 0xCE, 0x10, 0x01, 0x0D, 0xBF, 0x00, 0x23, 0xDF, + 0xF0, 0x0D, 0x0F, 0xC6, 0x31, 0x1C, 0x24, 0x0A, 0x45, 0x20, 0x04, 0x56, + 0x22, 0x0A, 0x43, 0xF0, 0x4B, 0x04, 0x30, 0x07, 0xEB, 0xB0, 0xB0, 0xC8, + 0x9B, 0xAE, 0x0B, 0x41, 0x26, 0xAC, 0x40, 0xEA, 0x03, 0x35, 0x31, 0xCA, + 0x47, 0x0A, 0xA6, 0x5D, 0x04, 0x98, 0x20, 0x0A, 0xB4, 0x70, 0x0D, 0xBE, + 0xCD, 0x45, 0xAD, 0x8B, 0x63, 0x42, 0xD1, 0x15, 0xD7, 0xB0, 0x43, 0xBA, + 0x00, 0x0B, 0xCB, 0xB0, 0xE7, 0x6D, 0x83, 0x13, 0xA8, 0xC0, 0x55, 0x0E, + 0xCE, 0xDC, 0x60, 0x13, 0x8D, 0x0F, 0x5D, 0xE8, 0x6B, 0xF2, 0x0D, 0xA5, + 0x20, 0xEA, 0x2E, 0x07, 0x0B, 0x50, 0x4C, 0xA6, 0x43, 0x50, 0x0B, 0xC0, + 0x4D, 0x07, 0x32, 0xE0, 0x06, 0x88, 0xA0, 0x07, 0x62, 0xC0, 0x73, 0x29, + 0x50, 0x9D, 0x63, 0x80, 0x06, 0x1D, 0x00, 0x00, 0x09, 0xF0, 0x00, 0xA3, + 0x40, 0x9A, 0xD7, 0x88, 0x09, 0x45, 0x10, 0x0B, 0xA7, 0xFE, 0xDE, 0x3F, + 0x00, 0x04, 0x3E, 0x60, 0x67, 0x97, 0x61, 0x3D, 0xA2, 0xE5, 0x82, 0x83, + 0xA2, 0x02, 0xD6, 0x61, 0x9B, 0x29, 0xE0, 0x06, 0x9C, 0x5C, 0x3E, 0xCA, + 0xFE, 0x83, 0xC0, 0xBC, 0x01, 0xEB, 0xB4, 0x05, 0x02, 0x13, 0x00, 0x01, + 0xB2, 0xD0, 0x0D, 0x1D, 0xAD, 0x0D, 0xCA, 0xC0, 0x0C, 0x3A, 0x00, 0x00, + 0x32, 0x20, 0xC0, 0x6E, 0x10, 0x5D, 0x6D, 0x10, 0x06, 0x89, 0x2C, 0x83, + 0x32, 0x80, 0x1A, 0xA8, 0xCA, 0x6A, 0xAC, 0xE6, 0x38, 0x92, 0x41, 0x06, + 0xC7, 0xB1, 0x1B, 0xBF, 0x61, 0x75, 0x4E, 0x1D, 0x06, 0xCA, 0x8C, 0x07, + 0x2A, 0x5B, 0x07, 0x7B, 0xA0, 0xEE, 0xFD, 0xD9, 0xCC, 0x70, 0x3B, 0x08, + 0x99, 0x26, 0x06, 0x38, 0x5E, 0xCD, 0x86, 0xB0, 0x1D, 0x8A, 0xC0, 0x08, + 0x42, 0x19, 0x07, 0x0C, 0xE0, 0x09, 0x6C, 0x95, 0x0F, 0x56, 0x05, 0x0F, + 0xDE, 0xE0, 0x0A, 0x98, 0x10, 0x17, 0x02, 0x0F, 0x0B, 0xD3, 0x40, 0x80, + 0xDA, 0x16, 0x0D, 0x08, 0x71, 0x1F, 0xD2, 0xF0, 0x1F, 0x14, 0x33, 0x0A, + 0x4D, 0x10, 0x11, 0xD7, 0x50, 0x41, 0x0F, 0xF1, 0x0A, 0x39, 0xAA, 0x97, + 0x39, 0x3A, 0x04, 0x47, 0x30, 0x1A, 0x9E, 0xB0, 0x0D, 0x16, 0x31, 0x11, + 0x67, 0x94, 0x0C, 0x45, 0x62, 0x89, 0xF8, 0x21, 0x30, 0x34, 0xC2, 0x0A, + 0x19, 0x93, 0x0C, 0xF1, 0xA1, 0xCF, 0xB6, 0xB0, 0x51, 0x29, 0xE1, 0x0A, + 0xBF, 0x90, 0x98, 0x5D, 0x41, 0x55, 0x3D, 0xF1, 0xD2, 0x47, 0xE9, 0x6F, + 0x0A, 0x24, 0xF2, 0x19, 0x71, 0x46, 0xD1, 0x30, 0x37, 0xF9, 0xC7, 0x25, + 0x6E, 0x34, 0x0A, 0x81, 0x0C, 0x8D, 0x8E, 0x59, 0xF4, 0x46, 0x41, 0xF4, + 0x3F, 0x01, 0x10, 0xB5, 0x6A, 0x75, 0xEB, 0x96, 0x6D, 0xDA, 0xAC, 0x58, + 0xA9, 0xE6, 0xD0, 0x49, 0x35, 0xA4, 0x9A, 0x3E, 0x88, 0x11, 0x23, 0xEE, + 0xFB, 0x21, 0x43, 0x8F, 0x1E, 0x42, 0x67, 0x58, 0xA4, 0x68, 0xD1, 0x22, + 0x85, 0x1A, 0x31, 0x0E, 0x06, 0x2C, 0x90, 0x20, 0x4A, 0x1D, 0x35, 0x6D, + 0xB2, 0x30, 0x61, 0xFE, 0x52, 0x35, 0x64, 0x82, 0x0E, 0x1F, 0x3E, 0x74, + 0x0C, 0xF9, 0x31, 0x01, 0xC0, 0x02, 0x06, 0x0C, 0x50, 0x9C, 0x20, 0xE1, + 0xE2, 0x43, 0xCF, 0x14, 0x65, 0xCA, 0xAC, 0x50, 0x13, 0x26, 0xCC, 0x0A, + 0x31, 0x62, 0x5E, 0xA4, 0x70, 0xC1, 0x02, 0x85, 0x0A, 0x14, 0x1C, 0x56, + 0x90, 0x20, 0x91, 0x62, 0xC4, 0x04, 0x09, 0xAA, 0xB6, 0x2D, 0x8B, 0xA6, + 0x2D, 0x1A, 0xB3, 0x1C, 0x03, 0x3A, 0xB4, 0xD1, 0x23, 0x08, 0x8D, 0x99, + 0x34, 0x6A, 0xCA, 0xA8, 0x39, 0xA3, 0x62, 0xC4, 0x08, 0x15, 0x29, 0x56, + 0xA8, 0x20, 0x81, 0x02, 0x05, 0x89, 0x13, 0x23, 0xA4, 0x96, 0x41, 0x91, + 0xE2, 0x45, 0x5C, 0x17, 0x46, 0x53, 0xA0, 0x08, 0xF3, 0xC6, 0x4D, 0x99, + 0x16, 0x63, 0xCE, 0xE4, 0x41, 0x44, 0x28, 0x52, 0x21, 0x44, 0x91, 0x23, + 0x21, 0x2A, 0x64, 0x26, 0x45, 0x18, 0x34, 0x70, 0x34, 0xEB, 0x79, 0xB3, + 0x87, 0x0F, 0x23, 0x3F, 0x8A, 0x6A, 0x8C, 0xF8, 0xA4, 0x6F, 0x9F, 0x44, + 0xD4, 0xA9, 0x55, 0xAF, 0x5E, 0x7D, 0xFA, 0xB4, 0x69, 0x6F, 0xB4, 0x44, + 0x15, 0x29, 0x32, 0x27, 0x14, 0x2C, 0x68, 0xDB, 0xB6, 0x65, 0x43, 0x39, + 0xCD, 0x37, 0x2D, 0x68, 0x9E, 0x9A, 0x54, 0xB3, 0x56, 0xFC, 0x17, 0xB4, + 0x5F, 0xBA, 0x5C, 0x85, 0x12, 0x45, 0xE4, 0x93, 0x27, 0x22, 0xFF, 0x66, + 0x10, 0x20, 0xF0, 0x69, 0x5B, 0xB4, 0xAE, 0xD0, 0xA2, 0x41, 0xD3, 0x2E, + 0x0B, 0x19, 0xB4, 0x65, 0xBA, 0x62, 0xC1, 0xA2, 0x55, 0x7E, 0xD9, 0xAC, + 0x57, 0xB2, 0x64, 0xBD, 0xD2, 0x95, 0x4C, 0x97, 0x34, 0x69, 0xB0, 0x48, + 0x59, 0x11, 0x3E, 0xAA, 0x94, 0x2E, 0x6C, 0xEF, 0xF0, 0xED, 0x7B, 0x0D, + 0x71, 0x5F, 0x3E, 0x7D, 0xDE, 0xC9, 0xA1, 0x08, 0x59, 0x5C, 0xD1, 0xA5, + 0x2B, 0xEC, 0x96, 0xE9, 0xEE, 0x93, 0xFE, 0x50, 0xD4, 0x8B, 0x05, 0xBB, + 0x51, 0xE0, 0x61, 0x6D, 0x42, 0x0A, 0x53, 0xEB, 0xAF, 0x42, 0x0C, 0x33, + 0xD4, 0x70, 0x43, 0x0E, 0x39, 0xCC, 0x47, 0x95, 0x69, 0x08, 0x9A, 0xC6, + 0x1F, 0x84, 0x30, 0x19, 0x02, 0x14, 0x4C, 0x84, 0xF0, 0x46, 0xB5, 0xD3, + 0xBC, 0x29, 0xE1, 0x05, 0x3D, 0xF0, 0xC0, 0x03, 0x29, 0x12, 0xC4, 0xE8, + 0x48, 0x8D, 0x16, 0x16, 0x08, 0xC0, 0x81, 0x08, 0x88, 0xA0, 0x26, 0x9B, + 0x6C, 0x5C, 0x59, 0x29, 0x94, 0x20, 0x0E, 0x98, 0xE1, 0x87, 0x1F, 0x7C, + 0x18, 0x62, 0x08, 0x05, 0x06, 0x48, 0x80, 0x84, 0x11, 0x48, 0xA0, 0x8B, + 0x2E, 0x31, 0x5C, 0x48, 0x21, 0x8D, 0xB6, 0xCE, 0x38, 0xC3, 0x46, 0xC4, + 0xC2, 0x38, 0xE1, 0xB2, 0x14, 0x54, 0x70, 0xAB, 0xAF, 0xC1, 0x48, 0x98, + 0xE0, 0x81, 0x53, 0xB6, 0xF1, 0x07, 0x3B, 0xEC, 0x86, 0x18, 0x40, 0x05, + 0x31, 0xDC, 0x20, 0x04, 0x0D, 0x31, 0xCE, 0xC0, 0x63, 0x0C, 0x37, 0xEA, + 0x58, 0x61, 0x05, 0xBF, 0x5A, 0xE0, 0xC9, 0xAA, 0x9D, 0xA0, 0x24, 0x21, + 0x8D, 0x15, 0x44, 0x20, 0x6C, 0x05, 0x10, 0x5A, 0x10, 0x63, 0x85, 0x30, + 0xEA, 0x0C, 0xC3, 0x8D, 0x36, 0x5C, 0x30, 0xA3, 0x8D, 0x3A, 0x0A, 0x39, + 0x04, 0x91, 0x4B, 0x0F, 0x99, 0x0C, 0x91, 0x3D, 0xD6, 0x10, 0x63, 0x8C, + 0x34, 0xDE, 0xC8, 0x6C, 0x33, 0x43, 0x26, 0xE1, 0xC3, 0x0F, 0x18, 0x62, + 0x08, 0xA5, 0x43, 0x56, 0x51, 0xCB, 0xE7, 0x42, 0x7D, 0xF2, 0x81, 0xA7, + 0x1A, 0x5B, 0x46, 0xF9, 0x84, 0x08, 0x4F, 0x64, 0xD1, 0x66, 0x9B, 0x75, + 0xA8, 0xD9, 0x4E, 0x1A, 0x4F, 0x30, 0xB1, 0xE6, 0x1B, 0x6B, 0xAE, 0xF9, + 0xE5, 0x97, 0x57, 0xA0, 0xD1, 0x65, 0x94, 0x53, 0x70, 0xF5, 0xC4, 0x93, + 0x21, 0x6E, 0x78, 0xA0, 0xBA, 0x6E, 0xB4, 0xB1, 0xD6, 0xFE, 0xB7, 0x69, + 0xA2, 0x99, 0x66, 0x19, 0x6E, 0xB5, 0x5B, 0x46, 0x3D, 0x59, 0x14, 0xE4, + 0x0E, 0x38, 0xF0, 0x68, 0x99, 0x05, 0x16, 0xF6, 0xA0, 0xA9, 0x26, 0x9B, + 0xF8, 0x6A, 0xF5, 0x64, 0x14, 0x51, 0x60, 0xA1, 0x46, 0x42, 0xD4, 0xDE, + 0xD1, 0xC1, 0x08, 0x59, 0x56, 0xD1, 0xD5, 0xDA, 0x68, 0x64, 0x51, 0xA6, + 0xDF, 0x54, 0x40, 0x61, 0x25, 0x16, 0x64, 0xB0, 0x0B, 0x85, 0xDE, 0x56, + 0x13, 0x56, 0x78, 0x61, 0x86, 0x1B, 0x56, 0xAD, 0x1F, 0x51, 0x08, 0xAA, + 0x56, 0x99, 0x64, 0x5A, 0xC2, 0x24, 0x15, 0x3A, 0x30, 0xE1, 0x87, 0xB5, + 0x59, 0x3C, 0x68, 0x63, 0x10, 0x3C, 0xCC, 0x58, 0xE1, 0x85, 0x16, 0x36, + 0x32, 0x43, 0x0D, 0x34, 0x74, 0x74, 0xA0, 0x02, 0x22, 0x92, 0x01, 0x12, + 0x96, 0x4F, 0xE2, 0x1D, 0x42, 0x82, 0x1C, 0x62, 0x52, 0xD2, 0x07, 0x9B, + 0x1A, 0x60, 0x60, 0x84, 0x0E, 0xE8, 0xDA, 0xB3, 0xA3, 0x30, 0x5A, 0x48, + 0xC3, 0xA8, 0xA1, 0x4E, 0xD8, 0x28, 0x0C, 0x0F, 0x3A, 0x6A, 0xE1, 0x85, + 0x3D, 0xE7, 0xAA, 0x6A, 0x04, 0x05, 0x20, 0x18, 0x65, 0x9B, 0x6C, 0xBD, + 0x8A, 0xC6, 0xCD, 0x17, 0xE2, 0x24, 0x44, 0x0D, 0x37, 0x64, 0x74, 0x83, + 0xAD, 0x33, 0xCA, 0x48, 0x81, 0x84, 0x30, 0x36, 0x22, 0x74, 0x84, 0xBB, + 0x06, 0xEB, 0x0B, 0xAA, 0x31, 0xAC, 0xF4, 0xE8, 0x29, 0x3C, 0xE0, 0x70, + 0xA3, 0xED, 0x16, 0xC2, 0xA8, 0x43, 0x0F, 0xCA, 0x2E, 0x75, 0x0C, 0x91, + 0xC7, 0x04, 0x69, 0x23, 0x29, 0x34, 0xD2, 0x08, 0xFC, 0x0D, 0x42, 0xF6, + 0x30, 0x84, 0x11, 0x3E, 0xF8, 0xB8, 0x03, 0x06, 0x56, 0x1C, 0xD6, 0x10, + 0x40, 0x89, 0xF8, 0x9B, 0x48, 0x1F, 0x7C, 0xAA, 0x19, 0xC5, 0x08, 0x1C, + 0x84, 0x58, 0x65, 0x19, 0x6D, 0xB2, 0xD1, 0x86, 0xBE, 0xE2, 0x8A, 0xAB, + 0xFE, 0xA6, 0x1A, 0xF6, 0x64, 0xF9, 0xE4, 0x56, 0x68, 0x31, 0x99, 0xE3, + 0x06, 0x02, 0x1E, 0xF8, 0xC4, 0x2B, 0xD8, 0xB3, 0x85, 0x46, 0x16, 0x65, + 0x97, 0x41, 0x46, 0xC1, 0x6F, 0x65, 0xC1, 0x6D, 0x96, 0xD9, 0x75, 0x09, + 0x97, 0x3B, 0x6A, 0xA6, 0xA1, 0x45, 0x20, 0x57, 0x80, 0xBB, 0xC6, 0x9A, + 0x6A, 0x94, 0xB3, 0xE5, 0xDD, 0x51, 0x6A, 0xF9, 0x85, 0x1C, 0x88, 0xF0, + 0xD1, 0xE1, 0x1F, 0x56, 0x6C, 0x91, 0xA5, 0x2B, 0x6D, 0xB8, 0x65, 0xA6, + 0xDF, 0x50, 0x50, 0x59, 0x05, 0x15, 0x65, 0x98, 0xD1, 0xE6, 0x60, 0xC7, + 0xCB, 0x37, 0xFF, 0xFC, 0xF3, 0x7F, 0x89, 0x38, 0x9B, 0x6E, 0xFC, 0x21, + 0x11, 0x95, 0x8C, 0x53, 0x01, 0xC2, 0x95, 0xD6, 0xF4, 0x09, 0xC5, 0x03, + 0x8C, 0x0E, 0x51, 0x63, 0x85, 0x33, 0x5E, 0x38, 0x41, 0x51, 0x3A, 0x2D, + 0x20, 0x01, 0x0A, 0xA8, 0xC0, 0x28, 0xA6, 0x01, 0x24, 0x55, 0x78, 0xE2, + 0x13, 0xB0, 0x98, 0x59, 0x4C, 0xE8, 0x30, 0x04, 0x23, 0x0C, 0xC1, 0x04, + 0x01, 0x60, 0x00, 0x09, 0x42, 0xC0, 0x80, 0x10, 0xA8, 0x01, 0x2E, 0x8A, + 0x3A, 0x43, 0x18, 0xDA, 0xE0, 0x86, 0x17, 0x1C, 0x65, 0x05, 0x2E, 0x98, + 0x8A, 0x0B, 0x80, 0x16, 0x86, 0x31, 0x94, 0x21, 0x0C, 0x76, 0xB9, 0xCB, + 0x04, 0x6E, 0x10, 0x8A, 0x6D, 0xA0, 0x04, 0x76, 0x98, 0x10, 0x40, 0x18, + 0x2E, 0x22, 0x23, 0x41, 0xE0, 0xC1, 0x0D, 0x73, 0x6B, 0xD4, 0xA2, 0xE8, + 0x12, 0x06, 0xB9, 0xA0, 0x60, 0x05, 0x23, 0xD8, 0x53, 0x07, 0x1A, 0x55, + 0x97, 0x16, 0xEC, 0xE4, 0x04, 0x0A, 0x20, 0x41, 0x0B, 0xF2, 0xD0, 0x86, + 0x36, 0x40, 0xE9, 0x04, 0x63, 0x30, 0x43, 0x1D, 0x10, 0x91, 0x87, 0xFC, + 0x4D, 0x26, 0x12, 0x87, 0x00, 0x19, 0x19, 0xC6, 0x50, 0x32, 0x51, 0xA9, + 0x41, 0x10, 0x7B, 0xFE, 0xB8, 0x94, 0x22, 0xEE, 0xC0, 0x07, 0x18, 0x2C, + 0x03, 0x7D, 0x0A, 0xFB, 0x4F, 0xAC, 0xF0, 0x61, 0x8D, 0x55, 0xFC, 0xC3, + 0x08, 0x41, 0x20, 0x42, 0x28, 0x8A, 0xE0, 0x09, 0x6C, 0x84, 0x4E, 0x17, + 0xBA, 0x60, 0x8F, 0x2B, 0x6C, 0xF1, 0x9C, 0x39, 0x3C, 0xCB, 0x13, 0xAC, + 0x23, 0x80, 0x27, 0xB6, 0x93, 0x3D, 0xED, 0x78, 0x05, 0x3C, 0xE1, 0x12, + 0xD7, 0x2C, 0x68, 0x31, 0xB0, 0x59, 0xF0, 0x6E, 0x16, 0xDC, 0xD2, 0x85, + 0x82, 0x68, 0xC7, 0x1D, 0x68, 0x6C, 0x8B, 0x16, 0xB2, 0x88, 0x24, 0x34, + 0xA8, 0xB1, 0x0D, 0x6B, 0x48, 0x43, 0x36, 0xA3, 0x20, 0xC2, 0x28, 0x8A, + 0x77, 0x03, 0x22, 0xB0, 0x82, 0x15, 0x07, 0xB2, 0x16, 0xB7, 0xB0, 0x23, + 0x8B, 0x50, 0x7C, 0x82, 0x15, 0x9B, 0xC3, 0xCE, 0x27, 0xA0, 0xB7, 0x46, + 0x5C, 0xE6, 0x52, 0x97, 0x2C, 0xDA, 0xC7, 0x2B, 0x6A, 0xE1, 0x0D, 0x82, + 0xF8, 0x83, 0x19, 0xB0, 0x3C, 0x11, 0x26, 0x80, 0xF0, 0x10, 0x58, 0x99, + 0x06, 0x1F, 0x3E, 0x90, 0xC1, 0x21, 0x1C, 0xB3, 0xBF, 0xB9, 0xA4, 0xA0, + 0x4E, 0x7F, 0x13, 0xE0, 0x02, 0x76, 0xA0, 0x0A, 0x20, 0x65, 0x03, 0x16, + 0xA2, 0x60, 0x49, 0x10, 0x2C, 0x90, 0x24, 0x3A, 0x3C, 0x10, 0x13, 0x11, + 0x18, 0x89, 0x0A, 0x7E, 0x42, 0x02, 0x35, 0x74, 0x20, 0x0D, 0x62, 0x18, + 0x44, 0x1A, 0xCC, 0x50, 0x99, 0x36, 0x98, 0x21, 0x29, 0x27, 0xD8, 0x13, + 0xC9, 0x54, 0x10, 0x86, 0x32, 0x8C, 0x41, 0x0C, 0x50, 0x59, 0x41, 0x5F, + 0x18, 0x50, 0x01, 0x4F, 0x04, 0xCF, 0x1F, 0xDA, 0x50, 0xC6, 0xF8, 0x0C, + 0x60, 0x11, 0x3C, 0xB4, 0x01, 0x0F, 0x84, 0xC0, 0x83, 0x1A, 0xD4, 0x10, + 0x32, 0x31, 0x04, 0xCD, 0x23, 0x2D, 0x20, 0xC1, 0x0A, 0xBE, 0xA4, 0x82, + 0x17, 0x44, 0x69, 0x69, 0x23, 0xF4, 0xFE, 0x13, 0x09, 0x3A, 0xC0, 0x81, + 0x14, 0xAC, 0x61, 0x10, 0x83, 0x30, 0x83, 0x3A, 0x5F, 0x50, 0x07, 0x94, + 0x16, 0x42, 0x0D, 0x66, 0xC0, 0x03, 0x22, 0x12, 0x11, 0x89, 0xC9, 0x08, + 0xA2, 0x0E, 0x63, 0x90, 0xE8, 0xE0, 0x34, 0x63, 0x88, 0x48, 0x18, 0x82, + 0x0F, 0x86, 0x70, 0x41, 0x34, 0x4C, 0xB3, 0x4B, 0x0E, 0xF1, 0x07, 0x40, + 0xAF, 0x22, 0x07, 0x2D, 0x3C, 0x11, 0x84, 0x1C, 0xE4, 0x40, 0x1A, 0xC7, + 0xAB, 0x46, 0x72, 0x6A, 0x51, 0xBC, 0x51, 0x84, 0x02, 0x13, 0x75, 0xF4, + 0x84, 0x10, 0x08, 0x69, 0x48, 0xEC, 0xF8, 0x8A, 0x4D, 0xAD, 0x04, 0x0F, + 0x77, 0x62, 0x31, 0x0B, 0x64, 0x44, 0xF2, 0x5B, 0xBC, 0xDB, 0xCE, 0x79, + 0x2E, 0xE9, 0x4A, 0xEE, 0x68, 0x4B, 0x59, 0xB2, 0x60, 0x85, 0x7A, 0x68, + 0x31, 0x0D, 0x6A, 0xC0, 0x62, 0x15, 0x7F, 0x8C, 0x00, 0x26, 0x56, 0xE1, + 0x0A, 0x05, 0x51, 0x83, 0x1A, 0xBA, 0x00, 0x4F, 0xBF, 0x30, 0xD1, 0xA0, + 0x58, 0x70, 0x25, 0x1A, 0x9E, 0x40, 0x18, 0x50, 0x0D, 0xBB, 0xB0, 0x64, + 0xEA, 0x72, 0x1F, 0xA2, 0xF0, 0x47, 0x41, 0xD6, 0xE1, 0x8F, 0x5A, 0xC4, + 0x62, 0x25, 0xF0, 0xA3, 0x03, 0x38, 0x58, 0x83, 0x8D, 0x12, 0x9C, 0x01, + 0x11, 0x82, 0x38, 0x44, 0x19, 0xE0, 0xA4, 0x02, 0xA4, 0x7C, 0x30, 0x0C, + 0x0E, 0x70, 0xC0, 0x04, 0x82, 0x80, 0x8B, 0x69, 0x74, 0xAE, 0x15, 0x7F, + 0x85, 0x05, 0x10, 0x4C, 0x10, 0x93, 0x25, 0xD1, 0x21, 0x10, 0x13, 0x1C, + 0x40, 0x0A, 0x3A, 0xD0, 0x81, 0x1A, 0x91, 0xC0, 0x0C, 0x66, 0xE8, 0x60, + 0x43, 0xD1, 0x70, 0x98, 0x34, 0x94, 0x21, 0x29, 0x42, 0xE9, 0xA0, 0xA2, + 0x84, 0x92, 0x02, 0xE4, 0xC6, 0x65, 0x01, 0x10, 0xF0, 0xC4, 0x01, 0x67, + 0x11, 0xBE, 0x75, 0xA4, 0x62, 0x02, 0x1C, 0x08, 0xD9, 0xFE, 0xDD, 0x06, + 0x41, 0x08, 0x3D, 0x8C, 0x41, 0x46, 0x2A, 0xE4, 0x88, 0x09, 0x2D, 0xDA, + 0xA8, 0x14, 0xB0, 0x60, 0x04, 0xFF, 0x43, 0xAE, 0x0B, 0xD6, 0x80, 0x02, + 0x10, 0x84, 0xA0, 0xA2, 0x2E, 0x68, 0x03, 0x1C, 0x06, 0x93, 0x02, 0x10, + 0x9C, 0x61, 0x0F, 0x58, 0x84, 0x94, 0x1E, 0x26, 0x93, 0x08, 0x4C, 0x71, + 0x11, 0x31, 0x6C, 0x40, 0x03, 0xA8, 0xC8, 0x00, 0x87, 0x37, 0xC0, 0x41, + 0x12, 0x86, 0xD0, 0xA9, 0x0A, 0x7C, 0x9A, 0xD8, 0xC3, 0x4E, 0x68, 0x1F, + 0xFC, 0xC0, 0x47, 0xAC, 0xE4, 0x01, 0x0F, 0xE8, 0x50, 0xA3, 0x58, 0xA3, + 0x13, 0xA5, 0x72, 0x44, 0x31, 0x0A, 0x52, 0xC6, 0xD2, 0x08, 0xD2, 0x22, + 0x00, 0x26, 0xD4, 0x61, 0xB5, 0xCE, 0x95, 0x75, 0x19, 0xA9, 0x8D, 0xC6, + 0x32, 0x60, 0xA1, 0xBB, 0xDB, 0xD9, 0x4E, 0x92, 0xB2, 0x20, 0xD8, 0x77, + 0x66, 0xA7, 0x8C, 0x6E, 0x75, 0x35, 0x41, 0xB4, 0x9B, 0x85, 0xEE, 0x56, + 0xB1, 0x8A, 0x59, 0x7A, 0x42, 0x02, 0x44, 0x70, 0xC5, 0x2A, 0xD2, 0x5A, + 0x62, 0x6E, 0x2D, 0x83, 0x15, 0xA1, 0x08, 0x45, 0x2C, 0x58, 0x21, 0xD8, + 0x4F, 0x14, 0x36, 0xC1, 0x4B, 0x66, 0xF2, 0x86, 0xE0, 0x21, 0x0A, 0x6E, + 0x10, 0x44, 0x1B, 0xC2, 0x54, 0xC5, 0xC5, 0xE4, 0xA7, 0x31, 0x16, 0xC1, + 0x63, 0x14, 0x23, 0xC0, 0xC3, 0xA5, 0x06, 0x21, 0x86, 0x13, 0x1C, 0xA5, + 0x05, 0x42, 0x59, 0xD4, 0x02, 0x1C, 0xA0, 0x80, 0x1D, 0x0C, 0xC4, 0x37, + 0xB0, 0x58, 0x09, 0x03, 0x2B, 0xE0, 0x40, 0x20, 0xA8, 0x6E, 0x06, 0x4E, + 0x52, 0x01, 0x6E, 0x93, 0xF6, 0x02, 0x16, 0xB0, 0x40, 0x0C, 0x7B, 0xD0, + 0x03, 0x0B, 0xD4, 0x02, 0x44, 0x77, 0xA6, 0x81, 0x05, 0x2D, 0x30, 0x83, + 0x0B, 0xC4, 0x80, 0x07, 0x34, 0xB4, 0xE1, 0x50, 0x28, 0x68, 0x41, 0x08, + 0xFE, 0x22, 0x60, 0x05, 0x5A, 0x10, 0x94, 0x4D, 0xB1, 0xD0, 0xC1, 0x00, + 0xE4, 0x24, 0x08, 0x42, 0x34, 0x06, 0x11, 0x3A, 0xD4, 0x43, 0x0B, 0xC4, + 0xC4, 0x34, 0x4F, 0x57, 0x05, 0x88, 0x56, 0x39, 0xC1, 0x52, 0x18, 0xFD, + 0x86, 0x21, 0x6E, 0xC4, 0x23, 0x20, 0x10, 0xA2, 0x0B, 0x3C, 0x2A, 0x86, + 0x42, 0xE8, 0x41, 0xBE, 0x6E, 0x18, 0x04, 0xDF, 0x60, 0x5A, 0xEB, 0x48, + 0xAC, 0xE1, 0x4A, 0xFF, 0x65, 0xC1, 0x18, 0xD0, 0x90, 0x99, 0xC9, 0x14, + 0x82, 0x0F, 0x06, 0x96, 0x5C, 0x93, 0x37, 0xB4, 0x8F, 0x7E, 0x90, 0xC3, + 0x0A, 0xA2, 0x38, 0x9E, 0xE8, 0x90, 0x05, 0x8D, 0x52, 0x30, 0x0B, 0x13, + 0x45, 0x20, 0x72, 0x10, 0x74, 0x40, 0x80, 0x02, 0xCC, 0x61, 0x1D, 0xBB, + 0xDA, 0x4E, 0x76, 0xA0, 0x81, 0x8C, 0x64, 0x4C, 0x63, 0x76, 0xB0, 0x20, + 0x58, 0x78, 0x96, 0x11, 0x8B, 0x70, 0x21, 0x83, 0xC5, 0x29, 0xBE, 0x1D, + 0x9B, 0x62, 0xEC, 0x1D, 0xEF, 0x28, 0x43, 0x3B, 0x5D, 0xB1, 0x1D, 0x2B, + 0xE6, 0xB0, 0xE3, 0xBB, 0x66, 0x52, 0x1B, 0xDB, 0xFA, 0x16, 0x34, 0x56, + 0x11, 0x8A, 0x21, 0xA3, 0x82, 0x4D, 0x9E, 0xE8, 0x87, 0xB1, 0x0D, 0x7E, + 0xF0, 0xD5, 0x70, 0xC3, 0x15, 0xDD, 0xE0, 0x86, 0xE7, 0x48, 0x24, 0xD9, + 0x54, 0xA4, 0x22, 0x08, 0xF4, 0x53, 0x8D, 0x3C, 0xDE, 0x31, 0x84, 0x13, + 0x38, 0x73, 0xD3, 0x63, 0x20, 0x5B, 0xD9, 0x3E, 0xD5, 0x82, 0x15, 0x28, + 0x60, 0x01, 0x0D, 0xC8, 0xC1, 0x01, 0xB3, 0xE1, 0x8F, 0x6D, 0x62, 0xC2, + 0x1F, 0x43, 0x88, 0x40, 0x4C, 0x16, 0xF2, 0x40, 0x1B, 0x04, 0x60, 0x24, + 0x1F, 0x65, 0x00, 0x45, 0x5F, 0x30, 0x29, 0x44, 0x0C, 0x42, 0x28, 0x66, + 0x40, 0xC3, 0xFF, 0xC4, 0x30, 0x29, 0x33, 0x18, 0x65, 0x05, 0x75, 0x08, + 0xC3, 0x19, 0xEA, 0xFE, 0xC6, 0xA7, 0x46, 0x3F, 0x60, 0x08, 0x70, 0xDD, + 0x2A, 0x33, 0x6E, 0x20, 0x00, 0x16, 0x6C, 0x11, 0x0F, 0x7A, 0x38, 0x84, + 0x24, 0xF0, 0x60, 0xA7, 0x30, 0x90, 0x20, 0xCF, 0x2C, 0xC0, 0xA8, 0x94, + 0xC6, 0x16, 0x82, 0x3F, 0x09, 0x31, 0x0C, 0x69, 0xD0, 0x7A, 0x0B, 0xD6, + 0xA0, 0x06, 0x29, 0xA9, 0x20, 0x0D, 0x1A, 0xD5, 0x03, 0x4A, 0xED, 0x84, + 0xB7, 0x42, 0xC0, 0xF4, 0x10, 0x9A, 0x4A, 0x44, 0x1D, 0xAE, 0xD4, 0x02, + 0x51, 0xFD, 0x3A, 0x33, 0x84, 0x38, 0x44, 0x21, 0xDC, 0xBB, 0x8E, 0x62, + 0x23, 0x1C, 0x43, 0xF9, 0x08, 0x85, 0x2A, 0xB8, 0xD1, 0xEC, 0x6A, 0x28, + 0xEB, 0x17, 0xAD, 0x38, 0x85, 0x28, 0x82, 0x25, 0x8A, 0x4F, 0x08, 0x01, + 0x07, 0xD8, 0xF6, 0xC4, 0x75, 0xAC, 0xD5, 0xCA, 0x03, 0x6D, 0xE7, 0xDB, + 0xFA, 0x02, 0x57, 0xB8, 0x38, 0x09, 0xD6, 0xDB, 0xA5, 0x1B, 0xC8, 0x5C, + 0xF9, 0x56, 0xE9, 0x67, 0x89, 0x8C, 0xB6, 0x72, 0x05, 0x1A, 0x05, 0x85, + 0xC6, 0x27, 0x8E, 0x40, 0x84, 0x56, 0xE0, 0x86, 0xC4, 0x95, 0xE4, 0x2B, + 0x2B, 0x64, 0xA9, 0xCA, 0xED, 0x45, 0x63, 0x14, 0xEF, 0x10, 0x7C, 0xEF, + 0x0D, 0xBE, 0x0F, 0x81, 0x10, 0xE4, 0xE4, 0xFE, 0xA8, 0xD8, 0xC5, 0x30, + 0x11, 0x84, 0x59, 0xAC, 0x86, 0x1F, 0xD8, 0x98, 0x41, 0x1A, 0x22, 0x31, + 0x52, 0x90, 0x90, 0x0D, 0x24, 0xC8, 0x45, 0xCC, 0x00, 0x18, 0xA0, 0x80, + 0x1B, 0x74, 0xCE, 0x37, 0x42, 0xC2, 0x04, 0x33, 0x74, 0x70, 0x83, 0x98, + 0xAC, 0x44, 0xB6, 0xE4, 0x1C, 0x80, 0xCE, 0x64, 0x30, 0x02, 0xB9, 0x98, + 0xE1, 0x05, 0x82, 0xC8, 0x61, 0x19, 0xF2, 0xFC, 0x82, 0xA2, 0xE0, 0x61, + 0x2D, 0x82, 0x30, 0x7A, 0x0B, 0x8A, 0x12, 0x42, 0x34, 0xB4, 0xA0, 0x04, + 0x2D, 0xB8, 0x4A, 0x10, 0x3C, 0xB9, 0xFE, 0x26, 0xEC, 0x60, 0x86, 0x40, + 0x80, 0x00, 0x0F, 0xE0, 0x9B, 0x3A, 0x58, 0xA8, 0x48, 0xF0, 0xB5, 0xDD, + 0x6A, 0x14, 0x89, 0xF2, 0x0B, 0xA6, 0xA1, 0x8A, 0xB7, 0x08, 0x01, 0x22, + 0x2A, 0x21, 0x21, 0xCA, 0x03, 0x90, 0x13, 0x1B, 0x4F, 0x43, 0x01, 0x17, + 0x08, 0x9B, 0x31, 0x40, 0x29, 0x41, 0xC0, 0x94, 0x2D, 0x2A, 0x04, 0xFC, + 0x8A, 0x04, 0x3D, 0xC9, 0x33, 0x36, 0x48, 0x83, 0x31, 0x78, 0x83, 0x34, + 0xD0, 0x03, 0x38, 0xF8, 0x40, 0x38, 0x60, 0x01, 0x9F, 0xF2, 0x3D, 0x0C, + 0xD9, 0x87, 0xE2, 0x41, 0x1E, 0x6B, 0x90, 0xB0, 0x5F, 0x48, 0x06, 0x73, + 0x59, 0x1E, 0x4F, 0x28, 0x02, 0x54, 0xF8, 0x84, 0x20, 0xC0, 0x81, 0x69, + 0xC9, 0x81, 0x07, 0xD9, 0x95, 0x6D, 0xF0, 0x8A, 0x6C, 0xE1, 0x1C, 0x4C, + 0x3A, 0x31, 0x64, 0xD8, 0xA4, 0x49, 0xFA, 0xB6, 0x61, 0xE2, 0x16, 0x64, + 0x68, 0xB7, 0x12, 0x83, 0xB1, 0x65, 0xB0, 0x42, 0x55, 0x52, 0x0F, 0x55, + 0x2A, 0x98, 0x68, 0x40, 0xB7, 0x4F, 0xE8, 0x11, 0x57, 0x80, 0x05, 0x5D, + 0xB0, 0x16, 0x6A, 0x10, 0x97, 0x6F, 0xF1, 0x04, 0x1C, 0x13, 0x38, 0xEC, + 0xD0, 0x84, 0x5B, 0x92, 0x41, 0x37, 0x04, 0x2A, 0x7B, 0x20, 0x05, 0x7F, + 0x88, 0xB2, 0x29, 0x63, 0x06, 0x58, 0x40, 0x05, 0xF1, 0x1B, 0x02, 0x6E, + 0x50, 0x0D, 0x7C, 0xC0, 0x87, 0x51, 0xE0, 0x00, 0x35, 0xC0, 0x14, 0x3C, + 0x10, 0x03, 0xF4, 0x5B, 0xA7, 0x17, 0x70, 0x81, 0x31, 0x68, 0x83, 0x15, + 0x58, 0x00, 0x05, 0x48, 0x80, 0x1D, 0x60, 0x1F, 0xF7, 0x51, 0x05, 0xA9, + 0x9A, 0x05, 0x98, 0x50, 0x12, 0x4C, 0x60, 0x88, 0x54, 0x20, 0x3F, 0x0F, + 0x60, 0x80, 0x8B, 0x62, 0x81, 0x32, 0x80, 0x22, 0x35, 0x68, 0x03, 0x35, + 0x18, 0x83, 0x15, 0x30, 0x03, 0xE1, 0x72, 0x83, 0x9F, 0xFE, 0x73, 0x83, + 0x33, 0x08, 0x8A, 0xFE, 0x52, 0x21, 0x34, 0x70, 0x01, 0x0E, 0x78, 0x01, + 0x14, 0x20, 0x80, 0x0A, 0x90, 0x86, 0xE1, 0xF3, 0x8A, 0x6C, 0x18, 0x40, + 0x07, 0x80, 0x83, 0xEB, 0xAA, 0x83, 0x4C, 0x83, 0x83, 0x3A, 0x38, 0x03, + 0xB4, 0xA0, 0x94, 0x3A, 0xB1, 0x11, 0xCB, 0x88, 0x12, 0x8B, 0xF2, 0xA8, + 0xB4, 0xF9, 0x13, 0x37, 0x38, 0x01, 0x31, 0xD0, 0xB5, 0xB2, 0x21, 0x01, + 0xA1, 0x08, 0x83, 0x2A, 0x62, 0x0C, 0x98, 0x4A, 0x84, 0x4B, 0xA1, 0x8C, + 0x42, 0xE0, 0x29, 0x17, 0x20, 0x03, 0x34, 0x60, 0x81, 0x50, 0xC9, 0x8C, + 0x41, 0xC8, 0x83, 0x44, 0x78, 0x03, 0x15, 0x50, 0x86, 0x37, 0x54, 0xB0, + 0x7C, 0x38, 0x05, 0x57, 0xA0, 0x06, 0xE2, 0xB8, 0x06, 0x6A, 0x48, 0x0E, + 0x65, 0x91, 0x2A, 0x68, 0x59, 0x05, 0x68, 0xB9, 0x01, 0x00, 0x30, 0x80, + 0x07, 0x38, 0x02, 0x23, 0xF0, 0x04, 0x56, 0xD0, 0x86, 0x75, 0x38, 0xC2, + 0x7D, 0xC3, 0xA4, 0xD9, 0x79, 0x42, 0x75, 0xFB, 0x36, 0x6E, 0x91, 0x05, + 0x66, 0x58, 0x86, 0x85, 0x64, 0x06, 0x2A, 0x2C, 0x31, 0xF5, 0xC8, 0x1D, + 0xB6, 0xF2, 0x0E, 0x23, 0xCB, 0x97, 0x50, 0x30, 0x82, 0x08, 0x98, 0x83, + 0x55, 0x40, 0x37, 0xB8, 0xD2, 0x86, 0x4A, 0x5A, 0x2B, 0x54, 0x08, 0x05, + 0x1C, 0xBB, 0x9E, 0x68, 0x48, 0xB2, 0x74, 0x3C, 0x49, 0x5C, 0x72, 0x07, + 0x51, 0xF8, 0x86, 0x82, 0x98, 0xB2, 0x5A, 0x98, 0x85, 0x54, 0xC0, 0x04, + 0x50, 0x18, 0x02, 0x4C, 0x48, 0x2C, 0x79, 0xF0, 0x86, 0x1D, 0x58, 0x81, + 0x0F, 0xCC, 0x88, 0x17, 0x08, 0x01, 0x15, 0xD8, 0x92, 0x7B, 0x3A, 0x03, + 0x35, 0x50, 0x81, 0x9C, 0xE0, 0x00, 0x1A, 0x68, 0xAC, 0x6C, 0xA0, 0x05, + 0xA9, 0xC2, 0x04, 0x4A, 0x73, 0x20, 0x4D, 0x40, 0x91, 0x54, 0x30, 0x01, + 0xFE, 0x91, 0x50, 0x80, 0x06, 0xA0, 0x0A, 0x29, 0x11, 0xA3, 0xDD, 0x32, + 0xC5, 0x9D, 0xC3, 0x0C, 0x85, 0x62, 0xA9, 0x32, 0xD8, 0x92, 0x33, 0x40, + 0x83, 0x0E, 0xB2, 0x91, 0x7B, 0x4A, 0x01, 0x03, 0x88, 0x00, 0x69, 0xA0, + 0x1A, 0xAF, 0x50, 0x86, 0x6C, 0x48, 0x05, 0x0B, 0x28, 0x00, 0x19, 0xC0, + 0x34, 0x8C, 0xE0, 0xBB, 0x8C, 0x18, 0x8A, 0x36, 0x58, 0x0B, 0x31, 0xF8, + 0xCA, 0xB3, 0x91, 0x81, 0x13, 0x10, 0x13, 0x10, 0x20, 0x81, 0x12, 0xB0, + 0xAD, 0x2F, 0xE9, 0x27, 0x3A, 0xD1, 0x40, 0x12, 0xF0, 0x35, 0xA3, 0xDB, + 0x2D, 0xC8, 0xE0, 0x1B, 0x2E, 0x82, 0x0C, 0x6C, 0x2C, 0x84, 0x30, 0x50, + 0x01, 0x18, 0xF0, 0xC6, 0x34, 0x80, 0x03, 0x34, 0x58, 0x83, 0xCD, 0x42, + 0x04, 0x34, 0x90, 0x01, 0x6D, 0x68, 0x18, 0x04, 0x2B, 0x1F, 0x00, 0xC1, + 0x07, 0x2B, 0x88, 0x85, 0xA5, 0x6A, 0x36, 0x68, 0xA0, 0x05, 0x5D, 0x50, + 0x4A, 0x05, 0x9A, 0x03, 0x59, 0xB2, 0x36, 0x34, 0x71, 0x85, 0x20, 0xB8, + 0x81, 0x23, 0x78, 0x80, 0x17, 0x8A, 0x86, 0x80, 0xDC, 0x8A, 0x70, 0xC1, + 0x0E, 0x64, 0xE0, 0xBC, 0x4B, 0xD2, 0x1D, 0x78, 0xB3, 0x9D, 0x2B, 0x54, + 0x06, 0x2B, 0xEC, 0x97, 0x61, 0x42, 0xB7, 0x88, 0x64, 0xB1, 0xB6, 0x42, + 0x85, 0x01, 0x61, 0x99, 0x55, 0x20, 0x17, 0x6D, 0xF0, 0x95, 0xEF, 0xF8, + 0x16, 0xDB, 0x1B, 0x49, 0xEC, 0xB0, 0x85, 0x77, 0xF8, 0x4C, 0x94, 0xCC, + 0x4E, 0x56, 0xF1, 0x07, 0x52, 0x28, 0x88, 0xF6, 0xA1, 0x32, 0x50, 0xC8, + 0x98, 0x21, 0x50, 0x85, 0x9F, 0x72, 0x15, 0x5C, 0x88, 0x01, 0x16, 0xE0, + 0x3B, 0x41, 0xD0, 0x03, 0x37, 0xB0, 0xA8, 0xAF, 0x64, 0x94, 0x33, 0x68, + 0x03, 0xF8, 0x22, 0x01, 0x0F, 0xE0, 0x01, 0xF6, 0x39, 0x39, 0x22, 0x63, + 0x4A, 0xF0, 0x1B, 0xFE, 0x82, 0x40, 0x90, 0x49, 0x4D, 0xF0, 0x3E, 0x00, + 0x18, 0x20, 0x9E, 0xE9, 0x00, 0xA3, 0x81, 0xA2, 0x05, 0x1C, 0xBB, 0x44, + 0x2B, 0x03, 0x33, 0x68, 0x3B, 0x31, 0x20, 0x3A, 0x7D, 0xD2, 0x92, 0xE2, + 0x3A, 0x0A, 0x31, 0x40, 0x81, 0x05, 0x78, 0x80, 0x59, 0xF0, 0x86, 0x69, + 0x60, 0x06, 0xE1, 0x8C, 0x06, 0x65, 0x00, 0x82, 0x09, 0x50, 0x00, 0x5A, + 0x1B, 0xA9, 0x0F, 0xCC, 0x13, 0x77, 0x72, 0xA8, 0x3F, 0xB3, 0x91, 0xB9, + 0x18, 0x21, 0x15, 0xF8, 0xCB, 0x2B, 0x91, 0x8B, 0x30, 0xD0, 0x35, 0x3F, + 0x39, 0x81, 0x9D, 0x18, 0x8B, 0xA1, 0x81, 0x3F, 0x87, 0x8A, 0xBB, 0xCD, + 0x32, 0x04, 0x4D, 0xB9, 0x2F, 0x33, 0x88, 0x01, 0x41, 0x43, 0x83, 0x37, + 0x08, 0x52, 0x38, 0xB0, 0x94, 0x3D, 0x00, 0xB3, 0x75, 0xD0, 0xCE, 0xD4, + 0xC0, 0x07, 0x4F, 0x70, 0x85, 0xE2, 0x68, 0xB6, 0xE4, 0xF8, 0x85, 0x6D, + 0xBA, 0x23, 0x4F, 0x98, 0x03, 0x5B, 0x18, 0x82, 0x1D, 0xE8, 0x81, 0x15, + 0x59, 0x30, 0x6F, 0xD0, 0x85, 0x41, 0xBA, 0x81, 0x7E, 0x64, 0x85, 0x82, + 0xDA, 0x86, 0xAE, 0x82, 0x86, 0x58, 0x40, 0x05, 0x54, 0x40, 0xB7, 0x85, + 0x04, 0x0F, 0xE0, 0xB4, 0x42, 0x18, 0xEB, 0x97, 0x58, 0x40, 0x53, 0x66, + 0x70, 0xC8, 0xEF, 0x60, 0x86, 0x33, 0x45, 0x85, 0x99, 0xC8, 0xC8, 0x55, + 0xD8, 0x23, 0xDF, 0xA0, 0x86, 0xDA, 0x99, 0x1D, 0xDB, 0x1B, 0x18, 0x92, + 0xFC, 0x84, 0xEB, 0xC4, 0x4E, 0x24, 0x2D, 0x54, 0x0A, 0x29, 0x85, 0x81, + 0x68, 0xB8, 0x69, 0xE0, 0xA4, 0x56, 0x20, 0x82, 0x95, 0x00, 0x82, 0x69, + 0x60, 0x11, 0x79, 0x20, 0x82, 0xBA, 0xC1, 0x94, 0xEC, 0xFA, 0x1B, 0xA5, + 0xE0, 0x93, 0x15, 0xC8, 0x3F, 0x14, 0xC8, 0x09, 0x05, 0xC8, 0x81, 0xE2, + 0xC8, 0x86, 0x64, 0x38, 0x85, 0x26, 0xFE, 0xC0, 0x04, 0x58, 0x00, 0x3F, + 0x1F, 0x08, 0x04, 0x50, 0x00, 0x85, 0x54, 0x60, 0x85, 0x4A, 0xBB, 0x89, + 0x0E, 0xF8, 0x00, 0xAB, 0xA8, 0x9B, 0x88, 0x72, 0xBF, 0x52, 0xFC, 0xC4, + 0x3A, 0x78, 0x28, 0x61, 0x34, 0x45, 0xC5, 0x80, 0xA2, 0x7C, 0x4A, 0x8A, + 0x9F, 0x5B, 0x81, 0x06, 0x30, 0x00, 0xC3, 0x23, 0x91, 0xED, 0x29, 0x28, + 0x54, 0x10, 0x81, 0x02, 0xF8, 0x00, 0x42, 0x58, 0x4F, 0x41, 0x28, 0x84, + 0xBB, 0x54, 0x50, 0x28, 0x42, 0xC5, 0x16, 0x70, 0x83, 0xA3, 0x38, 0x8A, + 0x13, 0x08, 0x01, 0x69, 0x1A, 0x21, 0x13, 0x12, 0x13, 0xA4, 0x70, 0x81, + 0x30, 0x13, 0xB5, 0x32, 0x18, 0x01, 0x17, 0x80, 0xBF, 0x86, 0x9A, 0x3B, + 0xBE, 0xE3, 0x9B, 0x44, 0xC0, 0xC6, 0x37, 0x08, 0x2F, 0xFE, 0x02, 0x52, + 0x38, 0xC0, 0x9B, 0x48, 0x48, 0x04, 0x16, 0x88, 0x01, 0x76, 0x08, 0x3C, + 0x24, 0xC5, 0x87, 0x22, 0x70, 0x85, 0xC3, 0xBB, 0x06, 0x50, 0x7A, 0x0F, + 0x68, 0xA8, 0x85, 0xE6, 0xF0, 0x04, 0xC8, 0x6B, 0x0E, 0x1C, 0x28, 0x02, + 0x72, 0x80, 0x9C, 0x88, 0xC0, 0x87, 0x5F, 0x18, 0x05, 0x3A, 0x12, 0x82, + 0x3A, 0x8A, 0x85, 0x6F, 0xAB, 0x31, 0xB9, 0x5A, 0x05, 0xB9, 0x02, 0xAB, + 0xDC, 0x94, 0xC2, 0x6E, 0x61, 0xB1, 0x37, 0xC5, 0xB1, 0x58, 0x58, 0xC8, + 0x73, 0x53, 0x25, 0x56, 0x38, 0x85, 0x1B, 0x08, 0x82, 0xD7, 0xDB, 0x1C, + 0xBE, 0x82, 0x86, 0xEC, 0xD1, 0xD3, 0x7C, 0x41, 0x85, 0xB6, 0x8A, 0x05, + 0xE1, 0x14, 0x05, 0xDE, 0x33, 0x54, 0x9A, 0x0D, 0x2A, 0xC6, 0x92, 0xB2, + 0x69, 0x48, 0x86, 0x3B, 0xBC, 0x18, 0x50, 0x08, 0x02, 0x7F, 0xB0, 0x90, + 0x7D, 0xF0, 0x06, 0x1D, 0x08, 0xAE, 0x48, 0x20, 0x84, 0x3A, 0x10, 0x99, + 0x9B, 0x8B, 0x4C, 0x8C, 0xEA, 0x39, 0x9E, 0xE1, 0x00, 0xFE, 0x0E, 0xC8, + 0x00, 0x5A, 0xF0, 0x06, 0x51, 0xAD, 0x32, 0x58, 0x60, 0x86, 0x19, 0x80, + 0xAD, 0x80, 0x89, 0xB8, 0x1F, 0x18, 0x00, 0x00, 0x68, 0x00, 0x02, 0x85, + 0x9A, 0x2B, 0x51, 0x21, 0x06, 0x6C, 0x81, 0x60, 0x4C, 0xA8, 0x36, 0x80, + 0xD0, 0x9D, 0xE3, 0x1A, 0x31, 0x48, 0x83, 0x17, 0xC8, 0x9A, 0x45, 0x61, + 0x80, 0x07, 0x18, 0x85, 0x0F, 0x13, 0x26, 0x0E, 0xDD, 0x1E, 0x1A, 0x10, + 0x09, 0x76, 0x6A, 0xD6, 0x43, 0x68, 0x83, 0x31, 0xAB, 0x03, 0x37, 0x70, + 0x27, 0x4F, 0x1B, 0x0A, 0x90, 0x0B, 0x93, 0x42, 0xF4, 0x8B, 0x34, 0x20, + 0xA1, 0xBE, 0xF0, 0x12, 0x46, 0xE1, 0x1F, 0x94, 0x0A, 0x03, 0xEF, 0x0A, + 0x03, 0x35, 0x08, 0xC1, 0xC8, 0x58, 0xD7, 0x97, 0xDA, 0x83, 0xBE, 0x24, + 0x03, 0x15, 0x0C, 0x30, 0x43, 0x50, 0x84, 0x48, 0x60, 0x84, 0x14, 0xA8, + 0x81, 0x7B, 0xC0, 0x57, 0xED, 0xCC, 0x07, 0x4F, 0xA0, 0x85, 0x6B, 0x38, + 0x5D, 0x78, 0x94, 0x86, 0x3D, 0x92, 0x8D, 0x29, 0x25, 0xD8, 0x50, 0x20, + 0x82, 0xE9, 0xD9, 0x18, 0xD7, 0x28, 0x4F, 0x88, 0x90, 0x95, 0x6A, 0x20, + 0x05, 0x52, 0x62, 0x2D, 0xDB, 0x51, 0x06, 0xE3, 0x04, 0xD4, 0x29, 0xEC, + 0x36, 0x86, 0x6C, 0x48, 0x07, 0x41, 0x05, 0x85, 0x84, 0xA5, 0x1F, 0x94, + 0x85, 0x53, 0xD0, 0x81, 0x22, 0x98, 0x01, 0x1E, 0xAB, 0x24, 0xBD, 0x12, + 0x37, 0x6E, 0xD1, 0x06, 0x98, 0xF1, 0x1E, 0x56, 0xC8, 0xBD, 0xDD, 0xAB, + 0x59, 0xEC, 0xCD, 0x10, 0x6F, 0x80, 0xB2, 0x6C, 0x38, 0x42, 0x7F, 0x90, + 0x85, 0xD5, 0x92, 0x49, 0xD5, 0x99, 0xD9, 0xD4, 0x70, 0x05, 0xF4, 0x14, + 0xC4, 0x1C, 0xF2, 0x92, 0x95, 0x42, 0xAE, 0x6A, 0xF5, 0x28, 0x10, 0x18, + 0x01, 0x11, 0xB8, 0x81, 0x69, 0x00, 0x25, 0x64, 0xA8, 0xB2, 0x56, 0x88, + 0xFE, 0x85, 0x19, 0x00, 0x82, 0x1C, 0x60, 0x88, 0x8B, 0x39, 0x06, 0x20, + 0x10, 0x09, 0x07, 0xE0, 0x00, 0x19, 0x00, 0x81, 0xAA, 0x3C, 0x01, 0xA1, + 0xC8, 0x9A, 0xA2, 0x9B, 0x94, 0x69, 0xCD, 0xCA, 0xA2, 0x7B, 0xA8, 0xC3, + 0x10, 0x83, 0xA0, 0xD8, 0x92, 0x30, 0x00, 0x01, 0x09, 0x28, 0x82, 0x7E, + 0xD0, 0x86, 0x59, 0xD8, 0x1E, 0x0D, 0xC6, 0x99, 0x05, 0x18, 0x81, 0x41, + 0xC8, 0xA1, 0x36, 0x10, 0x84, 0xE0, 0xD2, 0x03, 0x90, 0x48, 0x0A, 0x9E, + 0x13, 0x1A, 0x32, 0x51, 0x01, 0x0F, 0xA8, 0x28, 0x3E, 0x81, 0x0A, 0xBA, + 0x40, 0xAE, 0xF7, 0x42, 0x03, 0xB6, 0x28, 0x03, 0x5A, 0x8B, 0x91, 0x43, + 0xC0, 0xC6, 0xAA, 0x2B, 0x5A, 0x4D, 0x99, 0x04, 0x44, 0x20, 0x83, 0x15, + 0x48, 0x83, 0x35, 0xC0, 0xDC, 0x37, 0x20, 0xB0, 0xC8, 0xF8, 0x80, 0x38, + 0xA0, 0xDD, 0x42, 0xCD, 0x07, 0x22, 0xA8, 0x05, 0xD4, 0xBD, 0x06, 0x6E, + 0xA0, 0x85, 0xE3, 0x78, 0x85, 0x53, 0x68, 0x85, 0x67, 0x39, 0x05, 0x54, + 0x18, 0x02, 0x1C, 0x18, 0x05, 0x42, 0x95, 0x88, 0x59, 0x11, 0x85, 0x26, + 0x70, 0x96, 0xCD, 0x51, 0x06, 0x78, 0x1B, 0x98, 0xE0, 0x85, 0x48, 0xEF, + 0x58, 0x48, 0x07, 0x31, 0x32, 0x91, 0x8D, 0xA5, 0x7B, 0xB9, 0x01, 0x4C, + 0x68, 0x05, 0xF0, 0x08, 0x1E, 0x3E, 0xC5, 0x24, 0x58, 0x02, 0x2C, 0xEB, + 0x25, 0xDF, 0xEC, 0xCD, 0x63, 0xD5, 0xA0, 0x85, 0x52, 0x70, 0xAC, 0x9C, + 0x85, 0x85, 0xD5, 0x62, 0xD5, 0x40, 0xD0, 0x62, 0x0B, 0xD1, 0x57, 0x14, + 0x10, 0x03, 0x49, 0x38, 0x84, 0x85, 0x5A, 0xA9, 0x91, 0xF1, 0xB8, 0x46, + 0x09, 0x01, 0x0E, 0x60, 0x35, 0x09, 0x78, 0x44, 0x50, 0x9A, 0x05, 0x3C, + 0x6C, 0x05, 0x54, 0x88, 0x80, 0x21, 0x98, 0x01, 0x86, 0x60, 0xD5, 0x54, + 0xD0, 0x01, 0x00, 0xFE, 0xE6, 0x00, 0xBA, 0x80, 0x0B, 0x69, 0x7C, 0xC5, + 0x14, 0xC0, 0x3A, 0x28, 0x1A, 0x1A, 0x13, 0x1D, 0x83, 0x87, 0xBA, 0x3A, + 0xA3, 0x50, 0x94, 0x51, 0x1C, 0x03, 0x0E, 0x78, 0x00, 0x22, 0xA8, 0x96, + 0x35, 0xD1, 0x60, 0x66, 0x18, 0x02, 0x0E, 0xF0, 0x00, 0x07, 0x40, 0x83, + 0x66, 0x85, 0x22, 0x69, 0x12, 0x84, 0x32, 0x90, 0x91, 0x34, 0x48, 0x01, + 0x33, 0x50, 0x81, 0xBA, 0x51, 0x14, 0xB9, 0x48, 0x2E, 0xA3, 0x19, 0x81, + 0xBF, 0x7C, 0x66, 0xB9, 0x60, 0x0B, 0xB2, 0xD1, 0x03, 0x32, 0xEA, 0xB2, + 0xBC, 0x99, 0x8C, 0x41, 0xD0, 0x14, 0x4A, 0xC8, 0x35, 0x16, 0xF0, 0xC6, + 0xCC, 0x78, 0x03, 0x41, 0x30, 0x84, 0x42, 0x50, 0x84, 0x0F, 0x18, 0x82, + 0xEC, 0xE5, 0x07, 0x22, 0xA0, 0x85, 0x6D, 0x40, 0x5D, 0x6B, 0xD8, 0x23, + 0x3E, 0x12, 0x05, 0xC7, 0x23, 0x32, 0x3B, 0xBA, 0x81, 0x51, 0x50, 0x0D, + 0x85, 0xAD, 0x5D, 0xD4, 0xD8, 0x87, 0x77, 0x30, 0xAA, 0x22, 0x20, 0x82, + 0x39, 0x20, 0xDE, 0x7F, 0x99, 0x1D, 0x66, 0x30, 0x32, 0x74, 0x0B, 0xAC, + 0x85, 0x44, 0x3D, 0x55, 0x2A, 0xB2, 0x91, 0x4D, 0x05, 0x4F, 0x30, 0x82, + 0x0D, 0x33, 0x82, 0x58, 0x98, 0x06, 0xBE, 0xD2, 0x2B, 0x65, 0x89, 0x06, + 0xDF, 0x39, 0x85, 0x50, 0xF8, 0x96, 0x63, 0xBD, 0x5E, 0x3D, 0xEE, 0xE8, + 0x88, 0x00, 0x90, 0x57, 0xA0, 0x85, 0x6E, 0xD0, 0x0D, 0x7F, 0x40, 0x06, + 0x58, 0xA8, 0x32, 0x14, 0xA1, 0x83, 0x5A, 0x58, 0x8D, 0x6F, 0xB0, 0x01, + 0x15, 0xA8, 0x03, 0x4A, 0x50, 0xE4, 0xBD, 0x45, 0x8B, 0xAC, 0xBB, 0xB9, + 0x7D, 0x22, 0x81, 0x9F, 0xE8, 0x80, 0x19, 0xC0, 0x81, 0x6C, 0x68, 0xB8, + 0x59, 0x50, 0x85, 0x4F, 0x58, 0x05, 0x55, 0x98, 0x81, 0x21, 0xF0, 0x01, + 0x4C, 0x64, 0x55, 0x50, 0x4E, 0x80, 0xFE, 0x0E, 0xE6, 0x13, 0x67, 0x76, + 0xC6, 0x43, 0x0C, 0xAF, 0xB5, 0x38, 0x99, 0x8E, 0xC0, 0x13, 0xB4, 0x60, + 0xE5, 0x18, 0xA1, 0xA9, 0x30, 0x80, 0x3F, 0x2D, 0xE9, 0x00, 0x02, 0xD8, + 0x81, 0xDD, 0x18, 0x11, 0xE1, 0x8C, 0x53, 0x22, 0x30, 0x81, 0x0E, 0x48, + 0x00, 0x0E, 0x60, 0xBF, 0x75, 0xDA, 0x2D, 0x41, 0x70, 0xE0, 0xFC, 0xF3, + 0x34, 0xEA, 0x8B, 0x4C, 0xA6, 0x18, 0x81, 0x7D, 0x7A, 0x61, 0x3F, 0x71, + 0x81, 0xF1, 0xB2, 0xCA, 0x10, 0x30, 0x83, 0x41, 0x88, 0x84, 0x86, 0xC2, + 0x03, 0x6C, 0xDC, 0x22, 0x97, 0x7A, 0xA9, 0x6D, 0x46, 0x03, 0xA6, 0x40, + 0x03, 0x36, 0xD0, 0x0C, 0x38, 0x30, 0x84, 0x44, 0x30, 0x04, 0x0F, 0x98, + 0x83, 0x73, 0x1E, 0x05, 0x5D, 0x28, 0x96, 0xC3, 0x6B, 0x2A, 0xD5, 0x95, + 0x05, 0x78, 0x61, 0x4D, 0xB9, 0x8A, 0x4D, 0x8A, 0xD3, 0x10, 0x58, 0x09, + 0x5A, 0x57, 0xB0, 0x82, 0x1D, 0x08, 0x02, 0x8D, 0x24, 0xC9, 0xD9, 0xA9, + 0x48, 0xF5, 0x18, 0x26, 0x16, 0xE3, 0x16, 0x56, 0x30, 0xD3, 0x68, 0xD1, + 0x81, 0xD7, 0xFB, 0x04, 0xBC, 0x7A, 0xDE, 0xF0, 0x28, 0x2B, 0x22, 0xD3, + 0xE8, 0x7E, 0x11, 0x85, 0x06, 0xF3, 0x68, 0xDD, 0xC6, 0x87, 0x53, 0xA8, + 0x06, 0x82, 0x50, 0x93, 0x65, 0xC0, 0x64, 0x99, 0x1C, 0x02, 0x20, 0xB0, + 0x06, 0x7B, 0x2E, 0x05, 0x8E, 0x20, 0x04, 0x49, 0x88, 0x91, 0x41, 0xD0, + 0x03, 0x53, 0x14, 0x99, 0x3A, 0x91, 0xC5, 0x14, 0x70, 0xDA, 0x11, 0xA0, + 0x99, 0x86, 0xCB, 0x86, 0x5A, 0x58, 0xAD, 0x58, 0x08, 0x85, 0xAB, 0xCD, + 0x81, 0x21, 0x48, 0x05, 0x4D, 0x88, 0xB8, 0x4A, 0x1B, 0x80, 0x01, 0xC0, + 0x8B, 0x17, 0x90, 0x01, 0x06, 0xB8, 0xA7, 0x45, 0x49, 0x81, 0x5E, 0xED, + 0x1A, 0x33, 0xA8, 0x1B, 0x3C, 0x28, 0x19, 0xF6, 0xBE, 0xFE, 0x3A, 0x9A, + 0x3A, 0x03, 0x37, 0xE0, 0xD5, 0x13, 0x70, 0xA1, 0x6F, 0x38, 0x39, 0xE1, + 0x0C, 0x1F, 0x66, 0xC0, 0x04, 0x13, 0xF0, 0x80, 0x05, 0x58, 0x00, 0x76, + 0x22, 0x0B, 0x1A, 0xD6, 0x55, 0x48, 0xA9, 0x9B, 0x34, 0x68, 0x03, 0x67, + 0x64, 0x01, 0x17, 0x00, 0xAD, 0x41, 0xC1, 0xB3, 0x10, 0xC8, 0x9A, 0x15, + 0xD8, 0x88, 0xAC, 0x69, 0x01, 0x0E, 0x40, 0x01, 0x37, 0x38, 0x04, 0xF6, + 0x43, 0x29, 0xC7, 0xD8, 0xA2, 0x1D, 0x95, 0x04, 0x11, 0x6F, 0x57, 0xF3, + 0x5A, 0x03, 0x21, 0xD5, 0x83, 0x44, 0xD8, 0x03, 0x0F, 0x48, 0x05, 0x24, + 0x46, 0x52, 0x77, 0xB0, 0x02, 0x5D, 0x40, 0x5D, 0x6E, 0x68, 0x2A, 0xD4, + 0x74, 0x85, 0x53, 0x08, 0x96, 0x5C, 0x11, 0x85, 0x21, 0xA8, 0x80, 0x57, + 0x98, 0x41, 0x7B, 0x46, 0x0D, 0x7E, 0x90, 0x86, 0xD9, 0x08, 0x82, 0x21, + 0x98, 0x03, 0xBC, 0x2A, 0xB1, 0xE2, 0x9C, 0x48, 0x8E, 0x1D, 0xB2, 0xD7, + 0x1D, 0x82, 0x1C, 0x98, 0x81, 0x50, 0x28, 0x85, 0x3C, 0xF5, 0x8D, 0xDA, + 0xA9, 0x06, 0x21, 0x3B, 0x9D, 0x73, 0xDB, 0x9E, 0x65, 0x18, 0x85, 0x8D, + 0xD1, 0x6D, 0x8F, 0xE6, 0x06, 0x52, 0xE0, 0x06, 0xDD, 0xA0, 0x9A, 0x59, + 0x58, 0xED, 0x8B, 0xA1, 0x83, 0x26, 0xE8, 0x72, 0x89, 0xD8, 0x8F, 0x22, + 0x88, 0x8B, 0x44, 0x26, 0x8B, 0xB2, 0xC8, 0x27, 0x3C, 0x40, 0x21, 0x3D, + 0x39, 0x8A, 0xF7, 0xED, 0x80, 0x07, 0x08, 0x82, 0x82, 0xD0, 0xA6, 0x04, + 0x52, 0x85, 0xA1, 0x4E, 0xAA, 0x40, 0x88, 0xB8, 0x88, 0xF3, 0x01, 0xF2, + 0x36, 0x6B, 0x10, 0xB0, 0xA8, 0x28, 0xD1, 0xB3, 0x13, 0x08, 0x33, 0x87, + 0x52, 0xC5, 0xB1, 0x1C, 0x04, 0x07, 0x57, 0x0B, 0xE1, 0x1A, 0xBB, 0x49, + 0x39, 0x03, 0x2A, 0x4A, 0x81, 0xA8, 0x69, 0xAC, 0x69, 0x08, 0x9F, 0xB0, + 0xFE, 0x46, 0x05, 0x1B, 0x90, 0x01, 0x46, 0x94, 0x81, 0x85, 0xC2, 0x2E, + 0x51, 0xE4, 0x1A, 0x6A, 0x55, 0xA1, 0xFD, 0x51, 0x14, 0xC2, 0x40, 0xBF, + 0xA5, 0xB1, 0x20, 0x43, 0x3B, 0x0A, 0x16, 0x08, 0x61, 0x34, 0x40, 0x21, + 0x96, 0xCA, 0xE6, 0x3C, 0x38, 0x03, 0x41, 0x90, 0x04, 0xBE, 0x11, 0xC1, + 0x1B, 0x96, 0x04, 0x4A, 0x50, 0x84, 0x3D, 0xF1, 0xA2, 0x20, 0x0D, 0x67, + 0x44, 0x78, 0x03, 0x0F, 0x68, 0x85, 0xEC, 0x85, 0x07, 0x2B, 0x90, 0x86, + 0x7E, 0xBD, 0x86, 0xA6, 0x7A, 0x05, 0x58, 0xE8, 0xB1, 0x51, 0xA0, 0x9E, + 0x65, 0x58, 0x85, 0x39, 0xC0, 0x81, 0x1E, 0xCF, 0x90, 0x7B, 0x8E, 0x9C, + 0x0B, 0xC9, 0x07, 0x72, 0xA8, 0x05, 0x52, 0x32, 0x02, 0x21, 0x40, 0x43, + 0x86, 0x54, 0x37, 0x07, 0xF9, 0x9E, 0x50, 0x98, 0xD2, 0x22, 0xD8, 0xB0, + 0x51, 0xB0, 0xD8, 0xB4, 0xA2, 0x86, 0xEF, 0xC8, 0x1E, 0xE4, 0x0D, 0x05, + 0x0D, 0x65, 0x05, 0x0E, 0x1D, 0x85, 0x06, 0xDB, 0x76, 0x2F, 0xA7, 0x59, + 0x69, 0x70, 0x05, 0x6F, 0x18, 0x73, 0x7F, 0x88, 0x85, 0x56, 0x08, 0x05, + 0x14, 0x89, 0xB3, 0x16, 0x97, 0x95, 0x1F, 0xD0, 0x33, 0x49, 0x68, 0xEE, + 0xF5, 0x74, 0xEE, 0x2A, 0xE2, 0x2D, 0xA5, 0x60, 0x8A, 0x0E, 0xD0, 0x8B, + 0x08, 0x78, 0xC4, 0x28, 0x4B, 0x39, 0x49, 0x8C, 0x00, 0x20, 0xD0, 0x81, + 0x40, 0xC7, 0xC4, 0x39, 0x23, 0xEF, 0x06, 0x88, 0x45, 0x15, 0xE8, 0x4B, + 0x7A, 0x2A, 0x1B, 0x17, 0xB0, 0xD6, 0xB0, 0x81, 0x5C, 0xC5, 0x68, 0x01, + 0x17, 0x98, 0x74, 0xE1, 0xC2, 0x83, 0x3A, 0x18, 0xE6, 0x17, 0x00, 0x95, + 0x4C, 0x57, 0x07, 0x7F, 0x08, 0x6B, 0xDE, 0x0D, 0x05, 0x1D, 0xF8, 0x80, + 0x05, 0xE0, 0x80, 0x11, 0x48, 0x4F, 0x90, 0x09, 0xC5, 0x36, 0x60, 0x28, + 0xE4, 0x7A, 0x94, 0xFE, 0x7D, 0x22, 0xC5, 0xCB, 0x00, 0x8C, 0x41, 0x23, + 0xD7, 0xA1, 0x68, 0x79, 0x3C, 0xC8, 0x83, 0x45, 0xB1, 0x13, 0x35, 0x28, + 0x0B, 0x94, 0xD2, 0x03, 0x49, 0x08, 0xB6, 0xA2, 0x55, 0xEC, 0xAB, 0x47, + 0x83, 0x11, 0x78, 0x03, 0x13, 0x0F, 0x30, 0xFB, 0x42, 0x83, 0x0E, 0xA0, + 0x85, 0xEC, 0x7D, 0x07, 0x4F, 0x90, 0x86, 0x62, 0x39, 0xDD, 0xA6, 0xD2, + 0x85, 0x5F, 0x50, 0x85, 0xE5, 0x81, 0xE8, 0x1E, 0xC3, 0x04, 0x1D, 0xF8, + 0x85, 0x58, 0xE9, 0x10, 0x42, 0x3D, 0x0D, 0x7C, 0x00, 0x87, 0x5A, 0x38, + 0xAA, 0x08, 0xF2, 0x04, 0x54, 0x10, 0x9F, 0xAF, 0x18, 0x32, 0xE7, 0x98, + 0x03, 0x23, 0x38, 0x02, 0x4C, 0x38, 0x85, 0x5A, 0xF0, 0x24, 0xBD, 0x92, + 0x05, 0x5D, 0xC8, 0x59, 0x64, 0x88, 0x85, 0x4F, 0x50, 0xC8, 0xED, 0x89, + 0x05, 0x7C, 0xDF, 0xF7, 0x3C, 0xE6, 0x0F, 0x55, 0x68, 0x2C, 0x29, 0xAB, + 0x05, 0x55, 0x60, 0x33, 0x3C, 0xF4, 0x81, 0x5A, 0x28, 0x36, 0x85, 0x75, + 0x05, 0x19, 0xD0, 0x49, 0xAB, 0x9B, 0x11, 0x1D, 0x92, 0x01, 0x61, 0xBC, + 0x6F, 0x8E, 0x60, 0x34, 0x8F, 0xAA, 0xEE, 0x1D, 0xD8, 0x73, 0xCE, 0x67, + 0x09, 0x00, 0x2F, 0xEA, 0xEF, 0xA6, 0x03, 0x56, 0xBD, 0xDB, 0x01, 0x70, + 0x80, 0x9E, 0x87, 0xF0, 0x11, 0xD0, 0xD6, 0x88, 0x62, 0xC0, 0x15, 0x70, + 0x83, 0xBA, 0x31, 0x3A, 0x69, 0x02, 0x9A, 0xBC, 0xEC, 0x1A, 0x37, 0x70, + 0xF8, 0x30, 0x98, 0xE5, 0x85, 0xAB, 0xC3, 0x38, 0x65, 0x86, 0x59, 0xF8, + 0x01, 0x9D, 0xE1, 0x00, 0x06, 0x48, 0x81, 0x4C, 0x5B, 0x0B, 0x85, 0x92, + 0x91, 0x45, 0x6F, 0x81, 0xBF, 0x91, 0x81, 0x17, 0xA0, 0x8A, 0xB2, 0xB9, + 0x12, 0x34, 0xF8, 0x8B, 0xE0, 0x42, 0xE6, 0x4F, 0xD4, 0x27, 0xF6, 0x22, + 0x8B, 0xF5, 0x14, 0x4A, 0xFB, 0xC2, 0xFE, 0x2F, 0x4C, 0x11, 0xC1, 0x44, + 0x98, 0x04, 0x4A, 0x58, 0x83, 0x12, 0x70, 0x81, 0x3C, 0x58, 0x83, 0xA7, + 0x87, 0x83, 0x49, 0x10, 0x83, 0x12, 0x80, 0x06, 0x80, 0xD0, 0x27, 0x70, + 0x20, 0xC1, 0x82, 0x06, 0x0F, 0x22, 0x4C, 0xA8, 0x50, 0x21, 0x3C, 0x2B, + 0xBF, 0xAC, 0x5D, 0xBB, 0x66, 0xED, 0x9B, 0x2E, 0x69, 0xBA, 0x54, 0xB9, + 0xC2, 0x34, 0x64, 0xD5, 0xAA, 0x50, 0x44, 0x70, 0xD0, 0x5A, 0x28, 0x72, + 0x1F, 0x42, 0x92, 0x04, 0xF1, 0x79, 0x7B, 0x35, 0xAA, 0x48, 0x90, 0x20, + 0x9E, 0x58, 0x2D, 0x0B, 0x85, 0x2A, 0xD4, 0x90, 0x1B, 0x37, 0x46, 0xAD, + 0x82, 0x55, 0xAD, 0x1A, 0x35, 0x6D, 0xBA, 0xA0, 0x45, 0x83, 0x36, 0x2B, + 0x96, 0x27, 0x59, 0xCC, 0x62, 0x45, 0x63, 0x16, 0x0A, 0x9F, 0xC8, 0xA6, + 0x4E, 0x9F, 0x42, 0x8D, 0x2A, 0x75, 0xAA, 0xD3, 0x7D, 0xEF, 0x48, 0x7D, + 0xFB, 0xD6, 0x2D, 0x9B, 0xB6, 0x58, 0xB2, 0x52, 0x61, 0xFA, 0x84, 0x09, + 0x08, 0x3B, 0x83, 0xFB, 0xF2, 0x61, 0x62, 0xC1, 0x42, 0xD2, 0x21, 0x41, + 0x82, 0xD0, 0xA4, 0x71, 0x23, 0x26, 0xCD, 0x8A, 0x3A, 0x78, 0xCE, 0xB4, + 0x69, 0xD1, 0x22, 0x4C, 0x83, 0x0E, 0x10, 0x82, 0xA8, 0xCB, 0x96, 0x6D, + 0x96, 0x28, 0x4C, 0xB1, 0x52, 0xCD, 0x18, 0x62, 0x82, 0x4E, 0xAA, 0x54, + 0xA0, 0x52, 0x05, 0x5A, 0x30, 0x60, 0x81, 0x82, 0x06, 0x23, 0x4E, 0xA8, + 0xE8, 0xC0, 0x21, 0xC5, 0x19, 0x16, 0x61, 0xEA, 0x84, 0x59, 0x71, 0x46, + 0x4C, 0x18, 0x31, 0x7B, 0x5B, 0x9C, 0x68, 0x81, 0x66, 0x8C, 0x1A, 0x3C, + 0x78, 0xDA, 0xE8, 0xC1, 0xBB, 0x86, 0x01, 0x82, 0x53, 0xDD, 0xB4, 0xE1, + 0x62, 0xA6, 0x5B, 0xB7, 0x8F, 0x05, 0x0C, 0x3C, 0x8C, 0xE8, 0x50, 0x87, + 0xD0, 0x09, 0x31, 0x6A, 0xDC, 0xE8, 0x41, 0x43, 0x22, 0xFE, 0x05, 0x1E, + 0xD3, 0xA4, 0x47, 0xA8, 0x70, 0x41, 0x62, 0x04, 0x8A, 0x35, 0x2F, 0x52, + 0xE8, 0x45, 0xA1, 0xE2, 0x85, 0x98, 0x17, 0x65, 0x58, 0xD7, 0x11, 0x54, + 0x48, 0x0F, 0xEC, 0x41, 0x88, 0xE0, 0x08, 0x3A, 0x44, 0xA8, 0x50, 0xA4, + 0x44, 0x92, 0x24, 0xAD, 0xC1, 0x2E, 0xC8, 0x8C, 0x9D, 0x3D, 0x85, 0x0A, + 0x89, 0xF9, 0x61, 0x2D, 0x1F, 0xD5, 0xFE, 0xFE, 0xF5, 0xC1, 0xE3, 0x09, + 0x35, 0x11, 0x65, 0x55, 0x8D, 0x2E, 0xBF, 0xBC, 0xD2, 0xCA, 0x29, 0x4D, + 0xBC, 0x04, 0xCB, 0x29, 0x44, 0xDC, 0x70, 0xCD, 0x7F, 0x4D, 0xE5, 0xC3, + 0xDF, 0x40, 0xFB, 0xF4, 0xF3, 0xCA, 0x1C, 0x46, 0xEC, 0x90, 0xC3, 0x1C, + 0xA0, 0xCC, 0x91, 0x43, 0x05, 0xA1, 0xAC, 0x42, 0x0B, 0x34, 0xDA, 0x50, + 0x33, 0x8D, 0x4F, 0x3F, 0x2D, 0x13, 0xCB, 0x27, 0xCB, 0x2C, 0x23, 0x4B, + 0x34, 0xCA, 0x9C, 0xC2, 0xD4, 0x84, 0x37, 0xE2, 0x98, 0xA3, 0x8E, 0x08, + 0x75, 0x43, 0x4A, 0x37, 0x3F, 0x76, 0x33, 0x0D, 0x32, 0xCC, 0x9C, 0xF2, + 0x49, 0x28, 0x74, 0x0C, 0x61, 0x12, 0x41, 0xFB, 0x80, 0x53, 0x83, 0x0A, + 0x62, 0x48, 0x92, 0x9E, 0x1E, 0x78, 0xB8, 0x71, 0x89, 0x1B, 0x68, 0x84, + 0x31, 0xE5, 0x19, 0x70, 0x84, 0xB6, 0x02, 0x07, 0x1C, 0x40, 0xB0, 0x03, + 0x37, 0x5C, 0xCD, 0x82, 0x09, 0x26, 0xAD, 0x60, 0x62, 0xC2, 0x10, 0x33, + 0x30, 0xD6, 0x18, 0x33, 0x73, 0x4C, 0x30, 0x99, 0x02, 0x0B, 0x40, 0x47, + 0x82, 0x66, 0x29, 0xA8, 0x10, 0x46, 0x18, 0x6A, 0x90, 0x26, 0xC6, 0x18, + 0x7A, 0x8E, 0x21, 0x86, 0x18, 0x2E, 0x84, 0xD1, 0x42, 0x0A, 0x6A, 0x4C, + 0xE9, 0x46, 0x1B, 0xA4, 0x95, 0xD1, 0x81, 0x01, 0x9E, 0xA8, 0xA3, 0x8D, + 0x3F, 0xCC, 0x4C, 0x3A, 0xCB, 0x2C, 0x3F, 0x2C, 0xC0, 0x81, 0x02, 0x24, + 0xFE, 0x88, 0x61, 0x06, 0x1E, 0x69, 0x90, 0x50, 0xC7, 0x19, 0x6A, 0xA4, + 0xD1, 0x82, 0x18, 0x6D, 0xA4, 0x41, 0xA8, 0x18, 0x24, 0xA0, 0xC0, 0x02, + 0x76, 0xD8, 0x9D, 0x80, 0x67, 0x0A, 0x62, 0xA4, 0xB0, 0x42, 0xA1, 0x2E, + 0x8C, 0x61, 0x06, 0xA2, 0x79, 0xE0, 0x11, 0xDE, 0x21, 0x85, 0x0C, 0x92, + 0x07, 0x22, 0x85, 0x20, 0x12, 0x09, 0x25, 0x91, 0x44, 0xC2, 0xE5, 0x18, + 0x6B, 0xB8, 0x11, 0x86, 0x1D, 0x91, 0xEC, 0x41, 0xC6, 0x0F, 0xDE, 0xE8, + 0xA3, 0x64, 0xB5, 0x3B, 0xE6, 0xC8, 0x1F, 0x3C, 0xA3, 0x7C, 0x13, 0x91, + 0x44, 0xBF, 0x48, 0xF3, 0xCA, 0x2B, 0xA5, 0x9C, 0xE2, 0x89, 0x27, 0xA1, + 0xB0, 0xB2, 0x0A, 0x11, 0x39, 0x58, 0x73, 0x2D, 0xB6, 0x4B, 0x0A, 0x54, + 0xE1, 0x85, 0xFB, 0xB8, 0xE2, 0x8A, 0x15, 0x46, 0x04, 0x71, 0xC3, 0x11, + 0xA0, 0xAC, 0xA2, 0x0B, 0x4F, 0xD4, 0x40, 0x33, 0x0D, 0x34, 0x03, 0xCB, + 0xC2, 0xCA, 0x27, 0xB2, 0x18, 0x95, 0xD4, 0x28, 0x36, 0xBE, 0xDB, 0xB0, + 0xC3, 0x0F, 0x1F, 0xF4, 0x8A, 0x2A, 0x5A, 0xDD, 0xE6, 0x4F, 0x2D, 0xB5, + 0x84, 0x82, 0x09, 0x28, 0x40, 0x84, 0x82, 0x10, 0x2D, 0x98, 0xE1, 0x11, + 0x89, 0x7A, 0x84, 0x90, 0xEC, 0x86, 0x6B, 0x6E, 0x1C, 0xA2, 0x87, 0x18, + 0x79, 0xA0, 0xB0, 0xC2, 0x0A, 0x1D, 0x28, 0x50, 0x81, 0x98, 0x5C, 0xF9, + 0xA3, 0xCA, 0x99, 0x98, 0xCC, 0x00, 0xC4, 0x0C, 0x98, 0xA4, 0xF2, 0x4C, + 0x63, 0x73, 0x30, 0x30, 0x80, 0x03, 0x0B, 0x80, 0xC0, 0xC1, 0x08, 0x23, + 0x70, 0xD0, 0x41, 0xAD, 0xAE, 0x9A, 0x31, 0x46, 0x1A, 0x9D, 0xCE, 0x15, + 0xC6, 0x0B, 0x7B, 0x95, 0x81, 0x02, 0x0A, 0xC3, 0xA9, 0x71, 0x86, 0x1B, + 0x67, 0x7C, 0xD7, 0xC1, 0x04, 0x45, 0x08, 0xC6, 0xCC, 0x2C, 0xCA, 0xEC, + 0xE6, 0x03, 0x03, 0xFE, 0x1C, 0x7C, 0x70, 0x02, 0x0B, 0x65, 0x74, 0xAA, + 0xC2, 0xA2, 0x6A, 0xA4, 0x70, 0x42, 0x19, 0x66, 0x94, 0xA1, 0x57, 0x18, + 0x21, 0x8C, 0x60, 0x68, 0x69, 0xD8, 0xA5, 0xA1, 0x42, 0x0A, 0x28, 0xB0, + 0x3A, 0x75, 0x69, 0xA3, 0x2A, 0x0A, 0x9B, 0x1E, 0xC0, 0x1A, 0x02, 0x87, + 0xC8, 0x91, 0x48, 0x72, 0x6C, 0x22, 0x86, 0x58, 0x47, 0xC6, 0x1B, 0x64, + 0xAC, 0x91, 0x08, 0x1F, 0x6C, 0x0C, 0x41, 0x0E, 0xC4, 0xD8, 0xF6, 0xE3, + 0xC9, 0x2F, 0xDE, 0x62, 0x53, 0x4D, 0xB8, 0xAF, 0xB8, 0x32, 0x4A, 0x58, + 0xB6, 0xC0, 0x02, 0x0B, 0x10, 0x39, 0x48, 0xB8, 0xB9, 0x59, 0xFB, 0x9C, + 0x65, 0x21, 0x3E, 0xFD, 0x58, 0x51, 0x01, 0x4E, 0x03, 0x5B, 0x43, 0x4D, + 0x35, 0xD3, 0xFC, 0x04, 0x4D, 0x8C, 0x2F, 0xC6, 0x02, 0x94, 0x2C, 0xA3, + 0x58, 0xEB, 0xBA, 0xF1, 0xC7, 0xF7, 0xE7, 0x0A, 0x2E, 0x40, 0x4E, 0x33, + 0x0B, 0x2C, 0xB1, 0x68, 0x9C, 0xCA, 0x10, 0xB2, 0x18, 0xC4, 0x94, 0x28, + 0x32, 0x9C, 0x80, 0xC8, 0x21, 0x88, 0x20, 0xA2, 0x07, 0x21, 0xAF, 0x11, + 0xA2, 0x87, 0x1E, 0x87, 0xB4, 0x81, 0x86, 0x1A, 0x28, 0x18, 0xCA, 0x41, + 0x03, 0x16, 0x04, 0xB1, 0xD5, 0x60, 0x62, 0xC1, 0x32, 0x47, 0xCE, 0x36, + 0x04, 0x92, 0x0A, 0x33, 0xA9, 0xB0, 0x02, 0x4A, 0x03, 0x09, 0x2C, 0x40, + 0xE7, 0x97, 0x24, 0xD8, 0xE9, 0x05, 0x2E, 0x13, 0x94, 0x9E, 0x4A, 0x43, + 0x9A, 0x40, 0x99, 0xA1, 0x05, 0x63, 0xD8, 0x8B, 0x1E, 0x04, 0x81, 0x07, + 0x4F, 0xC9, 0xC5, 0x0C, 0x24, 0x30, 0x00, 0x10, 0xB6, 0x62, 0x31, 0xB2, + 0xE9, 0x66, 0x08, 0x0B, 0x00, 0x4E, 0x0A, 0x3A, 0x40, 0xAB, 0xB9, 0xAD, + 0x20, 0x0D, 0x74, 0x49, 0x81, 0x5C, 0x5A, 0x60, 0x06, 0x5B, 0xA9, 0x20, + 0x35, 0x2C, 0x68, 0x43, 0x18, 0xCA, 0xFE, 0xC0, 0x86, 0xBF, 0xB5, 0xE0, + 0x05, 0x2A, 0x58, 0x81, 0x08, 0x48, 0xB0, 0x02, 0xEC, 0x8C, 0xE1, 0x12, + 0x75, 0xA8, 0xC3, 0x94, 0x06, 0x61, 0x88, 0x41, 0xBC, 0x61, 0x58, 0x8C, + 0xA3, 0x44, 0x25, 0x26, 0xC1, 0x88, 0x35, 0x90, 0x81, 0x0C, 0x30, 0x58, + 0x03, 0x1F, 0x14, 0xB1, 0x86, 0x37, 0x0C, 0xE1, 0x1D, 0xC8, 0xBB, 0x91, + 0x37, 0xAC, 0xE0, 0x2D, 0x6B, 0x4C, 0x64, 0x74, 0xA7, 0x18, 0xC5, 0x1C, + 0x8C, 0x54, 0xB0, 0xD5, 0x61, 0xC3, 0x5D, 0x53, 0x14, 0x08, 0xEC, 0x4C, + 0xD2, 0x0F, 0x22, 0x9C, 0x02, 0x61, 0xD0, 0xC8, 0x86, 0x35, 0xA0, 0x01, + 0x30, 0x68, 0xC8, 0x62, 0x19, 0xB0, 0xF8, 0xC4, 0x2C, 0x98, 0x21, 0x23, + 0x66, 0xA8, 0xC2, 0x42, 0x63, 0xDC, 0x23, 0x1F, 0x0F, 0xC2, 0x0F, 0x51, + 0x50, 0x8C, 0x66, 0xB3, 0x98, 0x89, 0x99, 0x86, 0xD0, 0x0D, 0xB3, 0xC8, + 0x63, 0x08, 0x32, 0xB8, 0x84, 0x24, 0xBC, 0xE7, 0x16, 0x42, 0x28, 0x0A, + 0x11, 0xAE, 0xC1, 0x03, 0xDB, 0xCC, 0xC0, 0x82, 0x15, 0xA0, 0x60, 0x04, + 0x0D, 0xA8, 0x00, 0x10, 0x04, 0x93, 0x0D, 0x5A, 0x8C, 0x22, 0x14, 0xB1, + 0x18, 0x82, 0x0D, 0x86, 0xA0, 0x03, 0xC6, 0xDC, 0x8F, 0x19, 0x98, 0x10, + 0x81, 0xD0, 0x18, 0xD0, 0x00, 0x12, 0xA8, 0x60, 0x33, 0x7E, 0xAB, 0x55, + 0x18, 0x46, 0x63, 0xAB, 0x32, 0x9C, 0x41, 0x34, 0x7F, 0x2A, 0xCD, 0x0A, + 0xC4, 0x60, 0x3E, 0x35, 0x20, 0xAA, 0x0E, 0x63, 0x28, 0x83, 0x0A, 0x26, + 0x70, 0x03, 0x6D, 0xAC, 0x63, 0x52, 0xCC, 0xC0, 0xA0, 0x0F, 0x1C, 0xE0, + 0x01, 0x07, 0xA4, 0x70, 0x04, 0x06, 0x4C, 0x0D, 0x09, 0xC2, 0xA0, 0x28, + 0x33, 0xA4, 0x80, 0x2E, 0x7B, 0x73, 0x59, 0x69, 0xC8, 0x90, 0x86, 0x31, + 0xA8, 0xC0, 0x7C, 0x65, 0xB8, 0x8E, 0x18, 0xCE, 0x30, 0xFE, 0x2B, 0x31, + 0x88, 0xCF, 0x35, 0x82, 0xF0, 0x1E, 0x21, 0x84, 0x85, 0x08, 0x49, 0x4C, + 0x62, 0x12, 0x94, 0x88, 0xE7, 0x1B, 0xE2, 0xF3, 0x06, 0x36, 0xD8, 0x61, + 0x12, 0x6C, 0xC8, 0xC3, 0x10, 0xE4, 0xD1, 0x47, 0xAA, 0x78, 0xC3, 0x13, + 0xDD, 0xC2, 0xC6, 0x35, 0xAA, 0xF1, 0x8B, 0x5F, 0xE8, 0xA2, 0x16, 0xAE, + 0x28, 0x8C, 0x27, 0x4E, 0x01, 0x0B, 0x57, 0x04, 0x41, 0x4C, 0xC8, 0x2B, + 0x5E, 0xF5, 0x3C, 0x21, 0x8A, 0x5A, 0xFC, 0xC4, 0x1A, 0xD9, 0x90, 0x46, + 0x34, 0x74, 0x31, 0x8D, 0x18, 0x21, 0xE3, 0x60, 0x5E, 0x49, 0x0A, 0x29, + 0x28, 0xFA, 0xCF, 0x93, 0xBA, 0x4E, 0x5B, 0xAA, 0xF0, 0x06, 0x90, 0xFC, + 0xE1, 0x3C, 0xE8, 0x99, 0x69, 0x0E, 0xF6, 0x30, 0xCB, 0x3B, 0x7E, 0xF0, + 0x01, 0x3C, 0x34, 0x52, 0x92, 0xEA, 0x31, 0x19, 0xF9, 0xA8, 0x14, 0xB5, + 0xBD, 0x90, 0x80, 0x03, 0x0B, 0xE0, 0x64, 0x37, 0xFC, 0xE1, 0x0F, 0x58, + 0x98, 0x09, 0x16, 0xA6, 0xD4, 0x19, 0xCF, 0xEE, 0xF7, 0x8C, 0x55, 0x0A, + 0x60, 0x83, 0x20, 0xB8, 0x21, 0x2C, 0x57, 0x90, 0x37, 0x3D, 0x9D, 0xF0, + 0x49, 0x51, 0x2B, 0x54, 0x0B, 0xD4, 0x10, 0x1A, 0x43, 0xCD, 0xAA, 0x35, + 0xC2, 0x4C, 0x81, 0x0C, 0x26, 0x50, 0x81, 0x5C, 0x24, 0x73, 0x99, 0x64, + 0xD3, 0xC6, 0x10, 0x1C, 0x70, 0x02, 0x07, 0x8C, 0x20, 0x04, 0x0C, 0xF0, + 0xDB, 0x9F, 0xB4, 0x43, 0xC0, 0x30, 0xA0, 0x40, 0x86, 0x6B, 0x6B, 0x41, + 0x1A, 0x42, 0x13, 0x86, 0x4B, 0xAA, 0x85, 0x3B, 0xA5, 0x31, 0x95, 0x1A, + 0xEA, 0x70, 0x1C, 0x35, 0xB4, 0x01, 0x0F, 0x83, 0xD0, 0xC3, 0x20, 0x52, + 0x26, 0x08, 0x44, 0xC8, 0x73, 0x9E, 0x94, 0xA0, 0x04, 0x23, 0xEE, 0xC0, + 0x06, 0x14, 0xB0, 0x21, 0x0E, 0x6F, 0x50, 0x04, 0x1B, 0xFA, 0x10, 0x04, + 0xFE, 0x86, 0xA1, 0xB4, 0x29, 0xF2, 0xA8, 0x86, 0x27, 0x24, 0x82, 0x8D, + 0x89, 0x50, 0x44, 0x17, 0xE3, 0x32, 0xD7, 0x28, 0xE8, 0x28, 0x8B, 0x1D, + 0x04, 0x81, 0x5A, 0xA1, 0x25, 0xA3, 0x15, 0x56, 0xE1, 0x0A, 0x59, 0x48, + 0x83, 0x1A, 0xD9, 0x80, 0x86, 0x34, 0x2C, 0x02, 0x0D, 0xAF, 0x7C, 0x22, + 0x1A, 0x46, 0x51, 0x06, 0x32, 0x44, 0x61, 0xD2, 0xD9, 0x22, 0x17, 0x5B, + 0xD2, 0xA8, 0x45, 0x37, 0xB8, 0x71, 0x9B, 0xE6, 0xD9, 0x4C, 0x63, 0x43, + 0xC0, 0x04, 0xEC, 0x0A, 0x92, 0x0F, 0x69, 0x88, 0xE0, 0x03, 0x87, 0x10, + 0x59, 0xF7, 0x48, 0x96, 0xD8, 0x41, 0xB8, 0xC6, 0x38, 0x2B, 0xB0, 0x21, + 0x0A, 0x40, 0x80, 0x82, 0x09, 0x5C, 0x20, 0x08, 0xD9, 0x70, 0x69, 0x61, + 0x0C, 0x63, 0xCA, 0x1F, 0x0C, 0x01, 0x95, 0xF6, 0x4B, 0x85, 0x09, 0x26, + 0xD3, 0x81, 0x11, 0xAC, 0x20, 0x9A, 0x2B, 0x88, 0x95, 0xA0, 0x6E, 0x68, + 0xAB, 0xEE, 0x8C, 0xE1, 0x0C, 0x7B, 0xC1, 0x52, 0x9E, 0x06, 0x55, 0x06, + 0x35, 0x14, 0xE2, 0x81, 0x29, 0x48, 0xC1, 0x26, 0x99, 0xB1, 0x0E, 0x6D, + 0xE8, 0x26, 0x29, 0xCA, 0x00, 0x42, 0x02, 0x56, 0xC0, 0x00, 0x3B, 0x79, + 0xA0, 0x01, 0x28, 0x00, 0x66, 0x1A, 0xCA, 0xD0, 0x86, 0x32, 0x10, 0x73, + 0x05, 0x2D, 0x20, 0xC1, 0x0B, 0xD2, 0x60, 0x06, 0x33, 0xAC, 0x61, 0x81, + 0x2C, 0xD0, 0x4B, 0x0C, 0x4B, 0xF3, 0x82, 0xD2, 0x84, 0xC1, 0x35, 0xC7, + 0x11, 0x9F, 0xF8, 0x0A, 0xD1, 0x86, 0x3C, 0x14, 0xC2, 0x3D, 0xF3, 0x94, + 0x67, 0x25, 0x18, 0x91, 0x07, 0x18, 0xC0, 0x40, 0xB3, 0x6F, 0xB8, 0xDC, + 0x22, 0x88, 0x90, 0xDC, 0xA6, 0xE0, 0x83, 0x16, 0x56, 0xF4, 0x96, 0x41, + 0x0F, 0x44, 0x8B, 0xD2, 0x79, 0xE2, 0x13, 0x9F, 0x80, 0x06, 0x2B, 0x76, + 0xB0, 0x03, 0xD9, 0xFE, 0xCE, 0x16, 0x2D, 0xAB, 0xA8, 0x85, 0x34, 0xDC, + 0xB8, 0x0D, 0x5D, 0xE8, 0xA2, 0x8D, 0xA9, 0x5B, 0x86, 0x27, 0x62, 0xA1, + 0x8C, 0x58, 0xC4, 0x88, 0x78, 0x05, 0x39, 0xEE, 0x91, 0xDB, 0x1C, 0x95, + 0x5A, 0xF8, 0x83, 0xA5, 0x63, 0x1A, 0x0A, 0x2B, 0x30, 0x91, 0x31, 0x20, + 0xB4, 0xE2, 0x75, 0xAA, 0xF0, 0x80, 0x0A, 0x22, 0x41, 0x32, 0xB7, 0x1C, + 0x02, 0x0F, 0xC7, 0xC1, 0x83, 0x03, 0xD3, 0x80, 0x07, 0x16, 0x8C, 0xC0, + 0x86, 0x23, 0x90, 0x81, 0x01, 0x70, 0x50, 0x84, 0x6D, 0x34, 0x4F, 0x2C, + 0xA8, 0x60, 0x86, 0xCE, 0x7E, 0x10, 0x88, 0xA6, 0xF6, 0x0C, 0x31, 0x93, + 0x01, 0x01, 0x2C, 0xC3, 0x70, 0xB4, 0xA5, 0xF1, 0x15, 0x4F, 0x97, 0x40, + 0x83, 0x5A, 0xC4, 0xE0, 0x86, 0xEF, 0x24, 0x50, 0x05, 0xA3, 0x11, 0x94, + 0xF8, 0xDC, 0x80, 0xCD, 0x13, 0x88, 0x00, 0x02, 0xAA, 0x58, 0xC7, 0x34, + 0x76, 0xC3, 0x8C, 0x68, 0x68, 0x50, 0x05, 0x1A, 0xCE, 0x4C, 0x03, 0x66, + 0x55, 0x86, 0xBE, 0x99, 0xC1, 0x0D, 0x7C, 0x0A, 0xCD, 0x72, 0x52, 0xF0, + 0x02, 0x12, 0xB4, 0x80, 0x05, 0x2F, 0x20, 0x67, 0x2D, 0xF5, 0x44, 0x2B, + 0x3D, 0xED, 0xE1, 0x2E, 0xE1, 0xA9, 0xC3, 0x62, 0xF1, 0x53, 0x87, 0x42, + 0x6C, 0x37, 0xB2, 0x95, 0x28, 0xE2, 0x24, 0xD6, 0xC0, 0x06, 0x36, 0xDC, + 0xE1, 0x0E, 0x6F, 0x78, 0x43, 0x23, 0xAC, 0xE0, 0x66, 0x85, 0xE4, 0x83, + 0x16, 0x9E, 0xB0, 0x06, 0x41, 0x27, 0x52, 0x0D, 0x5A, 0x20, 0x74, 0x15, + 0x9F, 0x30, 0xD7, 0x2A, 0x90, 0xB1, 0x8A, 0x1C, 0x00, 0xA1, 0x1F, 0xC9, + 0xC5, 0x47, 0x11, 0x4E, 0xE1, 0x0A, 0x9E, 0x54, 0x63, 0x1B, 0xBE, 0x03, + 0x98, 0x2C, 0x62, 0x51, 0x24, 0xA4, 0xB0, 0x22, 0x1A, 0xB1, 0x08, 0x05, + 0x9B, 0xCF, 0xED, 0xF0, 0xA7, 0xEC, 0xFE, 0xA3, 0x14, 0xD9, 0x60, 0xE9, + 0x6D, 0x2C, 0x65, 0xB3, 0x3B, 0x4F, 0x43, 0x8C, 0xD5, 0xCA, 0x07, 0x2A, + 0x3C, 0x10, 0x86, 0x46, 0x92, 0xCC, 0x7B, 0xDB, 0xDB, 0x1A, 0x1E, 0x2E, + 0x91, 0x02, 0x3D, 0xD0, 0x65, 0x2F, 0x21, 0xF0, 0xC0, 0x04, 0x70, 0xD0, + 0x84, 0x6E, 0x44, 0x83, 0x16, 0xA7, 0xC0, 0x04, 0x2A, 0x66, 0xE1, 0x83, + 0x19, 0xE8, 0x20, 0xBE, 0xF3, 0x65, 0x06, 0x2A, 0x58, 0xB9, 0x00, 0x1B, + 0x62, 0x67, 0xBC, 0x29, 0x20, 0x66, 0x0A, 0x0A, 0x75, 0xCB, 0xBE, 0x9E, + 0x61, 0x81, 0x67, 0x28, 0x95, 0xAA, 0x05, 0x05, 0x9B, 0xE3, 0x90, 0x3A, + 0x05, 0x1C, 0x78, 0x40, 0x28, 0xBA, 0x51, 0x0D, 0x3C, 0xEA, 0x86, 0xAD, + 0x0E, 0x48, 0x81, 0x02, 0x3C, 0xA8, 0x82, 0xE5, 0x5C, 0x47, 0x2F, 0x7D, + 0x65, 0x5B, 0xD8, 0xD3, 0xB0, 0xA8, 0x17, 0x9C, 0x00, 0x05, 0x2E, 0x00, + 0xDC, 0x0A, 0x70, 0x79, 0xEA, 0xA8, 0x9D, 0x21, 0x0F, 0x70, 0xC0, 0x8B, + 0x62, 0x0F, 0x31, 0x88, 0x41, 0x98, 0xC1, 0x7B, 0x83, 0x30, 0x16, 0x11, + 0x27, 0xBB, 0xED, 0xCB, 0xB1, 0x81, 0x0F, 0x7C, 0xB8, 0x03, 0x19, 0xFE, + 0x20, 0x8A, 0xFE, 0x34, 0xFC, 0x61, 0x2A, 0x91, 0xC8, 0x35, 0x42, 0xF7, + 0x8B, 0x5A, 0x54, 0xA3, 0x16, 0xAB, 0xB0, 0xC5, 0x1C, 0x48, 0xF4, 0xC5, + 0x1D, 0xE8, 0x1B, 0xB9, 0xF8, 0x08, 0x02, 0x46, 0x80, 0xB2, 0x93, 0x69, + 0x7C, 0xB4, 0xA3, 0xAC, 0x48, 0xD7, 0x32, 0xEC, 0xA8, 0x0D, 0x56, 0x30, + 0xFC, 0xE1, 0xAA, 0xA7, 0x0A, 0x39, 0x56, 0xCA, 0x8D, 0x31, 0x55, 0x0A, + 0x15, 0x34, 0x9F, 0x43, 0x05, 0x0D, 0xC2, 0x9F, 0x50, 0x38, 0x40, 0x0D, + 0x91, 0x70, 0x03, 0xB2, 0x40, 0x5C, 0x06, 0xB5, 0xF8, 0x4D, 0x06, 0x23, + 0xF8, 0xC0, 0xD1, 0x8C, 0x36, 0x1D, 0x0E, 0x64, 0xA0, 0xFE, 0x09, 0xDC, + 0x10, 0x52, 0x61, 0x50, 0x11, 0x0D, 0x1F, 0xDC, 0xC0, 0x07, 0x97, 0x6E, + 0x4C, 0x2C, 0xEE, 0x57, 0xDF, 0x57, 0xCE, 0xF2, 0xEB, 0x2B, 0xB8, 0xC4, + 0x0D, 0x95, 0x9D, 0x06, 0xB9, 0xA9, 0x21, 0x50, 0x7F, 0x4A, 0xE0, 0x0A, + 0xB8, 0x33, 0xCC, 0x36, 0x98, 0xAC, 0x0D, 0x0B, 0x4C, 0xA1, 0x05, 0x30, + 0xA1, 0x8E, 0x69, 0xF8, 0xA3, 0x15, 0x11, 0xC6, 0x04, 0x34, 0x15, 0x30, + 0x02, 0xD3, 0x48, 0x7D, 0x3A, 0xB6, 0x12, 0xE0, 0x5E, 0x6A, 0xD5, 0x61, + 0x3D, 0xB8, 0xC1, 0x2D, 0xB1, 0xC0, 0x09, 0xC4, 0xCA, 0x0D, 0x85, 0x46, + 0xDD, 0xBC, 0x58, 0x1D, 0x5C, 0x09, 0x6C, 0xE0, 0x81, 0x7D, 0xDC, 0x85, + 0x7D, 0xE4, 0x98, 0xDF, 0x11, 0xD1, 0xB6, 0x31, 0xC2, 0x3D, 0xBD, 0x41, + 0xB8, 0x95, 0x80, 0x11, 0xB8, 0xC2, 0xEA, 0x19, 0x04, 0x28, 0x45, 0x44, + 0xE8, 0xA4, 0x16, 0x34, 0xE8, 0x42, 0x47, 0x98, 0xCB, 0x29, 0x18, 0x5C, + 0x10, 0x14, 0x01, 0x96, 0x85, 0x16, 0x3F, 0x08, 0xC1, 0x29, 0x88, 0x02, + 0x34, 0x54, 0xC3, 0x6E, 0x55, 0xC3, 0x32, 0xE8, 0x82, 0x4F, 0xB0, 0x82, + 0x2D, 0xB0, 0x42, 0x1C, 0x25, 0x1C, 0x2B, 0x1C, 0x1E, 0x07, 0xFA, 0xA0, + 0x53, 0x50, 0x43, 0x2D, 0x80, 0x83, 0x73, 0x15, 0xD5, 0x51, 0xC9, 0x5E, + 0x2A, 0xCC, 0x01, 0x11, 0xF0, 0x83, 0x75, 0xED, 0x03, 0x3C, 0xF4, 0x06, + 0x21, 0x20, 0x42, 0x19, 0x50, 0xD2, 0xDA, 0xB0, 0x4D, 0x1A, 0xE0, 0x09, + 0x7E, 0xDD, 0xD0, 0xD7, 0x5D, 0x86, 0x0C, 0x48, 0xC0, 0x0D, 0x60, 0xC2, + 0x56, 0x94, 0x89, 0xC6, 0x44, 0x83, 0x0E, 0x24, 0xC6, 0x10, 0xD4, 0x8F, + 0xFD, 0xF8, 0x8C, 0x04, 0x24, 0x80, 0xFD, 0x2D, 0xC7, 0x7D, 0x2D, 0x5B, + 0xAD, 0x84, 0x80, 0x5E, 0x1C, 0x4A, 0x39, 0x8D, 0x86, 0xFA, 0x79, 0x95, + 0xFE, 0x71, 0xF8, 0xC9, 0x18, 0xEC, 0xD0, 0x94, 0xA0, 0x81, 0x76, 0x14, + 0xD3, 0x13, 0x6C, 0xC5, 0xFD, 0x54, 0x9F, 0x36, 0xCC, 0x41, 0x02, 0x3C, + 0x93, 0x07, 0x15, 0xCA, 0x09, 0x90, 0x40, 0xDF, 0xB8, 0x80, 0x0C, 0x3D, + 0xCD, 0x0A, 0xB8, 0x80, 0x18, 0x80, 0x18, 0xF9, 0x39, 0x4D, 0x0A, 0xAC, + 0xC6, 0xAB, 0xD4, 0xCA, 0x72, 0xB0, 0x80, 0x19, 0x68, 0x8D, 0x19, 0x0C, + 0x42, 0xF8, 0xE8, 0xC1, 0x0E, 0xD9, 0x1D, 0x21, 0xF0, 0xDD, 0x64, 0xF5, + 0x5D, 0x25, 0xDC, 0x41, 0x0D, 0x0C, 0x59, 0x1C, 0x94, 0x80, 0x1C, 0xBC, + 0x82, 0x3E, 0xE8, 0xD1, 0xEA, 0xE5, 0x43, 0x29, 0x88, 0x02, 0x37, 0x44, + 0x04, 0x44, 0xFC, 0x02, 0x2D, 0x80, 0x19, 0x52, 0x79, 0xC2, 0x1C, 0xD8, + 0x42, 0x4C, 0x0C, 0x41, 0x11, 0x68, 0x0E, 0x72, 0xBD, 0x83, 0x27, 0xD0, + 0x82, 0x2A, 0x24, 0x03, 0x35, 0x48, 0x03, 0x1B, 0x09, 0x05, 0x1C, 0xC9, + 0x02, 0xBA, 0xC4, 0x91, 0x8C, 0xF0, 0x60, 0xE2, 0xFD, 0xE0, 0x0F, 0xD2, + 0x42, 0x9C, 0xB9, 0x4F, 0x32, 0xCC, 0x82, 0x2A, 0xA4, 0x42, 0x28, 0x48, + 0x8F, 0x27, 0xC4, 0xE2, 0xC6, 0xB5, 0x83, 0x09, 0x70, 0x40, 0x1B, 0x08, + 0x5F, 0x07, 0xBC, 0xD2, 0x5C, 0x24, 0x9B, 0x1A, 0x5C, 0xC2, 0x25, 0x34, + 0x8D, 0x04, 0x8D, 0x40, 0xAD, 0x8C, 0xC0, 0x04, 0xE8, 0x00, 0x73, 0x1D, + 0x55, 0xC6, 0x7C, 0x02, 0x2B, 0xE8, 0x80, 0x0F, 0xF8, 0xC0, 0x0F, 0xB4, + 0x89, 0x6E, 0xA4, 0x09, 0xFF, 0xC8, 0x80, 0x7E, 0x75, 0xC9, 0x5E, 0x48, + 0x4D, 0x1A, 0x9C, 0xC1, 0xAA, 0x99, 0x81, 0x71, 0x88, 0xDD, 0xDC, 0x74, + 0xCA, 0x24, 0x01, 0xE0, 0xD7, 0x9D, 0xC0, 0x04, 0xF8, 0xC0, 0x3A, 0x64, + 0x43, 0x32, 0xA8, 0x42, 0x2C, 0x20, 0x05, 0x26, 0x24, 0xC0, 0x08, 0x28, + 0x00, 0x08, 0x60, 0xFE, 0x07, 0x5E, 0x85, 0xC0, 0xD0, 0xC9, 0xD0, 0x78, + 0x85, 0x41, 0xAA, 0x74, 0x58, 0x19, 0x64, 0x53, 0xF9, 0xA9, 0x1F, 0x1A, + 0xD4, 0x8D, 0xA7, 0xA8, 0xC1, 0xD4, 0x70, 0xC6, 0x89, 0x99, 0x01, 0x1A, + 0x0C, 0x42, 0x21, 0x08, 0x42, 0x1E, 0xD8, 0x85, 0xF6, 0x1C, 0x02, 0x25, + 0xBC, 0xC7, 0x04, 0x6E, 0x5B, 0x25, 0xF0, 0xC1, 0x1A, 0xC4, 0xC1, 0x1D, + 0xC4, 0x41, 0x0C, 0x0C, 0xC1, 0x06, 0x52, 0x63, 0x72, 0xD1, 0xA2, 0x37, + 0x60, 0xD1, 0x69, 0x55, 0xC3, 0x2B, 0xD4, 0x82, 0xCC, 0x8D, 0x42, 0x94, + 0x9D, 0x02, 0x34, 0x7C, 0x02, 0x11, 0xA4, 0x60, 0x72, 0xED, 0x03, 0x11, + 0x60, 0x44, 0x0D, 0xF2, 0xD6, 0xC0, 0xE8, 0x02, 0x35, 0x14, 0xDC, 0x27, + 0xAC, 0x42, 0x8C, 0xDC, 0x5A, 0x2C, 0x90, 0x42, 0x35, 0xB2, 0x25, 0x42, + 0xE0, 0x03, 0x20, 0x51, 0xDC, 0x7A, 0x69, 0x24, 0x2A, 0x8C, 0x02, 0x2A, + 0x70, 0x9E, 0x59, 0xE0, 0x03, 0x35, 0x34, 0xC0, 0x02, 0x74, 0x40, 0x01, + 0xA2, 0xC1, 0x25, 0x6C, 0x4F, 0x24, 0x08, 0x02, 0x5D, 0x8C, 0x57, 0x08, + 0x08, 0x95, 0x02, 0x20, 0xE6, 0x02, 0x18, 0x40, 0x0E, 0x64, 0x43, 0x90, + 0xD4, 0xC2, 0xC5, 0x31, 0xC3, 0x3E, 0xF2, 0x23, 0xCF, 0xB0, 0xC2, 0xFD, + 0x60, 0x82, 0x0D, 0x24, 0x40, 0x03, 0xA8, 0x80, 0x16, 0x9A, 0x41, 0x18, + 0x54, 0x93, 0x02, 0x85, 0x81, 0xA8, 0x8D, 0xC6, 0xF8, 0x95, 0x50, 0x39, + 0xF9, 0x49, 0xD3, 0x8C, 0x4A, 0x42, 0xC6, 0x8D, 0x07, 0x48, 0xC0, 0x0C, + 0x28, 0xC3, 0x3A, 0x28, 0xC3, 0xA4, 0x01, 0x64, 0x02, 0x74, 0xC0, 0x02, + 0x68, 0x26, 0x76, 0x20, 0x0D, 0x0A, 0x48, 0x0D, 0xA7, 0x8D, 0x00, 0x39, + 0xA9, 0x01, 0xD9, 0x29, 0xD0, 0x0B, 0x34, 0x4D, 0xB3, 0x9D, 0x01, 0x1E, + 0xA0, 0x81, 0xA0, 0x9C, 0x81, 0xA8, 0xFE, 0x7C, 0x58, 0x1B, 0x10, 0x4B, + 0x82, 0x35, 0xE0, 0xAF, 0x18, 0x8B, 0x24, 0x18, 0x4B, 0x25, 0xF8, 0x5D, + 0x8F, 0xC5, 0x01, 0x1B, 0xF8, 0xC1, 0x1D, 0xFC, 0x80, 0x0E, 0xBC, 0xE2, + 0x0F, 0x92, 0x84, 0x2A, 0x90, 0x82, 0x53, 0x62, 0xD1, 0x4E, 0xBC, 0x82, + 0x2E, 0xD0, 0x42, 0x2B, 0xB8, 0x42, 0x94, 0xB1, 0x02, 0x34, 0xF4, 0x22, + 0x11, 0xE8, 0xDB, 0x52, 0xBA, 0x0E, 0x3C, 0xEC, 0x00, 0x7A, 0xD2, 0x02, + 0x8A, 0x88, 0xE5, 0x32, 0x50, 0x03, 0x2C, 0xA4, 0x0B, 0x2A, 0x18, 0x85, + 0x34, 0x9E, 0x42, 0x5B, 0x02, 0x28, 0x41, 0xF4, 0x83, 0x8F, 0x00, 0x89, + 0xA4, 0xC0, 0x42, 0x2B, 0xA4, 0x02, 0x37, 0xFA, 0x40, 0x32, 0xD8, 0xDE, + 0x68, 0x7D, 0x09, 0x21, 0x6C, 0x0F, 0x21, 0xBC, 0x47, 0x94, 0x88, 0xC1, + 0x07, 0x38, 0x80, 0x03, 0x04, 0x80, 0x00, 0x08, 0x40, 0x00, 0x0C, 0x40, + 0x87, 0x02, 0x40, 0x00, 0x10, 0x80, 0x0E, 0x50, 0xC3, 0xF2, 0xCD, 0xC2, + 0x16, 0xA1, 0x82, 0x32, 0xF8, 0x40, 0x0E, 0x04, 0x82, 0x0F, 0x3C, 0x86, + 0xFD, 0x40, 0x4F, 0x7D, 0x71, 0x40, 0x68, 0xAA, 0xC1, 0x69, 0xE4, 0x4D, + 0x02, 0xA5, 0xC1, 0x0B, 0xB0, 0x40, 0x6B, 0x1C, 0x0A, 0x0B, 0x68, 0xCD, + 0x19, 0x94, 0x46, 0x19, 0xB8, 0xE4, 0xD6, 0x80, 0xD8, 0x25, 0x84, 0x81, + 0x0A, 0x20, 0x8D, 0x04, 0x58, 0x00, 0x2C, 0x04, 0x09, 0x2B, 0x1C, 0xC6, + 0x28, 0xC9, 0x09, 0x07, 0x90, 0x00, 0x08, 0x18, 0xA9, 0x9D, 0x00, 0x90, + 0x9D, 0x48, 0x13, 0x0A, 0xB0, 0xCD, 0xDC, 0xF4, 0x0D, 0x1A, 0x80, 0xE6, + 0x75, 0x84, 0x41, 0x1B, 0x24, 0x5D, 0xA1, 0xC4, 0x5D, 0xD6, 0x90, 0xC7, + 0xF6, 0xE4, 0x41, 0x71, 0x16, 0xC2, 0x1E, 0x30, 0xE7, 0x3C, 0x25, 0x02, + 0x50, 0x6E, 0xDB, 0x23, 0xC4, 0xC1, 0x0F, 0xFC, 0xC1, 0xFE, 0x1F, 0xFC, + 0x40, 0x0E, 0x84, 0x04, 0x5B, 0xBA, 0x42, 0x29, 0x34, 0x1E, 0x54, 0xE6, + 0xA2, 0x2E, 0x3C, 0x54, 0x91, 0x78, 0xC2, 0x2A, 0xB0, 0xA7, 0x27, 0x34, + 0x41, 0xE6, 0xCD, 0x16, 0x37, 0xE4, 0x00, 0x2C, 0xD4, 0x82, 0x1B, 0x49, + 0x03, 0xEF, 0xD0, 0x20, 0x35, 0x20, 0x43, 0xEA, 0x84, 0x42, 0x34, 0x9E, + 0xDE, 0x06, 0x86, 0x63, 0x80, 0xFA, 0xE0, 0x2F, 0xB8, 0xC2, 0x10, 0xFE, + 0x88, 0x36, 0x58, 0x0A, 0x9A, 0xD8, 0x0C, 0x10, 0x54, 0xC3, 0x41, 0xD0, + 0x83, 0x3F, 0xD4, 0x10, 0xB2, 0xBC, 0x47, 0xF7, 0xB0, 0xC0, 0x02, 0xAC, + 0x21, 0x03, 0x40, 0x80, 0x08, 0x88, 0xC0, 0x04, 0x20, 0xA6, 0x02, 0x18, + 0xC0, 0x04, 0x48, 0x40, 0xCB, 0x35, 0xA6, 0x3F, 0xB8, 0x42, 0x28, 0x7C, + 0xC2, 0xF3, 0xD0, 0x80, 0x0F, 0x98, 0x80, 0x0F, 0x34, 0x46, 0x2A, 0x1C, + 0x83, 0x52, 0xD4, 0xD7, 0x02, 0xE4, 0x97, 0x1B, 0xD0, 0x05, 0x7E, 0x71, + 0x87, 0xCB, 0xE4, 0xC9, 0x68, 0x74, 0xC6, 0x19, 0x4C, 0xC9, 0x25, 0xEC, + 0x45, 0xAE, 0x94, 0x41, 0x1D, 0x80, 0x29, 0x6B, 0xA0, 0x86, 0x22, 0x8A, + 0x40, 0x04, 0xB4, 0xC2, 0x83, 0x69, 0x64, 0x28, 0xA8, 0xC2, 0x10, 0x08, + 0x8D, 0x02, 0xCC, 0x50, 0x7E, 0xA5, 0x00, 0xAB, 0xA0, 0x40, 0x6A, 0x18, + 0xA9, 0xD0, 0x95, 0x81, 0xB3, 0x8E, 0x80, 0x0B, 0xB8, 0x00, 0x1A, 0xCC, + 0x1D, 0x76, 0x8C, 0x0A, 0x96, 0xEC, 0xC9, 0xDC, 0x4D, 0x12, 0x22, 0x2C, + 0x16, 0xAF, 0xAC, 0xD3, 0x25, 0xE0, 0x01, 0x7B, 0xC0, 0x53, 0x50, 0x56, + 0x42, 0x27, 0x74, 0xC2, 0x1F, 0xD4, 0xC0, 0x1F, 0xD0, 0x41, 0x1C, 0xE4, + 0x80, 0x34, 0xB4, 0xA5, 0x42, 0x61, 0x51, 0x44, 0x18, 0x88, 0xBF, 0xE4, + 0xA9, 0x28, 0xF0, 0x6A, 0x28, 0x28, 0x43, 0x94, 0x79, 0x82, 0xA1, 0x9E, + 0xFE, 0x14, 0x7F, 0xB4, 0x43, 0x10, 0xD4, 0x0B, 0x34, 0x58, 0xC3, 0x34, + 0x54, 0xC3, 0xC0, 0x0C, 0x8C, 0x57, 0xC0, 0xC2, 0xA4, 0xDA, 0x11, 0x95, + 0xA9, 0x02, 0xA6, 0x06, 0xA8, 0x2B, 0xFC, 0xC2, 0x8F, 0x70, 0xC3, 0x36, + 0x4C, 0x0A, 0x2C, 0xA4, 0x02, 0x2A, 0xA0, 0x02, 0x4B, 0x64, 0x5C, 0xF1, + 0xF0, 0xC3, 0x28, 0x70, 0x00, 0x03, 0xB0, 0x80, 0x71, 0x5E, 0xC2, 0x07, + 0x30, 0xC0, 0x01, 0x1C, 0x80, 0x05, 0x58, 0x00, 0x06, 0x58, 0xC0, 0x05, + 0x30, 0x2D, 0x06, 0x38, 0xAD, 0xD3, 0x5E, 0xC0, 0x01, 0xEC, 0xC0, 0x37, + 0xD0, 0x6C, 0x71, 0x61, 0x02, 0x32, 0xC4, 0x82, 0x0E, 0xE8, 0x40, 0xF4, + 0x51, 0x66, 0x2C, 0x3C, 0x03, 0x28, 0x98, 0x80, 0x03, 0x0C, 0x40, 0x1C, + 0xD2, 0x4D, 0x16, 0x7E, 0x47, 0x68, 0xA4, 0x00, 0x0B, 0x28, 0x60, 0xBA, + 0xE2, 0xC1, 0x21, 0x9C, 0x81, 0x4B, 0x76, 0x8A, 0xD3, 0x9C, 0x81, 0x19, + 0xF4, 0x55, 0xB3, 0x28, 0x22, 0x09, 0x94, 0x00, 0x06, 0x8C, 0x02, 0xAD, + 0xF1, 0x1C, 0x9A, 0x04, 0x41, 0x02, 0x38, 0x80, 0xB9, 0x86, 0x01, 0x36, + 0xF9, 0x57, 0x01, 0x7A, 0x89, 0xDA, 0x48, 0x4D, 0x69, 0x10, 0x60, 0x0A, + 0xF4, 0xE6, 0x18, 0x64, 0x93, 0x73, 0xBC, 0xD8, 0x18, 0xF4, 0x4A, 0x72, + 0xEE, 0xE4, 0x78, 0x90, 0x47, 0x1D, 0xE4, 0xC1, 0x1B, 0xE4, 0xC1, 0x20, + 0x34, 0xCE, 0x64, 0x19, 0xAC, 0xC1, 0x36, 0x83, 0x23, 0xFC, 0x80, 0x1C, + 0x00, 0x02, 0x20, 0x1C, 0x81, 0x2E, 0xB0, 0x65, 0xC4, 0xE9, 0xE9, 0x53, + 0x22, 0xD4, 0x4F, 0x94, 0x82, 0x2B, 0x6C, 0x11, 0x89, 0x44, 0x03, 0x11, + 0xAC, 0x82, 0x27, 0xC0, 0x43, 0x72, 0x91, 0x83, 0x11, 0x20, 0x4C, 0x98, + 0x45, 0x43, 0x97, 0x99, 0x6C, 0x2D, 0xB0, 0x02, 0x2A, 0xD4, 0x5B, 0xE9, + 0x45, 0x03, 0x2B, 0xFE, 0xE4, 0xD9, 0xBB, 0x5C, 0xAA, 0xCB, 0xE6, 0x48, + 0xC4, 0x59, 0x03, 0x4B, 0x6D, 0xC3, 0x36, 0x38, 0x8F, 0x2A, 0xA8, 0x02, + 0x2B, 0xA8, 0x02, 0x10, 0x44, 0xD1, 0x41, 0xE4, 0x83, 0x2B, 0xEC, 0xC0, + 0x00, 0x30, 0x80, 0x0C, 0x30, 0xEE, 0x01, 0x40, 0xED, 0x05, 0x3C, 0x81, + 0x12, 0x28, 0xC1, 0x12, 0x98, 0xEF, 0x05, 0xD0, 0xC0, 0x05, 0x60, 0x00, + 0xD3, 0x4E, 0x40, 0x0E, 0x6C, 0x43, 0x36, 0x4C, 0x03, 0xC6, 0x84, 0xC2, + 0x51, 0xEC, 0xE3, 0x3E, 0x62, 0x82, 0x26, 0xA4, 0x82, 0x99, 0x61, 0x82, + 0x04, 0x38, 0x00, 0x03, 0x2C, 0x40, 0x0B, 0xE8, 0x01, 0x1C, 0x3C, 0x1B, + 0x25, 0xF6, 0x52, 0x71, 0xAA, 0x80, 0xDA, 0xC6, 0x06, 0x90, 0x76, 0x8A, + 0x19, 0x5C, 0xC2, 0xA9, 0xE8, 0x09, 0x0B, 0x29, 0x62, 0x0A, 0x94, 0xC0, + 0x04, 0x10, 0x41, 0xA4, 0x7C, 0xC5, 0x61, 0xE4, 0x40, 0x02, 0x70, 0x6F, + 0x0B, 0x9D, 0x81, 0x0A, 0xA0, 0x8F, 0xE3, 0xA6, 0x46, 0xBA, 0x76, 0x80, + 0x0A, 0xA8, 0xE4, 0x68, 0xB2, 0x00, 0xAE, 0x74, 0xC7, 0x66, 0x7E, 0x5D, + 0x35, 0x0D, 0x93, 0xD6, 0xB8, 0x01, 0xB6, 0x86, 0xC7, 0xF7, 0x88, 0x4F, + 0xF9, 0xE4, 0xC1, 0x63, 0x25, 0xC2, 0x24, 0x6C, 0xDB, 0xE7, 0x76, 0x42, + 0x33, 0x70, 0x82, 0x1C, 0xFC, 0x00, 0x20, 0x70, 0x82, 0x11, 0x44, 0x03, + 0x5B, 0xE2, 0xC3, 0xEB, 0x4A, 0x04, 0x16, 0x55, 0x84, 0xBF, 0xD8, 0x56, + 0xB9, 0xE4, 0x63, 0x34, 0xCC, 0x41, 0x2C, 0x8C, 0x82, 0x14, 0x21, 0x97, + 0x37, 0xE4, 0xC0, 0x32, 0xA8, 0xC8, 0x36, 0x50, 0x43, 0x16, 0xF3, 0x0E, + 0x1C, 0xD1, 0x82, 0x4C, 0xC8, 0x08, 0x52, 0xC4, 0x82, 0x2B, 0xC0, 0x67, + 0x54, 0x54, 0x97, 0xF2, 0x62, 0x0B, 0x3C, 0xD4, 0x22, 0x90, 0x6C, 0x83, + 0xD8, 0x70, 0x23, 0x2B, 0xA4, 0x02, 0xFE, 0x0D, 0x24, 0xC9, 0x41, 0xC0, + 0x0E, 0x3E, 0x08, 0xC1, 0x04, 0x78, 0x8D, 0xD1, 0x2E, 0xAD, 0xF9, 0x3E, + 0xC1, 0x1E, 0x3F, 0x41, 0x14, 0xF0, 0xF1, 0x13, 0x2C, 0x01, 0x0D, 0x58, + 0x40, 0x98, 0x38, 0x57, 0x36, 0xD4, 0x82, 0x91, 0xCC, 0x02, 0x2B, 0xCC, + 0x80, 0x0F, 0x94, 0x52, 0x63, 0xE0, 0x6F, 0x34, 0xD0, 0xC1, 0x04, 0x24, + 0x40, 0x0B, 0x94, 0xC1, 0x00, 0x9C, 0x01, 0x21, 0x9C, 0xC1, 0x25, 0xDC, + 0xA1, 0xA1, 0x49, 0xE1, 0xA8, 0xEC, 0xC9, 0xE4, 0x2E, 0xE4, 0x81, 0x21, + 0xD6, 0x97, 0x26, 0xA4, 0x1B, 0x94, 0xA4, 0x0A, 0x84, 0x80, 0x04, 0xE8, + 0xC0, 0x83, 0x31, 0xC3, 0xF3, 0x84, 0x82, 0x0E, 0x10, 0x00, 0x6D, 0xA6, + 0x81, 0x3B, 0xC6, 0x98, 0x24, 0x96, 0x81, 0x94, 0x62, 0x46, 0xAC, 0x90, + 0x93, 0x19, 0xB8, 0x40, 0xD1, 0x65, 0x0D, 0xDD, 0xA8, 0x81, 0x04, 0xE5, + 0xC9, 0xDC, 0x14, 0xE7, 0x6B, 0x98, 0x01, 0xB0, 0x08, 0xC2, 0x7A, 0x08, + 0x42, 0x1B, 0xC0, 0x01, 0x1C, 0x10, 0x8B, 0x21, 0xEC, 0x41, 0xB8, 0x6D, + 0x42, 0x33, 0x6C, 0xC2, 0x34, 0x37, 0x83, 0x1C, 0x90, 0x2E, 0x20, 0xD8, + 0x00, 0xEA, 0x8E, 0x31, 0x4A, 0xED, 0x83, 0x28, 0xBC, 0xC2, 0x11, 0x5B, + 0x83, 0x45, 0x98, 0xA7, 0x28, 0xB4, 0x82, 0xBA, 0x8C, 0x42, 0x1C, 0x11, + 0x01, 0x2B, 0x44, 0xF1, 0x6C, 0x91, 0x84, 0x37, 0xEC, 0xC0, 0x58, 0x6A, + 0x83, 0xC0, 0x88, 0x2C, 0x34, 0xBC, 0x02, 0x1C, 0x19, 0x5C, 0x0E, 0x2A, + 0x1C, 0x95, 0xD5, 0xC2, 0xBB, 0x74, 0xB3, 0x19, 0x43, 0x85, 0x34, 0x94, + 0x42, 0x3F, 0x38, 0xD7, 0x36, 0x78, 0x2A, 0x1E, 0x79, 0x63, 0x28, 0xF8, + 0x40, 0x0F, 0x9A, 0x05, 0x7F, 0xE0, 0x02, 0x0F, 0x18, 0x2D, 0xF8, 0x5E, + 0x80, 0x1E, 0x3B, 0xC1, 0x1F, 0x33, 0x2D, 0x0D, 0x04, 0xFE, 0xB2, 0xF9, + 0xD2, 0xE3, 0x8F, 0xB8, 0x54, 0x58, 0x64, 0x64, 0xB0, 0xEA, 0x40, 0xFD, + 0xB4, 0xA8, 0x2A, 0x19, 0x80, 0x03, 0x70, 0xC0, 0xD6, 0x2C, 0x40, 0x0A, + 0xD8, 0x9D, 0x5C, 0x08, 0xDB, 0x95, 0xE0, 0x41, 0xAB, 0x29, 0x20, 0x95, + 0xA8, 0x01, 0x0B, 0x18, 0x07, 0xA9, 0x98, 0x41, 0x1B, 0x2C, 0x24, 0xD7, + 0xAC, 0x30, 0x09, 0x44, 0x40, 0x0E, 0xA8, 0x88, 0x32, 0xB4, 0x02, 0x9A, + 0xE8, 0xC0, 0xD8, 0x3E, 0x49, 0xA9, 0xB4, 0xC6, 0x42, 0x8A, 0xC1, 0x09, + 0x40, 0xA9, 0x18, 0x20, 0x5A, 0xAD, 0x08, 0x0A, 0x38, 0xE1, 0xCA, 0x5E, + 0x00, 0xD3, 0xA2, 0x48, 0x62, 0xAE, 0x68, 0xCD, 0x6B, 0xF8, 0xCA, 0x3A, + 0x75, 0x4F, 0x1D, 0xC0, 0x41, 0x1D, 0x18, 0x42, 0x9A, 0xEE, 0xC1, 0x21, + 0xF8, 0xC1, 0x23, 0x74, 0x42, 0x35, 0x1F, 0x43, 0x33, 0x00, 0xC2, 0x0F, + 0x03, 0x82, 0x11, 0xA0, 0x6E, 0x35, 0xE2, 0xC3, 0x28, 0xD4, 0x82, 0x53, + 0x4A, 0x84, 0x2E, 0x4A, 0x03, 0x2D, 0xC8, 0x82, 0x2D, 0xAC, 0x42, 0xE5, + 0xC5, 0xC8, 0x1C, 0xCC, 0x42, 0x3B, 0x4F, 0xB1, 0x0E, 0x04, 0x4F, 0x36, + 0x28, 0xE3, 0x34, 0x58, 0x83, 0x9F, 0x4A, 0xC3, 0xF3, 0x70, 0xC4, 0x1D, + 0x29, 0x03, 0xF5, 0x3A, 0x4C, 0xF2, 0x02, 0xB4, 0x7F, 0xC0, 0x6C, 0x37, + 0x78, 0xC3, 0xF3, 0x02, 0x75, 0x2C, 0xA8, 0x02, 0xBA, 0x60, 0xC2, 0x0D, + 0xBC, 0xA2, 0x49, 0xE1, 0x83, 0x3C, 0x70, 0x03, 0x26, 0x24, 0x2D, 0xF8, + 0x9A, 0xAF, 0xF9, 0x0A, 0xF2, 0xD3, 0x3E, 0x2D, 0x04, 0x48, 0xB4, 0x05, + 0xE4, 0x80, 0x56, 0x34, 0x8F, 0x99, 0x60, 0xA4, 0x0E, 0xE4, 0x40, 0xCE, + 0x0D, 0xAB, 0xFD, 0x0C, 0x01, 0x01, 0x2C, 0x80, 0x49, 0x9B, 0x0C, 0x08, + 0x7C, 0x40, 0x1B, 0x90, 0xCC, 0x6B, 0x50, 0x09, 0xCA, 0x08, 0x82, 0x1B, + 0xFE, 0x5C, 0x09, 0x78, 0x35, 0x8B, 0x35, 0xF9, 0xE8, 0x81, 0xF9, 0xE8, + 0xA8, 0x64, 0xE1, 0x09, 0xA8, 0xC9, 0x4F, 0x33, 0x03, 0x82, 0xEA, 0x80, + 0x01, 0x70, 0xC0, 0x0D, 0x1D, 0x5B, 0x0B, 0x09, 0xD0, 0x09, 0xF4, 0x4D, + 0xDE, 0xAC, 0xCA, 0x08, 0x28, 0x5B, 0x2F, 0xA9, 0xC5, 0x18, 0xE4, 0x17, + 0x6B, 0x74, 0x47, 0xA7, 0x24, 0x5D, 0x31, 0x23, 0x07, 0x8E, 0xE5, 0x01, + 0x8E, 0xC5, 0xC6, 0x1B, 0xF4, 0x2B, 0x1F, 0x18, 0x02, 0x23, 0x30, 0x42, + 0x59, 0x73, 0xC2, 0x59, 0x37, 0xC3, 0x31, 0x90, 0xAE, 0x0F, 0xDB, 0xC2, + 0x3D, 0xCC, 0x94, 0x0F, 0xE2, 0x83, 0x31, 0x46, 0x2C, 0x42, 0xED, 0x84, + 0x34, 0x10, 0x46, 0xED, 0x1E, 0x0C, 0x32, 0x78, 0x42, 0x71, 0x81, 0x56, + 0xC7, 0x7A, 0x83, 0xEE, 0xEA, 0x02, 0xA4, 0x69, 0xB1, 0x90, 0xC4, 0x88, + 0x83, 0xD4, 0x5B, 0x34, 0x0C, 0x09, 0x2B, 0x6C, 0xE0, 0x63, 0xAF, 0xDE, + 0x3E, 0xD4, 0xC2, 0x35, 0x70, 0xC3, 0x64, 0xB3, 0x32, 0xCE, 0xE2, 0xCF, + 0x9A, 0x7C, 0x43, 0x49, 0xC0, 0x0E, 0x39, 0xD4, 0x82, 0x05, 0x1C, 0x40, + 0x01, 0x60, 0xC0, 0x68, 0xAF, 0xAF, 0xFA, 0x32, 0x2D, 0xD3, 0x5A, 0x40, + 0xFA, 0x5A, 0xC0, 0x04, 0x40, 0xC0, 0x0C, 0xF8, 0x43, 0x51, 0x6D, 0x23, + 0x26, 0xE0, 0x11, 0x1C, 0xEF, 0xC0, 0xF4, 0x3D, 0x06, 0xA5, 0x11, 0x00, + 0xD2, 0x38, 0x40, 0x07, 0xC0, 0x86, 0x0A, 0x78, 0x40, 0x19, 0x48, 0x02, + 0x22, 0xA0, 0x5F, 0x1D, 0x88, 0x81, 0x62, 0x09, 0x9B, 0x14, 0xB6, 0xC1, + 0xA2, 0x74, 0xB2, 0x57, 0x65, 0xCD, 0x0A, 0xF0, 0xE8, 0xD7, 0x85, 0x80, + 0x0C, 0xFC, 0x00, 0x0F, 0xC0, 0xC2, 0x3A, 0xA0, 0x25, 0x26, 0xE8, 0x40, + 0x02, 0x70, 0x80, 0xDA, 0x88, 0x81, 0x95, 0x2F, 0xA2, 0x18, 0xC4, 0xE3, + 0xAA, 0x54, 0xE9, 0xFE, 0xD1, 0xBC, 0xD8, 0x22, 0xA2, 0x8F, 0xBC, 0x76, + 0x47, 0x2F, 0x0D, 0x8E, 0x18, 0xF0, 0x90, 0xA2, 0xD8, 0xC5, 0x62, 0x1D, + 0x42, 0xB4, 0x61, 0x2B, 0xAF, 0x30, 0xA7, 0x21, 0x24, 0xC2, 0x22, 0x34, + 0xC2, 0x26, 0x70, 0x42, 0x33, 0xD4, 0xF7, 0x31, 0xF4, 0x30, 0x20, 0xD4, + 0x80, 0x2D, 0x94, 0x31, 0x07, 0xEE, 0xC3, 0x28, 0x48, 0x43, 0xC4, 0x5A, + 0xC3, 0xBB, 0x49, 0x03, 0x42, 0xB9, 0xA0, 0x91, 0x20, 0x83, 0x2C, 0x1C, + 0x8C, 0x9A, 0x21, 0x17, 0x37, 0xEC, 0xC0, 0xA2, 0xCE, 0xB3, 0xC0, 0x7C, + 0xD4, 0x4F, 0xD0, 0x42, 0xBA, 0xAC, 0x82, 0x8C, 0x2C, 0x83, 0xC2, 0x95, + 0x02, 0x86, 0xAF, 0x1E, 0x3C, 0x94, 0x42, 0x73, 0x75, 0xC3, 0xFB, 0x6A, + 0x83, 0x7E, 0xE6, 0x2F, 0x2A, 0xAC, 0x4E, 0x82, 0x0F, 0x44, 0x3E, 0xC0, + 0x8E, 0x3C, 0xCC, 0xC2, 0x01, 0x08, 0xC0, 0x01, 0x60, 0xB4, 0xD2, 0x4E, + 0xF4, 0xF9, 0x62, 0x74, 0xB0, 0x3F, 0x81, 0x20, 0x3F, 0x40, 0x10, 0xF4, + 0x83, 0x60, 0x2C, 0x14, 0x26, 0xC4, 0xA6, 0x0E, 0x8C, 0xC5, 0xF4, 0xD1, + 0x01, 0x1D, 0x30, 0x43, 0x20, 0x80, 0xAF, 0x0A, 0x68, 0xB0, 0x0A, 0xE0, + 0x01, 0x21, 0xC0, 0x81, 0x07, 0xB4, 0xC0, 0x21, 0x88, 0xCA, 0x62, 0xE5, + 0x1D, 0x55, 0x23, 0xE4, 0xA7, 0x88, 0xC1, 0x25, 0x70, 0x4D, 0x1B, 0x64, + 0x0D, 0x9E, 0x98, 0xD3, 0xD1, 0xA8, 0xC0, 0x0F, 0xE0, 0x00, 0x2A, 0xC0, + 0xA6, 0x6E, 0x84, 0xC2, 0x0C, 0x28, 0x40, 0xAC, 0xCC, 0x90, 0x69, 0x0A, + 0x0A, 0x9E, 0x58, 0x61, 0xBA, 0x1A, 0x1F, 0x08, 0x80, 0xC0, 0x8A, 0x91, + 0x30, 0x69, 0xD0, 0xAD, 0x75, 0x9F, 0xAD, 0xB4, 0x6A, 0x4D, 0x7A, 0x1F, + 0xCE, 0xAF, 0x80, 0x17, 0xE6, 0x46, 0x79, 0x22, 0xE4, 0x58, 0x1F, 0x34, + 0x82, 0x23, 0x0C, 0xBA, 0x33, 0x10, 0xFE, 0xFA, 0xA1, 0xCB, 0xC1, 0x3F, + 0xFC, 0xF3, 0x3F, 0xE5, 0x03, 0x3E, 0x9C, 0x42, 0x98, 0xDD, 0xE2, 0x4E, + 0xFC, 0x02, 0x3E, 0x87, 0x02, 0xAF, 0x16, 0x5C, 0x28, 0x2C, 0x03, 0x43, + 0x7B, 0xF3, 0x3E, 0x54, 0x03, 0x83, 0x63, 0x71, 0x16, 0x97, 0xEC, 0xC0, + 0xAC, 0x42, 0x2C, 0x74, 0xC4, 0x17, 0x2B, 0xDC, 0x5A, 0xAA, 0xFA, 0xC3, + 0x59, 0xC3, 0x2B, 0xBC, 0xDE, 0x56, 0x68, 0x43, 0x34, 0x64, 0x8C, 0x46, + 0xAA, 0x82, 0x0F, 0x18, 0x19, 0x42, 0x6C, 0x3C, 0xEC, 0xB8, 0x42, 0x44, + 0x5F, 0x80, 0x05, 0x90, 0x76, 0x46, 0x8F, 0x36, 0x46, 0x2F, 0x41, 0xB1, + 0x1F, 0x80, 0x04, 0x7C, 0x61, 0x51, 0xD5, 0x82, 0x9D, 0xD5, 0x8C, 0x0F, + 0x8C, 0xC5, 0x10, 0x24, 0xA8, 0x99, 0xA0, 0xC9, 0x04, 0xC4, 0xB8, 0x09, + 0xDC, 0x76, 0x0B, 0xD4, 0x81, 0x9F, 0xE1, 0x49, 0x0C, 0x4B, 0x12, 0x00, + 0x06, 0x8A, 0xA9, 0x80, 0xB7, 0x0C, 0x54, 0xD3, 0x67, 0xC4, 0x86, 0x00, + 0x81, 0xF7, 0x7E, 0x8D, 0xC0, 0x25, 0xE4, 0xC0, 0x17, 0x2A, 0x83, 0x51, + 0x10, 0x41, 0x04, 0x74, 0x1D, 0x2D, 0x35, 0x5B, 0x2D, 0xB5, 0x80, 0xDF, + 0x94, 0xB9, 0x44, 0x22, 0x0D, 0x07, 0x18, 0xCA, 0x65, 0x48, 0x4D, 0x02, + 0x5D, 0xAB, 0x68, 0x9C, 0x50, 0x80, 0x99, 0x01, 0x0F, 0xF5, 0xCA, 0xDD, + 0xDD, 0x87, 0xE3, 0x9F, 0x81, 0x1D, 0x1C, 0x82, 0x9F, 0x2B, 0xC2, 0x23, + 0x3C, 0x82, 0xC4, 0x57, 0xFC, 0x35, 0x6B, 0xC2, 0x0F, 0x60, 0x7C, 0xC6, + 0xF3, 0xD1, 0x3E, 0xF0, 0x03, 0x29, 0xE8, 0x42, 0x41, 0x5D, 0xC3, 0x37, + 0x88, 0x8E, 0xBF, 0x2C, 0x83, 0x2D, 0x48, 0xD9, 0x8B, 0x14, 0xCC, 0x32, + 0x8C, 0x02, 0x57, 0x52, 0x03, 0x5B, 0x2F, 0xC3, 0x3C, 0xA7, 0x08, 0x6F, + 0x59, 0x84, 0x2B, 0xA3, 0x02, 0x52, 0x20, 0x43, 0xF1, 0xFE, 0x5E, 0xF8, + 0xCD, 0x9F, 0x1B, 0x2E, 0xF8, 0x03, 0x11, 0x6A, 0x03, 0x84, 0x71, 0xE3, + 0x51, 0x80, 0xC2, 0x0D, 0xB4, 0xAC, 0x49, 0x6D, 0x7C, 0x3E, 0xF0, 0x43, + 0x29, 0x18, 0x80, 0x44, 0x2F, 0x41, 0x45, 0x37, 0xFD, 0x68, 0x3F, 0x7D, + 0x20, 0xD3, 0x00, 0x8D, 0xAB, 0xC2, 0xAB, 0xFB, 0x43, 0x32, 0x90, 0xC2, + 0x28, 0x20, 0x83, 0x2A, 0xE4, 0xC0, 0x10, 0xA4, 0xE8, 0x74, 0x99, 0x89, + 0x2A, 0x4D, 0xC0, 0x8A, 0x2F, 0xC1, 0x25, 0xC0, 0xCC, 0x0B, 0x44, 0x82, + 0x1E, 0x8C, 0xC1, 0x0B, 0xFB, 0xD9, 0xF7, 0x44, 0xC2, 0x5D, 0xD0, 0xCA, + 0x19, 0x4C, 0xCD, 0x75, 0xDC, 0x28, 0xA1, 0x65, 0xF2, 0x0A, 0xB0, 0x23, + 0x9E, 0x00, 0x84, 0x8C, 0x4B, 0x3B, 0x30, 0x69, 0x8B, 0x16, 0x8B, 0x19, + 0x11, 0x09, 0x04, 0x18, 0x9C, 0x68, 0x21, 0x26, 0xCD, 0x99, 0x30, 0x66, + 0xC4, 0xB0, 0x58, 0xF1, 0xE2, 0x05, 0x8B, 0x13, 0x24, 0x58, 0x90, 0x18, + 0x31, 0xE2, 0x84, 0x0A, 0x14, 0x2B, 0x5C, 0x7C, 0x24, 0x11, 0xE6, 0xCC, + 0x18, 0x37, 0x68, 0x5A, 0xA8, 0x41, 0x63, 0xE6, 0xCC, 0x99, 0x36, 0x78, + 0x04, 0xE5, 0x11, 0x24, 0x48, 0x8F, 0x1E, 0x3C, 0x76, 0xF4, 0x14, 0x2A, + 0x94, 0x87, 0x4F, 0xA5, 0x4E, 0x9C, 0x1C, 0x35, 0x6B, 0x76, 0xAC, 0x19, + 0x27, 0x40, 0x72, 0xE6, 0xBC, 0xD3, 0xF7, 0x14, 0x6A, 0x54, 0xA9, 0x53, + 0xA9, 0x56, 0xB5, 0x7A, 0xD5, 0x2A, 0xB8, 0x51, 0xD2, 0xAE, 0x59, 0xBB, + 0xF6, 0xCD, 0x9A, 0x2E, 0x5D, 0xD3, 0x74, 0x9D, 0xB2, 0x85, 0xE9, 0x13, + 0x32, 0x64, 0xAC, 0x64, 0x8D, 0xDA, 0x87, 0x15, 0x6E, 0x5C, 0xB9, 0x4F, + 0xA5, 0xED, 0x98, 0x05, 0xCD, 0xDA, 0xB4, 0x6C, 0xD0, 0xAA, 0xE9, 0x82, + 0x86, 0x4C, 0x16, 0xAA, 0x4F, 0x9F, 0x98, 0x45, 0x93, 0x15, 0x8D, 0x55, + 0xFE, 0xA9, 0xB9, 0x8B, 0x19, 0x37, 0x76, 0xFC, 0x18, 0x72, 0xD5, 0x7D, + 0xB5, 0xBE, 0x81, 0xE3, 0xD6, 0x4D, 0x9B, 0xB6, 0x59, 0xA9, 0x54, 0x21, + 0xC4, 0xA4, 0xE3, 0x9B, 0xD5, 0x7D, 0xF8, 0xF4, 0xE1, 0x2B, 0x65, 0xA0, + 0x00, 0x86, 0x27, 0x4E, 0x96, 0x3C, 0x59, 0x42, 0x83, 0xC6, 0x12, 0xD9, + 0x4B, 0x9C, 0x38, 0x79, 0x42, 0xE3, 0x82, 0x05, 0x09, 0xAE, 0xBA, 0x65, + 0xF3, 0xE7, 0x2F, 0x54, 0xA8, 0x59, 0xA8, 0x70, 0xE8, 0xA8, 0x30, 0x43, + 0x47, 0x0E, 0x1F, 0x43, 0x52, 0x0D, 0x81, 0x70, 0xC0, 0xC2, 0x85, 0x0B, + 0x25, 0x16, 0x70, 0x10, 0x83, 0x47, 0x44, 0x0A, 0x34, 0x84, 0x22, 0x45, + 0xAA, 0x43, 0x08, 0x8F, 0x9B, 0x36, 0x2D, 0xD2, 0xA4, 0x08, 0x23, 0x26, + 0x05, 0xC6, 0x36, 0x2F, 0xCA, 0x88, 0x09, 0xD3, 0x62, 0x45, 0x8A, 0x14, + 0x23, 0x06, 0xCE, 0xC9, 0x1C, 0x4B, 0x19, 0xA6, 0x07, 0x03, 0x3E, 0x8C, + 0x78, 0x61, 0xA6, 0x0C, 0x8C, 0xC2, 0x78, 0x4F, 0x0C, 0x12, 0x52, 0x58, + 0x80, 0x84, 0x13, 0x4E, 0x00, 0x61, 0xBE, 0x05, 0x46, 0x48, 0xE1, 0x84, + 0x32, 0x4E, 0x70, 0xC1, 0xA2, 0x14, 0xC6, 0x48, 0xA3, 0x8C, 0x30, 0xDA, + 0x2B, 0xA3, 0x8D, 0x33, 0xCA, 0x38, 0x43, 0x0F, 0x37, 0xF4, 0x20, 0x44, + 0x8F, 0x3A, 0x4C, 0xD4, 0xE3, 0x90, 0x43, 0xF4, 0x60, 0x44, 0xA8, 0x4D, + 0x38, 0x41, 0xCA, 0xA8, 0x63, 0x00, 0xF9, 0x63, 0x88, 0x6B, 0x22, 0xBB, + 0xD1, 0x31, 0x78, 0x3C, 0xF9, 0xE5, 0x9A, 0x6A, 0xBA, 0xEA, 0x4B, 0x17, + 0x69, 0x5C, 0x91, 0x25, 0x94, 0x39, 0x50, 0x91, 0x65, 0x19, 0x64, 0x96, + 0x19, 0x25, 0x1F, 0x1C, 0x9D, 0xD4, 0xA7, 0xC9, 0x6A, 0x82, 0x48, 0x06, + 0x9A, 0x6D, 0xA6, 0x91, 0xA6, 0x1A, 0x68, 0xA0, 0x89, 0x46, 0x97, 0xC0, + 0x42, 0xF9, 0x44, 0xFE, 0x16, 0x65, 0x62, 0x41, 0xEC, 0x94, 0x27, 0xCD, + 0x3C, 0x13, 0xCD, 0xC8, 0xF6, 0xD9, 0xA7, 0x1E, 0x55, 0xB8, 0xB9, 0x2C, + 0x33, 0x66, 0x5A, 0x51, 0x25, 0x15, 0x39, 0x87, 0xF0, 0xE1, 0xAD, 0xAA, + 0xF2, 0x21, 0x6D, 0x1F, 0x78, 0x70, 0x38, 0xE0, 0x00, 0xD9, 0x62, 0xC3, + 0xED, 0x02, 0xD8, 0x66, 0x7B, 0x8D, 0x06, 0x0B, 0x20, 0xD0, 0x21, 0x99, + 0x6E, 0xB6, 0xF1, 0x07, 0x96, 0x53, 0x3E, 0xF1, 0x27, 0x15, 0x1D, 0x76, + 0xC8, 0x61, 0x86, 0x1B, 0x6E, 0xB0, 0x60, 0x06, 0x1F, 0x22, 0x30, 0xE0, + 0x80, 0x19, 0xA0, 0xB3, 0x20, 0x02, 0x09, 0x12, 0x10, 0x81, 0x01, 0x07, + 0x16, 0x08, 0x69, 0x0C, 0x35, 0xEA, 0xB8, 0x09, 0xA6, 0x0C, 0x53, 0x50, + 0xE1, 0x05, 0x17, 0x56, 0x38, 0xA3, 0x05, 0x16, 0xE0, 0x9B, 0x35, 0x05, + 0x17, 0x40, 0x38, 0xC1, 0x07, 0x21, 0xB4, 0x99, 0x06, 0xBF, 0x54, 0x20, + 0x70, 0x60, 0x05, 0x15, 0x54, 0x00, 0xD0, 0x8C, 0x3A, 0x56, 0x10, 0x03, + 0xBE, 0x30, 0x56, 0xE0, 0x60, 0x85, 0x16, 0xC2, 0x18, 0xC1, 0x83, 0x10, + 0x3A, 0x60, 0x60, 0x04, 0x92, 0x58, 0x10, 0xA3, 0xBD, 0x33, 0xD0, 0x4B, + 0x61, 0x85, 0xF8, 0x54, 0x10, 0x43, 0x5C, 0x35, 0xDC, 0x50, 0x43, 0x8D, + 0x42, 0xF0, 0x30, 0xB1, 0x8E, 0x3C, 0x10, 0x31, 0x64, 0x8F, 0x44, 0x5A, + 0x3C, 0x0A, 0x46, 0x4E, 0x7E, 0x90, 0xC3, 0x06, 0x52, 0xD2, 0xFC, 0xF7, + 0xA9, 0x3E, 0xB7, 0xFA, 0xEA, 0xC7, 0x2C, 0xBB, 0x74, 0xE5, 0x93, 0x39, + 0x42, 0x61, 0x65, 0x99, 0x68, 0x90, 0xF1, 0x04, 0x60, 0xC8, 0xAA, 0x19, + 0xE2, 0xAE, 0x6D, 0xA0, 0xD1, 0xC6, 0x9A, 0x2D, 0xC5, 0x92, 0xC5, 0x96, + 0x39, 0x3E, 0x61, 0x25, 0x9A, 0x68, 0xD6, 0x41, 0xC5, 0xDF, 0x88, 0x4D, + 0x3E, 0x39, 0xCD, 0x7D, 0xB8, 0xA9, 0xFE, 0xC5, 0xB2, 0x6E, 0x30, 0x93, + 0x53, 0x15, 0x55, 0x96, 0x49, 0xC5, 0x87, 0x22, 0x44, 0x83, 0xEA, 0x9D, + 0x5A, 0x74, 0xC0, 0x00, 0x3A, 0xE9, 0x2C, 0xF8, 0x39, 0xB7, 0x9F, 0x7F, + 0xC6, 0x80, 0x68, 0x45, 0x87, 0x98, 0x86, 0x9B, 0x47, 0x6B, 0xC1, 0x44, + 0x94, 0x64, 0x62, 0xA1, 0x21, 0x07, 0x20, 0x8A, 0xC0, 0x84, 0xEA, 0x21, + 0x30, 0x99, 0xE3, 0x6A, 0x1A, 0x8A, 0xD3, 0xE1, 0x86, 0x0A, 0x6E, 0x28, + 0xEE, 0x06, 0x09, 0x14, 0x30, 0xC1, 0x84, 0x12, 0x12, 0x4C, 0x81, 0x85, + 0x4B, 0xC4, 0x1D, 0x23, 0x05, 0x12, 0xE2, 0x13, 0xE3, 0x05, 0x03, 0x57, + 0x70, 0x9B, 0x24, 0x12, 0x48, 0xA8, 0xD9, 0x20, 0x59, 0x98, 0x89, 0xA5, + 0x02, 0x07, 0x4E, 0x48, 0xAF, 0x8E, 0x36, 0xD0, 0xA8, 0xE3, 0x85, 0x31, + 0xAA, 0x2D, 0xA3, 0x05, 0x5A, 0xCB, 0x98, 0x4F, 0x05, 0x06, 0x50, 0x68, + 0xC0, 0x03, 0x15, 0xE4, 0x7B, 0x16, 0x5C, 0x76, 0xCD, 0x50, 0x43, 0x8F, + 0xC4, 0x1D, 0x42, 0x21, 0x85, 0x16, 0xCE, 0xC0, 0xA3, 0x10, 0x3D, 0xCE, + 0x30, 0x71, 0x8F, 0x41, 0xF6, 0x38, 0x64, 0x92, 0x4A, 0x84, 0x32, 0xEA, + 0x45, 0xA3, 0x34, 0xF9, 0xE1, 0x07, 0x57, 0xF4, 0xC9, 0x13, 0xE5, 0x1B, + 0xF1, 0x79, 0x67, 0x94, 0x6A, 0xAC, 0xF1, 0xCA, 0x9A, 0x6F, 0x7E, 0x91, + 0x06, 0x1A, 0x57, 0x62, 0x49, 0x78, 0xE1, 0x65, 0xB4, 0x91, 0x05, 0xE2, + 0xDA, 0xE7, 0xFA, 0xA6, 0x08, 0x68, 0xF4, 0xA2, 0xC6, 0x9A, 0x2C, 0xA1, + 0xF1, 0xCB, 0x15, 0x50, 0x40, 0x01, 0x33, 0x64, 0xC4, 0x44, 0x51, 0x9E, + 0xFB, 0xEE, 0x19, 0xA3, 0xC5, 0x1F, 0x70, 0x7A, 0x8B, 0xB3, 0x95, 0x50, + 0x62, 0x89, 0x05, 0x93, 0x1B, 0xFC, 0x6D, 0x72, 0x9F, 0x26, 0x9B, 0x7C, + 0xEA, 0x9D, 0x6A, 0x46, 0x11, 0x42, 0x07, 0x1C, 0x70, 0xFE, 0xC0, 0xC0, + 0x02, 0x9E, 0x85, 0x26, 0x9A, 0xFF, 0xE8, 0x80, 0xC0, 0xC4, 0x13, 0x11, + 0x68, 0x42, 0x6F, 0x1E, 0xA5, 0x8A, 0x51, 0x84, 0xA9, 0x16, 0x3B, 0xF0, + 0x01, 0xD5, 0x42, 0x81, 0x09, 0x54, 0xB0, 0xA2, 0x15, 0xCC, 0xB8, 0xCF, + 0x9C, 0x44, 0x21, 0x04, 0x0B, 0xE6, 0x60, 0x07, 0x40, 0xD8, 0xC1, 0x0C, + 0x68, 0xA0, 0x40, 0x1D, 0xCC, 0xA0, 0x04, 0x66, 0x53, 0xC1, 0xB7, 0xCC, + 0xD0, 0x82, 0x11, 0x9C, 0x87, 0x05, 0xE6, 0x51, 0x96, 0x0A, 0x5A, 0x90, + 0x38, 0x19, 0x04, 0x2B, 0x33, 0x61, 0x4A, 0x85, 0xD8, 0x4E, 0xA8, 0x82, + 0x12, 0x99, 0x81, 0x22, 0x25, 0x34, 0x03, 0x0B, 0xC2, 0x70, 0x02, 0x0D, + 0xCD, 0x8D, 0x04, 0x2A, 0xB8, 0x96, 0xB6, 0x0C, 0xD4, 0x82, 0x14, 0x84, + 0xA0, 0x85, 0x03, 0x72, 0xC3, 0x20, 0x08, 0xA4, 0x86, 0xF2, 0xAC, 0xA0, + 0x0C, 0x6E, 0x08, 0x5D, 0x1B, 0xF4, 0x90, 0x87, 0x41, 0xE0, 0x81, 0x10, + 0x85, 0xB0, 0x04, 0x25, 0x56, 0xD7, 0x8C, 0x4D, 0xC4, 0xE8, 0x18, 0x72, + 0xF8, 0x01, 0x26, 0xF2, 0xF1, 0x3E, 0xEF, 0x35, 0x06, 0x1F, 0xE4, 0x18, + 0x05, 0xF4, 0x74, 0xE7, 0x3B, 0x6B, 0xFC, 0xA2, 0x16, 0xAC, 0x80, 0x85, + 0x2D, 0x40, 0x81, 0x8A, 0x58, 0xC8, 0x62, 0x1D, 0xC8, 0x73, 0x0C, 0xED, + 0xD2, 0x24, 0x25, 0xE3, 0x0D, 0x2B, 0x2F, 0x78, 0x59, 0x06, 0x34, 0x64, + 0xC1, 0x8A, 0x4F, 0xAC, 0x62, 0x4C, 0x21, 0x63, 0x85, 0x2D, 0xF8, 0x78, + 0x46, 0x47, 0x3A, 0x72, 0x32, 0xDF, 0x78, 0x13, 0x66, 0x88, 0xD5, 0x8A, + 0x56, 0xCC, 0xA2, 0x15, 0xE9, 0xA3, 0x45, 0xC0, 0xA2, 0x22, 0x8F, 0x6A, + 0x88, 0x22, 0x07, 0x3A, 0xE8, 0x60, 0x13, 0x30, 0xE1, 0x8A, 0x51, 0xF0, + 0x60, 0x07, 0x3C, 0xC8, 0x01, 0x0D, 0x7C, 0x40, 0x03, 0x4C, 0xA4, 0x02, + 0xFE, 0x96, 0xCC, 0x50, 0xC6, 0x34, 0x92, 0x21, 0x8A, 0x1B, 0x14, 0xC1, + 0x65, 0x56, 0x9A, 0x05, 0x29, 0x54, 0xC1, 0x8C, 0x54, 0x14, 0xC1, 0x95, + 0xAF, 0x04, 0x45, 0x2A, 0x1C, 0xD8, 0x0A, 0x6D, 0xF8, 0x43, 0x1B, 0xD9, + 0x50, 0xA6, 0x3F, 0x92, 0x51, 0x8B, 0x98, 0xD5, 0x02, 0x16, 0xAA, 0xC0, + 0xC4, 0x10, 0x72, 0x60, 0x02, 0x1A, 0x7C, 0x30, 0x02, 0x22, 0x58, 0x40, + 0x07, 0x48, 0x20, 0x86, 0x13, 0xBC, 0xE0, 0x0C, 0x97, 0x80, 0x8F, 0xE4, + 0x8C, 0xD8, 0x43, 0x19, 0xD4, 0x60, 0x07, 0xCA, 0xD0, 0x46, 0x2B, 0x02, + 0x23, 0xB6, 0x6E, 0x06, 0x11, 0x43, 0x66, 0x88, 0xDB, 0x79, 0x46, 0x22, + 0x86, 0xF8, 0x68, 0x4E, 0x05, 0x6E, 0x73, 0x81, 0x0A, 0x3A, 0x80, 0x02, + 0x69, 0x71, 0x00, 0x05, 0x28, 0x00, 0x41, 0x18, 0xC2, 0xD3, 0x1E, 0x35, + 0x84, 0x87, 0x26, 0x6A, 0x68, 0x83, 0x4F, 0xF0, 0xA0, 0x07, 0x41, 0x0C, + 0x22, 0x0F, 0xE0, 0x21, 0x44, 0xEA, 0x3A, 0x61, 0x94, 0xA3, 0x58, 0x94, + 0x13, 0x72, 0x18, 0x42, 0x23, 0x1F, 0x19, 0x97, 0x7D, 0xF4, 0x43, 0x14, + 0xD9, 0xD8, 0x1D, 0x36, 0xBE, 0xF1, 0x8D, 0x6B, 0xE8, 0xC2, 0x15, 0x28, + 0x0D, 0x85, 0x27, 0x42, 0xA1, 0x37, 0x6D, 0x20, 0x63, 0x14, 0x7B, 0x8C, + 0x98, 0x37, 0x30, 0x21, 0x0B, 0x6A, 0x6C, 0x83, 0x1A, 0xD3, 0xD8, 0x86, + 0x34, 0xB8, 0x04, 0x0D, 0x58, 0xAC, 0xA2, 0x48, 0x20, 0x53, 0x64, 0x28, + 0x38, 0xDA, 0x51, 0xA3, 0x9E, 0x2C, 0x67, 0x93, 0xC4, 0x4C, 0x32, 0x22, + 0x38, 0x0B, 0x66, 0xA8, 0x82, 0x08, 0x37, 0x20, 0xC7, 0xEC, 0xA0, 0xA4, + 0x8F, 0x77, 0xB8, 0x42, 0x08, 0x38, 0xC8, 0x41, 0x13, 0x54, 0x01, 0xBE, + 0x6D, 0xE4, 0x92, 0x19, 0xD4, 0x70, 0xD9, 0x3A, 0xD6, 0xA1, 0x97, 0x61, + 0x65, 0xC6, 0x1F, 0xFE, 0xE8, 0x6B, 0xC2, 0x0D, 0x30, 0xD1, 0x1B, 0x6E, + 0x4C, 0xA3, 0x16, 0xA2, 0x70, 0x45, 0x32, 0x42, 0x31, 0x04, 0x20, 0xD0, + 0x81, 0x6A, 0xA8, 0x20, 0x66, 0xCC, 0xA6, 0x91, 0x19, 0x65, 0xEA, 0x65, + 0x1A, 0xBF, 0x91, 0x06, 0x26, 0x51, 0xF1, 0x40, 0xAA, 0x11, 0xB3, 0x09, + 0x41, 0xD0, 0x9A, 0x04, 0x18, 0xC0, 0x81, 0x0E, 0x9C, 0xA0, 0x84, 0xE5, + 0x12, 0x62, 0xE7, 0xE6, 0x76, 0x02, 0x1B, 0xE4, 0x80, 0x19, 0xEB, 0x50, + 0x46, 0x7E, 0x26, 0xB0, 0x80, 0x17, 0x84, 0xC1, 0x3C, 0x6A, 0x78, 0x41, + 0x79, 0xBA, 0x95, 0xC2, 0x34, 0x84, 0x21, 0x85, 0xF9, 0xE4, 0xDC, 0x08, + 0xBA, 0x99, 0x02, 0x06, 0x80, 0x80, 0x05, 0x63, 0x08, 0x03, 0x1A, 0xCA, + 0x10, 0xD0, 0x15, 0x08, 0xA2, 0x3D, 0x6E, 0xC0, 0x03, 0x16, 0x09, 0xD1, + 0x86, 0x76, 0xA9, 0x08, 0x44, 0x55, 0xA4, 0x49, 0x1D, 0x0C, 0x51, 0x09, + 0x46, 0x3C, 0x82, 0x75, 0x18, 0x15, 0x23, 0x37, 0xD6, 0x74, 0xD4, 0xB8, + 0xF0, 0x43, 0x2B, 0xBB, 0xE3, 0x9D, 0xEE, 0x68, 0x01, 0x8B, 0x42, 0xAE, + 0x94, 0x61, 0x21, 0x6B, 0x8B, 0x73, 0xA1, 0xF2, 0x16, 0x6F, 0x10, 0x41, + 0x16, 0x18, 0xAB, 0x46, 0x32, 0xF9, 0x32, 0xBD, 0x42, 0x7E, 0x02, 0x14, + 0xA1, 0x40, 0x86, 0x22, 0x4F, 0x61, 0x46, 0xEE, 0xBE, 0x37, 0x4D, 0xDF, + 0xA8, 0x45, 0x37, 0xBE, 0xE1, 0xB2, 0xDF, 0x30, 0xA3, 0x16, 0xB1, 0x98, + 0xC5, 0x29, 0x86, 0x80, 0x03, 0xDA, 0xC9, 0x37, 0x08, 0x11, 0xD8, 0x81, + 0x27, 0x6A, 0x71, 0x19, 0x97, 0x39, 0x2A, 0x69, 0x64, 0x4D, 0x66, 0x66, + 0x8E, 0x39, 0x0D, 0x66, 0xC8, 0x29, 0x16, 0x5F, 0xC2, 0x04, 0x0E, 0x9A, + 0x60, 0x60, 0x6A, 0xB8, 0xE2, 0x14, 0xAE, 0x40, 0x06, 0x26, 0x88, 0xA0, + 0x83, 0x20, 0xBC, 0x92, 0x6A, 0x54, 0xFE, 0x8B, 0x05, 0x53, 0x2F, 0xA9, + 0xCC, 0x6C, 0x6C, 0x03, 0xC5, 0x39, 0x9D, 0x45, 0x2C, 0xE8, 0xC4, 0x8A, + 0x58, 0xB4, 0x02, 0x15, 0x30, 0xC6, 0x44, 0x10, 0x70, 0x70, 0x83, 0x19, + 0xA0, 0xCA, 0x41, 0x2F, 0xB0, 0xE7, 0x0A, 0x4E, 0x18, 0x9F, 0x14, 0xD4, + 0x80, 0x06, 0xAA, 0x28, 0xEB, 0x3A, 0x30, 0x31, 0x01, 0x05, 0x0C, 0xE8, + 0x3C, 0x2E, 0x31, 0x83, 0xB4, 0x98, 0x2C, 0x5B, 0xF9, 0x6C, 0xA4, 0x23, + 0x23, 0x40, 0x81, 0x09, 0xB5, 0x05, 0x02, 0x34, 0xA8, 0x04, 0x73, 0x63, + 0x10, 0xC3, 0x20, 0xDA, 0xA3, 0x87, 0x41, 0x08, 0x02, 0x0F, 0x88, 0x40, + 0x44, 0x1D, 0x06, 0x11, 0x89, 0x9B, 0x44, 0x02, 0x0F, 0x79, 0xD0, 0x09, + 0x21, 0x0C, 0x31, 0x89, 0x45, 0x54, 0xF4, 0x28, 0xAD, 0x93, 0xD1, 0x0F, + 0x62, 0x41, 0xD5, 0xA2, 0xC2, 0x57, 0x1E, 0xFD, 0x18, 0x85, 0x74, 0x7B, + 0x94, 0x17, 0x5D, 0xBC, 0x82, 0x19, 0xB6, 0x18, 0x4C, 0x4B, 0xF3, 0xB6, + 0x3D, 0xF8, 0xEA, 0x83, 0x1B, 0x44, 0x18, 0x8B, 0x95, 0xAC, 0xB1, 0x53, + 0xBE, 0x2C, 0x43, 0x16, 0xB0, 0xF0, 0x84, 0x27, 0x56, 0x91, 0x3D, 0x56, + 0xC4, 0xF4, 0xD0, 0x99, 0x76, 0x52, 0x93, 0x5E, 0x41, 0x0B, 0x6F, 0x78, + 0x63, 0x1B, 0xD9, 0x98, 0x45, 0x32, 0x66, 0x01, 0x0B, 0x4C, 0x9E, 0x22, + 0x07, 0x41, 0xD0, 0x07, 0x39, 0x6A, 0xE1, 0x89, 0xE4, 0x78, 0xA2, 0x51, + 0xBD, 0xC9, 0x86, 0xA3, 0x50, 0x7C, 0x60, 0x14, 0xFB, 0x66, 0x96, 0xC8, + 0x98, 0xC5, 0x2C, 0xA0, 0xA9, 0x8A, 0x39, 0x4D, 0x53, 0x07, 0x03, 0x9C, + 0x75, 0x37, 0x54, 0x21, 0x8A, 0x56, 0x4C, 0x03, 0x13, 0x3B, 0xD0, 0xC1, + 0x72, 0x8A, 0x30, 0x07, 0x62, 0xD2, 0x41, 0x30, 0x98, 0x30, 0x5F, 0x2B, + 0x90, 0x31, 0x0D, 0x6B, 0x1F, 0x73, 0x16, 0x7A, 0x6B, 0xFE, 0x45, 0x2C, + 0x60, 0x89, 0x0A, 0xA6, 0xA9, 0xC2, 0x99, 0x4D, 0x00, 0xC2, 0x05, 0x32, + 0x25, 0x02, 0x0E, 0x34, 0xE4, 0x12, 0xB3, 0x32, 0xE2, 0x0A, 0x58, 0x50, + 0x02, 0x1A, 0xA0, 0xA2, 0x1B, 0x22, 0x2B, 0x42, 0x67, 0x15, 0x54, 0x38, + 0x37, 0x94, 0x01, 0x87, 0x68, 0x98, 0xC8, 0x44, 0x0C, 0x57, 0x2D, 0x15, + 0xCC, 0x8D, 0x01, 0x24, 0x48, 0x5C, 0x07, 0x3E, 0x40, 0x02, 0xCE, 0xA9, + 0x00, 0x0D, 0xBB, 0xAD, 0x83, 0x1B, 0xEA, 0x80, 0xB9, 0xDD, 0x0A, 0xC2, + 0xCC, 0x58, 0x14, 0x73, 0x24, 0x10, 0x91, 0x93, 0x86, 0xA2, 0x6E, 0x12, + 0x8C, 0xE8, 0x04, 0x9C, 0x93, 0x72, 0x0C, 0x19, 0xD5, 0x40, 0x13, 0xF8, + 0x78, 0x8B, 0x7B, 0x35, 0x2D, 0x0F, 0x6F, 0x88, 0x82, 0x1B, 0xD5, 0xF0, + 0x91, 0xEE, 0xFA, 0x22, 0x0B, 0x5A, 0x84, 0x42, 0x14, 0x9F, 0x08, 0xC5, + 0x32, 0x1A, 0x16, 0x0B, 0xC5, 0xBC, 0xB7, 0x49, 0xD4, 0x98, 0x83, 0x2C, + 0x74, 0x4A, 0x0D, 0x6A, 0x68, 0x03, 0x1A, 0x39, 0xD5, 0x05, 0x60, 0x06, + 0xBD, 0x0C, 0x75, 0xA2, 0x02, 0xD3, 0x9A, 0x56, 0x3A, 0x64, 0xF6, 0x51, + 0x8A, 0x6A, 0x5C, 0x66, 0x1B, 0xDA, 0x48, 0x46, 0x32, 0x90, 0x51, 0x8B, + 0xA7, 0x62, 0x22, 0x02, 0xA2, 0x90, 0x46, 0x11, 0x22, 0x20, 0x04, 0x51, + 0x7C, 0x43, 0x1D, 0xDE, 0x48, 0xDA, 0x9B, 0xB6, 0x91, 0xB4, 0xDE, 0x04, + 0x96, 0xD4, 0xAE, 0x80, 0x45, 0x2B, 0x44, 0x11, 0xB3, 0x53, 0xA8, 0x02, + 0x16, 0xA8, 0xA8, 0x6B, 0x13, 0xE6, 0xC0, 0x56, 0xB1, 0x77, 0xA3, 0x1A, + 0xFB, 0x55, 0x45, 0x7E, 0x94, 0x83, 0x09, 0x50, 0x5C, 0x2D, 0xC4, 0xDE, + 0x66, 0x71, 0x2C, 0x56, 0x01, 0x0B, 0x58, 0x4C, 0x1D, 0x19, 0x72, 0x2A, + 0x6C, 0x88, 0x19, 0x08, 0x0B, 0x67, 0x0A, 0x6F, 0x38, 0x41, 0xF0, 0xC1, + 0xFE, 0x0D, 0x22, 0xC0, 0x01, 0x07, 0x7C, 0xE0, 0xDF, 0x2B, 0x18, 0x50, + 0x1A, 0x44, 0x30, 0x03, 0x4C, 0xAC, 0x43, 0x64, 0x41, 0xE8, 0x6C, 0xE6, + 0xD3, 0x83, 0x11, 0x70, 0x5D, 0x4E, 0x43, 0x46, 0x4C, 0x43, 0xE2, 0xC2, + 0x00, 0x02, 0x6E, 0x2E, 0xAE, 0x5B, 0x27, 0xE0, 0x00, 0x09, 0x3C, 0x40, + 0x02, 0x17, 0x84, 0x21, 0x0D, 0x75, 0x38, 0xC4, 0x20, 0x74, 0x52, 0x07, + 0x87, 0xD2, 0x84, 0x3B, 0x14, 0x8F, 0x04, 0x21, 0x08, 0xE1, 0x06, 0x88, + 0x53, 0x42, 0x11, 0x7C, 0x78, 0x44, 0x27, 0x8A, 0x92, 0x14, 0x4E, 0x38, + 0x83, 0x13, 0x36, 0x30, 0x42, 0x3B, 0x44, 0xBE, 0xF4, 0x80, 0xED, 0xE3, + 0x1A, 0x28, 0xD7, 0xDD, 0xEE, 0x54, 0xAE, 0x8B, 0x52, 0x8B, 0xE2, 0x14, + 0xA2, 0x40, 0x45, 0xC3, 0xB4, 0xC1, 0x0A, 0x43, 0xC3, 0xF7, 0x1B, 0x73, + 0xF0, 0x0B, 0xD0, 0x51, 0x3C, 0x96, 0x69, 0x40, 0x3A, 0xFC, 0x1F, 0x53, + 0x86, 0x22, 0x4B, 0x66, 0x7D, 0xFB, 0xCF, 0x05, 0x1E, 0xAE, 0x78, 0x53, + 0xD2, 0xFC, 0xB1, 0x8C, 0x69, 0xC0, 0x62, 0x19, 0x66, 0x41, 0x15, 0x02, + 0xCC, 0x0A, 0x84, 0xA0, 0x07, 0x78, 0xA3, 0x1F, 0xBC, 0x21, 0x1B, 0xB8, + 0x61, 0xD6, 0x4C, 0xAC, 0xAC, 0xFC, 0x01, 0x93, 0xC0, 0xEF, 0x14, 0x5A, + 0xC1, 0xD4, 0x62, 0xC6, 0x02, 0x29, 0x50, 0x14, 0x48, 0x69, 0x08, 0x2A, + 0xA0, 0xAD, 0x16, 0x10, 0x52, 0x54, 0x61, 0x16, 0xF2, 0xC3, 0x07, 0x96, + 0x63, 0x08, 0xE6, 0x00, 0x08, 0x46, 0x70, 0x39, 0x7C, 0x20, 0x6A, 0x86, + 0x20, 0x08, 0x44, 0x21, 0x10, 0x3E, 0x6C, 0xDB, 0x1E, 0x8C, 0x98, 0x42, + 0xCC, 0x6A, 0x7A, 0xE9, 0x37, 0x6E, 0x10, 0x7D, 0xFC, 0xCE, 0x07, 0x6E, + 0xCC, 0x03, 0x38, 0xE0, 0xDF, 0x3E, 0x6B, 0x04, 0x24, 0x80, 0x08, 0xD4, + 0x21, 0x33, 0x76, 0xFE, 0x60, 0x02, 0x1C, 0x20, 0x05, 0xCA, 0x63, 0x56, + 0x32, 0x82, 0x05, 0x02, 0xE4, 0xDE, 0x58, 0xE0, 0x05, 0x26, 0xE4, 0x0C, + 0x04, 0x2E, 0x04, 0xA8, 0x65, 0xF5, 0x04, 0xCE, 0x05, 0x3C, 0x42, 0x72, + 0x38, 0xE0, 0x03, 0x3A, 0xA0, 0x0C, 0x2A, 0x6E, 0x26, 0x48, 0x64, 0x10, + 0x24, 0x8A, 0xE2, 0x0E, 0xC1, 0xCC, 0x8A, 0x4F, 0x10, 0x10, 0x21, 0x12, + 0x0C, 0x81, 0x0F, 0x16, 0x61, 0x13, 0x8A, 0x42, 0x29, 0x38, 0xE1, 0x28, + 0xF8, 0xE5, 0x19, 0xDE, 0xE1, 0xCE, 0xE0, 0x6B, 0x1F, 0xB0, 0x41, 0xFB, + 0x76, 0x07, 0x2C, 0xC4, 0x02, 0x1A, 0xCC, 0x4F, 0x52, 0x3E, 0x81, 0xFC, + 0x62, 0xE1, 0xFC, 0xDE, 0xAB, 0x1A, 0xD4, 0x4F, 0x1B, 0xA8, 0x61, 0x19, + 0x7E, 0x4E, 0x4B, 0xA6, 0x81, 0x90, 0x56, 0xEA, 0x4B, 0xE6, 0x0F, 0x31, + 0x64, 0xE7, 0xFE, 0x2A, 0x11, 0x2E, 0xAA, 0xC1, 0xD3, 0xDE, 0xE4, 0x98, + 0x96, 0x81, 0x99, 0x02, 0xAB, 0x16, 0x80, 0x80, 0x06, 0x66, 0x20, 0x08, + 0xB6, 0x41, 0x1D, 0x18, 0x90, 0xD6, 0xBA, 0x81, 0x01, 0x8F, 0xA9, 0xD7, + 0xDA, 0xEE, 0xF0, 0x46, 0xCD, 0xA9, 0x6A, 0x61, 0xDB, 0xBC, 0x0D, 0x13, + 0x84, 0x60, 0x08, 0xB2, 0xCA, 0x07, 0x2C, 0x20, 0x08, 0x14, 0xB0, 0x1B, + 0xFC, 0x01, 0xDC, 0x2E, 0x09, 0x13, 0x2A, 0x20, 0x02, 0x22, 0x60, 0x02, + 0x26, 0x40, 0x02, 0x20, 0x60, 0x02, 0x4A, 0x05, 0x50, 0x88, 0x26, 0x19, + 0x31, 0x00, 0x02, 0x7E, 0x06, 0x36, 0x84, 0x00, 0x13, 0xF0, 0x8A, 0x6A, + 0x9E, 0x09, 0x99, 0xB2, 0x21, 0x33, 0x92, 0x41, 0xEE, 0x62, 0x01, 0x15, + 0x40, 0x71, 0x02, 0x18, 0xA0, 0x03, 0x46, 0xA0, 0x85, 0x4E, 0x40, 0x02, + 0x82, 0x60, 0x1D, 0x32, 0x03, 0x08, 0x8C, 0xAC, 0x09, 0xC3, 0xE0, 0x42, + 0x4E, 0xCB, 0x5A, 0x06, 0xE4, 0x9E, 0xFE, 0x3A, 0x20, 0x0C, 0x5E, 0x00, + 0x24, 0x3E, 0xE2, 0x6F, 0xE4, 0x63, 0x3E, 0x52, 0x00, 0x05, 0x04, 0x0E, + 0x3D, 0x64, 0xC0, 0x44, 0xDA, 0x80, 0x8A, 0x08, 0x41, 0x45, 0x72, 0xC2, + 0x0C, 0xC5, 0x0C, 0x11, 0x48, 0x44, 0x0D, 0x00, 0x12, 0x11, 0xF8, 0xE0, + 0x0D, 0x2A, 0xE1, 0x11, 0xBE, 0x08, 0x10, 0x1E, 0xF2, 0x45, 0x00, 0xC1, + 0x06, 0xE8, 0xC0, 0x1B, 0x48, 0x2E, 0xD3, 0xF2, 0x41, 0x1E, 0xAE, 0x41, + 0x15, 0xBA, 0x41, 0xBA, 0x74, 0xE7, 0x17, 0xFA, 0x82, 0x16, 0x4A, 0xE1, + 0x14, 0x42, 0x01, 0x14, 0x0E, 0xA3, 0xFC, 0x6E, 0x0E, 0xBE, 0xA4, 0x81, + 0x08, 0x2E, 0xC6, 0x62, 0xF0, 0x42, 0x1A, 0x16, 0x11, 0xA5, 0x60, 0x01, + 0x2D, 0x50, 0x21, 0x1A, 0xE6, 0xEF, 0x14, 0x36, 0xC9, 0x12, 0x73, 0xB2, + 0x2A, 0x5E, 0x01, 0x17, 0x3E, 0x8D, 0x01, 0x21, 0xD0, 0x1F, 0xAC, 0x0D, + 0x19, 0x3E, 0x61, 0x06, 0x70, 0xB1, 0x1A, 0x14, 0x90, 0x1B, 0x3E, 0xCD, + 0xD6, 0x94, 0x61, 0x4E, 0xA2, 0x69, 0x02, 0xE1, 0x6A, 0x4E, 0x48, 0xF2, + 0x13, 0x30, 0xA1, 0x08, 0x74, 0xE0, 0x02, 0x5A, 0xA9, 0x28, 0x2D, 0x60, + 0x02, 0x00, 0x45, 0x08, 0x0E, 0x0C, 0x17, 0x54, 0xC1, 0x15, 0x66, 0x41, + 0x1B, 0x30, 0x61, 0x06, 0x94, 0x63, 0x06, 0x4C, 0x00, 0x08, 0xEC, 0x6A, + 0x04, 0x2D, 0x00, 0x50, 0x84, 0xA6, 0x00, 0xA0, 0x03, 0x03, 0x26, 0xA0, + 0x19, 0x11, 0x00, 0x02, 0x44, 0xA0, 0x04, 0x3A, 0x25, 0x07, 0x30, 0xC1, + 0xEA, 0xAC, 0xAD, 0xAF, 0xE2, 0x64, 0x2A, 0x53, 0x61, 0x14, 0x3A, 0xEC, + 0x08, 0x3F, 0x00, 0x05, 0x2C, 0x2B, 0x07, 0xFA, 0xF2, 0x1C, 0x17, 0x00, + 0x5C, 0xA2, 0x08, 0x0F, 0x5C, 0x45, 0x0D, 0xCE, 0xC0, 0x0D, 0x24, 0xA2, + 0x05, 0x5C, 0xA0, 0x25, 0xF2, 0x69, 0x05, 0xFA, 0xC3, 0xFE, 0x6D, 0xF0, + 0x31, 0x88, 0xE4, 0xE3, 0x41, 0xD4, 0xC0, 0x0C, 0xD0, 0xE0, 0x73, 0xC4, + 0xE0, 0x3B, 0x78, 0x8F, 0xF8, 0x88, 0x2F, 0x12, 0x24, 0x41, 0x12, 0x0E, + 0x81, 0x10, 0x04, 0xC1, 0x0D, 0x10, 0x92, 0x0F, 0xDA, 0xAC, 0x12, 0xBE, + 0xA8, 0x19, 0x20, 0xF2, 0x18, 0xF4, 0xE5, 0x07, 0x64, 0x41, 0x1E, 0xEE, + 0xF0, 0xBD, 0xB2, 0x0F, 0xEF, 0xB0, 0x21, 0x7A, 0xC2, 0x02, 0x78, 0x60, + 0x41, 0x14, 0x56, 0x41, 0xE6, 0x90, 0x44, 0x1B, 0x56, 0xC1, 0x5F, 0x74, + 0x93, 0x7B, 0xDE, 0x42, 0x1A, 0xFE, 0x21, 0xE8, 0xB4, 0x01, 0x78, 0x7C, + 0xAE, 0x1A, 0x34, 0x4C, 0x16, 0x56, 0x41, 0x61, 0x42, 0xA1, 0x30, 0x10, + 0xA3, 0x14, 0xDA, 0x47, 0x27, 0xBB, 0x13, 0x2A, 0x54, 0x41, 0x92, 0x64, + 0x0D, 0x19, 0x92, 0x21, 0x64, 0xB4, 0x41, 0x14, 0x22, 0x80, 0x00, 0x82, + 0xA0, 0x01, 0x0F, 0xEC, 0x4D, 0x7C, 0x03, 0x16, 0x61, 0xC1, 0x15, 0x5A, + 0xC1, 0xC5, 0xA4, 0x69, 0x16, 0x83, 0xC0, 0x82, 0x84, 0x80, 0x08, 0x2E, + 0x00, 0x50, 0xF6, 0xB3, 0x00, 0x04, 0xA0, 0x67, 0x30, 0xA1, 0x14, 0x77, + 0xD1, 0xF1, 0x60, 0x41, 0x1B, 0x86, 0x40, 0x07, 0x0E, 0xD4, 0x07, 0x4E, + 0x90, 0x0E, 0x86, 0x60, 0x08, 0x02, 0x41, 0x02, 0xE0, 0x12, 0x2E, 0x13, + 0x00, 0x2E, 0x79, 0x40, 0x26, 0x83, 0x60, 0x06, 0x52, 0xC5, 0x01, 0x06, + 0x60, 0x01, 0x82, 0x8D, 0x40, 0xF9, 0x92, 0xC1, 0x92, 0x81, 0x19, 0x60, + 0x81, 0x98, 0x7C, 0x40, 0x02, 0x66, 0x4F, 0x1C, 0x21, 0x20, 0x16, 0x42, + 0x0D, 0x08, 0x24, 0xC0, 0x01, 0x1E, 0x22, 0xCC, 0xFC, 0xD1, 0x44, 0x2E, + 0x87, 0x22, 0xD4, 0x60, 0x40, 0x4A, 0x88, 0xB5, 0x3E, 0x42, 0x5A, 0x44, + 0x02, 0x05, 0x24, 0x27, 0x1F, 0xDD, 0xE6, 0x3C, 0x12, 0xCE, 0x0C, 0xD6, + 0xFE, 0xCC, 0xCB, 0xF4, 0xA0, 0xE2, 0xD4, 0xF0, 0x10, 0x0A, 0x72, 0x35, + 0x01, 0x92, 0x0D, 0x0D, 0x81, 0x45, 0x64, 0x53, 0x46, 0x5E, 0xE4, 0x19, + 0x00, 0x21, 0x0E, 0xE8, 0x00, 0x1E, 0xF2, 0x84, 0xA3, 0xDC, 0xA7, 0xA3, + 0xDE, 0xC2, 0x1A, 0x54, 0xC1, 0x1B, 0xA4, 0xCB, 0x2B, 0xFA, 0x62, 0x19, + 0x24, 0xAD, 0x48, 0x4E, 0x21, 0x4C, 0x10, 0xA3, 0xFE, 0xDE, 0xEB, 0x17, + 0x86, 0xE0, 0x62, 0x72, 0x2A, 0x4B, 0x1C, 0x71, 0x15, 0x68, 0x01, 0xA8, + 0x88, 0x60, 0x15, 0x40, 0x21, 0x3B, 0x59, 0xC1, 0x15, 0x2C, 0xD2, 0x3B, + 0xEF, 0xAF, 0x1D, 0x4A, 0xE1, 0xC0, 0x72, 0x2A, 0x19, 0x86, 0x25, 0x1B, + 0x88, 0x03, 0x07, 0x4A, 0x49, 0x99, 0x2E, 0xC3, 0x50, 0x79, 0x11, 0x16, + 0x61, 0xB1, 0x81, 0x9A, 0x60, 0x08, 0x48, 0x29, 0xB1, 0x9A, 0xC0, 0x15, + 0xFC, 0x81, 0x1A, 0x58, 0x0D, 0x07, 0x04, 0x80, 0x00, 0x2C, 0x20, 0x51, + 0xF2, 0x27, 0x37, 0x88, 0xA0, 0x16, 0x66, 0xAD, 0x1A, 0xFC, 0x21, 0xC6, + 0xB4, 0x21, 0x10, 0x3A, 0x25, 0x10, 0xE8, 0xE0, 0xEF, 0x30, 0x41, 0x13, + 0x4A, 0xF5, 0x39, 0xF0, 0x67, 0x01, 0x96, 0x51, 0x53, 0xE1, 0x81, 0x1E, + 0xC8, 0xA1, 0x1F, 0x70, 0x81, 0x2C, 0x1D, 0x20, 0x01, 0x12, 0x40, 0x01, + 0x66, 0x60, 0x08, 0x2E, 0x69, 0x16, 0xAC, 0x6D, 0xB3, 0xF6, 0x86, 0x15, + 0x58, 0x61, 0x9A, 0x68, 0x60, 0x04, 0x3A, 0x40, 0x02, 0x26, 0x60, 0x0E, + 0x30, 0x23, 0x08, 0x1A, 0xC0, 0x01, 0xC4, 0xC0, 0x0C, 0xF0, 0x60, 0x10, + 0xD4, 0x40, 0x10, 0xEA, 0xA0, 0x59, 0xD6, 0xE5, 0x72, 0xC6, 0x00, 0x9C, + 0xC4, 0x60, 0x04, 0xD2, 0x40, 0x24, 0xDA, 0x63, 0x84, 0x5A, 0x40, 0x06, + 0x5A, 0x60, 0x23, 0x38, 0x80, 0x5A, 0x5A, 0x80, 0xB6, 0xC0, 0x45, 0xB7, + 0xBE, 0x03, 0x20, 0xFE, 0xB9, 0x43, 0x12, 0xC4, 0x2C, 0x20, 0x09, 0x61, + 0x5E, 0xE0, 0x20, 0x12, 0x28, 0x0A, 0xCE, 0x38, 0xE1, 0x45, 0x9C, 0x01, + 0x10, 0x34, 0xA1, 0x06, 0x54, 0xA1, 0x8C, 0xB0, 0xA2, 0x8C, 0xC0, 0xE1, + 0x16, 0x42, 0xA3, 0x7B, 0xF2, 0xC1, 0x1A, 0x5C, 0x61, 0x1B, 0xB6, 0x6F, + 0x77, 0xC4, 0x02, 0xA5, 0x46, 0x41, 0xD0, 0x4E, 0x81, 0x2D, 0xD6, 0x61, + 0x15, 0xCA, 0x04, 0x0F, 0x75, 0x61, 0x25, 0xB5, 0xC1, 0x62, 0x1C, 0x51, + 0x1A, 0xAA, 0x4B, 0x16, 0xD0, 0xCB, 0x13, 0xD2, 0x6B, 0xBD, 0x10, 0xA3, + 0x16, 0xF2, 0xD4, 0x3B, 0xA5, 0xA1, 0x16, 0xC4, 0x8E, 0x1B, 0x86, 0xE5, + 0xDA, 0x90, 0x61, 0x83, 0x42, 0xA1, 0xAF, 0x6E, 0x2A, 0x29, 0x5F, 0xD6, + 0x1F, 0x5C, 0xA1, 0x14, 0xE2, 0x8A, 0x94, 0x76, 0x80, 0xC2, 0x48, 0xE1, + 0x15, 0xFC, 0xA1, 0x22, 0xA5, 0x62, 0x1F, 0x76, 0xE0, 0x2D, 0x0F, 0x80, + 0x19, 0xDB, 0x12, 0x13, 0xAA, 0xA1, 0x01, 0x79, 0x91, 0x40, 0x81, 0x60, + 0xD9, 0x4A, 0x90, 0x0E, 0x34, 0xC1, 0x97, 0x9A, 0xE3, 0x39, 0x7A, 0xE6, + 0x00, 0x02, 0x60, 0x00, 0x46, 0x05, 0x03, 0xBE, 0x61, 0x1F, 0xEC, 0x70, + 0x1F, 0xC0, 0x81, 0x56, 0x15, 0xC0, 0x01, 0x20, 0x67, 0x01, 0x4C, 0x80, + 0xAB, 0x66, 0x21, 0x28, 0x37, 0xAB, 0x26, 0x99, 0x81, 0x15, 0x7C, 0x60, + 0x07, 0xFA, 0x86, 0x01, 0x20, 0x80, 0x1C, 0xD7, 0x81, 0x08, 0x8E, 0xF0, + 0x05, 0xA8, 0x48, 0x0F, 0x66, 0x22, 0x25, 0x1E, 0xF3, 0x0C, 0x3C, 0x33, + 0x32, 0x39, 0x44, 0x0C, 0xD4, 0x20, 0x41, 0xD2, 0x80, 0x5B, 0x3B, 0x67, + 0x59, 0x20, 0x24, 0x04, 0x8A, 0x15, 0x1C, 0xEF, 0x09, 0x0D, 0x72, 0x0F, + 0x5E, 0x55, 0xD3, 0x5D, 0xC5, 0x0C, 0x45, 0x56, 0x13, 0x0E, 0xE0, 0x80, + 0x11, 0x26, 0x81, 0xA2, 0x9A, 0xC1, 0xFE, 0x19, 0x6A, 0xF3, 0xF9, 0x94, + 0x22, 0x0E, 0x8C, 0xA0, 0x1F, 0xAE, 0xB6, 0x1F, 0xAE, 0xC1, 0x1B, 0x9E, + 0xCE, 0x1A, 0xA4, 0xE1, 0x1B, 0xAA, 0x01, 0x17, 0x48, 0x61, 0x09, 0xA4, + 0x63, 0x09, 0xA6, 0x0A, 0x4F, 0xD3, 0xA4, 0x8C, 0xA4, 0xE1, 0x14, 0x3E, + 0xB7, 0x23, 0xAB, 0x01, 0x4B, 0x56, 0xA1, 0x63, 0x0B, 0x2B, 0xBB, 0x48, + 0x06, 0x0F, 0xF7, 0x41, 0x1A, 0xD4, 0x34, 0x1A, 0xF2, 0x22, 0xA7, 0x68, + 0x09, 0x3E, 0xBF, 0x64, 0xD2, 0x5A, 0x2A, 0x64, 0x56, 0x81, 0x12, 0x45, + 0x36, 0x27, 0x4B, 0x81, 0x16, 0x5C, 0x26, 0x15, 0x8F, 0x69, 0x2C, 0x79, + 0x40, 0x07, 0x40, 0x01, 0x50, 0x43, 0x0D, 0x15, 0x2F, 0x03, 0x8E, 0x48, + 0x61, 0x7E, 0x2A, 0x00, 0x07, 0x46, 0xE1, 0x1B, 0xEC, 0x70, 0x2A, 0xD8, + 0xE7, 0x29, 0x44, 0xC1, 0x00, 0x04, 0xC0, 0x3F, 0xDB, 0x92, 0x14, 0x02, + 0x14, 0x1A, 0x6A, 0x41, 0x16, 0x42, 0x30, 0x07, 0x6C, 0x60, 0x39, 0xE6, + 0x00, 0xAF, 0x8E, 0x01, 0x96, 0x30, 0xE1, 0x39, 0xD8, 0x92, 0x67, 0xCA, + 0xF7, 0x2D, 0x77, 0x40, 0x1E, 0xAA, 0x8F, 0x3B, 0xF5, 0x81, 0x16, 0x8E, + 0x10, 0xA0, 0x48, 0x40, 0x02, 0x30, 0x01, 0xDC, 0x90, 0x69, 0x1A, 0x7E, + 0x95, 0x4E, 0x86, 0x60, 0x06, 0x8E, 0xF5, 0x01, 0x70, 0x60, 0x1D, 0xB2, + 0xE1, 0x1C, 0x13, 0x20, 0x05, 0x3E, 0x27, 0x5A, 0xC7, 0x00, 0x26, 0xD0, + 0x65, 0x5D, 0xC2, 0xC0, 0x0D, 0x20, 0x42, 0x0D, 0xD0, 0x45, 0x3E, 0xD4, + 0x60, 0x6E, 0xFE, 0x2D, 0x1D, 0xC3, 0x40, 0xE0, 0x02, 0x0E, 0x3D, 0x56, + 0xE0, 0x6F, 0x3E, 0x00, 0x0D, 0x54, 0x13, 0x21, 0x53, 0xC4, 0x85, 0xE7, + 0x65, 0x10, 0x0C, 0x01, 0x0E, 0x0C, 0x21, 0x11, 0x58, 0xA4, 0x11, 0x64, + 0xD3, 0x45, 0x28, 0x17, 0x10, 0x7E, 0xC0, 0x06, 0x8A, 0xFE, 0x80, 0x08, + 0x98, 0x40, 0x08, 0x64, 0x83, 0x09, 0x7A, 0xC0, 0x35, 0x78, 0xE0, 0x74, + 0x89, 0x66, 0x09, 0xB4, 0x40, 0x09, 0x84, 0x40, 0x39, 0xCD, 0xE4, 0x2D, + 0x68, 0x41, 0xFF, 0x10, 0xB6, 0xFB, 0xA4, 0xC1, 0x16, 0x3C, 0x01, 0x80, + 0x56, 0x81, 0x90, 0x96, 0x01, 0x15, 0x8E, 0xF7, 0xBD, 0x68, 0x21, 0x08, + 0xA6, 0x21, 0x1A, 0x9E, 0x47, 0x4B, 0x0E, 0x82, 0x15, 0x56, 0xA1, 0x63, + 0x3A, 0x56, 0xA8, 0x42, 0x21, 0x64, 0x91, 0xD7, 0x12, 0xF9, 0x81, 0x14, + 0xAA, 0xA1, 0xBE, 0x94, 0x89, 0xC1, 0xFC, 0xE1, 0x33, 0x70, 0x40, 0x6C, + 0x67, 0x69, 0xD8, 0x50, 0x11, 0x15, 0x6B, 0xA1, 0x09, 0x52, 0xAD, 0x02, + 0x8A, 0x00, 0x1C, 0xA8, 0x6A, 0x76, 0xEE, 0xF0, 0x1B, 0x46, 0x61, 0x14, + 0x2A, 0x80, 0x7C, 0x0F, 0xA0, 0xAD, 0xBE, 0x8A, 0x16, 0x78, 0x0D, 0x3F, + 0x10, 0xD4, 0x08, 0x8C, 0x20, 0x10, 0x02, 0xA1, 0x69, 0x35, 0x41, 0x01, + 0x40, 0xE5, 0x39, 0x00, 0xE0, 0x00, 0xDE, 0xD2, 0x02, 0x0A, 0xC0, 0x66, + 0xFA, 0xF7, 0x2D, 0xDE, 0xA2, 0x16, 0x52, 0x45, 0x04, 0xA6, 0x45, 0x08, + 0x4E, 0xA1, 0x53, 0x8F, 0xC9, 0x1F, 0x94, 0x61, 0xED, 0x64, 0xF2, 0x06, + 0x72, 0xE0, 0x01, 0x20, 0x20, 0x02, 0x98, 0x61, 0x1B, 0x76, 0xE0, 0x01, + 0x1C, 0x40, 0x05, 0x1E, 0x73, 0x10, 0x68, 0x4B, 0x1D, 0x65, 0xEB, 0x72, + 0x34, 0x4F, 0x0C, 0x58, 0xE8, 0x97, 0x37, 0x53, 0x06, 0xCE, 0xC0, 0x0C, + 0xFE, 0x26, 0x57, 0x58, 0x80, 0x9F, 0x52, 0x40, 0xA1, 0xCA, 0xA0, 0x0C, + 0x54, 0x40, 0x06, 0xC2, 0xEC, 0x0C, 0x11, 0xC1, 0x85, 0x8F, 0x54, 0x35, + 0x63, 0x18, 0x0E, 0x50, 0x47, 0x11, 0x26, 0xA1, 0x11, 0x38, 0x4E, 0x29, + 0x92, 0x42, 0x0E, 0x4C, 0x00, 0x00, 0x20, 0x80, 0x07, 0x34, 0x80, 0x07, + 0xFE, 0x0A, 0x45, 0x09, 0x68, 0x40, 0x03, 0xA2, 0xE3, 0x02, 0x94, 0xC0, + 0x09, 0xBC, 0x20, 0x13, 0x9E, 0xE0, 0x09, 0x70, 0x52, 0x79, 0xA4, 0xA1, + 0x15, 0xB8, 0x81, 0x1A, 0xB6, 0xAF, 0x4B, 0xFC, 0xC2, 0x90, 0xE6, 0xC0, + 0x13, 0x50, 0xE1, 0xC1, 0xA2, 0x61, 0x8B, 0x33, 0x8D, 0x16, 0x28, 0x86, + 0x1A, 0xB4, 0x44, 0x1B, 0xB2, 0xC4, 0x16, 0xAA, 0xD3, 0x15, 0x50, 0x61, + 0x0E, 0x58, 0x21, 0x14, 0xC6, 0x4F, 0xA0, 0x6B, 0xA1, 0x89, 0xD9, 0xD8, + 0xB9, 0xBC, 0xC1, 0x4D, 0xE2, 0x78, 0x58, 0xFC, 0x01, 0x19, 0x1A, 0x48, + 0x14, 0xA5, 0xEE, 0x37, 0xB4, 0x81, 0x79, 0xAB, 0x97, 0x1A, 0x48, 0x21, + 0x07, 0x70, 0x60, 0x07, 0x52, 0xBA, 0x16, 0x48, 0x83, 0x93, 0x24, 0xA3, + 0x49, 0x9A, 0x60, 0x2B, 0x2D, 0x20, 0x14, 0xD4, 0xA1, 0xEC, 0xA6, 0x61, + 0xBF, 0x60, 0x41, 0x19, 0x48, 0xD4, 0x07, 0x02, 0x81, 0x41, 0x31, 0x21, + 0x58, 0x99, 0x81, 0x2C, 0x79, 0xA6, 0x3F, 0xF7, 0x93, 0x68, 0x88, 0x00, + 0x1E, 0x5A, 0x5A, 0x2A, 0x54, 0x81, 0x01, 0x52, 0x20, 0x06, 0x74, 0x40, + 0x14, 0xC4, 0x96, 0xBE, 0x7C, 0xF5, 0xC1, 0x30, 0x01, 0x08, 0x72, 0x20, + 0x07, 0x8A, 0xF1, 0x01, 0x84, 0x0C, 0x08, 0x66, 0xC0, 0x01, 0x46, 0xC0, + 0x1F, 0x05, 0xA1, 0x0D, 0xD0, 0x75, 0x74, 0xC6, 0x40, 0xCB, 0xD0, 0x85, + 0xC7, 0x3E, 0xEB, 0xDF, 0x94, 0xE5, 0x05, 0xAC, 0x25, 0x85, 0x40, 0x2B, + 0x3E, 0x3A, 0xC0, 0x3A, 0xEE, 0x76, 0x10, 0x9E, 0x15, 0xE2, 0x24, 0x61, + 0x26, 0x2E, 0x2E, 0x11, 0xA8, 0xF9, 0x10, 0x4A, 0xE7, 0x71, 0x0D, 0x41, + 0x86, 0x6B, 0x98, 0xE3, 0x3A, 0x4E, 0x46, 0x26, 0x20, 0x00, 0x70, 0x20, + 0x17, 0xA2, 0x20, 0x0A, 0x94, 0x40, 0xB1, 0xE5, 0xF9, 0x09, 0x10, 0x3B, + 0x0A, 0x72, 0x21, 0xFE, 0x17, 0x32, 0x41, 0x0A, 0xA2, 0xC0, 0x0A, 0x94, + 0xA7, 0x49, 0xA0, 0x98, 0x1B, 0xB8, 0xCF, 0x1A, 0xA8, 0x81, 0x16, 0xFA, + 0x62, 0xA5, 0x3C, 0xA1, 0x38, 0xA3, 0x61, 0x19, 0x42, 0x01, 0x25, 0x9D, + 0xEB, 0xB2, 0x89, 0x80, 0x3C, 0xA3, 0x01, 0x16, 0xB4, 0x24, 0x78, 0x5C, + 0xC1, 0x90, 0xD0, 0x67, 0x30, 0x00, 0x1A, 0x31, 0x68, 0x61, 0x75, 0x2D, + 0x3A, 0x25, 0x4B, 0x76, 0xFF, 0x20, 0x30, 0x19, 0x60, 0xC1, 0x6A, 0x82, + 0x80, 0xAD, 0x4C, 0x4D, 0x6C, 0x83, 0x72, 0x01, 0xDF, 0xE4, 0x1A, 0x76, + 0xB1, 0x09, 0xEC, 0x27, 0x07, 0x78, 0x80, 0x08, 0xE8, 0xB9, 0xBB, 0xA8, + 0x42, 0x94, 0x31, 0x75, 0x15, 0x68, 0x5A, 0x97, 0x5C, 0xA1, 0x30, 0x76, + 0xD0, 0x07, 0xF0, 0xAA, 0x41, 0x61, 0x29, 0x16, 0xE8, 0x80, 0x2D, 0x2D, + 0x75, 0x3F, 0x0F, 0xE0, 0x02, 0x28, 0xDA, 0x2A, 0xDE, 0x01, 0x1C, 0xA4, + 0xC4, 0x04, 0x86, 0x40, 0x15, 0x92, 0x81, 0x1A, 0xBE, 0x61, 0xBD, 0xAD, + 0xD1, 0x13, 0x03, 0xC1, 0x04, 0xE9, 0x20, 0x02, 0x62, 0x19, 0x14, 0xD4, + 0xC1, 0x39, 0xAA, 0xA3, 0x83, 0xF1, 0x40, 0x0C, 0xDA, 0x80, 0xF7, 0xF0, + 0x80, 0x22, 0x74, 0xCC, 0x33, 0xD5, 0xA0, 0x85, 0x2E, 0x61, 0x05, 0xCC, + 0x80, 0x04, 0x80, 0x70, 0x56, 0xD0, 0xE3, 0x04, 0x38, 0x87, 0x04, 0x40, + 0xA0, 0x5C, 0x5E, 0x00, 0x0D, 0x5A, 0x13, 0x5E, 0x6F, 0x02, 0x3C, 0xD2, + 0x90, 0x9A, 0x13, 0x41, 0x45, 0x8E, 0x54, 0x10, 0x64, 0x98, 0x0F, 0x18, + 0x61, 0x11, 0x96, 0x0F, 0xA3, 0x00, 0x41, 0x29, 0x44, 0x20, 0x00, 0x22, + 0xE0, 0xB1, 0xA3, 0x40, 0x9E, 0x1D, 0xDB, 0x0B, 0xBC, 0xE0, 0xB0, 0x59, + 0xDC, 0x0B, 0x6C, 0xE3, 0x09, 0xF8, 0xA1, 0x76, 0xDA, 0xA7, 0x16, 0x6A, + 0x01, 0xA7, 0x36, 0x3B, 0x61, 0xA5, 0xFE, 0x01, 0x16, 0xBE, 0xA4, 0xB0, + 0x8E, 0x84, 0xE6, 0x42, 0x81, 0x8B, 0xB9, 0x8B, 0x16, 0x56, 0x32, 0x1A, + 0xA8, 0x41, 0x16, 0xA0, 0x81, 0x16, 0x22, 0xAD, 0xF0, 0x22, 0x5A, 0x61, + 0x1E, 0xE8, 0x30, 0x42, 0x61, 0x93, 0x2A, 0xDA, 0xB6, 0x1F, 0x29, 0x67, + 0xDB, 0x13, 0xDB, 0x90, 0xC1, 0xD7, 0x52, 0x7A, 0x06, 0x2A, 0x00, 0x14, + 0x20, 0x50, 0x6C, 0x03, 0x10, 0x17, 0xF6, 0xEF, 0x4D, 0x4A, 0x3A, 0x08, + 0x52, 0xDA, 0x7E, 0x20, 0x95, 0x16, 0xFA, 0x81, 0xE4, 0x38, 0x8A, 0x14, + 0x78, 0x20, 0x14, 0x0E, 0x6C, 0xB7, 0x23, 0x2D, 0x1A, 0x10, 0x14, 0x7E, + 0xAD, 0xE6, 0xB0, 0x80, 0x80, 0xA8, 0xA1, 0xA3, 0x08, 0x98, 0xC1, 0x29, + 0x8A, 0x2A, 0x1F, 0x4E, 0xCE, 0x0A, 0xCA, 0x1C, 0x13, 0x24, 0x35, 0x9F, + 0xA9, 0xC1, 0x14, 0x77, 0xB1, 0x15, 0x9A, 0x03, 0x14, 0x18, 0xB4, 0x02, + 0x20, 0x00, 0x02, 0x84, 0x8C, 0x08, 0x22, 0x80, 0x59, 0x07, 0x07, 0x0F, + 0xF0, 0x6D, 0x35, 0x0F, 0x8A, 0x22, 0x4E, 0x6B, 0x0C, 0x2E, 0x81, 0x22, + 0x2A, 0x42, 0xB6, 0xE2, 0x91, 0xC7, 0x0C, 0xA4, 0x58, 0xFF, 0x0D, 0x1F, + 0xE7, 0x83, 0x04, 0xD2, 0x00, 0x8B, 0x5C, 0x78, 0xF8, 0x5C, 0x18, 0x5E, + 0x23, 0xC1, 0x5D, 0xC2, 0x0C, 0x0E, 0x04, 0x01, 0x0E, 0x10, 0x81, 0x11, + 0x3C, 0xDC, 0x11, 0xBE, 0x48, 0x0E, 0xF2, 0x15, 0x10, 0x8E, 0x80, 0xC4, + 0x1F, 0xC0, 0x09, 0x10, 0x3B, 0x13, 0xBC, 0x20, 0x0A, 0x56, 0xBC, 0xC5, + 0x1D, 0x1B, 0xB1, 0x2F, 0x00, 0x0A, 0xF2, 0x41, 0xCA, 0x23, 0x03, 0x1F, + 0xF2, 0xA1, 0xBA, 0x6E, 0x1C, 0x7A, 0xC2, 0x42, 0x2C, 0x6C, 0x61, 0x61, + 0x82, 0x83, 0x19, 0x12, 0xEF, 0x13, 0x42, 0x76, 0xD9, 0x51, 0xA6, 0x16, + 0x8A, 0x80, 0xFC, 0x08, 0x89, 0x90, 0x90, 0x61, 0x15, 0xFE, 0x20, 0xDA, + 0xA1, 0xAF, 0xE7, 0x8E, 0xB4, 0x58, 0x16, 0xB6, 0x9D, 0xE9, 0xA6, 0xBC, + 0x31, 0xEC, 0x81, 0x14, 0xFC, 0x21, 0xB7, 0x49, 0x8D, 0xED, 0x60, 0xC1, + 0x42, 0xAD, 0xB2, 0x02, 0x82, 0xC0, 0xD4, 0xA0, 0xC9, 0xD4, 0x9E, 0x07, + 0x9F, 0x93, 0xF2, 0x1B, 0xFC, 0xA1, 0x82, 0x70, 0x20, 0x03, 0x70, 0x20, + 0x08, 0x9A, 0xC0, 0x13, 0x4A, 0x81, 0x1A, 0xAA, 0x74, 0x2A, 0x46, 0xA3, + 0x14, 0x82, 0xE0, 0xCD, 0x4F, 0x2C, 0x19, 0x64, 0x21, 0x2C, 0x93, 0x41, + 0x07, 0x22, 0xE0, 0x06, 0xAE, 0xFB, 0xAE, 0xE6, 0x40, 0x13, 0xAC, 0x86, + 0x83, 0x68, 0x00, 0x52, 0xBD, 0x61, 0x4D, 0x42, 0x19, 0x2A, 0xF0, 0xA1, + 0x1D, 0x62, 0x76, 0xD2, 0x00, 0x68, 0xAE, 0x94, 0x89, 0x1A, 0x16, 0x90, + 0xA4, 0x1B, 0x39, 0x07, 0x55, 0x41, 0x07, 0x14, 0x18, 0x02, 0x24, 0x60, + 0xA6, 0xD3, 0x87, 0x45, 0x09, 0x2A, 0x70, 0xA6, 0xB5, 0xE1, 0xF4, 0x7B, + 0x0C, 0x62, 0x22, 0x0D, 0xEC, 0x49, 0x5C, 0x58, 0x60, 0xC9, 0x5A, 0x20, + 0x0A, 0x3B, 0x40, 0xF3, 0xC8, 0x85, 0x05, 0xA0, 0x90, 0x05, 0x3C, 0x80, + 0x01, 0x24, 0xA7, 0x0C, 0x08, 0x21, 0x8A, 0xBA, 0x83, 0xF8, 0xAC, 0xB9, + 0x3B, 0x06, 0xC1, 0xF7, 0x10, 0x21, 0xD6, 0x0D, 0xA1, 0x10, 0x24, 0xB7, + 0x11, 0x9A, 0x2F, 0x0E, 0xE5, 0xA0, 0x06, 0x4C, 0x20, 0x00, 0x20, 0xA0, + 0xB1, 0x55, 0xFC, 0xB0, 0x87, 0x3D, 0x13, 0x8C, 0x3D, 0x0A, 0x28, 0x60, + 0x7D, 0x18, 0x43, 0xDD, 0x4B, 0x23, 0x1F, 0xC2, 0x52, 0xBA, 0xA0, 0x67, + 0x1B, 0xBA, 0x24, 0x30, 0xCA, 0xF8, 0x13, 0x00, 0x1A, 0x49, 0x46, 0x61, + 0x8D, 0xB9, 0xEB, 0x89, 0xE7, 0x00, 0x19, 0xC0, 0x7D, 0x16, 0x20, 0x2D, + 0x16, 0x58, 0x41, 0x30, 0x88, 0x27, 0x15, 0xD8, 0xA2, 0x3A, 0x69, 0xE1, + 0xFE, 0xED, 0xD9, 0xBD, 0x76, 0xBC, 0x81, 0x14, 0xB8, 0x21, 0x3C, 0xBD, + 0x5C, 0x15, 0x1A, 0x28, 0x08, 0x72, 0x80, 0x08, 0x84, 0x20, 0x08, 0x88, + 0x40, 0x2F, 0x59, 0x59, 0xDF, 0xAB, 0x01, 0xA7, 0x16, 0x70, 0xD6, 0xBC, + 0x01, 0xEF, 0x4C, 0x29, 0xAB, 0x3C, 0x4C, 0x83, 0x84, 0xA0, 0x09, 0x46, + 0x81, 0x16, 0xC0, 0xC1, 0x29, 0xF4, 0x41, 0xC6, 0x3D, 0x21, 0x07, 0x60, + 0x21, 0x97, 0xA6, 0x61, 0x7D, 0x41, 0xF4, 0x83, 0x7C, 0x60, 0x0E, 0x18, + 0x94, 0x41, 0xE9, 0x00, 0x6B, 0x22, 0xA0, 0xCE, 0xAC, 0x74, 0x1F, 0xF6, + 0x97, 0x1F, 0x4A, 0x5E, 0x14, 0xA8, 0x06, 0xB4, 0xC9, 0x54, 0x19, 0xBE, + 0xAA, 0x50, 0x5D, 0xC6, 0x64, 0x31, 0x11, 0x52, 0x9C, 0x6A, 0x9A, 0x90, + 0xF6, 0x01, 0x08, 0x60, 0x80, 0xD5, 0x01, 0x15, 0x6C, 0x2C, 0x01, 0x56, + 0x40, 0x70, 0xBC, 0x6C, 0xB7, 0x1E, 0xE2, 0x3C, 0x8C, 0xB9, 0x3D, 0x5E, + 0x20, 0x05, 0x70, 0x48, 0x0F, 0x2E, 0x24, 0x0C, 0xE0, 0x9A, 0x87, 0x32, + 0x53, 0x3B, 0xF4, 0x60, 0x3E, 0x92, 0x05, 0x0D, 0x9C, 0x48, 0x0D, 0x28, + 0x8E, 0xF8, 0xA8, 0x59, 0x0D, 0x25, 0xC1, 0xEA, 0xE1, 0x15, 0x0E, 0xF8, + 0x40, 0xCC, 0x12, 0x81, 0xEB, 0xBF, 0x08, 0x20, 0x8E, 0x01, 0xE2, 0x64, + 0x43, 0x0E, 0x03, 0x03, 0x17, 0x34, 0x44, 0x59, 0x98, 0x29, 0xD3, 0xC2, + 0x28, 0x0E, 0x17, 0x3E, 0x59, 0x88, 0xC1, 0x94, 0xBE, 0x8B, 0x18, 0x33, + 0x6A, 0xDC, 0xC8, 0xB1, 0xE3, 0xC5, 0x7D, 0xF9, 0x6A, 0xCD, 0xE2, 0x66, + 0xAD, 0xA4, 0xB5, 0x6A, 0xBA, 0x60, 0xE9, 0xB2, 0x05, 0x6B, 0x95, 0xA7, + 0x50, 0xB2, 0x62, 0x2D, 0xFB, 0x54, 0xCB, 0xA3, 0xCD, 0x9B, 0x38, 0xF7, + 0x75, 0xD4, 0x59, 0xEB, 0xD3, 0xB2, 0x68, 0xB2, 0x96, 0x41, 0x5B, 0x36, + 0x8B, 0x95, 0x2D, 0xFE, 0x50, 0x9F, 0x3E, 0x81, 0x0A, 0x15, 0x2A, 0x16, + 0xB2, 0x68, 0xAC, 0x6A, 0xE2, 0x9C, 0x4A, 0xB5, 0xAA, 0xD5, 0xAB, 0x58, + 0xB3, 0x66, 0x4C, 0xE6, 0x8A, 0xDB, 0xB4, 0x6E, 0xD9, 0xFC, 0xCD, 0x62, + 0x06, 0x6B, 0x56, 0x93, 0x21, 0x40, 0x6A, 0x7D, 0x1B, 0x85, 0xE9, 0x6C, + 0xA8, 0x59, 0xC8, 0x6A, 0x21, 0x43, 0x56, 0x8D, 0x5B, 0x36, 0x6E, 0xDF, + 0xB8, 0x75, 0xE3, 0xC6, 0xCD, 0x1B, 0xB7, 0x6A, 0xA5, 0x9A, 0x34, 0x11, + 0xB2, 0xA3, 0x08, 0xE1, 0x1B, 0x11, 0x72, 0x10, 0x11, 0xEC, 0x49, 0x08, + 0x8E, 0x56, 0x60, 0xB7, 0x89, 0x95, 0x95, 0x2C, 0x19, 0x8E, 0x08, 0x11, + 0x4C, 0xE8, 0xD0, 0xE1, 0x63, 0x73, 0x8E, 0x20, 0x15, 0x30, 0xF5, 0xAD, + 0xF6, 0x8B, 0x16, 0xDB, 0x26, 0x98, 0x8A, 0xE8, 0xC0, 0x54, 0x36, 0xDB, + 0xB6, 0xBB, 0xAF, 0xB3, 0xDD, 0xE5, 0x6B, 0xF7, 0x9B, 0x3F, 0x7F, 0xD4, + 0x66, 0xB9, 0x52, 0x35, 0x64, 0x4E, 0xE7, 0x08, 0x13, 0x02, 0x28, 0x08, + 0xB2, 0x6E, 0x55, 0x85, 0x19, 0x09, 0x3A, 0x0C, 0x6A, 0xD3, 0x46, 0xCF, + 0x20, 0x3D, 0x27, 0x58, 0x84, 0x11, 0x33, 0x66, 0x0C, 0x9A, 0x32, 0x66, + 0xC4, 0xA8, 0x49, 0xA3, 0x07, 0xCF, 0x8B, 0x30, 0x1C, 0x54, 0xBC, 0x38, + 0xC1, 0x61, 0x45, 0x8A, 0x15, 0x2F, 0xCA, 0xA8, 0x58, 0x21, 0x46, 0x8C, + 0x9B, 0x31, 0x65, 0x04, 0x49, 0x3A, 0x34, 0xE8, 0x10, 0x22, 0x44, 0x91, + 0xF2, 0x77, 0xC7, 0x03, 0xA7, 0xFF, 0xA4, 0x48, 0x88, 0x24, 0xC2, 0x48, + 0x23, 0x8D, 0x70, 0x62, 0xE0, 0x0F, 0x05, 0x09, 0x20, 0x81, 0x05, 0x34, + 0x30, 0xD4, 0x10, 0x43, 0x0F, 0x45, 0x31, 0x91, 0x12, 0x18, 0x80, 0xA3, + 0x15, 0x56, 0xF8, 0xE8, 0x23, 0x12, 0x49, 0x27, 0x55, 0x63, 0x8D, 0x2B, + 0xB5, 0xC8, 0x12, 0x0A, 0x2C, 0xAC, 0xFE, 0x7C, 0x82, 0x8A, 0x2C, 0x4F, + 0x7D, 0xE2, 0xCA, 0x85, 0x17, 0xEA, 0xE4, 0xD1, 0x2B, 0x9E, 0xC8, 0x32, + 0x14, 0x32, 0xD3, 0x04, 0xC5, 0x4A, 0x28, 0x73, 0xA0, 0xC2, 0x14, 0x2A, + 0x3C, 0x32, 0xA3, 0xCD, 0x2A, 0xBA, 0xB8, 0xC8, 0xE2, 0x90, 0x44, 0x16, + 0x69, 0xE4, 0x46, 0xB5, 0x48, 0x93, 0x17, 0x58, 0xB3, 0xD4, 0x02, 0x8B, + 0x3F, 0xB0, 0x7C, 0x12, 0x44, 0x13, 0xDE, 0xE8, 0x03, 0xCF, 0x59, 0x3E, + 0x0C, 0xA1, 0xCA, 0x34, 0xC9, 0xC0, 0x35, 0x4B, 0x32, 0xB2, 0x7D, 0xB3, + 0x0D, 0x5F, 0x7E, 0x91, 0x69, 0x1B, 0x2E, 0xA4, 0x8C, 0x32, 0x4A, 0x11, + 0x4D, 0xE4, 0x80, 0x18, 0x04, 0x13, 0x4C, 0x10, 0xC1, 0x0C, 0x90, 0x6D, + 0xD3, 0x8D, 0x3F, 0x71, 0x21, 0x33, 0xCB, 0x0D, 0x10, 0x44, 0x20, 0x81, + 0x04, 0x0F, 0x4C, 0xF0, 0xC0, 0x03, 0x7D, 0x3E, 0x30, 0x83, 0x10, 0x40, + 0xEC, 0xB0, 0x99, 0x0E, 0x34, 0xF8, 0xB0, 0x03, 0x6A, 0xA2, 0x9C, 0xE2, + 0x4F, 0x6C, 0xB3, 0xED, 0x45, 0x1B, 0x37, 0xD7, 0x48, 0x43, 0x0B, 0x2D, + 0xAD, 0x7C, 0x42, 0x04, 0x11, 0x73, 0xCC, 0x50, 0x81, 0x0E, 0x0D, 0x0C, + 0x00, 0x00, 0x07, 0x3E, 0x68, 0x83, 0xCC, 0x0C, 0x39, 0x2C, 0xD0, 0x80, + 0x73, 0x78, 0xB8, 0x21, 0x88, 0x1B, 0x29, 0xA8, 0x71, 0x86, 0x18, 0x27, + 0xA4, 0x60, 0x86, 0x19, 0x2F, 0x68, 0xD7, 0x5E, 0x1D, 0x62, 0xE0, 0x51, + 0x06, 0x7B, 0x27, 0x9C, 0xD0, 0x02, 0xB1, 0xD3, 0xB1, 0x20, 0x1D, 0x1E, + 0x6A, 0xD4, 0xA1, 0x9F, 0x1E, 0x87, 0x24, 0x92, 0x5F, 0x7E, 0x83, 0x0C, + 0xE2, 0x46, 0x7F, 0x79, 0x44, 0x92, 0x88, 0x22, 0x7C, 0x18, 0x32, 0xA0, + 0x23, 0xCD, 0x38, 0x72, 0xC4, 0x1F, 0x36, 0x28, 0x60, 0xC1, 0x05, 0x4F, + 0x40, 0x01, 0x45, 0x43, 0xEA, 0x66, 0xA2, 0xEE, 0x42, 0xFE, 0x4E, 0x3C, + 0xF1, 0xC4, 0x01, 0x4B, 0x1C, 0x99, 0x53, 0x3E, 0xAE, 0x24, 0xB3, 0x8D, + 0x35, 0xD4, 0x58, 0x23, 0x0D, 0x35, 0xB0, 0x80, 0xA8, 0xE2, 0x2A, 0xA1, + 0x7C, 0x12, 0x4B, 0x2C, 0xD1, 0x78, 0x42, 0x8B, 0x3E, 0x42, 0xDA, 0xAB, + 0x95, 0x2B, 0x73, 0xFC, 0xB4, 0xCC, 0x4F, 0xCC, 0xB0, 0xB2, 0x8A, 0x52, + 0x4C, 0x61, 0xB2, 0xE3, 0x53, 0xA8, 0x48, 0xE5, 0xF0, 0xC7, 0x20, 0x87, + 0x9C, 0x11, 0x3F, 0xAA, 0x58, 0xB3, 0xD7, 0x36, 0xDA, 0xCC, 0x32, 0x8B, + 0x2C, 0x50, 0x86, 0x12, 0x84, 0x27, 0x18, 0xF9, 0x83, 0x1A, 0xA2, 0x9F, + 0xA8, 0xA2, 0x67, 0x2B, 0xB0, 0x54, 0x23, 0x5B, 0x36, 0xDD, 0xF4, 0xAC, + 0x57, 0xCF, 0x3E, 0x53, 0x23, 0x8D, 0x2B, 0xA2, 0xB4, 0xA2, 0x8A, 0x2A, + 0x04, 0x07, 0x81, 0x03, 0x04, 0x33, 0xD4, 0xD2, 0x8D, 0x9D, 0xDA, 0xD4, + 0xD2, 0xCA, 0x34, 0x98, 0xCC, 0x80, 0x98, 0x04, 0x10, 0x00, 0x9A, 0xF5, + 0x82, 0x33, 0xE8, 0x80, 0xC3, 0xA8, 0x37, 0xDC, 0x30, 0xC3, 0x0E, 0xA7, + 0x14, 0x3D, 0xCB, 0x6D, 0x3B, 0xEB, 0x45, 0xDB, 0x35, 0xDD, 0xF0, 0x5B, + 0x8D, 0x3F, 0xB5, 0x94, 0x22, 0xCA, 0x28, 0x9E, 0x10, 0x31, 0xC4, 0x03, + 0x15, 0xDC, 0xC0, 0xC1, 0x02, 0x2B, 0x0C, 0xB0, 0x40, 0x0E, 0xCA, 0x64, + 0x93, 0x43, 0x0E, 0x26, 0x38, 0x50, 0x86, 0x1E, 0x91, 0x10, 0x52, 0xC7, + 0x25, 0xB5, 0xAA, 0x11, 0xC6, 0x0A, 0xD1, 0xBD, 0xC0, 0x5E, 0x19, 0xDF, + 0x89, 0xF1, 0x82, 0x19, 0x6A, 0xB4, 0x90, 0x02, 0x09, 0x61, 0xB8, 0x90, + 0x42, 0x1A, 0x2B, 0xB0, 0x30, 0x46, 0x18, 0x9F, 0xAB, 0x81, 0x87, 0x1E, + 0x88, 0x1C, 0xA2, 0x07, 0x21, 0x01, 0x1E, 0x22, 0xC8, 0x21, 0x87, 0x10, + 0x82, 0x87, 0x19, 0x75, 0xC0, 0xB1, 0x47, 0x24, 0xB0, 0x47, 0x32, 0x09, + 0xFE, 0x25, 0x9D, 0x38, 0xB2, 0x89, 0x0D, 0x3F, 0x00, 0xF2, 0xC0, 0x01, + 0xE7, 0xD2, 0xE0, 0x84, 0xBB, 0xEA, 0xAE, 0x8B, 0xBC, 0x84, 0x51, 0x50, + 0xF8, 0x8D, 0xC8, 0x1B, 0xC9, 0xA3, 0xCF, 0x29, 0xB4, 0xEC, 0x5B, 0x52, + 0x35, 0x28, 0xC9, 0x62, 0x8B, 0x2B, 0xAD, 0xB8, 0x12, 0x0A, 0x2A, 0xAC, + 0xB0, 0x32, 0xD3, 0xC2, 0xD0, 0x63, 0x05, 0x71, 0x50, 0x40, 0x4D, 0xBC, + 0xCA, 0x8D, 0x05, 0x83, 0x02, 0x0A, 0x2A, 0x4B, 0x4D, 0x8C, 0x0A, 0xF9, + 0xE5, 0xD7, 0x6F, 0x3F, 0x56, 0xE4, 0xA8, 0xA2, 0x97, 0x6B, 0x29, 0x8B, + 0xE5, 0x4F, 0x2B, 0x98, 0x10, 0xC2, 0x2F, 0x32, 0x02, 0x8F, 0x51, 0x04, + 0x26, 0x07, 0x40, 0x18, 0x45, 0x2D, 0xFC, 0xA1, 0x0D, 0x6D, 0x4C, 0xE3, + 0x36, 0xD4, 0xA0, 0xC6, 0x37, 0xF6, 0xE2, 0x33, 0x0A, 0x72, 0x43, 0x1A, + 0xD2, 0xB8, 0x8D, 0x32, 0x66, 0xA1, 0x0A, 0x4C, 0xF8, 0xC0, 0x02, 0x37, + 0x70, 0xDA, 0x6B, 0xB4, 0x51, 0x16, 0x7F, 0xA0, 0x62, 0x06, 0x5B, 0xB3, + 0x1A, 0x0E, 0xC2, 0x36, 0x38, 0x46, 0x05, 0x01, 0x13, 0x43, 0xC0, 0x44, + 0x2B, 0x62, 0xA1, 0x0C, 0x07, 0x36, 0xD0, 0x35, 0x76, 0xF9, 0x19, 0xD0, + 0x84, 0x46, 0x0B, 0x57, 0x70, 0x4A, 0x14, 0x40, 0xAC, 0x85, 0x27, 0xFC, + 0x74, 0x1C, 0x07, 0x0C, 0xC0, 0x05, 0x66, 0x48, 0x80, 0x03, 0x66, 0xA0, + 0x0A, 0x75, 0x0C, 0x21, 0x33, 0x0B, 0x48, 0x41, 0x1B, 0x0E, 0x11, 0x09, + 0x41, 0x0C, 0x0B, 0x58, 0xE8, 0x19, 0xC1, 0xE5, 0x48, 0xD7, 0x9E, 0x33, + 0x98, 0x21, 0x05, 0x61, 0x08, 0x83, 0x0A, 0x46, 0xC0, 0x02, 0xCD, 0x81, + 0xF1, 0x3B, 0xD3, 0x19, 0x43, 0x1A, 0xD2, 0x70, 0xBA, 0x48, 0xE8, 0x61, + 0x75, 0xF6, 0x41, 0x04, 0xEB, 0x06, 0x51, 0x88, 0x41, 0x9C, 0x21, 0x0F, + 0x7B, 0x40, 0x5D, 0xFE, 0x22, 0x12, 0x41, 0x89, 0x44, 0x4C, 0xA2, 0x12, + 0x9D, 0x60, 0x83, 0x0D, 0x9A, 0xF1, 0x03, 0x02, 0x70, 0x00, 0x03, 0xE7, + 0x72, 0x02, 0x14, 0x14, 0xC9, 0xAE, 0xE4, 0x2D, 0x32, 0x0A, 0x18, 0x28, + 0x42, 0xC3, 0xCA, 0xF7, 0x8E, 0x7C, 0x9C, 0x42, 0x17, 0xD6, 0xE3, 0xD7, + 0xD0, 0x74, 0x21, 0x22, 0x56, 0x9C, 0xC2, 0x13, 0xB1, 0x38, 0x91, 0x32, + 0x46, 0x51, 0x8D, 0xFB, 0x4D, 0x45, 0x27, 0xAE, 0xF0, 0xC4, 0x32, 0x98, + 0x11, 0x8D, 0xF4, 0x85, 0x2F, 0x14, 0x9E, 0x80, 0x5F, 0x8E, 0x6C, 0x21, + 0xCA, 0xF9, 0xE9, 0x23, 0x1F, 0xA6, 0xCC, 0xA5, 0x2E, 0x37, 0x42, 0x8D, + 0x5A, 0xF8, 0x05, 0x2C, 0x62, 0xE9, 0x12, 0x33, 0x44, 0x21, 0x04, 0x4F, + 0xC0, 0x43, 0x48, 0xFB, 0x78, 0x87, 0x37, 0xAA, 0x81, 0x89, 0x39, 0xA0, + 0xE6, 0x14, 0x81, 0x9B, 0x86, 0x34, 0xA7, 0xA1, 0x8D, 0xB4, 0xF1, 0xA5, + 0x82, 0xDD, 0xF0, 0xC6, 0xD3, 0x1C, 0xC8, 0x8C, 0x0E, 0xEA, 0x20, 0x08, + 0xB4, 0xE8, 0xC6, 0x3A, 0xBC, 0xF2, 0xA4, 0x59, 0x84, 0x42, 0x07, 0x37, + 0x58, 0xCD, 0x2A, 0x50, 0xD1, 0xC1, 0x4F, 0x00, 0x10, 0x15, 0x3E, 0x92, + 0xCD, 0x36, 0x46, 0xD8, 0xC0, 0x1B, 0xCA, 0x46, 0x6D, 0x76, 0xA1, 0xC6, + 0x2F, 0x4A, 0xD3, 0x43, 0x03, 0x96, 0x82, 0x08, 0x98, 0x08, 0x42, 0xD6, + 0x22, 0xF0, 0x00, 0x06, 0xA0, 0x80, 0x03, 0x1C, 0x78, 0x5C, 0x02, 0x4C, + 0x80, 0x0A, 0x75, 0x60, 0xC2, 0x4F, 0x0E, 0xE0, 0x80, 0x18, 0xEA, 0x20, + 0x1F, 0x41, 0xB4, 0x80, 0x10, 0x6A, 0x60, 0x4F, 0x0A, 0xCA, 0x10, 0xC6, + 0x17, 0xB4, 0x41, 0x0D, 0x62, 0x68, 0x83, 0x18, 0x56, 0x40, 0x3A, 0x15, + 0xB4, 0x40, 0x0C, 0x63, 0xAC, 0x55, 0x0B, 0xCC, 0x20, 0x3A, 0x35, 0xA4, + 0x80, 0x05, 0x84, 0xC0, 0xA8, 0x1B, 0xFE, 0x62, 0x5A, 0x08, 0x44, 0xD0, + 0x11, 0x0F, 0x79, 0x54, 0x83, 0x19, 0xE8, 0x98, 0x88, 0x00, 0x01, 0xE8, + 0x8F, 0x8B, 0xB0, 0x01, 0x20, 0xFE, 0x20, 0x01, 0x02, 0x10, 0xCF, 0x02, + 0x4B, 0x78, 0xC2, 0xF1, 0x90, 0xB7, 0x2E, 0x45, 0xA6, 0xEB, 0x02, 0x16, + 0xC8, 0xC6, 0x3E, 0x26, 0x29, 0x32, 0x79, 0x58, 0x52, 0x5F, 0x25, 0xA1, + 0x86, 0x2E, 0x38, 0xA9, 0x0B, 0x5A, 0xD8, 0x62, 0x15, 0xAB, 0xC0, 0x84, + 0x4F, 0x58, 0x91, 0xB0, 0x01, 0xEE, 0xD2, 0x26, 0xA5, 0xC0, 0xC4, 0xC4, + 0xA2, 0xB1, 0x0C, 0x59, 0x44, 0x63, 0x7D, 0xF0, 0x43, 0x45, 0x52, 0x3E, + 0xA1, 0x09, 0x54, 0x20, 0x43, 0x19, 0xA1, 0x30, 0xEB, 0x59, 0xF7, 0x6A, + 0xCA, 0x24, 0x3D, 0xAD, 0x1B, 0xD4, 0x58, 0x46, 0x32, 0x68, 0x84, 0x0C, + 0x4C, 0xE4, 0x40, 0x15, 0xB8, 0xDC, 0x08, 0x3E, 0xB8, 0x81, 0x0B, 0x51, + 0x60, 0x02, 0xA0, 0xB3, 0xA8, 0xE6, 0x3A, 0xAA, 0xA9, 0x8D, 0x6F, 0xA4, + 0xCD, 0x52, 0x78, 0xF9, 0x86, 0x34, 0xA9, 0x21, 0x96, 0x5A, 0x88, 0x62, + 0x07, 0x41, 0xF0, 0x07, 0x58, 0xEE, 0x04, 0x0B, 0x66, 0x70, 0x30, 0x9D, + 0x40, 0xC0, 0x44, 0x2C, 0x54, 0x81, 0x0A, 0x65, 0x50, 0x73, 0x1D, 0xEB, + 0xC8, 0x06, 0x35, 0xEB, 0x69, 0x43, 0x6A, 0x4E, 0xC3, 0x9A, 0xD9, 0xF8, + 0xC6, 0x2F, 0x9A, 0x24, 0xB7, 0x52, 0xB8, 0x62, 0x37, 0x3B, 0x88, 0x00, + 0x62, 0x6E, 0xD0, 0x84, 0x5A, 0xC0, 0x48, 0x07, 0x1D, 0xE8, 0x40, 0x0A, + 0x52, 0xE0, 0x00, 0x09, 0x34, 0xF4, 0x13, 0x13, 0x30, 0x80, 0x03, 0x16, + 0x30, 0x08, 0x66, 0x11, 0x42, 0x10, 0x67, 0x38, 0xC4, 0x19, 0x58, 0x60, + 0x06, 0xF4, 0x64, 0x6E, 0x05, 0x6D, 0x10, 0x84, 0x18, 0xCE, 0xE0, 0xB8, + 0x33, 0x3C, 0x2E, 0x8C, 0x24, 0x90, 0x01, 0xE7, 0xCC, 0xFE, 0xC3, 0x02, + 0x35, 0x94, 0x81, 0x05, 0xDC, 0x39, 0x5D, 0x4C, 0x59, 0x17, 0xBB, 0x41, + 0x10, 0x42, 0x0F, 0x79, 0xA8, 0x43, 0x1E, 0xF0, 0x50, 0x88, 0xD7, 0xED, + 0x51, 0x11, 0x7B, 0x60, 0x03, 0x07, 0xFE, 0x40, 0x90, 0x41, 0x21, 0xD2, + 0x78, 0x4E, 0x60, 0xA4, 0xBA, 0x12, 0x0C, 0x05, 0xA5, 0x2E, 0x01, 0x02, + 0xAA, 0x60, 0x18, 0x55, 0x43, 0x36, 0x55, 0x51, 0x60, 0xB5, 0x43, 0xBA, + 0xA8, 0x05, 0x88, 0xBC, 0x87, 0xA3, 0x39, 0xC8, 0x02, 0x15, 0xDA, 0x50, + 0x18, 0x5F, 0x3B, 0x92, 0x4A, 0x99, 0xB0, 0x55, 0x16, 0xCA, 0x08, 0x1F, + 0x2A, 0xE6, 0x10, 0x0A, 0x22, 0xE8, 0x28, 0x47, 0xCA, 0x60, 0x46, 0x28, + 0x5E, 0x31, 0xE2, 0x1A, 0x43, 0x0F, 0x1F, 0xAA, 0x80, 0x0D, 0xCA, 0xFC, + 0xD1, 0x25, 0x3C, 0x61, 0x02, 0x08, 0xCF, 0x9B, 0xF0, 0x3E, 0xF0, 0x41, + 0x8E, 0x6F, 0xD4, 0x62, 0x14, 0x44, 0x00, 0x05, 0x03, 0x69, 0x5B, 0xCD, + 0xDC, 0xEE, 0xEC, 0xC9, 0xD2, 0x0C, 0x66, 0x2B, 0x82, 0xB0, 0x04, 0xD1, + 0x02, 0xB3, 0x49, 0xD3, 0x68, 0x45, 0x0E, 0x40, 0x0B, 0x13, 0x55, 0x7C, + 0x42, 0x16, 0xB3, 0x58, 0x86, 0x32, 0x96, 0xEC, 0xC0, 0x69, 0x46, 0x63, + 0x9A, 0xD5, 0xB4, 0x93, 0x57, 0x68, 0x51, 0x0B, 0x55, 0x00, 0xF1, 0xB7, + 0xAA, 0x20, 0x42, 0x70, 0x6F, 0x80, 0x03, 0x21, 0x88, 0xC2, 0x1B, 0x42, + 0xF2, 0x46, 0x13, 0xF6, 0x26, 0x86, 0x11, 0x10, 0x00, 0x13, 0x93, 0xD5, + 0x81, 0x01, 0x26, 0x90, 0x00, 0x16, 0xB8, 0x51, 0x10, 0x88, 0x16, 0x44, + 0x1D, 0xDA, 0x10, 0x86, 0x17, 0x5C, 0x0E, 0x72, 0xA6, 0x3B, 0x83, 0x15, + 0x5F, 0xB0, 0x5D, 0xF6, 0x8C, 0x61, 0x8C, 0x61, 0x0C, 0x83, 0x0C, 0xC4, + 0x30, 0x88, 0x4B, 0x94, 0xE1, 0x12, 0x6E, 0x78, 0x0E, 0x1E, 0x08, 0x41, + 0xFE, 0x1F, 0x9B, 0xE6, 0xA1, 0x8E, 0xDD, 0x41, 0x74, 0x21, 0xF6, 0xE0, + 0x86, 0x3C, 0xD8, 0xC1, 0x0D, 0x6B, 0x18, 0x01, 0x1B, 0x2A, 0x01, 0x08, + 0x05, 0x4C, 0xE0, 0x08, 0x17, 0xA0, 0x41, 0x52, 0x13, 0xCC, 0xE0, 0x5E, + 0x2B, 0xD5, 0x02, 0x38, 0x20, 0x87, 0x2E, 0xF3, 0xB1, 0x8F, 0x52, 0x60, + 0xF2, 0x7A, 0xD5, 0x48, 0x46, 0x2D, 0xBA, 0x9A, 0x4A, 0x1C, 0x81, 0x82, + 0x15, 0xB1, 0x08, 0x71, 0x29, 0x6D, 0xFC, 0x11, 0x7D, 0xB8, 0x42, 0x13, + 0xB2, 0x60, 0x65, 0x34, 0x42, 0x81, 0xED, 0x97, 0x2C, 0x65, 0x0E, 0xEE, + 0x1B, 0xC2, 0x29, 0x90, 0xB1, 0x8C, 0x50, 0xD0, 0x8F, 0xDA, 0xE8, 0x2E, + 0x92, 0x37, 0x5A, 0x31, 0xCF, 0x79, 0x72, 0x49, 0x2C, 0x44, 0x11, 0xAB, + 0x3D, 0x6E, 0x32, 0x55, 0x7C, 0xC0, 0x03, 0x17, 0xA9, 0xC1, 0x44, 0x2D, + 0xB4, 0xD1, 0x0D, 0xCA, 0x36, 0xF0, 0xB6, 0xD9, 0xA0, 0x46, 0x58, 0x6E, + 0x7B, 0x9B, 0x64, 0x40, 0x89, 0x08, 0xA1, 0x50, 0xC6, 0x68, 0xFF, 0x57, + 0x0B, 0x65, 0xC0, 0x22, 0x51, 0x2F, 0x84, 0x45, 0x07, 0xC3, 0x6C, 0x70, + 0x06, 0x4E, 0x53, 0x9A, 0x4C, 0x8E, 0xCD, 0x34, 0x68, 0x41, 0x8A, 0xB9, + 0xA5, 0x66, 0x07, 0x9E, 0xD8, 0x41, 0x05, 0xE6, 0x54, 0x98, 0x5A, 0xBC, + 0x23, 0x23, 0x79, 0x1E, 0x02, 0x09, 0xD2, 0x40, 0x00, 0x22, 0xAC, 0xA3, + 0x1B, 0x98, 0x08, 0x54, 0x02, 0x12, 0x50, 0x06, 0x44, 0x24, 0x1A, 0xD1, + 0x66, 0x38, 0x43, 0x19, 0x56, 0xFA, 0x02, 0x12, 0x9C, 0xA1, 0x0E, 0x65, + 0x60, 0x4E, 0x18, 0xDA, 0x90, 0x82, 0x13, 0xAC, 0xA0, 0x05, 0x32, 0x18, + 0xC1, 0x79, 0x57, 0xA0, 0x06, 0x42, 0x5C, 0x47, 0x10, 0x6D, 0x38, 0x1D, + 0x1E, 0x5C, 0x57, 0x88, 0x42, 0x9C, 0x8E, 0x3E, 0x70, 0xA8, 0x83, 0x1E, + 0xDE, 0x70, 0xEA, 0xFE, 0x3D, 0xD8, 0x21, 0x0F, 0x79, 0x48, 0x01, 0x1F, + 0x2A, 0x01, 0x89, 0x18, 0x4C, 0x00, 0x01, 0x08, 0x60, 0xD0, 0x12, 0xD6, + 0xBE, 0x76, 0x5E, 0x33, 0x18, 0x0A, 0x17, 0x80, 0x00, 0x8D, 0x75, 0x39, + 0xE4, 0x50, 0x40, 0x63, 0x5F, 0xBA, 0xC0, 0x9E, 0x0F, 0xA1, 0xE1, 0x8A, + 0x51, 0x9C, 0xA2, 0x60, 0x30, 0x71, 0xAB, 0x27, 0x9E, 0x97, 0xEE, 0x7D, + 0xA0, 0x42, 0x95, 0x3F, 0x69, 0xE5, 0xF7, 0x74, 0xF4, 0xED, 0x4F, 0x78, + 0x62, 0x08, 0xB2, 0x70, 0xEB, 0x27, 0xA6, 0x9D, 0xEE, 0xCA, 0xB3, 0x68, + 0x68, 0xEA, 0xD8, 0xC6, 0x3A, 0x24, 0x83, 0x8C, 0x1E, 0xB7, 0x82, 0x08, + 0x11, 0xA6, 0xCA, 0x54, 0xF7, 0xC1, 0x0D, 0x57, 0x60, 0x02, 0x13, 0xA8, + 0x80, 0x45, 0xE0, 0x64, 0x73, 0xC3, 0x6A, 0x3E, 0xF0, 0x81, 0x78, 0x4A, + 0x06, 0x2C, 0x9A, 0xE0, 0x89, 0xDB, 0xF6, 0x4C, 0x65, 0xA5, 0x8D, 0x05, + 0x0F, 0x82, 0x20, 0x04, 0xD4, 0xB7, 0x19, 0x16, 0x65, 0x51, 0xD9, 0x58, + 0x66, 0x51, 0x96, 0xB9, 0x08, 0x1F, 0x16, 0x22, 0x81, 0xD2, 0x29, 0xDA, + 0x52, 0x84, 0x44, 0xED, 0x00, 0x07, 0xD0, 0x2F, 0x82, 0x2B, 0xC0, 0x31, + 0x61, 0x8D, 0xA8, 0x23, 0x15, 0x36, 0x08, 0x82, 0x36, 0xB6, 0x21, 0x8B, + 0x08, 0x0C, 0xBA, 0x01, 0x1E, 0xB8, 0xAE, 0x20, 0xDE, 0x78, 0xAB, 0x34, + 0xB4, 0x61, 0x05, 0x97, 0x00, 0xA9, 0x18, 0xCC, 0x10, 0x06, 0x9D, 0x9A, + 0x1F, 0x74, 0x97, 0xE0, 0x40, 0x07, 0xC2, 0xA8, 0x82, 0x14, 0x88, 0x01, + 0x0D, 0x6A, 0x18, 0xC3, 0x4C, 0xB1, 0xBB, 0x3A, 0x52, 0xF7, 0x57, 0x10, + 0x79, 0x30, 0x08, 0xD8, 0x05, 0x07, 0xD1, 0x22, 0x09, 0x89, 0xB0, 0x06, + 0x7B, 0x70, 0x08, 0x6B, 0xE0, 0x06, 0x91, 0x40, 0x09, 0x7D, 0x30, 0x01, + 0x12, 0x40, 0x01, 0x08, 0x40, 0x03, 0xFE, 0x4F, 0xB0, 0x04, 0x4E, 0x90, + 0x54, 0x4A, 0xA5, 0x48, 0x8B, 0x04, 0x05, 0x0F, 0x06, 0x33, 0xBB, 0x94, + 0x0F, 0xF6, 0x60, 0x0B, 0xD0, 0x60, 0x0D, 0x17, 0xA4, 0x77, 0xAF, 0xC0, + 0x49, 0xA3, 0xD0, 0x0A, 0x3C, 0x02, 0x0A, 0xCC, 0x90, 0x22, 0xD2, 0x50, + 0x78, 0xFB, 0x60, 0x0B, 0x9E, 0x40, 0x6E, 0x13, 0x03, 0x0D, 0xD1, 0x10, + 0x0B, 0xEE, 0x13, 0x0A, 0xAB, 0x40, 0x04, 0x4A, 0x31, 0x07, 0xAC, 0xF0, + 0x14, 0xE6, 0x66, 0x79, 0x42, 0xA8, 0x15, 0x2A, 0xB3, 0x4D, 0x77, 0xA2, + 0x27, 0xB7, 0xA1, 0x0A, 0x4D, 0x30, 0x0B, 0x5A, 0x01, 0x0F, 0xAF, 0xE0, + 0x32, 0x45, 0xC0, 0x62, 0xAD, 0x10, 0x59, 0x4D, 0x56, 0x4F, 0xD4, 0xE0, + 0x40, 0x1C, 0x54, 0x04, 0xA3, 0xE0, 0x0F, 0xDC, 0xE0, 0x6E, 0x5D, 0x22, + 0x7B, 0x37, 0xB0, 0x03, 0x31, 0x54, 0x33, 0x35, 0xD3, 0x24, 0x28, 0x86, + 0x84, 0x67, 0xA3, 0x0C, 0x95, 0xE1, 0x0F, 0xD0, 0x00, 0x0D, 0xB1, 0xE0, + 0x3D, 0x01, 0x35, 0x38, 0xD0, 0x97, 0x03, 0x82, 0xA1, 0x0A, 0xB8, 0xD0, + 0x0F, 0x57, 0x21, 0x0A, 0x3A, 0x00, 0x70, 0x7C, 0x32, 0x01, 0x0D, 0xA0, + 0x00, 0x61, 0x10, 0x09, 0xD5, 0xA2, 0x07, 0x70, 0x90, 0x7F, 0x7A, 0xC0, + 0x46, 0x7A, 0x20, 0x06, 0xD8, 0x01, 0x5E, 0x94, 0x33, 0x06, 0x62, 0xE0, + 0x02, 0x1C, 0xB5, 0x51, 0xC7, 0xA2, 0x88, 0x2D, 0x30, 0x06, 0x2F, 0x90, + 0x07, 0x36, 0xD5, 0x7E, 0xB0, 0x53, 0x5F, 0x60, 0xF7, 0x46, 0x6D, 0x40, + 0x08, 0x91, 0x20, 0x09, 0x92, 0xA0, 0x07, 0x67, 0x80, 0x07, 0x76, 0xA0, + 0x06, 0x02, 0x92, 0x08, 0x1C, 0xD0, 0x00, 0x18, 0x40, 0x3C, 0xBB, 0xC6, + 0x76, 0x16, 0x78, 0x3C, 0xC7, 0xF3, 0x04, 0x22, 0x20, 0x04, 0x27, 0x77, + 0x56, 0xF8, 0x30, 0x0A, 0xD3, 0xB0, 0x2F, 0xD8, 0xF3, 0xFE, 0x0B, 0xBA, + 0xF0, 0x5B, 0xB0, 0x00, 0x44, 0x4C, 0xE1, 0x13, 0x3F, 0x81, 0x09, 0x94, + 0x87, 0x6E, 0x9E, 0x00, 0x0A, 0x32, 0xA1, 0x0C, 0xAB, 0x04, 0x14, 0xEE, + 0x53, 0x22, 0x43, 0xE0, 0x09, 0xE0, 0xB6, 0x0A, 0x32, 0x61, 0x4B, 0x43, + 0x78, 0x8D, 0x54, 0x81, 0x0F, 0x92, 0x12, 0x1B, 0xDA, 0x30, 0x66, 0x2A, + 0xD3, 0x4D, 0x9E, 0x90, 0x0D, 0x59, 0xE1, 0x22, 0xF8, 0xB0, 0x4F, 0x47, + 0x56, 0x04, 0x45, 0x00, 0x50, 0x26, 0xA2, 0x0A, 0xB1, 0x00, 0x0B, 0x38, + 0x53, 0x16, 0xAA, 0xF0, 0x32, 0xBF, 0x00, 0x34, 0xD3, 0x00, 0x7C, 0x5D, + 0xA2, 0x03, 0x83, 0x83, 0x09, 0x6E, 0x56, 0x36, 0x1C, 0x84, 0x33, 0x06, + 0x97, 0x0D, 0xDA, 0x60, 0x70, 0xB2, 0x17, 0x0A, 0xA9, 0x81, 0x4E, 0x10, + 0xD0, 0x27, 0x37, 0x10, 0x04, 0xA3, 0xE0, 0x0A, 0xD5, 0x80, 0x0D, 0xE0, + 0xF0, 0x0E, 0x19, 0x52, 0x15, 0xA8, 0x84, 0x03, 0xB2, 0x00, 0x5B, 0xA0, + 0x90, 0x35, 0x05, 0xC0, 0x00, 0x0B, 0xC0, 0x80, 0x88, 0xE6, 0x3A, 0x20, + 0x75, 0x38, 0x88, 0x80, 0x07, 0x63, 0xF0, 0x91, 0x65, 0x90, 0x06, 0xD5, + 0x51, 0x2B, 0x75, 0x90, 0x1E, 0x61, 0x40, 0x02, 0x65, 0x80, 0x07, 0x2D, + 0xD0, 0x02, 0xE4, 0x25, 0x08, 0x7B, 0xA0, 0x06, 0x0C, 0x08, 0x3B, 0x6F, + 0xA4, 0x07, 0x82, 0x60, 0x09, 0x78, 0x30, 0x6A, 0xF8, 0x71, 0x08, 0x78, + 0x40, 0x51, 0x7A, 0xB0, 0x07, 0x78, 0x84, 0x02, 0x06, 0x60, 0x01, 0xAE, + 0xB8, 0x04, 0xBA, 0xC6, 0x76, 0xE9, 0x92, 0x09, 0xB2, 0x88, 0x01, 0x39, + 0x50, 0x25, 0x7B, 0x25, 0x0F, 0xA1, 0x30, 0x0D, 0x9A, 0x94, 0x0C, 0xBA, + 0x00, 0x0D, 0x1A, 0xF6, 0x0A, 0xA2, 0xF0, 0x09, 0x4C, 0x01, 0x13, 0xCB, + 0xA0, 0x0D, 0x73, 0x70, 0x0D, 0x96, 0x67, 0x05, 0xA0, 0xA0, 0x7A, 0xCA, + 0xFE, 0x10, 0x79, 0xCB, 0x10, 0x0B, 0x49, 0x51, 0x30, 0x73, 0xB0, 0x0A, + 0x73, 0x60, 0x22, 0xAC, 0x20, 0x22, 0x2F, 0x48, 0x6D, 0x89, 0x85, 0x8D, + 0x56, 0xE1, 0x0D, 0xA2, 0x00, 0x90, 0xAF, 0x21, 0x4D, 0x63, 0x01, 0x25, + 0x5B, 0x79, 0x8B, 0x44, 0xD2, 0x0F, 0xB4, 0x80, 0x0B, 0xA3, 0x20, 0x04, + 0x86, 0xB1, 0x03, 0xA0, 0x95, 0x03, 0xE8, 0x84, 0x03, 0x3A, 0x30, 0x03, + 0x4D, 0x50, 0x3D, 0x5D, 0xE8, 0x0F, 0xAE, 0xA0, 0x32, 0xAE, 0xB0, 0x42, + 0x9F, 0x11, 0x04, 0x41, 0xA0, 0x98, 0x8A, 0x61, 0x58, 0x3C, 0xD2, 0x16, + 0x8D, 0x89, 0x19, 0x7D, 0x52, 0x01, 0x38, 0x10, 0x04, 0xC6, 0x55, 0x0D, + 0xE4, 0x40, 0x0E, 0xDE, 0xD0, 0x0F, 0xEF, 0xC0, 0x0F, 0x17, 0x82, 0x0B, + 0x15, 0x10, 0x0A, 0xEA, 0x20, 0x16, 0x23, 0xF7, 0x00, 0x04, 0xC0, 0x00, + 0x0A, 0xC0, 0x80, 0x38, 0xB9, 0x1F, 0x92, 0x76, 0x5F, 0x61, 0xE0, 0x06, + 0xE4, 0x55, 0x06, 0x8F, 0xA8, 0x06, 0x2E, 0x10, 0x06, 0x75, 0xE0, 0x06, + 0x47, 0x87, 0x02, 0x6E, 0x80, 0x07, 0x61, 0x50, 0x06, 0x6A, 0xA0, 0x53, + 0xB6, 0x52, 0x07, 0xB0, 0x93, 0x80, 0xA7, 0x23, 0x08, 0xD5, 0xC5, 0x5F, + 0x92, 0x10, 0x09, 0xCC, 0x82, 0x5F, 0x3F, 0x89, 0x08, 0x6E, 0x30, 0x01, + 0x10, 0x70, 0x00, 0x18, 0xA0, 0x6B, 0x34, 0x90, 0x6B, 0x16, 0xA8, 0x6B, + 0xF1, 0xA2, 0x2E, 0x16, 0x90, 0x03, 0xC7, 0xB8, 0x4B, 0xFC, 0xA0, 0x8B, + 0xBC, 0xA8, 0x0B, 0xD2, 0xD0, 0x55, 0xB5, 0x70, 0x64, 0x7F, 0xF7, 0x77, + 0x64, 0x95, 0x30, 0x62, 0x59, 0x79, 0x9E, 0xE0, 0x13, 0x4F, 0x31, 0x31, + 0x69, 0x19, 0x0A, 0xEE, 0x03, 0x0A, 0xBD, 0xC1, 0x95, 0x5F, 0xB6, 0x0C, + 0x44, 0x70, 0x6E, 0x23, 0x16, 0x91, 0xD5, 0x67, 0x97, 0xBC, 0x04, 0x0B, + 0x9B, 0xA7, 0x0D, 0xFE, 0xEB, 0x30, 0x0D, 0x1B, 0xF4, 0x25, 0xB0, 0x10, + 0x0A, 0xAE, 0xB0, 0xA0, 0x12, 0xA9, 0x11, 0xF0, 0x00, 0x0E, 0x6C, 0x23, + 0x0D, 0xB5, 0x40, 0x0A, 0x42, 0x90, 0x03, 0x15, 0x60, 0x01, 0x15, 0x40, + 0x9A, 0x4F, 0x63, 0x17, 0xEE, 0xC8, 0x41, 0x11, 0xD0, 0x27, 0x11, 0x30, + 0x9B, 0x70, 0x82, 0x35, 0x06, 0x30, 0x28, 0xAC, 0xF2, 0x28, 0x0A, 0x64, + 0x0D, 0xFD, 0xD0, 0x0E, 0xEF, 0x00, 0x91, 0xF0, 0x00, 0x0F, 0x37, 0xFA, + 0x0E, 0x18, 0x3A, 0x15, 0xDC, 0x70, 0x03, 0xA1, 0xB0, 0x0E, 0x13, 0x43, + 0x04, 0x12, 0x80, 0x00, 0x04, 0xA0, 0x00, 0x1E, 0xA0, 0x00, 0x6A, 0x50, + 0x08, 0x70, 0x30, 0x7E, 0x78, 0x80, 0x06, 0x6E, 0xE0, 0x93, 0x3F, 0x17, + 0x06, 0x23, 0x39, 0x3A, 0x8C, 0x36, 0x06, 0x75, 0x90, 0x51, 0x24, 0xF0, + 0x02, 0x75, 0x80, 0x07, 0x47, 0xA7, 0x06, 0xA7, 0xB8, 0x2B, 0xCE, 0x61, + 0x53, 0xCF, 0x71, 0x93, 0x3B, 0xD9, 0x1D, 0xEE, 0x85, 0x53, 0x96, 0x40, + 0x45, 0x83, 0xC0, 0x00, 0xDF, 0x89, 0x01, 0x17, 0x30, 0xA7, 0x49, 0xB9, + 0x76, 0xE6, 0xA9, 0x48, 0xE7, 0xE2, 0x0F, 0x0C, 0xC3, 0x57, 0xED, 0xF9, + 0x1A, 0xFE, 0xF2, 0x0B, 0xD0, 0x90, 0x0C, 0xDB, 0x23, 0x22, 0x65, 0x13, + 0x4A, 0xA8, 0xD0, 0x4A, 0x9E, 0x90, 0x9F, 0xD4, 0xA6, 0x13, 0xC9, 0x18, + 0x79, 0xCC, 0xB0, 0x0C, 0x4F, 0x71, 0x23, 0xA0, 0x00, 0x6E, 0x43, 0x90, + 0x64, 0x70, 0x39, 0x13, 0x03, 0x54, 0x97, 0x0C, 0xBA, 0xA9, 0x17, 0xA1, + 0x0A, 0x60, 0x82, 0x32, 0x0E, 0xE4, 0x0F, 0xCC, 0x20, 0xAA, 0x1D, 0x94, + 0x0C, 0xA6, 0xC4, 0x0F, 0xEF, 0xF0, 0x0A, 0x2F, 0x23, 0x42, 0x92, 0xC1, + 0x66, 0xB2, 0x90, 0x03, 0x84, 0xD2, 0xA2, 0x28, 0x44, 0x28, 0x79, 0x53, + 0x01, 0x0F, 0x20, 0x0A, 0xB8, 0x90, 0xFE, 0x0E, 0x42, 0x86, 0x0F, 0xBC, + 0x6A, 0x2F, 0xEF, 0xF0, 0x32, 0x11, 0x8A, 0x0C, 0xAD, 0xE0, 0x7D, 0x04, + 0x00, 0x00, 0x13, 0xA0, 0x00, 0x09, 0x40, 0x80, 0x6F, 0x04, 0x07, 0x51, + 0x07, 0x8A, 0x78, 0xD0, 0x06, 0x63, 0x60, 0x06, 0xCA, 0x39, 0x06, 0x6D, + 0x70, 0x52, 0x5B, 0x3A, 0x06, 0x2B, 0x60, 0x06, 0x7A, 0xD0, 0x06, 0x65, + 0x40, 0x5E, 0x6D, 0x90, 0x07, 0x34, 0x49, 0x08, 0x83, 0x90, 0x47, 0xD5, + 0x65, 0x5F, 0xCC, 0xD2, 0x06, 0xC5, 0xF9, 0x46, 0x31, 0x65, 0x09, 0xE2, + 0x3A, 0x02, 0xE0, 0xF9, 0x9D, 0x6A, 0x97, 0x94, 0xB9, 0x96, 0x60, 0x49, + 0x75, 0x01, 0x3A, 0x50, 0x0B, 0x11, 0xC9, 0x57, 0xF2, 0x70, 0x0A, 0xD9, + 0x70, 0x3D, 0xF1, 0x09, 0x22, 0xDD, 0xF3, 0x55, 0x3A, 0xF8, 0x6C, 0xAC, + 0x44, 0x04, 0x50, 0x49, 0x97, 0xFA, 0x30, 0x0A, 0x27, 0x02, 0x14, 0x31, + 0x76, 0x83, 0x4C, 0x01, 0x0A, 0xD2, 0xD8, 0x83, 0xE0, 0x83, 0x0C, 0xA8, + 0x50, 0x4A, 0x3F, 0xCA, 0xA9, 0x85, 0x87, 0x0A, 0x93, 0x32, 0x59, 0xEB, + 0x20, 0x16, 0x5F, 0xE2, 0x0F, 0x65, 0xC3, 0x0D, 0xF5, 0x23, 0x24, 0xF9, + 0xF0, 0x0E, 0xB4, 0x57, 0x0B, 0xD9, 0x50, 0x17, 0x70, 0x01, 0x7C, 0x3B, + 0x00, 0x01, 0x15, 0x00, 0x04, 0x53, 0x52, 0x04, 0x39, 0x80, 0x03, 0x39, + 0x20, 0x04, 0x7C, 0xF2, 0x3C, 0xF9, 0x7A, 0xB1, 0x44, 0x82, 0x0F, 0x44, + 0x50, 0x04, 0xDD, 0x30, 0x0D, 0xC4, 0x97, 0x03, 0x80, 0x02, 0x00, 0x05, + 0xA0, 0x00, 0x0A, 0xC0, 0x00, 0xA0, 0x88, 0x93, 0xC9, 0x89, 0x07, 0x83, + 0x60, 0x3A, 0x78, 0x40, 0x5E, 0x62, 0x70, 0x09, 0x2E, 0x99, 0x02, 0x52, + 0xFB, 0x69, 0x92, 0x76, 0x08, 0xFB, 0x15, 0x75, 0xD4, 0x21, 0x08, 0x89, + 0x30, 0x08, 0x5F, 0xFA, 0x93, 0x6D, 0x60, 0x06, 0x6D, 0xFE, 0x50, 0x08, + 0x7A, 0xE0, 0x06, 0xAB, 0xA3, 0x07, 0xCD, 0xB9, 0x93, 0x27, 0x30, 0x01, + 0x07, 0x70, 0x54, 0x17, 0x80, 0x94, 0x48, 0x49, 0x03, 0x81, 0xE0, 0x76, + 0x16, 0x90, 0x01, 0xFE, 0xA0, 0xB3, 0xE5, 0x03, 0x0F, 0xA1, 0xE0, 0xA7, + 0xD4, 0x60, 0x95, 0xB4, 0x70, 0x82, 0xAE, 0x00, 0xB1, 0x5C, 0xB9, 0x0A, + 0x6E, 0x15, 0x0D, 0x73, 0x80, 0x87, 0x95, 0xA7, 0xB0, 0x6E, 0x15, 0x63, + 0xCA, 0xE0, 0xB0, 0x00, 0x3A, 0x07, 0x75, 0xA3, 0x09, 0x4C, 0x71, 0x30, + 0x9F, 0xA0, 0x57, 0x18, 0xCB, 0x11, 0x78, 0x7B, 0x3F, 0xDD, 0x30, 0x0A, + 0xFE, 0xA6, 0x0D, 0xFE, 0xE0, 0x8D, 0x1C, 0xA4, 0x0A, 0xF5, 0x60, 0x4A, + 0xFB, 0x00, 0x0F, 0x26, 0xEB, 0x09, 0xBE, 0x04, 0x58, 0x65, 0x01, 0x0B, + 0xD9, 0x30, 0x07, 0x82, 0x02, 0x04, 0x45, 0x30, 0x04, 0x04, 0x49, 0x04, + 0x8E, 0xE2, 0xB2, 0xB5, 0x20, 0x0F, 0x99, 0x6B, 0x24, 0x9E, 0x10, 0x04, + 0x28, 0xA3, 0x0C, 0xB1, 0x70, 0x4E, 0x7F, 0x52, 0xAC, 0x0A, 0xE0, 0x00, + 0x32, 0x60, 0x1F, 0x64, 0x9B, 0x07, 0xDD, 0x71, 0x06, 0x74, 0xD4, 0x06, + 0xEF, 0xD1, 0xA4, 0x2D, 0xE0, 0x51, 0x6E, 0xB0, 0x2B, 0x8B, 0x06, 0x94, + 0x41, 0x67, 0x06, 0x2E, 0xA0, 0x06, 0x72, 0x44, 0x93, 0x6E, 0x50, 0x07, + 0x5F, 0x8A, 0x3A, 0xB1, 0xC2, 0x2C, 0x97, 0xA0, 0x2C, 0x84, 0xF0, 0x02, + 0xE0, 0x89, 0x48, 0xC5, 0x83, 0x94, 0x73, 0xFA, 0x04, 0x4C, 0x79, 0x3C, + 0x34, 0x60, 0x01, 0x2B, 0x92, 0xBB, 0x21, 0x03, 0x0F, 0x9F, 0xE0, 0xA7, + 0x28, 0x01, 0x0D, 0xAF, 0xF0, 0x0A, 0xB4, 0x10, 0x25, 0x04, 0x03, 0x0A, + 0xB2, 0xF0, 0x83, 0xD1, 0xD0, 0x04, 0x88, 0x9B, 0x6E, 0x9E, 0x90, 0x0A, + 0x85, 0xEB, 0x9F, 0xB1, 0x30, 0x04, 0x9A, 0x00, 0xB1, 0x90, 0xFB, 0x0F, + 0xFE, 0x4C, 0xC1, 0x0C, 0xAD, 0x10, 0x0A, 0xEB, 0x79, 0xB9, 0xD8, 0x08, + 0xB2, 0xB1, 0x35, 0x59, 0x63, 0x56, 0x0B, 0xA3, 0x1A, 0x0B, 0x91, 0xC2, + 0x9A, 0xB9, 0x04, 0x0F, 0x9E, 0xA0, 0x0A, 0xE1, 0xB4, 0x17, 0xF9, 0x0B, + 0x0B, 0xD0, 0x40, 0x04, 0x00, 0xF0, 0x00, 0xA8, 0xC1, 0x1A, 0x35, 0x82, + 0x09, 0x37, 0x80, 0x00, 0x37, 0x60, 0xB1, 0xBA, 0x34, 0x0A, 0x3B, 0xD0, + 0x40, 0x5D, 0x72, 0x0A, 0x9F, 0x80, 0x19, 0x11, 0x40, 0x00, 0x02, 0x30, + 0x00, 0x0E, 0x80, 0x02, 0x53, 0xD7, 0x1D, 0x85, 0x80, 0xAE, 0x7A, 0x40, + 0xB6, 0x6D, 0x80, 0x06, 0xA7, 0x73, 0x06, 0x2A, 0xA0, 0x1D, 0xD0, 0x5A, + 0x07, 0x41, 0xDC, 0x2C, 0x97, 0x60, 0x06, 0xA3, 0xE3, 0x02, 0xC9, 0xD9, + 0x2C, 0x82, 0xB0, 0x93, 0xA6, 0x53, 0x07, 0x66, 0x90, 0x9C, 0x6B, 0xA4, + 0x06, 0x87, 0xC8, 0xB6, 0xE6, 0x9B, 0x6B, 0x34, 0x30, 0x9E, 0x16, 0xB8, + 0xBE, 0x99, 0xD0, 0xBE, 0x4D, 0x00, 0x98, 0x7C, 0x45, 0x6C, 0x05, 0xB4, + 0x2F, 0xD9, 0x00, 0x0D, 0x5B, 0xC5, 0x77, 0xAE, 0x50, 0x0A, 0x2F, 0x01, + 0x3F, 0xFD, 0xFB, 0x13, 0x44, 0x10, 0xC0, 0x36, 0xA6, 0x13, 0xA3, 0xB0, + 0x3E, 0x32, 0x11, 0x0B, 0xCC, 0xC0, 0x0C, 0xB1, 0xF0, 0x0F, 0x8E, 0xD7, + 0x1B, 0x00, 0x8A, 0x14, 0xCC, 0x20, 0x0B, 0x45, 0x20, 0x0D, 0x9A, 0x2A, + 0xC1, 0x42, 0x38, 0x55, 0xAA, 0x30, 0x0B, 0x15, 0x1C, 0xAA, 0xA2, 0x2A, + 0x16, 0xA1, 0xA0, 0x0A, 0x3A, 0x01, 0xBF, 0x2C, 0xC2, 0x0D, 0x1F, 0xEC, + 0x0F, 0xDA, 0x94, 0x0D, 0xCA, 0xF6, 0x24, 0x39, 0x40, 0x00, 0x06, 0x20, + 0x5C, 0x62, 0x18, 0x50, 0x04, 0x65, 0x00, 0xEA, 0x49, 0x0E, 0x1C, 0x6C, + 0x4A, 0xB4, 0xA0, 0x03, 0x5F, 0xC9, 0x63, 0xBC, 0x91, 0x03, 0x38, 0x3C, + 0x01, 0x03, 0xE0, 0xFE, 0x37, 0x62, 0x20, 0x08, 0x84, 0x30, 0x53, 0xCD, + 0x72, 0x08, 0x64, 0x2B, 0x2C, 0xDD, 0x61, 0x07, 0x61, 0xC4, 0x9C, 0x6E, + 0xD0, 0x92, 0xB3, 0x93, 0x7F, 0x68, 0x00, 0x07, 0x25, 0x89, 0x02, 0x98, + 0x83, 0x06, 0xCC, 0x71, 0x1D, 0x68, 0xF0, 0xCC, 0xB2, 0x42, 0x5F, 0x2C, + 0xC0, 0xB6, 0xB9, 0x16, 0xAF, 0x61, 0xBC, 0x94, 0x4A, 0x95, 0x09, 0x4F, + 0x80, 0x01, 0x98, 0x80, 0xC6, 0x35, 0xD6, 0x0F, 0xA3, 0x30, 0x4F, 0xDA, + 0xB0, 0x55, 0x28, 0x81, 0x7C, 0xA3, 0xF0, 0x09, 0xB6, 0xC0, 0x95, 0xB1, + 0xC0, 0x0A, 0x36, 0x48, 0x04, 0xC2, 0x96, 0xB8, 0x60, 0x15, 0x97, 0x28, + 0x02, 0x0D, 0x6E, 0x19, 0x8D, 0x96, 0x4A, 0x07, 0xB1, 0x14, 0x13, 0x3A, + 0x50, 0x4A, 0x8B, 0xCC, 0xC8, 0x95, 0x67, 0x0F, 0xA2, 0x10, 0x38, 0x0D, + 0xD4, 0x0D, 0x31, 0x06, 0x37, 0xB3, 0x00, 0x40, 0xB5, 0x30, 0x55, 0xB9, + 0xA4, 0x67, 0xA5, 0x20, 0x5A, 0xDE, 0x90, 0x0D, 0xB4, 0x20, 0x16, 0xB0, + 0x70, 0x03, 0x83, 0x96, 0x37, 0x2B, 0x3A, 0x28, 0x98, 0xF9, 0x00, 0x9E, + 0xE0, 0x0A, 0xE4, 0x80, 0xC9, 0x2D, 0xA2, 0x0F, 0xDF, 0x80, 0x03, 0xAB, + 0xB0, 0x0E, 0xAE, 0x15, 0x0B, 0x1E, 0x04, 0x04, 0x15, 0xF0, 0x27, 0xE0, + 0xD7, 0x00, 0x0E, 0x80, 0x06, 0xA4, 0x16, 0x3B, 0xAF, 0xE3, 0x3A, 0xC2, + 0xA2, 0x06, 0x7B, 0x60, 0x5E, 0xA0, 0xC6, 0x1C, 0xCC, 0x71, 0x06, 0x3A, + 0x5D, 0x5E, 0xCD, 0x99, 0xB6, 0x85, 0xA8, 0x06, 0xCF, 0xBC, 0x3A, 0xA9, + 0x83, 0x51, 0x68, 0x20, 0x03, 0xE0, 0x79, 0x00, 0xE3, 0x19, 0xC6, 0x73, + 0xBA, 0x6B, 0xE7, 0x59, 0xC6, 0x16, 0x80, 0x09, 0x0A, 0x8D, 0x6E, 0xDC, + 0x20, 0x0A, 0x3F, 0xAB, 0x4F, 0xD2, 0x00, 0x0D, 0xB4, 0xC0, 0x6C, 0xB1, + 0x74, 0x23, 0xE2, 0xD3, 0x4A, 0x06, 0xFE, 0x6B, 0x79, 0x9F, 0x10, 0x3E, + 0x04, 0xAC, 0x0C, 0xC8, 0x90, 0x6D, 0xD2, 0xB8, 0x0A, 0x74, 0xF0, 0x0F, + 0x87, 0xE7, 0x09, 0xD0, 0xC6, 0x0A, 0x46, 0x40, 0x78, 0xFE, 0x7C, 0x8D, + 0xD9, 0x00, 0x68, 0xFE, 0xE6, 0x3F, 0xA6, 0x65, 0xD2, 0x08, 0x6A, 0x3F, + 0xDC, 0x50, 0x04, 0xAA, 0xC0, 0xC9, 0x80, 0x45, 0x0B, 0xB2, 0x67, 0x19, + 0x04, 0x00, 0x01, 0x8A, 0xE1, 0x09, 0xB0, 0x9A, 0x03, 0xA2, 0x00, 0x1A, + 0x3B, 0x40, 0x0A, 0xF0, 0xB0, 0x4B, 0xE0, 0xA0, 0x03, 0x54, 0xED, 0x5A, + 0xCC, 0x60, 0x58, 0x39, 0x30, 0x04, 0x36, 0xF0, 0x00, 0x06, 0x60, 0x02, + 0x3F, 0x30, 0x01, 0x0B, 0x70, 0x06, 0x29, 0xC0, 0x3A, 0xE2, 0xEA, 0x3A, + 0x83, 0xB0, 0x06, 0xD4, 0x0A, 0xC5, 0x63, 0xB0, 0x06, 0xCF, 0x2A, 0x06, + 0x89, 0xA8, 0xAD, 0x7A, 0xC0, 0xBD, 0xB9, 0x89, 0x7F, 0xA5, 0xC8, 0x2C, + 0xF6, 0x71, 0x5F, 0x68, 0x90, 0x06, 0xDB, 0x81, 0x01, 0xAD, 0x08, 0xC6, + 0x50, 0x65, 0x9E, 0x4C, 0xA9, 0xBE, 0x99, 0x70, 0x01, 0xDC, 0xBC, 0xCA, + 0x79, 0xAC, 0x0F, 0xD6, 0x40, 0xD5, 0xD5, 0xA0, 0x55, 0xD2, 0xE0, 0x8B, + 0xB3, 0xF0, 0x8B, 0x44, 0x60, 0x0B, 0xAC, 0x00, 0x0A, 0xAB, 0x20, 0x31, + 0x44, 0xD0, 0xD8, 0x22, 0x93, 0xBB, 0x7A, 0x6C, 0x31, 0x06, 0x83, 0x30, + 0x91, 0xF7, 0x09, 0x2C, 0xF6, 0x09, 0x46, 0x70, 0x23, 0x9E, 0x70, 0x0A, + 0xB2, 0x30, 0x04, 0x46, 0x60, 0x0D, 0x71, 0x7D, 0x8D, 0xFB, 0x90, 0x0C, + 0xAA, 0x30, 0x59, 0xF5, 0x34, 0xC9, 0xD3, 0x50, 0x0B, 0x04, 0x79, 0xB0, + 0xA6, 0x74, 0x0D, 0x45, 0x50, 0x0A, 0x5F, 0x21, 0x1B, 0x62, 0xD1, 0x0A, + 0xC8, 0x10, 0x36, 0x10, 0xF0, 0x00, 0x89, 0x41, 0x04, 0x37, 0x30, 0x72, + 0x10, 0x50, 0x5C, 0x78, 0x6C, 0x4A, 0xEF, 0x80, 0x03, 0xFE, 0x80, 0x16, + 0x0D, 0xDA, 0xD0, 0x4D, 0x73, 0xA0, 0x03, 0x43, 0x10, 0xCA, 0x01, 0x50, + 0x01, 0x86, 0x39, 0x01, 0x0E, 0xC0, 0x00, 0x23, 0x20, 0xB5, 0x89, 0xA6, + 0x3A, 0x39, 0x77, 0x06, 0x96, 0xC8, 0xBD, 0x75, 0xF0, 0x38, 0x62, 0x2B, + 0x09, 0xBD, 0x0C, 0x07, 0x65, 0x8B, 0x06, 0x82, 0xF0, 0xD3, 0xCB, 0x55, + 0x06, 0xCF, 0x6C, 0x3A, 0x62, 0xC0, 0xB6, 0x07, 0x30, 0xA7, 0x16, 0xC0, + 0x20, 0x34, 0xD0, 0x10, 0x17, 0xB8, 0x54, 0x17, 0x30, 0x01, 0xA4, 0xE0, + 0xD1, 0x22, 0x83, 0x4B, 0xD6, 0x70, 0x0A, 0x3F, 0x6B, 0x0D, 0x23, 0xE8, + 0xC6, 0x21, 0x52, 0x0A, 0x2C, 0x76, 0x31, 0xAC, 0xF0, 0xA8, 0x06, 0x4A, + 0xDD, 0xE9, 0x26, 0x0A, 0xA8, 0x10, 0x4A, 0xE1, 0x13, 0x4A, 0x60, 0x05, + 0x0A, 0x08, 0xC7, 0x62, 0xDC, 0xF6, 0x65, 0x46, 0x80, 0x03, 0xE6, 0x7D, + 0xDE, 0x43, 0x68, 0x33, 0xA0, 0xDA, 0x40, 0xCC, 0xB0, 0x40, 0x5F, 0x2E, + 0x56, 0x3A, 0xCE, 0x22, 0xD5, 0xD0, 0x04, 0xAE, 0xA0, 0x0D, 0xDA, 0xC4, + 0x59, 0x52, 0x93, 0x0C, 0xA1, 0x51, 0x0A, 0x45, 0x10, 0x04, 0x04, 0x75, + 0x03, 0x83, 0x43, 0x0A, 0xFD, 0x20, 0x3D, 0x63, 0x7E, 0x21, 0xF8, 0x20, + 0x86, 0x11, 0xFA, 0xDE, 0xB0, 0x50, 0x35, 0x40, 0x00, 0x04, 0x11, 0x10, + 0x00, 0x73, 0x38, 0x04, 0x0B, 0xA0, 0x00, 0xF2, 0x37, 0x02, 0x69, 0x70, + 0x38, 0x87, 0xB0, 0x07, 0x58, 0xDC, 0x02, 0x9D, 0x13, 0x52, 0xCF, 0x21, + 0x06, 0x09, 0xE8, 0x74, 0x8E, 0x88, 0x39, 0x69, 0xD0, 0x02, 0x68, 0xF0, + 0x38, 0x9A, 0x13, 0x06, 0xCF, 0x1C, 0x06, 0x50, 0xDC, 0xB6, 0xAE, 0x18, + 0xE3, 0x14, 0xA8, 0x2E, 0x48, 0x69, 0xE3, 0x18, 0x20, 0x0A, 0x51, 0x5D, + 0x79, 0xD5, 0x10, 0x0A, 0x01, 0x87, 0xDC, 0xF1, 0x29, 0x0B, 0xE2, 0xED, + 0xFE, 0x78, 0xAB, 0xF0, 0x6C, 0x28, 0xC6, 0x0C, 0x67, 0x5C, 0x79, 0xF8, + 0xA0, 0x5A, 0x2A, 0xC6, 0x0A, 0xA8, 0xA0, 0x82, 0x05, 0xD3, 0x4C, 0x2F, + 0x51, 0x30, 0x61, 0x6D, 0x04, 0x37, 0x60, 0x0D, 0x77, 0xAE, 0xE5, 0x20, + 0x83, 0x0F, 0xA2, 0x40, 0x59, 0xB0, 0x95, 0x32, 0x7F, 0xAC, 0x6C, 0x98, + 0x70, 0xA1, 0xB9, 0xC4, 0xE3, 0xA0, 0x47, 0x0D, 0x3D, 0x13, 0x16, 0xC4, + 0xA7, 0x0C, 0x15, 0x30, 0x0A, 0x1F, 0x01, 0x0E, 0xD5, 0xE0, 0x0D, 0xA6, + 0x6B, 0x63, 0x9F, 0x30, 0xC3, 0x34, 0xCC, 0x0C, 0xA8, 0x00, 0x04, 0x43, + 0x40, 0x07, 0x26, 0x10, 0x00, 0x45, 0x50, 0x0D, 0x38, 0x40, 0x03, 0x22, + 0xC0, 0x01, 0x09, 0x30, 0x02, 0x29, 0xD0, 0x01, 0x0A, 0x40, 0x02, 0x2E, + 0x70, 0x09, 0x62, 0xB0, 0x92, 0xB9, 0x92, 0x02, 0x2E, 0xD0, 0xDA, 0x66, + 0xF0, 0x92, 0xE6, 0xC1, 0x1E, 0x67, 0xA0, 0x07, 0xF8, 0x37, 0xCC, 0x69, + 0x50, 0x8A, 0xE4, 0x75, 0xE9, 0x2A, 0xC0, 0x01, 0x6D, 0x1B, 0xC6, 0xE7, + 0xB2, 0x04, 0x8B, 0xD4, 0x76, 0x8A, 0xB4, 0x04, 0x16, 0x80, 0xE3, 0xD8, + 0x68, 0x1A, 0xDB, 0x50, 0x0D, 0x57, 0x2D, 0x0D, 0xD9, 0xE3, 0xDC, 0xFB, + 0xC9, 0xDD, 0x75, 0xBC, 0x0C, 0x9E, 0xE0, 0xCD, 0x35, 0xB6, 0x0F, 0x30, + 0xF4, 0x6C, 0xEB, 0xD3, 0x14, 0xCF, 0x5D, 0x30, 0xD1, 0x58, 0x30, 0x72, + 0x85, 0x0A, 0x62, 0x23, 0xB2, 0xFD, 0x8C, 0xEC, 0x7C, 0xD5, 0x0D, 0xA8, + 0xC0, 0xDE, 0xFF, 0xA6, 0x32, 0x49, 0x88, 0x09, 0x77, 0x7B, 0xEC, 0x58, + 0x41, 0x0D, 0x4D, 0x40, 0x0A, 0xD6, 0x0E, 0x58, 0x2A, 0x23, 0x58, 0x11, + 0x50, 0x0A, 0x7B, 0xAA, 0x11, 0x35, 0x9F, 0x4B, 0xAA, 0x90, 0x03, 0x4B, + 0x76, 0x96, 0xBC, 0x01, 0x6E, 0x12, 0xC0, 0xEE, 0xFA, 0xD0, 0x0D, 0x39, + 0x20, 0x00, 0x24, 0xFE, 0x40, 0xCB, 0x2C, 0x20, 0x92, 0x32, 0x80, 0x50, + 0x08, 0x15, 0xEF, 0x23, 0x30, 0x02, 0x1D, 0x00, 0x02, 0x0C, 0xD0, 0x01, + 0x1C, 0x30, 0x02, 0x2B, 0xB0, 0xC5, 0x88, 0x06, 0x52, 0xDC, 0x91, 0x07, + 0x8A, 0x66, 0x39, 0x2F, 0x50, 0x02, 0x06, 0xA0, 0x00, 0x72, 0x2A, 0xEA, + 0xC6, 0xC3, 0x76, 0x8B, 0xF4, 0x04, 0x34, 0x10, 0x9E, 0xB3, 0x90, 0xEA, + 0x96, 0x27, 0x0D, 0xA2, 0xB0, 0x0D, 0x6D, 0x98, 0x77, 0xD5, 0x00, 0x0B, + 0xB6, 0xA0, 0x0B, 0x2E, 0x61, 0x0B, 0xB0, 0xB4, 0xB0, 0xC8, 0x30, 0x07, + 0xF9, 0x5A, 0x63, 0xB8, 0x94, 0xE7, 0x18, 0x4D, 0x8D, 0xA8, 0x00, 0x56, + 0xC9, 0x88, 0x23, 0x92, 0x9B, 0x23, 0x73, 0x30, 0x04, 0x47, 0x60, 0x0B, + 0x36, 0x6F, 0x79, 0xF0, 0x0D, 0xAA, 0x93, 0xD5, 0x63, 0xB0, 0x80, 0x83, + 0xA3, 0xD0, 0x0F, 0x40, 0x8F, 0x15, 0xD5, 0x40, 0x04, 0x5D, 0xD1, 0x33, + 0xEF, 0xAD, 0x6C, 0xC8, 0x10, 0x01, 0x11, 0xB6, 0xFA, 0x0E, 0x03, 0x0B, + 0x34, 0x10, 0x38, 0xD1, 0x90, 0xDF, 0x6F, 0x99, 0x0A, 0x33, 0x60, 0xF5, + 0xFB, 0x20, 0x04, 0x47, 0x55, 0x00, 0x02, 0x00, 0x53, 0x40, 0x9D, 0x06, + 0x60, 0x44, 0x02, 0x66, 0x3F, 0x02, 0x25, 0xB0, 0x51, 0x6E, 0x40, 0x93, + 0x55, 0x7C, 0x5F, 0x2C, 0xB0, 0x02, 0x90, 0x53, 0x06, 0x24, 0x9E, 0x51, + 0x25, 0x10, 0x03, 0x0E, 0x7F, 0x60, 0x6A, 0x07, 0x8B, 0x16, 0xC8, 0xF7, + 0x31, 0x2E, 0x04, 0xDA, 0x60, 0x0F, 0x80, 0x8F, 0x6E, 0x3A, 0x41, 0x0B, + 0x39, 0xE6, 0xF1, 0xD5, 0x00, 0x0D, 0xBE, 0xE8, 0x0A, 0xEB, 0xF4, 0x09, + 0x98, 0xC0, 0x3E, 0xE2, 0xC3, 0x0C, 0x56, 0x60, 0xF2, 0x23, 0x46, 0x0E, + 0x3B, 0x20, 0x01, 0x72, 0x62, 0x04, 0xA1, 0xC0, 0xEB, 0x92, 0xCA, 0x0A, + 0x00, 0x41, 0xE4, 0x9F, 0xA7, 0x39, 0xFE, 0x9F, 0x88, 0x48, 0x20, 0x20, + 0x4B, 0xDF, 0x42, 0x86, 0x0D, 0x1D, 0x3E, 0x84, 0x18, 0x51, 0xE2, 0x44, + 0x8A, 0x15, 0x2D, 0x5E, 0xC4, 0xD8, 0x90, 0x48, 0xAB, 0x69, 0xDB, 0xB4, + 0x7D, 0xF4, 0x37, 0x4B, 0xA4, 0x28, 0x4F, 0xA3, 0xDE, 0x65, 0x44, 0x39, + 0xF1, 0x17, 0x26, 0x57, 0xDC, 0xBA, 0x75, 0xCB, 0xD6, 0xAA, 0xD6, 0x2C, + 0x59, 0x11, 0x6A, 0xE9, 0xCB, 0x97, 0x52, 0x27, 0x4A, 0x6A, 0x37, 0x44, + 0xAD, 0x8B, 0xA6, 0xAD, 0x55, 0x2B, 0x4C, 0xA9, 0x52, 0xE5, 0x08, 0x00, + 0x04, 0x9F, 0xBE, 0x26, 0x07, 0x2E, 0x60, 0xC0, 0x70, 0x40, 0x40, 0x20, + 0x4B, 0x78, 0x2C, 0xB9, 0x51, 0x73, 0xA9, 0x0C, 0x1E, 0x3C, 0x82, 0x0E, + 0x49, 0x8A, 0xA4, 0x47, 0xCF, 0x21, 0x3C, 0x69, 0x54, 0x9C, 0x48, 0xB1, + 0xA2, 0xC5, 0x0B, 0x16, 0x29, 0x46, 0x80, 0x98, 0x70, 0x00, 0xAA, 0x05, + 0x1A, 0x17, 0x2E, 0xD0, 0xC0, 0xBB, 0xE4, 0xC9, 0xDE, 0xBA, 0x18, 0x76, + 0xD4, 0x3A, 0xB9, 0x53, 0x70, 0x4A, 0x5A, 0xAD, 0xB6, 0xD1, 0xB2, 0x56, + 0xAD, 0xDA, 0x2F, 0x5A, 0xB5, 0x60, 0x7D, 0x12, 0x15, 0x4A, 0x72, 0x28, + 0x56, 0xD1, 0x90, 0x11, 0x09, 0x3C, 0x58, 0xB3, 0xC3, 0x7D, 0x9E, 0x6E, + 0x40, 0xD0, 0x11, 0x21, 0xC2, 0x10, 0x4C, 0xA0, 0x3E, 0x7D, 0x42, 0x15, + 0x8A, 0x08, 0x91, 0x21, 0x3E, 0x22, 0x40, 0x20, 0x40, 0x6B, 0xF3, 0x6C, + 0xDA, 0xB5, 0x05, 0xC3, 0xAB, 0x30, 0x47, 0xD6, 0xC7, 0x75, 0xDA, 0x92, + 0x89, 0x8C, 0x15, 0xCA, 0xD3, 0x29, 0xDB, 0x18, 0xF7, 0xF9, 0x6B, 0xD2, + 0x72, 0x5B, 0xB7, 0x6D, 0xAE, 0x62, 0xCD, 0x82, 0x05, 0x41, 0x76, 0x71, + 0x88, 0xFB, 0xF6, 0xA1, 0xF4, 0xA6, 0x23, 0x54, 0xB7, 0x69, 0xDA, 0x66, + 0x31, 0xC3, 0x84, 0x49, 0x15, 0x10, 0x01, 0x3A, 0x96, 0xFE, 0xEA, 0x38, + 0x80, 0xF7, 0xC2, 0x01, 0xF6, 0x97, 0x02, 0x5D, 0x82, 0x0F, 0x9F, 0x90, + 0x25, 0x4B, 0x7A, 0x2E, 0xB1, 0x10, 0xC1, 0x60, 0xC1, 0x82, 0x09, 0x10, + 0x2C, 0x88, 0x10, 0xA1, 0x03, 0x0B, 0xD8, 0x8B, 0x8A, 0xBD, 0x03, 0x38, + 0xB8, 0xC0, 0x02, 0xBB, 0x14, 0x5C, 0xA2, 0xC1, 0xBE, 0x02, 0x71, 0x25, + 0x33, 0xEA, 0x6A, 0xBB, 0x8E, 0x16, 0x56, 0xA8, 0xD1, 0xA5, 0x1A, 0x68, + 0xA4, 0xD1, 0x45, 0x97, 0x5A, 0x6C, 0x19, 0xEE, 0x93, 0x50, 0x4E, 0x8B, + 0x25, 0x1A, 0x66, 0x9A, 0x80, 0x67, 0xC2, 0xC1, 0x7E, 0xC9, 0x41, 0x02, + 0x20, 0x42, 0x7B, 0x4D, 0x82, 0x08, 0x66, 0xD0, 0x21, 0x87, 0x1B, 0x6E, + 0x88, 0x40, 0x82, 0xCF, 0x74, 0xB0, 0x46, 0x45, 0x1F, 0x7F, 0x1C, 0xEC, + 0x3A, 0x57, 0x1E, 0x88, 0x20, 0x94, 0x6C, 0xB4, 0xD9, 0x66, 0x1A, 0x64, + 0x66, 0x41, 0x06, 0x96, 0x50, 0x30, 0x99, 0x0E, 0x48, 0x88, 0xFC, 0x11, + 0x82, 0x94, 0x97, 0xB8, 0xC9, 0x86, 0x16, 0x58, 0xA0, 0x8B, 0xE0, 0x17, + 0x29, 0x17, 0xBA, 0x2E, 0x23, 0x7C, 0x76, 0xC0, 0x64, 0x9D, 0xEE, 0x92, + 0x61, 0x66, 0x94, 0xD2, 0x40, 0x21, 0x20, 0x82, 0x93, 0x70, 0x10, 0x80, + 0x06, 0xBD, 0x68, 0x90, 0xCB, 0x00, 0x02, 0x31, 0x58, 0x80, 0x03, 0x19, + 0x3A, 0x60, 0x40, 0x01, 0xB9, 0x16, 0xB4, 0x40, 0xC1, 0x40, 0x07, 0x2C, + 0x70, 0x02, 0x0B, 0x26, 0x88, 0x6B, 0xAE, 0x04, 0xF1, 0xA2, 0xC1, 0x02, + 0x0C, 0x2C, 0xD8, 0x41, 0x95, 0x30, 0xBF, 0x9C, 0xCD, 0x31, 0x68, 0x36, + 0xE4, 0x70, 0x16, 0x5A, 0x5C, 0x71, 0x05, 0x32, 0x11, 0x43, 0x41, 0x45, + 0x96, 0x68, 0x64, 0xF1, 0x44, 0x1E, 0x4A, 0x2F, 0xCA, 0xA9, 0x9A, 0x22, + 0x72, 0x00, 0x82, 0x08, 0x56, 0x43, 0x23, 0x20, 0x56, 0x00, 0x0A, 0x88, + 0xFE, 0xE0, 0x86, 0x0A, 0x2A, 0x70, 0xC5, 0xD4, 0x53, 0x77, 0xE5, 0x75, + 0x21, 0x4F, 0x74, 0x90, 0x31, 0x9A, 0xDE, 0xFC, 0x81, 0x65, 0x49, 0x55, + 0x44, 0xC1, 0x64, 0x9B, 0x5E, 0xAF, 0xFB, 0xA6, 0x09, 0x55, 0xBA, 0xE1, + 0x86, 0x1B, 0x7F, 0x54, 0x81, 0xE5, 0x37, 0x08, 0xA8, 0xE9, 0xF5, 0xA2, + 0xEC, 0x8A, 0xE8, 0x4D, 0x9B, 0x90, 0xC2, 0x03, 0x45, 0x93, 0x09, 0x0C, + 0xF0, 0x46, 0x9F, 0x1D, 0x06, 0xB8, 0xA0, 0x41, 0xBD, 0xF8, 0x82, 0xCA, + 0xAE, 0xA7, 0xD2, 0x5D, 0xD7, 0xAE, 0x46, 0xE5, 0x0A, 0xF4, 0x80, 0xB8, + 0x26, 0x80, 0xEA, 0xD1, 0x41, 0x15, 0x4C, 0xF0, 0x29, 0x0C, 0x68, 0x10, + 0x65, 0x1A, 0xEB, 0xAC, 0xCB, 0x36, 0xA5, 0x7C, 0xF6, 0x71, 0x05, 0x96, + 0x68, 0x32, 0x7C, 0xA5, 0x16, 0x68, 0x5C, 0x39, 0x45, 0x97, 0x52, 0x84, + 0x38, 0xE5, 0x13, 0x4F, 0x58, 0x29, 0x31, 0x16, 0x4F, 0x24, 0x2C, 0xF8, + 0xA1, 0x7D, 0xB0, 0x71, 0x25, 0x08, 0x1B, 0x77, 0x18, 0xC2, 0x86, 0x07, + 0x62, 0x7D, 0xE0, 0xC6, 0x0A, 0x76, 0x90, 0x66, 0xD2, 0x8E, 0x5F, 0x2E, + 0x8E, 0x9F, 0x1B, 0x56, 0x43, 0x20, 0x88, 0x75, 0x80, 0x4A, 0xC6, 0x1F, + 0x64, 0x9E, 0xF4, 0x24, 0x45, 0x5E, 0xAF, 0x93, 0x86, 0x08, 0x5A, 0x5E, + 0xCA, 0xA6, 0x96, 0x56, 0x5C, 0x59, 0xE6, 0x94, 0x6B, 0xF5, 0x71, 0x19, + 0x66, 0x86, 0xE0, 0x19, 0x02, 0x08, 0x8F, 0xBC, 0xF5, 0x07, 0x93, 0x39, + 0x8C, 0x92, 0xC0, 0x00, 0x5D, 0xF4, 0x11, 0xC2, 0x80, 0x74, 0x69, 0x70, + 0x02, 0x0A, 0x27, 0xC2, 0x76, 0x62, 0x09, 0x39, 0x1B, 0x84, 0x62, 0xAF, + 0x27, 0x96, 0x58, 0xD4, 0xDD, 0x02, 0xEB, 0x35, 0xF4, 0x51, 0x7D, 0x07, + 0x64, 0xCF, 0x02, 0x4F, 0x68, 0x09, 0xB3, 0x69, 0xA7, 0x2D, 0x72, 0xEE, + 0x52, 0x6B, 0x74, 0xFE, 0x59, 0xA5, 0x43, 0x4F, 0x64, 0x39, 0x45, 0x07, + 0x4F, 0x52, 0x63, 0x65, 0x95, 0x65, 0x64, 0x21, 0x65, 0xA9, 0xBD, 0x1B, + 0xCA, 0x49, 0x9F, 0x77, 0xBE, 0xF1, 0x64, 0x07, 0xD1, 0x8E, 0xA8, 0xE0, + 0x86, 0x1C, 0x72, 0xB0, 0xA2, 0x1A, 0x7E, 0x1E, 0x07, 0x7D, 0xB6, 0x22, + 0x1E, 0x20, 0xC2, 0x93, 0x0A, 0x82, 0x38, 0x25, 0x94, 0x22, 0x84, 0x08, + 0x62, 0x87, 0x20, 0x30, 0x5B, 0x56, 0x9F, 0x5F, 0x8A, 0x18, 0x1A, 0x4B, + 0x58, 0x4E, 0x39, 0x25, 0x99, 0x51, 0x20, 0x90, 0x26, 0x74, 0xC8, 0x9B, + 0xC8, 0x61, 0x6A, 0x6D, 0x90, 0x69, 0x65, 0x0E, 0x56, 0x98, 0x79, 0x60, + 0x02, 0xD9, 0x54, 0x89, 0x6B, 0x09, 0xB1, 0x33, 0xC9, 0x04, 0x0A, 0xB1, + 0x97, 0x28, 0xDB, 0x89, 0x4C, 0xCA, 0x7E, 0xC2, 0x89, 0xB5, 0xD5, 0x6D, + 0x74, 0xDF, 0x40, 0xA1, 0x3A, 0xA0, 0x00, 0xF6, 0x26, 0xB8, 0x60, 0x87, + 0x51, 0x66, 0xE1, 0xD8, 0xF7, 0x8B, 0x74, 0x99, 0x05, 0x9A, 0x0C, 0x97, + 0xA1, 0x45, 0x17, 0x57, 0x30, 0x59, 0xC5, 0x96, 0x81, 0x46, 0x0C, 0x65, + 0x15, 0x8C, 0x47, 0xD1, 0x35, 0xF4, 0xC8, 0x19, 0xC2, 0x87, 0x2B, 0x46, + 0x31, 0x8A, 0xC5, 0x90, 0x22, 0x4A, 0xEA, 0x43, 0x20, 0x4A, 0xF8, 0x91, + 0x83, 0x08, 0x6C, 0x4E, 0x07, 0x3A, 0xB8, 0x01, 0x0E, 0x82, 0x30, 0x04, + 0x1D, 0x54, 0xA0, 0x08, 0x9F, 0xE3, 0x55, 0x4E, 0x68, 0xF1, 0x17, 0x75, + 0xB8, 0x24, 0x19, 0xA2, 0x50, 0x45, 0x32, 0x3C, 0xF1, 0x80, 0xDE, 0x25, + 0x90, 0x14, 0x33, 0x60, 0xC6, 0x47, 0xBC, 0x13, 0x0B, 0x50, 0xC4, 0x82, + 0x19, 0x12, 0x00, 0xC0, 0x2B, 0xF4, 0x21, 0x8D, 0xB8, 0x58, 0x20, 0x7B, + 0xD1, 0x83, 0x5E, 0x0E, 0x9F, 0x77, 0x3D, 0xE9, 0x3D, 0xA1, 0x2E, 0x77, + 0x09, 0xD4, 0xD9, 0x96, 0x70, 0x28, 0xFE, 0x03, 0x58, 0x80, 0x07, 0x4D, + 0xC8, 0x44, 0x2E, 0xD4, 0x61, 0x0F, 0xC8, 0x25, 0x90, 0x22, 0xD7, 0xB9, + 0x4E, 0x2D, 0x62, 0x71, 0xA9, 0x69, 0xBC, 0x62, 0x16, 0xAE, 0xA0, 0xC5, + 0x2A, 0x04, 0x38, 0x07, 0x4F, 0xA0, 0x66, 0x15, 0xA8, 0x61, 0xC5, 0x28, + 0x1C, 0xE7, 0xC4, 0xA7, 0xE9, 0xEA, 0x1D, 0x7A, 0x23, 0x63, 0x1A, 0x21, + 0xE2, 0x8D, 0x1C, 0xE8, 0x00, 0x08, 0x3B, 0xC0, 0xC1, 0x8D, 0x1E, 0x18, + 0x81, 0x26, 0x90, 0xA3, 0x60, 0xFC, 0xA0, 0x85, 0x10, 0x6A, 0x01, 0xAD, + 0x6C, 0x24, 0xE3, 0x58, 0x4E, 0x22, 0x21, 0xD3, 0x10, 0xD8, 0x0A, 0x1A, + 0xC0, 0xA2, 0x37, 0xD3, 0x40, 0x13, 0x6A, 0x98, 0x71, 0x83, 0x00, 0xB8, + 0x62, 0x21, 0xB2, 0xA0, 0x81, 0x02, 0x24, 0xF0, 0x84, 0x1C, 0x56, 0xB2, + 0x92, 0x50, 0xC8, 0xA1, 0xD9, 0xF2, 0xA2, 0x1E, 0xB3, 0xA5, 0x27, 0x1B, + 0xEE, 0x00, 0xD3, 0xC0, 0x16, 0xF2, 0x3F, 0x35, 0x72, 0x66, 0x8C, 0xB5, + 0x70, 0x05, 0x34, 0x68, 0x01, 0x0D, 0x58, 0xBC, 0x22, 0x69, 0xA3, 0x70, + 0x85, 0x28, 0xE6, 0xF0, 0x24, 0x54, 0xB0, 0x22, 0x14, 0xB1, 0x48, 0xC5, + 0x28, 0xD0, 0x58, 0x4A, 0x5E, 0xF6, 0xF2, 0x21, 0xF0, 0x20, 0x42, 0x05, + 0xDC, 0x58, 0x84, 0x0A, 0x3E, 0x00, 0x57, 0xDC, 0xC8, 0xD6, 0x3E, 0xF8, + 0xF1, 0x8A, 0x20, 0xD0, 0xC2, 0x1B, 0xDB, 0xD8, 0xC6, 0x2C, 0x46, 0x71, + 0x8A, 0x59, 0x60, 0xE2, 0x00, 0x25, 0x44, 0x20, 0x2D, 0x7C, 0xD2, 0x0D, + 0x6D, 0x4C, 0x43, 0x67, 0x22, 0x52, 0x86, 0x0E, 0x00, 0x50, 0x0A, 0x9C, + 0xCC, 0xB0, 0x02, 0x07, 0xB0, 0x00, 0xF5, 0xAC, 0x67, 0x49, 0xE8, 0x61, + 0xD2, 0x09, 0x81, 0xD0, 0x0B, 0xF5, 0x7C, 0x28, 0xA7, 0xF5, 0xE4, 0xA0, + 0x1D, 0x04, 0xDB, 0xA5, 0x2F, 0x23, 0xA2, 0x8A, 0x58, 0xFE, 0x50, 0x23, + 0x19, 0xEE, 0xD3, 0x85, 0x2C, 0x50, 0x61, 0x8B, 0x55, 0x84, 0xC2, 0x08, + 0x04, 0xA1, 0x4C, 0x28, 0x04, 0xEA, 0x89, 0x31, 0xEA, 0xD3, 0xA1, 0x0E, + 0xCD, 0x87, 0x3F, 0x2A, 0x77, 0xAB, 0x95, 0x35, 0x81, 0x16, 0x18, 0x5C, + 0x56, 0x2D, 0x9A, 0xC9, 0x8D, 0x6D, 0x64, 0x63, 0x16, 0xA2, 0x10, 0xC5, + 0x2C, 0x88, 0x30, 0x01, 0x6C, 0xC1, 0x6C, 0x97, 0xD2, 0xD0, 0xC1, 0x10, + 0x7A, 0x13, 0x0D, 0x44, 0x32, 0x03, 0x15, 0xCC, 0x18, 0x02, 0x00, 0x46, + 0xD1, 0x90, 0x5F, 0x9C, 0x93, 0x41, 0xD0, 0x1B, 0x1B, 0x0E, 0x73, 0x98, + 0x3D, 0xB1, 0xCD, 0x73, 0x2F, 0xEB, 0xB1, 0x00, 0x39, 0x09, 0xF6, 0xD0, + 0x8B, 0xCC, 0xE4, 0x52, 0xFF, 0x84, 0x45, 0x16, 0x5F, 0x01, 0xAA, 0x39, + 0x0C, 0x44, 0x7F, 0x17, 0x0B, 0x85, 0x28, 0xF2, 0x49, 0x54, 0xAA, 0xAA, + 0x2F, 0x72, 0xFB, 0x90, 0x06, 0x35, 0xE0, 0xD1, 0xD0, 0x5E, 0x1D, 0x8C, + 0x14, 0x40, 0xF0, 0x07, 0x1F, 0x3F, 0xAA, 0x0A, 0x91, 0x1A, 0xA0, 0x1A, + 0x82, 0x2C, 0x58, 0x3E, 0x5F, 0xB1, 0xB2, 0x6C, 0x1C, 0x09, 0x91, 0xB2, + 0x48, 0x45, 0x2C, 0xE8, 0x10, 0x00, 0x4F, 0x38, 0x84, 0x1B, 0x45, 0xA8, + 0x9B, 0xF3, 0x72, 0x38, 0x36, 0xBE, 0x4E, 0xAF, 0x41, 0xD6, 0x73, 0x02, + 0x9D, 0x0E, 0xA0, 0x0A, 0x78, 0x4C, 0xB5, 0xAA, 0x60, 0xD2, 0x07, 0x59, + 0x2F, 0xA5, 0x8B, 0x65, 0x04, 0x34, 0x16, 0x4E, 0xFA, 0x04, 0x28, 0xB8, + 0x88, 0xB1, 0x54, 0xD8, 0x52, 0x14, 0xA4, 0x3C, 0x6C, 0x66, 0x7D, 0x64, + 0x58, 0x5E, 0x5E, 0x47, 0x14, 0x3B, 0x08, 0x2B, 0x4C, 0x92, 0xF1, 0x09, + 0x55, 0x2C, 0x83, 0x08, 0x10, 0xF0, 0x07, 0x02, 0xAF, 0xE3, 0x8D, 0x0A, + 0xF8, 0x40, 0x85, 0x2C, 0x8D, 0x05, 0x26, 0x58, 0x01, 0x8A, 0x00, 0xEC, + 0xFE, 0x40, 0x6F, 0xB5, 0xA0, 0x5B, 0xBA, 0x72, 0x7A, 0x3D, 0xEC, 0xE9, + 0x85, 0xAF, 0x43, 0x64, 0x0F, 0x39, 0x35, 0x6B, 0x11, 0x51, 0x5C, 0x6A, + 0x16, 0xC9, 0x90, 0x05, 0x2C, 0x8E, 0x76, 0x0A, 0x5B, 0x08, 0x07, 0xA1, + 0xB1, 0x60, 0x85, 0x2D, 0x34, 0x41, 0x0A, 0xCE, 0x0E, 0xD7, 0xBA, 0x29, + 0xD9, 0x07, 0x66, 0x89, 0x7A, 0xB0, 0x4F, 0x14, 0xA1, 0x1A, 0xCC, 0xC9, + 0x06, 0x2C, 0x44, 0x71, 0x0A, 0x7F, 0x14, 0x21, 0x02, 0xD7, 0x70, 0x22, + 0x1B, 0x75, 0x80, 0x0C, 0x8F, 0xB0, 0x14, 0x16, 0x98, 0xC0, 0xA5, 0x00, + 0x72, 0x20, 0xA1, 0x30, 0xA9, 0xA3, 0x09, 0x03, 0x52, 0xD0, 0x26, 0x69, + 0xB0, 0xBD, 0x06, 0x3D, 0x45, 0x2E, 0x91, 0xAA, 0xEE, 0x70, 0x4F, 0xB1, + 0x0C, 0xF7, 0xD1, 0x42, 0x16, 0xB1, 0xA8, 0x9F, 0x2C, 0x26, 0x33, 0x07, + 0x50, 0xE8, 0xEF, 0x13, 0xB6, 0x14, 0xEE, 0x75, 0x25, 0x3C, 0xE1, 0xCD, + 0x60, 0xA2, 0x08, 0x2F, 0xE1, 0x8E, 0x2C, 0xC6, 0xEB, 0x8F, 0x20, 0x44, + 0xA0, 0x5C, 0x09, 0x7C, 0x47, 0x11, 0x6E, 0xF0, 0xAC, 0x8F, 0x28, 0x63, + 0x67, 0xB1, 0x88, 0x45, 0x01, 0x66, 0x90, 0xBE, 0x51, 0xA6, 0xA3, 0x09, + 0x10, 0x40, 0xA7, 0x05, 0x38, 0x40, 0x37, 0x47, 0xB1, 0x07, 0x02, 0x3B, + 0x08, 0x85, 0x3F, 0x86, 0x4A, 0x61, 0x88, 0x84, 0x62, 0x19, 0xCB, 0x40, + 0x06, 0x32, 0x74, 0x91, 0x38, 0x56, 0xB8, 0x02, 0x15, 0x06, 0x29, 0xC8, + 0x2D, 0x3F, 0x11, 0x8B, 0x4F, 0xC8, 0x90, 0xC7, 0x4F, 0x86, 0xF2, 0x13, + 0x99, 0x42, 0x04, 0xE6, 0x24, 0x69, 0x16, 0xA7, 0x50, 0x85, 0x3F, 0x80, + 0xE0, 0x61, 0xB4, 0xFA, 0x4E, 0x1E, 0x4D, 0xA8, 0x80, 0x27, 0x84, 0x37, + 0x8B, 0x50, 0xB4, 0x82, 0x19, 0x06, 0xD0, 0x81, 0x44, 0x08, 0xA6, 0x8E, + 0x52, 0x0C, 0x81, 0xFE, 0x07, 0x09, 0x0A, 0xA2, 0x10, 0x30, 0xE1, 0x0F, + 0x9F, 0x75, 0x39, 0xCA, 0x4C, 0xDB, 0x87, 0x28, 0x08, 0xBC, 0x0C, 0x57, + 0x68, 0x58, 0x32, 0xF5, 0x23, 0xC8, 0x10, 0x0E, 0x87, 0x60, 0x52, 0xE1, + 0xED, 0xCE, 0x87, 0x8E, 0x72, 0x98, 0xF0, 0x21, 0x84, 0x4F, 0xAC, 0x23, + 0x1B, 0x1E, 0x39, 0x56, 0x2B, 0x90, 0x91, 0x83, 0x23, 0x20, 0x33, 0x81, + 0xF8, 0x18, 0xC5, 0xCC, 0x3E, 0x12, 0x14, 0x65, 0x60, 0x02, 0x15, 0xEB, + 0xC8, 0x51, 0x3D, 0x26, 0x92, 0xB7, 0x7D, 0xD8, 0xA3, 0x1E, 0xEF, 0x28, + 0x2C, 0x9E, 0x1B, 0xC2, 0x0F, 0x8C, 0xDE, 0x39, 0xCF, 0xD1, 0x88, 0x06, + 0x34, 0x58, 0x21, 0x0B, 0x57, 0xB0, 0x02, 0x15, 0xA8, 0x48, 0xC5, 0x27, + 0x34, 0xF1, 0x0F, 0x50, 0xFD, 0x99, 0x0E, 0x42, 0x45, 0x74, 0xB0, 0x29, + 0x9C, 0x13, 0x7C, 0x04, 0xE1, 0x13, 0xEA, 0x68, 0xEB, 0x34, 0x52, 0x83, + 0x09, 0x64, 0xD0, 0x20, 0x02, 0xEA, 0xB0, 0x73, 0xE8, 0x5C, 0x31, 0x83, + 0x21, 0x28, 0xE3, 0x23, 0xD3, 0x98, 0xC6, 0x27, 0x52, 0xA1, 0x8D, 0x1B, + 0x90, 0xCB, 0x22, 0x7A, 0x03, 0xB7, 0x76, 0x9F, 0x9C, 0x8F, 0x50, 0x28, + 0x23, 0x1A, 0xCA, 0x38, 0x30, 0x74, 0xEB, 0xA7, 0x09, 0x10, 0xD1, 0x21, + 0x7F, 0x09, 0x9D, 0x83, 0x2D, 0x76, 0x3C, 0x9B, 0x00, 0x0B, 0xDB, 0xDE, + 0x2A, 0xBA, 0x0E, 0x3C, 0x80, 0x30, 0x0A, 0x47, 0xAF, 0xC3, 0x1F, 0xF3, + 0xCB, 0x71, 0x0E, 0x2A, 0x60, 0xE9, 0x04, 0x96, 0x02, 0x07, 0x44, 0x48, + 0x86, 0x0A, 0x65, 0xC1, 0x9A, 0x68, 0x18, 0xE1, 0x01, 0xE8, 0xBD, 0x37, + 0x76, 0x1F, 0x92, 0x0F, 0x4F, 0x9C, 0x1B, 0x1A, 0xC8, 0x10, 0xA8, 0x88, + 0x34, 0x01, 0x55, 0x2E, 0xA2, 0xA6, 0x96, 0x98, 0x58, 0x46, 0xBD, 0x23, + 0x3E, 0x72, 0x27, 0xD6, 0x23, 0x07, 0xFE, 0xFC, 0x3E, 0x92, 0x36, 0x54, + 0x21, 0x1E, 0x7F, 0x08, 0xBC, 0xCE, 0xB3, 0xF9, 0x70, 0x6D, 0x5E, 0x21, + 0xC1, 0x4F, 0x74, 0x47, 0x19, 0xB1, 0x28, 0x42, 0x78, 0x1E, 0xF0, 0x80, + 0xB3, 0x8A, 0x9B, 0xE4, 0x17, 0xD9, 0xC7, 0x27, 0xA2, 0xB1, 0x0C, 0x56, + 0xCC, 0xDA, 0xD6, 0xA7, 0x39, 0xCD, 0x1C, 0x30, 0x71, 0xB8, 0x5B, 0xB3, + 0xE2, 0x13, 0x8E, 0x14, 0xF9, 0xCF, 0xA5, 0xBE, 0xB7, 0x7E, 0xE8, 0xA0, + 0x15, 0xDD, 0x52, 0x39, 0x26, 0x60, 0xA1, 0x0D, 0x1C, 0xE0, 0x20, 0xEA, + 0x52, 0xB6, 0x0D, 0x2D, 0x22, 0x80, 0x03, 0xED, 0x6C, 0x63, 0x19, 0xAD, + 0x08, 0xC2, 0x0D, 0x24, 0x30, 0x83, 0x07, 0xDC, 0x64, 0xEA, 0x3A, 0xC1, + 0xC7, 0x27, 0xB4, 0x41, 0x74, 0xFD, 0xD9, 0xF2, 0x13, 0x05, 0xF5, 0x84, + 0x69, 0xE8, 0x70, 0xB1, 0x07, 0xCF, 0xC1, 0x91, 0xB4, 0xF9, 0xFA, 0xDB, + 0x05, 0x8F, 0x11, 0x6E, 0xE0, 0x40, 0x16, 0xBD, 0x59, 0x47, 0x32, 0xDE, + 0x0B, 0x8B, 0x69, 0xE0, 0x20, 0x07, 0x76, 0x4C, 0xEF, 0x67, 0x20, 0x80, + 0x80, 0x1B, 0x7D, 0xC6, 0x45, 0x13, 0x20, 0x82, 0xCF, 0x07, 0x2F, 0x91, + 0x77, 0x80, 0x62, 0x1D, 0xCC, 0x38, 0x70, 0xE2, 0x46, 0xE4, 0x74, 0x4D, + 0x58, 0xAC, 0x62, 0x05, 0x65, 0xC5, 0x1C, 0x9C, 0x4C, 0xEF, 0xCD, 0xB7, + 0x7E, 0x36, 0x39, 0xE1, 0x46, 0x0E, 0x96, 0xD1, 0xAD, 0x69, 0xA8, 0xC2, + 0x13, 0xB3, 0x98, 0xC6, 0x0C, 0x76, 0xD0, 0x3F, 0x04, 0xBE, 0x23, 0xD3, + 0x3E, 0xD8, 0x41, 0x1B, 0x67, 0x50, 0x01, 0x44, 0xE5, 0xA0, 0xD5, 0xAE, + 0x97, 0x48, 0x4E, 0xDE, 0xE1, 0x09, 0x14, 0x37, 0x3F, 0x35, 0x20, 0x3A, + 0x0D, 0x41, 0x66, 0x89, 0x0A, 0xFD, 0x0D, 0x41, 0x36, 0x81, 0x47, 0x7E, + 0xF6, 0x6D, 0x13, 0xFB, 0x59, 0x70, 0xB3, 0x9B, 0xA8, 0xFE, 0xF0, 0x44, + 0x2B, 0xB4, 0xB1, 0x83, 0x19, 0x70, 0x55, 0x7D, 0xDF, 0x10, 0x82, 0xE6, + 0x5E, 0x97, 0x03, 0x08, 0x18, 0x20, 0x07, 0xAB, 0xD7, 0xFE, 0x44, 0xDE, + 0x11, 0x0A, 0x66, 0x60, 0xAC, 0xE8, 0xA9, 0xC9, 0x35, 0x2B, 0xA4, 0xAF, + 0x09, 0x4D, 0xDC, 0x1A, 0x14, 0x43, 0x38, 0xAB, 0xF8, 0x13, 0x40, 0x29, + 0x79, 0x87, 0x56, 0xA3, 0x06, 0x1D, 0x98, 0xBD, 0x6B, 0x13, 0x8E, 0x51, + 0x50, 0x05, 0x1C, 0xA8, 0x80, 0x97, 0x43, 0x20, 0x6F, 0x68, 0x02, 0x21, + 0xD8, 0x81, 0x1B, 0xC9, 0x81, 0x20, 0x10, 0x85, 0x5F, 0xC0, 0x3E, 0x0A, + 0xA9, 0xAA, 0x76, 0x40, 0x05, 0x6D, 0xC8, 0x9F, 0x58, 0xB8, 0x35, 0xC9, + 0x00, 0x85, 0x50, 0x90, 0xAC, 0xC3, 0x21, 0xA8, 0x55, 0x58, 0x8D, 0x6F, + 0xD0, 0xBC, 0x01, 0x74, 0x41, 0x0A, 0x39, 0x8E, 0xF5, 0xE2, 0xA6, 0x75, + 0x50, 0x06, 0x64, 0xF9, 0x84, 0x56, 0xA8, 0x00, 0x1C, 0x80, 0xC0, 0xDE, + 0x53, 0xBE, 0x7E, 0x80, 0x87, 0x16, 0x7C, 0xC1, 0x7D, 0x80, 0x07, 0x57, + 0x40, 0x86, 0xA6, 0x4B, 0x8D, 0x21, 0x20, 0x02, 0x4D, 0x08, 0x85, 0x21, + 0x40, 0x42, 0x50, 0x28, 0xC1, 0xD4, 0xD3, 0x81, 0x5F, 0x38, 0xBE, 0x17, + 0xA4, 0x42, 0xDB, 0xD8, 0x07, 0x5A, 0xC8, 0x01, 0x7F, 0xE8, 0x16, 0x32, + 0x1B, 0x05, 0xD2, 0xCA, 0xC1, 0x29, 0xAC, 0x42, 0xAA, 0xCA, 0x07, 0x6E, + 0xF0, 0x04, 0x22, 0xA0, 0xBE, 0x23, 0x93, 0xAC, 0xD2, 0x61, 0x30, 0x4F, + 0x08, 0x0F, 0xA5, 0xFB, 0x04, 0x1F, 0xB8, 0x01, 0xCF, 0x09, 0xC3, 0x39, + 0xB4, 0x0D, 0x58, 0x70, 0x2D, 0x15, 0xF2, 0x87, 0xA8, 0x0A, 0x05, 0x55, + 0x38, 0x9D, 0x0D, 0xA4, 0x43, 0xD0, 0xD9, 0x07, 0x6F, 0x98, 0x83, 0x08, + 0x00, 0x05, 0x8C, 0x59, 0xC2, 0x39, 0x20, 0x82, 0x8E, 0x23, 0x82, 0xBD, + 0xFE, 0x03, 0x05, 0x4C, 0x60, 0xA0, 0x1B, 0xF8, 0x05, 0xF3, 0xFB, 0xC3, + 0x7B, 0xC3, 0x28, 0x70, 0x2B, 0x0E, 0xCF, 0xDA, 0x01, 0xAC, 0x53, 0x86, + 0x27, 0xC1, 0x04, 0x51, 0x38, 0x9D, 0x49, 0x3C, 0xAC, 0x7C, 0x80, 0x87, + 0x51, 0x90, 0x00, 0x09, 0xC0, 0x81, 0x59, 0x2A, 0x43, 0x4C, 0x08, 0x85, + 0x82, 0x50, 0xC5, 0x4F, 0xC8, 0x81, 0x19, 0xD0, 0x91, 0x1C, 0x38, 0x20, + 0x50, 0x8C, 0x38, 0x28, 0xD2, 0x07, 0xAE, 0x3A, 0x98, 0xE2, 0xC8, 0x09, + 0x51, 0xE0, 0x16, 0x6D, 0xE8, 0x0D, 0xDD, 0xF1, 0x84, 0x3D, 0x3C, 0x82, + 0x20, 0x90, 0x44, 0x5A, 0xE4, 0xA5, 0x7E, 0x10, 0x85, 0x16, 0x81, 0x8D, + 0x08, 0x30, 0x02, 0x23, 0x18, 0x02, 0xA5, 0x1B, 0x02, 0x23, 0x08, 0x0D, + 0x22, 0xA9, 0x80, 0x1C, 0xC0, 0x01, 0x2F, 0x31, 0xC6, 0x6C, 0xBC, 0x88, + 0x27, 0xF1, 0xBE, 0x6E, 0x52, 0x0D, 0x11, 0x81, 0x00, 0x21, 0xD8, 0x41, + 0x6D, 0x54, 0xA3, 0x7D, 0x78, 0x85, 0x36, 0xAA, 0x80, 0x19, 0x78, 0xC5, + 0x5A, 0xB9, 0x01, 0x23, 0x88, 0x80, 0x93, 0x01, 0x00, 0x19, 0x81, 0x20, + 0x31, 0x22, 0xC7, 0xEC, 0xF3, 0xC3, 0x87, 0xF8, 0x84, 0x32, 0xF1, 0x45, + 0x65, 0xA8, 0x3D, 0x22, 0xF8, 0x04, 0x52, 0x88, 0x80, 0x1D, 0xA0, 0xAA, + 0x62, 0xAC, 0x42, 0x78, 0x28, 0x85, 0x0E, 0x93, 0x91, 0x82, 0x08, 0x02, + 0x23, 0xB8, 0x81, 0x93, 0xD9, 0xB9, 0x94, 0x91, 0x00, 0x62, 0xAC, 0xC7, + 0x89, 0xF4, 0x18, 0x7D, 0x08, 0x0F, 0x6E, 0xCA, 0x06, 0x58, 0x53, 0x9D, + 0x7F, 0x5C, 0x99, 0x7B, 0xEC, 0x18, 0x8F, 0x9C, 0xBA, 0x7C, 0xF0, 0x86, + 0x5F, 0x10, 0x85, 0x7F, 0x68, 0xC8, 0x07, 0x90, 0x80, 0x9D, 0x43, 0x08, + 0x02, 0xA0, 0xBC, 0x22, 0x70, 0x05, 0x82, 0xA4, 0x48, 0x72, 0x24, 0x02, + 0x66, 0x9B, 0x1A, 0xFE, 0x64, 0xB0, 0x30, 0xE1, 0x80, 0x80, 0x20, 0x88, + 0xC9, 0x87, 0xC2, 0x07, 0x72, 0xA0, 0x05, 0x51, 0x68, 0x82, 0x22, 0x70, + 0x1D, 0x21, 0xF0, 0x04, 0x52, 0xD0, 0xC0, 0x9D, 0xB4, 0xC7, 0xDA, 0xF0, + 0x47, 0x55, 0xD0, 0x86, 0x23, 0x51, 0x85, 0x6F, 0xC4, 0x84, 0x0A, 0x68, + 0x02, 0xA4, 0xD4, 0xA7, 0xC8, 0xC9, 0x89, 0x7D, 0x90, 0x07, 0x79, 0x28, + 0x40, 0x86, 0x00, 0x42, 0xAA, 0xBC, 0x37, 0x90, 0x64, 0x9A, 0xD2, 0x61, + 0xCA, 0x6E, 0x6A, 0x05, 0x4F, 0x28, 0x82, 0x51, 0xD8, 0x01, 0x04, 0xB8, + 0x3E, 0xAE, 0xF4, 0xCA, 0x04, 0x12, 0xA5, 0xB6, 0x1C, 0x40, 0x7C, 0x90, + 0xC4, 0xAE, 0x84, 0x08, 0x7C, 0x58, 0xBA, 0x0F, 0x5C, 0x87, 0x65, 0x80, + 0x05, 0x4F, 0x30, 0xB6, 0x1C, 0x78, 0x80, 0x59, 0x84, 0xCB, 0x2F, 0x01, + 0xCB, 0xC0, 0x6C, 0x3D, 0x7C, 0x18, 0xCC, 0x7D, 0x18, 0x82, 0x22, 0xB8, + 0xBA, 0x69, 0x98, 0x85, 0x56, 0x20, 0x82, 0x22, 0x20, 0x82, 0xAE, 0x3B, + 0xAB, 0xC1, 0x24, 0xCC, 0x8A, 0xA0, 0xCC, 0xCA, 0xA4, 0x48, 0xF3, 0xC2, + 0x84, 0x8F, 0x80, 0x8E, 0x32, 0xEC, 0xAE, 0x1D, 0x60, 0x31, 0xCC, 0x14, + 0xCD, 0xD1, 0x7C, 0x99, 0x0E, 0x83, 0x80, 0x1C, 0x68, 0x02, 0x4C, 0x38, + 0x05, 0x22, 0x08, 0x02, 0x07, 0xCC, 0x01, 0xBA, 0x24, 0xCD, 0xD8, 0x94, + 0x4D, 0xEA, 0xC8, 0x07, 0x51, 0x00, 0x02, 0x20, 0x68, 0xCD, 0x19, 0x78, + 0x47, 0x08, 0xD0, 0x1C, 0xB7, 0x9B, 0xCD, 0xDF, 0x04, 0xCE, 0x1F, 0x69, + 0x07, 0x52, 0xD0, 0x81, 0x22, 0x50, 0x05, 0x1D, 0x30, 0x80, 0x94, 0x01, + 0x02, 0x60, 0x0B, 0xCE, 0xE6, 0x74, 0x4E, 0xCD, 0xB0, 0x8E, 0x7C, 0xE0, + 0x07, 0x52, 0x70, 0xBC, 0x17, 0xD1, 0x01, 0x09, 0x2A, 0x97, 0xCB, 0x7C, + 0xCE, 0xED, 0x24, 0x4D, 0x56, 0xC3, 0xFE, 0x85, 0x32, 0x04, 0x02, 0xA2, + 0x24, 0x87, 0x7D, 0x08, 0x4D, 0xEE, 0x34, 0xCF, 0xF3, 0x7C, 0x88, 0x02, + 0xCC, 0x07, 0x79, 0x80, 0x07, 0x78, 0xF8, 0x1C, 0xD8, 0x04, 0x3B, 0xF4, + 0x8C, 0x4F, 0xF9, 0x34, 0x46, 0x7C, 0x68, 0x35, 0x7C, 0xE8, 0x4A, 0xED, + 0xDC, 0x4E, 0xFD, 0xDC, 0x09, 0xFE, 0xA4, 0xCF, 0xFF, 0x04, 0xD0, 0x00, + 0xA5, 0x30, 0xFF, 0x14, 0xD0, 0x02, 0xFD, 0x39, 0xF8, 0x34, 0xD0, 0x04, + 0xDD, 0xC9, 0x7D, 0x58, 0x8A, 0x49, 0x21, 0x50, 0x05, 0x85, 0xD0, 0x20, + 0x8C, 0x50, 0x94, 0x78, 0xD0, 0x09, 0xB5, 0xD0, 0x0B, 0xC5, 0xD0, 0x0C, + 0xD5, 0xD0, 0x0D, 0xE5, 0xD0, 0x0E, 0xF5, 0xD0, 0x64, 0xFA, 0xD0, 0x10, + 0xAD, 0xC7, 0x0A, 0x15, 0xD1, 0x12, 0x35, 0xD1, 0x13, 0x45, 0xD1, 0x14, + 0x55, 0xD1, 0x15, 0x65, 0xD1, 0x16, 0x75, 0xD1, 0x17, 0xDD, 0x50, 0xC3, + 0x84, 0xD1, 0x19, 0xA5, 0xD1, 0x1A, 0xB5, 0xD1, 0x1B, 0xC5, 0xD1, 0xFD, + 0xCC, 0xD1, 0x1D, 0xE5, 0xD1, 0x1E, 0xF5, 0xD1, 0x1F, 0x05, 0xD2, 0x20, + 0x15, 0xD2, 0x21, 0x25, 0xD2, 0xDF, 0xCC, 0xAE, 0x22, 0x45, 0xD2, 0x24, + 0x55, 0xD2, 0x25, 0x65, 0xD2, 0x26, 0x75, 0xD2, 0x27, 0x85, 0xD2, 0x28, + 0x95, 0xD2, 0x29, 0xA5, 0xD2, 0x2A, 0xB5, 0xD2, 0x2B, 0xC5, 0xD2, 0x2C, + 0xD5, 0xD2, 0x2D, 0xE5, 0xD2, 0x2E, 0xF5, 0xD2, 0x04, 0x25, 0xD1, 0x2F, + 0x2D, 0x52, 0x04, 0x45, 0xD2, 0x30, 0x15, 0x53, 0x21, 0x9D, 0xB7, 0x33, + 0x1D, 0x3C, 0x33, 0xFD, 0x50, 0x06, 0x55, 0x53, 0xD6, 0x7B, 0xD3, 0x38, + 0x95, 0xD3, 0x39, 0xA5, 0xD3, 0x3A, 0xB5, 0xD3, 0xE6, 0x74, 0xD3, 0x3B, + 0xA5, 0x52, 0x97, 0x39, 0x52, 0x3D, 0xC5, 0x52, 0xF2, 0xF4, 0x53, 0x44, + 0x63, 0xD3, 0x40, 0x25, 0xD4, 0x42, 0x35, 0xD4, 0x43, 0x4A, 0x45, 0xD4, + 0x44, 0x55, 0xD4, 0x45, 0x65, 0xD4, 0x46, 0x75, 0xD4, 0x47, 0x85, 0xD4, + 0x48, 0x95, 0xD4, 0x49, 0xA5, 0xD4, 0x4A, 0xB5, 0xD4, 0x4B, 0xC5, 0xD4, + 0xC7, 0x19, 0xD4, 0x4C, 0xC5, 0xD0, 0x4D, 0xE5, 0xD4, 0x4F, 0x05, 0xD5, + 0x43, 0xF3, 0xD4, 0x50, 0x25, 0xD5, 0x52, 0x35, 0xD5, 0x53, 0x45, 0xD5, + 0x54, 0x4D, 0xA3, 0x51, 0x55, 0x55, 0xF9, 0xE4, 0x07, 0x56, 0x9D, 0xC4, + 0x34, 0x6D, 0xD5, 0x19, 0x7D, 0x07, 0xC8, 0x9B, 0xD5, 0xE6, 0x0C, 0x08, + 0x00, 0x3B + }; + +typedef struct _MagickImageInfo +{ + char + name[MaxTextExtent], + magick[MaxTextExtent]; + + const void + *blob; + + size_t + extent; +} MagickImageInfo; + +static const MagickImageInfo + MagickImageList[] = + { + { "LOGO", "GIF", LogoImage, sizeof(LogoImage) }, + { "GRANITE", "GIF", GraniteImage, sizeof(GraniteImage) }, + { "NETSCAPE", "GIF", NetscapeImage, sizeof(NetscapeImage) }, + { "ROSE", "PNM", RoseImage, sizeof(RoseImage) }, + { "WIZARD", "GIF", WizardImage, sizeof(WizardImage) }, + { "", "", (const void *) NULL, 0 } + }; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMAGICKImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M A G I C K I m a g e h +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMAGICKImage() reads a MAGICK image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadMAGICKImage method is: +% +% Image *ReadMAGICKImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMAGICKImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + const void + *blob; + + Image + *image; + + ImageInfo + *blob_info; + + ssize_t + i; + + size_t + extent; + + blob_info=CloneImageInfo(image_info); + if (LocaleCompare(image_info->magick,"MAGICK") != 0) + (void) CopyMagickString(blob_info->filename,image_info->magick, + MaxTextExtent); + image=(Image *) NULL; + blob=(const void *) NULL; + extent=0; + for (i=0; MagickImageList[i].blob != (const void *) NULL; i++) + if (LocaleCompare(blob_info->filename,MagickImageList[i].name) == 0) + { + (void) CopyMagickString(blob_info->magick,MagickImageList[i].magick, + MaxTextExtent); + blob=MagickImageList[i].blob; + extent=MagickImageList[i].extent; + break; + } + if (blob == (const void *) NULL) + { + blob_info=DestroyImageInfo(blob_info); + ThrowReaderException(OptionError,"UnrecognizedImageFormat"); + } + image=BlobToImage(blob_info,blob,extent,exception); + blob_info=DestroyImageInfo(blob_info); + if (image == (Image *) NULL) + return(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M A G I C K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMAGICKImage() reads a MAGICK image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the RegisterMAGICKImage method is: +% +% size_t RegisterMAGICKImage(void) +% +*/ +ModuleExport size_t RegisterMAGICKImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("GRANITE"); + entry->decoder=(DecodeImageHandler *) ReadMAGICKImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->description=ConstantString("Granite texture"); + entry->magick_module=ConstantString("MAGICK"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("H"); + entry->encoder=(EncodeImageHandler *) WriteMAGICKImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickFalse; + entry->description=ConstantString("Image expressed as a 'C/C++' char array"); + entry->magick_module=ConstantString("MAGICK"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("LOGO"); + entry->decoder=(DecodeImageHandler *) ReadMAGICKImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->description=ConstantString("ImageMagick Logo"); + entry->magick_module=ConstantString("MAGICK"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("MAGICK"); + entry->decoder=(DecodeImageHandler *) ReadMAGICKImage; + entry->encoder=(EncodeImageHandler *) WriteMAGICKImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickFalse; + entry->description=ConstantString( + "Predefined Magick Image (LOGO, ROSE, etc.); output same as 'H'"); + entry->magick_module=ConstantString("MAGICK"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("NETSCAPE"); + entry->decoder=(DecodeImageHandler *) ReadMAGICKImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->description=ConstantString("Netscape 216 color cube"); + entry->magick_module=ConstantString("MAGICK"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("ROSE"); + entry->decoder=(DecodeImageHandler *) ReadMAGICKImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->description=ConstantString("70x46 Truecolor rose"); + entry->magick_module=ConstantString("MAGICK"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("WIZARD"); + entry->decoder=(DecodeImageHandler *) ReadMAGICKImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->description=ConstantString("ImageMagick Wizard"); + entry->magick_module=ConstantString("MAGICK"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M A G I C K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMAGICKImage() removes format registrations made by the +% MAGICK module from the list of supported formats. +% +% The format of the UnregisterMAGICKImage method is: +% +% UnregisterMAGICKImage(void) +% +*/ +ModuleExport void UnregisterMAGICKImage(void) +{ + (void) UnregisterMagickInfo("GRANITE"); + (void) UnregisterMagickInfo("H"); + (void) UnregisterMagickInfo("WIZARD"); + (void) UnregisterMagickInfo("ROSE"); + (void) UnregisterMagickInfo("NETSCAPE"); + (void) UnregisterMagickInfo("MAGICK"); + (void) UnregisterMagickInfo("LOGO"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M A G I C K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMAGICKImage() writes an image in the MAGICK encoded image format. +% We use GIF and PPM by default because they are the only formats that are +% compressed without requiring additional optional delegates (TIFF, ZIP, etc). +% +% The format of the WriteMAGICKImage method is: +% +% MagickBooleanType WriteMAGICKImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteMAGICKImage(const ImageInfo *image_info, + Image *image) +{ + char + buffer[MaxTextExtent]; + + const char + *value; + + Image + *magick_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + size_t + length; + + char + *p; + + ssize_t + i; + + void + *blob; + + /* + Write logo image. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + magick_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (magick_image == (Image *) NULL) + ThrowWriterException(ResourceLimitError,image->exception.reason); + write_info=CloneImageInfo(image_info); + /* + Set output format. + */ + *write_info->filename='\0'; + value=GetImageOption(image_info,"h:format"); + if (value == (char *) NULL) + value=GetImageOption(image_info,"magick:format"); + + if ((value == (char *) NULL) || (IsOptionMember("H",value) != MagickFalse) || + (IsOptionMember("MAGICK",value) != MagickFalse)) + { + /* + Use default GIF or PNM. + */ + if (magick_image->storage_class == DirectClass) + (void) CopyMagickString(write_info->magick,"PNM",MaxTextExtent); + else + (void) CopyMagickString(write_info->magick,"GIF",MaxTextExtent); + } + else + (void) CopyMagickString(write_info->magick,value,MaxTextExtent); /* use the requested format */ + blob=ImageToBlob(write_info,magick_image,&length,&image->exception); + magick_image=DestroyImage(magick_image); + if (blob == (void *) NULL) + { + (void) DestroyImageInfo(write_info); + return(MagickFalse); + } + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + { + blob=RelinquishMagickMemory(blob); + (void) DestroyImageInfo(write_info); + return(status); + } + (void) WriteBlobString(image,"/*\n"); + (void) FormatLocaleString(buffer,MaxTextExtent," %s (%s).\n", + image->filename,write_info->magick); + (void) DestroyImageInfo(write_info); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"*/\n"); + (void) WriteBlobString(image,"static const unsigned char\n"); + (void) WriteBlobString(image," MagickImage[] =\n"); + (void) WriteBlobString(image," {\n"); + (void) WriteBlobString(image," "); + p=(char *) blob; + for (i=0; i < (ssize_t) length ; i++) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"0x%02X%s",*p & 0xff, + (i+1) < (ssize_t) length ? ", " : ""); + (void) WriteBlobString(image,buffer); + if (((i+1) % 12) == 0) + { + (void) CopyMagickString(buffer,"\n ",MaxTextExtent); + (void) WriteBlobString(image,buffer); + } + p++; + } + (void) WriteBlobString(image,"\n };\n"); + (void) CloseBlob(image); + blob=RelinquishMagickMemory(blob); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/map.c b/ImageMagick-6.9.12-44/coders/map.c new file mode 100644 index 0000000..f5646b2 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/map.c @@ -0,0 +1,463 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M AAA PPPP % +% MM MM A A P P % +% M M M AAAAA PPPP % +% M M A A P % +% M M A A P % +% % +% % +% Read/Write Image Colormaps as an Image File. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/histogram.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMAPImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M A P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMAPImage() reads an image of raw RGB colormap and colormap index +% bytes and returns it. It allocates the memory necessary for the new Image +% structure and returns a pointer to the new image. +% +% The format of the ReadMAPImage method is: +% +% Image *ReadMAPImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMAPImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + IndexPacket + index; + + MagickBooleanType + status; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + i; + + unsigned char + *p; + + size_t + depth, + packet_size, + quantum; + + ssize_t + count, + y; + + unsigned char + *colormap, + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Initialize image structure. + */ + image->storage_class=PseudoClass; + status=AcquireImageColormap(image,(size_t) + (image->offset != 0 ? image->offset : 256)); + if (status == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + depth=GetImageQuantumDepth(image,MagickTrue); + packet_size=(size_t) (depth/8); + pixels=(unsigned char *) AcquireQuantumMemory(image->columns,packet_size* + sizeof(*pixels)); + packet_size=(size_t) (depth > 8 ? 6UL : 3UL); + colormap=(unsigned char *) AcquireQuantumMemory(image->colors,packet_size* + sizeof(*colormap)); + if ((pixels == (unsigned char *) NULL) || + (colormap == (unsigned char *) NULL)) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Read image colormap. + */ + count=ReadBlob(image,packet_size*image->colors,colormap); + if (count != (ssize_t) (packet_size*image->colors)) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + p=colormap; + if (image->depth <= 8) + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=ScaleCharToQuantum(*p++); + image->colormap[i].green=ScaleCharToQuantum(*p++); + image->colormap[i].blue=ScaleCharToQuantum(*p++); + } + else + for (i=0; i < (ssize_t) image->colors; i++) + { + quantum=(*p++ << 8); + quantum|=(*p++); + image->colormap[i].red=(Quantum) quantum; + quantum=(*p++ << 8); + quantum|=(*p++); + image->colormap[i].green=(Quantum) quantum; + quantum=(*p++ << 8); + quantum|=(*p++); + image->colormap[i].blue=(Quantum) quantum; + } + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Read image pixels. + */ + packet_size=(size_t) (depth/8); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=pixels; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + count=ReadBlob(image,(size_t) packet_size*image->columns,pixels); + if (count != (ssize_t) (packet_size*image->columns)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + index=ConstrainColormapIndex(image,*p); + p++; + if (image->colors > 256) + { + index=ConstrainColormapIndex(image,((size_t) index << 8)+(*p)); + p++; + } + SetPixelIndex(indexes+x,index); + SetPixelRGBO(q,image->colormap+(ssize_t) index); + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (y < (ssize_t) image->rows) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M A P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMAPImage() adds attributes for the MAP image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMAPImage method is: +% +% size_t RegisterMAPImage(void) +% +*/ +ModuleExport size_t RegisterMAPImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MAP"); + entry->decoder=(DecodeImageHandler *) ReadMAPImage; + entry->encoder=(EncodeImageHandler *) WriteMAPImage; + entry->adjoin=MagickFalse; + entry->format_type=ExplicitFormatType; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Colormap intensities and indices"); + entry->magick_module=ConstantString("MAP"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M A P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMAPImage() removes format registrations made by the +% MAP module from the list of supported formats. +% +% The format of the UnregisterMAPImage method is: +% +% UnregisterMAPImage(void) +% +*/ +ModuleExport void UnregisterMAPImage(void) +{ + (void) UnregisterMagickInfo("MAP"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M A P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMAPImage() writes an image to a file as red, green, and blue +% colormap bytes followed by the colormap indexes. +% +% The format of the WriteMAPImage method is: +% +% MagickBooleanType WriteMAPImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% +*/ +static MagickBooleanType WriteMAPImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + status; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + unsigned char + *q; + + size_t + depth, + packet_size; + + ssize_t + y; + + unsigned char + *colormap, + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Allocate colormap. + */ + if (SetImageType(image,PaletteType) == MagickFalse) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + depth=GetImageQuantumDepth(image,MagickTrue); + packet_size=(size_t) (depth/8); + pixels=(unsigned char *) AcquireQuantumMemory(image->columns,packet_size* + sizeof(*pixels)); + packet_size=(size_t) (image->colors > 256 ? 6UL : 3UL); + colormap=(unsigned char *) AcquireQuantumMemory(image->colors,packet_size* + sizeof(*colormap)); + if ((pixels == (unsigned char *) NULL) || + (colormap == (unsigned char *) NULL)) + { + if (colormap != (unsigned char *) NULL) + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + if (pixels != (unsigned char *) NULL) + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Write colormap to file. + */ + q=colormap; + if (image->colors <= 256) + for (i=0; i < (ssize_t) image->colors; i++) + { + *q++=(unsigned char) ScaleQuantumToChar(image->colormap[i].red); + *q++=(unsigned char) ScaleQuantumToChar(image->colormap[i].green); + *q++=(unsigned char) ScaleQuantumToChar(image->colormap[i].blue); + } + else + for (i=0; i < (ssize_t) image->colors; i++) + { + *q++=(unsigned char) (ScaleQuantumToShort(image->colormap[i].red) >> 8); + *q++=(unsigned char) (ScaleQuantumToShort(image->colormap[i].red) & 0xff); + *q++=(unsigned char) (ScaleQuantumToShort(image->colormap[i].green) >> 8); + *q++=(unsigned char) (ScaleQuantumToShort(image->colormap[i].green) & + 0xff); + *q++=(unsigned char) (ScaleQuantumToShort(image->colormap[i].blue) >> 8); + *q++=(unsigned char) (ScaleQuantumToShort(image->colormap[i].blue) & + 0xff); + } + (void) WriteBlob(image,packet_size*image->colors,colormap); + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + /* + Write image pixels to file. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + q=pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (image->colors > 256) + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x) >> 8); + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + } + (void) WriteBlob(image,(size_t) (q-pixels),pixels); + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/mask.c b/ImageMagick-6.9.12-44/coders/mask.c new file mode 100644 index 0000000..d0c407a --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/mask.c @@ -0,0 +1,245 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M AAA SSSSS K K % +% MM MM A A SS K K % +% M M M AAAAA SSS KKK % +% M M A A SS K K % +% M M A A SSSSS K K % +% % +% % +% Write Mask File. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/constitute.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMASKImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M A S K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMASKImage returns the image mask associated with the image. +% +% The format of the ReadMASKImage method is: +% +% Image *ReadMASKImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMASKImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + ImageInfo + *read_info; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) FormatLocaleString(read_info->filename,MagickPathExtent, + "miff:%s",image_info->filename); + image=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (image != (Image *) NULL) + { + MagickBooleanType + status; + + status=GrayscaleImage(image,image->intensity); + if (status == MagickFalse) + image=DestroyImage(image); + } + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M A S K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMASKImage() adds attributes for the MASK image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMASKImage method is: +% +% size_t RegisterMASKImage(void) +% +*/ +ModuleExport size_t RegisterMASKImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MASK"); + entry->decoder=(DecodeImageHandler *) ReadMASKImage; + entry->encoder=(EncodeImageHandler *) WriteMASKImage; + entry->description=ConstantString("Image Clip Mask"); + entry->magick_module=ConstantString("MASK"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M A S K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMASKImage() removes format registrations made by the +% MASK module from the list of supported formats. +% +% The format of the UnregisterMASKImage method is: +% +% UnregisterMASKImage(void) +% +*/ +ModuleExport void UnregisterMASKImage(void) +{ + (void) UnregisterMagickInfo("MASK"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M A S K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMASKImage() writes an image mask to a file. +% +% The format of the WriteMASKImage method is: +% +% MagickBooleanType WriteMASKImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteMASKImage(const ImageInfo *image_info, + Image *image) +{ + Image + *mask_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + if (image->mask == (Image *) NULL) + ThrowWriterException(CoderError,"ImageDoesNotHaveAMask"); + mask_image=CloneImage(image->mask,0,0,MagickTrue,&image->exception); + if (mask_image == (Image *) NULL) + return(MagickFalse); + (void) SetImageType(mask_image,TrueColorType); + (void) CopyMagickString(mask_image->filename,image->filename,MaxTextExtent); + write_info=CloneImageInfo(image_info); + *write_info->magick='\0'; + (void) SetImageInfo(write_info,1,&image->exception); + if ((*write_info->magick == '\0') || + (LocaleCompare(write_info->magick,"MASK") == 0)) + (void) FormatLocaleString(mask_image->filename,MaxTextExtent,"miff:%s", + write_info->filename); + status=WriteImage(write_info,mask_image); + mask_image=DestroyImage(mask_image); + write_info=DestroyImageInfo(write_info); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/mat.c b/ImageMagick-6.9.12-44/coders/mat.c new file mode 100644 index 0000000..fc5a610 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/mat.c @@ -0,0 +1,1756 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% M M AAA TTTTT L AAA BBBB % +% MM MM A A T L A A B B % +% M M M AAAAA T L AAAAA BBBB % +% M M A A T L A A B B % +% M M A A T LLLLL A A BBBB % +% % +% % +% Read MATLAB Image Format % +% % +% Software Design % +% Jaroslav Fojtik % +% 2001-2008 % +% % +% % +% Permission is hereby granted, free of charge, to any person obtaining a % +% copy of this software and associated documentation files ("ImageMagick"), % +% to deal in ImageMagick without restriction, including without limitation % +% the rights to use, copy, modify, merge, publish, distribute, sublicense, % +% and/or sell copies of ImageMagick, and to permit persons to whom the % +% ImageMagick is furnished to do so, subject to the following conditions: % +% % +% The above copyright notice and this permission notice shall be included in % +% all copies or substantial portions of ImageMagick. % +% % +% The software is provided "as is", without warranty of any kind, express or % +% implied, including but not limited to the warranties of merchantability, % +% fitness for a particular purpose and noninfringement. In no event shall % +% ImageMagick Studio be liable for any claim, damages or other liability, % +% whether in an action of contract, tort or otherwise, arising from, out of % +% or in connection with ImageMagick or the use or other dealings in % +% ImageMagick. % +% % +% Except as contained in this notice, the name of the ImageMagick Studio % +% shall not be used in advertising or otherwise to promote the sale, use or % +% other dealings in ImageMagick without prior written authorization from the % +% ImageMagick Studio. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace-private.h" +#include "magick/distort.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/timer-private.h" +#include "magick/transform.h" +#include "magick/utility-private.h" +#if defined(MAGICKCORE_ZLIB_DELEGATE) + #include "zlib.h" +#endif + +/* + Forward declaration. +*/ +static MagickBooleanType + WriteMATImage(const ImageInfo *,Image *); + + +/* Auto coloring method, sorry this creates some artefact inside data +MinReal+j*MaxComplex = red MaxReal+j*MaxComplex = black +MinReal+j*0 = white MaxReal+j*0 = black +MinReal+j*MinComplex = blue MaxReal+j*MinComplex = black +*/ + +typedef struct +{ + char identific[124]; + unsigned short Version; + char EndianIndicator[2]; + unsigned int DataType; + unsigned int ObjectSize; + unsigned int unknown1; + unsigned int unknown2; + + unsigned short unknown5; + unsigned char StructureFlag; + unsigned char StructureClass; + unsigned int unknown3; + unsigned int unknown4; + unsigned int DimFlag; + + unsigned int SizeX; + unsigned int SizeY; + unsigned short Flag1; + unsigned short NameFlag; +} +MATHeader; + +static const char + MonthsTab[12][4] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; + +static const char + DayOfWTab[7][4] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; + +static const char + OsDesc[] = +#if defined(MAGICKCORE_WINDOWS_SUPPORT) + "PCWIN"; +#else + #ifdef __APPLE__ + "MAC"; + #else + "LNX86"; + #endif +#endif + +typedef enum + { + miINT8 = 1, /* 8 bit signed */ + miUINT8, /* 8 bit unsigned */ + miINT16, /* 16 bit signed */ + miUINT16, /* 16 bit unsigned */ + miINT32, /* 32 bit signed */ + miUINT32, /* 32 bit unsigned */ + miSINGLE, /* IEEE 754 single precision float */ + miRESERVE1, + miDOUBLE, /* IEEE 754 double precision float */ + miRESERVE2, + miRESERVE3, + miINT64, /* 64 bit signed */ + miUINT64, /* 64 bit unsigned */ + miMATRIX, /* MATLAB array */ + miCOMPRESSED, /* Compressed Data */ + miUTF8, /* Unicode UTF-8 Encoded Character Data */ + miUTF16, /* Unicode UTF-16 Encoded Character Data */ + miUTF32 /* Unicode UTF-32 Encoded Character Data */ + } mat5_data_type; + +typedef enum + { + mxCELL_CLASS=1, /* cell array */ + mxSTRUCT_CLASS, /* structure */ + mxOBJECT_CLASS, /* object */ + mxCHAR_CLASS, /* character array */ + mxSPARSE_CLASS, /* sparse array */ + mxDOUBLE_CLASS, /* double precision array */ + mxSINGLE_CLASS, /* single precision floating point */ + mxINT8_CLASS, /* 8 bit signed integer */ + mxUINT8_CLASS, /* 8 bit unsigned integer */ + mxINT16_CLASS, /* 16 bit signed integer */ + mxUINT16_CLASS, /* 16 bit unsigned integer */ + mxINT32_CLASS, /* 32 bit signed integer */ + mxUINT32_CLASS, /* 32 bit unsigned integer */ + mxINT64_CLASS, /* 64 bit signed integer */ + mxUINT64_CLASS, /* 64 bit unsigned integer */ + mxFUNCTION_CLASS /* Function handle */ + } arrayclasstype; + +#define FLAG_COMPLEX 0x8 +#define FLAG_GLOBAL 0x4 +#define FLAG_LOGICAL 0x2 + +static const QuantumType z2qtype[4] = {GrayQuantum, BlueQuantum, GreenQuantum, RedQuantum}; + + +static void InsertComplexDoubleRow(double *p,int y,Image *image,double MinVal, + double MaxVal) +{ + ExceptionInfo + *exception; + + double f; + int x; + PixelPacket *q; + + if (MinVal >= 0) + MinVal = -1; + if (MaxVal <= 0) + MaxVal = 1; + + exception=(&image->exception); + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + return; + for (x = 0; x < (ssize_t) image->columns; x++) + { + if (*p > 0) + { + f=(*p/MaxVal)*(Quantum) (QuantumRange-GetPixelRed(q)); + if ((f+GetPixelRed(q)) >= QuantumRange) + SetPixelRed(q,QuantumRange); + else + SetPixelRed(q,GetPixelRed(q)+ClampToQuantum(f)); + f=GetPixelGreen(q)-f/2.0; + if (f <= 0.0) + { + SetPixelGreen(q,0); + SetPixelBlue(q,0); + } + else + { + SetPixelBlue(q,ClampToQuantum(f)); + SetPixelGreen(q,ClampToQuantum(f)); + } + } + if (*p < 0) + { + f=(*p/MinVal)*(Quantum) (QuantumRange-GetPixelBlue(q)); + if ((f+GetPixelBlue(q)) >= QuantumRange) + SetPixelBlue(q,QuantumRange); + else + SetPixelBlue(q,GetPixelBlue(q)+ClampToQuantum(f)); + f=GetPixelGreen(q)-f/2.0; + if (f <= 0.0) + { + SetPixelRed(q,0); + SetPixelGreen(q,0); + } + else + { + SetPixelRed(q,ClampToQuantum(f)); + SetPixelGreen(q,ClampToQuantum(f)); + } + } + p++; + q++; + } + if (!SyncAuthenticPixels(image,exception)) + return; + return; +} + + +static void InsertComplexFloatRow(float *p,int y,Image *image,double MinVal, + double MaxVal) +{ + ExceptionInfo + *exception; + + double f; + int x; + PixelPacket *q; + + if (MinVal >= 0) + MinVal = -1; + if (MaxVal <= 0) + MaxVal = 1; + + exception=(&image->exception); + q = QueueAuthenticPixels(image, 0, y, image->columns, 1,exception); + if (q == (PixelPacket *) NULL) + return; + for (x = 0; x < (ssize_t) image->columns; x++) + { + if (*p > 0) + { + f=(*p/MaxVal)*(Quantum) (QuantumRange-GetPixelRed(q)); + if ((f+GetPixelRed(q)) < QuantumRange) + SetPixelRed(q,GetPixelRed(q)+ClampToQuantum(f)); + else + SetPixelRed(q,QuantumRange); + f/=2.0; + if (f < GetPixelGreen(q)) + { + SetPixelBlue(q,GetPixelBlue(q)-ClampToQuantum(f)); + SetPixelGreen(q,GetPixelBlue(q)); + } + else + { + SetPixelGreen(q,0); + SetPixelBlue(q,0); + } + } + if (*p < 0) + { + f=(*p/MaxVal)*(Quantum) (QuantumRange-GetPixelBlue(q)); + if ((f+GetPixelBlue(q)) < QuantumRange) + SetPixelBlue(q,GetPixelBlue(q)+ClampToQuantum(f)); + else + SetPixelBlue(q,QuantumRange); + f/=2.0; + if (f < GetPixelGreen(q)) + { + SetPixelRed(q,GetPixelRed(q)-ClampToQuantum(f)); + SetPixelGreen(q,GetPixelRed(q)); + } + else + { + SetPixelGreen(q,0); + SetPixelRed(q,0); + } + } + p++; + q++; + } + if (!SyncAuthenticPixels(image,exception)) + return; + return; +} + + +/************** READERS ******************/ + +/* This function reads one block of floats*/ +static void ReadBlobFloatsLSB(Image * image, size_t len, float *data) +{ + while (len >= 4) + { + *data++ = ReadBlobFloat(image); + len -= sizeof(float); + } + if (len > 0) + (void) SeekBlob(image, len, SEEK_CUR); +} + +static void ReadBlobFloatsMSB(Image * image, size_t len, float *data) +{ + while (len >= 4) + { + *data++ = ReadBlobFloat(image); + len -= sizeof(float); + } + if (len > 0) + (void) SeekBlob(image, len, SEEK_CUR); +} + +/* This function reads one block of doubles*/ +static void ReadBlobDoublesLSB(Image * image, size_t len, double *data) +{ + while (len >= 8) + { + *data++ = ReadBlobDouble(image); + len -= sizeof(double); + } + if (len > 0) + (void) SeekBlob(image, len, SEEK_CUR); +} + +static void ReadBlobDoublesMSB(Image * image, size_t len, double *data) +{ + while (len >= 8) + { + *data++ = ReadBlobDouble(image); + len -= sizeof(double); + } + if (len > 0) + (void) SeekBlob(image, len, SEEK_CUR); +} + +/* Calculate minimum and maximum from a given block of data */ +static void CalcMinMax(Image *image, int endian_indicator, ssize_t SizeX, ssize_t SizeY, size_t CellType, unsigned ldblk, void *BImgBuff, double *Min, double *Max) +{ +MagickOffsetType filepos; +ssize_t i, x; +void (*ReadBlobDoublesXXX)(Image * image, size_t len, double *data); +void (*ReadBlobFloatsXXX)(Image * image, size_t len, float *data); +double *dblrow; +float *fltrow; + + if (endian_indicator == LSBEndian) + { + ReadBlobDoublesXXX = ReadBlobDoublesLSB; + ReadBlobFloatsXXX = ReadBlobFloatsLSB; + } + else /* MI */ + { + ReadBlobDoublesXXX = ReadBlobDoublesMSB; + ReadBlobFloatsXXX = ReadBlobFloatsMSB; + } + + filepos = TellBlob(image); /* Please note that file seeking occurs only in the case of doubles */ + for (i = 0; i < SizeY; i++) + { + if (CellType==miDOUBLE) + { + ReadBlobDoublesXXX(image, ldblk, (double *)BImgBuff); + dblrow = (double *)BImgBuff; + if (i == 0) + { + *Min = *Max = *dblrow; + } + for (x = 0; x < SizeX; x++) + { + if (*Min > *dblrow) + *Min = *dblrow; + if (*Max < *dblrow) + *Max = *dblrow; + dblrow++; + } + } + if (CellType==miSINGLE) + { + ReadBlobFloatsXXX(image, ldblk, (float *)BImgBuff); + fltrow = (float *)BImgBuff; + if (i == 0) + { + *Min = *Max = *fltrow; + } + for (x = 0; x < (ssize_t) SizeX; x++) + { + if (*Min > *fltrow) + *Min = *fltrow; + if (*Max < *fltrow) + *Max = *fltrow; + fltrow++; + } + } + } + (void) SeekBlob(image, filepos, SEEK_SET); +} + + +static void FixSignedValues(PixelPacket *q, ssize_t y) +{ + if (y == 0) + return; + + while(y-->0) + { + /* Please note that negative values will overflow + Q=8; QuantumRange=255: <0;127> + 127+1 = <128; 255> + <-1;-128> + 127+1 = <0; 127> */ + SetPixelRed(q,GetPixelRed(q)+QuantumRange/2+1); + SetPixelGreen(q,GetPixelGreen(q)+QuantumRange/2+1); + SetPixelBlue(q,GetPixelBlue(q)+QuantumRange/2+1); + q++; + } +} + + +/** Fix whole row of logical/binary data. It means pack it. */ +static void FixLogical(unsigned char *Buff,ssize_t ldblk) +{ +unsigned char mask=128; +unsigned char *BuffL = Buff; +unsigned char val = 0; + + if (ldblk == 0) + return; + + while(ldblk-->0) + { + if(*Buff++ != 0) + val |= mask; + + mask >>= 1; + if(mask==0) + { + *BuffL++ = val; + val = 0; + mask = 128; + } + + } + *BuffL = val; +} + +#if defined(MAGICKCORE_ZLIB_DELEGATE) +static voidpf AcquireZIPMemory(voidpf context,unsigned int items, + unsigned int size) +{ + (void) context; + return((voidpf) AcquireQuantumMemory(items,size)); +} + +static void RelinquishZIPMemory(voidpf context,voidpf memory) +{ + (void) context; + memory=RelinquishMagickMemory(memory); +} +#endif + +#if defined(MAGICKCORE_ZLIB_DELEGATE) +/** This procedure decompreses an image block for a new MATLAB format. */ +static Image *decompress_block(Image *orig, unsigned int *Size, ImageInfo *clone_info, ExceptionInfo *exception) +{ + +Image *image2; +void *cache_block, *decompress_block; +z_stream zip_info; +FILE *mat_file; +size_t magick_size; +size_t extent; +int file; + +int status; +int zip_status; +ssize_t TotalSize = 0; + + if(clone_info==NULL) return NULL; + if(clone_info->file) /* Close file opened from previous transaction. */ + { + fclose(clone_info->file); + clone_info->file = NULL; + (void) remove_utf8(clone_info->filename); + } + + cache_block = AcquireQuantumMemory((size_t)(*Size< MagickMinBufferExtent) ? *Size: MagickMinBufferExtent,sizeof(unsigned char *)); + if(cache_block==NULL) return NULL; + decompress_block = AcquireQuantumMemory((size_t)(4096),sizeof(unsigned char *)); + if(decompress_block==NULL) + { + RelinquishMagickMemory(cache_block); + return NULL; + } + + mat_file=0; + file = AcquireUniqueFileResource(clone_info->filename); + if (file != -1) + mat_file = fdopen(file,"w"); + if(!mat_file) + { + RelinquishMagickMemory(cache_block); + RelinquishMagickMemory(decompress_block); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Cannot create file stream for decompressed image"); + return NULL; + } + + zip_info.zalloc=AcquireZIPMemory; + zip_info.zfree=RelinquishZIPMemory; + zip_info.opaque = (voidpf) NULL; + zip_status = inflateInit(&zip_info); + if (zip_status != Z_OK) + { + RelinquishMagickMemory(cache_block); + RelinquishMagickMemory(decompress_block); + (void) ThrowMagickException(exception,GetMagickModule(),CorruptImageError, + "UnableToUncompressImage","`%s'",clone_info->filename); + (void) fclose(mat_file); + RelinquishUniqueFileResource(clone_info->filename); + return NULL; + } + /* zip_info.next_out = 8*4;*/ + + zip_info.avail_in = 0; + zip_info.total_out = 0; + while(*Size>0 && !EOFBlob(orig)) + { + magick_size = ReadBlob(orig, (*Size < MagickMinBufferExtent) ? *Size : MagickMinBufferExtent, (unsigned char *) cache_block); + if (magick_size == 0) + break; + zip_info.next_in = (Bytef *) cache_block; + zip_info.avail_in = (uInt) magick_size; + + while(zip_info.avail_in>0) + { + zip_info.avail_out = 4096; + zip_info.next_out = (Bytef *) decompress_block; + zip_status = inflate(&zip_info,Z_NO_FLUSH); + if ((zip_status != Z_OK) && (zip_status != Z_STREAM_END)) + break; + extent=fwrite(decompress_block, 4096-zip_info.avail_out, 1, mat_file); + (void) extent; + TotalSize += 4096-zip_info.avail_out; + + if(zip_status == Z_STREAM_END) goto DblBreak; + } + if ((zip_status != Z_OK) && (zip_status != Z_STREAM_END)) + break; + + *Size -= (unsigned int) magick_size; + } +DblBreak: + + inflateEnd(&zip_info); + (void)fclose(mat_file); + RelinquishMagickMemory(cache_block); + RelinquishMagickMemory(decompress_block); + *Size = TotalSize; + + if((clone_info->file=fopen(clone_info->filename,"rb"))==NULL) goto UnlinkFile; + if( (image2 = AcquireImage(clone_info))==NULL ) goto EraseFile; + status = OpenBlob(clone_info,image2,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + DeleteImageFromList(&image2); +EraseFile: + fclose(clone_info->file); + clone_info->file = NULL; +UnlinkFile: + RelinquishUniqueFileResource(clone_info->filename); + return NULL; + } + + return image2; +} +#endif + +static Image *ReadMATImageV4(const ImageInfo *image_info,Image *image, + ExceptionInfo *exception) +{ + typedef struct { + unsigned char Type[4]; + unsigned int nRows; + unsigned int nCols; + unsigned int imagf; + unsigned int nameLen; + } MAT4_HDR; + + EndianType + endian; + + Image + *rotated_image; + + MagickBooleanType + status; + + MAT4_HDR + HDR; + + QuantumInfo + *quantum_info; + + QuantumFormatType + format_type; + + ssize_t + count, + i, + ldblk, + y; + + unsigned char + *pixels; + + unsigned int + depth; + + status=MagickTrue; + (void) SeekBlob(image,0,SEEK_SET); + while (EOFBlob(image) == MagickFalse) + { + /* + Object parser. + */ + ldblk=ReadBlobLSBLong(image); + if (EOFBlob(image) != MagickFalse) + break; + if ((ldblk > 9999) || (ldblk < 0)) + break; + HDR.Type[3]=ldblk % 10; ldblk /= 10; /* T digit */ + HDR.Type[2]=ldblk % 10; ldblk /= 10; /* P digit */ + HDR.Type[1]=ldblk % 10; ldblk /= 10; /* O digit */ + HDR.Type[0]=ldblk; /* M digit */ + if (HDR.Type[3] != 0) + break; /* Data format */ + if (HDR.Type[2] != 0) + break; /* Always 0 */ + if (HDR.Type[0] == 0) + { + HDR.nRows=ReadBlobLSBLong(image); + HDR.nCols=ReadBlobLSBLong(image); + HDR.imagf=ReadBlobLSBLong(image); + HDR.nameLen=ReadBlobLSBLong(image); + endian=LSBEndian; + } + else + { + HDR.nRows=ReadBlobMSBLong(image); + HDR.nCols=ReadBlobMSBLong(image); + HDR.imagf=ReadBlobMSBLong(image); + HDR.nameLen=ReadBlobMSBLong(image); + endian=MSBEndian; + } + if ((HDR.imagf !=0) && (HDR.imagf !=1)) + break; + if (HDR.nameLen > 0xFFFF) + return(DestroyImageList(image)); + for (i=0; i < (ssize_t) HDR.nameLen; i++) + { + int + byte; + + /* + Skip matrix name. + */ + byte=ReadBlobByte(image); + if (byte == EOF) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + } + image->columns=(size_t) HDR.nRows; + image->rows=(size_t) HDR.nCols; + if ((image->columns == 0) || (image->rows == 0)) + return(DestroyImageList(image)); + if (image_info->ping != MagickFalse) + { + Swap(image->columns,image->rows); + if(HDR.imagf==1) ldblk *= 2; + SeekBlob(image, HDR.nCols*ldblk, SEEK_CUR); + if ((image->columns == 0) || (image->rows == 0)) + return(image->previous == (Image *) NULL ? DestroyImageList(image) + : image); + goto skip_reading_current; + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + return(DestroyImageList(image)); + (void) SetImageBackgroundColor(image); + (void) SetImageColorspace(image,GRAYColorspace); + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + return(DestroyImageList(image)); + switch(HDR.Type[1]) + { + case 0: + format_type=FloatingPointQuantumFormat; + depth=64; + break; + case 1: + format_type=FloatingPointQuantumFormat; + depth=32; + break; + case 2: + format_type=UnsignedQuantumFormat; + depth=16; + break; + case 3: + format_type=SignedQuantumFormat; + depth=16; + break; + case 4: + format_type=UnsignedQuantumFormat; + depth=8; + break; + default: + format_type=UnsignedQuantumFormat; + depth=8; + break; + } + image->depth=depth; + if (HDR.Type[0] != 0) + SetQuantumEndian(image,quantum_info,MSBEndian); + status=SetQuantumFormat(image,quantum_info,format_type); + status=SetQuantumDepth(image,quantum_info,depth); + status=SetQuantumEndian(image,quantum_info,endian); + SetQuantumScale(quantum_info,1.0); + pixels=(unsigned char *) GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + count=ReadBlob(image,depth/8*image->columns,(unsigned char *) pixels); + if (count == -1) + break; + q=QueueAuthenticPixels(image,0,image->rows-y-1,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + GrayQuantum,pixels,exception); + if ((HDR.Type[1] == 2) || (HDR.Type[1] == 3)) + FixSignedValues(q,image->columns); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (HDR.imagf == 1) + for (y=0; y < (ssize_t) image->rows; y++) + { + /* + Read complex pixels. + */ + count=ReadBlob(image,depth/8*image->columns,(unsigned char *) pixels); + if (count == -1) + break; + if (HDR.Type[1] == 0) + InsertComplexDoubleRow((double *) pixels,y,image,0,0); + else + InsertComplexFloatRow((float *) pixels,y,image,0,0); + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + rotated_image=RotateImage(image,90.0,exception); + if (rotated_image != (Image *) NULL) + { + rotated_image->page.x=0; + rotated_image->page.y=0; + rotated_image->colors = image->colors; + DestroyBlob(rotated_image); + rotated_image->blob=ReferenceBlob(image->blob); + AppendImageToList(&image,rotated_image); + DeleteImageFromList(&image); + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + /* + Allocate next image structure. + */ +skip_reading_current: + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M A T L A B i m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMATImage() reads an MAT X image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadMATImage method is: +% +% Image *ReadMATImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: Method ReadMATImage returns a pointer to the image after +% reading. A null image is returned if there is a memory shortage or if +% the image cannot be read. +% +% o image_info: Specifies a pointer to a ImageInfo structure. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMATImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image *image, *image2=NULL, + *rotated_image; + PixelPacket *q; + + unsigned int status; + MATHeader MATLAB_HDR; + size_t size; + size_t CellType; + QuantumInfo *quantum_info; + ImageInfo *clone_info; + int i; + ssize_t ldblk; + unsigned char *BImgBuff = NULL; + double MinVal, MaxVal; + size_t Unknown6; + unsigned z, z2; + unsigned Frames; + int logging; + int sample_size; + MagickOffsetType filepos=0x80; + + unsigned int (*ReadBlobXXXLong)(Image *image); + unsigned short (*ReadBlobXXXShort)(Image *image); + void (*ReadBlobDoublesXXX)(Image * image, size_t len, double *data); + void (*ReadBlobFloatsXXX)(Image * image, size_t len, float *data); + + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + logging = LogMagickEvent(CoderEvent,GetMagickModule(),"enter"); + + /* + Open image file. + */ + quantum_info=(QuantumInfo *) NULL; + image = AcquireImage(image_info); + image2 = (Image *) NULL; + + status = OpenBlob(image_info, image, ReadBinaryBlobMode, exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read MATLAB image. + */ + clone_info=(ImageInfo *) NULL; + if(ReadBlob(image,124,(unsigned char *) &MATLAB_HDR.identific) != 124) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (strncmp(MATLAB_HDR.identific,"MATLAB",6) != 0) + { + image=ReadMATImageV4(image_info,image,exception); + if (image == NULL) + { + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + return((Image *) NULL); + } + goto END_OF_READING; + } + MATLAB_HDR.Version = ReadBlobLSBShort(image); + if(ReadBlob(image,2,(unsigned char *) &MATLAB_HDR.EndianIndicator) != 2) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + + if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule()," Endian %c%c", + MATLAB_HDR.EndianIndicator[0],MATLAB_HDR.EndianIndicator[1]); + if (!strncmp(MATLAB_HDR.EndianIndicator, "IM", 2)) + { + ReadBlobXXXLong = ReadBlobLSBLong; + ReadBlobXXXShort = ReadBlobLSBShort; + ReadBlobDoublesXXX = ReadBlobDoublesLSB; + ReadBlobFloatsXXX = ReadBlobFloatsLSB; + image->endian = LSBEndian; + } + else if (!strncmp(MATLAB_HDR.EndianIndicator, "MI", 2)) + { + ReadBlobXXXLong = ReadBlobMSBLong; + ReadBlobXXXShort = ReadBlobMSBShort; + ReadBlobDoublesXXX = ReadBlobDoublesMSB; + ReadBlobFloatsXXX = ReadBlobFloatsMSB; + image->endian = MSBEndian; + } + else + { +MATLAB_KO: + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + + filepos = TellBlob(image); + while(filepos < (MagickOffsetType) GetBlobSize(image) && !EOFBlob(image)) /* object parser loop */ + { + Frames = 1; + if(filepos > (MagickOffsetType) GetBlobSize(image) || filepos < 0) + break; + if(SeekBlob(image,filepos,SEEK_SET) != filepos) break; + /* printf("pos=%X\n",TellBlob(image)); */ + + MATLAB_HDR.DataType = ReadBlobXXXLong(image); + if(EOFBlob(image)) break; + MATLAB_HDR.ObjectSize = ReadBlobXXXLong(image); + if(EOFBlob(image)) break; + if((MagickSizeType) (MATLAB_HDR.ObjectSize+filepos) >= GetBlobSize(image)) + goto MATLAB_KO; + filepos += (MagickOffsetType) MATLAB_HDR.ObjectSize + 4 + 4; + + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + clone_info=CloneImageInfo(image_info); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + image2 = image; +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if(MATLAB_HDR.DataType == miCOMPRESSED) + { + image2 = decompress_block(image,&MATLAB_HDR.ObjectSize,clone_info,exception); + if(image2==NULL) continue; + MATLAB_HDR.DataType = ReadBlobXXXLong(image2); /* replace compressed object type. */ + } +#endif + + if (MATLAB_HDR.DataType != miMATRIX) + { + clone_info=DestroyImageInfo(clone_info); +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if (image2 != image) + DeleteImageFromList(&image2); +#endif + continue; /* skip another objects. */ + } + + MATLAB_HDR.unknown1 = ReadBlobXXXLong(image2); + MATLAB_HDR.unknown2 = ReadBlobXXXLong(image2); + + MATLAB_HDR.unknown5 = ReadBlobXXXLong(image2); + MATLAB_HDR.StructureClass = MATLAB_HDR.unknown5 & 0xFF; + MATLAB_HDR.StructureFlag = (MATLAB_HDR.unknown5>>8) & 0xFF; + + MATLAB_HDR.unknown3 = ReadBlobXXXLong(image2); + if(image!=image2) + MATLAB_HDR.unknown4 = ReadBlobXXXLong(image2); /* ??? don't understand why ?? */ + MATLAB_HDR.unknown4 = ReadBlobXXXLong(image2); + MATLAB_HDR.DimFlag = ReadBlobXXXLong(image2); + MATLAB_HDR.SizeX = ReadBlobXXXLong(image2); + MATLAB_HDR.SizeY = ReadBlobXXXLong(image2); + + + switch(MATLAB_HDR.DimFlag) + { + case 8: z2=z=1; break; /* 2D matrix*/ + case 12: z2=z = ReadBlobXXXLong(image2); /* 3D matrix RGB*/ + Unknown6 = ReadBlobXXXLong(image2); + (void) Unknown6; + if(z!=3) + { + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + ThrowReaderException(CoderError, + "MultidimensionalMatricesAreNotSupported"); + } + break; + case 16: z2=z = ReadBlobXXXLong(image2); /* 4D matrix animation */ + if(z!=3 && z!=1) + { + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + ThrowReaderException(CoderError, + "MultidimensionalMatricesAreNotSupported"); + } + Frames = ReadBlobXXXLong(image2); + if (Frames == 0) + { + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + if (AcquireMagickResource(ListLengthResource,Frames) == MagickFalse) + { + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + ThrowReaderException(ResourceLimitError,"ListLengthExceedsLimit"); + } + break; + default: + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + ThrowReaderException(CoderError, "MultidimensionalMatricesAreNotSupported"); + } + + MATLAB_HDR.Flag1 = ReadBlobXXXShort(image2); + MATLAB_HDR.NameFlag = ReadBlobXXXShort(image2); + + if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), + "MATLAB_HDR.StructureClass %d",MATLAB_HDR.StructureClass); + if (MATLAB_HDR.StructureClass != mxCHAR_CLASS && + MATLAB_HDR.StructureClass != mxSINGLE_CLASS && /* float + complex float */ + MATLAB_HDR.StructureClass != mxDOUBLE_CLASS && /* double + complex double */ + MATLAB_HDR.StructureClass != mxINT8_CLASS && + MATLAB_HDR.StructureClass != mxUINT8_CLASS && /* uint8 + uint8 3D */ + MATLAB_HDR.StructureClass != mxINT16_CLASS && + MATLAB_HDR.StructureClass != mxUINT16_CLASS && /* uint16 + uint16 3D */ + MATLAB_HDR.StructureClass != mxINT32_CLASS && + MATLAB_HDR.StructureClass != mxUINT32_CLASS && /* uint32 + uint32 3D */ + MATLAB_HDR.StructureClass != mxINT64_CLASS && + MATLAB_HDR.StructureClass != mxUINT64_CLASS) /* uint64 + uint64 3D */ + { + if ((image2 != (Image*) NULL) && (image2 != image)) + { + CloseBlob(image2); + DeleteImageFromList(&image2); + } + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + ThrowReaderException(CoderError,"UnsupportedCellTypeInTheMatrix"); + } + + switch (MATLAB_HDR.NameFlag) + { + case 0: + size = ReadBlobXXXLong(image2); /* Object name string size */ + size = 4 * (((size_t) size + 3 + 1) / 4); + (void) SeekBlob(image2, size, SEEK_CUR); + break; + case 1: + case 2: + case 3: + case 4: + (void) ReadBlob(image2, 4, (unsigned char *) &size); /* Object name string */ + break; + default: + goto MATLAB_KO; + } + + CellType = ReadBlobXXXLong(image2); /* Additional object type */ + if (logging) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "MATLAB_HDR.CellType: %.20g",(double) CellType); + + /* data size */ + if (ReadBlob(image2, 4, (unsigned char *) &size) != 4) + goto MATLAB_KO; + +NEXT_FRAME: + switch (CellType) + { + case miINT8: + case miUINT8: + sample_size = 8; + if(MATLAB_HDR.StructureFlag & FLAG_LOGICAL) + image->depth = 1; + else + image->depth = 8; /* Byte type cell */ + ldblk = (ssize_t) MATLAB_HDR.SizeX; + break; + case miINT16: + case miUINT16: + sample_size = 16; + image->depth = 16; /* Word type cell */ + ldblk = (ssize_t) (2 * MATLAB_HDR.SizeX); + break; + case miINT32: + case miUINT32: + sample_size = 32; + image->depth = 32; /* Dword type cell */ + ldblk = (ssize_t) (4 * MATLAB_HDR.SizeX); + break; + case miINT64: + case miUINT64: + sample_size = 64; + image->depth = 64; /* Qword type cell */ + ldblk = (ssize_t) (8 * MATLAB_HDR.SizeX); + break; + case miSINGLE: + sample_size = 32; + image->depth = 32; /* double type cell */ + (void) SetImageOption(clone_info,"quantum:format","floating-point"); + if (MATLAB_HDR.StructureFlag & FLAG_COMPLEX) + { /* complex float type cell */ + } + ldblk = (ssize_t) (4 * MATLAB_HDR.SizeX); + break; + case miDOUBLE: + sample_size = 64; + image->depth = 64; /* double type cell */ + (void) SetImageOption(clone_info,"quantum:format","floating-point"); +DisableMSCWarning(4127) + if (sizeof(double) != 8) +RestoreMSCWarning + { + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + ThrowReaderException(CoderError, "IncompatibleSizeOfDouble"); + } + if (MATLAB_HDR.StructureFlag & FLAG_COMPLEX) + { /* complex double type cell */ + } + ldblk = (ssize_t) (8 * MATLAB_HDR.SizeX); + break; + default: + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + if (clone_info) + clone_info=DestroyImageInfo(clone_info); + ThrowReaderException(CoderError, "UnsupportedCellTypeInTheMatrix"); + } + (void) sample_size; + image->columns = MATLAB_HDR.SizeX; + image->rows = MATLAB_HDR.SizeY; + image->colors = GetQuantumRange(image->depth); + if (image->columns == 0 || image->rows == 0) + goto MATLAB_KO; + if((size_t)ldblk*MATLAB_HDR.SizeY > MATLAB_HDR.ObjectSize) + goto MATLAB_KO; + /* Image is gray when no complex flag is set and 2D Matrix */ + if ((MATLAB_HDR.DimFlag == 8) && + ((MATLAB_HDR.StructureFlag & FLAG_COMPLEX) == 0)) + { + SetImageColorspace(image,GRAYColorspace); + image->type=GrayscaleType; + } + + + /* + If ping is true, then only set image size and colors without + reading any image data. + */ + if (image_info->ping) + { + size_t temp = image->columns; + image->columns = image->rows; + image->rows = temp; + goto done_reading; /* !!!!!! BAD !!!! */ + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) SetImageBackgroundColor(image); + quantum_info=AcquireQuantumInfo(clone_info,image); + if (quantum_info == (QuantumInfo *) NULL) + { + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + if (quantum_info != (QuantumInfo *) NULL) + quantum_info=DestroyQuantumInfo(quantum_info); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + + /* ----- Load raster data ----- */ + BImgBuff = (unsigned char *) AcquireQuantumMemory((size_t) (ldblk),sizeof(double)); /* Ldblk was set in the check phase */ + if (BImgBuff == NULL) + { + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(BImgBuff,0,ldblk*sizeof(double)); + + MinVal = 0; + MaxVal = 0; + if (CellType==miDOUBLE || CellType==miSINGLE) /* Find Min and Max Values for floats */ + { + CalcMinMax(image2, image_info->endian, MATLAB_HDR.SizeX, MATLAB_HDR.SizeY, CellType, ldblk, BImgBuff, &quantum_info->minimum, &quantum_info->maximum); + } + + /* Main loop for reading all scanlines */ + if(z==1) z=0; /* read grey scanlines */ + /* else read color scanlines */ + do + { + for (i = 0; i < (ssize_t) MATLAB_HDR.SizeY; i++) + { + q=GetAuthenticPixels(image,0,MATLAB_HDR.SizeY-i-1,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), + " MAT set image pixels returns unexpected NULL on a row %u.", (unsigned)(MATLAB_HDR.SizeY-i-1)); + goto done_reading; /* Skip image rotation, when cannot set image pixels */ + } + if(ReadBlob(image2,ldblk,(unsigned char *)BImgBuff) != (ssize_t) ldblk) + { + if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), + " MAT cannot read scanrow %u from a file.", (unsigned)(MATLAB_HDR.SizeY-i-1)); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + if (clone_info != (ImageInfo *) NULL) + clone_info=DestroyImageInfo(clone_info); + if (quantum_info != (QuantumInfo *) NULL) + quantum_info=DestroyQuantumInfo(quantum_info); + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + if((CellType==miINT8 || CellType==miUINT8) && (MATLAB_HDR.StructureFlag & FLAG_LOGICAL)) + { + FixLogical((unsigned char *)BImgBuff,ldblk); + if(ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,z2qtype[z],BImgBuff,exception) <= 0) + { + ImportQuantumPixelsFailed: + if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), + " MAT failed to ImportQuantumPixels for a row %u", (unsigned)(MATLAB_HDR.SizeY-i-1)); + break; + } + } + else + { + if(ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,z2qtype[z],BImgBuff,exception) <= 0) + goto ImportQuantumPixelsFailed; + + if (z<=1 && /* fix only during a last pass z==0 || z==1 */ + (CellType==miINT8 || CellType==miINT16 || CellType==miINT32 || CellType==miINT64)) + FixSignedValues(q,MATLAB_HDR.SizeX); + } + + if (!SyncAuthenticPixels(image,exception)) + { + if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), + " MAT failed to sync image pixels for a row %u", (unsigned)(MATLAB_HDR.SizeY-i-1)); + goto ExitLoop; + } + } + } while(z-- >= 2); +ExitLoop: + + + /* Read complex part of numbers here */ + if (MATLAB_HDR.StructureFlag & FLAG_COMPLEX) + { /* Find Min and Max Values for complex parts of floats */ + CellType = ReadBlobXXXLong(image2); /* Additional object type */ + i = ReadBlobXXXLong(image2); /* size of a complex part - toss away*/ + + if (CellType==miDOUBLE || CellType==miSINGLE) + { + CalcMinMax(image2, image_info->endian, MATLAB_HDR.SizeX, MATLAB_HDR.SizeY, CellType, ldblk, BImgBuff, &MinVal, &MaxVal); + } + + if (CellType==miDOUBLE) + for (i = 0; i < (ssize_t) MATLAB_HDR.SizeY; i++) + { + ReadBlobDoublesXXX(image2, ldblk, (double *)BImgBuff); + if (EOFBlob(image) != MagickFalse) + break; + InsertComplexDoubleRow((double *)BImgBuff, i, image, MinVal, MaxVal); + } + + if (CellType==miSINGLE) + for (i = 0; i < (ssize_t) MATLAB_HDR.SizeY; i++) + { + ReadBlobFloatsXXX(image2, ldblk, (float *)BImgBuff); + if (EOFBlob(image) != MagickFalse) + break; + InsertComplexFloatRow((float *)BImgBuff, i, image, MinVal, MaxVal); + } + } + + /* Image is gray when no complex flag is set and 2D Matrix AGAIN!!! */ + if ((MATLAB_HDR.DimFlag == 8) && + ((MATLAB_HDR.StructureFlag & FLAG_COMPLEX) == 0)) + image->type=GrayscaleType; + if (image->depth == 1) + image->type=BilevelType; + + if(image2==image) + image2 = NULL; /* Remove shadow copy to an image before rotation. */ + + /* Rotate image. */ + rotated_image = RotateImage(image, 90.0, exception); + if (rotated_image != (Image *) NULL) + { + /* Remove page offsets added by RotateImage */ + rotated_image->page.x=0; + rotated_image->page.y=0; + rotated_image->colors = image->colors; + DestroyBlob(rotated_image); + rotated_image->blob=ReferenceBlob(image->blob); + AppendImageToList(&image,rotated_image); + DeleteImageFromList(&image); + } + +done_reading: + + if(image2!=NULL) + if(image2!=image) + { + DeleteImageFromList(&image2); + if(clone_info) + { + if(clone_info->file) + { + fclose(clone_info->file); + clone_info->file = NULL; + (void) remove_utf8(clone_info->filename); + } + } + } + if (EOFBlob(image) != MagickFalse) + break; + + /* Allocate next image structure. */ + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + AcquireNextImage(image_info,image); + if (image->next == (Image *) NULL) break; + image=SyncNextImageInList(image); + image->columns=image->rows=0; + image->colors=0; + + /* row scan buffer is no longer needed */ + RelinquishMagickMemory(BImgBuff); + BImgBuff = NULL; + if (quantum_info != (QuantumInfo *) NULL) + quantum_info=DestroyQuantumInfo(quantum_info); + + if(--Frames>0) + { + z = z2; + if(image2==NULL) image2 = image; + if(!EOFBlob(image) && TellBlob(image)file) + { + fclose(clone_info->file); + clone_info->file = NULL; + (void) unlink(clone_info->filename); + } + } + } + if (clone_info) + clone_info=DestroyImageInfo(clone_info); + } + +END_OF_READING: + RelinquishMagickMemory(BImgBuff); + if (quantum_info != (QuantumInfo *) NULL) + quantum_info=DestroyQuantumInfo(quantum_info); + CloseBlob(image); + + + { + Image *p; + ssize_t scene=0; + + /* + Rewind list, removing any empty images while rewinding. + */ + p=image; + image=NULL; + while (p != (Image *) NULL) + { + Image *tmp=p; + if ((p->rows == 0) || (p->columns == 0)) { + p=p->previous; + if (tmp == image2) + image2=(Image *) NULL; + DeleteImageFromList(&tmp); + } else { + image=p; + p=p->previous; + } + } + + /* + Fix scene numbers + */ + for (p=image; p != (Image *) NULL; p=p->next) + p->scene=scene++; + } + + if(clone_info != NULL) /* cleanup garbage file from compression */ + { + if(clone_info->file) + { + fclose(clone_info->file); + clone_info->file = NULL; + (void) remove_utf8(clone_info->filename); + } + DestroyImageInfo(clone_info); + clone_info = NULL; + } + if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),"return"); + if ((image != image2) && (image2 != (Image *) NULL)) + image2=DestroyImage(image2); + if (image == (Image *) NULL) + ThrowReaderException(CorruptImageError,"ImproperImageHeader") + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M A T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method RegisterMATImage adds attributes for the MAT image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMATImage method is: +% +% size_t RegisterMATImage(void) +% +*/ +ModuleExport size_t RegisterMATImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MAT"); + entry->decoder=(DecodeImageHandler *) ReadMATImage; + entry->encoder=(EncodeImageHandler *) WriteMATImage; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=AcquireString("MATLAB level 5 image format"); + entry->magick_module=AcquireString("MAT"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M A T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method UnregisterMATImage removes format registrations made by the +% MAT module from the list of supported formats. +% +% The format of the UnregisterMATImage method is: +% +% UnregisterMATImage(void) +% +*/ +ModuleExport void UnregisterMATImage(void) +{ + (void) UnregisterMagickInfo("MAT"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M A T L A B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Function WriteMATImage writes an Matlab matrix to a file. +% +% The format of the WriteMATImage method is: +% +% unsigned int WriteMATImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o status: Function WriteMATImage return True if the image is written. +% False is returned is there is a memory shortage or if the image file +% fails to write. +% +% o image_info: Specifies a pointer to a ImageInfo structure. +% +% o image: A pointer to an Image structure. +% +*/ +static MagickBooleanType WriteMATImage(const ImageInfo *image_info,Image *image) +{ + char + MATLAB_HDR[0x80]; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + size_t + imageListLength; + + struct tm + utc_time; + + time_t + current_time; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"enter MAT"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(MagickFalse); + image->depth=8; + + current_time=GetMagickTime(); + GetMagickUTCtime(¤t_time,&utc_time); + (void) memset(MATLAB_HDR,' ',MagickMin(sizeof(MATLAB_HDR),124)); + FormatLocaleString(MATLAB_HDR,sizeof(MATLAB_HDR), + "MATLAB 5.0 MAT-file, Platform: %s, Created on: %s %s %2d %2d:%2d:%2d %d", + OsDesc,DayOfWTab[utc_time.tm_wday],MonthsTab[utc_time.tm_mon], + utc_time.tm_mday,utc_time.tm_hour,utc_time.tm_min, + utc_time.tm_sec,utc_time.tm_year+1900); + MATLAB_HDR[0x7C]=0; + MATLAB_HDR[0x7D]=1; + MATLAB_HDR[0x7E]='I'; + MATLAB_HDR[0x7F]='M'; + (void) WriteBlob(image,sizeof(MATLAB_HDR),(unsigned char *) MATLAB_HDR); + scene=0; + imageListLength=GetImageListLength(image); + do + { + char + padding; + + MagickBooleanType + is_gray; + + QuantumInfo + *quantum_info; + + size_t + data_size; + + unsigned char + *pixels; + + unsigned int + z; + + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + is_gray=SetImageGray(image,&image->exception); + z=(is_gray != MagickFalse) ? 0 : 3; + + /* + Store MAT header. + */ + data_size=image->rows*image->columns; + if (is_gray == MagickFalse) + data_size*=3; + padding=((unsigned char)(data_size-1) & 0x7) ^ 0x7; + + (void) WriteBlobLSBLong(image,miMATRIX); + (void) WriteBlobLSBLong(image,(unsigned int) data_size+padding+ + ((is_gray != MagickFalse) ? 48 : 56)); + (void) WriteBlobLSBLong(image,0x6); /* 0x88 */ + (void) WriteBlobLSBLong(image,0x8); /* 0x8C */ + (void) WriteBlobLSBLong(image,0x6); /* 0x90 */ + (void) WriteBlobLSBLong(image,0); + (void) WriteBlobLSBLong(image,0x5); /* 0x98 */ + (void) WriteBlobLSBLong(image,(is_gray != MagickFalse) ? 0x8 : 0xC); /* 0x9C - DimFlag */ + (void) WriteBlobLSBLong(image,(unsigned int) image->rows); /* x: 0xA0 */ + (void) WriteBlobLSBLong(image,(unsigned int) image->columns); /* y: 0xA4 */ + if (is_gray == MagickFalse) + { + (void) WriteBlobLSBLong(image,3); /* z: 0xA8 */ + (void) WriteBlobLSBLong(image,0); + } + (void) WriteBlobLSBShort(image,1); /* 0xB0 */ + (void) WriteBlobLSBShort(image,1); /* 0xB2 */ + (void) WriteBlobLSBLong(image,'M'); /* 0xB4 */ + (void) WriteBlobLSBLong(image,0x2); /* 0xB8 */ + (void) WriteBlobLSBLong(image,(unsigned int) data_size); /* 0xBC */ + + /* + Store image data. + */ + exception=(&image->exception); + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + do + { + const PixelPacket + *p; + + ssize_t + y; + + for (y=0; y < (ssize_t) image->columns; y++) + { + size_t + length; + + p=GetVirtualPixels(image,y,0,1,image->rows,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + z2qtype[z],pixels,exception); + if (length != image->columns) + break; + if (WriteBlob(image,image->rows,pixels) != (ssize_t) image->rows) + break; + } + if (y < (ssize_t) image->columns) + break; + if (!SyncAuthenticPixels(image,exception)) + break; + } while (z-- >= 2); + while (padding-- > 0) + (void) WriteBlobByte(image,0); + quantum_info=DestroyQuantumInfo(quantum_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/matte.c b/ImageMagick-6.9.12-44/coders/matte.c new file mode 100644 index 0000000..0efaa4c --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/matte.c @@ -0,0 +1,224 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M AAA TTTTT TTTTT EEEEE % +% MM MM A A T T E % +% M M M AAAAA T T EEE % +% M M A A T T E % +% M M A A T T EEEEE % +% % +% % +% Write Matte Channel To MIFF File. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMATTEImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M A T T E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMATTEImage() adds attributes for the MATTE image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMATTEImage method is: +% +% size_t RegisterMATTEImage(void) +% +*/ +ModuleExport size_t RegisterMATTEImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MATTE"); + entry->encoder=(EncodeImageHandler *) WriteMATTEImage; + entry->format_type=ExplicitFormatType; + entry->description=ConstantString("MATTE format"); + entry->magick_module=ConstantString("MATTE"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M A T T E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMATTEImage() removes format registrations made by the +% MATTE module from the list of supported formats. +% +% The format of the UnregisterMATTEImage method is: +% +% UnregisterMATTEImage(void) +% +*/ +ModuleExport void UnregisterMATTEImage(void) +{ + (void) UnregisterMagickInfo("MATTE"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M A T T E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Function WriteMATTEImage() writes an image of matte bytes to a file. It +% consists of data from the matte component of the image [0..255]. +% +% The format of the WriteMATTEImage method is: +% +% MagickBooleanType WriteMATTEImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteMATTEImage(const ImageInfo *image_info, + Image *image) +{ + ExceptionInfo + *exception; + + Image + *matte_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + const PixelPacket + *p; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + y; + + if (image->matte == MagickFalse) + ThrowWriterException(CoderError,"ImageDoesNotHaveAAlphaChannel"); + matte_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (matte_image == (Image *) NULL) + return(MagickFalse); + (void) SetImageType(matte_image,TrueColorMatteType); + matte_image->matte=MagickFalse; + /* + Convert image to matte pixels. + */ + exception=(&image->exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + q=QueueAuthenticPixels(matte_image,0,y,matte_image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelOpacity(p)); + SetPixelGreen(q,GetPixelOpacity(p)); + SetPixelBlue(q,GetPixelOpacity(p)); + SetPixelOpacity(q,OpaqueOpacity); + p++; + q++; + } + if (SyncAuthenticPixels(matte_image,exception) == MagickFalse) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + write_info=CloneImageInfo(image_info); + if ((*write_info->magick == '\0') || + (LocaleCompare(write_info->magick,"MATTE") == 0)) + (void) FormatLocaleString(matte_image->filename,MaxTextExtent, + "MIFF:%s",image->filename); + status=WriteImage(write_info,matte_image); + write_info=DestroyImageInfo(write_info); + matte_image=DestroyImage(matte_image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/meta.c b/ImageMagick-6.9.12-44/coders/meta.c new file mode 100644 index 0000000..2c6ad5f --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/meta.c @@ -0,0 +1,2476 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M EEEEE TTTTT AAA % +% MM MM E T A A % +% M M M EEE T AAAAA % +% M M E T A A % +% M M EEEEE T A A % +% % +% % +% Read/Write Embedded Image Profiles. % +% % +% Software Design % +% William Radcliffe % +% July 2001 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/locale-private.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/quantum-private.h" +#include "magick/splay-tree.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/token.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMETAImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s M E T A % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsMETA() returns MagickTrue if the image format type, identified by the +% magick string, is META. +% +% The format of the IsMETA method is: +% +% MagickBooleanType IsMETA(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +% +*/ +#ifdef IMPLEMENT_IS_FUNCTION +static MagickBooleanType IsMETA(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (LocaleNCompare((char *) magick,"8BIM",4) == 0) + return(MagickTrue); + if (LocaleNCompare((char *) magick,"APP1",4) == 0) + return(MagickTrue); + if (LocaleNCompare((char *) magick,"\034\002",2) == 0) + return(MagickTrue); + return(MagickFalse); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M E T A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMETAImage() reads a META image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadMETAImage method is: +% +% Image *ReadMETAImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% Decompression code contributed by Kyle Shorter. +% +% A description of each parameter follows: +% +% o image: Method ReadMETAImage returns a pointer to the image after +% reading. A null image is returned if there is a memory shortage or +% if the image cannot be read. +% +% o image_info: Specifies a pointer to an ImageInfo structure. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static const struct +{ + const unsigned char + len; + + const char + code[7], + val; +} html_codes[] = { +#ifdef HANDLE_GT_LT + { 4,"<",'<' }, + { 4,">",'>' }, +#endif + { 5,"&",'&' }, + { 6,""",'"' }, + { 6,"'",'\''} +}; + +static int stringnicmp(const char *p,const char *q,size_t n) +{ + ssize_t + i, + j; + + if (p == q) + return(0); + if (p == (char *) NULL) + return(-1); + if (q == (char *) NULL) + return(1); + while ((*p != '\0') && (*q != '\0')) + { + if ((*p == '\0') || (*q == '\0')) + break; + i=(*p); + if (islower((int) ((unsigned char) i)) != 0) + i=LocaleToUppercase(i); + j=(*q); + if (islower((int) ((unsigned char) j)) != 0) + j=LocaleToUppercase(j); + if (i != j) + break; + n--; + if (n == 0) + break; + p++; + q++; + } + return(LocaleToUppercase((int) *p)-LocaleToUppercase((int) *q)); +} + +static size_t convertHTMLcodes(char *s) +{ + int + value; + + size_t + i; + + size_t + length; + + length=0; + for (i=0; (i < 7U) && (s[i] != '\0'); i++) + if (s[i] == ';') + { + length=i+1; + break; + } + if ((length == 0) || (s == (char *) NULL) || (*s == '\0')) + return(0); + if ((length > 3) && (s[1] == '#') && (sscanf(s,"&#%d;",&value) == 1)) + { + size_t + o; + + o=3; + while (s[o] != ';') + { + o++; + if (o > 5) + break; + } + if (o < 6) + (void) memmove(s+1,s+1+o,strlen(s+1+o)+1); + *s=value; + return(o); + } + for (i=0; i < (ssize_t) (sizeof(html_codes)/sizeof(html_codes[0])); i++) + { + if (html_codes[i].len <= (ssize_t) length) + if (stringnicmp(s,html_codes[i].code,(size_t) (html_codes[i].len)) == 0) + { + (void) memmove(s+1,s+html_codes[i].len,strlen(s+html_codes[i].len)+1); + *s=html_codes[i].val; + return(html_codes[i].len-1); + } + } + return(0); +} + +static char *super_fgets(char **b, size_t *blen, Image *file) +{ + int + c; + + size_t + len; + + unsigned char + *p, + *q; + + len=*blen; + p=(unsigned char *) (*b); + for (q=p; ; q++) + { + c=ReadBlobByte(file); + if (c == EOF || c == '\n') + break; + if ((size_t) (q-p+1) >= len) + { + size_t + tlen; + + unsigned char + *buffer; + + tlen=(size_t) (q-p); + len<<=1; + buffer=(unsigned char *) ResizeQuantumMemory(p,len+2UL,sizeof(*p)); + if (buffer == (unsigned char *) NULL) + { + p=(unsigned char *) RelinquishMagickMemory(p); + break; + } + p=buffer; + q=p+tlen; + } + *q=(unsigned char) c; + } + *b=(char *) p; + *blen=0; + if (p != (unsigned char *) NULL) + { + size_t + tlen; + + tlen=(size_t) (q-p); + if (tlen == 0) + return (char *) NULL; + p[tlen] = '\0'; + *blen=++tlen; + } + return(*b); +} + +#define IPTC_ID 1028 +#define THUMBNAIL_ID 1033 + +static ssize_t parse8BIM(Image *ifile, Image *ofile) +{ + char + brkused, + quoted, + *line, + *token, + *newstr, + *name; + + int + state, + next; + + unsigned char + dataset; + + unsigned int + recnum; + + MagickOffsetType + savedpos, + currentpos; + + size_t + inputlen = MaxTextExtent; + + ssize_t + savedolen = 0L, + outputlen = 0L; + + TokenInfo + *token_info; + + dataset = 0; + recnum = 0; + line = (char *) AcquireQuantumMemory((size_t) inputlen,sizeof(*line)); + if (line == (char *) NULL) + return(-1); + newstr = name = token = (char *) NULL; + savedpos = 0; + token_info=AcquireTokenInfo(); + while (super_fgets(&line,&inputlen,ifile)!=NULL) + { + state=0; + next=0; + + token=(char *) AcquireQuantumMemory(inputlen,sizeof(*token)); + if (token == (char *) NULL) + break; + newstr=(char *) AcquireQuantumMemory(inputlen,sizeof(*newstr)); + if (newstr == (char *) NULL) + break; + while (Tokenizer(token_info,0,token,inputlen,line,"","=","\"",0, + &brkused,&next,"ed)==0) + { + if (state == 0) + { + int + state, + next; + + char + brkused, + quoted; + + state=0; + next=0; + while (Tokenizer(token_info,0,newstr,inputlen,token,"","#", + "", 0,&brkused,&next,"ed)==0) + { + switch (state) + { + case 0: + if (strcmp(newstr,"8BIM")==0) + dataset = 255; + else + dataset = (unsigned char) StringToLong(newstr); + break; + case 1: + recnum = (unsigned int) StringToUnsignedLong(newstr); + break; + case 2: + name=(char *) AcquireQuantumMemory(strlen(newstr)+MaxTextExtent, + sizeof(*name)); + if (name) + (void) strcpy(name,newstr); + break; + } + state++; + } + } + else + if (state == 1) + { + int + next; + + ssize_t + len; + + char + brkused, + quoted; + + next=0; + len = (ssize_t) strlen(token); + while (Tokenizer(token_info,0,newstr,inputlen,token,"","&", + "",0,&brkused,&next,"ed)==0) + { + if (brkused && next > 0) + { + size_t + codes_length; + + char + *s = &token[next-1]; + + codes_length=convertHTMLcodes(s); + if ((ssize_t) codes_length > len) + len=0; + else + len-=codes_length; + } + } + + if (dataset == 255) + { + unsigned char + nlen = 0; + + int + i; + + if (savedolen > 0) + { + MagickOffsetType + offset; + + ssize_t diff = outputlen - savedolen; + currentpos = TellBlob(ofile); + if (currentpos < 0) + { + line=DestroyString(line); + return(-1); + } + offset=SeekBlob(ofile,savedpos,SEEK_SET); + if (offset < 0) + { + line=DestroyString(line); + return(-1); + } + (void) WriteBlobMSBLong(ofile,(unsigned int) diff); + offset=SeekBlob(ofile,currentpos,SEEK_SET); + if (offset < 0) + { + line=DestroyString(line); + return(-1); + } + savedolen = 0L; + } + if (outputlen & 1) + { + (void) WriteBlobByte(ofile,0x00); + outputlen++; + } + (void) WriteBlobString(ofile,"8BIM"); + (void) WriteBlobMSBShort(ofile,(unsigned short) recnum); + outputlen += 6; + if (name) + nlen = (unsigned char) strlen(name); + (void) WriteBlobByte(ofile,nlen); + outputlen++; + for (i=0; i 0) + (void) WriteBlobByte(ofile,(unsigned char) token[next++]); + + if (outputlen & 1) + { + (void) WriteBlobByte(ofile,0x00); + outputlen++; + } + } + else + { + /* patch in a fake length for now and fix it later */ + savedpos = TellBlob(ofile); + if (savedpos < 0) + return(-1); + (void) WriteBlobMSBLong(ofile,0xFFFFFFFFU); + outputlen += 4; + savedolen = outputlen; + } + } + else + { + if (len <= 0x7FFF) + { + (void) WriteBlobByte(ofile,0x1c); + (void) WriteBlobByte(ofile,(unsigned char) dataset); + (void) WriteBlobByte(ofile,(unsigned char) (recnum & 0xff)); + (void) WriteBlobMSBShort(ofile,(unsigned short) len); + outputlen += 5; + next=0; + outputlen += len; + while (len-- > 0) + (void) WriteBlobByte(ofile,(unsigned char) token[next++]); + } + } + } + state++; + } + if (token != (char *) NULL) + token=DestroyString(token); + if (newstr != (char *) NULL) + newstr=DestroyString(newstr); + if (name != (char *) NULL) + name=DestroyString(name); + } + token_info=DestroyTokenInfo(token_info); + if (token != (char *) NULL) + token=DestroyString(token); + if (newstr != (char *) NULL) + newstr=DestroyString(newstr); + if (name != (char *) NULL) + name=DestroyString(name); + line=DestroyString(line); + if (savedolen > 0) + { + MagickOffsetType + offset; + + ssize_t diff = outputlen - savedolen; + + currentpos = TellBlob(ofile); + if (currentpos < 0) + return(-1); + offset=SeekBlob(ofile,savedpos,SEEK_SET); + if (offset < 0) + return(-1); + (void) WriteBlobMSBLong(ofile,(unsigned int) diff); + offset=SeekBlob(ofile,currentpos,SEEK_SET); + if (offset < 0) + return(-1); + savedolen = 0L; + } + return(outputlen); +} + +static char *super_fgets_w(char **b, size_t *blen, Image *file) +{ + int + c, + len; + + unsigned char + *p, + *q; + + len=*blen; + p=(unsigned char *) (*b); + for (q=p; ; q++) + { + c=ReadBlobLSBSignedShort(file); + if ((c == -1) || (c == '\n')) + break; + if (EOFBlob(file)) + break; + if ((q-p+1) >= (int) len) + { + size_t + tlen; + + unsigned char + *buffer; + + tlen=(size_t) (q-p); + len<<=1; + buffer=(unsigned char *) ResizeQuantumMemory(p,len+2,sizeof(*p)); + if (buffer == (unsigned char *) NULL) + { + p=(unsigned char *) RelinquishMagickMemory(p); + break; + } + p=buffer; + q=p+tlen; + } + *q=(unsigned char) c; + } + *b=(char *) p; + *blen=0; + if ((*b) != (char *) NULL) + { + size_t + tlen; + + tlen=(size_t) (q-p); + if (tlen == 0) + return (char *) NULL; + p[tlen] = '\0'; + *blen=++tlen; + } + return(*b); +} + +static ssize_t parse8BIMW(Image *ifile, Image *ofile) +{ + char + brkused, + quoted, + *line, + *token, + *newstr, + *name; + + int + state, + next; + + unsigned char + dataset; + + unsigned int + recnum; + + size_t + inputlen = MaxTextExtent; + + ssize_t + savedolen = 0L, + outputlen = 0L; + + MagickOffsetType + savedpos, + currentpos; + + TokenInfo + *token_info; + + dataset = 0; + recnum = 0; + line=(char *) AcquireQuantumMemory(inputlen,sizeof(*line)); + if (line == (char *) NULL) + return(-1); + newstr = name = token = (char *) NULL; + savedpos = 0; + token_info=AcquireTokenInfo(); + while (super_fgets_w(&line,&inputlen,ifile) != NULL) + { + state=0; + next=0; + + token=(char *) AcquireQuantumMemory(inputlen,sizeof(*token)); + if (token == (char *) NULL) + break; + newstr=(char *) AcquireQuantumMemory(inputlen,sizeof(*newstr)); + if (newstr == (char *) NULL) + break; + while (Tokenizer(token_info,0,token,inputlen,line,"","=","\"",0, + &brkused,&next,"ed)==0) + { + if (state == 0) + { + int + state, + next; + + char + brkused, + quoted; + + state=0; + next=0; + while (Tokenizer(token_info,0,newstr,inputlen,token,"","#", + "",0,&brkused,&next,"ed)==0) + { + switch (state) + { + case 0: + if (strcmp(newstr,"8BIM")==0) + dataset = 255; + else + dataset = (unsigned char) StringToLong(newstr); + break; + case 1: + recnum=(unsigned int) StringToUnsignedLong(newstr); + break; + case 2: + name=(char *) AcquireQuantumMemory(strlen(newstr)+MaxTextExtent, + sizeof(*name)); + if (name) + (void) CopyMagickString(name,newstr,strlen(newstr)+MaxTextExtent); + break; + } + state++; + } + } + else + if (state == 1) + { + int + next; + + ssize_t + len; + + char + brkused, + quoted; + + next=0; + len = (ssize_t) strlen(token); + while (Tokenizer(token_info,0,newstr,inputlen,token,"","&", + "",0,&brkused,&next,"ed)==0) + { + if (brkused && next > 0) + { + size_t + codes_length; + + char + *s = &token[next-1]; + + codes_length=convertHTMLcodes(s); + if ((ssize_t) codes_length > len) + len=0; + else + len-=codes_length; + } + } + + if (dataset == 255) + { + unsigned char + nlen = 0; + + int + i; + + if (savedolen > 0) + { + MagickOffsetType + offset; + + ssize_t diff = outputlen - savedolen; + currentpos = TellBlob(ofile); + if (currentpos < 0) + return(-1); + offset=SeekBlob(ofile,savedpos,SEEK_SET); + if (offset < 0) + return(-1); + (void) WriteBlobMSBLong(ofile,(unsigned int) diff); + offset=SeekBlob(ofile,currentpos,SEEK_SET); + if (offset < 0) + return(-1); + savedolen = 0L; + } + if (outputlen & 1) + { + (void) WriteBlobByte(ofile,0x00); + outputlen++; + } + (void) WriteBlobString(ofile,"8BIM"); + (void) WriteBlobMSBShort(ofile,(unsigned short) recnum); + outputlen += 6; + if (name) + nlen = (unsigned char) strlen(name); + (void) WriteBlobByte(ofile,(unsigned char) nlen); + outputlen++; + for (i=0; i 0) + { + MagickOffsetType + offset; + + ssize_t diff = outputlen - savedolen; + + currentpos = TellBlob(ofile); + if (currentpos < 0) + return(-1); + offset=SeekBlob(ofile,savedpos,SEEK_SET); + if (offset < 0) + return(-1); + (void) WriteBlobMSBLong(ofile,(unsigned int) diff); + offset=SeekBlob(ofile,currentpos,SEEK_SET); + if (offset < 0) + return(-1); + savedolen = 0L; + } + return outputlen; +} + +/* some defines for the different JPEG block types */ +#define M_SOF0 0xC0 /* Start Of Frame N */ +#define M_SOF1 0xC1 /* N indicates which compression process */ +#define M_SOF2 0xC2 /* Only SOF0-SOF2 are now in common use */ +#define M_SOF3 0xC3 +#define M_SOF5 0xC5 /* NB: codes C4 and CC are NOT SOF markers */ +#define M_SOF6 0xC6 +#define M_SOF7 0xC7 +#define M_SOF9 0xC9 +#define M_SOF10 0xCA +#define M_SOF11 0xCB +#define M_SOF13 0xCD +#define M_SOF14 0xCE +#define M_SOF15 0xCF +#define M_SOI 0xD8 +#define M_EOI 0xD9 /* End Of Image (end of datastream) */ +#define M_SOS 0xDA /* Start Of Scan (begins compressed data) */ +#define M_APP0 0xe0 +#define M_APP1 0xe1 +#define M_APP2 0xe2 +#define M_APP3 0xe3 +#define M_APP4 0xe4 +#define M_APP5 0xe5 +#define M_APP6 0xe6 +#define M_APP7 0xe7 +#define M_APP8 0xe8 +#define M_APP9 0xe9 +#define M_APP10 0xea +#define M_APP11 0xeb +#define M_APP12 0xec +#define M_APP13 0xed +#define M_APP14 0xee +#define M_APP15 0xef + +static int jpeg_transfer_1(Image *ifile, Image *ofile) +{ + int c; + + c = ReadBlobByte(ifile); + if (c == EOF) + return EOF; + (void) WriteBlobByte(ofile,(unsigned char) c); + return c; +} + +#if defined(future) +static int jpeg_skip_1(Image *ifile) +{ + int c; + + c = ReadBlobByte(ifile); + if (c == EOF) + return EOF; + return c; +} +#endif + +static int jpeg_read_remaining(Image *ifile, Image *ofile) +{ + int c; + + while ((c = jpeg_transfer_1(ifile, ofile)) != EOF) + continue; + return M_EOI; +} + +static int jpeg_skip_variable(Image *ifile, Image *ofile) +{ + unsigned int length; + int c1,c2; + + if ((c1 = jpeg_transfer_1(ifile, ofile)) == EOF) + return M_EOI; + if ((c2 = jpeg_transfer_1(ifile, ofile)) == EOF) + return M_EOI; + + length = (((unsigned int) c1) << 8) + ((unsigned int) c2); + length -= 2; + + while (length--) + if (jpeg_transfer_1(ifile, ofile) == EOF) + return M_EOI; + + return 0; +} + +static int jpeg_skip_variable2(Image *ifile, Image *ofile) +{ + unsigned int length; + int c1,c2; + + (void) ofile; + if ((c1 = ReadBlobByte(ifile)) == EOF) return M_EOI; + if ((c2 = ReadBlobByte(ifile)) == EOF) return M_EOI; + + length = (((unsigned int) c1) << 8) + ((unsigned int) c2); + length -= 2; + + while (length--) + if (ReadBlobByte(ifile) == EOF) + return M_EOI; + + return 0; +} + +static int jpeg_nextmarker(Image *ifile, Image *ofile) +{ + int c; + + /* transfer anything until we hit 0xff */ + do + { + c = ReadBlobByte(ifile); + if (c == EOF) + return M_EOI; /* we hit EOF */ + else + if (c != 0xff) + (void) WriteBlobByte(ofile,(unsigned char) c); + } while (c != 0xff); + + /* get marker byte, swallowing possible padding */ + do + { + c = ReadBlobByte(ifile); + if (c == EOF) + return M_EOI; /* we hit EOF */ + } while (c == 0xff); + + return c; +} + +#if defined(future) +static int jpeg_skip_till_marker(Image *ifile, int marker) +{ + int c, i; + + do + { + /* skip anything until we hit 0xff */ + i = 0; + do + { + c = ReadBlobByte(ifile); + i++; + if (c == EOF) + return M_EOI; /* we hit EOF */ + } while (c != 0xff); + + /* get marker byte, swallowing possible padding */ + do + { + c = ReadBlobByte(ifile); + if (c == EOF) + return M_EOI; /* we hit EOF */ + } while (c == 0xff); + } while (c != marker); + return c; +} +#endif + +/* Embed binary IPTC data into a JPEG image. */ +static int jpeg_embed(Image *ifile, Image *ofile, Image *iptc) +{ + unsigned int marker; + unsigned int done = 0; + unsigned int len; + int inx; + + if (jpeg_transfer_1(ifile, ofile) != 0xFF) + return 0; + if (jpeg_transfer_1(ifile, ofile) != M_SOI) + return 0; + + while (done == MagickFalse) + { + marker=(unsigned int) jpeg_nextmarker(ifile, ofile); + if (marker == M_EOI) + { /* EOF */ + break; + } + else + { + if (marker != M_APP13) + { + (void) WriteBlobByte(ofile,0xff); + (void) WriteBlobByte(ofile,(unsigned char) marker); + } + } + + switch (marker) + { + case M_APP13: + /* we are going to write a new APP13 marker, so don't output the old one */ + jpeg_skip_variable2(ifile, ofile); + break; + + case M_APP0: + /* APP0 is in each and every JPEG, so when we hit APP0 we insert our new APP13! */ + jpeg_skip_variable(ifile, ofile); + + if (iptc != (Image *) NULL) + { + char + psheader[] = "\xFF\xED\0\0Photoshop 3.0\0" "8BIM\x04\x04\0\0\0\0"; + + len=(unsigned int) GetBlobSize(iptc); + if (len & 1) + len++; /* make the length even */ + psheader[2]=(char) ((len+16)>>8); + psheader[3]=(char) ((len+16)&0xff); + for (inx = 0; inx < 18; inx++) + (void) WriteBlobByte(ofile,(unsigned char) psheader[inx]); + jpeg_read_remaining(iptc, ofile); + len=(unsigned int) GetBlobSize(iptc); + if (len & 1) + (void) WriteBlobByte(ofile,0); + } + break; + + case M_SOS: + /* we hit data, no more marker-inserting can be done! */ + jpeg_read_remaining(ifile, ofile); + done = 1; + break; + + default: + jpeg_skip_variable(ifile, ofile); + break; + } + } + return 1; +} + +/* handle stripping the APP13 data out of a JPEG */ +#if defined(future) +static void jpeg_strip(Image *ifile, Image *ofile) +{ + unsigned int marker; + + marker = jpeg_skip_till_marker(ifile, M_SOI); + if (marker == M_SOI) + { + (void) WriteBlobByte(ofile,0xff); + (void) WriteBlobByte(ofile,M_SOI); + jpeg_read_remaining(ifile, ofile); + } +} + +/* Extract any APP13 binary data into a file. */ +static int jpeg_extract(Image *ifile, Image *ofile) +{ + unsigned int marker; + unsigned int done = 0; + + if (jpeg_skip_1(ifile) != 0xff) + return 0; + if (jpeg_skip_1(ifile) != M_SOI) + return 0; + + while (done == MagickFalse) + { + marker = jpeg_skip_till_marker(ifile, M_APP13); + if (marker == M_APP13) + { + marker = jpeg_nextmarker(ifile, ofile); + break; + } + } + return 1; +} +#endif + +static void CopyBlob(Image *source,Image *destination) +{ + ssize_t + i; + + unsigned char + *buffer; + + ssize_t + count, + length; + + buffer=(unsigned char *) AcquireQuantumMemory(MagickMaxBufferExtent, + sizeof(*buffer)); + if (buffer != (unsigned char *) NULL) + { + (void) memset(buffer,0,MagickMaxBufferExtent*sizeof(*buffer)); + i=0; + while ((length=ReadBlob(source,MagickMaxBufferExtent,buffer)) != 0) + { + count=0; + for (i=0; i < (ssize_t) length; i+=count) + { + count=WriteBlob(destination,(size_t) (length-i),buffer+i); + if (count <= 0) + break; + } + if (i < (ssize_t) length) + break; + } + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + } +} + +static Image *ReadMETAImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *buff, + *image; + + MagickBooleanType + status; + + StringInfo + *profile; + + size_t + length; + + unsigned char + *blob; + + /* + Open file containing binary metadata + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + image->columns=1; + image->rows=1; + if (SetImageBackgroundColor(image) == MagickFalse) + { + InheritException(exception,&image->exception); + image=DestroyImageList(image); + return((Image *) NULL); + } + length=1; + if (LocaleNCompare(image_info->magick,"8BIM",4) == 0) + { + /* + Read 8BIM binary metadata. + */ + buff=AcquireImage((ImageInfo *) NULL); + if (buff == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + blob=(unsigned char *) AcquireQuantumMemory(length,sizeof(unsigned char)); + if (blob == (unsigned char *) NULL) + { + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(blob,0,length); + AttachBlob(buff->blob,blob,length); + if (LocaleCompare(image_info->magick,"8BIMTEXT") == 0) + { + length=(size_t) parse8BIM(image, buff); + if (length == 0) + { + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + if (length & 1) + (void) WriteBlobByte(buff,0x0); + } + else if (LocaleCompare(image_info->magick,"8BIMWTEXT") == 0) + { + length=(size_t) parse8BIMW(image, buff); + if (length == 0) + { + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + if (length & 1) + (void) WriteBlobByte(buff,0x0); + } + else + CopyBlob(image,buff); + profile=BlobToStringInfo(GetBlobStreamData(buff),(size_t) + GetBlobSize(buff)); + if (profile == (StringInfo *) NULL) + { + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + status=SetImageProfile(image,"8bim",profile); + profile=DestroyStringInfo(profile); + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + if (status == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + if (LocaleNCompare(image_info->magick,"APP1",4) == 0) + { + char + name[MaxTextExtent]; + + (void) FormatLocaleString(name,MaxTextExtent,"APP%d",1); + buff=AcquireImage((ImageInfo *) NULL); + if (buff == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + blob=(unsigned char *) AcquireQuantumMemory(length,sizeof(unsigned char)); + if (blob == (unsigned char *) NULL) + { + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + AttachBlob(buff->blob,blob,length); + if (LocaleCompare(image_info->magick,"APP1JPEG") == 0) + { + Image + *iptc; + + int + result; + + if (image_info->profile == (void *) NULL) + { + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + ThrowReaderException(CoderError,"NoIPTCProfileAvailable"); + } + profile=CloneStringInfo((StringInfo *) image_info->profile); + iptc=AcquireImage((ImageInfo *) NULL); + if (iptc == (Image *) NULL) + { + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + AttachBlob(iptc->blob,GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + result=jpeg_embed(image,buff,iptc); + blob=(unsigned char *) DetachBlob(iptc->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + iptc=DestroyImage(iptc); + if (result == 0) + ThrowReaderException(CoderError,"JPEGEmbeddingFailed"); + } + else + CopyBlob(image,buff); + profile=BlobToStringInfo(GetBlobStreamData(buff),(size_t) + GetBlobSize(buff)); + if (profile == (StringInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + status=SetImageProfile(image,name,profile); + profile=DestroyStringInfo(profile); + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + if (status == MagickFalse) + { + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + if ((LocaleCompare(image_info->magick,"ICC") == 0) || + (LocaleCompare(image_info->magick,"ICM") == 0)) + { + buff=AcquireImage((ImageInfo *) NULL); + if (buff == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + blob=(unsigned char *) AcquireQuantumMemory(length,sizeof(unsigned char)); + if (blob == (unsigned char *) NULL) + { + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + AttachBlob(buff->blob,blob,length); + CopyBlob(image,buff); + profile=BlobToStringInfo(GetBlobStreamData(buff),(size_t) + GetBlobSize(buff)); + if (profile == (StringInfo *) NULL) + { + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) SetImageProfile(image,"icc",profile); + profile=DestroyStringInfo(profile); + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + } + if (LocaleCompare(image_info->magick,"IPTC") == 0) + { + buff=AcquireImage((ImageInfo *) NULL); + if (buff == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + blob=(unsigned char *) AcquireQuantumMemory(length,sizeof(unsigned char)); + if (blob == (unsigned char *) NULL) + { + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + AttachBlob(buff->blob,blob,length); + CopyBlob(image,buff); + profile=BlobToStringInfo(GetBlobStreamData(buff),(size_t) + GetBlobSize(buff)); + if (profile == (StringInfo *) NULL) + { + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) SetImageProfile(image,"iptc",profile); + profile=DestroyStringInfo(profile); + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + } + if (LocaleCompare(image_info->magick,"XMP") == 0) + { + buff=AcquireImage((ImageInfo *) NULL); + if (buff == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + blob=(unsigned char *) AcquireQuantumMemory(length,sizeof(unsigned char)); + if (blob == (unsigned char *) NULL) + { + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + AttachBlob(buff->blob,blob,length); + CopyBlob(image,buff); + profile=BlobToStringInfo(GetBlobStreamData(buff),(size_t) + GetBlobSize(buff)); + if (profile == (StringInfo *) NULL) + { + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) SetImageProfile(image,"xmp",profile); + profile=DestroyStringInfo(profile); + blob=(unsigned char *) DetachBlob(buff->blob); + blob=(unsigned char *) RelinquishMagickMemory(blob); + buff=DestroyImage(buff); + } + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M E T A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMETAImage() adds attributes for the META image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMETAImage method is: +% +% size_t RegisterMETAImage(void) +% +*/ +ModuleExport size_t RegisterMETAImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("8BIM"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Photoshop resource format"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("8BIMTEXT"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Photoshop resource text format"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("8BIMWTEXT"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Photoshop resource wide text format"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("APP1"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Raw application information"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("APP1JPEG"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Raw JPEG binary data"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("EXIF"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Exif digital camera binary data"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("XMP"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Adobe XML metadata"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("ICM"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("ICC Color Profile"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("ICC"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("ICC Color Profile"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("IPTC"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("IPTC Newsphoto"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("IPTCTEXT"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("IPTC Newsphoto text format"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("IPTCWTEXT"); + entry->decoder=(DecodeImageHandler *) ReadMETAImage; + entry->encoder=(EncodeImageHandler *) WriteMETAImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("IPTC Newsphoto text format"); + entry->magick_module=ConstantString("META"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M E T A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMETAImage() removes format registrations made by the +% META module from the list of supported formats. +% +% The format of the UnregisterMETAImage method is: +% +% UnregisterMETAImage(void) +% +*/ +ModuleExport void UnregisterMETAImage(void) +{ + (void) UnregisterMagickInfo("8BIM"); + (void) UnregisterMagickInfo("8BIMTEXT"); + (void) UnregisterMagickInfo("8BIMWTEXT"); + (void) UnregisterMagickInfo("EXIF"); + (void) UnregisterMagickInfo("APP1"); + (void) UnregisterMagickInfo("APP1JPEG"); + (void) UnregisterMagickInfo("ICCTEXT"); + (void) UnregisterMagickInfo("ICM"); + (void) UnregisterMagickInfo("ICC"); + (void) UnregisterMagickInfo("IPTC"); + (void) UnregisterMagickInfo("IPTCTEXT"); + (void) UnregisterMagickInfo("IPTCWTEXT"); + (void) UnregisterMagickInfo("XMP"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M E T A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMETAImage() writes a META image to a file. +% +% The format of the WriteMETAImage method is: +% +% MagickBooleanType WriteMETAImage(const ImageInfo *image_info, +% Image *image) +% +% Compression code contributed by Kyle Shorter. +% +% A description of each parameter follows: +% +% o image_info: Specifies a pointer to an ImageInfo structure. +% +% o image: A pointer to a Image structure. +% +*/ + +static size_t GetIPTCStream(unsigned char **info,size_t length) +{ + int + c; + + ssize_t + i; + + unsigned char + *p; + + size_t + extent, + info_length; + + unsigned int + marker; + + size_t + tag_length; + + p=(*info); + extent=length; + if ((*p == 0x1c) && (*(p+1) == 0x02)) + return(length); + /* + Extract IPTC from 8BIM resource block. + */ + while (extent >= 12) + { + if (strncmp((const char *) p,"8BIM",4)) + break; + p+=4; + extent-=4; + marker=(unsigned int) (*p) << 8 | *(p+1); + p+=2; + extent-=2; + c=*p++; + extent--; + c|=0x01; + if ((size_t) c >= extent) + break; + p+=c; + extent-=c; + if (extent < 4) + break; + tag_length=(((size_t) *p) << 24) | (((size_t) *(p+1)) << 16) | + (((size_t) *(p+2)) << 8) | ((size_t) *(p+3)); + p+=4; + extent-=4; + if (tag_length > extent) + break; + if (marker == IPTC_ID) + { + *info=p; + return(tag_length); + } + if ((tag_length & 0x01) != 0) + tag_length++; + p+=tag_length; + extent-=tag_length; + } + /* + Find the beginning of the IPTC info. + */ + p=(*info); + tag_length=0; +iptc_find: + info_length=0; + marker=MagickFalse; + while (length != 0) + { + c=(*p++); + length--; + if (length == 0) + break; + if (c == 0x1c) + { + p--; + *info=p; /* let the caller know were it is */ + break; + } + } + /* + Determine the length of the IPTC info. + */ + while (length != 0) + { + c=(*p++); + length--; + if (length == 0) + break; + if (c == 0x1c) + marker=MagickTrue; + else + if (marker) + break; + else + continue; + info_length++; + /* + Found the 0x1c tag; skip the dataset and record number tags. + */ + c=(*p++); /* should be 2 */ + length--; + if (length == 0) + break; + if ((info_length == 1) && (c != 2)) + goto iptc_find; + info_length++; + c=(*p++); /* should be 0 */ + length--; + if (length == 0) + break; + if ((info_length == 2) && (c != 0)) + goto iptc_find; + info_length++; + /* + Decode the length of the block that follows - ssize_t or short format. + */ + c=(*p++); + length--; + if (length == 0) + break; + info_length++; + if ((c & 0x80) != 0) + { + /* + Long format. + */ + tag_length=0; + for (i=0; i < 4; i++) + { + tag_length<<=8; + tag_length|=(*p++); + length--; + if (length == 0) + break; + info_length++; + } + } + else + { + /* + Short format. + */ + tag_length=((long) c) << 8; + c=(*p++); + length--; + if (length == 0) + break; + info_length++; + tag_length|=(long) c; + } + if (tag_length > (length+1)) + break; + p+=tag_length; + length-=tag_length; + if (length == 0) + break; + info_length+=tag_length; + } + return(info_length); +} + +static void formatString(Image *ofile, const char *s, ssize_t len) +{ + char + temp[MaxTextExtent]; + + (void) WriteBlobByte(ofile,'"'); + for (; len > 0; len--, s++) { + int c = (*s) & 255; + switch (c) { + case '&': + (void) WriteBlobString(ofile,"&"); + break; +#ifdef HANDLE_GT_LT + case '<': + (void) WriteBlobString(ofile,"<"); + break; + case '>': + (void) WriteBlobString(ofile,">"); + break; +#endif + case '"': + (void) WriteBlobString(ofile,"""); + break; + default: + if (isprint((int) ((unsigned char) c)) != 0) + (void) WriteBlobByte(ofile,(unsigned char) *s); + else + { + (void) FormatLocaleString(temp,MaxTextExtent,"&#%d;", c & 255); + (void) WriteBlobString(ofile,temp); + } + break; + } + } +#if defined(MAGICKCORE_WINDOWS_SUPPORT) + (void) WriteBlobString(ofile,"\"\r\n"); +#else +#if defined(macintosh) + (void) WriteBlobString(ofile,"\"\r"); +#else + (void) WriteBlobString(ofile,"\"\n"); +#endif +#endif +} + +typedef struct _tag_spec +{ + const short + id; + + const char + *name; +} tag_spec; + +static const tag_spec tags[] = { + { 5, "Image Name" }, + { 7, "Edit Status" }, + { 10, "Priority" }, + { 15, "Category" }, + { 20, "Supplemental Category" }, + { 22, "Fixture Identifier" }, + { 25, "Keyword" }, + { 30, "Release Date" }, + { 35, "Release Time" }, + { 40, "Special Instructions" }, + { 45, "Reference Service" }, + { 47, "Reference Date" }, + { 50, "Reference Number" }, + { 55, "Created Date" }, + { 60, "Created Time" }, + { 65, "Originating Program" }, + { 70, "Program Version" }, + { 75, "Object Cycle" }, + { 80, "Byline" }, + { 85, "Byline Title" }, + { 90, "City" }, + { 92, "Sub-Location" }, + { 95, "Province State" }, + { 100, "Country Code" }, + { 101, "Country" }, + { 103, "Original Transmission Reference" }, + { 105, "Headline" }, + { 110, "Credit" }, + { 115, "Source" }, + { 116, "Copyright String" }, + { 120, "Caption" }, + { 121, "Image Orientation" }, + { 122, "Caption Writer" }, + { 131, "Local Caption" }, + { 200, "Custom Field 1" }, + { 201, "Custom Field 2" }, + { 202, "Custom Field 3" }, + { 203, "Custom Field 4" }, + { 204, "Custom Field 5" }, + { 205, "Custom Field 6" }, + { 206, "Custom Field 7" }, + { 207, "Custom Field 8" }, + { 208, "Custom Field 9" }, + { 209, "Custom Field 10" }, + { 210, "Custom Field 11" }, + { 211, "Custom Field 12" }, + { 212, "Custom Field 13" }, + { 213, "Custom Field 14" }, + { 214, "Custom Field 15" }, + { 215, "Custom Field 16" }, + { 216, "Custom Field 17" }, + { 217, "Custom Field 18" }, + { 218, "Custom Field 19" }, + { 219, "Custom Field 20" } +}; + +static int formatIPTC(Image *ifile, Image *ofile) +{ + char + temp[MaxTextExtent]; + + unsigned int + foundiptc, + tagsfound; + + unsigned char + recnum, + dataset; + + unsigned char + *readable, + *str; + + ssize_t + tagindx, + taglen; + + int + i, + tagcount = (int) (sizeof(tags) / sizeof(tags[0])); + + int + c; + + foundiptc = 0; /* found the IPTC-Header */ + tagsfound = 0; /* number of tags found */ + + c = ReadBlobByte(ifile); + while (c != EOF) + { + if (c == 0x1c) + foundiptc=1; + else + { + if (foundiptc) + return(-1); + else + { + c=0; + continue; + } + } + + /* we found the 0x1c tag and now grab the dataset and record number tags */ + c = ReadBlobByte(ifile); + if (c == EOF) + return(-1); + dataset = (unsigned char) c; + c = ReadBlobByte(ifile); + if (c == EOF) + return(-1); + recnum = (unsigned char) c; + /* try to match this record to one of the ones in our named table */ + for (i=0; i< tagcount; i++) + { + if (tags[i].id == (short) recnum) + break; + } + if (i < tagcount) + readable = (unsigned char *) tags[i].name; + else + readable = (unsigned char *) ""; + /* + We decode the length of the block that follows - ssize_t or short fmt. + */ + c=ReadBlobByte(ifile); + if (c == EOF) + return(-1); + if (c & (unsigned char) 0x80) + return(0); + else + { + int + c0; + + c0=ReadBlobByte(ifile); + if (c0 == EOF) + return(-1); + taglen = (c << 8) | c0; + } + if (taglen < 0) + return(-1); + /* make a buffer to hold the tag datand snag it from the input stream */ + str=(unsigned char *) AcquireQuantumMemory((size_t) (taglen+MaxTextExtent), + sizeof(*str)); + if (str == (unsigned char *) NULL) + { + (void) printf("MemoryAllocationFailed"); + return 0; + } + for (tagindx=0; tagindx 0) + (void) FormatLocaleString(temp,MaxTextExtent,"%d#%d#%s=", + (unsigned int) dataset, (unsigned int) recnum, readable); + else + (void) FormatLocaleString(temp,MaxTextExtent,"%d#%d=", + (unsigned int) dataset,(unsigned int) recnum); + (void) WriteBlobString(ofile,temp); + formatString( ofile, (char *)str, taglen ); + str=(unsigned char *) RelinquishMagickMemory(str); + + tagsfound++; + + c=ReadBlobByte(ifile); + } + return((int) tagsfound); +} + +static int readWordFromBuffer(char **s, ssize_t *len) +{ + unsigned char + buffer[2]; + + int + i, + c; + + for (i=0; i<2; i++) + { + c = *(*s)++; (*len)--; + if (*len < 0) return -1; + buffer[i] = (unsigned char) c; + } + return (((int) buffer[ 0 ]) << 8) | + (((int) buffer[ 1 ])); +} + +static int formatIPTCfromBuffer(Image *ofile, char *s, ssize_t len) +{ + char + temp[MaxTextExtent]; + + unsigned int + foundiptc, + tagsfound; + + unsigned char + recnum, + dataset; + + unsigned char + *readable, + *str; + + ssize_t + tagindx, + taglen; + + int + i, + tagcount = (int) (sizeof(tags) / sizeof(tags[0])); + + int + c; + + foundiptc = 0; /* found the IPTC-Header */ + tagsfound = 0; /* number of tags found */ + + while (len > 0) + { + c = *s++; len--; + if (c == 0x1c) + foundiptc = 1; + else + { + if (foundiptc) + return -1; + else + continue; + } + /* + We found the 0x1c tag and now grab the dataset and record number tags. + */ + c = *s++; len--; + if (len < 0) return -1; + dataset = (unsigned char) c; + c = *s++; len--; + if (len < 0) return -1; + recnum = (unsigned char) c; + /* try to match this record to one of the ones in our named table */ + for (i=0; i< tagcount; i++) + if (tags[i].id == (short) recnum) + break; + if (i < tagcount) + readable=(unsigned char *) tags[i].name; + else + readable=(unsigned char *) ""; + /* + We decode the length of the block that follows - ssize_t or short fmt. + */ + c=(*s++); + len--; + if (len < 0) + return(-1); + if (c & (unsigned char) 0x80) + return(0); + else + { + s--; + len++; + taglen=readWordFromBuffer(&s, &len); + } + if (taglen < 0) + return(-1); + if (taglen > 65535) + return(-1); + /* make a buffer to hold the tag datand snag it from the input stream */ + str=(unsigned char *) AcquireQuantumMemory((size_t) (taglen+MaxTextExtent), + sizeof(*str)); + if (str == (unsigned char *) NULL) + return 0; + for (tagindx=0; tagindx 0) + (void) FormatLocaleString(temp,MaxTextExtent,"%d#%d#%s=", + (unsigned int) dataset,(unsigned int) recnum, readable); + else + (void) FormatLocaleString(temp,MaxTextExtent,"%d#%d=", + (unsigned int) dataset,(unsigned int) recnum); + (void) WriteBlobString(ofile,temp); + formatString( ofile, (char *)str, taglen ); + str=(unsigned char *) RelinquishMagickMemory(str); + + tagsfound++; + } + return ((int) tagsfound); +} + +static int format8BIM(Image *ifile, Image *ofile) +{ + char + temp[MaxTextExtent]; + + unsigned int + foundOSType; + + int + ID, + resCount, + i, + c; + + ssize_t + count; + + unsigned char + *PString, + *str; + + resCount=0; + foundOSType=0; /* found the OSType */ + (void) foundOSType; + c=ReadBlobByte(ifile); + while (c != EOF) + { + if (c == '8') + { + unsigned char + buffer[5]; + + buffer[0]=(unsigned char) c; + for (i=1; i<4; i++) + { + c=ReadBlobByte(ifile); + if (c == EOF) + return(-1); + buffer[i] = (unsigned char) c; + } + buffer[4]=0; + if (strcmp((const char *)buffer, "8BIM") == 0) + foundOSType=1; + else + continue; + } + else + { + c=ReadBlobByte(ifile); + continue; + } + /* + We found the OSType (8BIM) and now grab the ID, PString, and Size fields. + */ + ID=ReadBlobMSBSignedShort(ifile); + if (ID < 0) + return(-1); + { + unsigned char + plen; + + c=ReadBlobByte(ifile); + if (c == EOF) + return(-1); + plen = (unsigned char) c; + PString=(unsigned char *) AcquireQuantumMemory((size_t) (plen+ + MaxTextExtent),sizeof(*PString)); + if (PString == (unsigned char *) NULL) + return 0; + for (i=0; i (ssize_t) GetBlobSize(ifile))) + { + PString=(unsigned char *) RelinquishMagickMemory(PString); + return(-1); + } + /* make a buffer to hold the data and snag it from the input stream */ + str=(unsigned char *) AcquireQuantumMemory((size_t) count+1,sizeof(*str)); + if (str == (unsigned char *) NULL) + { + PString=(unsigned char *) RelinquishMagickMemory(PString); + return 0; + } + for (i=0; i < (ssize_t) count; i++) + { + c=ReadBlobByte(ifile); + if (c == EOF) + { + str=(unsigned char *) RelinquishMagickMemory(str); + PString=(unsigned char *) RelinquishMagickMemory(PString); + return(-1); + } + str[i]=(unsigned char) c; + } + + /* we currently skip thumbnails, since it does not make + * any sense preserving them in a real world application + */ + if (ID != THUMBNAIL_ID) + { + /* now finish up by formatting this binary data into + * ASCII equivalent + */ + if (strlen((const char *)PString) > 0) + (void) FormatLocaleString(temp,MaxTextExtent,"8BIM#%d#%s=",ID, + PString); + else + (void) FormatLocaleString(temp,MaxTextExtent,"8BIM#%d=",ID); + (void) WriteBlobString(ofile,temp); + if (ID == IPTC_ID) + { + formatString(ofile, "IPTC", 4); + formatIPTCfromBuffer(ofile, (char *)str, (ssize_t) count); + } + else + formatString(ofile, (char *)str, (ssize_t) count); + } + str=(unsigned char *) RelinquishMagickMemory(str); + PString=(unsigned char *) RelinquishMagickMemory(PString); + resCount++; + c=ReadBlobByte(ifile); + } + return resCount; +} + +static MagickBooleanType WriteMETAImage(const ImageInfo *image_info, + Image *image) +{ + const StringInfo + *profile; + + MagickBooleanType + status; + + size_t + length; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + length=0; + if (LocaleCompare(image_info->magick,"8BIM") == 0) + { + /* + Write 8BIM image. + */ + profile=GetImageProfile(image,"8bim"); + if (profile == (StringInfo *) NULL) + ThrowWriterException(CoderError,"No8BIMDataIsAvailable"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) WriteBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + (void) CloseBlob(image); + return(MagickTrue); + } + if (LocaleCompare(image_info->magick,"iptc") == 0) + { + size_t + length; + + unsigned char + *info; + + profile=GetImageProfile(image,"iptc"); + if (profile == (StringInfo *) NULL) + profile=GetImageProfile(image,"8bim"); + if (profile == (StringInfo *) NULL) + ThrowWriterException(CoderError,"No8BIMDataIsAvailable"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + info=GetStringInfoDatum(profile); + length=GetStringInfoLength(profile); + length=GetIPTCStream(&info,length); + if (length == 0) + ThrowWriterException(CoderError,"NoIPTCProfileAvailable"); + (void) WriteBlob(image,length,info); + (void) CloseBlob(image); + return(MagickTrue); + } + if (LocaleCompare(image_info->magick,"8BIMTEXT") == 0) + { + Image + *buff; + + profile=GetImageProfile(image,"8bim"); + if (profile == (StringInfo *) NULL) + ThrowWriterException(CoderError,"No8BIMDataIsAvailable"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + buff=AcquireImage((ImageInfo *) NULL); + if (buff == (Image *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + AttachBlob(buff->blob,GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + format8BIM(buff,image); + (void) DetachBlob(buff->blob); + buff=DestroyImage(buff); + (void) CloseBlob(image); + return(MagickTrue); + } + if (LocaleCompare(image_info->magick,"8BIMWTEXT") == 0) + return(MagickFalse); + if (LocaleCompare(image_info->magick,"IPTCTEXT") == 0) + { + Image + *buff; + + unsigned char + *info; + + profile=GetImageProfile(image,"8bim"); + if (profile == (StringInfo *) NULL) + ThrowWriterException(CoderError,"No8BIMDataIsAvailable"); + info=GetStringInfoDatum(profile); + length=GetStringInfoLength(profile); + length=GetIPTCStream(&info,length); + if (length == 0) + ThrowWriterException(CoderError,"NoIPTCProfileAvailable"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + buff=AcquireImage((ImageInfo *) NULL); + if (buff == (Image *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + AttachBlob(buff->blob,info,length); + formatIPTC(buff,image); + (void) DetachBlob(buff->blob); + buff=DestroyImage(buff); + (void) CloseBlob(image); + return(MagickTrue); + } + if (LocaleCompare(image_info->magick,"IPTCWTEXT") == 0) + return(MagickFalse); + if ((LocaleCompare(image_info->magick,"APP1") == 0) || + (LocaleCompare(image_info->magick,"EXIF") == 0) || + (LocaleCompare(image_info->magick,"XMP") == 0)) + { + /* + (void) Write APP1 image. + */ + profile=GetImageProfile(image,image_info->magick); + if (profile == (StringInfo *) NULL) + ThrowWriterException(CoderError,"NoAPP1DataIsAvailable"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) WriteBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + (void) CloseBlob(image); + return(MagickTrue); + } + if ((LocaleCompare(image_info->magick,"ICC") == 0) || + (LocaleCompare(image_info->magick,"ICM") == 0)) + { + /* + Write ICM image. + */ + profile=GetImageProfile(image,"icc"); + if (profile == (StringInfo *) NULL) + ThrowWriterException(CoderError,"NoColorProfileIsAvailable"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) WriteBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + (void) CloseBlob(image); + return(MagickTrue); + } + return(MagickFalse); +} diff --git a/ImageMagick-6.9.12-44/coders/miff.c b/ImageMagick-6.9.12-44/coders/miff.c new file mode 100644 index 0000000..a5dff52 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/miff.c @@ -0,0 +1,2802 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M IIIII FFFFF FFFFF % +% MM MM I F F % +% M M M I FFF FFF % +% M M I F F % +% M M IIIII F F % +% % +% % +% Read/Write MIFF Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/hashmap.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#if defined(MAGICKCORE_BZLIB_DELEGATE) +#include "bzlib.h" +#endif +#if defined(MAGICKCORE_LZMA_DELEGATE) +#include "lzma.h" +#endif +#if defined(MAGICKCORE_ZLIB_DELEGATE) +#include "zlib.h" +#endif + +/* + Define declarations. +*/ +#if !defined(LZMA_OK) +#define LZMA_OK 0 +#endif + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMIFFImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s M I F F % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsMIFF() returns MagickTrue if the image format type, identified by the +% magick string, is MIFF. +% +% The format of the IsMIFF method is: +% +% MagickBooleanType IsMIFF(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsMIFF(const unsigned char *magick,const size_t length) +{ + if (length < 14) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"id=ImageMagick",14) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMIFFImage() reads a MIFF image file and returns it. It allocates the +% memory necessary for the new Image structure and returns a pointer to the +% new image. +% +% The format of the ReadMIFFImage method is: +% +% Image *ReadMIFFImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% Decompression code contributed by Kyle Shorter. +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(MAGICKCORE_BZLIB_DELEGATE) || defined(MAGICKCORE_LZMA_DELEGATE) || defined(MAGICKCORE_ZLIB_DELEGATE) +static void *AcquireCompressionMemory(void *context,const size_t items, + const size_t size) +{ + size_t + extent; + + (void) context; + if (HeapOverflowSanityCheckGetSize(items,size,&extent) != MagickFalse) + return((void *) NULL); + if (extent > GetMaxMemoryRequest()) + return((void *) NULL); + return(AcquireMagickMemory(extent)); +} +#endif + +#if defined(MAGICKCORE_BZLIB_DELEGATE) +static void *AcquireBZIPMemory(void *context,int items,int size) + magick_attribute((__malloc__)); + +static void *AcquireBZIPMemory(void *context,int items,int size) +{ + return(AcquireCompressionMemory(context,(size_t) items,(size_t) size)); +} +#endif + +#if defined(MAGICKCORE_LZMA_DELEGATE) +static void *AcquireLZMAMemory(void *context,size_t items,size_t size) + magick_attribute((__malloc__)); + +static void *AcquireLZMAMemory(void *context,size_t items,size_t size) +{ + return(AcquireCompressionMemory(context,items,size)); +} +#endif + +#if defined(MAGICKCORE_ZLIB_DELEGATE) +static voidpf AcquireZIPMemory(voidpf context,unsigned int items, + unsigned int size) magick_attribute((__malloc__)); + +static voidpf AcquireZIPMemory(voidpf context,unsigned int items, + unsigned int size) +{ + return((voidpf) AcquireCompressionMemory(context,(size_t) items, + (size_t) size)); +} +#endif + +static void PushRunlengthPacket(Image *image,const unsigned char *pixels, + size_t *length,PixelPacket *pixel,IndexPacket *index) +{ + const unsigned char + *p; + + p=pixels; + if (image->storage_class == PseudoClass) + { + *index=(IndexPacket) 0; + switch (image->depth) + { + case 32: + default: + { + *index=ConstrainColormapIndex(image,(ssize_t) (((size_t) *p << 24) | + ((size_t) *(p+1) << 16) | ((size_t) *(p+2) << 8) | + (size_t) *(p+3))); + p+=4; + break; + } + case 16: + { + *index=ConstrainColormapIndex(image,(ssize_t) ((size_t) (*p << 8) | + (size_t) *(p+1))); + p+=2; + break; + } + case 8: + { + *index=ConstrainColormapIndex(image,(ssize_t) *p); + p++; + break; + } + } + *pixel=image->colormap[(ssize_t) *index]; + switch (image->depth) + { + case 8: + { + unsigned char + quantum; + + if (image->matte != MagickFalse) + { + p=PushCharPixel(p,&quantum); + pixel->opacity=ScaleCharToQuantum(quantum); + } + break; + } + case 16: + { + unsigned short + quantum; + + if (image->matte != MagickFalse) + { + p=PushShortPixel(MSBEndian,p,&quantum); + pixel->opacity=(Quantum) ((size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + } + break; + } + case 32: + default: + { + unsigned int + quantum; + + if (image->matte != MagickFalse) + { + p=PushLongPixel(MSBEndian,p,&quantum); + pixel->opacity=(Quantum) ((size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + } + break; + } + } + *length=((size_t) *p++)+1; + return; + } + switch (image->depth) + { + case 8: + { + unsigned char + quantum; + + p=PushCharPixel(p,&quantum); + SetPixelRed(pixel,ScaleCharToQuantum(quantum)); + SetPixelGreen(pixel,ScaleCharToQuantum(quantum)); + SetPixelBlue(pixel,ScaleCharToQuantum(quantum)); + if (IsGrayColorspace(image->colorspace) == MagickFalse) + { + p=PushCharPixel(p,&quantum); + SetPixelGreen(pixel,ScaleCharToQuantum(quantum)); + p=PushCharPixel(p,&quantum); + SetPixelBlue(pixel,ScaleCharToQuantum(quantum)); + } + if (image->colorspace == CMYKColorspace) + { + p=PushCharPixel(p,&quantum); + SetPixelBlack(index,ScaleCharToQuantum(quantum)); + } + if (image->matte != MagickFalse) + { + p=PushCharPixel(p,&quantum); + SetPixelOpacity(pixel,ScaleCharToQuantum(quantum)); + } + break; + } + case 16: + { + unsigned short + quantum; + + p=PushShortPixel(MSBEndian,p,&quantum); + SetPixelRed(pixel,(size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + SetPixelGreen(pixel,ScaleCharToQuantum((unsigned char) quantum)); + SetPixelBlue(pixel,ScaleCharToQuantum((unsigned char) quantum)); + if (IsGrayColorspace(image->colorspace) == MagickFalse) + { + p=PushShortPixel(MSBEndian,p,&quantum); + SetPixelGreen(pixel,(size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + p=PushShortPixel(MSBEndian,p,&quantum); + SetPixelBlue(pixel,(size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + } + if (image->colorspace == CMYKColorspace) + { + p=PushShortPixel(MSBEndian,p,&quantum); + SetPixelBlack(index,(size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + } + if (image->matte != MagickFalse) + { + p=PushShortPixel(MSBEndian,p,&quantum); + SetPixelOpacity(pixel,(size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + } + break; + } + case 32: + default: + { + unsigned int + quantum; + + p=PushLongPixel(MSBEndian,p,&quantum); + SetPixelRed(pixel,quantum >> ((size_t) image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + SetPixelGreen(pixel,ScaleCharToQuantum(quantum)); + SetPixelBlue(pixel,ScaleCharToQuantum(quantum)); + if (IsGrayColorspace(image->colorspace) == MagickFalse) + { + p=PushLongPixel(MSBEndian,p,&quantum); + SetPixelGreen(pixel,(size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + p=PushLongPixel(MSBEndian,p,&quantum); + SetPixelBlue(pixel,(size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + } + if (image->colorspace == CMYKColorspace) + { + p=PushLongPixel(MSBEndian,p,&quantum); + SetPixelIndex(index,(size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + } + if (image->matte != MagickFalse) + { + p=PushLongPixel(MSBEndian,p,&quantum); + SetPixelOpacity(pixel,(size_t) quantum >> (image->depth- + MAGICKCORE_QUANTUM_DEPTH)); + } + break; + } + } + *length=(size_t) (*p++)+1; +} + +#if defined(MAGICKCORE_BZLIB_DELEGATE) +static void RelinquishBZIPMemory(void *context,void *memory) +{ + (void) context; + memory=RelinquishMagickMemory(memory); +} +#endif + +#if defined(MAGICKCORE_LZMA_DELEGATE) +static void RelinquishLZMAMemory(void *context,void *memory) +{ + (void) context; + memory=RelinquishMagickMemory(memory); +} +#endif + +#if defined(MAGICKCORE_ZLIB_DELEGATE) +static void RelinquishZIPMemory(voidpf context,voidpf memory) +{ + (void) context; + memory=RelinquishMagickMemory(memory); +} +#endif + +static Image *ReadMIFFImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ +#define BZipMaxExtent(x) ((x)+((x)/100)+600) +#define LZMAMaxExtent(x) ((x)+((x)/3)+128) +#define ThrowMIFFException(exception,message) \ +{ \ + if (quantum_info != (QuantumInfo *) NULL) \ + quantum_info=DestroyQuantumInfo(quantum_info); \ + if (compress_pixels != (unsigned char *) NULL) \ + compress_pixels=(unsigned char *) RelinquishMagickMemory(compress_pixels); \ + ThrowReaderException((exception),(message)); \ +} +#define ZipMaxExtent(x) ((x)+(((x)+7) >> 3)+(((x)+63) >> 6)+11) + +#if defined(MAGICKCORE_BZLIB_DELEGATE) + bz_stream + bzip_info; +#endif + + char + id[MaxTextExtent], + keyword[MaxTextExtent], + *options; + + const unsigned char + *p; + + double + version; + + GeometryInfo + geometry_info; + + Image + *image; + + IndexPacket + index; + + int + c; + + LinkedListInfo + *profiles; + +#if defined(MAGICKCORE_LZMA_DELEGATE) + lzma_stream + initialize_lzma = LZMA_STREAM_INIT, + lzma_info; + + lzma_allocator + allocator; +#endif + + MagickBooleanType + status; + + MagickStatusType + flags; + + PixelPacket + pixel; + + QuantumFormatType + quantum_format; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + i; + + size_t + compress_extent, + extent, + length, + packet_size; + + ssize_t + count; + + unsigned char + *compress_pixels, + *pixels; + + size_t + colors; + + ssize_t + y; + +#if defined(MAGICKCORE_ZLIB_DELEGATE) + z_stream + zip_info; +#endif + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Decode image header; header terminates one character beyond a ':'. + */ + c=ReadBlobByte(image); + if (c == EOF) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + *id='\0'; + compress_pixels=(unsigned char *) NULL; + quantum_info=(QuantumInfo *) NULL; + (void) memset(keyword,0,sizeof(keyword)); + version=0.0; + (void) version; + do + { + /* + Decode image header; header terminates one character beyond a ':'. + */ + SetGeometryInfo(&geometry_info); + length=MaxTextExtent; + options=AcquireString((char *) NULL); + quantum_format=UndefinedQuantumFormat; + profiles=(LinkedListInfo *) NULL; + colors=0; + image->depth=8UL; + image->compression=NoCompression; + while ((isgraph((int) ((unsigned char) c)) != 0) && (c != (int) ':')) + { + char + *p; + + if (c == (int) '{') + { + char + *comment; + + /* + Read comment-- any text between { }. + */ + length=MaxTextExtent; + comment=AcquireString((char *) NULL); + for (p=comment; comment != (char *) NULL; p++) + { + c=ReadBlobByte(image); + if (c == (int) '\\') + c=ReadBlobByte(image); + else + if ((c == EOF) || (c == (int) '}')) + break; + if ((size_t) (p-comment+1) >= length) + { + *p='\0'; + length<<=1; + comment=(char *) ResizeQuantumMemory(comment, + OverAllocateMemory(length+MagickPathExtent),sizeof(*comment)); + if (comment == (char *) NULL) + break; + p=comment+strlen(comment); + } + *p=(char) c; + } + if (comment == (char *) NULL) + { + options=DestroyString(options); + ThrowMIFFException(ResourceLimitError,"MemoryAllocationFailed"); + } + *p='\0'; + (void) SetImageProperty(image,"comment",comment); + comment=DestroyString(comment); + c=ReadBlobByte(image); + } + else + if (isalnum((int) ((unsigned char) c)) != MagickFalse) + { + /* + Get the keyword. + */ + length=MaxTextExtent-1; + p=keyword; + do + { + if (c == (int) '=') + break; + if ((size_t) (p-keyword) < (MaxTextExtent-1)) + *p++=(char) c; + c=ReadBlobByte(image); + } while (c != EOF); + *p='\0'; + p=options; + while ((isspace((int) ((unsigned char) c)) != 0) && (c != EOF)) + c=ReadBlobByte(image); + if (c == (int) '=') + { + /* + Get the keyword value. + */ + c=ReadBlobByte(image); + while ((c != (int) '}') && (c != EOF)) + { + if ((size_t) (p-options+1) >= length) + { + *p='\0'; + length<<=1; + options=(char *) ResizeQuantumMemory(options,length+ + MaxTextExtent,sizeof(*options)); + if (options == (char *) NULL) + break; + p=options+strlen(options); + } + *p++=(char) c; + c=ReadBlobByte(image); + if (c == '\\') + { + c=ReadBlobByte(image); + if (c == (int) '}') + { + *p++=(char) c; + c=ReadBlobByte(image); + } + } + if (*options != '{') + if (isspace((int) ((unsigned char) c)) != 0) + break; + } + if (options == (char *) NULL) + ThrowMIFFException(ResourceLimitError, + "MemoryAllocationFailed"); + } + *p='\0'; + if (*options == '{') + (void) CopyMagickString(options,options+1,strlen(options)); + /* + Assign a value to the specified keyword. + */ + switch (*keyword) + { + case 'b': + case 'B': + { + if (LocaleCompare(keyword,"background-color") == 0) + { + (void) QueryColorDatabase(options,&image->background_color, + exception); + break; + } + if (LocaleCompare(keyword,"blue-primary") == 0) + { + flags=ParseGeometry(options,&geometry_info); + image->chromaticity.blue_primary.x=geometry_info.rho; + image->chromaticity.blue_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.blue_primary.y= + image->chromaticity.blue_primary.x; + break; + } + if (LocaleCompare(keyword,"border-color") == 0) + { + (void) QueryColorDatabase(options,&image->border_color, + exception); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'c': + case 'C': + { + if (LocaleCompare(keyword,"class") == 0) + { + ssize_t + storage_class; + + storage_class=ParseCommandOption(MagickClassOptions, + MagickFalse,options); + if (storage_class < 0) + break; + image->storage_class=(ClassType) storage_class; + break; + } + if (LocaleCompare(keyword,"colors") == 0) + { + colors=StringToUnsignedLong(options); + break; + } + if (LocaleCompare(keyword,"colorspace") == 0) + { + ssize_t + colorspace; + + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,options); + if (colorspace < 0) + break; + image->colorspace=(ColorspaceType) colorspace; + break; + } + if (LocaleCompare(keyword,"compression") == 0) + { + ssize_t + compression; + + compression=ParseCommandOption(MagickCompressOptions, + MagickFalse,options); + if (compression < 0) + break; + image->compression=(CompressionType) compression; + break; + } + if (LocaleCompare(keyword,"columns") == 0) + { + image->columns=StringToUnsignedLong(options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'd': + case 'D': + { + if (LocaleCompare(keyword,"delay") == 0) + { + image->delay=StringToUnsignedLong(options); + break; + } + if (LocaleCompare(keyword,"depth") == 0) + { + image->depth=StringToUnsignedLong(options); + break; + } + if (LocaleCompare(keyword,"dispose") == 0) + { + ssize_t + dispose; + + dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse, + options); + if (dispose < 0) + break; + image->dispose=(DisposeType) dispose; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'e': + case 'E': + { + if (LocaleCompare(keyword,"endian") == 0) + { + ssize_t + endian; + + endian=ParseCommandOption(MagickEndianOptions,MagickFalse, + options); + if (endian < 0) + break; + image->endian=(EndianType) endian; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(keyword,"gamma") == 0) + { + image->gamma=StringToDouble(options,(char **) NULL); + break; + } + if (LocaleCompare(keyword,"gravity") == 0) + { + ssize_t + gravity; + + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse, + options); + if (gravity < 0) + break; + image->gravity=(GravityType) gravity; + break; + } + if (LocaleCompare(keyword,"green-primary") == 0) + { + flags=ParseGeometry(options,&geometry_info); + image->chromaticity.green_primary.x=geometry_info.rho; + image->chromaticity.green_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.green_primary.y= + image->chromaticity.green_primary.x; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'i': + case 'I': + { + if (LocaleCompare(keyword,"id") == 0) + { + if (*id != '\0') + ThrowMIFFException(CorruptImageError, + "ImproperImageHeader"); + (void) CopyMagickString(id,options,MaxTextExtent); + break; + } + if (LocaleCompare(keyword,"iterations") == 0) + { + image->iterations=StringToUnsignedLong(options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'm': + case 'M': + { + if (LocaleCompare(keyword,"matte") == 0) + { + ssize_t + matte; + + matte=ParseCommandOption(MagickBooleanOptions,MagickFalse, + options); + if (matte < 0) + break; + image->matte=(MagickBooleanType) matte; + break; + } + if (LocaleCompare(keyword,"matte-color") == 0) + { + (void) QueryColorDatabase(options,&image->matte_color, + exception); + break; + } + if (LocaleCompare(keyword,"montage") == 0) + { + (void) CloneString(&image->montage,options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'o': + case 'O': + { + if (LocaleCompare(keyword,"opaque") == 0) + { + ssize_t + matte; + + matte=ParseCommandOption(MagickBooleanOptions,MagickFalse, + options); + if (matte < 0) + break; + image->matte=(MagickBooleanType) matte; + break; + } + if (LocaleCompare(keyword,"orientation") == 0) + { + ssize_t + orientation; + + orientation=ParseCommandOption(MagickOrientationOptions, + MagickFalse,options); + if (orientation < 0) + break; + image->orientation=(OrientationType) orientation; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'p': + case 'P': + { + if (LocaleCompare(keyword,"page") == 0) + { + char + *geometry; + + geometry=GetPageGeometry(options); + (void) ParseAbsoluteGeometry(geometry,&image->page); + geometry=DestroyString(geometry); + break; + } + if (LocaleCompare(keyword,"pixel-intensity") == 0) + { + ssize_t + intensity; + + intensity=ParseCommandOption(MagickPixelIntensityOptions, + MagickFalse,options); + if (intensity < 0) + break; + image->intensity=(PixelIntensityMethod) intensity; + break; + } + if (LocaleCompare(keyword,"profile") == 0) + { + if (profiles == (LinkedListInfo *) NULL) + profiles=NewLinkedList(0); + (void) AppendValueToLinkedList(profiles, + AcquireString(options)); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'q': + case 'Q': + { + if (LocaleCompare(keyword,"quality") == 0) + { + image->quality=StringToUnsignedLong(options); + break; + } + if ((LocaleCompare(keyword,"quantum-format") == 0) || + (LocaleCompare(keyword,"quantum:format") == 0)) + { + ssize_t + format; + + format=ParseCommandOption(MagickQuantumFormatOptions, + MagickFalse,options); + if (format < 0) + break; + quantum_format=(QuantumFormatType) format; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'r': + case 'R': + { + if (LocaleCompare(keyword,"red-primary") == 0) + { + flags=ParseGeometry(options,&geometry_info); + image->chromaticity.red_primary.x=geometry_info.rho; + image->chromaticity.red_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.red_primary.y= + image->chromaticity.red_primary.x; + break; + } + if (LocaleCompare(keyword,"rendering-intent") == 0) + { + ssize_t + rendering_intent; + + rendering_intent=ParseCommandOption(MagickIntentOptions, + MagickFalse,options); + if (rendering_intent < 0) + break; + image->rendering_intent=(RenderingIntent) rendering_intent; + break; + } + if (LocaleCompare(keyword,"resolution") == 0) + { + flags=ParseGeometry(options,&geometry_info); + image->x_resolution=geometry_info.rho; + image->y_resolution=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->y_resolution=image->x_resolution; + break; + } + if (LocaleCompare(keyword,"rows") == 0) + { + image->rows=StringToUnsignedLong(options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 's': + case 'S': + { + if (LocaleCompare(keyword,"scene") == 0) + { + image->scene=StringToUnsignedLong(options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 't': + case 'T': + { + if (LocaleCompare(keyword,"ticks-per-second") == 0) + { + image->ticks_per_second=(ssize_t) StringToLong(options); + break; + } + if (LocaleCompare(keyword,"tile-offset") == 0) + { + char + *geometry; + + geometry=GetPageGeometry(options); + (void) ParseAbsoluteGeometry(geometry,&image->tile_offset); + geometry=DestroyString(geometry); + break; + } + if (LocaleCompare(keyword,"type") == 0) + { + ssize_t + type; + + type=ParseCommandOption(MagickTypeOptions,MagickFalse, + options); + if (type < 0) + break; + image->type=(ImageType) type; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'u': + case 'U': + { + if (LocaleCompare(keyword,"units") == 0) + { + ssize_t + units; + + units=ParseCommandOption(MagickResolutionOptions, + MagickFalse,options); + if (units < 0) + break; + image->units=(ResolutionType) units; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'v': + case 'V': + { + if (LocaleCompare(keyword,"version") == 0) + { + version=StringToDouble(options,(char **) NULL); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'w': + case 'W': + { + if (LocaleCompare(keyword,"white-point") == 0) + { + flags=ParseGeometry(options,&geometry_info); + image->chromaticity.white_point.x=geometry_info.rho; + image->chromaticity.white_point.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.white_point.y= + image->chromaticity.white_point.x; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + default: + { + (void) SetImageProperty(image,keyword,options); + break; + } + } + } + else + c=ReadBlobByte(image); + while (isspace((int) ((unsigned char) c)) != 0) + c=ReadBlobByte(image); + } + options=DestroyString(options); + (void) ReadBlobByte(image); + /* + Verify that required image information is defined. + */ + if ((LocaleCompare(id,"ImageMagick") != 0) || + (image->storage_class == UndefinedClass) || + (image->compression == UndefinedCompression) || + (image->colorspace == UndefinedColorspace) || + (image->columns == 0) || (image->rows == 0) || + (image->depth == 0) || (image->depth > 64)) + { + if (profiles != (LinkedListInfo *) NULL) + profiles=DestroyLinkedList(profiles,RelinquishMagickMemory); + if (image->previous == (Image *) NULL) + ThrowMIFFException(CorruptImageError,"ImproperImageHeader"); + DeleteImageFromList(&image); + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CorruptImageError,"ImproperImageHeader","`%s'",image->filename); + break; + } + *id='\0'; + if (image->montage != (char *) NULL) + { + char + *p; + + /* + Image directory. + */ + extent=MaxTextExtent; + image->directory=AcquireString((char *) NULL); + p=image->directory; + length=0; + do + { + *p='\0'; + if ((length+MaxTextExtent) >= extent) + { + /* + Allocate more memory for the image directory. + */ + extent<<=1; + image->directory=(char *) ResizeQuantumMemory(image->directory, + extent+MaxTextExtent,sizeof(*image->directory)); + if (image->directory == (char *) NULL) + ThrowMIFFException(CorruptImageError,"UnableToReadImageData"); + p=image->directory+length; + } + c=ReadBlobByte(image); + if (c == EOF) + break; + *p++=(char) c; + length++; + } while (c != (int) '\0'); + } + if (profiles != (LinkedListInfo *) NULL) + { + const char + *name; + + StringInfo + *profile; + + /* + Read image profile blobs. + */ + ResetLinkedListIterator(profiles); + name=(const char *) GetNextValueInLinkedList(profiles); + while (name != (const char *) NULL) + { + ssize_t + count; + + length=ReadBlobMSBLong(image); + if ((length == 0) || ((MagickSizeType) length > GetBlobSize(image))) + break; + profile=AcquireStringInfo(length); + if (profile == (StringInfo *) NULL) + break; + count=ReadBlob(image,length,GetStringInfoDatum(profile)); + if (count != (ssize_t) length) + { + profile=DestroyStringInfo(profile); + break; + } + status=SetImageProfile(image,name,profile); + profile=DestroyStringInfo(profile); + if (status == MagickFalse) + break; + name=(const char *) GetNextValueInLinkedList(profiles); + } + profiles=DestroyLinkedList(profiles,RelinquishMagickMemory); + } + image->depth=GetImageQuantumDepth(image,MagickFalse); + if (image->storage_class == PseudoClass) + { + size_t + packet_size; + + unsigned char + *colormap; + + /* + Create image colormap. + */ + packet_size=(size_t) (3UL*image->depth/8UL); + if ((MagickSizeType) colors > GetBlobSize(image)) + ThrowMIFFException(CorruptImageError,"InsufficientImageDataInFile"); + if (((MagickSizeType) packet_size*colors) > GetBlobSize(image)) + ThrowMIFFException(CorruptImageError,"InsufficientImageDataInFile"); + status=AcquireImageColormap(image,colors != 0 ? colors : 256); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (colors != 0) + { + /* + Read image colormap from file. + */ + colormap=(unsigned char *) AcquireQuantumMemory(image->colors, + packet_size*sizeof(*colormap)); + if (colormap == (unsigned char *) NULL) + ThrowMIFFException(ResourceLimitError,"MemoryAllocationFailed"); + (void) ReadBlob(image,packet_size*image->colors,colormap); + p=colormap; + switch (image->depth) + { + case 8: + { + unsigned char + pixel; + + for (i=0; i < (ssize_t) image->colors; i++) + { + p=PushCharPixel(p,&pixel); + image->colormap[i].red=ScaleCharToQuantum(pixel); + p=PushCharPixel(p,&pixel); + image->colormap[i].green=ScaleCharToQuantum(pixel); + p=PushCharPixel(p,&pixel); + image->colormap[i].blue=ScaleCharToQuantum(pixel); + } + break; + } + case 16: + { + unsigned short + pixel; + + for (i=0; i < (ssize_t) image->colors; i++) + { + p=PushShortPixel(MSBEndian,p,&pixel); + image->colormap[i].red=ScaleShortToQuantum(pixel); + p=PushShortPixel(MSBEndian,p,&pixel); + image->colormap[i].green=ScaleShortToQuantum(pixel); + p=PushShortPixel(MSBEndian,p,&pixel); + image->colormap[i].blue=ScaleShortToQuantum(pixel); + } + break; + } + case 32: + default: + { + unsigned int + pixel; + + for (i=0; i < (ssize_t) image->colors; i++) + { + p=PushLongPixel(MSBEndian,p,&pixel); + image->colormap[i].red=ScaleLongToQuantum(pixel); + p=PushLongPixel(MSBEndian,p,&pixel); + image->colormap[i].green=ScaleLongToQuantum(pixel); + p=PushLongPixel(MSBEndian,p,&pixel); + image->colormap[i].blue=ScaleLongToQuantum(pixel); + } + break; + } + } + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + } + } + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Allocate image pixels. + */ + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowMIFFException(ResourceLimitError,"MemoryAllocationFailed"); + if (quantum_format != UndefinedQuantumFormat) + { + status=SetQuantumFormat(image,quantum_info,quantum_format); + if (status == MagickFalse) + ThrowMIFFException(ResourceLimitError,"MemoryAllocationFailed"); + } + packet_size=(size_t) (quantum_info->depth/8); + if (image->storage_class == DirectClass) + packet_size=(size_t) (3*quantum_info->depth/8); + if (IsGrayColorspace(image->colorspace) != MagickFalse) + packet_size=quantum_info->depth/8; + if (image->matte != MagickFalse) + packet_size+=quantum_info->depth/8; + if (image->colorspace == CMYKColorspace) + packet_size+=quantum_info->depth/8; + if (image->compression == RLECompression) + packet_size++; + compress_extent=MagickMax(MagickMax(BZipMaxExtent(packet_size* + image->columns),LZMAMaxExtent(packet_size*image->columns)), + ZipMaxExtent(packet_size*image->columns)); + if (compress_extent < (packet_size*image->columns)) + ThrowMIFFException(ResourceLimitError,"MemoryAllocationFailed"); + compress_pixels=(unsigned char *) AcquireQuantumMemory(compress_extent, + sizeof(*compress_pixels)); + if (compress_pixels == (unsigned char *) NULL) + ThrowMIFFException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Read image pixels. + */ + quantum_type=RGBQuantum; + if (image->matte != MagickFalse) + quantum_type=RGBAQuantum; + if (image->colorspace == CMYKColorspace) + { + quantum_type=CMYKQuantum; + if (image->matte != MagickFalse) + quantum_type=CMYKAQuantum; + } + if (IsGrayColorspace(image->colorspace) != MagickFalse) + { + quantum_type=GrayQuantum; + if (image->matte != MagickFalse) + quantum_type=GrayAlphaQuantum; + } + if (image->storage_class == PseudoClass) + { + quantum_type=IndexQuantum; + if (image->matte != MagickFalse) + quantum_type=IndexAlphaQuantum; + } + status=MagickTrue; + (void) memset(&pixel,0,sizeof(pixel)); +#if defined(MAGICKCORE_BZLIB_DELEGATE) + (void) memset(&bzip_info,0,sizeof(bzip_info)); +#endif +#if defined(MAGICKCORE_LZMA_DELEGATE) + (void) memset(&allocator,0,sizeof(allocator)); +#endif +#if defined(MAGICKCORE_ZLIB_DELEGATE) + (void) memset(&zip_info,0,sizeof(zip_info)); +#endif + switch (image->compression) + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + case BZipCompression: + { + int + code; + + bzip_info.bzalloc=AcquireBZIPMemory; + bzip_info.bzfree=RelinquishBZIPMemory; + bzip_info.opaque=(void *) image; + code=BZ2_bzDecompressInit(&bzip_info,(int) image_info->verbose, + MagickFalse); + if (code != BZ_OK) + status=MagickFalse; + break; + } +#endif +#if defined(MAGICKCORE_LZMA_DELEGATE) + case LZMACompression: + { + int + code; + + allocator.alloc=AcquireLZMAMemory; + allocator.free=RelinquishLZMAMemory; + allocator.opaque=(void *) image; + lzma_info=initialize_lzma; + lzma_info.allocator=(&allocator); + code=lzma_auto_decoder(&lzma_info,-1,0); + if (code != LZMA_OK) + status=MagickFalse; + break; + } +#endif +#if defined(MAGICKCORE_ZLIB_DELEGATE) + case LZWCompression: + case ZipCompression: + { + int + code; + + zip_info.zalloc=AcquireZIPMemory; + zip_info.zfree=RelinquishZIPMemory; + zip_info.opaque=(voidpf) image; + code=inflateInit(&zip_info); + if (code != Z_OK) + status=MagickFalse; + break; + } +#endif + case RLECompression: + { + pixel.opacity=(Quantum) TransparentOpacity; + index=(IndexPacket) 0; + break; + } + default: + break; + } + pixels=GetQuantumPixels(quantum_info); + index=(IndexPacket) 0; + length=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict q; + + if (status == MagickFalse) + break; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + extent=0; + switch (image->compression) + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + case BZipCompression: + { + bzip_info.next_out=(char *) pixels; + bzip_info.avail_out=(unsigned int) (packet_size*image->columns); + do + { + int + code; + + if (bzip_info.avail_in == 0) + { + bzip_info.next_in=(char *) compress_pixels; + length=(size_t) BZipMaxExtent(packet_size*image->columns); + if (version != 0.0) + length=(size_t) ReadBlobMSBLong(image); + if (length < compress_extent) + bzip_info.avail_in=(unsigned int) ReadBlob(image,length, + (unsigned char *) bzip_info.next_in); + if ((length > compress_extent) || + ((size_t) bzip_info.avail_in != length)) + { + (void) BZ2_bzDecompressEnd(&bzip_info); + ThrowMIFFException(CorruptImageError, + "UnableToReadImageData"); + } + } + code=BZ2_bzDecompress(&bzip_info); + if ((code != BZ_OK) && (code != BZ_STREAM_END)) + { + status=MagickFalse; + break; + } + if (code == BZ_STREAM_END) + break; + } while (bzip_info.avail_out != 0); + extent=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,pixels,exception); + break; + } +#endif +#if defined(MAGICKCORE_LZMA_DELEGATE) + case LZMACompression: + { + lzma_info.next_out=pixels; + lzma_info.avail_out=packet_size*image->columns; + do + { + int + code; + + if (lzma_info.avail_in == 0) + { + lzma_info.next_in=compress_pixels; + length=(size_t) ReadBlobMSBLong(image); + if (length <= compress_extent) + lzma_info.avail_in=(unsigned int) ReadBlob(image,length, + (unsigned char *) lzma_info.next_in); + if ((length > compress_extent) || + (lzma_info.avail_in != length)) + { + lzma_end(&lzma_info); + ThrowMIFFException(CorruptImageError, + "UnableToReadImageData"); + } + } + code=lzma_code(&lzma_info,LZMA_RUN); + if ((code != LZMA_OK) && (code != LZMA_STREAM_END)) + { + status=MagickFalse; + break; + } + if (code == LZMA_STREAM_END) + break; + } while (lzma_info.avail_out != 0); + extent=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,pixels,exception); + break; + } +#endif +#if defined(MAGICKCORE_ZLIB_DELEGATE) + case LZWCompression: + case ZipCompression: + { + zip_info.next_out=pixels; + zip_info.avail_out=(uInt) (packet_size*image->columns); + do + { + int + code; + + if (zip_info.avail_in == 0) + { + zip_info.next_in=compress_pixels; + length=(size_t) ZipMaxExtent(packet_size*image->columns); + if (version != 0.0) + length=(size_t) ReadBlobMSBLong(image); + if (length <= compress_extent) + zip_info.avail_in=(unsigned int) ReadBlob(image,length, + zip_info.next_in); + if ((length > compress_extent) || + ((size_t) zip_info.avail_in != length)) + { + (void) inflateEnd(&zip_info); + ThrowMIFFException(CorruptImageError, + "UnableToReadImageData"); + } + } + code=inflate(&zip_info,Z_SYNC_FLUSH); + if ((code != Z_OK) && (code != Z_STREAM_END)) + { + status=MagickFalse; + break; + } + if (code == Z_STREAM_END) + break; + } while (zip_info.avail_out != 0); + extent=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,pixels,exception); + break; + } +#endif + case RLECompression: + { + for (x=0; x < (ssize_t) image->columns; x++) + { + if (length == 0) + { + count=ReadBlob(image,packet_size,pixels); + if (count != (ssize_t) packet_size) + ThrowMIFFException(CorruptImageError,"UnableToReadImageData"); + PushRunlengthPacket(image,pixels,&length,&pixel,&index); + } + length--; + if ((image->storage_class == PseudoClass) || + (image->colorspace == CMYKColorspace)) + SetPixelIndex(indexes+x,index); + SetPixelRed(q,pixel.red); + SetPixelGreen(q,pixel.green); + SetPixelBlue(q,pixel.blue); + SetPixelOpacity(q,pixel.opacity); + q++; + } + extent=(size_t) x; + break; + } + default: + { + const void + *stream; + + stream=ReadBlobStream(image,packet_size*image->columns,pixels,&count); + if (count != (ssize_t) (packet_size*image->columns)) + ThrowMIFFException(CorruptImageError,"UnableToReadImageData"); + extent=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,(unsigned char *) stream,exception); + break; + } + } + if (extent < image->columns) + break; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + SetQuantumImageType(image,quantum_type); + switch (image->compression) + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + case BZipCompression: + { + int + code; + + if (version == 0.0) + { + MagickOffsetType + offset; + + offset=SeekBlob(image,-((MagickOffsetType) bzip_info.avail_in), + SEEK_CUR); + if (offset < 0) + { + (void) BZ2_bzDecompressEnd(&bzip_info); + ThrowMIFFException(CorruptImageError,"ImproperImageHeader"); + } + } + code=BZ2_bzDecompressEnd(&bzip_info); + if (code != BZ_OK) + status=MagickFalse; + break; + } +#endif +#if defined(MAGICKCORE_LZMA_DELEGATE) + case LZMACompression: + { + int + code; + + code=lzma_code(&lzma_info,LZMA_FINISH); + if ((code != LZMA_STREAM_END) && (code != LZMA_OK)) + status=MagickFalse; + lzma_end(&lzma_info); + break; + } +#endif +#if defined(MAGICKCORE_ZLIB_DELEGATE) + case LZWCompression: + case ZipCompression: + { + int + code; + + if (version == 0.0) + { + MagickOffsetType + offset; + + offset=SeekBlob(image,-((MagickOffsetType) zip_info.avail_in), + SEEK_CUR); + if (offset < 0) + { + (void) inflateEnd(&zip_info); + ThrowMIFFException(CorruptImageError,"ImproperImageHeader"); + } + } + code=inflateEnd(&zip_info); + if (code != Z_OK) + status=MagickFalse; + break; + } +#endif + default: + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + compress_pixels=(unsigned char *) RelinquishMagickMemory(compress_pixels); + if (((y != (ssize_t) image->rows)) || (status == MagickFalse)) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + do + { + c=ReadBlobByte(image); + } while ((isgraph((int) ((unsigned char) c)) == 0) && (c != EOF)); + if ((c != EOF) && ((c == 'i') || (c == 'I'))) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while (c != EOF && ((c == 'i') || (c == 'I'))); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMIFFImage() adds properties for the MIFF image format to the list of +% supported formats. The properties include the image format tag, a method to +% read and/or write the format, whether the format supports the saving of more +% than one frame to the same file or blob, whether the format supports native +% in-memory I/O, and a brief description of the format. +% +% The format of the RegisterMIFFImage method is: +% +% size_t RegisterMIFFImage(void) +% +*/ +ModuleExport size_t RegisterMIFFImage(void) +{ + char + version[MaxTextExtent]; + + MagickInfo + *entry; + + *version='\0'; +#if defined(MagickImageCoderSignatureText) + (void) CopyMagickString(version,MagickLibVersionText,MaxTextExtent); +#if defined(ZLIB_VERSION) + (void) ConcatenateMagickString(version," with Zlib ",MaxTextExtent); + (void) ConcatenateMagickString(version,ZLIB_VERSION,MaxTextExtent); +#endif +#if defined(MAGICKCORE_BZLIB_DELEGATE) + (void) ConcatenateMagickString(version," and BZlib",MaxTextExtent); +#endif +#endif + entry=SetMagickInfo("MIFF"); + entry->decoder=(DecodeImageHandler *) ReadMIFFImage; + entry->encoder=(EncodeImageHandler *) WriteMIFFImage; + entry->magick=(IsImageFormatHandler *) IsMIFF; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Magick Image File Format"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick_module=ConstantString("MIFF"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMIFFImage() removes format registrations made by the MIFF module +% from the list of supported formats. +% +% The format of the UnregisterMIFFImage method is: +% +% UnregisterMIFFImage(void) +% +*/ +ModuleExport void UnregisterMIFFImage(void) +{ + (void) UnregisterMagickInfo("MIFF"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMIFFImage() writes a MIFF image to a file. +% +% The format of the WriteMIFFImage method is: +% +% MagickBooleanType WriteMIFFImage(const ImageInfo *image_info, +% Image *image) +% +% Compression code contributed by Kyle Shorter. +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the image. +% +*/ + +static unsigned char *PopRunlengthPacket(Image *image,unsigned char *pixels, + size_t length,PixelPacket pixel,IndexPacket index) +{ + if (image->storage_class != DirectClass) + { + unsigned int + value; + + value=(unsigned int) index; + switch (image->depth) + { + case 32: + default: + { + *pixels++=(unsigned char) (value >> 24); + *pixels++=(unsigned char) (value >> 16); + } + case 16: + *pixels++=(unsigned char) (value >> 8); + case 8: + { + *pixels++=(unsigned char) value; + break; + } + } + switch (image->depth) + { + case 32: + default: + { + unsigned int + value; + + if (image->matte != MagickFalse) + { + value=ScaleQuantumToLong(pixel.opacity); + pixels=PopLongPixel(MSBEndian,value,pixels); + } + break; + } + case 16: + { + unsigned short + value; + + if (image->matte != MagickFalse) + { + value=ScaleQuantumToShort(pixel.opacity); + pixels=PopShortPixel(MSBEndian,value,pixels); + } + break; + } + case 8: + { + unsigned char + value; + + if (image->matte != MagickFalse) + { + value=(unsigned char) ScaleQuantumToChar(pixel.opacity); + pixels=PopCharPixel(value,pixels); + } + break; + } + } + *pixels++=(unsigned char) length; + return(pixels); + } + switch (image->depth) + { + case 32: + default: + { + unsigned int + value; + + value=ScaleQuantumToLong(pixel.red); + pixels=PopLongPixel(MSBEndian,value,pixels); + if (IsGrayColorspace(image->colorspace) == MagickFalse) + { + value=ScaleQuantumToLong(pixel.green); + pixels=PopLongPixel(MSBEndian,value,pixels); + value=ScaleQuantumToLong(pixel.blue); + pixels=PopLongPixel(MSBEndian,value,pixels); + } + if (image->colorspace == CMYKColorspace) + { + value=ScaleQuantumToLong(index); + pixels=PopLongPixel(MSBEndian,value,pixels); + } + if (image->matte != MagickFalse) + { + value=ScaleQuantumToLong(pixel.opacity); + pixels=PopLongPixel(MSBEndian,value,pixels); + } + break; + } + case 16: + { + unsigned short + value; + + value=ScaleQuantumToShort(pixel.red); + pixels=PopShortPixel(MSBEndian,value,pixels); + if (IsGrayColorspace(image->colorspace) == MagickFalse) + { + value=ScaleQuantumToShort(pixel.green); + pixels=PopShortPixel(MSBEndian,value,pixels); + value=ScaleQuantumToShort(pixel.blue); + pixels=PopShortPixel(MSBEndian,value,pixels); + } + if (image->colorspace == CMYKColorspace) + { + value=ScaleQuantumToShort(index); + pixels=PopShortPixel(MSBEndian,value,pixels); + } + if (image->matte != MagickFalse) + { + value=ScaleQuantumToShort(pixel.opacity); + pixels=PopShortPixel(MSBEndian,value,pixels); + } + break; + } + case 8: + { + unsigned char + value; + + value=(unsigned char) ScaleQuantumToChar(pixel.red); + pixels=PopCharPixel(value,pixels); + if (IsGrayColorspace(image->colorspace) == MagickFalse) + { + value=(unsigned char) ScaleQuantumToChar(pixel.green); + pixels=PopCharPixel(value,pixels); + value=(unsigned char) ScaleQuantumToChar(pixel.blue); + pixels=PopCharPixel(value,pixels); + } + if (image->colorspace == CMYKColorspace) + { + value=(unsigned char) ScaleQuantumToChar(index); + pixels=PopCharPixel(value,pixels); + } + if (image->matte != MagickFalse) + { + value=(unsigned char) ScaleQuantumToChar(pixel.opacity); + pixels=PopCharPixel(value,pixels); + } + break; + } + } + *pixels++=(unsigned char) length; + return(pixels); +} + +static MagickBooleanType WriteMIFFImage(const ImageInfo *image_info, + Image *image) +{ +#if defined(MAGICKCORE_BZLIB_DELEGATE) + bz_stream + bzip_info; +#endif + + char + buffer[MaxTextExtent]; + + CompressionType + compression; + + const char + *property, + *value; + + IndexPacket + index; + +#if defined(MAGICKCORE_LZMA_DELEGATE) + lzma_allocator + allocator; + + lzma_stream + initialize_lzma = LZMA_STREAM_INIT, + lzma_info; +#endif + + MagickBooleanType + status; + + MagickOffsetType + scene; + + PixelPacket + pixel; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + i; + + size_t + imageListLength, + length, + packet_size; + + ssize_t + y; + + unsigned char + *compress_pixels, + *pixels, + *q; + +#if defined(MAGICKCORE_ZLIB_DELEGATE) + z_stream + zip_info; +#endif + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Allocate image pixels. + */ + if ((image->storage_class == PseudoClass) && + (image->colors > (size_t) (GetQuantumRange(image->depth)+1))) + (void) SetImageStorageClass(image,DirectClass); + image->depth=image->depth <= 8 ? 8UL : image->depth <= 16 ? 16UL : 32UL; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + if ((image->storage_class != PseudoClass) && (image->depth >= 16) && + (quantum_info->format == UndefinedQuantumFormat) && + (IsHighDynamicRangeImage(image,&image->exception) != MagickFalse)) + { + status=SetQuantumFormat(image,quantum_info,FloatingPointQuantumFormat); + if (status == MagickFalse) + { + quantum_info=DestroyQuantumInfo(quantum_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + else + if (image->depth < 16) + (void) DeleteImageProperty(image,"quantum:format"); + compression=UndefinedCompression; + if (image_info->compression != UndefinedCompression) + compression=image_info->compression; + switch (compression) + { +#if !defined(MAGICKCORE_LZMA_DELEGATE) + case LZMACompression: compression=NoCompression; break; +#endif +#if !defined(MAGICKCORE_ZLIB_DELEGATE) + case LZWCompression: + case ZipCompression: compression=NoCompression; break; +#endif +#if !defined(MAGICKCORE_BZLIB_DELEGATE) + case BZipCompression: compression=NoCompression; break; +#endif + case RLECompression: + { + if (quantum_info->format == FloatingPointQuantumFormat) + compression=NoCompression; + break; + } + default: + break; + } + packet_size=(size_t) (quantum_info->depth/8); + if (image->storage_class == DirectClass) + packet_size=(size_t) (3*quantum_info->depth/8); + if (IsGrayColorspace(image->colorspace) != MagickFalse) + packet_size=(size_t) (quantum_info->depth/8); + if (image->matte != MagickFalse) + packet_size+=quantum_info->depth/8; + if (image->colorspace == CMYKColorspace) + packet_size+=quantum_info->depth/8; + if (compression == RLECompression) + packet_size++; + length=MagickMax(BZipMaxExtent(packet_size*image->columns),ZipMaxExtent( + packet_size*image->columns)); + if ((compression == BZipCompression) || (compression == ZipCompression)) + if (length != (size_t) ((unsigned int) length)) + compression=NoCompression; + compress_pixels=(unsigned char *) AcquireQuantumMemory(length, + sizeof(*compress_pixels)); + if (compress_pixels == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Write MIFF header. + */ + (void) WriteBlobString(image,"id=ImageMagick version=1.0\n"); + (void) FormatLocaleString(buffer,MaxTextExtent, + "class=%s colors=%.20g matte=%s\n",CommandOptionToMnemonic( + MagickClassOptions,image->storage_class),(double) image->colors, + CommandOptionToMnemonic(MagickBooleanOptions,(ssize_t) image->matte)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"columns=%.20g rows=%.20g " + "depth=%.20g\n",(double) image->columns,(double) image->rows,(double) + image->depth); + (void) WriteBlobString(image,buffer); + if (image->type != UndefinedType) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"type=%s\n", + CommandOptionToMnemonic(MagickTypeOptions,image->type)); + (void) WriteBlobString(image,buffer); + } + if (image->colorspace != UndefinedColorspace) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"colorspace=%s\n", + CommandOptionToMnemonic(MagickColorspaceOptions,image->colorspace)); + (void) WriteBlobString(image,buffer); + } + if (image->intensity != UndefinedPixelIntensityMethod) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"pixel-intensity=%s\n", + CommandOptionToMnemonic(MagickPixelIntensityOptions, + image->intensity)); + (void) WriteBlobString(image,buffer); + } + if (image->endian != UndefinedEndian) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"endian=%s\n", + CommandOptionToMnemonic(MagickEndianOptions,image->endian)); + (void) WriteBlobString(image,buffer); + } + if (compression != UndefinedCompression) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"compression=%s " + "quality=%.20g\n",CommandOptionToMnemonic(MagickCompressOptions, + compression),(double) image->quality); + (void) WriteBlobString(image,buffer); + } + if (image->units != UndefinedResolution) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"units=%s\n", + CommandOptionToMnemonic(MagickResolutionOptions,image->units)); + (void) WriteBlobString(image,buffer); + } + if ((image->x_resolution != 0) || (image->y_resolution != 0)) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "resolution=%gx%g\n",image->x_resolution,image->y_resolution); + (void) WriteBlobString(image,buffer); + } + if ((image->page.width != 0) || (image->page.height != 0)) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "page=%.20gx%.20g%+.20g%+.20g\n",(double) image->page.width,(double) + image->page.height,(double) image->page.x,(double) image->page.y); + (void) WriteBlobString(image,buffer); + } + else + if ((image->page.x != 0) || (image->page.y != 0)) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"page=%+ld%+ld\n", + (long) image->page.x,(long) image->page.y); + (void) WriteBlobString(image,buffer); + } + if ((image->tile_offset.x != 0) || (image->tile_offset.y != 0)) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"tile-offset=%+ld%+ld\n", + (long) image->tile_offset.x,(long) image->tile_offset.y); + (void) WriteBlobString(image,buffer); + } + if ((GetNextImageInList(image) != (Image *) NULL) || + (GetPreviousImageInList(image) != (Image *) NULL)) + { + if (image->scene == 0) + (void) FormatLocaleString(buffer,MaxTextExtent,"iterations=%.20g " + "delay=%.20g ticks-per-second=%.20g\n",(double) image->iterations, + (double) image->delay,(double) image->ticks_per_second); + else + (void) FormatLocaleString(buffer,MaxTextExtent,"scene=%.20g " + "iterations=%.20g delay=%.20g ticks-per-second=%.20g\n",(double) + image->scene,(double) image->iterations,(double) image->delay, + (double) image->ticks_per_second); + (void) WriteBlobString(image,buffer); + } + else + { + if (image->scene != 0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"scene=%.20g\n", + (double) image->scene); + (void) WriteBlobString(image,buffer); + } + if (image->iterations != 0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"iterations=%.20g\n", + (double) image->iterations); + (void) WriteBlobString(image,buffer); + } + if (image->delay != 0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"delay=%.20g\n", + (double) image->delay); + (void) WriteBlobString(image,buffer); + } + if (image->ticks_per_second != UndefinedTicksPerSecond) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "ticks-per-second=%.20g\n",(double) image->ticks_per_second); + (void) WriteBlobString(image,buffer); + } + } + if (image->gravity != UndefinedGravity) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"gravity=%s\n", + CommandOptionToMnemonic(MagickGravityOptions,image->gravity)); + (void) WriteBlobString(image,buffer); + } + if (image->dispose != UndefinedDispose) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"dispose=%s\n", + CommandOptionToMnemonic(MagickDisposeOptions,image->dispose)); + (void) WriteBlobString(image,buffer); + } + if (image->rendering_intent != UndefinedIntent) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "rendering-intent=%s\n", + CommandOptionToMnemonic(MagickIntentOptions,image->rendering_intent)); + (void) WriteBlobString(image,buffer); + } + if (image->gamma != 0.0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"gamma=%g\n", + image->gamma); + (void) WriteBlobString(image,buffer); + } + if (image->chromaticity.white_point.x != 0.0) + { + /* + Note chomaticity points. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"red-primary=%g," + "%g green-primary=%g,%g blue-primary=%g,%g\n", + image->chromaticity.red_primary.x,image->chromaticity.red_primary.y, + image->chromaticity.green_primary.x, + image->chromaticity.green_primary.y, + image->chromaticity.blue_primary.x, + image->chromaticity.blue_primary.y); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "white-point=%g,%g\n",image->chromaticity.white_point.x, + image->chromaticity.white_point.y); + (void) WriteBlobString(image,buffer); + } + if (image->orientation != UndefinedOrientation) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"orientation=%s\n", + CommandOptionToMnemonic(MagickOrientationOptions,image->orientation)); + (void) WriteBlobString(image,buffer); + } + if (image->profiles != (void *) NULL) + { + const char + *name; + + const StringInfo + *profile; + + /* + Write image profile names. + */ + ResetImageProfileIterator(image); + for (name=GetNextImageProfile(image); name != (const char *) NULL; ) + { + profile=GetImageProfile(image,name); + if (profile != (StringInfo *) NULL) + { + (void) FormatLocaleString(buffer,MagickPathExtent,"profile=%s\n", + name); + (void) WriteBlobString(image,buffer); + } + name=GetNextImageProfile(image); + } + } + if (image->montage != (char *) NULL) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"montage=%s\n", + image->montage); + (void) WriteBlobString(image,buffer); + } + if (quantum_info->format == FloatingPointQuantumFormat) + (void) SetImageProperty(image,"quantum:format","floating-point"); + ResetImagePropertyIterator(image); + property=GetNextImageProperty(image); + while (property != (const char *) NULL) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%s=",property); + (void) WriteBlobString(image,buffer); + value=GetImageProperty(image,property); + if (value != (const char *) NULL) + { + size_t + length; + + length=strlen(value); + for (i=0; i < (ssize_t) length; i++) + if ((isspace((int) ((unsigned char) value[i])) != 0) || + (value[i] == '}')) + break; + if ((i == (ssize_t) length) && (i != 0)) + (void) WriteBlob(image,length,(const unsigned char *) value); + else + { + (void) WriteBlobByte(image,'{'); + if (strchr(value,'}') == (char *) NULL) + (void) WriteBlob(image,length,(const unsigned char *) value); + else + for (i=0; i < (ssize_t) length; i++) + { + if (value[i] == (int) '}') + (void) WriteBlobByte(image,'\\'); + (void) WriteBlobByte(image,(unsigned char) value[i]); + } + (void) WriteBlobByte(image,'}'); + } + } + (void) WriteBlobByte(image,'\n'); + property=GetNextImageProperty(image); + } + (void) WriteBlobString(image,"\f\n:\032"); + if (image->montage != (char *) NULL) + { + /* + Write montage tile directory. + */ + if (image->directory != (char *) NULL) + (void) WriteBlob(image,strlen(image->directory),(unsigned char *) + image->directory); + (void) WriteBlobByte(image,'\0'); + } + if (image->profiles != 0) + { + const char + *name; + + const StringInfo + *profile; + + /* + Write image profile blob. + */ + ResetImageProfileIterator(image); + name=GetNextImageProfile(image); + while (name != (const char *) NULL) + { + profile=GetImageProfile(image,name); + (void) WriteBlobMSBLong(image,(unsigned int) + GetStringInfoLength(profile)); + (void) WriteBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + name=GetNextImageProfile(image); + } + } + if (image->storage_class == PseudoClass) + { + size_t + packet_size; + + unsigned char + *colormap, + *q; + + /* + Allocate colormap. + */ + packet_size=(size_t) (3*quantum_info->depth/8); + colormap=(unsigned char *) AcquireQuantumMemory(image->colors, + packet_size*sizeof(*colormap)); + if (colormap == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Write colormap to file. + */ + q=colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + switch (quantum_info->depth) + { + case 32: + default: + { + unsigned int + pixel; + + pixel=ScaleQuantumToLong(image->colormap[i].red); + q=PopLongPixel(MSBEndian,pixel,q); + pixel=ScaleQuantumToLong(image->colormap[i].green); + q=PopLongPixel(MSBEndian,pixel,q); + pixel=ScaleQuantumToLong(image->colormap[i].blue); + q=PopLongPixel(MSBEndian,pixel,q); + break; + } + case 16: + { + unsigned short + pixel; + + pixel=ScaleQuantumToShort(image->colormap[i].red); + q=PopShortPixel(MSBEndian,pixel,q); + pixel=ScaleQuantumToShort(image->colormap[i].green); + q=PopShortPixel(MSBEndian,pixel,q); + pixel=ScaleQuantumToShort(image->colormap[i].blue); + q=PopShortPixel(MSBEndian,pixel,q); + break; + } + case 8: + { + unsigned char + pixel; + + pixel=(unsigned char) ScaleQuantumToChar(image->colormap[i].red); + q=PopCharPixel(pixel,q); + pixel=(unsigned char) ScaleQuantumToChar( + image->colormap[i].green); + q=PopCharPixel(pixel,q); + pixel=(unsigned char) ScaleQuantumToChar(image->colormap[i].blue); + q=PopCharPixel(pixel,q); + break; + } + } + } + (void) WriteBlob(image,packet_size*image->colors,colormap); + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + } + /* + Write image pixels to file. + */ + status=MagickTrue; + switch (compression) + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + case BZipCompression: + { + int + code; + + bzip_info.bzalloc=AcquireBZIPMemory; + bzip_info.bzfree=RelinquishBZIPMemory; + bzip_info.opaque=(void *) NULL; + code=BZ2_bzCompressInit(&bzip_info,(int) (image->quality == + UndefinedCompressionQuality ? 7 : MagickMin(image->quality/10, + 9)),(int) image_info->verbose,0); + if (code != BZ_OK) + status=MagickFalse; + break; + } +#endif +#if defined(MAGICKCORE_LZMA_DELEGATE) + case LZMACompression: + { + int + code; + + allocator.alloc=AcquireLZMAMemory; + allocator.free=RelinquishLZMAMemory; + allocator.opaque=(void *) NULL; + lzma_info=initialize_lzma; + lzma_info.allocator=&allocator; + code=lzma_easy_encoder(&lzma_info,image->quality/10,LZMA_CHECK_SHA256); + if (code != LZMA_OK) + status=MagickTrue; + break; + } +#endif +#if defined(MAGICKCORE_ZLIB_DELEGATE) + case LZWCompression: + case ZipCompression: + { + int + code; + + zip_info.zalloc=AcquireZIPMemory; + zip_info.zfree=RelinquishZIPMemory; + zip_info.opaque=(void *) NULL; + code=deflateInit(&zip_info,(int) (image->quality == + UndefinedCompressionQuality ? 7 : MagickMin(image->quality/10,9))); + if (code != Z_OK) + status=MagickFalse; + break; + } +#endif + default: + break; + } + quantum_type=GetQuantumType(image,&image->exception); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + if (status == MagickFalse) + break; + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + q=pixels; + switch (compression) + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + case BZipCompression: + { + bzip_info.next_in=(char *) pixels; + bzip_info.avail_in=(unsigned int) (packet_size*image->columns); + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + do + { + int + code; + + bzip_info.next_out=(char *) compress_pixels; + bzip_info.avail_out=(unsigned int) BZipMaxExtent(packet_size* + image->columns); + code=BZ2_bzCompress(&bzip_info,BZ_FLUSH); + if (code < 0) + status=MagickFalse; + length=(size_t) (bzip_info.next_out-(char *) compress_pixels); + if (length != 0) + { + (void) WriteBlobMSBLong(image,(unsigned int) length); + (void) WriteBlob(image,length,compress_pixels); + } + } while (bzip_info.avail_in != 0); + break; + } +#endif +#if defined(MAGICKCORE_LZMA_DELEGATE) + case LZMACompression: + { + lzma_info.next_in=pixels; + lzma_info.avail_in=packet_size*image->columns; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + do + { + int + code; + + lzma_info.next_out=compress_pixels; + lzma_info.avail_out=LZMAMaxExtent(packet_size*image->columns); + code=lzma_code(&lzma_info,LZMA_RUN); + if (code != LZMA_OK) + status=MagickFalse; + length=(size_t) (lzma_info.next_out-compress_pixels); + if (length != 0) + { + (void) WriteBlobMSBLong(image,(unsigned int) length); + (void) WriteBlob(image,length,compress_pixels); + } + } while (lzma_info.avail_in != 0); + break; + } +#endif +#if defined(MAGICKCORE_ZLIB_DELEGATE) + case LZWCompression: + case ZipCompression: + { + zip_info.next_in=pixels; + zip_info.avail_in=(uInt) (packet_size*image->columns); + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + do + { + int + code; + + zip_info.next_out=compress_pixels; + zip_info.avail_out=(uInt) ZipMaxExtent(packet_size*image->columns); + code=deflate(&zip_info,Z_SYNC_FLUSH); + if (code != Z_OK) + status=MagickFalse; + length=(size_t) (zip_info.next_out-compress_pixels); + if (length != 0) + { + (void) WriteBlobMSBLong(image,(unsigned int) length); + (void) WriteBlob(image,length,compress_pixels); + } + } while (zip_info.avail_in != 0); + break; + } +#endif + case RLECompression: + { + pixel=(*p); + index=(IndexPacket) 0; + if (indexes != (IndexPacket *) NULL) + index=(*indexes); + length=255; + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((length < 255) && (x < (ssize_t) (image->columns-1)) && + (IsColorEqual(p,&pixel) != MagickFalse) && + ((image->matte == MagickFalse) || + (GetPixelOpacity(p) == pixel.opacity)) && + ((indexes == (IndexPacket *) NULL) || + (index == GetPixelIndex(indexes+x)))) + length++; + else + { + if (x > 0) + q=PopRunlengthPacket(image,q,length,pixel,index); + length=0; + } + pixel=(*p); + if (indexes != (IndexPacket *) NULL) + index=GetPixelIndex(indexes+x); + p++; + } + q=PopRunlengthPacket(image,q,length,pixel,index); + (void) WriteBlob(image,(size_t) (q-pixels),pixels); + break; + } + default: + { + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + (void) WriteBlob(image,packet_size*image->columns,pixels); + break; + } + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + switch (compression) + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + case BZipCompression: + { + int + code; + + for ( ; ; ) + { + if (status == MagickFalse) + break; + bzip_info.next_out=(char *) compress_pixels; + bzip_info.avail_out=(unsigned int) BZipMaxExtent(packet_size* + image->columns); + code=BZ2_bzCompress(&bzip_info,BZ_FINISH); + length=(size_t) (bzip_info.next_out-(char *) compress_pixels); + if (length != 0) + { + (void) WriteBlobMSBLong(image,(unsigned int) length); + (void) WriteBlob(image,length,compress_pixels); + } + if (code == BZ_STREAM_END) + break; + } + code=BZ2_bzCompressEnd(&bzip_info); + if (code != BZ_OK) + status=MagickFalse; + break; + } +#endif +#if defined(MAGICKCORE_LZMA_DELEGATE) + case LZMACompression: + { + int + code; + + for ( ; ; ) + { + if (status == MagickFalse) + break; + lzma_info.next_out=compress_pixels; + lzma_info.avail_out=packet_size*image->columns; + code=lzma_code(&lzma_info,LZMA_FINISH); + length=(size_t) (lzma_info.next_out-compress_pixels); + if (length > 6) + { + (void) WriteBlobMSBLong(image,(unsigned int) length); + (void) WriteBlob(image,length,compress_pixels); + } + if (code == LZMA_STREAM_END) + break; + } + lzma_end(&lzma_info); + break; + } +#endif +#if defined(MAGICKCORE_ZLIB_DELEGATE) + case LZWCompression: + case ZipCompression: + { + int + code; + + for ( ; ; ) + { + if (status == MagickFalse) + break; + zip_info.next_out=compress_pixels; + zip_info.avail_out=(uInt) ZipMaxExtent(packet_size*image->columns); + code=deflate(&zip_info,Z_FINISH); + length=(size_t) (zip_info.next_out-compress_pixels); + if (length > 6) + { + (void) WriteBlobMSBLong(image,(unsigned int) length); + (void) WriteBlob(image,length,compress_pixels); + } + if (code == Z_STREAM_END) + break; + } + code=deflateEnd(&zip_info); + if (code != Z_OK) + status=MagickFalse; + break; + } +#endif + default: + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + compress_pixels=(unsigned char *) RelinquishMagickMemory(compress_pixels); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/mono.c b/ImageMagick-6.9.12-44/coders/mono.c new file mode 100644 index 0000000..c174c7e --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/mono.c @@ -0,0 +1,364 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M OOO N N OOO % +% MM MM O O NN N O O % +% M M M O O N N N O O % +% M M O O N NN O O % +% M M OOO N N OOO % +% % +% % +% Read/Write Raw Bi-Level Bitmap Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMONOImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M O N O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMONOImage() reads an image of raw bites in LSB order and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadMONOImage method is: +% +% Image *ReadMONOImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMONOImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + x; + + size_t + bit, + byte; + + ssize_t + y; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if (DiscardBlobBytes(image,image->offset) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + /* + Initialize image colormap. + */ + image->depth=1; + if (AcquireImageColormap(image,2) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Convert bi-level image to pixel packets. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (bit == 0) + byte=(size_t) ReadBlobByte(image); + if (image_info->endian == LSBEndian) + SetPixelIndex(indexes+x,((byte & 0x01) != 0) ? 0x00 : 0x01); + else + SetPixelIndex(indexes+x,((byte & 0x01) != 0) ? 0x01 : 0x00); + bit++; + if (bit == 8) + bit=0; + byte>>=1; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) SyncImage(image); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M O N O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMONOImage() adds attributes for the MONO image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMONOImage method is: +% +% size_t RegisterMONOImage(void) +% +*/ +ModuleExport size_t RegisterMONOImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MONO"); + entry->decoder=(DecodeImageHandler *) ReadMONOImage; + entry->encoder=(EncodeImageHandler *) WriteMONOImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Raw bi-level bitmap"); + entry->magick_module=ConstantString("MONO"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M O N O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMONOImage() removes format registrations made by the +% MONO module from the list of supported formats. +% +% The format of the UnregisterMONOImage method is: +% +% UnregisterMONOImage(void) +% +*/ +ModuleExport void UnregisterMONOImage(void) +{ + (void) UnregisterMagickInfo("MONO"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M O N O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMONOImage() writes an image of raw bits in LSB order to a file. +% +% The format of the WriteMONOImage method is: +% +% MagickBooleanType WriteMONOImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteMONOImage(const ImageInfo *image_info, + Image *image) +{ + MagickBooleanType + status; + + const PixelPacket + *p; + + ssize_t + x; + + size_t + bit, + byte; + + ssize_t + y; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Convert image to a bi-level image. + */ + (void) SetImageType(image,BilevelType); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte>>=1; + if (image->endian == LSBEndian) + { + if (GetPixelLuma(image,p) < (QuantumRange/2.0)) + byte|=0x80; + } + else + if (GetPixelLuma(image,p) >= (QuantumRange/2.0)) + byte|=0x80; + bit++; + if (bit == 8) + { + (void) WriteBlobByte(image,(unsigned char) byte); + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + (void) WriteBlobByte(image,(unsigned char) (byte >> (8-bit))); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/mpc.c b/ImageMagick-6.9.12-44/coders/mpc.c new file mode 100644 index 0000000..a5b3406 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/mpc.c @@ -0,0 +1,1536 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M PPPP CCCC % +% MM MM P P C % +% M M M PPPP C % +% M M P C % +% M M P CCCC % +% % +% % +% Read/Write Magick Pixel Cache Image Format % +% % +% Software Design % +% Cristy % +% March 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/hashmap.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/utility.h" +#include "magick/version-private.h" + +/* + Define declarations.. +*/ +#define MagickPixelCacheNonce "MagickPixelCache" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMPCImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s M P C % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsMPC() returns MagickTrue if the image format type, identified by the +% magick string, is an Magick Persistent Cache image. +% +% The format of the IsMPC method is: +% +% MagickBooleanType IsMPC(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsMPC(const unsigned char *magick,const size_t length) +{ + if (length < 19) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"id=MagickPixelCache",19) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d C A C H E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMPCImage() reads an Magick Persistent Cache image file and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadMPCImage method is: +% +% Image *ReadMPCImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% Decompression code contributed by Kyle Shorter. +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMPCImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + cache_filename[MaxTextExtent], + id[MaxTextExtent], + keyword[MaxTextExtent], + *options; + + const unsigned char + *p; + + GeometryInfo + geometry_info; + + Image + *image; + + int + c; + + LinkedListInfo + *profiles; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + MagickStatusType + flags; + + ssize_t + i; + + size_t + depth, + extent, + length; + + ssize_t + count; + + StringInfo + *nonce; + + unsigned int + signature; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + (void) CopyMagickString(cache_filename,image->filename,MaxTextExtent-6); + AppendImageFormat("cache",cache_filename); + c=ReadBlobByte(image); + if (c == EOF) + { + image=DestroyImage(image); + return((Image *) NULL); + } + *id='\0'; + (void) memset(keyword,0,sizeof(keyword)); + offset=0; + do + { + /* + Decode image header; header terminates one character beyond a ':'. + */ + SetGeometryInfo(&geometry_info); + profiles=(LinkedListInfo *) NULL; + length=MaxTextExtent; + options=AcquireString((char *) NULL); + nonce=StringToStringInfo(MagickPixelCacheNonce); + signature=GetMagickCoreSignature(nonce); + nonce=DestroyStringInfo(nonce); + image->depth=8; + image->compression=NoCompression; + while ((isgraph((int) ((unsigned char) c)) != 0) && (c != (int) ':')) + { + char + *p; + + if (c == (int) '{') + { + char + *comment; + + /* + Read comment-- any text between { }. + */ + length=MaxTextExtent; + comment=AcquireString((char *) NULL); + for (p=comment; comment != (char *) NULL; p++) + { + c=ReadBlobByte(image); + if (c == (int) '\\') + c=ReadBlobByte(image); + else + if ((c == EOF) || (c == (int) '}')) + break; + if ((size_t) (p-comment+1) >= length) + { + *p='\0'; + length<<=1; + comment=(char *) ResizeQuantumMemory(comment,length+ + MaxTextExtent,sizeof(*comment)); + if (comment == (char *) NULL) + break; + p=comment+strlen(comment); + } + *p=(char) c; + } + if (comment == (char *) NULL) + { + options=DestroyString(options); + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + } + *p='\0'; + (void) SetImageProperty(image,"comment",comment); + comment=DestroyString(comment); + c=ReadBlobByte(image); + } + else + if (isalnum((int) ((unsigned char) c)) != MagickFalse) + { + /* + Get the keyword. + */ + length=MaxTextExtent-1; + p=keyword; + do + { + if (c == (int) '=') + break; + if ((size_t) (p-keyword) < (MaxTextExtent-1)) + *p++=(char) c; + c=ReadBlobByte(image); + } while (c != EOF); + *p='\0'; + p=options; + while (isspace((int) ((unsigned char) c)) != 0) + c=ReadBlobByte(image); + if (c == (int) '=') + { + /* + Get the keyword value. + */ + c=ReadBlobByte(image); + while ((c != (int) '}') && (c != EOF)) + { + if ((size_t) (p-options+1) >= length) + { + *p='\0'; + length<<=1; + options=(char *) ResizeQuantumMemory(options,length+ + MaxTextExtent,sizeof(*options)); + if (options == (char *) NULL) + break; + p=options+strlen(options); + } + *p++=(char) c; + c=ReadBlobByte(image); + if (c == '\\') + { + c=ReadBlobByte(image); + if (c == (int) '}') + { + *p++=(char) c; + c=ReadBlobByte(image); + } + } + if (*options != '{') + if (isspace((int) ((unsigned char) c)) != 0) + break; + } + if (options == (char *) NULL) + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + } + *p='\0'; + if (*options == '{') + (void) CopyMagickString(options,options+1,strlen(options)); + /* + Assign a value to the specified keyword. + */ + switch (*keyword) + { + case 'b': + case 'B': + { + if (LocaleCompare(keyword,"background-color") == 0) + { + (void) QueryColorDatabase(options,&image->background_color, + exception); + break; + } + if (LocaleCompare(keyword,"blue-primary") == 0) + { + flags=ParseGeometry(options,&geometry_info); + image->chromaticity.blue_primary.x=geometry_info.rho; + image->chromaticity.blue_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.blue_primary.y= + image->chromaticity.blue_primary.x; + break; + } + if (LocaleCompare(keyword,"border-color") == 0) + { + (void) QueryColorDatabase(options,&image->border_color, + exception); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'c': + case 'C': + { + if (LocaleCompare(keyword,"class") == 0) + { + ssize_t + storage_class; + + storage_class=ParseCommandOption(MagickClassOptions, + MagickFalse,options); + if (storage_class < 0) + break; + image->storage_class=(ClassType) storage_class; + break; + } + if (LocaleCompare(keyword,"colors") == 0) + { + image->colors=StringToUnsignedLong(options); + break; + } + if (LocaleCompare(keyword,"colorspace") == 0) + { + ssize_t + colorspace; + + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,options); + if (colorspace < 0) + break; + image->colorspace=(ColorspaceType) colorspace; + break; + } + if (LocaleCompare(keyword,"compression") == 0) + { + ssize_t + compression; + + compression=ParseCommandOption(MagickCompressOptions, + MagickFalse,options); + if (compression < 0) + break; + image->compression=(CompressionType) compression; + break; + } + if (LocaleCompare(keyword,"columns") == 0) + { + image->columns=StringToUnsignedLong(options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'd': + case 'D': + { + if (LocaleCompare(keyword,"delay") == 0) + { + image->delay=StringToUnsignedLong(options); + break; + } + if (LocaleCompare(keyword,"depth") == 0) + { + image->depth=StringToUnsignedLong(options); + break; + } + if (LocaleCompare(keyword,"dispose") == 0) + { + ssize_t + dispose; + + dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse, + options); + if (dispose < 0) + break; + image->dispose=(DisposeType) dispose; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'e': + case 'E': + { + if (LocaleCompare(keyword,"endian") == 0) + { + ssize_t + endian; + + endian=ParseCommandOption(MagickEndianOptions,MagickFalse, + options); + if (endian < 0) + break; + image->endian=(EndianType) endian; + break; + } + if (LocaleCompare(keyword,"error") == 0) + { + image->error.mean_error_per_pixel=StringToDouble(options, + (char **) NULL); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'g': + case 'G': + { + if (LocaleCompare(keyword,"gamma") == 0) + { + image->gamma=StringToDouble(options,(char **) NULL); + break; + } + if (LocaleCompare(keyword,"green-primary") == 0) + { + flags=ParseGeometry(options,&geometry_info); + image->chromaticity.green_primary.x=geometry_info.rho; + image->chromaticity.green_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.green_primary.y= + image->chromaticity.green_primary.x; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'i': + case 'I': + { + if (LocaleCompare(keyword,"id") == 0) + { + (void) CopyMagickString(id,options,MaxTextExtent); + break; + } + if (LocaleCompare(keyword,"iterations") == 0) + { + image->iterations=StringToUnsignedLong(options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'm': + case 'M': + { + if (LocaleCompare(keyword,"magick-signature") == 0) + { + signature=(unsigned int) StringToUnsignedLong(options); + break; + } + if (LocaleCompare(keyword,"matte") == 0) + { + ssize_t + matte; + + matte=ParseCommandOption(MagickBooleanOptions,MagickFalse, + options); + if (matte < 0) + break; + image->matte=(MagickBooleanType) matte; + break; + } + if (LocaleCompare(keyword,"matte-color") == 0) + { + (void) QueryColorDatabase(options,&image->matte_color, + exception); + break; + } + if (LocaleCompare(keyword,"maximum-error") == 0) + { + image->error.normalized_maximum_error=StringToDouble( + options,(char **) NULL); + break; + } + if (LocaleCompare(keyword,"mean-error") == 0) + { + image->error.normalized_mean_error=StringToDouble(options, + (char **) NULL); + break; + } + if (LocaleCompare(keyword,"montage") == 0) + { + (void) CloneString(&image->montage,options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'o': + case 'O': + { + if (LocaleCompare(keyword,"opaque") == 0) + { + ssize_t + matte; + + matte=ParseCommandOption(MagickBooleanOptions,MagickFalse, + options); + if (matte < 0) + break; + image->matte=(MagickBooleanType) matte; + break; + } + if (LocaleCompare(keyword,"orientation") == 0) + { + ssize_t + orientation; + + orientation=ParseCommandOption(MagickOrientationOptions, + MagickFalse,options); + if (orientation < 0) + break; + image->orientation=(OrientationType) orientation; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'p': + case 'P': + { + if (LocaleCompare(keyword,"page") == 0) + { + char + *geometry; + + geometry=GetPageGeometry(options); + (void) ParseAbsoluteGeometry(geometry,&image->page); + geometry=DestroyString(geometry); + break; + } + if (LocaleCompare(keyword,"pixel-intensity") == 0) + { + ssize_t + intensity; + + intensity=ParseCommandOption(MagickPixelIntensityOptions, + MagickFalse,options); + if (intensity < 0) + break; + image->intensity=(PixelIntensityMethod) intensity; + break; + } + if (LocaleCompare(keyword,"profile") == 0) + { + if (profiles == (LinkedListInfo *) NULL) + profiles=NewLinkedList(0); + (void) AppendValueToLinkedList(profiles, + AcquireString(options)); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'q': + case 'Q': + { + if (LocaleCompare(keyword,"quality") == 0) + { + image->quality=StringToUnsignedLong(options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'r': + case 'R': + { + if (LocaleCompare(keyword,"red-primary") == 0) + { + flags=ParseGeometry(options,&geometry_info); + image->chromaticity.red_primary.x=geometry_info.rho; + if ((flags & SigmaValue) != 0) + image->chromaticity.red_primary.y=geometry_info.sigma; + break; + } + if (LocaleCompare(keyword,"rendering-intent") == 0) + { + ssize_t + rendering_intent; + + rendering_intent=ParseCommandOption(MagickIntentOptions, + MagickFalse,options); + if (rendering_intent < 0) + break; + image->rendering_intent=(RenderingIntent) rendering_intent; + break; + } + if (LocaleCompare(keyword,"resolution") == 0) + { + flags=ParseGeometry(options,&geometry_info); + image->x_resolution=geometry_info.rho; + image->y_resolution=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->y_resolution=image->x_resolution; + break; + } + if (LocaleCompare(keyword,"rows") == 0) + { + image->rows=StringToUnsignedLong(options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 's': + case 'S': + { + if (LocaleCompare(keyword,"scene") == 0) + { + image->scene=StringToUnsignedLong(options); + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 't': + case 'T': + { + if (LocaleCompare(keyword,"ticks-per-second") == 0) + { + image->ticks_per_second=(ssize_t) StringToLong(options); + break; + } + if (LocaleCompare(keyword,"tile-offset") == 0) + { + char + *geometry; + + geometry=GetPageGeometry(options); + (void) ParseAbsoluteGeometry(geometry,&image->tile_offset); + geometry=DestroyString(geometry); + } + if (LocaleCompare(keyword,"type") == 0) + { + ssize_t + type; + + type=ParseCommandOption(MagickTypeOptions,MagickFalse, + options); + if (type < 0) + break; + image->type=(ImageType) type; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'u': + case 'U': + { + if (LocaleCompare(keyword,"units") == 0) + { + ssize_t + units; + + units=ParseCommandOption(MagickResolutionOptions,MagickFalse, + options); + if (units < 0) + break; + image->units=(ResolutionType) units; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + case 'w': + case 'W': + { + if (LocaleCompare(keyword,"white-point") == 0) + { + flags=ParseGeometry(options,&geometry_info); + image->chromaticity.white_point.x=geometry_info.rho; + image->chromaticity.white_point.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.white_point.y= + image->chromaticity.white_point.x; + break; + } + (void) SetImageProperty(image,keyword,options); + break; + } + default: + { + (void) SetImageProperty(image,keyword,options); + break; + } + } + } + else + c=ReadBlobByte(image); + while (isspace((int) ((unsigned char) c)) != 0) + c=ReadBlobByte(image); + } + options=DestroyString(options); + (void) ReadBlobByte(image); + /* + Verify that required image information is defined. + */ + if ((LocaleCompare(id,"MagickPixelCache") != 0) || + (image->storage_class == UndefinedClass) || + (image->compression == UndefinedCompression) || + (image->columns == 0) || (image->rows == 0) || + (image->depth == 0) || (image->depth > 64)) + { + if (profiles != (LinkedListInfo *) NULL) + profiles=DestroyLinkedList(profiles,RelinquishMagickMemory); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + nonce=StringToStringInfo(MagickPixelCacheNonce); + if (signature != GetMagickCoreSignature(nonce)) + { + nonce=DestroyStringInfo(nonce); + if (profiles != (LinkedListInfo *) NULL) + profiles=DestroyLinkedList(profiles,RelinquishMagickMemory); + ThrowReaderException(CacheError,"IncompatibleAPI"); + } + nonce=DestroyStringInfo(nonce); + if (image->montage != (char *) NULL) + { + char + *p; + + /* + Image directory. + */ + extent=MaxTextExtent; + image->directory=AcquireString((char *) NULL); + p=image->directory; + length=0; + do + { + *p='\0'; + if ((length+MaxTextExtent) >= extent) + { + /* + Allocate more memory for the image directory. + */ + extent<<=1; + image->directory=(char *) ResizeQuantumMemory(image->directory, + extent+MaxTextExtent,sizeof(*image->directory)); + if (image->directory == (char *) NULL) + { + if (profiles != (LinkedListInfo *) NULL) + profiles=DestroyLinkedList(profiles,RelinquishMagickMemory); + ThrowReaderException(CorruptImageError, + "UnableToReadImageData"); + } + p=image->directory+length; + } + c=ReadBlobByte(image); + if (c == EOF) + break; + *p++=(char) c; + length++; + } while (c != (int) '\0'); + } + if (profiles != (LinkedListInfo *) NULL) + { + const char + *name; + + StringInfo + *profile; + + /* + Read image profile blobs. + */ + ResetLinkedListIterator(profiles); + name=(const char *) GetNextValueInLinkedList(profiles); + while (name != (const char *) NULL) + { + length=ReadBlobMSBLong(image); + if ((MagickSizeType) length > GetBlobSize(image)) + break; + profile=AcquireStringInfo(length); + if (profile == (StringInfo *) NULL) + break; + count=ReadBlob(image,length,GetStringInfoDatum(profile)); + if (count != (ssize_t) length) + { + profile=DestroyStringInfo(profile); + break; + } + status=SetImageProfile(image,name,profile); + profile=DestroyStringInfo(profile); + if (status == MagickFalse) + break; + name=(const char *) GetNextValueInLinkedList(profiles); + } + profiles=DestroyLinkedList(profiles,RelinquishMagickMemory); + } + depth=GetImageQuantumDepth(image,MagickFalse); + if (image->storage_class == PseudoClass) + { + size_t + packet_size; + + unsigned char + *colormap; + + /* + Create image colormap. + */ + packet_size=(size_t) (3UL*depth/8UL); + if ((MagickSizeType) (packet_size*image->colors) > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + image->colormap=(PixelPacket *) AcquireQuantumMemory(image->colors+1, + sizeof(*image->colormap)); + if (image->colormap == (PixelPacket *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (image->colors != 0) + { + /* + Read image colormap from file. + */ + colormap=(unsigned char *) AcquireQuantumMemory(image->colors, + packet_size*sizeof(*colormap)); + if (colormap == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,packet_size*image->colors,colormap); + if (count != (ssize_t) (packet_size*image->colors)) + { + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + } + p=colormap; + switch (depth) + { + default: + { + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + ThrowReaderException(CorruptImageError, + "ImageDepthNotSupported"); + break; + } + case 8: + { + unsigned char + pixel; + + for (i=0; i < (ssize_t) image->colors; i++) + { + p=PushCharPixel(p,&pixel); + image->colormap[i].red=ScaleCharToQuantum(pixel); + p=PushCharPixel(p,&pixel); + image->colormap[i].green=ScaleCharToQuantum(pixel); + p=PushCharPixel(p,&pixel); + image->colormap[i].blue=ScaleCharToQuantum(pixel); + } + break; + } + case 16: + { + unsigned short + pixel; + + for (i=0; i < (ssize_t) image->colors; i++) + { + p=PushShortPixel(MSBEndian,p,&pixel); + image->colormap[i].red=ScaleShortToQuantum(pixel); + p=PushShortPixel(MSBEndian,p,&pixel); + image->colormap[i].green=ScaleShortToQuantum(pixel); + p=PushShortPixel(MSBEndian,p,&pixel); + image->colormap[i].blue=ScaleShortToQuantum(pixel); + } + break; + } + case 32: + { + unsigned int + pixel; + + for (i=0; i < (ssize_t) image->colors; i++) + { + p=PushLongPixel(MSBEndian,p,&pixel); + image->colormap[i].red=ScaleLongToQuantum(pixel); + p=PushLongPixel(MSBEndian,p,&pixel); + image->colormap[i].green=ScaleLongToQuantum(pixel); + p=PushLongPixel(MSBEndian,p,&pixel); + image->colormap[i].blue=ScaleLongToQuantum(pixel); + } + break; + } + } + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + } + } + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if ((AcquireMagickResource(WidthResource,image->columns) == MagickFalse) || + (AcquireMagickResource(HeightResource,image->rows) == MagickFalse)) + ThrowReaderException(ImageError,"WidthOrHeightExceedsLimit"); + /* + Attach persistent pixel cache. + */ + status=PersistPixelCache(image,cache_filename,MagickTrue,&offset,exception); + if (status == MagickFalse) + { + status=SetImageExtent(image,image->columns,image->rows); + ThrowReaderException(CacheError,"UnableToPersistPixelCache"); + } + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + do + { + c=ReadBlobByte(image); + } while ((isgraph((int) ((unsigned char) c)) == 0) && (c != EOF)); + if ((c != EOF) && ((c == 'i') || (c == 'I'))) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while ((c != EOF) && ((c == 'i') || (c == 'I'))); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M P C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMPCImage() adds properties for the Cache image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMPCImage method is: +% +% size_t RegisterMPCImage(void) +% +*/ +ModuleExport size_t RegisterMPCImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("CACHE"); + entry->description=ConstantString("Magick Persistent Cache image format"); + entry->magick_module=ConstantString("MPC"); + entry->stealth=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("MPC"); + entry->decoder=(DecodeImageHandler *) ReadMPCImage; + entry->encoder=(EncodeImageHandler *) WriteMPCImage; + entry->magick=(IsImageFormatHandler *) IsMPC; + entry->description=ConstantString("Magick Persistent Cache image format"); + entry->seekable_stream=MagickTrue; + entry->magick_module=ConstantString("MPC"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M P C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMPCImage() removes format registrations made by the +% MPC module from the list of supported formats. +% +% The format of the UnregisterMPCImage method is: +% +% UnregisterMPCImage(void) +% +*/ +ModuleExport void UnregisterMPCImage(void) +{ + (void) UnregisterMagickInfo("CACHE"); + (void) UnregisterMagickInfo("MPC"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M P C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMPCImage() writes an Magick Persistent Cache image to a file. +% +% The format of the WriteMPCImage method is: +% +% MagickBooleanType WriteMPCImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the image. +% +*/ +static MagickBooleanType WriteMPCImage(const ImageInfo *image_info,Image *image) +{ + char + buffer[MaxTextExtent], + cache_filename[MaxTextExtent]; + + const char + *property, + *value; + + MagickBooleanType + status; + + MagickOffsetType + offset, + scene; + + ssize_t + i; + + size_t + depth, + imageListLength, + one; + + /* + Open persistent cache. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) CopyMagickString(cache_filename,image->filename,MaxTextExtent-6); + AppendImageFormat("cache",cache_filename); + scene=0; + offset=0; + one=1; + imageListLength=GetImageListLength(image); + do + { + StringInfo + *nonce; + + /* + Write cache meta-information. + */ + (void) SetImageStorageClass(image,image->storage_class); + depth=GetImageQuantumDepth(image,MagickTrue); + if ((image->storage_class == PseudoClass) && + (image->colors > (one << depth))) + (void) SetImageStorageClass(image,DirectClass); + (void) WriteBlobString(image,"id=MagickPixelCache\n"); + nonce=StringToStringInfo(MagickPixelCacheNonce); + (void) FormatLocaleString(buffer,MaxTextExtent,"magick-signature=%u\n", + GetMagickCoreSignature(nonce)); + nonce=DestroyStringInfo(nonce); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "class=%s colors=%.20g matte=%s\n",CommandOptionToMnemonic( + MagickClassOptions,image->storage_class),(double) image->colors, + CommandOptionToMnemonic(MagickBooleanOptions,(ssize_t) image->matte)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "columns=%.20g rows=%.20g depth=%.20g\n",(double) image->columns, + (double) image->rows,(double) image->depth); + (void) WriteBlobString(image,buffer); + if (image->type != UndefinedType) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"type=%s\n", + CommandOptionToMnemonic(MagickTypeOptions,image->type)); + (void) WriteBlobString(image,buffer); + } + if (image->colorspace != UndefinedColorspace) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"colorspace=%s\n", + CommandOptionToMnemonic(MagickColorspaceOptions,image->colorspace)); + (void) WriteBlobString(image,buffer); + } + if (image->intensity != UndefinedPixelIntensityMethod) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"pixel-intensity=%s\n", + CommandOptionToMnemonic(MagickPixelIntensityOptions, + image->intensity)); + (void) WriteBlobString(image,buffer); + } + if (image->endian != UndefinedEndian) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"endian=%s\n", + CommandOptionToMnemonic(MagickEndianOptions,image->endian)); + (void) WriteBlobString(image,buffer); + } + if (image->compression != UndefinedCompression) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "compression=%s quality=%.20g\n",CommandOptionToMnemonic( + MagickCompressOptions,image->compression),(double) image->quality); + (void) WriteBlobString(image,buffer); + } + if (image->units != UndefinedResolution) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"units=%s\n", + CommandOptionToMnemonic(MagickResolutionOptions,image->units)); + (void) WriteBlobString(image,buffer); + } + if ((image->x_resolution != 0) || (image->y_resolution != 0)) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "resolution=%gx%g\n",image->x_resolution,image->y_resolution); + (void) WriteBlobString(image,buffer); + } + if ((image->page.width != 0) || (image->page.height != 0)) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "page=%.20gx%.20g%+.20g%+.20g\n",(double) image->page.width,(double) + image->page.height,(double) image->page.x,(double) image->page.y); + (void) WriteBlobString(image,buffer); + } + else + if ((image->page.x != 0) || (image->page.y != 0)) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"page=%+ld%+ld\n", + (long) image->page.x,(long) image->page.y); + (void) WriteBlobString(image,buffer); + } + if ((image->tile_offset.x != 0) || (image->tile_offset.y != 0)) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"tile-offset=%+ld%+ld\n", + (long) image->tile_offset.x,(long) image->tile_offset.y); + (void) WriteBlobString(image,buffer); + } + if ((GetNextImageInList(image) != (Image *) NULL) || + (GetPreviousImageInList(image) != (Image *) NULL)) + { + if (image->scene == 0) + (void) FormatLocaleString(buffer,MaxTextExtent, + "iterations=%.20g delay=%.20g ticks-per-second=%.20g\n",(double) + image->iterations,(double) image->delay,(double) + image->ticks_per_second); + else + (void) FormatLocaleString(buffer,MaxTextExtent,"scene=%.20g " + "iterations=%.20g delay=%.20g ticks-per-second=%.20g\n", + (double) image->scene,(double) image->iterations,(double) + image->delay,(double) image->ticks_per_second); + (void) WriteBlobString(image,buffer); + } + else + { + if (image->scene != 0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"scene=%.20g\n", + (double) image->scene); + (void) WriteBlobString(image,buffer); + } + if (image->iterations != 0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"iterations=%.20g\n", + (double) image->iterations); + (void) WriteBlobString(image,buffer); + } + if (image->delay != 0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"delay=%.20g\n", + (double) image->delay); + (void) WriteBlobString(image,buffer); + } + if (image->ticks_per_second != UndefinedTicksPerSecond) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "ticks-per-second=%.20g\n",(double) image->ticks_per_second); + (void) WriteBlobString(image,buffer); + } + } + if (image->gravity != UndefinedGravity) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"gravity=%s\n", + CommandOptionToMnemonic(MagickGravityOptions,image->gravity)); + (void) WriteBlobString(image,buffer); + } + if (image->dispose != UndefinedDispose) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"dispose=%s\n", + CommandOptionToMnemonic(MagickDisposeOptions,image->dispose)); + (void) WriteBlobString(image,buffer); + } + if (image->rendering_intent != UndefinedIntent) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "rendering-intent=%s\n",CommandOptionToMnemonic(MagickIntentOptions, + image->rendering_intent)); + (void) WriteBlobString(image,buffer); + } + if (image->gamma != 0.0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"gamma=%g\n", + image->gamma); + (void) WriteBlobString(image,buffer); + } + if (image->chromaticity.white_point.x != 0.0) + { + /* + Note chomaticity points. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"red-primary=" + "%g,%g green-primary=%g,%g blue-primary=%g,%g\n", + image->chromaticity.red_primary.x,image->chromaticity.red_primary.y, + image->chromaticity.green_primary.x, + image->chromaticity.green_primary.y, + image->chromaticity.blue_primary.x, + image->chromaticity.blue_primary.y); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "white-point=%g,%g\n",image->chromaticity.white_point.x, + image->chromaticity.white_point.y); + (void) WriteBlobString(image,buffer); + } + if (image->orientation != UndefinedOrientation) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "orientation=%s\n",CommandOptionToMnemonic(MagickOrientationOptions, + image->orientation)); + (void) WriteBlobString(image,buffer); + } + if (image->profiles != (void *) NULL) + { + const char + *name; + + const StringInfo + *profile; + + /* + Write image profile names. + */ + ResetImageProfileIterator(image); + for (name=GetNextImageProfile(image); name != (const char *) NULL; ) + { + profile=GetImageProfile(image,name); + if (profile != (StringInfo *) NULL) + { + (void) FormatLocaleString(buffer,MagickPathExtent,"profile=%s\n", + name); + (void) WriteBlobString(image,buffer); + } + name=GetNextImageProfile(image); + } + } + if (image->montage != (char *) NULL) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"montage=%s\n", + image->montage); + (void) WriteBlobString(image,buffer); + } + ResetImagePropertyIterator(image); + property=GetNextImageProperty(image); + while (property != (const char *) NULL) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%s=",property); + (void) WriteBlobString(image,buffer); + value=GetImageProperty(image,property); + if (value != (const char *) NULL) + { + size_t + length; + + length=strlen(value); + for (i=0; i < (ssize_t) length; i++) + if (isspace((int) ((unsigned char) value[i])) != 0) + break; + if ((i == (ssize_t) length) && (i != 0)) + (void) WriteBlob(image,length,(const unsigned char *) value); + else + { + (void) WriteBlobByte(image,'{'); + if (strchr(value,'}') == (char *) NULL) + (void) WriteBlob(image,length,(const unsigned char *) value); + else + for (i=0; i < (ssize_t) length; i++) + { + if (value[i] == (int) '}') + (void) WriteBlobByte(image,'\\'); + (void) WriteBlobByte(image,(unsigned char) value[i]); + } + (void) WriteBlobByte(image,'}'); + } + } + (void) WriteBlobByte(image,'\n'); + property=GetNextImageProperty(image); + } + (void) WriteBlobString(image,"\f\n:\032"); + if (image->montage != (char *) NULL) + { + /* + Write montage tile directory. + */ + if (image->directory != (char *) NULL) + (void) WriteBlobString(image,image->directory); + (void) WriteBlobByte(image,'\0'); + } + if (image->profiles != 0) + { + const char + *name; + + const StringInfo + *profile; + + /* + Write image profile blob. + */ + ResetImageProfileIterator(image); + name=GetNextImageProfile(image); + while (name != (const char *) NULL) + { + profile=GetImageProfile(image,name); + (void) WriteBlobMSBLong(image,(unsigned int) + GetStringInfoLength(profile)); + (void) WriteBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + name=GetNextImageProfile(image); + } + } + if (image->storage_class == PseudoClass) + { + size_t + packet_size; + + unsigned char + *colormap, + *q; + + /* + Allocate colormap. + */ + packet_size=(size_t) (3UL*depth/8UL); + colormap=(unsigned char *) AcquireQuantumMemory(image->colors, + packet_size*sizeof(*colormap)); + if (colormap == (unsigned char *) NULL) + return(MagickFalse); + /* + Write colormap to file. + */ + q=colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + switch (depth) + { + default: + { + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + ThrowWriterException(CorruptImageError,"ImageDepthNotSupported"); + } + case 32: + { + unsigned int + pixel; + + pixel=ScaleQuantumToLong(image->colormap[i].red); + q=PopLongPixel(MSBEndian,pixel,q); + pixel=ScaleQuantumToLong(image->colormap[i].green); + q=PopLongPixel(MSBEndian,pixel,q); + pixel=ScaleQuantumToLong(image->colormap[i].blue); + q=PopLongPixel(MSBEndian,pixel,q); + break; + } + case 16: + { + unsigned short + pixel; + + pixel=ScaleQuantumToShort(image->colormap[i].red); + q=PopShortPixel(MSBEndian,pixel,q); + pixel=ScaleQuantumToShort(image->colormap[i].green); + q=PopShortPixel(MSBEndian,pixel,q); + pixel=ScaleQuantumToShort(image->colormap[i].blue); + q=PopShortPixel(MSBEndian,pixel,q); + break; + } + case 8: + { + unsigned char + pixel; + + pixel=(unsigned char) ScaleQuantumToChar(image->colormap[i].red); + q=PopCharPixel(pixel,q); + pixel=(unsigned char) ScaleQuantumToChar( + image->colormap[i].green); + q=PopCharPixel(pixel,q); + pixel=(unsigned char) ScaleQuantumToChar(image->colormap[i].blue); + q=PopCharPixel(pixel,q); + break; + } + } + } + (void) WriteBlob(image,packet_size*image->colors,colormap); + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + } + /* + Initialize persistent pixel cache. + */ + status=PersistPixelCache(image,cache_filename,MagickFalse,&offset, + &image->exception); + if (status == MagickFalse) + ThrowWriterException(CacheError,"UnableToPersistPixelCache"); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + status=image->progress_monitor(SaveImagesTag,scene,imageListLength, + image->client_data); + if (status == MagickFalse) + break; + } + scene++; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/mpr.c b/ImageMagick-6.9.12-44/coders/mpr.c new file mode 100644 index 0000000..24c4e1f --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/mpr.c @@ -0,0 +1,228 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M PPPP RRRR % +% MM MM P P R R % +% M M M PPPP RRRR % +% M M P R R % +% M M P R R % +% % +% % +% Read/Write the Magick Persistent Registry. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/registry.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMPRImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M P R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMPRImage() reads a Magick Persistent Registry image as a blob from +% memory. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadMPRImage method is: +% +% Image *ReadMPRImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMPRImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=(Image *) GetImageRegistry(ImageRegistryType,image_info->filename, + exception); + if (image == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),FileOpenError, + "UnableToOpenFile","`%s'",image_info->filename); + return(image); + } + (void) SyncImageSettings(image_info,image); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M P R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMPRImage() adds attributes for the MPR image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMPRImage method is: +% +% size_t RegisterMPRImage(void) +% +*/ +ModuleExport size_t RegisterMPRImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MPR"); + entry->decoder=(DecodeImageHandler *) ReadMPRImage; + entry->encoder=(EncodeImageHandler *) WriteMPRImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->stealth=MagickTrue; + entry->description=ConstantString("Magick Persistent Registry"); + entry->magick_module=ConstantString("MPR"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("MPRI"); + entry->decoder=(DecodeImageHandler *) ReadMPRImage; + entry->encoder=(EncodeImageHandler *) WriteMPRImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->stealth=MagickTrue; + entry->description=ConstantString("Magick Persistent Registry"); + entry->magick_module=ConstantString("MPR"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M P R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMPRImage() removes format registrations made by the +% MPR module from the list of supported formats. +% +% The format of the UnregisterMPRImage method is: +% +% UnregisterMPRImage(void) +% +*/ +ModuleExport void UnregisterMPRImage(void) +{ + (void) UnregisterMagickInfo("MPRI"); + (void) UnregisterMagickInfo("MPR"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M P R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMPRImage() writes an image into the Magick Persistent Registry +% image as a blob from memory. It allocates the memory necessary for the +% new Image structure and returns a pointer to the new image. +% +% The format of the WriteMPRImage method is: +% +% MagickBooleanType WriteMPRImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteMPRImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + status; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + magick_unreferenced(image_info); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=SetImageRegistry(ImageRegistryType,image->filename,image, + &image->exception); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/msl.c b/ImageMagick-6.9.12-44/coders/msl.c new file mode 100644 index 0000000..5bda3a3 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/msl.c @@ -0,0 +1,8333 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M SSSSS L % +% MM MM SS L % +% M M M SSS L % +% M M SS L % +% M M SSSSS LLLLL % +% % +% % +% Execute Magick Scripting Language Scripts. % +% % +% Software Design % +% Cristy % +% Leonard Rosenthol % +% William Radcliffe % +% December 2001 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/annotate.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/cache-view.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/colormap.h" +#include "magick/color-private.h" +#include "magick/composite.h" +#include "magick/constitute.h" +#include "magick/decorate.h" +#include "magick/display.h" +#include "magick/distort.h" +#include "magick/draw.h" +#include "magick/effect.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/option.h" +#include "magick/paint.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/quantum-private.h" +#include "magick/registry.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/segment.h" +#include "magick/shear.h" +#include "magick/signature.h" +#include "magick/statistic.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/transform.h" +#include "magick/threshold.h" +#include "magick/utility.h" +#include "magick/visual-effects.h" +#if defined(MAGICKCORE_XML_DELEGATE) +# if defined(MAGICKCORE_WINDOWS_SUPPORT) +# if !defined(__MINGW32__) +# include +# endif +# endif +# include +# include +# include +#endif + +/* + Define Declatations. +*/ +#define ThrowMSLException(severity,tag,reason) \ + (void) ThrowMagickException(msl_info->exception,GetMagickModule(),severity, \ + tag,"`%s'",reason); + +/* + Typedef declaractions. +*/ +typedef struct _MSLGroupInfo +{ + size_t + numImages; /* how many images are in this group */ +} MSLGroupInfo; + +typedef struct _MSLInfo +{ + ExceptionInfo + *exception; + + ssize_t + n, + number_groups; + + ImageInfo + **image_info; + + DrawInfo + **draw_info; + + Image + **attributes, + **image; + + char + *content; + + MSLGroupInfo + *group_info; + +#if defined(MAGICKCORE_XML_DELEGATE) + xmlParserCtxtPtr + parser; + + xmlDocPtr + document; +#endif +} MSLInfo; + +/* + Forward declarations. +*/ +#if defined(MAGICKCORE_XML_DELEGATE) +static MagickBooleanType + WriteMSLImage(const ImageInfo *,Image *); + +static MagickBooleanType + SetMSLAttributes(MSLInfo *,const char *,const char *); +#endif + +#if defined(MAGICKCORE_XML_DELEGATE) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M S L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMSLImage() reads a Magick Scripting Language file and returns it. +% It allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadMSLImage method is: +% +% Image *ReadMSLImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static inline Image *GetImageCache(const ImageInfo *image_info,const char *path, + ExceptionInfo *exception) +{ + char + key[MaxTextExtent]; + + ExceptionInfo + *sans_exception; + + Image + *image; + + ImageInfo + *read_info; + + (void) FormatLocaleString(key,MaxTextExtent,"cache:%s",path); + sans_exception=AcquireExceptionInfo(); + image=(Image *) GetImageRegistry(ImageRegistryType,key,sans_exception); + sans_exception=DestroyExceptionInfo(sans_exception); + if (image != (Image *) NULL) + return(image); + read_info=CloneImageInfo(image_info); + (void) CopyMagickString(read_info->filename,path,MaxTextExtent); + image=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (image != (Image *) NULL) + (void) SetImageRegistry(ImageRegistryType,key,image,exception); + return(image); +} + +static int IsPathDirectory(const char *path) +{ + MagickBooleanType + status; + + struct stat + attributes; + + if ((path == (const char *) NULL) || (*path == '\0')) + return(MagickFalse); + status=GetPathAttributes(path,&attributes); + if (status == MagickFalse) + return(-1); + if (S_ISDIR(attributes.st_mode) == 0) + return(0); + return(1); +} + +static int MSLIsStandalone(void *context) +{ + MSLInfo + *msl_info; + + /* + Is this document tagged standalone? + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.MSLIsStandalone()"); + msl_info=(MSLInfo *) context; + return(msl_info->document->standalone == 1); +} + +static int MSLHasInternalSubset(void *context) +{ + MSLInfo + *msl_info; + + /* + Does this document has an internal subset? + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.MSLHasInternalSubset()"); + msl_info=(MSLInfo *) context; + return(msl_info->document->intSubset != NULL); +} + +static int MSLHasExternalSubset(void *context) +{ + MSLInfo + *msl_info; + + /* + Does this document has an external subset? + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.MSLHasExternalSubset()"); + msl_info=(MSLInfo *) context; + return(msl_info->document->extSubset != NULL); +} + +static void MSLInternalSubset(void *context,const xmlChar *name, + const xmlChar *external_id,const xmlChar *system_id) +{ + MSLInfo + *msl_info; + + /* + Does this document has an internal subset? + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.internalSubset(%s %s %s)",name, + (external_id != (const xmlChar *) NULL ? (const char *) external_id : " "), + (system_id != (const xmlChar *) NULL ? (const char *) system_id : " ")); + msl_info=(MSLInfo *) context; + (void) xmlCreateIntSubset(msl_info->document,name,external_id,system_id); +} + +static xmlParserInputPtr MSLResolveEntity(void *context, + const xmlChar *public_id,const xmlChar *system_id) +{ + MSLInfo + *msl_info; + + xmlParserInputPtr + stream; + + /* + Special entity resolver, better left to the parser, it has more + context than the application layer. The default behaviour is to + not resolve the entities, in that case the ENTITY_REF nodes are + built in the structure (and the parameter values). + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.resolveEntity(%s, %s)", + (public_id != (const xmlChar *) NULL ? (const char *) public_id : "none"), + (system_id != (const xmlChar *) NULL ? (const char *) system_id : "none")); + msl_info=(MSLInfo *) context; + stream=xmlLoadExternalEntity((const char *) system_id,(const char *) + public_id,msl_info->parser); + return(stream); +} + +static xmlEntityPtr MSLGetEntity(void *context,const xmlChar *name) +{ + MSLInfo + *msl_info; + + /* + Get an entity by name. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.MSLGetEntity(%s)",(const char *) name); + msl_info=(MSLInfo *) context; + return(xmlGetDocEntity(msl_info->document,name)); +} + +static xmlEntityPtr MSLGetParameterEntity(void *context,const xmlChar *name) +{ + MSLInfo + *msl_info; + + /* + Get a parameter entity by name. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.getParameterEntity(%s)",(const char *) name); + msl_info=(MSLInfo *) context; + return(xmlGetParameterEntity(msl_info->document,name)); +} + +static void MSLEntityDeclaration(void *context,const xmlChar *name,int type, + const xmlChar *public_id,const xmlChar *system_id,xmlChar *content) +{ + MSLInfo + *msl_info; + + /* + An entity definition has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.entityDecl(%s, %d, %s, %s, %s)",name,type, + public_id != (const xmlChar *) NULL ? (const char *) public_id : "none", + system_id != (const xmlChar *) NULL ? (const char *) system_id : "none", + content); + msl_info=(MSLInfo *) context; + if (msl_info->parser->inSubset == 1) + (void) xmlAddDocEntity(msl_info->document,name,type,public_id,system_id, + content); + else + if (msl_info->parser->inSubset == 2) + (void) xmlAddDtdEntity(msl_info->document,name,type,public_id,system_id, + content); +} + +static void MSLAttributeDeclaration(void *context,const xmlChar *element, + const xmlChar *name,int type,int value,const xmlChar *default_value, + xmlEnumerationPtr tree) +{ + MSLInfo + *msl_info; + + xmlChar + *fullname, + *prefix; + + xmlParserCtxtPtr + parser; + + /* + An attribute definition has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",element,name,type,value, + default_value); + msl_info=(MSLInfo *) context; + fullname=(xmlChar *) NULL; + prefix=(xmlChar *) NULL; + parser=msl_info->parser; + fullname=(xmlChar *) xmlSplitQName(parser,name,&prefix); + if (parser->inSubset == 1) + (void) xmlAddAttributeDecl(&parser->vctxt,msl_info->document->intSubset, + element,fullname,prefix,(xmlAttributeType) type, + (xmlAttributeDefault) value,default_value,tree); + else + if (parser->inSubset == 2) + (void) xmlAddAttributeDecl(&parser->vctxt,msl_info->document->extSubset, + element,fullname,prefix,(xmlAttributeType) type, + (xmlAttributeDefault) value,default_value,tree); + if (prefix != (xmlChar *) NULL) + xmlFree(prefix); + if (fullname != (xmlChar *) NULL) + xmlFree(fullname); +} + +static void MSLElementDeclaration(void *context,const xmlChar *name,int type, + xmlElementContentPtr content) +{ + MSLInfo + *msl_info; + + xmlParserCtxtPtr + parser; + + /* + An element definition has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.elementDecl(%s, %d, ...)",name,type); + msl_info=(MSLInfo *) context; + parser=msl_info->parser; + if (parser->inSubset == 1) + (void) xmlAddElementDecl(&parser->vctxt,msl_info->document->intSubset, + name,(xmlElementTypeVal) type,content); + else + if (parser->inSubset == 2) + (void) xmlAddElementDecl(&parser->vctxt,msl_info->document->extSubset, + name,(xmlElementTypeVal) type,content); +} + +static void MSLNotationDeclaration(void *context,const xmlChar *name, + const xmlChar *public_id,const xmlChar *system_id) +{ + MSLInfo + *msl_info; + + xmlParserCtxtPtr + parser; + + /* + What to do when a notation declaration has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.notationDecl(%s, %s, %s)",name, + public_id != (const xmlChar *) NULL ? (const char *) public_id : "none", + system_id != (const xmlChar *) NULL ? (const char *) system_id : "none"); + msl_info=(MSLInfo *) context; + parser=msl_info->parser; + if (parser->inSubset == 1) + (void) xmlAddNotationDecl(&parser->vctxt,msl_info->document->intSubset, + name,public_id,system_id); + else + if (parser->inSubset == 2) + (void) xmlAddNotationDecl(&parser->vctxt,msl_info->document->intSubset, + name,public_id,system_id); +} + +static void MSLUnparsedEntityDeclaration(void *context,const xmlChar *name, + const xmlChar *public_id,const xmlChar *system_id,const xmlChar *notation) +{ + MSLInfo + *msl_info; + + /* + What to do when an unparsed entity declaration is parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.unparsedEntityDecl(%s, %s, %s, %s)",name, + public_id != (const xmlChar *) NULL ? (const char *) public_id : "none", + system_id != (const xmlChar *) NULL ? (const char *) system_id : "none", + notation); + msl_info=(MSLInfo *) context; + (void) xmlAddDocEntity(msl_info->document,name, + XML_EXTERNAL_GENERAL_UNPARSED_ENTITY,public_id,system_id,notation); + +} + +static void MSLSetDocumentLocator(void *context,xmlSAXLocatorPtr location) +{ + MSLInfo + *msl_info; + + /* + Receive the document locator at startup, actually xmlDefaultSAXLocator. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.setDocumentLocator()\n"); + (void) location; + msl_info=(MSLInfo *) context; + (void) msl_info; +} + +static void MSLStartDocument(void *context) +{ + MSLInfo + *msl_info; + + xmlParserCtxtPtr + parser; + + /* + Called when the document start being processed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.startDocument()"); + msl_info=(MSLInfo *) context; + parser=msl_info->parser; + msl_info->document=xmlNewDoc(parser->version); + if (msl_info->document == (xmlDocPtr) NULL) + return; + if (parser->encoding == NULL) + msl_info->document->encoding=NULL; + else + msl_info->document->encoding=xmlStrdup(parser->encoding); + msl_info->document->standalone=parser->standalone; +} + +static void MSLEndDocument(void *context) +{ + MSLInfo + *msl_info; + + /* + Called when the document end has been detected. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.endDocument()"); + msl_info=(MSLInfo *) context; + if (msl_info->content != (char *) NULL) + msl_info->content=DestroyString(msl_info->content); +#if defined(MAGICKCORE_XML_DELEGATE) + if (msl_info->document != (xmlDocPtr) NULL) + { + xmlFreeDoc(msl_info->document); + msl_info->document=(xmlDocPtr) NULL; + } +#endif +} + +static void MSLPushImage(MSLInfo *msl_info,Image *image) +{ + ssize_t + n; + + if (image != (Image *) NULL) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(msl_info != (MSLInfo *) NULL); + msl_info->n++; + n=msl_info->n; + msl_info->image_info=(ImageInfo **) ResizeQuantumMemory(msl_info->image_info, + (n+1),sizeof(*msl_info->image_info)); + msl_info->draw_info=(DrawInfo **) ResizeQuantumMemory(msl_info->draw_info, + (n+1),sizeof(*msl_info->draw_info)); + msl_info->attributes=(Image **) ResizeQuantumMemory(msl_info->attributes, + (n+1),sizeof(*msl_info->attributes)); + msl_info->image=(Image **) ResizeQuantumMemory(msl_info->image,(n+1), + sizeof(*msl_info->image)); + if ((msl_info->image_info == (ImageInfo **) NULL) || + (msl_info->draw_info == (DrawInfo **) NULL) || + (msl_info->attributes == (Image **) NULL) || + (msl_info->image == (Image **) NULL)) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + msl_info->image_info[n]=CloneImageInfo(msl_info->image_info[n-1]); + msl_info->draw_info[n]=CloneDrawInfo(msl_info->image_info[n-1], + msl_info->draw_info[n-1]); + msl_info->attributes[n]=CloneImage(msl_info->attributes[n-1],0,0,MagickTrue, + &image->exception); + msl_info->image[n]=(Image *) image; + if ((msl_info->image_info[n] == (ImageInfo *) NULL) || + (msl_info->attributes[n] == (Image *) NULL)) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + if (msl_info->number_groups != 0) + msl_info->group_info[msl_info->number_groups-1].numImages++; +} + +static void MSLPopImage(MSLInfo *msl_info) +{ + if (msl_info->number_groups != 0) + return; + if (msl_info->image[msl_info->n] != (Image *) NULL) + msl_info->image[msl_info->n]=DestroyImage(msl_info->image[msl_info->n]); + msl_info->attributes[msl_info->n]=DestroyImage( + msl_info->attributes[msl_info->n]); + msl_info->draw_info[msl_info->n]=DestroyDrawInfo( + msl_info->draw_info[msl_info->n]); + msl_info->image_info[msl_info->n]=DestroyImageInfo( + msl_info->image_info[msl_info->n]); + msl_info->n--; +} + +static void MSLStartElement(void *context,const xmlChar *tag, + const xmlChar **attributes) +{ + AffineMatrix + affine, + current; + + ChannelType + channel; + + char + *attribute, + key[MaxTextExtent], + *value; + + const char + *keyword; + + double + angle; + + DrawInfo + *draw_info; + + ExceptionInfo + *exception; + + GeometryInfo + geometry_info; + + Image + *image; + + int + flags; + + ssize_t + option, + j, + n, + x, + y; + + MSLInfo + *msl_info; + + RectangleInfo + geometry; + + ssize_t + i; + + size_t + height, + width; + + /* + Called when an opening tag has been processed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.startElement(%s",tag); + exception=AcquireExceptionInfo(); + msl_info=(MSLInfo *) context; + n=msl_info->n; + keyword=(const char *) NULL; + value=(char *) NULL; + SetGeometryInfo(&geometry_info); + (void) memset(&geometry,0,sizeof(geometry)); + channel=DefaultChannels; + switch (*tag) + { + case 'A': + case 'a': + { + if (LocaleCompare((const char *) tag,"add-noise") == 0) + { + Image + *noise_image; + + NoiseType + noise; + + /* + Add noise image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + noise=UniformNoise; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"channel") == 0) + { + option=ParseChannelOption(value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedChannelType", + value); + channel=(ChannelType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'N': + case 'n': + { + if (LocaleCompare(keyword,"noise") == 0) + { + option=ParseCommandOption(MagickNoiseOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedNoiseType", + value); + noise=(NoiseType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + noise_image=AddNoiseImageChannel(msl_info->image[n],channel,noise, + &msl_info->image[n]->exception); + if (noise_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=noise_image; + break; + } + if (LocaleCompare((const char *) tag,"annotate") == 0) + { + char + text[MaxTextExtent]; + + /* + Annotate image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + draw_info=CloneDrawInfo(msl_info->image_info[n], + msl_info->draw_info[n]); + angle=0.0; + current=draw_info->affine; + GetAffineMatrix(&affine); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'A': + case 'a': + { + if (LocaleCompare(keyword,"affine") == 0) + { + char + *p; + + p=value; + draw_info->affine.sx=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.rx=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.ry=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.sy=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.tx=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.ty=StringToDouble(p,&p); + break; + } + if (LocaleCompare(keyword,"align") == 0) + { + option=ParseCommandOption(MagickAlignOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedAlignType", + value); + draw_info->align=(AlignType) option; + break; + } + if (LocaleCompare(keyword,"antialias") == 0) + { + option=ParseCommandOption(MagickBooleanOptions, + MagickFalse,value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedBooleanType", + value); + draw_info->stroke_antialias=(MagickBooleanType) option; + draw_info->text_antialias=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"density") == 0) + { + CloneString(&draw_info->density,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(keyword,"encoding") == 0) + { + CloneString(&draw_info->encoding,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword, "fill") == 0) + { + (void) QueryColorDatabase(value,&draw_info->fill, + exception); + break; + } + if (LocaleCompare(keyword,"family") == 0) + { + CloneString(&draw_info->family,value); + break; + } + if (LocaleCompare(keyword,"font") == 0) + { + CloneString(&draw_info->font,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + break; + } + if (LocaleCompare(keyword,"gravity") == 0) + { + option=ParseCommandOption(MagickGravityOptions, + MagickFalse,value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedGravityType", + value); + draw_info->gravity=(GravityType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(keyword,"pointsize") == 0) + { + draw_info->pointsize=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"rotate") == 0) + { + angle=StringToDouble(value,(char **) NULL); + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"scale") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + break; + } + if (LocaleCompare(keyword,"skewX") == 0) + { + angle=StringToDouble(value,(char **) NULL); + affine.ry=tan(DegreesToRadians(fmod((double) angle, + 360.0))); + break; + } + if (LocaleCompare(keyword,"skewY") == 0) + { + angle=StringToDouble(value,(char **) NULL); + affine.rx=tan(DegreesToRadians(fmod((double) angle, + 360.0))); + break; + } + if (LocaleCompare(keyword,"stretch") == 0) + { + option=ParseCommandOption(MagickStretchOptions, + MagickFalse,value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedStretchType", + value); + draw_info->stretch=(StretchType) option; + break; + } + if (LocaleCompare(keyword, "stroke") == 0) + { + (void) QueryColorDatabase(value,&draw_info->stroke, + exception); + break; + } + if (LocaleCompare(keyword,"strokewidth") == 0) + { + draw_info->stroke_width=StringToLong(value); + break; + } + if (LocaleCompare(keyword,"style") == 0) + { + option=ParseCommandOption(MagickStyleOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedStyleType", + value); + draw_info->style=(StyleType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(keyword,"text") == 0) + { + CloneString(&draw_info->text,value); + break; + } + if (LocaleCompare(keyword,"translate") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + affine.tx=geometry_info.rho; + affine.ty=geometry_info.sigma; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'U': + case 'u': + { + if (LocaleCompare(keyword, "undercolor") == 0) + { + (void) QueryColorDatabase(value,&draw_info->undercolor, + exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"weight") == 0) + { + draw_info->weight=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry.x=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry.y=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) FormatLocaleString(text,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) geometry.width,(double) + geometry.height,(double) geometry.x,(double) geometry.y); + CloneString(&draw_info->geometry,text); + draw_info->affine.sx=affine.sx*current.sx+affine.ry*current.rx; + draw_info->affine.rx=affine.rx*current.sx+affine.sy*current.rx; + draw_info->affine.ry=affine.sx*current.ry+affine.ry*current.sy; + draw_info->affine.sy=affine.rx*current.ry+affine.sy*current.sy; + draw_info->affine.tx=affine.sx*current.tx+affine.ry*current.ty+ + affine.tx; + draw_info->affine.ty=affine.rx*current.tx+affine.sy*current.ty+ + affine.ty; + (void) AnnotateImage(msl_info->image[n],draw_info); + draw_info=DestroyDrawInfo(draw_info); + break; + } + if (LocaleCompare((const char *) tag,"append") == 0) + { + Image + *append_image; + + MagickBooleanType + stack; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + stack=MagickFalse; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'S': + case 's': + { + if (LocaleCompare(keyword,"stack") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedBooleanType", + value); + stack=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + append_image=AppendImages(msl_info->image[n],stack, + &msl_info->image[n]->exception); + if (append_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=append_image; + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + break; + } + case 'B': + case 'b': + { + if (LocaleCompare((const char *) tag,"blur") == 0) + { + Image + *blur_image; + + /* + Blur image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"channel") == 0) + { + option=ParseChannelOption(value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedChannelType", + value); + channel=(ChannelType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"radius") == 0) + { + geometry_info.rho=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"sigma") == 0) + { + geometry_info.sigma=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + blur_image=BlurImageChannel(msl_info->image[n],channel, + geometry_info.rho,geometry_info.sigma, + &msl_info->image[n]->exception); + if (blur_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=blur_image; + break; + } + if (LocaleCompare((const char *) tag,"border") == 0) + { + Image + *border_image; + + /* + Border image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + SetGeometry(msl_info->image[n],&geometry); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"compose") == 0) + { + option=ParseCommandOption(MagickComposeOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedComposeType", + value); + msl_info->image[n]->compose=(CompositeOperator) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword, "fill") == 0) + { + (void) QueryColorDatabase(value, + &msl_info->image[n]->border_color,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + geometry.height=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + geometry.width=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + border_image=BorderImage(msl_info->image[n],&geometry, + &msl_info->image[n]->exception); + if (border_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=border_image; + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'C': + case 'c': + { + if (LocaleCompare((const char *) tag,"colorize") == 0) + { + char + opacity[MaxTextExtent]; + + Image + *colorize_image; + + PixelPacket + target; + + /* + Add noise image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + target=msl_info->image[n]->background_color; + (void) CopyMagickString(opacity,"100",MaxTextExtent); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"fill") == 0) + { + (void) QueryColorDatabase(value,&target, + &msl_info->image[n]->exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(keyword,"opacity") == 0) + { + (void) CopyMagickString(opacity,value,MaxTextExtent); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + colorize_image=ColorizeImage(msl_info->image[n],opacity,target, + &msl_info->image[n]->exception); + if (colorize_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=colorize_image; + break; + } + if (LocaleCompare((const char *) tag, "charcoal") == 0) + { + double radius = 0.0, + sigma = 1.0; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + /* + NOTE: charcoal can have no attributes, since we use all the defaults! + */ + if (attributes != (const xmlChar **) NULL) + { + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"radius") == 0) + { + radius=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"sigma") == 0) + { + sigma = StringToLong( value ); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + } + + /* + charcoal image. + */ + { + Image + *newImage; + + newImage=CharcoalImage(msl_info->image[n],radius,sigma, + &msl_info->image[n]->exception); + if (newImage == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=newImage; + break; + } + } + if (LocaleCompare((const char *) tag,"chop") == 0) + { + Image + *chop_image; + + /* + Chop image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + SetGeometry(msl_info->image[n],&geometry); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + geometry.height=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + geometry.width=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry.x=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry.y=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + chop_image=ChopImage(msl_info->image[n],&geometry, + &msl_info->image[n]->exception); + if (chop_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=chop_image; + break; + } + if (LocaleCompare((const char *) tag,"color-floodfill") == 0) + { + PaintMethod + paint_method; + + MagickPixelPacket + target; + + /* + Color floodfill image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + draw_info=CloneDrawInfo(msl_info->image_info[n], + msl_info->draw_info[n]); + SetGeometry(msl_info->image[n],&geometry); + paint_method=FloodfillMethod; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'B': + case 'b': + { + if (LocaleCompare(keyword,"bordercolor") == 0) + { + (void) QueryMagickColor(value,&target,exception); + paint_method=FillToBorderMethod; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"fill") == 0) + { + (void) QueryColorDatabase(value,&draw_info->fill, + exception); + break; + } + if (LocaleCompare(keyword,"fuzz") == 0) + { + msl_info->image[n]->fuzz=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + (void) GetOneVirtualMagickPixel(msl_info->image[n], + geometry.x,geometry.y,&target,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry.x=StringToLong(value); + (void) GetOneVirtualMagickPixel(msl_info->image[n], + geometry.x,geometry.y,&target,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry.y=StringToLong(value); + (void) GetOneVirtualMagickPixel(msl_info->image[n], + geometry.x,geometry.y,&target,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) FloodfillPaintImage(msl_info->image[n],DefaultChannels, + draw_info,&target,geometry.x,geometry.y, + paint_method == FloodfillMethod ? MagickFalse : MagickTrue); + draw_info=DestroyDrawInfo(draw_info); + break; + } + if (LocaleCompare((const char *) tag,"comment") == 0) + break; + if (LocaleCompare((const char *) tag,"composite") == 0) + { + char + composite_geometry[MaxTextExtent]; + + CompositeOperator + compose; + + Image + *composite_image, + *rotate_image; + + PixelPacket + target; + + /* + Composite image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + composite_image=NewImageList(); + compose=OverCompositeOp; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"compose") == 0) + { + option=ParseCommandOption(MagickComposeOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedComposeType", + value); + compose=(CompositeOperator) option; + break; + } + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(keyword,"image") == 0) + for (j=0; j < msl_info->n; j++) + { + const char + *attribute; + + attribute=GetImageProperty(msl_info->attributes[j],"id"); + if ((attribute != (const char *) NULL) && + (LocaleCompare(attribute,value) == 0)) + { + composite_image=CloneImage(msl_info->image[j],0,0, + MagickFalse,exception); + break; + } + } + break; + } + default: + break; + } + } + if (composite_image == (Image *) NULL) + break; + rotate_image=NewImageList(); + SetGeometry(msl_info->image[n],&geometry); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'B': + case 'b': + { + if (LocaleCompare(keyword,"blend") == 0) + { + (void) SetImageArtifact(composite_image, + "compose:args",value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"channel") == 0) + { + option=ParseChannelOption(value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedChannelType", + value); + channel=(ChannelType) option; + break; + } + if (LocaleCompare(keyword, "color") == 0) + { + (void) QueryColorDatabase(value, + &composite_image->background_color,exception); + break; + } + if (LocaleCompare(keyword,"compose") == 0) + break; + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + (void) GetOneVirtualPixel(msl_info->image[n],geometry.x, + geometry.y,&target,exception); + break; + } + if (LocaleCompare(keyword,"gravity") == 0) + { + option=ParseCommandOption(MagickGravityOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedGravityType", + value); + msl_info->image[n]->gravity=(GravityType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(keyword,"image") == 0) + break; + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(keyword,"mask") == 0) + for (j=0; j < msl_info->n; j++) + { + const char + *attribute; + + attribute=GetImageProperty(msl_info->attributes[j],"id"); + if ((attribute != (const char *) NULL) && + (LocaleCompare(value,value) == 0)) + { + SetImageType(composite_image,TrueColorMatteType); + (void) CompositeImage(composite_image, + CopyOpacityCompositeOp,msl_info->image[j],0,0); + break; + } + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(keyword,"opacity") == 0) + { + ssize_t + opacity, + y; + + ssize_t + x; + + PixelPacket + *q; + + CacheView + *composite_view; + + opacity=QuantumRange-StringToLong(value); + if (compose != DissolveCompositeOp) + { + (void) SetImageOpacity(composite_image,(Quantum) + opacity); + break; + } + (void) SetImageArtifact(msl_info->image[n], + "compose:args",value); + if (composite_image->matte != MagickTrue) + (void) SetImageOpacity(composite_image,OpaqueOpacity); + composite_view=AcquireAuthenticCacheView(composite_image, + exception); + for (y=0; y < (ssize_t) composite_image->rows ; y++) + { + q=GetCacheViewAuthenticPixels(composite_view,0,y, + (ssize_t) composite_image->columns,1,exception); + for (x=0; x < (ssize_t) composite_image->columns; x++) + { + if (q->opacity == OpaqueOpacity) + q->opacity=ClampToQuantum(opacity); + q++; + } + if (SyncCacheViewAuthenticPixels(composite_view,exception) == MagickFalse) + break; + } + composite_view=DestroyCacheView(composite_view); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"rotate") == 0) + { + rotate_image=RotateImage(composite_image, + StringToDouble(value,(char **) NULL),exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(keyword,"tile") == 0) + { + MagickBooleanType + tile; + + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedBooleanType", + value); + tile=(MagickBooleanType) option; + (void) tile; + if (rotate_image != (Image *) NULL) + (void) SetImageArtifact(rotate_image, + "compose:outside-overlay","false"); + else + (void) SetImageArtifact(composite_image, + "compose:outside-overlay","false"); + image=msl_info->image[n]; + height=composite_image->rows; + width=composite_image->columns; + for (y=0; y < (ssize_t) image->rows; y+=(ssize_t) height) + for (x=0; x < (ssize_t) image->columns; x+=(ssize_t) width) + { + if (rotate_image != (Image *) NULL) + (void) CompositeImage(image,compose,rotate_image, + x,y); + else + (void) CompositeImage(image,compose, + composite_image,x,y); + } + if (rotate_image != (Image *) NULL) + rotate_image=DestroyImage(rotate_image); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry.x=StringToLong(value); + (void) GetOneVirtualPixel(msl_info->image[n],geometry.x, + geometry.y,&target,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry.y=StringToLong(value); + (void) GetOneVirtualPixel(msl_info->image[n],geometry.x, + geometry.y,&target,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + image=msl_info->image[n]; + (void) FormatLocaleString(composite_geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) composite_image->columns, + (double) composite_image->rows,(double) geometry.x,(double) + geometry.y); + flags=ParseGravityGeometry(image,composite_geometry,&geometry, + exception); + if (rotate_image == (Image *) NULL) + CompositeImageChannel(image,channel,compose,composite_image, + geometry.x,geometry.y); + else + { + /* + Rotate image. + */ + geometry.x-=(ssize_t) (rotate_image->columns- + composite_image->columns)/2; + geometry.y-=(ssize_t) (rotate_image->rows-composite_image->rows)/2; + CompositeImageChannel(image,channel,compose,rotate_image, + geometry.x,geometry.y); + rotate_image=DestroyImage(rotate_image); + } + composite_image=DestroyImage(composite_image); + break; + } + if (LocaleCompare((const char *) tag,"contrast") == 0) + { + MagickBooleanType + sharpen; + + /* + Contrast image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + sharpen=MagickFalse; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'S': + case 's': + { + if (LocaleCompare(keyword,"sharpen") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedBooleanType", + value); + sharpen=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) ContrastImage(msl_info->image[n],sharpen); + break; + } + if (LocaleCompare((const char *) tag,"crop") == 0) + { + Image + *crop_image; + + /* + Crop image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + SetGeometry(msl_info->image[n],&geometry); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGravityGeometry(msl_info->image[n],value, + &geometry,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + geometry.height=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + geometry.width=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry.x=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry.y=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + crop_image=CropImage(msl_info->image[n],&geometry, + &msl_info->image[n]->exception); + if (crop_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=crop_image; + break; + } + if (LocaleCompare((const char *) tag,"cycle-colormap") == 0) + { + ssize_t + display; + + /* + Cycle-colormap image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + display=0; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"display") == 0) + { + display=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) CycleColormapImage(msl_info->image[n],display); + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'D': + case 'd': + { + if (LocaleCompare((const char *) tag,"despeckle") == 0) + { + Image + *despeckle_image; + + /* + Despeckle image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + } + despeckle_image=DespeckleImage(msl_info->image[n], + &msl_info->image[n]->exception); + if (despeckle_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=despeckle_image; + break; + } + if (LocaleCompare((const char *) tag,"display") == 0) + { + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) DisplayImages(msl_info->image_info[n],msl_info->image[n]); + break; + } + if (LocaleCompare((const char *) tag,"draw") == 0) + { + char + text[MaxTextExtent]; + + /* + Annotate image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + draw_info=CloneDrawInfo(msl_info->image_info[n], + msl_info->draw_info[n]); + angle=0.0; + current=draw_info->affine; + GetAffineMatrix(&affine); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'A': + case 'a': + { + if (LocaleCompare(keyword,"affine") == 0) + { + char + *p; + + p=value; + draw_info->affine.sx=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.rx=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.ry=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.sy=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.tx=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.ty=StringToDouble(p,&p); + break; + } + if (LocaleCompare(keyword,"align") == 0) + { + option=ParseCommandOption(MagickAlignOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedAlignType", + value); + draw_info->align=(AlignType) option; + break; + } + if (LocaleCompare(keyword,"antialias") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedBooleanType", + value); + draw_info->stroke_antialias=(MagickBooleanType) option; + draw_info->text_antialias=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"density") == 0) + { + CloneString(&draw_info->density,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(keyword,"encoding") == 0) + { + CloneString(&draw_info->encoding,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword, "fill") == 0) + { + (void) QueryColorDatabase(value,&draw_info->fill, + exception); + break; + } + if (LocaleCompare(keyword,"family") == 0) + { + CloneString(&draw_info->family,value); + break; + } + if (LocaleCompare(keyword,"font") == 0) + { + CloneString(&draw_info->font,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + break; + } + if (LocaleCompare(keyword,"gravity") == 0) + { + option=ParseCommandOption(MagickGravityOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedGravityType", + value); + draw_info->gravity=(GravityType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(keyword,"points") == 0) + { + if (LocaleCompare(draw_info->primitive,"path") == 0) + { + (void) ConcatenateString(&draw_info->primitive," '"); + ConcatenateString(&draw_info->primitive,value); + (void) ConcatenateString(&draw_info->primitive,"'"); + } + else + { + (void) ConcatenateString(&draw_info->primitive," "); + ConcatenateString(&draw_info->primitive,value); + } + break; + } + if (LocaleCompare(keyword,"pointsize") == 0) + { + draw_info->pointsize=StringToDouble(value, + (char **) NULL); + break; + } + if (LocaleCompare(keyword,"primitive") == 0) + { + CloneString(&draw_info->primitive,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"rotate") == 0) + { + angle=StringToDouble(value,(char **) NULL); + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"scale") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + break; + } + if (LocaleCompare(keyword,"skewX") == 0) + { + angle=StringToDouble(value,(char **) NULL); + affine.ry=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + if (LocaleCompare(keyword,"skewY") == 0) + { + angle=StringToDouble(value,(char **) NULL); + affine.rx=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + if (LocaleCompare(keyword,"stretch") == 0) + { + option=ParseCommandOption(MagickStretchOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedStretchType", + value); + draw_info->stretch=(StretchType) option; + break; + } + if (LocaleCompare(keyword, "stroke") == 0) + { + (void) QueryColorDatabase(value,&draw_info->stroke, + exception); + break; + } + if (LocaleCompare(keyword,"strokewidth") == 0) + { + draw_info->stroke_width=StringToLong(value); + break; + } + if (LocaleCompare(keyword,"style") == 0) + { + option=ParseCommandOption(MagickStyleOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedStyleType", + value); + draw_info->style=(StyleType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(keyword,"text") == 0) + { + (void) ConcatenateString(&draw_info->primitive," '"); + (void) ConcatenateString(&draw_info->primitive,value); + (void) ConcatenateString(&draw_info->primitive,"'"); + break; + } + if (LocaleCompare(keyword,"translate") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + affine.tx=geometry_info.rho; + affine.ty=geometry_info.sigma; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'U': + case 'u': + { + if (LocaleCompare(keyword, "undercolor") == 0) + { + (void) QueryColorDatabase(value,&draw_info->undercolor, + exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"weight") == 0) + { + draw_info->weight=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry.x=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry.y=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) FormatLocaleString(text,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) geometry.width,(double) + geometry.height,(double) geometry.x,(double) geometry.y); + CloneString(&draw_info->geometry,text); + draw_info->affine.sx=affine.sx*current.sx+affine.ry*current.rx; + draw_info->affine.rx=affine.rx*current.sx+affine.sy*current.rx; + draw_info->affine.ry=affine.sx*current.ry+affine.ry*current.sy; + draw_info->affine.sy=affine.rx*current.ry+affine.sy*current.sy; + draw_info->affine.tx=affine.sx*current.tx+affine.ry*current.ty+ + affine.tx; + draw_info->affine.ty=affine.rx*current.tx+affine.sy*current.ty+ + affine.ty; + (void) DrawImage(msl_info->image[n],draw_info); + draw_info=DestroyDrawInfo(draw_info); + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'E': + case 'e': + { + if (LocaleCompare((const char *) tag,"edge") == 0) + { + Image + *edge_image; + + /* + Edge image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"radius") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + edge_image=EdgeImage(msl_info->image[n],geometry_info.rho, + &msl_info->image[n]->exception); + if (edge_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=edge_image; + break; + } + if (LocaleCompare((const char *) tag,"emboss") == 0) + { + Image + *emboss_image; + + /* + Emboss image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"radius") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"sigma") == 0) + { + geometry_info.sigma=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + emboss_image=EmbossImage(msl_info->image[n],geometry_info.rho, + geometry_info.sigma,&msl_info->image[n]->exception); + if (emboss_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=emboss_image; + break; + } + if (LocaleCompare((const char *) tag,"enhance") == 0) + { + Image + *enhance_image; + + /* + Enhance image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + } + enhance_image=EnhanceImage(msl_info->image[n], + &msl_info->image[n]->exception); + if (enhance_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=enhance_image; + break; + } + if (LocaleCompare((const char *) tag,"equalize") == 0) + { + /* + Equalize image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) EqualizeImage(msl_info->image[n]); + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'F': + case 'f': + { + if (LocaleCompare((const char *) tag, "flatten") == 0) + { + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + + /* no attributes here */ + + /* process the image */ + { + Image + *newImage; + + newImage=MergeImageLayers(msl_info->image[n],FlattenLayer, + &msl_info->image[n]->exception); + if (newImage == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=newImage; + break; + } + } + if (LocaleCompare((const char *) tag,"flip") == 0) + { + Image + *flip_image; + + /* + Flip image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + } + flip_image=FlipImage(msl_info->image[n], + &msl_info->image[n]->exception); + if (flip_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=flip_image; + break; + } + if (LocaleCompare((const char *) tag,"flop") == 0) + { + Image + *flop_image; + + /* + Flop image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + } + flop_image=FlopImage(msl_info->image[n], + &msl_info->image[n]->exception); + if (flop_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=flop_image; + break; + } + if (LocaleCompare((const char *) tag,"frame") == 0) + { + FrameInfo + frame_info; + + Image + *frame_image; + + /* + Frame image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + (void) memset(&frame_info,0,sizeof(frame_info)); + SetGeometry(msl_info->image[n],&geometry); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"compose") == 0) + { + option=ParseCommandOption(MagickComposeOptions, + MagickFalse,value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedComposeType", + value); + msl_info->image[n]->compose=(CompositeOperator) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword, "fill") == 0) + { + (void) QueryColorDatabase(value, + &msl_info->image[n]->matte_color,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + frame_info.width=geometry.width; + frame_info.height=geometry.height; + frame_info.outer_bevel=geometry.x; + frame_info.inner_bevel=geometry.y; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + frame_info.height=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(keyword,"inner") == 0) + { + frame_info.inner_bevel=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(keyword,"outer") == 0) + { + frame_info.outer_bevel=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + frame_info.width=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + frame_info.x=(ssize_t) frame_info.width; + frame_info.y=(ssize_t) frame_info.height; + frame_info.width=msl_info->image[n]->columns+2*frame_info.x; + frame_info.height=msl_info->image[n]->rows+2*frame_info.y; + frame_image=FrameImage(msl_info->image[n],&frame_info, + &msl_info->image[n]->exception); + if (frame_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=frame_image; + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'G': + case 'g': + { + if (LocaleCompare((const char *) tag,"gamma") == 0) + { + char + gamma[MaxTextExtent]; + + MagickPixelPacket + pixel; + + /* + Gamma image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + channel=UndefinedChannel; + pixel.red=0.0; + pixel.green=0.0; + pixel.blue=0.0; + *gamma='\0'; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'B': + case 'b': + { + if (LocaleCompare(keyword,"blue") == 0) + { + pixel.blue=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"channel") == 0) + { + option=ParseChannelOption(value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedChannelType", + value); + channel=(ChannelType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"gamma") == 0) + { + (void) CopyMagickString(gamma,value,MaxTextExtent); + break; + } + if (LocaleCompare(keyword,"green") == 0) + { + pixel.green=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"red") == 0) + { + pixel.red=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + if (*gamma == '\0') + (void) FormatLocaleString(gamma,MaxTextExtent,"%g,%g,%g", + (double) pixel.red,(double) pixel.green,(double) pixel.blue); + switch (channel) + { + default: + { + (void) GammaImage(msl_info->image[n],gamma); + break; + } + case RedChannel: + { + (void) GammaImageChannel(msl_info->image[n],RedChannel,pixel.red); + break; + } + case GreenChannel: + { + (void) GammaImageChannel(msl_info->image[n],GreenChannel, + pixel.green); + break; + } + case BlueChannel: + { + (void) GammaImageChannel(msl_info->image[n],BlueChannel, + pixel.blue); + break; + } + } + break; + } + else if (LocaleCompare((const char *) tag,"get") == 0) + { + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + CloneString(&value,(const char *) attributes[i]); + (void) CopyMagickString(key,value,MaxTextExtent); + switch (*keyword) + { + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + (void) FormatLocaleString(value,MaxTextExtent,"%.20g", + (double) msl_info->image[n]->rows); + (void) SetImageProperty(msl_info->attributes[n],key,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + (void) FormatLocaleString(value,MaxTextExtent,"%.20g", + (double) msl_info->image[n]->columns); + (void) SetImageProperty(msl_info->attributes[n],key,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + break; + } + else if (LocaleCompare((const char *) tag, "group") == 0) + { + msl_info->number_groups++; + msl_info->group_info=(MSLGroupInfo *) ResizeQuantumMemory( + msl_info->group_info,msl_info->number_groups+1UL, + sizeof(*msl_info->group_info)); + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'I': + case 'i': + { + if (LocaleCompare((const char *) tag,"image") == 0) + { + MSLPushImage(msl_info,(Image *) NULL); + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"color") == 0) + { + Image + *next_image; + + (void) CopyMagickString(msl_info->image_info[n]->filename, + "xc:",MaxTextExtent); + (void) ConcatenateMagickString(msl_info->image_info[n]-> + filename,value,MaxTextExtent); + next_image=ReadImage(msl_info->image_info[n],exception); + CatchException(exception); + if (next_image == (Image *) NULL) + continue; + if (msl_info->image[n] == (Image *) NULL) + msl_info->image[n]=next_image; + else + { + Image + *p; + + /* + Link image into image list. + */ + p=msl_info->image[n]; + while (p->next != (Image *) NULL) + p=GetNextImageInList(p); + next_image->previous=p; + p->next=next_image; + } + break; + } + (void) SetMSLAttributes(msl_info,keyword,value); + break; + } + default: + { + (void) SetMSLAttributes(msl_info,keyword,value); + break; + } + } + } + break; + } + if (LocaleCompare((const char *) tag,"implode") == 0) + { + Image + *implode_image; + + /* + Implode image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'A': + case 'a': + { + if (LocaleCompare(keyword,"amount") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + implode_image=ImplodeImage(msl_info->image[n],geometry_info.rho, + &msl_info->image[n]->exception); + if (implode_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=implode_image; + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'L': + case 'l': + { + if (LocaleCompare((const char *) tag,"label") == 0) + break; + if (LocaleCompare((const char *) tag, "level") == 0) + { + double + levelBlack = 0, levelGamma = 1, levelWhite = QuantumRange; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + CloneString(&value,(const char *) attributes[i]); + (void) CopyMagickString(key,value,MaxTextExtent); + switch (*keyword) + { + case 'B': + case 'b': + { + if (LocaleCompare(keyword,"black") == 0) + { + levelBlack = StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"gamma") == 0) + { + levelGamma = StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"white") == 0) + { + levelWhite = StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + + /* process image */ + { + char level[MaxTextExtent + 1]; + (void) FormatLocaleString(level,MaxTextExtent,"%3.6f/%3.6f/%3.6f/", + levelBlack,levelGamma,levelWhite); + LevelImage ( msl_info->image[n], level ); + break; + } + } + } + case 'M': + case 'm': + { + if (LocaleCompare((const char *) tag,"magnify") == 0) + { + Image + *magnify_image; + + /* + Magnify image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + } + magnify_image=MagnifyImage(msl_info->image[n], + &msl_info->image[n]->exception); + if (magnify_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=magnify_image; + break; + } + if (LocaleCompare((const char *) tag,"map") == 0) + { + Image + *affinity_image; + + MagickBooleanType + dither; + + QuantizeInfo + *quantize_info; + + /* + Map image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + affinity_image=NewImageList(); + dither=MagickFalse; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"dither") == 0) + { + option=ParseCommandOption(MagickBooleanOptions, + MagickFalse,value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedBooleanType", + value); + dither=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(keyword,"image") == 0) + for (j=0; j < msl_info->n; j++) + { + const char + *attribute; + + attribute=GetImageProperty(msl_info->attributes[j],"id"); + if ((attribute != (const char *) NULL) && + (LocaleCompare(attribute,value) == 0)) + { + affinity_image=CloneImage(msl_info->image[j],0,0, + MagickFalse,exception); + break; + } + } + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + quantize_info=AcquireQuantizeInfo(msl_info->image_info[n]); + quantize_info->dither=dither; + (void) RemapImages(quantize_info,msl_info->image[n], + affinity_image); + quantize_info=DestroyQuantizeInfo(quantize_info); + affinity_image=DestroyImage(affinity_image); + break; + } + if (LocaleCompare((const char *) tag,"matte-floodfill") == 0) + { + double + opacity; + + MagickPixelPacket + target; + + PaintMethod + paint_method; + + /* + Matte floodfill image. + */ + opacity=0.0; + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + SetGeometry(msl_info->image[n],&geometry); + paint_method=FloodfillMethod; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'B': + case 'b': + { + if (LocaleCompare(keyword,"bordercolor") == 0) + { + (void) QueryMagickColor(value,&target,exception); + paint_method=FillToBorderMethod; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"fuzz") == 0) + { + msl_info->image[n]->fuzz=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + (void) GetOneVirtualMagickPixel(msl_info->image[n], + geometry.x,geometry.y,&target,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(keyword,"opacity") == 0) + { + opacity=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry.x=StringToLong(value); + (void) GetOneVirtualMagickPixel(msl_info->image[n], + geometry.x,geometry.y,&target,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry.y=StringToLong(value); + (void) GetOneVirtualMagickPixel(msl_info->image[n], + geometry.x,geometry.y,&target,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + draw_info=CloneDrawInfo(msl_info->image_info[n], + msl_info->draw_info[n]); + draw_info->fill.opacity=ClampToQuantum(opacity); + (void) FloodfillPaintImage(msl_info->image[n],OpacityChannel, + draw_info,&target,geometry.x,geometry.y, + paint_method == FloodfillMethod ? MagickFalse : MagickTrue); + draw_info=DestroyDrawInfo(draw_info); + break; + } + if (LocaleCompare((const char *) tag,"median-filter") == 0) + { + Image + *median_image; + + /* + Median-filter image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"radius") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + median_image=StatisticImage(msl_info->image[n],MedianStatistic, + (size_t) geometry_info.rho,(size_t) geometry_info.sigma, + &msl_info->image[n]->exception); + if (median_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=median_image; + break; + } + if (LocaleCompare((const char *) tag,"minify") == 0) + { + Image + *minify_image; + + /* + Minify image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + } + minify_image=MinifyImage(msl_info->image[n], + &msl_info->image[n]->exception); + if (minify_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=minify_image; + break; + } + if (LocaleCompare((const char *) tag,"msl") == 0 ) + break; + if (LocaleCompare((const char *) tag,"modulate") == 0) + { + char + modulate[MaxTextExtent]; + + /* + Modulate image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + geometry_info.rho=100.0; + geometry_info.sigma=100.0; + geometry_info.xi=100.0; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'B': + case 'b': + { + if (LocaleCompare(keyword,"blackness") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + if (LocaleCompare(keyword,"brightness") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"factor") == 0) + { + flags=ParseGeometry(value,&geometry_info); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"hue") == 0) + { + geometry_info.xi=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'L': + case 'l': + { + if (LocaleCompare(keyword,"lightness") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"saturation") == 0) + { + geometry_info.sigma=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"whiteness") == 0) + { + geometry_info.sigma=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) FormatLocaleString(modulate,MaxTextExtent,"%g,%g,%g", + geometry_info.rho,geometry_info.sigma,geometry_info.xi); + (void) ModulateImage(msl_info->image[n],modulate); + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'N': + case 'n': + { + if (LocaleCompare((const char *) tag,"negate") == 0) + { + MagickBooleanType + gray; + + /* + Negate image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + gray=MagickFalse; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"channel") == 0) + { + option=ParseChannelOption(value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedChannelType", + value); + channel=(ChannelType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"gray") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedBooleanType", + value); + gray=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) NegateImageChannel(msl_info->image[n],channel,gray); + break; + } + if (LocaleCompare((const char *) tag,"normalize") == 0) + { + /* + Normalize image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"channel") == 0) + { + option=ParseChannelOption(value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedChannelType", + value); + channel=(ChannelType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) NormalizeImageChannel(msl_info->image[n],channel); + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'O': + case 'o': + { + if (LocaleCompare((const char *) tag,"oil-paint") == 0) + { + Image + *paint_image; + + /* + Oil-paint image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"radius") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + paint_image=OilPaintImage(msl_info->image[n],geometry_info.rho, + &msl_info->image[n]->exception); + if (paint_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=paint_image; + break; + } + if (LocaleCompare((const char *) tag,"opaque") == 0) + { + MagickPixelPacket + fill_color, + target; + + /* + Opaque image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + (void) QueryMagickColor("none",&target,exception); + (void) QueryMagickColor("none",&fill_color,exception); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"channel") == 0) + { + option=ParseChannelOption(value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedChannelType", + value); + channel=(ChannelType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"fill") == 0) + { + (void) QueryMagickColor(value,&fill_color,exception); + break; + } + if (LocaleCompare(keyword,"fuzz") == 0) + { + msl_info->image[n]->fuzz=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) OpaquePaintImageChannel(msl_info->image[n],channel, + &target,&fill_color,MagickFalse); + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'P': + case 'p': + { + if (LocaleCompare((const char *) tag,"print") == 0) + { + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'O': + case 'o': + { + if (LocaleCompare(keyword,"output") == 0) + { + (void) FormatLocaleFile(stdout,"%s",value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + break; + } + if (LocaleCompare((const char *) tag, "profile") == 0) + { + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + const char + *name; + + const StringInfo + *profile; + + Image + *profile_image; + + ImageInfo + *profile_info; + + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + if (*keyword == '!') + { + /* + Remove a profile from the image. + */ + (void) ProfileImage(msl_info->image[n],keyword, + (const unsigned char *) NULL,0,MagickTrue); + continue; + } + /* + Associate a profile with the image. + */ + profile_info=CloneImageInfo(msl_info->image_info[n]); + profile=GetImageProfile(msl_info->image[n],"iptc"); + if (profile != (StringInfo *) NULL) + profile_info->profile=(void *) CloneStringInfo(profile); + profile_image=GetImageCache(profile_info,keyword,exception); + profile_info=DestroyImageInfo(profile_info); + if (profile_image == (Image *) NULL) + { + char + name[MaxTextExtent], + filename[MaxTextExtent]; + + char + *p; + + StringInfo + *profile; + + (void) CopyMagickString(filename,keyword,MaxTextExtent); + (void) CopyMagickString(name,keyword,MaxTextExtent); + for (p=filename; *p != '\0'; p++) + if ((*p == ':') && (IsPathDirectory(keyword) < 0) && + (IsPathAccessible(keyword) == MagickFalse)) + { + char + *q; + + /* + Look for profile name (e.g. name:profile). + */ + (void) CopyMagickString(name,filename,(size_t) + (p-filename+1)); + for (q=filename; *q != '\0'; q++) + *q=(*++p); + break; + } + profile=FileToStringInfo(filename,~0UL,exception); + if (profile != (StringInfo *) NULL) + { + (void) ProfileImage(msl_info->image[n],name, + GetStringInfoDatum(profile),(size_t) + GetStringInfoLength(profile),MagickFalse); + profile=DestroyStringInfo(profile); + } + continue; + } + ResetImageProfileIterator(profile_image); + name=GetNextImageProfile(profile_image); + while (name != (const char *) NULL) + { + profile=GetImageProfile(profile_image,name); + if (profile != (StringInfo *) NULL) + (void) ProfileImage(msl_info->image[n],name, + GetStringInfoDatum(profile),(size_t) + GetStringInfoLength(profile),MagickFalse); + name=GetNextImageProfile(profile_image); + } + profile_image=DestroyImage(profile_image); + } + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'Q': + case 'q': + { + if (LocaleCompare((const char *) tag,"quantize") == 0) + { + QuantizeInfo + quantize_info; + + /* + Quantize image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + GetQuantizeInfo(&quantize_info); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"colors") == 0) + { + quantize_info.number_colors=StringToLong(value); + break; + } + if (LocaleCompare(keyword,"colorspace") == 0) + { + option=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,value); + if (option < 0) + ThrowMSLException(OptionError, + "UnrecognizedColorspaceType",value); + quantize_info.colorspace=(ColorspaceType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"dither") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedBooleanType", + value); + quantize_info.dither=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(keyword,"measure") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedBooleanType", + value); + quantize_info.measure_error=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(keyword,"treedepth") == 0) + { + quantize_info.tree_depth=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) QuantizeImage(&quantize_info,msl_info->image[n]); + break; + } + if (LocaleCompare((const char *) tag,"query-font-metrics") == 0) + { + char + text[MaxTextExtent]; + + MagickBooleanType + status; + + TypeMetric + metrics; + + /* + Query font metrics. + */ + draw_info=CloneDrawInfo(msl_info->image_info[n], + msl_info->draw_info[n]); + angle=0.0; + current=draw_info->affine; + GetAffineMatrix(&affine); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'A': + case 'a': + { + if (LocaleCompare(keyword,"affine") == 0) + { + char + *p; + + p=value; + draw_info->affine.sx=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.rx=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.ry=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.sy=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.tx=StringToDouble(p,&p); + if (*p ==',') + p++; + draw_info->affine.ty=StringToDouble(p,&p); + break; + } + if (LocaleCompare(keyword,"align") == 0) + { + option=ParseCommandOption(MagickAlignOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedAlignType", + value); + draw_info->align=(AlignType) option; + break; + } + if (LocaleCompare(keyword,"antialias") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedBooleanType", + value); + draw_info->stroke_antialias=(MagickBooleanType) option; + draw_info->text_antialias=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"density") == 0) + { + CloneString(&draw_info->density,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(keyword,"encoding") == 0) + { + CloneString(&draw_info->encoding,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword, "fill") == 0) + { + (void) QueryColorDatabase(value,&draw_info->fill, + exception); + break; + } + if (LocaleCompare(keyword,"family") == 0) + { + CloneString(&draw_info->family,value); + break; + } + if (LocaleCompare(keyword,"font") == 0) + { + CloneString(&draw_info->font,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + break; + } + if (LocaleCompare(keyword,"gravity") == 0) + { + option=ParseCommandOption(MagickGravityOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedGravityType", + value); + draw_info->gravity=(GravityType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(keyword,"pointsize") == 0) + { + draw_info->pointsize=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"rotate") == 0) + { + angle=StringToDouble(value,(char **) NULL); + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"scale") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + affine.sx=geometry_info.rho; + affine.sy=geometry_info.sigma; + break; + } + if (LocaleCompare(keyword,"skewX") == 0) + { + angle=StringToDouble(value,(char **) NULL); + affine.ry=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + if (LocaleCompare(keyword,"skewY") == 0) + { + angle=StringToDouble(value,(char **) NULL); + affine.rx=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + if (LocaleCompare(keyword,"stretch") == 0) + { + option=ParseCommandOption(MagickStretchOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedStretchType", + value); + draw_info->stretch=(StretchType) option; + break; + } + if (LocaleCompare(keyword, "stroke") == 0) + { + (void) QueryColorDatabase(value,&draw_info->stroke, + exception); + break; + } + if (LocaleCompare(keyword,"strokewidth") == 0) + { + draw_info->stroke_width=StringToLong(value); + break; + } + if (LocaleCompare(keyword,"style") == 0) + { + option=ParseCommandOption(MagickStyleOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedStyleType", + value); + draw_info->style=(StyleType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(keyword,"text") == 0) + { + CloneString(&draw_info->text,value); + break; + } + if (LocaleCompare(keyword,"translate") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + affine.tx=geometry_info.rho; + affine.ty=geometry_info.sigma; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'U': + case 'u': + { + if (LocaleCompare(keyword, "undercolor") == 0) + { + (void) QueryColorDatabase(value,&draw_info->undercolor, + exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"weight") == 0) + { + draw_info->weight=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry.x=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry.y=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) FormatLocaleString(text,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) geometry.width,(double) + geometry.height,(double) geometry.x,(double) geometry.y); + CloneString(&draw_info->geometry,text); + draw_info->affine.sx=affine.sx*current.sx+affine.ry*current.rx; + draw_info->affine.rx=affine.rx*current.sx+affine.sy*current.rx; + draw_info->affine.ry=affine.sx*current.ry+affine.ry*current.sy; + draw_info->affine.sy=affine.rx*current.ry+affine.sy*current.sy; + draw_info->affine.tx=affine.sx*current.tx+affine.ry*current.ty+ + affine.tx; + draw_info->affine.ty=affine.rx*current.tx+affine.sy*current.ty+ + affine.ty; + status=GetTypeMetrics(msl_info->attributes[n],draw_info,&metrics); + if (status != MagickFalse) + { + Image + *image; + + image=msl_info->attributes[n]; + FormatImageProperty(image,"msl:font-metrics.pixels_per_em.x", + "%g",metrics.pixels_per_em.x); + FormatImageProperty(image,"msl:font-metrics.pixels_per_em.y", + "%g",metrics.pixels_per_em.y); + FormatImageProperty(image,"msl:font-metrics.ascent","%g", + metrics.ascent); + FormatImageProperty(image,"msl:font-metrics.descent","%g", + metrics.descent); + FormatImageProperty(image,"msl:font-metrics.width","%g", + metrics.width); + FormatImageProperty(image,"msl:font-metrics.height","%g", + metrics.height); + FormatImageProperty(image,"msl:font-metrics.max_advance","%g", + metrics.max_advance); + FormatImageProperty(image,"msl:font-metrics.bounds.x1","%g", + metrics.bounds.x1); + FormatImageProperty(image,"msl:font-metrics.bounds.y1","%g", + metrics.bounds.y1); + FormatImageProperty(image,"msl:font-metrics.bounds.x2","%g", + metrics.bounds.x2); + FormatImageProperty(image,"msl:font-metrics.bounds.y2","%g", + metrics.bounds.y2); + FormatImageProperty(image,"msl:font-metrics.origin.x","%g", + metrics.origin.x); + FormatImageProperty(image,"msl:font-metrics.origin.y","%g", + metrics.origin.y); + } + draw_info=DestroyDrawInfo(draw_info); + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'R': + case 'r': + { + if (LocaleCompare((const char *) tag,"raise") == 0) + { + MagickBooleanType + raise; + + /* + Raise image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + raise=MagickFalse; + SetGeometry(msl_info->image[n],&geometry); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + geometry.height=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"raise") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedNoiseType", + value); + raise=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + geometry.width=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) RaiseImage(msl_info->image[n],&geometry,raise); + break; + } + if (LocaleCompare((const char *) tag,"read") == 0) + { + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"filename") == 0) + { + Image + *image; + + if (value == (char *) NULL) + break; + (void) CopyMagickString(msl_info->image_info[n]->filename, + value,MaxTextExtent); + image=ReadImage(msl_info->image_info[n],exception); + CatchException(exception); + if (image == (Image *) NULL) + continue; + AppendImageToList(&msl_info->image[n],image); + break; + } + (void) SetMSLAttributes(msl_info,keyword,value); + break; + } + default: + { + (void) SetMSLAttributes(msl_info,keyword,value); + break; + } + } + } + break; + } + if (LocaleCompare((const char *) tag,"reduce-noise") == 0) + { + Image + *paint_image; + + /* + Reduce-noise image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"radius") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + paint_image=StatisticImage(msl_info->image[n],NonpeakStatistic, + (size_t) geometry_info.rho,(size_t) geometry_info.sigma, + &msl_info->image[n]->exception); + if (paint_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=paint_image; + break; + } + else if (LocaleCompare((const char *) tag,"repage") == 0) + { + /* init the values */ + width=msl_info->image[n]->page.width; + height=msl_info->image[n]->page.height; + x=msl_info->image[n]->page.x; + y=msl_info->image[n]->page.y; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + int + flags; + + RectangleInfo + geometry; + + flags=ParseAbsoluteGeometry(value,&geometry); + if ((flags & WidthValue) != 0) + { + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + width=geometry.width; + height=geometry.height; + } + if ((flags & AspectValue) != 0) + { + if ((flags & XValue) != 0) + x+=geometry.x; + if ((flags & YValue) != 0) + y+=geometry.y; + } + else + { + if ((flags & XValue) != 0) + { + x=geometry.x; + if ((width == 0) && (geometry.x > 0)) + width=msl_info->image[n]->columns+geometry.x; + } + if ((flags & YValue) != 0) + { + y=geometry.y; + if ((height == 0) && (geometry.y > 0)) + height=msl_info->image[n]->rows+geometry.y; + } + } + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + height = StringToLong( value ); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + width = StringToLong( value ); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + x = StringToLong( value ); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + y = StringToLong( value ); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + + msl_info->image[n]->page.width=width; + msl_info->image[n]->page.height=height; + msl_info->image[n]->page.x=x; + msl_info->image[n]->page.y=y; + break; + } + else if (LocaleCompare((const char *) tag,"resample") == 0) + { + double + x_resolution, + y_resolution; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + x_resolution=DefaultResolution; + y_resolution=DefaultResolution; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'b': + { + if (LocaleCompare(keyword,"blur") == 0) + { + msl_info->image[n]->blur=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + ssize_t + flags; + + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma*=geometry_info.rho; + x_resolution=geometry_info.rho; + y_resolution=geometry_info.sigma; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x-resolution") == 0) + { + x_resolution=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y-resolution") == 0) + { + y_resolution=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + /* + Resample image. + */ + { + double + factor; + + Image + *resample_image; + + factor=1.0; + if (msl_info->image[n]->units == PixelsPerCentimeterResolution) + factor=2.54; + width=(size_t) (x_resolution*msl_info->image[n]->columns/ + (factor*(msl_info->image[n]->x_resolution == 0.0 ? DefaultResolution : + msl_info->image[n]->x_resolution))+0.5); + height=(size_t) (y_resolution*msl_info->image[n]->rows/ + (factor*(msl_info->image[n]->y_resolution == 0.0 ? DefaultResolution : + msl_info->image[n]->y_resolution))+0.5); + resample_image=ResizeImage(msl_info->image[n],width,height, + msl_info->image[n]->filter,msl_info->image[n]->blur, + &msl_info->image[n]->exception); + if (resample_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=resample_image; + } + break; + } + if (LocaleCompare((const char *) tag,"resize") == 0) + { + double + blur; + + FilterTypes + filter; + + Image + *resize_image; + + /* + Resize image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + filter=UndefinedFilter; + blur=1.0; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"filter") == 0) + { + option=ParseCommandOption(MagickFilterOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedNoiseType", + value); + filter=(FilterTypes) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseRegionGeometry(msl_info->image[n],value, + &geometry,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + geometry.height=StringToUnsignedLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"support") == 0) + { + blur=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + geometry.width=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + resize_image=ResizeImage(msl_info->image[n],geometry.width, + geometry.height,filter,blur,&msl_info->image[n]->exception); + if (resize_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=resize_image; + break; + } + if (LocaleCompare((const char *) tag,"roll") == 0) + { + Image + *roll_image; + + /* + Roll image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + SetGeometry(msl_info->image[n],&geometry); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParsePageGeometry(msl_info->image[n],value, + &geometry,exception); + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry.x=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry.y=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + roll_image=RollImage(msl_info->image[n],geometry.x,geometry.y, + &msl_info->image[n]->exception); + if (roll_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=roll_image; + break; + } + else if (LocaleCompare((const char *) tag,"roll") == 0) + { + /* init the values */ + width=msl_info->image[n]->columns; + height=msl_info->image[n]->rows; + x = y = 0; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + (void) ParseMetaGeometry(value,&x,&y,&width,&height); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + x = StringToLong( value ); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + y = StringToLong( value ); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + + /* + process image. + */ + { + Image + *newImage; + + newImage=RollImage(msl_info->image[n], x, y, &msl_info->image[n]->exception); + if (newImage == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=newImage; + } + + break; + } + if (LocaleCompare((const char *) tag,"rotate") == 0) + { + Image + *rotate_image; + + /* + Rotate image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"degrees") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + rotate_image=RotateImage(msl_info->image[n],geometry_info.rho, + &msl_info->image[n]->exception); + if (rotate_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=rotate_image; + break; + } + else if (LocaleCompare((const char *) tag,"rotate") == 0) + { + /* init the values */ + double degrees = 0; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"degrees") == 0) + { + degrees = StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + + /* + process image. + */ + { + Image + *newImage; + + newImage=RotateImage(msl_info->image[n], degrees, &msl_info->image[n]->exception); + if (newImage == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=newImage; + } + + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'S': + case 's': + { + if (LocaleCompare((const char *) tag,"sample") == 0) + { + Image + *sample_image; + + /* + Sample image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseRegionGeometry(msl_info->image[n],value, + &geometry,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + geometry.height=StringToUnsignedLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + geometry.width=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + sample_image=SampleImage(msl_info->image[n],geometry.width, + geometry.height,&msl_info->image[n]->exception); + if (sample_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=sample_image; + break; + } + if (LocaleCompare((const char *) tag,"scale") == 0) + { + Image + *scale_image; + + /* + Scale image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseRegionGeometry(msl_info->image[n],value, + &geometry,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + geometry.height=StringToUnsignedLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + geometry.width=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + scale_image=ScaleImage(msl_info->image[n],geometry.width, + geometry.height,&msl_info->image[n]->exception); + if (scale_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=scale_image; + break; + } + if (LocaleCompare((const char *) tag,"segment") == 0) + { + ColorspaceType + colorspace; + + MagickBooleanType + verbose; + + /* + Segment image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + geometry_info.rho=1.0; + geometry_info.sigma=1.5; + colorspace=sRGBColorspace; + verbose=MagickFalse; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"cluster-threshold") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + if (LocaleCompare(keyword,"colorspace") == 0) + { + option=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,value); + if (option < 0) + ThrowMSLException(OptionError, + "UnrecognizedColorspaceType",value); + colorspace=(ColorspaceType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.5; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"smoothing-threshold") == 0) + { + geometry_info.sigma=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) SegmentImage(msl_info->image[n],colorspace,verbose, + geometry_info.rho,geometry_info.sigma); + break; + } + else if (LocaleCompare((const char *) tag, "set") == 0) + { + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined",(const char *) tag); + break; + } + + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + if (msl_info->attributes[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined",keyword); + break; + } + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"clip-mask") == 0) + { + for (j=0; j < msl_info->n; j++) + { + const char + *property; + + property=GetImageProperty(msl_info->attributes[j],"id"); + if (LocaleCompare(property,value) == 0) + { + SetImageMask(msl_info->image[n],msl_info->image[j]); + break; + } + } + break; + } + if (LocaleCompare(keyword,"clip-path") == 0) + { + for (j=0; j < msl_info->n; j++) + { + const char + *property; + + property=GetImageProperty(msl_info->attributes[j],"id"); + if (LocaleCompare(property,value) == 0) + { + SetImageClipMask(msl_info->image[n],msl_info->image[j]); + break; + } + } + break; + } + if (LocaleCompare(keyword,"colorspace") == 0) + { + ssize_t + colorspace; + + colorspace=(ColorspaceType) ParseCommandOption( + MagickColorspaceOptions,MagickFalse,value); + if (colorspace < 0) + ThrowMSLException(OptionError,"UnrecognizedColorspace", + value); + (void) TransformImageColorspace(msl_info->image[n], + (ColorspaceType) colorspace); + break; + } + (void) SetMSLAttributes(msl_info,keyword,value); + (void) SetImageProperty(msl_info->image[n],keyword,value); + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"density") == 0) + { + flags=ParseGeometry(value,&geometry_info); + msl_info->image[n]->x_resolution=geometry_info.rho; + msl_info->image[n]->y_resolution=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + msl_info->image[n]->y_resolution= + msl_info->image[n]->x_resolution; + break; + } + (void) SetMSLAttributes(msl_info,keyword,value); + (void) SetImageProperty(msl_info->image[n],keyword,value); + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(keyword, "opacity") == 0) + { + Quantum opac = OpaqueOpacity; + ssize_t len = (ssize_t) strlen( value ); + + if (value[len-1] == '%') { + char tmp[100]; + (void) CopyMagickString(tmp,value,len); + opac = StringToLong( tmp ); + opac = (int)(QuantumRange * ((float)opac/100)); + } else + opac = StringToLong( value ); + (void) SetImageOpacity( msl_info->image[n], (Quantum) opac ); + break; + } + (void) SetMSLAttributes(msl_info,keyword,value); + (void) SetImageProperty(msl_info->image[n],keyword,value); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(keyword, "page") == 0) + { + char + page[MaxTextExtent]; + + const char + *image_option; + + MagickStatusType + flags; + + RectangleInfo + geometry; + + (void) memset(&geometry,0,sizeof(geometry)); + image_option=GetImageArtifact(msl_info->image[n],"page"); + if (image_option != (const char *) NULL) + flags=ParseAbsoluteGeometry(image_option,&geometry); + flags=ParseAbsoluteGeometry(value,&geometry); + (void) FormatLocaleString(page,MaxTextExtent,"%.20gx%.20g", + (double) geometry.width,(double) geometry.height); + if (((flags & XValue) != 0) || ((flags & YValue) != 0)) + (void) FormatLocaleString(page,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) geometry.width, + (double) geometry.height,(double) geometry.x,(double) + geometry.y); + (void) SetImageOption(msl_info->image_info[n],keyword,page); + msl_info->image_info[n]->page=GetPageGeometry(page); + break; + } + (void) SetMSLAttributes(msl_info,keyword,value); + (void) SetImageProperty(msl_info->image[n],keyword,value); + break; + } + default: + { + (void) SetMSLAttributes(msl_info,keyword,value); + (void) SetImageProperty(msl_info->image[n],keyword,value); + break; + } + } + } + break; + } + if (LocaleCompare((const char *) tag,"shade") == 0) + { + Image + *shade_image; + + MagickBooleanType + gray; + + /* + Shade image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + gray=MagickFalse; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'A': + case 'a': + { + if (LocaleCompare(keyword,"azimuth") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(keyword,"elevation") == 0) + { + geometry_info.sigma=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + if (LocaleCompare(keyword,"gray") == 0) + { + option=ParseCommandOption(MagickBooleanOptions,MagickFalse, + value); + if (option < 0) + ThrowMSLException(OptionError,"UnrecognizedNoiseType", + value); + gray=(MagickBooleanType) option; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + shade_image=ShadeImage(msl_info->image[n],gray,geometry_info.rho, + geometry_info.sigma,&msl_info->image[n]->exception); + if (shade_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=shade_image; + break; + } + if (LocaleCompare((const char *) tag,"shadow") == 0) + { + Image + *shadow_image; + + /* + Shear image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(keyword,"opacity") == 0) + { + geometry_info.rho=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"sigma") == 0) + { + geometry_info.sigma=StringToLong(value); + break; + } + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry_info.xi=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry_info.psi=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + shadow_image=ShadowImage(msl_info->image[n],geometry_info.rho, + geometry_info.sigma,(ssize_t) ceil(geometry_info.xi-0.5),(ssize_t) + ceil(geometry_info.psi-0.5),&msl_info->image[n]->exception); + if (shadow_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=shadow_image; + break; + } + if (LocaleCompare((const char *) tag,"sharpen") == 0) + { + double radius = 0.0, + sigma = 1.0; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + /* + NOTE: sharpen can have no attributes, since we use all the defaults! + */ + if (attributes != (const xmlChar **) NULL) + { + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'R': + case 'r': + { + if (LocaleCompare(keyword, "radius") == 0) + { + radius = StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"sigma") == 0) + { + sigma = StringToLong( value ); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + } + + /* + sharpen image. + */ + { + Image + *newImage; + + newImage=SharpenImage(msl_info->image[n],radius,sigma,&msl_info->image[n]->exception); + if (newImage == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=newImage; + break; + } + } + else if (LocaleCompare((const char *) tag,"shave") == 0) + { + /* init the values */ + width = height = 0; + x = y = 0; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + (void) ParseMetaGeometry(value,&x,&y,&width,&height); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + height = StringToLong( value ); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + width = StringToLong( value ); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + + /* + process image. + */ + { + Image + *newImage; + RectangleInfo + rectInfo; + + rectInfo.height = height; + rectInfo.width = width; + rectInfo.x = x; + rectInfo.y = y; + + + newImage=ShaveImage(msl_info->image[n], &rectInfo, + &msl_info->image[n]->exception); + if (newImage == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=newImage; + } + + break; + } + if (LocaleCompare((const char *) tag,"shear") == 0) + { + Image + *shear_image; + + /* + Shear image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'F': + case 'f': + { + if (LocaleCompare(keyword, "fill") == 0) + { + (void) QueryColorDatabase(value, + &msl_info->image[n]->background_color,exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + geometry_info.sigma=StringToLong(value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + shear_image=ShearImage(msl_info->image[n],geometry_info.rho, + geometry_info.sigma,&msl_info->image[n]->exception); + if (shear_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=shear_image; + break; + } + if (LocaleCompare((const char *) tag,"signature") == 0) + { + /* + Signature image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) SignatureImage(msl_info->image[n]); + break; + } + if (LocaleCompare((const char *) tag,"solarize") == 0) + { + /* + Solarize image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + geometry_info.rho=QuantumRange/2.0; + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(keyword,"threshold") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) SolarizeImage(msl_info->image[n],geometry_info.rho); + break; + } + if (LocaleCompare((const char *) tag,"spread") == 0) + { + Image + *spread_image; + + /* + Spread image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"radius") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + spread_image=SpreadImage(msl_info->image[n],geometry_info.rho, + &msl_info->image[n]->exception); + if (spread_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=spread_image; + break; + } + else if (LocaleCompare((const char *) tag,"stegano") == 0) + { + Image * + watermark = (Image*) NULL; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'I': + case 'i': + { + if (LocaleCompare(keyword,"image") == 0) + { + for (j=0; jn;j++) + { + const char * + theAttr = GetImageProperty(msl_info->attributes[j], "id"); + if (theAttr && LocaleCompare(theAttr, value) == 0) + { + watermark = msl_info->image[j]; + break; + } + } + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + + /* + process image. + */ + if ( watermark != (Image*) NULL ) + { + Image + *newImage; + + newImage=SteganoImage(msl_info->image[n], watermark, &msl_info->image[n]->exception); + if (newImage == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=newImage; + break; + } else + ThrowMSLException(OptionError,"MissingWatermarkImage",keyword); + } + else if (LocaleCompare((const char *) tag,"stereo") == 0) + { + Image * + stereoImage = (Image*) NULL; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined",(const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'I': + case 'i': + { + if (LocaleCompare(keyword,"image") == 0) + { + for (j=0; jn;j++) + { + const char * + theAttr = GetImageProperty(msl_info->attributes[j], "id"); + if (theAttr && LocaleCompare(theAttr, value) == 0) + { + stereoImage = msl_info->image[j]; + break; + } + } + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + + /* + process image. + */ + if ( stereoImage != (Image*) NULL ) + { + Image + *newImage; + + newImage=StereoImage(msl_info->image[n], stereoImage, &msl_info->image[n]->exception); + if (newImage == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=newImage; + break; + } else + ThrowMSLException(OptionError,"Missing stereo image",keyword); + } + if (LocaleCompare((const char *) tag,"strip") == 0) + { + /* + Strip image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + } + (void) StripImage(msl_info->image[n]); + break; + } + if (LocaleCompare((const char *) tag,"swap") == 0) + { + Image + *p, + *q, + *swap; + + ssize_t + index, + swap_index; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + index=(-1); + swap_index=(-2); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"indexes") == 0) + { + flags=ParseGeometry(value,&geometry_info); + index=(ssize_t) geometry_info.rho; + if ((flags & SigmaValue) == 0) + swap_index=(ssize_t) geometry_info.sigma; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + /* + Swap images. + */ + p=GetImageFromList(msl_info->image[n],index); + q=GetImageFromList(msl_info->image[n],swap_index); + if ((p == (Image *) NULL) || (q == (Image *) NULL)) + { + ThrowMSLException(OptionError,"NoSuchImage",(const char *) tag); + break; + } + swap=CloneImage(p,0,0,MagickTrue,&p->exception); + ReplaceImageInList(&p,CloneImage(q,0,0,MagickTrue,&q->exception)); + ReplaceImageInList(&q,swap); + msl_info->image[n]=GetFirstImageInList(q); + break; + } + if (LocaleCompare((const char *) tag,"swirl") == 0) + { + Image + *swirl_image; + + /* + Swirl image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"degrees") == 0) + { + geometry_info.rho=StringToDouble(value, + (char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"geometry") == 0) + { + flags=ParseGeometry(value,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + swirl_image=SwirlImage(msl_info->image[n],geometry_info.rho, + &msl_info->image[n]->exception); + if (swirl_image == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=swirl_image; + break; + } + if (LocaleCompare((const char *) tag,"sync") == 0) + { + /* + Sync image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) SyncImage(msl_info->image[n]); + break; + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'T': + case 't': + { + if (LocaleCompare((const char *) tag,"map") == 0) + { + Image + *texture_image; + + /* + Texture image. + */ + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + texture_image=NewImageList(); + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'I': + case 'i': + { + if (LocaleCompare(keyword,"image") == 0) + for (j=0; j < msl_info->n; j++) + { + const char + *attribute; + + attribute=GetImageProperty(msl_info->attributes[j],"id"); + if ((attribute != (const char *) NULL) && + (LocaleCompare(attribute,value) == 0)) + { + texture_image=CloneImage(msl_info->image[j],0,0, + MagickFalse,exception); + break; + } + } + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute", + keyword); + break; + } + } + } + (void) TextureImage(msl_info->image[n],texture_image); + texture_image=DestroyImage(texture_image); + break; + } + else if (LocaleCompare((const char *) tag,"threshold") == 0) + { + /* init the values */ + double threshold = 0; + + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined",(const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'T': + case 't': + { + if (LocaleCompare(keyword,"threshold") == 0) + { + threshold = StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + + /* + process image. + */ + { + BilevelImageChannel(msl_info->image[n], + (ChannelType) ((ssize_t) (CompositeChannels &~ (ssize_t) OpacityChannel)), + threshold); + break; + } + } + else if (LocaleCompare((const char *) tag, "transparent") == 0) + { + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined",(const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"color") == 0) + { + MagickPixelPacket + target; + + (void) QueryMagickColor(value,&target,exception); + (void) TransparentPaintImage(msl_info->image[n],&target, + TransparentOpacity,MagickFalse); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + } + break; + } + else if (LocaleCompare((const char *) tag, "trim") == 0) + { + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined",(const char *) tag); + break; + } + + /* no attributes here */ + + /* process the image */ + { + Image + *newImage; + RectangleInfo + rectInfo; + + /* all zeros on a crop == trim edges! */ + rectInfo.height = rectInfo.width = 0; + rectInfo.x = rectInfo.y = 0; + + newImage=CropImage(msl_info->image[n],&rectInfo, &msl_info->image[n]->exception); + if (newImage == (Image *) NULL) + break; + msl_info->image[n]=DestroyImage(msl_info->image[n]); + msl_info->image[n]=newImage; + break; + } + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + case 'W': + case 'w': + { + if (LocaleCompare((const char *) tag,"write") == 0) + { + if (msl_info->image[n] == (Image *) NULL) + { + ThrowMSLException(OptionError,"NoImagesDefined", + (const char *) tag); + break; + } + if (attributes == (const xmlChar **) NULL) + break; + for (i=0; (attributes[i] != (const xmlChar *) NULL); i++) + { + keyword=(const char *) attributes[i++]; + attribute=InterpretImageProperties(msl_info->image_info[n], + msl_info->attributes[n],(const char *) attributes[i]); + CloneString(&value,attribute); + attribute=DestroyString(attribute); + switch (*keyword) + { + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"filename") == 0) + { + (void) CopyMagickString(msl_info->image[n]->filename,value, + MaxTextExtent); + break; + } + (void) SetMSLAttributes(msl_info,keyword,value); + } + default: + { + (void) SetMSLAttributes(msl_info,keyword,value); + break; + } + } + } + + /* process */ + { + *msl_info->image_info[n]->magick='\0'; + (void) WriteImage(msl_info->image_info[n], msl_info->image[n]); + break; + } + } + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag); + break; + } + } + if (value != (char *) NULL) + value=DestroyString(value); + exception=DestroyExceptionInfo(exception); + (void) LogMagickEvent(CoderEvent,GetMagickModule()," )"); +} + +static void MSLEndElement(void *context,const xmlChar *tag) +{ + ssize_t + n; + + MSLInfo + *msl_info; + + /* + Called when the end of an element has been detected. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.endElement(%s)", + tag); + msl_info=(MSLInfo *) context; + n=msl_info->n; + switch (*tag) + { + case 'C': + case 'c': + { + if (LocaleCompare((const char *) tag,"comment") == 0 ) + { + (void) DeleteImageProperty(msl_info->image[n],"comment"); + if (msl_info->content == (char *) NULL) + break; + StripString(msl_info->content); + (void) SetImageProperty(msl_info->image[n],"comment", + msl_info->content); + break; + } + break; + } + case 'G': + case 'g': + { + if (LocaleCompare((const char *) tag, "group") == 0 ) + { + if ((msl_info->number_groups > 0) && + (msl_info->group_info[msl_info->number_groups-1].numImages > 0)) + { + ssize_t i = (ssize_t) + (msl_info->group_info[msl_info->number_groups-1].numImages); + + while ((i--) && (msl_info->n > 0)) + { + if (msl_info->image[msl_info->n] != (Image *) NULL) + msl_info->image[msl_info->n]=DestroyImage( + msl_info->image[msl_info->n]); + msl_info->attributes[msl_info->n]=DestroyImage( + msl_info->attributes[msl_info->n]); + msl_info->image_info[msl_info->n]=DestroyImageInfo( + msl_info->image_info[msl_info->n]); + msl_info->n--; + } + } + msl_info->number_groups--; + } + break; + } + case 'I': + case 'i': + { + if (LocaleCompare((const char *) tag, "image") == 0) + MSLPopImage(msl_info); + break; + } + case 'L': + case 'l': + { + if (LocaleCompare((const char *) tag,"label") == 0 ) + { + (void) DeleteImageProperty(msl_info->image[n],"label"); + if (msl_info->content == (char *) NULL) + break; + StripString(msl_info->content); + (void) SetImageProperty(msl_info->image[n],"label", + msl_info->content); + break; + } + break; + } + case 'M': + case 'm': + { + if (LocaleCompare((const char *) tag, "msl") == 0 ) + { + /* + This our base element. + at the moment we don't do anything special + but someday we might! + */ + } + break; + } + default: + break; + } + if (msl_info->content != (char *) NULL) + msl_info->content=DestroyString(msl_info->content); +} + +static void MSLCharacters(void *context,const xmlChar *c,int length) +{ + MSLInfo + *msl_info; + + char + *p; + + ssize_t + i; + + /* + Receiving some characters from the parser. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.characters(%s,%d)",c,length); + msl_info=(MSLInfo *) context; + if (msl_info->content != (char *) NULL) + msl_info->content=(char *) ResizeQuantumMemory(msl_info->content, + strlen(msl_info->content)+length+MaxTextExtent, + sizeof(*msl_info->content)); + else + { + msl_info->content=(char *) NULL; + if (~(size_t) length >= (MaxTextExtent-1)) + msl_info->content=(char *) AcquireQuantumMemory(length+MaxTextExtent, + sizeof(*msl_info->content)); + if (msl_info->content != (char *) NULL) + *msl_info->content='\0'; + } + if (msl_info->content == (char *) NULL) + return; + p=msl_info->content+strlen(msl_info->content); + for (i=0; i < length; i++) + *p++=c[i]; + *p='\0'; +} + +static void MSLReference(void *context,const xmlChar *name) +{ + MSLInfo + *msl_info; + + xmlParserCtxtPtr + parser; + + /* + Called when an entity reference is detected. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.reference(%s)",name); + msl_info=(MSLInfo *) context; + parser=msl_info->parser; + if (parser == (xmlParserCtxtPtr) NULL) + return; + if (parser->node == (xmlNodePtr) NULL) + return; + if (*name == '#') + (void) xmlAddChild(parser->node,xmlNewCharRef(msl_info->document,name)); + else + (void) xmlAddChild(parser->node,xmlNewReference(msl_info->document,name)); +} + +static void MSLIgnorableWhitespace(void *context,const xmlChar *c,int length) +{ + MSLInfo + *msl_info; + + /* + Receiving some ignorable whitespaces from the parser. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.ignorableWhitespace(%.30s, %d)",c,length); + msl_info=(MSLInfo *) context; + (void) msl_info; +} + +static void MSLProcessingInstructions(void *context,const xmlChar *target, + const xmlChar *data) +{ + MSLInfo + *msl_info; + + /* + A processing instruction has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.processingInstruction(%s, %s)", + target,data); + msl_info=(MSLInfo *) context; + (void) msl_info; +} + +static void MSLComment(void *context,const xmlChar *value) +{ + MSLInfo + *msl_info; + + /* + A comment has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.comment(%s)",value); + msl_info=(MSLInfo *) context; + (void) msl_info; +} + +static void MSLWarning(void *context,const char *format,...) + magick_attribute((__format__ (__printf__,2,3))); + +static void MSLWarning(void *context,const char *format,...) +{ + char + *message, + reason[MaxTextExtent]; + + MSLInfo + *msl_info; + + va_list + operands; + + /** + Display and format a warning messages, gives file, line, position and + extra parameters. + */ + va_start(operands,format); + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.warning: "); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),format,operands); + msl_info=(MSLInfo *) context; + (void) msl_info; +#if !defined(MAGICKCORE_HAVE_VSNPRINTF) + (void) vsprintf(reason,format,operands); +#else + (void) vsnprintf(reason,MaxTextExtent,format,operands); +#endif + message=GetExceptionMessage(errno); + ThrowMSLException(CoderError,reason,message); + message=DestroyString(message); + va_end(operands); +} + +static void MSLError(void *context,const char *format,...) + magick_attribute((__format__ (__printf__,2,3))); + +static void MSLError(void *context,const char *format,...) +{ + char + reason[MaxTextExtent]; + + MSLInfo + *msl_info; + + va_list + operands; + + /* + Display and format a error formats, gives file, line, position and + extra parameters. + */ + va_start(operands,format); + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.error: "); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),format,operands); + msl_info=(MSLInfo *) context; + (void) msl_info; +#if !defined(MAGICKCORE_HAVE_VSNPRINTF) + (void) vsprintf(reason,format,operands); +#else + (void) vsnprintf(reason,MaxTextExtent,format,operands); +#endif + ThrowMSLException(DelegateFatalError,reason,"SAX error"); + va_end(operands); + xmlStopParser(msl_info->parser); +} + +static void MSLCDataBlock(void *context,const xmlChar *value,int length) +{ + MSLInfo + *msl_info; + + xmlNodePtr + child; + + xmlParserCtxtPtr + parser; + + /* + Called when a pcdata block has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.pcdata(%s, %d)",value,length); + msl_info=(MSLInfo *) context; + (void) msl_info; + parser=msl_info->parser; + child=xmlGetLastChild(parser->node); + if ((child != (xmlNodePtr) NULL) && (child->type == XML_CDATA_SECTION_NODE)) + { + xmlTextConcat(child,value,length); + return; + } + child=xmlNewCDataBlock(parser->myDoc,value,length); + if (xmlAddChild(parser->node,child) == (xmlNodePtr) NULL) + xmlFreeNode(child); +} + +static void MSLExternalSubset(void *context,const xmlChar *name, + const xmlChar *external_id,const xmlChar *system_id) +{ + MSLInfo + *msl_info; + + xmlParserCtxt + parser_context; + + xmlParserCtxtPtr + parser; + + xmlParserInputPtr + input; + + /* + Does this document has an external subset? + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.externalSubset(%s %s %s)",name, + (external_id != (const xmlChar *) NULL ? (const char *) external_id : " "), + (system_id != (const xmlChar *) NULL ? (const char *) system_id : " ")); + msl_info=(MSLInfo *) context; + (void) msl_info; + parser=msl_info->parser; + if (((external_id == NULL) && (system_id == NULL)) || + ((parser->validate == 0) || (parser->wellFormed == 0) || + (msl_info->document == 0))) + return; + input=MSLResolveEntity(context,external_id,system_id); + if (input == NULL) + return; + (void) xmlNewDtd(msl_info->document,name,external_id,system_id); + parser_context=(*parser); + parser->inputTab=(xmlParserInputPtr *) xmlMalloc(5*sizeof(*parser->inputTab)); + if (parser->inputTab == (xmlParserInputPtr *) NULL) + { + parser->errNo=XML_ERR_NO_MEMORY; + parser->input=parser_context.input; + parser->inputNr=parser_context.inputNr; + parser->inputMax=parser_context.inputMax; + parser->inputTab=parser_context.inputTab; + return; + } + parser->inputNr=0; + parser->inputMax=5; + parser->input=NULL; + xmlPushInput(parser,input); + (void) xmlSwitchEncoding(parser,xmlDetectCharEncoding(parser->input->cur,4)); + if (input->filename == (char *) NULL) + input->filename=(char *) xmlStrdup(system_id); + input->line=1; + input->col=1; + input->base=parser->input->cur; + input->cur=parser->input->cur; + input->free=NULL; + xmlParseExternalSubset(parser,external_id,system_id); + while (parser->inputNr > 1) + (void) xmlPopInput(parser); + xmlFreeInputStream(parser->input); + xmlFree(parser->inputTab); + parser->input=parser_context.input; + parser->inputNr=parser_context.inputNr; + parser->inputMax=parser_context.inputMax; + parser->inputTab=parser_context.inputTab; +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +static MagickBooleanType ProcessMSLScript(const ImageInfo *image_info, + Image **image,ExceptionInfo *exception) +{ + char + message[MaxTextExtent]; + + Image + *msl_image; + + int + status; + + ssize_t + n; + + MSLInfo + msl_info; + + xmlSAXHandler + sax_modules; + + xmlSAXHandlerPtr + sax_handler; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(image != (Image **) NULL); + msl_image=AcquireImage(image_info); + status=OpenBlob(image_info,msl_image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + msl_image->filename); + msl_image=DestroyImageList(msl_image); + return(MagickFalse); + } + msl_image->columns=1; + msl_image->rows=1; + /* + Parse MSL file. + */ + (void) memset(&msl_info,0,sizeof(msl_info)); + msl_info.exception=exception; + msl_info.image_info=(ImageInfo **) AcquireQuantumMemory(1, + sizeof(*msl_info.image_info)); + msl_info.draw_info=(DrawInfo **) AcquireQuantumMemory(1, + sizeof(*msl_info.draw_info)); + /* top of the stack is the MSL file itself */ + msl_info.image=(Image **) AcquireMagickMemory(sizeof(*msl_info.image)); + msl_info.attributes=(Image **) AcquireQuantumMemory(1, + sizeof(*msl_info.attributes)); + msl_info.group_info=(MSLGroupInfo *) AcquireQuantumMemory(1, + sizeof(*msl_info.group_info)); + if ((msl_info.image_info == (ImageInfo **) NULL) || + (msl_info.draw_info == (DrawInfo **) NULL) || + (msl_info.image == (Image **) NULL) || + (msl_info.attributes == (Image **) NULL) || + (msl_info.group_info == (MSLGroupInfo *) NULL)) + ThrowFatalException(ResourceLimitFatalError,"UnableToInterpretMSLImage"); + *msl_info.image_info=CloneImageInfo(image_info); + *msl_info.draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL); + *msl_info.attributes=AcquireImage(image_info); + (void) SetImageExtent(*msl_info.attributes,1,1); + msl_info.group_info[0].numImages=0; + /* the first slot is used to point to the MSL file image */ + *msl_info.image=msl_image; + if (*image != (Image *) NULL) + MSLPushImage(&msl_info,*image); + xmlInitParser(); + (void) xmlSubstituteEntitiesDefault(1); + (void) memset(&sax_modules,0,sizeof(sax_modules)); + sax_modules.internalSubset=MSLInternalSubset; + sax_modules.isStandalone=MSLIsStandalone; + sax_modules.hasInternalSubset=MSLHasInternalSubset; + sax_modules.hasExternalSubset=MSLHasExternalSubset; + sax_modules.resolveEntity=MSLResolveEntity; + sax_modules.getEntity=MSLGetEntity; + sax_modules.entityDecl=MSLEntityDeclaration; + sax_modules.notationDecl=MSLNotationDeclaration; + sax_modules.attributeDecl=MSLAttributeDeclaration; + sax_modules.elementDecl=MSLElementDeclaration; + sax_modules.unparsedEntityDecl=MSLUnparsedEntityDeclaration; + sax_modules.setDocumentLocator=MSLSetDocumentLocator; + sax_modules.startDocument=MSLStartDocument; + sax_modules.endDocument=MSLEndDocument; + sax_modules.startElement=MSLStartElement; + sax_modules.endElement=MSLEndElement; + sax_modules.reference=MSLReference; + sax_modules.characters=MSLCharacters; + sax_modules.ignorableWhitespace=MSLIgnorableWhitespace; + sax_modules.processingInstruction=MSLProcessingInstructions; + sax_modules.comment=MSLComment; + sax_modules.warning=MSLWarning; + sax_modules.error=MSLError; + sax_modules.fatalError=MSLError; + sax_modules.getParameterEntity=MSLGetParameterEntity; + sax_modules.cdataBlock=MSLCDataBlock; + sax_modules.externalSubset=MSLExternalSubset; + sax_handler=(&sax_modules); + msl_info.parser=xmlCreatePushParserCtxt(sax_handler,&msl_info,(char *) NULL,0, + msl_image->filename); + while (ReadBlobString(msl_image,message) != (char *) NULL) + { + n=(ssize_t) strlen(message); + if (n == 0) + continue; + status=xmlParseChunk(msl_info.parser,message,(int) n,MagickFalse); + if (status != 0) + break; + status=xmlParseChunk(msl_info.parser," ",1,MagickFalse); + if (status != 0) + break; + if (msl_info.exception->severity >= ErrorException) + break; + } + if (msl_info.exception->severity == UndefinedException) + (void) xmlParseChunk(msl_info.parser," ",1,MagickTrue); + /* + Free resources. + */ + MSLEndDocument(&msl_info); + if (msl_info.parser->myDoc != (xmlDocPtr) NULL) + xmlFreeDoc(msl_info.parser->myDoc); + xmlFreeParserCtxt(msl_info.parser); + xmlFreeDoc(msl_info.document); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"end SAX"); + if (*image == (Image *) NULL) + *image=CloneImage(*msl_info.image,0,0,MagickTrue,exception); + while (msl_info.n >= 0) + { + if (msl_info.image[msl_info.n] != (Image *) NULL) + msl_info.image[msl_info.n]=DestroyImage(msl_info.image[msl_info.n]); + msl_info.attributes[msl_info.n]=DestroyImage( + msl_info.attributes[msl_info.n]); + msl_info.draw_info[msl_info.n]=DestroyDrawInfo( + msl_info.draw_info[msl_info.n]); + msl_info.image_info[msl_info.n]=DestroyImageInfo( + msl_info.image_info[msl_info.n]); + msl_info.n--; + } + msl_info.draw_info=(DrawInfo **) RelinquishMagickMemory(msl_info.draw_info); + msl_info.image=(Image **) RelinquishMagickMemory(msl_info.image); + msl_info.attributes=(Image **) RelinquishMagickMemory(msl_info.attributes); + msl_info.image_info=(ImageInfo **) RelinquishMagickMemory( + msl_info.image_info); + msl_info.group_info=(MSLGroupInfo *) RelinquishMagickMemory( + msl_info.group_info); + if ((*msl_info.image)->exception.severity != UndefinedException) + return(MagickFalse); + return(MagickTrue); +} + +static Image *ReadMSLImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=(Image *) NULL; + (void) ProcessMSLScript(image_info,&image,exception); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M S L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMSLImage() adds attributes for the MSL image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMSLImage method is: +% +% size_t RegisterMSLImage(void) +% +*/ +ModuleExport size_t RegisterMSLImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MSL"); +#if defined(MAGICKCORE_XML_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadMSLImage; + entry->encoder=(EncodeImageHandler *) WriteMSLImage; +#endif + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Magick Scripting Language"); + entry->magick_module=ConstantString("MSL"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +#if defined(MAGICKCORE_XML_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t M S L A t t r i b u t e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetMSLAttributes() ... +% +% The format of the SetMSLAttributes method is: +% +% MagickBooleanType SetMSLAttributes(MSLInfo *msl_info, +% const char *keyword,const char *value) +% +% A description of each parameter follows: +% +% o msl_info: the MSL info. +% +% o keyword: the keyword. +% +% o value: the value. +% +*/ +static MagickBooleanType SetMSLAttributes(MSLInfo *msl_info,const char *keyword, + const char *value) +{ + Image + *attributes; + + DrawInfo + *draw_info; + + ExceptionInfo + *exception; + + GeometryInfo + geometry_info; + + Image + *image; + + ImageInfo + *image_info; + + int + flags; + + ssize_t + n; + + assert(msl_info != (MSLInfo *) NULL); + if (keyword == (const char *) NULL) + return(MagickTrue); + if (value == (const char *) NULL) + return(MagickTrue); + exception=msl_info->exception; + n=msl_info->n; + attributes=msl_info->attributes[n]; + image_info=msl_info->image_info[n]; + draw_info=msl_info->draw_info[n]; + image=msl_info->image[n]; + switch (*keyword) + { + case 'A': + case 'a': + { + if (LocaleCompare(keyword,"adjoin") == 0) + { + ssize_t + adjoin; + + adjoin=ParseCommandOption(MagickBooleanOptions,MagickFalse,value); + if (adjoin < 0) + ThrowMSLException(OptionError,"UnrecognizedType",value); + image_info->adjoin=(MagickBooleanType) adjoin; + break; + } + if (LocaleCompare(keyword,"alpha") == 0) + { + ssize_t + alpha; + + alpha=ParseCommandOption(MagickAlphaOptions,MagickFalse,value); + if (alpha < 0) + ThrowMSLException(OptionError,"UnrecognizedType",value); + if (image != (Image *) NULL) + (void) SetImageAlphaChannel(image,(AlphaChannelType) alpha); + break; + } + if (LocaleCompare(keyword,"antialias") == 0) + { + ssize_t + antialias; + + antialias=ParseCommandOption(MagickBooleanOptions,MagickFalse,value); + if (antialias < 0) + ThrowMSLException(OptionError,"UnrecognizedGravityType",value); + image_info->antialias=(MagickBooleanType) antialias; + break; + } + if (LocaleCompare(keyword,"area-limit") == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare(value,"unlimited") != 0) + limit=(MagickSizeType) StringToDoubleInterval(value,100.0); + (void) SetMagickResourceLimit(AreaResource,limit); + break; + } + if (LocaleCompare(keyword,"attenuate") == 0) + { + (void) SetImageOption(image_info,keyword,value); + break; + } + if (LocaleCompare(keyword,"authenticate") == 0) + { + (void) CloneString(&image_info->authenticate,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'B': + case 'b': + { + if (LocaleCompare(keyword,"background") == 0) + { + (void) QueryColorDatabase(value,&image_info->background_color, + exception); + break; + } + if (LocaleCompare(keyword,"bias") == 0) + { + if (image == (Image *) NULL) + break; + image->bias=StringToDoubleInterval(value,(double) QuantumRange+1.0); + break; + } + if (LocaleCompare(keyword,"blue-primary") == 0) + { + if (image == (Image *) NULL) + break; + flags=ParseGeometry(value,&geometry_info); + image->chromaticity.blue_primary.x=geometry_info.rho; + image->chromaticity.blue_primary.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + image->chromaticity.blue_primary.y= + image->chromaticity.blue_primary.x; + break; + } + if (LocaleCompare(keyword,"bordercolor") == 0) + { + (void) QueryColorDatabase(value,&image_info->border_color, + exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"density") == 0) + { + (void) CloneString(&image_info->density,value); + (void) CloneString(&draw_info->density,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"fill") == 0) + { + (void) QueryColorDatabase(value,&draw_info->fill,exception); + (void) SetImageOption(image_info,keyword,value); + break; + } + if (LocaleCompare(keyword,"filename") == 0) + { + (void) CopyMagickString(image_info->filename,value,MaxTextExtent); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"gravity") == 0) + { + ssize_t + gravity; + + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,value); + if (gravity < 0) + ThrowMSLException(OptionError,"UnrecognizedGravityType",value); + (void) SetImageOption(image_info,keyword,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(keyword,"id") == 0) + { + (void) SetImageProperty(attributes,keyword,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(keyword,"magick") == 0) + { + (void) CopyMagickString(image_info->magick,value,MaxTextExtent); + break; + } + if (LocaleCompare(keyword,"mattecolor") == 0) + { + (void) QueryColorDatabase(value,&image_info->matte_color, + exception); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(keyword,"pointsize") == 0) + { + image_info->pointsize=StringToDouble(value,(char **) NULL); + draw_info->pointsize=StringToDouble(value,(char **) NULL); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + case 'Q': + case 'q': + { + if (LocaleCompare(keyword,"quality") == 0) + { + image_info->quality=StringToLong(value); + if (image == (Image *) NULL) + break; + image->quality=StringToLong(value); + break; + } + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"size") == 0) + { + (void) CloneString(&image_info->size,value); + break; + } + if (LocaleCompare(keyword,"stroke") == 0) + { + (void) QueryColorDatabase(value,&draw_info->stroke,exception); + (void) SetImageOption(image_info,keyword,value); + break; + } + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + default: + { + ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword); + break; + } + } + return(MagickTrue); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M S L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMSLImage() removes format registrations made by the +% MSL module from the list of supported formats. +% +% The format of the UnregisterMSLImage method is: +% +% UnregisterMSLImage(void) +% +*/ +ModuleExport void UnregisterMSLImage(void) +{ + (void) UnregisterMagickInfo("MSL"); +} + +#if defined(MAGICKCORE_XML_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M S L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMSLImage() writes an image to a file in MVG image format. +% +% The format of the WriteMSLImage method is: +% +% MagickBooleanType WriteMSLImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteMSLImage(const ImageInfo *image_info,Image *image) +{ + Image + *msl_image; + + MagickBooleanType + status; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + msl_image=CloneImage(image,0,0,MagickTrue,&image->exception); + status=ProcessMSLScript(image_info,&msl_image,&image->exception); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/mtv.c b/ImageMagick-6.9.12-44/coders/mtv.c new file mode 100644 index 0000000..2e48cfc --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/mtv.c @@ -0,0 +1,426 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M TTTTT V V % +% MM MM T V V % +% M M M T V V % +% M M T V V % +% M M T V % +% % +% % +% Read/Write MTV Raytracer Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMTVImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M T V I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMTVImage() reads a MTV image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the ReadMTVImage method is: +% +% Image *ReadMTVImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMTVImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + buffer[MaxTextExtent]; + + Image + *image; + + MagickBooleanType + status; + + ssize_t + x; + + PixelPacket + *q; + + unsigned char + *p; + + ssize_t + count, + y; + + unsigned char + *pixels; + + unsigned long + columns, + rows; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read MTV image. + */ + (void) memset(buffer,0,sizeof(buffer)); + (void) ReadBlobString(image,buffer); + count=(ssize_t) sscanf(buffer,"%lu %lu\n",&columns,&rows); + if (count != 2) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + do + { + /* + Initialize image structure. + */ + image->columns=columns; + image->rows=rows; + image->depth=8; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Convert MTV raster image to pixel packets. + */ + pixels=(unsigned char *) AcquireQuantumMemory(image->columns, + 3UL*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + for (y=0; y < (ssize_t) image->rows; y++) + { + count=(ssize_t) ReadBlob(image,(size_t) (3*image->columns),pixels); + if (count != (ssize_t) (3*image->columns)) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + } + p=pixels; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + *buffer='\0'; + count=0; + if (ReadBlobString(image,buffer) == (char *) NULL) + break; + count=(ssize_t) sscanf(buffer,"%lu %lu\n",&columns,&rows); + if (count > 0) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while (count > 0); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M T V I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMTVImage() adds attributes for the MTV image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMTVImage method is: +% +% size_t RegisterMTVImage(void) +% +*/ +ModuleExport size_t RegisterMTVImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MTV"); + entry->decoder=(DecodeImageHandler *) ReadMTVImage; + entry->encoder=(EncodeImageHandler *) WriteMTVImage; + entry->description=ConstantString("MTV Raytracing image format"); + entry->magick_module=ConstantString("MTV"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M T V I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMTVImage() removes format registrations made by the +% MTV module from the list of supported formats. +% +% The format of the UnregisterMTVImage method is: +% +% UnregisterMTVImage(void) +% +*/ +ModuleExport void UnregisterMTVImage(void) +{ + (void) UnregisterMagickInfo("MTV"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M T V I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMTVImage() writes an image to a file in red, green, and blue MTV +% rasterfile format. +% +% The format of the WriteMTVImage method is: +% +% MagickBooleanType WriteMTVImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteMTVImage(const ImageInfo *image_info,Image *image) +{ + char + buffer[MaxTextExtent]; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + const PixelPacket + *p; + + ssize_t + x; + + unsigned char + *q; + + size_t + imageListLength; + + ssize_t + y; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Allocate memory for pixels. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + pixels=(unsigned char *) AcquireQuantumMemory(image->columns, + 3UL*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Initialize raster file header. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g\n",(double) + image->columns,(double) image->rows); + (void) WriteBlobString(image,buffer); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + p++; + } + (void) WriteBlob(image,(size_t) (q-pixels),pixels); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene,imageListLength); + if (status == MagickFalse) + break; + scene++; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/mvg.c b/ImageMagick-6.9.12-44/coders/mvg.c new file mode 100644 index 0000000..2d503e1 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/mvg.c @@ -0,0 +1,365 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M V V GGGG % +% MM MM V V G % +% M M M V V G GG % +% M M V V G G % +% M M V GGG % +% % +% % +% Read/Write Magick Vector Graphics Metafiles. % +% % +% Software Design % +% Cristy % +% April 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMVGImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s M V G % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsMVG() returns MagickTrue if the image format type, identified by the +% magick string, is MVG. +% +% The format of the IsMVG method is: +% +% MagickBooleanType IsMVG(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsMVG(const unsigned char *magick,const size_t length) +{ + if (length < 20) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"push graphic-context",20) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M V G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMVGImage creates a gradient image and initializes it to +% the X server color range as specified by the filename. It allocates the +% memory necessary for the new Image structure and returns a pointer to the +% new image. +% +% The format of the ReadMVGImage method is: +% +% Image *ReadMVGImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMVGImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define BoundingBox "viewbox" + + DrawInfo + *draw_info; + + Image + *image; + + MagickBooleanType + status; + + /* + Open image. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if ((image->columns == 0) || (image->rows == 0)) + { + char + primitive[MaxTextExtent]; + + char + *p; + + SegmentInfo + bounds; + + /* + Determine size of image canvas. + */ + (void) memset(&bounds,0,sizeof(bounds)); + while (ReadBlobString(image,primitive) != (char *) NULL) + { + for (p=primitive; (*p == ' ') || (*p == '\t'); p++) ; + if (LocaleNCompare(BoundingBox,p,strlen(BoundingBox)) != 0) + continue; + (void) sscanf(p,"viewbox %lf %lf %lf %lf",&bounds.x1,&bounds.y1, + &bounds.x2,&bounds.y2); + image->columns=(size_t) floor((bounds.x2-bounds.x1)+0.5); + image->rows=(size_t) floor((bounds.y2-bounds.y1)+0.5); + break; + } + } + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL); + if (draw_info->density != (char *) NULL) + draw_info->density=DestroyString(draw_info->density); + draw_info->affine.sx=image->x_resolution == 0.0 ? 1.0 : image->x_resolution/ + 96.0; + draw_info->affine.sy=image->y_resolution == 0.0 ? 1.0 : image->y_resolution/ + 96.0; + image->columns=(size_t) (draw_info->affine.sx*image->columns); + image->rows=(size_t) (draw_info->affine.sy*image->rows); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + draw_info=DestroyDrawInfo(draw_info); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (SetImageBackgroundColor(image) == MagickFalse) + { + draw_info=DestroyDrawInfo(draw_info); + InheritException(exception,&image->exception); + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Render drawing. + */ + if (GetBlobStreamData(image) == (unsigned char *) NULL) + draw_info->primitive=FileToString(image->filename,~0UL,exception); + else + { + MagickSizeType + length; + + length=GetBlobSize(image); + if (length == (MagickSizeType) ((size_t) length)) + { + draw_info->primitive=(char *) AcquireQuantumMemory(1,(size_t) length+1); + if (draw_info->primitive != (char *) NULL) + { + memcpy(draw_info->primitive,GetBlobStreamData(image),(size_t) + length); + draw_info->primitive[length]='\0'; + } + } + } + if (draw_info->primitive == (char *) NULL) + { + draw_info=DestroyDrawInfo(draw_info); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (*draw_info->primitive == '@') + { + draw_info=DestroyDrawInfo(draw_info); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + (void) DrawImage(image,draw_info); + (void) SetImageArtifact(image,"mvg:vector-graphics",draw_info->primitive); + draw_info=DestroyDrawInfo(draw_info); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M V G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMVGImage() adds properties for the MVG image format +% to the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMVGImage method is: +% +% size_t RegisterMVGImage(void) +% +*/ +ModuleExport size_t RegisterMVGImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MVG"); + entry->decoder=(DecodeImageHandler *) ReadMVGImage; + entry->encoder=(EncodeImageHandler *) WriteMVGImage; + entry->magick=(IsImageFormatHandler *) IsMVG; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Magick Vector Graphics"); + entry->magick_module=ConstantString("MVG"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M V G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMVGImage() removes format registrations made by the +% MVG module from the list of supported formats. +% +% The format of the UnregisterMVGImage method is: +% +% UnregisterMVGImage(void) +% +*/ +ModuleExport void UnregisterMVGImage(void) +{ + (void) UnregisterMagickInfo("MVG"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M V G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMVGImage() writes an image to a file in MVG image format. +% +% The format of the WriteMVGImage method is: +% +% MagickBooleanType WriteMVGImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteMVGImage(const ImageInfo *image_info,Image *image) +{ + const char + *value; + + MagickBooleanType + status; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + value=GetImageArtifact(image,"mvg:vector-graphics"); + if (value == (const char *) NULL) + ThrowWriterException(OptionError,"NoImageVectorGraphics"); + status=OpenBlob(image_info,image,WriteBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) WriteBlob(image,strlen(value),(const unsigned char *) value); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/null.c b/ImageMagick-6.9.12-44/coders/null.c new file mode 100644 index 0000000..8e83fc8 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/null.c @@ -0,0 +1,263 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N N U U L L % +% NN N U U L L % +% N N N U U L L % +% N NN U U L L % +% N N UUU LLLLL LLLLL % +% % +% % +% Read/Write Image Of Uniform Color. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteNULLImage(const ImageInfo *,Image *) magick_attribute((__pure__)); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d N U L L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadNULLImage creates a constant image and initializes it to the +% X server color as specified by the filename. It allocates the memory +% necessary for the new Image structure and returns a pointer to the new +% image. +% +% The format of the ReadNULLImage method is: +% +% Image *ReadNULLImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadNULLImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + MagickPixelPacket + background; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + y; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if (image->columns == 0) + image->columns=1; + if (image->rows == 0) + image->rows=1; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + image->matte=MagickTrue; + GetMagickPixelPacket(image,&background); + background.opacity=(MagickRealType) TransparentOpacity; + if (image->colorspace == CMYKColorspace) + ConvertRGBToCMYK(&background); + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelPacket(image,&background,q,indexes); + q++; + indexes++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r N U L L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterNULLImage() adds attributes for the NULL image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterNULLImage method is: +% +% size_t RegisterNULLImage(void) +% +*/ +ModuleExport size_t RegisterNULLImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("NULL"); + entry->decoder=(DecodeImageHandler *) ReadNULLImage; + entry->encoder=(EncodeImageHandler *) WriteNULLImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Constant image of uniform color"); + entry->magick_module=ConstantString("NULL"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r N U L L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterNULLImage() removes format registrations made by the +% NULL module from the list of supported formats. +% +% The format of the UnregisterNULLImage method is: +% +% UnregisterNULLImage(void) +% +*/ +ModuleExport void UnregisterNULLImage(void) +{ + (void) UnregisterMagickInfo("NULL"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e N U L L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteNULLImage writes no output at all. It is useful when specified +% as an output format when profiling. +% +% The format of the WriteNULLImage method is: +% +% MagickBooleanType WriteNULLImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteNULLImage(const ImageInfo *image_info, + Image *image) +{ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/otb.c b/ImageMagick-6.9.12-44/coders/otb.c new file mode 100644 index 0000000..9afb99d --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/otb.c @@ -0,0 +1,395 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% OOO TTTTT BBBB % +% O O T B B % +% O O T BBBB % +% O O T B B % +% OOO T BBBB % +% % +% % +% Read/Write On-The-Air Image Format % +% % +% Software Design % +% Cristy % +% January 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteOTBImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d O T B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadOTBImage() reads a on-the-air (level 0) bitmap and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadOTBImage method is: +% +% Image *ReadOTBImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +% +*/ +static Image *ReadOTBImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define GetBit(a,i) (((a) >> (i)) & 1L) + + Image + *image; + + int + byte; + + MagickBooleanType + status; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + y; + + unsigned char + bit, + info, + depth; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Initialize image structure. + */ + info=(unsigned char) ReadBlobByte(image); + if (GetBit(info,4) == 0) + { + image->columns=(size_t) ReadBlobByte(image); + image->rows=(size_t) ReadBlobByte(image); + } + else + { + image->columns=(size_t) ReadBlobMSBShort(image); + image->rows=(size_t) ReadBlobMSBShort(image); + } + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + depth=(unsigned char) ReadBlobByte(image); + if (depth != 1) + ThrowReaderException(CoderError,"OnlyLevelZerofilesSupported"); + if (AcquireImageColormap(image,2) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Convert bi-level image to pixel packets. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (bit == 0) + { + byte=ReadBlobByte(image); + if (byte == EOF) + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + SetPixelIndex(indexes+x,(byte & (0x01 << (7-bit))) ? + 0x00 : 0x01); + bit++; + if (bit == 8) + bit=0; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + (void) SyncImage(image); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r O T B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterOTBImage() adds attributes for the OTB image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterOTBImage method is: +% +% size_t RegisterOTBImage(void) +% +*/ +ModuleExport size_t RegisterOTBImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("OTB"); + entry->decoder=(DecodeImageHandler *) ReadOTBImage; + entry->encoder=(EncodeImageHandler *) WriteOTBImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("On-the-air bitmap"); + entry->magick_module=ConstantString("OTB"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r O T B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterOTBImage() removes format registrations made by the +% OTB module from the list of supported formats. +% +% The format of the UnregisterOTBImage method is: +% +% UnregisterOTBImage(void) +% +*/ +ModuleExport void UnregisterOTBImage(void) +{ + (void) UnregisterMagickInfo("OTB"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e O T B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteOTBImage() writes an image to a file in the On-the-air Bitmap +% (level 0) image format. +% +% The format of the WriteOTBImage method is: +% +% MagickBooleanType WriteOTBImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% +*/ +static MagickBooleanType WriteOTBImage(const ImageInfo *image_info,Image *image) +{ +#define SetBit(a,i,set) \ + a=(unsigned char) ((set) ? (a) | (1L << (i)) : (a) & ~(1L << (i))) + + MagickBooleanType + status; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + y; + + unsigned char + bit, + byte, + info; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Convert image to a bi-level image. + */ + (void) SetImageType(image,BilevelType); + info=0; + if ((image->columns >= 256) || (image->rows >= 256)) + SetBit(info,4,1); + (void) WriteBlobByte(image,info); + if ((image->columns >= 256) || (image->rows >= 256)) + { + (void) WriteBlobMSBShort(image,(unsigned short) image->columns); + (void) WriteBlobMSBShort(image,(unsigned short) image->rows); + } + else + { + (void) WriteBlobByte(image,(unsigned char) image->columns); + (void) WriteBlobByte(image,(unsigned char) image->rows); + } + (void) WriteBlobByte(image,1); /* depth */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelLuma(image,p) < (QuantumRange/2.0)) + byte|=0x1 << (7-bit); + bit++; + if (bit == 8) + { + (void) WriteBlobByte(image,byte); + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + (void) WriteBlobByte(image,byte); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/palm.c b/ImageMagick-6.9.12-44/coders/palm.c new file mode 100644 index 0000000..9db52cf --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/palm.c @@ -0,0 +1,1043 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP AAA L M M % +% P P A A L MM MM % +% PPPP AAAAA L M M M % +% P A A L M M % +% P A A LLLLL M M % +% % +% % +% Read/Write Palm Pixmap. % +% % +% % +% Software Design % +% Christopher R. Hawks % +% December 2001 % +% % +% Copyright 1999-2004 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Based on pnmtopalm by Bill Janssen and ppmtobmp by Ian Goldberg. +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/histogram.h" +#include "magick/image.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/paint.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Define declarations. +*/ +#define PALM_IS_COMPRESSED_FLAG 0x8000 +#define PALM_HAS_COLORMAP_FLAG 0x4000 +#define PALM_HAS_FOUR_BYTE_FIELD 0x0200 +#define PALM_HAS_TRANSPARENCY_FLAG 0x2000 +#define PALM_IS_INDIRECT 0x1000 +#define PALM_IS_FOR_SCREEN 0x0800 +#define PALM_IS_DIRECT_COLOR 0x0400 +#define PALM_COMPRESSION_SCANLINE 0x00 +#define PALM_COMPRESSION_RLE 0x01 +#define PALM_COMPRESSION_NONE 0xFF + +/* + The 256 color system palette for Palm Computing Devices. +*/ +static const unsigned char + PalmPalette[256][3] = + { + {255, 255,255}, {255, 204,255}, {255, 153,255}, {255, 102,255}, + {255, 51,255}, {255, 0,255}, {255, 255,204}, {255, 204,204}, + {255, 153,204}, {255, 102,204}, {255, 51,204}, {255, 0,204}, + {255, 255,153}, {255, 204,153}, {255, 153,153}, {255, 102,153}, + {255, 51,153}, {255, 0,153}, {204, 255,255}, {204, 204,255}, + {204, 153,255}, {204, 102,255}, {204, 51,255}, {204, 0,255}, + {204, 255,204}, {204, 204,204}, {204, 153,204}, {204, 102,204}, + {204, 51,204}, {204, 0,204}, {204, 255,153}, {204, 204,153}, + {204, 153,153}, {204, 102,153}, {204, 51,153}, {204, 0,153}, + {153, 255,255}, {153, 204,255}, {153, 153,255}, {153, 102,255}, + {153, 51,255}, {153, 0,255}, {153, 255,204}, {153, 204,204}, + {153, 153,204}, {153, 102,204}, {153, 51,204}, {153, 0,204}, + {153, 255,153}, {153, 204,153}, {153, 153,153}, {153, 102,153}, + {153, 51,153}, {153, 0,153}, {102, 255,255}, {102, 204,255}, + {102, 153,255}, {102, 102,255}, {102, 51,255}, {102, 0,255}, + {102, 255,204}, {102, 204,204}, {102, 153,204}, {102, 102,204}, + {102, 51,204}, {102, 0,204}, {102, 255,153}, {102, 204,153}, + {102, 153,153}, {102, 102,153}, {102, 51,153}, {102, 0,153}, + { 51, 255,255}, { 51, 204,255}, { 51, 153,255}, { 51, 102,255}, + { 51, 51,255}, { 51, 0,255}, { 51, 255,204}, { 51, 204,204}, + { 51, 153,204}, { 51, 102,204}, { 51, 51,204}, { 51, 0,204}, + { 51, 255,153}, { 51, 204,153}, { 51, 153,153}, { 51, 102,153}, + { 51, 51,153}, { 51, 0,153}, { 0, 255,255}, { 0, 204,255}, + { 0, 153,255}, { 0, 102,255}, { 0, 51,255}, { 0, 0,255}, + { 0, 255,204}, { 0, 204,204}, { 0, 153,204}, { 0, 102,204}, + { 0, 51,204}, { 0, 0,204}, { 0, 255,153}, { 0, 204,153}, + { 0, 153,153}, { 0, 102,153}, { 0, 51,153}, { 0, 0,153}, + {255, 255,102}, {255, 204,102}, {255, 153,102}, {255, 102,102}, + {255, 51,102}, {255, 0,102}, {255, 255, 51}, {255, 204, 51}, + {255, 153, 51}, {255, 102, 51}, {255, 51, 51}, {255, 0, 51}, + {255, 255, 0}, {255, 204, 0}, {255, 153, 0}, {255, 102, 0}, + {255, 51, 0}, {255, 0, 0}, {204, 255,102}, {204, 204,102}, + {204, 153,102}, {204, 102,102}, {204, 51,102}, {204, 0,102}, + {204, 255, 51}, {204, 204, 51}, {204, 153, 51}, {204, 102, 51}, + {204, 51, 51}, {204, 0, 51}, {204, 255, 0}, {204, 204, 0}, + {204, 153, 0}, {204, 102, 0}, {204, 51, 0}, {204, 0, 0}, + {153, 255,102}, {153, 204,102}, {153, 153,102}, {153, 102,102}, + {153, 51,102}, {153, 0,102}, {153, 255, 51}, {153, 204, 51}, + {153, 153, 51}, {153, 102, 51}, {153, 51, 51}, {153, 0, 51}, + {153, 255, 0}, {153, 204, 0}, {153, 153, 0}, {153, 102, 0}, + {153, 51, 0}, {153, 0, 0}, {102, 255,102}, {102, 204,102}, + {102, 153,102}, {102, 102,102}, {102, 51,102}, {102, 0,102}, + {102, 255, 51}, {102, 204, 51}, {102, 153, 51}, {102, 102, 51}, + {102, 51, 51}, {102, 0, 51}, {102, 255, 0}, {102, 204, 0}, + {102, 153, 0}, {102, 102, 0}, {102, 51, 0}, {102, 0, 0}, + { 51, 255,102}, { 51, 204,102}, { 51, 153,102}, { 51, 102,102}, + { 51, 51,102}, { 51, 0,102}, { 51, 255, 51}, { 51, 204, 51}, + { 51, 153, 51}, { 51, 102, 51}, { 51, 51, 51}, { 51, 0, 51}, + { 51, 255, 0}, { 51, 204, 0}, { 51, 153, 0}, { 51, 102, 0}, + { 51, 51, 0}, { 51, 0, 0}, { 0, 255,102}, { 0, 204,102}, + { 0, 153,102}, { 0, 102,102}, { 0, 51,102}, { 0, 0,102}, + { 0, 255, 51}, { 0, 204, 51}, { 0, 153, 51}, { 0, 102, 51}, + { 0, 51, 51}, { 0, 0, 51}, { 0, 255, 0}, { 0, 204, 0}, + { 0, 153, 0}, { 0, 102, 0}, { 0, 51, 0}, { 17, 17, 17}, + { 34, 34, 34}, { 68, 68, 68}, { 85, 85, 85}, {119, 119,119}, + {136, 136,136}, {170, 170,170}, {187, 187,187}, {221, 221,221}, + {238, 238,238}, {192, 192,192}, {128, 0, 0}, {128, 0,128}, + { 0, 128, 0}, { 0, 128,128}, { 0, 0, 0}, { 0, 0, 0}, + { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, + { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, + { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, + { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, + { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, + { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0} + }; + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePALMImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% F i n d C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FindColor() returns the index of the matching entry from PalmPalette for a +% given PixelPacket. +% +% The format of the FindColor method is: +% +% int FindColor(PixelPacket *pixel) +% +% A description of each parameter follows: +% +% o int: the index of the matching color or -1 if not found/ +% +% o pixel: a pointer to the PixelPacket to be matched. +% +*/ +static ssize_t FindColor(PixelPacket *pixel) +{ + ssize_t + i; + + for (i=0; i < 256; i++) + if (ScaleQuantumToChar(GetPixelRed(pixel)) == PalmPalette[i][0] && + ScaleQuantumToChar(GetPixelGreen(pixel)) == PalmPalette[i][1] && + ScaleQuantumToChar(GetPixelBlue(pixel)) == PalmPalette[i][2]) + return(i); + return(-1); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P A L M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPALMImage() reads an image of raw bites in LSB order and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadPALMImage method is: +% +% Image *ReadPALMImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: Specifies a pointer to an ImageInfo structure. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadPALMImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + IndexPacket + index; + + MagickBooleanType + status; + + MagickOffsetType + totalOffset, + seekNextDepth; + + MagickPixelPacket + transpix; + + IndexPacket + *indexes; + + ssize_t + i, + x; + + PixelPacket + *q; + + size_t + bytes_per_row, + bits_per_pixel, + extent, + flags, + version, + nextDepthOffset, + transparentIndex, + compressionType, + byte, + mask, + redbits, + greenbits, + bluebits, + one, + pad, + size, + bit; + + ssize_t + count, + y; + + unsigned char + *last_row, + *one_row, + *ptr; + + unsigned short + color16; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + (void) DestroyImageList(image); + return((Image *) NULL); + } + totalOffset=0; + do + { + image->columns=ReadBlobMSBShort(image); + image->rows=ReadBlobMSBShort(image); + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize"); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) SetImageBackgroundColor(image); + bytes_per_row=ReadBlobMSBShort(image); + flags=ReadBlobMSBShort(image); + bits_per_pixel=(size_t) ReadBlobByte(image); + if ((bits_per_pixel != 1) && (bits_per_pixel != 2) && + (bits_per_pixel != 4) && (bits_per_pixel != 8) && + (bits_per_pixel != 16)) + ThrowReaderException(CorruptImageError,"UnsupportedBitsPerPixel"); + version=(size_t) ReadBlobByte(image); + if ((version != 0) && (version != 1) && (version != 2)) + ThrowReaderException(CorruptImageError,"FileFormatVersionMismatch"); + nextDepthOffset=(size_t) ReadBlobMSBShort(image); + transparentIndex=(size_t) ReadBlobByte(image); + compressionType=(size_t) ReadBlobByte(image); + if ((compressionType != PALM_COMPRESSION_NONE) && + (compressionType != PALM_COMPRESSION_SCANLINE ) && + (compressionType != PALM_COMPRESSION_RLE)) + ThrowReaderException(CorruptImageError,"UnrecognizedImageCompression"); + pad=ReadBlobMSBShort(image); + (void) pad; + /* + Initialize image colormap. + */ + one=1; + if ((bits_per_pixel < 16) && + (AcquireImageColormap(image,one << bits_per_pixel) == MagickFalse)) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + GetMagickPixelPacket(image,&transpix); + if (bits_per_pixel == 16) /* Direct Color */ + { + redbits=(size_t) ReadBlobByte(image); /* # of bits of red */ + (void) redbits; + greenbits=(size_t) ReadBlobByte(image); /* # of bits of green */ + (void) greenbits; + bluebits=(size_t) ReadBlobByte(image); /* # of bits of blue */ + (void) bluebits; + ReadBlobByte(image); /* reserved by Palm */ + ReadBlobByte(image); /* reserved by Palm */ + transpix.red=(MagickRealType) (QuantumRange*ReadBlobByte(image)/31); + transpix.green=(MagickRealType) (QuantumRange*ReadBlobByte(image)/63); + transpix.blue=(MagickRealType) (QuantumRange*ReadBlobByte(image)/31); + } + if (bits_per_pixel == 8) + { + IndexPacket + index; + + if (flags & PALM_HAS_COLORMAP_FLAG) + { + count=(ssize_t) ReadBlobMSBShort(image); + for (i=0; i < (ssize_t) count; i++) + { + ReadBlobByte(image); + index=ConstrainColormapIndex(image,(ssize_t) (255-i)); + image->colormap[(int) index].red=ScaleCharToQuantum( + (unsigned char) ReadBlobByte(image)); + image->colormap[(int) index].green=ScaleCharToQuantum( + (unsigned char) ReadBlobByte(image)); + image->colormap[(int) index].blue=ScaleCharToQuantum( + (unsigned char) ReadBlobByte(image)); + } + } + else + for (i=0; i < (ssize_t) (1L << bits_per_pixel); i++) + { + index=ConstrainColormapIndex(image,(ssize_t) (255-i)); + image->colormap[(int) index].red=ScaleCharToQuantum( + PalmPalette[i][0]); + image->colormap[(int) index].green=ScaleCharToQuantum( + PalmPalette[i][1]); + image->colormap[(int) index].blue=ScaleCharToQuantum( + PalmPalette[i][2]); + } + } + if (flags & PALM_IS_COMPRESSED_FLAG) + size=ReadBlobMSBShort(image); + (void) size; + image->storage_class=DirectClass; + if (bits_per_pixel < 16) + { + image->storage_class=PseudoClass; + image->depth=8; + } + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(image); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + extent=MagickMax(bytes_per_row,2*image->columns); + one_row=(unsigned char *) AcquireQuantumMemory(extent,sizeof(*one_row)); + if (one_row == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(one_row,0,extent*sizeof(*one_row)); + last_row=(unsigned char *) NULL; + if (compressionType == PALM_COMPRESSION_SCANLINE) + { + last_row=(unsigned char *) AcquireQuantumMemory(MagickMax(bytes_per_row, + 2*image->columns),sizeof(*last_row)); + if (last_row == (unsigned char *) NULL) + { + one_row=(unsigned char *) RelinquishMagickMemory(one_row); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(last_row,0,MagickMax(bytes_per_row,2*image->columns)* + sizeof(*last_row)); + } + mask=(size_t) (1U << bits_per_pixel)-1; + for (y=0; y < (ssize_t) image->rows; y++) + { + if ((flags & PALM_IS_COMPRESSED_FLAG) == 0) + { + /* TODO move out of loop! */ + image->compression=NoCompression; + count=ReadBlob(image,bytes_per_row,one_row); + if (count != (ssize_t) bytes_per_row) + break; + } + else + { + if (compressionType == PALM_COMPRESSION_RLE) + { + /* TODO move out of loop! */ + image->compression=RLECompression; + for (i=0; i < (ssize_t) bytes_per_row; ) + { + count=(ssize_t) ReadBlobByte(image); + if (count < 0) + break; + count=MagickMin(count,(ssize_t) bytes_per_row-i); + byte=(size_t) ReadBlobByte(image); + (void) memset(one_row+i,(int) byte,(size_t) count); + i+=count; + } + } + else + if (compressionType == PALM_COMPRESSION_SCANLINE) + { + size_t + one; + + /* TODO move out of loop! */ + one=1; + image->compression=FaxCompression; + for (i=0; i < (ssize_t) bytes_per_row; i+=8) + { + count=(ssize_t) ReadBlobByte(image); + if (count < 0) + break; + byte=(size_t) MagickMin((ssize_t) bytes_per_row-i,8); + for (bit=0; bit < byte; bit++) + { + if ((y == 0) || (count & (one << (7 - bit)))) + one_row[i+bit]=(unsigned char) ReadBlobByte(image); + else + one_row[i+bit]=last_row[i+bit]; + } + } + (void) memcpy(last_row, one_row, bytes_per_row); + } + } + ptr=one_row; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + if (bits_per_pixel == 16) + { + if (image->columns > (2*bytes_per_row)) + { + one_row=(unsigned char *) RelinquishMagickMemory(one_row); + if (compressionType == PALM_COMPRESSION_SCANLINE) + last_row=(unsigned char *) RelinquishMagickMemory(last_row); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + for (x=0; x < (ssize_t) image->columns; x++) + { + color16=(*ptr++ << 8); + color16|=(*ptr++); + SetPixelRed(q,(QuantumRange*((color16 >> 11) & 0x1f))/0x1f); + SetPixelGreen(q,(QuantumRange*((color16 >> 5) & 0x3f))/0x3f); + SetPixelBlue(q,(QuantumRange*((color16 >> 0) & 0x1f))/0x1f); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + } + else + { + bit=8-bits_per_pixel; + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((size_t) (ptr-one_row) >= bytes_per_row) + { + one_row=(unsigned char *) RelinquishMagickMemory(one_row); + if (compressionType == PALM_COMPRESSION_SCANLINE) + last_row=(unsigned char *) RelinquishMagickMemory(last_row); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + index=(IndexPacket) (mask-(((*ptr) & (mask << bit)) >> bit)); + SetPixelIndex(indexes+x,index); + SetPixelRGBO(q,image->colormap+(ssize_t) index); + if (bit) + bit-=bits_per_pixel; + else + { + ptr++; + bit=8-bits_per_pixel; + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (flags & PALM_HAS_TRANSPARENCY_FLAG) + { + IndexPacket index=ConstrainColormapIndex(image,(mask-transparentIndex)); + if (bits_per_pixel != 16) + SetMagickPixelPacket(image,image->colormap+(ssize_t) index, + (const IndexPacket *) NULL,&transpix); + (void) TransparentPaintImage(image,&transpix,(Quantum) + TransparentOpacity,MagickFalse); + } + one_row=(unsigned char *) RelinquishMagickMemory(one_row); + if (compressionType == PALM_COMPRESSION_SCANLINE) + last_row=(unsigned char *) RelinquishMagickMemory(last_row); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. Copied from coders/pnm.c + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (nextDepthOffset != 0) + { + /* + Skip to next image. + */ + totalOffset+=(MagickOffsetType) (nextDepthOffset*4); + if (totalOffset >= (MagickOffsetType) GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader") + else + seekNextDepth=SeekBlob(image,totalOffset,SEEK_SET); + if (seekNextDepth != totalOffset) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + /* + Allocate next image structure. Copied from coders/pnm.c + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while (nextDepthOffset != 0); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P A L M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPALMImage() adds properties for the PALM image format to the list of +% supported formats. The properties include the image format tag, a method to +% read and/or write the format, whether the format supports the saving of more +% than one frame to the same file or blob, whether the format supports native +% in-memory I/O, and a brief description of the format. +% +% The format of the RegisterPALMImage method is: +% +% size_t RegisterPALMImage(void) +% +*/ +ModuleExport size_t RegisterPALMImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PALM"); + entry->decoder=(DecodeImageHandler *) ReadPALMImage; + entry->encoder=(EncodeImageHandler *) WritePALMImage; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Palm pixmap"); + entry->magick_module=ConstantString("PALM"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P A L M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPALMImage() removes format registrations made by the PALM +% module from the list of supported formats. +% +% The format of the UnregisterPALMImage method is: +% +% UnregisterPALMImage(void) +% +*/ +ModuleExport void UnregisterPALMImage(void) +{ + (void) UnregisterMagickInfo("PALM"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P A L M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePALMImage() writes an image of raw bits in LSB order to a file. +% +% The format of the WritePALMImage method is: +% +% MagickBooleanType WritePALMImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: Specifies a pointer to an ImageInfo structure. +% +% o image: A pointer to a Image structure. +% +*/ +static MagickBooleanType WritePALMImage(const ImageInfo *image_info, + Image *image) +{ + int + bit; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + currentOffset, + offset, + scene; + + MagickSizeType + cc; + + PixelPacket + transpix; + + QuantizeInfo + *quantize_info; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *p; + + ssize_t + y; + + size_t + count, + bits_per_pixel, + bytes_per_row, + imageListLength, + nextDepthOffset, + one; + + unsigned char + byte, + color, + *last_row, + *one_row, + *ptr, + version; + + unsigned int + transparentIndex; + + unsigned short + color16, + flags; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=AcquireExceptionInfo(); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); + if (status == MagickFalse) + return(status); + quantize_info=AcquireQuantizeInfo(image_info); + flags=0; + currentOffset=0; + transparentIndex=0; + transpix.red=0; + transpix.green=0; + transpix.blue=0; + transpix.opacity=0; + one=1; + version=0; + scene=0; + imageListLength=GetImageListLength(image); + do + { + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + count=GetNumberColors(image,NULL,exception); + for (bits_per_pixel=1; (one << bits_per_pixel) < count; bits_per_pixel*=2) ; + if (bits_per_pixel > 16) + bits_per_pixel=16; + else + if (bits_per_pixel < 16) + (void) TransformImageColorspace(image,image->colorspace); + if (bits_per_pixel < 8) + { + (void) TransformImageColorspace(image,GRAYColorspace); + (void) SetImageType(image,PaletteType); + (void) SortColormapByIntensity(image); + } + if ((image->storage_class == PseudoClass) && (image->colors > 256)) + (void) SetImageStorageClass(image,DirectClass); + if (image->storage_class == PseudoClass) + flags|=PALM_HAS_COLORMAP_FLAG; + else + flags|=PALM_IS_DIRECT_COLOR; + (void) WriteBlobMSBShort(image,(unsigned short) image->columns); /* width */ + (void) WriteBlobMSBShort(image,(unsigned short) image->rows); /* height */ + bytes_per_row=((image->columns+(16/bits_per_pixel-1))/(16/ + bits_per_pixel))*2; + (void) WriteBlobMSBShort(image,(unsigned short) bytes_per_row); + if ((image_info->compression == RLECompression) || + (image_info->compression == FaxCompression)) + flags|=PALM_IS_COMPRESSED_FLAG; + (void) WriteBlobMSBShort(image, flags); + (void) WriteBlobByte(image,(unsigned char) bits_per_pixel); + if (bits_per_pixel > 1) + version=1; + if ((image_info->compression == RLECompression) || + (image_info->compression == FaxCompression)) + version=2; + (void) WriteBlobByte(image,version); + (void) WriteBlobMSBShort(image,0); /* nextDepthOffset */ + (void) WriteBlobByte(image,(unsigned char) transparentIndex); + if (image_info->compression == RLECompression) + (void) WriteBlobByte(image,PALM_COMPRESSION_RLE); + else + if (image_info->compression == FaxCompression) + (void) WriteBlobByte(image,PALM_COMPRESSION_SCANLINE); + else + (void) WriteBlobByte(image,PALM_COMPRESSION_NONE); + (void) WriteBlobMSBShort(image,0); /* reserved */ + offset=16; + if (bits_per_pixel == 16) + { + (void) WriteBlobByte(image,5); /* # of bits of red */ + (void) WriteBlobByte(image,6); /* # of bits of green */ + (void) WriteBlobByte(image,5); /* # of bits of blue */ + (void) WriteBlobByte(image,0); /* reserved by Palm */ + (void) WriteBlobMSBLong(image,0); /* no transparent color, YET */ + offset+=8; + } + if (bits_per_pixel == 8) + { + if (flags & PALM_HAS_COLORMAP_FLAG) /* Write out colormap */ + { + quantize_info->dither=IsPaletteImage(image,&image->exception); + quantize_info->number_colors=image->colors; + (void) QuantizeImage(quantize_info,image); + (void) WriteBlobMSBShort(image,(unsigned short) image->colors); + for (count = 0; count < image->colors; count++) + { + (void) WriteBlobByte(image,(unsigned char) count); + (void) WriteBlobByte(image,ScaleQuantumToChar( + image->colormap[count].red)); + (void) WriteBlobByte(image, + ScaleQuantumToChar(image->colormap[count].green)); + (void) WriteBlobByte(image, + ScaleQuantumToChar(image->colormap[count].blue)); + } + offset+=2+count*4; + } + else /* Map colors to Palm standard colormap */ + { + Image + *affinity_image; + + affinity_image=ConstituteImage(256,1,"RGB",CharPixel,&PalmPalette, + exception); + (void) TransformImageColorspace(affinity_image, + affinity_image->colorspace); + (void) RemapImage(quantize_info,image,affinity_image); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetAuthenticPixels(image,0,y,image->columns,1,exception); + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,FindColor(&image->colormap[ + (ssize_t) GetPixelIndex(indexes+x)])); + } + affinity_image=DestroyImage(affinity_image); + } + } + if (flags & PALM_IS_COMPRESSED_FLAG) + (void) WriteBlobMSBShort(image,0); /* fill in size later */ + last_row=(unsigned char *) NULL; + if (image_info->compression == FaxCompression) + { + last_row=(unsigned char *) AcquireQuantumMemory(bytes_per_row+256, + sizeof(*last_row)); + if (last_row == (unsigned char *) NULL) + { + quantize_info=DestroyQuantizeInfo(quantize_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + one_row=(unsigned char *) AcquireQuantumMemory(bytes_per_row+256, + sizeof(*one_row)); + if (one_row == (unsigned char *) NULL) + { + if (last_row != (unsigned char *) NULL) + last_row=(unsigned char *) RelinquishMagickMemory(last_row); + quantize_info=DestroyQuantizeInfo(quantize_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (y=0; y < (ssize_t) image->rows; y++) + { + ptr=one_row; + (void) memset(ptr,0,bytes_per_row); + p=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (p == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + if (bits_per_pixel == 16) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + color16=(unsigned short) ((((31*(ssize_t) GetPixelRed(p))/ + (ssize_t) QuantumRange) << 11) | + (((63*(ssize_t) GetPixelGreen(p))/(ssize_t) QuantumRange) << 5) | + ((31*(ssize_t) GetPixelBlue(p))/(ssize_t) QuantumRange)); + if (GetPixelOpacity(p) == (Quantum) TransparentOpacity) + { + transpix.red=GetPixelRed(p); + transpix.green=GetPixelGreen(p); + transpix.blue=GetPixelBlue(p); + transpix.opacity=GetPixelOpacity(p); + flags|=PALM_HAS_TRANSPARENCY_FLAG; + } + *ptr++=(unsigned char) ((color16 >> 8) & 0xff); + *ptr++=(unsigned char) (color16 & 0xff); + p++; + } + } + else + { + byte=0x00; + bit=(unsigned char) (8-bits_per_pixel); + for (x=0; x < (ssize_t) image->columns; x++) + { + if (bits_per_pixel >= 8) + color=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + else + color=(unsigned char) (GetPixelIndex(indexes+x)* + ((one << bits_per_pixel)-1)/MagickMax(1*image->colors-1,1)); + byte|=color << bit; + if (bit != 0) + bit-=(unsigned char) bits_per_pixel; + else + { + *ptr++=byte; + byte=0x00; + bit=(unsigned char) (8-bits_per_pixel); + } + } + if ((image->columns % (8/bits_per_pixel)) != 0) + *ptr++=byte; + } + if (image_info->compression == RLECompression) + { + x=0; + while (x < (ssize_t) bytes_per_row) + { + byte=one_row[x]; + count=1; + while ((one_row[++x] == byte) && (count < 255) && + (x < (ssize_t) bytes_per_row)) + count++; + (void) WriteBlobByte(image,(unsigned char) count); + (void) WriteBlobByte(image,(unsigned char) byte); + } + } + else + if (image_info->compression == FaxCompression) + { + char + tmpbuf[8], + *tptr; + + for (x=0; x < (ssize_t) bytes_per_row; x+=8) + { + tptr = tmpbuf; + for (bit=0, byte=0; bit < (int) MagickMin(8L,(ssize_t) bytes_per_row-x); bit++) + { + if ((y == 0) || (last_row[x + bit] != one_row[x + bit])) + { + byte |= (1 << (7 - bit)); + *tptr++ = (char) one_row[x + bit]; + } + } + (void) WriteBlobByte(image, byte); + (void) WriteBlob(image,tptr-tmpbuf,(unsigned char *) tmpbuf); + } + (void) memcpy(last_row,one_row,bytes_per_row); + } + else + (void) WriteBlob(image,bytes_per_row,one_row); + } + if (flags & PALM_HAS_TRANSPARENCY_FLAG) + { + offset=SeekBlob(image,currentOffset+6,SEEK_SET); + (void) WriteBlobMSBShort(image,flags); + offset=SeekBlob(image,currentOffset+12,SEEK_SET); + (void) WriteBlobByte(image,(unsigned char) transparentIndex); /* trans index */ + } + if (bits_per_pixel == 16) + { + offset=SeekBlob(image,currentOffset+20,SEEK_SET); + (void) WriteBlobByte(image,0); /* reserved by Palm */ + (void) WriteBlobByte(image,(unsigned char) ((31*transpix.red)/ + QuantumRange)); + (void) WriteBlobByte(image,(unsigned char) ((63*transpix.green)/ + QuantumRange)); + (void) WriteBlobByte(image,(unsigned char) ((31*transpix.blue)/ + QuantumRange)); + } + if (flags & PALM_IS_COMPRESSED_FLAG) /* fill in size now */ + { + offset=SeekBlob(image,currentOffset+offset,SEEK_SET); + (void) WriteBlobMSBShort(image,(unsigned short) (GetBlobSize(image)- + currentOffset-offset)); + } + if (one_row != (unsigned char *) NULL) + one_row=(unsigned char *) RelinquishMagickMemory(one_row); + if (last_row != (unsigned char *) NULL) + last_row=(unsigned char *) RelinquishMagickMemory(last_row); + if (GetNextImageInList(image) == (Image *) NULL) + break; + /* padding to 4 byte word */ + for (cc=(GetBlobSize(image)) % 4; cc > 0; cc--) + (void) WriteBlobByte(image,0); + /* write nextDepthOffset and return to end of image */ + (void) SeekBlob(image,currentOffset+10,SEEK_SET); + nextDepthOffset=(size_t) ((GetBlobSize(image)-currentOffset)/4); + (void) WriteBlobMSBShort(image,(unsigned short) nextDepthOffset); + currentOffset=(MagickOffsetType) GetBlobSize(image); + (void) SeekBlob(image,currentOffset,SEEK_SET); + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + quantize_info=DestroyQuantizeInfo(quantize_info); + (void) CloseBlob(image); + (void) DestroyExceptionInfo(exception); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/pango.c b/ImageMagick-6.9.12-44/coders/pango.c new file mode 100644 index 0000000..fa819a3 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pango.c @@ -0,0 +1,558 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP AAA N N GGGG OOO % +% P P A A NN N G O O % +% PPPP AAAAA N N N G GGG O O % +% P A A N NN G G O O % +% P A A N N GGGG OOO % +% % +% % +% Read Pango Markup Language Format % +% % +% Software Design % +% Cristy % +% March 2012 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/annotate.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/composite-private.h" +#include "magick/draw.h" +#include "magick/draw-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/token.h" +#include "magick/utility.h" +#if defined(MAGICKCORE_PANGOCAIRO_DELEGATE) +#include +#include +#include +#endif + +/* + Define declarations. +*/ +#define DefaultPANGODensity 96.0 + +#if defined(MAGICKCORE_PANGOCAIRO_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P A N G O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPANGOImage() reads an image in the Pango Markup Language Format. +% +% The format of the ReadPANGOImage method is: +% +% Image *ReadPANGOImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadPANGOImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + cairo_font_options_t + *font_options; + + cairo_surface_t + *surface; + + char + *caption, + *property; + + cairo_t + *cairo_image; + + const char + *option; + + DrawInfo + *draw_info; + + Image + *image; + + MagickBooleanType + status; + + MemoryInfo + *pixel_info; + + PangoAlignment + align; + + PangoContext + *context; + + PangoFontDescription + *description; + + PangoFontMap + *fontmap; + + PangoGravity + gravity; + + PangoLayout + *layout; + + PangoRectangle + extent; + + PixelPacket + fill_color; + + RectangleInfo + page; + + unsigned char + *p; + + size_t + stride; + + ssize_t + y; + + unsigned char + *pixels; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + (void) ResetImagePage(image,"0x0+0+0"); + if ((image->columns != 0) && (image->rows != 0)) + (void) SetImageBackgroundColor(image); + /* + Format caption. + */ + option=GetImageOption(image_info,"filename"); + if (option == (const char *) NULL) + property=InterpretImageProperties(image_info,image,image_info->filename); + else + if (LocaleNCompare(option,"pango:",6) == 0) + property=InterpretImageProperties(image_info,image,option+6); + else + property=InterpretImageProperties(image_info,image,option); + if (property != (char *) NULL) + { + (void) SetImageProperty(image,"caption",property); + property=DestroyString(property); + } + caption=ConstantString(GetImageProperty(image,"caption")); + /* + Get context. + */ + fontmap=pango_cairo_font_map_new(); + pango_cairo_font_map_set_resolution(PANGO_CAIRO_FONT_MAP(fontmap), + image->x_resolution == 0.0 ? DefaultPANGODensity : image->x_resolution); + font_options=cairo_font_options_create(); + option=GetImageOption(image_info,"pango:hinting"); + if (option != (const char *) NULL) + { + if (LocaleCompare(option,"none") != 0) + cairo_font_options_set_hint_style(font_options,CAIRO_HINT_STYLE_NONE); + if (LocaleCompare(option,"full") != 0) + cairo_font_options_set_hint_style(font_options,CAIRO_HINT_STYLE_FULL); + } + context=pango_font_map_create_context(fontmap); + pango_cairo_context_set_font_options(context,font_options); + cairo_font_options_destroy(font_options); + option=GetImageOption(image_info,"pango:language"); + if (option != (const char *) NULL) + pango_context_set_language(context,pango_language_from_string(option)); + draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL); + pango_context_set_base_dir(context,draw_info->direction == + RightToLeftDirection ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR); + switch (draw_info->gravity) + { + case NorthGravity: + { + gravity=PANGO_GRAVITY_NORTH; + break; + } + case NorthWestGravity: + case WestGravity: + case SouthWestGravity: + { + gravity=PANGO_GRAVITY_WEST; + break; + } + case NorthEastGravity: + case EastGravity: + case SouthEastGravity: + { + gravity=PANGO_GRAVITY_EAST; + break; + } + case SouthGravity: + { + gravity=PANGO_GRAVITY_SOUTH; + break; + } + default: + { + gravity=PANGO_GRAVITY_AUTO; + break; + } + } + pango_context_set_base_gravity(context,gravity); + option=GetImageOption(image_info,"pango:gravity-hint"); + if (option != (const char *) NULL) + { + if (LocaleCompare(option,"line") == 0) + pango_context_set_gravity_hint(context,PANGO_GRAVITY_HINT_LINE); + if (LocaleCompare(option,"natural") == 0) + pango_context_set_gravity_hint(context,PANGO_GRAVITY_HINT_NATURAL); + if (LocaleCompare(option,"strong") == 0) + pango_context_set_gravity_hint(context,PANGO_GRAVITY_HINT_STRONG); + } + /* + Configure layout. + */ + layout=pango_layout_new(context); + option=GetImageOption(image_info,"pango:auto-dir"); + if (option != (const char *) NULL) + pango_layout_set_auto_dir(layout,1); + option=GetImageOption(image_info,"pango:ellipsize"); + if (option != (const char *) NULL) + { + if (LocaleCompare(option,"end") == 0) + pango_layout_set_ellipsize(layout,PANGO_ELLIPSIZE_END); + if (LocaleCompare(option,"middle") == 0) + pango_layout_set_ellipsize(layout,PANGO_ELLIPSIZE_MIDDLE); + if (LocaleCompare(option,"none") == 0) + pango_layout_set_ellipsize(layout,PANGO_ELLIPSIZE_NONE); + if (LocaleCompare(option,"start") == 0) + pango_layout_set_ellipsize(layout,PANGO_ELLIPSIZE_START); + } + option=GetImageOption(image_info,"pango:justify"); + if ((option != (const char *) NULL) && (IsMagickTrue(option) != MagickFalse)) + pango_layout_set_justify(layout,1); + option=GetImageOption(image_info,"pango:single-paragraph"); + if ((option != (const char *) NULL) && (IsMagickTrue(option) != MagickFalse)) + pango_layout_set_single_paragraph_mode(layout,1); + option=GetImageOption(image_info,"pango:wrap"); + if (option != (const char *) NULL) + { + if (LocaleCompare(option,"char") == 0) + pango_layout_set_wrap(layout,PANGO_WRAP_CHAR); + if (LocaleCompare(option,"word") == 0) + pango_layout_set_wrap(layout,PANGO_WRAP_WORD); + if (LocaleCompare(option,"word-char") == 0) + pango_layout_set_wrap(layout,PANGO_WRAP_WORD_CHAR); + } + option=GetImageOption(image_info,"pango:indent"); + if (option != (const char *) NULL) + pango_layout_set_indent(layout,(int) ((StringToLong(option)* + (image->x_resolution == 0.0 ? DefaultPANGODensity : image->x_resolution)* + PANGO_SCALE+DefaultPANGODensity/2)/DefaultPANGODensity+0.5)); + switch (draw_info->align) + { + case CenterAlign: align=PANGO_ALIGN_CENTER; break; + case RightAlign: align=PANGO_ALIGN_RIGHT; break; + case LeftAlign: align=PANGO_ALIGN_LEFT; break; + default: + { + if (draw_info->gravity == CenterGravity) + { + align=PANGO_ALIGN_CENTER; + break; + } + align=PANGO_ALIGN_LEFT; + break; + } + } + if ((align != PANGO_ALIGN_CENTER) && + (draw_info->direction == RightToLeftDirection)) + align=(PangoAlignment) (PANGO_ALIGN_LEFT+PANGO_ALIGN_RIGHT-align); + option=GetImageOption(image_info,"pango:align"); + if (option != (const char *) NULL) + { + if (LocaleCompare(option,"center") == 0) + align=PANGO_ALIGN_CENTER; + if (LocaleCompare(option,"left") == 0) + align=PANGO_ALIGN_LEFT; + if (LocaleCompare(option,"right") == 0) + align=PANGO_ALIGN_RIGHT; + } + pango_layout_set_alignment(layout,align); + if (draw_info->font == (char *) NULL) + description=pango_font_description_new(); + else + description=pango_font_description_from_string(draw_info->font); + pango_font_description_set_size(description,(int) (PANGO_SCALE* + draw_info->pointsize+0.5)); + pango_layout_set_font_description(layout,description); + pango_font_description_free(description); + option=GetImageOption(image_info,"pango:markup"); + if ((option != (const char *) NULL) && (IsMagickTrue(option) == MagickFalse)) + pango_layout_set_text(layout,caption,-1); + else + { + GError + *error; + + error=(GError *) NULL; + if (pango_parse_markup(caption,-1,0,NULL,NULL,NULL,&error) == 0) + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + error->message,"`%s'",image_info->filename); + pango_layout_set_markup(layout,caption,-1); + } + pango_layout_context_changed(layout); + page.x=0; + page.y=0; + if (image_info->page != (char *) NULL) + (void) ParseAbsoluteGeometry(image_info->page,&page); + if (image->columns == 0) + { + pango_layout_get_extents(layout,NULL,&extent); + image->columns=(extent.x+extent.width+PANGO_SCALE/2)/PANGO_SCALE+2*page.x; + } + else + { + image->columns-=2*page.x; + pango_layout_set_width(layout,(int) ((PANGO_SCALE*image->columns* + (image->x_resolution == 0.0 ? DefaultPANGODensity : + image->x_resolution)+DefaultPANGODensity/2)/DefaultPANGODensity+0.5)); + } + if (image->rows == 0) + { + pango_layout_get_extents(layout,NULL,&extent); + image->rows=(extent.y+extent.height+PANGO_SCALE/2)/PANGO_SCALE+2*page.y; + } + else + { + image->rows-=2*page.y; + pango_layout_set_height(layout,(int) ((PANGO_SCALE*image->rows* + (image->y_resolution == 0.0 ? DefaultPANGODensity : + image->y_resolution)+DefaultPANGODensity/2)/DefaultPANGODensity+0.5)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Render markup. + */ + stride=(size_t) cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32,(int) + image->columns); + pixel_info=AcquireVirtualMemory(image->rows,stride*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + { + draw_info=DestroyDrawInfo(draw_info); + caption=DestroyString(caption); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + surface=cairo_image_surface_create_for_data(pixels,CAIRO_FORMAT_ARGB32, + (int) image->columns,(int) image->rows,(int) stride); + cairo_image=cairo_create(surface); + cairo_set_operator(cairo_image,CAIRO_OPERATOR_CLEAR); + cairo_paint(cairo_image); + cairo_set_operator(cairo_image,CAIRO_OPERATOR_OVER); + cairo_translate(cairo_image,page.x,page.y); + cairo_set_source_rgba(cairo_image,QuantumScale*draw_info->fill.red, + QuantumScale*draw_info->fill.green,QuantumScale*draw_info->fill.blue, + QuantumScale*(QuantumRange-draw_info->fill.opacity)); + pango_cairo_show_layout(cairo_image,layout); + cairo_destroy(cairo_image); + cairo_surface_destroy(surface); + g_object_unref(layout); + g_object_unref(fontmap); + /* + Convert surface to image. + */ + (void) SetImageBackgroundColor(image); + p=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *q; + + ssize_t + x; + + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + double + gamma; + + fill_color.blue=ScaleCharToQuantum(*p++); + fill_color.green=ScaleCharToQuantum(*p++); + fill_color.red=ScaleCharToQuantum(*p++); + fill_color.opacity=QuantumRange-ScaleCharToQuantum(*p++); + /* + Disassociate alpha. + */ + gamma=1.0-QuantumScale*fill_color.opacity; + gamma=PerceptibleReciprocal(gamma); + fill_color.blue*=gamma; + fill_color.green*=gamma; + fill_color.red*=gamma; + MagickCompositeOver(&fill_color,fill_color.opacity,q,(MagickRealType) + q->opacity,q); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + /* + Relinquish resources. + */ + pixel_info=RelinquishVirtualMemory(pixel_info); + draw_info=DestroyDrawInfo(draw_info); + caption=DestroyString(caption); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P A N G O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPANGOImage() adds attributes for the Pango Markup Language format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPANGOImage method is: +% +% size_t RegisterPANGOImage(void) +% +*/ +ModuleExport size_t RegisterPANGOImage(void) +{ + char + version[MaxTextExtent]; + + MagickInfo + *entry; + + *version='\0'; +#if defined(PANGO_VERSION_STRING) + (void) FormatLocaleString(version,MaxTextExtent,"Pangocairo %s", + PANGO_VERSION_STRING); +#endif + entry=SetMagickInfo("PANGO"); +#if defined(MAGICKCORE_PANGOCAIRO_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadPANGOImage; +#endif + entry->description=ConstantString("Pango Markup Language"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->adjoin=MagickFalse; + entry->thread_support=MagickFalse; + entry->magick_module=ConstantString("PANGO"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P A N G O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPANGOImage() removes format registrations made by the Pango module +% from the list of supported formats. +% +% The format of the UnregisterPANGOImage method is: +% +% UnregisterPANGOImage(void) +% +*/ +ModuleExport void UnregisterPANGOImage(void) +{ + (void) UnregisterMagickInfo("PANGO"); +} diff --git a/ImageMagick-6.9.12-44/coders/pattern.c b/ImageMagick-6.9.12-44/coders/pattern.c new file mode 100644 index 0000000..22f3a8a --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pattern.c @@ -0,0 +1,1054 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP AAA TTTTT TTTTT EEEEE RRRR N N % +% P P A A T T E R R NN N % +% PPPP AAAAA T T EEE RRRR N N N % +% P A A T T E R R N NN % +% P A A T T EEEEE R R N N % +% % +% % +% Read/Write Pattern Image Format % +% % +% Software Design % +% Cristy % +% May 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Bricks pattern. +*/ +static const unsigned char + BricksImage[] = + { + 0x50, 0x34, 0x0A, 0x31, 0x36, 0x20, 0x31, 0x36, 0x0A, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xFF, + 0xFF, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x00, 0xFF, 0xFF + }; + +/* + Checkerboard pattern. +*/ +static const unsigned char + CheckerboardImage[]= + { + 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x1E, 0x00, 0x1E, 0x00, 0xF0, 0x01, + 0x00, 0x66, 0x66, 0x66, 0x99, 0x99, 0x99, 0x21, 0xF9, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x00, + 0x00, 0x02, 0x42, 0x8C, 0x8F, 0x09, 0xCB, 0xED, 0x09, 0x91, 0x9B, 0x2D, + 0x5A, 0x8A, 0x6D, 0xC4, 0x54, 0x43, 0x3E, 0x79, 0x0A, 0x58, 0x89, 0x07, + 0x59, 0x9A, 0x01, 0xCA, 0xA8, 0x06, 0xBB, 0xB8, 0x2B, 0x2C, 0xC3, 0x40, + 0x4D, 0xBB, 0x36, 0xCE, 0xF2, 0x36, 0xEA, 0x23, 0x05, 0x41, 0x43, 0x4E, + 0x31, 0xA3, 0xCB, 0xA9, 0x76, 0xC9, 0x5E, 0x13, 0xF8, 0x14, 0x46, 0x89, + 0x53, 0x63, 0x15, 0xB9, 0x54, 0x9A, 0x98, 0xAA, 0x02, 0x00, 0x3B + }; + +/* + Circles pattern. +*/ +static const unsigned char + CirclesImage[] = + { + 0x50, 0x34, 0x0A, 0x31, 0x36, 0x20, 0x31, 0x36, 0x0A, 0x07, 0xF0, 0x18, + 0x0C, 0x20, 0x02, 0x40, 0x01, 0x40, 0x01, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x01, 0x40, + 0x01, 0x20, 0x02, 0x18, 0x0C + }; + +/* + CrossHatch pattern. +*/ +static const unsigned char + CrossHatchImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x34, 0x0A, 0xFF, 0x11, 0x11, 0x11 + }; + +/* + CrossHatch30 pattern. +*/ +static const unsigned char + CrossHatch30Image[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x34, 0x0A, 0x81, 0x66, 0x18, 0x66 + }; + +/* + CrossHatch45 pattern. +*/ +static const unsigned char + CrossHatch45Image[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x88, 0x50, 0x20, 0x50, 0x88, + 0x05, 0x02, 0x05 + }; + +/* + FishScales pattern. +*/ +static const unsigned char + FishScalesImage[] = + { + 0x50, 0x34, 0x0A, 0x31, 0x36, 0x20, 0x38, 0x0A, 0x02, 0x40, 0x0C, 0x30, + 0x70, 0x0E, 0x80, 0x01, 0x40, 0x02, 0x30, 0x0C, 0x0E, 0x70, 0x01, 0x80 + }; + +/* + Gray100 pattern. +*/ +static const unsigned char + Gray100Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 + }; + +/* + Gray95 pattern. +*/ +static const unsigned char + Gray95Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x10, 0x10, 0x10 + }; + +/* + Gray90 pattern. +*/ +static const unsigned char + Gray90Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0x08, 0x08, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x88, 0x80, 0x88, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0x80, 0x88, 0x00, 0x00, 0x00, + 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, + 0x22, 0x00, 0x00, 0x00, 0x00 + }; + +/* + Gray85 pattern. +*/ +static const unsigned char + Gray85Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x8A, 0x88, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, + 0x22, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xA8, 0xA8, 0xA8, 0x00, 0x00, 0x00, + 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x88, 0x8A, + 0x88, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, + 0x00, 0xA8, 0xA8, 0xA8, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x88, 0x8A, 0x88, 0x8A, 0x00, 0x00, 0x00, + 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xA8, 0xA8, + 0xA8, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, + 0x00, 0x8A, 0x88, 0x8A, 0x88, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, + 0x22, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xA8, 0xA8, 0xA8, 0x00, 0x00, 0x00, + 0x00, 0x22, 0x22, 0x22, 0x22 + }; + +/* + Gray80 pattern. +*/ +static const unsigned char + Gray80Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x51, 0x11, 0x51, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, + 0x55, 0x00, 0x00, 0x00, 0x00, 0x51, 0x51, 0x51, 0x51, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, + 0x00, 0x51, 0x11, 0x51, 0x11, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, + 0x55, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x51, 0x51, 0x51, + 0x51, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x11, 0x11, 0x11 + }; + +/* + Gray75 pattern. +*/ +static const unsigned char + Gray75Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xAA, 0xAA, 0xAA, + 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, + 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, + 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, + 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, + 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, + 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, + 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, + 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, + 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, + 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, + 0xAA, 0x00, 0x00, 0x00, 0x00 + }; + +/* + Gray70 pattern. +*/ +static const unsigned char + Gray70Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xAA, 0xAA, 0xAA, + 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x11, 0x11, 0x11, + 0x11, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, + 0xAA, 0x01, 0x01, 0x01, 0x01, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, + 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x11, 0x11, 0x11, 0x11, 0xAA, 0xAA, 0xAA, + 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x11, 0x01, 0x11, + 0x01, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, + 0xAA, 0x11, 0x11, 0x11, 0x11, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, + 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x01, 0x01, 0x01, 0x01, 0xAA, 0xAA, 0xAA, + 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0x11, 0x11, 0x11, + 0x11, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, + 0xAA, 0x11, 0x01, 0x11, 0x01 + }; + +/* + Gray65 pattern. +*/ +static const unsigned char + Gray65Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0x44, 0x44, 0x44, + 0x44, 0xAA, 0xAA, 0xAA, 0xAA, 0x01, 0x01, 0x01, 0x01, 0xAA, 0xAA, 0xAA, + 0xAA, 0x44, 0x44, 0x44, 0x44, 0xAA, 0xAA, 0xAA, 0xAA, 0x11, 0x10, 0x11, + 0x10, 0xAA, 0xAA, 0xAA, 0xAA, 0x44, 0x44, 0x44, 0x44, 0xAA, 0xAA, 0xAA, + 0xAA, 0x01, 0x01, 0x01, 0x01, 0xAA, 0xAA, 0xAA, 0xAA, 0x44, 0x44, 0x44, + 0x44, 0xAA, 0xAA, 0xAA, 0xAA, 0x10, 0x10, 0x10, 0x10, 0xAA, 0xAA, 0xAA, + 0xAA, 0x44, 0x44, 0x44, 0x44, 0xAA, 0xAA, 0xAA, 0xAA, 0x01, 0x01, 0x01, + 0x01, 0xAA, 0xAA, 0xAA, 0xAA, 0x44, 0x44, 0x44, 0x44, 0xAA, 0xAA, 0xAA, + 0xAA, 0x11, 0x10, 0x11, 0x10, 0xAA, 0xAA, 0xAA, 0xAA, 0x44, 0x44, 0x44, + 0x44, 0xAA, 0xAA, 0xAA, 0xAA, 0x01, 0x01, 0x01, 0x01, 0xAA, 0xAA, 0xAA, + 0xAA, 0x44, 0x44, 0x44, 0x44, 0xAA, 0xAA, 0xAA, 0xAA, 0x10, 0x10, 0x10, + 0x10, 0xAA, 0xAA, 0xAA, 0xAA + }; + +/* + Gray60 pattern. +*/ +static const unsigned char + Gray60Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0x11, 0x11, 0x11, + 0x11, 0xAA, 0xAA, 0xAA, 0xAA, 0x44, 0x45, 0x44, 0x45, 0xAA, 0xAA, 0xAA, + 0xAA, 0x11, 0x11, 0x11, 0x11, 0xAA, 0xAA, 0xAA, 0xAA, 0x54, 0x54, 0x54, + 0x54, 0xAA, 0xAA, 0xAA, 0xAA, 0x11, 0x11, 0x11, 0x11, 0xAA, 0xAA, 0xAA, + 0xAA, 0x45, 0x44, 0x45, 0x44, 0xAA, 0xAA, 0xAA, 0xAA, 0x11, 0x11, 0x11, + 0x11, 0xAA, 0xAA, 0xAA, 0xAA, 0x54, 0x54, 0x54, 0x54, 0xAA, 0xAA, 0xAA, + 0xAA, 0x11, 0x11, 0x11, 0x11, 0xAA, 0xAA, 0xAA, 0xAA, 0x44, 0x45, 0x44, + 0x45, 0xAA, 0xAA, 0xAA, 0xAA, 0x11, 0x11, 0x11, 0x11, 0xAA, 0xAA, 0xAA, + 0xAA, 0x54, 0x54, 0x54, 0x54, 0xAA, 0xAA, 0xAA, 0xAA, 0x11, 0x11, 0x11, + 0x11, 0xAA, 0xAA, 0xAA, 0xAA, 0x45, 0x44, 0x45, 0x44, 0xAA, 0xAA, 0xAA, + 0xAA, 0x11, 0x11, 0x11, 0x11, 0xAA, 0xAA, 0xAA, 0xAA, 0x54, 0x54, 0x54, + 0x54, 0xAA, 0xAA, 0xAA, 0xAA + }; + +/* + Gray55 pattern. +*/ +static const unsigned char + Gray55Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0x55, 0x55, 0x55, + 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0x2A, 0x2A, 0x2A, + 0x2A, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0x22, 0x22, 0x22, 0x22, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55, 0x22, 0x2A, 0x22, 0x2A, 0x55, 0x55, 0x55, + 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0x22, 0x22, 0x22, + 0x22, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0x2A, 0x2A, 0x2A, 0x2A, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55, 0x22, 0x22, 0x22, 0x22, 0x55, 0x55, 0x55, + 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0x22, 0x2A, 0x22, + 0x2A, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0x22, 0x22, 0x22, 0x22 + }; + +/* + Gray50 pattern. +*/ +static const unsigned char + Gray50Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55 + }; + +/* + Gray45 pattern. +*/ +static const unsigned char + Gray45Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xBB, 0xBB, 0xBB, + 0xBB, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0xAB, 0xAB, 0xAB, 0xAB, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55, 0xBB, 0xBB, 0xBB, 0xBB, 0x55, 0x55, 0x55, + 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xBB, 0xAB, 0xBB, + 0xAB, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0xBB, 0xBB, 0xBB, 0xBB, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAB, 0xAB, 0xAB, 0xAB, 0x55, 0x55, 0x55, + 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xBB, 0xBB, 0xBB, + 0xBB, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, + 0x55, 0xBB, 0xAB, 0xBB, 0xAB, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, + 0xAA, 0x55, 0x55, 0x55, 0x55 + }; + +/* + Gray40 pattern. +*/ +static const unsigned char + Gray40Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xEE, 0xEE, 0xEE, + 0xEE, 0x55, 0x55, 0x55, 0x55, 0xAB, 0xAB, 0xAB, 0xAB, 0x55, 0x55, 0x55, + 0x55, 0xEE, 0xEE, 0xEE, 0xEE, 0x55, 0x55, 0x55, 0x55, 0xBB, 0xBA, 0xBB, + 0xBA, 0x55, 0x55, 0x55, 0x55, 0xEE, 0xEE, 0xEE, 0xEE, 0x55, 0x55, 0x55, + 0x55, 0xAB, 0xAB, 0xAB, 0xAB, 0x55, 0x55, 0x55, 0x55, 0xEE, 0xEE, 0xEE, + 0xEE, 0x55, 0x55, 0x55, 0x55, 0xBA, 0xBB, 0xBA, 0xBB, 0x55, 0x55, 0x55, + 0x55, 0xEE, 0xEE, 0xEE, 0xEE, 0x55, 0x55, 0x55, 0x55, 0xAB, 0xAB, 0xAB, + 0xAB, 0x55, 0x55, 0x55, 0x55, 0xEE, 0xEE, 0xEE, 0xEE, 0x55, 0x55, 0x55, + 0x55, 0xBB, 0xBA, 0xBB, 0xBA, 0x55, 0x55, 0x55, 0x55, 0xEE, 0xEE, 0xEE, + 0xEE, 0x55, 0x55, 0x55, 0x55, 0xAB, 0xAB, 0xAB, 0xAB, 0x55, 0x55, 0x55, + 0x55, 0xEE, 0xEE, 0xEE, 0xEE, 0x55, 0x55, 0x55, 0x55, 0xBA, 0xBB, 0xBA, + 0xBB, 0x55, 0x55, 0x55, 0x55 + }; + +/* + Gray35 pattern. +*/ +static const unsigned char + Gray35Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xAA, 0xAA, 0xAA, + 0xAA, 0xDD, 0xDD, 0xDD, 0xDD, 0xAA, 0xAA, 0xAA, 0xAA, 0x7F, 0x7F, 0x7F, + 0x7F, 0xAA, 0xAA, 0xAA, 0xAA, 0xDD, 0xDD, 0xDD, 0xDD, 0xAA, 0xAA, 0xAA, + 0xAA, 0x77, 0xF7, 0x77, 0xF7, 0xAA, 0xAA, 0xAA, 0xAA, 0xDD, 0xDD, 0xDD, + 0xDD, 0xAA, 0xAA, 0xAA, 0xAA, 0x7F, 0x7F, 0x7F, 0x7F, 0xAA, 0xAA, 0xAA, + 0xAA, 0xDD, 0xDD, 0xDD, 0xDD, 0xAA, 0xAA, 0xAA, 0xAA, 0xF7, 0xF7, 0xF7, + 0xF7, 0xAA, 0xAA, 0xAA, 0xAA, 0xDD, 0xDD, 0xDD, 0xDD, 0xAA, 0xAA, 0xAA, + 0xAA, 0x7F, 0x7F, 0x7F, 0x7F, 0xAA, 0xAA, 0xAA, 0xAA, 0xDD, 0xDD, 0xDD, + 0xDD, 0xAA, 0xAA, 0xAA, 0xAA, 0x77, 0xF7, 0x77, 0xF7, 0xAA, 0xAA, 0xAA, + 0xAA, 0xDD, 0xDD, 0xDD, 0xDD, 0xAA, 0xAA, 0xAA, 0xAA, 0x7F, 0x7F, 0x7F, + 0x7F, 0xAA, 0xAA, 0xAA, 0xAA, 0xDD, 0xDD, 0xDD, 0xDD, 0xAA, 0xAA, 0xAA, + 0xAA, 0xF7, 0xF7, 0xF7, 0xF7 + }; + +/* + Gray30 pattern. +*/ +static const unsigned char + Gray30Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xFF, 0xFF, 0xFF, + 0xFF, 0x55, 0x55, 0x55, 0x55, 0xEE, 0xEE, 0xEE, 0xEE, 0x55, 0x55, 0x55, + 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, 0x55, 0xEE, 0xFE, 0xEE, + 0xFE, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, + 0x55, 0xEE, 0xEE, 0xEE, 0xEE, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, + 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFE, 0xFE, 0xFE, 0xFE, 0x55, 0x55, 0x55, + 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, 0x55, 0xEE, 0xEE, 0xEE, + 0xEE, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, + 0x55, 0xEE, 0xFE, 0xEE, 0xFE, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, + 0xFF, 0x55, 0x55, 0x55, 0x55, 0xEE, 0xEE, 0xEE, 0xEE, 0x55, 0x55, 0x55, + 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFE, 0xFE, 0xFE, + 0xFE, 0x55, 0x55, 0x55, 0x55 + }; + +/* + Gray25 pattern. +*/ +static const unsigned char + Gray25Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xFF, 0xFF, 0xFF, + 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, + 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, + 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, + 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, + 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, + 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, + 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, + 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, + 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, + 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, + 0xFF, 0x55, 0x55, 0x55, 0x55 + }; + +/* + Gray20 pattern. +*/ +static const unsigned char + Gray20Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xAA, 0xAA, 0xAA, + 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBB, 0xBB, 0xBB, 0xFF, 0xFF, 0xFF, + 0xFF, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xBB, 0xBA, + 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBB, 0xBB, 0xBB, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA, 0xAA, + 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xBA, 0xBA, 0xBA, 0xFF, 0xFF, 0xFF, + 0xFF, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBB, 0xBB, + 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBA, 0xBB, 0xBA, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA, 0xAA, + 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBB, 0xBB, 0xBB, 0xFF, 0xFF, 0xFF, + 0xFF, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xBA, 0xBA, + 0xBA, 0xFF, 0xFF, 0xFF, 0xFF + }; + +/* + Gray15 pattern. +*/ +static const unsigned char + Gray15Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0x77, 0x77, 0x77, + 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0x5D, 0x5D, 0x5D, 0xFF, 0xFF, 0xFF, + 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0xDD, 0xD5, + 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, + 0xFF, 0xDD, 0x5D, 0x5D, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x77, 0x77, + 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xD5, 0xDD, 0xD5, 0xFF, 0xFF, 0xFF, + 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0x5D, 0x5D, + 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, + 0xFF, 0xD5, 0xDD, 0xD5, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x77, 0x77, + 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0x5D, 0x5D, 0x5D, 0xFF, 0xFF, 0xFF, + 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xD5, 0xDD, + 0xD5, 0xFF, 0xFF, 0xFF, 0xFF + }; + +/* + Gray10 pattern. +*/ +static const unsigned char + Gray10Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xFF, 0xFF, 0xFF, + 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFD, 0xDD, 0xFD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x77, 0x77, + 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFD, 0xFD, + 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, + 0xFF, 0xDF, 0xDF, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x77, 0x77, + 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, 0xFD, 0xDD, 0xFF, 0xFF, 0xFF, + 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFD, 0xFD, 0xFD, 0xFD + }; + +/* + Gray5 pattern. +*/ +static const unsigned char + Gray5Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xDD, 0xDD, + 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xDF, 0xDF, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xDD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xDD, 0xDD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xDD, 0xDD, + 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xDF, 0xDF, 0xDF, 0xDF + }; + +/* + Gray0 pattern. +*/ +static const unsigned char + Gray0Image[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x32, 0x20, 0x33, 0x32, 0x0A, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + }; + +/* + Hexagons pattern. +*/ +static const unsigned char + HexagonsImage[] = + { + 0x50, 0x34, 0x0A, 0x33, 0x30, 0x20, 0x31, 0x38, 0x0A, 0x10, 0x01, 0x00, + 0x00, 0x10, 0x01, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x20, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x20, + 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x80, 0x00, 0x20, + 0x00, 0x80, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, + 0x00, 0x20, 0x00, 0x80, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x01, 0x00, + 0x00, 0x10, 0x01, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00 + }; + +/* + Horizontal pattern. +*/ +static const unsigned char + HorizontalImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x34, 0x0A, 0xFF, 0x00, 0x00, 0x00 + }; + +/* + Horizontal-2 pattern. +*/ +static const unsigned char + Horizontal2Image[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0x00 + }; + +/* + Horizontal-3 pattern. +*/ +static const unsigned char + Horizontal3Image[] = + { + 0x50, 0x34, 0x0A, 0x39, 0x20, 0x39, 0x0A, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0x80 + }; + +/* + HorizontalSaw pattern. +*/ +static const unsigned char + HorizontalSawImage[] = + { + 0x50, 0x34, 0x0A, 0x31, 0x36, 0x20, 0x38, 0x0A, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x82, 0x82, 0x01, 0x01 + }; + +/* + HS_BDIAGONAL pattern (Windows GDI HS_BDIAGONAL) +*/ +static const unsigned char + HS_BDIAGONALImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x01, 0x02, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x80 + }; + +/* + HS_CROSS pattern (Windows GDI HS_CROSS) +*/ +static const unsigned char + HS_CROSSImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x10, 0x10, 0x10, 0xFF, 0x10, + 0x10, 0x10, 0x10 + }; + +/* + HS_DIAGCROSS pattern (Windows GDI HS_DIAGCROSS) +*/ +static const unsigned char + HS_DIAGCROSSImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x81, 0x42, 0x24, 0x18, 0x18, + 0x24, 0x42, 0x81 + }; + +/* + HS_FDIAGONAL pattern (Windows GDI HS_FDIAGONAL) +*/ +static const unsigned char + HS_FDIAGONALImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x80, 0x40, 0x20, 0x10, 0x08, + 0x04, 0x02, 0x01 + }; + +/* + HS_HORIZONTAL pattern (Windows GDI HS_HORIZONTAL) +*/ +static const unsigned char + HS_HORIZONTALImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00 + }; + +/* + HS_VERTICAL pattern (Windows GDI HS_VERTICAL) +*/ +static const unsigned char + HS_VERTICALImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10 + }; + +/* + Left30 pattern. +*/ +static const unsigned char + Left30Image[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x34, 0x0A, 0xC0, 0x30, 0x0C, 0x03 + }; + +/* + Left45 pattern. +*/ +static const unsigned char + Left45Image[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x80, 0x40, 0x20, 0x10, 0x08, + 0x04, 0x02, 0x01 + }; + +/* + LeftShingle pattern. +*/ +static const unsigned char + LeftShingleImage[] = + { + 0x50, 0x34, 0x0A, 0x32, 0x34, 0x20, 0x32, 0x34, 0x0A, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0xFF, 0xFF, 0xFF + }; + +/* + Octagons image declaration. +*/ +static const unsigned char + OctagonsImage[] = + { + 0x50, 0x34, 0x0A, 0x31, 0x36, 0x20, 0x31, 0x36, 0x0A, 0x07, 0xF0, 0x08, + 0x08, 0x10, 0x04, 0x20, 0x02, 0x40, 0x01, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x01, 0x20, + 0x02, 0x10, 0x04, 0x08, 0x08 + }; + +/* + Right30 pattern. +*/ +static const unsigned char + Right30Image[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x34, 0x0A, 0x03, 0x0C, 0x30, 0xC0 + }; + +/* + Right45 pattern. +*/ +static const unsigned char + Right45Image[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x01, 0x02, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x80 + }; + +/* + RightShingle pattern. +*/ +static const unsigned char + RightShingleImage[] = + { + 0x50, 0x34, 0x0A, 0x32, 0x34, 0x20, 0x32, 0x34, 0x0A, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x08, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x08, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF + }; + +/* + SmallFishScales pattern. +*/ +static const unsigned char + SmallFishScalesImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x80, 0x80, 0x41, 0x36, 0x08, + 0x08, 0x14, 0x63 + }; + +/* + Vertical pattern. +*/ +static const unsigned char + VerticalImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11 + }; + +/* + Vertical-2 pattern. +*/ +static const unsigned char + Vertical2Image[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x38, 0x0A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, + 0xAA, 0xAA, 0xAA + }; + +/* + Vertical-2 pattern. +*/ +static const unsigned char + Vertical3Image[] = + { + 0x50, 0x34, 0x0A, 0x39, 0x20, 0x39, 0x0A, 0x24, 0x80, 0x24, 0x80, 0x24, + 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, + 0x80 + }; + +/* + VerticalBricks pattern. +*/ +static const unsigned char + VerticalBricksImage[] = + { + 0x50, 0x34, 0x0A, 0x31, 0x36, 0x20, 0x31, 0x36, 0x0A, 0xFF, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01 + }; + +/* + VerticalLeftShingle pattern. +*/ +static const unsigned char + VerticalLeftShingleImage[] = + { + 0x50, 0x34, 0x0A, 0x32, 0x34, 0x20, 0x32, 0x34, 0x0A, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, + 0x01, 0x01, 0x61, 0x01, 0x01, 0x19, 0x01, 0x01, 0x07, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x01, + 0x01, 0x61, 0x01, 0x01, 0x19, 0x01, 0x01, 0x07, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x01, 0x01, + 0x61, 0x01, 0x01, 0x19, 0x01, 0x01, 0x07, 0x01, 0x01 + }; + +/* + VerticalRightShingle pattern. +*/ +static const unsigned char + VerticalRightShingleImage[] = + { + 0x50, 0x34, 0x0A, 0x32, 0x34, 0x20, 0x32, 0x34, 0x0A, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, + 0x01, 0x0D, 0x01, 0x01, 0x31, 0x01, 0x01, 0xC1, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, + 0x01, 0x01, 0x0D, 0x01, 0x01, 0x31, 0x01, 0x01, 0xC1, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, + 0x0D, 0x01, 0x01, 0x31, 0x01, 0x01, 0xC1, 0x01, 0x01 + }; + +/* + VerticalSaw pattern. +*/ +static const unsigned char + VerticalSawImage[] = + { + 0x50, 0x34, 0x0A, 0x38, 0x20, 0x31, 0x36, 0x0A, 0x40, 0x20, 0x10, 0x08, + 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, 0x10, 0x08, 0x10, 0x20, 0x40, 0x80 + }; + +static const struct +{ + char + name[21], + magick[4]; + + const void + *blob; + + size_t + extent; +} PatternImageList[] = + { + { "BRICKS", "PBM", BricksImage, sizeof(BricksImage) }, + { "CHECKERBOARD", "GIF", CheckerboardImage, sizeof(CheckerboardImage) }, + { "CIRCLES", "PBM", CirclesImage, sizeof(CirclesImage) }, + { "CROSSHATCH", "PBM", CrossHatchImage, sizeof(CrossHatchImage) }, + { "CROSSHATCH30", "PBM", CrossHatch30Image, sizeof(CrossHatch30Image) }, + { "CROSSHATCH45", "PBM", CrossHatch45Image, sizeof(CrossHatch45Image) }, + { "FISHSCALES", "PBM", FishScalesImage, sizeof(FishScalesImage) }, + { "GRAY0", "PBM", Gray0Image, sizeof(Gray0Image) }, + { "GRAY5", "PBM", Gray5Image, sizeof(Gray5Image) }, + { "GRAY10", "PBM", Gray10Image, sizeof(Gray10Image) }, + { "GRAY15", "PBM", Gray15Image, sizeof(Gray15Image) }, + { "GRAY20", "PBM", Gray20Image, sizeof(Gray20Image) }, + { "GRAY25", "PBM", Gray25Image, sizeof(Gray25Image) }, + { "GRAY30", "PBM", Gray30Image, sizeof(Gray30Image) }, + { "GRAY35", "PBM", Gray35Image, sizeof(Gray35Image) }, + { "GRAY40", "PBM", Gray40Image, sizeof(Gray40Image) }, + { "GRAY45", "PBM", Gray45Image, sizeof(Gray45Image) }, + { "GRAY50", "PBM", Gray50Image, sizeof(Gray50Image) }, + { "GRAY55", "PBM", Gray55Image, sizeof(Gray55Image) }, + { "GRAY60", "PBM", Gray60Image, sizeof(Gray60Image) }, + { "GRAY65", "PBM", Gray65Image, sizeof(Gray65Image) }, + { "GRAY70", "PBM", Gray70Image, sizeof(Gray70Image) }, + { "GRAY75", "PBM", Gray75Image, sizeof(Gray75Image) }, + { "GRAY80", "PBM", Gray80Image, sizeof(Gray80Image) }, + { "GRAY85", "PBM", Gray85Image, sizeof(Gray85Image) }, + { "GRAY90", "PBM", Gray90Image, sizeof(Gray90Image) }, + { "GRAY95", "PBM", Gray95Image, sizeof(Gray95Image) }, + { "GRAY100", "PBM", Gray100Image, sizeof(Gray100Image) }, + { "HEXAGONS", "PBM", HexagonsImage, sizeof(HexagonsImage) }, + { "HORIZONTAL", "PBM", HorizontalImage, sizeof(HorizontalImage) }, + { "HORIZONTAL2", "PBM", Horizontal2Image, sizeof(Horizontal2Image) }, + { "HORIZONTAL3", "PBM", Horizontal3Image, sizeof(Horizontal3Image) }, + { "HORIZONTALSAW", "PBM", HorizontalSawImage, sizeof(HorizontalSawImage) }, + { "HS_BDIAGONAL", "PBM", HS_BDIAGONALImage, sizeof(HS_BDIAGONALImage) }, + { "HS_CROSS", "PBM", HS_CROSSImage, sizeof(HS_CROSSImage) }, + { "HS_DIAGCROSS", "PBM", HS_DIAGCROSSImage, sizeof(HS_DIAGCROSSImage) }, + { "HS_FDIAGONAL", "PBM", HS_FDIAGONALImage, sizeof(HS_FDIAGONALImage) }, + { "HS_HORIZONTAL", "PBM", HS_HORIZONTALImage, sizeof(HS_HORIZONTALImage) }, + { "HS_VERTICAL", "PBM", HS_VERTICALImage, sizeof(HS_VERTICALImage) }, + { "LEFT30", "PBM", Left30Image, sizeof(Left30Image) }, + { "LEFT45", "PBM", Left45Image, sizeof(Left45Image) }, + { "LEFTSHINGLE", "PBM", LeftShingleImage, sizeof(LeftShingleImage) }, + { "OCTAGONS", "PBM", OctagonsImage, sizeof(OctagonsImage) }, + { "RIGHT30", "PBM", Right30Image, sizeof(Right30Image) }, + { "RIGHT45", "PBM", Right45Image, sizeof(Right45Image) }, + { "RIGHTSHINGLE", "PBM", RightShingleImage, sizeof(RightShingleImage) }, + { "SMALLFISHSCALES", "PBM", SmallFishScalesImage, + sizeof(SmallFishScalesImage) }, + { "VERTICAL", "PBM", VerticalImage, sizeof(VerticalImage) }, + { "VERTICAL2", "PBM", Vertical2Image, sizeof(Vertical2Image) }, + { "VERTICAL3", "PBM", Vertical3Image, sizeof(Vertical3Image) }, + { "VERTICALBRICKS", "PBM", VerticalBricksImage, sizeof(VerticalBricksImage) }, + { "VERTICALLEFTSHINGLE", "PBM", VerticalLeftShingleImage, sizeof(VerticalLeftShingleImage) }, + { "VERTICALRIGHTSHINGLE", "PBM", VerticalRightShingleImage, sizeof(VerticalRightShingleImage) }, + { "VERTICALSAW", "PBM", VerticalSawImage, sizeof(VerticalSawImage) } + }; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P A T T E R N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPATTERNImage() reads a PATTERN image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadPATTERNImage method is: +% +% Image *ReadPATTERNImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadPATTERNImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + const void + *blob; + + Image + *image; + + ImageInfo + *blob_info; + + ssize_t + i; + + size_t + extent; + + blob_info=CloneImageInfo(image_info); + image=(Image *) NULL; + blob=(const void *) NULL; + extent=0; + for (i=0; i < (ssize_t) (sizeof(PatternImageList)/sizeof(PatternImageList[0])); i++) + if (LocaleCompare(blob_info->filename,PatternImageList[i].name) == 0) + { + (void) CopyMagickString(blob_info->magick,PatternImageList[i].magick, + MaxTextExtent); + blob=PatternImageList[i].blob; + extent=PatternImageList[i].extent; + break; + } + if (blob == (const void *) NULL) + { + blob_info=DestroyImageInfo(blob_info); + ThrowReaderException(OptionError,"UnrecognizedImageFormat"); + } + image=BlobToImage(blob_info,blob,extent,exception); + if (image_info->size != (char *) NULL) + { + Image + *pattern_image; + + /* + Tile pattern across image canvas. + */ + pattern_image=image; + image=AcquireImage(image_info); + (void) TextureImage(image,pattern_image); + pattern_image=DestroyImage(pattern_image); + } + blob_info=DestroyImageInfo(blob_info); + return(GetFirstImageInList(image)); +} +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P A T T E R N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPATTERNImage() adds attributes for the BRICKS, CHECKERBOARD, +% CIRCLES, etc., image formats to the list of supported formats. The attributes +% include the image format tag, a method to read and/or write the format, +% whether the format supports the saving of more than one frame to the same +% file or blob, whether the format supports native in-memory I/O, and a +% brief description of the format. +% +% The format of the RegisterPATTERNImage method is: +% +% size_t RegisterPATTERNImage(void) +% +*/ +ModuleExport size_t RegisterPATTERNImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PATTERN"); + entry->decoder=(DecodeImageHandler *) ReadPATTERNImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Predefined pattern"); + entry->magick_module=ConstantString("PATTERN"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P A T T E R N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPATTERNImage() removes format registrations made by the +% PATTERN module from the list of supported formats. +% +% The format of the UnregisterPATTERNImage method is: +% +% UnregisterPATTERNImage(void) +% +*/ +ModuleExport void UnregisterPATTERNImage(void) +{ + (void) UnregisterMagickInfo("PATTERN"); +} diff --git a/ImageMagick-6.9.12-44/coders/pcd.c b/ImageMagick-6.9.12-44/coders/pcd.c new file mode 100644 index 0000000..f060e9b --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pcd.c @@ -0,0 +1,1186 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP CCCC DDDD % +% P P C D D % +% PPPP C D D % +% P C D D % +% P CCCC DDDD % +% % +% % +% Read/Write Photo CD Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/property.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/client.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/decorate.h" +#include "magick/distort.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/montage.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/transform.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePCDImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DecodeImage recovers the Huffman encoded luminance and chrominance +% deltas. +% +% The format of the DecodeImage method is: +% +% MagickBooleanType DecodeImage(Image *image,unsigned char *luma, +% unsigned char *chroma1,unsigned char *chroma2) +% +% A description of each parameter follows: +% +% o image: the address of a structure of type Image. +% +% o luma: the address of a character buffer that contains the +% luminance information. +% +% o chroma1: the address of a character buffer that contains the +% chrominance information. +% +% o chroma2: the address of a character buffer that contains the +% chrominance information. +% +*/ +static MagickBooleanType DecodeImage(Image *image,unsigned char *luma, + unsigned char *chroma1,unsigned char *chroma2) +{ +#define IsSync(sum) ((sum & 0xffffff00UL) == 0xfffffe00UL) +#define PCDGetBits(n) \ +{ \ + sum=(sum << n) & 0xffffffff; \ + bits-=n; \ + while (bits <= 24) \ + { \ + if (p >= (buffer+0x800)) \ + { \ + count=ReadBlob(image,0x800,buffer); \ + p=buffer; \ + } \ + sum|=(((unsigned int) (*p)) << (24-bits)); \ + bits+=8; \ + p++; \ + } \ +} + + typedef struct PCDTable + { + unsigned int + length, + sequence; + + MagickStatusType + mask; + + unsigned char + key; + } PCDTable; + + PCDTable + *pcd_table[3]; + + ssize_t + i, + j; + + PCDTable + *r; + + unsigned char + *p, + *q; + + size_t + bits, + length, + plane, + pcd_length[3], + row, + sum; + + ssize_t + count, + quantum; + + unsigned char + *buffer; + + /* + Initialize Huffman tables. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(luma != (unsigned char *) NULL); + assert(chroma1 != (unsigned char *) NULL); + assert(chroma2 != (unsigned char *) NULL); + buffer=(unsigned char *) AcquireQuantumMemory(0x800,sizeof(*buffer)); + if (buffer == (unsigned char *) NULL) + ThrowBinaryImageException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + sum=0; + bits=32; + p=buffer+0x800; + for (i=0; i < 3; i++) + { + pcd_table[i]=(PCDTable *) NULL; + pcd_length[i]=0; + } + for (i=0; i < (ssize_t) (image->columns > 1536 ? 3 : 1); i++) + { + PCDGetBits(8); + length=(sum & 0xff)+1; + pcd_table[i]=(PCDTable *) AcquireQuantumMemory(length, + sizeof(*pcd_table[i])); + if (pcd_table[i] == (PCDTable *) NULL) + { + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + for (j=0; j < i; j++) + pcd_table[j]=(PCDTable *) RelinquishMagickMemory(pcd_table[j]); + ThrowBinaryImageException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + r=pcd_table[i]; + for (j=0; j < (ssize_t) length; j++) + { + PCDGetBits(8); + r->length=(unsigned int) (sum & 0xff)+1; + if (r->length > 16) + { + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + for (j=0; j <= i; j++) + pcd_table[j]=(PCDTable *) RelinquishMagickMemory(pcd_table[j]); + return(MagickFalse); + } + PCDGetBits(16); + r->sequence=(unsigned int) (sum & 0xffff) << 16; + PCDGetBits(8); + r->key=(unsigned char) (sum & 0xff); + r->mask=(~((1U << (32-r->length))-1)); + r++; + } + pcd_length[i]=(size_t) length; + } + if (EOFBlob(image) == MagickFalse) + { + /* + Search for Sync byte. + */ + for (i=0; i < 1; i++) + PCDGetBits(16); + for (i=0; i < 1; i++) + PCDGetBits(16); + while ((sum & 0x00fff000UL) != 0x00fff000UL) + PCDGetBits(8); + while (IsSync(sum) == 0) + PCDGetBits(1); + } + /* + Recover the Huffman encoded luminance and chrominance deltas. + */ + count=0; + length=0; + plane=0; + row=0; + for (q=luma; EOFBlob(image) == MagickFalse; ) + { + if (IsSync(sum) != 0) + { + /* + Determine plane and row number. + */ + PCDGetBits(16); + row=((sum >> 9) & 0x1fff); + if (row == image->rows) + break; + PCDGetBits(8); + plane=sum >> 30; + PCDGetBits(16); + switch (plane) + { + case 0: + { + q=luma+row*image->columns; + count=(ssize_t) image->columns; + break; + } + case 2: + { + q=chroma1+(row >> 1)*image->columns; + count=(ssize_t) (image->columns >> 1); + plane--; + break; + } + case 3: + { + q=chroma2+(row >> 1)*image->columns; + count=(ssize_t) (image->columns >> 1); + plane--; + break; + } + default: + { + for (i=0; i < (ssize_t) (image->columns > 1536 ? 3 : 1); i++) + pcd_table[i]=(PCDTable *) RelinquishMagickMemory(pcd_table[i]); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + ThrowBinaryImageException(CorruptImageError,"CorruptImage", + image->filename); + } + } + length=pcd_length[plane]; + continue; + } + /* + Decode luminance or chrominance deltas. + */ + r=pcd_table[plane]; + for (i=0; ((i < (ssize_t) length) && ((sum & r->mask) != r->sequence)); i++) + r++; + if ((row > image->rows) || (r == (PCDTable *) NULL)) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CorruptImageWarning,"SkipToSyncByte","`%s'",image->filename); + while ((sum & 0x00fff000) != 0x00fff000) + PCDGetBits(8); + while (IsSync(sum) == 0) + PCDGetBits(1); + continue; + } + if (r->key < 128) + quantum=(ssize_t) (*q)+r->key; + else + quantum=(ssize_t) (*q)+r->key-256; + *q=(unsigned char) ((quantum < 0) ? 0 : (quantum > 255) ? 255 : quantum); + q++; + PCDGetBits(r->length); + count--; + } + /* + Relinquish resources. + */ + for (i=0; i < (ssize_t) (image->columns > 1536 ? 3 : 1); i++) + pcd_table[i]=(PCDTable *) RelinquishMagickMemory(pcd_table[i]); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P C D % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPCD() returns MagickTrue if the image format type, identified by the +% magick string, is PCD. +% +% The format of the IsPCD method is: +% +% MagickBooleanType IsPCD(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsPCD(const unsigned char *magick,const size_t length) +{ + if (length < 2052) + return(MagickFalse); + if (LocaleNCompare((const char *) magick+2048,"PCD_",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P C D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPCDImage() reads a Photo CD image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. Much of the PCD decoder was derived from +% the program hpcdtoppm(1) by Hadmut Danisch. +% +% The format of the ReadPCDImage method is: +% +% image=ReadPCDImage(image_info) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static Image *OverviewImage(const ImageInfo *image_info,Image *image, + ExceptionInfo *exception) +{ + Image + *montage_image; + + MontageInfo + *montage_info; + + Image + *p; + + /* + Create the PCD Overview image. + */ + for (p=image; p != (Image *) NULL; p=p->next) + { + (void) DeleteImageProperty(p,"label"); + (void) SetImageProperty(p,"label",DefaultTileLabel); + } + montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL); + (void) CopyMagickString(montage_info->filename,image_info->filename, + MaxTextExtent); + montage_image=MontageImageList(image_info,montage_info,image,exception); + montage_info=DestroyMontageInfo(montage_info); + if (montage_image == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + image=DestroyImageList(image); + return(montage_image); +} + +static void Upsample(const size_t width,const size_t height, + const size_t scaled_width,unsigned char *pixels) +{ + ssize_t + x, + y; + + unsigned char + *p, + *q, + *r; + + /* + Create a new image that is a integral size greater than an existing one. + */ + assert(pixels != (unsigned char *) NULL); + for (y=0; y < (ssize_t) height; y++) + { + p=pixels+(height-1-y)*scaled_width+(width-1); + q=pixels+((height-1-y) << 1)*scaled_width+((width-1) << 1); + *q=(*p); + *(q+1)=(*(p)); + for (x=1; x < (ssize_t) width; x++) + { + p--; + q-=2; + *q=(*p); + *(q+1)=(unsigned char) ((((size_t) *p)+((size_t) *(p+1))+1) >> 1); + } + } + for (y=0; y < (ssize_t) (height-1); y++) + { + p=pixels+((size_t) y << 1)*scaled_width; + q=p+scaled_width; + r=q+scaled_width; + for (x=0; x < (ssize_t) (width-1); x++) + { + *q=(unsigned char) ((((size_t) *p)+((size_t) *r)+1) >> 1); + *(q+1)=(unsigned char) ((((size_t) *p)+((size_t) *(p+2))+ + ((size_t) *r)+((size_t) *(r+2))+2) >> 2); + q+=2; + p+=2; + r+=2; + } + *q++=(unsigned char) ((((size_t) *p++)+((size_t) *r++)+1) >> 1); + *q++=(unsigned char) ((((size_t) *p++)+((size_t) *r++)+1) >> 1); + } + p=pixels+(2*height-2)*scaled_width; + q=pixels+(2*height-1)*scaled_width; + (void) memcpy(q,p,(size_t) (2*width)); +} + +static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define ThrowPCDException(exception,message) \ +{ \ + if (header != (unsigned char *) NULL) \ + header=(unsigned char *) RelinquishMagickMemory(header); \ + if (pixel_info != (MemoryInfo *) NULL) \ + pixel_info=RelinquishVirtualMemory(pixel_info); \ + ThrowReaderException((exception),(message)); \ +} + + Image + *image; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + MemoryInfo + *pixel_info; + + ssize_t + i, + y; + + PixelPacket + *q; + + unsigned char + *c1, + *c2, + *yy; + + size_t + height, + number_images, + number_pixels, + rotate, + scene, + width; + + ssize_t + count, + x; + + unsigned char + *chroma1, + *chroma2, + *header, + *luma; + + unsigned int + overview; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Determine if this a PCD file. + */ + header=(unsigned char *) AcquireQuantumMemory(0x800,3UL*sizeof(*header)); + if (header == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + pixel_info=(MemoryInfo *) NULL; + count=ReadBlob(image,3*0x800,header); + if (count != (3*0x800)) + ThrowPCDException(CorruptImageError,"ImproperImageHeader"); + overview=LocaleNCompare((char *) header,"PCD_OPA",7) == 0; + if ((LocaleNCompare((char *) header+0x800,"PCD",3) != 0) && (overview == 0)) + { + header=(unsigned char *) RelinquishMagickMemory(header); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + rotate=header[0x0e02] & 0x03; + number_images=((header[10] << 8) | header[11]) & 0xffff; + header=(unsigned char *) RelinquishMagickMemory(header); + if ((overview != 0) && + (AcquireMagickResource(ListLengthResource,number_images) == MagickFalse)) + ThrowPCDException(ResourceLimitError,"ListLengthExceedsLimit"); + /* + Determine resolution by scene specification. + */ + if ((image->columns == 0) || (image->rows == 0)) + scene=3; + else + { + width=192; + height=128; + for (scene=1; scene < 6; scene++) + { + if ((width >= image->columns) && (height >= image->rows)) + break; + width<<=1; + height<<=1; + } + } + if (image_info->number_scenes != 0) + scene=(size_t) MagickMin(image_info->scene,6); + if (overview != 0) + scene=1; + /* + Initialize image structure. + */ + width=192; + height=128; + for (i=1; i < (ssize_t) MagickMin(scene,3); i++) + { + width<<=1; + height<<=1; + } + image->columns=width; + image->rows=height; + image->depth=8; + for ( ; i < (ssize_t) scene; i++) + { + image->columns<<=1; + image->rows<<=1; + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Allocate luma and chroma memory. + */ + pixel_info=AcquireVirtualMemory(image->columns+1UL,30*image->rows* + sizeof(*luma)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowPCDException(ResourceLimitError,"MemoryAllocationFailed"); + number_pixels=(image->columns+1UL)*10*image->rows*sizeof(*luma); + luma=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + chroma1=(unsigned char *) GetVirtualMemoryBlob(pixel_info)+number_pixels; + chroma2=(unsigned char *) GetVirtualMemoryBlob(pixel_info)+2*number_pixels; + (void) memset(luma,0,3*number_pixels); + /* + Advance to image data. + */ + offset=93; + if (overview != 0) + offset=2; + else + if (scene == 2) + offset=20; + else + if (scene <= 1) + offset=1; + for (i=0; i < (ssize_t) (offset*0x800); i++) + if (ReadBlobByte(image) == EOF) + ThrowPCDException(CorruptImageError,"UnexpectedEndOfFile"); + if (overview != 0) + { + MagickProgressMonitor + progress_monitor; + + ssize_t + j; + + /* + Read thumbnails from overview image. + */ + for (j=1; j <= (ssize_t) number_images; j++) + { + progress_monitor=SetImageProgressMonitor(image, + (MagickProgressMonitor) NULL,image->client_data); + (void) FormatLocaleString(image->filename,MaxTextExtent, + "images/img%04ld.pcd",(long) j); + (void) FormatLocaleString(image->magick_filename,MaxTextExtent, + "images/img%04ld.pcd",(long) j); + image->scene=(size_t) j; + image->columns=width; + image->rows=height; + image->depth=8; + yy=luma; + c1=chroma1; + c2=chroma2; + for (y=0; y < (ssize_t) height; y+=2) + { + count=ReadBlob(image,width,yy); + yy+=image->columns; + count=ReadBlob(image,width,yy); + yy+=image->columns; + count=ReadBlob(image,width >> 1,c1); + c1+=image->columns; + count=ReadBlob(image,width >> 1,c2); + c2+=image->columns; + if (EOFBlob(image) != MagickFalse) + ThrowPCDException(CorruptImageError,"UnexpectedEndOfFile"); + } + Upsample(image->columns >> 1,image->rows >> 1,image->columns,chroma1); + Upsample(image->columns >> 1,image->rows >> 1,image->columns,chroma2); + /* + Transfer luminance and chrominance channels. + */ + yy=luma; + c1=chroma1; + c2=chroma2; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*yy++)); + SetPixelGreen(q,ScaleCharToQuantum(*c1++)); + SetPixelBlue(q,ScaleCharToQuantum(*c2++)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + image->colorspace=YCCColorspace; + if (LocaleCompare(image_info->magick,"PCDS") == 0) + (void) SetImageColorspace(image,sRGBColorspace); + if (EOFBlob(image) != MagickFalse) + break; + if (j < (ssize_t) number_images) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + } + (void) SetImageProgressMonitor(image,progress_monitor, + image->client_data); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) j-1, + number_images); + if (status == MagickFalse) + break; + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(OverviewImage(image_info,GetFirstImageInList(image),exception)); + } + /* + Read interleaved image. + */ + yy=luma; + c1=chroma1; + c2=chroma2; + for (y=0; y < (ssize_t) height; y+=2) + { + count=ReadBlob(image,width,yy); + yy+=image->columns; + count=ReadBlob(image,width,yy); + yy+=image->columns; + count=ReadBlob(image,width >> 1,c1); + c1+=image->columns; + count=ReadBlob(image,width >> 1,c2); + c2+=image->columns; + if (EOFBlob(image) != MagickFalse) + ThrowPCDException(CorruptImageError,"UnexpectedEndOfFile"); + } + if (scene >= 4) + { + /* + Recover luminance deltas for 1536x1024 image. + */ + Upsample(768,512,image->columns,luma); + Upsample(384,256,image->columns,chroma1); + Upsample(384,256,image->columns,chroma2); + image->rows=1024; + for (i=0; i < (4*0x800); i++) + (void) ReadBlobByte(image); + status=DecodeImage(image,luma,chroma1,chroma2); + if ((scene >= 5) && status) + { + /* + Recover luminance deltas for 3072x2048 image. + */ + Upsample(1536,1024,image->columns,luma); + Upsample(768,512,image->columns,chroma1); + Upsample(768,512,image->columns,chroma2); + image->rows=2048; + offset=TellBlob(image)/0x800+12; + offset=SeekBlob(image,offset*0x800,SEEK_SET); + status=DecodeImage(image,luma,chroma1,chroma2); + if ((scene >= 6) && (status != MagickFalse)) + { + /* + Recover luminance deltas for 6144x4096 image (vaporware). + */ + Upsample(3072,2048,image->columns,luma); + Upsample(1536,1024,image->columns,chroma1); + Upsample(1536,1024,image->columns,chroma2); + image->rows=4096; + } + } + } + Upsample(image->columns >> 1,image->rows >> 1,image->columns,chroma1); + Upsample(image->columns >> 1,image->rows >> 1,image->columns,chroma2); + /* + Transfer luminance and chrominance channels. + */ + yy=luma; + c1=chroma1; + c2=chroma2; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*yy++)); + SetPixelGreen(q,ScaleCharToQuantum(*c1++)); + SetPixelBlue(q,ScaleCharToQuantum(*c2++)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + if (image_info->ping == MagickFalse) + if ((rotate == 1) || (rotate == 3)) + { + double + degrees; + + Image + *rotate_image; + + /* + Rotate image. + */ + degrees=rotate == 1 ? -90.0 : 90.0; + rotate_image=RotateImage(image,degrees,exception); + if (rotate_image != (Image *) NULL) + { + image=DestroyImage(image); + image=rotate_image; + } + } + /* + Set CCIR 709 primaries with a D65 white point. + */ + image->chromaticity.red_primary.x=0.6400f; + image->chromaticity.red_primary.y=0.3300f; + image->chromaticity.green_primary.x=0.3000f; + image->chromaticity.green_primary.y=0.6000f; + image->chromaticity.blue_primary.x=0.1500f; + image->chromaticity.blue_primary.y=0.0600f; + image->chromaticity.white_point.x=0.3127f; + image->chromaticity.white_point.y=0.3290f; + image->gamma=1.000f/2.200f; + image->colorspace=YCCColorspace; + if (LocaleCompare(image_info->magick,"PCDS") == 0) + (void) SetImageColorspace(image,sRGBColorspace); + if (image_info->scene != 0) + for (i=0; i < (ssize_t) image_info->scene; i++) + AppendImageToList(&image,CloneImage(image,0,0,MagickTrue,exception)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P C D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPCDImage() adds attributes for the PCD image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPCDImage method is: +% +% size_t RegisterPCDImage(void) +% +*/ +ModuleExport size_t RegisterPCDImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PCD"); + entry->decoder=(DecodeImageHandler *) ReadPCDImage; + entry->encoder=(EncodeImageHandler *) WritePCDImage; + entry->magick=(IsImageFormatHandler *) IsPCD; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Photo CD"); + entry->magick_module=ConstantString("PCD"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PCDS"); + entry->decoder=(DecodeImageHandler *) ReadPCDImage; + entry->encoder=(EncodeImageHandler *) WritePCDImage; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Photo CD"); + entry->magick_module=ConstantString("PCD"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P C D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPCDImage() removes format registrations made by the +% PCD module from the list of supported formats. +% +% The format of the UnregisterPCDImage method is: +% +% UnregisterPCDImage(void) +% +*/ +ModuleExport void UnregisterPCDImage(void) +{ + (void) UnregisterMagickInfo("PCD"); + (void) UnregisterMagickInfo("PCDS"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P C D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePCDImage() writes an image in the Photo CD encoded image format. +% +% The format of the WritePCDImage method is: +% +% MagickBooleanType WritePCDImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static MagickBooleanType WritePCDTile(Image *image,const char *page_geometry, + const char *tile_geometry) +{ + GeometryInfo + geometry_info; + + Image + *downsample_image, + *tile_image; + + MagickBooleanType + status; + + MagickStatusType + flags; + + RectangleInfo + geometry; + + const PixelPacket + *p, + *q; + + ssize_t + i, + x; + + ssize_t + y; + + /* + Scale image to tile size. + */ + SetGeometry(image,&geometry); + (void) ParseMetaGeometry(page_geometry,&geometry.x,&geometry.y, + &geometry.width,&geometry.height); + if ((geometry.width % 2) != 0) + geometry.width--; + if ((geometry.height % 2) != 0) + geometry.height--; + tile_image=ResizeImage(image,geometry.width,geometry.height,TriangleFilter, + 1.0,&image->exception); + if (tile_image == (Image *) NULL) + return(MagickFalse); + flags=ParseGeometry(page_geometry,&geometry_info); + geometry.width=(size_t) geometry_info.rho; + geometry.height=(size_t) geometry_info.sigma; + if ((flags & SigmaValue) == 0) + geometry.height=geometry.width; + if ((tile_image->columns != geometry.width) || + (tile_image->rows != geometry.height)) + { + Image + *bordered_image; + + RectangleInfo + border_info; + + /* + Put a border around the image. + */ + border_info.width=(geometry.width-tile_image->columns+1) >> 1; + border_info.height=(geometry.height-tile_image->rows+1) >> 1; + bordered_image=BorderImage(tile_image,&border_info,&image->exception); + if (bordered_image == (Image *) NULL) + return(MagickFalse); + tile_image=DestroyImage(tile_image); + tile_image=bordered_image; + } + (void) TransformImage(&tile_image,(char *) NULL,tile_geometry); + (void) TransformImageColorspace(tile_image,YCCColorspace); + downsample_image=ResizeImage(tile_image,tile_image->columns/2, + tile_image->rows/2,TriangleFilter,1.0,&image->exception); + if (downsample_image == (Image *) NULL) + return(MagickFalse); + /* + Write tile to PCD file. + */ + for (y=0; y < (ssize_t) tile_image->rows; y+=2) + { + p=GetVirtualPixels(tile_image,0,y,tile_image->columns,2, + &tile_image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) (tile_image->columns << 1); x++) + { + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelRed(p))); + p++; + } + q=GetVirtualPixels(downsample_image,0,y >> 1,downsample_image->columns, + 1,&downsample_image->exception); + if (q == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) downsample_image->columns; x++) + { + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelGreen(q))); + q++; + } + q=GetVirtualPixels(downsample_image,0,y >> 1,downsample_image->columns, + 1,&downsample_image->exception); + if (q == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) downsample_image->columns; x++) + { + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelBlue(q))); + q++; + } + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + tile_image->rows); + if (status == MagickFalse) + break; + } + for (i=0; i < 0x800; i++) + (void) WriteBlobByte(image,'\0'); + downsample_image=DestroyImage(downsample_image); + tile_image=DestroyImage(tile_image); + return(MagickTrue); +} + +static MagickBooleanType WritePCDImage(const ImageInfo *image_info,Image *image) +{ + Image + *pcd_image; + + MagickBooleanType + status; + + ssize_t + i; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + pcd_image=image; + if (image->columns < image->rows) + { + Image + *rotate_image; + + /* + Rotate portrait to landscape. + */ + rotate_image=RotateImage(image,90.0,&image->exception); + if (rotate_image == (Image *) NULL) + return(MagickFalse); + pcd_image=rotate_image; + DestroyBlob(rotate_image); + pcd_image->blob=ReferenceBlob(image->blob); + } + /* + Open output image file. + */ + status=OpenBlob(image_info,pcd_image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + { + if (pcd_image != image) + pcd_image=DestroyImage(pcd_image); + return(status); + } + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(pcd_image,sRGBColorspace); + /* + Write PCD image header. + */ + for (i=0; i < 32; i++) + (void) WriteBlobByte(pcd_image,0xff); + for (i=0; i < 4; i++) + (void) WriteBlobByte(pcd_image,0x0e); + for (i=0; i < 8; i++) + (void) WriteBlobByte(pcd_image,'\0'); + for (i=0; i < 4; i++) + (void) WriteBlobByte(pcd_image,0x01); + for (i=0; i < 4; i++) + (void) WriteBlobByte(pcd_image,0x05); + for (i=0; i < 8; i++) + (void) WriteBlobByte(pcd_image,'\0'); + for (i=0; i < 4; i++) + (void) WriteBlobByte(pcd_image,0x0A); + for (i=0; i < 36; i++) + (void) WriteBlobByte(pcd_image,'\0'); + for (i=0; i < 4; i++) + (void) WriteBlobByte(pcd_image,0x01); + for (i=0; i < 1944; i++) + (void) WriteBlobByte(pcd_image,'\0'); + (void) WriteBlob(pcd_image,7,(const unsigned char *) "PCD_IPI"); + (void) WriteBlobByte(pcd_image,0x06); + for (i=0; i < 1530; i++) + (void) WriteBlobByte(pcd_image,'\0'); + if (image->columns < image->rows) + (void) WriteBlobByte(pcd_image,'\1'); + else + (void) WriteBlobByte(pcd_image,'\0'); + for (i=0; i < (3*0x800-1539); i++) + (void) WriteBlobByte(pcd_image,'\0'); + /* + Write PCD tiles. + */ + status=WritePCDTile(pcd_image,"768x512>","192x128"); + status=WritePCDTile(pcd_image,"768x512>","384x256"); + status=WritePCDTile(pcd_image,"768x512>","768x512"); + (void) CloseBlob(pcd_image); + if (pcd_image != image) + pcd_image=DestroyImage(pcd_image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/pcl.c b/ImageMagick-6.9.12-44/coders/pcl.c new file mode 100644 index 0000000..a7456da --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pcl.c @@ -0,0 +1,1004 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP CCCC L % +% P P C L % +% PPPP C L % +% P C L % +% P CCCC LLLLL % +% % +% % +% Read/Write HP PCL Printer Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/delegate.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/token.h" +#include "magick/transform.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePCLImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P C L % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPCL() returns MagickTrue if the image format type, identified by the +% magick string, is PCL. +% +% The format of the IsPCL method is: +% +% MagickBooleanType IsPCL(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsPCL(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\033E\033&",4) == 0) + return(MagickFalse); + if (memcmp(magick,"\033E\033",3) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P C L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPCLImage() reads a Printer Control Language image file and returns it. +% It allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadPCLImage method is: +% +% Image *ReadPCLImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadPCLImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define CropBox "CropBox" +#define DeviceCMYK "DeviceCMYK" +#define MediaBox "MediaBox" +#define RenderPCLText " Rendering PCL... " + + char + command[MaxTextExtent], + *density, + filename[MaxTextExtent], + geometry[MaxTextExtent], + *options, + input_filename[MaxTextExtent]; + + const DelegateInfo + *delegate_info; + + Image + *image, + *next_image; + + ImageInfo + *read_info; + + int + c; + + MagickBooleanType + cmyk, + status; + + PointInfo + delta; + + RectangleInfo + bounding_box, + page; + + char + *p; + + SegmentInfo + bounds; + + size_t + height, + width; + + ssize_t + count; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + /* + Open image file. + */ + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + status=AcquireUniqueSymbolicLink(image_info->filename,input_filename); + if (status == MagickFalse) + { + ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile", + image_info->filename); + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Set the page density. + */ + delta.x=DefaultResolution; + delta.y=DefaultResolution; + if ((image->x_resolution == 0.0) || (image->y_resolution == 0.0)) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(PSDensityGeometry,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + /* + Determine page geometry from the PCL media box. + */ + cmyk=image->colorspace == CMYKColorspace ? MagickTrue : MagickFalse; + count=0; + (void) memset(&bounding_box,0,sizeof(bounding_box)); + (void) memset(&bounds,0,sizeof(bounds)); + (void) memset(&page,0,sizeof(page)); + (void) memset(command,0,sizeof(command)); + p=command; + for (c=ReadBlobByte(image); c != EOF; c=ReadBlobByte(image)) + { + if (image_info->page != (char *) NULL) + continue; + /* + Note PCL elements. + */ + *p++=(char) c; + if ((c != (int) '/') && (c != '\n') && + ((size_t) (p-command) < (MaxTextExtent-1))) + continue; + *p='\0'; + p=command; + /* + Is this a CMYK document? + */ + if (LocaleNCompare(DeviceCMYK,command,strlen(DeviceCMYK)) == 0) + cmyk=MagickTrue; + if (LocaleNCompare(CropBox,command,strlen(CropBox)) == 0) + { + /* + Note region defined by crop box. + */ + count=(ssize_t) sscanf(command,"CropBox [%lf %lf %lf %lf", + &bounds.x1,&bounds.y1,&bounds.x2,&bounds.y2); + if (count != 4) + count=(ssize_t) sscanf(command,"CropBox[%lf %lf %lf %lf", + &bounds.x1,&bounds.y1,&bounds.x2,&bounds.y2); + } + if (LocaleNCompare(MediaBox,command,strlen(MediaBox)) == 0) + { + /* + Note region defined by media box. + */ + count=(ssize_t) sscanf(command,"MediaBox [%lf %lf %lf %lf", + &bounds.x1,&bounds.y1,&bounds.x2,&bounds.y2); + if (count != 4) + count=(ssize_t) sscanf(command,"MediaBox[%lf %lf %lf %lf", + &bounds.x1,&bounds.y1,&bounds.x2,&bounds.y2); + } + if (count != 4) + continue; + /* + Set PCL render geometry. + */ + width=(size_t) CastDoubleToLong(floor(bounds.x2-bounds.x1+0.5)); + height=(size_t) CastDoubleToLong(floor(bounds.y2-bounds.y1+0.5)); + if (width > page.width) + page.width=width; + if (height > page.height) + page.height=height; + } + (void) CloseBlob(image); + /* + Render PCL with the GhostPCL delegate. + */ + if ((page.width == 0) || (page.height == 0)) + (void) ParseAbsoluteGeometry(PSPageGeometry,&page); + if (image_info->page != (char *) NULL) + (void) ParseAbsoluteGeometry(image_info->page,&page); + (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.20g",(double) + page.width,(double) page.height); + if (image_info->monochrome != MagickFalse) + delegate_info=GetDelegateInfo("pcl:mono",(char *) NULL,exception); + else + if (cmyk != MagickFalse) + delegate_info=GetDelegateInfo("pcl:cmyk",(char *) NULL,exception); + else + delegate_info=GetDelegateInfo("pcl:color",(char *) NULL,exception); + if (delegate_info == (const DelegateInfo *) NULL) + { + image=DestroyImage(image); + return((Image *) NULL); + } + if ((page.width == 0) || (page.height == 0)) + (void) ParseAbsoluteGeometry(PSPageGeometry,&page); + if (image_info->page != (char *) NULL) + (void) ParseAbsoluteGeometry(image_info->page,&page); + density=AcquireString(""); + options=AcquireString(""); + (void) FormatLocaleString(density,MaxTextExtent,"%gx%g", + image->x_resolution,image->y_resolution); + if (image_info->ping != MagickFalse) + (void) FormatLocaleString(density,MagickPathExtent,"2.0x2.0"); + page.width=(size_t) floor((double) page.width*image->x_resolution/delta.x+ + 0.5); + page.height=(size_t) floor((double) page.height*image->y_resolution/delta.y+ + 0.5); + (void) FormatLocaleString(options,MaxTextExtent,"-g%.20gx%.20g ",(double) + page.width,(double) page.height); + image=DestroyImage(image); + read_info=CloneImageInfo(image_info); + *read_info->magick='\0'; + if (read_info->number_scenes != 0) + { + if (read_info->number_scenes != 1) + (void) FormatLocaleString(options,MaxTextExtent,"-dLastPage=%.20g", + (double) (read_info->scene+read_info->number_scenes)); + else + (void) FormatLocaleString(options,MaxTextExtent, + "-dFirstPage=%.20g -dLastPage=%.20g",(double) read_info->scene+1, + (double) (read_info->scene+read_info->number_scenes)); + read_info->number_scenes=0; + if (read_info->scenes != (char *) NULL) + *read_info->scenes='\0'; + } + (void) CopyMagickString(filename,read_info->filename,MaxTextExtent); + (void) AcquireUniqueFilename(read_info->filename); + (void) FormatLocaleString(command,MaxTextExtent, + GetDelegateCommands(delegate_info), + read_info->antialias != MagickFalse ? 4 : 1, + read_info->antialias != MagickFalse ? 4 : 1,density,options, + read_info->filename,input_filename); + options=DestroyString(options); + density=DestroyString(density); + status=ExternalDelegateCommand(MagickFalse,read_info->verbose,command, + (char *) NULL,exception) != 0 ? MagickTrue : MagickFalse; + image=ReadImage(read_info,exception); + (void) RelinquishUniqueFileResource(read_info->filename); + (void) RelinquishUniqueFileResource(input_filename); + read_info=DestroyImageInfo(read_info); + if (image == (Image *) NULL) + ThrowReaderException(DelegateError,"PCLDelegateFailed"); + if (LocaleCompare(image->magick,"BMP") == 0) + { + Image + *cmyk_image; + + cmyk_image=ConsolidateCMYKImages(image,&image->exception); + if (cmyk_image != (Image *) NULL) + { + image=DestroyImageList(image); + image=cmyk_image; + } + } + do + { + (void) CopyMagickString(image->filename,filename,MaxTextExtent); + image->page=page; + if (image_info->ping != MagickFalse) + { + image->magick_columns*=image->x_resolution/2.0; + image->magick_rows*=image->y_resolution/2.0; + image->columns*=image->x_resolution/2.0; + image->rows*=image->y_resolution/2.0; + } + next_image=SyncNextImageInList(image); + if (next_image != (Image *) NULL) + image=next_image; + } while (next_image != (Image *) NULL); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P C L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPCLImage() adds attributes for the PCL image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the i file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPCLImage method is: +% +% size_t RegisterPCLImage(void) +% +*/ +ModuleExport size_t RegisterPCLImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PCL"); + entry->decoder=(DecodeImageHandler *) ReadPCLImage; + entry->encoder=(EncodeImageHandler *) WritePCLImage; + entry->magick=(IsImageFormatHandler *) IsPCL; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->thread_support=EncoderThreadSupport; + entry->description=ConstantString("Printer Control Language"); + entry->magick_module=ConstantString("PCL"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P C L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPCLImage() removes format registrations made by the PCL module +% from the list of supported formats. +% +% The format of the UnregisterPCLImage method is: +% +% UnregisterPCLImage(void) +% +*/ +ModuleExport void UnregisterPCLImage(void) +{ + (void) UnregisterMagickInfo("PCL"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P C L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePCLImage() writes an image in the Page Control Language encoded +% image format. +% +% The format of the WritePCLImage method is: +% +% MagickBooleanType WritePCLImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static size_t PCLDeltaCompressImage(const size_t length, + const unsigned char *previous_pixels,const unsigned char *pixels, + unsigned char *compress_pixels) +{ + int + delta, + j, + replacement; + + ssize_t + i, + x; + + unsigned char + *q; + + q=compress_pixels; + for (x=0; x < (ssize_t) length; ) + { + j=0; + for (i=0; x < (ssize_t) length; x++) + { + if (*pixels++ != *previous_pixels++) + { + i=1; + break; + } + j++; + } + while (x < (ssize_t) length) + { + x++; + if (*pixels == *previous_pixels) + break; + i++; + previous_pixels++; + pixels++; + } + if (i == 0) + break; + replacement=j >= 31 ? 31 : j; + j-=replacement; + delta=i >= 8 ? 8 : i; + *q++=(unsigned char) (((delta-1) << 5) | replacement); + if (replacement == 31) + { + for (replacement=255; j != 0; ) + { + if (replacement > j) + replacement=j; + *q++=(unsigned char) replacement; + j-=replacement; + } + if (replacement == 255) + *q++='\0'; + } + for (pixels-=i; i != 0; ) + { + for (i-=delta; delta != 0; delta--) + *q++=(*pixels++); + if (i == 0) + break; + delta=(int) i; + if (i >= 8) + delta=8; + *q++=(unsigned char) ((delta-1) << 5); + } + } + return((size_t) (q-compress_pixels)); +} + +static size_t PCLPackbitsCompressImage(const size_t length, + const unsigned char *pixels,unsigned char *compress_pixels) +{ + int + count; + + ssize_t + x; + + unsigned char + *q; + + ssize_t + j; + + unsigned char + packbits[128]; + + /* + Compress pixels with Packbits encoding. + */ + q=compress_pixels; + for (x=(ssize_t) length; x != 0; ) + { + switch (x) + { + case 1: + { + x--; + *q++=0; + *q++=(*pixels); + break; + } + case 2: + { + x-=2; + *q++=1; + *q++=(*pixels); + *q++=pixels[1]; + break; + } + case 3: + { + x-=3; + if ((*pixels == *(pixels+1)) && (*(pixels+1) == *(pixels+2))) + { + *q++=(unsigned char) ((256-3)+1); + *q++=(*pixels); + break; + } + *q++=2; + *q++=(*pixels); + *q++=pixels[1]; + *q++=pixels[2]; + break; + } + default: + { + if ((*pixels == *(pixels+1)) && (*(pixels+1) == *(pixels+2))) + { + /* + Packed run. + */ + count=3; + while (((ssize_t) count < x) && (*pixels == *(pixels+count))) + { + count++; + if (count >= 127) + break; + } + x-=count; + *q++=(unsigned char) ((256-count)+1); + *q++=(*pixels); + pixels+=count; + break; + } + /* + Literal run. + */ + count=0; + while ((*(pixels+count) != *(pixels+count+1)) || + (*(pixels+count+1) != *(pixels+count+2))) + { + packbits[count+1]=pixels[count]; + count++; + if (((ssize_t) count >= (x-3)) || (count >= 127)) + break; + } + x-=count; + *packbits=(unsigned char) (count-1); + for (j=0; j <= (ssize_t) count; j++) + *q++=packbits[j]; + pixels+=count; + break; + } + } + } + *q++=128; /* EOD marker */ + return((size_t) (q-compress_pixels)); +} + +static MagickBooleanType WritePCLImage(const ImageInfo *image_info,Image *image) +{ + char + buffer[MaxTextExtent]; + + CompressionType + compression; + + const char + *option; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + unsigned char + *q; + + size_t + density, + imageListLength, + length, + one, + packets; + + ssize_t + y; + + unsigned char + bits_per_pixel, + *compress_pixels, + *pixels, + *previous_pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + density=75; + if (image_info->density != (char *) NULL) + { + GeometryInfo + geometry; + + (void) ParseGeometry(image_info->density,&geometry); + density=(size_t) geometry.rho; + } + scene=0; + one=1; + imageListLength=GetImageListLength(image); + do + { + /* + Initialize the printer. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + (void) WriteBlobString(image,"\033E"); /* printer reset */ + (void) WriteBlobString(image,"\033*r3F"); /* set presentation mode */ + (void) FormatLocaleString(buffer,MaxTextExtent,"\033*r%.20gs%.20gT", + (double) image->columns,(double) image->rows); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"\033*t%.20gR",(double) + density); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"\033&l0E"); /* top margin 0 */ + if (SetImageMonochrome(image,&image->exception) != MagickFalse) + { + /* + Monochrome image: use default printer monochrome setup. + */ + bits_per_pixel=1; + } + else + if (image->storage_class == DirectClass) + { + /* + DirectClass image. + */ + bits_per_pixel=24; + (void) WriteBlobString(image,"\033*v6W"); /* set color mode */ + (void) WriteBlobByte(image,0); /* RGB */ + (void) WriteBlobByte(image,3); /* direct by pixel */ + (void) WriteBlobByte(image,0); /* bits per index (ignored) */ + (void) WriteBlobByte(image,8); /* bits per red component */ + (void) WriteBlobByte(image,8); /* bits per green component */ + (void) WriteBlobByte(image,8); /* bits per blue component */ + } + else + { + /* + Colormapped image. + */ + bits_per_pixel=8; + (void) WriteBlobString(image,"\033*v6W"); /* set color mode... */ + (void) WriteBlobByte(image,0); /* RGB */ + (void) WriteBlobByte(image,1); /* indexed by pixel */ + (void) WriteBlobByte(image,bits_per_pixel); /* bits per index */ + (void) WriteBlobByte(image,8); /* bits per red component */ + (void) WriteBlobByte(image,8); /* bits per green component */ + (void) WriteBlobByte(image,8); /* bits per blue component */ + for (i=0; i < (ssize_t) image->colors; i++) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "\033*v%da%db%dc%.20gI", + ScaleQuantumToChar(image->colormap[i].red), + ScaleQuantumToChar(image->colormap[i].green), + ScaleQuantumToChar(image->colormap[i].blue),(double) i); + (void) WriteBlobString(image,buffer); + } + for (one=1; i < (ssize_t) (one << bits_per_pixel); i++) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"\033*v%.20gI", + (double) i); + (void) WriteBlobString(image,buffer); + } + } + option=GetImageOption(image_info,"pcl:fit-to-page"); + if ((option != (const char *) NULL) && + (IsMagickTrue(option) != MagickFalse)) + (void) WriteBlobString(image,"\033*r3A"); + else + (void) WriteBlobString(image,"\033*r1A"); /* start raster graphics */ + (void) WriteBlobString(image,"\033*b0Y"); /* set y offset */ + length=(image->columns*bits_per_pixel+7)/8; + pixels=(unsigned char *) AcquireQuantumMemory(length+1,sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(pixels,0,(length+1)*sizeof(*pixels)); + compress_pixels=(unsigned char *) NULL; + previous_pixels=(unsigned char *) NULL; + + compression=UndefinedCompression; + if (image_info->compression != UndefinedCompression) + compression=image_info->compression; + switch (compression) + { + case NoCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b0M"); + (void) WriteBlobString(image,buffer); + break; + } + case RLECompression: + { + compress_pixels=(unsigned char *) AcquireQuantumMemory(length+256, + sizeof(*compress_pixels)); + if (compress_pixels == (unsigned char *) NULL) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(compress_pixels,0,(length+256)* + sizeof(*compress_pixels)); + (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b2M"); + (void) WriteBlobString(image,buffer); + break; + } + default: + { + compress_pixels=(unsigned char *) AcquireQuantumMemory(3*length+256, + sizeof(*compress_pixels)); + if (compress_pixels == (unsigned char *) NULL) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(compress_pixels,0,(3*length+256)* + sizeof(*compress_pixels)); + previous_pixels=(unsigned char *) AcquireQuantumMemory(length+1, + sizeof(*previous_pixels)); + if (previous_pixels == (unsigned char *) NULL) + { + compress_pixels=(unsigned char *) RelinquishMagickMemory( + compress_pixels); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(previous_pixels,0,(length+1)* + sizeof(*previous_pixels)); + (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b3M"); + (void) WriteBlobString(image,buffer); + break; + } + } + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + q=pixels; + switch (bits_per_pixel) + { + case 1: + { + unsigned char + bit, + byte; + + /* + Monochrome image. + */ + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte<<=1; + if (GetPixelLuma(image,p) < (QuantumRange/2.0)) + byte|=0x01; + bit++; + if (bit == 8) + { + *q++=byte; + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + *q++=byte << (8-bit); + break; + } + case 8: + { + /* + Colormapped image. + */ + for (x=0; x < (ssize_t) image->columns; x++) + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + break; + } + case 24: + case 32: + { + /* + Truecolor image. + */ + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + p++; + } + break; + } + } + switch (compression) + { + case NoCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b%.20gW", + (double) length); + (void) WriteBlobString(image,buffer); + (void) WriteBlob(image,length,pixels); + break; + } + case RLECompression: + { + packets=PCLPackbitsCompressImage(length,pixels,compress_pixels); + (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b%.20gW", + (double) packets); + (void) WriteBlobString(image,buffer); + (void) WriteBlob(image,packets,compress_pixels); + break; + } + default: + { + if (y == 0) + for (i=0; i < (ssize_t) length; i++) + previous_pixels[i]=(~pixels[i]); + packets=PCLDeltaCompressImage(length,previous_pixels,pixels, + compress_pixels); + (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b%.20gW", + (double) packets); + (void) WriteBlobString(image,buffer); + (void) WriteBlob(image,packets,compress_pixels); + (void) memcpy(previous_pixels,pixels,length* + sizeof(*pixels)); + break; + } + } + } + (void) WriteBlobString(image,"\033*rB"); /* end graphics */ + switch (compression) + { + case NoCompression: + break; + case RLECompression: + { + compress_pixels=(unsigned char *) RelinquishMagickMemory( + compress_pixels); + break; + } + default: + { + previous_pixels=(unsigned char *) RelinquishMagickMemory( + previous_pixels); + compress_pixels=(unsigned char *) RelinquishMagickMemory( + compress_pixels); + break; + } + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) WriteBlobString(image,"\033E"); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/pcx.c b/ImageMagick-6.9.12-44/coders/pcx.c new file mode 100644 index 0000000..8f01be5 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pcx.c @@ -0,0 +1,1220 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP CCCC X X % +% P P C X X % +% PPPP C X % +% P C X X % +% P CCCC X X % +% % +% % +% Read/Write ZSoft IBM PC Paintbrush Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Typedef declarations. +*/ +typedef struct _PCXInfo +{ + unsigned char + identifier, + version, + encoding, + bits_per_pixel; + + unsigned short + left, + top, + right, + bottom, + horizontal_resolution, + vertical_resolution; + + unsigned char + reserved, + planes; + + unsigned short + bytes_per_line, + palette_info, + horizontal_screensize, + vertical_screensize; + + unsigned char + colormap_signature; +} PCXInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePCXImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s D C X % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsDCX() returns MagickTrue if the image format type, identified by the +% magick string, is DCX. +% +% The format of the IsDCX method is: +% +% MagickBooleanType IsDCX(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsDCX(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\261\150\336\72",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P C X % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPCX() returns MagickTrue if the image format type, identified by the +% magick string, is PCX. +% +% The format of the IsPCX method is: +% +% MagickBooleanType IsPCX(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsPCX(const unsigned char *magick,const size_t length) +{ + if (length < 2) + return(MagickFalse); + if (memcmp(magick,"\012\002",2) == 0) + return(MagickTrue); + if (memcmp(magick,"\012\005",2) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P C X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPCXImage() reads a ZSoft IBM PC Paintbrush file and returns it. +% It allocates the memory necessary for the new Image structure and returns +% a pointer to the new image. +% +% The format of the ReadPCXImage method is: +% +% Image *ReadPCXImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadPCXImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define ThrowPCXException(severity,tag) \ +{ \ + if (scanline != (unsigned char *) NULL) \ + scanline=(unsigned char *) RelinquishMagickMemory(scanline); \ + if (pixel_info != (MemoryInfo *) NULL) \ + pixel_info=RelinquishVirtualMemory(pixel_info); \ + if (page_table != (MagickOffsetType *) NULL) \ + page_table=(MagickOffsetType *) RelinquishMagickMemory(page_table); \ + ThrowReaderException(severity,tag); \ +} + + Image + *image; + + int + bits, + id, + mask; + + MagickBooleanType + status; + + MagickOffsetType + offset, + *page_table; + + MemoryInfo + *pixel_info; + + PCXInfo + pcx_info; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + i; + + unsigned char + *p, + *r; + + size_t + one, + pcx_packets; + + ssize_t + count, + y; + + unsigned char + packet, + pcx_colormap[768], + *pixels, + *scanline; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Determine if this a PCX file. + */ + page_table=(MagickOffsetType *) NULL; + scanline=(unsigned char *) NULL; + pixel_info=(MemoryInfo *) NULL; + if (LocaleCompare(image_info->magick,"DCX") == 0) + { + size_t + magic; + + /* + Read the DCX page table. + */ + magic=ReadBlobLSBLong(image); + if (magic != 987654321) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + page_table=(MagickOffsetType *) AcquireQuantumMemory(1024UL, + sizeof(*page_table)); + if (page_table == (MagickOffsetType *) NULL) + ThrowPCXException(ResourceLimitError,"MemoryAllocationFailed"); + for (id=0; id < 1024; id++) + { + page_table[id]=(MagickOffsetType) ReadBlobLSBLong(image); + if (page_table[id] == 0) + break; + } + } + if (page_table != (MagickOffsetType *) NULL) + { + offset=SeekBlob(image,(MagickOffsetType) page_table[0],SEEK_SET); + if (offset < 0) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + } + count=ReadBlob(image,1,&pcx_info.identifier); + for (id=1; id < 1024; id++) + { + int + bits_per_pixel; + + /* + Verify PCX identifier. + */ + pcx_info.version=(unsigned char) ReadBlobByte(image); + if ((count != 1) || (pcx_info.identifier != 0x0a)) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + pcx_info.encoding=(unsigned char) ReadBlobByte(image); + bits_per_pixel=ReadBlobByte(image); + if (bits_per_pixel == -1) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + pcx_info.bits_per_pixel=(unsigned char) bits_per_pixel; + pcx_info.left=ReadBlobLSBShort(image); + pcx_info.top=ReadBlobLSBShort(image); + pcx_info.right=ReadBlobLSBShort(image); + pcx_info.bottom=ReadBlobLSBShort(image); + pcx_info.horizontal_resolution=ReadBlobLSBShort(image); + pcx_info.vertical_resolution=ReadBlobLSBShort(image); + if (EOFBlob(image) != MagickFalse) + ThrowPCXException(CorruptImageError,"UnexpectedEndOfFile"); + /* + Read PCX raster colormap. + */ + if ((pcx_info.right < pcx_info.left) || (pcx_info.bottom < pcx_info.top) || + ((pcx_info.bits_per_pixel != 1) && (pcx_info.bits_per_pixel != 2) && + (pcx_info.bits_per_pixel != 4) && (pcx_info.bits_per_pixel != 8))) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + image->columns=(size_t) (pcx_info.right-pcx_info.left)+1UL; + image->rows=(size_t) (pcx_info.bottom-pcx_info.top)+1UL; + image->depth=pcx_info.bits_per_pixel; + image->units=PixelsPerInchResolution; + image->x_resolution=(double) pcx_info.horizontal_resolution; + image->y_resolution=(double) pcx_info.vertical_resolution; + image->colors=16; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if ((MagickSizeType) (image->columns*image->rows/255) > GetBlobSize(image)) + ThrowPCXException(CorruptImageError,"InsufficientImageDataInFile"); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + ThrowPCXException(image->exception.severity,image->exception.reason); + (void) SetImageBackgroundColor(image); + (void) memset(pcx_colormap,0,sizeof(pcx_colormap)); + count=ReadBlob(image,3*image->colors,pcx_colormap); + if (count != (ssize_t) (3*image->colors)) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + pcx_info.reserved=(unsigned char) ReadBlobByte(image); + pcx_info.planes=(unsigned char) ReadBlobByte(image); + if (pcx_info.planes > 6) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + if ((pcx_info.bits_per_pixel*pcx_info.planes) >= 64) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + if (pcx_info.planes == 0) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + one=1; + if ((pcx_info.bits_per_pixel != 8) || (pcx_info.planes == 1)) + if ((pcx_info.version == 3) || (pcx_info.version == 5) || + ((pcx_info.bits_per_pixel*pcx_info.planes) == 1)) + image->colors=(size_t) MagickMin(one << (1UL* + (pcx_info.bits_per_pixel*pcx_info.planes)),256UL); + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowPCXException(ResourceLimitError,"MemoryAllocationFailed"); + if ((pcx_info.bits_per_pixel >= 8) && (pcx_info.planes != 1)) + image->storage_class=DirectClass; + p=pcx_colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=ScaleCharToQuantum(*p++); + image->colormap[i].green=ScaleCharToQuantum(*p++); + image->colormap[i].blue=ScaleCharToQuantum(*p++); + } + pcx_info.bytes_per_line=ReadBlobLSBShort(image); + pcx_info.palette_info=ReadBlobLSBShort(image); + pcx_info.horizontal_screensize=ReadBlobLSBShort(image); + pcx_info.vertical_screensize=ReadBlobLSBShort(image); + for (i=0; i < 54; i++) + (void) ReadBlobByte(image); + /* + Read image data. + */ + if (HeapOverflowSanityCheckGetSize(image->rows,(size_t) pcx_info.bytes_per_line,&pcx_packets) != MagickFalse) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + if (HeapOverflowSanityCheckGetSize(pcx_packets,(size_t) pcx_info.planes,&pcx_packets) != MagickFalse) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + if ((size_t) (pcx_info.bits_per_pixel*pcx_info.planes*image->columns) > (pcx_packets*8U)) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + if ((MagickSizeType) (pcx_packets/32+128) > GetBlobSize(image)) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + scanline=(unsigned char *) AcquireQuantumMemory(MagickMax(image->columns, + pcx_info.bytes_per_line),MagickMax(pcx_info.planes,8)*sizeof(*scanline)); + pixel_info=AcquireVirtualMemory(pcx_packets,2*sizeof(*pixels)); + if ((scanline == (unsigned char *) NULL) || + (pixel_info == (MemoryInfo *) NULL)) + { + if (scanline != (unsigned char *) NULL) + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + if (pixel_info != (MemoryInfo *) NULL) + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowPCXException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(scanline,0,(size_t) MagickMax(image->columns, + pcx_info.bytes_per_line)*MagickMax(pcx_info.planes,8)*sizeof(*scanline)); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + (void) memset(pixels,0,(size_t) pcx_packets*(2*sizeof(*pixels))); + /* + Uncompress image data. + */ + p=pixels; + if (pcx_info.encoding == 0) + while (pcx_packets != 0) + { + packet=(unsigned char) ReadBlobByte(image); + if (EOFBlob(image) != MagickFalse) + ThrowPCXException(CorruptImageError,"UnexpectedEndOfFile"); + *p++=packet; + pcx_packets--; + } + else + while (pcx_packets != 0) + { + packet=(unsigned char) ReadBlobByte(image); + if (EOFBlob(image) != MagickFalse) + ThrowPCXException(CorruptImageError,"UnexpectedEndOfFile"); + if ((packet & 0xc0) != 0xc0) + { + *p++=packet; + pcx_packets--; + continue; + } + count=(ssize_t) (packet & 0x3f); + packet=(unsigned char) ReadBlobByte(image); + if (EOFBlob(image) != MagickFalse) + ThrowPCXException(CorruptImageError,"UnexpectedEndOfFile"); + for ( ; count != 0; count--) + { + *p++=packet; + pcx_packets--; + if (pcx_packets == 0) + break; + } + } + if (image->storage_class == DirectClass) + image->matte=pcx_info.planes > 3 ? MagickTrue : MagickFalse; + else + if ((pcx_info.version == 5) || + ((pcx_info.bits_per_pixel*pcx_info.planes) == 1)) + { + /* + Initialize image colormap. + */ + if (image->colors > 256) + ThrowPCXException(CorruptImageError,"ColormapExceeds256Colors"); + if ((pcx_info.bits_per_pixel*pcx_info.planes) == 1) + { + /* + Monochrome colormap. + */ + image->colormap[0].red=(Quantum) 0; + image->colormap[0].green=(Quantum) 0; + image->colormap[0].blue=(Quantum) 0; + image->colormap[1].red=QuantumRange; + image->colormap[1].green=QuantumRange; + image->colormap[1].blue=QuantumRange; + } + else + if (image->colors > 16) + { + /* + 256 color images have their color map at the end of the file. + */ + pcx_info.colormap_signature=(unsigned char) ReadBlobByte(image); + count=ReadBlob(image,3*image->colors,pcx_colormap); + p=pcx_colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=ScaleCharToQuantum(*p++); + image->colormap[i].green=ScaleCharToQuantum(*p++); + image->colormap[i].blue=ScaleCharToQuantum(*p++); + } + } + } + /* + Convert PCX raster image to pixel packets. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=pixels+(y*pcx_info.bytes_per_line*pcx_info.planes); + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + r=scanline; + if (image->storage_class == DirectClass) + for (i=0; i < pcx_info.planes; i++) + { + r=scanline+i; + for (x=0; x < (ssize_t) pcx_info.bytes_per_line; x++) + { + switch (i) + { + case 0: + { + *r=(*p++); + break; + } + case 1: + { + *r=(*p++); + break; + } + case 2: + { + *r=(*p++); + break; + } + case 3: + default: + { + *r=(*p++); + break; + } + } + r+=pcx_info.planes; + } + } + else + if (pcx_info.planes > 1) + { + for (x=0; x < (ssize_t) image->columns; x++) + *r++=0; + for (i=0; i < pcx_info.planes; i++) + { + r=scanline; + for (x=0; x < (ssize_t) pcx_info.bytes_per_line; x++) + { + bits=(*p++); + for (mask=0x80; mask != 0; mask>>=1) + { + if (bits & mask) + *r|=1 << i; + r++; + } + } + } + } + else + switch (pcx_info.bits_per_pixel) + { + case 1: + { + ssize_t + bit; + + for (x=0; x < ((ssize_t) image->columns-7); x+=8) + { + for (bit=7; bit >= 0; bit--) + *r++=(unsigned char) ((*p) & (0x01 << bit) ? 0x00 : 0x01); + p++; + } + if ((image->columns % 8) != 0) + { + for (bit=7; bit >= (ssize_t) (8-(image->columns % 8)); bit--) + *r++=(unsigned char) ((*p) & (0x01 << bit) ? 0x00 : 0x01); + p++; + } + break; + } + case 2: + { + for (x=0; x < ((ssize_t) image->columns-3); x+=4) + { + *r++=(*p >> 6) & 0x3; + *r++=(*p >> 4) & 0x3; + *r++=(*p >> 2) & 0x3; + *r++=(*p) & 0x3; + p++; + } + if ((image->columns % 4) != 0) + { + for (i=3; i >= (ssize_t) (4-(image->columns % 4)); i--) + *r++=(unsigned char) ((*p >> (i*2)) & 0x03); + p++; + } + break; + } + case 4: + { + for (x=0; x < ((ssize_t) image->columns-1); x+=2) + { + *r++=(*p >> 4) & 0xf; + *r++=(*p) & 0xf; + p++; + } + if ((image->columns % 2) != 0) + *r++=(*p++ >> 4) & 0xf; + break; + } + case 8: + { + (void) memcpy(r,p,image->columns); + break; + } + default: + break; + } + /* + Transfer image scanline. + */ + r=scanline; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (image->storage_class == PseudoClass) + SetPixelIndex(indexes+x,*r++); + else + { + SetPixelRed(q,ScaleCharToQuantum(*r++)); + SetPixelGreen(q,ScaleCharToQuantum(*r++)); + SetPixelBlue(q,ScaleCharToQuantum(*r++)); + if (image->matte != MagickFalse) + SetPixelAlpha(q,ScaleCharToQuantum(*r++)); + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (image->storage_class == PseudoClass) + (void) SyncImage(image); + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (page_table == (MagickOffsetType *) NULL) + break; + if (page_table[id] == 0) + break; + offset=SeekBlob(image,(MagickOffsetType) page_table[id],SEEK_SET); + if (offset < 0) + ThrowPCXException(CorruptImageError,"ImproperImageHeader"); + count=ReadBlob(image,1,&pcx_info.identifier); + if ((count != 0) && (pcx_info.identifier == 0x0a)) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } + if (page_table != (MagickOffsetType *) NULL) + page_table=(MagickOffsetType *) RelinquishMagickMemory(page_table); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P C X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPCXImage() adds attributes for the PCX image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPCXImage method is: +% +% size_t RegisterPCXImage(void) +% +*/ +ModuleExport size_t RegisterPCXImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("DCX"); + entry->decoder=(DecodeImageHandler *) ReadPCXImage; + entry->encoder=(EncodeImageHandler *) WritePCXImage; + entry->seekable_stream=MagickTrue; + entry->magick=(IsImageFormatHandler *) IsDCX; + entry->description=ConstantString("ZSoft IBM PC multi-page Paintbrush"); + entry->magick_module=ConstantString("PCX"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PCX"); + entry->decoder=(DecodeImageHandler *) ReadPCXImage; + entry->encoder=(EncodeImageHandler *) WritePCXImage; + entry->magick=(IsImageFormatHandler *) IsPCX; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("ZSoft IBM PC Paintbrush"); + entry->magick_module=ConstantString("PCX"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P C X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPCXImage() removes format registrations made by the +% PCX module from the list of supported formats. +% +% The format of the UnregisterPCXImage method is: +% +% UnregisterPCXImage(void) +% +*/ +ModuleExport void UnregisterPCXImage(void) +{ + (void) UnregisterMagickInfo("DCX"); + (void) UnregisterMagickInfo("PCX"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P C X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePCXImage() writes an image in the ZSoft IBM PC Paintbrush file +% format. +% +% The format of the WritePCXImage method is: +% +% MagickBooleanType WritePCXImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% +*/ +static MagickBooleanType PCXWritePixels(PCXInfo *pcx_info, + const unsigned char *pixels,Image *image) +{ + const unsigned char + *q; + + ssize_t + i, + x; + + ssize_t + count; + + unsigned char + packet, + previous; + + q=pixels; + for (i=0; i < (ssize_t) pcx_info->planes; i++) + { + if (pcx_info->encoding == 0) + { + for (x=0; x < (ssize_t) pcx_info->bytes_per_line; x++) + (void) WriteBlobByte(image,(unsigned char) (*q++)); + } + else + { + previous=(*q++); + count=1; + for (x=0; x < (ssize_t) (pcx_info->bytes_per_line-1); x++) + { + packet=(*q++); + if ((packet == previous) && (count < 63)) + { + count++; + continue; + } + if ((count > 1) || ((previous & 0xc0) == 0xc0)) + { + count|=0xc0; + (void) WriteBlobByte(image,(unsigned char) count); + } + (void) WriteBlobByte(image,previous); + previous=packet; + count=1; + } + if ((count > 1) || ((previous & 0xc0) == 0xc0)) + { + count|=0xc0; + (void) WriteBlobByte(image,(unsigned char) count); + } + (void) WriteBlobByte(image,previous); + } + } + return (MagickTrue); +} + +static MagickBooleanType WritePCXImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + status; + + MagickOffsetType + offset, + *page_table, + scene; + + MemoryInfo + *pixel_info; + + PCXInfo + pcx_info; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + unsigned char + *q; + + size_t + imageListLength, + length; + + ssize_t + y; + + unsigned char + *pcx_colormap, + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + page_table=(MagickOffsetType *) NULL; + if ((LocaleCompare(image_info->magick,"DCX") == 0) || + ((GetNextImageInList(image) != (Image *) NULL) && + (image_info->adjoin != MagickFalse))) + { + /* + Write the DCX page table. + */ + (void) WriteBlobLSBLong(image,0x3ADE68B1L); + page_table=(MagickOffsetType *) AcquireQuantumMemory(1024UL, + sizeof(*page_table)); + if (page_table == (MagickOffsetType *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + for (scene=0; scene < 1024; scene++) + (void) WriteBlobLSBLong(image,0x00000000L); + } + scene=0; + imageListLength=GetImageListLength(image); + do + { + if (page_table != (MagickOffsetType *) NULL) + page_table[scene]=TellBlob(image); + /* + Initialize PCX raster file header. + */ + pcx_info.identifier=0x0a; + pcx_info.version=5; + pcx_info.encoding=image_info->compression == NoCompression ? 0 : 1; + pcx_info.bits_per_pixel=8; + if ((image->storage_class == PseudoClass) && + (SetImageMonochrome(image,&image->exception) != MagickFalse)) + pcx_info.bits_per_pixel=1; + pcx_info.left=0; + pcx_info.top=0; + pcx_info.right=(unsigned short) (image->columns-1); + pcx_info.bottom=(unsigned short) (image->rows-1); + switch (image->units) + { + case UndefinedResolution: + case PixelsPerInchResolution: + default: + { + pcx_info.horizontal_resolution=(unsigned short) image->x_resolution; + pcx_info.vertical_resolution=(unsigned short) image->y_resolution; + break; + } + case PixelsPerCentimeterResolution: + { + pcx_info.horizontal_resolution=(unsigned short) + (2.54*image->x_resolution+0.5); + pcx_info.vertical_resolution=(unsigned short) + (2.54*image->y_resolution+0.5); + break; + } + } + pcx_info.reserved=0; + pcx_info.planes=1; + if ((image->storage_class == DirectClass) || (image->colors > 256)) + { + pcx_info.planes=3; + if (image->matte != MagickFalse) + pcx_info.planes++; + } + length=(((size_t) image->columns*pcx_info.bits_per_pixel+7)/8); + if ((image->columns > 65535UL) || (image->rows > 65535UL) || + (length > 65535UL)) + { + if (page_table != (MagickOffsetType *) NULL) + page_table=(MagickOffsetType *) RelinquishMagickMemory(page_table); + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + } + pcx_info.bytes_per_line=(unsigned short) length; + pcx_info.palette_info=1; + pcx_info.colormap_signature=0x0c; + /* + Write PCX header. + */ + (void) WriteBlobByte(image,pcx_info.identifier); + (void) WriteBlobByte(image,pcx_info.version); + (void) WriteBlobByte(image,pcx_info.encoding); + (void) WriteBlobByte(image,pcx_info.bits_per_pixel); + (void) WriteBlobLSBShort(image,pcx_info.left); + (void) WriteBlobLSBShort(image,pcx_info.top); + (void) WriteBlobLSBShort(image,pcx_info.right); + (void) WriteBlobLSBShort(image,pcx_info.bottom); + (void) WriteBlobLSBShort(image,pcx_info.horizontal_resolution); + (void) WriteBlobLSBShort(image,pcx_info.vertical_resolution); + /* + Dump colormap to file. + */ + pcx_colormap=(unsigned char *) AcquireQuantumMemory(256UL, + 3*sizeof(*pcx_colormap)); + if (pcx_colormap == (unsigned char *) NULL) + { + if (page_table != (MagickOffsetType *) NULL) + page_table=(MagickOffsetType *) RelinquishMagickMemory(page_table); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(pcx_colormap,0,3*256*sizeof(*pcx_colormap)); + q=pcx_colormap; + if ((image->storage_class == PseudoClass) && (image->colors <= 256)) + for (i=0; i < (ssize_t) image->colors; i++) + { + *q++=ScaleQuantumToChar(image->colormap[i].red); + *q++=ScaleQuantumToChar(image->colormap[i].green); + *q++=ScaleQuantumToChar(image->colormap[i].blue); + } + (void) WriteBlob(image,3*16,(const unsigned char *) pcx_colormap); + (void) WriteBlobByte(image,pcx_info.reserved); + (void) WriteBlobByte(image,pcx_info.planes); + (void) WriteBlobLSBShort(image,pcx_info.bytes_per_line); + (void) WriteBlobLSBShort(image,pcx_info.palette_info); + for (i=0; i < 58; i++) + (void) WriteBlobByte(image,'\0'); + length=(size_t) pcx_info.bytes_per_line; + pixel_info=AcquireVirtualMemory(length,pcx_info.planes*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + { + pcx_colormap=(unsigned char *) RelinquishMagickMemory(pcx_colormap); + if (page_table != (MagickOffsetType *) NULL) + page_table=(MagickOffsetType *) RelinquishMagickMemory(page_table); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + q=pixels; + if ((image->storage_class == DirectClass) || (image->colors > 256)) + { + /* + Convert DirectClass image to PCX raster pixels. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=pixels; + for (i=0; i < pcx_info.planes; i++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + switch ((int) i) + { + case 0: + { + for (x=0; x < (ssize_t) pcx_info.bytes_per_line; x++) + { + *q++=ScaleQuantumToChar(GetPixelRed(p)); + p++; + } + break; + } + case 1: + { + for (x=0; x < (ssize_t) pcx_info.bytes_per_line; x++) + { + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + p++; + } + break; + } + case 2: + { + for (x=0; x < (ssize_t) pcx_info.bytes_per_line; x++) + { + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + p++; + } + break; + } + case 3: + default: + { + for (x=(ssize_t) pcx_info.bytes_per_line; x != 0; x--) + { + *q++=ScaleQuantumToChar((Quantum) + (GetPixelAlpha(p))); + p++; + } + break; + } + } + } + if (PCXWritePixels(&pcx_info,pixels,image) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + else + { + if (pcx_info.bits_per_pixel > 1) + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + q=pixels; + for (x=0; x < (ssize_t) image->columns; x++) + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + if (PCXWritePixels(&pcx_info,pixels,image) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + else + { + unsigned char + bit, + byte; + + /* + Convert PseudoClass image to a PCX monochrome image. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + bit=0; + byte=0; + q=pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte<<=1; + if (GetPixelLuma(image,p) < (QuantumRange/2.0)) + byte|=0x01; + bit++; + if (bit == 8) + { + *q++=byte; + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + *q++=byte << (8-bit); + if (PCXWritePixels(&pcx_info,pixels,image) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + } + (void) WriteBlobByte(image,pcx_info.colormap_signature); + (void) WriteBlob(image,3*256,pcx_colormap); + } + pixel_info=RelinquishVirtualMemory(pixel_info); + pcx_colormap=(unsigned char *) RelinquishMagickMemory(pcx_colormap); + if (page_table == (MagickOffsetType *) NULL) + break; + if (scene >= 1023) + break; + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + if (page_table != (MagickOffsetType *) NULL) + { + /* + Write the DCX page table. + */ + page_table[scene+1]=0; + offset=SeekBlob(image,0L,SEEK_SET); + if (offset < 0) + { + page_table=(MagickOffsetType *) RelinquishMagickMemory(page_table); + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + } + (void) WriteBlobLSBLong(image,0x3ADE68B1L); + for (i=0; i <= (ssize_t) scene; i++) + (void) WriteBlobLSBLong(image,(unsigned int) page_table[i]); + page_table=(MagickOffsetType *) RelinquishMagickMemory(page_table); + } + if (status == MagickFalse) + { + char + *message; + + message=GetExceptionMessage(errno); + (void) ThrowMagickException(&image->exception,GetMagickModule(), + FileOpenError,"UnableToWriteFile","`%s': %s",image->filename,message); + message=DestroyString(message); + } + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/pdb.c b/ImageMagick-6.9.12-44/coders/pdb.c new file mode 100644 index 0000000..e141b7c --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pdb.c @@ -0,0 +1,1017 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP DDDD BBBB % +% P P D D B B % +% PPPP D D BBBB % +% P D D B B % +% P DDDD BBBB % +% % +% % +% Read/Write Palm Database ImageViewer Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% 20071202 TS * rewrote RLE decoder - old version could cause buffer overflows +% * failure of RLE decoding now thows error RLEDecoderError +% * fixed bug in RLE decoding - now all rows are decoded, not just +% the first one +% * fixed bug in reader - record offsets now handled correctly +% * fixed bug in reader - only bits 0..2 indicate compression type +% * in writer: now using image color count instead of depth +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colormap-private.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/timer-private.h" +#include "magick/utility.h" + +/* + Typedef declarations. +*/ +typedef struct _PDBInfo +{ + char + name[32]; + + short int + attributes, + version; + + size_t + create_time, + modify_time, + archive_time, + modify_number, + application_info, + sort_info; + + char + type[4], /* database type identifier "vIMG" */ + id[4]; /* database creator identifier "View" */ + + size_t + seed, + next_record; + + short int + number_records; +} PDBInfo; + +typedef struct _PDBImage +{ + char + name[32], + version; + + size_t + reserved_1, + note; + + short int + x_last, + y_last; + + size_t + reserved_2; + + short int + width, + height; + + unsigned char + type; + + unsigned short + x_anchor, + y_anchor; + +} PDBImage; +/* + Forward declarations. +*/ +static MagickBooleanType + WritePDBImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DecodeImage unpacks the packed image pixels into runlength-encoded +% pixel packets. +% +% The format of the DecodeImage method is: +% +% MagickBooleanType DecodeImage(Image *image,unsigned char *pixels, +% const size_t length) +% +% A description of each parameter follows: +% +% o image: the address of a structure of type Image. +% +% o pixels: The address of a byte (8 bits) array of pixel data created by +% the decoding process. +% +% o length: Number of bytes to read into buffer 'pixels'. +% +*/ +static MagickBooleanType DecodeImage(Image *image, unsigned char *pixels, + const size_t length) +{ +#define RLE_MODE_NONE -1 +#define RLE_MODE_COPY 0 +#define RLE_MODE_RUN 1 + + int data = 0, count = 0; + unsigned char *p; + int mode = RLE_MODE_NONE; + + for (p = pixels; p < pixels + length; p++) { + if (0 == count) { + data = ReadBlobByte( image ); + if (-1 == data) return MagickFalse; + if (data > 128) { + mode = RLE_MODE_RUN; + count = data - 128 + 1; + data = ReadBlobByte( image ); + if (-1 == data) return MagickFalse; + } else { + mode = RLE_MODE_COPY; + count = data + 1; + } + } + + if (RLE_MODE_COPY == mode) { + data = ReadBlobByte( image ); + if (-1 == data) return MagickFalse; + } + *p = (unsigned char)data; + --count; + } + return MagickTrue; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P D B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPDB() returns MagickTrue if the image format type, identified by the +% magick string, is PDB. +% +% The format of the ReadPDBImage method is: +% +% MagickBooleanType IsPDB(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsPDB(const unsigned char *magick,const size_t length) +{ + if (length < 68) + return(MagickFalse); + if (memcmp(magick+60,"vIMGView",8) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P D B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPDBImage() reads an Pilot image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadPDBImage method is: +% +% Image *ReadPDBImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadPDBImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + unsigned char + attributes, + tag[3]; + + Image + *image; + + IndexPacket + index; + + MagickBooleanType + status; + + PDBImage + pdb_image; + + PDBInfo + pdb_info; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + unsigned char + *p; + + size_t + bits_per_pixel, + num_pad_bytes, + one, + packets; + + ssize_t + count, + img_offset, + comment_offset = 0, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Determine if this a PDB image file. + */ + (void) memset(&pdb_info,0,sizeof(pdb_info)); + count=ReadBlob(image,sizeof(pdb_info.name),(unsigned char *) pdb_info.name); + if (count != sizeof(pdb_info.name)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + pdb_info.attributes=(short) ReadBlobMSBShort(image); + pdb_info.version=(short) ReadBlobMSBShort(image); + pdb_info.create_time=ReadBlobMSBLong(image); + pdb_info.modify_time=ReadBlobMSBLong(image); + pdb_info.archive_time=ReadBlobMSBLong(image); + pdb_info.modify_number=ReadBlobMSBLong(image); + pdb_info.application_info=ReadBlobMSBLong(image); + pdb_info.sort_info=ReadBlobMSBLong(image); + (void) ReadBlob(image,4,(unsigned char *) pdb_info.type); + (void) ReadBlob(image,4,(unsigned char *) pdb_info.id); + pdb_info.seed=ReadBlobMSBLong(image); + pdb_info.next_record=ReadBlobMSBLong(image); + pdb_info.number_records=(short) ReadBlobMSBShort(image); + if ((memcmp(pdb_info.type,"vIMG",4) != 0) || + (memcmp(pdb_info.id,"View",4) != 0)) + if (pdb_info.next_record != 0) + ThrowReaderException(CoderError,"MultipleRecordListNotSupported"); + /* + Read record header. + */ + img_offset=(ssize_t) ReadBlobMSBSignedLong(image); + attributes=(unsigned char) (ReadBlobByte(image)); + (void) attributes; + count=ReadBlob(image,3,(unsigned char *) tag); + if (count != 3 || memcmp(tag,"\x6f\x80\x00",3) != 0) + ThrowReaderException(CorruptImageError,"CorruptImage"); + if (pdb_info.number_records > 1) + { + comment_offset=(ssize_t) ReadBlobMSBSignedLong(image); + attributes=(unsigned char) (ReadBlobByte(image)); + count=ReadBlob(image,3,(unsigned char *) tag); + if (count != 3 || memcmp(tag,"\x6f\x80\x01",3) != 0) + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + num_pad_bytes = (size_t) (img_offset - TellBlob( image )); + while (num_pad_bytes-- != 0) + { + int + c; + + c=ReadBlobByte(image); + if (c == EOF) + break; + } + /* + Read image header. + */ + count=ReadBlob(image,sizeof(pdb_image.name),(unsigned char *) pdb_image.name); + if (count != sizeof(pdb_image.name)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + pdb_image.version=ReadBlobByte(image); + pdb_image.type=(unsigned char) ReadBlobByte(image); + pdb_image.reserved_1=ReadBlobMSBLong(image); + pdb_image.note=ReadBlobMSBLong(image); + pdb_image.x_last=(short) ReadBlobMSBShort(image); + pdb_image.y_last=(short) ReadBlobMSBShort(image); + pdb_image.reserved_2=ReadBlobMSBLong(image); + pdb_image.x_anchor=ReadBlobMSBShort(image); + pdb_image.y_anchor=ReadBlobMSBShort(image); + pdb_image.width=(short) ReadBlobMSBShort(image); + pdb_image.height=(short) ReadBlobMSBShort(image); + /* + Initialize image structure. + */ + image->columns=(size_t) pdb_image.width; + image->rows=(size_t) pdb_image.height; + image->depth=8; + image->storage_class=PseudoClass; + bits_per_pixel=pdb_image.type == 0 ? 2UL : pdb_image.type == 2 ? 4UL : 1UL; + one=1; + if (AcquireImageColormap(image,one << bits_per_pixel) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status != MagickFalse) + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + packets=(bits_per_pixel*image->columns+7)/8; + pixels=(unsigned char *) AcquireQuantumMemory(packets+257UL,image->rows* + sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(pixels,0,(packets+257UL)*image->rows*sizeof(*pixels)); + switch (pdb_image.version & 0x07) + { + case 0: + { + image->compression=NoCompression; + count=(ssize_t) ReadBlob(image,packets*image->rows,pixels); + if (count != (ssize_t) (packets*image->rows)) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowReaderException( CorruptImageError,"RLEDecoderError"); + } + break; + } + case 1: + { + image->compression=RLECompression; + if (DecodeImage(image,pixels,packets*image->rows) == MagickFalse) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowReaderException( CorruptImageError,"RLEDecoderError"); + } + break; + } + default: + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowReaderException(CorruptImageError, + "UnrecognizedImageCompressionType"); + } + } + p=pixels; + switch (bits_per_pixel) + { + case 1: + { + int + bit; + + /* + Read 1-bit PDB image. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + bit=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + index=(Quantum) (*p & (0x80 >> bit) ? 0x00 : 0x01); + indexes[x]=index; + q++; + bit++; + if (bit == 8) + { + p++; + bit=0; + } + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) SyncImage(image); + break; + } + case 2: + { + unsigned int + shift; + + /* + Read 2-bit PDB image. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + shift=8; + for (x=0; x < (ssize_t) image->columns; x++) + { + shift-=2; + index=ConstrainColormapIndex(image,3UL-((*p >> shift) & 0x03)); + SetPixelIndex(indexes+x,index); + if (shift == 0) + { + shift=8; + p++; + } + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) SyncImage(image); + break; + } + case 4: + { + unsigned int + shift; + + /* + Read 4-bit PDB image. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + shift=8; + for (x=0; x < (ssize_t) image->columns; x++) + { + shift-=4; + index=ConstrainColormapIndex(image,15UL-((*p >> shift) & 0x0f)); + SetPixelIndex(indexes+x,index); + if (shift == 0) + { + shift=8; + p++; + } + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) SyncImage(image); + break; + } + default: + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + if (pdb_info.number_records > 1) + { + char + *comment; + + int + c; + + char + *p; + + size_t + length; + + num_pad_bytes = (size_t) (comment_offset - TellBlob( image )); + while (num_pad_bytes-- != 0) + { + int + c; + + c=ReadBlobByte(image); + if (c == EOF) + break; + } + + /* + Read comment. + */ + c=ReadBlobByte(image); + length=MaxTextExtent; + comment=AcquireString((char *) NULL); + for (p=comment; c != EOF; p++) + { + if ((size_t) (p-comment+MaxTextExtent) >= length) + { + *p='\0'; + length<<=1; + length+=MaxTextExtent; + comment=(char *) ResizeQuantumMemory(comment,length+MaxTextExtent, + sizeof(*comment)); + if (comment == (char *) NULL) + break; + p=comment+strlen(comment); + } + *p=c; + c=ReadBlobByte(image); + } + *p='\0'; + if (comment == (char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) SetImageProperty(image,"comment",comment); + comment=DestroyString(comment); + } + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P D B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPDBImage() adds properties for the PDB image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPDBImage method is: +% +% size_t RegisterPDBImage(void) +% +*/ +ModuleExport size_t RegisterPDBImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PDB"); + entry->decoder=(DecodeImageHandler *) ReadPDBImage; + entry->encoder=(EncodeImageHandler *) WritePDBImage; + entry->magick=(IsImageFormatHandler *) IsPDB; + entry->description=ConstantString("Palm Database ImageViewer Format"); + entry->magick_module=ConstantString("PDB"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P D B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPDBImage() removes format registrations made by the +% PDB module from the list of supported formats. +% +% The format of the UnregisterPDBImage method is: +% +% UnregisterPDBImage(void) +% +*/ +ModuleExport void UnregisterPDBImage(void) +{ + (void) UnregisterMagickInfo("PDB"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P D B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePDBImage() writes an image +% +% The format of the WritePDBImage method is: +% +% MagickBooleanType WritePDBImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% +*/ + +static unsigned char *EncodeRLE(unsigned char *destination, + unsigned char *source,size_t literal,size_t repeat) +{ + if (literal > 0) + *destination++=(unsigned char) (literal-1); + (void) memcpy(destination,source,literal); + destination+=literal; + if (repeat > 0) + { + *destination++=(unsigned char) (0x80 | (repeat-1)); + *destination++=source[literal]; + } + return(destination); +} + +static MagickBooleanType WritePDBImage(const ImageInfo *image_info,Image *image) +{ + char + filename[MaxTextExtent]; + + const char + *comment; + + int + bits; + + MagickBooleanType + status; + + PDBImage + pdb_image; + + PDBInfo + pdb_info; + + QuantumInfo + *quantum_info; + + const PixelPacket + *p; + + ssize_t + x; + + unsigned char + *q; + + size_t + bits_per_pixel, + literal, + packets, + packet_size, + repeat; + + ssize_t + y; + + unsigned char + *buffer, + *runlength, + *scanline; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + if ((image -> colors <= 2 ) || + (GetImageType(image,&image->exception ) == BilevelType)) { + bits_per_pixel=1; + } else if (image->colors <= 4) { + bits_per_pixel=2; + } else if (image->colors <= 8) { + bits_per_pixel=3; + } else { + bits_per_pixel=4; + } + (void) memset(&pdb_info,0,sizeof(pdb_info)); + (void) memset(&pdb_image,0,sizeof(pdb_image)); + GetPathComponent(image_info->filename,TailPath,filename); + (void) CopyMagickString(pdb_info.name,filename,sizeof(pdb_info.name)); + pdb_info.attributes=0; + pdb_info.version=0; + pdb_info.create_time=GetMagickTime(); + pdb_info.modify_time=pdb_info.create_time; + pdb_info.archive_time=0; + pdb_info.modify_number=0; + pdb_info.application_info=0; + pdb_info.sort_info=0; + (void) memcpy(pdb_info.type,"vIMG",4); + (void) memcpy(pdb_info.id,"View",4); + pdb_info.seed=0; + pdb_info.next_record=0; + comment=GetImageProperty(image,"comment"); + pdb_info.number_records=(comment == (const char *) NULL ? 1 : 2); + (void) WriteBlob(image,sizeof(pdb_info.name),(unsigned char *) pdb_info.name); + (void) WriteBlobMSBShort(image,(unsigned short) pdb_info.attributes); + (void) WriteBlobMSBShort(image,(unsigned short) pdb_info.version); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_info.create_time); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_info.modify_time); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_info.archive_time); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_info.modify_number); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_info.application_info); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_info.sort_info); + (void) WriteBlob(image,4,(unsigned char *) pdb_info.type); + (void) WriteBlob(image,4,(unsigned char *) pdb_info.id); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_info.seed); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_info.next_record); + (void) WriteBlobMSBShort(image,(unsigned short) pdb_info.number_records); + (void) CopyMagickString(pdb_image.name,pdb_info.name,sizeof(pdb_image.name)); + pdb_image.version=1; /* RLE Compressed */ + switch (bits_per_pixel) + { + case 1: pdb_image.type=(unsigned char) 0xff; break; /* monochrome */ + case 2: pdb_image.type=(unsigned char) 0x00; break; /* 2 bit gray */ + default: pdb_image.type=(unsigned char) 0x02; /* 4 bit gray */ + } + pdb_image.reserved_1=0; + pdb_image.note=0; + pdb_image.x_last=0; + pdb_image.y_last=0; + pdb_image.reserved_2=0; + pdb_image.x_anchor=(unsigned short) 0xffff; + pdb_image.y_anchor=(unsigned short) 0xffff; + pdb_image.width=(short) image->columns; + if (image->columns % 16) + pdb_image.width=(short) (16*(image->columns/16+1)); + pdb_image.height=(short) image->rows; + packets=((bits_per_pixel*image->columns+7)/8); + packet_size=(size_t) (bits_per_pixel > 8 ? 2 : 1); + runlength=(unsigned char *) AcquireQuantumMemory(9UL*packets, + image->rows*sizeof(*runlength)); + buffer=(unsigned char *) AcquireQuantumMemory(512,sizeof(*buffer)); + scanline=(unsigned char *) AcquireQuantumMemory(image->columns,packet_size* + sizeof(*scanline)); + if ((runlength == (unsigned char *) NULL) || + (buffer == (unsigned char *) NULL) || + (scanline == (unsigned char *) NULL)) + { + if (runlength != (unsigned char *) NULL) + runlength=(unsigned char *) RelinquishMagickMemory(runlength); + if (buffer != (unsigned char *) NULL) + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + if (scanline != (unsigned char *) NULL) + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(buffer,0,512*sizeof(*buffer)); + (void) memset(scanline,0,image->columns*packet_size*sizeof(*scanline)); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Convert to GRAY raster scanline. + */ + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + { + if (runlength != (unsigned char *) NULL) + runlength=(unsigned char *) RelinquishMagickMemory(runlength); + if (buffer != (unsigned char *) NULL) + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + if (scanline != (unsigned char *) NULL) + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + status=SetQuantumDepth(image,quantum_info,bits_per_pixel > 8 ? 16 : 8); + bits=8/(int) bits_per_pixel-1; /* start at most significant bits */ + literal=0; + repeat=0; + q=runlength; + buffer[0]=0x00; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + GrayQuantum,scanline,&image->exception); + for (x=0; x < (ssize_t) pdb_image.width; x++) + { + if (x < (ssize_t) image->columns) + buffer[literal+repeat]|=(0xff-scanline[x*packet_size]) >> + (8-bits_per_pixel) << bits*bits_per_pixel; + bits--; + if (bits < 0) + { + if (((literal+repeat) > 0) && + (buffer[literal+repeat] == buffer[literal+repeat-1])) + { + if (repeat == 0) + { + literal--; + repeat++; + } + repeat++; + if (0x7f < repeat) + { + q=EncodeRLE(q,buffer,literal,repeat); + literal=0; + repeat=0; + } + } + else + { + if (repeat >= 2) + literal+=repeat; + else + { + q=EncodeRLE(q,buffer,literal,repeat); + buffer[0]=buffer[literal+repeat]; + literal=0; + } + literal++; + repeat=0; + if (0x7f < literal) + { + q=EncodeRLE(q,buffer,(literal < 0x80 ? literal : 0x80),0); + (void) memmove(buffer,buffer+literal+repeat,0x80); + literal-=0x80; + } + } + bits=8/(int) bits_per_pixel-1; + buffer[literal+repeat]=0x00; + } + } + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + q=EncodeRLE(q,buffer,literal,repeat); + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + quantum_info=DestroyQuantumInfo(quantum_info); + /* + Write the Image record header. + */ + (void) WriteBlobMSBLong(image,(unsigned int) (TellBlob(image)+8* + pdb_info.number_records)); + (void) WriteBlobByte(image,0x40); + (void) WriteBlobByte(image,0x6f); + (void) WriteBlobByte(image,0x80); + (void) WriteBlobByte(image,0); + if (pdb_info.number_records > 1) + { + /* + Write the comment record header. + */ + (void) WriteBlobMSBLong(image,(unsigned int) (TellBlob(image)+8+58+q- + runlength)); + (void) WriteBlobByte(image,0x40); + (void) WriteBlobByte(image,0x6f); + (void) WriteBlobByte(image,0x80); + (void) WriteBlobByte(image,1); + } + /* + Write the Image data. + */ + (void) WriteBlob(image,sizeof(pdb_image.name),(unsigned char *) + pdb_image.name); + (void) WriteBlobByte(image,(unsigned char) pdb_image.version); + (void) WriteBlobByte(image,pdb_image.type); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_image.reserved_1); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_image.note); + (void) WriteBlobMSBShort(image,(unsigned short) pdb_image.x_last); + (void) WriteBlobMSBShort(image,(unsigned short) pdb_image.y_last); + (void) WriteBlobMSBLong(image,(unsigned int) pdb_image.reserved_2); + (void) WriteBlobMSBShort(image,pdb_image.x_anchor); + (void) WriteBlobMSBShort(image,pdb_image.y_anchor); + (void) WriteBlobMSBShort(image,(unsigned short) pdb_image.width); + (void) WriteBlobMSBShort(image,(unsigned short) pdb_image.height); + (void) WriteBlob(image,(size_t) (q-runlength),runlength); + runlength=(unsigned char *) RelinquishMagickMemory(runlength); + if (comment != (const char *) NULL) + (void) WriteBlobString(image,comment); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/pdf.c b/ImageMagick-6.9.12-44/coders/pdf.c new file mode 100644 index 0000000..a13d73f --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pdf.c @@ -0,0 +1,3102 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP DDDD FFFFF % +% P P D D F % +% PPPP D D FFF % +% P D D F % +% P DDDD F % +% % +% % +% Read/Write Portable Document Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/compress.h" +#include "magick/constitute.h" +#include "magick/delegate.h" +#include "magick/delegate-private.h" +#include "magick/distort.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/magick-type.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/montage.h" +#include "magick/nt-base-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/signature.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/timer-private.h" +#include "magick/token.h" +#include "magick/transform.h" +#include "magick/utility.h" +#include "coders/bytebuffer-private.h" +#include "coders/ghostscript-private.h" + +/* + Define declarations. +*/ +#if defined(MAGICKCORE_TIFF_DELEGATE) +#define CCITTParam "-1" +#else +#define CCITTParam "0" +#endif + +/* + Typedef declaractions. +*/ +typedef struct _PDFInfo +{ + double + angle; + + MagickBooleanType + cmyk, + cropbox, + trimbox; + + SegmentInfo + bounds; + + StringInfo + *profile; + +} PDFInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePDFImage(const ImageInfo *,Image *), + WritePOCKETMODImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P D F % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPDF() returns MagickTrue if the image format type, identified by the +% magick string, is PDF. +% +% The format of the IsPDF method is: +% +% MagickBooleanType IsPDF(const unsigned char *magick,const size_t offset) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o offset: Specifies the offset of the magick string. +% +*/ +static MagickBooleanType IsPDF(const unsigned char *magick,const size_t offset) +{ + if (offset < 5) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"%PDF-",5) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P D F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPDFImage() reads a Portable Document Format image file and +% returns it. It allocates the memory necessary for the new Image structure +% and returns a pointer to the new image. +% +% The format of the ReadPDFImage method is: +% +% Image *ReadPDFImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static void ReadPDFInfo(const ImageInfo *image_info,Image *image, + PDFInfo *pdf_info) +{ +#define CMYKProcessColor "CMYKProcessColor" +#define CropBox "CropBox" +#define DefaultCMYK "DefaultCMYK" +#define DeviceCMYK "DeviceCMYK" +#define MediaBox "MediaBox" +#define PDFRotate "Rotate" +#define SpotColor "Separation" +#define TrimBox "TrimBox" +#define PDFVersion "PDF-" + + char + version[MagickPathExtent]; + + int + c, + percent_count; + + MagickByteBuffer + buffer; + + char + *p; + + ssize_t + i; + + SegmentInfo + bounds; + + size_t + spotcolor; + + ssize_t + count; + + (void) memset(&bounds,0,sizeof(bounds)); + (void) memset(pdf_info,0,sizeof(*pdf_info)); + pdf_info->cmyk=image_info->colorspace == CMYKColorspace ? MagickTrue : + MagickFalse; + pdf_info->cropbox=IsStringTrue(GetImageOption(image_info,"pdf:use-cropbox")); + pdf_info->trimbox=IsStringTrue(GetImageOption(image_info,"pdf:use-trimbox")); + *version='\0'; + spotcolor=0; + percent_count=0; + (void) memset(&buffer,0,sizeof(buffer)); + buffer.image=image; + for (c=ReadMagickByteBuffer(&buffer); c != EOF; c=ReadMagickByteBuffer(&buffer)) + { + if (c == '%') + { + if (*version == '\0') + { + i=0; + for (c=ReadMagickByteBuffer(&buffer); c != EOF; c=ReadMagickByteBuffer(&buffer)) + { + if ((c == '\r') || (c == '\n') || ((i+1) == MagickPathExtent)) + break; + version[i++]=(char) c; + } + version[i]='\0'; + if (c == EOF) + break; + } + if (++percent_count == 2) + percent_count=0; + else + continue; + } + else + { + percent_count=0; + switch(c) + { + case '<': + { + ReadGhostScriptXMPProfile(&buffer,&pdf_info->profile); + continue; + } + case '/': + break; + default: + continue; + } + } + if (CompareMagickByteBuffer(&buffer,PDFRotate,strlen(PDFRotate)) != MagickFalse) + { + p=GetMagickByteBufferDatum(&buffer); + (void) sscanf(p,PDFRotate" %lf",&pdf_info->angle); + } + if (pdf_info->cmyk == MagickFalse) + { + if ((CompareMagickByteBuffer(&buffer,DefaultCMYK,strlen(DefaultCMYK)) != MagickFalse) || + (CompareMagickByteBuffer(&buffer,DeviceCMYK,strlen(DeviceCMYK)) != MagickFalse) || + (CompareMagickByteBuffer(&buffer,CMYKProcessColor,strlen(CMYKProcessColor)) != MagickFalse)) + { + pdf_info->cmyk=MagickTrue; + continue; + } + } + if (CompareMagickByteBuffer(&buffer,SpotColor,strlen(SpotColor)) != MagickFalse) + { + char + name[MagickPathExtent], + property[MagickPathExtent], + *value; + + /* + Note spot names. + */ + (void) FormatLocaleString(property,MagickPathExtent, + "pdf:SpotColor-%.20g",(double) spotcolor++); + i=0; + SkipMagickByteBuffer(&buffer,strlen(SpotColor)+1); + for (c=ReadMagickByteBuffer(&buffer); c != EOF; c=ReadMagickByteBuffer(&buffer)) + { + if ((isspace((int) ((unsigned char) c)) != 0) || (c == '/') || ((i+1) == MagickPathExtent)) + break; + name[i++]=(char) c; + } + name[i]='\0'; + if (c == EOF) + break; + value=ConstantString(name); + (void) SubstituteString(&value,"#20"," "); + if (*value != '\0') + (void) SetImageProperty(image,property,value); + value=DestroyString(value); + continue; + } + if (image_info->page != (char *) NULL) + continue; + count=0; + if (pdf_info->cropbox != MagickFalse) + { + if (CompareMagickByteBuffer(&buffer,CropBox,strlen(CropBox)) != MagickFalse) + { + /* + Note region defined by crop box. + */ + p=GetMagickByteBufferDatum(&buffer); + count=(ssize_t) sscanf(p,"CropBox [%lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + if (count != 4) + count=(ssize_t) sscanf(p,"CropBox[%lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + } + } + else + if (pdf_info->trimbox != MagickFalse) + { + if (CompareMagickByteBuffer(&buffer,TrimBox,strlen(TrimBox)) != MagickFalse) + { + /* + Note region defined by trim box. + */ + p=GetMagickByteBufferDatum(&buffer); + count=(ssize_t) sscanf(p,"TrimBox [%lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + if (count != 4) + count=(ssize_t) sscanf(p,"TrimBox[%lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + } + } + else + if (CompareMagickByteBuffer(&buffer,MediaBox,strlen(MediaBox)) != MagickFalse) + { + /* + Note region defined by media box. + */ + p=GetMagickByteBufferDatum(&buffer); + count=(ssize_t) sscanf(p,"MediaBox [%lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + if (count != 4) + count=(ssize_t) sscanf(p,"MediaBox[%lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + } + if (count != 4) + continue; + if ((fabs(bounds.x2-bounds.x1) <= fabs(pdf_info->bounds.x2-pdf_info->bounds.x1)) || + (fabs(bounds.y2-bounds.y1) <= fabs(pdf_info->bounds.y2-pdf_info->bounds.y1))) + continue; + pdf_info->bounds=bounds; + } + if (version[0] != '\0') + (void) SetImageProperty(image,"pdf:Version",version); +} + +static inline void CleanupPDFInfo(PDFInfo *pdf_info) +{ + if (pdf_info->profile != (StringInfo *) NULL) + pdf_info->profile=DestroyStringInfo(pdf_info->profile); +} + +static Image *ReadPDFImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + command[MaxTextExtent], + *density, + filename[MaxTextExtent], + geometry[MaxTextExtent], + *options, + input_filename[MaxTextExtent], + message[MaxTextExtent], + postscript_filename[MaxTextExtent]; + + const char + *option; + + const DelegateInfo + *delegate_info; + + GeometryInfo + geometry_info; + + Image + *image, + *next, + *pdf_image; + + ImageInfo + *read_info; + + int + file; + + MagickBooleanType + fitPage, + status, + stop_on_error; + + MagickStatusType + flags; + + PDFInfo + info; + + PointInfo + delta; + + RectangleInfo + page; + + ssize_t + i; + + size_t + scene; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + /* + Open image file. + */ + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + status=AcquireUniqueSymbolicLink(image_info->filename,input_filename); + if (status == MagickFalse) + { + ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile", + image_info->filename); + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Set the page density. + */ + delta.x=DefaultResolution; + delta.y=DefaultResolution; + if ((image->x_resolution == 0.0) || (image->y_resolution == 0.0)) + { + flags=ParseGeometry(PSDensityGeometry,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + if (image_info->density != (char *) NULL) + { + flags=ParseGeometry(image_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + (void) memset(&page,0,sizeof(page)); + (void) ParseAbsoluteGeometry(PSPageGeometry,&page); + if (image_info->page != (char *) NULL) + (void) ParseAbsoluteGeometry(image_info->page,&page); + page.width=(size_t) ((ssize_t) ceil((double) (page.width* + image->x_resolution/delta.x)-0.5)); + page.height=(size_t) ((ssize_t) ceil((double) (page.height* + image->y_resolution/delta.y)-0.5)); + /* + Determine page geometry from the PDF media box. + */ + ReadPDFInfo(image_info,image,&info); + (void) CloseBlob(image); + /* + Set PDF render geometry. + */ + if ((fabs(info.bounds.x2-info.bounds.x1) >= MagickEpsilon) && + (fabs(info.bounds.y2-info.bounds.y1) >= MagickEpsilon)) + { + (void) FormatLocaleString(geometry,MaxTextExtent,"%gx%g%+.15g%+.15g", + info.bounds.x2-info.bounds.x1,info.bounds.y2- + info.bounds.y1,info.bounds.x1,info.bounds.y1); + (void) SetImageProperty(image,"pdf:HiResBoundingBox",geometry); + page.width=(size_t) ((ssize_t) ceil((double) ((info.bounds.x2- + info.bounds.x1)*image->x_resolution/delta.x)-0.5)); + page.height=(size_t) ((ssize_t) ceil((double) ((info.bounds.y2- + info.bounds.y1)*image->y_resolution/delta.y)-0.5)); + } + fitPage=MagickFalse; + option=GetImageOption(image_info,"pdf:fit-page"); + if (option != (char *) NULL) + { + char + *geometry; + + MagickStatusType + flags; + + geometry=GetPageGeometry(option); + flags=ParseMetaGeometry(geometry,&page.x,&page.y,&page.width, + &page.height); + if (flags == NoValue) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "InvalidGeometry","`%s'",option); + CleanupPDFInfo(&info); + image=DestroyImage(image); + return((Image *) NULL); + } + page.width=(size_t) ((ssize_t) ceil((double) (page.width* + image->x_resolution/delta.x)-0.5)); + page.height=(size_t) ((ssize_t) ceil((double) (page.height* + image->y_resolution/delta.y)-0.5)); + geometry=DestroyString(geometry); + fitPage=MagickTrue; + } + if ((fabs(info.angle) == 90.0) || (fabs(info.angle) == 270.0)) + { + size_t + swap; + + swap=page.width; + page.width=page.height; + page.height=swap; + } + if (IssRGBCompatibleColorspace(image_info->colorspace) != MagickFalse) + info.cmyk=MagickFalse; + stop_on_error=IsStringTrue(GetImageOption(image_info,"pdf:stop-on-error")); + /* + Create Ghostscript control file. + */ + file=AcquireUniqueFileResource(postscript_filename); + if (file == -1) + { + ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile", + image_info->filename); + CleanupPDFInfo(&info); + image=DestroyImage(image); + return((Image *) NULL); + } + if (write(file," ",1) != 1) + ; + file=close(file)-1; + /* + Render Postscript with the Ghostscript delegate. + */ + if (image_info->monochrome != MagickFalse) + delegate_info=GetDelegateInfo("ps:mono",(char *) NULL,exception); + else + if (info.cmyk != MagickFalse) + delegate_info=GetDelegateInfo("ps:cmyk",(char *) NULL,exception); + else + delegate_info=GetDelegateInfo("ps:alpha",(char *) NULL,exception); + if (delegate_info == (const DelegateInfo *) NULL) + { + (void) RelinquishUniqueFileResource(postscript_filename); + CleanupPDFInfo(&info); + image=DestroyImage(image); + return((Image *) NULL); + } + density=AcquireString(""); + options=AcquireString(""); + (void) FormatLocaleString(density,MaxTextExtent,"%gx%g",image->x_resolution, + image->y_resolution); + if (image_info->ping != MagickFalse) + (void) FormatLocaleString(density,MagickPathExtent,"2.0x2.0"); + else + if ((image_info->page != (char *) NULL) || (fitPage != MagickFalse)) + (void) FormatLocaleString(options,MaxTextExtent,"-g%.20gx%.20g ", + (double) page.width,(double) page.height); + (void) ConcatenateMagickString(options,"-dPrinted=false ",MagickPathExtent); + if (fitPage != MagickFalse) + (void) ConcatenateMagickString(options,"-dPSFitPage ",MaxTextExtent); + if (info.cropbox != MagickFalse) + (void) ConcatenateMagickString(options,"-dUseCropBox ",MaxTextExtent); + if (info.trimbox != MagickFalse) + (void) ConcatenateMagickString(options,"-dUseTrimBox ",MaxTextExtent); + if (stop_on_error != MagickFalse) + (void) ConcatenateMagickString(options,"-dPDFSTOPONERROR ",MaxTextExtent); + if (image_info->authenticate != (char *) NULL) + { + char + passphrase[MagickPathExtent], + *sanitize_passphrase; + + sanitize_passphrase=SanitizeDelegateString(image_info->authenticate); +#if defined(MAGICKCORE_WINDOWS_SUPPORT) + (void) FormatLocaleString(passphrase,MagickPathExtent, + "-sPDFPassword=\"%s\" ",sanitize_passphrase); +#else + (void) FormatLocaleString(passphrase,MagickPathExtent, + "-sPDFPassword='%s' ",sanitize_passphrase); +#endif + sanitize_passphrase=DestroyString(sanitize_passphrase); + (void) ConcatenateMagickString(options,passphrase,MagickPathExtent); + } + read_info=CloneImageInfo(image_info); + *read_info->magick='\0'; + if (read_info->number_scenes != 0) + { + char + pages[MaxTextExtent]; + + (void) FormatLocaleString(pages,MaxTextExtent,"-dFirstPage=%.20g " + "-dLastPage=%.20g",(double) read_info->scene+1,(double) + (read_info->scene+read_info->number_scenes)); + (void) ConcatenateMagickString(options,pages,MaxTextExtent); + read_info->number_scenes=0; + if (read_info->scenes != (char *) NULL) + *read_info->scenes='\0'; + } + (void) CopyMagickString(filename,read_info->filename,MaxTextExtent); + (void) AcquireUniqueFilename(filename); + (void) RelinquishUniqueFileResource(filename); + (void) ConcatenateMagickString(filename,"%d",MaxTextExtent); + (void) FormatLocaleString(command,MaxTextExtent, + GetDelegateCommands(delegate_info), + read_info->antialias != MagickFalse ? 4 : 1, + read_info->antialias != MagickFalse ? 4 : 1,density,options,filename, + postscript_filename,input_filename); + options=DestroyString(options); + density=DestroyString(density); + *message='\0'; + status=InvokeGhostscriptDelegate(read_info->verbose,command,message, + exception); + (void) RelinquishUniqueFileResource(postscript_filename); + (void) RelinquishUniqueFileResource(input_filename); + pdf_image=(Image *) NULL; + if (status == MagickFalse) + for (i=1; ; i++) + { + (void) InterpretImageFilename(image_info,image,filename,(int) i, + read_info->filename); + if (IsGhostscriptRendered(read_info->filename) == MagickFalse) + break; + (void) RelinquishUniqueFileResource(read_info->filename); + } + else + { + next=(Image *) NULL; + for (i=1; ; i++) + { + (void) InterpretImageFilename(image_info,image,filename,(int) i, + read_info->filename); + if (IsGhostscriptRendered(read_info->filename) == MagickFalse) + break; + read_info->blob=NULL; + read_info->length=0; + next=ReadImage(read_info,exception); + (void) RelinquishUniqueFileResource(read_info->filename); + if (next == (Image *) NULL) + break; + AppendImageToList(&pdf_image,next); + } + /* Clean up remaining files */ + if (next == (Image *) NULL) + { + ssize_t + j; + + for (j=i+1; ; j++) + { + (void) InterpretImageFilename(image_info,image,filename,(int) j, + read_info->filename); + if (IsGhostscriptRendered(read_info->filename) == MagickFalse) + break; + (void) RelinquishUniqueFileResource(read_info->filename); + } + } + } + read_info=DestroyImageInfo(read_info); + if (pdf_image == (Image *) NULL) + { + if (*message != '\0') + (void) ThrowMagickException(exception,GetMagickModule(),DelegateError, + "PDFDelegateFailed","`%s'",message); + CleanupPDFInfo(&info); + image=DestroyImage(image); + return((Image *) NULL); + } + if (LocaleCompare(pdf_image->magick,"BMP") == 0) + { + Image + *cmyk_image; + + cmyk_image=ConsolidateCMYKImages(pdf_image,exception); + if (cmyk_image != (Image *) NULL) + { + pdf_image=DestroyImageList(pdf_image); + pdf_image=cmyk_image; + } + } + if (info.profile != (StringInfo *) NULL) + { + char + *profile; + + (void) SetImageProfile(image,"xmp",info.profile); + profile=(char *) GetStringInfoDatum(info.profile); + if (strstr(profile,"Adobe Illustrator") != (char *) NULL) + (void) CopyMagickString(image->magick,"AI",MagickPathExtent); + } + CleanupPDFInfo(&info); + (void) CloseBlob(image); + if (image_info->number_scenes != 0) + { + Image + *clone_image; + + ssize_t + i; + + /* + Add place holder images to meet the subimage specification requirement. + */ + for (i=0; i < (ssize_t) image_info->scene; i++) + { + clone_image=CloneImage(pdf_image,1,1,MagickTrue,exception); + if (clone_image != (Image *) NULL) + PrependImageToList(&pdf_image,clone_image); + } + } + do + { + (void) CopyMagickString(pdf_image->filename,filename,MaxTextExtent); + (void) CopyMagickString(pdf_image->magick,image->magick,MaxTextExtent); + pdf_image->page=page; + if (image_info->ping != MagickFalse) + { + pdf_image->magick_columns=page.width; + pdf_image->magick_rows=page.height; + pdf_image->columns=page.width; + pdf_image->rows=page.height; + } + (void) CloneImageProfiles(pdf_image,image); + (void) CloneImageProperties(pdf_image,image); + next=SyncNextImageInList(pdf_image); + if (next != (Image *) NULL) + pdf_image=next; + } while (next != (Image *) NULL); + image=DestroyImage(image); + scene=0; + for (next=GetFirstImageInList(pdf_image); next != (Image *) NULL; ) + { + next->scene=scene++; + next=GetNextImageInList(next); + } + return(GetFirstImageInList(pdf_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P D F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPDFImage() adds properties for the PDF image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPDFImage method is: +% +% size_t RegisterPDFImage(void) +% +*/ +ModuleExport size_t RegisterPDFImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("AI"); + entry->decoder=(DecodeImageHandler *) ReadPDFImage; + entry->encoder=(EncodeImageHandler *) WritePDFImage; + entry->adjoin=MagickFalse; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Adobe Illustrator CS2"); + entry->mime_type=ConstantString("application/pdf"); + entry->magick_module=ConstantString("PDF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("EPDF"); + entry->decoder=(DecodeImageHandler *) ReadPDFImage; + entry->encoder=(EncodeImageHandler *) WritePDFImage; + entry->adjoin=MagickFalse; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Encapsulated Portable Document Format"); + entry->mime_type=ConstantString("application/pdf"); + entry->magick_module=ConstantString("PDF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PDF"); + entry->decoder=(DecodeImageHandler *) ReadPDFImage; + entry->encoder=(EncodeImageHandler *) WritePDFImage; + entry->magick=(IsImageFormatHandler *) IsPDF; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Portable Document Format"); + entry->mime_type=ConstantString("application/pdf"); + entry->magick_module=ConstantString("PDF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PDFA"); + entry->decoder=(DecodeImageHandler *) ReadPDFImage; + entry->encoder=(EncodeImageHandler *) WritePDFImage; + entry->magick=(IsImageFormatHandler *) IsPDF; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Portable Document Archive Format"); + entry->mime_type=ConstantString("application/pdf"); + entry->magick_module=ConstantString("PDF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("POCKETMOD"); + entry->decoder=(DecodeImageHandler *) ReadPDFImage; + entry->encoder=(EncodeImageHandler *) WritePOCKETMODImage; + entry->magick=(IsImageFormatHandler *) IsPDF; + entry->format_type=ImplicitFormatType; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Pocketmod Personal Organizer"); + entry->mime_type=ConstantString("application/pdf"); + entry->magick_module=ConstantString("PDF"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P D F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPDFImage() removes format registrations made by the +% PDF module from the list of supported formats. +% +% The format of the UnregisterPDFImage method is: +% +% UnregisterPDFImage(void) +% +*/ +ModuleExport void UnregisterPDFImage(void) +{ + (void) UnregisterMagickInfo("AI"); + (void) UnregisterMagickInfo("EPDF"); + (void) UnregisterMagickInfo("PDF"); + (void) UnregisterMagickInfo("PDFA"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P D F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePDFImage() writes an image in the Portable Document image +% format. +% +% The format of the WritePDFImage method is: +% +% MagickBooleanType WritePDFImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static char *EscapeParenthesis(const char *source) +{ + char + *destination; + + char + *q; + + const char + *p; + + size_t + length; + + assert(source != (const char *) NULL); + length=0; + for (p=source; *p != '\0'; p++) + { + if ((*p == '\\') || (*p == '(') || (*p == ')')) + { + if (~length < 1) + ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString"); + length++; + } + length++; + } + destination=(char *) NULL; + if (~length >= (MaxTextExtent-1)) + destination=(char *) AcquireQuantumMemory(length+MaxTextExtent, + sizeof(*destination)); + if (destination == (char *) NULL) + ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString"); + *destination='\0'; + q=destination; + for (p=source; *p != '\0'; p++) + { + if ((*p == '\\') || (*p == '(') || (*p == ')')) + *q++='\\'; + *q++=(*p); + } + *q='\0'; + return(destination); +} + +static size_t UTF8ToUTF16(const unsigned char *utf8,wchar_t *utf16) +{ + const unsigned char + *p; + + if (utf16 != (wchar_t *) NULL) + { + wchar_t + *q; + + wchar_t + c; + + /* + Convert UTF-8 to UTF-16. + */ + q=utf16; + for (p=utf8; *p != '\0'; p++) + { + if ((*p & 0x80) == 0) + *q=(*p); + else + if ((*p & 0xE0) == 0xC0) + { + c=(*p); + *q=(c & 0x1F) << 6; + p++; + if ((*p & 0xC0) != 0x80) + return(0); + *q|=(*p & 0x3F); + } + else + if ((*p & 0xF0) == 0xE0) + { + c=(*p); + *q=c << 12; + p++; + if ((*p & 0xC0) != 0x80) + return(0); + c=(*p); + *q|=(c & 0x3F) << 6; + p++; + if ((*p & 0xC0) != 0x80) + return(0); + *q|=(*p & 0x3F); + } + else + return(0); + q++; + } + *q++=(wchar_t) '\0'; + return((size_t) (q-utf16)); + } + /* + Compute UTF-16 string length. + */ + for (p=utf8; *p != '\0'; p++) + { + if ((*p & 0x80) == 0) + ; + else + if ((*p & 0xE0) == 0xC0) + { + p++; + if ((*p & 0xC0) != 0x80) + return(0); + } + else + if ((*p & 0xF0) == 0xE0) + { + p++; + if ((*p & 0xC0) != 0x80) + return(0); + p++; + if ((*p & 0xC0) != 0x80) + return(0); + } + else + return(0); + } + return((size_t) (p-utf8)); +} + +static wchar_t *ConvertUTF8ToUTF16(const unsigned char *source,size_t *length) +{ + wchar_t + *utf16; + + *length=UTF8ToUTF16(source,(wchar_t *) NULL); + if (*length == 0) + { + ssize_t + i; + + /* + Not UTF-8, just copy. + */ + *length=strlen((const char *) source); + utf16=(wchar_t *) AcquireQuantumMemory(*length+1,sizeof(*utf16)); + if (utf16 == (wchar_t *) NULL) + return((wchar_t *) NULL); + for (i=0; i <= (ssize_t) *length; i++) + utf16[i]=source[i]; + return(utf16); + } + utf16=(wchar_t *) AcquireQuantumMemory(*length+1,sizeof(*utf16)); + if (utf16 == (wchar_t *) NULL) + return((wchar_t *) NULL); + *length=UTF8ToUTF16(source,utf16); + return(utf16); +} + +static MagickBooleanType Huffman2DEncodeImage(const ImageInfo *image_info, + Image *image,Image *inject_image) +{ + Image + *group4_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + size_t + length; + + unsigned char + *group4; + + group4_image=CloneImage(inject_image,0,0,MagickTrue,&image->exception); + if (group4_image == (Image *) NULL) + return(MagickFalse); + status=MagickTrue; + write_info=CloneImageInfo(image_info); + (void) CopyMagickString(write_info->filename,"GROUP4:",MaxTextExtent); + (void) CopyMagickString(write_info->magick,"GROUP4",MaxTextExtent); + group4=(unsigned char *) ImageToBlob(write_info,group4_image,&length, + &image->exception); + group4_image=DestroyImage(group4_image); + write_info=DestroyImageInfo(write_info); + if (group4 == (unsigned char *) NULL) + return(MagickFalse); + if (WriteBlob(image,length,group4) != (ssize_t) length) + status=MagickFalse; + group4=(unsigned char *) RelinquishMagickMemory(group4); + return(status); +} + +static MagickBooleanType WritePOCKETMODImage(const ImageInfo *image_info, + Image *image) +{ +#define PocketPageOrder "1,2,3,4,0,7,6,5" + + const Image + *next; + + Image + *pages, + *pocket_mod; + + MagickBooleanType + status; + + ssize_t + i; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + pocket_mod=NewImageList(); + pages=NewImageList(); + i=0; + for (next=image; next != (Image *) NULL; next=GetNextImageInList(next)) + { + Image + *page; + + if ((i == 0) || (i == 5) || (i == 6) || (i == 7)) + page=RotateImage(next,180.0,&image->exception); + else + page=CloneImage(next,0,0,MagickTrue,&image->exception); + if (page == (Image *) NULL) + break; + (void) SetImageAlphaChannel(page,RemoveAlphaChannel); + page->scene=(size_t) i++; + AppendImageToList(&pages,page); + if ((i == 8) || (GetNextImageInList(next) == (Image *) NULL)) + { + Image + *images, + *page_layout; + + MontageInfo + *montage_info; + + /* + Create PocketMod page. + */ + for (i=(ssize_t) GetImageListLength(pages); i < 8; i++) + { + page=CloneImage(pages,0,0,MagickTrue,&image->exception); + (void) QueryColorCompliance("#FFF",AllCompliance, + &page->background_color,&image->exception); + (void) SetImageBackgroundColor(page); + page->scene=(size_t) i; + AppendImageToList(&pages,page); + } + images=CloneImages(pages,PocketPageOrder,&image->exception); + pages=DestroyImageList(pages); + if (images == (Image *) NULL) + break; + montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL); + (void) CloneString(&montage_info->geometry,"877x1240+0+0"); + (void) CloneString(&montage_info->tile,"4x2"); + (void) QueryColorCompliance("#000",AllCompliance, + &montage_info->border_color,&image->exception); + montage_info->border_width=2; + page_layout=MontageImages(images,montage_info,&image->exception); + montage_info=DestroyMontageInfo(montage_info); + images=DestroyImageList(images); + if (page_layout == (Image *) NULL) + break; + AppendImageToList(&pocket_mod,page_layout); + i=0; + } + } + if (pocket_mod == (Image *) NULL) + return(MagickFalse); + status=WritePDFImage(image_info,GetFirstImageInList(pocket_mod)); + pocket_mod=DestroyImageList(pocket_mod); + return(status); +} + +static const StringInfo* GetCompatibleColorProfile(const Image* image) +{ + ColorspaceType + colorspace; + + const StringInfo + *icc_profile; + + colorspace=UndefinedColorspace; + icc_profile=GetImageProfile(image,"icc"); + if (icc_profile == (const StringInfo *) NULL) + return((const StringInfo *) NULL); + if (GetStringInfoLength(icc_profile) > 20) + { + const char + *p; + + unsigned int + value; + + p=(const char *) GetStringInfoDatum(icc_profile)+16; + value=(unsigned int) (*p++) << 24; + value|=(unsigned int) (*p++) << 16; + value|=(unsigned int) (*p++) << 8; + value|=(unsigned int) *p; + switch (value) + { + case 0x58595a20: + colorspace=XYZColorspace; + break; + case 0x4c616220: + colorspace=LabColorspace; + break; + case 0x4c757620: + colorspace=LuvColorspace; + break; + case 0x59436272: + colorspace=YCbCrColorspace; + break; + case 0x52474220: + if ((image->colorspace == sRGBColorspace) || + (image->colorspace == RGBColorspace)) + return(icc_profile); + break; + case 0x47524159: + colorspace=GRAYColorspace; + break; + case 0x48535620: + colorspace=HSVColorspace; + break; + case 0x434D594B: + colorspace=CMYKColorspace; + break; + case 0x434D5920: + colorspace=CMYColorspace; + break; + } + } + if (image->colorspace == colorspace) + return(icc_profile); + return((const StringInfo *) NULL); +} + +static MagickBooleanType WritePDFImage(const ImageInfo *image_info,Image *image) +{ +#define CFormat "/Filter [ /%s ]\n" +#define ObjectsPerImage 14 +#define ThrowPDFException(exception,message) \ +{ \ + if (xref != (MagickOffsetType *) NULL) \ + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); \ + ThrowWriterException((exception),(message)); \ +} + + static const char + XMPProfile[]= + { + "\n" + "\n" + " \n" + " \n" + " %s\n" + " %s\n" + " %s\n" + " %s\n" + " \n" + " \n" + " application/pdf\n" + " \n" + " \n" + " %s\n" + " \n" + " \n" + " \n" + " \n" + " uuid:6ec119d7-7982-4f56-808d-dfe64f5b35cf\n" + " uuid:a79b99b4-6235-447f-9f6c-ec18ef7555cb\n" + " \n" + " \n" + " %s\n" + " \n" + " \n" + " 3\n" + " B\n" + " \n" + " \n" + "\n" + "\n" + }, + XMPProfileMagick[4]= { (char) -17, (char) -69, (char) -65, (char) 0 }; + + char + basename[MaxTextExtent], + buffer[MaxTextExtent], + date[MaxTextExtent], + *escape, + **labels, + page_geometry[MaxTextExtent], + *url; + + CompressionType + compression; + + const char + *device, + *option, + *value; + + const StringInfo + *icc_profile; + + double + pointsize; + + GeometryInfo + geometry_info; + + Image + *next, + *tile_image; + + MagickBooleanType + status; + + MagickOffsetType + offset, + scene, + *xref; + + MagickSizeType + number_pixels; + + MagickStatusType + flags; + + PointInfo + delta, + resolution, + scale; + + RectangleInfo + geometry, + media_info, + page_info; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + unsigned char + *q; + + ssize_t + i, + x; + + size_t + channels, + imageListLength, + info_id, + length, + object, + pages_id, + root_id, + text_size, + version; + + ssize_t + count, + page_count, + y; + + struct tm + utc_time; + + time_t + seconds; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + /* + Allocate X ref memory. + */ + xref=(MagickOffsetType *) AcquireQuantumMemory(2048UL,sizeof(*xref)); + if (xref == (MagickOffsetType *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(xref,0,2048UL*sizeof(*xref)); + /* + Write Info object. + */ + object=0; + version=3; + if (image_info->compression == JPEG2000Compression) + version=(size_t) MagickMax(version,5); + for (next=image; next != (Image *) NULL; next=GetNextImageInList(next)) + if (next->matte != MagickFalse) + version=(size_t) MagickMax(version,4); + if (LocaleCompare(image_info->magick,"PDFA") == 0) + version=(size_t) MagickMax(version,6); + for (next=image; next != (Image *) NULL; next=GetNextImageInList(next)) + { + (void) SetImageGray(image,&image->exception); + icc_profile=GetCompatibleColorProfile(next); + if (icc_profile != (StringInfo *) NULL) + { + (void) SetImageStorageClass(next,DirectClass); + version=(size_t) MagickMax(version,7); + } + if ((next->colorspace != CMYKColorspace) && + (IssRGBCompatibleColorspace(next->colorspace) == MagickFalse)) + (void) TransformImageColorspace(next,sRGBColorspace); + } + (void) FormatLocaleString(buffer,MaxTextExtent,"%%PDF-1.%.20g \n",(double) + version); + (void) WriteBlobString(image,buffer); + if (LocaleCompare(image_info->magick,"PDFA") == 0) + { + (void) WriteBlobByte(image,'%'); + (void) WriteBlobByte(image,0xe2); + (void) WriteBlobByte(image,0xe3); + (void) WriteBlobByte(image,0xcf); + (void) WriteBlobByte(image,0xd3); + (void) WriteBlobByte(image,'\n'); + } + /* + Write Catalog object. + */ + xref[object++]=TellBlob(image); + root_id=object; + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + if (LocaleCompare(image_info->magick,"PDFA") != 0) + (void) FormatLocaleString(buffer,MaxTextExtent,"/Pages %.20g 0 R\n",(double) + object+1); + else + { + (void) FormatLocaleString(buffer,MaxTextExtent,"/Metadata %.20g 0 R\n", + (double) object+1); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Pages %.20g 0 R\n", + (double) object+2); + } + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"/Type /Catalog"); + option=GetImageOption(image_info,"pdf:page-direction"); + if ((option != (const char *) NULL) && + (LocaleCompare(option,"right-to-left") == 0)) + (void) WriteBlobString(image,"/ViewerPreferences<>\n"); + (void) WriteBlobString(image,"\n"); + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"endobj\n"); + GetPathComponent(image->filename,BasePath,basename); + if (LocaleCompare(image_info->magick,"PDFA") == 0) + { + char + create_date[MaxTextExtent], + modify_date[MaxTextExtent], + timestamp[MaxTextExtent], + xmp_profile[MaxTextExtent]; + + /* + Write XMP object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + (void) WriteBlobString(image,"/Subtype /XML\n"); + *modify_date='\0'; + value=GetImageProperty(image,"date:modify"); + if (value != (const char *) NULL) + (void) CopyMagickString(modify_date,value,MaxTextExtent); + *create_date='\0'; + value=GetImageProperty(image,"date:create"); + if (value != (const char *) NULL) + (void) CopyMagickString(create_date,value,MaxTextExtent); + (void) FormatMagickTime(GetMagickTime(),MaxTextExtent,timestamp); + url=(char *) MagickAuthoritativeURL; + escape=EscapeParenthesis(basename); + i=FormatLocaleString(xmp_profile,MaxTextExtent,XMPProfile, + XMPProfileMagick,modify_date,create_date,timestamp,url,escape,url); + escape=DestroyString(escape); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Length %.20g\n",(double) + i); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"/Type /Metadata\n"); + (void) WriteBlobString(image,">>\nstream\n"); + (void) WriteBlobString(image,xmp_profile); + (void) WriteBlobString(image,"\nendstream\n"); + (void) WriteBlobString(image,"endobj\n"); + } + /* + Write Pages object. + */ + xref[object++]=TellBlob(image); + pages_id=object; + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + (void) WriteBlobString(image,"/Type /Pages\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Kids [ %.20g 0 R ",(double) + object+1); + (void) WriteBlobString(image,buffer); + count=(ssize_t) (pages_id+ObjectsPerImage+1); + page_count=1; + if (image_info->adjoin != MagickFalse) + { + Image + *kid_image; + + /* + Predict page object id's. + */ + kid_image=image; + for ( ; GetNextImageInList(kid_image) != (Image *) NULL; count+=ObjectsPerImage) + { + page_count++; + icc_profile=GetCompatibleColorProfile(kid_image); + if (icc_profile != (StringInfo *) NULL) + count+=2; + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 R ",(double) + count); + (void) WriteBlobString(image,buffer); + kid_image=GetNextImageInList(kid_image); + } + xref=(MagickOffsetType *) ResizeQuantumMemory(xref,(size_t) count+2048UL, + sizeof(*xref)); + if (xref == (MagickOffsetType *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) WriteBlobString(image,"]\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Count %.20g\n",(double) + page_count); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"endobj\n"); + scene=0; + imageListLength=GetImageListLength(image); + do + { + icc_profile=GetCompatibleColorProfile(image); + compression=image->compression; + if (image_info->compression != UndefinedCompression) + compression=image_info->compression; + switch (compression) + { + case FaxCompression: + case Group4Compression: + { + if ((SetImageMonochrome(image,&image->exception) == MagickFalse) || + (image->matte != MagickFalse)) + compression=RLECompression; + break; + } +#if !defined(MAGICKCORE_JPEG_DELEGATE) + case JPEGCompression: + { + compression=RLECompression; + (void) ThrowMagickException(&image->exception,GetMagickModule(), + MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","`%s' (JPEG)", + image->filename); + break; + } +#endif +#if !defined(MAGICKCORE_LIBOPENJP2_DELEGATE) + case JPEG2000Compression: + { + compression=RLECompression; + (void) ThrowMagickException(&image->exception,GetMagickModule(), + MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","`%s' (JP2)", + image->filename); + break; + } +#endif +#if !defined(MAGICKCORE_ZLIB_DELEGATE) + case ZipCompression: + { + compression=RLECompression; + (void) ThrowMagickException(&image->exception,GetMagickModule(), + MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","`%s' (ZLIB)", + image->filename); + break; + } +#endif + case LZWCompression: + { + if (LocaleCompare(image_info->magick,"PDFA") == 0) + compression=RLECompression; /* LZW compression is forbidden */ + break; + } + case NoCompression: + { + if (LocaleCompare(image_info->magick,"PDFA") == 0) + compression=RLECompression; /* ASCII 85 compression is forbidden */ + break; + } + default: + break; + } + if (compression == JPEG2000Compression) + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Scale relative to dots-per-inch. + */ + delta.x=DefaultResolution; + delta.y=DefaultResolution; + resolution.x=image->x_resolution; + resolution.y=image->y_resolution; + if ((resolution.x == 0.0) || (resolution.y == 0.0)) + { + flags=ParseGeometry(PSDensityGeometry,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + if (image_info->density != (char *) NULL) + { + flags=ParseGeometry(image_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + if (image->units == PixelsPerCentimeterResolution) + { + resolution.x=(double) ((size_t) (100.0*2.54*resolution.x+0.5)/100.0); + resolution.y=(double) ((size_t) (100.0*2.54*resolution.y+0.5)/100.0); + } + SetGeometry(image,&geometry); + (void) FormatLocaleString(page_geometry,MaxTextExtent,"%.20gx%.20g",(double) + image->columns,(double) image->rows); + if (image_info->page != (char *) NULL) + (void) CopyMagickString(page_geometry,image_info->page,MaxTextExtent); + else + if ((image->page.width != 0) && (image->page.height != 0)) + (void) FormatLocaleString(page_geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) image->page.width,(double) + image->page.height,(double) image->page.x,(double) image->page.y); + else + if ((image->gravity != UndefinedGravity) && + (LocaleCompare(image_info->magick,"PDF") == 0)) + (void) CopyMagickString(page_geometry,PSPageGeometry,MaxTextExtent); + (void) ConcatenateMagickString(page_geometry,">",MaxTextExtent); + (void) ParseMetaGeometry(page_geometry,&geometry.x,&geometry.y, + &geometry.width,&geometry.height); + scale.x=(double) (geometry.width*delta.x)/resolution.x; + geometry.width=(size_t) floor(scale.x+0.5); + scale.y=(double) (geometry.height*delta.y)/resolution.y; + geometry.height=(size_t) floor(scale.y+0.5); + (void) ParseAbsoluteGeometry(page_geometry,&media_info); + (void) ParseGravityGeometry(image,page_geometry,&page_info, + &image->exception); + if (image->gravity != UndefinedGravity) + { + geometry.x=(-page_info.x); + geometry.y=(ssize_t) (media_info.height+page_info.y-image->rows); + } + pointsize=12.0; + if (image_info->pointsize != 0.0) + pointsize=image_info->pointsize; + text_size=0; + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + text_size=(size_t) (MultilineCensus(value)*pointsize+12); + (void) text_size; + /* + Write Page object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + (void) WriteBlobString(image,"/Type /Page\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Parent %.20g 0 R\n", + (double) pages_id); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"/Resources <<\n"); + labels=(char **) NULL; + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + labels=StringToList(value); + if (labels != (char **) NULL) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "/Font << /F%.20g %.20g 0 R >>\n",(double) image->scene,(double) + object+4); + (void) WriteBlobString(image,buffer); + } + (void) FormatLocaleString(buffer,MaxTextExtent, + "/XObject << /Im%.20g %.20g 0 R >>\n",(double) image->scene,(double) + object+5); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/ProcSet %.20g 0 R >>\n", + (double) object+3); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "/MediaBox [0 0 %g %g]\n",DefaultResolution*media_info.width* + PerceptibleReciprocal(resolution.x),DefaultResolution*media_info.height* + PerceptibleReciprocal(resolution.y)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "/CropBox [0 0 %g %g]\n",DefaultResolution*media_info.width* + PerceptibleReciprocal(resolution.x),DefaultResolution*media_info.height* + PerceptibleReciprocal(resolution.y)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Contents %.20g 0 R\n", + (double) object+1); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Thumb %.20g 0 R\n", + (double) object+(icc_profile != (StringInfo *) NULL ? 10 : 8)); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"endobj\n"); + /* + Write Contents object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Length %.20g 0 R\n", + (double) object+1); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"stream\n"); + offset=TellBlob(image); + (void) WriteBlobString(image,"q\n"); + if (labels != (char **) NULL) + for (i=0; labels[i] != (char *) NULL; i++) + { + (void) WriteBlobString(image,"BT\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/F%.20g %g Tf\n", + (double) image->scene,pointsize); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g Td\n", + (double) geometry.x,(double) (geometry.y+geometry.height+i*pointsize+ + 12)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"(%s) Tj\n",labels[i]); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"ET\n"); + labels[i]=DestroyString(labels[i]); + } + (void) FormatLocaleString(buffer,MaxTextExtent,"%g 0 0 %g %.20g %.20g cm\n", + scale.x,scale.y,(double) geometry.x,(double) geometry.y); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Im%.20g Do\n",(double) + image->scene); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"Q\n"); + offset=TellBlob(image)-offset; + (void) WriteBlobString(image,"\nendstream\n"); + (void) WriteBlobString(image,"endobj\n"); + /* + Write Length object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) offset); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"endobj\n"); + /* + Write Procset object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + if ((image->storage_class == DirectClass) || (image->colors > 256)) + (void) CopyMagickString(buffer,"[ /PDF /Text /ImageC",MaxTextExtent); + else + if ((compression == FaxCompression) || (compression == Group4Compression)) + (void) CopyMagickString(buffer,"[ /PDF /Text /ImageB",MaxTextExtent); + else + (void) CopyMagickString(buffer,"[ /PDF /Text /ImageI",MaxTextExtent); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image," ]\n"); + (void) WriteBlobString(image,"endobj\n"); + /* + Write Font object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + if (labels != (char **) NULL) + { + (void) WriteBlobString(image,"/Type /Font\n"); + (void) WriteBlobString(image,"/Subtype /Type1\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Name /F%.20g\n", + (double) image->scene); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"/BaseFont /Helvetica\n"); + (void) WriteBlobString(image,"/Encoding /MacRomanEncoding\n"); + labels=(char **) RelinquishMagickMemory(labels); + } + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"endobj\n"); + /* + Write XObject object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + (void) WriteBlobString(image,"/Type /XObject\n"); + (void) WriteBlobString(image,"/Subtype /Image\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Name /Im%.20g\n",(double) + image->scene); + (void) WriteBlobString(image,buffer); + switch (compression) + { + case NoCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"ASCII85Decode"); + break; + } + case JPEGCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"DCTDecode"); + if (image->colorspace != CMYKColorspace) + break; + (void) WriteBlobString(image,buffer); + (void) CopyMagickString(buffer,"/Decode [1 0 1 0 1 0 1 0]\n", + MaxTextExtent); + break; + } + case JPEG2000Compression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"JPXDecode"); + if (image->colorspace != CMYKColorspace) + break; + (void) WriteBlobString(image,buffer); + (void) CopyMagickString(buffer,"/Decode [1 0 1 0 1 0 1 0]\n", + MaxTextExtent); + break; + } + case LZWCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"LZWDecode"); + break; + } + case ZipCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"FlateDecode"); + break; + } + case FaxCompression: + case Group4Compression: + { + (void) CopyMagickString(buffer,"/Filter [ /CCITTFaxDecode ]\n", + MaxTextExtent); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/DecodeParms [ << " + "/K %s /BlackIs1 false /Columns %.20g /Rows %.20g >> ]\n",CCITTParam, + (double) image->columns,(double) image->rows); + break; + } + default: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat, + "RunLengthDecode"); + break; + } + } + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Width %.20g\n",(double) + image->columns); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Height %.20g\n",(double) + image->rows); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/ColorSpace %.20g 0 R\n", + (double) object+2); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/BitsPerComponent %d\n", + (compression == FaxCompression) || (compression == Group4Compression) ? + 1 : 8); + (void) WriteBlobString(image,buffer); + if (image->matte != MagickFalse) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"/SMask %.20g 0 R\n", + (double) object+(icc_profile != (StringInfo *) NULL ? 9 : 7)); + (void) WriteBlobString(image,buffer); + } + (void) FormatLocaleString(buffer,MaxTextExtent,"/Length %.20g 0 R\n", + (double) object+1); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"stream\n"); + offset=TellBlob(image); + number_pixels=(MagickSizeType) image->columns*image->rows; + if ((4*number_pixels) != (MagickSizeType) ((size_t) (4*number_pixels))) + ThrowPDFException(ResourceLimitError,"MemoryAllocationFailed"); + if ((compression == FaxCompression) || (compression == Group4Compression) || + ((image_info->type != TrueColorType) && + (SetImageGray(image,&image->exception) != MagickFalse))) + { + switch (compression) + { + case FaxCompression: + case Group4Compression: + { + if (LocaleCompare(CCITTParam,"0") == 0) + { + (void) HuffmanEncodeImage(image_info,image,image); + break; + } + (void) Huffman2DEncodeImage(image_info,image,image); + break; + } + case JPEGCompression: + { + status=InjectImageBlob(image_info,image,image,"jpeg", + &image->exception); + if (status == MagickFalse) + ThrowPDFException(CoderError,image->exception.reason); + break; + } + case JPEG2000Compression: + { + status=InjectImageBlob(image_info,image,image,"jp2", + &image->exception); + if (status == MagickFalse) + ThrowPDFException(CoderError,image->exception.reason); + break; + } + case RLECompression: + default: + { + MemoryInfo + *pixel_info; + + /* + Allocate pixel array. + */ + length=(size_t) number_pixels; + pixel_info=AcquireVirtualMemory(length,sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowPDFException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Dump Runlength encoded pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(ClampToQuantum( + GetPixelLuma(image,p))); + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if (compression == ZipCompression) + status=ZLIBEncodeImage(image,length,pixels); + else +#endif + if (compression == LZWCompression) + status=LZWEncodeImage(image,length,pixels); + else + status=PackbitsEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (status == MagickFalse) + { + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); + (void) CloseBlob(image); + return(MagickFalse); + } + break; + } + case NoCompression: + { + /* + Dump uncompressed PseudoColor packets. + */ + Ascii85Initialize(image); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + Ascii85Encode(image,ScaleQuantumToChar(ClampToQuantum( + GetPixelLuma(image,p)))); + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + Ascii85Flush(image); + break; + } + } + } + else + if ((image->storage_class == DirectClass) || (image->colors > 256) || + (compression == JPEGCompression) || + (compression == JPEG2000Compression)) + switch (compression) + { + case JPEGCompression: + { + status=InjectImageBlob(image_info,image,image,"jpeg", + &image->exception); + if (status == MagickFalse) + ThrowPDFException(CoderError,image->exception.reason); + break; + } + case JPEG2000Compression: + { + status=InjectImageBlob(image_info,image,image,"jp2", + &image->exception); + if (status == MagickFalse) + ThrowPDFException(CoderError,image->exception.reason); + break; + } + case RLECompression: + default: + { + MemoryInfo + *pixel_info; + + /* + Allocate pixel array. + */ + length=(size_t) number_pixels; + length*=image->colorspace == CMYKColorspace ? 4UL : 3UL; + pixel_info=AcquireVirtualMemory(length,sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + { + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); + ThrowPDFException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Dump runlength encoded pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + if (image->colorspace == CMYKColorspace) + *q++=ScaleQuantumToChar(GetPixelIndex(indexes+x)); + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if (compression == ZipCompression) + status=ZLIBEncodeImage(image,length,pixels); + else +#endif + if (compression == LZWCompression) + status=LZWEncodeImage(image,length,pixels); + else + status=PackbitsEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (status == MagickFalse) + { + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); + (void) CloseBlob(image); + return(MagickFalse); + } + break; + } + case NoCompression: + { + /* + Dump uncompressed DirectColor packets. + */ + Ascii85Initialize(image); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelRed(p))); + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelGreen(p))); + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelBlue(p))); + if (image->colorspace == CMYKColorspace) + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelIndex(indexes+x))); + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + Ascii85Flush(image); + break; + } + } + else + { + /* + Dump number of colors and colormap. + */ + switch (compression) + { + case RLECompression: + default: + { + MemoryInfo + *pixel_info; + + /* + Allocate pixel array. + */ + length=(size_t) number_pixels; + pixel_info=AcquireVirtualMemory(length,sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + { + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); + ThrowPDFException(ResourceLimitError, + "MemoryAllocationFailed"); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Dump runlength encoded pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + *q++=(unsigned char) ((ssize_t) GetPixelIndex(indexes+x)); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag, + (MagickOffsetType) y,image->rows); + if (status == MagickFalse) + break; + } + } +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if (compression == ZipCompression) + status=ZLIBEncodeImage(image,length,pixels); + else +#endif + if (compression == LZWCompression) + status=LZWEncodeImage(image,length,pixels); + else + status=PackbitsEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (status == MagickFalse) + { + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); + (void) CloseBlob(image); + return(MagickFalse); + } + break; + } + case NoCompression: + { + /* + Dump uncompressed PseudoColor packets. + */ + Ascii85Initialize(image); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + Ascii85Encode(image,(unsigned char) + ((ssize_t) GetPixelIndex(indexes+x))); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag, + (MagickOffsetType) y,image->rows); + if (status == MagickFalse) + break; + } + } + Ascii85Flush(image); + break; + } + } + } + offset=TellBlob(image)-offset; + (void) WriteBlobString(image,"\nendstream\n"); + (void) WriteBlobString(image,"endobj\n"); + /* + Write Length object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) offset); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"endobj\n"); + /* + Write Colorspace object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + device="DeviceRGB"; + channels=0; + if (image->colorspace == CMYKColorspace) + { + device="DeviceCMYK"; + channels=4; + } + else + if ((compression == FaxCompression) || + (compression == Group4Compression) || + ((image_info->type != TrueColorType) && + (SetImageGray(image,&image->exception) != MagickFalse))) + { + device="DeviceGray"; + channels=1; + } + else + if ((image->storage_class == DirectClass) || + (image->colors > 256) || (compression == JPEGCompression) || + (compression == JPEG2000Compression)) + { + device="DeviceRGB"; + channels=3; + } + if (icc_profile == (StringInfo *) NULL) + { + if (channels != 0) + (void) FormatLocaleString(buffer,MaxTextExtent,"/%s\n",device); + else + (void) FormatLocaleString(buffer,MaxTextExtent, + "[ /Indexed /%s %.20g %.20g 0 R ]\n",device,(double) image->colors- + 1,(double) object+3); + (void) WriteBlobString(image,buffer); + } + else + { + const unsigned char + *p; + + /* + Write ICC profile. + */ + (void) FormatLocaleString(buffer,MaxTextExtent, + "[/ICCBased %.20g 0 R]\n",(double) object+1); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"endobj\n"); + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n", + (double) object); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"<<\n/N %.20g\n" + "/Filter /ASCII85Decode\n/Length %.20g 0 R\n/Alternate /%s\n>>\n" + "stream\n",(double) channels,(double) object+1,device); + (void) WriteBlobString(image,buffer); + offset=TellBlob(image); + Ascii85Initialize(image); + p=GetStringInfoDatum(icc_profile); + for (i=0; i < (ssize_t) GetStringInfoLength(icc_profile); i++) + Ascii85Encode(image,(unsigned char) *p++); + Ascii85Flush(image); + offset=TellBlob(image)-offset; + (void) WriteBlobString(image,"endstream\n"); + (void) WriteBlobString(image,"endobj\n"); + /* + Write Length object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n", + (double) object); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) + offset); + (void) WriteBlobString(image,buffer); + } + (void) WriteBlobString(image,"endobj\n"); + /* + Write Thumb object. + */ + SetGeometry(image,&geometry); + (void) ParseMetaGeometry("106x106+0+0>",&geometry.x,&geometry.y, + &geometry.width,&geometry.height); + if (IsMonochromeImage(image,&image->exception) != MagickFalse) + tile_image=SampleImage(image,geometry.width,geometry.height, + &image->exception); + else + tile_image=ThumbnailImage(image,geometry.width,geometry.height, + &image->exception); + if (tile_image == (Image *) NULL) + ThrowPDFException(ResourceLimitError,image->exception.reason); + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + switch (compression) + { + case NoCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"ASCII85Decode"); + break; + } + case JPEGCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"DCTDecode"); + if (image->colorspace != CMYKColorspace) + break; + (void) WriteBlobString(image,buffer); + (void) CopyMagickString(buffer,"/Decode [1 0 1 0 1 0 1 0]\n", + MaxTextExtent); + break; + } + case JPEG2000Compression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"JPXDecode"); + if (image->colorspace != CMYKColorspace) + break; + (void) WriteBlobString(image,buffer); + (void) CopyMagickString(buffer,"/Decode [1 0 1 0 1 0 1 0]\n", + MaxTextExtent); + break; + } + case LZWCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"LZWDecode"); + break; + } + case ZipCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"FlateDecode"); + break; + } + case FaxCompression: + case Group4Compression: + { + (void) CopyMagickString(buffer,"/Filter [ /CCITTFaxDecode ]\n", + MaxTextExtent); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/DecodeParms [ << " + "/K %s /BlackIs1 false /Columns %.20g /Rows %.20g >> ]\n",CCITTParam, + (double) tile_image->columns,(double) tile_image->rows); + break; + } + default: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat, + "RunLengthDecode"); + break; + } + } + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Width %.20g\n",(double) + tile_image->columns); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Height %.20g\n",(double) + tile_image->rows); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/ColorSpace %.20g 0 R\n", + (double) object-(icc_profile != (StringInfo *) NULL ? 3 : 1)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/BitsPerComponent %d\n", + (compression == FaxCompression) || (compression == Group4Compression) ? + 1 : 8); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Length %.20g 0 R\n", + (double) object+1); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"stream\n"); + offset=TellBlob(image); + number_pixels=(MagickSizeType) tile_image->columns*tile_image->rows; + if ((compression == FaxCompression) || + (compression == Group4Compression) || + ((image_info->type != TrueColorType) && + (SetImageGray(tile_image,&image->exception) != MagickFalse))) + { + switch (compression) + { + case FaxCompression: + case Group4Compression: + { + if (LocaleCompare(CCITTParam,"0") == 0) + { + (void) HuffmanEncodeImage(image_info,image,tile_image); + break; + } + (void) Huffman2DEncodeImage(image_info,image,tile_image); + break; + } + case JPEGCompression: + { + status=InjectImageBlob(image_info,image,tile_image,"jpeg", + &image->exception); + if (status == MagickFalse) + ThrowPDFException(CoderError,tile_image->exception.reason); + break; + } + case JPEG2000Compression: + { + status=InjectImageBlob(image_info,image,tile_image,"jp2", + &image->exception); + if (status == MagickFalse) + ThrowPDFException(CoderError,tile_image->exception.reason); + break; + } + case RLECompression: + default: + { + MemoryInfo + *pixel_info; + + /* + Allocate pixel array. + */ + length=(size_t) number_pixels; + pixel_info=AcquireVirtualMemory(length,sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + { + tile_image=DestroyImage(tile_image); + ThrowPDFException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Dump Runlength encoded pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) tile_image->rows; y++) + { + p=GetVirtualPixels(tile_image,0,y,tile_image->columns,1, + &tile_image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) tile_image->columns; x++) + { + *q++=ScaleQuantumToChar(ClampToQuantum( + GetPixelLuma(tile_image,p))); + p++; + } + } +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if (compression == ZipCompression) + status=ZLIBEncodeImage(image,length,pixels); + else +#endif + if (compression == LZWCompression) + status=LZWEncodeImage(image,length,pixels); + else + status=PackbitsEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (status == MagickFalse) + { + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); + (void) CloseBlob(image); + return(MagickFalse); + } + break; + } + case NoCompression: + { + /* + Dump uncompressed PseudoColor packets. + */ + Ascii85Initialize(image); + for (y=0; y < (ssize_t) tile_image->rows; y++) + { + p=GetVirtualPixels(tile_image,0,y,tile_image->columns,1, + &tile_image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) tile_image->columns; x++) + { + Ascii85Encode(image,ScaleQuantumToChar(ClampToQuantum( + GetPixelLuma(tile_image,p)))); + p++; + } + } + Ascii85Flush(image); + break; + } + } + } + else + if ((tile_image->storage_class == DirectClass) || + (tile_image->colors > 256) || (compression == JPEGCompression) || + (compression == JPEG2000Compression)) + switch (compression) + { + case JPEGCompression: + { + status=InjectImageBlob(image_info,image,tile_image,"jpeg", + &image->exception); + if (status == MagickFalse) + ThrowPDFException(CoderError,tile_image->exception.reason); + break; + } + case JPEG2000Compression: + { + status=InjectImageBlob(image_info,image,tile_image,"jp2", + &image->exception); + if (status == MagickFalse) + ThrowPDFException(CoderError,tile_image->exception.reason); + break; + } + case RLECompression: + default: + { + MemoryInfo + *pixel_info; + + /* + Allocate pixel array. + */ + length=(size_t) number_pixels; + length*=tile_image->colorspace == CMYKColorspace ? 4UL : 3UL; + pixel_info=AcquireVirtualMemory(length,4*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + { + tile_image=DestroyImage(tile_image); + ThrowPDFException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Dump runoffset encoded pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) tile_image->rows; y++) + { + p=GetVirtualPixels(tile_image,0,y,tile_image->columns,1, + &tile_image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(tile_image); + for (x=0; x < (ssize_t) tile_image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + if (tile_image->colorspace == CMYKColorspace) + *q++=ScaleQuantumToChar(GetPixelIndex(indexes+x)); + p++; + } + } +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if (compression == ZipCompression) + status=ZLIBEncodeImage(image,length,pixels); + else +#endif + if (compression == LZWCompression) + status=LZWEncodeImage(image,length,pixels); + else + status=PackbitsEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (status == MagickFalse) + { + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); + (void) CloseBlob(image); + return(MagickFalse); + } + break; + } + case NoCompression: + { + /* + Dump uncompressed DirectColor packets. + */ + Ascii85Initialize(image); + for (y=0; y < (ssize_t) tile_image->rows; y++) + { + p=GetVirtualPixels(tile_image,0,y,tile_image->columns,1, + &tile_image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(tile_image); + for (x=0; x < (ssize_t) tile_image->columns; x++) + { + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelRed(p))); + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelGreen(p))); + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelBlue(p))); + if (image->colorspace == CMYKColorspace) + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelIndex(indexes+x))); + p++; + } + } + Ascii85Flush(image); + break; + } + } + else + { + /* + Dump number of colors and colormap. + */ + switch (compression) + { + case RLECompression: + default: + { + MemoryInfo + *pixel_info; + + /* + Allocate pixel array. + */ + length=(size_t) number_pixels; + pixel_info=AcquireVirtualMemory(length,sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + { + tile_image=DestroyImage(tile_image); + ThrowPDFException(ResourceLimitError, + "MemoryAllocationFailed"); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Dump Runlength encoded pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) tile_image->rows; y++) + { + p=GetVirtualPixels(tile_image,0,y,tile_image->columns,1, + &tile_image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(tile_image); + for (x=0; x < (ssize_t) tile_image->columns; x++) + *q++=(unsigned char) ((ssize_t) GetPixelIndex(indexes+x)); + } +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if (compression == ZipCompression) + status=ZLIBEncodeImage(image,length,pixels); + else +#endif + if (compression == LZWCompression) + status=LZWEncodeImage(image,length,pixels); + else + status=PackbitsEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (status == MagickFalse) + { + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); + (void) CloseBlob(image); + return(MagickFalse); + } + break; + } + case NoCompression: + { + /* + Dump uncompressed PseudoColor packets. + */ + Ascii85Initialize(image); + for (y=0; y < (ssize_t) tile_image->rows; y++) + { + p=GetVirtualPixels(tile_image,0,y,tile_image->columns,1, + &tile_image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(tile_image); + for (x=0; x < (ssize_t) tile_image->columns; x++) + Ascii85Encode(image,(unsigned char) + ((ssize_t) GetPixelIndex(indexes+x))); + } + Ascii85Flush(image); + break; + } + } + } + tile_image=DestroyImage(tile_image); + offset=TellBlob(image)-offset; + (void) WriteBlobString(image,"\nendstream\n"); + (void) WriteBlobString(image,"endobj\n"); + /* + Write Length object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) offset); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"endobj\n"); + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + if ((image->storage_class == DirectClass) || (image->colors > 256) || + (compression == FaxCompression) || (compression == Group4Compression)) + (void) WriteBlobString(image,">>\n"); + else + { + /* + Write Colormap object. + */ + if (compression == NoCompression) + (void) WriteBlobString(image,"/Filter [ /ASCII85Decode ]\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Length %.20g 0 R\n", + (double) object+1); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"stream\n"); + offset=TellBlob(image); + if (compression == NoCompression) + Ascii85Initialize(image); + for (i=0; i < (ssize_t) image->colors; i++) + { + if (compression == NoCompression) + { + Ascii85Encode(image,ScaleQuantumToChar(image->colormap[i].red)); + Ascii85Encode(image,ScaleQuantumToChar(image->colormap[i].green)); + Ascii85Encode(image,ScaleQuantumToChar(image->colormap[i].blue)); + continue; + } + (void) WriteBlobByte(image, + ScaleQuantumToChar(image->colormap[i].red)); + (void) WriteBlobByte(image, + ScaleQuantumToChar(image->colormap[i].green)); + (void) WriteBlobByte(image, + ScaleQuantumToChar(image->colormap[i].blue)); + } + if (compression == NoCompression) + Ascii85Flush(image); + offset=TellBlob(image)-offset; + (void) WriteBlobString(image,"\nendstream\n"); + } + (void) WriteBlobString(image,"endobj\n"); + /* + Write Length object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) + offset); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"endobj\n"); + /* + Write softmask object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + if (image->matte == MagickFalse) + (void) WriteBlobString(image,">>\n"); + else + { + (void) WriteBlobString(image,"/Type /XObject\n"); + (void) WriteBlobString(image,"/Subtype /Image\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Name /Ma%.20g\n", + (double) image->scene); + (void) WriteBlobString(image,buffer); + switch (compression) + { + case NoCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat, + "ASCII85Decode"); + break; + } + case LZWCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat,"LZWDecode"); + break; + } + case ZipCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat, + "FlateDecode"); + break; + } + default: + { + (void) FormatLocaleString(buffer,MaxTextExtent,CFormat, + "RunLengthDecode"); + break; + } + } + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Width %.20g\n",(double) + image->columns); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Height %.20g\n", + (double) image->rows); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"/ColorSpace /DeviceGray\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/BitsPerComponent %d\n", + (compression == FaxCompression) || (compression == Group4Compression) + ? 1 : 8); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Length %.20g 0 R\n", + (double) object+1); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"stream\n"); + offset=TellBlob(image); + number_pixels=(MagickSizeType) image->columns*image->rows; + switch (compression) + { + case RLECompression: + default: + { + MemoryInfo + *pixel_info; + + /* + Allocate pixel array. + */ + length=(size_t) number_pixels; + pixel_info=AcquireVirtualMemory(length,4*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + { + image=DestroyImage(image); + ThrowPDFException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Dump Runlength encoded pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar((Quantum) (GetPixelAlpha(p))); + p++; + } + } +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if (compression == ZipCompression) + status=ZLIBEncodeImage(image,length,pixels); + else +#endif + if (compression == LZWCompression) + status=LZWEncodeImage(image,length,pixels); + else + status=PackbitsEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (status == MagickFalse) + { + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); + (void) CloseBlob(image); + return(MagickFalse); + } + break; + } + case NoCompression: + { + /* + Dump uncompressed PseudoColor packets. + */ + Ascii85Initialize(image); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + Ascii85Encode(image,ScaleQuantumToChar((Quantum) (QuantumRange- + GetPixelOpacity(p)))); + p++; + } + } + Ascii85Flush(image); + break; + } + } + offset=TellBlob(image)-offset; + (void) WriteBlobString(image,"\nendstream\n"); + } + (void) WriteBlobString(image,"endobj\n"); + /* + Write Length object. + */ + xref[object++]=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) offset); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"endobj\n"); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + /* + Write Metadata object. + */ + xref[object++]=TellBlob(image); + info_id=object; + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g 0 obj\n",(double) + object); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"<<\n"); + if (LocaleCompare(image_info->magick,"PDFA") == 0) + { + escape=EscapeParenthesis(basename); + (void) FormatLocaleString(buffer,MagickPathExtent,"/Title (%s)\n", + escape); + escape=DestroyString(escape); + } + else + { + wchar_t + *utf16; + + utf16=ConvertUTF8ToUTF16((unsigned char *) basename,&length); + if (utf16 != (wchar_t *) NULL) + { + unsigned char + hex_digits[16]; + + hex_digits[0]='0'; + hex_digits[1]='1'; + hex_digits[2]='2'; + hex_digits[3]='3'; + hex_digits[4]='4'; + hex_digits[5]='5'; + hex_digits[6]='6'; + hex_digits[7]='7'; + hex_digits[8]='8'; + hex_digits[9]='9'; + hex_digits[10]='A'; + hex_digits[11]='B'; + hex_digits[12]='C'; + hex_digits[13]='D'; + hex_digits[14]='E'; + hex_digits[15]='F'; + (void) FormatLocaleString(buffer,MagickPathExtent,"/Title > 12) & 0x0f]); + (void) WriteBlobByte(image,hex_digits[(utf16[i] >> 8) & 0x0f]); + (void) WriteBlobByte(image,hex_digits[(utf16[i] >> 4) & 0x0f]); + (void) WriteBlobByte(image,hex_digits[utf16[i] & 0x0f]); + } + (void) FormatLocaleString(buffer,MagickPathExtent,">\n"); + utf16=(wchar_t *) RelinquishMagickMemory(utf16); + } + } + (void) WriteBlobString(image,buffer); + seconds=GetMagickTime(); + GetMagickUTCtime(&seconds,&utc_time); + (void) FormatLocaleString(date,MaxTextExtent,"D:%04d%02d%02d%02d%02d%02d", + utc_time.tm_year+1900,utc_time.tm_mon+1,utc_time.tm_mday, + utc_time.tm_hour,utc_time.tm_min,utc_time.tm_sec); + (void) FormatLocaleString(buffer,MaxTextExtent,"/CreationDate (%s)\n",date); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/ModDate (%s)\n",date); + (void) WriteBlobString(image,buffer); + url=(char *) MagickAuthoritativeURL; + escape=EscapeParenthesis(url); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Producer (%s)\n",escape); + escape=DestroyString(escape); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"endobj\n"); + /* + Write Xref object. + */ + offset=TellBlob(image)-xref[0]+ + (LocaleCompare(image_info->magick,"PDFA") == 0 ? 6 : 0)+10; + (void) WriteBlobString(image,"xref\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"0 %.20g\n",(double) + object+1); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"0000000000 65535 f \n"); + for (i=0; i < (ssize_t) object; i++) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%010lu 00000 n \n", + (unsigned long) xref[i]); + (void) WriteBlobString(image,buffer); + } + (void) WriteBlobString(image,"trailer\n"); + (void) WriteBlobString(image,"<<\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Size %.20g\n",(double) + object+1); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Info %.20g 0 R\n",(double) + info_id); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"/Root %.20g 0 R\n",(double) + root_id); + (void) WriteBlobString(image,buffer); + (void) SignatureImage(image); + (void) FormatLocaleString(buffer,MaxTextExtent,"/ID [<%s> <%s>]\n", + GetImageProperty(image,"signature"),GetImageProperty(image,"signature")); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,">>\n"); + (void) WriteBlobString(image,"startxref\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) offset); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"%%EOF\n"); + xref=(MagickOffsetType *) RelinquishMagickMemory(xref); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/pes.c b/ImageMagick-6.9.12-44/coders/pes.c new file mode 100644 index 0000000..249a046 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pes.c @@ -0,0 +1,747 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP EEEEE SSSSS % +% P P E SS % +% PPPP EEE SSS % +% P E SS % +% P EEEEE SSSSS % +% % +% % +% Read/Write Brother PES Image Format % +% % +% Software Design % +% Cristy % +% July 2009 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% The PES format was derived from Robert Heel's PHP script (see +% http://bobosch.dyndns.org/embroidery/showFile.php?pes.php) and pesconvert +% (see http://torvalds-family.blogspot.com/2010/01/embroidery-gaah.html). +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/property.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/client.h" +#include "magick/colorspace.h" +#include "magick/constitute.h" +#include "magick/decorate.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/montage.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resize.h" +#include "magick/shear.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/resource_.h" +#include "magick/transform.h" +#include "magick/utility.h" + +/* + Typedef declarations. +*/ +typedef struct _PESColorInfo +{ + const unsigned char + red, + green, + blue, + alpha; +} PESColorInfo; + +typedef struct _PESBlockInfo +{ + const PESColorInfo + *color; + + ssize_t + offset; +} PESBlockInfo; + +/* + PES Colors. +*/ +static const PESColorInfo + PESColor[256] = + { + { 0, 0, 0, 1 }, + { 14, 31, 124, 1 }, + { 10, 85, 163, 1 }, + { 48, 135, 119, 1 }, + { 75, 107, 175, 1 }, + { 237, 23, 31, 1 }, + { 209, 92, 0, 1 }, + { 145, 54, 151, 1 }, + { 228, 154, 203, 1 }, + { 145, 95, 172, 1 }, + { 157, 214, 125, 1 }, + { 232, 169, 0, 1 }, + { 254, 186, 53, 1 }, + { 255, 255, 0, 1 }, + { 112, 188, 31, 1 }, + { 192, 148, 0, 1 }, + { 168, 168, 168, 1 }, + { 123, 111, 0, 1 }, + { 255, 255, 179, 1 }, + { 79, 85, 86, 1 }, + { 0, 0, 0, 1 }, + { 11, 61, 145, 1 }, + { 119, 1, 118, 1 }, + { 41, 49, 51, 1 }, + { 42, 19, 1, 1 }, + { 246, 74, 138, 1 }, + { 178, 118, 36, 1 }, + { 252, 187, 196, 1 }, + { 254, 55, 15, 1 }, + { 240, 240, 240, 1 }, + { 106, 28, 138, 1 }, + { 168, 221, 196, 1 }, + { 37, 132, 187, 1 }, + { 254, 179, 67, 1 }, + { 255, 240, 141, 1 }, + { 208, 166, 96, 1 }, + { 209, 84, 0, 1 }, + { 102, 186, 73, 1 }, + { 19, 74, 70, 1 }, + { 135, 135, 135, 1 }, + { 216, 202, 198, 1 }, + { 67, 86, 7, 1 }, + { 254, 227, 197, 1 }, + { 249, 147, 188, 1 }, + { 0, 56, 34, 1 }, + { 178, 175, 212, 1 }, + { 104, 106, 176, 1 }, + { 239, 227, 185, 1 }, + { 247, 56, 102, 1 }, + { 181, 76, 100, 1 }, + { 19, 43, 26, 1 }, + { 199, 1, 85, 1 }, + { 254, 158, 50, 1 }, + { 168, 222, 235, 1 }, + { 0, 103, 26, 1 }, + { 78, 41, 144, 1 }, + { 47, 126, 32, 1 }, + { 253, 217, 222, 1 }, + { 255, 217, 17, 1 }, + { 9, 91, 166, 1 }, + { 240, 249, 112, 1 }, + { 227, 243, 91, 1 }, + { 255, 200, 100, 1 }, + { 255, 200, 150, 1 }, + { 255, 200, 200, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 } + }; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P E S % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPES() returns MagickTrue if the image format type, identified by the +% magick string, is PES. +% +% The format of the IsPES method is: +% +% MagickBooleanType IsPES(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsPES(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"#PES",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P E S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPESImage() reads a Brother PES image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the ReadPESImage method is: +% +% image=ReadPESImage(image_info) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadPESImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + filename[MaxTextExtent]; + + FILE + *file; + + Image + *image; + + ImageInfo + *read_info; + + int + delta_x, + delta_y, + j, + unique_file, + x, + y; + + MagickBooleanType + status; + + PESBlockInfo + blocks[256]; + + PointInfo + *stitches; + + SegmentInfo + bounds; + + ssize_t + i; + + size_t + number_blocks, + number_colors, + number_stitches; + + ssize_t + count, + offset; + + unsigned char + magick[4], + version[4]; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Verify PES identifier. + */ + count=ReadBlob(image,4,magick); + if ((count != 4) || (LocaleNCompare((char *) magick,"#PES",4) != 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + count=ReadBlob(image,4,version); + offset=ReadBlobLSBSignedLong(image); + if (DiscardBlobBytes(image,offset+36) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + /* + Get PES colors. + */ + number_colors=(size_t) ReadBlobByte(image)+1; + for (i=0; i < (ssize_t) number_colors; i++) + { + j=ReadBlobByte(image); + blocks[i].color=PESColor+(j < 0 ? 0 : j); + blocks[i].offset=0; + } + for ( ; i < 256L; i++) + { + blocks[i].offset=0; + blocks[i].color=PESColor; + } + if (DiscardBlobBytes(image,532L-number_colors-21) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + /* + Stitch away. + */ + number_stitches=64; + stitches=(PointInfo *) AcquireQuantumMemory(number_stitches, + sizeof(*stitches)); + if (stitches == (PointInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + bounds.x1=65535.0; + bounds.y1=65535.0; + bounds.x2=(-65535.0); + bounds.y2=(-65535.0); + i=0; + j=0; + delta_x=0; + delta_y=0; + while (EOFBlob(image) == MagickFalse) + { + x=ReadBlobByte(image); + y=ReadBlobByte(image); + if ((x == 0xff) && (y == 0)) + break; + if ((x == 254) && (y == 176)) + { + /* + Start a new stitch block. + */ + j++; + blocks[j].offset=(ssize_t) i; + if (j >= 255) + { + stitches=(PointInfo *) RelinquishMagickMemory(stitches); + ThrowReaderException(ResourceLimitError,"CorruptImage"); + } + (void) ReadBlobByte(image); + continue; + } + if ((x & 0x80) == 0) + { + /* + Normal stitch. + */ + if ((x & 0x40) != 0) + x-=0x80; + } + else + { + /* + Jump stitch. + */ + x=((x & 0x0f) << 8)+y; + if ((x & 0x800) != 0) + x-=0x1000; + y=ReadBlobByte(image); + } + if ((y & 0x80) == 0) + { + /* + Normal stitch. + */ + if ((y & 0x40) != 0) + y-=0x80; + } + else + { + /* + Jump stitch. + */ + y=((y & 0x0f) << 8)+ReadBlobByte(image); + if ((y & 0x800) != 0) + y-=0x1000; + } + /* + Note stitch (x,y). + */ + x+=delta_x; + y+=delta_y; + delta_x=x; + delta_y=y; + stitches[i].x=(double) x; + stitches[i].y=(double) y; + if ((double) x < bounds.x1) + bounds.x1=(double) x; + if ((double) x > bounds.x2) + bounds.x2=(double) x; + if ((double) y < bounds.y1) + bounds.y1=(double) y; + if ((double) y > bounds.y2) + bounds.y2=(double) y; + i++; + if (i >= (ssize_t) number_stitches) + { + /* + Make room for more stitches. + */ + number_stitches<<=1; + stitches=(PointInfo *) ResizeQuantumMemory(stitches,(size_t) + number_stitches,sizeof(*stitches)); + if (stitches == (PointInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + j++; + blocks[j].offset=(ssize_t) i; + number_blocks=(size_t) j; + image->columns=bounds.x2-bounds.x1; + image->rows=bounds.y2-bounds.y1; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + stitches=(PointInfo *) RelinquishMagickMemory(stitches); + return(DestroyImageList(image)); + } + /* + Write stitches as SVG file. + */ + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(filename); + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + ThrowImageException(FileOpenError,"UnableToCreateTemporaryFile"); + (void) FormatLocaleFile(file,"\n"); + (void) FormatLocaleFile(file,"\n",(double) + image->columns,(double) image->rows); + for (i=0; i < (ssize_t) number_blocks; i++) + { + offset=blocks[i].offset; + (void) FormatLocaleFile(file," red,blocks[i].color->green, + blocks[i].color->blue,stitches[offset].x-bounds.x1, + stitches[offset].y-bounds.y1); + for (j=1; j < (ssize_t) (blocks[i+1].offset-offset); j++) + (void) FormatLocaleFile(file," L %g %g",stitches[offset+j].x-bounds.x1, + stitches[offset+j].y-bounds.y1); + (void) FormatLocaleFile(file,"\"/>\n"); + } + (void) FormatLocaleFile(file,"\n"); + (void) fclose(file); + stitches=(PointInfo *) RelinquishMagickMemory(stitches); + (void) CloseBlob(image); + image=DestroyImage(image); + /* + Read SVG file. + */ + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) FormatLocaleString(read_info->filename,MaxTextExtent,"svg:%s", + filename); + image=ReadImage(read_info,exception); + if (image != (Image *) NULL) + { + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick_filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick,"PES",MaxTextExtent); + } + read_info=DestroyImageInfo(read_info); + (void) RelinquishUniqueFileResource(filename); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P E S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPESImage() adds attributes for the PES image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPESImage method is: +% +% size_t RegisterPESImage(void) +% +*/ +ModuleExport size_t RegisterPESImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PES"); + entry->decoder=(DecodeImageHandler *) ReadPESImage; + entry->magick=(IsImageFormatHandler *) IsPES; + entry->description=ConstantString("Embrid Embroidery Format"); + entry->magick_module=ConstantString("PES"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P E S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPESImage() removes format registrations made by the +% PES module from the list of supported formats. +% +% The format of the UnregisterPESImage method is: +% +% UnregisterPESImage(void) +% +*/ +ModuleExport void UnregisterPESImage(void) +{ + (void) UnregisterMagickInfo("PES"); +} diff --git a/ImageMagick-6.9.12-44/coders/pgx.c b/ImageMagick-6.9.12-44/coders/pgx.c new file mode 100644 index 0000000..851d1da --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pgx.c @@ -0,0 +1,399 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP GGGG X X % +% P P G X X % +% PPPP G GG X % +% P G G X X % +% P GGG X X % +% % +% % +% PGX JPEG 2000 Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePGXImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P G X % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPGXreturns True if the image format type, identified by the magick +% string, is PGX. +% +% The format of the IsPGX method is: +% +% unsigned int IsPGX(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static unsigned int IsPGX(const unsigned char *magick,const size_t length) +{ + if (length < 5) + return(MagickFalse); + if ((memcmp(magick,"PG ML",5) == 0) || (memcmp(magick,"PG LM",5) == 0)) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P G X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPGXImage() reads an image of raw bits in LSB order and returns it. +% It allocates the memory necessary for the new Image structure and returns +% a pointer to the new image. +% +% The format of the ReadPGXImage method is: +% +% Image *ReadPGXImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadPGXImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + buffer[MaxTextExtent], + endian[MaxTextExtent], + sans[MaxTextExtent], + sign[MaxTextExtent]; + + Image + *image; + + int + height, + precision, + width; + + QuantumInfo + *quantum_info; + + MagickBooleanType + status; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if (ReadBlobString(image,buffer) == (char *) NULL) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + count=(ssize_t) sscanf(buffer,"PG%[ \t]%2s%[ \t+-]%d%[ \t]%d%[ \t]%d",sans, + endian,sign,&precision,sans,&width,sans,&height); + if (count != 8) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + image->depth=(size_t) precision; + if (LocaleCompare(endian,"ML") == 0) + image->endian=MSBEndian; + image->columns=(size_t) width; + image->rows=(size_t) height; + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + return(DestroyImageList(image)); + /* + Convert PGX image. + */ + (void) SetImageColorspace(image,GRAYColorspace); + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + length=GetQuantumExtent(image,quantum_info,GrayQuantum); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + const void + *stream; + + PixelPacket + *magick_restrict q; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + GrayQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,image->rows) == MagickFalse) + break; + } + SetQuantumImageType(image,GrayQuantum); + quantum_info=DestroyQuantumInfo(quantum_info); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P G X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPGXImage() adds attributes for the PGX image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPGXImage method is: +% +% size_t RegisterPGXImage(void) +% +*/ +ModuleExport size_t RegisterPGXImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PGX"); + entry->decoder=(DecodeImageHandler *) ReadPGXImage; + entry->encoder=(EncodeImageHandler *) WritePGXImage; + entry->magick=(IsImageFormatHandler *) IsPGX; + entry->adjoin=MagickFalse; + entry->description=ConstantString("JPEG 2000 uncompressed format"); + entry->magick_module=ConstantString("PGX"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P G X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPGXImage() removes format registrations made by the +% PGX module from the list of supported formats. +% +% The format of the UnregisterPGXImage method is: +% +% UnregisterPGXImage(void) +% +*/ +ModuleExport void UnregisterPGXImage(void) +{ + (void) UnregisterMagickInfo("PGX"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P G X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePGXImage() writes an image of raw bits in LSB order to a file. +% +% The format of the WritePGXImage method is: +% +% MagickBooleanType WritePGXImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WritePGXImage(const ImageInfo *image_info,Image *image) +{ + char + buffer[MaxTextExtent]; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + QuantumInfo + *quantum_info; + + const PixelPacket + *p; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=(&image->exception); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); + if (status == MagickFalse) + return(status); + (void) FormatLocaleString(buffer,MaxTextExtent,"PG ML + %g %g %g\n", + (double) image->depth,(double) image->columns,(double) image->rows); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + quantum_info=AcquireQuantumInfo(image_info,image); + pixels=(unsigned char *) GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info, + GrayQuantum,pixels,exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + count=WriteBlob(image,(size_t) (-(ssize_t) length) & 0x01,pixels); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (y < (ssize_t) image->rows) + ThrowWriterException(CorruptImageError,"UnableToWriteImageData"); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/pict.c b/ImageMagick-6.9.12-44/coders/pict.c new file mode 100644 index 0000000..cf51241 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pict.c @@ -0,0 +1,2125 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP IIIII CCCC TTTTT % +% P P I C T % +% PPPP I C T % +% P I C T % +% P IIIII CCCC T % +% % +% % +% Read/Write Apple Macintosh QuickDraw/PICT Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/composite.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/transform.h" +#include "magick/utility.h" + +/* + ImageMagick Macintosh PICT Methods. +*/ +typedef struct _PICTCode +{ + const char + *name; + + ssize_t + length; + + const char + *description; +} PICTCode; + +typedef struct _PICTPixmap +{ + short + version, + pack_type; + + size_t + pack_size, + horizontal_resolution, + vertical_resolution; + + short + pixel_type, + bits_per_pixel, + component_count, + component_size; + + size_t + plane_bytes, + table, + reserved; +} PICTPixmap; + +typedef struct _PICTRectangle +{ + short + top, + left, + bottom, + right; +} PICTRectangle; + +static const PICTCode + codes[] = + { + /* 0x00 */ { "NOP", 0, "nop" }, + /* 0x01 */ { "Clip", 0, "clip" }, + /* 0x02 */ { "BkPat", 8, "background pattern" }, + /* 0x03 */ { "TxFont", 2, "text font (word)" }, + /* 0x04 */ { "TxFace", 1, "text face (byte)" }, + /* 0x05 */ { "TxMode", 2, "text mode (word)" }, + /* 0x06 */ { "SpExtra", 4, "space extra (fixed point)" }, + /* 0x07 */ { "PnSize", 4, "pen size (point)" }, + /* 0x08 */ { "PnMode", 2, "pen mode (word)" }, + /* 0x09 */ { "PnPat", 8, "pen pattern" }, + /* 0x0a */ { "FillPat", 8, "fill pattern" }, + /* 0x0b */ { "OvSize", 4, "oval size (point)" }, + /* 0x0c */ { "Origin", 4, "dh, dv (word)" }, + /* 0x0d */ { "TxSize", 2, "text size (word)" }, + /* 0x0e */ { "FgColor", 4, "foreground color (ssize_tword)" }, + /* 0x0f */ { "BkColor", 4, "background color (ssize_tword)" }, + /* 0x10 */ { "TxRatio", 8, "numerator (point), denominator (point)" }, + /* 0x11 */ { "Version", 1, "version (byte)" }, + /* 0x12 */ { "BkPixPat", 0, "color background pattern" }, + /* 0x13 */ { "PnPixPat", 0, "color pen pattern" }, + /* 0x14 */ { "FillPixPat", 0, "color fill pattern" }, + /* 0x15 */ { "PnLocHFrac", 2, "fractional pen position" }, + /* 0x16 */ { "ChExtra", 2, "extra for each character" }, + /* 0x17 */ { "reserved", 0, "reserved for Apple use" }, + /* 0x18 */ { "reserved", 0, "reserved for Apple use" }, + /* 0x19 */ { "reserved", 0, "reserved for Apple use" }, + /* 0x1a */ { "RGBFgCol", 6, "RGB foreColor" }, + /* 0x1b */ { "RGBBkCol", 6, "RGB backColor" }, + /* 0x1c */ { "HiliteMode", 0, "hilite mode flag" }, + /* 0x1d */ { "HiliteColor", 6, "RGB hilite color" }, + /* 0x1e */ { "DefHilite", 0, "Use default hilite color" }, + /* 0x1f */ { "OpColor", 6, "RGB OpColor for arithmetic modes" }, + /* 0x20 */ { "Line", 8, "pnLoc (point), newPt (point)" }, + /* 0x21 */ { "LineFrom", 4, "newPt (point)" }, + /* 0x22 */ { "ShortLine", 6, "pnLoc (point, dh, dv (-128 .. 127))" }, + /* 0x23 */ { "ShortLineFrom", 2, "dh, dv (-128 .. 127)" }, + /* 0x24 */ { "reserved", -1, "reserved for Apple use" }, + /* 0x25 */ { "reserved", -1, "reserved for Apple use" }, + /* 0x26 */ { "reserved", -1, "reserved for Apple use" }, + /* 0x27 */ { "reserved", -1, "reserved for Apple use" }, + /* 0x28 */ { "LongText", 0, "txLoc (point), count (0..255), text" }, + /* 0x29 */ { "DHText", 0, "dh (0..255), count (0..255), text" }, + /* 0x2a */ { "DVText", 0, "dv (0..255), count (0..255), text" }, + /* 0x2b */ { "DHDVText", 0, "dh, dv (0..255), count (0..255), text" }, + /* 0x2c */ { "reserved", -1, "reserved for Apple use" }, + /* 0x2d */ { "reserved", -1, "reserved for Apple use" }, + /* 0x2e */ { "reserved", -1, "reserved for Apple use" }, + /* 0x2f */ { "reserved", -1, "reserved for Apple use" }, + /* 0x30 */ { "frameRect", 8, "rect" }, + /* 0x31 */ { "paintRect", 8, "rect" }, + /* 0x32 */ { "eraseRect", 8, "rect" }, + /* 0x33 */ { "invertRect", 8, "rect" }, + /* 0x34 */ { "fillRect", 8, "rect" }, + /* 0x35 */ { "reserved", 8, "reserved for Apple use" }, + /* 0x36 */ { "reserved", 8, "reserved for Apple use" }, + /* 0x37 */ { "reserved", 8, "reserved for Apple use" }, + /* 0x38 */ { "frameSameRect", 0, "rect" }, + /* 0x39 */ { "paintSameRect", 0, "rect" }, + /* 0x3a */ { "eraseSameRect", 0, "rect" }, + /* 0x3b */ { "invertSameRect", 0, "rect" }, + /* 0x3c */ { "fillSameRect", 0, "rect" }, + /* 0x3d */ { "reserved", 0, "reserved for Apple use" }, + /* 0x3e */ { "reserved", 0, "reserved for Apple use" }, + /* 0x3f */ { "reserved", 0, "reserved for Apple use" }, + /* 0x40 */ { "frameRRect", 8, "rect" }, + /* 0x41 */ { "paintRRect", 8, "rect" }, + /* 0x42 */ { "eraseRRect", 8, "rect" }, + /* 0x43 */ { "invertRRect", 8, "rect" }, + /* 0x44 */ { "fillRRrect", 8, "rect" }, + /* 0x45 */ { "reserved", 8, "reserved for Apple use" }, + /* 0x46 */ { "reserved", 8, "reserved for Apple use" }, + /* 0x47 */ { "reserved", 8, "reserved for Apple use" }, + /* 0x48 */ { "frameSameRRect", 0, "rect" }, + /* 0x49 */ { "paintSameRRect", 0, "rect" }, + /* 0x4a */ { "eraseSameRRect", 0, "rect" }, + /* 0x4b */ { "invertSameRRect", 0, "rect" }, + /* 0x4c */ { "fillSameRRect", 0, "rect" }, + /* 0x4d */ { "reserved", 0, "reserved for Apple use" }, + /* 0x4e */ { "reserved", 0, "reserved for Apple use" }, + /* 0x4f */ { "reserved", 0, "reserved for Apple use" }, + /* 0x50 */ { "frameOval", 8, "rect" }, + /* 0x51 */ { "paintOval", 8, "rect" }, + /* 0x52 */ { "eraseOval", 8, "rect" }, + /* 0x53 */ { "invertOval", 8, "rect" }, + /* 0x54 */ { "fillOval", 8, "rect" }, + /* 0x55 */ { "reserved", 8, "reserved for Apple use" }, + /* 0x56 */ { "reserved", 8, "reserved for Apple use" }, + /* 0x57 */ { "reserved", 8, "reserved for Apple use" }, + /* 0x58 */ { "frameSameOval", 0, "rect" }, + /* 0x59 */ { "paintSameOval", 0, "rect" }, + /* 0x5a */ { "eraseSameOval", 0, "rect" }, + /* 0x5b */ { "invertSameOval", 0, "rect" }, + /* 0x5c */ { "fillSameOval", 0, "rect" }, + /* 0x5d */ { "reserved", 0, "reserved for Apple use" }, + /* 0x5e */ { "reserved", 0, "reserved for Apple use" }, + /* 0x5f */ { "reserved", 0, "reserved for Apple use" }, + /* 0x60 */ { "frameArc", 12, "rect, startAngle, arcAngle" }, + /* 0x61 */ { "paintArc", 12, "rect, startAngle, arcAngle" }, + /* 0x62 */ { "eraseArc", 12, "rect, startAngle, arcAngle" }, + /* 0x63 */ { "invertArc", 12, "rect, startAngle, arcAngle" }, + /* 0x64 */ { "fillArc", 12, "rect, startAngle, arcAngle" }, + /* 0x65 */ { "reserved", 12, "reserved for Apple use" }, + /* 0x66 */ { "reserved", 12, "reserved for Apple use" }, + /* 0x67 */ { "reserved", 12, "reserved for Apple use" }, + /* 0x68 */ { "frameSameArc", 4, "rect, startAngle, arcAngle" }, + /* 0x69 */ { "paintSameArc", 4, "rect, startAngle, arcAngle" }, + /* 0x6a */ { "eraseSameArc", 4, "rect, startAngle, arcAngle" }, + /* 0x6b */ { "invertSameArc", 4, "rect, startAngle, arcAngle" }, + /* 0x6c */ { "fillSameArc", 4, "rect, startAngle, arcAngle" }, + /* 0x6d */ { "reserved", 4, "reserved for Apple use" }, + /* 0x6e */ { "reserved", 4, "reserved for Apple use" }, + /* 0x6f */ { "reserved", 4, "reserved for Apple use" }, + /* 0x70 */ { "framePoly", 0, "poly" }, + /* 0x71 */ { "paintPoly", 0, "poly" }, + /* 0x72 */ { "erasePoly", 0, "poly" }, + /* 0x73 */ { "invertPoly", 0, "poly" }, + /* 0x74 */ { "fillPoly", 0, "poly" }, + /* 0x75 */ { "reserved", 0, "reserved for Apple use" }, + /* 0x76 */ { "reserved", 0, "reserved for Apple use" }, + /* 0x77 */ { "reserved", 0, "reserved for Apple use" }, + /* 0x78 */ { "frameSamePoly", 0, "poly (NYI)" }, + /* 0x79 */ { "paintSamePoly", 0, "poly (NYI)" }, + /* 0x7a */ { "eraseSamePoly", 0, "poly (NYI)" }, + /* 0x7b */ { "invertSamePoly", 0, "poly (NYI)" }, + /* 0x7c */ { "fillSamePoly", 0, "poly (NYI)" }, + /* 0x7d */ { "reserved", 0, "reserved for Apple use" }, + /* 0x7e */ { "reserved", 0, "reserved for Apple use" }, + /* 0x7f */ { "reserved", 0, "reserved for Apple use" }, + /* 0x80 */ { "frameRgn", 0, "region" }, + /* 0x81 */ { "paintRgn", 0, "region" }, + /* 0x82 */ { "eraseRgn", 0, "region" }, + /* 0x83 */ { "invertRgn", 0, "region" }, + /* 0x84 */ { "fillRgn", 0, "region" }, + /* 0x85 */ { "reserved", 0, "reserved for Apple use" }, + /* 0x86 */ { "reserved", 0, "reserved for Apple use" }, + /* 0x87 */ { "reserved", 0, "reserved for Apple use" }, + /* 0x88 */ { "frameSameRgn", 0, "region (NYI)" }, + /* 0x89 */ { "paintSameRgn", 0, "region (NYI)" }, + /* 0x8a */ { "eraseSameRgn", 0, "region (NYI)" }, + /* 0x8b */ { "invertSameRgn", 0, "region (NYI)" }, + /* 0x8c */ { "fillSameRgn", 0, "region (NYI)" }, + /* 0x8d */ { "reserved", 0, "reserved for Apple use" }, + /* 0x8e */ { "reserved", 0, "reserved for Apple use" }, + /* 0x8f */ { "reserved", 0, "reserved for Apple use" }, + /* 0x90 */ { "BitsRect", 0, "copybits, rect clipped" }, + /* 0x91 */ { "BitsRgn", 0, "copybits, rgn clipped" }, + /* 0x92 */ { "reserved", -1, "reserved for Apple use" }, + /* 0x93 */ { "reserved", -1, "reserved for Apple use" }, + /* 0x94 */ { "reserved", -1, "reserved for Apple use" }, + /* 0x95 */ { "reserved", -1, "reserved for Apple use" }, + /* 0x96 */ { "reserved", -1, "reserved for Apple use" }, + /* 0x97 */ { "reserved", -1, "reserved for Apple use" }, + /* 0x98 */ { "PackBitsRect", 0, "packed copybits, rect clipped" }, + /* 0x99 */ { "PackBitsRgn", 0, "packed copybits, rgn clipped" }, + /* 0x9a */ { "DirectBitsRect", 0, "PixMap, srcRect, dstRect, mode, PixData" }, + /* 0x9b */ { "DirectBitsRgn", 0, "PixMap, srcRect, dstRect, mode, maskRgn, PixData" }, + /* 0x9c */ { "reserved", -1, "reserved for Apple use" }, + /* 0x9d */ { "reserved", -1, "reserved for Apple use" }, + /* 0x9e */ { "reserved", -1, "reserved for Apple use" }, + /* 0x9f */ { "reserved", -1, "reserved for Apple use" }, + /* 0xa0 */ { "ShortComment", 2, "kind (word)" }, + /* 0xa1 */ { "LongComment", 0, "kind (word), size (word), data" } + }; + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePICTImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DecodeImage decompresses an image via Macintosh pack bits decoding for +% Macintosh PICT images. +% +% The format of the DecodeImage method is: +% +% unsigned char *DecodeImage(Image *blob,Image *image, +% size_t bytes_per_line,const int bits_per_pixel, +% unsigned size_t extent) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o blob,image: the address of a structure of type Image. +% +% o bytes_per_line: This integer identifies the number of bytes in a +% scanline. +% +% o bits_per_pixel: the number of bits in a pixel. +% +% o extent: the number of pixels allocated. +% +*/ + +static const unsigned char *UnpackScanline( + const unsigned char *magick_restrict pixels,const unsigned int bits_per_pixel, + unsigned char *scanline,MagickSizeType *bytes_per_line) +{ + const unsigned char + *p; + + ssize_t + i; + + unsigned char + *q; + + p=pixels; + q=scanline; + switch (bits_per_pixel) + { + case 8: + case 16: + case 32: + return(pixels); + case 4: + { + for (i=0; i < (ssize_t) *bytes_per_line; i++) + { + *q++=(*p >> 4) & 0xff; + *q++=(*p & 15); + p++; + } + *bytes_per_line*=2; + break; + } + case 2: + { + for (i=0; i < (ssize_t) *bytes_per_line; i++) + { + *q++=(*p >> 6) & 0x03; + *q++=(*p >> 4) & 0x03; + *q++=(*p >> 2) & 0x03; + *q++=(*p & 3); + p++; + } + *bytes_per_line*=4; + break; + } + case 1: + { + for (i=0; i < (ssize_t) *bytes_per_line; i++) + { + *q++=(*p >> 7) & 0x01; + *q++=(*p >> 6) & 0x01; + *q++=(*p >> 5) & 0x01; + *q++=(*p >> 4) & 0x01; + *q++=(*p >> 3) & 0x01; + *q++=(*p >> 2) & 0x01; + *q++=(*p >> 1) & 0x01; + *q++=(*p & 0x01); + p++; + } + *bytes_per_line*=8; + break; + } + default: + break; + } + return(scanline); +} + +static unsigned char *DecodeImage(Image *blob,Image *image, + size_t bytes_per_line,const unsigned int bits_per_pixel,size_t *extent) +{ + MagickBooleanType + status; + + MagickSizeType + number_pixels; + + const unsigned char + *p; + + ssize_t + i; + + unsigned char + *q; + + size_t + bytes_per_pixel, + length, + row_bytes, + scanline_length, + width; + + ssize_t + count, + j, + y; + + unsigned char + *pixels, + *scanline, + unpack_buffer[8*256]; + + /* + Determine pixel buffer size. + */ + if (bits_per_pixel <= 8) + bytes_per_line&=0x7fff; + width=image->columns; + bytes_per_pixel=1; + if (bits_per_pixel == 16) + { + bytes_per_pixel=2; + width*=2; + } + else + if (bits_per_pixel == 32) + width*=image->matte != MagickFalse ? 4 : 3; + if (bytes_per_line == 0) + bytes_per_line=width; + row_bytes=(size_t) (image->columns | 0x8000); + if (image->storage_class == DirectClass) + row_bytes=(size_t) (4*(image->columns | 0x8000)); + /* + Allocate pixel and scanline buffer. + */ + pixels=(unsigned char *) AcquireQuantumMemory(image->rows,row_bytes* + sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + return((unsigned char *) NULL); + *extent=row_bytes*image->rows*sizeof(*pixels); + (void) memset(pixels,0,*extent); + scanline=(unsigned char *) AcquireQuantumMemory(row_bytes,2* + sizeof(*scanline)); + if (scanline == (unsigned char *) NULL) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + return((unsigned char *) NULL); + } + (void) memset(scanline,0,2*row_bytes*sizeof(*scanline)); + (void) memset(unpack_buffer,0,sizeof(unpack_buffer)); + status=MagickTrue; + if (bytes_per_line < 8) + { + /* + Pixels are already uncompressed. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=pixels+y*width; + number_pixels=bytes_per_line; + count=ReadBlob(blob,(size_t) number_pixels,scanline); + if (count != (ssize_t) number_pixels) + { + status=MagickFalse; + break; + } + p=UnpackScanline(scanline,bits_per_pixel,unpack_buffer,&number_pixels); + if ((q+number_pixels) > (pixels+(*extent))) + { + status=MagickFalse; + break; + } + (void) memcpy(q,p,(size_t) number_pixels); + } + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + if (status == MagickFalse) + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + return(pixels); + } + /* + Uncompress RLE pixels into uncompressed pixel buffer. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=pixels+y*width; + if (bytes_per_line > 200) + scanline_length=ReadBlobMSBShort(blob); + else + scanline_length=(size_t) ReadBlobByte(blob); + if ((scanline_length >= row_bytes) || (scanline_length == 0)) + { + status=MagickFalse; + break; + } + count=ReadBlob(blob,scanline_length,scanline); + if (count != (ssize_t) scanline_length) + { + status=MagickFalse; + break; + } + for (j=0; j < (ssize_t) scanline_length; ) + if ((scanline[j] & 0x80) == 0) + { + length=(size_t) ((scanline[j] & 0xff)+1); + number_pixels=length*bytes_per_pixel; + p=UnpackScanline(scanline+j+1,bits_per_pixel,unpack_buffer, + &number_pixels); + if ((q-pixels+number_pixels) <= *extent) + (void) memcpy(q,p,(size_t) number_pixels); + q+=number_pixels; + j+=(ssize_t) (length*bytes_per_pixel+1); + } + else + { + length=(size_t) (((scanline[j] ^ 0xff) & 0xff)+2); + number_pixels=bytes_per_pixel; + p=UnpackScanline(scanline+j+1,bits_per_pixel,unpack_buffer, + &number_pixels); + for (i=0; i < (ssize_t) length; i++) + { + if ((q-pixels+number_pixels) <= *extent) + (void) memcpy(q,p,(size_t) number_pixels); + q+=number_pixels; + } + j+=(ssize_t) bytes_per_pixel+1; + } + } + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + if (status == MagickFalse) + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + return(pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E n c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EncodeImage compresses an image via Macintosh pack bits encoding +% for Macintosh PICT images. +% +% The format of the EncodeImage method is: +% +% size_t EncodeImage(Image *image,const unsigned char *scanline, +% const size_t bytes_per_line,unsigned char *pixels) +% +% A description of each parameter follows: +% +% o image: the address of a structure of type Image. +% +% o scanline: A pointer to an array of characters to pack. +% +% o bytes_per_line: the number of bytes in a scanline. +% +% o pixels: A pointer to an array of characters where the packed +% characters are stored. +% +*/ +static size_t EncodeImage(Image *image,const unsigned char *scanline, + const size_t bytes_per_line,unsigned char *pixels) +{ +#define MaxCount 128 +#define MaxPackbitsRunlength 128 + + const unsigned char + *p; + + ssize_t + i; + + unsigned char + *q; + + size_t + length; + + ssize_t + count, + repeat_count, + runlength; + + unsigned char + index; + + /* + Pack scanline. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(scanline != (unsigned char *) NULL); + assert(pixels != (unsigned char *) NULL); + count=0; + runlength=0; + p=scanline+(bytes_per_line-1); + q=pixels; + index=(*p); + for (i=(ssize_t) bytes_per_line-1; i >= 0; i--) + { + if (index == *p) + runlength++; + else + { + if (runlength < 3) + while (runlength > 0) + { + *q++=(unsigned char) index; + runlength--; + count++; + if (count == MaxCount) + { + *q++=(unsigned char) (MaxCount-1); + count-=MaxCount; + } + } + else + { + if (count > 0) + *q++=(unsigned char) (count-1); + count=0; + while (runlength > 0) + { + repeat_count=runlength; + if (repeat_count > MaxPackbitsRunlength) + repeat_count=MaxPackbitsRunlength; + *q++=(unsigned char) index; + *q++=(unsigned char) (257-repeat_count); + runlength-=repeat_count; + } + } + runlength=1; + } + index=(*p); + p--; + } + if (runlength < 3) + while (runlength > 0) + { + *q++=(unsigned char) index; + runlength--; + count++; + if (count == MaxCount) + { + *q++=(unsigned char) (MaxCount-1); + count-=MaxCount; + } + } + else + { + if (count > 0) + *q++=(unsigned char) (count-1); + count=0; + while (runlength > 0) + { + repeat_count=runlength; + if (repeat_count > MaxPackbitsRunlength) + repeat_count=MaxPackbitsRunlength; + *q++=(unsigned char) index; + *q++=(unsigned char) (257-repeat_count); + runlength-=repeat_count; + } + } + if (count > 0) + *q++=(unsigned char) (count-1); + /* + Write the number of and the packed length. + */ + length=(size_t) (q-pixels); + if (bytes_per_line > 200) + { + (void) WriteBlobMSBShort(image,(unsigned short) length); + length+=2; + } + else + { + (void) WriteBlobByte(image,(unsigned char) length); + length++; + } + while (q != pixels) + { + q--; + (void) WriteBlobByte(image,*q); + } + return(length); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P I C T % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPICT()() returns MagickTrue if the image format type, identified by the +% magick string, is PICT. +% +% The format of the ReadPICTImage method is: +% +% MagickBooleanType IsPICT(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsPICT(const unsigned char *magick,const size_t length) +{ + /* + Embedded OLE2 macintosh have "PICT" instead of 512 platform header. + */ + if (length < 12) + return(MagickFalse); + if (memcmp(magick,"PICT",4) == 0) + return(MagickTrue); + if (length < 528) + return(MagickFalse); + if (memcmp(magick+522,"\000\021\002\377\014\000",6) == 0) + return(MagickTrue); + return(MagickFalse); +} + +#if !defined(macintosh) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P I C T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPICTImage() reads an Apple Macintosh QuickDraw/PICT image file +% and returns it. It allocates the memory necessary for the new Image +% structure and returns a pointer to the new image. +% +% The format of the ReadPICTImage method is: +% +% Image *ReadPICTImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType ReadPixmap(Image *image,PICTPixmap *pixmap) +{ + pixmap->version=(short) ReadBlobMSBShort(image); + pixmap->pack_type=(short) ReadBlobMSBShort(image); + pixmap->pack_size=ReadBlobMSBLong(image); + pixmap->horizontal_resolution=1UL*ReadBlobMSBShort(image); + (void) ReadBlobMSBShort(image); + pixmap->vertical_resolution=1UL*ReadBlobMSBShort(image); + (void) ReadBlobMSBShort(image); + pixmap->pixel_type=(short) ReadBlobMSBShort(image); + pixmap->bits_per_pixel=(short) ReadBlobMSBShort(image); + pixmap->component_count=(short) ReadBlobMSBShort(image); + pixmap->component_size=(short) ReadBlobMSBShort(image); + pixmap->plane_bytes=ReadBlobMSBLong(image); + pixmap->table=ReadBlobMSBLong(image); + pixmap->reserved=ReadBlobMSBLong(image); + if ((EOFBlob(image) != MagickFalse) || (pixmap->bits_per_pixel <= 0) || + (pixmap->bits_per_pixel > 32) || (pixmap->component_count <= 0) || + (pixmap->component_count > 4) || (pixmap->component_size <= 0)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ReadRectangle(Image *image,PICTRectangle *rectangle) +{ + rectangle->top=(short) ReadBlobMSBShort(image); + rectangle->left=(short) ReadBlobMSBShort(image); + rectangle->bottom=(short) ReadBlobMSBShort(image); + rectangle->right=(short) ReadBlobMSBShort(image); + if (((EOFBlob(image) != MagickFalse) || + (((rectangle->bottom | rectangle->top | + rectangle->right | rectangle->left ) & 0x8000) != 0) || + (rectangle->bottom < rectangle->top) || + (rectangle->right < rectangle->left))) + return(MagickFalse); + return(MagickTrue); +} + +static Image *ReadPICTImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ +#define ThrowPICTException(exception,message) \ +{ \ + if (tile_image != (Image *) NULL) \ + tile_image=DestroyImage(tile_image); \ + if (read_info != (ImageInfo *) NULL) \ + read_info=DestroyImageInfo(read_info); \ + ThrowReaderException((exception),(message)); \ +} + + char + geometry[MaxTextExtent], + header_ole[4]; + + Image + *image, + *tile_image; + + ImageInfo + *read_info; + + IndexPacket + index; + + int + c, + code; + + MagickBooleanType + jpeg, + status; + + PICTRectangle + frame; + + PICTPixmap + pixmap; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + i; + + size_t + extent, + length; + + ssize_t + count, + flags, + j, + version, + y; + + StringInfo + *profile; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read PICT header. + */ + read_info=(ImageInfo *) NULL; + tile_image=(Image *) NULL; + pixmap.bits_per_pixel=0; + pixmap.component_count=0; + /* + Skip header : 512 for standard PICT and 4, ie "PICT" for OLE2 + */ + header_ole[0]=ReadBlobByte(image); + header_ole[1]=ReadBlobByte(image); + header_ole[2]=ReadBlobByte(image); + header_ole[3]=ReadBlobByte(image); + if (!((header_ole[0] == 0x50) && (header_ole[1] == 0x49) && + (header_ole[2] == 0x43) && (header_ole[3] == 0x54))) + for (i=0; i < 508; i++) + if (ReadBlobByte(image) == EOF) + break; + (void) ReadBlobMSBShort(image); /* skip picture size */ + if (ReadRectangle(image,&frame) == MagickFalse) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + while ((c=ReadBlobByte(image)) == 0) ; + if (c != 0x11) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + version=(ssize_t) ReadBlobByte(image); + if (version == 2) + { + c=ReadBlobByte(image); + if (c != 0xff) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + } + else + if (version != 1) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + if ((frame.left < 0) || (frame.right < 0) || (frame.top < 0) || + (frame.bottom < 0) || (frame.left >= frame.right) || + (frame.top >= frame.bottom)) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + /* + Create black canvas. + */ + flags=0; + image->depth=8; + image->columns=(unsigned int) (frame.right-frame.left); + image->rows=(unsigned int) (frame.bottom-frame.top); + image->x_resolution=DefaultResolution; + image->y_resolution=DefaultResolution; + image->units=UndefinedResolution; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status != MagickFalse) + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Interpret PICT opcodes. + */ + jpeg=MagickFalse; + for (code=0; EOFBlob(image) == MagickFalse; ) + { + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if ((version == 1) || ((TellBlob(image) % 2) != 0)) + code=ReadBlobByte(image); + if (version == 2) + code=ReadBlobMSBSignedShort(image); + code&=0xffff; + if (code < 0) + break; + if (code == 0) + continue; + if (code > 0xa1) + { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"%04X:",code); + } + else + { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " %04X %s: %s",code,codes[code].name,codes[code].description); + switch (code) + { + case 0x01: + { + /* + Clipping rectangle. + */ + length=ReadBlobMSBShort(image); + if ((MagickSizeType) length > GetBlobSize(image)) + ThrowPICTException(CorruptImageError, + "InsufficientImageDataInFile"); + if (length != 0x000a) + { + for (i=0; i < (ssize_t) (length-2); i++) + if (ReadBlobByte(image) == EOF) + break; + break; + } + if (ReadRectangle(image,&frame) == MagickFalse) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + if (((frame.left & 0x8000) != 0) || ((frame.top & 0x8000) != 0)) + break; + image->columns=(size_t) (frame.right-frame.left); + image->rows=(size_t) (frame.bottom-frame.top); + if (image_info->ping != MagickFalse) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status != MagickFalse) + status=ResetImagePixels(image,&image->exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + break; + } + case 0x12: + case 0x13: + case 0x14: + { + ssize_t + pattern; + + size_t + height, + width; + + /* + Skip pattern definition. + */ + pattern=(ssize_t) ReadBlobMSBShort(image); + for (i=0; i < 8; i++) + if (ReadBlobByte(image) == EOF) + break; + if (pattern == 2) + { + for (i=0; i < 5; i++) + if (ReadBlobByte(image) == EOF) + break; + break; + } + if (pattern != 1) + ThrowPICTException(CorruptImageError,"UnknownPatternType"); + length=ReadBlobMSBShort(image); + if ((MagickSizeType) length > GetBlobSize(image)) + ThrowPICTException(CorruptImageError, + "InsufficientImageDataInFile"); + if (ReadRectangle(image,&frame) == MagickFalse) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + if (ReadPixmap(image,&pixmap) == MagickFalse) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + image->depth=(size_t) pixmap.component_size; + image->x_resolution=1.0*pixmap.horizontal_resolution; + image->y_resolution=1.0*pixmap.vertical_resolution; + image->units=PixelsPerInchResolution; + (void) ReadBlobMSBLong(image); + flags=(ssize_t) ReadBlobMSBShort(image); + length=ReadBlobMSBShort(image); + if ((MagickSizeType) length > GetBlobSize(image)) + ThrowPICTException(CorruptImageError, + "InsufficientImageDataInFile"); + for (i=0; i <= (ssize_t) length; i++) + (void) ReadBlobMSBLong(image); + width=(size_t) (frame.bottom-frame.top); + height=(size_t) (frame.right-frame.left); + if (pixmap.bits_per_pixel <= 8) + length&=0x7fff; + if (pixmap.bits_per_pixel == 16) + width<<=1; + if (length == 0) + length=width; + if (length < 8) + { + for (i=0; i < (ssize_t) (length*height); i++) + if (ReadBlobByte(image) == EOF) + break; + } + else + for (i=0; i < (ssize_t) height; i++) + { + size_t + scanline_length; + + if (EOFBlob(image) != MagickFalse) + break; + if (length > 200) + scanline_length=ReadBlobMSBShort(image); + else + scanline_length=ReadBlobByte(image); + if ((MagickSizeType) scanline_length > GetBlobSize(image)) + ThrowPICTException(CorruptImageError, + "InsufficientImageDataInFile"); + for (j=0; j < (ssize_t) scanline_length; j++) + if (ReadBlobByte(image) == EOF) + break; + } + break; + } + case 0x1b: + { + /* + Initialize image background color. + */ + image->background_color.red=(Quantum) + ScaleShortToQuantum(ReadBlobMSBShort(image)); + image->background_color.green=(Quantum) + ScaleShortToQuantum(ReadBlobMSBShort(image)); + image->background_color.blue=(Quantum) + ScaleShortToQuantum(ReadBlobMSBShort(image)); + break; + } + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + { + /* + Skip polygon or region. + */ + length=ReadBlobMSBShort(image); + if ((MagickSizeType) length > GetBlobSize(image)) + ThrowPICTException(CorruptImageError, + "InsufficientImageDataInFile"); + for (i=0; i < (ssize_t) (length-2); i++) + if (ReadBlobByte(image) == EOF) + break; + break; + } + case 0x90: + case 0x91: + case 0x98: + case 0x99: + case 0x9a: + case 0x9b: + { + ssize_t + bytes_per_line; + + PICTRectangle + source, + destination; + + unsigned char + *p; + + size_t + j; + + unsigned char + *pixels; + + /* + Pixmap clipped by a rectangle. + */ + bytes_per_line=0; + if ((code != 0x9a) && (code != 0x9b)) + bytes_per_line=(ssize_t) ReadBlobMSBShort(image); + else + { + (void) ReadBlobMSBShort(image); + (void) ReadBlobMSBShort(image); + (void) ReadBlobMSBShort(image); + } + if (ReadRectangle(image,&frame) == MagickFalse) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + /* + Initialize tile image. + */ + tile_image=CloneImage(image,(size_t) (frame.right-frame.left), + (size_t) (frame.bottom-frame.top),MagickTrue,exception); + if (tile_image == (Image *) NULL) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + status=ResetImagePixels(tile_image,exception); + if ((code == 0x9a) || (code == 0x9b) || + ((bytes_per_line & 0x8000) != 0)) + { + if (ReadPixmap(image,&pixmap) == MagickFalse) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + tile_image->depth=(size_t) pixmap.component_size; + tile_image->matte=pixmap.component_count == 4 ? + MagickTrue : MagickFalse; + tile_image->x_resolution=(double) pixmap.horizontal_resolution; + tile_image->y_resolution=(double) pixmap.vertical_resolution; + tile_image->units=PixelsPerInchResolution; + if (tile_image->matte != MagickFalse) + (void) SetImageAlphaChannel(tile_image,OpaqueAlphaChannel); + } + if ((code != 0x9a) && (code != 0x9b)) + { + /* + Initialize colormap. + */ + tile_image->colors=2; + if ((bytes_per_line & 0x8000) != 0) + { + (void) ReadBlobMSBLong(image); + flags=(ssize_t) ReadBlobMSBShort(image); + tile_image->colors=1UL*ReadBlobMSBShort(image)+1; + } + status=AcquireImageColormap(tile_image,tile_image->colors); + if (status == MagickFalse) + ThrowPICTException(ResourceLimitError, + "MemoryAllocationFailed"); + if ((bytes_per_line & 0x8000) != 0) + { + for (i=0; i < (ssize_t) tile_image->colors; i++) + { + j=ReadBlobMSBShort(image) % tile_image->colors; + if ((flags & 0x8000) != 0) + j=(size_t) i; + tile_image->colormap[j].red=(Quantum) + ScaleShortToQuantum(ReadBlobMSBShort(image)); + tile_image->colormap[j].green=(Quantum) + ScaleShortToQuantum(ReadBlobMSBShort(image)); + tile_image->colormap[j].blue=(Quantum) + ScaleShortToQuantum(ReadBlobMSBShort(image)); + } + } + else + { + for (i=0; i < (ssize_t) tile_image->colors; i++) + { + tile_image->colormap[i].red=(Quantum) (QuantumRange- + tile_image->colormap[i].red); + tile_image->colormap[i].green=(Quantum) (QuantumRange- + tile_image->colormap[i].green); + tile_image->colormap[i].blue=(Quantum) (QuantumRange- + tile_image->colormap[i].blue); + } + } + } + if (EOFBlob(image) != MagickFalse) + ThrowPICTException(CorruptImageError, + "InsufficientImageDataInFile"); + if (ReadRectangle(image,&source) == MagickFalse) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + if (ReadRectangle(image,&destination) == MagickFalse) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + (void) ReadBlobMSBShort(image); + if ((code == 0x91) || (code == 0x99) || (code == 0x9b)) + { + /* + Skip region. + */ + length=ReadBlobMSBShort(image); + if ((MagickSizeType) length > GetBlobSize(image)) + ThrowPICTException(CorruptImageError, + "InsufficientImageDataInFile"); + for (i=0; i < (ssize_t) (length-2); i++) + if (ReadBlobByte(image) == EOF) + break; + } + if ((code != 0x9a) && (code != 0x9b) && + (bytes_per_line & 0x8000) == 0) + pixels=DecodeImage(image,tile_image,(size_t) bytes_per_line,1, + &extent); + else + pixels=DecodeImage(image,tile_image,(unsigned int) bytes_per_line, + (unsigned int) pixmap.bits_per_pixel,&extent); + if (pixels == (unsigned char *) NULL) + ThrowPICTException(CorruptImageError,"UnableToUncompressImage"); + /* + Convert PICT tile image to pixel packets. + */ + p=pixels; + for (y=0; y < (ssize_t) tile_image->rows; y++) + { + if (p > (pixels+extent+image->columns)) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowPICTException(CorruptImageError,"NotEnoughPixelData"); + } + q=QueueAuthenticPixels(tile_image,0,y,tile_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(tile_image); + for (x=0; x < (ssize_t) tile_image->columns; x++) + { + if (tile_image->storage_class == PseudoClass) + { + index=ConstrainColormapIndex(tile_image,(ssize_t) *p); + SetPixelIndex(indexes+x,index); + SetPixelRed(q, + tile_image->colormap[(ssize_t) index].red); + SetPixelGreen(q, + tile_image->colormap[(ssize_t) index].green); + SetPixelBlue(q, + tile_image->colormap[(ssize_t) index].blue); + } + else + { + if (pixmap.bits_per_pixel == 16) + { + i=(ssize_t) (*p++); + j=(*p); + SetPixelRed(q,ScaleCharToQuantum( + (unsigned char) ((i & 0x7c) << 1))); + SetPixelGreen(q,ScaleCharToQuantum( + (unsigned char) (((i & 0x03) << 6) | + ((j & 0xe0) >> 2)))); + SetPixelBlue(q,ScaleCharToQuantum( + (unsigned char) ((j & 0x1f) << 3))); + } + else + if (tile_image->matte == MagickFalse) + { + if (p > (pixels+extent+2*image->columns)) + ThrowPICTException(CorruptImageError, + "NotEnoughPixelData"); + SetPixelRed(q,ScaleCharToQuantum(*p)); + SetPixelGreen(q,ScaleCharToQuantum( + *(p+tile_image->columns))); + SetPixelBlue(q,ScaleCharToQuantum( + *(p+2*tile_image->columns))); + } + else + { + if (p > (pixels+extent+3*image->columns)) + ThrowPICTException(CorruptImageError, + "NotEnoughPixelData"); + SetPixelAlpha(q,ScaleCharToQuantum(*p)); + SetPixelRed(q,ScaleCharToQuantum( + *(p+tile_image->columns))); + SetPixelGreen(q,ScaleCharToQuantum( + *(p+2*tile_image->columns))); + SetPixelBlue(q,ScaleCharToQuantum( + *(p+3*tile_image->columns))); + } + } + p++; + q++; + } + if (SyncAuthenticPixels(tile_image,exception) == MagickFalse) + break; + if ((tile_image->storage_class == DirectClass) && + (pixmap.bits_per_pixel != 16)) + { + p+=(pixmap.component_count-1)*tile_image->columns; + if (p < pixels) + break; + } + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + tile_image->rows); + if (status == MagickFalse) + break; + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if ((jpeg == MagickFalse) && (EOFBlob(image) == MagickFalse)) + if ((code == 0x9a) || (code == 0x9b) || + ((bytes_per_line & 0x8000) != 0)) + (void) CompositeImage(image,CopyCompositeOp,tile_image, + (ssize_t) destination.left,(ssize_t) destination.top); + tile_image=DestroyImage(tile_image); + break; + } + case 0xa1: + { + unsigned char + *info; + + size_t + type; + + /* + Comment. + */ + type=ReadBlobMSBShort(image); + length=ReadBlobMSBShort(image); + if ((MagickSizeType) length > GetBlobSize(image)) + ThrowPICTException(CorruptImageError, + "InsufficientImageDataInFile"); + if (length == 0) + break; + (void) ReadBlobMSBLong(image); + length-=MagickMin(length,4); + if (length == 0) + break; + info=(unsigned char *) AcquireQuantumMemory(length,sizeof(*info)); + if (info == (unsigned char *) NULL) + break; + count=ReadBlob(image,length,info); + if (count != (ssize_t) length) + { + info=(unsigned char *) RelinquishMagickMemory(info); + ThrowPICTException(ResourceLimitError,"UnableToReadImageData"); + } + switch (type) + { + case 0xe0: + { + profile=BlobToStringInfo((const void *) NULL,length); + SetStringInfoDatum(profile,info); + status=SetImageProfile(image,"icc",profile); + profile=DestroyStringInfo(profile); + if (status == MagickFalse) + { + info=(unsigned char *) RelinquishMagickMemory(info); + ThrowPICTException(ResourceLimitError, + "MemoryAllocationFailed"); + } + break; + } + case 0x1f2: + { + profile=BlobToStringInfo((const void *) NULL,length); + SetStringInfoDatum(profile,info); + status=SetImageProfile(image,"iptc",profile); + if (status == MagickFalse) + { + info=(unsigned char *) RelinquishMagickMemory(info); + ThrowPICTException(ResourceLimitError, + "MemoryAllocationFailed"); + } + profile=DestroyStringInfo(profile); + break; + } + default: + break; + } + info=(unsigned char *) RelinquishMagickMemory(info); + break; + } + default: + { + /* + Skip to next op code. + */ + if (codes[code].length == -1) + (void) ReadBlobMSBShort(image); + else + for (i=0; i < (ssize_t) codes[code].length; i++) + if (ReadBlobByte(image) == EOF) + break; + } + } + } + if (code == 0xc00) + { + /* + Skip header. + */ + for (i=0; i < 24; i++) + if (ReadBlobByte(image) == EOF) + break; + continue; + } + if (((code >= 0xb0) && (code <= 0xcf)) || + ((code >= 0x8000) && (code <= 0x80ff))) + continue; + if (code == 0x8200) + { + /* + Embedded JPEG. + */ + jpeg=MagickTrue; + length=ReadBlobMSBLong(image); + if ((MagickSizeType) length > GetBlobSize(image)) + ThrowPICTException(CorruptImageError,"InsufficientImageDataInFile"); + if (length > 154) + { + const void + *stream; + + ssize_t + count; + + unsigned char + *pixels; + + for (i=0; i < 6; i++) + (void) ReadBlobMSBLong(image); + if (ReadRectangle(image,&frame) == MagickFalse) + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + for (i=0; i < 122; i++) + if (ReadBlobByte(image) == EOF) + break; + length-=154; + pixels=(unsigned char *) AcquireQuantumMemory(length, + sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowPICTException(ResourceLimitError,"MemoryAllocationFailed"); + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowPICTException(CorruptImageError,"ImproperImageHeader"); + } + read_info=AcquireImageInfo(); + (void) FormatLocaleString(read_info->filename,MaxTextExtent, + "jpeg:%s",image_info->filename); + tile_image=BlobToImage(read_info,stream,count,exception); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + read_info=DestroyImageInfo(read_info); + } + if (tile_image == (Image *) NULL) + continue; + (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.20g", + (double) MagickMax(image->columns,tile_image->columns), + (double) MagickMax(image->rows,tile_image->rows)); + (void) SetImageExtent(image, + MagickMax(image->columns,tile_image->columns), + MagickMax(image->rows,tile_image->rows)); + (void) TransformImageColorspace(image,tile_image->colorspace); + (void) CompositeImage(image,CopyCompositeOp,tile_image,(ssize_t) + frame.left,(ssize_t) frame.right); + image->compression=tile_image->compression; + tile_image=DestroyImage(tile_image); + continue; + } + if ((code == 0xff) || (code == 0xffff)) + break; + if (((code >= 0xd0) && (code <= 0xfe)) || + ((code >= 0x8100) && (code <= 0xffff))) + { + /* + Skip reserved. + */ + length=ReadBlobMSBShort(image); + if ((MagickSizeType) length > GetBlobSize(image)) + ThrowPICTException(CorruptImageError,"InsufficientImageDataInFile"); + for (i=0; i < (ssize_t) length; i++) + if (ReadBlobByte(image) == EOF) + break; + continue; + } + if ((code >= 0x100) && (code <= 0x7fff)) + { + /* + Skip reserved. + */ + length=(size_t) ((code >> 7) & 0xff); + if ((MagickSizeType) length > GetBlobSize(image)) + ThrowPICTException(CorruptImageError,"InsufficientImageDataInFile"); + for (i=0; i < (ssize_t) length; i++) + if (ReadBlobByte(image) == EOF) + break; + continue; + } + } + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P I C T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPICTImage() adds attributes for the PICT image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPICTImage method is: +% +% size_t RegisterPICTImage(void) +% +*/ +ModuleExport size_t RegisterPICTImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PCT"); + entry->decoder=(DecodeImageHandler *) ReadPICTImage; + entry->encoder=(EncodeImageHandler *) WritePICTImage; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Apple Macintosh QuickDraw/PICT"); + entry->magick=(IsImageFormatHandler *) IsPICT; + entry->magick_module=ConstantString("PICT"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PICT"); + entry->decoder=(DecodeImageHandler *) ReadPICTImage; + entry->encoder=(EncodeImageHandler *) WritePICTImage; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Apple Macintosh QuickDraw/PICT"); + entry->magick=(IsImageFormatHandler *) IsPICT; + entry->magick_module=ConstantString("PICT"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P I C T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPICTImage() removes format registrations made by the +% PICT module from the list of supported formats. +% +% The format of the UnregisterPICTImage method is: +% +% UnregisterPICTImage(void) +% +*/ +ModuleExport void UnregisterPICTImage(void) +{ + (void) UnregisterMagickInfo("PCT"); + (void) UnregisterMagickInfo("PICT"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P I C T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePICTImage() writes an image to a file in the Apple Macintosh +% QuickDraw/PICT image format. +% +% The format of the WritePICTImage method is: +% +% MagickBooleanType WritePICTImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WritePICTImage(const ImageInfo *image_info, + Image *image) +{ +#define MaxCount 128 +#define PictCropRegionOp 0x01 +#define PictEndOfPictureOp 0xff +#define PictJPEGOp 0x8200 +#define PictInfoOp 0x0C00 +#define PictInfoSize 512 +#define PictPixmapOp 0x9A +#define PictPICTOp 0x98 +#define PictVersion 0x11 + + const StringInfo + *profile; + + double + x_resolution, + y_resolution; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + PICTPixmap + pixmap; + + PICTRectangle + bounds, + crop_rectangle, + destination_rectangle, + frame_rectangle, + size_rectangle, + source_rectangle; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + size_t + bytes_per_line, + count, + row_bytes, + storage_class; + + ssize_t + y; + + unsigned char + *buffer, + *packed_scanline, + *scanline; + + + unsigned short + base_address, + transfer_mode; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((image->columns > 65535L) || (image->rows > 65535L)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Initialize image info. + */ + size_rectangle.top=0; + size_rectangle.left=0; + size_rectangle.bottom=(short) image->rows; + size_rectangle.right=(short) image->columns; + frame_rectangle=size_rectangle; + crop_rectangle=size_rectangle; + source_rectangle=size_rectangle; + destination_rectangle=size_rectangle; + base_address=0xff; + row_bytes=image->columns; + bounds.top=0; + bounds.left=0; + bounds.bottom=(short) image->rows; + bounds.right=(short) image->columns; + pixmap.version=0; + pixmap.pack_type=0; + pixmap.pack_size=0; + pixmap.pixel_type=0; + pixmap.bits_per_pixel=8; + pixmap.component_count=1; + pixmap.component_size=8; + pixmap.plane_bytes=0; + pixmap.table=0; + pixmap.reserved=0; + transfer_mode=0; + x_resolution=0.0; + y_resolution=0.0; + if ((image->x_resolution > MagickEpsilon) && + (image->y_resolution > MagickEpsilon)) + { + x_resolution=image->x_resolution; + y_resolution=image->y_resolution; + if (image->units == PixelsPerCentimeterResolution) + { + x_resolution*=2.54; + y_resolution*=2.54; + } + } + storage_class=image->storage_class; + if (image_info->compression == JPEGCompression) + storage_class=DirectClass; + if (storage_class == DirectClass) + { + pixmap.component_count=image->matte != MagickFalse ? 4 : 3; + pixmap.pixel_type=16; + pixmap.bits_per_pixel=32; + pixmap.pack_type=0x04; + transfer_mode=0x40; + row_bytes=4*image->columns; + } + /* + Allocate memory. + */ + bytes_per_line=image->columns; + if (storage_class == DirectClass) + bytes_per_line*=image->matte != MagickFalse ? 4 : 3; + if ((bytes_per_line == 0) || (bytes_per_line > 0x7FFFU) || + ((row_bytes+MaxCount*2U) >= 0x7FFFU)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + buffer=(unsigned char *) AcquireQuantumMemory(PictInfoSize,sizeof(*buffer)); + packed_scanline=(unsigned char *) AcquireQuantumMemory((size_t) + (row_bytes+2*MaxCount),sizeof(*packed_scanline)); + scanline=(unsigned char *) AcquireQuantumMemory(row_bytes,sizeof(*scanline)); + if ((buffer == (unsigned char *) NULL) || + (packed_scanline == (unsigned char *) NULL) || + (scanline == (unsigned char *) NULL)) + { + if (scanline != (unsigned char *) NULL) + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + if (packed_scanline != (unsigned char *) NULL) + packed_scanline=(unsigned char *) RelinquishMagickMemory( + packed_scanline); + if (buffer != (unsigned char *) NULL) + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(scanline,0,row_bytes); + (void) memset(packed_scanline,0,(size_t) (row_bytes+2*MaxCount)* + sizeof(*packed_scanline)); + /* + Write header, header size, size bounding box, version, and reserved. + */ + (void) memset(buffer,0,PictInfoSize); + (void) WriteBlob(image,PictInfoSize,buffer); + (void) WriteBlobMSBShort(image,0); + (void) WriteBlobMSBShort(image,(unsigned short) size_rectangle.top); + (void) WriteBlobMSBShort(image,(unsigned short) size_rectangle.left); + (void) WriteBlobMSBShort(image,(unsigned short) size_rectangle.bottom); + (void) WriteBlobMSBShort(image,(unsigned short) size_rectangle.right); + (void) WriteBlobMSBShort(image,PictVersion); + (void) WriteBlobMSBShort(image,0x02ff); /* version #2 */ + (void) WriteBlobMSBShort(image,PictInfoOp); + (void) WriteBlobMSBLong(image,0xFFFE0000U); + /* + Write full size of the file, resolution, frame bounding box, and reserved. + */ + (void) WriteBlobMSBShort(image,(unsigned short) x_resolution); + (void) WriteBlobMSBShort(image,0x0000); + (void) WriteBlobMSBShort(image,(unsigned short) y_resolution); + (void) WriteBlobMSBShort(image,0x0000); + (void) WriteBlobMSBShort(image,(unsigned short) frame_rectangle.top); + (void) WriteBlobMSBShort(image,(unsigned short) frame_rectangle.left); + (void) WriteBlobMSBShort(image,(unsigned short) frame_rectangle.bottom); + (void) WriteBlobMSBShort(image,(unsigned short) frame_rectangle.right); + (void) WriteBlobMSBLong(image,0x00000000L); + profile=GetImageProfile(image,"iptc"); + if (profile != (StringInfo *) NULL) + { + (void) WriteBlobMSBShort(image,0xa1); + (void) WriteBlobMSBShort(image,0x1f2); + (void) WriteBlobMSBShort(image,(unsigned short) + (GetStringInfoLength(profile)+4)); + (void) WriteBlobString(image,"8BIM"); + (void) WriteBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + } + profile=GetImageProfile(image,"icc"); + if (profile != (StringInfo *) NULL) + { + (void) WriteBlobMSBShort(image,0xa1); + (void) WriteBlobMSBShort(image,0xe0); + (void) WriteBlobMSBShort(image,(unsigned short) + (GetStringInfoLength(profile)+4)); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlob(image,GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + (void) WriteBlobMSBShort(image,0xa1); + (void) WriteBlobMSBShort(image,0xe0); + (void) WriteBlobMSBShort(image,4); + (void) WriteBlobMSBLong(image,0x00000002U); + } + /* + Write crop region opcode and crop bounding box. + */ + (void) WriteBlobMSBShort(image,PictCropRegionOp); + (void) WriteBlobMSBShort(image,0xa); + (void) WriteBlobMSBShort(image,(unsigned short) crop_rectangle.top); + (void) WriteBlobMSBShort(image,(unsigned short) crop_rectangle.left); + (void) WriteBlobMSBShort(image,(unsigned short) crop_rectangle.bottom); + (void) WriteBlobMSBShort(image,(unsigned short) crop_rectangle.right); + if (image_info->compression == JPEGCompression) + { + Image + *jpeg_image; + + ImageInfo + *jpeg_info; + + size_t + length; + + unsigned char + *blob; + + jpeg_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (jpeg_image == (Image *) NULL) + { + (void) CloseBlob(image); + return(MagickFalse); + } + jpeg_info=CloneImageInfo(image_info); + (void) CopyMagickString(jpeg_info->magick,"JPEG",MaxTextExtent); + length=0; + blob=(unsigned char *) ImageToBlob(jpeg_info,jpeg_image,&length, + &image->exception); + jpeg_info=DestroyImageInfo(jpeg_info); + if (blob == (unsigned char *) NULL) + return(MagickFalse); + jpeg_image=DestroyImage(jpeg_image); + (void) WriteBlobMSBShort(image,PictJPEGOp); + (void) WriteBlobMSBLong(image,(unsigned int) length+154); + (void) WriteBlobMSBShort(image,0x0000); + (void) WriteBlobMSBLong(image,0x00010000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00010000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x40000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00400000U); + (void) WriteBlobMSBShort(image,0x0000); + (void) WriteBlobMSBShort(image,(unsigned short) image->rows); + (void) WriteBlobMSBShort(image,(unsigned short) image->columns); + (void) WriteBlobMSBShort(image,0x0000); + (void) WriteBlobMSBShort(image,768); + (void) WriteBlobMSBShort(image,0x0000); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00566A70U); + (void) WriteBlobMSBLong(image,0x65670000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000001U); + (void) WriteBlobMSBLong(image,0x00016170U); + (void) WriteBlobMSBLong(image,0x706C0000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBShort(image,768); + (void) WriteBlobMSBShort(image,(unsigned short) image->columns); + (void) WriteBlobMSBShort(image,(unsigned short) image->rows); + (void) WriteBlobMSBShort(image,(unsigned short) x_resolution); + (void) WriteBlobMSBShort(image,0x0000); + (void) WriteBlobMSBShort(image,(unsigned short) y_resolution); + (void) WriteBlobMSBShort(image,0x0000); + (void) WriteBlobMSBLong(image,(unsigned int) length); + (void) WriteBlobMSBShort(image,0x0001); + (void) WriteBlobMSBLong(image,0x0B466F74U); + (void) WriteBlobMSBLong(image,0x6F202D20U); + (void) WriteBlobMSBLong(image,0x4A504547U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x00000000U); + (void) WriteBlobMSBLong(image,0x0018FFFFU); + (void) WriteBlob(image,length,blob); + if ((length & 0x01) != 0) + (void) WriteBlobByte(image,'\0'); + blob=(unsigned char *) RelinquishMagickMemory(blob); + } + /* + Write picture opcode, row bytes, and picture bounding box, and version. + */ + if (storage_class == PseudoClass) + (void) WriteBlobMSBShort(image,PictPICTOp); + else + { + (void) WriteBlobMSBShort(image,PictPixmapOp); + (void) WriteBlobMSBLong(image,(unsigned int) base_address); + } + (void) WriteBlobMSBShort(image,(unsigned short) (row_bytes | 0x8000)); + (void) WriteBlobMSBShort(image,(unsigned short) bounds.top); + (void) WriteBlobMSBShort(image,(unsigned short) bounds.left); + (void) WriteBlobMSBShort(image,(unsigned short) bounds.bottom); + (void) WriteBlobMSBShort(image,(unsigned short) bounds.right); + /* + Write pack type, pack size, resolution, pixel type, and pixel size. + */ + (void) WriteBlobMSBShort(image,(unsigned short) pixmap.version); + (void) WriteBlobMSBShort(image,(unsigned short) pixmap.pack_type); + (void) WriteBlobMSBLong(image,(unsigned int) pixmap.pack_size); + (void) WriteBlobMSBShort(image,(unsigned short) (x_resolution+0.5)); + (void) WriteBlobMSBShort(image,0x0000); + (void) WriteBlobMSBShort(image,(unsigned short) (y_resolution+0.5)); + (void) WriteBlobMSBShort(image,0x0000); + (void) WriteBlobMSBShort(image,(unsigned short) pixmap.pixel_type); + (void) WriteBlobMSBShort(image,(unsigned short) pixmap.bits_per_pixel); + /* + Write component count, size, plane bytes, table size, and reserved. + */ + (void) WriteBlobMSBShort(image,(unsigned short) pixmap.component_count); + (void) WriteBlobMSBShort(image,(unsigned short) pixmap.component_size); + (void) WriteBlobMSBLong(image,(unsigned int) pixmap.plane_bytes); + (void) WriteBlobMSBLong(image,(unsigned int) pixmap.table); + (void) WriteBlobMSBLong(image,(unsigned int) pixmap.reserved); + if (storage_class == PseudoClass) + { + /* + Write image colormap. + */ + (void) WriteBlobMSBLong(image,0x00000000L); /* color seed */ + (void) WriteBlobMSBShort(image,0L); /* color flags */ + (void) WriteBlobMSBShort(image,(unsigned short) (image->colors-1)); + for (i=0; i < (ssize_t) image->colors; i++) + { + (void) WriteBlobMSBShort(image,(unsigned short) i); + (void) WriteBlobMSBShort(image,ScaleQuantumToShort( + image->colormap[i].red)); + (void) WriteBlobMSBShort(image,ScaleQuantumToShort( + image->colormap[i].green)); + (void) WriteBlobMSBShort(image,ScaleQuantumToShort( + image->colormap[i].blue)); + } + } + /* + Write source and destination rectangle. + */ + (void) WriteBlobMSBShort(image,(unsigned short) source_rectangle.top); + (void) WriteBlobMSBShort(image,(unsigned short) source_rectangle.left); + (void) WriteBlobMSBShort(image,(unsigned short) source_rectangle.bottom); + (void) WriteBlobMSBShort(image,(unsigned short) source_rectangle.right); + (void) WriteBlobMSBShort(image,(unsigned short) destination_rectangle.top); + (void) WriteBlobMSBShort(image,(unsigned short) destination_rectangle.left); + (void) WriteBlobMSBShort(image,(unsigned short) destination_rectangle.bottom); + (void) WriteBlobMSBShort(image,(unsigned short) destination_rectangle.right); + (void) WriteBlobMSBShort(image,(unsigned short) transfer_mode); + /* + Write picture data. + */ + count=0; + if (storage_class == PseudoClass) + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + scanline[x]=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + count+=EncodeImage(image,scanline,(size_t) (row_bytes & 0x7FFF), + packed_scanline); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + else + if (image_info->compression == JPEGCompression) + { + (void) memset(scanline,0,row_bytes); + for (y=0; y < (ssize_t) image->rows; y++) + count+=EncodeImage(image,scanline,(size_t) (row_bytes & 0x7FFF), + packed_scanline); + } + else + { + unsigned char + *blue, + *green, + *opacity, + *red; + + red=scanline; + green=scanline+image->columns; + blue=scanline+2*image->columns; + opacity=scanline+3*image->columns; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + red=scanline; + green=scanline+image->columns; + blue=scanline+2*image->columns; + if (image->matte != MagickFalse) + { + opacity=scanline; + red=scanline+image->columns; + green=scanline+2*image->columns; + blue=scanline+3*image->columns; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + *red++=ScaleQuantumToChar(GetPixelRed(p)); + *green++=ScaleQuantumToChar(GetPixelGreen(p)); + *blue++=ScaleQuantumToChar(GetPixelBlue(p)); + if (image->matte != MagickFalse) + *opacity++=ScaleQuantumToChar((Quantum) (GetPixelAlpha(p))); + p++; + } + count+=EncodeImage(image,scanline,bytes_per_line,packed_scanline); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + if ((count & 0x01) != 0) + (void) WriteBlobByte(image,'\0'); + (void) WriteBlobMSBShort(image,PictEndOfPictureOp); + offset=TellBlob(image); + offset=SeekBlob(image,512,SEEK_SET); + (void) WriteBlobMSBShort(image,(unsigned short) offset); + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + packed_scanline=(unsigned char *) RelinquishMagickMemory(packed_scanline); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/pix.c b/ImageMagick-6.9.12-44/coders/pix.c new file mode 100644 index 0000000..0edc500 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pix.c @@ -0,0 +1,330 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP IIIII X X % +% P P I X X % +% PPPP I X % +% P I X X % +% P IIIII X X % +% % +% % +% Read Alias/Wavefront RLE Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colormap.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P I X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPIXImage() reads a Alias/Wavefront RLE image file and returns it. +% It allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadPIXImage method is: +% +% Image *ReadPIXImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +% +*/ +static Image *ReadPIXImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + IndexPacket + index; + + MagickBooleanType + status; + + Quantum + blue, + green, + red; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + size_t + bits_per_pixel, + height, + length, + width; + + ssize_t + y; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read PIX image. + */ + width=ReadBlobMSBShort(image); + height=ReadBlobMSBShort(image); + (void) ReadBlobMSBShort(image); /* x-offset */ + (void) ReadBlobMSBShort(image); /* y-offset */ + bits_per_pixel=ReadBlobMSBShort(image); + if ((width == 0UL) || (height == 0UL) || ((bits_per_pixel != 8) && + (bits_per_pixel != 24))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + do + { + /* + Initialize image structure. + */ + image->columns=width; + image->rows=height; + if (bits_per_pixel == 8) + if (AcquireImageColormap(image,256) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + return(DestroyImageList(image)); + /* + Convert PIX raster image to pixel packets. + */ + red=(Quantum) 0; + green=(Quantum) 0; + blue=(Quantum) 0; + index=(IndexPacket) 0; + length=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + if (length == 0) + { + int + c; + + c=ReadBlobByte(image); + if ((c == 0) || (c == EOF)) + break; + length=(size_t) c; + if (bits_per_pixel == 8) + index=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + else + { + blue=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + green=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + red=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + } + } + if (image->storage_class == PseudoClass) + SetPixelIndex(indexes+x,index); + SetPixelBlue(q,blue); + SetPixelGreen(q,green); + SetPixelRed(q,red); + length--; + q++; + } + if (x < (ssize_t) image->columns) + break; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (image->storage_class == PseudoClass) + (void) SyncImage(image); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + width=ReadBlobMSBLong(image); + height=ReadBlobMSBLong(image); + (void) ReadBlobMSBShort(image); + (void) ReadBlobMSBShort(image); + bits_per_pixel=ReadBlobMSBShort(image); + status=(width != 0UL) && (height == 0UL) && ((bits_per_pixel == 8) || + (bits_per_pixel == 24)) ? MagickTrue : MagickFalse; + if (status != MagickFalse) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while (status != MagickFalse); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P I X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPIXImage() adds attributes for the PIX image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPIXImage method is: +% +% size_t RegisterPIXImage(void) +% +*/ +ModuleExport size_t RegisterPIXImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PIX"); + entry->decoder=(DecodeImageHandler *) ReadPIXImage; + entry->description=ConstantString("Alias/Wavefront RLE image format"); + entry->magick_module=ConstantString("PIX"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P I X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPIXImage() removes format registrations made by the +% PIX module from the list of supported formats. +% +% The format of the UnregisterPIXImage method is: +% +% UnregisterPIXImage(void) +% +*/ +ModuleExport void UnregisterPIXImage(void) +{ + (void) UnregisterMagickInfo("PIX"); +} diff --git a/ImageMagick-6.9.12-44/coders/plasma.c b/ImageMagick-6.9.12-44/coders/plasma.c new file mode 100644 index 0000000..40a8179 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/plasma.c @@ -0,0 +1,292 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP L AAA SSSSS M M AAA % +% P P L A A SS MM MM A A % +% PPPP L AAAAA SSS M M M AAAAA % +% P L A A SS M M A A % +% P LLLLL A A SSSSS M M A A % +% % +% % +% Read a Plasma Image. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/fx.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/random_.h" +#include "magick/random-private.h" +#include "magick/signature-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/visual-effects.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P L A S M A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPlasmaImage creates a plasma fractal image. The image is +% initialized to the X server color as specified by the filename. +% +% The format of the ReadPlasmaImage method is: +% +% Image *ReadPlasmaImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline MagickBooleanType PlasmaPixel(Image *image, + RandomInfo *magick_restrict random_info,const double x,const double y, + ExceptionInfo *exception) +{ + PixelPacket + *q; + + q=GetAuthenticPixels(image,(ssize_t) (x+0.5),(ssize_t) (y+0.5),1,1, + exception); + if (q == (PixelPacket *) NULL) + return(MagickFalse); + SetPixelRed(q,(Quantum) (QuantumRange* + GetPseudoRandomValue(random_info)+0.5)); + SetPixelGreen(q,(Quantum) (QuantumRange* + GetPseudoRandomValue(random_info)+0.5)); + SetPixelBlue(q,(Quantum) (QuantumRange* + GetPseudoRandomValue(random_info)+0.5)); + return(SyncAuthenticPixels(image,exception)); +} + +static Image *ReadPlasmaImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + ImageInfo + *read_info; + + MagickStatusType + status; + + ssize_t + x; + + PixelPacket + *q; + + size_t + i; + + SegmentInfo + segment_info; + + size_t + depth, + max_depth; + + ssize_t + y; + + /* + Recursively apply plasma to the image. + */ + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) FormatLocaleString(read_info->filename,MaxTextExtent, + "gradient:%s",image_info->filename); + image=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (image == (Image *) NULL) + return((Image *) NULL); + image->storage_class=DirectClass; + if (IsGrayColorspace(image->colorspace) != MagickFalse) + (void) SetImageColorspace(image,sRGBColorspace); + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,QuantumRange/2); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + segment_info.x1=0; + segment_info.y1=0; + segment_info.x2=(double) image->columns-1; + segment_info.y2=(double) image->rows-1; + if (LocaleCompare(image_info->filename,"fractal") == 0) + { + RandomInfo + *random_info; + + /* + Seed pixels before recursion. + */ + random_info=AcquireRandomInfo(); + status=PlasmaPixel(image,random_info,segment_info.x1,segment_info.y1, + &image->exception); + status=PlasmaPixel(image,random_info,segment_info.x1,(segment_info.y1+ + segment_info.y2)/2.0,&image->exception); + status&=PlasmaPixel(image,random_info,segment_info.x1,segment_info.y2, + &image->exception); + status&=PlasmaPixel(image,random_info,(segment_info.x1+segment_info.x2)/ + 2.0,segment_info.y1,&image->exception); + status&=PlasmaPixel(image,random_info,(segment_info.x1+segment_info.x2)/ + 2.0,(segment_info.y1+segment_info.y2)/2,&image->exception); + status&=PlasmaPixel(image,random_info,(segment_info.x1+segment_info.x2)/ + 2.0,segment_info.y2,&image->exception); + status&=PlasmaPixel(image,random_info,segment_info.x2,segment_info.y1, + &image->exception); + status&=PlasmaPixel(image,random_info,segment_info.x2,(segment_info.y1+ + segment_info.y2)/2.0,&image->exception); + status&=PlasmaPixel(image,random_info,segment_info.x2,segment_info.y2, + &image->exception); + random_info=DestroyRandomInfo(random_info); + if (status == MagickFalse) + return(image); + } + i=(size_t) MagickMax(image->columns,image->rows)/2; + for (max_depth=0; i != 0; max_depth++) + i>>=1; + for (depth=1; ; depth++) + { + if (PlasmaImage(image,&segment_info,0,depth) != MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) depth, + max_depth); + if (status == MagickFalse) + break; + } + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P L A S M A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPLASMAImage() adds attributes for the Plasma image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPLASMAImage method is: +% +% size_t RegisterPLASMAImage(void) +% +*/ +ModuleExport size_t RegisterPLASMAImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PLASMA"); + entry->decoder=(DecodeImageHandler *) ReadPlasmaImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Plasma fractal image"); + entry->magick_module=ConstantString("PLASMA"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("FRACTAL"); + entry->decoder=(DecodeImageHandler *) ReadPlasmaImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Plasma fractal image"); + entry->magick_module=ConstantString("PLASMA"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P L A S M A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPLASMAImage() removes format registrations made by the +% PLASMA module from the list of supported formats. +% +% The format of the UnregisterPLASMAImage method is: +% +% UnregisterPLASMAImage(void) +% +*/ +ModuleExport void UnregisterPLASMAImage(void) +{ + (void) UnregisterMagickInfo("FRACTAL"); + (void) UnregisterMagickInfo("PLASMA"); +} diff --git a/ImageMagick-6.9.12-44/coders/png.c b/ImageMagick-6.9.12-44/coders/png.c new file mode 100644 index 0000000..a2d0423 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/png.c @@ -0,0 +1,14145 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP N N GGGG % +% P P NN N G % +% PPPP N N N G GG % +% P N NN G G % +% P N N GGG % +% % +% % +% Read/Write Portable Network Graphics Image Format % +% % +% Software Design % +% Cristy % +% Glenn Randers-Pehrson % +% November 1997 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/histogram.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/layer.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/resource_.h" +#include "magick/semaphore.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/timer-private.h" +#include "magick/transform.h" +#include "magick/utility.h" +#if defined(MAGICKCORE_PNG_DELEGATE) + +/* Suppress libpng pedantic warnings that were added in + * libpng-1.2.41 and libpng-1.4.0. If you are working on + * migration to libpng-1.5, remove these defines and then + * fix any code that generates warnings. + */ +/* #define PNG_DEPRECATED Use of this function is deprecated */ +/* #define PNG_USE_RESULT The result of this function must be checked */ +/* #define PNG_NORETURN This function does not return */ +/* #define PNG_ALLOCATED The result of the function is new memory */ +/* #define PNG_DEPSTRUCT Access to this struct member is deprecated */ + +/* PNG_PTR_NORETURN does not work on some platforms, in libpng-1.5.x */ +#define PNG_PTR_NORETURN + +#include +#include + +/* ImageMagick differences */ +#define first_scene scene + +#if PNG_LIBPNG_VER > 10011 +/* + Optional declarations. Define or undefine them as you like. +*/ +/* #define PNG_DEBUG -- turning this on breaks VisualC compiling */ + +/* + Features under construction. Define these to work on them. +*/ +#undef MNG_OBJECT_BUFFERS +#undef MNG_BASI_SUPPORTED +#define MNG_COALESCE_LAYERS /* In 5.4.4, this interfered with MMAP'ed files. */ +#define MNG_INSERT_LAYERS /* Troublesome, but seem to work as of 5.4.4 */ +#if defined(MAGICKCORE_JPEG_DELEGATE) +# define JNG_SUPPORTED /* Not finished as of 5.5.2. See "To do" comments. */ +#endif +#if !defined(RGBColorMatchExact) +#define IsPNGColorEqual(color,target) \ + (((color).red == (target).red) && \ + ((color).green == (target).green) && \ + ((color).blue == (target).blue)) +#endif + +/* Table of recognized sRGB ICC profiles */ +struct sRGB_info_struct +{ + png_uint_32 len; + png_uint_32 crc; + png_byte intent; +}; + +const struct sRGB_info_struct sRGB_info[] = +{ + /* ICC v2 perceptual sRGB_IEC61966-2-1_black_scaled.icc */ + { 3048, 0x3b8772b9UL, 0}, + + /* ICC v2 relative sRGB_IEC61966-2-1_no_black_scaling.icc */ + { 3052, 0x427ebb21UL, 1}, + + /* ICC v4 perceptual sRGB_v4_ICC_preference_displayclass.icc */ + {60988, 0x306fd8aeUL, 0}, + + /* ICC v4 perceptual sRGB_v4_ICC_preference.icc perceptual */ + {60960, 0xbbef7812UL, 0}, + + /* HP? sRGB v2 media-relative sRGB_IEC61966-2-1_noBPC.icc */ + { 3024, 0x5d5129ceUL, 1}, + + /* HP-Microsoft sRGB v2 perceptual */ + { 3144, 0x182ea552UL, 0}, + + /* HP-Microsoft sRGB v2 media-relative */ + { 3144, 0xf29e526dUL, 1}, + + /* Facebook's "2012/01/25 03:41:57", 524, "TINYsRGB.icc" */ + { 524, 0xd4938c39UL, 0}, + + /* "2012/11/28 22:35:21", 3212, "Argyll_sRGB.icm") */ + { 3212, 0x034af5a1UL, 0}, + + /* Not recognized */ + { 0, 0x00000000UL, 0}, +}; + +/* Macros for left-bit-replication to ensure that pixels + * and PixelPackets all have the same image->depth, and for use + * in PNG8 quantization. + */ + + +/* LBR01: Replicate top bit */ + +#define LBR01PacketRed(pixelpacket) \ + (pixelpacket).red=(ScaleQuantumToChar((pixelpacket).red) < 0x10 ? \ + 0 : QuantumRange); + +#define LBR01PacketGreen(pixelpacket) \ + (pixelpacket).green=(ScaleQuantumToChar((pixelpacket).green) < 0x10 ? \ + 0 : QuantumRange); + +#define LBR01PacketBlue(pixelpacket) \ + (pixelpacket).blue=(ScaleQuantumToChar((pixelpacket).blue) < 0x10 ? \ + 0 : QuantumRange); + +#define LBR01PacketOpacity(pixelpacket) \ + (pixelpacket).opacity=(ScaleQuantumToChar((pixelpacket).opacity) < 0x10 ? \ + 0 : QuantumRange); + +#define LBR01PacketRGB(pixelpacket) \ + { \ + LBR01PacketRed((pixelpacket)); \ + LBR01PacketGreen((pixelpacket)); \ + LBR01PacketBlue((pixelpacket)); \ + } + +#define LBR01PacketRGBO(pixelpacket) \ + { \ + LBR01PacketRGB((pixelpacket)); \ + LBR01PacketOpacity((pixelpacket)); \ + } + +#define LBR01PixelRed(pixel) \ + (SetPixelRed((pixel), \ + ScaleQuantumToChar(GetPixelRed((pixel))) < 0x10 ? \ + 0 : QuantumRange)); + +#define LBR01PixelGreen(pixel) \ + (SetPixelGreen((pixel), \ + ScaleQuantumToChar(GetPixelGreen((pixel))) < 0x10 ? \ + 0 : QuantumRange)); + +#define LBR01PixelBlue(pixel) \ + (SetPixelBlue((pixel), \ + ScaleQuantumToChar(GetPixelBlue((pixel))) < 0x10 ? \ + 0 : QuantumRange)); + +#define LBR01PixelOpacity(pixel) \ + (SetPixelOpacity((pixel), \ + ScaleQuantumToChar(GetPixelOpacity((pixel))) < 0x10 ? \ + 0 : QuantumRange)); + +#define LBR01PixelRGB(pixel) \ + { \ + LBR01PixelRed((pixel)); \ + LBR01PixelGreen((pixel)); \ + LBR01PixelBlue((pixel)); \ + } + +#define LBR01PixelRGBO(pixel) \ + { \ + LBR01PixelRGB((pixel)); \ + LBR01PixelOpacity((pixel)); \ + } + +/* LBR02: Replicate top 2 bits */ + +#define LBR02PacketRed(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).red) & 0xc0; \ + (pixelpacket).red=ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ + } +#define LBR02PacketGreen(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).green) & 0xc0; \ + (pixelpacket).green=ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ + } +#define LBR02PacketBlue(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).blue) & 0xc0; \ + (pixelpacket).blue=ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ + } +#define LBR02PacketOpacity(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).opacity) & 0xc0; \ + (pixelpacket).opacity=ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ + } + +#define LBR02PacketRGB(pixelpacket) \ + { \ + LBR02PacketRed((pixelpacket)); \ + LBR02PacketGreen((pixelpacket)); \ + LBR02PacketBlue((pixelpacket)); \ + } + +#define LBR02PacketRGBO(pixelpacket) \ + { \ + LBR02PacketRGB((pixelpacket)); \ + LBR02PacketOpacity((pixelpacket)); \ + } + +#define LBR02PixelRed(pixel) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar(GetPixelRed((pixel))) \ + & 0xc0; \ + SetPixelRed((pixel), ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6)))); \ + } +#define LBR02PixelGreen(pixel) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar(GetPixelGreen((pixel)))\ + & 0xc0; \ + SetPixelGreen((pixel), ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6)))); \ + } +#define LBR02PixelBlue(pixel) \ + { \ + unsigned char lbr_bits= \ + ScaleQuantumToChar(GetPixelBlue((pixel))) & 0xc0; \ + SetPixelBlue((pixel), ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6)))); \ + } +#define LBR02Opacity(pixel) \ + { \ + unsigned char lbr_bits= \ + ScaleQuantumToChar(GetPixelOpacity((pixel))) & 0xc0; \ + SetPixelOpacity((pixel), ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6)))); \ + } + +#define LBR02PixelRGB(pixel) \ + { \ + LBR02PixelRed((pixel)); \ + LBR02PixelGreen((pixel)); \ + LBR02PixelBlue((pixel)); \ + } + +#define LBR02PixelRGBO(pixel) \ + { \ + LBR02PixelRGB((pixel)); \ + LBR02Opacity((pixel)); \ + } + +/* LBR03: Replicate top 3 bits (only used with opaque pixels during + PNG8 quantization) */ + +#define LBR03PacketRed(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).red) & 0xe0; \ + (pixelpacket).red=ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))); \ + } +#define LBR03PacketGreen(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).green) & 0xe0; \ + (pixelpacket).green=ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))); \ + } +#define LBR03PacketBlue(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).blue) & 0xe0; \ + (pixelpacket).blue=ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))); \ + } + +#define LBR03PacketRGB(pixelpacket) \ + { \ + LBR03PacketRed((pixelpacket)); \ + LBR03PacketGreen((pixelpacket)); \ + LBR03PacketBlue((pixelpacket)); \ + } + +#define LBR03PixelRed(pixel) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar(GetPixelRed((pixel))) \ + & 0xe0; \ + SetPixelRed((pixel), ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6)))); \ + } +#define LBR03PixelGreen(pixel) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar(GetPixelGreen((pixel)))\ + & 0xe0; \ + SetPixelGreen((pixel), ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6)))); \ + } +#define LBR03PixelBlue(pixel) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar(GetPixelBlue((pixel))) \ + & 0xe0; \ + SetPixelBlue((pixel), ScaleCharToQuantum( \ + (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6)))); \ + } + +#define LBR03PixelRGB(pixel) \ + { \ + LBR03PixelRed((pixel)); \ + LBR03PixelGreen((pixel)); \ + LBR03PixelBlue((pixel)); \ + } + +/* LBR04: Replicate top 4 bits */ + +#define LBR04PacketRed(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).red) & 0xf0; \ + (pixelpacket).red=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ + } +#define LBR04PacketGreen(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).green) & 0xf0; \ + (pixelpacket).green=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ + } +#define LBR04PacketBlue(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).blue) & 0xf0; \ + (pixelpacket).blue=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ + } +#define LBR04PacketOpacity(pixelpacket) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).opacity) & 0xf0; \ + (pixelpacket).opacity=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ + } + +#define LBR04PacketRGB(pixelpacket) \ + { \ + LBR04PacketRed((pixelpacket)); \ + LBR04PacketGreen((pixelpacket)); \ + LBR04PacketBlue((pixelpacket)); \ + } + +#define LBR04PacketRGBO(pixelpacket) \ + { \ + LBR04PacketRGB((pixelpacket)); \ + LBR04PacketOpacity((pixelpacket)); \ + } + +#define LBR04PixelRed(pixel) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar(GetPixelRed((pixel))) \ + & 0xf0; \ + SetPixelRed((pixel),\ + ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4)))); \ + } +#define LBR04PixelGreen(pixel) \ + { \ + unsigned char lbr_bits=ScaleQuantumToChar(GetPixelGreen((pixel)))\ + & 0xf0; \ + SetPixelGreen((pixel),\ + ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4)))); \ + } +#define LBR04PixelBlue(pixel) \ + { \ + unsigned char lbr_bits= \ + ScaleQuantumToChar(GetPixelBlue((pixel))) & 0xf0; \ + SetPixelBlue((pixel),\ + ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4)))); \ + } +#define LBR04PixelOpacity(pixel) \ + { \ + unsigned char lbr_bits= \ + ScaleQuantumToChar(GetPixelOpacity((pixel))) & 0xf0; \ + SetPixelOpacity((pixel),\ + ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4)))); \ + } + +#define LBR04PixelRGB(pixel) \ + { \ + LBR04PixelRed((pixel)); \ + LBR04PixelGreen((pixel)); \ + LBR04PixelBlue((pixel)); \ + } + +#define LBR04PixelRGBO(pixel) \ + { \ + LBR04PixelRGB((pixel)); \ + LBR04PixelOpacity((pixel)); \ + } + +/* + Establish thread safety. + setjmp/longjmp is claimed to be safe on these platforms: + setjmp/longjmp is alleged to be unsafe on these platforms: +*/ +#ifdef PNG_SETJMP_SUPPORTED +# ifndef IMPNG_SETJMP_IS_THREAD_SAFE +# define IMPNG_SETJMP_NOT_THREAD_SAFE +# endif + +# ifdef IMPNG_SETJMP_NOT_THREAD_SAFE +static SemaphoreInfo + *ping_semaphore = (SemaphoreInfo *) NULL; +# endif +#endif + +/* + This temporary until I set up malloc'ed object attributes array. + Recompile with MNG_MAX_OBJECTS=65536L to avoid this limit but + waste more memory. +*/ +#define MNG_MAX_OBJECTS 256 + +/* + If this not defined, spec is interpreted strictly. If it is + defined, an attempt will be made to recover from some errors, + including + o global PLTE too short +*/ +#undef MNG_LOOSE + +/* + Don't try to define PNG_MNG_FEATURES_SUPPORTED here. Make sure + it's defined in libpng/pngconf.h, version 1.0.9 or later. It won't work + with earlier versions of libpng. From libpng-1.0.3a to libpng-1.0.8, + PNG_READ|WRITE_EMPTY_PLTE were used but those have been deprecated in + libpng in favor of PNG_MNG_FEATURES_SUPPORTED, so we set them here. + PNG_MNG_FEATURES_SUPPORTED is disabled by default in libpng-1.0.9 and + will be enabled by default in libpng-1.2.0. +*/ +#ifdef PNG_MNG_FEATURES_SUPPORTED +# ifndef PNG_READ_EMPTY_PLTE_SUPPORTED +# define PNG_READ_EMPTY_PLTE_SUPPORTED +# endif +# ifndef PNG_WRITE_EMPTY_PLTE_SUPPORTED +# define PNG_WRITE_EMPTY_PLTE_SUPPORTED +# endif +#endif + +/* + Maximum valid size_t in PNG/MNG chunks is (2^31)-1 + This macro is only defined in libpng-1.0.3 and later. + Previously it was PNG_MAX_UINT but that was deprecated in libpng-1.2.6 +*/ +#ifndef PNG_UINT_31_MAX +#define PNG_UINT_31_MAX (png_uint_32) 0x7fffffffL +#endif + +/* + Constant strings for known chunk types. If you need to add a chunk, + add a string holding the name here. To make the code more + portable, we use ASCII numbers like this, not characters. +*/ + + +static const png_byte mng_MHDR[5]={ 77, 72, 68, 82, (png_byte) '\0'}; +static const png_byte mng_BACK[5]={ 66, 65, 67, 75, (png_byte) '\0'}; +static const png_byte mng_BASI[5]={ 66, 65, 83, 73, (png_byte) '\0'}; +static const png_byte mng_CLIP[5]={ 67, 76, 73, 80, (png_byte) '\0'}; +static const png_byte mng_CLON[5]={ 67, 76, 79, 78, (png_byte) '\0'}; +static const png_byte mng_DEFI[5]={ 68, 69, 70, 73, (png_byte) '\0'}; +static const png_byte mng_DHDR[5]={ 68, 72, 68, 82, (png_byte) '\0'}; +static const png_byte mng_DISC[5]={ 68, 73, 83, 67, (png_byte) '\0'}; +static const png_byte mng_ENDL[5]={ 69, 78, 68, 76, (png_byte) '\0'}; +static const png_byte mng_FRAM[5]={ 70, 82, 65, 77, (png_byte) '\0'}; +static const png_byte mng_IEND[5]={ 73, 69, 78, 68, (png_byte) '\0'}; +static const png_byte mng_IHDR[5]={ 73, 72, 68, 82, (png_byte) '\0'}; +static const png_byte mng_JHDR[5]={ 74, 72, 68, 82, (png_byte) '\0'}; +static const png_byte mng_LOOP[5]={ 76, 79, 79, 80, (png_byte) '\0'}; +static const png_byte mng_MAGN[5]={ 77, 65, 71, 78, (png_byte) '\0'}; +static const png_byte mng_MEND[5]={ 77, 69, 78, 68, (png_byte) '\0'}; +static const png_byte mng_MOVE[5]={ 77, 79, 86, 69, (png_byte) '\0'}; +static const png_byte mng_PAST[5]={ 80, 65, 83, 84, (png_byte) '\0'}; +static const png_byte mng_PLTE[5]={ 80, 76, 84, 69, (png_byte) '\0'}; +static const png_byte mng_SAVE[5]={ 83, 65, 86, 69, (png_byte) '\0'}; +static const png_byte mng_SEEK[5]={ 83, 69, 69, 75, (png_byte) '\0'}; +static const png_byte mng_SHOW[5]={ 83, 72, 79, 87, (png_byte) '\0'}; +static const png_byte mng_TERM[5]={ 84, 69, 82, 77, (png_byte) '\0'}; +static const png_byte mng_bKGD[5]={ 98, 75, 71, 68, (png_byte) '\0'}; +static const png_byte mng_caNv[5]={ 99, 97, 78, 118, (png_byte) '\0'}; +static const png_byte mng_cHRM[5]={ 99, 72, 82, 77, (png_byte) '\0'}; +static const png_byte mng_eXIf[5]={101, 88, 73, 102, (png_byte) '\0'}; +static const png_byte mng_gAMA[5]={103, 65, 77, 65, (png_byte) '\0'}; +static const png_byte mng_iCCP[5]={105, 67, 67, 80, (png_byte) '\0'}; +static const png_byte mng_nEED[5]={110, 69, 69, 68, (png_byte) '\0'}; +static const png_byte mng_pHYg[5]={112, 72, 89, 103, (png_byte) '\0'}; +static const png_byte mng_vpAg[5]={118, 112, 65, 103, (png_byte) '\0'}; +static const png_byte mng_pHYs[5]={112, 72, 89, 115, (png_byte) '\0'}; +static const png_byte mng_sBIT[5]={115, 66, 73, 84, (png_byte) '\0'}; +static const png_byte mng_sRGB[5]={115, 82, 71, 66, (png_byte) '\0'}; +static const png_byte mng_tRNS[5]={116, 82, 78, 83, (png_byte) '\0'}; + +#if defined(JNG_SUPPORTED) +static const png_byte mng_IDAT[5]={ 73, 68, 65, 84, (png_byte) '\0'}; +static const png_byte mng_JDAT[5]={ 74, 68, 65, 84, (png_byte) '\0'}; +static const png_byte mng_JDAA[5]={ 74, 68, 65, 65, (png_byte) '\0'}; +static const png_byte mng_JdAA[5]={ 74, 100, 65, 65, (png_byte) '\0'}; +static const png_byte mng_JSEP[5]={ 74, 83, 69, 80, (png_byte) '\0'}; +static const png_byte mng_oFFs[5]={111, 70, 70, 115, (png_byte) '\0'}; +#endif + +#if 0 +/* Other known chunks that are not yet supported by ImageMagick: */ +static const png_byte mng_hIST[5]={104, 73, 83, 84, (png_byte) '\0'}; +static const png_byte mng_iTXt[5]={105, 84, 88, 116, (png_byte) '\0'}; +static const png_byte mng_sPLT[5]={115, 80, 76, 84, (png_byte) '\0'}; +static const png_byte mng_sTER[5]={115, 84, 69, 82, (png_byte) '\0'}; +static const png_byte mng_tEXt[5]={116, 69, 88, 116, (png_byte) '\0'}; +static const png_byte mng_tIME[5]={116, 73, 77, 69, (png_byte) '\0'}; +static const png_byte mng_zTXt[5]={122, 84, 88, 116, (png_byte) '\0'}; +#endif + +typedef struct _MngBox +{ + long + left, + right, + top, + bottom; +} MngBox; + +typedef struct _MngPair +{ + volatile long + a, + b; +} MngPair; + +#ifdef MNG_OBJECT_BUFFERS +typedef struct _MngBuffer +{ + + size_t + height, + width; + + Image + *image; + + png_color + plte[256]; + + int + reference_count; + + unsigned char + alpha_sample_depth, + compression_method, + color_type, + concrete, + filter_method, + frozen, + image_type, + interlace_method, + pixel_sample_depth, + plte_length, + sample_depth, + viewable; +} MngBuffer; +#endif + +typedef struct _MngInfo +{ + +#ifdef MNG_OBJECT_BUFFERS + MngBuffer + *ob[MNG_MAX_OBJECTS]; +#endif + + Image * + image; + + RectangleInfo + page; + + int + adjoin, +#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED + bytes_in_read_buffer, + found_empty_plte, +#endif + equal_backgrounds, + equal_chrms, + equal_gammas, +#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_MNG_FEATURES_SUPPORTED) + equal_palettes, +#endif + equal_physs, + equal_srgbs, + framing_mode, + have_global_bkgd, + have_global_chrm, + have_global_gama, + have_global_phys, + have_global_sbit, + have_global_srgb, + have_saved_bkgd_index, + have_write_global_chrm, + have_write_global_gama, + have_write_global_plte, + have_write_global_srgb, + need_fram, + object_id, + old_framing_mode, + saved_bkgd_index; + + int + new_number_colors; + + ssize_t + image_found, + loop_count[256], + loop_iteration[256], + scenes_found, + x_off[MNG_MAX_OBJECTS], + y_off[MNG_MAX_OBJECTS]; + + MngBox + clip, + frame, + image_box, + object_clip[MNG_MAX_OBJECTS]; + + unsigned char + /* These flags could be combined into one byte */ + exists[MNG_MAX_OBJECTS], + frozen[MNG_MAX_OBJECTS], + loop_active[256], + invisible[MNG_MAX_OBJECTS], + viewable[MNG_MAX_OBJECTS]; + + MagickOffsetType + loop_jump[256]; + + png_colorp + global_plte; + + png_color_8 + global_sbit; + + png_byte +#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED + read_buffer[8], +#endif + global_trns[256]; + + float + global_gamma; + + ChromaticityInfo + global_chrm; + + RenderingIntent + global_srgb_intent; + + unsigned long + delay, + global_plte_length, + global_trns_length, + global_x_pixels_per_unit, + global_y_pixels_per_unit, + mng_width, + mng_height, + ticks_per_second; + + MagickBooleanType + need_blob; + + unsigned int + IsPalette, + global_phys_unit_type, + basi_warning, + clon_warning, + dhdr_warning, + jhdr_warning, + magn_warning, + past_warning, + phyg_warning, + phys_warning, + sbit_warning, + show_warning, + mng_type, + write_mng, + write_png_colortype, + write_png_depth, + write_png_compression_level, + write_png_compression_strategy, + write_png_compression_filter, + write_png8, + write_png24, + write_png32, + write_png48, + write_png64; + +#ifdef MNG_BASI_SUPPORTED + unsigned long + basi_width, + basi_height; + + unsigned int + basi_depth, + basi_color_type, + basi_compression_method, + basi_filter_type, + basi_interlace_method, + basi_red, + basi_green, + basi_blue, + basi_alpha, + basi_viewable; +#endif + + png_uint_16 + magn_first, + magn_last, + magn_mb, + magn_ml, + magn_mr, + magn_mt, + magn_mx, + magn_my, + magn_methx, + magn_methy; + + PixelPacket + mng_global_bkgd; + + /* Added at version 6.6.6-7 */ + MagickBooleanType + ping_exclude_bKGD, + ping_exclude_cHRM, + ping_exclude_date, + ping_exclude_eXIf, + ping_exclude_EXIF, + ping_exclude_gAMA, + ping_exclude_iCCP, + /* ping_exclude_iTXt, */ + ping_exclude_oFFs, + ping_exclude_pHYs, + ping_exclude_sRGB, + ping_exclude_tEXt, + ping_exclude_tRNS, + ping_exclude_caNv, + ping_exclude_zCCP, /* hex-encoded iCCP */ + ping_exclude_zTXt, + ping_preserve_colormap, + /* Added at version 6.8.5-7 */ + ping_preserve_iCCP, + /* Added at version 6.8.9-9 */ + ping_exclude_tIME; + +} MngInfo; +#endif /* VER */ + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePNGImage(const ImageInfo *,Image *); + +static MagickBooleanType + WriteMNGImage(const ImageInfo *,Image *); + +#if defined(JNG_SUPPORTED) +static MagickBooleanType + WriteJNGImage(const ImageInfo *,Image *); +#endif + +#if PNG_LIBPNG_VER > 10011 + + +#if (MAGICKCORE_QUANTUM_DEPTH >= 16) +static MagickBooleanType +LosslessReduceDepthOK(Image *image) +{ + /* Reduce bit depth if it can be reduced losslessly from 16+ to 8. + * + * This is true if the high byte and the next highest byte of + * each sample of the image, the colormap, and the background color + * are equal to each other. We check this by seeing if the samples + * are unchanged when we scale them down to 8 and back up to Quantum. + * + * We don't use the method GetImageDepth() because it doesn't check + * background and doesn't handle PseudoClass specially. + */ + +#define QuantumToCharToQuantumEqQuantum(quantum) \ + ((ScaleCharToQuantum((unsigned char) ScaleQuantumToChar(quantum))) == quantum) + + MagickBooleanType + ok_to_reduce=MagickFalse; + + if (image->depth >= 16) + { + + const PixelPacket + *p; + + ok_to_reduce= + QuantumToCharToQuantumEqQuantum(image->background_color.red) && + QuantumToCharToQuantumEqQuantum(image->background_color.green) && + QuantumToCharToQuantumEqQuantum(image->background_color.blue) ? + MagickTrue : MagickFalse; + + if (ok_to_reduce != MagickFalse && image->storage_class == PseudoClass) + { + int indx; + + for (indx=0; indx < (ssize_t) image->colors; indx++) + { + ok_to_reduce=( + QuantumToCharToQuantumEqQuantum( + image->colormap[indx].red) && + QuantumToCharToQuantumEqQuantum( + image->colormap[indx].green) && + QuantumToCharToQuantumEqQuantum( + image->colormap[indx].blue)) ? + MagickTrue : MagickFalse; + + if (ok_to_reduce == MagickFalse) + break; + } + } + + if ((ok_to_reduce != MagickFalse) && + (image->storage_class != PseudoClass)) + { + ssize_t + y; + + ssize_t + x; + + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + + if (p == (const PixelPacket *) NULL) + { + ok_to_reduce = MagickFalse; + break; + } + + for (x=(ssize_t) image->columns-1; x >= 0; x--) + { + ok_to_reduce= + QuantumToCharToQuantumEqQuantum(GetPixelRed(p)) && + QuantumToCharToQuantumEqQuantum(GetPixelGreen(p)) && + QuantumToCharToQuantumEqQuantum(GetPixelBlue(p)) ? + MagickTrue : MagickFalse; + + if (ok_to_reduce == MagickFalse) + break; + + p++; + } + if (x >= 0) + break; + } + } + + if (ok_to_reduce != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " OK to reduce PNG bit depth to 8 without loss of info"); + } + else + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Not OK to reduce PNG bit depth to 8 without loss of info"); + } + } + + return ok_to_reduce; +} +#endif /* MAGICKCORE_QUANTUM_DEPTH >= 16 */ + +static const char *PngColorTypeToString(const unsigned int color_type) +{ + const char + *result = "Unknown"; + + switch (color_type) + { + case PNG_COLOR_TYPE_GRAY: + result = "Gray"; + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + result = "Gray+Alpha"; + break; + case PNG_COLOR_TYPE_PALETTE: + result = "Palette"; + break; + case PNG_COLOR_TYPE_RGB: + result = "RGB"; + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + result = "RGB+Alpha"; + break; + } + + return result; +} + +static int +Magick_RenderingIntent_to_PNG_RenderingIntent(const RenderingIntent intent) +{ + switch (intent) + { + case PerceptualIntent: + return 0; + + case RelativeIntent: + return 1; + + case SaturationIntent: + return 2; + + case AbsoluteIntent: + return 3; + + default: + return -1; + } +} + +static RenderingIntent +Magick_RenderingIntent_from_PNG_RenderingIntent(const int ping_intent) +{ + switch (ping_intent) + { + case 0: + return PerceptualIntent; + + case 1: + return RelativeIntent; + + case 2: + return SaturationIntent; + + case 3: + return AbsoluteIntent; + + default: + return UndefinedIntent; + } +} + +static const char * +Magick_RenderingIntentString_from_PNG_RenderingIntent(const int ping_intent) +{ + switch (ping_intent) + { + case 0: + return "Perceptual Intent"; + + case 1: + return "Relative Intent"; + + case 2: + return "Saturation Intent"; + + case 3: + return "Absolute Intent"; + + default: + return "Undefined Intent"; + } +} + + +static const char * +Magick_ColorType_from_PNG_ColorType(const int ping_colortype) +{ + switch (ping_colortype) + { + case 0: + return "Grayscale"; + + case 2: + return "Truecolor"; + + case 3: + return "Indexed"; + + case 4: + return "GrayAlpha"; + + case 6: + return "RGBA"; + + default: + return "UndefinedColorType"; + } +} + +#endif /* PNG_LIBPNG_VER > 10011 */ +#endif /* MAGICKCORE_PNG_DELEGATE */ + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s M N G % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsMNG() returns MagickTrue if the image format type, identified by the +% magick string, is MNG. +% +% The format of the IsMNG method is: +% +% MagickBooleanType IsMNG(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +% +*/ +static MagickBooleanType IsMNG(const unsigned char *magick,const size_t length) +{ + if (length < 8) + return(MagickFalse); + + if (memcmp(magick,"\212MNG\r\n\032\n",8) == 0) + return(MagickTrue); + + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s J N G % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsJNG() returns MagickTrue if the image format type, identified by the +% magick string, is JNG. +% +% The format of the IsJNG method is: +% +% MagickBooleanType IsJNG(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +% +*/ +static MagickBooleanType IsJNG(const unsigned char *magick,const size_t length) +{ + if (length < 8) + return(MagickFalse); + + if (memcmp(magick,"\213JNG\r\n\032\n",8) == 0) + return(MagickTrue); + + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P N G % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPNG() returns MagickTrue if the image format type, identified by the +% magick string, is PNG. +% +% The format of the IsPNG method is: +% +% MagickBooleanType IsPNG(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsPNG(const unsigned char *magick,const size_t length) +{ + if (length < 8) + return(MagickFalse); + + if (memcmp(magick,"\211PNG\r\n\032\n",8) == 0) + return(MagickTrue); + + return(MagickFalse); +} + +#if defined(MAGICKCORE_PNG_DELEGATE) +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (PNG_LIBPNG_VER > 10011) +static size_t WriteBlobMSBULong(Image *image,const size_t value) +{ + unsigned char + buffer[4]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + buffer[0]=(unsigned char) (value >> 24); + buffer[1]=(unsigned char) (value >> 16); + buffer[2]=(unsigned char) (value >> 8); + buffer[3]=(unsigned char) value; + return((size_t) WriteBlob(image,4,buffer)); +} + +static void PNGLong(png_bytep p,png_uint_32 value) +{ + *p++=(png_byte) ((value >> 24) & 0xff); + *p++=(png_byte) ((value >> 16) & 0xff); + *p++=(png_byte) ((value >> 8) & 0xff); + *p++=(png_byte) (value & 0xff); +} + +static void PNGsLong(png_bytep p,png_int_32 value) +{ + *p++=(png_byte) ((value >> 24) & 0xff); + *p++=(png_byte) ((value >> 16) & 0xff); + *p++=(png_byte) ((value >> 8) & 0xff); + *p++=(png_byte) (value & 0xff); +} + +static void PNGShort(png_bytep p,png_uint_16 value) +{ + *p++=(png_byte) ((value >> 8) & 0xff); + *p++=(png_byte) (value & 0xff); +} + +static void PNGType(png_bytep p,const png_byte *type) +{ + (void) memcpy(p,type,4*sizeof(png_byte)); +} + +static void LogPNGChunk(MagickBooleanType logging, const png_byte *type, + size_t length) +{ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing %c%c%c%c chunk, length: %.20g", + type[0],type[1],type[2],type[3],(double) length); +} +#endif /* PNG_LIBPNG_VER > 10011 */ + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#if PNG_LIBPNG_VER > 10011 +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPNGImage() reads a Portable Network Graphics (PNG) or +% Multiple-image Network Graphics (MNG) image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image or set of images. +% +% MNG support written by Glenn Randers-Pehrson, glennrp@image... +% +% The format of the ReadPNGImage method is: +% +% Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +% To do, more or less in chronological order (as of version 5.5.2, +% November 26, 2002 -- glennrp -- see also "To do" under WriteMNGImage): +% +% Get 16-bit cheap transparency working. +% +% (At this point, PNG decoding is supposed to be in full MNG-LC compliance) +% +% Preserve all unknown and not-yet-handled known chunks found in input +% PNG file and copy them into output PNG files according to the PNG +% copying rules. +% +% (At this point, PNG encoding should be in full MNG compliance) +% +% Provide options for choice of background to use when the MNG BACK +% chunk is not present or is not mandatory (i.e., leave transparent, +% user specified, MNG BACK, PNG bKGD) +% +% Implement LOOP/ENDL [done, but could do discretionary loops more +% efficiently by linking in the duplicate frames.]. +% +% Decode and act on the MHDR simplicity profile (offer option to reject +% files or attempt to process them anyway when the profile isn't LC or VLC). +% +% Upgrade to full MNG without Delta-PNG. +% +% o BACK [done a while ago except for background image ID] +% o MOVE [done 15 May 1999] +% o CLIP [done 15 May 1999] +% o DISC [done 19 May 1999] +% o SAVE [partially done 19 May 1999 (marks objects frozen)] +% o SEEK [partially done 19 May 1999 (discard function only)] +% o SHOW +% o PAST +% o BASI +% o MNG-level tEXt/iTXt/zTXt +% o pHYg +% o pHYs +% o sBIT +% o bKGD +% o iTXt (wait for libpng implementation). +% +% Use the scene signature to discover when an identical scene is +% being reused, and just point to the original image->exception instead +% of storing another set of pixels. This not specific to MNG +% but could be applied generally. +% +% Upgrade to full MNG with Delta-PNG. +% +% JNG tEXt/iTXt/zTXt +% +% We will not attempt to read files containing the CgBI chunk. +% They are really Xcode files meant for display on the iPhone. +% These are not valid PNG files and it is impossible to recover +% the original PNG from files that have been converted to Xcode-PNG, +% since irretrievable loss of color data has occurred due to the +% use of premultiplied alpha. +*/ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +/* + This the function that does the actual reading of data. It is + the same as the one supplied in libpng, except that it receives the + datastream from the ReadBlob() function instead of standard input. +*/ +static void png_get_data(png_structp png_ptr,png_bytep data,png_size_t length) +{ + Image + *image; + + image=(Image *) png_get_io_ptr(png_ptr); + if (length != 0) + { + png_size_t + check; + + check=(png_size_t) ReadBlob(image,(size_t) length,data); + if (check != length) + { + char + msg[MaxTextExtent]; + + if (check < length) + (void) memset(data+check,0,length-check); + (void) FormatLocaleString(msg,MaxTextExtent, + "Expected %.20g bytes; found %.20g bytes",(double) length, + (double) check); + png_warning(png_ptr,msg); + png_error(png_ptr,"Read Exception"); + } + } +} + +#if !defined(PNG_READ_EMPTY_PLTE_SUPPORTED) && \ + !defined(PNG_MNG_FEATURES_SUPPORTED) +/* We use mng_get_data() instead of png_get_data() if we have a libpng + * older than libpng-1.0.3a, which was the first to allow the empty + * PLTE, or a newer libpng in which PNG_MNG_FEATURES_SUPPORTED was + * ifdef'ed out. Earlier versions would crash if the bKGD chunk was + * encountered after an empty PLTE, so we have to look ahead for bKGD + * chunks and remove them from the datastream that is passed to libpng, + * and store their contents for later use. + */ +static void mng_get_data(png_structp png_ptr,png_bytep data,png_size_t length) +{ + MngInfo + *mng_info; + + Image + *image; + + png_size_t + check; + + ssize_t + i; + + i=0; + mng_info=(MngInfo *) png_get_io_ptr(png_ptr); + image=(Image *) mng_info->image; + while (mng_info->bytes_in_read_buffer && length) + { + data[i]=mng_info->read_buffer[i]; + mng_info->bytes_in_read_buffer--; + length--; + i++; + } + if (length != 0) + { + check=(png_size_t) ReadBlob(image,(size_t) length,(char *) data); + + if (check != length) + png_error(png_ptr,"Read Exception"); + + if (length == 4) + { + if ((data[0] == 0) && (data[1] == 0) && (data[2] == 0) && + (data[3] == 0)) + { + check=(png_size_t) ReadBlob(image,(size_t) length, + (char *) mng_info->read_buffer); + mng_info->read_buffer[4]=0; + mng_info->bytes_in_read_buffer=4; + if (memcmp(mng_info->read_buffer,mng_PLTE,4) == 0) + mng_info->found_empty_plte=MagickTrue; + if (memcmp(mng_info->read_buffer,mng_IEND,4) == 0) + { + mng_info->found_empty_plte=MagickFalse; + mng_info->have_saved_bkgd_index=MagickFalse; + } + } + + if ((data[0] == 0) && (data[1] == 0) && (data[2] == 0) && + (data[3] == 1)) + { + check=(png_size_t) ReadBlob(image,(size_t) length, + (char *) mng_info->read_buffer); + mng_info->read_buffer[4]=0; + mng_info->bytes_in_read_buffer=4; + if (memcmp(mng_info->read_buffer,mng_bKGD,4) == 0) + if (mng_info->found_empty_plte) + { + /* + Skip the bKGD data byte and CRC. + */ + check=(png_size_t) + ReadBlob(image,5,(char *) mng_info->read_buffer); + check=(png_size_t) ReadBlob(image,(size_t) length, + (char *) mng_info->read_buffer); + mng_info->saved_bkgd_index=mng_info->read_buffer[0]; + mng_info->have_saved_bkgd_index=MagickTrue; + mng_info->bytes_in_read_buffer=0; + } + } + } + } +} +#endif + +static void png_put_data(png_structp png_ptr,png_bytep data,png_size_t length) +{ + Image + *image; + + image=(Image *) png_get_io_ptr(png_ptr); + if (length != 0) + { + png_size_t + check; + + check=(png_size_t) WriteBlob(image,(size_t) length,data); + + if (check != length) + png_error(png_ptr,"WriteBlob Failed"); + } +} + +static void png_flush_data(png_structp png_ptr) +{ + (void) png_ptr; +} + +#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED +static int PalettesAreEqual(Image *a,Image *b) +{ + ssize_t + i; + + if ((a == (Image *) NULL) || (b == (Image *) NULL)) + return((int) MagickFalse); + + if (a->storage_class != PseudoClass || b->storage_class != PseudoClass) + return((int) MagickFalse); + + if (a->colors != b->colors) + return((int) MagickFalse); + + for (i=0; i < (ssize_t) a->colors; i++) + { + if ((a->colormap[i].red != b->colormap[i].red) || + (a->colormap[i].green != b->colormap[i].green) || + (a->colormap[i].blue != b->colormap[i].blue)) + return((int) MagickFalse); + } + + return((int) MagickTrue); +} +#endif + +static void MngInfoDiscardObject(MngInfo *mng_info,int i) +{ + if (i && (i < MNG_MAX_OBJECTS) && (mng_info != (MngInfo *) NULL) && + mng_info->exists[i] && !mng_info->frozen[i]) + { +#ifdef MNG_OBJECT_BUFFERS + if (mng_info->ob[i] != (MngBuffer *) NULL) + { + if (mng_info->ob[i]->reference_count > 0) + mng_info->ob[i]->reference_count--; + + if (mng_info->ob[i]->reference_count == 0) + { + if (mng_info->ob[i]->image != (Image *) NULL) + mng_info->ob[i]->image=DestroyImage(mng_info->ob[i]->image); + + mng_info->ob[i]=DestroyString(mng_info->ob[i]); + } + } + mng_info->ob[i]=(MngBuffer *) NULL; +#endif + mng_info->exists[i]=MagickFalse; + mng_info->invisible[i]=MagickFalse; + mng_info->viewable[i]=MagickFalse; + mng_info->frozen[i]=MagickFalse; + mng_info->x_off[i]=0; + mng_info->y_off[i]=0; + mng_info->object_clip[i].left=0; + mng_info->object_clip[i].right=(ssize_t) PNG_UINT_31_MAX; + mng_info->object_clip[i].top=0; + mng_info->object_clip[i].bottom=(ssize_t) PNG_UINT_31_MAX; + } +} + +static MngInfo *MngInfoFreeStruct(MngInfo *mng_info) +{ + ssize_t + i; + + if (mng_info == (MngInfo *) NULL) + return((MngInfo *) NULL); + + for (i=1; i < MNG_MAX_OBJECTS; i++) + MngInfoDiscardObject(mng_info,i); + + mng_info->global_plte=(png_colorp) + RelinquishMagickMemory(mng_info->global_plte); + + return((MngInfo *) RelinquishMagickMemory(mng_info)); +} + +static long mng_get_long(unsigned char *p) +{ + return ((long) (((png_uint_32) p[0] << 24) | ((png_uint_32) p[1] << 16) | + ((png_uint_32) p[2] << 8) | (png_uint_32) p[3])); +} + +static MngBox mng_minimum_box(MngBox box1,MngBox box2) +{ + MngBox + box; + + box=box1; + if (box.left < box2.left) + box.left=box2.left; + + if (box.top < box2.top) + box.top=box2.top; + + if (box.right > box2.right) + box.right=box2.right; + + if (box.bottom > box2.bottom) + box.bottom=box2.bottom; + + return box; +} + +static MngBox mng_read_box(MngBox previous_box,char delta_type,unsigned char *p) +{ + MngBox + box; + + /* + Read clipping boundaries from DEFI, CLIP, FRAM, or PAST chunk. + */ + box.left=mng_get_long(p); + box.right=mng_get_long(&p[4]); + box.top=mng_get_long(&p[8]); + box.bottom=mng_get_long(&p[12]); + if (delta_type != 0) + { + box.left+=previous_box.left; + box.right+=previous_box.right; + box.top+=previous_box.top; + box.bottom+=previous_box.bottom; + } + + return(box); +} + +static MngPair mng_read_pair(MngPair previous_pair,int delta_type, + unsigned char *p) +{ + MngPair + pair; + + /* + Read two ssize_t's from CLON, MOVE or PAST chunk + */ + pair.a=mng_get_long(p); + pair.b=mng_get_long(&p[4]); + if (delta_type != 0) + { + pair.a+=previous_pair.a; + pair.b+=previous_pair.b; + } + + return(pair); +} + +typedef struct _PNGErrorInfo +{ + Image + *image; + + ExceptionInfo + *exception; +} PNGErrorInfo; + +static void MagickPNGErrorHandler(png_struct *ping,png_const_charp message) +{ + Image + *image; + + image=(Image *) png_get_error_ptr(ping); + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " libpng-%s error: %s", PNG_LIBPNG_VER_STRING,message); + + (void) ThrowMagickException(&image->exception,GetMagickModule(),CoderError, + message,"`%s'",image->filename); + +#if (PNG_LIBPNG_VER < 10500) + /* A warning about deprecated use of jmpbuf here is unavoidable if you + * are building with libpng-1.4.x and can be ignored. + */ + longjmp(ping->jmpbuf,1); +#else + png_longjmp(ping,1); +#endif +} + +static void MagickPNGWarningHandler(png_struct *ping,png_const_charp message) +{ + Image + *image; + + if (LocaleCompare(message, "Missing PLTE before tRNS") == 0) + png_error(ping, message); + + image=(Image *) png_get_error_ptr(ping); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " libpng-%s warning: %s", PNG_LIBPNG_VER_STRING,message); + + (void) ThrowMagickException(&image->exception,GetMagickModule(),CoderWarning, + message,"`%s'",image->filename); +} + + +#ifdef PNG_USER_MEM_SUPPORTED +#if PNG_LIBPNG_VER >= 10400 +static png_voidp Magick_png_malloc(png_structp png_ptr,png_alloc_size_t size) +#else +static png_voidp Magick_png_malloc(png_structp png_ptr,png_size_t size) +#endif +{ + (void) png_ptr; + return((png_voidp) AcquireQuantumMemory(1,(size_t) size)); +} + +/* + Free a pointer. It is removed from the list at the same time. +*/ +static png_free_ptr Magick_png_free(png_structp png_ptr,png_voidp ptr) +{ + (void) png_ptr; + ptr=RelinquishMagickMemory(ptr); + return((png_free_ptr) NULL); +} +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +static int +Magick_png_read_raw_profile(png_struct *ping,Image *image, + const ImageInfo *image_info, png_textp text,int ii) +{ + png_charp + ep; + + ssize_t + i; + + unsigned char + *dp; + + png_charp + sp; + + size_t + extent, + nibbles; + + ssize_t + length; + + StringInfo + *profile; + + static const unsigned char + unhex[103]={0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,1, 2,3,4,5,6,7,8,9,0,0, + 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,10,11,12, + 13,14,15}; + + sp=text[ii].text+1; + extent=text[ii].text_length; + ep=text[ii].text+extent; + if (ep <= sp) + { + png_warning(ping,"invalid profile length"); + return(MagickFalse); + } + /* look for newline */ + while ((*sp != '\n') && extent--) + sp++; + + /* look for length */ + while (((*sp == '\0' || *sp == ' ' || *sp == '\n')) && extent--) + sp++; + + if (extent == 0) + { + png_warning(ping,"missing profile length"); + return(MagickFalse); + } + + length=StringToLong(sp); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " length: %lu",(unsigned long) length); + + while ((*sp != ' ' && *sp != '\n') && extent--) + sp++; + + if (extent == 0) + { + png_warning(ping,"invalid profile length"); + return(MagickFalse); + } + + /* allocate space */ + if (length == 0) + { + png_warning(ping,"invalid profile length"); + return(MagickFalse); + } + + profile=BlobToStringInfo((const void *) NULL,length); + + if (profile == (StringInfo *) NULL) + { + png_warning(ping, "unable to copy profile"); + return(MagickFalse); + } + + /* copy profile, skipping white space and column 1 "=" signs */ + dp=GetStringInfoDatum(profile); + nibbles=length*2; + + for (i=0; i < (ssize_t) nibbles; i++) + { + while (*sp < '0' || (*sp > '9' && *sp < 'a') || *sp > 'f') + { + if (*sp == '\0') + { + png_warning(ping, "ran out of profile data"); + return(MagickFalse); + } + sp++; + } + + if (i%2 == 0) + *dp=(unsigned char) (16*unhex[(int) *sp++]); + + else + (*dp++)+=unhex[(int) *sp++]; + } + /* + We have already read "Raw profile type. + */ + (void) SetImageProfile(image,&text[ii].key[17],profile); + profile=DestroyStringInfo(profile); + + if (image_info->verbose) + (void) printf(" Found a generic profile, type %s\n",&text[ii].key[17]); + + return MagickTrue; +} + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +static int read_user_chunk_callback(png_struct *ping, png_unknown_chunkp chunk) +{ + Image + *image; + + + /* The unknown chunk structure contains the chunk data: + png_byte name[5]; + png_byte *data; + png_size_t size; + + Note that libpng has already taken care of the CRC handling. + */ + + LogMagickEvent(CoderEvent,GetMagickModule(), + " read_user_chunk: found %c%c%c%c chunk", + chunk->name[0],chunk->name[1],chunk->name[2],chunk->name[3]); + + if (chunk->name[0] == 101 && + (chunk->name[1] == 88 || chunk->name[1] == 120 ) && + chunk->name[2] == 73 && + chunk-> name[3] == 102) + { + /* process eXIf or exIf chunk */ + + PNGErrorInfo + *error_info; + + StringInfo + *profile; + + unsigned char + *p; + + png_byte + *s; + + int + i; + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " recognized eXIf chunk"); + + image=(Image *) png_get_user_chunk_ptr(ping); + + error_info=(PNGErrorInfo *) png_get_error_ptr(ping); + + profile=BlobToStringInfo((const void *) NULL,chunk->size+6); + if (profile == (StringInfo *) NULL) + { + (void) ThrowMagickException(error_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(-1); + } + p=GetStringInfoDatum(profile); + + /* Initialize profile with "Exif\0\0" */ + *p++ ='E'; + *p++ ='x'; + *p++ ='i'; + *p++ ='f'; + *p++ ='\0'; + *p++ ='\0'; + + s=chunk->data; + i=0; + if (chunk->size > 6) + { + /* Skip first 6 bytes if "Exif\0\0" is + already present by accident + */ + if (s[0] == 'E' && s[1] == 'x' && s[2] == 'i' && + s[3] == 'f' && s[4] == '\0' && s[5] == '\0') + { + s+=6; + i=6; + SetStringInfoLength(profile,chunk->size); + p=GetStringInfoDatum(profile); + } + } + + /* copy chunk->data to profile */ + for (; i < (ssize_t) chunk->size; i++) + *p++ = *s++; + + (void) SetImageProfile(image,"exif",profile); + + return(1); + } + + /* vpAg (deprecated, replaced by caNv) */ + if (chunk->name[0] == 118 && + chunk->name[1] == 112 && + chunk->name[2] == 65 && + chunk->name[3] == 103) + { + /* recognized vpAg */ + + if (chunk->size != 9) + return(-1); /* Error return */ + + if (chunk->data[8] != 0) + return(0); /* ImageMagick requires pixel units */ + + image=(Image *) png_get_user_chunk_ptr(ping); + + image->page.width=(size_t)mng_get_long(chunk->data); + image->page.height=(size_t)mng_get_long(&chunk->data[4]); + + return(1); + } + + /* caNv */ + if (chunk->name[0] == 99 && + chunk->name[1] == 97 && + chunk->name[2] == 78 && + chunk->name[3] == 118) + { + /* recognized caNv */ + + if (chunk->size != 16) + return(-1); /* Error return */ + + image=(Image *) png_get_user_chunk_ptr(ping); + + image->page.width=(size_t) mng_get_long(chunk->data); + image->page.height=(size_t) mng_get_long(&chunk->data[4]); + image->page.x=(ssize_t) ((int) mng_get_long(&chunk->data[8])); + image->page.y=(ssize_t) ((int) mng_get_long(&chunk->data[12])); + + /* Return one of the following: */ + /* return(-n); chunk had an error */ + /* return(0); did not recognize */ + /* return(n); success */ + + return(1); + } + + return(0); /* Did not recognize */ +} +#endif + +#if defined(PNG_tIME_SUPPORTED) +static void read_tIME_chunk(Image *image,png_struct *ping,png_info *info) +{ + png_timep + time; + + if (png_get_tIME(ping,info,&time)) + { + char + timestamp[21]; + + FormatLocaleString(timestamp,21,"%04d-%02d-%02dT%02d:%02d:%02dZ", + time->year,time->month,time->day,time->hour,time->minute,time->second); + SetImageProperty(image,"png:tIME",timestamp); + } +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d O n e P N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadOnePNGImage() reads a Portable Network Graphics (PNG) image file +% (minus the 8-byte signature) and returns it. It allocates the memory +% necessary for the new Image structure and returns a pointer to the new +% image. +% +% The format of the ReadOnePNGImage method is: +% +% Image *ReadOnePNGImage(MngInfo *mng_info, const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o mng_info: Specifies a pointer to a MngInfo structure. +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadOnePNGImage(MngInfo *mng_info, + const ImageInfo *image_info, ExceptionInfo *exception) +{ + /* Read one PNG image */ + + /* To do: Read the tEXt/Creation Time chunk into the date:create property */ + + Image + *image; + + int + intent, /* "PNG Rendering intent", which is ICC intent + 1 */ + num_raw_profiles, + num_text, + num_text_total, + num_passes, + number_colors = 0, + pass, + ping_bit_depth = 0, + ping_color_type = 0, + ping_file_depth = 0, + ping_interlace_method = 0, + ping_compression_method = 0, + ping_filter_method = 0, + ping_num_trans = 0, + unit_type = 0; + + double + file_gamma; + + LongPixelPacket + transparent_color; + + IndexPacket + *indexes; + + MagickBooleanType + logging, + ping_found_cHRM, + ping_found_gAMA, + ping_found_iCCP, + ping_found_sRGB, + ping_found_sRGB_cHRM, + ping_preserve_iCCP, + status; + + MemoryInfo + *volatile pixel_info; + + png_bytep + ping_trans_alpha = NULL; + + png_color_16p + ping_background = (png_color_16p) NULL, + ping_trans_color = (png_color_16p) NULL; + + png_info + *end_info, + *ping_info; + + png_struct + *ping; + + png_textp + text; + + png_uint_32 + ping_height = 0, + ping_width = 0, + x_resolution, + y_resolution; + + PixelPacket + *q; + + Quantum + *volatile quantum_scanline; + + QuantumInfo + *volatile quantum_info; + + size_t + length, + ping_rowbytes = 0, + row_offset, + y; + + ssize_t + i, + j, + x; + + unsigned char + *p, + *ping_pixels; + +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED + png_byte unused_chunks[]= + { + 104, 73, 83, 84, (png_byte) '\0', /* hIST */ + 105, 84, 88, 116, (png_byte) '\0', /* iTXt */ + 112, 67, 65, 76, (png_byte) '\0', /* pCAL */ + 115, 67, 65, 76, (png_byte) '\0', /* sCAL */ + 115, 80, 76, 84, (png_byte) '\0', /* sPLT */ +#if !defined(PNG_tIME_SUPPORTED) + 116, 73, 77, 69, (png_byte) '\0', /* tIME */ +#endif +#ifdef PNG_APNG_SUPPORTED /* libpng was built with APNG patch; */ + /* ignore the APNG chunks */ + 97, 99, 84, 76, (png_byte) '\0', /* acTL */ + 102, 99, 84, 76, (png_byte) '\0', /* fcTL */ + 102, 100, 65, 84, (png_byte) '\0', /* fdAT */ +#endif + }; +#endif + + logging=IsEventLogging(); + if (logging != MagickFalse) + { + char + im_vers[32], + libpng_runv[32], + libpng_vers[32], + zlib_runv[32], + zlib_vers[32]; + + *im_vers='\0'; + (void) ConcatenateMagickString(im_vers, + MagickLibVersionText,32); + (void) ConcatenateMagickString(im_vers, + MagickLibAddendum,32); + + *libpng_vers='\0'; + (void) ConcatenateMagickString(libpng_vers, + PNG_LIBPNG_VER_STRING,32); + *libpng_runv='\0'; + (void) ConcatenateMagickString(libpng_runv, + png_get_libpng_ver(NULL),32); + + *zlib_vers='\0'; + (void) ConcatenateMagickString(zlib_vers, + ZLIB_VERSION,32); + *zlib_runv='\0'; + (void) ConcatenateMagickString(zlib_runv, + zlib_version,32); + + LogMagickEvent(CoderEvent,GetMagickModule(), + " Enter ReadOnePNGImage()\n" + " IM version = %s\n" + " Libpng version = %s", + im_vers, libpng_vers); + + if (LocaleCompare(libpng_vers,libpng_runv) != 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " running with %s", libpng_runv); + if (LocaleCompare(libpng_vers,zlib_vers) != 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Zlib version = %s", zlib_vers); + if (LocaleCompare(zlib_vers,zlib_runv) != 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " running with %s", zlib_runv); + } + +#if (PNG_LIBPNG_VER < 10200) + if (image_info->verbose) + printf("Your PNG library (libpng-%s) is rather old.\n", + PNG_LIBPNG_VER_STRING); +#endif + +#if (PNG_LIBPNG_VER >= 10400) +# ifndef PNG_TRANSFORM_GRAY_TO_RGB /* Added at libpng-1.4.0beta67 */ + if (image_info->verbose) + { + printf("Your PNG library (libpng-%s) is an old beta version.\n", + PNG_LIBPNG_VER_STRING); + printf("Please update it.\n"); + } +# endif +#endif + + image=mng_info->image; + + if (logging != MagickFalse) + { + (void)LogMagickEvent(CoderEvent,GetMagickModule(), + " Before reading:\n" + " image->matte=%d\n" + " image->rendering_intent=%d\n" + " image->colorspace=%d\n" + " image->gamma=%f", + (int) image->matte, (int) image->rendering_intent, + (int) image->colorspace, image->gamma); + } + intent=Magick_RenderingIntent_to_PNG_RenderingIntent(image->rendering_intent); + + /* Set to an out-of-range color unless tRNS chunk is present */ + transparent_color.red=65537; + transparent_color.green=65537; + transparent_color.blue=65537; + transparent_color.opacity=65537; + + number_colors=0; + num_text = 0; + num_text_total = 0; + num_raw_profiles = 0; + + ping_found_cHRM = MagickFalse; + ping_found_gAMA = MagickFalse; + ping_found_iCCP = MagickFalse; + ping_found_sRGB = MagickFalse; + ping_found_sRGB_cHRM = MagickFalse; + ping_preserve_iCCP = MagickFalse; + + + /* + Allocate the PNG structures + */ +#ifdef PNG_USER_MEM_SUPPORTED + ping=png_create_read_struct_2(PNG_LIBPNG_VER_STRING, image, + MagickPNGErrorHandler,MagickPNGWarningHandler, NULL, + (png_malloc_ptr) Magick_png_malloc,(png_free_ptr) Magick_png_free); +#else + ping=png_create_read_struct(PNG_LIBPNG_VER_STRING,image, + MagickPNGErrorHandler,MagickPNGWarningHandler); +#endif + if (ping == (png_struct *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + + ping_info=png_create_info_struct(ping); + + if (ping_info == (png_info *) NULL) + { + png_destroy_read_struct(&ping,(png_info **) NULL,(png_info **) NULL); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + + end_info=png_create_info_struct(ping); + + if (end_info == (png_info *) NULL) + { + png_destroy_read_struct(&ping,&ping_info,(png_info **) NULL); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + + pixel_info=(MemoryInfo *) NULL; + quantum_scanline = (Quantum *) NULL; + quantum_info = (QuantumInfo *) NULL; + + if (setjmp(png_jmpbuf(ping))) + { + /* + PNG image is corrupt. + */ + png_destroy_read_struct(&ping,&ping_info,&end_info); + + if (pixel_info != (MemoryInfo *) NULL) + pixel_info=RelinquishVirtualMemory(pixel_info); + + quantum_scanline=(Quantum *) RelinquishMagickMemory(quantum_scanline); + + if (quantum_info != (QuantumInfo *) NULL) + quantum_info=DestroyQuantumInfo(quantum_info); + +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + UnlockSemaphoreInfo(ping_semaphore); +#endif + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " exit ReadOnePNGImage() with error."); + + if (image != (Image *) NULL) + image=DestroyImageList(image); + return(image); + } + + /* { For navigation to end of SETJMP-protected block. Within this + * block, use png_error() instead of Throwing an Exception, to ensure + * that libpng is able to clean up, and that the semaphore is unlocked. + */ + +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + LockSemaphoreInfo(ping_semaphore); +#endif + +#ifdef PNG_BENIGN_ERRORS_SUPPORTED + /* Allow benign errors */ + png_set_benign_errors(ping, 1); +#endif + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + { + const char + *option; + + /* Reject images with too many rows or columns */ + png_set_user_limits(ping,(png_uint_32) MagickMin(PNG_UINT_31_MAX, + GetMagickResourceLimit(WidthResource)),(png_uint_32) + MagickMin(PNG_UINT_31_MAX,GetMagickResourceLimit(HeightResource))); + +#if (PNG_LIBPNG_VER >= 10400) + option=GetImageOption(image_info,"png:chunk-cache-max"); + if (option != (const char *) NULL) + png_set_chunk_cache_max(ping,(png_uint_32) MagickMin(PNG_UINT_32_MAX, + StringToLong(option))); + else + png_set_chunk_cache_max(ping,32767); +#endif + +#if (PNG_LIBPNG_VER >= 10401) + option=GetImageOption(image_info,"png:chunk-malloc-max"); + if (option != (const char *) NULL) + png_set_chunk_malloc_max(ping,(png_alloc_size_t) MagickMin((ssize_t) + PNG_SIZE_MAX,StringToLong(option))); + else + png_set_chunk_malloc_max(ping,(png_alloc_size_t) GetMaxMemoryRequest()); +#endif + } +#endif /* PNG_SET_USER_LIMITS_SUPPORTED */ + + /* + Prepare PNG for reading. + */ + + mng_info->image_found++; + png_set_sig_bytes(ping,8); + + if (LocaleCompare(image_info->magick,"MNG") == 0) + { +#if defined(PNG_MNG_FEATURES_SUPPORTED) + (void) png_permit_mng_features(ping,PNG_ALL_MNG_FEATURES); + png_set_read_fn(ping,image,png_get_data); +#else +#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) + png_permit_empty_plte(ping,MagickTrue); + png_set_read_fn(ping,image,png_get_data); +#else + mng_info->image=image; + mng_info->bytes_in_read_buffer=0; + mng_info->found_empty_plte=MagickFalse; + mng_info->have_saved_bkgd_index=MagickFalse; + png_set_read_fn(ping,mng_info,mng_get_data); +#endif +#endif + } + + else + png_set_read_fn(ping,image,png_get_data); + + { + const char + *value; + + value=GetImageOption(image_info,"profile:skip"); + + if (IsOptionMember("ICC",value) == MagickFalse) + { + + value=GetImageOption(image_info,"png:preserve-iCCP"); + + if (value == NULL) + value=GetImageArtifact(image,"png:preserve-iCCP"); + + if (value != NULL) + ping_preserve_iCCP=MagickTrue; + +#if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && defined(PNG_SET_OPTION_SUPPORTED) + /* Don't let libpng check for ICC/sRGB profile because we're going + * to do that anyway. This feature was added at libpng-1.6.12. + * If logging, go ahead and check and issue a warning as appropriate. + */ + if (logging == MagickFalse) + png_set_option(ping, PNG_SKIP_sRGB_CHECK_PROFILE, PNG_OPTION_ON); +#endif + } +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + else + { + /* Ignore the iCCP chunk */ + png_set_keep_unknown_chunks(ping, 1, (png_bytep)mng_iCCP, 1); + } +#endif + } +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + /* Ignore unused chunks and all unknown chunks except for caNv + and vpAg */ +# if PNG_LIBPNG_VER < 10700 /* Avoid libpng16 warning */ + png_set_keep_unknown_chunks(ping, 2, (png_bytep)NULL, 0); +# else + png_set_keep_unknown_chunks(ping, 1, (png_bytep)NULL, 0); +# endif + png_set_keep_unknown_chunks(ping, 2, (png_bytep)mng_caNv, 1); + png_set_keep_unknown_chunks(ping, 2, (png_bytep)mng_vpAg, 1); + png_set_keep_unknown_chunks(ping, 1, unused_chunks, + (int)sizeof(unused_chunks)/5); + /* Callback for other unknown chunks */ + png_set_read_user_chunk_fn(ping, image, read_user_chunk_callback); +#endif + +#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Disable new libpng-1.5.10 feature */ + png_set_check_for_invalid_index (ping, 0); +#endif + +#if (PNG_LIBPNG_VER < 10400) +# if defined(PNG_USE_PNGGCCRD) && defined(PNG_ASSEMBLER_CODE_SUPPORTED) && \ + (PNG_LIBPNG_VER >= 10200) && (PNG_LIBPNG_VER < 10220) && defined(__i386__) + /* Disable thread-unsafe features of pnggccrd */ + if (png_access_version_number() >= 10200) + { + png_uint_32 mmx_disable_mask=0; + png_uint_32 asm_flags; + + mmx_disable_mask |= ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ + | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ + | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ + | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ); + asm_flags=png_get_asm_flags(ping); + png_set_asm_flags(ping, asm_flags & ~mmx_disable_mask); + } +# endif +#endif + + png_read_info(ping,ping_info); + + /* Read and check IHDR chunk data */ + png_get_IHDR(ping,ping_info,&ping_width,&ping_height, + &ping_bit_depth,&ping_color_type, + &ping_interlace_method,&ping_compression_method, + &ping_filter_method); + + ping_file_depth = ping_bit_depth; + + /* Swap bytes if requested */ + if (ping_file_depth == 16) + { + const char + *value; + + value=GetImageOption(image_info,"png:swap-bytes"); + + if (value == NULL) + value=GetImageArtifact(image,"png:swap-bytes"); + + if (value != NULL) + png_set_swap(ping); + } + + /* Save bit-depth and color-type in case we later want to write a PNG00 */ + { + char + msg[MaxTextExtent]; + + (void) FormatLocaleString(msg,MaxTextExtent,"%d",(int) ping_color_type); + (void) SetImageProperty(image,"png:IHDR.color-type-orig",msg); + + (void) FormatLocaleString(msg,MaxTextExtent,"%d",(int) ping_bit_depth); + (void) SetImageProperty(image,"png:IHDR.bit-depth-orig",msg); + } + + (void) png_get_tRNS(ping, ping_info, &ping_trans_alpha, &ping_num_trans, + &ping_trans_color); + + (void) png_get_bKGD(ping, ping_info, &ping_background); + + if (ping_bit_depth < 8) + { + png_set_packing(ping); + ping_bit_depth = 8; + } + + image->depth=ping_bit_depth; + image->depth=GetImageQuantumDepth(image,MagickFalse); + image->interlace=ping_interlace_method != 0 ? PNGInterlace : NoInterlace; + + if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || + ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) + { + image->rendering_intent=UndefinedIntent; + intent=Magick_RenderingIntent_to_PNG_RenderingIntent(UndefinedIntent); + (void) memset(&image->chromaticity,0, + sizeof(image->chromaticity)); + } + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " PNG width: %.20g, height: %.20g\n" + " PNG color_type: %d, bit_depth: %d\n" + " PNG compression_method: %d\n" + " PNG interlace_method: %d, filter_method: %d", + (double) ping_width, (double) ping_height, + ping_color_type, ping_bit_depth, + ping_compression_method, + ping_interlace_method,ping_filter_method); + + } + + if (png_get_valid(ping,ping_info, PNG_INFO_iCCP)) + { + ping_found_iCCP=MagickTrue; + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Found PNG iCCP chunk."); + } + + if (png_get_valid(ping,ping_info,PNG_INFO_gAMA)) + { + ping_found_gAMA=MagickTrue; + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Found PNG gAMA chunk."); + } + + if (png_get_valid(ping,ping_info,PNG_INFO_cHRM)) + { + ping_found_cHRM=MagickTrue; + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Found PNG cHRM chunk."); + } + + if (ping_found_iCCP != MagickTrue && png_get_valid(ping,ping_info, + PNG_INFO_sRGB)) + { + ping_found_sRGB=MagickTrue; + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Found PNG sRGB chunk."); + } + +#ifdef PNG_READ_iCCP_SUPPORTED + if (ping_found_iCCP !=MagickTrue && + ping_found_sRGB != MagickTrue && + png_get_valid(ping,ping_info, PNG_INFO_iCCP)) + { + ping_found_iCCP=MagickTrue; + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Found PNG iCCP chunk."); + } + + if (png_get_valid(ping,ping_info,PNG_INFO_iCCP)) + { + int + compression; + +#if (PNG_LIBPNG_VER < 10500) + png_charp + info; +#else + png_bytep + info; +#endif + + png_charp + name; + + png_uint_32 + profile_length; + + (void) png_get_iCCP(ping,ping_info,&name,(int *) &compression,&info, + &profile_length); + + if (profile_length != 0) + { + StringInfo + *profile; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading PNG iCCP chunk."); + + profile=BlobToStringInfo(info,profile_length); + + if (profile == (StringInfo *) NULL) + { + png_warning(ping, "ICC profile is NULL"); + profile=DestroyStringInfo(profile); + } + else + { + if (ping_preserve_iCCP == MagickFalse) + { + int + icheck, + got_crc=0; + + + png_uint_32 + length, + profile_crc=0; + + unsigned char + *data; + + length=(png_uint_32) GetStringInfoLength(profile); + + for (icheck=0; sRGB_info[icheck].len > 0; icheck++) + { + if (length == sRGB_info[icheck].len) + { + if (got_crc == 0) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Got a %lu-byte ICC profile (potentially sRGB)", + (unsigned long) length); + + data=GetStringInfoDatum(profile); + profile_crc=crc32(0,data,length); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " with crc=%8x",(unsigned int) profile_crc); + got_crc++; + } + + if (profile_crc == sRGB_info[icheck].crc) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " It is sRGB with rendering intent = %s", + Magick_RenderingIntentString_from_PNG_RenderingIntent( + sRGB_info[icheck].intent)); + if (image->rendering_intent==UndefinedIntent) + { + image->rendering_intent= + Magick_RenderingIntent_from_PNG_RenderingIntent( + sRGB_info[icheck].intent); + } + break; + } + } + } + if (sRGB_info[icheck].len == 0) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Got a %lu-byte ICC profile not recognized as sRGB", + (unsigned long) length); + (void) SetImageProfile(image,"icc",profile); + } + } + else /* Preserve-iCCP */ + { + (void) SetImageProfile(image,"icc",profile); + } + + profile=DestroyStringInfo(profile); + } + } + } +#endif + +#if defined(PNG_READ_sRGB_SUPPORTED) + { + if (ping_found_iCCP==MagickFalse && png_get_valid(ping,ping_info, + PNG_INFO_sRGB)) + { + if (png_get_sRGB(ping,ping_info,&intent)) + { + if (image->rendering_intent == UndefinedIntent) + image->rendering_intent= + Magick_RenderingIntent_from_PNG_RenderingIntent (intent); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading PNG sRGB chunk: rendering_intent: %d",intent); + } + } + + else if (mng_info->have_global_srgb) + { + if (image->rendering_intent == UndefinedIntent) + image->rendering_intent= + Magick_RenderingIntent_from_PNG_RenderingIntent + (mng_info->global_srgb_intent); + } + } +#endif + + { + if (!png_get_gAMA(ping,ping_info,&file_gamma)) + if (mng_info->have_global_gama) + png_set_gAMA(ping,ping_info,mng_info->global_gamma); + + if (png_get_gAMA(ping,ping_info,&file_gamma)) + { + image->gamma=(float) file_gamma; + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading PNG gAMA chunk: gamma: %f",file_gamma); + } + } + + if (!png_get_valid(ping,ping_info,PNG_INFO_cHRM)) + { + if (mng_info->have_global_chrm != MagickFalse) + { + (void) png_set_cHRM(ping,ping_info, + mng_info->global_chrm.white_point.x, + mng_info->global_chrm.white_point.y, + mng_info->global_chrm.red_primary.x, + mng_info->global_chrm.red_primary.y, + mng_info->global_chrm.green_primary.x, + mng_info->global_chrm.green_primary.y, + mng_info->global_chrm.blue_primary.x, + mng_info->global_chrm.blue_primary.y); + } + } + + if (png_get_valid(ping,ping_info,PNG_INFO_cHRM)) + { + (void) png_get_cHRM(ping,ping_info, + &image->chromaticity.white_point.x, + &image->chromaticity.white_point.y, + &image->chromaticity.red_primary.x, + &image->chromaticity.red_primary.y, + &image->chromaticity.green_primary.x, + &image->chromaticity.green_primary.y, + &image->chromaticity.blue_primary.x, + &image->chromaticity.blue_primary.y); + + ping_found_cHRM=MagickTrue; + + if (image->chromaticity.red_primary.x>0.6399f && + image->chromaticity.red_primary.x<0.6401f && + image->chromaticity.red_primary.y>0.3299f && + image->chromaticity.red_primary.y<0.3301f && + image->chromaticity.green_primary.x>0.2999f && + image->chromaticity.green_primary.x<0.3001f && + image->chromaticity.green_primary.y>0.5999f && + image->chromaticity.green_primary.y<0.6001f && + image->chromaticity.blue_primary.x>0.1499f && + image->chromaticity.blue_primary.x<0.1501f && + image->chromaticity.blue_primary.y>0.0599f && + image->chromaticity.blue_primary.y<0.0601f && + image->chromaticity.white_point.x>0.3126f && + image->chromaticity.white_point.x<0.3128f && + image->chromaticity.white_point.y>0.3289f && + image->chromaticity.white_point.y<0.3291f) + ping_found_sRGB_cHRM=MagickTrue; + } + + if (image->rendering_intent != UndefinedIntent) + { + if (ping_found_sRGB != MagickTrue && + (ping_found_gAMA != MagickTrue || + (image->gamma > .45 && image->gamma < .46)) && + (ping_found_cHRM != MagickTrue || + ping_found_sRGB_cHRM != MagickFalse) && + ping_found_iCCP != MagickTrue) + { + png_set_sRGB(ping,ping_info, + Magick_RenderingIntent_to_PNG_RenderingIntent + (image->rendering_intent)); + file_gamma=0.45455f; + ping_found_sRGB=MagickTrue; + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting sRGB as if in input"); + } + } +#if defined(PNG_oFFs_SUPPORTED) + if (png_get_valid(ping,ping_info,PNG_INFO_oFFs)) + { + image->page.x=(ssize_t) png_get_x_offset_pixels(ping, ping_info); + image->page.y=(ssize_t) png_get_y_offset_pixels(ping, ping_info); + + if (logging != MagickFalse) + if (image->page.x || image->page.y) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading PNG oFFs chunk: x: %.20g, y: %.20g.",(double) + image->page.x,(double) image->page.y); + } +#endif +#if defined(PNG_pHYs_SUPPORTED) + if (!png_get_valid(ping,ping_info,PNG_INFO_pHYs)) + { + if (mng_info->have_global_phys) + { + png_set_pHYs(ping,ping_info, + mng_info->global_x_pixels_per_unit, + mng_info->global_y_pixels_per_unit, + mng_info->global_phys_unit_type); + } + } + + x_resolution=0; + y_resolution=0; + unit_type=0; + if (png_get_valid(ping,ping_info,PNG_INFO_pHYs)) + { + /* + Set image resolution. + */ + (void) png_get_pHYs(ping,ping_info,&x_resolution,&y_resolution, + &unit_type); + image->x_resolution=(double) x_resolution; + image->y_resolution=(double) y_resolution; + + if (unit_type == PNG_RESOLUTION_METER) + { + image->units=PixelsPerCentimeterResolution; + image->x_resolution=(double) x_resolution/100.0; + image->y_resolution=(double) y_resolution/100.0; + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading PNG pHYs chunk: xres: %.20g, yres: %.20g, units: %d.", + (double) x_resolution,(double) y_resolution,unit_type); + } +#endif + + if (png_get_valid(ping,ping_info,PNG_INFO_PLTE)) + { + png_colorp + palette = (png_colorp) NULL; + + (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); + + if ((number_colors == 0) && + ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE)) + { + if (mng_info->global_plte_length) + { + png_set_PLTE(ping,ping_info,mng_info->global_plte, + (int) mng_info->global_plte_length); + + if (!png_get_valid(ping,ping_info,PNG_INFO_tRNS)) + if (mng_info->global_trns_length) + { + if (mng_info->global_trns_length > + mng_info->global_plte_length) + { + png_warning(ping, + "global tRNS has more entries than global PLTE"); + } + else + { + png_set_tRNS(ping,ping_info,mng_info->global_trns, + (int) mng_info->global_trns_length,NULL); + } + } +#ifdef PNG_READ_bKGD_SUPPORTED + if ( +#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED + mng_info->have_saved_bkgd_index || +#endif + png_get_valid(ping,ping_info,PNG_INFO_bKGD)) + { + png_color_16 + background; + +#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED + if (mng_info->have_saved_bkgd_index) + background.index=mng_info->saved_bkgd_index; +#endif + if (png_get_valid(ping, ping_info, PNG_INFO_bKGD)) + background.index=ping_background->index; + + background.red=(png_uint_16) + mng_info->global_plte[background.index].red; + + background.green=(png_uint_16) + mng_info->global_plte[background.index].green; + + background.blue=(png_uint_16) + mng_info->global_plte[background.index].blue; + + background.gray=(png_uint_16) + mng_info->global_plte[background.index].green; + + png_set_bKGD(ping,ping_info,&background); + } +#endif + } + else + png_error(ping,"No global PLTE in file"); + } + } + +#ifdef PNG_READ_bKGD_SUPPORTED + if (mng_info->have_global_bkgd && + (!png_get_valid(ping,ping_info,PNG_INFO_bKGD))) + image->background_color=mng_info->mng_global_bkgd; + + if (png_get_valid(ping,ping_info,PNG_INFO_bKGD)) + { + unsigned int + bkgd_scale; + + /* Set image background color. + * Scale background components to 16-bit, then scale + * to quantum depth + */ + + bkgd_scale = 1; + + if (ping_file_depth == 1) + bkgd_scale = 255; + + else if (ping_file_depth == 2) + bkgd_scale = 85; + + else if (ping_file_depth == 4) + bkgd_scale = 17; + + if (ping_file_depth <= 8) + bkgd_scale *= 257; + + ping_background->red *= bkgd_scale; + ping_background->green *= bkgd_scale; + ping_background->blue *= bkgd_scale; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading PNG bKGD chunk, raw ping_background=(%d,%d,%d).\n" + " bkgd_scale=%d. ping_background=(%d,%d,%d).", + ping_background->red,ping_background->green, + ping_background->blue,bkgd_scale,ping_background->red, + ping_background->green,ping_background->blue); + + image->background_color.red= + ScaleShortToQuantum(ping_background->red); + + image->background_color.green= + ScaleShortToQuantum(ping_background->green); + + image->background_color.blue= + ScaleShortToQuantum(ping_background->blue); + + image->background_color.opacity=OpaqueOpacity; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->background_color=(%.20g,%.20g,%.20g).", + (double) image->background_color.red, + (double) image->background_color.green, + (double) image->background_color.blue); + } +#endif /* PNG_READ_bKGD_SUPPORTED */ + + if ((png_get_valid(ping,ping_info,PNG_INFO_tRNS)) && + (ping_trans_color != (png_color_16p) NULL)) + { + /* + Image has a tRNS chunk. + */ + int + max_sample; + + size_t + one = 1; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading PNG tRNS chunk."); + + max_sample = (int) ((one << ping_file_depth) - 1); + + if ((ping_color_type == PNG_COLOR_TYPE_GRAY && + (int)ping_trans_color->gray > max_sample) || + (ping_color_type == PNG_COLOR_TYPE_RGB && + ((int)ping_trans_color->red > max_sample || + (int)ping_trans_color->green > max_sample || + (int)ping_trans_color->blue > max_sample))) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Ignoring PNG tRNS chunk with out-of-range sample."); + png_free_data(ping, ping_info, PNG_FREE_TRNS, 0); + png_set_invalid(ping,ping_info,PNG_INFO_tRNS); + image->matte=MagickFalse; + } + else + { + int + scale_to_short; + + scale_to_short = 65535L/((1UL << ping_file_depth)-1); + + /* Scale transparent_color to short */ + transparent_color.red= scale_to_short*ping_trans_color->red; + transparent_color.green= scale_to_short*ping_trans_color->green; + transparent_color.blue= scale_to_short*ping_trans_color->blue; + transparent_color.opacity= scale_to_short*ping_trans_color->gray; + + if (ping_color_type == PNG_COLOR_TYPE_GRAY) + { + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Raw tRNS graylevel = %d, scaled graylevel = %d.", + ping_trans_color->gray,transparent_color.opacity); + } + transparent_color.red=transparent_color.opacity; + transparent_color.green=transparent_color.opacity; + transparent_color.blue=transparent_color.opacity; + } + } + } +#if defined(PNG_READ_sBIT_SUPPORTED) + if (mng_info->have_global_sbit) + { + if (!png_get_valid(ping,ping_info,PNG_INFO_sBIT)) + png_set_sBIT(ping,ping_info,&mng_info->global_sbit); + } +#endif + num_passes=png_set_interlace_handling(ping); + + png_read_update_info(ping,ping_info); + + ping_rowbytes=png_get_rowbytes(ping,ping_info); + + /* + Initialize image structure. + */ + mng_info->image_box.left=0; + mng_info->image_box.right=(ssize_t) ping_width; + mng_info->image_box.top=0; + mng_info->image_box.bottom=(ssize_t) ping_height; + if (mng_info->mng_type == 0) + { + mng_info->mng_width=ping_width; + mng_info->mng_height=ping_height; + mng_info->frame=mng_info->image_box; + mng_info->clip=mng_info->image_box; + } + + else + { + image->page.y=mng_info->y_off[mng_info->object_id]; + } + + image->compression=ZipCompression; + image->columns=ping_width; + image->rows=ping_height; + + if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || + ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) + { + double + image_gamma = image->gamma; + + (void)LogMagickEvent(CoderEvent,GetMagickModule(), + " image->gamma=%f",(float) image_gamma); + + if (image_gamma > 0.75) + { + /* Set image->rendering_intent to Undefined, + * image->colorspace to GRAY, and reset image->chromaticity. + */ + SetImageColorspace(image,LinearGRAYColorspace); + } + else + { + RenderingIntent + save_rendering_intent = image->rendering_intent; + ChromaticityInfo + save_chromaticity = image->chromaticity; + + SetImageColorspace(image,GRAYColorspace); + image->rendering_intent = save_rendering_intent; + image->chromaticity = save_chromaticity; + } + + image->gamma = image_gamma; + } + else + { + double + image_gamma = image->gamma; + + (void)LogMagickEvent(CoderEvent,GetMagickModule(), + " image->gamma=%f",(float) image_gamma); + + if (image_gamma > 0.75) + { + /* Set image->rendering_intent to Undefined, + * image->colorspace to GRAY, and reset image->chromaticity. + */ + image->intensity = Rec709LuminancePixelIntensityMethod; + SetImageColorspace(image,RGBColorspace); + } + else + { + RenderingIntent + save_rendering_intent = image->rendering_intent; + ChromaticityInfo + save_chromaticity = image->chromaticity; + + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) SetImageColorspace(image,sRGBColorspace); + image->rendering_intent = save_rendering_intent; + image->chromaticity = save_chromaticity; + } + + image->gamma = image_gamma; + } + + (void)LogMagickEvent(CoderEvent,GetMagickModule(), + " image->colorspace=%d",(int) image->colorspace); + + if (((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) || + ((int) ping_bit_depth < 16 && + (int) ping_color_type == PNG_COLOR_TYPE_GRAY)) + { + size_t + one; + + image->storage_class=PseudoClass; + one=1; + image->colors=one << ping_file_depth; +#if (MAGICKCORE_QUANTUM_DEPTH == 8) + if (image->colors > 256) + image->colors=256; +#else + if (image->colors > 65536L) + image->colors=65536L; +#endif + if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) + { + png_colorp + palette = (png_colorp) NULL; + + (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); + image->colors=(size_t) number_colors; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading PNG PLTE chunk: number_colors: %d.",number_colors); + } + } + + if (image->storage_class == PseudoClass) + { + /* + Initialize image colormap. + */ + if (AcquireImageColormap(image,image->colors) == MagickFalse) + png_error(ping,"Memory allocation failed"); + + if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) + { + png_colorp + palette = (png_colorp) NULL; + + (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); + + for (i=0; i < (ssize_t) number_colors; i++) + { + image->colormap[i].red=ScaleCharToQuantum(palette[i].red); + image->colormap[i].green=ScaleCharToQuantum(palette[i].green); + image->colormap[i].blue=ScaleCharToQuantum(palette[i].blue); + } + + for ( ; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=0; + image->colormap[i].green=0; + image->colormap[i].blue=0; + } + } + } + + /* Set some properties for reporting by "identify" */ + { + char + msg[MaxTextExtent]; + + /* encode ping_width, ping_height, ping_file_depth, ping_color_type, + ping_interlace_method in value */ + + (void) FormatLocaleString(msg,MaxTextExtent, + "%d, %d",(int) ping_width, (int) ping_height); + (void) SetImageProperty(image,"png:IHDR.width,height",msg); + + (void) FormatLocaleString(msg,MaxTextExtent,"%d",(int) ping_file_depth); + (void) SetImageProperty(image,"png:IHDR.bit_depth",msg); + + (void) FormatLocaleString(msg,MaxTextExtent,"%d (%s)", + (int) ping_color_type, + Magick_ColorType_from_PNG_ColorType((int)ping_color_type)); + (void) SetImageProperty(image,"png:IHDR.color_type",msg); + + if (ping_interlace_method == 0) + { + (void) FormatLocaleString(msg,MaxTextExtent,"%d (Not interlaced)", + (int) ping_interlace_method); + } + else if (ping_interlace_method == 1) + { + (void) FormatLocaleString(msg,MaxTextExtent,"%d (Adam7 method)", + (int) ping_interlace_method); + } + else + { + (void) FormatLocaleString(msg,MaxTextExtent,"%d (Unknown method)", + (int) ping_interlace_method); + } + (void) SetImageProperty(image,"png:IHDR.interlace_method",msg); + + if (number_colors != 0) + { + (void) FormatLocaleString(msg,MaxTextExtent,"%d", + (int) number_colors); + (void) SetImageProperty(image,"png:PLTE.number_colors",msg); + } + } + +#if defined(PNG_tIME_SUPPORTED) + read_tIME_chunk(image,ping,ping_info); +#endif + + + /* + Read image scanlines. + */ + if (image->delay != 0) + mng_info->scenes_found++; + + if ((mng_info->mng_type == 0 && (image->ping != MagickFalse)) || ( + (image_info->number_scenes != 0) && (mng_info->scenes_found > (ssize_t) + (image_info->first_scene+image_info->number_scenes)))) + { + /* This happens later in non-ping decodes */ + if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) + image->storage_class=DirectClass; + image->matte=(((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || + ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || + (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? + MagickTrue : MagickFalse; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Skipping PNG image data for scene %.20g",(double) + mng_info->scenes_found-1); + png_destroy_read_struct(&ping,&ping_info,&end_info); + +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + UnlockSemaphoreInfo(ping_semaphore); +#endif + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " exit ReadOnePNGImage()."); + + return(image); + } + + status=SetImageExtent(image,image->columns,image->rows); + if (status != MagickFalse) + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + { + png_destroy_read_struct(&ping,&ping_info,&end_info); + InheritException(exception, &image->exception); +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + UnlockSemaphoreInfo(ping_semaphore); +#endif + return(DestroyImageList(image)); + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading PNG IDAT chunk(s)"); + + if (num_passes > 1) + pixel_info=AcquireVirtualMemory(image->rows,ping_rowbytes* + sizeof(*ping_pixels)); + else + pixel_info=AcquireVirtualMemory(ping_rowbytes,sizeof(*ping_pixels)); + + if (pixel_info == (MemoryInfo *) NULL) + png_error(ping,"Memory allocation failed"); + ping_pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Converting PNG pixels to pixel packets"); + /* + Convert PNG pixels to pixel packets. + */ + + { + + MagickBooleanType + found_transparent_pixel; + + found_transparent_pixel=MagickFalse; + + if ((image->storage_class == DirectClass) || + (image_info->stream != (StreamHandler) NULL)) + { + quantum_info=AcquireQuantumInfo(image_info,image); + + if (quantum_info == (QuantumInfo *) NULL) + png_error(ping,"Failed to allocate quantum_info"); + + (void) SetQuantumEndian(image,quantum_info,MSBEndian); + + for (pass=0; pass < num_passes; pass++) + { + /* + Convert image to DirectClass pixel packets. + */ + image->matte=(((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || + ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || + (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? + MagickTrue : MagickFalse; + + for (y=0; y < (ssize_t) image->rows; y++) + { + + if (num_passes > 1) + row_offset=ping_rowbytes*y; + + else + row_offset=0; + + png_read_row(ping,ping_pixels+row_offset,NULL); + + if (pass < num_passes-1) + continue; + + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (q == (PixelPacket *) NULL) + break; + + else + { + if ((int) ping_color_type == PNG_COLOR_TYPE_GRAY) + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + GrayQuantum,ping_pixels+row_offset,exception); + + else if ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + GrayAlphaQuantum,ping_pixels+row_offset,exception); + + else if ((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + RGBAQuantum,ping_pixels+row_offset,exception); + + else if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + IndexQuantum,ping_pixels+row_offset,exception); + + else /* ping_color_type == PNG_COLOR_TYPE_RGB */ + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + RGBQuantum,ping_pixels+row_offset,exception); + + } + + if (found_transparent_pixel == MagickFalse) + { + /* Is there a transparent pixel in the row? */ + if (y== 0 && logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Looking for cheap transparent pixel"); + + for (x=(ssize_t) image->columns-1; x >= 0; x--) + { + if ((ping_color_type == PNG_COLOR_TYPE_RGBA || + ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) && + (GetPixelOpacity(q) != OpaqueOpacity)) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " ...got one."); + + found_transparent_pixel = MagickTrue; + break; + } + if ((ping_color_type == PNG_COLOR_TYPE_RGB || + ping_color_type == PNG_COLOR_TYPE_GRAY) && + (ScaleQuantumToShort(GetPixelRed(q)) + == transparent_color.red && + ScaleQuantumToShort(GetPixelGreen(q)) + == transparent_color.green && + ScaleQuantumToShort(GetPixelBlue(q)) + == transparent_color.blue)) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " ...got one."); + found_transparent_pixel = MagickTrue; + break; + } + q++; + } + } + + if (num_passes == 1) + { + status=SetImageProgress(image,LoadImageTag, + (MagickOffsetType) y, image->rows); + + if (status == MagickFalse) + break; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if (y < (long) image->rows) + break; + + if (num_passes != 1) + { + status=SetImageProgress(image,LoadImageTag,pass,num_passes); + if (status == MagickFalse) + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + } + + else /* image->storage_class != DirectClass */ + + for (pass=0; pass < num_passes; pass++) + { + Quantum + *r; + + /* + Convert grayscale image to PseudoClass pixel packets. + */ + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Converting grayscale pixels to pixel packets"); + image->matte=ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA ? + MagickTrue : MagickFalse; + + quantum_scanline=(Quantum *) AcquireQuantumMemory(image->columns, + (image->matte ? 2 : 1)*sizeof(*quantum_scanline)); + + if (quantum_scanline == (Quantum *) NULL) + png_error(ping,"Memory allocation failed"); + + for (y=0; y < (ssize_t) image->rows; y++) + { + Quantum + alpha; + + if (num_passes > 1) + row_offset=ping_rowbytes*y; + + else + row_offset=0; + + png_read_row(ping,ping_pixels+row_offset,NULL); + + if (pass < num_passes-1) + continue; + + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (q == (PixelPacket *) NULL) + break; + + indexes=GetAuthenticIndexQueue(image); + p=ping_pixels+row_offset; + r=quantum_scanline; + + switch (ping_bit_depth) + { + case 8: + { + + if (ping_color_type == 4) + for (x=(ssize_t) image->columns-1; x >= 0; x--) + { + *r++=*p++; + /* In image.h, OpaqueOpacity is 0 + * TransparentOpacity is QuantumRange + * In a PNG datastream, Opaque is QuantumRange + * and Transparent is 0. + */ + alpha=ScaleCharToQuantum((unsigned char)*p++); + + SetPixelAlpha(q,alpha); + + if (alpha != QuantumRange-OpaqueOpacity) + found_transparent_pixel = MagickTrue; + + q++; + } + + else + for (x=(ssize_t) image->columns-1; x >= 0; x--) + *r++=*p++; + + break; + } + + case 16: + { + for (x=(ssize_t) image->columns-1; x >= 0; x--) + { +#if (MAGICKCORE_QUANTUM_DEPTH >= 16) + unsigned long + quantum; + + if (image->colors > 256) + quantum=(((unsigned int) *p++) << 8); + + else + quantum=0; + + quantum|=(*p++); + + *r=ScaleShortToQuantum(quantum); + r++; + + if (ping_color_type == 4) + { + if (image->colors > 256) + quantum=(((unsigned int) *p++) << 8); + else + quantum=0; + + quantum|=(*p++); + alpha=ScaleShortToQuantum(quantum); + SetPixelAlpha(q,alpha); + if (alpha != QuantumRange-OpaqueOpacity) + found_transparent_pixel = MagickTrue; + q++; + } + +#else /* MAGICKCORE_QUANTUM_DEPTH == 8 */ + *r++=(*p++); + p++; /* strip low byte */ + + if (ping_color_type == 4) + { + alpha=*p++; + SetPixelAlpha(q,alpha); + if (alpha != QuantumRange-OpaqueOpacity) + found_transparent_pixel = MagickTrue; + p++; + q++; + } +#endif + } + + break; + } + + default: + break; + } + + /* + Transfer image scanline. + */ + r=quantum_scanline; + + for (x=0; x < (ssize_t) image->columns; x++) + { + ssize_t index=ConstrainColormapIndex(image,(ssize_t) *r); + SetPixelRed(q,ClampToQuantum(image->colormap[index].red)); + SetPixelGreen(q,ClampToQuantum(image->colormap[index].green)); + SetPixelBlue(q,ClampToQuantum(image->colormap[index].blue)); + SetPixelIndex(indexes+x,index); + r++; + q++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + + if (num_passes == 1) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + + if (status == MagickFalse) + break; + } + } + quantum_scanline=(Quantum *) RelinquishMagickMemory(quantum_scanline); + if (y < (long) image->rows) + break; + if (num_passes != 1) + { + status=SetImageProgress(image,LoadImageTag,pass,num_passes); + + if (status == MagickFalse) + break; + } + } + + image->matte=found_transparent_pixel; + + if (logging != MagickFalse) + { + if (found_transparent_pixel != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Found transparent pixel"); + else + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " No transparent pixel was found"); + + ping_color_type&=0x03; + } + } + } + + png_read_end(ping,end_info); + + if (image_info->number_scenes != 0 && mng_info->scenes_found-1 < + (ssize_t) image_info->first_scene && image->delay != 0) + { + png_destroy_read_struct(&ping,&ping_info,&end_info); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (AcquireImageColormap(image,2) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) SetImageBackgroundColor(image); +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + UnlockSemaphoreInfo(ping_semaphore); +#endif + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " exit ReadOnePNGImage() early."); + + return(image); + } + + if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) + { + ClassType + storage_class; + + /* + Image has a transparent background. + */ + storage_class=image->storage_class; + image->matte=MagickTrue; + +/* Balfour fix from imagemagick discourse server, 5 Feb 2010 */ + + if (storage_class == PseudoClass) + { + if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) + { + for (x=0; x < ping_num_trans; x++) + { + image->colormap[x].opacity=OpaqueOpacity; + if (ping_trans_alpha != (png_bytep) NULL) + image->colormap[x].opacity=ScaleCharToQuantum( + (unsigned char) (255-ping_trans_alpha[x])); + } + } + + else if (ping_color_type == PNG_COLOR_TYPE_GRAY) + { + for (x=0; x < (int) image->colors; x++) + { + if (ScaleQuantumToShort(image->colormap[x].red) == + transparent_color.opacity) + { + image->colormap[x].opacity = (Quantum) TransparentOpacity; + } + } + } + (void) SyncImage(image); + } + +#if 1 /* Should have already been done above, but glennrp problem P10 + * needs this. + */ + else + { + for (y=0; y < (ssize_t) image->rows; y++) + { + image->storage_class=storage_class; + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (q == (PixelPacket *) NULL) + break; + + indexes=GetAuthenticIndexQueue(image); + + /* Caution: on a Q8 build, this does not distinguish between + * 16-bit colors that differ only in the low byte + */ + for (x=(ssize_t) image->columns-1; x >= 0; x--) + { + if (ScaleQuantumToShort(GetPixelRed(q)) + == transparent_color.red && + ScaleQuantumToShort(GetPixelGreen(q)) + == transparent_color.green && + ScaleQuantumToShort(GetPixelBlue(q)) + == transparent_color.blue) + { + SetPixelOpacity(q,TransparentOpacity); + } + else + { + SetPixelOpacity(q,OpaqueOpacity); + } + + q++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } +#endif + + image->storage_class=DirectClass; + } + + for (j = 0; j < 2; j++) + { + if (j == 0) + status = png_get_text(ping,ping_info,&text,&num_text) != 0 ? + MagickTrue : MagickFalse; + else + status = png_get_text(ping,end_info,&text,&num_text) != 0 ? + MagickTrue : MagickFalse; + + if (status != MagickFalse) + for (i=0; i < (ssize_t) num_text; i++) + { + /* Check for a profile */ + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading PNG text chunk"); + + if (strlen(text[i].key) > 16 && + memcmp(text[i].key, "Raw profile type ",17) == 0) + { + const char + *value; + + value=GetImageOption(image_info,"profile:skip"); + + if (IsOptionMember(text[i].key+17,value) == MagickFalse) + { + (void) Magick_png_read_raw_profile(ping,image,image_info,text, + (int) i); + num_raw_profiles++; + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Read raw profile %s",text[i].key+17); + } + else + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Skipping raw profile %s",text[i].key+17); + } + } + + else + { + char + *value; + + length=text[i].text_length; + value=(char *) AcquireQuantumMemory(length+MaxTextExtent, + sizeof(*value)); + + if (value == (char *) NULL) + png_error(ping,"Memory allocation failed"); + + *value='\0'; + (void) ConcatenateMagickString(value,text[i].text,length+2); + + /* Don't save "density" or "units" property if we have a pHYs + * chunk + */ + if (!png_get_valid(ping,ping_info,PNG_INFO_pHYs) || + (LocaleCompare(text[i].key,"density") != 0 && + LocaleCompare(text[i].key,"units") != 0)) + { + char + key[MaxTextExtent]; + + (void) FormatLocaleString(key,MaxTextExtent,"%s",text[i].key); + if ((LocaleCompare(key,"version") == 0) || + (LocaleCompare(key,"width") == 0)) + (void) FormatLocaleString(key,MagickPathExtent,"png:%s", + text[i].key); + (void) SetImageProperty(image,key,value); + } + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " length: %lu\n" + " Keyword: %s", + (unsigned long) length, + text[i].key); + } + + value=DestroyString(value); + } + } + num_text_total += num_text; + } + +#ifdef MNG_OBJECT_BUFFERS + /* + Store the object if necessary. + */ + if (object_id && !mng_info->frozen[object_id]) + { + if (mng_info->ob[object_id] == (MngBuffer *) NULL) + { + /* + create a new object buffer. + */ + mng_info->ob[object_id]=(MngBuffer *) + AcquireMagickMemory(sizeof(MngBuffer)); + + if (mng_info->ob[object_id] != (MngBuffer *) NULL) + { + mng_info->ob[object_id]->image=(Image *) NULL; + mng_info->ob[object_id]->reference_count=1; + } + } + + if ((mng_info->ob[object_id] == (MngBuffer *) NULL) || + mng_info->ob[object_id]->frozen) + { + if (mng_info->ob[object_id] == (MngBuffer *) NULL) + png_error(ping,"Memory allocation failed"); + + if (mng_info->ob[object_id]->frozen) + png_error(ping,"Cannot overwrite frozen MNG object buffer"); + } + + else + { + + if (mng_info->ob[object_id]->image != (Image *) NULL) + mng_info->ob[object_id]->image=DestroyImage + (mng_info->ob[object_id]->image); + + mng_info->ob[object_id]->image=CloneImage(image,0,0,MagickTrue, + &image->exception); + + if (mng_info->ob[object_id]->image != (Image *) NULL) + mng_info->ob[object_id]->image->file=(FILE *) NULL; + + else + png_error(ping, "Cloning image for object buffer failed"); + + if (ping_width > 250000L || ping_height > 250000L) + png_error(ping,"PNG Image dimensions are too large."); + + mng_info->ob[object_id]->width=ping_width; + mng_info->ob[object_id]->height=ping_height; + mng_info->ob[object_id]->color_type=ping_color_type; + mng_info->ob[object_id]->sample_depth=ping_bit_depth; + mng_info->ob[object_id]->interlace_method=ping_interlace_method; + mng_info->ob[object_id]->compression_method= + ping_compression_method; + mng_info->ob[object_id]->filter_method=ping_filter_method; + + if (png_get_valid(ping,ping_info,PNG_INFO_PLTE)) + { + png_colorp + plte = (png_colorp) NULL; + + /* + Copy the PLTE to the object buffer. + */ + png_get_PLTE(ping,ping_info,&plte,&number_colors); + mng_info->ob[object_id]->plte_length=number_colors; + + for (i=0; i < number_colors; i++) + { + mng_info->ob[object_id]->plte[i]=plte[i]; + } + } + + else + mng_info->ob[object_id]->plte_length=0; + } + } +#endif + + /* Set image->matte to MagickTrue if the input colortype supports + * alpha or if a valid tRNS chunk is present, no matter whether there + * is actual transparency present. + */ + image->matte=(((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || + ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || + (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? + MagickTrue : MagickFalse; + if (image->matte != MagickFalse) + (void) SetImageStorageClass(image,DirectClass); + +#if 0 /* I'm not sure what's wrong here but it does not work. */ + if (image->matte != MagickFalse) + { + if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + (void) SetImageType(image,GrayscaleMatteType); + + else if (ping_color_type == PNG_COLOR_TYPE_PALETTE) + (void) SetImageType(image,PaletteMatteType); + + else + (void) SetImageType(image,TrueColorMatteType); + } + + else + { + if (ping_color_type == PNG_COLOR_TYPE_GRAY) + (void) SetImageType(image,GrayscaleType); + + else if (ping_color_type == PNG_COLOR_TYPE_PALETTE) + (void) SetImageType(image,PaletteType); + + else + (void) SetImageType(image,TrueColorType); + } +#endif + + /* Set more properties for identify to retrieve */ + { + char + msg[MaxTextExtent]; + + if (num_text_total != 0) + { + /* libpng doesn't tell us whether they were tEXt, zTXt, or iTXt */ + (void) FormatLocaleString(msg,MaxTextExtent, + "%d tEXt/zTXt/iTXt chunks were found", num_text_total); + (void) SetImageProperty(image,"png:text",msg); + } + + if (num_raw_profiles != 0) + { + (void) FormatLocaleString(msg,MaxTextExtent, + "%d were found", num_raw_profiles); + (void) SetImageProperty(image,"png:text-encoded profiles",msg); + } + + /* cHRM chunk: */ + if (ping_found_cHRM != MagickFalse) + { + (void) FormatLocaleString(msg,MaxTextExtent,"%s", + "chunk was found (see Chromaticity, above)"); + (void) SetImageProperty(image,"png:cHRM",msg); + } + + /* bKGD chunk: */ + if (png_get_valid(ping,ping_info,PNG_INFO_bKGD)) + { + (void) FormatLocaleString(msg,MaxTextExtent,"%s", + "chunk was found (see Background color, above)"); + (void) SetImageProperty(image,"png:bKGD",msg); + } + + (void) FormatLocaleString(msg,MaxTextExtent,"%s", + "chunk was found"); + + /* iCCP chunk: */ + if (ping_found_iCCP != MagickFalse) + (void) SetImageProperty(image,"png:iCCP",msg); + + if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) + (void) SetImageProperty(image,"png:tRNS",msg); + +#if defined(PNG_sRGB_SUPPORTED) + /* sRGB chunk: */ + if (ping_found_sRGB != MagickFalse) + { + (void) FormatLocaleString(msg,MaxTextExtent, + "intent=%d (%s)", + (int) intent, + Magick_RenderingIntentString_from_PNG_RenderingIntent(intent)); + (void) SetImageProperty(image,"png:sRGB",msg); + } +#endif + + /* gAMA chunk: */ + if (ping_found_gAMA != MagickFalse) + { + (void) FormatLocaleString(msg,MaxTextExtent, + "gamma=%.8g (See Gamma, above)", file_gamma); + (void) SetImageProperty(image,"png:gAMA",msg); + } + +#if defined(PNG_pHYs_SUPPORTED) + /* pHYs chunk: */ + if (png_get_valid(ping,ping_info,PNG_INFO_pHYs)) + { + (void) FormatLocaleString(msg,MaxTextExtent, + "x_res=%.10g, y_res=%.10g, units=%d", + (double) x_resolution,(double) y_resolution, unit_type); + (void) SetImageProperty(image,"png:pHYs",msg); + } +#endif + +#if defined(PNG_oFFs_SUPPORTED) + /* oFFs chunk: */ + if (png_get_valid(ping,ping_info,PNG_INFO_oFFs)) + { + (void) FormatLocaleString(msg,MaxTextExtent,"x_off=%.20g, y_off=%.20g", + (double) image->page.x,(double) image->page.y); + (void) SetImageProperty(image,"png:oFFs",msg); + } +#endif + +#if defined(PNG_tIME_SUPPORTED) + read_tIME_chunk(image,ping,end_info); +#endif + + /* caNv chunk: */ + if ((image->page.width != 0 && image->page.width != image->columns) || + (image->page.height != 0 && image->page.height != image->rows) || + (image->page.x != 0 || image->page.y != 0)) + { + (void) FormatLocaleString(msg,MaxTextExtent, + "width=%.20g, height=%.20g, x_offset=%.20g, y_offset=%.20g", + (double) image->page.width,(double) image->page.height, + (double) image->page.x,(double) image->page.y); + (void) SetImageProperty(image,"png:caNv",msg); + } + } + + /* + Relinquish resources. + */ + png_destroy_read_struct(&ping,&ping_info,&end_info); + + pixel_info=RelinquishVirtualMemory(pixel_info); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " exit ReadOnePNGImage()"); + +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + UnlockSemaphoreInfo(ping_semaphore); +#endif + + /* } for navigation to beginning of SETJMP-protected block, revert to + * Throwing an Exception when an error occurs. + */ + + return(image); + +/* end of reading one PNG image */ +} + +static Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + logging, + status; + + MngInfo + *mng_info; + + char + magic_number[MaxTextExtent]; + + ssize_t + count; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadPNGImage()"); + image=AcquireImage(image_info); + mng_info=(MngInfo *) NULL; + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + + if (status == MagickFalse) + return(DestroyImageList(image)); + + /* + Verify PNG signature. + */ + count=ReadBlob(image,8,(unsigned char *) magic_number); + + if ((count < 8) || (memcmp(magic_number,"\211PNG\r\n\032\n",8) != 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + + /* + Verify that file size large enough to contain a PNG datastream. + */ + if (GetBlobSize(image) < 61) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + + /* + Allocate a MngInfo structure. + */ + mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); + + if (mng_info == (MngInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + + /* + Initialize members of the MngInfo structure. + */ + (void) memset(mng_info,0,sizeof(MngInfo)); + mng_info->image=image; + + image=ReadOnePNGImage(mng_info,image_info,exception); + mng_info=MngInfoFreeStruct(mng_info); + + if (image == (Image *) NULL) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "exit ReadPNGImage() with error"); + + return((Image *) NULL); + } + + (void) CloseBlob(image); + + if ((image->columns == 0) || (image->rows == 0)) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "exit ReadPNGImage() with error."); + + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + + if ((IssRGBColorspace(image->colorspace) != MagickFalse) && + (image->gamma > .75) && + !(image->chromaticity.red_primary.x>0.6399f && + image->chromaticity.red_primary.x<0.6401f && + image->chromaticity.red_primary.y>0.3299f && + image->chromaticity.red_primary.y<0.3301f && + image->chromaticity.green_primary.x>0.2999f && + image->chromaticity.green_primary.x<0.3001f && + image->chromaticity.green_primary.y>0.5999f && + image->chromaticity.green_primary.y<0.6001f && + image->chromaticity.blue_primary.x>0.1499f && + image->chromaticity.blue_primary.x<0.1501f && + image->chromaticity.blue_primary.y>0.0599f && + image->chromaticity.blue_primary.y<0.0601f && + image->chromaticity.white_point.x>0.3126f && + image->chromaticity.white_point.x<0.3128f && + image->chromaticity.white_point.y>0.3289f && + image->chromaticity.white_point.y<0.3291f)) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "SetImageColorspace to RGBColorspace"); + SetImageColorspace(image,RGBColorspace); + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " page.w: %.20g, page.h: %.20g,page.x: %.20g, page.y: %.20g.", + (double) image->page.width,(double) image->page.height, + (double) image->page.x,(double) image->page.y); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadPNGImage()"); + + return(image); +} + + +#if defined(JNG_SUPPORTED) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d O n e J N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadOneJNGImage() reads a JPEG Network Graphics (JNG) image file +% (minus the 8-byte signature) and returns it. It allocates the memory +% necessary for the new Image structure and returns a pointer to the new +% image. +% +% JNG support written by Glenn Randers-Pehrson, glennrp@image... +% +% The format of the ReadOneJNGImage method is: +% +% Image *ReadOneJNGImage(MngInfo *mng_info, const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o mng_info: Specifies a pointer to a MngInfo structure. +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static void +DestroyJNG(unsigned char *chunk,Image **color_image, + ImageInfo **color_image_info,Image **alpha_image,ImageInfo **alpha_image_info) +{ + (void) RelinquishMagickMemory(chunk); + if (color_image_info && *color_image_info) + { + DestroyImageInfo(*color_image_info); + *color_image_info = (ImageInfo *)NULL; + } + if (alpha_image_info && *alpha_image_info) + { + DestroyImageInfo(*alpha_image_info); + *alpha_image_info = (ImageInfo *)NULL; + } + if (color_image && *color_image) + { + DestroyImageList(*color_image); + *color_image = (Image *)NULL; + } + if (alpha_image && *alpha_image) + { + DestroyImageList(*alpha_image); + *alpha_image = (Image *)NULL; + } +} +static Image *ReadOneJNGImage(MngInfo *mng_info, + const ImageInfo *image_info, ExceptionInfo *exception) +{ + Image + *alpha_image, + *color_image, + *image, + *jng_image; + + ImageInfo + *alpha_image_info, + *color_image_info; + + MagickBooleanType + logging; + + int + unique_filenames; + + ssize_t + y; + + MagickBooleanType + status; + + png_uint_32 + jng_height, + jng_width; + + png_byte + jng_color_type, + jng_image_sample_depth, + jng_image_compression_method, + jng_image_interlace_method, + jng_alpha_sample_depth, + jng_alpha_compression_method, + jng_alpha_filter_method, + jng_alpha_interlace_method; + + const PixelPacket + *s; + + ssize_t + i, + x; + + PixelPacket + *q; + + unsigned char + *p; + + unsigned int + read_JSEP, + reading_idat; + + size_t + length; + + jng_alpha_compression_method=0; + jng_alpha_sample_depth=8; + jng_color_type=0; + jng_height=0; + jng_width=0; + alpha_image=(Image *) NULL; + color_image=(Image *) NULL; + alpha_image_info=(ImageInfo *) NULL; + color_image_info=(ImageInfo *) NULL; + unique_filenames=0; + + logging=LogMagickEvent(CoderEvent,GetMagickModule(), + " Enter ReadOneJNGImage()"); + + image=mng_info->image; + + if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) + { + /* + Allocate next image structure. + */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " AcquireNextImage()"); + + AcquireNextImage(image_info,image); + + if (GetNextImageInList(image) == (Image *) NULL) + return(DestroyImageList(image)); + + image=SyncNextImageInList(image); + } + mng_info->image=image; + + /* + Signature bytes have already been read. + */ + + read_JSEP=MagickFalse; + reading_idat=MagickFalse; + for (;;) + { + char + type[MaxTextExtent]; + + unsigned char + *chunk; + + unsigned int + count; + + /* + Read a new JNG chunk. + */ + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + 2*GetBlobSize(image)); + + if (status == MagickFalse) + break; + + type[0]='\0'; + (void) ConcatenateMagickString(type,"errr",MaxTextExtent); + length=(size_t) ReadBlobMSBLong(image); + count=(unsigned int) ReadBlob(image,4,(unsigned char *) type); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading JNG chunk type %c%c%c%c, length: %.20g", + type[0],type[1],type[2],type[3],(double) length); + + if (length > PNG_UINT_31_MAX || count == 0) + { + DestroyJNG(NULL,&color_image,&color_image_info, + &alpha_image,&alpha_image_info); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + + if (length > GetBlobSize(image)) + { + DestroyJNG(NULL,&color_image,&color_image_info, + &alpha_image,&alpha_image_info); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + p=NULL; + chunk=(unsigned char *) NULL; + + if (length != 0) + { + chunk=(unsigned char *) AcquireQuantumMemory(length,sizeof(*chunk)); + + if (chunk == (unsigned char *) NULL) + { + DestroyJNG(NULL,&color_image,&color_image_info, + &alpha_image,&alpha_image_info); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + + for (i=0; i < (ssize_t) length; i++) + { + int + c; + + c=ReadBlobByte(image); + if (c == EOF) + break; + chunk[i]=(unsigned char) c; + } + for ( ; i < (ssize_t) length; i++) + chunk[i]='\0'; + + p=chunk; + } + + (void) ReadBlobMSBLong(image); /* read crc word */ + + if (memcmp(type,mng_JHDR,4) == 0) + { + if (length == 16) + { + jng_width=(png_uint_32)mng_get_long(p); + jng_height=(png_uint_32)mng_get_long(&p[4]); + if ((jng_width == 0) || (jng_height == 0)) + { + DestroyJNG(chunk,&color_image,&color_image_info, + &alpha_image,&alpha_image_info); + ThrowReaderException(CorruptImageError, + "NegativeOrZeroImageSize"); + } + jng_color_type=p[8]; + jng_image_sample_depth=p[9]; + jng_image_compression_method=p[10]; + jng_image_interlace_method=p[11]; + + image->interlace=jng_image_interlace_method != 0 ? PNGInterlace : + NoInterlace; + + jng_alpha_sample_depth=p[12]; + jng_alpha_compression_method=p[13]; + jng_alpha_filter_method=p[14]; + jng_alpha_interlace_method=p[15]; + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " jng_width: %16lu, jng_height: %16lu\n" + " jng_color_type: %16d, jng_image_sample_depth: %3d\n" + " jng_image_compression_method:%3d", + (unsigned long) jng_width, (unsigned long) jng_height, + jng_color_type, jng_image_sample_depth, + jng_image_compression_method); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " jng_image_interlace_method: %3d" + " jng_alpha_sample_depth: %3d", + jng_image_interlace_method, + jng_alpha_sample_depth); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " jng_alpha_compression_method:%3d\n" + " jng_alpha_filter_method: %3d\n" + " jng_alpha_interlace_method: %3d", + jng_alpha_compression_method, + jng_alpha_filter_method, + jng_alpha_interlace_method); + } + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + if ((jng_width > 65535) || (jng_height > 65535) || + (MagickSizeType) jng_width > GetMagickResourceLimit(WidthResource) || + (MagickSizeType) jng_height > GetMagickResourceLimit(HeightResource)) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG width or height too large: (%lu x %lu)", + (long) jng_width, (long) jng_height); + DestroyJNG(chunk,&color_image,&color_image_info, + &alpha_image,&alpha_image_info); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + + continue; + } + + + if ((reading_idat == MagickFalse) && (read_JSEP == MagickFalse) && + ((memcmp(type,mng_JDAT,4) == 0) || (memcmp(type,mng_JdAA,4) == 0) || + (memcmp(type,mng_IDAT,4) == 0) || (memcmp(type,mng_JDAA,4) == 0))) + { + /* + o create color_image + o open color_blob, attached to color_image + o if (color type has alpha) + open alpha_blob, attached to alpha_image + */ + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Creating color_blob."); + + color_image_info=(ImageInfo *)AcquireMagickMemory(sizeof(ImageInfo)); + + if (color_image_info == (ImageInfo *) NULL) + { + DestroyJNG(chunk,&color_image,&color_image_info, + &alpha_image,&alpha_image_info); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + + GetImageInfo(color_image_info); + color_image=AcquireImage(color_image_info); + if (color_image == (Image *) NULL) + { + DestroyJNG(chunk,&color_image,&color_image_info, + &alpha_image,&alpha_image_info); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + + (void) AcquireUniqueFilename(color_image->filename); + unique_filenames++; + status=OpenBlob(color_image_info,color_image,WriteBinaryBlobMode, + exception); + + if (status == MagickFalse) + { + DestroyJNG(chunk,&color_image,&color_image_info, + &alpha_image,&alpha_image_info); + return(DestroyImageList(image)); + } + + if ((image_info->ping == MagickFalse) && (jng_color_type >= 12)) + { + if ((jng_alpha_compression_method != 0) && + (jng_alpha_compression_method != 8)) + { + DestroyJNG(chunk,&color_image,&color_image_info,&alpha_image, + &alpha_image_info); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + alpha_image_info=(ImageInfo *) + AcquireMagickMemory(sizeof(ImageInfo)); + + if (alpha_image_info == (ImageInfo *) NULL) + { + DestroyJNG(chunk,&color_image,&color_image_info, + &alpha_image,&alpha_image_info); + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + } + + GetImageInfo(alpha_image_info); + alpha_image=AcquireImage(alpha_image_info); + + if (alpha_image == (Image *) NULL) + { + DestroyJNG(chunk,&color_image,&color_image_info, + &alpha_image,&alpha_image_info); + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Creating alpha_blob."); + + (void) AcquireUniqueFilename(alpha_image->filename); + unique_filenames++; + status=OpenBlob(alpha_image_info,alpha_image,WriteBinaryBlobMode, + exception); + + if (status == MagickFalse) + { + alpha_image=DestroyImageList(alpha_image); + alpha_image_info=DestroyImageInfo(alpha_image_info); + color_image=DestroyImageList(color_image); + return(DestroyImageList(image)); + } + + if (jng_alpha_compression_method == 0) + { + unsigned char + data[18]; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing IHDR chunk to alpha_blob."); + + (void) WriteBlob(alpha_image,8,(const unsigned char *) + "\211PNG\r\n\032\n"); + + (void) WriteBlobMSBULong(alpha_image,13L); + PNGType(data,mng_IHDR); + LogPNGChunk(logging,mng_IHDR,13L); + PNGLong(data+4,jng_width); + PNGLong(data+8,jng_height); + data[12]=jng_alpha_sample_depth; + data[13]=0; /* color_type gray */ + data[14]=0; /* compression method 0 */ + data[15]=0; /* filter_method 0 */ + data[16]=0; /* interlace_method 0 */ + (void) WriteBlob(alpha_image,17,data); + (void) WriteBlobMSBULong(alpha_image,crc32(0,data,17)); + } + } + reading_idat=MagickTrue; + } + + if (memcmp(type,mng_JDAT,4) == 0) + { + /* Copy chunk to color_image->blob */ + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Copying JDAT chunk data to color_blob."); + + if ((length != 0) && (color_image != (Image *) NULL)) + (void) WriteBlob(color_image,length,chunk); + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_IDAT,4) == 0) + { + png_byte + data[5]; + + /* Copy IDAT header and chunk data to alpha_image->blob */ + + if (alpha_image != NULL && image_info->ping == MagickFalse) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Copying IDAT chunk data to alpha_blob."); + + (void) WriteBlobMSBULong(alpha_image,(size_t) length); + PNGType(data,mng_IDAT); + LogPNGChunk(logging,mng_IDAT,length); + (void) WriteBlob(alpha_image,4,data); + (void) WriteBlob(alpha_image,length,chunk); + (void) WriteBlobMSBULong(alpha_image, + crc32(crc32(0,data,4),chunk,(uInt) length)); + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + continue; + } + + if ((memcmp(type,mng_JDAA,4) == 0) || (memcmp(type,mng_JdAA,4) == 0)) + { + /* Copy chunk data to alpha_image->blob */ + + if ((alpha_image != NULL) && (image_info->ping == MagickFalse) && + (length != 0)) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Copying JDAA chunk data to alpha_blob."); + + (void) WriteBlob(alpha_image,length,chunk); + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + continue; + } + + if (memcmp(type,mng_JSEP,4) == 0) + { + read_JSEP=MagickTrue; + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + continue; + } + + if (memcmp(type,mng_bKGD,4) == 0) + { + if (length == 2) + { + image->background_color.red=ScaleCharToQuantum(p[1]); + image->background_color.green=image->background_color.red; + image->background_color.blue=image->background_color.red; + } + + if (length == 6) + { + image->background_color.red=ScaleCharToQuantum(p[1]); + image->background_color.green=ScaleCharToQuantum(p[3]); + image->background_color.blue=ScaleCharToQuantum(p[5]); + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_gAMA,4) == 0) + { + if (length == 4) + image->gamma=((float) mng_get_long(p))*0.00001; + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_cHRM,4) == 0) + { + if (length == 32) + { + image->chromaticity.white_point.x=0.00001*mng_get_long(p); + image->chromaticity.white_point.y=0.00001*mng_get_long(&p[4]); + image->chromaticity.red_primary.x=0.00001*mng_get_long(&p[8]); + image->chromaticity.red_primary.y=0.00001*mng_get_long(&p[12]); + image->chromaticity.green_primary.x=0.00001*mng_get_long(&p[16]); + image->chromaticity.green_primary.y=0.00001*mng_get_long(&p[20]); + image->chromaticity.blue_primary.x=0.00001*mng_get_long(&p[24]); + image->chromaticity.blue_primary.y=0.00001*mng_get_long(&p[28]); + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_sRGB,4) == 0) + { + if (length == 1) + { + image->rendering_intent= + Magick_RenderingIntent_from_PNG_RenderingIntent(p[0]); + image->gamma=0.45455f; + image->chromaticity.red_primary.x=0.6400f; + image->chromaticity.red_primary.y=0.3300f; + image->chromaticity.green_primary.x=0.3000f; + image->chromaticity.green_primary.y=0.6000f; + image->chromaticity.blue_primary.x=0.1500f; + image->chromaticity.blue_primary.y=0.0600f; + image->chromaticity.white_point.x=0.3127f; + image->chromaticity.white_point.y=0.3290f; + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_oFFs,4) == 0) + { + if (length > 8) + { + image->page.x=(ssize_t) mng_get_long(p); + image->page.y=(ssize_t) mng_get_long(&p[4]); + + if ((int) p[8] != 0) + { + image->page.x/=10000; + image->page.y/=10000; + } + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + continue; + } + + if (memcmp(type,mng_pHYs,4) == 0) + { + if (length > 8) + { + image->x_resolution=(double) mng_get_long(p); + image->y_resolution=(double) mng_get_long(&p[4]); + if ((int) p[8] == PNG_RESOLUTION_METER) + { + image->units=PixelsPerCentimeterResolution; + image->x_resolution=image->x_resolution/100.0f; + image->y_resolution=image->y_resolution/100.0f; + } + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + +#if 0 + if (memcmp(type,mng_iCCP,4) == 0) + { + /* To do: */ + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + continue; + } +#endif + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + if (memcmp(type,mng_IEND,4)) + continue; + + break; + } + + + /* IEND found */ + + /* + Finish up reading image data: + + o read main image from color_blob. + + o close color_blob. + + o if (color_type has alpha) + if alpha_encoding is PNG + read secondary image from alpha_blob via ReadPNG + if alpha_encoding is JPEG + read secondary image from alpha_blob via ReadJPEG + + o close alpha_blob. + + o copy intensity of secondary image into + opacity samples of main image. + + o destroy the secondary image. + */ + + if (color_image_info == (ImageInfo *) NULL) + { + assert(color_image == (Image *) NULL); + assert(alpha_image == (Image *) NULL); + if (color_image != (Image *) NULL) + color_image=DestroyImageList(color_image); + return(DestroyImageList(image)); + } + + if (color_image == (Image *) NULL) + { + assert(alpha_image == (Image *) NULL); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + + (void) SeekBlob(color_image,0,SEEK_SET); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading jng_image from color_blob."); + + assert(color_image_info != (ImageInfo *) NULL); + (void) FormatLocaleString(color_image_info->filename,MaxTextExtent,"jpeg:%s", + color_image->filename); + + color_image_info->ping=MagickFalse; /* To do: avoid this */ + jng_image=ReadImage(color_image_info,exception); + + (void) RelinquishUniqueFileResource(color_image->filename); + unique_filenames--; + color_image=DestroyImageList(color_image); + color_image_info=DestroyImageInfo(color_image_info); + + if (jng_image == (Image *) NULL) + { + DestroyJNG(NULL,NULL,NULL,&alpha_image,&alpha_image_info); + return(DestroyImageList(image)); + } + + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Copying jng_image pixels to main image."); + image->columns=jng_width; + image->rows=jng_height; + length=image->columns*sizeof(PixelPacket); + + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + jng_image=DestroyImageList(jng_image); + DestroyJNG(NULL,&color_image,&color_image_info,&alpha_image, + &alpha_image_info); + return(DestroyImageList(image)); + } + if ((image->columns != jng_image->columns) || + (image->rows != jng_image->rows)) + { + jng_image=DestroyImageList(jng_image); + DestroyJNG(NULL,&color_image,&color_image_info,&alpha_image, + &alpha_image_info); + return(DestroyImageList(image)); + } + + for (y=0; y < (ssize_t) image->rows; y++) + { + s=GetVirtualPixels(jng_image,0,y,image->columns,1,exception); + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if ((s == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + break; + (void) memcpy(q,s,length); + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + + jng_image=DestroyImage(jng_image); + + if ((image_info->ping == MagickFalse) && (alpha_image != (Image *) NULL) && + (jng_color_type >= 12)) + { + switch (jng_alpha_compression_method) + { + case 0: + { + png_byte + data[5]; + + (void) FormatLocaleString(alpha_image_info->filename,MagickPathExtent, + "png:%s",alpha_image->filename); + (void) WriteBlobMSBULong(alpha_image,0x00000000L); + PNGType(data,mng_IEND); + LogPNGChunk(logging,mng_IEND,0L); + (void) WriteBlob(alpha_image,4,data); + (void) WriteBlobMSBULong(alpha_image,crc32(0,data,4)); + break; + } + case 8: + { + (void) FormatLocaleString(alpha_image_info->filename,MagickPathExtent, + "jpeg:%s",alpha_image->filename); + break; + } + default: + { + (void) FormatLocaleString(alpha_image_info->filename,MagickPathExtent, + "alpha:%s",alpha_image->filename); + break; + } + } + (void) CloseBlob(alpha_image); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading opacity from alpha_blob."); + jng_image=ReadImage(alpha_image_info,exception); + + if (jng_image != (Image *) NULL) + for (y=0; y < (ssize_t) image->rows; y++) + { + s=GetVirtualPixels(jng_image,0,y,image->columns,1,&image->exception); + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if ((s == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + break; + + if (image->matte != MagickFalse) + for (x=(ssize_t) image->columns; x != 0; x--,q++,s++) + SetPixelOpacity(q,QuantumRange-GetPixelRed(s)); + + else + for (x=(ssize_t) image->columns; x != 0; x--,q++,s++) + { + SetPixelAlpha(q,GetPixelRed(s)); + if (GetPixelOpacity(q) != OpaqueOpacity) + image->matte=MagickTrue; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + (void) RelinquishUniqueFileResource(alpha_image->filename); + unique_filenames--; + alpha_image=DestroyImageList(alpha_image); + alpha_image_info=DestroyImageInfo(alpha_image_info); + if (jng_image != (Image *) NULL) + jng_image=DestroyImageList(jng_image); + } + + if (alpha_image != (Image *) NULL) + alpha_image=DestroyImageList(alpha_image); + if (alpha_image_info != (ImageInfo *) NULL) + alpha_image_info=DestroyImageInfo(alpha_image_info); + + /* Read the JNG image. */ + + if (mng_info->mng_type == 0) + { + mng_info->mng_width=jng_width; + mng_info->mng_height=jng_height; + } + + if (image->page.width == 0 && image->page.height == 0) + { + image->page.width=jng_width; + image->page.height=jng_height; + } + + if (image->page.x == 0 && image->page.y == 0) + { + image->page.x=mng_info->x_off[mng_info->object_id]; + image->page.y=mng_info->y_off[mng_info->object_id]; + } + + else + { + image->page.y=mng_info->y_off[mng_info->object_id]; + } + + mng_info->image_found++; + status=SetImageProgress(image,LoadImagesTag,2*TellBlob(image), + 2*GetBlobSize(image)); + + if (status == MagickFalse) + return(DestroyImageList(image)); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " exit ReadOneJNGImage(); unique_filenames=%d",unique_filenames); + + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d J N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadJNGImage() reads a JPEG Network Graphics (JNG) image file +% (including the 8-byte signature) and returns it. It allocates the memory +% necessary for the new Image structure and returns a pointer to the new +% image. +% +% JNG support written by Glenn Randers-Pehrson, glennrp@image... +% +% The format of the ReadJNGImage method is: +% +% Image *ReadJNGImage(const ImageInfo *image_info, ExceptionInfo +% *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static Image *ReadJNGImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + logging, + status; + + MngInfo + *mng_info; + + char + magic_number[MaxTextExtent]; + + size_t + count; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadJNGImage()"); + image=AcquireImage(image_info); + mng_info=(MngInfo *) NULL; + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + + if (status == MagickFalse) + return(DestroyImageList(image)); + + if (LocaleCompare(image_info->magick,"JNG") != 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + + /* Verify JNG signature. */ + + count=(size_t) ReadBlob(image,8,(unsigned char *) magic_number); + + if ((count < 8) || (memcmp(magic_number,"\213JNG\r\n\032\n",8) != 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + + /* + Verify that file size large enough to contain a JNG datastream. + */ + if (GetBlobSize(image) < 147) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + + /* Allocate a MngInfo structure. */ + + mng_info=(MngInfo *) AcquireMagickMemory(sizeof(*mng_info)); + + if (mng_info == (MngInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + + /* Initialize members of the MngInfo structure. */ + + (void) memset(mng_info,0,sizeof(MngInfo)); + + mng_info->image=image; + image=ReadOneJNGImage(mng_info,image_info,exception); + mng_info=MngInfoFreeStruct(mng_info); + + if (image == (Image *) NULL) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "exit ReadJNGImage() with error"); + + return((Image *) NULL); + } + (void) CloseBlob(image); + + if (image->columns == 0 || image->rows == 0) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "exit ReadJNGImage() with error"); + + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadJNGImage()"); + + return(image); +} +#endif + +static Image *ReadOneMNGImage(MngInfo* mng_info, const ImageInfo *image_info, + ExceptionInfo *exception) +{ + char + page_geometry[MaxTextExtent]; + + Image + *image; + + MagickBooleanType + logging; + + volatile int + first_mng_object, + object_id, + term_chunk_found, + skip_to_iend; + + volatile ssize_t + image_count=0; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + MngBox + default_fb, + fb, + previous_fb; + +#if defined(MNG_INSERT_LAYERS) + PixelPacket + mng_background_color; +#endif + + unsigned char + *p; + + ssize_t + i; + + size_t + count; + + ssize_t + loop_level; + + volatile short + skipping_loop; + +#if defined(MNG_INSERT_LAYERS) + unsigned int + mandatory_back=0; +#endif + + volatile unsigned int +#ifdef MNG_OBJECT_BUFFERS + mng_background_object=0, +#endif + mng_type=0; /* 0: PNG or JNG; 1: MNG; 2: MNG-LC; 3: MNG-VLC */ + + size_t + default_frame_timeout, + frame_timeout, +#if defined(MNG_INSERT_LAYERS) + image_height, + image_width, +#endif + length; + + /* These delays are all measured in image ticks_per_second, + * not in MNG ticks_per_second + */ + volatile size_t + default_frame_delay, + final_delay, + final_image_delay, + frame_delay, +#if defined(MNG_INSERT_LAYERS) + insert_layers, +#endif + mng_iterations=1, + simplicity=0, + subframe_height=0, + subframe_width=0; + + previous_fb.top=0; + previous_fb.bottom=0; + previous_fb.left=0; + previous_fb.right=0; + default_fb.top=0; + default_fb.bottom=0; + default_fb.left=0; + default_fb.right=0; + + logging=LogMagickEvent(CoderEvent,GetMagickModule(), + " Enter ReadOneMNGImage()"); + + image=mng_info->image; + + if (LocaleCompare(image_info->magick,"MNG") == 0) + { + char + magic_number[MaxTextExtent]; + + /* Verify MNG signature. */ + count=(size_t) ReadBlob(image,8,(unsigned char *) magic_number); + if ((count < 8) || (memcmp(magic_number,"\212MNG\r\n\032\n",8) != 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + + /* Initialize some nonzero members of the MngInfo structure. */ + for (i=0; i < MNG_MAX_OBJECTS; i++) + { + mng_info->object_clip[i].right=(ssize_t) PNG_UINT_31_MAX; + mng_info->object_clip[i].bottom=(ssize_t) PNG_UINT_31_MAX; + } + mng_info->exists[0]=MagickTrue; + } + + skipping_loop=(-1); + first_mng_object=MagickTrue; + mng_type=0; +#if defined(MNG_INSERT_LAYERS) + insert_layers=MagickFalse; /* should be False when converting or mogrifying */ +#endif + default_frame_delay=0; + default_frame_timeout=0; + frame_delay=0; + final_delay=1; + mng_info->ticks_per_second=1UL*image->ticks_per_second; + object_id=0; + skip_to_iend=MagickFalse; + term_chunk_found=MagickFalse; + mng_info->framing_mode=1; +#if defined(MNG_INSERT_LAYERS) + mandatory_back=MagickFalse; +#endif +#if defined(MNG_INSERT_LAYERS) + mng_background_color=image->background_color; +#endif + default_fb=mng_info->frame; + previous_fb=mng_info->frame; + do + { + char + type[MaxTextExtent]; + + if (LocaleCompare(image_info->magick,"MNG") == 0) + { + unsigned char + *chunk; + + /* + Read a new chunk. + */ + type[0]='\0'; + (void) ConcatenateMagickString(type,"errr",MaxTextExtent); + length=(size_t) ReadBlobMSBLong(image); + count=(size_t) ReadBlob(image,4,(unsigned char *) type); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reading MNG chunk type %c%c%c%c, length: %.20g", + type[0],type[1],type[2],type[3],(double) length); + + if ((length > PNG_UINT_31_MAX) || (length > GetBlobSize(image)) || + (count < 4)) + ThrowReaderException(CorruptImageError,"CorruptImage"); + + p=NULL; + chunk=(unsigned char *) NULL; + + if (length != 0) + { + chunk=(unsigned char *) AcquireQuantumMemory(length,sizeof(*chunk)); + + if (chunk == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + + for (i=0; i < (ssize_t) length; i++) + { + int + c; + + c=ReadBlobByte(image); + if (c == EOF) + { + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + } + chunk[i]=(unsigned char) c; + } + + p=chunk; + } + + (void) ReadBlobMSBLong(image); /* read crc word */ + +#if !defined(JNG_SUPPORTED) + if (memcmp(type,mng_JHDR,4) == 0) + { + skip_to_iend=MagickTrue; + + if (mng_info->jhdr_warning == 0) + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError,"JNGCompressNotSupported","`%s'",image->filename); + + mng_info->jhdr_warning++; + } +#endif + if (memcmp(type,mng_DHDR,4) == 0) + { + skip_to_iend=MagickTrue; + + if (mng_info->dhdr_warning == 0) + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError,"DeltaPNGNotSupported","`%s'",image->filename); + + mng_info->dhdr_warning++; + } + if (memcmp(type,mng_MEND,4) == 0) + { + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + break; + } + + if (skip_to_iend) + { + if (memcmp(type,mng_IEND,4) == 0) + skip_to_iend=MagickFalse; + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Skip to IEND."); + + continue; + } + + if (memcmp(type,mng_MHDR,4) == 0) + { + if (length != 28) + { + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + + mng_info->mng_width=(unsigned long)mng_get_long(p); + mng_info->mng_height=(unsigned long)mng_get_long(&p[4]); + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " MNG width: %.20g",(double) mng_info->mng_width); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " MNG height: %.20g",(double) mng_info->mng_height); + } + + p+=8; + mng_info->ticks_per_second=(size_t) mng_get_long(p); + + if (mng_info->ticks_per_second == 0) + default_frame_delay=0; + + else + default_frame_delay=1UL*image->ticks_per_second/ + mng_info->ticks_per_second; + + frame_delay=default_frame_delay; + simplicity=0; + + /* Skip nominal layer count, frame count, and play time */ + p+=16; + simplicity=(size_t) mng_get_long(p); + + mng_type=1; /* Full MNG */ + + if ((simplicity != 0) && ((simplicity | 11) == 11)) + mng_type=2; /* LC */ + + if ((simplicity != 0) && ((simplicity | 9) == 9)) + mng_type=3; /* VLC */ + +#if defined(MNG_INSERT_LAYERS) + if (mng_type != 3) + insert_layers=MagickTrue; +#endif + if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) + { + /* Allocate next image structure. */ + AcquireNextImage(image_info,image); + + if (GetNextImageInList(image) == (Image *) NULL) + return(DestroyImageList(image)); + + image=SyncNextImageInList(image); + mng_info->image=image; + } + + if ((mng_info->mng_width > 65535L) || + (mng_info->mng_height > 65535L)) + { + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + ThrowReaderException(ImageError,"WidthOrHeightExceedsLimit"); + } + + (void) FormatLocaleString(page_geometry,MaxTextExtent, + "%.20gx%.20g+0+0",(double) mng_info->mng_width,(double) + mng_info->mng_height); + + mng_info->frame.left=0; + mng_info->frame.right=(ssize_t) mng_info->mng_width; + mng_info->frame.top=0; + mng_info->frame.bottom=(ssize_t) mng_info->mng_height; + mng_info->clip=default_fb=previous_fb=mng_info->frame; + + for (i=0; i < MNG_MAX_OBJECTS; i++) + mng_info->object_clip[i]=mng_info->frame; + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_TERM,4) == 0) + { + int + repeat=0; + + if (length != 0) + repeat=p[0]; + + if ((repeat == 3) && (length > 9)) + { + final_delay=(png_uint_32) mng_get_long(&p[2]); + mng_iterations=(png_uint_32) mng_get_long(&p[6]); + + if (mng_iterations == PNG_UINT_31_MAX) + mng_iterations=0; + + image->iterations=mng_iterations; + term_chunk_found=MagickTrue; + } + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " repeat=%d, final_delay=%.20g, iterations=%.20g", + repeat,(double) final_delay, (double) image->iterations); + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + if (memcmp(type,mng_DEFI,4) == 0) + { + if (mng_type == 3) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CoderError,"DEFI chunk found in MNG-VLC datastream","`%s'", + image->filename); + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (length < 2) + { + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + + object_id=((unsigned int) p[0] << 8) | (unsigned int) p[1]; + + if (mng_type == 2 && object_id != 0) + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError,"Nonzero object_id in MNG-LC datastream","`%s'", + image->filename); + + if (object_id >= MNG_MAX_OBJECTS) + { + /* + Instead of using a warning we should allocate a larger + MngInfo structure and continue. + */ + (void) ThrowMagickException(&image->exception, + GetMagickModule(), CoderError, + "object id too large","`%s'",image->filename); + object_id=MNG_MAX_OBJECTS-1; + } + + if (mng_info->exists[object_id]) + if (mng_info->frozen[object_id]) + { + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + (void) ThrowMagickException(&image->exception, + GetMagickModule(),CoderError, + "DEFI cannot redefine a frozen MNG object","`%s'", + image->filename); + continue; + } + + mng_info->exists[object_id]=MagickTrue; + + if (length > 2) + mng_info->invisible[object_id]=p[2]; + + /* + Extract object offset info. + */ + if (length > 11) + { + mng_info->x_off[object_id]=(ssize_t) mng_get_long(&p[4]); + mng_info->y_off[object_id]=(ssize_t) mng_get_long(&p[8]); + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " x_off[%d]: %.20g, y_off[%d]: %.20g", + object_id,(double) mng_info->x_off[object_id], + object_id,(double) mng_info->y_off[object_id]); + } + } + + /* + Extract object clipping info. + */ + + if (length > 27) + mng_info->object_clip[object_id]= + mng_read_box(mng_info->frame,0, &p[12]); + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + if (memcmp(type,mng_bKGD,4) == 0) + { + mng_info->have_global_bkgd=MagickFalse; + + if (length > 5) + { + mng_info->mng_global_bkgd.red= + ScaleShortToQuantum((unsigned short) ((p[0] << 8) | p[1])); + + mng_info->mng_global_bkgd.green= + ScaleShortToQuantum((unsigned short) ((p[2] << 8) | p[3])); + + mng_info->mng_global_bkgd.blue= + ScaleShortToQuantum((unsigned short) ((p[4] << 8) | p[5])); + + mng_info->have_global_bkgd=MagickTrue; + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + if (memcmp(type,mng_BACK,4) == 0) + { +#if defined(MNG_INSERT_LAYERS) + if (length > 6) + mandatory_back=p[6]; + + else + mandatory_back=0; + + if (mandatory_back && length > 5) + { + mng_background_color.red= + ScaleShortToQuantum((unsigned short) ((p[0] << 8) | p[1])); + + mng_background_color.green= + ScaleShortToQuantum((unsigned short) ((p[2] << 8) | p[3])); + + mng_background_color.blue= + ScaleShortToQuantum((unsigned short) ((p[4] << 8) | p[5])); + + mng_background_color.opacity=OpaqueOpacity; + } + +#ifdef MNG_OBJECT_BUFFERS + if (length > 8) + mng_background_object=(p[7] << 8) | p[8]; +#endif +#endif + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_PLTE,4) == 0) + { + /* Read global PLTE. */ + + if (length && (length < 769)) + { + if (mng_info->global_plte == (png_colorp) NULL) + mng_info->global_plte=(png_colorp) AcquireQuantumMemory(256, + sizeof(*mng_info->global_plte)); + + if (mng_info->global_plte == (png_colorp) NULL) + { + mng_info->global_plte_length=0; + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + } + + for (i=0; i < (ssize_t) (length/3); i++) + { + mng_info->global_plte[i].red=p[3*i]; + mng_info->global_plte[i].green=p[3*i+1]; + mng_info->global_plte[i].blue=p[3*i+2]; + } + + mng_info->global_plte_length=(unsigned int) (length/3); + } +#ifdef MNG_LOOSE + for ( ; i < 256; i++) + { + mng_info->global_plte[i].red=i; + mng_info->global_plte[i].green=i; + mng_info->global_plte[i].blue=i; + } + + if (length != 0) + mng_info->global_plte_length=256; +#endif + else + mng_info->global_plte_length=0; + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_tRNS,4) == 0) + { + /* read global tRNS */ + + if (length > 0 && length < 257) + for (i=0; i < (ssize_t) length; i++) + mng_info->global_trns[i]=p[i]; + +#ifdef MNG_LOOSE + for ( ; i < 256; i++) + mng_info->global_trns[i]=255; +#endif + mng_info->global_trns_length=(unsigned int) length; + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + if (memcmp(type,mng_gAMA,4) == 0) + { + if (length == 4) + { + ssize_t + igamma; + + igamma=mng_get_long(p); + mng_info->global_gamma=((float) igamma)*0.00001; + mng_info->have_global_gama=MagickTrue; + } + + else + mng_info->have_global_gama=MagickFalse; + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_cHRM,4) == 0) + { + /* Read global cHRM */ + + if (length == 32) + { + mng_info->global_chrm.white_point.x=0.00001*mng_get_long(p); + mng_info->global_chrm.white_point.y=0.00001*mng_get_long(&p[4]); + mng_info->global_chrm.red_primary.x=0.00001*mng_get_long(&p[8]); + mng_info->global_chrm.red_primary.y=0.00001* + mng_get_long(&p[12]); + mng_info->global_chrm.green_primary.x=0.00001* + mng_get_long(&p[16]); + mng_info->global_chrm.green_primary.y=0.00001* + mng_get_long(&p[20]); + mng_info->global_chrm.blue_primary.x=0.00001* + mng_get_long(&p[24]); + mng_info->global_chrm.blue_primary.y=0.00001* + mng_get_long(&p[28]); + mng_info->have_global_chrm=MagickTrue; + } + else + mng_info->have_global_chrm=MagickFalse; + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_sRGB,4) == 0) + { + /* + Read global sRGB. + */ + if (length != 0) + { + mng_info->global_srgb_intent= + Magick_RenderingIntent_from_PNG_RenderingIntent(p[0]); + mng_info->have_global_srgb=MagickTrue; + } + else + mng_info->have_global_srgb=MagickFalse; + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_iCCP,4) == 0) + { + /* To do: */ + + /* + Read global iCCP. + */ + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + continue; + } + + if (memcmp(type,mng_FRAM,4) == 0) + { + if (mng_type == 3) + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError,"FRAM chunk found in MNG-VLC datastream","`%s'", + image->filename); + + if ((mng_info->framing_mode == 2) || (mng_info->framing_mode == 4)) + image->delay=frame_delay; + + frame_delay=default_frame_delay; + frame_timeout=default_frame_timeout; + fb=default_fb; + + if (length > 0) + if (p[0]) + mng_info->framing_mode=p[0]; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Framing_mode=%d",mng_info->framing_mode); + + if (length > 6) + { + /* Note the delay and frame clipping boundaries. */ + + p++; /* framing mode */ + + while (((p-chunk) < (long) length) && *p) + p++; /* frame name */ + + p++; /* frame name terminator */ + + if ((p-chunk) < (ssize_t) (length-4)) + { + int + change_delay, + change_timeout, + change_clipping; + + change_delay=(*p++); + change_timeout=(*p++); + change_clipping=(*p++); + p++; /* change_sync */ + + if (change_delay && ((p-chunk) < (ssize_t) (length-4))) + { + frame_delay=1UL*image->ticks_per_second* + mng_get_long(p); + + if (mng_info->ticks_per_second != 0) + frame_delay/=mng_info->ticks_per_second; + + else + frame_delay=PNG_UINT_31_MAX; + + if (change_delay == 2) + default_frame_delay=frame_delay; + + p+=4; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Framing_delay=%.20g",(double) frame_delay); + } + + if (change_timeout && ((p-chunk) < (ssize_t) (length-4))) + { + frame_timeout=1UL*image->ticks_per_second* + mng_get_long(p); + + if (mng_info->ticks_per_second != 0) + frame_timeout/=mng_info->ticks_per_second; + + else + frame_timeout=PNG_UINT_31_MAX; + + if (change_timeout == 2) + default_frame_timeout=frame_timeout; + + p+=4; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Framing_timeout=%.20g",(double) frame_timeout); + } + + if (change_clipping && ((p-chunk) < (ssize_t) (length-16))) + { + fb=mng_read_box(previous_fb,(char) p[0],&p[1]); + p+=16; + previous_fb=fb; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Frame_clip: L=%.20g R=%.20g T=%.20g B=%.20g", + (double) fb.left,(double) fb.right,(double) fb.top, + (double) fb.bottom); + + if (change_clipping == 2) + default_fb=fb; + } + } + } + mng_info->clip=fb; + mng_info->clip=mng_minimum_box(fb,mng_info->frame); + + subframe_width=(size_t) (mng_info->clip.right- + mng_info->clip.left); + + subframe_height=(size_t) (mng_info->clip.bottom- + mng_info->clip.top); + /* + Insert a background layer behind the frame if framing_mode is 4. + */ +#if defined(MNG_INSERT_LAYERS) + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " subframe_width=%.20g, subframe_height=%.20g",(double) + subframe_width,(double) subframe_height); + + if (insert_layers && (mng_info->framing_mode == 4) && + (subframe_width) && (subframe_height)) + { + /* Allocate next image structure. */ + if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) + { + AcquireNextImage(image_info,image); + + if (GetNextImageInList(image) == (Image *) NULL) + return(DestroyImageList(image)); + + image=SyncNextImageInList(image); + } + + mng_info->image=image; + + if (term_chunk_found) + { + image->start_loop=MagickTrue; + image->iterations=mng_iterations; + term_chunk_found=MagickFalse; + } + + else + image->start_loop=MagickFalse; + + image->columns=subframe_width; + image->rows=subframe_height; + image->page.width=subframe_width; + image->page.height=subframe_height; + image->page.x=mng_info->clip.left; + image->page.y=mng_info->clip.top; + image->background_color=mng_background_color; + image->matte=MagickFalse; + image->delay=0; + if (SetImageBackgroundColor(image) == MagickFalse) + { + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Insert backgd layer, L=%.20g, R=%.20g T=%.20g, B=%.20g", + (double) mng_info->clip.left,(double) mng_info->clip.right, + (double) mng_info->clip.top,(double) mng_info->clip.bottom); + } +#endif + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + if (memcmp(type,mng_CLIP,4) == 0) + { + unsigned int + first_object, + last_object; + + /* + Read CLIP. + */ + if (length > 3) + { + first_object=(p[0] << 8) | p[1]; + last_object=(p[2] << 8) | p[3]; + p+=4; + + for (i=(int) first_object; i <= (int) last_object; i++) + { + if ((i < 0) || (i >= MNG_MAX_OBJECTS)) + continue; + if (mng_info->exists[i] && !mng_info->frozen[i]) + { + MngBox + box; + + box=mng_info->object_clip[i]; + if ((p-chunk) < (ssize_t) (length-17)) + mng_info->object_clip[i]= + mng_read_box(box,(char) p[0],&p[1]); + } + } + + } + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + if (memcmp(type,mng_SAVE,4) == 0) + { + for (i=1; i < MNG_MAX_OBJECTS; i++) + if (mng_info->exists[i]) + { + mng_info->frozen[i]=MagickTrue; +#ifdef MNG_OBJECT_BUFFERS + if (mng_info->ob[i] != (MngBuffer *) NULL) + mng_info->ob[i]->frozen=MagickTrue; +#endif + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + continue; + } + + if ((memcmp(type,mng_DISC,4) == 0) || (memcmp(type,mng_SEEK,4) == 0)) + { + /* Read DISC or SEEK. */ + + if ((length == 0) || (length % 2) || !memcmp(type,mng_SEEK,4)) + { + for (i=1; i < MNG_MAX_OBJECTS; i++) + MngInfoDiscardObject(mng_info,i); + } + + else + { + ssize_t + j; + + for (j=1; j < (ssize_t) length; j+=2) + { + i=p[j-1] << 8 | p[j]; + MngInfoDiscardObject(mng_info,i); + } + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + continue; + } + + if (memcmp(type,mng_MOVE,4) == 0) + { + size_t + first_object, + last_object; + + /* read MOVE */ + + if (length > 3) + { + first_object=(p[0] << 8) | p[1]; + last_object=(p[2] << 8) | p[3]; + p+=4; + + for (i=(ssize_t) first_object; i <= (ssize_t) last_object; i++) + { + if ((i < 0) || (i >= MNG_MAX_OBJECTS)) + continue; + if (mng_info->exists[i] && !mng_info->frozen[i] && + (p-chunk) < (ssize_t) (length-8)) + { + MngPair + new_pair; + + MngPair + old_pair; + + old_pair.a=mng_info->x_off[i]; + old_pair.b=mng_info->y_off[i]; + new_pair=mng_read_pair(old_pair,(int) p[0],&p[1]); + mng_info->x_off[i]=new_pair.a; + mng_info->y_off[i]=new_pair.b; + } + } + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_LOOP,4) == 0) + { + ssize_t loop_iters=1; + if (length > 4) + { + loop_level=chunk[0]; + mng_info->loop_active[loop_level]=1; /* mark loop active */ + + /* Record starting point. */ + loop_iters=mng_get_long(&chunk[1]); + loop_iters=mng_get_long(&chunk[1]); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " LOOP level %.20g has %.20g iterations ", + (double) loop_level, (double) loop_iters); + + if (loop_iters <= 0) + skipping_loop=loop_level; + + else + { + if ((MagickSizeType) loop_iters > GetMagickResourceLimit(ListLengthResource)) + loop_iters=GetMagickResourceLimit(ListLengthResource); + if (loop_iters >= 2147483647L) + loop_iters=2147483647L; + if (image_info->number_scenes != 0) + if (loop_iters > image_info->number_scenes) + loop_iters=image_info->number_scenes; + mng_info->loop_jump[loop_level]=TellBlob(image); + mng_info->loop_count[loop_level]=loop_iters; + } + + mng_info->loop_iteration[loop_level]=0; + } + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_ENDL,4) == 0) + { + if (length > 0) + { + loop_level=chunk[0]; + + if (skipping_loop > 0) + { + if (skipping_loop == loop_level) + { + /* + Found end of zero-iteration loop. + */ + skipping_loop=(-1); + mng_info->loop_active[loop_level]=0; + } + } + + else + { + if (mng_info->loop_active[loop_level] == 1) + { + mng_info->loop_count[loop_level]--; + mng_info->loop_iteration[loop_level]++; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " ENDL: LOOP level %.20g has %.20g remaining iters ", + (double) loop_level,(double) + mng_info->loop_count[loop_level]); + + if (mng_info->loop_count[loop_level] > 0) + { + offset=SeekBlob(image, + mng_info->loop_jump[loop_level], SEEK_SET); + + if (offset < 0) + { + chunk=(unsigned char *) RelinquishMagickMemory( + chunk); + ThrowReaderException(CorruptImageError, + "ImproperImageHeader"); + } + } + + else + { + short + last_level; + + /* + Finished loop. + */ + mng_info->loop_active[loop_level]=0; + last_level=(-1); + for (i=0; i < loop_level; i++) + if (mng_info->loop_active[i] == 1) + last_level=(short) i; + loop_level=last_level; + } + } + } + } + + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_CLON,4) == 0) + { + if (mng_info->clon_warning == 0) + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError,"CLON is not implemented yet","`%s'", + image->filename); + + mng_info->clon_warning++; + } + + if (memcmp(type,mng_MAGN,4) == 0) + { + png_uint_16 + magn_first, + magn_last, + magn_mb, + magn_ml, + magn_mr, + magn_mt, + magn_mx, + magn_my, + magn_methx, + magn_methy; + + if (length > 1) + magn_first=(p[0] << 8) | p[1]; + + else + magn_first=0; + + if (length > 3) + magn_last=(p[2] << 8) | p[3]; + + else + magn_last=magn_first; +#ifndef MNG_OBJECT_BUFFERS + if (magn_first || magn_last) + if (mng_info->magn_warning == 0) + { + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError, + "MAGN is not implemented yet for nonzero objects", + "`%s'",image->filename); + + mng_info->magn_warning++; + } +#endif + if (length > 4) + magn_methx=p[4]; + + else + magn_methx=0; + + if (length > 6) + magn_mx=(p[5] << 8) | p[6]; + + else + magn_mx=1; + + if (magn_mx == 0) + magn_mx=1; + + if (length > 8) + magn_my=(p[7] << 8) | p[8]; + + else + magn_my=magn_mx; + + if (magn_my == 0) + magn_my=1; + + if (length > 10) + magn_ml=(p[9] << 8) | p[10]; + + else + magn_ml=magn_mx; + + if (magn_ml == 0) + magn_ml=1; + + if (length > 12) + magn_mr=(p[11] << 8) | p[12]; + + else + magn_mr=magn_mx; + + if (magn_mr == 0) + magn_mr=1; + + if (length > 14) + magn_mt=(p[13] << 8) | p[14]; + + else + magn_mt=magn_my; + + if (magn_mt == 0) + magn_mt=1; + + if (length > 16) + magn_mb=(p[15] << 8) | p[16]; + + else + magn_mb=magn_my; + + if (magn_mb == 0) + magn_mb=1; + + if (length > 17) + magn_methy=p[17]; + + else + magn_methy=magn_methx; + + + if (magn_methx > 5 || magn_methy > 5) + if (mng_info->magn_warning == 0) + { + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError, + "Unknown MAGN method in MNG datastream","`%s'", + image->filename); + + mng_info->magn_warning++; + } +#ifdef MNG_OBJECT_BUFFERS + /* Magnify existing objects in the range magn_first to magn_last */ +#endif + if (magn_first == 0 || magn_last == 0) + { + /* Save the magnification factors for object 0 */ + mng_info->magn_mb=magn_mb; + mng_info->magn_ml=magn_ml; + mng_info->magn_mr=magn_mr; + mng_info->magn_mt=magn_mt; + mng_info->magn_mx=magn_mx; + mng_info->magn_my=magn_my; + mng_info->magn_methx=magn_methx; + mng_info->magn_methy=magn_methy; + } + } + + if (memcmp(type,mng_PAST,4) == 0) + { + if (mng_info->past_warning == 0) + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError,"PAST is not implemented yet","`%s'", + image->filename); + + mng_info->past_warning++; + } + + if (memcmp(type,mng_SHOW,4) == 0) + { + if (mng_info->show_warning == 0) + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError,"SHOW is not implemented yet","`%s'", + image->filename); + + mng_info->show_warning++; + } + + if (memcmp(type,mng_sBIT,4) == 0) + { + if (length < 4) + mng_info->have_global_sbit=MagickFalse; + + else + { + mng_info->global_sbit.gray=p[0]; + mng_info->global_sbit.red=p[0]; + mng_info->global_sbit.green=p[1]; + mng_info->global_sbit.blue=p[2]; + mng_info->global_sbit.alpha=p[3]; + mng_info->have_global_sbit=MagickTrue; + } + } + if (memcmp(type,mng_pHYs,4) == 0) + { + if (length > 8) + { + mng_info->global_x_pixels_per_unit= + (size_t) mng_get_long(p); + mng_info->global_y_pixels_per_unit= + (size_t) mng_get_long(&p[4]); + mng_info->global_phys_unit_type=p[8]; + mng_info->have_global_phys=MagickTrue; + } + + else + mng_info->have_global_phys=MagickFalse; + } + if (memcmp(type,mng_pHYg,4) == 0) + { + if (mng_info->phyg_warning == 0) + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError,"pHYg is not implemented.","`%s'",image->filename); + + mng_info->phyg_warning++; + } + if (memcmp(type,mng_BASI,4) == 0) + { + skip_to_iend=MagickTrue; + + if (mng_info->basi_warning == 0) + (void) ThrowMagickException(exception,GetMagickModule(), + CoderError,"BASI is not implemented yet","`%s'", + image->filename); + + mng_info->basi_warning++; +#ifdef MNG_BASI_SUPPORTED + if (length > 11) + { + basi_width=(unsigned long) mng_get_long(p); + basi_width=(unsigned long) mng_get_long(&p[4]); + basi_color_type=p[8]; + basi_compression_method=p[9]; + basi_filter_type=p[10]; + basi_interlace_method=p[11]; + } + if (length > 13) + basi_red=(png_uint_32) p[12] << 8) & png_uint_32) p[13]; + + else + basi_red=0; + + if (length > 15) + basi_green=(png_uint_32) p[14] << 8) & png_uint_32) p[15]; + + else + basi_green=0; + + if (length > 17) + basi_blue=(png_uint_32) p[16] << 8) & png_uint_32) p[17]; + + else + basi_blue=0; + + if (length > 19) + basi_alpha=(png_uint_32) p[18] << 8) & png_uint_32) p[19]; + + else + { + if (basi_sample_depth == 16) + basi_alpha=65535L; + else + basi_alpha=255; + } + + if (length > 20) + basi_viewable=p[20]; + + else + basi_viewable=0; + +#endif + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } + + if (memcmp(type,mng_IHDR,4) +#if defined(JNG_SUPPORTED) + && memcmp(type,mng_JHDR,4) +#endif + ) + { + /* Not an IHDR or JHDR chunk */ + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + continue; + } +/* Process IHDR */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Processing %c%c%c%c chunk",type[0],type[1],type[2],type[3]); + + mng_info->exists[object_id]=MagickTrue; + mng_info->viewable[object_id]=MagickTrue; + + if (mng_info->invisible[object_id]) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Skipping invisible object"); + + skip_to_iend=MagickTrue; + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + continue; + } +#if defined(MNG_INSERT_LAYERS) + if (length < 8) + { + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + + image_width=(size_t) mng_get_long(p); + image_height=(size_t) mng_get_long(&p[4]); +#endif + chunk=(unsigned char *) RelinquishMagickMemory(chunk); + + /* + Insert a transparent background layer behind the entire animation + if it is not full screen. + */ +#if defined(MNG_INSERT_LAYERS) + if (insert_layers && mng_type && first_mng_object) + { + if ((mng_info->clip.left > 0) || (mng_info->clip.top > 0) || + (image_width < mng_info->mng_width) || + (mng_info->clip.right < (ssize_t) mng_info->mng_width) || + (image_height < mng_info->mng_height) || + (mng_info->clip.bottom < (ssize_t) mng_info->mng_height)) + { + if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + + if (GetNextImageInList(image) == (Image *) NULL) + return(DestroyImageList(image)); + + image=SyncNextImageInList(image); + } + mng_info->image=image; + + if (term_chunk_found) + { + image->start_loop=MagickTrue; + image->iterations=mng_iterations; + term_chunk_found=MagickFalse; + } + + else + image->start_loop=MagickFalse; + + /* Make a background rectangle. */ + + image->delay=0; + image->columns=mng_info->mng_width; + image->rows=mng_info->mng_height; + image->page.width=mng_info->mng_width; + image->page.height=mng_info->mng_height; + image->page.x=0; + image->page.y=0; + image->background_color=mng_background_color; + (void) SetImageBackgroundColor(image); + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Inserted transparent background layer, W=%.20g, H=%.20g", + (double) mng_info->mng_width,(double) mng_info->mng_height); + } + } + /* + Insert a background layer behind the upcoming image if + framing_mode is 3, and we haven't already inserted one. + */ + if (insert_layers && (mng_info->framing_mode == 3) && + (subframe_width) && (subframe_height) && (simplicity == 0 || + (simplicity & 0x08))) + { + if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + + if (GetNextImageInList(image) == (Image *) NULL) + return(DestroyImageList(image)); + + image=SyncNextImageInList(image); + } + + mng_info->image=image; + + if (term_chunk_found) + { + image->start_loop=MagickTrue; + image->iterations=mng_iterations; + term_chunk_found=MagickFalse; + } + + else + image->start_loop=MagickFalse; + + image->delay=0; + image->columns=subframe_width; + image->rows=subframe_height; + image->page.width=subframe_width; + image->page.height=subframe_height; + image->page.x=mng_info->clip.left; + image->page.y=mng_info->clip.top; + image->background_color=mng_background_color; + image->matte=MagickFalse; + (void) SetImageBackgroundColor(image); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Insert background layer, L=%.20g, R=%.20g T=%.20g, B=%.20g", + (double) mng_info->clip.left,(double) mng_info->clip.right, + (double) mng_info->clip.top,(double) mng_info->clip.bottom); + } +#endif /* MNG_INSERT_LAYERS */ + first_mng_object=MagickFalse; + + if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + + if (GetNextImageInList(image) == (Image *) NULL) + return(DestroyImageList(image)); + + image=SyncNextImageInList(image); + } + mng_info->image=image; + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + + if (status == MagickFalse) + break; + + if (term_chunk_found) + { + image->start_loop=MagickTrue; + term_chunk_found=MagickFalse; + } + + else + image->start_loop=MagickFalse; + + if (mng_info->framing_mode == 1 || mng_info->framing_mode == 3) + { + image->delay=frame_delay; + frame_delay=default_frame_delay; + } + + else + image->delay=0; + + image->page.width=mng_info->mng_width; + image->page.height=mng_info->mng_height; + image->page.x=mng_info->x_off[object_id]; + image->page.y=mng_info->y_off[object_id]; + image->iterations=mng_iterations; + + /* + Seek back to the beginning of the IHDR or JHDR chunk's length field. + */ + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Seeking back to beginning of %c%c%c%c chunk",type[0],type[1], + type[2],type[3]); + + offset=SeekBlob(image,-((ssize_t) length+12),SEEK_CUR); + + if (offset < 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + + mng_info->image=image; + mng_info->mng_type=mng_type; + mng_info->object_id=object_id; + + if (memcmp(type,mng_IHDR,4) == 0) + image=ReadOnePNGImage(mng_info,image_info,exception); + +#if defined(JNG_SUPPORTED) + else + image=ReadOneJNGImage(mng_info,image_info,exception); +#endif + + if (image == (Image *) NULL) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "exit ReadJNGImage() with error"); + + return((Image *) NULL); + } + + if (image->columns == 0 || image->rows == 0) + { + (void) CloseBlob(image); + return(DestroyImageList(image)); + } + + mng_info->image=image; + + if (mng_type) + { + MngBox + crop_box; + + if (((mng_info->magn_methx > 0) && (mng_info->magn_methx <= 5)) && + ((mng_info->magn_methy > 0) && (mng_info->magn_methy <= 5))) + { + png_uint_32 + magnified_height, + magnified_width; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Processing MNG MAGN chunk"); + + if (image->columns == 1) + mng_info->magn_methx = 1; + if (image->rows == 1) + mng_info->magn_methy = 1; + if (mng_info->magn_methx == 1) + { + magnified_width=mng_info->magn_ml; + + if (image->columns > 1) + magnified_width += mng_info->magn_mr; + + if (image->columns > 2) + magnified_width += (png_uint_32) + ((image->columns-2)*(mng_info->magn_mx)); + } + + else + { + magnified_width=(png_uint_32) image->columns; + + if (image->columns > 1) + magnified_width += mng_info->magn_ml-1; + + if (image->columns > 2) + magnified_width += mng_info->magn_mr-1; + + if (image->columns > 3) + magnified_width += (png_uint_32) + ((image->columns-3)*(mng_info->magn_mx-1)); + } + + if (mng_info->magn_methy == 1) + { + magnified_height=mng_info->magn_mt; + + if (image->rows > 1) + magnified_height += mng_info->magn_mb; + + if (image->rows > 2) + magnified_height += (png_uint_32) + ((image->rows-2)*(mng_info->magn_my)); + } + + else + { + magnified_height=(png_uint_32) image->rows; + + if (image->rows > 1) + magnified_height += mng_info->magn_mt-1; + + if (image->rows > 2) + magnified_height += mng_info->magn_mb-1; + + if (image->rows > 3) + magnified_height += (png_uint_32) + ((image->rows-3)*(mng_info->magn_my-1)); + } + + if (magnified_height > image->rows || + magnified_width > image->columns) + { + Image + *large_image; + + int + yy; + + ssize_t + m, + y; + + ssize_t + x; + + PixelPacket + *n, + *q; + + PixelPacket + *next, + *prev; + + png_uint_16 + magn_methx, + magn_methy; + + /* Allocate next image structure. */ + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Allocate magnified image"); + + AcquireNextImage(image_info,image); + + if (GetNextImageInList(image) == (Image *) NULL) + return(DestroyImageList(image)); + + large_image=SyncNextImageInList(image); + + large_image->columns=magnified_width; + large_image->rows=magnified_height; + + magn_methx=mng_info->magn_methx; + magn_methy=mng_info->magn_methy; + +#if (MAGICKCORE_QUANTUM_DEPTH > 16) +#define QM unsigned short + if (magn_methx != 1 || magn_methy != 1) + { + /* + Scale pixels to unsigned shorts to prevent + overflow of intermediate values of interpolations + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + for (x=(ssize_t) image->columns-1; x >= 0; x--) + { + SetPixelRed(q,ScaleQuantumToShort( + GetPixelRed(q))); + SetPixelGreen(q,ScaleQuantumToShort( + GetPixelGreen(q))); + SetPixelBlue(q,ScaleQuantumToShort( + GetPixelBlue(q))); + SetPixelOpacity(q,ScaleQuantumToShort( + GetPixelOpacity(q))); + q++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } +#else +#define QM Quantum +#endif + + if (image->matte != MagickFalse) + (void) SetImageBackgroundColor(large_image); + + else + { + large_image->background_color.opacity=OpaqueOpacity; + (void) SetImageBackgroundColor(large_image); + + if (magn_methx == 4) + magn_methx=2; + + if (magn_methx == 5) + magn_methx=3; + + if (magn_methy == 4) + magn_methy=2; + + if (magn_methy == 5) + magn_methy=3; + } + + /* magnify the rows into the right side of the large image */ + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Magnify the rows to %.20g",(double) large_image->rows); + m=(ssize_t) mng_info->magn_mt; + yy=0; + length=(size_t) image->columns; + next=(PixelPacket *) AcquireQuantumMemory(length,sizeof(*next)); + prev=(PixelPacket *) AcquireQuantumMemory(length,sizeof(*prev)); + + if ((prev == (PixelPacket *) NULL) || + (next == (PixelPacket *) NULL)) + { + if (prev != (PixelPacket *) NULL) + prev=(PixelPacket *) RelinquishMagickMemory(prev); + if (next != (PixelPacket *) NULL) + next=(PixelPacket *) RelinquishMagickMemory(next); + image=DestroyImageList(image); + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + } + + n=GetAuthenticPixels(image,0,0,image->columns,1,exception); + (void) memcpy(next,n,length); + + for (y=0; y < (ssize_t) image->rows; y++) + { + if (y == 0) + m=(ssize_t) mng_info->magn_mt; + + else if (magn_methy > 1 && y == (ssize_t) image->rows-2) + m=(ssize_t) mng_info->magn_mb; + + else if (magn_methy <= 1 && y == (ssize_t) image->rows-1) + m=(ssize_t) mng_info->magn_mb; + + else if (magn_methy > 1 && y == (ssize_t) image->rows-1) + m=1; + + else + m=(ssize_t) mng_info->magn_my; + + n=prev; + prev=next; + next=n; + + if (y < (ssize_t) image->rows-1) + { + n=GetAuthenticPixels(image,0,y+1,image->columns,1, + exception); + (void) memcpy(next,n,length); + } + + for (i=0; i < m; i++, yy++) + { + PixelPacket + *pixels; + + assert(yy < (ssize_t) large_image->rows); + pixels=prev; + n=next; + q=GetAuthenticPixels(large_image,0,yy,large_image->columns, + 1,exception); + if (q == (PixelPacket *) NULL) + break; + q+=(large_image->columns-image->columns); + + for (x=(ssize_t) image->columns-1; x >= 0; x--) + { + /* To do: get color as function of indexes[x] */ + /* + if (image->storage_class == PseudoClass) + { + } + */ + + if (magn_methy <= 1) + { + /* replicate previous */ + SetPixelRGBO(q,(pixels)); + } + + else if (magn_methy == 2 || magn_methy == 4) + { + if (i == 0) + { + SetPixelRGBO(q,(pixels)); + } + + else + { + /* Interpolate */ + SetPixelRed(q, + ((QM) (((ssize_t) + (2*i*(GetPixelRed(n) + -GetPixelRed(pixels)+m))/ + ((ssize_t) (m*2)) + +GetPixelRed(pixels))))); + SetPixelGreen(q, + ((QM) (((ssize_t) + (2*i*(GetPixelGreen(n) + -GetPixelGreen(pixels)+m))/ + ((ssize_t) (m*2)) + +GetPixelGreen(pixels))))); + SetPixelBlue(q, + ((QM) (((ssize_t) + (2*i*(GetPixelBlue(n) + -GetPixelBlue(pixels)+m))/ + ((ssize_t) (m*2)) + +GetPixelBlue(pixels))))); + + if (image->matte != MagickFalse) + SetPixelOpacity(q, + ((QM) (((ssize_t) + (2*i*(GetPixelOpacity(n) + -GetPixelOpacity(pixels)+m)) + /((ssize_t) (m*2))+ + GetPixelOpacity(pixels))))); + } + + if (magn_methy == 4) + { + /* Replicate nearest */ + if (i <= ((m+1) << 1)) + SetPixelOpacity(q, + (*pixels).opacity+0); + else + SetPixelOpacity(q, + (*n).opacity+0); + } + } + + else /* if (magn_methy == 3 || magn_methy == 5) */ + { + /* Replicate nearest */ + if (i <= ((m+1) << 1)) + { + SetPixelRGBO(q,(pixels)); + } + + else + { + SetPixelRGBO(q,(n)); + } + + if (magn_methy == 5) + { + SetPixelOpacity(q, + (QM) (((ssize_t) (2*i* + (GetPixelOpacity(n) + -GetPixelOpacity(pixels)) + +m))/((ssize_t) (m*2)) + +GetPixelOpacity(pixels))); + } + } + n++; + q++; + pixels++; + } /* x */ + + if (SyncAuthenticPixels(large_image,exception) == 0) + break; + + } /* i */ + } /* y */ + + prev=(PixelPacket *) RelinquishMagickMemory(prev); + next=(PixelPacket *) RelinquishMagickMemory(next); + + length=image->columns; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Delete original image"); + + DeleteImageFromList(&image); + + image=large_image; + + mng_info->image=image; + + /* magnify the columns */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Magnify the columns to %.20g",(double) image->columns); + + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *pixels; + + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + pixels=q+(image->columns-length); + n=pixels+1; + + for (x=(ssize_t) (image->columns-length); + x < (ssize_t) image->columns; x++) + { + /* To do: Rewrite using Get/Set***PixelComponent() */ + + if (x == (ssize_t) (image->columns-length)) + m=(ssize_t) mng_info->magn_ml; + + else if (magn_methx > 1 && x == (ssize_t) image->columns-2) + m=(ssize_t) mng_info->magn_mr; + + else if (magn_methx <= 1 && x == (ssize_t) image->columns-1) + m=(ssize_t) mng_info->magn_mr; + + else if (magn_methx > 1 && x == (ssize_t) image->columns-1) + m=1; + + else + m=(ssize_t) mng_info->magn_mx; + + for (i=0; i < m; i++) + { + if (magn_methx <= 1) + { + /* replicate previous */ + SetPixelRGBO(q,(pixels)); + } + + else if (magn_methx == 2 || magn_methx == 4) + { + if (i == 0) + { + SetPixelRGBO(q,(pixels)); + } + + /* To do: Rewrite using Get/Set***PixelComponent() */ + else + { + /* Interpolate */ + SetPixelRed(q, + (QM) ((2*i*( + GetPixelRed(n) + -GetPixelRed(pixels))+m) + /((ssize_t) (m*2))+ + GetPixelRed(pixels))); + + SetPixelGreen(q, + (QM) ((2*i*( + GetPixelGreen(n) + -GetPixelGreen(pixels))+m) + /((ssize_t) (m*2))+ + GetPixelGreen(pixels))); + + SetPixelBlue(q, + (QM) ((2*i*( + GetPixelBlue(n) + -GetPixelBlue(pixels))+m) + /((ssize_t) (m*2))+ + GetPixelBlue(pixels))); + if (image->matte != MagickFalse) + SetPixelOpacity(q, + (QM) ((2*i*( + GetPixelOpacity(n) + -GetPixelOpacity(pixels))+m) + /((ssize_t) (m*2))+ + GetPixelOpacity(pixels))); + } + + if (magn_methx == 4) + { + /* Replicate nearest */ + if (i <= ((m+1) << 1)) + { + SetPixelOpacity(q, + GetPixelOpacity(pixels)+0); + } + else + { + SetPixelOpacity(q, + GetPixelOpacity(n)+0); + } + } + } + + else /* if (magn_methx == 3 || magn_methx == 5) */ + { + /* Replicate nearest */ + if (i <= ((m+1) << 1)) + { + SetPixelRGBO(q,(pixels)); + } + + else + { + SetPixelRGBO(q,(n)); + } + + if (magn_methx == 5) + { + /* Interpolate */ + SetPixelOpacity(q, + (QM) ((2*i*( GetPixelOpacity(n) + -GetPixelOpacity(pixels))+m)/ + ((ssize_t) (m*2)) + +GetPixelOpacity(pixels))); + } + } + q++; + } + n++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } +#if (MAGICKCORE_QUANTUM_DEPTH > 16) + if (magn_methx != 1 || magn_methy != 1) + { + /* + Rescale pixels to Quantum + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + + for (x=(ssize_t) image->columns-1; x >= 0; x--) + { + SetPixelRed(q,ScaleShortToQuantum( + GetPixelRed(q))); + SetPixelGreen(q,ScaleShortToQuantum( + GetPixelGreen(q))); + SetPixelBlue(q,ScaleShortToQuantum( + GetPixelBlue(q))); + SetPixelOpacity(q,ScaleShortToQuantum( + GetPixelOpacity(q))); + q++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } +#endif + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Finished MAGN processing"); + } + } + + /* + Crop_box is with respect to the upper left corner of the MNG. + */ + crop_box.left=mng_info->image_box.left+mng_info->x_off[object_id]; + crop_box.right=mng_info->image_box.right+mng_info->x_off[object_id]; + crop_box.top=mng_info->image_box.top+mng_info->y_off[object_id]; + crop_box.bottom=mng_info->image_box.bottom+mng_info->y_off[object_id]; + crop_box=mng_minimum_box(crop_box,mng_info->clip); + crop_box=mng_minimum_box(crop_box,mng_info->frame); + crop_box=mng_minimum_box(crop_box,mng_info->object_clip[object_id]); + if ((crop_box.left != (mng_info->image_box.left + +mng_info->x_off[object_id])) || + (crop_box.right != (mng_info->image_box.right + +mng_info->x_off[object_id])) || + (crop_box.top != (mng_info->image_box.top + +mng_info->y_off[object_id])) || + (crop_box.bottom != (mng_info->image_box.bottom + +mng_info->y_off[object_id]))) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Crop the PNG image"); + + if ((crop_box.left < crop_box.right) && + (crop_box.top < crop_box.bottom)) + { + Image + *im; + + RectangleInfo + crop_info; + + /* + Crop_info is with respect to the upper left corner of + the image. + */ + crop_info.x=(crop_box.left-mng_info->x_off[object_id]); + crop_info.y=(crop_box.top-mng_info->y_off[object_id]); + crop_info.width=(size_t) (crop_box.right-crop_box.left); + crop_info.height=(size_t) (crop_box.bottom-crop_box.top); + image->page.width=image->columns; + image->page.height=image->rows; + image->page.x=0; + image->page.y=0; + im=CropImage(image,&crop_info,exception); + + if (im != (Image *) NULL) + { + image->columns=im->columns; + image->rows=im->rows; + im=DestroyImage(im); + image->page.width=image->columns; + image->page.height=image->rows; + image->page.x=crop_box.left; + image->page.y=crop_box.top; + } + } + + else + { + /* + No pixels in crop area. The MNG spec still requires + a layer, though, so make a single transparent pixel in + the top left corner. + */ + image->columns=1; + image->rows=1; + image->colors=2; + (void) SetImageBackgroundColor(image); + image->page.width=1; + image->page.height=1; + image->page.x=0; + image->page.y=0; + } + } +#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED + image=mng_info->image; +#endif + } + +#if (MAGICKCORE_QUANTUM_DEPTH > 16) + /* PNG does not handle depths greater than 16 so reduce it even + * if lossy, and promote any depths > 8 to 16. + */ + if (image->depth > 16) + image->depth=16; +#endif + +#if (MAGICKCORE_QUANTUM_DEPTH > 8) + if (image->depth > 8) + { + /* To do: fill low byte properly */ + image->depth=16; + } + + if (LosslessReduceDepthOK(image) != MagickFalse) + image->depth = 8; +#endif + + GetImageException(image,exception); + + if (image_info->number_scenes != 0) + { + if (mng_info->scenes_found > + (ssize_t) (image_info->first_scene+image_info->number_scenes)) + break; + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Finished reading image datastream."); + + } while (LocaleCompare(image_info->magick,"MNG") == 0); + + (void) CloseBlob(image); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Finished reading all image datastreams."); + +#if defined(MNG_INSERT_LAYERS) + if (insert_layers && !mng_info->image_found && (mng_info->mng_width) && + (mng_info->mng_height)) + { + /* + Insert a background layer if nothing else was found. + */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " No images found. Inserting a background layer."); + + if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Allocation failed, returning NULL."); + + return(DestroyImageList(image)); + } + image=SyncNextImageInList(image); + } + image->columns=mng_info->mng_width; + image->rows=mng_info->mng_height; + image->page.width=mng_info->mng_width; + image->page.height=mng_info->mng_height; + image->page.x=0; + image->page.y=0; + image->background_color=mng_background_color; + image->matte=MagickFalse; + + if (image_info->ping == MagickFalse) + (void) SetImageBackgroundColor(image); + + mng_info->image_found++; + } +#endif + image->iterations=mng_iterations; + + if (mng_iterations == 1) + image->start_loop=MagickTrue; + + while (GetPreviousImageInList(image) != (Image *) NULL) + { + image_count++; + if (image_count > 10*mng_info->image_found) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule()," No beginning"); + + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + "Linked list is corrupted, beginning of list not found","`%s'", + image_info->filename); + + return(DestroyImageList(image)); + } + + image=GetPreviousImageInList(image); + + if (GetNextImageInList(image) == (Image *) NULL) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule()," Corrupt list"); + + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + "Linked list is corrupted; next_image is NULL","`%s'", + image_info->filename); + } + } + + if (mng_info->ticks_per_second && mng_info->image_found > 1 && + GetNextImageInList(image) == + (Image *) NULL) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " First image null"); + + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + "image->next for first image is NULL but shouldn't be.","`%s'", + image_info->filename); + } + + if (mng_info->image_found == 0) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " No visible images found."); + + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + "No visible images in file","`%s'",image_info->filename); + + return(DestroyImageList(image)); + } + + if (mng_info->ticks_per_second) + final_delay=1UL*MagickMax(image->ticks_per_second,1L)* + final_delay/mng_info->ticks_per_second; + + else + image->start_loop=MagickTrue; + + /* Find final nonzero image delay */ + final_image_delay=0; + + while (GetNextImageInList(image) != (Image *) NULL) + { + if (image->delay) + final_image_delay=image->delay; + + image=GetNextImageInList(image); + } + + if (final_delay < final_image_delay) + final_delay=final_image_delay; + + image->delay=final_delay; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->delay=%.20g, final_delay=%.20g",(double) image->delay, + (double) final_delay); + + if (logging != MagickFalse) + { + int + scene; + + scene=0; + image=GetFirstImageInList(image); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Before coalesce:"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " scene 0 delay=%.20g",(double) image->delay); + + while (GetNextImageInList(image) != (Image *) NULL) + { + image=GetNextImageInList(image); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " scene %.20g delay=%.20g",(double) scene++,(double) image->delay); + } + } + + image=GetFirstImageInList(image); +#ifdef MNG_COALESCE_LAYERS + if (insert_layers && image->next) + { + Image + *next_image, + *next; + + size_t + scene; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule()," Coalesce Images"); + + scene=image->scene; + next_image=CoalesceImages(image,exception); + image=DestroyImageList(image); + if (next_image == (Image *) NULL) + return((Image *) NULL); + + image=next_image; + + for (next=image; next != (Image *) NULL; next=next_image) + { + next->page.width=mng_info->mng_width; + next->page.height=mng_info->mng_height; + next->page.x=0; + next->page.y=0; + next->scene=scene++; + next_image=GetNextImageInList(next); + + if (next_image == (Image *) NULL) + break; + + if (next->delay == 0) + { + scene--; + next_image->previous=GetPreviousImageInList(next); + if (GetPreviousImageInList(next) == (Image *) NULL) + image=next_image; + else + next->previous->next=next_image; + next=DestroyImage(next); + } + } + } +#endif + + while (GetNextImageInList(image) != (Image *) NULL) + image=GetNextImageInList(image); + + image->dispose=BackgroundDispose; + + if (logging != MagickFalse) + { + int + scene; + + scene=0; + image=GetFirstImageInList(image); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " After coalesce:"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " scene 0 delay=%.20g dispose=%.20g",(double) image->delay, + (double) image->dispose); + + while (GetNextImageInList(image) != (Image *) NULL) + { + image=GetNextImageInList(image); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " scene %.20g delay=%.20g dispose=%.20g",(double) scene++, + (double) image->delay,(double) image->dispose); + } + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " exit ReadOneJNGImage();"); + + return(image); +} + +static Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + logging, + status; + + MngInfo + *mng_info; + + /* Open image file. */ + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadMNGImage()"); + image=AcquireImage(image_info); + mng_info=(MngInfo *) NULL; + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + + if (status == MagickFalse) + return(DestroyImageList(image)); + + /* Allocate a MngInfo structure. */ + + mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); + + if (mng_info == (MngInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + + /* Initialize members of the MngInfo structure. */ + + (void) memset(mng_info,0,sizeof(MngInfo)); + mng_info->image=image; + image=ReadOneMNGImage(mng_info,image_info,exception); + mng_info=MngInfoFreeStruct(mng_info); + + if (image == (Image *) NULL) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "exit ReadMNGImage() with error"); + + return((Image *) NULL); + } + (void) CloseBlob(image); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadMNGImage()"); + + return(GetFirstImageInList(image)); +} +#else /* PNG_LIBPNG_VER > 10011 */ +static Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + printf("Your PNG library is too old: You have libpng-%s\n", + PNG_LIBPNG_VER_STRING); + + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + "PNG library is too old","`%s'",image_info->filename); + + return(Image *) NULL; +} + +static Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + return(ReadPNGImage(image_info,exception)); +} +#endif /* PNG_LIBPNG_VER > 10011 */ +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPNGImage() adds properties for the PNG image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPNGImage method is: +% +% size_t RegisterPNGImage(void) +% +*/ +ModuleExport size_t RegisterPNGImage(void) +{ + char + version[MaxTextExtent]; + + MagickInfo + *entry; + + static const char + PNGNote[] = + { + "See http://www.libpng.org/ for details about the PNG format." + }, + + JNGNote[] = + { + "See http://www.libpng.org/pub/mng/ for details about the JNG\n" + "format." + }, + + MNGNote[] = + { + "See http://www.libpng.org/pub/mng/ for details about the MNG\n" + "format." + }; + + *version='\0'; + +#if defined(PNG_LIBPNG_VER_STRING) + (void) ConcatenateMagickString(version,"libpng ",MaxTextExtent); + (void) ConcatenateMagickString(version,PNG_LIBPNG_VER_STRING,MaxTextExtent); + + if (LocaleCompare(PNG_LIBPNG_VER_STRING,png_get_header_ver(NULL)) != 0) + { + (void) ConcatenateMagickString(version,",",MaxTextExtent); + (void) ConcatenateMagickString(version,png_get_libpng_ver(NULL), + MaxTextExtent); + } +#endif + + entry=SetMagickInfo("MNG"); + entry->seekable_stream=MagickTrue; + +#if defined(MAGICKCORE_PNG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadMNGImage; + entry->encoder=(EncodeImageHandler *) WriteMNGImage; +#endif + + entry->magick=(IsImageFormatHandler *) IsMNG; + entry->description=ConstantString("Multiple-image Network Graphics"); + + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("video/x-mng"); + entry->magick_module=ConstantString("PNG"); + entry->note=ConstantString(MNGNote); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("PNG"); + +#if defined(MAGICKCORE_PNG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadPNGImage; + entry->encoder=(EncodeImageHandler *) WritePNGImage; +#endif + + entry->magick=(IsImageFormatHandler *) IsPNG; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Portable Network Graphics"); + entry->mime_type=ConstantString("image/png"); + entry->magick_module=ConstantString("PNG"); + + if (*version != '\0') + entry->version=ConstantString(version); + + entry->note=ConstantString(PNGNote); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("PNG8"); + +#if defined(MAGICKCORE_PNG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadPNGImage; + entry->encoder=(EncodeImageHandler *) WritePNGImage; +#endif + + entry->magick=(IsImageFormatHandler *) IsPNG; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString( + "8-bit indexed with optional binary transparency"); + entry->mime_type=ConstantString("image/png"); + entry->magick_module=ConstantString("PNG"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("PNG24"); + *version='\0'; + +#if defined(ZLIB_VERSION) + (void) ConcatenateMagickString(version,"zlib ",MaxTextExtent); + (void) ConcatenateMagickString(version,ZLIB_VERSION,MaxTextExtent); + + if (LocaleCompare(ZLIB_VERSION,zlib_version) != 0) + { + (void) ConcatenateMagickString(version,",",MaxTextExtent); + (void) ConcatenateMagickString(version,zlib_version,MaxTextExtent); + } +#endif + + if (*version != '\0') + entry->version=ConstantString(version); + +#if defined(MAGICKCORE_PNG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadPNGImage; + entry->encoder=(EncodeImageHandler *) WritePNGImage; +#endif + + entry->magick=(IsImageFormatHandler *) IsPNG; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("opaque or binary transparent 24-bit RGB"); + entry->mime_type=ConstantString("image/png"); + entry->magick_module=ConstantString("PNG"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("PNG32"); + +#if defined(MAGICKCORE_PNG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadPNGImage; + entry->encoder=(EncodeImageHandler *) WritePNGImage; +#endif + + entry->magick=(IsImageFormatHandler *) IsPNG; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("opaque or transparent 32-bit RGBA"); + entry->mime_type=ConstantString("image/png"); + entry->magick_module=ConstantString("PNG"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("PNG48"); + +#if defined(MAGICKCORE_PNG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadPNGImage; + entry->encoder=(EncodeImageHandler *) WritePNGImage; +#endif + + entry->magick=(IsImageFormatHandler *) IsPNG; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("opaque or binary transparent 48-bit RGB"); + entry->mime_type=ConstantString("image/png"); + entry->magick_module=ConstantString("PNG"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("PNG64"); + +#if defined(MAGICKCORE_PNG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadPNGImage; + entry->encoder=(EncodeImageHandler *) WritePNGImage; +#endif + + entry->magick=(IsImageFormatHandler *) IsPNG; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("opaque or transparent 64-bit RGBA"); + entry->mime_type=ConstantString("image/png"); + entry->magick_module=ConstantString("PNG"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("PNG00"); + +#if defined(MAGICKCORE_PNG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadPNGImage; + entry->encoder=(EncodeImageHandler *) WritePNGImage; +#endif + + entry->magick=(IsImageFormatHandler *) IsPNG; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString( + "PNG inheriting bit-depth, color-type from original if possible"); + entry->mime_type=ConstantString("image/png"); + entry->magick_module=ConstantString("PNG"); + (void) RegisterMagickInfo(entry); + + entry=SetMagickInfo("JNG"); + +#if defined(JNG_SUPPORTED) +#if defined(MAGICKCORE_PNG_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadJNGImage; + entry->encoder=(EncodeImageHandler *) WriteJNGImage; +#endif +#endif + + entry->magick=(IsImageFormatHandler *) IsJNG; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("JPEG Network Graphics"); + entry->mime_type=ConstantString("image/x-jng"); + entry->magick_module=ConstantString("PNG"); + entry->note=ConstantString(JNGNote); + (void) RegisterMagickInfo(entry); + +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + ping_semaphore=AllocateSemaphoreInfo(); +#endif + + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPNGImage() removes format registrations made by the +% PNG module from the list of supported formats. +% +% The format of the UnregisterPNGImage method is: +% +% UnregisterPNGImage(void) +% +*/ +ModuleExport void UnregisterPNGImage(void) +{ + (void) UnregisterMagickInfo("MNG"); + (void) UnregisterMagickInfo("PNG"); + (void) UnregisterMagickInfo("PNG8"); + (void) UnregisterMagickInfo("PNG24"); + (void) UnregisterMagickInfo("PNG32"); + (void) UnregisterMagickInfo("PNG48"); + (void) UnregisterMagickInfo("PNG64"); + (void) UnregisterMagickInfo("PNG00"); + (void) UnregisterMagickInfo("JNG"); + +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + if (ping_semaphore != (SemaphoreInfo *) NULL) + DestroySemaphoreInfo(&ping_semaphore); +#endif +} + +#if defined(MAGICKCORE_PNG_DELEGATE) +#if PNG_LIBPNG_VER > 10011 +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMNGImage() writes an image in the Portable Network Graphics +% Group's "Multiple-image Network Graphics" encoded image format. +% +% MNG support written by Glenn Randers-Pehrson, glennrp@image... +% +% The format of the WriteMNGImage method is: +% +% MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% +% To do (as of version 5.5.2, November 26, 2002 -- glennrp -- see also +% "To do" under ReadPNGImage): +% +% Preserve all unknown and not-yet-handled known chunks found in input +% PNG file and copy them into output PNG files according to the PNG +% copying rules. +% +% Write the iCCP chunk at MNG level when (icc profile length > 0) +% +% Improve selection of color type (use indexed-colour or indexed-colour +% with tRNS when 256 or fewer unique RGBA values are present). +% +% Figure out what to do with "dispose=" (dispose == 3) +% This will be complicated if we limit ourselves to generating MNG-LC +% files. For now we ignore disposal method 3 and simply overlay the next +% image on it. +% +% Check for identical PLTE's or PLTE/tRNS combinations and use a +% global MNG PLTE or PLTE/tRNS combination when appropriate. +% [mostly done 15 June 1999 but still need to take care of tRNS] +% +% Check for identical sRGB and replace with a global sRGB (and remove +% gAMA/cHRM if sRGB is found; check for identical gAMA/cHRM and +% replace with global gAMA/cHRM (or with sRGB if appropriate; replace +% local gAMA/cHRM with local sRGB if appropriate). +% +% Check for identical sBIT chunks and write global ones. +% +% Provide option to skip writing the signature tEXt chunks. +% +% Use signatures to detect identical objects and reuse the first +% instance of such objects instead of writing duplicate objects. +% +% Use a smaller-than-32k value of compression window size when +% appropriate. +% +% Encode JNG datastreams. Mostly done as of 5.5.2; need to write +% ancillary text chunks and save profiles. +% +% Provide an option to force LC files (to ensure exact framing rate) +% instead of VLC. +% +% Provide an option to force VLC files instead of LC, even when offsets +% are present. This will involve expanding the embedded images with a +% transparent region at the top and/or left. +*/ + +static void +Magick_png_write_raw_profile(const ImageInfo *image_info,png_struct *ping, + png_info *ping_info, unsigned char *profile_type, unsigned char + *profile_description, unsigned char *profile_data, png_uint_32 length, + ExceptionInfo *exception) +{ + png_textp + text; + + ssize_t + i; + + unsigned char + *sp; + + png_charp + dp; + + png_uint_32 + allocated_length, + description_length; + + unsigned char + hex[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; + + if (length > 1) + { + if (LocaleNCompare((char *) profile_type+1, "ng-chunk-",9) == 0) + return; + } + if (image_info->verbose) + { + (void) printf("writing raw profile: type=%s, length=%.20g\n", + (char *) profile_type, (double) length); + } + description_length=(png_uint_32) strlen((const char *) profile_description); + allocated_length=(png_uint_32) (2*length+(length >> 5)+description_length+ + 20); + if (allocated_length < length) + { + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + "maximum profile length exceeded","`%s'",image_info->filename); + return; + } +#if PNG_LIBPNG_VER >= 10400 + text=(png_textp) png_malloc(ping,(png_alloc_size_t) sizeof(png_text)); +#else + text=(png_textp) png_malloc(ping,(png_size_t) sizeof(png_text)); +#endif +#if PNG_LIBPNG_VER >= 10400 + text[0].text=(png_charp) png_malloc(ping,(png_alloc_size_t) + allocated_length); + text[0].key=(png_charp) png_malloc(ping, (png_alloc_size_t) 80); +#else + text[0].text=(png_charp) png_malloc(ping, (png_size_t) allocated_length); + text[0].key=(png_charp) png_malloc(ping, (png_size_t) 80); +#endif + text[0].key[0]='\0'; + (void) ConcatenateMagickString(text[0].key,"Raw profile type ", + MaxTextExtent); + (void) ConcatenateMagickString(text[0].key,(const char *) profile_type,62); + sp=profile_data; + dp=text[0].text; + *dp++='\n'; + (void) CopyMagickString(dp,(const char *) profile_description, + allocated_length); + dp+=description_length; + *dp++='\n'; + (void) FormatLocaleString(dp,allocated_length- + (png_size_t) (dp-text[0].text),"%8lu ",(unsigned long) length); + dp+=8; + + for (i=0; i < (ssize_t) length; i++) + { + if (i%36 == 0) + *dp++='\n'; + *(dp++)=(char) hex[((*sp >> 4) & 0x0f)]; + *(dp++)=(char) hex[((*sp++ ) & 0x0f)]; + } + + *dp++='\n'; + *dp='\0'; + text[0].text_length=(png_size_t) (dp-text[0].text); + text[0].compression=image_info->compression == NoCompression || + (image_info->compression == UndefinedCompression && + text[0].text_length < 128) ? -1 : 0; + + if (text[0].text_length <= allocated_length) + png_set_text(ping,ping_info,text,1); + + png_free(ping,text[0].text); + png_free(ping,text[0].key); + png_free(ping,text); +} + +#if defined(PNG_tIME_SUPPORTED) +static void write_tIME_chunk(Image *image,png_struct *ping,png_info *info, + const char *date) +{ + const char + *timestamp; + + int + ret; + + int + day, + hour, + minute, + month, + second, + year; + + int + addhours=0, + addminutes=0; + + png_time + ptime; + + if (date == (const char *) NULL) + timestamp=GetImageProperty(image,"date:modify"); + else + timestamp=date; + + LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing tIME chunk: timestamp property is %30s\n",timestamp); + ret=sscanf(timestamp,"%d-%d-%dT%d:%d:%d",&year,&month,&day,&hour, + &minute, &second); + addhours=0; + addminutes=0; + ret=sscanf(timestamp,"%d-%d-%dT%d:%d:%d%d:%d",&year,&month,&day,&hour, + &minute, &second, &addhours, &addminutes); + LogMagickEvent(CoderEvent,GetMagickModule(), + " Date format specified for png:tIME=%s" ,timestamp); + LogMagickEvent(CoderEvent,GetMagickModule(), + " ret=%d,y=%d, m=%d, d=%d, h=%d, m=%d, s=%d, ah=%d, as=%d", + ret,year,month,day,hour,minute,second,addhours,addminutes); + if (ret < 6) + { + LogMagickEvent(CoderEvent,GetMagickModule(), + " Invalid date, ret=%d",ret); + (void) ThrowMagickException(&image->exception,GetMagickModule(),CoderError, + "Invalid date format specified for png:tIME","`%s' (ret=%d)", + image->filename,ret); + return; + } + if (addhours < 0) + { + addhours+=24; + addminutes=-addminutes; + day--; + } + hour+=addhours; + minute+=addminutes; + if (day == 0) + { + month--; + day=31; + if(month == 2) + day=28; + else + { + if(month == 4 || month == 6 || month == 9 || month == 11) + day=30; + else + day=31; + } + } + if (month == 0) + { + month++; + year--; + } + if (minute > 59) + { + hour++; + minute-=60; + } + if (hour > 23) + { + day ++; + hour -=24; + } + if (hour < 0) + { + day --; + hour +=24; + } + /* To do: fix this for leap years */ + if (day > 31 || (month == 2 && day > 28) || ((month == 4 || month == 6 || + month == 9 || month == 11) && day > 30)) + { + month++; + day = 1; + } + if (month > 12) + { + year++; + month=1; + } + + ptime.year = year; + ptime.month = month; + ptime.day = day; + ptime.hour = hour; + ptime.minute = minute; + ptime.second = second; + png_convert_from_time_t(&ptime,GetMagickTime()); + LogMagickEvent(CoderEvent,GetMagickModule(), + " png_set_tIME: y=%d, m=%d, d=%d, h=%d, m=%d, s=%d, ah=%d, am=%d", + ptime.year, ptime.month, ptime.day, ptime.hour, ptime.minute, + ptime.second, addhours, addminutes); + + png_set_tIME(ping,info,&ptime); +} +#endif + +/* Write one PNG image */ +static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, + const ImageInfo *image_info,Image *image) +{ + char + s[2]; + + char + im_vers[32], + libpng_runv[32], + libpng_vers[32], + zlib_runv[32], + zlib_vers[32]; + + const char + *name, + *property, + *value; + + const StringInfo + *profile; + + int + num_passes, + pass, + ping_wrote_caNv; + + png_byte + ping_trans_alpha[256]; + + png_color + palette[257]; + + png_color_16 + ping_background, + ping_trans_color; + + png_info + *ping_info; + + png_struct + *ping; + + png_uint_32 + ping_height, + ping_width; + + ssize_t + y; + + MagickBooleanType + image_matte, + logging, + matte, + + ping_have_blob, + ping_have_cheap_transparency, + ping_have_color, + ping_have_non_bw, + ping_have_PLTE, + ping_have_bKGD, + ping_have_eXIf, + ping_have_iCCP, + ping_have_pHYs, + ping_have_sRGB, + ping_have_tRNS, + + ping_exclude_bKGD, + ping_exclude_cHRM, + ping_exclude_date, + /* ping_exclude_EXIF, */ + ping_exclude_eXIf, + ping_exclude_gAMA, + ping_exclude_iCCP, + /* ping_exclude_iTXt, */ + ping_exclude_oFFs, + ping_exclude_pHYs, + ping_exclude_sRGB, + ping_exclude_tEXt, + ping_exclude_tIME, + /* ping_exclude_tRNS, */ + ping_exclude_caNv, + ping_exclude_zCCP, /* hex-encoded iCCP */ + ping_exclude_zTXt, + + ping_preserve_colormap, + ping_preserve_iCCP, + ping_need_colortype_warning, + + status, + tried_332, + tried_333, + tried_444; + + MemoryInfo + *volatile pixel_info; + + QuantumInfo + *quantum_info; + + ssize_t + i, + x; + + unsigned char + *ping_pixels; + + volatile int + image_colors, + ping_bit_depth, + ping_color_type, + ping_interlace_method, + ping_compression_method, + ping_filter_method, + ping_num_trans; + + volatile size_t + image_depth, + old_bit_depth; + + size_t + quality, + rowbytes, + save_image_depth; + + int + j, + number_colors, + number_opaque, + number_semitransparent, + number_transparent, + ping_pHYs_unit_type; + + png_uint_32 + ping_pHYs_x_resolution, + ping_pHYs_y_resolution; + + logging=LogMagickEvent(CoderEvent,GetMagickModule(), + " Enter WriteOnePNGImage()"); + + /* Define these outside of the following "if logging()" block so they will + * show in debuggers. + */ + *im_vers='\0'; + (void) ConcatenateMagickString(im_vers, + MagickLibVersionText,MaxTextExtent); + (void) ConcatenateMagickString(im_vers, + MagickLibAddendum,MaxTextExtent); + + *libpng_vers='\0'; + (void) ConcatenateMagickString(libpng_vers, + PNG_LIBPNG_VER_STRING,32); + *libpng_runv='\0'; + (void) ConcatenateMagickString(libpng_runv, + png_get_libpng_ver(NULL),32); + + *zlib_vers='\0'; + (void) ConcatenateMagickString(zlib_vers, + ZLIB_VERSION,32); + *zlib_runv='\0'; + (void) ConcatenateMagickString(zlib_runv, + zlib_version,32); + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " IM version = %s", im_vers); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Libpng version = %s", libpng_vers); + if (LocaleCompare(libpng_vers,libpng_runv) != 0) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " running with %s", libpng_runv); + } + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Zlib version = %s", zlib_vers); + if (LocaleCompare(zlib_vers,zlib_runv) != 0) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " running with %s", zlib_runv); + } + } + + /* Initialize some stuff */ + ping_bit_depth=0, + ping_color_type=0, + ping_interlace_method=0, + ping_compression_method=0, + ping_filter_method=0, + ping_num_trans = 0; + + ping_background.red = 0; + ping_background.green = 0; + ping_background.blue = 0; + ping_background.gray = 0; + ping_background.index = 0; + + ping_trans_color.red=0; + ping_trans_color.green=0; + ping_trans_color.blue=0; + ping_trans_color.gray=0; + + ping_pHYs_unit_type = 0; + ping_pHYs_x_resolution = 0; + ping_pHYs_y_resolution = 0; + + ping_have_blob=MagickFalse; + ping_have_cheap_transparency=MagickFalse; + ping_have_color=MagickTrue; + ping_have_non_bw=MagickTrue; + ping_have_PLTE=MagickFalse; + ping_have_bKGD=MagickFalse; + ping_have_eXIf=MagickTrue; + ping_have_iCCP=MagickFalse; + ping_have_pHYs=MagickFalse; + ping_have_sRGB=MagickFalse; + ping_have_tRNS=MagickFalse; + + ping_exclude_bKGD=mng_info->ping_exclude_bKGD; + ping_exclude_caNv=mng_info->ping_exclude_caNv; + ping_exclude_cHRM=mng_info->ping_exclude_cHRM; + ping_exclude_date=mng_info->ping_exclude_date; + /* ping_exclude_EXIF=mng_info->ping_exclude_EXIF; */ + ping_exclude_eXIf=mng_info->ping_exclude_eXIf; + ping_exclude_gAMA=mng_info->ping_exclude_gAMA; + ping_exclude_iCCP=mng_info->ping_exclude_iCCP; + /* ping_exclude_iTXt=mng_info->ping_exclude_iTXt; */ + ping_exclude_oFFs=mng_info->ping_exclude_oFFs; + ping_exclude_pHYs=mng_info->ping_exclude_pHYs; + ping_exclude_sRGB=mng_info->ping_exclude_sRGB; + ping_exclude_tEXt=mng_info->ping_exclude_tEXt; + ping_exclude_tIME=mng_info->ping_exclude_tIME; + /* ping_exclude_tRNS=mng_info->ping_exclude_tRNS; */ + ping_exclude_zCCP=mng_info->ping_exclude_zCCP; /* hex-encoded iCCP in zTXt */ + ping_exclude_zTXt=mng_info->ping_exclude_zTXt; + + ping_preserve_colormap = mng_info->ping_preserve_colormap; + ping_preserve_iCCP = mng_info->ping_preserve_iCCP; + ping_need_colortype_warning = MagickFalse; + + property=(const char *) NULL; + + /* Recognize the ICC sRGB profile and convert it to the sRGB chunk, + * i.e., eliminate the ICC profile and set image->rendering_intent. + * Note that this will not involve any changes to the actual pixels + * but merely passes information to applications that read the resulting + * PNG image. + * + * To do: recognize other variants of the sRGB profile, using the CRC to + * verify all recognized variants including the 7 already known. + * + * Work around libpng16+ rejecting some "known invalid sRGB profiles". + * + * Use something other than image->rendering_intent to record the fact + * that the sRGB profile was found. + * + * Record the ICC version (currently v2 or v4) of the incoming sRGB ICC + * profile. Record the Blackpoint Compensation, if any. + */ + if (ping_exclude_sRGB == MagickFalse && ping_preserve_iCCP == MagickFalse) + { + char + *name; + + const StringInfo + *profile; + + ResetImageProfileIterator(image); + for (name=GetNextImageProfile(image); name != (const char *) NULL; ) + { + profile=GetImageProfile(image,name); + + if (profile != (StringInfo *) NULL) + { + if ((LocaleCompare(name,"ICC") == 0) || + (LocaleCompare(name,"ICM") == 0)) + + { + int + icheck, + got_crc=0; + + + png_uint_32 + length, + profile_crc=0; + + unsigned char + *data; + + length=(png_uint_32) GetStringInfoLength(profile); + + for (icheck=0; sRGB_info[icheck].len > 0; icheck++) + { + if (length == sRGB_info[icheck].len) + { + if (got_crc == 0) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Got a %lu-byte ICC profile (potentially sRGB)", + (unsigned long) length); + + data=GetStringInfoDatum(profile); + profile_crc=crc32(0,data,length); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " with crc=%8x",(unsigned int) profile_crc); + got_crc++; + } + + if (profile_crc == sRGB_info[icheck].crc) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " It is sRGB with rendering intent = %s", + Magick_RenderingIntentString_from_PNG_RenderingIntent( + sRGB_info[icheck].intent)); + if (image->rendering_intent==UndefinedIntent) + { + image->rendering_intent= + Magick_RenderingIntent_from_PNG_RenderingIntent( + sRGB_info[icheck].intent); + } + ping_exclude_iCCP = MagickTrue; + ping_exclude_zCCP = MagickTrue; + ping_have_sRGB = MagickTrue; + break; + } + } + } + if (sRGB_info[icheck].len == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Got a %lu-byte ICC profile not recognized as sRGB", + (unsigned long) length); + } + } + name=GetNextImageProfile(image); + } + } + + number_opaque = 0; + number_semitransparent = 0; + number_transparent = 0; + + if (logging != MagickFalse) + { + if (image->storage_class == UndefinedClass) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->storage_class=UndefinedClass"); + if (image->storage_class == DirectClass) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->storage_class=DirectClass"); + if (image->storage_class == PseudoClass) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->storage_class=PseudoClass"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image_info->magick= %s",image_info->magick); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), image->taint ? + " image->taint=MagickTrue": + " image->taint=MagickFalse"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->gamma=%g", image->gamma); + } + + if (image->storage_class == PseudoClass && + (mng_info->write_png8 || mng_info->write_png24 || mng_info->write_png32 || + mng_info->write_png48 || mng_info->write_png64 || + (mng_info->write_png_colortype != 1 && + mng_info->write_png_colortype != 5))) + { + (void) SyncImage(image); + image->storage_class = DirectClass; + } + + if (ping_preserve_colormap == MagickFalse) + { + if ((image->storage_class != PseudoClass) && + (image->colormap != (PixelPacket *) NULL)) + { + /* Free the bogus colormap; it can cause trouble later */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Freeing bogus colormap"); + image->colormap=(PixelPacket *) RelinquishMagickMemory( + image->colormap); + } + } + + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + + /* + Sometimes we get PseudoClass images whose RGB values don't match + the colors in the colormap. This code syncs the RGB values. + */ + image->depth=GetImageQuantumDepth(image,MagickFalse); + if (image->depth <= 8 && image->taint && image->storage_class == PseudoClass) + (void) SyncImage(image); + +#if (MAGICKCORE_QUANTUM_DEPTH == 8) + if (image->depth > 8) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reducing PNG bit depth to 8 since this is a Q8 build."); + + image->depth=8; + } +#endif + + /* Respect the -depth option */ + if (image->depth < 4) + { + PixelPacket + *r; + + ExceptionInfo + *exception; + + exception=(&image->exception); + + if (image->depth > 2) + { + /* Scale to 4-bit */ + LBR04PacketRGBO(image->background_color); + + for (y=0; y < (ssize_t) image->rows; y++) + { + r=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (r == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + LBR04PixelRGBO(r); + r++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + + if (image->storage_class == PseudoClass && image->colormap != NULL) + { + for (i=0; i < (ssize_t) image->colors; i++) + { + LBR04PacketRGBO(image->colormap[i]); + } + } + } + else if (image->depth > 1) + { + /* Scale to 2-bit */ + LBR02PacketRGBO(image->background_color); + + for (y=0; y < (ssize_t) image->rows; y++) + { + r=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (r == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + LBR02PixelRGBO(r); + r++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + + if (image->storage_class == PseudoClass && image->colormap != NULL) + { + for (i=0; i < (ssize_t) image->colors; i++) + { + LBR02PacketRGBO(image->colormap[i]); + } + } + } + else + { + /* Scale to 1-bit */ + LBR01PacketRGBO(image->background_color); + + for (y=0; y < (ssize_t) image->rows; y++) + { + r=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (r == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + LBR01PixelRGBO(r); + r++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + + if (image->storage_class == PseudoClass && image->colormap != NULL) + { + for (i=0; i < (ssize_t) image->colors; i++) + { + LBR01PacketRGBO(image->colormap[i]); + } + } + } + } + + /* To do: set to next higher multiple of 8 */ + if (image->depth < 8) + image->depth=8; + +#if (MAGICKCORE_QUANTUM_DEPTH > 16) + /* PNG does not handle depths greater than 16 so reduce it even + * if lossy + */ + if (image->depth > 8) + image->depth=16; +#endif + +#if (MAGICKCORE_QUANTUM_DEPTH > 8) + if (image->depth > 8) + { + /* To do: fill low byte properly */ + image->depth=16; + } + + if (image->depth == 16 && mng_info->write_png_depth != 16) + if (mng_info->write_png8 || LosslessReduceDepthOK(image) != MagickFalse) + image->depth = 8; +#endif + + image_colors = (int) image->colors; + number_opaque = (int) image->colors; + number_transparent = 0; + number_semitransparent = 0; + + if (mng_info->write_png_colortype && + (mng_info->write_png_colortype > 4 || (mng_info->write_png_depth >= 8 && + mng_info->write_png_colortype < 4 && image->matte == MagickFalse))) + { + /* Avoid the expensive BUILD_PALETTE operation if we're sure that we + * are not going to need the result. + */ + number_opaque = (int) image->colors; + if (mng_info->write_png_colortype == 1 || + mng_info->write_png_colortype == 5) + ping_have_color=MagickFalse; + else + ping_have_color=MagickTrue; + ping_have_non_bw=MagickFalse; + + if (image->matte != MagickFalse) + { + number_transparent = 2; + number_semitransparent = 1; + } + + else + { + number_transparent = 0; + number_semitransparent = 0; + } + } + + if (mng_info->write_png_colortype < 7) + { + /* BUILD_PALETTE + * + * Normally we run this just once, but in the case of writing PNG8 + * we reduce the transparency to binary and run again, then if there + * are still too many colors we reduce to a simple 4-4-4-1, then 3-3-3-1 + * RGBA palette and run again, and then to a simple 3-3-2-1 RGBA + * palette. Then (To do) we take care of a final reduction that is only + * needed if there are still 256 colors present and one of them has both + * transparent and opaque instances. + */ + + tried_332 = MagickFalse; + tried_333 = MagickFalse; + tried_444 = MagickFalse; + + if (image->depth != GetImageDepth(image,&image->exception)) + (void) SetImageDepth(image,image->depth); + for (j=0; j<6; j++) + { + /* + * Sometimes we get DirectClass images that have 256 colors or fewer. + * This code will build a colormap. + * + * Also, sometimes we get PseudoClass images with an out-of-date + * colormap. This code will replace the colormap with a new one. + * Sometimes we get PseudoClass images that have more than 256 colors. + * This code will delete the colormap and change the image to + * DirectClass. + * + * If image->matte is MagickFalse, we ignore the opacity channel + * even though it sometimes contains left-over non-opaque values. + * + * Also we gather some information (number of opaque, transparent, + * and semitransparent pixels, and whether the image has any non-gray + * pixels or only black-and-white pixels) that we might need later. + * + * Even if the user wants to force GrayAlpha or RGBA (colortype 4 or 6) + * we need to check for bogus non-opaque values, at least. + */ + + ExceptionInfo + *exception; + + int + n; + + PixelPacket + opaque[260], + semitransparent[260], + transparent[260]; + + IndexPacket + *indexes; + + const PixelPacket + *s, + *q; + + PixelPacket + *r; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Enter BUILD_PALETTE:"); + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->columns=%.20g",(double) image->columns); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->rows=%.20g",(double) image->rows); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->matte=%.20g",(double) image->matte); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->depth=%.20g",(double) image->depth); + + if (image->storage_class == PseudoClass && image->colormap != NULL) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Original colormap:"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " i (red,green,blue,opacity)"); + + for (i=0; i < (ssize_t) MagickMin(image->colors,256); i++) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " %d (%d,%d,%d,%d)", + (int) i, + (int) image->colormap[i].red, + (int) image->colormap[i].green, + (int) image->colormap[i].blue, + (int) image->colormap[i].opacity); + } + + for (i=image->colors - 10; i < (ssize_t) image->colors; i++) + { + if (i > 255) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " %d (%d,%d,%d,%d)", + (int) i, + (int) image->colormap[i].red, + (int) image->colormap[i].green, + (int) image->colormap[i].blue, + (int) image->colormap[i].opacity); + } + } + } + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->colors=%d",(int) image->colors); + + if (image->colors == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " (zero means unknown)"); + + if (ping_preserve_colormap == MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Regenerate the colormap"); + } + + exception=(&image->exception); + + image_colors=0; + number_opaque = 0; + number_semitransparent = 0; + number_transparent = 0; + + (void) SetImageStorageClass(image,image->storage_class); + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetVirtualPixels(image,0,y,image->columns,1,exception); + + if (q == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + if (image->matte == MagickFalse || + GetPixelOpacity(q) == OpaqueOpacity) + { + if (number_opaque < 259) + { + if (number_opaque == 0) + { + GetPixelRGB(q, opaque); + opaque[0].opacity=OpaqueOpacity; + number_opaque=1; + } + + for (i=0; i< (ssize_t) number_opaque; i++) + { + if (IsColorEqual(q, opaque+i)) + break; + } + + if (i == (ssize_t) number_opaque && + number_opaque < 259) + { + number_opaque++; + GetPixelRGB(q, opaque+i); + opaque[i].opacity=OpaqueOpacity; + } + } + } + else if (q->opacity == TransparentOpacity) + { + if (number_transparent < 259) + { + if (number_transparent == 0) + { + GetPixelRGBO(q, transparent); + ping_trans_color.red= + (unsigned short) GetPixelRed(q); + ping_trans_color.green= + (unsigned short) GetPixelGreen(q); + ping_trans_color.blue= + (unsigned short) GetPixelBlue(q); + ping_trans_color.gray= + (unsigned short) GetPixelRed(q); + number_transparent = 1; + } + + for (i=0; i< (ssize_t) number_transparent; i++) + { + if (IsColorEqual(q, transparent+i)) + break; + } + + if (i == (ssize_t) number_transparent && + number_transparent < 259) + { + number_transparent++; + GetPixelRGBO(q, transparent+i); + } + } + } + else + { + if (number_semitransparent < 259) + { + if (number_semitransparent == 0) + { + GetPixelRGBO(q, semitransparent); + number_semitransparent = 1; + } + + for (i=0; i< (ssize_t) number_semitransparent; i++) + { + if (IsColorEqual(q, semitransparent+i) + && GetPixelOpacity(q) == + semitransparent[i].opacity) + break; + } + + if (i == (ssize_t) number_semitransparent && + number_semitransparent < 259) + { + number_semitransparent++; + GetPixelRGBO(q, semitransparent+i); + } + } + } + q++; + } + } + + if (mng_info->write_png8 == MagickFalse && + ping_exclude_bKGD == MagickFalse) + { + /* Add the background color to the palette, if it + * isn't already there. + */ + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Check colormap for background (%d,%d,%d)", + (int) image->background_color.red, + (int) image->background_color.green, + (int) image->background_color.blue); + } + if (number_opaque < 259) + { + for (i=0; ibackground_color.red && + opaque[i].green == image->background_color.green && + opaque[i].blue == image->background_color.blue) + break; + } + if (i == number_opaque) + { + opaque[i] = image->background_color; + ping_background.index = i; + number_opaque++; + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " background_color index is %d",(int) i); + } + + } + } + else if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " No room in the colormap to add background color"); + } + + image_colors=number_opaque+number_transparent+number_semitransparent; + + if (logging != MagickFalse) + { + if (image_colors > 256) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image has more than 256 colors"); + + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image has %d colors",image_colors); + } + + if (ping_preserve_colormap != MagickFalse) + break; + + if (mng_info->write_png_colortype != 7) /* We won't need this info */ + { + ping_have_color=MagickFalse; + ping_have_non_bw=MagickFalse; + + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "incompatible colorspace"); + ping_have_color=MagickTrue; + ping_have_non_bw=MagickTrue; + } + + if(image_colors > 256) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (q == (PixelPacket *) NULL) + break; + + s=q; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelRed(s) != GetPixelGreen(s) || + GetPixelRed(s) != GetPixelBlue(s)) + { + ping_have_color=MagickTrue; + ping_have_non_bw=MagickTrue; + break; + } + s++; + } + + if (ping_have_color != MagickFalse) + break; + + /* Worst case is black-and-white; we are looking at every + * pixel twice. + */ + + if (ping_have_non_bw == MagickFalse) + { + s=q; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelRed(s) != 0 && + GetPixelRed(s) != QuantumRange) + { + ping_have_non_bw=MagickTrue; + break; + } + s++; + } + } + } + } + } + + if (image_colors < 257) + { + PixelPacket + colormap[260]; + + /* + * Initialize image colormap. + */ + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Sort the new colormap"); + + /* Sort palette, transparent first */; + + n = 0; + + for (i=0; iping_exclude_tRNS == MagickFalse || + (number_transparent == 0 && number_semitransparent == 0)) && + (((mng_info->write_png_colortype-1) == + PNG_COLOR_TYPE_PALETTE) || + (mng_info->write_png_colortype == 0))) + { + if (logging != MagickFalse) + { + if (n != (ssize_t) image_colors) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image_colors (%d) and n (%d) don't match", + image_colors, n); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " AcquireImageColormap"); + } + + image->colors = image_colors; + + if (AcquireImageColormap(image,image_colors) == MagickFalse) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + image->filename); + break; + } + + for (i=0; i< (ssize_t) image_colors; i++) + image->colormap[i] = colormap[i]; + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->colors=%d (%d)", + (int) image->colors, image_colors); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Update the pixel indexes"); + } + + /* Sync the pixel indices with the new colormap */ + + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (q == (PixelPacket *) NULL) + break; + + indexes=GetAuthenticIndexQueue(image); + + for (x=0; x < (ssize_t) image->columns; x++) + { + for (i=0; i< (ssize_t) image_colors; i++) + { + if ((image->matte == MagickFalse || + image->colormap[i].opacity == + GetPixelOpacity(q)) && + image->colormap[i].red == + GetPixelRed(q) && + image->colormap[i].green == + GetPixelGreen(q) && + image->colormap[i].blue == + GetPixelBlue(q)) + { + SetPixelIndex(indexes+x,i); + break; + } + } + q++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } + } + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->colors=%d", (int) image->colors); + + if (image->colormap != NULL) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " i (red,green,blue,opacity)"); + + for (i=0; i < (ssize_t) image->colors; i++) + { + if (i < 300 || i >= (ssize_t) image->colors - 10) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " %d (%d,%d,%d,%d)", + (int) i, + (int) image->colormap[i].red, + (int) image->colormap[i].green, + (int) image->colormap[i].blue, + (int) image->colormap[i].opacity); + } + } + } + + if (number_transparent < 257) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " number_transparent = %d", + number_transparent); + else + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " number_transparent > 256"); + + if (number_opaque < 257) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " number_opaque = %d", + number_opaque); + + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " number_opaque > 256"); + + if (number_semitransparent < 257) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " number_semitransparent = %d", + number_semitransparent); + + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " number_semitransparent > 256"); + + if (ping_have_non_bw == MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " All pixels and the background are black or white"); + + else if (ping_have_color == MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " All pixels and the background are gray"); + + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " At least one pixel or the background is non-gray"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Exit BUILD_PALETTE:"); + } + + if (mng_info->write_png8 == MagickFalse) + break; + + /* Make any reductions necessary for the PNG8 format */ + if (image_colors <= 256 && + image_colors != 0 && image->colormap != NULL && + number_semitransparent == 0 && + number_transparent <= 1) + break; + + /* PNG8 can't have semitransparent colors so we threshold the + * opacity to 0 or OpaqueOpacity, and PNG8 can only have one + * transparent color so if more than one is transparent we merge + * them into image->background_color. + */ + if (number_semitransparent != 0 || number_transparent > 1) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Thresholding the alpha channel to binary"); + + for (y=0; y < (ssize_t) image->rows; y++) + { + r=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (r == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelOpacity(r) > TransparentOpacity/2) + { + SetPixelOpacity(r,TransparentOpacity); + SetPixelRgb(r,&image->background_color); + } + else + SetPixelOpacity(r,OpaqueOpacity); + r++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + + if (image_colors != 0 && image_colors <= 256 && + image->colormap != NULL) + for (i=0; icolormap[i].opacity = + (image->colormap[i].opacity > TransparentOpacity/2 ? + TransparentOpacity : OpaqueOpacity); + } + continue; + } + + /* PNG8 can't have more than 256 colors so we quantize the pixels and + * background color to the 4-4-4-1, 3-3-3-1 or 3-3-2-1 palette. If the + * image is mostly gray, the 4-4-4-1 palette is likely to end up with 256 + * colors or less. + */ + if (tried_444 == MagickFalse && (image_colors == 0 || image_colors > 256)) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Quantizing the background color to 4-4-4"); + + tried_444 = MagickTrue; + + LBR04PacketRGB(image->background_color); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Quantizing the pixel colors to 4-4-4"); + + if (image->colormap == NULL) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + r=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (r == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelOpacity(r) == OpaqueOpacity) + LBR04PixelRGB(r); + r++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } + + else /* Should not reach this; colormap already exists and + must be <= 256 */ + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Quantizing the colormap to 4-4-4"); + + for (i=0; icolormap[i]); + } + } + continue; + } + + if (tried_333 == MagickFalse && (image_colors == 0 || image_colors > 256)) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Quantizing the background color to 3-3-3"); + + tried_333 = MagickTrue; + + LBR03PacketRGB(image->background_color); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Quantizing the pixel colors to 3-3-3-1"); + + if (image->colormap == NULL) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + r=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (r == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelOpacity(r) == OpaqueOpacity) + LBR03PixelRGB(r); + r++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } + + else /* Should not reach this; colormap already exists and + must be <= 256 */ + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Quantizing the colormap to 3-3-3-1"); + for (i=0; icolormap[i]); + } + } + continue; + } + + if (tried_332 == MagickFalse && (image_colors == 0 || image_colors > 256)) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Quantizing the background color to 3-3-2"); + + tried_332 = MagickTrue; + + /* Red and green were already done so we only quantize the blue + * channel + */ + + LBR02PacketBlue(image->background_color); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Quantizing the pixel colors to 3-3-2-1"); + + if (image->colormap == NULL) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + r=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (r == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelOpacity(r) == OpaqueOpacity) + LBR02PixelBlue(r); + r++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } + + else /* Should not reach this; colormap already exists and + must be <= 256 */ + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Quantizing the colormap to 3-3-2-1"); + for (i=0; icolormap[i]); + } + } + continue; + } + + if (image_colors == 0 || image_colors > 256) + { + /* Take care of special case with 256 opaque colors + 1 transparent + * color. We don't need to quantize to 2-3-2-1; we only need to + * eliminate one color, so we'll merge the two darkest red + * colors (0x49, 0, 0) -> (0x24, 0, 0). + */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Merging two dark red background colors to 3-3-2-1"); + + if (ScaleQuantumToChar(image->background_color.red) == 0x49 && + ScaleQuantumToChar(image->background_color.green) == 0x00 && + ScaleQuantumToChar(image->background_color.blue) == 0x00) + { + image->background_color.red=ScaleCharToQuantum(0x24); + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Merging two dark red pixel colors to 3-3-2-1"); + + if (image->colormap == NULL) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + r=GetAuthenticPixels(image,0,y,image->columns,1,exception); + + if (r == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + if (ScaleQuantumToChar(GetPixelRed(r)) == 0x49 && + ScaleQuantumToChar(GetPixelGreen(r)) == 0x00 && + ScaleQuantumToChar(GetPixelBlue(r)) == 0x00 && + GetPixelOpacity(r) == OpaqueOpacity) + { + SetPixelRed(r,ScaleCharToQuantum(0x24)); + } + r++; + } + + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + + } + } + + else + { + for (i=0; icolormap[i].red) == 0x49 && + ScaleQuantumToChar(image->colormap[i].green) == 0x00 && + ScaleQuantumToChar(image->colormap[i].blue) == 0x00) + { + image->colormap[i].red=ScaleCharToQuantum(0x24); + } + } + } + } + } + } + /* END OF BUILD_PALETTE */ + + /* If we are excluding the tRNS chunk and there is transparency, + * then we must write a Gray-Alpha (color-type 4) or RGBA (color-type 6) + * PNG. + */ + if (mng_info->ping_exclude_tRNS != MagickFalse && + (number_transparent != 0 || number_semitransparent != 0)) + { + unsigned int colortype=mng_info->write_png_colortype; + + if (ping_have_color == MagickFalse) + mng_info->write_png_colortype = 5; + + else + mng_info->write_png_colortype = 7; + + if (colortype != 0 && + mng_info->write_png_colortype != colortype) + ping_need_colortype_warning=MagickTrue; + + } + + /* See if cheap transparency is possible. It is only possible + * when there is a single transparent color, no semitransparent + * color, and no opaque color that has the same RGB components + * as the transparent color. We only need this information if + * we are writing a PNG with colortype 0 or 2, and we have not + * excluded the tRNS chunk. + */ + if (number_transparent == 1 && + mng_info->write_png_colortype < 4) + { + ping_have_cheap_transparency = MagickTrue; + + if (number_semitransparent != 0) + ping_have_cheap_transparency = MagickFalse; + + else if (image_colors == 0 || image_colors > 256 || + image->colormap == NULL) + { + ExceptionInfo + *exception; + + const PixelPacket + *q; + + exception=(&image->exception); + + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetVirtualPixels(image,0,y,image->columns,1, exception); + + if (q == (PixelPacket *) NULL) + break; + + for (x=0; x < (ssize_t) image->columns; x++) + { + if (q->opacity != TransparentOpacity && + (unsigned short) GetPixelRed(q) == + ping_trans_color.red && + (unsigned short) GetPixelGreen(q) == + ping_trans_color.green && + (unsigned short) GetPixelBlue(q) == + ping_trans_color.blue) + { + ping_have_cheap_transparency = MagickFalse; + break; + } + + q++; + } + + if (ping_have_cheap_transparency == MagickFalse) + break; + } + } + else + { + /* Assuming that image->colormap[0] is the one transparent color + * and that all others are opaque. + */ + if (image_colors > 1) + for (i=1; icolormap[i].red == image->colormap[0].red && + image->colormap[i].green == image->colormap[0].green && + image->colormap[i].blue == image->colormap[0].blue) + { + ping_have_cheap_transparency = MagickFalse; + break; + } + } + + if (logging != MagickFalse) + { + if (ping_have_cheap_transparency == MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Cheap transparency is not possible."); + + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Cheap transparency is possible."); + } + } + else + ping_have_cheap_transparency = MagickFalse; + + image_depth=image->depth; + + quantum_info = (QuantumInfo *) NULL; + number_colors=0; + image_colors=(int) image->colors; + image_matte=image->matte; + + if (mng_info->write_png_colortype < 5) + mng_info->IsPalette=image->storage_class == PseudoClass && + image_colors <= 256 && image->colormap != NULL; + else + mng_info->IsPalette = MagickFalse; + + if ((mng_info->write_png_colortype == 4 || mng_info->write_png8) && + (image->colors == 0 || image->colormap == NULL)) + { + (void) ThrowMagickException(&image->exception, + GetMagickModule(),CoderError, + "Cannot write PNG8 or color-type 3; colormap is NULL", + "`%s'",image->filename); + + return(MagickFalse); + } + + /* + Allocate the PNG structures + */ +#ifdef PNG_USER_MEM_SUPPORTED + ping=png_create_write_struct_2(PNG_LIBPNG_VER_STRING,image, + MagickPNGErrorHandler,MagickPNGWarningHandler,(void *) NULL, + (png_malloc_ptr) Magick_png_malloc,(png_free_ptr) Magick_png_free); + +#else + ping=png_create_write_struct(PNG_LIBPNG_VER_STRING,image, + MagickPNGErrorHandler,MagickPNGWarningHandler); + +#endif + if (ping == (png_struct *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + + ping_info=png_create_info_struct(ping); + + if (ping_info == (png_info *) NULL) + { + png_destroy_write_struct(&ping,(png_info **) NULL); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + + png_set_write_fn(ping,image,png_put_data,png_flush_data); + pixel_info=(MemoryInfo *) NULL; + + if (setjmp(png_jmpbuf(ping))) + { + /* + PNG write failed. + */ +#ifdef PNG_DEBUG + if (image_info->verbose) + (void) printf("PNG write has failed.\n"); +#endif + png_destroy_write_struct(&ping,&ping_info); + +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + UnlockSemaphoreInfo(ping_semaphore); +#endif + + if (pixel_info != (MemoryInfo *) NULL) + pixel_info=RelinquishVirtualMemory(pixel_info); + + if (quantum_info != (QuantumInfo *) NULL) + quantum_info=DestroyQuantumInfo(quantum_info); + + return(MagickFalse); + } + + /* { For navigation to end of SETJMP-protected block. Within this + * block, use png_error() instead of Throwing an Exception, to ensure + * that libpng is able to clean up, and that the semaphore is unlocked. + */ + +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + LockSemaphoreInfo(ping_semaphore); +#endif + +#ifdef PNG_BENIGN_ERRORS_SUPPORTED + /* Allow benign errors */ + png_set_benign_errors(ping, 1); +#endif + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + /* Reject images with too many rows or columns */ + png_set_user_limits(ping, + (png_uint_32) MagickMin(0x7fffffffL, + GetMagickResourceLimit(WidthResource)), + (png_uint_32) MagickMin(0x7fffffffL, + GetMagickResourceLimit(HeightResource))); +#endif /* PNG_SET_USER_LIMITS_SUPPORTED */ + + /* + Prepare PNG for writing. + */ + +#if defined(PNG_MNG_FEATURES_SUPPORTED) + if (mng_info->write_mng) + { + (void) png_permit_mng_features(ping,PNG_ALL_MNG_FEATURES); +# ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Disable new libpng-1.5.10 feature when writing a MNG because + * zero-length PLTE is OK + */ + png_set_check_for_invalid_index (ping, 0); +# endif + } + +#else +# ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED + if (mng_info->write_mng) + png_permit_empty_plte(ping,MagickTrue); + +# endif +#endif + + x=0; + + ping_width=(png_uint_32) image->columns; + ping_height=(png_uint_32) image->rows; + + if (mng_info->write_png8 || mng_info->write_png24 || mng_info->write_png32) + image_depth=8; + + if (mng_info->write_png48 || mng_info->write_png64) + image_depth=16; + + if (mng_info->write_png_depth != 0) + image_depth=mng_info->write_png_depth; + + /* Adjust requested depth to next higher valid depth if necessary */ + if (image_depth > 8) + image_depth=16; + + if ((image_depth > 4) && (image_depth < 8)) + image_depth=8; + + if (image_depth == 3) + image_depth=4; + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " width=%.20g",(double) ping_width); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " height=%.20g",(double) ping_height); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image_matte=%.20g",(double) image->matte); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->depth=%.20g",(double) image->depth); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Tentative ping_bit_depth=%.20g",(double) image_depth); + } + + save_image_depth=image_depth; + ping_bit_depth=(png_byte) save_image_depth; + + +#if defined(PNG_pHYs_SUPPORTED) + if (ping_exclude_pHYs == MagickFalse) + { + if ((image->x_resolution != 0) && (image->y_resolution != 0) && + (!mng_info->write_mng || !mng_info->equal_physs)) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up pHYs chunk"); + + if (image->units == PixelsPerInchResolution) + { + ping_pHYs_unit_type=PNG_RESOLUTION_METER; + ping_pHYs_x_resolution= + (png_uint_32) ((100.0*image->x_resolution+0.5)/2.54); + ping_pHYs_y_resolution= + (png_uint_32) ((100.0*image->y_resolution+0.5)/2.54); + } + + else if (image->units == PixelsPerCentimeterResolution) + { + ping_pHYs_unit_type=PNG_RESOLUTION_METER; + ping_pHYs_x_resolution=(png_uint_32) (100.0*image->x_resolution+0.5); + ping_pHYs_y_resolution=(png_uint_32) (100.0*image->y_resolution+0.5); + } + + else + { + ping_pHYs_unit_type=PNG_RESOLUTION_UNKNOWN; + ping_pHYs_x_resolution=(png_uint_32) image->x_resolution; + ping_pHYs_y_resolution=(png_uint_32) image->y_resolution; + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Set up PNG pHYs chunk: xres: %.20g, yres: %.20g, units: %d.", + (double) ping_pHYs_x_resolution,(double) ping_pHYs_y_resolution, + (int) ping_pHYs_unit_type); + ping_have_pHYs = MagickTrue; + } + } +#endif + + if (ping_exclude_bKGD == MagickFalse) + { + if ((!mng_info->adjoin || !mng_info->equal_backgrounds)) + { + unsigned int + mask; + + mask=0xffff; + if (ping_bit_depth == 8) + mask=0x00ff; + + if (ping_bit_depth == 4) + mask=0x000f; + + if (ping_bit_depth == 2) + mask=0x0003; + + if (ping_bit_depth == 1) + mask=0x0001; + + ping_background.red=(png_uint_16) + (ScaleQuantumToShort(image->background_color.red) & mask); + + ping_background.green=(png_uint_16) + (ScaleQuantumToShort(image->background_color.green) & mask); + + ping_background.blue=(png_uint_16) + (ScaleQuantumToShort(image->background_color.blue) & mask); + + ping_background.gray=(png_uint_16) ping_background.green; + } + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up bKGD chunk (1)"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " background_color index is %d", + (int) ping_background.index); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " ping_bit_depth=%d",ping_bit_depth); + } + + ping_have_bKGD = MagickTrue; + } + + /* + Select the color type. + */ + matte=image_matte; + old_bit_depth=0; + + if (mng_info->IsPalette && mng_info->write_png8) + { + /* To do: make this a function cause it's used twice, except + for reducing the sample depth from 8. */ + + number_colors=image_colors; + + ping_have_tRNS=MagickFalse; + + /* + Set image palette. + */ + ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up PLTE chunk with %d colors (%d)", + number_colors, image_colors); + + for (i=0; i < (ssize_t) number_colors; i++) + { + palette[i].red=ScaleQuantumToChar(image->colormap[i].red); + palette[i].green=ScaleQuantumToChar(image->colormap[i].green); + palette[i].blue=ScaleQuantumToChar(image->colormap[i].blue); + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), +#if MAGICKCORE_QUANTUM_DEPTH == 8 + " %3ld (%3d,%3d,%3d)", +#else + " %5ld (%5d,%5d,%5d)", +#endif + (long) i,palette[i].red,palette[i].green,palette[i].blue); + + } + + ping_have_PLTE=MagickTrue; + image_depth=ping_bit_depth; + ping_num_trans=0; + + if (matte != MagickFalse) + { + /* + Identify which colormap entry is transparent. + */ + assert(number_colors <= 256); + assert(image->colormap != NULL); + + for (i=0; i < (ssize_t) number_transparent; i++) + ping_trans_alpha[i]=0; + + + ping_num_trans=(unsigned short) (number_transparent + + number_semitransparent); + + if (ping_num_trans == 0) + ping_have_tRNS=MagickFalse; + + else + ping_have_tRNS=MagickTrue; + } + + if (ping_exclude_bKGD == MagickFalse) + { + /* + * Identify which colormap entry is the background color. + */ + + for (i=0; i < (ssize_t) MagickMax(1L*number_colors-1L,1L); i++) + if (IsPNGColorEqual(ping_background,image->colormap[i])) + break; + + ping_background.index=(png_byte) i; + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " background_color index is %d", + (int) ping_background.index); + } + } + } /* end of write_png8 */ + + else if (mng_info->write_png_colortype == 1) + { + image_matte=MagickFalse; + ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY; + } + + else if (mng_info->write_png24 || mng_info->write_png48 || + mng_info->write_png_colortype == 3) + { + image_matte=MagickFalse; + ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; + } + + else if (mng_info->write_png32 || mng_info->write_png64 || + mng_info->write_png_colortype == 7) + { + image_matte=MagickTrue; + ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; + } + + else /* mng_info->write_pngNN not specified */ + { + image_depth=ping_bit_depth; + + if (mng_info->write_png_colortype != 0) + { + ping_color_type=(png_byte) mng_info->write_png_colortype-1; + + if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || + ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) + image_matte=MagickTrue; + + else + image_matte=MagickFalse; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " PNG colortype %d was specified:",(int) ping_color_type); + } + + else /* write_png_colortype not specified */ + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Selecting PNG colortype:"); + + if (image_info->type == TrueColorType) + { + ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; + image_matte=MagickFalse; + } + else if (image_info->type == TrueColorMatteType) + { + ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; + image_matte=MagickTrue; + } + else if (image_info->type == PaletteType || + image_info->type == PaletteMatteType) + ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; + else + { + if (ping_have_color == MagickFalse) + { + if (image_matte == MagickFalse) + { + ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY; + image_matte=MagickFalse; + } + + else + { + ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY_ALPHA; + image_matte=MagickTrue; + } + } + else + { + if (image_matte == MagickFalse) + { + ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; + image_matte=MagickFalse; + } + + else + { + ping_color_type=(png_byte) PNG_COLOR_TYPE_RGBA; + image_matte=MagickTrue; + } + } + } + + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Selected PNG colortype=%d",ping_color_type); + + if (ping_bit_depth < 8) + { + if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || + ping_color_type == PNG_COLOR_TYPE_RGB || + ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) + ping_bit_depth=8; + } + + old_bit_depth=ping_bit_depth; + + if (ping_color_type == PNG_COLOR_TYPE_GRAY) + { + if (image->matte == MagickFalse && ping_have_non_bw == MagickFalse) + ping_bit_depth=1; + } + + if (ping_color_type == PNG_COLOR_TYPE_PALETTE) + { + size_t one = 1; + ping_bit_depth=1; + + if (image->colors == 0) + { + /* DO SOMETHING */ + png_error(ping,"image has 0 colors"); + } + + while ((int) (one << ping_bit_depth) < (ssize_t) image_colors) + ping_bit_depth <<= 1; + } + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Number of colors: %.20g",(double) image_colors); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Tentative PNG bit depth: %d",ping_bit_depth); + } + + if (ping_bit_depth < (int) mng_info->write_png_depth) + ping_bit_depth = mng_info->write_png_depth; + } + + (void) old_bit_depth; + image_depth=ping_bit_depth; + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Tentative PNG color type: %s (%.20g)", + PngColorTypeToString(ping_color_type), + (double) ping_color_type); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image_info->type: %.20g",(double) image_info->type); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image_depth: %.20g",(double) image_depth); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + + " image->depth: %.20g",(double) image->depth); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " ping_bit_depth: %.20g",(double) ping_bit_depth); + } + + if (matte != MagickFalse) + { + if (mng_info->IsPalette) + { + if (mng_info->write_png_colortype == 0) + { + ping_color_type=PNG_COLOR_TYPE_GRAY_ALPHA; + + if (ping_have_color != MagickFalse) + ping_color_type=PNG_COLOR_TYPE_RGBA; + } + + /* + * Determine if there is any transparent color. + */ + if (number_transparent + number_semitransparent == 0) + { + /* + No transparent pixels are present. Change 4 or 6 to 0 or 2. + */ + + image_matte=MagickFalse; + + if (mng_info->write_png_colortype == 0) + ping_color_type&=0x03; + } + + else + { + unsigned int + mask; + + mask=0xffff; + + if (ping_bit_depth == 8) + mask=0x00ff; + + if (ping_bit_depth == 4) + mask=0x000f; + + if (ping_bit_depth == 2) + mask=0x0003; + + if (ping_bit_depth == 1) + mask=0x0001; + + ping_trans_color.red=(png_uint_16) + (ScaleQuantumToShort(image->colormap[0].red) & mask); + + ping_trans_color.green=(png_uint_16) + (ScaleQuantumToShort(image->colormap[0].green) & mask); + + ping_trans_color.blue=(png_uint_16) + (ScaleQuantumToShort(image->colormap[0].blue) & mask); + + ping_trans_color.gray=(png_uint_16) + (ScaleQuantumToShort(ClampToQuantum(GetPixelLuma(image, + image->colormap))) & mask); + + ping_trans_color.index=(png_byte) 0; + + ping_have_tRNS=MagickTrue; + } + + if (ping_have_tRNS != MagickFalse) + { + /* + * Determine if there is one and only one transparent color + * and if so if it is fully transparent. + */ + if (ping_have_cheap_transparency == MagickFalse) + ping_have_tRNS=MagickFalse; + } + + if (ping_have_tRNS != MagickFalse) + { + if (mng_info->write_png_colortype == 0) + ping_color_type &= 0x03; /* changes 4 or 6 to 0 or 2 */ + + if (image_depth == 8) + { + ping_trans_color.red&=0xff; + ping_trans_color.green&=0xff; + ping_trans_color.blue&=0xff; + ping_trans_color.gray&=0xff; + } + } + } + else + { + if (image_depth == 8) + { + ping_trans_color.red&=0xff; + ping_trans_color.green&=0xff; + ping_trans_color.blue&=0xff; + ping_trans_color.gray&=0xff; + } + } + } + + matte=image_matte; + + if (ping_have_tRNS != MagickFalse) + image_matte=MagickFalse; + + if ((mng_info->IsPalette) && + mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_PALETTE && + ping_have_color == MagickFalse && + (image_matte == MagickFalse || image_depth >= 8)) + { + size_t one=1; + + if (image_matte != MagickFalse) + ping_color_type=PNG_COLOR_TYPE_GRAY_ALPHA; + + else if (mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_GRAY_ALPHA) + { + ping_color_type=PNG_COLOR_TYPE_GRAY; + + if (save_image_depth == 16 && image_depth == 8) + { + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Scaling ping_trans_color (0)"); + } + ping_trans_color.gray*=0x0101; + } + } + + if (image_depth > MAGICKCORE_QUANTUM_DEPTH) + image_depth=MAGICKCORE_QUANTUM_DEPTH; + + if ((image_colors == 0) || + ((ssize_t) (image_colors-1) > (ssize_t) MaxColormapSize)) + image_colors=(int) (one << image_depth); + + if (image_depth > 8) + ping_bit_depth=16; + + else + { + ping_bit_depth=8; + if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) + { + if(!mng_info->write_png_depth) + { + ping_bit_depth=1; + + while ((int) (one << ping_bit_depth) + < (ssize_t) image_colors) + ping_bit_depth <<= 1; + } + } + + else if (ping_color_type == + PNG_COLOR_TYPE_GRAY && image_colors < 17 && + mng_info->IsPalette) + { + /* Check if grayscale is reducible */ + + int + depth_4_ok=MagickTrue, + depth_2_ok=MagickTrue, + depth_1_ok=MagickTrue; + + for (i=0; i < (ssize_t) image_colors; i++) + { + unsigned char + intensity; + + intensity=ScaleQuantumToChar(image->colormap[i].red); + + if ((intensity & 0x0f) != ((intensity & 0xf0) >> 4)) + depth_4_ok=depth_2_ok=depth_1_ok=MagickFalse; + else if ((intensity & 0x03) != ((intensity & 0x0c) >> 2)) + depth_2_ok=depth_1_ok=MagickFalse; + else if ((intensity & 0x01) != ((intensity & 0x02) >> 1)) + depth_1_ok=MagickFalse; + } + + if (depth_1_ok && mng_info->write_png_depth <= 1) + ping_bit_depth=1; + + else if (depth_2_ok && mng_info->write_png_depth <= 2) + ping_bit_depth=2; + + else if (depth_4_ok && mng_info->write_png_depth <= 4) + ping_bit_depth=4; + } + } + + image_depth=ping_bit_depth; + } + + else + + if (mng_info->IsPalette) + { + number_colors=image_colors; + + if (image_depth <= 8) + { + /* + Set image palette. + */ + ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; + + if (!(mng_info->have_write_global_plte && matte == MagickFalse)) + { + for (i=0; i < (ssize_t) number_colors; i++) + { + palette[i].red=ScaleQuantumToChar(image->colormap[i].red); + palette[i].green=ScaleQuantumToChar(image->colormap[i].green); + palette[i].blue=ScaleQuantumToChar(image->colormap[i].blue); + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up PLTE chunk with %d colors", + number_colors); + + ping_have_PLTE=MagickTrue; + } + + /* color_type is PNG_COLOR_TYPE_PALETTE */ + if (mng_info->write_png_depth == 0) + { + size_t + one; + + ping_bit_depth=1; + one=1; + + while ((one << ping_bit_depth) < (size_t) number_colors) + ping_bit_depth <<= 1; + } + + ping_num_trans=0; + + if (matte != MagickFalse) + { + /* + * Set up trans_colors array. + */ + assert(number_colors <= 256); + + ping_num_trans=(unsigned short) (number_transparent + + number_semitransparent); + + if (ping_num_trans == 0) + ping_have_tRNS=MagickFalse; + + else + { + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Scaling ping_trans_color (1)"); + } + ping_have_tRNS=MagickTrue; + + for (i=0; i < ping_num_trans; i++) + { + ping_trans_alpha[i]= (png_byte) (255- + ScaleQuantumToChar(image->colormap[i].opacity)); + } + } + } + } + } + + else + { + + if (image_depth < 8) + image_depth=8; + + if ((save_image_depth == 16) && (image_depth == 8)) + { + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Scaling ping_trans_color from (%d,%d,%d)", + (int) ping_trans_color.red, + (int) ping_trans_color.green, + (int) ping_trans_color.blue); + } + + ping_trans_color.red*=0x0101; + ping_trans_color.green*=0x0101; + ping_trans_color.blue*=0x0101; + ping_trans_color.gray*=0x0101; + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " to (%d,%d,%d)", + (int) ping_trans_color.red, + (int) ping_trans_color.green, + (int) ping_trans_color.blue); + } + } + } + + if (ping_bit_depth < (ssize_t) mng_info->write_png_depth) + ping_bit_depth = (ssize_t) mng_info->write_png_depth; + + /* + Adjust background and transparency samples in sub-8-bit grayscale files. + */ + if (ping_bit_depth < 8 && ping_color_type == + PNG_COLOR_TYPE_GRAY) + { + png_uint_16 + maxval; + + size_t + one=1; + + maxval=(png_uint_16) ((one << ping_bit_depth)-1); + + if (ping_exclude_bKGD == MagickFalse) + { + + ping_background.gray=(png_uint_16) + ((maxval/65535.)*(ScaleQuantumToShort((Quantum) + GetPixelLuma(image,&image->background_color)))+.5); + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up bKGD chunk (2)"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " ping_background.index is %d", + (int) ping_background.index); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " ping_background.gray is %d", + (int) ping_background.gray); + } + + ping_have_bKGD = MagickTrue; + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Scaling ping_trans_color.gray from %d", + (int)ping_trans_color.gray); + + ping_trans_color.gray=(png_uint_16) ((maxval/255.)*( + ping_trans_color.gray)+.5); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " to %d", (int)ping_trans_color.gray); + } + + if (ping_exclude_bKGD == MagickFalse) + { + if (mng_info->IsPalette && (int) ping_color_type == PNG_COLOR_TYPE_PALETTE) + { + /* + Identify which colormap entry is the background color. + */ + + number_colors=image_colors; + + for (i=0; i < (ssize_t) MagickMax(1L*number_colors,1L); i++) + if (IsPNGColorEqual(image->background_color,image->colormap[i])) + break; + + ping_background.index=(png_byte) i; + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up bKGD chunk with index=%d",(int) i); + } + + if (i < (ssize_t) number_colors) + { + ping_have_bKGD = MagickTrue; + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " background =(%d,%d,%d)", + (int) ping_background.red, + (int) ping_background.green, + (int) ping_background.blue); + } + } + + else /* Can't happen */ + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " No room in PLTE to add bKGD color"); + ping_have_bKGD = MagickFalse; + } + } + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " PNG color type: %s (%d)", PngColorTypeToString(ping_color_type), + ping_color_type); + /* + Initialize compression level and filtering. + */ + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up deflate compression"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression buffer size: 32768"); + } + + png_set_compression_buffer_size(ping,32768L); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression mem level: 9"); + + png_set_compression_mem_level(ping, 9); + + /* Untangle the "-quality" setting: + + Undefined is 0; the default is used. + Default is 75 + + 10's digit: + + 0 or omitted: Use Z_HUFFMAN_ONLY strategy with the + zlib default compression level + + 1-9: the zlib compression level + + 1's digit: + + 0-4: the PNG filter method + + 5: libpng adaptive filtering if compression level > 5 + libpng filter type "none" if compression level <= 5 + or if image is grayscale or palette + + 6: libpng adaptive filtering + + 7: "LOCO" filtering (intrapixel differing) if writing + a MNG, otherwise "none". Did not work in IM-6.7.0-9 + and earlier because of a missing "else". + + 8: Z_RLE strategy (or Z_HUFFMAN_ONLY if quality < 10), adaptive + filtering. Unused prior to IM-6.7.0-10, was same as 6 + + 9: Z_RLE strategy (or Z_HUFFMAN_ONLY if quality < 10), no PNG filters + Unused prior to IM-6.7.0-10, was same as 6 + + Note that using the -quality option, not all combinations of + PNG filter type, zlib compression level, and zlib compression + strategy are possible. This is addressed by using + "-define png:compression-strategy", etc., which takes precedence + over -quality. + + */ + + quality=image_info->quality == UndefinedCompressionQuality ? 75UL : + image_info->quality; + + if (quality <= 9) + { + if (mng_info->write_png_compression_strategy == 0) + mng_info->write_png_compression_strategy = Z_HUFFMAN_ONLY+1; + } + + else if (mng_info->write_png_compression_level == 0) + { + int + level; + + level=(int) MagickMin((ssize_t) quality/10,9); + + mng_info->write_png_compression_level = level+1; + } + + if (mng_info->write_png_compression_strategy == 0) + { + if ((quality %10) == 8 || (quality %10) == 9) +#ifdef Z_RLE /* Z_RLE was added to zlib-1.2.0 */ + mng_info->write_png_compression_strategy=Z_RLE+1; +#else + mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; +#endif + } + + if (mng_info->write_png_compression_filter == 0) + mng_info->write_png_compression_filter=((int) quality % 10) + 1; + + if (logging != MagickFalse) + { + if (mng_info->write_png_compression_level) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression level: %d", + (int) mng_info->write_png_compression_level-1); + + if (mng_info->write_png_compression_strategy) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Compression strategy: %d", + (int) mng_info->write_png_compression_strategy-1); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up filtering"); + + if (mng_info->write_png_compression_filter == 6) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Base filter method: ADAPTIVE"); + else if (mng_info->write_png_compression_filter == 0 || + mng_info->write_png_compression_filter == 1) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Base filter method: NONE"); + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Base filter method: %d", + (int) mng_info->write_png_compression_filter-1); + } + + if (mng_info->write_png_compression_level != 0) + png_set_compression_level(ping,mng_info->write_png_compression_level-1); + + if (mng_info->write_png_compression_filter == 6) + { + if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || + ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) || + (quality < 50)) + png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); + else + png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_ALL_FILTERS); + } + + else if (mng_info->write_png_compression_filter == 7 || + mng_info->write_png_compression_filter == 10) + png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_ALL_FILTERS); + + else if (mng_info->write_png_compression_filter == 8) + { +#if defined(PNG_MNG_FEATURES_SUPPORTED) && defined(PNG_INTRAPIXEL_DIFFERENCING) + if (mng_info->write_mng) + { + if (((int) ping_color_type == PNG_COLOR_TYPE_RGB) || + ((int) ping_color_type == PNG_COLOR_TYPE_RGBA)) + ping_filter_method=PNG_INTRAPIXEL_DIFFERENCING; + } +#endif + png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); + } + + else if (mng_info->write_png_compression_filter == 9) + png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); + + else if (mng_info->write_png_compression_filter != 0) + png_set_filter(ping,PNG_FILTER_TYPE_BASE, + mng_info->write_png_compression_filter-1); + + if (mng_info->write_png_compression_strategy != 0) + png_set_compression_strategy(ping, + mng_info->write_png_compression_strategy-1); + + ping_interlace_method=image_info->interlace != NoInterlace; + + if (mng_info->write_mng) + png_set_sig_bytes(ping,8); + + /* Bail out if cannot meet defined png:bit-depth or png:color-type */ + + if (mng_info->write_png_colortype != 0) + { + if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_GRAY) + if (ping_have_color != MagickFalse) + { + ping_color_type = PNG_COLOR_TYPE_RGB; + + if (ping_bit_depth < 8) + ping_bit_depth=8; + } + + if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_GRAY_ALPHA) + if (ping_have_color != MagickFalse) + ping_color_type = PNG_COLOR_TYPE_RGB_ALPHA; + } + + if (ping_need_colortype_warning != MagickFalse || + ((mng_info->write_png_depth && + (int) mng_info->write_png_depth != ping_bit_depth) || + (mng_info->write_png_colortype && + ((int) mng_info->write_png_colortype-1 != ping_color_type && + mng_info->write_png_colortype != 7 && + !(mng_info->write_png_colortype == 5 && ping_color_type == 0))))) + { + if (logging != MagickFalse) + { + if (ping_need_colortype_warning != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Image has transparency but tRNS chunk was excluded"); + } + + if (mng_info->write_png_depth) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Defined png:bit-depth=%u, Computed depth=%u", + mng_info->write_png_depth, + ping_bit_depth); + } + + if (mng_info->write_png_colortype) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Defined png:color-type=%u, Computed color type=%u", + mng_info->write_png_colortype-1, + ping_color_type); + } + } + + png_warning(ping, + "Cannot write image with defined png:bit-depth or png:color-type."); + } + + if (image_matte != MagickFalse && image->matte == MagickFalse) + { + /* Add an opaque matte channel */ + image->matte = MagickTrue; + (void) SetImageOpacity(image,0); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Added an opaque matte channel"); + } + + if (number_transparent != 0 || number_semitransparent != 0) + { + if (ping_color_type < 4) + { + ping_have_tRNS=MagickTrue; + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting ping_have_tRNS=MagickTrue."); + } + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing PNG header chunks"); + + png_set_IHDR(ping,ping_info,ping_width,ping_height, + ping_bit_depth,ping_color_type, + ping_interlace_method,ping_compression_method, + ping_filter_method); + + if (ping_color_type == 3 && ping_have_PLTE != MagickFalse) + { + if (mng_info->have_write_global_plte && matte == MagickFalse) + { + png_set_PLTE(ping,ping_info,NULL,0); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up empty PLTE chunk"); + } + + else + png_set_PLTE(ping,ping_info,palette,number_colors); + + if (logging != MagickFalse) + { + for (i=0; i< (ssize_t) number_colors; i++) + { + if (i < ping_num_trans) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " PLTE[%d] = (%d,%d,%d), tRNS[%d] = (%d)", + (int) i, + (int) palette[i].red, + (int) palette[i].green, + (int) palette[i].blue, + (int) i, + (int) ping_trans_alpha[i]); + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " PLTE[%d] = (%d,%d,%d)", + (int) i, + (int) palette[i].red, + (int) palette[i].green, + (int) palette[i].blue); + } + } + } + + /* Only write the iCCP chunk if we are not writing the sRGB chunk. */ + if (ping_exclude_sRGB != MagickFalse || + (!png_get_valid(ping,ping_info,PNG_INFO_sRGB))) + { + if ((ping_exclude_tEXt == MagickFalse || + ping_exclude_zTXt == MagickFalse) && + (ping_exclude_iCCP == MagickFalse || ping_exclude_zCCP == MagickFalse)) + { + ResetImageProfileIterator(image); + for (name=GetNextImageProfile(image); name != (const char *) NULL; ) + { + profile=GetImageProfile(image,name); + + if (profile != (StringInfo *) NULL) + { +#ifdef PNG_WRITE_iCCP_SUPPORTED + if ((LocaleCompare(name,"ICC") == 0) || + (LocaleCompare(name,"ICM") == 0)) + { + + if (ping_exclude_iCCP == MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up iCCP chunk"); + + png_set_iCCP(ping,ping_info,(const png_charp) name,0, +#if (PNG_LIBPNG_VER < 10500) + (png_charp) GetStringInfoDatum(profile), +#else + (const png_byte *) GetStringInfoDatum(profile), +#endif + (png_uint_32) GetStringInfoLength(profile)); + ping_have_iCCP = MagickTrue; + } + } + + else +#endif + { + if (LocaleCompare(name,"exif") == 0) + { + /* Do not write hex-encoded ICC chunk; we will + write it later as an eXIf chunk */ + name=GetNextImageProfile(image); + continue; + } + if (ping_exclude_zCCP == MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up zTXT chunk with uuencoded ICC"); + Magick_png_write_raw_profile(image_info,ping,ping_info, + (unsigned char *) name,(unsigned char *) name, + GetStringInfoDatum(profile),(png_uint_32) + GetStringInfoLength(profile),&image->exception); + ping_have_iCCP = MagickTrue; + } + } + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up text chunk with %s profile",name); + + name=GetNextImageProfile(image); + } + } + } + +#if defined(PNG_WRITE_sRGB_SUPPORTED) + if ((mng_info->have_write_global_srgb == 0) && + ping_have_iCCP != MagickTrue && + (ping_have_sRGB != MagickFalse || + png_get_valid(ping,ping_info,PNG_INFO_sRGB))) + { + if (ping_exclude_sRGB == MagickFalse) + { + /* + Note image rendering intent. + */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up sRGB chunk"); + + (void) png_set_sRGB(ping,ping_info,( + Magick_RenderingIntent_to_PNG_RenderingIntent( + image->rendering_intent))); + + ping_have_sRGB = MagickTrue; + } + } + + if ((!mng_info->write_mng) || (!png_get_valid(ping,ping_info,PNG_INFO_sRGB))) +#endif + { + if (ping_exclude_gAMA == MagickFalse && + ping_have_iCCP == MagickFalse && + ping_have_sRGB == MagickFalse && + (ping_exclude_sRGB == MagickFalse || + (image->gamma < .45 || image->gamma > .46))) + { + if ((mng_info->have_write_global_gama == 0) && (image->gamma != 0.0)) + { + /* + Note image gamma. + To do: check for cHRM+gAMA == sRGB, and write sRGB instead. + */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up gAMA chunk"); + + png_set_gAMA(ping,ping_info,image->gamma); + } + } + + if (ping_exclude_cHRM == MagickFalse && ping_have_sRGB == MagickFalse) + { + if ((mng_info->have_write_global_chrm == 0) && + (image->chromaticity.red_primary.x != 0.0)) + { + /* + Note image chromaticity. + Note: if cHRM+gAMA == sRGB write sRGB instead. + */ + PrimaryInfo + bp, + gp, + rp, + wp; + + wp=image->chromaticity.white_point; + rp=image->chromaticity.red_primary; + gp=image->chromaticity.green_primary; + bp=image->chromaticity.blue_primary; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up cHRM chunk"); + + png_set_cHRM(ping,ping_info,wp.x,wp.y,rp.x,rp.y,gp.x,gp.y, + bp.x,bp.y); + } + } + } + + + if (ping_exclude_bKGD == MagickFalse) + { + if (ping_have_bKGD != MagickFalse) + { + png_set_bKGD(ping,ping_info,&ping_background); + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up bKGD chunk"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " background color = (%d,%d,%d)", + (int) ping_background.red, + (int) ping_background.green, + (int) ping_background.blue); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " index = %d, gray=%d", + (int) ping_background.index, + (int) ping_background.gray); + } + } + } + + if (ping_exclude_pHYs == MagickFalse) + { + if (ping_have_pHYs != MagickFalse) + { + png_set_pHYs(ping,ping_info, + ping_pHYs_x_resolution, + ping_pHYs_y_resolution, + ping_pHYs_unit_type); + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up pHYs chunk"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " x_resolution=%lu", + (unsigned long) ping_pHYs_x_resolution); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " y_resolution=%lu", + (unsigned long) ping_pHYs_y_resolution); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " unit_type=%lu", + (unsigned long) ping_pHYs_unit_type); + } + } + } + +#if defined(PNG_tIME_SUPPORTED) + if (ping_exclude_tIME == MagickFalse) + { + const char + *timestamp; + + if (image->taint == MagickFalse) + { + timestamp=GetImageOption(image_info,"png:tIME"); + + if (timestamp == (const char *) NULL) + timestamp=GetImageProperty(image,"png:tIME"); + } + + else + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Reset tIME in tainted image"); + timestamp=GetImageProperty(image,"date:modify"); + } + + if (timestamp != (const char *) NULL) + write_tIME_chunk(image,ping,ping_info,timestamp); + } +#endif + + if (mng_info->need_blob != MagickFalse) + { + if (OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception) == + MagickFalse) + png_error(ping,"WriteBlob Failed"); + + ping_have_blob=MagickTrue; + (void) ping_have_blob; + } + + png_write_info_before_PLTE(ping, ping_info); + + if (ping_have_tRNS != MagickFalse && ping_color_type < 4) + { + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Calling png_set_tRNS with num_trans=%d",ping_num_trans); + } + + if (ping_color_type == 3) + (void) png_set_tRNS(ping, ping_info, + ping_trans_alpha, + ping_num_trans, + NULL); + + else + { + (void) png_set_tRNS(ping, ping_info, + NULL, + 0, + &ping_trans_color); + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " tRNS color =(%d,%d,%d)", + (int) ping_trans_color.red, + (int) ping_trans_color.green, + (int) ping_trans_color.blue); + } + } + } + + png_write_info(ping,ping_info); + + ping_wrote_caNv = MagickFalse; + + /* write caNv chunk */ + if (ping_exclude_caNv == MagickFalse) + { + if ((image->page.width != 0 && image->page.width != image->columns) || + (image->page.height != 0 && image->page.height != image->rows) || + image->page.x != 0 || image->page.y != 0) + { + unsigned char + chunk[20]; + + (void) WriteBlobMSBULong(image,16L); /* data length=8 */ + PNGType(chunk,mng_caNv); + LogPNGChunk(logging,mng_caNv,16L); + PNGLong(chunk+4,(png_uint_32) image->page.width); + PNGLong(chunk+8,(png_uint_32) image->page.height); + PNGsLong(chunk+12,(png_int_32) image->page.x); + PNGsLong(chunk+16,(png_int_32) image->page.y); + (void) WriteBlob(image,20,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,20)); + ping_wrote_caNv = MagickTrue; + } + } + +#if defined(PNG_oFFs_SUPPORTED) + if (ping_exclude_oFFs == MagickFalse && ping_wrote_caNv == MagickFalse) + { + if (image->page.x || image->page.y) + { + png_set_oFFs(ping,ping_info,(png_int_32) image->page.x, + (png_int_32) image->page.y, 0); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up oFFs chunk with x=%d, y=%d, units=0", + (int) image->page.x, (int) image->page.y); + } + } +#endif + +#if (PNG_LIBPNG_VER == 10206) + /* avoid libpng-1.2.6 bug by setting PNG_HAVE_IDAT flag */ +#define PNG_HAVE_IDAT 0x04 + ping->mode |= PNG_HAVE_IDAT; +#undef PNG_HAVE_IDAT +#endif + + png_set_packing(ping); + /* + Allocate memory. + */ + rowbytes=image->columns; + if (image_depth > 8) + rowbytes*=2; + switch (ping_color_type) + { + case PNG_COLOR_TYPE_RGB: + rowbytes*=3; + break; + + case PNG_COLOR_TYPE_GRAY_ALPHA: + rowbytes*=2; + break; + + case PNG_COLOR_TYPE_RGBA: + rowbytes*=4; + break; + + default: + break; + } + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing PNG image data"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Allocating %.20g bytes of memory for pixels",(double) rowbytes); + } + pixel_info=AcquireVirtualMemory(rowbytes,sizeof(*ping_pixels)); + if (pixel_info == (MemoryInfo *) NULL) + png_error(ping,"Allocation of memory for pixels failed"); + ping_pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + (void) memset(ping_pixels,0,rowbytes*sizeof(*ping_pixels)); + /* + Initialize image scanlines. + */ + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + png_error(ping,"Memory allocation for quantum_info failed"); + quantum_info->format=UndefinedQuantumFormat; + SetQuantumDepth(image,quantum_info,image_depth); + (void) SetQuantumEndian(image,quantum_info,MSBEndian); + num_passes=png_set_interlace_handling(ping); + + if ((mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_PALETTE) || + ((!mng_info->write_png8 && !mng_info->write_png24 && + !mng_info->write_png48 && !mng_info->write_png64 && + !mng_info->write_png32) && + (mng_info->IsPalette || + (image_info->type == BilevelType)) && + image_matte == MagickFalse && + ping_have_non_bw == MagickFalse)) + { + /* Palette, Bilevel, or Opaque Monochrome */ + QuantumType + quantum_type; + + const PixelPacket + *p; + + quantum_type=RedQuantum; + if (mng_info->IsPalette) + { + quantum_type=GrayQuantum; + if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_PALETTE) + quantum_type=IndexQuantum; + } + SetQuantumDepth(image,quantum_info,8); + for (pass=0; pass < num_passes; pass++) + { + /* + Convert PseudoClass image to a PNG monochrome image. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + if (logging != MagickFalse && y == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing row of pixels (0)"); + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + + if (p == (const PixelPacket *) NULL) + break; + + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,ping_pixels,&image->exception); + if (mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_PALETTE) + for (i=0; i < (ssize_t) image->columns; i++) + *(ping_pixels+i)=(unsigned char) ((*(ping_pixels+i) > 127) ? + 255 : 0); + + if (logging != MagickFalse && y == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing row of pixels (1)"); + + png_write_row(ping,ping_pixels); + + status=SetImageProgress(image,SaveImageTag, + (MagickOffsetType) (pass * image->rows + y), + num_passes * image->rows); + if (status == MagickFalse) + break; + } + } + } + + else /* Not Palette, Bilevel, or Opaque Monochrome */ + { + if ((!mng_info->write_png8 && !mng_info->write_png24 && + !mng_info->write_png48 && !mng_info->write_png64 && + !mng_info->write_png32) && (image_matte != MagickFalse || + (ping_bit_depth >= MAGICKCORE_QUANTUM_DEPTH)) && + (mng_info->IsPalette) && ping_have_color == MagickFalse) + { + const PixelPacket + *p; + + for (pass=0; pass < num_passes; pass++) + { + + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + + if (p == (const PixelPacket *) NULL) + break; + + if (ping_color_type == PNG_COLOR_TYPE_GRAY) + { + if (mng_info->IsPalette) + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayQuantum,ping_pixels,&image->exception); + + else + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,ping_pixels,&image->exception); + + if (logging != MagickFalse && y == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing GRAY PNG pixels (2)"); + } + + else /* PNG_COLOR_TYPE_GRAY_ALPHA */ + { + if (logging != MagickFalse && y == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing GRAY_ALPHA PNG pixels (2)"); + + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayAlphaQuantum,ping_pixels,&image->exception); + } + + if (logging != MagickFalse && y == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing row of pixels (2)"); + + png_write_row(ping,ping_pixels); + + status=SetImageProgress(image,SaveImageTag, + (MagickOffsetType) (pass * image->rows + y), + num_passes * image->rows); + if (status == MagickFalse) + break; + } + } + } + + else + { + const PixelPacket + *p; + + for (pass=0; pass < num_passes; pass++) + { + if ((image_depth > 8) || + mng_info->write_png24 || + mng_info->write_png32 || + mng_info->write_png48 || + mng_info->write_png64 || + (!mng_info->write_png8 && !mng_info->IsPalette)) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + + if (p == (const PixelPacket *) NULL) + break; + + if (ping_color_type == PNG_COLOR_TYPE_GRAY) + { + if (image->storage_class == DirectClass) + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,ping_pixels,&image->exception); + + else + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayQuantum,ping_pixels,&image->exception); + } + + else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayAlphaQuantum,ping_pixels, + &image->exception); + + if (logging != MagickFalse && y == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing GRAY_ALPHA PNG pixels (3)"); + } + + else if (image_matte != MagickFalse) + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RGBAQuantum,ping_pixels,&image->exception); + + else + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RGBQuantum,ping_pixels,&image->exception); + + if (logging != MagickFalse && y == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing row of pixels (3)"); + + png_write_row(ping,ping_pixels); + + status=SetImageProgress(image,SaveImageTag, + (MagickOffsetType) (pass * image->rows + y), + num_passes * image->rows); + if (status == MagickFalse) + break; + } + } + + else + /* not ((image_depth > 8) || + mng_info->write_png24 || mng_info->write_png32 || + mng_info->write_png48 || mng_info->write_png64 || + (!mng_info->write_png8 && !mng_info->IsPalette)) + */ + { + if ((ping_color_type != PNG_COLOR_TYPE_GRAY) && + (ping_color_type != PNG_COLOR_TYPE_GRAY_ALPHA)) + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " pass %d, Image Is not GRAY or GRAY_ALPHA",pass); + + SetQuantumDepth(image,quantum_info,8); + image_depth=8; + } + + for (y=0; y < (ssize_t) image->rows; y++) + { + if (logging != MagickFalse && y == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " pass %d, Image Is RGB, 16-bit GRAY, or GRAY_ALPHA",pass); + + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + + if (p == (const PixelPacket *) NULL) + break; + + if (ping_color_type == PNG_COLOR_TYPE_GRAY) + { + SetQuantumDepth(image,quantum_info,image->depth); + + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayQuantum,ping_pixels,&image->exception); + } + + else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (logging != MagickFalse && y == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing GRAY_ALPHA PNG pixels (4)"); + + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayAlphaQuantum,ping_pixels, + &image->exception); + } + + else + { + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,IndexQuantum,ping_pixels,&image->exception); + + if (logging != MagickFalse && y <= 2) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing row of non-gray pixels (4)"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " ping_pixels[0]=%d,ping_pixels[1]=%d", + (int)ping_pixels[0],(int)ping_pixels[1]); + } + } + png_write_row(ping,ping_pixels); + + status=SetImageProgress(image,SaveImageTag, + (MagickOffsetType) (pass * image->rows + y), + num_passes * image->rows); + if (status == MagickFalse) + break; + } + } + } + } + } + + if (quantum_info != (QuantumInfo *) NULL) + quantum_info=DestroyQuantumInfo(quantum_info); + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Wrote PNG image data"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Width: %.20g",(double) ping_width); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Height: %.20g",(double) ping_height); + + if (mng_info->write_png_depth) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Defined png:bit-depth: %d",mng_info->write_png_depth); + } + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " PNG bit-depth written: %d",ping_bit_depth); + + if (mng_info->write_png_colortype) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Defined png:color-type: %d",mng_info->write_png_colortype-1); + } + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " PNG color-type written: %d",ping_color_type); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " PNG Interlace method: %d",ping_interlace_method); + } + /* + Generate text chunks after IDAT. + */ + if (ping_exclude_tEXt == MagickFalse || ping_exclude_zTXt == MagickFalse) + { + ResetImagePropertyIterator(image); + property=GetNextImageProperty(image); + while (property != (const char *) NULL) + { + png_textp + text; + + value=GetImageProperty(image,property); + + /* Don't write any "png:" or "jpeg:" properties; those are just for + * "identify" or for passing through to another JPEG + */ + if ((LocaleNCompare(property,"png:",4) != 0 && + LocaleNCompare(property,"jpeg:",5) != 0) && + + /* Suppress density and units if we wrote a pHYs chunk */ + (ping_exclude_pHYs != MagickFalse || + LocaleCompare(property,"density") != 0 || + LocaleCompare(property,"units") != 0) && + + /* Suppress the IM-generated Date:create and Date:modify */ + (ping_exclude_date == MagickFalse || + LocaleNCompare(property, "Date:",5) != 0)) + { + if (value != (const char *) NULL) + { + +#if PNG_LIBPNG_VER >= 10400 + text=(png_textp) png_malloc(ping, + (png_alloc_size_t) sizeof(png_text)); +#else + text=(png_textp) png_malloc(ping,(png_size_t) sizeof(png_text)); +#endif + text[0].key=(char *) property; + text[0].text=(char *) value; + text[0].text_length=strlen(value); + + if (ping_exclude_tEXt != MagickFalse) + text[0].compression=PNG_TEXT_COMPRESSION_zTXt; + + else if (ping_exclude_zTXt != MagickFalse) + text[0].compression=PNG_TEXT_COMPRESSION_NONE; + + else + { + text[0].compression=image_info->compression == NoCompression || + (image_info->compression == UndefinedCompression && + text[0].text_length < 128) ? PNG_TEXT_COMPRESSION_NONE : + PNG_TEXT_COMPRESSION_zTXt ; + } + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Setting up text chunk"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " keyword: '%s'",text[0].key); + } + + png_set_text(ping,ping_info,text,1); + png_free(ping,text); + } + } + property=GetNextImageProperty(image); + } + } + + /* write eXIf profile */ + if (ping_have_eXIf != MagickFalse && ping_exclude_eXIf == MagickFalse) + { + char + *name; + + ResetImageProfileIterator(image); + + for (name=GetNextImageProfile(image); name != (const char *) NULL; ) + { + if (LocaleCompare(name,"exif") == 0) + { + const StringInfo + *profile; + + profile=GetImageProfile(image,name); + + if (profile != (StringInfo *) NULL) + { + png_uint_32 + length; + unsigned char + chunk[4], + *data; + + StringInfo + *ping_profile; + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Have eXIf profile"); + + ping_profile=CloneStringInfo(profile); + data=GetStringInfoDatum(ping_profile), + + length=(png_uint_32) GetStringInfoLength(ping_profile); + + PNGType(chunk,mng_eXIf); + if (length < 7) + { + ping_profile=DestroyStringInfo(ping_profile); + break; /* otherwise crashes */ + } + + if (*data == 'E' && *(data+1) == 'x' && *(data+2) == 'i' && + *(data+3) == 'f' && *(data+4) == '\0' && *(data+5) == '\0') + { + /* skip the "Exif\0\0" JFIF Exif Header ID */ + length -= 6; + data += 6; + } + + LogPNGChunk(logging,chunk,length); + (void) WriteBlobMSBULong(image,length); + (void) WriteBlob(image,4,chunk); + (void) WriteBlob(image,length,data); + (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4), data, + (uInt) length)); + ping_profile=DestroyStringInfo(ping_profile); + break; + } + } + name=GetNextImageProfile(image); + } + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing PNG end info"); + + png_write_end(ping,ping_info); + + if (mng_info->need_fram && (int) image->dispose == BackgroundDispose) + { + if (mng_info->page.x || mng_info->page.y || + (ping_width != mng_info->page.width) || + (ping_height != mng_info->page.height)) + { + unsigned char + chunk[32]; + + /* + Write FRAM 4 with clipping boundaries followed by FRAM 1. + */ + (void) WriteBlobMSBULong(image,27L); /* data length=27 */ + PNGType(chunk,mng_FRAM); + LogPNGChunk(logging,mng_FRAM,27L); + chunk[4]=4; + chunk[5]=0; /* frame name separator (no name) */ + chunk[6]=1; /* flag for changing delay, for next frame only */ + chunk[7]=0; /* flag for changing frame timeout */ + chunk[8]=1; /* flag for changing frame clipping for next frame */ + chunk[9]=0; /* flag for changing frame sync_id */ + PNGLong(chunk+10,(png_uint_32) (0L)); /* temporary 0 delay */ + chunk[14]=0; /* clipping boundaries delta type */ + PNGLong(chunk+15,(png_uint_32) (mng_info->page.x)); /* left cb */ + PNGLong(chunk+19, + (png_uint_32) (mng_info->page.x + ping_width)); + PNGLong(chunk+23,(png_uint_32) (mng_info->page.y)); /* top cb */ + PNGLong(chunk+27, + (png_uint_32) (mng_info->page.y + ping_height)); + (void) WriteBlob(image,31,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,31)); + mng_info->old_framing_mode=4; + mng_info->framing_mode=1; + } + + else + mng_info->framing_mode=3; + } + if (mng_info->write_mng && !mng_info->need_fram && + ((int) image->dispose == 3)) + png_error(ping, "Cannot convert GIF with disposal method 3 to MNG-LC"); + + /* + Free PNG resources. + */ + + png_destroy_write_struct(&ping,&ping_info); + + pixel_info=RelinquishVirtualMemory(pixel_info); + + /* Store bit depth actually written */ + s[0]=(char) ping_bit_depth; + s[1]='\0'; + + (void) SetImageProperty(image,"png:bit-depth-written",s); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " exit WriteOnePNGImage()"); + +#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE + UnlockSemaphoreInfo(ping_semaphore); +#endif + + /* } for navigation to beginning of SETJMP-protected block. Revert to + * Throwing an Exception when an error occurs. + */ + + return(MagickTrue); +/* End write one PNG image */ + +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePNGImage() writes a Portable Network Graphics (PNG) or +% Multiple-image Network Graphics (MNG) image file. +% +% MNG support written by Glenn Randers-Pehrson, glennrp@image... +% +% The format of the WritePNGImage method is: +% +% MagickBooleanType WritePNGImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: The image. +% +% Returns MagickTrue on success, MagickFalse on failure. +% +% Communicating with the PNG encoder: +% +% While the datastream written is always in PNG format and normally would +% be given the "png" file extension, this method also writes the following +% pseudo-formats which are subsets of png: +% +% o PNG8: An 8-bit indexed PNG datastream is written. If the image has +% a depth greater than 8, the depth is reduced. If transparency +% is present, the tRNS chunk must only have values 0 and 255 +% (i.e., transparency is binary: fully opaque or fully +% transparent). If other values are present they will be +% 50%-thresholded to binary transparency. If more than 256 +% colors are present, they will be quantized to the 4-4-4-1, +% 3-3-3-1, or 3-3-2-1 palette. The underlying RGB color +% of any resulting fully-transparent pixels is changed to +% the image's background color. +% +% If you want better quantization or dithering of the colors +% or alpha than that, you need to do it before calling the +% PNG encoder. The pixels contain 8-bit indices even if +% they could be represented with 1, 2, or 4 bits. Grayscale +% images will be written as indexed PNG files even though the +% PNG grayscale type might be slightly more efficient. Please +% note that writing to the PNG8 format may result in loss +% of color and alpha data. +% +% o PNG24: An 8-bit per sample RGB PNG datastream is written. The tRNS +% chunk can be present to convey binary transparency by naming +% one of the colors as transparent. The only loss incurred +% is reduction of sample depth to 8. If the image has more +% than one transparent color, has semitransparent pixels, or +% has an opaque pixel with the same RGB components as the +% transparent color, an image is not written. +% +% o PNG32: An 8-bit per sample RGBA PNG is written. Partial +% transparency is permitted, i.e., the alpha sample for +% each pixel can have any value from 0 to 255. The alpha +% channel is present even if the image is fully opaque. +% The only loss in data is the reduction of the sample depth +% to 8. +% +% o PNG48: A 16-bit per sample RGB PNG datastream is written. The tRNS +% chunk can be present to convey binary transparency by naming +% one of the colors as transparent. If the image has more +% than one transparent color, has semitransparent pixels, or +% has an opaque pixel with the same RGB components as the +% transparent color, an image is not written. +% +% o PNG64: A 16-bit per sample RGBA PNG is written. Partial +% transparency is permitted, i.e., the alpha sample for +% each pixel can have any value from 0 to 65535. The alpha +% channel is present even if the image is fully opaque. +% +% o PNG00: A PNG that inherits its colortype and bit-depth from the input +% image, if the input was a PNG, is written. If these values +% cannot be found, or if the pixels have been changed in a way +% that makes this impossible, then "PNG00" falls back to the +% regular "PNG" format. +% +% o -define: For more precise control of the PNG output, you can use the +% Image options "png:bit-depth" and "png:color-type". These +% can be set from the commandline with "-define" and also +% from the application programming interfaces. The options +% are case-independent and are converted to lowercase before +% being passed to this encoder. +% +% png:color-type can be 0, 2, 3, 4, or 6. +% +% When png:color-type is 0 (Grayscale), png:bit-depth can +% be 1, 2, 4, 8, or 16. +% +% When png:color-type is 2 (RGB), png:bit-depth can +% be 8 or 16. +% +% When png:color-type is 3 (Indexed), png:bit-depth can +% be 1, 2, 4, or 8. This refers to the number of bits +% used to store the index. The color samples always have +% bit-depth 8 in indexed PNG files. +% +% When png:color-type is 4 (Gray-Matte) or 6 (RGB-Matte), +% png:bit-depth can be 8 or 16. +% +% If the image cannot be written without loss with the +% requested bit-depth and color-type, a PNG file will not +% be written, a warning will be issued, and the encoder will +% return MagickFalse. +% +% Since image encoders should not be responsible for the "heavy lifting", +% the user should make sure that ImageMagick has already reduced the +% image depth and number of colors and limit transparency to binary +% transparency prior to attempting to write the image with depth, color, +% or transparency limitations. +% +% To do: Enforce the previous paragraph. +% +% Note that another definition, "png:bit-depth-written" exists, but it +% is not intended for external use. It is only used internally by the +% PNG encoder to inform the JNG encoder of the depth of the alpha channel. +% +% As of version 6.6.6 the following optimizations are always done: +% +% o 32-bit depth is reduced to 16. +% o 16-bit depth is reduced to 8 if all pixels contain samples whose +% high byte and low byte are identical. +% o Palette is sorted to remove unused entries and to put a +% transparent color first, if BUILD_PNG_PALETTE is defined. +% o Opaque matte channel is removed when writing an indexed PNG. +% o Grayscale images are reduced to 1, 2, or 4 bit depth if +% this can be done without loss and a larger bit depth N was not +% requested via the "-define png:bit-depth=N" option. +% o If matte channel is present but only one transparent color is +% present, RGB+tRNS is written instead of RGBA +% o Opaque matte channel is removed (or added, if color-type 4 or 6 +% was requested when converting an opaque image). +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ +static MagickBooleanType WritePNGImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + excluding, + logging, + status; + + MngInfo + *mng_info; + + const char + *value; + + int + source; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WritePNGImage()"); + /* + Allocate a MngInfo structure. + */ + mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); + + if (mng_info == (MngInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + + /* + Initialize members of the MngInfo structure. + */ + (void) memset(mng_info,0,sizeof(MngInfo)); + mng_info->image=image; + mng_info->equal_backgrounds=MagickTrue; + + /* See if user has requested a specific PNG subformat */ + + mng_info->write_png8=LocaleCompare(image_info->magick,"PNG8") == 0; + mng_info->write_png24=LocaleCompare(image_info->magick,"PNG24") == 0; + mng_info->write_png32=LocaleCompare(image_info->magick,"PNG32") == 0; + mng_info->write_png48=LocaleCompare(image_info->magick,"PNG48") == 0; + mng_info->write_png64=LocaleCompare(image_info->magick,"PNG64") == 0; + + value=GetImageOption(image_info,"png:format"); + + if (value != (char *) NULL || LocaleCompare(image_info->magick,"PNG00") == 0) + { + mng_info->write_png8 = MagickFalse; + mng_info->write_png24 = MagickFalse; + mng_info->write_png32 = MagickFalse; + mng_info->write_png48 = MagickFalse; + mng_info->write_png64 = MagickFalse; + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Format=%s",value); + + if (LocaleCompare(value,"png8") == 0) + mng_info->write_png8 = MagickTrue; + + else if (LocaleCompare(value,"png24") == 0) + mng_info->write_png24 = MagickTrue; + + else if (LocaleCompare(value,"png32") == 0) + mng_info->write_png32 = MagickTrue; + + else if (LocaleCompare(value,"png48") == 0) + mng_info->write_png48 = MagickTrue; + + else if (LocaleCompare(value,"png64") == 0) + mng_info->write_png64 = MagickTrue; + + else if ((LocaleCompare(value,"png00") == 0) || + LocaleCompare(image_info->magick,"PNG00") == 0) + { + /* Retrieve png:IHDR.bit-depth-orig and png:IHDR.color-type-orig */ + value=GetImageProperty(image,"png:IHDR.bit-depth-orig"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " png00 inherited bit depth=%s",value); + + if (value != (char *) NULL) + { + + if (LocaleCompare(value,"1") == 0) + mng_info->write_png_depth = 1; + + else if (LocaleCompare(value,"2") == 0) + mng_info->write_png_depth = 2; + + else if (LocaleCompare(value,"4") == 0) + mng_info->write_png_depth = 4; + + else if (LocaleCompare(value,"8") == 0) + mng_info->write_png_depth = 8; + + else if (LocaleCompare(value,"16") == 0) + mng_info->write_png_depth = 16; + } + + value=GetImageProperty(image,"png:IHDR.color-type-orig"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " png00 inherited color type=%s",value); + + if (value != (char *) NULL) + { + if (LocaleCompare(value,"0") == 0) + mng_info->write_png_colortype = 1; + + else if (LocaleCompare(value,"2") == 0) + mng_info->write_png_colortype = 3; + + else if (LocaleCompare(value,"3") == 0) + mng_info->write_png_colortype = 4; + + else if (LocaleCompare(value,"4") == 0) + mng_info->write_png_colortype = 5; + + else if (LocaleCompare(value,"6") == 0) + mng_info->write_png_colortype = 7; + } + } + } + + if (mng_info->write_png8) + { + mng_info->write_png_colortype = /* 3 */ 4; + mng_info->write_png_depth = 8; + image->depth = 8; + } + + if (mng_info->write_png24) + { + mng_info->write_png_colortype = /* 2 */ 3; + mng_info->write_png_depth = 8; + image->depth = 8; + + if (image->matte != MagickFalse) + (void) SetImageType(image,TrueColorMatteType); + + else + (void) SetImageType(image,TrueColorType); + + (void) SyncImage(image); + } + + if (mng_info->write_png32) + { + mng_info->write_png_colortype = /* 6 */ 7; + mng_info->write_png_depth = 8; + image->depth = 8; + image->matte = MagickTrue; + (void) SetImageType(image,TrueColorMatteType); + (void) SyncImage(image); + } + + if (mng_info->write_png48) + { + mng_info->write_png_colortype = /* 2 */ 3; + mng_info->write_png_depth = 16; + image->depth = 16; + + if (image->matte != MagickFalse) + (void) SetImageType(image,TrueColorMatteType); + + else + (void) SetImageType(image,TrueColorType); + + (void) SyncImage(image); + } + + if (mng_info->write_png64) + { + mng_info->write_png_colortype = /* 6 */ 7; + mng_info->write_png_depth = 16; + image->depth = 16; + image->matte = MagickTrue; + (void) SetImageType(image,TrueColorMatteType); + (void) SyncImage(image); + } + + value=GetImageOption(image_info,"png:bit-depth"); + + if (value != (char *) NULL) + { + if (LocaleCompare(value,"1") == 0) + mng_info->write_png_depth = 1; + + else if (LocaleCompare(value,"2") == 0) + mng_info->write_png_depth = 2; + + else if (LocaleCompare(value,"4") == 0) + mng_info->write_png_depth = 4; + + else if (LocaleCompare(value,"8") == 0) + mng_info->write_png_depth = 8; + + else if (LocaleCompare(value,"16") == 0) + mng_info->write_png_depth = 16; + + else + (void) ThrowMagickException(&image->exception, + GetMagickModule(),CoderWarning, + "ignoring invalid defined png:bit-depth", + "=%s",value); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " png:bit-depth=%d was defined.\n",mng_info->write_png_depth); + } + + value=GetImageOption(image_info,"png:color-type"); + + if (value != (char *) NULL) + { + /* We must store colortype+1 because 0 is a valid colortype */ + if (LocaleCompare(value,"0") == 0) + mng_info->write_png_colortype = 1; + + else if (LocaleCompare(value,"2") == 0) + mng_info->write_png_colortype = 3; + + else if (LocaleCompare(value,"3") == 0) + mng_info->write_png_colortype = 4; + + else if (LocaleCompare(value,"4") == 0) + mng_info->write_png_colortype = 5; + + else if (LocaleCompare(value,"6") == 0) + mng_info->write_png_colortype = 7; + + else + (void) ThrowMagickException(&image->exception, + GetMagickModule(),CoderWarning, + "ignoring invalid defined png:color-type", + "=%s",value); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " png:color-type=%d was defined.\n",mng_info->write_png_colortype-1); + } + + /* Check for chunks to be excluded: + * + * The default is to not exclude any known chunks except for any + * listed in the "unused_chunks" array, above. + * + * Chunks can be listed for exclusion via a "png:exclude-chunk" + * define (in the image properties or in the image artifacts) + * or via a mng_info member. For convenience, in addition + * to or instead of a comma-separated list of chunks, the + * "exclude-chunk" string can be simply "all" or "none". + * + * The exclude-chunk define takes priority over the mng_info. + * + * A "png:include-chunk" define takes priority over both the + * mng_info and the "png:exclude-chunk" define. Like the + * "exclude-chunk" string, it can define "all" or "none" as + * well as a comma-separated list. Chunks that are unknown to + * ImageMagick are always excluded, regardless of their "copy-safe" + * status according to the PNG specification, and even if they + * appear in the "include-chunk" list. Such defines appearing among + * the image options take priority over those found among the image + * artifacts. + * + * Finally, all chunks listed in the "unused_chunks" array are + * automatically excluded, regardless of the other instructions + * or lack thereof. + * + * if you exclude sRGB but not gAMA (recommended), then sRGB chunk + * will not be written and the gAMA chunk will only be written if it + * is not between .45 and .46, or approximately (1.0/2.2). + * + * If you exclude tRNS and the image has transparency, the colortype + * is forced to be 4 or 6 (GRAY_ALPHA or RGB_ALPHA). + * + * The -strip option causes StripImage() to set the png:include-chunk + * artifact to "none,trns,gama". + */ + + mng_info->ping_exclude_bKGD=MagickFalse; + mng_info->ping_exclude_caNv=MagickFalse; + mng_info->ping_exclude_cHRM=MagickFalse; + mng_info->ping_exclude_date=MagickFalse; + mng_info->ping_exclude_eXIf=MagickFalse; + mng_info->ping_exclude_EXIF=MagickFalse; /* hex-encoded EXIF in zTXt */ + mng_info->ping_exclude_gAMA=MagickFalse; + mng_info->ping_exclude_iCCP=MagickFalse; + /* mng_info->ping_exclude_iTXt=MagickFalse; */ + mng_info->ping_exclude_oFFs=MagickFalse; + mng_info->ping_exclude_pHYs=MagickFalse; + mng_info->ping_exclude_sRGB=MagickFalse; + mng_info->ping_exclude_tEXt=MagickFalse; + mng_info->ping_exclude_tIME=MagickFalse; + mng_info->ping_exclude_tRNS=MagickFalse; + mng_info->ping_exclude_zCCP=MagickFalse; /* hex-encoded iCCP in zTXt */ + mng_info->ping_exclude_zTXt=MagickFalse; + + mng_info->ping_preserve_colormap=MagickFalse; + + value=GetImageOption(image_info,"png:preserve-colormap"); + if (value == NULL) + value=GetImageArtifact(image,"png:preserve-colormap"); + if (value != NULL) + mng_info->ping_preserve_colormap=MagickTrue; + + + mng_info->ping_preserve_iCCP=MagickFalse; + + value=GetImageOption(image_info,"png:preserve-iCCP"); + if (value == NULL) + value=GetImageArtifact(image,"png:preserve-iCCP"); + if (value != NULL) + mng_info->ping_preserve_iCCP=MagickTrue; + + /* These compression-level, compression-strategy, and compression-filter + * defines take precedence over values from the -quality option. + */ + value=GetImageOption(image_info,"png:compression-level"); + if (value == NULL) + value=GetImageArtifact(image,"png:compression-level"); + if (value != NULL) + { + /* To do: use a "LocaleInteger:()" function here. */ + + /* We have to add 1 to everything because 0 is a valid input, + * and we want to use 0 (the default) to mean undefined. + */ + if (LocaleCompare(value,"0") == 0) + mng_info->write_png_compression_level = 1; + + else if (LocaleCompare(value,"1") == 0) + mng_info->write_png_compression_level = 2; + + else if (LocaleCompare(value,"2") == 0) + mng_info->write_png_compression_level = 3; + + else if (LocaleCompare(value,"3") == 0) + mng_info->write_png_compression_level = 4; + + else if (LocaleCompare(value,"4") == 0) + mng_info->write_png_compression_level = 5; + + else if (LocaleCompare(value,"5") == 0) + mng_info->write_png_compression_level = 6; + + else if (LocaleCompare(value,"6") == 0) + mng_info->write_png_compression_level = 7; + + else if (LocaleCompare(value,"7") == 0) + mng_info->write_png_compression_level = 8; + + else if (LocaleCompare(value,"8") == 0) + mng_info->write_png_compression_level = 9; + + else if (LocaleCompare(value,"9") == 0) + mng_info->write_png_compression_level = 10; + + else + (void) ThrowMagickException(&image->exception, + GetMagickModule(),CoderWarning, + "ignoring invalid defined png:compression-level", + "=%s",value); + } + + value=GetImageOption(image_info,"png:compression-strategy"); + if (value == NULL) + value=GetImageArtifact(image,"png:compression-strategy"); + if (value != NULL) + { + if (LocaleCompare(value,"0") == 0) + mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; + + else if (LocaleCompare(value,"1") == 0) + mng_info->write_png_compression_strategy = Z_FILTERED+1; + + else if (LocaleCompare(value,"2") == 0) + mng_info->write_png_compression_strategy = Z_HUFFMAN_ONLY+1; + + else if (LocaleCompare(value,"3") == 0) +#ifdef Z_RLE /* Z_RLE was added to zlib-1.2.0 */ + mng_info->write_png_compression_strategy = Z_RLE+1; +#else + mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; +#endif + + else if (LocaleCompare(value,"4") == 0) +#ifdef Z_FIXED /* Z_FIXED was added to zlib-1.2.2.2 */ + mng_info->write_png_compression_strategy = Z_FIXED+1; +#else + mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; +#endif + + else + (void) ThrowMagickException(&image->exception, + GetMagickModule(),CoderWarning, + "ignoring invalid defined png:compression-strategy", + "=%s",value); + } + + value=GetImageOption(image_info,"png:compression-filter"); + if (value == NULL) + value=GetImageArtifact(image,"png:compression-filter"); + if (value != NULL) + { + /* To do: combinations of filters allowed by libpng + * masks 0x08 through 0xf8 + * + * Implement this as a comma-separated list of 0,1,2,3,4,5 + * where 5 is a special case meaning PNG_ALL_FILTERS. + */ + + if (LocaleCompare(value,"0") == 0) + mng_info->write_png_compression_filter = 1; + + else if (LocaleCompare(value,"1") == 0) + mng_info->write_png_compression_filter = 2; + + else if (LocaleCompare(value,"2") == 0) + mng_info->write_png_compression_filter = 3; + + else if (LocaleCompare(value,"3") == 0) + mng_info->write_png_compression_filter = 4; + + else if (LocaleCompare(value,"4") == 0) + mng_info->write_png_compression_filter = 5; + + else if (LocaleCompare(value,"5") == 0) + mng_info->write_png_compression_filter = 6; + + else + (void) ThrowMagickException(&image->exception, + GetMagickModule(),CoderWarning, + "ignoring invalid defined png:compression-filter", + "=%s",value); + } + + for (source=0; source<8; source++) + { + value = (const char *) NULL; + + switch(source) + { + case 0: + value=GetImageOption(image_info,"png:exclude-chunks"); + break; + case 1: + value=GetImageArtifact(image,"png:exclude-chunks"); + break; + case 2: + value=GetImageOption(image_info,"png:exclude-chunk"); + break; + case 3: + value=GetImageArtifact(image,"png:exclude-chunk"); + break; + case 4: + value=GetImageOption(image_info,"png:include-chunks"); + break; + case 5: + value=GetImageArtifact(image,"png:include-chunks"); + break; + case 6: + value=GetImageOption(image_info,"png:include-chunk"); + break; + case 7: + value=GetImageArtifact(image,"png:include-chunk"); + break; + } + + if (value == (const char *) NULL) + continue; + + if (source < 4) + excluding = MagickTrue; + else + excluding = MagickFalse; + + if (logging != MagickFalse) + { + if (source == 0 || source == 2) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " png:exclude-chunk=%s found in image options.\n", value); + else if (source == 1 || source == 3) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " png:exclude-chunk=%s found in image artifacts.\n", value); + else if (source == 4 || source == 6) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " png:include-chunk=%s found in image options.\n", value); + else /* if (source == 5 || source == 7) */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " png:include-chunk=%s found in image artifacts.\n", value); + } + + if (IsOptionMember("all",value) != MagickFalse) + { + mng_info->ping_exclude_bKGD=excluding; + mng_info->ping_exclude_caNv=excluding; + mng_info->ping_exclude_cHRM=excluding; + mng_info->ping_exclude_date=excluding; + mng_info->ping_exclude_EXIF=excluding; + mng_info->ping_exclude_eXIf=excluding; + mng_info->ping_exclude_gAMA=excluding; + mng_info->ping_exclude_iCCP=excluding; + /* mng_info->ping_exclude_iTXt=excluding; */ + mng_info->ping_exclude_oFFs=excluding; + mng_info->ping_exclude_pHYs=excluding; + mng_info->ping_exclude_sRGB=excluding; + mng_info->ping_exclude_tIME=excluding; + mng_info->ping_exclude_tEXt=excluding; + mng_info->ping_exclude_tRNS=excluding; + mng_info->ping_exclude_zCCP=excluding; + mng_info->ping_exclude_zTXt=excluding; + } + + if (IsOptionMember("none",value) != MagickFalse) + { + mng_info->ping_exclude_bKGD=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_caNv=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_cHRM=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_date=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_eXIf=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_EXIF=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_gAMA=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_iCCP=excluding != MagickFalse ? MagickFalse : + MagickTrue; + /* mng_info->ping_exclude_iTXt=!excluding; */ + mng_info->ping_exclude_oFFs=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_pHYs=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_sRGB=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_tEXt=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_tIME=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_tRNS=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_zCCP=excluding != MagickFalse ? MagickFalse : + MagickTrue; + mng_info->ping_exclude_zTXt=excluding != MagickFalse ? MagickFalse : + MagickTrue; + } + + if (IsOptionMember("bkgd",value) != MagickFalse) + mng_info->ping_exclude_bKGD=excluding; + + if (IsOptionMember("caNv",value) != MagickFalse) + mng_info->ping_exclude_caNv=excluding; + + if (IsOptionMember("chrm",value) != MagickFalse) + mng_info->ping_exclude_cHRM=excluding; + + if (IsOptionMember("date",value) != MagickFalse) + mng_info->ping_exclude_date=excluding; + + if (IsOptionMember("exif",value) != MagickFalse) + { + mng_info->ping_exclude_EXIF=excluding; + mng_info->ping_exclude_eXIf=excluding; + } + + if (IsOptionMember("gama",value) != MagickFalse) + mng_info->ping_exclude_gAMA=excluding; + + if (IsOptionMember("iccp",value) != MagickFalse) + mng_info->ping_exclude_iCCP=excluding; + +#if 0 + if (IsOptionMember("itxt",value) != MagickFalse) + mng_info->ping_exclude_iTXt=excluding; +#endif + + if (IsOptionMember("offs",value) != MagickFalse) + mng_info->ping_exclude_oFFs=excluding; + + if (IsOptionMember("phys",value) != MagickFalse) + mng_info->ping_exclude_pHYs=excluding; + + if (IsOptionMember("srgb",value) != MagickFalse) + mng_info->ping_exclude_sRGB=excluding; + + if (IsOptionMember("text",value) != MagickFalse) + mng_info->ping_exclude_tEXt=excluding; + + if (IsOptionMember("time",value) != MagickFalse) + mng_info->ping_exclude_tIME=excluding; + + if (IsOptionMember("trns",value) != MagickFalse) + mng_info->ping_exclude_tRNS=excluding; + + if (IsOptionMember("zccp",value) != MagickFalse) + mng_info->ping_exclude_zCCP=excluding; + + if (IsOptionMember("ztxt",value) != MagickFalse) + mng_info->ping_exclude_zTXt=excluding; + } + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Chunks to be excluded from the output png:"); + if (mng_info->ping_exclude_bKGD != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " bKGD"); + if (mng_info->ping_exclude_caNv != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " caNv"); + if (mng_info->ping_exclude_cHRM != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " cHRM"); + if (mng_info->ping_exclude_date != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " date"); + if (mng_info->ping_exclude_EXIF != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " EXIF"); + if (mng_info->ping_exclude_eXIf != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " eXIf"); + if (mng_info->ping_exclude_gAMA != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " gAMA"); + if (mng_info->ping_exclude_iCCP != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " iCCP"); +#if 0 + if (mng_info->ping_exclude_iTXt != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " iTXt"); +#endif + + if (mng_info->ping_exclude_oFFs != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " oFFs"); + if (mng_info->ping_exclude_pHYs != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " pHYs"); + if (mng_info->ping_exclude_sRGB != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " sRGB"); + if (mng_info->ping_exclude_tEXt != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " tEXt"); + if (mng_info->ping_exclude_tIME != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " tIME"); + if (mng_info->ping_exclude_tRNS != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " tRNS"); + if (mng_info->ping_exclude_zCCP != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " zCCP"); + if (mng_info->ping_exclude_zTXt != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " zTXt"); + } + + mng_info->need_blob = MagickTrue; + + status=WriteOnePNGImage(mng_info,image_info,image); + + (void) CloseBlob(image); + + mng_info=MngInfoFreeStruct(mng_info); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WritePNGImage()"); + + return(status); +} + +#if defined(JNG_SUPPORTED) + +/* Write one JNG image */ +static MagickBooleanType WriteOneJNGImage(MngInfo *mng_info, + const ImageInfo *image_info,Image *image) +{ + Image + *jpeg_image; + + ImageInfo + *jpeg_image_info; + + int + unique_filenames; + + MagickBooleanType + logging, + status; + + size_t + length; + + unsigned char + *blob, + chunk[80], + *p; + + unsigned int + jng_alpha_compression_method, + jng_alpha_sample_depth, + jng_color_type, + transparent; + + size_t + jng_alpha_quality, + jng_quality; + + logging=LogMagickEvent(CoderEvent,GetMagickModule(), + " Enter WriteOneJNGImage()"); + + if ((image->columns > 65500U) || (image->rows > 65500U)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + + blob=(unsigned char *) NULL; + jpeg_image=(Image *) NULL; + jpeg_image_info=(ImageInfo *) NULL; + length=0; + + unique_filenames=0; + + status=MagickTrue; + transparent=image_info->type==GrayscaleMatteType || + image_info->type==TrueColorMatteType || image->matte != MagickFalse; + + jng_alpha_sample_depth = 0; + + jng_quality=image_info->quality == 0UL ? 75UL : image_info->quality%1000; + + jng_alpha_compression_method=image->compression==JPEGCompression? 8 : 0; + + jng_alpha_quality=image_info->quality == 0UL ? 75UL : + image_info->quality; + + if (jng_alpha_quality >= 1000) + jng_alpha_quality /= 1000; + + if (transparent != 0) + { + jng_color_type=14; + + /* Create JPEG blob, image, and image_info */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Creating jpeg_image_info for opacity."); + + jpeg_image_info=(ImageInfo *) CloneImageInfo(image_info); + + if (jpeg_image_info == (ImageInfo *) NULL) + { + jpeg_image_info=DestroyImageInfo(jpeg_image_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Creating jpeg_image."); + + jpeg_image=CloneImage(image,0,0,MagickTrue,&image->exception); + + if (jpeg_image == (Image *) NULL) + { + jpeg_image_info=DestroyImageInfo(jpeg_image_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + + (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); + + status=SeparateImageChannel(jpeg_image,OpacityChannel); + if (status == MagickFalse) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + + status=NegateImage(jpeg_image,MagickFalse); + if (status == MagickFalse) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + + jpeg_image->matte=MagickFalse; + + jpeg_image_info->type=GrayscaleType; + jpeg_image->quality=jng_alpha_quality; + jpeg_image_info->type=GrayscaleType; + (void) SetImageType(jpeg_image,GrayscaleType); + (void) AcquireUniqueFilename(jpeg_image->filename); + unique_filenames++; + (void) FormatLocaleString(jpeg_image_info->filename,MaxTextExtent, + "%s",jpeg_image->filename); + } + else + { + jng_alpha_compression_method=0; + jng_color_type=10; + jng_alpha_sample_depth=0; + } + + /* To do: check bit depth of PNG alpha channel */ + + /* Check if image is grayscale. */ + if ((image_info->type != TrueColorMatteType) && + (image_info->type != TrueColorType)) + { + ImageType type = IdentifyImageType(image,&image->exception); + if ((type == GrayscaleType) || (type == BilevelType)) + jng_color_type-=2; + } + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG Quality = %d",(int) jng_quality); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG Color Type = %d",jng_color_type); + if (transparent != 0) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG Alpha Compression = %d",jng_alpha_compression_method); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG Alpha Depth = %d",jng_alpha_sample_depth); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG Alpha Quality = %d",(int) jng_alpha_quality); + } + } + + if (transparent != 0) + { + if (jng_alpha_compression_method==0) + { + const char + *value; + + /* Encode opacity as a grayscale PNG blob */ + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Creating PNG blob for alpha."); + + status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, + &image->exception); + if (status == MagickFalse) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + + length=0; + + (void) CopyMagickString(jpeg_image_info->magick,"PNG",MaxTextExtent); + (void) CopyMagickString(jpeg_image->magick,"PNG",MaxTextExtent); + jpeg_image_info->interlace=NoInterlace; + + /* Exclude all ancillary chunks */ + (void) SetImageArtifact(jpeg_image,"png:exclude-chunks","all"); + + blob=ImageToBlob(jpeg_image_info,jpeg_image,&length, + &image->exception); + + /* Retrieve sample depth used */ + value=GetImageProperty(jpeg_image,"png:bit-depth-written"); + if (value != (char *) NULL) + jng_alpha_sample_depth= (unsigned int) value[0]; + } + else + { + /* Encode opacity as a grayscale JPEG blob */ + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Creating JPEG blob for alpha."); + + status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, + &image->exception); + + if (status == MagickFalse) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + + (void) CopyMagickString(jpeg_image_info->magick,"JPEG",MaxTextExtent); + (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); + jpeg_image_info->interlace=NoInterlace; + blob=ImageToBlob(jpeg_image_info,jpeg_image,&length, + &image->exception); + if (blob == (unsigned char *) NULL) + { + if (jpeg_image != (Image *)NULL) + jpeg_image=DestroyImage(jpeg_image); + if (jpeg_image_info != (ImageInfo *)NULL) + jpeg_image_info=DestroyImageInfo(jpeg_image_info); + return(MagickFalse); + } + jng_alpha_sample_depth=8; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Successfully read jpeg_image into a blob, length=%.20g.", + (double) length); + + } + /* Destroy JPEG image and image_info */ + jpeg_image=DestroyImage(jpeg_image); + (void) RelinquishUniqueFileResource(jpeg_image_info->filename); + unique_filenames--; + jpeg_image_info=DestroyImageInfo(jpeg_image_info); + } + + /* Write JHDR chunk */ + (void) WriteBlobMSBULong(image,16L); /* chunk data length=16 */ + PNGType(chunk,mng_JHDR); + LogPNGChunk(logging,mng_JHDR,16L); + PNGLong(chunk+4,(png_uint_32) image->columns); + PNGLong(chunk+8,(png_uint_32) image->rows); + chunk[12]=jng_color_type; + chunk[13]=8; /* sample depth */ + chunk[14]=8; /*jng_image_compression_method */ + chunk[15]=(unsigned char) (image_info->interlace == NoInterlace ? 0 : 8); + chunk[16]=jng_alpha_sample_depth; + chunk[17]=jng_alpha_compression_method; + chunk[18]=0; /*jng_alpha_filter_method */ + chunk[19]=0; /*jng_alpha_interlace_method */ + (void) WriteBlob(image,20,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,20)); + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG width:%15lu",(unsigned long) image->columns); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG height:%14lu",(unsigned long) image->rows); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG color type:%10d",jng_color_type); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG sample depth:%8d",8); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG compression:%9d",8); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG interlace:%11d",0); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG alpha depth:%9d",jng_alpha_sample_depth); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG alpha compression:%3d",jng_alpha_compression_method); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG alpha filter:%8d",0); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " JNG alpha interlace:%5d",0); + } + + /* + Write leading ancillary chunks + */ + + if (transparent != 0) + { + /* + Write JNG bKGD chunk + */ + + unsigned char + blue, + green, + red; + + ssize_t + num_bytes; + + if (jng_color_type == 8 || jng_color_type == 12) + num_bytes=6L; + else + num_bytes=10L; + (void) WriteBlobMSBULong(image,(size_t) (num_bytes-4L)); + PNGType(chunk,mng_bKGD); + LogPNGChunk(logging,mng_bKGD,(size_t) (num_bytes-4L)); + red=ScaleQuantumToChar(image->background_color.red); + green=ScaleQuantumToChar(image->background_color.green); + blue=ScaleQuantumToChar(image->background_color.blue); + *(chunk+4)=0; + *(chunk+5)=red; + *(chunk+6)=0; + *(chunk+7)=green; + *(chunk+8)=0; + *(chunk+9)=blue; + (void) WriteBlob(image,(size_t) num_bytes,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) num_bytes)); + } + + if ((image->colorspace == sRGBColorspace || image->rendering_intent)) + { + /* + Write JNG sRGB chunk + */ + (void) WriteBlobMSBULong(image,1L); + PNGType(chunk,mng_sRGB); + LogPNGChunk(logging,mng_sRGB,1L); + + if (image->rendering_intent != UndefinedIntent) + chunk[4]=(unsigned char) + Magick_RenderingIntent_to_PNG_RenderingIntent( + (image->rendering_intent)); + + else + chunk[4]=(unsigned char) + Magick_RenderingIntent_to_PNG_RenderingIntent( + (PerceptualIntent)); + + (void) WriteBlob(image,5,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); + } + else + { + if (image->gamma != 0.0) + { + /* + Write JNG gAMA chunk + */ + (void) WriteBlobMSBULong(image,4L); + PNGType(chunk,mng_gAMA); + LogPNGChunk(logging,mng_gAMA,4L); + PNGLong(chunk+4,(png_uint_32) (100000*image->gamma+0.5)); + (void) WriteBlob(image,8,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,8)); + } + + if ((mng_info->equal_chrms == MagickFalse) && + (image->chromaticity.red_primary.x != 0.0)) + { + PrimaryInfo + primary; + + /* + Write JNG cHRM chunk + */ + (void) WriteBlobMSBULong(image,32L); + PNGType(chunk,mng_cHRM); + LogPNGChunk(logging,mng_cHRM,32L); + primary=image->chromaticity.white_point; + PNGLong(chunk+4,(png_uint_32) (100000*primary.x+0.5)); + PNGLong(chunk+8,(png_uint_32) (100000*primary.y+0.5)); + primary=image->chromaticity.red_primary; + PNGLong(chunk+12,(png_uint_32) (100000*primary.x+0.5)); + PNGLong(chunk+16,(png_uint_32) (100000*primary.y+0.5)); + primary=image->chromaticity.green_primary; + PNGLong(chunk+20,(png_uint_32) (100000*primary.x+0.5)); + PNGLong(chunk+24,(png_uint_32) (100000*primary.y+0.5)); + primary=image->chromaticity.blue_primary; + PNGLong(chunk+28,(png_uint_32) (100000*primary.x+0.5)); + PNGLong(chunk+32,(png_uint_32) (100000*primary.y+0.5)); + (void) WriteBlob(image,36,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,36)); + } + } + + if (image->x_resolution && image->y_resolution && !mng_info->equal_physs) + { + /* + Write JNG pHYs chunk + */ + (void) WriteBlobMSBULong(image,9L); + PNGType(chunk,mng_pHYs); + LogPNGChunk(logging,mng_pHYs,9L); + if (image->units == PixelsPerInchResolution) + { + PNGLong(chunk+4,(png_uint_32) + (image->x_resolution*100.0/2.54+0.5)); + + PNGLong(chunk+8,(png_uint_32) + (image->y_resolution*100.0/2.54+0.5)); + + chunk[12]=1; + } + + else + { + if (image->units == PixelsPerCentimeterResolution) + { + PNGLong(chunk+4,(png_uint_32) + (image->x_resolution*100.0+0.5)); + + PNGLong(chunk+8,(png_uint_32) + (image->y_resolution*100.0+0.5)); + + chunk[12]=1; + } + + else + { + PNGLong(chunk+4,(png_uint_32) (image->x_resolution+0.5)); + PNGLong(chunk+8,(png_uint_32) (image->y_resolution+0.5)); + chunk[12]=0; + } + } + (void) WriteBlob(image,13,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); + } + + if (mng_info->write_mng == 0 && (image->page.x || image->page.y)) + { + /* + Write JNG oFFs chunk + */ + (void) WriteBlobMSBULong(image,9L); + PNGType(chunk,mng_oFFs); + LogPNGChunk(logging,mng_oFFs,9L); + PNGsLong(chunk+4,(ssize_t) (image->page.x)); + PNGsLong(chunk+8,(ssize_t) (image->page.y)); + chunk[12]=0; + (void) WriteBlob(image,13,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); + } + + if (transparent != 0) + { + if (jng_alpha_compression_method==0) + { + ssize_t + i; + + size_t + len; + + /* Write IDAT chunk header */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Write IDAT chunks from blob, length=%.20g.",(double) + length); + + /* Copy IDAT chunks */ + len=0; + p=blob+8; + for (i=8; i<(ssize_t) length; i+=len+12) + { + len=(((unsigned int) *(p ) & 0xff) << 24) + + (((unsigned int) *(p + 1) & 0xff) << 16) + + (((unsigned int) *(p + 2) & 0xff) << 8) + + (((unsigned int) *(p + 3) & 0xff) ) ; + p+=4; + + if (*(p)==73 && *(p+1)==68 && *(p+2)==65 && *(p+3)==84) /* IDAT */ + { + /* Found an IDAT chunk. */ + (void) WriteBlobMSBULong(image,len); + LogPNGChunk(logging,mng_IDAT,len); + (void) WriteBlob(image,len+4,p); + (void) WriteBlobMSBULong(image,crc32(0,p,(uInt) len+4)); + } + + else + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Skipping %c%c%c%c chunk, length=%.20g.", + *(p),*(p+1),*(p+2),*(p+3),(double) len); + } + p+=(8+len); + } + } + else if (length != 0) + { + /* Write JDAA chunk header */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Write JDAA chunk, length=%.20g.",(double) length); + (void) WriteBlobMSBULong(image,(size_t) length); + PNGType(chunk,mng_JDAA); + LogPNGChunk(logging,mng_JDAA,length); + /* Write JDAT chunk(s) data */ + (void) WriteBlob(image,4,chunk); + (void) WriteBlob(image,length,blob); + (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4),blob, + (uInt) length)); + } + blob=(unsigned char *) RelinquishMagickMemory(blob); + } + + /* Encode image as a JPEG blob */ + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Creating jpeg_image_info."); + jpeg_image_info=(ImageInfo *) CloneImageInfo(image_info); + if (jpeg_image_info == (ImageInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Creating jpeg_image."); + + jpeg_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (jpeg_image == (Image *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); + + (void) AcquireUniqueFilename(jpeg_image->filename); + unique_filenames++; + (void) FormatLocaleString(jpeg_image_info->filename,MaxTextExtent,"%s", + jpeg_image->filename); + + status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, + &image->exception); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Created jpeg_image, %.20g x %.20g.",(double) jpeg_image->columns, + (double) jpeg_image->rows); + + if (status == MagickFalse) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + + if (jng_color_type == 8 || jng_color_type == 12) + jpeg_image_info->type=GrayscaleType; + + jpeg_image_info->quality=jng_quality; + jpeg_image->quality=jng_quality; + (void) CopyMagickString(jpeg_image_info->magick,"JPEG",MaxTextExtent); + (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Creating blob."); + + blob=ImageToBlob(jpeg_image_info,jpeg_image,&length,&image->exception); + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Successfully read jpeg_image into a blob, length=%.20g.", + (double) length); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Write JDAT chunk, length=%.20g.",(double) length); + } + + /* Write JDAT chunk(s) */ + (void) WriteBlobMSBULong(image,(size_t) length); + PNGType(chunk,mng_JDAT); + LogPNGChunk(logging,mng_JDAT,length); + (void) WriteBlob(image,4,chunk); + (void) WriteBlob(image,length,blob); + (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4),blob,(uInt) length)); + + jpeg_image=DestroyImage(jpeg_image); + (void) RelinquishUniqueFileResource(jpeg_image_info->filename); + unique_filenames--; + jpeg_image_info=DestroyImageInfo(jpeg_image_info); + blob=(unsigned char *) RelinquishMagickMemory(blob); + + /* Write IEND chunk */ + (void) WriteBlobMSBULong(image,0L); + PNGType(chunk,mng_IEND); + LogPNGChunk(logging,mng_IEND,0); + (void) WriteBlob(image,4,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,4)); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " exit WriteOneJNGImage(); unique_filenames=%d",unique_filenames); + + return(status); +} + + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e J N G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteJNGImage() writes a JPEG Network Graphics (JNG) image file. +% +% JNG support written by Glenn Randers-Pehrson, glennrp@image... +% +% The format of the WriteJNGImage method is: +% +% MagickBooleanType WriteJNGImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: The image. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ +static MagickBooleanType WriteJNGImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + logging, + status; + + MngInfo + *mng_info; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WriteJNGImage()"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if ((image->columns > 65535UL) || (image->rows > 65535UL)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + + /* + Allocate a MngInfo structure. + */ + mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); + if (mng_info == (MngInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Initialize members of the MngInfo structure. + */ + (void) memset(mng_info,0,sizeof(MngInfo)); + mng_info->image=image; + + (void) WriteBlob(image,8,(const unsigned char *) "\213JNG\r\n\032\n"); + + status=WriteOneJNGImage(mng_info,image_info,image); + mng_info=MngInfoFreeStruct(mng_info); + (void) CloseBlob(image); + + (void) CatchImageException(image); + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " exit WriteJNGImage()"); + return(status); +} +#endif + + + +static MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image) +{ + const char + *option; + + Image + *next_image; + + MagickBooleanType + status; + + volatile MagickBooleanType + logging; + + MngInfo + *mng_info; + + int + image_count, + need_iterations, + need_matte; + + volatile int +#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_MNG_FEATURES_SUPPORTED) + need_local_plte, +#endif + all_images_are_gray, + need_defi, + use_global_plte; + + ssize_t + i; + + unsigned char + chunk[800]; + + volatile unsigned int + write_jng, + write_mng; + + volatile size_t + scene; + + size_t + final_delay=0, + initial_delay, + imageListLength; + +#if (PNG_LIBPNG_VER < 10200) + if (image_info->verbose) + printf("Your PNG library (libpng-%s) is rather old.\n", + PNG_LIBPNG_VER_STRING); +#endif + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WriteMNGImage()"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + + /* + Allocate a MngInfo structure. + */ + mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); + if (mng_info == (MngInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Initialize members of the MngInfo structure. + */ + (void) memset(mng_info,0,sizeof(MngInfo)); + mng_info->image=image; + write_mng=LocaleCompare(image_info->magick,"MNG") == 0; + + /* + * See if user has requested a specific PNG subformat to be used + * for all of the PNGs in the MNG being written, e.g., + * + * convert *.png png8:animation.mng + * + * To do: check -define png:bit_depth and png:color_type as well, + * or perhaps use mng:bit_depth and mng:color_type instead for + * global settings. + */ + + mng_info->write_png8=LocaleCompare(image_info->magick,"PNG8") == 0; + mng_info->write_png24=LocaleCompare(image_info->magick,"PNG24") == 0; + mng_info->write_png32=LocaleCompare(image_info->magick,"PNG32") == 0; + + write_jng=MagickFalse; + if (image_info->compression == JPEGCompression) + write_jng=MagickTrue; + + mng_info->adjoin=image_info->adjoin && + (GetNextImageInList(image) != (Image *) NULL) && write_mng; + + if (logging != MagickFalse) + { + /* Log some info about the input */ + Image + *p; + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Checking input image(s)\n" + " Image_info depth: %.20g, Type: %d", + (double) image_info->depth, image_info->type); + + scene=0; + for (p=image; p != (Image *) NULL; p=GetNextImageInList(p)) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Scene: %.20g\n, Image depth: %.20g", + (double) scene++, (double) p->depth); + + if (p->matte) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Matte: True"); + + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Matte: False"); + + if (p->storage_class == PseudoClass) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Storage class: PseudoClass"); + + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Storage class: DirectClass"); + + if (p->colors) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Number of colors: %.20g",(double) p->colors); + + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Number of colors: unspecified"); + + if (mng_info->adjoin == MagickFalse) + break; + } + } + + use_global_plte=MagickFalse; + all_images_are_gray=MagickFalse; +#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED + need_local_plte=MagickTrue; +#endif + need_defi=MagickFalse; + need_matte=MagickFalse; + mng_info->framing_mode=1; + mng_info->old_framing_mode=1; + + if (write_mng) + if (image_info->page != (char *) NULL) + { + /* + Determine image bounding box. + */ + SetGeometry(image,&mng_info->page); + (void) ParseMetaGeometry(image_info->page,&mng_info->page.x, + &mng_info->page.y,&mng_info->page.width,&mng_info->page.height); + } + if (write_mng) + { + unsigned int + need_geom; + + unsigned short + red, + green, + blue; + + mng_info->page=image->page; + need_geom=MagickTrue; + if (mng_info->page.width || mng_info->page.height) + need_geom=MagickFalse; + /* + Check all the scenes. + */ + initial_delay=image->delay; + need_iterations=MagickFalse; + mng_info->equal_chrms=image->chromaticity.red_primary.x != 0.0; + mng_info->equal_physs=MagickTrue, + mng_info->equal_gammas=MagickTrue; + mng_info->equal_srgbs=MagickTrue; + mng_info->equal_backgrounds=MagickTrue; + image_count=0; +#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_MNG_FEATURES_SUPPORTED) + all_images_are_gray=MagickTrue; + mng_info->equal_palettes=MagickFalse; + need_local_plte=MagickFalse; +#endif + for (next_image=image; next_image != (Image *) NULL; ) + { + if (need_geom) + { + if ((next_image->columns+next_image->page.x) > mng_info->page.width) + mng_info->page.width=next_image->columns+next_image->page.x; + + if ((next_image->rows+next_image->page.y) > mng_info->page.height) + mng_info->page.height=next_image->rows+next_image->page.y; + } + + if (next_image->page.x || next_image->page.y) + need_defi=MagickTrue; + + if (next_image->matte) + need_matte=MagickTrue; + + if ((int) next_image->dispose >= BackgroundDispose) + if (next_image->matte || next_image->page.x || next_image->page.y || + ((next_image->columns < mng_info->page.width) && + (next_image->rows < mng_info->page.height))) + mng_info->need_fram=MagickTrue; + + if (next_image->iterations) + need_iterations=MagickTrue; + + final_delay=next_image->delay; + + if (final_delay != initial_delay || final_delay > 1UL* + next_image->ticks_per_second) + mng_info->need_fram=1; + +#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_MNG_FEATURES_SUPPORTED) + /* + check for global palette possibility. + */ + if (image->matte != MagickFalse) + need_local_plte=MagickTrue; + + if (need_local_plte == 0) + { + ImageType type = IdentifyImageType(image,&image->exception); + if ((type != GrayscaleType) && (type != BilevelType)) + all_images_are_gray=MagickFalse; + mng_info->equal_palettes=PalettesAreEqual(image,next_image); + if (use_global_plte == 0) + use_global_plte=mng_info->equal_palettes; + need_local_plte=!mng_info->equal_palettes; + } +#endif + if (GetNextImageInList(next_image) != (Image *) NULL) + { + if (next_image->background_color.red != + next_image->next->background_color.red || + next_image->background_color.green != + next_image->next->background_color.green || + next_image->background_color.blue != + next_image->next->background_color.blue) + mng_info->equal_backgrounds=MagickFalse; + + if (next_image->gamma != next_image->next->gamma) + mng_info->equal_gammas=MagickFalse; + + if (next_image->rendering_intent != + next_image->next->rendering_intent) + mng_info->equal_srgbs=MagickFalse; + + if ((next_image->units != next_image->next->units) || + (next_image->x_resolution != next_image->next->x_resolution) || + (next_image->y_resolution != next_image->next->y_resolution)) + mng_info->equal_physs=MagickFalse; + + if (mng_info->equal_chrms) + { + if (next_image->chromaticity.red_primary.x != + next_image->next->chromaticity.red_primary.x || + next_image->chromaticity.red_primary.y != + next_image->next->chromaticity.red_primary.y || + next_image->chromaticity.green_primary.x != + next_image->next->chromaticity.green_primary.x || + next_image->chromaticity.green_primary.y != + next_image->next->chromaticity.green_primary.y || + next_image->chromaticity.blue_primary.x != + next_image->next->chromaticity.blue_primary.x || + next_image->chromaticity.blue_primary.y != + next_image->next->chromaticity.blue_primary.y || + next_image->chromaticity.white_point.x != + next_image->next->chromaticity.white_point.x || + next_image->chromaticity.white_point.y != + next_image->next->chromaticity.white_point.y) + mng_info->equal_chrms=MagickFalse; + } + } + image_count++; + next_image=GetNextImageInList(next_image); + } + if (image_count < 2) + { + mng_info->equal_backgrounds=MagickFalse; + mng_info->equal_chrms=MagickFalse; + mng_info->equal_gammas=MagickFalse; + mng_info->equal_srgbs=MagickFalse; + mng_info->equal_physs=MagickFalse; + use_global_plte=MagickFalse; +#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED + need_local_plte=MagickTrue; +#endif + need_iterations=MagickFalse; + } + + if (mng_info->need_fram == MagickFalse) + { + /* + Only certain framing rates 100/n are exactly representable without + the FRAM chunk but we'll allow some slop in VLC files + */ + if (final_delay == 0) + { + if (need_iterations != MagickFalse) + { + /* + It's probably a GIF with loop; don't run it *too* fast. + */ + if (mng_info->adjoin) + { + final_delay=10; + (void) ThrowMagickException(&image->exception, + GetMagickModule(),CoderWarning, + "input has zero delay between all frames; assuming", + " 10 cs `%s'",""); + } + } + else + mng_info->ticks_per_second=0; + } + if (final_delay != 0) + mng_info->ticks_per_second=(png_uint_32) + (image->ticks_per_second/final_delay); + if (final_delay > 50) + mng_info->ticks_per_second=2; + + if (final_delay > 75) + mng_info->ticks_per_second=1; + + if (final_delay > 125) + mng_info->need_fram=MagickTrue; + + if (need_defi && final_delay > 2 && (final_delay != 4) && + (final_delay != 5) && (final_delay != 10) && (final_delay != 20) && + (final_delay != 25) && (final_delay != 50) && + (final_delay != (size_t) image->ticks_per_second)) + mng_info->need_fram=MagickTrue; /* make it exact; cannot be VLC */ + } + + if (mng_info->need_fram != MagickFalse) + mng_info->ticks_per_second=1UL*image->ticks_per_second; + /* + If pseudocolor, we should also check to see if all the + palettes are identical and write a global PLTE if they are. + ../glennrp Feb 99. + */ + /* + Write the MNG version 1.0 signature and MHDR chunk. + */ + (void) WriteBlob(image,8,(const unsigned char *) "\212MNG\r\n\032\n"); + (void) WriteBlobMSBULong(image,28L); /* chunk data length=28 */ + PNGType(chunk,mng_MHDR); + LogPNGChunk(logging,mng_MHDR,28L); + PNGLong(chunk+4,(png_uint_32) mng_info->page.width); + PNGLong(chunk+8,(png_uint_32) mng_info->page.height); + PNGLong(chunk+12,mng_info->ticks_per_second); + PNGLong(chunk+16,0L); /* layer count=unknown */ + PNGLong(chunk+20,0L); /* frame count=unknown */ + PNGLong(chunk+24,0L); /* play time=unknown */ + if (write_jng) + { + if (need_matte) + { + if (need_defi || mng_info->need_fram || use_global_plte) + PNGLong(chunk+28,27L); /* simplicity=LC+JNG */ + + else + PNGLong(chunk+28,25L); /* simplicity=VLC+JNG */ + } + + else + { + if (need_defi || mng_info->need_fram || use_global_plte) + PNGLong(chunk+28,19L); /* simplicity=LC+JNG, no transparency */ + + else + PNGLong(chunk+28,17L); /* simplicity=VLC+JNG, no transparency */ + } + } + + else + { + if (need_matte) + { + if (need_defi || mng_info->need_fram || use_global_plte) + PNGLong(chunk+28,11L); /* simplicity=LC */ + + else + PNGLong(chunk+28,9L); /* simplicity=VLC */ + } + + else + { + if (need_defi || mng_info->need_fram || use_global_plte) + PNGLong(chunk+28,3L); /* simplicity=LC, no transparency */ + + else + PNGLong(chunk+28,1L); /* simplicity=VLC, no transparency */ + } + } + (void) WriteBlob(image,32,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,32)); + option=GetImageOption(image_info,"mng:need-cacheoff"); + if (option != (const char *) NULL) + { + size_t + length; + + /* + Write "nEED CACHEOFF" to turn playback caching off for streaming MNG. + */ + PNGType(chunk,mng_nEED); + length=CopyMagickString((char *) chunk+4,"CACHEOFF",20); + (void) WriteBlobMSBULong(image,(size_t) length); + LogPNGChunk(logging,mng_nEED,(size_t) length); + length+=4; + (void) WriteBlob(image,length,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) length)); + } + if ((GetPreviousImageInList(image) == (Image *) NULL) && + (GetNextImageInList(image) != (Image *) NULL) && + (image->iterations != 1)) + { + /* + Write MNG TERM chunk + */ + (void) WriteBlobMSBULong(image,10L); /* data length=10 */ + PNGType(chunk,mng_TERM); + LogPNGChunk(logging,mng_TERM,10L); + chunk[4]=3; /* repeat animation */ + chunk[5]=0; /* show last frame when done */ + PNGLong(chunk+6,(png_uint_32) (mng_info->ticks_per_second* + final_delay/MagickMax(image->ticks_per_second,1))); + + if (image->iterations == 0) + PNGLong(chunk+10,PNG_UINT_31_MAX); + + else + PNGLong(chunk+10,(png_uint_32) image->iterations); + + if (logging != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " TERM delay: %.20g",(double) (mng_info->ticks_per_second* + final_delay/MagickMax(image->ticks_per_second,1))); + + if (image->iterations == 0) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " TERM iterations: %.20g",(double) PNG_UINT_31_MAX); + + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Image iterations: %.20g",(double) image->iterations); + } + (void) WriteBlob(image,14,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,14)); + } + /* + To do: check for cHRM+gAMA == sRGB, and write sRGB instead. + */ + if ((image->colorspace == sRGBColorspace || image->rendering_intent) && + mng_info->equal_srgbs) + { + /* + Write MNG sRGB chunk + */ + (void) WriteBlobMSBULong(image,1L); + PNGType(chunk,mng_sRGB); + LogPNGChunk(logging,mng_sRGB,1L); + + if (image->rendering_intent != UndefinedIntent) + chunk[4]=(unsigned char) + Magick_RenderingIntent_to_PNG_RenderingIntent( + (image->rendering_intent)); + + else + chunk[4]=(unsigned char) + Magick_RenderingIntent_to_PNG_RenderingIntent( + (PerceptualIntent)); + + (void) WriteBlob(image,5,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); + mng_info->have_write_global_srgb=MagickTrue; + } + + else + { + if (image->gamma && mng_info->equal_gammas) + { + /* + Write MNG gAMA chunk + */ + (void) WriteBlobMSBULong(image,4L); + PNGType(chunk,mng_gAMA); + LogPNGChunk(logging,mng_gAMA,4L); + PNGLong(chunk+4,(png_uint_32) (100000*image->gamma+0.5)); + (void) WriteBlob(image,8,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,8)); + mng_info->have_write_global_gama=MagickTrue; + } + if (mng_info->equal_chrms) + { + PrimaryInfo + primary; + + /* + Write MNG cHRM chunk + */ + (void) WriteBlobMSBULong(image,32L); + PNGType(chunk,mng_cHRM); + LogPNGChunk(logging,mng_cHRM,32L); + primary=image->chromaticity.white_point; + PNGLong(chunk+4,(png_uint_32) (100000*primary.x+0.5)); + PNGLong(chunk+8,(png_uint_32) (100000*primary.y+0.5)); + primary=image->chromaticity.red_primary; + PNGLong(chunk+12,(png_uint_32) (100000*primary.x+0.5)); + PNGLong(chunk+16,(png_uint_32) (100000*primary.y+0.5)); + primary=image->chromaticity.green_primary; + PNGLong(chunk+20,(png_uint_32) (100000*primary.x+0.5)); + PNGLong(chunk+24,(png_uint_32) (100000*primary.y+0.5)); + primary=image->chromaticity.blue_primary; + PNGLong(chunk+28,(png_uint_32) (100000*primary.x+0.5)); + PNGLong(chunk+32,(png_uint_32) (100000*primary.y+0.5)); + (void) WriteBlob(image,36,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,36)); + mng_info->have_write_global_chrm=MagickTrue; + } + } + if (image->x_resolution && image->y_resolution && mng_info->equal_physs) + { + /* + Write MNG pHYs chunk + */ + (void) WriteBlobMSBULong(image,9L); + PNGType(chunk,mng_pHYs); + LogPNGChunk(logging,mng_pHYs,9L); + + if (image->units == PixelsPerInchResolution) + { + PNGLong(chunk+4,(png_uint_32) + (image->x_resolution*100.0/2.54+0.5)); + + PNGLong(chunk+8,(png_uint_32) + (image->y_resolution*100.0/2.54+0.5)); + + chunk[12]=1; + } + + else + { + if (image->units == PixelsPerCentimeterResolution) + { + PNGLong(chunk+4,(png_uint_32) + (image->x_resolution*100.0+0.5)); + + PNGLong(chunk+8,(png_uint_32) + (image->y_resolution*100.0+0.5)); + + chunk[12]=1; + } + + else + { + PNGLong(chunk+4,(png_uint_32) (image->x_resolution+0.5)); + PNGLong(chunk+8,(png_uint_32) (image->y_resolution+0.5)); + chunk[12]=0; + } + } + (void) WriteBlob(image,13,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); + } + /* + Write MNG BACK chunk and global bKGD chunk, if the image is transparent + or does not cover the entire frame. + */ + if (write_mng && (image->matte || image->page.x > 0 || + image->page.y > 0 || (image->page.width && + (image->page.width+image->page.x < mng_info->page.width)) + || (image->page.height && (image->page.height+image->page.y + < mng_info->page.height)))) + { + (void) WriteBlobMSBULong(image,6L); + PNGType(chunk,mng_BACK); + LogPNGChunk(logging,mng_BACK,6L); + red=ScaleQuantumToShort(image->background_color.red); + green=ScaleQuantumToShort(image->background_color.green); + blue=ScaleQuantumToShort(image->background_color.blue); + PNGShort(chunk+4,red); + PNGShort(chunk+6,green); + PNGShort(chunk+8,blue); + (void) WriteBlob(image,10,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,10)); + if (mng_info->equal_backgrounds) + { + (void) WriteBlobMSBULong(image,6L); + PNGType(chunk,mng_bKGD); + LogPNGChunk(logging,mng_bKGD,6L); + (void) WriteBlob(image,10,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,10)); + } + } + +#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED + if ((need_local_plte == MagickFalse) && + (image->storage_class == PseudoClass) && + (all_images_are_gray == MagickFalse)) + { + size_t + data_length; + + /* + Write MNG PLTE chunk + */ + data_length=3*image->colors; + (void) WriteBlobMSBULong(image,data_length); + PNGType(chunk,mng_PLTE); + LogPNGChunk(logging,mng_PLTE,data_length); + + for (i=0; i < (ssize_t) image->colors; i++) + { + chunk[4+i*3]=ScaleQuantumToChar(image->colormap[i].red) & 0xff; + chunk[5+i*3]=ScaleQuantumToChar(image->colormap[i].green) & 0xff; + chunk[6+i*3]=ScaleQuantumToChar(image->colormap[i].blue) & 0xff; + } + + (void) WriteBlob(image,data_length+4,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) (data_length+4))); + mng_info->have_write_global_plte=MagickTrue; + } +#endif + } + scene=0; + mng_info->delay=0; +#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_MNG_FEATURES_SUPPORTED) + mng_info->equal_palettes=MagickFalse; +#endif + imageListLength=GetImageListLength(image); + do + { + if (mng_info->adjoin) + { +#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_MNG_FEATURES_SUPPORTED) + /* + If we aren't using a global palette for the entire MNG, check to + see if we can use one for two or more consecutive images. + */ + if (need_local_plte && use_global_plte && !all_images_are_gray) + { + if (mng_info->IsPalette) + { + /* + When equal_palettes is true, this image has the same palette + as the previous PseudoClass image + */ + mng_info->have_write_global_plte=mng_info->equal_palettes; + mng_info->equal_palettes=PalettesAreEqual(image,image->next); + if (mng_info->equal_palettes && !mng_info->have_write_global_plte) + { + /* + Write MNG PLTE chunk + */ + size_t + data_length; + + data_length=3*image->colors; + (void) WriteBlobMSBULong(image,data_length); + PNGType(chunk,mng_PLTE); + LogPNGChunk(logging,mng_PLTE,data_length); + + for (i=0; i < (ssize_t) image->colors; i++) + { + chunk[4+i*3]=ScaleQuantumToChar(image->colormap[i].red); + chunk[5+i*3]=ScaleQuantumToChar(image->colormap[i].green); + chunk[6+i*3]=ScaleQuantumToChar(image->colormap[i].blue); + } + + (void) WriteBlob(image,data_length+4,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk, + (uInt) (data_length+4))); + mng_info->have_write_global_plte=MagickTrue; + } + } + else + mng_info->have_write_global_plte=MagickFalse; + } +#endif + if (need_defi) + { + ssize_t + previous_x, + previous_y; + + if (scene != 0) + { + previous_x=mng_info->page.x; + previous_y=mng_info->page.y; + } + else + { + previous_x=0; + previous_y=0; + } + mng_info->page=image->page; + if ((mng_info->page.x != previous_x) || + (mng_info->page.y != previous_y)) + { + (void) WriteBlobMSBULong(image,12L); /* data length=12 */ + PNGType(chunk,mng_DEFI); + LogPNGChunk(logging,mng_DEFI,12L); + chunk[4]=0; /* object 0 MSB */ + chunk[5]=0; /* object 0 LSB */ + chunk[6]=0; /* visible */ + chunk[7]=0; /* abstract */ + PNGLong(chunk+8,(png_uint_32) mng_info->page.x); + PNGLong(chunk+12,(png_uint_32) mng_info->page.y); + (void) WriteBlob(image,16,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,16)); + } + } + } + + mng_info->write_mng=write_mng; + + if ((int) image->dispose >= 3) + mng_info->framing_mode=3; + + if (mng_info->need_fram && mng_info->adjoin && + ((image->delay != mng_info->delay) || + (mng_info->framing_mode != mng_info->old_framing_mode))) + { + if (image->delay == mng_info->delay) + { + /* + Write a MNG FRAM chunk with the new framing mode. + */ + (void) WriteBlobMSBULong(image,1L); /* data length=1 */ + PNGType(chunk,mng_FRAM); + LogPNGChunk(logging,mng_FRAM,1L); + chunk[4]=(unsigned char) mng_info->framing_mode; + (void) WriteBlob(image,5,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); + } + else + { + /* + Write a MNG FRAM chunk with the delay. + */ + (void) WriteBlobMSBULong(image,10L); /* data length=10 */ + PNGType(chunk,mng_FRAM); + LogPNGChunk(logging,mng_FRAM,10L); + chunk[4]=(unsigned char) mng_info->framing_mode; + chunk[5]=0; /* frame name separator (no name) */ + chunk[6]=2; /* flag for changing default delay */ + chunk[7]=0; /* flag for changing frame timeout */ + chunk[8]=0; /* flag for changing frame clipping */ + chunk[9]=0; /* flag for changing frame sync_id */ + PNGLong(chunk+10,(png_uint_32) + ((mng_info->ticks_per_second* + image->delay)/MagickMax(image->ticks_per_second,1))); + (void) WriteBlob(image,14,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,14)); + mng_info->delay=(png_uint_32) image->delay; + } + mng_info->old_framing_mode=mng_info->framing_mode; + } + +#if defined(JNG_SUPPORTED) + if (image_info->compression == JPEGCompression) + { + ImageInfo + *write_info; + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing JNG object."); + /* To do: specify the desired alpha compression method. */ + write_info=CloneImageInfo(image_info); + write_info->compression=UndefinedCompression; + status=WriteOneJNGImage(mng_info,write_info,image); + write_info=DestroyImageInfo(write_info); + } + else +#endif + { + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing PNG object."); + + mng_info->need_blob = MagickFalse; + mng_info->ping_preserve_colormap = MagickFalse; + + /* We don't want any ancillary chunks written */ + mng_info->ping_exclude_bKGD=MagickTrue; + mng_info->ping_exclude_caNv=MagickTrue; + mng_info->ping_exclude_cHRM=MagickTrue; + mng_info->ping_exclude_date=MagickTrue; + mng_info->ping_exclude_EXIF=MagickTrue; + mng_info->ping_exclude_eXIf=MagickTrue; + mng_info->ping_exclude_gAMA=MagickTrue; + mng_info->ping_exclude_iCCP=MagickTrue; + /* mng_info->ping_exclude_iTXt=MagickTrue; */ + mng_info->ping_exclude_oFFs=MagickTrue; + mng_info->ping_exclude_pHYs=MagickTrue; + mng_info->ping_exclude_sRGB=MagickTrue; + mng_info->ping_exclude_tEXt=MagickTrue; + mng_info->ping_exclude_tRNS=MagickTrue; + mng_info->ping_exclude_zCCP=MagickTrue; + mng_info->ping_exclude_zTXt=MagickTrue; + + status=WriteOnePNGImage(mng_info,image_info,image); + } + + if (status == MagickFalse) + { + mng_info=MngInfoFreeStruct(mng_info); + (void) CloseBlob(image); + return(MagickFalse); + } + (void) CatchImageException(image); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + + if (status == MagickFalse) + break; + + } while (mng_info->adjoin); + + if (write_mng) + { + while (GetPreviousImageInList(image) != (Image *) NULL) + image=GetPreviousImageInList(image); + /* + Write the MEND chunk. + */ + (void) WriteBlobMSBULong(image,0x00000000L); + PNGType(chunk,mng_MEND); + LogPNGChunk(logging,mng_MEND,0L); + (void) WriteBlob(image,4,chunk); + (void) WriteBlobMSBULong(image,crc32(0,chunk,4)); + } + /* + Relinquish resources. + */ + (void) CloseBlob(image); + mng_info=MngInfoFreeStruct(mng_info); + + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WriteMNGImage()"); + + return(MagickTrue); +} +#else /* PNG_LIBPNG_VER > 10011 */ + +static MagickBooleanType WritePNGImage(const ImageInfo *image_info,Image *image) +{ + (void) image; + printf("Your PNG library is too old: You have libpng-%s\n", + PNG_LIBPNG_VER_STRING); + + ThrowBinaryException(CoderError,"PNG library is too old", + image_info->filename); +} + +static MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image) +{ + return(WritePNGImage(image_info,image)); +} +#endif /* PNG_LIBPNG_VER > 10011 */ +#endif diff --git a/ImageMagick-6.9.12-44/coders/pnm.c b/ImageMagick-6.9.12-44/coders/pnm.c new file mode 100644 index 0000000..5c35b22 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pnm.c @@ -0,0 +1,2487 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP N N M M % +% P P NN N MM MM % +% PPPP N N N M M M % +% P N NN M M % +% P N N M M % +% % +% % +% Read/Write PBMPlus Portable Anymap Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" + +/* + Typedef declarations. +*/ +typedef struct _CommentInfo +{ + char + *comment; + + size_t + extent; +} CommentInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePNMImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P N M % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPNM() returns MagickTrue if the image format type, identified by the +% magick string, is PNM. +% +% The format of the IsPNM method is: +% +% MagickBooleanType IsPNM(const unsigned char *magick,const size_t extent) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o extent: Specifies the extent of the magick string. +% +*/ +static MagickBooleanType IsPNM(const unsigned char *magick,const size_t extent) +{ + if (extent < 2) + return(MagickFalse); + if ((*magick == (unsigned char) 'P') && + ((magick[1] == '1') || (magick[1] == '2') || (magick[1] == '3') || + (magick[1] == '4') || (magick[1] == '5') || (magick[1] == '6') || + (magick[1] == '7') || (magick[1] == 'F') || (magick[1] == 'f'))) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P N M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPNMImage() reads a Portable Anymap image file and returns it. +% It allocates the memory necessary for the new Image structure and returns +% a pointer to the new image. +% +% The format of the ReadPNMImage method is: +% +% Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static int PNMComment(Image *image,CommentInfo *comment_info) +{ + int + c; + + char + *p; + + /* + Read comment. + */ + p=comment_info->comment+strlen(comment_info->comment); + for (c='#'; (c != EOF) && (c != (int) '\n') && (c != (int) '\r'); p++) + { + if ((size_t) (p-comment_info->comment+1) >= comment_info->extent) + { + comment_info->extent<<=1; + comment_info->comment=(char *) ResizeQuantumMemory( + comment_info->comment,comment_info->extent, + sizeof(*comment_info->comment)); + if (comment_info->comment == (char *) NULL) + return(-1); + p=comment_info->comment+strlen(comment_info->comment); + } + c=ReadBlobByte(image); + if (c != EOF) + { + *p=(char) c; + *(p+1)='\0'; + } + } + return(c); +} + +static unsigned int PNMInteger(Image *image,CommentInfo *comment_info, + const unsigned int base) +{ + int + c; + + unsigned int + value; + + /* + Skip any leading whitespace. + */ + do + { + c=ReadBlobByte(image); + if (c == EOF) + return(0); + if (c == (int) '#') + c=PNMComment(image,comment_info); + } while ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r')); + if (base == 2) + return((unsigned int) (c-(int) '0')); + /* + Evaluate number. + */ + value=0; + while (isdigit((int) ((unsigned char) c)) != 0) + { + if (value <= (unsigned int) (INT_MAX/10)) + { + value*=10; + if (value <= (unsigned int) (INT_MAX-(c-(int) '0'))) + value+=c-(int) '0'; + } + c=ReadBlobByte(image); + if (c == EOF) + return(0); + } + if (c == (int) '#') + c=PNMComment(image,comment_info); + return(value); +} + +static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define ThrowPNMException(exception,message) \ +{ \ + if (comment_info.comment != (char *) NULL) \ + comment_info.comment=DestroyString(comment_info.comment); \ + if (quantum_info != (QuantumInfo *) NULL) \ + quantum_info=DestroyQuantumInfo(quantum_info); \ + ThrowReaderException((exception),(message)); \ +} + + char + format; + + ColorspaceType + colorspace; + + CommentInfo + comment_info; + + const void + *stream; + + double + quantum_scale; + + Image + *image; + + MagickBooleanType + status; + + QuantumAny + max_value; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + size_t + depth, + extent, + packet_size; + + ssize_t + count, + row, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read PNM image. + */ + quantum_info=(QuantumInfo *) NULL; + count=ReadBlob(image,1,(unsigned char *) &format); + do + { + /* + Initialize image structure. + */ + comment_info.comment=AcquireString(NULL); + comment_info.extent=MagickPathExtent; + if ((count != 1) || (format != 'P')) + ThrowPNMException(CorruptImageError,"ImproperImageHeader"); + max_value=1; + colorspace=UndefinedColorspace; + quantum_type=UndefinedQuantum; + quantum_scale=1.0; + format=(char) ReadBlobByte(image); + if (format != '7') + { + /* + PBM, PGM, PPM, and PNM. + */ + image->columns=PNMInteger(image,&comment_info,10); + image->rows=PNMInteger(image,&comment_info,10); + if ((format == 'f') || (format == 'F')) + { + char + scale[MaxTextExtent]; + + if (ReadBlobString(image,scale) != (char *) NULL) + quantum_scale=StringToDouble(scale,(char **) NULL); + } + else + { + if ((format == '1') || (format == '4')) + max_value=1; /* bitmap */ + else + max_value=PNMInteger(image,&comment_info,10); + } + } + else + { + char + keyword[MaxTextExtent], + value[MaxTextExtent]; + + int + c; + + char + *p; + + /* + PAM. + */ + for (c=ReadBlobByte(image); c != EOF; c=ReadBlobByte(image)) + { + while (isspace((int) ((unsigned char) c)) != 0) + c=ReadBlobByte(image); + if (c == '#') + { + /* + Comment. + */ + c=PNMComment(image,&comment_info); + c=ReadBlobByte(image); + while (isspace((int) ((unsigned char) c)) != 0) + c=ReadBlobByte(image); + } + p=keyword; + do + { + if ((size_t) (p-keyword) < (MaxTextExtent-1)) + *p++=c; + c=ReadBlobByte(image); + } while (isalnum((int) ((unsigned char) c))); + *p='\0'; + if (LocaleCompare(keyword,"endhdr") == 0) + break; + while (isspace((int) ((unsigned char) c)) != 0) + c=ReadBlobByte(image); + p=value; + while (isalnum((int) ((unsigned char) c)) || (c == '_')) + { + if ((size_t) (p-value) < (MaxTextExtent-1)) + *p++=c; + c=ReadBlobByte(image); + } + *p='\0'; + /* + Assign a value to the specified keyword. + */ + if (LocaleCompare(keyword,"depth") == 0) + packet_size=StringToUnsignedLong(value); + (void) packet_size; + if (LocaleCompare(keyword,"height") == 0) + image->rows=StringToUnsignedLong(value); + if (LocaleCompare(keyword,"maxval") == 0) + max_value=StringToUnsignedLong(value); + if ((quantum_type == UndefinedQuantum) && + (LocaleCompare(keyword,"TUPLTYPE") == 0)) + { + if (LocaleCompare(value,"BLACKANDWHITE") == 0) + { + colorspace=GRAYColorspace; + quantum_type=GrayQuantum; + } + if (LocaleCompare(value,"BLACKANDWHITE_ALPHA") == 0) + { + colorspace=GRAYColorspace; + image->matte=MagickTrue; + quantum_type=GrayAlphaQuantum; + } + if (LocaleCompare(value,"GRAYSCALE") == 0) + { + colorspace=GRAYColorspace; + quantum_type=GrayQuantum; + } + if (LocaleCompare(value,"GRAYSCALE_ALPHA") == 0) + { + colorspace=GRAYColorspace; + image->matte=MagickTrue; + quantum_type=GrayAlphaQuantum; + } + if (LocaleCompare(value,"RGB_ALPHA") == 0) + { + quantum_type=RGBAQuantum; + image->matte=MagickTrue; + } + if (LocaleCompare(value,"CMYK") == 0) + { + colorspace=CMYKColorspace; + quantum_type=CMYKQuantum; + } + if (LocaleCompare(value,"CMYK_ALPHA") == 0) + { + colorspace=CMYKColorspace; + image->matte=MagickTrue; + quantum_type=CMYKAQuantum; + } + } + if (LocaleCompare(keyword,"width") == 0) + image->columns=StringToUnsignedLong(value); + } + } + if (quantum_type == UndefinedQuantum) + quantum_type=RGBQuantum; + if ((image->columns == 0) || (image->rows == 0)) + ThrowPNMException(CorruptImageError,"NegativeOrZeroImageSize"); + if ((max_value == 0) || (max_value > 4294967295U)) + ThrowPNMException(CorruptImageError,"ImproperImageHeader"); + for (depth=1; GetQuantumRange(depth) < max_value; depth++) ; + image->depth=depth; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if ((MagickSizeType) (image->columns*image->rows/8) > GetBlobSize(image)) + ThrowPNMException(CorruptImageError,"InsufficientImageDataInFile"); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (colorspace != UndefinedColorspace) + (void) SetImageColorspace(image,colorspace); + (void) ResetImagePixels(image,exception); + /* + Convert PNM pixels. + */ + row=0; + switch (format) + { + case '1': + { + /* + Convert PBM image to pixel packets. + */ + (void) SetImageColorspace(image,GRAYColorspace); + for (y=0; y < (ssize_t) image->rows; y++) + { + ssize_t + x; + + PixelPacket + *magick_restrict q; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,PNMInteger(image,&comment_info,2) == 0 ? + QuantumRange : 0); + if (EOFBlob(image) != MagickFalse) + break; + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + if (EOFBlob(image) != MagickFalse) + break; + } + image->type=BilevelType; + break; + } + case '2': + { + size_t + intensity; + + /* + Convert PGM image to pixel packets. + */ + (void) SetImageColorspace(image,GRAYColorspace); + for (y=0; y < (ssize_t) image->rows; y++) + { + ssize_t + x; + + PixelPacket + *magick_restrict q; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + intensity=ScaleAnyToQuantum(PNMInteger(image,&comment_info,10), + max_value); + if (EOFBlob(image) != MagickFalse) + break; + SetPixelRed(q,intensity); + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + if (EOFBlob(image) != MagickFalse) + break; + } + image->type=GrayscaleType; + break; + } + case '3': + { + /* + Convert PNM image to pixel packets. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + ssize_t + x; + + PixelPacket + *magick_restrict q; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + QuantumAny + pixel; + + pixel=ScaleAnyToQuantum(PNMInteger(image,&comment_info,10), + max_value); + if (EOFBlob(image) != MagickFalse) + break; + SetPixelRed(q,pixel); + pixel=ScaleAnyToQuantum(PNMInteger(image,&comment_info,10), + max_value); + SetPixelGreen(q,pixel); + pixel=ScaleAnyToQuantum(PNMInteger(image,&comment_info,10), + max_value); + SetPixelBlue(q,pixel); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + if (EOFBlob(image) != MagickFalse) + break; + } + break; + } + case '4': + { + /* + Convert PBM raw image to pixel packets. + */ + (void) SetImageColorspace(image,GRAYColorspace); + quantum_type=GrayQuantum; + if (image->storage_class == PseudoClass) + quantum_type=IndexQuantum; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowPNMException(ResourceLimitError,"MemoryAllocationFailed"); + SetQuantumMinIsWhite(quantum_info,MagickTrue); + extent=GetQuantumExtent(image,quantum_info,quantum_type); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickBooleanType + sync; + + PixelPacket + *magick_restrict q; + + ssize_t + count, + offset; + + size_t + length; + + stream=ReadBlobStream(image,extent,pixels,&count); + if (count != (ssize_t) extent) + break; + if ((image->progress_monitor != (MagickProgressMonitor) NULL) && + (image->previous == (Image *) NULL)) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + row,image->rows); + if (proceed == MagickFalse) + break; + } + offset=row++; + q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,(unsigned char *) stream,exception); + if (length != extent) + break; + sync=SyncAuthenticPixels(image,exception); + if (sync == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + SetQuantumImageType(image,quantum_type); + break; + } + case '5': + { + /* + Convert PGM raw image to pixel packets. + */ + (void) SetImageColorspace(image,GRAYColorspace); + quantum_type=GrayQuantum; + extent=(image->depth <= 8 ? 1 : image->depth <= 16 ? 2 : 4)* + image->columns; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowPNMException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickBooleanType + sync; + + const unsigned char + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + ssize_t + count, + offset; + + stream=ReadBlobStream(image,extent,pixels,&count); + if (count != (ssize_t) extent) + break; + if ((image->progress_monitor != (MagickProgressMonitor) NULL) && + (image->previous == (Image *) NULL)) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + row,image->rows); + if (proceed == MagickFalse) + break; + } + offset=row++; + q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + p=(unsigned char *) stream; + switch (image->depth) + { + case 8: + case 16: + case 32: + { + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,(unsigned char *) stream,exception); + break; + } + default: + { + unsigned int + pixel; + + if (image->depth <= 8) + { + unsigned char + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushCharPixel(p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + q++; + } + break; + } + if (image->depth <= 16) + { + unsigned short + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + q++; + } + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + q++; + } + break; + } + } + sync=SyncAuthenticPixels(image,exception); + if (sync == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + SetQuantumImageType(image,quantum_type); + break; + } + case '6': + { + /* + Convert PNM raster image to pixel packets. + */ + quantum_type=RGBQuantum; + extent=3*(image->depth <= 8 ? 1 : image->depth <= 16 ? 2 : 4)* + image->columns; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowPNMException(ResourceLimitError,"MemoryAllocationFailed"); + (void) SetQuantumEndian(image,quantum_info,MSBEndian); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickBooleanType + sync; + + const unsigned char + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + ssize_t + count, + offset; + + stream=ReadBlobStream(image,extent,pixels,&count); + if (count != (ssize_t) extent) + break; + if ((image->progress_monitor != (MagickProgressMonitor) NULL) && + (image->previous == (Image *) NULL)) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + row,image->rows); + if (proceed == MagickFalse) + break; + } + offset=row++; + q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + p=(unsigned char *) stream; + switch (image->depth) + { + case 8: + { + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + q->opacity=OpaqueOpacity; + q++; + } + break; + } + case 16: + { + unsigned short + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleShortToQuantum(pixel)); + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelGreen(q,ScaleShortToQuantum(pixel)); + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelBlue(q,ScaleShortToQuantum(pixel)); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + break; + } + case 32: + { + unsigned int + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleLongToQuantum(pixel)); + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelGreen(q,ScaleLongToQuantum(pixel)); + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelBlue(q,ScaleLongToQuantum(pixel)); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + break; + } + default: + { + unsigned int + pixel; + + if (image->depth <= 8) + { + unsigned char + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushCharPixel(p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushCharPixel(p,&pixel); + SetPixelGreen(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushCharPixel(p,&pixel); + SetPixelBlue(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + break; + } + if (image->depth <= 16) + { + unsigned short + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelGreen(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelBlue(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelGreen(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelBlue(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + break; + } + break; + } + sync=SyncAuthenticPixels(image,exception); + if (sync == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + break; + } + case '7': + { + IndexPacket + *indexes; + + size_t + channels; + + /* + Convert PAM raster image to pixel packets. + */ + switch (quantum_type) + { + case GrayQuantum: + case GrayAlphaQuantum: + { + channels=1; + break; + } + case CMYKQuantum: + case CMYKAQuantum: + { + channels=4; + break; + } + default: + { + channels=3; + break; + } + } + if (image->matte != MagickFalse) + channels++; + extent=channels*(image->depth <= 8 ? 1 : image->depth <= 16 ? 2 : 4)* + image->columns; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowPNMException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickBooleanType + sync; + + const unsigned char + *magick_restrict p; + + ssize_t + x; + + PixelPacket + *magick_restrict q; + + ssize_t + count, + offset; + + stream=ReadBlobStream(image,extent,pixels,&count); + if (count != (ssize_t) extent) + break; + if ((image->progress_monitor != (MagickProgressMonitor) NULL) && + (image->previous == (Image *) NULL)) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + row,image->rows); + if (proceed == MagickFalse) + break; + } + offset=row++; + q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + p=(unsigned char *) stream; + switch (image->depth) + { + case 8: + case 16: + case 32: + { + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,(unsigned char *) stream,exception); + break; + } + default: + { + switch (quantum_type) + { + case GrayQuantum: + case GrayAlphaQuantum: + { + unsigned int + pixel; + + if (image->depth <= 8) + { + unsigned char + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushCharPixel(p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + p=PushCharPixel(p,&pixel); + if (image->depth != 1) + SetPixelOpacity(q,ScaleAnyToQuantum(pixel, + max_value)); + else + SetPixelOpacity(q,QuantumRange-ScaleAnyToQuantum( + pixel,max_value)); + } + q++; + } + break; + } + if (image->depth <= 16) + { + unsigned short + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelOpacity(q,ScaleAnyToQuantum(pixel, + max_value)); + } + q++; + } + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelOpacity(q,ScaleAnyToQuantum(pixel,max_value)); + } + q++; + } + break; + } + case CMYKQuantum: + case CMYKAQuantum: + { + unsigned int + pixel; + + if (image->depth <= 8) + { + unsigned char + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushCharPixel(p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushCharPixel(p,&pixel); + SetPixelGreen(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushCharPixel(p,&pixel); + SetPixelBlue(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushCharPixel(p,&pixel); + SetPixelIndex(indexes+x,ScaleAnyToQuantum(pixel, + max_value)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + p=PushCharPixel(p,&pixel); + SetPixelOpacity(q,ScaleAnyToQuantum(pixel, + max_value)); + } + q++; + } + break; + } + if (image->depth <= 16) + { + unsigned short + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelGreen(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelBlue(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelIndex(indexes+x,ScaleAnyToQuantum(pixel, + max_value)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelOpacity(q,ScaleAnyToQuantum(pixel, + max_value)); + } + q++; + } + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelGreen(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelBlue(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelIndex(indexes+x,ScaleAnyToQuantum(pixel,max_value)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelOpacity(q,ScaleAnyToQuantum(pixel,max_value)); + } + q++; + } + break; + } + default: + { + unsigned int + pixel; + + if (image->depth <= 8) + { + unsigned char + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushCharPixel(p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushCharPixel(p,&pixel); + SetPixelGreen(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushCharPixel(p,&pixel); + SetPixelBlue(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + p=PushCharPixel(p,&pixel); + SetPixelOpacity(q,ScaleAnyToQuantum(pixel, + max_value)); + } + q++; + } + break; + } + if (image->depth <= 16) + { + unsigned short + pixel; + + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelGreen(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelBlue(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + p=PushShortPixel(MSBEndian,p,&pixel); + SetPixelOpacity(q,ScaleAnyToQuantum(pixel, + max_value)); + } + q++; + } + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelRed(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelGreen(q,ScaleAnyToQuantum(pixel,max_value)); + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelBlue(q,ScaleAnyToQuantum(pixel,max_value)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + { + p=PushLongPixel(MSBEndian,p,&pixel); + SetPixelOpacity(q,ScaleAnyToQuantum(pixel,max_value)); + } + q++; + } + break; + } + } + break; + } + } + sync=SyncAuthenticPixels(image,exception); + if (sync == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + SetQuantumImageType(image,quantum_type); + break; + } + case 'F': + case 'f': + { + /* + Convert PFM raster image to pixel packets. + */ + if (format == 'f') + (void) SetImageColorspace(image,GRAYColorspace); + quantum_type=format == 'f' ? GrayQuantum : RGBQuantum; + image->endian=quantum_scale < 0.0 ? LSBEndian : MSBEndian; + image->depth=32; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowPNMException(ResourceLimitError,"MemoryAllocationFailed"); + status=SetQuantumDepth(image,quantum_info,32); + if (status == MagickFalse) + ThrowPNMException(ResourceLimitError,"MemoryAllocationFailed"); + status=SetQuantumFormat(image,quantum_info,FloatingPointQuantumFormat); + if (status == MagickFalse) + ThrowPNMException(ResourceLimitError,"MemoryAllocationFailed"); + SetQuantumScale(quantum_info,(MagickRealType) QuantumRange* + fabs(quantum_scale)); + extent=GetQuantumExtent(image,quantum_info,quantum_type); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickBooleanType + sync; + + PixelPacket + *magick_restrict q; + + ssize_t + count, + offset; + + size_t + length; + + stream=ReadBlobStream(image,extent,pixels,&count); + if ((size_t) count != extent) + break; + if ((image->progress_monitor != (MagickProgressMonitor) NULL) && + (image->previous == (Image *) NULL)) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + row,image->rows); + if (proceed == MagickFalse) + break; + } + offset=row++; + q=QueueAuthenticPixels(image,0,(ssize_t) (image->rows-offset-1), + image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,(unsigned char *) stream,exception); + if (length != extent) + break; + sync=SyncAuthenticPixels(image,exception); + if (sync == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + SetQuantumImageType(image,quantum_type); + break; + } + default: + ThrowPNMException(CorruptImageError,"ImproperImageHeader"); + } + if (*comment_info.comment != '\0') + (void) SetImageProperty(image,"comment",comment_info.comment); + comment_info.comment=DestroyString(comment_info.comment); + if (y < (ssize_t) image->rows) + ThrowPNMException(CorruptImageError,"UnableToReadImageData"); + if (EOFBlob(image) != MagickFalse) + { + (void) ThrowMagickException(exception,GetMagickModule(), + CorruptImageError,"UnexpectedEndOfFile","`%s'",image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if ((format == '1') || (format == '2') || (format == '3')) + do + { + /* + Skip to end of line. + */ + count=ReadBlob(image,1,(unsigned char *) &format); + if (count != 1) + break; + if (format == 'P') + break; + } while (format != '\n'); + count=ReadBlob(image,1,(unsigned char *) &format); + if ((count == 1) && (format == 'P')) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while ((count == 1) && (format == 'P')); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P N M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPNMImage() adds properties for the PNM image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPNMImage method is: +% +% size_t RegisterPNMImage(void) +% +*/ +ModuleExport size_t RegisterPNMImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PAM"); + entry->decoder=(DecodeImageHandler *) ReadPNMImage; + entry->encoder=(EncodeImageHandler *) WritePNMImage; + entry->description=ConstantString("Common 2-dimensional bitmap format"); + entry->mime_type=ConstantString("image/x-portable-anymap"); + entry->magick_module=ConstantString("PNM"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PBM"); + entry->decoder=(DecodeImageHandler *) ReadPNMImage; + entry->encoder=(EncodeImageHandler *) WritePNMImage; + entry->description=ConstantString("Portable bitmap format (black and white)"); + entry->mime_type=ConstantString("image/x-portable-bitmap"); + entry->magick_module=ConstantString("PNM"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PFM"); + entry->decoder=(DecodeImageHandler *) ReadPNMImage; + entry->encoder=(EncodeImageHandler *) WritePNMImage; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Portable float format"); + entry->magick_module=ConstantString("PFM"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PGM"); + entry->decoder=(DecodeImageHandler *) ReadPNMImage; + entry->encoder=(EncodeImageHandler *) WritePNMImage; + entry->description=ConstantString("Portable graymap format (gray scale)"); + entry->mime_type=ConstantString("image/x-portable-graymap"); + entry->magick_module=ConstantString("PNM"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PNM"); + entry->decoder=(DecodeImageHandler *) ReadPNMImage; + entry->encoder=(EncodeImageHandler *) WritePNMImage; + entry->magick=(IsImageFormatHandler *) IsPNM; + entry->description=ConstantString("Portable anymap"); + entry->mime_type=ConstantString("image/x-portable-pixmap"); + entry->magick_module=ConstantString("PNM"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PPM"); + entry->decoder=(DecodeImageHandler *) ReadPNMImage; + entry->encoder=(EncodeImageHandler *) WritePNMImage; + entry->description=ConstantString("Portable pixmap format (color)"); + entry->mime_type=ConstantString("image/x-portable-pixmap"); + entry->magick_module=ConstantString("PNM"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P N M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPNMImage() removes format registrations made by the +% PNM module from the list of supported formats. +% +% The format of the UnregisterPNMImage method is: +% +% UnregisterPNMImage(void) +% +*/ +ModuleExport void UnregisterPNMImage(void) +{ + (void) UnregisterMagickInfo("PAM"); + (void) UnregisterMagickInfo("PBM"); + (void) UnregisterMagickInfo("PGM"); + (void) UnregisterMagickInfo("PNM"); + (void) UnregisterMagickInfo("PPM"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P N M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePNMImage() writes an image to a file in the PNM rasterfile format. +% +% The format of the WritePNMImage method is: +% +% MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image) +{ + char + buffer[MaxTextExtent], + format, + magick[MaxTextExtent]; + + const char + *value; + + IndexPacket + index; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumAny + pixel; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + unsigned char + *pixels, + *q; + + size_t + extent, + imageListLength, + packet_size; + + ssize_t + count, + y; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + imageListLength=GetImageListLength(image); + do + { + QuantumAny + max_value; + + /* + Write PNM file header. + */ + max_value=GetQuantumRange(image->depth); + packet_size=3; + quantum_type=RGBQuantum; + (void) CopyMagickString(magick,image_info->magick,MaxTextExtent); + switch (magick[1]) + { + case 'A': + case 'a': + { + format='7'; + break; + } + case 'B': + case 'b': + { + format='4'; + if (image_info->compression == NoCompression) + format='1'; + break; + } + case 'F': + case 'f': + { + format='F'; + if (image_info->type == TrueColorType) + break; + if (IdentifyImageType(image,&image->exception) == GrayscaleType) + format='f'; + break; + } + case 'G': + case 'g': + { + format='5'; + if (image_info->compression == NoCompression) + format='2'; + break; + } + case 'N': + case 'n': + { + ImageType + type; + + format='6'; + if (image_info->type == TrueColorType) + break; + type=IdentifyImageType(image,&image->exception); + if (type == GrayscaleType) + { + format='5'; + if (image_info->compression == NoCompression) + format='2'; + if (type == BilevelType) + { + format='4'; + if (image_info->compression == NoCompression) + format='1'; + } + break; + } + } + default: + { + format='6'; + if (image_info->compression == NoCompression) + format='3'; + break; + } + } + (void) FormatLocaleString(buffer,MaxTextExtent,"P%c\n",format); + (void) WriteBlobString(image,buffer); + value=GetImageProperty(image,"comment"); + if (value != (const char *) NULL) + { + const char + *p; + + /* + Write comments to file. + */ + (void) WriteBlobByte(image,'#'); + for (p=value; *p != '\0'; p++) + { + (void) WriteBlobByte(image,(unsigned char) *p); + if ((*p == '\n') || (*p == '\r')) + (void) WriteBlobByte(image,'#'); + } + (void) WriteBlobByte(image,'\n'); + } + if (format != '7') + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g\n", + (double) image->columns,(double) image->rows); + (void) WriteBlobString(image,buffer); + } + else + { + char + type[MaxTextExtent]; + + /* + PAM header. + */ + (void) FormatLocaleString(buffer,MaxTextExtent, + "WIDTH %.20g\nHEIGHT %.20g\n",(double) image->columns,(double) + image->rows); + (void) WriteBlobString(image,buffer); + quantum_type=GetQuantumType(image,&image->exception); + switch (quantum_type) + { + case CMYKQuantum: + case CMYKAQuantum: + { + packet_size=4; + (void) CopyMagickString(type,"CMYK",MaxTextExtent); + break; + } + case GrayQuantum: + case GrayAlphaQuantum: + { + packet_size=1; + (void) CopyMagickString(type,"GRAYSCALE",MaxTextExtent); + if (IdentifyImageMonochrome(image,&image->exception) != MagickFalse) + (void) CopyMagickString(type,"BLACKANDWHITE",MaxTextExtent); + break; + } + default: + { + quantum_type=RGBQuantum; + if (image->matte != MagickFalse) + quantum_type=RGBAQuantum; + packet_size=3; + (void) CopyMagickString(type,"RGB",MaxTextExtent); + break; + } + } + if (image->matte != MagickFalse) + { + packet_size++; + (void) ConcatenateMagickString(type,"_ALPHA",MaxTextExtent); + } + if (image->depth > 32) + image->depth=32; + (void) FormatLocaleString(buffer,MaxTextExtent, + "DEPTH %.20g\nMAXVAL %.20g\n",(double) packet_size,(double) + ((MagickOffsetType) GetQuantumRange(image->depth))); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"TUPLTYPE %s\nENDHDR\n", + type); + (void) WriteBlobString(image,buffer); + } + /* + Convert to PNM raster pixels. + */ + switch (format) + { + case '1': + { + unsigned char + pixels[2048]; + + /* + Convert image to a PBM image. + */ + (void) SetImageType(image,BilevelType); + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=(unsigned char) (GetPixelLuma(image,p) >= (QuantumRange/2.0) ? + '0' : '1'); + if ((q-pixels+2) >= (ssize_t) sizeof(pixels)) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + *q++=' '; + p++; + } + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (q != pixels) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + } + break; + } + case '2': + { + unsigned char + pixels[2048]; + + /* + Convert image to a PGM image. + */ + if (image->depth <= 8) + (void) WriteBlobString(image,"255\n"); + else + if (image->depth <= 16) + (void) WriteBlobString(image,"65535\n"); + else + (void) WriteBlobString(image,"4294967295\n"); + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + index=ClampToQuantum(GetPixelLuma(image,p)); + if (image->depth <= 8) + count=(ssize_t) FormatLocaleString(buffer,MaxTextExtent,"%u ", + ScaleQuantumToChar(index)); + else + if (image->depth <= 16) + count=(ssize_t) FormatLocaleString(buffer,MaxTextExtent,"%u ", + ScaleQuantumToShort(index)); + else + count=(ssize_t) FormatLocaleString(buffer,MaxTextExtent,"%u ", + ScaleQuantumToLong(index)); + extent=(size_t) count; + if ((q-pixels+extent+1) >= sizeof(pixels)) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + (void) memcpy((char *) q,buffer,extent); + q+=extent; + p++; + } + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (q != pixels) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + } + break; + } + case '3': + { + unsigned char + pixels[2048]; + + /* + Convert image to a PNM image. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + if (image->depth <= 8) + (void) WriteBlobString(image,"255\n"); + else + if (image->depth <= 16) + (void) WriteBlobString(image,"65535\n"); + else + (void) WriteBlobString(image,"4294967295\n"); + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (image->depth <= 8) + count=(ssize_t) FormatLocaleString(buffer,MaxTextExtent, + "%u %u %u ",ScaleQuantumToChar(GetPixelRed(p)), + ScaleQuantumToChar(GetPixelGreen(p)), + ScaleQuantumToChar(GetPixelBlue(p))); + else + if (image->depth <= 16) + count=(ssize_t) FormatLocaleString(buffer,MaxTextExtent, + "%u %u %u ",ScaleQuantumToShort(GetPixelRed(p)), + ScaleQuantumToShort(GetPixelGreen(p)), + ScaleQuantumToShort(GetPixelBlue(p))); + else + count=(ssize_t) FormatLocaleString(buffer,MaxTextExtent, + "%u %u %u ",ScaleQuantumToLong(GetPixelRed(p)), + ScaleQuantumToLong(GetPixelGreen(p)), + ScaleQuantumToLong(GetPixelBlue(p))); + extent=(size_t) count; + if ((q-pixels+extent+1) >= sizeof(pixels)) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + (void) memcpy((char *) q,buffer,extent); + q+=extent; + p++; + } + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (q != pixels) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + } + break; + } + case '4': + { + /* + Convert image to a PBM image. + */ + (void) SetImageType(image,BilevelType); + image->depth=1; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + SetQuantumMinIsWhite(quantum_info,MagickTrue); + (void) SetQuantumEndian(image,quantum_info,MSBEndian); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + extent=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayQuantum,pixels,&image->exception); + count=WriteBlob(image,extent,pixels); + if (count != (ssize_t) extent) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + break; + } + case '5': + { + /* + Convert image to a PGM image. + */ + if (image->depth > 32) + image->depth=32; + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) + ((MagickOffsetType) GetQuantumRange(image->depth))); + (void) WriteBlobString(image,buffer); + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) SetQuantumEndian(image,quantum_info,MSBEndian); + pixels=GetQuantumPixels(quantum_info); + extent=GetQuantumExtent(image,quantum_info,GrayQuantum); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels; + switch (image->depth) + { + case 8: + case 16: + case 32: + { + extent=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GrayQuantum,pixels,&image->exception); + break; + } + default: + { + if (image->depth <= 8) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + if (IsGrayPixel(p) == MagickFalse) + pixel=ScaleQuantumToAny(ClampToQuantum( + GetPixelLuma(image,p)),max_value); + else + { + if (image->depth == 8) + pixel=ScaleQuantumToChar(GetPixelRed(p)); + else + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + } + q=PopCharPixel((unsigned char) pixel,q); + p++; + } + extent=(size_t) (q-pixels); + break; + } + if (image->depth <= 16) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + if (IsGrayPixel(p) == MagickFalse) + pixel=ScaleQuantumToAny(ClampToQuantum( + GetPixelLuma(image,p)),max_value); + else + { + if (image->depth == 16) + pixel=ScaleQuantumToShort(GetPixelRed(p)); + else + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + } + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + p++; + } + extent=(size_t) (q-pixels); + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + if (IsGrayPixel(p) == MagickFalse) + pixel=ScaleQuantumToAny(ClampToQuantum( + GetPixelLuma(image,p)),max_value); + else + { + if (image->depth == 32) + pixel=ScaleQuantumToLong(GetPixelRed(p)); + else + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + } + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + p++; + } + extent=(size_t) (q-pixels); + break; + } + } + count=WriteBlob(image,extent,pixels); + if (count != (ssize_t) extent) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + break; + } + case '6': + { + /* + Convert image to a PNM image. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + if (image->depth > 32) + image->depth=32; + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) + ((MagickOffsetType) GetQuantumRange(image->depth))); + (void) WriteBlobString(image,buffer); + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) SetQuantumEndian(image,quantum_info,MSBEndian); + (void) SetQuantumEndian(image,quantum_info,MSBEndian); + pixels=GetQuantumPixels(quantum_info); + extent=GetQuantumExtent(image,quantum_info,quantum_type); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels; + switch (image->depth) + { + case 8: + case 16: + case 32: + { + extent=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + break; + } + default: + { + if (image->depth <= 8) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + q=PopCharPixel((unsigned char) pixel,q); + pixel=ScaleQuantumToAny(GetPixelGreen(p),max_value); + q=PopCharPixel((unsigned char) pixel,q); + pixel=ScaleQuantumToAny(GetPixelBlue(p),max_value); + q=PopCharPixel((unsigned char) pixel,q); + p++; + } + extent=(size_t) (q-pixels); + break; + } + if (image->depth <= 16) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + pixel=ScaleQuantumToAny(GetPixelGreen(p),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + pixel=ScaleQuantumToAny(GetPixelBlue(p),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + p++; + } + extent=(size_t) (q-pixels); + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + q=PopLongPixel(MSBEndian,(unsigned short) pixel,q); + pixel=ScaleQuantumToAny(GetPixelGreen(p),max_value); + q=PopLongPixel(MSBEndian,(unsigned short) pixel,q); + pixel=ScaleQuantumToAny(GetPixelBlue(p),max_value); + q=PopLongPixel(MSBEndian,(unsigned short) pixel,q); + p++; + } + extent=(size_t) (q-pixels); + break; + } + } + count=WriteBlob(image,extent,pixels); + if (count != (ssize_t) extent) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + break; + } + case '7': + { + /* + Convert image to a PAM. + */ + if (image->depth > 32) + image->depth=32; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) SetQuantumEndian(image,quantum_info,MSBEndian); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + q=pixels; + switch (image->depth) + { + case 8: + case 16: + case 32: + { + extent=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + break; + } + default: + { + switch (quantum_type) + { + case GrayQuantum: + case GrayAlphaQuantum: + { + if (image->depth <= 8) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(ClampToQuantum( + GetPixelLuma(image,p)),max_value); + q=PopCharPixel((unsigned char) pixel,q); + if (image->matte != MagickFalse) + { + pixel=(unsigned char) ScaleQuantumToAny( + GetPixelOpacity(p),max_value); + q=PopCharPixel((unsigned char) pixel,q); + } + p++; + } + break; + } + if (image->depth <= 16) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(ClampToQuantum( + GetPixelLuma(image,p)),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + if (image->matte != MagickFalse) + { + pixel=(unsigned char) ScaleQuantumToAny( + GetPixelOpacity(p),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + } + p++; + } + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(ClampToQuantum( + GetPixelLuma(image,p)),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + if (image->matte != MagickFalse) + { + pixel=(unsigned char) ScaleQuantumToAny( + GetPixelOpacity(p),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + } + p++; + } + break; + } + case CMYKQuantum: + case CMYKAQuantum: + { + if (image->depth <= 8) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + q=PopCharPixel((unsigned char) pixel,q); + pixel=ScaleQuantumToAny(GetPixelGreen(p),max_value); + q=PopCharPixel((unsigned char) pixel,q); + pixel=ScaleQuantumToAny(GetPixelBlue(p),max_value); + q=PopCharPixel((unsigned char) pixel,q); + pixel=ScaleQuantumToAny(GetPixelIndex(indexes+x), + max_value); + q=PopCharPixel((unsigned char) pixel,q); + if (image->matte != MagickFalse) + { + pixel=ScaleQuantumToAny((Quantum) (QuantumRange- + GetPixelOpacity(p)),max_value); + q=PopCharPixel((unsigned char) pixel,q); + } + p++; + } + break; + } + if (image->depth <= 16) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + pixel=ScaleQuantumToAny(GetPixelGreen(p),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + pixel=ScaleQuantumToAny(GetPixelBlue(p),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + pixel=ScaleQuantumToAny(GetPixelIndex(indexes+x), + max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + if (image->matte != MagickFalse) + { + pixel=ScaleQuantumToAny((Quantum) (QuantumRange- + GetPixelOpacity(p)),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + } + p++; + } + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + pixel=ScaleQuantumToAny(GetPixelGreen(p),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + pixel=ScaleQuantumToAny(GetPixelBlue(p),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + pixel=ScaleQuantumToAny(GetPixelIndex(indexes+x),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + if (image->matte != MagickFalse) + { + pixel=ScaleQuantumToAny((Quantum) (QuantumRange- + GetPixelOpacity(p)),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + } + p++; + } + break; + } + default: + { + if (image->depth <= 8) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + q=PopCharPixel((unsigned char) pixel,q); + pixel=ScaleQuantumToAny(GetPixelGreen(p),max_value); + q=PopCharPixel((unsigned char) pixel,q); + pixel=ScaleQuantumToAny(GetPixelBlue(p),max_value); + q=PopCharPixel((unsigned char) pixel,q); + if (image->matte != MagickFalse) + { + pixel=ScaleQuantumToAny((Quantum) (QuantumRange- + GetPixelOpacity(p)),max_value); + q=PopCharPixel((unsigned char) pixel,q); + } + p++; + } + break; + } + if (image->depth <= 16) + { + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + pixel=ScaleQuantumToAny(GetPixelGreen(p),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + pixel=ScaleQuantumToAny(GetPixelBlue(p),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + if (image->matte != MagickFalse) + { + pixel=ScaleQuantumToAny((Quantum) (QuantumRange- + GetPixelOpacity(p)),max_value); + q=PopShortPixel(MSBEndian,(unsigned short) pixel,q); + } + p++; + } + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ScaleQuantumToAny(GetPixelRed(p),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + pixel=ScaleQuantumToAny(GetPixelGreen(p),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + pixel=ScaleQuantumToAny(GetPixelBlue(p),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + if (image->matte != MagickFalse) + { + pixel=ScaleQuantumToAny((Quantum) (QuantumRange- + GetPixelOpacity(p)),max_value); + q=PopLongPixel(MSBEndian,(unsigned int) pixel,q); + } + p++; + } + break; + } + } + extent=(size_t) (q-pixels); + break; + } + } + count=WriteBlob(image,extent,pixels); + if (count != (ssize_t) extent) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + break; + } + case 'F': + case 'f': + { + (void) WriteBlobString(image,image->endian == LSBEndian ? "-1.0\n" : + "1.0\n"); + image->depth=32; + quantum_type=format == 'f' ? GrayQuantum : RGBQuantum; + quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + status=SetQuantumFormat(image,quantum_info,FloatingPointQuantumFormat); + if (status == MagickFalse) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + extent=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + (void) WriteBlob(image,extent,pixels); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + break; + } + } + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/preview.c b/ImageMagick-6.9.12-44/coders/preview.c new file mode 100644 index 0000000..96abbdb --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/preview.c @@ -0,0 +1,201 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP RRRR EEEEE V V IIIII EEEEE W W % +% P P R R E V V I E W W % +% PPPP RRRR EEE V V I EEE W W % +% P R R E V V I E W W W % +% P R R EEEEE V IIIII EEEEE W W % +% % +% % +% Write A Preview Image. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/property.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/client.h" +#include "magick/constitute.h" +#include "magick/effect.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/transform.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePreviewImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P R E V I E W I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPREVIEWImage() adds attributes for the Preview image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPREVIEWImage method is: +% +% size_t RegisterPREVIEWImage(void) +% +*/ +ModuleExport size_t RegisterPREVIEWImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PREVIEW"); + entry->encoder=(EncodeImageHandler *) WritePreviewImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString( + "Show a preview an image enhancement, effect, or f/x"); + entry->magick_module=ConstantString("PREVIEW"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P R E V I E W I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPREVIEWImage() removes format registrations made by the +% PREVIEW module from the list of supported formats. +% +% The format of the UnregisterPREVIEWImage method is: +% +% UnregisterPREVIEWImage(void) +% +*/ +ModuleExport void UnregisterPREVIEWImage(void) +{ + (void) UnregisterMagickInfo("PREVIEW"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P R E V I E W I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePreviewImage creates several tiles each with a varying +% stength of an image enhancement function (e.g. gamma). The image is written +% in the MIFF format. +% +% The format of the WritePreviewImage method is: +% +% MagickBooleanType WritePreviewImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WritePreviewImage(const ImageInfo *image_info, + Image *image) +{ + Image + *preview_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + preview_image=PreviewImage(image,image_info->preview_type,&image->exception); + if (preview_image == (Image *) NULL) + return(MagickFalse); + (void) CopyMagickString(preview_image->filename,image_info->filename, + MaxTextExtent); + write_info=CloneImageInfo(image_info); + *write_info->magick='\0'; + (void) SetImageInfo(write_info,1,&image->exception); + if ((*write_info->magick == '\0') || + (LocaleCompare(write_info->magick,"PREVIEW") == 0)) + (void) FormatLocaleString(preview_image->filename,MaxTextExtent, + "miff:%s",image_info->filename); + status=WriteImage(write_info,preview_image); + preview_image=DestroyImage(preview_image); + write_info=DestroyImageInfo(write_info); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/ps.c b/ImageMagick-6.9.12-44/coders/ps.c new file mode 100644 index 0000000..0f93c96 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/ps.c @@ -0,0 +1,2230 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP SSSSS % +% P P SS % +% PPPP SSS % +% P SS % +% P SSSSS % +% % +% % +% Read/Write Postscript Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/delegate.h" +#include "magick/delegate-private.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/nt-base-private.h" +#include "magick/option.h" +#include "magick/profile.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/timer-private.h" +#include "magick/token.h" +#include "magick/transform.h" +#include "magick/utility.h" +#include "coders/bytebuffer-private.h" +#include "coders/ghostscript-private.h" + +/* + Typedef declaractions. +*/ +typedef struct _PSInfo +{ + MagickBooleanType + cmyk; + + SegmentInfo + bounds; + + unsigned long + columns, + rows; + + StringInfo + *icc_profile, + *photoshop_profile, + *xmp_profile; + +} PSInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePSImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P S % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPS() returns MagickTrue if the image format type, identified by the +% magick string, is PS. +% +% The format of the IsPS method is: +% +% MagickBooleanType IsPS(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsPS(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"%!",2) == 0) + return(MagickTrue); + if (memcmp(magick,"\004%!",3) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPSImage() reads a Postscript image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer +% to the new image. +% +% The format of the ReadPSImage method is: +% +% Image *ReadPSImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline int ProfileInteger(MagickByteBuffer *buffer,short int *hex_digits) +{ + int + c, + l, + value; + + ssize_t + i; + + l=0; + value=0; + for (i=0; i < 2; ) + { + c=ReadMagickByteBuffer(buffer); + if ((c == EOF) || ((c == '%') && (l == '%'))) + { + value=(-1); + break; + } + l=c; + c&=0xff; + if (isxdigit(c) == MagickFalse) + continue; + value=(int) ((size_t) value << 4)+hex_digits[c]; + i++; + } + return(value); +} + +static void ReadPSInfo(const ImageInfo *image_info,Image *image,PSInfo *ps_info) +{ +#define BeginDocument "BeginDocument:" +#define EndDocument "EndDocument:" +#define PostscriptLevel "PS-" +#define ImageData "ImageData:" +#define DocumentProcessColors "DocumentProcessColors:" +#define CMYKCustomColor "CMYKCustomColor:" +#define CMYKProcessColor "CMYKProcessColor:" +#define DocumentCustomColors "DocumentCustomColors:" +#define SpotColor "+ " +#define BoundingBox "BoundingBox:" +#define DocumentMedia "DocumentMedia:" +#define HiResBoundingBox "HiResBoundingBox:" +#define PageBoundingBox "PageBoundingBox:" +#define PageMedia "PageMedia:" +#define ICCProfile "BeginICCProfile:" +#define PhotoshopProfile "BeginPhotoshop:" + + char + version[MagickPathExtent]; + + int + c; + + MagickBooleanType + new_line, + skip, + spot_color; + + MagickByteBuffer + buffer; + + char + *p; + + ssize_t + i; + + SegmentInfo + bounds; + + size_t + length; + + ssize_t + count, + priority; + + short int + hex_digits[256]; + + unsigned long + spotcolor; + + (void) memset(&bounds,0,sizeof(bounds)); + (void) memset(ps_info,0,sizeof(*ps_info)); + ps_info->cmyk=image_info->colorspace == CMYKColorspace ? MagickTrue : + MagickFalse; + /* + Initialize hex values. + */ + (void) memset(hex_digits,0,sizeof(hex_digits)); + hex_digits[(int) '0']=0; + hex_digits[(int) '1']=1; + hex_digits[(int) '2']=2; + hex_digits[(int) '3']=3; + hex_digits[(int) '4']=4; + hex_digits[(int) '5']=5; + hex_digits[(int) '6']=6; + hex_digits[(int) '7']=7; + hex_digits[(int) '8']=8; + hex_digits[(int) '9']=9; + hex_digits[(int) 'a']=10; + hex_digits[(int) 'b']=11; + hex_digits[(int) 'c']=12; + hex_digits[(int) 'd']=13; + hex_digits[(int) 'e']=14; + hex_digits[(int) 'f']=15; + hex_digits[(int) 'A']=10; + hex_digits[(int) 'B']=11; + hex_digits[(int) 'C']=12; + hex_digits[(int) 'D']=13; + hex_digits[(int) 'E']=14; + hex_digits[(int) 'F']=15; + priority=0; + *version='\0'; + spotcolor=0; + skip=MagickFalse; + new_line=MagickTrue; + (void) memset(&buffer,0,sizeof(buffer)); + buffer.image=image; + for (c=ReadMagickByteBuffer(&buffer); c != EOF; c=ReadMagickByteBuffer(&buffer)) + { + switch(c) + { + case '<': + { + ReadGhostScriptXMPProfile(&buffer,&ps_info->xmp_profile); + continue; + } + case '\n': + case '\r': + new_line=MagickTrue; + continue; + case '%': + { + if (new_line == MagickFalse) + continue; + new_line=MagickFalse; + c=ReadMagickByteBuffer(&buffer); + if ((c == '%') || (c == '!')) + break; + if (c == 'B') + { + buffer.offset--; + break; + } + continue; + } + default: + continue; + } + /* + Skip %%BeginDocument thru %%EndDocument. + */ + if (CompareMagickByteBuffer(&buffer,BeginDocument,strlen(BeginDocument)) != MagickFalse) + skip=MagickTrue; + if (CompareMagickByteBuffer(&buffer,EndDocument,strlen(EndDocument)) != MagickFalse) + skip=MagickFalse; + if (skip != MagickFalse) + continue; + if ((*version == '\0') && + (CompareMagickByteBuffer(&buffer,PostscriptLevel,strlen(PostscriptLevel)) != MagickFalse)) + { + i=0; + for (c=ReadMagickByteBuffer(&buffer); c != EOF; c=ReadMagickByteBuffer(&buffer)) + { + if ((c == '\r') || (c == '\n') || + ((i+1) == (ssize_t) sizeof(version))) + { + new_line=MagickTrue; + break; + } + version[i++]=(char) c; + } + version[i]='\0'; + if (c == EOF) + break; + } + if (CompareMagickByteBuffer(&buffer,ImageData,strlen(ImageData)) != MagickFalse) + { + p=GetMagickByteBufferDatum(&buffer); + (void) sscanf(p,ImageData " %lu %lu",&ps_info->columns,&ps_info->rows); + } + /* + Is this a CMYK document? + */ + length=strlen(DocumentProcessColors); + if (CompareMagickByteBuffer(&buffer,DocumentProcessColors,length) != MagickFalse) + { + p=GetMagickByteBufferDatum(&buffer); + if ((StringLocateSubstring(p,"Cyan") != (char *) NULL) || + (StringLocateSubstring(p,"Magenta") != (char *) NULL) || + (StringLocateSubstring(p,"Yellow") != (char *) NULL)) + ps_info->cmyk=MagickTrue; + } + if (CompareMagickByteBuffer(&buffer,CMYKCustomColor,strlen(CMYKCustomColor)) != MagickFalse) + ps_info->cmyk=MagickTrue; + if (CompareMagickByteBuffer(&buffer,CMYKProcessColor,strlen(CMYKProcessColor)) != MagickFalse) + ps_info->cmyk=MagickTrue; + spot_color=MagickFalse; + length=strlen(DocumentCustomColors); + if (CompareMagickByteBuffer(&buffer,DocumentCustomColors,length) != MagickFalse) + { + spot_color=MagickTrue; + SkipMagickByteBuffer(&buffer,length+1); + } + if (spot_color == MagickFalse) + { + length=strlen(CMYKCustomColor); + if (CompareMagickByteBuffer(&buffer,CMYKCustomColor,length) != MagickFalse) + { + spot_color=MagickTrue; + SkipMagickByteBuffer(&buffer,length+1); + } + } + if (spot_color == MagickFalse) + { + length=strlen(SpotColor); + if (CompareMagickByteBuffer(&buffer,SpotColor,length) != MagickFalse) + { + spot_color=MagickTrue; + SkipMagickByteBuffer(&buffer,length+1); + } + } + if (spot_color != MagickFalse) + { + char + name[MagickPathExtent], + property[MagickPathExtent], + *value; + + /* + Note spot names. + */ + (void) FormatLocaleString(property,MagickPathExtent, + "pdf:SpotColor-%.20g",(double) spotcolor++); + i=0; + for (c=PeekMagickByteBuffer(&buffer); c != EOF; c=PeekMagickByteBuffer(&buffer)) + { + if ((c == '\r') || (c == '\n') || ((i+1) == MagickPathExtent)) + { + new_line=MagickTrue; + break; + } + name[i++]=(char) ReadMagickByteBuffer(&buffer); + } + name[i]='\0'; + if (c == EOF) + break; + value=ConstantString(name); + (void) StripString(value); + if (*value != '\0') + (void) SetImageProperty(image,property,value); + value=DestroyString(value); + continue; + } + if ((ps_info->icc_profile == (StringInfo *) NULL) && + (CompareMagickByteBuffer(&buffer,ICCProfile,strlen(ICCProfile)) != MagickFalse)) + { + unsigned char + *datum; + + /* + Read ICC profile. + */ + if (SkipMagickByteBufferUntilNewline(&buffer) != MagickFalse) + { + ps_info->icc_profile=AcquireStringInfo(MagickPathExtent); + datum=GetStringInfoDatum(ps_info->icc_profile); + for (i=0; (c=ProfileInteger(&buffer,hex_digits)) != EOF; i++) + { + if (i >= (ssize_t) GetStringInfoLength(ps_info->icc_profile)) + { + SetStringInfoLength(ps_info->icc_profile,(size_t) i << 1); + datum=GetStringInfoDatum(ps_info->icc_profile); + } + datum[i]=(unsigned char) c; + } + SetStringInfoLength(ps_info->icc_profile,(size_t) i+1); + if (c == EOF) + break; + } + continue; + } + if ((ps_info->photoshop_profile == (StringInfo *) NULL) && + (CompareMagickByteBuffer(&buffer,PhotoshopProfile,strlen(PhotoshopProfile)) != MagickFalse)) + { + unsigned long + extent; + + unsigned char + *q; + + /* + Read Photoshop profile. + */ + p=GetMagickByteBufferDatum(&buffer); + extent=0; + count=(ssize_t) sscanf(p,PhotoshopProfile " %lu",&extent); + if ((count != 1) || (extent == 0)) + continue; + if ((MagickSizeType) extent > GetBlobSize(image)) + continue; + length=(size_t) extent; + if (SkipMagickByteBufferUntilNewline(&buffer) != MagickFalse) + { + ps_info->photoshop_profile=AcquireStringInfo(length+1U); + q=GetStringInfoDatum(ps_info->photoshop_profile); + while (extent > 0) + { + c=ProfileInteger(&buffer,hex_digits); + if (c == EOF) + break; + *q++=(unsigned char) c; + extent-=MagickMin(extent,1); + } + SetStringInfoLength(ps_info->photoshop_profile,length); + if (c == EOF) + break; + continue; + } + } + if (image_info->page != (char *) NULL) + continue; + /* + Note region defined by bounding box. + */ + count=0; + i=0; + if (CompareMagickByteBuffer(&buffer,BoundingBox,strlen(BoundingBox)) != MagickFalse) + { + p=GetMagickByteBufferDatum(&buffer); + count=(ssize_t) sscanf(p,BoundingBox " %lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + i=2; + } + if (CompareMagickByteBuffer(&buffer,DocumentMedia,strlen(DocumentMedia)) != MagickFalse) + { + p=GetMagickByteBufferDatum(&buffer); + count=(ssize_t) sscanf(p,DocumentMedia " %lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + i=1; + } + if (CompareMagickByteBuffer(&buffer,HiResBoundingBox,strlen(HiResBoundingBox)) != MagickFalse) + { + p=GetMagickByteBufferDatum(&buffer); + count=(ssize_t) sscanf(p,HiResBoundingBox " %lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + i=3; + } + if (CompareMagickByteBuffer(&buffer,PageBoundingBox,strlen(PageBoundingBox)) != MagickFalse) + { + p=GetMagickByteBufferDatum(&buffer); + count=(ssize_t) sscanf(p,PageBoundingBox " %lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + i=1; + } + if (CompareMagickByteBuffer(&buffer,PageMedia,strlen(PageMedia)) != MagickFalse) + { + p=GetMagickByteBufferDatum(&buffer); + count=(ssize_t) sscanf(p,PageMedia " %lf %lf %lf %lf",&bounds.x1, + &bounds.y1,&bounds.x2,&bounds.y2); + i=1; + } + if ((count != 4) || (i < (ssize_t) priority)) + continue; + if ((fabs(bounds.x2-bounds.x1) <= fabs(ps_info->bounds.x2-ps_info->bounds.x1)) || + (fabs(bounds.y2-bounds.y1) <= fabs(ps_info->bounds.y2-ps_info->bounds.y1))) + if (i == (ssize_t) priority) + continue; + ps_info->bounds=bounds; + priority=i; + } + if (version[0] != '\0') + (void) SetImageProperty(image,"ps:Level",version); +} + +static inline void CleanupPSInfo(PSInfo *pdf_info) +{ + if (pdf_info->icc_profile != (StringInfo *) NULL) + pdf_info->icc_profile=DestroyStringInfo(pdf_info->icc_profile); + if (pdf_info->photoshop_profile != (StringInfo *) NULL) + pdf_info->photoshop_profile=DestroyStringInfo(pdf_info->photoshop_profile); + if (pdf_info->xmp_profile != (StringInfo *) NULL) + pdf_info->xmp_profile=DestroyStringInfo(pdf_info->xmp_profile); +} + +static Image *ReadPSImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + command[MaxTextExtent], + *density, + filename[MaxTextExtent], + geometry[MaxTextExtent], + input_filename[MaxTextExtent], + message[MaxTextExtent], + *options, + postscript_filename[MaxTextExtent]; + + const char + *option; + + const DelegateInfo + *delegate_info; + + GeometryInfo + geometry_info; + + Image + *image, + *next, + *postscript_image; + + ImageInfo + *read_info; + + int + file; + + MagickBooleanType + crop, + fitPage, + status; + + MagickStatusType + flags; + + PointInfo + delta, + resolution; + + PSInfo + info; + + RectangleInfo + page; + + ssize_t + i; + + ssize_t + count; + + unsigned long + scene; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + status=AcquireUniqueSymbolicLink(image_info->filename,input_filename); + if (status == MagickFalse) + { + ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile", + image_info->filename); + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Set the page density. + */ + delta.x=DefaultResolution; + delta.y=DefaultResolution; + if ((image->x_resolution == 0.0) || (image->y_resolution == 0.0)) + { + flags=ParseGeometry(PSDensityGeometry,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + if (image_info->density != (char *) NULL) + { + flags=ParseGeometry(image_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + (void) ParseAbsoluteGeometry(PSPageGeometry,&page); + if (image_info->page != (char *) NULL) + (void) ParseAbsoluteGeometry(image_info->page,&page); + resolution.x=image->x_resolution; + resolution.y=image->y_resolution; + page.width=(size_t) ((ssize_t) ceil((double) (page.width* + resolution.x/delta.x)-0.5)); + page.height=(size_t) ((ssize_t) ceil((double) (page.height* + resolution.y/delta.y)-0.5)); + /* + Determine page geometry from the Postscript bounding box. + */ + ReadPSInfo(image_info,image,&info); + (void) CloseBlob(image); + /* + Set Postscript render geometry. + */ + if ((fabs(info.bounds.x2-info.bounds.x1) >= MagickEpsilon) && + (fabs(info.bounds.y2-info.bounds.y1) >= MagickEpsilon)) + { + (void) FormatLocaleString(geometry,MaxTextExtent,"%gx%g%+.15g%+.15g", + info.bounds.x2-info.bounds.x1,info.bounds.y2-info.bounds.y1, + info.bounds.x1,info.bounds.y1); + (void) SetImageProperty(image,"ps:HiResBoundingBox",geometry); + page.width=(size_t) ((ssize_t) ceil((double) ((info.bounds.x2- + info.bounds.x1)*resolution.x/delta.x)-0.5)); + page.height=(size_t) ((ssize_t) ceil((double) ((info.bounds.y2- + info.bounds.y1)*resolution.y/delta.y)-0.5)); + } + fitPage=MagickFalse; + option=GetImageOption(image_info,"eps:fit-page"); + if (option != (const char *) NULL) + { + char + *geometry; + + MagickStatusType + flags; + + geometry=GetPageGeometry(option); + flags=ParseMetaGeometry(geometry,&page.x,&page.y,&page.width, + &page.height); + if (flags == NoValue) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "InvalidGeometry","`%s'",option); + geometry=DestroyString(geometry); + image=DestroyImage(image); + return((Image *) NULL); + } + page.width=(size_t) ((size_t) ceil((double) (page.width* + image->x_resolution/delta.x)-0.5)); + page.height=(size_t) ((size_t) ceil((double) (page.height* + image->y_resolution/delta.y)-0.5)); + geometry=DestroyString(geometry); + fitPage=MagickTrue; + } + crop=MagickFalse; + if (*image_info->magick == 'E') + { + option=GetImageOption(image_info,"eps:use-cropbox"); + if ((option == (const char *) NULL) || + (IsStringTrue(option) != MagickFalse)) + crop=MagickTrue; + } + if (IssRGBCompatibleColorspace(image_info->colorspace) != MagickFalse) + info.cmyk=MagickFalse; + /* + Create Ghostscript control file. + */ + file=AcquireUniqueFileResource(postscript_filename); + if (file == -1) + { + ThrowFileException(&image->exception,FileOpenError,"UnableToOpenFile", + image_info->filename); + CleanupPSInfo(&info); + image=DestroyImageList(image); + return((Image *) NULL); + } + (void) CopyMagickString(command,"/setpagedevice {pop} bind 1 index where {" + "dup wcheck {3 1 roll put} {pop def} ifelse} {def} ifelse\n", + MaxTextExtent); + count=write(file,command,(unsigned int) strlen(command)); + if (image_info->page == (char *) NULL) + { + char + translate_geometry[MaxTextExtent]; + + (void) FormatLocaleString(translate_geometry,MaxTextExtent, + "%g %g translate\n",-info.bounds.x1,-info.bounds.y1); + count=write(file,translate_geometry,(unsigned int) + strlen(translate_geometry)); + } + (void) count; + file=close(file)-1; + /* + Render Postscript with the Ghostscript delegate. + */ + if (image_info->monochrome != MagickFalse) + delegate_info=GetDelegateInfo("ps:mono",(char *) NULL,exception); + else + if (info.cmyk != MagickFalse) + delegate_info=GetDelegateInfo("ps:cmyk",(char *) NULL,exception); + else + delegate_info=GetDelegateInfo("ps:alpha",(char *) NULL,exception); + if (delegate_info == (const DelegateInfo *) NULL) + { + (void) RelinquishUniqueFileResource(postscript_filename); + CleanupPSInfo(&info); + image=DestroyImageList(image); + return((Image *) NULL); + } + density=AcquireString(""); + options=AcquireString(""); + (void) FormatLocaleString(density,MaxTextExtent,"%gx%g",resolution.x, + resolution.y); + if (crop == MagickFalse) + { + if (image_info->ping != MagickFalse) + (void) FormatLocaleString(density,MagickPathExtent,"2.0x2.0"); + else + (void) FormatLocaleString(options,MaxTextExtent,"-g%.20gx%.20g ", + (double) page.width,(double) page.height); + } + read_info=CloneImageInfo(image_info); + *read_info->magick='\0'; + if (read_info->number_scenes != 0) + { + char + pages[MaxTextExtent]; + + (void) FormatLocaleString(pages,MaxTextExtent,"-dFirstPage=%.20g " + "-dLastPage=%.20g ",(double) read_info->scene+1,(double) + (read_info->scene+read_info->number_scenes)); + (void) ConcatenateMagickString(options,pages,MaxTextExtent); + read_info->number_scenes=0; + if (read_info->scenes != (char *) NULL) + *read_info->scenes='\0'; + } + if (*image_info->magick == 'E') + { + if (crop != MagickFalse) + (void) ConcatenateMagickString(options,"-dEPSCrop ",MaxTextExtent); + if (fitPage != MagickFalse) + (void) ConcatenateMagickString(options,"-dEPSFitPage ",MaxTextExtent); + } + (void) CopyMagickString(filename,read_info->filename,MaxTextExtent); + (void) AcquireUniqueFilename(filename); + (void) RelinquishUniqueFileResource(filename); + (void) ConcatenateMagickString(filename,"%d",MaxTextExtent); + (void) FormatLocaleString(command,MaxTextExtent, + GetDelegateCommands(delegate_info), + read_info->antialias != MagickFalse ? 4 : 1, + read_info->antialias != MagickFalse ? 4 : 1,density,options,filename, + postscript_filename,input_filename); + options=DestroyString(options); + density=DestroyString(density); + *message='\0'; + status=InvokeGhostscriptDelegate(read_info->verbose,command,message, + exception); + (void) InterpretImageFilename(image_info,image,filename,1, + read_info->filename); + if ((status == MagickFalse) || + (IsGhostscriptRendered(read_info->filename) == MagickFalse)) + { + (void) ConcatenateMagickString(command," -c showpage",MaxTextExtent); + status=InvokeGhostscriptDelegate(read_info->verbose,command,message, + exception); + } + (void) RelinquishUniqueFileResource(postscript_filename); + (void) RelinquishUniqueFileResource(input_filename); + postscript_image=(Image *) NULL; + if (status == MagickFalse) + for (i=1; ; i++) + { + (void) InterpretImageFilename(image_info,image,filename,(int) i, + read_info->filename); + if (IsGhostscriptRendered(read_info->filename) == MagickFalse) + break; + (void) RelinquishUniqueFileResource(read_info->filename); + } + else + for (i=1; ; i++) + { + (void) InterpretImageFilename(image_info,image,filename,(int) i, + read_info->filename); + if (IsGhostscriptRendered(read_info->filename) == MagickFalse) + break; + read_info->blob=NULL; + read_info->length=0; + next=ReadImage(read_info,exception); + (void) RelinquishUniqueFileResource(read_info->filename); + if (next == (Image *) NULL) + break; + AppendImageToList(&postscript_image,next); + } + (void) RelinquishUniqueFileResource(read_info->filename); + read_info=DestroyImageInfo(read_info); + if (postscript_image == (Image *) NULL) + { + if (*message != '\0') + (void) ThrowMagickException(exception,GetMagickModule(),DelegateError, + "PostscriptDelegateFailed","`%s'",message); + image=DestroyImageList(image); + return((Image *) NULL); + } + if (LocaleCompare(postscript_image->magick,"BMP") == 0) + { + Image + *cmyk_image; + + cmyk_image=ConsolidateCMYKImages(postscript_image,exception); + if (cmyk_image != (Image *) NULL) + { + postscript_image=DestroyImageList(postscript_image); + postscript_image=cmyk_image; + } + } + if (info.icc_profile != (StringInfo *) NULL) + (void) SetImageProfile(image,"icc",info.icc_profile); + if (info.photoshop_profile != (StringInfo *) NULL) + (void) SetImageProfile(image,"8bim",info.photoshop_profile); + if (info.xmp_profile != (StringInfo *) NULL) + (void) SetImageProfile(image,"xmp",info.xmp_profile); + CleanupPSInfo(&info); + if (image_info->number_scenes != 0) + { + Image + *clone_image; + + ssize_t + i; + + /* + Add place holder images to meet the subimage specification requirement. + */ + for (i=0; i < (ssize_t) image_info->scene; i++) + { + clone_image=CloneImage(postscript_image,1,1,MagickTrue,exception); + if (clone_image != (Image *) NULL) + PrependImageToList(&postscript_image,clone_image); + } + } + do + { + (void) CopyMagickString(postscript_image->filename,filename,MaxTextExtent); + (void) CopyMagickString(postscript_image->magick,image->magick, + MaxTextExtent); + if (info.columns != 0) + postscript_image->magick_columns=info.columns; + if (info.rows != 0) + postscript_image->magick_rows=info.rows; + postscript_image->page=page; + if (image_info->ping != MagickFalse) + { + postscript_image->magick_columns=page.width; + postscript_image->magick_rows=page.height; + postscript_image->columns=page.width; + postscript_image->rows=page.height; + } + (void) CloneImageProfiles(postscript_image,image); + (void) CloneImageProperties(postscript_image,image); + next=SyncNextImageInList(postscript_image); + if (next != (Image *) NULL) + postscript_image=next; + } while (next != (Image *) NULL); + image=DestroyImageList(image); + scene=0; + for (next=GetFirstImageInList(postscript_image); next != (Image *) NULL; ) + { + next->scene=scene++; + next=GetNextImageInList(next); + } + return(GetFirstImageInList(postscript_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPSImage() adds properties for the PS image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPSImage method is: +% +% size_t RegisterPSImage(void) +% +*/ +ModuleExport size_t RegisterPSImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("EPI"); + entry->decoder=(DecodeImageHandler *) ReadPSImage; + entry->encoder=(EncodeImageHandler *) WritePSImage; + entry->magick=(IsImageFormatHandler *) IsPS; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString( + "Encapsulated PostScript Interchange format"); + entry->mime_type=ConstantString("application/postscript"); + entry->magick_module=ConstantString("PS"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("EPS"); + entry->decoder=(DecodeImageHandler *) ReadPSImage; + entry->encoder=(EncodeImageHandler *) WritePSImage; + entry->seekable_stream=MagickTrue; + entry->magick=(IsImageFormatHandler *) IsPS; + entry->adjoin=MagickFalse; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Encapsulated PostScript"); + entry->mime_type=ConstantString("application/postscript"); + entry->magick_module=ConstantString("PS"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("EPSF"); + entry->decoder=(DecodeImageHandler *) ReadPSImage; + entry->encoder=(EncodeImageHandler *) WritePSImage; + entry->seekable_stream=MagickTrue; + entry->magick=(IsImageFormatHandler *) IsPS; + entry->adjoin=MagickFalse; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Encapsulated PostScript"); + entry->mime_type=ConstantString("application/postscript"); + entry->magick_module=ConstantString("PS"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("EPSI"); + entry->decoder=(DecodeImageHandler *) ReadPSImage; + entry->encoder=(EncodeImageHandler *) WritePSImage; + entry->seekable_stream=MagickTrue; + entry->magick=(IsImageFormatHandler *) IsPS; + entry->adjoin=MagickFalse; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString( + "Encapsulated PostScript Interchange format"); + entry->mime_type=ConstantString("application/postscript"); + entry->magick_module=ConstantString("PS"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PS"); + entry->decoder=(DecodeImageHandler *) ReadPSImage; + entry->encoder=(EncodeImageHandler *) WritePSImage; + entry->seekable_stream=MagickTrue; + entry->magick=(IsImageFormatHandler *) IsPS; + entry->mime_type=ConstantString("application/postscript"); + entry->magick_module=ConstantString("PS"); + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("PostScript"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPSImage() removes format registrations made by the +% PS module from the list of supported formats. +% +% The format of the UnregisterPSImage method is: +% +% UnregisterPSImage(void) +% +*/ +ModuleExport void UnregisterPSImage(void) +{ + (void) UnregisterMagickInfo("EPI"); + (void) UnregisterMagickInfo("EPS"); + (void) UnregisterMagickInfo("EPSF"); + (void) UnregisterMagickInfo("EPSI"); + (void) UnregisterMagickInfo("PS"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePSImage translates an image to encapsulated Postscript +% Level I for printing. If the supplied geometry is null, the image is +% centered on the Postscript page. Otherwise, the image is positioned as +% specified by the geometry. +% +% The format of the WritePSImage method is: +% +% MagickBooleanType WritePSImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the image. +% +*/ + +static inline unsigned char *PopHexPixel(const char hex_digits[][3], + const size_t pixel,unsigned char *pixels) +{ + const char + *hex; + + hex=hex_digits[pixel]; + *pixels++=(unsigned char) (*hex++); + *pixels++=(unsigned char) (*hex); + return(pixels); +} + +static MagickBooleanType WritePSImage(const ImageInfo *image_info,Image *image) +{ +#define WriteRunlengthPacket(image,pixel,length,p) \ +{ \ + if ((image->matte != MagickFalse) && (length != 0) &&\ + (GetPixelOpacity(p) == (Quantum) TransparentOpacity)) \ + { \ + q=PopHexPixel(hex_digits,0xff,q); \ + q=PopHexPixel(hex_digits,0xff,q); \ + q=PopHexPixel(hex_digits,0xff,q); \ + } \ + else \ + { \ + q=PopHexPixel(hex_digits,ScaleQuantumToChar(pixel.red),q); \ + q=PopHexPixel(hex_digits,ScaleQuantumToChar(pixel.green),q); \ + q=PopHexPixel(hex_digits,ScaleQuantumToChar(pixel.blue),q); \ + } \ + q=PopHexPixel(hex_digits,(size_t) MagickMin(length,0xff),q); \ +} + + static const char + hex_digits[][3] = + { + "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", + "0C", "0D", "0E", "0F", "10", "11", "12", "13", "14", "15", "16", "17", + "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", "20", "21", "22", "23", + "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", + "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", + "3C", "3D", "3E", "3F", "40", "41", "42", "43", "44", "45", "46", "47", + "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", "50", "51", "52", "53", + "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", + "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", + "6C", "6D", "6E", "6F", "70", "71", "72", "73", "74", "75", "76", "77", + "78", "79", "7A", "7B", "7C", "7D", "7E", "7F", "80", "81", "82", "83", + "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F", + "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", + "9C", "9D", "9E", "9F", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", + "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF", "B0", "B1", "B2", "B3", + "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", + "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", + "CC", "CD", "CE", "CF", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", + "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", "E0", "E1", "E2", "E3", + "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", + "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", + "FC", "FD", "FE", "FF" + }, + PostscriptProlog[] = + "%%BeginProlog\n" + "%\n" + "% Display a color image. The image is displayed in color on\n" + "% Postscript viewers or printers that support color, otherwise\n" + "% it is displayed as grayscale.\n" + "%\n" + "/DirectClassPacket\n" + "{\n" + " %\n" + " % Get a DirectClass packet.\n" + " %\n" + " % Parameters:\n" + " % red.\n" + " % green.\n" + " % blue.\n" + " % length: number of pixels minus one of this color (optional).\n" + " %\n" + " currentfile color_packet readhexstring pop pop\n" + " compression 0 eq\n" + " {\n" + " /number_pixels 3 def\n" + " }\n" + " {\n" + " currentfile byte readhexstring pop 0 get\n" + " /number_pixels exch 1 add 3 mul def\n" + " } ifelse\n" + " 0 3 number_pixels 1 sub\n" + " {\n" + " pixels exch color_packet putinterval\n" + " } for\n" + " pixels 0 number_pixels getinterval\n" + "} bind def\n" + "\n" + "/DirectClassImage\n" + "{\n" + " %\n" + " % Display a DirectClass image.\n" + " %\n" + " systemdict /colorimage known\n" + " {\n" + " columns rows 8\n" + " [\n" + " columns 0 0\n" + " rows neg 0 rows\n" + " ]\n" + " { DirectClassPacket } false 3 colorimage\n" + " }\n" + " {\n" + " %\n" + " % No colorimage operator; convert to grayscale.\n" + " %\n" + " columns rows 8\n" + " [\n" + " columns 0 0\n" + " rows neg 0 rows\n" + " ]\n" + " { GrayDirectClassPacket } image\n" + " } ifelse\n" + "} bind def\n" + "\n" + "/GrayDirectClassPacket\n" + "{\n" + " %\n" + " % Get a DirectClass packet; convert to grayscale.\n" + " %\n" + " % Parameters:\n" + " % red\n" + " % green\n" + " % blue\n" + " % length: number of pixels minus one of this color (optional).\n" + " %\n" + " currentfile color_packet readhexstring pop pop\n" + " color_packet 0 get 0.299 mul\n" + " color_packet 1 get 0.587 mul add\n" + " color_packet 2 get 0.114 mul add\n" + " cvi\n" + " /gray_packet exch def\n" + " compression 0 eq\n" + " {\n" + " /number_pixels 1 def\n" + " }\n" + " {\n" + " currentfile byte readhexstring pop 0 get\n" + " /number_pixels exch 1 add def\n" + " } ifelse\n" + " 0 1 number_pixels 1 sub\n" + " {\n" + " pixels exch gray_packet put\n" + " } for\n" + " pixels 0 number_pixels getinterval\n" + "} bind def\n" + "\n" + "/GrayPseudoClassPacket\n" + "{\n" + " %\n" + " % Get a PseudoClass packet; convert to grayscale.\n" + " %\n" + " % Parameters:\n" + " % index: index into the colormap.\n" + " % length: number of pixels minus one of this color (optional).\n" + " %\n" + " currentfile byte readhexstring pop 0 get\n" + " /offset exch 3 mul def\n" + " /color_packet colormap offset 3 getinterval def\n" + " color_packet 0 get 0.299 mul\n" + " color_packet 1 get 0.587 mul add\n" + " color_packet 2 get 0.114 mul add\n" + " cvi\n" + " /gray_packet exch def\n" + " compression 0 eq\n" + " {\n" + " /number_pixels 1 def\n" + " }\n" + " {\n" + " currentfile byte readhexstring pop 0 get\n" + " /number_pixels exch 1 add def\n" + " } ifelse\n" + " 0 1 number_pixels 1 sub\n" + " {\n" + " pixels exch gray_packet put\n" + " } for\n" + " pixels 0 number_pixels getinterval\n" + "} bind def\n" + "\n" + "/PseudoClassPacket\n" + "{\n" + " %\n" + " % Get a PseudoClass packet.\n" + " %\n" + " % Parameters:\n" + " % index: index into the colormap.\n" + " % length: number of pixels minus one of this color (optional).\n" + " %\n" + " currentfile byte readhexstring pop 0 get\n" + " /offset exch 3 mul def\n" + " /color_packet colormap offset 3 getinterval def\n" + " compression 0 eq\n" + " {\n" + " /number_pixels 3 def\n" + " }\n" + " {\n" + " currentfile byte readhexstring pop 0 get\n" + " /number_pixels exch 1 add 3 mul def\n" + " } ifelse\n" + " 0 3 number_pixels 1 sub\n" + " {\n" + " pixels exch color_packet putinterval\n" + " } for\n" + " pixels 0 number_pixels getinterval\n" + "} bind def\n" + "\n" + "/PseudoClassImage\n" + "{\n" + " %\n" + " % Display a PseudoClass image.\n" + " %\n" + " % Parameters:\n" + " % class: 0-PseudoClass or 1-Grayscale.\n" + " %\n" + " currentfile buffer readline pop\n" + " token pop /class exch def pop\n" + " class 0 gt\n" + " {\n" + " currentfile buffer readline pop\n" + " token pop /depth exch def pop\n" + " /grays columns 8 add depth sub depth mul 8 idiv string def\n" + " columns rows depth\n" + " [\n" + " columns 0 0\n" + " rows neg 0 rows\n" + " ]\n" + " { currentfile grays readhexstring pop } image\n" + " }\n" + " {\n" + " %\n" + " % Parameters:\n" + " % colors: number of colors in the colormap.\n" + " % colormap: red, green, blue color packets.\n" + " %\n" + " currentfile buffer readline pop\n" + " token pop /colors exch def pop\n" + " /colors colors 3 mul def\n" + " /colormap colors string def\n" + " currentfile colormap readhexstring pop pop\n" + " systemdict /colorimage known\n" + " {\n" + " columns rows 8\n" + " [\n" + " columns 0 0\n" + " rows neg 0 rows\n" + " ]\n" + " { PseudoClassPacket } false 3 colorimage\n" + " }\n" + " {\n" + " %\n" + " % No colorimage operator; convert to grayscale.\n" + " %\n" + " columns rows 8\n" + " [\n" + " columns 0 0\n" + " rows neg 0 rows\n" + " ]\n" + " { GrayPseudoClassPacket } image\n" + " } ifelse\n" + " } ifelse\n" + "} bind def\n" + "\n" + "/DisplayImage\n" + "{\n" + " %\n" + " % Display a DirectClass or PseudoClass image.\n" + " %\n" + " % Parameters:\n" + " % x & y translation.\n" + " % x & y scale.\n" + " % label pointsize.\n" + " % image label.\n" + " % image columns & rows.\n" + " % class: 0-DirectClass or 1-PseudoClass.\n" + " % compression: 0-none or 1-RunlengthEncoded.\n" + " % hex color packets.\n" + " %\n" + " gsave\n" + " /buffer 512 string def\n" + " /byte 1 string def\n" + " /color_packet 3 string def\n" + " /pixels 768 string def\n" + "\n" + " currentfile buffer readline pop\n" + " token pop /x exch def\n" + " token pop /y exch def pop\n" + " x y translate\n" + " currentfile buffer readline pop\n" + " token pop /x exch def\n" + " token pop /y exch def pop\n" + " currentfile buffer readline pop\n" + " token pop /pointsize exch def pop\n", + PostscriptEpilog[] = + " x y scale\n" + " currentfile buffer readline pop\n" + " token pop /columns exch def\n" + " token pop /rows exch def pop\n" + " currentfile buffer readline pop\n" + " token pop /class exch def pop\n" + " currentfile buffer readline pop\n" + " token pop /compression exch def pop\n" + " class 0 gt { PseudoClassImage } { DirectClassImage } ifelse\n" + " grestore\n"; + + char + buffer[MaxTextExtent], + date[MaxTextExtent], + **labels, + page_geometry[MaxTextExtent]; + + CompressionType + compression; + + const char + *value; + + const StringInfo + *profile; + + double + pointsize; + + GeometryInfo + geometry_info; + + IndexPacket + index; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + MagickStatusType + flags; + + PixelPacket + pixel; + + PointInfo + delta, + resolution, + scale; + + RectangleInfo + geometry, + media_info, + page_info; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + unsigned char + *q; + + SegmentInfo + bounds; + + size_t + bit, + byte, + imageListLength, + length, + page, + text_size; + + ssize_t + j, + y; + + time_t + timer; + + unsigned char + pixels[2048]; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) memset(&bounds,0,sizeof(bounds)); + compression=image->compression; + if (image_info->compression != UndefinedCompression) + compression=image_info->compression; + page=1; + scene=0; + imageListLength=GetImageListLength(image); + do + { + ImageType + type = UndefinedType; + + /* + Scale relative to dots-per-inch. + */ + if (image->colorspace != CMYKColorspace) + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + delta.x=DefaultResolution; + delta.y=DefaultResolution; + resolution.x=image->x_resolution; + resolution.y=image->y_resolution; + if ((resolution.x == 0.0) || (resolution.y == 0.0)) + { + flags=ParseGeometry(PSDensityGeometry,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + if (image_info->density != (char *) NULL) + { + flags=ParseGeometry(image_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + if (image->units == PixelsPerCentimeterResolution) + { + resolution.x=(double) ((size_t) (100.0*2.54*resolution.x+0.5)/100.0); + resolution.y=(double) ((size_t) (100.0*2.54*resolution.y+0.5)/100.0); + } + SetGeometry(image,&geometry); + (void) FormatLocaleString(page_geometry,MaxTextExtent,"%.20gx%.20g", + (double) image->columns,(double) image->rows); + if (image_info->page != (char *) NULL) + (void) CopyMagickString(page_geometry,image_info->page,MaxTextExtent); + else + if ((image->page.width != 0) && (image->page.height != 0)) + (void) FormatLocaleString(page_geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) image->page.width,(double) + image->page.height,(double) image->page.x,(double) image->page.y); + else + if ((image->gravity != UndefinedGravity) && + (LocaleCompare(image_info->magick,"PS") == 0)) + (void) CopyMagickString(page_geometry,PSPageGeometry,MaxTextExtent); + (void) ConcatenateMagickString(page_geometry,">",MaxTextExtent); + (void) ParseMetaGeometry(page_geometry,&geometry.x,&geometry.y, + &geometry.width,&geometry.height); + scale.x=PerceptibleReciprocal(resolution.x)*geometry.width*delta.x; + geometry.width=(size_t) floor(scale.x+0.5); + scale.y=PerceptibleReciprocal(resolution.y)*geometry.height*delta.y; + geometry.height=(size_t) floor(scale.y+0.5); + (void) ParseAbsoluteGeometry(page_geometry,&media_info); + (void) ParseGravityGeometry(image,page_geometry,&page_info, + &image->exception); + if (image->gravity != UndefinedGravity) + { + geometry.x=(-page_info.x); + geometry.y=(ssize_t) (media_info.height+page_info.y-image->rows); + } + pointsize=12.0; + if (image_info->pointsize != 0.0) + pointsize=image_info->pointsize; + text_size=0; + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + text_size=(size_t) (MultilineCensus(value)*pointsize+12); + if (page == 1) + { + /* + Output Postscript header. + */ + if (LocaleCompare(image_info->magick,"PS") == 0) + (void) CopyMagickString(buffer,"%!PS-Adobe-3.0\n",MaxTextExtent); + else + (void) CopyMagickString(buffer,"%!PS-Adobe-3.0 EPSF-3.0\n", + MaxTextExtent); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"%%Creator: (ImageMagick)\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"%%%%Title: (%s)\n", + image->filename); + (void) WriteBlobString(image,buffer); + timer=GetMagickTime(); + (void) FormatMagickTime(timer,MaxTextExtent,date); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%CreationDate: (%s)\n",date); + (void) WriteBlobString(image,buffer); + bounds.x1=(double) geometry.x; + bounds.y1=(double) geometry.y; + bounds.x2=(double) geometry.x+scale.x; + bounds.y2=(double) geometry.y+(geometry.height+text_size); + if ((image_info->adjoin != MagickFalse) && + (GetNextImageInList(image) != (Image *) NULL)) + (void) CopyMagickString(buffer,"%%%%BoundingBox: (atend)\n", + MaxTextExtent); + else + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BoundingBox: %.20g %.20g %.20g %.20g\n",ceil(bounds.x1-0.5), + ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1, + bounds.x2,bounds.y2); + } + (void) WriteBlobString(image,buffer); + profile=GetImageProfile(image,"8bim"); + if (profile != (StringInfo *) NULL) + { + /* + Embed Photoshop profile. + */ + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%BeginPhotoshop: %.20g",(double) GetStringInfoLength(profile)); + (void) WriteBlobString(image,buffer); + for (i=0; i < (ssize_t) GetStringInfoLength(profile); i++) + { + if ((i % 32) == 0) + (void) WriteBlobString(image,"\n% "); + (void) FormatLocaleString(buffer,MaxTextExtent,"%02X", + (unsigned int) (GetStringInfoDatum(profile)[i] & 0xff)); + (void) WriteBlobString(image,buffer); + } + (void) WriteBlobString(image,"\n%EndPhotoshop\n"); + } + profile=GetImageProfile(image,"xmp"); + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + (void) WriteBlobString(image, + "%%DocumentNeededResources: font Times-Roman\n"); + (void) WriteBlobString(image,"%%DocumentData: Clean7Bit\n"); + (void) WriteBlobString(image,"%%LanguageLevel: 1\n"); + if (LocaleCompare(image_info->magick,"PS") != 0) + (void) WriteBlobString(image,"%%Pages: 1\n"); + else + { + /* + Compute the number of pages. + */ + (void) WriteBlobString(image,"%%Orientation: Portrait\n"); + (void) WriteBlobString(image,"%%PageOrder: Ascend\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"%%%%Pages: %.20g\n", + image_info->adjoin != MagickFalse ? (double) + GetImageListLength(image) : 1.0); + (void) WriteBlobString(image,buffer); + } + (void) WriteBlobString(image,"%%EndComments\n"); + (void) WriteBlobString(image,"\n%%BeginDefaults\n"); + (void) WriteBlobString(image,"%%EndDefaults\n\n"); + if ((LocaleCompare(image_info->magick,"EPI") == 0) || + (LocaleCompare(image_info->magick,"EPSI") == 0) || + (LocaleCompare(image_info->magick,"EPT") == 0)) + { + Image + *preview_image; + + Quantum + pixel; + + ssize_t + x; + + ssize_t + y; + + /* + Create preview image. + */ + preview_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (preview_image == (Image *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Dump image as bitmap. + */ + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BeginPreview: %.20g %.20g %.20g %.20g\n%% ",(double) + preview_image->columns,(double) preview_image->rows,1.0, + (double) ((((preview_image->columns+7) >> 3)*preview_image->rows+ + 35)/36)); + (void) WriteBlobString(image,buffer); + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(preview_image,0,y,preview_image->columns,1, + &preview_image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(preview_image); + bit=0; + byte=0; + for (x=0; x < (ssize_t) preview_image->columns; x++) + { + byte<<=1; + pixel=ClampToQuantum(GetPixelLuma(image,p)); + if (pixel >= (Quantum) (QuantumRange/2)) + byte|=0x01; + bit++; + if (bit == 8) + { + q=PopHexPixel(hex_digits,byte,q); + if ((q-pixels+8) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + (void) WriteBlobString(image,"% "); + }; + bit=0; + byte=0; + } + } + if (bit != 0) + { + byte<<=(8-bit); + q=PopHexPixel(hex_digits,byte,q); + if ((q-pixels+8) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + (void) WriteBlobString(image,"% "); + }; + }; + } + if (q != pixels) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + } + (void) WriteBlobString(image,"\n%%EndPreview\n"); + preview_image=DestroyImage(preview_image); + } + /* + Output Postscript commands. + */ + (void) WriteBlob(image,sizeof(PostscriptProlog)-1, + (const unsigned char *) PostscriptProlog); + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + { + (void) WriteBlobString(image, + " /Times-Roman findfont pointsize scalefont setfont\n"); + for (j=(ssize_t) MultilineCensus(value)-1; j >= 0; j--) + { + (void) WriteBlobString(image," /label 512 string def\n"); + (void) WriteBlobString(image, + " currentfile label readline pop\n"); + (void) FormatLocaleString(buffer,MaxTextExtent, + " 0 y %g add moveto label show pop\n",j*pointsize+12); + (void) WriteBlobString(image,buffer); + } + } + (void) WriteBlob(image,sizeof(PostscriptEpilog)-1, + (const unsigned char *) PostscriptEpilog); + if (LocaleCompare(image_info->magick,"PS") == 0) + (void) WriteBlobString(image," showpage\n"); + (void) WriteBlobString(image,"} bind def\n"); + (void) WriteBlobString(image,"%%EndProlog\n"); + } + (void) FormatLocaleString(buffer,MaxTextExtent,"%%%%Page: 1 %.20g\n", + (double) (page++)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%PageBoundingBox: %.20g %.20g %.20g %.20g\n",(double) geometry.x, + (double) geometry.y,geometry.x+(double) geometry.width,geometry.y+(double) + (geometry.height+text_size)); + (void) WriteBlobString(image,buffer); + if ((double) geometry.x < bounds.x1) + bounds.x1=(double) geometry.x; + if ((double) geometry.y < bounds.y1) + bounds.y1=(double) geometry.y; + if ((double) (geometry.x+geometry.width-1) > bounds.x2) + bounds.x2=(double) geometry.x+geometry.width-1; + if ((double) (geometry.y+(geometry.height+text_size)-1) > bounds.y2) + bounds.y2=(double) geometry.y+(geometry.height+text_size)-1; + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + (void) WriteBlobString(image,"%%%%PageResources: font Times-Roman\n"); + if (LocaleCompare(image_info->magick,"PS") != 0) + (void) WriteBlobString(image,"userdict begin\n"); + (void) WriteBlobString(image,"DisplayImage\n"); + /* + Output image data. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g\n%g %g\n%g\n", + (double) geometry.x,(double) geometry.y,scale.x,scale.y,pointsize); + (void) WriteBlobString(image,buffer); + labels=(char **) NULL; + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + labels=StringToList(value); + if (labels != (char **) NULL) + { + for (i=0; labels[i] != (char *) NULL; i++) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%s \n",labels[i]); + (void) WriteBlobString(image,buffer); + labels[i]=DestroyString(labels[i]); + } + labels=(char **) RelinquishMagickMemory(labels); + } + (void) memset(&pixel,0,sizeof(pixel)); + pixel.opacity=(Quantum) TransparentOpacity; + index=(IndexPacket) 0; + x=0; + if (image_info->type != TrueColorType) + type=IdentifyImageType(image,&image->exception); + if ((type == GrayscaleType) || (type == BilevelType)) + { + if (type == GrayscaleType) + { + Quantum + pixel; + + /* + Dump image as grayscale. + */ + (void) FormatLocaleString(buffer,MaxTextExtent, + "%.20g %.20g\n1\n1\n1\n8\n",(double) image->columns,(double) + image->rows); + (void) WriteBlobString(image,buffer); + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=(Quantum) ScaleQuantumToChar(ClampToQuantum( + GetPixelLuma(image,p))); + q=PopHexPixel(hex_digits,(size_t) pixel,q); + if ((q-pixels+8) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + if (q != pixels) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + } + } + else + { + ssize_t + y; + + Quantum + pixel; + + /* + Dump image as bitmap. + */ + (void) FormatLocaleString(buffer,MaxTextExtent, + "%.20g %.20g\n1\n1\n1\n1\n",(double) image->columns,(double) + image->rows); + (void) WriteBlobString(image,buffer); + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte<<=1; + pixel=ClampToQuantum(GetPixelLuma(image,p)); + if (pixel >= (Quantum) (QuantumRange/2)) + byte|=0x01; + bit++; + if (bit == 8) + { + q=PopHexPixel(hex_digits,byte,q); + if ((q-pixels+2) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + }; + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + { + byte<<=(8-bit); + q=PopHexPixel(hex_digits,byte,q); + if ((q-pixels+2) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + }; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + if (q != pixels) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + } + } + } + else + if ((image->storage_class == DirectClass) || + (image->colors > 256) || (image->matte != MagickFalse)) + { + /* + Dump DirectClass image. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g\n0\n%d\n", + (double) image->columns,(double) image->rows, + compression == RLECompression ? 1 : 0); + (void) WriteBlobString(image,buffer); + switch (compression) + { + case RLECompression: + { + /* + Dump runlength-encoded DirectColor packets. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + pixel=(*p); + length=255; + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((GetPixelRed(p) == pixel.red) && + (GetPixelGreen(p) == pixel.green) && + (GetPixelBlue(p) == pixel.blue) && + (GetPixelOpacity(p) == pixel.opacity) && + (length < 255) && (x < (ssize_t) (image->columns-1))) + length++; + else + { + if (x > 0) + { + WriteRunlengthPacket(image,pixel,length,p); + if ((q-pixels+10) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + } + length=0; + } + pixel=(*p); + p++; + } + WriteRunlengthPacket(image,pixel,length,p); + if ((q-pixels+10) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag, + (MagickOffsetType) y,image->rows); + if (status == MagickFalse) + break; + } + } + if (q != pixels) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + } + break; + } + case NoCompression: + default: + { + /* + Dump uncompressed DirectColor packets. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((image->matte != MagickFalse) && + (GetPixelOpacity(p) == (Quantum) TransparentOpacity)) + { + q=PopHexPixel(hex_digits,0xff,q); + q=PopHexPixel(hex_digits,0xff,q); + q=PopHexPixel(hex_digits,0xff,q); + } + else + { + q=PopHexPixel(hex_digits,ScaleQuantumToChar( + GetPixelRed(p)),q); + q=PopHexPixel(hex_digits,ScaleQuantumToChar( + GetPixelGreen(p)),q); + q=PopHexPixel(hex_digits,ScaleQuantumToChar( + GetPixelBlue(p)),q); + } + if ((q-pixels+6) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag, + (MagickOffsetType) y,image->rows); + if (status == MagickFalse) + break; + } + } + if (q != pixels) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + } + break; + } + } + (void) WriteBlobByte(image,'\n'); + } + else + { + /* + Dump PseudoClass image. + */ + (void) FormatLocaleString(buffer,MaxTextExtent, + "%.20g %.20g\n%d\n%d\n0\n",(double) image->columns,(double) + image->rows,image->storage_class == PseudoClass ? 1 : 0, + compression == RLECompression ? 1 : 0); + (void) WriteBlobString(image,buffer); + /* + Dump number of colors and colormap. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) + image->colors); + (void) WriteBlobString(image,buffer); + for (i=0; i < (ssize_t) image->colors; i++) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%02X%02X%02X\n", + ScaleQuantumToChar(image->colormap[i].red), + ScaleQuantumToChar(image->colormap[i].green), + ScaleQuantumToChar(image->colormap[i].blue)); + (void) WriteBlobString(image,buffer); + } + switch (compression) + { + case RLECompression: + { + /* + Dump runlength-encoded PseudoColor packets. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + index=GetPixelIndex(indexes); + length=255; + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((index == GetPixelIndex(indexes+x)) && + (length < 255) && (x < ((ssize_t) image->columns-1))) + length++; + else + { + if (x > 0) + { + q=PopHexPixel(hex_digits,(size_t) index,q); + q=PopHexPixel(hex_digits,(size_t) + MagickMin(length,0xff),q); + i++; + if ((q-pixels+6) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + } + length=0; + } + index=GetPixelIndex(indexes+x); + pixel.red=GetPixelRed(p); + pixel.green=GetPixelGreen(p); + pixel.blue=GetPixelBlue(p); + pixel.opacity=GetPixelOpacity(p); + p++; + } + q=PopHexPixel(hex_digits,(size_t) index,q); + q=PopHexPixel(hex_digits,(size_t) MagickMin(length,0xff),q); + if ((q-pixels+6) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag, + (MagickOffsetType) y,image->rows); + if (status == MagickFalse) + break; + } + } + if (q != pixels) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + } + break; + } + case NoCompression: + default: + { + /* + Dump uncompressed PseudoColor packets. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + q=PopHexPixel(hex_digits,(size_t) GetPixelIndex( + indexes+x),q); + if ((q-pixels+4) >= 80) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + q=pixels; + } + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag, + (MagickOffsetType) y,image->rows); + if (status == MagickFalse) + break; + } + } + if (q != pixels) + { + *q++='\n'; + (void) WriteBlob(image,q-pixels,pixels); + } + break; + } + } + (void) WriteBlobByte(image,'\n'); + } + if (LocaleCompare(image_info->magick,"PS") != 0) + (void) WriteBlobString(image,"end\n"); + (void) WriteBlobString(image,"%%PageTrailer\n"); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) WriteBlobString(image,"%%Trailer\n"); + if (page > 2) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BoundingBox: %.20g %.20g %.20g %.20g\n",ceil(bounds.x1-0.5), + ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1, + bounds.x2,bounds.y2); + (void) WriteBlobString(image,buffer); + } + (void) WriteBlobString(image,"%%EOF\n"); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/ps2.c b/ImageMagick-6.9.12-44/coders/ps2.c new file mode 100644 index 0000000..f921166 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/ps2.c @@ -0,0 +1,1134 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP SSSSS 22222 % +% P P SS 22 % +% PPPP SSS 222 % +% P SS 22 % +% P SSSSS 22222 % +% % +% % +% Write Postscript Level II Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/compress.h" +#include "magick/constitute.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/timer-private.h" +#include "magick/utility.h" + +/* + Define declarations. +*/ +#if defined(MAGICKCORE_TIFF_DELEGATE) +#define CCITTParam "-1" +#else +#define CCITTParam "0" +#endif + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePS2Image(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P S 2 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPS2Image() adds properties for the PS2 image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPS2Image method is: +% +% size_t RegisterPS2Image(void) +% +*/ +ModuleExport size_t RegisterPS2Image(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("EPS2"); + entry->encoder=(EncodeImageHandler *) WritePS2Image; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->description=ConstantString("Level II Encapsulated PostScript"); + entry->mime_type=ConstantString("application/postscript"); + entry->magick_module=ConstantString("PS2"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PS2"); + entry->encoder=(EncodeImageHandler *) WritePS2Image; + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + entry->description=ConstantString("Level II PostScript"); + entry->mime_type=ConstantString("application/postscript"); + entry->magick_module=ConstantString("PS2"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P S 2 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPS2Image() removes format registrations made by the +% PS2 module from the list of supported formats. +% +% The format of the UnregisterPS2Image method is: +% +% UnregisterPS2Image(void) +% +*/ +ModuleExport void UnregisterPS2Image(void) +{ + (void) UnregisterMagickInfo("EPS2"); + (void) UnregisterMagickInfo("PS2"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P S 2 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePS2Image translates an image to encapsulated Postscript +% Level II for printing. If the supplied geometry is null, the image is +% centered on the Postscript page. Otherwise, the image is positioned as +% specified by the geometry. +% +% The format of the WritePS2Image method is: +% +% MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the image. +% +*/ + +static MagickBooleanType Huffman2DEncodeImage(const ImageInfo *image_info, + Image *image,Image *inject_image) +{ + Image + *group4_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + size_t + length; + + unsigned char + *group4; + + group4_image=CloneImage(inject_image,0,0,MagickTrue,&image->exception); + if (group4_image == (Image *) NULL) + return(MagickFalse); + write_info=CloneImageInfo(image_info); + (void) CopyMagickString(write_info->filename,"GROUP4:",MaxTextExtent); + (void) CopyMagickString(write_info->magick,"GROUP4",MaxTextExtent); + group4=(unsigned char *) ImageToBlob(write_info,group4_image,&length, + &image->exception); + write_info=DestroyImageInfo(write_info); + group4_image=DestroyImage(group4_image); + if (group4 == (unsigned char *) NULL) + return(MagickFalse); + status=MagickTrue; + if (WriteBlob(image,length,group4) != (ssize_t) length) + status=MagickFalse; + group4=(unsigned char *) RelinquishMagickMemory(group4); + return(status); +} + +static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) +{ + static const char + PostscriptProlog[] = + "%%%%BeginProlog\n" + "%%\n" + "%% Display a color image. The image is displayed in color on\n" + "%% Postscript viewers or printers that support color, otherwise\n" + "%% it is displayed as grayscale.\n" + "%%\n" + "/DirectClassImage\n" + "{\n" + " %%\n" + " %% Display a DirectClass image.\n" + " %%\n" + " colorspace 0 eq\n" + " {\n" + " /DeviceRGB setcolorspace\n" + " <<\n" + " /ImageType 1\n" + " /Width columns\n" + " /Height rows\n" + " /BitsPerComponent 8\n" + " /Decode [0 1 0 1 0 1]\n" + " /ImageMatrix [columns 0 0 rows neg 0 rows]\n" + " compression 0 gt\n" + " { /DataSource pixel_stream %s }\n" + " { /DataSource pixel_stream %s } ifelse\n" + " >> image\n" + " }\n" + " {\n" + " /DeviceCMYK setcolorspace\n" + " <<\n" + " /ImageType 1\n" + " /Width columns\n" + " /Height rows\n" + " /BitsPerComponent 8\n" + " /Decode [1 0 1 0 1 0 1 0]\n" + " /ImageMatrix [columns 0 0 rows neg 0 rows]\n" + " compression 0 gt\n" + " { /DataSource pixel_stream %s }\n" + " { /DataSource pixel_stream %s } ifelse\n" + " >> image\n" + " } ifelse\n" + "} bind def\n" + "\n" + "/PseudoClassImage\n" + "{\n" + " %%\n" + " %% Display a PseudoClass image.\n" + " %%\n" + " %% Parameters:\n" + " %% colors: number of colors in the colormap.\n" + " %%\n" + " currentfile buffer readline pop\n" + " token pop /colors exch def pop\n" + " colors 0 eq\n" + " {\n" + " %%\n" + " %% Image is grayscale.\n" + " %%\n" + " currentfile buffer readline pop\n" + " token pop /bits exch def pop\n" + " /DeviceGray setcolorspace\n" + " <<\n" + " /ImageType 1\n" + " /Width columns\n" + " /Height rows\n" + " /BitsPerComponent bits\n" + " /Decode [0 1]\n" + " /ImageMatrix [columns 0 0 rows neg 0 rows]\n" + " compression 0 gt\n" + " { /DataSource pixel_stream %s }\n" + " {\n" + " /DataSource pixel_stream %s\n" + " <<\n" + " /K " CCITTParam "\n" + " /Columns columns\n" + " /Rows rows\n" + " >> /CCITTFaxDecode filter\n" + " } ifelse\n" + " >> image\n" + " }\n" + " {\n" + " %%\n" + " %% Parameters:\n" + " %% colormap: red, green, blue color packets.\n" + " %%\n" + " /colormap colors 3 mul string def\n" + " currentfile colormap readhexstring pop pop\n" + " currentfile buffer readline pop\n" + " [ /Indexed /DeviceRGB colors 1 sub colormap ] setcolorspace\n" + " <<\n" + " /ImageType 1\n" + " /Width columns\n" + " /Height rows\n" + " /BitsPerComponent 8\n" + " /Decode [0 255]\n" + " /ImageMatrix [columns 0 0 rows neg 0 rows]\n" + " compression 0 gt\n" + " { /DataSource pixel_stream %s }\n" + " { /DataSource pixel_stream %s } ifelse\n" + " >> image\n" + " } ifelse\n" + "} bind def\n" + "\n" + "/DisplayImage\n" + "{\n" + " %%\n" + " %% Display a DirectClass or PseudoClass image.\n" + " %%\n" + " %% Parameters:\n" + " %% x & y translation.\n" + " %% x & y scale.\n" + " %% label pointsize.\n" + " %% image label.\n" + " %% image columns & rows.\n" + " %% class: 0-DirectClass or 1-PseudoClass.\n" + " %% colorspace: 0-RGB or 1-CMYK.\n" + " %% compression: 0-RLECompression or 1-NoCompression.\n" + " %% hex color packets.\n" + " %%\n" + " gsave\n" + " /buffer 512 string def\n" + " /pixel_stream currentfile def\n" + "\n" + " currentfile buffer readline pop\n" + " token pop /x exch def\n" + " token pop /y exch def pop\n" + " x y translate\n" + " currentfile buffer readline pop\n" + " token pop /x exch def\n" + " token pop /y exch def pop\n" + " currentfile buffer readline pop\n" + " token pop /pointsize exch def pop\n", + PostscriptEpilog[] = + " x y scale\n" + " currentfile buffer readline pop\n" + " token pop /columns exch def\n" + " token pop /rows exch def pop\n" + " currentfile buffer readline pop\n" + " token pop /class exch def pop\n" + " currentfile buffer readline pop\n" + " token pop /colorspace exch def pop\n" + " currentfile buffer readline pop\n" + " token pop /compression exch def pop\n" + " class 0 gt { PseudoClassImage } { DirectClassImage } ifelse\n" + " grestore\n"; + + char + buffer[MaxTextExtent], + date[MaxTextExtent], + page_geometry[MaxTextExtent], + **labels; + + CompressionType + compression; + + const char + *filter, + *value; + + double + pointsize; + + GeometryInfo + geometry_info; + + MagickOffsetType + scene, + start, + stop; + + MagickBooleanType + progress, + status; + + MagickOffsetType + offset; + + MagickSizeType + number_pixels; + + MagickStatusType + flags; + + PointInfo + delta, + resolution, + scale; + + RectangleInfo + geometry, + media_info, + page_info; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + i; + + SegmentInfo + bounds; + + size_t + imageListLength, + length, + page, + text_size; + + ssize_t + j, + y; + + time_t + timer; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + compression=image->compression; + if (image_info->compression != UndefinedCompression) + compression=image_info->compression; + switch (compression) + { +#if !defined(MAGICKCORE_JPEG_DELEGATE) + case JPEGCompression: + { + compression=RLECompression; + (void) ThrowMagickException(&image->exception,GetMagickModule(), + MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","`%s' (JPEG)", + image->filename); + break; + } +#endif + default: + break; + } + (void) memset(&bounds,0,sizeof(bounds)); + page=1; + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Scale relative to dots-per-inch. + */ + delta.x=DefaultResolution; + delta.y=DefaultResolution; + resolution.x=image->x_resolution; + resolution.y=image->y_resolution; + if ((resolution.x == 0.0) || (resolution.y == 0.0)) + { + flags=ParseGeometry(PSDensityGeometry,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + if (image_info->density != (char *) NULL) + { + flags=ParseGeometry(image_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + if (image->units == PixelsPerCentimeterResolution) + { + resolution.x=(100.0*2.54*resolution.x+0.5)/100.0; + resolution.y=(100.0*2.54*resolution.y+0.5)/100.0; + } + SetGeometry(image,&geometry); + (void) FormatLocaleString(page_geometry,MaxTextExtent,"%.20gx%.20g", + (double) image->columns,(double) image->rows); + if (image_info->page != (char *) NULL) + (void) CopyMagickString(page_geometry,image_info->page,MaxTextExtent); + else + if ((image->page.width != 0) && (image->page.height != 0)) + (void) FormatLocaleString(page_geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) image->page.width,(double) + image->page.height,(double) image->page.x,(double) image->page.y); + else + if ((image->gravity != UndefinedGravity) && + (LocaleCompare(image_info->magick,"PS") == 0)) + (void) CopyMagickString(page_geometry,PSPageGeometry,MaxTextExtent); + (void) ConcatenateMagickString(page_geometry,">",MaxTextExtent); + (void) ParseMetaGeometry(page_geometry,&geometry.x,&geometry.y, + &geometry.width,&geometry.height); + scale.x=PerceptibleReciprocal(resolution.x)*geometry.width*delta.x; + geometry.width=(size_t) floor(scale.x+0.5); + scale.y=PerceptibleReciprocal(resolution.y)*geometry.height*delta.y; + geometry.height=(size_t) floor(scale.y+0.5); + (void) ParseAbsoluteGeometry(page_geometry,&media_info); + (void) ParseGravityGeometry(image,page_geometry,&page_info, + &image->exception); + if (image->gravity != UndefinedGravity) + { + geometry.x=(-page_info.x); + geometry.y=(ssize_t) (media_info.height+page_info.y-image->rows); + } + pointsize=12.0; + if (image_info->pointsize != 0.0) + pointsize=image_info->pointsize; + text_size=0; + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + text_size=(size_t) (MultilineCensus(value)*pointsize+12); + if (page == 1) + { + /* + Output Postscript header. + */ + if (LocaleCompare(image_info->magick,"PS2") == 0) + (void) CopyMagickString(buffer,"%!PS-Adobe-3.0\n",MaxTextExtent); + else + (void) CopyMagickString(buffer,"%!PS-Adobe-3.0 EPSF-3.0\n", + MaxTextExtent); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"%%Creator: (ImageMagick)\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"%%%%Title: (%s)\n", + image->filename); + (void) WriteBlobString(image,buffer); + timer=GetMagickTime(); + (void) FormatMagickTime(timer,MaxTextExtent,date); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%CreationDate: (%s)\n",date); + (void) WriteBlobString(image,buffer); + bounds.x1=(double) geometry.x; + bounds.y1=(double) geometry.y; + bounds.x2=(double) geometry.x+geometry.width; + bounds.y2=(double) geometry.y+geometry.height+text_size; + if ((image_info->adjoin != MagickFalse) && + (GetNextImageInList(image) != (Image *) NULL)) + (void) CopyMagickString(buffer,"%%BoundingBox: (atend)\n", + MaxTextExtent); + else + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BoundingBox: %.20g %.20g %.20g %.20g\n",ceil(bounds.x1-0.5), + ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1, + bounds.y1,bounds.x2,bounds.y2); + } + (void) WriteBlobString(image,buffer); + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + (void) WriteBlobString(image, + "%%DocumentNeededResources: font Helvetica\n"); + (void) WriteBlobString(image,"%%LanguageLevel: 2\n"); + if (LocaleCompare(image_info->magick,"PS2") != 0) + (void) WriteBlobString(image,"%%Pages: 1\n"); + else + { + (void) WriteBlobString(image,"%%Orientation: Portrait\n"); + (void) WriteBlobString(image,"%%PageOrder: Ascend\n"); + if (image_info->adjoin == MagickFalse) + (void) CopyMagickString(buffer,"%%Pages: 1\n",MaxTextExtent); + else + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%Pages: %.20g\n",(double) GetImageListLength(image)); + (void) WriteBlobString(image,buffer); + } + if (image->colorspace == CMYKColorspace) + (void) WriteBlobString(image, + "%%DocumentProcessColors: Cyan Magenta Yellow Black\n"); + (void) WriteBlobString(image,"%%EndComments\n"); + (void) WriteBlobString(image,"\n%%BeginDefaults\n"); + (void) WriteBlobString(image,"%%EndDefaults\n\n"); + /* + Output Postscript commands. + */ + switch (compression) + { + case NoCompression: + { + filter="/ASCII85Decode filter"; + break; + } + case JPEGCompression: + { + filter="/DCTDecode filter"; + break; + } + case LZWCompression: + { + filter="/LZWDecode filter"; + break; + } + case FaxCompression: + case Group4Compression: + { + filter=" "; + break; + } + default: + { + filter="/RunLengthDecode filter"; + break; + } + } + (void) FormatLocaleString(buffer,MagickPathExtent,PostscriptProlog, + filter,filter,filter,filter,filter,filter,filter,filter); + (void) WriteBlob(image,strlen(buffer),(const unsigned char *) buffer); + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + { + (void) WriteBlobString(image, + " /Helvetica findfont pointsize scalefont setfont\n"); + for (j=(ssize_t) MultilineCensus(value)-1; j >= 0; j--) + { + (void) WriteBlobString(image," /label 512 string def\n"); + (void) WriteBlobString(image, + " currentfile label readline pop\n"); + (void) FormatLocaleString(buffer,MaxTextExtent, + " 0 y %g add moveto label show pop\n",j*pointsize+12); + (void) WriteBlobString(image,buffer); + } + } + (void) WriteBlob(image,sizeof(PostscriptEpilog)-1, + (const unsigned char *) PostscriptEpilog); + if (LocaleCompare(image_info->magick,"PS2") == 0) + (void) WriteBlobString(image," showpage\n"); + (void) WriteBlobString(image,"} bind def\n"); + (void) WriteBlobString(image,"%%EndProlog\n"); + } + (void) FormatLocaleString(buffer,MaxTextExtent,"%%%%Page: 1 %.20g\n", + (double) page++); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%PageBoundingBox: %.20g %.20g %.20g %.20g\n",(double) geometry.x, + (double) geometry.y,geometry.x+(double) geometry.width,geometry.y+(double) + (geometry.height+text_size)); + (void) WriteBlobString(image,buffer); + if ((double) geometry.x < bounds.x1) + bounds.x1=(double) geometry.x; + if ((double) geometry.y < bounds.y1) + bounds.y1=(double) geometry.y; + if ((double) (geometry.x+geometry.width-1) > bounds.x2) + bounds.x2=(double) geometry.x+geometry.width-1; + if ((double) (geometry.y+(geometry.height+text_size)-1) > bounds.y2) + bounds.y2=(double) geometry.y+(geometry.height+text_size)-1; + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + (void) WriteBlobString(image,"%%PageResources: font Helvetica\n"); + if (LocaleCompare(image_info->magick,"PS2") != 0) + (void) WriteBlobString(image,"userdict begin\n"); + start=TellBlob(image); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BeginData:%13ld %s Bytes\n",0L, + compression == NoCompression ? "ASCII" : "Binary"); + (void) WriteBlobString(image,buffer); + stop=TellBlob(image); + (void) WriteBlobString(image,"DisplayImage\n"); + /* + Output image data. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g\n%g %g\n%g\n", + (double) geometry.x,(double) geometry.y,scale.x,scale.y,pointsize); + (void) WriteBlobString(image,buffer); + labels=(char **) NULL; + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + labels=StringToList(value); + if (labels != (char **) NULL) + { + for (i=0; labels[i] != (char *) NULL; i++) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%s \n", + labels[i]); + (void) WriteBlobString(image,buffer); + labels[i]=DestroyString(labels[i]); + } + labels=(char **) RelinquishMagickMemory(labels); + } + number_pixels=(MagickSizeType) image->columns*image->rows; + if (number_pixels != (MagickSizeType) ((size_t) number_pixels)) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + if ((compression == FaxCompression) || (compression == Group4Compression) || + ((image_info->type != TrueColorType) && + (SetImageGray(image,&image->exception) != MagickFalse))) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g\n1\n%d\n", + (double) image->columns,(double) image->rows,(int) + (image->colorspace == CMYKColorspace)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%d\n", + (int) ((compression != FaxCompression) && + (compression != Group4Compression))); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"0\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"%d\n", + (compression == FaxCompression) || + (compression == Group4Compression) ? 1 : 8); + (void) WriteBlobString(image,buffer); + switch (compression) + { + case FaxCompression: + case Group4Compression: + { + if (LocaleCompare(CCITTParam,"0") == 0) + { + (void) HuffmanEncodeImage(image_info,image,image); + break; + } + (void) Huffman2DEncodeImage(image_info,image,image); + break; + } + case JPEGCompression: + { + status=InjectImageBlob(image_info,image,image,"jpeg", + &image->exception); + if (status == MagickFalse) + ThrowWriterException(CoderError,image->exception.reason); + break; + } + case RLECompression: + default: + { + MemoryInfo + *pixel_info; + + unsigned char + *q; + + /* + Allocate pixel array. + */ + length=(size_t) number_pixels; + pixel_info=AcquireVirtualMemory(length,sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Dump runlength encoded pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(ClampToQuantum( + GetPixelLuma(image,p))); + p++; + } + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (progress == MagickFalse) + break; + } + length=(size_t) (q-pixels); + if (compression == LZWCompression) + status=LZWEncodeImage(image,length,pixels); + else + status=PackbitsEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (status == MagickFalse) + { + (void) CloseBlob(image); + return(MagickFalse); + } + break; + } + case NoCompression: + { + /* + Dump uncompressed PseudoColor packets. + */ + Ascii85Initialize(image); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + Ascii85Encode(image,ScaleQuantumToChar(ClampToQuantum( + GetPixelLuma(image,p)))); + p++; + } + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (progress == MagickFalse) + break; + } + Ascii85Flush(image); + break; + } + } + } + else + if ((image->storage_class == DirectClass) || (image->colors > 256) || + (compression == JPEGCompression) || (image->matte != MagickFalse)) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g\n0\n%d\n", + (double) image->columns,(double) image->rows,(int) + (image->colorspace == CMYKColorspace)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%d\n", + (int) (compression == NoCompression)); + (void) WriteBlobString(image,buffer); + switch (compression) + { + case JPEGCompression: + { + status=InjectImageBlob(image_info,image,image,"jpeg", + &image->exception); + if (status == MagickFalse) + ThrowWriterException(CoderError,image->exception.reason); + break; + } + case RLECompression: + default: + { + MemoryInfo + *pixel_info; + + unsigned char + *q; + + /* + Allocate pixel array. + */ + length=(size_t) number_pixels; + pixel_info=AcquireVirtualMemory(length,4*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError, + "MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Dump runlength encoded pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((image->matte != MagickFalse) && + (GetPixelOpacity(p) == (Quantum) TransparentOpacity)) + { + *q++=ScaleQuantumToChar(QuantumRange); + *q++=ScaleQuantumToChar(QuantumRange); + *q++=ScaleQuantumToChar(QuantumRange); + } + else + if (image->colorspace != CMYKColorspace) + { + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + } + else + { + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + *q++=ScaleQuantumToChar(GetPixelIndex( + indexes+x)); + } + p++; + } + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (progress == MagickFalse) + break; + } + length=(size_t) (q-pixels); + if (compression == LZWCompression) + status=LZWEncodeImage(image,length,pixels); + else + status=PackbitsEncodeImage(image,length,pixels); + if (status == MagickFalse) + { + (void) CloseBlob(image); + return(MagickFalse); + } + pixel_info=RelinquishVirtualMemory(pixel_info); + break; + } + case NoCompression: + { + /* + Dump uncompressed DirectColor packets. + */ + Ascii85Initialize(image); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((image->matte != MagickFalse) && + (GetPixelOpacity(p) == (Quantum) TransparentOpacity)) + { + Ascii85Encode(image,ScaleQuantumToChar((Quantum) + QuantumRange)); + Ascii85Encode(image,ScaleQuantumToChar((Quantum) + QuantumRange)); + Ascii85Encode(image,ScaleQuantumToChar((Quantum) + QuantumRange)); + } + else + if (image->colorspace != CMYKColorspace) + { + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelRed(p))); + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelGreen(p))); + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelBlue(p))); + } + else + { + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelRed(p))); + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelGreen(p))); + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelBlue(p))); + Ascii85Encode(image,ScaleQuantumToChar( + GetPixelIndex(indexes+x))); + } + p++; + } + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (progress == MagickFalse) + break; + } + Ascii85Flush(image); + break; + } + } + } + else + { + /* + Dump number of colors and colormap. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g\n1\n%d\n", + (double) image->columns,(double) image->rows,(int) + (image->colorspace == CMYKColorspace)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%d\n", + (int) (compression == NoCompression)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n",(double) + image->colors); + (void) WriteBlobString(image,buffer); + for (i=0; i < (ssize_t) image->colors; i++) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"%02X%02X%02X\n", + ScaleQuantumToChar(image->colormap[i].red), + ScaleQuantumToChar(image->colormap[i].green), + ScaleQuantumToChar(image->colormap[i].blue)); + (void) WriteBlobString(image,buffer); + } + switch (compression) + { + case RLECompression: + default: + { + MemoryInfo + *pixel_info; + + unsigned char + *q; + + /* + Allocate pixel array. + */ + length=(size_t) number_pixels; + pixel_info=AcquireVirtualMemory(length,sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError, + "MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Dump runlength encoded pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (progress == MagickFalse) + break; + } + length=(size_t) (q-pixels); + if (compression == LZWCompression) + status=LZWEncodeImage(image,length,pixels); + else + status=PackbitsEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (status == MagickFalse) + { + (void) CloseBlob(image); + return(MagickFalse); + } + break; + } + case NoCompression: + { + /* + Dump uncompressed PseudoColor packets. + */ + Ascii85Initialize(image); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + Ascii85Encode(image,(unsigned char) GetPixelIndex( + indexes+x)); + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (progress == MagickFalse) + break; + } + Ascii85Flush(image); + break; + } + } + } + (void) WriteBlobByte(image,'\n'); + length=(size_t) (TellBlob(image)-stop); + stop=TellBlob(image); + offset=SeekBlob(image,start,SEEK_SET); + if (offset < 0) + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BeginData:%13ld %s Bytes\n",(long) length, + compression == NoCompression ? "ASCII" : "Binary"); + (void) WriteBlobString(image,buffer); + (void) SeekBlob(image,stop,SEEK_SET); + (void) WriteBlobString(image,"%%EndData\n"); + if (LocaleCompare(image_info->magick,"PS2") != 0) + (void) WriteBlobString(image,"end\n"); + (void) WriteBlobString(image,"%%PageTrailer\n"); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) WriteBlobString(image,"%%Trailer\n"); + if (page > 1) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BoundingBox: %.20g %.20g %.20g %.20g\n",ceil(bounds.x1-0.5), + ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1, + bounds.x2,bounds.y2); + (void) WriteBlobString(image,buffer); + } + (void) WriteBlobString(image,"%%EOF\n"); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/ps3.c b/ImageMagick-6.9.12-44/coders/ps3.c new file mode 100644 index 0000000..d683516 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/ps3.c @@ -0,0 +1,1618 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP SSSSS 33333 % +% P P SS 33 % +% PPPP SSS 333 % +% P SS 33 % +% P SSSSS 33333 % +% % +% % +% Write Postscript Level III Format % +% % +% Software Design % +% Cristy % +% Lars Ruben Skyum % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/compress.h" +#include "magick/constitute.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/timer-private.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/module.h" + +/* + Define declarations. +*/ +#define PS3_NoCompression "0" +#define PS3_FaxCompression "1" +#define PS3_JPEGCompression "2" +#define PS3_LZWCompression "3" +#define PS3_RLECompression "4" +#define PS3_ZipCompression "5" + +#define PS3_RGBColorspace "0" +#define PS3_CMYKColorspace "1" + +#define PS3_DirectClass "0" +#define PS3_PseudoClass "1" + +#if defined(MAGICKCORE_TIFF_DELEGATE) +#define CCITTParam "-1" +#else +#define CCITTParam "0" +#endif + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePS3Image(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P S 3 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPS3Image() adds properties for the PS3 image format to the list of +% supported formats. The properties include the image format tag, a method to +% read and/or write the format, whether the format supports the saving of more +% than one frame to the same file or blob, whether the format supports native +% in-memory I/O, and a brief description of the format. +% +% The format of the RegisterPS3Image method is: +% +% size_t RegisterPS3Image(void) +% +*/ +ModuleExport size_t RegisterPS3Image(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("EPS3"); + entry->encoder=(EncodeImageHandler *) WritePS3Image; + entry->description=ConstantString("Level III Encapsulated PostScript"); + entry->mime_type=ConstantString("application/postscript"); + entry->magick_module=ConstantString("PS3"); + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PS3"); + entry->encoder=(EncodeImageHandler *) WritePS3Image; + entry->description=ConstantString("Level III PostScript"); + entry->mime_type=ConstantString("application/postscript"); + entry->magick_module=ConstantString("PS3"); + entry->seekable_stream=MagickTrue; + entry->blob_support=MagickFalse; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P S 3 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPS3Image() removes format registrations made by the PS3 module +% from the list of supported formats. +% +% The format of the UnregisterPS3Image method is: +% +% UnregisterPS3Image(void) +% +*/ +ModuleExport void UnregisterPS3Image(void) +{ + (void) UnregisterMagickInfo("EPS3"); + (void) UnregisterMagickInfo("PS3"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P S 3 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePS3Image() translates an image to encapsulated Postscript Level III +% for printing. If the supplied geometry is null, the image is centered on +% the Postscript page. Otherwise, the image is positioned as specified by the +% geometry. +% +% The format of the WritePS3Image method is: +% +% MagickBooleanType WritePS3Image(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows: +% +% o image_info: Specifies a pointer to a ImageInfo structure. +% +% o image: the image. +% +*/ + +static MagickBooleanType Huffman2DEncodeImage(const ImageInfo *image_info, + Image *image,Image *inject_image) +{ + Image + *group4_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + size_t + length; + + unsigned char + *group4; + + group4_image=CloneImage(inject_image,0,0,MagickTrue,&image->exception); + if (group4_image == (Image *) NULL) + return(MagickFalse); + status=MagickTrue; + write_info=CloneImageInfo(image_info); + (void) CopyMagickString(write_info->filename,"GROUP4:",MaxTextExtent); + (void) CopyMagickString(write_info->magick,"GROUP4",MaxTextExtent); + group4=(unsigned char *) ImageToBlob(write_info,group4_image,&length, + &image->exception); + group4_image=DestroyImage(group4_image); + write_info=DestroyImageInfo(write_info); + if (group4 == (unsigned char *) NULL) + return(MagickFalse); + if (WriteBlob(image,length,group4) != (ssize_t) length) + status=MagickFalse; + group4=(unsigned char *) RelinquishMagickMemory(group4); + return(status); +} + +static MagickBooleanType SerializeImage(const ImageInfo *image_info, + Image *image,MemoryInfo **pixel_info,size_t *length) +{ + MagickBooleanType + status; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + unsigned char + *q; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=MagickTrue; + *length=(image->colorspace == CMYKColorspace ? 4 : 3)*(size_t) + image->columns*image->rows; + *pixel_info=AcquireVirtualMemory(*length,sizeof(*q)); + if (*pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + q=(unsigned char *) GetVirtualMemoryBlob(*pixel_info); + (void) memset(q,0,*length*sizeof(*q)); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + if (image->colorspace != CMYKColorspace) + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + p++; + } + else + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + *q++=ScaleQuantumToChar(GetPixelIndex(indexes+x)); + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (status == MagickFalse) + *pixel_info=RelinquishVirtualMemory(*pixel_info); + return(status); +} + +static MagickBooleanType SerializeImageChannel(const ImageInfo *image_info, + Image *image,MemoryInfo **pixel_info,size_t *length) +{ + MagickBooleanType + status; + + const PixelPacket + *p; + + ssize_t + x; + + unsigned char + *q; + + size_t + pack, + padded_columns; + + ssize_t + y; + + unsigned char + code, + bit; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=MagickTrue; + pack=SetImageMonochrome(image,&image->exception) == MagickFalse ? 1UL : 8UL; + padded_columns=((image->columns+pack-1)/pack)*pack; + *length=(size_t) padded_columns*image->rows/pack; + *pixel_info=AcquireVirtualMemory(*length,sizeof(*q)); + if (*pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + q=(unsigned char *) GetVirtualMemoryBlob(*pixel_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + if (pack == 1) + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(ClampToQuantum(GetPixelLuma(image,p))); + p++; + } + else + { + code='\0'; + for (x=0; x < (ssize_t) padded_columns; x++) + { + bit=(unsigned char) 0x00; + if (x < (ssize_t) image->columns) + bit=(unsigned char) (ClampToQuantum(GetPixelLuma(image,p)) == + (Quantum) TransparentOpacity ? 0x01 : 0x00); + code=(code << 1)+bit; + if (((x+1) % pack) == 0) + { + *q++=code; + code='\0'; + } + p++; + } + } + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + if (status == MagickFalse) + *pixel_info=RelinquishVirtualMemory(*pixel_info); + return(status); +} + +static MagickBooleanType SerializeImageIndexes(const ImageInfo *image_info, + Image *image,MemoryInfo **pixel_info,size_t *length) +{ + MagickBooleanType + status; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + unsigned char + *q; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=MagickTrue; + *length=(size_t) image->columns*image->rows; + *pixel_info=AcquireVirtualMemory(*length,sizeof(*q)); + if (*pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + q=(unsigned char *) GetVirtualMemoryBlob(*pixel_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (status == MagickFalse) + *pixel_info=RelinquishVirtualMemory(*pixel_info); + return(status); +} + +static MagickBooleanType WritePS3MaskImage(const ImageInfo *image_info, + Image *image,const CompressionType compression) +{ + char + buffer[MaxTextExtent]; + + Image + *mask_image; + + MagickBooleanType + status; + + MagickOffsetType + offset, + start, + stop; + + MemoryInfo + *pixel_info; + + ssize_t + i; + + size_t + length; + + unsigned char + *pixels; + + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->matte != MagickFalse); + status=MagickTrue; + /* + Note BeginData DSC comment for update later. + */ + start=TellBlob(image); + if (start < 0) + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BeginData:%13ld %s Bytes\n",0L,compression == NoCompression ? + "ASCII" : "BINARY"); + (void) WriteBlobString(image,buffer); + stop=TellBlob(image); + if (stop < 0) + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + /* + Only lossless compressions for the mask. + */ + switch (compression) + { + case NoCompression: + default: + { + (void) FormatLocaleString(buffer,MaxTextExtent,"currentfile %.20g %.20g " + PS3_NoCompression " ByteStreamDecodeFilter\n",(double) image->columns, + (double) image->rows); + break; + } + case FaxCompression: + case Group4Compression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,"currentfile %.20g %.20g " + PS3_FaxCompression " ByteStreamDecodeFilter\n",(double) image->columns, + (double) image->rows); + break; + } + case LZWCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,"currentfile %.20g %.20g " + PS3_LZWCompression " ByteStreamDecodeFilter\n",(double) image->columns, + (double) image->rows); + break; + } + case RLECompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,"currentfile %.20g %.20g " + PS3_RLECompression " ByteStreamDecodeFilter\n",(double) image->columns, + (double) image->rows); + break; + } + case ZipCompression: + { + (void) FormatLocaleString(buffer,MaxTextExtent,"currentfile %.20g %.20g " + PS3_ZipCompression " ByteStreamDecodeFilter\n",(double) image->columns, + (double) image->rows); + break; + } + } + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"/ReusableStreamDecode filter\n"); + mask_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (mask_image == (Image *) NULL) + ThrowWriterException(CoderError,image->exception.reason); + status=SeparateImageChannel(mask_image,OpacityChannel); + if (status == MagickFalse) + { + mask_image=DestroyImage(mask_image); + return(MagickFalse); + } + (void) SetImageType(mask_image,BilevelType); + (void) SetImageType(mask_image,PaletteType); + mask_image->matte=MagickFalse; + pixels=(unsigned char *) NULL; + length=0; + switch (compression) + { + case NoCompression: + default: + { + status=SerializeImageChannel(image_info,mask_image,&pixel_info,&length); + if (status == MagickFalse) + break; + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + Ascii85Initialize(image); + for (i=0; i < (ssize_t) length; i++) + Ascii85Encode(image,pixels[i]); + Ascii85Flush(image); + pixel_info=RelinquishVirtualMemory(pixel_info); + break; + } + case FaxCompression: + case Group4Compression: + { + if ((compression == FaxCompression) || + (LocaleCompare(CCITTParam,"0") == 0)) + status=HuffmanEncodeImage(image_info,image,mask_image); + else + status=Huffman2DEncodeImage(image_info,image,mask_image); + break; + } + case LZWCompression: + { + status=SerializeImageChannel(image_info,mask_image,&pixel_info,&length); + if (status == MagickFalse) + break; + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + status=LZWEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + break; + } + case RLECompression: + { + status=SerializeImageChannel(image_info,mask_image,&pixel_info,&length); + if (status == MagickFalse) + break; + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + status=PackbitsEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + break; + } + case ZipCompression: + { + status=SerializeImageChannel(image_info,mask_image,&pixel_info,&length); + if (status == MagickFalse) + break; + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + status=ZLIBEncodeImage(image,length,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + break; + } + } + mask_image=DestroyImage(mask_image); + (void) WriteBlobByte(image,'\n'); + length=(size_t) (TellBlob(image)-stop); + stop=TellBlob(image); + if (stop < 0) + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + offset=SeekBlob(image,start,SEEK_SET); + if (offset < 0) + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BeginData:%13ld %s Bytes\n",(long) length, + compression == NoCompression ? "ASCII" : "BINARY"); + (void) WriteBlobString(image,buffer); + offset=SeekBlob(image,stop,SEEK_SET); + if (offset < 0) + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + (void) WriteBlobString(image,"%%EndData\n"); + (void) WriteBlobString(image, "/mask_stream exch def\n"); + return(status); +} + +static MagickBooleanType WritePS3Image(const ImageInfo *image_info,Image *image) +{ + static const char + PostscriptProlog[]= + "/ByteStreamDecodeFilter\n" + "{\n" + " /z exch def\n" + " /r exch def\n" + " /c exch def\n" + " z " PS3_NoCompression " eq { /ASCII85Decode filter } if\n" + " z " PS3_FaxCompression " eq\n" + " {\n" + " <<\n" + " /K " CCITTParam "\n" + " /Columns c\n" + " /Rows r\n" + " >>\n" + " /CCITTFaxDecode filter\n" + " } if\n" + " z " PS3_JPEGCompression " eq { /DCTDecode filter } if\n" + " z " PS3_LZWCompression " eq { /LZWDecode filter } if\n" + " z " PS3_RLECompression " eq { /RunLengthDecode filter } if\n" + " z " PS3_ZipCompression " eq { /FlateDecode filter } if\n" + "} bind def\n" + "\n" + "/DirectClassImageDict\n" + "{\n" + " colorspace " PS3_RGBColorspace " eq\n" + " {\n" + " /DeviceRGB setcolorspace\n" + " <<\n" + " /ImageType 1\n" + " /Width columns\n" + " /Height rows\n" + " /BitsPerComponent 8\n" + " /DataSource pixel_stream\n" + " /MultipleDataSources false\n" + " /ImageMatrix [columns 0 0 rows neg 0 rows]\n" + " /Decode [0 1 0 1 0 1]\n" + " >>\n" + " }\n" + " {\n" + " /DeviceCMYK setcolorspace\n" + " <<\n" + " /ImageType 1\n" + " /Width columns\n" + " /Height rows\n" + " /BitsPerComponent 8\n" + " /DataSource pixel_stream\n" + " /MultipleDataSources false\n" + " /ImageMatrix [columns 0 0 rows neg 0 rows]\n" + " /Decode\n" + " compression " PS3_JPEGCompression " eq\n" + " { [1 0 1 0 1 0 1 0] }\n" + " { [0 1 0 1 0 1 0 1] }\n" + " ifelse\n" + " >>\n" + " }\n" + " ifelse\n" + "} bind def\n" + "\n" + "/PseudoClassImageDict\n" + "{\n" + " % Colors in colormap image.\n" + " currentfile buffer readline pop\n" + " token pop /colors exch def pop\n" + " colors 0 eq\n" + " {\n" + " % Depth of grayscale image.\n" + " currentfile buffer readline pop\n" + " token pop /bits exch def pop\n" + " /DeviceGray setcolorspace\n" + " <<\n" + " /ImageType 1\n" + " /Width columns\n" + " /Height rows\n" + " /BitsPerComponent bits\n" + " /Decode [0 1]\n" + " /ImageMatrix [columns 0 0 rows neg 0 rows]\n" + " /DataSource pixel_stream\n" + " >>\n" + " }\n" + " {\n" + " % RGB colormap.\n" + " /colormap colors 3 mul string def\n" + " compression " PS3_NoCompression " eq\n" + " { currentfile /ASCII85Decode filter colormap readstring pop pop }\n" + " { currentfile colormap readstring pop pop }\n" + " ifelse\n" + " [ /Indexed /DeviceRGB colors 1 sub colormap ] setcolorspace\n" + " <<\n" + " /ImageType 1\n" + " /Width columns\n" + " /Height rows\n" + " /BitsPerComponent 8\n" + " /Decode [0 255]\n" + " /ImageMatrix [columns 0 0 rows neg 0 rows]\n" + " /DataSource pixel_stream\n" + " >>\n" + " }\n" + " ifelse\n" + "} bind def\n" + "\n" + "/NonMaskedImageDict\n" + "{\n" + " class " PS3_PseudoClass " eq\n" + " { PseudoClassImageDict }\n" + " { DirectClassImageDict }\n" + " ifelse\n" + "} bind def\n" + "\n" + "/MaskedImageDict\n" + "{\n" + " <<\n" + " /ImageType 3\n" + " /InterleaveType 3\n" + " /DataDict NonMaskedImageDict\n" + " /MaskDict\n" + " <<\n" + " /ImageType 1\n" + " /Width columns\n" + " /Height rows\n" + " /BitsPerComponent 1\n" + " /DataSource mask_stream\n" + " /MultipleDataSources false\n" + " /ImageMatrix [ columns 0 0 rows neg 0 rows]\n" + " /Decode [ 0 1 ]\n" + " >>\n" + " >>\n" + "} bind def\n" + "\n" + "/ClipImage\n" + "{} def\n" + "\n" + "/DisplayImage\n" + "{\n" + " gsave\n" + " /buffer 512 string def\n" + " % Translation.\n" + " currentfile buffer readline pop\n" + " token pop /x exch def\n" + " token pop /y exch def pop\n" + " x y translate\n" + " % Image size and font size.\n" + " currentfile buffer readline pop\n" + " token pop /x exch def\n" + " token pop /y exch def pop\n" + " currentfile buffer readline pop\n" + " token pop /pointsize exch def pop\n"; + + static const char + PostscriptEpilog[]= + " x y scale\n" + " % Clipping path.\n" + " currentfile buffer readline pop\n" + " token pop /clipped exch def pop\n" + " % Showpage.\n" + " currentfile buffer readline pop\n" + " token pop /sp exch def pop\n" + " % Image pixel size.\n" + " currentfile buffer readline pop\n" + " token pop /columns exch def\n" + " token pop /rows exch def pop\n" + " % Colorspace (RGB/CMYK).\n" + " currentfile buffer readline pop\n" + " token pop /colorspace exch def pop\n" + " % Transparency.\n" + " currentfile buffer readline pop\n" + " token pop /alpha exch def pop\n" + " % Stencil mask?\n" + " currentfile buffer readline pop\n" + " token pop /stencil exch def pop\n" + " % Image class (direct/pseudo).\n" + " currentfile buffer readline pop\n" + " token pop /class exch def pop\n" + " % Compression type.\n" + " currentfile buffer readline pop\n" + " token pop /compression exch def pop\n" + " % Clip and render.\n" + " /pixel_stream currentfile columns rows compression ByteStreamDecodeFilter def\n" + " clipped { ClipImage } if\n" + " alpha stencil not and\n" + " { MaskedImageDict mask_stream resetfile }\n" + " { NonMaskedImageDict }\n" + " ifelse\n" + " stencil { 0 setgray imagemask } { image } ifelse\n" + " grestore\n" + " sp { showpage } if\n" + "} bind def\n"; + + char + buffer[MaxTextExtent], + date[MaxTextExtent], + **labels, + page_geometry[MaxTextExtent]; + + CompressionType + compression; + + const char + *option, + *value; + + double + pointsize; + + GeometryInfo + geometry_info; + + MagickBooleanType + status; + + MagickOffsetType + offset, + scene, + start, + stop; + + MagickStatusType + flags; + + MemoryInfo + *pixel_info; + + PointInfo + delta, + resolution, + scale; + + RectangleInfo + geometry, + media_info, + page_info; + + ssize_t + i; + + SegmentInfo + bounds; + + size_t + imageListLength, + length, + page, + pixel, + text_size; + + ssize_t + j; + + time_t + timer; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(MagickFalse); + compression=image->compression; + if (image_info->compression != UndefinedCompression) + compression=image_info->compression; + switch (compression) + { + case FaxCompression: + case Group4Compression: + { + if ((SetImageMonochrome(image,&image->exception) == MagickFalse) || + (image->matte != MagickFalse)) + compression=RLECompression; + break; + } +#if !defined(MAGICKCORE_JPEG_DELEGATE) + case JPEGCompression: + { + compression=RLECompression; + (void) ThrowMagickException(&image->exception,GetMagickModule(), + MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","`%s' (JPEG)", + image->filename); + break; + } +#endif +#if !defined(MAGICKCORE_ZLIB_DELEGATE) + case ZipCompression: + { + compression=RLECompression; + (void) ThrowMagickException(&image->exception,GetMagickModule(), + MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","`%s' (ZLIB)", + image->filename); + break; + } +#endif + default: + break; + } + (void) memset(&bounds,0,sizeof(bounds)); + page=0; + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Scale relative to dots-per-inch. + */ + delta.x=DefaultResolution; + delta.y=DefaultResolution; + resolution.x=image->x_resolution; + resolution.y=image->y_resolution; + if ((resolution.x == 0.0) || (resolution.y == 0.0)) + { + flags=ParseGeometry(PSDensityGeometry,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + if (image_info->density != (char *) NULL) + { + flags=ParseGeometry(image_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + if (image->units == PixelsPerCentimeterResolution) + { + resolution.x=(100.0*2.54*resolution.x+0.5)/100.0; + resolution.y=(100.0*2.54*resolution.y+0.5)/100.0; + } + SetGeometry(image,&geometry); + (void) FormatLocaleString(page_geometry,MaxTextExtent,"%.20gx%.20g", + (double) image->columns,(double) image->rows); + if (image_info->page != (char *) NULL) + (void) CopyMagickString(page_geometry,image_info->page,MaxTextExtent); + else + if ((image->page.width != 0) && (image->page.height != 0)) + (void) FormatLocaleString(page_geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) image->page.width,(double) + image->page.height,(double) image->page.x,(double) image->page.y); + else + if ((image->gravity != UndefinedGravity) && + (LocaleCompare(image_info->magick,"PS") == 0)) + (void) CopyMagickString(page_geometry,PSPageGeometry,MaxTextExtent); + (void) ConcatenateMagickString(page_geometry,">",MaxTextExtent); + (void) ParseMetaGeometry(page_geometry,&geometry.x,&geometry.y, + &geometry.width,&geometry.height); + scale.x=PerceptibleReciprocal(resolution.x)*geometry.width*delta.x; + geometry.width=(size_t) floor(scale.x+0.5); + scale.y=PerceptibleReciprocal(resolution.y)*geometry.height*delta.y; + geometry.height=(size_t) floor(scale.y+0.5); + (void) ParseAbsoluteGeometry(page_geometry,&media_info); + (void) ParseGravityGeometry(image,page_geometry,&page_info, + &image->exception); + if (image->gravity != UndefinedGravity) + { + geometry.x=(-page_info.x); + geometry.y=(ssize_t) (media_info.height+page_info.y-image->rows); + } + pointsize=12.0; + if (image_info->pointsize != 0.0) + pointsize=image_info->pointsize; + text_size=0; + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + text_size=(size_t) (MultilineCensus(value)*pointsize+12); + page++; + if (page == 1) + { + /* + Postscript header on the first page. + */ + if (LocaleCompare(image_info->magick,"PS3") == 0) + (void) CopyMagickString(buffer,"%!PS-Adobe-3.0\n",MaxTextExtent); + else + (void) CopyMagickString(buffer,"%!PS-Adobe-3.0 EPSF-3.0\n", + MaxTextExtent); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%Creator: ImageMagick %s\n",MagickLibVersionText); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%%%%Title: %s\n", + image->filename); + (void) WriteBlobString(image,buffer); + timer=GetMagickTime(); + (void) FormatMagickTime(timer,MaxTextExtent,date); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%CreationDate: %s\n",date); + (void) WriteBlobString(image,buffer); + bounds.x1=(double) geometry.x; + bounds.y1=(double) geometry.y; + bounds.x2=(double) geometry.x+scale.x; + bounds.y2=(double) geometry.y+scale.y+text_size; + if ((image_info->adjoin != MagickFalse) && + (GetNextImageInList(image) != (Image *) NULL)) + { + (void) WriteBlobString(image,"%%BoundingBox: (atend)\n"); + (void) WriteBlobString(image,"%%HiResBoundingBox: (atend)\n"); + } + else + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BoundingBox: %g %g %g %g\n",ceil(bounds.x1-0.5), + ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1, + bounds.y1,bounds.x2,bounds.y2); + (void) WriteBlobString(image,buffer); + if (image->colorspace == CMYKColorspace) + (void) WriteBlobString(image, + "%%DocumentProcessColors: Cyan Magenta Yellow Black\n"); + else + if (SetImageGray(image,&image->exception) != MagickFalse) + (void) WriteBlobString(image, + "%%DocumentProcessColors: Black\n"); + } + /* + Font resources + */ + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + (void) WriteBlobString(image, + "%%DocumentNeededResources: font Helvetica\n"); + (void) WriteBlobString(image,"%%LanguageLevel: 3\n"); + /* + Pages, orientation and order. + */ + if (LocaleCompare(image_info->magick,"PS3") != 0) + (void) WriteBlobString(image,"%%Pages: 1\n"); + else + { + (void) WriteBlobString(image,"%%Orientation: Portrait\n"); + (void) WriteBlobString(image,"%%PageOrder: Ascend\n"); + if (image_info->adjoin == MagickFalse) + (void) CopyMagickString(buffer,"%%Pages: 1\n",MaxTextExtent); + else + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%Pages: %.20g\n",(double) GetImageListLength(image)); + (void) WriteBlobString(image,buffer); + } + if (image->colorspace == CMYKColorspace) + (void) WriteBlobString(image, + "%%DocumentProcessColors: Cyan Magenta Yellow Black\n"); + (void) WriteBlobString(image,"%%EndComments\n"); + /* + The static postscript procedures prolog. + */ + (void) WriteBlobString(image,"%%BeginProlog\n"); + (void) WriteBlob(image,sizeof(PostscriptProlog)-1, + (const unsigned char *) PostscriptProlog); + /* + One label line for each line in label string. + */ + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + { + (void) WriteBlobString(image,"\n %% Labels.\n /Helvetica " + " findfont pointsize scalefont setfont\n"); + for (i=(ssize_t) MultilineCensus(value)-1; i >= 0; i--) + { + (void) WriteBlobString(image, + " currentfile buffer readline pop token pop\n"); + (void) FormatLocaleString(buffer,MaxTextExtent, + " 0 y %g add moveto show pop\n",i*pointsize+12); + (void) WriteBlobString(image,buffer); + } + } + /* + The static postscript procedures epilog. + */ + (void) WriteBlob(image,sizeof(PostscriptEpilog)-1, + (const unsigned char *) PostscriptEpilog); + (void) WriteBlobString(image,"%%EndProlog\n"); + } + (void) FormatLocaleString(buffer,MaxTextExtent,"%%%%Page: 1 %.20g\n", + (double) page); + (void) WriteBlobString(image,buffer); + /* + Page bounding box. + */ + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%PageBoundingBox: %.20g %.20g %.20g %.20g\n",(double) geometry.x, + (double) geometry.y,geometry.x+(double) geometry.width,geometry.y+ + (double) (geometry.height+text_size)); + (void) WriteBlobString(image,buffer); + /* + Page process colors if not RGB. + */ + if (image->colorspace == CMYKColorspace) + (void) WriteBlobString(image, + "%%PageProcessColors: Cyan Magenta Yellow Black\n"); + else + if (SetImageGray(image,&image->exception) != MagickFalse) + (void) WriteBlobString(image,"%%PageProcessColors: Black\n"); + /* + Adjust document bounding box to bound page bounding box. + */ + if ((double) geometry.x < bounds.x1) + bounds.x1=(double) geometry.x; + if ((double) geometry.y < bounds.y1) + bounds.y1=(double) geometry.y; + if ((double) (geometry.x+scale.x) > bounds.x2) + bounds.x2=(double) geometry.x+scale.x; + if ((double) (geometry.y+scale.y+text_size) > bounds.y2) + bounds.y2=(double) geometry.y+scale.y+text_size; + /* + Page font resource if there's a label. + */ + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + (void) WriteBlobString(image,"%%PageResources: font Helvetica\n"); + /* + PS clipping path from Photoshop clipping path. + */ + if ((image->clip_mask == (Image *) NULL) || + (LocaleNCompare("8BIM:",image->clip_mask->magick_filename,5) != 0)) + (void) WriteBlobString(image,"/ClipImage {} def\n"); + else + { + const char + *value; + + value=GetImageProperty(image,image->clip_mask->magick_filename); + if (value == (const char *) NULL) + return(MagickFalse); + (void) WriteBlobString(image,value); + (void) WriteBlobByte(image,'\n'); + } + /* + Push a dictionary for our own def's if this an EPS. + */ + if (LocaleCompare(image_info->magick,"PS3") != 0) + (void) WriteBlobString(image,"userdict begin\n"); + /* + Image mask. + */ + if ((image->matte != MagickFalse) && + (WritePS3MaskImage(image_info,image,compression) == MagickFalse)) + { + (void) CloseBlob(image); + return(MagickFalse); + } + /* + Remember position of BeginData comment so we can update it. + */ + start=TellBlob(image); + if (start < 0) + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BeginData:%13ld %s Bytes\n",0L, + compression == NoCompression ? "ASCII" : "BINARY"); + (void) WriteBlobString(image,buffer); + stop=TellBlob(image); + if (stop < 0) + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + (void) WriteBlobString(image,"DisplayImage\n"); + /* + Translate, scale, and font point size. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g\n%g %g\n%g\n", + (double) geometry.x,(double) geometry.y,scale.x,scale.y,pointsize); + (void) WriteBlobString(image,buffer); + /* + Output labels. + */ + labels=(char **) NULL; + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + labels=StringToList(value); + if (labels != (char **) NULL) + { + for (i=0; labels[i] != (char *) NULL; i++) + { + if (compression != NoCompression) + { + for (j=0; labels[i][j] != '\0'; j++) + (void) WriteBlobByte(image,(unsigned char) labels[i][j]); + (void) WriteBlobByte(image,'\n'); + } + else + { + (void) WriteBlobString(image,"<~"); + Ascii85Initialize(image); + for (j=0; labels[i][j] != '\0'; j++) + Ascii85Encode(image,(unsigned char) labels[i][j]); + Ascii85Flush(image); + } + labels[i]=DestroyString(labels[i]); + } + labels=(char **) RelinquishMagickMemory(labels); + } + /* + Photoshop clipping path active? + */ + if ((image->clip_mask != (Image *) NULL) && + (LocaleNCompare("8BIM:",image->clip_mask->magick_filename,5) == 0)) + (void) WriteBlobString(image,"true\n"); + else + (void) WriteBlobString(image,"false\n"); + /* + Showpage for non-EPS. + */ + (void) WriteBlobString(image, LocaleCompare(image_info->magick,"PS3") == 0 ? + "true\n" : "false\n"); + /* + Image columns, rows, and color space. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g %.20g\n%s\n", + (double) image->columns,(double) image->rows,image->colorspace == + CMYKColorspace ? PS3_CMYKColorspace : PS3_RGBColorspace); + (void) WriteBlobString(image,buffer); + /* + Masked image? + */ + (void) WriteBlobString(image,image->matte != MagickFalse ? + "true\n" : "false\n"); + /* + Render with imagemask operator? + */ + option=GetImageOption(image_info,"ps3:imagemask"); + (void) WriteBlobString(image,((option != (const char *) NULL) && + (SetImageMonochrome(image,&image->exception) != MagickFalse)) ? + "true\n" : "false\n"); + /* + Output pixel data. + */ + pixels=(unsigned char *) NULL; + length=0; + if ((image_info->type != TrueColorType) && + (image_info->type != TrueColorMatteType) && + (image_info->type != ColorSeparationType) && + (image_info->type != ColorSeparationMatteType) && + (image->colorspace != CMYKColorspace) && + ((SetImageGray(image,&image->exception) != MagickFalse) || + (SetImageMonochrome(image,&image->exception) != MagickFalse))) + { + /* + Gray images. + */ + (void) WriteBlobString(image,PS3_PseudoClass"\n"); + switch (compression) + { + case NoCompression: + default: + { + (void) WriteBlobString(image,PS3_NoCompression"\n"); + break; + } + case FaxCompression: + case Group4Compression: + { + (void) WriteBlobString(image,PS3_FaxCompression"\n"); + break; + } + case JPEGCompression: + { + (void) WriteBlobString(image,PS3_JPEGCompression"\n"); + break; + } + case LZWCompression: + { + (void) WriteBlobString(image,PS3_LZWCompression"\n"); + break; + } + case RLECompression: + { + (void) WriteBlobString(image,PS3_RLECompression"\n"); + break; + } + case ZipCompression: + { + (void) WriteBlobString(image,PS3_ZipCompression"\n"); + break; + } + } + /* + Number of colors -- 0 for single component non-color mapped data. + */ + (void) WriteBlobString(image,"0\n"); + /* + 1 bit or 8 bit components? + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"%d\n", + SetImageMonochrome(image,&image->exception) != MagickFalse ? 1 : 8); + (void) WriteBlobString(image,buffer); + /* + Image data. + */ + if (compression == JPEGCompression) + status=InjectImageBlob(image_info,image,image,"jpeg", + &image->exception); + else + if ((compression == FaxCompression) || + (compression == Group4Compression)) + { + if (LocaleCompare(CCITTParam,"0") == 0) + status=HuffmanEncodeImage(image_info,image,image); + else + status=Huffman2DEncodeImage(image_info,image,image); + } + else + { + status=SerializeImageChannel(image_info,image,&pixel_info, + &length); + if (status == MagickFalse) + { + (void) CloseBlob(image); + return(MagickFalse); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + switch (compression) + { + case NoCompression: + default: + { + Ascii85Initialize(image); + for (i=0; i < (ssize_t) length; i++) + Ascii85Encode(image,pixels[i]); + Ascii85Flush(image); + status=MagickTrue; + break; + } + case LZWCompression: + { + status=LZWEncodeImage(image,length,pixels); + break; + } + case RLECompression: + { + status=PackbitsEncodeImage(image,length,pixels); + break; + } + case ZipCompression: + { + status=ZLIBEncodeImage(image,length,pixels); + break; + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + } + } + else + if ((image->storage_class == DirectClass) || (image->colors > 256) || + (compression == JPEGCompression)) + { + /* + Truecolor image. + */ + (void) WriteBlobString(image,PS3_DirectClass"\n"); + switch (compression) + { + case NoCompression: + default: + { + (void) WriteBlobString(image,PS3_NoCompression"\n"); + break; + } + case RLECompression: + { + (void) WriteBlobString(image,PS3_RLECompression"\n"); + break; + } + case JPEGCompression: + { + (void) WriteBlobString(image,PS3_JPEGCompression"\n"); + break; + } + case LZWCompression: + { + (void) WriteBlobString(image,PS3_LZWCompression"\n"); + break; + } + case ZipCompression: + { + (void) WriteBlobString(image,PS3_ZipCompression"\n"); + break; + } + } + /* + Image data. + */ + if (compression == JPEGCompression) + status=InjectImageBlob(image_info,image,image,"jpeg", + &image->exception); + else + { + /* + Stream based compressions. + */ + status=SerializeImage(image_info,image,&pixel_info,&length); + if (status == MagickFalse) + { + (void) CloseBlob(image); + return(MagickFalse); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + switch (compression) + { + case NoCompression: + default: + { + Ascii85Initialize(image); + for (i=0; i < (ssize_t) length; i++) + Ascii85Encode(image,pixels[i]); + Ascii85Flush(image); + status=MagickTrue; + break; + } + case RLECompression: + { + status=PackbitsEncodeImage(image,length,pixels); + break; + } + case LZWCompression: + { + status=LZWEncodeImage(image,length,pixels); + break; + } + case ZipCompression: + { + status=ZLIBEncodeImage(image,length,pixels); + break; + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + } + } + else + { + /* + Colormapped images. + */ + (void) WriteBlobString(image,PS3_PseudoClass"\n"); + switch (compression) + { + case NoCompression: + default: + { + (void) WriteBlobString(image,PS3_NoCompression"\n"); + break; + } + case RLECompression: + { + (void) WriteBlobString(image,PS3_RLECompression"\n"); + break; + } + case LZWCompression: + { + (void) WriteBlobString(image,PS3_LZWCompression"\n"); + break; + } + case ZipCompression: + { + (void) WriteBlobString(image,PS3_ZipCompression"\n"); + break; + } + } + /* + Number of colors in color map. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g\n", + (double) image->colors); + (void) WriteBlobString(image,buffer); + /* + Color map - uncompressed. + */ + if ((compression != NoCompression) && + (compression != UndefinedCompression)) + { + for (i=0; i < (ssize_t) image->colors; i++) + { + pixel=ScaleQuantumToChar(image->colormap[i].red); + (void) WriteBlobByte(image,(unsigned char) pixel); + pixel=ScaleQuantumToChar(image->colormap[i].green); + (void) WriteBlobByte(image,(unsigned char) pixel); + pixel=ScaleQuantumToChar(image->colormap[i].blue); + (void) WriteBlobByte(image,(unsigned char) pixel); + } + } + else + { + Ascii85Initialize(image); + for (i=0; i < (ssize_t) image->colors; i++) + { + pixel=ScaleQuantumToChar(image->colormap[i].red); + Ascii85Encode(image,(unsigned char) pixel); + pixel=ScaleQuantumToChar(image->colormap[i].green); + Ascii85Encode(image,(unsigned char) pixel); + pixel=ScaleQuantumToChar(image->colormap[i].blue); + Ascii85Encode(image,(unsigned char) pixel); + } + Ascii85Flush(image); + } + status=SerializeImageIndexes(image_info,image,&pixel_info,&length); + if (status == MagickFalse) + { + (void) CloseBlob(image); + return(MagickFalse); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + switch (compression) + { + case NoCompression: + default: + { + Ascii85Initialize(image); + for (i=0; i < (ssize_t) length; i++) + Ascii85Encode(image,pixels[i]); + Ascii85Flush(image); + status=MagickTrue; + break; + } + case RLECompression: + { + status=PackbitsEncodeImage(image,length,pixels); + break; + } + case LZWCompression: + { + status=LZWEncodeImage(image,length,pixels); + break; + } + case ZipCompression: + { + status=ZLIBEncodeImage(image,length,pixels); + break; + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + } + (void) WriteBlobByte(image,'\n'); + if (status == MagickFalse) + { + (void) CloseBlob(image); + return(MagickFalse); + } + /* + Update BeginData now that we know the data size. + */ + length=(size_t) (TellBlob(image)-stop); + stop=TellBlob(image); + if (stop < 0) + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + offset=SeekBlob(image,start,SEEK_SET); + if (offset < 0) + ThrowWriterException(CorruptImageError,"ImproperImageHeader"); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BeginData:%13ld %s Bytes\n",(long) length, + compression == NoCompression ? "ASCII" : "BINARY"); + (void) WriteBlobString(image,buffer); + (void) SeekBlob(image,stop,SEEK_SET); + (void) WriteBlobString(image,"%%EndData\n"); + /* + End private dictionary if this an EPS. + */ + if (LocaleCompare(image_info->magick,"PS3") != 0) + (void) WriteBlobString(image,"end\n"); + (void) WriteBlobString(image,"%%PageTrailer\n"); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) WriteBlobString(image,"%%Trailer\n"); + if (page > 1) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%BoundingBox: %g %g %g %g\n",ceil(bounds.x1-0.5), + ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5)); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1,bounds.x2, + bounds.y2); + (void) WriteBlobString(image,buffer); + } + (void) WriteBlobString(image,"%%EOF\n"); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/psd-private.h b/ImageMagick-6.9.12-44/coders/psd-private.h new file mode 100644 index 0000000..73a7b90 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/psd-private.h @@ -0,0 +1,53 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Private header to reuse psd functionality. +*/ +#ifndef _PSD_PRIVATE_H +#define _PSD_PRIVATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct _PSDInfo +{ + char + signature[4]; + + size_t + rows, + columns; + + unsigned char + reserved[6]; + + unsigned short + channels, + depth, + mode, + min_channels, + version; +} PSDInfo; + +extern ModuleExport MagickBooleanType + ReadPSDLayers(Image *,const ImageInfo *,const PSDInfo *, + const MagickBooleanType,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/coders/psd.c b/ImageMagick-6.9.12-44/coders/psd.c new file mode 100644 index 0000000..eedcf37 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/psd.c @@ -0,0 +1,3705 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP SSSSS DDDD % +% P P SS D D % +% PPPP SSS D D % +% P SS D D % +% P SSSSS DDDD % +% % +% % +% Read/Write Adobe Photoshop Image Format % +% % +% Software Design % +% Cristy % +% Leonard Rosenthol % +% July 1992 % +% Dirk Lemstra % +% December 2013 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Photoshop spec @ https://www.adobe.com/devnet-apps/photoshop/fileformatashtml +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel.h" +#include "magick/pixel-accessor.h" +#include "magick/policy.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/registry.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/thread-private.h" +#ifdef MAGICKCORE_ZLIB_DELEGATE +#include +#endif +#include "psd-private.h" + +/* + Define declaractions. +*/ +#define MaxPSDChannels 56 +#define PSDQuantum(x) (((ssize_t) (x)+1) & -2) + +/* + Enumerated declaractions. +*/ +typedef enum +{ + Raw = 0, + RLE = 1, + ZipWithoutPrediction = 2, + ZipWithPrediction = 3 +} PSDCompressionType; + +typedef enum +{ + BitmapMode = 0, + GrayscaleMode = 1, + IndexedMode = 2, + RGBMode = 3, + CMYKMode = 4, + MultichannelMode = 7, + DuotoneMode = 8, + LabMode = 9 +} PSDImageType; + +/* + Typedef declaractions. +*/ +typedef struct _ChannelInfo +{ + short + type; + + size_t + size; +} ChannelInfo; + +typedef struct _MaskInfo +{ + Image + *image; + + RectangleInfo + page; + + unsigned char + background, + flags; +} MaskInfo; + +typedef struct _LayerInfo +{ + ChannelInfo + channel_info[MaxPSDChannels]; + + char + blendkey[4]; + + Image + *image; + + MaskInfo + mask; + + Quantum + opacity; + + RectangleInfo + page; + + size_t + offset_x, + offset_y; + + unsigned char + clipping, + flags, + name[257], + visible; + + unsigned short + channels; + + StringInfo + *info; +} LayerInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePSDImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P S D % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPSD()() returns MagickTrue if the image format type, identified by the +% magick string, is PSD. +% +% The format of the IsPSD method is: +% +% MagickBooleanType IsPSD(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsPSD(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"8BPS",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P S D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPSDImage() reads an Adobe Photoshop image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadPSDImage method is: +% +% Image *ReadPSDImage(image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static const char *CompositeOperatorToPSDBlendMode(Image *image) +{ + switch (image->compose) + { + case ColorBurnCompositeOp: + return(image->endian == LSBEndian ? "vidi" : "idiv"); + case ColorDodgeCompositeOp: + return(image->endian == LSBEndian ? " vid" : "div "); + case ColorizeCompositeOp: + return(image->endian == LSBEndian ? "rloc" : "colr"); + case DarkenCompositeOp: + return(image->endian == LSBEndian ? "krad" : "dark"); + case DifferenceCompositeOp: + return(image->endian == LSBEndian ? "ffid" : "diff"); + case DissolveCompositeOp: + return(image->endian == LSBEndian ? "ssid" : "diss"); + case ExclusionCompositeOp: + return(image->endian == LSBEndian ? "dums" : "smud"); + case HardLightCompositeOp: + return(image->endian == LSBEndian ? "tiLh" : "hLit"); + case HardMixCompositeOp: + return(image->endian == LSBEndian ? "xiMh" : "hMix"); + case HueCompositeOp: + return(image->endian == LSBEndian ? " euh" : "hue "); + case LightenCompositeOp: + return(image->endian == LSBEndian ? "etil" : "lite"); + case LinearBurnCompositeOp: + return(image->endian == LSBEndian ? "nrbl" : "lbrn"); + case LinearDodgeCompositeOp: + return(image->endian == LSBEndian ? "gddl" : "lddg"); + case LinearLightCompositeOp: + return(image->endian == LSBEndian ? "tiLl" : "lLit"); + case LuminizeCompositeOp: + return(image->endian == LSBEndian ? " mul" : "lum "); + case MultiplyCompositeOp: + return(image->endian == LSBEndian ? " lum" : "mul "); + case OverlayCompositeOp: + return(image->endian == LSBEndian ? "revo" : "over"); + case PinLightCompositeOp: + return(image->endian == LSBEndian ? "tiLp" : "pLit"); + case SaturateCompositeOp: + return(image->endian == LSBEndian ? " tas" : "sat "); + case ScreenCompositeOp: + return(image->endian == LSBEndian ? "nrcs" : "scrn"); + case SoftLightCompositeOp: + return(image->endian == LSBEndian ? "tiLs" : "sLit"); + case VividLightCompositeOp: + return(image->endian == LSBEndian ? "tiLv" : "vLit"); + case OverCompositeOp: + default: + return(image->endian == LSBEndian ? "mron" : "norm"); + } +} + +/* + For some reason Photoshop seems to blend semi-transparent pixels with white. + This method reverts the blending. This can be disabled by setting the + option 'psd:alpha-unblend' to off. +*/ +static MagickBooleanType CorrectPSDAlphaBlend(const ImageInfo *image_info, + Image *image,ExceptionInfo* exception) +{ + const char + *option; + + MagickBooleanType + status; + + ssize_t + y; + + if ((image->matte == MagickFalse) || (image->colorspace != sRGBColorspace)) + return(MagickTrue); + option=GetImageOption(image_info,"psd:alpha-unblend"); + if (IsStringNotFalse(option) == MagickFalse) + return(MagickTrue); + status=MagickTrue; +#if defined(MAGICKCORE_OPENMP_SUPPORT) +#pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + double + gamma; + + gamma=QuantumScale*GetPixelAlpha(q); + if (gamma != 0.0 && gamma != 1.0) + { + SetPixelRed(q,ClampToQuantum((GetPixelRed(q)-((1.0-gamma)* + QuantumRange))/gamma)); + SetPixelGreen(q,ClampToQuantum((GetPixelGreen(q)-((1.0-gamma)* + QuantumRange))/gamma)); + SetPixelBlue(q,ClampToQuantum((GetPixelBlue(q)-((1.0-gamma)* + QuantumRange))/gamma)); + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + status=MagickFalse; + } + + return(status); +} + +static inline CompressionType ConvertPSDCompression( + PSDCompressionType compression) +{ + switch (compression) + { + case RLE: + return RLECompression; + case ZipWithPrediction: + case ZipWithoutPrediction: + return ZipCompression; + default: + return NoCompression; + } +} + +static MagickBooleanType ApplyPSDLayerOpacity(Image *image,Quantum opacity, + MagickBooleanType revert,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + ssize_t + y; + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " applying layer opacity %.20g", (double) opacity); + if (opacity == QuantumRange) + return(MagickTrue); + if (image->matte != MagickTrue) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + status=MagickTrue; +#if defined(MAGICKCORE_OPENMP_SUPPORT) +#pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + if (revert == MagickFalse) + SetPixelAlpha(q,ClampToQuantum(QuantumScale*GetPixelAlpha(q)*opacity)); + else if (opacity > 0) + SetPixelAlpha(q,ClampToQuantum((double) QuantumRange*GetPixelAlpha(q)/ + (MagickRealType) opacity)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + status=MagickFalse; + } + return(status); +} + +static MagickBooleanType ApplyPSDOpacityMask(Image *image,const Image *mask, + Quantum background,MagickBooleanType revert,ExceptionInfo *exception) +{ + Image + *complete_mask; + + MagickBooleanType + status; + + MagickPixelPacket + color; + + ssize_t + y; + + if (image->matte == MagickFalse) + return(MagickTrue); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " applying opacity mask"); + complete_mask=CloneImage(image,0,0,MagickTrue,exception); + if (complete_mask == (Image *) NULL) + return(MagickFalse); + complete_mask->matte=MagickTrue; + GetMagickPixelPacket(complete_mask,&color); + color.red=(MagickRealType) background; + (void) SetImageColor(complete_mask,&color); + status=CompositeImage(complete_mask,OverCompositeOp,mask, + mask->page.x-image->page.x,mask->page.y-image->page.y); + if (status == MagickFalse) + { + complete_mask=DestroyImage(complete_mask); + return(status); + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) +#pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + PixelPacket + *p; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + p=GetAuthenticPixels(complete_mask,0,y,complete_mask->columns,1,exception); + if ((q == (PixelPacket *) NULL) || (p == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + MagickRealType + alpha, + intensity; + + alpha=(MagickRealType) GetPixelAlpha(q); + intensity=GetPixelIntensity(complete_mask,p); + if (revert == MagickFalse) + SetPixelAlpha(q,ClampToQuantum(intensity*(QuantumScale*alpha))); + else if (intensity > 0) + SetPixelAlpha(q,ClampToQuantum((alpha/intensity)*QuantumRange)); + q++; + p++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + status=MagickFalse; + } + complete_mask=DestroyImage(complete_mask); + return(status); +} + +static void PreservePSDOpacityMask(Image *image,LayerInfo* layer_info, + ExceptionInfo *exception) +{ + char + *key; + + RandomInfo + *random_info; + + StringInfo + *key_info; + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " preserving opacity mask"); + random_info=AcquireRandomInfo(); + key_info=GetRandomKey(random_info,2+1); + key=(char *) GetStringInfoDatum(key_info); + key[8]=(char) layer_info->mask.background; + key[9]='\0'; + layer_info->mask.image->page.x+=layer_info->page.x; + layer_info->mask.image->page.y+=layer_info->page.y; + (void) SetImageRegistry(ImageRegistryType,(const char *) key, + layer_info->mask.image,exception); + (void) SetImageArtifact(layer_info->image,"psd:opacity-mask", + (const char *) key); + key_info=DestroyStringInfo(key_info); + random_info=DestroyRandomInfo(random_info); +} + +static ssize_t DecodePSDPixels(const size_t number_compact_pixels, + const unsigned char *compact_pixels,const ssize_t depth, + const size_t number_pixels,unsigned char *pixels) +{ +#define CheckNumberCompactPixels \ + if (packets == 0) \ + return(i); \ + packets-- + +#define CheckNumberPixels(count) \ + if (((ssize_t) i + count) > (ssize_t) number_pixels) \ + return(i); \ + i+=count + + int + pixel; + + ssize_t + i, + j; + + size_t + length; + + ssize_t + packets; + + packets=(ssize_t) number_compact_pixels; + for (i=0; (packets > 1) && (i < (ssize_t) number_pixels); ) + { + packets--; + length=(size_t) (*compact_pixels++); + if (length == 128) + continue; + if (length > 128) + { + length=256-length+1; + CheckNumberCompactPixels; + pixel=(*compact_pixels++); + for (j=0; j < (ssize_t) length; j++) + { + switch (depth) + { + case 1: + { + CheckNumberPixels(8); + *pixels++=(pixel >> 7) & 0x01 ? 0U : 255U; + *pixels++=(pixel >> 6) & 0x01 ? 0U : 255U; + *pixels++=(pixel >> 5) & 0x01 ? 0U : 255U; + *pixels++=(pixel >> 4) & 0x01 ? 0U : 255U; + *pixels++=(pixel >> 3) & 0x01 ? 0U : 255U; + *pixels++=(pixel >> 2) & 0x01 ? 0U : 255U; + *pixels++=(pixel >> 1) & 0x01 ? 0U : 255U; + *pixels++=(pixel >> 0) & 0x01 ? 0U : 255U; + break; + } + case 2: + { + CheckNumberPixels(4); + *pixels++=(unsigned char) ((pixel >> 6) & 0x03); + *pixels++=(unsigned char) ((pixel >> 4) & 0x03); + *pixels++=(unsigned char) ((pixel >> 2) & 0x03); + *pixels++=(unsigned char) ((pixel & 0x03) & 0x03); + break; + } + case 4: + { + CheckNumberPixels(2); + *pixels++=(unsigned char) ((pixel >> 4) & 0xff); + *pixels++=(unsigned char) ((pixel & 0x0f) & 0xff); + break; + } + default: + { + CheckNumberPixels(1); + *pixels++=(unsigned char) pixel; + break; + } + } + } + continue; + } + length++; + for (j=0; j < (ssize_t) length; j++) + { + CheckNumberCompactPixels; + switch (depth) + { + case 1: + { + CheckNumberPixels(8); + *pixels++=(*compact_pixels >> 7) & 0x01 ? 0U : 255U; + *pixels++=(*compact_pixels >> 6) & 0x01 ? 0U : 255U; + *pixels++=(*compact_pixels >> 5) & 0x01 ? 0U : 255U; + *pixels++=(*compact_pixels >> 4) & 0x01 ? 0U : 255U; + *pixels++=(*compact_pixels >> 3) & 0x01 ? 0U : 255U; + *pixels++=(*compact_pixels >> 2) & 0x01 ? 0U : 255U; + *pixels++=(*compact_pixels >> 1) & 0x01 ? 0U : 255U; + *pixels++=(*compact_pixels >> 0) & 0x01 ? 0U : 255U; + break; + } + case 2: + { + CheckNumberPixels(4); + *pixels++=(*compact_pixels >> 6) & 0x03; + *pixels++=(*compact_pixels >> 4) & 0x03; + *pixels++=(*compact_pixels >> 2) & 0x03; + *pixels++=(*compact_pixels & 0x03) & 0x03; + break; + } + case 4: + { + CheckNumberPixels(2); + *pixels++=(*compact_pixels >> 4) & 0xff; + *pixels++=(*compact_pixels & 0x0f) & 0xff; + break; + } + default: + { + CheckNumberPixels(1); + *pixels++=(*compact_pixels); + break; + } + } + compact_pixels++; + } + } + return(i); +} + +static inline LayerInfo *DestroyLayerInfo(LayerInfo *layer_info, + const ssize_t number_layers) +{ + ssize_t + i; + + for (i=0; istorage_class == PseudoClass) + { + if (image->colors > 256) + return(2); + } + if (image->depth > 16) + return(4); + if (image->depth > 8) + return(2); + return(1); +} + +static inline MagickSizeType GetPSDSize(const PSDInfo *psd_info,Image *image) +{ + if (psd_info->version == 1) + return((MagickSizeType) ReadBlobLong(image)); + return((MagickSizeType) ReadBlobLongLong(image)); +} + +static inline size_t GetPSDRowSize(Image *image) +{ + if (image->depth == 1) + return(((image->columns+7)/8)*GetPSDPacketSize(image)); + else + return(image->columns*GetPSDPacketSize(image)); +} + +static const char *ModeToString(PSDImageType type) +{ + switch (type) + { + case BitmapMode: return "Bitmap"; + case GrayscaleMode: return "Grayscale"; + case IndexedMode: return "Indexed"; + case RGBMode: return "RGB"; + case CMYKMode: return "CMYK"; + case MultichannelMode: return "Multichannel"; + case DuotoneMode: return "Duotone"; + case LabMode: return "L*A*B"; + default: return "unknown"; + } +} + +static StringInfo *ParseImageResourceBlocks(Image *image, + const unsigned char *blocks,size_t length, + MagickBooleanType *has_merged_image) +{ + const unsigned char + *p; + + ssize_t + offset; + + StringInfo + *profile; + + unsigned char + name_length; + + unsigned int + count; + + unsigned short + id, + short_sans; + + if (length < 16) + return((StringInfo *) NULL); + profile=BlobToStringInfo((const void *) NULL,length); + SetStringInfoDatum(profile,blocks); + SetStringInfoName(profile,"8bim"); + for (p=blocks; (p >= blocks) && (p < (blocks+length-7)); ) + { + if (LocaleNCompare((const char *) p,"8BIM",4) != 0) + break; + p+=4; + p=PushShortPixel(MSBEndian,p,&id); + p=PushCharPixel(p,&name_length); + if ((name_length % 2) == 0) + name_length++; + p+=name_length; + if (p > (blocks+length-4)) + break; + p=PushLongPixel(MSBEndian,p,&count); + offset=(ssize_t) count; + if (((p+offset) < blocks) || ((p+offset) > (blocks+length))) + break; + switch (id) + { + case 0x03ed: + { + char + value[MaxTextExtent]; + + unsigned short + resolution; + + /* + Resolution info. + */ + if (offset < 16) + break; + p=PushShortPixel(MSBEndian,p,&resolution); + image->x_resolution=(double) resolution; + (void) FormatLocaleString(value,MaxTextExtent,"%g", + image->x_resolution); + (void) SetImageProperty(image,"tiff:XResolution",value); + p=PushShortPixel(MSBEndian,p,&short_sans); + p=PushShortPixel(MSBEndian,p,&short_sans); + p=PushShortPixel(MSBEndian,p,&short_sans); + p=PushShortPixel(MSBEndian,p,&resolution); + image->y_resolution=(double) resolution; + (void) FormatLocaleString(value,MaxTextExtent,"%g", + image->y_resolution); + (void) SetImageProperty(image,"tiff:YResolution",value); + p=PushShortPixel(MSBEndian,p,&short_sans); + p=PushShortPixel(MSBEndian,p,&short_sans); + p=PushShortPixel(MSBEndian,p,&short_sans); + image->units=PixelsPerInchResolution; + break; + } + case 0x0421: + { + if ((offset > 4) && (*(p+4) == 0)) + *has_merged_image=MagickFalse; + p+=offset; + break; + } + default: + { + p+=offset; + break; + } + } + if ((offset & 0x01) != 0) + p++; + } + return(profile); +} + +static CompositeOperator PSDBlendModeToCompositeOperator(const char *mode) +{ + if (mode == (const char *) NULL) + return(OverCompositeOp); + if (LocaleNCompare(mode,"norm",4) == 0) + return(OverCompositeOp); + if (LocaleNCompare(mode,"mul ",4) == 0) + return(MultiplyCompositeOp); + if (LocaleNCompare(mode,"diss",4) == 0) + return(DissolveCompositeOp); + if (LocaleNCompare(mode,"diff",4) == 0) + return(DifferenceCompositeOp); + if (LocaleNCompare(mode,"dark",4) == 0) + return(DarkenCompositeOp); + if (LocaleNCompare(mode,"lite",4) == 0) + return(LightenCompositeOp); + if (LocaleNCompare(mode,"hue ",4) == 0) + return(HueCompositeOp); + if (LocaleNCompare(mode,"sat ",4) == 0) + return(SaturateCompositeOp); + if (LocaleNCompare(mode,"colr",4) == 0) + return(ColorizeCompositeOp); + if (LocaleNCompare(mode,"lum ",4) == 0) + return(LuminizeCompositeOp); + if (LocaleNCompare(mode,"scrn",4) == 0) + return(ScreenCompositeOp); + if (LocaleNCompare(mode,"over",4) == 0) + return(OverlayCompositeOp); + if (LocaleNCompare(mode,"hLit",4) == 0) + return(HardLightCompositeOp); + if (LocaleNCompare(mode,"sLit",4) == 0) + return(SoftLightCompositeOp); + if (LocaleNCompare(mode,"smud",4) == 0) + return(ExclusionCompositeOp); + if (LocaleNCompare(mode,"div ",4) == 0) + return(ColorDodgeCompositeOp); + if (LocaleNCompare(mode,"idiv",4) == 0) + return(ColorBurnCompositeOp); + if (LocaleNCompare(mode,"lbrn",4) == 0) + return(LinearBurnCompositeOp); + if (LocaleNCompare(mode,"lddg",4) == 0) + return(LinearDodgeCompositeOp); + if (LocaleNCompare(mode,"lLit",4) == 0) + return(LinearLightCompositeOp); + if (LocaleNCompare(mode,"vLit",4) == 0) + return(VividLightCompositeOp); + if (LocaleNCompare(mode,"pLit",4) == 0) + return(PinLightCompositeOp); + if (LocaleNCompare(mode,"hMix",4) == 0) + return(HardMixCompositeOp); + return(OverCompositeOp); +} + +static inline ssize_t ReadPSDString(Image *image,char *p,const size_t length) +{ + ssize_t + count; + + count=ReadBlob(image,length,(unsigned char *) p); + if ((count == (ssize_t) length) && (image->endian != MSBEndian)) + { + char + *q; + + q=p+length; + for(--q; p < q; ++p, --q) + { + *p = *p ^ *q, + *q = *p ^ *q, + *p = *p ^ *q; + } + } + return(count); +} + +static inline void SetPSDPixel(Image *image,const size_t channels, + const ssize_t type,const size_t packet_size,const Quantum pixel,PixelPacket *q, + IndexPacket *indexes,ssize_t x) +{ + if (image->storage_class == PseudoClass) + { + PixelPacket + *color; + + IndexPacket + index; + + index=(IndexPacket) pixel; + if (packet_size == 1) + index=(IndexPacket) ScaleQuantumToChar(index); + index=ConstrainColormapIndex(image,(ssize_t) index); + + if (type == 0) + SetPixelIndex(indexes+x,index); + if ((type == 0) && (channels > 1)) + return; + color=image->colormap+(ssize_t) GetPixelIndex(indexes+x); + if (type != 0) + SetPixelAlpha(color,pixel); + SetPixelRGBO(q,color); + return; + } + switch (type) + { + case -1: + { + SetPixelAlpha(q,pixel); + break; + } + case -2: + case 0: + { + SetPixelRed(q,pixel); + if ((channels < 3) || (type == -2)) + { + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + } + break; + } + case -3: + case 1: + { + SetPixelGreen(q,pixel); + break; + } + case -4: + case 2: + { + SetPixelBlue(q,pixel); + break; + } + case 3: + { + if (image->colorspace == CMYKColorspace) + SetPixelIndex(indexes+x,pixel); + else + if (image->matte != MagickFalse) + SetPixelAlpha(q,pixel); + break; + } + case 4: + { + if ((IssRGBCompatibleColorspace(image->colorspace) != MagickFalse) && + (channels > 3)) + break; + if (image->matte != MagickFalse) + SetPixelAlpha(q,pixel); + break; + } + } +} + +static MagickBooleanType ReadPSDChannelPixels(Image *image, + const size_t channels,const ssize_t row,const ssize_t type, + const unsigned char *pixels,ExceptionInfo *exception) +{ + Quantum + pixel; + + const unsigned char + *p; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + x; + + size_t + packet_size; + + unsigned short + nibble; + + p=pixels; + q=GetAuthenticPixels(image,0,row,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + return MagickFalse; + indexes=GetAuthenticIndexQueue(image); + packet_size=GetPSDPacketSize(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + if (packet_size == 1) + pixel=ScaleCharToQuantum(*p++); + else + if (packet_size == 2) + { + p=PushShortPixel(MSBEndian,p,&nibble); + pixel=ScaleShortToQuantum(nibble); + } + else + { + MagickFloatType + nibble; + + p=PushFloatPixel(MSBEndian,p,&nibble); + pixel=ClampToQuantum((MagickRealType)QuantumRange*nibble); + } + if (image->depth > 1) + { + SetPSDPixel(image,channels,type,packet_size,pixel,q,indexes,x); + q++; + } + else + { + ssize_t + bit, + number_bits; + + number_bits=(ssize_t) image->columns-x; + if (number_bits > 8) + number_bits=8; + for (bit=0; bit < number_bits; bit++) + { + SetPSDPixel(image,channels,type,packet_size, + (((unsigned char) ((ssize_t) pixel)) & (0x01 << (7-bit))) != 0 ? 0 : + QuantumRange,q++,indexes,x++); + } + if (x != (ssize_t) image->columns) + x--; + continue; + } + } + return(SyncAuthenticPixels(image,exception)); +} + +static MagickBooleanType ReadPSDChannelRaw(Image *image,const size_t channels, + const ssize_t type,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + size_t + row_size; + + ssize_t + count, + y; + + unsigned char + *pixels; + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " layer data is RAW"); + + row_size=GetPSDRowSize(image); + pixels=(unsigned char *) AcquireQuantumMemory(row_size,sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + (void) memset(pixels,0,row_size*sizeof(*pixels)); + status=MagickTrue; + for (y=0; y < (ssize_t) image->rows; y++) + { + status=MagickFalse; + + count=ReadBlob(image,row_size,pixels); + if (count != (ssize_t) row_size) + { + status=MagickFalse; + break; + } + + status=ReadPSDChannelPixels(image,channels,y,type,pixels,exception); + if (status == MagickFalse) + break; + } + + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + return(status); +} + +static inline MagickOffsetType *ReadPSDRLESizes(Image *image, + const PSDInfo *psd_info,const size_t size) +{ + MagickOffsetType + *sizes; + + ssize_t + y; + + sizes=(MagickOffsetType *) AcquireQuantumMemory(size,sizeof(*sizes)); + if(sizes != (MagickOffsetType *) NULL) + { + for (y=0; y < (ssize_t) size; y++) + { + if (psd_info->version == 1) + sizes[y]=(MagickOffsetType) ReadBlobShort(image); + else + sizes[y]=(MagickOffsetType) ReadBlobLong(image); + } + } + return sizes; +} + +static MagickBooleanType ReadPSDChannelRLE(Image *image,const PSDInfo *psd_info, + const ssize_t type,MagickOffsetType *sizes,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + size_t + length, + row_size; + + ssize_t + count, + y; + + unsigned char + *compact_pixels, + *pixels; + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " layer data is RLE compressed"); + + row_size=GetPSDRowSize(image); + pixels=(unsigned char *) AcquireQuantumMemory(row_size,sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + + length=0; + for (y=0; y < (ssize_t) image->rows; y++) + if ((MagickOffsetType) length < sizes[y]) + length=(size_t) sizes[y]; + + if (length > (row_size+2048)) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowBinaryException(ResourceLimitError,"InvalidLength",image->filename); + } + + compact_pixels=(unsigned char *) AcquireQuantumMemory(length,sizeof(*pixels)); + if (compact_pixels == (unsigned char *) NULL) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + + (void) memset(compact_pixels,0,length*sizeof(*compact_pixels)); + + status=MagickTrue; + for (y=0; y < (ssize_t) image->rows; y++) + { + status=MagickFalse; + + count=ReadBlob(image,(size_t) sizes[y],compact_pixels); + if (count != (ssize_t) sizes[y]) + break; + + count=DecodePSDPixels((size_t) sizes[y],compact_pixels, + (ssize_t) (image->depth == 1 ? 123456 : image->depth),row_size,pixels); + if (count != (ssize_t) row_size) + break; + + status=ReadPSDChannelPixels(image,psd_info->channels,y,type,pixels, + exception); + if (status == MagickFalse) + break; + } + + compact_pixels=(unsigned char *) RelinquishMagickMemory(compact_pixels); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + return(status); +} + +#ifdef MAGICKCORE_ZLIB_DELEGATE +static MagickBooleanType ReadPSDChannelZip(Image *image,const size_t channels, + const ssize_t type,const PSDCompressionType compression, + const size_t compact_size,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + unsigned char + *p; + + size_t + count, + length, + packet_size, + row_size; + + ssize_t + y; + + unsigned char + *compact_pixels, + *pixels; + + z_stream + stream; + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " layer data is ZIP compressed"); + + if ((MagickSizeType) compact_size > GetBlobSize(image)) + ThrowBinaryException(CorruptImageError,"UnexpectedEndOfFile", + image->filename); + compact_pixels=(unsigned char *) AcquireQuantumMemory(compact_size, + sizeof(*compact_pixels)); + if (compact_pixels == (unsigned char *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + + packet_size=GetPSDPacketSize(image); + row_size=image->columns*packet_size; + count=image->rows*row_size; + + pixels=(unsigned char *) AcquireQuantumMemory(count,sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + { + compact_pixels=(unsigned char *) RelinquishMagickMemory(compact_pixels); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + if (ReadBlob(image,compact_size,compact_pixels) != (ssize_t) compact_size) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + compact_pixels=(unsigned char *) RelinquishMagickMemory(compact_pixels); + ThrowBinaryException(CorruptImageError,"UnexpectedEndOfFile", + image->filename); + } + + memset(&stream,0,sizeof(stream)); + stream.data_type=Z_BINARY; + stream.next_in=(Bytef *)compact_pixels; + stream.avail_in=(uInt) compact_size; + stream.next_out=(Bytef *)pixels; + stream.avail_out=(uInt) count; + + if (inflateInit(&stream) == Z_OK) + { + int + ret; + + while (stream.avail_out > 0) + { + ret=inflate(&stream,Z_SYNC_FLUSH); + if ((ret != Z_OK) && (ret != Z_STREAM_END)) + { + (void) inflateEnd(&stream); + compact_pixels=(unsigned char *) RelinquishMagickMemory( + compact_pixels); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + return(MagickFalse); + } + if (ret == Z_STREAM_END) + break; + } + (void) inflateEnd(&stream); + } + + if (compression == ZipWithPrediction) + { + p=pixels; + while (count > 0) + { + length=image->columns; + while (--length) + { + if (packet_size == 2) + { + p[2]+=p[0]+((p[1]+p[3]) >> 8); + p[3]+=p[1]; + } + else + *(p+1)+=*p; + p+=packet_size; + } + p+=packet_size; + count-=row_size; + } + } + + status=MagickTrue; + p=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + status=ReadPSDChannelPixels(image,channels,y,type,p,exception); + if (status == MagickFalse) + break; + + p+=row_size; + } + + compact_pixels=(unsigned char *) RelinquishMagickMemory(compact_pixels); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + return(status); +} +#endif + +static MagickBooleanType ReadPSDChannel(Image *image, + const ImageInfo *image_info,const PSDInfo *psd_info,LayerInfo* layer_info, + const size_t channel,const PSDCompressionType compression, + ExceptionInfo *exception) +{ + Image + *channel_image, + *mask; + + MagickOffsetType + offset; + + MagickBooleanType + status; + + channel_image=image; + mask=(Image *) NULL; + if ((layer_info->channel_info[channel].type < -1) && + (layer_info->mask.page.width > 0) && (layer_info->mask.page.height > 0)) + { + const char + *option; + + /* + Ignore mask that is not a user supplied layer mask, if the mask is + disabled or if the flags have unsupported values. + */ + option=GetImageOption(image_info,"psd:preserve-opacity-mask"); + if ((layer_info->channel_info[channel].type != -2) || + (layer_info->mask.flags > 2) || ((layer_info->mask.flags & 0x02) && + (IsStringTrue(option) == MagickFalse))) + { + (void) SeekBlob(image,(MagickOffsetType) + (layer_info->channel_info[channel].size-2),SEEK_CUR); + return(MagickTrue); + } + mask=CloneImage(image,layer_info->mask.page.width, + layer_info->mask.page.height,MagickFalse,exception); + if (mask != (Image *) NULL) + { + (void) ResetImagePixels(mask,exception); + mask->matte=MagickFalse; + channel_image=mask; + } + } + + offset=TellBlob(image); + status=MagickFalse; + switch(compression) + { + case Raw: + status=ReadPSDChannelRaw(channel_image,psd_info->channels, + (ssize_t) layer_info->channel_info[channel].type,exception); + break; + case RLE: + { + MagickOffsetType + *sizes; + + sizes=ReadPSDRLESizes(channel_image,psd_info,channel_image->rows); + if (sizes == (MagickOffsetType *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + status=ReadPSDChannelRLE(channel_image,psd_info, + (ssize_t) layer_info->channel_info[channel].type,sizes,exception); + sizes=(MagickOffsetType *) RelinquishMagickMemory(sizes); + } + break; + case ZipWithPrediction: + case ZipWithoutPrediction: +#ifdef MAGICKCORE_ZLIB_DELEGATE + status=ReadPSDChannelZip(channel_image,layer_info->channels, + (ssize_t) layer_info->channel_info[channel].type,compression, + layer_info->channel_info[channel].size-2,exception); +#else + (void) ThrowMagickException(exception,GetMagickModule(), + MissingDelegateWarning,"DelegateLibrarySupportNotBuiltIn", + "'%s' (ZLIB)",image->filename); +#endif + break; + default: + (void) ThrowMagickException(exception,GetMagickModule(),TypeWarning, + "CompressionNotSupported","'%.20g'",(double) compression); + break; + } + + (void) SeekBlob(image,offset+layer_info->channel_info[channel].size-2, + SEEK_SET); + if (status == MagickFalse) + { + if (mask != (Image *) NULL) + (void) DestroyImage(mask); + ThrowBinaryException(CoderError,"UnableToDecompressImage", + image->filename); + } + if (mask != (Image *) NULL) + { + if (layer_info->mask.image != (Image *) NULL) + layer_info->mask.image=DestroyImage(layer_info->mask.image); + layer_info->mask.image=mask; + } + return(status); +} + +static MagickBooleanType ReadPSDLayer(Image *image,const ImageInfo *image_info, + const PSDInfo *psd_info,LayerInfo* layer_info,ExceptionInfo *exception) +{ + char + message[MaxTextExtent]; + + MagickBooleanType + status; + + PSDCompressionType + compression; + + ssize_t + j; + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " setting up new layer image"); + if (psd_info->mode != IndexedMode) + (void) SetImageBackgroundColor(layer_info->image); + layer_info->image->compose=PSDBlendModeToCompositeOperator( + layer_info->blendkey); + if (layer_info->visible == MagickFalse) + { + layer_info->image->compose=NoCompositeOp; + (void) SetImageArtifact(layer_info->image,"psd:layer.invisible","true"); + } + if (psd_info->mode == CMYKMode) + (void) SetImageColorspace(layer_info->image,CMYKColorspace); + else if ((psd_info->mode == BitmapMode) || (psd_info->mode == DuotoneMode) || + (psd_info->mode == GrayscaleMode)) + (void) SetImageColorspace(layer_info->image,GRAYColorspace); + /* + Set up some hidden attributes for folks that need them. + */ + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", + (double) layer_info->page.x); + (void) SetImageArtifact(layer_info->image,"psd:layer.x",message); + (void) FormatLocaleString(message,MaxTextExtent,"%.20g", + (double) layer_info->page.y); + (void) SetImageArtifact(layer_info->image,"psd:layer.y",message); + (void) FormatLocaleString(message,MaxTextExtent,"%.20g",(double) + layer_info->opacity); + (void) SetImageArtifact(layer_info->image,"psd:layer.opacity",message); + (void) SetImageProperty(layer_info->image,"label",(char *) layer_info->name); + + status=MagickTrue; + for (j=0; j < (ssize_t) layer_info->channels; j++) + { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " reading data for channel %.20g",(double) j); + + compression=(PSDCompressionType) ReadBlobShort(layer_info->image); + if ((compression == ZipWithPrediction) && (image->depth == 32)) + { + (void) ThrowMagickException(exception,GetMagickModule(), + TypeError,"CompressionNotSupported","ZipWithPrediction(32 bit)"); + return(MagickFalse); + } + + layer_info->image->compression=ConvertPSDCompression(compression); + if (layer_info->channel_info[j].type == -1) + layer_info->image->matte=MagickTrue; + + status=ReadPSDChannel(layer_info->image,image_info,psd_info,layer_info, + (size_t) j,compression,exception); + InheritException(exception,&layer_info->image->exception); + + if (status == MagickFalse) + break; + } + + if (status != MagickFalse) + status=ApplyPSDLayerOpacity(layer_info->image,layer_info->opacity, + MagickFalse,exception); + + if ((status != MagickFalse) && + (layer_info->image->colorspace == CMYKColorspace)) + status=NegateImage(layer_info->image,MagickFalse); + + if ((status != MagickFalse) && (layer_info->mask.image != (Image *) NULL)) + { + const char + *option; + + layer_info->mask.image->page.x=layer_info->mask.page.x; + layer_info->mask.image->page.y=layer_info->mask.page.y; + /* Do not composite the mask when it is disabled */ + if ((layer_info->mask.flags & 0x02) == 0x02) + layer_info->mask.image->compose=NoCompositeOp; + else + status=ApplyPSDOpacityMask(layer_info->image,layer_info->mask.image, + layer_info->mask.background == 0 ? 0 : QuantumRange,MagickFalse, + exception); + option=GetImageOption(image_info,"psd:preserve-opacity-mask"); + if (IsStringTrue(option) != MagickFalse) + PreservePSDOpacityMask(image,layer_info,exception); + layer_info->mask.image=DestroyImage(layer_info->mask.image); + } + + return(status); +} + +static MagickBooleanType CheckPSDChannels(const Image *image, + const PSDInfo *psd_info,LayerInfo *layer_info) +{ + int + channel_type; + + size_t + blob_size; + + ssize_t + i; + + if (layer_info->channels < psd_info->min_channels) + return(MagickFalse); + channel_type=RedChannel; + if (psd_info->min_channels >= 3) + channel_type|=(GreenChannel | BlueChannel); + if (psd_info->min_channels >= 4) + channel_type|=BlackChannel; + blob_size=(size_t) GetBlobSize(image); + for (i=0; i < (ssize_t) layer_info->channels; i++) + { + short + type; + + if (layer_info->channel_info[i].size >= blob_size) + return(MagickFalse); + type=layer_info->channel_info[i].type; + if ((i == 0) && (psd_info->mode == IndexedMode) && (type != 0)) + return(MagickFalse); + if (type == -1) + { + channel_type|=AlphaChannel; + continue; + } + if (type < -1) + continue; + if (type == 0) + channel_type&=~RedChannel; + else if (type == 1) + channel_type&=~GreenChannel; + else if (type == 2) + channel_type&=~BlueChannel; + else if (type == 3) + channel_type&=~BlackChannel; + } + if (channel_type == 0) + return(MagickTrue); + if ((channel_type == AlphaChannel) && + (layer_info->channels >= psd_info->min_channels + 1)) + return(MagickTrue); + return(MagickFalse); +} + +static inline void CheckMergedImageAlpha(const PSDInfo *psd_info,Image *image) +{ + /* + The number of layers cannot be used to determine if the merged image + contains an alpha channel. So we enable it when we think we should. + */ + if (((psd_info->mode == GrayscaleMode) && (psd_info->channels > 1)) || + ((psd_info->mode == RGBMode) && (psd_info->channels > 3)) || + ((psd_info->mode == CMYKMode) && (psd_info->channels > 4))) + image->matte=MagickTrue; +} + +static MagickSizeType GetLayerInfoSize(const PSDInfo *psd_info,Image *image) +{ + char + type[4]; + + MagickSizeType + size; + + ssize_t + count; + + size=GetPSDSize(psd_info,image); + if (size != 0) + return(size); + (void) ReadBlobLong(image); + count=ReadPSDString(image,type,4); + if ((count != 4) || (LocaleNCompare(type,"8BIM",4) != 0)) + return(0); + count=ReadPSDString(image,type,4); + if ((count == 4) && ((LocaleNCompare(type,"Mt16",4) == 0) || + (LocaleNCompare(type,"Mt32",4) == 0) || + (LocaleNCompare(type,"Mtrn",4) == 0))) + { + size=GetPSDSize(psd_info,image); + if (size != 0) + return(0); + image->matte=MagickTrue; + count=ReadPSDString(image,type,4); + if ((count != 4) || (LocaleNCompare(type,"8BIM",4) != 0)) + return(0); + count=ReadPSDString(image,type,4); + } + if ((count == 4) && ((LocaleNCompare(type,"Lr16",4) == 0) || + (LocaleNCompare(type,"Lr32",4) == 0))) + size=GetPSDSize(psd_info,image); + return(size); +} + +static MagickBooleanType ReadPSDLayersInternal(Image *image, + const ImageInfo *image_info,const PSDInfo *psd_info, + const MagickBooleanType skip_layers,ExceptionInfo *exception) +{ + char + type[4]; + + LayerInfo + *layer_info; + + MagickSizeType + size; + + MagickBooleanType + status; + + ssize_t + i; + + ssize_t + count, + j, + number_layers; + + size=GetLayerInfoSize(psd_info,image); + status=MagickTrue; + if (size != 0) + { + layer_info=(LayerInfo *) NULL; + number_layers=(ssize_t) ReadBlobSignedShort(image); + + if (number_layers < 0) + { + /* + The first alpha channel in the merged result contains the + transparency data for the merged result. + */ + number_layers=MagickAbsoluteValue(number_layers); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " negative layer count corrected for"); + image->matte=MagickTrue; + } + + /* + We only need to know if the image has an alpha channel + */ + if (skip_layers != MagickFalse) + return(MagickTrue); + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image contains %.20g layers",(double) number_layers); + + if (number_layers == 0) + ThrowBinaryException(CorruptImageError,"InvalidNumberOfLayers", + image->filename); + + layer_info=(LayerInfo *) AcquireQuantumMemory((size_t) number_layers, + sizeof(*layer_info)); + if (layer_info == (LayerInfo *) NULL) + { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " allocation of LayerInfo failed"); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + (void) memset(layer_info,0,(size_t) number_layers*sizeof(*layer_info)); + + for (i=0; i < number_layers; i++) + { + ssize_t + top, + left, + bottom, + right; + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " reading layer #%.20g",(double) i+1); + top=(ssize_t) ReadBlobSignedLong(image); + left=(ssize_t) ReadBlobSignedLong(image); + bottom=(ssize_t) ReadBlobSignedLong(image); + right=(ssize_t) ReadBlobSignedLong(image); + if ((right < left) || (bottom < top)) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError,"ImproperImageHeader", + image->filename); + } + layer_info[i].page.y=top; + layer_info[i].page.x=left; + layer_info[i].page.width=(size_t) (right-left); + layer_info[i].page.height=(size_t) (bottom-top); + layer_info[i].channels=ReadBlobShort(image); + if (layer_info[i].channels > MaxPSDChannels) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError,"MaximumChannelsExceeded", + image->filename); + } + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " offset(%.20g,%.20g), size(%.20g,%.20g), channels=%.20g", + (double) layer_info[i].page.x,(double) layer_info[i].page.y, + (double) layer_info[i].page.height,(double) + layer_info[i].page.width,(double) layer_info[i].channels); + for (j=0; j < (ssize_t) layer_info[i].channels; j++) + { + layer_info[i].channel_info[j].type=(short) ReadBlobShort(image); + if ((layer_info[i].channel_info[j].type < -4) || + (layer_info[i].channel_info[j].type > 4)) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError,"NoSuchImageChannel", + image->filename); + } + layer_info[i].channel_info[j].size=(size_t) GetPSDSize(psd_info, + image); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " channel[%.20g]: type=%.20g, size=%.20g",(double) j, + (double) layer_info[i].channel_info[j].type, + (double) layer_info[i].channel_info[j].size); + } + if (CheckPSDChannels(image,psd_info,&layer_info[i]) == MagickFalse) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError,"ImproperImageHeader", + image->filename); + } + count=ReadPSDString(image,type,4); + if ((count != 4) || (LocaleNCompare(type,"8BIM",4) != 0)) + { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " layer type was %.4s instead of 8BIM", type); + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError,"ImproperImageHeader", + image->filename); + } + count=ReadPSDString(image,layer_info[i].blendkey,4); + if (count != 4) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError,"ImproperImageHeader", + image->filename); + } + layer_info[i].opacity=(Quantum) ScaleCharToQuantum((unsigned char) + ReadBlobByte(image)); + layer_info[i].clipping=(unsigned char) ReadBlobByte(image); + layer_info[i].flags=(unsigned char) ReadBlobByte(image); + layer_info[i].visible=!(layer_info[i].flags & 0x02); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " blend=%.4s, opacity=%.20g, clipping=%s, flags=%d, visible=%s", + layer_info[i].blendkey,(double) layer_info[i].opacity, + layer_info[i].clipping ? "true" : "false",layer_info[i].flags, + layer_info[i].visible ? "true" : "false"); + (void) ReadBlobByte(image); /* filler */ + + size=ReadBlobLong(image); + if (size != 0) + { + MagickSizeType + combined_length, + length; + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " layer contains additional info"); + length=ReadBlobLong(image); + combined_length=length+4; + if (length != 0) + { + /* + Layer mask info. + */ + layer_info[i].mask.page.y=(ssize_t) ReadBlobSignedLong(image); + layer_info[i].mask.page.x=(ssize_t) ReadBlobSignedLong(image); + layer_info[i].mask.page.height=(size_t) ( + ReadBlobSignedLong(image)-layer_info[i].mask.page.y); + layer_info[i].mask.page.width=(size_t) ( + ReadBlobSignedLong(image)-layer_info[i].mask.page.x); + layer_info[i].mask.background=(unsigned char) ReadBlobByte( + image); + layer_info[i].mask.flags=(unsigned char) ReadBlobByte(image); + if (!(layer_info[i].mask.flags & 0x01)) + { + layer_info[i].mask.page.y=layer_info[i].mask.page.y- + layer_info[i].page.y; + layer_info[i].mask.page.x=layer_info[i].mask.page.x- + layer_info[i].page.x; + } + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " layer mask: offset(%.20g,%.20g), size(%.20g,%.20g), length=%.20g", + (double) layer_info[i].mask.page.x,(double) + layer_info[i].mask.page.y,(double) layer_info[i].mask.page.width, + (double) layer_info[i].mask.page.height,(double) + ((MagickOffsetType) length)-18); + /* + Skip over the rest of the layer mask information. + */ + if (DiscardBlobBytes(image,(MagickSizeType) (length-18)) == MagickFalse) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError,"UnexpectedEndOfFile", + image->filename); + } + } + length=ReadBlobLong(image); + combined_length+=length+4; + if (length != 0) + { + /* + Layer blending ranges info. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " layer blending ranges: length=%.20g",(double) + ((MagickOffsetType) length)); + if (DiscardBlobBytes(image,length) == MagickFalse) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError, + "UnexpectedEndOfFile",image->filename); + } + } + /* + Layer name. + */ + length=(MagickSizeType) (unsigned char) ReadBlobByte(image); + combined_length+=length+1; + if (length > 0) + (void) ReadBlob(image,(size_t) length++,layer_info[i].name); + layer_info[i].name[length]='\0'; + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " layer name: %s",layer_info[i].name); + if ((length % 4) != 0) + { + length=4-(length % 4); + combined_length+=length; + /* Skip over the padding of the layer name */ + if (DiscardBlobBytes(image,length) == MagickFalse) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError, + "UnexpectedEndOfFile",image->filename); + } + } + length=(MagickSizeType) size-combined_length; + if (length > 0) + { + unsigned char + *info; + + if (length > GetBlobSize(image)) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError, + "InsufficientImageDataInFile",image->filename); + } + layer_info[i].info=AcquireStringInfo((const size_t) length); + info=GetStringInfoDatum(layer_info[i].info); + (void) ReadBlob(image,(const size_t) length,info); + } + } + } + + for (i=0; i < number_layers; i++) + { + if ((layer_info[i].page.width == 0) || + (layer_info[i].page.height == 0)) + { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " layer data is empty"); + if (layer_info[i].info != (StringInfo *) NULL) + layer_info[i].info=DestroyStringInfo(layer_info[i].info); + continue; + } + /* + Allocate layered image. + */ + layer_info[i].image=CloneImage(image,layer_info[i].page.width, + layer_info[i].page.height,MagickFalse,exception); + if (layer_info[i].image == (Image *) NULL) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " allocation of image for layer %.20g failed",(double) i); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + if (layer_info[i].info != (StringInfo *) NULL) + { + (void) SetImageProfile(layer_info[i].image,"psd:additional-info", + layer_info[i].info); + layer_info[i].info=DestroyStringInfo(layer_info[i].info); + } + } + + if (image_info->ping == MagickFalse) + { + for (i=0; i < number_layers; i++) + { + if (layer_info[i].image == (Image *) NULL) + { + for (j=0; j < (ssize_t) layer_info[i].channels; j++) + { + if (DiscardBlobBytes(image,(MagickSizeType) + layer_info[i].channel_info[j].size) == MagickFalse) + { + layer_info=DestroyLayerInfo(layer_info,number_layers); + ThrowBinaryException(CorruptImageError, + "UnexpectedEndOfFile",image->filename); + } + } + continue; + } + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " reading data for layer %.20g",(double) i); + status=ReadPSDLayer(image,image_info,psd_info,&layer_info[i], + exception); + if (status == MagickFalse) + break; + + status=SetImageProgress(image,LoadImagesTag,(MagickOffsetType) i, + (MagickSizeType) number_layers); + if (status == MagickFalse) + break; + } + } + + if (status != MagickFalse) + { + for (i=0; i < number_layers; i++) + { + if (layer_info[i].image == (Image *) NULL) + { + for (j=i; j < number_layers - 1; j++) + layer_info[j] = layer_info[j+1]; + number_layers--; + i--; + } + } + + if (number_layers > 0) + { + for (i=0; i < number_layers; i++) + { + if (i > 0) + layer_info[i].image->previous=layer_info[i-1].image; + if (i < (number_layers-1)) + layer_info[i].image->next=layer_info[i+1].image; + layer_info[i].image->page=layer_info[i].page; + } + image->next=layer_info[0].image; + layer_info[0].image->previous=image; + } + layer_info=(LayerInfo *) RelinquishMagickMemory(layer_info); + } + else + layer_info=DestroyLayerInfo(layer_info,number_layers); + } + + return(status); +} + +ModuleExport MagickBooleanType ReadPSDLayers(Image *image, + const ImageInfo *image_info,const PSDInfo *psd_info, + const MagickBooleanType skip_layers,ExceptionInfo *exception) +{ + PolicyDomain + domain; + + PolicyRights + rights; + + domain=CoderPolicyDomain; + rights=ReadPolicyRights; + if (IsRightsAuthorized(domain,rights,"PSD") == MagickFalse) + return(MagickFalse); + return(ReadPSDLayersInternal(image,image_info,psd_info,skip_layers, + exception)); +} + +static MagickBooleanType ReadPSDMergedImage(const ImageInfo *image_info, + Image* image,const PSDInfo* psd_info,ExceptionInfo *exception) +{ + MagickOffsetType + *sizes; + + MagickBooleanType + status; + + PSDCompressionType + compression; + + ssize_t + i; + + compression=(PSDCompressionType) ReadBlobMSBShort(image); + image->compression=ConvertPSDCompression(compression); + + if (compression != Raw && compression != RLE) + { + (void) ThrowMagickException(exception,GetMagickModule(), + TypeWarning,"CompressionNotSupported","'%.20g'",(double) compression); + return(MagickFalse); + } + + sizes=(MagickOffsetType *) NULL; + if (compression == RLE) + { + sizes=ReadPSDRLESizes(image,psd_info,image->rows*psd_info->channels); + if (sizes == (MagickOffsetType *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + + status=MagickTrue; + for (i=0; i < (ssize_t) psd_info->channels; i++) + { + ssize_t + type; + + type=i; + if ((type == 1) && (psd_info->channels == 2)) + type=-1; + + if (compression == RLE) + status=ReadPSDChannelRLE(image,psd_info,type,sizes+(i*image->rows), + exception); + else + status=ReadPSDChannelRaw(image,psd_info->channels,type,exception); + + if (status != MagickFalse) + status=SetImageProgress(image,LoadImagesTag,(MagickOffsetType) i, + psd_info->channels); + + if (status == MagickFalse) + break; + } + + if ((status != MagickFalse) && (image->colorspace == CMYKColorspace)) + status=NegateImage(image,MagickFalse); + + if (status != MagickFalse) + status=CorrectPSDAlphaBlend(image_info,image,exception); + + sizes=(MagickOffsetType *) RelinquishMagickMemory(sizes); + + return(status); +} + +static Image *ReadPSDImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + has_merged_image, + skip_layers; + + MagickOffsetType + offset; + + MagickSizeType + length; + + MagickBooleanType + status; + + PSDInfo + psd_info; + + ssize_t + i; + + size_t + image_list_length; + + ssize_t + count; + + StringInfo + *profile; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read image header. + */ + image->endian=MSBEndian; + count=ReadBlob(image,4,(unsigned char *) psd_info.signature); + psd_info.version=ReadBlobMSBShort(image); + if ((count != 4) || (LocaleNCompare(psd_info.signature,"8BPS",4) != 0) || + ((psd_info.version != 1) && (psd_info.version != 2))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + (void) ReadBlob(image,6,psd_info.reserved); + psd_info.channels=ReadBlobMSBShort(image); + if (psd_info.channels < 1) + ThrowReaderException(CorruptImageError,"MissingImageChannel"); + if (psd_info.channels > MaxPSDChannels) + ThrowReaderException(CorruptImageError,"MaximumChannelsExceeded"); + psd_info.rows=ReadBlobMSBLong(image); + psd_info.columns=ReadBlobMSBLong(image); + if ((psd_info.version == 1) && ((psd_info.rows > 30000) || + (psd_info.columns > 30000))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + psd_info.depth=ReadBlobMSBShort(image); + if ((psd_info.depth != 1) && (psd_info.depth != 8) && + (psd_info.depth != 16) && (psd_info.depth != 32)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + psd_info.mode=ReadBlobMSBShort(image); + if ((psd_info.mode == IndexedMode) && (psd_info.channels > 3)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Image is %.20g x %.20g with channels=%.20g, depth=%.20g, mode=%s", + (double) psd_info.columns,(double) psd_info.rows,(double) + psd_info.channels,(double) psd_info.depth,ModeToString((PSDImageType) + psd_info.mode)); + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + /* + Initialize image. + */ + image->depth=psd_info.depth; + image->columns=psd_info.columns; + image->rows=psd_info.rows; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + psd_info.min_channels=3; + switch (psd_info.mode) + { + case LabMode: + { + (void) SetImageColorspace(image,LabColorspace); + break; + } + case CMYKMode: + { + psd_info.min_channels=4; + (void) SetImageColorspace(image,CMYKColorspace); + break; + } + case BitmapMode: + case GrayscaleMode: + case DuotoneMode: + { + if (psd_info.depth != 32) + { + status=AcquireImageColormap(image,MagickMin((size_t) + (psd_info.depth < 16 ? 256 : 65536), MaxColormapSize)); + if (status == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Image colormap allocated"); + } + psd_info.min_channels=1; + (void) SetImageColorspace(image,GRAYColorspace); + break; + } + case IndexedMode: + { + psd_info.min_channels=1; + break; + } + case MultichannelMode: + { + if ((psd_info.channels > 0) && (psd_info.channels < 3)) + { + psd_info.min_channels=psd_info.channels; + (void) SetImageColorspace(image,GRAYColorspace); + } + break; + } + } + if (psd_info.channels < psd_info.min_channels) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + /* + Read PSD raster colormap only present for indexed and duotone images. + */ + length=ReadBlobMSBLong(image); + if ((psd_info.mode == IndexedMode) && (length < 3)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (length != 0) + { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " reading colormap"); + if ((psd_info.mode == DuotoneMode) || (psd_info.depth == 32)) + { + /* + Duotone image data; the format of this data is undocumented. + */ + (void) SeekBlob(image,(const MagickOffsetType) length,SEEK_CUR); + } + else + { + size_t + number_colors; + + /* + Read PSD raster colormap. + */ + number_colors=(size_t) length/3; + if (number_colors > 65536) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (AcquireImageColormap(image,number_colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + for (i=0; i < (ssize_t) image->colors; i++) + image->colormap[i].red=ScaleCharToQuantum((unsigned char) + ReadBlobByte(image)); + for (i=0; i < (ssize_t) image->colors; i++) + image->colormap[i].green=ScaleCharToQuantum((unsigned char) + ReadBlobByte(image)); + for (i=0; i < (ssize_t) image->colors; i++) + image->colormap[i].blue=ScaleCharToQuantum((unsigned char) + ReadBlobByte(image)); + image->matte=MagickFalse; + } + } + if ((image->depth == 1) && (image->storage_class != PseudoClass)) + ThrowReaderException(CorruptImageError, "ImproperImageHeader"); + has_merged_image=MagickTrue; + profile=(StringInfo *) NULL; + length=ReadBlobMSBLong(image); + if (length != 0) + { + unsigned char + *blocks; + + /* + Image resources block. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " reading image resource blocks - %.20g bytes",(double) + ((MagickOffsetType) length)); + if (length > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + blocks=(unsigned char *) AcquireQuantumMemory((size_t) length, + sizeof(*blocks)); + if (blocks == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,(size_t) length,blocks); + if ((count != (ssize_t) length) || (length < 4) || + (LocaleNCompare((char *) blocks,"8BIM",4) != 0)) + { + blocks=(unsigned char *) RelinquishMagickMemory(blocks); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + profile=ParseImageResourceBlocks(image,blocks,(size_t) length, + &has_merged_image); + blocks=(unsigned char *) RelinquishMagickMemory(blocks); + } + /* + Layer and mask block. + */ + length=GetPSDSize(&psd_info,image); + if (length == 8) + { + length=ReadBlobMSBLong(image); + length=ReadBlobMSBLong(image); + } + offset=TellBlob(image); + skip_layers=MagickFalse; + if ((image_info->number_scenes == 1) && (image_info->scene == 0) && + (has_merged_image != MagickFalse)) + { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " read composite only"); + skip_layers=MagickTrue; + } + if (length == 0) + { + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image has no layers"); + } + else + { + if (ReadPSDLayersInternal(image,image_info,&psd_info,skip_layers, + exception) != MagickTrue) + { + if (profile != (StringInfo *) NULL) + profile=DestroyStringInfo(profile); + (void) CloseBlob(image); + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Skip the rest of the layer and mask information. + */ + (void) SeekBlob(image,offset+length,SEEK_SET); + } + /* + If we are only "pinging" the image, then we're done - so return. + */ + if (EOFBlob(image) != MagickFalse) + { + if (profile != (StringInfo *) NULL) + profile=DestroyStringInfo(profile); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + if (image_info->ping != MagickFalse) + { + if (profile != (StringInfo *) NULL) + profile=DestroyStringInfo(profile); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + /* + Read the precombined layer, present for PSD < 4 compatibility. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " reading the precombined layer"); + image_list_length=GetImageListLength(image); + if (has_merged_image != MagickFalse || image_list_length == 1) + has_merged_image=(MagickBooleanType) ReadPSDMergedImage(image_info,image, + &psd_info,exception); + if ((has_merged_image == MagickFalse) && (image_list_length == 1) && + (length != 0)) + { + (void) SeekBlob(image,offset,SEEK_SET); + status=ReadPSDLayersInternal(image,image_info,&psd_info,MagickFalse, + exception); + if (status != MagickTrue) + { + if (profile != (StringInfo *) NULL) + profile=DestroyStringInfo(profile); + (void) CloseBlob(image); + image=DestroyImageList(image); + return((Image *) NULL); + } + image_list_length=GetImageListLength(image); + } + if (has_merged_image == MagickFalse) + { + Image + *merged; + + if (image_list_length == 1) + { + if (profile != (StringInfo *) NULL) + profile=DestroyStringInfo(profile); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + image->background_color.opacity=TransparentOpacity; + (void) SetImageBackgroundColor(image); + merged=MergeImageLayers(image,FlattenLayer,exception); + if (merged == (Image *) NULL) + { + (void) CloseBlob(image); + image=DestroyImageList(image); + return((Image *) NULL); + } + ReplaceImageInList(&image,merged); + } + if (profile != (StringInfo *) NULL) + { + Image + *next; + + next=image; + while (next != (Image *) NULL) + { + (void) SetImageProfile(next,GetStringInfoName(profile),profile); + next=next->next; + } + profile=DestroyStringInfo(profile); + } + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P S D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPSDImage() adds properties for the PSD image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPSDImage method is: +% +% size_t RegisterPSDImage(void) +% +*/ +ModuleExport size_t RegisterPSDImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PSB"); + entry->decoder=(DecodeImageHandler *) ReadPSDImage; + entry->encoder=(EncodeImageHandler *) WritePSDImage; + entry->magick=(IsImageFormatHandler *) IsPSD; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Adobe Large Document Format"); + entry->magick_module=ConstantString("PSD"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PSD"); + entry->decoder=(DecodeImageHandler *) ReadPSDImage; + entry->encoder=(EncodeImageHandler *) WritePSDImage; + entry->magick=(IsImageFormatHandler *) IsPSD; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Adobe Photoshop bitmap"); + entry->magick_module=ConstantString("PSD"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P S D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPSDImage() removes format registrations made by the +% PSD module from the list of supported formats. +% +% The format of the UnregisterPSDImage method is: +% +% UnregisterPSDImage(void) +% +*/ +ModuleExport void UnregisterPSDImage(void) +{ + (void) UnregisterMagickInfo("PSB"); + (void) UnregisterMagickInfo("PSD"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P S D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePSDImage() writes an image in the Adobe Photoshop encoded image format. +% +% The format of the WritePSDImage method is: +% +% MagickBooleanType WritePSDImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static inline ssize_t SetPSDOffset(const PSDInfo *psd_info,Image *image, + const size_t offset) +{ + if (psd_info->version == 1) + return(WriteBlobMSBShort(image,(unsigned short) offset)); + return(WriteBlobMSBLong(image,(unsigned int) offset)); +} + +static inline ssize_t WritePSDOffset(const PSDInfo *psd_info,Image *image, + const MagickSizeType size,const MagickOffsetType offset) +{ + MagickOffsetType + current_offset; + + ssize_t + result; + + current_offset=TellBlob(image); + (void) SeekBlob(image,offset,SEEK_SET); + if (psd_info->version == 1) + result=WriteBlobMSBShort(image,(unsigned short) size); + else + result=WriteBlobMSBLong(image,(unsigned int) size); + (void) SeekBlob(image,current_offset,SEEK_SET); + return(result); +} + +static inline ssize_t SetPSDSize(const PSDInfo *psd_info,Image *image, + const MagickSizeType size) +{ + if (psd_info->version == 1) + return(WriteBlobMSBLong(image,(unsigned int) size)); + return(WriteBlobMSBLongLong(image,size)); +} + +static inline ssize_t WritePSDSize(const PSDInfo *psd_info,Image *image, + const MagickSizeType size,const MagickOffsetType offset) +{ + MagickOffsetType + current_offset; + + ssize_t + result; + + current_offset=TellBlob(image); + (void) SeekBlob(image,offset,SEEK_SET); + if (psd_info->version == 1) + result=WriteBlobMSBLong(image,(unsigned int) size); + else + result=WriteBlobMSBLongLong(image,size); + (void) SeekBlob(image,current_offset,SEEK_SET); + return(result); +} + +static size_t PSDPackbitsEncodeImage(Image *image,const size_t length, + const unsigned char *pixels,unsigned char *compact_pixels) +{ + int + count; + + ssize_t + i, + j; + + unsigned char + *q; + + unsigned char + *packbits; + + /* + Compress pixels with Packbits encoding. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(pixels != (unsigned char *) NULL); + assert(compact_pixels != (unsigned char *) NULL); + packbits=(unsigned char *) AcquireQuantumMemory(128UL,sizeof(*packbits)); + if (packbits == (unsigned char *) NULL) + ThrowBinaryImageException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + q=compact_pixels; + for (i=(ssize_t) length; i != 0; ) + { + switch (i) + { + case 1: + { + i--; + *q++=(unsigned char) 0; + *q++=(*pixels); + break; + } + case 2: + { + i-=2; + *q++=(unsigned char) 1; + *q++=(*pixels); + *q++=pixels[1]; + break; + } + case 3: + { + i-=3; + if ((*pixels == *(pixels+1)) && (*(pixels+1) == *(pixels+2))) + { + *q++=(unsigned char) ((256-3)+1); + *q++=(*pixels); + break; + } + *q++=(unsigned char) 2; + *q++=(*pixels); + *q++=pixels[1]; + *q++=pixels[2]; + break; + } + default: + { + if ((*pixels == *(pixels+1)) && (*(pixels+1) == *(pixels+2))) + { + /* + Packed run. + */ + count=3; + while (((ssize_t) count < i) && (*pixels == *(pixels+count))) + { + count++; + if (count >= 127) + break; + } + i-=count; + *q++=(unsigned char) ((256-count)+1); + *q++=(*pixels); + pixels+=count; + break; + } + /* + Literal run. + */ + count=0; + while ((*(pixels+count) != *(pixels+count+1)) || + (*(pixels+count+1) != *(pixels+count+2))) + { + packbits[count+1]=pixels[count]; + count++; + if (((ssize_t) count >= (i-3)) || (count >= 127)) + break; + } + i-=count; + *packbits=(unsigned char) (count-1); + for (j=0; j <= (ssize_t) count; j++) + *q++=packbits[j]; + pixels+=count; + break; + } + } + } + *q++=(unsigned char) 128; /* EOD marker */ + packbits=(unsigned char *) RelinquishMagickMemory(packbits); + return((size_t) (q-compact_pixels)); +} + +static size_t WriteCompressionStart(const PSDInfo *psd_info,Image *image, + const Image *next_image,const ssize_t channels) +{ + ssize_t + i, + offset, + y; + + if (next_image->compression == RLECompression) + { + offset=WriteBlobMSBShort(image,RLE); + for (i=0; i < channels; i++) + for (y=0; y < (ssize_t) next_image->rows; y++) + offset+=SetPSDOffset(psd_info,image,0); + } +#ifdef MAGICKCORE_ZLIB_DELEGATE + else if (next_image->compression == ZipCompression) + offset=WriteBlobMSBShort(image,ZipWithoutPrediction); +#endif + else + offset=WriteBlobMSBShort(image,Raw); + return((size_t) offset); +} + +static size_t WritePSDChannel(const PSDInfo *psd_info, + const ImageInfo *image_info,Image *image,Image *next_image, + const QuantumType quantum_type, unsigned char *compact_pixels, + MagickOffsetType size_offset,const MagickBooleanType separate) +{ + MagickBooleanType + monochrome; + + QuantumInfo + *quantum_info; + + const PixelPacket + *p; + + ssize_t + i; + + size_t + count, + length; + + ssize_t + y; + + unsigned char + *pixels; + +#ifdef MAGICKCORE_ZLIB_DELEGATE + + int + flush, + level; + + unsigned char + *compressed_pixels; + + z_stream + stream; + + compressed_pixels=(unsigned char *) NULL; + flush=Z_NO_FLUSH; +#endif + count=0; + if (separate != MagickFalse) + { + size_offset=TellBlob(image)+2; + count+=WriteCompressionStart(psd_info,image,next_image,1); + } + if (next_image->depth > 8) + next_image->depth=16; + monochrome=IsMonochromeImage(image,&image->exception) && (image->depth == 1) + ? MagickTrue : MagickFalse; + quantum_info=AcquireQuantumInfo(image_info,next_image); + if (quantum_info == (QuantumInfo *) NULL) + return(0); + pixels=GetQuantumPixels(quantum_info); +#ifdef MAGICKCORE_ZLIB_DELEGATE + if (next_image->compression == ZipCompression) + { + compressed_pixels=(unsigned char *) AcquireQuantumMemory( + MagickMinBufferExtent,sizeof(*compressed_pixels)); + if (compressed_pixels == (unsigned char *) NULL) + { + quantum_info=DestroyQuantumInfo(quantum_info); + return(0); + } + memset(&stream,0,sizeof(stream)); + stream.data_type=Z_BINARY; + level=Z_DEFAULT_COMPRESSION; + if ((image_info->quality > 0 && image_info->quality < 10)) + level=(int) image_info->quality; + if (deflateInit(&stream,level) != Z_OK) + { + quantum_info=DestroyQuantumInfo(quantum_info); + compressed_pixels=(unsigned char *) RelinquishMagickMemory( + compressed_pixels); + return(0); + } + } +#endif + for (y=0; y < (ssize_t) next_image->rows; y++) + { + p=GetVirtualPixels(next_image,0,y,next_image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(next_image,(CacheView *) NULL,quantum_info, + quantum_type,pixels,&image->exception); + if (monochrome != MagickFalse) + for (i=0; i < (ssize_t) length; i++) + pixels[i]=(~pixels[i]); + if (next_image->compression == RLECompression) + { + length=PSDPackbitsEncodeImage(image,length,pixels,compact_pixels); + count+=WriteBlob(image,length,compact_pixels); + size_offset+=WritePSDOffset(psd_info,image,length,size_offset); + } +#ifdef MAGICKCORE_ZLIB_DELEGATE + else if (next_image->compression == ZipCompression) + { + stream.avail_in=(uInt) length; + stream.next_in=(Bytef *) pixels; + if (y == (ssize_t) next_image->rows-1) + flush=Z_FINISH; + do { + stream.avail_out=(uInt) MagickMinBufferExtent; + stream.next_out=(Bytef *) compressed_pixels; + if (deflate(&stream,flush) == Z_STREAM_ERROR) + break; + length=(size_t) MagickMinBufferExtent-stream.avail_out; + if (length > 0) + count+=WriteBlob(image,length,compressed_pixels); + } while (stream.avail_out == 0); + } +#endif + else + count+=WriteBlob(image,length,pixels); + } +#ifdef MAGICKCORE_ZLIB_DELEGATE + if (next_image->compression == ZipCompression) + { + (void) deflateEnd(&stream); + compressed_pixels=(unsigned char *) RelinquishMagickMemory( + compressed_pixels); + } +#endif + quantum_info=DestroyQuantumInfo(quantum_info); + return(count); +} + +static unsigned char *AcquireCompactPixels(Image *image) +{ + size_t + packet_size; + + unsigned char + *compact_pixels; + + packet_size=image->depth > 8UL ? 2UL : 1UL; + compact_pixels=(unsigned char *) AcquireQuantumMemory((9* + image->columns)+1,packet_size*sizeof(*compact_pixels)); + if (compact_pixels == (unsigned char *) NULL) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + image->filename); + } + return(compact_pixels); +} + +static ssize_t WritePSDChannels(const PSDInfo *psd_info, + const ImageInfo *image_info,Image *image,Image *next_image, + MagickOffsetType size_offset,const MagickBooleanType separate) +{ + Image + *mask; + + MagickOffsetType + rows_offset; + + size_t + channels, + length, + offset_length; + + ssize_t + count; + + unsigned char + *compact_pixels; + + count=0; + offset_length=0; + rows_offset=0; + compact_pixels=(unsigned char *) NULL; + if (next_image->compression == RLECompression) + { + compact_pixels=AcquireCompactPixels(next_image); + if (compact_pixels == (unsigned char *) NULL) + return(0); + } + channels=1; + if (separate == MagickFalse) + { + if ((next_image->storage_class != PseudoClass) || + (IsGrayImage(next_image,&next_image->exception) != MagickFalse)) + { + if (IsGrayImage(next_image,&next_image->exception) == MagickFalse) + channels=(size_t) (next_image->colorspace == CMYKColorspace ? + 4 : 3); + if (next_image->matte != MagickFalse) + channels++; + } + rows_offset=TellBlob(image)+2; + count+=WriteCompressionStart(psd_info,image,next_image,(ssize_t) + channels); + offset_length=(next_image->rows*(psd_info->version == 1 ? 2 : 4)); + } + size_offset+=2; + if ((next_image->storage_class == PseudoClass) && + (IsGrayImage(next_image,&next_image->exception) == MagickFalse)) + { + length=WritePSDChannel(psd_info,image_info,image,next_image, + IndexQuantum,compact_pixels,rows_offset,separate); + if (separate != MagickFalse) + size_offset+=WritePSDSize(psd_info,image,length,size_offset)+2; + else + rows_offset+=offset_length; + count+=length; + } + else + { + if (IsGrayImage(next_image,&next_image->exception) != MagickFalse) + { + length=WritePSDChannel(psd_info,image_info,image,next_image, + GrayQuantum,compact_pixels,rows_offset,separate); + if (separate != MagickFalse) + size_offset+=WritePSDSize(psd_info,image,length,size_offset)+2; + else + rows_offset+=offset_length; + count+=length; + } + else + { + if (next_image->colorspace == CMYKColorspace) + (void) NegateImage(next_image,MagickFalse); + + length=WritePSDChannel(psd_info,image_info,image,next_image, + RedQuantum,compact_pixels,rows_offset,separate); + if (separate != MagickFalse) + size_offset+=WritePSDSize(psd_info,image,length,size_offset)+2; + else + rows_offset+=offset_length; + count+=length; + + length=WritePSDChannel(psd_info,image_info,image,next_image, + GreenQuantum,compact_pixels,rows_offset,separate); + if (separate != MagickFalse) + size_offset+=WritePSDSize(psd_info,image,length,size_offset)+2; + else + rows_offset+=offset_length; + count+=length; + + length=WritePSDChannel(psd_info,image_info,image,next_image, + BlueQuantum,compact_pixels,rows_offset,separate); + if (separate != MagickFalse) + size_offset+=WritePSDSize(psd_info,image,length,size_offset)+2; + else + rows_offset+=offset_length; + count+=length; + + if (next_image->colorspace == CMYKColorspace) + { + length=WritePSDChannel(psd_info,image_info,image,next_image, + BlackQuantum,compact_pixels,rows_offset,separate); + if (separate != MagickFalse) + size_offset+=WritePSDSize(psd_info,image,length,size_offset)+2; + else + rows_offset+=offset_length; + count+=length; + } + } + if (next_image->matte != MagickFalse) + { + length=WritePSDChannel(psd_info,image_info,image,next_image, + AlphaQuantum,compact_pixels,rows_offset,separate); + if (separate != MagickFalse) + size_offset+=WritePSDSize(psd_info,image,length,size_offset)+2; + else + rows_offset+=offset_length; + count+=length; + } + } + compact_pixels=(unsigned char *) RelinquishMagickMemory(compact_pixels); + if (next_image->colorspace == CMYKColorspace) + (void) NegateImage(next_image,MagickFalse); + if (separate != MagickFalse) + { + const char + *property; + + property=GetImageArtifact(next_image,"psd:opacity-mask"); + if (property != (const char *) NULL) + { + mask=(Image *) GetImageRegistry(ImageRegistryType,property, + &image->exception); + if (mask != (Image *) NULL) + { + if (mask->compression == RLECompression) + { + compact_pixels=AcquireCompactPixels(mask); + if (compact_pixels == (unsigned char *) NULL) + return(0); + } + length=WritePSDChannel(psd_info,image_info,image,mask, + RedQuantum,compact_pixels,rows_offset,MagickTrue); + (void) WritePSDSize(psd_info,image,length,size_offset); + count+=length; + compact_pixels=(unsigned char *) RelinquishMagickMemory( + compact_pixels); + } + } + } + return(count); +} + +static size_t WritePascalString(Image *image,const char *value,size_t padding) +{ + size_t + count, + length; + + ssize_t + i; + + /* + Max length is 255. + */ + count=0; + length=(strlen(value) > 255UL ) ? 255UL : strlen(value); + if (length == 0) + count+=WriteBlobByte(image,0); + else + { + count+=WriteBlobByte(image,(unsigned char) length); + count+=WriteBlob(image,length,(const unsigned char *) value); + } + length++; + if ((length % padding) == 0) + return(count); + for (i=0; i < (ssize_t) (padding-(length % padding)); i++) + count+=WriteBlobByte(image,0); + return(count); +} + +static void WriteResolutionResourceBlock(Image *image) +{ + double + x_resolution, + y_resolution; + + unsigned short + units; + + if (image->units == PixelsPerCentimeterResolution) + { + x_resolution=2.54*65536.0*image->x_resolution+0.5; + y_resolution=2.54*65536.0*image->y_resolution+0.5; + units=2; + } + else + { + x_resolution=65536.0*image->x_resolution+0.5; + y_resolution=65536.0*image->y_resolution+0.5; + units=1; + } + (void) WriteBlob(image,4,(const unsigned char *) "8BIM"); + (void) WriteBlobMSBShort(image,0x03ED); + (void) WriteBlobMSBShort(image,0); + (void) WriteBlobMSBLong(image,16); /* resource size */ + (void) WriteBlobMSBLong(image,(unsigned int) (x_resolution+0.5)); + (void) WriteBlobMSBShort(image,units); /* horizontal resolution unit */ + (void) WriteBlobMSBShort(image,units); /* width unit */ + (void) WriteBlobMSBLong(image,(unsigned int) (y_resolution+0.5)); + (void) WriteBlobMSBShort(image,units); /* vertical resolution unit */ + (void) WriteBlobMSBShort(image,units); /* height unit */ +} + +static inline size_t WriteChannelSize(const PSDInfo *psd_info,Image *image, + const signed short channel) +{ + ssize_t + count; + + count=WriteBlobMSBSignedShort(image,channel); + count+=SetPSDSize(psd_info,image,0); + return((size_t) count); +} + +static void RemoveICCProfileFromResourceBlock(StringInfo *bim_profile) +{ + const unsigned char + *p; + + size_t + length; + + unsigned char + *datum; + + unsigned int + count, + long_sans; + + unsigned short + id, + short_sans; + + length=GetStringInfoLength(bim_profile); + if (length < 16) + return; + datum=GetStringInfoDatum(bim_profile); + for (p=datum; (p >= datum) && (p < (datum+length-16)); ) + { + unsigned char + *q; + + q=(unsigned char *) p; + if (LocaleNCompare((const char *) p,"8BIM",4) != 0) + break; + p=PushLongPixel(MSBEndian,p,&long_sans); + p=PushShortPixel(MSBEndian,p,&id); + p=PushShortPixel(MSBEndian,p,&short_sans); + p=PushLongPixel(MSBEndian,p,&count); + if (id == 0x0000040f) + { + ssize_t + quantum; + + quantum=PSDQuantum(count)+12; + if ((quantum >= 12) && (quantum < (ssize_t) length)) + { + if ((q+quantum < (datum+length-16))) + (void) memmove(q,q+quantum,length-quantum-(q-datum)); + SetStringInfoLength(bim_profile,length-quantum); + } + break; + } + p+=count; + if ((count & 0x01) != 0) + p++; + } +} + +static void RemoveResolutionFromResourceBlock(StringInfo *bim_profile) +{ + const unsigned char + *p; + + size_t + length; + + unsigned char + *datum; + + unsigned int + count, + long_sans; + + unsigned short + id, + short_sans; + + length=GetStringInfoLength(bim_profile); + if (length < 16) + return; + datum=GetStringInfoDatum(bim_profile); + for (p=datum; (p >= datum) && (p < (datum+length-16)); ) + { + unsigned char + *q; + + ssize_t + cnt; + + q=(unsigned char *) p; + if (LocaleNCompare((const char *) p,"8BIM",4) != 0) + return; + p=PushLongPixel(MSBEndian,p,&long_sans); + p=PushShortPixel(MSBEndian,p,&id); + p=PushShortPixel(MSBEndian,p,&short_sans); + p=PushLongPixel(MSBEndian,p,&count); + cnt=PSDQuantum(count); + if (cnt < 0) + return; + if ((id == 0x000003ed) && (cnt < (ssize_t) (length-12)) && + ((ssize_t) length-(cnt+12)-(q-datum)) > 0) + { + (void) memmove(q,q+cnt+12,length-(cnt+12)-(q-datum)); + SetStringInfoLength(bim_profile,length-(cnt+12)); + break; + } + p+=count; + if ((count & 0x01) != 0) + p++; + } +} + +static const StringInfo *GetAdditionalInformation(const ImageInfo *image_info, + Image *image) +{ +#define PSDKeySize 5 +#define PSDAllowedLength 36 + + char + key[PSDKeySize]; + + /* Whitelist of keys from: https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ */ + const char + allowed[PSDAllowedLength][PSDKeySize] = { + "blnc", "blwh", "brit", "brst", "clbl", "clrL", "curv", "expA", "FMsk", + "GdFl", "grdm", "hue ", "hue2", "infx", "knko", "lclr", "levl", "lnsr", + "lfx2", "luni", "lrFX", "lspf", "lyid", "lyvr", "mixr", "nvrt", "phfl", + "post", "PtFl", "selc", "shpa", "sn2P", "SoCo", "thrs", "tsly", "vibA" + }, + *option; + + const StringInfo + *info; + + MagickBooleanType + found; + + size_t + i; + + size_t + remaining_length, + length; + + StringInfo + *profile; + + unsigned char + *p; + + unsigned int + size; + + info=GetImageProfile(image,"psd:additional-info"); + if (info == (const StringInfo *) NULL) + return((const StringInfo *) NULL); + option=GetImageOption(image_info,"psd:additional-info"); + if (LocaleCompare(option,"all") == 0) + return(info); + if (LocaleCompare(option,"selective") != 0) + { + profile=RemoveImageProfile(image,"psd:additional-info"); + return(DestroyStringInfo(profile)); + } + length=GetStringInfoLength(info); + p=GetStringInfoDatum(info); + remaining_length=length; + length=0; + while (remaining_length >= 12) + { + /* skip over signature */ + p+=4; + key[0]=(char) (*p++); + key[1]=(char) (*p++); + key[2]=(char) (*p++); + key[3]=(char) (*p++); + key[4]='\0'; + size=(unsigned int) (*p++) << 24; + size|=(unsigned int) (*p++) << 16; + size|=(unsigned int) (*p++) << 8; + size|=(unsigned int) (*p++); + size=size & 0xffffffff; + remaining_length-=12; + if ((size_t) size > remaining_length) + return((const StringInfo *) NULL); + found=MagickFalse; + for (i=0; i < PSDAllowedLength; i++) + { + if (LocaleNCompare(key,allowed[i],PSDKeySize) != 0) + continue; + + found=MagickTrue; + break; + } + remaining_length-=(size_t) size; + if (found == MagickFalse) + { + if (remaining_length > 0) + p=(unsigned char *) memmove(p-12,p+size,remaining_length); + continue; + } + length+=(size_t) size+12; + p+=size; + } + profile=RemoveImageProfile(image,"psd:additional-info"); + if (length == 0) + return(DestroyStringInfo(profile)); + SetStringInfoLength(profile,(const size_t) length); + (void) SetImageProfile(image,"psd:additional-info",info); + return(profile); +} + +static MagickBooleanType WritePSDImage(const ImageInfo *image_info, + Image *image) +{ + char + layer_name[MaxTextExtent]; + + const char + *property; + + const StringInfo + *icc_profile, + *info; + + Image + *base_image, + *next_image; + + MagickBooleanType + status; + + MagickOffsetType + *layer_size_offsets, + size_offset; + + PSDInfo + psd_info; + + ssize_t + i; + + size_t + layer_count, + layer_index, + length, + name_length, + num_channels, + packet_size, + rounded_size, + size; + + StringInfo + *bim_profile; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + packet_size=(size_t) (image->depth > 8 ? 6 : 3); + if (image->matte != MagickFalse) + packet_size+=image->depth > 8 ? 2 : 1; + psd_info.version=1; + if ((LocaleCompare(image_info->magick,"PSB") == 0) || + (image->columns > 30000) || (image->rows > 30000)) + psd_info.version=2; + (void) WriteBlob(image,4,(const unsigned char *) "8BPS"); + (void) WriteBlobMSBShort(image,psd_info.version); /* version */ + for (i=1; i <= 6; i++) + (void) WriteBlobByte(image, 0); /* 6 bytes of reserved */ + /* When the image has a color profile it won't be converted to gray scale */ + if ((GetImageProfile(image,"icc") == (StringInfo *) NULL) && + (SetImageGray(image,&image->exception) != MagickFalse)) + num_channels=(image->matte != MagickFalse ? 2UL : 1UL); + else + if ((image_info->type != TrueColorType) && (image_info->type != + TrueColorMatteType) && (image->storage_class == PseudoClass)) + num_channels=(image->matte != MagickFalse ? 2UL : 1UL); + else + { + if (image->storage_class == PseudoClass) + (void) SetImageStorageClass(image,DirectClass); + if (image->colorspace != CMYKColorspace) + num_channels=(image->matte != MagickFalse ? 4UL : 3UL); + else + num_channels=(image->matte != MagickFalse ? 5UL : 4UL); + } + (void) WriteBlobMSBShort(image,(unsigned short) num_channels); + (void) WriteBlobMSBLong(image,(unsigned int) image->rows); + (void) WriteBlobMSBLong(image,(unsigned int) image->columns); + if (IsGrayImage(image,&image->exception) != MagickFalse) + { + MagickBooleanType + monochrome; + + /* + Write depth & mode. + */ + monochrome=IsMonochromeImage(image,&image->exception) && + (image->depth == 1) ? MagickTrue : MagickFalse; + (void) WriteBlobMSBShort(image,(unsigned short) + (monochrome != MagickFalse ? 1 : image->depth > 8 ? 16 : 8)); + (void) WriteBlobMSBShort(image,(unsigned short) + (monochrome != MagickFalse ? BitmapMode : GrayscaleMode)); + } + else + { + (void) WriteBlobMSBShort(image,(unsigned short) (image->storage_class == + PseudoClass ? 8 : image->depth > 8 ? 16 : 8)); + if (((image_info->colorspace != UndefinedColorspace) || + (image->colorspace != CMYKColorspace)) && + (image_info->colorspace != CMYKColorspace)) + { + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + (void) WriteBlobMSBShort(image,(unsigned short) + (image->storage_class == PseudoClass ? IndexedMode : RGBMode)); + } + else + { + if (image->colorspace != CMYKColorspace) + (void) TransformImageColorspace(image,CMYKColorspace); + (void) WriteBlobMSBShort(image,CMYKMode); + } + } + if ((IsGrayImage(image,&image->exception) != MagickFalse) || + (image->storage_class == DirectClass) || (image->colors > 256)) + (void) WriteBlobMSBLong(image,0); + else + { + /* + Write PSD raster colormap. + */ + (void) WriteBlobMSBLong(image,768); + for (i=0; i < (ssize_t) image->colors; i++) + (void) WriteBlobByte(image,ScaleQuantumToChar(image->colormap[i].red)); + for ( ; i < 256; i++) + (void) WriteBlobByte(image,0); + for (i=0; i < (ssize_t) image->colors; i++) + (void) WriteBlobByte(image,ScaleQuantumToChar( + image->colormap[i].green)); + for ( ; i < 256; i++) + (void) WriteBlobByte(image,0); + for (i=0; i < (ssize_t) image->colors; i++) + (void) WriteBlobByte(image,ScaleQuantumToChar(image->colormap[i].blue)); + for ( ; i < 256; i++) + (void) WriteBlobByte(image,0); + } + /* + Image resource block. + */ + length=28; /* 0x03EB */ + bim_profile=(StringInfo *) GetImageProfile(image,"8bim"); + icc_profile=GetImageProfile(image,"icc"); + if (bim_profile != (StringInfo *) NULL) + { + bim_profile=CloneStringInfo(bim_profile); + if (icc_profile != (StringInfo *) NULL) + RemoveICCProfileFromResourceBlock(bim_profile); + RemoveResolutionFromResourceBlock(bim_profile); + length+=PSDQuantum(GetStringInfoLength(bim_profile)); + } + if (icc_profile != (const StringInfo *) NULL) + length+=PSDQuantum(GetStringInfoLength(icc_profile))+12; + (void) WriteBlobMSBLong(image,(unsigned int) length); + WriteResolutionResourceBlock(image); + if (bim_profile != (StringInfo *) NULL) + { + (void) WriteBlob(image,GetStringInfoLength(bim_profile), + GetStringInfoDatum(bim_profile)); + bim_profile=DestroyStringInfo(bim_profile); + } + if (icc_profile != (StringInfo *) NULL) + { + (void) WriteBlob(image,4,(const unsigned char *) "8BIM"); + (void) WriteBlobMSBShort(image,0x0000040F); + (void) WriteBlobMSBShort(image,0); + (void) WriteBlobMSBLong(image,(unsigned int) GetStringInfoLength( + icc_profile)); + (void) WriteBlob(image,GetStringInfoLength(icc_profile), + GetStringInfoDatum(icc_profile)); + if ((ssize_t) GetStringInfoLength(icc_profile) != + PSDQuantum(GetStringInfoLength(icc_profile))) + (void) WriteBlobByte(image,0); + } + base_image=GetNextImageInList(image); + if (base_image == (Image *)NULL) + base_image=image; + size=0; + size_offset=TellBlob(image); + (void) SetPSDSize(&psd_info,image,0); + (void) SetPSDSize(&psd_info,image,0); + layer_count=0; + for (next_image=base_image; next_image != NULL; ) + { + layer_count++; + next_image=GetNextImageInList(next_image); + } + if (image->matte != MagickFalse) + size+=WriteBlobMSBShort(image,-(unsigned short) layer_count); + else + size+=WriteBlobMSBShort(image,(unsigned short) layer_count); + layer_size_offsets=(MagickOffsetType *) AcquireQuantumMemory( + (size_t) layer_count,sizeof(MagickOffsetType)); + if (layer_size_offsets == (MagickOffsetType *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + layer_index=0; + for (next_image=base_image; next_image != NULL; ) + { + Image + *mask; + + unsigned char + default_color; + + unsigned short + channels, + total_channels; + + mask=(Image *) NULL; + property=GetImageArtifact(next_image,"psd:opacity-mask"); + default_color=0; + if (property != (const char *) NULL) + { + mask=(Image *) GetImageRegistry(ImageRegistryType,property, + &image->exception); + default_color=(unsigned char) (strlen(property) == 9 ? 255 : 0); + } + size+=WriteBlobMSBLong(image,(unsigned int) next_image->page.y); + size+=WriteBlobMSBLong(image,(unsigned int) next_image->page.x); + size+=WriteBlobMSBLong(image,(unsigned int) (next_image->page.y+ + next_image->rows)); + size+=WriteBlobMSBLong(image,(unsigned int) (next_image->page.x+ + next_image->columns)); + channels=1; + if ((next_image->storage_class != PseudoClass) && + (IsGrayImage(next_image,&next_image->exception) == MagickFalse)) + channels=(unsigned short) (next_image->colorspace == CMYKColorspace ? + 4 : 3); + total_channels=channels; + if (next_image->matte != MagickFalse) + total_channels++; + if (mask != (Image *) NULL) + total_channels++; + size+=WriteBlobMSBShort(image,total_channels); + layer_size_offsets[layer_index++]=TellBlob(image); + for (i=0; i < (ssize_t) channels; i++) + size+=WriteChannelSize(&psd_info,image,(signed short) i); + if (next_image->matte != MagickFalse) + size+=WriteChannelSize(&psd_info,image,-1); + if (mask != (Image *) NULL) + size+=WriteChannelSize(&psd_info,image,-2); + size+=WriteBlob(image,4,(const unsigned char *) "8BIM"); + size+=WriteBlob(image,4,(const unsigned char *) + CompositeOperatorToPSDBlendMode(next_image)); + property=GetImageArtifact(next_image,"psd:layer.opacity"); + if (property != (const char *) NULL) + { + Quantum + opacity; + + opacity=(Quantum) StringToInteger(property); + size+=WriteBlobByte(image,ScaleQuantumToChar(opacity)); + (void) ApplyPSDLayerOpacity(next_image,opacity,MagickTrue, + &image->exception); + } + else + size+=WriteBlobByte(image,255); + size+=WriteBlobByte(image,0); + size+=WriteBlobByte(image,(unsigned char) + (next_image->compose == NoCompositeOp ? 1 << 0x02 : 1)); /* layer properties - visible, etc. */ + size+=WriteBlobByte(image,0); + info=GetAdditionalInformation(image_info,next_image); + property=(const char *) GetImageProperty(next_image,"label"); + if (property == (const char *) NULL) + { + (void) FormatLocaleString(layer_name,MaxTextExtent,"L%.20g", + (double) layer_index); + property=layer_name; + } + name_length=strlen(property)+1; + if ((name_length % 4) != 0) + name_length+=(4-(name_length % 4)); + if (info != (const StringInfo *) NULL) + name_length+=GetStringInfoLength(info); + name_length+=8; + if (mask != (Image *) NULL) + name_length+=20; + size+=WriteBlobMSBLong(image,(unsigned int) name_length); + if (mask == (Image *) NULL) + size+=WriteBlobMSBLong(image,0); + else + { + if (mask->compose != NoCompositeOp) + (void) ApplyPSDOpacityMask(next_image,mask,ScaleCharToQuantum( + default_color),MagickTrue,&image->exception); + mask->page.y+=image->page.y; + mask->page.x+=image->page.x; + size+=WriteBlobMSBLong(image,20); + size+=WriteBlobMSBSignedLong(image,(const signed int) mask->page.y); + size+=WriteBlobMSBSignedLong(image,(const signed int) mask->page.x); + size+=WriteBlobMSBSignedLong(image,(const signed int) (mask->rows+ + mask->page.y)); + size+=WriteBlobMSBSignedLong(image,(const signed int) (mask->columns+ + mask->page.x)); + size+=WriteBlobByte(image,default_color); + size+=WriteBlobByte(image,(unsigned char) ( + mask->compose == NoCompositeOp ? 2 : 0)); + size+=WriteBlobMSBShort(image,0); + } + size+=WriteBlobMSBLong(image,0); + size+=WritePascalString(image,property,4); + if (info != (const StringInfo *) NULL) + size+=WriteBlob(image,GetStringInfoLength(info),GetStringInfoDatum(info)); + next_image=GetNextImageInList(next_image); + } + /* + Now the image data! + */ + next_image=base_image; + layer_index=0; + while (next_image != NULL) + { + length=(size_t) WritePSDChannels(&psd_info,image_info,image,next_image, + layer_size_offsets[layer_index++],MagickTrue); + if (length == 0) + { + status=MagickFalse; + break; + } + size+=length; + next_image=GetNextImageInList(next_image); + } + (void) WriteBlobMSBLong(image,0); /* user mask data */ + /* + Remove the opacity mask from the registry + */ + next_image=base_image; + while (next_image != (Image *) NULL) + { + property=GetImageArtifact(next_image,"psd:opacity-mask"); + if (property != (const char *) NULL) + (void) DeleteImageRegistry(property); + next_image=GetNextImageInList(next_image); + } + /* + Write the total size + */ + size_offset+=WritePSDSize(&psd_info,image,size+ + (psd_info.version == 1 ? 8 : 12),size_offset); + if ((size/2) != ((size+1)/2)) + rounded_size=size+1; + else + rounded_size=size; + (void) WritePSDSize(&psd_info,image,rounded_size,size_offset); + layer_size_offsets=(MagickOffsetType *) RelinquishMagickMemory( + layer_size_offsets); + /* + Write composite image. + */ + if (status != MagickFalse) + { + CompressionType + compression; + + compression=image->compression; + if (image_info->compression != UndefinedCompression) + image->compression=image_info->compression; + if (image->compression == ZipCompression) + image->compression=RLECompression; + if (WritePSDChannels(&psd_info,image_info,image,image,0, + MagickFalse) == 0) + status=MagickFalse; + image->compression=compression; + } + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/pwp.c b/ImageMagick-6.9.12-44/coders/pwp.c new file mode 100644 index 0000000..4f01e7a --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/pwp.c @@ -0,0 +1,352 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP W W PPPP % +% P P W W P P % +% PPPP W W PPPP % +% P W W W P % +% P W W P % +% % +% % +% Read Seattle Film Works Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P W P % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPWP() returns MagickTrue if the image format type, identified by the +% magick string, is PWP. +% +% The format of the IsPWP method is: +% +% MagickBooleanType IsPWP(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsPWP(const unsigned char *magick,const size_t length) +{ + if (length < 5) + return(MagickFalse); + if (LocaleNCompare((char *) magick,"SFW95",5) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d P W P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPWPImage() reads a Seattle Film Works multi-image file and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadPWPImage method is: +% +% Image *ReadPWPImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadPWPImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + filename[MaxTextExtent]; + + FILE + *file; + + Image + *image, + *next_image, + *pwp_image; + + ImageInfo + *read_info; + + int + c, + unique_file; + + MagickBooleanType + status; + + Image + *p; + + ssize_t + i; + + size_t + filesize, + length; + + ssize_t + count; + + unsigned char + magick[MaxTextExtent]; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImage(image); + return((Image *) NULL); + } + pwp_image=image; + memset(magick,0,sizeof(magick)); + count=ReadBlob(pwp_image,5,magick); + if ((count != 5) || (LocaleNCompare((char *) magick,"SFW95",5) != 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + read_info=CloneImageInfo(image_info); + (void) SetImageInfoProgressMonitor(read_info,(MagickProgressMonitor) NULL, + (void *) NULL); + SetImageInfoBlob(read_info,(void *) NULL,0); + unique_file=AcquireUniqueFileResource(filename); + (void) FormatLocaleString(read_info->filename,MagickPathExtent,"sfw:%s", + filename); + for ( ; ; ) + { + (void) memset(magick,0,sizeof(magick)); + for (c=ReadBlobByte(pwp_image); c != EOF; c=ReadBlobByte(pwp_image)) + { + for (i=0; i < 17; i++) + magick[i]=magick[i+1]; + magick[17]=(unsigned char) c; + if (LocaleNCompare((char *) (magick+12),"SFW94A",6) == 0) + break; + } + if (c == EOF) + { + (void) RelinquishUniqueFileResource(filename); + read_info=DestroyImageInfo(read_info); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + if (LocaleNCompare((char *) (magick+12),"SFW94A",6) != 0) + { + (void) RelinquishUniqueFileResource(filename); + read_info=DestroyImageInfo(read_info); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + /* + Dump SFW image to a temporary file. + */ + file=(FILE *) NULL; + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + { + (void) RelinquishUniqueFileResource(filename); + read_info=DestroyImageInfo(read_info); + ThrowFileException(exception,FileOpenError,"UnableToWriteFile", + image->filename); + image=DestroyImageList(image); + return((Image *) NULL); + } + length=fwrite("SFW94A",1,6,file); + (void) length; + filesize=65535UL*magick[2]+256L*magick[1]+magick[0]; + for (i=0; i < (ssize_t) filesize; i++) + { + c=ReadBlobByte(pwp_image); + if (c == EOF) + break; + if (fputc(c,file) != c) + break; + } + (void) fclose(file); + if (c == EOF) + { + (void) RelinquishUniqueFileResource(filename); + read_info=DestroyImageInfo(read_info); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + next_image=ReadImage(read_info,exception); + if (next_image == (Image *) NULL) + break; + (void) FormatLocaleString(next_image->filename,MaxTextExtent, + "slide_%02ld.sfw",(long) next_image->scene); + if (image == (Image *) NULL) + image=next_image; + else + { + /* + Link image into image list. + */ + for (p=image; p->next != (Image *) NULL; p=GetNextImageInList(p)) ; + next_image->previous=p; + next_image->scene=p->scene+1; + p->next=next_image; + } + if (image_info->number_scenes != 0) + if (next_image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageProgress(image,LoadImagesTag,TellBlob(pwp_image), + GetBlobSize(pwp_image)); + if (status == MagickFalse) + break; + } + if (unique_file != -1) + (void) close(unique_file); + (void) RelinquishUniqueFileResource(filename); + read_info=DestroyImageInfo(read_info); + if (image != (Image *) NULL) + { + if (EOFBlob(image) != MagickFalse) + { + char + *message; + + message=GetExceptionMessage(errno); + (void) ThrowMagickException(exception,GetMagickModule(), + CorruptImageError,"UnexpectedEndOfFile","`%s': %s",image->filename, + message); + message=DestroyString(message); + } + (void) CloseBlob(image); + } + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r P W P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterPWPImage() adds attributes for the PWP image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterPWPImage method is: +% +% size_t RegisterPWPImage(void) +% +*/ +ModuleExport size_t RegisterPWPImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PWP"); + entry->decoder=(DecodeImageHandler *) ReadPWPImage; + entry->magick=(IsImageFormatHandler *) IsPWP; + entry->description=ConstantString("Seattle Film Works"); + entry->magick_module=ConstantString("PWP"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r P W P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterPWPImage() removes format registrations made by the +% PWP module from the list of supported formats. +% +% The format of the UnregisterPWPImage method is: +% +% UnregisterPWPImage(void) +% +*/ +ModuleExport void UnregisterPWPImage(void) +{ + (void) UnregisterMagickInfo("PWP"); +} diff --git a/ImageMagick-6.9.12-44/coders/raw.c b/ImageMagick-6.9.12-44/coders/raw.c new file mode 100644 index 0000000..7e77753 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/raw.c @@ -0,0 +1,623 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% RRRR AAA W W % +% R R A A W W % +% RRRR AAAAA W W W % +% R R A A WW WW % +% R R A A W W % +% % +% % +% Read/Write RAW Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteRAWImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d R A W I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadRAWImage() reads an image of raw samples and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the ReadRAWImage method is: +% +% Image *ReadRAWImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadRAWImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + const void + *stream; + + Image + *canvas_image, + *image; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + /* + Create virtual canvas to support cropping (i.e. image.raw[100x100+10+20]). + */ + canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse, + exception); + if (canvas_image == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod); + quantum_type=GrayQuantum; + quantum_info=AcquireQuantumInfo(image_info,canvas_image); + if (quantum_info == (QuantumInfo *) NULL) + { + canvas_image=DestroyImage(canvas_image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=GetQuantumPixels(quantum_info); + if (image_info->number_scenes != 0) + while (image->scene < image_info->scene) + { + /* + Skip to next image. + */ + image->scene++; + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + for (y=0; y < (ssize_t) image->rows; y++) + { + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + } + scene=0; + count=0; + length=0; + status=MagickTrue; + stream=NULL; + do + { + /* + Read pixels to virtual canvas image then push to image. + */ + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + break; + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,quantum_info, + quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + image->columns,1,exception); + q=QueueAuthenticPixels(image,0,y-image->extract_info.y,image->columns, + 1,exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + SetPixelGreen(q,GetPixelGreen(p)); + SetPixelBlue(q,GetPixelBlue(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + SetQuantumImageType(image,quantum_type); + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (count == (ssize_t) length) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + scene++; + } while (count == (ssize_t) length); + quantum_info=DestroyQuantumInfo(quantum_info); + InheritException(exception,&canvas_image->exception); + InheritException(exception,&image->exception); + canvas_image=DestroyImage(canvas_image); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r R A W I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterRAWImage() adds attributes for the RAW image format to the list of +% supported formats. The attributes include the image format tag, a method to +% read and/or write the format, whether the format supports the saving of +% more than one frame to the same file or blob, whether the format supports +% native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterRAWImage method is: +% +% size_t RegisterRAWImage(void) +% +*/ +ModuleExport size_t RegisterRAWImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("R"); + entry->decoder=(DecodeImageHandler *) ReadRAWImage; + entry->encoder=(EncodeImageHandler *) WriteRAWImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Raw red samples"); + entry->magick_module=ConstantString("RAW"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("C"); + entry->decoder=(DecodeImageHandler *) ReadRAWImage; + entry->encoder=(EncodeImageHandler *) WriteRAWImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Raw cyan samples"); + entry->magick_module=ConstantString("RAW"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("G"); + entry->decoder=(DecodeImageHandler *) ReadRAWImage; + entry->encoder=(EncodeImageHandler *) WriteRAWImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Raw green samples"); + entry->magick_module=ConstantString("RAW"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("M"); + entry->decoder=(DecodeImageHandler *) ReadRAWImage; + entry->encoder=(EncodeImageHandler *) WriteRAWImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Raw magenta samples"); + entry->magick_module=ConstantString("RAW"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("B"); + entry->decoder=(DecodeImageHandler *) ReadRAWImage; + entry->encoder=(EncodeImageHandler *) WriteRAWImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Raw blue samples"); + entry->magick_module=ConstantString("RAW"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("Y"); + entry->decoder=(DecodeImageHandler *) ReadRAWImage; + entry->encoder=(EncodeImageHandler *) WriteRAWImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Raw yellow samples"); + entry->magick_module=ConstantString("RAW"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("A"); + entry->decoder=(DecodeImageHandler *) ReadRAWImage; + entry->encoder=(EncodeImageHandler *) WriteRAWImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Raw alpha samples"); + entry->magick_module=ConstantString("RAW"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("O"); + entry->decoder=(DecodeImageHandler *) ReadRAWImage; + entry->encoder=(EncodeImageHandler *) WriteRAWImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Raw opacity samples"); + entry->magick_module=ConstantString("RAW"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("K"); + entry->decoder=(DecodeImageHandler *) ReadRAWImage; + entry->encoder=(EncodeImageHandler *) WriteRAWImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Raw black samples"); + entry->magick_module=ConstantString("RAW"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r R A W I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterRAWImage() removes format registrations made by the RAW module +% from the list of supported formats. +% +% The format of the UnregisterRAWImage method is: +% +% UnregisterRAWImage(void) +% +*/ +ModuleExport void UnregisterRAWImage(void) +{ + (void) UnregisterMagickInfo("R"); + (void) UnregisterMagickInfo("C"); + (void) UnregisterMagickInfo("G"); + (void) UnregisterMagickInfo("M"); + (void) UnregisterMagickInfo("B"); + (void) UnregisterMagickInfo("Y"); + (void) UnregisterMagickInfo("A"); + (void) UnregisterMagickInfo("O"); + (void) UnregisterMagickInfo("K"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e R A W I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteRAWImage() writes an image to a file as raw intensity values. +% +% The format of the WriteRAWImage method is: +% +% MagickBooleanType WriteRAWImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteRAWImage(const ImageInfo *image_info,Image *image) +{ + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + MagickBooleanType + status; + + const PixelPacket + *p; + + size_t + imageListLength, + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + switch (*image->magick) + { + case 'A': + case 'a': + { + quantum_type=AlphaQuantum; + break; + } + case 'B': + case 'b': + { + quantum_type=BlueQuantum; + break; + } + case 'C': + case 'c': + { + quantum_type=CyanQuantum; + if (image->colorspace == CMYKColorspace) + break; + ThrowWriterException(ImageError,"ColorSeparatedImageRequired"); + } + case 'g': + case 'G': + { + quantum_type=GreenQuantum; + break; + } + case 'I': + case 'i': + { + quantum_type=IndexQuantum; + break; + } + case 'K': + case 'k': + { + quantum_type=BlackQuantum; + if (image->colorspace == CMYKColorspace) + break; + ThrowWriterException(ImageError,"ColorSeparatedImageRequired"); + } + case 'M': + case 'm': + { + quantum_type=MagentaQuantum; + if (image->colorspace == CMYKColorspace) + break; + ThrowWriterException(ImageError,"ColorSeparatedImageRequired"); + } + case 'o': + case 'O': + { + quantum_type=OpacityQuantum; + break; + } + case 'R': + case 'r': + { + quantum_type=RedQuantum; + break; + } + case 'Y': + case 'y': + { + quantum_type=YellowQuantum; + if (image->colorspace == CMYKColorspace) + break; + ThrowWriterException(ImageError,"ColorSeparatedImageRequired"); + } + default: + { + quantum_type=GrayQuantum; + break; + } + } + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Convert image to RAW raster pixels. + */ + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + quantum_type,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/rgb.c b/ImageMagick-6.9.12-44/coders/rgb.c new file mode 100644 index 0000000..8a0ce7c --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/rgb.c @@ -0,0 +1,1484 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% RRRR GGGG BBBB % +% R R G B B % +% RRRR G GG BBBB % +% R R G G B B % +% R R GGG BBBB % +% % +% % +% Read/Write Raw RGB Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/channel.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteRGBImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d R G B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadRGBImage() reads an image of raw RGB, RGBA, or RGBO samples and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadRGBImage method is: +% +% Image *ReadRGBImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + const void + *stream; + + Image + *canvas_image, + *image; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + i; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + if (image_info->interlace != PartitionInterlace) + { + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + } + /* + Create virtual canvas to support cropping (i.e. image.rgb[100x100+10+20]). + */ + canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse, + exception); + if (canvas_image == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + quantum_type=RGBQuantum; + if (LocaleCompare(image_info->magick,"RGBA") == 0) + { + quantum_type=RGBAQuantum; + canvas_image->matte=MagickTrue; + } + if (LocaleCompare(image_info->magick,"RGBO") == 0) + { + quantum_type=RGBOQuantum; + canvas_image->matte=MagickTrue; + } + (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod); + quantum_info=AcquireQuantumInfo(image_info,canvas_image); + if (quantum_info == (QuantumInfo *) NULL) + { + canvas_image=DestroyImage(canvas_image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=GetQuantumPixels(quantum_info); + if (image_info->number_scenes != 0) + while (image->scene < image_info->scene) + { + /* + Skip to next image. + */ + image->scene++; + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + for (y=0; y < (ssize_t) image->rows; y++) + { + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + } + count=0; + length=0; + scene=0; + status=MagickTrue; + stream=NULL; + do + { + /* + Read pixels to virtual canvas image then push to image. + */ + image->matte=canvas_image->matte; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + break; + switch (image_info->interlace) + { + case NoInterlace: + default: + { + /* + No interlacing: RGBRGBRGBRGBRGBRGB... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=QueueAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + SetPixelGreen(q,GetPixelGreen(p)); + SetPixelBlue(q,GetPixelBlue(p)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + break; + } + case LineInterlace: + { + static QuantumType + quantum_types[4] = + { + RedQuantum, + GreenQuantum, + BlueQuantum, + AlphaQuantum + }; + + /* + Line interlacing: RRR...GGG...BBB...RRR...GGG...BBB... + */ + if (LocaleCompare(image_info->magick,"RGBO") == 0) + quantum_types[3]=OpacityQuantum; + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + for (i=0; i < (ssize_t) (image->matte != MagickFalse ? 4 : 3); i++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + quantum_type=quantum_types[i]; + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x, + 0,canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + switch (quantum_type) + { + case RedQuantum: + { + SetPixelRed(q,GetPixelRed(p)); + break; + } + case GreenQuantum: + { + SetPixelGreen(q,GetPixelGreen(p)); + break; + } + case BlueQuantum: + { + SetPixelBlue(q,GetPixelBlue(p)); + break; + } + case OpacityQuantum: + { + SetPixelOpacity(q,GetPixelOpacity(p)); + break; + } + case AlphaQuantum: + { + SetPixelAlpha(q,GetPixelAlpha(p)); + break; + } + default: + break; + } + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + { + /* + Plane interlacing: RRRRRR...GGGGGG...BBBBBB... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,RedQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,1,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,GreenQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelGreen(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,2,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlueQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,GetPixelBlue(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,3,6); + if (status == MagickFalse) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,4,6); + if (status == MagickFalse) + break; + } + if (image->matte != MagickFalse) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,AlphaQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image, + canvas_image->extract_info.x,0,canvas_image->columns,1, + exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,5,6); + if (status == MagickFalse) + break; + } + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + case PartitionInterlace: + { + /* + Partition interlacing: RRRRRR..., GGGGGG..., BBBBBB... + */ + AppendImageFormat("R",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,RedQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,1,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("G",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,GreenQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,GreenQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelGreen(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,2,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("B",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,BlueQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlueQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,GetPixelBlue(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,3,5); + if (status == MagickFalse) + break; + } + if (image->matte != MagickFalse) + { + (void) CloseBlob(image); + AppendImageFormat("A",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels( + quantum_info),&count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlueQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x, + 0,canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,4,5); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,5,5); + if (status == MagickFalse) + break; + } + break; + } + } + if (status == MagickFalse) + break; + SetQuantumImageType(image,quantum_type); + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (count == (ssize_t) length) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + scene++; + } while (count == (ssize_t) length); + quantum_info=DestroyQuantumInfo(quantum_info); + InheritException(&image->exception,&canvas_image->exception); + canvas_image=DestroyImage(canvas_image); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r R G B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterRGBImage() adds attributes for the RGB image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterRGBImage method is: +% +% size_t RegisterRGBImage(void) +% +*/ +ModuleExport size_t RegisterRGBImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("RGB"); + entry->decoder=(DecodeImageHandler *) ReadRGBImage; + entry->encoder=(EncodeImageHandler *) WriteRGBImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw red, green, and blue samples"); + entry->magick_module=ConstantString("RGB"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("RGBA"); + entry->decoder=(DecodeImageHandler *) ReadRGBImage; + entry->encoder=(EncodeImageHandler *) WriteRGBImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw red, green, blue, and alpha samples"); + entry->magick_module=ConstantString("RGB"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("RGBO"); + entry->decoder=(DecodeImageHandler *) ReadRGBImage; + entry->encoder=(EncodeImageHandler *) WriteRGBImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw red, green, blue, and opacity samples"); + entry->magick_module=ConstantString("RGB"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r R G B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterRGBImage() removes format registrations made by the RGB module +% from the list of supported formats. +% +% The format of the UnregisterRGBImage method is: +% +% UnregisterRGBImage(void) +% +*/ +ModuleExport void UnregisterRGBImage(void) +{ + (void) UnregisterMagickInfo("RGBO"); + (void) UnregisterMagickInfo("RGBA"); + (void) UnregisterMagickInfo("RGB"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e R G B I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteRGBImage() writes an image to a file in the RGB, RGBA, or RGBO +% rasterfile format. +% +% The format of the WriteRGBImage method is: +% +% MagickBooleanType WriteRGBImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteRGBImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + size_t + imageListLength, + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Allocate memory for pixels. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image_info->interlace != PartitionInterlace) + { + /* + Open output image file. + */ + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + } + quantum_type=RGBQuantum; + if (LocaleCompare(image_info->magick,"RGBA") == 0) + quantum_type=RGBAQuantum; + if (LocaleCompare(image_info->magick,"RGBO") == 0) + quantum_type=RGBOQuantum; + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Convert MIFF to RGB raster pixels. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + if ((LocaleCompare(image_info->magick,"RGBA") == 0) && + (image->matte == MagickFalse)) + (void) SetImageAlphaChannel(image,ResetAlphaChannel); + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + switch (image_info->interlace) + { + case NoInterlace: + default: + { + /* + No interlacing: RGBRGBRGBRGBRGBRGB... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case LineInterlace: + { + /* + Line interlacing: RRR...GGG...BBB...RRR...GGG...BBB... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GreenQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlueQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (quantum_type == RGBAQuantum) + { + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (quantum_type == RGBOQuantum) + { + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,OpacityQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + { + /* + Plane interlacing: RRRRRR...GGGGGG...BBBBBB... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GreenQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,2,6); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlueQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,3,6); + if (status == MagickFalse) + break; + } + if (quantum_type == RGBAQuantum) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,5,6); + if (status == MagickFalse) + break; + } + } + if (image_info->interlace == PartitionInterlace) + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + case PartitionInterlace: + { + /* + Partition interlacing: RRRRRR..., GGGGGG..., BBBBBB... + */ + AppendImageFormat("R",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,6); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("G",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GreenQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,2,6); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("B",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlueQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,3,6); + if (status == MagickFalse) + break; + } + if (quantum_type == RGBAQuantum) + { + (void) CloseBlob(image); + AppendImageFormat("A",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,5,6); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,6,6); + if (status == MagickFalse) + break; + } + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/rgf.c b/ImageMagick-6.9.12-44/coders/rgf.c new file mode 100644 index 0000000..019878e --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/rgf.c @@ -0,0 +1,402 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% RRRR GGG FFFFF % +% R R G F % +% RRRR G GG FFF % +% R R G G F % +% R R GGG F % +% % +% % +% Read/Write LEGO Mindstorms EV3 Robot Graphics File % +% % +% Software Design % +% Brian Wheeler % +% August 2013 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteRGFImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d X B M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadRGFImage() reads an RGF bitmap image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadRGFImage method is: +% +% Image *ReadRGFImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadRGFImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + i, + x; + + unsigned char + *p; + + size_t + bit, + byte; + + ssize_t + y; + + unsigned char + *data; + + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read RGF header. + */ + image->columns = (unsigned long) ReadBlobByte(image); + image->rows = (unsigned long) ReadBlobByte(image); + image->depth=8; + image->storage_class=PseudoClass; + image->colors=2; + /* + Initialize image structure. + */ + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Initialize colormap. + */ + image->colormap[0].red=QuantumRange; + image->colormap[0].green=QuantumRange; + image->colormap[0].blue=QuantumRange; + image->colormap[1].red=(Quantum) 0; + image->colormap[1].green=(Quantum) 0; + image->colormap[1].blue=(Quantum) 0; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Read hex image data. + */ + data=(unsigned char *) AcquireQuantumMemory(image->rows,image->columns* + sizeof(*data)); + if (data == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + p=data; + for (i=0; i < (ssize_t) (image->columns * image->rows); i++) + { + *p++=ReadBlobByte(image); + } + + /* + Convert RGF image to pixel packets. + */ + p=data; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (bit == 0) + byte=(size_t) (*p++); + SetPixelIndex(indexes+x,(Quantum) ((byte & 0x01) != 0 ? 0x01 : 0x00)); + bit++; + byte>>=1; + if (bit == 8) + bit=0; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + data=(unsigned char *) RelinquishMagickMemory(data); + (void) SyncImage(image); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r R G F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterRGFImage() adds attributes for the RGF image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterRGFImage method is: +% +% size_t RegisterRGFImage(void) +% +*/ +ModuleExport size_t RegisterRGFImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("RGF"); + entry->decoder=(DecodeImageHandler *) ReadRGFImage; + entry->encoder=(EncodeImageHandler *) WriteRGFImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString( + "LEGO Mindstorms EV3 Robot Graphic Format (black and white)"); + entry->magick_module=ConstantString("RGF"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r R G F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterRGFImage() removes format registrations made by the +% RGF module from the list of supported formats. +% +% The format of the UnregisterRGFImage method is: +% +% UnregisterRGFImage(void) +% +*/ +ModuleExport void UnregisterRGFImage(void) +{ + (void) UnregisterMagickInfo("RGF"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e R G F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteRGFImage() writes an image to a file in the X bitmap format. +% +% The format of the WriteRGFImage method is: +% +% MagickBooleanType WriteRGFImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType WriteRGFImage(const ImageInfo *image_info,Image *image) +{ + MagickBooleanType + status; + + int + bit; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + y; + + unsigned char + byte; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + if((image->columns > 255L) || (image->rows > 255L)) + ThrowWriterException(ImageError,"Dimensions must be less than 255x255"); + /* + Write header (just the image dimensions) + */ + (void) WriteBlobByte(image,image->columns & 0xff); + (void) WriteBlobByte(image,image->rows & 0xff); + /* + Convert MIFF to bit pixels. + */ + (void) SetImageType(image,BilevelType); + x=0; + y=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte>>=1; + if (GetPixelLuma(image,p) < (QuantumRange/2.0)) + byte|=0x80; + bit++; + if (bit == 8) + { + /* + Write a bitmap byte to the image file. + */ + (void) WriteBlobByte(image,byte); + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + { + byte >>= 8 - bit; + (void) WriteBlobByte(image,byte); + } + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/rla.c b/ImageMagick-6.9.12-44/coders/rla.c new file mode 100644 index 0000000..587db8c --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/rla.c @@ -0,0 +1,481 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% RRRR L AAA % +% R R L A A % +% RRRR L AAAAA % +% R R L A A % +% R R LLLLL A A % +% % +% % +% Read Alias/Wavefront Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/property.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d R L A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadRLAImage() reads a run-length encoded Wavefront RLA image file +% and returns it. It allocates the memory necessary for the new Image +% structure and returns a pointer to the new image. +% +% Note: This module was contributed by Lester Vecsey (master@internexus.net). +% +% The format of the ReadRLAImage method is: +% +% Image *ReadRLAImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadRLAImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + typedef struct _WindowFrame + { + short + left, + right, + bottom, + top; + } WindowFrame; + + typedef struct _RLAInfo + { + WindowFrame + window, + active_window; + + short + frame, + storage_type, + number_channels, + number_matte_channels, + number_auxiliary_channels, + revision; + + char + gamma[16+1], + red_primary[24+1], + green_primary[24+1], + blue_primary[24+1], + white_point[24+1]; + + int + job_number; + + char + name[128+1], + description[128+1], + program[64+1], + machine[32+1], + user[32+1], + date[20+1], + aspect[24+1], + aspect_ratio[8+1], + chan[32+1]; + + short + field; + + char + time[12+1], + filter[32+1]; + + short + bits_per_channel, + matte_type, + matte_bits, + auxiliary_type, + auxiliary_bits; + + char + auxiliary[32+1], + space[36+1]; + + int + next; + } RLAInfo; + + Image + *image; + + int + channel, + length, + runlength; + + MagickBooleanType + status; + + MagickOffsetType + offset, + *scanlines; + + ssize_t + i, + x; + + PixelPacket + *q; + + ssize_t + count, + y; + + RLAInfo + rla_info; + + unsigned char + byte; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + (void) memset(&rla_info,0,sizeof(rla_info)); + rla_info.window.left=(short) ReadBlobMSBShort(image); + rla_info.window.right=(short) ReadBlobMSBShort(image); + rla_info.window.bottom=(short) ReadBlobMSBShort(image); + rla_info.window.top=(short) ReadBlobMSBShort(image); + rla_info.active_window.left=(short) ReadBlobMSBShort(image); + rla_info.active_window.right=(short) ReadBlobMSBShort(image); + rla_info.active_window.bottom=(short) ReadBlobMSBShort(image); + rla_info.active_window.top=(short) ReadBlobMSBShort(image); + rla_info.frame=(short) ReadBlobMSBShort(image); + rla_info.storage_type=(short) ReadBlobMSBShort(image); + rla_info.number_channels=(short) ReadBlobMSBShort(image); + if (rla_info.number_channels < 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + rla_info.number_matte_channels=(short) ReadBlobMSBShort(image); + if (rla_info.number_matte_channels < 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((rla_info.number_channels > 3) || (rla_info.number_matte_channels > 3)) + ThrowReaderException(CoderError,"Unsupported number of channels"); + if (rla_info.number_channels == 0) + rla_info.number_channels=3; + rla_info.number_channels+=rla_info.number_matte_channels; + rla_info.number_auxiliary_channels=(short) ReadBlobMSBShort(image); + rla_info.revision=(short) ReadBlobMSBShort(image); + (void) ReadBlob(image,16,(unsigned char *) rla_info.gamma); + (void) ReadBlob(image,24,(unsigned char *) rla_info.red_primary); + (void) ReadBlob(image,24,(unsigned char *) rla_info.green_primary); + (void) ReadBlob(image,24,(unsigned char *) rla_info.blue_primary); + (void) ReadBlob(image,24,(unsigned char *) rla_info.white_point); + rla_info.job_number=ReadBlobMSBSignedLong(image); + (void) ReadBlob(image,128,(unsigned char *) rla_info.name); + (void) ReadBlob(image,128,(unsigned char *) rla_info.description); + rla_info.description[127]='\0'; + (void) ReadBlob(image,64,(unsigned char *) rla_info.program); + (void) ReadBlob(image,32,(unsigned char *) rla_info.machine); + (void) ReadBlob(image,32,(unsigned char *) rla_info.user); + (void) ReadBlob(image,20,(unsigned char *) rla_info.date); + (void) ReadBlob(image,24,(unsigned char *) rla_info.aspect); + (void) ReadBlob(image,8,(unsigned char *) rla_info.aspect_ratio); + (void) ReadBlob(image,32,(unsigned char *) rla_info.chan); + rla_info.field=(short) ReadBlobMSBShort(image); + (void) ReadBlob(image,12,(unsigned char *) rla_info.time); + (void) ReadBlob(image,32,(unsigned char *) rla_info.filter); + rla_info.bits_per_channel=(short) ReadBlobMSBShort(image); + rla_info.matte_type=(short) ReadBlobMSBShort(image); + rla_info.matte_bits=(short) ReadBlobMSBShort(image); + rla_info.auxiliary_type=(short) ReadBlobMSBShort(image); + rla_info.auxiliary_bits=(short) ReadBlobMSBShort(image); + (void) ReadBlob(image,32,(unsigned char *) rla_info.auxiliary); + count=ReadBlob(image,36,(unsigned char *) rla_info.space); + if ((size_t) count != 36) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + rla_info.next=ReadBlobMSBSignedLong(image); + /* + Initialize image structure. + */ + image->matte=rla_info.number_matte_channels != 0 ? MagickTrue : MagickFalse; + image->columns=(size_t) (rla_info.active_window.right- + rla_info.active_window.left+1); + image->rows=(size_t) (rla_info.active_window.top- + rla_info.active_window.bottom+1); + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + scanlines=(MagickOffsetType *) AcquireQuantumMemory(image->rows, + sizeof(*scanlines)); + if (scanlines == (MagickOffsetType *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (*rla_info.description != '\0') + (void) SetImageProperty(image,"comment",(char *) rla_info.description); + /* + Read offsets to each scanline data. + */ + for (i=0; i < (ssize_t) image->rows; i++) + scanlines[i]=(MagickOffsetType) ReadBlobMSBSignedLong(image); + if (EOFBlob(image) != MagickFalse) + { + scanlines=(MagickOffsetType *) RelinquishMagickMemory(scanlines); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + /* + Read image data. + */ + x=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + offset=SeekBlob(image,scanlines[image->rows-y-1],SEEK_SET); + if (offset < 0) + { + scanlines=(MagickOffsetType *) RelinquishMagickMemory(scanlines); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + for (channel=0; channel < (int) rla_info.number_channels; channel++) + { + length=ReadBlobMSBSignedShort(image); + while (length > 0) + { + byte=(unsigned char) ReadBlobByte(image); + runlength=byte; + if (byte > 127) + runlength=byte-256; + length--; + if (length == 0) + break; + if (runlength < 0) + { + while (runlength < 0) + { + q=GetAuthenticPixels(image,(ssize_t) (x % image->columns),y,1,1, + exception); + if (q == (PixelPacket *) NULL) + break; + byte=(unsigned char) ReadBlobByte(image); + length--; + switch (channel) + { + case 0: + { + SetPixelRed(q,ScaleCharToQuantum(byte)); + break; + } + case 1: + { + SetPixelGreen(q,ScaleCharToQuantum(byte)); + break; + } + case 2: + { + SetPixelBlue(q,ScaleCharToQuantum(byte)); + break; + } + case 3: + default: + { + SetPixelAlpha(q,ScaleCharToQuantum(byte)); + break; + } + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + x++; + runlength++; + } + continue; + } + byte=(unsigned char) ReadBlobByte(image); + length--; + runlength++; + do + { + q=GetAuthenticPixels(image,(ssize_t) (x % image->columns),y,1,1, + exception); + if (q == (PixelPacket *) NULL) + break; + switch (channel) + { + case 0: + { + SetPixelRed(q,ScaleCharToQuantum(byte)); + break; + } + case 1: + { + SetPixelGreen(q,ScaleCharToQuantum(byte)); + break; + } + case 2: + { + SetPixelBlue(q,ScaleCharToQuantum(byte)); + break; + } + case 3: + default: + { + SetPixelAlpha(q,ScaleCharToQuantum(byte)); + break; + } + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + x++; + runlength--; + } + while (runlength > 0); + } + } + if ((x/(ssize_t) rla_info.number_channels) > (ssize_t) image->columns) + { + scanlines=(MagickOffsetType *) RelinquishMagickMemory(scanlines); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + if (EOFBlob(image) != MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + scanlines=(MagickOffsetType *) RelinquishMagickMemory(scanlines); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r R L A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterRLAImage() adds attributes for the RLA image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterRLAImage method is: +% +% size_t RegisterRLAImage(void) +% +*/ +ModuleExport size_t RegisterRLAImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("RLA"); + entry->decoder=(DecodeImageHandler *) ReadRLAImage; + entry->adjoin=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Alias/Wavefront image"); + entry->magick_module=ConstantString("RLA"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r R L A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterRLAImage() removes format registrations made by the +% RLA module from the list of supported formats. +% +% The format of the UnregisterRLAImage method is: +% +% UnregisterRLAImage(void) +% +*/ +ModuleExport void UnregisterRLAImage(void) +{ + (void) UnregisterMagickInfo("RLA"); +} diff --git a/ImageMagick-6.9.12-44/coders/rle.c b/ImageMagick-6.9.12-44/coders/rle.c new file mode 100644 index 0000000..9441769 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/rle.c @@ -0,0 +1,786 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% RRRR L EEEEE % +% R R L E % +% RRRR L EEE % +% R R L E % +% R R LLLLL EEEEE % +% % +% % +% Read URT RLE Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/pixel.h" +#include "magick/property.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s R L E % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsRLE() returns MagickTrue if the image format type, identified by the +% magick string, is RLE. +% +% The format of the ReadRLEImage method is: +% +% MagickBooleanType IsRLE(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +% +*/ +static MagickBooleanType IsRLE(const unsigned char *magick,const size_t length) +{ + if (length < 2) + return(MagickFalse); + if (memcmp(magick,"\122\314",2) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d R L E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadRLEImage() reads a run-length encoded Utah Raster Toolkit +% image file and returns it. It allocates the memory necessary for the new +% Image structure and returns a pointer to the new image. +% +% The format of the ReadRLEImage method is: +% +% Image *ReadRLEImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +% +*/ +static Image *ReadRLEImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define SkipLinesOp 0x01 +#define SetColorOp 0x02 +#define SkipPixelsOp 0x03 +#define ByteDataOp 0x05 +#define RunDataOp 0x06 +#define EOFOp 0x07 +#define ThrowRLEException(exception,message) \ +{ \ + if (colormap != (unsigned char *) NULL) \ + colormap=(unsigned char *) RelinquishMagickMemory(colormap); \ + if (pixel_info != (MemoryInfo *) NULL) \ + pixel_info=RelinquishVirtualMemory(pixel_info); \ + ThrowReaderException((exception),(message)); \ +} + + + char + magick[12]; + + Image + *image; + + IndexPacket + index; + + int + opcode, + operand, + status; + + MagickStatusType + flags; + + MagickSizeType + number_pixels; + + MemoryInfo + *pixel_info; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + i; + + unsigned char + *p; + + size_t + bits_per_pixel, + map_length, + number_colormaps, + number_planes, + number_planes_filled, + one, + pixel_info_length; + + ssize_t + count, + offset, + y; + + unsigned char + background_color[256], + *colormap, + pixel, + plane, + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + return(DestroyImageList(image)); + /* + Determine if this a RLE file. + */ + colormap=(unsigned char *) NULL; + pixel_info=(MemoryInfo *) NULL; + count=ReadBlob(image,2,(unsigned char *) magick); + if ((count != 2) || (memcmp(magick,"\122\314",2) != 0)) + ThrowRLEException(CorruptImageError,"ImproperImageHeader"); + do + { + /* + Read image header. + */ + image->page.x=(ssize_t) ReadBlobLSBShort(image); + image->page.y=(ssize_t) ReadBlobLSBShort(image); + image->columns=ReadBlobLSBShort(image); + image->rows=ReadBlobLSBShort(image); + flags=(MagickStatusType) ReadBlobByte(image); + image->matte=flags & 0x04 ? MagickTrue : MagickFalse; + number_planes=(size_t) ReadBlobByte(image); + bits_per_pixel=(size_t) ReadBlobByte(image); + number_colormaps=(size_t) ReadBlobByte(image); + map_length=(unsigned char) ReadBlobByte(image); + if (map_length >= 22) + ThrowRLEException(CorruptImageError,"ImproperImageHeader"); + if (EOFBlob(image) != MagickFalse) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + one=1; + map_length=one << map_length; + if ((number_planes == 0) || (number_planes == 2) || ((flags & 0x04) && + ((number_planes <= 2) || number_planes > 254)) || (bits_per_pixel != 8)) + ThrowRLEException(CorruptImageError,"ImproperImageHeader"); + if (number_planes > 4) + ThrowRLEException(CorruptImageError,"ImproperImageHeader"); + if ((image->columns == 0) || (image->columns >= 32768) || + (image->rows == 0) || (image->rows >= 32768)) + ThrowRLEException(CorruptImageError,"ImproperImageHeader"); + if (flags & 0x02) + { + /* + No background color-- initialize to black. + */ + for (i=0; i < (ssize_t) number_planes; i++) + background_color[i]=0; + (void) ReadBlobByte(image); + } + else + { + /* + Initialize background color. + */ + p=background_color; + for (i=0; i < (ssize_t) number_planes; i++) + *p++=(unsigned char) ReadBlobByte(image); + } + if ((number_planes & 0x01) == 0) + (void) ReadBlobByte(image); + if (EOFBlob(image) != MagickFalse) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + if (image->matte != MagickFalse) + number_planes++; + number_pixels=(MagickSizeType) image->columns*image->rows; + if ((GetBlobSize(image) == 0) || ((((MagickSizeType) number_pixels* + number_planes*bits_per_pixel/8)/GetBlobSize(image)) > 254)) + ThrowRLEException(CorruptImageError,"InsufficientImageDataInFile") + if (((MagickSizeType) number_colormaps*map_length) > GetBlobSize(image)) + ThrowRLEException(CorruptImageError,"InsufficientImageDataInFile") + if (number_colormaps != 0) + { + /* + Read image colormaps. + */ + colormap=(unsigned char *) AcquireQuantumMemory(number_colormaps, + 3*map_length*sizeof(*colormap)); + if (colormap == (unsigned char *) NULL) + ThrowRLEException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(colormap,0,3*number_colormaps*map_length* + sizeof(*colormap)); + p=colormap; + for (i=0; i < (ssize_t) number_colormaps; i++) + for (x=0; x < (ssize_t) map_length; x++) + { + *p++=(unsigned char) ScaleQuantumToChar(ScaleShortToQuantum( + ReadBlobLSBShort(image))); + if (EOFBlob(image) != MagickFalse) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + } + } + if ((flags & 0x08) != 0) + { + char + *comment; + + size_t + length; + + /* + Read image comment. + */ + length=ReadBlobLSBShort(image); + if (length != 0) + { + comment=(char *) AcquireQuantumMemory(length,sizeof(*comment)); + if (comment == (char *) NULL) + ThrowRLEException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,length-1,(unsigned char *) comment); + if (count != (ssize_t) (length-1)) + { + comment=DestroyString(comment); + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + } + comment[length-1]='\0'; + (void) SetImageProperty(image,"comment",comment); + comment=DestroyString(comment); + if ((length & 0x01) == 0) + (void) ReadBlobByte(image); + } + } + if (EOFBlob(image) != MagickFalse) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + if (colormap != (unsigned char *) NULL) + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + if (pixel_info != (MemoryInfo *) NULL) + pixel_info=RelinquishVirtualMemory(pixel_info); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Allocate RLE pixels. + */ + number_planes_filled=(number_planes % 2 == 0) ? number_planes : + number_planes+1; + if ((number_pixels*number_planes_filled) != (size_t) (number_pixels* + number_planes_filled)) + ThrowRLEException(ResourceLimitError,"MemoryAllocationFailed"); + pixel_info=AcquireVirtualMemory(image->columns,image->rows* + MagickMax(number_planes_filled,4)*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowRLEException(ResourceLimitError,"MemoryAllocationFailed"); + pixel_info_length=image->columns*image->rows* + MagickMax(number_planes_filled,4); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + (void) memset(pixels,0,pixel_info_length); + if ((flags & 0x01) && !(flags & 0x02)) + { + ssize_t + j; + + /* + Set background color. + */ + p=pixels; + for (i=0; i < (ssize_t) number_pixels; i++) + { + if (image->matte == MagickFalse) + for (j=0; j < (ssize_t) number_planes; j++) + *p++=background_color[j]; + else + { + for (j=0; j < (ssize_t) (number_planes-1); j++) + *p++=background_color[j]; + *p++=0; /* initialize matte channel */ + } + } + } + /* + Read runlength-encoded image. + */ + plane=0; + x=0; + y=0; + opcode=ReadBlobByte(image); + if (opcode == EOF) + { + if (number_colormaps != 0) + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + } + do + { + switch (opcode & 0x3f) + { + case SkipLinesOp: + { + operand=ReadBlobByte(image); + if (operand == EOF) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + if (opcode & 0x40) + { + operand=ReadBlobLSBSignedShort(image); + if (operand == EOF) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + } + x=0; + y+=operand; + break; + } + case SetColorOp: + { + operand=ReadBlobByte(image); + if (operand == EOF) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + plane=(unsigned char) operand; + if (plane == 255) + plane=(unsigned char) (number_planes-1); + x=0; + break; + } + case SkipPixelsOp: + { + operand=ReadBlobByte(image); + if (operand == EOF) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + if (opcode & 0x40) + { + operand=ReadBlobLSBSignedShort(image); + if (operand == EOF) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + } + x+=operand; + break; + } + case ByteDataOp: + { + operand=ReadBlobByte(image); + if (operand == EOF) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + if (opcode & 0x40) + { + operand=ReadBlobLSBSignedShort(image); + if (operand == EOF) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + } + offset=(ssize_t) (((image->rows-y-1)*image->columns*number_planes)+x* + number_planes+plane); + operand++; + if ((offset < 0) || + ((size_t) (offset+operand*number_planes) > pixel_info_length)) + ThrowRLEException(CorruptImageError,"UnableToReadImageData"); + p=pixels+offset; + for (i=0; i < (ssize_t) operand; i++) + { + pixel=(unsigned char) ReadBlobByte(image); + if ((y < (ssize_t) image->rows) && + ((x+i) < (ssize_t) image->columns)) + *p=pixel; + p+=number_planes; + } + if (operand & 0x01) + (void) ReadBlobByte(image); + x+=operand; + break; + } + case RunDataOp: + { + operand=ReadBlobByte(image); + if (operand == EOF) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + if (opcode & 0x40) + { + operand=ReadBlobLSBSignedShort(image); + if (operand == EOF) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + } + pixel=(unsigned char) ReadBlobByte(image); + (void) ReadBlobByte(image); + operand++; + offset=(ssize_t) (((image->rows-y-1)*image->columns*number_planes)+x* + number_planes+plane); + if ((offset < 0) || + ((size_t) (offset+operand*number_planes) > pixel_info_length)) + ThrowRLEException(CorruptImageError,"UnableToReadImageData"); + p=pixels+offset; + for (i=0; i < (ssize_t) operand; i++) + { + if ((y < (ssize_t) image->rows) && + ((x+i) < (ssize_t) image->columns)) + *p=pixel; + p+=number_planes; + } + x+=operand; + break; + } + default: + break; + } + opcode=ReadBlobByte(image); + if (opcode == EOF) + ThrowRLEException(CorruptImageError,"UnexpectedEndOfFile"); + } while (((opcode & 0x3f) != EOFOp) && (opcode != EOF)); + if (number_colormaps != 0) + { + MagickStatusType + mask; + + /* + Apply colormap affineation to image. + */ + mask=(MagickStatusType) (map_length-1); + p=pixels; + x=(ssize_t) number_planes; + if (number_colormaps == 1) + for (i=0; i < (ssize_t) number_pixels; i++) + { + if (IsValidColormapIndex(image,(ssize_t) (*p & mask),&index,exception) == + MagickFalse) + break; + *p=colormap[(ssize_t) index]; + p++; + } + else + if ((number_planes >= 3) && (number_colormaps >= 3)) + for (i=0; i < (ssize_t) number_pixels; i++) + for (x=0; x < (ssize_t) number_planes; x++) + { + if (IsValidColormapIndex(image,(ssize_t) (x*map_length+ + (*p & mask)),&index,exception) == MagickFalse) + break; + *p=colormap[(ssize_t) index]; + p++; + } + if ((i < (ssize_t) number_pixels) || (x < (ssize_t) number_planes)) + ThrowRLEException(CorruptImageError,"UnableToReadImageData"); + } + /* + Initialize image structure. + */ + if (number_planes >= 3) + { + /* + Convert raster image to DirectClass pixel packets. + */ + p=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + if (image->matte != MagickFalse) + SetPixelAlpha(q,ScaleCharToQuantum(*p++)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + else + { + /* + Create colormap. + */ + if (number_colormaps == 0) + map_length=256; + if (AcquireImageColormap(image,map_length) == MagickFalse) + ThrowRLEException(ResourceLimitError,"MemoryAllocationFailed"); + p=colormap; + if (number_colormaps == 1) + for (i=0; i < (ssize_t) image->colors; i++) + { + /* + Pseudocolor. + */ + image->colormap[i].red=ScaleCharToQuantum((unsigned char) i); + image->colormap[i].green=ScaleCharToQuantum((unsigned char) i); + image->colormap[i].blue=ScaleCharToQuantum((unsigned char) i); + } + else + if (number_colormaps > 1) + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=ScaleCharToQuantum(*p); + image->colormap[i].green=ScaleCharToQuantum(*(p+map_length)); + image->colormap[i].blue=ScaleCharToQuantum(*(p+map_length*2)); + p++; + } + p=pixels; + if (image->matte == MagickFalse) + { + /* + Convert raster image to PseudoClass pixel packets. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,*p++); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + (void) SyncImage(image); + } + else + { + /* + Image has a matte channel-- promote to DirectClass. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (IsValidColormapIndex(image,(ssize_t) *p++,&index,exception) == + MagickFalse) + break; + SetPixelRed(q,image->colormap[(ssize_t) index].red); + if (IsValidColormapIndex(image,(ssize_t) *p++,&index,exception) == + MagickFalse) + break; + SetPixelGreen(q,image->colormap[(ssize_t) index].green); + if (IsValidColormapIndex(image,(ssize_t) *p++,&index,exception) == + MagickFalse) + break; + SetPixelBlue(q,image->colormap[(ssize_t) index].blue); + SetPixelAlpha(q,ScaleCharToQuantum(*p++)); + q++; + } + if (x < (ssize_t) image->columns) + break; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + image->colormap=(PixelPacket *) RelinquishMagickMemory( + image->colormap); + image->storage_class=DirectClass; + image->colors=0; + } + } + if (colormap != (unsigned char *) NULL) + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + (void) ReadBlobByte(image); + count=ReadBlob(image,2,(unsigned char *) magick); + if ((count != 0) && (memcmp(magick,"\122\314",2) == 0)) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while ((count != 0) && (memcmp(magick,"\122\314",2) == 0)); + if (colormap != (unsigned char *) NULL) + colormap=(unsigned char *) RelinquishMagickMemory(colormap); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r R L E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterRLEImage() adds attributes for the RLE image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterRLEImage method is: +% +% size_t RegisterRLEImage(void) +% +*/ +ModuleExport size_t RegisterRLEImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("RLE"); + entry->decoder=(DecodeImageHandler *) ReadRLEImage; + entry->magick=(IsImageFormatHandler *) IsRLE; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Utah Run length encoded image"); + entry->magick_module=ConstantString("RLE"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r R L E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterRLEImage() removes format registrations made by the +% RLE module from the list of supported formats. +% +% The format of the UnregisterRLEImage method is: +% +% UnregisterRLEImage(void) +% +*/ +ModuleExport void UnregisterRLEImage(void) +{ + (void) UnregisterMagickInfo("RLE"); +} diff --git a/ImageMagick-6.9.12-44/coders/scr.c b/ImageMagick-6.9.12-44/coders/scr.c new file mode 100644 index 0000000..6603399 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/scr.c @@ -0,0 +1,314 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS CCCC RRRR % +% SS C R R % +% SSS C RRRR % +% SS C R R % +% SSSSS CCCC R R % +% % +% % +% Read ZX-Spectrum SCREEN$ Format % +% % +% Software Design % +% Catalin Mihaila % +% October 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d S C R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadSCRImage() reads a Scitex image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the ReadSCRImage method is: +% +% Image *ReadSCRImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadSCRImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char zxscr[6144]; + char zxattr[768]; + int octetnr; + int octetline; + int zoneline; + int zonenr; + int octet_val; + int attr_nr; + int pix; + int piy; + int binar[8]; + int attrbin[8]; + int *pbin; + int *abin; + int z; + int one_nr; + int ink; + int paper; + int bright; + + unsigned char colour_palette[] = { + 0, 0, 0, + 0, 0,192, + 192, 0, 0, + 192, 0,192, + 0,192, 0, + 0,192,192, + 192,192, 0, + 192,192,192, + 0, 0, 0, + 0, 0,255, + 255, 0, 0, + 255, 0,255, + 0,255, 0, + 0,255,255, + 255,255, 0, + 255,255,255 + }; + + Image + *image; + + MagickBooleanType + status; + + PixelPacket + *q; + + ssize_t + count; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + image->columns = 256; + image->rows = 192; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + count=ReadBlob(image,6144,(unsigned char *) zxscr); + if (count != 6144) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + count=ReadBlob(image,768,(unsigned char *) zxattr); + if (count != 768) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + for(zonenr=0;zonenr<3;zonenr++) + { + for(zoneline=0;zoneline<8;zoneline++) + { + for(octetline=0;octetline<8;octetline++) + { + for(octetnr=(zoneline*32);octetnr<((zoneline*32)+32);octetnr++) + { + octet_val = zxscr[octetnr+(256*octetline)+(zonenr*2048)]; + attr_nr = zxattr[octetnr+(256*zonenr)]; + + pix = (((8*octetnr)-(256*zoneline))); + piy = ((octetline+(8*zoneline)+(zonenr*64))); + + pbin = binar; + abin = attrbin; + + one_nr=1; + + for(z=0;z<8;z++) + { + if(octet_val&one_nr) + { + *pbin = 1; + } else { + *pbin = 0; + } + one_nr=one_nr*2; + pbin++; + } + + one_nr = 1; + + for(z=0;z<8;z++) + { + if(attr_nr&one_nr) + { + *abin = 1; + } else { + *abin = 0; + } + one_nr=one_nr*2; + abin++; + } + + ink = (attrbin[0]+(2*attrbin[1])+(4*attrbin[2])); + paper = (attrbin[3]+(2*attrbin[4])+(4*attrbin[5])); + bright = attrbin[6]; + + if(bright) { ink=ink+8; paper=paper+8; } + + for(z=7;z>-1;z--) + { + q=QueueAuthenticPixels(image,pix,piy,1,1,exception); + if (q == (PixelPacket *) NULL) + break; + + if(binar[z]) + { + SetPixelRed(q,ScaleCharToQuantum( + colour_palette[3*ink])); + SetPixelGreen(q,ScaleCharToQuantum( + colour_palette[1+(3*ink)])); + SetPixelBlue(q,ScaleCharToQuantum( + colour_palette[2+(3*ink)])); + } else { + SetPixelRed(q,ScaleCharToQuantum( + colour_palette[3*paper])); + SetPixelGreen(q,ScaleCharToQuantum( + colour_palette[1+(3*paper)])); + SetPixelBlue(q,ScaleCharToQuantum( + colour_palette[2+(3*paper)])); + } + + pix++; + } + } + } + } + } + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r S C R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterSCRImage() adds attributes for the SCR image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterSCRImage method is: +% +% size_t RegisterSCRImage(void) +% +*/ +ModuleExport size_t RegisterSCRImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("SCR"); + entry->decoder=(DecodeImageHandler *) ReadSCRImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("ZX-Spectrum SCREEN$"); + entry->magick_module=ConstantString("SCR"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r S C R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterSCRImage() removes format registrations made by the +% SCR module from the list of supported formats. +% +% The format of the UnregisterSCRImage method is: +% +% UnregisterSCRImage(void) +% +*/ +ModuleExport void UnregisterSCRImage(void) +{ + (void) UnregisterMagickInfo("SCR"); +} diff --git a/ImageMagick-6.9.12-44/coders/screenshot.c b/ImageMagick-6.9.12-44/coders/screenshot.c new file mode 100644 index 0000000..9cae707 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/screenshot.c @@ -0,0 +1,336 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS CCCC RRRR EEEEE EEEEE N N SSSSS H H OOO TTTTT % +% SS C R R E E NN N SS H H O O T % +% SSS C RRRR EEE EEE N N N SSS HHHHH O O T % +% SS C R R E E N NN SS H H O O T % +% SSSSS CCCC R R EEEEE EEEEE N N SSSSS H H OOO T % +% % +% % +% Takes a screenshot from the monitor(s). % +% % +% Software Design % +% Dirk Lemstra % +% April 2014 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#if defined(MAGICKCORE_WINGDI32_DELEGATE) +# if defined(__CYGWIN__) +# include +# else + /* All MinGW needs ... */ +# include "magick/nt-base-private.h" +# include +# ifndef DISPLAY_DEVICE_ACTIVE +# define DISPLAY_DEVICE_ACTIVE 0x00000001 +# endif +# endif +#endif +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/nt-feature.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/token.h" +#include "magick/transform.h" +#include "magick/utility.h" +#include "magick/xwindow.h" +#include "magick/xwindow-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d S C R E E N S H O T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadSCREENSHOTImage() Takes a screenshot from the monitor(s). +% +% The format of the ReadSCREENSHOTImage method is: +% +% Image *ReadXImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadSCREENSHOTImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=(Image *) NULL; +#if defined(MAGICKCORE_WINGDI32_DELEGATE) + { + BITMAPINFO + bmi; + + DISPLAY_DEVICE + device; + + HBITMAP + bitmap, + bitmapOld; + + HDC + bitmapDC, + hDC; + + Image + *screen; + + int + i; + + MagickBooleanType + status; + + PixelPacket + *q; + + ssize_t + x; + + RGBQUAD + *p; + + ssize_t + y; + + assert(image_info != (const ImageInfo *) NULL); + i=0; + device.cb = sizeof(device); + image=(Image *) NULL; + while(EnumDisplayDevices(NULL,i,&device,0) && ++i) + { + if ((device.StateFlags & DISPLAY_DEVICE_ACTIVE) != DISPLAY_DEVICE_ACTIVE) + continue; + + hDC=CreateDC(device.DeviceName,device.DeviceName,NULL,NULL); + if (hDC == (HDC) NULL) + ThrowReaderException(CoderError,"UnableToCreateDC"); + + screen=AcquireImage(image_info); + screen->columns=(size_t) GetDeviceCaps(hDC,HORZRES); + screen->rows=(size_t) GetDeviceCaps(hDC,VERTRES); + screen->storage_class=DirectClass; + if (image == (Image *) NULL) + image=screen; + else + AppendImageToList(&image,screen); + status=SetImageExtent(screen,screen->columns,screen->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + + bitmapDC=CreateCompatibleDC(hDC); + if (bitmapDC == (HDC) NULL) + { + DeleteDC(hDC); + ThrowReaderException(CoderError,"UnableToCreateDC"); + } + (void) memset(&bmi,0,sizeof(BITMAPINFO)); + bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biWidth=(LONG) screen->columns; + bmi.bmiHeader.biHeight=(-1)*(LONG) screen->rows; + bmi.bmiHeader.biPlanes=1; + bmi.bmiHeader.biBitCount=32; + bmi.bmiHeader.biCompression=BI_RGB; + bitmap=CreateDIBSection(hDC,&bmi,DIB_RGB_COLORS,(void **) &p,NULL,0); + if (bitmap == (HBITMAP) NULL) + { + DeleteDC(hDC); + DeleteDC(bitmapDC); + ThrowReaderException(CoderError,"UnableToCreateBitmap"); + } + bitmapOld=(HBITMAP) SelectObject(bitmapDC,bitmap); + if (bitmapOld == (HBITMAP) NULL) + { + DeleteDC(hDC); + DeleteDC(bitmapDC); + DeleteObject(bitmap); + ThrowReaderException(CoderError,"UnableToCreateBitmap"); + } + BitBlt(bitmapDC,0,0,(int) screen->columns,(int) screen->rows,hDC,0,0, + SRCCOPY); + (void) SelectObject(bitmapDC,bitmapOld); + + for (y=0; y < (ssize_t) screen->rows; y++) + { + q=QueueAuthenticPixels(screen,0,y,screen->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) screen->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(p->rgbRed)); + SetPixelGreen(q,ScaleCharToQuantum(p->rgbGreen)); + SetPixelBlue(q,ScaleCharToQuantum(p->rgbBlue)); + SetPixelOpacity(q,OpaqueOpacity); + p++; + q++; + } + if (SyncAuthenticPixels(screen,exception) == MagickFalse) + break; + } + + DeleteDC(hDC); + DeleteDC(bitmapDC); + DeleteObject(bitmap); + } + } +#elif defined(MAGICKCORE_X11_DELEGATE) + { + const char + *option; + + XImportInfo + ximage_info; + + (void) exception; + XGetImportInfo(&ximage_info); + option=GetImageOption(image_info,"x:screen"); + if (option != (const char *) NULL) + ximage_info.screen=IsMagickTrue(option); + option=GetImageOption(image_info,"x:silent"); + if (option != (const char *) NULL) + ximage_info.silent=IsMagickTrue(option); + image=XImportImage(image_info,&ximage_info); + if ((image != (Image *) NULL) && (image_info->extract != (char *) NULL)) + { + Image + *crop_image; + + RectangleInfo + crop_info; + + /* + Crop image as defined by the extract rectangle. + */ + (void) ParsePageGeometry(image,image_info->extract,&crop_info, + exception); + crop_image=CropImage(image,&crop_info,exception); + if (crop_image != (Image *) NULL) + { + image=DestroyImage(image); + image=crop_image; + } + } + } +#endif + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r S C R E E N S H O T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterSCREENSHOTImage() adds attributes for the screen shot format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterScreenShotImage method is: +% +% size_t RegisterScreenShotImage(void) +% +*/ +ModuleExport size_t RegisterSCREENSHOTImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("SCREENSHOT"); + entry->decoder=(DecodeImageHandler *) ReadSCREENSHOTImage; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Screen shot"); + entry->magick_module=ConstantString("SCREENSHOT"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r S C R E E N S H O T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterScreenShotImage() removes format registrations made by the +% screen shot module from the list of supported formats. +% +% The format of the UnregisterSCREENSHOTImage method is: +% +% UnregisterSCREENSHOTImage(void) +% +*/ +ModuleExport void UnregisterSCREENSHOTImage(void) +{ + (void) UnregisterMagickInfo("SCREENSHOT"); +} diff --git a/ImageMagick-6.9.12-44/coders/sct.c b/ImageMagick-6.9.12-44/coders/sct.c new file mode 100644 index 0000000..6534c93 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/sct.c @@ -0,0 +1,371 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS CCCC TTTTT % +% SS C T % +% SSS C T % +% SS C T % +% SSSSS CCCC T % +% % +% % +% Read Scitex HandShake Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s S C T % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsSCT() returns MagickTrue if the image format type, identified by the +% magick string, is SCT. +% +% The format of the IsSCT method is: +% +% MagickBooleanType IsSCT(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsSCT(const unsigned char *magick,const size_t length) +{ + if (length < 2) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"CT",2) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d S C T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadSCTImage() reads a Scitex image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the ReadSCTImage method is: +% +% Image *ReadSCTImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadSCTImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + magick[2]; + + Image + *image; + + int + c; + + MagickBooleanType + status; + + MagickRealType + height, + width; + + Quantum + pixel; + + IndexPacket + *indexes; + + ssize_t + i, + x; + + PixelPacket + *q; + + ssize_t + count, + y; + + unsigned char + buffer[768]; + + size_t + separations, + separations_mask, + units; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read control block. + */ + memset(magick,0,sizeof(magick)); + memset(buffer,0,sizeof(buffer)); + count=ReadBlob(image,80,buffer); + (void) count; + count=ReadBlob(image,2,(unsigned char *) magick); + if ((LocaleNCompare((char *) magick,"CT",2) != 0) && + (LocaleNCompare((char *) magick,"LW",2) != 0) && + (LocaleNCompare((char *) magick,"BM",2) != 0) && + (LocaleNCompare((char *) magick,"PG",2) != 0) && + (LocaleNCompare((char *) magick,"TX",2) != 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((LocaleNCompare((char *) magick,"LW",2) == 0) || + (LocaleNCompare((char *) magick,"BM",2) == 0) || + (LocaleNCompare((char *) magick,"PG",2) == 0) || + (LocaleNCompare((char *) magick,"TX",2) == 0)) + ThrowReaderException(CoderError,"OnlyContinuousTonePictureSupported"); + count=ReadBlob(image,174,buffer); + count=ReadBlob(image,768,buffer); + /* + Read paramter block. + */ + units=1UL*ReadBlobByte(image); + if (units == 0) + image->units=PixelsPerCentimeterResolution; + separations=1UL*ReadBlobByte(image); + separations_mask=ReadBlobMSBShort(image); + count=ReadBlob(image,14,buffer); + buffer[14]='\0'; + height=StringToDouble((char *) buffer,(char **) NULL); + count=ReadBlob(image,14,buffer); + width=StringToDouble((char *) buffer,(char **) NULL); + count=ReadBlob(image,12,buffer); + buffer[12]='\0'; + image->rows=StringToUnsignedLong((char *) buffer); + count=ReadBlob(image,12,buffer); + image->columns=StringToUnsignedLong((char *) buffer); + count=ReadBlob(image,200,buffer); + count=ReadBlob(image,768,buffer); + if (separations_mask == 0x0f) + SetImageColorspace(image,CMYKColorspace); + if ((image->columns < 1) || (image->rows < 1) || + (width < MagickEpsilon) || (height < MagickEpsilon)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + image->x_resolution=1.0*image->columns/width; + image->y_resolution=1.0*image->rows/height; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Convert SCT raster image to pixel packets. + */ + (void) SetImageBackgroundColor(image); + c=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + for (i=0; i < (ssize_t) separations; i++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + c=ReadBlobByte(image); + if (c == EOF) + break; + pixel=(Quantum) ScaleCharToQuantum((unsigned char) c); + if (image->colorspace == CMYKColorspace) + pixel=(Quantum) (QuantumRange-pixel); + switch (i) + { + case 0: + { + SetPixelRed(q,pixel); + SetPixelGreen(q,pixel); + SetPixelBlue(q,pixel); + break; + } + case 1: + { + SetPixelGreen(q,pixel); + break; + } + case 2: + { + SetPixelBlue(q,pixel); + break; + } + case 3: + { + if (image->colorspace == CMYKColorspace) + SetPixelBlack(indexes+x,pixel); + break; + } + } + q++; + } + if (x < (ssize_t) image->columns) + break; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if ((image->columns % 2) != 0) + (void) ReadBlobByte(image); /* pad */ + } + if (i < (ssize_t) separations) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r S C T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterSCTImage() adds attributes for the SCT image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterSCTImage method is: +% +% size_t RegisterSCTImage(void) +% +*/ +ModuleExport size_t RegisterSCTImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("SCT"); + entry->decoder=(DecodeImageHandler *) ReadSCTImage; + entry->magick=(IsImageFormatHandler *) IsSCT; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Scitex HandShake"); + entry->magick_module=ConstantString("SCT"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r S C T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterSCTImage() removes format registrations made by the +% SCT module from the list of supported formats. +% +% The format of the UnregisterSCTImage method is: +% +% UnregisterSCTImage(void) +% +*/ +ModuleExport void UnregisterSCTImage(void) +{ + (void) UnregisterMagickInfo("SCT"); +} diff --git a/ImageMagick-6.9.12-44/coders/sfw.c b/ImageMagick-6.9.12-44/coders/sfw.c new file mode 100644 index 0000000..2e1222e --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/sfw.c @@ -0,0 +1,441 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS FFFFF W W % +% SS F W W % +% SSS FFF W W % +% SS F W W W % +% SSSSS F W W % +% % +% % +% Read/Write ImageMagick Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/transform.h" +#include "magick/utility.h" +#include "magick/utility-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s S F W % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsSFW() returns MagickTrue if the image format type, identified by the +% magick string, is SFW. +% +% The format of the IsSFW method is: +% +% MagickBooleanType IsSFW(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsSFW(const unsigned char *magick,const size_t length) +{ + if (length < 5) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"SFW94",5) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d S F W I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadSFWImage() reads a Seattle Film Works image file and returns it. +% It allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadSFWImage method is: +% +% Image *ReadSFWImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static unsigned char *SFWScan(unsigned char *p,const unsigned char *q, + const unsigned char *target,const size_t length) +{ + ssize_t + i; + + while ((p+length) < q) + { + for (i=0; i < (ssize_t) length; i++) + if (p[i] != target[i]) + break; + if (i == (ssize_t) length) + return((unsigned char *) p); + p++; + } + return((unsigned char *) NULL); +} + +static void TranslateSFWMarker(unsigned char *marker) +{ + switch (marker[1]) + { + case 0xc8: marker[1]=0xd8; break; /* soi */ + case 0xd0: marker[1]=0xe0; break; /* app */ + case 0xcb: marker[1]=0xdb; break; /* dqt */ + case 0xa0: marker[1]=0xc0; break; /* sof */ + case 0xa4: marker[1]=0xc4; break; /* sof */ + case 0xca: marker[1]=0xda; break; /* sos */ + case 0xc9: marker[1]=0xd9; break; /* eoi */ + default: break; + } +} + +static Image *ReadSFWImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + static const unsigned char + HuffmanTable[] = + { + 0xFF, 0xC4, 0x01, 0xA2, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x10, 0x00, 0x02, 0x01, + 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, + 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, + 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, + 0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, + 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, + 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, + 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, + 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, + 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, + 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, + 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, + 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0x11, + 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, + 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, + 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, + 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, + 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, + 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, + 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, + 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, + 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, + 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, + 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, + 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, + 0xF9, 0xFA + }; + + FILE + *file; + + Image + *flipped_image, + *jpeg_image, + *image; + + ImageInfo + *read_info; + + int + unique_file; + + MagickBooleanType + status; + + unsigned char + *header, + *data; + + size_t + extent; + + ssize_t + count; + + unsigned char + *buffer, + *offset; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read image into a buffer. + */ + if (GetBlobSize(image) != (size_t) GetBlobSize(image)) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (GetBlobSize(image) < 141) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + buffer=(unsigned char *) AcquireQuantumMemory((size_t) GetBlobSize(image)+ + MaxTextExtent,sizeof(*buffer)); + if (buffer == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,(size_t) GetBlobSize(image),buffer); + if ((count != (ssize_t) GetBlobSize(image)) || + (LocaleNCompare((char *) buffer,"SFW",3) != 0)) + { + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + (void) CloseBlob(image); + /* + Find the start of the JFIF data + */ + header=SFWScan(buffer,buffer+count-1,(const unsigned char *) + "\377\310\377\320",4); + if ((header == (unsigned char *) NULL) || + ((header+140) > (buffer+GetBlobSize(image)))) + { + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + TranslateSFWMarker(header); /* translate soi and app tags */ + TranslateSFWMarker(header+2); + (void) memcpy(header+6,"JFIF\0\001\0",7); /* JFIF magic */ + /* + Translate remaining markers. + */ + offset=header+2; + offset+=(((unsigned int) offset[2]) << 8)+offset[3]+2; + for ( ; ; ) + { + if ((offset+4) > (buffer+count-1)) + { + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + TranslateSFWMarker(offset); + if (offset[1] == 0xda) + break; + offset+=(((unsigned int) offset[2]) << 8)+offset[3]+2; + } + offset--; + data=SFWScan(offset,buffer+count-1,(const unsigned char *) "\377\311",2); + if (data == (unsigned char *) NULL) + { + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + TranslateSFWMarker(data++); /* translate eoi marker */ + /* + Write JFIF file. + */ + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(read_info->filename); + if (unique_file != -1) + file=fopen_utf8(read_info->filename,"wb"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + { + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + read_info=DestroyImageInfo(read_info); + (void) CopyMagickString(image->filename,read_info->filename, + MaxTextExtent); + ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile", + image->filename); + image=DestroyImageList(image); + return((Image *) NULL); + } + extent=fwrite(header,(size_t) (offset-header+1),1,file); + (void) extent; + extent=fwrite(HuffmanTable,1,sizeof(HuffmanTable)/sizeof(*HuffmanTable),file); + extent=fwrite(offset+1,(size_t) (data-offset),1,file); + status=ferror(file) != 0 ? MagickFalse : MagickTrue; + (void) fclose(file); + (void) close(unique_file); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + if (status == MagickFalse) + { + char + *message; + + (void) remove_utf8(read_info->filename); + read_info=DestroyImageInfo(read_info); + message=GetExceptionMessage(errno); + (void) ThrowMagickException(&image->exception,GetMagickModule(), + FileOpenError,"UnableToWriteFile","`%s': %s",image->filename,message); + message=DestroyString(message); + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read JPEG image. + */ + (void) CopyMagickString(read_info->magick,"JPEG",MaxTextExtent); + jpeg_image=ReadImage(read_info,exception); + (void) RelinquishUniqueFileResource(read_info->filename); + read_info=DestroyImageInfo(read_info); + if (jpeg_image == (Image *) NULL) + { + image=DestroyImageList(image); + return(jpeg_image); + } + (void) CopyMagickString(jpeg_image->filename,image->filename,MaxTextExtent); + (void) CopyMagickString(jpeg_image->magick,image->magick,MaxTextExtent); + image=DestroyImageList(image); + image=jpeg_image; + /* + Correct image orientation. + */ + flipped_image=FlipImage(image,exception); + if (flipped_image != (Image *) NULL) + { + DuplicateBlob(flipped_image,image); + image=DestroyImage(image); + image=flipped_image; + } + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r S F W I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterSFWImage() adds attributes for the SFW image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterSFWImage method is: +% +% size_t RegisterSFWImage(void) +% +*/ +ModuleExport size_t RegisterSFWImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("SFW"); + entry->decoder=(DecodeImageHandler *) ReadSFWImage; + entry->magick=(IsImageFormatHandler *) IsSFW; + entry->seekable_stream=MagickTrue; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Seattle Film Works"); + entry->magick_module=ConstantString("SFW"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r S F W I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterSFWImage() removes format registrations made by the +% SFW module from the list of supported formats. +% +% The format of the UnregisterSFWImage method is: +% +% UnregisterSFWImage(void) +% +*/ +ModuleExport void UnregisterSFWImage(void) +{ + (void) UnregisterMagickInfo("SFW"); +} diff --git a/ImageMagick-6.9.12-44/coders/sgi.c b/ImageMagick-6.9.12-44/coders/sgi.c new file mode 100644 index 0000000..2f5dc9d --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/sgi.c @@ -0,0 +1,1199 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS GGGG IIIII % +% SS G I % +% SSS G GG I % +% SS G G I % +% SSSSS GGG IIIII % +% % +% % +% Read/Write Irix RGB Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Typedef declaractions. +*/ +typedef struct _SGIInfo +{ + unsigned short + magic; + + unsigned char + storage, + bytes_per_pixel; + + unsigned short + dimension, + columns, + rows, + depth; + + size_t + minimum_value, + maximum_value, + sans; + + char + name[80]; + + size_t + pixel_format; + + unsigned char + filler[404]; +} SGIInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteSGIImage(const ImageInfo *,Image *); +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s S G I % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsSGI() returns MagickTrue if the image format type, identified by the +% magick string, is SGI. +% +% The format of the IsSGI method is: +% +% MagickBooleanType IsSGI(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsSGI(const unsigned char *magick,const size_t length) +{ + if (length < 2) + return(MagickFalse); + if (memcmp(magick,"\001\332",2) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d S G I I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadSGIImage() reads a SGI RGB image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadSGIImage method is: +% +% Image *ReadSGIImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType SGIDecode(const size_t bytes_per_pixel, + ssize_t number_packets,unsigned char *packets,ssize_t number_pixels, + unsigned char *pixels) +{ + unsigned char + *p, + *q; + + size_t + pixel; + + ssize_t + count; + + p=packets; + q=pixels; + if (bytes_per_pixel == 2) + { + for ( ; number_pixels > 0; ) + { + if (number_packets-- == 0) + return(MagickFalse); + pixel=(size_t) (*p++) << 8; + pixel|=(*p++); + count=(ssize_t) (pixel & 0x7f); + if (count == 0) + break; + if (count > (ssize_t) number_pixels) + return(MagickFalse); + number_pixels-=count; + if ((pixel & 0x80) != 0) + for ( ; count != 0; count--) + { + if (number_packets-- == 0) + return(MagickFalse); + *q=(*p++); + *(q+1)=(*p++); + q+=8; + } + else + { + if (number_packets-- == 0) + return(MagickFalse); + pixel=(size_t) (*p++) << 8; + pixel|=(*p++); + for ( ; count != 0; count--) + { + *q=(unsigned char) (pixel >> 8); + *(q+1)=(unsigned char) pixel; + q+=8; + } + } + } + return(MagickTrue); + } + for ( ; number_pixels > 0; ) + { + if (number_packets-- == 0) + return(MagickFalse); + pixel=(size_t) (*p++); + count=(ssize_t) (pixel & 0x7f); + if (count == 0) + break; + if (count > (ssize_t) number_pixels) + return(MagickFalse); + number_pixels-=count; + if ((pixel & 0x80) != 0) + for ( ; count != 0; count--) + { + if (number_packets-- == 0) + return(MagickFalse); + *q=(*p++); + q+=4; + } + else + { + if (number_packets-- == 0) + return(MagickFalse); + pixel=(size_t) (*p++); + for ( ; count != 0; count--) + { + *q=(unsigned char) pixel; + q+=4; + } + } + } + return(MagickTrue); +} + +static Image *ReadSGIImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + MagickSizeType + n, + number_pixels; + + MemoryInfo + *pixel_info; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + i, + x; + + unsigned char + *p; + + SGIInfo + iris_info; + + size_t + bytes_per_pixel, + quantum; + + ssize_t + count, + y, + z; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read SGI raster header. + */ + (void) memset(&iris_info,0,sizeof(iris_info)); + iris_info.magic=ReadBlobMSBShort(image); + do + { + /* + Verify SGI identifier. + */ + if (iris_info.magic != 0x01DA) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + iris_info.storage=(unsigned char) ReadBlobByte(image); + switch (iris_info.storage) + { + case 0x00: image->compression=NoCompression; break; + case 0x01: image->compression=RLECompression; break; + default: + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + iris_info.bytes_per_pixel=(unsigned char) ReadBlobByte(image); + if ((iris_info.bytes_per_pixel == 0) || (iris_info.bytes_per_pixel > 2)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + iris_info.dimension=ReadBlobMSBShort(image); + if ((iris_info.dimension == 0) || (iris_info.dimension > 3)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + iris_info.columns=ReadBlobMSBShort(image); + iris_info.rows=ReadBlobMSBShort(image); + iris_info.depth=ReadBlobMSBShort(image); + if ((iris_info.depth == 0) || (iris_info.depth > 4)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + iris_info.minimum_value=ReadBlobMSBLong(image); + iris_info.maximum_value=ReadBlobMSBLong(image); + iris_info.sans=ReadBlobMSBLong(image); + count=ReadBlob(image,sizeof(iris_info.name),(unsigned char *) + iris_info.name); + if ((size_t) count != sizeof(iris_info.name)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + iris_info.name[sizeof(iris_info.name)-1]='\0'; + if (*iris_info.name != '\0') + (void) SetImageProperty(image,"label",iris_info.name); + iris_info.pixel_format=ReadBlobMSBLong(image); + if (iris_info.pixel_format != 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + count=ReadBlob(image,sizeof(iris_info.filler),iris_info.filler); + if ((size_t) count != sizeof(iris_info.filler)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + image->columns=iris_info.columns; + image->rows=iris_info.rows; + image->matte=iris_info.depth == 4 ? MagickTrue : MagickFalse; + image->depth=(size_t) MagickMin(iris_info.depth,MAGICKCORE_QUANTUM_DEPTH); + if (iris_info.pixel_format == 0) + image->depth=(size_t) MagickMin((size_t) 8*iris_info.bytes_per_pixel, + MAGICKCORE_QUANTUM_DEPTH); + if (iris_info.depth < 3) + { + image->storage_class=PseudoClass; + image->colors=(size_t) (iris_info.bytes_per_pixel > 1 ? 65535 : 256); + } + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if ((MagickSizeType) (image->columns*image->rows/255) > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + status=SetImageExtent(image,image->columns,image->rows); + if (status != MagickFalse) + status=ResetImagePixels(image,&image->exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Allocate SGI pixels. + */ + bytes_per_pixel=(size_t) iris_info.bytes_per_pixel; + number_pixels=(MagickSizeType) iris_info.columns*iris_info.rows; + if ((4*bytes_per_pixel*number_pixels) != ((MagickSizeType) (size_t) + (4*bytes_per_pixel*number_pixels))) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + pixel_info=AcquireVirtualMemory(iris_info.columns,iris_info.rows*4* + bytes_per_pixel*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + for (n=0; n < (4*bytes_per_pixel*number_pixels); n++) + pixels[n]=0; + if ((int) iris_info.storage != 0x01) + { + unsigned char + *scanline; + + /* + Read standard image format. + */ + scanline=(unsigned char *) AcquireQuantumMemory(iris_info.columns, + bytes_per_pixel*sizeof(*scanline)); + if (scanline == (unsigned char *) NULL) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (z=0; z < (ssize_t) iris_info.depth; z++) + { + p=pixels+bytes_per_pixel*z; + for (y=0; y < (ssize_t) iris_info.rows; y++) + { + count=ReadBlob(image,bytes_per_pixel*iris_info.columns,scanline); + if (count != (ssize_t) (bytes_per_pixel*iris_info.columns)) + break; + if (bytes_per_pixel == 2) + for (x=0; x < (ssize_t) iris_info.columns; x++) + { + *p=scanline[2*x]; + *(p+1)=scanline[2*x+1]; + p+=8; + } + else + for (x=0; x < (ssize_t) iris_info.columns; x++) + { + *p=scanline[x]; + p+=4; + } + } + if (y < (ssize_t) iris_info.rows) + break; + } + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + } + else + { + MemoryInfo + *packet_info; + + size_t + *runlength; + + ssize_t + offset, + *offsets; + + unsigned char + *packets; + + unsigned int + data_order; + + /* + Read runlength-encoded image format. + */ + offsets=(ssize_t *) AcquireQuantumMemory((size_t) iris_info.rows, + iris_info.depth*sizeof(*offsets)); + runlength=(size_t *) AcquireQuantumMemory(iris_info.rows, + iris_info.depth*sizeof(*runlength)); + packet_info=AcquireVirtualMemory((size_t) iris_info.columns+10UL,4UL* + sizeof(*packets)); + if ((offsets == (ssize_t *) NULL) || + (runlength == (size_t *) NULL) || + (packet_info == (MemoryInfo *) NULL)) + { + offsets=(ssize_t *) RelinquishMagickMemory(offsets); + runlength=(size_t *) RelinquishMagickMemory(runlength); + if (packet_info != (MemoryInfo *) NULL) + packet_info=RelinquishVirtualMemory(packet_info); + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + packets=(unsigned char *) GetVirtualMemoryBlob(packet_info); + for (i=0; i < (ssize_t) (iris_info.rows*iris_info.depth); i++) + offsets[i]=(ssize_t) ReadBlobMSBSignedLong(image); + for (i=0; i < (ssize_t) (iris_info.rows*iris_info.depth); i++) + { + runlength[i]=ReadBlobMSBLong(image); + if (runlength[i] > (4*(size_t) iris_info.columns+10)) + { + offsets=(ssize_t *) RelinquishMagickMemory(offsets); + runlength=(size_t *) RelinquishMagickMemory(runlength); + packet_info=RelinquishVirtualMemory(packet_info); + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + } + /* + Check data order. + */ + offset=0; + data_order=0; + for (y=0; ((y < (ssize_t) iris_info.rows) && (data_order == 0)); y++) + for (z=0; ((z < (ssize_t) iris_info.depth) && (data_order == 0)); z++) + { + if (offsets[y+z*iris_info.rows] < offset) + data_order=1; + offset=offsets[y+z*iris_info.rows]; + } + offset=(ssize_t) TellBlob(image); + if (data_order == 1) + { + for (z=0; z < (ssize_t) iris_info.depth; z++) + { + p=pixels; + for (y=0; y < (ssize_t) iris_info.rows; y++) + { + if (offset != offsets[y+z*iris_info.rows]) + { + offset=offsets[y+z*iris_info.rows]; + offset=(ssize_t) SeekBlob(image,(MagickOffsetType) offset, + SEEK_SET); + } + count=ReadBlob(image,(size_t) runlength[y+z*iris_info.rows], + packets); + if (count != (ssize_t) runlength[y+z*iris_info.rows]) + break; + offset+=(ssize_t) runlength[y+z*iris_info.rows]; + status=SGIDecode(bytes_per_pixel,(ssize_t) + (runlength[y+z*iris_info.rows]/bytes_per_pixel),packets, + (ssize_t) iris_info.columns,p+bytes_per_pixel*z); + if (status == MagickFalse) + { + offsets=(ssize_t *) RelinquishMagickMemory(offsets); + runlength=(size_t *) RelinquishMagickMemory(runlength); + packet_info=RelinquishVirtualMemory(packet_info); + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError, + "ImproperImageHeader"); + } + p+=(iris_info.columns*4*bytes_per_pixel); + } + if (y < (ssize_t) iris_info.rows) + break; + } + } + else + { + MagickOffsetType + position; + + position=TellBlob(image); + p=pixels; + for (y=0; y < (ssize_t) iris_info.rows; y++) + { + for (z=0; z < (ssize_t) iris_info.depth; z++) + { + if (offset != offsets[y+z*iris_info.rows]) + { + offset=offsets[y+z*iris_info.rows]; + offset=(ssize_t) SeekBlob(image,(MagickOffsetType) offset, + SEEK_SET); + } + count=ReadBlob(image,(size_t) runlength[y+z*iris_info.rows], + packets); + if (count != (ssize_t) runlength[y+z*iris_info.rows]) + break; + offset+=(ssize_t) runlength[y+z*iris_info.rows]; + status=SGIDecode(bytes_per_pixel,(ssize_t) + (runlength[y+z*iris_info.rows]/bytes_per_pixel),packets, + (ssize_t) iris_info.columns,p+bytes_per_pixel*z); + if (status == MagickFalse) + { + offsets=(ssize_t *) RelinquishMagickMemory(offsets); + runlength=(size_t *) RelinquishMagickMemory(runlength); + packet_info=RelinquishVirtualMemory(packet_info); + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(CorruptImageError, + "ImproperImageHeader"); + } + } + if (z < (ssize_t) iris_info.depth) + break; + p+=(iris_info.columns*4*bytes_per_pixel); + } + offset=(ssize_t) SeekBlob(image,position,SEEK_SET); + } + packet_info=RelinquishVirtualMemory(packet_info); + runlength=(size_t *) RelinquishMagickMemory(runlength); + offsets=(ssize_t *) RelinquishMagickMemory(offsets); + } + /* + Convert SGI raster image to pixel packets. + */ + if (image->storage_class == DirectClass) + { + /* + Convert SGI image to DirectClass pixel packets. + */ + if (bytes_per_pixel == 2) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + p=pixels+(image->rows-y-1)*8*image->columns; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleShortToQuantum((unsigned short) + ((*(p+0) << 8) | (*(p+1))))); + SetPixelGreen(q,ScaleShortToQuantum((unsigned short) + ((*(p+2) << 8) | (*(p+3))))); + SetPixelBlue(q,ScaleShortToQuantum((unsigned short) + ((*(p+4) << 8) | (*(p+5))))); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + SetPixelAlpha(q,ScaleShortToQuantum((unsigned short) + ((*(p+6) << 8) | (*(p+7))))); + p+=8; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + } + else + for (y=0; y < (ssize_t) image->rows; y++) + { + p=pixels+(image->rows-y-1)*4*image->columns; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*p)); + q->green=ScaleCharToQuantum(*(p+1)); + q->blue=ScaleCharToQuantum(*(p+2)); + SetPixelOpacity(q,OpaqueOpacity); + if (image->matte != MagickFalse) + SetPixelAlpha(q,ScaleCharToQuantum(*(p+3))); + p+=4; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + else + { + /* + Create grayscale map. + */ + if (AcquireImageColormap(image,image->colors) == MagickFalse) + { + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Convert SGI image to PseudoClass pixel packets. + */ + if (bytes_per_pixel == 2) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + p=pixels+(image->rows-y-1)*8*image->columns; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + quantum=(*p << 8); + quantum|=(*(p+1)); + SetPixelIndex(indexes+x,quantum); + p+=8; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + } + else + for (y=0; y < (ssize_t) image->rows; y++) + { + p=pixels+(image->rows-y-1)*4*image->columns; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelIndex(indexes+x,*p); + p+=4; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + (void) SyncImage(image); + } + pixel_info=RelinquishVirtualMemory(pixel_info); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + iris_info.magic=ReadBlobMSBShort(image); + if (iris_info.magic == 0x01DA) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while (iris_info.magic == 0x01DA); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r S G I I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterSGIImage() adds properties for the SGI image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterSGIImage method is: +% +% size_t RegisterSGIImage(void) +% +*/ +ModuleExport size_t RegisterSGIImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("SGI"); + entry->decoder=(DecodeImageHandler *) ReadSGIImage; + entry->encoder=(EncodeImageHandler *) WriteSGIImage; + entry->magick=(IsImageFormatHandler *) IsSGI; + entry->description=ConstantString("Irix RGB image"); + entry->magick_module=ConstantString("SGI"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r S G I I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterSGIImage() removes format registrations made by the +% SGI module from the list of supported formats. +% +% The format of the UnregisterSGIImage method is: +% +% UnregisterSGIImage(void) +% +*/ +ModuleExport void UnregisterSGIImage(void) +{ + (void) UnregisterMagickInfo("SGI"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e S G I I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteSGIImage() writes an image in SGI RGB encoded image format. +% +% The format of the WriteSGIImage method is: +% +% MagickBooleanType WriteSGIImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static size_t SGIEncode(unsigned char *pixels,size_t length, + unsigned char *packets) +{ + short + runlength; + + unsigned char + *p, + *q; + + unsigned char + *limit, + *mark; + + p=pixels; + limit=p+length*4; + q=packets; + while (p < limit) + { + mark=p; + p+=8; + while ((p < limit) && ((*(p-8) != *(p-4)) || (*(p-4) != *p))) + p+=4; + p-=8; + length=(size_t) (p-mark) >> 2; + while (length != 0) + { + runlength=(short) (length > 126 ? 126 : length); + length-=runlength; + *q++=(unsigned char) (0x80 | runlength); + for ( ; runlength > 0; runlength--) + { + *q++=(*mark); + mark+=4; + } + } + mark=p; + p+=4; + while ((p < limit) && (*p == *mark)) + p+=4; + length=(size_t) (p-mark) >> 2; + while (length != 0) + { + runlength=(short) (length > 126 ? 126 : length); + length-=runlength; + *q++=(unsigned char) runlength; + *q++=(*mark); + } + } + *q++='\0'; + return((size_t) (q-packets)); +} + +static MagickBooleanType WriteSGIImage(const ImageInfo *image_info,Image *image) +{ + CompressionType + compression; + + const char + *value; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + MagickSizeType + number_pixels; + + MemoryInfo + *pixel_info; + + SGIInfo + iris_info; + + const PixelPacket + *p; + + ssize_t + i, + x; + + unsigned char + *q; + + size_t + imageListLength; + + ssize_t + y, + z; + + unsigned char + *pixels, + *packets; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Initialize SGI raster file header. + */ + if ((image->columns > 65535UL) || (image->rows > 65535UL)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + (void) memset(&iris_info,0,sizeof(iris_info)); + iris_info.magic=0x01DA; + compression=image->compression; + if (image_info->compression != UndefinedCompression) + compression=image_info->compression; + if (image->depth > 8) + compression=NoCompression; + if (compression == NoCompression) + iris_info.storage=(unsigned char) 0x00; + else + iris_info.storage=(unsigned char) 0x01; + iris_info.bytes_per_pixel=(unsigned char) (image->depth > 8 ? 2 : 1); + iris_info.dimension=3; + iris_info.columns=(unsigned short) image->columns; + iris_info.rows=(unsigned short) image->rows; + if (image->matte != MagickFalse) + iris_info.depth=4; + else + { + if ((image_info->type != TrueColorType) && + (SetImageGray(image,&image->exception) != MagickFalse)) + { + iris_info.dimension=2; + iris_info.depth=1; + } + else + iris_info.depth=3; + } + iris_info.minimum_value=0; + iris_info.maximum_value=(size_t) (image->depth <= 8 ? + 1UL*ScaleQuantumToChar(QuantumRange) : + 1UL*ScaleQuantumToShort(QuantumRange)); + /* + Write SGI header. + */ + (void) WriteBlobMSBShort(image,iris_info.magic); + (void) WriteBlobByte(image,iris_info.storage); + (void) WriteBlobByte(image,iris_info.bytes_per_pixel); + (void) WriteBlobMSBShort(image,iris_info.dimension); + (void) WriteBlobMSBShort(image,iris_info.columns); + (void) WriteBlobMSBShort(image,iris_info.rows); + (void) WriteBlobMSBShort(image,iris_info.depth); + (void) WriteBlobMSBLong(image,(unsigned int) iris_info.minimum_value); + (void) WriteBlobMSBLong(image,(unsigned int) iris_info.maximum_value); + (void) WriteBlobMSBLong(image,(unsigned int) iris_info.sans); + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + (void) CopyMagickString(iris_info.name,value,sizeof(iris_info.name)); + (void) WriteBlob(image,sizeof(iris_info.name),(unsigned char *) + iris_info.name); + (void) WriteBlobMSBLong(image,(unsigned int) iris_info.pixel_format); + (void) WriteBlob(image,sizeof(iris_info.filler),iris_info.filler); + /* + Allocate SGI pixels. + */ + number_pixels=(MagickSizeType) image->columns*image->rows; + if ((4*iris_info.bytes_per_pixel*number_pixels) != + ((MagickSizeType) (size_t) (4*iris_info.bytes_per_pixel*number_pixels))) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixel_info=AcquireVirtualMemory((size_t) number_pixels,4* + iris_info.bytes_per_pixel*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + /* + Convert image pixels to uncompressed SGI pixels. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + if (image->depth <= 8) + for (x=0; x < (ssize_t) image->columns; x++) + { + unsigned char + *q; + + q=(unsigned char *) pixels; + q+=((iris_info.rows-1)-y)*(4*iris_info.columns)+4*x; + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + *q++=ScaleQuantumToChar(GetPixelAlpha(p)); + p++; + } + else + for (x=0; x < (ssize_t) image->columns; x++) + { + unsigned short + *q; + + q=(unsigned short *) pixels; + q+=((iris_info.rows-1)-y)*(4*iris_info.columns)+4*x; + *q++=ScaleQuantumToShort(GetPixelRed(p)); + *q++=ScaleQuantumToShort(GetPixelGreen(p)); + *q++=ScaleQuantumToShort(GetPixelBlue(p)); + *q++=ScaleQuantumToShort(GetPixelAlpha(p)); + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + switch (compression) + { + case NoCompression: + { + /* + Write uncompressed SGI pixels. + */ + for (z=0; z < (ssize_t) iris_info.depth; z++) + { + for (y=0; y < (ssize_t) iris_info.rows; y++) + { + if (image->depth <= 8) + for (x=0; x < (ssize_t) iris_info.columns; x++) + { + unsigned char + *q; + + q=(unsigned char *) pixels; + q+=y*(4*iris_info.columns)+4*x+z; + (void) WriteBlobByte(image,*q); + } + else + for (x=0; x < (ssize_t) iris_info.columns; x++) + { + unsigned short + *q; + + q=(unsigned short *) pixels; + q+=y*(4*iris_info.columns)+4*x+z; + (void) WriteBlobMSBShort(image,*q); + } + } + } + break; + } + default: + { + MemoryInfo + *packet_info; + + size_t + length, + number_packets, + *runlength; + + ssize_t + offset, + *offsets; + + /* + Convert SGI uncompressed pixels. + */ + offsets=(ssize_t *) AcquireQuantumMemory(iris_info.rows, + iris_info.depth*sizeof(*offsets)); + runlength=(size_t *) AcquireQuantumMemory(iris_info.rows, + iris_info.depth*sizeof(*runlength)); + packet_info=AcquireVirtualMemory((2*(size_t) iris_info.columns+10)* + image->rows,4*sizeof(*packets)); + if ((offsets == (ssize_t *) NULL) || + (runlength == (size_t *) NULL) || + (packet_info == (MemoryInfo *) NULL)) + { + if (offsets != (ssize_t *) NULL) + offsets=(ssize_t *) RelinquishMagickMemory(offsets); + if (runlength != (size_t *) NULL) + runlength=(size_t *) RelinquishMagickMemory(runlength); + if (packet_info != (MemoryInfo *) NULL) + packet_info=RelinquishVirtualMemory(packet_info); + pixel_info=RelinquishVirtualMemory(pixel_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + packets=(unsigned char *) GetVirtualMemoryBlob(packet_info); + offset=512+4*2*((ssize_t) iris_info.rows*iris_info.depth); + number_packets=0; + q=pixels; + for (y=0; y < (ssize_t) iris_info.rows; y++) + { + for (z=0; z < (ssize_t) iris_info.depth; z++) + { + length=SGIEncode(q+z,(size_t) iris_info.columns,packets+ + number_packets); + number_packets+=length; + offsets[y+z*iris_info.rows]=offset; + runlength[y+z*iris_info.rows]=(size_t) length; + offset+=(ssize_t) length; + } + q+=(iris_info.columns*4); + } + /* + Write out line start and length tables and runlength-encoded pixels. + */ + for (i=0; i < (ssize_t) (iris_info.rows*iris_info.depth); i++) + (void) WriteBlobMSBLong(image,(unsigned int) offsets[i]); + for (i=0; i < (ssize_t) (iris_info.rows*iris_info.depth); i++) + (void) WriteBlobMSBLong(image,(unsigned int) runlength[i]); + (void) WriteBlob(image,number_packets,packets); + /* + Relinquish resources. + */ + offsets=(ssize_t *) RelinquishMagickMemory(offsets); + runlength=(size_t *) RelinquishMagickMemory(runlength); + packet_info=RelinquishVirtualMemory(packet_info); + break; + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/sixel.c b/ImageMagick-6.9.12-44/coders/sixel.c new file mode 100644 index 0000000..2238271 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/sixel.c @@ -0,0 +1,1365 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS IIIII X X EEEEE L % +% SS I X X E L % +% SSS I X EEE L % +% SS I X X E L % +% SSSSS IIIII X X EEEEE LLLLL % +% % +% % +% Read/Write DEC SIXEL Format % +% % +% Software Design % +% Hayaki Saito % +% September 2014 % +% Based on kmiya's sixel (2014-03-28) % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantize.h" +#include "magick/quantum-private.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/splay-tree.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/thread-private.h" +#include "magick/module.h" +#include "magick/threshold.h" +#include "magick/utility.h" + +/* + Definitions +*/ +#define SIXEL_PALETTE_MAX 256 +#define SIXEL_OUTPUT_PACKET_SIZE 1024 + +/* + Macros +*/ +#define SIXEL_RGB(r, g, b) ((int) (((ssize_t) (r) << 16) + ((g) << 8) + (b))) +#define SIXEL_PALVAL(n,a,m) ((int) (((ssize_t) (n) * (a) + ((m) / 2)) / (m))) +#define SIXEL_XRGB(r,g,b) SIXEL_RGB(SIXEL_PALVAL(r, 255, 100), SIXEL_PALVAL(g, 255, 100), SIXEL_PALVAL(b, 255, 100)) + +/* + Structure declarations. +*/ +typedef struct sixel_node { + struct sixel_node *next; + int color; + int left; + int right; + unsigned char *map; +} sixel_node_t; + +typedef struct sixel_output { + + /* compatiblity flags */ + + /* 0: 7bit terminal, + * 1: 8bit terminal */ + unsigned char has_8bit_control; + + int save_pixel; + int save_count; + int active_palette; + + sixel_node_t *node_top; + sixel_node_t *node_free; + + Image *image; + int pos; + unsigned char buffer[SIXEL_OUTPUT_PACKET_SIZE*2]; + +} sixel_output_t; + +static int const sixel_default_color_table[] = { + SIXEL_XRGB(0, 0, 0), /* 0 Black */ + SIXEL_XRGB(20, 20, 80), /* 1 Blue */ + SIXEL_XRGB(80, 13, 13), /* 2 Red */ + SIXEL_XRGB(20, 80, 20), /* 3 Green */ + SIXEL_XRGB(80, 20, 80), /* 4 Magenta */ + SIXEL_XRGB(20, 80, 80), /* 5 Cyan */ + SIXEL_XRGB(80, 80, 20), /* 6 Yellow */ + SIXEL_XRGB(53, 53, 53), /* 7 Gray 50% */ + SIXEL_XRGB(26, 26, 26), /* 8 Gray 25% */ + SIXEL_XRGB(33, 33, 60), /* 9 Blue* */ + SIXEL_XRGB(60, 26, 26), /* 10 Red* */ + SIXEL_XRGB(33, 60, 33), /* 11 Green* */ + SIXEL_XRGB(60, 33, 60), /* 12 Magenta* */ + SIXEL_XRGB(33, 60, 60), /* 13 Cyan* */ + SIXEL_XRGB(60, 60, 33), /* 14 Yellow* */ + SIXEL_XRGB(80, 80, 80), /* 15 Gray 75% */ +}; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteSIXELImage(const ImageInfo *,Image *); + +static int hue_to_rgb(int n1, int n2, int hue) +{ + const int HLSMAX = 100; + + if (hue < 0) { + hue += HLSMAX; + } + + if (hue > HLSMAX) { + hue -= HLSMAX; + } + + if (hue < (HLSMAX / 6)) { + return (n1 + (((ssize_t) (n2 - n1) * hue + (HLSMAX / 12)) / (HLSMAX / 6))); + } + if (hue < (HLSMAX / 2)) { + return (n2); + } + if (hue < ((HLSMAX * 2) / 3)) { + return (n1 + (((ssize_t) (n2 - n1) * (((HLSMAX * 2) / 3) - hue) + (HLSMAX / 12))/(HLSMAX / 6))); + } + return (n1); +} + +static int hls_to_rgb(int hue, int lum, int sat) +{ + int R, G, B; + int Magic1, Magic2; + const int RGBMAX = 255; + const int HLSMAX = 100; + + if (sat == 0) { + R = G = B = (lum * RGBMAX) / HLSMAX; + } else { + if (lum <= (HLSMAX / 2)) { + Magic2 = (int) (((ssize_t) lum * (HLSMAX + sat) + (HLSMAX / 2)) / HLSMAX); + } else { + Magic2 = (int) (lum + sat - (((ssize_t) lum * sat) + (HLSMAX / 2)) / HLSMAX); + } + Magic1 = 2 * lum - Magic2; + + R = (hue_to_rgb(Magic1, Magic2, (ssize_t) hue + (HLSMAX / 3)) * RGBMAX + (HLSMAX / 2)) / HLSMAX; + G = (hue_to_rgb(Magic1, Magic2, hue) * RGBMAX + (ssize_t) (HLSMAX / 2)) / HLSMAX; + B = (hue_to_rgb(Magic1, Magic2, (ssize_t) hue - (HLSMAX / 3)) * RGBMAX + (HLSMAX/2)) / HLSMAX; + } + return SIXEL_RGB(R, G, B); +} + +static unsigned char *get_params(unsigned char *p, int *param, int *len) +{ + int n; + + *len = 0; + while (*p != '\0') { + while (*p == ' ' || *p == '\t') { + p++; + } + if (isdigit((int) ((unsigned char) *p))) { + for (n = 0; isdigit((int) ((unsigned char) *p)); p++) { + if (n <= (INT_MAX/10)) + n = (int) ((ssize_t) n * 10 + (*p - '0')); + } + if (*len < 10) { + param[(*len)++] = n; + } + while (*p == ' ' || *p == '\t') { + p++; + } + if (*p == ';') { + p++; + } + } else if (*p == ';') { + if (*len < 10) { + param[(*len)++] = 0; + } + p++; + } else + break; + } + return p; +} + +/* convert sixel data into indexed pixel bytes and palette data */ +MagickBooleanType sixel_decode(Image *image, + unsigned char /* in */ *p, /* sixel bytes */ + unsigned char /* out */ **pixels, /* decoded pixels */ + size_t /* out */ *pwidth, /* image width */ + size_t /* out */ *pheight, /* image height */ + unsigned char /* out */ **palette, /* ARGB palette */ + size_t /* out */ *ncolors /* palette size (<= 256) */) +{ + int n, i, r, g, b, sixel_vertical_mask, c; + int posision_x, posision_y; + int max_x, max_y; + int attributed_pan, attributed_pad; + int attributed_ph, attributed_pv; + int repeat_count, color_index, max_color_index = 2, background_color_index; + int param[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + int sixel_palet[SIXEL_PALETTE_MAX]; + unsigned char *imbuf, *dmbuf; + int imsx, imsy; + int dmsx, dmsy; + int y; + size_t extent,offset; + + extent=strlen((char *) p); + posision_x = posision_y = 0; + max_x = max_y = 0; + attributed_pan = 2; + attributed_pad = 1; + attributed_ph = attributed_pv = 0; + repeat_count = 1; + color_index = 0; + background_color_index = 0; + + imsx = 2048; + imsy = 2048; + if (SetImageExtent(image,imsx,imsy) == MagickFalse) + return(MagickFalse); + imbuf = (unsigned char *) AcquireQuantumMemory(imsx , imsy); + + if (imbuf == NULL) { + return(MagickFalse); + } + + for (n = 0; n < 16; n++) { + sixel_palet[n] = sixel_default_color_table[n]; + } + + /* colors 16-231 are a 6x6x6 color cube */ + for (r = 0; r < 6; r++) { + for (g = 0; g < 6; g++) { + for (b = 0; b < 6; b++) { + sixel_palet[n++] = SIXEL_RGB(r * 51, g * 51, b * 51); + } + } + } + /* colors 232-255 are a grayscale ramp, intentionally leaving out */ + for (i = 0; i < 24; i++) { + sixel_palet[n++] = SIXEL_RGB(i * 11, i * 11, i * 11); + } + + for (; n < SIXEL_PALETTE_MAX; n++) { + sixel_palet[n] = SIXEL_RGB(255, 255, 255); + } + + (void) memset(imbuf, background_color_index, (size_t) imsx * imsy); + + while (*p != '\0') { + if ((p[0] == '\033' && p[1] == 'P') || *p == 0x90) { + if (*p == '\033') { + p++; + } + + p = get_params(++p, param, &n); + + if (*p == 'q') { + p++; + + if (n > 0) { /* Pn1 */ + switch(param[0]) { + case 0: + case 1: + attributed_pad = 2; + break; + case 2: + attributed_pad = 5; + break; + case 3: + attributed_pad = 4; + break; + case 4: + attributed_pad = 4; + break; + case 5: + attributed_pad = 3; + break; + case 6: + attributed_pad = 3; + break; + case 7: + attributed_pad = 2; + break; + case 8: + attributed_pad = 2; + break; + case 9: + attributed_pad = 1; + break; + } + } + + if (n > 2) { /* Pn3 */ + if (param[2] == 0) { + param[2] = 10; + } + attributed_pan = (int) (((size_t) attributed_pan * param[2]) / 10); + attributed_pad = (int) (((size_t) attributed_pad * param[2]) / 10); + if (attributed_pan <= 0) attributed_pan = 1; + if (attributed_pad <= 0) attributed_pad = 1; + } + } + + } else if ((p[0] == '\033' && p[1] == '\\') || *p == 0x9C) { + break; + } else if (*p == '"') { + /* DECGRA Set Raster Attributes " Pan; Pad; Ph; Pv */ + p = get_params(++p, param, &n); + + if (n > 0) attributed_pad = param[0]; + if (n > 1) attributed_pan = param[1]; + if (n > 2 && param[2] > 0) attributed_ph = param[2] & 0xffff; + if (n > 3 && param[3] > 0) attributed_pv = param[3] & 0xffff; + + if (attributed_pan <= 0) attributed_pan = 1; + if (attributed_pad <= 0) attributed_pad = 1; + + if (imsx < attributed_ph || imsy < attributed_pv) { + dmsx = imsx > attributed_ph ? imsx : attributed_ph; + dmsy = imsy > attributed_pv ? imsy : attributed_pv; + if (SetImageExtent(image,dmsx,dmsy) == MagickFalse) + break; + dmbuf = (unsigned char *) AcquireQuantumMemory(dmsx , dmsy); + if (dmbuf == (unsigned char *) NULL) { + imbuf = (unsigned char *) RelinquishMagickMemory(imbuf); + return (MagickFalse); + } + (void) memset(dmbuf, background_color_index, (size_t) dmsx * dmsy); + for (y = 0; y < imsy; ++y) { + (void) memcpy(dmbuf + dmsx * y, imbuf + (size_t) imsx * y, imsx); + } + imbuf = (unsigned char *) RelinquishMagickMemory(imbuf); + imsx = dmsx; + imsy = dmsy; + imbuf = dmbuf; + } + + } else if (*p == '!') { + /* DECGRI Graphics Repeat Introducer ! Pn Ch */ + p = get_params(++p, param, &n); + + if ((n > 0) && (param[0] > 0)) { + repeat_count = param[0]; + if (repeat_count > (ssize_t) extent) + break; + } + + } else if (*p == '#') { + /* DECGCI Graphics Color Introducer # Pc; Pu; Px; Py; Pz */ + p = get_params(++p, param, &n); + + if (n > 0) { + if ((color_index = param[0]) < 0) { + color_index = 0; + } else if (color_index >= SIXEL_PALETTE_MAX) { + color_index = SIXEL_PALETTE_MAX - 1; + } + } + + if (n > 4) { + if (param[1] == 1) { /* HLS */ + if (param[2] > 360) param[2] = 360; + if (param[3] > 100) param[3] = 100; + if (param[4] > 100) param[4] = 100; + sixel_palet[color_index] = hls_to_rgb((int) ((ssize_t) param[2] * 100 / 360), param[3], param[4]); + } else if (param[1] == 2) { /* RGB */ + if (param[2] > 100) param[2] = 100; + if (param[3] > 100) param[3] = 100; + if (param[4] > 100) param[4] = 100; + sixel_palet[color_index] = SIXEL_XRGB(param[2], param[3], param[4]); + } + } + + } else if (*p == '$') { + /* DECGCR Graphics Carriage Return */ + p++; + posision_x = 0; + repeat_count = 1; + + } else if (*p == '-') { + /* DECGNL Graphics Next Line */ + p++; + posision_x = 0; + posision_y += 6; + repeat_count = 1; + + } else if (*p >= '?' && *p <= '\177') { + if (imsx < (posision_x + repeat_count) || imsy < (posision_y + 6)) { + int nx = imsx * 2; + int ny = imsy * 2; + + while (nx < (posision_x + repeat_count) || ny < (posision_y + 6)) { + nx *= 2; + ny *= 2; + } + + dmsx = nx; + dmsy = ny; + if (SetImageExtent(image,dmsx,dmsy) == MagickFalse) + break; + dmbuf = (unsigned char *) AcquireQuantumMemory(dmsx , dmsy); + if (dmbuf == (unsigned char *) NULL) { + imbuf = (unsigned char *) RelinquishMagickMemory(imbuf); + return (MagickFalse); + } + (void) memset(dmbuf, background_color_index, (size_t) dmsx * dmsy); + for (y = 0; y < imsy; ++y) { + (void) memcpy(dmbuf + dmsx * y, imbuf + (size_t) imsx * y, imsx); + } + imbuf = (unsigned char *) RelinquishMagickMemory(imbuf); + imsx = dmsx; + imsy = dmsy; + imbuf = dmbuf; + } + + if (color_index > max_color_index) { + max_color_index = color_index; + } + if ((b = *(p++) - '?') == 0) { + posision_x += repeat_count; + + } else { + sixel_vertical_mask = 0x01; + + if (repeat_count <= 1) { + for (i = 0; i < 6; i++) { + if ((b & sixel_vertical_mask) != 0) { + offset=(size_t) imsx * (posision_y + i) + posision_x; + if (offset >= (size_t) imsx * imsy) + { + imbuf = (unsigned char *) RelinquishMagickMemory(imbuf); + return (MagickFalse); + } + imbuf[offset] = color_index; + if (max_x < posision_x) { + max_x = posision_x; + } + if (max_y < (posision_y + i)) { + max_y = posision_y + i; + } + } + sixel_vertical_mask <<= 1; + } + posision_x += 1; + + } else { /* repeat_count > 1 */ + for (i = 0; i < 6; i++) { + if ((b & sixel_vertical_mask) != 0) { + c = sixel_vertical_mask << 1; + for (n = 1; (i + n) < 6; n++) { + if ((b & c) == 0) { + break; + } + c <<= 1; + } + for (y = posision_y + i; y < posision_y + i + n; ++y) { + offset=(size_t) imsx * y + posision_x; + if (offset + repeat_count >= (size_t) imsx * imsy) + { + imbuf = (unsigned char *) RelinquishMagickMemory(imbuf); + return (MagickFalse); + } + (void) memset(imbuf + offset, color_index, repeat_count); + } + if (max_x < (posision_x + repeat_count - 1)) { + max_x = posision_x + repeat_count - 1; + } + if (max_y < (posision_y + i + n - 1)) { + max_y = posision_y + i + n - 1; + } + + i += (n - 1); + sixel_vertical_mask <<= (n - 1); + } + sixel_vertical_mask <<= 1; + } + posision_x += repeat_count; + } + } + repeat_count = 1; + } else { + p++; + } + } + + if (++max_x < attributed_ph) { + max_x = attributed_ph; + } + if (++max_y < attributed_pv) { + max_y = attributed_pv; + } + + if (imsx > max_x || imsy > max_y) { + dmsx = max_x; + dmsy = max_y; + if (SetImageExtent(image,dmsx,dmsy) == MagickFalse) + { + imbuf = (unsigned char *) RelinquishMagickMemory(imbuf); + return (MagickFalse); + } + if ((dmbuf = (unsigned char *) AcquireQuantumMemory(dmsx , dmsy)) == NULL) { + imbuf = (unsigned char *) RelinquishMagickMemory(imbuf); + return (MagickFalse); + } + for (y = 0; y < dmsy; ++y) { + (void) memcpy(dmbuf + dmsx * y, imbuf + imsx * y, dmsx); + } + imbuf = (unsigned char *) RelinquishMagickMemory(imbuf); + imsx = dmsx; + imsy = dmsy; + imbuf = dmbuf; + } + + *pixels = imbuf; + *pwidth = imsx; + *pheight = imsy; + *ncolors = max_color_index + 1; + *palette = (unsigned char *) AcquireQuantumMemory(*ncolors,4); + if (*palette == (unsigned char *) NULL) + return(MagickFalse); + for (n = 0; n < (ssize_t) *ncolors; ++n) { + (*palette)[n * 4 + 0] = sixel_palet[n] >> 16 & 0xff; + (*palette)[n * 4 + 1] = sixel_palet[n] >> 8 & 0xff; + (*palette)[n * 4 + 2] = sixel_palet[n] & 0xff; + (*palette)[n * 4 + 3] = 0xff; + } + return(MagickTrue); +} + +sixel_output_t *sixel_output_create(Image *image) +{ + sixel_output_t *output; + + output = (sixel_output_t *) AcquireMagickMemory(sizeof(sixel_output_t)); + if (output == (sixel_output_t *) NULL) + return((sixel_output_t *) NULL); + output->has_8bit_control = 0; + output->save_pixel = 0; + output->save_count = 0; + output->active_palette = (-1); + output->node_top = NULL; + output->node_free = NULL; + output->image = image; + output->pos = 0; + + return output; +} + +static void sixel_advance(sixel_output_t *context, int nwrite) +{ + if ((context->pos += nwrite) >= SIXEL_OUTPUT_PACKET_SIZE) { + WriteBlob(context->image,SIXEL_OUTPUT_PACKET_SIZE,context->buffer); + memmove(context->buffer, + context->buffer + SIXEL_OUTPUT_PACKET_SIZE, + (context->pos -= SIXEL_OUTPUT_PACKET_SIZE)); + } +} + +static int sixel_put_flash(sixel_output_t *const context) +{ + int n; + int nwrite; + +#if defined(USE_VT240) /* VT240 Max 255 ? */ + while (context->save_count > 255) { + nwrite = spritf((char *)context->buffer + context->pos, "!255%c", context->save_pixel); + if (nwrite <= 0) { + return (-1); + } + sixel_advance(context, nwrite); + context->save_count -= 255; + } +#endif /* defined(USE_VT240) */ + + if (context->save_count > 3) { + /* DECGRI Graphics Repeat Introducer ! Pn Ch */ + nwrite = sprintf((char *)context->buffer + context->pos, "!%d%c", context->save_count, context->save_pixel); + if (nwrite <= 0) { + return (-1); + } + sixel_advance(context, nwrite); + } else { + for (n = 0; n < context->save_count; n++) { + context->buffer[context->pos] = (char)context->save_pixel; + sixel_advance(context, 1); + } + } + + context->save_pixel = 0; + context->save_count = 0; + + return 0; +} + +static void sixel_put_pixel(sixel_output_t *const context, int pix) +{ + if (pix < 0 || pix > '?') { + pix = 0; + } + + pix += '?'; + + if (pix == context->save_pixel) { + context->save_count++; + } else { + sixel_put_flash(context); + context->save_pixel = pix; + context->save_count = 1; + } +} + +static void sixel_node_del(sixel_output_t *const context, sixel_node_t *np) +{ + sixel_node_t *tp; + + if ((tp = context->node_top) == np) { + context->node_top = np->next; + } + + else { + while (tp->next != NULL) { + if (tp->next == np) { + tp->next = np->next; + break; + } + tp = tp->next; + } + } + + np->next = context->node_free; + context->node_free = np; +} + +static int sixel_put_node(sixel_output_t *const context, int x, + sixel_node_t *np, int ncolors, int keycolor) +{ + int nwrite; + + if (ncolors != 2 || keycolor == -1) { + /* designate palette index */ + if (context->active_palette != np->color) { + nwrite = sprintf((char *)context->buffer + context->pos, + "#%d", np->color); + sixel_advance(context, nwrite); + context->active_palette = np->color; + } + } + + for (; x < np->left; x++) { + sixel_put_pixel(context, 0); + } + + for (; x < np->right; x++) { + sixel_put_pixel(context, np->map[x]); + } + + sixel_put_flash(context); + + return x; +} + +static MagickBooleanType sixel_encode_impl(unsigned char *pixels, size_t width,size_t height, + unsigned char *palette, size_t ncolors, int keycolor, + sixel_output_t *context) +{ +#define RelinquishNodesAndMap \ + while ((np = context->node_free) != NULL) { \ + context->node_free = np->next; \ + np=(sixel_node_t *) RelinquishMagickMemory(np); \ + } \ + map = (unsigned char *) RelinquishMagickMemory(map) + + int x, y, i, n, c; + int left, right; + int pix; + size_t len; + unsigned char *map; + sixel_node_t *np, *tp, top; + int nwrite; + + context->pos = 0; + + if (ncolors < 1) { + return (MagickFalse); + } + len = ncolors * width; + context->active_palette = (-1); + + if ((map = (unsigned char *)AcquireQuantumMemory(len, sizeof(unsigned char))) == NULL) { + return (MagickFalse); + } + (void) memset(map, 0, len); + + if (context->has_8bit_control) { + nwrite = sprintf((char *)context->buffer, "\x90" "0;0;0" "q"); + } else { + nwrite = sprintf((char *)context->buffer, "\x1bP" "0;0;0" "q"); + } + if (nwrite <= 0) { + return (MagickFalse); + } + sixel_advance(context, nwrite); + nwrite = sprintf((char *)context->buffer + context->pos, "\"1;1;%d;%d", (int) width, (int) height); + if (nwrite <= 0) { + RelinquishNodesAndMap; + return (MagickFalse); + } + sixel_advance(context, nwrite); + + if (ncolors != 2 || keycolor == -1) { + for (n = 0; n < (ssize_t) ncolors; n++) { + /* DECGCI Graphics Color Introducer # Pc ; Pu; Px; Py; Pz */ + nwrite = sprintf((char *)context->buffer + context->pos, "#%d;2;%d;%d;%d", + n, + (palette[n * 3 + 0] * 100 + 127) / 255, + (palette[n * 3 + 1] * 100 + 127) / 255, + (palette[n * 3 + 2] * 100 + 127) / 255); + if (nwrite <= 0) { + RelinquishNodesAndMap; + return (MagickFalse); + } + sixel_advance(context, nwrite); + if (nwrite <= 0) { + RelinquishNodesAndMap; + return (MagickFalse); + } + } + } + + for (y = i = 0; y < (ssize_t) height; y++) { + for (x = 0; x < (ssize_t) width; x++) { + pix = pixels[y * width + x]; + if (pix >= 0 && pix < (ssize_t) ncolors && pix != keycolor) { + map[pix * width + x] |= (1 << i); + } + } + + if (++i < 6 && (y + 1) < (ssize_t) height) { + continue; + } + + for (c = 0; c < (ssize_t) ncolors; c++) { + for (left = 0; left < (ssize_t) width; left++) { + if (*(map + c * width + left) == 0) { + continue; + } + + for (right = left + 1; right < (ssize_t) width; right++) { + if (*(map + c * width + right) != 0) { + continue; + } + + for (n = 1; (right + n) < (ssize_t) width; n++) { + if (*(map + c * width + right + n) != 0) { + break; + } + } + + if (n >= 10 || right + n >= (ssize_t) width) { + break; + } + right = right + n - 1; + } + + if ((np = context->node_free) != NULL) { + context->node_free = np->next; + } else if ((np = (sixel_node_t *)AcquireMagickMemory(sizeof(sixel_node_t))) == NULL) { + RelinquishNodesAndMap; + return (MagickFalse); + } + + np->color = c; + np->left = left; + np->right = right; + np->map = map + c * width; + + top.next = context->node_top; + tp = ⊤ + + while (tp->next != NULL) { + if (np->left < tp->next->left) { + break; + } + if (np->left == tp->next->left && np->right > tp->next->right) { + break; + } + tp = tp->next; + } + + np->next = tp->next; + tp->next = np; + context->node_top = top.next; + + left = right - 1; + } + + } + + for (x = 0; (np = context->node_top) != NULL;) { + if (x > np->left) { + /* DECGCR Graphics Carriage Return */ + context->buffer[context->pos] = '$'; + sixel_advance(context, 1); + x = 0; + } + + x = sixel_put_node(context, x, np, (int) ncolors, keycolor); + sixel_node_del(context, np); + np = context->node_top; + + while (np != NULL) { + if (np->left < x) { + np = np->next; + continue; + } + + x = sixel_put_node(context, x, np, (int) ncolors, keycolor); + sixel_node_del(context, np); + np = context->node_top; + } + } + + /* DECGNL Graphics Next Line */ + context->buffer[context->pos] = '-'; + sixel_advance(context, 1); + if (nwrite <= 0) { + RelinquishNodesAndMap; + return (MagickFalse); + } + + i = 0; + (void) memset(map, 0, len); + } + + if (context->has_8bit_control) { + context->buffer[context->pos] = 0x9c; + sixel_advance(context, 1); + } else { + context->buffer[context->pos] = 0x1b; + context->buffer[context->pos + 1] = '\\'; + sixel_advance(context, 2); + } + if (nwrite <= 0) { + RelinquishNodesAndMap; + return (MagickFalse); + } + + /* flush buffer */ + if (context->pos > 0) { + (void) WriteBlob(context->image,context->pos,context->buffer); + } + + RelinquishNodesAndMap; + + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s S I X E L % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsSIXEL() returns MagickTrue if the image format type, identified by the +% magick string, is SIXEL. +% +% The format of the IsSIXEL method is: +% +% MagickBooleanType IsSIXEL(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. or +% blob. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsSIXEL(const unsigned char *magick,const size_t length) +{ + const unsigned char + *end = magick + length; + + if (length < 3) + return(MagickFalse); + + if (*magick == 0x90 || (*magick == 0x1b && *++magick == 'P')) { + while (++magick != end) { + if (*magick == 'q') + return(MagickTrue); + if (!(*magick >= '0' && *magick <= '9') && *magick != ';') + return(MagickFalse); + } + } + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d S I X E L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadSIXELImage() reads an X11 pixmap image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadSIXELImage method is: +% +% Image *ReadSIXELImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadSIXELImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + *sixel_buffer; + + Image + *image; + + MagickBooleanType + status; + + char + *p; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *r; + + size_t + length; + + ssize_t + i, + j, + y; + + unsigned char + *sixel_pixels, + *sixel_palette; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read SIXEL file. + */ + length=MaxTextExtent; + sixel_buffer=(char *) AcquireQuantumMemory((size_t) length+MaxTextExtent, + sizeof(*sixel_buffer)); + p=sixel_buffer; + if (sixel_buffer != (char *) NULL) + while (ReadBlobString(image,p) != (char *) NULL) + { + if ((*p == '#') && ((p == sixel_buffer) || (*(p-1) == '\n'))) + continue; + if ((*p == '}') && (*(p+1) == ';')) + break; + p+=strlen(p); + if ((size_t) (p-sixel_buffer+MaxTextExtent+1) < length) + continue; + length<<=1; + sixel_buffer=(char *) ResizeQuantumMemory(sixel_buffer,length+ + MaxTextExtent+1,sizeof(*sixel_buffer)); + if (sixel_buffer == (char *) NULL) + break; + p=sixel_buffer+strlen(sixel_buffer); + } + if (sixel_buffer == (char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + sixel_buffer[length]='\0'; + /* + Decode SIXEL + */ + sixel_pixels=(unsigned char *) NULL; + if (sixel_decode(image,(unsigned char *)sixel_buffer, &sixel_pixels, &image->columns, &image->rows, &sixel_palette, &image->colors) == MagickFalse) + { + sixel_buffer=(char *) RelinquishMagickMemory(sixel_buffer); + if (sixel_pixels != (unsigned char *) NULL) + sixel_pixels=(unsigned char *) RelinquishMagickMemory(sixel_pixels); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + sixel_buffer=(char *) RelinquishMagickMemory(sixel_buffer); + image->depth=24; + image->storage_class=PseudoClass; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + sixel_pixels=(unsigned char *) RelinquishMagickMemory(sixel_pixels); + sixel_palette=(unsigned char *) RelinquishMagickMemory(sixel_palette); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (AcquireImageColormap(image,image->colors) == MagickFalse) + { + sixel_pixels=(unsigned char *) RelinquishMagickMemory(sixel_pixels); + sixel_palette=(unsigned char *) RelinquishMagickMemory(sixel_palette); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (i = 0; i < (ssize_t) image->colors; ++i) { + image->colormap[i].red = ScaleCharToQuantum(sixel_palette[i * 4 + 0]); + image->colormap[i].green = ScaleCharToQuantum(sixel_palette[i * 4 + 1]); + image->colormap[i].blue = ScaleCharToQuantum(sixel_palette[i * 4 + 2]); + } + + j=0; + if (image_info->ping == MagickFalse) + { + /* + Read image pixels. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + r=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (r == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + j=(ssize_t) sixel_pixels[y * image->columns + x]; + j=ConstrainColormapIndex(image,j); + SetPixelIndex(indexes+x,j); + SetPixelRGBO(r,image->colormap+(ssize_t) j); + r++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if (y < (ssize_t) image->rows) + { + sixel_pixels=(unsigned char *) RelinquishMagickMemory(sixel_pixels); + sixel_palette=(unsigned char *) RelinquishMagickMemory(sixel_palette); + ThrowReaderException(CorruptImageError,"NotEnoughPixelData"); + } + } + /* + Relinquish resources. + */ + sixel_pixels=(unsigned char *) RelinquishMagickMemory(sixel_pixels); + sixel_palette=(unsigned char *) RelinquishMagickMemory(sixel_palette); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r S I X E L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterSIXELImage() adds attributes for the SIXEL image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterSIXELImage method is: +% +% size_t RegisterSIXELImage(void) +% +*/ +ModuleExport size_t RegisterSIXELImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("SIXEL"); + entry->decoder=(DecodeImageHandler *) ReadSIXELImage; + entry->encoder=(EncodeImageHandler *) WriteSIXELImage; + entry->magick=(IsImageFormatHandler *) IsSIXEL; + entry->adjoin=MagickFalse; + entry->description=ConstantString("DEC SIXEL Graphics Format"); + entry->magick_module=ConstantString("SIXEL"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("SIX"); + entry->decoder=(DecodeImageHandler *) ReadSIXELImage; + entry->encoder=(EncodeImageHandler *) WriteSIXELImage; + entry->magick=(IsImageFormatHandler *) IsSIXEL; + entry->adjoin=MagickFalse; + entry->description=ConstantString("DEC SIXEL Graphics Format"); + entry->magick_module=ConstantString("SIXEL"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r S I X E L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterSIXELImage() removes format registrations made by the +% SIXEL module from the list of supported formats. +% +% The format of the UnregisterSIXELImage method is: +% +% UnregisterSIXELImage(void) +% +*/ +ModuleExport void UnregisterSIXELImage(void) +{ + (void) UnregisterMagickInfo("SIXEL"); + (void) UnregisterMagickInfo("SIX"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e S I X E L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteSIXELImage() writes an image to a file in the X pixmap format. +% +% The format of the WriteSIXELImage method is: +% +% MagickBooleanType WriteSIXELImage(const ImageInfo *image_info, +% Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType WriteSIXELImage(const ImageInfo *image_info, + Image *image) +{ + ExceptionInfo + *exception; + + MagickBooleanType + status; + + const IndexPacket + *indexes; + + ssize_t + i, + x; + + ssize_t + opacity, + y; + + sixel_output_t + *output; + + unsigned char + sixel_palette[256 * 3], + *sixel_pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=(&image->exception); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + opacity=(-1); + if (image->matte == MagickFalse) + { + if ((image->storage_class == DirectClass) || (image->colors > 256)) + (void) SetImageType(image,PaletteType); + } + else + { + MagickRealType + alpha, + beta; + + /* + Identify transparent colormap index. + */ + if ((image->storage_class == DirectClass) || (image->colors > 256)) + (void) SetImageType(image,PaletteBilevelMatteType); + for (i=0; i < (ssize_t) image->colors; i++) + if (image->colormap[i].opacity != OpaqueOpacity) + { + if (opacity < 0) + { + opacity=i; + continue; + } + alpha=(MagickRealType) image->colormap[i].opacity; + beta=(MagickRealType) image->colormap[opacity].opacity; + if (alpha > beta) + opacity=i; + } + if (opacity == -1) + { + (void) SetImageType(image,PaletteBilevelMatteType); + for (i=0; i < (ssize_t) image->colors; i++) + if (image->colormap[i].opacity != OpaqueOpacity) + { + if (opacity < 0) + { + opacity=i; + continue; + } + alpha=(MagickRealType) image->colormap[i].opacity; + beta=(MagickRealType) image->colormap[opacity].opacity; + if (alpha > beta) + opacity=i; + } + } + if (opacity >= 0) + { + image->colormap[opacity].red=image->transparent_color.red; + image->colormap[opacity].green=image->transparent_color.green; + image->colormap[opacity].blue=image->transparent_color.blue; + } + } + /* + SIXEL header. + */ + for (i=0; i < (ssize_t) image->colors; i++) + { + sixel_palette[i * 3 + 0] = ScaleQuantumToChar(image->colormap[i].red); + sixel_palette[i * 3 + 1] = ScaleQuantumToChar(image->colormap[i].green); + sixel_palette[i * 3 + 2] = ScaleQuantumToChar(image->colormap[i].blue); + } + + /* + Define SIXEL pixels. + */ + output = sixel_output_create(image); + if (output == (sixel_output_t *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + sixel_pixels =(unsigned char *) AcquireQuantumMemory(image->columns, + image->rows*sizeof(*sixel_pixels)); + if (sixel_pixels == (unsigned char *) NULL) + { + output = (sixel_output_t *) RelinquishMagickMemory(output); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *p; + + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + sixel_pixels[y*image->columns+x]=(unsigned char) + ((ssize_t) GetPixelIndex(indexes+x)); + } + status = sixel_encode_impl(sixel_pixels, image->columns, image->rows, + sixel_palette, image->colors, -1, output); + sixel_pixels =(unsigned char *) RelinquishMagickMemory(sixel_pixels); + output = (sixel_output_t *) RelinquishMagickMemory(output); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/stegano.c b/ImageMagick-6.9.12-44/coders/stegano.c new file mode 100644 index 0000000..ab116e8 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/stegano.c @@ -0,0 +1,289 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS TTTTT EEEEE GGGG AAA N N OOO % +% SS T E G A A NN N O O % +% SSS T EEE G GG AAAAA N N N O O % +% SS T E G G A A N NN O O % +% SSSSS T EEEEE GGG A A N N OOO % +% % +% % +% Write A Steganographic Image. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colormap.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d S T E G A N O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadSTEGANOImage() reads a steganographic image hidden within another +% image type. It allocates the memory necessary for the new Image structure +% and returns a pointer to the new image. +% +% The format of the ReadSTEGANOImage method is: +% +% Image *ReadSTEGANOImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadSTEGANOImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ +#define GetBit(alpha,i) (((size_t) (alpha) >> (size_t) (i)) & 0x01) +#define SetBit(indexes,i,set) SetPixelIndex(indexes,((set) != 0 ? \ + (size_t) GetPixelIndex(indexes) | (one << (size_t) (i)) : (size_t) \ + GetPixelIndex(indexes) & ~(one << (size_t) (i)))) + + Image + *image, + *watermark; + + ImageInfo + *read_info; + + int + c; + + MagickBooleanType + status; + + PixelPacket + pixel; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + x; + + size_t + depth, + one; + + ssize_t + i, + j, + k, + y; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + one=1; + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + *read_info->magick='\0'; + watermark=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (watermark == (Image *) NULL) + return(DestroyImageList(image)); + watermark->depth=MAGICKCORE_QUANTUM_DEPTH; + if (AcquireImageColormap(image,MaxColormapSize) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Get hidden watermark from low-order bits of image. + */ + c=0; + i=0; + j=0; + i=(ssize_t) (watermark->depth-1); + depth=watermark->depth; + for (k=image->offset; (i >= 0) && (j < (ssize_t) depth); i--) + { + for (y=0; (y < (ssize_t) image->rows) && (j < (ssize_t) depth); y++) + { + x=0; + for ( ; (x < (ssize_t) image->columns) && (j < (ssize_t) depth); x++) + { + if ((k/(ssize_t) watermark->columns) >= (ssize_t) watermark->rows) + break; + (void) GetOneVirtualPixel(watermark,k % (ssize_t) watermark->columns, + k/(ssize_t) watermark->columns,&pixel,exception); + q=GetAuthenticPixels(image,x,y,1,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + switch (c) + { + case 0: + { + SetBit(indexes,i,GetBit(pixel.red,j)); + break; + } + case 1: + { + SetBit(indexes,i,GetBit(pixel.green,j)); + break; + } + case 2: + { + SetBit(indexes,i,GetBit(pixel.blue,j)); + break; + } + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + c++; + if (c == 3) + c=0; + k++; + if (k == (ssize_t) (watermark->columns*watermark->columns)) + k=0; + if (k == image->offset) + j++; + } + } + status=SetImageProgress(image,LoadImagesTag,(MagickOffsetType) i,depth); + if (status == MagickFalse) + break; + } + watermark=DestroyImage(watermark); + (void) SyncImage(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r S T E G A N O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterSTEGANOImage() adds attributes for the STEGANO image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterSTEGANOImage method is: +% +% size_t RegisterSTEGANOImage(void) +% +*/ +ModuleExport size_t RegisterSTEGANOImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("STEGANO"); + entry->decoder=(DecodeImageHandler *) ReadSTEGANOImage; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Steganographic image"); + entry->magick_module=ConstantString("STEGANO"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r S T E G A N O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterSTEGANOImage() removes format registrations made by the +% STEGANO module from the list of supported formats. +% +% The format of the UnregisterSTEGANOImage method is: +% +% UnregisterSTEGANOImage(void) +% +*/ +ModuleExport void UnregisterSTEGANOImage(void) +{ + (void) UnregisterMagickInfo("STEGANO"); +} diff --git a/ImageMagick-6.9.12-44/coders/sun.c b/ImageMagick-6.9.12-44/coders/sun.c new file mode 100644 index 0000000..c17ee93 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/sun.c @@ -0,0 +1,1039 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS U U N N % +% SS U U NN N % +% SSS U U N N N % +% SS U U N NN % +% SSSSS UUU N N % +% % +% % +% Read/Write Sun Rasterfile Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteSUNImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s S U N % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsSUN() returns MagickTrue if the image format type, identified by the +% magick string, is SUN. +% +% The format of the IsSUN method is: +% +% MagickBooleanType IsSUN(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsSUN(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\131\246\152\225",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e c o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DecodeImage unpacks the packed image pixels into runlength-encoded pixel +% packets. +% +% The format of the DecodeImage method is: +% +% MagickBooleanType DecodeImage(const unsigned char *compressed_pixels, +% const size_t length,unsigned char *pixels) +% +% A description of each parameter follows: +% +% o compressed_pixels: The address of a byte (8 bits) array of compressed +% pixel data. +% +% o length: An integer value that is the total number of bytes of the +% source image (as just read by ReadBlob) +% +% o pixels: The address of a byte (8 bits) array of pixel data created by +% the uncompression process. The number of bytes in this array +% must be at least equal to the number columns times the number of rows +% of the source pixels. +% +*/ +static MagickBooleanType DecodeImage(const unsigned char *compressed_pixels, + const size_t length,unsigned char *pixels,size_t extent) +{ + const unsigned char + *p; + + unsigned char + *q; + + ssize_t + count; + + unsigned char + byte; + + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(compressed_pixels != (unsigned char *) NULL); + assert(pixels != (unsigned char *) NULL); + p=compressed_pixels; + q=pixels; + while (((size_t) (p-compressed_pixels) < length) && + ((size_t) (q-pixels) < extent)) + { + byte=(*p++); + if (byte != 128U) + *q++=byte; + else + { + /* + Runlength-encoded packet: . + */ + if (((size_t) (p-compressed_pixels) >= length)) + break; + count=(*p++); + if (count > 0) + { + if (((size_t) (p-compressed_pixels) >= length)) + break; + byte=(*p++); + } + while ((count >= 0) && ((size_t) (q-pixels) < extent)) + { + *q++=byte; + count--; + } + } + } + return(((size_t) (q-pixels) == extent) ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d S U N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadSUNImage() reads a SUN image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the ReadSUNImage method is: +% +% Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define RMT_EQUAL_RGB 1 +#define RMT_NONE 0 +#define RMT_RAW 2 +#define RT_STANDARD 1 +#define RT_ENCODED 2 +#define RT_FORMAT_RGB 3 + + typedef struct _SUNInfo + { + unsigned int + magic, + width, + height, + depth, + length, + type, + maptype, + maplength; + } SUNInfo; + + Image + *image; + + int + bit; + + MagickBooleanType + status; + + MagickSizeType + number_pixels; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + i, + x; + + unsigned char + *p; + + size_t + bytes_per_line, + extent, + height, + pixels_length, + quantum; + + ssize_t + count, + y; + + SUNInfo + sun_info; + + unsigned char + *sun_data, + *sun_pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read SUN raster header. + */ + (void) memset(&sun_info,0,sizeof(sun_info)); + sun_info.magic=ReadBlobMSBLong(image); + do + { + /* + Verify SUN identifier. + */ + if (sun_info.magic != 0x59a66a95) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + sun_info.width=ReadBlobMSBLong(image); + sun_info.height=ReadBlobMSBLong(image); + sun_info.depth=ReadBlobMSBLong(image); + sun_info.length=ReadBlobMSBLong(image); + sun_info.type=ReadBlobMSBLong(image); + sun_info.maptype=ReadBlobMSBLong(image); + sun_info.maplength=ReadBlobMSBLong(image); + if (sun_info.maplength > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + extent=(size_t) (sun_info.height*sun_info.width); + if ((sun_info.height != 0) && (sun_info.width != (extent/sun_info.height))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((sun_info.type != RT_STANDARD) && (sun_info.type != RT_ENCODED) && + (sun_info.type != RT_FORMAT_RGB)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((sun_info.maptype == RMT_NONE) && (sun_info.maplength != 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((sun_info.depth != 1) && (sun_info.depth != 8) && + (sun_info.depth != 24) && (sun_info.depth != 32)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((sun_info.maptype != RMT_NONE) && (sun_info.maptype != RMT_EQUAL_RGB) && + (sun_info.maptype != RMT_RAW)) + ThrowReaderException(CoderError,"ColormapTypeNotSupported"); + image->columns=sun_info.width; + image->rows=sun_info.height; + image->depth=sun_info.depth <= 8 ? sun_info.depth : + MAGICKCORE_QUANTUM_DEPTH; + if (sun_info.depth < 24) + { + size_t + one; + + image->colors=sun_info.maplength; + one=1; + if (sun_info.maptype == RMT_NONE) + image->colors=one << sun_info.depth; + if (sun_info.maptype == RMT_EQUAL_RGB) + image->colors=sun_info.maplength/3; + if (image->colors == 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + switch (sun_info.maptype) + { + case RMT_NONE: + break; + case RMT_EQUAL_RGB: + { + unsigned char + *sun_colormap; + + /* + Read SUN raster colormap. + */ + sun_colormap=(unsigned char *) AcquireQuantumMemory(image->colors, + sizeof(*sun_colormap)); + if (sun_colormap == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,image->colors,sun_colormap); + if (count != (ssize_t) image->colors) + { + sun_colormap=(unsigned char *) RelinquishMagickMemory(sun_colormap); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + for (i=0; i < (ssize_t) image->colors; i++) + image->colormap[i].red=ScaleCharToQuantum(sun_colormap[i]); + count=ReadBlob(image,image->colors,sun_colormap); + if (count != (ssize_t) image->colors) + { + sun_colormap=(unsigned char *) RelinquishMagickMemory(sun_colormap); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + for (i=0; i < (ssize_t) image->colors; i++) + image->colormap[i].green=ScaleCharToQuantum(sun_colormap[i]); + count=ReadBlob(image,image->colors,sun_colormap); + if (count != (ssize_t) image->colors) + { + sun_colormap=(unsigned char *) RelinquishMagickMemory(sun_colormap); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + for (i=0; i < (ssize_t) image->colors; i++) + image->colormap[i].blue=ScaleCharToQuantum(sun_colormap[i]); + sun_colormap=(unsigned char *) RelinquishMagickMemory(sun_colormap); + break; + } + case RMT_RAW: + { + unsigned char + *sun_colormap; + + /* + Read SUN raster colormap. + */ + sun_colormap=(unsigned char *) AcquireQuantumMemory(sun_info.maplength, + sizeof(*sun_colormap)); + if (sun_colormap == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,sun_info.maplength,sun_colormap); + sun_colormap=(unsigned char *) RelinquishMagickMemory(sun_colormap); + if (count != (ssize_t) sun_info.maplength) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + break; + } + default: + break; + } + image->matte=sun_info.depth == 32 ? MagickTrue : MagickFalse; + image->columns=sun_info.width; + image->rows=sun_info.height; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (sun_info.length == 0) + ThrowReaderException(ResourceLimitError,"ImproperImageHeader"); + number_pixels=(MagickSizeType) (image->columns*image->rows); + if ((sun_info.type != RT_ENCODED) && + ((number_pixels*sun_info.depth) > (8UL*sun_info.length))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (HeapOverflowSanityCheck(sun_info.width,sun_info.depth) != MagickFalse) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (HeapOverflowSanityCheckGetSize(sun_info.width,sun_info.depth,&bytes_per_line) != MagickFalse) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((sun_info.type != RT_ENCODED) && (sun_info.length > GetBlobSize(image))) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + sun_data=(unsigned char *) AcquireQuantumMemory(sun_info.length, + sizeof(*sun_data)); + if (sun_data == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(sun_data,0,sun_info.length*sizeof(*sun_data)); + count=(ssize_t) ReadBlob(image,sun_info.length,sun_data); + if ((sun_info.type != RT_ENCODED) && (count != (ssize_t) sun_info.length)) + { + sun_data=(unsigned char *) RelinquishMagickMemory(sun_data); + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + } + height=sun_info.height; + if ((height == 0) || (sun_info.width == 0) || (sun_info.depth == 0) || + ((bytes_per_line/sun_info.depth) != sun_info.width)) + { + sun_data=(unsigned char *) RelinquishMagickMemory(sun_data); + ThrowReaderException(ResourceLimitError,"ImproperImageHeader"); + } + quantum=sun_info.depth == 1 ? 15 : 7; + bytes_per_line+=quantum; + bytes_per_line<<=1; + if ((bytes_per_line >> 1) != ((size_t) sun_info.width*sun_info.depth+quantum)) + { + sun_data=(unsigned char *) RelinquishMagickMemory(sun_data); + ThrowReaderException(ResourceLimitError,"ImproperImageHeader"); + } + bytes_per_line>>=4; + if (HeapOverflowSanityCheck(height,bytes_per_line) != MagickFalse) + { + sun_data=(unsigned char *) RelinquishMagickMemory(sun_data); + ThrowReaderException(ResourceLimitError,"ImproperImageHeader"); + } + pixels_length=height*bytes_per_line; + sun_pixels=(unsigned char *) AcquireQuantumMemory(pixels_length+image->rows, + sizeof(*sun_pixels)); + if (sun_pixels == (unsigned char *) NULL) + { + sun_data=(unsigned char *) RelinquishMagickMemory(sun_data); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(sun_pixels,0,(pixels_length+image->rows)*sizeof(*sun_pixels)); + if (sun_info.type == RT_ENCODED) + { + status=DecodeImage(sun_data,sun_info.length,sun_pixels,pixels_length); + if (status == MagickFalse) + { + sun_data=(unsigned char *) RelinquishMagickMemory(sun_data); + sun_pixels=(unsigned char *) RelinquishMagickMemory(sun_pixels); + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + } + } + else + { + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + if (sun_info.length > (pixels_length+image->rows)) + { + sun_data=(unsigned char *) RelinquishMagickMemory(sun_data); + sun_pixels=(unsigned char *) RelinquishMagickMemory(sun_pixels); + ThrowReaderException(ResourceLimitError,"ImproperImageHeader"); + } + (void) memcpy(sun_pixels,sun_data,sun_info.length); + } + sun_data=(unsigned char *) RelinquishMagickMemory(sun_data); + /* + Convert SUN raster image to pixel packets. + */ + p=sun_pixels; + if (sun_info.depth == 1) + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < ((ssize_t) image->columns-7); x+=8) + { + for (bit=7; bit >= 0; bit--) + SetPixelIndex(indexes+x+7-bit,((*p) & (0x01 << bit) ? 0x00 : 0x01)); + p++; + } + if ((image->columns % 8) != 0) + { + for (bit=7; bit >= (int) (8-(image->columns % 8)); bit--) + SetPixelIndex(indexes+x+7-bit,(*p) & (0x01 << bit) ? 0x00 : 0x01); + p++; + } + if ((((image->columns/8)+(image->columns % 8 ? 1 : 0)) % 2) != 0) + p++; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + else + if (image->storage_class == PseudoClass) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelIndex(indexes+x,ConstrainColormapIndex(image,*p)); + p++; + } + if ((image->columns % 2) != 0) + p++; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + else + { + size_t + bytes_per_pixel; + + bytes_per_pixel=3; + if (image->matte != MagickFalse) + bytes_per_pixel++; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (image->matte != MagickFalse) + SetPixelAlpha(q,ScaleCharToQuantum(*p++)); + if (sun_info.type == RT_STANDARD) + { + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelRed(q,ScaleCharToQuantum(*p++)); + } + else + { + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + } + if (image->colors != 0) + { + SetPixelRed(q,image->colormap[(ssize_t) + GetPixelRed(q)].red); + SetPixelGreen(q,image->colormap[(ssize_t) + GetPixelGreen(q)].green); + SetPixelBlue(q,image->colormap[(ssize_t) + GetPixelBlue(q)].blue); + } + q++; + } + if (((bytes_per_pixel*image->columns) % 2) != 0) + p++; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + if (image->storage_class == PseudoClass) + (void) SyncImage(image); + sun_pixels=(unsigned char *) RelinquishMagickMemory(sun_pixels); + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + sun_info.magic=ReadBlobMSBLong(image); + if (sun_info.magic == 0x59a66a95) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while (sun_info.magic == 0x59a66a95); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r S U N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterSUNImage() adds attributes for the SUN image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterSUNImage method is: +% +% size_t RegisterSUNImage(void) +% +*/ +ModuleExport size_t RegisterSUNImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("RAS"); + entry->decoder=(DecodeImageHandler *) ReadSUNImage; + entry->encoder=(EncodeImageHandler *) WriteSUNImage; + entry->magick=(IsImageFormatHandler *) IsSUN; + entry->description=ConstantString("SUN Rasterfile"); + entry->seekable_stream=MagickTrue; + entry->magick_module=ConstantString("SUN"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("SUN"); + entry->decoder=(DecodeImageHandler *) ReadSUNImage; + entry->encoder=(EncodeImageHandler *) WriteSUNImage; + entry->description=ConstantString("SUN Rasterfile"); + entry->seekable_stream=MagickTrue; + entry->magick_module=ConstantString("SUN"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r S U N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterSUNImage() removes format registrations made by the +% SUN module from the list of supported formats. +% +% The format of the UnregisterSUNImage method is: +% +% UnregisterSUNImage(void) +% +*/ +ModuleExport void UnregisterSUNImage(void) +{ + (void) UnregisterMagickInfo("RAS"); + (void) UnregisterMagickInfo("SUN"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e S U N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteSUNImage() writes an image in the SUN rasterfile format. +% +% The format of the WriteSUNImage method is: +% +% MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) +{ +#define RMT_EQUAL_RGB 1 +#define RMT_NONE 0 +#define RMT_RAW 2 +#define RT_STANDARD 1 +#define RT_FORMAT_RGB 3 + + typedef struct _SUNInfo + { + unsigned int + magic, + width, + height, + depth, + length, + type, + maptype, + maplength; + } SUNInfo; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + MagickSizeType + number_pixels; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + size_t + imageListLength; + + ssize_t + y; + + SUNInfo + sun_info; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Initialize SUN raster file header. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + sun_info.magic=0x59a66a95; + if ((image->columns != (unsigned int) image->columns) || + (image->rows != (unsigned int) image->rows)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + sun_info.width=(unsigned int) image->columns; + sun_info.height=(unsigned int) image->rows; + sun_info.type=(unsigned int) (image->storage_class == DirectClass ? + RT_FORMAT_RGB : RT_STANDARD); + sun_info.maptype=RMT_NONE; + sun_info.maplength=0; + number_pixels=(MagickSizeType) image->columns*image->rows; + if ((4*number_pixels) != (size_t) (4*number_pixels)) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + if (image->storage_class == DirectClass) + { + /* + Full color SUN raster. + */ + sun_info.depth=(unsigned int) image->matte ? 32U : 24U; + sun_info.length=(unsigned int) ((image->matte ? 4 : 3)*number_pixels); + sun_info.length+=sun_info.length & 0x01 ? (unsigned int) image->rows : + 0; + } + else + if (SetImageMonochrome(image,&image->exception)) + { + /* + Monochrome SUN raster. + */ + sun_info.depth=1; + sun_info.length=(unsigned int) (((image->columns+7) >> 3)* + image->rows); + sun_info.length+=(unsigned int) (((image->columns/8)+(image->columns % + 8 ? 1 : 0)) % 2 ? image->rows : 0); + } + else + { + /* + Colormapped SUN raster. + */ + sun_info.depth=8; + sun_info.length=(unsigned int) number_pixels; + sun_info.length+=(unsigned int) (image->columns & 0x01 ? image->rows : + 0); + sun_info.maptype=RMT_EQUAL_RGB; + sun_info.maplength=(unsigned int) (3*image->colors); + } + /* + Write SUN header. + */ + (void) WriteBlobMSBLong(image,sun_info.magic); + (void) WriteBlobMSBLong(image,sun_info.width); + (void) WriteBlobMSBLong(image,sun_info.height); + (void) WriteBlobMSBLong(image,sun_info.depth); + (void) WriteBlobMSBLong(image,sun_info.length); + (void) WriteBlobMSBLong(image,sun_info.type); + (void) WriteBlobMSBLong(image,sun_info.maptype); + (void) WriteBlobMSBLong(image,sun_info.maplength); + /* + Convert MIFF to SUN raster pixels. + */ + x=0; + y=0; + if (image->storage_class == DirectClass) + { + unsigned char + *q; + + size_t + bytes_per_pixel, + length; + + unsigned char + *pixels; + + /* + Allocate memory for pixels. + */ + bytes_per_pixel=3; + if (image->matte != MagickFalse) + bytes_per_pixel++; + length=image->columns; + pixels=(unsigned char *) AcquireQuantumMemory(length,4*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Convert DirectClass packet to SUN RGB pixel. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (image->matte != MagickFalse) + *q++=ScaleQuantumToChar(GetPixelAlpha(p)); + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + p++; + } + if (((bytes_per_pixel*image->columns) & 0x01) != 0) + *q++='\0'; /* pad scanline */ + (void) WriteBlob(image,(size_t) (q-pixels),pixels); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + } + else + if (SetImageMonochrome(image,&image->exception)) + { + unsigned char + bit, + byte; + + /* + Convert PseudoClass image to a SUN monochrome image. + */ + (void) SetImageType(image,BilevelType); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte<<=1; + if (GetPixelLuma(image,p) < (QuantumRange/2.0)) + byte|=0x01; + bit++; + if (bit == 8) + { + (void) WriteBlobByte(image,byte); + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + (void) WriteBlobByte(image,(unsigned char) (byte << (8-bit))); + if ((((image->columns/8)+ + (image->columns % 8 ? 1 : 0)) % 2) != 0) + (void) WriteBlobByte(image,0); /* pad scanline */ + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + else + { + /* + Dump colormap to file. + */ + for (i=0; i < (ssize_t) image->colors; i++) + (void) WriteBlobByte(image,ScaleQuantumToChar( + image->colormap[i].red)); + for (i=0; i < (ssize_t) image->colors; i++) + (void) WriteBlobByte(image,ScaleQuantumToChar( + image->colormap[i].green)); + for (i=0; i < (ssize_t) image->colors; i++) + (void) WriteBlobByte(image,ScaleQuantumToChar( + image->colormap[i].blue)); + /* + Convert PseudoClass packet to SUN colormapped pixel. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + (void) WriteBlobByte(image,(unsigned char) + GetPixelIndex(indexes+x)); + p++; + } + if (image->columns & 0x01) + (void) WriteBlobByte(image,0); /* pad scanline */ + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/svg.c b/ImageMagick-6.9.12-44/coders/svg.c new file mode 100644 index 0000000..76af965 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/svg.c @@ -0,0 +1,5279 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS V V GGGG % +% SS V V G % +% SSS V V G GG % +% SS V V G G % +% SSSSS V GGG % +% % +% % +% Read/Write Scalable Vector Graphics Format % +% % +% Software Design % +% Cristy % +% William Radcliffe % +% March 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/annotate.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/constitute.h" +#include "magick/composite-private.h" +#include "magick/delegate.h" +#include "magick/delegate-private.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/gem.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/policy.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/token.h" +#include "magick/utility.h" + +#if defined(MAGICKCORE_XML_DELEGATE) +# if defined(MAGICKCORE_WINDOWS_SUPPORT) +# if !defined(__MINGW32__) +# include +# endif +# endif +# include +# include +# include +#endif + +#if defined(MAGICKCORE_AUTOTRACE_DELEGATE) +#include "autotrace/autotrace.h" +#endif + +#if defined(MAGICKCORE_RSVG_DELEGATE) +#include "librsvg/rsvg.h" +#if !defined(LIBRSVG_CHECK_VERSION) +#include "librsvg/rsvg-cairo.h" +#include "librsvg/librsvg-features.h" +#elif !LIBRSVG_CHECK_VERSION(2,36,2) +#include "librsvg/rsvg-cairo.h" +#include "librsvg/librsvg-features.h" +#endif +#endif + +/* + Define declarations. +*/ +#define DefaultSVGDensity 96.0 + +/* + Typedef declarations. +*/ +typedef struct _BoundingBox +{ + double + x, + y, + width, + height; +} BoundingBox; + +typedef struct _ElementInfo +{ + double + cx, + cy, + major, + minor, + angle; +} ElementInfo; + +typedef struct _SVGInfo +{ + FILE + *file; + + ExceptionInfo + *exception; + + Image + *image; + + const ImageInfo + *image_info; + + AffineMatrix + affine; + + size_t + width, + height; + + char + *size, + *title, + *comment; + + int + n; + + double + *scale, + pointsize; + + ElementInfo + element; + + SegmentInfo + segment; + + BoundingBox + bounds, + text_offset, + view_box; + + PointInfo + radius; + + char + *stop_color, + *offset, + *text, + *vertices, + *url; + +#if defined(MAGICKCORE_XML_DELEGATE) + xmlParserCtxtPtr + parser; + + xmlDocPtr + document; +#endif + + ssize_t + svgDepth; +} SVGInfo; + +/* + Static declarations. +*/ +static char + SVGDensityGeometry[] = "96.0x96.0"; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteSVGImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s S V G % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsSVG()() returns MagickTrue if the image format type, identified by the +% magick string, is SVG. +% +% The format of the IsSVG method is: +% +% MagickBooleanType IsSVG(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsSVG(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (LocaleNCompare((const char *) magick+1,"svg",3) == 0) + return(MagickTrue); + if (length < 5) + return(MagickFalse); + if (LocaleNCompare((const char *) magick+1,"?xml",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d S V G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadSVGImage() reads a Scalable Vector Gaphics file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadSVGImage method is: +% +% Image *ReadSVGImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static Image *RenderSVGImage(const ImageInfo *image_info,Image *image, + ExceptionInfo *exception) +{ + char + background[MagickPathExtent], + command[MagickPathExtent], + *density, + input_filename[MagickPathExtent], + opacity[MagickPathExtent], + output_filename[MagickPathExtent], + unique[MagickPathExtent]; + + const DelegateInfo + *delegate_info; + + Image + *next; + + int + status; + + struct stat + attributes; + + /* + Our best hope for compliance with the SVG standard. + */ + delegate_info=GetDelegateInfo("svg:decode",(char *) NULL,exception); + if (delegate_info == (const DelegateInfo *) NULL) + return((Image *) NULL); + status=AcquireUniqueSymbolicLink(image->filename,input_filename); + (void) AcquireUniqueFilename(unique); + (void) FormatLocaleString(output_filename,MagickPathExtent,"%s.png",unique); + (void) AcquireUniqueFilename(unique); + density=AcquireString(""); + (void) FormatLocaleString(density,MagickPathExtent,"%.20g", + ceil(sqrt(image->x_resolution*image->y_resolution)-0.5)); + (void) FormatLocaleString(background,MagickPathExtent, + "rgb(%.20g%%,%.20g%%,%.20g%%)", + 100.0*QuantumScale*image->background_color.red, + 100.0*QuantumScale*image->background_color.green, + 100.0*QuantumScale*image->background_color.blue); + (void) FormatLocaleString(opacity,MagickPathExtent,"%.20g",QuantumScale* + (QuantumRange-image->background_color.opacity)-MagickEpsilon); + (void) FormatLocaleString(command,MagickPathExtent, + GetDelegateCommands(delegate_info),input_filename,output_filename,density, + background,opacity,unique); + density=DestroyString(density); + status=ExternalDelegateCommand(MagickFalse,image_info->verbose,command, + (char *) NULL,exception); + (void) RelinquishUniqueFileResource(unique); + (void) RelinquishUniqueFileResource(input_filename); + if ((status == 0) && (stat(output_filename,&attributes) == 0) && + (attributes.st_size > 0)) + { + Image + *svg_image; + + ImageInfo + *read_info; + + read_info=CloneImageInfo(image_info); + (void) CopyMagickString(read_info->filename,output_filename, + MagickPathExtent); + svg_image=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (svg_image != (Image *) NULL) + { + (void) RelinquishUniqueFileResource(output_filename); + for (next=GetFirstImageInList(svg_image); next != (Image *) NULL; ) + { + (void) CopyMagickString(next->filename,image->filename, + MaxTextExtent); + (void) CopyMagickString(next->magick,image->magick,MaxTextExtent); + next=GetNextImageInList(next); + } + return(svg_image); + } + } + (void) RelinquishUniqueFileResource(output_filename); + return((Image *) NULL); +} + +#if defined(MAGICKCORE_RSVG_DELEGATE) +static Image *RenderRSVGImage(const ImageInfo *image_info,Image *image, + ExceptionInfo *exception) +{ +#if defined(MAGICKCORE_CAIRO_DELEGATE) + cairo_surface_t + *cairo_surface; + + cairo_t + *cairo_image; + + MagickBooleanType + apply_density; + + MemoryInfo + *pixel_info; + + unsigned char + *p; + + RsvgDimensionData + dimension_info; + + unsigned char + *pixels; + +#else + GdkPixbuf + *pixel_buffer; + + const guchar + *p; +#endif + + const char + *option; + + GError + *error; + + Image + *next; + + MagickBooleanType + status; + + PixelPacket + fill_color; + + PixelPacket + *q; + + RsvgHandle + *svg_handle; + + ssize_t + n, + x, + y; + + unsigned char + *buffer; + + buffer=(unsigned char *) AcquireQuantumMemory(MagickMaxBufferExtent, + sizeof(*buffer)); + if (buffer == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); +#if LIBRSVG_CHECK_VERSION(2,40,3) + option=GetImageOption(image_info,"svg:xml-parse-huge"); + if ((option != (char *) NULL) && (IsStringTrue(option) != MagickFalse)) + svg_handle=rsvg_handle_new_with_flags(RSVG_HANDLE_FLAG_UNLIMITED); + else +#endif + svg_handle=rsvg_handle_new(); + if (svg_handle == (RsvgHandle *) NULL) + { + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + rsvg_handle_set_base_uri(svg_handle,image_info->filename); + if ((fabs(image->x_resolution) > MagickEpsilon) && + (fabs(image->y_resolution) > MagickEpsilon)) + rsvg_handle_set_dpi_x_y(svg_handle,image->x_resolution, + image->y_resolution); + while ((n=ReadBlob(image,MagickMaxBufferExtent-1,buffer)) != 0) + { + buffer[n]='\0'; + error=(GError *) NULL; + (void) rsvg_handle_write(svg_handle,buffer,n,&error); + if (error != (GError *) NULL) + g_error_free(error); + } + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + error=(GError *) NULL; + rsvg_handle_close(svg_handle,&error); + if (error != (GError *) NULL) + g_error_free(error); +#if defined(MAGICKCORE_CAIRO_DELEGATE) + apply_density=MagickTrue; + rsvg_handle_get_dimensions(svg_handle,&dimension_info); + if ((image->x_resolution > 0.0) && (image->y_resolution > 0.0)) + { + RsvgDimensionData + dpi_dimension_info; + + /* + We should not apply the density when the internal 'factor' is 'i'. + This can be checked by using the trick below. + */ + rsvg_handle_set_dpi_x_y(svg_handle,image->x_resolution*256, + image->y_resolution*256.0); + rsvg_handle_get_dimensions(svg_handle,&dpi_dimension_info); + if ((fabs((double) dpi_dimension_info.width != dimension_info.width) >= MagickEpsilon) || + (fabs((double) dpi_dimension_info.height != dimension_info.height) >= MagickEpsilon)) + apply_density=MagickFalse; + rsvg_handle_set_dpi_x_y(svg_handle,image->x_resolution, + image->y_resolution); + } + if (image_info->size != (char *) NULL) + { + (void) GetGeometry(image_info->size,(ssize_t *) NULL, + (ssize_t *) NULL,&image->columns,&image->rows); + if ((image->columns != 0) || (image->rows != 0)) + { + image->x_resolution=DefaultSVGDensity*image->columns/ + dimension_info.width; + image->y_resolution=DefaultSVGDensity*image->rows/ + dimension_info.height; + if (fabs(image->x_resolution) < MagickEpsilon) + image->x_resolution=image->y_resolution; + else + if (fabs(image->y_resolution) < MagickEpsilon) + image->y_resolution=image->x_resolution; + else + image->x_resolution=image->y_resolution=MagickMin( + image->x_resolution,image->y_resolution); + apply_density=MagickTrue; + } + } + if (apply_density != MagickFalse) + { + image->columns=image->x_resolution*dimension_info.width/ + DefaultSVGDensity; + image->rows=image->y_resolution*dimension_info.height/ + DefaultSVGDensity; + } + else + { + image->columns=dimension_info.width; + image->rows=dimension_info.height; + } + pixel_info=(MemoryInfo *) NULL; +#else + pixel_buffer=rsvg_handle_get_pixbuf(svg_handle); + rsvg_handle_free(svg_handle); + image->columns=gdk_pixbuf_get_width(pixel_buffer); + image->rows=gdk_pixbuf_get_height(pixel_buffer); +#endif + image->matte=MagickTrue; + if (image_info->ping == MagickFalse) + { +#if defined(MAGICKCORE_CAIRO_DELEGATE) + size_t + stride; +#endif + + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { +#if !defined(MAGICKCORE_CAIRO_DELEGATE) + g_object_unref(G_OBJECT(pixel_buffer)); +#endif + g_object_unref(svg_handle); + InheritException(exception,&image->exception); + ThrowReaderException(MissingDelegateError, + "NoDecodeDelegateForThisImageFormat"); + } + +#if defined(MAGICKCORE_CAIRO_DELEGATE) + stride=4*image->columns; +#if defined(MAGICKCORE_PANGOCAIRO_DELEGATE) + stride=(size_t) cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, + (int) image->columns); +#endif + pixel_info=AcquireVirtualMemory(stride,image->rows*sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + { + g_object_unref(svg_handle); + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + } + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); +#endif + (void) SetImageBackgroundColor(image); +#if defined(MAGICKCORE_CAIRO_DELEGATE) + cairo_surface=cairo_image_surface_create_for_data(pixels, + CAIRO_FORMAT_ARGB32,(int) image->columns,(int) image->rows,(int) + stride); + if ((cairo_surface == (cairo_surface_t *) NULL) || + (cairo_surface_status(cairo_surface) != CAIRO_STATUS_SUCCESS)) + { + if (cairo_surface != (cairo_surface_t *) NULL) + cairo_surface_destroy(cairo_surface); + pixel_info=RelinquishVirtualMemory(pixel_info); + g_object_unref(svg_handle); + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + } + cairo_image=cairo_create(cairo_surface); + cairo_set_operator(cairo_image,CAIRO_OPERATOR_CLEAR); + cairo_paint(cairo_image); + cairo_set_operator(cairo_image,CAIRO_OPERATOR_OVER); + if (apply_density != MagickFalse) + cairo_scale(cairo_image,image->x_resolution/DefaultSVGDensity, + image->y_resolution/DefaultSVGDensity); + rsvg_handle_render_cairo(svg_handle,cairo_image); + cairo_destroy(cairo_image); + cairo_surface_destroy(cairo_surface); + g_object_unref(svg_handle); + p=pixels; +#else + p=gdk_pixbuf_get_pixels(pixel_buffer); +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { +#if defined(MAGICKCORE_CAIRO_DELEGATE) + fill_color.blue=ScaleCharToQuantum(*p++); + fill_color.green=ScaleCharToQuantum(*p++); + fill_color.red=ScaleCharToQuantum(*p++); +#else + fill_color.red=ScaleCharToQuantum(*p++); + fill_color.green=ScaleCharToQuantum(*p++); + fill_color.blue=ScaleCharToQuantum(*p++); +#endif + fill_color.opacity=QuantumRange-ScaleCharToQuantum(*p++); +#if defined(MAGICKCORE_CAIRO_DELEGATE) + { + double + gamma; + + gamma=1.0-QuantumScale*fill_color.opacity; + gamma=PerceptibleReciprocal(gamma); + fill_color.blue*=gamma; + fill_color.green*=gamma; + fill_color.red*=gamma; + } +#endif + MagickCompositeOver(&fill_color,fill_color.opacity,q, + (MagickRealType) q->opacity,q); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + } +#if defined(MAGICKCORE_CAIRO_DELEGATE) + else + g_object_unref(svg_handle); + if (pixel_info != (MemoryInfo *) NULL) + pixel_info=RelinquishVirtualMemory(pixel_info); +#else + g_object_unref(G_OBJECT(pixel_buffer)); +#endif + (void) CloseBlob(image); + for (next=GetFirstImageInList(image); next != (Image *) NULL; ) + { + (void) CopyMagickString(next->filename,image->filename,MaxTextExtent); + (void) CopyMagickString(next->magick,image->magick,MaxTextExtent); + next=GetNextImageInList(next); + } + return(GetFirstImageInList(image)); +} +#endif + +#if defined(MAGICKCORE_XML_DELEGATE) +static SVGInfo *AcquireSVGInfo(void) +{ + SVGInfo + *svg_info; + + svg_info=(SVGInfo *) AcquireMagickMemory(sizeof(*svg_info)); + if (svg_info == (SVGInfo *) NULL) + return((SVGInfo *) NULL); + (void) memset(svg_info,0,sizeof(*svg_info)); + svg_info->text=AcquireString(""); + svg_info->scale=(double *) AcquireCriticalMemory(sizeof(*svg_info->scale)); + GetAffineMatrix(&svg_info->affine); + svg_info->scale[0]=ExpandAffine(&svg_info->affine); + return(svg_info); +} + +static SVGInfo *DestroySVGInfo(SVGInfo *svg_info) +{ + if (svg_info->size != (char *) NULL) + svg_info->size=DestroyString(svg_info->size); + if (svg_info->text != (char *) NULL) + svg_info->text=DestroyString(svg_info->text); + if (svg_info->scale != (double *) NULL) + svg_info->scale=(double *) RelinquishMagickMemory(svg_info->scale); + if (svg_info->title != (char *) NULL) + svg_info->title=DestroyString(svg_info->title); + if (svg_info->comment != (char *) NULL) + svg_info->comment=DestroyString(svg_info->comment); + return((SVGInfo *) RelinquishMagickMemory(svg_info)); +} + +static double GetUserSpaceCoordinateValue(const SVGInfo *svg_info,int type, + const char *string) +{ + char + *next_token, + token[MaxTextExtent]; + + const char + *p; + + double + value; + + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",string); + assert(string != (const char *) NULL); + p=(const char *) string; + (void) GetNextToken(p,&p,MaxTextExtent,token); + value=StringToDouble(token,&next_token); + if (strchr(token,'%') != (char *) NULL) + { + double + alpha, + beta; + + if (type > 0) + { + if (svg_info->view_box.width < MagickEpsilon) + return(0.0); + return(svg_info->view_box.width*value/100.0); + } + if (type < 0) + { + if (svg_info->view_box.height < MagickEpsilon) + return(0.0); + return(svg_info->view_box.height*value/100.0); + } + alpha=value-svg_info->view_box.width; + beta=value-svg_info->view_box.height; + return(hypot(alpha,beta)/sqrt(2.0)/100.0); + } + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (LocaleNCompare(token,"cm",2) == 0) + return(DefaultSVGDensity*svg_info->scale[0]/2.54*value); + if (LocaleNCompare(token,"em",2) == 0) + return(svg_info->pointsize*value); + if (LocaleNCompare(token,"ex",2) == 0) + return(svg_info->pointsize*value/2.0); + if (LocaleNCompare(token,"in",2) == 0) + return(DefaultSVGDensity*svg_info->scale[0]*value); + if (LocaleNCompare(token,"mm",2) == 0) + return(DefaultSVGDensity*svg_info->scale[0]/25.4*value); + if (LocaleNCompare(token,"pc",2) == 0) + return(DefaultSVGDensity*svg_info->scale[0]/6.0*value); + if (LocaleNCompare(token,"pt",2) == 0) + return(svg_info->scale[0]*value); + if (LocaleNCompare(token,"px",2) == 0) + return(value); + return(value); +} + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static int SVGIsStandalone(void *context) +{ + SVGInfo + *svg_info; + + /* + Is this document tagged standalone? + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.SVGIsStandalone()"); + svg_info=(SVGInfo *) context; + return(svg_info->document->standalone == 1); +} + +static int SVGHasInternalSubset(void *context) +{ + SVGInfo + *svg_info; + + /* + Does this document has an internal subset? + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.SVGHasInternalSubset()"); + svg_info=(SVGInfo *) context; + return(svg_info->document->intSubset != NULL); +} + +static int SVGHasExternalSubset(void *context) +{ + SVGInfo + *svg_info; + + /* + Does this document has an external subset? + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.SVGHasExternalSubset()"); + svg_info=(SVGInfo *) context; + return(svg_info->document->extSubset != NULL); +} + +static void SVGInternalSubset(void *context,const xmlChar *name, + const xmlChar *external_id,const xmlChar *system_id) +{ + SVGInfo + *svg_info; + + /* + Does this document has an internal subset? + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.internalSubset(%s, %s, %s)",(const char *) name, + (external_id != (const xmlChar *) NULL ? (const char *) external_id : "none"), + (system_id != (const xmlChar *) NULL ? (const char *) system_id : "none")); + svg_info=(SVGInfo *) context; + (void) xmlCreateIntSubset(svg_info->document,name,external_id,system_id); +} + +static xmlParserInputPtr SVGResolveEntity(void *context, + const xmlChar *public_id,const xmlChar *system_id) +{ + SVGInfo + *svg_info; + + xmlParserInputPtr + stream; + + /* + Special entity resolver, better left to the parser, it has more + context than the application layer. The default behaviour is to + not resolve the entities, in that case the ENTITY_REF nodes are + built in the structure (and the parameter values). + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.resolveEntity(%s, %s)", + (public_id != (const xmlChar *) NULL ? (const char *) public_id : "none"), + (system_id != (const xmlChar *) NULL ? (const char *) system_id : "none")); + svg_info=(SVGInfo *) context; + stream=xmlLoadExternalEntity((const char *) system_id,(const char *) + public_id,svg_info->parser); + return(stream); +} + +static xmlEntityPtr SVGGetEntity(void *context,const xmlChar *name) +{ + SVGInfo + *svg_info; + + /* + Get an entity by name. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.SVGGetEntity(%s)", + name); + svg_info=(SVGInfo *) context; + return(xmlGetDocEntity(svg_info->document,name)); +} + +static xmlEntityPtr SVGGetParameterEntity(void *context,const xmlChar *name) +{ + SVGInfo + *svg_info; + + /* + Get a parameter entity by name. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.getParameterEntity(%s)",name); + svg_info=(SVGInfo *) context; + return(xmlGetParameterEntity(svg_info->document,name)); +} + +static void SVGEntityDeclaration(void *context,const xmlChar *name,int type, + const xmlChar *public_id,const xmlChar *system_id,xmlChar *content) +{ + SVGInfo + *svg_info; + + /* + An entity definition has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.entityDecl(%s, %d, %s, %s, %s)",name,type, + public_id != (xmlChar *) NULL ? (const char *) public_id : "none", + system_id != (xmlChar *) NULL ? (const char *) system_id : "none",content); + svg_info=(SVGInfo *) context; + if (svg_info->parser->inSubset == 1) + (void) xmlAddDocEntity(svg_info->document,name,type,public_id,system_id, + content); + else + if (svg_info->parser->inSubset == 2) + (void) xmlAddDtdEntity(svg_info->document,name,type,public_id,system_id, + content); +} + +static void SVGAttributeDeclaration(void *context,const xmlChar *element, + const xmlChar *name,int type,int value,const xmlChar *default_value, + xmlEnumerationPtr tree) +{ + SVGInfo + *svg_info; + + xmlChar + *fullname, + *prefix; + + xmlParserCtxtPtr + parser; + + /* + An attribute definition has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.attributeDecl(%s, %s, %d, %d, %s, ...)",element,name,type,value, + default_value); + svg_info=(SVGInfo *) context; + fullname=(xmlChar *) NULL; + prefix=(xmlChar *) NULL; + parser=svg_info->parser; + fullname=(xmlChar *) xmlSplitQName(parser,name,&prefix); + if (parser->inSubset == 1) + (void) xmlAddAttributeDecl(&parser->vctxt,svg_info->document->intSubset, + element,fullname,prefix,(xmlAttributeType) type, + (xmlAttributeDefault) value,default_value,tree); + else + if (parser->inSubset == 2) + (void) xmlAddAttributeDecl(&parser->vctxt,svg_info->document->extSubset, + element,fullname,prefix,(xmlAttributeType) type, + (xmlAttributeDefault) value,default_value,tree); + if (prefix != (xmlChar *) NULL) + xmlFree(prefix); + if (fullname != (xmlChar *) NULL) + xmlFree(fullname); +} + +static void SVGElementDeclaration(void *context,const xmlChar *name,int type, + xmlElementContentPtr content) +{ + SVGInfo + *svg_info; + + xmlParserCtxtPtr + parser; + + /* + An element definition has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.elementDecl(%s, %d, ...)",name,type); + svg_info=(SVGInfo *) context; + parser=svg_info->parser; + if (parser->inSubset == 1) + (void) xmlAddElementDecl(&parser->vctxt,svg_info->document->intSubset, + name,(xmlElementTypeVal) type,content); + else + if (parser->inSubset == 2) + (void) xmlAddElementDecl(&parser->vctxt,svg_info->document->extSubset, + name,(xmlElementTypeVal) type,content); +} + +static void SVGStripString(const MagickBooleanType trim,char *message) +{ + char + *p, + *q; + + size_t + length; + + assert(message != (char *) NULL); + if (*message == '\0') + return; + /* + Remove comment. + */ + q=message; + for (p=message; *p != '\0'; p++) + { + if ((*p == '/') && (*(p+1) == '*')) + { + for ( ; *p != '\0'; p++) + if ((*p == '*') && (*(p+1) == '/')) + { + p+=2; + break; + } + if (*p == '\0') + break; + } + *q++=(*p); + } + *q='\0'; + length=strlen(message); + if ((trim != MagickFalse) && (length != 0)) + { + /* + Remove whitespace. + */ + p=message; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if ((*p == '\'') || (*p == '"')) + p++; + q=message+length-1; + while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p)) + q--; + if (q > p) + if ((*q == '\'') || (*q == '"')) + q--; + (void) memmove(message,p,(size_t) (q-p+1)); + message[q-p+1]='\0'; + } + /* + Convert newlines to a space. + */ + for (p=message; *p != '\0'; p++) + if (*p == '\n') + *p=' '; +} + +static char **SVGKeyValuePairs(void *context,const int key_sentinel, + const int value_sentinel,const char *text,size_t *number_tokens) +{ + char + **tokens; + + const char + *p, + *q; + + ssize_t + i; + + size_t + extent; + + SVGInfo + *svg_info; + + svg_info=(SVGInfo *) context; + *number_tokens=0; + if (text == (const char *) NULL) + return((char **) NULL); + extent=8; + tokens=(char **) AcquireQuantumMemory(extent+2UL,sizeof(*tokens)); + if (tokens == (char **) NULL) + { + (void) ThrowMagickException(svg_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",text); + return((char **) NULL); + } + /* + Convert string to an ASCII list. + */ + i=0; + p=text; + for (q=p; *q != '\0'; q++) + { + if ((*q != key_sentinel) && (*q != value_sentinel) && (*q != '\0')) + continue; + if (i == (ssize_t) extent) + { + extent<<=1; + tokens=(char **) ResizeQuantumMemory(tokens,extent+2,sizeof(*tokens)); + if (tokens == (char **) NULL) + { + (void) ThrowMagickException(svg_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",text); + return((char **) NULL); + } + } + tokens[i]=(char *) AcquireMagickMemory((size_t) (q-p+2)); + if (tokens[i] == (char *) NULL) + { + (void) ThrowMagickException(svg_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",text); + break; + } + (void) CopyMagickString(tokens[i],p,(size_t) (q-p+1)); + SVGStripString(MagickTrue,tokens[i]); + i++; + p=q+1; + } + tokens[i]=(char *) AcquireMagickMemory((size_t) (q-p+2)); + if (tokens[i] == (char *) NULL) + (void) ThrowMagickException(svg_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",text); + else + { + (void) CopyMagickString(tokens[i],p,(size_t) (q-p+1)); + SVGStripString(MagickTrue,tokens[i++]); + } + tokens[i]=(char *) NULL; + *number_tokens=(size_t) i; + return(tokens); +} + +static void SVGNotationDeclaration(void *context,const xmlChar *name, + const xmlChar *public_id,const xmlChar *system_id) +{ + SVGInfo + *svg_info; + + xmlParserCtxtPtr + parser; + + /* + What to do when a notation declaration has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.notationDecl(%s, %s, %s)",name, + public_id != (const xmlChar *) NULL ? (const char *) public_id : "none", + system_id != (const xmlChar *) NULL ? (const char *) system_id : "none"); + svg_info=(SVGInfo *) context; + parser=svg_info->parser; + if (parser->inSubset == 1) + (void) xmlAddNotationDecl(&parser->vctxt,svg_info->document->intSubset, + name,public_id,system_id); + else + if (parser->inSubset == 2) + (void) xmlAddNotationDecl(&parser->vctxt,svg_info->document->intSubset, + name,public_id,system_id); +} + +static void SVGProcessStyleElement(void *context,const xmlChar *name, + const char *style) +{ + char + background[MagickPathExtent], + *color, + *keyword, + *units, + *value; + + char + **tokens; + + ssize_t + i; + + size_t + number_tokens; + + SVGInfo + *svg_info; + + (void) LogMagickEvent(CoderEvent,GetMagickModule()," "); + svg_info=(SVGInfo *) context; + tokens=SVGKeyValuePairs(context,':',';',style,&number_tokens); + if (tokens == (char **) NULL) + return; + for (i=0; i < (ssize_t) (number_tokens-1); i+=2) + { + keyword=(char *) tokens[i]; + value=(char *) tokens[i+1]; + if (LocaleCompare(keyword,"font-size") != 0) + continue; + svg_info->pointsize=GetUserSpaceCoordinateValue(svg_info,0,value); + (void) FormatLocaleFile(svg_info->file,"font-size %g\n", + svg_info->pointsize); + } + color=AcquireString("none"); + units=AcquireString("userSpaceOnUse"); + for (i=0; i < (ssize_t) (number_tokens-1); i+=2) + { + keyword=(char *) tokens[i]; + value=(char *) tokens[i+1]; + (void) LogMagickEvent(CoderEvent,GetMagickModule()," %s: %s",keyword, + value); + switch (*keyword) + { + case 'B': + case 'b': + { + if (LocaleCompare((const char *) name,"background") == 0) + { + if (LocaleCompare((const char *) name,"svg") == 0) + (void) CopyMagickString(background,value,MagickPathExtent); + break; + } + break; + } + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"clip-path") == 0) + { + (void) FormatLocaleFile(svg_info->file,"clip-path \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"clip-rule") == 0) + { + (void) FormatLocaleFile(svg_info->file,"clip-rule \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"clipPathUnits") == 0) + { + (void) CloneString(&units,value); + (void) FormatLocaleFile(svg_info->file,"clip-units \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"color") == 0) + { + (void) CloneString(&color,value); + (void) FormatLocaleFile(svg_info->file,"currentColor \"%s\"\n", + color); + break; + } + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"fill") == 0) + { + if (LocaleCompare(value,"currentColor") == 0) + { + (void) FormatLocaleFile(svg_info->file,"fill \"%s\"\n",color); + break; + } + if (LocaleCompare(value,"#000000ff") == 0) + (void) FormatLocaleFile(svg_info->file,"fill '#000000'\n"); + else + (void) FormatLocaleFile(svg_info->file,"fill \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"fillcolor") == 0) + { + (void) FormatLocaleFile(svg_info->file,"fill \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"fill-rule") == 0) + { + (void) FormatLocaleFile(svg_info->file,"fill-rule \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"fill-opacity") == 0) + { + (void) FormatLocaleFile(svg_info->file,"fill-opacity \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"font") == 0) + { + char + family[MagickPathExtent], + size[MagickPathExtent], + style[MagickPathExtent]; + + if (sscanf(value,"%2048s %2048s %2048s",style,size,family) != 3) + break; + if (GetUserSpaceCoordinateValue(svg_info,0,style) == 0) + (void) FormatLocaleFile(svg_info->file,"font-style \"%s\"\n", + style); + else + if (sscanf(value,"%2048s %2048s",size,family) != 2) + break; + (void) FormatLocaleFile(svg_info->file,"font-size \"%s\"\n",size); + (void) FormatLocaleFile(svg_info->file,"font-family \"%s\"\n", + family); + break; + } + if (LocaleCompare(keyword,"font-family") == 0) + { + (void) FormatLocaleFile(svg_info->file,"font-family \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"font-stretch") == 0) + { + (void) FormatLocaleFile(svg_info->file,"font-stretch \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"font-style") == 0) + { + (void) FormatLocaleFile(svg_info->file,"font-style \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"font-size") == 0) + { + svg_info->pointsize=GetUserSpaceCoordinateValue(svg_info,0,value); + (void) FormatLocaleFile(svg_info->file,"font-size %g\n", + svg_info->pointsize); + break; + } + if (LocaleCompare(keyword,"font-weight") == 0) + { + (void) FormatLocaleFile(svg_info->file,"font-weight \"%s\"\n", + value); + break; + } + break; + } + case 'K': + case 'k': + { + if (LocaleCompare(keyword,"kerning") == 0) + { + (void) FormatLocaleFile(svg_info->file,"kerning \"%s\"\n",value); + break; + } + break; + } + case 'L': + case 'l': + { + if (LocaleCompare(keyword,"letter-spacing") == 0) + { + (void) FormatLocaleFile(svg_info->file,"letter-spacing \"%s\"\n", + value); + break; + } + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(keyword,"mask") == 0) + { + (void) FormatLocaleFile(svg_info->file,"mask \"%s\"\n",value); + break; + } + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(keyword,"offset") == 0) + { + (void) FormatLocaleFile(svg_info->file,"offset %g\n", + GetUserSpaceCoordinateValue(svg_info,1,value)); + break; + } + if (LocaleCompare(keyword,"opacity") == 0) + { + (void) FormatLocaleFile(svg_info->file,"opacity \"%s\"\n",value); + break; + } + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"stop-color") == 0) + { + (void) CloneString(&svg_info->stop_color,value); + break; + } + if (LocaleCompare(keyword,"stroke") == 0) + { + if (LocaleCompare(value,"currentColor") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke \"%s\"\n",color); + break; + } + if (LocaleCompare(value,"#000000ff") == 0) + (void) FormatLocaleFile(svg_info->file,"fill '#000000'\n"); + else + (void) FormatLocaleFile(svg_info->file, + "stroke \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"stroke-antialiasing") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-antialias %d\n", + LocaleCompare(value,"true") == 0); + break; + } + if (LocaleCompare(keyword,"stroke-dasharray") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-dasharray %s\n", + value); + break; + } + if (LocaleCompare(keyword,"stroke-dashoffset") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-dashoffset %g\n", + GetUserSpaceCoordinateValue(svg_info,1,value)); + break; + } + if (LocaleCompare(keyword,"stroke-linecap") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-linecap \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"stroke-linejoin") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-linejoin \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"stroke-miterlimit") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-miterlimit \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"stroke-opacity") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-opacity \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"stroke-width") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-width %g\n", + GetUserSpaceCoordinateValue(svg_info,1,value)); + break; + } + break; + } + case 't': + case 'T': + { + if (LocaleCompare(keyword,"text-align") == 0) + { + (void) FormatLocaleFile(svg_info->file,"text-align \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"text-anchor") == 0) + { + (void) FormatLocaleFile(svg_info->file,"text-anchor \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"text-decoration") == 0) + { + if (LocaleCompare(value,"underline") == 0) + (void) FormatLocaleFile(svg_info->file,"decorate underline\n"); + if (LocaleCompare(value,"line-through") == 0) + (void) FormatLocaleFile(svg_info->file,"decorate line-through\n"); + if (LocaleCompare(value,"overline") == 0) + (void) FormatLocaleFile(svg_info->file,"decorate overline\n"); + break; + } + if (LocaleCompare(keyword,"text-antialiasing") == 0) + { + (void) FormatLocaleFile(svg_info->file,"text-antialias %d\n", + LocaleCompare(value,"true") == 0); + break; + } + break; + } + default: + break; + } + } + if (units != (char *) NULL) + units=DestroyString(units); + if (color != (char *) NULL) + color=DestroyString(color); + for (i=0; tokens[i] != (char *) NULL; i++) + tokens[i]=DestroyString(tokens[i]); + tokens=(char **) RelinquishMagickMemory(tokens); +} + +static void SVGUnparsedEntityDeclaration(void *context,const xmlChar *name, + const xmlChar *public_id,const xmlChar *system_id,const xmlChar *notation) +{ + SVGInfo + *svg_info; + + /* + What to do when an unparsed entity declaration is parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.unparsedEntityDecl(%s, %s, %s, %s)",name, + public_id != (xmlChar *) NULL ? (const char *) public_id : "none", + system_id != (xmlChar *) NULL ? (const char *) system_id : "none",notation); + svg_info=(SVGInfo *) context; + (void) xmlAddDocEntity(svg_info->document,name, + XML_EXTERNAL_GENERAL_UNPARSED_ENTITY,public_id,system_id,notation); + +} + +static void SVGSetDocumentLocator(void *context,xmlSAXLocatorPtr location) +{ + SVGInfo + *svg_info; + + /* + Receive the document locator at startup, actually xmlDefaultSAXLocator. + */ + (void) location; + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.setDocumentLocator()"); + svg_info=(SVGInfo *) context; + (void) svg_info; +} + +static void SVGStartDocument(void *context) +{ + SVGInfo + *svg_info; + + xmlParserCtxtPtr + parser; + + /* + Called when the document start being processed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.startDocument()"); + svg_info=(SVGInfo *) context; + parser=svg_info->parser; + svg_info->document=xmlNewDoc(parser->version); + if (svg_info->document == (xmlDocPtr) NULL) + return; + if (parser->encoding == NULL) + svg_info->document->encoding=(const xmlChar *) NULL; + else + svg_info->document->encoding=xmlStrdup(parser->encoding); + svg_info->document->standalone=parser->standalone; +} + +static void SVGEndDocument(void *context) +{ + SVGInfo + *svg_info; + + /* + Called when the document end has been detected. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.endDocument()"); + svg_info=(SVGInfo *) context; + if (svg_info->offset != (char *) NULL) + svg_info->offset=DestroyString(svg_info->offset); + if (svg_info->stop_color != (char *) NULL) + svg_info->stop_color=DestroyString(svg_info->stop_color); + if (svg_info->scale != (double *) NULL) + svg_info->scale=(double *) RelinquishMagickMemory(svg_info->scale); + if (svg_info->text != (char *) NULL) + svg_info->text=DestroyString(svg_info->text); + if (svg_info->vertices != (char *) NULL) + svg_info->vertices=DestroyString(svg_info->vertices); + if (svg_info->url != (char *) NULL) + svg_info->url=DestroyString(svg_info->url); +#if defined(MAGICKCORE_XML_DELEGATE) + if (svg_info->document != (xmlDocPtr) NULL) + { + xmlFreeDoc(svg_info->document); + svg_info->document=(xmlDocPtr) NULL; + } +#endif +} + +static void SVGStartElement(void *context,const xmlChar *name, + const xmlChar **attributes) +{ +#define PushGraphicContext(id) \ +{ \ + if (*id == '\0') \ + (void) FormatLocaleFile(svg_info->file,"push graphic-context\n"); \ + else \ + (void) FormatLocaleFile(svg_info->file,"push graphic-context \"%s\"\n", \ + id); \ +} + + char + *color, + background[MagickPathExtent], + id[MaxTextExtent], + *next_token, + token[MaxTextExtent], + **tokens, + *units; + + const char + *keyword, + *p, + *value; + + ssize_t + i, + j; + + size_t + number_tokens; + + SVGInfo + *svg_info; + + /* + Called when an opening tag has been processed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.startElement(%s", + name); + svg_info=(SVGInfo *) context; + svg_info->n++; + svg_info->scale=(double *) ResizeQuantumMemory(svg_info->scale, + svg_info->n+1UL,sizeof(*svg_info->scale)); + if (svg_info->scale == (double *) NULL) + { + (void) ThrowMagickException(svg_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",name); + return; + } + svg_info->scale[svg_info->n]=svg_info->scale[svg_info->n-1]; + color=AcquireString("none"); + units=AcquireString("userSpaceOnUse"); + *id='\0'; + *token='\0'; + *background='\0'; + value=(const char *) NULL; + if ((LocaleCompare((char *) name,"image") == 0) || + (LocaleCompare((char *) name,"pattern") == 0) || + (LocaleCompare((char *) name,"rect") == 0) || + (LocaleCompare((char *) name,"text") == 0) || + (LocaleCompare((char *) name,"use") == 0)) + { + svg_info->bounds.x=0.0; + svg_info->bounds.y=0.0; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i+=2) + { + keyword=(const char *) attributes[i]; + value=(const char *) attributes[i+1]; + switch (*keyword) + { + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"cx") == 0) + { + svg_info->element.cx= + GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + if (LocaleCompare(keyword,"cy") == 0) + { + svg_info->element.cy= + GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"fx") == 0) + { + svg_info->element.major= + GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + if (LocaleCompare(keyword,"fy") == 0) + { + svg_info->element.minor= + GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + svg_info->bounds.height= + GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + break; + } + case 'I': + case 'i': + { + if (LocaleCompare(keyword,"id") == 0) + { + (void) CopyMagickString(id,value,MaxTextExtent); + break; + } + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"r") == 0) + { + svg_info->element.angle= + GetUserSpaceCoordinateValue(svg_info,0,value); + break; + } + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + svg_info->bounds.width= + GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + svg_info->bounds.x=GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + if (LocaleCompare(keyword,"x1") == 0) + { + svg_info->segment.x1=GetUserSpaceCoordinateValue(svg_info,1, + value); + break; + } + if (LocaleCompare(keyword,"x2") == 0) + { + svg_info->segment.x2=GetUserSpaceCoordinateValue(svg_info,1, + value); + break; + } + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + svg_info->bounds.y=GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + if (LocaleCompare(keyword,"y1") == 0) + { + svg_info->segment.y1=GetUserSpaceCoordinateValue(svg_info,-1, + value); + break; + } + if (LocaleCompare(keyword,"y2") == 0) + { + svg_info->segment.y2=GetUserSpaceCoordinateValue(svg_info,-1, + value); + break; + } + break; + } + default: + break; + } + } + if (strchr((char *) name,':') != (char *) NULL) + { + /* + Skip over namespace. + */ + for ( ; *name != ':'; name++) ; + name++; + } + switch (*name) + { + case 'C': + case 'c': + { + if (LocaleCompare((const char *) name,"circle") == 0) + { + PushGraphicContext(id); + break; + } + if (LocaleCompare((const char *) name,"clipPath") == 0) + { + (void) FormatLocaleFile(svg_info->file,"push clip-path \"%s\"\n",id); + break; + } + break; + } + case 'D': + case 'd': + { + if (LocaleCompare((const char *) name,"defs") == 0) + { + (void) FormatLocaleFile(svg_info->file,"push defs\n"); + break; + } + break; + } + case 'E': + case 'e': + { + if (LocaleCompare((const char *) name,"ellipse") == 0) + { + PushGraphicContext(id); + break; + } + break; + } + case 'F': + case 'f': + { + if (LocaleCompare((const char *) name,"foreignObject") == 0) + { + PushGraphicContext(id); + break; + } + break; + } + case 'G': + case 'g': + { + if (LocaleCompare((const char *) name,"g") == 0) + { + PushGraphicContext(id); + break; + } + break; + } + case 'I': + case 'i': + { + if (LocaleCompare((const char *) name,"image") == 0) + { + PushGraphicContext(id); + break; + } + break; + } + case 'L': + case 'l': + { + if (LocaleCompare((const char *) name,"line") == 0) + { + PushGraphicContext(id); + break; + } + if (LocaleCompare((const char *) name,"linearGradient") == 0) + { + (void) FormatLocaleFile(svg_info->file, + "push gradient \"%s\" linear %g,%g %g,%g\n",id, + svg_info->segment.x1,svg_info->segment.y1,svg_info->segment.x2, + svg_info->segment.y2); + break; + } + break; + } + case 'M': + case 'm': + { + if (LocaleCompare((const char *) name,"mask") == 0) + { + (void) FormatLocaleFile(svg_info->file,"push mask \"%s\"\n",id); + break; + } + break; + } + case 'P': + case 'p': + { + if (LocaleCompare((const char *) name,"path") == 0) + { + PushGraphicContext(id); + break; + } + if (LocaleCompare((const char *) name,"pattern") == 0) + { + (void) FormatLocaleFile(svg_info->file, + "push pattern \"%s\" %g,%g %g,%g\n",id, + svg_info->bounds.x,svg_info->bounds.y,svg_info->bounds.width, + svg_info->bounds.height); + break; + } + if (LocaleCompare((const char *) name,"polygon") == 0) + { + PushGraphicContext(id); + break; + } + if (LocaleCompare((const char *) name,"polyline") == 0) + { + PushGraphicContext(id); + break; + } + break; + } + case 'R': + case 'r': + { + if (LocaleCompare((const char *) name,"radialGradient") == 0) + { + (void) FormatLocaleFile(svg_info->file, + "push gradient \"%s\" radial %g,%g %g,%g %g\n", + id,svg_info->element.cx,svg_info->element.cy, + svg_info->element.major,svg_info->element.minor, + svg_info->element.angle); + break; + } + if (LocaleCompare((const char *) name,"rect") == 0) + { + PushGraphicContext(id); + break; + } + break; + } + case 'S': + case 's': + { + if (LocaleCompare((char *) name,"style") == 0) + break; + if (LocaleCompare((const char *) name,"svg") == 0) + { + svg_info->svgDepth++; + PushGraphicContext(id); + (void) FormatLocaleFile(svg_info->file,"compliance \"SVG\"\n"); + (void) FormatLocaleFile(svg_info->file,"fill \"black\"\n"); + (void) FormatLocaleFile(svg_info->file,"fill-opacity 1\n"); + (void) FormatLocaleFile(svg_info->file,"stroke \"none\"\n"); + (void) FormatLocaleFile(svg_info->file,"stroke-width 1\n"); + (void) FormatLocaleFile(svg_info->file,"stroke-opacity 1\n"); + (void) FormatLocaleFile(svg_info->file,"fill-rule nonzero\n"); + break; + } + if (LocaleCompare((const char *) name,"symbol") == 0) + { + (void) FormatLocaleFile(svg_info->file,"push symbol\n"); + break; + } + break; + } + case 'T': + case 't': + { + if (LocaleCompare((const char *) name,"text") == 0) + { + PushGraphicContext(id); + svg_info->text_offset.x=svg_info->bounds.x; + svg_info->text_offset.y=svg_info->bounds.y; + svg_info->bounds.x=0.0; + svg_info->bounds.y=0.0; + svg_info->bounds.width=0.0; + svg_info->bounds.height=0.0; + break; + } + if (LocaleCompare((const char *) name,"tspan") == 0) + { + if (*svg_info->text != '\0') + { + char + *text; + + text=EscapeString(svg_info->text,'\"'); + (void) FormatLocaleFile(svg_info->file,"text %g,%g \"%s\"\n", + svg_info->text_offset.x,svg_info->text_offset.y,text); + text=DestroyString(text); + *svg_info->text='\0'; + } + PushGraphicContext(id); + break; + } + break; + } + case 'U': + case 'u': + { + if (LocaleCompare((char *) name,"use") == 0) + { + PushGraphicContext(id); + break; + } + break; + } + default: + break; + } + if (attributes != (const xmlChar **) NULL) + for (i=0; (attributes[i] != (const xmlChar *) NULL); i+=2) + { + keyword=(const char *) attributes[i]; + value=(const char *) attributes[i+1]; + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " %s = %s",keyword,value); + switch (*keyword) + { + case 'A': + case 'a': + { + if (LocaleCompare(keyword,"angle") == 0) + { + (void) FormatLocaleFile(svg_info->file,"angle %g\n", + GetUserSpaceCoordinateValue(svg_info,0,value)); + break; + } + break; + } + case 'C': + case 'c': + { + if (LocaleCompare(keyword,"class") == 0) + { + const char + *p; + + p=value; + (void) GetNextToken(p,&p,MagickPathExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MagickPathExtent,token); + if (*token != '\0') + (void) FormatLocaleFile(svg_info->file,"class \"%s\"\n",value); + else + (void) FormatLocaleFile(svg_info->file,"class \"none\"\n"); + break; + } + if (LocaleCompare(keyword,"clip-path") == 0) + { + (void) FormatLocaleFile(svg_info->file,"clip-path \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"clip-rule") == 0) + { + (void) FormatLocaleFile(svg_info->file,"clip-rule \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"clipPathUnits") == 0) + { + (void) CloneString(&units,value); + (void) FormatLocaleFile(svg_info->file,"clip-units \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"color") == 0) + { + (void) CloneString(&color,value); + break; + } + if (LocaleCompare(keyword,"cx") == 0) + { + svg_info->element.cx= + GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + if (LocaleCompare(keyword,"cy") == 0) + { + svg_info->element.cy= + GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + break; + } + case 'D': + case 'd': + { + if (LocaleCompare(keyword,"d") == 0) + { + (void) CloneString(&svg_info->vertices,value); + break; + } + if (LocaleCompare(keyword,"dx") == 0) + { + double + dx; + + dx=GetUserSpaceCoordinateValue(svg_info,1,value); + svg_info->bounds.x+=dx; + svg_info->text_offset.x+=dx; + if (LocaleCompare((char *) name,"text") == 0) + (void) FormatLocaleFile(svg_info->file,"translate %g,0.0\n",dx); + break; + } + if (LocaleCompare(keyword,"dy") == 0) + { + double + dy; + + dy=GetUserSpaceCoordinateValue(svg_info,-1,value); + svg_info->bounds.y+=dy; + svg_info->text_offset.y+=dy; + if (LocaleCompare((char *) name,"text") == 0) + (void) FormatLocaleFile(svg_info->file,"translate 0.0,%g\n",dy); + break; + } + break; + } + case 'F': + case 'f': + { + if (LocaleCompare(keyword,"fill") == 0) + { + if (LocaleCompare(value,"currentColor") == 0) + { + (void) FormatLocaleFile(svg_info->file,"fill \"%s\"\n",color); + break; + } + (void) FormatLocaleFile(svg_info->file,"fill \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"fillcolor") == 0) + { + (void) FormatLocaleFile(svg_info->file,"fill \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"fill-rule") == 0) + { + (void) FormatLocaleFile(svg_info->file,"fill-rule \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"fill-opacity") == 0) + { + (void) FormatLocaleFile(svg_info->file,"fill-opacity \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"font-family") == 0) + { + (void) FormatLocaleFile(svg_info->file,"font-family \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"font-stretch") == 0) + { + (void) FormatLocaleFile(svg_info->file,"font-stretch \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"font-style") == 0) + { + (void) FormatLocaleFile(svg_info->file,"font-style \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"font-size") == 0) + { + if (LocaleCompare(value,"xx-small") == 0) + svg_info->pointsize=6.144; + else if (LocaleCompare(value,"x-small") == 0) + svg_info->pointsize=7.68; + else if (LocaleCompare(value,"small") == 0) + svg_info->pointsize=9.6; + else if (LocaleCompare(value,"medium") == 0) + svg_info->pointsize=12.0; + else if (LocaleCompare(value,"large") == 0) + svg_info->pointsize=14.4; + else if (LocaleCompare(value,"x-large") == 0) + svg_info->pointsize=17.28; + else if (LocaleCompare(value,"xx-large") == 0) + svg_info->pointsize=20.736; + else + svg_info->pointsize=GetUserSpaceCoordinateValue(svg_info,0, + value); + (void) FormatLocaleFile(svg_info->file,"font-size %g\n", + svg_info->pointsize); + break; + } + if (LocaleCompare(keyword,"font-weight") == 0) + { + (void) FormatLocaleFile(svg_info->file,"font-weight \"%s\"\n", + value); + break; + } + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(keyword,"gradientTransform") == 0) + { + AffineMatrix + affine, + current, + transform; + + GetAffineMatrix(&transform); + (void) LogMagickEvent(CoderEvent,GetMagickModule()," "); + tokens=SVGKeyValuePairs(context,'(',')',value,&number_tokens); + if (tokens == (char **) NULL) + break; + for (j=0; j < (ssize_t) (number_tokens-1); j+=2) + { + keyword=(char *) tokens[j]; + if (keyword == (char *) NULL) + continue; + value=(char *) tokens[j+1]; + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " %s: %s",keyword,value); + current=transform; + GetAffineMatrix(&affine); + switch (*keyword) + { + case 'M': + case 'm': + { + if (LocaleCompare(keyword,"matrix") == 0) + { + p=(const char *) value; + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.sx=StringToDouble(value,(char **) NULL); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.rx=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.ry=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.sy=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.tx=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.ty=StringToDouble(token,&next_token); + break; + } + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"rotate") == 0) + { + double + angle; + + angle=GetUserSpaceCoordinateValue(svg_info,0,value); + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + break; + } + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"scale") == 0) + { + for (p=(const char *) value; *p != '\0'; p++) + if ((isspace((int) ((unsigned char) *p)) != 0) || + (*p == ',')) + break; + affine.sx=GetUserSpaceCoordinateValue(svg_info,1,value); + affine.sy=affine.sx; + if (*p != '\0') + affine.sy= + GetUserSpaceCoordinateValue(svg_info,-1,p+1); + svg_info->scale[svg_info->n]=ExpandAffine(&affine); + break; + } + if (LocaleCompare(keyword,"skewX") == 0) + { + affine.sx=svg_info->affine.sx; + affine.ry=tan(DegreesToRadians(fmod( + GetUserSpaceCoordinateValue(svg_info,1,value), + 360.0))); + affine.sy=svg_info->affine.sy; + break; + } + if (LocaleCompare(keyword,"skewY") == 0) + { + affine.sx=svg_info->affine.sx; + affine.rx=tan(DegreesToRadians(fmod( + GetUserSpaceCoordinateValue(svg_info,-1,value), + 360.0))); + affine.sy=svg_info->affine.sy; + break; + } + break; + } + case 'T': + case 't': + { + if (LocaleCompare(keyword,"translate") == 0) + { + for (p=(const char *) value; *p != '\0'; p++) + if ((isspace((int) ((unsigned char) *p)) != 0) || + (*p == ',')) + break; + affine.tx=GetUserSpaceCoordinateValue(svg_info,1,value); + affine.ty=0.0; + if (*p != '\0') + affine.ty=GetUserSpaceCoordinateValue(svg_info,-1, + p+1); + break; + } + break; + } + default: + break; + } + transform.sx=affine.sx*current.sx+affine.ry*current.rx; + transform.rx=affine.rx*current.sx+affine.sy*current.rx; + transform.ry=affine.sx*current.ry+affine.ry*current.sy; + transform.sy=affine.rx*current.ry+affine.sy*current.sy; + transform.tx=affine.tx*current.sx+affine.ty*current.ry+ + current.tx; + transform.ty=affine.tx*current.rx+affine.ty*current.sy+ + current.ty; + } + (void) FormatLocaleFile(svg_info->file, + "affine %g %g %g %g %g %g\n",transform.sx, + transform.rx,transform.ry,transform.sy,transform.tx, + transform.ty); + for (j=0; tokens[j] != (char *) NULL; j++) + tokens[j]=DestroyString(tokens[j]); + tokens=(char **) RelinquishMagickMemory(tokens); + break; + } + if (LocaleCompare(keyword,"gradientUnits") == 0) + { + (void) CloneString(&units,value); + (void) FormatLocaleFile(svg_info->file,"gradient-units \"%s\"\n", + value); + break; + } + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(keyword,"height") == 0) + { + svg_info->bounds.height= + GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + if (LocaleCompare(keyword,"href") == 0) + { + (void) CloneString(&svg_info->url,value); + break; + } + break; + } + case 'K': + case 'k': + { + if (LocaleCompare(keyword,"kernel") == 0) + { + (void) FormatLocaleFile(svg_info->file,"kernel \"%s\"\n",value); + break; + } + break; + } + case 'L': + case 'l': + { + if (LocaleCompare(keyword,"letter-spacing") == 0) + { + (void) FormatLocaleFile(svg_info->file,"letter-spacing \"%s\"\n", + value); + break; + } + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(keyword,"major") == 0) + { + svg_info->element.major= + GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + if (LocaleCompare(keyword,"mask") == 0) + { + (void) FormatLocaleFile(svg_info->file,"mask \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"minor") == 0) + { + svg_info->element.minor= + GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(keyword,"offset") == 0) + { + (void) CloneString(&svg_info->offset,value); + break; + } + if (LocaleCompare(keyword,"opacity") == 0) + { + (void) FormatLocaleFile(svg_info->file,"opacity \"%s\"\n",value); + break; + } + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(keyword,"path") == 0) + { + (void) CloneString(&svg_info->url,value); + break; + } + if (LocaleCompare(keyword,"points") == 0) + { + (void) CloneString(&svg_info->vertices,value); + break; + } + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"r") == 0) + { + svg_info->element.major= + GetUserSpaceCoordinateValue(svg_info,1,value); + svg_info->element.minor= + GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + if (LocaleCompare(keyword,"rotate") == 0) + { + double + angle; + + angle=GetUserSpaceCoordinateValue(svg_info,0,value); + (void) FormatLocaleFile(svg_info->file,"translate %g,%g\n", + svg_info->bounds.x,svg_info->bounds.y); + svg_info->bounds.x=0; + svg_info->bounds.y=0; + (void) FormatLocaleFile(svg_info->file,"rotate %g\n",angle); + break; + } + if (LocaleCompare(keyword,"rx") == 0) + { + if (LocaleCompare((const char *) name,"ellipse") == 0) + svg_info->element.major= + GetUserSpaceCoordinateValue(svg_info,1,value); + else + svg_info->radius.x= + GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + if (LocaleCompare(keyword,"ry") == 0) + { + if (LocaleCompare((const char *) name,"ellipse") == 0) + svg_info->element.minor= + GetUserSpaceCoordinateValue(svg_info,-1,value); + else + svg_info->radius.y= + GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"stop-color") == 0) + { + (void) CloneString(&svg_info->stop_color,value); + break; + } + if (LocaleCompare(keyword,"stroke") == 0) + { + if (LocaleCompare(value,"currentColor") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke \"%s\"\n", + color); + break; + } + (void) FormatLocaleFile(svg_info->file,"stroke \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"stroke-antialiasing") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-antialias %d\n", + LocaleCompare(value,"true") == 0); + break; + } + if (LocaleCompare(keyword,"stroke-dasharray") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-dasharray %s\n", + value); + break; + } + if (LocaleCompare(keyword,"stroke-dashoffset") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-dashoffset %g\n", + GetUserSpaceCoordinateValue(svg_info,1,value)); + break; + } + if (LocaleCompare(keyword,"stroke-linecap") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-linecap \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"stroke-linejoin") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-linejoin \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"stroke-miterlimit") == 0) + { + (void) FormatLocaleFile(svg_info->file, + "stroke-miterlimit \"%s\"\n",value); + break; + } + if (LocaleCompare(keyword,"stroke-opacity") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-opacity \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"stroke-width") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stroke-width %g\n", + GetUserSpaceCoordinateValue(svg_info,1,value)); + break; + } + if (LocaleCompare(keyword,"style") == 0) + { + SVGProcessStyleElement(context,name,value); + break; + } + break; + } + case 'T': + case 't': + { + if (LocaleCompare(keyword,"text-align") == 0) + { + (void) FormatLocaleFile(svg_info->file,"text-align \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"text-anchor") == 0) + { + (void) FormatLocaleFile(svg_info->file,"text-anchor \"%s\"\n", + value); + break; + } + if (LocaleCompare(keyword,"text-decoration") == 0) + { + if (LocaleCompare(value,"underline") == 0) + (void) FormatLocaleFile(svg_info->file,"decorate underline\n"); + if (LocaleCompare(value,"line-through") == 0) + (void) FormatLocaleFile(svg_info->file, + "decorate line-through\n"); + if (LocaleCompare(value,"overline") == 0) + (void) FormatLocaleFile(svg_info->file,"decorate overline\n"); + break; + } + if (LocaleCompare(keyword,"text-antialiasing") == 0) + { + (void) FormatLocaleFile(svg_info->file,"text-antialias %d\n", + LocaleCompare(value,"true") == 0); + break; + } + if (LocaleCompare(keyword,"transform") == 0) + { + AffineMatrix + affine, + current, + transform; + + GetAffineMatrix(&transform); + (void) LogMagickEvent(CoderEvent,GetMagickModule()," "); + tokens=SVGKeyValuePairs(context,'(',')',value,&number_tokens); + if (tokens == (char **) NULL) + break; + for (j=0; j < (ssize_t) (number_tokens-1); j+=2) + { + keyword=(char *) tokens[j]; + value=(char *) tokens[j+1]; + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " %s: %s",keyword,value); + current=transform; + GetAffineMatrix(&affine); + switch (*keyword) + { + case 'M': + case 'm': + { + if (LocaleCompare(keyword,"matrix") == 0) + { + p=(const char *) value; + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.sx=StringToDouble(value,(char **) NULL); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.rx=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.ry=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.sy=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.tx=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + affine.ty=StringToDouble(token,&next_token); + break; + } + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(keyword,"rotate") == 0) + { + double + angle, + x, + y; + + p=(const char *) value; + (void) GetNextToken(p,&p,MagickPathExtent,token); + angle=StringToDouble(value,(char **) NULL); + affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + (void) GetNextToken(p,&p,MagickPathExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MagickPathExtent,token); + x=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MagickPathExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MagickPathExtent,token); + y=StringToDouble(token,&next_token); + affine.tx=(-1.0*(svg_info->bounds.x+x* + cos(DegreesToRadians(fmod(angle,360.0)))-y* + sin(DegreesToRadians(fmod(angle,360.0)))))+x; + affine.ty=(-1.0*(svg_info->bounds.y+x* + sin(DegreesToRadians(fmod(angle,360.0)))+y* + cos(DegreesToRadians(fmod(angle,360.0)))))+y; + break; + } + break; + } + case 'S': + case 's': + { + if (LocaleCompare(keyword,"scale") == 0) + { + for (p=(const char *) value; *p != '\0'; p++) + if ((isspace((int) ((unsigned char) *p)) != 0) || + (*p == ',')) + break; + affine.sx=GetUserSpaceCoordinateValue(svg_info,1,value); + affine.sy=affine.sx; + if (*p != '\0') + affine.sy=GetUserSpaceCoordinateValue(svg_info,-1, + p+1); + svg_info->scale[svg_info->n]=ExpandAffine(&affine); + break; + } + if (LocaleCompare(keyword,"skewX") == 0) + { + affine.sx=svg_info->affine.sx; + affine.ry=tan(DegreesToRadians(fmod( + GetUserSpaceCoordinateValue(svg_info,1,value), + 360.0))); + affine.sy=svg_info->affine.sy; + break; + } + if (LocaleCompare(keyword,"skewY") == 0) + { + affine.sx=svg_info->affine.sx; + affine.rx=tan(DegreesToRadians(fmod( + GetUserSpaceCoordinateValue(svg_info,-1,value), + 360.0))); + affine.sy=svg_info->affine.sy; + break; + } + break; + } + case 'T': + case 't': + { + if (LocaleCompare(keyword,"translate") == 0) + { + for (p=(const char *) value; *p != '\0'; p++) + if ((isspace((int) ((unsigned char) *p)) != 0) || + (*p == ',')) + break; + affine.tx=GetUserSpaceCoordinateValue(svg_info,1,value); + affine.ty=affine.tx; + if (*p != '\0') + affine.ty=GetUserSpaceCoordinateValue(svg_info,-1, + p+1); + break; + } + break; + } + default: + break; + } + transform.sx=affine.sx*current.sx+affine.ry*current.rx; + transform.rx=affine.rx*current.sx+affine.sy*current.rx; + transform.ry=affine.sx*current.ry+affine.ry*current.sy; + transform.sy=affine.rx*current.ry+affine.sy*current.sy; + transform.tx=affine.tx*current.sx+affine.ty*current.ry+ + current.tx; + transform.ty=affine.tx*current.rx+affine.ty*current.sy+ + current.ty; + } + (void) FormatLocaleFile(svg_info->file, + "affine %g %g %g %g %g %g\n",transform.sx,transform.rx, + transform.ry,transform.sy,transform.tx,transform.ty); + for (j=0; tokens[j] != (char *) NULL; j++) + tokens[j]=DestroyString(tokens[j]); + tokens=(char **) RelinquishMagickMemory(tokens); + break; + } + break; + } + case 'V': + case 'v': + { + if (LocaleCompare(keyword,"verts") == 0) + { + (void) CloneString(&svg_info->vertices,value); + break; + } + if (LocaleCompare(keyword,"viewBox") == 0) + { + p=(const char *) value; + (void) GetNextToken(p,&p,MaxTextExtent,token); + svg_info->view_box.x=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + svg_info->view_box.y=StringToDouble(token,&next_token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + svg_info->view_box.width=StringToDouble(token, + (char **) NULL); + if (svg_info->bounds.width < MagickEpsilon) + svg_info->bounds.width=svg_info->view_box.width; + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + svg_info->view_box.height=StringToDouble(token, + (char **) NULL); + if (svg_info->bounds.height == 0) + svg_info->bounds.height=svg_info->view_box.height; + break; + } + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(keyword,"width") == 0) + { + svg_info->bounds.width= + GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + break; + } + case 'X': + case 'x': + { + if (LocaleCompare(keyword,"x") == 0) + { + svg_info->bounds.x=GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + if (LocaleCompare(keyword,"xlink:href") == 0) + { + (void) CloneString(&svg_info->url,value); + break; + } + if (LocaleCompare(keyword,"x1") == 0) + { + svg_info->segment.x1= + GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + if (LocaleCompare(keyword,"x2") == 0) + { + svg_info->segment.x2= + GetUserSpaceCoordinateValue(svg_info,1,value); + break; + } + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(keyword,"y") == 0) + { + svg_info->bounds.y=GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + if (LocaleCompare(keyword,"y1") == 0) + { + svg_info->segment.y1= + GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + if (LocaleCompare(keyword,"y2") == 0) + { + svg_info->segment.y2= + GetUserSpaceCoordinateValue(svg_info,-1,value); + break; + } + break; + } + default: + break; + } + } + if (LocaleCompare((const char *) name,"svg") == 0) + { + if (svg_info->document->encoding != (const xmlChar *) NULL) + (void) FormatLocaleFile(svg_info->file,"encoding \"%s\"\n", + (const char *) svg_info->document->encoding); + if (attributes != (const xmlChar **) NULL) + { + double + sx, + sy, + tx, + ty; + + if ((svg_info->view_box.width < MagickEpsilon) || + (svg_info->view_box.height < MagickEpsilon)) + svg_info->view_box=svg_info->bounds; + svg_info->width=0; + if (svg_info->bounds.width >= MagickEpsilon) + svg_info->width=(size_t) floor(svg_info->bounds.width+0.5); + svg_info->height=0; + if (svg_info->bounds.height >= MagickEpsilon) + svg_info->height=(size_t) floor(svg_info->bounds.height+0.5); + (void) FormatLocaleFile(svg_info->file,"viewbox 0 0 %.20g %.20g\n", + (double) svg_info->width,(double) svg_info->height); + sx=PerceptibleReciprocal(svg_info->view_box.width)*svg_info->width; + sy=PerceptibleReciprocal(svg_info->view_box.height)*svg_info->height; + tx=svg_info->view_box.x != 0.0 ? (double) -sx*svg_info->view_box.x : + 0.0; + ty=svg_info->view_box.y != 0.0 ? (double) -sy*svg_info->view_box.y : + 0.0; + (void) FormatLocaleFile(svg_info->file,"affine %g 0 0 %g %g %g\n", + sx,sy,tx,ty); + if ((svg_info->svgDepth == 1) && (*background != '\0')) + { + PushGraphicContext(id); + (void) FormatLocaleFile(svg_info->file,"fill %s\n",background); + (void) FormatLocaleFile(svg_info->file, + "rectangle 0,0 %g,%g\n",svg_info->view_box.width, + svg_info->view_box.height); + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + } + } + } + (void) LogMagickEvent(CoderEvent,GetMagickModule()," )"); + if (units != (char *) NULL) + units=DestroyString(units); + if (color != (char *) NULL) + color=DestroyString(color); +} + +static void SVGEndElement(void *context,const xmlChar *name) +{ + SVGInfo + *svg_info; + + /* + Called when the end of an element has been detected. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.endElement(%s)",name); + svg_info=(SVGInfo *) context; + if (strchr((char *) name,':') != (char *) NULL) + { + /* + Skip over namespace. + */ + for ( ; *name != ':'; name++) ; + name++; + } + switch (*name) + { + case 'C': + case 'c': + { + if (LocaleCompare((const char *) name,"circle") == 0) + { + (void) FormatLocaleFile(svg_info->file,"circle %g,%g %g,%g\n", + svg_info->element.cx,svg_info->element.cy,svg_info->element.cx, + svg_info->element.cy+svg_info->element.minor); + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + if (LocaleCompare((const char *) name,"clipPath") == 0) + { + (void) FormatLocaleFile(svg_info->file,"pop clip-path\n"); + break; + } + break; + } + case 'D': + case 'd': + { + if (LocaleCompare((const char *) name,"defs") == 0) + { + (void) FormatLocaleFile(svg_info->file,"pop defs\n"); + break; + } + if (LocaleCompare((const char *) name,"desc") == 0) + { + char + *p; + + if (*svg_info->text == '\0') + break; + (void) fputc('#',svg_info->file); + for (p=svg_info->text; *p != '\0'; p++) + { + (void) fputc(*p,svg_info->file); + if (*p == '\n') + (void) fputc('#',svg_info->file); + } + (void) fputc('\n',svg_info->file); + *svg_info->text='\0'; + break; + } + break; + } + case 'E': + case 'e': + { + if (LocaleCompare((const char *) name,"ellipse") == 0) + { + double + angle; + + angle=svg_info->element.angle; + (void) FormatLocaleFile(svg_info->file,"ellipse %g,%g %g,%g 0,360\n", + svg_info->element.cx,svg_info->element.cy, + angle == 0.0 ? svg_info->element.major : svg_info->element.minor, + angle == 0.0 ? svg_info->element.minor : svg_info->element.major); + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + break; + } + case 'F': + case 'f': + { + if (LocaleCompare((const char *) name,"foreignObject") == 0) + { + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + break; + } + case 'G': + case 'g': + { + if (LocaleCompare((const char *) name,"g") == 0) + { + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + break; + } + case 'I': + case 'i': + { + if (LocaleCompare((const char *) name,"image") == 0) + { + (void) FormatLocaleFile(svg_info->file, + "image Over %g,%g %g,%g \"%s\"\n",svg_info->bounds.x, + svg_info->bounds.y,svg_info->bounds.width,svg_info->bounds.height, + svg_info->url); + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + break; + } + case 'L': + case 'l': + { + if (LocaleCompare((const char *) name,"line") == 0) + { + (void) FormatLocaleFile(svg_info->file,"line %g,%g %g,%g\n", + svg_info->segment.x1,svg_info->segment.y1,svg_info->segment.x2, + svg_info->segment.y2); + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + if (LocaleCompare((const char *) name,"linearGradient") == 0) + { + (void) FormatLocaleFile(svg_info->file,"pop gradient\n"); + break; + } + break; + } + case 'M': + case 'm': + { + if (LocaleCompare((const char *) name,"mask") == 0) + { + (void) FormatLocaleFile(svg_info->file,"pop mask\n"); + break; + } + break; + } + case 'P': + case 'p': + { + if (LocaleCompare((const char *) name,"pattern") == 0) + { + (void) FormatLocaleFile(svg_info->file,"pop pattern\n"); + break; + } + if (LocaleCompare((const char *) name,"path") == 0) + { + (void) FormatLocaleFile(svg_info->file,"path \"%s\"\n", + svg_info->vertices); + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + if (LocaleCompare((const char *) name,"polygon") == 0) + { + (void) FormatLocaleFile(svg_info->file,"polygon %s\n", + svg_info->vertices); + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + if (LocaleCompare((const char *) name,"polyline") == 0) + { + (void) FormatLocaleFile(svg_info->file,"polyline %s\n", + svg_info->vertices); + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + break; + } + case 'R': + case 'r': + { + if (LocaleCompare((const char *) name,"radialGradient") == 0) + { + (void) FormatLocaleFile(svg_info->file,"pop gradient\n"); + break; + } + if (LocaleCompare((const char *) name,"rect") == 0) + { + if ((svg_info->radius.x == 0.0) && (svg_info->radius.y == 0.0)) + { + if ((fabs(svg_info->bounds.width-1.0) < MagickEpsilon) && + (fabs(svg_info->bounds.height-1.0) < MagickEpsilon)) + (void) FormatLocaleFile(svg_info->file,"point %g,%g\n", + svg_info->bounds.x,svg_info->bounds.y); + else + (void) FormatLocaleFile(svg_info->file, + "rectangle %g,%g %g,%g\n",svg_info->bounds.x, + svg_info->bounds.y,svg_info->bounds.x+svg_info->bounds.width, + svg_info->bounds.y+svg_info->bounds.height); + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + if (svg_info->radius.x == 0.0) + svg_info->radius.x=svg_info->radius.y; + if (svg_info->radius.y == 0.0) + svg_info->radius.y=svg_info->radius.x; + (void) FormatLocaleFile(svg_info->file, + "roundRectangle %g,%g %g,%g %g,%g\n", + svg_info->bounds.x,svg_info->bounds.y,svg_info->bounds.x+ + svg_info->bounds.width,svg_info->bounds.y+svg_info->bounds.height, + svg_info->radius.x,svg_info->radius.y); + svg_info->radius.x=0.0; + svg_info->radius.y=0.0; + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + break; + } + case 'S': + case 's': + { + if (LocaleCompare((const char *) name,"stop") == 0) + { + (void) FormatLocaleFile(svg_info->file,"stop-color \"%s\" %s\n", + svg_info->stop_color,svg_info->offset == (char *) NULL ? "100%" : + svg_info->offset); + break; + } + if (LocaleCompare((char *) name,"style") == 0) + { + char + *keyword, + **tokens, + *value; + + ssize_t + j; + + size_t + number_tokens; + + /* + Find style definitions in svg_info->text. + */ + tokens=SVGKeyValuePairs(context,'{','}',svg_info->text, + &number_tokens); + if (tokens == (char **) NULL) + break; + for (j=0; j < (ssize_t) (number_tokens-1); j+=2) + { + keyword=(char *) tokens[j]; + value=(char *) tokens[j+1]; + (void) FormatLocaleFile(svg_info->file,"push class \"%s\"\n", + *keyword == '.' ? keyword+1 : keyword); + SVGProcessStyleElement(context,name,value); + (void) FormatLocaleFile(svg_info->file,"pop class\n"); + } + for (j=0; tokens[j] != (char *) NULL; j++) + tokens[j]=DestroyString(tokens[j]); + tokens=(char **) RelinquishMagickMemory(tokens); + break; + } + if (LocaleCompare((const char *) name,"svg") == 0) + { + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + svg_info->svgDepth--; + break; + } + if (LocaleCompare((const char *) name,"symbol") == 0) + { + (void) FormatLocaleFile(svg_info->file,"pop symbol\n"); + break; + } + break; + } + case 'T': + case 't': + { + if (LocaleCompare((const char *) name,"text") == 0) + { + if (*svg_info->text != '\0') + { + char + *text; + + SVGStripString(MagickTrue,svg_info->text); + text=EscapeString(svg_info->text,'\"'); + (void) FormatLocaleFile(svg_info->file,"text %g,%g \"%s\"\n", + svg_info->text_offset.x,svg_info->text_offset.y,text); + text=DestroyString(text); + *svg_info->text='\0'; + } + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + if (LocaleCompare((const char *) name,"tspan") == 0) + { + if (*svg_info->text != '\0') + { + char + *text; + + text=EscapeString(svg_info->text,'\"'); + (void) FormatLocaleFile(svg_info->file,"text %g,%g \"%s\"\n", + svg_info->bounds.x,svg_info->bounds.y,text); + text=DestroyString(text); + *svg_info->text='\0'; + } + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + if (LocaleCompare((const char *) name,"title") == 0) + { + if (*svg_info->text == '\0') + break; + (void) CloneString(&svg_info->title,svg_info->text); + *svg_info->text='\0'; + break; + } + break; + } + case 'U': + case 'u': + { + if (LocaleCompare((char *) name,"use") == 0) + { + if ((svg_info->bounds.x != 0.0) || (svg_info->bounds.y != 0.0)) + (void) FormatLocaleFile(svg_info->file,"translate %g,%g\n", + svg_info->bounds.x,svg_info->bounds.y); + (void) FormatLocaleFile(svg_info->file,"use \"url(%s)\"\n", + svg_info->url); + (void) FormatLocaleFile(svg_info->file,"pop graphic-context\n"); + break; + } + break; + } + default: + break; + } + *svg_info->text='\0'; + (void) memset(&svg_info->element,0,sizeof(svg_info->element)); + (void) memset(&svg_info->segment,0,sizeof(svg_info->segment)); + svg_info->n--; +} + +static void SVGCharacters(void *context,const xmlChar *c,int length) +{ + char + *text; + + char + *p; + + ssize_t + i; + + SVGInfo + *svg_info; + + /* + Receiving some characters from the parser. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.characters(%s,%.20g)",c,(double) length); + svg_info=(SVGInfo *) context; + text=(char *) AcquireQuantumMemory(length+1,sizeof(*text)); + if (text == (char *) NULL) + return; + p=text; + for (i=0; i < (ssize_t) length; i++) + *p++=c[i]; + *p='\0'; + SVGStripString(MagickFalse,text); + if (svg_info->text == (char *) NULL) + svg_info->text=text; + else + { + (void) ConcatenateString(&svg_info->text,text); + text=DestroyString(text); + } +} + +static void SVGReference(void *context,const xmlChar *name) +{ + SVGInfo + *svg_info; + + xmlParserCtxtPtr + parser; + + /* + Called when an entity reference is detected. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.reference(%s)", + name); + svg_info=(SVGInfo *) context; + parser=svg_info->parser; + if (parser == (xmlParserCtxtPtr) NULL) + return; + if (parser->node == (xmlNodePtr) NULL) + return; + if (*name == '#') + (void) xmlAddChild(parser->node,xmlNewCharRef(svg_info->document,name)); + else + (void) xmlAddChild(parser->node,xmlNewReference(svg_info->document,name)); +} + +static void SVGIgnorableWhitespace(void *context,const xmlChar *c,int length) +{ + SVGInfo + *svg_info; + + /* + Receiving some ignorable whitespaces from the parser. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.ignorableWhitespace(%.30s, %d)",c,length); + svg_info=(SVGInfo *) context; + (void) svg_info; +} + +static void SVGProcessingInstructions(void *context,const xmlChar *target, + const xmlChar *data) +{ + SVGInfo + *svg_info; + + /* + A processing instruction has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.processingInstruction(%s, %s)",target,data); + svg_info=(SVGInfo *) context; + (void) svg_info; +} + +static void SVGComment(void *context,const xmlChar *value) +{ + SVGInfo + *svg_info; + + /* + A comment has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.comment(%s)", + value); + svg_info=(SVGInfo *) context; + if (svg_info->comment != (char *) NULL) + (void) ConcatenateString(&svg_info->comment,"\n"); + (void) ConcatenateString(&svg_info->comment,(const char *) value); +} + +static void SVGWarning(void *,const char *,...) + magick_attribute((__format__ (__printf__,2,3))); + +static void SVGWarning(void *context,const char *format,...) +{ + char + *message, + reason[MaxTextExtent]; + + SVGInfo + *svg_info; + + va_list + operands; + + /** + Display and format a warning messages, gives file, line, position and + extra parameters. + */ + va_start(operands,format); + svg_info=(SVGInfo *) context; + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.warning: "); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),format,operands); +#if !defined(MAGICKCORE_HAVE_VSNPRINTF) + (void) vsprintf(reason,format,operands); +#else + (void) vsnprintf(reason,MaxTextExtent,format,operands); +#endif + message=GetExceptionMessage(errno); + (void) ThrowMagickException(svg_info->exception,GetMagickModule(), + DelegateWarning,reason,"`%s`",message); + message=DestroyString(message); + va_end(operands); +} + +static void SVGError(void *,const char *,...) + magick_attribute((__format__ (__printf__,2,3))); + +static void SVGError(void *context,const char *format,...) +{ + char + *message, + reason[MaxTextExtent]; + + SVGInfo + *svg_info; + + va_list + operands; + + /* + Display and format a error formats, gives file, line, position and + extra parameters. + */ + va_start(operands,format); + svg_info=(SVGInfo *) context; + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.error: "); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),format,operands); +#if !defined(MAGICKCORE_HAVE_VSNPRINTF) + (void) vsprintf(reason,format,operands); +#else + (void) vsnprintf(reason,MaxTextExtent,format,operands); +#endif + message=GetExceptionMessage(errno); + (void) ThrowMagickException(svg_info->exception,GetMagickModule(),CoderError, + reason,"`%s`",message); + message=DestroyString(message); + va_end(operands); + xmlStopParser(svg_info->parser); +} + +static void SVGCDataBlock(void *context,const xmlChar *value,int length) +{ + SVGInfo + *svg_info; + + xmlNodePtr + child; + + xmlParserCtxtPtr + parser; + + /* + Called when a pcdata block has been parsed. + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule()," SAX.pcdata(%s, %d)", + value,length); + svg_info=(SVGInfo *) context; + parser=svg_info->parser; + child=xmlGetLastChild(parser->node); + if ((child != (xmlNodePtr) NULL) && (child->type == XML_CDATA_SECTION_NODE)) + { + xmlTextConcat(child,value,length); + return; + } + child=xmlNewCDataBlock(parser->myDoc,value,length); + if (xmlAddChild(parser->node,child) == (xmlNodePtr) NULL) + xmlFreeNode(child); +} + +static void SVGExternalSubset(void *context,const xmlChar *name, + const xmlChar *external_id,const xmlChar *system_id) +{ + SVGInfo + *svg_info; + + xmlParserCtxt + parser_context; + + xmlParserCtxtPtr + parser; + + xmlParserInputPtr + input; + + /* + Does this document has an external subset? + */ + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " SAX.externalSubset(%s, %s, %s)",name, + (external_id != (const xmlChar *) NULL ? (const char *) external_id : "none"), + (system_id != (const xmlChar *) NULL ? (const char *) system_id : "none")); + svg_info=(SVGInfo *) context; + parser=svg_info->parser; + if (((external_id == NULL) && (system_id == NULL)) || + ((parser->validate == 0) || (parser->wellFormed == 0) || + (svg_info->document == 0))) + return; + input=SVGResolveEntity(context,external_id,system_id); + if (input == NULL) + return; + (void) xmlNewDtd(svg_info->document,name,external_id,system_id); + parser_context=(*parser); + parser->inputTab=(xmlParserInputPtr *) xmlMalloc(5*sizeof(*parser->inputTab)); + if (parser->inputTab == (xmlParserInputPtr *) NULL) + { + parser->errNo=XML_ERR_NO_MEMORY; + parser->input=parser_context.input; + parser->inputNr=parser_context.inputNr; + parser->inputMax=parser_context.inputMax; + parser->inputTab=parser_context.inputTab; + return; + } + parser->inputNr=0; + parser->inputMax=5; + parser->input=NULL; + xmlPushInput(parser,input); + (void) xmlSwitchEncoding(parser,xmlDetectCharEncoding(parser->input->cur,4)); + if (input->filename == (char *) NULL) + input->filename=(char *) xmlStrdup(system_id); + input->line=1; + input->col=1; + input->base=parser->input->cur; + input->cur=parser->input->cur; + input->free=NULL; + xmlParseExternalSubset(parser,external_id,system_id); + while (parser->inputNr > 1) + (void) xmlPopInput(parser); + xmlFreeInputStream(parser->input); + xmlFree(parser->inputTab); + parser->input=parser_context.input; + parser->inputNr=parser_context.inputNr; + parser->inputMax=parser_context.inputMax; + parser->inputTab=parser_context.inputTab; +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +static Image *RenderMSVGImage(const ImageInfo *image_info,Image *image, + ExceptionInfo *exception) +{ + char + filename[MaxTextExtent]; + + const char + *option; + + FILE + *file; + + Image + *next; + + int + status, + unique_file; + + ssize_t + n; + + SVGInfo + *svg_info; + + unsigned char + message[MaxTextExtent]; + + xmlSAXHandler + sax_modules; + + xmlSAXHandlerPtr + sax_handler; + + /* + Open draw file. + */ + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(filename); + if (unique_file != -1) + file=fdopen(unique_file,"w"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + { + (void) CopyMagickString(image->filename,filename,MaxTextExtent); + ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile", + image->filename); + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Parse SVG file. + */ + svg_info=AcquireSVGInfo(); + if (svg_info == (SVGInfo *) NULL) + { + (void) fclose(file); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + svg_info->file=file; + svg_info->exception=exception; + svg_info->image=image; + svg_info->image_info=image_info; + svg_info->bounds.width=image->columns; + svg_info->bounds.height=image->rows; + svg_info->svgDepth=0; + if (image_info->size != (char *) NULL) + (void) CloneString(&svg_info->size,image_info->size); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"begin SAX"); + xmlInitParser(); + (void) xmlSubstituteEntitiesDefault(1); + (void) memset(&sax_modules,0,sizeof(sax_modules)); + sax_modules.internalSubset=SVGInternalSubset; + sax_modules.isStandalone=SVGIsStandalone; + sax_modules.hasInternalSubset=SVGHasInternalSubset; + sax_modules.hasExternalSubset=SVGHasExternalSubset; + sax_modules.resolveEntity=SVGResolveEntity; + sax_modules.getEntity=SVGGetEntity; + sax_modules.entityDecl=SVGEntityDeclaration; + sax_modules.notationDecl=SVGNotationDeclaration; + sax_modules.attributeDecl=SVGAttributeDeclaration; + sax_modules.elementDecl=SVGElementDeclaration; + sax_modules.unparsedEntityDecl=SVGUnparsedEntityDeclaration; + sax_modules.setDocumentLocator=SVGSetDocumentLocator; + sax_modules.startDocument=SVGStartDocument; + sax_modules.endDocument=SVGEndDocument; + sax_modules.startElement=SVGStartElement; + sax_modules.endElement=SVGEndElement; + sax_modules.reference=SVGReference; + sax_modules.characters=SVGCharacters; + sax_modules.ignorableWhitespace=SVGIgnorableWhitespace; + sax_modules.processingInstruction=SVGProcessingInstructions; + sax_modules.comment=SVGComment; + sax_modules.warning=SVGWarning; + sax_modules.error=SVGError; + sax_modules.fatalError=SVGError; + sax_modules.getParameterEntity=SVGGetParameterEntity; + sax_modules.cdataBlock=SVGCDataBlock; + sax_modules.externalSubset=SVGExternalSubset; + sax_handler=(&sax_modules); + n=ReadBlob(image,MaxTextExtent-1,message); + message[n]='\0'; + if (n > 0) + { + svg_info->parser=xmlCreatePushParserCtxt(sax_handler,svg_info,(char *) + message,n,image->filename); + option=GetImageOption(image_info,"svg:xml-parse-huge"); + if (svg_info->parser != (xmlParserCtxtPtr) NULL) + { + if ((option != (char *) NULL) && (IsStringTrue(option) != MagickFalse)) + (void) xmlCtxtUseOptions(svg_info->parser,XML_PARSE_HUGE); + while ((n=ReadBlob(image,MaxTextExtent-1,message)) != 0) + { + message[n]='\0'; + status=xmlParseChunk(svg_info->parser,(char *) message,(int) n,0); + if (status != 0) + break; + } + } + } + if (svg_info->parser == (xmlParserCtxtPtr) NULL) + { + svg_info=DestroySVGInfo(svg_info); + (void) RelinquishUniqueFileResource(filename); + image=DestroyImage(image); + return((Image *) NULL); + } + (void) xmlParseChunk(svg_info->parser,(char *) message,0,1); + SVGEndDocument(svg_info); + if (svg_info->parser->myDoc != (xmlDocPtr) NULL) + xmlFreeDoc(svg_info->parser->myDoc); + xmlFreeParserCtxt(svg_info->parser); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"end SAX"); + (void) fclose(file); + (void) CloseBlob(image); + image->columns=svg_info->width; + image->rows=svg_info->height; + if (exception->severity >= ErrorException) + { + svg_info=DestroySVGInfo(svg_info); + (void) RelinquishUniqueFileResource(filename); + image=DestroyImage(image); + return((Image *) NULL); + } + if (image_info->ping == MagickFalse) + { + ImageInfo + *read_info; + + /* + Draw image. + */ + image=DestroyImage(image); + image=(Image *) NULL; + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) FormatLocaleString(read_info->filename,MaxTextExtent,"mvg:%s", + filename); + image=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (image != (Image *) NULL) + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + } + /* + Relinquish resources. + */ + if (image != (Image *) NULL) + { + if (svg_info->title != (char *) NULL) + (void) SetImageProperty(image,"svg:title",svg_info->title); + if (svg_info->comment != (char *) NULL) + (void) SetImageProperty(image,"svg:comment",svg_info->comment); + } + svg_info=DestroySVGInfo(svg_info); + (void) RelinquishUniqueFileResource(filename); + for (next=GetFirstImageInList(image); next != (Image *) NULL; ) + { + (void) CopyMagickString(next->filename,image->filename,MaxTextExtent); + (void) CopyMagickString(next->magick,"SVG",MaxTextExtent); + next=GetNextImageInList(next); + } + return(GetFirstImageInList(image)); +} +#else +static Image *RenderMSVGImage(const ImageInfo *magick_unused(image_info), + Image *image,ExceptionInfo *magick_unused(exception)) +{ + magick_unreferenced(image_info); + magick_unreferenced(exception); + image=DestroyImageList(image); + return((Image *) NULL); +} +#endif + +static Image *ReadSVGImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(exception != (ExceptionInfo *) NULL); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if ((fabs(image->x_resolution) < MagickEpsilon) || + (fabs(image->y_resolution) < MagickEpsilon)) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(SVGDensityGeometry,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + if (LocaleCompare(image_info->magick,"MSVG") != 0) + { + Image + *svg_image; + +#if defined(MAGICKCORE_RSVG_DELEGATE) + if (LocaleCompare(image_info->magick,"RSVG") == 0) + { + image=RenderRSVGImage(image_info,image,exception); + return(image); + } +#endif + svg_image=RenderSVGImage(image_info,image,exception); + if (svg_image != (Image *) NULL) + { + image=DestroyImageList(image); + return(svg_image); + } +#if defined(MAGICKCORE_RSVG_DELEGATE) + image=RenderRSVGImage(image_info,image,exception); + return(image); +#endif + } + status=IsRightsAuthorized(CoderPolicyDomain,ReadPolicyRights,"MSVG"); + if (status == MagickFalse) + image=DestroyImageList(image); + else + image=RenderMSVGImage(image_info,image,exception); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r S V G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterSVGImage() adds attributes for the SVG image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterSVGImage method is: +% +% size_t RegisterSVGImage(void) +% +*/ +ModuleExport size_t RegisterSVGImage(void) +{ + char + version[MaxTextExtent]; + + MagickInfo + *entry; + + *version='\0'; +#if defined(LIBXML_DOTTED_VERSION) + (void) CopyMagickString(version,"XML " LIBXML_DOTTED_VERSION,MaxTextExtent); +#endif +#if defined(MAGICKCORE_RSVG_DELEGATE) +#if !GLIB_CHECK_VERSION(2,35,0) + g_type_init(); +#endif + (void) FormatLocaleString(version,MaxTextExtent,"RSVG %d.%d.%d", + LIBRSVG_MAJOR_VERSION,LIBRSVG_MINOR_VERSION,LIBRSVG_MICRO_VERSION); +#endif +#if defined(MAGICKCORE_XML_DELEGATE) + xmlInitParser(); +#endif + entry=SetMagickInfo("SVG"); + entry->decoder=(DecodeImageHandler *) ReadSVGImage; + entry->encoder=(EncodeImageHandler *) WriteSVGImage; + entry->seekable_stream=MagickFalse; +#if defined(MAGICKCORE_RSVG_DELEGATE) + entry->thread_support=MagickFalse; +#endif + entry->description=ConstantString("Scalable Vector Graphics"); + entry->mime_type=ConstantString("image/svg+xml"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick=(IsImageFormatHandler *) IsSVG; + entry->magick_module=ConstantString("SVG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("SVGZ"); +#if defined(MAGICKCORE_XML_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadSVGImage; +#endif + entry->encoder=(EncodeImageHandler *) WriteSVGImage; + entry->seekable_stream=MagickFalse; +#if defined(MAGICKCORE_RSVG_DELEGATE) + entry->thread_support=MagickFalse; +#endif + entry->description=ConstantString("Compressed Scalable Vector Graphics"); + entry->mime_type=ConstantString("image/svg+xml"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick=(IsImageFormatHandler *) IsSVG; + entry->magick_module=ConstantString("SVG"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("MSVG"); +#if defined(MAGICKCORE_XML_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadSVGImage; +#endif + entry->encoder=(EncodeImageHandler *) WriteSVGImage; + entry->seekable_stream=MagickFalse; +#if defined(MAGICKCORE_RSVG_DELEGATE) + entry->thread_support=MagickFalse; +#endif + entry->description=ConstantString("ImageMagick's own SVG internal renderer"); + entry->magick=(IsImageFormatHandler *) IsSVG; + entry->magick_module=ConstantString("SVG"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r S V G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterSVGImage() removes format registrations made by the +% SVG module from the list of supported formats. +% +% The format of the UnregisterSVGImage method is: +% +% UnregisterSVGImage(void) +% +*/ +ModuleExport void UnregisterSVGImage(void) +{ + (void) UnregisterMagickInfo("SVGZ"); + (void) UnregisterMagickInfo("SVG"); + (void) UnregisterMagickInfo("MSVG"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e S V G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteSVGImage() writes a image in the SVG - XML based W3C standard +% format. +% +% The format of the WriteSVGImage method is: +% +% MagickBooleanType WriteSVGImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static void AffineToTransform(Image *image,AffineMatrix *affine) +{ + char + transform[MaxTextExtent]; + + if ((fabs(affine->tx) < MagickEpsilon) && (fabs(affine->ty) < MagickEpsilon)) + { + if ((fabs(affine->rx) < MagickEpsilon) && + (fabs(affine->ry) < MagickEpsilon)) + { + if ((fabs(affine->sx-1.0) < MagickEpsilon) && + (fabs(affine->sy-1.0) < MagickEpsilon)) + { + (void) WriteBlobString(image,"\">\n"); + return; + } + (void) FormatLocaleString(transform,MaxTextExtent, + "\" transform=\"scale(%g,%g)\">\n",affine->sx,affine->sy); + (void) WriteBlobString(image,transform); + return; + } + else + { + if ((fabs(affine->sx-affine->sy) < MagickEpsilon) && + (fabs(affine->rx+affine->ry) < MagickEpsilon) && + (fabs(affine->sx*affine->sx+affine->rx*affine->rx-1.0) < + 2*MagickEpsilon)) + { + double + theta; + + theta=(180.0/MagickPI)*atan2(affine->rx,affine->sx); + (void) FormatLocaleString(transform,MaxTextExtent, + "\" transform=\"rotate(%g)\">\n",theta); + (void) WriteBlobString(image,transform); + return; + } + } + } + else + { + if ((fabs(affine->sx-1.0) < MagickEpsilon) && + (fabs(affine->rx) < MagickEpsilon) && + (fabs(affine->ry) < MagickEpsilon) && + (fabs(affine->sy-1.0) < MagickEpsilon)) + { + (void) FormatLocaleString(transform,MaxTextExtent, + "\" transform=\"translate(%g,%g)\">\n",affine->tx,affine->ty); + (void) WriteBlobString(image,transform); + return; + } + } + (void) FormatLocaleString(transform,MaxTextExtent, + "\" transform=\"matrix(%g %g %g %g %g %g)\">\n", + affine->sx,affine->rx,affine->ry,affine->sy,affine->tx,affine->ty); + (void) WriteBlobString(image,transform); +} + +static MagickBooleanType IsPoint(const char *point) +{ + char + *p; + + ssize_t + value; + + value=(ssize_t) strtol(point,&p,10); + (void) value; + return(p != point ? MagickTrue : MagickFalse); +} + +static MagickBooleanType TraceSVGImage(Image *image,ExceptionInfo *exception) +{ +#if defined(MAGICKCORE_AUTOTRACE_DELEGATE) + { + at_bitmap + *trace; + + at_fitting_opts_type + *fitting_options; + + at_output_opts_type + *output_options; + + at_splines_type + *splines; + + ImageType + type; + + const PixelPacket + *p; + + ssize_t + i, + x; + + size_t + number_planes; + + ssize_t + y; + + /* + Trace image and write as SVG. + */ + fitting_options=at_fitting_opts_new(); + output_options=at_output_opts_new(); + type=GetImageType(image,exception); + number_planes=3; + if ((type == BilevelType) || (type == GrayscaleType)) + number_planes=1; + trace=at_bitmap_new(image->columns,image->rows,number_planes); + i=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + trace->bitmap[i++]=GetPixelRed(p); + if (number_planes == 3) + { + trace->bitmap[i++]=GetPixelGreen(p); + trace->bitmap[i++]=GetPixelBlue(p); + } + p++; + } + } + splines=at_splines_new_full(trace,fitting_options,NULL,NULL,NULL,NULL,NULL, + NULL); + at_splines_write(at_output_get_handler_by_suffix((char *) "svg"), + GetBlobFileHandle(image),image->filename,output_options,splines,NULL, + NULL); + /* + Free resources. + */ + at_splines_free(splines); + at_bitmap_free(trace); + at_output_opts_free(output_options); + at_fitting_opts_free(fitting_options); + } +#else + { + char + *base64, + filename[MaxTextExtent], + message[MaxTextExtent]; + + const DelegateInfo + *delegate_info; + + Image + *clone_image; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + char + *p; + + size_t + blob_length, + encode_length; + + ssize_t + i; + + unsigned char + *blob; + + delegate_info=GetDelegateInfo((char *) NULL,"TRACE",exception); + if (delegate_info != (DelegateInfo *) NULL) + { + /* + Trace SVG with tracing delegate. + */ + image_info=AcquireImageInfo(); + (void) CopyMagickString(image_info->magick,"TRACE",MagickPathExtent); + (void) FormatLocaleString(filename,MagickPathExtent,"trace:%s", + image_info->filename); + (void) CopyMagickString(image_info->filename,filename,MagickPathExtent); + status=WriteImage(image_info,image); + image_info=DestroyImageInfo(image_info); + return(status); + } + (void) WriteBlobString(image, + "\n"); + (void) WriteBlobString(image, + "\n"); + (void) FormatLocaleString(message,MaxTextExtent, + "", + (double) image->columns,(double) image->rows, + (double) image->columns,(double) image->rows, + (double) image->columns,(double) image->rows); + (void) WriteBlobString(image,message); + clone_image=CloneImage(image,0,0,MagickTrue,exception); + if (clone_image == (Image *) NULL) + return(MagickFalse); + image_info=AcquireImageInfo(); + (void) CopyMagickString(image_info->magick,"PNG",MaxTextExtent); + blob_length=2048; + blob=(unsigned char *) ImageToBlob(image_info,clone_image,&blob_length, + exception); + clone_image=DestroyImage(clone_image); + image_info=DestroyImageInfo(image_info); + if (blob == (unsigned char *) NULL) + return(MagickFalse); + encode_length=0; + base64=Base64Encode(blob,blob_length,&encode_length); + blob=(unsigned char *) RelinquishMagickMemory(blob); + (void) FormatLocaleString(message,MaxTextExtent, + " scene,(double) image->columns,(double) image->rows, + (double) image->page.x,(double) image->page.y); + (void) WriteBlobString(image,message); + p=base64; + for (i=(ssize_t) encode_length; i > 0; i-=76) + { + (void) FormatLocaleString(message,MaxTextExtent,"%.76s",p); + (void) WriteBlobString(image,message); + p+=76; + if (i > 76) + (void) WriteBlobString(image,"\n"); + } + base64=DestroyString(base64); + (void) WriteBlobString(image,"\" />\n"); + (void) WriteBlobString(image,"\n"); + } +#endif + (void) CloseBlob(image); + return(MagickTrue); +} + +static MagickBooleanType WriteSVGImage(const ImageInfo *image_info,Image *image) +{ +#define BezierQuantum 200 + + AffineMatrix + affine; + + char + keyword[MaxTextExtent], + message[MaxTextExtent], + name[MaxTextExtent], + *next_token, + *token, + type[MaxTextExtent]; + + const char + *p, + *q, + *value; + + int + n; + + ssize_t + j; + + MagickBooleanType + active, + status; + + PointInfo + point; + + PrimitiveInfo + *primitive_info; + + PrimitiveType + primitive_type; + + ssize_t + x; + + ssize_t + i; + + size_t + extent, + length, + number_points; + + SVGInfo + svg_info; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + value=GetImageArtifact(image,"SVG"); + if (value != (char *) NULL) + { + (void) WriteBlobString(image,value); + (void) CloseBlob(image); + return(MagickTrue); + } + value=GetImageArtifact(image,"mvg:vector-graphics"); + if (value == (char *) NULL) + return(TraceSVGImage(image,&image->exception)); + /* + Write SVG header. + */ + (void) WriteBlobString(image,"\n"); + (void) WriteBlobString(image, + "\n"); + (void) FormatLocaleString(message,MaxTextExtent, + "\n",(double) image->columns,(double) + image->rows); + (void) WriteBlobString(image,message); + /* + Allocate primitive info memory. + */ + number_points=2047; + primitive_info=(PrimitiveInfo *) AcquireQuantumMemory(number_points, + sizeof(*primitive_info)); + if (primitive_info == (PrimitiveInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + GetAffineMatrix(&affine); + token=AcquireString(value); + extent=strlen(token)+MaxTextExtent; + active=MagickFalse; + n=0; + status=MagickTrue; + for (q=(const char *) value; *q != '\0'; ) + { + /* + Interpret graphic primitive. + */ + (void) GetNextToken(q,&q,extent,keyword); + if (*keyword == '\0') + break; + if (*keyword == '#') + { + /* + Comment. + */ + if (active != MagickFalse) + { + AffineToTransform(image,&affine); + active=MagickFalse; + } + (void) WriteBlobString(image,""); + (void) WriteBlobString(image,keyword+1); + for ( ; (*q != '\n') && (*q != '\0'); q++) + switch (*q) + { + case '<': (void) WriteBlobString(image,"<"); break; + case '>': (void) WriteBlobString(image,">"); break; + case '&': (void) WriteBlobString(image,"&"); break; + default: (void) WriteBlobByte(image,(unsigned char) *q); break; + } + (void) WriteBlobString(image,"\n"); + continue; + } + primitive_type=UndefinedPrimitive; + switch (*keyword) + { + case ';': + break; + case 'a': + case 'A': + { + if (LocaleCompare("affine",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + affine.sx=StringToDouble(token,&next_token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.rx=StringToDouble(token,&next_token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.ry=StringToDouble(token,&next_token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.sy=StringToDouble(token,&next_token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.tx=StringToDouble(token,&next_token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.ty=StringToDouble(token,&next_token); + break; + } + if (LocaleCompare("angle",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + affine.rx=StringToDouble(token,&next_token); + affine.ry=StringToDouble(token,&next_token); + break; + } + if (LocaleCompare("arc",keyword) == 0) + { + primitive_type=ArcPrimitive; + break; + } + status=MagickFalse; + break; + } + case 'b': + case 'B': + { + if (LocaleCompare("bezier",keyword) == 0) + { + primitive_type=BezierPrimitive; + break; + } + status=MagickFalse; + break; + } + case 'c': + case 'C': + { + if (LocaleCompare("clip-path",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "clip-path:url(#%s);",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("clip-rule",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"clip-rule:%s;", + token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("clip-units",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"clipPathUnits=%s;", + token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("circle",keyword) == 0) + { + primitive_type=CirclePrimitive; + break; + } + if (LocaleCompare("color",keyword) == 0) + { + primitive_type=ColorPrimitive; + break; + } + if (LocaleCompare("compliance",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + break; + } + status=MagickFalse; + break; + } + case 'd': + case 'D': + { + if (LocaleCompare("decorate",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "text-decoration:%s;",token); + (void) WriteBlobString(image,message); + break; + } + status=MagickFalse; + break; + } + case 'e': + case 'E': + { + if (LocaleCompare("ellipse",keyword) == 0) + { + primitive_type=EllipsePrimitive; + break; + } + status=MagickFalse; + break; + } + case 'f': + case 'F': + { + if (LocaleCompare("fill",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"fill:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("fill-rule",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"fill-rule:%s;", + token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("fill-opacity",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"fill-opacity:%s;", + token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("font-family",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"font-family:%s;", + token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("font-stretch",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"font-stretch:%s;", + token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("font-style",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"font-style:%s;", + token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("font-size",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"font-size:%s;", + token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("font-weight",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"font-weight:%s;", + token); + (void) WriteBlobString(image,message); + break; + } + status=MagickFalse; + break; + } + case 'g': + case 'G': + { + if (LocaleCompare("gradient-units",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + break; + } + if (LocaleCompare("text-align",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"text-align %s ", + token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("text-anchor",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, "text-anchor %s ", + token); + (void) WriteBlobString(image,message); + break; + } + status=MagickFalse; + break; + } + case 'i': + case 'I': + { + if (LocaleCompare("image",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + primitive_type=ImagePrimitive; + break; + } + status=MagickFalse; + break; + } + case 'k': + case 'K': + { + if (LocaleCompare("kerning",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MagickPathExtent,"kerning:%s;", + token); + (void) WriteBlobString(image,message); + break; + } + break; + } + case 'l': + case 'L': + { + if (LocaleCompare("letter-spacing",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MagickPathExtent, + "letter-spacing:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("line",keyword) == 0) + { + primitive_type=LinePrimitive; + break; + } + status=MagickFalse; + break; + } + case 'm': + case 'M': + { + if (LocaleCompare("matte",keyword) == 0) + { + primitive_type=MattePrimitive; + break; + } + status=MagickFalse; + break; + } + case 'o': + case 'O': + { + if (LocaleCompare("opacity",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"opacity %s ", + token); + (void) WriteBlobString(image,message); + break; + } + status=MagickFalse; + break; + } + case 'p': + case 'P': + { + if (LocaleCompare("path",keyword) == 0) + { + primitive_type=PathPrimitive; + break; + } + if (LocaleCompare("point",keyword) == 0) + { + primitive_type=PointPrimitive; + break; + } + if (LocaleCompare("polyline",keyword) == 0) + { + primitive_type=PolylinePrimitive; + break; + } + if (LocaleCompare("polygon",keyword) == 0) + { + primitive_type=PolygonPrimitive; + break; + } + if (LocaleCompare("pop",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + if (LocaleCompare("clip-path",token) == 0) + { + (void) WriteBlobString(image,"\n"); + break; + } + if (LocaleCompare("defs",token) == 0) + { + (void) WriteBlobString(image,"\n"); + break; + } + if (LocaleCompare("gradient",token) == 0) + { + (void) FormatLocaleString(message,MaxTextExtent, + "\n",type); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("graphic-context",token) == 0) + { + n--; + if (n < 0) + ThrowWriterException(DrawError, + "UnbalancedGraphicContextPushPop"); + (void) WriteBlobString(image,"\n"); + } + if (LocaleCompare("pattern",token) == 0) + { + (void) WriteBlobString(image,"\n"); + break; + } + if (LocaleCompare("symbol",token) == 0) + { + (void) WriteBlobString(image,"\n"); + break; + } + if ((LocaleCompare("defs",token) == 0) || + (LocaleCompare("symbol",token) == 0)) + (void) WriteBlobString(image,"\n"); + break; + } + if (LocaleCompare("push",keyword) == 0) + { + *name='\0'; + (void) GetNextToken(q,&q,extent,token); + if (*q == '"') + (void) GetNextToken(q,&q,MaxTextExtent,name); + if (LocaleCompare("clip-path",token) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "\n",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("defs",token) == 0) + { + (void) WriteBlobString(image,"\n"); + break; + } + if (LocaleCompare("gradient",token) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) CopyMagickString(name,token,MaxTextExtent); + (void) GetNextToken(q,&q,extent,token); + (void) CopyMagickString(type,token,MaxTextExtent); + (void) GetNextToken(q,&q,extent,token); + svg_info.segment.x1=StringToDouble(token,&next_token); + svg_info.element.cx=StringToDouble(token,&next_token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + svg_info.segment.y1=StringToDouble(token,&next_token); + svg_info.element.cy=StringToDouble(token,&next_token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + svg_info.segment.x2=StringToDouble(token,&next_token); + svg_info.element.major=StringToDouble(token, + (char **) NULL); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + svg_info.segment.y2=StringToDouble(token,&next_token); + svg_info.element.minor=StringToDouble(token, + (char **) NULL); + (void) FormatLocaleString(message,MaxTextExtent, + "<%sGradient id=\"%s\" x1=\"%g\" y1=\"%g\" x2=\"%g\" " + "y2=\"%g\">\n",type,name,svg_info.segment.x1, + svg_info.segment.y1,svg_info.segment.x2,svg_info.segment.y2); + if (LocaleCompare(type,"radial") == 0) + { + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + svg_info.element.angle=StringToDouble(token, + (char **) NULL); + (void) FormatLocaleString(message,MaxTextExtent, + "<%sGradient id=\"%s\" cx=\"%g\" cy=\"%g\" r=\"%g\" " + "fx=\"%g\" fy=\"%g\">\n",type,name, + svg_info.element.cx,svg_info.element.cy, + svg_info.element.angle,svg_info.element.major, + svg_info.element.minor); + } + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("graphic-context",token) == 0) + { + n++; + if (active) + { + AffineToTransform(image,&affine); + active=MagickFalse; + } + (void) WriteBlobString(image,"\n",name,svg_info.bounds.x,svg_info.bounds.y, + svg_info.bounds.width,svg_info.bounds.height); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("symbol",token) == 0) + { + (void) WriteBlobString(image,"\n"); + break; + } + break; + } + status=MagickFalse; + break; + } + case 'r': + case 'R': + { + if (LocaleCompare("rectangle",keyword) == 0) + { + primitive_type=RectanglePrimitive; + break; + } + if (LocaleCompare("roundRectangle",keyword) == 0) + { + primitive_type=RoundRectanglePrimitive; + break; + } + if (LocaleCompare("rotate",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"rotate(%s) ", + token); + (void) WriteBlobString(image,message); + break; + } + status=MagickFalse; + break; + } + case 's': + case 'S': + { + if (LocaleCompare("scale",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + affine.sx=StringToDouble(token,&next_token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.sy=StringToDouble(token,&next_token); + break; + } + if (LocaleCompare("skewX",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"skewX(%s) ",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("skewY",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"skewY(%s) ",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("stop-color",keyword) == 0) + { + char + color[MaxTextExtent]; + + (void) GetNextToken(q,&q,extent,token); + (void) CopyMagickString(color,token,MaxTextExtent); + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + " \n",token,color); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("stroke",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"stroke:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("stroke-antialias",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "stroke-antialias:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("stroke-dasharray",keyword) == 0) + { + if (IsPoint(q)) + { + ssize_t + k; + + p=q; + (void) GetNextToken(p,&p,extent,token); + for (k=0; IsPoint(token); k++) + (void) GetNextToken(p,&p,extent,token); + (void) WriteBlobString(image,"stroke-dasharray:"); + for (j=0; j < k; j++) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"%s ",token); + (void) WriteBlobString(image,message); + } + (void) WriteBlobString(image,";"); + break; + } + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "stroke-dasharray:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("stroke-dashoffset",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "stroke-dashoffset:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("stroke-linecap",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "stroke-linecap:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("stroke-linejoin",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "stroke-linejoin:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("stroke-miterlimit",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "stroke-miterlimit:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("stroke-opacity",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "stroke-opacity:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("stroke-width",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent,"stroke-width:%s;", + token); + (void) WriteBlobString(image,message); + continue; + } + status=MagickFalse; + break; + } + case 't': + case 'T': + { + if (LocaleCompare("text",keyword) == 0) + { + primitive_type=TextPrimitive; + break; + } + if (LocaleCompare("text-antialias",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + "text-antialias:%s;",token); + (void) WriteBlobString(image,message); + break; + } + if (LocaleCompare("tspan",keyword) == 0) + { + primitive_type=TextPrimitive; + break; + } + if (LocaleCompare("translate",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + affine.tx=StringToDouble(token,&next_token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.ty=StringToDouble(token,&next_token); + break; + } + status=MagickFalse; + break; + } + case 'v': + case 'V': + { + if (LocaleCompare("viewbox",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + (void) GetNextToken(q,&q,extent,token); + break; + } + status=MagickFalse; + break; + } + default: + { + status=MagickFalse; + break; + } + } + if (status == MagickFalse) + break; + if (primitive_type == UndefinedPrimitive) + continue; + /* + Parse the primitive attributes. + */ + i=0; + j=0; + for (x=0; *q != '\0'; x++) + { + /* + Define points. + */ + if (IsPoint(q) == MagickFalse) + break; + (void) GetNextToken(q,&q,extent,token); + point.x=StringToDouble(token,&next_token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + point.y=StringToDouble(token,&next_token); + (void) GetNextToken(q,(const char **) NULL,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + primitive_info[i].primitive=primitive_type; + primitive_info[i].point=point; + primitive_info[i].coordinates=0; + primitive_info[i].method=FloodfillMethod; + i++; + if (i < (ssize_t) (number_points-6*BezierQuantum-360)) + continue; + number_points+=6*BezierQuantum+360; + primitive_info=(PrimitiveInfo *) ResizeQuantumMemory(primitive_info, + number_points,sizeof(*primitive_info)); + if (primitive_info == (PrimitiveInfo *) NULL) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + break; + } + } + primitive_info[j].primitive=primitive_type; + primitive_info[j].coordinates=(size_t) x; + primitive_info[j].method=FloodfillMethod; + primitive_info[j].text=(char *) NULL; + if (active) + { + AffineToTransform(image,&affine); + active=MagickFalse; + } + active=MagickFalse; + switch (primitive_type) + { + case PointPrimitive: + default: + { + if (primitive_info[j].coordinates != 1) + { + status=MagickFalse; + break; + } + break; + } + case LinePrimitive: + { + if (primitive_info[j].coordinates != 2) + { + status=MagickFalse; + break; + } + (void) FormatLocaleString(message,MaxTextExtent, + " \n", + primitive_info[j].point.x,primitive_info[j].point.y, + primitive_info[j+1].point.x,primitive_info[j+1].point.y); + (void) WriteBlobString(image,message); + break; + } + case RectanglePrimitive: + { + if (primitive_info[j].coordinates != 2) + { + status=MagickFalse; + break; + } + (void) FormatLocaleString(message,MaxTextExtent, + " \n", + primitive_info[j].point.x,primitive_info[j].point.y, + primitive_info[j+1].point.x-primitive_info[j].point.x, + primitive_info[j+1].point.y-primitive_info[j].point.y); + (void) WriteBlobString(image,message); + break; + } + case RoundRectanglePrimitive: + { + if (primitive_info[j].coordinates != 3) + { + status=MagickFalse; + break; + } + (void) FormatLocaleString(message,MaxTextExtent, + " \n",primitive_info[j].point.x, + primitive_info[j].point.y,primitive_info[j+1].point.x- + primitive_info[j].point.x,primitive_info[j+1].point.y- + primitive_info[j].point.y,primitive_info[j+2].point.x, + primitive_info[j+2].point.y); + (void) WriteBlobString(image,message); + break; + } + case ArcPrimitive: + { + if (primitive_info[j].coordinates != 3) + { + status=MagickFalse; + break; + } + break; + } + case EllipsePrimitive: + { + if (primitive_info[j].coordinates != 3) + { + status=MagickFalse; + break; + } + (void) FormatLocaleString(message,MaxTextExtent, + " \n", + primitive_info[j].point.x,primitive_info[j].point.y, + primitive_info[j+1].point.x,primitive_info[j+1].point.y); + (void) WriteBlobString(image,message); + break; + } + case CirclePrimitive: + { + double + alpha, + beta; + + if (primitive_info[j].coordinates != 2) + { + status=MagickFalse; + break; + } + alpha=primitive_info[j+1].point.x-primitive_info[j].point.x; + beta=primitive_info[j+1].point.y-primitive_info[j].point.y; + (void) FormatLocaleString(message,MaxTextExtent, + " \n", + primitive_info[j].point.x,primitive_info[j].point.y, + hypot(alpha,beta)); + (void) WriteBlobString(image,message); + break; + } + case PolylinePrimitive: + { + if (primitive_info[j].coordinates < 2) + { + status=MagickFalse; + break; + } + (void) CopyMagickString(message," = 80) + { + (void) WriteBlobString(image,"\n "); + length=strlen(message)+5; + } + (void) WriteBlobString(image,message); + } + (void) WriteBlobString(image,"\"/>\n"); + break; + } + case PolygonPrimitive: + { + if (primitive_info[j].coordinates < 3) + { + status=MagickFalse; + break; + } + primitive_info[i]=primitive_info[j]; + primitive_info[i].coordinates=0; + primitive_info[j].coordinates++; + i++; + (void) CopyMagickString(message," = 80) + { + (void) WriteBlobString(image,"\n "); + length=strlen(message)+5; + } + (void) WriteBlobString(image,message); + } + (void) WriteBlobString(image,"\"/>\n"); + break; + } + case BezierPrimitive: + { + if (primitive_info[j].coordinates < 3) + { + status=MagickFalse; + break; + } + break; + } + case PathPrimitive: + { + int + number_attributes; + + (void) GetNextToken(q,&q,extent,token); + number_attributes=1; + for (p=token; *p != '\0'; p++) + if (isalpha((int) *p)) + number_attributes++; + if (i > (ssize_t) (number_points-6*BezierQuantum*number_attributes-1)) + { + number_points+=6*BezierQuantum*number_attributes; + primitive_info=(PrimitiveInfo *) ResizeQuantumMemory(primitive_info, + number_points,sizeof(*primitive_info)); + if (primitive_info == (PrimitiveInfo *) NULL) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + image->filename); + break; + } + } + (void) WriteBlobString(image," \n"); + break; + } + case ColorPrimitive: + case MattePrimitive: + { + if (primitive_info[j].coordinates != 1) + { + status=MagickFalse; + break; + } + (void) GetNextToken(q,&q,extent,token); + if (LocaleCompare("point",token) == 0) + primitive_info[j].method=PointMethod; + if (LocaleCompare("replace",token) == 0) + primitive_info[j].method=ReplaceMethod; + if (LocaleCompare("floodfill",token) == 0) + primitive_info[j].method=FloodfillMethod; + if (LocaleCompare("filltoborder",token) == 0) + primitive_info[j].method=FillToBorderMethod; + if (LocaleCompare("reset",token) == 0) + primitive_info[j].method=ResetMethod; + break; + } + case TextPrimitive: + { + char + *p; + + if (primitive_info[j].coordinates != 1) + { + status=MagickFalse; + break; + } + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + " ",primitive_info[j].point.x, + primitive_info[j].point.y); + (void) WriteBlobString(image,message); + for (p=token; *p != '\0'; p++) + switch (*p) + { + case '<': (void) WriteBlobString(image,"<"); break; + case '>': (void) WriteBlobString(image,">"); break; + case '&': (void) WriteBlobString(image,"&"); break; + default: (void) WriteBlobByte(image,(unsigned char) *p); break; + } + (void) WriteBlobString(image,"\n"); + break; + } + case ImagePrimitive: + { + if (primitive_info[j].coordinates != 2) + { + status=MagickFalse; + break; + } + (void) GetNextToken(q,&q,extent,token); + (void) FormatLocaleString(message,MaxTextExtent, + " \n",primitive_info[j].point.x, + primitive_info[j].point.y,primitive_info[j+1].point.x, + primitive_info[j+1].point.y,token); + (void) WriteBlobString(image,message); + break; + } + } + if (primitive_info == (PrimitiveInfo *) NULL) + break; + primitive_info[i].primitive=UndefinedPrimitive; + if (status == MagickFalse) + break; + } + (void) WriteBlobString(image,"\n"); + /* + Relinquish resources. + */ + token=DestroyString(token); + if (primitive_info != (PrimitiveInfo *) NULL) + primitive_info=(PrimitiveInfo *) RelinquishMagickMemory(primitive_info); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/tga.c b/ImageMagick-6.9.12-44/coders/tga.c new file mode 100644 index 0000000..0c7b8f5 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/tga.c @@ -0,0 +1,1020 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% TTTTT GGGG AAA % +% T G A A % +% T G GG AAAAA % +% T G G A A % +% T GGG A A % +% % +% % +% Read/Write Truevision Targa Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Enumerated declaractions. +*/ +typedef enum +{ + TGAColormap = 1, + TGARGB = 2, + TGAMonochrome = 3, + TGARLEColormap = 9, + TGARLERGB = 10, + TGARLEMonochrome = 11 +} TGAImageType; + +/* + Typedef declaractions. +*/ +typedef struct _TGAInfo +{ + TGAImageType + image_type; + + unsigned char + id_length, + colormap_type; + + unsigned short + colormap_index, + colormap_length; + + unsigned char + colormap_size; + + unsigned short + x_origin, + y_origin, + width, + height; + + unsigned char + bits_per_pixel, + attributes; +} TGAInfo; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteTGAImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d T G A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadTGAImage() reads a Truevision TGA image file and returns it. +% It allocates the memory necessary for the new Image structure and returns +% a pointer to the new image. +% +% The format of the ReadTGAImage method is: +% +% Image *ReadTGAImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadTGAImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + IndexPacket + index; + + MagickBooleanType + status; + + PixelPacket + pixel; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + i, + x; + + size_t + base, + flag, + offset, + skip; + + ssize_t + count, + y; + + TGAInfo + tga_info; + + unsigned char + j, + k, + pixels[4], + runlength; + + unsigned int + alpha_bits; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read TGA header information. + */ + count=ReadBlob(image,1,&tga_info.id_length); + tga_info.colormap_type=(unsigned char) ReadBlobByte(image); + tga_info.image_type=(TGAImageType) ReadBlobByte(image); + if ((count != 1) || + ((tga_info.image_type != TGAColormap) && + (tga_info.image_type != TGARGB) && + (tga_info.image_type != TGAMonochrome) && + (tga_info.image_type != TGARLEColormap) && + (tga_info.image_type != TGARLERGB) && + (tga_info.image_type != TGARLEMonochrome)) || + (((tga_info.image_type == TGAColormap) || + (tga_info.image_type == TGARLEColormap)) && + (tga_info.colormap_type == 0))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + tga_info.colormap_index=ReadBlobLSBShort(image); + tga_info.colormap_length=ReadBlobLSBShort(image); + tga_info.colormap_size=(unsigned char) ReadBlobByte(image); + tga_info.x_origin=ReadBlobLSBShort(image); + tga_info.y_origin=ReadBlobLSBShort(image); + tga_info.width=(unsigned short) ReadBlobLSBShort(image); + tga_info.height=(unsigned short) ReadBlobLSBShort(image); + tga_info.bits_per_pixel=(unsigned char) ReadBlobByte(image); + tga_info.attributes=(unsigned char) ReadBlobByte(image); + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + if ((((tga_info.bits_per_pixel <= 1) || (tga_info.bits_per_pixel >= 17)) && + (tga_info.bits_per_pixel != 24) && (tga_info.bits_per_pixel != 32))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + /* + Initialize image structure. + */ + image->columns=tga_info.width; + image->rows=tga_info.height; + if ((tga_info.image_type != TGAMonochrome) && + (tga_info.image_type != TGARLEMonochrome)) + { + alpha_bits=(tga_info.attributes & 0x0FU); + image->matte=(alpha_bits > 0) || (tga_info.bits_per_pixel == 32) || + (tga_info.colormap_size == 32) ? MagickTrue : MagickFalse; + } + if ((tga_info.image_type != TGAColormap) && + (tga_info.image_type != TGARLEColormap)) + image->depth=(size_t) ((tga_info.bits_per_pixel <= 8) ? 8 : + (tga_info.bits_per_pixel <= 16) ? 5 : 8); + else + image->depth=(size_t) ((tga_info.colormap_size <= 8) ? 8 : + (tga_info.colormap_size <= 16) ? 5 : 8); + if ((tga_info.image_type == TGAColormap) || + (tga_info.image_type == TGARLEColormap)) + image->storage_class=PseudoClass; + if ((tga_info.image_type == TGAMonochrome) || + (tga_info.image_type == TGARLEMonochrome)) + { + image->type=GrayscaleType; + image->colorspace=GRAYColorspace; + } + image->compression=NoCompression; + if ((tga_info.image_type == TGARLEColormap) || + (tga_info.image_type == TGARLEMonochrome) || + (tga_info.image_type == TGARLERGB)) + image->compression=RLECompression; + if (image->storage_class == PseudoClass) + { + if (tga_info.colormap_type != 0) + image->colors=tga_info.colormap_index+tga_info.colormap_length; + else + { + size_t + one; + + one=1; + image->colors=one << tga_info.bits_per_pixel; + if ((MagickSizeType) image->colors > GetBlobSize(image)) + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + if (tga_info.id_length != 0) + { + char + *comment; + + size_t + length; + + /* + TGA image comment. + */ + length=(size_t) tga_info.id_length; + comment=(char *) NULL; + if (~length >= (MaxTextExtent-1)) + comment=(char *) AcquireQuantumMemory(length+MaxTextExtent, + sizeof(*comment)); + if (comment == (char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,length,(unsigned char *) comment); + if (count == (ssize_t) length) + { + comment[length]='\0'; + (void) SetImageProperty(image,"comment",comment); + } + comment=DestroyString(comment); + } + if ((tga_info.attributes & (1UL << 4)) == 0) + { + if ((tga_info.attributes & (1UL << 5)) == 0) + image->orientation=BottomLeftOrientation; + else + image->orientation=TopLeftOrientation; + } + else + { + if ((tga_info.attributes & (1UL << 5)) == 0) + image->orientation=BottomRightOrientation; + else + image->orientation=TopRightOrientation; + } + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(image); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) memset(&pixel,0,sizeof(pixel)); + pixel.opacity=(Quantum) OpaqueOpacity; + if (tga_info.colormap_type != 0) + { + /* + Read TGA raster colormap. + */ + if (image->colors < tga_info.colormap_index) + image->colors=tga_info.colormap_index; + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + for (i=0; i < (ssize_t) tga_info.colormap_index; i++) + image->colormap[i]=pixel; + for ( ; i < (ssize_t) image->colors; i++) + { + switch (tga_info.colormap_size) + { + case 8: + default: + { + /* + Gray scale. + */ + pixel.red=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + pixel.green=pixel.red; + pixel.blue=pixel.red; + break; + } + case 15: + case 16: + { + QuantumAny + range; + + /* + 5 bits each of red green and blue. + */ + j=(unsigned char) ReadBlobByte(image); + k=(unsigned char) ReadBlobByte(image); + range=GetQuantumRange(5UL); + pixel.red=ScaleAnyToQuantum(1UL*(k & 0x7c) >> 2,range); + pixel.green=ScaleAnyToQuantum((1UL*(k & 0x03) << 3)+ + (1UL*(j & 0xe0) >> 5),range); + pixel.blue=ScaleAnyToQuantum(1UL*(j & 0x1f),range); + break; + } + case 24: + { + /* + 8 bits each of blue, green and red. + */ + pixel.blue=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + pixel.green=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + pixel.red=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + break; + } + case 32: + { + /* + 8 bits each of blue, green, red, and alpha. + */ + pixel.blue=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + pixel.green=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + pixel.red=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); + pixel.opacity=(Quantum) (QuantumRange-ScaleCharToQuantum( + (unsigned char) ReadBlobByte(image))); + break; + } + } + image->colormap[i]=pixel; + } + } + /* + Convert TGA pixels to pixel packets. + */ + base=0; + flag=0; + skip=MagickFalse; + index=(IndexPacket) 0; + runlength=0; + offset=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((tga_info.image_type == TGARLEColormap) || + (tga_info.image_type == TGARLERGB) || + (tga_info.image_type == TGARLEMonochrome)) + { + if (runlength != 0) + { + runlength--; + skip=flag != 0; + } + else + { + count=ReadBlob(image,1,&runlength); + if (count != 1) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + flag=runlength & 0x80; + if (flag != 0) + runlength-=128; + skip=MagickFalse; + } + } + if (skip == MagickFalse) + switch (tga_info.bits_per_pixel) + { + case 8: + default: + { + /* + Gray scale. + */ + if (ReadBlob(image,1,pixels) != 1) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + index=(Quantum) pixels[0]; + if (tga_info.colormap_type != 0) + pixel=image->colormap[(ssize_t) ConstrainColormapIndex(image, + (ssize_t) index)]; + else + { + pixel.red=ScaleCharToQuantum((unsigned char) index); + pixel.green=ScaleCharToQuantum((unsigned char) index); + pixel.blue=ScaleCharToQuantum((unsigned char) index); + } + break; + } + case 15: + case 16: + { + QuantumAny + range; + + /* + 5 bits each of RGB; + */ + if (ReadBlob(image,2,pixels) != 2) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + j=pixels[0]; + k=pixels[1]; + range=GetQuantumRange(5UL); + pixel.red=ScaleAnyToQuantum(1UL*(k & 0x7c) >> 2,range); + pixel.green=ScaleAnyToQuantum((1UL*(k & 0x03) << 3)+ + (1UL*(j & 0xe0) >> 5),range); + pixel.blue=ScaleAnyToQuantum(1UL*(j & 0x1f),range); + if (image->matte != MagickFalse) + pixel.opacity=(k & 0x80) == 0 ? (Quantum) TransparentOpacity : + (Quantum) OpaqueOpacity; + if (image->storage_class == PseudoClass) + index=ConstrainColormapIndex(image,((ssize_t) k << 8)+j); + break; + } + case 24: + { + /* + BGR pixels. + */ + if (ReadBlob(image,3,pixels) != 3) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + pixel.blue=ScaleCharToQuantum(pixels[0]); + pixel.green=ScaleCharToQuantum(pixels[1]); + pixel.red=ScaleCharToQuantum(pixels[2]); + break; + } + case 32: + { + /* + BGRA pixels. + */ + if (ReadBlob(image,4,pixels) != 4) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + pixel.blue=ScaleCharToQuantum(pixels[0]); + pixel.green=ScaleCharToQuantum(pixels[1]); + pixel.red=ScaleCharToQuantum(pixels[2]); + pixel.opacity=(Quantum) (QuantumRange-ScaleCharToQuantum( + pixels[3])); + break; + } + } + if (status == MagickFalse) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + if (image->storage_class == PseudoClass) + SetPixelIndex(indexes+x,index); + SetPixelRed(q,pixel.red); + SetPixelGreen(q,pixel.green); + SetPixelBlue(q,pixel.blue); + if (image->matte != MagickFalse) + SetPixelOpacity(q,pixel.opacity); + q++; + } + /* + if (((unsigned char) (tga_info.attributes & 0xc0) >> 6) == 4) + offset+=4; + else + */ + if (((unsigned char) (tga_info.attributes & 0xc0) >> 6) == 2) + offset+=2; + else + offset++; + if (offset >= image->rows) + { + base++; + offset=base; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r T G A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterTGAImage() adds properties for the TGA image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterTGAImage method is: +% +% size_t RegisterTGAImage(void) +% +*/ +ModuleExport size_t RegisterTGAImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("ICB"); + entry->decoder=(DecodeImageHandler *) ReadTGAImage; + entry->encoder=(EncodeImageHandler *) WriteTGAImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Truevision Targa image"); + entry->magick_module=ConstantString("TGA"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("TGA"); + entry->decoder=(DecodeImageHandler *) ReadTGAImage; + entry->encoder=(EncodeImageHandler *) WriteTGAImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Truevision Targa image"); + entry->magick_module=ConstantString("TGA"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("VDA"); + entry->decoder=(DecodeImageHandler *) ReadTGAImage; + entry->encoder=(EncodeImageHandler *) WriteTGAImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Truevision Targa image"); + entry->magick_module=ConstantString("TGA"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("VST"); + entry->decoder=(DecodeImageHandler *) ReadTGAImage; + entry->encoder=(EncodeImageHandler *) WriteTGAImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Truevision Targa image"); + entry->magick_module=ConstantString("TGA"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r T G A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterTGAImage() removes format registrations made by the +% TGA module from the list of supported formats. +% +% The format of the UnregisterTGAImage method is: +% +% UnregisterTGAImage(void) +% +*/ +ModuleExport void UnregisterTGAImage(void) +{ + (void) UnregisterMagickInfo("ICB"); + (void) UnregisterMagickInfo("TGA"); + (void) UnregisterMagickInfo("VDA"); + (void) UnregisterMagickInfo("VST"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e T G A I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteTGAImage() writes a image in the Truevision Targa rasterfile +% format. +% +% The format of the WriteTGAImage method is: +% +% MagickBooleanType WriteTGAImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static inline void WriteTGAPixel(Image *image,TGAImageType image_type, + const IndexPacket *indexes,const PixelPacket *p,const QuantumAny range, + const double midpoint) +{ + if (image_type == TGAColormap || image_type == TGARLEColormap) + (void) WriteBlobByte(image,(unsigned char) GetPixelIndex(indexes)); + else + { + if (image_type == TGAMonochrome || image_type == TGARLEMonochrome) + (void) WriteBlobByte(image,ScaleQuantumToChar(ClampToQuantum( + GetPixelLuma(image,p)))); + else + if (image->depth == 5) + { + unsigned char + green, + value; + + green=(unsigned char) ScaleQuantumToAny(GetPixelGreen(p),range); + value=((unsigned char) ScaleQuantumToAny(GetPixelBlue(p),range)) | + ((green & 0x07) << 5); + (void) WriteBlobByte(image,value); + value=(unsigned char) ((((image->matte != MagickFalse) && + ((double) GetPixelOpacity(p) < midpoint)) ? 0x80 : 0) | + ((unsigned char) ScaleQuantumToAny(GetPixelRed(p),range) << 2) | + ((green & 0x18) >> 3)); + (void) WriteBlobByte(image,value); + } + else + { + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelBlue(p))); + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelGreen(p))); + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelRed(p))); + if (image->matte != MagickFalse) + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelAlpha(p))); + } + } +} + +static MagickBooleanType WriteTGAImage(const ImageInfo *image_info,Image *image) +{ + CompressionType + compression; + + const char + *comment, + *value; + + const double + midpoint = QuantumRange/2.0; + + MagickBooleanType + status; + + QuantumAny + range; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + i; + + unsigned char + *q; + + ssize_t + base, + count, + offset, + y; + + TGAInfo + tga_info; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + /* + Initialize TGA raster file header. + */ + if ((image->columns > 65535L) || (image->rows > 65535L)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + compression=image->compression; + if (image_info->compression != UndefinedCompression) + compression=image_info->compression; + range=GetQuantumRange(5UL); + tga_info.id_length=0; + comment=GetImageProperty(image,"comment"); + if (comment != (const char *) NULL) + tga_info.id_length=(unsigned char) MagickMin(strlen(comment),255); + tga_info.colormap_type=0; + tga_info.colormap_index=0; + tga_info.colormap_length=0; + tga_info.colormap_size=0; + tga_info.x_origin=0; + tga_info.y_origin=0; + tga_info.width=(unsigned short) image->columns; + tga_info.height=(unsigned short) image->rows; + tga_info.bits_per_pixel=8; + tga_info.attributes=0; + if ((image_info->type != TrueColorType) && + (image_info->type != TrueColorMatteType) && + (image_info->type != PaletteType) && + (image->matte == MagickFalse) && + (SetImageGray(image,&image->exception) != MagickFalse)) + tga_info.image_type=compression == RLECompression ? TGARLEMonochrome : + TGAMonochrome; + else + if ((image->storage_class == DirectClass) || (image->colors > 256)) + { + /* + Full color TGA raster. + */ + tga_info.image_type=compression == RLECompression ? TGARLERGB : TGARGB; + if (image_info->depth == 5) + { + tga_info.bits_per_pixel=16; + if (image->matte != MagickFalse) + tga_info.attributes=1; /* # of alpha bits */ + } + else + { + tga_info.bits_per_pixel=24; + if (image->matte != MagickFalse) + { + tga_info.bits_per_pixel=32; + tga_info.attributes=8; /* # of alpha bits */ + } + } + } + else + { + /* + Colormapped TGA raster. + */ + tga_info.image_type=compression == RLECompression ? TGARLEColormap : + TGAColormap; + tga_info.colormap_type=1; + tga_info.colormap_length=(unsigned short) image->colors; + if (image_info->depth == 5) + tga_info.colormap_size=16; + else + tga_info.colormap_size=24; + } + if ((image->orientation == BottomRightOrientation) || + (image->orientation == TopRightOrientation)) + tga_info.attributes|=(1UL << 4); + if ((image->orientation == TopLeftOrientation) || + (image->orientation == TopRightOrientation)) + tga_info.attributes|=(1UL << 5); + value=GetImageArtifact(image,"tga:image-origin"); /* deprecated */ + if (value != (const char *) NULL) + { + OrientationType + origin; + + origin=(OrientationType) ParseCommandOption(MagickOrientationOptions, + MagickFalse,value); + if (origin == BottomRightOrientation || origin == TopRightOrientation) + tga_info.attributes|=(1UL << 4); + if (origin == TopLeftOrientation || origin == TopRightOrientation) + tga_info.attributes|=(1UL << 5); + } + if ((image->columns > 65535) || (image->rows > 65535)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + /* + Write TGA header. + */ + (void) WriteBlobByte(image,tga_info.id_length); + (void) WriteBlobByte(image,tga_info.colormap_type); + (void) WriteBlobByte(image,(unsigned char) tga_info.image_type); + (void) WriteBlobLSBShort(image,tga_info.colormap_index); + (void) WriteBlobLSBShort(image,tga_info.colormap_length); + (void) WriteBlobByte(image,tga_info.colormap_size); + (void) WriteBlobLSBShort(image,tga_info.x_origin); + (void) WriteBlobLSBShort(image,tga_info.y_origin); + (void) WriteBlobLSBShort(image,tga_info.width); + (void) WriteBlobLSBShort(image,tga_info.height); + (void) WriteBlobByte(image,tga_info.bits_per_pixel); + (void) WriteBlobByte(image,tga_info.attributes); + if (tga_info.id_length != 0) + (void) WriteBlob(image,tga_info.id_length,(unsigned char *) comment); + if (tga_info.colormap_type != 0) + { + unsigned char + green, + *targa_colormap; + + /* + Dump colormap to file (blue, green, red byte order). + */ + targa_colormap=(unsigned char *) AcquireQuantumMemory((size_t) + tga_info.colormap_length,(tga_info.colormap_size/8)*sizeof( + *targa_colormap)); + if (targa_colormap == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + q=targa_colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + if (image_info->depth == 5) + { + green=(unsigned char) ScaleQuantumToAny(image->colormap[i].green, + range); + *q++=((unsigned char) ScaleQuantumToAny(image->colormap[i].blue, + range)) | ((green & 0x07) << 5); + *q++=(((image->matte != MagickFalse) && ( + (double) image->colormap[i].opacity < midpoint)) ? 0x80 : 0) | + ((unsigned char) ScaleQuantumToAny(image->colormap[i].red, + range) << 2) | ((green & 0x18) >> 3); + } + else + { + *q++=ScaleQuantumToChar(image->colormap[i].blue); + *q++=ScaleQuantumToChar(image->colormap[i].green); + *q++=ScaleQuantumToChar(image->colormap[i].red); + } + } + (void) WriteBlob(image,(size_t) ((tga_info.colormap_size/8)* + tga_info.colormap_length),targa_colormap); + targa_colormap=(unsigned char *) RelinquishMagickMemory(targa_colormap); + } + /* + Convert MIFF to TGA raster pixels. + */ + base=0; + offset=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,offset,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + if (compression == RLECompression) + { + x=0; + count=0; + while (x < (ssize_t) image->columns) + { + i=1; + while ((i < 128) && (count + i < 128) && + ((x + i) < (ssize_t) image->columns)) + { + if (tga_info.image_type == TGARLEColormap) + { + if (GetPixelIndex(indexes+i) != GetPixelIndex(indexes+(i-1))) + break; + } + else + if (tga_info.image_type == TGARLEMonochrome) + { + if (GetPixelLuma(image,p+i) != GetPixelLuma(image,p+(i-1))) + break; + } + else + { + if ((GetPixelBlue(p+i) != GetPixelBlue(p+(i-1))) || + (GetPixelGreen(p+i) != GetPixelGreen(p+(i-1))) || + (GetPixelRed(p+i) != GetPixelRed(p+(i-1)))) + break; + if ((image->matte != MagickFalse) && + (GetPixelAlpha(p+i) != GetPixelAlpha(p+(i-1)))) + break; + } + i++; + } + if (i < 3) + { + count+=i; + p+=i; + indexes+=i; + } + if ((i >= 3) || (count == 128) || + ((x + i) == (ssize_t) image->columns)) + { + if (count > 0) + { + (void) WriteBlobByte(image,(unsigned char) (--count)); + while (count >= 0) + { + WriteTGAPixel(image,tga_info.image_type,indexes-(count+1), + p-(count+1),range,midpoint); + count--; + } + count=0; + } + } + if (i >= 3) + { + (void) WriteBlobByte(image,(unsigned char) ((i-1) | 0x80)); + WriteTGAPixel(image,tga_info.image_type,indexes,p,range,midpoint); + p+=i; + indexes+=i; + } + x+=i; + } + } + else + for (x=0; x < (ssize_t) image->columns; x++) + WriteTGAPixel(image,tga_info.image_type,indexes == + (IndexPacket *) NULL ? NULL : indexes+x,p++,range,midpoint); + if (((unsigned char) (tga_info.attributes & 0xc0) >> 6) == 2) + offset+=2; + else + offset++; + if (offset >= (ssize_t) image->rows) + { + base++; + offset=base; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/thumbnail.c b/ImageMagick-6.9.12-44/coders/thumbnail.c new file mode 100644 index 0000000..1e2bfe8 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/thumbnail.c @@ -0,0 +1,222 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% TTTTT H H U U M M BBBB N N AAA IIIII L % +% T H H U U MM MM B B NN N A A I L % +% T HHHHH U U M M M BBBB N N N AAAAA I L % +% T H H U U M M B B N NN A A I L % +% T H H UUU M M BBBB N N A A IIIII LLLLL % +% % +% % +% Write EXIF Thumbnail To File. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteTHUMBNAILImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r T H U M B N A I L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterTHUMBNAILImage() adds attributes for the THUMBNAIL image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterTHUMBNAILImage method is: +% +% size_t RegisterTHUMBNAILImage(void) +% +*/ +ModuleExport size_t RegisterTHUMBNAILImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("THUMBNAIL"); + entry->encoder=(EncodeImageHandler *) WriteTHUMBNAILImage; + entry->description=ConstantString("EXIF Profile Thumbnail"); + entry->magick_module=ConstantString("THUMBNAIL"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r T H U M B N A I L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterTHUMBNAILImage() removes format registrations made by the +% THUMBNAIL module from the list of supported formats. +% +% The format of the UnregisterTHUMBNAILImage method is: +% +% UnregisterTHUMBNAILImage(void) +% +*/ +ModuleExport void UnregisterTHUMBNAILImage(void) +{ + (void) UnregisterMagickInfo("THUMBNAIL"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e T H U M B N A I L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteTHUMBNAILImage() extracts the EXIF thumbnail image and writes it. +% +% The format of the WriteTHUMBNAILImage method is: +% +% MagickBooleanType WriteTHUMBNAILImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteTHUMBNAILImage(const ImageInfo *image_info, + Image *image) +{ + const char + *property; + + const StringInfo + *profile; + + Image + *thumbnail_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + ssize_t + i; + + size_t + length; + + ssize_t + offset; + + unsigned char + *q; + + profile=GetImageProfile(image,"exif"); + if (profile == (const StringInfo *) NULL) + ThrowWriterException(CoderError,"ImageDoesNotHaveAThumbnail"); + property=GetImageProperty(image,"exif:JPEGInterchangeFormat"); + if (property == (const char *) NULL) + ThrowWriterException(CoderError,"ImageDoesNotHaveAThumbnail"); + offset=(ssize_t) StringToLong(property); + property=GetImageProperty(image,"exif:JPEGInterchangeFormatLength"); + if (property == (const char *) NULL) + ThrowWriterException(CoderError,"ImageDoesNotHaveAThumbnail"); + length=(size_t) StringToLong(property); + q=GetStringInfoDatum(profile)+offset; + for (i=offset; i < (ssize_t) GetStringInfoLength(profile) - 3; i++) + { + if (memcmp(q,"\377\330\377",3) == 0) + break; + q++; + } + if ((q > (GetStringInfoDatum(profile)+GetStringInfoLength(profile))) || + ((ssize_t) length > (GetStringInfoDatum(profile)+GetStringInfoLength(profile)-q))) + ThrowWriterException(CoderError,"ImageDoesNotHaveAThumbnail"); + thumbnail_image=BlobToImage(image_info,q,length,&image->exception); + if (thumbnail_image == (Image *) NULL) + return(MagickFalse); + (void) SetImageType(thumbnail_image,thumbnail_image->matte == MagickFalse ? + TrueColorType : TrueColorMatteType); + (void) CopyMagickString(thumbnail_image->filename,image->filename, + MaxTextExtent); + write_info=CloneImageInfo(image_info); + (void) SetImageInfo(write_info,1,&image->exception); + *write_info->magick='\0'; + if ((*write_info->magick == '\0') || + (LocaleCompare(write_info->magick,"THUMBNAIL") == 0)) + (void) FormatLocaleString(thumbnail_image->filename,MaxTextExtent, + "miff:%s",write_info->filename); + status=WriteImage(write_info,thumbnail_image); + thumbnail_image=DestroyImage(thumbnail_image); + write_info=DestroyImageInfo(write_info); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/tiff.c b/ImageMagick-6.9.12-44/coders/tiff.c new file mode 100644 index 0000000..b8d7b88 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/tiff.c @@ -0,0 +1,3999 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% TTTTT IIIII FFFFF FFFFF % +% T I F F % +% T I FFF FFF % +% T I F F % +% T IIIII F F % +% % +% % +% Read/Write TIFF Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#ifdef __VMS +#define JPEG_SUPPORT 1 +#endif +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/draw.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum.h" +#include "magick/quantum-private.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/semaphore.h" +#include "magick/splay-tree.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/thread_.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "psd-private.h" +#if defined(MAGICKCORE_TIFF_DELEGATE) +# if defined(MAGICKCORE_HAVE_TIFFCONF_H) +# include +# endif +# include +# include +# if !defined(COMPRESSION_ADOBE_DEFLATE) +# define COMPRESSION_ADOBE_DEFLATE 8 +# endif +# if !defined(PREDICTOR_HORIZONTAL) +# define PREDICTOR_HORIZONTAL 2 +# endif +# if !defined(TIFFTAG_COPYRIGHT) +# define TIFFTAG_COPYRIGHT 33432 +# endif +# if !defined(TIFFTAG_OPIIMAGEID) +# define TIFFTAG_OPIIMAGEID 32781 +# endif +# if defined(COMPRESSION_ZSTD) && defined(MAGICKCORE_ZSTD_DELEGATE) +# include +# endif + +#if (TIFFLIB_VERSION >= 20201219) +#if defined(MAGICKCORE_HAVE_STDINT_H) || defined(MAGICKCORE_WINDOWS_SUPPORT) +# undef uint16 +# define uint16 uint16_t +# undef uint32 +# define uint32 uint32_t +# undef uint64 +# define uint64 uint64_t +#endif +#endif + +/* + Typedef declarations. +*/ +typedef enum +{ + ReadYCCKMethod, + ReadStripMethod, + ReadTileMethod, + ReadGenericMethod +} TIFFMethodType; + +/* + Global declarations. +*/ +static MagickThreadKey + tiff_exception; + +static SemaphoreInfo + *tiff_semaphore = (SemaphoreInfo *) NULL; + +static TIFFErrorHandler + error_handler, + warning_handler; + +static volatile MagickBooleanType + instantiate_key = MagickFalse; + +/* + Forward declarations. +*/ +static Image * + ReadTIFFImage(const ImageInfo *,ExceptionInfo *); + +static MagickBooleanType + WriteGROUP4Image(const ImageInfo *,Image *), + WritePTIFImage(const ImageInfo *,Image *), + WriteTIFFImage(const ImageInfo *,Image *); + +static void InitPSDInfo(Image *image,Image *layer,PSDInfo *info) +{ + (void) memset(info,0,sizeof(*info)); + info->version=1; + info->columns=layer->columns; + info->rows=layer->rows; + info->mode=10; /* Set mode to a value that won't change the colorspace */ + /* Assume that image has matte */ + if (IsGrayImage(image,&image->exception) != MagickFalse) + info->channels=2U; + else + if (image->storage_class == PseudoClass) + { + info->mode=2; + info->channels=2U; + } + else + { + if (image->colorspace != CMYKColorspace) + info->channels=4U; + else + info->channels=5U; + } + if (image->matte == MagickFalse) + info->channels--; + info->min_channels=info->channels; + if (image->matte != MagickFalse) + info->min_channels--; +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s T I F F % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsTIFF() returns MagickTrue if the image format type, identified by the +% magick string, is TIFF. +% +% The format of the IsTIFF method is: +% +% MagickBooleanType IsTIFF(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsTIFF(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\115\115\000\052",4) == 0) + return(MagickTrue); + if (memcmp(magick,"\111\111\052\000",4) == 0) + return(MagickTrue); +#if defined(TIFF_VERSION_BIG) + if (length < 8) + return(MagickFalse); + if (memcmp(magick,"\115\115\000\053\000\010\000\000",8) == 0) + return(MagickTrue); + if (memcmp(magick,"\111\111\053\000\010\000\000\000",8) == 0) + return(MagickTrue); +#endif + return(MagickFalse); +} + +#if defined(MAGICKCORE_TIFF_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d G R O U P 4 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadGROUP4Image() reads a raw CCITT Group 4 image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadGROUP4Image method is: +% +% Image *ReadGROUP4Image(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline size_t WriteLSBLong(FILE *file,const unsigned int value) +{ + unsigned char + buffer[4]; + + buffer[0]=(unsigned char) value; + buffer[1]=(unsigned char) (value >> 8); + buffer[2]=(unsigned char) (value >> 16); + buffer[3]=(unsigned char) (value >> 24); + return(fwrite(buffer,1,4,file)); +} + +static Image *ReadGROUP4Image(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + char + filename[MaxTextExtent]; + + FILE + *file; + + Image + *image; + + ImageInfo + *read_info; + + int + c, + unique_file; + + MagickBooleanType + status; + + size_t + length; + + ssize_t + offset, + strip_offset; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Write raw CCITT Group 4 wrapped as a TIFF image file. + */ + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(filename); + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + ThrowImageException(FileOpenError,"UnableToCreateTemporaryFile"); + length=fwrite("\111\111\052\000\010\000\000\000\016\000",1,10,file); + if (length != 10) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + length=fwrite("\376\000\003\000\001\000\000\000\000\000\000\000",1,12,file); + length=fwrite("\000\001\004\000\001\000\000\000",1,8,file); + length=WriteLSBLong(file,(unsigned int) image->columns); + length=fwrite("\001\001\004\000\001\000\000\000",1,8,file); + length=WriteLSBLong(file,(unsigned int) image->rows); + length=fwrite("\002\001\003\000\001\000\000\000\001\000\000\000",1,12,file); + length=fwrite("\003\001\003\000\001\000\000\000\004\000\000\000",1,12,file); + length=fwrite("\006\001\003\000\001\000\000\000\000\000\000\000",1,12,file); + length=fwrite("\021\001\003\000\001\000\000\000",1,8,file); + strip_offset=10+(12*14)+4+8; + length=WriteLSBLong(file,(unsigned int) strip_offset); + length=fwrite("\022\001\003\000\001\000\000\000",1,8,file); + length=WriteLSBLong(file,(unsigned int) image_info->orientation); + length=fwrite("\025\001\003\000\001\000\000\000\001\000\000\000",1,12,file); + length=fwrite("\026\001\004\000\001\000\000\000",1,8,file); + length=WriteLSBLong(file,(unsigned int) image->rows); + length=fwrite("\027\001\004\000\001\000\000\000\000\000\000\000",1,12,file); + offset=(ssize_t) ftell(file)-4; + length=fwrite("\032\001\005\000\001\000\000\000",1,8,file); + length=WriteLSBLong(file,(unsigned int) (strip_offset-8)); + length=fwrite("\033\001\005\000\001\000\000\000",1,8,file); + length=WriteLSBLong(file,(unsigned int) (strip_offset-8)); + length=fwrite("\050\001\003\000\001\000\000\000\002\000\000\000",1,12,file); + length=fwrite("\000\000\000\000",1,4,file); + length=WriteLSBLong(file,(unsigned int) image->x_resolution); + length=WriteLSBLong(file,1); + status=MagickTrue; + for (length=0; (c=ReadBlobByte(image)) != EOF; length++) + if (fputc(c,file) != c) + status=MagickFalse; + offset=(ssize_t) fseek(file,(ssize_t) offset,SEEK_SET); + length=WriteLSBLong(file,(unsigned int) length); + if (ferror(file) != 0) + { + (void) fclose(file); + ThrowImageException(FileOpenError,"UnableToCreateTemporaryFile"); + } + (void) fclose(file); + (void) CloseBlob(image); + image=DestroyImage(image); + /* + Read TIFF image. + */ + read_info=CloneImageInfo((ImageInfo *) NULL); + (void) FormatLocaleString(read_info->filename,MaxTextExtent,"%s",filename); + image=ReadTIFFImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (image != (Image *) NULL) + { + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick_filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick,"GROUP4",MaxTextExtent); + } + (void) RelinquishUniqueFileResource(filename); + if (status == MagickFalse) + image=DestroyImage(image); + return(image); +} +#endif + +#if defined(MAGICKCORE_TIFF_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d T I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadTIFFImage() reads a Tagged image file and returns it. It allocates the +% memory necessary for the new Image structure and returns a pointer to the +% new image. +% +% The format of the ReadTIFFImage method is: +% +% Image *ReadTIFFImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline unsigned char ClampYCC(double value) +{ + value=255.0-value; + if (value < 0.0) + return((unsigned char)0); + if (value > 255.0) + return((unsigned char)255); + return((unsigned char)(value)); +} + +static MagickBooleanType DecodeLabImage(Image *image,ExceptionInfo *exception) +{ + CacheView + *image_view; + + MagickBooleanType + status; + + ssize_t + y; + + status=MagickTrue; + image_view=AcquireAuthenticCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + double + a, + b; + + a=QuantumScale*GetPixela(q)+0.5; + if (a > 1.0) + a-=1.0; + b=QuantumScale*GetPixelb(q)+0.5; + if (b > 1.0) + b-=1.0; + SetPixela(q,QuantumRange*a); + SetPixelb(q,QuantumRange*b); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + { + status=MagickFalse; + break; + } + } + image_view=DestroyCacheView(image_view); + return(status); +} + +static MagickBooleanType ReadProfile(Image *image,const char *name, + const unsigned char *datum,ssize_t length) +{ + MagickBooleanType + status; + + StringInfo + *profile; + + if (length < 4) + return(MagickFalse); + profile=BlobToStringInfo(datum,(size_t) length); + if (profile == (StringInfo *) NULL) + ThrowBinaryImageException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + status=SetImageProfile(image,name,profile); + profile=DestroyStringInfo(profile); + return(status); +} + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static int TIFFCloseBlob(thandle_t image) +{ + (void) CloseBlob((Image *) image); + return(0); +} + +static void TIFFErrors(const char *,const char *,va_list) + magick_attribute((__format__ (__printf__,2,0))); + +static void TIFFErrors(const char *module,const char *format,va_list error) +{ + char + message[MaxTextExtent]; + + ExceptionInfo + *exception; + +#if defined(MAGICKCORE_HAVE_VSNPRINTF) + (void) vsnprintf(message,MaxTextExtent-2,format,error); +#else + (void) vsprintf(message,format,error); +#endif + message[MaxTextExtent-2]='\0'; + (void) ConcatenateMagickString(message,".",MaxTextExtent); + exception=(ExceptionInfo *) GetMagickThreadValue(tiff_exception); + if (exception != (ExceptionInfo *) NULL) + (void) ThrowMagickException(exception,GetMagickModule(),CoderError,message, + "`%s'",module); +} + +static toff_t TIFFGetBlobSize(thandle_t image) +{ + return((toff_t) GetBlobSize((Image *) image)); +} + +static MagickBooleanType TIFFGetProfiles(TIFF *tiff,Image *image) +{ + MagickBooleanType + status; + + uint32 + length = 0; + + unsigned char + *profile = (unsigned char *) NULL; + + status=MagickTrue; +#if defined(TIFFTAG_ICCPROFILE) + if ((TIFFGetField(tiff,TIFFTAG_ICCPROFILE,&length,&profile) == 1) && + (profile != (unsigned char *) NULL)) + status=ReadProfile(image,"icc",profile,(ssize_t) length); +#endif +#if defined(TIFFTAG_PHOTOSHOP) + if ((TIFFGetField(tiff,TIFFTAG_PHOTOSHOP,&length,&profile) == 1) && + (profile != (unsigned char *) NULL)) + status=ReadProfile(image,"8bim",profile,(ssize_t) length); +#endif +#if defined(TIFFTAG_RICHTIFFIPTC) && (TIFFLIB_VERSION >= 20191103) + if ((TIFFGetField(tiff,TIFFTAG_RICHTIFFIPTC,&length,&profile) == 1) && + (profile != (unsigned char *) NULL)) + { + const TIFFField + *field; + + field=TIFFFieldWithTag(tiff,TIFFTAG_RICHTIFFIPTC); + if (TIFFFieldDataType(field) != TIFF_LONG) + status=ReadProfile(image,"iptc",profile,length); + else + { + if (TIFFIsByteSwapped(tiff) != 0) + TIFFSwabArrayOfLong((uint32 *) profile,(size_t) length); + status=ReadProfile(image,"iptc",profile,4L*length); + } + } +#endif +#if defined(TIFFTAG_XMLPACKET) + if ((TIFFGetField(tiff,TIFFTAG_XMLPACKET,&length,&profile) == 1) && + (profile != (unsigned char *) NULL)) + { + StringInfo + *dng; + + status=ReadProfile(image,"xmp",profile,(ssize_t) length); + dng=BlobToStringInfo(profile,length); + if (dng != (StringInfo *) NULL) + { + const char + *target = "dc:format=\"image/dng\""; + + if (strstr((char *) GetStringInfoDatum(dng),target) != (char *) NULL) + (void) CopyMagickString(image->magick,"DNG",MagickPathExtent); + dng=DestroyStringInfo(dng); + } + } +#endif + if ((TIFFGetField(tiff,34118,&length,&profile) == 1) && + (profile != (unsigned char *) NULL)) + status=ReadProfile(image,"tiff:34118",profile,(ssize_t) length); + if ((TIFFGetField(tiff,37724,&length,&profile) == 1) && + (profile != (unsigned char *) NULL)) + status=ReadProfile(image,"tiff:37724",profile,(ssize_t) length); + return(status); +} + +static MagickBooleanType TIFFGetProperties(TIFF *tiff,Image *image) +{ + char + message[MaxTextExtent], + *text = (char *) NULL; + + MagickBooleanType + status; + + uint32 + count, + type; + + status=MagickTrue; + if ((TIFFGetField(tiff,TIFFTAG_ARTIST,&text) == 1) && + (text != (char *) NULL)) + status=SetImageProperty(image,"tiff:artist",text); + if ((TIFFGetField(tiff,TIFFTAG_COPYRIGHT,&text) == 1) && + (text != (char *) NULL)) + status=SetImageProperty(image,"tiff:copyright",text); + if ((TIFFGetField(tiff,TIFFTAG_DATETIME,&text) == 1) && + (text != (char *) NULL)) + status=SetImageProperty(image,"tiff:timestamp",text); + if ((TIFFGetField(tiff,TIFFTAG_DOCUMENTNAME,&text) == 1) && + (text != (char *) NULL)) + status=SetImageProperty(image,"tiff:document",text); + if ((TIFFGetField(tiff,TIFFTAG_HOSTCOMPUTER,&text) == 1) && + (text != (char *) NULL)) + status=SetImageProperty(image,"tiff:hostcomputer",text); + if ((TIFFGetField(tiff,TIFFTAG_IMAGEDESCRIPTION,&text) == 1) && + (text != (char *) NULL)) + status=SetImageProperty(image,"comment",text); + if ((TIFFGetField(tiff,TIFFTAG_MAKE,&text) == 1) && + (text != (char *) NULL)) + status=SetImageProperty(image,"tiff:make",text); + if ((TIFFGetField(tiff,TIFFTAG_MODEL,&text) == 1) && + (text != (char *) NULL)) + status=SetImageProperty(image,"tiff:model",text); + if ((TIFFGetField(tiff,TIFFTAG_OPIIMAGEID,&count,&text) == 1) && + (text != (char *) NULL)) + { + if (count >= MaxTextExtent) + count=MaxTextExtent-1; + (void) CopyMagickString(message,text,count+1); + status=SetImageProperty(image,"tiff:image-id",message); + } + if ((TIFFGetField(tiff,TIFFTAG_PAGENAME,&text) == 1) && + (text != (char *) NULL)) + status=SetImageProperty(image,"label",text); + if ((TIFFGetField(tiff,TIFFTAG_SOFTWARE,&text) == 1) && + (text != (char *) NULL)) + status=SetImageProperty(image,"tiff:software",text); + if ((TIFFGetField(tiff,33423,&count,&text) == 1) && (text != (char *) NULL)) + { + if (count >= MaxTextExtent) + count=MaxTextExtent-1; + (void) CopyMagickString(message,text,count+1); + status=SetImageProperty(image,"tiff:kodak-33423",message); + } + if ((TIFFGetField(tiff,36867,&count,&text) == 1) && (text != (char *) NULL)) + { + if (count >= MaxTextExtent) + count=MaxTextExtent-1; + (void) CopyMagickString(message,text,count+1); + status=SetImageProperty(image,"tiff:kodak-36867",message); + } + if (TIFFGetField(tiff,TIFFTAG_SUBFILETYPE,&type) == 1) + switch (type) + { + case 0x01: + { + status=SetImageProperty(image,"tiff:subfiletype","REDUCEDIMAGE"); + break; + } + case 0x02: + { + status=SetImageProperty(image,"tiff:subfiletype","PAGE"); + break; + } + case 0x04: + { + status=SetImageProperty(image,"tiff:subfiletype","MASK"); + break; + } + default: + break; + } + return(status); +} + +static MagickBooleanType TIFFSetImageProperties(TIFF *tiff,Image *image, + const char *tag) +{ + char + buffer[MagickPathExtent], + filename[MagickPathExtent]; + + FILE + *file; + + int + unique_file; + + /* + Set EXIF or GPS image properties. + */ + unique_file=AcquireUniqueFileResource(filename); + file=(FILE *) NULL; + if (unique_file != -1) + file=fdopen(unique_file,"rb+"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + { + (void) RelinquishUniqueFileResource(filename); + (void) ThrowMagickException(&image->exception,GetMagickModule(),WandError, + "UnableToCreateTemporaryFile","`%s'",filename); + return(MagickFalse); + } + TIFFPrintDirectory(tiff,file,0); + (void) fseek(file,0,SEEK_SET); + while (fgets(buffer,(int) sizeof(buffer),file) != NULL) + { + char + *p, + property[MagickPathExtent], + value[MagickPathExtent]; + + StripString(buffer); + p=strchr(buffer,':'); + if (p == (char *) NULL) + continue; + *p='\0'; + (void) sprintf(property,"%s%.1024s",tag,buffer); + (void) sprintf(value,"%s",p+1); + StripString(value); + (void) SetImageProperty(image,property,value); + } + (void) fclose(file); + (void) RelinquishUniqueFileResource(filename); + return(MagickTrue); +} + +static MagickBooleanType TIFFGetEXIFProperties(TIFF *tiff,Image *image) +{ +#if defined(MAGICKCORE_HAVE_TIFFREADEXIFDIRECTORY) + MagickBooleanType + status; + + tdir_t + directory; + +#if defined(TIFF_VERSION_BIG) + uint64 +#else + uint32 +#endif + offset; + + /* + Read EXIF properties. + */ + offset=0; + if (TIFFGetField(tiff,TIFFTAG_EXIFIFD,&offset) != 1) + return(MagickFalse); + directory=TIFFCurrentDirectory(tiff); + if (TIFFReadEXIFDirectory(tiff,offset) != 1) + { + TIFFSetDirectory(tiff,directory); + return(MagickFalse); + } + status=TIFFSetImageProperties(tiff,image,"exif:"); + TIFFSetDirectory(tiff,directory); + return(status); +#else + (void) tiff; + (void) image; + return(MagickTrue); +#endif +} + +static MagickBooleanType TIFFGetGPSProperties(TIFF *tiff,Image *image) +{ +#if defined(MAGICKCORE_HAVE_TIFFREADGPSDIRECTORY) + MagickBooleanType + status; + + tdir_t + directory; + +#if defined(TIFF_VERSION_BIG) + uint64 +#else + uint32 +#endif + offset; + + /* + Read GPS properties. + */ + offset=0; + if (TIFFGetField(tiff,TIFFTAG_GPSIFD,&offset) != 1) + return(MagickFalse); + directory=TIFFCurrentDirectory(tiff); + if (TIFFReadGPSDirectory(tiff,offset) != 1) + { + TIFFSetDirectory(tiff,directory); + return(MagickFalse); + } + status=TIFFSetImageProperties(tiff,image,"exif:GPS"); + TIFFSetDirectory(tiff,directory); + return(status); +#else + (void) tiff; + (void) image; + return(MagickTrue); +#endif +} + +static int TIFFMapBlob(thandle_t image,tdata_t *base,toff_t *size) +{ + *base=(tdata_t *) GetBlobStreamData((Image *) image); + if (*base != (tdata_t *) NULL) + *size=(toff_t) GetBlobSize((Image *) image); + if (*base != (tdata_t *) NULL) + return(1); + return(0); +} + +static tsize_t TIFFReadBlob(thandle_t image,tdata_t data,tsize_t size) +{ + tsize_t + count; + + count=(tsize_t) ReadBlob((Image *) image,(size_t) size, + (unsigned char *) data); + return(count); +} + +static int TIFFReadPixels(TIFF *tiff,const tsample_t sample,const ssize_t row, + tdata_t scanline) +{ + int + status; + + status=TIFFReadScanline(tiff,scanline,(uint32) row,sample); + return(status); +} + +static toff_t TIFFSeekBlob(thandle_t image,toff_t offset,int whence) +{ + return((toff_t) SeekBlob((Image *) image,(MagickOffsetType) offset,whence)); +} + +static void TIFFUnmapBlob(thandle_t image,tdata_t base,toff_t size) +{ + (void) image; + (void) base; + (void) size; +} + +static void TIFFWarnings(const char *,const char *,va_list) + magick_attribute((__format__ (__printf__,2,0))); + +static void TIFFWarnings(const char *module,const char *format,va_list warning) +{ + char + message[MaxTextExtent]; + + ExceptionInfo + *exception; + +#if defined(MAGICKCORE_HAVE_VSNPRINTF) + (void) vsnprintf(message,MaxTextExtent,format,warning); +#else + (void) vsprintf(message,format,warning); +#endif + message[MaxTextExtent-2]='\0'; + (void) ConcatenateMagickString(message,".",MaxTextExtent); + exception=(ExceptionInfo *) GetMagickThreadValue(tiff_exception); + if (exception != (ExceptionInfo *) NULL) + (void) ThrowMagickException(exception,GetMagickModule(),CoderWarning, + message,"`%s'",module); +} + +static tsize_t TIFFWriteBlob(thandle_t image,tdata_t data,tsize_t size) +{ + tsize_t + count; + + count=(tsize_t) WriteBlob((Image *) image,(size_t) size, + (unsigned char *) data); + return(count); +} + +static TIFFMethodType GetJPEGMethod(Image* image,TIFF *tiff,uint16 photometric, + uint16 bits_per_sample,uint16 samples_per_pixel) +{ +#define BUFFER_SIZE 2048 + + MagickOffsetType + position, + offset; + + size_t + i; + + TIFFMethodType + method; + +#if defined(TIFF_VERSION_BIG) + uint64 + *value = (uint64 *) NULL; +#else + uint32 + *value = (uint32 *) NULL; +#endif + + unsigned char + buffer[BUFFER_SIZE+32]; + + unsigned short + length; + + /* + Only support 8 bit for now. + */ + if ((photometric != PHOTOMETRIC_SEPARATED) || (bits_per_sample != 8) || + (samples_per_pixel != 4)) + return(ReadGenericMethod); + /* + Search for Adobe APP14 JPEG marker. + */ + if (!TIFFGetField(tiff,TIFFTAG_STRIPOFFSETS,&value) || (value == NULL)) + return(ReadStripMethod); + position=TellBlob(image); + offset=(MagickOffsetType) (value[0]); + if (SeekBlob(image,offset,SEEK_SET) != offset) + return(ReadStripMethod); + method=ReadStripMethod; + if (ReadBlob(image,BUFFER_SIZE,buffer) == BUFFER_SIZE) + { + for (i=0; i < BUFFER_SIZE; i++) + { + while (i < BUFFER_SIZE) + { + if (buffer[i++] == 255) + break; + } + while (i < BUFFER_SIZE) + { + if (buffer[++i] != 255) + break; + } + if (buffer[i++] == 216) /* JPEG_MARKER_SOI */ + continue; + length=(unsigned short) (((unsigned int) (buffer[i] << 8) | + (unsigned int) buffer[i+1]) & 0xffff); + if (i+(size_t) length >= BUFFER_SIZE) + break; + if (buffer[i-1] == 238) /* JPEG_MARKER_APP0+14 */ + { + if (length != 14) + break; + /* 0 == CMYK, 1 == YCbCr, 2 = YCCK */ + if (buffer[i+13] == 2) + method=ReadYCCKMethod; + break; + } + i+=(size_t) length; + } + } + (void) SeekBlob(image,position,SEEK_SET); + return(method); +} + +static void TIFFReadPhotoshopLayers(const ImageInfo *image_info,Image *image, + ExceptionInfo *exception) +{ + const char + *option; + + const StringInfo + *profile; + + Image + *layers; + + ImageInfo + *clone_info; + + PSDInfo + info; + + ssize_t + i; + + if (GetImageListLength(image) != 1) + return; + if ((image_info->number_scenes == 1) && (image_info->scene == 0)) + return; + option=GetImageOption(image_info,"tiff:ignore-layers"); + if (option != (const char * ) NULL) + return; + profile=GetImageProfile(image,"tiff:37724"); + if (profile == (const StringInfo *) NULL) + return; + for (i=0; i < (ssize_t) profile->length-8; i++) + { + if (LocaleNCompare((const char *) (profile->datum+i), + image->endian == MSBEndian ? "8BIM" : "MIB8",4) != 0) + continue; + i+=4; + if ((LocaleNCompare((const char *) (profile->datum+i), + image->endian == MSBEndian ? "Layr" : "ryaL",4) == 0) || + (LocaleNCompare((const char *) (profile->datum+i), + image->endian == MSBEndian ? "LMsk" : "ksML",4) == 0) || + (LocaleNCompare((const char *) (profile->datum+i), + image->endian == MSBEndian ? "Lr16" : "61rL",4) == 0) || + (LocaleNCompare((const char *) (profile->datum+i), + image->endian == MSBEndian ? "Lr32" : "23rL",4) == 0)) + break; + } + i+=4; + if (i >= (ssize_t) (profile->length-8)) + return; + layers=CloneImage(image,0,0,MagickTrue,exception); + (void) DeleteImageProfile(layers,"tiff:37724"); + AttachBlob(layers->blob,profile->datum,profile->length); + SeekBlob(layers,(MagickOffsetType) i,SEEK_SET); + InitPSDInfo(image,layers,&info); + clone_info=CloneImageInfo(image_info); + clone_info->number_scenes=0; + (void) ReadPSDLayers(layers,clone_info,&info,MagickFalse,exception); + clone_info=DestroyImageInfo(clone_info); + /* we need to set the datum in case a realloc happend */ + ((StringInfo *) profile)->datum=GetBlobStreamData(layers); + InheritException(exception,&layers->exception); + DeleteImageFromList(&layers); + if (layers != (Image *) NULL) + { + SetImageArtifact(image,"tiff:has-layers","true"); + AppendImageToList(&image,layers); + while (layers != (Image *) NULL) + { + SetImageArtifact(layers,"tiff:has-layers","true"); + DetachBlob(layers->blob); + layers=GetNextImageInList(layers); + } + } +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +static Image *ReadTIFFImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ +#define MaxPixelChannels 32 +#define ThrowTIFFException(severity,message) \ +{ \ + if (pixel_info != (MemoryInfo *) NULL) \ + pixel_info=RelinquishVirtualMemory(pixel_info); \ + if (quantum_info != (QuantumInfo *) NULL) \ + quantum_info=DestroyQuantumInfo(quantum_info); \ + TIFFClose(tiff); \ + ThrowReaderException(severity,message); \ +} + + const char + *option; + + float + *chromaticity = (float *) NULL, + x_position, + y_position, + x_resolution, + y_resolution; + + Image + *image; + + int + tiff_status = 0; + + MagickBooleanType + more_frames; + + MagickStatusType + status; + + MemoryInfo + *pixel_info = (MemoryInfo *) NULL; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + size_t + number_pixels; + + ssize_t + i, + scanline_size, + y; + + TIFF + *tiff; + + TIFFMethodType + method; + + uint16 + compress_tag = 0, + bits_per_sample = 0, + endian = 0, + extra_samples = 0, + interlace = 0, + max_sample_value = 0, + min_sample_value = 0, + orientation = 0, + pages = 0, + photometric = 0, + *sample_info = NULL, + sample_format = 0, + samples_per_pixel = 0, + units = 0, + value = 0; + + uint32 + height, + rows_per_strip, + width; + + unsigned char + *pixels; + + void + *sans[8] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; + + /* + Open image. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + (void) SetMagickThreadValue(tiff_exception,exception); + tiff=TIFFClientOpen(image->filename,"rb",(thandle_t) image,TIFFReadBlob, + TIFFWriteBlob,TIFFSeekBlob,TIFFCloseBlob,TIFFGetBlobSize,TIFFMapBlob, + TIFFUnmapBlob); + if (tiff == (TIFF *) NULL) + { + if (exception->severity == UndefinedException) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + image=DestroyImageList(image); + return((Image *) NULL); + } + if (exception->severity > ErrorException) + { + TIFFClose(tiff); + image=DestroyImageList(image); + return((Image *) NULL); + } + if (image_info->number_scenes != 0) + { + /* + Generate blank images for subimage specification (e.g. image.tif[4]. + We need to check the number of directores because it is possible that + the subimage(s) are stored in the photoshop profile. + */ + if (image_info->scene < (size_t)TIFFNumberOfDirectories(tiff)) + { + for (i=0; i < (ssize_t) image_info->scene; i++) + { + status=TIFFReadDirectory(tiff) != 0 ? MagickTrue : MagickFalse; + if (status == MagickFalse) + { + TIFFClose(tiff); + image=DestroyImageList(image); + return((Image *) NULL); + } + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + TIFFClose(tiff); + image=DestroyImageList(image); + return((Image *) NULL); + } + image=SyncNextImageInList(image); + } + } + } + more_frames=MagickTrue; + do + { + /* TIFFPrintDirectory(tiff,stdout,MagickFalse); */ + photometric=PHOTOMETRIC_RGB; + if ((TIFFGetField(tiff,TIFFTAG_IMAGEWIDTH,&width) != 1) || + (TIFFGetField(tiff,TIFFTAG_IMAGELENGTH,&height) != 1) || + (TIFFGetFieldDefaulted(tiff,TIFFTAG_PHOTOMETRIC,&photometric,sans) != 1) || + (TIFFGetFieldDefaulted(tiff,TIFFTAG_COMPRESSION,&compress_tag,sans) != 1) || + (TIFFGetFieldDefaulted(tiff,TIFFTAG_FILLORDER,&endian,sans) != 1) || + (TIFFGetFieldDefaulted(tiff,TIFFTAG_PLANARCONFIG,&interlace,sans) != 1) || + (TIFFGetFieldDefaulted(tiff,TIFFTAG_SAMPLESPERPIXEL,&samples_per_pixel,sans) != 1) || + (TIFFGetFieldDefaulted(tiff,TIFFTAG_BITSPERSAMPLE,&bits_per_sample,sans) != 1) || + (TIFFGetFieldDefaulted(tiff,TIFFTAG_SAMPLEFORMAT,&sample_format,sans) != 1) || + (TIFFGetFieldDefaulted(tiff,TIFFTAG_MINSAMPLEVALUE,&min_sample_value,sans) != 1) || + (TIFFGetFieldDefaulted(tiff,TIFFTAG_MAXSAMPLEVALUE,&max_sample_value,sans) != 1)) + { + TIFFClose(tiff); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + if (((sample_format != SAMPLEFORMAT_IEEEFP) || (bits_per_sample != 64)) && + ((bits_per_sample <= 0) || (bits_per_sample > 32))) + { + TIFFClose(tiff); + ThrowReaderException(CorruptImageError,"UnsupportedBitsPerPixel"); + } + if (samples_per_pixel > MaxPixelChannels) + { + TIFFClose(tiff); + ThrowReaderException(CorruptImageError,"MaximumChannelsExceeded"); + } + if (sample_format == SAMPLEFORMAT_IEEEFP) + (void) SetImageProperty(image,"quantum:format","floating-point"); + switch (photometric) + { + case PHOTOMETRIC_MINISBLACK: + { + (void) SetImageProperty(image,"tiff:photometric","min-is-black"); + break; + } + case PHOTOMETRIC_MINISWHITE: + { + (void) SetImageProperty(image,"tiff:photometric","min-is-white"); + break; + } + case PHOTOMETRIC_PALETTE: + { + (void) SetImageProperty(image,"tiff:photometric","palette"); + break; + } + case PHOTOMETRIC_RGB: + { + (void) SetImageProperty(image,"tiff:photometric","RGB"); + break; + } + case PHOTOMETRIC_CIELAB: + { + (void) SetImageProperty(image,"tiff:photometric","CIELAB"); + break; + } + case PHOTOMETRIC_LOGL: + { + (void) SetImageProperty(image,"tiff:photometric","CIE Log2(L)"); + break; + } + case PHOTOMETRIC_LOGLUV: + { + (void) SetImageProperty(image,"tiff:photometric","LOGLUV"); + break; + } +#if defined(PHOTOMETRIC_MASK) + case PHOTOMETRIC_MASK: + { + (void) SetImageProperty(image,"tiff:photometric","MASK"); + break; + } +#endif + case PHOTOMETRIC_SEPARATED: + { + (void) SetImageProperty(image,"tiff:photometric","separated"); + break; + } + case PHOTOMETRIC_YCBCR: + { + (void) SetImageProperty(image,"tiff:photometric","YCBCR"); + break; + } + default: + { + (void) SetImageProperty(image,"tiff:photometric","unknown"); + break; + } + } + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Geometry: %ux%u", + (unsigned int) width,(unsigned int) height); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Interlace: %u", + interlace); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Bits per sample: %u",bits_per_sample); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Min sample value: %u",min_sample_value); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Max sample value: %u",max_sample_value); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Photometric " + "interpretation: %s",GetImageProperty(image,"tiff:photometric")); + } + image->columns=(size_t) width; + image->rows=(size_t) height; + image->depth=(size_t) bits_per_sample; + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Image depth: %.20g", + (double) image->depth); + image->endian=MSBEndian; + if (endian == FILLORDER_LSB2MSB) + image->endian=LSBEndian; +#if defined(MAGICKCORE_HAVE_TIFFISBIGENDIAN) + if (TIFFIsBigEndian(tiff) == 0) + { + (void) SetImageProperty(image,"tiff:endian","lsb"); + image->endian=LSBEndian; + } + else + { + (void) SetImageProperty(image,"tiff:endian","msb"); + image->endian=MSBEndian; + } +#endif + if ((photometric == PHOTOMETRIC_MINISBLACK) || + (photometric == PHOTOMETRIC_MINISWHITE)) + image->colorspace=GRAYColorspace; + if (photometric == PHOTOMETRIC_SEPARATED) + image->colorspace=CMYKColorspace; + if (photometric == PHOTOMETRIC_CIELAB) + image->colorspace=LabColorspace; + if ((photometric == PHOTOMETRIC_YCBCR) && + (compress_tag != COMPRESSION_OJPEG) && + (compress_tag != COMPRESSION_JPEG)) + image->colorspace=YCbCrColorspace; + status=TIFFGetProfiles(tiff,image); + if (status == MagickFalse) + { + TIFFClose(tiff); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + status=TIFFGetProperties(tiff,image); + if (status == MagickFalse) + { + TIFFClose(tiff); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + option=GetImageOption(image_info,"tiff:exif-properties"); + if ((option == (const char *) NULL) || + (IsMagickTrue(option) != MagickFalse)) + (void) TIFFGetEXIFProperties(tiff,image); + option=GetImageOption(image_info,"tiff:gps-properties"); + if ((option == (const char *) NULL) || + (IsMagickTrue(option) != MagickFalse)) + (void) TIFFGetGPSProperties(tiff,image); + if ((TIFFGetFieldDefaulted(tiff,TIFFTAG_XRESOLUTION,&x_resolution,sans) == 1) && + (TIFFGetFieldDefaulted(tiff,TIFFTAG_YRESOLUTION,&y_resolution,sans) == 1)) + { + image->x_resolution=x_resolution; + image->y_resolution=y_resolution; + } + if (TIFFGetFieldDefaulted(tiff,TIFFTAG_RESOLUTIONUNIT,&units,sans,sans) == 1) + { + if (units == RESUNIT_INCH) + image->units=PixelsPerInchResolution; + if (units == RESUNIT_CENTIMETER) + image->units=PixelsPerCentimeterResolution; + } + if ((TIFFGetFieldDefaulted(tiff,TIFFTAG_XPOSITION,&x_position,sans) == 1) && + (TIFFGetFieldDefaulted(tiff,TIFFTAG_YPOSITION,&y_position,sans) == 1)) + { + image->page.x=CastDoubleToLong(ceil(x_position* + image->x_resolution-0.5)); + image->page.y=CastDoubleToLong(ceil(y_position* + image->y_resolution-0.5)); + } + if (TIFFGetFieldDefaulted(tiff,TIFFTAG_ORIENTATION,&orientation,sans) == 1) + image->orientation=(OrientationType) orientation; + if (TIFFGetField(tiff,TIFFTAG_WHITEPOINT,&chromaticity) == 1) + { + if ((chromaticity != (float *) NULL) && (*chromaticity != 0.0)) + { + image->chromaticity.white_point.x=chromaticity[0]; + image->chromaticity.white_point.y=chromaticity[1]; + } + } + if (TIFFGetField(tiff,TIFFTAG_PRIMARYCHROMATICITIES,&chromaticity) == 1) + { + if ((chromaticity != (float *) NULL) && (*chromaticity != 0.0)) + { + image->chromaticity.red_primary.x=chromaticity[0]; + image->chromaticity.red_primary.y=chromaticity[1]; + image->chromaticity.green_primary.x=chromaticity[2]; + image->chromaticity.green_primary.y=chromaticity[3]; + image->chromaticity.blue_primary.x=chromaticity[4]; + image->chromaticity.blue_primary.y=chromaticity[5]; + } + } +#if defined(MAGICKCORE_HAVE_TIFFISCODECCONFIGURED) || (TIFFLIB_VERSION > 20040919) + if ((compress_tag != COMPRESSION_NONE) && + (TIFFIsCODECConfigured(compress_tag) == 0)) + { + TIFFClose(tiff); + ThrowReaderException(CoderError,"CompressNotSupported"); + } +#endif + switch (compress_tag) + { + case COMPRESSION_NONE: image->compression=NoCompression; break; + case COMPRESSION_CCITTFAX3: image->compression=FaxCompression; break; + case COMPRESSION_CCITTFAX4: image->compression=Group4Compression; break; + case COMPRESSION_JPEG: + { + image->compression=JPEGCompression; +#if defined(JPEG_SUPPORT) + { + char + sampling_factor[MaxTextExtent]; + + int + tiff_status; + + uint16 + horizontal, + vertical; + + tiff_status=TIFFGetField(tiff,TIFFTAG_YCBCRSUBSAMPLING,&horizontal, + &vertical); + if (tiff_status == 1) + { + (void) FormatLocaleString(sampling_factor,MaxTextExtent,"%dx%d", + horizontal,vertical); + (void) SetImageProperty(image,"jpeg:sampling-factor", + sampling_factor); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Sampling Factors: %s",sampling_factor); + } + } +#endif + break; + } + case COMPRESSION_OJPEG: image->compression=JPEGCompression; break; +#if defined(COMPRESSION_LZMA) + case COMPRESSION_LZMA: image->compression=LZMACompression; break; +#endif + case COMPRESSION_LZW: image->compression=LZWCompression; break; + case COMPRESSION_DEFLATE: image->compression=ZipCompression; break; + case COMPRESSION_ADOBE_DEFLATE: image->compression=ZipCompression; break; +#if defined(COMPRESSION_WEBP) + case COMPRESSION_WEBP: image->compression=WebPCompression; break; +#endif +#if defined(COMPRESSION_ZSTD) + case COMPRESSION_ZSTD: image->compression=ZstdCompression; break; +#endif + default: image->compression=RLECompression; break; + } + quantum_info=(QuantumInfo *) NULL; + if ((photometric == PHOTOMETRIC_PALETTE) && + (pow(2.0,1.0*bits_per_sample) <= MaxColormapSize)) + { + size_t + colors; + + colors=(size_t) GetQuantumRange(bits_per_sample)+1; + if (AcquireImageColormap(image,colors) == MagickFalse) + { + TIFFClose(tiff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + if (TIFFGetFieldDefaulted(tiff,TIFFTAG_PAGENUMBER,&value,&pages,sans) == 1) + image->scene=value; + if (image->storage_class == PseudoClass) + { + int + tiff_status; + + size_t + range; + + uint16 + *blue_colormap = (uint16 *) NULL, + *green_colormap = (uint16 *) NULL, + *red_colormap = (uint16 *) NULL; + + /* + Initialize colormap. + */ + tiff_status=TIFFGetField(tiff,TIFFTAG_COLORMAP,&red_colormap, + &green_colormap,&blue_colormap); + if (tiff_status == 1) + { + if ((red_colormap != (uint16 *) NULL) && + (green_colormap != (uint16 *) NULL) && + (blue_colormap != (uint16 *) NULL)) + { + range=255; /* might be old style 8-bit colormap */ + for (i=0; i < (ssize_t) image->colors; i++) + if ((red_colormap[i] >= 256) || (green_colormap[i] >= 256) || + (blue_colormap[i] >= 256)) + { + range=65535; + break; + } + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=ClampToQuantum(((double) + QuantumRange*red_colormap[i])/range); + image->colormap[i].green=ClampToQuantum(((double) + QuantumRange*green_colormap[i])/range); + image->colormap[i].blue=ClampToQuantum(((double) + QuantumRange*blue_colormap[i])/range); + } + } + } + } + if (image_info->ping != MagickFalse) + { + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + goto next_tiff_frame; + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + TIFFClose(tiff); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + status=SetImageColorspace(image,image->colorspace); + status&=ResetImagePixels(image,exception); + if (status == MagickFalse) + { + TIFFClose(tiff); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Allocate memory for the image and pixel buffer. + */ + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowTIFFException(ResourceLimitError,"MemoryAllocationFailed"); + if (sample_format == SAMPLEFORMAT_UINT) + status=SetQuantumFormat(image,quantum_info,UnsignedQuantumFormat); + if (sample_format == SAMPLEFORMAT_INT) + status=SetQuantumFormat(image,quantum_info,SignedQuantumFormat); + if (sample_format == SAMPLEFORMAT_IEEEFP) + status=SetQuantumFormat(image,quantum_info,FloatingPointQuantumFormat); + if (status == MagickFalse) + ThrowTIFFException(ResourceLimitError,"MemoryAllocationFailed"); + status=MagickTrue; + switch (photometric) + { + case PHOTOMETRIC_MINISBLACK: + { + quantum_info->min_is_white=MagickFalse; + break; + } + case PHOTOMETRIC_MINISWHITE: + { + quantum_info->min_is_white=MagickTrue; + break; + } + default: + break; + } + extra_samples=0; + tiff_status=TIFFGetFieldDefaulted(tiff,TIFFTAG_EXTRASAMPLES,&extra_samples, + &sample_info,sans); + if (tiff_status == 1) + { + (void) SetImageProperty(image,"tiff:alpha","unspecified"); + if (extra_samples == 0) + { + if ((samples_per_pixel == 4) && (photometric == PHOTOMETRIC_RGB)) + image->matte=MagickTrue; + } + else + for (i=0; i < extra_samples; i++) + { + image->matte=MagickTrue; + if (sample_info[i] == EXTRASAMPLE_ASSOCALPHA) + { + SetQuantumAlphaType(quantum_info,AssociatedQuantumAlpha); + (void) SetImageProperty(image,"tiff:alpha","associated"); + } + else + if (sample_info[i] == EXTRASAMPLE_UNASSALPHA) + { + SetQuantumAlphaType(quantum_info,DisassociatedQuantumAlpha); + (void) SetImageProperty(image,"tiff:alpha","unassociated"); + } + } + } + if (image->matte != MagickFalse) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + method=ReadGenericMethod; + rows_per_strip=(uint32) image->rows; + if (TIFFGetField(tiff,TIFFTAG_ROWSPERSTRIP,&rows_per_strip) == 1) + { + char + value[MaxTextExtent]; + + (void) FormatLocaleString(value,MaxTextExtent,"%u",(unsigned int) + rows_per_strip); + (void) SetImageProperty(image,"tiff:rows-per-strip",value); + method=ReadStripMethod; + if (rows_per_strip > (uint32) image->rows) + rows_per_strip=(uint32) image->rows; + } + if (TIFFIsTiled(tiff) != MagickFalse) + { + uint32 + columns, + rows; + + if ((TIFFGetField(tiff,TIFFTAG_TILEWIDTH,&columns) != 1) || + (TIFFGetField(tiff,TIFFTAG_TILELENGTH,&rows) != 1)) + ThrowTIFFException(CoderError,"ImageIsNotTiled"); + if ((AcquireMagickResource(WidthResource,columns) == MagickFalse) || + (AcquireMagickResource(HeightResource,rows) == MagickFalse)) + ThrowTIFFException(ImageError,"WidthOrHeightExceedsLimit"); + method=ReadTileMethod; + } + if ((photometric == PHOTOMETRIC_LOGLUV) || + (compress_tag == COMPRESSION_CCITTFAX3)) + method=ReadGenericMethod; + if (image->compression == JPEGCompression) + method=GetJPEGMethod(image,tiff,photometric,bits_per_sample, + samples_per_pixel); + quantum_info->endian=LSBEndian; + scanline_size=TIFFScanlineSize(tiff); + if (scanline_size <= 0) + ThrowTIFFException(ResourceLimitError,"MemoryAllocationFailed"); + number_pixels=MagickMax((MagickSizeType) image->columns*samples_per_pixel* + pow(2.0,ceil(log(bits_per_sample)/log(2.0))),image->columns* + rows_per_strip); + if ((double) scanline_size > 1.5*number_pixels) + ThrowTIFFException(CorruptImageError,"CorruptImage"); + number_pixels=MagickMax((MagickSizeType) scanline_size,number_pixels); + pixel_info=AcquireVirtualMemory(number_pixels,sizeof(uint32)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowTIFFException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + (void) ResetMagickMemory(pixels,0,number_pixels*sizeof(uint32)); + quantum_type=GrayQuantum; + if (image->storage_class == PseudoClass) + quantum_type=IndexQuantum; + if (interlace != PLANARCONFIG_SEPARATE) + { + size_t + pad; + + pad=(size_t) MagickMax((ssize_t) samples_per_pixel-1,0); + if (image->matte != MagickFalse) + { + if (image->storage_class == PseudoClass) + quantum_type=IndexAlphaQuantum; + else + quantum_type=samples_per_pixel == 1 ? AlphaQuantum : + GrayAlphaQuantum; + } + if ((samples_per_pixel > 2) && (interlace != PLANARCONFIG_SEPARATE)) + { + quantum_type=RGBQuantum; + pad=(size_t) MagickMax((size_t) samples_per_pixel-3,0); + if (image->matte != MagickFalse) + { + quantum_type=RGBAQuantum; + pad=(size_t) MagickMax((size_t) samples_per_pixel-4,0); + } + if (image->colorspace == CMYKColorspace) + { + quantum_type=CMYKQuantum; + pad=(size_t) MagickMax((size_t) samples_per_pixel-4,0); + if (image->matte != MagickFalse) + { + quantum_type=CMYKAQuantum; + pad=(size_t) MagickMax((size_t) samples_per_pixel-5,0); + } + } + status=SetQuantumPad(image,quantum_info,pad*((bits_per_sample+7) >> + 3)); + if (status == MagickFalse) + ThrowTIFFException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + switch (method) + { + case ReadYCCKMethod: + { + /* + Convert YCC TIFF image. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + int + status; + + IndexPacket + *indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + unsigned char + *p; + + status=TIFFReadPixels(tiff,0,y,(char *) pixels); + if (status == -1) + break; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + p=pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelCyan(q,ScaleCharToQuantum(ClampYCC((double) *p+ + (1.402*(double) *(p+2))-179.456))); + SetPixelMagenta(q,ScaleCharToQuantum(ClampYCC((double) *p- + (0.34414*(double) *(p+1))-(0.71414*(double ) *(p+2))+ + 135.45984))); + SetPixelYellow(q,ScaleCharToQuantum(ClampYCC((double) *p+ + (1.772*(double) *(p+1))-226.816))); + SetPixelBlack(indexes+x,ScaleCharToQuantum((unsigned char)*(p+3))); + q++; + p+=4; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case ReadStripMethod: + { + unsigned char + *p; + + size_t + extent; + + ssize_t + stride, + strip_id; + + tsize_t + strip_size; + + unsigned char + *strip_pixels; + + /* + Convert stripped TIFF image. + */ + extent=(samples_per_pixel+1)*TIFFStripSize(tiff); +#if defined(TIFF_VERSION_BIG) + extent+=image->columns*sizeof(uint64); +#else + extent+=image->columns*sizeof(uint32); +#endif + strip_pixels=(unsigned char *) AcquireQuantumMemory(extent, + sizeof(*strip_pixels)); + if (strip_pixels == (unsigned char *) NULL) + ThrowTIFFException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(strip_pixels,0,extent*sizeof(*strip_pixels)); + stride=TIFFVStripSize(tiff,1); + strip_id=0; + p=strip_pixels; + for (i=0; i < (ssize_t) samples_per_pixel; i++) + { + size_t + rows_remaining; + + switch (i) + { + case 0: break; + case 1: quantum_type=GreenQuantum; break; + case 2: quantum_type=BlueQuantum; break; + case 3: + { + quantum_type=AlphaQuantum; + if (image->colorspace == CMYKColorspace) + quantum_type=BlackQuantum; + break; + } + case 4: quantum_type=AlphaQuantum; break; + default: break; + } + rows_remaining=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + if (rows_remaining == 0) + { + strip_size=TIFFReadEncodedStrip(tiff,strip_id,strip_pixels, + TIFFStripSize(tiff)); + if (strip_size == -1) + break; + rows_remaining=rows_per_strip; + if ((y+rows_per_strip) > (ssize_t) image->rows) + rows_remaining=(rows_per_strip-(y+rows_per_strip- + image->rows)); + p=strip_pixels; + strip_id++; + } + (void) ImportQuantumPixels(image,(CacheView *) NULL, + quantum_info,quantum_type,p,exception); + p+=stride; + rows_remaining--; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if ((samples_per_pixel > 1) && (interlace != PLANARCONFIG_SEPARATE)) + break; + } + strip_pixels=(unsigned char *) RelinquishMagickMemory(strip_pixels); + break; + } + case ReadTileMethod: + { + unsigned char + *p; + + size_t + extent; + + uint32 + columns, + rows; + + unsigned char + *tile_pixels; + + /* + Convert tiled TIFF image. + */ + if ((TIFFGetField(tiff,TIFFTAG_TILEWIDTH,&columns) != 1) || + (TIFFGetField(tiff,TIFFTAG_TILELENGTH,&rows) != 1)) + ThrowTIFFException(CoderError,"ImageIsNotTiled"); + number_pixels=(MagickSizeType) columns*rows; + if (HeapOverflowSanityCheck(rows,sizeof(*tile_pixels)) != MagickFalse) + ThrowTIFFException(ResourceLimitError,"MemoryAllocationFailed"); + extent=4*MagickMax(rows*TIFFTileRowSize(tiff),TIFFTileSize(tiff)); +#if defined(TIFF_VERSION_BIG) + extent+=image->columns*sizeof(uint64); +#else + extent+=image->columns*sizeof(uint32); +#endif + tile_pixels=(unsigned char *) AcquireQuantumMemory(extent, + sizeof(*tile_pixels)); + if (tile_pixels == (unsigned char *) NULL) + ThrowTIFFException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(tile_pixels,0,extent*sizeof(*tile_pixels)); + for (i=0; i < (ssize_t) samples_per_pixel; i++) + { + switch (i) + { + case 0: break; + case 1: quantum_type=GreenQuantum; break; + case 2: quantum_type=BlueQuantum; break; + case 3: + { + quantum_type=AlphaQuantum; + if (image->colorspace == CMYKColorspace) + quantum_type=BlackQuantum; + break; + } + case 4: quantum_type=AlphaQuantum; break; + default: break; + } + for (y=0; y < (ssize_t) image->rows; y+=rows) + { + ssize_t + x; + + size_t + rows_remaining; + + rows_remaining=image->rows-y; + if ((ssize_t) (y+rows) < (ssize_t) image->rows) + rows_remaining=rows; + for (x=0; x < (ssize_t) image->columns; x+=columns) + { + size_t + columns_remaining, + row; + + columns_remaining=image->columns-x; + if ((ssize_t) (x+columns) < (ssize_t) image->columns) + columns_remaining=columns; + tiff_status=TIFFReadTile(tiff,tile_pixels,(uint32) x,(uint32) y, + 0,i); + if (tiff_status == -1) + break; + p=tile_pixels; + for (row=0; row < rows_remaining; row++) + { + PixelPacket + *magick_restrict q; + + q=GetAuthenticPixels(image,x,y+row,columns_remaining,1, + exception); + if (q == (PixelPacket *) NULL) + break; + (void) ImportQuantumPixels(image,(CacheView *) NULL, + quantum_info,quantum_type,p,exception); + p+=TIFFTileRowSize(tiff); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + } + } + if ((samples_per_pixel > 1) && (interlace != PLANARCONFIG_SEPARATE)) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) i, + samples_per_pixel); + if (status == MagickFalse) + break; + } + } + tile_pixels=(unsigned char *) RelinquishMagickMemory(tile_pixels); + break; + } + case ReadGenericMethod: + default: + { + MemoryInfo + *generic_info = (MemoryInfo *) NULL; + + uint32 + *p; + + uint32 + *pixels; + + /* + Convert generic TIFF image. + */ + if (HeapOverflowSanityCheck(image->rows,sizeof(*pixels)) != MagickFalse) + ThrowTIFFException(ResourceLimitError,"MemoryAllocationFailed"); + number_pixels=(MagickSizeType) image->columns*image->rows; +#if defined(TIFF_VERSION_BIG) + number_pixels+=image->columns*sizeof(uint64); +#else + number_pixels+=image->columns*sizeof(uint32); +#endif + generic_info=AcquireVirtualMemory(number_pixels,sizeof(*pixels)); + if (generic_info == (MemoryInfo *) NULL) + ThrowTIFFException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(uint32 *) GetVirtualMemoryBlob(generic_info); + tiff_status=TIFFReadRGBAImage(tiff,(uint32) image->columns,(uint32) + image->rows,(uint32 *) pixels,0); + if (tiff_status == -1) + { + generic_info=RelinquishVirtualMemory(generic_info); + break; + } + p=pixels+(image->columns*image->rows)-1; + for (y=0; y < (ssize_t) image->rows; y++) + { + ssize_t + x; + + PixelPacket + *magick_restrict q; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + q+=image->columns-1; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum((unsigned char) TIFFGetR(*p))); + SetPixelGreen(q,ScaleCharToQuantum((unsigned char) TIFFGetG(*p))); + SetPixelBlue(q,ScaleCharToQuantum((unsigned char) TIFFGetB(*p))); + if (image->matte == MagickFalse) + SetPixelOpacity(q,OpaqueOpacity); + else + SetPixelAlpha(q,ScaleCharToQuantum((unsigned char) TIFFGetA(*p))); + p--; + q--; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + generic_info=RelinquishVirtualMemory(generic_info); + break; + } + } + pixel_info=RelinquishVirtualMemory(pixel_info); + SetQuantumImageType(image,quantum_type); + next_tiff_frame: + if (quantum_info != (QuantumInfo *) NULL) + quantum_info=DestroyQuantumInfo(quantum_info); + if (tiff_status == -1) + { + status=MagickFalse; + break; + } + if (photometric == PHOTOMETRIC_CIELAB) + DecodeLabImage(image,exception); + if ((photometric == PHOTOMETRIC_LOGL) || + (photometric == PHOTOMETRIC_MINISBLACK) || + (photometric == PHOTOMETRIC_MINISWHITE)) + { + image->type=GrayscaleType; + if (bits_per_sample == 1) + image->type=BilevelType; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + more_frames=TIFFReadDirectory(tiff) != 0 ? MagickTrue : MagickFalse; + if (more_frames != MagickFalse) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,image->scene-1, + image->scene); + if (status == MagickFalse) + break; + } + } while ((status != MagickFalse) && (more_frames != MagickFalse)); + TIFFClose(tiff); + if ((image_info->number_scenes != 0) && + (image_info->scene >= GetImageListLength(image))) + status=MagickFalse; + if (status == MagickFalse) + return(DestroyImageList(image)); + TIFFReadPhotoshopLayers(image_info,image,exception); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r T I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterTIFFImage() adds properties for the TIFF image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterTIFFImage method is: +% +% size_t RegisterTIFFImage(void) +% +*/ + +#if defined(MAGICKCORE_TIFF_DELEGATE) +#if defined(MAGICKCORE_HAVE_TIFFMERGEFIELDINFO) && defined(MAGICKCORE_HAVE_TIFFSETTAGEXTENDER) +static TIFFExtendProc + tag_extender = (TIFFExtendProc) NULL; + +static void TIFFIgnoreTags(TIFF *tiff) +{ + char + *q; + + const char + *p, + *tags; + + Image + *image; + + ssize_t + i; + + size_t + count; + + TIFFFieldInfo + *ignore; + + if (TIFFGetReadProc(tiff) != TIFFReadBlob) + return; + image=(Image *)TIFFClientdata(tiff); + tags=GetImageArtifact(image,"tiff:ignore-tags"); + if (tags == (const char *) NULL) + return; + count=0; + p=tags; + while (*p != '\0') + { + while ((isspace((int) ((unsigned char) *p)) != 0)) + p++; + + (void) strtol(p,&q,10); + if (p == q) + return; + + p=q; + count++; + + while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ',')) + p++; + } + if (count == 0) + return; + i=0; + p=tags; + ignore=(TIFFFieldInfo *) AcquireQuantumMemory(count,sizeof(*ignore)); + if (ignore == (TIFFFieldInfo *) NULL) + return; + /* + This also sets field_bit to 0 (FIELD_IGNORE). + */ + (void) memset(ignore,0,count*sizeof(*ignore)); + while (*p != '\0') + { + while ((isspace((int) ((unsigned char) *p)) != 0)) + p++; + + ignore[i].field_tag=(ttag_t) strtol(p,&q,10); + + p=q; + i++; + + while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ',')) + p++; + } + (void) TIFFMergeFieldInfo(tiff,ignore,(uint32) count); + ignore=(TIFFFieldInfo *) RelinquishMagickMemory(ignore); +} + +static void TIFFTagExtender(TIFF *tiff) +{ + static const TIFFFieldInfo + TIFFExtensions[] = + { + { 37724, -3, -3, TIFF_UNDEFINED, FIELD_CUSTOM, 1, 1, + (char *) "PhotoshopLayerData" }, + { 34118, -3, -3, TIFF_UNDEFINED, FIELD_CUSTOM, 1, 1, + (char *) "Microscope" } + }; + + TIFFMergeFieldInfo(tiff,TIFFExtensions,sizeof(TIFFExtensions)/ + sizeof(*TIFFExtensions)); + if (tag_extender != (TIFFExtendProc) NULL) + (*tag_extender)(tiff); + TIFFIgnoreTags(tiff); +} +#endif +#endif + +ModuleExport size_t RegisterTIFFImage(void) +{ +#define TIFFDescription "Tagged Image File Format" + + char + version[MaxTextExtent]; + + MagickInfo + *entry; + +#if defined(MAGICKCORE_TIFF_DELEGATE) + if (tiff_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&tiff_semaphore); + LockSemaphoreInfo(tiff_semaphore); + if (instantiate_key == MagickFalse) + { + if (CreateMagickThreadKey(&tiff_exception,NULL) == MagickFalse) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + error_handler=TIFFSetErrorHandler(TIFFErrors); + warning_handler=TIFFSetWarningHandler(TIFFWarnings); +#if defined(MAGICKCORE_HAVE_TIFFMERGEFIELDINFO) && defined(MAGICKCORE_HAVE_TIFFSETTAGEXTENDER) + if (tag_extender == (TIFFExtendProc) NULL) + tag_extender=TIFFSetTagExtender(TIFFTagExtender); +#endif + instantiate_key=MagickTrue; + } + UnlockSemaphoreInfo(tiff_semaphore); +#endif + *version='\0'; +#if defined(TIFF_VERSION) + (void) FormatLocaleString(version,MaxTextExtent,"%d",TIFF_VERSION); +#endif +#if defined(MAGICKCORE_TIFF_DELEGATE) + { + const char + *p; + + ssize_t + i; + + p=TIFFGetVersion(); + for (i=0; (i < (MaxTextExtent-1)) && (*p != 0) && (*p != '\n'); i++) + version[i]=(*p++); + version[i]='\0'; + } +#endif + + entry=SetMagickInfo("GROUP4"); +#if defined(MAGICKCORE_TIFF_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadGROUP4Image; + entry->encoder=(EncodeImageHandler *) WriteGROUP4Image; +#endif + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Raw CCITT Group4"); + entry->mime_type=ConstantString("image/tiff"); + entry->magick_module=ConstantString("TIFF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PTIF"); +#if defined(MAGICKCORE_TIFF_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadTIFFImage; + entry->encoder=(EncodeImageHandler *) WritePTIFImage; +#endif + entry->endian_support=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Pyramid encoded TIFF"); + entry->mime_type=ConstantString("image/tiff"); + entry->magick_module=ConstantString("TIFF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("TIF"); +#if defined(MAGICKCORE_TIFF_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadTIFFImage; + entry->encoder=(EncodeImageHandler *) WriteTIFFImage; +#endif + entry->endian_support=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->stealth=MagickTrue; + entry->description=ConstantString(TIFFDescription); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/tiff"); + entry->magick_module=ConstantString("TIFF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("TIFF"); +#if defined(MAGICKCORE_TIFF_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadTIFFImage; + entry->encoder=(EncodeImageHandler *) WriteTIFFImage; +#endif + entry->magick=(IsImageFormatHandler *) IsTIFF; + entry->endian_support=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString(TIFFDescription); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/tiff"); + entry->magick_module=ConstantString("TIFF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("TIFF64"); +#if defined(TIFF_VERSION_BIG) + entry->decoder=(DecodeImageHandler *) ReadTIFFImage; + entry->encoder=(EncodeImageHandler *) WriteTIFFImage; +#endif + entry->endian_support=MagickTrue; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Tagged Image File Format (64-bit)"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->mime_type=ConstantString("image/tiff"); + entry->magick_module=ConstantString("TIFF"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r T I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterTIFFImage() removes format registrations made by the TIFF module +% from the list of supported formats. +% +% The format of the UnregisterTIFFImage method is: +% +% UnregisterTIFFImage(void) +% +*/ +ModuleExport void UnregisterTIFFImage(void) +{ + (void) UnregisterMagickInfo("TIFF64"); + (void) UnregisterMagickInfo("TIFF"); + (void) UnregisterMagickInfo("TIF"); + (void) UnregisterMagickInfo("PTIF"); +#if defined(MAGICKCORE_TIFF_DELEGATE) + if (tiff_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&tiff_semaphore); + LockSemaphoreInfo(tiff_semaphore); + if (instantiate_key != MagickFalse) + { + if (DeleteMagickThreadKey(tiff_exception) == MagickFalse) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); +#if defined(MAGICKCORE_HAVE_TIFFMERGEFIELDINFO) && defined(MAGICKCORE_HAVE_TIFFSETTAGEXTENDER) + if (tag_extender == (TIFFExtendProc) NULL) + (void) TIFFSetTagExtender(tag_extender); +#endif + (void) TIFFSetWarningHandler(warning_handler); + (void) TIFFSetErrorHandler(error_handler); + instantiate_key=MagickFalse; + } + UnlockSemaphoreInfo(tiff_semaphore); + DestroySemaphoreInfo(&tiff_semaphore); +#endif +} + +#if defined(MAGICKCORE_TIFF_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e G R O U P 4 I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteGROUP4Image() writes an image in the raw CCITT Group 4 image format. +% +% The format of the WriteGROUP4Image method is: +% +% MagickBooleanType WriteGROUP4Image(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteGROUP4Image(const ImageInfo *image_info, + Image *image) +{ + char + filename[MaxTextExtent]; + + FILE + *file; + + Image + *huffman_image; + + ImageInfo + *write_info; + + int + unique_file; + + MagickBooleanType + status; + + ssize_t + i; + + ssize_t + count; + + TIFF + *tiff; + + toff_t + *byte_count, + strip_size; + + unsigned char + *buffer; + + /* + Write image as CCITT Group4 TIFF image to a temporary file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + huffman_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (huffman_image == (Image *) NULL) + { + (void) CloseBlob(image); + return(MagickFalse); + } + huffman_image->endian=MSBEndian; + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(filename); + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + { + ThrowFileException(&image->exception,FileOpenError, + "UnableToCreateTemporaryFile",filename); + return(MagickFalse); + } + (void) FormatLocaleString(huffman_image->filename,MaxTextExtent,"tiff:%s", + filename); + if (IsMonochromeImage(image,&image->exception) != MagickFalse) + (void) SetImageType(huffman_image,BilevelType); + write_info=CloneImageInfo((ImageInfo *) NULL); + SetImageInfoFile(write_info,file); + if (IsMonochromeImage(image,&image->exception) == MagickFalse) + (void) SetImageType(image,BilevelType); + (void) SetImageDepth(image,1); + write_info->compression=Group4Compression; + write_info->type=BilevelType; + status=WriteTIFFImage(write_info,huffman_image); + (void) fflush(file); + write_info=DestroyImageInfo(write_info); + if (status == MagickFalse) + { + InheritException(&image->exception,&huffman_image->exception); + huffman_image=DestroyImage(huffman_image); + (void) fclose(file); + (void) RelinquishUniqueFileResource(filename); + return(MagickFalse); + } + tiff=TIFFOpen(filename,"rb"); + if (tiff == (TIFF *) NULL) + { + huffman_image=DestroyImage(huffman_image); + (void) fclose(file); + (void) RelinquishUniqueFileResource(filename); + ThrowFileException(&image->exception,FileOpenError,"UnableToOpenFile", + image_info->filename); + return(MagickFalse); + } + /* + Allocate raw strip buffer. + */ + if (TIFFGetField(tiff,TIFFTAG_STRIPBYTECOUNTS,&byte_count) != 1) + { + TIFFClose(tiff); + huffman_image=DestroyImage(huffman_image); + (void) fclose(file); + (void) RelinquishUniqueFileResource(filename); + return(MagickFalse); + } + strip_size=byte_count[0]; + for (i=1; i < (ssize_t) TIFFNumberOfStrips(tiff); i++) + if (byte_count[i] > strip_size) + strip_size=byte_count[i]; + buffer=(unsigned char *) AcquireQuantumMemory((size_t) strip_size, + sizeof(*buffer)); + if (buffer == (unsigned char *) NULL) + { + TIFFClose(tiff); + huffman_image=DestroyImage(huffman_image); + (void) fclose(file); + (void) RelinquishUniqueFileResource(filename); + ThrowBinaryImageException(ResourceLimitError,"MemoryAllocationFailed", + image_info->filename); + } + /* + Compress runlength encoded to 2D Huffman pixels. + */ + for (i=0; i < (ssize_t) TIFFNumberOfStrips(tiff); i++) + { + count=(ssize_t) TIFFReadRawStrip(tiff,(uint32) i,buffer,strip_size); + if (WriteBlob(image,(size_t) count,buffer) != count) + status=MagickFalse; + } + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + TIFFClose(tiff); + huffman_image=DestroyImage(huffman_image); + (void) fclose(file); + (void) RelinquishUniqueFileResource(filename); + (void) CloseBlob(image); + return(status); +} +#endif + +#if defined(MAGICKCORE_TIFF_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P T I F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePTIFImage() writes an image in the pyrimid-encoded Tagged image file +% format. +% +% The format of the WritePTIFImage method is: +% +% MagickBooleanType WritePTIFImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WritePTIFImage(const ImageInfo *image_info, + Image *image) +{ + ExceptionInfo + *exception; + + Image + *images, + *next, + *pyramid_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + PointInfo + resolution; + + size_t + columns, + rows; + + /* + Create pyramid-encoded TIFF image. + */ + exception=(&image->exception); + images=NewImageList(); + for (next=image; next != (Image *) NULL; next=GetNextImageInList(next)) + { + Image + *clone_image; + + clone_image=CloneImage(next,0,0,MagickFalse,exception); + if (clone_image == (Image *) NULL) + break; + clone_image->previous=NewImageList(); + clone_image->next=NewImageList(); + (void) SetImageProperty(clone_image,"tiff:subfiletype","none"); + AppendImageToList(&images,clone_image); + columns=next->columns; + rows=next->rows; + resolution.x=next->x_resolution; + resolution.y=next->y_resolution; + while ((columns > 64) && (rows > 64)) + { + columns/=2; + rows/=2; + resolution.x/=2.0; + resolution.y/=2.0; + pyramid_image=ResizeImage(next,columns,rows,image->filter,image->blur, + exception); + if (pyramid_image == (Image *) NULL) + break; + DestroyBlob(pyramid_image); + pyramid_image->blob=ReferenceBlob(next->blob); + pyramid_image->x_resolution=resolution.x; + pyramid_image->y_resolution=resolution.y; + (void) SetImageProperty(pyramid_image,"tiff:subfiletype","REDUCEDIMAGE"); + AppendImageToList(&images,pyramid_image); + } + } + status=MagickFalse; + if (images != (Image *) NULL) + { + /* + Write pyramid-encoded TIFF image. + */ + images=GetFirstImageInList(images); + write_info=CloneImageInfo(image_info); + write_info->adjoin=MagickTrue; + status=WriteTIFFImage(write_info,images); + images=DestroyImageList(images); + write_info=DestroyImageInfo(write_info); + } + return(status); +} +#endif + +#if defined(MAGICKCORE_TIFF_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% W r i t e T I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteTIFFImage() writes an image in the Tagged image file format. +% +% The format of the WriteTIFFImage method is: +% +% MagickBooleanType WriteTIFFImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +typedef struct _TIFFInfo +{ + RectangleInfo + tile_geometry; + + unsigned char + *scanline, + *scanlines, + *pixels; +} TIFFInfo; + +static void DestroyTIFFInfo(TIFFInfo *tiff_info) +{ + assert(tiff_info != (TIFFInfo *) NULL); + if (tiff_info->scanlines != (unsigned char *) NULL) + tiff_info->scanlines=(unsigned char *) RelinquishMagickMemory( + tiff_info->scanlines); + if (tiff_info->pixels != (unsigned char *) NULL) + tiff_info->pixels=(unsigned char *) RelinquishMagickMemory( + tiff_info->pixels); +} + +static MagickBooleanType EncodeLabImage(Image *image,ExceptionInfo *exception) +{ + CacheView + *image_view; + + MagickBooleanType + status; + + ssize_t + y; + + status=MagickTrue; + image_view=AcquireAuthenticCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + break; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + double + a, + b; + + a=QuantumScale*GetPixela(q)-0.5; + if (a < 0.0) + a+=1.0; + b=QuantumScale*GetPixelb(q)-0.5; + if (b < 0.0) + b+=1.0; + SetPixela(q,QuantumRange*a); + SetPixelb(q,QuantumRange*b); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + { + status=MagickFalse; + break; + } + } + image_view=DestroyCacheView(image_view); + return(status); +} + +static MagickBooleanType GetTIFFInfo(const ImageInfo *image_info,TIFF *tiff, + TIFFInfo *tiff_info) +{ +#define TIFFStripSizeDefault 1048576 + + const char + *option; + + MagickStatusType + flags; + + uint32 + tile_columns, + tile_rows; + + assert(tiff_info != (TIFFInfo *) NULL); + (void) memset(tiff_info,0,sizeof(*tiff_info)); + option=GetImageOption(image_info,"tiff:tile-geometry"); + if (option == (const char *) NULL) + { + size_t + extent; + + uint32 + rows, + rows_per_strip; + + extent=TIFFScanlineSize(tiff); + rows_per_strip=TIFFStripSizeDefault/(extent == 0 ? 1 : (uint32) extent); + rows_per_strip=16*(((rows_per_strip < 16 ? 16 : rows_per_strip)+1)/16); + TIFFGetField(tiff,TIFFTAG_IMAGELENGTH,&rows); + if (rows_per_strip > rows) + rows_per_strip=rows; + option=GetImageOption(image_info,"tiff:rows-per-strip"); + if (option != (const char *) NULL) + rows_per_strip=(uint32) strtoul(option,(char **) NULL,10); + rows_per_strip=TIFFDefaultStripSize(tiff,rows_per_strip); + (void) TIFFSetField(tiff,TIFFTAG_ROWSPERSTRIP,rows_per_strip); + return(MagickTrue); + } + flags=ParseAbsoluteGeometry(option,&tiff_info->tile_geometry); + if ((flags & HeightValue) == 0) + tiff_info->tile_geometry.height=tiff_info->tile_geometry.width; + tile_columns=(uint32) tiff_info->tile_geometry.width; + tile_rows=(uint32) tiff_info->tile_geometry.height; + TIFFDefaultTileSize(tiff,&tile_columns,&tile_rows); + (void) TIFFSetField(tiff,TIFFTAG_TILEWIDTH,tile_columns); + (void) TIFFSetField(tiff,TIFFTAG_TILELENGTH,tile_rows); + tiff_info->tile_geometry.width=tile_columns; + tiff_info->tile_geometry.height=tile_rows; + if ((TIFFScanlineSize(tiff) <= 0) || (TIFFTileSize(tiff) <= 0)) + { + DestroyTIFFInfo(tiff_info); + return(MagickFalse); + } + tiff_info->scanlines=(unsigned char *) AcquireQuantumMemory((size_t) + tile_rows*TIFFScanlineSize(tiff),sizeof(*tiff_info->scanlines)); + tiff_info->pixels=(unsigned char *) AcquireQuantumMemory((size_t) + tile_rows*TIFFTileSize(tiff),sizeof(*tiff_info->scanlines)); + if ((tiff_info->scanlines == (unsigned char *) NULL) || + (tiff_info->pixels == (unsigned char *) NULL)) + { + DestroyTIFFInfo(tiff_info); + return(MagickFalse); + } + return(MagickTrue); +} + +static tmsize_t TIFFWritePixels(TIFF *tiff,TIFFInfo *tiff_info,ssize_t row, + tsample_t sample,Image *image) +{ + ssize_t + i; + + tmsize_t + status; + + size_t + number_tiles, + tile_width; + + ssize_t + bytes_per_pixel, + j, + k, + l; + + unsigned char + *p, + *q; + + if (TIFFIsTiled(tiff) == 0) + return(TIFFWriteScanline(tiff,tiff_info->scanline,(uint32) row,sample)); + /* + Fill scanlines to tile height. + */ + i=(ssize_t) (row % tiff_info->tile_geometry.height)*TIFFScanlineSize(tiff); + (void) memcpy(tiff_info->scanlines+i,(char *) tiff_info->scanline, + (size_t) TIFFScanlineSize(tiff)); + if (((size_t) (row % tiff_info->tile_geometry.height) != + (tiff_info->tile_geometry.height-1)) && + (row != (ssize_t) (image->rows-1))) + return(0); + /* + Write tile to TIFF image. + */ + status=0; + bytes_per_pixel=TIFFTileSize(tiff)/(ssize_t) (tiff_info->tile_geometry.height* + tiff_info->tile_geometry.width); + number_tiles=(image->columns+tiff_info->tile_geometry.width)/ + tiff_info->tile_geometry.width; + for (i=0; i < (ssize_t) number_tiles; i++) + { + tile_width=(i == (ssize_t) (number_tiles-1)) ? image->columns-(i* + tiff_info->tile_geometry.width) : tiff_info->tile_geometry.width; + for (j=0; j < (ssize_t) ((row % tiff_info->tile_geometry.height)+1); j++) + for (k=0; k < (ssize_t) tile_width; k++) + { + if (bytes_per_pixel == 0) + { + p=tiff_info->scanlines+(j*TIFFScanlineSize(tiff)+(i* + tiff_info->tile_geometry.width+k)/8); + q=tiff_info->pixels+(j*TIFFTileRowSize(tiff)+k/8); + *q++=(*p++); + continue; + } + p=tiff_info->scanlines+(j*TIFFScanlineSize(tiff)+(i* + tiff_info->tile_geometry.width+k)*bytes_per_pixel); + q=tiff_info->pixels+(j*TIFFTileRowSize(tiff)+k*bytes_per_pixel); + for (l=0; l < bytes_per_pixel; l++) + *q++=(*p++); + } + if ((i*tiff_info->tile_geometry.width) != image->columns) + status=TIFFWriteTile(tiff,tiff_info->pixels,(uint32) (i* + tiff_info->tile_geometry.width),(uint32) ((row/ + tiff_info->tile_geometry.height)*tiff_info->tile_geometry.height),0, + sample); + if (status < 0) + break; + } + return(status); +} + +static void TIFFSetProfiles(TIFF *tiff,Image *image) +{ + const char + *name; + + const StringInfo + *profile; + + if (image->profiles == (void *) NULL) + return; + ResetImageProfileIterator(image); + for (name=GetNextImageProfile(image); name != (const char *) NULL; ) + { + profile=GetImageProfile(image,name); + if (GetStringInfoLength(profile) == 0) + { + name=GetNextImageProfile(image); + continue; + } +#if defined(TIFFTAG_XMLPACKET) + if (LocaleCompare(name,"xmp") == 0) + (void) TIFFSetField(tiff,TIFFTAG_XMLPACKET,(uint32) GetStringInfoLength( + profile),GetStringInfoDatum(profile)); +#endif +#if defined(TIFFTAG_ICCPROFILE) + if (LocaleCompare(name,"icc") == 0) + (void) TIFFSetField(tiff,TIFFTAG_ICCPROFILE,(uint32) GetStringInfoLength( + profile),GetStringInfoDatum(profile)); +#endif + if (LocaleCompare(name,"iptc") == 0) + { + const TIFFField + *field; + + size_t + length; + + StringInfo + *iptc_profile; + + iptc_profile=CloneStringInfo(profile); + length=GetStringInfoLength(profile)+4-(GetStringInfoLength(profile) & + 0x03); + SetStringInfoLength(iptc_profile,length); + field=TIFFFieldWithTag(tiff,TIFFTAG_RICHTIFFIPTC); + if (TIFFFieldDataType(field) == TIFF_LONG) + { + if (TIFFIsByteSwapped(tiff)) + TIFFSwabArrayOfLong((uint32 *) GetStringInfoDatum(iptc_profile), + (unsigned long) (length/4)); + (void) TIFFSetField(tiff,TIFFTAG_RICHTIFFIPTC,(uint32) + GetStringInfoLength(iptc_profile)/4,GetStringInfoDatum( + iptc_profile)); + } + else + (void) TIFFSetField(tiff,TIFFTAG_RICHTIFFIPTC,(uint32) + GetStringInfoLength(iptc_profile),GetStringInfoDatum( + iptc_profile)); + iptc_profile=DestroyStringInfo(iptc_profile); + } +#if defined(TIFFTAG_PHOTOSHOP) + if (LocaleCompare(name,"8bim") == 0) + (void) TIFFSetField(tiff,TIFFTAG_PHOTOSHOP,(uint32) + GetStringInfoLength(profile),GetStringInfoDatum(profile)); +#endif + if (LocaleCompare(name,"tiff:37724") == 0) + (void) TIFFSetField(tiff,37724,(uint32) GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + if (LocaleCompare(name,"tiff:34118") == 0) + (void) TIFFSetField(tiff,34118,(uint32) GetStringInfoLength(profile), + GetStringInfoDatum(profile)); + name=GetNextImageProfile(image); + } +} + +static void TIFFSetProperties(TIFF *tiff,const ImageInfo *image_info, + Image *image) +{ + const char + *value; + + value=GetImageArtifact(image,"tiff:document"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_DOCUMENTNAME,value); + value=GetImageArtifact(image,"tiff:hostcomputer"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_HOSTCOMPUTER,value); + value=GetImageArtifact(image,"tiff:artist"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_ARTIST,value); + value=GetImageArtifact(image,"tiff:timestamp"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_DATETIME,value); + value=GetImageArtifact(image,"tiff:make"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_MAKE,value); + value=GetImageArtifact(image,"tiff:model"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_MODEL,value); + value=GetImageArtifact(image,"tiff:software"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_SOFTWARE,value); + value=GetImageArtifact(image,"tiff:copyright"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_COPYRIGHT,value); + value=GetImageArtifact(image,"kodak-33423"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,33423,value); + value=GetImageArtifact(image,"kodak-36867"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,36867,value); + value=GetImageProperty(image,"label"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_PAGENAME,value); + value=GetImageProperty(image,"comment"); + if (value != (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_IMAGEDESCRIPTION,value); + value=GetImageArtifact(image,"tiff:subfiletype"); + if (value != (const char *) NULL) + { + if (LocaleCompare(value,"REDUCEDIMAGE") == 0) + (void) TIFFSetField(tiff,TIFFTAG_SUBFILETYPE,FILETYPE_REDUCEDIMAGE); + else + if (LocaleCompare(value,"PAGE") == 0) + (void) TIFFSetField(tiff,TIFFTAG_SUBFILETYPE,FILETYPE_PAGE); + else + if (LocaleCompare(value,"MASK") == 0) + (void) TIFFSetField(tiff,TIFFTAG_SUBFILETYPE,FILETYPE_MASK); + } + else + { + uint16 + page, + pages; + + page=(uint16) image->scene; + pages=(uint16) GetImageListLength(image); + if ((image_info->adjoin != MagickFalse) && (pages > 1)) + (void) TIFFSetField(tiff,TIFFTAG_SUBFILETYPE,FILETYPE_PAGE); + (void) TIFFSetField(tiff,TIFFTAG_PAGENUMBER,page,pages); + } +} + +static MagickBooleanType WriteTIFFImage(const ImageInfo *image_info, + Image *image) +{ + const char + *mode, + *option; + + CompressionType + compression; + + EndianType + endian_type; + + int + tiff_status = 0; + + MagickBooleanType + debug, + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + i; + + size_t + imageListLength; + + ssize_t + y; + + TIFF + *tiff; + + TIFFInfo + tiff_info; + + uint16 + bits_per_sample, + compress_tag, + endian, + photometric, + predictor; + + unsigned char + *pixels; + + void + *sans[2] = { NULL, NULL }; + + /* + Open TIFF file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) SetMagickThreadValue(tiff_exception,&image->exception); + endian_type=UndefinedEndian; + option=GetImageOption(image_info,"tiff:endian"); + if (option != (const char *) NULL) + { + if (LocaleNCompare(option,"msb",3) == 0) + endian_type=MSBEndian; + if (LocaleNCompare(option,"lsb",3) == 0) + endian_type=LSBEndian;; + } + switch (endian_type) + { + case LSBEndian: mode="wl"; break; + case MSBEndian: mode="wb"; break; + default: mode="w"; break; + } +#if defined(TIFF_VERSION_BIG) + if (LocaleCompare(image_info->magick,"TIFF64") == 0) + switch (endian_type) + { + case LSBEndian: mode="wl8"; break; + case MSBEndian: mode="wb8"; break; + default: mode="w8"; break; + } +#endif + tiff=TIFFClientOpen(image->filename,mode,(thandle_t) image,TIFFReadBlob, + TIFFWriteBlob,TIFFSeekBlob,TIFFCloseBlob,TIFFGetBlobSize,TIFFMapBlob, + TIFFUnmapBlob); + if (tiff == (TIFF *) NULL) + return(MagickFalse); + if (image->exception.severity > ErrorException) + { + TIFFClose(tiff); + return(MagickFalse); + } + (void) DeleteImageProfile(image,"tiff:37724"); + scene=0; + debug=IsEventLogging(); + (void) debug; + imageListLength=GetImageListLength(image); + do + { + /* + Initialize TIFF fields. + */ + (void) IsMonochromeImage(image,&image->exception); + if ((image_info->type != UndefinedType) && + (image_info->type != OptimizeType) && + (image_info->type != image->type)) + (void) SetImageType(image,image_info->type); + compression=UndefinedCompression; + if (image->compression != JPEGCompression) + compression=image->compression; + if (image_info->compression != UndefinedCompression) + compression=image_info->compression; + switch (compression) + { + case FaxCompression: + case Group4Compression: + { + if (IsMonochromeImage(image,&image->exception) == MagickFalse) + { + if (IsGrayImage(image,&image->exception) == MagickFalse) + (void) SetImageType(image,BilevelType); + else + (void) SetImageDepth(image,1); + } + image->depth=1; + break; + } + case JPEGCompression: + { + (void) SetImageStorageClass(image,DirectClass); + (void) SetImageDepth(image,8); + break; + } + default: + break; + } + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + if ((image->storage_class != PseudoClass) && (image->depth >= 32) && + (quantum_info->format == UndefinedQuantumFormat) && + (IsHighDynamicRangeImage(image,&image->exception) != MagickFalse)) + { + status=SetQuantumFormat(image,quantum_info,FloatingPointQuantumFormat); + if (status == MagickFalse) + { + quantum_info=DestroyQuantumInfo(quantum_info); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + } + if ((LocaleCompare(image_info->magick,"PTIF") == 0) && + (GetPreviousImageInList(image) != (Image *) NULL)) + (void) TIFFSetField(tiff,TIFFTAG_SUBFILETYPE,FILETYPE_REDUCEDIMAGE); + if ((image->columns != (uint32) image->columns) || + (image->rows != (uint32) image->rows)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + (void) TIFFSetField(tiff,TIFFTAG_IMAGELENGTH,(uint32) image->rows); + (void) TIFFSetField(tiff,TIFFTAG_IMAGEWIDTH,(uint32) image->columns); + switch (compression) + { + case FaxCompression: + { + compress_tag=COMPRESSION_CCITTFAX3; + option=GetImageOption(image_info,"quantum:polarity"); + if (option == (const char *) NULL) + SetQuantumMinIsWhite(quantum_info,MagickTrue); + break; + } + case Group4Compression: + { + compress_tag=COMPRESSION_CCITTFAX4; + option=GetImageOption(image_info,"quantum:polarity"); + if (option == (const char *) NULL) + SetQuantumMinIsWhite(quantum_info,MagickTrue); + break; + } +#if defined(COMPRESSION_JBIG) + case JBIG1Compression: + { + compress_tag=COMPRESSION_JBIG; + break; + } +#endif + case JPEGCompression: + { + compress_tag=COMPRESSION_JPEG; + break; + } +#if defined(COMPRESSION_LZMA) + case LZMACompression: + { + compress_tag=COMPRESSION_LZMA; + break; + } +#endif + case LZWCompression: + { + compress_tag=COMPRESSION_LZW; + break; + } + case RLECompression: + { + compress_tag=COMPRESSION_PACKBITS; + break; + } +#if defined(COMPRESSION_WEBP) + case WebPCompression: + { + compress_tag=COMPRESSION_WEBP; + break; + } +#endif + case ZipCompression: + { + compress_tag=COMPRESSION_ADOBE_DEFLATE; + break; + } +#if defined(COMPRESSION_ZSTD) + case ZstdCompression: + { + compress_tag=COMPRESSION_ZSTD; + break; + } +#endif + case NoCompression: + default: + { + compress_tag=COMPRESSION_NONE; + break; + } + } +#if defined(MAGICKCORE_HAVE_TIFFISCODECCONFIGURED) || (TIFFLIB_VERSION > 20040919) + if ((compress_tag != COMPRESSION_NONE) && + (TIFFIsCODECConfigured(compress_tag) == 0)) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CoderError,"CompressionNotSupported","`%s'",CommandOptionToMnemonic( + MagickCompressOptions,(ssize_t) compression)); + compress_tag=COMPRESSION_NONE; + } +#else + switch (compress_tag) + { +#if defined(CCITT_SUPPORT) + case COMPRESSION_CCITTFAX3: + case COMPRESSION_CCITTFAX4: +#endif +#if defined(YCBCR_SUPPORT) && defined(JPEG_SUPPORT) + case COMPRESSION_JPEG: +#endif +#if defined(LZMA_SUPPORT) && defined(COMPRESSION_LZMA) + case COMPRESSION_LZMA: +#endif +#if defined(LZW_SUPPORT) + case COMPRESSION_LZW: +#endif +#if defined(PACKBITS_SUPPORT) + case COMPRESSION_PACKBITS: +#endif +#if defined(ZIP_SUPPORT) + case COMPRESSION_ADOBE_DEFLATE: +#endif + case COMPRESSION_NONE: + break; + default: + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CoderError,"CompressionNotSupported","`%s'",CommandOptionToMnemonic( + MagickCompressOptions,(ssize_t) compression)); + compress_tag=COMPRESSION_NONE; + break; + } + } +#endif + if (image->colorspace == CMYKColorspace) + { + photometric=PHOTOMETRIC_SEPARATED; + (void) TIFFSetField(tiff,TIFFTAG_SAMPLESPERPIXEL,4); + (void) TIFFSetField(tiff,TIFFTAG_INKSET,INKSET_CMYK); + } + else + { + /* + Full color TIFF raster. + */ + if (image->colorspace == LabColorspace) + { + photometric=PHOTOMETRIC_CIELAB; + EncodeLabImage(image,&image->exception); + } + else + if (IsYCbCrCompatibleColorspace(image->colorspace) != MagickFalse) + { + photometric=PHOTOMETRIC_YCBCR; + (void) TIFFSetField(tiff,TIFFTAG_YCBCRSUBSAMPLING,1,1); + (void) SetImageStorageClass(image,DirectClass); + status=SetQuantumDepth(image,quantum_info,8); + if (status == MagickFalse) + ThrowWriterException(ResourceLimitError, + "MemoryAllocationFailed"); + } + else + photometric=PHOTOMETRIC_RGB; + (void) TIFFSetField(tiff,TIFFTAG_SAMPLESPERPIXEL,3); + if ((image_info->type != TrueColorType) && + (image_info->type != TrueColorMatteType)) + { + ImageType + type; + + type=IdentifyImageType(image,&image->exception); + if ((image_info->type != PaletteType) && + ((type == GrayscaleType) || (type == BilevelType))) + { + photometric=(uint16) (quantum_info->min_is_white != + MagickFalse ? PHOTOMETRIC_MINISWHITE : + PHOTOMETRIC_MINISBLACK); + (void) TIFFSetField(tiff,TIFFTAG_SAMPLESPERPIXEL,1); + } + else + if ((image->storage_class == PseudoClass) && + (image->matte == MagickFalse)) + { + size_t + depth; + + /* + Colormapped TIFF raster. + */ + (void) TIFFSetField(tiff,TIFFTAG_SAMPLESPERPIXEL,1); + photometric=PHOTOMETRIC_PALETTE; + depth=1; + while ((GetQuantumRange(depth)+1) < image->colors) + depth<<=1; + status=SetQuantumDepth(image,quantum_info,depth); + if (status == MagickFalse) + ThrowWriterException(ResourceLimitError, + "MemoryAllocationFailed"); + } + } + } + (void) TIFFGetFieldDefaulted(tiff,TIFFTAG_FILLORDER,&endian,sans); + if ((compress_tag == COMPRESSION_CCITTFAX3) || + (compress_tag == COMPRESSION_CCITTFAX4)) + { + if ((photometric != PHOTOMETRIC_MINISWHITE) && + (photometric != PHOTOMETRIC_MINISBLACK)) + { + compress_tag=COMPRESSION_NONE; + endian=FILLORDER_MSB2LSB; + } + } + option=GetImageOption(image_info,"tiff:fill-order"); + if (option != (const char *) NULL) + { + if (LocaleNCompare(option,"msb",3) == 0) + endian=FILLORDER_MSB2LSB; + if (LocaleNCompare(option,"lsb",3) == 0) + endian=FILLORDER_LSB2MSB; + } + (void) TIFFSetField(tiff,TIFFTAG_COMPRESSION,compress_tag); + (void) TIFFSetField(tiff,TIFFTAG_FILLORDER,endian); + (void) TIFFSetField(tiff,TIFFTAG_BITSPERSAMPLE,quantum_info->depth); + if (image->matte != MagickFalse) + { + uint16 + extra_samples, + sample_info[1], + samples_per_pixel; + + /* + TIFF has a matte channel. + */ + extra_samples=1; + sample_info[0]=EXTRASAMPLE_UNASSALPHA; + option=GetImageOption(image_info,"tiff:alpha"); + if (option != (const char *) NULL) + { + if (LocaleCompare(option,"associated") == 0) + sample_info[0]=EXTRASAMPLE_ASSOCALPHA; + else + if (LocaleCompare(option,"unspecified") == 0) + sample_info[0]=EXTRASAMPLE_UNSPECIFIED; + } + (void) TIFFGetFieldDefaulted(tiff,TIFFTAG_SAMPLESPERPIXEL, + &samples_per_pixel,sans); + (void) TIFFSetField(tiff,TIFFTAG_SAMPLESPERPIXEL,samples_per_pixel+1); + (void) TIFFSetField(tiff,TIFFTAG_EXTRASAMPLES,extra_samples, + &sample_info); + if (sample_info[0] == EXTRASAMPLE_ASSOCALPHA) + SetQuantumAlphaType(quantum_info,AssociatedQuantumAlpha); + } + (void) TIFFSetField(tiff,TIFFTAG_PHOTOMETRIC,photometric); + switch (quantum_info->format) + { + case FloatingPointQuantumFormat: + { + (void) TIFFSetField(tiff,TIFFTAG_SAMPLEFORMAT,SAMPLEFORMAT_IEEEFP); + (void) TIFFSetField(tiff,TIFFTAG_SMINSAMPLEVALUE,quantum_info->minimum); + (void) TIFFSetField(tiff,TIFFTAG_SMAXSAMPLEVALUE,quantum_info->maximum); + break; + } + case SignedQuantumFormat: + { + (void) TIFFSetField(tiff,TIFFTAG_SAMPLEFORMAT,SAMPLEFORMAT_INT); + break; + } + case UnsignedQuantumFormat: + { + (void) TIFFSetField(tiff,TIFFTAG_SAMPLEFORMAT,SAMPLEFORMAT_UINT); + break; + } + default: + break; + } + (void) TIFFSetField(tiff,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG); + if (photometric == PHOTOMETRIC_RGB) + if ((image_info->interlace == PlaneInterlace) || + (image_info->interlace == PartitionInterlace)) + (void) TIFFSetField(tiff,TIFFTAG_PLANARCONFIG,PLANARCONFIG_SEPARATE); + predictor=0; + switch (compress_tag) + { + case COMPRESSION_JPEG: + { +#if defined(JPEG_SUPPORT) + if (image_info->quality != UndefinedCompressionQuality) + (void) TIFFSetField(tiff,TIFFTAG_JPEGQUALITY,image_info->quality); + (void) TIFFSetField(tiff,TIFFTAG_JPEGCOLORMODE,JPEGCOLORMODE_RAW); + if (IssRGBCompatibleColorspace(image->colorspace) != MagickFalse) + { + const char + *value; + + (void) TIFFSetField(tiff,TIFFTAG_JPEGCOLORMODE,JPEGCOLORMODE_RGB); + if (IsYCbCrCompatibleColorspace(image->colorspace) != MagickFalse) + { + const char + *sampling_factor; + + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + sampling_factor=(const char *) NULL; + value=GetImageProperty(image,"jpeg:sampling-factor"); + if (value != (char *) NULL) + { + sampling_factor=value; + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Input sampling-factors=%s",sampling_factor); + } + if (image_info->sampling_factor != (char *) NULL) + sampling_factor=image_info->sampling_factor; + if (sampling_factor != (const char *) NULL) + { + flags=ParseGeometry(sampling_factor,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + (void) TIFFSetField(tiff,TIFFTAG_YCBCRSUBSAMPLING,(uint16) + geometry_info.rho,(uint16) geometry_info.sigma); + } + } + } + (void) TIFFGetFieldDefaulted(tiff,TIFFTAG_BITSPERSAMPLE, + &bits_per_sample,sans); + if (bits_per_sample == 12) + (void) TIFFSetField(tiff,TIFFTAG_JPEGTABLESMODE,JPEGTABLESMODE_QUANT); +#endif + break; + } + case COMPRESSION_ADOBE_DEFLATE: + { + (void) TIFFGetFieldDefaulted(tiff,TIFFTAG_BITSPERSAMPLE, + &bits_per_sample,sans); + if (((photometric == PHOTOMETRIC_RGB) || + (photometric == PHOTOMETRIC_SEPARATED) || + (photometric == PHOTOMETRIC_MINISBLACK)) && + ((bits_per_sample == 8) || (bits_per_sample == 16))) + predictor=PREDICTOR_HORIZONTAL; + (void) TIFFSetField(tiff,TIFFTAG_ZIPQUALITY,(long) ( + image_info->quality == UndefinedCompressionQuality ? 7 : + MagickMin((ssize_t) image_info->quality/10,9))); + break; + } + case COMPRESSION_CCITTFAX3: + { + /* + Byte-aligned EOL. + */ + (void) TIFFSetField(tiff,TIFFTAG_GROUP3OPTIONS,4); + break; + } + case COMPRESSION_CCITTFAX4: + break; +#if defined(LZMA_SUPPORT) && defined(COMPRESSION_LZMA) + case COMPRESSION_LZMA: + { + if (((photometric == PHOTOMETRIC_RGB) || + (photometric == PHOTOMETRIC_SEPARATED) || + (photometric == PHOTOMETRIC_MINISBLACK)) && + ((bits_per_sample == 8) || (bits_per_sample == 16))) + predictor=PREDICTOR_HORIZONTAL; + (void) TIFFSetField(tiff,TIFFTAG_LZMAPRESET,(long) ( + image_info->quality == UndefinedCompressionQuality ? 7 : + MagickMin((ssize_t) image_info->quality/10,9))); + break; + } +#endif + case COMPRESSION_LZW: + { + (void) TIFFGetFieldDefaulted(tiff,TIFFTAG_BITSPERSAMPLE, + &bits_per_sample,sans); + if (((photometric == PHOTOMETRIC_RGB) || + (photometric == PHOTOMETRIC_SEPARATED) || + (photometric == PHOTOMETRIC_MINISBLACK)) && + ((bits_per_sample == 8) || (bits_per_sample == 16))) + predictor=PREDICTOR_HORIZONTAL; + break; + } +#if defined(WEBP_SUPPORT) && defined(COMPRESSION_WEBP) + case COMPRESSION_WEBP: + { + (void) TIFFGetFieldDefaulted(tiff,TIFFTAG_BITSPERSAMPLE, + &bits_per_sample,sans); + if (((photometric == PHOTOMETRIC_RGB) || + (photometric == PHOTOMETRIC_SEPARATED) || + (photometric == PHOTOMETRIC_MINISBLACK)) && + ((bits_per_sample == 8) || (bits_per_sample == 16))) + predictor=PREDICTOR_HORIZONTAL; + (void) TIFFSetField(tiff,TIFFTAG_WEBP_LEVEL,image_info->quality); + if (image_info->quality >= 100) + (void) TIFFSetField(tiff,TIFFTAG_WEBP_LOSSLESS,1); + break; + } +#endif +#if defined(ZSTD_SUPPORT) && defined(COMPRESSION_ZSTD) + case COMPRESSION_ZSTD: + { + (void) TIFFGetFieldDefaulted(tiff,TIFFTAG_BITSPERSAMPLE, + &bits_per_sample,sans); + if (((photometric == PHOTOMETRIC_RGB) || + (photometric == PHOTOMETRIC_SEPARATED) || + (photometric == PHOTOMETRIC_MINISBLACK)) && + ((bits_per_sample == 8) || (bits_per_sample == 16))) + predictor=PREDICTOR_HORIZONTAL; + (void) TIFFSetField(tiff,TIFFTAG_ZSTD_LEVEL,22*image_info->quality/ + 100.0); + break; + } +#endif + default: + break; + } + if ((compress_tag == COMPRESSION_LZW) || + (compress_tag == COMPRESSION_ADOBE_DEFLATE)) + { + if (quantum_info->format == FloatingPointQuantumFormat) + predictor=PREDICTOR_FLOATINGPOINT; + option=GetImageOption(image_info,"tiff:predictor"); + if (option != (const char * ) NULL) + predictor=(uint16) strtol(option,(char **) NULL,10); + if (predictor != 0) + (void) TIFFSetField(tiff,TIFFTAG_PREDICTOR,predictor); + } + if ((image->x_resolution != 0.0) && (image->y_resolution != 0.0)) + { + unsigned short + units; + + /* + Set image resolution. + */ + units=RESUNIT_NONE; + if (image->units == PixelsPerInchResolution) + units=RESUNIT_INCH; + if (image->units == PixelsPerCentimeterResolution) + units=RESUNIT_CENTIMETER; + (void) TIFFSetField(tiff,TIFFTAG_RESOLUTIONUNIT,(uint16) units); + (void) TIFFSetField(tiff,TIFFTAG_XRESOLUTION,image->x_resolution); + (void) TIFFSetField(tiff,TIFFTAG_YRESOLUTION,image->y_resolution); + if ((image->page.x < 0) || (image->page.y < 0)) + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CoderError,"TIFF: negative image positions unsupported","%s", + image->filename); + if ((image->page.x > 0) && (image->x_resolution > 0.0)) + { + /* + Set horizontal image position. + */ + (void) TIFFSetField(tiff,TIFFTAG_XPOSITION,(float) image->page.x/ + image->x_resolution); + } + if ((image->page.y > 0) && (image->y_resolution > 0.0)) + { + /* + Set vertical image position. + */ + (void) TIFFSetField(tiff,TIFFTAG_YPOSITION,(float) image->page.y/ + image->y_resolution); + } + } + if (image->chromaticity.white_point.x != 0.0) + { + float + chromaticity[6]; + + /* + Set image chromaticity. + */ + chromaticity[0]=(float) image->chromaticity.red_primary.x; + chromaticity[1]=(float) image->chromaticity.red_primary.y; + chromaticity[2]=(float) image->chromaticity.green_primary.x; + chromaticity[3]=(float) image->chromaticity.green_primary.y; + chromaticity[4]=(float) image->chromaticity.blue_primary.x; + chromaticity[5]=(float) image->chromaticity.blue_primary.y; + (void) TIFFSetField(tiff,TIFFTAG_PRIMARYCHROMATICITIES,chromaticity); + chromaticity[0]=(float) image->chromaticity.white_point.x; + chromaticity[1]=(float) image->chromaticity.white_point.y; + (void) TIFFSetField(tiff,TIFFTAG_WHITEPOINT,chromaticity); + } + if ((LocaleCompare(image_info->magick,"PTIF") != 0) && + (image_info->adjoin != MagickFalse) && (imageListLength > 1)) + { + (void) TIFFSetField(tiff,TIFFTAG_SUBFILETYPE,FILETYPE_PAGE); + if (image->scene != 0) + (void) TIFFSetField(tiff,TIFFTAG_PAGENUMBER,(uint16) image->scene, + imageListLength); + } + if (image->orientation != UndefinedOrientation) + (void) TIFFSetField(tiff,TIFFTAG_ORIENTATION,(uint16) image->orientation); + else + (void) TIFFSetField(tiff,TIFFTAG_ORIENTATION,ORIENTATION_TOPLEFT); + (void) TIFFSetProfiles(tiff,image); + { + uint16 + page, + pages; + + page=(uint16) scene; + pages=(uint16) imageListLength; + if ((LocaleCompare(image_info->magick,"PTIF") != 0) && + (image_info->adjoin != MagickFalse) && (pages > 1)) + (void) TIFFSetField(tiff,TIFFTAG_SUBFILETYPE,FILETYPE_PAGE); + (void) TIFFSetField(tiff,TIFFTAG_PAGENUMBER,page,pages); + } + (void) TIFFSetProperties(tiff,image_info,image); + /* + Write image scanlines. + */ + if (GetTIFFInfo(image_info,tiff,&tiff_info) == MagickFalse) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + if (compress_tag == COMPRESSION_CCITTFAX4) + (void) TIFFSetField(tiff,TIFFTAG_ROWSPERSTRIP,(uint32) image->rows); + quantum_info->endian=LSBEndian; + pixels=GetQuantumPixels(quantum_info); + tiff_info.scanline=GetQuantumPixels(quantum_info); + switch (photometric) + { + case PHOTOMETRIC_CIELAB: + case PHOTOMETRIC_YCBCR: + case PHOTOMETRIC_RGB: + { + /* + RGB TIFF image. + */ + switch (image_info->interlace) + { + case NoInterlace: + default: + { + quantum_type=RGBQuantum; + if (image->matte != MagickFalse) + quantum_type=RGBAQuantum; + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + tiff_status=TIFFWritePixels(tiff,&tiff_info,y,0,image); + if (tiff_status == -1) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + case PartitionInterlace: + { + /* + Plane interlacing: RRRRRR...GGGGGG...BBBBBB... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,pixels,&image->exception); + tiff_status=TIFFWritePixels(tiff,&tiff_info,y,0,image); + if (tiff_status == -1) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,100,400); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GreenQuantum,pixels,&image->exception); + tiff_status=TIFFWritePixels(tiff,&tiff_info,y,1,image); + if (tiff_status == -1) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,200,400); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlueQuantum,pixels,&image->exception); + tiff_status=TIFFWritePixels(tiff,&tiff_info,y,2,image); + if (tiff_status == -1) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,300,400); + if (status == MagickFalse) + break; + } + if (image->matte != MagickFalse) + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + tiff_status=TIFFWritePixels(tiff,&tiff_info,y,3,image); + if (tiff_status == -1) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,400,400); + if (status == MagickFalse) + break; + } + break; + } + } + break; + } + case PHOTOMETRIC_SEPARATED: + { + /* + CMYK TIFF image. + */ + quantum_type=CMYKQuantum; + if (image->matte != MagickFalse) + quantum_type=CMYKAQuantum; + if (image->colorspace != CMYKColorspace) + (void) TransformImageColorspace(image,CMYKColorspace); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + tiff_status=TIFFWritePixels(tiff,&tiff_info,y,0,image); + if (tiff_status == -1) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PHOTOMETRIC_PALETTE: + { + uint16 + *blue, + *green, + *red; + + /* + Colormapped TIFF image. + */ + red=(uint16 *) AcquireQuantumMemory(65536,sizeof(*red)); + green=(uint16 *) AcquireQuantumMemory(65536,sizeof(*green)); + blue=(uint16 *) AcquireQuantumMemory(65536,sizeof(*blue)); + if ((red == (uint16 *) NULL) || (green == (uint16 *) NULL) || + (blue == (uint16 *) NULL)) + { + if (red != (uint16 *) NULL) + red=(uint16 *) RelinquishMagickMemory(red); + if (green != (uint16 *) NULL) + green=(uint16 *) RelinquishMagickMemory(green); + if (blue != (uint16 *) NULL) + blue=(uint16 *) RelinquishMagickMemory(blue); + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Initialize TIFF colormap. + */ + (void) memset(red,0,65536*sizeof(*red)); + (void) memset(green,0,65536*sizeof(*green)); + (void) memset(blue,0,65536*sizeof(*blue)); + for (i=0; i < (ssize_t) image->colors; i++) + { + red[i]=ScaleQuantumToShort(image->colormap[i].red); + green[i]=ScaleQuantumToShort(image->colormap[i].green); + blue[i]=ScaleQuantumToShort(image->colormap[i].blue); + } + (void) TIFFSetField(tiff,TIFFTAG_COLORMAP,red,green,blue); + red=(uint16 *) RelinquishMagickMemory(red); + green=(uint16 *) RelinquishMagickMemory(green); + blue=(uint16 *) RelinquishMagickMemory(blue); + } + default: + { + /* + Convert PseudoClass packets to contiguous grayscale scanlines. + */ + quantum_type=IndexQuantum; + if (image->matte != MagickFalse) + { + if (photometric != PHOTOMETRIC_PALETTE) + quantum_type=GrayAlphaQuantum; + else + quantum_type=IndexAlphaQuantum; + } + else + if (photometric != PHOTOMETRIC_PALETTE) + quantum_type=GrayQuantum; + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + (void) ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + tiff_status=TIFFWritePixels(tiff,&tiff_info,y,0,image); + if (tiff_status == -1) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (image->colorspace == LabColorspace) + DecodeLabImage(image,&image->exception); + DestroyTIFFInfo(&tiff_info); + if (tiff_status == -1) + { + status=MagickFalse; + break; + } + /* TIFFPrintDirectory(tiff,stdout,MagickFalse); */ + if (TIFFWriteDirectory(tiff) == 0) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + if (image == (Image *) NULL) + break; + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + TIFFClose(tiff); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/tile.c b/ImageMagick-6.9.12-44/coders/tile.c new file mode 100644 index 0000000..646a9b7 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/tile.c @@ -0,0 +1,208 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% TTTTT IIIII L EEEEE % +% T I L E % +% T I L EEE % +% T I L E % +% T IIIII LLLLL EEEEE % +% % +% % +% Return A Tiled Image Using Texture. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d T I L E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadTILEImage tiles a texture on an image. It allocates the +% memory necessary for the new Image structure and returns a pointer to the +% new image. +% +% The format of the ReadTILEImage method is: +% +% Image *ReadTILEImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadTILEImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image, + *tile_image; + + ImageInfo + *read_info; + + MagickBooleanType + status; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + *read_info->magick='\0'; + if (read_info->size != (char *) NULL) + read_info->size=DestroyString(read_info->size); + tile_image=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (tile_image == (Image *) NULL) + return((Image *) NULL); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (*image_info->filename == '\0') + ThrowReaderException(OptionError,"MustSpecifyAnImageName"); + image->colorspace=tile_image->colorspace; + image->matte=tile_image->matte; + (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent); + if (LocaleCompare(tile_image->magick,"PATTERN") == 0) + { + tile_image->tile_offset.x=0; + tile_image->tile_offset.y=0; + } + (void) TextureImage(image,tile_image); + tile_image=DestroyImage(tile_image); + if ((image->colorspace == LinearGRAYColorspace) || + (image->colorspace == GRAYColorspace)) + image->type=GrayscaleType; + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r T I L E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterTILEImage() adds attributes for the TILE image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterTILEImage method is: +% +% size_t RegisterTILEImage(void) +% +*/ +ModuleExport size_t RegisterTILEImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("TILE"); + entry->decoder=(DecodeImageHandler *) ReadTILEImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Tile image with a texture"); + entry->magick_module=ConstantString("TILE"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r T I L E I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterTILEImage() removes format registrations made by the +% TILE module from the list of supported formats. +% +% The format of the UnregisterTILEImage method is: +% +% UnregisterTILEImage(void) +% +*/ +ModuleExport void UnregisterTILEImage(void) +{ + (void) UnregisterMagickInfo("TILE"); +} diff --git a/ImageMagick-6.9.12-44/coders/tim.c b/ImageMagick-6.9.12-44/coders/tim.c new file mode 100644 index 0000000..b2fd86c --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/tim.c @@ -0,0 +1,499 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% TTTTT IIIII M M % +% T I MM MM % +% T I M M M % +% T I M M % +% T IIIII M M % +% % +% % +% Read PSX TIM Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colormap.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d T I M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadTIMImage() reads a PSX TIM image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% Contributed by os@scee.sony.co.uk. +% +% The format of the ReadTIMImage method is: +% +% Image *ReadTIMImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadTIMImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + typedef struct _TIMInfo + { + size_t + id, + flag; + } TIMInfo; + + TIMInfo + tim_info; + + Image + *image; + + int + bits_per_pixel, + has_clut; + + MagickBooleanType + status; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + i; + + unsigned char + *p; + + size_t + bytes_per_line, + height, + image_size, + pixel_mode, + width; + + ssize_t + count, + y; + + unsigned char + *tim_pixels; + + unsigned short + word; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Determine if this a TIM file. + */ + tim_info.id=ReadBlobLSBLong(image); + do + { + /* + Verify TIM identifier. + */ + if (tim_info.id != 0x00000010) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + tim_info.flag=ReadBlobLSBLong(image); + has_clut=tim_info.flag & (1 << 3) ? 1 : 0; + pixel_mode=tim_info.flag & 0x07; + switch ((int) pixel_mode) + { + case 0: bits_per_pixel=4; break; + case 1: bits_per_pixel=8; break; + case 2: bits_per_pixel=16; break; + case 3: bits_per_pixel=24; break; + default: bits_per_pixel=4; break; + } + image->depth=8; + if (has_clut) + { + unsigned char + *tim_colormap; + + /* + Read TIM raster colormap. + */ + (void)ReadBlobLSBLong(image); + (void)ReadBlobLSBShort(image); + (void)ReadBlobLSBShort(image); + width=ReadBlobLSBShort(image); + height=ReadBlobLSBShort(image); + image->columns=width; + image->rows=height; + if (AcquireImageColormap(image,pixel_mode == 1 ? 256UL : 16UL) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + tim_colormap=(unsigned char *) AcquireQuantumMemory(image->colors, + 2UL*sizeof(*tim_colormap)); + if (tim_colormap == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,2*image->colors,tim_colormap); + if (count != (ssize_t) (2*image->colors)) + { + tim_colormap=(unsigned char *) RelinquishMagickMemory(tim_colormap); + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + } + p=tim_colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + word=(*p++); + word|=(unsigned short) (*p++ << 8); + image->colormap[i].blue=ScaleCharToQuantum( + ScaleColor5to8(1UL*(word >> 10) & 0x1f)); + image->colormap[i].green=ScaleCharToQuantum( + ScaleColor5to8(1UL*(word >> 5) & 0x1f)); + image->colormap[i].red=ScaleCharToQuantum( + ScaleColor5to8(1UL*word & 0x1f)); + } + tim_colormap=(unsigned char *) RelinquishMagickMemory(tim_colormap); + } + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + /* + Read image data. + */ + (void) ReadBlobLSBLong(image); + (void) ReadBlobLSBShort(image); + (void) ReadBlobLSBShort(image); + width=ReadBlobLSBShort(image); + height=ReadBlobLSBShort(image); + image_size=2*width*height; + bytes_per_line=width*2; + width=(width*16)/bits_per_pixel; + image->columns=width; + image->rows=height; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + tim_pixels=(unsigned char *) AcquireQuantumMemory(image_size, + sizeof(*tim_pixels)); + if (tim_pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,image_size,tim_pixels); + if (count != (ssize_t) (image_size)) + { + tim_pixels=(unsigned char *) RelinquishMagickMemory(tim_pixels); + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + } + /* + Convert TIM raster image to pixel packets. + */ + switch (bits_per_pixel) + { + case 4: + { + /* + Convert PseudoColor scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + p=tim_pixels+y*bytes_per_line; + for (x=0; x < ((ssize_t) image->columns-1); x+=2) + { + SetPixelIndex(indexes+x,(*p) & 0x0f); + SetPixelIndex(indexes+x+1,(*p >> 4) & 0x0f); + p++; + } + if ((image->columns % 2) != 0) + { + SetPixelIndex(indexes+x,(*p >> 4) & 0x0f); + p++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 8: + { + /* + Convert PseudoColor scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + p=tim_pixels+y*bytes_per_line; + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,*p++); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 16: + { + /* + Convert DirectColor scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=tim_pixels+y*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + word=(*p++); + word|=(*p++ << 8); + SetPixelBlue(q,ScaleCharToQuantum(ScaleColor5to8( + (1UL*word >> 10) & 0x1f))); + SetPixelGreen(q,ScaleCharToQuantum(ScaleColor5to8( + (1UL*word >> 5) & 0x1f))); + SetPixelRed(q,ScaleCharToQuantum(ScaleColor5to8( + (1UL*word >> 0) & 0x1f))); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case 24: + { + /* + Convert DirectColor scanline. + */ + for (y=(ssize_t) image->rows-1; y >= 0; y--) + { + p=tim_pixels+y*bytes_per_line; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + default: + { + tim_pixels=(unsigned char *) RelinquishMagickMemory(tim_pixels); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + } + if (image->storage_class == PseudoClass) + (void) SyncImage(image); + tim_pixels=(unsigned char *) RelinquishMagickMemory(tim_pixels); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + tim_info.id=ReadBlobLSBLong(image); + if (tim_info.id == 0x00000010) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while (tim_info.id == 0x00000010); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r T I M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterTIMImage() adds attributes for the TIM image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterTIMImage method is: +% +% size_t RegisterTIMImage(void) +% +*/ +ModuleExport size_t RegisterTIMImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("TIM"); + entry->decoder=(DecodeImageHandler *) ReadTIMImage; + entry->description=ConstantString("PSX TIM"); + entry->magick_module=ConstantString("TIM"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r T I M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterTIMImage() removes format registrations made by the +% TIM module from the list of supported formats. +% +% The format of the UnregisterTIMImage method is: +% +% UnregisterTIMImage(void) +% +*/ +ModuleExport void UnregisterTIMImage(void) +{ + (void) UnregisterMagickInfo("TIM"); +} diff --git a/ImageMagick-6.9.12-44/coders/ttf.c b/ImageMagick-6.9.12-44/coders/ttf.c new file mode 100644 index 0000000..095dd86 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/ttf.c @@ -0,0 +1,432 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% TTTTT TTTTT FFFFF % +% T T F % +% T T FFF % +% T T F % +% T T F % +% % +% % +% Return A Preview For A TrueType or Postscript Font % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/type.h" +#include "magick/utility.h" +#if defined(MAGICKCORE_FREETYPE_DELEGATE) +#include +#if defined(FT_FREETYPE_H) +# include FT_FREETYPE_H +#else +# include +#endif +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P F A % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPFA()() returns MagickTrue if the image format type, identified by the +% magick string, is PFA. +% +% The format of the IsPFA method is: +% +% MagickBooleanType IsPFA(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +% +*/ +static MagickBooleanType IsPFA(const unsigned char *magick,const size_t length) +{ + if (length < 14) + return(MagickFalse); + if (LocaleNCompare((char *) magick,"%!PS-AdobeFont",14) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s T T F % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsTTF()() returns MagickTrue if the image format type, identified by the +% magick string, is TTF. +% +% The format of the IsTTF method is: +% +% MagickBooleanType IsTTF(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +% +*/ +static MagickBooleanType IsTTF(const unsigned char *magick,const size_t length) +{ + if (length < 5) + return(MagickFalse); + if (((int) magick[0] == 0x00) && ((int) magick[1] == 0x01) && + ((int) magick[2] == 0x00) && ((int) magick[3] == 0x00) && + ((int) magick[4] == 0x00)) + return(MagickTrue); + return(MagickFalse); +} + +#if defined(MAGICKCORE_FREETYPE_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d T T F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadTTFImage() reads a TrueType font file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadTTFImage method is: +% +% Image *ReadTTFImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadTTFImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + buffer[MaxTextExtent], + *text; + + const TypeInfo + *type_info; + + DrawInfo + *draw_info; + + Image + *image; + + MagickBooleanType + status; + + PixelPacket + background_color; + + ssize_t + i, + x; + + PixelPacket + *q; + + ssize_t + y; + + static const char + Text[] = + "abcdefghijklmnopqrstuvwxyz\n" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" + "0123456789.:,;(*!?}^)#${%^&-+@\n"; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + image->columns=800; + image->rows=480; + type_info=GetTypeInfo(image_info->filename,exception); + if ((type_info != (const TypeInfo *) NULL) && + (type_info->glyphs != (char *) NULL)) + (void) CopyMagickString(image->filename,type_info->glyphs,MaxTextExtent); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Color canvas with background color + */ + background_color=image_info->background_color; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + *q++=background_color; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + (void) CopyMagickString(image->magick,image_info->magick,MaxTextExtent); + (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent); + /* + Prepare drawing commands + */ + y=20; + draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL); + draw_info->font=AcquireString(""); + (void) ImageToFile(image,draw_info->font,exception); + ConcatenateString(&draw_info->primitive,"push graphic-context\n"); + (void) FormatLocaleString(buffer,MaxTextExtent," viewbox 0 0 %.20g %.20g\n", + (double) image->columns,(double) image->rows); + ConcatenateString(&draw_info->primitive,buffer); + ConcatenateString(&draw_info->primitive," font-size 18\n"); + (void) FormatLocaleString(buffer,MaxTextExtent," text 10,%.20g '",(double) y); + ConcatenateString(&draw_info->primitive,buffer); + text=EscapeString(Text,'"'); + ConcatenateString(&draw_info->primitive,text); + text=DestroyString(text); + (void) FormatLocaleString(buffer,MaxTextExtent,"'\n"); + ConcatenateString(&draw_info->primitive,buffer); + y+=20*(ssize_t) MultilineCensus((char *) Text)+20; + for (i=12; i <= 72; i+=6) + { + y+=i+12; + ConcatenateString(&draw_info->primitive," font-size 18\n"); + (void) FormatLocaleString(buffer,MaxTextExtent," text 10,%.20g '%.20g'\n", + (double) y,(double) i); + ConcatenateString(&draw_info->primitive,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent," font-size %.20g\n", + (double) i); + ConcatenateString(&draw_info->primitive,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent," text 50,%.20g " + "'That which does not destroy me, only makes me stronger.'\n",(double) y); + ConcatenateString(&draw_info->primitive,buffer); + if (i >= 24) + i+=6; + } + ConcatenateString(&draw_info->primitive,"pop graphic-context"); + (void) DrawImage(image,draw_info); + /* + Relinquish resources. + */ + (void) RelinquishUniqueFileResource(draw_info->font); + draw_info=DestroyDrawInfo(draw_info); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} +#endif /* MAGICKCORE_FREETYPE_DELEGATE */ + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r T T F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterTTFImage() adds attributes for the TTF image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterTTFImage method is: +% +% size_t RegisterTTFImage(void) +% +*/ +ModuleExport size_t RegisterTTFImage(void) +{ + char + version[MaxTextExtent]; + + MagickInfo + *entry; + + *version='\0'; +#if defined(FREETYPE_MAJOR) && defined(FREETYPE_MINOR) && defined(FREETYPE_PATCH) + (void) FormatLocaleString(version,MaxTextExtent,"Freetype %d.%d.%d", + FREETYPE_MAJOR,FREETYPE_MINOR,FREETYPE_PATCH); +#endif + entry=SetMagickInfo("DFONT"); +#if defined(MAGICKCORE_FREETYPE_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadTTFImage; +#endif + entry->magick=(IsImageFormatHandler *) IsTTF; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Multi-face font package"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick_module=ConstantString("TTF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PFA"); +#if defined(MAGICKCORE_FREETYPE_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadTTFImage; +#endif + entry->magick=(IsImageFormatHandler *) IsPFA; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Postscript Type 1 font (ASCII)"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick_module=ConstantString("TTF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PFB"); +#if defined(MAGICKCORE_FREETYPE_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadTTFImage; +#endif + entry->magick=(IsImageFormatHandler *) IsPFA; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Postscript Type 1 font (binary)"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick_module=ConstantString("TTF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("OTF"); +#if defined(MAGICKCORE_FREETYPE_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadTTFImage; +#endif + entry->magick=(IsImageFormatHandler *) IsTTF; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Open Type font"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick_module=ConstantString("TTF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("TTC"); +#if defined(MAGICKCORE_FREETYPE_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadTTFImage; +#endif + entry->magick=(IsImageFormatHandler *) IsTTF; + entry->adjoin=MagickFalse; + entry->description=ConstantString("TrueType font collection"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick_module=ConstantString("TTF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("TTF"); +#if defined(MAGICKCORE_FREETYPE_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadTTFImage; +#endif + entry->magick=(IsImageFormatHandler *) IsTTF; + entry->adjoin=MagickFalse; + entry->description=ConstantString("TrueType font"); + if (*version != '\0') + entry->version=ConstantString(version); + entry->magick_module=ConstantString("TTF"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r T T F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterTTFImage() removes format registrations made by the +% TTF module from the list of supported formats. +% +% The format of the UnregisterTTFImage method is: +% +% UnregisterTTFImage(void) +% +*/ +ModuleExport void UnregisterTTFImage(void) +{ + (void) UnregisterMagickInfo("TTF"); + (void) UnregisterMagickInfo("TTC"); + (void) UnregisterMagickInfo("OTF"); + (void) UnregisterMagickInfo("PFA"); + (void) UnregisterMagickInfo("PFB"); + (void) UnregisterMagickInfo("PFA"); + (void) UnregisterMagickInfo("DFONT"); +} diff --git a/ImageMagick-6.9.12-44/coders/txt.c b/ImageMagick-6.9.12-44/coders/txt.c new file mode 100644 index 0000000..c9720f3 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/txt.c @@ -0,0 +1,889 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% TTTTT X X TTTTT % +% T X X T % +% T X T % +% T X X T % +% T X X T % +% % +% % +% Render Text Onto A Canvas Image. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/annotate.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/constitute.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteTXTImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s T X T % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsTXT() returns MagickTrue if the image format type, identified by the magick +% string, is TXT. +% +% The format of the IsTXT method is: +% +% MagickBooleanType IsTXT(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsTXT(const unsigned char *magick,const size_t length) +{ +#define MagickID "# ImageMagick pixel enumeration:" + + char + colorspace[MaxTextExtent]; + + ssize_t + count; + + unsigned long + columns, + depth, + rows; + + if (length < 40) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,MagickID,strlen(MagickID)) != 0) + return(MagickFalse); + count=(ssize_t) sscanf((const char *) magick+32,"%lu,%lu,%lu,%32s",&columns, + &rows,&depth,colorspace); + if (count != 4) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d T E X T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadTEXTImage() reads a text file and returns it as an image. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadTEXTImage method is: +% +% Image *ReadTEXTImage(const ImageInfo *image_info,Image *image, +% char *text,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the image. +% +% o text: the text storage buffer. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadTEXTImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + char + filename[MaxTextExtent], + geometry[MaxTextExtent], + *p, + text[MaxTextExtent]; + + DrawInfo + *draw_info; + + Image + *image, + *texture; + + MagickBooleanType + status; + + PointInfo + delta; + + RectangleInfo + page; + + ssize_t + offset; + + TypeMetric + metrics; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + (void) memset(text,0,sizeof(text)); + (void) ReadBlobString(image,text); + /* + Set the page geometry. + */ + delta.x=DefaultResolution; + delta.y=DefaultResolution; + if ((image->x_resolution == 0.0) || (image->y_resolution == 0.0)) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(PSDensityGeometry,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + page.width=612; + page.height=792; + page.x=43; + page.y=43; + if (image_info->page != (char *) NULL) + (void) ParseAbsoluteGeometry(image_info->page,&page); + /* + Initialize Image structure. + */ + image->columns=(size_t) floor((((double) page.width*image->x_resolution)/ + delta.x)+0.5); + image->rows=(size_t) floor((((double) page.height*image->y_resolution)/ + delta.y)+0.5); + status=SetImageExtent(image,image->columns,image->rows); + if (status != MagickFalse) + status=ResetImagePixels(image,&image->exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + image->page.x=0; + image->page.y=0; + texture=(Image *) NULL; + if (image_info->texture != (char *) NULL) + { + ImageInfo + *read_info; + + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) CopyMagickString(read_info->filename,image_info->texture, + MaxTextExtent); + texture=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + } + /* + Annotate the text image. + */ + (void) SetImageBackgroundColor(image); + draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL); + (void) CloneString(&draw_info->text,image_info->filename); + (void) FormatLocaleString(geometry,MaxTextExtent,"%gx%g%+g%+g",(double) + image->columns,(double) image->rows,(double) page.x,(double) page.y); + (void) CloneString(&draw_info->geometry,geometry); + status=GetTypeMetrics(image,draw_info,&metrics); + if (status == MagickFalse) + { + draw_info=DestroyDrawInfo(draw_info); + ThrowReaderException(TypeError,"UnableToGetTypeMetrics"); + } + page.y=CastDoubleToLong(ceil((double) page.y+metrics.ascent-0.5)); + (void) FormatLocaleString(geometry,MaxTextExtent,"%gx%g%+g%+g",(double) + image->columns,(double) image->rows,(double) page.x,(double) page.y); + (void) CloneString(&draw_info->geometry,geometry); + (void) CopyMagickString(filename,image_info->filename,MaxTextExtent); + if (*draw_info->text != '\0') + *draw_info->text='\0'; + p=text; + for (offset=2*page.y; p != (char *) NULL; ) + { + /* + Annotate image with text. + */ + (void) ConcatenateString(&draw_info->text,text); + (void) ConcatenateString(&draw_info->text,"\n"); + offset+=(ssize_t) (metrics.ascent-metrics.descent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) offset, + image->rows); + if (status == MagickFalse) + break; + } + p=ReadBlobString(image,text); + if ((offset < (ssize_t) image->rows) && (p != (char *) NULL)) + continue; + if (texture != (Image *) NULL) + { + MagickProgressMonitor + progress_monitor; + + progress_monitor=SetImageProgressMonitor(image, + (MagickProgressMonitor) NULL,image->client_data); + (void) TextureImage(image,texture); + (void) SetImageProgressMonitor(image,progress_monitor, + image->client_data); + } + (void) AnnotateImage(image,draw_info); + if (p == (char *) NULL) + break; + /* + Page is full-- allocate next image structure. + */ + *draw_info->text='\0'; + offset=2*page.y; + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image->next->columns=image->columns; + image->next->rows=image->rows; + image=SyncNextImageInList(image); + (void) CopyMagickString(image->filename,filename,MaxTextExtent); + (void) SetImageBackgroundColor(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + if (texture != (Image *) NULL) + { + MagickProgressMonitor + progress_monitor; + + progress_monitor=SetImageProgressMonitor(image, + (MagickProgressMonitor) NULL,image->client_data); + (void) TextureImage(image,texture); + (void) SetImageProgressMonitor(image,progress_monitor,image->client_data); + } + (void) AnnotateImage(image,draw_info); + if (texture != (Image *) NULL) + texture=DestroyImageList(texture); + draw_info=DestroyDrawInfo(draw_info); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d T X T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadTXTImage() reads a text file and returns it as an image. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the ReadTXTImage method is: +% +% Image *ReadTXTImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadTXTImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + colorspace[MaxTextExtent], + text[MaxTextExtent]; + + double + max_value, + x_offset, + y_offset; + + Image + *image; + + IndexPacket + *indexes; + + MagickBooleanType + status; + + MagickPixelPacket + pixel; + + QuantumAny + range; + + ssize_t + i, + x; + + PixelPacket + *q; + + ssize_t + count, + type, + y; + + unsigned long + depth, + height, + width; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + (void) memset(text,0,sizeof(text)); + (void) ReadBlobString(image,text); + if (LocaleNCompare((char *) text,MagickID,strlen(MagickID)) != 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + x_offset=(-1.0); + y_offset=(-1.0); + q=(PixelPacket *) NULL; + do + { + width=0; + height=0; + max_value=0.0; + *colorspace='\0'; + count=(ssize_t) sscanf(text+32,"%lu,%lu,%lf,%32s",&width,&height,&max_value, + colorspace); + if ((count != 4) || (width == 0) || (height == 0) || (max_value == 0.0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + image->columns=width; + image->rows=height; + if ((max_value == 0.0) || (max_value > 18446744073709551615.0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + for (depth=1; ((double) GetQuantumRange(depth)+1) < max_value; depth++) ; + image->depth=depth; + status=SetImageExtent(image,image->columns,image->rows); + if (status != MagickFalse) + status=ResetImagePixels(image,&image->exception); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + LocaleLower(colorspace); + i=(ssize_t) strlen(colorspace)-1; + image->matte=MagickFalse; + if ((i > 0) && (colorspace[i] == 'a')) + { + colorspace[i]='\0'; + image->matte=MagickTrue; + } + type=ParseCommandOption(MagickColorspaceOptions,MagickFalse,colorspace); + if (type < 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + image->colorspace=(ColorspaceType) type; + (void) memset(&pixel,0,sizeof(pixel)); + (void) SetImageBackgroundColor(image); + range=GetQuantumRange(image->depth); + status=MagickTrue; + for (y=0; y < (ssize_t) image->rows; y++) + { + double + blue, + green, + index, + opacity, + red; + + if (status == MagickFalse) + break; + red=0.0; + green=0.0; + blue=0.0; + index=0.0; + opacity=0.0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (ReadBlobString(image,text) == (char *) NULL) + { + status=MagickFalse; + break; + } + switch (image->colorspace) + { + case LinearGRAYColorspace: + case GRAYColorspace: + { + if (image->matte != MagickFalse) + { + (void) sscanf(text,"%lf,%lf: (%lf%*[%,]%lf%*[%,]",&x_offset, + &y_offset,&red,&opacity); + green=red; + blue=red; + break; + } + (void) sscanf(text,"%lf,%lf: (%lf%*[%,]",&x_offset,&y_offset,&red); + green=red; + blue=red; + break; + } + case CMYKColorspace: + { + if (image->matte != MagickFalse) + { + (void) sscanf(text, + "%lf,%lf: (%lf%*[%,]%lf%*[%,]%lf%*[%,]%lf%*[%,]%lf%*[%,]", + &x_offset,&y_offset,&red,&green,&blue,&index,&opacity); + break; + } + (void) sscanf(text, + "%lf,%lf: (%lf%*[%,]%lf%*[%,]%lf%*[%,]%lf%*[%,]",&x_offset, + &y_offset,&red,&green,&blue,&index); + break; + } + default: + { + if (image->matte != MagickFalse) + { + (void) sscanf(text, + "%lf,%lf: (%lf%*[%,]%lf%*[%,]%lf%*[%,]%lf%*[%,]", + &x_offset,&y_offset,&red,&green,&blue,&opacity); + break; + } + (void) sscanf(text,"%lf,%lf: (%lf%*[%,]%lf%*[%,]%lf%*[%,]", + &x_offset,&y_offset,&red,&green,&blue); + break; + } + } + if (strchr(text,'%') != (char *) NULL) + { + red*=0.01*range; + green*=0.01*range; + blue*=0.01*range; + index*=0.01*range; + opacity*=0.01*range; + } + if (image->colorspace == LabColorspace) + { + green+=(range+1)/2.0; + blue+=(range+1)/2.0; + } + pixel.red=(MagickRealType) ScaleAnyToQuantum(CastDoubleToQuantumAny( + red),range); + pixel.green=(MagickRealType) ScaleAnyToQuantum(CastDoubleToQuantumAny( + green),range); + pixel.blue=(MagickRealType) ScaleAnyToQuantum(CastDoubleToQuantumAny( + blue),range); + pixel.index=(MagickRealType) ScaleAnyToQuantum(CastDoubleToQuantumAny( + index),range); + pixel.opacity=(MagickRealType) ScaleAnyToQuantum(CastDoubleToQuantumAny( + opacity),range); + q=GetAuthenticPixels(image,CastDoubleToLong(x_offset),CastDoubleToLong( + y_offset),1,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + break; + } + SetPixelRed(q,pixel.red); + SetPixelGreen(q,pixel.green); + SetPixelBlue(q,pixel.blue); + if (image->colorspace == CMYKColorspace) + { + indexes=GetAuthenticIndexQueue(image); + SetPixelIndex(indexes,pixel.index); + } + if (image->matte != MagickFalse) + SetPixelAlpha(q,pixel.opacity); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + { + status=MagickFalse; + break; + } + } + } + if (status == MagickFalse) + break; + *text='\0'; + (void) ReadBlobString(image,text); + if (LocaleNCompare((char *) text,MagickID,strlen(MagickID)) == 0) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while (LocaleNCompare((char *) text,MagickID,strlen(MagickID)) == 0); + (void) CloseBlob(image); + if (q == (PixelPacket *) NULL) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r T X T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterTXTImage() adds attributes for the TXT image format to the +% list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterTXTImage method is: +% +% size_t RegisterTXTImage(void) +% +*/ +ModuleExport size_t RegisterTXTImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("SPARSE-COLOR"); + entry->encoder=(EncodeImageHandler *) WriteTXTImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Sparse Color"); + entry->magick_module=ConstantString("TXT"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("TEXT"); + entry->decoder=(DecodeImageHandler *) ReadTEXTImage; + entry->encoder=(EncodeImageHandler *) WriteTXTImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Text"); + entry->magick_module=ConstantString("TXT"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("TXT"); + entry->decoder=(DecodeImageHandler *) ReadTXTImage; + entry->encoder=(EncodeImageHandler *) WriteTXTImage; + entry->description=ConstantString("Text"); + entry->magick=(IsImageFormatHandler *) IsTXT; + entry->magick_module=ConstantString("TXT"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r T X T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterTXTImage() removes format registrations made by the +% TXT module from the list of supported format. +% +% The format of the UnregisterTXTImage method is: +% +% UnregisterTXTImage(void) +% +*/ +ModuleExport void UnregisterTXTImage(void) +{ + (void) UnregisterMagickInfo("TEXT"); + (void) UnregisterMagickInfo("TXT"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e T X T I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteTXTImage writes the pixel values as text numbers. +% +% The format of the WriteTXTImage method is: +% +% MagickBooleanType WriteTXTImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteTXTImage(const ImageInfo *image_info,Image *image) +{ + char + buffer[MaxTextExtent], + colorspace[MaxTextExtent], + tuple[MaxTextExtent]; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + MagickPixelPacket + pixel; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + size_t + imageListLength; + + ssize_t + y; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + imageListLength=GetImageListLength(image); + do + { + ComplianceType + compliance; + + const char + *value; + + (void) CopyMagickString(colorspace,CommandOptionToMnemonic( + MagickColorspaceOptions,(ssize_t) image->colorspace),MaxTextExtent); + LocaleLower(colorspace); + image->depth=GetImageQuantumDepth(image,MagickTrue); + if (image->matte != MagickFalse) + (void) ConcatenateMagickString(colorspace,"a",MaxTextExtent); + compliance=NoCompliance; + value=GetImageOption(image_info,"txt:compliance"); + if (value != (char *) NULL) + compliance=(ComplianceType) ParseCommandOption(MagickComplianceOptions, + MagickFalse,value); + if (LocaleCompare(image_info->magick,"SPARSE-COLOR") != 0) + { + (void) FormatLocaleString(buffer,MaxTextExtent, + "# ImageMagick pixel enumeration: %.20g,%.20g,%.20g,%s\n",(double) + image->columns,(double) image->rows,(double) + GetQuantumRange(image->depth),colorspace); + (void) WriteBlobString(image,buffer); + } + GetMagickPixelPacket(image,&pixel); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + SetMagickPixelPacket(image,p,indexes == (IndexPacket *) NULL ? NULL : + indexes+x,&pixel); + if (LocaleCompare(image_info->magick,"SPARSE-COLOR") == 0) + { + /* + Sparse-color format. + */ + if ((image->matte == MagickFalse) || + (GetPixelOpacity(p) == (Quantum) OpaqueOpacity)) + { + GetColorTuple(&pixel,MagickFalse,tuple); + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g,%.20g,", + (double) x,(double) y); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,tuple); + (void) WriteBlobString(image," "); + } + p++; + continue; + } + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g,%.20g: ",(double) + x,(double) y); + (void) WriteBlobString(image,buffer); + (void) CopyMagickString(tuple,"(",MaxTextExtent); + ConcatenateColorComponent(&pixel,RedChannel,compliance,tuple); + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,GreenChannel,compliance,tuple); + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,BlueChannel,compliance,tuple); + if (pixel.colorspace == CMYKColorspace) + { + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,IndexChannel,compliance,tuple); + } + if (pixel.matte != MagickFalse) + { + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,AlphaChannel,compliance,tuple); + } + (void) ConcatenateMagickString(tuple,")",MaxTextExtent); + (void) WriteBlobString(image,tuple); + (void) WriteBlobString(image," "); + GetColorTuple(&pixel,MagickTrue,tuple); + (void) FormatLocaleString(buffer,MaxTextExtent,"%s",tuple); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image," "); + (void) QueryMagickColorname(image,&pixel,SVGCompliance,tuple, + &image->exception); + (void) WriteBlobString(image,tuple); + (void) WriteBlobString(image,"\n"); + p++; + } + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/uil.c b/ImageMagick-6.9.12-44/coders/uil.c new file mode 100644 index 0000000..40b9466 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/uil.c @@ -0,0 +1,385 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U U IIIII L % +% U U I L % +% U U I L % +% U U I L % +% UUU IIIII LLLLL % +% % +% % +% Write X-Motif UIL Table. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image-private.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteUILImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r U I L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterUILImage() adds attributes for the UIL image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterUILImage method is: +% +% size_t RegisterUILImage(void) +% +*/ +ModuleExport size_t RegisterUILImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("UIL"); + entry->encoder=(EncodeImageHandler *) WriteUILImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("X-Motif UIL table"); + entry->magick_module=ConstantString("UIL"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r U I L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterUILImage() removes format registrations made by the +% UIL module from the list of supported formats. +% +% The format of the UnregisterUILImage method is: +% +% UnregisterUILImage(void) +% +*/ +ModuleExport void UnregisterUILImage(void) +{ + (void) UnregisterMagickInfo("UIL"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e U I L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Procedure WriteUILImage() writes an image to a file in the X-Motif UIL table +% format. +% +% The format of the WriteUILImage method is: +% +% MagickBooleanType WriteUILImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteUILImage(const ImageInfo *image_info,Image *image) +{ +#define MaxCixels 92 + + char + basename[MaxTextExtent], + buffer[MaxTextExtent], + name[MaxTextExtent], + *symbol; + + ExceptionInfo + *exception; + + int + j; + + MagickBooleanType + status, + transparent; + + MagickPixelPacket + pixel; + + MagickSizeType + number_pixels; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + size_t + characters_per_pixel, + colors; + + ssize_t + k, + y; + + static const char + Cixel[MaxCixels+1] = " .XoO+@#$%&*=-;:>,<1234567890qwertyuipasdfghjk" + "lzxcvbnmMNBVCZASDFGHJKLPIUYTREWQ!~^/()_`'][{}|"; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + exception=(&image->exception); + transparent=MagickFalse; + i=0; + p=(const PixelPacket *) NULL; + if (image->storage_class == PseudoClass) + colors=image->colors; + else + { + unsigned char + *matte_image; + + /* + Convert DirectClass to PseudoClass image. + */ + matte_image=(unsigned char *) NULL; + if (image->matte != MagickFalse) + { + /* + Map all the transparent pixels. + */ + number_pixels=(MagickSizeType) image->columns*image->rows; + if (number_pixels != ((MagickSizeType) (size_t) number_pixels)) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + matte_image=(unsigned char *) AcquireQuantumMemory(image->columns, + image->rows*sizeof(*matte_image)); + if (matte_image == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + matte_image[i]=(unsigned char) (GetPixelOpacity(p) == + (Quantum) TransparentOpacity ? 1 : 0); + if (matte_image[i] != 0) + transparent=MagickTrue; + i++; + p++; + } + } + } + (void) SetImageType(image,PaletteType); + colors=image->colors; + if (transparent != MagickFalse) + { + IndexPacket + *indexes; + + PixelPacket + *q; + + i=0; + colors++; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + if (matte_image[i] != 0) + SetPixelIndex(indexes+x,image->colors); + i++; + } + } + } + if (matte_image != (unsigned char *) NULL) + matte_image=(unsigned char *) RelinquishMagickMemory(matte_image); + } + /* + Compute the character per pixel. + */ + characters_per_pixel=1; + for (k=MaxCixels; (ssize_t) colors > k; k*=MaxCixels) + characters_per_pixel++; + /* + UIL header. + */ + symbol=AcquireString(""); + (void) WriteBlobString(image,"/* UIL */\n"); + GetPathComponent(image->filename,BasePath,basename); + (void) FormatLocaleString(buffer,MaxTextExtent, + "value\n %s_ct : color_table(\n",basename); + (void) WriteBlobString(image,buffer); + GetMagickPixelPacket(image,&pixel); + for (i=0; i < (ssize_t) colors; i++) + { + /* + Define UIL color. + */ + SetMagickPixelPacket(image,image->colormap+i,(IndexPacket *) NULL,&pixel); + pixel.colorspace=sRGBColorspace; + pixel.depth=8; + pixel.opacity=(MagickRealType) OpaqueOpacity; + GetColorTuple(&pixel,MagickTrue,name); + if (transparent != MagickFalse) + if (i == (ssize_t) (colors-1)) + (void) CopyMagickString(name,"None",MaxTextExtent); + /* + Write UIL color. + */ + k=i % MaxCixels; + symbol[0]=Cixel[k]; + for (j=1; j < (int) characters_per_pixel; j++) + { + k=((i-k)/MaxCixels) % MaxCixels; + symbol[j]=Cixel[k]; + } + symbol[j]='\0'; + (void) SubstituteString(&symbol,"'","''"); + if (LocaleCompare(name,"None") == 0) + (void) FormatLocaleString(buffer,MaxTextExtent, + " background color = '%s'",symbol); + else + (void) FormatLocaleString(buffer,MaxTextExtent, + " color('%s',%s) = '%s'",name, + GetPixelLuma(image,image->colormap+i) < (QuantumRange/2.0) ? + "background" : "foreground",symbol); + (void) WriteBlobString(image,buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"%s", + (i == (ssize_t) (colors-1) ? ");\n" : ",\n")); + (void) WriteBlobString(image,buffer); + } + /* + Define UIL pixels. + */ + GetPathComponent(image->filename,BasePath,basename); + (void) FormatLocaleString(buffer,MaxTextExtent, + " %s_icon : icon(color_table = %s_ct,\n",basename,basename); + (void) WriteBlobString(image,buffer); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + (void) WriteBlobString(image," \""); + for (x=0; x < (ssize_t) image->columns; x++) + { + k=((ssize_t) GetPixelIndex(indexes+x) % MaxCixels); + symbol[0]=Cixel[k]; + for (j=1; j < (int) characters_per_pixel; j++) + { + k=(((int) GetPixelIndex(indexes+x)-k)/MaxCixels) % MaxCixels; + symbol[j]=Cixel[k]; + } + symbol[j]='\0'; + (void) CopyMagickString(buffer,symbol,MaxTextExtent); + (void) WriteBlobString(image,buffer); + p++; + } + (void) FormatLocaleString(buffer,MaxTextExtent,"\"%s\n", + (y == (ssize_t) (image->rows-1) ? ");" : ",")); + (void) WriteBlobString(image,buffer); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + symbol=DestroyString(symbol); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/url.c b/ImageMagick-6.9.12-44/coders/url.c new file mode 100644 index 0000000..06b17f5 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/url.c @@ -0,0 +1,381 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U U RRRR L % +% U U R R L % +% U U RRRR L % +% U U R R L % +% UUU R R LLLLL % +% % +% % +% Retrieve An Image Via URL. % +% % +% Software Design % +% Cristy % +% Bill Radcliffe % +% March 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/resource_.h" +#include "magick/string_.h" +#include "magick/utility.h" +#if defined(MAGICKCORE_XML_DELEGATE) +# if defined(MAGICKCORE_WINDOWS_SUPPORT) +# if !defined(__MINGW32__) +# include +# endif +# endif +# include +# include +# include +# include +#endif +#if defined(MAGICKCORE_WINDOWS_SUPPORT) && \ + !defined(__MINGW32__) +# include +# pragma comment(lib, "urlmon.lib") +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d U R L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadURLImage retrieves an image via URL, decodes the image, and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadURLImage method is: +% +% Image *ReadURLImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_FTP_ENABLED) +static void GetFTPData(void *userdata,const char *data,int size) +{ + FILE + *file; + + size_t + length; + + file=(FILE *) userdata; + if (file == (FILE *) NULL) + return; + if (size <= 0) + return; + length=fwrite(data,size,1,file); + (void) length; +} +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +static Image *ReadURLImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define MaxBufferExtent 8192 + + char + filename[MaxTextExtent]; + + FILE + *file; + + Image + *image, + *images, + *next; + + ImageInfo + *read_info; + + int + unique_file; + + images=(Image *) NULL; + image=AcquireImage(image_info); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__MINGW32__) + if (LocaleCompare(read_info->magick,"https") == 0) + { + MagickBooleanType + status; + + /* + Leverage delegate to read HTTPS link. + */ + status=InvokeDelegate(read_info,image,"https:decode",(char *) NULL, + exception); + if (status != MagickFalse) + { + (void) FormatLocaleString(read_info->filename,MagickPathExtent, + "%s.dat",read_info->unique); + *read_info->magick='\0'; + images=ReadImage(read_info,exception); + (void) RelinquishUniqueFileResource(read_info->filename); + if (images != (Image *) NULL) + for (next=images; next != (Image *) NULL; next=next->next) + (void) CopyMagickString(next->filename,image->filename, + MaxTextExtent); + } + read_info=DestroyImageInfo(read_info); + image=DestroyImage(image); + return(images); + } +#endif + if (LocaleCompare(read_info->magick,"file") == 0) + { + (void) CopyMagickString(read_info->filename,image_info->filename+2, + MaxTextExtent); + *read_info->magick='\0'; + images=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + image=DestroyImage(image); + return(GetFirstImageInList(images)); + } + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(read_info->filename); + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + { + ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile", + read_info->filename); + read_info=DestroyImageInfo(read_info); + image=DestroyImage(image); + return((Image *) NULL); + } + (void) CopyMagickString(filename,image_info->magick,MaxTextExtent); + (void) ConcatenateMagickString(filename,":",MaxTextExtent); + LocaleLower(filename); + (void) ConcatenateMagickString(filename,image_info->filename,MaxTextExtent); +#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__MINGW32__) + (void) fclose(file); + if (URLDownloadToFile(NULL,filename,read_info->filename,0,NULL) != S_OK) + { + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + filename); + (void) RelinquishUniqueFileResource(read_info->filename); + read_info=DestroyImageInfo(read_info); + image=DestroyImage(image); + return((Image *) NULL); + } +#else +#if defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_FTP_ENABLED) + if (LocaleCompare(read_info->magick,"ftp") == 0) + { + void + *context; + + xmlNanoFTPInit(); + context=xmlNanoFTPNewCtxt(filename); + if (context != (void *) NULL) + { + if (xmlNanoFTPConnect(context) >= 0) + (void) xmlNanoFTPGet(context,GetFTPData,(void *) file, + (char *) NULL); + (void) xmlNanoFTPClose(context); + } + } +#endif +#if defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_HTTP_ENABLED) + if (LocaleCompare(read_info->magick,"http") == 0) + { + char + buffer[MaxBufferExtent], + *type; + + int + bytes; + + void + *context; + + type=(char *) NULL; + context=xmlNanoHTTPMethod(filename,(const char *) NULL, + (const char *) NULL,&type,(const char *) NULL,0); + if (context != (void *) NULL) + { + ssize_t + count; + + while ((bytes=xmlNanoHTTPRead(context,buffer,MaxBufferExtent)) > 0) + count=(ssize_t) fwrite(buffer,bytes,1,file); + (void) count; + xmlNanoHTTPClose(context); + xmlFree(type); + xmlNanoHTTPCleanup(); + } + } +#endif + (void) fclose(file); +#endif + *read_info->magick='\0'; + images=ReadImage(read_info,exception); + (void) RelinquishUniqueFileResource(read_info->filename); + if (images != (Image *) NULL) + for (next=images; next != (Image *) NULL; next=next->next) + (void) CopyMagickString(next->filename,image->filename,MaxTextExtent); + read_info=DestroyImageInfo(read_info); + if (images != (Image *) NULL) + GetPathComponent(image_info->filename,TailPath,images->filename); + else + { + (void) ThrowMagickException(exception,GetMagickModule(),CoderError, + "NoDataReturned","`%s'",filename); + return((Image *) NULL); + } + image=DestroyImage(image); + return(GetFirstImageInList(images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r U R L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterURLImage() adds attributes for the URL image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterURLImage method is: +% +% size_t RegisterURLImage(void) +% +*/ +ModuleExport size_t RegisterURLImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("HTTP"); +#if (defined(MAGICKCORE_WINDOWS_SUPPORT) && \ + !defined(__MINGW32__)) || \ + (defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_HTTP_ENABLED)) + entry->decoder=(DecodeImageHandler *) ReadURLImage; +#endif + entry->description=ConstantString("Uniform Resource Locator (http://)"); + entry->magick_module=ConstantString("URL"); + entry->format_type=ImplicitFormatType; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("HTTPS"); + entry->decoder=(DecodeImageHandler *) ReadURLImage; + entry->description=ConstantString("Uniform Resource Locator (https://)"); + entry->magick_module=ConstantString("URL"); + entry->format_type=ImplicitFormatType; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("FTP"); +#if (defined(MAGICKCORE_WINDOWS_SUPPORT) && \ + !defined(__MINGW32__)) || \ + (defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_FTP_ENABLED)) + entry->decoder=(DecodeImageHandler *) ReadURLImage; +#endif + entry->description=ConstantString("Uniform Resource Locator (ftp://)"); + entry->magick_module=ConstantString("URL"); + entry->format_type=ImplicitFormatType; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("FILE"); + entry->decoder=(DecodeImageHandler *) ReadURLImage; + entry->description=ConstantString("Uniform Resource Locator (file://)"); + entry->magick_module=ConstantString("URL"); + entry->format_type=ImplicitFormatType; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r U R L I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterURLImage() removes format registrations made by the +% URL module from the list of supported formats. +% +% The format of the UnregisterURLImage method is: +% +% UnregisterURLImage(void) +% +*/ +ModuleExport void UnregisterURLImage(void) +{ + (void) UnregisterMagickInfo("HTTP"); + (void) UnregisterMagickInfo("HTTPS"); + (void) UnregisterMagickInfo("FTP"); + (void) UnregisterMagickInfo("FILE"); +} diff --git a/ImageMagick-6.9.12-44/coders/uyvy.c b/ImageMagick-6.9.12-44/coders/uyvy.c new file mode 100644 index 0000000..a5daa70 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/uyvy.c @@ -0,0 +1,370 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U U Y Y V V Y Y % +% U U Y Y V V Y Y % +% U U Y V V Y % +% U U Y V V Y % +% UUU Y V Y % +% % +% % +% Read/Write 16bit/pixel Interleaved YUV Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/colorspace.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteUYVYImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d U Y V Y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadUYVYImage() reads an image in the UYVY format and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadUYVYImage method is: +% +% Image *ReadUYVYImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadUYVYImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + y; + + unsigned char + u, + v, + y1, + y2; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + if ((image->columns % 2) != 0) + image->columns++; + (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + return(DestroyImage(image)); + if (DiscardBlobBytes(image,image->offset) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + image->depth=8; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Accumulate UYVY, then unpack into two pixels. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) (image->columns >> 1); x++) + { + u=(unsigned char) ReadBlobByte(image); + y1=(unsigned char) ReadBlobByte(image); + v=(unsigned char) ReadBlobByte(image); + y2=(unsigned char) ReadBlobByte(image); + SetPixelRed(q,ScaleCharToQuantum(y1)); + SetPixelGreen(q,ScaleCharToQuantum(u)); + SetPixelBlue(q,ScaleCharToQuantum(v)); + q++; + SetPixelRed(q,ScaleCharToQuantum(y2)); + SetPixelGreen(q,ScaleCharToQuantum(u)); + SetPixelBlue(q,ScaleCharToQuantum(v)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + SetImageColorspace(image,YCbCrColorspace); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r U Y V Y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterUYVYImage() adds attributes for the UYVY image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterUYVYImage method is: +% +% size_t RegisterUYVYImage(void) +% +*/ +ModuleExport size_t RegisterUYVYImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("PAL"); + entry->decoder=(DecodeImageHandler *) ReadUYVYImage; + entry->encoder=(EncodeImageHandler *) WriteUYVYImage; + entry->adjoin=MagickFalse; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("16bit/pixel interleaved YUV"); + entry->magick_module=ConstantString("UYVY"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("UYVY"); + entry->decoder=(DecodeImageHandler *) ReadUYVYImage; + entry->encoder=(EncodeImageHandler *) WriteUYVYImage; + entry->adjoin=MagickFalse; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("16bit/pixel interleaved YUV"); + entry->magick_module=ConstantString("UYVY"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r U Y V Y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterUYVYImage() removes format registrations made by the +% UYVY module from the list of supported formats. +% +% The format of the UnregisterUYVYImage method is: +% +% UnregisterUYVYImage(void) +% +*/ +ModuleExport void UnregisterUYVYImage(void) +{ + (void) UnregisterMagickInfo("PAL"); + (void) UnregisterMagickInfo("UYVY"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e U Y V Y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteUYVYImage() writes an image to a file in the digital UYVY +% format. This format, used by AccomWSD, is not dramatically higher quality +% than the 12bit/pixel YUV format, but has better locality. +% +% The format of the WriteUYVYImage method is: +% +% MagickBooleanType WriteUYVYImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% Implicit assumption: number of columns is even. +% +*/ +static MagickBooleanType WriteUYVYImage(const ImageInfo *image_info, + Image *image) +{ + MagickPixelPacket + pixel; + + Image + *uyvy_image; + + MagickBooleanType + full, + status; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + y; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((image->columns % 2) != 0) + image->columns++; + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + /* + Accumulate two pixels, then output. + */ + uyvy_image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (uyvy_image == (Image *) NULL) + ThrowWriterException(ResourceLimitError,image->exception.reason); + (void) TransformImageColorspace(uyvy_image,YCbCrColorspace); + full=MagickFalse; + (void) memset(&pixel,0,sizeof(MagickPixelPacket)); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(uyvy_image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (full != MagickFalse) + { + pixel.green=(pixel.green+GetPixelGreen(p))/2; + pixel.blue=(pixel.blue+GetPixelBlue(p))/2; + (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.green)); + (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.red)); + (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.blue)); + (void) WriteBlobByte(image,ScaleQuantumToChar( + GetPixelRed(p))); + } + pixel.red=(double) GetPixelRed(p); + pixel.green=(double) GetPixelGreen(p); + pixel.blue=(double) GetPixelBlue(p); + full=full == MagickFalse ? MagickTrue : MagickFalse; + p++; + } + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + uyvy_image=DestroyImage(uyvy_image); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/vicar.c b/ImageMagick-6.9.12-44/coders/vicar.c new file mode 100644 index 0000000..a2ff686 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/vicar.c @@ -0,0 +1,509 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V V IIIII CCCC AAA RRRR % +% V V I C A A R R % +% V V I C AAAAA RRRR % +% V V I C A A R R % +% V IIIII CCCC A A R R % +% % +% % +% Read/Write VICAR Rasterfile Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteVICARImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s V I C A R % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsVICAR() returns MagickTrue if the image format type, identified by the +% magick string, is VICAR. +% +% The format of the IsVICAR method is: +% +% MagickBooleanType IsVICAR(const unsigned char *magick, +% const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsVICAR(const unsigned char *magick, + const size_t length) +{ + if (length < 14) + return(MagickFalse); + if (LocaleNCompare((const char *) magick,"LBLSIZE",7) == 0) + return(MagickTrue); + if (LocaleNCompare((const char *) magick,"NJPL1I",6) == 0) + return(MagickTrue); + if (LocaleNCompare((const char *) magick,"PDS_VERSION_ID",14) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d V I C A R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadVICARImage() reads a VICAR image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadVICARImage method is: +% +% Image *ReadVICARImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: Method ReadVICARImage returns a pointer to the image after +% reading. A null image is returned if there is a memory shortage or if +% the image cannot be read. +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +% +*/ +static Image *ReadVICARImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + char + keyword[MaxTextExtent], + value[MaxTextExtent]; + + Image + *image; + + int + c; + + MagickBooleanType + status, + value_expected; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + PixelPacket + *q; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Decode image header. + */ + c=ReadBlobByte(image); + count=1; + if (c == EOF) + { + image=DestroyImage(image); + return((Image *) NULL); + } + length=0; + image->columns=0; + image->rows=0; + while (isgraph((int) ((unsigned char) c)) && ((image->columns == 0) || (image->rows == 0))) + { + if (isalnum((int) ((unsigned char) c)) == MagickFalse) + { + c=ReadBlobByte(image); + count++; + } + else + { + char + *p; + + /* + Determine a keyword and its value. + */ + p=keyword; + do + { + if ((size_t) (p-keyword) < (MaxTextExtent-1)) + *p++=c; + c=ReadBlobByte(image); + count++; + } while (isalnum((int) ((unsigned char) c)) || (c == '_')); + *p='\0'; + value_expected=MagickFalse; + while ((isspace((int) ((unsigned char) c)) != 0) || (c == '=')) + { + if (c == '=') + value_expected=MagickTrue; + c=ReadBlobByte(image); + count++; + } + if (value_expected == MagickFalse) + continue; + p=value; + while (isalnum((int) ((unsigned char) c))) + { + if ((size_t) (p-value) < (MaxTextExtent-1)) + *p++=c; + c=ReadBlobByte(image); + count++; + } + *p='\0'; + /* + Assign a value to the specified keyword. + */ + if (LocaleCompare(keyword,"LABEL_RECORDS") == 0) + length*=(ssize_t) StringToLong(value); + if (LocaleCompare(keyword,"LBLSIZE") == 0) + length=(ssize_t) StringToLong(value); + if (LocaleCompare(keyword,"RECORD_BYTES") == 0) + { + image->columns=StringToUnsignedLong(value); + length=(ssize_t) image->columns; + } + if (LocaleCompare(keyword,"NS") == 0) + image->columns=StringToUnsignedLong(value); + if (LocaleCompare(keyword,"LINES") == 0) + image->rows=StringToUnsignedLong(value); + if (LocaleCompare(keyword,"NL") == 0) + image->rows=StringToUnsignedLong(value); + } + while (isspace((int) ((unsigned char) c)) != 0) + { + c=ReadBlobByte(image); + count++; + } + } + while (count < (ssize_t) length) + { + c=ReadBlobByte(image); + if (c == EOF) + break; + count++; + } + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize"); + image->depth=8; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Read VICAR pixels. + */ + (void) SetImageColorspace(image,GRAYColorspace); + quantum_type=GrayQuantum; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + length=GetQuantumExtent(image,quantum_info,quantum_type); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + const void + *stream; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, + quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + SetQuantumImageType(image,quantum_type); + quantum_info=DestroyQuantumInfo(quantum_info); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r V I C A R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterVICARImage() adds attributes for the VICAR image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterVICARImage method is: +% +% size_t RegisterVICARImage(void) +% +*/ +ModuleExport size_t RegisterVICARImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("VICAR"); + entry->decoder=(DecodeImageHandler *) ReadVICARImage; + entry->encoder=(EncodeImageHandler *) WriteVICARImage; + entry->magick=(IsImageFormatHandler *) IsVICAR; + entry->adjoin=MagickFalse; + entry->description=ConstantString("VICAR rasterfile format"); + entry->magick_module=ConstantString("VICAR"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r V I C A R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterVICARImage() removes format registrations made by the +% VICAR module from the list of supported formats. +% +% The format of the UnregisterVICARImage method is: +% +% UnregisterVICARImage(void) +% +*/ +ModuleExport void UnregisterVICARImage(void) +{ + (void) UnregisterMagickInfo("VICAR"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e V I C A R I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteVICARImage() writes an image in the VICAR rasterfile format. +% Vicar files contain a text header, followed by one or more planes of binary +% grayscale image data. Vicar files are designed to allow many planes to be +% stacked together to form image cubes. This method only writes a single +% grayscale plane. +% +% WriteVICARImage was written contributed by gorelick@esther.la.asu.edu. +% +% The format of the WriteVICARImage method is: +% +% MagickBooleanType WriteVICARImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteVICARImage(const ImageInfo *image_info, + Image *image) +{ + char + header[MaxTextExtent]; + + int + y; + + MagickBooleanType + status; + + QuantumInfo + *quantum_info; + + const PixelPacket + *p; + + size_t + length; + + ssize_t + count; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Write header. + */ + (void) memset(header,' ',MaxTextExtent); + (void) FormatLocaleString(header,MaxTextExtent, + "LBLSIZE=%.20g FORMAT='BYTE' TYPE='IMAGE' BUFSIZE=20000 DIM=2 EOL=0 " + "RECSIZE=%.20g ORG='BSQ' NL=%.20g NS=%.20g NB=1 N1=0 N2=0 N3=0 N4=0 NBB=0 " + "NLB=0 TASK='ImageMagick'",(double) MaxTextExtent,(double) image->columns, + (double) image->rows,(double) image->columns); + (void) WriteBlob(image,MaxTextExtent,(unsigned char *) header); + /* + Write VICAR pixels. + */ + image->depth=8; + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info, + GrayQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + quantum_info=DestroyQuantumInfo(quantum_info); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/vid.c b/ImageMagick-6.9.12-44/coders/vid.c new file mode 100644 index 0000000..a50f1ee --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/vid.c @@ -0,0 +1,360 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V V IIIII DDDD % +% V V I D D % +% V V I D D % +% V V I D D % +% V IIIII DDDD % +% % +% % +% Return a Visual Image Directory for matching images. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/property.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/montage.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resize.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteVIDImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d V I D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadVIDImage reads one of more images and creates a Visual Image +% Directory file. It allocates the memory necessary for the new Image +% structure and returns a pointer to the new image. +% +% The format of the ReadVIDImage method is: +% +% Image *ReadVIDImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadVIDImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define ClientName "montage" + + char + **filelist, + *label, + **list; + + Image + *image, + *images, + *montage_image, + *next_image, + *thumbnail_image; + + ImageInfo + *read_info; + + int + number_files; + + MagickBooleanType + status; + + MontageInfo + *montage_info; + + RectangleInfo + geometry; + + ssize_t + i; + + /* + Expand the filename. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + list=(char **) AcquireMagickMemory(sizeof(*filelist)); + if (list == (char **) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + list[0]=ConstantString(image_info->filename); + filelist=list; + number_files=1; + status=ExpandFilenames(&number_files,&filelist); + list[0]=DestroyString(list[0]); + list=(char **) RelinquishMagickMemory(list); + if ((status == MagickFalse) || (number_files == 0)) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + image=DestroyImage(image); + /* + Read each image and convert them to a tile. + */ + images=NewImageList(); + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) SetImageInfoProgressMonitor(read_info,(MagickProgressMonitor) NULL, + (void *) NULL); + if (read_info->size == (char *) NULL) + (void) CloneString(&read_info->size,DefaultTileGeometry); + for (i=0; i < (ssize_t) number_files; i++) + { + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"name: %s", + filelist[i]); + if (LocaleNCompare(filelist[i],"VID:",4) == 0) + continue; + (void) CopyMagickString(read_info->filename,filelist[i],MaxTextExtent); + filelist[i]=DestroyString(filelist[i]); + *read_info->magick='\0'; + (void) SetImageInfo(read_info,1,exception); + if (LocaleCompare(read_info->magick,"VID") == 0) + (void) FormatLocaleString(read_info->filename,MagickPathExtent,"miff:%s", + filelist[i]); + next_image=ReadImage(read_info,exception); + CatchException(exception); + if (next_image == (Image *) NULL) + break; + label=InterpretImageProperties(image_info,next_image,DefaultTileLabel); + if (label != (char *) NULL) + { + (void) SetImageProperty(next_image,"label",label); + label=DestroyString(label); + } + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "geometry: %.20gx%.20g",(double) next_image->columns,(double) + next_image->rows); + SetGeometry(next_image,&geometry); + (void) ParseMetaGeometry(read_info->size,&geometry.x,&geometry.y, + &geometry.width,&geometry.height); + thumbnail_image=ThumbnailImage(next_image,geometry.width,geometry.height, + exception); + if (thumbnail_image != (Image *) NULL) + { + next_image=DestroyImage(next_image); + next_image=thumbnail_image; + } + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "thumbnail geometry: %.20gx%.20g",(double) next_image->columns,(double) + next_image->rows); + AppendImageToList(&images,next_image); + status=SetImageProgress(images,LoadImagesTag,i,number_files); + if (status == MagickFalse) + break; + } + read_info=DestroyImageInfo(read_info); + for (i=0; i < (ssize_t) number_files; i++) + filelist[i]=DestroyString(filelist[i]); + filelist=(char **) RelinquishMagickMemory(filelist); + if (images == (Image *) NULL) + ThrowReaderException(CorruptImageError, + "ImageFileDoesNotContainAnyImageData"); + /* + Create the visual image directory. + */ + montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"creating montage"); + montage_image=MontageImageList(image_info,montage_info, + GetFirstImageInList(images),exception); + montage_info=DestroyMontageInfo(montage_info); + images=DestroyImageList(images); + return(montage_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r V I D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterVIDImage() adds attributes for the VID image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterVIDImage method is: +% +% size_t RegisterVIDImage(void) +% +*/ +ModuleExport size_t RegisterVIDImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("VID"); + entry->decoder=(DecodeImageHandler *) ReadVIDImage; + entry->encoder=(EncodeImageHandler *) WriteVIDImage; + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("Visual Image Directory"); + entry->magick_module=ConstantString("VID"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r V I D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterVIDImage() removes format registrations made by the +% VID module from the list of supported formats. +% +% The format of the UnregisterVIDImage method is: +% +% UnregisterVIDImage(void) +% +*/ +ModuleExport void UnregisterVIDImage(void) +{ + (void) UnregisterMagickInfo("VID"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e V I D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteVIDImage() writes an image to a file in VID X image format. +% +% The format of the WriteVIDImage method is: +% +% MagickBooleanType WriteVIDImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteVIDImage(const ImageInfo *image_info,Image *image) +{ + Image + *montage_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + MontageInfo + *montage_info; + + Image + *p; + + /* + Create the visual image directory. + */ + for (p=image; p != (Image *) NULL; p=GetNextImageInList(p)) + (void) SetImageProperty(p,"label",DefaultTileLabel); + montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL); + montage_image=MontageImageList(image_info,montage_info,image, + &image->exception); + montage_info=DestroyMontageInfo(montage_info); + if (montage_image == (Image *) NULL) + return(MagickFalse); + (void) CopyMagickString(montage_image->filename,image_info->filename, + MaxTextExtent); + write_info=CloneImageInfo(image_info); + *write_info->magick='\0'; + (void) SetImageInfo(write_info,1,&image->exception); + if ((*write_info->magick == '\0') || + (LocaleCompare(write_info->magick,"VID") == 0)) + (void) FormatLocaleString(montage_image->filename,MaxTextExtent, + "miff:%s",write_info->filename); + status=WriteImage(write_info,montage_image); + montage_image=DestroyImage(montage_image); + write_info=DestroyImageInfo(write_info); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/video.c b/ImageMagick-6.9.12-44/coders/video.c new file mode 100644 index 0000000..c9bedc1 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/video.c @@ -0,0 +1,657 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V V IIIII DDDD EEEEE OOO % +% V V I D D E O O % +% V V I D D EEE O O % +% V V I D D E O O % +% V IIIII DDDD EEEEE OOO % +% % +% % +% Read/Write VIDEO Image Format % +% % +% Software Design % +% Cristy % +% July 1999 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/constitute.h" +#include "magick/delegate.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/layer.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/transform.h" +#include "magick/utility.h" +#include "magick/utility-private.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteVIDEOImage(const ImageInfo *image_info,Image *image); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s V I D E O % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsVIDEO() returns MagickTrue if the image format type, identified by the +% magick string, is VIDEO. +% +% The format of the IsVIDEO method is: +% +% MagickBooleanType IsVIDEO(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ + +static MagickBooleanType IsPNG(const unsigned char *magick,const size_t length) +{ + if (length < 8) + return(MagickFalse); + if (memcmp(magick,"\211PNG\r\n\032\n",8) == 0) + return(MagickTrue); + return(MagickFalse); +} + +static MagickBooleanType IsVIDEO(const unsigned char *magick, + const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\000\000\001\263",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d V I D E O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadVIDEOImage() reads an binary file in the VIDEO video stream format +% and returns it. It allocates the memory necessary for the new Image +% structure and returns a pointer to the new image. +% +% The format of the ReadVIDEOImage method is: +% +% Image *ReadVIDEOImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadVIDEOImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ +#define ReadVIDEOIntermediateFormat "pam" + + Image + *image, + *images, + *next; + + ImageInfo + *read_info; + + MagickBooleanType + status; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + (void) CloseBlob(image); + (void) DestroyImageList(image); + /* + Convert VIDEO to PAM with delegate. + */ + images=(Image *) NULL; + read_info=CloneImageInfo(image_info); + image=AcquireImage(image_info); + status=InvokeDelegate(read_info,image,"video:decode",(char *) NULL,exception); + if (status != MagickFalse) + { + (void) FormatLocaleString(read_info->filename,MaxTextExtent,"%s.%s", + read_info->unique,ReadVIDEOIntermediateFormat); + *read_info->magick='\0'; + images=ReadImage(read_info,exception); + if (images != (Image *) NULL) + for (next=images; next != (Image *) NULL; next=next->next) + { + (void) CopyMagickString(next->filename,image->filename, + MagickPathExtent); + (void) CopyMagickString(next->magick,image->magick,MagickPathExtent); + } + (void) RelinquishUniqueFileResource(read_info->filename); + } + read_info=DestroyImageInfo(read_info); + image=DestroyImage(image); + return(images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r V I D E O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterVIDEOImage() adds attributes for the VIDEO image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterVIDEOImage method is: +% +% size_t RegisterVIDEOImage(void) +% +*/ +ModuleExport size_t RegisterVIDEOImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("3GP"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Media Container"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("3G2"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Media Container"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("APNG"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; + entry->magick=(IsImageFormatHandler *) IsPNG; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Animated Portable Network Graphics"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("AVI"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Microsoft Audio/Visual Interleaved"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("MKV"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; + entry->magick=(IsImageFormatHandler *) IsVIDEO; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Multimedia Container"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("MOV"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; + entry->magick=(IsImageFormatHandler *) IsVIDEO; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("MPEG Video Stream"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("VIDEO"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; + entry->magick=(IsImageFormatHandler *) IsVIDEO; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("MPEG Video Stream"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("MPG"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; + entry->magick=(IsImageFormatHandler *) IsVIDEO; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("MPEG Video Stream"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("MP4"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; + entry->magick=(IsImageFormatHandler *) IsVIDEO; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("VIDEO-4 Video Stream"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("M2V"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; + entry->magick=(IsImageFormatHandler *) IsVIDEO; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("MPEG Video Stream"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("M4V"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; + entry->magick=(IsImageFormatHandler *) IsVIDEO; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Raw VIDEO-4 Video"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("WEBM"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Open Web Media"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("WMV"); + entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; + entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; + entry->magick=(IsImageFormatHandler *) IsVIDEO; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Windows Media Video"); + entry->magick_module=ConstantString("VIDEO"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r V I D E O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterVIDEOImage() removes format registrations made by the +% BIM module from the list of supported formats. +% +% The format of the UnregisterBIMImage method is: +% +% UnregisterVIDEOImage(void) +% +*/ +ModuleExport void UnregisterVIDEOImage(void) +{ + (void) UnregisterMagickInfo("WMV"); + (void) UnregisterMagickInfo("WEBM"); + (void) UnregisterMagickInfo("MOV"); + (void) UnregisterMagickInfo("M4V"); + (void) UnregisterMagickInfo("M2V"); + (void) UnregisterMagickInfo("MP4"); + (void) UnregisterMagickInfo("MPG"); + (void) UnregisterMagickInfo("MPEG"); + (void) UnregisterMagickInfo("MKV"); + (void) UnregisterMagickInfo("AVI"); + (void) UnregisterMagickInfo("APNG"); + (void) UnregisterMagickInfo("3G2"); + (void) UnregisterMagickInfo("3GP"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e V I D E O I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteVIDEOImage() writes an image to a file in VIDEO video stream format. +% Lawrence Livermore National Laboratory (LLNL) contributed code to adjust +% the VIDEO parameters to correspond to the compression quality setting. +% +% The format of the WriteVIDEOImage method is: +% +% MagickBooleanType WriteVIDEOImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType CopyDelegateFile(const char *source, + const char *destination) +{ + int + destination_file, + source_file; + + MagickBooleanType + status; + + size_t + i; + + size_t + length, + quantum; + + ssize_t + count; + + struct stat + attributes; + + unsigned char + *buffer; + + /* + Return if destination file already exists and is not empty. + */ + assert(source != (const char *) NULL); + assert(destination != (char *) NULL); + status=GetPathAttributes(destination,&attributes); + if ((status != MagickFalse) && (attributes.st_size > 0)) + return(MagickTrue); + /* + Copy source file to destination. + */ + if (strcmp(destination,"-") == 0) + destination_file=fileno(stdout); + else + destination_file=open_utf8(destination,O_WRONLY | O_BINARY | O_CREAT, + S_MODE); + if (destination_file == -1) + return(MagickFalse); + source_file=open_utf8(source,O_RDONLY | O_BINARY,0); + if (source_file == -1) + { + (void) close(destination_file); + return(MagickFalse); + } + quantum=(size_t) MagickMaxBufferExtent; + if ((fstat(source_file,&attributes) == 0) && (attributes.st_size > 0)) + quantum=(size_t) MagickMin((double) attributes.st_size, + MagickMaxBufferExtent); + buffer=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*buffer)); + if (buffer == (unsigned char *) NULL) + { + (void) close(source_file); + (void) close(destination_file); + return(MagickFalse); + } + length=0; + for (i=0; ; i+=count) + { + count=(ssize_t) read(source_file,buffer,quantum); + if (count <= 0) + break; + length=(size_t) count; + count=(ssize_t) write(destination_file,buffer,length); + if ((size_t) count != length) + break; + } + if (strcmp(destination,"-") != 0) + (void) close(destination_file); + (void) close(source_file); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + return(i != 0 ? MagickTrue : MagickFalse); +} + +static MagickBooleanType WriteVIDEOImage(const ImageInfo *image_info, + Image *image) +{ +#define WriteVIDEOIntermediateFormat "pam" + + char + basename[MaxTextExtent], + filename[MaxTextExtent]; + + double + delay; + + Image + *coalesce_image; + + ImageInfo + *write_info; + + int + file; + + MagickBooleanType + status; + + Image + *p; + + ssize_t + i; + + size_t + count, + length, + scene; + + unsigned char + *blob; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) CloseBlob(image); + /* + Write intermediate files. + */ + coalesce_image=CoalesceImages(image,&image->exception); + if (coalesce_image == (Image *) NULL) + return(MagickFalse); + file=AcquireUniqueFileResource(basename); + if (file != -1) + file=close(file)-1; + (void) FormatLocaleString(coalesce_image->filename,MaxTextExtent,"%s", + basename); + count=0; + write_info=CloneImageInfo(image_info); + *write_info->magick='\0'; + for (p=coalesce_image; p != (Image *) NULL; p=GetNextImageInList(p)) + { + char + previous_image[MaxTextExtent]; + + blob=(unsigned char *) NULL; + length=0; + scene=p->scene; + delay=100.0*p->delay/MagickMax(1.0*p->ticks_per_second,1.0); + for (i=0; i < (ssize_t) MagickMax((1.0*delay+1.0)/3.0,1.0); i++) + { + p->scene=count; + count++; + status=MagickFalse; + switch (i) + { + case 0: + { + Image + *frame; + + (void) FormatLocaleString(p->filename,MaxTextExtent,"%s%.20g.%s", + basename,(double) p->scene,WriteVIDEOIntermediateFormat); + (void) FormatLocaleString(filename,MaxTextExtent,"%s%.20g.%s", + basename,(double) p->scene,WriteVIDEOIntermediateFormat); + (void) FormatLocaleString(previous_image,MaxTextExtent, + "%s%.20g.%s",basename,(double) p->scene, + WriteVIDEOIntermediateFormat); + frame=CloneImage(p,0,0,MagickTrue,&p->exception); + if (frame == (Image *) NULL) + break; + status=WriteImage(write_info,frame); + frame=DestroyImage(frame); + break; + } + case 1: + { + blob=(unsigned char *) FileToBlob(previous_image,~0UL,&length, + &image->exception); + } + default: + { + (void) FormatLocaleString(filename,MaxTextExtent,"%s%.20g.%s", + basename,(double) p->scene,WriteVIDEOIntermediateFormat); + if (length > 0) + status=BlobToFile(filename,blob,length,&image->exception); + break; + } + } + if (image->debug != MagickFalse) + { + if (status != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "%.20g. Wrote %s file for scene %.20g:",(double) i, + WriteVIDEOIntermediateFormat,(double) p->scene); + else + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "%.20g. Failed to write %s file for scene %.20g:",(double) i, + WriteVIDEOIntermediateFormat,(double) p->scene); + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"%s",filename); + } + } + p->scene=scene; + if (blob != (unsigned char *) NULL) + blob=(unsigned char *) RelinquishMagickMemory(blob); + if (status == MagickFalse) + break; + } + /* + Convert PAM to VIDEO. + */ + (void) CopyMagickString(coalesce_image->magick_filename,basename, + MaxTextExtent); + (void) CopyMagickString(coalesce_image->filename,basename,MaxTextExtent); + (void) CopyMagickString(coalesce_image->magick,image_info->magick, + MaxTextExtent); + status=InvokeDelegate(write_info,coalesce_image,(char *) NULL,"video:encode", + &image->exception); + (void) FormatLocaleString(write_info->filename,MaxTextExtent,"%s.%s", + write_info->unique,coalesce_image->magick); + status=CopyDelegateFile(write_info->filename,image->filename); + (void) RelinquishUniqueFileResource(write_info->filename); + write_info=DestroyImageInfo(write_info); + /* + Relinquish resources. + */ + count=0; + for (p=coalesce_image; p != (Image *) NULL; p=GetNextImageInList(p)) + { + delay=100.0*p->delay/MagickMax(1.0*p->ticks_per_second,1.0); + for (i=0; i < (ssize_t) MagickMax((1.0*delay+1.0)/3.0,1.0); i++) + { + (void) FormatLocaleString(p->filename,MaxTextExtent,"%s%.20g.%s", + basename,(double) count++,WriteVIDEOIntermediateFormat); + (void) RelinquishUniqueFileResource(p->filename); + } + (void) CopyMagickString(p->filename,image_info->filename,MaxTextExtent); + } + (void) RelinquishUniqueFileResource(basename); + coalesce_image=DestroyImageList(coalesce_image); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit"); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/viff.c b/ImageMagick-6.9.12-44/coders/viff.c new file mode 100644 index 0000000..7bba13d --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/viff.c @@ -0,0 +1,1277 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V V IIIII FFFFF FFFFF % +% V V I F F % +% V V I FFF FFF % +% V V I F F % +% V IIIII F F % +% % +% % +% Read/Write Khoros Visualization Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteVIFFImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s V I F F % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsVIFF() returns MagickTrue if the image format type, identified by the +% magick string, is VIFF. +% +% The format of the IsVIFF method is: +% +% MagickBooleanType IsVIFF(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsVIFF(const unsigned char *magick,const size_t length) +{ + if (length < 2) + return(MagickFalse); + if (memcmp(magick,"\253\001",2) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d V I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadVIFFImage() reads a Khoros Visualization image file and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadVIFFImage method is: +% +% Image *ReadVIFFImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: Method ReadVIFFImage returns a pointer to the image after +% reading. A null image is returned if there is a memory shortage or if +% the image cannot be read. +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadVIFFImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ +#define VFF_CM_genericRGB 15 +#define VFF_CM_ntscRGB 1 +#define VFF_CM_NONE 0 +#define VFF_DEP_DECORDER 0x4 +#define VFF_DEP_NSORDER 0x8 +#define VFF_DES_RAW 0 +#define VFF_LOC_IMPLICIT 1 +#define VFF_MAPTYP_NONE 0 +#define VFF_MAPTYP_1_BYTE 1 +#define VFF_MAPTYP_2_BYTE 2 +#define VFF_MAPTYP_4_BYTE 4 +#define VFF_MAPTYP_FLOAT 5 +#define VFF_MAPTYP_DOUBLE 7 +#define VFF_MS_NONE 0 +#define VFF_MS_ONEPERBAND 1 +#define VFF_MS_SHARED 3 +#define VFF_TYP_BIT 0 +#define VFF_TYP_1_BYTE 1 +#define VFF_TYP_2_BYTE 2 +#define VFF_TYP_4_BYTE 4 +#define VFF_TYP_FLOAT 5 +#define VFF_TYP_DOUBLE 9 + + typedef struct _ViffInfo + { + unsigned char + identifier, + file_type, + release, + version, + machine_dependency, + reserve[3]; + + char + comment[512]; + + unsigned int + rows, + columns, + subrows; + + int + x_offset, + y_offset; + + float + x_bits_per_pixel, + y_bits_per_pixel; + + unsigned int + location_type, + location_dimension, + number_of_images, + number_data_bands, + data_storage_type, + data_encode_scheme, + map_scheme, + map_storage_type, + map_rows, + map_columns, + map_subrows, + map_enable, + maps_per_cycle, + color_space_model; + } ViffInfo; + + double + min_value, + scale_factor, + value; + + Image + *image; + + int + bit; + + MagickBooleanType + status; + + MagickSizeType + number_pixels; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + i; + + unsigned char + *p; + + size_t + bytes_per_pixel, + max_packets, + quantum; + + ssize_t + count, + y; + + unsigned char + *pixels; + + unsigned long + lsb_first; + + ViffInfo + viff_info; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read VIFF header (1024 bytes). + */ + count=ReadBlob(image,1,&viff_info.identifier); + do + { + /* + Verify VIFF identifier. + */ + if ((count != 1) || ((unsigned char) viff_info.identifier != 0xab)) + ThrowReaderException(CorruptImageError,"NotAVIFFImage"); + /* + Initialize VIFF image. + */ + (void) ReadBlob(image,sizeof(viff_info.file_type),&viff_info.file_type); + (void) ReadBlob(image,sizeof(viff_info.release),&viff_info.release); + (void) ReadBlob(image,sizeof(viff_info.version),&viff_info.version); + (void) ReadBlob(image,sizeof(viff_info.machine_dependency), + &viff_info.machine_dependency); + (void) ReadBlob(image,sizeof(viff_info.reserve),viff_info.reserve); + count=ReadBlob(image,512,(unsigned char *) viff_info.comment); + if (count != 512) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + viff_info.comment[511]='\0'; + if (strlen(viff_info.comment) > 4) + (void) SetImageProperty(image,"comment",viff_info.comment); + if ((viff_info.machine_dependency == VFF_DEP_DECORDER) || + (viff_info.machine_dependency == VFF_DEP_NSORDER)) + image->endian=LSBEndian; + else + image->endian=MSBEndian; + viff_info.rows=ReadBlobLong(image); + viff_info.columns=ReadBlobLong(image); + viff_info.subrows=ReadBlobLong(image); + viff_info.x_offset=ReadBlobSignedLong(image); + viff_info.y_offset=ReadBlobSignedLong(image); + viff_info.x_bits_per_pixel=(float) ReadBlobLong(image); + viff_info.y_bits_per_pixel=(float) ReadBlobLong(image); + viff_info.location_type=ReadBlobLong(image); + viff_info.location_dimension=ReadBlobLong(image); + viff_info.number_of_images=ReadBlobLong(image); + viff_info.number_data_bands=ReadBlobLong(image); + viff_info.data_storage_type=ReadBlobLong(image); + viff_info.data_encode_scheme=ReadBlobLong(image); + viff_info.map_scheme=ReadBlobLong(image); + viff_info.map_storage_type=ReadBlobLong(image); + viff_info.map_rows=ReadBlobLong(image); + viff_info.map_columns=ReadBlobLong(image); + viff_info.map_subrows=ReadBlobLong(image); + viff_info.map_enable=ReadBlobLong(image); + viff_info.maps_per_cycle=ReadBlobLong(image); + viff_info.color_space_model=ReadBlobLong(image); + for (i=0; i < 420; i++) + (void) ReadBlobByte(image); + if (EOFBlob(image) != MagickFalse) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + number_pixels=(MagickSizeType) viff_info.columns*viff_info.rows; + if (number_pixels != (size_t) number_pixels) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if (number_pixels > 8*GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + if (number_pixels == 0) + ThrowReaderException(CoderError,"ImageColumnOrRowSizeIsNotSupported"); + image->columns=viff_info.rows; + image->rows=viff_info.columns; + image->depth=viff_info.x_bits_per_pixel <= 8 ? 8UL : + MAGICKCORE_QUANTUM_DEPTH; + image->matte=viff_info.number_data_bands == 4 ? MagickTrue : MagickFalse; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) SetImageBackgroundColor(image); + /* + Verify that we can read this VIFF image. + */ + if ((viff_info.number_data_bands < 1) || (viff_info.number_data_bands > 4)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if ((viff_info.data_storage_type != VFF_TYP_BIT) && + (viff_info.data_storage_type != VFF_TYP_1_BYTE) && + (viff_info.data_storage_type != VFF_TYP_2_BYTE) && + (viff_info.data_storage_type != VFF_TYP_4_BYTE) && + (viff_info.data_storage_type != VFF_TYP_FLOAT) && + (viff_info.data_storage_type != VFF_TYP_DOUBLE)) + ThrowReaderException(CoderError,"DataStorageTypeIsNotSupported"); + if (viff_info.data_encode_scheme != VFF_DES_RAW) + ThrowReaderException(CoderError,"DataEncodingSchemeIsNotSupported"); + if ((viff_info.map_storage_type != VFF_MAPTYP_NONE) && + (viff_info.map_storage_type != VFF_MAPTYP_1_BYTE) && + (viff_info.map_storage_type != VFF_MAPTYP_2_BYTE) && + (viff_info.map_storage_type != VFF_MAPTYP_4_BYTE) && + (viff_info.map_storage_type != VFF_MAPTYP_FLOAT) && + (viff_info.map_storage_type != VFF_MAPTYP_DOUBLE)) + ThrowReaderException(CoderError,"MapStorageTypeIsNotSupported"); + if ((viff_info.color_space_model != VFF_CM_NONE) && + (viff_info.color_space_model != VFF_CM_ntscRGB) && + (viff_info.color_space_model != VFF_CM_genericRGB)) + ThrowReaderException(CoderError,"ColorspaceModelIsNotSupported"); + if (viff_info.location_type != VFF_LOC_IMPLICIT) + ThrowReaderException(CoderError,"LocationTypeIsNotSupported"); + if (viff_info.number_of_images != 1) + ThrowReaderException(CoderError,"NumberOfImagesIsNotSupported"); + if (viff_info.map_rows == 0) + viff_info.map_scheme=VFF_MS_NONE; + switch ((int) viff_info.map_scheme) + { + case VFF_MS_NONE: + { + if (viff_info.number_data_bands < 3) + { + /* + Create linear color ramp. + */ + if (viff_info.data_storage_type == VFF_TYP_BIT) + image->colors=2; + else + if (viff_info.data_storage_type == VFF_MAPTYP_1_BYTE) + image->colors=256UL; + else + image->colors=image->depth <= 8 ? 256UL : 65536UL; + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + break; + } + case VFF_MS_ONEPERBAND: + case VFF_MS_SHARED: + { + unsigned char + *viff_colormap; + + /* + Allocate VIFF colormap. + */ + switch ((int) viff_info.map_storage_type) + { + case VFF_MAPTYP_1_BYTE: bytes_per_pixel=1; break; + case VFF_MAPTYP_2_BYTE: bytes_per_pixel=2; break; + case VFF_MAPTYP_4_BYTE: bytes_per_pixel=4; break; + case VFF_MAPTYP_FLOAT: bytes_per_pixel=4; break; + case VFF_MAPTYP_DOUBLE: bytes_per_pixel=8; break; + default: bytes_per_pixel=1; break; + } + image->colors=viff_info.map_columns; + if ((MagickSizeType) (viff_info.map_rows*image->colors) > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + if ((MagickSizeType) viff_info.map_rows > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile"); + if ((MagickSizeType) viff_info.map_rows > + (viff_info.map_rows*bytes_per_pixel*sizeof(*viff_colormap))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + viff_colormap=(unsigned char *) AcquireQuantumMemory(image->colors, + viff_info.map_rows*bytes_per_pixel*sizeof(*viff_colormap)); + if (viff_colormap == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Read VIFF raster colormap. + */ + (void) ReadBlob(image,bytes_per_pixel*image->colors*viff_info.map_rows, + viff_colormap); + lsb_first=1; + if (*(char *) &lsb_first && + ((viff_info.machine_dependency != VFF_DEP_DECORDER) && + (viff_info.machine_dependency != VFF_DEP_NSORDER))) + switch ((int) viff_info.map_storage_type) + { + case VFF_MAPTYP_2_BYTE: + { + MSBOrderShort(viff_colormap,(bytes_per_pixel*image->colors* + viff_info.map_rows)); + break; + } + case VFF_MAPTYP_4_BYTE: + case VFF_MAPTYP_FLOAT: + { + MSBOrderLong(viff_colormap,(bytes_per_pixel*image->colors* + viff_info.map_rows)); + break; + } + default: break; + } + for (i=0; i < (ssize_t) (viff_info.map_rows*image->colors); i++) + { + switch ((int) viff_info.map_storage_type) + { + case VFF_MAPTYP_2_BYTE: value=1.0*((short *) viff_colormap)[i]; break; + case VFF_MAPTYP_4_BYTE: value=1.0*((int *) viff_colormap)[i]; break; + case VFF_MAPTYP_FLOAT: value=((float *) viff_colormap)[i]; break; + case VFF_MAPTYP_DOUBLE: value=((double *) viff_colormap)[i]; break; + default: value=1.0*viff_colormap[i]; break; + } + if (i < (ssize_t) image->colors) + { + image->colormap[i].red=ScaleCharToQuantum((unsigned char) value); + image->colormap[i].green=ScaleCharToQuantum((unsigned char) + value); + image->colormap[i].blue=ScaleCharToQuantum((unsigned char) value); + } + else + if (i < (ssize_t) (2*image->colors)) + image->colormap[i % image->colors].green=ScaleCharToQuantum( + (unsigned char) value); + else + if (i < (ssize_t) (3*image->colors)) + image->colormap[i % image->colors].blue=ScaleCharToQuantum( + (unsigned char) value); + } + viff_colormap=(unsigned char *) RelinquishMagickMemory(viff_colormap); + break; + } + default: + ThrowReaderException(CoderError,"ColormapTypeNotSupported"); + } + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (viff_info.data_storage_type == VFF_TYP_BIT) + { + /* + Create bi-level colormap. + */ + image->colors=2; + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + image->colorspace=GRAYColorspace; + } + /* + Allocate VIFF pixels. + */ + switch ((int) viff_info.data_storage_type) + { + case VFF_TYP_2_BYTE: bytes_per_pixel=2; break; + case VFF_TYP_4_BYTE: bytes_per_pixel=4; break; + case VFF_TYP_FLOAT: bytes_per_pixel=4; break; + case VFF_TYP_DOUBLE: bytes_per_pixel=8; break; + default: bytes_per_pixel=1; break; + } + if (viff_info.data_storage_type == VFF_TYP_BIT) + { + if (HeapOverflowSanityCheck((image->columns+7UL) >> 3UL,image->rows) != MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + max_packets=((image->columns+7UL) >> 3UL)*image->rows; + } + else + { + if (HeapOverflowSanityCheck((size_t) number_pixels,viff_info.number_data_bands) != MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + max_packets=(size_t) (number_pixels*viff_info.number_data_bands); + } + if ((MagickSizeType) (bytes_per_pixel*max_packets) > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + pixels=(unsigned char *) AcquireQuantumMemory((size_t) MagickMax( + number_pixels,max_packets),bytes_per_pixel*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(pixels,0,MagickMax(number_pixels,max_packets)* + bytes_per_pixel*sizeof(*pixels)); + (void) ReadBlob(image,bytes_per_pixel*max_packets,pixels); + lsb_first=1; + if (*(char *) &lsb_first && + ((viff_info.machine_dependency != VFF_DEP_DECORDER) && + (viff_info.machine_dependency != VFF_DEP_NSORDER))) + switch ((int) viff_info.data_storage_type) + { + case VFF_TYP_2_BYTE: + { + MSBOrderShort(pixels,bytes_per_pixel*max_packets); + break; + } + case VFF_TYP_4_BYTE: + case VFF_TYP_FLOAT: + { + MSBOrderLong(pixels,bytes_per_pixel*max_packets); + break; + } + default: break; + } + min_value=0.0; + scale_factor=1.0; + if ((viff_info.data_storage_type != VFF_TYP_1_BYTE) && + (viff_info.map_scheme == VFF_MS_NONE)) + { + double + max_value; + + /* + Determine scale factor. + */ + switch ((int) viff_info.data_storage_type) + { + case VFF_TYP_2_BYTE: value=1.0*((short *) pixels)[0]; break; + case VFF_TYP_4_BYTE: value=1.0*((int *) pixels)[0]; break; + case VFF_TYP_FLOAT: value=((float *) pixels)[0]; break; + case VFF_TYP_DOUBLE: value=((double *) pixels)[0]; break; + default: value=1.0*pixels[0]; break; + } + max_value=value; + min_value=value; + for (i=0; i < (ssize_t) max_packets; i++) + { + switch ((int) viff_info.data_storage_type) + { + case VFF_TYP_2_BYTE: value=1.0*((short *) pixels)[i]; break; + case VFF_TYP_4_BYTE: value=1.0*((int *) pixels)[i]; break; + case VFF_TYP_FLOAT: value=((float *) pixels)[i]; break; + case VFF_TYP_DOUBLE: value=((double *) pixels)[i]; break; + default: value=1.0*pixels[i]; break; + } + if (value > max_value) + max_value=value; + else + if (value < min_value) + min_value=value; + } + if ((min_value == 0) && (max_value == 0)) + scale_factor=0; + else + if (min_value == max_value) + { + scale_factor=(MagickRealType) QuantumRange/min_value; + min_value=0; + } + else + scale_factor=(MagickRealType) QuantumRange/(max_value-min_value); + } + /* + Convert pixels to Quantum size. + */ + p=(unsigned char *) pixels; + for (i=0; i < (ssize_t) max_packets; i++) + { + switch ((int) viff_info.data_storage_type) + { + case VFF_TYP_2_BYTE: value=1.0*((short *) pixels)[i]; break; + case VFF_TYP_4_BYTE: value=1.0*((int *) pixels)[i]; break; + case VFF_TYP_FLOAT: value=((float *) pixels)[i]; break; + case VFF_TYP_DOUBLE: value=((double *) pixels)[i]; break; + default: value=1.0*pixels[i]; break; + } + if (viff_info.map_scheme == VFF_MS_NONE) + { + value=(value-min_value)*scale_factor; + if (value > QuantumRange) + value=QuantumRange; + else + if (value < 0) + value=0; + } + *p=(unsigned char) ((Quantum) value); + p++; + } + /* + Convert VIFF raster image to pixel packets. + */ + p=(unsigned char *) pixels; + if (viff_info.data_storage_type == VFF_TYP_BIT) + { + /* + Convert bitmap scanline. + */ + if (image->storage_class != PseudoClass) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) (image->columns-7); x+=8) + { + for (bit=0; bit < 8; bit++) + { + quantum=(size_t) ((*p) & (0x01 << bit) ? 0 : 1); + SetPixelRed(q,quantum == 0 ? 0 : QuantumRange); + SetPixelGreen(q,quantum == 0 ? 0 : QuantumRange); + SetPixelBlue(q,quantum == 0 ? 0 : QuantumRange); + if (image->storage_class == PseudoClass) + SetPixelIndex(indexes+x+bit,quantum); + } + p++; + } + if ((image->columns % 8) != 0) + { + for (bit=0; bit < (int) (image->columns % 8); bit++) + { + quantum=(size_t) ((*p) & (0x01 << bit) ? 0 : 1); + SetPixelRed(q,quantum == 0 ? 0 : QuantumRange); + SetPixelGreen(q,quantum == 0 ? 0 : QuantumRange); + SetPixelBlue(q,quantum == 0 ? 0 : QuantumRange); + if (image->storage_class == PseudoClass) + SetPixelIndex(indexes+x+bit,quantum); + } + p++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + else + if (image->storage_class == PseudoClass) + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,*p++); + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + else + { + /* + Convert DirectColor scanline. + */ + number_pixels=(MagickSizeType) image->columns*image->rows; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*p)); + SetPixelGreen(q,ScaleCharToQuantum(*(p+number_pixels))); + SetPixelBlue(q,ScaleCharToQuantum(*(p+2*number_pixels))); + if (image->colors != 0) + { + ssize_t + index; + + index=(ssize_t) GetPixelRed(q); + SetPixelRed(q,image->colormap[(ssize_t) + ConstrainColormapIndex(image,(ssize_t) index)].red); + index=(ssize_t) GetPixelGreen(q); + SetPixelGreen(q,image->colormap[(ssize_t) + ConstrainColormapIndex(image,(ssize_t) index)].green); + index=(ssize_t) GetPixelRed(q); + SetPixelBlue(q,image->colormap[(ssize_t) + ConstrainColormapIndex(image,(ssize_t) index)].blue); + } + SetPixelOpacity(q,image->matte != MagickFalse ? QuantumRange- + ScaleCharToQuantum(*(p+number_pixels*3)) : OpaqueOpacity); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (image->storage_class == PseudoClass) + (void) SyncImage(image); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + count=ReadBlob(image,1,&viff_info.identifier); + if ((count == 1) && (viff_info.identifier == 0xab)) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while ((count != 0) && (viff_info.identifier == 0xab)); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r V I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterVIFFImage() adds properties for the VIFF image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterVIFFImage method is: +% +% size_t RegisterVIFFImage(void) +% +*/ +ModuleExport size_t RegisterVIFFImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("VIFF"); + entry->decoder=(DecodeImageHandler *) ReadVIFFImage; + entry->encoder=(EncodeImageHandler *) WriteVIFFImage; + entry->magick=(IsImageFormatHandler *) IsVIFF; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Khoros Visualization image"); + entry->magick_module=ConstantString("VIFF"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("XV"); + entry->decoder=(DecodeImageHandler *) ReadVIFFImage; + entry->encoder=(EncodeImageHandler *) WriteVIFFImage; + entry->seekable_stream=MagickTrue; + entry->description=ConstantString("Khoros Visualization image"); + entry->magick_module=ConstantString("VIFF"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r V I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterVIFFImage() removes format registrations made by the +% VIFF module from the list of supported formats. +% +% The format of the UnregisterVIFFImage method is: +% +% UnregisterVIFFImage(void) +% +*/ +ModuleExport void UnregisterVIFFImage(void) +{ + (void) UnregisterMagickInfo("VIFF"); + (void) UnregisterMagickInfo("XV"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e V I F F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteVIFFImage() writes an image to a file in the VIFF image format. +% +% The format of the WriteVIFFImage method is: +% +% MagickBooleanType WriteVIFFImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info, + Image *image) +{ +#define VFF_CM_genericRGB 15 +#define VFF_CM_NONE 0 +#define VFF_DEP_IEEEORDER 0x2 +#define VFF_DES_RAW 0 +#define VFF_LOC_IMPLICIT 1 +#define VFF_MAPTYP_NONE 0 +#define VFF_MAPTYP_1_BYTE 1 +#define VFF_MS_NONE 0 +#define VFF_MS_ONEPERBAND 1 +#define VFF_TYP_BIT 0 +#define VFF_TYP_1_BYTE 1 + + typedef struct _ViffInfo + { + char + identifier, + file_type, + release, + version, + machine_dependency, + reserve[3], + comment[512]; + + size_t + rows, + columns, + subrows; + + int + x_offset, + y_offset; + + unsigned int + x_bits_per_pixel, + y_bits_per_pixel, + location_type, + location_dimension, + number_of_images, + number_data_bands, + data_storage_type, + data_encode_scheme, + map_scheme, + map_storage_type, + map_rows, + map_columns, + map_subrows, + map_enable, + maps_per_cycle, + color_space_model; + } ViffInfo; + + const char + *value; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + MagickSizeType + number_pixels, + packets; + + MemoryInfo + *pixel_info; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + i; + + unsigned char + *q; + + size_t + imageListLength; + + ssize_t + y; + + unsigned char + *pixels; + + ViffInfo + viff_info; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + (void) memset(&viff_info,0,sizeof(ViffInfo)); + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Initialize VIFF image structure. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + viff_info.identifier=(char) -85; + viff_info.file_type=1; + viff_info.release=1; + viff_info.version=3; + viff_info.machine_dependency=VFF_DEP_IEEEORDER; /* IEEE byte ordering */ + *viff_info.comment='\0'; + value=GetImageProperty(image,"comment"); + if (value != (const char *) NULL) + (void) CopyMagickString(viff_info.comment,value,MagickMin(strlen(value), + 511)+1); + viff_info.rows=image->columns; + viff_info.columns=image->rows; + viff_info.subrows=0; + viff_info.x_offset=(~0); + viff_info.y_offset=(~0); + viff_info.x_bits_per_pixel=0; + viff_info.y_bits_per_pixel=0; + viff_info.location_type=VFF_LOC_IMPLICIT; + viff_info.location_dimension=0; + viff_info.number_of_images=1; + viff_info.data_encode_scheme=VFF_DES_RAW; + viff_info.map_scheme=VFF_MS_NONE; + viff_info.map_storage_type=VFF_MAPTYP_NONE; + viff_info.map_rows=0; + viff_info.map_columns=0; + viff_info.map_subrows=0; + viff_info.map_enable=1; /* no colormap */ + viff_info.maps_per_cycle=0; + number_pixels=(MagickSizeType) image->columns*image->rows; + if (image->storage_class == DirectClass) + { + /* + Full color VIFF raster. + */ + viff_info.number_data_bands=image->matte ? 4U : 3U; + viff_info.color_space_model=VFF_CM_genericRGB; + viff_info.data_storage_type=VFF_TYP_1_BYTE; + packets=viff_info.number_data_bands*number_pixels; + } + else + { + viff_info.number_data_bands=1; + viff_info.color_space_model=VFF_CM_NONE; + viff_info.data_storage_type=VFF_TYP_1_BYTE; + packets=number_pixels; + if (SetImageGray(image,&image->exception) == MagickFalse) + { + /* + Colormapped VIFF raster. + */ + viff_info.map_scheme=VFF_MS_ONEPERBAND; + viff_info.map_storage_type=VFF_MAPTYP_1_BYTE; + viff_info.map_rows=3; + viff_info.map_columns=(unsigned int) image->colors; + } + else + if (image->colors <= 2) + { + /* + Monochrome VIFF raster. + */ + viff_info.data_storage_type=VFF_TYP_BIT; + packets=((image->columns+7) >> 3)*image->rows; + } + } + /* + Write VIFF image header (pad to 1024 bytes). + */ + (void) WriteBlob(image,sizeof(viff_info.identifier),(unsigned char *) + &viff_info.identifier); + (void) WriteBlob(image,sizeof(viff_info.file_type),(unsigned char *) + &viff_info.file_type); + (void) WriteBlob(image,sizeof(viff_info.release),(unsigned char *) + &viff_info.release); + (void) WriteBlob(image,sizeof(viff_info.version),(unsigned char *) + &viff_info.version); + (void) WriteBlob(image,sizeof(viff_info.machine_dependency), + (unsigned char *) &viff_info.machine_dependency); + (void) WriteBlob(image,sizeof(viff_info.reserve),(unsigned char *) + viff_info.reserve); + (void) WriteBlob(image,512,(unsigned char *) viff_info.comment); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.rows); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.columns); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.subrows); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.x_offset); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.y_offset); + viff_info.x_bits_per_pixel=(unsigned int) ((63 << 24) | (128 << 16)); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.x_bits_per_pixel); + viff_info.y_bits_per_pixel=(unsigned int) ((63 << 24) | (128 << 16)); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.y_bits_per_pixel); + (void) WriteBlobMSBLong(image,viff_info.location_type); + (void) WriteBlobMSBLong(image,viff_info.location_dimension); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.number_of_images); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.number_data_bands); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.data_storage_type); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.data_encode_scheme); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_scheme); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_storage_type); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_rows); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_columns); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_subrows); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_enable); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.maps_per_cycle); + (void) WriteBlobMSBLong(image,(unsigned int) viff_info.color_space_model); + for (i=0; i < 420; i++) + (void) WriteBlobByte(image,'\0'); + /* + Convert MIFF to VIFF raster pixels. + */ + pixel_info=AcquireVirtualMemory((size_t) packets,sizeof(*pixels)); + if (pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); + q=pixels; + if (image->storage_class == DirectClass) + { + /* + Convert DirectClass packet to VIFF RGB pixel. + */ + number_pixels=(MagickSizeType) image->columns*image->rows; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q=ScaleQuantumToChar(GetPixelRed(p)); + *(q+number_pixels)=ScaleQuantumToChar(GetPixelGreen(p)); + *(q+number_pixels*2)=ScaleQuantumToChar(GetPixelBlue(p)); + if (image->matte != MagickFalse) + *(q+number_pixels*3)=ScaleQuantumToChar((Quantum) + (GetPixelAlpha(p))); + p++; + q++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + else + if (SetImageGray(image,&image->exception) == MagickFalse) + { + unsigned char + *viff_colormap; + + /* + Dump colormap to file. + */ + viff_colormap=(unsigned char *) AcquireQuantumMemory(image->colors, + 3*sizeof(*viff_colormap)); + if (viff_colormap == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + q=viff_colormap; + for (i=0; i < (ssize_t) image->colors; i++) + *q++=ScaleQuantumToChar(image->colormap[i].red); + for (i=0; i < (ssize_t) image->colors; i++) + *q++=ScaleQuantumToChar(image->colormap[i].green); + for (i=0; i < (ssize_t) image->colors; i++) + *q++=ScaleQuantumToChar(image->colormap[i].blue); + (void) WriteBlob(image,3*image->colors,viff_colormap); + viff_colormap=(unsigned char *) RelinquishMagickMemory(viff_colormap); + /* + Convert PseudoClass packet to VIFF colormapped pixels. + */ + q=pixels; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + } + else + if (image->colors <= 2) + { + ssize_t + x, + y; + + unsigned char + bit, + byte; + + /* + Convert PseudoClass image to a VIFF monochrome image. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte>>=1; + if (GetPixelLuma(image,p) < (QuantumRange/2.0)) + byte|=0x80; + bit++; + if (bit == 8) + { + *q++=byte; + bit=0; + byte=0; + } + } + if (bit != 0) + *q++=byte >> (8-bit); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + } + else + { + /* + Convert PseudoClass packet to VIFF grayscale pixel. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=(unsigned char) ClampToQuantum(GetPixelLuma(image,p)); + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); + if (status == MagickFalse) + break; + } + } + } + (void) WriteBlob(image,(size_t) packets,pixels); + pixel_info=RelinquishVirtualMemory(pixel_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/vips.c b/ImageMagick-6.9.12-44/coders/vips.c new file mode 100644 index 0000000..648db77 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/vips.c @@ -0,0 +1,766 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V V IIIII PPPP SSSSS % +% V V I P P SS % +% V V I PPPP SSS % +% V V I P SS % +% V IIIII P SSSSS % +% % +% % +% Read/Write VIPS Image Format % +% % +% Software Design % +% Dirk Lemstra % +% April 2014 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Define declaractions. +*/ +#define VIPS_MAGIC_LSB 0x08f2a6b6U +#define VIPS_MAGIC_MSB 0xb6a6f208U + +typedef enum +{ + VIPSBandFormatNOTSET = -1, + VIPSBandFormatUCHAR = 0, /* Unsigned 8-bit int */ + VIPSBandFormatCHAR = 1, /* Signed 8-bit int */ + VIPSBandFormatUSHORT = 2, /* Unsigned 16-bit int */ + VIPSBandFormatSHORT = 3, /* Signed 16-bit int */ + VIPSBandFormatUINT = 4, /* Unsigned 32-bit int */ + VIPSBandFormatINT = 5, /* Signed 32-bit int */ + VIPSBandFormatFLOAT = 6, /* 32-bit IEEE float */ + VIPSBandFormatCOMPLEX = 7, /* Complex (2 floats) */ + VIPSBandFormatDOUBLE = 8, /* 64-bit IEEE double */ + VIPSBandFormatDPCOMPLEX = 9 /* Complex (2 doubles) */ +} VIPSBandFormat; + +typedef enum +{ + VIPSCodingNONE = 0, /* VIPS computation format */ + VIPSCodingLABQ = 2, /* LABQ storage format */ + VIPSCodingRAD = 6 /* Radiance storage format */ +} VIPSCoding; + +typedef enum +{ + VIPSTypeMULTIBAND = 0, /* Some multiband image */ + VIPSTypeB_W = 1, /* Some single band image */ + VIPSTypeHISTOGRAM = 10, /* Histogram or LUT */ + VIPSTypeFOURIER = 24, /* Image in Fourier space */ + VIPSTypeXYZ = 12, /* CIE XYZ colour space */ + VIPSTypeLAB = 13, /* CIE LAB colour space */ + VIPSTypeCMYK = 15, /* im_icc_export() */ + VIPSTypeLABQ = 16, /* 32-bit CIE LAB */ + VIPSTypeRGB = 17, /* Some RGB */ + VIPSTypeUCS = 18, /* UCS(1:1) colour space */ + VIPSTypeLCH = 19, /* CIE LCh colour space */ + VIPSTypeLABS = 21, /* 48-bit CIE LAB */ + VIPSTypesRGB = 22, /* sRGB colour space */ + VIPSTypeYXY = 23, /* CIE Yxy colour space */ + VIPSTypeRGB16 = 25, /* 16-bit RGB */ + VIPSTypeGREY16 = 26 /* 16-bit monochrome */ +} VIPSType; + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteVIPSImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s V I P S % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsVIPS() returns MagickTrue if the image format type, identified by the +% magick string, is VIPS. +% +% The format of the IsVIPS method is: +% +% MagickBooleanType IsVIPS(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsVIPS(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + + if (memcmp(magick,"\010\362\246\266",4) == 0) + return(MagickTrue); + + if (memcmp(magick,"\266\246\362\010",4) == 0) + return(MagickTrue); + + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d V I P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadVIPSImage() reads a VIPS image file and returns it. It allocates the +% memory necessary for the new Image structure and returns a pointer to the +% new image. +% +% The format of the ReadVIPSImage method is: +% +% Image *ReadVIPSmage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline MagickBooleanType IsSupportedCombination( + const VIPSBandFormat format,const VIPSType type) +{ + switch(type) + { + case VIPSTypeB_W: + case VIPSTypeCMYK: + case VIPSTypeRGB: + case VIPSTypesRGB: + return(MagickTrue); + case VIPSTypeGREY16: + case VIPSTypeRGB16: + switch(format) + { + case VIPSBandFormatUSHORT: + case VIPSBandFormatSHORT: + case VIPSBandFormatUINT: + case VIPSBandFormatINT: + case VIPSBandFormatFLOAT: + case VIPSBandFormatDOUBLE: + return(MagickTrue); + default: + return(MagickFalse); + } + default: + return(MagickFalse); + } +} + +static inline Quantum ReadVIPSPixelNONE(Image *image, + const VIPSBandFormat format,const VIPSType type) +{ + switch(type) + { + case VIPSTypeB_W: + case VIPSTypeRGB: + { + unsigned char + c; + + switch(format) + { + case VIPSBandFormatUCHAR: + case VIPSBandFormatCHAR: + c=(unsigned char) ReadBlobByte(image); + break; + case VIPSBandFormatUSHORT: + case VIPSBandFormatSHORT: + c=(unsigned char) ReadBlobShort(image); + break; + case VIPSBandFormatUINT: + case VIPSBandFormatINT: + c=(unsigned char) ReadBlobLong(image); + break; + case VIPSBandFormatFLOAT: + c=(unsigned char) ReadBlobFloat(image); + break; + case VIPSBandFormatDOUBLE: + c=(unsigned char) ReadBlobDouble(image); + break; + default: + c=0; + break; + } + return(ScaleCharToQuantum(c)); + } + case VIPSTypeGREY16: + case VIPSTypeRGB16: + { + unsigned short + s; + + switch(format) + { + case VIPSBandFormatUSHORT: + case VIPSBandFormatSHORT: + s=(unsigned short) ReadBlobShort(image); + break; + case VIPSBandFormatUINT: + case VIPSBandFormatINT: + s=(unsigned short) ReadBlobLong(image); + break; + case VIPSBandFormatFLOAT: + s=(unsigned short) ReadBlobFloat(image); + break; + case VIPSBandFormatDOUBLE: + s=(unsigned short) ReadBlobDouble(image); + break; + default: + s=0; + break; + } + return(ScaleShortToQuantum(s)); + } + case VIPSTypeCMYK: + case VIPSTypesRGB: + switch(format) + { + case VIPSBandFormatUCHAR: + case VIPSBandFormatCHAR: + return(ScaleCharToQuantum((unsigned char) ReadBlobByte(image))); + case VIPSBandFormatUSHORT: + case VIPSBandFormatSHORT: + return(ScaleShortToQuantum(ReadBlobShort(image))); + case VIPSBandFormatUINT: + case VIPSBandFormatINT: + return(ScaleLongToQuantum(ReadBlobLong(image))); + case VIPSBandFormatFLOAT: + return((Quantum) ((float) QuantumRange*(ReadBlobFloat(image)/1.0))); + case VIPSBandFormatDOUBLE: + return((Quantum) ((double) QuantumRange*(ReadBlobDouble( + image)/1.0))); + default: + return((Quantum) 0); + } + default: + return((Quantum) 0); + } +} + +static MagickBooleanType ReadVIPSPixelsNONE(Image *image, + const VIPSBandFormat format,const VIPSType type,const unsigned int channels, + ExceptionInfo *exception) +{ + Quantum + pixel; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + x; + + ssize_t + y; + + for (y = 0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + return MagickFalse; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=ReadVIPSPixelNONE(image,format,type); + SetPixelRed(q,pixel); + if (channels < 3) + { + SetPixelGreen(q,pixel); + SetPixelBlue(q,pixel); + if (channels == 2) + SetPixelAlpha(q,ReadVIPSPixelNONE(image,format,type)); + } + else + { + SetPixelGreen(q,ReadVIPSPixelNONE(image,format,type)); + SetPixelBlue(q,ReadVIPSPixelNONE(image,format,type)); + if (channels == 4) + { + if (image->colorspace == CMYKColorspace) + SetPixelIndex(indexes+x,ReadVIPSPixelNONE(image,format,type)); + else + SetPixelAlpha(q,ReadVIPSPixelNONE(image,format,type)); + } + else if (channels == 5) + { + SetPixelIndex(indexes+x,ReadVIPSPixelNONE(image,format,type)); + SetPixelAlpha(q,ReadVIPSPixelNONE(image,format,type)); + } + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + return MagickFalse; + } + return(MagickTrue); +} + +static Image *ReadVIPSImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + char + buffer[MaxTextExtent], + *metadata; + + Image + *image; + + MagickBooleanType + status; + + ssize_t + n; + + unsigned int + channels, + marker; + + VIPSBandFormat + format; + + VIPSCoding + coding; + + VIPSType + type; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + marker=ReadBlobLSBLong(image); + if (marker == VIPS_MAGIC_LSB) + image->endian=LSBEndian; + else if (marker == VIPS_MAGIC_MSB) + image->endian=MSBEndian; + else + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + image->columns=(size_t) ReadBlobLong(image); + image->rows=(size_t) ReadBlobLong(image); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + channels=ReadBlobLong(image); + (void) ReadBlobLong(image); /* Legacy */ + format=(VIPSBandFormat) ReadBlobLong(image); + switch(format) + { + case VIPSBandFormatUCHAR: + case VIPSBandFormatCHAR: + image->depth=8; + break; + case VIPSBandFormatUSHORT: + case VIPSBandFormatSHORT: + image->depth=16; + break; + case VIPSBandFormatUINT: + case VIPSBandFormatINT: + case VIPSBandFormatFLOAT: + image->depth=32; + break; + case VIPSBandFormatDOUBLE: + image->depth=64; + break; + default: + case VIPSBandFormatCOMPLEX: + case VIPSBandFormatDPCOMPLEX: + case VIPSBandFormatNOTSET: + ThrowReaderException(CoderError,"Unsupported band format"); + } + coding=(VIPSCoding) ReadBlobLong(image); + type=(VIPSType) ReadBlobLong(image); + switch(type) + { + case VIPSTypeCMYK: + SetImageColorspace(image,CMYKColorspace); + if (channels == 5) + image->matte=MagickTrue; + break; + case VIPSTypeB_W: + case VIPSTypeGREY16: + SetImageColorspace(image,GRAYColorspace); + if (channels == 2) + image->matte=MagickTrue; + break; + case VIPSTypeRGB: + case VIPSTypeRGB16: + SetImageColorspace(image,RGBColorspace); + if (channels == 4) + image->matte=MagickTrue; + break; + case VIPSTypesRGB: + SetImageColorspace(image,sRGBColorspace); + if (channels == 4) + image->matte=MagickTrue; + break; + default: + case VIPSTypeFOURIER: + case VIPSTypeHISTOGRAM: + case VIPSTypeLAB: + case VIPSTypeLABS: + case VIPSTypeLABQ: + case VIPSTypeLCH: + case VIPSTypeMULTIBAND: + case VIPSTypeUCS: + case VIPSTypeXYZ: + case VIPSTypeYXY: + ThrowReaderException(CoderError,"Unsupported colorspace"); + } + (void) SetImageBackgroundColor(image); + image->units=PixelsPerCentimeterResolution; + image->x_resolution=ReadBlobFloat(image)*10; + image->y_resolution=ReadBlobFloat(image)*10; + /* + Legacy, offsets, future + */ + (void) ReadBlobLongLong(image); + (void) ReadBlobLongLong(image); + (void) ReadBlobLongLong(image); + if (image_info->ping != MagickFalse) + return(image); + if (IsSupportedCombination(format,type) == MagickFalse) + ThrowReaderException(CoderError, + "Unsupported combination of band format and colorspace"); + if (channels == 0 || channels > 5) + ThrowReaderException(CoderError,"Unsupported number of channels"); + if (coding == VIPSCodingNONE) + status=ReadVIPSPixelsNONE(image,format,type,channels,exception); + else + ThrowReaderException(CoderError,"Unsupported coding"); + metadata=(char *) NULL; + while ((n=ReadBlob(image,MaxTextExtent-1,(unsigned char *) buffer)) != 0) + { + buffer[n]='\0'; + if (metadata == (char *) NULL) + metadata=ConstantString(buffer); + else + (void) ConcatenateString(&metadata,buffer); + } + if (metadata != (char *) NULL) + { + SetImageProperty(image,"vips:metadata",metadata); + metadata=(char *) RelinquishMagickMemory(metadata); + } + (void) CloseBlob(image); + if (status == MagickFalse) + return((Image *) NULL); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r V I P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterVIPSmage() adds attributes for the VIPS image format to the list +% of supported formats. The attributes include the image format tag, a +% method to read and/or write the format, whether the format supports the +% saving of more than one frame to the same file or blob, whether the format +% supports native in-memory I/O, and a brief description of the format. +% +% The format of the RegisterVIPSImage method is: +% +% size_t RegisterVIPSImage(void) +% +*/ +ModuleExport size_t RegisterVIPSImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("VIPS"); + entry->decoder=(DecodeImageHandler *) ReadVIPSImage; + entry->encoder=(EncodeImageHandler *) WriteVIPSImage; + entry->magick=(IsImageFormatHandler *) IsVIPS; + entry->description=ConstantString("VIPS image"); + entry->endian_support=MagickTrue; + entry->magick_module=ConstantString("VIPS"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r V I P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterVIPSImage() removes format registrations made by the +% VIPS module from the list of supported formats. +% +% The format of the UnregisterVIPSImage method is: +% +% UnregisterVIPSImage(void) +% +*/ +ModuleExport void UnregisterVIPSImage(void) +{ + (void) UnregisterMagickInfo("VIPS"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e V I P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteVIPSImage() writes an image to a file in VIPS image format. +% +% The format of the WriteVIPSImage method is: +% +% MagickBooleanType WriteVIPSImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +static inline void WriteVIPSPixel(Image *image,const Quantum value) +{ + if (image->depth == 16) + (void) WriteBlobShort(image,ScaleQuantumToShort(value)); + else + (void) WriteBlobByte(image,ScaleQuantumToChar(value)); +} + +static MagickBooleanType WriteVIPSImage(const ImageInfo *image_info, + Image *image) +{ + const char + *metadata; + + MagickBooleanType + status; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + y; + + unsigned int + channels; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (image->endian == LSBEndian) + (void) WriteBlobLSBLong(image,VIPS_MAGIC_LSB); + else + (void) WriteBlobLSBLong(image,VIPS_MAGIC_MSB); + (void) WriteBlobLong(image,(unsigned int) image->columns); + (void) WriteBlobLong(image,(unsigned int) image->rows); + (void) SetImageStorageClass(image,DirectClass); + channels=image->matte ? 4 : 3; + if (SetImageGray(image,&image->exception) != MagickFalse) + channels=image->matte ? 2 : 1; + else if (image->colorspace == CMYKColorspace) + channels=image->matte ? 5 : 4; + (void) WriteBlobLong(image,channels); + (void) WriteBlobLong(image,0); + if (image->depth == 16) + (void) WriteBlobLong(image,(unsigned int) VIPSBandFormatUSHORT); + else + { + image->depth=8; + (void) WriteBlobLong(image,(unsigned int) VIPSBandFormatUCHAR); + } + (void) WriteBlobLong(image,VIPSCodingNONE); + switch(image->colorspace) + { + case CMYKColorspace: + (void) WriteBlobLong(image,VIPSTypeCMYK); + break; + case GRAYColorspace: + if (image->depth == 16) + (void) WriteBlobLong(image, VIPSTypeGREY16); + else + (void) WriteBlobLong(image, VIPSTypeB_W); + break; + case RGBColorspace: + if (image->depth == 16) + (void) WriteBlobLong(image, VIPSTypeRGB16); + else + (void) WriteBlobLong(image, VIPSTypeRGB); + break; + default: + case sRGBColorspace: + (void) SetImageColorspace(image,sRGBColorspace); + (void) WriteBlobLong(image,VIPSTypesRGB); + break; + } + if (image->units == PixelsPerCentimeterResolution) + { + (void) WriteBlobFloat(image,(image->x_resolution / 10)); + (void) WriteBlobFloat(image,(image->y_resolution / 10)); + } + else if (image->units == PixelsPerInchResolution) + { + (void) WriteBlobFloat(image,(image->x_resolution / 25.4)); + (void) WriteBlobFloat(image,(image->y_resolution / 25.4)); + } + else + { + (void) WriteBlobLong(image,0); + (void) WriteBlobLong(image,0); + } + /* + Legacy, Offsets, Future + */ + for (y=0; y < 24; y++) + (void) WriteBlobByte(image,0); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + WriteVIPSPixel(image,GetPixelRed(p)); + if (channels == 2) + WriteVIPSPixel(image,GetPixelAlpha(p)); + else + { + if (channels >= 3) + { + WriteVIPSPixel(image,GetPixelGreen(p)); + WriteVIPSPixel(image,GetPixelBlue(p)); + } + if (channels >= 4) + { + if (image->colorspace == CMYKColorspace) + WriteVIPSPixel(image,GetPixelIndex(indexes+x)); + else + WriteVIPSPixel(image,GetPixelAlpha(p)); + } + else if (channels == 5) + { + WriteVIPSPixel(image,GetPixelIndex(indexes+x)); + WriteVIPSPixel(image,GetPixelAlpha(p)); + } + } + p++; + } + } + metadata=GetImageProperty(image,"vips:metadata"); + if (metadata != (const char*) NULL) + WriteBlobString(image,metadata); + (void) CloseBlob(image); + return(status); +} diff --git a/ImageMagick-6.9.12-44/coders/wbmp.c b/ImageMagick-6.9.12-44/coders/wbmp.c new file mode 100644 index 0000000..1ae2701 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/wbmp.c @@ -0,0 +1,427 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W W BBBB M M PPPP % +% W W B B MM MM P P % +% W W W BBBB M M M PPPP % +% WW WW B B M M P % +% W W BBBB M M P % +% % +% % +% Read/Write Wireless Bitmap (level 0) Image Format % +% % +% Software Design % +% Cristy % +% January 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteWBMPImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d W B M P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadWBMPImage() reads a WBMP (level 0) image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% ReadWBMPImage was contributed by Milan Votava . +% +% The format of the ReadWBMPImage method is: +% +% Image *ReadWBMPImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType WBMPReadInteger(Image *image,size_t *value) +{ + int + byte; + + *value=0; + do + { + byte=ReadBlobByte(image); + if (byte == EOF) + return(MagickFalse); + *value<<=7; + *value|=(unsigned int) (byte & 0x7f); + } while (byte & 0x80); + return(MagickTrue); +} + +static Image *ReadWBMPImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + Image + *image; + + int + byte; + + MagickBooleanType + status; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + y; + + unsigned char + bit; + + unsigned short + header; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + header=0; + if (ReadBlob(image,2,(unsigned char *) &header) != 2) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (header != 0) + ThrowReaderException(CoderError,"OnlyLevelZerofilesSupported"); + /* + Initialize image structure. + */ + if (WBMPReadInteger(image,&image->columns) == MagickFalse) + ThrowReaderException(CorruptImageError,"CorruptWBMPimage"); + if (WBMPReadInteger(image,&image->rows) == MagickFalse) + ThrowReaderException(CorruptImageError,"CorruptWBMPimage"); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (DiscardBlobBytes(image,image->offset) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) SetImageBackgroundColor(image); + if (AcquireImageColormap(image,2) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Convert bi-level image to pixel packets. + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (bit == 0) + { + byte=ReadBlobByte(image); + if (byte == EOF) + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + SetPixelIndex(indexes+x,(byte & (0x01 << (7-bit))) ? 1 : 0); + bit++; + if (bit == 8) + bit=0; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) SyncImage(image); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r W B M P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterWBMPImage() adds attributes for the WBMP image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterWBMPImage method is: +% +% size_t RegisterWBMPImage(void) +% +*/ +ModuleExport size_t RegisterWBMPImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("WBMP"); + entry->decoder=(DecodeImageHandler *) ReadWBMPImage; + entry->encoder=(EncodeImageHandler *) WriteWBMPImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Wireless Bitmap (level 0) image"); + entry->magick_module=ConstantString("WBMP"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r W B M P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterWBMPImage() removes format registrations made by the +% WBMP module from the list of supported formats. +% +% The format of the UnregisterWBMPImage method is: +% +% UnregisterWBMPImage(void) +% +*/ +ModuleExport void UnregisterWBMPImage(void) +{ + (void) UnregisterMagickInfo("WBMP"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e W B M P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteWBMPImage() writes an image to a file in the Wireless Bitmap +% (level 0) image format. +% +% WriteWBMPImage was contributed by Milan Votava . +% +% The format of the WriteWBMPImage method is: +% +% MagickBooleanType WriteWBMPImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% +*/ + +static void WBMPWriteInteger(Image *image,const size_t value) +{ + int + bits, + flag, + n; + + ssize_t + i; + + unsigned char + buffer[5], + octet; + + n=1; + bits=28; + flag=MagickFalse; + for (i=4; i >= 0; i--) + { + octet=(unsigned char) ((value >> bits) & 0x7f); + if ((flag == 0) && (octet != 0)) + { + flag=MagickTrue; + n=i+1; + } + buffer[4-i]=octet | (i && (flag || octet))*(0x01 << 7); + bits-=7; + } + (void) WriteBlob(image,(size_t) n,buffer+5-n); +} + +static MagickBooleanType WriteWBMPImage(const ImageInfo *image_info, + Image *image) +{ + MagickBooleanType + status; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + y; + + unsigned char + bit, + byte; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Convert image to a bi-level image. + */ + (void) SetImageType(image,BilevelType); + (void) WriteBlobMSBShort(image,0); + WBMPWriteInteger(image,image->columns); + WBMPWriteInteger(image,image->rows); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelLuma(image,p) >= (QuantumRange/2.0)) + byte|=0x1 << (7-bit); + bit++; + if (bit == 8) + { + (void) WriteBlobByte(image,byte); + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + (void) WriteBlobByte(image,byte); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/webp.c b/ImageMagick-6.9.12-44/coders/webp.c new file mode 100644 index 0000000..2d6a0b0 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/webp.c @@ -0,0 +1,1228 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W W EEEEE BBBB PPPP % +% W W E B B P P % +% W W W EEE BBBB PPPP % +% WW WW E B B P % +% W W EEEEE BBBB P % +% % +% % +% Read/Write WebP Image Format % +% % +% Software Design % +% Cristy % +% March 2011 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/client.h" +#include "magick/colorspace-private.h" +#include "magick/display.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/memory_.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/module.h" +#include "magick/utility.h" +#include "magick/xwindow.h" +#include "magick/xwindow-private.h" +#if defined(MAGICKCORE_WEBP_DELEGATE) +#include +#include +#if defined(MAGICKCORE_WEBPMUX_DELEGATE) +#include +#include +#endif +#endif + +/* + Forward declarations. +*/ +#if defined(MAGICKCORE_WEBP_DELEGATE) +static MagickBooleanType + WriteWEBPImage(const ImageInfo *,Image *); +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s W E B P % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsWEBP() returns MagickTrue if the image format type, identified by the +% magick string, is WebP. +% +% The format of the IsWEBP method is: +% +% MagickBooleanType IsWEBP(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsWEBP(const unsigned char *magick,const size_t length) +{ + if (length < 12) + return(MagickFalse); + if (LocaleNCompare((const char *) magick+8,"WEBP",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + +#if defined(MAGICKCORE_WEBP_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d W E B P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadWEBPImage() reads an image in the WebP image format. +% +% The format of the ReadWEBPImage method is: +% +% Image *ReadWEBPImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline uint32_t ReadWebPLSBWord( + const unsigned char *magick_restrict data) +{ + const unsigned char + *p; + + uint32_t + value; + + p=data; + value=(uint32_t) (*p++); + value|=((uint32_t) (*p++)) << 8; + value|=((uint32_t) (*p++)) << 16; + value|=((uint32_t) (*p++)) << 24; + return(value); +} + +static MagickBooleanType IsWEBPImageLossless(const unsigned char *stream, + const size_t length) +{ +#define VP8_CHUNK_INDEX 15 +#define LOSSLESS_FLAG 'L' +#define EXTENDED_HEADER 'X' +#define VP8_CHUNK_HEADER "VP8" +#define VP8_CHUNK_HEADER_SIZE 3 +#define RIFF_HEADER_SIZE 12 +#define VP8X_CHUNK_SIZE 10 +#define TAG_SIZE 4 +#define CHUNK_SIZE_BYTES 4 +#define CHUNK_HEADER_SIZE 8 +#define MAX_CHUNK_PAYLOAD (~0U-CHUNK_HEADER_SIZE-1) + + size_t + offset; + + /* + Read simple header. + */ + if (length <= VP8_CHUNK_INDEX) + return(MagickFalse); + if (stream[VP8_CHUNK_INDEX] != EXTENDED_HEADER) + return(stream[VP8_CHUNK_INDEX] == LOSSLESS_FLAG ? MagickTrue : MagickFalse); + /* + Read extended header. + */ + offset=RIFF_HEADER_SIZE+TAG_SIZE+CHUNK_SIZE_BYTES+VP8X_CHUNK_SIZE; + while (offset <= (length-TAG_SIZE-TAG_SIZE-4)) + { + uint32_t + chunk_size, + chunk_size_pad; + + chunk_size=ReadWebPLSBWord(stream+offset+TAG_SIZE); + if (chunk_size > MAX_CHUNK_PAYLOAD) + break; + chunk_size_pad=(CHUNK_HEADER_SIZE+chunk_size+1) & ~1; + if (memcmp(stream+offset,VP8_CHUNK_HEADER,VP8_CHUNK_HEADER_SIZE) == 0) + return(*(stream+offset+VP8_CHUNK_HEADER_SIZE) == LOSSLESS_FLAG ? + MagickTrue : MagickFalse); + offset+=chunk_size_pad; + } + return(MagickFalse); +} + +static int FillBasicWEBPInfo(Image *image,const uint8_t *stream,size_t length, + WebPDecoderConfig *configure) +{ + WebPBitstreamFeatures + *magick_restrict features = &configure->input; + + int + webp_status; + + webp_status=WebPGetFeatures(stream,length,features); + + if (webp_status != VP8_STATUS_OK) + return(webp_status); + + image->columns=(size_t) features->width; + image->rows=(size_t) features->height; + image->depth=8; + image->matte=features->has_alpha != 0 ? MagickTrue : MagickFalse; + + return(webp_status); +} + +static int ReadSingleWEBPImage(Image *image,const uint8_t *stream, + size_t length,WebPDecoderConfig *configure,ExceptionInfo *exception, + MagickBooleanType is_first) +{ + int + webp_status; + + unsigned char + *p; + + size_t + canvas_width, + canvas_height, + image_width, + image_height; + + ssize_t + x_offset, + y_offset, + y; + + WebPDecBuffer + *magick_restrict webp_image = &configure->output; + + MagickBooleanType + status; + + if (is_first) + { + canvas_width=image->columns; + canvas_height=image->rows; + x_offset=image->page.x; + y_offset=image->page.y; + image->page.x=0; + image->page.y=0; + } + else + { + x_offset=0; + y_offset=0; + } + webp_status=FillBasicWEBPInfo(image,stream,length,configure); + image_width=image->columns; + image_height=image->rows; + if (is_first) + { + image->columns=canvas_width; + image->rows=canvas_height; + } + + if (webp_status != VP8_STATUS_OK) + return(webp_status); + + if (IsWEBPImageLossless(stream,length) != MagickFalse) + image->quality=100; + + webp_status=WebPDecode(stream,length,configure); + if (webp_status != VP8_STATUS_OK) + return(webp_status); + + p=(unsigned char *) webp_image->u.RGBA.rgba; + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *q; + + ssize_t + x; + + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((x >= x_offset && x < (ssize_t) (x_offset+image_width)) && + (y >= y_offset && y < (ssize_t) (y_offset+image_height))) + { + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + SetPixelAlpha(q,ScaleCharToQuantum(*p++)); + } + else + { + SetPixelRed(q,0); + SetPixelGreen(q,0); + SetPixelBlue(q,0); + SetPixelAlpha(q,0); + } + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + WebPFreeDecBuffer(webp_image); +#if defined(MAGICKCORE_WEBPMUX_DELEGATE) + { + StringInfo + *profile; + + uint32_t + webp_flags = 0; + + WebPData + chunk, + content; + + WebPMux + *mux; + + /* + Extract any profiles: + https://developers.google.com/speed/webp/docs/container-api. + */ + content.bytes=stream; + content.size=length; + mux=WebPMuxCreate(&content,0); + (void) memset(&chunk,0,sizeof(chunk)); + (void) WebPMuxGetFeatures(mux,&webp_flags); + if ((webp_flags & ICCP_FLAG) && + (WebPMuxGetChunk(mux,"ICCP",&chunk) == WEBP_MUX_OK)) + if (chunk.size != 0) + { + profile=BlobToStringInfo(chunk.bytes,chunk.size); + if (profile != (StringInfo *) NULL) + { + SetImageProfile(image,"ICC",profile); + profile=DestroyStringInfo(profile); + } + } + if ((webp_flags & EXIF_FLAG) && + (WebPMuxGetChunk(mux,"EXIF",&chunk) == WEBP_MUX_OK)) + if (chunk.size != 0) + { + WebPMuxGetChunk(mux,"EXIF",&chunk); + profile=BlobToStringInfo(chunk.bytes,chunk.size); + if (profile != (StringInfo *) NULL) + { + SetImageProfile(image,"EXIF",profile); + profile=DestroyStringInfo(profile); + } + } + if ((webp_flags & XMP_FLAG) && + (WebPMuxGetChunk(mux,"XMP ",&chunk) == WEBP_MUX_OK)) + if (chunk.size != 0) + { + profile=BlobToStringInfo(chunk.bytes,chunk.size); + if (profile != (StringInfo *) NULL) + { + SetImageProfile(image,"XMP",profile); + profile=DestroyStringInfo(profile); + } + } + WebPMuxDelete(mux); + } +#endif + return(webp_status); +} + +#if defined(MAGICKCORE_WEBPMUX_DELEGATE) +static int ReadAnimatedWEBPImage(const ImageInfo *image_info,Image *image, + uint8_t *stream,size_t length,WebPDecoderConfig *configure, + ExceptionInfo *exception) +{ + Image + *original_image; + + int + image_count, + webp_status; + + size_t + canvas_width, + canvas_height; + + WebPData + data; + + WebPDemuxer + *demux; + + WebPIterator + iter; + + image_count=0; + webp_status=0; + original_image=image; + webp_status=FillBasicWEBPInfo(image,stream,length,configure); + canvas_width=image->columns; + canvas_height=image->rows; + data.bytes=stream; + data.size=length; + { + WebPMux + *mux; + + WebPMuxAnimParams + params; + + WebPMuxError + status; + + mux=WebPMuxCreate(&data,0); + status=WebPMuxGetAnimationParams(mux,¶ms); + if (status >= 0) + image->iterations=params.loop_count; + WebPMuxDelete(mux); + } + demux=WebPDemux(&data); + if (WebPDemuxGetFrame(demux,1,&iter)) { + do { + if (image_count != 0) + { + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + CloneImageProperties(image, original_image); + image->page.x=iter.x_offset; + image->page.y=iter.y_offset; + webp_status=ReadSingleWEBPImage(image,iter.fragment.bytes, + iter.fragment.size,configure,exception,MagickFalse); + } + else + { + image->page.x=iter.x_offset; + image->page.y=iter.y_offset; + webp_status=ReadSingleWEBPImage(image,iter.fragment.bytes, + iter.fragment.size,configure,exception,MagickTrue); + } + if (webp_status != VP8_STATUS_OK) + break; + + image->page.width=canvas_width; + image->page.height=canvas_height; + image->ticks_per_second=100; + image->delay=iter.duration/10; + image->dispose=NoneDispose; + if (iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) + image->dispose=BackgroundDispose; + image_count++; + } while (WebPDemuxNextFrame(&iter)); + WebPDemuxReleaseIterator(&iter); + } + WebPDemuxDelete(demux); + return(webp_status); +} +#endif + +static Image *ReadWEBPImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ +#define ThrowWEBPException(severity,tag) \ +{ \ + if (stream != (unsigned char *) NULL) \ + stream=(unsigned char*) RelinquishMagickMemory(stream); \ + if (webp_image != (WebPDecBuffer *) NULL) \ + WebPFreeDecBuffer(webp_image); \ + ThrowReaderException(severity,tag); \ +} + + Image + *image; + + int + webp_status; + + MagickBooleanType + status; + + size_t + length; + + ssize_t + count; + + unsigned char + header[12], + *stream; + + WebPDecoderConfig + configure; + + WebPDecBuffer + *magick_restrict webp_image = &configure.output; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + stream=(unsigned char *) NULL; + if (WebPInitDecoderConfig(&configure) == 0) + ThrowReaderException(ResourceLimitError,"UnableToDecodeImageFile"); + webp_image->colorspace=MODE_RGBA; + count=ReadBlob(image,12,header); + if (count != 12) + ThrowWEBPException(CorruptImageError,"InsufficientImageDataInFile"); + status=IsWEBP(header,count); + if (status == MagickFalse) + ThrowWEBPException(CorruptImageError,"CorruptImage"); + length=(size_t) (ReadWebPLSBWord(header+4)+8); + if (length < 12) + ThrowWEBPException(CorruptImageError,"CorruptImage"); + if (length > GetBlobSize(image)) + ThrowWEBPException(CorruptImageError,"InsufficientImageDataInFile"); + stream=(unsigned char *) AcquireQuantumMemory(length,sizeof(*stream)); + if (stream == (unsigned char *) NULL) + ThrowWEBPException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memcpy(stream,header,12); + count=ReadBlob(image,length-12,stream+12); + if (count != (ssize_t) (length-12)) + ThrowWEBPException(CorruptImageError,"InsufficientImageDataInFile"); + + webp_status=FillBasicWEBPInfo(image,stream,length,&configure); + if (webp_status == VP8_STATUS_OK) { + if (configure.input.has_animation) { +#if defined(MAGICKCORE_WEBPMUX_DELEGATE) + webp_status=ReadAnimatedWEBPImage(image_info,image,stream,length, + &configure,exception); +#else + webp_status=VP8_STATUS_UNSUPPORTED_FEATURE; +#endif + } else { + webp_status=ReadSingleWEBPImage(image,stream,length,&configure,exception,MagickFalse); + } + } + + if (webp_status != VP8_STATUS_OK) + switch (webp_status) + { + case VP8_STATUS_OUT_OF_MEMORY: + { + ThrowWEBPException(ResourceLimitError,"MemoryAllocationFailed"); + break; + } + case VP8_STATUS_INVALID_PARAM: + { + ThrowWEBPException(CorruptImageError,"invalid parameter"); + break; + } + case VP8_STATUS_BITSTREAM_ERROR: + { + ThrowWEBPException(CorruptImageError,"CorruptImage"); + break; + } + case VP8_STATUS_UNSUPPORTED_FEATURE: + { + ThrowWEBPException(CoderError,"DataEncodingSchemeIsNotSupported"); + break; + } + case VP8_STATUS_SUSPENDED: + { + ThrowWEBPException(CorruptImageError,"decoder suspended"); + break; + } + case VP8_STATUS_USER_ABORT: + { + ThrowWEBPException(CorruptImageError,"user abort"); + break; + } + case VP8_STATUS_NOT_ENOUGH_DATA: + { + ThrowWEBPException(CorruptImageError,"InsufficientImageDataInFile"); + break; + } + default: + ThrowWEBPException(CorruptImageError,"CorruptImage"); + } + + stream=(unsigned char*) RelinquishMagickMemory(stream); + (void) CloseBlob(image); + return(image); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r W E B P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterWEBPImage() adds attributes for the WebP image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterWEBPImage method is: +% +% size_t RegisterWEBPImage(void) +% +*/ +ModuleExport size_t RegisterWEBPImage(void) +{ + char + version[MagickPathExtent]; + + MagickInfo + *entry; + + *version='\0'; + entry=SetMagickInfo("WEBP"); +#if defined(MAGICKCORE_WEBP_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadWEBPImage; + entry->encoder=(EncodeImageHandler *) WriteWEBPImage; + (void) FormatLocaleString(version,MagickPathExtent,"libwebp %d.%d.%d [%04X]", + (WebPGetEncoderVersion() >> 16) & 0xff, + (WebPGetEncoderVersion() >> 8) & 0xff, + (WebPGetEncoderVersion() >> 0) & 0xff,WEBP_ENCODER_ABI_VERSION); +#endif + entry->description=ConstantString("WebP Image Format"); + entry->mime_type=ConstantString("image/webp"); + entry->seekable_stream=MagickTrue; +#if !defined(MAGICKCORE_WEBPMUX_DELEGATE) + entry->adjoin=MagickFalse; +#endif + entry->magick_module=ConstantString("WEBP"); + entry->magick=(IsImageFormatHandler *) IsWEBP; + if (*version != '\0') + entry->version=ConstantString(version); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r W E B P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterWEBPImage() removes format registrations made by the WebP module +% from the list of supported formats. +% +% The format of the UnregisterWEBPImage method is: +% +% UnregisterWEBPImage(void) +% +*/ +ModuleExport void UnregisterWEBPImage(void) +{ + (void) UnregisterMagickInfo("WEBP"); +} +#if defined(MAGICKCORE_WEBP_DELEGATE) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e W E B P I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteWEBPImage() writes an image in the WebP image format. +% +% The format of the WriteWEBPImage method is: +% +% MagickBooleanType WriteWEBPImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ + +#if WEBP_ENCODER_ABI_VERSION >= 0x0100 +static int WebPEncodeProgress(int percent,const WebPPicture* picture) +{ +#define EncodeImageTag "Encode/Image" + + Image + *image; + + MagickBooleanType + status; + + image=(Image *) picture->user_data; + status=SetImageProgress(image,EncodeImageTag,percent-1,100); + return(status == MagickFalse ? 0 : 1); +} +#endif + +#if !defined(MAGICKCORE_WEBPMUX_DELEGATE) +static int WebPEncodeWriter(const unsigned char *stream,size_t length, + const WebPPicture *const picture) +{ + Image + *image; + + image=(Image *) picture->custom_ptr; + return(length != 0 ? (WriteBlob(image,length,stream) == (ssize_t) length) : 1); +} +#endif + +typedef struct PictureMemory { + MemoryInfo *pixel_info; + struct PictureMemory *next; +} PictureMemory; + +static MagickBooleanType WriteSingleWEBPImage(const ImageInfo *image_info, + Image *image,WebPPicture *picture,PictureMemory *picture_memory, + ExceptionInfo *exception) +{ + MagickBooleanType + status = MagickFalse; + + uint32_t + *magick_restrict q; + + ssize_t + y; + +#if WEBP_ENCODER_ABI_VERSION >= 0x0100 + picture->progress_hook=WebPEncodeProgress; + picture->user_data=(void *) image; +#endif + picture->width=(int) image->columns; + picture->height=(int) image->rows; + picture->argb_stride=(int) image->columns; + picture->use_argb=1; + + /* + Allocate memory for pixels. + */ + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + picture_memory->pixel_info=AcquireVirtualMemory(image->columns,image->rows* + sizeof(*(picture->argb))); + + if (picture_memory->pixel_info == (MemoryInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + picture->argb=(uint32_t *) GetVirtualMemoryBlob(picture_memory->pixel_info); + /* + Convert image to WebP raster pixels. + */ + q=picture->argb; + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=(uint32_t) (image->matte != MagickFalse ? (uint32_t) + ScaleQuantumToChar(GetPixelAlpha(p)) << 24 : 0xff000000) | + ((uint32_t) ScaleQuantumToChar(GetPixelRed(p)) << 16) | + ((uint32_t) ScaleQuantumToChar(GetPixelGreen(p)) << 8) | + ((uint32_t) ScaleQuantumToChar(GetPixelBlue(p))); + p++; + } + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + return status; +} + +#if defined(MAGICKCORE_WEBPMUX_DELEGATE) +static void FreePictureMemoryList (PictureMemory* head) { + PictureMemory* next; + while(head != NULL) { + next = head->next; + if(head->pixel_info != NULL) + RelinquishVirtualMemory(head->pixel_info); + free(head); + head = next; + } +} + +static MagickBooleanType WriteAnimatedWEBPImage(const ImageInfo *image_info, + Image *image,WebPConfig *configure,WebPMemoryWriter *writer_info, + ExceptionInfo *exception) +{ + Image + *first_image; + + PictureMemory + *current, + *head; + + size_t + effective_delta = 0, + frame_timestamp = 0; + + WebPAnimEncoder + *enc; + + WebPAnimEncoderOptions + enc_options; + + WebPData + webp_data; + + WebPPicture + picture; + + WebPAnimEncoderOptionsInit(&enc_options); + if (image_info->verbose) + enc_options.verbose = 1; + + image=CoalesceImages(image, exception); + first_image=image; + enc=WebPAnimEncoderNew((int) image->page.width,(int) image->page.height, + &enc_options); + + head=(PictureMemory *) calloc(sizeof(*head),1); + current=head; + + while (image != NULL) + { + if (WebPPictureInit(&picture) == 0) + ThrowWriterException(ResourceLimitError,"UnableToEncodeImageFile"); + + WriteSingleWEBPImage(image_info, image, &picture, current, exception); + + effective_delta = image->delay*1000*PerceptibleReciprocal( + image->ticks_per_second); + if (effective_delta < 10) + effective_delta = 100; /* Consistent with gif2webp */ + frame_timestamp+=effective_delta; + + WebPAnimEncoderAdd(enc,&picture,(int) frame_timestamp,configure); + + image = GetNextImageInList(image); + current->next=(PictureMemory *) calloc(sizeof(*head), 1); + current = current->next; + } + webp_data.bytes=writer_info->mem; + webp_data.size=writer_info->size; + WebPAnimEncoderAssemble(enc, &webp_data); + WebPMemoryWriterClear(writer_info); + writer_info->size=webp_data.size; + writer_info->mem=(unsigned char *) webp_data.bytes; + WebPAnimEncoderDelete(enc); + DestroyImageList(first_image); + FreePictureMemoryList(head); + return(MagickTrue); +} +#endif + +static MagickBooleanType WriteWEBPImage(const ImageInfo *image_info, + Image *image) +{ + const char + *value; + + int + webp_status; + + MagickBooleanType + status; + + WebPAuxStats + statistics; + + WebPConfig + configure; + +#if defined(MAGICKCORE_WEBPMUX_DELEGATE) + WebPMemoryWriter + writer_info; +#endif + + WebPPicture + picture; + + PictureMemory + memory = {0}; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((image->columns > 16383UL) || (image->rows > 16383UL)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (WebPConfigInit(&configure) == 0) + ThrowWriterException(ResourceLimitError,"UnableToEncodeImageFile"); + if (WebPPictureInit(&picture) == 0) + ThrowWriterException(ResourceLimitError,"UnableToEncodeImageFile"); +#if !defined(MAGICKCORE_WEBPMUX_DELEGATE) + picture.writer=WebPEncodeWriter; + picture.custom_ptr=(void *) image; +#else + WebPMemoryWriterInit(&writer_info); + picture.writer=WebPMemoryWrite; + picture.custom_ptr=(&writer_info); +#endif + picture.stats=(&statistics); + if (image->quality != UndefinedCompressionQuality) + configure.quality=(float) image->quality; + if (image->quality >= 100) + configure.lossless=1; + value=GetImageOption(image_info,"webp:lossless"); + if (value != (char *) NULL) + configure.lossless=(int) ParseCommandOption(MagickBooleanOptions, + MagickFalse,value); + value=GetImageOption(image_info,"webp:method"); + if (value != (char *) NULL) + configure.method=StringToInteger(value); + value=GetImageOption(image_info,"webp:image-hint"); + if (value != (char *) NULL) + { + if (LocaleCompare(value,"default") == 0) + configure.image_hint=WEBP_HINT_DEFAULT; + if (LocaleCompare(value,"photo") == 0) + configure.image_hint=WEBP_HINT_PHOTO; + if (LocaleCompare(value,"picture") == 0) + configure.image_hint=WEBP_HINT_PICTURE; +#if WEBP_ENCODER_ABI_VERSION >= 0x0200 + if (LocaleCompare(value,"graph") == 0) + configure.image_hint=WEBP_HINT_GRAPH; +#endif + } + value=GetImageOption(image_info,"webp:target-size"); + if (value != (char *) NULL) + configure.target_size=StringToInteger(value); + value=GetImageOption(image_info,"webp:target-psnr"); + if (value != (char *) NULL) + configure.target_PSNR=(float) StringToDouble(value,(char **) NULL); + value=GetImageOption(image_info,"webp:segments"); + if (value != (char *) NULL) + configure.segments=StringToInteger(value); + value=GetImageOption(image_info,"webp:sns-strength"); + if (value != (char *) NULL) + configure.sns_strength=StringToInteger(value); + value=GetImageOption(image_info,"webp:filter-strength"); + if (value != (char *) NULL) + configure.filter_strength=StringToInteger(value); + value=GetImageOption(image_info,"webp:filter-sharpness"); + if (value != (char *) NULL) + configure.filter_sharpness=StringToInteger(value); + value=GetImageOption(image_info,"webp:filter-type"); + if (value != (char *) NULL) + configure.filter_type=StringToInteger(value); + value=GetImageOption(image_info,"webp:auto-filter"); + if (value != (char *) NULL) + configure.autofilter=(int) ParseCommandOption(MagickBooleanOptions, + MagickFalse,value); + value=GetImageOption(image_info,"webp:alpha-compression"); + if (value != (char *) NULL) + configure.alpha_compression=StringToInteger(value); + value=GetImageOption(image_info,"webp:alpha-filtering"); + if (value != (char *) NULL) + configure.alpha_filtering=StringToInteger(value); + value=GetImageOption(image_info,"webp:alpha-quality"); + if (value != (char *) NULL) + configure.alpha_quality=StringToInteger(value); + value=GetImageOption(image_info,"webp:pass"); + if (value != (char *) NULL) + configure.pass=StringToInteger(value); + value=GetImageOption(image_info,"webp:show-compressed"); + if (value != (char *) NULL) + configure.show_compressed=StringToInteger(value); + value=GetImageOption(image_info,"webp:preprocessing"); + if (value != (char *) NULL) + configure.preprocessing=StringToInteger(value); + value=GetImageOption(image_info,"webp:partitions"); + if (value != (char *) NULL) + configure.partitions=StringToInteger(value); + value=GetImageOption(image_info,"webp:partition-limit"); + if (value != (char *) NULL) + configure.partition_limit=StringToInteger(value); +#if WEBP_ENCODER_ABI_VERSION >= 0x0201 + value=GetImageOption(image_info,"webp:emulate-jpeg-size"); + if (value != (char *) NULL) + configure.emulate_jpeg_size=(int) ParseCommandOption(MagickBooleanOptions, + MagickFalse,value); + value=GetImageOption(image_info,"webp:low-memory"); + if (value != (char *) NULL) + configure.low_memory=(int) ParseCommandOption(MagickBooleanOptions, + MagickFalse,value); + value=GetImageOption(image_info,"webp:thread-level"); + if (value != (char *) NULL) + configure.thread_level=StringToInteger(value); +#endif +#if WEBP_ENCODER_ABI_VERSION >= 0x020e + value=GetImageOption(image_info,"webp:use-sharp-yuv"); + if (value != (char *) NULL) + configure.use_sharp_yuv=StringToInteger(value); +#endif + if (WebPValidateConfig(&configure) == 0) + ThrowWriterException(ResourceLimitError,"UnableToEncodeImageFile"); + + WriteSingleWEBPImage(image_info,image,&picture,&memory,&image->exception); + +#if defined(MAGICKCORE_WEBPMUX_DELEGATE) + if ((image_info->adjoin != MagickFalse) && + (GetPreviousImageInList(image) == (Image *) NULL) && + (GetNextImageInList(image) != (Image *) NULL) && + (image->iterations != 1)) + WriteAnimatedWEBPImage(image_info,image,&configure,&writer_info,&image->exception); +#endif + + webp_status=WebPEncode(&configure,&picture); + if (webp_status == 0) + { + const char + *message; + + switch (picture.error_code) + { + case VP8_ENC_ERROR_OUT_OF_MEMORY: + { + message="out of memory"; + break; + } + case VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY: + { + message="bitstream out of memory"; + break; + } + case VP8_ENC_ERROR_NULL_PARAMETER: + { + message="NULL parameter"; + break; + } + case VP8_ENC_ERROR_INVALID_CONFIGURATION: + { + message="invalid configuration"; + break; + } + case VP8_ENC_ERROR_BAD_DIMENSION: + { + message="bad dimension"; + break; + } + case VP8_ENC_ERROR_PARTITION0_OVERFLOW: + { + message="partition 0 overflow (> 512K)"; + break; + } + case VP8_ENC_ERROR_PARTITION_OVERFLOW: + { + message="partition overflow (> 16M)"; + break; + } + case VP8_ENC_ERROR_BAD_WRITE: + { + message="bad write"; + break; + } + case VP8_ENC_ERROR_FILE_TOO_BIG: + { + message="file too big (> 4GB)"; + break; + } +#if WEBP_ENCODER_ABI_VERSION >= 0x0100 + case VP8_ENC_ERROR_USER_ABORT: + { + message="user abort"; + break; + } +#endif + default: + { + message="unknown exception"; + break; + } + } + (void) ThrowMagickException(&image->exception,GetMagickModule(),CorruptImageError, + (char *) message,"`%s'",image->filename); + } +#if defined(MAGICKCORE_WEBPMUX_DELEGATE) + { + const StringInfo + *profile; + + WebPData + chunk, + image_chunk; + + WebPMux + *mux; + + WebPMuxError + mux_error; + + /* + Set image profiles (if any). + */ + image_chunk.bytes=writer_info.mem; + image_chunk.size=writer_info.size; + mux_error=WEBP_MUX_OK; + (void) memset(&chunk,0,sizeof(chunk)); + mux=WebPMuxNew(); + profile=GetImageProfile(image,"ICC"); + if ((profile != (StringInfo *) NULL) && (mux_error == WEBP_MUX_OK)) + { + chunk.bytes=GetStringInfoDatum(profile); + chunk.size=GetStringInfoLength(profile); + mux_error=WebPMuxSetChunk(mux,"ICCP",&chunk,0); + } + profile=GetImageProfile(image,"EXIF"); + if ((profile != (StringInfo *) NULL) && (mux_error == WEBP_MUX_OK)) + { + chunk.bytes=GetStringInfoDatum(profile); + chunk.size=GetStringInfoLength(profile); + if ((chunk.size >= 6) && + (chunk.bytes[0] == 'E') && (chunk.bytes[1] == 'x') && + (chunk.bytes[2] == 'i') && (chunk.bytes[3] == 'f') && + (chunk.bytes[4] == '\0') && (chunk.bytes[5] == '\0')) + { + chunk.bytes=GetStringInfoDatum(profile)+6; + chunk.size-=6; + } + mux_error=WebPMuxSetChunk(mux,"EXIF",&chunk,0); + } + profile=GetImageProfile(image,"XMP"); + if ((profile != (StringInfo *) NULL) && (mux_error == WEBP_MUX_OK)) + { + chunk.bytes=GetStringInfoDatum(profile); + chunk.size=GetStringInfoLength(profile); + mux_error=WebPMuxSetChunk(mux,"XMP ",&chunk,0); + } + if (mux_error != WEBP_MUX_OK) + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"UnableToEncodeImageFile","`%s'",image->filename); + if (chunk.size != 0) + { + WebPData + picture_profiles; + + /* + Replace original container with image profile (if any). + */ + picture_profiles.bytes=writer_info.mem; + picture_profiles.size=writer_info.size; + WebPMuxSetImage(mux,&image_chunk,1); + mux_error=WebPMuxAssemble(mux,&picture_profiles); + WebPMemoryWriterClear(&writer_info); + writer_info.size=picture_profiles.size; + writer_info.mem=(unsigned char *) picture_profiles.bytes; + } + WebPMuxDelete(mux); + } + (void) WriteBlob(image,writer_info.size,writer_info.mem); +#endif + picture.argb=(uint32_t *) NULL; + WebPPictureFree(&picture); +#if defined(MAGICKCORE_WEBPMUX_DELEGATE) + WebPMemoryWriterClear(&writer_info); +#endif + (void) CloseBlob(image); + RelinquishVirtualMemory(memory.pixel_info); + return(webp_status == 0 ? MagickFalse : MagickTrue); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/wmf.c b/ImageMagick-6.9.12-44/coders/wmf.c new file mode 100644 index 0000000..d8873fb --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/wmf.c @@ -0,0 +1,3010 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W W M M FFFFF % +% W W MM MM F % +% W W W M M M FFF % +% WW WW M M F % +% W W M M F % +% % +% % +% Read Windows Metafile Format % +% % +% Software Design % +% Cristy % +% December 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/property.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/paint.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/type.h" +#include "magick/module.h" +#if defined(MAGICKCORE_WMF_DELEGATE) +#include "wand/MagickWand.h" +#endif + +#if defined(__CYGWIN__) +#undef MAGICKCORE_SANS_DELEGATE +#endif + +#if defined(MAGICKCORE_SANS_DELEGATE) +#include "libwmf/api.h" +#include "libwmf/eps.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d W M F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadWMFImage() reads an Windows Metafile image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadWMFImage method is: +% +% Image *ReadWMFImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static int WMFReadBlob(void *image) +{ + return(ReadBlobByte((Image *) image)); +} + +static int WMFSeekBlob(void *image,long offset) +{ + return((int) SeekBlob((Image *) image,(MagickOffsetType) offset,SEEK_SET)); +} + +static long WMFTellBlob(void *image) +{ + return((long) TellBlob((Image*) image)); +} + +static Image *ReadWMFImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + filename[MaxTextExtent]; + + int + unique_file; + + FILE + *file; + + Image + *image; + + ImageInfo + *read_info; + + MagickBooleanType + status; + + size_t + flags; + + wmfAPI + *wmf_info; + + wmfAPI_Options + options; + + wmfD_Rect + bounding_box; + + wmf_eps_t + *eps_info; + + wmf_error_t + wmf_status; + + /* + Read WMF image. + */ + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + wmf_info=(wmfAPI *) NULL; + flags=0; + flags|=WMF_OPT_IGNORE_NONFATAL; + flags|=WMF_OPT_FUNCTION; + options.function=wmf_eps_function; + wmf_status=wmf_api_create(&wmf_info,(unsigned long) flags,&options); + if (wmf_status != wmf_E_None) + { + if (wmf_info != (wmfAPI *) NULL) + wmf_api_destroy(wmf_info); + ThrowReaderException(DelegateError,"UnableToInitializeWMFLibrary"); + } + wmf_status=wmf_bbuf_input(wmf_info,WMFReadBlob,WMFSeekBlob,WMFTellBlob, + (void *) image); + if (wmf_status != wmf_E_None) + { + ipa_device_close(wmf_info); + wmf_api_destroy(wmf_info); + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + image->filename); + image=DestroyImageList(image); + return((Image *) NULL); + } + wmf_status=wmf_scan(wmf_info,0,&bounding_box); + if (wmf_status != wmf_E_None) + { + ipa_device_close(wmf_info); + wmf_api_destroy(wmf_info); + ThrowReaderException(DelegateError,"FailedToScanFile"); + } + eps_info=WMF_EPS_GetData(wmf_info); + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(filename); + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + { + ipa_device_close(wmf_info); + wmf_api_destroy(wmf_info); + ThrowReaderException(FileOpenError,"UnableToCreateTemporaryFile"); + } + eps_info->out=wmf_stream_create(wmf_info,file); + eps_info->bbox=bounding_box; + wmf_status=wmf_play(wmf_info,0,&bounding_box); + if (wmf_status != wmf_E_None) + { + ipa_device_close(wmf_info); + wmf_api_destroy(wmf_info); + ThrowReaderException(DelegateError,"FailedToRenderFile"); + } + (void) fclose(file); + wmf_api_destroy(wmf_info); + (void) CloseBlob(image); + image=DestroyImage(image); + /* + Read EPS image. + */ + read_info=CloneImageInfo(image_info); + SetImageInfoBlob(read_info,(void *) NULL,0); + (void) FormatLocaleString(read_info->filename,MaxTextExtent,"eps:%s", + filename); + image=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (image != (Image *) NULL) + { + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick_filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick,"WMF",MaxTextExtent); + } + (void) RelinquishUniqueFileResource(filename); + return(GetFirstImageInList(image)); +} +#elif defined(MAGICKCORE_WMF_DELEGATE) + +#define ERR(API) ((API)->err != wmf_E_None) +#define XC(x) ((double) x) +#define YC(y) ((double) y) + +#if !defined(M_PI) +# define M_PI MagickPI +#endif + +#if defined(MAGICKCORE_HAVE_FT2BUILD_H) +# include +#endif + +#include "libwmf/fund.h" +#include "libwmf/types.h" +#include "libwmf/api.h" +#undef SRCCOPY +#undef SRCPAINT +#undef SRCAND +#undef SRCINVERT +#undef SRCERASE +#undef NOTSRCCOPY +#undef NOTSRCERASE +#undef MERGECOPY +#undef MERGEPAINT +#undef PATCOPY +#undef PATPAINT +#undef PATINVERT +#undef DSTINVERT +#undef BLACKNESS +#undef WHITENESS + +/* The following additinal undefs were required for MinGW */ +#undef BS_HOLLOW +#undef PS_STYLE_MASK +#undef PS_ENDCAP_ROUND +#undef PS_ENDCAP_SQUARE +#undef PS_ENDCAP_FLAT +#undef PS_ENDCAP_MASK +#undef PS_JOIN_ROUND +#undef PS_JOIN_BEVEL +#undef PS_JOIN_MITER +#undef PS_COSMETIC +#undef PS_GEOMETRIC +#undef PS_TYPE_MASK +#undef STRETCH_ANDSCANS +#undef STRETCH_ORSCANS +#undef STRETCH_DELETESCANS +#undef STRETCH_HALFTONE +#undef ETO_OPAQUE +#undef ETO_CLIPPED +#undef ETO_GLYPH_INDEX +#undef ETO_RTLREADING + +#include "libwmf/defs.h" +#include "libwmf/ipa.h" +#include "libwmf/color.h" +#include "libwmf/macro.h" + +/* Unit conversions */ +#define TWIPS_PER_INCH 1440 +#define CENTIMETERS_PER_INCH 2.54 +#define POINTS_PER_INCH 72 + +#if defined(MAGICKCORE_WMF_DELEGATE) +# define wmf_api_create(api,flags,options) wmf_lite_create(api,flags,options) +# define wmf_api_destroy(api) wmf_lite_destroy(api) +# undef WMF_FONT_PSNAME +# define WMF_FONT_PSNAME(F) ((F)->user_data ? ((wmf_magick_font_t*) (F)->user_data)->ps_name : 0) + +typedef struct _wmf_magick_font_t wmf_magick_font_t; + +struct _wmf_magick_font_t +{ + char* ps_name; + double pointsize; +}; + +#endif + +typedef struct _wmf_magick_t wmf_magick_t; + +struct _wmf_magick_t +{ + /* Bounding box */ + wmfD_Rect + bbox; + + /* Scale and translation factors */ + double + scale_x, + scale_y, + translate_x, + translate_y, + rotate; + + /* Vector output */ + DrawingWand + *draw_wand; + + /* ImageMagick image */ + Image + *image; + + /* ImageInfo */ + const ImageInfo + *image_info; + + /* DrawInfo */ + DrawInfo + *draw_info; + + /* Pattern ID */ + unsigned long + pattern_id; + + /* Clip path flag */ + MagickBooleanType + clipping; + + /* Clip path ID */ + unsigned long + clip_mask_id; + + /* Push depth */ + long + push_depth; +}; + + +#define WMF_MAGICK_GetData(Z) ((wmf_magick_t*)((Z)->device_data)) +#define WMF_MAGICK_GetFontData(Z) \ + ((wmf_magick_font_t*)((wmfFontData *)Z->font_data)->user_data) + +#define WmfDrawingWand (((wmf_magick_t*)((API)->device_data))->draw_wand) + +/* Enum to control whether util_set_brush applies brush to fill or + stroke. */ +typedef enum +{ + BrushApplyFill, + BrushApplyStroke +} BrushApply; + + +/* Enum to specify arc type */ +typedef enum +{ + magick_arc_ellipse = 0, + magick_arc_open, + magick_arc_pie, + magick_arc_chord +} +magick_arc_t; + +#if defined(MAGICKCORE_WMF_DELEGATE) +static void lite_font_init (wmfAPI* API, wmfAPI_Options* options); +static void lite_font_map(wmfAPI* API,wmfFont* font); +static float lite_font_stringwidth(wmfAPI* API, wmfFont* font, char* str); +#endif + +static void draw_fill_color_rgb(wmfAPI* API, const wmfRGB* rgb); +static void draw_stroke_color_rgb(wmfAPI* API, const wmfRGB* rgb); +static void draw_pattern_push(wmfAPI* API, unsigned long id, unsigned long columns, unsigned long rows); +static int ipa_blob_read(void* wand); +static int ipa_blob_seek(void* wand,long position); +static long ipa_blob_tell(void* wand); +static void ipa_bmp_draw(wmfAPI * API, wmfBMP_Draw_t * bmp_draw); +static void ipa_bmp_free(wmfAPI * API, wmfBMP * bmp); +static void ipa_bmp_read(wmfAPI * API, wmfBMP_Read_t * bmp_read); +static void ipa_device_begin(wmfAPI * API); +static void ipa_device_close(wmfAPI * API); +static void ipa_device_end(wmfAPI * API); +static void ipa_device_open(wmfAPI * API); +static void ipa_draw_arc(wmfAPI * API, wmfDrawArc_t * draw_arc); +static void ipa_draw_chord(wmfAPI * API, wmfDrawArc_t * draw_arc); +static void ipa_draw_ellipse(wmfAPI * API, wmfDrawArc_t * draw_arc); +static void ipa_draw_line(wmfAPI * API, wmfDrawLine_t * draw_line); +static void ipa_draw_pie(wmfAPI * API, wmfDrawArc_t * draw_arc); +static void ipa_draw_pixel(wmfAPI * API, wmfDrawPixel_t * draw_pixel); +static void ipa_draw_polygon(wmfAPI * API, wmfPolyLine_t * poly_line); +#if defined(MAGICKCORE_WMF_DELEGATE) +static void ipa_draw_polypolygon(wmfAPI * API, wmfPolyPoly_t* polypolygon); +#endif +static void ipa_draw_rectangle(wmfAPI * API, wmfDrawRectangle_t * draw_rect); +static void ipa_draw_text(wmfAPI * API, wmfDrawText_t * draw_text); +static void ipa_flood_exterior(wmfAPI * API, wmfFlood_t * flood); +static void ipa_flood_interior(wmfAPI * API, wmfFlood_t * flood); +static void ipa_functions(wmfAPI * API); +static void ipa_poly_line(wmfAPI * API, wmfPolyLine_t * poly_line); +static void ipa_region_clip(wmfAPI * API, wmfPolyRectangle_t * poly_rect); +static void ipa_region_frame(wmfAPI * API, wmfPolyRectangle_t * poly_rect); +static void ipa_region_paint(wmfAPI * API, wmfPolyRectangle_t * poly_rect); +static void ipa_rop_draw(wmfAPI * API, wmfROP_Draw_t * rop_draw); +static void ipa_udata_copy(wmfAPI * API, wmfUserData_t * userdata); +static void ipa_udata_free(wmfAPI * API, wmfUserData_t * userdata); +static void ipa_udata_init(wmfAPI * API, wmfUserData_t * userdata); +static void ipa_udata_set(wmfAPI * API, wmfUserData_t * userdata); +static int magick_progress_callback(void* wand,float quantum); +static void util_draw_arc(wmfAPI * API, wmfDrawArc_t * draw_arc,magick_arc_t finish); +static double util_pointsize( wmfAPI* API, wmfFont* font, char* str, double font_height); +static void util_set_brush(wmfAPI * API, wmfDC * dc, const BrushApply brush_apply); +static void util_set_pen(wmfAPI * API, wmfDC * dc); + +/* Progress callback */ +int magick_progress_callback(void *context,float quantum) +{ + Image + *image; + + MagickBooleanType + status; + + image=(Image *) context; + assert(image->signature == MagickCoreSignature); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + return(status != MagickFalse ? 0 : 1); +} + +/* Set fill color */ +static void draw_fill_color_string(DrawingWand *drawing_wand,const char *color) +{ + PixelWand + *fill_color; + + fill_color=NewPixelWand(); + PixelSetColor(fill_color,color); + DrawSetFillColor(drawing_wand,fill_color); + fill_color=DestroyPixelWand(fill_color); +} +static void draw_fill_color_rgb( wmfAPI* API, const wmfRGB* rgb ) +{ + PixelWand + *fill_color; + + fill_color=NewPixelWand(); + PixelSetRedQuantum(fill_color,ScaleCharToQuantum(rgb->r)); + PixelSetGreenQuantum(fill_color,ScaleCharToQuantum(rgb->g)); + PixelSetBlueQuantum(fill_color,ScaleCharToQuantum(rgb->b)); + PixelSetOpacityQuantum(fill_color,OpaqueOpacity); + DrawSetFillColor(WmfDrawingWand,fill_color); + fill_color=DestroyPixelWand(fill_color); +} + +/* Set stroke color */ +static void draw_stroke_color_string(DrawingWand *drawing_wand,const char *color) +{ + PixelWand + *stroke_color; + + stroke_color=NewPixelWand(); + PixelSetColor(stroke_color,color); + DrawSetStrokeColor(drawing_wand,stroke_color); + stroke_color=DestroyPixelWand(stroke_color); +} + +static void draw_stroke_color_rgb( wmfAPI* API, const wmfRGB* rgb ) +{ + PixelWand + *stroke_color; + + stroke_color=NewPixelWand(); + PixelSetRedQuantum(stroke_color,ScaleCharToQuantum(rgb->r)); + PixelSetGreenQuantum(stroke_color,ScaleCharToQuantum(rgb->g)); + PixelSetBlueQuantum(stroke_color,ScaleCharToQuantum(rgb->b)); + PixelSetOpacityQuantum(stroke_color,OpaqueOpacity); + DrawSetStrokeColor(WmfDrawingWand,stroke_color); + stroke_color=DestroyPixelWand(stroke_color); +} + +/* Set under color */ +static void draw_under_color_string(DrawingWand *drawing_wand,const char *color) +{ + PixelWand + *under_color; + + under_color=NewPixelWand(); + PixelSetColor(under_color,color); + DrawSetTextUnderColor(drawing_wand,under_color); + under_color=DestroyPixelWand(under_color); +} + +static void draw_pattern_push( wmfAPI* API, + unsigned long id, + unsigned long columns, + unsigned long rows ) +{ + char + pattern_id[MaxTextExtent]; + + (void) FormatLocaleString(pattern_id,MaxTextExtent,"brush_%lu",id); + (void) DrawPushPattern(WmfDrawingWand,pattern_id,0,0,columns,rows); +} + +/* Pattern/Bit BLT with raster operation (ROP) support. Invoked by + META_PATBLT, which is equivalent to Windows PatBlt() call, or by + META_DIBBITBLT which is equivalent to Windows BitBlt() call. */ + +/* The BitBlt function transfers pixels from a rectangular area in one + device wand called the 'source', to a rectangular area of the + same size in another device wand, called the 'destination'. */ + +static void ipa_rop_draw(wmfAPI * API, wmfROP_Draw_t * rop_draw) +{ +/* wmfBrush */ +/* *brush = WMF_DC_BRUSH(rop_draw->dc); */ + +/* wmfBMP */ +/* *brush_bmp = WMF_BRUSH_BITMAP(brush); */ + + if (TO_FILL(rop_draw) == 0) + return; + + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + /* FIXME: finish implementing (once we know what it is supposed to do!) */ + + /* + struct _wmfROP_Draw_t + { wmfDC* dc; + + wmfD_Coord TL; + wmfD_Coord BR; + + U32 ROP; + + double pixel_width; + double pixel_height; + }; + */ + +/* if (brush_bmp && brush_bmp->data != 0) */ +/* printf("Have an image!\n"); */ + + switch (rop_draw->ROP) /* Ternary raster operations */ + { + case SRCCOPY: /* dest = source */ + printf("ipa_rop_draw SRCCOPY ROP mode not implemented\n"); + break; + case SRCPAINT: /* dest = source OR dest */ + printf("ipa_rop_draw SRCPAINT ROP mode not implemented\n"); + break; + case SRCAND: /* dest = source AND dest */ + printf("ipa_rop_draw SRCAND ROP mode not implemented\n"); + break; + case SRCINVERT: /* dest = source XOR dest */ + printf("ipa_rop_draw SRCINVERT ROP mode not implemented\n"); + break; + case SRCERASE: /* dest = source AND (NOT dest) */ + printf("ipa_rop_draw SRCERASE ROP mode not implemented\n"); + break; + case NOTSRCCOPY: /* dest = (NOT source) */ + printf("ipa_rop_draw NOTSRCCOPY ROP mode not implemented\n"); + break; + case NOTSRCERASE: /* dest = (NOT src) AND (NOT dest) */ + printf("ipa_rop_draw NOTSRCERASE ROP mode not implemented\n"); + break; + case MERGECOPY: /* dest = (source AND pattern) */ + printf("ipa_rop_draw MERGECOPY ROP mode not implemented\n"); + break; + case MERGEPAINT: /* dest = (NOT source) OR dest */ + printf("ipa_rop_draw MERGEPAINT ROP mode not implemented\n"); + break; + case PATCOPY: /* dest = pattern */ + util_set_brush(API, rop_draw->dc, BrushApplyFill); + break; + case PATPAINT: /* dest = DPSnoo */ + printf("ipa_rop_draw PATPAINT ROP mode not implemented\n"); + break; + case PATINVERT: /* dest = pattern XOR dest */ + printf("ipa_rop_draw PATINVERT ROP mode not implemented\n"); + break; + case DSTINVERT: /* dest = (NOT dest) */ + printf("ipa_rop_draw DSTINVERT ROP mode not implemented\n"); + break; + case BLACKNESS: /* dest = BLACK */ + draw_fill_color_string(WmfDrawingWand,"black"); + break; + case WHITENESS: /* dest = WHITE */ + draw_fill_color_string(WmfDrawingWand,"white"); + break; + default: + printf("ipa_rop_draw 0x%x ROP mode not implemented\n", rop_draw->ROP); + break; + } + + DrawRectangle(WmfDrawingWand, + XC(rop_draw->TL.x), YC(rop_draw->TL.y), + XC(rop_draw->BR.x), YC(rop_draw->BR.y)); + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); +} + +static void ipa_bmp_draw(wmfAPI *API, wmfBMP_Draw_t *bmp_draw) +{ + wmf_magick_t + *ddata = WMF_MAGICK_GetData(API); + + ExceptionInfo + *exception; + + Image + *image; + + MagickWand + *magick_wand; + + MagickRealType + height, + width; + + PixelPacket + white; + + if (bmp_draw->bmp.data == 0) + return; + + exception=AcquireExceptionInfo(); + image = (Image*)bmp_draw->bmp.data; + if (!image) + { + InheritException(&ddata->image->exception,exception); + (void) DestroyExceptionInfo(exception); + return; + } + + if (bmp_draw->crop.x || bmp_draw->crop.y || + (bmp_draw->crop.w != bmp_draw->bmp.width) || + (bmp_draw->crop.h != bmp_draw->bmp.height)) + { + /* Image needs to be cropped */ + Image + *crop_image; + + RectangleInfo + crop_info; + + crop_info.x = bmp_draw->crop.x; + crop_info.y = bmp_draw->crop.y; + crop_info.width = bmp_draw->crop.w; + crop_info.height = bmp_draw->crop.h; + + crop_image = CropImage( image, &crop_info, exception ); + if (crop_image) + { + image=DestroyImageList(image); + image = crop_image; + bmp_draw->bmp.data = (void*)image; + } + else + InheritException(&ddata->image->exception,exception); + } + + QueryColorDatabase( "white", &white, exception ); + + if ( ddata->image_info->texture || + !(IsColorEqual(&ddata->image_info->background_color,&white)) || + ddata->image_info->background_color.opacity != OpaqueOpacity ) + { + MagickPixelPacket + white; + + /* + Set image white background to transparent so that it may be + overlaid over non-white backgrounds. + */ + QueryMagickColor( "white", &white, exception ); + TransparentPaintImage( image, &white, QuantumRange, MagickFalse ); + } + (void) DestroyExceptionInfo(exception); + + width = fabs(bmp_draw->pixel_width * (double) bmp_draw->crop.w); + height = fabs(bmp_draw->pixel_height * (double) bmp_draw->crop.h); + magick_wand=NewMagickWandFromImage(image); + (void) DrawComposite(WmfDrawingWand, CopyCompositeOp, + XC(bmp_draw->pt.x) * ddata->scale_x, YC(bmp_draw->pt.y) * ddata->scale_y, + width * ddata->scale_x, height * ddata->scale_y, magick_wand); + magick_wand=DestroyMagickWand(magick_wand); + +#if 0 + printf("bmp_draw->bmp.data = 0x%lx\n", (long)bmp_draw->bmp.data); + printf("registry id = %li\n", id); + /* printf("pixel_width = %g\n", bmp_draw->pixel_width); */ + /* printf("pixel_height = %g\n", bmp_draw->pixel_height); */ + printf("bmp_draw->bmp WxH = %ix%i\n", bmp_draw->bmp.width, bmp_draw->bmp.height); + printf("bmp_draw->crop WxH = %ix%i\n", bmp_draw->crop.w, bmp_draw->crop.h); + printf("bmp_draw->crop x,y = %i,%i\n", bmp_draw->crop.x, bmp_draw->crop.y); + printf("image size WxH = %lux%lu\n", image->columns, image->rows); +#endif +} + +static void ipa_bmp_read(wmfAPI * API, wmfBMP_Read_t * bmp_read) { + wmf_magick_t + *ddata = WMF_MAGICK_GetData(API); + + ExceptionInfo + *exception; + + Image + *image; + + ImageInfo + *image_info; + + bmp_read->bmp.data = 0; + + exception=AcquireExceptionInfo(); + + image_info=CloneImageInfo((ImageInfo *) 0); + (void) CopyMagickString(image_info->magick,"DIB",MaxTextExtent); + if (bmp_read->width || bmp_read->height) + { + char + size[MaxTextExtent]; + + (void) FormatLocaleString(size,MaxTextExtent,"%ux%u",bmp_read->width, + bmp_read->height); + CloneString(&image_info->size,size); + } +#if 0 + printf("ipa_bmp_read: buffer=0x%lx length=%ld, width=%i, height=%i\n", + (long) bmp_read->buffer, bmp_read->length, + bmp_read->width, bmp_read->height); +#endif + image=BlobToImage(image_info, (const void *) bmp_read->buffer, + bmp_read->length, exception); + image_info=DestroyImageInfo(image_info); + if (image == (Image *) NULL) + { + char + description[MaxTextExtent]; + + (void) FormatLocaleString(description,MaxTextExtent, + "packed DIB at offset %ld",bmp_read->offset); + (void) ThrowMagickException(&ddata->image->exception,GetMagickModule(), + CorruptImageError,exception->reason,"`%s'",exception->description); + } + else + { +#if 0 + printf("ipa_bmp_read: rows=%ld,columns=%ld\n\n", image->rows, image->columns); +#endif + + bmp_read->bmp.data = (void*)image; + bmp_read->bmp.width = (U16)image->columns; + bmp_read->bmp.height = (U16)image->rows; + } + (void) DestroyExceptionInfo(exception); +} + +static void ipa_bmp_free(wmfAPI * API, wmfBMP * bmp) +{ + (void) API; + DestroyImageList((Image*)bmp->data); + bmp->data = (void*) 0; + bmp->width = (U16) 0; + bmp->height = (U16) 0; +} + +/* + This called by wmf_play() the *first* time the meta file is played + */ +static void ipa_device_open(wmfAPI * API) +{ + wmf_magick_t + *ddata = WMF_MAGICK_GetData (API); + + ddata->pattern_id = 0; + ddata->clipping = MagickFalse; + ddata->clip_mask_id = 0; + + ddata->push_depth = 0; + + ddata->draw_wand = AcquireDrawingWand(ddata->draw_info,ddata->image); +} + +/* + This called by wmf_api_destroy() + */ +static void ipa_device_close(wmfAPI * API) +{ + wmf_magick_t + *ddata = WMF_MAGICK_GetData(API); + + if (ddata->draw_wand != (DrawingWand *) NULL) + { + DestroyDrawingWand(ddata->draw_wand); + ddata->draw_wand=(DrawingWand *) NULL; + } + if (ddata->draw_info != (DrawInfo *) NULL) + { + DestroyDrawInfo(ddata->draw_info); + ddata->draw_info=(DrawInfo *)NULL; + } + if (WMF_MAGICK_GetFontData(API)->ps_name) + WMF_MAGICK_GetFontData(API)->ps_name=(char *) RelinquishMagickMemory( + WMF_MAGICK_GetFontData(API)->ps_name); +} + +/* + This called from the beginning of each play for initial page setup + */ +static void ipa_device_begin(wmfAPI * API) +{ + char + comment[MaxTextExtent]; + + wmf_magick_t + *ddata = WMF_MAGICK_GetData(API); + + /* Make SVG output happy */ + (void) PushDrawingWand(WmfDrawingWand); + + DrawSetViewbox(WmfDrawingWand, 0, 0, ddata->image->columns, ddata->image->rows ); + + (void) FormatLocaleString(comment,MagickPathExtent,"Created by %s", + GetMagickVersion((size_t *) NULL)); + DrawComment(WmfDrawingWand,comment); + + /* Scale width and height to image */ + DrawScale(WmfDrawingWand, ddata->scale_x, ddata->scale_y); + + /* Translate to TL corner of bounding box */ + DrawTranslate(WmfDrawingWand, ddata->translate_x, ddata->translate_y); + + /* Apply rotation */ + DrawRotate(WmfDrawingWand, ddata->rotate); + + if (ddata->image_info->texture == NULL) + { + PixelWand + *background_color; + + /* Draw rectangle in background color */ + background_color=NewPixelWand(); + PixelSetQuantumColor(background_color,&ddata->image->background_color); + DrawSetFillColor(WmfDrawingWand,background_color); + background_color=DestroyPixelWand(background_color); + DrawRectangle(WmfDrawingWand, + XC(ddata->bbox.TL.x),YC(ddata->bbox.TL.y), + XC(ddata->bbox.BR.x),YC(ddata->bbox.BR.y)); + } + else + { + /* Draw rectangle with texture image the SVG way */ + Image + *image; + + ImageInfo + *image_info; + + ExceptionInfo + *exception; + + exception=AcquireExceptionInfo(); + + image_info = CloneImageInfo((ImageInfo *) 0); + (void) CopyMagickString(image_info->filename,ddata->image_info->texture, + MaxTextExtent); + if ( ddata->image_info->size ) + CloneString(&image_info->size,ddata->image_info->size); + + image = ReadImage(image_info,exception); + image_info=DestroyImageInfo(image_info); + if (image) + { + char + pattern_id[MaxTextExtent]; + + MagickWand + *magick_wand; + + (void) CopyMagickString(image->magick,"MIFF",MaxTextExtent); + DrawPushDefs(WmfDrawingWand); + draw_pattern_push(API,ddata->pattern_id,image->columns,image->rows); + magick_wand=NewMagickWandFromImage(image); + (void) DrawComposite(WmfDrawingWand,CopyCompositeOp,0,0, + image->columns,image->rows,magick_wand); + magick_wand=DestroyMagickWand(magick_wand); + (void) DrawPopPattern(WmfDrawingWand); + DrawPopDefs(WmfDrawingWand); + (void) FormatLocaleString(pattern_id,MaxTextExtent,"#brush_%lu", + ddata->pattern_id); + (void) DrawSetFillPatternURL(WmfDrawingWand,pattern_id); + ++ddata->pattern_id; + + DrawRectangle(WmfDrawingWand, + XC(ddata->bbox.TL.x),YC(ddata->bbox.TL.y), + XC(ddata->bbox.BR.x),YC(ddata->bbox.BR.y)); + image=DestroyImageList(image); + } + else + { + LogMagickEvent(CoderEvent,GetMagickModule(), + "reading texture image failed!"); + InheritException(&ddata->image->exception,exception); + } + (void) DestroyExceptionInfo(exception); + } + + DrawSetClipRule(WmfDrawingWand,EvenOddRule); /* Default for WMF is ALTERNATE polygon fill mode */ + draw_fill_color_string(WmfDrawingWand,"none"); /* Default brush is WHITE_BRUSH */ + draw_stroke_color_string(WmfDrawingWand,"none"); /* Default pen is BLACK_PEN */ + DrawSetStrokeLineCap(WmfDrawingWand,ButtCap); /* Default linecap is PS_ENDCAP_FLAT */ + DrawSetStrokeLineJoin(WmfDrawingWand,MiterJoin); /* Default linejoin is PS_JOIN_MITER */ + draw_under_color_string(WmfDrawingWand,"white"); /* Default text box is white */ +} + +/* + This called from the end of each play for page termination + */ +static void ipa_device_end(wmfAPI * API) +{ + wmf_magick_t + *ddata = WMF_MAGICK_GetData(API); + + /* Reset any existing clip paths by popping wand */ + if (ddata->clipping) + (void) PopDrawingWand(WmfDrawingWand); + ddata->clipping = MagickFalse; + + /* Make SVG output happy */ + (void) PopDrawingWand(WmfDrawingWand); +} + +static void ipa_flood_interior(wmfAPI * API, wmfFlood_t * flood) +{ + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + draw_fill_color_rgb(API,&(flood->color)); + + DrawColor(WmfDrawingWand,XC(flood->pt.x), YC(flood->pt.y), + FillToBorderMethod); + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); +} + +static void ipa_flood_exterior(wmfAPI * API, wmfFlood_t * flood) +{ + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + draw_fill_color_rgb(API,&(flood->color)); + + if (flood->type == FLOODFILLSURFACE) + DrawColor(WmfDrawingWand, XC(flood->pt.x), YC(flood->pt.y), + FloodfillMethod); + else + DrawColor(WmfDrawingWand, XC(flood->pt.x), YC(flood->pt.y), + FillToBorderMethod); + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); +} + +static void ipa_draw_pixel(wmfAPI * API, wmfDrawPixel_t * draw_pixel) +{ + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + draw_stroke_color_string(WmfDrawingWand,"none"); + + draw_fill_color_rgb(API,&(draw_pixel->color)); + + DrawRectangle(WmfDrawingWand, + XC(draw_pixel->pt.x), + YC(draw_pixel->pt.y), + XC(draw_pixel->pt.x + draw_pixel->pixel_width), + YC(draw_pixel->pt.y + draw_pixel->pixel_height)); + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); +} + +static void ipa_draw_pie(wmfAPI * API, wmfDrawArc_t * draw_arc) +{ + util_draw_arc(API, draw_arc, magick_arc_pie); +} + +static void ipa_draw_chord(wmfAPI * API, wmfDrawArc_t * draw_arc) +{ + util_draw_arc(API, draw_arc, magick_arc_chord); +} + +static void ipa_draw_arc(wmfAPI * API, wmfDrawArc_t * draw_arc) +{ + util_draw_arc(API, draw_arc, magick_arc_open); +} + +static void ipa_draw_ellipse(wmfAPI * API, wmfDrawArc_t * draw_arc) +{ + util_draw_arc(API, draw_arc, magick_arc_ellipse); +} + +static void util_draw_arc(wmfAPI * API, + wmfDrawArc_t * draw_arc, magick_arc_t finish) +{ + wmfD_Coord + BR, + O, + TL, + center, + end, + start; + + double + phi_e = 360, + phi_s = 0; + + double + Rx, + Ry; + + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + if (TO_FILL(draw_arc) || TO_DRAW(draw_arc)) + { + center.x = (draw_arc->TL.x + draw_arc->BR.x) / 2; + center.y = (draw_arc->TL.y + draw_arc->BR.y) / 2; + start = center; + end = center; + + if (finish != magick_arc_ellipse) + { + draw_arc->start.x += center.x; + draw_arc->start.y += center.y; + + draw_arc->end.x += center.x; + draw_arc->end.y += center.y; + } + + TL = draw_arc->TL; + BR = draw_arc->BR; + + O = center; + + if (finish != magick_arc_ellipse) + { + start = draw_arc->start; + end = draw_arc->end; + } + + Rx = (BR.x - TL.x) / 2; + Ry = (BR.y - TL.y) / 2; + + if (finish != magick_arc_ellipse) + { + start.x -= O.x; + start.y -= O.y; + + end.x -= O.x; + end.y -= O.y; + + phi_s = atan2((double) start.y, (double) start.x) * 180 / MagickPI; + phi_e = atan2((double) end.y, (double) end.x) * 180 / MagickPI; + + if (phi_e <= phi_s) + phi_e += 360; + } + + util_set_pen(API, draw_arc->dc); + if (finish == magick_arc_open) + draw_fill_color_string(WmfDrawingWand,"none"); + else + util_set_brush(API, draw_arc->dc, BrushApplyFill); + + if (finish == magick_arc_ellipse) + DrawEllipse(WmfDrawingWand, XC(O.x), YC(O.y), Rx, Ry, 0, 360); + else if (finish == magick_arc_pie) + { + DrawPathStart(WmfDrawingWand); + DrawPathMoveToAbsolute(WmfDrawingWand, XC(O.x+start.x), + YC(O.y+start.y)); + DrawPathEllipticArcAbsolute(WmfDrawingWand, Rx, Ry, 0, MagickFalse, + MagickTrue, XC(O.x+end.x), YC(O.y+end.y)); + DrawPathLineToAbsolute(WmfDrawingWand, XC(O.x), YC(O.y)); + DrawPathClose(WmfDrawingWand); + DrawPathFinish(WmfDrawingWand); + } + else if (finish == magick_arc_chord) + { + DrawArc(WmfDrawingWand, XC(draw_arc->TL.x), YC(draw_arc->TL.y), + XC(draw_arc->BR.x), XC(draw_arc->BR.y), phi_s, phi_e); + DrawLine(WmfDrawingWand, XC(draw_arc->BR.x-start.x), + YC(draw_arc->BR.y-start.y), XC(draw_arc->BR.x-end.x), + YC(draw_arc->BR.y-end.y)); + } + else /* if (finish == magick_arc_open) */ + DrawArc(WmfDrawingWand, XC(draw_arc->TL.x), YC(draw_arc->TL.y), + XC(draw_arc->BR.x), XC(draw_arc->BR.y), phi_s, phi_e); + } + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); +} + +static void ipa_draw_line(wmfAPI * API, wmfDrawLine_t * draw_line) +{ + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + if (TO_DRAW(draw_line)) + { + util_set_pen(API, draw_line->dc); + DrawLine(WmfDrawingWand, + XC(draw_line->from.x), YC(draw_line->from.y), + XC(draw_line->to.x), YC(draw_line->to.y)); + } + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); +} + +static void ipa_poly_line(wmfAPI * API, wmfPolyLine_t * polyline) +{ + if (polyline->count <= 2) + return; + + if (TO_DRAW(polyline)) + { + int + point; + + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + util_set_pen(API, polyline->dc); + + DrawPathStart(WmfDrawingWand); + DrawPathMoveToAbsolute(WmfDrawingWand, + XC(polyline->pt[0].x), + YC(polyline->pt[0].y)); + for (point = 1; point < polyline->count; point++) + { + DrawPathLineToAbsolute(WmfDrawingWand, + XC(polyline->pt[point].x), + YC(polyline->pt[point].y)); + } + DrawPathFinish(WmfDrawingWand); + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); + } +} + +static void ipa_draw_polygon(wmfAPI * API, wmfPolyLine_t * polyline) +{ + if (polyline->count <= 2) + return; + + if (TO_FILL(polyline) || TO_DRAW(polyline)) + { + int + point; + + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + util_set_pen(API, polyline->dc); + util_set_brush(API, polyline->dc, BrushApplyFill); + + DrawPathStart(WmfDrawingWand); + DrawPathMoveToAbsolute(WmfDrawingWand, + XC(polyline->pt[0].x), + YC(polyline->pt[0].y)); + for (point = 1; point < polyline->count; point++) + { + DrawPathLineToAbsolute(WmfDrawingWand, + XC(polyline->pt[point].x), + YC(polyline->pt[point].y)); + } + DrawPathClose(WmfDrawingWand); + DrawPathFinish(WmfDrawingWand); + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); + } +} + +/* Draw a polypolygon. A polypolygon is a list of polygons */ +#if defined(MAGICKCORE_WMF_DELEGATE) +static void ipa_draw_polypolygon(wmfAPI * API, wmfPolyPoly_t* polypolygon) +{ + if (TO_FILL(polypolygon) || TO_DRAW(polypolygon)) + { + int + polygon, + point; + + wmfPolyLine_t + polyline; + + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + util_set_pen(API, polypolygon->dc); + util_set_brush(API, polypolygon->dc, BrushApplyFill); + + DrawPathStart(WmfDrawingWand); + for (polygon = 0; polygon < polypolygon->npoly; polygon++) + { + polyline.dc = polypolygon->dc; + polyline.pt = polypolygon->pt[polygon]; + polyline.count = polypolygon->count[polygon]; + if ((polyline.count > 2) && polyline.pt) + { + DrawPathMoveToAbsolute(WmfDrawingWand, + XC(polyline.pt[0].x), + YC(polyline.pt[0].y)); + for (point = 1; point < polyline.count; point++) + { + DrawPathLineToAbsolute(WmfDrawingWand, + XC(polyline.pt[point].x), + YC(polyline.pt[point].y)); + } + DrawPathClose(WmfDrawingWand); + } + } + DrawPathFinish(WmfDrawingWand); + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); + } +} +#endif + +static void ipa_draw_rectangle(wmfAPI * API, wmfDrawRectangle_t * draw_rect) +{ + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + if (TO_FILL(draw_rect) || TO_DRAW(draw_rect)) + { + util_set_pen(API, draw_rect->dc); + util_set_brush(API, draw_rect->dc, BrushApplyFill); + + if ((draw_rect->width > 0) || (draw_rect->height > 0)) + DrawRoundRectangle(WmfDrawingWand, + XC(draw_rect->TL.x), YC(draw_rect->TL.y), + XC(draw_rect->BR.x), YC(draw_rect->BR.y), + draw_rect->width / 2, draw_rect->height / 2); + else + DrawRectangle(WmfDrawingWand, + XC(draw_rect->TL.x), YC(draw_rect->TL.y), + XC(draw_rect->BR.x), YC(draw_rect->BR.y)); + } + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); +} + +/* Draw an un-filled rectangle using the current brush */ +static void ipa_region_frame(wmfAPI * API, wmfPolyRectangle_t * poly_rect) +{ + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + if (TO_FILL(poly_rect) || TO_DRAW(poly_rect)) + { + long + i; + + draw_fill_color_string(WmfDrawingWand,"none"); + util_set_brush(API, poly_rect->dc, BrushApplyStroke); + + for (i = 0; i < (long) poly_rect->count; i++) + { + DrawRectangle(WmfDrawingWand, + XC(poly_rect->TL[i].x), YC(poly_rect->TL[i].y), + XC(poly_rect->BR[i].x), YC(poly_rect->BR[i].y)); + } + } + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); +} + +static void ipa_region_paint(wmfAPI * API, wmfPolyRectangle_t * poly_rect) +{ + + if (poly_rect->count == 0) + return; + + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + + if (TO_FILL (poly_rect)) + { + long + i; + + draw_stroke_color_string(WmfDrawingWand,"none"); + util_set_brush(API, poly_rect->dc, BrushApplyFill); + + for (i = 0; i < (long) poly_rect->count; i++) + { + DrawRectangle(WmfDrawingWand, + XC(poly_rect->TL[i].x), YC(poly_rect->TL[i].y), + XC(poly_rect->BR[i].x), YC(poly_rect->BR[i].y)); + } + } + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); +} + +static void ipa_region_clip(wmfAPI *API, wmfPolyRectangle_t *poly_rect) +{ + long + i; + + wmf_magick_t + *ddata = WMF_MAGICK_GetData (API); + + /* Reset any existing clip paths by popping wand */ + if (ddata->clipping) + (void) PopDrawingWand(WmfDrawingWand); + ddata->clipping = MagickFalse; + + if (poly_rect->count > 0) + { + char + clip_mask_id[MaxTextExtent]; + + /* Define clip path */ + ddata->clip_mask_id++; + DrawPushDefs(WmfDrawingWand); + (void) FormatLocaleString(clip_mask_id,MaxTextExtent,"clip_%lu", + ddata->clip_mask_id); + DrawPushClipPath(WmfDrawingWand,clip_mask_id); + (void) PushDrawingWand(WmfDrawingWand); + for (i = 0; i < (long) poly_rect->count; i++) + { + DrawRectangle(WmfDrawingWand, + XC(poly_rect->TL[i].x), YC(poly_rect->TL[i].y), + XC(poly_rect->BR[i].x), YC(poly_rect->BR[i].y)); + } + (void) PopDrawingWand(WmfDrawingWand); + DrawPopClipPath(WmfDrawingWand); + DrawPopDefs(WmfDrawingWand); + + /* Push wand for new clip paths */ + (void) PushDrawingWand(WmfDrawingWand); + (void) DrawSetClipPath(WmfDrawingWand,clip_mask_id); + ddata->clipping = MagickTrue; + } +} + +static void ipa_functions(wmfAPI *API) +{ + wmf_magick_t + *ddata = 0; + + wmfFunctionReference + *FR = (wmfFunctionReference *) API->function_reference; + + /* + IPA function reference links + */ + FR->device_open = ipa_device_open; + FR->device_close = ipa_device_close; + FR->device_begin = ipa_device_begin; + FR->device_end = ipa_device_end; + FR->flood_interior = ipa_flood_interior; + FR->flood_exterior = ipa_flood_exterior; + FR->draw_pixel = ipa_draw_pixel; + FR->draw_pie = ipa_draw_pie; + FR->draw_chord = ipa_draw_chord; + FR->draw_arc = ipa_draw_arc; + FR->draw_ellipse = ipa_draw_ellipse; + FR->draw_line = ipa_draw_line; + FR->poly_line = ipa_poly_line; + FR->draw_polygon = ipa_draw_polygon; +#if defined(MAGICKCORE_WMF_DELEGATE) + FR->draw_polypolygon = ipa_draw_polypolygon; +#endif + FR->draw_rectangle = ipa_draw_rectangle; + FR->rop_draw = ipa_rop_draw; + FR->bmp_draw = ipa_bmp_draw; + FR->bmp_read = ipa_bmp_read; + FR->bmp_free = ipa_bmp_free; + FR->draw_text = ipa_draw_text; + FR->udata_init = ipa_udata_init; + FR->udata_copy = ipa_udata_copy; + FR->udata_set = ipa_udata_set; + FR->udata_free = ipa_udata_free; + FR->region_frame = ipa_region_frame; + FR->region_paint = ipa_region_paint; + FR->region_clip = ipa_region_clip; + + /* + Allocate device data structure + */ + ddata = (wmf_magick_t *) wmf_malloc(API, sizeof(wmf_magick_t)); + if (ERR(API)) + return; + + (void) memset((void *) ddata, 0, sizeof(wmf_magick_t)); + API->device_data = (void *) ddata; + + /* + Device data defaults + */ + ddata->image = 0; +} + +static void ipa_draw_text(wmfAPI * API, wmfDrawText_t * draw_text) +{ + double + angle = 0, /* text rotation angle */ + pointsize = 0; /* pointsize to output font with desired height */ + + TypeMetric + metrics; + +#if !defined(MAGICKCORE_WMF_DELEGATE) + double + bbox_height, /* bounding box height */ + bbox_width; /* bounding box width */ + + wmfD_Coord + BL, /* bottom left of bounding box */ + BR, /* bottom right of bounding box */ + TL, /* top left of bounding box */ + TR; /* top right of bounding box */ +#endif + + wmfD_Coord + point; /* text placement point */ + + wmfFont + *font; + + wmf_magick_t + * ddata = WMF_MAGICK_GetData(API); + + point = draw_text->pt; + + /* Choose bounding box and calculate its width and height */ +#if !defined(MAGICKCORE_WMF_DELEGATE) + { + double dx, + dy; + + if ( draw_text->flags) + { + TL = draw_text->TL; + BR = draw_text->BR; + TR.x = draw_text->BR.x; + TR.y = draw_text->TL.y; + BL.x = draw_text->TL.x; + BL.y = draw_text->BR.y; + } + else + { + TL = draw_text->bbox.TL; + BR = draw_text->bbox.BR; + TR = draw_text->bbox.TR; + BL = draw_text->bbox.BL; + } + dx = ((TR.x - TL.x) + (BR.x - BL.x)) / 2; + dy = ((TR.y - TL.y) + (BR.y - BL.y)) / 2; + bbox_width = hypot(dx,dy); + dx = ((BL.x - TL.x) + (BR.x - TR.x)) / 2; + dy = ((BL.y - TL.y) + (BR.y - TR.y)) / 2; + bbox_height = hypot(dx,dy); + } +#endif + + font = WMF_DC_FONT(draw_text->dc); + + /* Convert font_height to equivalent pointsize */ + pointsize = util_pointsize( API, font, draw_text->str, draw_text->font_height); + + /* Save graphic wand */ + (void) PushDrawingWand(WmfDrawingWand); + +#if 0 + printf("\nipa_draw_text\n"); + printf("Text = \"%s\"\n", draw_text->str); + /* printf("WMF_FONT_NAME: = \"%s\"\n", WMF_FONT_NAME(font)); */ + printf("WMF_FONT_PSNAME: = \"%s\"\n", WMF_FONT_PSNAME(font)); + printf("Bounding box TL=%g,%g BR=%g,%g\n", + TL.x, TL.y, BR.x, BR.y ); + /* printf("Text box = %gx%g\n", bbox_width, bbox_height); */ + /* printf("WMF_FONT_HEIGHT = %i\n", (int)WMF_FONT_HEIGHT(font)); */ + printf("Pointsize = %g\n", pointsize); + fflush(stdout); +#endif + + /* + * Obtain font metrics if required + * + */ + if ((WMF_DC_TEXTALIGN(draw_text->dc) & TA_CENTER) || + (WMF_TEXT_UNDERLINE(font)) || (WMF_TEXT_STRIKEOUT(font))) + { + Image + *image = ddata->image; + + DrawInfo + *draw_info; + + draw_info=ddata->draw_info; + draw_info->font=WMF_FONT_PSNAME(font); + draw_info->pointsize = pointsize; + draw_info->text=draw_text->str; + + if (GetTypeMetrics(image, draw_info, &metrics) != MagickFalse) + { + /* Center the text if it is not yet centered and should be */ + if ((WMF_DC_TEXTALIGN(draw_text->dc) & TA_CENTER)) + { + double + text_width = metrics.width * (ddata->scale_y / ddata->scale_x); + +#if defined(MAGICKCORE_WMF_DELEGATE) + point.x -= text_width / 2; +#else + point.x += bbox_width / 2 - text_width / 2; +#endif + } + } + draw_info->font=NULL; + draw_info->text=NULL; + } + + /* Set text background color */ + if (draw_text->flags & ETO_OPAQUE) + { + /* Draw bounding-box background color (META_EXTTEXTOUT mode) */ + draw_stroke_color_string(WmfDrawingWand,"none"); + draw_fill_color_rgb(API,WMF_DC_BACKGROUND(draw_text->dc)); + DrawRectangle(WmfDrawingWand, + XC(draw_text->TL.x),YC(draw_text->TL.y), + XC(draw_text->BR.x),YC(draw_text->BR.y)); + draw_fill_color_string(WmfDrawingWand,"none"); + } + else + { + /* Set text undercolor */ + if (WMF_DC_OPAQUE(draw_text->dc)) + { + wmfRGB + *box = WMF_DC_BACKGROUND(draw_text->dc); + + PixelWand + *under_color; + + under_color=NewPixelWand(); + PixelSetRedQuantum(under_color,ScaleCharToQuantum(box->r)); + PixelSetGreenQuantum(under_color,ScaleCharToQuantum(box->g)); + PixelSetBlueQuantum(under_color,ScaleCharToQuantum(box->b)); + PixelSetOpacityQuantum(under_color,OpaqueOpacity); + DrawSetTextUnderColor(WmfDrawingWand,under_color); + under_color=DestroyPixelWand(under_color); + } + else + draw_under_color_string(WmfDrawingWand,"none"); + } + + /* Set text clipping (META_EXTTEXTOUT mode) */ + if ( draw_text->flags & ETO_CLIPPED) + { + } + + /* Set stroke color */ + draw_stroke_color_string(WmfDrawingWand,"none"); + + /* Set fill color */ + draw_fill_color_rgb(API,WMF_DC_TEXTCOLOR(draw_text->dc)); + + /* Output font size */ + (void) DrawSetFontSize(WmfDrawingWand,pointsize); + + /* Output Postscript font name */ + (void) DrawSetFont(WmfDrawingWand, WMF_FONT_PSNAME(font)); + + /* Translate coordinates so target is 0,0 */ + DrawTranslate(WmfDrawingWand, XC(point.x), YC(point.y)); + + /* Transform horizontal scale to draw text at 1:1 ratio */ + DrawScale(WmfDrawingWand, ddata->scale_y / ddata->scale_x, 1.0); + + /* Apply rotation */ + /* ImageMagick's drawing rotation is clockwise from horizontal + while WMF drawing rotation is counterclockwise from horizontal */ + angle = fabs(RadiansToDegrees(2 * MagickPI - WMF_TEXT_ANGLE(font))); + if (angle == 360) + angle = 0; + if (angle != 0) + DrawRotate(WmfDrawingWand, angle); + + /* + * Render text + * + */ + + /* Output string */ + DrawAnnotation(WmfDrawingWand, 0, 0, (unsigned char*)draw_text->str); + + /* Underline text the Windows way (at the bottom) */ + if (WMF_TEXT_UNDERLINE(font)) + { + double + line_height; + + wmfD_Coord + ulBR, /* bottom right of underline rectangle */ + ulTL; /* top left of underline rectangle */ + + line_height = ((double)1/(ddata->scale_x))*metrics.underline_thickness; + if (metrics.underline_thickness < 1.5) + line_height *= 0.55; + ulTL.x = 0; + ulTL.y = fabs(metrics.descent) - line_height; + ulBR.x = metrics.width; + ulBR.y = fabs(metrics.descent); + + DrawRectangle(WmfDrawingWand, + XC(ulTL.x), YC(ulTL.y), XC(ulBR.x), YC(ulBR.y)); + } + + /* Strikeout text the Windows way */ + if (WMF_TEXT_STRIKEOUT(font)) + { + double line_height; + + wmfD_Coord + ulBR, /* bottom right of strikeout rectangle */ + ulTL; /* top left of strikeout rectangle */ + + line_height = ((double)1/(ddata->scale_x))*metrics.underline_thickness; + + if (metrics.underline_thickness < 2.0) + line_height *= 0.55; + ulTL.x = 0; + ulTL.y = -(((double) metrics.ascent) / 2 + line_height / 2); + ulBR.x = metrics.width; + ulBR.y = -(((double) metrics.ascent) / 2 - line_height / 2); + + DrawRectangle(WmfDrawingWand, + XC(ulTL.x), YC(ulTL.y), XC(ulBR.x), YC(ulBR.y)); + + } + + /* Restore graphic wand */ + (void) PopDrawingWand(WmfDrawingWand); + +#if 0 + (void) PushDrawingWand(WmfDrawingWand); + draw_stroke_color_string(WmfDrawingWand,"red"); + draw_fill_color_string(WmfDrawingWand,"none"); + DrawRectangle(WmfDrawingWand, + XC(TL.x), YC(TL.y), + XC(BR.x), YC(BR.y)); + draw_stroke_color_string(WmfDrawingWand,"none"); + (void) PopDrawingWand(WmfDrawingWand); +#endif + +} + +static void ipa_udata_init(wmfAPI * API, wmfUserData_t * userdata) +{ + (void) API; + (void) userdata; + /* wmf_magick_t* ddata = WMF_MAGICK_GetData (API); */ + +} + +static void ipa_udata_copy(wmfAPI * API, wmfUserData_t * userdata) +{ + (void) API; + (void) userdata; + /* wmf_magick_t* ddata = WMF_MAGICK_GetData (API); */ + +} + +static void ipa_udata_set(wmfAPI * API, wmfUserData_t * userdata) +{ + (void) API; + (void) userdata; + /* wmf_magick_t* ddata = WMF_MAGICK_GetData (API); */ + +} + +static void ipa_udata_free(wmfAPI *API, wmfUserData_t *userdata) +{ + (void) API; + (void) userdata; + /* wmf_magick_t* ddata = WMF_MAGICK_GetData (API); */ + +} + +static void util_set_brush(wmfAPI *API, wmfDC *dc,const BrushApply brush_apply) +{ + wmf_magick_t + *ddata = WMF_MAGICK_GetData(API); + + wmfBrush + *brush = WMF_DC_BRUSH(dc); + + /* Set polygon fill rule */ + switch (WMF_DC_POLYFILL(dc)) /* Is this correct ?? */ + { + case WINDING: + DrawSetClipRule(WmfDrawingWand,NonZeroRule); + break; + + case ALTERNATE: + default: + DrawSetClipRule(WmfDrawingWand,EvenOddRule); + break; + } + + switch (WMF_BRUSH_STYLE(brush)) + { + case BS_SOLID /* 0 */: + /* WMF_BRUSH_COLOR specifies brush color, WMF_BRUSH_HATCH + ignored */ + { + if ( brush_apply == BrushApplyStroke ) + draw_stroke_color_rgb(API,WMF_BRUSH_COLOR(brush)); + else + draw_fill_color_rgb(API,WMF_BRUSH_COLOR(brush)); + break; + } + case BS_HOLLOW /* 1 */: /* BS_HOLLOW & BS_NULL share enum */ + /* WMF_BRUSH_COLOR and WMF_BRUSH_HATCH ignored */ + { + if ( brush_apply == BrushApplyStroke ) + draw_stroke_color_string(WmfDrawingWand,"none"); + else + draw_fill_color_string(WmfDrawingWand,"none"); + break; + } + case BS_HATCHED /* 2 */: + /* WMF_BRUSH_COLOR specifies the hatch color, WMF_BRUSH_HATCH + specifies the hatch brush style. If WMF_DC_OPAQUE, then + WMF_DC_BACKGROUND specifies hatch background color. */ + { + DrawPushDefs(WmfDrawingWand); + draw_pattern_push(API, ddata->pattern_id, 8, 8); + (void) PushDrawingWand(WmfDrawingWand); + + if (WMF_DC_OPAQUE(dc)) + { + if ( brush_apply == BrushApplyStroke ) + draw_stroke_color_rgb(API,WMF_DC_BACKGROUND(dc)); + else + draw_fill_color_rgb(API,WMF_DC_BACKGROUND(dc)); + + DrawRectangle(WmfDrawingWand, 0, 0, 7, 7 ); + } + + DrawSetStrokeAntialias(WmfDrawingWand, MagickFalse); + DrawSetStrokeWidth(WmfDrawingWand, 1); + + draw_stroke_color_rgb(API,WMF_BRUSH_COLOR(brush)); + + switch ((unsigned int) WMF_BRUSH_HATCH(brush)) + { + + case HS_HORIZONTAL: /* ----- */ + { + DrawLine(WmfDrawingWand, 0, 3, 7,3); + break; + } + case HS_VERTICAL: /* ||||| */ + { + DrawLine(WmfDrawingWand, 3, 0, 3, 7); + break; + } + case HS_FDIAGONAL: /* \\\\\ */ + { + DrawLine(WmfDrawingWand, 0, 0, 7, 7); + break; + } + case HS_BDIAGONAL: /* / */ + { + DrawLine(WmfDrawingWand, 0, 7, 7, 0 ); + break; + } + case HS_CROSS: /* +++++ */ + { + DrawLine(WmfDrawingWand, 0, 3, 7, 3 ); + DrawLine(WmfDrawingWand, 3, 0, 3, 7 ); + break; + } + case HS_DIAGCROSS: /* xxxxx */ + { + DrawLine(WmfDrawingWand, 0, 0, 7, 7 ); + DrawLine(WmfDrawingWand, 0, 7, 7, 0 ); + break; + } + default: + { + printf("util_set_brush: unexpected brush hatch enumeration %u\n", + (unsigned int)WMF_BRUSH_HATCH(brush)); + } + } + (void) PopDrawingWand(WmfDrawingWand); + (void) DrawPopPattern(WmfDrawingWand); + DrawPopDefs(WmfDrawingWand); + { + char + pattern_id[MaxTextExtent]; + + (void) FormatLocaleString(pattern_id,MaxTextExtent,"#brush_%lu", + ddata->pattern_id); + if (brush_apply == BrushApplyStroke ) + (void) DrawSetStrokePatternURL(WmfDrawingWand,pattern_id); + else + (void) DrawSetFillPatternURL(WmfDrawingWand,pattern_id); + ++ddata->pattern_id; + } + break; + } + case BS_PATTERN /* 3 */: + /* WMF_BRUSH_COLOR ignored, WMF_BRUSH_HATCH provides handle to + bitmap */ + { + printf("util_set_brush: BS_PATTERN not supported\n"); + break; + } + case BS_INDEXED /* 4 */: + { + printf("util_set_brush: BS_INDEXED not supported\n"); + break; + } + case BS_DIBPATTERN /* 5 */: + { + wmfBMP + *brush_bmp = WMF_BRUSH_BITMAP(brush); + + if (brush_bmp && brush_bmp->data != 0) + { + CompositeOperator + mode; + + const Image + *image; + + MagickWand + *magick_wand; + + image = (Image*)brush_bmp->data; + + mode = CopyCompositeOp; /* Default is copy */ + switch (WMF_DC_ROP(dc)) + { + /* Binary raster ops */ + case R2_BLACK: + printf("util_set_brush: R2_BLACK ROP2 mode not supported!\n"); + break; + case R2_NOTMERGEPEN: + printf("util_set_brush: R2_NOTMERGEPEN ROP2 mode not supported!\n"); + break; + case R2_MASKNOTPEN: + printf("util_set_brush R2_MASKNOTPEN ROP2 mode not supported!\n"); + break; + case R2_NOTCOPYPEN: + printf("util_set_brush: R2_NOTCOPYPEN ROP2 mode not supported!\n"); + break; + case R2_MASKPENNOT: + printf("util_set_brush: R2_MASKPENNOT ROP2 mode not supported!\n"); + break; + case R2_NOT: + printf("util_set_brush: R2_NOT ROP2 mode not supported!\n"); + break; + case R2_XORPEN: + printf("util_set_brush: R2_XORPEN ROP2 mode not supported!\n"); + break; + case R2_NOTMASKPEN: + printf("util_set_brush: R2_NOTMASKPEN ROP2 mode not supported!\n"); + break; + case R2_MASKPEN: + printf("util_set_brush: R2_MASKPEN ROP2 mode not supported!\n"); + break; + case R2_NOTXORPEN: + printf("util_set_brush: R2_NOTXORPEN ROP2 mode not supported!\n"); + break; + case R2_NOP: + printf("util_set_brush: R2_NOP ROP2 mode not supported!\n"); + break; + case R2_MERGENOTPEN: + printf("util_set_brush: R2_MERGENOTPEN ROP2 mode not supported!\n"); + break; + case R2_COPYPEN: + mode = CopyCompositeOp; + break; + case R2_MERGEPENNOT: + printf("util_set_brush: R2_MERGEPENNOT ROP2 mode not supported!\n"); + break; + case R2_MERGEPEN: + printf("util_set_brush: R2_MERGEPEN ROP2 mode not supported!\n"); + break; + case R2_WHITE: + printf("util_set_brush: R2_WHITE ROP2 mode not supported!\n"); + break; + default: + { + printf("util_set_brush: unexpected ROP2 enumeration %u!\n", + (unsigned int)WMF_DC_ROP(dc)); + } + } + + DrawPushDefs(WmfDrawingWand); + draw_pattern_push(API, ddata->pattern_id, brush_bmp->width, + brush_bmp->height); + magick_wand=NewMagickWandFromImage(image); + (void) DrawComposite(WmfDrawingWand,mode, 0, 0, brush_bmp->width, + brush_bmp->height, magick_wand); + magick_wand=DestroyMagickWand(magick_wand); + (void) DrawPopPattern(WmfDrawingWand); + DrawPopDefs(WmfDrawingWand); + + { + char + pattern_id[MaxTextExtent]; + + (void) FormatLocaleString(pattern_id,MaxTextExtent,"#brush_%lu", + ddata->pattern_id); + + if ( brush_apply == BrushApplyStroke ) + (void) DrawSetStrokePatternURL(WmfDrawingWand,pattern_id); + else + (void) DrawSetFillPatternURL(WmfDrawingWand,pattern_id); + ++ddata->pattern_id; + } + } + else + printf("util_set_brush: no BMP image data!\n"); + + break; + } + case BS_DIBPATTERNPT /* 6 */: + /* WMF_BRUSH_COLOR ignored, WMF_BRUSH_HATCH provides pointer to + DIB */ + { + printf("util_set_brush: BS_DIBPATTERNPT not supported\n"); + break; + } + case BS_PATTERN8X8 /* 7 */: + { + printf("util_set_brush: BS_PATTERN8X8 not supported\n"); + break; + } + case BS_DIBPATTERN8X8 /* 8 */: + { + printf("util_set_brush: BS_DIBPATTERN8X8 not supported\n"); + break; + } + default: + { + } + } +} + +static void util_set_pen(wmfAPI * API, wmfDC * dc) +{ + wmf_magick_t + *ddata = WMF_MAGICK_GetData(API); + + wmfPen + *pen = 0; + + double + pen_width, + pixel_width; + + unsigned int + pen_style; + + pen = WMF_DC_PEN(dc); + + pen_width = (WMF_PEN_WIDTH(pen) + WMF_PEN_HEIGHT(pen)) / 2; + + /* Pixel width is inverse of pixel scale */ + pixel_width = (((double) 1 / (ddata->scale_x)) + + ((double) 1 / (ddata->scale_y))) / 2; + + /* Don't allow pen_width to be much less than pixel_width in order + to avoid dissapearing or spider-web lines */ + pen_width = MagickMax(pen_width, pixel_width*0.8); + + pen_style = (unsigned int) WMF_PEN_STYLE(pen); + + /* Pen style specified? */ + if (pen_style == PS_NULL) + { + draw_stroke_color_string(WmfDrawingWand,"none"); + return; + } + + DrawSetStrokeAntialias(WmfDrawingWand, MagickTrue ); + DrawSetStrokeWidth(WmfDrawingWand, (unsigned long) MagickMax(0.0, pen_width)); + + { + LineCap + linecap; + + switch ((unsigned int) WMF_PEN_ENDCAP(pen)) + { + case PS_ENDCAP_SQUARE: + linecap = SquareCap; + break; + case PS_ENDCAP_ROUND: + linecap = RoundCap; + break; + case PS_ENDCAP_FLAT: + default: + linecap = ButtCap; + break; + } + DrawSetStrokeLineCap(WmfDrawingWand, linecap); + } + + { + LineJoin + linejoin; + + switch ((unsigned int) WMF_PEN_JOIN(pen)) + { + case PS_JOIN_BEVEL: + linejoin = BevelJoin; + break; + case PS_JOIN_ROUND: + linejoin = RoundJoin; + break; + case PS_JOIN_MITER: + default: + linejoin = MiterJoin; + break; + } + DrawSetStrokeLineJoin(WmfDrawingWand,linejoin); + } + + { + double + dasharray[7]; + + switch (pen_style) + { + case PS_DASH: /* ------- */ + { + /* Pattern 18,7 */ + dasharray[0] = pixel_width * 18; + dasharray[1] = pixel_width * 7; + dasharray[2] = 0; + + DrawSetStrokeAntialias(WmfDrawingWand,MagickFalse); + (void) DrawSetStrokeDashArray(WmfDrawingWand,2,dasharray); + break; + } + case PS_ALTERNATE: + case PS_DOT: /* ....... */ + { + /* Pattern 3,3 */ + dasharray[0] = pixel_width * 3; + dasharray[1] = pixel_width * 3; + dasharray[2] = 0; + + DrawSetStrokeAntialias(WmfDrawingWand,MagickFalse); + (void) DrawSetStrokeDashArray(WmfDrawingWand,2,dasharray); + break; + } + case PS_DASHDOT: /* _._._._ */ + { + /* Pattern 9,6,3,6 */ + dasharray[0] = pixel_width * 9; + dasharray[1] = pixel_width * 6; + dasharray[2] = pixel_width * 3; + dasharray[3] = pixel_width * 6; + dasharray[4] = 0; + + DrawSetStrokeAntialias(WmfDrawingWand,MagickFalse); + (void) DrawSetStrokeDashArray(WmfDrawingWand,4,dasharray); + break; + } + case PS_DASHDOTDOT: /* _.._.._ */ + { + /* Pattern 9,3,3,3,3,3 */ + dasharray[0] = pixel_width * 9; + dasharray[1] = pixel_width * 3; + dasharray[2] = pixel_width * 3; + dasharray[3] = pixel_width * 3; + dasharray[4] = pixel_width * 3; + dasharray[5] = pixel_width * 3; + dasharray[6] = 0; + + DrawSetStrokeAntialias(WmfDrawingWand,MagickFalse); + (void) DrawSetStrokeDashArray(WmfDrawingWand,6,dasharray); + break; + } + case PS_INSIDEFRAME: /* There is nothing to do in this case... */ + case PS_SOLID: + default: + { + (void) DrawSetStrokeDashArray(WmfDrawingWand,0,(double *) NULL); + break; + } + } + } + + draw_stroke_color_rgb(API,WMF_PEN_COLOR(pen)); +} + +/* Estimate font pointsize based on Windows font parameters */ +static double util_pointsize( wmfAPI* API, wmfFont* font, char* str, double font_height) +{ + wmf_magick_t + *ddata = WMF_MAGICK_GetData(API); + + Image + *image = ddata->image; + + TypeMetric + metrics; + + DrawInfo + *draw_info; + + double + pointsize = 0; + + draw_info=ddata->draw_info; + if (draw_info == (const DrawInfo *) NULL) + return 0; + + draw_info->font=WMF_FONT_PSNAME(font); + draw_info->pointsize=font_height; + draw_info->text=str; + + if (GetTypeMetrics(image, draw_info, &metrics) != MagickFalse) + { + + if (strlen(str) == 1) + { + pointsize = (font_height * + ( font_height * PerceptibleReciprocal(metrics.ascent + fabs(metrics.descent)))); + draw_info->pointsize = pointsize; + if (GetTypeMetrics(image, draw_info, &metrics) != MagickFalse) + pointsize *= (font_height * PerceptibleReciprocal( metrics.ascent + fabs(metrics.descent))); + } + else + { + pointsize = (font_height * (font_height / (metrics.height))); + draw_info->pointsize = pointsize; + if (GetTypeMetrics(image, draw_info, &metrics) != MagickFalse) + pointsize *= (font_height * PerceptibleReciprocal((double) metrics.height)); + + } +#if 0 + draw_info.pointsize = pointsize; + if (GetTypeMetrics(image, &draw_info, &metrics) != MagickFalse) + pointsize *= (font_height / (metrics.ascent + fabs(metrics.descent))); + pointsize *= 1.114286; /* Magic number computed through trial and error */ +#endif + } + + draw_info->font=NULL; + draw_info->text=NULL; +#if 0 + printf("String = %s\n", str); + printf("Font = %s\n", WMF_FONT_PSNAME(font)); + printf("lfHeight = %g\n", font_height); + printf("bounds = %g,%g %g,%g\n", metrics.bounds.x1, metrics.bounds.y1, + metrics.bounds.x2,metrics.bounds.y2); + printf("ascent = %g\n", metrics.ascent); + printf("descent = %g\n", metrics.descent); + printf("height = %g\n", metrics.height); + printf("Pointsize = %g\n", pointsize); +#endif + + return floor(pointsize); +} + +#if defined(MAGICKCORE_WMF_DELEGATE) +/* + * Returns width of string in points, assuming (unstretched) font size of 1pt + * (similar to wmf_ipa_font_stringwidth) + * + * This extremely odd at best, particularly since player/meta.h has access + * to the corrected font_height (as drawtext.font_height) when it invokes the + * stringwidth callback. It should be possible to compute the real stringwidth! + */ +static float lite_font_stringwidth( wmfAPI* API, wmfFont* font, char* str) +{ +#if 0 + wmf_magick_t + *ddata = WMF_MAGICK_GetData(API); + + Image + *image = ddata->image; + + DrawInfo + *draw_info; + + TypeMetric + metrics; + + float + stringwidth = 0; + + double + orig_x_resolution, + orig_y_resolution; + + ResolutionType + orig_resolution_units; + + orig_x_resolution = image->x_resolution; + orig_y_resolution = image->y_resolution; + orig_resolution_units = image->units; + + draw_info=ddata->draw_info; + if (draw_info == (const DrawInfo *) NULL) + return 0; + + draw_info->font=WMF_FONT_PSNAME(font); + draw_info->pointsize=12; + draw_info->text=str; + + image->x_resolution = 72; + image->y_resolution = 72; + image->units = PixelsPerInchResolution; + + if (GetTypeMetrics(image, draw_info, &metrics) != MagickFalse) + stringwidth = ((metrics.width * 72)/(image->x_resolution * draw_info->pointsize)); /* *0.916348; */ + + draw_info->font=NULL; + draw_info->text=NULL; + +#if 0 + printf("\nlite_font_stringwidth\n"); + printf("string = \"%s\"\n", str); + printf("WMF_FONT_NAME = \"%s\"\n", WMF_FONT_NAME(font)); + printf("WMF_FONT_PSNAME = \"%s\"\n", WMF_FONT_PSNAME(font)); + printf("stringwidth = %g\n", stringwidth); + /* printf("WMF_FONT_HEIGHT = %i\n", (int)WMF_FONT_HEIGHT(font)); */ + /* printf("WMF_FONT_WIDTH = %i\n", (int)WMF_FONT_WIDTH(font)); */ + fflush(stdout); +#endif + + image->x_resolution = orig_x_resolution; + image->y_resolution = orig_y_resolution; + image->units = orig_resolution_units; + + return stringwidth; +#else + (void) API; + (void) font; + (void) str; + + return 0; +#endif +} + +/* Map font (similar to wmf_ipa_font_map) */ + +/* Mappings to Postscript fonts: family, normal, italic, bold, bolditalic */ +static wmfFontMap WMFFontMap[] = { + { (char *) "Courier", (char *) "Courier", + (char *) "Courier-Oblique", (char *) "Courier-Bold", + (char *) "Courier-BoldOblique" }, + { (char *) "Helvetica", (char *) "Helvetica", + (char *) "Helvetica-Oblique", (char *) "Helvetica-Bold", + (char *) "Helvetica-BoldOblique" }, + { (char *) "Modern", (char *) "Courier", + (char *) "Courier-Oblique", (char *) "Courier-Bold", + (char *) "Courier-BoldOblique" }, + { (char *) "Monotype Corsiva", (char *) "Courier", + (char *) "Courier-Oblique", (char *) "Courier-Bold", + (char *) "Courier-BoldOblique" }, + { (char *) "News Gothic", (char *) "Helvetica", + (char *) "Helvetica-Oblique", (char *) "Helvetica-Bold", + (char *) "Helvetica-BoldOblique" }, + { (char *) "Symbol", (char *) "Symbol", + (char *) "Symbol", (char *) "Symbol", + (char *) "Symbol" }, + { (char *) "System", (char *) "Courier", + (char *) "Courier-Oblique", (char *) "Courier-Bold", + (char *) "Courier-BoldOblique" }, + { (char *) "Times", (char *) "Times-Roman", + (char *) "Times-Italic", (char *) "Times-Bold", + (char *) "Times-BoldItalic" }, + { (char *) NULL, (char *) NULL, + (char *) NULL, (char *) NULL, + (char *) NULL } +}; + + +/* Mapping between base name and Ghostscript family name */ +static wmfMapping SubFontMap[] = +{ + { (char *) "Arial", (char *) "Helvetica", FT_ENCODING_NONE }, + { (char *) "Courier", (char *) "Courier", FT_ENCODING_NONE }, + { (char *) "Fixed", (char *) "Courier", FT_ENCODING_NONE }, + { (char *) "Helvetica", (char *) "Helvetica", FT_ENCODING_NONE }, + { (char *) "Sans", (char *) "Helvetica", FT_ENCODING_NONE }, + { (char *) "Sym", (char *) "Symbol", FT_ENCODING_NONE }, + { (char *) "Terminal", (char *) "Courier", FT_ENCODING_NONE }, + { (char *) "Times", (char *) "Times", FT_ENCODING_NONE }, + { (char *) "Wingdings", (char *) "Symbol", FT_ENCODING_NONE }, + { (char *) NULL, (char *) NULL, FT_ENCODING_NONE } +}; + +static void lite_font_map( wmfAPI* API, wmfFont* font) +{ + wmfFontData + *font_data; + + wmf_magick_font_t + *magick_font; + + wmf_magick_t + *ddata = WMF_MAGICK_GetData(API); + + ExceptionInfo + *exception; + + const TypeInfo + *type_info, + *type_info_base; + + const char + *wmf_font_name; + + if (font == 0) + return; + + font_data = (wmfFontData*)API->font_data; + font->user_data = font_data->user_data; + magick_font = (wmf_magick_font_t*)font->user_data; + wmf_font_name = WMF_FONT_NAME(font); + + if (magick_font->ps_name != (char *) NULL) + magick_font->ps_name=DestroyString(magick_font->ps_name); + + exception=AcquireExceptionInfo(); + type_info_base=GetTypeInfo("*",exception); + if (type_info_base == 0) + { + InheritException(&ddata->image->exception,exception); + (void) DestroyExceptionInfo(exception); + return; + } + + /* Certain short-hand font names are not the proper Windows names + and should be promoted to the proper names */ + if (LocaleCompare(wmf_font_name,"Times") == 0) + wmf_font_name = "Times New Roman"; + else if (LocaleCompare(wmf_font_name,"Courier") == 0) + wmf_font_name = "Courier New"; + + /* Look for a family-based best-match */ + if (!magick_font->ps_name) + { + int + target_weight; + + StyleType + style = AnyStyle; + + if (WMF_FONT_WEIGHT(font) == 0) + target_weight = 400; + else + target_weight = WMF_FONT_WEIGHT(font); + if (WMF_FONT_ITALIC(font)) + style=ItalicStyle; + type_info=GetTypeInfoByFamily(wmf_font_name,style,AnyStretch, + target_weight,exception); + if (type_info == (const TypeInfo *) NULL) + type_info=GetTypeInfoByFamily(wmf_font_name,AnyStyle,AnyStretch,0, + exception); + if (type_info != (const TypeInfo *) NULL) + CloneString(&magick_font->ps_name,type_info->name); + } + (void) DestroyExceptionInfo(exception); + + /* Look for exact full match */ + if(!magick_font->ps_name) + { + type_info=GetTypeInfo(wmf_font_name,exception); + if (type_info != (const TypeInfo *) NULL) + CloneString(&magick_font->ps_name,type_info->name); + } + + /* Now let's try simple substitution mappings from WMFFontMap */ + if (!magick_font->ps_name) + { + char + target[MaxTextExtent]; + + int + target_weight = 400, + want_italic = MagickFalse, + want_bold = MagickFalse, + i; + + if ( WMF_FONT_WEIGHT(font) != 0 ) + target_weight = WMF_FONT_WEIGHT(font); + + if ( (target_weight > 550) || ((strstr(wmf_font_name,"Bold") || + strstr(wmf_font_name,"Heavy") || + strstr(wmf_font_name,"Black"))) ) + want_bold = MagickTrue; + + if ( (WMF_FONT_ITALIC(font)) || ((strstr(wmf_font_name,"Italic") || + strstr(wmf_font_name,"Oblique"))) ) + want_italic = MagickTrue; + + (void) CopyMagickString(target,"Times",MaxTextExtent); + for( i=0; SubFontMap[i].name != NULL; i++ ) + { + if (LocaleCompare(wmf_font_name, SubFontMap[i].name) == 0) + { + (void) CopyMagickString(target,SubFontMap[i].mapping, + MaxTextExtent); + break; + } + } + + for( i=0; WMFFontMap[i].name != NULL; i++ ) + { + if (LocaleNCompare(WMFFontMap[i].name,target,strlen(WMFFontMap[i].name)) == 0) + { + if (want_bold && want_italic) + CloneString(&magick_font->ps_name,WMFFontMap[i].bolditalic); + else if (want_italic) + CloneString(&magick_font->ps_name,WMFFontMap[i].italic); + else if (want_bold) + CloneString(&magick_font->ps_name,WMFFontMap[i].bold); + else + CloneString(&magick_font->ps_name,WMFFontMap[i].normal); + } + } + } + +#if 0 + printf("\nlite_font_map\n"); + printf("WMF_FONT_NAME = \"%s\"\n", WMF_FONT_NAME(font)); + printf("WMF_FONT_WEIGHT = %i\n", WMF_FONT_WEIGHT(font)); + printf("WMF_FONT_PSNAME = \"%s\"\n", WMF_FONT_PSNAME(font)); + fflush(stdout); +#endif + +} + +/* Initialize API font structures */ +static void lite_font_init( wmfAPI* API, wmfAPI_Options* options) +{ + wmfFontData + *font_data; + + (void) options; + API->fonts = 0; + + /* Allocate wmfFontData data structure */ + API->font_data = wmf_malloc(API,sizeof(wmfFontData)); + if (ERR (API)) + return; + + font_data = (wmfFontData*)API->font_data; + + /* Assign function to map font (type wmfMap) */ + font_data->map = lite_font_map; + + /* Assign function to return string width in points (type wmfStringWidth) */ + font_data->stringwidth = lite_font_stringwidth; + + /* Assign user data, not used by libwmflite (type void*) */ + font_data->user_data = wmf_malloc(API,sizeof(wmf_magick_font_t)); + if (ERR(API)) + return; + ((wmf_magick_font_t*)font_data->user_data)->ps_name = 0; + ((wmf_magick_font_t*)font_data->user_data)->pointsize = 0; +} + +#endif /* MAGICKCORE_WMF_DELEGATE */ + +/* BLOB read byte */ +static int ipa_blob_read(void* wand) +{ + return ReadBlobByte((Image*)wand); +} + +/* BLOB seek */ +static int ipa_blob_seek(void* wand,long position) +{ + return (int)SeekBlob((Image*)wand,(MagickOffsetType) position,SEEK_SET); +} + +/* BLOB tell */ +static long ipa_blob_tell(void* wand) +{ + return (long)TellBlob((Image*)wand); +} + +static Image *ReadWMFImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + double + bounding_height, + bounding_width, + image_height, + image_height_inch, + image_width, + image_width_inch, + resolution_y, + resolution_x, + units_per_inch; + + float + wmf_width, + wmf_height; + + Image + *image; + + MagickBooleanType + status; + + unsigned long + wmf_options_flags = 0; + + wmf_error_t + wmf_error; + + wmf_magick_t + *ddata = 0; + + wmfAPI + *API = 0; + + wmfAPI_Options + wmf_api_options; + + wmfD_Rect + bbox; + + image=AcquireImage(image_info); + if (OpenBlob(image_info,image,ReadBinaryBlobMode,exception) == MagickFalse) + { + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " OpenBlob failed"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "leave ReadWMFImage()"); + } + image=DestroyImageList(image); + return((Image *) NULL); + } + + /* + * Create WMF API + * + */ + + /* Register callbacks */ + wmf_options_flags |= WMF_OPT_FUNCTION; + (void) memset(&wmf_api_options, 0, sizeof(wmf_api_options)); + wmf_api_options.function = ipa_functions; + + /* Ignore non-fatal errors */ + wmf_options_flags |= WMF_OPT_IGNORE_NONFATAL; + + wmf_error = wmf_api_create(&API, wmf_options_flags, &wmf_api_options); + if (wmf_error != wmf_E_None) + { + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " wmf_api_create failed"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "leave ReadWMFImage()"); + } + if (API) + wmf_api_destroy(API); + ThrowReaderException(DelegateError,"UnableToInitializeWMFLibrary"); + } + + /* Register progress monitor */ + wmf_status_function(API,image,magick_progress_callback); + + ddata=WMF_MAGICK_GetData(API); + ddata->image=image; + ddata->image_info=image_info; + ddata->draw_info=CloneDrawInfo(image_info,(const DrawInfo *) NULL); + ddata->draw_info->font=(char *) + RelinquishMagickMemory(ddata->draw_info->font); + ddata->draw_info->text=(char *) + RelinquishMagickMemory(ddata->draw_info->text); + +#if defined(MAGICKCORE_WMF_DELEGATE) + /* Must initialize font subystem for WMFlite interface */ + lite_font_init (API,&wmf_api_options); /* similar to wmf_ipa_font_init in src/font.c */ + /* wmf_arg_fontdirs (API,options); */ /* similar to wmf_arg_fontdirs in src/wmf.c */ + +#endif + + /* + * Open BLOB input via libwmf API + * + */ + wmf_error = wmf_bbuf_input(API,ipa_blob_read,ipa_blob_seek, + ipa_blob_tell,(void*)image); + if (wmf_error != wmf_E_None) + { + if (ddata->draw_info != (DrawInfo *) NULL) + { + DestroyDrawInfo(ddata->draw_info); + ddata->draw_info=(DrawInfo *)NULL; + } + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " wmf_bbuf_input failed"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "leave ReadWMFImage()"); + } + wmf_api_destroy(API); + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + image->filename); + image=DestroyImageList(image); + return((Image *) NULL); + } + + /* + * Scan WMF file + * + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Scanning WMF to obtain bounding box"); + wmf_error=wmf_scan(API, 0, &bbox); + if (wmf_error != wmf_E_None) + { + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " wmf_scan failed with wmf_error %d", wmf_error); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "leave ReadWMFImage()"); + } + ipa_device_close(API); + wmf_api_destroy(API); + ThrowReaderException(DelegateError,"FailedToScanFile"); + } + + /* + * Compute dimensions and scale factors + * + */ + + ddata->bbox=bbox; + + /* User specified resolution */ + resolution_y=DefaultResolution; + if (image->y_resolution != 0.0) + { + resolution_y = image->y_resolution; + if (image->units == PixelsPerCentimeterResolution) + resolution_y *= CENTIMETERS_PER_INCH; + } + resolution_x=DefaultResolution; + if (image->x_resolution != 0.0) + { + resolution_x = image->x_resolution; + if (image->units == PixelsPerCentimeterResolution) + resolution_x *= CENTIMETERS_PER_INCH; + } + + /* Obtain output size expressed in metafile units */ + wmf_error=wmf_size(API,&wmf_width,&wmf_height); + if (wmf_error != wmf_E_None) + { + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " wmf_size failed with wmf_error %d", wmf_error); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "leave ReadWMFImage()"); + } + ipa_device_close(API); + wmf_api_destroy(API); + ThrowReaderException(DelegateError,"FailedToComputeOutputSize"); + } + + /* Obtain (or guess) metafile units */ + if ((API)->File->placeable && (API)->File->pmh->Inch) + units_per_inch=(API)->File->pmh->Inch; + else if ( (wmf_width*wmf_height) < 1024*1024) + units_per_inch=POINTS_PER_INCH; /* MM_TEXT */ + else + units_per_inch=TWIPS_PER_INCH; /* MM_TWIPS */ + + /* Calculate image width and height based on specified DPI + resolution */ + image_width_inch = (double) wmf_width / units_per_inch; + image_height_inch = (double) wmf_height / units_per_inch; + image_width = image_width_inch * resolution_x; + image_height = image_height_inch * resolution_y; + + /* Compute bounding box scale factors and origin translations + * + * This all just a hack since libwmf does not currently seem to + * provide the mapping between LOGICAL coordinates and DEVICE + * coordinates. This mapping is necessary in order to know + * where to place the logical bounding box within the image. + * + */ + + bounding_width = bbox.BR.x - bbox.TL.x; + bounding_height = bbox.BR.y - bbox.TL.y; + if ((bounding_width == 0) || (bounding_height == 0)) + { + ipa_device_close(API); + (void) wmf_api_destroy(API); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + ddata->scale_x = image_width/bounding_width; + ddata->translate_x = 0-bbox.TL.x; + ddata->rotate = 0; + + /* Heuristic: guess that if the vertical coordinates mostly span + negative values, then the image must be inverted. */ + if ( fabs(bbox.BR.y) > fabs(bbox.TL.y) ) + { + /* Normal (Origin at top left of image) */ + ddata->scale_y = (image_height/bounding_height); + ddata->translate_y = 0-bbox.TL.y; + } + else + { + /* Inverted (Origin at bottom left of image) */ + ddata->scale_y = (-image_height/bounding_height); + ddata->translate_y = 0-bbox.BR.y; + } + + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Placeable metafile: %s", + (API)->File->placeable ? "Yes" : "No"); + + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Size in metafile units: %gx%g",wmf_width,wmf_height); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Metafile units/inch: %g",units_per_inch); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Size in inches: %gx%g", + image_width_inch,image_height_inch); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Bounding Box: %g,%g %g,%g", + bbox.TL.x, bbox.TL.y, bbox.BR.x, bbox.BR.y); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Bounding width x height: %gx%g",bounding_width, + bounding_height); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Output resolution: %gx%g",resolution_x,resolution_y); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Image size: %gx%g",image_width,image_height); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Bounding box scale factor: %g,%g",ddata->scale_x, + ddata->scale_y); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Translation: %g,%g", + ddata->translate_x, ddata->translate_y); + } + +#if 0 +#if 0 + { + typedef struct _wmfPlayer_t wmfPlayer_t; + struct _wmfPlayer_t + { + wmfPen default_pen; + wmfBrush default_brush; + wmfFont default_font; + + wmfDC* dc; /* current dc */ + }; + + wmfDC + *dc; + +#define WMF_ELICIT_DC(API) (((wmfPlayer_t*)((API)->player_data))->dc) + + dc = WMF_ELICIT_DC(API); + + printf("dc->Window.Ox = %d\n", dc->Window.Ox); + printf("dc->Window.Oy = %d\n", dc->Window.Oy); + printf("dc->Window.width = %d\n", dc->Window.width); + printf("dc->Window.height = %d\n", dc->Window.height); + printf("dc->pixel_width = %g\n", dc->pixel_width); + printf("dc->pixel_height = %g\n", dc->pixel_height); +#if defined(MAGICKCORE_WMF_DELEGATE) /* Only in libwmf 0.3 */ + printf("dc->Ox = %.d\n", dc->Ox); + printf("dc->Oy = %.d\n", dc->Oy); + printf("dc->width = %.d\n", dc->width); + printf("dc->height = %.d\n", dc->height); +#endif + + } +#endif + +#endif + + /* + * Create canvas image + * + */ + image->rows=(unsigned long) ceil(image_height); + image->columns=(unsigned long) ceil(image_width); + + if (image_info->ping != MagickFalse) + { + ipa_device_close(API); + wmf_api_destroy(API); + (void) CloseBlob(image); + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "leave ReadWMFImage()"); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Creating canvas image with size %lux%lu",(unsigned long) image->rows, + (unsigned long) image->columns); + + /* + * Set solid background color + */ + { + image->background_color = image_info->background_color; + if (image->background_color.opacity != OpaqueOpacity) + image->matte = MagickTrue; + (void) SetImageBackgroundColor(image); + } + /* + * Play file to generate Vector drawing commands + * + */ + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Playing WMF to prepare vectors"); + + wmf_error = wmf_play(API, 0, &bbox); + if (wmf_error != wmf_E_None) + { + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Playing WMF failed with wmf_error %d", wmf_error); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "leave ReadWMFImage()"); + } + ipa_device_close(API); + wmf_api_destroy(API); + ThrowReaderException(DelegateError,"FailedToRenderFile"); + } + + /* + * Scribble on canvas image + * + */ + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Rendering WMF vectors"); + DrawRender(ddata->draw_wand); + + if (image->debug != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(),"leave ReadWMFImage()"); + + /* Cleanup allocated data */ + wmf_api_destroy(API); + (void) CloseBlob(image); + + /* Return image */ + return image; +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r W M F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterWMFImage() adds attributes for the WMF image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterWMFImage method is: +% +% size_t RegisterWMFImage(void) +% +*/ +ModuleExport size_t RegisterWMFImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("WMZ"); +#if defined(MAGICKCORE_SANS_DELEGATE) || defined(MAGICKCORE_WMF_DELEGATE) + entry->decoder=ReadWMFImage; +#endif + entry->description=ConstantString("Compressed Windows Meta File"); + entry->magick_module=ConstantString("WMF"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("WMF"); +#if defined(MAGICKCORE_SANS_DELEGATE) || defined(MAGICKCORE_WMF_DELEGATE) + entry->decoder=ReadWMFImage; +#endif + entry->description=ConstantString("Windows Meta File"); + entry->magick_module=ConstantString("WMF"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r W M F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterWMFImage() removes format registrations made by the +% WMF module from the list of supported formats. +% +% The format of the UnregisterWMFImage method is: +% +% UnregisterWMFImage(void) +% +*/ +ModuleExport void UnregisterWMFImage(void) +{ + (void) UnregisterMagickInfo("WMZ"); + (void) UnregisterMagickInfo("WMF"); +} diff --git a/ImageMagick-6.9.12-44/coders/wpg.c b/ImageMagick-6.9.12-44/coders/wpg.c new file mode 100644 index 0000000..96056a9 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/wpg.c @@ -0,0 +1,1713 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% W W PPPP GGGG % +% W W P P G % +% W W W PPPP G GGG % +% WW WW P G G % +% W W P GGG % +% % +% % +% Read WordPerfect Image Format % +% % +% Software Design % +% Jaroslav Fojtik % +% June 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/constitute.h" +#include "magick/distort.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/cache.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magic.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/transform.h" +#include "magick/utility.h" +#include "magick/utility-private.h" + +typedef struct + { + unsigned char Red; + unsigned char Blue; + unsigned char Green; + } RGB_Record; + +/* Default palette for WPG level 1 */ +static const RGB_Record WPG1_Palette[256]={ +{ 0, 0, 0}, { 0, 0,168}, +{ 0,168, 0}, { 0,168,168}, +{168, 0, 0}, {168, 0,168}, +{168, 84, 0}, {168,168,168}, +{ 84, 84, 84}, { 84, 84,252}, +{ 84,252, 84}, { 84,252,252}, +{252, 84, 84}, {252, 84,252}, +{252,252, 84}, {252,252,252}, /*16*/ +{ 0, 0, 0}, { 20, 20, 20}, +{ 32, 32, 32}, { 44, 44, 44}, +{ 56, 56, 56}, { 68, 68, 68}, +{ 80, 80, 80}, { 96, 96, 96}, +{112,112,112}, {128,128,128}, +{144,144,144}, {160,160,160}, +{180,180,180}, {200,200,200}, +{224,224,224}, {252,252,252}, /*32*/ +{ 0, 0,252}, { 64, 0,252}, +{124, 0,252}, {188, 0,252}, +{252, 0,252}, {252, 0,188}, +{252, 0,124}, {252, 0, 64}, +{252, 0, 0}, {252, 64, 0}, +{252,124, 0}, {252,188, 0}, +{252,252, 0}, {188,252, 0}, +{124,252, 0}, { 64,252, 0}, /*48*/ +{ 0,252, 0}, { 0,252, 64}, +{ 0,252,124}, { 0,252,188}, +{ 0,252,252}, { 0,188,252}, +{ 0,124,252}, { 0, 64,252}, +{124,124,252}, {156,124,252}, +{188,124,252}, {220,124,252}, +{252,124,252}, {252,124,220}, +{252,124,188}, {252,124,156}, /*64*/ +{252,124,124}, {252,156,124}, +{252,188,124}, {252,220,124}, +{252,252,124}, {220,252,124}, +{188,252,124}, {156,252,124}, +{124,252,124}, {124,252,156}, +{124,252,188}, {124,252,220}, +{124,252,252}, {124,220,252}, +{124,188,252}, {124,156,252}, /*80*/ +{180,180,252}, {196,180,252}, +{216,180,252}, {232,180,252}, +{252,180,252}, {252,180,232}, +{252,180,216}, {252,180,196}, +{252,180,180}, {252,196,180}, +{252,216,180}, {252,232,180}, +{252,252,180}, {232,252,180}, +{216,252,180}, {196,252,180}, /*96*/ +{180,220,180}, {180,252,196}, +{180,252,216}, {180,252,232}, +{180,252,252}, {180,232,252}, +{180,216,252}, {180,196,252}, +{0,0,112}, {28,0,112}, +{56,0,112}, {84,0,112}, +{112,0,112}, {112,0,84}, +{112,0,56}, {112,0,28}, /*112*/ +{112,0,0}, {112,28,0}, +{112,56,0}, {112,84,0}, +{112,112,0}, {84,112,0}, +{56,112,0}, {28,112,0}, +{0,112,0}, {0,112,28}, +{0,112,56}, {0,112,84}, +{0,112,112}, {0,84,112}, +{0,56,112}, {0,28,112}, /*128*/ +{56,56,112}, {68,56,112}, +{84,56,112}, {96,56,112}, +{112,56,112}, {112,56,96}, +{112,56,84}, {112,56,68}, +{112,56,56}, {112,68,56}, +{112,84,56}, {112,96,56}, +{112,112,56}, {96,112,56}, +{84,112,56}, {68,112,56}, /*144*/ +{56,112,56}, {56,112,69}, +{56,112,84}, {56,112,96}, +{56,112,112}, {56,96,112}, +{56,84,112}, {56,68,112}, +{80,80,112}, {88,80,112}, +{96,80,112}, {104,80,112}, +{112,80,112}, {112,80,104}, +{112,80,96}, {112,80,88}, /*160*/ +{112,80,80}, {112,88,80}, +{112,96,80}, {112,104,80}, +{112,112,80}, {104,112,80}, +{96,112,80}, {88,112,80}, +{80,112,80}, {80,112,88}, +{80,112,96}, {80,112,104}, +{80,112,112}, {80,114,112}, +{80,96,112}, {80,88,112}, /*176*/ +{0,0,64}, {16,0,64}, +{32,0,64}, {48,0,64}, +{64,0,64}, {64,0,48}, +{64,0,32}, {64,0,16}, +{64,0,0}, {64,16,0}, +{64,32,0}, {64,48,0}, +{64,64,0}, {48,64,0}, +{32,64,0}, {16,64,0}, /*192*/ +{0,64,0}, {0,64,16}, +{0,64,32}, {0,64,48}, +{0,64,64}, {0,48,64}, +{0,32,64}, {0,16,64}, +{32,32,64}, {40,32,64}, +{48,32,64}, {56,32,64}, +{64,32,64}, {64,32,56}, +{64,32,48}, {64,32,40}, /*208*/ +{64,32,32}, {64,40,32}, +{64,48,32}, {64,56,32}, +{64,64,32}, {56,64,32}, +{48,64,32}, {40,64,32}, +{32,64,32}, {32,64,40}, +{32,64,48}, {32,64,56}, +{32,64,64}, {32,56,64}, +{32,48,64}, {32,40,64}, /*224*/ +{44,44,64}, {48,44,64}, +{52,44,64}, {60,44,64}, +{64,44,64}, {64,44,60}, +{64,44,52}, {64,44,48}, +{64,44,44}, {64,48,44}, +{64,52,44}, {64,60,44}, +{64,64,44}, {60,64,44}, +{52,64,44}, {48,64,44}, /*240*/ +{44,64,44}, {44,64,48}, +{44,64,52}, {44,64,60}, +{44,64,64}, {44,60,64}, +{44,55,64}, {44,48,64}, +{0,0,0}, {0,0,0}, +{0,0,0}, {0,0,0}, +{0,0,0}, {0,0,0}, +{0,0,0}, {0,0,0} /*256*/ +}; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s W P G % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsWPG() returns True if the image format type, identified by the magick +% string, is WPG. +% +% The format of the IsWPG method is: +% +% unsigned int IsWPG(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o status: Method IsWPG returns True if the image format type is WPG. +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static unsigned int IsWPG(const unsigned char *magick,const size_t length) +{ + if (length < 4) + return(MagickFalse); + if (memcmp(magick,"\377WPC",4) == 0) + return(MagickTrue); + return(MagickFalse); +} + + +static void Rd_WP_DWORD(Image *image,size_t *d) +{ + unsigned char + b; + + b=ReadBlobByte(image); + *d=b; + if (b < 0xFFU) + return; + b=ReadBlobByte(image); + *d=(size_t) b; + b=ReadBlobByte(image); + *d+=(size_t) b*256l; + if (*d < 0x8000) + return; + *d=(*d & 0x7FFF) << 16; + b=ReadBlobByte(image); + *d+=(size_t) b; + b=ReadBlobByte(image); + *d+=(size_t) b*256l; + return; +} + +static MagickBooleanType InsertRow(unsigned char *p,ssize_t y,Image *image, + int bpp) +{ + ExceptionInfo + *exception; + + int + bit; + + ssize_t + x; + + PixelPacket + *q; + + IndexPacket + index; + + IndexPacket + *indexes; + + exception=(&image->exception); + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + return(MagickFalse); + indexes=GetAuthenticIndexQueue(image); + switch (bpp) + { + case 1: /* Convert bitmap scanline. */ + { + for (x=0; x < ((ssize_t) image->columns-7); x+=8) + { + for (bit=0; bit < 8; bit++) + { + index=((*p) & (0x80 >> bit) ? 0x01 : 0x00); + SetPixelIndex(indexes+x+bit,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + } + p++; + } + if ((image->columns % 8) != 0) + { + for (bit=0; bit < (ssize_t) (image->columns % 8); bit++) + { + index=((*p) & (0x80 >> bit) ? 0x01 : 0x00); + SetPixelIndex(indexes+x+bit,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + } + p++; + } + break; + } + case 2: /* Convert PseudoColor scanline. */ + { + if ((image->storage_class != PseudoClass) || + (indexes == (IndexPacket *) NULL)) + break; + for (x=0; x < ((ssize_t) image->columns-3); x+=4) + { + index=ConstrainColormapIndex(image,(*p >> 6) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + index=ConstrainColormapIndex(image,(*p >> 4) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + index=ConstrainColormapIndex(image,(*p >> 2) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + index=ConstrainColormapIndex(image,(*p) & 0x3); + SetPixelIndex(indexes+x+1,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + p++; + } + if ((image->columns % 4) != 0) + { + index=ConstrainColormapIndex(image,(*p >> 6) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + if ((image->columns % 4) > 1) + { + index=ConstrainColormapIndex(image,(*p >> 4) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + if ((image->columns % 4) > 2) + { + index=ConstrainColormapIndex(image,(*p >> 2) & 0x3); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + } + } + p++; + } + break; + } + + case 4: /* Convert PseudoColor scanline. */ + { + for (x=0; x < ((ssize_t) image->columns-1); x+=2) + { + index=ConstrainColormapIndex(image,(*p >> 4) & 0x0f); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + index=ConstrainColormapIndex(image,(*p) & 0x0f); + SetPixelIndex(indexes+x+1,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + p++; + q++; + } + if ((image->columns % 2) != 0) + { + index=ConstrainColormapIndex(image,(*p >> 4) & 0x0f); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + p++; + q++; + } + break; + } + case 8: /* Convert PseudoColor scanline. */ + { + for (x=0; x < (ssize_t) image->columns; x++) + { + index=ConstrainColormapIndex(image,*p); + SetPixelIndex(indexes+x,index); + if (index < image->colors) + SetPixelRGBO(q,image->colormap+(ssize_t) index); + p++; + q++; + } + } + break; + + case 24: /* Convert DirectColor scanline. */ + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + q++; + } + break; + } + if (!SyncAuthenticPixels(image,exception)) + return(MagickFalse); + return(MagickTrue); +} + + +/* Helper for WPG1 raster reader. */ +#define InsertByte(b) \ +{ \ + BImgBuff[x]=b; \ + x++; \ + if((ssize_t) x>=ldblk) \ + { \ + if (InsertRow(BImgBuff,(ssize_t) y,image,bpp) != MagickFalse) \ + y++; \ + x=0; \ + } \ +} +/* WPG1 raster reader. */ +static int UnpackWPGRaster(Image *image,int bpp) +{ + int + x, + y, + i; + + unsigned char + bbuf, + *BImgBuff, + RunCount; + + ssize_t + ldblk; + + x=0; + y=0; + + ldblk=(ssize_t) ((bpp*image->columns+7)/8); + BImgBuff=(unsigned char *) AcquireQuantumMemory((size_t) ldblk, + 8*sizeof(*BImgBuff)); + if(BImgBuff==NULL) return(-2); + (void) memset(BImgBuff,0,(size_t) ldblk*8*sizeof(*BImgBuff)); + + while(y<(ssize_t) image->rows) + { + int + c; + + c=ReadBlobByte(image); + if (c == EOF) + break; + bbuf=(unsigned char) c; + RunCount=bbuf & 0x7F; + if(bbuf & 0x80) + { + if(RunCount) /* repeat next byte runcount * */ + { + bbuf=ReadBlobByte(image); + for(i=0;i<(int) RunCount;i++) InsertByte(bbuf); + } + else { /* read next byte as RunCount; repeat 0xFF runcount* */ + c=ReadBlobByte(image); + if (c < 0) + break; + RunCount=(unsigned char) c; + for(i=0;i<(int) RunCount;i++) InsertByte(0xFF); + } + } + else { + if(RunCount) /* next runcount byte are readed directly */ + { + for(i=0;i < (int) RunCount;i++) + { + c=ReadBlobByte(image); + if (c < 0) + break; + InsertByte(c); + } + } + else { /* repeat previous line runcount* */ + c=ReadBlobByte(image); + if (c == EOF) + { + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + return(-7); + } + RunCount=(unsigned char) c; + if(x) { /* attempt to duplicate row from x position: */ + /* I do not know what to do here */ + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + return(-3); + } + for(i=0;i < (int) RunCount;i++) + { + x=0; + y++; /* Here I need to duplicate previous row RUNCOUNT* */ + if(y<2) continue; + if(y>(ssize_t) image->rows) + { + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + return(-4); + } + if (InsertRow(BImgBuff,y-1,image,bpp) == MagickFalse) + { + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + return(-5); + } + } + } + } + if (EOFBlob(image) != MagickFalse) + break; + } + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + return(y < (ssize_t) image->rows ? -5 : 0); +} + + +/* Helper for WPG2 reader. */ +#define InsertByte6(b) \ +{ \ +DisableMSCWarning(4310) \ + if(XorMe)\ + BImgBuff[x] = (unsigned char)~b;\ + else\ + BImgBuff[x] = b;\ +RestoreMSCWarning \ + x++; \ + if((ssize_t) x >= ldblk) \ + { \ + if (InsertRow(BImgBuff,(ssize_t) y,image,bpp) != MagickFalse) \ + y++; \ + x=0; \ + } \ +} +/* WPG2 raster reader. */ +static int UnpackWPG2Raster(Image *image,int bpp) +{ + int XorMe = 0; + + int + RunCount; + + ssize_t + i; + + size_t + x, + y; + + ssize_t + ldblk; + + unsigned int + SampleSize=1; + + unsigned char + bbuf, + *BImgBuff, + SampleBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + x=0; + y=0; + ldblk=(ssize_t) ((bpp*image->columns+7)/8); + BImgBuff=(unsigned char *) AcquireQuantumMemory((size_t) ldblk, + sizeof(*BImgBuff)); + if(BImgBuff==NULL) + return(-2); + (void) memset(BImgBuff,0,ldblk*sizeof(*BImgBuff)); + + while( y< image->rows) + { + bbuf=ReadBlobByte(image); + + switch(bbuf) + { + case 0x7D: + SampleSize=ReadBlobByte(image); /* DSZ */ + if(SampleSize>8) + { + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + return(-2); + } + if(SampleSize<1) + { + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + return(-2); + } + break; + case 0x7E: + if (y == 0) + (void) FormatLocaleFile(stderr, + "\nUnsupported WPG token XOR, please report!"); + XorMe=!XorMe; + break; + case 0x7F: + RunCount=ReadBlobByte(image); /* BLK */ + if (RunCount < 0) + break; + for(i=0; i < ((ssize_t) SampleSize*(RunCount+1)); i++) + { + InsertByte6(0); + } + break; + case 0xFD: + RunCount=ReadBlobByte(image); /* EXT */ + if (RunCount < 0) + break; + for(i=0; i<= RunCount;i++) + for(bbuf=0; bbuf < SampleSize; bbuf++) + InsertByte6(SampleBuffer[bbuf]); + break; + case 0xFE: + RunCount=ReadBlobByte(image); /* RST */ + if (RunCount < 0) + break; + if(x!=0) + { + (void) FormatLocaleFile(stderr, + "\nUnsupported WPG2 unaligned token RST x=%.20g, please report!\n" + ,(double) x); + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + return(-3); + } + { + /* duplicate the previous row RunCount x */ + for(i=0;i<=RunCount;i++) + { + if (InsertRow(BImgBuff,(ssize_t) (image->rows > y ? y : image->rows-1),image,bpp) == MagickFalse) + { + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + return(-3); + } + y++; + } + } + break; + case 0xFF: + RunCount=ReadBlobByte(image); /* WHT */ + if (RunCount < 0) + break; + for (i=0; i < ((ssize_t) SampleSize*(RunCount+1)); i++) + { + InsertByte6(0xFF); + } + break; + default: + RunCount=bbuf & 0x7F; + + if(bbuf & 0x80) /* REP */ + { + for(i=0; i < SampleSize; i++) + SampleBuffer[i]=ReadBlobByte(image); + for(i=0;i<=RunCount;i++) + for(bbuf=0;bbuf= 0x8000) + { + Precision=1; + (void) ReadBlobLSBShort(image); + } + } + else + (void) ReadBlobLSBLong(image); + } + if(Flags & ROT) + { + x=ReadBlobLSBLong(image); /*Rot Angle*/ + if(Angle) *Angle=x/65536.0; + } + if(Flags & (ROT|SCL)) + { + x=ReadBlobLSBLong(image); /*Sx*cos()*/ + (*CTM)[0][0] = (float)x/0x10000; + x=ReadBlobLSBLong(image); /*Sy*cos()*/ + (*CTM)[1][1] = (float)x/0x10000; + } + if(Flags & (ROT|SKW)) + { + x=ReadBlobLSBLong(image); /*Kx*sin()*/ + (*CTM)[1][0] = (float)x/0x10000; + x=ReadBlobLSBLong(image); /*Ky*sin()*/ + (*CTM)[0][1] = (float)x/0x10000; + } + if(Flags & TRN) + { + x=ReadBlobLSBLong(image); DenX=ReadBlobLSBShort(image); /*Tx*/ + if(x>=0) (*CTM)[0][2] = (float)x+(float)DenX/0x10000; + else (*CTM)[0][2] = (float)x-(float)DenX/0x10000; + x=ReadBlobLSBLong(image); DenX=ReadBlobLSBShort(image); /*Ty*/ + (*CTM)[1][2]=(float)x + ((x>=0)?1:-1)*(float)DenX/0x10000; + if(x>=0) (*CTM)[1][2] = (float)x+(float)DenX/0x10000; + else (*CTM)[1][2] = (float)x-(float)DenX/0x10000; + } + if(Flags & TPR) + { + x=ReadBlobLSBShort(image); DenX=ReadBlobLSBShort(image); /*Px*/ + (*CTM)[2][0] = x + (float)DenX/0x10000;; + x=ReadBlobLSBShort(image); DenX=ReadBlobLSBShort(image); /*Py*/ + (*CTM)[2][1] = x + (float)DenX/0x10000; + } + return(Flags); +} + + +static Image *ExtractPostscript(Image *image,const ImageInfo *image_info, + MagickOffsetType PS_Offset,ssize_t PS_Size,ExceptionInfo *exception) +{ + char + postscript_file[MaxTextExtent]; + + const MagicInfo + *magic_info; + + FILE + *ps_file; + + int + c; + + ImageInfo + *clone_info; + + Image + *image2; + + MagickBooleanType + status; + + unsigned char + magick[2*MaxTextExtent]; + + ssize_t + count; + + if ((clone_info=CloneImageInfo(image_info)) == NULL) + return(image); + clone_info->blob=(void *) NULL; + clone_info->length=0; + status=MagickFalse; + + /* Obtain temporary file */ + (void) AcquireUniqueFilename(postscript_file); + ps_file=fopen_utf8(postscript_file,"wb"); + if (ps_file == (FILE *) NULL) + goto FINISH; + + /* Copy postscript to temporary file */ + if (SeekBlob(image,PS_Offset,SEEK_SET) != PS_Offset) + { + (void) fclose(ps_file); + ThrowException(exception,CorruptImageError,"ImproperImageHeader", + image->filename); + goto FINISH_UNL; + } + count=ReadBlob(image, 2*MaxTextExtent, magick); + if (count < 1) + { + (void) fclose(ps_file); + ThrowException(exception,CorruptImageError,"ImproperImageHeader", + image->filename); + goto FINISH_UNL; + } + + if (SeekBlob(image,PS_Offset,SEEK_SET) != PS_Offset) + { + (void) fclose(ps_file); + ThrowException(exception,CorruptImageError,"ImproperImageHeader", + image->filename); + goto FINISH_UNL; + } + while (PS_Size-- > 0) + { + c=ReadBlobByte(image); + if (c == EOF) + { + (void) fclose(ps_file); + ThrowException(exception,CorruptImageError,"ImproperImageHeader", + image->filename); + goto FINISH_UNL; + } + (void) fputc(c,ps_file); + } + (void) fclose(ps_file); + + /* Detect file format - Check magic.mgk configuration file. */ + magic_info=GetMagicInfo(magick,count,exception); + if(magic_info == (const MagicInfo *) NULL) goto FINISH_UNL; + /* printf("Detected:%s \n",magic_info->name); */ + if(exception->severity != UndefinedException) goto FINISH_UNL; + if(magic_info->name == (char *) NULL) goto FINISH_UNL; + (void) strncpy(clone_info->magick,magic_info->name,MaxTextExtent-1); + if (LocaleCompare(clone_info->magick,"PFB") != 0) + { + ThrowException(exception,CorruptImageError,"ImproperImageHeader", + image->filename); + goto FINISH_UNL; + } + + /* Read nested image */ + /*FormatString(clone_info->filename,"%s:%s",magic_info->name,postscript_file);*/ + FormatLocaleString(clone_info->filename,MagickPathExtent,"%.1024s:%.1024s", + clone_info->magick,postscript_file); + image2=ReadImage(clone_info,exception); + + if (!image2) + goto FINISH_UNL; + if(exception->severity>=ErrorException) + { + CloseBlob(image2); + DestroyImageList(image2); + goto FINISH_UNL; + } + + { + Image + *p; + + /* + Replace current image with new image while copying base image attributes. + */ + p=image2; + do + { + (void) CopyMagickString(p->filename,image->filename,MagickPathExtent); + (void) CopyMagickString(p->magick_filename,image->magick_filename, + MagickPathExtent); + (void) CopyMagickString(p->magick,image->magick,MagickPathExtent); + if ((p->rows == 0) || (p->columns == 0)) + { + DeleteImageFromList(&p); + if (p == (Image *) NULL) + { + image2=(Image *) NULL; + goto FINISH_UNL; + } + } + else + { + DestroyBlob(p); + p->blob=ReferenceBlob(image->blob); + p=p->next; + } + } while (p != (Image *) NULL); + } + + if ((image->rows == 0 || image->columns == 0) && + (image->previous != NULL || image->next != NULL)) + { + DeleteImageFromList(&image); + } + + AppendImageToList(&image,image2); + while (image->next != NULL) + image=image->next; + status=MagickTrue; + + FINISH_UNL: + (void) RelinquishUniqueFileResource(postscript_file); + FINISH: + DestroyImageInfo(clone_info); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d W P G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method ReadWPGImage reads an WPG X image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadWPGImage method is: +% +% Image *ReadWPGImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: Method ReadWPGImage returns a pointer to the image after +% reading. A null image is returned if there is a memory shortage or if +% the image cannot be read. +% +% o image_info: Specifies a pointer to a ImageInfo structure. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadWPGImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + typedef struct + { + size_t FileId; + MagickOffsetType DataOffset; + unsigned int ProductType; + unsigned int FileType; + unsigned char MajorVersion; + unsigned char MinorVersion; + unsigned int EncryptKey; + unsigned int Reserved; + } WPGHeader; + + typedef struct + { + unsigned char RecType; + size_t RecordLength; + } WPGRecord; + + typedef struct + { + unsigned char Class; + unsigned char RecType; + size_t Extension; + size_t RecordLength; + } WPG2Record; + + typedef struct + { + unsigned HorizontalUnits; + unsigned VerticalUnits; + unsigned char PosSizePrecision; + } WPG2Start; + + typedef struct + { + unsigned int Width; + unsigned int Height; + unsigned int Depth; + unsigned int HorzRes; + unsigned int VertRes; + } WPGBitmapType1; + + typedef struct + { + unsigned int Width; + unsigned int Height; + unsigned char Depth; + unsigned char Compression; + } WPG2BitmapType1; + + typedef struct + { + unsigned int RotAngle; + unsigned int LowLeftX; + unsigned int LowLeftY; + unsigned int UpRightX; + unsigned int UpRightY; + unsigned int Width; + unsigned int Height; + unsigned int Depth; + unsigned int HorzRes; + unsigned int VertRes; + } WPGBitmapType2; + + typedef struct + { + unsigned int StartIndex; + unsigned int NumOfEntries; + } WPGColorMapRec; + + /* + typedef struct { + size_t PS_unknown1; + unsigned int PS_unknown2; + unsigned int PS_unknown3; + } WPGPSl1Record; + */ + + Image + *image; + + unsigned int + status; + + WPGHeader + Header; + + WPGRecord + Rec; + + WPG2Record + Rec2; + + WPG2Start StartWPG; + + WPGBitmapType1 + BitmapHeader1; + + WPG2BitmapType1 + Bitmap2Header1; + + WPGBitmapType2 + BitmapHeader2; + + WPGColorMapRec + WPG_Palette; + + int + i, + bpp, + WPG2Flags; + + ssize_t + ldblk; + + size_t + one; + + unsigned char + *BImgBuff; + + tCTM CTM; /*current transform matrix*/ + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + one=1; + image=AcquireImage(image_info); + image->depth=8; + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read WPG image. + */ + Header.FileId=ReadBlobLSBLong(image); + Header.DataOffset=(MagickOffsetType) ReadBlobLSBLong(image); + Header.ProductType=ReadBlobLSBShort(image); + Header.FileType=ReadBlobLSBShort(image); + Header.MajorVersion=ReadBlobByte(image); + Header.MinorVersion=ReadBlobByte(image); + Header.EncryptKey=ReadBlobLSBShort(image); + Header.Reserved=ReadBlobLSBShort(image); + + if (Header.FileId!=0x435057FF || (Header.ProductType>>8)!=0x16) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (Header.EncryptKey!=0) + ThrowReaderException(CoderError,"EncryptedWPGImageFileNotSupported"); + + image->columns = 1; + image->rows = 1; + image->colors = 0; + image->storage_class=DirectClass; + (void) ResetImagePixels(image,exception); + bpp=0; + BitmapHeader2.RotAngle=0; + Rec2.RecordLength = 0; + + switch(Header.FileType) + { + case 1: /* WPG level 1 */ + while(!EOFBlob(image)) /* object parser loop */ + { + if (SeekBlob(image,Header.DataOffset,SEEK_SET) != Header.DataOffset) + break; + if(EOFBlob(image)) + break; + + Rec.RecType=(i=ReadBlobByte(image)); + if(i==EOF) + break; + Rd_WP_DWORD(image,&Rec.RecordLength); + if (Rec.RecordLength > GetBlobSize(image)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if(EOFBlob(image)) + break; + + Header.DataOffset=TellBlob(image)+Rec.RecordLength; + + switch(Rec.RecType) + { + case 0x0B: /* bitmap type 1 */ + BitmapHeader1.Width=ReadBlobLSBShort(image); + BitmapHeader1.Height=ReadBlobLSBShort(image); + if ((BitmapHeader1.Width == 0) || (BitmapHeader1.Height == 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + BitmapHeader1.Depth=ReadBlobLSBShort(image); + BitmapHeader1.HorzRes=ReadBlobLSBShort(image); + BitmapHeader1.VertRes=ReadBlobLSBShort(image); + + if(BitmapHeader1.HorzRes && BitmapHeader1.VertRes) + { + image->units=PixelsPerCentimeterResolution; + image->x_resolution=BitmapHeader1.HorzRes/470.0; + image->y_resolution=BitmapHeader1.VertRes/470.0; + } + image->columns=BitmapHeader1.Width; + image->rows=BitmapHeader1.Height; + bpp=BitmapHeader1.Depth; + + goto UnpackRaster; + + case 0x0E: /*Color palette */ + WPG_Palette.StartIndex=ReadBlobLSBShort(image); + WPG_Palette.NumOfEntries=ReadBlobLSBShort(image); + if ((WPG_Palette.NumOfEntries-WPG_Palette.StartIndex) > + (Rec2.RecordLength-2-2) / 3) + ThrowReaderException(CorruptImageError,"InvalidColormapIndex"); + if (WPG_Palette.StartIndex > WPG_Palette.NumOfEntries) + ThrowReaderException(CorruptImageError,"InvalidColormapIndex"); + image->colors=WPG_Palette.NumOfEntries; + if (AcquireImageColormap(image,image->colors) == MagickFalse) + goto NoMemory; + for (i=WPG_Palette.StartIndex; + i < (int)WPG_Palette.NumOfEntries; i++) + { + image->colormap[i].red=ScaleCharToQuantum((unsigned char) + ReadBlobByte(image)); + image->colormap[i].green=ScaleCharToQuantum((unsigned char) + ReadBlobByte(image)); + image->colormap[i].blue=ScaleCharToQuantum((unsigned char) + ReadBlobByte(image)); + image->colormap[i].opacity=OpaqueOpacity; + } + break; + + case 0x11: /* Start PS l1 */ + if (Rec.RecordLength > 8) + { + image=ExtractPostscript(image,image_info, + TellBlob(image)+8, /* skip PS header in the wpg */ + (ssize_t) Rec.RecordLength-8,exception); + if (image == NULL) + ThrowReaderException(CorruptImageError, + "ImproperImageHeader"); + } + break; + + case 0x14: /* bitmap type 2 */ + BitmapHeader2.RotAngle=ReadBlobLSBShort(image); + BitmapHeader2.LowLeftX=ReadBlobLSBShort(image); + BitmapHeader2.LowLeftY=ReadBlobLSBShort(image); + BitmapHeader2.UpRightX=ReadBlobLSBShort(image); + BitmapHeader2.UpRightY=ReadBlobLSBShort(image); + BitmapHeader2.Width=ReadBlobLSBShort(image); + BitmapHeader2.Height=ReadBlobLSBShort(image); + if ((BitmapHeader2.Width == 0) || (BitmapHeader2.Height == 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + BitmapHeader2.Depth=ReadBlobLSBShort(image); + BitmapHeader2.HorzRes=ReadBlobLSBShort(image); + BitmapHeader2.VertRes=ReadBlobLSBShort(image); + + image->units=PixelsPerCentimeterResolution; + image->page.width=(unsigned int) + ((BitmapHeader2.LowLeftX-BitmapHeader2.UpRightX)/470.0); + image->page.height=(unsigned int) + ((BitmapHeader2.LowLeftX-BitmapHeader2.UpRightY)/470.0); + image->page.x=(int) (BitmapHeader2.LowLeftX/470.0); + image->page.y=(int) (BitmapHeader2.LowLeftX/470.0); + if(BitmapHeader2.HorzRes && BitmapHeader2.VertRes) + { + image->x_resolution=BitmapHeader2.HorzRes/470.0; + image->y_resolution=BitmapHeader2.VertRes/470.0; + } + image->columns=BitmapHeader2.Width; + image->rows=BitmapHeader2.Height; + bpp=BitmapHeader2.Depth; + + UnpackRaster: + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + break; + (void) ResetImagePixels(image,exception); + if ((image->storage_class != PseudoClass) && (bpp < 24)) + { + image->colors=one << bpp; + if (image->colors > GetBlobSize(image)) + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + if (!AcquireImageColormap(image,image->colors)) + { + NoMemory: + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + } + /* printf("Load default colormap \n"); */ + for (i=0; (i < (int) image->colors) && (i < 256); i++) + { + image->colormap[i].red=ScaleCharToQuantum(WPG1_Palette[i].Red); + image->colormap[i].green=ScaleCharToQuantum(WPG1_Palette[i].Green); + image->colormap[i].blue=ScaleCharToQuantum(WPG1_Palette[i].Blue); + image->colormap[i].opacity=OpaqueOpacity; + } + } + else + { + if (bpp < 24) + if ( (image->colors < (one << bpp)) && (bpp != 24) ) + { + PixelPacket + *colormap; + + size_t + colors; + + colormap=image->colormap; + colors=image->colors; + image->colormap=(PixelPacket *) NULL; + if (AcquireImageColormap(image,one << bpp) == MagickFalse) + { + colormap=(PixelPacket *) + RelinquishMagickMemory(colormap); + goto NoMemory; + } + (void) memcpy(image->colormap,colormap,MagickMin( + image->colors,colors)*sizeof(*image->colormap)); + colormap=(PixelPacket *) + RelinquishMagickMemory(colormap); + } + } + + if ((bpp == 1) && (image->colors > 1)) + { + if(image->colormap[0].red==0 && + image->colormap[0].green==0 && + image->colormap[0].blue==0 && + image->colormap[1].red==0 && + image->colormap[1].green==0 && + image->colormap[1].blue==0) + { /* fix crippled monochrome palette */ + image->colormap[1].red = + image->colormap[1].green = + image->colormap[1].blue = QuantumRange; + image->colormap[1].opacity=OpaqueOpacity; + } + } + + if(!image_info->ping) + if(UnpackWPGRaster(image,bpp) < 0) + /* The raster cannot be unpacked */ + { + DecompressionFailed: + ThrowReaderException(CoderError,"UnableToDecompressImage"); + } + + if(Rec.RecType==0x14 && BitmapHeader2.RotAngle!=0 && !image_info->ping) + { + /* flop command */ + if(BitmapHeader2.RotAngle & 0x8000) + { + Image + *flop_image; + + flop_image = FlopImage(image, exception); + if (flop_image != (Image *) NULL) { + DuplicateBlob(flop_image,image); + ReplaceImageInList(&image,flop_image); + } + } + /* flip command */ + if(BitmapHeader2.RotAngle & 0x2000) + { + Image + *flip_image; + + flip_image = FlipImage(image, exception); + if (flip_image != (Image *) NULL) { + DuplicateBlob(flip_image,image); + ReplaceImageInList(&image,flip_image); + } + } + /* rotate command */ + if(BitmapHeader2.RotAngle & 0x0FFF) + { + Image + *rotate_image; + + rotate_image=RotateImage(image,(BitmapHeader2.RotAngle & + 0x0FFF), exception); + if (rotate_image != (Image *) NULL) { + DuplicateBlob(rotate_image,image); + ReplaceImageInList(&image,rotate_image); + } + } + } + + /* Allocate next image structure. */ + if ((image_info->ping != MagickFalse) && + (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + goto Finish; + AcquireNextImage(image_info,image); + image->depth=8; + if (image->next == (Image *) NULL) + goto Finish; + image=SyncNextImageInList(image); + image->columns=image->rows=0; + image->colors=0; + break; + + case 0x1B: /* Postscript l2 */ + if (Rec.RecordLength > 0x3C) + { + image=ExtractPostscript(image,image_info, + TellBlob(image)+0x3C, /* skip PS l2 header in the wpg */ + (ssize_t) Rec.RecordLength-0x3C,exception); + if (image == NULL) + ThrowReaderException(CorruptImageError, + "ImproperImageHeader"); + } + break; + } + } + break; + + case 2: /* WPG level 2 */ + (void) memset(CTM,0,sizeof(CTM)); + StartWPG.PosSizePrecision = 0; + while(!EOFBlob(image)) /* object parser loop */ + { + if (SeekBlob(image,Header.DataOffset,SEEK_SET) != Header.DataOffset) + break; + if(EOFBlob(image)) + break; + + Rec2.Class=(i=ReadBlobByte(image)); + if(i==EOF) + break; + Rec2.RecType=(i=ReadBlobByte(image)); + if(i==EOF) + break; + Rd_WP_DWORD(image,&Rec2.Extension); + Rd_WP_DWORD(image,&Rec2.RecordLength); + if(EOFBlob(image)) + break; + + Header.DataOffset=TellBlob(image)+Rec2.RecordLength; + + switch(Rec2.RecType) + { + case 1: + StartWPG.HorizontalUnits=ReadBlobLSBShort(image); + StartWPG.VerticalUnits=ReadBlobLSBShort(image); + StartWPG.PosSizePrecision=ReadBlobByte(image); + break; + case 0x0C: /* Color palette */ + WPG_Palette.StartIndex=ReadBlobLSBShort(image); + WPG_Palette.NumOfEntries=ReadBlobLSBShort(image); + if ((WPG_Palette.NumOfEntries-WPG_Palette.StartIndex) > + (Rec2.RecordLength-2-2) / 3) + ThrowReaderException(CorruptImageError,"InvalidColormapIndex"); + if (WPG_Palette.StartIndex >= WPG_Palette.NumOfEntries) + ThrowReaderException(CorruptImageError,"InvalidColormapIndex"); + image->colors=WPG_Palette.NumOfEntries; + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError, + "MemoryAllocationFailed"); + for (i=WPG_Palette.StartIndex; + i < (int)WPG_Palette.NumOfEntries; i++) + { + image->colormap[i].red=ScaleCharToQuantum((char) + ReadBlobByte(image)); + image->colormap[i].green=ScaleCharToQuantum((char) + ReadBlobByte(image)); + image->colormap[i].blue=ScaleCharToQuantum((char) + ReadBlobByte(image)); + image->colormap[i].opacity=OpaqueOpacity; + (void) ReadBlobByte(image); /*Opacity??*/ + } + break; + case 0x0E: + Bitmap2Header1.Width=ReadBlobLSBShort(image); + Bitmap2Header1.Height=ReadBlobLSBShort(image); + if ((Bitmap2Header1.Width == 0) || (Bitmap2Header1.Height == 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + Bitmap2Header1.Depth=ReadBlobByte(image); + Bitmap2Header1.Compression=ReadBlobByte(image); + + if(Bitmap2Header1.Compression > 1) + continue; /*Unknown compression method */ + switch(Bitmap2Header1.Depth) + { + case 1: + bpp=1; + break; + case 2: + bpp=2; + break; + case 3: + bpp=4; + break; + case 4: + bpp=8; + break; + case 8: + bpp=24; + break; + default: + continue; /*Ignore raster with unknown depth*/ + } + image->columns=Bitmap2Header1.Width; + image->rows=Bitmap2Header1.Height; + if (image_info->ping != MagickFalse) + return(image); + status=SetImageExtent(image,image->columns,image->rows); + if (status != MagickFalse) + status=ResetImagePixels(image,exception); + if (status == MagickFalse) + break; + if ((image->colors == 0) && (bpp != 24)) + { + size_t + one; + + one=1; + image->colors=one << bpp; + if (!AcquireImageColormap(image,image->colors)) + goto NoMemory; + } + else + { + if(bpp < 24) + if( image->colors<(one << bpp) && bpp!=24 ) + image->colormap=(PixelPacket *) ResizeQuantumMemory( + image->colormap,(size_t) (one << bpp), + sizeof(*image->colormap)); + } + + + switch(Bitmap2Header1.Compression) + { + case 0: /*Uncompressed raster*/ + { + ldblk=(ssize_t) ((bpp*image->columns+7)/8); + BImgBuff=(unsigned char *) AcquireQuantumMemory((size_t) + ldblk+1,sizeof(*BImgBuff)); + if (BImgBuff == (unsigned char *) NULL) + goto NoMemory; + for (i=0; i < (ssize_t) image->rows; i++) + { + ssize_t + count; + + count=ReadBlob(image,(size_t) ldblk,BImgBuff); + if (count != ldblk) + break; + if (InsertRow(BImgBuff,i,image,bpp) == MagickFalse) + break; + } + BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff); + if (i < (ssize_t) image->rows) + goto DecompressionFailed; + break; + } + case 1: /*RLE for WPG2 */ + { + if( UnpackWPG2Raster(image,bpp) < 0) + goto DecompressionFailed; + break; + } + } + + if(CTM[0][0]<0 && !image_info->ping) + { /*?? RotAngle=360-RotAngle;*/ + Image + *flop_image; + + flop_image = FlopImage(image, exception); + if (flop_image != (Image *) NULL) { + DuplicateBlob(flop_image,image); + ReplaceImageInList(&image,flop_image); + } + /* Try to change CTM according to Flip - I am not sure, must be checked. + Tx(0,0)=-1; Tx(1,0)=0; Tx(2,0)=0; + Tx(0,1)= 0; Tx(1,1)=1; Tx(2,1)=0; + Tx(0,2)=(WPG._2Rect.X_ur+WPG._2Rect.X_ll); + Tx(1,2)=0; Tx(2,2)=1; */ + } + if(CTM[1][1]<0 && !image_info->ping) + { /*?? RotAngle=360-RotAngle;*/ + Image + *flip_image; + + flip_image = FlipImage(image, exception); + if (flip_image != (Image *) NULL) { + DuplicateBlob(flip_image,image); + ReplaceImageInList(&image,flip_image); + } + /* Try to change CTM according to Flip - I am not sure, must be checked. + float_matrix Tx(3,3); + Tx(0,0)= 1; Tx(1,0)= 0; Tx(2,0)=0; + Tx(0,1)= 0; Tx(1,1)=-1; Tx(2,1)=0; + Tx(0,2)= 0; Tx(1,2)=(WPG._2Rect.Y_ur+WPG._2Rect.Y_ll); + Tx(2,2)=1; */ + } + + + /* Allocate next image structure. */ + if ((image_info->ping != MagickFalse) && + (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + goto Finish; + AcquireNextImage(image_info,image); + image->depth=8; + if (image->next == (Image *) NULL) + goto Finish; + image=SyncNextImageInList(image); + image->columns=image->rows=0; + image->colors=0; + break; + + case 0x12: /* Postscript WPG2*/ + i=ReadBlobLSBShort(image); + if (Rec2.RecordLength > (unsigned int) i) + { + image=ExtractPostscript(image,image_info, + TellBlob(image)+i, /*skip PS header in the wpg2*/ + (ssize_t) (Rec2.RecordLength-i-2),exception); + if (image == NULL) + ThrowReaderException(CorruptImageError, + "ImproperImageHeader"); + } + break; + + case 0x1B: /*bitmap rectangle*/ + WPG2Flags = LoadWPG2Flags(image,StartWPG.PosSizePrecision,NULL,&CTM); + (void) WPG2Flags; + break; + } + } + + break; + + default: + { + ThrowReaderException(CoderError,"DataEncodingSchemeIsNotSupported"); + } + } + + Finish: + (void) CloseBlob(image); + + { + Image + *p; + + ssize_t + scene=0; + + /* + Rewind list, removing any empty images while rewinding. + */ + p=image; + image=NULL; + while (p != (Image *) NULL) + { + Image *tmp=p; + if ((p->rows == 0) || (p->columns == 0)) { + p=p->previous; + DeleteImageFromList(&tmp); + } else { + image=p; + p=p->previous; + } + } + /* + Fix scene numbers. + */ + for (p=image; p != (Image *) NULL; p=p->next) + p->scene=(size_t) scene++; + } + if (image == (Image *) NULL) + ThrowReaderException(CorruptImageError, + "ImageFileDoesNotContainAnyImageData"); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r W P G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method RegisterWPGImage adds attributes for the WPG image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterWPGImage method is: +% +% size_t RegisterWPGImage(void) +% +*/ +ModuleExport size_t RegisterWPGImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("WPG"); + entry->decoder=(DecodeImageHandler *) ReadWPGImage; + entry->magick=(IsImageFormatHandler *) IsWPG; + entry->description=AcquireString("Word Perfect Graphics"); + entry->magick_module=ConstantString("WPG"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r W P G I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Method UnregisterWPGImage removes format registrations made by the +% WPG module from the list of supported formats. +% +% The format of the UnregisterWPGImage method is: +% +% UnregisterWPGImage(void) +% +*/ +ModuleExport void UnregisterWPGImage(void) +{ + (void) UnregisterMagickInfo("WPG"); +} diff --git a/ImageMagick-6.9.12-44/coders/x.c b/ImageMagick-6.9.12-44/coders/x.c new file mode 100644 index 0000000..b2d96d9 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/x.c @@ -0,0 +1,209 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% X X % +% X X % +% X % +% X X % +% X X % +% % +% % +% Read/Write Image from/to X11 Server. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/client.h" +#include "magick/display.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/xwindow.h" +#include "magick/xwindow-private.h" + +/* + Forward declarations. +*/ +#if defined(MAGICKCORE_X11_DELEGATE) +static MagickBooleanType + WriteXImage(const ImageInfo *,Image *); +#endif + +#if defined(MAGICKCORE_X11_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadXImage() reads an image from an X window. +% +% The format of the ReadXImage method is: +% +% Image *ReadXImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadXImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + const char + *option; + + XImportInfo + ximage_info; + + (void) exception; + XGetImportInfo(&ximage_info); + option=GetImageOption(image_info,"x:screen"); + if (option != (const char *) NULL) + ximage_info.screen=IsMagickTrue(option); + option=GetImageOption(image_info,"x:silent"); + if (option != (const char *) NULL) + ximage_info.silent=IsMagickTrue(option); + return(XImportImage(image_info,&ximage_info)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterXImage() adds attributes for the X image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterXImage method is: +% +% size_t RegisterXImage(void) +% +*/ +ModuleExport size_t RegisterXImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("X"); +#if defined(MAGICKCORE_X11_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadXImage; + entry->encoder=(EncodeImageHandler *) WriteXImage; +#endif + entry->format_type=ImplicitFormatType; + entry->description=ConstantString("X Image"); + entry->magick_module=ConstantString("X"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterXImage() removes format registrations made by the +% X module from the list of supported formats. +% +% The format of the UnregisterXImage method is: +% +% UnregisterXImage(void) +% +*/ +ModuleExport void UnregisterXImage(void) +{ + (void) UnregisterMagickInfo("X"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e X I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteXImage() writes an image to an X server. +% +% The format of the WriteXImage method is: +% +% MagickBooleanType WriteXImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteXImage(const ImageInfo *image_info,Image *image) +{ + return(DisplayImages(image_info,image)); +} diff --git a/ImageMagick-6.9.12-44/coders/xbm.c b/ImageMagick-6.9.12-44/coders/xbm.c new file mode 100644 index 0000000..0b75fae --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/xbm.c @@ -0,0 +1,631 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% X X BBBB M M % +% X X B B MM MM % +% X BBBB M M M % +% X X B B M M % +% X X BBBB M M % +% % +% % +% Read/Write X Windows System Bitmap Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteXBMImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s X B M % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsXBM() returns MagickTrue if the image format type, identified by the +% magick string, is XBM. +% +% The format of the IsXBM method is: +% +% MagickBooleanType IsXBM(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsXBM(const unsigned char *magick,const size_t length) +{ + if (length < 7) + return(MagickFalse); + if (memcmp(magick,"#define",7) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d X B M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadXBMImage() reads an X11 bitmap image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadXBMImage method is: +% +% Image *ReadXBMImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static int XBMInteger(Image *image,short int *hex_digits) +{ + int + c; + + unsigned int + value; + + /* + Skip any leading whitespace. + */ + do + { + c=ReadBlobByte(image); + if (c == EOF) + return(-1); + } while ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r')); + /* + Evaluate number. + */ + value=0; + do + { + if (value <= (unsigned int) (INT_MAX/16)) + { + value*=16; + c&=0xff; + if (value <= (unsigned int) ((INT_MAX-1)-hex_digits[c])) + value+=hex_digits[c]; + } + c=ReadBlobByte(image); + if (c == EOF) + return(-1); + } while (hex_digits[c] >= 0); + return((int) value); +} + +static Image *ReadXBMImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + buffer[MaxTextExtent], + name[MaxTextExtent]; + + Image + *image; + + int + c; + + MagickBooleanType + status; + + IndexPacket + *indexes; + + ssize_t + i, + x; + + PixelPacket + *q; + + unsigned char + *p; + + long + height, + width; + + short int + hex_digits[256]; + + ssize_t + y; + + unsigned char + *data; + + unsigned int + bit, + byte, + bytes_per_line, + length, + padding, + version; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read X bitmap header. + */ + width=0; + height=0; + *name='\0'; + while (ReadBlobString(image,buffer) != (char *) NULL) + if (sscanf(buffer,"#define %1024s %ld",name,&width) == 2) + if ((strlen(name) >= 6) && + (LocaleCompare(name+strlen(name)-6,"_width") == 0)) + break; + while (ReadBlobString(image,buffer) != (char *) NULL) + if (sscanf(buffer,"#define %1024s %ld",name,&height) == 2) + if ((strlen(name) >= 7) && + (LocaleCompare(name+strlen(name)-7,"_height") == 0)) + break; + if ((width <= 0) || (height <= 0) || (EOFBlob(image) != MagickFalse)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + image->columns=(size_t) width; + image->rows=(size_t) height; + image->depth=8; + image->storage_class=PseudoClass; + image->colors=2; + /* + Scan until hex digits. + */ + version=11; + while (ReadBlobString(image,buffer) != (char *) NULL) + { + if (sscanf(buffer,"static short %1024s = {",name) == 1) + version=10; + else + if (sscanf(buffer,"static unsigned char %s = {",name) == 1) + version=11; + else + if (sscanf(buffer,"static char %1024s = {",name) == 1) + version=11; + else + continue; + p=(unsigned char *) strrchr(name,'_'); + if (p == (unsigned char *) NULL) + p=(unsigned char *) name; + else + p++; + if (LocaleCompare("bits[]",(char *) p) == 0) + break; + } + /* + Initialize image structure. + */ + if (AcquireImageColormap(image,image->colors) == MagickFalse) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Initialize colormap. + */ + image->colormap[0].red=QuantumRange; + image->colormap[0].green=QuantumRange; + image->colormap[0].blue=QuantumRange; + image->colormap[1].red=(Quantum) 0; + image->colormap[1].green=(Quantum) 0; + image->colormap[1].blue=(Quantum) 0; + if (image_info->ping != MagickFalse) + { + (void) CloseBlob(image); + return(GetFirstImageInList(image)); + } + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + /* + Initialize hex values. + */ + for (i=0; i < (ssize_t) (sizeof(hex_digits)/sizeof(*hex_digits)); i++) + hex_digits[i]=(-1); + hex_digits[(int) '0']=0; + hex_digits[(int) '1']=1; + hex_digits[(int) '2']=2; + hex_digits[(int) '3']=3; + hex_digits[(int) '4']=4; + hex_digits[(int) '5']=5; + hex_digits[(int) '6']=6; + hex_digits[(int) '7']=7; + hex_digits[(int) '8']=8; + hex_digits[(int) '9']=9; + hex_digits[(int) 'A']=10; + hex_digits[(int) 'B']=11; + hex_digits[(int) 'C']=12; + hex_digits[(int) 'D']=13; + hex_digits[(int) 'E']=14; + hex_digits[(int) 'F']=15; + hex_digits[(int) 'a']=10; + hex_digits[(int) 'b']=11; + hex_digits[(int) 'c']=12; + hex_digits[(int) 'd']=13; + hex_digits[(int) 'e']=14; + hex_digits[(int) 'f']=15; + hex_digits[(int) 'x']=0; + hex_digits[(int) ' ']=(-1); + hex_digits[(int) ',']=(-1); + hex_digits[(int) '}']=(-1); + hex_digits[(int) '\n']=(-1); + hex_digits[(int) '\t']=(-1); + /* + Read hex image data. + */ + padding=0; + if (((image->columns % 16) != 0) && ((image->columns % 16) < 9) && + (version == 10)) + padding=1; + bytes_per_line=(unsigned int) (image->columns+7)/8+padding; + length=(unsigned int) image->rows; + data=(unsigned char *) AcquireQuantumMemory(length,bytes_per_line* + sizeof(*data)); + if (data == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + p=data; + if (version == 10) + for (i=0; i < (ssize_t) (bytes_per_line*image->rows); (i+=2)) + { + c=XBMInteger(image,hex_digits); + if (c < 0) + { + data=(unsigned char *) RelinquishMagickMemory(data); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + *p++=(unsigned char) c; + if ((padding == 0) || (((i+2) % bytes_per_line) != 0)) + *p++=(unsigned char) (c >> 8); + } + else + for (i=0; i < (ssize_t) (bytes_per_line*image->rows); i++) + { + c=XBMInteger(image,hex_digits); + if (c < 0) + { + data=(unsigned char *) RelinquishMagickMemory(data); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + *p++=(unsigned char) c; + } + if (EOFBlob(image) != MagickFalse) + { + data=(unsigned char *) RelinquishMagickMemory(data); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Convert X bitmap image to pixel packets. + */ + p=data; + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + bit=0; + byte=0; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (bit == 0) + byte=(unsigned int) (*p++); + SetPixelIndex(indexes+x,(byte & 0x01) != 0 ? 0x01 : 0x00); + bit++; + byte>>=1; + if (bit == 8) + bit=0; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + data=(unsigned char *) RelinquishMagickMemory(data); + (void) SyncImage(image); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r X B M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterXBMImage() adds attributes for the XBM image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterXBMImage method is: +% +% size_t RegisterXBMImage(void) +% +*/ +ModuleExport size_t RegisterXBMImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("XBM"); + entry->decoder=(DecodeImageHandler *) ReadXBMImage; + entry->encoder=(EncodeImageHandler *) WriteXBMImage; + entry->magick=(IsImageFormatHandler *) IsXBM; + entry->adjoin=MagickFalse; + entry->description=ConstantString( + "X Windows system bitmap (black and white)"); + entry->magick_module=ConstantString("XBM"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r X B M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterXBMImage() removes format registrations made by the +% XBM module from the list of supported formats. +% +% The format of the UnregisterXBMImage method is: +% +% UnregisterXBMImage(void) +% +*/ +ModuleExport void UnregisterXBMImage(void) +{ + (void) UnregisterMagickInfo("XBM"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e X B M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Procedure WriteXBMImage() writes an image to a file in the X bitmap format. +% +% The format of the WriteXBMImage method is: +% +% MagickBooleanType WriteXBMImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +% +*/ +static MagickBooleanType WriteXBMImage(const ImageInfo *image_info,Image *image) +{ + char + basename[MaxTextExtent], + buffer[MaxTextExtent]; + + MagickBooleanType + status; + + const PixelPacket + *p; + + ssize_t + x; + + size_t + bit, + byte; + + ssize_t + count, + y; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Write X bitmap header. + */ + GetPathComponent(image->filename,BasePath,basename); + (void) FormatLocaleString(buffer,MaxTextExtent,"#define %s_width %.20g\n", + basename,(double) image->columns); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + (void) FormatLocaleString(buffer,MaxTextExtent,"#define %s_height %.20g\n", + basename,(double) image->rows); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + (void) FormatLocaleString(buffer,MaxTextExtent, + "static char %s_bits[] = {\n",basename); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + (void) CopyMagickString(buffer," ",MaxTextExtent); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + /* + Convert MIFF to X bitmap pixels. + */ + (void) SetImageType(image,BilevelType); + bit=0; + byte=0; + count=0; + x=0; + y=0; + (void) CopyMagickString(buffer," ",MaxTextExtent); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + byte>>=1; + if (GetPixelLuma(image,p) < (QuantumRange/2.0)) + byte|=0x80; + bit++; + if (bit == 8) + { + /* + Write a bitmap byte to the image file. + */ + (void) FormatLocaleString(buffer,MaxTextExtent,"0x%02X, ", + (unsigned int) (byte & 0xff)); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + count++; + if (count == 12) + { + (void) CopyMagickString(buffer,"\n ",MaxTextExtent); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + count=0; + }; + bit=0; + byte=0; + } + p++; + } + if (bit != 0) + { + /* + Write a bitmap byte to the image file. + */ + byte>>=(8-bit); + (void) FormatLocaleString(buffer,MaxTextExtent,"0x%02X, ", + (unsigned int) (byte & 0xff)); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + count++; + if (count == 12) + { + (void) CopyMagickString(buffer,"\n ",MaxTextExtent); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + count=0; + }; + bit=0; + byte=0; + }; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + (void) CopyMagickString(buffer,"};\n",MaxTextExtent); + (void) WriteBlob(image,strlen(buffer),(unsigned char *) buffer); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/xc.c b/ImageMagick-6.9.12-44/coders/xc.c new file mode 100644 index 0000000..7535cad --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/xc.c @@ -0,0 +1,244 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% X X CCCC % +% X X C % +% X C % +% X X C % +% X X CCCC % +% % +% % +% Read Constant Color Image. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d X C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadXCImage creates a constant image and initializes it to the +% X server color as specified by the filename. It allocates the memory +% necessary for the new Image structure and returns a pointer to the new +% image. +% +% The format of the ReadXCImage method is: +% +% Image *ReadXCImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: The image. +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadXCImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *image; + + IndexPacket + index, + *indexes; + + MagickBooleanType + status; + + MagickPixelPacket + color; + + PixelPacket + pixel; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + y; + + /* + Initialize Image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if (image->columns == 0) + image->columns=1; + if (image->rows == 0) + image->rows=1; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent); + status=QueryMagickColor((char *) image_info->filename,&color,exception); + if (status == MagickFalse) + { + image=DestroyImage(image); + return((Image *) NULL); + } + (void) SetImageColorspace(image,color.colorspace); + image->matte=color.matte; + (void) memset(&pixel,0,sizeof(pixel)); + index=0; + SetPixelPacket(image,&color,&pixel,&index); + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + *q++=pixel; + if (image->colorspace == CMYKColorspace) + { + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,index); + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r X C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterXCImage() adds attributes for the XC image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterXCImage method is: +% +% size_t RegisterXCImage(void) +% +*/ +ModuleExport size_t RegisterXCImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("XC"); + entry->decoder=(DecodeImageHandler *) ReadXCImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Constant image uniform color"); + entry->magick_module=ConstantString("XC"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("CANVAS"); + entry->decoder=(DecodeImageHandler *) ReadXCImage; + entry->adjoin=MagickFalse; + entry->format_type=ImplicitFormatType; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Constant image uniform color"); + entry->magick_module=ConstantString("XC"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r X C I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterXCImage() removes format registrations made by the +% XC module from the list of supported formats. +% +% The format of the UnregisterXCImage method is: +% +% UnregisterXCImage(void) +% +*/ +ModuleExport void UnregisterXCImage(void) +{ + (void) UnregisterMagickInfo("CANVAS"); + (void) UnregisterMagickInfo("XC"); +} diff --git a/ImageMagick-6.9.12-44/coders/xcf.c b/ImageMagick-6.9.12-44/coders/xcf.c new file mode 100644 index 0000000..bc3d574 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/xcf.c @@ -0,0 +1,1553 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% X X CCCC FFFFF % +% X X C F % +% X C FFF % +% X X C F % +% X X CCCC F % +% % +% % +% Read GIMP XCF Image Format % +% % +% Software Design % +% Leonard Rosenthol % +% November 2001 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/composite.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/pixel.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Typedef declarations. +*/ +typedef enum +{ + GIMP_RGB, + GIMP_GRAY, + GIMP_INDEXED +} GimpImageBaseType; + +typedef enum +{ + PROP_END = 0, + PROP_COLORMAP = 1, + PROP_ACTIVE_LAYER = 2, + PROP_ACTIVE_CHANNEL = 3, + PROP_SELECTION = 4, + PROP_FLOATING_SELECTION = 5, + PROP_OPACITY = 6, + PROP_MODE = 7, + PROP_VISIBLE = 8, + PROP_LINKED = 9, + PROP_PRESERVE_TRANSPARENCY = 10, + PROP_APPLY_MASK = 11, + PROP_EDIT_MASK = 12, + PROP_SHOW_MASK = 13, + PROP_SHOW_MASKED = 14, + PROP_OFFSETS = 15, + PROP_COLOR = 16, + PROP_COMPRESSION = 17, + PROP_GUIDES = 18, + PROP_RESOLUTION = 19, + PROP_TATTOO = 20, + PROP_PARASITES = 21, + PROP_UNIT = 22, + PROP_PATHS = 23, + PROP_USER_UNIT = 24 +} PropType; + +typedef enum +{ + COMPRESS_NONE = 0, + COMPRESS_RLE = 1, + COMPRESS_ZLIB = 2, /* unused */ + COMPRESS_FRACTAL = 3 /* unused */ +} XcfCompressionType; + +typedef struct +{ + size_t + width, + height, + image_type, + bytes_per_pixel; + + int + compression; + + size_t + file_size; + + size_t + number_layers; + + ExceptionInfo + *exception; +} XCFDocInfo; + +typedef struct +{ + char + name[1024]; + + unsigned int + active; + + size_t + width, + height, + type, + alpha, + visible, + linked, + preserve_trans, + apply_mask, + show_mask, + edit_mask, + floating_offset; + + ssize_t + offset_x, + offset_y; + + size_t + mode, + tattoo; + + Image + *image; +} XCFLayerInfo; + +#define TILE_WIDTH 64 +#define TILE_HEIGHT 64 + +typedef struct +{ + unsigned char + red, + green, + blue, + alpha; +} XCFPixelInfo; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s X C F % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsXCF() returns MagickTrue if the image format type, identified by the +% magick string, is XCF (GIMP native format). +% +% The format of the IsXCF method is: +% +% MagickBooleanType IsXCF(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +% +*/ +static MagickBooleanType IsXCF(const unsigned char *magick,const size_t length) +{ + if (length < 8) + return(MagickFalse); + if (LocaleNCompare((char *) magick,"gimp xcf",8) == 0) + return(MagickTrue); + return(MagickFalse); +} + +typedef enum +{ + GIMP_NORMAL_MODE, + GIMP_DISSOLVE_MODE, + GIMP_BEHIND_MODE, + GIMP_MULTIPLY_MODE, + GIMP_SCREEN_MODE, + GIMP_OVERLAY_MODE, + GIMP_DIFFERENCE_MODE, + GIMP_ADDITION_MODE, + GIMP_SUBTRACT_MODE, + GIMP_DARKEN_ONLY_MODE, + GIMP_LIGHTEN_ONLY_MODE, + GIMP_HUE_MODE, + GIMP_SATURATION_MODE, + GIMP_COLOR_MODE, + GIMP_VALUE_MODE, + GIMP_DIVIDE_MODE, + GIMP_DODGE_MODE, + GIMP_BURN_MODE, + GIMP_HARDLIGHT_MODE +} GimpLayerModeEffects; + +/* + Simple utility routine to convert between PSD blending modes and + ImageMagick compositing operators +*/ +static CompositeOperator GIMPBlendModeToCompositeOperator( + size_t blendMode) +{ + switch ( blendMode ) + { + case GIMP_NORMAL_MODE: return(OverCompositeOp); + case GIMP_DISSOLVE_MODE: return(DissolveCompositeOp); + case GIMP_MULTIPLY_MODE: return(MultiplyCompositeOp); + case GIMP_SCREEN_MODE: return(ScreenCompositeOp); + case GIMP_OVERLAY_MODE: return(OverlayCompositeOp); + case GIMP_DIFFERENCE_MODE: return(DifferenceCompositeOp); + case GIMP_ADDITION_MODE: return(ModulusAddCompositeOp); + case GIMP_SUBTRACT_MODE: return(ModulusSubtractCompositeOp); + case GIMP_DARKEN_ONLY_MODE: return(DarkenCompositeOp); + case GIMP_LIGHTEN_ONLY_MODE: return(LightenCompositeOp); + case GIMP_HUE_MODE: return(HueCompositeOp); + case GIMP_SATURATION_MODE: return(SaturateCompositeOp); + case GIMP_COLOR_MODE: return(ColorizeCompositeOp); + case GIMP_DODGE_MODE: return(ColorDodgeCompositeOp); + case GIMP_BURN_MODE: return(ColorBurnCompositeOp); + case GIMP_HARDLIGHT_MODE: return(HardLightCompositeOp); + case GIMP_DIVIDE_MODE: return(DivideDstCompositeOp); + /* these are the ones we don't support...yet */ + case GIMP_BEHIND_MODE: return(OverCompositeOp); + case GIMP_VALUE_MODE: return(OverCompositeOp); + default: return(OverCompositeOp); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b S t r i n g W i t h L o n g S i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobStringWithLongSize reads characters from a blob or file +% starting with a ssize_t length byte and then characters to that length +% +% The format of the ReadBlobStringWithLongSize method is: +% +% char *ReadBlobStringWithLongSize(Image *image,char *string, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o string: the address of a character buffer. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static char *ReadBlobStringWithLongSize(Image *image,char *string,size_t max, + ExceptionInfo *exception) +{ + int + c; + + MagickOffsetType + offset; + + ssize_t + i; + + size_t + length; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(max != 0); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + length=ReadBlobMSBLong(image); + for (i=0; i < (ssize_t) MagickMin(length,max-1); i++) + { + c=ReadBlobByte(image); + if (c == EOF) + return((char *) NULL); + string[i]=(char) c; + } + string[i]='\0'; + offset=SeekBlob(image,(MagickOffsetType) (length-i),SEEK_CUR); + if (offset < 0) + (void) ThrowMagickException(exception,GetMagickModule(), + CorruptImageError,"ImproperImageHeader","`%s'",image->filename); + return(string); +} + +static MagickBooleanType load_tile(Image *image,Image *tile_image, + XCFDocInfo *inDocInfo,XCFLayerInfo *inLayerInfo,size_t data_length, + ExceptionInfo *exception) +{ + ssize_t + y; + + ssize_t + x; + + PixelPacket + *q; + + size_t + extent; + + ssize_t + count; + + unsigned char + *graydata; + + XCFPixelInfo + *xcfdata, + *xcfodata; + + extent=0; + if (inDocInfo->image_type == GIMP_GRAY) + extent=tile_image->columns*tile_image->rows*sizeof(*graydata); + else + if (inDocInfo->image_type == GIMP_RGB) + extent=tile_image->columns*tile_image->rows*sizeof(*xcfdata); + if (extent > data_length) + ThrowBinaryException(CorruptImageError,"NotEnoughPixelData", + image->filename); + xcfdata=(XCFPixelInfo *) AcquireQuantumMemory(MagickMax(data_length, + tile_image->columns*tile_image->rows),sizeof(*xcfdata)); + if (xcfdata == (XCFPixelInfo *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + xcfodata=xcfdata; + graydata=(unsigned char *) xcfdata; /* used by gray and indexed */ + count=ReadBlob(image,data_length,(unsigned char *) xcfdata); + if (count != (ssize_t) data_length) + { + xcfodata=(XCFPixelInfo *) RelinquishMagickMemory(xcfodata); + ThrowBinaryException(CorruptImageError,"NotEnoughPixelData", + image->filename); + } + for (y=0; y < (ssize_t) tile_image->rows; y++) + { + q=GetAuthenticPixels(tile_image,0,y,tile_image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + if (inDocInfo->image_type == GIMP_GRAY) + { + for (x=0; x < (ssize_t) tile_image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*graydata)); + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + SetPixelAlpha(q,ScaleCharToQuantum((unsigned char) + inLayerInfo->alpha)); + graydata++; + q++; + } + } + else + if (inDocInfo->image_type == GIMP_RGB) + { + for (x=0; x < (ssize_t) tile_image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(xcfdata->red)); + SetPixelGreen(q,ScaleCharToQuantum(xcfdata->green)); + SetPixelBlue(q,ScaleCharToQuantum(xcfdata->blue)); + SetPixelAlpha(q,xcfdata->alpha == 255U ? TransparentOpacity : + ScaleCharToQuantum((unsigned char) inLayerInfo->alpha)); + xcfdata++; + q++; + } + } + if (SyncAuthenticPixels(tile_image,exception) == MagickFalse) + break; + } + xcfodata=(XCFPixelInfo *) RelinquishMagickMemory(xcfodata); + return MagickTrue; +} + +static MagickBooleanType load_tile_rle(Image *image,Image *tile_image, + XCFDocInfo *inDocInfo,XCFLayerInfo *inLayerInfo,size_t data_length, + ExceptionInfo *exception) +{ + MagickOffsetType + size; + + Quantum + alpha, + data; + + PixelPacket + *q; + + size_t + length; + + ssize_t + bytes_per_pixel, + count, + i, + j; + + unsigned char + pixel, + *xcfdata, + *xcfodata, + *xcfdatalimit; + + bytes_per_pixel=(ssize_t) inDocInfo->bytes_per_pixel; + xcfdata=(unsigned char *) AcquireQuantumMemory(data_length,sizeof(*xcfdata)); + if (xcfdata == (unsigned char *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + xcfodata=xcfdata; + count=ReadBlob(image, (size_t) data_length, xcfdata); + xcfdatalimit = xcfodata+count-1; + alpha=ScaleCharToQuantum((unsigned char) inLayerInfo->alpha); + for (i=0; i < bytes_per_pixel; i++) + { + q=GetAuthenticPixels(tile_image,0,0,tile_image->columns,tile_image->rows, + exception); + if (q == (PixelPacket *) NULL) + continue; + size=(MagickOffsetType) tile_image->rows*tile_image->columns; + while (size > 0) + { + if (xcfdata > xcfdatalimit) + goto bogus_rle; + pixel=(*xcfdata++); + length=(size_t) pixel; + if (length >= 128) + { + length=255-(length-1); + if (length == 128) + { + if (xcfdata >= xcfdatalimit) + goto bogus_rle; + length=(size_t) ((*xcfdata << 8) + xcfdata[1]); + xcfdata+=2; + } + size-=length; + if (size < 0) + goto bogus_rle; + if (&xcfdata[length-1] > xcfdatalimit) + goto bogus_rle; + while (length-- > 0) + { + data=ScaleCharToQuantum(*xcfdata++); + switch (i) + { + case 0: + { + SetPixelRed(q,data); + if (inDocInfo->image_type == GIMP_GRAY) + { + SetPixelGreen(q,data); + SetPixelBlue(q,data); + } + else + { + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + } + SetPixelAlpha(q,alpha); + break; + } + case 1: + { + if (inDocInfo->image_type == GIMP_GRAY) + SetPixelAlpha(q,data); + else + SetPixelGreen(q,data); + break; + } + case 2: + { + SetPixelBlue(q,data); + break; + } + case 3: + { + SetPixelAlpha(q,data); + break; + } + } + q++; + } + } + else + { + length+=1; + if (length == 128) + { + if (xcfdata >= xcfdatalimit) + goto bogus_rle; + length=(size_t) ((*xcfdata << 8) + xcfdata[1]); + xcfdata+=2; + } + size-=length; + if (size < 0) + goto bogus_rle; + if (xcfdata > xcfdatalimit) + goto bogus_rle; + pixel=(*xcfdata++); + for (j=0; j < (ssize_t) length; j++) + { + data=ScaleCharToQuantum(pixel); + switch (i) + { + case 0: + { + SetPixelRed(q,data); + if (inDocInfo->image_type == GIMP_GRAY) + { + SetPixelGreen(q,data); + SetPixelBlue(q,data); + } + else + { + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + } + SetPixelAlpha(q,alpha); + break; + } + case 1: + { + if (inDocInfo->image_type == GIMP_GRAY) + SetPixelAlpha(q,data); + else + SetPixelGreen(q,data); + break; + } + case 2: + { + SetPixelBlue(q,data); + break; + } + case 3: + { + SetPixelAlpha(q,data); + break; + } + } + q++; + } + } + } + if (SyncAuthenticPixels(tile_image,exception) == MagickFalse) + break; + } + xcfodata=(unsigned char *) RelinquishMagickMemory(xcfodata); + return(MagickTrue); + + bogus_rle: + if (xcfodata != (unsigned char *) NULL) + xcfodata=(unsigned char *) RelinquishMagickMemory(xcfodata); + return(MagickFalse); +} + +static MagickBooleanType load_level(Image *image,XCFDocInfo *inDocInfo, + XCFLayerInfo *inLayerInfo,ExceptionInfo *exception) +{ + int + destLeft = 0, + destTop = 0; + + Image* + tile_image; + + MagickBooleanType + status; + + MagickOffsetType + saved_pos, + offset, + offset2; + + ssize_t + i; + + size_t + width, + height, + ntiles, + ntile_rows, + ntile_cols, + tile_image_width, + tile_image_height; + + /* start reading the data */ + width=ReadBlobMSBLong(image); + height=ReadBlobMSBLong(image); + + /* + Read in the first tile offset. If it is '0', then this tile level is empty + and we can simply return. + */ + offset=(MagickOffsetType) ReadBlobMSBLong(image); + if (EOFBlob(image) != MagickFalse) + ThrowBinaryException(CorruptImageError,"UnexpectedEndOfFile", + image->filename); + if (offset == 0) + { + (void) SetImageBackgroundColor(image); + return(MagickTrue); + } + /* + Initialize the reference for the in-memory tile-compression. + */ + ntile_rows=(height+TILE_HEIGHT-1)/TILE_HEIGHT; + ntile_cols=(width+TILE_WIDTH-1)/TILE_WIDTH; + ntiles=ntile_rows*ntile_cols; + for (i = 0; i < (ssize_t) ntiles; i++) + { + status=MagickFalse; + if (offset == 0) + ThrowBinaryException(CorruptImageError,"NotEnoughTiles",image->filename); + /* + Save the current position as it is where the next tile offset is stored. + */ + saved_pos=TellBlob(image); + /* read in the offset of the next tile so we can calculate the amount + of data needed for this tile*/ + offset2=(MagickOffsetType) ReadBlobMSBLong(image); + if ((MagickSizeType) offset2 >= inDocInfo->file_size) + ThrowBinaryException(CorruptImageError,"InsufficientImageDataInFile", + image->filename); + /* if the offset is 0 then we need to read in the maximum possible + allowing for negative compression */ + if (offset2 == 0) + offset2=(MagickOffsetType) (offset + TILE_WIDTH * TILE_WIDTH * 4* 1.5); + /* seek to the tile offset */ + if ((offset > offset2) || ( SeekBlob(image, offset, SEEK_SET) != offset)) + ThrowBinaryException(CorruptImageError,"InsufficientImageDataInFile", + image->filename); + + /* + Allocate the image for the tile. NOTE: the last tile in a row or + column may not be a full tile! + */ + tile_image_width=(size_t) (destLeft == (int) ntile_cols-1 ? + (int) width % TILE_WIDTH : TILE_WIDTH); + if (tile_image_width == 0) + tile_image_width=TILE_WIDTH; + tile_image_height = (size_t) (destTop == (int) ntile_rows-1 ? + (int) height % TILE_HEIGHT : TILE_HEIGHT); + if (tile_image_height == 0) + tile_image_height=TILE_HEIGHT; + tile_image=CloneImage(inLayerInfo->image,tile_image_width, + tile_image_height,MagickTrue,exception); + if (tile_image == (Image *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + (void) SetImageBackgroundColor(tile_image); + + /* read in the tile */ + switch (inDocInfo->compression) + { + case COMPRESS_NONE: + status=load_tile(image,tile_image,inDocInfo,inLayerInfo,(size_t) + (offset2-offset),&image->exception); + break; + case COMPRESS_RLE: + status=load_tile_rle(image,tile_image,inDocInfo,inLayerInfo,(size_t) + (offset2-offset),&image->exception); + break; + case COMPRESS_ZLIB: + tile_image=DestroyImage(tile_image); + ThrowBinaryException(CoderError,"ZipCompressNotSupported", + image->filename) + case COMPRESS_FRACTAL: + tile_image=DestroyImage(tile_image); + ThrowBinaryException(CoderError,"FractalCompressNotSupported", + image->filename) + } + + /* composite the tile onto the layer's image, and then destroy it */ + if (status != MagickFalse) + (void) CompositeImage(inLayerInfo->image,CopyCompositeOp,tile_image, + destLeft * TILE_WIDTH,destTop*TILE_HEIGHT); + tile_image=DestroyImage(tile_image); + + if (status == MagickFalse) + return(MagickFalse); + /* adjust tile position */ + destLeft++; + if (destLeft >= (int) ntile_cols) + { + destLeft = 0; + destTop++; + } + /* restore the saved position so we'll be ready to + * read the next offset. + */ + offset=SeekBlob(image, saved_pos, SEEK_SET); + /* read in the offset of the next tile */ + offset=(MagickOffsetType) ReadBlobMSBLong(image); + } + if (offset != 0) + ThrowBinaryException(CorruptImageError,"CorruptImage",image->filename) + return(MagickTrue); +} + +static MagickBooleanType load_hierarchy(Image *image,XCFDocInfo *inDocInfo, + XCFLayerInfo *inLayer) +{ + MagickOffsetType + saved_pos, + offset, + junk; + + (void) ReadBlobMSBLong(image); /* width */ + (void) ReadBlobMSBLong(image); /* height */ + inDocInfo->bytes_per_pixel=ReadBlobMSBLong(image); + + /* load in the levels...we make sure that the number of levels + * calculated when the TileManager was created is the same + * as the number of levels found in the file. + */ + offset=(MagickOffsetType) ReadBlobMSBLong(image); /* top level */ + if ((MagickSizeType) offset >= GetBlobSize(image)) + ThrowBinaryImageException(CorruptImageError,"InsufficientImageDataInFile", + image->filename); + + /* discard offsets for layers below first, if any. + */ + do + { + junk=(MagickOffsetType) ReadBlobMSBLong(image); + } + while (junk != 0); + + /* save the current position as it is where the + * next level offset is stored. + */ + saved_pos=TellBlob(image); + + /* seek to the level offset */ + if (SeekBlob(image, offset, SEEK_SET) != offset) + ThrowBinaryImageException(CorruptImageError,"InsufficientImageDataInFile", + image->filename); + + /* read in the level */ + if (load_level (image, inDocInfo, inLayer, &image->exception) == 0) + return(MagickFalse); + /* restore the saved position so we'll be ready to + * read the next offset. + */ + offset=SeekBlob(image, saved_pos, SEEK_SET); + return(MagickTrue); +} + +static void InitXCFImage(XCFLayerInfo *outLayer) +{ + outLayer->image->page.x=outLayer->offset_x; + outLayer->image->page.y=outLayer->offset_y; + outLayer->image->page.width=outLayer->width; + outLayer->image->page.height=outLayer->height; + (void) SetImageProperty(outLayer->image,"label",(char *)outLayer->name); +} + +static MagickBooleanType ReadOneLayer(const ImageInfo *image_info,Image* image, + XCFDocInfo* inDocInfo,XCFLayerInfo *outLayer,const ssize_t layer) +{ + MagickBooleanType + status; + + MagickOffsetType + offset; + + unsigned int + foundPropEnd = 0; + + size_t + hierarchy_offset, + layer_mask_offset; + + /* clear the block! */ + (void) memset( outLayer, 0, sizeof( XCFLayerInfo ) ); + /* read in the layer width, height, type and name */ + outLayer->width = ReadBlobMSBLong(image); + outLayer->height = ReadBlobMSBLong(image); + outLayer->type = ReadBlobMSBLong(image); + (void) ReadBlobStringWithLongSize(image, outLayer->name, + sizeof(outLayer->name),&image->exception); + if (EOFBlob(image) != MagickFalse) + ThrowBinaryImageException(CorruptImageError,"InsufficientImageDataInFile", + image->filename); + if ((outLayer->width == 0) || (outLayer->height == 0)) + ThrowBinaryImageException(CorruptImageError,"ImproperImageHeader", + image->filename); + /* read the layer properties! */ + foundPropEnd = 0; + while ( (foundPropEnd == MagickFalse) && (EOFBlob(image) == MagickFalse) ) { + PropType prop_type = (PropType) ReadBlobMSBLong(image); + size_t prop_size = ReadBlobMSBLong(image); + switch (prop_type) + { + case PROP_END: + foundPropEnd = 1; + break; + case PROP_ACTIVE_LAYER: + outLayer->active = 1; + break; + case PROP_FLOATING_SELECTION: + outLayer->floating_offset = ReadBlobMSBLong(image); + break; + case PROP_OPACITY: + outLayer->alpha = ReadBlobMSBLong(image); + break; + case PROP_VISIBLE: + outLayer->visible = ReadBlobMSBLong(image); + break; + case PROP_LINKED: + outLayer->linked = ReadBlobMSBLong(image); + break; + case PROP_PRESERVE_TRANSPARENCY: + outLayer->preserve_trans = ReadBlobMSBLong(image); + break; + case PROP_APPLY_MASK: + outLayer->apply_mask = ReadBlobMSBLong(image); + break; + case PROP_EDIT_MASK: + outLayer->edit_mask = ReadBlobMSBLong(image); + break; + case PROP_SHOW_MASK: + outLayer->show_mask = ReadBlobMSBLong(image); + break; + case PROP_OFFSETS: + outLayer->offset_x = ReadBlobMSBSignedLong(image); + outLayer->offset_y = ReadBlobMSBSignedLong(image); + break; + case PROP_MODE: + outLayer->mode = ReadBlobMSBLong(image); + break; + case PROP_TATTOO: + outLayer->preserve_trans = ReadBlobMSBLong(image); + break; + case PROP_PARASITES: + { + if (DiscardBlobBytes(image,prop_size) == MagickFalse) + ThrowFileException(&image->exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + + /* + ssize_t base = info->cp; + GimpParasite *p; + while (info->cp - base < prop_size) + { + p = xcf_load_parasite(info); + gimp_drawable_parasite_attach(GIMP_DRAWABLE(layer), p); + gimp_parasite_free(p); + } + if (info->cp - base != prop_size) + g_message ("Error detected while loading a layer's parasites"); + */ + } + break; + default: + /* g_message ("unexpected/unknown layer property: %d (skipping)", + prop_type); */ + + { + int buf[16]; + ssize_t amount; + + /* read over it... */ + while ((prop_size > 0) && (EOFBlob(image) == MagickFalse)) + { + amount = (ssize_t) MagickMin(16, prop_size); + amount = ReadBlob(image, (size_t) amount, (unsigned char *) &buf); + if (!amount) + ThrowBinaryImageException(CorruptImageError,"CorruptImage", + image->filename); + prop_size -= (size_t) MagickMin(16, (size_t) amount); + } + } + break; + } + } + if (EOFBlob(image) != MagickFalse) + ThrowBinaryImageException(CorruptImageError,"UnexpectedEndOfFile", + image->filename); + if (foundPropEnd == MagickFalse) + return(MagickFalse); + /* allocate the image for this layer */ + if (image_info->number_scenes != 0) + { + ssize_t + scene; + + scene=inDocInfo->number_layers-layer-1; + if (scene > (ssize_t) (image_info->scene+image_info->number_scenes-1)) + { + outLayer->image=CloneImage(image,0,0,MagickTrue,&image->exception); + if (outLayer->image == (Image *) NULL) + return(MagickFalse); + InitXCFImage(outLayer); + return(MagickTrue); + } + } + /* allocate the image for this layer */ + outLayer->image=CloneImage(image,outLayer->width, outLayer->height,MagickTrue, + &image->exception); + if (outLayer->image == (Image *) NULL) + return(MagickFalse); + status=SetImageExtent(outLayer->image,outLayer->image->columns, + outLayer->image->rows); + if (status != MagickFalse) + status=ResetImagePixels(image,&image->exception); + if (status == MagickFalse) + { + InheritException(&image->exception,&outLayer->image->exception); + outLayer->image=DestroyImageList(outLayer->image); + return(MagickFalse); + } + /* clear the image based on the layer opacity */ + outLayer->image->background_color.opacity= + ScaleCharToQuantum((unsigned char) (255-outLayer->alpha)); + if (outLayer->alpha != 255U) + { + outLayer->image->matte=MagickTrue; + (void) SetImageBackgroundColor(outLayer->image); + } + + InitXCFImage(outLayer); + + /* set the compositing mode */ + outLayer->image->compose = GIMPBlendModeToCompositeOperator( outLayer->mode ); + if ( outLayer->visible == MagickFalse ) + { + /* BOGUS: should really be separate member var! */ + outLayer->image->compose = NoCompositeOp; + } + + /* read the hierarchy and layer mask offsets */ + hierarchy_offset = ReadBlobMSBLong(image); + layer_mask_offset = ReadBlobMSBLong(image); + + /* read in the hierarchy */ + offset=SeekBlob(image, (MagickOffsetType) hierarchy_offset, SEEK_SET); + if (offset != (MagickOffsetType) hierarchy_offset) + ThrowBinaryImageException(CorruptImageError,"InvalidImageHeader", + image->filename); + if (load_hierarchy (image, inDocInfo, outLayer) == 0) + return(MagickFalse); + + /* read in the layer mask */ + if (layer_mask_offset != 0) + { + offset=SeekBlob(image, (MagickOffsetType) layer_mask_offset, SEEK_SET); + +#if 0 /* BOGUS: support layer masks! */ + layer_mask = xcf_load_layer_mask (info, gimage); + if (layer_mask == 0) + goto error; + + /* set the offsets of the layer_mask */ + GIMP_DRAWABLE (layer_mask)->offset_x = GIMP_DRAWABLE (layer)->offset_x; + GIMP_DRAWABLE (layer_mask)->offset_y = GIMP_DRAWABLE (layer)->offset_y; + + gimp_layer_add_mask (layer, layer_mask, MagickFalse); + + layer->mask->apply_mask = apply_mask; + layer->mask->edit_mask = edit_mask; + layer->mask->show_mask = show_mask; +#endif + } + + /* attach the floating selection... */ +#if 0 /* BOGUS: we may need to read this, even if we don't support it! */ + if (add_floating_sel) + { + GimpLayer *floating_sel; + + floating_sel = info->floating_sel; + floating_sel_attach (floating_sel, GIMP_DRAWABLE (layer)); + } +#endif + + return MagickTrue; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d X C F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadXCFImage() reads a GIMP (GNU Image Manipulation Program) image +% file and returns it. It allocates the memory necessary for the new Image +% structure and returns a pointer to the new image. +% +% The format of the ReadXCFImage method is: +% +% image=ReadXCFImage(image_info) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + magick[14]; + + Image + *image; + + int + foundPropEnd = 0; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + ssize_t + i; + + size_t + image_type, + length; + + ssize_t + count; + + XCFDocInfo + doc_info; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + count=ReadBlob(image,14,(unsigned char *) magick); + if ((count != 14) || + (LocaleNCompare((char *) magick,"gimp xcf",8) != 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + (void) memset(&doc_info,0,sizeof(XCFDocInfo)); + doc_info.exception=exception; + doc_info.width=ReadBlobMSBLong(image); + doc_info.height=ReadBlobMSBLong(image); + if ((doc_info.width > 262144) || (doc_info.height > 262144)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + doc_info.image_type=ReadBlobMSBLong(image); + /* + Initialize image attributes. + */ + image->columns=doc_info.width; + image->rows=doc_info.height; + image_type=doc_info.image_type; + doc_info.file_size=GetBlobSize(image); + image->compression=NoCompression; + image->depth=8; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if (status != MagickFalse) + status=ResetImagePixels(image,exception); + if (image_type == GIMP_INDEXED) + ThrowReaderException(CoderError,"ColormapTypeNotSupported"); + if (image_type == GIMP_RGB) + SetImageColorspace(image,sRGBColorspace); + else if (image_type == GIMP_GRAY) + SetImageColorspace(image,GRAYColorspace); + else + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + (void) SetImageBackgroundColor(image); + (void) SetImageOpacity(image,OpaqueOpacity); + /* + Read properties. + */ + while ((foundPropEnd == MagickFalse) && (EOFBlob(image) == MagickFalse)) + { + PropType prop_type = (PropType) ReadBlobMSBLong(image); + size_t prop_size = ReadBlobMSBLong(image); + + switch (prop_type) + { + case PROP_END: + foundPropEnd=1; + break; + case PROP_COLORMAP: + { + /* Cannot rely on prop_size here--the value is set incorrectly + by some Gimp versions. + */ + size_t num_colours = ReadBlobMSBLong(image); + if (DiscardBlobBytes(image,3*num_colours) == MagickFalse) + ThrowFileException(&image->exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + /* + if (info->file_version == 0) + { + gint i; + + g_message (_("XCF warning: version 0 of XCF file format\n" + "did not save indexed colormaps correctly.\n" + "Substituting grayscale map.")); + info->cp += + xcf_read_int32 (info->fp, (guint32*) &gimage->num_cols, 1); + gimage->cmap = g_new (guchar, gimage->num_cols*3); + xcf_seek_pos (info, info->cp + gimage->num_cols); + for (i = 0; inum_cols; i++) + { + gimage->cmap[i*3+0] = i; + gimage->cmap[i*3+1] = i; + gimage->cmap[i*3+2] = i; + } + } + else + { + info->cp += + xcf_read_int32 (info->fp, (guint32*) &gimage->num_cols, 1); + gimage->cmap = g_new (guchar, gimage->num_cols*3); + info->cp += + xcf_read_int8 (info->fp, + (guint8*) gimage->cmap, gimage->num_cols*3); + } + */ + break; + } + case PROP_COMPRESSION: + { + doc_info.compression = ReadBlobByte(image); + if ((doc_info.compression != COMPRESS_NONE) && + (doc_info.compression != COMPRESS_RLE) && + (doc_info.compression != COMPRESS_ZLIB) && + (doc_info.compression != COMPRESS_FRACTAL)) + ThrowReaderException(CorruptImageError,"UnrecognizedImageCompression"); + } + break; + + case PROP_GUIDES: + { + /* just skip it - we don't care about guides */ + if (DiscardBlobBytes(image,prop_size) == MagickFalse) + ThrowFileException(&image->exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + } + break; + + case PROP_RESOLUTION: + { + /* float xres = (float) */ (void) ReadBlobMSBLong(image); + /* float yres = (float) */ (void) ReadBlobMSBLong(image); + + /* + if (xres < GIMP_MIN_RESOLUTION || xres > GIMP_MAX_RESOLUTION || + yres < GIMP_MIN_RESOLUTION || yres > GIMP_MAX_RESOLUTION) + { + g_message ("Warning, resolution out of range in XCF file"); + xres = gimage->gimp->config->default_xresolution; + yres = gimage->gimp->config->default_yresolution; + } + */ + + + /* BOGUS: we don't write these yet because we aren't + reading them properly yet :( + image->x_resolution = xres; + image->y_resolution = yres; + */ + } + break; + + case PROP_TATTOO: + { + /* we need to read it, even if we ignore it */ + /*size_t tattoo_state = */ (void) ReadBlobMSBLong(image); + } + break; + + case PROP_PARASITES: + { + /* BOGUS: we may need these for IPTC stuff */ + if (DiscardBlobBytes(image,prop_size) == MagickFalse) + ThrowFileException(&image->exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + /* + gssize_t base = info->cp; + GimpParasite *p; + + while (info->cp - base < prop_size) + { + p = xcf_load_parasite (info); + gimp_image_parasite_attach (gimage, p); + gimp_parasite_free (p); + } + if (info->cp - base != prop_size) + g_message ("Error detected while loading an image's parasites"); + */ + } + break; + + case PROP_UNIT: + { + /* BOGUS: ignore for now... */ + /*size_t unit = */ (void) ReadBlobMSBLong(image); + } + break; + + case PROP_PATHS: + { + /* BOGUS: just skip it for now */ + if (DiscardBlobBytes(image,prop_size) == MagickFalse) + ThrowFileException(&image->exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + + /* + PathList *paths = xcf_load_bzpaths (gimage, info); + gimp_image_set_paths (gimage, paths); + */ + } + break; + + case PROP_USER_UNIT: + { + char unit_string[1000]; + /*BOGUS: ignored for now */ + /*float factor = (float) */ (void) ReadBlobMSBLong(image); + /* size_t digits = */ (void) ReadBlobMSBLong(image); + for (i=0; i<5; i++) + (void) ReadBlobStringWithLongSize(image, unit_string, + sizeof(unit_string),&image->exception); + } + break; + + default: + { + int buf[16]; + ssize_t amount; + + /* read over it... */ + while ((prop_size > 0) && (EOFBlob(image) == MagickFalse)) + { + amount=(ssize_t) MagickMin(16, prop_size); + amount=(ssize_t) ReadBlob(image,(size_t) amount,(unsigned char *) &buf); + if (!amount) + ThrowReaderException(CorruptImageError,"CorruptImage"); + prop_size -= (size_t) MagickMin(16,(size_t) amount); + } + } + break; + } + } + if (foundPropEnd == MagickFalse) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + { + ; /* do nothing, were just pinging! */ + } + else + { + int + current_layer = 0, + foundAllLayers = MagickFalse, + number_layers = 0; + + MagickOffsetType + oldPos=TellBlob(image); + + XCFLayerInfo + *layer_info; + + /* + The read pointer. + */ + do + { + ssize_t offset = ReadBlobMSBSignedLong(image); + if (offset == 0) + foundAllLayers=MagickTrue; + else + number_layers++; + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + } while (foundAllLayers == MagickFalse); + if (AcquireMagickResource(ListLengthResource,number_layers) == MagickFalse) + ThrowReaderException(ResourceLimitError,"ListLengthExceedsLimit"); + doc_info.number_layers=number_layers; + offset=SeekBlob(image,oldPos,SEEK_SET); /* restore the position! */ + if (offset < 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + /* allocate our array of layer info blocks */ + length=(size_t) number_layers; + layer_info=(XCFLayerInfo *) AcquireQuantumMemory(length, + sizeof(*layer_info)); + if (layer_info == (XCFLayerInfo *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(layer_info,0,number_layers*sizeof(XCFLayerInfo)); + for ( ; ; ) + { + MagickBooleanType + layer_ok; + + MagickOffsetType + offset, + saved_pos; + + /* read in the offset of the next layer */ + offset=(MagickOffsetType) ReadBlobMSBLong(image); + /* if the offset is 0 then we are at the end + * of the layer list. + */ + if (offset == 0) + break; + /* save the current position as it is where the + * next layer offset is stored. + */ + saved_pos=TellBlob(image); + /* seek to the layer offset */ + layer_ok=MagickFalse; + if (SeekBlob(image,offset,SEEK_SET) == offset) + { + /* read in the layer */ + layer_ok=ReadOneLayer(image_info,image,&doc_info, + &layer_info[current_layer],current_layer); + } + if (layer_ok == MagickFalse) + { + ssize_t j; + + for (j=0; j <= current_layer; j++) + if (layer_info[j].image != (Image *) NULL) + layer_info[j].image=DestroyImage(layer_info[j].image); + layer_info=(XCFLayerInfo *) RelinquishMagickMemory(layer_info); + ThrowReaderException(ResourceLimitError,"NotEnoughPixelData"); + } + /* restore the saved position so we'll be ready to + * read the next offset. + */ + offset=SeekBlob(image, saved_pos, SEEK_SET); + current_layer++; + } +#if 0 + { + /* NOTE: XCF layers are REVERSED from composite order! */ + signed int j; + for (j=number_layers-1; j>=0; j--) { + /* BOGUS: need to consider layer blending modes!! */ + + if ( layer_info[j].visible ) { /* only visible ones, please! */ + CompositeImage(image, OverCompositeOp, layer_info[j].image, + layer_info[j].offset_x, layer_info[j].offset_y ); + layer_info[j].image =DestroyImage( layer_info[j].image ); + + /* If we do this, we'll get REAL gray images! */ + if ( image_type == GIMP_GRAY ) { + QuantizeInfo qi; + GetQuantizeInfo(&qi); + qi.colorspace = GRAYColorspace; + QuantizeImage( &qi, layer_info[j].image ); + } + } + } + } +#else + { + /* NOTE: XCF layers are REVERSED from composite order! */ + ssize_t j; + + /* now reverse the order of the layers as they are put + into subimages + */ + for (j=(ssize_t) number_layers-1; j >= 0; j--) + AppendImageToList(&image,layer_info[j].image); + } +#endif + + layer_info=(XCFLayerInfo *) RelinquishMagickMemory(layer_info); + +#if 0 /* BOGUS: do we need the channels?? */ + while (MagickTrue) + { + /* read in the offset of the next channel */ + info->cp += xcf_read_int32 (info->fp, &offset, 1); + + /* if the offset is 0 then we are at the end + * of the channel list. + */ + if (offset == 0) + break; + + /* save the current position as it is where the + * next channel offset is stored. + */ + saved_pos = info->cp; + + /* seek to the channel offset */ + xcf_seek_pos (info, offset); + + /* read in the layer */ + channel = xcf_load_channel (info, gimage); + if (channel == 0) + goto error; + + num_successful_elements++; + + /* add the channel to the image if its not the selection */ + if (channel != gimage->selection_mask) + gimp_image_add_channel (gimage, channel, -1); + + /* restore the saved position so we'll be ready to + * read the next offset. + */ + xcf_seek_pos (info, saved_pos); + } +#endif + } + + (void) CloseBlob(image); + if (GetNextImageInList(image) != (Image *) NULL) + DestroyImage(RemoveFirstImageFromList(&image)); + if (image_type == GIMP_GRAY) + image->type=GrayscaleType; + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r X C F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterXCFImage() adds attributes for the XCF image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterXCFImage method is: +% +% size_t RegisterXCFImage(void) +% +*/ +ModuleExport size_t RegisterXCFImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("XCF"); + entry->decoder=(DecodeImageHandler *) ReadXCFImage; + entry->magick=(IsImageFormatHandler *) IsXCF; + entry->description=ConstantString("GIMP image"); + entry->magick_module=ConstantString("XCF"); + entry->seekable_stream=MagickTrue; + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r X C F I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterXCFImage() removes format registrations made by the +% XCF module from the list of supported formats. +% +% The format of the UnregisterXCFImage method is: +% +% UnregisterXCFImage(void) +% +*/ +ModuleExport void UnregisterXCFImage(void) +{ + (void) UnregisterMagickInfo("XCF"); +} diff --git a/ImageMagick-6.9.12-44/coders/xpm.c b/ImageMagick-6.9.12-44/coders/xpm.c new file mode 100644 index 0000000..dbb7505 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/xpm.c @@ -0,0 +1,1182 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% X X PPPP M M % +% X X P P MM MM % +% X PPPP M M M % +% X X P M M % +% X X P M M % +% % +% % +% Read/Write X Windows system Pixmap Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantize.h" +#include "magick/quantum-private.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/splay-tree.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/threshold.h" +#include "magick/token.h" +#include "magick/utility.h" + +/* + Global declarations. +*/ +static SplayTreeInfo + *xpm_symbolic = (SplayTreeInfo *) NULL; + +/* + Forward declarations. +*/ +static MagickBooleanType + WritePICONImage(const ImageInfo *,Image *), + WriteXPMImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s X P M % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsXPM() returns MagickTrue if the image format type, identified by the +% magick string, is XPM. +% +% The format of the IsXPM method is: +% +% MagickBooleanType IsXPM(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. or +% blob. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsXPM(const unsigned char *magick,const size_t length) +{ + if (length < 9) + return(MagickFalse); + if (LocaleNCompare((char *) magick+1,"* XPM *",7) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d X P M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadXPMImage() reads an X11 pixmap image file and returns it. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadXPMImage method is: +% +% Image *ReadXPMImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static int CompareXPMColor(const void *target,const void *source) +{ + const char + *p, + *q; + + p=(const char *) target; + q=(const char *) source; + return(strcmp(p,q)); +} + +static ssize_t CopyXPMColor(char *destination,const char *source,size_t length) +{ + const char + *p; + + p=source; + while (length-- && (*p != '\0')) + *destination++=(*p++); + if (length != 0) + *destination='\0'; + return((ssize_t) (p-source)); +} + +static char *NextXPMLine(char *p) +{ + assert(p != (char *) NULL); + p=strchr(p,'\n'); + if (p != (char *) NULL) + p++; + return(p); +} + +static char *ParseXPMColor(char *,MagickBooleanType) + magick_attribute((__pure__)); + +static char *ParseXPMColor(char *color,MagickBooleanType search_start) +{ +#define NumberTargets 6 + + char + *p, + *r; + + const char + *q; + + ssize_t + i; + + static const char + *const targets[NumberTargets] = { "c ", "g ", "g4 ", "m ", "b ", "s " }; + + if (*color == '\0') + return((char *) NULL); + if (search_start != MagickFalse) + { + for (i=0; i < NumberTargets; i++) + { + p=color; + for (q=targets[i]; *p != '\0'; p++) + { + if (*p == '\n') + break; + if (*p != *q) + continue; + if (isspace((int) ((unsigned char) (*(p-1)))) == 0) + continue; + r=p; + for ( ; ; ) + { + if (*q == '\0') + return(p); + if (*r++ != *q++) + break; + } + q=targets[i]; + } + } + return((char *) NULL); + } + for (p=color+1; *p != '\0'; p++) + { + if (*p == '\n') + break; + if (isspace((int) ((unsigned char) (*(p-1)))) == 0) + continue; + if (isspace((int) ((unsigned char) (*p))) != 0) + continue; + for (i=0; i < NumberTargets; i++) + { + if ((*p == *targets[i]) && (*(p+1) == *(targets[i]+1))) + return(p); + } + } + return(p); +} + +static Image *ReadXPMImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + *grey, + key[MaxTextExtent], + target[MaxTextExtent], + *xpm_buffer; + + Image + *image; + + MagickBooleanType + active, + status; + + char + *next, + *p, + *q; + + IndexPacket + *indexes; + + PixelPacket + *r; + + ssize_t + x; + + size_t + length; + + SplayTreeInfo + *xpm_colors; + + ssize_t + count, + j, + y; + + unsigned long + colors, + columns, + rows, + width; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read XPM file. + */ + length=MaxTextExtent; + xpm_buffer=(char *) AcquireQuantumMemory((size_t) length,sizeof(*xpm_buffer)); + if (xpm_buffer == (char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + *xpm_buffer='\0'; + p=xpm_buffer; + while (ReadBlobString(image,p) != (char *) NULL) + { + if ((*p == '#') && ((p == xpm_buffer) || (*(p-1) == '\n'))) + continue; + if ((*p == '}') && (*(p+1) == ';')) + break; + p+=strlen(p); + if ((size_t) (p-xpm_buffer+MaxTextExtent) < length) + continue; + length<<=1; + xpm_buffer=(char *) ResizeQuantumMemory(xpm_buffer,length+MaxTextExtent, + sizeof(*xpm_buffer)); + if (xpm_buffer == (char *) NULL) + break; + p=xpm_buffer+strlen(xpm_buffer); + } + if (xpm_buffer == (char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Remove comments & read properties. + */ + count=0; + width=0; + for (p=xpm_buffer; *p != '\0'; p++) + { + char + properties[MagickPathExtent]; + + if (*p != '"') + continue; + (void) GetNextToken(p,(const char **) NULL,MagickPathExtent,properties); + count=(ssize_t) sscanf(properties,"%lu %lu %lu %lu",&columns,&rows,&colors, + &width); + image->columns=columns; + image->rows=rows; + image->colors=colors; + if (count == 4) + break; + } + if ((count != 4) || (width == 0) || (width > 3) || + (image->columns == 0) || (image->rows == 0) || + (image->colors == 0) || (image->colors > MaxColormapSize)) + { + xpm_buffer=DestroyString(xpm_buffer); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + /* + Remove unquoted characters. + */ + active=MagickFalse; + for (q=xpm_buffer; *p != '\0'; ) + { + if (*p++ == '"') + { + if (active != MagickFalse) + *q++='\n'; + active=active != MagickFalse ? MagickFalse : MagickTrue; + } + if (active != MagickFalse) + *q++=(*p); + } + *q='\0'; + if (active != MagickFalse) + { + xpm_buffer=DestroyString(xpm_buffer); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + /* + Initialize image structure. + */ + xpm_colors=NewSplayTree(CompareXPMColor,RelinquishMagickMemory, + (void *(*)(void *)) NULL); + if (AcquireImageColormap(image,image->colors) == MagickFalse) + { + xpm_colors=DestroySplayTree(xpm_colors); + xpm_buffer=DestroyString(xpm_buffer); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Read image colormap. + */ + image->depth=1; + next=NextXPMLine(xpm_buffer); + for (j=0; (j < (ssize_t) image->colors) && (next != (char *) NULL); j++) + { + char + symbolic[MagickPathExtent]; + + MagickPixelPacket + pixel; + + p=next; + next=NextXPMLine(p); + if (next == (char *) NULL) + break; + length=MagickMin((size_t) width,MagickPathExtent-1); + if (CopyXPMColor(key,p,length) != (ssize_t) length) + break; + status=AddValueToSplayTree(xpm_colors,ConstantString(key),(void *) j); + /* + Parse color. + */ + (void) memset(target,0,sizeof(target)); + (void) CopyMagickString(target,"gray",MaxTextExtent); + q=(char *) NULL; + if (strlen(p) > width) + q=ParseXPMColor(p+width,MagickTrue); + (void) memset(symbolic,0,sizeof(symbolic)); + *symbolic='\0'; + if (q != (char *) NULL) + { + while ((isspace((int) ((unsigned char) *q)) == 0) && (*q != '\0')) + q++; + if ((next-q) < 0) + break; + if (next != (char *) NULL) + (void) CopyXPMColor(target,q,MagickMin((size_t) (next-q), + MaxTextExtent-1)); + else + (void) CopyMagickString(target,q,MaxTextExtent); + q=ParseXPMColor(target,MagickFalse); + (void) CopyXPMColor(symbolic,q,MagickMin((size_t) (next-q), + MagickPathExtent-1)); + if (q != (char *) NULL) + *q='\0'; + } + StripString(target); + if (*symbolic != '\0') + (void) AddValueToSplayTree(xpm_symbolic,ConstantString(target), + ConstantString(symbolic)); + grey=strstr(target,"grey"); + if (grey != (char *) NULL) + grey[2]='a'; + if (LocaleCompare(target,"none") == 0) + { + image->storage_class=DirectClass; + image->matte=MagickTrue; + } + status=QueryColorCompliance(target,XPMCompliance,&image->colormap[j], + exception); + if (status == MagickFalse) + break; + (void) QueryMagickColorCompliance(target,XPMCompliance,&pixel,exception); + if (image->depth < pixel.depth) + image->depth=pixel.depth; + } + if (j < (ssize_t) image->colors) + { + xpm_colors=DestroySplayTree(xpm_colors); + xpm_buffer=DestroyString(xpm_buffer); + ThrowReaderException(CorruptImageError,"CorruptImage"); + } + j=0; + if (image_info->ping == MagickFalse) + { + /* + Read image pixels. + */ + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + xpm_colors=DestroySplayTree(xpm_colors); + xpm_buffer=DestroyString(xpm_buffer); + return(DestroyImageList(image)); + } + for (y=0; y < (ssize_t) image->rows; y++) + { + p=NextXPMLine(p); + if (p == (char *) NULL) + break; + r=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (r == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + ssize_t + count; + + count=CopyXPMColor(key,p,MagickMin(width,MaxTextExtent-1)); + if (count != (ssize_t) width) + break; + j=(ssize_t) GetValueFromSplayTree(xpm_colors,key); + if (image->storage_class == PseudoClass) + SetPixelIndex(indexes+x,j); + *r=image->colormap[j]; + p+=count; + r++; + } + if (x < (ssize_t) image->columns) + break; + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if (y < (ssize_t) image->rows) + { + xpm_colors=DestroySplayTree(xpm_colors); + xpm_buffer=DestroyString(xpm_buffer); + ThrowReaderException(CorruptImageError,"NotEnoughPixelData"); + } + } + /* + Relinquish resources. + */ + xpm_colors=DestroySplayTree(xpm_colors); + xpm_buffer=DestroyString(xpm_buffer); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r X P M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterXPMImage() adds attributes for the XPM image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterXPMImage method is: +% +% size_t RegisterXPMImage(void) +% +*/ +ModuleExport size_t RegisterXPMImage(void) +{ + MagickInfo + *entry; + + if (xpm_symbolic == (SplayTreeInfo *) NULL) + xpm_symbolic=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory, + RelinquishMagickMemory); + entry=SetMagickInfo("PICON"); + entry->decoder=(DecodeImageHandler *) ReadXPMImage; + entry->encoder=(EncodeImageHandler *) WritePICONImage; + entry->adjoin=MagickFalse; + entry->description=ConstantString("Personal Icon"); + entry->magick_module=ConstantString("XPM"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("PM"); + entry->decoder=(DecodeImageHandler *) ReadXPMImage; + entry->encoder=(EncodeImageHandler *) WriteXPMImage; + entry->adjoin=MagickFalse; + entry->stealth=MagickTrue; + entry->description=ConstantString("X Windows system pixmap (color)"); + entry->magick_module=ConstantString("XPM"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("XPM"); + entry->decoder=(DecodeImageHandler *) ReadXPMImage; + entry->encoder=(EncodeImageHandler *) WriteXPMImage; + entry->magick=(IsImageFormatHandler *) IsXPM; + entry->adjoin=MagickFalse; + entry->description=ConstantString("X Windows system pixmap (color)"); + entry->magick_module=ConstantString("XPM"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r X P M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterXPMImage() removes format registrations made by the +% XPM module from the list of supported formats. +% +% The format of the UnregisterXPMImage method is: +% +% UnregisterXPMImage(void) +% +*/ +ModuleExport void UnregisterXPMImage(void) +{ + (void) UnregisterMagickInfo("PICON"); + (void) UnregisterMagickInfo("PM"); + (void) UnregisterMagickInfo("XPM"); + if (xpm_symbolic != (SplayTreeInfo *) NULL) + xpm_symbolic=DestroySplayTree(xpm_symbolic); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e P I C O N I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePICONImage() writes an image to a file in the Personal Icon format. +% +% The format of the WritePICONImage method is: +% +% MagickBooleanType WritePICONImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WritePICONImage(const ImageInfo *image_info, + Image *image) +{ +#define ColormapExtent 155 +#define GraymapExtent 95 +#define PiconGeometry "48x48>" + + static unsigned char + Colormap[]= + { + 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x06, 0x00, 0x05, 0x00, 0xf4, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x2f, 0x4f, 0x4f, 0x70, 0x80, 0x90, 0x7e, 0x7e, + 0x7e, 0xdc, 0xdc, 0xdc, 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, + 0xff, 0x1e, 0x90, 0xff, 0x87, 0xce, 0xeb, 0xe6, 0xe6, 0xfa, 0x00, 0xff, + 0xff, 0x80, 0x00, 0x80, 0xb2, 0x22, 0x22, 0x2e, 0x8b, 0x57, 0x32, 0xcd, + 0x32, 0x00, 0xff, 0x00, 0x98, 0xfb, 0x98, 0xff, 0x00, 0xff, 0xff, 0x00, + 0x00, 0xff, 0x63, 0x47, 0xff, 0xa5, 0x00, 0xff, 0xd7, 0x00, 0xff, 0xff, + 0x00, 0xee, 0x82, 0xee, 0xa0, 0x52, 0x2d, 0xcd, 0x85, 0x3f, 0xd2, 0xb4, + 0x8c, 0xf5, 0xde, 0xb3, 0xff, 0xfa, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x21, 0xf9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x05, 0x00, 0x00, 0x05, 0x18, 0x20, 0x10, 0x08, + 0x03, 0x51, 0x18, 0x07, 0x92, 0x28, 0x0b, 0xd3, 0x38, 0x0f, 0x14, 0x49, + 0x13, 0x55, 0x59, 0x17, 0x96, 0x69, 0x1b, 0xd7, 0x85, 0x00, 0x3b, + }, + Graymap[]= + { + 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x04, 0x00, 0x04, 0x00, 0xf3, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x12, 0x12, 0x12, 0x21, 0x21, 0x21, 0x33, 0x33, + 0x33, 0x45, 0x45, 0x45, 0x54, 0x54, 0x54, 0x66, 0x66, 0x66, 0x78, 0x78, + 0x78, 0x87, 0x87, 0x87, 0x99, 0x99, 0x99, 0xab, 0xab, 0xab, 0xba, 0xba, + 0xba, 0xcc, 0xcc, 0xcc, 0xde, 0xde, 0xde, 0xed, 0xed, 0xed, 0xff, 0xff, + 0xff, 0x21, 0xf9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x0c, 0x10, 0x04, 0x31, + 0x48, 0x31, 0x07, 0x25, 0xb5, 0x58, 0x73, 0x4f, 0x04, 0x00, 0x3b, + }; + +#define MaxCixels 92 + + static const char + Cixel[MaxCixels+1] = " .XoO+@#$%&*=-;:>,<1234567890qwertyuipasdfghjk" + "lzxcvbnmMNBVCZASDFGHJKLPIUYTREWQ!~^/()_`'][{}|"; + + char + buffer[MaxTextExtent], + basename[MaxTextExtent], + name[MaxTextExtent], + symbol[MaxTextExtent]; + + ExceptionInfo + *exception; + + Image + *affinity_image, + *picon; + + ImageInfo + *blob_info; + + ImageType + type; + + MagickBooleanType + status, + transparent; + + MagickPixelPacket + pixel; + + QuantizeInfo + *quantize_info; + + RectangleInfo + geometry; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + PixelPacket + *q; + + size_t + characters_per_pixel, + colors; + + ssize_t + j, + k, + y; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + SetGeometry(image,&geometry); + (void) ParseMetaGeometry(PiconGeometry,&geometry.x,&geometry.y, + &geometry.width,&geometry.height); + picon=ResizeImage(image,geometry.width,geometry.height,TriangleFilter,1.0, + &image->exception); + blob_info=CloneImageInfo(image_info); + *blob_info->magick='\0'; + (void) AcquireUniqueFilename(blob_info->filename); + type=IdentifyImageType(image,&image->exception); + if ((image_info->type != TrueColorType) && + ((type == GrayscaleType) || (type == BilevelType))) + affinity_image=BlobToImage(blob_info,Graymap,GraymapExtent, + &image->exception); + else + affinity_image=BlobToImage(blob_info,Colormap,ColormapExtent, + &image->exception); + (void) RelinquishUniqueFileResource(blob_info->filename); + blob_info=DestroyImageInfo(blob_info); + if ((picon == (Image *) NULL) || (affinity_image == (Image *) NULL)) + { + if (affinity_image != (Image *) NULL) + affinity_image=DestroyImage(affinity_image); + if (picon != (Image *) NULL) + picon=DestroyImage(picon); + return(MagickFalse); + } + quantize_info=AcquireQuantizeInfo(image_info); + status=RemapImage(quantize_info,picon,affinity_image); + quantize_info=DestroyQuantizeInfo(quantize_info); + affinity_image=DestroyImage(affinity_image); + transparent=MagickFalse; + exception=(&image->exception); + if (picon->storage_class == PseudoClass) + { + (void) CompressImageColormap(picon); + if (picon->matte != MagickFalse) + transparent=MagickTrue; + } + else + { + /* + Convert DirectClass to PseudoClass picon. + */ + if (picon->matte != MagickFalse) + { + /* + Map all the transparent pixels. + */ + for (y=0; y < (ssize_t) picon->rows; y++) + { + q=GetAuthenticPixels(picon,0,y,picon->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) picon->columns; x++) + { + if (q->opacity == (Quantum) TransparentOpacity) + transparent=MagickTrue; + else + SetPixelOpacity(q,OpaqueOpacity); + q++; + } + if (SyncAuthenticPixels(picon,exception) == MagickFalse) + break; + } + } + (void) SetImageType(picon,PaletteType); + } + colors=picon->colors; + if (transparent != MagickFalse) + { + IndexPacket + *indexes; + + colors++; + picon->colormap=(PixelPacket *) ResizeQuantumMemory((void **) + picon->colormap,(size_t) colors,sizeof(*picon->colormap)); + if (picon->colormap == (PixelPacket *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationError"); + picon->colormap[colors-1].red=0; + picon->colormap[colors-1].green=0; + picon->colormap[colors-1].blue=0; + picon->colormap[colors-1].opacity=TransparentOpacity; + for (y=0; y < (ssize_t) picon->rows; y++) + { + q=GetAuthenticPixels(picon,0,y,picon->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(picon); + for (x=0; x < (ssize_t) picon->columns; x++) + { + if (q->opacity == (Quantum) TransparentOpacity) + SetPixelIndex(indexes+x,picon->colors); + q++; + } + if (SyncAuthenticPixels(picon,exception) == MagickFalse) + break; + } + } + /* + Compute the character per pixel. + */ + characters_per_pixel=1; + for (k=MaxCixels; (ssize_t) colors > k; k*=MaxCixels) + characters_per_pixel++; + /* + XPM header. + */ + (void) WriteBlobString(image,"/* XPM */\n"); + GetPathComponent(picon->filename,BasePath,basename); + (void) FormatLocaleString(buffer,MaxTextExtent, + "static char *%.1024s[] = {\n",basename); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"/* columns rows colors chars-per-pixel */\n"); + (void) FormatLocaleString(buffer,MaxTextExtent, + "\"%.20g %.20g %.20g %.20g\",\n",(double) picon->columns,(double) + picon->rows,(double) colors,(double) characters_per_pixel); + (void) WriteBlobString(image,buffer); + GetMagickPixelPacket(image,&pixel); + for (i=0; i < (ssize_t) colors; i++) + { + const char + *symbolic; + + /* + Define XPM color. + */ + SetMagickPixelPacket(image,picon->colormap+i,(IndexPacket *) NULL,&pixel); + pixel.colorspace=sRGBColorspace; + pixel.depth=8; + pixel.opacity=(MagickRealType) OpaqueOpacity; + (void) QueryMagickColorname(image,&pixel,XPMCompliance,name, + &image->exception); + if (transparent != MagickFalse) + { + if (i == (ssize_t) (colors-1)) + (void) CopyMagickString(name,"grey75",MaxTextExtent); + } + /* + Write XPM color. + */ + k=i % MaxCixels; + symbol[0]=Cixel[k]; + for (j=1; j < (ssize_t) characters_per_pixel; j++) + { + k=((i-k)/MaxCixels) % MaxCixels; + symbol[j]=Cixel[k]; + } + symbol[j]='\0'; + symbolic=(const char *) GetValueFromSplayTree(xpm_symbolic,name); + if (symbolic == (const char *) NULL) + (void) FormatLocaleString(buffer,MaxTextExtent,"\"%.1024s c %.1024s\",\n", + symbol,name); + else + (void) FormatLocaleString(buffer,MaxTextExtent, + "\"%.1024s c %.1024s %.1024s\",\n",symbol,name,symbolic); + (void) WriteBlobString(image,buffer); + } + /* + Define XPM pixels. + */ + (void) WriteBlobString(image,"/* pixels */\n"); + for (y=0; y < (ssize_t) picon->rows; y++) + { + p=GetVirtualPixels(picon,0,y,picon->columns,1,&picon->exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(picon); + (void) WriteBlobString(image,"\""); + for (x=0; x < (ssize_t) picon->columns; x++) + { + k=((ssize_t) GetPixelIndex(indexes+x) % MaxCixels); + symbol[0]=Cixel[k]; + for (j=1; j < (ssize_t) characters_per_pixel; j++) + { + k=(((int) GetPixelIndex(indexes+x)-k)/MaxCixels) % MaxCixels; + symbol[j]=Cixel[k]; + } + symbol[j]='\0'; + (void) CopyMagickString(buffer,symbol,MaxTextExtent); + (void) WriteBlobString(image,buffer); + } + (void) FormatLocaleString(buffer,MaxTextExtent,"\"%.1024s\n", + y == (ssize_t) (picon->rows-1) ? "" : ","); + (void) WriteBlobString(image,buffer); + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + picon->rows); + if (status == MagickFalse) + break; + } + picon=DestroyImage(picon); + (void) WriteBlobString(image,"};\n"); + (void) CloseBlob(image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e X P M I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteXPMImage() writes an image to a file in the X pixmap format. +% +% The format of the WriteXPMImage method is: +% +% MagickBooleanType WriteXPMImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteXPMImage(const ImageInfo *image_info,Image *image) +{ +#define MaxCixels 92 + + static const char + Cixel[MaxCixels+1] = " .XoO+@#$%&*=-;:>,<1234567890qwertyuipasdfghjk" + "lzxcvbnmMNBVCZASDFGHJKLPIUYTREWQ!~^/()_`'][{}|"; + + char + buffer[MaxTextExtent], + basename[MaxTextExtent], + name[MaxTextExtent], + symbol[MaxTextExtent]; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickPixelPacket + pixel; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + size_t + characters_per_pixel; + + ssize_t + j, + k, + opacity, + y; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=(&image->exception); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); + if (status == MagickFalse) + return(status); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + opacity=(-1); + if (image->matte == MagickFalse) + { + if ((image->storage_class == DirectClass) || (image->colors > 256)) + (void) SetImageType(image,PaletteType); + } + else + { + MagickRealType + alpha, + beta; + + /* + Identify transparent colormap index. + */ + if ((image->storage_class == DirectClass) || (image->colors > 256)) + (void) SetImageType(image,PaletteBilevelMatteType); + for (i=0; i < (ssize_t) image->colors; i++) + if (image->colormap[i].opacity != OpaqueOpacity) + { + if (opacity < 0) + { + opacity=i; + continue; + } + alpha=(Quantum) TransparentOpacity-(MagickRealType) + image->colormap[i].opacity; + beta=(Quantum) TransparentOpacity-(MagickRealType) + image->colormap[opacity].opacity; + if (alpha < beta) + opacity=i; + } + if (opacity == -1) + { + (void) SetImageType(image,PaletteBilevelMatteType); + for (i=0; i < (ssize_t) image->colors; i++) + if (image->colormap[i].opacity != OpaqueOpacity) + { + if (opacity < 0) + { + opacity=i; + continue; + } + alpha=(Quantum) TransparentOpacity-(MagickRealType) + image->colormap[i].opacity; + beta=(Quantum) TransparentOpacity-(MagickRealType) + image->colormap[opacity].opacity; + if (alpha < beta) + opacity=i; + } + } + if (opacity >= 0) + { + image->colormap[opacity].red=image->transparent_color.red; + image->colormap[opacity].green=image->transparent_color.green; + image->colormap[opacity].blue=image->transparent_color.blue; + } + } + /* + Compute the character per pixel. + */ + characters_per_pixel=1; + for (k=MaxCixels; (ssize_t) image->colors > k; k*=MaxCixels) + characters_per_pixel++; + /* + XPM header. + */ + (void) WriteBlobString(image,"/* XPM */\n"); + GetPathComponent(image->filename,BasePath,basename); + if (isalnum((int) ((unsigned char) *basename)) == 0) + { + (void) FormatLocaleString(buffer,MaxTextExtent,"xpm_%.1024s",basename); + (void) CopyMagickString(basename,buffer,MaxTextExtent); + } + if (isalpha((int) ((unsigned char) basename[0])) == 0) + basename[0]='_'; + for (i=1; basename[i] != '\0'; i++) + if (isalnum((int) ((unsigned char) basename[i])) == 0) + basename[i]='_'; + (void) FormatLocaleString(buffer,MaxTextExtent, + "static const char *%.1024s[] = {\n",basename); + (void) WriteBlobString(image,buffer); + (void) WriteBlobString(image,"/* columns rows colors chars-per-pixel */\n"); + (void) FormatLocaleString(buffer,MaxTextExtent, + "\"%.20g %.20g %.20g %.20g \",\n",(double) image->columns,(double) + image->rows,(double) image->colors,(double) characters_per_pixel); + (void) WriteBlobString(image,buffer); + GetMagickPixelPacket(image,&pixel); + for (i=0; i < (ssize_t) image->colors; i++) + { + /* + Define XPM color. + */ + SetMagickPixelPacket(image,image->colormap+i,(IndexPacket *) NULL,&pixel); + pixel.colorspace=sRGBColorspace; + pixel.depth=8; + pixel.opacity=(MagickRealType) OpaqueOpacity; + (void) QueryMagickColorname(image,&pixel,XPMCompliance,name,exception); + if (i == opacity) + (void) CopyMagickString(name,"None",MaxTextExtent); + /* + Write XPM color. + */ + k=i % MaxCixels; + symbol[0]=Cixel[k]; + for (j=1; j < (ssize_t) characters_per_pixel; j++) + { + k=((i-k)/MaxCixels) % MaxCixels; + symbol[j]=Cixel[k]; + } + symbol[j]='\0'; + (void) FormatLocaleString(buffer,MaxTextExtent, + "\"%.1024s c %.1024s\",\n",symbol,name); + (void) WriteBlobString(image,buffer); + } + /* + Define XPM pixels. + */ + (void) WriteBlobString(image,"/* pixels */\n"); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + (void) WriteBlobString(image,"\""); + for (x=0; x < (ssize_t) image->columns; x++) + { + k=((ssize_t) GetPixelIndex(indexes+x) % MaxCixels); + symbol[0]=Cixel[k]; + for (j=1; j < (ssize_t) characters_per_pixel; j++) + { + k=(((int) GetPixelIndex(indexes+x)-k)/MaxCixels) % MaxCixels; + symbol[j]=Cixel[k]; + } + symbol[j]='\0'; + (void) CopyMagickString(buffer,symbol,MaxTextExtent); + (void) WriteBlobString(image,buffer); + } + (void) FormatLocaleString(buffer,MaxTextExtent,"\"%.1024s\n", + (y == (ssize_t) (image->rows-1) ? "" : ",")); + (void) WriteBlobString(image,buffer); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + (void) WriteBlobString(image,"};\n"); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/xps.c b/ImageMagick-6.9.12-44/coders/xps.c new file mode 100644 index 0000000..2eb9668 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/xps.c @@ -0,0 +1,476 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% X X PPPP SSSSS % +% X X P P SS % +% X PPPP SSS % +% X X P SS % +% X X P SSSSS % +% % +% % +% Read/Write Microsoft XML Paper Specification Format % +% % +% Software Design % +% Cristy % +% January 2008 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/delegate.h" +#include "magick/delegate-private.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/nt-base-private.h" +#include "magick/option.h" +#include "magick/profile.h" +#include "magick/resource_.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/timer-private.h" +#include "magick/token.h" +#include "magick/transform.h" +#include "magick/utility.h" +#include "coders/bytebuffer-private.h" +#include "coders/ghostscript-private.h" + +/* + Typedef declaractions. +*/ +typedef struct _XPSInfo +{ + MagickBooleanType + cmyk; + + SegmentInfo + bounds; + + unsigned long + columns, + rows; + + StringInfo + *icc_profile, + *photoshop_profile, + *xmp_profile; +} XPSInfo; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d X P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadXPSImage() reads a Printer Control Language image file and returns it. +% It allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the ReadPSImage method is: +% +% Image *ReadPSImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static Image *ReadXPSImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + command[MagickPathExtent], + *density, + filename[MagickPathExtent], + input_filename[MagickPathExtent], + message[MagickPathExtent], + *options; + + const char + *option; + + const DelegateInfo + *delegate_info; + + GeometryInfo + geometry_info; + + Image + *image, + *next, + *postscript_image; + + ImageInfo + *read_info; + + MagickBooleanType + fitPage, + status; + + MagickStatusType + flags; + + PointInfo + delta; + + RectangleInfo + page; + + ssize_t + i; + + unsigned long + scene; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + status=AcquireUniqueSymbolicLink(image_info->filename,input_filename); + if (status == MagickFalse) + { + ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile", + image_info->filename); + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Set the page density. + */ + delta.x=DefaultResolution; + delta.y=DefaultResolution; + if ((image->x_resolution == 0.0) || (image->y_resolution == 0.0)) + { + flags=ParseGeometry(PSDensityGeometry,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + if (image_info->density != (char *) NULL) + { + flags=ParseGeometry(image_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + (void) ParseAbsoluteGeometry(PSPageGeometry,&page); + if (image_info->page != (char *) NULL) + (void) ParseAbsoluteGeometry(image_info->page,&page); + page.width=(size_t) ((ssize_t) ceil((double) (page.width* + image->x_resolution/delta.x)-0.5)); + page.height=(size_t) ((ssize_t) ceil((double) (page.height* + image->y_resolution/delta.y)-0.5)); + fitPage=MagickFalse; + option=GetImageOption(image_info,"xps:fit-page"); + if (option != (char *) NULL) + { + char + *page_geometry; + + page_geometry=GetPageGeometry(option); + flags=ParseMetaGeometry(page_geometry,&page.x,&page.y,&page.width, + &page.height); + if (flags == NoValue) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "InvalidGeometry","`%s'",option); + page_geometry=DestroyString(page_geometry); + image=DestroyImage(image); + return((Image *) NULL); + } + page.width=(size_t) ((ssize_t) ceil((double) (page.width* + image->x_resolution/delta.x)-0.5)); + page.height=(size_t) ((ssize_t) ceil((double) (page.height* + image->y_resolution/delta.y) -0.5)); + page_geometry=DestroyString(page_geometry); + fitPage=MagickTrue; + } + /* + Render Postscript with the Ghostscript delegate. + */ + delegate_info=GetDelegateInfo("xps:color",(char *) NULL,exception); + if (delegate_info == (const DelegateInfo *) NULL) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + density=AcquireString(""); + options=AcquireString(""); + (void) FormatLocaleString(density,MagickPathExtent,"%gx%g", + image->x_resolution,image->y_resolution); + if (image_info->ping != MagickFalse) + (void) FormatLocaleString(density,MagickPathExtent,"2.0x2.0"); + else + (void) FormatLocaleString(options,MagickPathExtent,"-g%.20gx%.20g ", + (double) page.width,(double) page.height); + read_info=CloneImageInfo(image_info); + *read_info->magick='\0'; + if (read_info->number_scenes != 0) + { + char + pages[MagickPathExtent]; + + (void) FormatLocaleString(pages,MagickPathExtent,"-dFirstPage=%.20g " + "-dLastPage=%.20g ",(double) read_info->scene+1,(double) + (read_info->scene+read_info->number_scenes)); + (void) ConcatenateMagickString(options,pages,MagickPathExtent); + read_info->number_scenes=0; + if (read_info->scenes != (char *) NULL) + *read_info->scenes='\0'; + } + if (*image_info->magick == 'E') + { + option=GetImageOption(image_info,"xps:use-cropbox"); + if ((option == (const char *) NULL) || + (IsStringTrue(option) != MagickFalse)) + (void) ConcatenateMagickString(options,"-dEPSCrop ",MagickPathExtent); + if (fitPage != MagickFalse) + (void) ConcatenateMagickString(options,"-dEPSFitPage ", + MagickPathExtent); + } + (void) AcquireUniqueFilename(read_info->filename); + (void) RelinquishUniqueFileResource(read_info->filename); + (void) ConcatenateMagickString(read_info->filename,"%d",MagickPathExtent); + (void) CopyMagickString(filename,read_info->filename,MagickPathExtent); + (void) FormatLocaleString(command,MagickPathExtent, + GetDelegateCommands(delegate_info), + read_info->antialias != MagickFalse ? 4 : 1, + read_info->antialias != MagickFalse ? 4 : 1,density,options, + read_info->filename,input_filename); + options=DestroyString(options); + density=DestroyString(density); + *message='\0'; + status=ExternalDelegateCommand(MagickFalse,read_info->verbose,command, + (char *) NULL,exception) != 0 ? MagickTrue : MagickFalse; + (void) RelinquishUniqueFileResource(input_filename); + postscript_image=(Image *) NULL; + if (status == MagickFalse) + for (i=1; ; i++) + { + (void) InterpretImageFilename(image_info,image,filename,(int) i, + read_info->filename); + if (IsGhostscriptRendered(read_info->filename) == MagickFalse) + break; + read_info->blob=NULL; + read_info->length=0; + next=ReadImage(read_info,exception); + (void) RelinquishUniqueFileResource(read_info->filename); + if (next == (Image *) NULL) + break; + AppendImageToList(&postscript_image,next); + } + else + for (i=1; ; i++) + { + (void) InterpretImageFilename(image_info,image,filename,(int) i, + read_info->filename); + if (IsGhostscriptRendered(read_info->filename) == MagickFalse) + break; + read_info->blob=NULL; + read_info->length=0; + next=ReadImage(read_info,exception); + (void) RelinquishUniqueFileResource(read_info->filename); + if (next == (Image *) NULL) + break; + AppendImageToList(&postscript_image,next); + } + (void) RelinquishUniqueFileResource(filename); + read_info=DestroyImageInfo(read_info); + if (postscript_image == (Image *) NULL) + { + if (*message != '\0') + (void) ThrowMagickException(exception,GetMagickModule(), + DelegateError,"PostscriptDelegateFailed","`%s'",message); + image=DestroyImageList(image); + return((Image *) NULL); + } + if (LocaleCompare(postscript_image->magick,"BMP") == 0) + { + Image + *cmyk_image; + + cmyk_image=ConsolidateCMYKImages(postscript_image,exception); + if (cmyk_image != (Image *) NULL) + { + postscript_image=DestroyImageList(postscript_image); + postscript_image=cmyk_image; + } + } + if (image_info->number_scenes != 0) + { + Image + *clone_image; + + /* + Add place holder images to meet the subimage specification requirement. + */ + for (i=0; i < (ssize_t) image_info->scene; i++) + { + clone_image=CloneImage(postscript_image,1,1,MagickTrue,exception); + if (clone_image != (Image *) NULL) + PrependImageToList(&postscript_image,clone_image); + } + } + do + { + (void) CopyMagickString(postscript_image->filename,filename, + MagickPathExtent); + (void) CopyMagickString(postscript_image->magick,image->magick, + MagickPathExtent); + postscript_image->page=page; + if (image_info->ping != MagickFalse) + { + postscript_image->magick_columns=page.width; + postscript_image->magick_rows=page.height; + postscript_image->columns=page.width; + postscript_image->rows=page.height; + } + (void) CloneImageProfiles(postscript_image,image); + (void) CloneImageProperties(postscript_image,image); + next=SyncNextImageInList(postscript_image); + if (next != (Image *) NULL) + postscript_image=next; + } while (next != (Image *) NULL); + image=DestroyImageList(image); + scene=0; + for (next=GetFirstImageInList(postscript_image); next != (Image *) NULL; ) + { + next->scene=scene++; + next=GetNextImageInList(next); + } + return(GetFirstImageInList(postscript_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r X P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterXPSImage() adds properties for the PS image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterXPSImage method is: +% +% size_t RegisterXPSImage(void) +% +*/ +ModuleExport size_t RegisterXPSImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("XPS"); + entry->decoder=(DecodeImageHandler *) ReadXPSImage; + entry->adjoin=MagickFalse; + entry->blob_support=MagickFalse; + entry->seekable_stream=MagickTrue; + entry->thread_support=EncoderThreadSupport; + entry->description=ConstantString("Microsoft XML Paper Specification"); + entry->magick_module=ConstantString("XPS"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r X P S I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterXPSImage() removes format registrations made by the +% XPS module from the list of supported formats. +% +% The format of the UnregisterXPSImage method is: +% +% UnregisterXPSImage(void) +% +*/ +ModuleExport void UnregisterXPSImage(void) +{ + (void) UnregisterMagickInfo("XPS"); +} diff --git a/ImageMagick-6.9.12-44/coders/xwd.c b/ImageMagick-6.9.12-44/coders/xwd.c new file mode 100644 index 0000000..05d1b7a --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/xwd.c @@ -0,0 +1,960 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% X X W W DDDD % +% X X W W D D % +% X W W D D % +% X X W W W D D % +% X X W W DDDD % +% % +% % +% Read/Write X Windows System Window Dump Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#if defined(MAGICKCORE_X11_DELEGATE) +#include "magick/xwindow-private.h" +#if !defined(vms) +#include +#else +#include "XWDFile.h" +#endif +#endif + +/* + Forward declarations. +*/ +#if defined(MAGICKCORE_X11_DELEGATE) +static MagickBooleanType + WriteXWDImage(const ImageInfo *,Image *); +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s X W D % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsXWD() returns MagickTrue if the image format type, identified by the +% magick string, is XWD. +% +% The format of the IsXWD method is: +% +% MagickBooleanType IsXWD(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: compare image format pattern against these bytes. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsXWD(const unsigned char *magick,const size_t length) +{ + if (length < 8) + return(MagickFalse); + if (memcmp(magick+1,"\000\000",2) == 0) + { + if (memcmp(magick+4,"\007\000\000",3) == 0) + return(MagickTrue); + if (memcmp(magick+5,"\000\000\007",3) == 0) + return(MagickTrue); + } + return(MagickFalse); +} + +#if defined(MAGICKCORE_X11_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d X W D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadXWDImage() reads an X Window System window dump image file and +% returns it. It allocates the memory necessary for the new Image structure +% and returns a pointer to the new image. +% +% The format of the ReadXWDImage method is: +% +% Image *ReadXWDImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static Image *ReadXWDImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ +#define CheckOverflowException(length,width,height) \ + (((height) != 0) && ((length)/((size_t) height) != ((size_t) width))) + + char + *comment; + + Image + *image; + + IndexPacket + index; + + int + x_status; + + MagickBooleanType + authentic_colormap; + + MagickStatusType + status; + + IndexPacket + *indexes; + + ssize_t + x; + + PixelPacket + *q; + + ssize_t + i; + + size_t + pixel; + + size_t + length; + + ssize_t + count, + y; + + unsigned long + lsb_first; + + XColor + *colors; + + XImage + *ximage; + + XWDFileHeader + header; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read in header information. + */ + count=ReadBlob(image,sz_XWDheader,(unsigned char *) &header); + if (count != sz_XWDheader) + ThrowReaderException(CorruptImageError,"UnableToReadImageHeader"); + /* + Ensure the header byte-order is most-significant byte first. + */ + lsb_first=1; + if ((int) (*(char *) &lsb_first) != 0) + MSBOrderLong((unsigned char *) &header,sz_XWDheader); + /* + Check to see if the dump file is in the proper format. + */ + if (header.file_version != XWD_FILE_VERSION) + ThrowReaderException(CorruptImageError,"FileFormatVersionMismatch"); + if (header.header_size < sz_XWDheader) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (header.xoffset >= header.pixmap_width) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + switch (header.visual_class) + { + case StaticGray: + case GrayScale: + { + if (header.bits_per_pixel != 1) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + break; + } + case StaticColor: + case PseudoColor: + { + if ((header.bits_per_pixel < 1) || (header.bits_per_pixel > 15) || + (header.ncolors == 0)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + break; + } + case TrueColor: + case DirectColor: + { + if ((header.bits_per_pixel != 16) && (header.bits_per_pixel != 24) && + (header.bits_per_pixel != 32)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + break; + } + default: + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + switch (header.pixmap_format) + { + case XYBitmap: + { + if (header.pixmap_depth != 1) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + break; + } + case XYPixmap: + case ZPixmap: + { + if ((header.pixmap_depth < 1) || (header.pixmap_depth > 32)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + switch (header.bitmap_pad) + { + case 8: + case 16: + case 32: + break; + default: + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + break; + } + default: + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + switch (header.bitmap_unit) + { + case 8: + case 16: + case 32: + break; + default: + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + switch (header.byte_order) + { + case LSBFirst: + case MSBFirst: + break; + default: + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + switch (header.bitmap_bit_order) + { + case LSBFirst: + case MSBFirst: + break; + default: + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + if (((header.bitmap_pad % 8) != 0) || (header.bitmap_pad > 32)) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + if (header.ncolors > 65535) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + length=(size_t) (header.header_size-sz_XWDheader); + if ((length+1) != ((size_t) ((CARD32) (length+1)))) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + comment=(char *) AcquireQuantumMemory(length+1,sizeof(*comment)); + if (comment == (char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,length,(unsigned char *) comment); + comment[length]='\0'; + (void) SetImageProperty(image,"comment",comment); + comment=DestroyString(comment); + if (count != (ssize_t) length) + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + /* + Initialize the X image. + */ + ximage=(XImage *) AcquireMagickMemory(sizeof(*ximage)); + if (ximage == (XImage *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + ximage->depth=(int) header.pixmap_depth; + ximage->format=(int) header.pixmap_format; + ximage->xoffset=(int) header.xoffset; + ximage->data=(char *) NULL; + ximage->width=(int) header.pixmap_width; + ximage->height=(int) header.pixmap_height; + ximage->bitmap_pad=(int) header.bitmap_pad; + ximage->bytes_per_line=(int) header.bytes_per_line; + ximage->byte_order=(int) header.byte_order; + ximage->bitmap_unit=(int) header.bitmap_unit; + ximage->bitmap_bit_order=(int) header.bitmap_bit_order; + ximage->bits_per_pixel=(int) header.bits_per_pixel; + ximage->red_mask=header.red_mask; + ximage->green_mask=header.green_mask; + ximage->blue_mask=header.blue_mask; + if ((ximage->depth < 0) || (ximage->format < 0) || (ximage->xoffset < 0) || + (ximage->width < 0) || (ximage->height < 0) || (ximage->bitmap_pad < 0) || + (ximage->bytes_per_line < 0) || (ximage->byte_order < 0) || + (ximage->bitmap_unit < 0) || (ximage->bitmap_bit_order < 0) || + (ximage->bits_per_pixel < 0)) + { + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + if ((ximage->width > 65535) || (ximage->height > 65535)) + { + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + if ((ximage->bits_per_pixel > 32) || (ximage->bitmap_unit > 32)) + { + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + x_status=XInitImage(ximage); + if (x_status == 0) + { + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + /* + Read colormap. + */ + authentic_colormap=MagickFalse; + colors=(XColor *) NULL; + if (header.ncolors != 0) + { + XWDColor + color; + + colors=(XColor *) AcquireQuantumMemory((size_t) header.ncolors, + sizeof(*colors)); + if (colors == (XColor *) NULL) + { + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (i=0; i < (ssize_t) header.ncolors; i++) + { + count=ReadBlob(image,sz_XWDColor,(unsigned char *) &color); + if (count != sz_XWDColor) + { + colors=(XColor *) RelinquishMagickMemory(colors); + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile"); + } + colors[i].pixel=color.pixel; + colors[i].red=color.red; + colors[i].green=color.green; + colors[i].blue=color.blue; + colors[i].flags=(char) color.flags; + if (color.flags != 0) + authentic_colormap=MagickTrue; + } + /* + Ensure the header byte-order is most-significant byte first. + */ + lsb_first=1; + if ((int) (*(char *) &lsb_first) != 0) + for (i=0; i < (ssize_t) header.ncolors; i++) + { + MSBOrderLong((unsigned char *) &colors[i].pixel, + sizeof(colors[i].pixel)); + MSBOrderShort((unsigned char *) &colors[i].red,3* + sizeof(colors[i].red)); + } + } + /* + Allocate the pixel buffer. + */ + length=(size_t) ximage->bytes_per_line*ximage->height; + if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height)) + { + if (header.ncolors != 0) + colors=(XColor *) RelinquishMagickMemory(colors); + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + if (ximage->format != ZPixmap) + { + size_t + extent; + + extent=length; + length*=ximage->depth; + if (CheckOverflowException(length,extent,ximage->depth)) + { + if (header.ncolors != 0) + colors=(XColor *) RelinquishMagickMemory(colors); + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + } + } + ximage->data=(char *) AcquireQuantumMemory(length,sizeof(*ximage->data)); + if (ximage->data == (char *) NULL) + { + if (header.ncolors != 0) + colors=(XColor *) RelinquishMagickMemory(colors); + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + count=ReadBlob(image,length,(unsigned char *) ximage->data); + if (count != (ssize_t) length) + { + if (header.ncolors != 0) + colors=(XColor *) RelinquishMagickMemory(colors); + ximage->data=DestroyString(ximage->data); + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + } + /* + Convert image to MIFF format. + */ + image->columns=(size_t) ximage->width; + image->rows=(size_t) ximage->height; + image->depth=8; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + if (header.ncolors != 0) + colors=(XColor *) RelinquishMagickMemory(colors); + ximage->data=DestroyString(ximage->data); + ximage=(XImage *) RelinquishMagickMemory(ximage); + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + if ((header.ncolors == 0U) || (ximage->red_mask != 0) || + (ximage->green_mask != 0) || (ximage->blue_mask != 0)) + image->storage_class=DirectClass; + else + image->storage_class=PseudoClass; + image->colors=header.ncolors; + if (image_info->ping == MagickFalse) + switch (image->storage_class) + { + case DirectClass: + default: + { + size_t + color; + + size_t + blue_mask, + blue_shift, + green_mask, + green_shift, + red_mask, + red_shift; + + /* + Determine shift and mask for red, green, and blue. + */ + red_mask=ximage->red_mask; + red_shift=0; + while ((red_mask != 0) && ((red_mask & 0x01) == 0)) + { + red_mask>>=1; + red_shift++; + } + green_mask=ximage->green_mask; + green_shift=0; + while ((green_mask != 0) && ((green_mask & 0x01) == 0)) + { + green_mask>>=1; + green_shift++; + } + blue_mask=ximage->blue_mask; + blue_shift=0; + while ((blue_mask != 0) && ((blue_mask & 0x01) == 0)) + { + blue_mask>>=1; + blue_shift++; + } + /* + Convert X image to DirectClass packets. + */ + if ((image->colors != 0) && (authentic_colormap != MagickFalse)) + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=XGetPixel(ximage,(int) x,(int) y); + index=ConstrainColormapIndex(image,(ssize_t) (pixel >> + red_shift) & red_mask); + SetPixelRed(q,ScaleShortToQuantum(colors[(ssize_t) index].red)); + index=ConstrainColormapIndex(image,(ssize_t) (pixel >> + green_shift) & green_mask); + SetPixelGreen(q,ScaleShortToQuantum(colors[(ssize_t) + index].green)); + index=ConstrainColormapIndex(image,(ssize_t) (pixel >> + blue_shift) & blue_mask); + SetPixelBlue(q,ScaleShortToQuantum(colors[(ssize_t) index].blue)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + else + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + pixel=XGetPixel(ximage,(int) x,(int) y); + color=(pixel >> red_shift) & red_mask; + if (red_mask != 0) + color=(color*65535UL)/red_mask; + SetPixelRed(q,ScaleShortToQuantum((unsigned short) color)); + color=(pixel >> green_shift) & green_mask; + if (green_mask != 0) + color=(color*65535UL)/green_mask; + SetPixelGreen(q,ScaleShortToQuantum((unsigned short) color)); + color=(pixel >> blue_shift) & blue_mask; + if (blue_mask != 0) + color=(color*65535UL)/blue_mask; + SetPixelBlue(q,ScaleShortToQuantum((unsigned short) color)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + break; + } + case PseudoClass: + { + /* + Convert X image to PseudoClass packets. + */ + if (AcquireImageColormap(image,image->colors) == MagickFalse) + { + if (header.ncolors != 0) + colors=(XColor *) RelinquishMagickMemory(colors); + ximage->data=DestroyString(ximage->data); + ximage=(XImage *) RelinquishMagickMemory(ximage); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (i=0; i < (ssize_t) image->colors; i++) + { + image->colormap[i].red=ScaleShortToQuantum(colors[i].red); + image->colormap[i].green=ScaleShortToQuantum(colors[i].green); + image->colormap[i].blue=ScaleShortToQuantum(colors[i].blue); + } + for (y=0; y < (ssize_t) image->rows; y++) + { + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetAuthenticIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + index=ConstrainColormapIndex(image,(ssize_t) XGetPixel(ximage,(int) + x,(int) y)); + SetPixelIndex(indexes+x,index); + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + break; + } + } + /* + Free image and colormap. + */ + if (header.ncolors != 0) + colors=(XColor *) RelinquishMagickMemory(colors); + ximage->data=DestroyString(ximage->data); + ximage=(XImage *) RelinquishMagickMemory(ximage); + if (EOFBlob(image) != MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r X W D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterXWDImage() adds properties for the XWD image format to +% the list of supported formats. The properties include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterXWDImage method is: +% +% size_t RegisterXWDImage(void) +% +*/ +ModuleExport size_t RegisterXWDImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("XWD"); +#if defined(MAGICKCORE_X11_DELEGATE) + entry->decoder=(DecodeImageHandler *) ReadXWDImage; + entry->encoder=(EncodeImageHandler *) WriteXWDImage; +#endif + entry->magick=(IsImageFormatHandler *) IsXWD; + entry->adjoin=MagickFalse; + entry->description=ConstantString("X Windows system window dump (color)"); + entry->magick_module=ConstantString("XWD"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r X W D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterXWDImage() removes format registrations made by the +% XWD module from the list of supported formats. +% +% The format of the UnregisterXWDImage method is: +% +% UnregisterXWDImage(void) +% +*/ +ModuleExport void UnregisterXWDImage(void) +{ + (void) UnregisterMagickInfo("XWD"); +} + +#if defined(MAGICKCORE_X11_DELEGATE) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e X W D I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteXWDImage() writes an image to a file in X window dump +% rasterfile format. +% +% The format of the WriteXWDImage method is: +% +% MagickBooleanType WriteXWDImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteXWDImage(const ImageInfo *image_info,Image *image) +{ + const char + *value; + + MagickBooleanType + status; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + unsigned char + *q; + + size_t + bits_per_pixel, + bytes_per_line, + length, + scanline_pad; + + ssize_t + count, + y; + + unsigned char + *pixels; + + unsigned long + lsb_first; + + XWDFileHeader + xwd_info; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + if ((image->columns != (CARD32) image->columns) || + (image->rows != (CARD32) image->rows)) + ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); + if ((image->storage_class == PseudoClass) && (image->colors > 256)) + (void) SetImageType(image,TrueColorType); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace); + /* + Initialize XWD file header. + */ + (void) memset(&xwd_info,0,sizeof(xwd_info)); + xwd_info.header_size=(CARD32) sz_XWDheader; + value=GetImageProperty(image,"comment"); + if (value != (const char *) NULL) + xwd_info.header_size+=(CARD32) strlen(value); + xwd_info.header_size++; + xwd_info.file_version=(CARD32) XWD_FILE_VERSION; + xwd_info.pixmap_format=(CARD32) ZPixmap; + xwd_info.pixmap_depth=(CARD32) (image->storage_class == DirectClass ? 24 : 8); + xwd_info.pixmap_width=(CARD32) image->columns; + xwd_info.pixmap_height=(CARD32) image->rows; + xwd_info.xoffset=(CARD32) 0; + xwd_info.byte_order=(CARD32) MSBFirst; + xwd_info.bitmap_unit=(CARD32) (image->storage_class == DirectClass ? 32 : 8); + xwd_info.bitmap_bit_order=(CARD32) MSBFirst; + xwd_info.bitmap_pad=(CARD32) (image->storage_class == DirectClass ? 32 : 8); + bits_per_pixel=(size_t) (image->storage_class == DirectClass ? 24 : 8); + xwd_info.bits_per_pixel=(CARD32) bits_per_pixel; + bytes_per_line=(CARD32) ((((xwd_info.bits_per_pixel* + xwd_info.pixmap_width)+((xwd_info.bitmap_pad)-1))/ + (xwd_info.bitmap_pad))*((xwd_info.bitmap_pad) >> 3)); + xwd_info.bytes_per_line=(CARD32) bytes_per_line; + xwd_info.visual_class=(CARD32) + (image->storage_class == DirectClass ? DirectColor : PseudoColor); + xwd_info.red_mask=(CARD32) + (image->storage_class == DirectClass ? 0xff0000 : 0); + xwd_info.green_mask=(CARD32) + (image->storage_class == DirectClass ? 0xff00 : 0); + xwd_info.blue_mask=(CARD32) (image->storage_class == DirectClass ? 0xff : 0); + xwd_info.bits_per_rgb=(CARD32) (image->storage_class == DirectClass ? 24 : 8); + xwd_info.colormap_entries=(CARD32) + (image->storage_class == DirectClass ? 256 : image->colors); + xwd_info.ncolors=(unsigned int) + (image->storage_class == DirectClass ? 0 : image->colors); + xwd_info.window_width=(CARD32) image->columns; + xwd_info.window_height=(CARD32) image->rows; + xwd_info.window_x=0; + xwd_info.window_y=0; + xwd_info.window_bdrwidth=(CARD32) 0; + /* + Write XWD header. + */ + lsb_first=1; + if ((int) (*(char *) &lsb_first) != 0) + MSBOrderLong((unsigned char *) &xwd_info,sizeof(xwd_info)); + (void) WriteBlob(image,sz_XWDheader,(unsigned char *) &xwd_info); + if (value != (const char *) NULL) + (void) WriteBlob(image,strlen(value),(unsigned char *) value); + (void) WriteBlob(image,1,(const unsigned char *) "\0"); + if (image->storage_class == PseudoClass) + { + ssize_t + i; + + XColor + *colors; + + XWDColor + color; + + /* + Dump colormap to file. + */ + (void) memset(&color,0,sizeof(color)); + colors=(XColor *) AcquireQuantumMemory((size_t) image->colors, + sizeof(*colors)); + if (colors == (XColor *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + for (i=0; i < (ssize_t) image->colors; i++) + { + colors[i].pixel=(unsigned long) i; + colors[i].red=ScaleQuantumToShort(image->colormap[i].red); + colors[i].green=ScaleQuantumToShort(image->colormap[i].green); + colors[i].blue=ScaleQuantumToShort(image->colormap[i].blue); + colors[i].flags=(char) (DoRed | DoGreen | DoBlue); + colors[i].pad='\0'; + if ((int) (*(char *) &lsb_first) != 0) + { + MSBOrderLong((unsigned char *) &colors[i].pixel, + sizeof(colors[i].pixel)); + MSBOrderShort((unsigned char *) &colors[i].red,3* + sizeof(colors[i].red)); + } + } + for (i=0; i < (ssize_t) image->colors; i++) + { + color.pixel=(CARD32) colors[i].pixel; + color.red=colors[i].red; + color.green=colors[i].green; + color.blue=colors[i].blue; + color.flags=(CARD8) colors[i].flags; + count=WriteBlob(image,sz_XWDColor,(unsigned char *) &color); + if (count != (ssize_t) sz_XWDColor) + break; + } + colors=(XColor *) RelinquishMagickMemory(colors); + } + /* + Allocate memory for pixels. + */ + length=3*bytes_per_line; + if (image->storage_class == PseudoClass) + length=bytes_per_line; + pixels=(unsigned char *) AcquireQuantumMemory(length,sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(pixels,0,length); + /* + Convert MIFF to XWD raster pixels. + */ + scanline_pad=(bytes_per_line-((image->columns*bits_per_pixel) >> 3)); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels; + if (image->storage_class == PseudoClass) + { + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + *q++=(unsigned char) ((size_t) GetPixelIndex(indexes+x)); + } + else + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetPixelRed(p)); + *q++=ScaleQuantumToChar(GetPixelGreen(p)); + *q++=ScaleQuantumToChar(GetPixelBlue(p)); + p++; + } + for (x=0; x < (ssize_t) scanline_pad; x++) + *q++='\0'; + length=(size_t) (q-pixels); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + (void) CloseBlob(image); + return(y < (ssize_t) image->rows ? MagickFalse : MagickTrue); +} +#endif diff --git a/ImageMagick-6.9.12-44/coders/ycbcr.c b/ImageMagick-6.9.12-44/coders/ycbcr.c new file mode 100644 index 0000000..0bf3743 --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/ycbcr.c @@ -0,0 +1,1422 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% Y Y YYYC BBBB YYYC RRRR % +% Y Y C B B C R R % +% Y C BBBB C RRRR % +% Y C B B C R R % +% Y YYYC BBBB YYYC R R % +% % +% % +% Read/Write Raw YCbCr Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/colorspace.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteYCBCRImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d Y C b C r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadYCBCRImage() reads an image of raw YCbCr or YCbCrA samples and returns +% it. It allocates the memory necessary for the new Image structure and +% returns a pointer to the new image. +% +% The format of the ReadYCBCRImage method is: +% +% Image *ReadYCBCRImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadYCBCRImage(const ImageInfo *image_info, + ExceptionInfo *exception) +{ + const void + *stream; + + Image + *canvas_image, + *image; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + ssize_t + i; + + size_t + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + (void) SetImageColorspace(image,YCbCrColorspace); + if (image_info->interlace != PartitionInterlace) + { + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + } + /* + Create virtual canvas to support cropping (i.e. image.rgb[100x100+10+20]). + */ + canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse, + exception); + if (canvas_image == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod); + quantum_info=AcquireQuantumInfo(image_info,canvas_image); + if (quantum_info == (QuantumInfo *) NULL) + { + canvas_image=DestroyImage(canvas_image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + quantum_type=RGBQuantum; + if (LocaleCompare(image_info->magick,"YCbCrA") == 0) + { + quantum_type=RGBAQuantum; + image->matte=MagickTrue; + } + pixels=GetQuantumPixels(quantum_info); + if (image_info->number_scenes != 0) + while (image->scene < image_info->scene) + { + /* + Skip to next image. + */ + image->scene++; + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + for (y=0; y < (ssize_t) image->rows; y++) + { + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + } + count=0; + length=0; + scene=0; + status=MagickTrue; + stream=NULL; + do + { + /* + Read pixels to virtual canvas image then push to image. + */ + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + break; + if (SetImageColorspace(image,YCbCrColorspace) == MagickFalse) + break; + switch (image_info->interlace) + { + case NoInterlace: + default: + { + /* + No interlacing: YCbCrYCbCrYCbCrYCbCrYCbCrYCbCr... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); + stream=ReadBlobStream(image,length,pixels,&count); + if (count != (ssize_t) length) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=QueueAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + SetPixelGreen(q,GetPixelGreen(p)); + SetPixelBlue(q,GetPixelBlue(p)); + if (image->matte != MagickFalse) + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + break; + } + case LineInterlace: + { + static QuantumType + quantum_types[4] = + { + RedQuantum, + GreenQuantum, + BlueQuantum, + OpacityQuantum + }; + + /* + Line interlacing: YYY...CbCbCb...CrCrCr...YYY...CbCbCb...CrCrCr... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + for (i=0; i < (ssize_t) (image->matte != MagickFalse ? 4 : 3); i++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + quantum_type=quantum_types[i]; + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,quantum_type,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x, + 0,canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + switch (quantum_type) + { + case RedQuantum: + { + SetPixelRed(q,GetPixelRed(p)); + break; + } + case GreenQuantum: + { + SetPixelGreen(q,GetPixelGreen(p)); + break; + } + case BlueQuantum: + { + SetPixelBlue(q,GetPixelBlue(p)); + break; + } + case OpacityQuantum: + { + SetPixelOpacity(q,GetPixelOpacity(p)); + break; + } + default: + break; + } + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + { + /* + Plane interlacing: YYYYYY...CbCbCbCbCbCb...CrCrCrCrCrCr... + */ + if (scene == 0) + { + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + stream=ReadBlobStream(image,length,pixels,&count); + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,RedQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,1,5); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,GreenQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelGreen(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,2,5); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlueQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,GetPixelBlue(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,3,5); + if (status == MagickFalse) + break; + } + if (image->matte != MagickFalse) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,AlphaQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image, + canvas_image->extract_info.x,0,canvas_image->columns,1, + exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,4,5); + if (status == MagickFalse) + break; + } + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,5,5); + if (status == MagickFalse) + break; + } + break; + } + case PartitionInterlace: + { + /* + Partition interlacing: YYYYYY..., CbCbCbCbCbCb..., CrCrCrCrCrCr... + */ + AppendImageFormat("Y",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,RedQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,1,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("Cb",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,GreenQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,GreenQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelGreen(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,2,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("Cr",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,BlueQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels(quantum_info), + &count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlueQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, + canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelBlue(q,GetPixelBlue(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,3,5); + if (status == MagickFalse) + break; + } + if (image->matte != MagickFalse) + { + (void) CloseBlob(image); + AppendImageFormat("A",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + break; + length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum); + for (i=0; i < (ssize_t) scene; i++) + { + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + (void) ReadBlobStream(image,length,GetQuantumPixels( + quantum_info),&count); + if (count != (ssize_t) length) + break; + } + if (count != (ssize_t) length) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + for (y=0; y < (ssize_t) image->extract_info.height; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, + quantum_info,BlueQuantum,(unsigned char *) stream,exception); + if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) + break; + if (((y-image->extract_info.y) >= 0) && + ((y-image->extract_info.y) < (ssize_t) image->rows)) + { + p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x, + 0,canvas_image->columns,1,exception); + q=GetAuthenticPixels(image,0,y-image->extract_info.y, + image->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || + (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,GetPixelOpacity(p)); + p++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + stream=ReadBlobStream(image,length,pixels,&count); + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,4,5); + if (status == MagickFalse) + break; + } + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,5,5); + if (status == MagickFalse) + break; + } + break; + } + } + if (status == MagickFalse) + break; + SetQuantumImageType(image,quantum_type); + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (count == (ssize_t) length) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + scene++; + } while (count == (ssize_t) length); + quantum_info=DestroyQuantumInfo(quantum_info); + InheritException(exception,&canvas_image->exception); + canvas_image=DestroyImage(canvas_image); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r Y C b C r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterYCBCRImage() adds attributes for the YCbCr or YCbCrA image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterYCBCRImage method is: +% +% size_t RegisterYCBCRImage(void) +% +*/ +ModuleExport size_t RegisterYCBCRImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("YCbCr"); + entry->decoder=(DecodeImageHandler *) ReadYCBCRImage; + entry->encoder=(EncodeImageHandler *) WriteYCBCRImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw Y, Cb, and Cr samples"); + entry->magick_module=ConstantString("YCbCr"); + (void) RegisterMagickInfo(entry); + entry=SetMagickInfo("YCbCrA"); + entry->decoder=(DecodeImageHandler *) ReadYCBCRImage; + entry->encoder=(EncodeImageHandler *) WriteYCBCRImage; + entry->raw=MagickTrue; + entry->endian_support=MagickTrue; + entry->description=ConstantString("Raw Y, Cb, Cr, and alpha samples"); + entry->magick_module=ConstantString("YCbCr"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r Y C b C r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterYCBCRImage() removes format registrations made by the +% YCbCr module from the list of supported formats. +% +% The format of the UnregisterYCBCRImage method is: +% +% UnregisterYCBCRImage(void) +% +*/ +ModuleExport void UnregisterYCBCRImage(void) +{ + (void) UnregisterMagickInfo("YCbCr"); + (void) UnregisterMagickInfo("YCbCrA"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e Y C b C r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteYCBCRImage() writes an image to a file in the YCbCr or YCbCrA +% rasterfile format. +% +% The format of the WriteYCBCRImage method is: +% +% MagickBooleanType WriteYCBCRImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteYCBCRImage(const ImageInfo *image_info, + Image *image) +{ + MagickBooleanType + status; + + MagickOffsetType + scene; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + const PixelPacket + *p; + + size_t + imageListLength, + length; + + ssize_t + count, + y; + + unsigned char + *pixels; + + /* + Allocate memory for pixels. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image_info->interlace != PartitionInterlace) + { + /* + Open output image file. + */ + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + } + quantum_type=RGBQuantum; + if (LocaleCompare(image_info->magick,"YCbCrA") == 0) + { + quantum_type=RGBAQuantum; + image->matte=MagickTrue; + } + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Convert MIFF to YCbCr raster pixels. + */ + if (image->colorspace != YCbCrColorspace) + (void) TransformImageColorspace(image,YCbCrColorspace); + if ((LocaleCompare(image_info->magick,"YCbCrA") == 0) && + (image->matte == MagickFalse)) + (void) SetImageAlphaChannel(image,ResetAlphaChannel); + quantum_info=AcquireQuantumInfo(image_info,image); + if (quantum_info == (QuantumInfo *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + pixels=GetQuantumPixels(quantum_info); + switch (image_info->interlace) + { + case NoInterlace: + default: + { + /* + No interlacing: YCbCrYCbCrYCbCrYCbCrYCbCrYCbCr... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,quantum_type,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case LineInterlace: + { + /* + Line interlacing: YYY...CbCbCb...CrCrCr...YYY...CbCbCb...CrCrCr... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GreenQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlueQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + if (quantum_type == RGBAQuantum) + { + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + break; + } + case PlaneInterlace: + { + /* + Plane interlacing: YYYYYY...CbCbCbCbCbCb...CrCrCrCrCrCr... + */ + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,5); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GreenQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,2,5); + if (status == MagickFalse) + break; + } + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlueQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,3,5); + if (status == MagickFalse) + break; + } + if (quantum_type == RGBAQuantum) + { + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + } + if (image_info->interlace == PartitionInterlace) + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,5,5); + if (status == MagickFalse) + break; + } + break; + } + case PartitionInterlace: + { + /* + Partition interlacing: YYYYYY..., CbCbCbCbCbCb..., CrCrCrCrCrCr... + */ + AppendImageFormat("Y",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,RedQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("Cb",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,GreenQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,2,5); + if (status == MagickFalse) + break; + } + (void) CloseBlob(image); + AppendImageFormat("Cr",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,BlueQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,3,5); + if (status == MagickFalse) + break; + } + if (quantum_type == RGBAQuantum) + { + (void) CloseBlob(image); + AppendImageFormat("A",image->filename); + status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode : + AppendBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1, + &image->exception); + if (p == (const PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,(const CacheView *) NULL, + quantum_info,AlphaQuantum,pixels,&image->exception); + count=WriteBlob(image,length,pixels); + if (count != (ssize_t) length) + break; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,4,5); + if (status == MagickFalse) + break; + } + } + (void) CloseBlob(image); + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,5,5); + if (status == MagickFalse) + break; + } + break; + } + } + quantum_info=DestroyQuantumInfo(quantum_info); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/coders/yuv.c b/ImageMagick-6.9.12-44/coders/yuv.c new file mode 100644 index 0000000..4cd54eb --- /dev/null +++ b/ImageMagick-6.9.12-44/coders/yuv.c @@ -0,0 +1,874 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% Y Y U U V V % +% Y Y U U V V % +% Y U U V V % +% Y U U V V % +% Y UUU V % +% % +% % +% Read/Write Raw CCIR 601 4:1:1 or 4:2:2 Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/constitute.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/quantum-private.h" +#include "magick/resize.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" +#include "magick/utility.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteYUVImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d Y U V I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadYUVImage() reads an image with digital YUV (CCIR 601 4:1:1, plane +% or partition interlaced, or 4:2:2 plane, partition interlaced or +% noninterlaced) bytes and returns it. It allocates the memory necessary +% for the new Image structure and returns a pointer to the new image. +% +% The format of the ReadYUVImage method is: +% +% Image *ReadYUVImage(const ImageInfo *image_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadYUVImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + Image + *chroma_image, + *image, + *resize_image; + + InterlaceType + interlace; + + MagickBooleanType + status; + + const PixelPacket + *chroma_pixels; + + ssize_t + x; + + PixelPacket + *q; + + unsigned char + *p; + + ssize_t + count, + horizontal_factor, + vertical_factor, + y; + + size_t + length, + quantum; + + unsigned char + *scanline; + + /* + Allocate image structure. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=AcquireImage(image_info); + if ((image->columns == 0) || (image->rows == 0)) + ThrowReaderException(OptionError,"MustSpecifyImageSize"); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + quantum=(size_t) (image->depth <= 8 ? 1 : 2); + interlace=image_info->interlace; + horizontal_factor=2; + vertical_factor=2; + if (image_info->sampling_factor != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(image_info->sampling_factor,&geometry_info); + if ((flags & RhoValue) != 0) + horizontal_factor=(ssize_t) geometry_info.rho; + vertical_factor=horizontal_factor; + if ((flags & SigmaValue) != 0) + vertical_factor=(ssize_t) geometry_info.sigma; + if ((horizontal_factor != 1) && (horizontal_factor != 2) && + (vertical_factor != 1) && (vertical_factor != 2)) + ThrowReaderException(CorruptImageError,"UnexpectedSamplingFactor"); + } + if ((interlace == UndefinedInterlace) || + ((interlace == NoInterlace) && (vertical_factor == 2))) + { + interlace=NoInterlace; /* CCIR 4:2:2 */ + if (vertical_factor == 2) + interlace=PlaneInterlace; /* CCIR 4:1:1 */ + } + if (interlace != PartitionInterlace) + { + /* + Open image file. + */ + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + } + /* + Allocate memory for a scanline. + */ + if (interlace == NoInterlace) + scanline=(unsigned char *) AcquireQuantumMemory((size_t) 2UL* + image->columns+2UL,quantum*sizeof(*scanline)); + else + scanline=(unsigned char *) AcquireQuantumMemory(image->columns, + quantum*sizeof(*scanline)); + if (scanline == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + status=MagickTrue; + do + { + chroma_image=CloneImage(image,(image->columns+horizontal_factor-1)/ + horizontal_factor,(image->rows+vertical_factor-1)/vertical_factor, + MagickTrue,exception); + if (chroma_image == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Convert raster image to pixel packets. + */ + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + break; + if (interlace == PartitionInterlace) + { + AppendImageFormat("Y",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + } + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *chroma_pixels; + + if (interlace == NoInterlace) + { + if ((y > 0) || (GetPreviousImageInList(image) == (Image *) NULL)) + { + length=2*quantum*image->columns; + count=ReadBlob(image,length,scanline); + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + } + p=scanline; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + chroma_pixels=QueueAuthenticPixels(chroma_image,0,y, + chroma_image->columns,1,exception); + if (chroma_pixels == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x+=2) + { + SetPixelRed(chroma_pixels,0); + if (quantum == 1) + SetPixelGreen(chroma_pixels,ScaleCharToQuantum(*p++)); + else + { + SetPixelGreen(chroma_pixels,ScaleShortToQuantum(((*p) << 8) | + *(p+1))); + p+=2; + } + if (quantum == 1) + SetPixelRed(q,ScaleCharToQuantum(*p++)); + else + { + SetPixelRed(q,ScaleShortToQuantum(((*p) << 8) | *(p+1))); + p+=2; + } + SetPixelGreen(q,0); + SetPixelBlue(q,0); + q++; + SetPixelGreen(q,0); + SetPixelBlue(q,0); + if (quantum == 1) + SetPixelBlue(chroma_pixels,ScaleCharToQuantum(*p++)); + else + { + SetPixelBlue(chroma_pixels,ScaleShortToQuantum(((*p) << 8) | + *(p+1))); + p+=2; + } + if (quantum == 1) + SetPixelRed(q,ScaleCharToQuantum(*p++)); + else + { + SetPixelRed(q,ScaleShortToQuantum(((*p) << 8) | *(p+1))); + p+=2; + } + chroma_pixels++; + q++; + } + } + else + { + if ((y > 0) || (GetPreviousImageInList(image) == (Image *) NULL)) + { + length=quantum*image->columns; + count=ReadBlob(image,length,scanline); + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + } + p=scanline; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (quantum == 1) + SetPixelRed(q,ScaleCharToQuantum(*p++)); + else + { + SetPixelRed(q,ScaleShortToQuantum(((*p) << 8) | *(p+1))); + p+=2; + } + SetPixelGreen(q,0); + SetPixelBlue(q,0); + q++; + } + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if (interlace == NoInterlace) + if (SyncAuthenticPixels(chroma_image,exception) == MagickFalse) + break; + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + if (interlace == PartitionInterlace) + { + (void) CloseBlob(image); + AppendImageFormat("U",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + } + if (interlace != NoInterlace) + { + for (y=0; y < (ssize_t) chroma_image->rows; y++) + { + length=quantum*chroma_image->columns; + count=ReadBlob(image,length,scanline); + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + p=scanline; + q=QueueAuthenticPixels(chroma_image,0,y,chroma_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) chroma_image->columns; x++) + { + SetPixelRed(q,0); + if (quantum == 1) + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + else + { + SetPixelGreen(q,ScaleShortToQuantum(((*p) << 8) | *(p+1))); + p+=2; + } + SetPixelBlue(q,0); + q++; + } + if (SyncAuthenticPixels(chroma_image,exception) == MagickFalse) + break; + } + if (interlace == PartitionInterlace) + { + (void) CloseBlob(image); + AppendImageFormat("V",image->filename); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + } + for (y=0; y < (ssize_t) chroma_image->rows; y++) + { + length=quantum*chroma_image->columns; + count=ReadBlob(image,length,scanline); + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } + p=scanline; + q=GetAuthenticPixels(chroma_image,0,y,chroma_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) chroma_image->columns; x++) + { + if (quantum == 1) + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + else + { + SetPixelBlue(q,ScaleShortToQuantum(((*p) << 8) | *(p+1))); + p+=2; + } + q++; + } + if (SyncAuthenticPixels(chroma_image,exception) == MagickFalse) + break; + } + } + /* + Scale image. + */ + resize_image=ResizeImage(chroma_image,image->columns,image->rows, + TriangleFilter,1.0,exception); + chroma_image=DestroyImage(chroma_image); + if (resize_image == (Image *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + for (y=0; y < (ssize_t) image->rows; y++) + { + q=GetAuthenticPixels(image,0,y,image->columns,1,exception); + chroma_pixels=GetVirtualPixels(resize_image,0,y,resize_image->columns,1, + &resize_image->exception); + if ((q == (PixelPacket *) NULL) || + (chroma_pixels == (const PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelGreen(chroma_pixels)); + SetPixelBlue(q,GetPixelBlue(chroma_pixels)); + chroma_pixels++; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } + resize_image=DestroyImage(resize_image); + if (SetImageColorspace(image,YCbCrColorspace) == MagickFalse) + break; + if (interlace == PartitionInterlace) + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + if (interlace == NoInterlace) + count=ReadBlob(image,(size_t) (2*quantum*image->columns),scanline); + else + count=ReadBlob(image,(size_t) quantum*image->columns,scanline); + if (count != 0) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + status=SetImageProgress(image,LoadImagesTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } while (count != 0); + scanline=(unsigned char *) RelinquishMagickMemory(scanline); + InheritException(exception,&image->exception); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r Y U V I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterYUVImage() adds attributes for the YUV image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterYUVImage method is: +% +% size_t RegisterYUVImage(void) +% +*/ +ModuleExport size_t RegisterYUVImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("YUV"); + entry->decoder=(DecodeImageHandler *) ReadYUVImage; + entry->encoder=(EncodeImageHandler *) WriteYUVImage; + entry->adjoin=MagickFalse; + entry->raw=MagickTrue; + entry->description=ConstantString("CCIR 601 4:1:1 or 4:2:2"); + entry->magick_module=ConstantString("YUV"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r Y U V I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterYUVImage() removes format registrations made by the +% YUV module from the list of supported formats. +% +% The format of the UnregisterYUVImage method is: +% +% UnregisterYUVImage(void) +% +*/ +ModuleExport void UnregisterYUVImage(void) +{ + (void) UnregisterMagickInfo("YUV"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e Y U V I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteYUVImage() writes an image to a file in the digital YUV +% (CCIR 601 4:1:1, plane or partition interlaced, or 4:2:2 plane, partition +% interlaced or noninterlaced) bytes and returns it. +% +% The format of the WriteYUVImage method is: +% +% MagickBooleanType WriteYUVImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteYUVImage(const ImageInfo *image_info,Image *image) +{ + Image + *chroma_image, + *yuv_image; + + InterlaceType + interlace; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + const PixelPacket + *p, + *s; + + ssize_t + x; + + size_t + height, + imageListLength, + quantum, + width; + + ssize_t + horizontal_factor, + vertical_factor, + y; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + quantum=(size_t) (image->depth <= 8 ? 1 : 2); + interlace=image->interlace; + horizontal_factor=2; + vertical_factor=2; + if (image_info->sampling_factor != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(image_info->sampling_factor,&geometry_info); + if ((flags & RhoValue) != 0) + horizontal_factor=(ssize_t) geometry_info.rho; + vertical_factor=horizontal_factor; + if ((flags & SigmaValue) != 0) + vertical_factor=(ssize_t) geometry_info.sigma; + if ((horizontal_factor != 1) && (horizontal_factor != 2) && + (vertical_factor != 1) && (vertical_factor != 2)) + ThrowWriterException(CorruptImageError,"UnexpectedSamplingFactor"); + } + if ((interlace == UndefinedInterlace) || + ((interlace == NoInterlace) && (vertical_factor == 2))) + { + interlace=NoInterlace; /* CCIR 4:2:2 */ + if (vertical_factor == 2) + interlace=PlaneInterlace; /* CCIR 4:1:1 */ + } + if (interlace != PartitionInterlace) + { + /* + Open output image file. + */ + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + } + else + { + AppendImageFormat("Y",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + } + scene=0; + imageListLength=GetImageListLength(image); + do + { + /* + Sample image to an even width and height, if necessary. + */ + image->depth=(size_t) (quantum == 1 ? 8 : 16); + width=image->columns+(image->columns & (horizontal_factor-1)); + height=image->rows+(image->rows & (vertical_factor-1)); + yuv_image=ResizeImage(image,width,height,TriangleFilter,1.0, + &image->exception); + if (yuv_image == (Image *) NULL) + ThrowWriterException(ResourceLimitError,image->exception.reason); + (void) TransformImageColorspace(yuv_image,YCbCrColorspace); + /* + Downsample image. + */ + chroma_image=ResizeImage(image,width/horizontal_factor, + height/vertical_factor,TriangleFilter,1.0,&image->exception); + if (chroma_image == (Image *) NULL) + ThrowWriterException(ResourceLimitError,image->exception.reason); + (void) TransformImageColorspace(chroma_image,YCbCrColorspace); + if (interlace == NoInterlace) + { + /* + Write noninterlaced YUV. + */ + for (y=0; y < (ssize_t) yuv_image->rows; y++) + { + p=GetVirtualPixels(yuv_image,0,y,yuv_image->columns,1, + &yuv_image->exception); + if (p == (const PixelPacket *) NULL) + break; + s=GetVirtualPixels(chroma_image,0,y,chroma_image->columns,1, + &chroma_image->exception); + if (s == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) yuv_image->columns; x+=2) + { + if (quantum == 1) + { + (void) WriteBlobByte(image,ScaleQuantumToChar( + GetPixelGreen(s))); + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelRed(p))); + p++; + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelBlue(s))); + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelRed(p))); + } + else + { + (void) WriteBlobByte(image,ScaleQuantumToChar( + GetPixelGreen(s))); + (void) WriteBlobShort(image,ScaleQuantumToShort( + GetPixelRed(p))); + p++; + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelBlue(s))); + (void) WriteBlobShort(image,ScaleQuantumToShort( + GetPixelRed(p))); + } + p++; + s++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + yuv_image=DestroyImage(yuv_image); + } + else + { + /* + Initialize Y channel. + */ + for (y=0; y < (ssize_t) yuv_image->rows; y++) + { + p=GetVirtualPixels(yuv_image,0,y,yuv_image->columns,1, + &yuv_image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) yuv_image->columns; x++) + { + if (quantum == 1) + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelRed(p))); + else + (void) WriteBlobShort(image,ScaleQuantumToShort(GetPixelRed(p))); + p++; + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, + image->rows); + if (status == MagickFalse) + break; + } + } + yuv_image=DestroyImage(yuv_image); + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,1,3); + if (status == MagickFalse) + break; + } + /* + Initialize U channel. + */ + if (interlace == PartitionInterlace) + { + (void) CloseBlob(image); + AppendImageFormat("U",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode, + &image->exception); + if (status == MagickFalse) + return(status); + } + for (y=0; y < (ssize_t) chroma_image->rows; y++) + { + p=GetVirtualPixels(chroma_image,0,y,chroma_image->columns,1, + &chroma_image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) chroma_image->columns; x++) + { + if (quantum == 1) + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelGreen(p))); + else + (void) WriteBlobShort(image,ScaleQuantumToShort( + GetPixelGreen(p))); + p++; + } + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,2,3); + if (status == MagickFalse) + break; + } + /* + Initialize V channel. + */ + if (interlace == PartitionInterlace) + { + (void) CloseBlob(image); + AppendImageFormat("V",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode, + &image->exception); + if (status == MagickFalse) + return(status); + } + for (y=0; y < (ssize_t) chroma_image->rows; y++) + { + p=GetVirtualPixels(chroma_image,0,y,chroma_image->columns,1, + &chroma_image->exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) chroma_image->columns; x++) + { + if (quantum == 1) + (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelBlue(p))); + else + (void) WriteBlobShort(image,ScaleQuantumToShort(GetPixelBlue(p))); + p++; + } + } + if (image->previous == (Image *) NULL) + { + status=SetImageProgress(image,SaveImageTag,2,3); + if (status == MagickFalse) + break; + } + } + chroma_image=DestroyImage(chroma_image); + if (interlace == PartitionInterlace) + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength); + if (status == MagickFalse) + break; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/common.shi.in b/ImageMagick-6.9.12-44/common.shi.in new file mode 100644 index 0000000..e68f67a --- /dev/null +++ b/ImageMagick-6.9.12-44/common.shi.in @@ -0,0 +1,26 @@ +# -*- shell-script -*- +# Copyright © 1999 ImageMagick Studio LLC +# Definitions of optional features and configuration values for this build. +# Intended for use by test scripts. +MAGICK_FEATURES='@MAGICK_FEATURES@' +top_srcdir='@abs_top_srcdir@' +top_builddir='@abs_top_builddir@' + +set -a +COMPARE="@abs_top_builddir@/utilities/compare" +COMPOSITE="@abs_top_builddir@/utilities/composite" +CONJURE="@abs_top_builddir@/utilities/conjure" +CONVERT="@abs_top_builddir@/utilities/convert" +DISPLAY="@abs_top_builddir@/utilities/display" +IDENTIFY="@abs_top_builddir@/utilities/identify" +MONTAGE="@abs_top_builddir@/utilities/montage" +VALIDATE="@abs_top_builddir@/tests/validate" +DRAWTEST="@abs_top_builddir@/tests/drawtest" +WANDTEST="@abs_top_builddir@/tests/wandtest" +LD_LIBRARY_PATH="@abs_top_builddir@/magick/.libs:@abs_top_builddir@/wand/.libs:${LD_LIBRARY_PATH}" +MAGICK_CODER_MODULE_PATH="@abs_top_builddir@/coders" +MAGICK_CONFIGURE_PATH="@abs_top_builddir@/config:@abs_top_srcdir@/config" +MAGICK_FILTER_MODULE_PATH="@abs_top_builddir@/filters" +MAGICK_FONT="@abs_top_srcdir@/PerlMagick/demo/Generic.ttf" +PATH="@abs_top_builddir@/utilities:@abs_top_builddir@/tests:${PATH}" +set +a diff --git a/ImageMagick-6.9.12-44/config/ImageMagick.rc b/ImageMagick-6.9.12-44/config/ImageMagick.rc new file mode 100644 index 0000000..fee0885 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/ImageMagick.rc @@ -0,0 +1,71 @@ +#include "winver.h" +#define __WINDOWS__ +#include "..\\..\\magick\\magick-baseconfig.h" +#include "..\\..\\magick\\version.h" + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// +///////////////////////////////////////////////////////////////////////////// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION MagickLibVersionNumber + PRODUCTVERSION MagickLibVersionNumber + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "ProductName", "ImageMagick\0" + VALUE "FileDescription", "ImageMagick Studio library and utility programs\0" + VALUE "OriginalFilename", "ImageMagick\0" + VALUE "InternalName", "ImageMagick\0" + VALUE "FileVersion", MagickLibVersionText "\0" + VALUE "ProductVersion", MagickLibVersionText "\0" + VALUE "CompanyName", "ImageMagick Studio\0" + VALUE "LegalCopyright", MagickCopyright "\0" + VALUE "Comments", MagickVersion "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +///////////////////////////////////////////////////////////////////////////// +// +// IMAGEMAGICK +// +///////////////////////////////////////////////////////////////////////////// + +CODER.XML IMAGEMAGICK DISCARDABLE "..\\bin\\coder.xml" +COLORS.XML IMAGEMAGICK DISCARDABLE "..\\bin\\colors.xml" +CONFIGURE.XML IMAGEMAGICK DISCARDABLE "..\\bin\\configure.xml" +DELEGATES.XML IMAGEMAGICK DISCARDABLE "..\\bin\\delegates.xml" +ENGLISH.XML IMAGEMAGICK DISCARDABLE "..\\bin\\english.xml" +LOCALE.XML IMAGEMAGICK DISCARDABLE "..\\bin\\locale.xml" +LOG.XML IMAGEMAGICK DISCARDABLE "..\\bin\\log.xml" +MAGIC.XML IMAGEMAGICK DISCARDABLE "..\\bin\\magic.xml" +THRESHOLDS.XML IMAGEMAGICK DISCARDABLE "..\\bin\\thresholds.xml" +TYPE.XML IMAGEMAGICK DISCARDABLE "..\\bin\\type.xml" +TYPE-GHOSTSCRIPT.XML IMAGEMAGICK DISCARDABLE "..\\bin\\type-ghostscript.xml" + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// +///////////////////////////////////////////////////////////////////////////// + +IDR_MAGICKICON ICON DISCARDABLE "..\\..\\images\\ImageMagick.ico" diff --git a/ImageMagick-6.9.12-44/config/ImageMagick.rdf.in b/ImageMagick-6.9.12-44/config/ImageMagick.rdf.in new file mode 100644 index 0000000..9ea2cae --- /dev/null +++ b/ImageMagick-6.9.12-44/config/ImageMagick.rdf.in @@ -0,0 +1,165 @@ + + + + + ImageMagick + ImageMagick: convert, edit, or compose images. + + @PACKAGE_RELEASE_DATE@ + + +Introduction to ImageMagick + + ImageMagick is a software suite to create, edit, compose, or convert + bitmap images. It can read and write images in a variety of formats (over + 200) including PNG, JPEG, JPEG-2000, GIF, TIFF, DPX, EXR, WebP, Postscript, + PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, + shear and transform images, adjust image colors, apply various special + effects, or draw text, lines, polygons, ellipses and Bzier curves. + + The functionality of ImageMagick is typically utilized from the command + line or you can use the features from programs written in your favorite + language. Choose from these interfaces: G2F (Ada), MagickCore (C), + MagickWand (C), ChMagick (Ch), ImageMagickObject (COM+), Magick++ (C++), + JMagick (Java), L-Magick (Lisp), Lua, NMagick (Neko/haXe), Magick.NET + (.NET), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP + (PHP), IMagick (PHP), PythonMagick (Python), RMagick (Ruby), or TclMagick + (Tcl/TK). With a language interface, use ImageMagick to modify or create + images dynamically and automagically. + + ImageMagick utilizes multiple computational threads to increase performance + and can read, process, or write mega-, giga-, or tera-pixel image sizes. + + ImageMagick is free software delivered as a ready-to-run binary distribution + or as source code that you may use, copy, modify, and distribute in both open + and proprietary applications. It is distributed under the Apache 2.0 license. + + The ImageMagick development process ensures a stable API and ABI. Before + each ImageMagick release, we perform a comprehensive security assessment + that includes memory error and thread data race detection to prevent + security vulnerabilities. + + ImageMagick is available from + https://imagemagick.org/script/download.php. It runs on Linux, Windows, + Mac Os X, iOS, Android OS, and others. + + The authoritative ImageMagick web site is + https://imagemagick.org. The authoritative source code repository is + https://git.imagemagick.org/repos/ImageMagick/. + + +Features and Capabilities + + Here are just a few examples of what ImageMagick can do: + + * Format conversion: convert an image from one format to another (e.g. + PNG to JPEG). + * Transform: resize, rotate, deskew, crop, flip or trim an image. + * Transparency: render portions of an image invisible. + * Draw: add shapes or text to an image. + * Decorate: add a border or frame to an image. + * Special effects: blur, sharpen, threshold, or tint an image. + * Animation: create a GIF animation sequence from a group of images. + * Text & comments: insert descriptive or artistic text in an image. + * Image gradients: create a gradual blend of one color whose shape is + horizontal, vertical, circular, or ellipical. + * Image identification: describe the format and attributes of an image. + * Composite: overlap one image over another. + * Montage: juxtapose image thumbnails on an image canvas. + * Generalized pixel distortion: correct for, or induce image distortions + including perspective. + * Computer vision: Canny edge detection. + * Morphology of shapes: extract features, describe shapes and recognize + patterns in images. + * Motion picture support: read and write the common image formats used in + digital film work. + * Image calculator: apply a mathematical expression to an image or image + channels. + * Connected component labeling: uniquely label connected regions in an + image. + * Discrete Fourier transform: implements the forward and inverse DFT. + * Perceptual hash: maps visually identical images to the same or similar + hash-- useful in image retrieval, authentication, indexing, or copy + detection as well as digital watermarking. + * Complex text layout: bidirectional text support and shaping. + * Color management: accurate color management with color profiles or in + lieu of-- built-in gamma compression or expansion as demanded by the + colorspace. + * High dynamic-range images: accurately represent the wide range of + intensity levels found in real scenes ranging from the brightest direct + sunlight to the deepest darkest shadows. + * Encipher or decipher an image: convert ordinary images into + unintelligible gibberish and back again. + * Virtual pixel support: convenient access to pixels outside the image + region. + * Large image support: read, process, or write mega-, giga-, or + tera-pixel image sizes. + * Threads of execution support: ImageMagick is thread safe and most + internal algorithms are OpenMP-enabled to take advantage of speed-ups + offered by multicore processor chips. + * Distributed pixel cache: offload intermediate pixel storage to one or + more remote servers. + * Heterogeneous distributed processing: certain algorithms are + OpenCL-enabled to take advantage of speed-ups offered by executing in + concert across heterogeneous platforms consisting of CPUs, GPUs, and + other processors. + * ImageMagick on the iPhone: convert, edit, or compose images on your + iPhone or iPad. + + Examples of ImageMagick Usage shows how to use ImageMagick from the + command-line to accomplish any of these tasks and much more. Also, + see Fred's ImageMagick Scripts: a plethora of command-line scripts that + perform geometric transforms, blurs, sharpens, edging, noise removal, + and color manipulations. With Magick.NET, use ImageMagick without having + to install ImageMagick on your server or desktop. + + + + + ImageMagick Studio LLC + + + + + + + stable + @PACKAGE_RELEASE_DATE@ + @PACKAGE_BASE_VERSION@ + @PACKAGE_RELEASE_DATE@ + + + + + + + + + + + + + + + + + + + + + + ImageMagick Studio LLC + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/Magick++.dox.in b/ImageMagick-6.9.12-44/config/Magick++.dox.in new file mode 100644 index 0000000..9e08d63 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/Magick++.dox.in @@ -0,0 +1,2419 @@ +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = Magick++ + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = @PACKAGE_VERSION@ + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Convert, Edit, Or Compose Bitmap Images" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = ../www/api + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = NO + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text " + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = @srcdir@/../Magick++ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: https://www.gnu.org/software/libiconv/) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.cpp \ + *.h + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = Magick++/tests \ + Magick++/demo + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = . + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 8 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = Magick++ + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: https://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = YES + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://doc.qt.io/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = YES + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /
    4%Twc5X}s{bLXKZ&k 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ξaklkYvO{tySxr2{+RsXg6fBuL(5Vxif#1s1`dC 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 BfD`}# literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/config/coder.xml b/ImageMagick-6.9.12-44/config/coder.xml new file mode 100644 index 0000000..bd80a22 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/coder.xml @@ -0,0 +1,23 @@ + + + + + +]> + + + + + + diff --git a/ImageMagick-6.9.12-44/config/colors.xml b/ImageMagick-6.9.12-44/config/colors.xml new file mode 100644 index 0000000..201b735 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/colors.xml @@ -0,0 +1,28 @@ + + + + + + +]> + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/compile b/ImageMagick-6.9.12-44/config/compile new file mode 100755 index 0000000..23fcba0 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/* | msys/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/ImageMagick-6.9.12-44/config/config.guess b/ImageMagick-6.9.12-44/config/config.guess new file mode 100755 index 0000000..b33c9e8 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/config.guess @@ -0,0 +1,1486 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-08-29' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 1 2 13 15 +trap 'exitcode=$?; test -z "$tmp" || rm -fr "$tmp"; exit $exitcode' 0 + +set_cc_for_build() { + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + UNAME_REL="`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + case `isainfo -b` in + 32) + echo i386-pc-solaris2"$UNAME_REL" + ;; + 64) + echo x86_64-pc-solaris2"$UNAME_REL" + ;; + esac + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + fi + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" + test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + # shellcheck disable=SC2154 + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/ImageMagick-6.9.12-44/config/config.h.in b/ImageMagick-6.9.12-44/config/config.h.in new file mode 100644 index 0000000..4230fd0 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/config.h.in @@ -0,0 +1,1181 @@ +/* config/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Define if you have AUTOTRACE library */ +#undef AUTOTRACE_DELEGATE + +/* Define if coders and filters are to be built as modules. */ +#undef BUILD_MODULES + +/* Define if you have the bzip2 library */ +#undef BZLIB_DELEGATE + +/* Define if you have CAIRO library */ +#undef CAIRO_DELEGATE + +/* permit enciphering and deciphering image pixels */ +#undef CIPHER_SUPPORT + +/* Define to 1 if the `closedir' function returns void instead of `int'. */ +#undef CLOSEDIR_VOID + +/* coders subdirectory. */ +#undef CODER_DIRNAME + +/* Directory where architecture-dependent configuration files live. */ +#undef CONFIGURE_PATH + +/* Subdirectory of lib where architecture-dependent configuration files live. + */ +#undef CONFIGURE_RELATIVE_PATH + +/* Define if you have DJVU library */ +#undef DJVU_DELEGATE + +/* Directory where ImageMagick documents live. */ +#undef DOCUMENTATION_PATH + +/* Define if you have Display Postscript */ +#undef DPS_DELEGATE + +/* exclude deprecated methods in MagickCore API */ +#undef EXCLUDE_DEPRECATED + +/* Directory where executables are installed. */ +#undef EXECUTABLE_PATH + +/* Define if you have FFTW library */ +#undef FFTW_DELEGATE + +/* filter subdirectory. */ +#undef FILTER_DIRNAME + +/* Define if you have FLIF library */ +#undef FLIF_DELEGATE + +/* Define if you have FONTCONFIG library */ +#undef FONTCONFIG_DELEGATE + +/* Define if you have FlashPIX library */ +#undef FPX_DELEGATE + +/* Define if you have FREETYPE library */ +#undef FREETYPE_DELEGATE + +/* Define if you have Ghostscript library or framework */ +#undef GS_DELEGATE + +/* Define if you have GVC library */ +#undef GVC_DELEGATE + +/* Define to 1 if you have the `acosh' function. */ +#undef HAVE_ACOSH + +/* Define to 1 if you have the `aligned_malloc' function. */ +#undef HAVE_ALIGNED_MALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARM_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARPA_INET_H + +/* Define to 1 if you have the `asinh' function. */ +#undef HAVE_ASINH + +/* Define to 1 if you have the `atanh' function. */ +#undef HAVE_ATANH + +/* Define to 1 if you have the `atexit' function. */ +#undef HAVE_ATEXIT + +/* Define to 1 if you have the `atoll' function. */ +#undef HAVE_ATOLL + +/* define if bool is a built-in type */ +#undef HAVE_BOOL + +/* Define to 1 if you have the `cabs' function. */ +#undef HAVE_CABS + +/* Define to 1 if you have the `carg' function. */ +#undef HAVE_CARG + +/* Define to 1 if you have the `cimag' function. */ +#undef HAVE_CIMAG + +/* Define to 1 if you have the `clock' function. */ +#undef HAVE_CLOCK + +/* Define to 1 if you have the `clock_getres' function. */ +#undef HAVE_CLOCK_GETRES + +/* Define to 1 if you have the `clock_gettime' function. */ +#undef HAVE_CLOCK_GETTIME + +/* Define to 1 if clock_gettime supports CLOCK_REALTIME. */ +#undef HAVE_CLOCK_REALTIME + +/* Define to 1 if you have the header file. */ +#undef HAVE_CL_CL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_COMPLEX_H + +/* Define to 1 if you have the `creal' function. */ +#undef HAVE_CREAL + +/* Define to 1 if you have the `ctime_r' function. */ +#undef HAVE_CTIME_R + +/* Define to 1 if you have the declaration of `pread', and to 0 if you don't. + */ +#undef HAVE_DECL_PREAD + +/* Define to 1 if you have the declaration of `pwrite', and to 0 if you don't. + */ +#undef HAVE_DECL_PWRITE + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#undef HAVE_DECL_STRERROR_R + +/* Define to 1 if you have the declaration of `strlcpy', and to 0 if you + don't. */ +#undef HAVE_DECL_STRLCPY + +/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't. + */ +#undef HAVE_DECL_TZNAME + +/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you + don't. */ +#undef HAVE_DECL_VSNPRINTF + +/* Define to 1 if you have the `directio' function. */ +#undef HAVE_DIRECTIO + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +#undef HAVE_DOPRNT + +/* Define to 1 if you have the `erf' function. */ +#undef HAVE_ERF + +/* Define to 1 if you have the header file. */ +#undef HAVE_ERRNO_H + +/* Define to 1 if you have the `execvp' function. */ +#undef HAVE_EXECVP + +/* Define to 1 if you have the `fchmod' function. */ +#undef HAVE_FCHMOD + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FLOAT_H + +/* Define to 1 if you have the `floor' function. */ +#undef HAVE_FLOOR + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#undef HAVE_FSEEKO + +/* Define to 1 if you have the `ftime' function. */ +#undef HAVE_FTIME + +/* Define to 1 if you have the `ftruncate' function. */ +#undef HAVE_FTRUNCATE + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `getc_unlocked' function. */ +#undef HAVE_GETC_UNLOCKED + +/* Define to 1 if you have the `getdtablesize' function. */ +#undef HAVE_GETDTABLESIZE + +/* Define to 1 if you have the `getentropy' function. */ +#undef HAVE_GETENTROPY + +/* Define to 1 if you have the `getexecname' function. */ +#undef HAVE_GETEXECNAME + +/* Define to 1 if you have the `getpagesize' function. */ +#undef HAVE_GETPAGESIZE + +/* Define to 1 if you have the `getpid' function. */ +#undef HAVE_GETPID + +/* Define to 1 if you have the `getpwnam_r' function. */ +#undef HAVE_GETPWNAM_R + +/* Define to 1 if you have the `getrlimit' function. */ +#undef HAVE_GETRLIMIT + +/* Define to 1 if you have the `getrusage' function. */ +#undef HAVE_GETRUSAGE + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `gmtime_r' function. */ +#undef HAVE_GMTIME_R + +/* [Compile with hugepage support] */ +#undef HAVE_HUGEPAGES + +/* Define to 1 if the system has the type `intmax_t'. */ +#undef HAVE_INTMAX_T + +/* Define to 1 if the system has the type `intptr_t'. */ +#undef HAVE_INTPTR_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `isnan' function. */ +#undef HAVE_ISNAN + +/* Define to 1 if you have the `j0' function. */ +#undef HAVE_J0 + +/* Define to 1 if you have the `j1' function. */ +#undef HAVE_J1 + +/* Define if you have jemalloc memory allocation library */ +#undef HAVE_JEMALLOC + +/* Define if you have the header file. */ +#undef HAVE_LCMS2_H + +/* Define if you have the header file. */ +#undef HAVE_LCMS2_LCMS2_H + +/* Define to 1 if you have the `gcov' library (-lgcov). */ +#undef HAVE_LIBGCOV + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define if you have Linux-compatible sendfile() */ +#undef HAVE_LINUX_SENDFILE + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_UNISTD_H + +/* Define to 1 if you have the `lltostr' function. */ +#undef HAVE_LLTOSTR + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the `localtime_r' function. */ +#undef HAVE_LOCALTIME_R + +/* Define to 1 if the system has the type `long long int'. */ +#undef HAVE_LONG_LONG_INT + +/* Define to 1 if you have the `lstat' function. */ +#undef HAVE_LSTAT + +/* Define to 1 if you have the header file. */ +#undef HAVE_MACHINE_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MACH_O_DYLD_H + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if declares mbstate_t. */ +#undef HAVE_MBSTATE_T + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the `mkdir' function. */ +#undef HAVE_MKDIR + +/* Define to 1 if you have the `mkstemp' function. */ +#undef HAVE_MKSTEMP + +/* Define to 1 if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the `munmap' function. */ +#undef HAVE_MUNMAP + +/* define if the compiler implements namespaces */ +#undef HAVE_NAMESPACES + +/* Define if g++ supports namespace std. */ +#undef HAVE_NAMESPACE_STD + +/* Define to 1 if you have the `nanosleep' function. */ +#undef HAVE_NANOSLEEP + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if you have the `newlocale' function. */ +#undef HAVE_NEWLOCALE + +/* Define to 1 if you have the header file. */ +#undef HAVE_OPENCL_CL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_OS_H + +/* Define to 1 if you have the `pclose' function. */ +#undef HAVE_PCLOSE + +/* Define to 1 if you have the `poll' function. */ +#undef HAVE_POLL + +/* Define to 1 if you have the `popen' function. */ +#undef HAVE_POPEN + +/* Define to 1 if you have the `posix_fadvise' function. */ +#undef HAVE_POSIX_FADVISE + +/* Define to 1 if you have the `posix_fallocate' function. */ +#undef HAVE_POSIX_FALLOCATE + +/* Define to 1 if you have the `posix_madvise' function. */ +#undef HAVE_POSIX_MADVISE + +/* Define to 1 if you have the `posix_memalign' function. */ +#undef HAVE_POSIX_MEMALIGN + +/* Define to 1 if you have the `posix_spawnp' function. */ +#undef HAVE_POSIX_SPAWNP + +/* Define to 1 if you have the `pow' function. */ +#undef HAVE_POW + +/* Define to 1 if you have the `pread' function. */ +#undef HAVE_PREAD + +/* Define to 1 if you have the header file. */ +#undef HAVE_PROCESS_H + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + +/* Define to 1 if you have the `pwrite' function. */ +#undef HAVE_PWRITE + +/* Define to 1 if you have the `qsort_r' function. */ +#undef HAVE_QSORT_R + +/* Define to 1 if you have the `raise' function. */ +#undef HAVE_RAISE + +/* Define to 1 if you have the `rand_r' function. */ +#undef HAVE_RAND_R + +/* Define to 1 if you have the `readlink' function. */ +#undef HAVE_READLINK + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#undef HAVE_REALLOC + +/* Define to 1 if you have the `realpath' function. */ +#undef HAVE_REALPATH + +/* Define to 1 if you have the `seekdir' function. */ +#undef HAVE_SEEKDIR + +/* Define to 1 if you have the `select' function. */ +#undef HAVE_SELECT + +/* Define to 1 if you have the `sendfile' function. */ +#undef HAVE_SENDFILE + +/* Define to 1 if you have the `setlocale' function. */ +#undef HAVE_SETLOCALE + +/* Define to 1 if you have the `setvbuf' function. */ +#undef HAVE_SETVBUF + +/* X11 server supports shape extension */ +#undef HAVE_SHAPE + +/* X11 server supports shared memory extension */ +#undef HAVE_SHARED_MEMORY + +/* Define to 1 if you have the `sigaction' function. */ +#undef HAVE_SIGACTION + +/* Define to 1 if you have the `sigemptyset' function. */ +#undef HAVE_SIGEMPTYSET + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + +/* Define to 1 if you have the `spawnvp' function. */ +#undef HAVE_SPAWNVP + +/* Define to 1 if you have the `sqrt' function. */ +#undef HAVE_SQRT + +/* Define to 1 if you have the `stat' function. */ +#undef HAVE_STAT + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDARG_H + +/* Define to 1 if stdbool.h conforms to C99. */ +#undef HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* define if the compiler supports ISO C++ standard library */ +#undef HAVE_STD_LIBS + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strcasestr' function. */ +#undef HAVE_STRCASESTR + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the `strcspn' function. */ +#undef HAVE_STRCSPN + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the `strerror_r' function. */ +#undef HAVE_STRERROR_R + +/* Define to 1 if cpp supports the ANSI # stringizing operator. */ +#undef HAVE_STRINGIZE + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strlcat' function. */ +#undef HAVE_STRLCAT + +/* Define to 1 if you have the `strlcpy' function. */ +#undef HAVE_STRLCPY + +/* Define to 1 if you have the `strncasecmp' function. */ +#undef HAVE_STRNCASECMP + +/* Define to 1 if you have the `strpbrk' function. */ +#undef HAVE_STRPBRK + +/* Define to 1 if you have the `strrchr' function. */ +#undef HAVE_STRRCHR + +/* Define to 1 if you have the `strspn' function. */ +#undef HAVE_STRSPN + +/* Define to 1 if you have the `strstr' function. */ +#undef HAVE_STRSTR + +/* Define to 1 if you have the `strtod' function. */ +#undef HAVE_STRTOD + +/* Define to 1 if you have the `strtod_l' function. */ +#undef HAVE_STRTOD_L + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the `strtoul' function. */ +#undef HAVE_STRTOUL + +/* Define to 1 if `tm_zone' is a member of `struct tm'. */ +#undef HAVE_STRUCT_TM_TM_ZONE + +/* Define to 1 if you have the header file. */ +#undef HAVE_SUN_PREFETCH_H + +/* Define to 1 if you have the `symlink' function. */ +#undef HAVE_SYMLINK + +/* Define to 1 if you have the `sysconf' function. */ +#undef HAVE_SYSCONF + +/* Define to 1 if you have the `system' function. */ +#undef HAVE_SYSTEM + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IPC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MMAN_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SENDFILE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSLIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIMES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_WAIT_H + +/* Define if you have the tcmalloc memory allocation library */ +#undef HAVE_TCMALLOC + +/* Define to 1 if you have the `telldir' function. */ +#undef HAVE_TELLDIR + +/* Define to 1 if you have the `tempnam' function. */ +#undef HAVE_TEMPNAM + +/* Define to 1 if you have the header file. */ +#undef HAVE_TIFFCONF_H + +/* Define to 1 if you have the `TIFFIsBigEndian' function. */ +#undef HAVE_TIFFISBIGENDIAN + +/* Define to 1 if you have the `TIFFIsCODECConfigured' function. */ +#undef HAVE_TIFFISCODECCONFIGURED + +/* Define to 1 if you have the `TIFFMergeFieldInfo' function. */ +#undef HAVE_TIFFMERGEFIELDINFO + +/* Define to 1 if you have the `TIFFReadEXIFDirectory' function. */ +#undef HAVE_TIFFREADEXIFDIRECTORY + +/* Define to 1 if you have the `TIFFReadGPSDirectory' function. */ +#undef HAVE_TIFFREADGPSDIRECTORY + +/* Define to 1 if you have the `TIFFSetErrorHandlerExt' function. */ +#undef HAVE_TIFFSETERRORHANDLEREXT + +/* Define to 1 if you have the `TIFFSetTagExtender' function. */ +#undef HAVE_TIFFSETTAGEXTENDER + +/* Define to 1 if you have the `TIFFSetWarningHandlerExt' function. */ +#undef HAVE_TIFFSETWARNINGHANDLEREXT + +/* Define to 1 if you have the `TIFFSwabArrayOfTriples' function. */ +#undef HAVE_TIFFSWABARRAYOFTRIPLES + +/* Define to 1 if you have the `times' function. */ +#undef HAVE_TIMES + +/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use + `HAVE_STRUCT_TM_TM_ZONE' instead. */ +#undef HAVE_TM_ZONE + +/* Define to 1 if you don't have `tm_zone' but do have the external array + `tzname'. */ +#undef HAVE_TZNAME + +/* Define to 1 if the system has the type `uintmax_t'. */ +#undef HAVE_UINTMAX_T + +/* Define to 1 if the system has the type `uintptr_t'. */ +#undef HAVE_UINTPTR_T + +/* Define to 1 if you have the `ulltostr' function. */ +#undef HAVE_ULLTOSTR + +/* Define if you have umem memory allocation library */ +#undef HAVE_UMEM + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if the system has the type `unsigned long long int'. */ +#undef HAVE_UNSIGNED_LONG_LONG_INT + +/* Define to 1 if you have the `uselocale' function. */ +#undef HAVE_USELOCALE + +/* Define to 1 if you have the `usleep' function. */ +#undef HAVE_USLEEP + +/* Define to 1 if you have the `utime' function. */ +#undef HAVE_UTIME + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTIME_H + +/* Define to 1 if you have the `vfork' function. */ +#undef HAVE_VFORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_VFORK_H + +/* Define to 1 if you have the `vfprintf' function. */ +#undef HAVE_VFPRINTF + +/* Define to 1 if you have the `vfprintf_l' function. */ +#undef HAVE_VFPRINTF_L + +/* Define to 1 if you have the `vprintf' function. */ +#undef HAVE_VPRINTF + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Define to 1 if you have the `vsnprintf_l' function. */ +#undef HAVE_VSNPRINTF_L + +/* Define to 1 if you have the `vsprintf' function. */ +#undef HAVE_VSPRINTF + +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + +/* Define to 1 if you have the header file. */ +#undef HAVE_WCHAR_H + +/* Define to 1 if `fork' works. */ +#undef HAVE_WORKING_FORK + +/* Define to 1 if `vfork' works. */ +#undef HAVE_WORKING_VFORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_XLOCALE_H + +/* Define to 1 if you have the `_aligned_malloc' function. */ +#undef HAVE__ALIGNED_MALLOC + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +/* Define to 1 if you have the `_exit' function. */ +#undef HAVE__EXIT + +/* Define to 1 if you have the `_NSGetExecutablePath' function. */ +#undef HAVE__NSGETEXECUTABLEPATH + +/* Define to 1 if you have the `_pclose' function. */ +#undef HAVE__PCLOSE + +/* Define to 1 if you have the `_popen' function. */ +#undef HAVE__POPEN + +/* Define to 1 if you have the `_wfopen' function. */ +#undef HAVE__WFOPEN + +/* Define to 1 if you have the `_wstat' function. */ +#undef HAVE__WSTAT + +/* define if your compiler has __attribute__ */ +#undef HAVE___ATTRIBUTE__ + +/* Whether hdri is enabled or not */ +#undef HDRI_ENABLE_OBSOLETE_IN_H + +/* Define if you have libheif library */ +#undef HEIC_DELEGATE + +/* Directory where ImageMagick architecture headers live. */ +#undef INCLUDEARCH_PATH + +/* Directory where ImageMagick headers live. */ +#undef INCLUDE_PATH + +/* ImageMagick is formally installed under prefix */ +#undef INSTALLED_SUPPORT + +/* Define if you have JBIG library */ +#undef JBIG_DELEGATE + +/* Define if you have JPEG library */ +#undef JPEG_DELEGATE + +/* Define if you have brunsli library */ +#undef JXL_DELEGATE + +/* Define if you have LCMS library */ +#undef LCMS_DELEGATE + +/* Define if you have OPENJP2 library */ +#undef LIBOPENJP2_DELEGATE + +/* Directory where architecture-dependent files live. */ +#undef LIBRARY_PATH + +/* Subdirectory of lib where ImageMagick architecture dependent files are + installed. */ +#undef LIBRARY_RELATIVE_PATH + +/* Binaries in libraries path base name (will be during install linked to bin) + */ +#undef LIB_BIN_BASEDIRNAME + +/* Define if you have LQR library */ +#undef LQR_DELEGATE + +/* Define if using libltdl to support dynamically loadable modules and OpenCL + */ +#undef LTDL_DELEGATE + +/* Native module suffix */ +#undef LTDL_MODULE_EXT + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Define if you have LZMA library */ +#undef LZMA_DELEGATE + +/* Define to prepend to default font search path. */ +#undef MAGICK_FONT_PATH + +/* Target Host CPU */ +#undef MAGICK_TARGET_CPU + +/* Target Host OS */ +#undef MAGICK_TARGET_OS + +/* Target Host Vendor */ +#undef MAGICK_TARGET_VENDOR + +/* Module directory name without ABI part. */ +#undef MODULES_BASEDIRNAME + +/* Module directory dirname */ +#undef MODULES_DIRNAME + +/* Magick API method prefix */ +#undef NAMESPACE_PREFIX + +/* Magick API method prefix tag */ +#undef NAMESPACE_PREFIX_TAG + +/* Define to 1 if assertions should be disabled. */ +#undef NDEBUG + +/* Define if you have OPENEXR library */ +#undef OPENEXR_DELEGATE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define if you have PANGOCAIRO library */ +#undef PANGOCAIRO_DELEGATE + +/* Define if you have PANGO library */ +#undef PANGO_DELEGATE + +/* enable pipes (|) in filenames */ +#undef PIPES_SUPPORT + +/* Define if you have PNG library */ +#undef PNG_DELEGATE + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* Pixel cache threshold in MB (defaults to available memory) */ +#undef PixelCacheThreshold + +/* Number of bits in a pixel Quantum (8/16/32/64) */ +#undef QUANTUM_DEPTH_OBSOLETE_IN_H + +/* Define if you have RAQM library */ +#undef RAQM_DELEGATE + +/* Define if you have LIBRAW library */ +#undef RAW_R_DELEGATE + +/* Define if you have RSVG library */ +#undef RSVG_DELEGATE + +/* Define to the type of arg 1 for `select'. */ +#undef SELECT_TYPE_ARG1 + +/* Define to the type of args 2, 3 and 4 for `select'. */ +#undef SELECT_TYPE_ARG234 + +/* Define to the type of arg 5 for `select'. */ +#undef SELECT_TYPE_ARG5 + +/* Setjmp/longjmp are thread safe */ +#undef SETJMP_IS_THREAD_SAFE + +/* Sharearch directory name without ABI part. */ +#undef SHAREARCH_BASEDIRNAME + +/* Sharearch directory dirname */ +#undef SHAREARCH_DIRNAME + +/* Directory where architecture-independent configuration files live. */ +#undef SHARE_PATH + +/* Subdirectory of lib where architecture-independent configuration files + live. */ +#undef SHARE_RELATIVE_PATH + +/* The size of `double', as computed by sizeof. */ +#undef SIZEOF_DOUBLE + +/* The size of `double_t', as computed by sizeof. */ +#undef SIZEOF_DOUBLE_T + +/* The size of `float', as computed by sizeof. */ +#undef SIZEOF_FLOAT + +/* The size of `float_t', as computed by sizeof. */ +#undef SIZEOF_FLOAT_T + +/* The size of `long double', as computed by sizeof. */ +#undef SIZEOF_LONG_DOUBLE + +/* The size of `unsigned long long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG_LONG + +/* The size of `void *', as computed by sizeof. */ +#undef SIZEOF_VOID_P + +/* Define to 1 if the `S_IS*' macros in do not work properly. */ +#undef STAT_MACROS_BROKEN + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if strerror_r returns char *. */ +#undef STRERROR_R_CHAR_P + +/* Define if you have POSIX threads libraries and header files. */ +#undef THREAD_SUPPORT + +/* Define if you have TIFF library */ +#undef TIFF_DELEGATE + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define to 1 if your declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Define if you have WEBPMUX library */ +#undef WEBPMUX_DELEGATE + +/* Define if you have WEBP library */ +#undef WEBP_DELEGATE + +/* Define to use the Windows GDI32 library */ +#undef WINGDI32_DELEGATE + +/* Define if using the dmalloc debugging malloc package */ +#undef WITH_DMALLOC + +/* Define if you have WMF library */ +#undef WMF_DELEGATE + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Location of X11 configure files */ +#undef X11_CONFIGURE_PATH + +/* Define if you have X11 library */ +#undef X11_DELEGATE + +/* Define if you have XML library */ +#undef XML_DELEGATE + +/* Define to 1 if the X Window System is missing or not being used. */ +#undef X_DISPLAY_MISSING + +/* Build self-contained, embeddable, zero-configuration ImageMagick */ +#undef ZERO_CONFIGURATION_SUPPORT + +/* Define if you have ZLIB library */ +#undef ZLIB_DELEGATE + +/* Define if you have ZSTD library */ +#undef ZSTD_DELEGATE + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* enable run-time bounds-checking */ +#undef _FORTIFY_SOURCE + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +#undef _LARGEFILE_SOURCE + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Define for Solaris 2.5.1 so the uint32_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT32_T + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT64_T + +/* Define for Solaris 2.5.1 so the uint8_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT8_T + +/* Define to 1 if type `char' is unsigned and you are not using gcc. */ +#ifndef __CHAR_UNSIGNED__ +# undef __CHAR_UNSIGNED__ +#endif + +/* Define to appropriate substitute if compiler does not have __func__ */ +#undef __func__ + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `int' if doesn't define. */ +#undef gid_t + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to the type of a signed integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#undef int16_t + +/* Define to the type of a signed integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef int32_t + +/* Define to the type of a signed integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef int64_t + +/* Define to the type of a signed integer type of width exactly 8 bits if such + a type exists and the standard includes do not define it. */ +#undef int8_t + +/* Define to the widest signed integer type if and do + not define. */ +#undef intmax_t + +/* Define to the type of a signed integer type wide enough to hold a pointer, + if such a type exists, and if the system does not define it. */ +#undef intptr_t + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to a type if does not define. */ +#undef mbstate_t + +/* Define to `int' if does not define. */ +#undef mode_t + +/* Define to `long int' if does not define. */ +#undef off_t + +/* Define to `int' if does not define. */ +#undef pid_t + +/* Define to rpl_realloc if the replacement function should be used. */ +#undef realloc + +/* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +#undef restrict +/* Work around a bug in Sun C++: it does not support _Restrict or + __restrict__, even though the corresponding Sun C compiler ends up with + "#define restrict _Restrict" or "#define restrict __restrict__" in the + previous line. Perhaps some future version of Sun C++ will work with + restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +# define __restrict__ +#endif + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to `int' if does not define. */ +#undef ssize_t + +/* Define to `int' if doesn't define. */ +#undef uid_t + +/* Define to the type of an unsigned integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#undef uint16_t + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef uint32_t + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef uint64_t + +/* Define to the type of an unsigned integer type of width exactly 8 bits if + such a type exists and the standard includes do not define it. */ +#undef uint8_t + +/* Define to the widest unsigned integer type if and + do not define. */ +#undef uintmax_t + +/* Define to the type of an unsigned integer type wide enough to hold a + pointer, if such a type exists, and if the system does not define it. */ +#undef uintptr_t + +/* Define as `fork' if `vfork' does not work. */ +#undef vfork + +/* Define to empty if the keyword `volatile' does not work. Warning: valid + code using `volatile' can become incorrect without. Disable with care. */ +#undef volatile diff --git a/ImageMagick-6.9.12-44/config/config.sub b/ImageMagick-6.9.12-44/config/config.sub new file mode 100755 index 0000000..b51fb8c --- /dev/null +++ b/ImageMagick-6.9.12-44/config/config.sub @@ -0,0 +1,1790 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-08-29' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +IFS="-" read -r field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ + | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + os=linux-android + ;; + *) + basic_machine=$field1-$field2 + os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any patern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + os= + ;; + *) + basic_machine=$field1 + os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + os=bsd + ;; + a29khif) + basic_machine=a29k-amd + os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=scout + ;; + alliant) + basic_machine=fx80-alliant + os= + ;; + altos | altos3068) + basic_machine=m68k-altos + os= + ;; + am29k) + basic_machine=a29k-none + os=bsd + ;; + amdahl) + basic_machine=580-amdahl + os=sysv + ;; + amiga) + basic_machine=m68k-unknown + os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=bsd + ;; + aros) + basic_machine=i386-pc + os=aros + ;; + aux) + basic_machine=m68k-apple + os=aux + ;; + balance) + basic_machine=ns32k-sequent + os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=linux + ;; + cegcc) + basic_machine=arm-unknown + os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=bsd + ;; + convex-c2) + basic_machine=c2-convex + os=bsd + ;; + convex-c32) + basic_machine=c32-convex + os=bsd + ;; + convex-c34) + basic_machine=c34-convex + os=bsd + ;; + convex-c38) + basic_machine=c38-convex + os=bsd + ;; + cray) + basic_machine=j90-cray + os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + os= + ;; + da30) + basic_machine=m68k-da30 + os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + os= + ;; + delta88) + basic_machine=m88k-motorola + os=sysv3 + ;; + dicos) + basic_machine=i686-pc + os=dicos + ;; + djgpp) + basic_machine=i586-pc + os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=ose + ;; + gmicro) + basic_machine=tron-gmicro + os=sysv + ;; + go32) + basic_machine=i386-pc + os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=hms + ;; + harris) + basic_machine=m88k-harris + os=sysv3 + ;; + hp300) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=hpux + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=proelf + ;; + i386mach) + basic_machine=i386-mach + os=mach + ;; + vsta) + basic_machine=i386-pc + os=vsta + ;; + isi68 | isi) + basic_machine=m68k-isi + os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + os=sysv + ;; + merlin) + basic_machine=ns32k-utek + os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + os=coff + ;; + morphos) + basic_machine=powerpc-unknown + os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=moxiebox + ;; + msdos) + basic_machine=i386-pc + os=msdos + ;; + msys) + basic_machine=i686-pc + os=msys + ;; + mvs) + basic_machine=i370-ibm + os=mvs + ;; + nacl) + basic_machine=le32-unknown + os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=newsos + ;; + news1000) + basic_machine=m68030-sony + os=newsos + ;; + necv70) + basic_machine=v70-nec + os=sysv + ;; + nh3000) + basic_machine=m68k-harris + os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=cxux + ;; + nindy960) + basic_machine=i960-intel + os=nindy + ;; + mon960) + basic_machine=i960-intel + os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=ose + ;; + os68k) + basic_machine=m68k-none + os=os68k + ;; + paragon) + basic_machine=i860-intel + os=osf + ;; + parisc) + basic_machine=hppa-unknown + os=linux + ;; + pw32) + basic_machine=i586-unknown + os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=rdos + ;; + rdos32) + basic_machine=i386-pc + os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=coff + ;; + sa29200) + basic_machine=a29k-amd + os=udi + ;; + sei) + basic_machine=mips-sei + os=seiux + ;; + sequent) + basic_machine=i386-sequent + os= + ;; + sps7) + basic_machine=m68k-bull + os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + os= + ;; + stratus) + basic_machine=i860-stratus + os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + os= + ;; + sun2os3) + basic_machine=m68000-sun + os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + os= + ;; + sun3os3) + basic_machine=m68k-sun + os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + os= + ;; + sun4os3) + basic_machine=sparc-sun + os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + os= + ;; + sv1) + basic_machine=sv1-cray + os=unicos + ;; + symmetry) + basic_machine=i386-sequent + os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=unicos + ;; + t90) + basic_machine=t90-cray + os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + os=tpf + ;; + udi29k) + basic_machine=a29k-amd + os=udi + ;; + ultra3) + basic_machine=a29k-nyu + os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=none + ;; + vaxv) + basic_machine=vax-dec + os=sysv + ;; + vms) + basic_machine=vax-dec + os=vms + ;; + vxworks960) + basic_machine=i960-wrs + os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=vxworks + ;; + xbox) + basic_machine=i686-pc + os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + os=unicos + ;; + *) + basic_machine=$1 + os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + os=${os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + os=${os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $os in + irix*) + ;; + *) + os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $os in + nextstep* ) + ;; + ns2*) + os=nextstep2 + ;; + *) + os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + os=${os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + IFS="-" read -r cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x$os != x ] +then +case $os in + # First match some system type aliases that might get confused + # with valid system types. + # solaris* is a basic system type, with this one exception. + auroraux) + os=auroraux + ;; + bluegene*) + os=cnk + ;; + solaris1 | solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + solaris) + os=solaris2 + ;; + unixware*) + os=sysv4.2uw + ;; + gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # es1800 is here to avoid being matched by es* (a different OS) + es1800*) + os=ose + ;; + # Some version numbers need modification + chorusos*) + os=chorusos + ;; + isc) + os=isc2.2 + ;; + sco6) + os=sco5v6 + ;; + sco5) + os=sco3.2v5 + ;; + sco4) + os=sco3.2v4 + ;; + sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + ;; + sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + scout) + # Don't match below + ;; + sco*) + os=sco3.2v2 + ;; + psos*) + os=psos + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + # sysv* is not here because it comes later, after sysvr4. + gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | kopensolaris* | plan9* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | knetbsd* | mirbsd* | netbsd* \ + | bitrig* | openbsd* | solidbsd* | libertybsd* \ + | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ + | linux-newlib* | linux-musl* | linux-uclibc* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* \ + | morphos* | superux* | rtmk* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + qnx*) + case $cpu in + x86 | i*86) + ;; + *) + os=nto-$os + ;; + esac + ;; + hiux*) + os=hiuxwe2 + ;; + nto-qnx*) + ;; + nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + sim | xray | os68k* | v88r* \ + | windows* | osx | abug | netware* | os9* \ + | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) + ;; + linux-dietlibc) + os=linux-dietlibc + ;; + linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + lynx*178) + os=lynxos178 + ;; + lynx*5) + os=lynxos5 + ;; + lynx*) + os=lynxos + ;; + mac*) + os=`echo "$os" | sed -e 's|mac|macos|'` + ;; + opened*) + os=openedition + ;; + os400*) + os=os400 + ;; + sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + ;; + sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + ;; + wince*) + os=wince + ;; + utek*) + os=bsd + ;; + dynix*) + os=bsd + ;; + acis*) + os=aos + ;; + atheos*) + os=atheos + ;; + syllable*) + os=syllable + ;; + 386bsd) + os=bsd + ;; + ctix* | uts*) + os=sysv + ;; + nova*) + os=rtmk-nova + ;; + ns2) + os=nextstep2 + ;; + nsk*) + os=nsk + ;; + # Preserve the version number of sinix5. + sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + sinix*) + os=sysv4 + ;; + tpf*) + os=tpf + ;; + triton*) + os=sysv3 + ;; + oss*) + os=sysv3 + ;; + svr4*) + os=sysv4 + ;; + svr3) + os=sysv3 + ;; + sysvr4) + os=sysv4 + ;; + # This must come after sysvr4. + sysv*) + ;; + ose*) + os=ose + ;; + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + os=mint + ;; + zvmoe) + os=zvmoe + ;; + dicos*) + os=dicos + ;; + pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $cpu in + arm*) + os=eabi + ;; + *) + os=elf + ;; + esac + ;; + nacl*) + ;; + ios) + ;; + none) + ;; + *-eabi) + ;; + *) + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $cpu-$vendor in + score-*) + os=elf + ;; + spu-*) + os=elf + ;; + *-acorn) + os=riscix1.2 + ;; + arm*-rebel) + os=linux + ;; + arm*-semi) + os=aout + ;; + c4x-* | tic4x-*) + os=coff + ;; + c8051-*) + os=elf + ;; + clipper-intergraph) + os=clix + ;; + hexagon-*) + os=elf + ;; + tic54x-*) + os=coff + ;; + tic55x-*) + os=coff + ;; + tic6x-*) + os=coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=tops20 + ;; + pdp11-*) + os=none + ;; + *-dec | vax-*) + os=ultrix4.2 + ;; + m68*-apollo) + os=domain + ;; + i386-sun) + os=sunos4.0.2 + ;; + m68000-sun) + os=sunos3 + ;; + m68*-cisco) + os=aout + ;; + mep-*) + os=elf + ;; + mips*-cisco) + os=elf + ;; + mips*-*) + os=elf + ;; + or32-*) + os=coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=sysv3 + ;; + sparc-* | *-sun) + os=sunos4.1.1 + ;; + pru-*) + os=elf + ;; + *-be) + os=beos + ;; + *-ibm) + os=aix + ;; + *-knuth) + os=mmixware + ;; + *-wec) + os=proelf + ;; + *-winbond) + os=proelf + ;; + *-oki) + os=proelf + ;; + *-hp) + os=hpux + ;; + *-hitachi) + os=hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=sysv + ;; + *-cbm) + os=amigaos + ;; + *-dg) + os=dgux + ;; + *-dolphin) + os=sysv3 + ;; + m68k-ccur) + os=rtu + ;; + m88k-omron*) + os=luna + ;; + *-next) + os=nextstep + ;; + *-sequent) + os=ptx + ;; + *-crds) + os=unos + ;; + *-ns) + os=genix + ;; + i370-*) + os=mvs + ;; + *-gould) + os=sysv + ;; + *-highlevel) + os=bsd + ;; + *-encore) + os=bsd + ;; + *-sgi) + os=irix + ;; + *-siemens) + os=sysv4 + ;; + *-masscomp) + os=rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=uxpv + ;; + *-rom68k) + os=coff + ;; + *-*bug) + os=coff + ;; + *-apple) + os=macos + ;; + *-atari*) + os=mint + ;; + *-wrs) + os=vxworks + ;; + *) + os=none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $os in + riscix*) + vendor=acorn + ;; + sunos*) + vendor=sun + ;; + cnk*|-aix*) + vendor=ibm + ;; + beos*) + vendor=be + ;; + hpux*) + vendor=hp + ;; + mpeix*) + vendor=hp + ;; + hiux*) + vendor=hitachi + ;; + unos*) + vendor=crds + ;; + dgux*) + vendor=dg + ;; + luna*) + vendor=omron + ;; + genix*) + vendor=ns + ;; + clix*) + vendor=intergraph + ;; + mvs* | opened*) + vendor=ibm + ;; + os400*) + vendor=ibm + ;; + ptx*) + vendor=sequent + ;; + tpf*) + vendor=ibm + ;; + vxsim* | vxworks* | windiss*) + vendor=wrs + ;; + aux*) + vendor=apple + ;; + hms*) + vendor=hitachi + ;; + mpw* | macos*) + vendor=apple + ;; + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + vendor=atari + ;; + vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/ImageMagick-6.9.12-44/config/configure.xml.in b/ImageMagick-6.9.12-44/config/configure.xml.in new file mode 100644 index 0000000..8433dea --- /dev/null +++ b/ImageMagick-6.9.12-44/config/configure.xml.in @@ -0,0 +1,50 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/delegates.xml.in b/ImageMagick-6.9.12-44/config/delegates.xml.in new file mode 100644 index 0000000..95fea07 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/delegates.xml.in @@ -0,0 +1,121 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/depcomp b/ImageMagick-6.9.12-44/config/depcomp new file mode 100755 index 0000000..6b39162 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/ImageMagick-6.9.12-44/config/english.xml b/ImageMagick-6.9.12-44/config/english.xml new file mode 100644 index 0000000..6c234e9 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/english.xml @@ -0,0 +1,1636 @@ + + + + + + + + + +]> + + + + + + unable to open image + + + unable to open file + + + unable to read blob + + + unable to write blob + + + unrecognized image format + + + zero-length blob not permitted + + + + + + + cache resources exhausted + + + incompatible API + + + no pixels defined in cache + + + pixel cache is not open + + + pixels are not authentic + + + unable to clone cache + + + unable to extend cache + + + unable to get cache nexus + + + unable to open pixel cache + + + unable to persist pixel cache + + + unable to read pixel cache + + + unable to write pixel cache + + + + + unable to acquire cache view + + + unable to extent pixel cache + + + + + + + colormap type not supported + + + colorspace model is not supported + + + compression not supported + + + data encoding scheme is not supported + + + data storage type is not supported + + + delta-PNG is not supported + + + encrypted WPG image file not supported + + + fractal compression not supported + + + image column or row size is not supported + + + image does not have a clip mask + + + image does not have a alpha channel + + + image does not have a EXIF thumbnail + + + image is not tiled + + + irregular channel geometry not supported + + + JNG compression not supported + + + JPEG compression not supported + + + JPEG embedding failed + + + location type is not supported + + + map storage type is not supported + + + multi-dimensional matrices are not supported + + + multiple record list not supported + + + no bitmap on clipboard + + + no APP1 data is available + + + no 8BIM data is available + + + no color profile is available + + + no data returned + + + no image vector graphics; unable to generate SVG + + + no IPTC profile available + + + number of images is not supported + + + only continuous tone picture supported + + + only level zero files Supported + + + PNG compression not supported + + + RLE compression not supported + + + unable to copy profile + + + unable to create bitmap + + + unable to create a DC + + + unable to decompress image + + + unable to write MPEG parameters + + + unable to zip-compress image + + + ZIP compression not supported + + + + + exif profile size exceeds limit and will be truncated + + + lossless to lossy JPEG conversion + + + + + + + include element nested too deeply + + + + + unable to access configure file + + + unable to open module file + + + + + + + + an error has occurred reading from file + + + an error has occurred writing to file + + + cipher support not enabled + + + colormap exceeded 256 colors + + + corrupt image + + + file format version mismatch + + + image depth not supported + + + image file does not contain any image data + + + image type not supported + + + improper image header + + + insufficient image data in file + + + invalid colormap index + + + invalid pixel + + + length and filesize do not match + + + maximum channels exceeded + + + missing image channel + + + negative or zero image size + + + non OS2 BMP header size less than 40 + + + not enough pixel data + + + not enough tiles found in level + + + too much image data in file + + + static planes value not equal to 1 + + + unable to read extension block + + + unable to read image header + + + unable to read image data + + + unable to runlength decode image + + + unable to uncompress image + + + unexpected end-of-file + + + unexpected sampling factor + + + unknown pattern type + + + unrecognized alpha channel tpe + + + unrecognized compression + + + unrecognized number of colors + + + unsupported bits per pixel + + + + + unable to persist key + + + + + insufficient image data in file + + + length and filesize do not match + + + corrupt PCD image, skipping to sync byte + + + + + + + + delegate failed + + + failed to compute output size + + + failed to render file + + + failed to scan file + + + no tag found + + + PCL delegate failed + + + Postscript delegate failed + + + unable to create image + + + unable to decode image file + + + unable to encode image file + + + unable to initialize FPX library + + + unable to initialize WMF library + + + unable to manage JP2 stream + + + unable to read aspect ratio + + + unable to read summary info + + + unable to set affine matrix + + + unable to set aspect ratio + + + unable to set color twist + + + unable to set contrast + + + unable to set filtering value + + + unable to set image title + + + unable to set JPEG level + + + unable to set region of interest + + + unable to set summary info + + + unable to write SVG format + + + XPS delegate failed + + + + + + + already pushing pattern definition + + + non-conforming drawing primitive definition + + + not a relative URL + + + not currently pushing pattern definition + + + segment stack overflow + + + too many bezier coordinates + + + unable to print + + + unbalanced graphic context push-pop + + + URL not found + + + vector graphics nested too deeply + + + + + + + + an error has occurred reading from file + + + unable to create temporary file + + + unable to open file + + + unable to write file + + + + + + + + angle is discontinuous + + + colormapped image required + + + color separated image required + + + color profile operates on another colorspace + + + image depth not supported + + + image morphology differs + + + image sequence is required + + + image size differs + + + images too dissimilar + + + left and right image sizes differ + + + negative or zero image size + + + no images were found + + + no images were loaded + + + too many cluster + + + unable to create color transform + + + width or height exceeds limit + + + + + associate profile with image, a source and destination color profile required for transform + + + unable to transform colorspace + + + + + + + filter failed + + + + + + + + delegate library support not built-in + + + no decode delegate for this image format + + + no encode delegate for this image format + + + + + delegate library support not built-in + + + FreeType library is not available + + + LCMS color profile library is not available + + + no encode delegate for this image format + + + + + + + + image coder signature mismatch + + + image filter signature mismatch + + + unable to load module + + + unable to register image format + + + + + unable to initialize module loader + + + + + unable to close module + + + + + + + + attempt to perform an operation not allowed by the security policy + + + + + + + unable to get registry ID + + + unable to set registry + + + + + + + + memory allocation failed + + + list length exceeds limit + + + pixel cache allocation failed + + + too many exceptions + + + too many objects + + + unable to acquire string + + + unable to allocate colormap + + + unable to convert font + + + unable to create colormap + + + unable to dither image + + + unable to clone package info + + + unable to get package info + + + + + time limit exceeded + + + unable to allocate dash pattern + + + unable to allocate derivates + + + unable to allocate gamma map + + + unable to allocate image + + + unable to allocate image pixels + + + unable to destroy semaphore + + + unable to instantiate semaphore + + + unable to allocate string + + + Memory allocation failed + + + unable to concatenate string + + + unable to convert text + + + unable to create colormap + + + unable to clone image + + + unable to display image + + + unable to escape string + + + unable to interpret MSL image + + + unable to lock semaphore + + + unable to unlock semaphore + + + + + memory allocation failed + + + + + + + + font substitution required + + + unable to get type metrics + + + unable to initialize freetype library + + + unable to read font + + + unrecognized font encoding + + + + + unable to read font + + + + + + + image does not contain the stream geometry + + + no stream handler is defined + + + pixel cache is not open + + + + + + + invalid colormap index + + + zero region size + + + unable to open file + + + wand quantum depth does not match that of the core API + + + wand contains no images + + + wand contains no iterators + + + + + + + color is not known to server + + + no window with specified ID exists + + + standard Colormap is not initialized + + + unable to connect to remote display + + + unable to create bitmap + + + unable to create colormap + + + unable to create pixmap + + + unable to create property + + + unable to create standard colormap + + + unable to display image info + + + unable to get property + + + unable to get Standard Colormap + + + unable to get visual + + + unable to grab mouse + + + unable to load font + + + unable to match visual to Standard Colormap + + + unable to open X server + + + unable to read X window attributes + + + unable to read X window image + + + unrecognized colormap type + + + unrecognized gravity type + + + unrecognized visual specifier + + + + + unable to create X cursor + + + unable to create graphic context + + + unable to create standard colormap + + + unable to create text property + + + unable to create X window + + + unable to create X image + + + unable to create X pixmap + + + unable to display image + + + unable to get visual + + + unable to get pixel info + + + unable to load font + + + unable to make X window + + + unable to open X server + + + unable to view fonts + + + + + using default visual + + + unable to get visual + + + + + + + + add noise to image + + + + + append image sequence + + + + + assign image colors + + + + + average image sequence + + + + + chop image + + + + + classify image colors + + + + + replace color in image + + + + + colorize image + + + + + combine image + + + + + contrast-stretch image + + + + + convolve image + + + + + crop image + + + + + decode image + + + + + despeckle image + + + + + distort image + + + + + dither image colors + + + + + dull image contrast + + + + + encode image + + + + + equalize image + + + + + flip image + + + + + flop image + + + + + add frame to image + + + + + fx image + + + + + gamma correct image + + + + + compute image histogram + + + + + implode image + + + + + level image + + + + + load image + + + load images + + + + + magnfiy image + + + + + filter image with neighborhood ranking + + + + + minify image + + + + + modulate image + + + + + mogrify image + + + + + montage image + + + + + morph image sequence + + + + + mosaic image + + + + + negate image + + + + + oil paint image + + + + + set opaque color in image + + + + + plasma image + + + + + preview image + + + + + raise image + + + + + recolor color image + + + + + reduce image colors + + + + + reduce the image noise + + + + + render image + + + + + resize image + + + + + RGB transform image + + + + + roll image + + + + + rotate image + + + + + sample image + + + + + save image + + + save images + + + + + scale image + + + + + segment image + + + + + extract a channel from image + + + + + sepia-tone image + + + + + shade image + + + + + sharpen image + + + + + sharpen image contrast + + + + + sigmoidal contrast image + + + + + solarize image + + + + + splice image + + + + + spread image + + + + + stegano image + + + + + stereo image + + + + + swirl image + + + + + texture image + + + + + threshold image + + + + + tile image + + + + + tint image + + + + + transform RGB image + + + + + set transparent color in image + + + + + wave image + + + + + write image + + + + + x shear image + + + + + y shear image + + + + diff --git a/ImageMagick-6.9.12-44/config/francais.xml b/ImageMagick-6.9.12-44/config/francais.xml new file mode 100644 index 0000000..d561680 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/francais.xml @@ -0,0 +1,1612 @@ + + + + + + + + + +]> + + + + + + impossible d'ouvrir l'image + + + impossible d'ouvrir le fichier + + + impossible de lire un blob + + + impossible d'écrire un blob + + + format d'image non reconnu + + + blob de taille nulle non autorisé + + + + + + + Ressources du cache épuisées + + + incompatible API + + + pas de pixels définis dans le cache + + + cache pixels non ouvert + + + pixels are not authentic + + + impossible de clôner le cache + + + impossible d'étendre le cache + + + impossible de récupérer le nexus du cache + + + impossible d'ouvrir le cache pixels + + + impossible de rendre persistant le cache pixels + + + impossible de lire le cache pixels + + + impossible d'écrire le cache pixels + + + + + échec allocation cache view + + + impossible extend le cache pixels + + + + + + + table de couleurs non supportée + + + espace colorimétrique non supporté + + + schéma d'encodage de données non supporté + + + type de stockage de données non supporté + + + delta-PNG non supporté + + + image WPG encryptée non supportée + + + compression Fractal non supportée + + + nombre de lignes ou de colonnes dans l'image non supporté + + + image sans masque de coupe + + + image sans vignette EXIF + + + l'image n'a pas de canal de transparence + + + l'image n'a pas tiled + + + irregular channel geometry not supported + + + compression JNG non supportée + + + compression JPEG non supportée + + + Échec incorporation JPEG + + + Type d'emplacement non supporté + + + Map storage type is not supported + + + Matrices multi-dimensionnelles non supportées + + + Liste à enregistrements multiples non supportée + + + pas de bitmap dans le presse-papier + + + pas de données APP1 disponibles + + + pas de données 8BIM disponibles + + + pas de profil colorimétrique disponible + + + aucune donnée fournie + + + pas d'image en graphique vectoriel; unable to generate SVG + + + pas de profil IPTC disponible + + + nombre d'images non supporté + + + seules les images à tons continus sont supportées + + + seuls les fichiers de niveau zéro sont supportés + + + compression PNG non supportée + + + compression RLE non supportée + + + impossible de copier le profil + + + impossible de créer la bitmap + + + impossible de créer un DC + + + impossible de décompresser l'image + + + impossible d'écrire les paramètres MPEG + + + impossible de compresser l'image en zip + + + Fichier image RLE non supporté + + + compression ZIP non supportée + + + + + Conversion JPEG sans perte vers JPEG avec perte + + + + + + + trop de niveau d'inclusion d'éléments + + + + + impossible d'accéder au fichier de configuration + + + impossible d'ouvrir le fichier de module + + + + + + + + Une erreur est survenue lors de la lecture du fichier + + + Une erreur est survenue lors de l'écriture dans un fichier + + + cipher support not enabled + + + Table de couleurs a plus que 256 couleurs + + + Image corrompue + + + erreur sur la version du format de fichier + + + profondeur d'image non supportée + + + le fichier image ne contient pas de données d'image + + + type d'image non supporté + + + En-tête d'image incorrect + + + Pas assez de données d'image dans le fichier + + + Index dans la table de couleurs invalide + + + Pixel invalide + + + Longueur et taille du fichier ne correspondent pas + + + maximum de canals dépassent les + + + absence l'image canel + + + Taille d'image négative ou nulle + + + Taille en-tête BMP non-OS2 plus petite que 40 + + + Pas assez de données pixel + + + Pas assez de tuiles trouvées à ce niveau + + + Trop de données d'image dans le fichier + + + Valeur statique des plans différente de 1 + + + impossible de lire le bloc d'extension + + + impossible de lire l'en-tête de l'image + + + impossible de lire les données de l'image + + + impossible de décoder l'image avec « runlength » + + + impossible de décompresser l'image + + + Fin de fichier inattendue + + + Facteur d'échantillonnage inattendu + + + Type de motif inconnu + + + compression non reconnue + + + nombre de couleurs non reconnu + + + bits par pixel non supporté + + + + + impossible de rendre la clé persistante + + + + + Pas assez de données d'image dans le fichier + + + Longueur et taille du fichier ne correspondent pas + + + Image PCD corrompue, saut à l'octet de synchronisation + + + + + + + + Échec de la délégation + + + Impossible de calculer la taille en sortie + + + Impossible de générer le fichier + + + Impossible de lire le fichier + + + pas de balise trouvée + + + Échec délégation PCL + + + Échec délégation Postscript + + + impossible de créer l'image + + + impossible de décoder le fichier d'image + + + impossible d'encoder le fichier d'image + + + impossible d'initialiser la librairie FPX + + + impossible d'initialiser la librairie WMF + + + impossible de gérer un flux JP2 + + + impossible de lire le ratio d'aspect + + + impossible de lire le résumé des informations + + + impossible de fixer la matrice affine + + + impossible de fixer le ratio d'aspect + + + impossible de fixer la torsion de couleur + + + impossible de fixer le contraste + + + impossible de fixer la valeur du filtre + + + impossible de fixer le titre de l'image + + + impossible de fixer le niveau JPEG + + + impossible de fixer la zone d'intérêt + + + impossible de fixer le résumé des informations + + + impossible d'écrire au format SVG + + + Échec délégation XPS + + + + + + + Définition de motif déjà fixée + + + Définition de primitive de dessin non conforme + + + URL non relative + + + Actuellement pas de définition de motif + + + Débordement pile de segments + + + Trop de coordonnées bézier + + + impossible d'imprimer + + + erreur d'imbrication des contextes graphiques + + + URL inaccessible + + + trop d'imbrication de vector graphiques + + + + + + + + an error has occurred reading from file + + + impossible de créer un fichier temporaire + + + impossible d'ouvrir le fichier + + + impossible d'enregistrer le fichier + + + + + + + + filter failed + + + + + + + angle discontinu + + + Image avec table de couleurs requise + + + Image avec couleurs séparées requise + + + Le profil colorimétrique ne peut fonctionner que dans un autre espace colorimétrique + + + différences dans les espaces colorimétriques de l'image + + + profondeur d'image non supportée + + + différences dans la morphology de l'image + + + une séquence d'images est requise + + + différences dans la taille de l'image + + + images too dissimilar + + + différences dans les tailles des images gauche et droite + + + Taille d'image négative ou nulle + + + aucune image trouvée + + + aucune image chargée + + + trop de grappes + + + impossible de créer la transformation de couleurs + + + Largeur ou hauteur dépassent les limites + + + + + associate profile with image, a source and destination color profile required for transform + + + impossible de colorimétrique la transformation + + + + + + + + delegate library support not built-in + + + pas de délégué pour décoder ce format d'image + + + pas de délégué pour encoder ce format d'image + + + + + delegate library support not built-in + + + pas de délégué pour encoder ce format d'image + + + + + + + + image coder signature mismatch + + + image filter signature mismatch + + + impossible de charger le module + + + impossible d'enregister le format d'image + + + + + impossible d'initialiser le chargeur de module + + + + + impossible de fermer le module + + + + + + + + attempt to perform an operation not allowed by the security policy + + + + + + + impossible de trouver l'identifiant de registre + + + impossible de fixer le registre + + + + + + + + list length exceeds limit + + + Échec allocation mémoire + + + Échec allocation du cache pixel + + + too many exceptions + + + too many objects + + + échec acquisition de la chaine + + + échec allocation table de couleurs + + + échec conversion police de caractères + + + échec création table de couleurs + + + échec tramage de l'image + + + impossible de cloner les informations du paquet + + + impossible de récupérer les informations du paquet + + + + + time limit exceeded + + + impossible d'allouer le motif de traits + + + échec d'allocation des dérivées + + + échec allocation table gamma + + + échec allocation image + + + échec allocation pixels de l'image + + + échec allocation informations sémaphore + + + échec allocation chaine + + + Échec allocation mémoire + + + impossible de concatener la chaine + + + impossible de convertir le texte + + + impossible de créer la table de couleurs + + + impossible de cloner l'image + + + impossible d'afficher l'image + + + impossible de rendre la chaine compatible + + + impossible d'interpréter l'image MSL + + + + + échec allocation mémoire + + + + + + + + substitution de police de caractères nécessaire + + + impossible de déterminer le type de métriques + + + impossible d'initialiser la librairie freetype + + + impossible de lire la police de caractères + + + encodage de la police de caractères non reconnu + + + + + impossible de lire la police de caractères + + + + + + + l'image de contient pas la géométrie du flux + + + pas de gestionnaire de flux défini + + + Cache pixel non ouvert + + + + + + + index invalide dans la table de couleurs + + + région de taille nulle + + + impossible d'ouvrir le fichier + + + la profondeur du quantum pour Wand ne correspond pas à celle de l'API principale + + + Pas d'images pour Wand + + + Pas d'itérateur pour Wand + + + + + + + couleur inconnue du serveur + + + aucune fenêtre avec l'ID spécifié + + + la table de couleurs standard n'est pas initialisée + + + impossible de se connecter au display distant + + + impossible de créer la bitmap + + + impossible de créer la table de couleurs + + + impossible de créer la pixmap + + + impossible de créer la propriété + + + impossible de créer la table de couleurs standard + + + impossible d'afficher les informations de l'image + + + impossible de récupérer la propriété + + + impossible de récupérer la table de couleurs standard + + + impossible de récupérer le visuel + + + unable to grab mouse + + + impossible de charger la police de caractères + + + impossible d'établir la correspondance entre le visuel et la table de couleurs standard + + + impossible de se connecter au serveur X + + + impossible de lire les attributs de la fenêtre X + + + impossible de lire l'image de la fenêtre X + + + type de table de couleurs non reconnnu + + + type de gravité non reconnu + + + spécification de visuel non reconnue + + + + + impossible de créer le curseur X + + + impossible de créer le contexte graphique + + + impossible de créer la table de couleurs standard + + + impossible de créer le propriété texte + + + impossible de créer la fenêtre X + + + impossible de créer l'image X + + + impossible de créer la pixmap X + + + impossible d'afficher l'image + + + impossible de récupérer le visuel + + + impossible de récupérer les informations de pixel + + + impossible de charger la police de caractères + + + impossible de créer la fenêtre X + + + impossible de se connecter au serveur X + + + impossible d'afficher les polices de caractères + + + + + utilisation du visuel par défaut + + + impossible de récupérer le visuel + + + + + + + + Ajouter du bruit à l'image + + + + + Ajouter à la séquence d'images + + + + + Affecter les couleurs de l'image + + + + + Moyenner la séquence d'images + + + + + Cisailler l'image + + + + + Classifier les couleurs de l'image + + + + + Remplacer une couleur dans l'image + + + + + Coloriser l'image + + + + + Combiner l'image + + + + + Contrast-stretch l'image + + + + + Convolution de l'image + + + + + Couper une zone rectangulaire de l'image + + + + + Décoder l'image + + + + + Flou intérieur de l'image + + + + + Distortion de l'image + + + + + Tramer les couleurs de l'image + + + + + Réduire le brillant du contraste de l'image + + + + + encode l'image + + + + + Egaliser l'image + + + + + Réflection verticale de l'image + + + + + Réflection horizontale de l'image + + + + + Ajouter un cadre à l'image + + + + + Appliquer une expression mathématique à l'image + + + + + Correction gamma de l'image + + + + + Calculer l'histogramme de l'image + + + + + Condenser les pixels de l'image autour du centre + + + + + Ajuster le niveau de contraste de l'image + + + + + Charger l'image + + + Charger les images + + + + + Magnfiy image + + + + + Filter image with neighborhood ranking + + + + + Minify image + + + + + Modulate image + + + + + Mogrify image + + + + + Montage image + + + + + Morphing de la séquence d'images + + + + + Mosaic image + + + + + Negate image + + + + + Effet peinture à l'huile pour l'image + + + + + Fixer la couleur opage dans l'image + + + + + Plasma image + + + + + Aperçu de l'image + + + + + Raise image + + + + + Re-coloriser une image couleur + + + + + Réduire le nombre de couleurs de l'image + + + + + Réduire le bruit de l'image + + + + + Render image + + + + + Redimensionner l'image + + + + + Transformation RVB de l'image + + + + + Roll image + + + + + Rotation de l'image + + + + + Sample image + + + + + Enregistrer l'image + + + Enregistrer les images + + + + + Échelle de l'image + + + + + Segmenter l'image + + + + + Extraire un canal de l'image + + + + + Effet ton sépia pour l'image + + + + + Ombrer l'image + + + + + Augmenter la netteté de l'image + + + + + Augmenter la netteté du contraste de l'image + + + + + Sigmoidal contrast image + + + + + Effet solariation pour l'image + + + + + Splice image + + + + + Spread image + + + + + Effet stégano pour l'image + + + + + Effet stéréo pour l'image + + + + + Swirl image + + + + + Texturer l'image + + + + + Appliquer un seuil à l'image + + + + + Effet tuiles pour l'image + + + + + Tint image + + + + + Transformation RVB de l'image + + + + + Choisir la couleur transparente dans l'image + + + + + Effet vagues pour l'image + + + + + write image + + + + + X Shear image + + + + + Y Shear image + + + + diff --git a/ImageMagick-6.9.12-44/config/install-sh b/ImageMagick-6.9.12-44/config/install-sh new file mode 100755 index 0000000..20d8b2e --- /dev/null +++ b/ImageMagick-6.9.12-44/config/install-sh @@ -0,0 +1,529 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2018-03-11.20; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # Note that $RANDOM variable is not portable (e.g. dash); Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p' feature. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/ImageMagick-6.9.12-44/config/lndir.sh b/ImageMagick-6.9.12-44/config/lndir.sh new file mode 100755 index 0000000..49218c3 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/lndir.sh @@ -0,0 +1,96 @@ +#! /bin/sh + +# lndir - create shadow link tree +# +# Time stamp <89/11/28 18:56:54 gildea> +# By Stephen Gildea based on +# XConsortium: lndir.sh,v 1.1 88/10/20 17:37:16 jim Exp +# +# Modified slightly for ImageMagick by Bob Friesenhahn, 1999 +# +# Used to create a copy of the a directory tree that has links for all +# non- directories. If you are building the distribution on more than +# one machine, you should use this script. +# +# If your main sources are located in /usr/local/src/X and you would like +# your link tree to be in /usr/local/src/new-X, do the following: +# +# % mkdir /usr/local/src/new-X +# % cd /usr/local/src/new-X +# % lndir ../X +# +# Note: does not link files beginning with "." Is this a bug or a feature? +# +# Improvements over R3 version: +# Allows the fromdir to be relative: usually you want to say "../dist" +# The name is relative to the todir, not the current directory. +# +# Bugs in R3 version fixed: +# Do "pwd" command *after* "cd $DIRTO". +# Don't try to link directories, avoiding error message " exists". +# Barf with Usage message if either DIRFROM *or* DIRTO is not a directory. + +USAGE="Usage: $0 fromdir [todir]" + +if [ $# -lt 1 -o $# -gt 2 ] +then + echo "$USAGE" + exit 1 +fi + +DIRFROM=$1 + +if [ $# -eq 2 ]; +then + DIRTO=$2 +else + DIRTO=. +fi + +if [ ! -d $DIRTO ] +then + echo "$0: $DIRTO is not a directory" + echo "$USAGE" + exit 2 +fi + +cd $DIRTO + +if [ ! -d $DIRFROM ] +then + echo "$0: $DIRFROM is not a directory" + echo "$USAGE" + exit 2 +fi + +pwd=`pwd` + +if [ `(cd $DIRFROM; pwd)` = $pwd ] +then + echo "$pwd: FROM and TO are identical!" + exit 1 +fi + +for file in `ls $DIRFROM` +do + if [ ! -d $DIRFROM/$file ] + then + test -r $file || ln -s $DIRFROM/$file . + else + #echo $file: + test -d $file || mkdir $file && chmod 777 $file + (cd $file + pwd=`pwd` + case "$DIRFROM" in + /*) ;; + *) DIRFROM=../$DIRFROM ;; + esac + if [ `(cd $DIRFROM/$file; pwd)` = $pwd ] + then + echo "$pwd: FROM and TO are identical!" + exit 1 + fi + $0 $DIRFROM/$file + ) + fi +done diff --git a/ImageMagick-6.9.12-44/config/locale.md b/ImageMagick-6.9.12-44/config/locale.md new file mode 100644 index 0000000..6d79bfc --- /dev/null +++ b/ImageMagick-6.9.12-44/config/locale.md @@ -0,0 +1,16 @@ +Translation is fairly straight-forward. Copy `english.xml` to _locale_.xml. Change any messages from English to the target language. As an example: + +``` + + unable to open image + +``` +becomes +``` + + impossible d'ouvrir l'image + +``` +in French. You then need to copy the _locale_.xml to the same location as `english.xml`, e.g. `/usr/local/ImageMagick-7/_locale_.xml`. Make sure your your _locale_.xml file is referenced in the `locale.xml` configuration file. + +The final step is to contribute _locale_.xml to ImageMagick so we can include it in a future release of ImageMagick so the community can benefit from the translation. diff --git a/ImageMagick-6.9.12-44/config/locale.xml b/ImageMagick-6.9.12-44/config/locale.xml new file mode 100644 index 0000000..d593fba --- /dev/null +++ b/ImageMagick-6.9.12-44/config/locale.xml @@ -0,0 +1,48 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/log.xml b/ImageMagick-6.9.12-44/config/log.xml new file mode 100644 index 0000000..8a29099 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/log.xml @@ -0,0 +1,80 @@ + + + + + + + + + +]> + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/ltmain.sh b/ImageMagick-6.9.12-44/config/ltmain.sh new file mode 100644 index 0000000..8dab662 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/ltmain.sh @@ -0,0 +1,11140 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6 +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + # Keeping compiler generated duplicates in $postdeps and $predeps is not + # harmful, and is necessary in a majority of systems that use it to satisfy + # symbol dependencies. + opt_duplicate_compiler_generated_deps=: + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/ImageMagick-6.9.12-44/config/magic.xml b/ImageMagick-6.9.12-44/config/magic.xml new file mode 100644 index 0000000..7f17731 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/magic.xml @@ -0,0 +1,23 @@ + + + + + + +]> + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/mime.xml b/ImageMagick-6.9.12-44/config/mime.xml new file mode 100644 index 0000000..3b768df --- /dev/null +++ b/ImageMagick-6.9.12-44/config/mime.xml @@ -0,0 +1,1146 @@ + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/missing b/ImageMagick-6.9.12-44/config/missing new file mode 100755 index 0000000..8d0eaad --- /dev/null +++ b/ImageMagick-6.9.12-44/config/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2020 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/ImageMagick-6.9.12-44/config/mkinstalldirs b/ImageMagick-6.9.12-44/config/mkinstalldirs new file mode 100755 index 0000000..36aa909 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/mkinstalldirs @@ -0,0 +1,162 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2018-03-07.03; # UTC + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' +IFS=" "" $nl" +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the 'mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because '.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/ImageMagick-6.9.12-44/config/policy.xml b/ImageMagick-6.9.12-44/config/policy.xml new file mode 100644 index 0000000..2ed14de --- /dev/null +++ b/ImageMagick-6.9.12-44/config/policy.xml @@ -0,0 +1,82 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/quantization-table.xml b/ImageMagick-6.9.12-44/config/quantization-table.xml new file mode 100644 index 0000000..fb71874 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/quantization-table.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + +]> + + + + Luma Quantization Table + + 16, 16, 16, 18, 25, 37, 56, 85, + 16, 17, 20, 27, 34, 40, 53, 75, + 16, 20, 24, 31, 43, 62, 91, 135, + 18, 27, 31, 40, 53, 74, 106, 156, + 25, 34, 43, 53, 69, 94, 131, 189, + 37, 40, 62, 74, 94, 124, 169, 238, + 56, 53, 91, 106, 131, 169, 226, 311, + 85, 75, 135, 156, 189, 238, 311, 418 + +
    + +
    + diff --git a/ImageMagick-6.9.12-44/config/sRGB.icm b/ImageMagick-6.9.12-44/config/sRGB.icm new file mode 100644 index 0000000000000000000000000000000000000000..54913302d589d65c32303620d8b8bbe99e30c4a4 GIT binary patch literal 3212 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 VAbzO$Xz{V@Q}CyIpT(a){|%xB5NQAa literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/config/tap-driver.sh b/ImageMagick-6.9.12-44/config/tap-driver.sh new file mode 100755 index 0000000..865761d --- /dev/null +++ b/ImageMagick-6.9.12-44/config/tap-driver.sh @@ -0,0 +1,651 @@ +#! /bin/sh +# Copyright (C) 2011-2020 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +scriptversion=2013-12-23.17; # UTC + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +me=tap-driver.sh + +fatal () +{ + echo "$me: fatal: $*" >&2 + exit 1 +} + +usage_error () +{ + echo "$me: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat < + # + trap : 1 3 2 13 15 + if test $merge -gt 0; then + exec 2>&1 + else + exec 2>&3 + fi + "$@" + echo $? + ) | LC_ALL=C ${AM_TAP_AWK-awk} \ + -v me="$me" \ + -v test_script_name="$test_name" \ + -v log_file="$log_file" \ + -v trs_file="$trs_file" \ + -v expect_failure="$expect_failure" \ + -v merge="$merge" \ + -v ignore_exit="$ignore_exit" \ + -v comments="$comments" \ + -v diag_string="$diag_string" \ +' +# TODO: the usages of "cat >&3" below could be optimized when using +# GNU awk, and/on on systems that supports /dev/fd/. + +# Implementation note: in what follows, `result_obj` will be an +# associative array that (partly) simulates a TAP result object +# from the `TAP::Parser` perl module. + +## ----------- ## +## FUNCTIONS ## +## ----------- ## + +function fatal(msg) +{ + print me ": " msg | "cat >&2" + exit 1 +} + +function abort(where) +{ + fatal("internal error " where) +} + +# Convert a boolean to a "yes"/"no" string. +function yn(bool) +{ + return bool ? "yes" : "no"; +} + +function add_test_result(result) +{ + if (!test_results_index) + test_results_index = 0 + test_results_list[test_results_index] = result + test_results_index += 1 + test_results_seen[result] = 1; +} + +# Whether the test script should be re-run by "make recheck". +function must_recheck() +{ + for (k in test_results_seen) + if (k != "XFAIL" && k != "PASS" && k != "SKIP") + return 1 + return 0 +} + +# Whether the content of the log file associated to this test should +# be copied into the "global" test-suite.log. +function copy_in_global_log() +{ + for (k in test_results_seen) + if (k != "PASS") + return 1 + return 0 +} + +function get_global_test_result() +{ + if ("ERROR" in test_results_seen) + return "ERROR" + if ("FAIL" in test_results_seen || "XPASS" in test_results_seen) + return "FAIL" + all_skipped = 1 + for (k in test_results_seen) + if (k != "SKIP") + all_skipped = 0 + if (all_skipped) + return "SKIP" + return "PASS"; +} + +function stringify_result_obj(result_obj) +{ + if (result_obj["is_unplanned"] || result_obj["number"] != testno) + return "ERROR" + + if (plan_seen == LATE_PLAN) + return "ERROR" + + if (result_obj["directive"] == "TODO") + return result_obj["is_ok"] ? "XPASS" : "XFAIL" + + if (result_obj["directive"] == "SKIP") + return result_obj["is_ok"] ? "SKIP" : COOKED_FAIL; + + if (length(result_obj["directive"])) + abort("in function stringify_result_obj()") + + return result_obj["is_ok"] ? COOKED_PASS : COOKED_FAIL +} + +function decorate_result(result) +{ + color_name = color_for_result[result] + if (color_name) + return color_map[color_name] "" result "" color_map["std"] + # If we are not using colorized output, or if we do not know how + # to colorize the given result, we should return it unchanged. + return result +} + +function report(result, details) +{ + if (result ~ /^(X?(PASS|FAIL)|SKIP|ERROR)/) + { + msg = ": " test_script_name + add_test_result(result) + } + else if (result == "#") + { + msg = " " test_script_name ":" + } + else + { + abort("in function report()") + } + if (length(details)) + msg = msg " " details + # Output on console might be colorized. + print decorate_result(result) msg + # Log the result in the log file too, to help debugging (this is + # especially true when said result is a TAP error or "Bail out!"). + print result msg | "cat >&3"; +} + +function testsuite_error(error_message) +{ + report("ERROR", "- " error_message) +} + +function handle_tap_result() +{ + details = result_obj["number"]; + if (length(result_obj["description"])) + details = details " " result_obj["description"] + + if (plan_seen == LATE_PLAN) + { + details = details " # AFTER LATE PLAN"; + } + else if (result_obj["is_unplanned"]) + { + details = details " # UNPLANNED"; + } + else if (result_obj["number"] != testno) + { + details = sprintf("%s # OUT-OF-ORDER (expecting %d)", + details, testno); + } + else if (result_obj["directive"]) + { + details = details " # " result_obj["directive"]; + if (length(result_obj["explanation"])) + details = details " " result_obj["explanation"] + } + + report(stringify_result_obj(result_obj), details) +} + +# `skip_reason` should be empty whenever planned > 0. +function handle_tap_plan(planned, skip_reason) +{ + planned += 0 # Avoid getting confused if, say, `planned` is "00" + if (length(skip_reason) && planned > 0) + abort("in function handle_tap_plan()") + if (plan_seen) + { + # Error, only one plan per stream is acceptable. + testsuite_error("multiple test plans") + return; + } + planned_tests = planned + # The TAP plan can come before or after *all* the TAP results; we speak + # respectively of an "early" or a "late" plan. If we see the plan line + # after at least one TAP result has been seen, assume we have a late + # plan; in this case, any further test result seen after the plan will + # be flagged as an error. + plan_seen = (testno >= 1 ? LATE_PLAN : EARLY_PLAN) + # If testno > 0, we have an error ("too many tests run") that will be + # automatically dealt with later, so do not worry about it here. If + # $plan_seen is true, we have an error due to a repeated plan, and that + # has already been dealt with above. Otherwise, we have a valid "plan + # with SKIP" specification, and should report it as a particular kind + # of SKIP result. + if (planned == 0 && testno == 0) + { + if (length(skip_reason)) + skip_reason = "- " skip_reason; + report("SKIP", skip_reason); + } +} + +function extract_tap_comment(line) +{ + if (index(line, diag_string) == 1) + { + # Strip leading `diag_string` from `line`. + line = substr(line, length(diag_string) + 1) + # And strip any leading and trailing whitespace left. + sub("^[ \t]*", "", line) + sub("[ \t]*$", "", line) + # Return what is left (if any). + return line; + } + return ""; +} + +# When this function is called, we know that line is a TAP result line, +# so that it matches the (perl) RE "^(not )?ok\b". +function setup_result_obj(line) +{ + # Get the result, and remove it from the line. + result_obj["is_ok"] = (substr(line, 1, 2) == "ok" ? 1 : 0) + sub("^(not )?ok[ \t]*", "", line) + + # If the result has an explicit number, get it and strip it; otherwise, + # automatically assing the next progresive number to it. + if (line ~ /^[0-9]+$/ || line ~ /^[0-9]+[^a-zA-Z0-9_]/) + { + match(line, "^[0-9]+") + # The final `+ 0` is to normalize numbers with leading zeros. + result_obj["number"] = substr(line, 1, RLENGTH) + 0 + line = substr(line, RLENGTH + 1) + } + else + { + result_obj["number"] = testno + } + + if (plan_seen == LATE_PLAN) + # No further test results are acceptable after a "late" TAP plan + # has been seen. + result_obj["is_unplanned"] = 1 + else if (plan_seen && testno > planned_tests) + result_obj["is_unplanned"] = 1 + else + result_obj["is_unplanned"] = 0 + + # Strip trailing and leading whitespace. + sub("^[ \t]*", "", line) + sub("[ \t]*$", "", line) + + # This will have to be corrected if we have a "TODO"/"SKIP" directive. + result_obj["description"] = line + result_obj["directive"] = "" + result_obj["explanation"] = "" + + if (index(line, "#") == 0) + return # No possible directive, nothing more to do. + + # Directives are case-insensitive. + rx = "[ \t]*#[ \t]*([tT][oO][dD][oO]|[sS][kK][iI][pP])[ \t]*" + + # See whether we have the directive, and if yes, where. + pos = match(line, rx "$") + if (!pos) + pos = match(line, rx "[^a-zA-Z0-9_]") + + # If there was no TAP directive, we have nothing more to do. + if (!pos) + return + + # Let`s now see if the TAP directive has been escaped. For example: + # escaped: ok \# SKIP + # not escaped: ok \\# SKIP + # escaped: ok \\\\\# SKIP + # not escaped: ok \ # SKIP + if (substr(line, pos, 1) == "#") + { + bslash_count = 0 + for (i = pos; i > 1 && substr(line, i - 1, 1) == "\\"; i--) + bslash_count += 1 + if (bslash_count % 2) + return # Directive was escaped. + } + + # Strip the directive and its explanation (if any) from the test + # description. + result_obj["description"] = substr(line, 1, pos - 1) + # Now remove the test description from the line, that has been dealt + # with already. + line = substr(line, pos) + # Strip the directive, and save its value (normalized to upper case). + sub("^[ \t]*#[ \t]*", "", line) + result_obj["directive"] = toupper(substr(line, 1, 4)) + line = substr(line, 5) + # Now get the explanation for the directive (if any), with leading + # and trailing whitespace removed. + sub("^[ \t]*", "", line) + sub("[ \t]*$", "", line) + result_obj["explanation"] = line +} + +function get_test_exit_message(status) +{ + if (status == 0) + return "" + if (status !~ /^[1-9][0-9]*$/) + abort("getting exit status") + if (status < 127) + exit_details = "" + else if (status == 127) + exit_details = " (command not found?)" + else if (status >= 128 && status <= 255) + exit_details = sprintf(" (terminated by signal %d?)", status - 128) + else if (status > 256 && status <= 384) + # We used to report an "abnormal termination" here, but some Korn + # shells, when a child process die due to signal number n, can leave + # in $? an exit status of 256+n instead of the more standard 128+n. + # Apparently, both behaviours are allowed by POSIX (2008), so be + # prepared to handle them both. See also Austing Group report ID + # 0000051 + exit_details = sprintf(" (terminated by signal %d?)", status - 256) + else + # Never seen in practice. + exit_details = " (abnormal termination)" + return sprintf("exited with status %d%s", status, exit_details) +} + +function write_test_results() +{ + print ":global-test-result: " get_global_test_result() > trs_file + print ":recheck: " yn(must_recheck()) > trs_file + print ":copy-in-global-log: " yn(copy_in_global_log()) > trs_file + for (i = 0; i < test_results_index; i += 1) + print ":test-result: " test_results_list[i] > trs_file + close(trs_file); +} + +BEGIN { + +## ------- ## +## SETUP ## +## ------- ## + +'"$init_colors"' + +# Properly initialized once the TAP plan is seen. +planned_tests = 0 + +COOKED_PASS = expect_failure ? "XPASS": "PASS"; +COOKED_FAIL = expect_failure ? "XFAIL": "FAIL"; + +# Enumeration-like constants to remember which kind of plan (if any) +# has been seen. It is important that NO_PLAN evaluates "false" as +# a boolean. +NO_PLAN = 0 +EARLY_PLAN = 1 +LATE_PLAN = 2 + +testno = 0 # Number of test results seen so far. +bailed_out = 0 # Whether a "Bail out!" directive has been seen. + +# Whether the TAP plan has been seen or not, and if yes, which kind +# it is ("early" is seen before any test result, "late" otherwise). +plan_seen = NO_PLAN + +## --------- ## +## PARSING ## +## --------- ## + +is_first_read = 1 + +while (1) + { + # Involutions required so that we are able to read the exit status + # from the last input line. + st = getline + if (st < 0) # I/O error. + fatal("I/O error while reading from input stream") + else if (st == 0) # End-of-input + { + if (is_first_read) + abort("in input loop: only one input line") + break + } + if (is_first_read) + { + is_first_read = 0 + nextline = $0 + continue + } + else + { + curline = nextline + nextline = $0 + $0 = curline + } + # Copy any input line verbatim into the log file. + print | "cat >&3" + # Parsing of TAP input should stop after a "Bail out!" directive. + if (bailed_out) + continue + + # TAP test result. + if ($0 ~ /^(not )?ok$/ || $0 ~ /^(not )?ok[^a-zA-Z0-9_]/) + { + testno += 1 + setup_result_obj($0) + handle_tap_result() + } + # TAP plan (normal or "SKIP" without explanation). + else if ($0 ~ /^1\.\.[0-9]+[ \t]*$/) + { + # The next two lines will put the number of planned tests in $0. + sub("^1\\.\\.", "") + sub("[^0-9]*$", "") + handle_tap_plan($0, "") + continue + } + # TAP "SKIP" plan, with an explanation. + else if ($0 ~ /^1\.\.0+[ \t]*#/) + { + # The next lines will put the skip explanation in $0, stripping + # any leading and trailing whitespace. This is a little more + # tricky in truth, since we want to also strip a potential leading + # "SKIP" string from the message. + sub("^[^#]*#[ \t]*(SKIP[: \t][ \t]*)?", "") + sub("[ \t]*$", ""); + handle_tap_plan(0, $0) + } + # "Bail out!" magic. + # Older versions of prove and TAP::Harness (e.g., 3.17) did not + # recognize a "Bail out!" directive when preceded by leading + # whitespace, but more modern versions (e.g., 3.23) do. So we + # emulate the latter, "more modern" behaviour. + else if ($0 ~ /^[ \t]*Bail out!/) + { + bailed_out = 1 + # Get the bailout message (if any), with leading and trailing + # whitespace stripped. The message remains stored in `$0`. + sub("^[ \t]*Bail out![ \t]*", ""); + sub("[ \t]*$", ""); + # Format the error message for the + bailout_message = "Bail out!" + if (length($0)) + bailout_message = bailout_message " " $0 + testsuite_error(bailout_message) + } + # Maybe we have too look for dianogtic comments too. + else if (comments != 0) + { + comment = extract_tap_comment($0); + if (length(comment)) + report("#", comment); + } + } + +## -------- ## +## FINISH ## +## -------- ## + +# A "Bail out!" directive should cause us to ignore any following TAP +# error, as well as a non-zero exit status from the TAP producer. +if (!bailed_out) + { + if (!plan_seen) + { + testsuite_error("missing test plan") + } + else if (planned_tests != testno) + { + bad_amount = testno > planned_tests ? "many" : "few" + testsuite_error(sprintf("too %s tests run (expected %d, got %d)", + bad_amount, planned_tests, testno)) + } + if (!ignore_exit) + { + # Fetch exit status from the last line. + exit_message = get_test_exit_message(nextline) + if (exit_message) + testsuite_error(exit_message) + } + } + +write_test_results() + +exit 0 + +} # End of "BEGIN" block. +' + +# TODO: document that we consume the file descriptor 3 :-( +} 3>"$log_file" + +test $? -eq 0 || fatal "I/O or internal error" + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/ImageMagick-6.9.12-44/config/test-driver b/ImageMagick-6.9.12-44/config/test-driver new file mode 100755 index 0000000..89dba1e --- /dev/null +++ b/ImageMagick-6.9.12-44/config/test-driver @@ -0,0 +1,148 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 2011-2020 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <$log_file 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/ImageMagick-6.9.12-44/config/thresholds.xml b/ImageMagick-6.9.12-44/config/thresholds.xml new file mode 100644 index 0000000..02b96a8 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/thresholds.xml @@ -0,0 +1,336 @@ + + + + + + + + + +]> + + + + + + Threshold 1x1 (non-dither) + + 1 + + + + + Checkerboard 2x1 (dither) + + 1 2 + 2 1 + + + + + + Ordered 2x2 (dispersed) + + 1 3 + 4 2 + + + + + Ordered 3x3 (dispersed) + + 3 7 4 + 6 1 9 + 2 8 5 + + + + + + Ordered 4x4 (dispersed) + + 1 9 3 11 + 13 5 15 7 + 4 12 2 10 + 16 8 14 6 + + + + + + Ordered 8x8 (dispersed) + + 1 49 13 61 4 52 16 64 + 33 17 45 29 36 20 48 32 + 9 57 5 53 12 60 8 56 + 41 25 37 21 44 28 40 24 + 3 51 15 63 2 50 14 62 + 35 19 47 31 34 18 46 30 + 11 59 7 55 10 58 6 54 + 43 27 39 23 42 26 38 22 + + + + + + Halftone 4x4 (angled) + + 4 2 7 5 + 3 1 8 6 + 7 5 4 2 + 8 6 3 1 + + + + + Halftone 6x6 (angled) + + 14 13 10 8 2 3 + 16 18 12 7 1 4 + 15 17 11 9 6 5 + 8 2 3 14 13 10 + 7 1 4 16 18 12 + 9 6 5 15 17 11 + + + + + Halftone 8x8 (angled) + + 13 7 8 14 17 21 22 18 + 6 1 3 9 28 31 29 23 + 5 2 4 10 27 32 30 24 + 16 12 11 15 20 26 25 19 + 17 21 22 18 13 7 8 14 + 28 31 29 23 6 1 3 9 + 27 32 30 24 5 2 4 10 + 20 26 25 19 16 12 11 15 + + + + + + Halftone 4x4 (orthogonal) + + 7 13 11 4 + 12 16 14 8 + 10 15 6 2 + 5 9 3 1 + + + + + Halftone 6x6 (orthogonal) + + 7 17 27 14 9 4 + 21 29 33 31 18 11 + 24 32 36 34 25 22 + 19 30 35 28 20 10 + 8 15 26 16 6 2 + 5 13 23 12 3 1 + + + + + Halftone 8x8 (orthogonal) + + 7 21 33 43 36 19 9 4 + 16 27 51 55 49 29 14 11 + 31 47 57 61 59 45 35 23 + 41 53 60 64 62 52 40 38 + 37 44 58 63 56 46 30 22 + 15 28 48 54 50 26 17 10 + 8 18 34 42 32 20 6 2 + 5 13 25 39 24 12 3 1 + + + + + + Halftone 16x16 (orthogonal) + + 4 12 24 44 72 100 136 152 150 134 98 70 42 23 11 3 + 7 16 32 52 76 104 144 160 158 142 102 74 50 31 15 6 + 19 27 40 60 92 132 168 180 178 166 130 90 58 39 26 18 + 36 48 56 80 124 176 188 204 203 187 175 122 79 55 47 35 + 64 68 84 116 164 200 212 224 223 211 199 162 114 83 67 63 + 88 96 112 156 192 216 232 240 239 231 214 190 154 111 95 87 + 108 120 148 184 208 228 244 252 251 243 226 206 182 147 119 107 + 128 140 172 196 219 235 247 256 255 246 234 218 194 171 139 127 + 126 138 170 195 220 236 248 253 254 245 233 217 193 169 137 125 + 106 118 146 183 207 227 242 249 250 241 225 205 181 145 117 105 + 86 94 110 155 191 215 229 238 237 230 213 189 153 109 93 85 + 62 66 82 115 163 198 210 221 222 209 197 161 113 81 65 61 + 34 46 54 78 123 174 186 202 201 185 173 121 77 53 45 33 + 20 28 37 59 91 131 167 179 177 165 129 89 57 38 25 17 + 8 13 29 51 75 103 143 159 157 141 101 73 49 30 14 5 + 1 9 21 43 71 99 135 151 149 133 97 69 41 22 10 2 + + + + + + + Circles 5x5 (black) + + 1 21 16 15 4 + 5 17 20 19 14 + 6 21 25 24 12 + 7 18 22 23 11 + 2 8 9 10 3 + + + + + + Circles 5x5 (white) + + 25 21 10 11 22 + 20 9 6 7 12 + 19 5 1 2 13 + 18 8 4 3 14 + 24 17 16 15 23 + + + + + Circles 6x6 (black) + + 1 5 14 13 12 4 + 6 22 28 27 21 11 + 15 29 35 34 26 20 + 16 30 36 33 25 19 + 7 23 31 32 24 10 + 2 8 17 18 9 3 + + + + + Circles 6x6 (white) + + 36 32 23 24 25 33 + 31 15 9 10 16 26 + 22 8 2 3 11 17 + 21 7 1 4 12 18 + 30 14 6 5 13 27 + 35 29 20 19 28 34 + + + + + Circles 7x7 (black) + + 3 9 18 28 17 8 2 + 10 24 33 39 32 23 7 + 19 34 44 48 43 31 16 + 25 40 45 49 47 38 27 + 20 35 41 46 42 29 15 + 11 21 36 37 28 22 6 + 4 12 13 26 14 5 1 + + + + + + Circles 7x7 (white) + + 47 41 32 22 33 42 48 + 40 26 17 11 18 27 43 + 31 16 6 2 7 19 34 + 25 10 5 1 3 12 23 + 30 15 9 4 8 20 35 + 39 29 14 13 21 28 44 + 46 38 37 24 36 45 49 + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/type-apple.xml.in b/ImageMagick-6.9.12-44/config/type-apple.xml.in new file mode 100644 index 0000000..2ec8b20 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/type-apple.xml.in @@ -0,0 +1,1367 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/type-dejavu.xml.in b/ImageMagick-6.9.12-44/config/type-dejavu.xml.in new file mode 100644 index 0000000..8a5d22c --- /dev/null +++ b/ImageMagick-6.9.12-44/config/type-dejavu.xml.in @@ -0,0 +1,58 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/type-ghostscript.xml.in b/ImageMagick-6.9.12-44/config/type-ghostscript.xml.in new file mode 100644 index 0000000..dc5b15f --- /dev/null +++ b/ImageMagick-6.9.12-44/config/type-ghostscript.xml.in @@ -0,0 +1,50 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/type-urw-base35.xml.in b/ImageMagick-6.9.12-44/config/type-urw-base35.xml.in new file mode 100644 index 0000000..993613e --- /dev/null +++ b/ImageMagick-6.9.12-44/config/type-urw-base35.xml.in @@ -0,0 +1,50 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/type-windows.xml.in b/ImageMagick-6.9.12-44/config/type-windows.xml.in new file mode 100644 index 0000000..f5602d2 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/type-windows.xml.in @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/config/type.xml.in b/ImageMagick-6.9.12-44/config/type.xml.in new file mode 100644 index 0000000..6b75926 --- /dev/null +++ b/ImageMagick-6.9.12-44/config/type.xml.in @@ -0,0 +1,17 @@ + + + + + +]> + + + @type_include_files@ + diff --git a/ImageMagick-6.9.12-44/configure b/ImageMagick-6.9.12-44/configure new file mode 100755 index 0000000..44643eb --- /dev/null +++ b/ImageMagick-6.9.12-44/configure @@ -0,0 +1,38967 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for ImageMagick 6.9.12-44. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and https://github.com/ImageMagick/ImageMagick6/issues +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='ImageMagick' +PACKAGE_TARNAME='ImageMagick' +PACKAGE_VERSION='6.9.12-44' +PACKAGE_STRING='ImageMagick 6.9.12-44' +PACKAGE_BUGREPORT='https://github.com/ImageMagick/ImageMagick6/issues' +PACKAGE_URL='https://legacy.imagemagick.org' + +ac_unique_file="magick/MagickCore.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_list= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +MAGICK_LIBS +MAGICK_LDFLAGS +MAGICK_PCFLAGS +MAGICK_CPPFLAGS +MAGICK_CXXFLAGS +MAGICK_CFLAGS +MAGICK_EXTRA_DEP_LIBS +MAGICK_DEP_LIBS +OSX_GCOV_LDFLAG +MAGICK_FEATURES +MAGICK_DELEGATES +MAGICKCORE_PATH +PERL_SUPPORTS_DESTDIR +WITH_PERL_DYNAMIC_FALSE +WITH_PERL_DYNAMIC_TRUE +WITH_PERL_STATIC_FALSE +WITH_PERL_STATIC_TRUE +WITH_PERL_FALSE +WITH_PERL_TRUE +PERL_VERSION +GSVersion +GSPSDevice +GSPDFDevice +GSMonoDevice +GSEPSDevice +GSColorDevice +GSCMYKDevice +GSAlphaDevice +XPSVersion +XPSCMYKDevice +XPSColorDevice +XPSMonoDevice +PCLVersion +PCLCMYKDevice +PCLColorDevice +PCLMonoDevice +ZIP_DELEGATE_FALSE +ZIP_DELEGATE_TRUE +ZIP +P7ZIP_DELEGATE_FALSE +P7ZIP_DELEGATE_TRUE +P7ZIP +RPM_DELEGATE_FALSE +RPM_DELEGATE_TRUE +RPM +PERL +TAR +ShowImageDelegate +type_include_files +windows_font_dir +urw_base35_font_dir +ghostscript_font_dir +dejavu_font_dir +apple_font_dir +PrintDelegate +XPSDelegate +WWWDecodeDelegate +WebPEncodeDelegate +WebPDecodeDelegate +TraceEncodeDelegate +TextEncodeDelegate +SVGDecodeDelegate +RSVGDecodeDelegate +RMDelegate +PSDelegate +PCLDelegate +MVDelegate +MrSIDDecodeDelegate +VIDEOEncodeDelegate +VIDEODecodeDelegate +MogrifyDelegate +LaunchDelegate +LPRDelegate +LPDelegate +LEPDelegate +JXREncodeDelegate +JXRDecodeDelegate +ILBMEncodeDelegate +ILBMDecodeDelegate +HTMLDecodeDelegate +HPGLDecodeDelegate +GVCDecodeDelegate +EditorDelegate +DisplayDelegate +ConvertDelegate +DVIDecodeDelegate +DOCDecodeDelegate +DNGDecodeDelegate +BrowseDelegate +BlenderDecodeDelegate +BPGEncodeDelegate +BPGDecodeDelegate +SHAREARCH_PATH +SHAREARCH_RELATIVE_PATH +SHAREARCH_DIRNAME +SHAREARCH_BASEDIRNAME +SHARE_PATH +CONFIGURE_PATH +INSTALL_DOC_FALSE +INSTALL_DOC_TRUE +DOCUMENTATION_PATH +FILTER_PATH +FILTER_DIRNAME +CODER_PATH +CODER_DIRNAME +MODULES_PATH +MODULES_RELATIVE_PATH +MODULES_DIRNAME +MODULES_BASEDIRNAME +LIB_BIN_DIR_PATH +LIB_BIN_DIR_RELATIVE_PATH +LIB_BIN_DIR +LIB_BIN_BASEDIRNAME +LIBRARY_PATH +EXECUTABLE_PATH +INCLUDEARCH_PATH +INCLUDE_PATH +PERLMAINCC +XML_DELEGATE_FALSE +XML_DELEGATE_TRUE +XML_LIBS +XML_CFLAGS +WMF_LIBS +WMF_CFLAGS +WMF_DELEGATE_FALSE +WMF_DELEGATE_TRUE +WEBPMUX_DELEGATE_FALSE +WEBPMUX_DELEGATE_TRUE +WEBP_DELEGATE_FALSE +WEBP_DELEGATE_TRUE +WEBPMUX_LIBS +WEBPMUX_CFLAGS +WEBP_LIBS +WEBP_CFLAGS +TIFF_LIBS +TIFF_DELEGATE_FALSE +TIFF_DELEGATE_TRUE +CAIRO_DELEGATE_FALSE +CAIRO_DELEGATE_TRUE +RSVG_DELEGATE_FALSE +RSVG_DELEGATE_TRUE +CAIRO_SVG_LIBS +CAIRO_SVG_CFLAGS +RSVG_LIBS +RSVG_CFLAGS +RAW_R_DELEGATE_FALSE +RAW_R_DELEGATE_TRUE +RAW_R_LIBS +RAW_R_CFLAGS +PNG_DELEGATE_FALSE +PNG_DELEGATE_TRUE +PNG_LIBS +PNG_CFLAGS +PANGOCAIRO_DELEGATE_FALSE +PANGOCAIRO_DELEGATE_TRUE +PANGO_DELEGATE_FALSE +PANGO_DELEGATE_TRUE +PANGO_LIBS +PANGO_CFLAGS +OPENEXR_DELEGATE_FALSE +OPENEXR_DELEGATE_TRUE +OPENEXR_LIBS +OPENEXR_CFLAGS +LZMA_DELEGATE_FALSE +LZMA_DELEGATE_TRUE +LZMA_LIBS +LZMA_CFLAGS +LQR_DELEGATE_FALSE +LQR_DELEGATE_TRUE +LQR_LIBS +LQR_CFLAGS +LIBOPENJP2_DELEGATE_FALSE +LIBOPENJP2_DELEGATE_TRUE +LIBOPENJP2_LIBS +LIBOPENJP2_CFLAGS +LCMS_LIBS +LCMS_CFLAGS +LCMS_DELEGATE_FALSE +LCMS_DELEGATE_TRUE +LCMS2_LIBS +LCMS2_CFLAGS +JXL_LIBS +JXL_DELEGATE_FALSE +JXL_DELEGATE_TRUE +JPEG_LIBS +JPEG_DELEGATE_FALSE +JPEG_DELEGATE_TRUE +JBIG_LIBS +JBIG_DELEGATE_FALSE +JBIG_DELEGATE_TRUE +HEIC_DELEGATE_FALSE +HEIC_DELEGATE_TRUE +HEIF_LIBS +HEIF_CFLAGS +GVC_DELEGATE_FALSE +GVC_DELEGATE_TRUE +GVC_LIBS +GVC_CFLAGS +GS_LIBS +GS_DELEGATE_FALSE +GS_DELEGATE_TRUE +GDI32_LIBS +WINGDI32_DELEGATE_FALSE +WINGDI32_DELEGATE_TRUE +RAQM_DELEGATE_FALSE +RAQM_DELEGATE_TRUE +RAQM_LIBS +RAQM_CFLAGS +MAGICKCORE_FREETYPE_DELEGATE +FREETYPE_LIBS +FREETYPE_CFLAGS +FONTCONFIG_DELEGATE_FALSE +FONTCONFIG_DELEGATE_TRUE +FONTCONFIG_LIBS +FONTCONFIG_CFLAGS +DJVU_LIBS +DJVU_CFLAGS +DJVU_DELEGATE_FALSE +DJVU_DELEGATE_TRUE +ddjvuapi_LIBS +ddjvuapi_CFLAGS +FPX_LIBS +FPX_DELEGATE_FALSE +FPX_DELEGATE_TRUE +FLIF_LIBS +FLIF_DELEGATE_FALSE +FLIF_DELEGATE_TRUE +FFTW_LIBS +FFTW_CFLAGS +FFTW_DELEGATE_FALSE +FFTW_DELEGATE_TRUE +fftw3_LIBS +fftw3_CFLAGS +DPS_LIBS +DPS_DELEGATE_FALSE +DPS_DELEGATE_TRUE +AUTOTRACE_DELEGATE_FALSE +AUTOTRACE_DELEGATE_TRUE +AUTOTRACE_LIBS +AUTOTRACE_CFLAGS +LIB_DL +WITH_LTDL_FALSE +WITH_LTDL_TRUE +ZSTD_LIBS +ZSTD_CFLAGS +ZSTD_DELEGATE_FALSE +ZSTD_DELEGATE_TRUE +LIBZSTD_LIBS +LIBZSTD_CFLAGS +ZLIB_DELEGATE_FALSE +ZLIB_DELEGATE_TRUE +ZLIB_LIBS +ZLIB_CFLAGS +XEXT_LIBS +X11_LIBS +X11_DELEGATE_FALSE +X11_DELEGATE_TRUE +X_EXTRA_LIBS +X_LIBS +X_PRE_LIBS +X_CFLAGS +XMKMF +BZLIB_LIBS +BZLIB_DELEGATE_FALSE +BZLIB_DELEGATE_TRUE +CCMALLOCDelegate +UMEM_LIBS +HAVE_UMEM_FALSE +HAVE_UMEM_TRUE +TCMALLOC_LIBS +HAVE_TCMALLOC_FALSE +HAVE_TCMALLOC_TRUE +JEMALLOC_LIBS +HAVE_JEMALLOC_FALSE +HAVE_JEMALLOC_TRUE +GOMP_LIBS +WITH_MAGICK_PLUS_PLUS_FALSE +WITH_MAGICK_PLUS_PLUS_TRUE +OPENMP_CXXFLAGS +MATH_LIBS +POW_LIB +LIBOBJS +LIBRARY_EXTRA_CPPFLAGS +MODULE_EXTRA_CPPFLAGS +LIBSTDCLDFLAGS +PERL_MAKE_OPTIONS +MAGICK_LT_RELEASE_OPTS +MAGICK_ABI_SUFFIX +QUANTUM_DEPTH +LEGACY_SUPPORT_FALSE +LEGACY_SUPPORT_TRUE +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +MAGICK_HDRI +MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_FALSE +MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE +WITH_MODULES_FALSE +WITH_MODULES_TRUE +WITH_SHARED_LIBS_FALSE +WITH_SHARED_LIBS_TRUE +LIBTOOL_DEPS +CXXCPP +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +NM +ac_ct_DUMPBIN +DUMPBIN +LIBTOOL +OBJDUMP +DLLTOOL +AS +LFS_CPPFLAGS +OPENMP_CFLAGS +THREAD_LIBS +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CC +ax_pthread_config +pkgconfigdir +SHAREARCH_DIR +INCLUDEARCH_DIR +WinPathScript +CYGWIN_BUILD_FALSE +CYGWIN_BUILD_TRUE +WIN32_NATIVE_BUILD_FALSE +WIN32_NATIVE_BUILD_TRUE +HAVE_LD_VERSION_SCRIPT_FALSE +HAVE_LD_VERSION_SCRIPT_TRUE +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +PRTDIAG +LN_S +LD +FGREP +SED +ac_ct_AR +AR +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +DIRSEP +MAGICK_FILTER_MODULE_PATH +MAGICK_CONFIGURE_BUILD_PATH +MAGICK_CONFIGURE_SRC_PATH +MAGICK_CODER_MODULE_PATH +MAN_DIR +INFO_DIR +PERSISTINCLUDE_DIR +INCLUDE_DIR +LIB_DIR +LOCALSTATE_DIR +SHAREDSTATE_DIR +SYSCONF_DIR +DOC_DIR +DATA_DIR +LIBEXEC_DIR +SBIN_DIR +BIN_DIR +EXEC_PREFIX_DIR +PREFIX_DIR +MAGICKPP_LIB_VERSION_TEXT +MAGICKPP_LIB_VERSION +MAGICK_LIB_VERSION_NUMBER +MAGICK_LIB_VERSION_TEXT +MAGICK_LIB_VERSION +PACKAGE_RELEASE_DATE +PACKAGE_LIB_VERSION_NUMBER +PACKAGE_LIB_VERSION +PACKAGE_VERSION_ADDENDUM +PACKAGE_PATCHLEVEL_VERSION +PACKAGE_BASE_VERSION +MAGICKPP_LIBRARY_VERSION_INFO +MAGICKPP_LIBRARY_CURRENT_MIN +MAGICKPP_LIBRARY_AGE +MAGICKPP_LIBRARY_REVISION +MAGICKPP_LIBRARY_CURRENT +MAGICK_LIBRARY_VERSION_INFO +MAGICK_LIBRARY_CURRENT_MIN +MAGICK_LIBRARY_AGE +MAGICK_LIBRARY_REVISION +MAGICK_LIBRARY_CURRENT +MAGICK_GIT_REVISION +MAGICK_VERSION +MAGICK_PATCHLEVEL_VERSION +MAGICK_MICRO_VERSION +MAGICK_MINOR_VERSION +MAGICK_MAJOR_VERSION +MAGICK_TARGET_OS +MAGICK_TARGET_VENDOR +MAGICK_TARGET_CPU +CONFIGURE_ARGS +DISTCHECK_CONFIG_FLAGS +CONFIGURE_DEPENDENCIES +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_os +target_vendor +target_cpu +target +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +with_gnu_ld +with_dmalloc +with_gcc_arch +enable_ld_version_script +enable_bounds_checking +enable_osx_universal_binary +with_includearch_dir +with_sharearch_dir +with_pkgconfigdir +with_threads +enable_openmp +enable_opencl +enable_largefile +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_sysroot +enable_libtool_lock +with_modules +enable_delegate_build +enable_deprecated +enable_installed +enable_cipher +enable_zero_configuration +enable_hdri +enable_pipes +enable_maintainer_mode +enable_hugepages +enable_ccmalloc +enable_efence +enable_prof +enable_gprof +enable_gcov +with_method_prefix +enable_legacy_support +with_quantum_depth +with_cache +with_frozenpaths +with_magick_plus_plus +with_package_release_name +with_perl +with_perl_options +with_jemalloc +with_tcmalloc +with_umem +with_libstdc +enable_assert +with_bzlib +with_x +with_zlib +with_zstd +with_apple_font_dir +with_autotrace +with_dps +with_dejavu_font_dir +with_fftw +with_flif +with_fpx +with_djvu +with_fontconfig +with_freetype +with_raqm +with_gdi32 +with_gslib +with_fontpath +with_gs_font_dir +with_gvc +with_heic +with_jbig +with_jpeg +with_jxl +with_lcms +with_openjp2 +with_lqr +with_lzma +with_openexr +with_pango +with_png +with_raw +with_rsvg +with_tiff +with_urw_base35_font_dir +with_webp +with_windows_font_dir +with_wmf +with_xml +enable_docs +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +LT_SYS_LIBRARY_PATH +CXX +CXXFLAGS +CCC +CXXCPP +XMKMF +ZLIB_CFLAGS +ZLIB_LIBS +LIBZSTD_CFLAGS +LIBZSTD_LIBS +AUTOTRACE_CFLAGS +AUTOTRACE_LIBS +fftw3_CFLAGS +fftw3_LIBS +ddjvuapi_CFLAGS +ddjvuapi_LIBS +FONTCONFIG_CFLAGS +FONTCONFIG_LIBS +FREETYPE_CFLAGS +FREETYPE_LIBS +RAQM_CFLAGS +RAQM_LIBS +GVC_CFLAGS +GVC_LIBS +HEIF_CFLAGS +HEIF_LIBS +LCMS2_CFLAGS +LCMS2_LIBS +LIBOPENJP2_CFLAGS +LIBOPENJP2_LIBS +LQR_CFLAGS +LQR_LIBS +LZMA_CFLAGS +LZMA_LIBS +OPENEXR_CFLAGS +OPENEXR_LIBS +PANGO_CFLAGS +PANGO_LIBS +PNG_CFLAGS +PNG_LIBS +RAW_R_CFLAGS +RAW_R_LIBS +RSVG_CFLAGS +RSVG_LIBS +CAIRO_SVG_CFLAGS +CAIRO_SVG_LIBS +WEBP_CFLAGS +WEBP_LIBS +WEBPMUX_CFLAGS +WEBPMUX_LIBS +XML_CFLAGS +XML_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures ImageMagick 6.9.12-44 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/ImageMagick] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of ImageMagick 6.9.12-44:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-ld-version-script + enable linker version script (default is enabled + when possible) + --enable-bounds-checking + enable run-time bounds-checking + --enable-osx-universal-binary + build universal binary on OS X [[default=no]] + --disable-openmp do not use OpenMP + --enable-opencl use OpenCL + --disable-largefile omit support for large files + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-delegate-build look for delegate libraries in build directory + --disable-deprecated exclude deprecated methods in MagickCore and + MagickWand APIs + --disable-installed Formally install ImageMagick under PREFIX + --disable-cipher disable enciphering and deciphering image pixels + --enable-zero-configuration + enable self-contained, embeddable, + zero-configuration ImageMagick + --enable-hdri accurately represent the wide range of intensity + levels found in real scenes + --enable-pipes enable pipes (|) in filenames + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-hugepages enable 'huge pages' support + --enable-ccmalloc enable 'ccmalloc' memory debug support + --enable-efence enable 'efence' memory debug support + --enable-prof enable 'prof' profiling support + --enable-gprof enable 'gprof' profiling support + --enable-gcov enable 'gcov' profiling support + --enable-legacy-support install legacy command-line utilities (default disabled) + --disable-assert turn off assertions + --disable-docs disable building of documentation + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-dmalloc use dmalloc, as in http://www.dmalloc.com + --with-gcc-arch= use architecture for gcc -march/-mtune, + instead of guessing + --includearch-dir=DIR ARCH specific include directory + --sharearch-dir=DIR ARCH specific config directory + --with-pkgconfigdir=DIR Path to the pkgconfig directory [LIBDIR/pkgconfig] + --without-threads disable POSIX threads API support + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-modules enable building dynamically loadable modules + --with-method-prefix=PREFIX + prefix MagickCore API methods + --with-quantum-depth=DEPTH + number of bits in a pixel quantum (default 16) + --with-cache=THRESHOLD set pixel cache threshhold in MB (default available + memory) + --with-frozenpaths freeze delegate paths + --without-magick-plus-plus + disable build/install of Magick++ + --with-package-release-name=NAME + encode this name into the shared library + --with-perl enable build/install of PerlMagick + --with-perl-options=OPTIONS + options to pass on command-line when generating + PerlMagick build file + --with-jemalloc enable jemalloc memory allocation library support + --with-tcmalloc enable tcmalloc memory allocation library support + --with-umem enable umem memory allocation library support + --with-libstdc=DIR use libstdc++ in DIR (for GNU C++) + --without-bzlib disable BZLIB support + --with-x use the X Window System + --without-zlib disable ZLIB support + --without-zstd disable ZSTD support + --with-apple-font-dir=DIR + Apple font directory + --with-autotrace enable autotrace support + --without-dps disable Display Postscript support + --with-dejavu-font-dir=DIR + DejaVu font directory + --with-fftw enable FFTW support + --without-flif disable FLIF support + --without-fpx disable FlashPIX support + --without-djvu disable DjVu support + --without-fontconfig disable fontconfig support + --without-freetype disable Freetype support + --without-raqm disable Raqm support + --without-gdi32 disable Windows gdi32 support + --with-gslib enable Ghostscript library support + --with-fontpath=DIR prepend to default font search path + --with-gs-font-dir=DIR Ghostscript font directory + --with-gvc enable GVC support + --without-heic disable HEIC support + --without-jbig disable JBIG support + --without-jpeg disable JPEG support + --without-jxl disable Jpegxl support + --without-lcms disable lcms (v1.1X) support + --without-openjp2 disable OpenJP2 support + --without-lqr disable Liquid Rescale support + --without-lzma disable LZMA support + --without-openexr disable OpenEXR support + --without-pango disable PANGO support + --without-png disable PNG support + --without-raw disable Raw support + --with-rsvg enable RSVG support + --without-tiff disable TIFF support + --with-urw-base35-font-dir=DIR + URW-base35 font directory + --without-webp disable WEBP support + --with-windows-font-dir=DIR + Windows font directory + --with-wmf enable WMF support + --without-xml disable XML support + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + XMKMF Path to xmkmf, Makefile generator for X Window System + ZLIB_CFLAGS C compiler flags for ZLIB, overriding pkg-config + ZLIB_LIBS linker flags for ZLIB, overriding pkg-config + LIBZSTD_CFLAGS + C compiler flags for LIBZSTD, overriding pkg-config + LIBZSTD_LIBS + linker flags for LIBZSTD, overriding pkg-config + AUTOTRACE_CFLAGS + C compiler flags for AUTOTRACE, overriding pkg-config + AUTOTRACE_LIBS + linker flags for AUTOTRACE, overriding pkg-config + fftw3_CFLAGS + C compiler flags for fftw3, overriding pkg-config + fftw3_LIBS linker flags for fftw3, overriding pkg-config + ddjvuapi_CFLAGS + C compiler flags for ddjvuapi, overriding pkg-config + ddjvuapi_LIBS + linker flags for ddjvuapi, overriding pkg-config + FONTCONFIG_CFLAGS + C compiler flags for FONTCONFIG, overriding pkg-config + FONTCONFIG_LIBS + linker flags for FONTCONFIG, overriding pkg-config + FREETYPE_CFLAGS + C compiler flags for FREETYPE, overriding pkg-config + FREETYPE_LIBS + linker flags for FREETYPE, overriding pkg-config + RAQM_CFLAGS C compiler flags for RAQM, overriding pkg-config + RAQM_LIBS linker flags for RAQM, overriding pkg-config + GVC_CFLAGS C compiler flags for GVC, overriding pkg-config + GVC_LIBS linker flags for GVC, overriding pkg-config + HEIF_CFLAGS C compiler flags for HEIF, overriding pkg-config + HEIF_LIBS linker flags for HEIF, overriding pkg-config + LCMS2_CFLAGS + C compiler flags for LCMS2, overriding pkg-config + LCMS2_LIBS linker flags for LCMS2, overriding pkg-config + LIBOPENJP2_CFLAGS + C compiler flags for LIBOPENJP2, overriding pkg-config + LIBOPENJP2_LIBS + linker flags for LIBOPENJP2, overriding pkg-config + LQR_CFLAGS C compiler flags for LQR, overriding pkg-config + LQR_LIBS linker flags for LQR, overriding pkg-config + LZMA_CFLAGS C compiler flags for LZMA, overriding pkg-config + LZMA_LIBS linker flags for LZMA, overriding pkg-config + OPENEXR_CFLAGS + C compiler flags for OPENEXR, overriding pkg-config + OPENEXR_LIBS + linker flags for OPENEXR, overriding pkg-config + PANGO_CFLAGS + C compiler flags for PANGO, overriding pkg-config + PANGO_LIBS linker flags for PANGO, overriding pkg-config + PNG_CFLAGS C compiler flags for PNG, overriding pkg-config + PNG_LIBS linker flags for PNG, overriding pkg-config + RAW_R_CFLAGS + C compiler flags for RAW_R, overriding pkg-config + RAW_R_LIBS linker flags for RAW_R, overriding pkg-config + RSVG_CFLAGS C compiler flags for RSVG, overriding pkg-config + RSVG_LIBS linker flags for RSVG, overriding pkg-config + CAIRO_SVG_CFLAGS + C compiler flags for CAIRO_SVG, overriding pkg-config + CAIRO_SVG_LIBS + linker flags for CAIRO_SVG, overriding pkg-config + WEBP_CFLAGS C compiler flags for WEBP, overriding pkg-config + WEBP_LIBS linker flags for WEBP, overriding pkg-config + WEBPMUX_CFLAGS + C compiler flags for WEBPMUX, overriding pkg-config + WEBPMUX_LIBS + linker flags for WEBPMUX, overriding pkg-config + XML_CFLAGS C compiler flags for XML, overriding pkg-config + XML_LIBS linker flags for XML, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +ImageMagick home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +ImageMagick configure 6.9.12-44 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ----------------------------------------------------------------- ## +## Report this to https://github.com/ImageMagick/ImageMagick6/issues ## +## ----------------------------------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +$as_echo_n "checking for $2.$3... " >&6; } +if eval \${$4+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + eval "$4=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$4 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_member + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# ac_fn_c_find_intX_t LINENO BITS VAR +# ----------------------------------- +# Finds a signed integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_intX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 +$as_echo_n "checking for int$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in int$2_t 'int' 'long int' \ + 'long long int' 'short int' 'signed char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + enum { N = $2 / 2 - 1 }; +int +main () +{ +static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + enum { N = $2 / 2 - 1 }; +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) + < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + case $ac_type in #( + int$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_intX_t + +# ac_fn_c_find_uintX_t LINENO BITS VAR +# ------------------------------------ +# Finds an unsigned integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_uintX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 +$as_echo_n "checking for uint$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + case $ac_type in #( + uint$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_uintX_t + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 &5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ----------------------------------------------------------------- ## +## Report this to https://github.com/ImageMagick/ImageMagick6/issues ## +## ----------------------------------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_header_mongrel +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by ImageMagick $as_me 6.9.12-44, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +as_fn_append ac_header_list " stdlib.h" +as_fn_append ac_header_list " unistd.h" +as_fn_append ac_header_list " sys/param.h" +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +ac_aux_dir= +for ac_dir in config "$srcdir"/config; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + + +ac_config_headers="$ac_config_headers config/config.h" + + +ac_config_commands="$ac_config_commands magick/magick-baseconfig.h" + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; +esac +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + + + +am__api_version='1.16' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='ImageMagick' + VERSION='6.9.12-44' + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar plaintar pax cpio none' + +# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 +$as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; } + if test $am_uid -le $am_max_uid; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + _am_tools=none + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 +$as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; } + if test $am_gid -le $am_max_gid; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + _am_tools=none + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 +$as_echo_n "checking how to create a ustar tar archive... " >&6; } + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_ustar-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + { echo "$as_me:$LINENO: $_am_tar --version" >&5 + ($_am_tar --version) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && break + done + am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x ustar -w "$$tardir"' + am__tar_='pax -L -x ustar -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H ustar -L' + am__tar_='find "$tardir" -print | cpio -o -H ustar -L' + am__untar='cpio -i -H ustar -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_ustar}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 + (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + rm -rf conftest.dir + if test -s conftest.tar; then + { echo "$as_me:$LINENO: $am__untar &5 + ($am__untar &5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 + (cat conftest.dir/file) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + if ${am_cv_prog_tar_ustar+:} false; then : + $as_echo_n "(cached) " >&6 +else + am_cv_prog_tar_ustar=$_am_tool +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 +$as_echo "$am_cv_prog_tar_ustar" >&6; } + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +CONFIGURE_DEPENDENCIES="$CONFIGURE_DEPENDENCIES \$(top_srcdir)/ChangeLog.md \$(top_srcdir)/m4/version.m4" + + +# +# Save initial user-tunable values +# +USER_LIBS=$LIBS +for var in CC CFLAGS CPPFLAGS CXX CXXCPP LDFLAGS AR_FLAGS LIBS ; do + eval isset=\${$var+set} + if test "$isset" = 'set'; then + eval val=$`echo $var` + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS}'${var}=${val}' " + fi +done + + +CONFIGURE_ARGS="$0 ${ac_configure_args}" + + +echo "Configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" + +MAGICK_TARGET_CPU=$host_cpu + + +cat >>confdefs.h <<_ACEOF +#define MAGICK_TARGET_CPU $MAGICK_TARGET_CPU +_ACEOF + + +MAGICK_TARGET_VENDOR=$host_vendor + + +cat >>confdefs.h <<_ACEOF +#define MAGICK_TARGET_VENDOR $MAGICK_TARGET_VENDOR +_ACEOF + + +MAGICK_TARGET_OS=$host_os + + +cat >>confdefs.h <<_ACEOF +#define MAGICK_TARGET_OS $MAGICK_TARGET_OS +_ACEOF + + + +# Substitute versioning +MAGICK_MAJOR_VERSION=6 + +MAGICK_MINOR_VERSION=9 + +MAGICK_MICRO_VERSION=12 + +MAGICK_PATCHLEVEL_VERSION=44 + +MAGICK_VERSION=6.9.12-44 + +MAGICK_GIT_REVISION=20220327 + + +# Substitute library versioning +MAGICK_LIBRARY_CURRENT=7 +MAGICK_LIBRARY_REVISION=0 +MAGICK_LIBRARY_AGE=0 +MAGICK_LIBRARY_CURRENT_MIN=`expr $MAGICK_LIBRARY_CURRENT - $MAGICK_LIBRARY_AGE` + +MAGICK_LIBRARY_VERSION_INFO=$MAGICK_LIBRARY_CURRENT:$MAGICK_LIBRARY_REVISION:$MAGICK_LIBRARY_AGE + + +MAGICKPP_LIBRARY_CURRENT=9 +MAGICKPP_LIBRARY_REVISION=0 +MAGICKPP_LIBRARY_AGE=0 +MAGICKPP_LIBRARY_CURRENT_MIN=`expr $MAGICKPP_LIBRARY_CURRENT - $MAGICKPP_LIBRARY_AGE` + +MAGICKPP_LIBRARY_VERSION_INFO=$MAGICKPP_LIBRARY_CURRENT:$MAGICKPP_LIBRARY_REVISION:$MAGICKPP_LIBRARY_AGE + + +PACKAGE_BASE_VERSION=6.9.12 + +PACKAGE_PATCHLEVEL_VERSION=44 + +PACKAGE_VERSION_ADDENDUM=-44 + +PACKAGE_LIB_VERSION=0x69C + +PACKAGE_LIB_VERSION_NUMBER=6,9,12,44 + +PACKAGE_RELEASE_DATE=2022-03-27 + + +# Ensure that make can run correctly +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + + +# versioning of library +MAGICK_LIB_VERSION="0x" +if test ${MAGICK_LIBRARY_CURRENT} -lt 10 ; then + MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}0 +fi +MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}${MAGICK_LIBRARY_CURRENT} +if test ${MAGICK_LIBRARY_AGE} -lt 10 ; then + MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}0 +fi +MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}${MAGICK_LIBRARY_AGE} +if test ${MAGICK_LIBRARY_REVISION} -lt 10 ; then + MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}0 +fi +MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}${MAGICK_LIBRARY_REVISION} + + +# Definition used to define MagickLibVersionText in version.h +MAGICK_LIB_VERSION_TEXT="${PACKAGE_BASE_VERSION}" + + +# Definition used to define MagickLibVersionNumber in version.h +MAGICK_LIB_VERSION_NUMBER="${MAGICK_LIBRARY_CURRENT},${MAGICK_LIBRARY_AGE},${MAGICK_LIBRARY_REVISION}" + + +MAGICKPP_LIB_VERSION="0x" +if test ${MAGICKPP_LIBRARY_CURRENT} -lt 10 ; then + MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}0 +fi +MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}${MAGICKPP_LIBRARY_CURRENT} +if test ${MAGICKPP_LIBRARY_AGE} -lt 10 ; then + MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}0 +fi +MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}${MAGICKPP_LIBRARY_AGE} +if test ${MAGICKPP_LIBRARY_REVISION} -lt 10 ; then + MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}0 +fi +MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}${MAGICKPP_LIBRARY_REVISION} + + +# Definition used to define MagickLibVersionText in version.h +MAGICKPP_LIB_VERSION_TEXT="${PACKAGE_BASE_VERSION}" + + +# Definition used to define MagickLibVersionNumber in version.h +MAGICK_LIB_VERSION_NUMBER="${MAGICK_LIBRARY_CURRENT},${MAGICK_LIBRARY_AGE},${MAGICK_LIBRARY_REVISION}" + + +PERLMAINCC=$CC + +MAGICK_CFLAGS='' +MAGICK_CPPFLAGS=$CPPFLAGS_USER +MAGICK_PCFLAGS=$CPPFLAGS_USER +MAGICK_LDFLAGS='' +MAGICK_LIBS='' +MAGICK_FEATURES='' + +# +# Evaluate shell variable equivalents to Makefile directory variables +# +if test "x$prefix" = xNONE; then + prefix=$ac_default_prefix +fi +# Let make expand exec_prefix. +if test "x$exec_prefix" = xNONE; then + exec_prefix='${prefix}' +fi + +# +eval "eval PREFIX_DIR=${prefix}" + +eval "eval EXEC_PREFIX_DIR=${exec_prefix}" + +eval "eval BIN_DIR=$bindir" + +eval "eval SBIN_DIR=$sbindir" + +eval "eval LIBEXEC_DIR=$libexecdir" + +eval "eval DATA_DIR=$datadir" + +eval "eval DOC_DIR=$datadir/doc" + +eval "eval SYSCONF_DIR=$sysconfdir" + +eval "eval SHAREDSTATE_DIR=$sharedstatedir" + +eval "eval LOCALSTATE_DIR=$localstatedir" + +eval "eval LIB_DIR=$libdir" + +eval "eval INCLUDE_DIR=$includedir" + +eval "eval PERSISTINCLUDE_DIR=$oldincludedir" + +eval "eval INFO_DIR=$infodir" + +eval "eval MAN_DIR=$mandir" + + +# Get full paths to source and build directories +srcdirfull="`cd $srcdir && pwd`" +builddir="`pwd`" + +# +# Compute variables useful for running uninstalled software. +# +MAGICK_CODER_MODULE_PATH="${builddir}/coders" +MAGICK_CONFIGURE_SRC_PATH="${srcdirfull}/config" +MAGICK_CONFIGURE_BUILD_PATH="${builddir}/config" +MAGICK_FILTER_MODULE_PATH="${builddir}/filters" +DIRSEP=':' +case "${build_os}" in + mingw* ) + MAGICK_CODER_MODULE_PATH=`$WinPathScript "${MAGICK_CODER_MODULE_PATH}" 0` + MAGICK_CONFIGURE_SRC_PATH=`$WinPathScript "${MAGICK_CONFIGURE_SRC_PATH}" 0` + MAGICK_CONFIGURE_BUILD_PATH=`$WinPathScript "${MAGICK_CONFIGURE_BUILD_PATH}" 0` + MAGICK_FILTER_MODULE_PATH=`$WinPathScript "${MAGICK_FILTER_MODULE_PATH}" 0` + DIRSEP=';' + ;; +esac +case "${host_os}" in + mingw* ) + DIRSEP=';' + ;; +esac + + + + + + + +# +# Enable OS features. +# +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +$as_echo "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = xyes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if ${ac_cv_safe_to_define___extensions__+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + + +# ============================================================================== +# Find required base packages +# ============================================================================== +if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if ${ac_cv_prog_cc_c99+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#include + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c99" != xno; then : + +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 +$as_echo_n "checking for C compiler vendor... " >&6; } +if ${ax_cv_c_compiler_vendor+:} false; then : + $as_echo_n "(cached) " >&6 +else + + vendors=" + intel: __ICC,__ECC,__INTEL_COMPILER + ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__,__ibmxl__ + pathscale: __PATHCC__,__PATHSCALE__ + clang: __clang__ + cray: _CRAYC + fujitsu: __FUJITSU + sdcc: SDCC,__SDCC + sx: _SX + portland: __PGI + gnu: __GNUC__ + sun: __SUNPRO_C,__SUNPRO_CC,__SUNPRO_F90,__SUNPRO_F95 + hp: __HP_cc,__HP_aCC + dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER + borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ + comeau: __COMO__ + kai: __KCC + lcc: __LCC__ + sgi: __sgi,sgi + microsoft: _MSC_VER + metrowerks: __MWERKS__ + watcom: __WATCOMC__ + tcc: __TINYC__ + unknown: UNKNOWN + " + for ventest in $vendors; do + case $ventest in + *:) + vendor=$ventest + continue + ;; + *) + vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" + ;; + esac + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#if !($vencpp) + thisisanerror; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done + + ax_cv_c_compiler_vendor=`echo $vendor | cut -d: -f1` + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 +$as_echo "$ax_cv_c_compiler_vendor" >&6; } + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for most reasonable warnings" >&5 +$as_echo_n "checking CFLAGS for most reasonable warnings... " >&6; } +if ${ac_cv_cflags_warn_all+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ac_cv_cflags_warn_all="" + ac_save_cflags_warn_all_found="yes" + case "$ax_cv_c_compiler_vendor" in #( + intel) : + ac_cv_cflags_warn_all="-w2" ;; #( + ibm) : + ac_cv_cflags_warn_all="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" ;; #( + pathscale) : + ;; #( + clang) : + ac_cv_cflags_warn_all="-Wall" ;; #( + cray) : + ac_cv_cflags_warn_all="-h msglevel 2" ;; #( + fujitsu) : + ;; #( + sdcc) : + ;; #( + sx) : + ac_cv_cflags_warn_all="-pvctl,fullmsg" ;; #( + portland) : + ;; #( + gnu) : + ac_cv_cflags_warn_all="-Wall" ;; #( + sun) : + ac_cv_cflags_warn_all="-v" ;; #( + hp) : + ac_cv_cflags_warn_all="+w1" ;; #( + dec) : + ac_cv_cflags_warn_all="-verbose -w0 -warnprotos" ;; #( + borland) : + ;; #( + comeau) : + ;; #( + kai) : + ;; #( + lcc) : + ;; #( + sgi) : + ac_cv_cflags_warn_all="-fullwarn" ;; #( + microsoft) : + ;; #( + metrowerks) : + ;; #( + watcom) : + ;; #( + tcc) : + ;; #( + unknown) : + + ac_cv_cflags_warn_all="" + ac_save_cflags_warn_all_found="no" + ;; #( + *) : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unknown compiler vendor returned by AX_COMPILER_VENDOR" >&5 +$as_echo "$as_me: WARNING: Unknown compiler vendor returned by AX_COMPILER_VENDOR" >&2;} + ac_cv_cflags_warn_all="" + ac_save_cflags_warn_all_found="no" + + ;; +esac + + if test "x$ac_save_cflags_warn_all_found" = "xyes"; then : + if test "x$ac_cv_cflags_warn_all" != "x"; then : + +if ${CFLAGS+:} false; then : + + case " $CFLAGS " in #( + *" $ac_cv_cflags_warn_all "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$ac_cv_cflags_warn_all"; } >&5 + (: CFLAGS already contains $ac_cv_cflags_warn_all) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + CFLAGS="$ac_cv_cflags_warn_all $CFLAGS" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CFLAGS=$ac_cv_cflags_warn_all + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +fi + +else + true + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_warn_all" >&5 +$as_echo "$ac_cv_cflags_warn_all" >&6; } + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if malloc debugging is wanted" >&5 +$as_echo_n "checking if malloc debugging is wanted... " >&6; } + +# Check whether --with-dmalloc was given. +if test "${with_dmalloc+set}" = set; then : + withval=$with_dmalloc; if test "$withval" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define WITH_DMALLOC 1" >>confdefs.h + + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__" >&5 +$as_echo_n "checking for __attribute__... " >&6; } +if ${ax_cv___attribute__+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + static void foo(void) __attribute__ ((unused)); + static void + foo(void) { + exit(1); + } + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv___attribute__=yes +else + ax_cv___attribute__=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv___attribute__" >&5 +$as_echo "$ax_cv___attribute__" >&6; } + if test "$ax_cv___attribute__" = "yes"; then + +$as_echo "#define HAVE___ATTRIBUTE__ 1" >>confdefs.h + + fi + + + + + + + +# Check whether --with-gcc-arch was given. +if test "${with_gcc_arch+set}" = set; then : + withval=$with_gcc_arch; ax_gcc_arch=$withval +else + ax_gcc_arch=yes +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5 +$as_echo_n "checking for gcc architecture flag... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +if ${ax_cv_gcc_archflag+:} false; then : + $as_echo_n "(cached) " >&6 +else + +ax_cv_gcc_archflag="unknown" + +if test "$GCC" = yes; then + +if test "x$ax_gcc_arch" = xyes; then +ax_gcc_arch="" +if test "$cross_compiling" = no; then +case $host_cpu in + i[3456]86*|x86_64*|amd64*) # use cpuid codes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5 +$as_echo_n "checking for x86 cpuid 0 output... " >&6; } +if ${ax_cv_gcc_x86_cpuid_0+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_cpuid_0=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = 0, level = 0, eax, ebx, ecx, edx; + FILE *f; + __asm__ __volatile__ ("xchg %%ebx, %1\n" + "cpuid\n" + "xchg %%ebx, %1\n" + : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op), "2" (level)); + + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid +else + ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5 +$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5 +$as_echo_n "checking for x86 cpuid 1 output... " >&6; } +if ${ax_cv_gcc_x86_cpuid_1+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_cpuid_1=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = 1, level = 0, eax, ebx, ecx, edx; + FILE *f; + __asm__ __volatile__ ("xchg %%ebx, %1\n" + "cpuid\n" + "xchg %%ebx, %1\n" + : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op), "2" (level)); + + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid +else + ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5 +$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + case $ax_cv_gcc_x86_cpuid_0 in + *:756e6547:6c65746e:49656e69) # Intel + case $ax_cv_gcc_x86_cpuid_1 in + *5[4578]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; + *5[123]?:*:*:*) ax_gcc_arch=pentium ;; + *0?61?:*:*:*|?61?:*:*:*|61?:*:*:*) ax_gcc_arch=pentiumpro ;; + *0?6[356]?:*:*:*|?6[356]?:*:*:*|6[356]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; + *0?6[78ab]?:*:*:*|?6[78ab]?:*:*:*|6[78ab]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; + *0?6[9d]?:*:*:*|?6[9d]?:*:*:*|6[9d]?:*:*:*|*1?65?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; + *0?6e?:*:*:*|?6e?:*:*:*|6e?:*:*:*) ax_gcc_arch="yonah pentium-m pentium3 pentiumpro" ;; + *0?6f?:*:*:*|?6f?:*:*:*|6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; + *1?6[7d]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; + *1?6[aef]?:*:*:*|*2?6e?:*:*:*) ax_gcc_arch="nehalem corei7 core2 pentium-m pentium3 pentiumpro" ;; + *2?6[5cf]?:*:*:*) ax_gcc_arch="westmere corei7 core2 pentium-m pentium3 pentiumpro" ;; + *2?6[ad]?:*:*:*) ax_gcc_arch="sandybridge corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *3?6[ae]?:*:*:*) ax_gcc_arch="ivybridge core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *3?6[cf]?:*:*:*|*4?6[56]?:*:*:*) ax_gcc_arch="haswell core-avx2 core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *3?6d?:*:*:*|*4?6[7f]?:*:*:*|*5?66?:*:*:*) ax_gcc_arch="broadwell core-avx2 core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *1?6c?:*:*:*|*2?6[67]?:*:*:*|*3?6[56]?:*:*:*) ax_gcc_arch="bonnell atom core2 pentium-m pentium3 pentiumpro" ;; + *3?67?:*:*:*|*[45]?6[ad]?:*:*:*) ax_gcc_arch="silvermont atom core2 pentium-m pentium3 pentiumpro" ;; + *000?f[012]?:*:*:*|?f[012]?:*:*:*|f[012]?:*:*:*) ax_gcc_arch="pentium4 pentiumpro" ;; + *000?f[346]?:*:*:*|?f[346]?:*:*:*|f[346]?:*:*:*) ax_gcc_arch="nocona prescott pentium4 pentiumpro" ;; + # fallback + *5??:*:*:*) ax_gcc_arch=pentium ;; + *??6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; + *6??:*:*:*) ax_gcc_arch=pentiumpro ;; + *00??f??:*:*:*|??f??:*:*:*|?f??:*:*:*|f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro" ;; + esac ;; + *:68747541:444d4163:69746e65) # AMD + case $ax_cv_gcc_x86_cpuid_1 in + *5[67]?:*:*:*) ax_gcc_arch=k6 ;; + *5[8]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; + *5[9d]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; + *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;; + *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; + *6[678a]?:*:*:*) ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; + *000?f[4578bcef]?:*:*:*|?f[4578bcef]?:*:*:*|f[4578bcef]?:*:*:*|*001?f[4578bcf]?:*:*:*|1?f[4578bcf]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; + *002?f[13457bcf]?:*:*:*|2?f[13457bcf]?:*:*:*|*004?f[138bcf]?:*:*:*|4?f[138bcf]?:*:*:*|*005?f[df]?:*:*:*|5?f[df]?:*:*:*|*006?f[8bcf]?:*:*:*|6?f[8bcf]?:*:*:*|*007?f[cf]?:*:*:*|7?f[cf]?:*:*:*|*00c?f1?:*:*:*|c?f1?:*:*:*|*020?f3?:*:*:*|20?f3?:*:*:*) ax_gcc_arch="athlon64-sse3 k8-sse3 athlon64 k8" ;; + *010?f[245689a]?:*:*:*|10?f[245689a]?:*:*:*|*030?f1?:*:*:*|30?f1?:*:*:*) ax_gcc_arch="barcelona amdfam10 k8" ;; + *050?f[12]?:*:*:*|50?f[12]?:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; + *060?f1?:*:*:*|60?f1?:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; + *060?f2?:*:*:*|60?f2?:*:*:*|*061?f[03]?:*:*:*|61?f[03]?:*:*:*) ax_gcc_arch="bdver2 bdver1 amdfam10 k8" ;; + *063?f0?:*:*:*|63?f0?:*:*:*) ax_gcc_arch="bdver3 bdver2 bdver1 amdfam10 k8" ;; + *07[03]?f0?:*:*:*|7[03]?f0?:*:*:*) ax_gcc_arch="btver2 btver1 amdfam10 k8" ;; + # fallback + *0[13]??f??:*:*:*|[13]??f??:*:*:*) ax_gcc_arch="barcelona amdfam10 k8" ;; + *020?f??:*:*:*|20?f??:*:*:*) ax_gcc_arch="athlon64-sse3 k8-sse3 athlon64 k8" ;; + *05??f??:*:*:*|5??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; + *060?f??:*:*:*|60?f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; + *061?f??:*:*:*|61?f??:*:*:*) ax_gcc_arch="bdver2 bdver1 amdfam10 k8" ;; + *06??f??:*:*:*|6??f??:*:*:*) ax_gcc_arch="bdver3 bdver2 bdver1 amdfam10 k8" ;; + *070?f??:*:*:*|70?f??:*:*:*) ax_gcc_arch="btver2 btver1 amdfam10 k8" ;; + *???f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; + esac ;; + *:746e6543:736c7561:48727561) # IDT / VIA (Centaur) + case $ax_cv_gcc_x86_cpuid_1 in + *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; + *5[89]?:*:*:*) ax_gcc_arch=winchip2 ;; + *66?:*:*:*) ax_gcc_arch=winchip2 ;; + *6[78]?:*:*:*) ax_gcc_arch=c3 ;; + *6[9adf]?:*:*:*) ax_gcc_arch="c3-2 c3" ;; + esac ;; + esac + if test x"$ax_gcc_arch" = x; then # fallback + case $host_cpu in + i586*) ax_gcc_arch=pentium ;; + i686*) ax_gcc_arch=pentiumpro ;; + esac + fi + ;; + + sparc*) + # Extract the first word of "prtdiag", so it can be a program name with args. +set dummy prtdiag; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PRTDIAG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PRTDIAG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag" + ;; +esac +fi +PRTDIAG=$ac_cv_path_PRTDIAG +if test -n "$PRTDIAG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5 +$as_echo "$PRTDIAG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` + cputype=`echo "$cputype" | tr -d ' -' | $SED 's/SPARCIIi/SPARCII/' |tr $as_cr_LETTERS $as_cr_letters` + case $cputype in + *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; + *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; + *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; + *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;; + *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;; + *cypress*) ax_gcc_arch=cypress ;; + esac ;; + + alphaev5) ax_gcc_arch=ev5 ;; + alphaev56) ax_gcc_arch=ev56 ;; + alphapca56) ax_gcc_arch="pca56 ev56" ;; + alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; + alphaev6) ax_gcc_arch=ev6 ;; + alphaev67) ax_gcc_arch=ev67 ;; + alphaev68) ax_gcc_arch="ev68 ev67" ;; + alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; + alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; + alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; + + powerpc*) + cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | $SED 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` + cputype=`echo $cputype | $SED -e 's/ppc//g;s/ *//g'` + case $cputype in + *750*) ax_gcc_arch="750 G3" ;; + *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;; + *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;; + *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;; + *970*) ax_gcc_arch="970 G5 power4";; + *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; + *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; + 603ev|8240) ax_gcc_arch="$cputype 603e 603";; + *POWER7*) ax_gcc_arch="power7";; + *POWER8*) ax_gcc_arch="power8";; + *POWER9*) ax_gcc_arch="power9";; + *POWER10*) ax_gcc_arch="power10";; + *) ax_gcc_arch=$cputype ;; + esac + ax_gcc_arch="$ax_gcc_arch powerpc" + ;; + aarch64) + cpuimpl=`grep 'CPU implementer' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` + cpuarch=`grep 'CPU architecture' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` + cpuvar=`grep 'CPU variant' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` + case $cpuimpl in + 0x42) case $cpuarch in + 8) case $cpuvar in + 0x0) ax_gcc_arch="thunderx2t99 vulcan armv8.1-a armv8-a+lse armv8-a native" ;; + esac + ;; + esac + ;; + 0x43) case $cpuarch in + 8) case $cpuvar in + 0x0) ax_gcc_arch="thunderx armv8-a native" ;; + 0x1) ax_gcc_arch="thunderx+lse armv8.1-a armv8-a+lse armv8-a native" ;; + esac + ;; + esac + ;; + esac + ;; +esac +fi # not cross-compiling +fi # guess arch + +if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then +if test "xyes" = xyes; then # if we require portable code + flag_prefixes="-mtune=" + if test "x$ax_cv_c_compiler_vendor" = xclang; then flag_prefixes="-march="; fi + # -mcpu=$arch and m$arch generate nonportable code on every arch except + # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. + case $host_cpu in i*86|x86_64*|amd64*) flag_prefixes="$flag_prefixes -mcpu= -m";; esac +else + flag_prefixes="-march= -mcpu= -m" +fi +for flag_prefix in $flag_prefixes; do + for arch in $ax_gcc_arch; do + flag="$flag_prefix$arch" + as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +$as_echo_n "checking whether C compiler accepts $flag... " >&6; } +if eval \${$as_CACHEVAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_CACHEVAR=yes" +else + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + if test "x$ax_cv_c_compiler_vendor" = xclang; then + if test "xyes" = xyes; then + if test "x$flag" = "x-march=$arch"; then flag=-mtune=$arch; fi + fi + fi; ax_cv_gcc_archflag=$flag; break +else + : +fi + + done + test "x$ax_cv_gcc_archflag" = xunknown || break +done +fi + +fi # $GCC=yes + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5 +$as_echo_n "checking for gcc architecture flag... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5 +$as_echo "$ax_cv_gcc_archflag" >&6; } +if test "x$ax_cv_gcc_archflag" = xunknown; then + : +else + CFLAGS="$CFLAGS $ax_cv_gcc_archflag" +fi + + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.20 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 +$as_echo_n "checking for C compiler vendor... " >&6; } +if ${ax_cv_c_compiler_vendor+:} false; then : + $as_echo_n "(cached) " >&6 +else + + vendors=" + intel: __ICC,__ECC,__INTEL_COMPILER + ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__,__ibmxl__ + pathscale: __PATHCC__,__PATHSCALE__ + clang: __clang__ + cray: _CRAYC + fujitsu: __FUJITSU + sdcc: SDCC,__SDCC + sx: _SX + portland: __PGI + gnu: __GNUC__ + sun: __SUNPRO_C,__SUNPRO_CC,__SUNPRO_F90,__SUNPRO_F95 + hp: __HP_cc,__HP_aCC + dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER + borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ + comeau: __COMO__ + kai: __KCC + lcc: __LCC__ + sgi: __sgi,sgi + microsoft: _MSC_VER + metrowerks: __MWERKS__ + watcom: __WATCOMC__ + tcc: __TINYC__ + unknown: UNKNOWN + " + for ventest in $vendors; do + case $ventest in + *:) + vendor=$ventest + continue + ;; + *) + vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" + ;; + esac + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#if !($vencpp) + thisisanerror; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done + + ax_cv_c_compiler_vendor=`echo $vendor | cut -d: -f1` + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 +$as_echo "$ax_cv_c_compiler_vendor" >&6; } + + +if test "x$GCC" = "xyes"; then + CFLAGS="$CFLAGS -fexceptions" + touch local.exp +else + cat > local.exp <&5 +$as_echo_n "checking if LD -Wl,--version-script works... " >&6; } +if ${gl_cv_sys_ld_version_script+:} false; then : + $as_echo_n "(cached) " >&6 +else + gl_cv_sys_ld_version_script=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" + echo foo >conftest.map + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + cat > conftest.map <conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_sys_ld_version_script=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + rm -f conftest.map + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_ld_version_script" >&5 +$as_echo "$gl_cv_sys_ld_version_script" >&6; } + have_ld_version_script=$gl_cv_sys_ld_version_script +fi + + if test "$have_ld_version_script" = yes; then + HAVE_LD_VERSION_SCRIPT_TRUE= + HAVE_LD_VERSION_SCRIPT_FALSE='#' +else + HAVE_LD_VERSION_SCRIPT_TRUE='#' + HAVE_LD_VERSION_SCRIPT_FALSE= +fi + + + +# +# Enable run-time checking. +# +# Check whether --enable-bounds-checking was given. +if test "${enable_bounds_checking+set}" = set; then : + enableval=$enable_bounds_checking; enable_bounds_checking=$enableval +else + enable_bounds_checking='no' +fi + + +if test "$enable_bounds_checking" = yes; then + +$as_echo "#define _FORTIFY_SOURCE 2" >>confdefs.h + +fi + +# +# Tests for Windows +# + + + +native_win32_build='no' +cygwin_build='no' +case "${host_os}" in + cygwin* ) + cygwin_build='yes' + ;; + mingw* ) + native_win32_build='yes' + ;; +esac + if test "${native_win32_build}" = 'yes'; then + WIN32_NATIVE_BUILD_TRUE= + WIN32_NATIVE_BUILD_FALSE='#' +else + WIN32_NATIVE_BUILD_TRUE='#' + WIN32_NATIVE_BUILD_FALSE= +fi + + if test "${cygwin_build}" = 'yes'; then + CYGWIN_BUILD_TRUE= + CYGWIN_BUILD_FALSE='#' +else + CYGWIN_BUILD_TRUE='#' + CYGWIN_BUILD_FALSE= +fi + + +WinPathScript="${srcdirfull}/winpath.sh" + + +# +# Compiler flags tweaks +# +if test "${GCC}" != "yes"; then + case "${host}" in + *-*-hpux* ) + # aCC: HP ANSI C++ B3910B A.03.34 + CFLAGS="${CFLAGS} -Wp,-H30000" + if test -n "${CXXFLAGS}"; then + CXXFLAGS='-AA' + else + CXXFLAGS="${CXXFLAGS} -AA" + fi + ;; + *-dec-osf5.* ) + # Compaq alphaev68-dec-osf5.1 compiler + if test -n "${CXXFLAGS}"; then + CXXFLAGS='-std strict_ansi -noimplicit_include' + else + CXXFLAGS="${CXXFLAGS} -std strict_ansi -noimplicit_include" + fi + esac +fi + +# Check for lazy-loading. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker lazyload option" >&5 +$as_echo_n "checking for linker lazyload option... " >&6; } +if ${im_cv_ld_lazyload+:} false; then : + $as_echo_n "(cached) " >&6 +else + +im_cv_ld_lazyload='none' +case "${host}" in + *-*-solaris2.8 | *-*-solaris2.9 | *-*-solaris2.1? ) + if test "$lt_cv_prog_gnu_ld" != 'yes' ; then + im_cv_ld_lazyload='-Wl,-zlazyload' + fi + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $im_cv_ld_lazyload" >&5 +$as_echo "$im_cv_ld_lazyload" >&6; } +if test "${im_cv_ld_lazyload}" != 'none' ; then + if test -z "${LDFLAGS}" ; then + LDFLAGS="${im_cv_ld_lazyload}" + else + LDFLAGS="${im_cv_ld_lazyload} ${LDFLAGS}" + fi +fi + +case "$host" in + *darwin* | *-macos10*) + CFLAGS="${CFLAGS} -D_FORTIFY_SOURCE=0" + # Check whether --enable-osx-universal-binary was given. +if test "${enable_osx_universal_binary+set}" = set; then : + enableval=$enable_osx_universal_binary; build_osxuniversal="${enableval}" +else + build_osxuniversal=no +fi + + + if test "${build_osxuniversal}" != no ; then + if test "$enable_dependency_tracking" != no ; then + as_fn_error $? "--enable-osx-universal-binary requires --disable-dependency-tracking. +Please re-run configure with these options: + --disable-dependency-tracking --enable-osx-universal-binary + " "$LINENO" 5 + fi + CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.5.sdk -arch ppc -arch i386" + CXXFLAGS="$CXXFLAGS -isysroot /Developer/SDKs/MacOSX10.5.sdk -arch ppc -arch i386" + LDFLAGS="$LDFLAGS -Wl,-syslibroot,/Developer/SDKs/MacOSX10.5.sdk -arch ppc -arch i386" + fi + ;; +esac + +# +# ARCH specific include directory +# + +# Check whether --with-includearch-dir was given. +if test "${with_includearch_dir+set}" = set; then : + withval=$with_includearch_dir; includearch_dir=$withval +else + includearch_dir=$INCLUDE_DIR +fi + + +eval "eval INCLUDEARCH_DIR=$includearch_dir" + + +# +# ARCH specific configuration directory +# + +# Check whether --with-sharearch-dir was given. +if test "${with_sharearch_dir+set}" = set; then : + withval=$with_sharearch_dir; sharearch_dir=$withval +else + sharearch_dir="${LIB_DIR}" +fi + + +eval "eval SHAREARCH_DIR=$sharearch_dir" + + +# Path to the pkgconfig folder + +# Check whether --with-pkgconfigdir was given. +if test "${with_pkgconfigdir+set}" = set; then : + withval=$with_pkgconfigdir; pkgconfigdir="$withval" +else + pkgconfigdir='${libdir}/pkgconfig' +fi + + + +# +# Enable support for POSIX thread APIs +# + +# Check whether --with-threads was given. +if test "${with_threads+set}" = set; then : + withval=$with_threads; with_threads=$withval +else + with_threads='yes' +fi + + +THREAD_LIBS='' +have_threads=no +if test "$with_threads" != 'no'; then + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + if test "x$PTHREAD_CC" != "x"; then : + CC="$PTHREAD_CC" +fi + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 +$as_echo_n "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (); +int +main () +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 +$as_echo "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} +fi +rm -f conftest* + + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" + ;; +esac + +# Are we compiling with Clang? + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 +$as_echo_n "checking whether $CC is Clang... " >&6; } +if ${ax_cv_PTHREAD_CLANG+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1; then : + ax_cv_PTHREAD_CLANG=yes +fi +rm -f conftest* + + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 +$as_echo "$ax_cv_PTHREAD_CLANG" >&6; } +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +if test "x$GCC" = "xyes"; then : + ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" +fi + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +if test "x$ax_pthread_clang" = "xyes"; then : + ax_pthread_flags="-pthread,-lpthread -pthread" +fi + + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +if test "x$ax_pthread_check_macro" = "x--"; then : + ax_pthread_check_cond=0 +else + ax_pthread_check_cond="!defined($ax_pthread_check_macro)" +fi + + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +$as_echo_n "checking whether pthreads work without any flags... " >&6; } + ;; + + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 +$as_echo_n "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } + ;; + + -*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 +$as_echo_n "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ax_pthread_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" +fi +fi +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +$as_echo "$ax_pthread_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$ax_pthread_config" = "xno"; then : + continue +fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 +$as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; } +int +main () +{ +pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xyes"; then : + break +fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + if test "x$ax_pthread_try" = "xunknown"; then : + break +fi + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_link="$ax_pthread_2step_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + if test "x$ax_pthread_try" = "x"; then : + ax_pthread_try=no +fi + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + + + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +$as_echo_n "checking for joinable pthread attribute... " >&6; } +if ${ax_cv_PTHREAD_JOINABLE_ATTR+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int attr = $ax_pthread_attr; return attr /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 +$as_echo "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } + if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"; then : + +cat >>confdefs.h <<_ACEOF +#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR +_ACEOF + + ax_pthread_joinable_attr_defined=yes + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 +$as_echo_n "checking whether more special flags are required for pthreads... " >&6; } +if ${ax_cv_PTHREAD_SPECIAL_FLAGS+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 +$as_echo "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } + if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"; then : + PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int i = PTHREAD_PRIO_INHERIT; + return i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_PTHREAD_PRIO_INHERIT=yes +else + ax_cv_PTHREAD_PRIO_INHERIT=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"; then : + +$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h + + ax_pthread_prio_inherit_defined=yes + +fi + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + case "x/$CC" in #( + x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : + #handle absolute path differently from PATH based program lookup + case "x$CC" in #( + x/*) : + if as_fn_executable_p ${CC}_r; then : + PTHREAD_CC="${CC}_r" +fi ;; #( + *) : + for ac_prog in ${CC}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PTHREAD_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +$as_echo "$PTHREAD_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + ;; +esac ;; #( + *) : + ;; +esac + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + +$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h + + : +else + ax_pthread_ok=no + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + if test "$ax_pthread_ok" = yes; then + have_threads=yes + DEF_THREAD="$PTHREAD_CFLAGS" + CFLAGS="$CFLAGS $DEF_THREAD" + CXXFLAGS="$CXXFLAGS $DEF_THREAD" + THREAD_LIBS="$PTHREAD_LIBS" + if test "$CC" != "$PTHREAD_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Replacing compiler $CC with compiler $PTHREAD_CC to support pthreads." >&5 +$as_echo "$as_me: WARNING: Replacing compiler $CC with compiler $PTHREAD_CC to support pthreads." >&2;} + CC="$PTHREAD_CC" + fi + +$as_echo "#define THREAD_SUPPORT 1" >>confdefs.h + + fi +fi +LIBS="$LIBS $THREAD_LIBS" + + +# Enable support for OpenMP +if test "$have_threads" != 'yes'; then + ac_cv_prog_c_openmp=unsupported +fi + + OPENMP_CFLAGS= + # Check whether --enable-openmp was given. +if test "${enable_openmp+set}" = set; then : + enableval=$enable_openmp; +fi + + if test "$enable_openmp" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 +$as_echo_n "checking for $CC option to support OpenMP... " >&6; } +if ${ac_cv_prog_c_openmp+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef _OPENMP + choke me +#endif +#include +int main () { return omp_get_num_threads (); } + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_prog_c_openmp='none needed' +else + ac_cv_prog_c_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ + -Popenmp --openmp; do + ac_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS $ac_option" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef _OPENMP + choke me +#endif +#include +int main () { return omp_get_num_threads (); } + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_prog_c_openmp=$ac_option +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS=$ac_save_CFLAGS + if test "$ac_cv_prog_c_openmp" != unsupported; then + break + fi + done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 +$as_echo "$ac_cv_prog_c_openmp" >&6; } + case $ac_cv_prog_c_openmp in #( + "none needed" | unsupported) + ;; #( + *) + OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; + esac + fi + + +CFLAGS="$OPENMP_CFLAGS $CFLAGS" +MAGICK_PCFLAGS="$MAGICK_PCFLAGS $OPENMP_CFLAGS" + +if test "$enable_openmp" != no; then + if test "$ac_cv_prog_c_openmp" != 'unsupported'; then + MAGICK_FEATURES="OpenMP $MAGICK_FEATURES" + fi +fi + +# Enable support for OpenCL +no_cl=yes + # Check whether --enable-opencl was given. +if test "${enable_opencl+set}" = set; then : + enableval=$enable_opencl; enable_opencl=$enableval +else + enable_opencl='no' +fi + + if test x"$enable_opencl" != xno ; then + CPPFLAGS_CL="" + for ac_header in CL/cl.h OpenCL/cl.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + HAVE_CL_H="yes"; break +else + HAVE_CL_H="no" +fi + +done + + if test x"$HAVE_CL_H" = xno ; then + # check for AMD's SDK + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for AMD's SDK cl.h" >&5 +$as_echo_n "checking for AMD's SDK cl.h... " >&6; } + if test -d /opt/AMDAPP/include/CL ; then + HAVE_CL_H="yes" + $as_echo "#define HAVE_CL_CL_H 1" >>confdefs.h + + CPPFLAGS_CL="-I/opt/AMDAPP/include" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_CL_H" >&5 +$as_echo "$HAVE_CL_H" >&6; } + fi + if test x"$HAVE_CL_H" = xno ; then + # check for NVIDIA's SDK + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NVIDIA's SDK cl.h" >&5 +$as_echo_n "checking for NVIDIA's SDK cl.h... " >&6; } + if test -d /usr/local/cuda/include/CL ; then + HAVE_CL_H="yes" + $as_echo "#define HAVE_CL_CL_H 1" >>confdefs.h + + CPPFLAGS_CL="-I/usr/local/cuda/include" + elif test -d /usr/local/cuda-6.5/include/CL ; then + HAVE_CL_H="yes" + $as_echo "#define HAVE_CL_CL_H 1" >>confdefs.h + + CPPFLAGS_CL="-I/usr/local/cuda-6.5/include" + elif test -d /usr/local/cuda-6.0/include/CL ; then + HAVE_CL_H="yes" + $as_echo "#define HAVE_CL_CL_H 1" >>confdefs.h + + CPPFLAGS_CL="-I/usr/local/cuda-6.0/include" + elif test -d /usr/local/cuda-5.5/include/CL ; then + HAVE_CL_H="yes" + $as_echo "#define HAVE_CL_CL_H 1" >>confdefs.h + + CPPFLAGS_CL="-I/usr/local/cuda-5.5/include" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_CL_H" >&5 +$as_echo "$HAVE_CL_H" >&6; } + fi + if test x"$HAVE_CL_H" = xno ; then + no_cl=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no OpenCL headers found" >&5 +$as_echo "$as_me: WARNING: no OpenCL headers found" >&2;} + CL_ENABLED=false + CL_VERSION=0 + else + # + # First we check for Mac OS X, since OpenCL is standard there + # + LIBS_CL="none" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenCL library" >&5 +$as_echo_n "checking for OpenCL library... " >&6; } + case "$host_os" in + darwin*) # On Mac OS X we check for installed frameworks + + case x"$host_os" in + xdarwin*) + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for framework OpenCL" >&5 +$as_echo_n "checking for framework OpenCL... " >&6; } +if ${ax_cv_check_OpenCL+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_check_framework_save_LIBS=$LIBS + LIBS="-framework OpenCL $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_check_OpenCL="yes" +else + ax_cv_check_OpenCL="no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_OpenCL" >&5 +$as_echo "$ax_cv_check_OpenCL" >&6; } + if test x"$ax_cv_check_OpenCL" = "xyes" ; then + + LIBS_CL="-framework OpenCL" + no_cl=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CL_ENABLED=true + CL_VERSION=1 + + + else + + no_cl=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CL_ENABLED=false + CL_VERSION=0 + + fi + LIBS=$ac_check_framework_save_LIBS + ;; + esac + + ;; + *) + save_LIBS=$LIBS + save_CFLAGS=$CFLAGS + CFLAGS=$CPPFLAGS_CL + LIBS="$save_LIBS -L/usr/lib64/nvidia -L/usr/lib/nvidia -lOpenCL" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #ifdef HAVE_OPENCL_CL_H + #include + #elif defined(HAVE_CL_CL_H) + #include + #endif + #include + +int +main () +{ + + clGetPlatformIDs(0, NULL, NULL); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + no_cl=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CL_ENABLED=true + CL_VERSION=1 + LIBS_CL="$save_LIBS -L/usr/lib64/nvidia -L/usr/lib/nvidia -lOpenCL" + +else + + no_cl=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CL_ENABLED=false + CL_VERSION=0 + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + LIBS=$save_LIBS + CFLAGS=$save_CFLAGS + ;; + esac + fi + else + no_cl=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenCL library" >&5 +$as_echo_n "checking for OpenCL library... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 +$as_echo "disabled" >&6; } + CL_ENABLED=false + CL_VERSION=0 + fi + +if test "X$no_cl" != 'Xyes'; then + MAGICK_FEATURES="OpenCL $MAGICK_FEATURES" +fi + +######## +# +# Check for large file support +# +######## +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if ${ac_cv_sys_largefile_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if ${ac_cv_sys_file_offset_bits+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if ${ac_cv_sys_large_files+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi + + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 +$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } +if ${ac_cv_sys_largefile_source+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include /* for off_t */ + #include +int +main () +{ +int (*fp) (FILE *, off_t, int) = fseeko; + return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_sys_largefile_source=no; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGEFILE_SOURCE 1 +#include /* for off_t */ + #include +int +main () +{ +int (*fp) (FILE *, off_t, int) = fseeko; + return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_sys_largefile_source=1; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_cv_sys_largefile_source=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 +$as_echo "$ac_cv_sys_largefile_source" >&6; } +case $ac_cv_sys_largefile_source in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source +_ACEOF +;; +esac +rm -rf conftest* + +# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug +# in glibc 2.1.3, but that breaks too many other things. +# If you want fseeko and ftello with glibc, upgrade to a fixed glibc. +if test $ac_cv_sys_largefile_source != unknown; then + +$as_echo "#define HAVE_FSEEKO 1" >>confdefs.h + +fi + +LFS_CPPFLAGS='' +if test "$enable_largefile" != no; then + case $ac_cv_sys_file_offset_bits in + no) + # nothing to do here as the host supports LFS fine + ;; + unknown) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for native large file support" >&5 +$as_echo_n "checking for native large file support... " >&6; } + if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + main () { + exit(!(sizeof(off_t) == 8)); + } +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; $as_echo "#define _FILE_OFFSET_BITS 64" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + ;; + *) + LFS_CPPFLAGS="$LFS_CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" + ;; + esac + if test "$ac_cv_sys_large_files" != 'no'; then + LFS_CPPFLAGS="$LFS_CPPFLAGS -D_LARGE_FILES=1" + fi + if test "$ac_cv_sys_largefile_source" != 'no'; then + LFS_CPPFLAGS="$LFS_CPPFLAGS -D_LARGEFILE_SOURCE=1" + fi +fi + + +# +# Check for sendfile support +# +######## +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Linux compatible sendfile()" >&5 +$as_echo_n "checking Linux compatible sendfile()... " >&6; } +if ${ac_cv_have_linux_sendfile+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #undef _FILE_OFFSET_BITS + #include + #include + #include + +int +main () +{ + + sendfile(0, 0, (void *) 0, 0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + ac_cv_have_linux_sendfile=yes + +else + + ac_cv_have_linux_sendfile=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_linux_sendfile" >&5 +$as_echo "$ac_cv_have_linux_sendfile" >&6; } +if test $ac_cv_have_linux_sendfile = yes; then + +$as_echo "#define HAVE_LINUX_SENDFILE 1" >>confdefs.h + +fi + +# +# Set SETJMP_IS_THREAD_SAFE define. +# +case "${host_os}" in + solaris2* ) ;; + *) +$as_echo "#define SETJMP_IS_THREAD_SAFE 1" >>confdefs.h + ;; +esac + +# Configure libtool +: ${AR_FLAGS=cr} +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + +enable_dlopen=yes + + + + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + + +func_stripname_cnf () +{ + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; + esac +} # func_stripname_cnf + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +# Check to see if building shared libraries +libtool_build_shared_libs='no' +if test "$enable_shared" = 'yes'; then + libtool_build_shared_libs='yes' +fi + +# Check to see if building static libraries +libtool_build_static_libs='no' +if test "$enable_static" = 'yes'; then + libtool_build_static_libs='yes' +fi + + if test "${libtool_build_shared_libs}" = 'yes'; then + WITH_SHARED_LIBS_TRUE= + WITH_SHARED_LIBS_FALSE='#' +else + WITH_SHARED_LIBS_TRUE='#' + WITH_SHARED_LIBS_FALSE= +fi + +# +# Enable support for building loadable modules +# +build_modules='no' + +# Check whether --with-modules was given. +if test "${with_modules+set}" = set; then : + withval=$with_modules; with_modules=$withval +else + with_modules='no' +fi + + +# Only allow building loadable modules if we are building shared libraries +if test "$with_modules" != 'no' ; then + if test "$libtool_build_shared_libs" = 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Modules may only be built if building shared libraries is enabled." >&5 +$as_echo "$as_me: WARNING: Modules may only be built if building shared libraries is enabled." >&2;} + build_modules='no' + else + build_modules='yes' + fi +fi +if test "$build_modules" != 'no' ; then + +$as_echo "#define BUILD_MODULES 1" >>confdefs.h + + MAGICK_FEATURES="$MAGICK_FEATURES Modules" +fi + if test "$build_modules" != 'no'; then + WITH_MODULES_TRUE= + WITH_MODULES_FALSE='#' +else + WITH_MODULES_TRUE='#' + WITH_MODULES_FALSE= +fi + + +# Enable build using delegate libraries built in subdirectories rather than installed +# delegate libraries (bzlib fftw fpx gslib jp2 jbig jpeg lcms lzma png tiff ttf wmf xml zlib) +# Check whether --enable-delegate-build was given. +if test "${enable_delegate_build+set}" = set; then : + enableval=$enable_delegate_build; enable_delegate_build=$enableval +else + enable_delegate_build='no' +fi + + +# Check whether --enable-deprecated was given. +if test "${enable_deprecated+set}" = set; then : + enableval=$enable_deprecated; enable_deprecated=$enableval +else + enable_deprecated='no' +fi + + +if test "$enable_deprecated" = 'yes'; then + +$as_echo "#define EXCLUDE_DEPRECATED 1" >>confdefs.h + +else + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --disable-deprecated " +fi + +# Build a version of ImageMagick which operates uninstalled. +# Used to build distributions located via MAGICK_HOME / executable path +# Check whether --enable-installed was given. +if test "${enable_installed+set}" = set; then : + enableval=$enable_installed; enable_installed=$enableval +else + enable_installed='yes' +fi + + +if test "$enable_installed" = 'yes'; then + +$as_echo "#define INSTALLED_SUPPORT 1" >>confdefs.h + +else + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --disable-installed " +fi + +# Permit enciphering and deciphering image pixels. +# Check whether --enable-cipher was given. +if test "${enable_cipher+set}" = set; then : + enableval=$enable_cipher; enable_cipher=$enableval +else + enable_cipher='yes' +fi + + +if test "$enable_cipher" = 'yes'; then + +$as_echo "#define CIPHER_SUPPORT 1" >>confdefs.h + + MAGICK_FEATURES="Cipher $MAGICK_FEATURES" +fi + +# Build a zero-configuration version of ImageMagick. +# Check whether --enable-zero-configuration was given. +if test "${enable_zero_configuration+set}" = set; then : + enableval=$enable_zero_configuration; enable_zero_configuration=$enableval +else + enable_zero_configuration='no' +fi + + +if test "$enable_zero_configuration" = 'yes'; then + +$as_echo "#define ZERO_CONFIGURATION_SUPPORT 1" >>confdefs.h + + MAGICK_FEATURES="Zero-configuration $MAGICK_FEATURES" +fi + if test "$enable_zero_configuration" = yes; then + MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE= + MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_FALSE='#' +else + MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE='#' + MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_FALSE= +fi + + +# Build a high dynamic range version of ImageMagick. +# Check whether --enable-hdri was given. +if test "${enable_hdri+set}" = set; then : + enableval=$enable_hdri; enable_hdri=$enableval +else + enable_hdri='no' +fi + + +MAGICK_HDRI="" +if test "$enable_hdri" = 'yes'; then + MAGICK_HDRI="HDRI" + magick_hdri_enable='1'; + MAGICK_FEATURES="HDRI $MAGICK_FEATURES" +else + magick_hdri_enable='0' +fi + +cat >>confdefs.h <<_ACEOF +#define HDRI_ENABLE_OBSOLETE_IN_H $magick_hdri_enable +_ACEOF + +MAGICK_PCFLAGS="$MAGICK_PCFLAGS -DMAGICKCORE_HDRI_ENABLE=$magick_hdri_enable" +CFLAGS="$CFLAGS -DMAGICKCORE_HDRI_ENABLE=$magick_hdri_enable" +CPPFLAGS="$CPPFLAGS -DMAGICKCORE_HDRI_ENABLE=$magick_hdri_enable" + +# Enable pipes (|) in filenames. +# Check whether --enable-pipes was given. +if test "${enable_pipes+set}" = set; then : + enableval=$enable_pipes; enable_pipes=$enableval +else + enable_pipes='no' +fi + + +if test "$enable_pipes" = 'yes'; then + +$as_echo "#define PIPES_SUPPORT 1" >>confdefs.h + + MAGICK_FEATURES="Pipes $MAGICK_FEATURES" +fi + +# Don't emit "rebuild rules" for configure, Makefile.ins, etc. + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +# Enable hugepages support +# Check whether --enable-hugepages was given. +if test "${enable_hugepages+set}" = set; then : + enableval=$enable_hugepages; enable_hugepages=$enableval +else + enable_hugepages='no' +fi + + +# Enable ccmalloc memory debugging support +# Check whether --enable-ccmalloc was given. +if test "${enable_ccmalloc+set}" = set; then : + enableval=$enable_ccmalloc; enable_ccmalloc=$enableval +else + enable_ccmalloc='no' +fi + + +# Enable Electric Fence memory debugging support +# Check whether --enable-efence was given. +if test "${enable_efence+set}" = set; then : + enableval=$enable_efence; enable_efence=$enableval +else + enable_efence='no' +fi + + +# Enable prof-based profiling support +# Check whether --enable-prof was given. +if test "${enable_prof+set}" = set; then : + enableval=$enable_prof; enable_prof=$enableval +else + enable_prof='no' +fi + + +# Enable gprof-based profiling support +# Check whether --enable-gprof was given. +if test "${enable_gprof+set}" = set; then : + enableval=$enable_gprof; enable_gprof=$enableval +else + enable_gprof='no' +fi + + +# Enable gcov-based profiling support +# Check whether --enable-gcov was given. +if test "${enable_gcov+set}" = set; then : + enableval=$enable_gcov; enable_gcov=$enableval +else + enable_gcov='no' +fi + + +enable_profiling='no' +if test "$enable_prof" = 'yes' || test "$enable_gprof" = 'yes' || test "$enable_gcov" = 'yes'; then + enable_profiling='yes' + if test "$libtool_build_shared_libs" = 'yes'; then + echo "Warning: Can not profile code using shared libraries" + fi +fi + +# Magick API method prefix + +# Check whether --with-method-prefix was given. +if test "${with_method_prefix+set}" = set; then : + withval=$with_method_prefix; with_method_prefix=$withval +else + with_method_prefix='no' +fi + + +if test "$with_method_prefix" != 'no'; then + +cat >>confdefs.h <<_ACEOF +#define NAMESPACE_PREFIX $with_method_prefix +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define NAMESPACE_PREFIX_TAG $with_method_prefix +_ACEOF + + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-method-prefix " +fi + +# Enable legacy support (default no) +# Check whether --enable-legacy-support was given. +if test "${enable_legacy_support+set}" = set; then : + enableval=$enable_legacy_support; with_legacy_support=$enableval +else + with_legacy_support='no' +fi + + if test "$with_legacy_support" != 'no'; then + LEGACY_SUPPORT_TRUE= + LEGACY_SUPPORT_FALSE='#' +else + LEGACY_SUPPORT_TRUE='#' + LEGACY_SUPPORT_FALSE= +fi + + +# Number of bits in a Quantum + +# Check whether --with-quantum-depth was given. +if test "${with_quantum_depth+set}" = set; then : + withval=$with_quantum_depth; with_quantum_depth=$withval +else + with_quantum_depth=16 +fi + + +if test "$with_quantum_depth" != '8'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-quantum-depth=$with_quantum_depth " +fi + +case "${with_quantum_depth}" in + 8 ) ;; + 16 ) ;; + 32 ) ;; + 64 ) ;; + * ) as_fn_error 16 "\"Pixel quantum depth must have value of 8" "$LINENO" 5 ;; +esac +QUANTUM_DEPTH="$with_quantum_depth" + +cat >>confdefs.h <<_ACEOF +#define QUANTUM_DEPTH_OBSOLETE_IN_H $QUANTUM_DEPTH +_ACEOF + +MAGICK_PCFLAGS="$MAGICK_PCFLAGS -DMAGICKCORE_QUANTUM_DEPTH=$QUANTUM_DEPTH" +CFLAGS="$CFLAGS -DMAGICKCORE_QUANTUM_DEPTH=$QUANTUM_DEPTH" +CPPFLAGS="$CPPFLAGS -DMAGICKCORE_QUANTUM_DEPTH=$QUANTUM_DEPTH" + +# define a lib suffix for abi purpose +MAGICK_ABI_SUFFIX="Q${QUANTUM_DEPTH}" +if test "$enable_hdri" = 'yes'; then + MAGICK_ABI_SUFFIX="Q${QUANTUM_DEPTH}${MAGICK_HDRI}" +fi + + +# Set pixel cache threshold + +# Check whether --with-cache was given. +if test "${with_cache+set}" = set; then : + withval=$with_cache; with_cache=$withval +else + with_cache='' +fi + + +if test "$with_cache" != ''; then + +cat >>confdefs.h <<_ACEOF +#define PixelCacheThreshold "$with_cache" +_ACEOF + + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-cache=$with_cache " +fi + +# Disable/Enable support for full delegate paths + +# Check whether --with-frozenpaths was given. +if test "${with_frozenpaths+set}" = set; then : + withval=$with_frozenpaths; with_frozenpaths=$withval +else + with_frozenpaths='no' +fi + + +# Enable build/install of Magick++ + +# Check whether --with-magick-plus-plus was given. +if test "${with_magick_plus_plus+set}" = set; then : + withval=$with_magick_plus_plus; with_magick_plus_plus=$withval +else + with_magick_plus_plus='yes' +fi + + +# Encode the this name into the shared library. + +# Check whether --with-package-release-name was given. +if test "${with_package_release_name+set}" = set; then : + withval=$with_package_release_name; MAGICK_LT_RELEASE_OPTS="-release $withval" +fi + + + +# Disable build/install of PerlMagick. + +# Check whether --with-perl was given. +if test "${with_perl+set}" = set; then : + withval=$with_perl; with_perl=$withval +else + with_perl='no' +fi + + +# Options to pass when configuring PerlMagick + +# Check whether --with-perl-options was given. +if test "${with_perl_options+set}" = set; then : + withval=$with_perl_options; PERL_MAKE_OPTIONS=$withval +fi + + + +# Enable jemalloc, object-caching memory allocation library. + +# Check whether --with-jemalloc was given. +if test "${with_jemalloc+set}" = set; then : + withval=$with_jemalloc; with_jemalloc=$withval +else + with_jemalloc='no' +fi + +if test "$with_jemalloc" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-jemalloc=$with_jemalloc " +fi + +# Enable use of TCMalloc library. + +# Check whether --with-tcmalloc was given. +if test "${with_tcmalloc+set}" = set; then : + withval=$with_tcmalloc; with_tcmalloc=$withval +else + with_tcmalloc='no' +fi + +if test "$with_tcmalloc" != 'no' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-tcmalloc=$with_tcmalloc " +fi + +# Enable umem, object-caching memory allocation library. + +# Check whether --with-umem was given. +if test "${with_umem+set}" = set; then : + withval=$with_umem; with_umem=$withval +else + with_umem='no' +fi + +if test "$with_umem" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-umem=$with_umem " +fi + +# +# Specify path to shared libstdc++ if not in normal location +# + +# Check whether --with-libstdc was given. +if test "${with_libstdc+set}" = set; then : + withval=$with_libstdc; with_libstdc=$withval +else + with_libstdc='' +fi + + +if test "$with_libstdc" != ''; then + if test -d "$with_libstdc"; then + LIBSTDCLDFLAGS="-L$with_libstdc" + fi +fi + + +# Does gcc required -traditional? +if test $ac_cv_c_compiler_gnu = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 +$as_echo_n "checking whether $CC needs -traditional... " >&6; } +if ${ac_cv_prog_gcc_traditional+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_pattern="Autoconf.*'x'" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +Autoconf TIOCGETP +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then : + ac_cv_prog_gcc_traditional=yes +else + ac_cv_prog_gcc_traditional=no +fi +rm -f conftest* + + + if test $ac_cv_prog_gcc_traditional = no; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +Autoconf TCGETA +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then : + ac_cv_prog_gcc_traditional=yes +fi +rm -f conftest* + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 +$as_echo "$ac_cv_prog_gcc_traditional" >&6; } + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + + +######## +# +# Set defines required to build DLLs and modules using MinGW +# +######## +# These options are set for multi-thread DLL module build +# libMagickCore: _DLL _MAGICKMOD_ _MAGICKLIB_ +# module: _DLL +# executable/Magick++: _DLL _MAGICKMOD_ +MODULE_EXTRA_CPPFLAGS='' +LIBRARY_EXTRA_CPPFLAGS='' +if test "${native_win32_build}" = 'yes'; then + if test "${libtool_build_shared_libs}" = 'yes'; then + CPPFLAGS="$CPPFLAGS -D_DLL" + MAGICK_CPPFLAGS="$MAGICK_CPPFLAGS -D_DLL" + MAGICK_PCFLAGS="$MAGICK_PCFLAGS -D_DLL" + LIBRARY_EXTRA_CPPFLAGS="$LIBRARY_EXTRA_CPPFLAGS -D_MAGICKLIB_" + if test "$build_modules" = 'yes'; then + LIBRARY_EXTRA_CPPFLAGS="$LIBRARY_EXTRA_CPPFLAGS -D_MAGICKMOD_" + else + MODULE_EXTRA_CPPFLAGS="$MODULE_EXTRA_CPPFLAGS -D_MAGICKLIB_" + fi + else + CPPFLAGS="$CPPFLAGS -D_LIB" + MAGICK_CPPFLAGS="$MAGICK_CPPFLAGS -D_LIB" + MAGICK_PCFLAGS="$MAGICK_PCFLAGS -D_LIB" + fi + if test "$with_threads" = 'yes'; then + CPPFLAGS="$CPPFLAGS -D_MT" + MAGICK_CPPFLAGS="$MAGICK_CPPFLAGS -D_MT" + MAGICK_PCFLAGS="$MAGICK_PCFLAGS -D_MT" + fi +fi + + + +# Check standard headers +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +if ! test x"$ac_cv_header_stdc" = x"yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: configure has detected that you do not have the ANSI standard C + header files. Compilation cannot proceed. Please install the ANSI C + headers and rerun this script." >&5 +$as_echo "$as_me: WARNING: configure has detected that you do not have the ANSI standard C + header files. Compilation cannot proceed. Please install the ANSI C + headers and rerun this script." >&2;}; +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable assertions" >&5 +$as_echo_n "checking whether to enable assertions... " >&6; } + # Check whether --enable-assert was given. +if test "${enable_assert+set}" = set; then : + enableval=$enable_assert; ac_enable_assert=$enableval + if test "x$enableval" = xno; then : + +$as_echo "#define NDEBUG 1" >>confdefs.h + +elif test "x$enableval" != xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-assert" >&5 +$as_echo "$as_me: WARNING: invalid argument supplied to --enable-assert" >&2;} + ac_enable_assert=yes +fi +else + ac_enable_assert=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_enable_assert" >&5 +$as_echo "$ac_enable_assert" >&6; } + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } +if eval \${$as_ac_Header+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include <$ac_hdr> + +int +main () +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_ac_Header=yes" +else + eval "$as_ac_Header=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if ${ac_cv_search_opendir+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dir; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_opendir+:} false; then : + break +fi +done +if ${ac_cv_search_opendir+:} false; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if ${ac_cv_search_opendir+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' x; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_opendir+:} false; then : + break +fi +done +if ${ac_cv_search_opendir+:} false; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi + + +# Check additional headers +for ac_header in arm/limits.h arpa/inet.h complex.h errno.h fcntl.h float.h limits.h linux/unistd.h locale.h malloc.h machine/param.h mach-o/dyld.h netdb.h netinet/in.h OS.h process.h stddef.h sun_prefetch.h stdarg.h sys/ipc.h sys/mman.h sys/resource.h sys/sendfile.h sys/socket.h sys/syslimits.h sys/time.h sys/times.h sys/uio.h sys/wait.h utime.h wchar.h xlocale.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +######## +# +# Checks for typedefs, structures, and compiler characteristics. +# +######## + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 +$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } +if ${ac_cv_header_stdbool_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #ifndef bool + "error: bool is not defined" + #endif + #ifndef false + "error: false is not defined" + #endif + #if false + "error: false is not 0" + #endif + #ifndef true + "error: true is not defined" + #endif + #if true != 1 + "error: true is not 1" + #endif + #ifndef __bool_true_false_are_defined + "error: __bool_true_false_are_defined is not defined" + #endif + + struct s { _Bool s: 1; _Bool t; } s; + + char a[true == 1 ? 1 : -1]; + char b[false == 0 ? 1 : -1]; + char c[__bool_true_false_are_defined == 1 ? 1 : -1]; + char d[(bool) 0.5 == true ? 1 : -1]; + /* See body of main program for 'e'. */ + char f[(_Bool) 0.0 == false ? 1 : -1]; + char g[true]; + char h[sizeof (_Bool)]; + char i[sizeof s.t]; + enum { j = false, k = true, l = false * true, m = true * 256 }; + /* The following fails for + HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ + _Bool n[m]; + char o[sizeof n == m * sizeof n[0] ? 1 : -1]; + char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; + /* Catch a bug in an HP-UX C compiler. See + http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html + http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html + */ + _Bool q = true; + _Bool *pq = &q; + +int +main () +{ + + bool e = &s; + *pq |= q; + *pq |= ! q; + /* Refer to every declared value, to avoid compiler optimizations. */ + return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + + !m + !n + !o + !p + !q + !pq); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdbool_h=yes +else + ac_cv_header_stdbool_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 +$as_echo "$ac_cv_header_stdbool_h" >&6; } + ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" +if test "x$ac_cv_type__Bool" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE__BOOL 1 +_ACEOF + + +fi + + +if test $ac_cv_header_stdbool_h = yes; then + +$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 +$as_echo_n "checking for working volatile... " >&6; } +if ${ac_cv_c_volatile+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +volatile int x; +int * volatile y = (int *) 0; +return !x && !y; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_volatile=yes +else + ac_cv_c_volatile=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 +$as_echo "$ac_cv_c_volatile" >&6; } +if test $ac_cv_c_volatile = no; then + +$as_echo "#define volatile /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for preprocessor stringizing operator" >&5 +$as_echo_n "checking for preprocessor stringizing operator... " >&6; } +if ${ac_cv_c_stringize+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define x(y) #y + +char *s = x(teststring); +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "#teststring" >/dev/null 2>&1; then : + ac_cv_c_stringize=no +else + ac_cv_c_stringize=yes +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stringize" >&5 +$as_echo "$ac_cv_c_stringize" >&6; } +if test $ac_cv_c_stringize = yes; then + +$as_echo "#define HAVE_STRINGIZE 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5 +$as_echo_n "checking whether stat file-mode macros are broken... " >&6; } +if ${ac_cv_header_stat_broken+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +#if defined S_ISBLK && defined S_IFDIR +extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; +#endif + +#if defined S_ISBLK && defined S_IFCHR +extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; +#endif + +#if defined S_ISLNK && defined S_IFREG +extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; +#endif + +#if defined S_ISSOCK && defined S_IFREG +extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stat_broken=no +else + ac_cv_header_stat_broken=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5 +$as_echo "$ac_cv_header_stat_broken" >&6; } +if test $ac_cv_header_stat_broken = yes; then + +$as_echo "#define STAT_MACROS_BROKEN 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 +$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } +if ${ac_cv_struct_tm+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +int +main () +{ +struct tm tm; + int *p = &tm.tm_sec; + return !p; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_struct_tm=time.h +else + ac_cv_struct_tm=sys/time.h +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 +$as_echo "$ac_cv_struct_tm" >&6; } +if test $ac_cv_struct_tm = sys/time.h; then + +$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h + +fi + +ac_fn_c_check_member "$LINENO" "struct tm" "tm_zone" "ac_cv_member_struct_tm_tm_zone" "#include +#include <$ac_cv_struct_tm> + +" +if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_TM_TM_ZONE 1 +_ACEOF + + +fi + +if test "$ac_cv_member_struct_tm_tm_zone" = yes; then + +$as_echo "#define HAVE_TM_ZONE 1" >>confdefs.h + +else + ac_fn_c_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include +" +if test "x$ac_cv_have_decl_tzname" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_TZNAME $ac_have_decl +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5 +$as_echo_n "checking for tzname... " >&6; } +if ${ac_cv_var_tzname+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#if !HAVE_DECL_TZNAME +extern char *tzname[]; +#endif + +int +main () +{ +return tzname[0][0]; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_var_tzname=yes +else + ac_cv_var_tzname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_tzname" >&5 +$as_echo "$ac_cv_var_tzname" >&6; } + if test $ac_cv_var_tzname = yes; then + +$as_echo "#define HAVE_TZNAME 1" >>confdefs.h + + fi +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether #! works in shell scripts" >&5 +$as_echo_n "checking whether #! works in shell scripts... " >&6; } +if ${ac_cv_sys_interpreter+:} false; then : + $as_echo_n "(cached) " >&6 +else + echo '#! /bin/cat +exit 69 +' >conftest +chmod u+x conftest +(SHELL=/bin/sh; export SHELL; ./conftest >/dev/null 2>&1) +if test $? -ne 69; then + ac_cv_sys_interpreter=yes +else + ac_cv_sys_interpreter=no +fi +rm -f conftest +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_interpreter" >&5 +$as_echo "$ac_cv_sys_interpreter" >&6; } +interpval=$ac_cv_sys_interpreter + + +# +# Checks for language qualifiers and semantics. +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5 +$as_echo_n "checking whether char is unsigned... " >&6; } +if ${ac_cv_c_char_unsigned+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((char) -1) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_char_unsigned=no +else + ac_cv_c_char_unsigned=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5 +$as_echo "$ac_cv_c_char_unsigned" >&6; } +if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then + $as_echo "#define __CHAR_UNSIGNED__ 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 +$as_echo_n "checking for C/C++ restrict keyword... " >&6; } +if ${ac_cv_c_restrict+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_restrict=no + # The order here caters to the fact that C++ does not require restrict. + for ac_kw in __restrict __restrict__ _Restrict restrict; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +typedef int * int_ptr; + int foo (int_ptr $ac_kw ip) { + return ip[0]; + } +int +main () +{ +int s[1]; + int * $ac_kw t = s; + t[0] = 0; + return foo(t) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_restrict=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_restrict" != no && break + done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 +$as_echo "$ac_cv_c_restrict" >&6; } + + case $ac_cv_c_restrict in + restrict) ;; + no) $as_echo "#define restrict /**/" >>confdefs.h + ;; + *) cat >>confdefs.h <<_ACEOF +#define restrict $ac_cv_c_restrict +_ACEOF + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 +$as_echo_n "checking for working volatile... " >&6; } +if ${ac_cv_c_volatile+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +volatile int x; +int * volatile y = (int *) 0; +return !x && !y; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_volatile=yes +else + ac_cv_c_volatile=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 +$as_echo "$ac_cv_c_volatile" >&6; } +if test $ac_cv_c_volatile = no; then + +$as_echo "#define volatile /**/" >>confdefs.h + +fi + + +# If words are stored with the most significant byte first (like +# Motorola and SPARC CPUs), define `WORDS_BIGENDIAN'. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + +# Define to a suitable type, if standard headers do not define it. +ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t" +case $ac_cv_c_int8_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int8_t $ac_cv_c_int8_t +_ACEOF +;; +esac + +ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" +case $ac_cv_c_int16_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int16_t $ac_cv_c_int16_t +_ACEOF +;; +esac + +ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" +case $ac_cv_c_int32_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int32_t $ac_cv_c_int32_t +_ACEOF +;; +esac + +ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" +case $ac_cv_c_int64_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int64_t $ac_cv_c_int64_t +_ACEOF +;; +esac + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5 +$as_echo_n "checking for unsigned long long int... " >&6; } +if ${ac_cv_type_unsigned_long_long_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_type_unsigned_long_long_int=yes + if test "x${ac_cv_prog_cc_c99-no}" = xno; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + /* For now, do not test the preprocessor; as of 2007 there are too many + implementations with broken preprocessors. Perhaps this can + be revisited in 2012. In the meantime, code should not expect + #if to work with literals wider than 32 bits. */ + /* Test literals. */ + long long int ll = 9223372036854775807ll; + long long int nll = -9223372036854775807LL; + unsigned long long int ull = 18446744073709551615ULL; + /* Test constant expressions. */ + typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) + ? 1 : -1)]; + typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 + ? 1 : -1)]; + int i = 63; +int +main () +{ +/* Test availability of runtime routines for shift and division. */ + long long int llmax = 9223372036854775807ll; + unsigned long long int ullmax = 18446744073709551615ull; + return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) + | (llmax / ll) | (llmax % ll) + | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) + | (ullmax / ull) | (ullmax % ull)); + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + ac_cv_type_unsigned_long_long_int=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5 +$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; } + if test $ac_cv_type_unsigned_long_long_int = yes; then + +$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h + + fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 +$as_echo_n "checking for long long int... " >&6; } +if ${ac_cv_type_long_long_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_type_long_long_int=yes + if test "x${ac_cv_prog_cc_c99-no}" = xno; then + ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int + if test $ac_cv_type_long_long_int = yes; then + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #ifndef LLONG_MAX + # define HALF \ + (1LL << (sizeof (long long int) * CHAR_BIT - 2)) + # define LLONG_MAX (HALF - 1 + HALF) + #endif +int +main () +{ +long long int n = 1; + int i; + for (i = 0; ; i++) + { + long long int m = n << i; + if (m >> i != n) + return 1; + if (LLONG_MAX / 2 < m) + break; + } + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_type_long_long_int=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5 +$as_echo "$ac_cv_type_long_long_int" >&6; } + if test $ac_cv_type_long_long_int = yes; then + +$as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h + + fi + + + + ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "$ac_includes_default" +if test "x$ac_cv_type_intmax_t" = xyes; then : + +$as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h + +else + test $ac_cv_type_long_long_int = yes \ + && ac_type='long long int' \ + || ac_type='long int' + +cat >>confdefs.h <<_ACEOF +#define intmax_t $ac_type +_ACEOF + +fi + + + + ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default" +if test "x$ac_cv_type_intptr_t" = xyes; then : + +$as_echo "#define HAVE_INTPTR_T 1" >>confdefs.h + +else + for ac_type in 'int' 'long int' 'long long int'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +cat >>confdefs.h <<_ACEOF +#define intptr_t $ac_type +_ACEOF + + ac_type= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test -z "$ac_type" && break + done +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5 +$as_echo_n "checking for mbstate_t... " >&6; } +if ${ac_cv_type_mbstate_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +# include +int +main () +{ +mbstate_t x; return sizeof x; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_type_mbstate_t=yes +else + ac_cv_type_mbstate_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5 +$as_echo "$ac_cv_type_mbstate_t" >&6; } + if test $ac_cv_type_mbstate_t = yes; then + +$as_echo "#define HAVE_MBSTATE_T 1" >>confdefs.h + + else + +$as_echo "#define mbstate_t int" >>confdefs.h + + fi +ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" +if test "x$ac_cv_type_mode_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define mode_t int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" +if test "x$ac_cv_type_off_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define off_t long int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" +if test "x$ac_cv_type_pid_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define pid_t int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" +if test "x$ac_cv_type_ssize_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define ssize_t int +_ACEOF + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 +$as_echo_n "checking for uid_t in sys/types.h... " >&6; } +if ${ac_cv_type_uid_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "uid_t" >/dev/null 2>&1; then : + ac_cv_type_uid_t=yes +else + ac_cv_type_uid_t=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 +$as_echo "$ac_cv_type_uid_t" >&6; } +if test $ac_cv_type_uid_t = no; then + +$as_echo "#define uid_t int" >>confdefs.h + + +$as_echo "#define gid_t int" >>confdefs.h + +fi + +ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" +case $ac_cv_c_uint8_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT8_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint8_t $ac_cv_c_uint8_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" +case $ac_cv_c_uint16_t in #( + no|yes) ;; #( + *) + + +cat >>confdefs.h <<_ACEOF +#define uint16_t $ac_cv_c_uint16_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" +case $ac_cv_c_uint32_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT32_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint32_t $ac_cv_c_uint32_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" +case $ac_cv_c_uint64_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT64_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint64_t $ac_cv_c_uint64_t +_ACEOF +;; + esac + + + + ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "$ac_includes_default" +if test "x$ac_cv_type_uintmax_t" = xyes; then : + +$as_echo "#define HAVE_UINTMAX_T 1" >>confdefs.h + +else + test $ac_cv_type_unsigned_long_long_int = yes \ + && ac_type='unsigned long long int' \ + || ac_type='unsigned long int' + +cat >>confdefs.h <<_ACEOF +#define uintmax_t $ac_type +_ACEOF + +fi + + + + ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" +if test "x$ac_cv_type_uintptr_t" = xyes; then : + +$as_echo "#define HAVE_UINTPTR_T 1" >>confdefs.h + +else + for ac_type in 'unsigned int' 'unsigned long int' \ + 'unsigned long long int'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +cat >>confdefs.h <<_ACEOF +#define uintptr_t $ac_type +_ACEOF + + ac_type= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test -z "$ac_type" && break + done +fi + + + +# Float_t and double_t are intended to be the the most efficient type. +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float_t" >&5 +$as_echo_n "checking size of float_t... " >&6; } +if ${ac_cv_sizeof_float_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float_t))" "ac_cv_sizeof_float_t" "#include +"; then : + +else + if test "$ac_cv_type_float_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (float_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_float_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float_t" >&5 +$as_echo "$ac_cv_sizeof_float_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_FLOAT_T $ac_cv_sizeof_float_t +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double_t" >&5 +$as_echo_n "checking size of double_t... " >&6; } +if ${ac_cv_sizeof_double_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double_t))" "ac_cv_sizeof_double_t" "#include +"; then : + +else + if test "$ac_cv_type_double_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (double_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_double_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double_t" >&5 +$as_echo "$ac_cv_sizeof_double_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_DOUBLE_T $ac_cv_sizeof_double_t +_ACEOF + + + +# Get size of float, double and long double for comparaison. +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 +$as_echo_n "checking size of float... " >&6; } +if ${ac_cv_sizeof_float+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_float" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (float) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_float=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5 +$as_echo "$ac_cv_sizeof_float" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_FLOAT $ac_cv_sizeof_float +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 +$as_echo_n "checking size of double... " >&6; } +if ${ac_cv_sizeof_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (double) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_double=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 +$as_echo "$ac_cv_sizeof_double" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_DOUBLE $ac_cv_sizeof_double +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 +$as_echo_n "checking size of long double... " >&6; } +if ${ac_cv_sizeof_long_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long double) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_double=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5 +$as_echo "$ac_cv_sizeof_long_double" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double +_ACEOF + + + +# Obtain size of a 'unsigned long long' and define as +# SIZEOF_UNSIGNED_LONG_LONG. If 'unsigned long long' is not +# supported then the value defined is zero. +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long long" >&5 +$as_echo_n "checking size of unsigned long long... " >&6; } +if ${ac_cv_sizeof_unsigned_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long long))" "ac_cv_sizeof_unsigned_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (unsigned long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_unsigned_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_long" >&5 +$as_echo "$ac_cv_sizeof_unsigned_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long +_ACEOF + + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 +$as_echo_n "checking size of void *... " >&6; } +if ${ac_cv_sizeof_void_p+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_void_p" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (void *) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_void_p=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 +$as_echo "$ac_cv_sizeof_void_p" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOID_P $ac_cv_sizeof_void_p +_ACEOF + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether our compiler supports __func__" >&5 +$as_echo_n "checking whether our compiler supports __func__... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +{ const char *func = __func__; return(func != 0 ? 0 : 1); } + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether our compiler supports __FUNCTION__" >&5 +$as_echo_n "checking whether our compiler supports __FUNCTION__... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +{ const char *func = __FUNCTION__; return(func != 0 ? 0 : 1); } + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define __func__ __FUNCTION__" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define __func__ __FILE__" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +######## +# +# Check for functions +# +######## +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 +$as_echo_n "checking whether closedir returns void... " >&6; } +if ${ac_cv_func_closedir_void+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_closedir_void=yes +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header_dirent> +#ifndef __cplusplus +int closedir (); +#endif + +int +main () +{ +return closedir (opendir (".")) != 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_closedir_void=no +else + ac_cv_func_closedir_void=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 +$as_echo "$ac_cv_func_closedir_void" >&6; } +if test $ac_cv_func_closedir_void = yes; then + +$as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h + +fi + + + + + for ac_header in $ac_header_list +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + + + +for ac_func in getpagesize +do : + ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" +if test "x$ac_cv_func_getpagesize" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETPAGESIZE 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 +$as_echo_n "checking for working mmap... " >&6; } +if ${ac_cv_func_mmap_fixed_mapped+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_mmap_fixed_mapped=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +/* malloc might have been renamed as rpl_malloc. */ +#undef malloc + +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the file system buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propagated back to all the places they're supposed to be. + + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ + +#include +#include + +#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H +char *malloc (); +#endif + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +int +main () +{ + char *data, *data2, *data3; + const char *cdata2; + int i, pagesize; + int fd, fd2; + + pagesize = getpagesize (); + + /* First, make a file with some known garbage in it. */ + data = (char *) malloc (pagesize); + if (!data) + return 1; + for (i = 0; i < pagesize; ++i) + *(data + i) = rand (); + umask (0); + fd = creat ("conftest.mmap", 0600); + if (fd < 0) + return 2; + if (write (fd, data, pagesize) != pagesize) + return 3; + close (fd); + + /* Next, check that the tail of a page is zero-filled. File must have + non-zero length, otherwise we risk SIGBUS for entire page. */ + fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); + if (fd2 < 0) + return 4; + cdata2 = ""; + if (write (fd2, cdata2, 1) != 1) + return 5; + data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); + if (data2 == MAP_FAILED) + return 6; + for (i = 0; i < pagesize; ++i) + if (*(data2 + i)) + return 7; + close (fd2); + if (munmap (data2, pagesize)) + return 8; + + /* Next, try to mmap the file at a fixed address which already has + something else allocated at it. If we can, also make sure that + we see the same garbage. */ + fd = open ("conftest.mmap", O_RDWR); + if (fd < 0) + return 9; + if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + return 10; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + return 11; + + /* Finally, make sure that changes to the mapped area do not + percolate back to the file as seen by read(). (This is a bug on + some variants of i386 svr4.0.) */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = (char *) malloc (pagesize); + if (!data3) + return 12; + if (read (fd, data3, pagesize) != pagesize) + return 13; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + return 14; + close (fd); + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_mmap_fixed_mapped=yes +else + ac_cv_func_mmap_fixed_mapped=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 +$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } +if test $ac_cv_func_mmap_fixed_mapped = yes; then + +$as_echo "#define HAVE_MMAP 1" >>confdefs.h + +fi +rm -f conftest.mmap conftest.txt + +for ac_header in vfork.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" +if test "x$ac_cv_header_vfork_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VFORK_H 1 +_ACEOF + +fi + +done + +for ac_func in fork vfork +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +if test "x$ac_cv_func_fork" = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 +$as_echo_n "checking for working fork... " >&6; } +if ${ac_cv_func_fork_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_fork_works=cross +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* By Ruediger Kuhlmann. */ + return fork () < 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_fork_works=yes +else + ac_cv_func_fork_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 +$as_echo "$ac_cv_func_fork_works" >&6; } + +else + ac_cv_func_fork_works=$ac_cv_func_fork +fi +if test "x$ac_cv_func_fork_works" = xcross; then + case $host in + *-*-amigaos* | *-*-msdosdjgpp*) + # Override, as these systems have only a dummy fork() stub + ac_cv_func_fork_works=no + ;; + *) + ac_cv_func_fork_works=yes + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 +$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} +fi +ac_cv_func_vfork_works=$ac_cv_func_vfork +if test "x$ac_cv_func_vfork" = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 +$as_echo_n "checking for working vfork... " >&6; } +if ${ac_cv_func_vfork_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_vfork_works=cross +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Thanks to Paul Eggert for this test. */ +$ac_includes_default +#include +#ifdef HAVE_VFORK_H +# include +#endif +/* On some sparc systems, changes by the child to local and incoming + argument registers are propagated back to the parent. The compiler + is told about this with #include , but some compilers + (e.g. gcc -O) don't grok . Test for this by using a + static variable whose address is put into a register that is + clobbered by the vfork. */ +static void +#ifdef __cplusplus +sparc_address_test (int arg) +# else +sparc_address_test (arg) int arg; +#endif +{ + static pid_t child; + if (!child) { + child = vfork (); + if (child < 0) { + perror ("vfork"); + _exit(2); + } + if (!child) { + arg = getpid(); + write(-1, "", 0); + _exit (arg); + } + } +} + +int +main () +{ + pid_t parent = getpid (); + pid_t child; + + sparc_address_test (0); + + child = vfork (); + + if (child == 0) { + /* Here is another test for sparc vfork register problems. This + test uses lots of local variables, at least as many local + variables as main has allocated so far including compiler + temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris + 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should + reuse the register of parent for one of the local variables, + since it will think that parent can't possibly be used any more + in this routine. Assigning to the local variable will thus + munge parent in the parent process. */ + pid_t + p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), + p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); + /* Convince the compiler that p..p7 are live; otherwise, it might + use the same hardware register for all 8 local variables. */ + if (p != p1 || p != p2 || p != p3 || p != p4 + || p != p5 || p != p6 || p != p7) + _exit(1); + + /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent + from child file descriptors. If the child closes a descriptor + before it execs or exits, this munges the parent's descriptor + as well. Test for this by closing stdout in the child. */ + _exit(close(fileno(stdout)) != 0); + } else { + int status; + struct stat st; + + while (wait(&status) != child) + ; + return ( + /* Was there some problem with vforking? */ + child < 0 + + /* Did the child fail? (This shouldn't happen.) */ + || status + + /* Did the vfork/compiler bug occur? */ + || parent != getpid() + + /* Did the file descriptor bug occur? */ + || fstat(fileno(stdout), &st) != 0 + ); + } +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_vfork_works=yes +else + ac_cv_func_vfork_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 +$as_echo "$ac_cv_func_vfork_works" >&6; } + +fi; +if test "x$ac_cv_func_fork_works" = xcross; then + ac_cv_func_vfork_works=$ac_cv_func_vfork + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 +$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} +fi + +if test "x$ac_cv_func_vfork_works" = xyes; then + +$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h + +else + +$as_echo "#define vfork fork" >>confdefs.h + +fi +if test "x$ac_cv_func_fork_works" = xyes; then + +$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h + +fi + +for ac_header in stdlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDLIB_H 1 +_ACEOF + +fi + +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 +$as_echo_n "checking for GNU libc compatible malloc... " >&6; } +if ${ac_cv_func_malloc_0_nonnull+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_malloc_0_nonnull=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined STDC_HEADERS || defined HAVE_STDLIB_H +# include +#else +char *malloc (); +#endif + +int +main () +{ +return ! malloc (0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_malloc_0_nonnull=yes +else + ac_cv_func_malloc_0_nonnull=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 +$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } +if test $ac_cv_func_malloc_0_nonnull = yes; then : + +$as_echo "#define HAVE_MALLOC 1" >>confdefs.h + +else + $as_echo "#define HAVE_MALLOC 0" >>confdefs.h + + case " $LIBOBJS " in + *" malloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS malloc.$ac_objext" + ;; +esac + + +$as_echo "#define malloc rpl_malloc" >>confdefs.h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 +$as_echo_n "checking for working memcmp... " >&6; } +if ${ac_cv_func_memcmp_working+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_memcmp_working=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Some versions of memcmp are not 8-bit clean. */ + char c0 = '\100', c1 = '\200', c2 = '\201'; + if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) + return 1; + + /* The Next x86 OpenStep bug shows up only when comparing 16 bytes + or more and with at least one buffer not starting on a 4-byte boundary. + William Lewis provided this test program. */ + { + char foo[21]; + char bar[21]; + int i; + for (i = 0; i < 4; i++) + { + char *a = foo + i; + char *b = bar + i; + strcpy (a, "--------01111111"); + strcpy (b, "--------10000000"); + if (memcmp (a, b, 16) >= 0) + return 1; + } + return 0; + } + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_memcmp_working=yes +else + ac_cv_func_memcmp_working=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 +$as_echo "$ac_cv_func_memcmp_working" >&6; } +test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in + *" memcmp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" + ;; +esac + + +for ac_header in stdlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDLIB_H 1 +_ACEOF + +fi + +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 +$as_echo_n "checking for GNU libc compatible realloc... " >&6; } +if ${ac_cv_func_realloc_0_nonnull+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_realloc_0_nonnull=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined STDC_HEADERS || defined HAVE_STDLIB_H +# include +#else +char *realloc (); +#endif + +int +main () +{ +return ! realloc (0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_realloc_0_nonnull=yes +else + ac_cv_func_realloc_0_nonnull=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 +$as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } +if test $ac_cv_func_realloc_0_nonnull = yes; then : + +$as_echo "#define HAVE_REALLOC 1" >>confdefs.h + +else + $as_echo "#define HAVE_REALLOC 0" >>confdefs.h + + case " $LIBOBJS " in + *" realloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS realloc.$ac_objext" + ;; +esac + + +$as_echo "#define realloc rpl_realloc" >>confdefs.h + +fi + + +for ac_header in sys/select.h sys/socket.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 +$as_echo_n "checking types of arguments for select... " >&6; } +if ${ac_cv_func_select_args+:} false; then : + $as_echo_n "(cached) " >&6 +else + for ac_arg234 in 'fd_set *' 'int *' 'void *'; do + for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do + for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +#ifdef HAVE_SYS_SELECT_H +# include +#endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif + +int +main () +{ +extern int select ($ac_arg1, + $ac_arg234, $ac_arg234, $ac_arg234, + $ac_arg5); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done + done +done +# Provide a safe default value. +: "${ac_cv_func_select_args=int,int *,struct timeval *}" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 +$as_echo "$ac_cv_func_select_args" >&6; } +ac_save_IFS=$IFS; IFS=',' +set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` +IFS=$ac_save_IFS +shift + +cat >>confdefs.h <<_ACEOF +#define SELECT_TYPE_ARG1 $1 +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SELECT_TYPE_ARG234 ($2) +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SELECT_TYPE_ARG5 ($3) +_ACEOF + +rm -f conftest* + +if ${ac_cv_func_setvbuf_reversed+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_func_setvbuf_reversed=no +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5 +$as_echo_n "checking for working strtod... " >&6; } +if ${ac_cv_func_strtod+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_strtod=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +$ac_includes_default +#ifndef strtod +double strtod (); +#endif +int +main() +{ + { + /* Some versions of Linux strtod mis-parse strings with leading '+'. */ + char *string = " +69"; + char *term; + double value; + value = strtod (string, &term); + if (value != 69 || term != (string + 4)) + return 1; + } + + { + /* Under Solaris 2.4, strtod returns the wrong value for the + terminating character under some conditions. */ + char *string = "NaN"; + char *term; + strtod (string, &term); + if (term != string && *(term - 1) == 0) + return 1; + } + return 0; +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_strtod=yes +else + ac_cv_func_strtod=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtod" >&5 +$as_echo "$ac_cv_func_strtod" >&6; } +if test $ac_cv_func_strtod = no; then + case " $LIBOBJS " in + *" strtod.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strtod.$ac_objext" + ;; +esac + +ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow" +if test "x$ac_cv_func_pow" = xyes; then : + +fi + +if test $ac_cv_func_pow = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5 +$as_echo_n "checking for pow in -lm... " >&6; } +if ${ac_cv_lib_m_pow+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pow (); +int +main () +{ +return pow (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_pow=yes +else + ac_cv_lib_m_pow=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5 +$as_echo "$ac_cv_lib_m_pow" >&6; } +if test "x$ac_cv_lib_m_pow" = xyes; then : + POW_LIB=-lm +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5 +$as_echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} +fi + +fi + +fi + +ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" +if test "x$ac_cv_have_decl_strerror_r" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRERROR_R $ac_have_decl +_ACEOF + +for ac_func in strerror_r +do : + ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" +if test "x$ac_cv_func_strerror_r" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRERROR_R 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5 +$as_echo_n "checking whether strerror_r returns char *... " >&6; } +if ${ac_cv_func_strerror_r_char_p+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ac_cv_func_strerror_r_char_p=no + if test $ac_cv_have_decl_strerror_r = yes; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + char buf[100]; + char x = *strerror_r (0, buf, sizeof buf); + char *p = strerror_r (0, buf, sizeof buf); + return !p || x; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_func_strerror_r_char_p=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + else + # strerror_r is not declared. Choose between + # systems that have relatively inaccessible declarations for the + # function. BeOS and DEC UNIX 4.0 fall in this category, but the + # former has a strerror_r that returns char*, while the latter + # has a strerror_r that returns `int'. + # This test should segfault on the DEC system. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + extern char *strerror_r (); +int +main () +{ +char buf[100]; + char x = *strerror_r (0, buf, sizeof buf); + return ! isalpha (x); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_strerror_r_char_p=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5 +$as_echo "$ac_cv_func_strerror_r_char_p" >&6; } +if test $ac_cv_func_strerror_r_char_p = yes; then + +$as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h + +fi + +for ac_func in vprintf +do : + ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" +if test "x$ac_cv_func_vprintf" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VPRINTF 1 +_ACEOF + +ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" +if test "x$ac_cv_func__doprnt" = xyes; then : + +$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h + +fi + +fi +done + + + +# +# Find math library +# +MATH_LIBS='' +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrt in -lm" >&5 +$as_echo_n "checking for sqrt in -lm... " >&6; } +if ${ac_cv_lib_m_sqrt+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sqrt (); +int +main () +{ +return sqrt (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_sqrt=yes +else + ac_cv_lib_m_sqrt=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sqrt" >&5 +$as_echo "$ac_cv_lib_m_sqrt" >&6; } +if test "x$ac_cv_lib_m_sqrt" = xyes; then : + MATH_LIBS="-lm" +fi + +LIBS="$MATH_LIBS $LIBS" + + +# +# Find socket library +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 +$as_echo_n "checking for library containing gethostbyname... " >&6; } +if ${ac_cv_search_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv nsl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_gethostbyname=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_gethostbyname+:} false; then : + break +fi +done +if ${ac_cv_search_gethostbyname+:} false; then : + +else + ac_cv_search_gethostbyname=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 +$as_echo "$ac_cv_search_gethostbyname" >&6; } +ac_res=$ac_cv_search_gethostbyname +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +$as_echo_n "checking for library containing socket... " >&6; } +if ${ac_cv_search_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +for ac_lib in '' socket; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_socket=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_socket+:} false; then : + break +fi +done +if ${ac_cv_search_socket+:} false; then : + +else + ac_cv_search_socket=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +$as_echo "$ac_cv_search_socket" >&6; } +ac_res=$ac_cv_search_socket +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + + +$as_echo "#define HAVE_SOCKET 1" >>confdefs.h + + MAGICK_FEATURES="DPC $MAGICK_FEATURES" + +fi + + +# +# Check for clock_gettime(). +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 +$as_echo_n "checking for library containing clock_gettime... " >&6; } +if ${ac_cv_search_clock_gettime+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (); +int +main () +{ +return clock_gettime (); + ; + return 0; +} +_ACEOF +for ac_lib in '' rt; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_clock_gettime=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_clock_gettime+:} false; then : + break +fi +done +if ${ac_cv_search_clock_gettime+:} false; then : + +else + ac_cv_search_clock_gettime=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 +$as_echo "$ac_cv_search_clock_gettime" >&6; } +ac_res=$ac_cv_search_clock_gettime +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + + +$as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether clock_gettime supports CLOCK_REALTIME" >&5 +$as_echo_n "checking whether clock_gettime supports CLOCK_REALTIME... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include +int +main () +{ +clockid_t clockType = CLOCK_REALTIME; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define HAVE_CLOCK_REALTIME 1" >>confdefs.h + + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +else + + for ac_func in gettimeofday ftime +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + break +fi +done + + + +fi + + +######## +# +# Check for function prototypes +# +######## + +ac_fn_c_check_decl "$LINENO" "pread" "ac_cv_have_decl_pread" " +#include +" +if test "x$ac_cv_have_decl_pread" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PREAD $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "pwrite" "ac_cv_have_decl_pwrite" " +#include +" +if test "x$ac_cv_have_decl_pwrite" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PWRITE $ac_have_decl +_ACEOF + + +ac_fn_c_check_decl "$LINENO" "strlcpy" "ac_cv_have_decl_strlcpy" " +#include +" +if test "x$ac_cv_have_decl_strlcpy" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRLCPY $ac_have_decl +_ACEOF + + +ac_fn_c_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" " +#include +#include +" +if test "x$ac_cv_have_decl_vsnprintf" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VSNPRINTF $ac_have_decl +_ACEOF + + +######## +# +# C++ Support Tests (For Magick++) +# +######## +have_magick_plus_plus='no' +if test "$with_magick_plus_plus" = 'yes'; then + OLIBS="$LIBS" + LIBS='' + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + # Full set of headers used... + # algorithm cctype cerrno cmath cstdio cstdlib cstring ctime exception + # functional iomanip iosfwd iostream iterator list string strstream utility + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler recognizes bool as a built-in type" >&5 +$as_echo_n "checking whether the compiler recognizes bool as a built-in type... " >&6; } +if ${ax_cv_cxx_bool+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + int f(int x){return 1;} + int f(char x){return 1;} + int f(bool x){return 1;} +int +main () +{ +bool b = true; return f(b); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_cxx_bool=yes +else + ax_cv_cxx_bool=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_bool" >&5 +$as_echo "$ax_cv_cxx_bool" >&6; } + if test "X$ax_cv_cxx_bool" = Xyes; then : + +$as_echo "#define HAVE_BOOL /**/" >>confdefs.h + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler implements namespaces" >&5 +$as_echo_n "checking whether the compiler implements namespaces... " >&6; } +if ${ax_cv_cxx_namespaces+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +namespace Outer { namespace Inner { int i = 0; }} + using namespace Outer::Inner; int foo(void) { return i;} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_cxx_namespaces=yes +else + ax_cv_cxx_namespaces=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_namespaces" >&5 +$as_echo "$ax_cv_cxx_namespaces" >&6; } +if test "$ax_cv_cxx_namespaces" = yes; then + +$as_echo "#define HAVE_NAMESPACES /**/" >>confdefs.h + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if g++ supports namespace std" >&5 +$as_echo_n "checking if g++ supports namespace std... " >&6; } +if ${ax_cv_cxx_have_std_namespace+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + std::istream& is = std::cin; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_cxx_have_std_namespace=yes +else + ax_cv_cxx_have_std_namespace=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_have_std_namespace" >&5 +$as_echo "$ax_cv_cxx_have_std_namespace" >&6; } + if test "$ax_cv_cxx_have_std_namespace" = yes; then + +$as_echo "#define HAVE_NAMESPACE_STD /**/" >>confdefs.h + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports ISO C++ standard library" >&5 +$as_echo_n "checking whether the compiler supports ISO C++ standard library... " >&6; } +if ${ac_cv_cxx_have_std_libs+:} false; then : + $as_echo_n "(cached) " >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#ifdef HAVE_NAMESPACES +using namespace std; +#endif +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_cxx_have_std_libs=yes +else + ac_cv_cxx_have_std_libs=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_have_std_libs" >&5 +$as_echo "$ac_cv_cxx_have_std_libs" >&6; } +if test "$ac_cv_cxx_have_std_libs" = yes; then + +$as_echo "#define HAVE_STD_LIBS /**/" >>confdefs.h + +fi + + + OPENMP_CXXFLAGS= + # Check whether --enable-openmp was given. +if test "${enable_openmp+set}" = set; then : + enableval=$enable_openmp; +fi + + if test "$enable_openmp" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CXX option to support OpenMP" >&5 +$as_echo_n "checking for $CXX option to support OpenMP... " >&6; } +if ${ac_cv_prog_cxx_openmp+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef _OPENMP + choke me +#endif +#include +int main () { return omp_get_num_threads (); } + +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_prog_cxx_openmp='none needed' +else + ac_cv_prog_cxx_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ + -Popenmp --openmp; do + ac_save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $ac_option" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef _OPENMP + choke me +#endif +#include +int main () { return omp_get_num_threads (); } + +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_prog_cxx_openmp=$ac_option +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CXXFLAGS=$ac_save_CXXFLAGS + if test "$ac_cv_prog_cxx_openmp" != unsupported; then + break + fi + done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_openmp" >&5 +$as_echo "$ac_cv_prog_cxx_openmp" >&6; } + case $ac_cv_prog_cxx_openmp in #( + "none needed" | unsupported) + ;; #( + *) + OPENMP_CXXFLAGS=$ac_cv_prog_cxx_openmp ;; + esac + fi + + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler is sufficient for Magick++" >&5 +$as_echo_n "checking whether C++ compiler is sufficient for Magick++... " >&6; } + if \ + test $ax_cv_cxx_bool = 'yes' && \ + test $ax_cv_cxx_namespaces = 'yes' && \ + test $ac_cv_cxx_have_std_libs = 'yes' && \ + test $ax_cv_cxx_have_std_namespace = 'yes'; then + have_magick_plus_plus='yes' + else + have_magick_plus_plus='no (failed tests)' + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_magick_plus_plus" >&5 +$as_echo "$have_magick_plus_plus" >&6; } + LIBS="$OLIBS" +fi + if test "$have_magick_plus_plus" = 'yes'; then + WITH_MAGICK_PLUS_PLUS_TRUE= + WITH_MAGICK_PLUS_PLUS_FALSE='#' +else + WITH_MAGICK_PLUS_PLUS_TRUE='#' + WITH_MAGICK_PLUS_PLUS_FALSE= +fi + + +# Only check for delegate libraries in subdirectories if requested. +if test "$enable_delegate_build" != 'no'; then + # Check for delegate sub-directories and add -I & -L options as required. + # This presumes that delegates are installed as detailed in the ImageMagick + # README. If delegates are installed in a standard location where the + # compiler will automatically find them then these options should not be + # required. + + # + # Most delegates have includes in the same directory as the library, but not all... + # + # Includes + for dir in bzlib fftw fpx gslib/src jp2 jbig/libjbig jpeg lcms/include lzma magick openjp2/include png tiff/libtiff ttf/include wand webp/src wmf/include xml/include zlib; do + if test -d "$builddir/$dir"; then + CPPFLAGS="$CPPFLAGS -I$builddir/$dir" + else + if test -d "$srcdirfull/$dir"; then + CPPFLAGS="$CPPFLAGS -I$srcdirfull/$dir" + fi + fi + done + + # Libraries + for dir in bzlib fftw fpx gslib/src jbig/libjbig jpeg lcms/src lzma magick openjp2 png tiff/libtiff ttf/objs wand webp wmf/src xml zlib; do + if test -d "$builddir/$dir/.libs"; then + LDFLAGS="$LDFLAGS -L$builddir/$dir/.libs" + else + if test -d "$srcdirfull/$dir/.libs"; then + LDFLAGS="$LDFLAGS -L$srcdirfull/$dir/.libs" + fi + fi + if test -d "$builddir/$dir"; then + LDFLAGS="$LDFLAGS -L$builddir/$dir" + else + if test -d "$srcdirfull/$dir"; then + LDFLAGS="$LDFLAGS -L$srcdirfull/$dir" + fi + fi + done +fi + +# Assume that delegate headers reside under same directory as ImageMagick +# installation prefix. +MAGICK_CPPFLAGS="-I$INCLUDE_DIR/${PACKAGE_NAME}-$MAGICK_MAJOR_VERSION $MAGICK_CPPFLAGS" + +# +# Find the X11 RGB database +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 configure files" >&5 +$as_echo_n "checking for X11 configure files... " >&6; } +if ${im_cv_x_configure+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /lib/usr/lib/X11 \ + /usr/X11/lib \ + /usr/X11R4/lib \ + /usr/X11R5/lib \ + /usr/X11R6/lib \ + /usr/X11R7/lib \ + /usr/X386/lib \ + /usr/XFree86/lib/X11 \ + /usr/athena/lib \ + /usr/lib \ + /usr/lib/X11 \ + /usr/lib/X11R4 \ + /usr/lib/X11R5 \ + /usr/lib/X11R6 \ + /usr/lib/X11R7 \ + /usr/local/X11/lib \ + /usr/local/X11R4/lib \ + /usr/local/X11R5/lib \ + /usr/local/X11R6/lib \ + /usr/local/lib \ + /usr/local/lib/X11 \ + /usr/local/lib/X11R4 \ + /usr/local/lib/X11R5 \ + /usr/local/lib/X11R6 \ + /usr/local/lib/X11R7 \ + /usr/local/x11r5/lib \ + /usr/lpp/Xamples/lib \ + /usr/openwin/lib \ + /usr/openwin/share/lib \ + /usr/unsupported/lib \ + /usr/x386/lib \ + ; do + if test -f "$ac_dir/X11/rgb.txt"; then + im_cv_x_configure="$ac_dir/X11/" + break + elif test -f "$ac_dir/rgb.txt"; then + im_cv_x_configure="$ac_dir/" + break + fi + + done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $im_cv_x_configure" >&5 +$as_echo "$im_cv_x_configure" >&6; } +X11_CONFIGURE_PATH="$im_cv_x_configure" +case "${build_os}" in + mingw* ) + X11ConfigurePath=`$WinPathScript "$X11ConfigurePath=" 1` + ;; +esac + +cat >>confdefs.h <<_ACEOF +#define X11_CONFIGURE_PATH "$X11ConfigurePath" +_ACEOF + + +# +# Find OpenMP library +# +GOMP_LIBS='' +if test "$enable_openmp" != 'no'; then + if test "${GCC}" = "yes"; then + # Open64 (passes for GCC but uses different OpenMP implementation) + if test "x$GOMP_LIBS" = x ; then + if $CC --version 2>&1 | grep Open64 > /dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for omp_get_num_procs in -lopenmp" >&5 +$as_echo_n "checking for omp_get_num_procs in -lopenmp... " >&6; } +if ${ac_cv_lib_openmp_omp_get_num_procs+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lopenmp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char omp_get_num_procs (); +int +main () +{ +return omp_get_num_procs (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_openmp_omp_get_num_procs=yes +else + ac_cv_lib_openmp_omp_get_num_procs=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openmp_omp_get_num_procs" >&5 +$as_echo "$ac_cv_lib_openmp_omp_get_num_procs" >&6; } +if test "x$ac_cv_lib_openmp_omp_get_num_procs" = xyes; then : + GOMP_LIBS="-lopenmp" +fi + + fi + fi + # Clang (passes for GCC but uses different OpenMP implementation) + if test "x$LIB_OMP" = x ; then + if $CC --version 2>&1 | grep clang > /dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOMP_parallel_start in -lomp" >&5 +$as_echo_n "checking for GOMP_parallel_start in -lomp... " >&6; } +if ${ac_cv_lib_omp_GOMP_parallel_start+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lomp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char GOMP_parallel_start (); +int +main () +{ +return GOMP_parallel_start (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_omp_GOMP_parallel_start=yes +else + ac_cv_lib_omp_GOMP_parallel_start=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_omp_GOMP_parallel_start" >&5 +$as_echo "$ac_cv_lib_omp_GOMP_parallel_start" >&6; } +if test "x$ac_cv_lib_omp_GOMP_parallel_start" = xyes; then : + LIB_OMP="-lomp" +fi + + fi + fi + # GCC + if test "x$GOMP_LIBS" = x ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOMP_parallel_start in -lgomp" >&5 +$as_echo_n "checking for GOMP_parallel_start in -lgomp... " >&6; } +if ${ac_cv_lib_gomp_GOMP_parallel_start+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgomp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char GOMP_parallel_start (); +int +main () +{ +return GOMP_parallel_start (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gomp_GOMP_parallel_start=yes +else + ac_cv_lib_gomp_GOMP_parallel_start=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gomp_GOMP_parallel_start" >&5 +$as_echo "$ac_cv_lib_gomp_GOMP_parallel_start" >&6; } +if test "x$ac_cv_lib_gomp_GOMP_parallel_start" = xyes; then : + GOMP_LIBS="-lgomp" +fi + + fi + else + # Sun CC + if test "x$GOMP_LIBS" = x ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sunw_mp_register_warn in -lmtsk" >&5 +$as_echo_n "checking for sunw_mp_register_warn in -lmtsk... " >&6; } +if ${ac_cv_lib_mtsk_sunw_mp_register_warn+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmtsk $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sunw_mp_register_warn (); +int +main () +{ +return sunw_mp_register_warn (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_mtsk_sunw_mp_register_warn=yes +else + ac_cv_lib_mtsk_sunw_mp_register_warn=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mtsk_sunw_mp_register_warn" >&5 +$as_echo "$ac_cv_lib_mtsk_sunw_mp_register_warn" >&6; } +if test "x$ac_cv_lib_mtsk_sunw_mp_register_warn" = xyes; then : + GOMP_LIBS="-lmtsk" +fi + + fi + # AIX xlc + if test "x$GOMP_LIBS" = x ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _xlsmpFlush in -lxlsmp" >&5 +$as_echo_n "checking for _xlsmpFlush in -lxlsmp... " >&6; } +if ${ac_cv_lib_xlsmp__xlsmpFlush+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lxlsmp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char _xlsmpFlush (); +int +main () +{ +return _xlsmpFlush (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_xlsmp__xlsmpFlush=yes +else + ac_cv_lib_xlsmp__xlsmpFlush=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xlsmp__xlsmpFlush" >&5 +$as_echo "$ac_cv_lib_xlsmp__xlsmpFlush" >&6; } +if test "x$ac_cv_lib_xlsmp__xlsmpFlush" = xyes; then : + GOMP_LIBS="-lxlsmp" +fi + + fi + # SGI IRIX 6.5 MIPSpro C/C++ + if test "x$GOMP_LIBS" = x ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mp_destroy in -lmp" >&5 +$as_echo_n "checking for mp_destroy in -lmp... " >&6; } +if ${ac_cv_lib_mp_mp_destroy+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char mp_destroy (); +int +main () +{ +return mp_destroy (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_mp_mp_destroy=yes +else + ac_cv_lib_mp_mp_destroy=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mp_mp_destroy" >&5 +$as_echo "$ac_cv_lib_mp_mp_destroy" >&6; } +if test "x$ac_cv_lib_mp_mp_destroy" = xyes; then : + GOMP_LIBS="-lmp" +fi + + fi + fi + LIBS="$GOMP_LIBS $LIBS" +fi + + +# +# Check for jemalloc. +# +have_jemalloc='no' +JEMALLOC_LIBS='' +if test "$with_jemalloc" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JEMALLOC support" >&5 +$as_echo_n "checking for JEMALLOC support... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + ac_fn_c_check_header_mongrel "$LINENO" "jemalloc/jemalloc.h" "ac_cv_header_jemalloc_jemalloc_h" "$ac_includes_default" +if test "x$ac_cv_header_jemalloc_jemalloc_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for malloc_stats_print in -ljemalloc" >&5 +$as_echo_n "checking for malloc_stats_print in -ljemalloc... " >&6; } +if ${ac_cv_lib_jemalloc_malloc_stats_print+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljemalloc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char malloc_stats_print (); +int +main () +{ +return malloc_stats_print (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_jemalloc_malloc_stats_print=yes +else + ac_cv_lib_jemalloc_malloc_stats_print=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jemalloc_malloc_stats_print" >&5 +$as_echo "$ac_cv_lib_jemalloc_malloc_stats_print" >&6; } +if test "x$ac_cv_lib_jemalloc_malloc_stats_print" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if jemalloc memory allocation library is complete" >&5 +$as_echo_n "checking if jemalloc memory allocation library is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_jemalloc='no (failed tests)' + else + JEMALLOC_LIBS='-ljemalloc' + LIBS="$JEMALLOC_LIBS $LIBS" + +$as_echo "#define HAVE_JEMALLOC 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_jemalloc='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_jemalloc" = 'yes'; then + HAVE_JEMALLOC_TRUE= + HAVE_JEMALLOC_FALSE='#' +else + HAVE_JEMALLOC_TRUE='#' + HAVE_JEMALLOC_FALSE= +fi + + + +# +# Check for TCMalloc library +# +have_tcmalloc='no' +TCMALLOC_LIBS='' +OLIBS="$LIBS" +if test "$have_threads" = 'yes' -a "$with_tcmalloc" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking tcmalloc library support" >&5 +$as_echo_n "checking tcmalloc library support... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mallinfo in -ltcmalloc_minimal" >&5 +$as_echo_n "checking for mallinfo in -ltcmalloc_minimal... " >&6; } +if ${ac_cv_lib_tcmalloc_minimal_mallinfo+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltcmalloc_minimal $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char mallinfo (); +int +main () +{ +return mallinfo (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_tcmalloc_minimal_mallinfo=yes +else + ac_cv_lib_tcmalloc_minimal_mallinfo=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tcmalloc_minimal_mallinfo" >&5 +$as_echo "$ac_cv_lib_tcmalloc_minimal_mallinfo" >&6; } +if test "x$ac_cv_lib_tcmalloc_minimal_mallinfo" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + if test $passed -gt 0; then + if test $failed -gt 0; then + have_tcmalloc='no (some components failed test)' + else + TCMALLOC_LIBS=-ltcmalloc_minimal + LIBS="$TCMALLOC_LIBS $LIBS" + CFLAGS="$CFLAGS -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free" + +$as_echo "#define HAVE_TCMALLOC 1" >>confdefs.h + + have_tcmalloc='yes' + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if tcmalloc memory allocation library is complete" >&5 +$as_echo_n "checking if tcmalloc memory allocation library is complete... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_tcmalloc" >&5 +$as_echo "$have_tcmalloc" >&6; } +fi + if test "$have_tcmalloc" = 'yes'; then + HAVE_TCMALLOC_TRUE= + HAVE_TCMALLOC_FALSE='#' +else + HAVE_TCMALLOC_TRUE='#' + HAVE_TCMALLOC_FALSE= +fi + + + +# +# Check for umem. +# +have_umem='no' +UMEM_LIBS='' +if test "$with_umem" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for UMEM support" >&5 +$as_echo_n "checking for UMEM support... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + ac_fn_c_check_header_mongrel "$LINENO" "umem.h" "ac_cv_header_umem_h" "$ac_includes_default" +if test "x$ac_cv_header_umem_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for umem_alloc in -lumem" >&5 +$as_echo_n "checking for umem_alloc in -lumem... " >&6; } +if ${ac_cv_lib_umem_umem_alloc+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lumem $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char umem_alloc (); +int +main () +{ +return umem_alloc (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_umem_umem_alloc=yes +else + ac_cv_lib_umem_umem_alloc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_umem_umem_alloc" >&5 +$as_echo "$ac_cv_lib_umem_umem_alloc" >&6; } +if test "x$ac_cv_lib_umem_umem_alloc" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for umem_free in -lumem" >&5 +$as_echo_n "checking for umem_free in -lumem... " >&6; } +if ${ac_cv_lib_umem_umem_free+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lumem $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char umem_free (); +int +main () +{ +return umem_free (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_umem_umem_free=yes +else + ac_cv_lib_umem_umem_free=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_umem_umem_free" >&5 +$as_echo "$ac_cv_lib_umem_umem_free" >&6; } +if test "x$ac_cv_lib_umem_umem_free" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if umem memory allocation library is complete" >&5 +$as_echo_n "checking if umem memory allocation library is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_umem='no (failed tests)' + else + UMEM_LIBS='-lumem' + LIBS="$UMEM_LIBS $LIBS" + +$as_echo "#define HAVE_UMEM 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_umem='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_umem" = 'yes'; then + HAVE_UMEM_TRUE= + HAVE_UMEM_FALSE='#' +else + HAVE_UMEM_TRUE='#' + HAVE_UMEM_FALSE= +fi + + + +# +# Add support for ccmalloc memory debugging library if requested +# +have_ccmalloc='no' +CCMALLOC_LIBS='' +if test "$enable_ccmalloc" = 'yes'; then + # Extract the first word of "ccmalloc", so it can be a program name with args. +set dummy ccmalloc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_CCMALLOCDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $CCMALLOCDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_CCMALLOCDelegate="$CCMALLOCDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_CCMALLOCDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CCMALLOCDelegate=$ac_cv_path_CCMALLOCDelegate +if test -n "$CCMALLOCDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CCMALLOCDelegate" >&5 +$as_echo "$CCMALLOCDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test -n "$CCMALLOCDelegate"; then + eval `grep PREFIX= $CCMALLOCDelegate | sed -e 's/PREFIX/CCMALLOC_PREFIX/'` + OLIBS="$LIBS" + # Assume that gcc is used with ccmalloc. + LIBS="$LIBS $CCMALLOC_PREFIX/lib/ccmalloc-gcc.o" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ccmalloc_malloc in -lccmalloc" >&5 +$as_echo_n "checking for ccmalloc_malloc in -lccmalloc... " >&6; } +if ${ac_cv_lib_ccmalloc_ccmalloc_malloc+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lccmalloc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ccmalloc_malloc (); +int +main () +{ +return ccmalloc_malloc (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ccmalloc_ccmalloc_malloc=yes +else + ac_cv_lib_ccmalloc_ccmalloc_malloc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ccmalloc_ccmalloc_malloc" >&5 +$as_echo "$ac_cv_lib_ccmalloc_ccmalloc_malloc" >&6; } +if test "x$ac_cv_lib_ccmalloc_ccmalloc_malloc" = xyes; then : + CCMALLOC_LIBS="$CCMALLOC_PREFIX/lib/ccmalloc-gcc.o -lccmalloc -ldl" +else + ,-ldl +fi + + if test -n "$CCMALLOC_LIBS"; then + LIBS="$OLIBS" + LIBS="$LIBS $CCMALLOC_LIBS" + have_ccmalloc='yes' + else + LIBS="$OLIBS" + fi + fi +fi + +# +# Add support for 'huge pages' if requested +# +if test "x$enable_hugepages" != "xno"; then : + + +$as_echo "#define HAVE_HUGEPAGES 1" >>confdefs.h + + +fi + +# +# Add support for efence memory debugging library if requested +# +if test "$enable_efence" = 'yes'; then + EFENCE_LIBS='-lefence' + LIBS="$EFENCE_LIBS $LIBS" +fi + + +# +# Check for BZLIB +# + + +# Check whether --with-bzlib was given. +if test "${with_bzlib+set}" = set; then : + withval=$with_bzlib; with_bzlib=$withval +else + with_bzlib='yes' +fi + + +if test "$with_bzlib" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-bzlib=$with_bzlib " +fi + +have_bzlib='no' +if test "$with_bzlib" != 'no'; then + BZLIB_LIBS='' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZLIB" >&5 +$as_echo_n "checking for BZLIB... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + found_libbz=0 + ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" +if test "x$ac_cv_header_bzlib_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzDecompress in -lbz2" >&5 +$as_echo_n "checking for BZ2_bzDecompress in -lbz2... " >&6; } +if ${ac_cv_lib_bz2_BZ2_bzDecompress+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbz2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char BZ2_bzDecompress (); +int +main () +{ +return BZ2_bzDecompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bz2_BZ2_bzDecompress=yes +else + ac_cv_lib_bz2_BZ2_bzDecompress=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzDecompress" >&5 +$as_echo "$ac_cv_lib_bz2_BZ2_bzDecompress" >&6; } +if test "x$ac_cv_lib_bz2_BZ2_bzDecompress" = xyes; then : + found_libbz=`expr $found_libbz + 1` +fi + + if test "$native_win32_build" = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _imp__BZ2_decompress in -lbz2" >&5 +$as_echo_n "checking for _imp__BZ2_decompress in -lbz2... " >&6; } +if ${ac_cv_lib_bz2__imp__BZ2_decompress+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbz2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char _imp__BZ2_decompress (); +int +main () +{ +return _imp__BZ2_decompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bz2__imp__BZ2_decompress=yes +else + ac_cv_lib_bz2__imp__BZ2_decompress=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2__imp__BZ2_decompress" >&5 +$as_echo "$ac_cv_lib_bz2__imp__BZ2_decompress" >&6; } +if test "x$ac_cv_lib_bz2__imp__BZ2_decompress" = xyes; then : + found_libbz=`expr $found_libbz + 1` +fi + + fi + if test $found_libbz -gt 0; then + passed=`expr $passed + 1` + else + failed=`expr $failed + 1` + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if BZLIB package is complete" >&5 +$as_echo_n "checking if BZLIB package is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_bzlib='no (failed tests)' + else + BZLIB_LIBS='-lbz2' + LIBS="$BZLIB_LIBS $LIBS" + +$as_echo "#define BZLIB_DELEGATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_bzlib='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_bzlib" = 'yes'; then + BZLIB_DELEGATE_TRUE= + BZLIB_DELEGATE_FALSE='#' +else + BZLIB_DELEGATE_TRUE='#' + BZLIB_DELEGATE_FALSE= +fi + + + +# +# Find the X11 include and library directories. +# +IPC_LIBS='' +X11_LIBS='' +XEXT_LIBS='' +XT_LIBS='' +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 +$as_echo_n "checking for X... " >&6; } + + +# Check whether --with-x was given. +if test "${with_x+set}" = set; then : + withval=$with_x; +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + case $x_includes,$x_libraries in #( + *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( + *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : + $as_echo_n "(cached) " >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -f -r conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + cat >Imakefile <<'_ACEOF' +incroot: + @echo incroot='${INCROOT}' +usrlibdir: + @echo usrlibdir='${USRLIBDIR}' +libdir: + @echo libdir='${LIBDIR}' +_ACEOF + if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. + for ac_var in incroot usrlibdir libdir; do + eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" + done + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl dylib la dll; do + if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && + test -f "$ac_im_libdir/libX11.$ac_extension"; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ac_x_includes= ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /usr/lib64 | /lib | /lib64) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -f -r conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R7/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R7 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R7/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R7 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Xlib.h. + # First, try using that file with no special directory specified. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # We can compile using X headers with no special include directory. +ac_x_includes= +else + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Xlib.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.i conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lX11 $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +XrmInitialize () + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + LIBS=$ac_save_LIBS +for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib la dll; do + if test -r "$ac_dir/libX11.$ac_extension"; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +case $ac_x_includes,$ac_x_libraries in #( + no,* | *,no | *\'*) + # Didn't find X, or a directory has "'" in its name. + ac_cv_have_x="have_x=no";; #( + *) + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$ac_x_includes'\ + ac_x_libraries='$ac_x_libraries'" +esac +fi +;; #( + *) have_x=yes;; + esac + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 +$as_echo "$have_x" >&6; } + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$x_includes'\ + ac_x_libraries='$x_libraries'" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 +$as_echo "libraries $x_libraries, headers $x_includes" >&6; } +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 +$as_echo_n "checking whether -R must be followed by a space... " >&6; } + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + ac_xsave_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + X_LIBS="$X_LIBS -R$x_libraries" +else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + X_LIBS="$X_LIBS -R $x_libraries" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 +$as_echo "neither works" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_c_werror_flag=$ac_xsave_c_werror_flag + LIBS=$ac_xsave_LIBS + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XOpenDisplay (); +int +main () +{ +return XOpenDisplay (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } +if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_dnet_ntoa=yes +else + ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } +if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes; then : + +fi + + if test $ac_cv_func_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 +$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } +if ${ac_cv_lib_bsd_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_gethostbyname=yes +else + ac_cv_lib_bsd_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } +if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" +if test "x$ac_cv_func_connect" = xyes; then : + +fi + + if test $ac_cv_func_connect = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 +$as_echo_n "checking for connect in -lsocket... " >&6; } +if ${ac_cv_lib_socket_connect+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_connect=yes +else + ac_cv_lib_socket_connect=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +$as_echo "$ac_cv_lib_socket_connect" >&6; } +if test "x$ac_cv_lib_socket_connect" = xyes; then : + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" +if test "x$ac_cv_func_remove" = xyes; then : + +fi + + if test $ac_cv_func_remove = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 +$as_echo_n "checking for remove in -lposix... " >&6; } +if ${ac_cv_lib_posix_remove+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char remove (); +int +main () +{ +return remove (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_posix_remove=yes +else + ac_cv_lib_posix_remove=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 +$as_echo "$ac_cv_lib_posix_remove" >&6; } +if test "x$ac_cv_lib_posix_remove" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" +if test "x$ac_cv_func_shmat" = xyes; then : + +fi + + if test $ac_cv_func_shmat = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 +$as_echo_n "checking for shmat in -lipc... " >&6; } +if ${ac_cv_lib_ipc_shmat+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shmat (); +int +main () +{ +return shmat (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ipc_shmat=yes +else + ac_cv_lib_ipc_shmat=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 +$as_echo "$ac_cv_lib_ipc_shmat" >&6; } +if test "x$ac_cv_lib_ipc_shmat" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 +$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } +if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char IceConnectionNumber (); +int +main () +{ +return IceConnectionNumber (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ICE_IceConnectionNumber=yes +else + ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } +if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + +if test "$no_x" != 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11" >&5 +$as_echo_n "checking for X11... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + LDFLAGS="$LDFLAGS $X_LIBS" + X11_LIBS="$X_PRE_LIBS -lX11 $X_EXTRA_LIBS" + LIBS="$X11_LIBS $LIBS" + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + +$as_echo "#define X11_DELEGATE 1" >>confdefs.h + + # + # Check for X11 shared memory extension + # + # shmctl is required to support the shared memory extension + ac_fn_c_check_func "$LINENO" "shmctl" "ac_cv_func_shmctl" +if test "x$ac_cv_func_shmctl" = xyes; then : + have_shmctl='yes' +fi + + if test "$have_shmctl" != 'yes'; then + PERSIST_LIBS=$LIBS + LIBS="$LIBS -lcygipc" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shmctl (); +int +main () +{ +return shmctl (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + have_shmctl='yes'; IPC_LIBS='-lcygipc' +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$PERSIST_LIBS + fi + + if test "$have_shmctl" = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShmAttach in -lXext" >&5 +$as_echo_n "checking for XShmAttach in -lXext... " >&6; } +if ${ac_cv_lib_Xext_XShmAttach+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXext $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XShmAttach (); +int +main () +{ +return XShmAttach (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xext_XShmAttach=yes +else + ac_cv_lib_Xext_XShmAttach=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XShmAttach" >&5 +$as_echo "$ac_cv_lib_Xext_XShmAttach" >&6; } +if test "x$ac_cv_lib_Xext_XShmAttach" = xyes; then : + XEXT_LIBS='-lXext' ; +$as_echo "#define HAVE_SHARED_MEMORY 1" >>confdefs.h + +fi + + fi + + # + # Check for X11 shape extension + # + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShapeCombineMask in -lXext" >&5 +$as_echo_n "checking for XShapeCombineMask in -lXext... " >&6; } +if ${ac_cv_lib_Xext_XShapeCombineMask+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXext $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XShapeCombineMask (); +int +main () +{ +return XShapeCombineMask (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xext_XShapeCombineMask=yes +else + ac_cv_lib_Xext_XShapeCombineMask=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XShapeCombineMask" >&5 +$as_echo "$ac_cv_lib_Xext_XShapeCombineMask" >&6; } +if test "x$ac_cv_lib_Xext_XShapeCombineMask" = xyes; then : + XEXT_LIBS='-lXext' ; +$as_echo "#define HAVE_SHAPE 1" >>confdefs.h + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XtSetEventDispatcher in -lXt" >&5 +$as_echo_n "checking for XtSetEventDispatcher in -lXt... " >&6; } +if ${ac_cv_lib_Xt_XtSetEventDispatcher+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XtSetEventDispatcher (); +int +main () +{ +return XtSetEventDispatcher (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xt_XtSetEventDispatcher=yes +else + ac_cv_lib_Xt_XtSetEventDispatcher=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xt_XtSetEventDispatcher" >&5 +$as_echo "$ac_cv_lib_Xt_XtSetEventDispatcher" >&6; } +if test "x$ac_cv_lib_Xt_XtSetEventDispatcher" = xyes; then : + XT_LIBS='-lXt' +fi + + LIBS="$XEXT_LIBS $XT_LIBS $LIBS" +fi +if test "$no_x" != 'yes'; then + have_x='yes' +else + have_x='no' +fi + if test "$have_x" = 'yes'; then + X11_DELEGATE_TRUE= + X11_DELEGATE_FALSE='#' +else + X11_DELEGATE_TRUE='#' + X11_DELEGATE_FALSE= +fi + + + + + +# +# Check for ZLIB +# + +# Check whether --with-zlib was given. +if test "${with_zlib+set}" = set; then : + withval=$with_zlib; with_zlib=$withval +else + with_zlib='yes' +fi + + +if test "$with_zlib" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-zlib=$with_zlib " +fi + +have_zlib='no' +ZLIB_CFLAGS="" +ZLIB_LIBS="" +ZLIB_PKG="" +if test "x$with_zlib" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for zlib >= 1.0.0" >&5 +$as_echo_n "checking for zlib >= 1.0.0... " >&6; } + +if test -n "$ZLIB_CFLAGS"; then + pkg_cv_ZLIB_CFLAGS="$ZLIB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zlib >= 1.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "zlib >= 1.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ZLIB_CFLAGS=`$PKG_CONFIG --cflags "zlib >= 1.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$ZLIB_LIBS"; then + pkg_cv_ZLIB_LIBS="$ZLIB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zlib >= 1.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "zlib >= 1.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ZLIB_LIBS=`$PKG_CONFIG --libs "zlib >= 1.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + ZLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "zlib >= 1.0.0" 2>&1` + else + ZLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "zlib >= 1.0.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$ZLIB_PKG_ERRORS" >&5 + + have_zlib=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_zlib=no +else + ZLIB_CFLAGS=$pkg_cv_ZLIB_CFLAGS + ZLIB_LIBS=$pkg_cv_ZLIB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_zlib=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_zlib" = 'yes'; then + +$as_echo "#define ZLIB_DELEGATE 1" >>confdefs.h + + CFLAGS="$ZLIB_CFLAGS $CFLAGS" + LIBS="$ZLIB_LIBS $LIBS" +fi + + if test "$have_zlib" = 'yes'; then + ZLIB_DELEGATE_TRUE= + ZLIB_DELEGATE_FALSE='#' +else + ZLIB_DELEGATE_TRUE='#' + ZLIB_DELEGATE_FALSE= +fi + + + + + +# +# Check for ZSTD +# + +# Check whether --with-zstd was given. +if test "${with_zstd+set}" = set; then : + withval=$with_zstd; with_zstd=$withval +else + with_zstd='yes' +fi + + +if test "$with_zstd" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-zstd=$with_zstd " +fi + +have_zstd='no' +ZSTD_CFLAGS="" +ZSTD_LIBS="" +ZSTD_PKG="" +if test "x$with_zstd" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libzstd >= 1.0.0" >&5 +$as_echo_n "checking for libzstd >= 1.0.0... " >&6; } + +if test -n "$LIBZSTD_CFLAGS"; then + pkg_cv_LIBZSTD_CFLAGS="$LIBZSTD_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd >= 1.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd >= 1.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBZSTD_CFLAGS=`$PKG_CONFIG --cflags "libzstd >= 1.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBZSTD_LIBS"; then + pkg_cv_LIBZSTD_LIBS="$LIBZSTD_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd >= 1.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd >= 1.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBZSTD_LIBS=`$PKG_CONFIG --libs "libzstd >= 1.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBZSTD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzstd >= 1.0.0" 2>&1` + else + LIBZSTD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzstd >= 1.0.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBZSTD_PKG_ERRORS" >&5 + + have_zstd=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_zstd=no +else + LIBZSTD_CFLAGS=$pkg_cv_LIBZSTD_CFLAGS + LIBZSTD_LIBS=$pkg_cv_LIBZSTD_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_zstd=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_zstd" = 'yes'; then + +$as_echo "#define ZSTD_DELEGATE 1" >>confdefs.h + + CFLAGS="$ZSTD_CFLAGS $CFLAGS" + LIBS="$ZSTD_LIBS $LIBS" +fi + + if test "$have_zstd" = 'yes'; then + ZSTD_DELEGATE_TRUE= + ZSTD_DELEGATE_FALSE='#' +else + ZSTD_DELEGATE_TRUE='#' + ZSTD_DELEGATE_FALSE= +fi + + + + + +# whether modules are built or not. +if test "$build_modules" != 'no' || test "X$no_cl" != 'Xyes'; then + with_ltdl='yes' +else + with_ltdl='no' +fi +have_ltdl='no' +LTDL_LIBS='' +if test "$with_ltdl" = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libltdl" >&5 +$as_echo_n "checking for libltdl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + ac_fn_c_check_header_mongrel "$LINENO" "ltdl.h" "ac_cv_header_ltdl_h" "$ac_includes_default" +if test "x$ac_cv_header_ltdl_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lt_dlinit in -lltdl" >&5 +$as_echo_n "checking for lt_dlinit in -lltdl... " >&6; } +if ${ac_cv_lib_ltdl_lt_dlinit+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lltdl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char lt_dlinit (); +int +main () +{ +return lt_dlinit (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ltdl_lt_dlinit=yes +else + ac_cv_lib_ltdl_lt_dlinit=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ltdl_lt_dlinit" >&5 +$as_echo "$ac_cv_lib_ltdl_lt_dlinit" >&6; } +if test "x$ac_cv_lib_ltdl_lt_dlinit" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libltdl package is complete" >&5 +$as_echo_n "checking if libltdl package is complete... " >&6; } + if test $passed -gt 0 ; then + if test $failed -gt 0 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_ltdl='no (failed tests)' + else + LTDL_LIBS='-lltdl' + LIBS="$LTDL_LIBS $LIBS" + +$as_echo "#define LTDL_DELEGATE 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define LTDL_MODULE_EXT "${shrext_cmds}" +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_ltdl='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + if test "$have_ltdl" != 'yes' ; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 1 "libltdl is required for modules and OpenCL builds +See \`config.log' for more details" "$LINENO" 5; } + fi +fi + if test "$have_ltdl" != 'no'; then + WITH_LTDL_TRUE= + WITH_LTDL_FALSE='#' +else + WITH_LTDL_TRUE='#' + WITH_LTDL_FALSE= +fi + + +# +# If profiling, then check for -ldl and dlopen (required for Solaris & gcc) +# +LIB_DL='' +if test "$enable_profiling" = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + LIB_DL='-ldl' +fi + + LIBS="$LIB_DL $LIBS" +fi + + + +# +# Set Apple font directory. +# + +# Check whether --with-apple-font-dir was given. +if test "${with_apple_font_dir+set}" = set; then : + withval=$with_apple_font_dir; with_apple_font_dir=$withval +else + with_apple_font_dir='default' +fi + + +if test "$with_apple_font_dir" != 'default'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-apple-font-dir=$with_apple_font_dir " +fi + + +# +# Check for Autotrace delegate library. +# + +# Check whether --with-autotrace was given. +if test "${with_autotrace+set}" = set; then : + withval=$with_autotrace; with_autotrace=$withval +else + with_autotrace='no' +fi + + +if test "$with_autotrace" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-autotrace=$with_autotrace " +fi + +have_autotrace='no' +AUTOTRACE_CFLAGS="" +AUTOTRACE_LIBS="" +AUTOTRACE_PKG="" +if test "x$with_autotrace" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autotrace >= 0.31.2" >&5 +$as_echo_n "checking for autotrace >= 0.31.2... " >&6; } + +if test -n "$AUTOTRACE_CFLAGS"; then + pkg_cv_AUTOTRACE_CFLAGS="$AUTOTRACE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"autotrace >= 0.31.2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "autotrace >= 0.31.2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_AUTOTRACE_CFLAGS=`$PKG_CONFIG --cflags "autotrace >= 0.31.2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$AUTOTRACE_LIBS"; then + pkg_cv_AUTOTRACE_LIBS="$AUTOTRACE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"autotrace >= 0.31.2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "autotrace >= 0.31.2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_AUTOTRACE_LIBS=`$PKG_CONFIG --libs "autotrace >= 0.31.2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + AUTOTRACE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "autotrace >= 0.31.2" 2>&1` + else + AUTOTRACE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "autotrace >= 0.31.2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$AUTOTRACE_PKG_ERRORS" >&5 + + have_autotrace=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_autotrace=no +else + AUTOTRACE_CFLAGS=$pkg_cv_AUTOTRACE_CFLAGS + AUTOTRACE_LIBS=$pkg_cv_AUTOTRACE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_autotrace=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_autotrace" = 'yes'; then + +$as_echo "#define AUTOTRACE_DELEGATE 1" >>confdefs.h + + CFLAGS="$AUTOTRACE_CFLAGS $CFLAGS" +fi + + if test "$have_autotrace" = 'yes'; then + AUTOTRACE_DELEGATE_TRUE= + AUTOTRACE_DELEGATE_FALSE='#' +else + AUTOTRACE_DELEGATE_TRUE='#' + AUTOTRACE_DELEGATE_FALSE= +fi + + + + + +# +# Check for Display Postscript delegate library. +# + +# Check whether --with-dps was given. +if test "${with_dps+set}" = set; then : + withval=$with_dps; with_dps=$withval +else + with_dps='yes' +fi + + +if test "$with_dps" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-dps=$with_dps " +fi + +have_dps='no' +DPS_LIBS='' +if test "$with_dps" != 'no' && test "$with_x" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPS" >&5 +$as_echo_n "checking for DPS... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + PERSIST_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -I${ac_x_includes}/X11" + ac_fn_c_check_header_mongrel "$LINENO" "DPS/dpsXclient.h" "ac_cv_header_DPS_dpsXclient_h" "$ac_includes_default" +if test "x$ac_cv_header_DPS_dpsXclient_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + # DPS issues: + # XFree86-4.x needs -lXt to provide XtMalloc for -ldps. + # Cygwin doesn't deliver -lXt as a DLL, which prevents a DLL build. + # Adobe DPS (as delivered on Solaris) doesn't require -lXt. + # ImageMagick itself doesn't use -lXt. + have_libdps='no' + LIBDPS_XT='' + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPSInitialize in -ldps" >&5 +$as_echo_n "checking for DPSInitialize in -ldps... " >&6; } +if ${ac_cv_lib_dps_DPSInitialize+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldps $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char DPSInitialize (); +int +main () +{ +return DPSInitialize (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dps_DPSInitialize=yes +else + ac_cv_lib_dps_DPSInitialize=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dps_DPSInitialize" >&5 +$as_echo "$ac_cv_lib_dps_DPSInitialize" >&6; } +if test "x$ac_cv_lib_dps_DPSInitialize" = xyes; then : + have_libdps='yes' +else + have_libdps='no', +fi + + if test "$have_libdps" != 'yes'; then + # Unset cache variable so we can try again. + unset ac_cv_lib_dps_DPSInitialize + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPSInitialize in -ldps" >&5 +$as_echo_n "checking for DPSInitialize in -ldps... " >&6; } +if ${ac_cv_lib_dps_DPSInitialize+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldps $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char DPSInitialize (); +int +main () +{ +return DPSInitialize (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dps_DPSInitialize=yes +else + ac_cv_lib_dps_DPSInitialize=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dps_DPSInitialize" >&5 +$as_echo "$ac_cv_lib_dps_DPSInitialize" >&6; } +if test "x$ac_cv_lib_dps_DPSInitialize" = xyes; then : + have_libdps='yes' +else + have_libdps='no',-lXt +fi + + if test "$have_libdps" = 'yes'; then + LIBDPS_XT='-lXt' + fi + fi + if test "$have_libdps" = 'yes'; then + passed=`expr $passed + 1` + else + failed=`expr $failed + 1` + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XDPSPixelsPerPoint in -ldpstk" >&5 +$as_echo_n "checking for XDPSPixelsPerPoint in -ldpstk... " >&6; } +if ${ac_cv_lib_dpstk_XDPSPixelsPerPoint+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldpstk $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XDPSPixelsPerPoint (); +int +main () +{ +return XDPSPixelsPerPoint (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dpstk_XDPSPixelsPerPoint=yes +else + ac_cv_lib_dpstk_XDPSPixelsPerPoint=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dpstk_XDPSPixelsPerPoint" >&5 +$as_echo "$ac_cv_lib_dpstk_XDPSPixelsPerPoint" >&6; } +if test "x$ac_cv_lib_dpstk_XDPSPixelsPerPoint" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1`,-ldps $LIBDPS_XT +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if DPS package is complete" >&5 +$as_echo_n "checking if DPS package is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_dps='no (failed tests)' + CPPFLAGS="$PERSIST_CPPFLAGS" + else + DPS_LIBS="-ldpstk -ldps ${LIBDPS_XT}" + LIBS="$DPS_LIBS $LIBS" + +$as_echo "#define DPS_DELEGATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_dps='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CPPFLAGS=$PERSIST_CPPFLAGS + fi +fi + if test "$have_dps" = 'yes'; then + DPS_DELEGATE_TRUE= + DPS_DELEGATE_FALSE='#' +else + DPS_DELEGATE_TRUE='#' + DPS_DELEGATE_FALSE= +fi + + + + +# +# Set DejaVu font directory. +# + +# Check whether --with-dejavu-font-dir was given. +if test "${with_dejavu_font_dir+set}" = set; then : + withval=$with_dejavu_font_dir; with_dejavu_font_dir=$withval +else + with_dejavu_font_dir='default' +fi + + +if test "$with_dejavu_font_dir" != 'default'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-dejavu-font-dir=$with_dejavu_font_dir " +fi + + +# +# Check for FFTW delegate library. +# + +# Check whether --with-fftw was given. +if test "${with_fftw+set}" = set; then : + withval=$with_fftw; with_fftw=$withval +else + with_fftw='no' +fi + + +if test "$with_fftw" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-fftw=$with_fftw " +fi + +have_fftw='no' +FFTW_CFLAGS="" +FFTW_LIBS="" +FFTW_PKG="" +if test "x$with_fftw" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3 >= 3.0.0" >&5 +$as_echo_n "checking for fftw3 >= 3.0.0... " >&6; } + +if test -n "$fftw3_CFLAGS"; then + pkg_cv_fftw3_CFLAGS="$fftw3_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3 >= 3.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fftw3 >= 3.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_fftw3_CFLAGS=`$PKG_CONFIG --cflags "fftw3 >= 3.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$fftw3_LIBS"; then + pkg_cv_fftw3_LIBS="$fftw3_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3 >= 3.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fftw3 >= 3.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_fftw3_LIBS=`$PKG_CONFIG --libs "fftw3 >= 3.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + fftw3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fftw3 >= 3.0.0" 2>&1` + else + fftw3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fftw3 >= 3.0.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$fftw3_PKG_ERRORS" >&5 + + have_fftw=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_fftw=no +else + fftw3_CFLAGS=$pkg_cv_fftw3_CFLAGS + fftw3_LIBS=$pkg_cv_fftw3_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_fftw=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_fftw" = 'yes'; then + +$as_echo "#define FFTW_DELEGATE 1" >>confdefs.h + + FFTW_CFLAGS="$fftw3_CFLAGS" + FFTW_LIBS="$fftw3_LIBS" + CFLAGS="$fftw3_CFLAGS $CFLAGS" +fi + + if test "$have_fftw" = 'yes'; then + FFTW_DELEGATE_TRUE= + FFTW_DELEGATE_FALSE='#' +else + FFTW_DELEGATE_TRUE='#' + FFTW_DELEGATE_FALSE= +fi + + + + + +# +# Check for FLIF delegate library. +# + +# Check whether --with-flif was given. +if test "${with_flif+set}" = set; then : + withval=$with_flif; with_flif=$withval +else + with_flif='yes' +fi + + +if test "$with_flif" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-flif=$with_flif " +fi + +have_flif='no' +FLIF_LIBS='' +if test "$with_flif" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLIF" >&5 +$as_echo_n "checking for FLIF... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + ac_fn_c_check_header_mongrel "$LINENO" "flif.h" "ac_cv_header_flif_h" "$ac_includes_default" +if test "x$ac_cv_header_flif_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flif_create_decoder in -lflif" >&5 +$as_echo_n "checking for flif_create_decoder in -lflif... " >&6; } +if ${ac_cv_lib_flif_flif_create_decoder+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lflif $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char flif_create_decoder (); +int +main () +{ +return flif_create_decoder (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_flif_flif_create_decoder=yes +else + ac_cv_lib_flif_flif_create_decoder=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_flif_flif_create_decoder" >&5 +$as_echo "$ac_cv_lib_flif_flif_create_decoder" >&6; } +if test "x$ac_cv_lib_flif_flif_create_decoder" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if FLIF package is complete" >&5 +$as_echo_n "checking if FLIF package is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_flif='no (failed tests)' + else + FLIF_LIBS='-lflif' + LIBS="$FLIF_LIBS $LIBS" + +$as_echo "#define FLIF_DELEGATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_flif='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_flif" = 'yes'; then + FLIF_DELEGATE_TRUE= + FLIF_DELEGATE_FALSE='#' +else + FLIF_DELEGATE_TRUE='#' + FLIF_DELEGATE_FALSE= +fi + + + + +# +# Check for FlashPIX delegate library. +# + +# Check whether --with-fpx was given. +if test "${with_fpx+set}" = set; then : + withval=$with_fpx; with_fpx=$withval +else + with_fpx='yes' +fi + + +if test "$with_fpx" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-fpx=$with_fpx " +fi + +have_fpx='no' +FPX_LIBS='' +if test "$with_fpx" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FlashPIX" >&5 +$as_echo_n "checking for FlashPIX... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +ac_fn_cxx_check_header_mongrel "$LINENO" "fpxlib.h" "ac_cv_header_fpxlib_h" "$ac_includes_default" +if test "x$ac_cv_header_fpxlib_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FPX_OpenImageByFilename in -lfpx" >&5 +$as_echo_n "checking for FPX_OpenImageByFilename in -lfpx... " >&6; } +if ${ac_cv_lib_fpx_FPX_OpenImageByFilename+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfpx $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char FPX_OpenImageByFilename (); +int +main () +{ +return FPX_OpenImageByFilename (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_fpx_FPX_OpenImageByFilename=yes +else + ac_cv_lib_fpx_FPX_OpenImageByFilename=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fpx_FPX_OpenImageByFilename" >&5 +$as_echo "$ac_cv_lib_fpx_FPX_OpenImageByFilename" >&6; } +if test "x$ac_cv_lib_fpx_FPX_OpenImageByFilename" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if FlashPIX package is complete" >&5 +$as_echo_n "checking if FlashPIX package is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_fpx='no (failed tests)' + else + FPX_LIBS='-lfpx' + +$as_echo "#define FPX_DELEGATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_fpx='yes' + PERLMAINCC="$CXX" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_fpx" = 'yes'; then + FPX_DELEGATE_TRUE= + FPX_DELEGATE_FALSE='#' +else + FPX_DELEGATE_TRUE='#' + FPX_DELEGATE_FALSE= +fi + + + + +# +# Check for DJVU delegate library. +# + +# Check whether --with-djvu was given. +if test "${with_djvu+set}" = set; then : + withval=$with_djvu; with_djvu=$withval +else + with_djvu='yes' +fi + + +if test "$with_djvu" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-djvu=$with_djvu " +fi + +have_djvu='no' +DJVU_CFLAGS="" +DJVU_LIBS="" +DJVU_PKG="" +if test "x$with_djvu" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ddjvuapi >= 3.5.0" >&5 +$as_echo_n "checking for ddjvuapi >= 3.5.0... " >&6; } + +if test -n "$ddjvuapi_CFLAGS"; then + pkg_cv_ddjvuapi_CFLAGS="$ddjvuapi_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ddjvuapi >= 3.5.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "ddjvuapi >= 3.5.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ddjvuapi_CFLAGS=`$PKG_CONFIG --cflags "ddjvuapi >= 3.5.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$ddjvuapi_LIBS"; then + pkg_cv_ddjvuapi_LIBS="$ddjvuapi_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ddjvuapi >= 3.5.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "ddjvuapi >= 3.5.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ddjvuapi_LIBS=`$PKG_CONFIG --libs "ddjvuapi >= 3.5.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + ddjvuapi_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ddjvuapi >= 3.5.0" 2>&1` + else + ddjvuapi_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ddjvuapi >= 3.5.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$ddjvuapi_PKG_ERRORS" >&5 + + have_djvu=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_djvu=no +else + ddjvuapi_CFLAGS=$pkg_cv_ddjvuapi_CFLAGS + ddjvuapi_LIBS=$pkg_cv_ddjvuapi_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_djvu=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_djvu" = 'yes'; then + +$as_echo "#define DJVU_DELEGATE 1" >>confdefs.h + + DJVU_CFLAGS="$ddjvuapi_CFLAGS" + DJVU_LIBS="$ddjvuapi_LIBS" + CFLAGS="$ddjvuapi_CFLAGS $CFLAGS" +fi + + if test "$have_djvu" = 'yes'; then + DJVU_DELEGATE_TRUE= + DJVU_DELEGATE_FALSE='#' +else + DJVU_DELEGATE_TRUE='#' + DJVU_DELEGATE_FALSE= +fi + + + + + +# +# Check for fontconfig delegate library. +# + +# Check whether --with-fontconfig was given. +if test "${with_fontconfig+set}" = set; then : + withval=$with_fontconfig; with_fontconfig=$withval +else + with_fontconfig='yes' +fi + + +if test "$with_fontconfig" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-fontconfig=$with_fontconfig " +fi + +have_fontconfig='no' +FONTCONFIG_CFLAGS="" +FONTCONFIG_LIBS="" +FONTCONFIG_PKG="" +if test "x$with_fontconfig" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fontconfig >= 2.1.0" >&5 +$as_echo_n "checking for fontconfig >= 2.1.0... " >&6; } + +if test -n "$FONTCONFIG_CFLAGS"; then + pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig >= 2.1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fontconfig >= 2.1.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "fontconfig >= 2.1.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FONTCONFIG_LIBS"; then + pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig >= 2.1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fontconfig >= 2.1.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FONTCONFIG_LIBS=`$PKG_CONFIG --libs "fontconfig >= 2.1.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fontconfig >= 2.1.0" 2>&1` + else + FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fontconfig >= 2.1.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FONTCONFIG_PKG_ERRORS" >&5 + + have_fontconfig=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_fontconfig=no +else + FONTCONFIG_CFLAGS=$pkg_cv_FONTCONFIG_CFLAGS + FONTCONFIG_LIBS=$pkg_cv_FONTCONFIG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_fontconfig=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_fontconfig" = 'yes'; then + +$as_echo "#define FONTCONFIG_DELEGATE 1" >>confdefs.h + + CFLAGS="$FONTCONFIG_CFLAGS $CFLAGS" +fi + + if test "$have_fontconfig" = 'yes'; then + FONTCONFIG_DELEGATE_TRUE= + FONTCONFIG_DELEGATE_FALSE='#' +else + FONTCONFIG_DELEGATE_TRUE='#' + FONTCONFIG_DELEGATE_FALSE= +fi + + + + + +# +# Check for the Freetype delegate library. +# + +# Check whether --with-freetype was given. +if test "${with_freetype+set}" = set; then : + withval=$with_freetype; with_freetype=$withval +else + with_freetype='yes' +fi + + +if test "$with_freetype" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-freetype=$with_freetype " +fi + +have_freetype='no' +FREETYPE_CFLAGS="" +FREETYPE_LIBS="" +FREETYPE_PKG="" +if test "x$with_freetype" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype2" >&5 +$as_echo_n "checking for freetype2... " >&6; } + +if test -n "$FREETYPE_CFLAGS"; then + pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FREETYPE_LIBS"; then + pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "freetype2" 2>&1` + else + FREETYPE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "freetype2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FREETYPE_PKG_ERRORS" >&5 + + have_freetype=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_freetype=no +else + FREETYPE_CFLAGS=$pkg_cv_FREETYPE_CFLAGS + FREETYPE_LIBS=$pkg_cv_FREETYPE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_freetype=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_freetype" = 'yes'; then + +$as_echo "#define FREETYPE_DELEGATE 1" >>confdefs.h + + CFLAGS="$FREETYPE_CFLAGS $CFLAGS" + MAGICKCORE_FREETYPE_DELEGATE=1 +else + MAGICKCORE_FREETYPE_DELEGATE=0 +fi + + + + + + +# +# Check for the raqm delegate library. +# + +# Check whether --with-raqm was given. +if test "${with_raqm+set}" = set; then : + withval=$with_raqm; with_raqm=$withval +else + with_raqm='yes' +fi + + +if test "$with_raqm" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-raqm=$with_raqm " +fi + +have_raqm='no' +RAQM_CFLAGS="" +RAQM_LIBS="" +RAQM_PKG="" +if test "x$with_raqm" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for raqm" >&5 +$as_echo_n "checking for raqm... " >&6; } + +if test -n "$RAQM_CFLAGS"; then + pkg_cv_RAQM_CFLAGS="$RAQM_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"raqm\""; } >&5 + ($PKG_CONFIG --exists --print-errors "raqm") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_RAQM_CFLAGS=`$PKG_CONFIG --cflags "raqm" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$RAQM_LIBS"; then + pkg_cv_RAQM_LIBS="$RAQM_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"raqm\""; } >&5 + ($PKG_CONFIG --exists --print-errors "raqm") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_RAQM_LIBS=`$PKG_CONFIG --libs "raqm" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + RAQM_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "raqm" 2>&1` + else + RAQM_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "raqm" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$RAQM_PKG_ERRORS" >&5 + + have_raqm=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_raqm=no +else + RAQM_CFLAGS=$pkg_cv_RAQM_CFLAGS + RAQM_LIBS=$pkg_cv_RAQM_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_raqm=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_raqm" = 'yes'; then + +$as_echo "#define RAQM_DELEGATE 1" >>confdefs.h + + CFLAGS="$RAQM_CFLAGS $CFLAGS" +fi + + if test "$have_raqm" = 'yes'; then + RAQM_DELEGATE_TRUE= + RAQM_DELEGATE_FALSE='#' +else + RAQM_DELEGATE_TRUE='#' + RAQM_DELEGATE_FALSE= +fi + + + + + +# +# Enable Windows gdi32 libraries +# + +# Check whether --with-gdi32 was given. +if test "${with_gdi32+set}" = set; then : + withval=$with_gdi32; with_gdi32=$withval +else + with_gdi32='yes' +fi + +if test "$with_gdi32" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-gdi32=$with_gdi32 " +fi + +# +# Check for Windows gdi32 library. +# +have_gdi32='no' +if test "$with_gdi32" != 'no'; then + GDI32_LIBS='' + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows GDI32 support" >&5 +$as_echo_n "checking for Windows GDI32 support... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" +if test "x$ac_cv_header_windows_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + ac_fn_c_check_header_compile "$LINENO" "winuser.h" "ac_cv_header_winuser_h" "#include +" +if test "x$ac_cv_header_winuser_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + ac_fn_c_check_header_compile "$LINENO" "wingdi.h" "ac_cv_header_wingdi_h" "#include +" +if test "x$ac_cv_header_wingdi_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows GDI32 support is complete" >&5 +$as_echo_n "checking if Windows GDI32 support is complete... " >&6; } + if test "$cygwin_build" = yes -o "$native_win32_build" = yes; then + passed=`expr $passed + 1` + fi + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_gdi32='no (failed tests)' + else + GDI32_LIBS='-lgdi32 -luser32' + LIBS="$GDI32_LIBS $LIBS" + +$as_echo "#define WINGDI32_DELEGATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_gdi32='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_gdi32" = 'yes'; then + WINGDI32_DELEGATE_TRUE= + WINGDI32_DELEGATE_FALSE='#' +else + WINGDI32_DELEGATE_TRUE='#' + WINGDI32_DELEGATE_FALSE= +fi + + + + +# +# Check for Ghostscript library or framework. +# +# Test for iapi.h & test for gsapi_new_instance in -lgs +# or -framework Ghostscript + + +# Check whether --with-gslib was given. +if test "${with_gslib+set}" = set; then : + withval=$with_gslib; with_gslib=$withval +else + with_gslib='no' +fi + + +gslib_framework='no' +if test "$with_gslib" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-gslib=$with_gslib " +fi + +have_gslib='no' +GS_LIBS='' +if test "$with_gslib" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ghostscript" >&5 +$as_echo_n "checking for Ghostscript... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + framework=0 + failed=0 + passed=0 + ac_fn_c_check_header_mongrel "$LINENO" "ghostscript/iapi.h" "ac_cv_header_ghostscript_iapi_h" "$ac_includes_default" +if test "x$ac_cv_header_ghostscript_iapi_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "ghostscript/ierrors.h" "ac_cv_header_ghostscript_ierrors_h" "$ac_includes_default" +if test "x$ac_cv_header_ghostscript_ierrors_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gsapi_new_instance in Ghostscript framework" >&5 +$as_echo_n "checking for gsapi_new_instance in Ghostscript framework... " >&6; } +if ${ac_cv_framework_Ghostscript_gsapi_new_instance+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_framework_save_LIBS=$LIBS +LIBS="-framework Ghostscript $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gsapi_new_instance (); +int +main () +{ +return gsapi_new_instance (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_framework_Ghostscript_gsapi_new_instance=yes +else + ac_cv_framework_Ghostscript_gsapi_new_instance=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_framework_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_framework_Ghostscript_gsapi_new_instance" >&5 +$as_echo "$ac_cv_framework_Ghostscript_gsapi_new_instance" >&6; } +if test $ac_cv_framework_Ghostscript_gsapi_new_instance = yes; then : + framework=`expr $framework + 1` +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gsapi_new_instance in -lgs" >&5 +$as_echo_n "checking for gsapi_new_instance in -lgs... " >&6; } +if ${ac_cv_lib_gs_gsapi_new_instance+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgs $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gsapi_new_instance (); +int +main () +{ +return gsapi_new_instance (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gs_gsapi_new_instance=yes +else + ac_cv_lib_gs_gsapi_new_instance=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gs_gsapi_new_instance" >&5 +$as_echo "$ac_cv_lib_gs_gsapi_new_instance" >&6; } +if test "x$ac_cv_lib_gs_gsapi_new_instance" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Ghostscript package is complete" >&5 +$as_echo_n "checking if Ghostscript package is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_gslib='no (failed tests)' + else + if test $framework -gt 0; then + GS_LIBS='-framework Ghostscript' + gslib_framework='yes' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, using framework." >&5 +$as_echo "yes, using framework." >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, using library." >&5 +$as_echo "yes, using library." >&6; } + GS_LIBS='-lgs' + fi + LIBS="$GS_LIBS $LIBS" + +$as_echo "#define GS_DELEGATE 1" >>confdefs.h + + have_gslib='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_gslib" = 'yes'; then + GS_DELEGATE_TRUE= + GS_DELEGATE_FALSE='#' +else + GS_DELEGATE_TRUE='#' + GS_DELEGATE_FALSE= +fi + + + +# Set default font search path + +# Check whether --with-fontpath was given. +if test "${with_fontpath+set}" = set; then : + withval=$with_fontpath; with_fontpath=$withval +else + with_fontpath='' +fi + + +if test "$with_fontpath" != "yes" && test -z "$with_fontpath"; then + with_fontpath='' +else + +cat >>confdefs.h <<_ACEOF +#define MAGICK_FONT_PATH "$with_fontpath" +_ACEOF + +fi +if test "$with_fontpath=" != ''; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-fontpath=$with_fontpath " +fi + +# Set Ghostscript font directory + +# Check whether --with-gs-font-dir was given. +if test "${with_gs_font_dir+set}" = set; then : + withval=$with_gs_font_dir; with_gs_font_dir=$withval +else + with_gs_font_dir='default' +fi + + +if test "$with_gs_font_dir" != 'default'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-gs-font-dir=$with_gs_font_dir " +fi + + +# +# Check for GVC delegate library. +# + +# Check whether --with-gvc was given. +if test "${with_gvc+set}" = set; then : + withval=$with_gvc; with_gvc=$withval +else + with_gvc='yes' +fi + + +if test "$with_gvc" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-gvc=$with_gvc " +fi + +GVC_PKG="" +if test "x$with_gvc" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgvc >= 2.9.0" >&5 +$as_echo_n "checking for libgvc >= 2.9.0... " >&6; } + +if test -n "$GVC_CFLAGS"; then + pkg_cv_GVC_CFLAGS="$GVC_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgvc >= 2.9.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libgvc >= 2.9.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GVC_CFLAGS=`$PKG_CONFIG --cflags "libgvc >= 2.9.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GVC_LIBS"; then + pkg_cv_GVC_LIBS="$GVC_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgvc >= 2.9.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libgvc >= 2.9.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GVC_LIBS=`$PKG_CONFIG --libs "libgvc >= 2.9.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GVC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libgvc >= 2.9.0" 2>&1` + else + GVC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libgvc >= 2.9.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GVC_PKG_ERRORS" >&5 + + have_gvc=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_gvc=no +else + GVC_CFLAGS=$pkg_cv_GVC_CFLAGS + GVC_LIBS=$pkg_cv_GVC_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_gvc=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_gvc" = 'yes'; then + +$as_echo "#define GVC_DELEGATE 1" >>confdefs.h + + CFLAGS="$GVC_CFLAGS $CFLAGS" +fi + + if test "$have_gvc" = 'yes'; then + GVC_DELEGATE_TRUE= + GVC_DELEGATE_FALSE='#' +else + GVC_DELEGATE_TRUE='#' + GVC_DELEGATE_FALSE= +fi + + + + + +# +# Check for the HEIC delegate library. +# + +# Check whether --with-heic was given. +if test "${with_heic+set}" = set; then : + withval=$with_heic; with_heic=$withval +else + with_heic='yes' +fi + + +if test "$with_heic" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-heic=$with_heic " +fi + +have_heic='no' +HEIF_CFLAGS="" +HEIF_LIBS="" +HEIF_PKG="" +if test "x$with_heic" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libheif" >&5 +$as_echo_n "checking for libheif... " >&6; } + +if test -n "$HEIF_CFLAGS"; then + pkg_cv_HEIF_CFLAGS="$HEIF_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libheif\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libheif") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_HEIF_CFLAGS=`$PKG_CONFIG --cflags "libheif" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$HEIF_LIBS"; then + pkg_cv_HEIF_LIBS="$HEIF_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libheif\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libheif") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_HEIF_LIBS=`$PKG_CONFIG --libs "libheif" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + HEIF_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libheif" 2>&1` + else + HEIF_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libheif" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$HEIF_PKG_ERRORS" >&5 + + have_heic=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_heic=no +else + HEIF_CFLAGS=$pkg_cv_HEIF_CFLAGS + HEIF_LIBS=$pkg_cv_HEIF_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_heic=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_heic" = 'yes'; then + +$as_echo "#define HEIC_DELEGATE 1" >>confdefs.h + + CFLAGS="$HEIF_CFLAGS $CFLAGS" +fi + + if test "$have_heic" = 'yes'; then + HEIC_DELEGATE_TRUE= + HEIC_DELEGATE_FALSE='#' +else + HEIC_DELEGATE_TRUE='#' + HEIC_DELEGATE_FALSE= +fi + + + + + + +# +# Check for JBIG delegate library. +# + + +# Check whether --with-jbig was given. +if test "${with_jbig+set}" = set; then : + withval=$with_jbig; with_jbig=$withval +else + with_jbig='yes' +fi + + +have_jbig='no' +JBIG_LIBS='' +if test "$with_jbig" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JBIG" >&5 +$as_echo_n "checking for JBIG... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + ac_fn_c_check_header_mongrel "$LINENO" "jbig.h" "ac_cv_header_jbig_h" "$ac_includes_default" +if test "x$ac_cv_header_jbig_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jbg_dec_init in -ljbig" >&5 +$as_echo_n "checking for jbg_dec_init in -ljbig... " >&6; } +if ${ac_cv_lib_jbig_jbg_dec_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljbig $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char jbg_dec_init (); +int +main () +{ +return jbg_dec_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_jbig_jbg_dec_init=yes +else + ac_cv_lib_jbig_jbg_dec_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jbig_jbg_dec_init" >&5 +$as_echo "$ac_cv_lib_jbig_jbg_dec_init" >&6; } +if test "x$ac_cv_lib_jbig_jbg_dec_init" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if JBIG package is complete" >&5 +$as_echo_n "checking if JBIG package is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_jbig='no (failed tests)' + else + JBIG_LIBS='-ljbig' + LIBS="$JBIG_LIBS $LIBS" + +$as_echo "#define JBIG_DELEGATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_jbig='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_jbig" = 'yes'; then + JBIG_DELEGATE_TRUE= + JBIG_DELEGATE_FALSE='#' +else + JBIG_DELEGATE_TRUE='#' + JBIG_DELEGATE_FALSE= +fi + + + + +# +# Check for JPEG delegate library. +# + +# Check whether --with-jpeg was given. +if test "${with_jpeg+set}" = set; then : + withval=$with_jpeg; with_jpeg=$withval +else + with_jpeg='yes' +fi + + +if test "$with_jpeg" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-jpeg=$with_jpeg " +fi + +have_jpeg='no' +JPEG_LIBS='' +if test "$with_jpeg" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG" >&5 +$as_echo_n "checking for JPEG... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + ac_fn_c_check_header_mongrel "$LINENO" "jconfig.h" "ac_cv_header_jconfig_h" "$ac_includes_default" +if test "x$ac_cv_header_jconfig_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "jerror.h" "ac_cv_header_jerror_h" "$ac_includes_default" +if test "x$ac_cv_header_jerror_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "jmorecfg.h" "ac_cv_header_jmorecfg_h" "$ac_includes_default" +if test "x$ac_cv_header_jmorecfg_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" +if test "x$ac_cv_header_jpeglib_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_read_header in -ljpeg" >&5 +$as_echo_n "checking for jpeg_read_header in -ljpeg... " >&6; } +if ${ac_cv_lib_jpeg_jpeg_read_header+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char jpeg_read_header (); +int +main () +{ +return jpeg_read_header (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_jpeg_jpeg_read_header=yes +else + ac_cv_lib_jpeg_jpeg_read_header=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_read_header" >&5 +$as_echo "$ac_cv_lib_jpeg_jpeg_read_header" >&6; } +if test "x$ac_cv_lib_jpeg_jpeg_read_header" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if JPEG package is complete" >&5 +$as_echo_n "checking if JPEG package is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_jpeg='no (failed tests)' + else + JPEG_LIBS='-ljpeg' + LIBS="$JPEG_LIBS $LIBS" + +$as_echo "#define JPEG_DELEGATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_jpeg='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_jpeg" = 'yes'; then + JPEG_DELEGATE_TRUE= + JPEG_DELEGATE_FALSE='#' +else + JPEG_DELEGATE_TRUE='#' + JPEG_DELEGATE_FALSE= +fi + + + + +# +# Check for Jpegxl delegate library. +# + +# Check whether --with-jxl was given. +if test "${with_jxl+set}" = set; then : + withval=$with_jxl; with_jxl=$withval +else + with_jxl='yes' +fi + + +if test "$with_jxl" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-jxl=$with_jxl " +fi + +# Check for the brunsli libraries, currently the only libraries used by the jxl coder. +# Full jxl support will be added once the full libraries are released. +have_jxl='no' +JXL_LIBS='' +if test "$with_jxl" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for brunsli" >&5 +$as_echo_n "checking for brunsli... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + ac_fn_c_check_header_mongrel "$LINENO" "brunsli/decode.h" "ac_cv_header_brunsli_decode_h" "$ac_includes_default" +if test "x$ac_cv_header_brunsli_decode_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "brunsli/encode.h" "ac_cv_header_brunsli_encode_h" "$ac_includes_default" +if test "x$ac_cv_header_brunsli_encode_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DecodeBrunsli in -lbrunslidec-c" >&5 +$as_echo_n "checking for DecodeBrunsli in -lbrunslidec-c... " >&6; } +if ${ac_cv_lib_brunslidec_c_DecodeBrunsli+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbrunslidec-c $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char DecodeBrunsli (); +int +main () +{ +return DecodeBrunsli (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_brunslidec_c_DecodeBrunsli=yes +else + ac_cv_lib_brunslidec_c_DecodeBrunsli=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_brunslidec_c_DecodeBrunsli" >&5 +$as_echo "$ac_cv_lib_brunslidec_c_DecodeBrunsli" >&6; } +if test "x$ac_cv_lib_brunslidec_c_DecodeBrunsli" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EncodeBrunsli in -lbrunslienc-c" >&5 +$as_echo_n "checking for EncodeBrunsli in -lbrunslienc-c... " >&6; } +if ${ac_cv_lib_brunslienc_c_EncodeBrunsli+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbrunslienc-c $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char EncodeBrunsli (); +int +main () +{ +return EncodeBrunsli (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_brunslienc_c_EncodeBrunsli=yes +else + ac_cv_lib_brunslienc_c_EncodeBrunsli=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_brunslienc_c_EncodeBrunsli" >&5 +$as_echo "$ac_cv_lib_brunslienc_c_EncodeBrunsli" >&6; } +if test "x$ac_cv_lib_brunslienc_c_EncodeBrunsli" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if brunsli package is complete" >&5 +$as_echo_n "checking if brunsli package is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_jxl='no (failed tests)' + else + JXL_LIBS='-lbrunslidec-c -lbrunslienc-c' + LIBS="$JXL_LIBS $LIBS" + +$as_echo "#define JXL_DELEGATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_jxl='yes' + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_jxl" = 'yes'; then + JXL_DELEGATE_TRUE= + JXL_DELEGATE_FALSE='#' +else + JXL_DELEGATE_TRUE='#' + JXL_DELEGATE_FALSE= +fi + + + + +# +# Check for LCMS delegate library. +# + +# Check whether --with-lcms was given. +if test "${with_lcms+set}" = set; then : + withval=$with_lcms; with_lcms=$withval +else + with_lcms='yes' +fi + +if test "$with_lcms" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-lcms=$with_lcms " +fi + +have_lcms='no' +LCMS_CFLAGS="" +LCMS_LIBS="" +LCMS_PKG="" +if test "x$with_lcms" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for lcms2 >= 2.0.0" >&5 +$as_echo_n "checking for lcms2 >= 2.0.0... " >&6; } + +if test -n "$LCMS2_CFLAGS"; then + pkg_cv_LCMS2_CFLAGS="$LCMS2_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms2 >= 2.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lcms2 >= 2.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LCMS2_CFLAGS=`$PKG_CONFIG --cflags "lcms2 >= 2.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LCMS2_LIBS"; then + pkg_cv_LCMS2_LIBS="$LCMS2_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms2 >= 2.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lcms2 >= 2.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LCMS2_LIBS=`$PKG_CONFIG --libs "lcms2 >= 2.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LCMS2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lcms2 >= 2.0.0" 2>&1` + else + LCMS2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lcms2 >= 2.0.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LCMS2_PKG_ERRORS" >&5 + + have_lcms=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_lcms=no +else + LCMS2_CFLAGS=$pkg_cv_LCMS2_CFLAGS + LCMS2_LIBS=$pkg_cv_LCMS2_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_lcms=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_lcms" = 'yes'; then + +$as_echo "#define LCMS_DELEGATE 1" >>confdefs.h + + LCMS_CFLAGS="$LCMS2_CFLAGS" + LCMS_LIBS="$LCMS2_LIBS" + CFLAGS="$LCMS2_CFLAGS $CFLAGS" + ac_fn_c_check_header_mongrel "$LINENO" "lcms2/lcms2.h" "ac_cv_header_lcms2_lcms2_h" "$ac_includes_default" +if test "x$ac_cv_header_lcms2_lcms2_h" = xyes; then : + have_lcms_header='yes' +fi + + + if test "$have_lcms_header" = 'yes'; then + +$as_echo "#define HAVE_LCMS2_LCMS2_H 1" >>confdefs.h + + else + +$as_echo "#define HAVE_LCMS2_H 1" >>confdefs.h + + fi +fi + + if test "$have_lcms" = 'yes'; then + LCMS_DELEGATE_TRUE= + LCMS_DELEGATE_FALSE='#' +else + LCMS_DELEGATE_TRUE='#' + LCMS_DELEGATE_FALSE= +fi + + + + + +# +# Check for the OpenJP2 delegate library. +# + +# Check whether --with-openjp2 was given. +if test "${with_openjp2+set}" = set; then : + withval=$with_openjp2; with_openjp2=$withval +else + with_openjp2='yes' +fi + + +if test "$with_openjp2" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-openjp2=$with_openjp2 " +fi + +have_openjp2='no' +LIBOPENJP2_CFLAGS="" +LIBOPENJP2_LIBS="" +LIBOPENJP2_PKG="" +if test "$with_openjp2" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libopenjp2 >= 2.1.0" >&5 +$as_echo_n "checking for libopenjp2 >= 2.1.0... " >&6; } + +if test -n "$LIBOPENJP2_CFLAGS"; then + pkg_cv_LIBOPENJP2_CFLAGS="$LIBOPENJP2_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjp2 >= 2.1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libopenjp2 >= 2.1.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBOPENJP2_CFLAGS=`$PKG_CONFIG --cflags "libopenjp2 >= 2.1.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBOPENJP2_LIBS"; then + pkg_cv_LIBOPENJP2_LIBS="$LIBOPENJP2_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjp2 >= 2.1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libopenjp2 >= 2.1.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBOPENJP2_LIBS=`$PKG_CONFIG --libs "libopenjp2 >= 2.1.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBOPENJP2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libopenjp2 >= 2.1.0" 2>&1` + else + LIBOPENJP2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libopenjp2 >= 2.1.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBOPENJP2_PKG_ERRORS" >&5 + + have_openjp2=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_openjp2=no +else + LIBOPENJP2_CFLAGS=$pkg_cv_LIBOPENJP2_CFLAGS + LIBOPENJP2_LIBS=$pkg_cv_LIBOPENJP2_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_openjp2=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_openjp2" = 'yes'; then + +$as_echo "#define LIBOPENJP2_DELEGATE 1" >>confdefs.h + + CFLAGS="$LIBOPENJP2_CFLAGS $CFLAGS" +fi + + if test "$have_openjp2" = 'yes'; then + LIBOPENJP2_DELEGATE_TRUE= + LIBOPENJP2_DELEGATE_FALSE='#' +else + LIBOPENJP2_DELEGATE_TRUE='#' + LIBOPENJP2_DELEGATE_FALSE= +fi + + + + + + +# +# Check for the LQR (Liquid Rescale) delegate library. +# + +# Check whether --with-lqr was given. +if test "${with_lqr+set}" = set; then : + withval=$with_lqr; with_lqr=$withval +else + with_lqr='yes' +fi + + +if test "$with_lqr" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-lqr=$with_lqr " +fi + +have_lqr='no' +LQR_CFLAGS="" +LQR_LIBS="" +LQR_PKG="" +if test "x$with_lqr" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for lqr-1 >= 0.1.0" >&5 +$as_echo_n "checking for lqr-1 >= 0.1.0... " >&6; } + +if test -n "$LQR_CFLAGS"; then + pkg_cv_LQR_CFLAGS="$LQR_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lqr-1 >= 0.1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lqr-1 >= 0.1.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LQR_CFLAGS=`$PKG_CONFIG --cflags "lqr-1 >= 0.1.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LQR_LIBS"; then + pkg_cv_LQR_LIBS="$LQR_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lqr-1 >= 0.1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lqr-1 >= 0.1.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LQR_LIBS=`$PKG_CONFIG --libs "lqr-1 >= 0.1.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LQR_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lqr-1 >= 0.1.0" 2>&1` + else + LQR_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lqr-1 >= 0.1.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LQR_PKG_ERRORS" >&5 + + have_lqr=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_lqr=no +else + LQR_CFLAGS=$pkg_cv_LQR_CFLAGS + LQR_LIBS=$pkg_cv_LQR_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_lqr=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_lqr" = 'yes'; then + +$as_echo "#define LQR_DELEGATE 1" >>confdefs.h + + CFLAGS="$LQR_CFLAGS $CFLAGS" +fi + + if test "$have_lqr" = 'yes'; then + LQR_DELEGATE_TRUE= + LQR_DELEGATE_FALSE='#' +else + LQR_DELEGATE_TRUE='#' + LQR_DELEGATE_FALSE= +fi + + + + + +# Disable LZMA (lzma library) + +# Check whether --with-lzma was given. +if test "${with_lzma+set}" = set; then : + withval=$with_lzma; with_lzma=$withval +else + with_lzma='yes' +fi + +if test "$with_lzma" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-lzma=$with_lzma " +fi + +LZMA_PKG="" +if test "x$with_lzma" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for liblzma >= 2.9.0" >&5 +$as_echo_n "checking for liblzma >= 2.9.0... " >&6; } + +if test -n "$LZMA_CFLAGS"; then + pkg_cv_LZMA_CFLAGS="$LZMA_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"liblzma >= 2.9.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "liblzma >= 2.9.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LZMA_CFLAGS=`$PKG_CONFIG --cflags "liblzma >= 2.9.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LZMA_LIBS"; then + pkg_cv_LZMA_LIBS="$LZMA_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"liblzma >= 2.9.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "liblzma >= 2.9.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LZMA_LIBS=`$PKG_CONFIG --libs "liblzma >= 2.9.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LZMA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "liblzma >= 2.9.0" 2>&1` + else + LZMA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "liblzma >= 2.9.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LZMA_PKG_ERRORS" >&5 + + have_lzma=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_lzma=no +else + LZMA_CFLAGS=$pkg_cv_LZMA_CFLAGS + LZMA_LIBS=$pkg_cv_LZMA_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_lzma=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +else + have_lzma=no +fi + +if test "$have_lzma" = 'yes'; then + +$as_echo "#define LZMA_DELEGATE 1" >>confdefs.h + + CFLAGS="$LZMA_CFLAGS $CFLAGS" +fi + + if test "$have_lzma" = 'yes'; then + LZMA_DELEGATE_TRUE= + LZMA_DELEGATE_FALSE='#' +else + LZMA_DELEGATE_TRUE='#' + LZMA_DELEGATE_FALSE= +fi + + + + + +# +# Check for the OpenEXR delegate library. +# + +# Check whether --with-openexr was given. +if test "${with_openexr+set}" = set; then : + withval=$with_openexr; with_openexr=$withval +else + with_openexr='yes' +fi + + +if test "$with_openexr" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-openexr=$with_openexr " +fi + +have_openexr='no' +OPENEXR_CFLAGS="" +OPENEXR_LIBS="" +OPENEXR_PKG="" +if test "x$with_openexr" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenEXR >= 1.0.6" >&5 +$as_echo_n "checking for OpenEXR >= 1.0.6... " >&6; } + +if test -n "$OPENEXR_CFLAGS"; then + pkg_cv_OPENEXR_CFLAGS="$OPENEXR_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"OpenEXR >= 1.0.6\""; } >&5 + ($PKG_CONFIG --exists --print-errors "OpenEXR >= 1.0.6") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_OPENEXR_CFLAGS=`$PKG_CONFIG --cflags "OpenEXR >= 1.0.6" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$OPENEXR_LIBS"; then + pkg_cv_OPENEXR_LIBS="$OPENEXR_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"OpenEXR >= 1.0.6\""; } >&5 + ($PKG_CONFIG --exists --print-errors "OpenEXR >= 1.0.6") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_OPENEXR_LIBS=`$PKG_CONFIG --libs "OpenEXR >= 1.0.6" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + OPENEXR_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "OpenEXR >= 1.0.6" 2>&1` + else + OPENEXR_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "OpenEXR >= 1.0.6" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$OPENEXR_PKG_ERRORS" >&5 + + have_openexr=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_openexr=no +else + OPENEXR_CFLAGS=$pkg_cv_OPENEXR_CFLAGS + OPENEXR_LIBS=$pkg_cv_OPENEXR_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_openexr=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_openexr" = 'yes'; then + +$as_echo "#define OPENEXR_DELEGATE 1" >>confdefs.h + + CFLAGS="$OPENEXR_CFLAGS $CFLAGS" +fi + + if test "$have_openexr" = 'yes'; then + OPENEXR_DELEGATE_TRUE= + OPENEXR_DELEGATE_FALSE='#' +else + OPENEXR_DELEGATE_TRUE='#' + OPENEXR_DELEGATE_FALSE= +fi + + + + + +# +# Check for PANGO delegate library. +# + +# Check whether --with-pango was given. +if test "${with_pango+set}" = set; then : + withval=$with_pango; with_pango=$withval +else + with_pango='yes' +fi + + +if test "$with_pango" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-pango=$with_pango " +fi + +have_pango='no' +have_pangocairo='no' +PANGO_CFLAGS="" +PANGO_LIBS="" +PANGO_PKG="" +if test "x$with_pango" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pangocairo >= 1.28.1" >&5 +$as_echo_n "checking for pangocairo >= 1.28.1... " >&6; } + +if test -n "$PANGO_CFLAGS"; then + pkg_cv_PANGO_CFLAGS="$PANGO_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pangocairo >= 1.28.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "pangocairo >= 1.28.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PANGO_CFLAGS=`$PKG_CONFIG --cflags "pangocairo >= 1.28.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$PANGO_LIBS"; then + pkg_cv_PANGO_LIBS="$PANGO_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pangocairo >= 1.28.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "pangocairo >= 1.28.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PANGO_LIBS=`$PKG_CONFIG --libs "pangocairo >= 1.28.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + PANGO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "pangocairo >= 1.28.1" 2>&1` + else + PANGO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "pangocairo >= 1.28.1" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$PANGO_PKG_ERRORS" >&5 + + have_pangocairo=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_pangocairo=no +else + PANGO_CFLAGS=$pkg_cv_PANGO_CFLAGS + PANGO_LIBS=$pkg_cv_PANGO_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_pangocairo=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pango >= 1.28.1" >&5 +$as_echo_n "checking for pango >= 1.28.1... " >&6; } + +if test -n "$PANGO_CFLAGS"; then + pkg_cv_PANGO_CFLAGS="$PANGO_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pango >= 1.28.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "pango >= 1.28.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PANGO_CFLAGS=`$PKG_CONFIG --cflags "pango >= 1.28.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$PANGO_LIBS"; then + pkg_cv_PANGO_LIBS="$PANGO_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pango >= 1.28.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "pango >= 1.28.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PANGO_LIBS=`$PKG_CONFIG --libs "pango >= 1.28.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + PANGO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "pango >= 1.28.1" 2>&1` + else + PANGO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "pango >= 1.28.1" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$PANGO_PKG_ERRORS" >&5 + + have_pango=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_pango=no +else + PANGO_CFLAGS=$pkg_cv_PANGO_CFLAGS + PANGO_LIBS=$pkg_cv_PANGO_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_pango=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_pango" = 'yes'; then + +$as_echo "#define PANGO_DELEGATE 1" >>confdefs.h + + CFLAGS="$PANGO_CFLAGS $CFLAGS" +fi + +if test "$have_pangocairo" = 'yes'; then + +$as_echo "#define PANGOCAIRO_DELEGATE 1" >>confdefs.h + + CFLAGS="$PANGOCAIRO_CFLAGS $CFLAGS" +fi + + if test "$have_pango" = 'yes'; then + PANGO_DELEGATE_TRUE= + PANGO_DELEGATE_FALSE='#' +else + PANGO_DELEGATE_TRUE='#' + PANGO_DELEGATE_FALSE= +fi + + if test "$have_pangocairo" = 'yes'; then + PANGOCAIRO_DELEGATE_TRUE= + PANGOCAIRO_DELEGATE_FALSE='#' +else + PANGOCAIRO_DELEGATE_TRUE='#' + PANGOCAIRO_DELEGATE_FALSE= +fi + + + + + +# +# Check for PNG delegate library. +# + +# Check whether --with-png was given. +if test "${with_png+set}" = set; then : + withval=$with_png; with_png=$withval +else + with_png='yes' +fi + + +if test "$with_png" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-png=$with_png " +fi + +have_png='no' +PNG_CFLAGS="" +PNG_LIBS="" +PNG_PKG="" +if test "x$with_png" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpng >= 1.0.0" >&5 +$as_echo_n "checking for libpng >= 1.0.0... " >&6; } + +if test -n "$PNG_CFLAGS"; then + pkg_cv_PNG_CFLAGS="$PNG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libpng >= 1.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PNG_CFLAGS=`$PKG_CONFIG --cflags "libpng >= 1.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$PNG_LIBS"; then + pkg_cv_PNG_LIBS="$PNG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libpng >= 1.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PNG_LIBS=`$PKG_CONFIG --libs "libpng >= 1.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + PNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng >= 1.0.0" 2>&1` + else + PNG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng >= 1.0.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$PNG_PKG_ERRORS" >&5 + + have_png=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_png=no +else + PNG_CFLAGS=$pkg_cv_PNG_CFLAGS + PNG_LIBS=$pkg_cv_PNG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_png=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_png" = 'yes'; then + +$as_echo "#define PNG_DELEGATE 1" >>confdefs.h + + CFLAGS="$PNG_CFLAGS $CFLAGS" +fi + + if test "$have_png" = 'yes'; then + PNG_DELEGATE_TRUE= + PNG_DELEGATE_FALSE='#' +else + PNG_DELEGATE_TRUE='#' + PNG_DELEGATE_FALSE= +fi + + + + + +# +# Check for the Raw delegate library. +# + +# Check whether --with-raw was given. +if test "${with_raw+set}" = set; then : + withval=$with_raw; with_raw=$withval +else + with_raw='yes' +fi + + +if test "$with_raw" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-libraw=$with_raw " +fi + +have_raw='no' +RAW_R_CFLAGS="" +RAW_R_LIBS="" +RAW_R_PKG="" +if test "x$with_raw" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libraw_r >= 0.14.8" >&5 +$as_echo_n "checking for libraw_r >= 0.14.8... " >&6; } + +if test -n "$RAW_R_CFLAGS"; then + pkg_cv_RAW_R_CFLAGS="$RAW_R_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libraw_r >= 0.14.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libraw_r >= 0.14.8") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_RAW_R_CFLAGS=`$PKG_CONFIG --cflags "libraw_r >= 0.14.8" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$RAW_R_LIBS"; then + pkg_cv_RAW_R_LIBS="$RAW_R_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libraw_r >= 0.14.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libraw_r >= 0.14.8") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_RAW_R_LIBS=`$PKG_CONFIG --libs "libraw_r >= 0.14.8" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + RAW_R_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libraw_r >= 0.14.8" 2>&1` + else + RAW_R_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libraw_r >= 0.14.8" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$RAW_R_PKG_ERRORS" >&5 + + have_raw=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_raw=no +else + RAW_R_CFLAGS=$pkg_cv_RAW_R_CFLAGS + RAW_R_LIBS=$pkg_cv_RAW_R_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_raw=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_raw" = 'yes'; then + +$as_echo "#define RAW_R_DELEGATE 1" >>confdefs.h + + CFLAGS="$RAW_R_CFLAGS $CFLAGS" +fi + + if test "$have_raw" = 'yes'; then + RAW_R_DELEGATE_TRUE= + RAW_R_DELEGATE_FALSE='#' +else + RAW_R_DELEGATE_TRUE='#' + RAW_R_DELEGATE_FALSE= +fi + + + + + +# +# Check for RSVG delegate library. +# + +# Check whether --with-rsvg was given. +if test "${with_rsvg+set}" = set; then : + withval=$with_rsvg; with_rsvg=$withval +else + with_rsvg='no' +fi + + +if test "$with_rsvg" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-rsvg=$with_rsvg " +fi + +have_rsvg='no' +have_cairo='no' +RSVG_CFLAGS="" +RSVG_LIBS="" +RSVG_PKG="" +if test "x$with_rsvg" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for librsvg-2.0 >= 2.9.0" >&5 +$as_echo_n "checking for librsvg-2.0 >= 2.9.0... " >&6; } + +if test -n "$RSVG_CFLAGS"; then + pkg_cv_RSVG_CFLAGS="$RSVG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"librsvg-2.0 >= 2.9.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "librsvg-2.0 >= 2.9.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_RSVG_CFLAGS=`$PKG_CONFIG --cflags "librsvg-2.0 >= 2.9.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$RSVG_LIBS"; then + pkg_cv_RSVG_LIBS="$RSVG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"librsvg-2.0 >= 2.9.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "librsvg-2.0 >= 2.9.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_RSVG_LIBS=`$PKG_CONFIG --libs "librsvg-2.0 >= 2.9.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + RSVG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "librsvg-2.0 >= 2.9.0" 2>&1` + else + RSVG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "librsvg-2.0 >= 2.9.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$RSVG_PKG_ERRORS" >&5 + + have_rsvg=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_rsvg=no +else + RSVG_CFLAGS=$pkg_cv_RSVG_CFLAGS + RSVG_LIBS=$pkg_cv_RSVG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_rsvg=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo-svg" >&5 +$as_echo_n "checking for cairo-svg... " >&6; } + +if test -n "$CAIRO_SVG_CFLAGS"; then + pkg_cv_CAIRO_SVG_CFLAGS="$CAIRO_SVG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-svg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cairo-svg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAIRO_SVG_CFLAGS=`$PKG_CONFIG --cflags "cairo-svg" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$CAIRO_SVG_LIBS"; then + pkg_cv_CAIRO_SVG_LIBS="$CAIRO_SVG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-svg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cairo-svg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAIRO_SVG_LIBS=`$PKG_CONFIG --libs "cairo-svg" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + CAIRO_SVG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo-svg" 2>&1` + else + CAIRO_SVG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo-svg" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$CAIRO_SVG_PKG_ERRORS" >&5 + + have_cairo=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_cairo=no +else + CAIRO_SVG_CFLAGS=$pkg_cv_CAIRO_SVG_CFLAGS + CAIRO_SVG_LIBS=$pkg_cv_CAIRO_SVG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_cairo=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_rsvg" = 'yes'; then + +$as_echo "#define RSVG_DELEGATE 1" >>confdefs.h + + CFLAGS="$RSVG_CFLAGS $CFLAGS" +fi + +if test "$have_cairo" = 'yes'; then + +$as_echo "#define CAIRO_DELEGATE 1" >>confdefs.h + + CFLAGS="$CAIRO_SVG_CFLAGS $CFLAGS" +fi + + if test "$have_rsvg" = 'yes'; then + RSVG_DELEGATE_TRUE= + RSVG_DELEGATE_FALSE='#' +else + RSVG_DELEGATE_TRUE='#' + RSVG_DELEGATE_FALSE= +fi + + if test "$have_cairo" = 'yes'; then + CAIRO_DELEGATE_TRUE= + CAIRO_DELEGATE_FALSE='#' +else + CAIRO_DELEGATE_TRUE='#' + CAIRO_DELEGATE_FALSE= +fi + + + + + +# +# Check for TIFF delegate library. +# + +# Check whether --with-tiff was given. +if test "${with_tiff+set}" = set; then : + withval=$with_tiff; with_tiff=$withval +else + with_tiff='yes' +fi + + +if test "$with_tiff" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-tiff=$with_tiff " +fi + +have_tiff='no' +TIFF_LIBS='' +if test "$with_tiff" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFF" >&5 +$as_echo_n "checking for TIFF... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + failed=0 + passed=0 + ac_fn_c_check_header_mongrel "$LINENO" "tiff.h" "ac_cv_header_tiff_h" "$ac_includes_default" +if test "x$ac_cv_header_tiff_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default" +if test "x$ac_cv_header_tiffio_h" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFOpen in -ltiff" >&5 +$as_echo_n "checking for TIFFOpen in -ltiff... " >&6; } +if ${ac_cv_lib_tiff_TIFFOpen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFOpen (); +int +main () +{ +return TIFFOpen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_tiff_TIFFOpen=yes +else + ac_cv_lib_tiff_TIFFOpen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFOpen" >&5 +$as_echo "$ac_cv_lib_tiff_TIFFOpen" >&6; } +if test "x$ac_cv_lib_tiff_TIFFOpen" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFClientOpen in -ltiff" >&5 +$as_echo_n "checking for TIFFClientOpen in -ltiff... " >&6; } +if ${ac_cv_lib_tiff_TIFFClientOpen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFClientOpen (); +int +main () +{ +return TIFFClientOpen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_tiff_TIFFClientOpen=yes +else + ac_cv_lib_tiff_TIFFClientOpen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFClientOpen" >&5 +$as_echo "$ac_cv_lib_tiff_TIFFClientOpen" >&6; } +if test "x$ac_cv_lib_tiff_TIFFClientOpen" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFIsByteSwapped in -ltiff" >&5 +$as_echo_n "checking for TIFFIsByteSwapped in -ltiff... " >&6; } +if ${ac_cv_lib_tiff_TIFFIsByteSwapped+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFIsByteSwapped (); +int +main () +{ +return TIFFIsByteSwapped (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_tiff_TIFFIsByteSwapped=yes +else + ac_cv_lib_tiff_TIFFIsByteSwapped=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFIsByteSwapped" >&5 +$as_echo "$ac_cv_lib_tiff_TIFFIsByteSwapped" >&6; } +if test "x$ac_cv_lib_tiff_TIFFIsByteSwapped" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFReadRGBATile in -ltiff" >&5 +$as_echo_n "checking for TIFFReadRGBATile in -ltiff... " >&6; } +if ${ac_cv_lib_tiff_TIFFReadRGBATile+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFReadRGBATile (); +int +main () +{ +return TIFFReadRGBATile (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_tiff_TIFFReadRGBATile=yes +else + ac_cv_lib_tiff_TIFFReadRGBATile=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFReadRGBATile" >&5 +$as_echo "$ac_cv_lib_tiff_TIFFReadRGBATile" >&6; } +if test "x$ac_cv_lib_tiff_TIFFReadRGBATile" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFReadRGBAStrip in -ltiff" >&5 +$as_echo_n "checking for TIFFReadRGBAStrip in -ltiff... " >&6; } +if ${ac_cv_lib_tiff_TIFFReadRGBAStrip+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFReadRGBAStrip (); +int +main () +{ +return TIFFReadRGBAStrip (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_tiff_TIFFReadRGBAStrip=yes +else + ac_cv_lib_tiff_TIFFReadRGBAStrip=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFReadRGBAStrip" >&5 +$as_echo "$ac_cv_lib_tiff_TIFFReadRGBAStrip" >&6; } +if test "x$ac_cv_lib_tiff_TIFFReadRGBAStrip" = xyes; then : + passed=`expr $passed + 1` +else + failed=`expr $failed + 1` +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if TIFF package is complete" >&5 +$as_echo_n "checking if TIFF package is complete... " >&6; } + if test $passed -gt 0; then + if test $failed -gt 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_tiff='no (failed tests)' + else + TIFF_LIBS='-ltiff' + LIBS="$TIFF_LIBS $LIBS" + +$as_echo "#define TIFF_DELEGATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_tiff='yes' + for ac_header in tiffconf.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "tiffconf.h" "ac_cv_header_tiffconf_h" "$ac_includes_default" +if test "x$ac_cv_header_tiffconf_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_TIFFCONF_H 1 +_ACEOF + +fi + +done + + for ac_func in TIFFIsCODECConfigured TIFFMergeFieldInfo \ + TIFFIsBigEndian TIFFSetErrorHandlerExt TIFFSetTagExtender \ + TIFFReadEXIFDirectory TIFFReadGPSDirectory \ + TIFFSetWarningHandlerExt TIFFSwabArrayOfTriples +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + if test "$have_tiff" = 'yes'; then + TIFF_DELEGATE_TRUE= + TIFF_DELEGATE_FALSE='#' +else + TIFF_DELEGATE_TRUE='#' + TIFF_DELEGATE_FALSE= +fi + + + + +# +# Set URW Base35 font directory. +# + +# Check whether --with-urw-base35-font-dir was given. +if test "${with_urw_base35_font_dir+set}" = set; then : + withval=$with_urw_base35_font_dir; with_urw_base35_font_dir=$withval +else + with_urw_base35_font_dir='default' +fi + + +if test "$with_urw_base35_font_dir" != 'default'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-urw-base35-font-dir=$with_urw_base35_font_dir " +fi + + +# +# Check for the WEBP delegate library. +# + +# Check whether --with-webp was given. +if test "${with_webp+set}" = set; then : + withval=$with_webp; with_webp=$withval +else + with_webp='yes' +fi + + +if test "$with_webp" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-webp=$with_webp " +fi + +have_webp='no' +have_webpmux='no' +WEBP_CFLAGS="" +WEBP_LIBS="" +WEBP_PKG="" +WEBPMUX_CFLAGS="" +WEBPMUX_LIBS="" +WEBPMUX_PKG="" +if test "x$with_webp" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libwebp >= 0.4.1" >&5 +$as_echo_n "checking for libwebp >= 0.4.1... " >&6; } + +if test -n "$WEBP_CFLAGS"; then + pkg_cv_WEBP_CFLAGS="$WEBP_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libwebp >= 0.4.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libwebp >= 0.4.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_WEBP_CFLAGS=`$PKG_CONFIG --cflags "libwebp >= 0.4.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$WEBP_LIBS"; then + pkg_cv_WEBP_LIBS="$WEBP_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libwebp >= 0.4.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libwebp >= 0.4.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_WEBP_LIBS=`$PKG_CONFIG --libs "libwebp >= 0.4.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + WEBP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libwebp >= 0.4.1" 2>&1` + else + WEBP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libwebp >= 0.4.1" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$WEBP_PKG_ERRORS" >&5 + + have_webp=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_webp=no +else + WEBP_CFLAGS=$pkg_cv_WEBP_CFLAGS + WEBP_LIBS=$pkg_cv_WEBP_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_webp=yes +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0" >&5 +$as_echo_n "checking for libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0... " >&6; } + +if test -n "$WEBPMUX_CFLAGS"; then + pkg_cv_WEBPMUX_CFLAGS="$WEBPMUX_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_WEBPMUX_CFLAGS=`$PKG_CONFIG --cflags "libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$WEBPMUX_LIBS"; then + pkg_cv_WEBPMUX_LIBS="$WEBPMUX_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_WEBPMUX_LIBS=`$PKG_CONFIG --libs "libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + WEBPMUX_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0" 2>&1` + else + WEBPMUX_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$WEBPMUX_PKG_ERRORS" >&5 + + have_webpmux=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_webpmux=no +else + WEBPMUX_CFLAGS=$pkg_cv_WEBPMUX_CFLAGS + WEBPMUX_LIBS=$pkg_cv_WEBPMUX_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_webpmux=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_webp" = 'yes'; then + +$as_echo "#define WEBP_DELEGATE 1" >>confdefs.h + + CFLAGS="$WEBP_CFLAGS $CFLAGS" +fi + +if test "$have_webpmux" = 'yes'; then + +$as_echo "#define WEBPMUX_DELEGATE 1" >>confdefs.h + + CFLAGS="$WEBPMUX_CFLAGS $CFLAGS" +fi + + if test "$have_webp" = 'yes'; then + WEBP_DELEGATE_TRUE= + WEBP_DELEGATE_FALSE='#' +else + WEBP_DELEGATE_TRUE='#' + WEBP_DELEGATE_FALSE= +fi + + if test "$have_webpmux" = 'yes'; then + WEBPMUX_DELEGATE_TRUE= + WEBPMUX_DELEGATE_FALSE='#' +else + WEBPMUX_DELEGATE_TRUE='#' + WEBPMUX_DELEGATE_FALSE= +fi + + + + + + + +# +# Set Windows font directory. +# + +# Check whether --with-windows-font-dir was given. +if test "${with_windows_font_dir+set}" = set; then : + withval=$with_windows_font_dir; with_windows_font_dir=$withval +else + with_windows_font_dir='default' +fi + + +if test "$with_windows_font_dir" != 'default'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-windows-font-dir=$with_windows_font_dir " +fi + + +# +# Check for WMF delegate library. +# + +# Check whether --with-wmf was given. +if test "${with_wmf+set}" = set; then : + withval=$with_wmf; with_wmf=$withval +else + with_wmf=$build_modules +fi + + +if test "$with_wmf" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-wmf=$with_wmf " +fi + +have_wmf='no' +WMF_LIBS='' +WMF_CFLAGS='' +OLIBS="$LIBS" +if test "$with_wmf" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WMF support" >&5 +$as_echo_n "checking for WMF support... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + + have_libwmflite='no' + have_libwmf_ipa_h='no' + + ac_fn_c_check_header_compile "$LINENO" "libwmf/ipa.h" "ac_cv_header_libwmf_ipa_h" "$FT2BUILD_H +" +if test "x$ac_cv_header_libwmf_ipa_h" = xyes; then : + have_libwmf_ipa_h='yes' +fi + + + if test "$have_libwmf_ipa_h" = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wmf_lite_create in -lwmflite" >&5 +$as_echo_n "checking for wmf_lite_create in -lwmflite... " >&6; } +if ${ac_cv_lib_wmflite_wmf_lite_create+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lwmflite $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char wmf_lite_create (); +int +main () +{ +return wmf_lite_create (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_wmflite_wmf_lite_create=yes +else + ac_cv_lib_wmflite_wmf_lite_create=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_wmflite_wmf_lite_create" >&5 +$as_echo "$ac_cv_lib_wmflite_wmf_lite_create" >&6; } +if test "x$ac_cv_lib_wmflite_wmf_lite_create" = xyes; then : + have_libwmflite='yes' +fi + + if test "$have_libwmflite" = 'yes'; then + +$as_echo "#define WMF_DELEGATE 1" >>confdefs.h + + WMF_LIBS='-lwmflite' + LIBS="$WMF_LIBS $LIBS" + have_wmf='yes' + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +$as_echo "no -- some components failed test" >&6; } + have_wmf='no (failed tests)' + have_wmflite='no (failed tests)' + LIBS="$OLIBS" + WMF_LIBS='' + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if WMF package is complete" >&5 +$as_echo_n "checking if WMF package is complete... " >&6; } +if test "$have_wmf" = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + if test "$have_wmf" = 'yes'; then + WMF_DELEGATE_TRUE= + WMF_DELEGATE_FALSE='#' +else + WMF_DELEGATE_TRUE='#' + WMF_DELEGATE_FALSE= +fi + + + + + +# +# Check for XML delegate library. +# + +# Check whether --with-xml was given. +if test "${with_xml+set}" = set; then : + withval=$with_xml; with_xml=$withval +else + with_xml='yes' +fi + + +if test "$with_xml" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-xml=$with_xml " +fi + +have_xml='no' +XML_CFLAGS="" +XML_LIBS="" +XML_PKG="" +if test "x$with_xml" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libxml-2.0 >= 2.0.0" >&5 +$as_echo_n "checking for libxml-2.0 >= 2.0.0... " >&6; } + +if test -n "$XML_CFLAGS"; then + pkg_cv_XML_CFLAGS="$XML_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_XML_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0 >= 2.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$XML_LIBS"; then + pkg_cv_XML_LIBS="$XML_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_XML_LIBS=`$PKG_CONFIG --libs "libxml-2.0 >= 2.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + XML_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libxml-2.0 >= 2.0.0" 2>&1` + else + XML_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libxml-2.0 >= 2.0.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$XML_PKG_ERRORS" >&5 + + have_xml=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_xml=no +else + XML_CFLAGS=$pkg_cv_XML_CFLAGS + XML_LIBS=$pkg_cv_XML_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_xml=yes +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +fi + +if test "$have_xml" = 'yes'; then + +$as_echo "#define XML_DELEGATE 1" >>confdefs.h + + CFLAGS="$XML_CFLAGS $CFLAGS" +fi + + if test "$have_xml" = 'yes'; then + XML_DELEGATE_TRUE= + XML_DELEGATE_FALSE='#' +else + XML_DELEGATE_TRUE='#' + XML_DELEGATE_FALSE= +fi + + + + + +# Check for functions +# +for ac_func in acosh _aligned_malloc aligned_malloc asinh atanh atoll atexit cabs carg cimag creal clock clock_getres clock_gettime ctime_r directio erf _exit execvp fchmod floor fork ftime ftruncate getc_unlocked getcwd getentropy getexecname getdtablesize getpagesize getpid getpwnam_r getrlimit getrusage gettimeofday gmtime_r isnan j0 j1 lltostr localtime_r lstat mkdir memmove memset mkstemp munmap nanosleep newlocale _NSGetExecutablePath pclose _pclose poll popen _popen posix_fadvise posix_fallocate posix_madvise posix_memalign posix_spawnp pow pread pwrite qsort_r raise rand_r readlink realpath select seekdir sendfile setlocale socket sqrt setvbuf stat strcasestr strchr strrchr strcspn strdup strpbrk strspn strstr strtod strtod_l strtol strtoul symlink sysconf sigemptyset sigaction spawnvp strerror strlcat strlcpy strcasecmp strncasecmp system telldir tempnam times ulltostr uselocale usleep utime vfprintf vfprintf_l vsprintf vsnprintf vsnprintf_l waitpid _wfopen _wstat +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +# Substitute compiler name to build/link PerlMagick +# + + +# +# Configure install Paths +# + +# Path to ImageMagick header files +INCLUDE_RELATIVE_PATH="${PACKAGE_NAME}-${MAGICK_MAJOR_VERSION}" +INCLUDE_PATH="${INCLUDE_DIR}/${INCLUDE_RELATIVE_PATH}" +DEFINE_INCLUDE_PATH="${INCLUDE_DIR}/${INCLUDE_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_INCLUDE_PATH=`$WinPathScript "$DEFINE_INCLUDE_PATH" 1` + ;; +esac + +cat >>confdefs.h <<_ACEOF +#define INCLUDE_PATH "$DEFINE_INCLUDE_PATH" +_ACEOF + + + +# Path to ImageMagick header files (arch part) +INCLUDEARCH_PATH="${INCLUDEARCH_DIR}/${INCLUDE_RELATIVE_PATH}" +DEFINE_INCLUDEARCH_PATH="${INCLUDEARCH_DIR}/${INCLUDE_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_INCLUDEARCH_PATH=`$WinPathScript "$DEFINE_INCLUDEARCH_PATH" 1` + ;; +esac + +cat >>confdefs.h <<_ACEOF +#define INCLUDEARCH_PATH "$DEFINE_INCLUDE_PATH" +_ACEOF + + + +# Subdirectory under lib to place ImageMagick lib files +LIBRARY_RELATIVE_PATH="${PACKAGE_NAME}-${PACKAGE_BASE_VERSION}" + +cat >>confdefs.h <<_ACEOF +#define LIBRARY_RELATIVE_PATH "$LIBRARY_RELATIVE_PATH" +_ACEOF + + +# Path to ImageMagick bin directory +EXECUTABLE_PATH="${BIN_DIR}" +DEFINE_EXECUTABLE_PATH="${BIN_DIR}/" +case "${build_os}" in + mingw* ) + DEFINE_EXECUTABLE_PATH=`$WinPathScript "$DEFINE_EXECUTABLE_PATH" 1` + ;; +esac + +cat >>confdefs.h <<_ACEOF +#define EXECUTABLE_PATH "$DEFINE_EXECUTABLE_PATH" +_ACEOF + + + +# Path to ImageMagick lib +LIBRARY_PATH="${LIB_DIR}/${LIBRARY_RELATIVE_PATH}" +DEFINE_LIBRARY_PATH="${LIB_DIR}/${LIBRARY_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_LIBRARY_PATH=`$WinPathScript "$DEFINE_LIBRARY_PATH" 1` + ;; +esac + +cat >>confdefs.h <<_ACEOF +#define LIBRARY_PATH "$DEFINE_LIBRARY_PATH" +_ACEOF + + + +# +# path to local binaries +if test "x$LIB_BIN_BASEDIRNAME" = "x"; then + LIB_BIN_BASEDIRNAME="bin" +fi + +cat >>confdefs.h <<_ACEOF +#define LIB_BIN_BASEDIRNAME "$LIB_BIN_BASEDIRNAME" +_ACEOF + + + +if test "x$LIB_BIN_DIR" = "x"; then + LIB_BIN_DIR=${LIB_BIN_BASEDIRNAME}-${MAGICK_ABI_SUFFIX} +fi + + +LIB_BIN_DIR_RELATIVE_PATH=$LIB_BIN_DIR + +LIB_BIN_DIR_PATH="${LIBRARY_PATH}/${LIB_BIN_DIR_RELATIVE_PATH}" + + +# +# path to modules lib +if test "x$MODULES_BASEDIRNAME" = "x"; then + MODULES_BASEDIRNAME="modules" +fi + +cat >>confdefs.h <<_ACEOF +#define MODULES_BASEDIRNAME "$MODULES_BASEDIRNAME" +_ACEOF + + + +if test "x$MODULES_DIRNAME" = "x"; then + MODULES_DIRNAME=${MODULES_BASEDIRNAME}-${MAGICK_ABI_SUFFIX} +else + +cat >>confdefs.h <<_ACEOF +#define MODULES_DIRNAME "$MODULES_DIRNAME" +_ACEOF + +fi + + +MODULES_RELATIVE_PATH="${MODULES_DIRNAME}" + +MODULES_PATH="${LIBRARY_PATH}/${MODULES_RELATIVE_PATH}" + + +# +# path to coders lib +if test "x$CODER_DIRNAME" = "x"; then + CODER_DIRNAME="coders" +fi + +cat >>confdefs.h <<_ACEOF +#define CODER_DIRNAME "$CODER_DIRNAME" +_ACEOF + + + +CODER_RELATIVE_PATH="${CODER_DIRNAME}" +CODER_PATH="${MODULES_PATH}/${CODER_DIRNAME}" + + +# +# Subdirectory under lib to place ImageMagick filter module files +# +# path to coders lib +if test "x$FILTER_DIRNAME" = "x"; then + FILTER_DIRNAME="filters" +fi + +cat >>confdefs.h <<_ACEOF +#define FILTER_DIRNAME "$FILTER_DIRNAME" +_ACEOF + + + +FILTER_RELATIVE_PATH="${FILTER_DIRNAME}" +FILTER_PATH="${MODULES_PATH}/${FILTER_DIRNAME}" + + +# +# Path to ImageMagick documentation files +DOCUMENTATION_RELATIVE_PATH="${PACKAGE_NAME}-${MAGICK_MAJOR_VERSION}" +DOCUMENTATION_PATH="${DOC_DIR}/${DOCUMENTATION_RELATIVE_PATH}" +DEFINE_DOCUMENTATION_PATH="${DOC_DIR}/${DOCUMENTATION_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_DOCUMENTATION_PATH=`$WinPathScript "$DEFINE_DOCUMENTATION_PATH" 1` + ;; +esac + +cat >>confdefs.h <<_ACEOF +#define DOCUMENTATION_PATH "$DEFINE_DOCUMENTATION_PATH" +_ACEOF + + + +# +# Enable/Disable documentation +# Check whether --enable-docs was given. +if test "${enable_docs+set}" = set; then : + enableval=$enable_docs; wantdocs=$enableval +else + wantdocs=yes +fi + + if test "$wantdocs" = "yes"; then + INSTALL_DOC_TRUE= + INSTALL_DOC_FALSE='#' +else + INSTALL_DOC_TRUE='#' + INSTALL_DOC_FALSE= +fi + + +# Subdirectory to place architecture-dependent configuration files +CONFIGURE_RELATIVE_PATH="${PACKAGE_NAME}-${MAGICK_MAJOR_VERSION}" + +cat >>confdefs.h <<_ACEOF +#define CONFIGURE_RELATIVE_PATH "$CONFIGURE_RELATIVE_PATH" +_ACEOF + +CONFIGURE_PATH="${SYSCONF_DIR}/${CONFIGURE_RELATIVE_PATH}/" +DEFINE_CONFIGURE_PATH="${SYSCONF_DIR}/${CONFIGURE_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_CONFIGURE_PATH=`$WinPathScript "$DEFINE_CONFIGURE_PATH" 1` + ;; +esac + +cat >>confdefs.h <<_ACEOF +#define CONFIGURE_PATH "$DEFINE_CONFIGURE_PATH" +_ACEOF + + + +# Subdirectory to place architecture-independent configuration files +SHARE_RELATIVE_PATH="${PACKAGE_NAME}-${MAGICK_MAJOR_VERSION}" + +cat >>confdefs.h <<_ACEOF +#define SHARE_RELATIVE_PATH "$SHARE_RELATIVE_PATH" +_ACEOF + +SHARE_PATH="${DATA_DIR}/${SHARE_RELATIVE_PATH}" +DEFINE_SHARE_PATH="${DATA_DIR}/${SHARE_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_SHARE_PATH=`$WinPathScript "$DEFINE_SHARE_PATH" 1` + ;; +esac + +cat >>confdefs.h <<_ACEOF +#define SHARE_PATH "$DEFINE_SHARE_PATH" +_ACEOF + + + +# +# Subdirectory to place architecture-dependent configuration files. +if test "x$SHAREARCH_BASEDIRNAME" = "x"; then + SHAREARCH_BASEDIRNAME="config" +fi + +cat >>confdefs.h <<_ACEOF +#define SHAREARCH_BASEDIRNAME "$SHAREARCH_BASEDIRNAME" +_ACEOF + + + +if test "x$SHAREARCH_DIRNAME" = "x"; then + SHAREARCH_DIRNAME=${SHAREARCH_BASEDIRNAME}-${MAGICK_ABI_SUFFIX} +else + +cat >>confdefs.h <<_ACEOF +#define SHAREARCH_DIRNAME "$SHAREARCH_DIRNAME" +_ACEOF + +fi + + +SHAREARCH_RELATIVE_PATH="${SHAREARCH_DIRNAME}" + +SHAREARCH_PATH="${LIBRARY_PATH}/${SHAREARCH_RELATIVE_PATH}" + + +# +# program_transform_name is formed for use in a Makefile, so create a +# modified version for use in a shell script. +configure_transform_name=`echo ${program_transform_name} | sed 's,\\$\\$,$,'` + +# Default delegate definitions +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ImageMagick delegate programs" >&5 +$as_echo_n "checking for ImageMagick delegate programs... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +BPGDecodeDelegateDefault='bpgdec' +BPGEncodeDelegateDefault='bpgenc' +BlenderDecodeDelegateDefault='blender' +BrowseDelegateDefault='xdg-open' +DNGDecodeDelegateDefault='ufraw-batch' +DOCDecodeDelegateDefault='libreoffice' +GVCDecodeDelegateDefault='dot' +DVIDecodeDelegateDefault='dvips' +EditorDelegateDefault='xterm' +ConvertDelegateDefault=`echo convert | sed ${configure_transform_name}` +DisplayDelegateDefault=`echo display | sed ${configure_transform_name}` +MogrifyDelegateDefault=`echo mogrify | sed ${configure_transform_name}` +HPGLDecodeDelegateDefault='hp2xx' +HTMLDecodeDelegateDefault='html2ps' +ILBMDecodeDelegateDefault='ilbmtoppm' +ILBMEncodeDelegateDefault='ppmtoilbm' +JXRDecodeDelegateDefault='JxrDecApp' +JXREncodeDelegateDefault='JxrEncApp' +LEPDelegateDefault='lepton' +LPDelegateDefault='lp' +LPRDelegateDefault='lpr' +LaunchDelegateDefault='gimp' +MrSIDDecodeDelegateDefault='mrsidgeodecode' +MVDelegateDefault='mv' +PCLDelegateDefault='pcl6' +if test "$native_win32_build" = 'yes'; then + PSDelegateDefault='gswin32c' +elif test "$gslib_framework" = 'yes'; then + PSDelegateDefault='gsc' +else + PSDelegateDefault='gs' +fi +RMDelegateDefault='rm' +RSVGDecodeDelegateDefault='rsvg-convert' +SVGDecodeDelegateDefault='inkscape' +TextEncodeDelegateDefault='tesseract' +TraceEncodeDelegateDefault='potrace' +VIDEODecodeDelegateDefault='ffmpeg' +VIDEOEncodeDelegateDefault='ffmpeg' +WebPDecodeDelegateDefault='dwebp' +WebPEncodeDelegateDefault='cwebp' +WWWDecodeDelegateDefault='curl' +XPSDelegateDefault='gxps' + +# Search for delegates +# Extract the first word of ""$BPGDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$BPGDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_BPGDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $BPGDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_BPGDecodeDelegate="$BPGDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_BPGDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_BPGDecodeDelegate" && ac_cv_path_BPGDecodeDelegate=""$BPGDecodeDelegateDefault"" + ;; +esac +fi +BPGDecodeDelegate=$ac_cv_path_BPGDecodeDelegate +if test -n "$BPGDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BPGDecodeDelegate" >&5 +$as_echo "$BPGDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$BPGEncodeDelegateDefault"", so it can be a program name with args. +set dummy "$BPGEncodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_BPGEncodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $BPGEncodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_BPGEncodeDelegate="$BPGEncodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_BPGEncodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_BPGEncodeDelegate" && ac_cv_path_BPGEncodeDelegate=""$BPGEncodeDelegateDefault"" + ;; +esac +fi +BPGEncodeDelegate=$ac_cv_path_BPGEncodeDelegate +if test -n "$BPGEncodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BPGEncodeDelegate" >&5 +$as_echo "$BPGEncodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$BlenderDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$BlenderDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_BlenderDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $BlenderDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_BlenderDecodeDelegate="$BlenderDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_BlenderDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_BlenderDecodeDelegate" && ac_cv_path_BlenderDecodeDelegate=""$BlenderDecodeDelegateDefault"" + ;; +esac +fi +BlenderDecodeDelegate=$ac_cv_path_BlenderDecodeDelegate +if test -n "$BlenderDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BlenderDecodeDelegate" >&5 +$as_echo "$BlenderDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +for ac_prog in "$BrowseDelegateDefault" google-chrome firefox konqueror mozilla lynx +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_BrowseDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $BrowseDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_BrowseDelegate="$BrowseDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_BrowseDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +BrowseDelegate=$ac_cv_path_BrowseDelegate +if test -n "$BrowseDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BrowseDelegate" >&5 +$as_echo "$BrowseDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$BrowseDelegate" && break +done +test -n "$BrowseDelegate" || BrowseDelegate=""$BrowseDelegateDefault"" + +# Extract the first word of ""$DNGDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$DNGDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DNGDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DNGDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_DNGDecodeDelegate="$DNGDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DNGDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_DNGDecodeDelegate" && ac_cv_path_DNGDecodeDelegate=""$DNGDecodeDelegateDefault"" + ;; +esac +fi +DNGDecodeDelegate=$ac_cv_path_DNGDecodeDelegate +if test -n "$DNGDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DNGDecodeDelegate" >&5 +$as_echo "$DNGDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$DOCDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$DOCDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DOCDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DOCDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_DOCDecodeDelegate="$DOCDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DOCDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_DOCDecodeDelegate" && ac_cv_path_DOCDecodeDelegate=""$DOCDecodeDelegateDefault"" + ;; +esac +fi +DOCDecodeDelegate=$ac_cv_path_DOCDecodeDelegate +if test -n "$DOCDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOCDecodeDelegate" >&5 +$as_echo "$DOCDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$DVIDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$DVIDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DVIDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DVIDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_DVIDecodeDelegate="$DVIDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DVIDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_DVIDecodeDelegate" && ac_cv_path_DVIDecodeDelegate=""$DVIDecodeDelegateDefault"" + ;; +esac +fi +DVIDecodeDelegate=$ac_cv_path_DVIDecodeDelegate +if test -n "$DVIDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DVIDecodeDelegate" >&5 +$as_echo "$DVIDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$ConvertDelegateDefault"", so it can be a program name with args. +set dummy "$ConvertDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ConvertDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ConvertDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_ConvertDelegate="$ConvertDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ConvertDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_ConvertDelegate" && ac_cv_path_ConvertDelegate=""$ConvertDelegateDefault"" + ;; +esac +fi +ConvertDelegate=$ac_cv_path_ConvertDelegate +if test -n "$ConvertDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ConvertDelegate" >&5 +$as_echo "$ConvertDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$DisplayDelegateDefault"", so it can be a program name with args. +set dummy "$DisplayDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DisplayDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DisplayDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_DisplayDelegate="$DisplayDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DisplayDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_DisplayDelegate" && ac_cv_path_DisplayDelegate=""$DisplayDelegateDefault"" + ;; +esac +fi +DisplayDelegate=$ac_cv_path_DisplayDelegate +if test -n "$DisplayDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DisplayDelegate" >&5 +$as_echo "$DisplayDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$EditorDelegateDefault"", so it can be a program name with args. +set dummy "$EditorDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_EditorDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $EditorDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_EditorDelegate="$EditorDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_EditorDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_EditorDelegate" && ac_cv_path_EditorDelegate=""$EditorDelegateDefault"" + ;; +esac +fi +EditorDelegate=$ac_cv_path_EditorDelegate +if test -n "$EditorDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EditorDelegate" >&5 +$as_echo "$EditorDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$GVCDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$GVCDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GVCDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GVCDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_GVCDecodeDelegate="$GVCDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GVCDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GVCDecodeDelegate" && ac_cv_path_GVCDecodeDelegate=""$GVCDecodeDelegateDefault"" + ;; +esac +fi +GVCDecodeDelegate=$ac_cv_path_GVCDecodeDelegate +if test -n "$GVCDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GVCDecodeDelegate" >&5 +$as_echo "$GVCDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$HPGLDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$HPGLDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_HPGLDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $HPGLDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_HPGLDecodeDelegate="$HPGLDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_HPGLDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_HPGLDecodeDelegate" && ac_cv_path_HPGLDecodeDelegate=""$HPGLDecodeDelegateDefault"" + ;; +esac +fi +HPGLDecodeDelegate=$ac_cv_path_HPGLDecodeDelegate +if test -n "$HPGLDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HPGLDecodeDelegate" >&5 +$as_echo "$HPGLDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$HTMLDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$HTMLDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_HTMLDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $HTMLDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_HTMLDecodeDelegate="$HTMLDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_HTMLDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_HTMLDecodeDelegate" && ac_cv_path_HTMLDecodeDelegate=""$HTMLDecodeDelegateDefault"" + ;; +esac +fi +HTMLDecodeDelegate=$ac_cv_path_HTMLDecodeDelegate +if test -n "$HTMLDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HTMLDecodeDelegate" >&5 +$as_echo "$HTMLDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$ILBMDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$ILBMDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ILBMDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ILBMDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_ILBMDecodeDelegate="$ILBMDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ILBMDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_ILBMDecodeDelegate" && ac_cv_path_ILBMDecodeDelegate=""$ILBMDecodeDelegateDefault"" + ;; +esac +fi +ILBMDecodeDelegate=$ac_cv_path_ILBMDecodeDelegate +if test -n "$ILBMDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ILBMDecodeDelegate" >&5 +$as_echo "$ILBMDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$ILBMEncodeDelegateDefault"", so it can be a program name with args. +set dummy "$ILBMEncodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ILBMEncodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ILBMEncodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_ILBMEncodeDelegate="$ILBMEncodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ILBMEncodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_ILBMEncodeDelegate" && ac_cv_path_ILBMEncodeDelegate=""$ILBMEncodeDelegateDefault"" + ;; +esac +fi +ILBMEncodeDelegate=$ac_cv_path_ILBMEncodeDelegate +if test -n "$ILBMEncodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ILBMEncodeDelegate" >&5 +$as_echo "$ILBMEncodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$JXRDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$JXRDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_JXRDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $JXRDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_JXRDecodeDelegate="$JXRDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_JXRDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_JXRDecodeDelegate" && ac_cv_path_JXRDecodeDelegate=""$JXRDecodeDelegateDefault"" + ;; +esac +fi +JXRDecodeDelegate=$ac_cv_path_JXRDecodeDelegate +if test -n "$JXRDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JXRDecodeDelegate" >&5 +$as_echo "$JXRDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$JXREncodeDelegateDefault"", so it can be a program name with args. +set dummy "$JXREncodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_JXREncodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $JXREncodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_JXREncodeDelegate="$JXREncodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_JXREncodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_JXREncodeDelegate" && ac_cv_path_JXREncodeDelegate=""$JXREncodeDelegateDefault"" + ;; +esac +fi +JXREncodeDelegate=$ac_cv_path_JXREncodeDelegate +if test -n "$JXREncodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JXREncodeDelegate" >&5 +$as_echo "$JXREncodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$LEPDelegateDefault"", so it can be a program name with args. +set dummy "$LEPDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_LEPDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $LEPDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_LEPDelegate="$LEPDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LEPDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_LEPDelegate" && ac_cv_path_LEPDelegate=""$LEPDelegateDefault"" + ;; +esac +fi +LEPDelegate=$ac_cv_path_LEPDelegate +if test -n "$LEPDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEPDelegate" >&5 +$as_echo "$LEPDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$LPDelegateDefault"", so it can be a program name with args. +set dummy "$LPDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_LPDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $LPDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_LPDelegate="$LPDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LPDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_LPDelegate" && ac_cv_path_LPDelegate="no" + ;; +esac +fi +LPDelegate=$ac_cv_path_LPDelegate +if test -n "$LPDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LPDelegate" >&5 +$as_echo "$LPDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$LPRDelegateDefault"", so it can be a program name with args. +set dummy "$LPRDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_LPRDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $LPRDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_LPRDelegate="$LPRDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LPRDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_LPRDelegate" && ac_cv_path_LPRDelegate=""$LPRDelegateDefault"" + ;; +esac +fi +LPRDelegate=$ac_cv_path_LPRDelegate +if test -n "$LPRDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LPRDelegate" >&5 +$as_echo "$LPRDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$LaunchDelegateDefault"", so it can be a program name with args. +set dummy "$LaunchDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_LaunchDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $LaunchDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_LaunchDelegate="$LaunchDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LaunchDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_LaunchDelegate" && ac_cv_path_LaunchDelegate=""$LaunchDelegateDefault"" + ;; +esac +fi +LaunchDelegate=$ac_cv_path_LaunchDelegate +if test -n "$LaunchDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LaunchDelegate" >&5 +$as_echo "$LaunchDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$MogrifyDelegateDefault"", so it can be a program name with args. +set dummy "$MogrifyDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MogrifyDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MogrifyDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_MogrifyDelegate="$MogrifyDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_MogrifyDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_MogrifyDelegate" && ac_cv_path_MogrifyDelegate=""$MogrifyDelegateDefault"" + ;; +esac +fi +MogrifyDelegate=$ac_cv_path_MogrifyDelegate +if test -n "$MogrifyDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MogrifyDelegate" >&5 +$as_echo "$MogrifyDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$VIDEODecodeDelegateDefault"", so it can be a program name with args. +set dummy "$VIDEODecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_VIDEODecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $VIDEODecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_VIDEODecodeDelegate="$VIDEODecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_VIDEODecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_VIDEODecodeDelegate" && ac_cv_path_VIDEODecodeDelegate=""$VIDEODecodeDelegateDefault"" + ;; +esac +fi +VIDEODecodeDelegate=$ac_cv_path_VIDEODecodeDelegate +if test -n "$VIDEODecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VIDEODecodeDelegate" >&5 +$as_echo "$VIDEODecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$VIDEOEncodeDelegateDefault"", so it can be a program name with args. +set dummy "$VIDEOEncodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_VIDEOEncodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $VIDEOEncodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_VIDEOEncodeDelegate="$VIDEOEncodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_VIDEOEncodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_VIDEOEncodeDelegate" && ac_cv_path_VIDEOEncodeDelegate=""$VIDEOEncodeDelegateDefault"" + ;; +esac +fi +VIDEOEncodeDelegate=$ac_cv_path_VIDEOEncodeDelegate +if test -n "$VIDEOEncodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VIDEOEncodeDelegate" >&5 +$as_echo "$VIDEOEncodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$MrSIDDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$MrSIDDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MrSIDDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MrSIDDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_MrSIDDecodeDelegate="$MrSIDDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_MrSIDDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_MrSIDDecodeDelegate" && ac_cv_path_MrSIDDecodeDelegate=""$MrSIDDecodeDelegateDefault"" + ;; +esac +fi +MrSIDDecodeDelegate=$ac_cv_path_MrSIDDecodeDelegate +if test -n "$MrSIDDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MrSIDDecodeDelegate" >&5 +$as_echo "$MrSIDDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$MVDelegateDefault"", so it can be a program name with args. +set dummy "$MVDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MVDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MVDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_MVDelegate="$MVDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_MVDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_MVDelegate" && ac_cv_path_MVDelegate=""$MVDelegateDefault"" + ;; +esac +fi +MVDelegate=$ac_cv_path_MVDelegate +if test -n "$MVDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MVDelegate" >&5 +$as_echo "$MVDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$PCLDelegateDefault"", so it can be a program name with args. +set dummy "$PCLDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PCLDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PCLDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_PCLDelegate="$PCLDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PCLDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_PCLDelegate" && ac_cv_path_PCLDelegate=""$PCLDelegateDefault"" + ;; +esac +fi +PCLDelegate=$ac_cv_path_PCLDelegate +if test -n "$PCLDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCLDelegate" >&5 +$as_echo "$PCLDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +for ac_prog in gsx gsc "$PSDelegateDefault" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PSDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PSDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_PSDelegate="$PSDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PSDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PSDelegate=$ac_cv_path_PSDelegate +if test -n "$PSDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PSDelegate" >&5 +$as_echo "$PSDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PSDelegate" && break +done +test -n "$PSDelegate" || PSDelegate=""$PSDelegateDefault"" + +# Extract the first word of ""$RMDelegateDefault"", so it can be a program name with args. +set dummy "$RMDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_RMDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $RMDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_RMDelegate="$RMDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_RMDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_RMDelegate" && ac_cv_path_RMDelegate=""$RMDelegateDefault"" + ;; +esac +fi +RMDelegate=$ac_cv_path_RMDelegate +if test -n "$RMDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RMDelegate" >&5 +$as_echo "$RMDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$RSVGDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$RSVGDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_RSVGDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $RSVGDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_RSVGDecodeDelegate="$RSVGDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_RSVGDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_RSVGDecodeDelegate" && ac_cv_path_RSVGDecodeDelegate=""$RSVGDecodeDelegateDefault"" + ;; +esac +fi +RSVGDecodeDelegate=$ac_cv_path_RSVGDecodeDelegate +if test -n "$RSVGDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RSVGDecodeDelegate" >&5 +$as_echo "$RSVGDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$SVGDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$SVGDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_SVGDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $SVGDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_SVGDecodeDelegate="$SVGDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SVGDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_SVGDecodeDelegate" && ac_cv_path_SVGDecodeDelegate=""$SVGDecodeDelegateDefault"" + ;; +esac +fi +SVGDecodeDelegate=$ac_cv_path_SVGDecodeDelegate +if test -n "$SVGDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SVGDecodeDelegate" >&5 +$as_echo "$SVGDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$TextEncodeDelegateDefault"", so it can be a program name with args. +set dummy "$TextEncodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_TextEncodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $TextEncodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_TextEncodeDelegate="$TextEncodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_TextEncodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_TextEncodeDelegate" && ac_cv_path_TextEncodeDelegate=""$TextEncodeDelegateDefault"" + ;; +esac +fi +TextEncodeDelegate=$ac_cv_path_TextEncodeDelegate +if test -n "$TextEncodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TextEncodeDelegate" >&5 +$as_echo "$TextEncodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$TraceEncodeDelegateDefault"", so it can be a program name with args. +set dummy "$TraceEncodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_TraceEncodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $TraceEncodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_TraceEncodeDelegate="$TraceEncodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_TraceEncodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_TraceEncodeDelegate" && ac_cv_path_TraceEncodeDelegate=""$TraceEncodeDelegateDefault"" + ;; +esac +fi +TraceEncodeDelegate=$ac_cv_path_TraceEncodeDelegate +if test -n "$TraceEncodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TraceEncodeDelegate" >&5 +$as_echo "$TraceEncodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$WebPDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$WebPDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_WebPDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $WebPDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_WebPDecodeDelegate="$WebPDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_WebPDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_WebPDecodeDelegate" && ac_cv_path_WebPDecodeDelegate=""$WebPDecodeDelegateDefault"" + ;; +esac +fi +WebPDecodeDelegate=$ac_cv_path_WebPDecodeDelegate +if test -n "$WebPDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WebPDecodeDelegate" >&5 +$as_echo "$WebPDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$WebPEncodeDelegateDefault"", so it can be a program name with args. +set dummy "$WebPEncodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_WebPEncodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $WebPEncodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_WebPEncodeDelegate="$WebPEncodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_WebPEncodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_WebPEncodeDelegate" && ac_cv_path_WebPEncodeDelegate=""$WebPEncodeDelegateDefault"" + ;; +esac +fi +WebPEncodeDelegate=$ac_cv_path_WebPEncodeDelegate +if test -n "$WebPEncodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WebPEncodeDelegate" >&5 +$as_echo "$WebPEncodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$WWWDecodeDelegateDefault"", so it can be a program name with args. +set dummy "$WWWDecodeDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_WWWDecodeDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $WWWDecodeDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_WWWDecodeDelegate="$WWWDecodeDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_WWWDecodeDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_WWWDecodeDelegate" && ac_cv_path_WWWDecodeDelegate=""$WWWDecodeDelegateDelegateDefault"" + ;; +esac +fi +WWWDecodeDelegate=$ac_cv_path_WWWDecodeDelegate +if test -n "$WWWDecodeDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WWWDecodeDelegate" >&5 +$as_echo "$WWWDecodeDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of ""$XPSDelegateDefault"", so it can be a program name with args. +set dummy "$XPSDelegateDefault"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XPSDelegate+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $XPSDelegate in + [\\/]* | ?:[\\/]*) + ac_cv_path_XPSDelegate="$XPSDelegate" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_XPSDelegate="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_XPSDelegate" && ac_cv_path_XPSDelegate=""$XPSDelegateDefault"" + ;; +esac +fi +XPSDelegate=$ac_cv_path_XPSDelegate +if test -n "$XPSDelegate"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPSDelegate" >&5 +$as_echo "$XPSDelegate" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +# Prefer lpr to lp; lp needs options tacked on. +if test "$LPRDelegate" != no; then + PrintDelegate="$LPRDelegate" +else + PrintDelegate="$LPDelegate -c -s" +fi + + +# Installed ImageMagick utiltity paths +ConvertDelegate="${BIN_DIR}/${ConvertDelegateDefault}" +DisplayDelegate="${BIN_DIR}/${DisplayDelegateDefault}" +MogrifyDelegate="${BIN_DIR}/${MogrifyDelegateDefault}" + +# Set delegate booleans +have_gs='no' ; if test "$PSDelegate" != "$PSDelegateDefault"; then have_gs='yes'; fi +have_hp2xx='no' ; if test "$HPGLDecodeDelegate" != "$HPGLDecodeDelegateDefault" ; then have_hp2xx='yes'; fi +have_ilbmtoppm='no' ; if test "$ILBMDecodeDelegate" != "$ILBMDecodeDelegateDefault" ; then have_ilbmtoppm='yes'; fi +have_mrsid='no'; if test "$MrSIDDecodeDelegate" != "$MrSIDDecodeDelegateDefault" ; then have_mrsid='yes'; fi +have_pcl='no' ; if test "$PCLDelegate" != "$PCLDelegateDefault"; then have_pcl='yes'; fi +have_ppmtoilbm='no' ; if test "$ILBMEncodeDelegate" != "$ILBMEncodeDelegateDefault" ; then have_ppmtoilbm='yes'; fi +have_video='no'; if test "$VIDEODecodeDelegate" != "$VIDEODecodeDelegateDefault" ; then have_video='yes'; fi +have_xps='no' ; if test "$XPSDelegate" != "$XPSDelegateDefault"; then have_xps='yes'; fi + +# +# Test for font directories +# +type_include_files='' + +# Apple fonts. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Apple fonts directory" >&5 +$as_echo_n "checking for Apple fonts directory... " >&6; } +apple_font_dir='' +if test "${with_apple_font_dir}" != 'default'; then + apple_font_dir="${with_apple_font_dir}/" +else + for font_dir in '/Library/Fonts/'; do + if test -f "${font_dir}Arial.ttf"; then + apple_font_dir="${font_dir}" + break 1 + fi + done +fi +if test "${apple_font_dir}x" != 'x'; then + type_include_files="${type_include_files} "'' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $apple_font_dir" >&5 +$as_echo "$apple_font_dir" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found!" >&5 +$as_echo "not found!" >&6; }; +fi + + +# Dejavu fonts. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Dejavu fonts directory" >&5 +$as_echo_n "checking for Dejavu fonts directory... " >&6; } +dejavu_font_dir='' +if test "${with_dejavu_font_dir}" != 'default'; then + dejavu_font_dir="${with_dejavu_font_dir}/" +else + for font_dir in "${prefix}/share/dejavu/fonts/" '/usr/share/fonts/dejavu/'; do + if test -f "${font_dir}DejaVuSerif.ttf"; then + dejavu_font_dir="${font_dir}" + break 1 + fi + done +fi +if test "${dejavu_font_dir}x" != 'x'; then + type_include_files="${type_include_files} "'' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dejavu_font_dir" >&5 +$as_echo "$dejavu_font_dir" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found!" >&5 +$as_echo "not found!" >&6; }; +fi + + +# Ghostscript +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ghostscript fonts directory" >&5 +$as_echo_n "checking for Ghostscript fonts directory... " >&6; } +ghostscript_font_dir='' +if test "${with_gs_font_dir}" != 'default'; then + ghostscript_font_dir="${with_gs_font_dir}/" +else + if test "${native_win32_build}" = 'yes'; then + # Native Windows Build + for font_dir in "c:\\Program Files\\gs\\fonts\\" "c:\\Program Files \(x86\)\\gs\\fonts\\" "c:\\gs\\fonts\\"; do + if test -f "${font_dir}a010013l.pfb"; then + ghostscript_font_dir="$font_dir" + break 1 + fi + done + if test "${PSDelegate}" != 'gswin32c'; then + ghostscript_font_dir=`echo "${PSDelegate}" | sed -e 's:/gs/.*:/gs:;s:^/::;s/./&:/;s:/:\\\\:g'`"\\fonts\\" + fi + else + # Linux / Mac OS X / Unix Build + for font_dir in "${prefix}/share/ghostscript/fonts/" '/usr/share/fonts/default/Type1/' '/usr/share/ghostscript/fonts/' '/usr/share/fonts/ghostscript/' '/usr/share/fonts/type1/gsfonts/' '/opt/local/share/ghostscript/fonts/' '/sw/share/ghostscript/fonts/' '/System/Library/Frameworks/Ghostscript.framework/Resources/fonts/'; do + if test -f "${font_dir}a010013l.pfb"; then + ghostscript_font_dir="${font_dir}" + break 1 + fi + done + if test "${ghostscript_font_dir}x" = 'x'; then + if test "$PSDelegate" != 'gs'; then + ghostscript_font_dir=`echo "$PSDelegate" | sed -e 's:/bin/gs:/share/ghostscript/fonts:'`"/" + fi + fi + fi +fi +if test "${ghostscript_font_dir}x" != 'x'; then + type_include_files="${type_include_files} "'' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ghostscript_font_dir" >&5 +$as_echo "$ghostscript_font_dir" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found!" >&5 +$as_echo "not found!" >&6; }; +fi + +case "${build_os}" in + mingw* ) + PSDelegate=`$WinPathScript "$PSDelegate" 1` + ;; +esac + +# URW-base35 fonts. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for URW-base35 fonts directory" >&5 +$as_echo_n "checking for URW-base35 fonts directory... " >&6; } +urw_base35_font_dir='' +if test "${with_urw_base35_font_dir}" != 'default'; then + urw_base35_font_dir="${with_urw_base35_font_dir}/" +else + for font_dir in "${prefix}/share/urw-base35/fonts/" '/usr/share/fonts/urw-base35/' '/usr/share/fonts/type1/urw-base35/'; do + if test -f "${font_dir}StandardSymbolsPS.t1"; then + urw_base35_font_dir="${font_dir}" + break 1 + fi + done +fi +if test "${urw_base35_font_dir}x" != 'x'; then + type_include_files="${type_include_files} "'' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $urw_base35_font_dir" >&5 +$as_echo "$urw_base35_font_dir" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found!" >&5 +$as_echo "not found!" >&6; }; +fi + + +# Windows fonts. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows fonts directory" >&5 +$as_echo_n "checking for Windows fonts directory... " >&6; } +windows_font_dir='' +if test "${with_windows_font_dir}" != 'default'; then + windows_font_dir="${with_windows_font_dir}/" +fi +if test "${windows_font_dir}x" != 'x'; then + type_include_files="${type_include_files} "'' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $windows_font_dir" >&5 +$as_echo "$windows_font_dir" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found!" >&5 +$as_echo "not found!" >&6; }; +fi + + + + +# +# Handle case where user doesn't want frozen paths +# +if test "$with_frozenpaths" != 'yes'; then + # Re-set delegate definitions to default (no paths) + BPGDecodeDelegate="$BPGDecodeDelegateDefault" + BPGEncodeDelegate="$BPGEncodeDelegateDefault" + BlenderDecodeDelegate="$BlenderDecodeDelegateDefault" + BrowseDelegate="$BrowseDelegateDefault" + ConvertDelegate="$ConvertDelegateDefault" + DisplayDelegate="$DisplayDelegateDefault" + DNGDecodeDelegate="$DNGDecodeDelegateDefault" + DOCDecodeDelegate="$DOCDecodeDelegateDefault" + DVIDecodeDelegate="$DVIDecodeDelegateDefault" + EditorDelegate="$EditorDelegateDefault" + GVCDecodeDelegate="$GVCDecodeDelegateDefault" + HPGLDecodeDelegate="$HPGLDecodeDelegateDefault" + HTMLDecodeDelegate="$HTMLDecodeDelegateDefault" + ILBMDecodeDelegate="$ILBMDecodeDelegateDefault" + ILBMEncodeDelegate="$ILBMEncodeDelegateDefault" + JXRDecodeDelegate="$JXRDecodeDelegateDefault" + JXREncodeDelegate="$JXREncodeDelegateDefault" + LEPDelegate="$LEPDelegateDefault" + LPDelegate="$LPDelegateDefault" + LaunchDelegate="$LaunchDelegateDefault" + VIDEODecodeDelegate="$VIDEODecodeDelegateDefault" + VIDEOEncodeDelegate="$VIDEOEncodeDelegateDefault" + MogrifyDelegate="$MogrifyDelegateDefault" + MrSIDDecodeDelegate="$MrSIDDecodeDelegateDefault" + PCLDelegate="$PCLDelegateDefault" + PSDelegate="$PSDelegateDefault" + RSVGDecodeDelegate="$RSVGDecodeDelegateDefault" + SVGDecodeDelegate="$SVGDecodeDelegateDefault" + ShowImageDelegate="$ShowImageDelegateDefault" + TextEncodeDelegate="$TextEncodeDelegateDefault" + TraceEncodeDelegate="$TraceEncodeDelegateDefault" + WebPDecodeDelegate="$WebPDecodeDelegateDefault" + WebPEncodeDelegate="$WebPEncodeDelegateDefault" + WWWDecodeDelegate="$WWWDecodeDelegateDefault" + XPSDelegate="$XPSDelegateDefault" +fi + +# Delegate substitutions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# +# RPM support. +# +RPM='' +for ac_prog in gnutar gtar tar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_TAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$TAR"; then + ac_cv_prog_TAR="$TAR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_TAR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +TAR=$ac_cv_prog_TAR +if test -n "$TAR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TAR" >&5 +$as_echo "$TAR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$TAR" && break +done + +for ac_prog in perl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PERL"; then + ac_cv_prog_PERL="$PERL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PERL="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PERL=$ac_cv_prog_PERL +if test -n "$PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 +$as_echo "$PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PERL" && break +done + +for ac_prog in rpmbuild rpm +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RPM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RPM"; then + ac_cv_prog_RPM="$RPM" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RPM="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RPM=$ac_cv_prog_RPM +if test -n "$RPM"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RPM" >&5 +$as_echo "$RPM" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$RPM" && break +done + + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + + if test "x$RPM" != "x"; then + RPM_DELEGATE_TRUE= + RPM_DELEGATE_FALSE='#' +else + RPM_DELEGATE_TRUE='#' + RPM_DELEGATE_FALSE= +fi + + +# +# 7ZIP support (http://p7zip.sourceforge.net/) +# +P7ZIP='' +for ac_prog in 7za +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_P7ZIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$P7ZIP"; then + ac_cv_prog_P7ZIP="$P7ZIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_P7ZIP="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +P7ZIP=$ac_cv_prog_P7ZIP +if test -n "$P7ZIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $P7ZIP" >&5 +$as_echo "$P7ZIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$P7ZIP" && break +done + + + if test "x$P7ZIP" != "x"; then + P7ZIP_DELEGATE_TRUE= + P7ZIP_DELEGATE_FALSE='#' +else + P7ZIP_DELEGATE_TRUE='#' + P7ZIP_DELEGATE_FALSE= +fi + + +# +# ZIP support (http://www.info-zip.org/Zip.html) +# +ZIP='' +for ac_prog in zip +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ZIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ZIP"; then + ac_cv_prog_ZIP="$ZIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ZIP="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ZIP=$ac_cv_prog_ZIP +if test -n "$ZIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5 +$as_echo "$ZIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ZIP" && break +done + + + if test "x$ZIP" != "x"; then + ZIP_DELEGATE_TRUE= + ZIP_DELEGATE_FALSE='#' +else + ZIP_DELEGATE_TRUE='#' + ZIP_DELEGATE_FALSE= +fi + + +# +# GhostPCL related configuration. +# +PCLColorDevice=ppmraw +PCLCMYKDevice=pamcmyk32 +PCLMonoDevice=pbmraw +if test -z "$PCLVersion"; then + PCLVersion='unknown' +fi +if test $have_pcl = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PCL" >&5 +$as_echo_n "checking for PCL... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + # PCLColorDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcl color device" >&5 +$as_echo_n "checking for pcl color device... " >&6; } + if $PCLDelegate -dBATCH -sDEVICE=$PCLColorDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + PCLColorDevice=ppmraw + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCLColorDevice" >&5 +$as_echo "$PCLColorDevice" >&6; } + + # PCLCMYKDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcl CMYK device" >&5 +$as_echo_n "checking for pcl CMYK device... " >&6; } + if $PCLDelegate -dBATCH -sDEVICE=$PCLColorDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + PCLCMYKDevice=$PCLColorDevice + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCLCMYKDevice" >&5 +$as_echo "$PCLCMYKDevice" >&6; } + + # PCLMonoDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcl mono device" >&5 +$as_echo_n "checking for pcl mono device... " >&6; } + if $PCLDelegate -dBATCH -sDEVICE=$PCLMonoDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + PCLMonoDevice=$PCLColorDevice + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCLMonoDevice" >&5 +$as_echo "$PCLMonoDevice" >&6; } +fi + + + + + + +# +# GhostXPS related configuration. +# +XPSColorDevice=ppmraw +XPSCMYKDevice=bmpsep8 +XPSMonoDevice=pbmraw +if test -z "$XPSVersion"; then + XPSVersion='unknown' +fi +if test $have_xps = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XPS" >&5 +$as_echo_n "checking for XPS... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + # XPSColorDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xps color device" >&5 +$as_echo_n "checking for xps color device... " >&6; } + if $XPSDelegate -dBATCH -sDEVICE=$XPSColorDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + XPSColorDevice=ppmraw + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPSColorDevice" >&5 +$as_echo "$XPSColorDevice" >&6; } + + # XPSCMYKDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xps CMYK device" >&5 +$as_echo_n "checking for xps CMYK device... " >&6; } + if $XPSDelegate -dBATCH -sDEVICE=$XPSColorDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + XPSCMYKDevice=$XPSColorDevice + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPSCMYKDevice" >&5 +$as_echo "$XPSCMYKDevice" >&6; } + + # XPSMonoDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xps mono device" >&5 +$as_echo_n "checking for xps mono device... " >&6; } + if $XPSDelegate -dBATCH -sDEVICE=$XPSMonoDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + XPSMonoDevice=$XPSColorDevice + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPSMonoDevice" >&5 +$as_echo "$XPSMonoDevice" >&6; } +fi + + + + + + +# +# Ghostscript related configuration. +# +GSAlphaDevice=pngalpha +GSColorDevice=png16m +GSCMYKDevice=pamcmyk32 +GSMonoDevice=pbmraw +GSPDFDevice=pdfwrite +GSPSDevice=ps2write +GSEPSDevice=eps2write +GSVersion='unknown' +if test $have_gs = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ghostscript" >&5 +$as_echo_n "checking for Ghostscript... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ghostscript version" >&5 +$as_echo_n "checking for Ghostscript version... " >&6; } + if GSVersion=`$PSDelegate --version`; then + : + else + GSVersion=`$PSDelegate --help | sed -e '1q' | awk '{ print $3 }'` + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSVersion" >&5 +$as_echo "$GSVersion" >&6; } + + # GSColorDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gs color device" >&5 +$as_echo_n "checking for gs color device... " >&6; } + if $PSDelegate -q -dBATCH -sDEVICE=$GSColorDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + GSColorDevice=ppmraw + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSColorDevice" >&5 +$as_echo "$GSColorDevice" >&6; } + + # GSAlphaDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gs alpha device" >&5 +$as_echo_n "checking for gs alpha device... " >&6; } + if $PSDelegate -q -dBATCH -sDEVICE=$GSAlphaDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + GSAlphaDevice=$GSColorDevice + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSAlphaDevice" >&5 +$as_echo "$GSAlphaDevice" >&6; } + + # GSCMYKDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gs CMYK device" >&5 +$as_echo_n "checking for gs CMYK device... " >&6; } + if $PSDelegate -q -dBATCH -sDEVICE=$GSCMYKDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + GSCMYKDevice=pam + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSCMYKDevice" >&5 +$as_echo "$GSCMYKDevice" >&6; } + + # GSMonoDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gs mono device" >&5 +$as_echo_n "checking for gs mono device... " >&6; } + if $PSDelegate -q -dBATCH -sDEVICE=$GSMonoDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + GSMonoDevice=$GSColorDevice + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSMonoDevice" >&5 +$as_echo "$GSMonoDevice" >&6; } + + # GSPDFDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gs PDF writing device" >&5 +$as_echo_n "checking for gs PDF writing device... " >&6; } + if $PSDelegate -q -dBATCH -sDEVICE=$GSPDFDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + GSPDFDevice=nodevice + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSPDFDevice" >&5 +$as_echo "$GSPDFDevice" >&6; } + + # GSPSDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gs PS writing device" >&5 +$as_echo_n "checking for gs PS writing device... " >&6; } + if $PSDelegate -q -dBATCH -sDEVICE=$GSPSDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + GSPSDevice=pswrite + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSPSDevice" >&5 +$as_echo "$GSPSDevice" >&6; } + + # GSEPSDevice + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gs EPS writing device" >&5 +$as_echo_n "checking for gs EPS writing device... " >&6; } + if $PSDelegate -q -dBATCH -sDEVICE=$GSEPSDevice -sOutputFile=/dev/null < /dev/null 1>&5 2>&5; then + : + else + GSEPSDevice=epswrite + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSEPSDevice" >&5 +$as_echo "$GSEPSDevice" >&6; } +fi + + + + + + + + + + +# +# PerlMagick-related configuration +# + +# Look for PERL if PerlMagick requested +# If name/path of desired PERL interpreter is specified, look for that one first +have_perl='no' +if test "$with_perl" != 'no'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl" >&5 +$as_echo_n "checking for Perl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + if test "$with_perl" != 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl" >&5 +$as_echo_n "checking for perl... " >&6; } +if ${ac_cv_path_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_path_PERL="$with_perl" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_PERL" >&5 +$as_echo "$ac_cv_path_PERL" >&6; }; + PERL=$ac_cv_path_PERL + have_perl="$ac_cv_path_PERL" + else + for ac_prog in perl perl5 +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_PERL="$PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PERL=$ac_cv_path_PERL +if test -n "$PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 +$as_echo "$PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PERL" && break +done + if test "$ac_cv_path_PERL"; then + have_perl="$ac_cv_path_PERL" + fi + fi +fi + +if test "$with_perl" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-perl=$with_perl " +fi + +PERL_SUPPORTS_DESTDIR='no' + +with_perl_static='no' +with_perl_dynamic='no' +if test "$have_perl" != 'no'; then + if test "$with_perl" != 'no' && test "$libtool_build_shared_libs" = 'no'; then + with_perl_static='yes' + fi + if test "$with_perl" != 'no' && test "$libtool_build_shared_libs" = 'yes'; then + with_perl_dynamic='yes' + fi + # Is PERL's MakeMaker new enough to support DESTDIR? + + + + + if test -n "$PERL"; then : + + ax_perl_version="5.8.1" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl version" >&5 +$as_echo_n "checking for perl version... " >&6; } + + perl_version=`$PERL --version 2>&1 \ + | $SED -n -e '/This is perl/b inspect +b +: inspect +s/.* (\{0,1\}v\([0-9]*\.[0-9]*\.[0-9]*\))\{0,1\} .*/\1/;p'` + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $perl_version" >&5 +$as_echo "$perl_version" >&6; } + + PERL_VERSION=$perl_version + + + + + + # Used to indicate true or false condition + ax_compare_version=false + + # Convert the two version strings to be compared into a format that + # allows a simple string comparison. The end result is that a version + # string of the form 1.12.5-r617 will be converted to the form + # 0001001200050617. In other words, each number is zero padded to four + # digits, and non digits are removed. + + ax_compare_version_A=`echo "$ax_perl_version" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ + -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/[^0-9]//g'` + + + ax_compare_version_B=`echo "$perl_version" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ + -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/[^0-9]//g'` + + + ax_compare_version=`echo "x$ax_compare_version_A +x$ax_compare_version_B" | sed 's/^ *//' | sort | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` + + + + if test "$ax_compare_version" = "true" ; then + + : + PERL_SUPPORTS_DESTDIR='yes' + + else + : + PERL_SUPPORTS_DESTDIR='no' + + fi + + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find the perl interpreter" >&5 +$as_echo "$as_me: WARNING: could not find the perl interpreter" >&2;} + PERL_SUPPORTS_DESTDIR='no' + +fi + +fi + if test "$have_perl" != 'no'; then + WITH_PERL_TRUE= + WITH_PERL_FALSE='#' +else + WITH_PERL_TRUE='#' + WITH_PERL_FALSE= +fi + + if test $with_perl_static = 'yes'; then + WITH_PERL_STATIC_TRUE= + WITH_PERL_STATIC_FALSE='#' +else + WITH_PERL_STATIC_TRUE='#' + WITH_PERL_STATIC_FALSE= +fi + + if test $with_perl_dynamic = 'yes'; then + WITH_PERL_DYNAMIC_TRUE= + WITH_PERL_DYNAMIC_FALSE='#' +else + WITH_PERL_DYNAMIC_TRUE='#' + WITH_PERL_DYNAMIC_FALSE= +fi + + + +# Determine path to pick up MagickCore library from for use with building PerlMagick +MAGICKCORE_PATH="${LIB_DIR}" +if test $with_perl_static = 'yes'; then + # Find out where libtool hides its uninstalled libraries (as libtool_objdir) + libtool_objdir=$objdir + + # Linker search path to library, followed by -lMagickCore + MAGICKCORE_PATH="${builddir}/magick/${libtool_objdir}" +fi + + +# Create a simple string containing format names for all delegate libraries. +MAGICK_DELEGATES='' +if test "$have_autotrace" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES autotrace" +fi +if test "$have_bzlib" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES bzlib" +fi +if test "$have_dps" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES dps" +fi +if test "$have_djvu" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES djvu" +fi +if test "$have_fftw" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES fftw" +fi +if test "$have_flif" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES flif" +fi +if test "$have_fpx" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES fpx" +fi +if test "$have_fontconfig" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES fontconfig" +fi +if test "$have_freetype" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES freetype" +fi +if test "$have_gslib" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES gslib" +fi +if test "$have_heic" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES heic" +fi +if test "$have_jbig" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES jbig" +fi +if test "$have_png$have_jpeg" = 'yesyes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES jng" +fi +if test "$have_jpeg" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES jpeg" +fi +if test "$have_jxl" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES jxl" +fi +if test "$have_lcms" = 'yes' || test "$have_lcms2" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES lcms" +fi +if test "$have_lqr" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES lqr" +fi +if test "$have_lzma" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES lzma" +fi +if test "$have_openexr" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES openexr" +fi +if test "$have_openjp2" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES openjp2" +fi +if test "$have_pango" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES pango" +fi +if test "$have_png" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES png" +fi +have_ps='no' +if test "$have_dps" = 'yes' || \ + test "$have_gs" = 'yes' || \ + test "${native_win32_build}" = 'yes' ; then + have_ps='yes' +fi +if test "$have_ps" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES ps" +fi +if test "$have_raqm" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES raqm" +fi +if test "$have_raw" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES raw" +fi +if test "$have_ra_ppm" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES rad" +fi +if test "$have_rsvg" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES rsvg" +fi +if test "$have_tiff" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES tiff" +fi +if test "$have_ttf" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES ttf" +fi +if test "$have_video" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES video" +fi +if test "$have_webp" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES webp" +fi +if test "$have_wmf" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES wmf" +fi +if test "$have_x" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES x" +fi +if test "$have_xml" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES xml" +fi +if test "$have_zlib" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES zlib" +fi +if test "$have_zstd" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES zstd" +fi + +# Remove extraneous spaces from output variables (asthetic) +MAGICK_DELEGATES=`echo $MAGICK_DELEGATES | sed -e 's/ */ /g'` +MAGICK_FEATURES=`echo $MAGICK_FEATURES | sed -e 's/ */ /g'` + + + +# +# Handle special compiler flags +# + +# Add '-p' if prof source profiling support enabled +if test "$enable_prof" = 'yes'; then + CFLAGS="-p $CFLAGS" + CXXFLAGS="-p $CXXFLAGS" + LDFLAGS="-p $LDFLAGS" +fi + +# Add '-pg' if gprof source profiling support enabled +if test "$enable_gprof" = 'yes'; then + CFLAGS="-pg $CFLAGS" + CXXFLAGS="-pg $CXXFLAGS" + LDFLAGS="-pg $LDFLAGS" +fi + +# Add '-ftest-coverage -fprofile-arcs' if gcov source profiling support enabled +# This is a gcc-specific feature +if test "$enable_gcov" = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _gcov_init in -lgcov" >&5 +$as_echo_n "checking for _gcov_init in -lgcov... " >&6; } +if ${ac_cv_lib_gcov__gcov_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgcov $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char _gcov_init (); +int +main () +{ +return _gcov_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gcov__gcov_init=yes +else + ac_cv_lib_gcov__gcov_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcov__gcov_init" >&5 +$as_echo "$ac_cv_lib_gcov__gcov_init" >&6; } +if test "x$ac_cv_lib_gcov__gcov_init" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGCOV 1 +_ACEOF + + LIBS="-lgcov $LIBS" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gcov_init in -lgcov" >&5 +$as_echo_n "checking for __gcov_init in -lgcov... " >&6; } +if ${ac_cv_lib_gcov___gcov_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgcov $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char __gcov_init (); +int +main () +{ +return __gcov_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gcov___gcov_init=yes +else + ac_cv_lib_gcov___gcov_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcov___gcov_init" >&5 +$as_echo "$ac_cv_lib_gcov___gcov_init" >&6; } +if test "x$ac_cv_lib_gcov___gcov_init" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGCOV 1 +_ACEOF + + LIBS="-lgcov $LIBS" + +fi + + case "$target_os" in + darwin*) + OSX_GCOV_LDFLAG="-Wl,-single_module" + ;; + *) + OSX_GCOV_LDFLAG="" + ;; + esac + + CFLAGS="-ftest-coverage -fprofile-arcs $CFLAGS" + CXXFLAGS="-ftest-coverage -fprofile-arcs $CXXFLAGS" + LDFLAGS="-ftest-coverage -fprofile-arcs $LDFLAGS" +fi + +# +# Build library dependency list for libMagickCore +# + +if test "$build_modules" != 'no'; then + MAGICK_DEP_LIBS="$USER_LIBS $LCMS_LIBS $FREETYPE_LIBS $RAQM_LIBS $LQR_LIBS $FFTW_LIBS $XML_LIBS $FLIF_LIBS $FONTCONFIG_LIBS $XEXT_LIBS $IPC_LIBS $X11_LIBS $XT_LIBS $BZLIB_LIBS $ZLIB_LIBS $ZSTD_LIBS $LTDL_LIBS $GDI32_LIBS $MATH_LIBS $CL_LIBS $UMEM_LIBS $JEMALLOC_LIBS $THREAD_LIBS $TCMALLOC_LIBS" +else + MAGICK_DEP_LIBS="$USER_LIBS $JBIG_LIBS $LCMS_LIBS $TIFF_LIBS $FREETYPE_LIBS $RAQM_LIBS $JPEG_LIBS $JXL_LIBS $GS_LIBS $LQR_LIBS $PNG_LIBS $AUTOTRACE_LIBS $DJVU_LIBS $FFTW_LIBS $FLIF_LIBS $FPX_LIBS $FONTCONFIG_LIBS $HEIF_LIBS $WEBPMUX_LIBS $WEBP_LIBS $WMF_LIBS $DPS_LIBS $XEXT_LIBS $XT_LIBS $IPC_LIBS $X11_LIBS $LZMA_LIBS $BZLIB_LIBS $OPENEXR_LIBS $LIBOPENJP2_LIBS $PANGO_LIBS $RAW_R_LIBS $RSVG_LIBS $XML_LIBS $GVC_LIBS $ZLIB_LIBS $ZSTD_LIBS $LTDL_LIBS $GDI32_LIBS $MATH_LIBS $CL_LIBS $UMEM_LIBS $JEMALLOC_LIBS $THREAD_LIBS $TCMALLOC_LIBS" +fi +MAGICK_EXTRA_DEP_LIBS="$GOMP_LIBS" + + + +# Pass only user-provided LIBS as "global" libraries +LIBS=$USER_LIBS + +#AC_SUBST([CPPFLAGS]) + +#AC_SUBST([LDFLAGS]) +#AC_SUBST([X_PRE_LIBS]) +#AC_SUBST([X_LIBS]) +#AC_SUBST([X_EXTRA_LIBS]) + +MAGICK_CFLAGS=$CFLAGS +MAGICK_CXXFLAGS="$CXXFLAGS" +MAGICK_CPPFLAGS=`echo $MAGICK_CPPFLAGS | sed -e 's/ */ /g'` +MAGICK_PCFLAGS=`echo $MAGICK_PCFLAGS | sed -e 's/ */ /g'` +MAGICK_LDFLAGS="-L$LIB_DIR $LDFLAGS" +MAGICK_LIBS="$MAGICK_DEP_LIBS $MAGICK_EXTRA_DEP_LIBS" + + + + + + + + +# Set configured scripts to executable. +ac_config_commands="$ac_config_commands default" + +ac_config_commands="$ac_config_commands magick.sh.in" + +ac_config_commands="$ac_config_commands MagickCore-config.in" + +ac_config_commands="$ac_config_commands Magick-config.in" + +ac_config_commands="$ac_config_commands MagickWand-config.in" + +ac_config_commands="$ac_config_commands Wand-config.in" + +ac_config_commands="$ac_config_commands Magick++-config.in" + +ac_config_commands="$ac_config_commands PerlMagick/check.sh.in" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: -------------------------------------------------------------" >&5 +$as_echo "-------------------------------------------------------------" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Update ImageMagick configuration" >&5 +$as_echo "Update ImageMagick configuration" >&6; } + +rm -f magick-version + +result_dejavu_font_dir='none' +if test "${dejavu_font_dir}x" != 'x'; then + result_dejavu_font_dir=$dejavu_font_dir +fi + +result_ghostscript_font_dir='none' +if test "${ghostscript_font_dir}x" != 'x'; then + result_ghostscript_font_dir=$ghostscript_font_dir +fi + +result_urw_base35_font_dir='none' +if test "${urw_base35_font_dir}x" != 'x'; then + result_urw_base35_font_dir=$urw_base35_font_dir +fi + +result_windows_font_dir='none' +if test "${windows_font_dir}x" != 'x'; then + result_windows_font_dir=${windows_font_dir} +fi + +# ============================================================================== +# Generate build environment +# ============================================================================== +ac_config_files="$ac_config_files common.shi config/configure.xml config/delegates.xml config/ImageMagick.rdf config/MagickCore.dox config/MagickWand.dox config/Magick++.dox config/type-apple.xml config/type-dejavu.xml config/type-ghostscript.xml config/type-urw-base35.xml config/type-windows.xml config/type.xml ImageMagick.spec Magick++/bin/Magick++-config magick/ImageMagick.pc Magick++/lib/ImageMagick++.pc Magick++/lib/Magick++.pc magick/Magick-config magick/MagickCore-config magick/MagickCore.pc magick/version.h Makefile magick.sh PerlMagick/check.sh PerlMagick/default/Magick.pm PerlMagick/Makefile.PL PerlMagick/default/Makefile.PL PerlMagick/quantum/Makefile.PL PerlMagick/quantum/quantum.pm PerlMagick/quantum/quantum.xs PerlMagick/quantum/typemap utilities/animate.1 utilities/compare.1 utilities/composite.1 utilities/conjure.1 utilities/convert.1 utilities/display.1 utilities/identify.1 utilities/ImageMagick.1 utilities/import.1 utilities/mogrify.1 utilities/montage.1 utilities/stream.1 wand/MagickWand-config wand/MagickWand.pc wand/Wand-config wand/Wand.pc" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_LD_VERSION_SCRIPT_TRUE}" && test -z "${HAVE_LD_VERSION_SCRIPT_FALSE}"; then + as_fn_error $? "conditional \"HAVE_LD_VERSION_SCRIPT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WIN32_NATIVE_BUILD_TRUE}" && test -z "${WIN32_NATIVE_BUILD_FALSE}"; then + as_fn_error $? "conditional \"WIN32_NATIVE_BUILD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CYGWIN_BUILD_TRUE}" && test -z "${CYGWIN_BUILD_FALSE}"; then + as_fn_error $? "conditional \"CYGWIN_BUILD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_SHARED_LIBS_TRUE}" && test -z "${WITH_SHARED_LIBS_FALSE}"; then + as_fn_error $? "conditional \"WITH_SHARED_LIBS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_MODULES_TRUE}" && test -z "${WITH_MODULES_FALSE}"; then + as_fn_error $? "conditional \"WITH_MODULES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE}" && test -z "${MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_FALSE}"; then + as_fn_error $? "conditional \"MAGICKCORE_ZERO_CONFIGURATION_SUPPORT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LEGACY_SUPPORT_TRUE}" && test -z "${LEGACY_SUPPORT_FALSE}"; then + as_fn_error $? "conditional \"LEGACY_SUPPORT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_MAGICK_PLUS_PLUS_TRUE}" && test -z "${WITH_MAGICK_PLUS_PLUS_FALSE}"; then + as_fn_error $? "conditional \"WITH_MAGICK_PLUS_PLUS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_JEMALLOC_TRUE}" && test -z "${HAVE_JEMALLOC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_JEMALLOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_TCMALLOC_TRUE}" && test -z "${HAVE_TCMALLOC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_TCMALLOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_UMEM_TRUE}" && test -z "${HAVE_UMEM_FALSE}"; then + as_fn_error $? "conditional \"HAVE_UMEM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BZLIB_DELEGATE_TRUE}" && test -z "${BZLIB_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"BZLIB_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${X11_DELEGATE_TRUE}" && test -z "${X11_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"X11_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ZLIB_DELEGATE_TRUE}" && test -z "${ZLIB_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"ZLIB_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ZSTD_DELEGATE_TRUE}" && test -z "${ZSTD_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"ZSTD_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_LTDL_TRUE}" && test -z "${WITH_LTDL_FALSE}"; then + as_fn_error $? "conditional \"WITH_LTDL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AUTOTRACE_DELEGATE_TRUE}" && test -z "${AUTOTRACE_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"AUTOTRACE_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DPS_DELEGATE_TRUE}" && test -z "${DPS_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"DPS_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${FFTW_DELEGATE_TRUE}" && test -z "${FFTW_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"FFTW_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${FLIF_DELEGATE_TRUE}" && test -z "${FLIF_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"FLIF_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${FPX_DELEGATE_TRUE}" && test -z "${FPX_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"FPX_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DJVU_DELEGATE_TRUE}" && test -z "${DJVU_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"DJVU_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${FONTCONFIG_DELEGATE_TRUE}" && test -z "${FONTCONFIG_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"FONTCONFIG_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${RAQM_DELEGATE_TRUE}" && test -z "${RAQM_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"RAQM_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WINGDI32_DELEGATE_TRUE}" && test -z "${WINGDI32_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"WINGDI32_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GS_DELEGATE_TRUE}" && test -z "${GS_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"GS_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GVC_DELEGATE_TRUE}" && test -z "${GVC_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"GVC_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HEIC_DELEGATE_TRUE}" && test -z "${HEIC_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"HEIC_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${JBIG_DELEGATE_TRUE}" && test -z "${JBIG_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"JBIG_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${JPEG_DELEGATE_TRUE}" && test -z "${JPEG_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"JPEG_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${JXL_DELEGATE_TRUE}" && test -z "${JXL_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"JXL_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LCMS_DELEGATE_TRUE}" && test -z "${LCMS_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"LCMS_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LIBOPENJP2_DELEGATE_TRUE}" && test -z "${LIBOPENJP2_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"LIBOPENJP2_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LQR_DELEGATE_TRUE}" && test -z "${LQR_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"LQR_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LZMA_DELEGATE_TRUE}" && test -z "${LZMA_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"LZMA_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OPENEXR_DELEGATE_TRUE}" && test -z "${OPENEXR_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"OPENEXR_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${PANGO_DELEGATE_TRUE}" && test -z "${PANGO_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"PANGO_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${PANGOCAIRO_DELEGATE_TRUE}" && test -z "${PANGOCAIRO_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"PANGOCAIRO_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${PNG_DELEGATE_TRUE}" && test -z "${PNG_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"PNG_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${RAW_R_DELEGATE_TRUE}" && test -z "${RAW_R_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"RAW_R_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${RSVG_DELEGATE_TRUE}" && test -z "${RSVG_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"RSVG_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_DELEGATE_TRUE}" && test -z "${CAIRO_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${TIFF_DELEGATE_TRUE}" && test -z "${TIFF_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"TIFF_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WEBP_DELEGATE_TRUE}" && test -z "${WEBP_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"WEBP_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WEBPMUX_DELEGATE_TRUE}" && test -z "${WEBPMUX_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"WEBPMUX_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WMF_DELEGATE_TRUE}" && test -z "${WMF_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"WMF_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${XML_DELEGATE_TRUE}" && test -z "${XML_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"XML_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${INSTALL_DOC_TRUE}" && test -z "${INSTALL_DOC_FALSE}"; then + as_fn_error $? "conditional \"INSTALL_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${RPM_DELEGATE_TRUE}" && test -z "${RPM_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"RPM_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${P7ZIP_DELEGATE_TRUE}" && test -z "${P7ZIP_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"P7ZIP_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ZIP_DELEGATE_TRUE}" && test -z "${ZIP_DELEGATE_FALSE}"; then + as_fn_error $? "conditional \"ZIP_DELEGATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_PERL_TRUE}" && test -z "${WITH_PERL_FALSE}"; then + as_fn_error $? "conditional \"WITH_PERL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_PERL_STATIC_TRUE}" && test -z "${WITH_PERL_STATIC_FALSE}"; then + as_fn_error $? "conditional \"WITH_PERL_STATIC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_PERL_DYNAMIC_TRUE}" && test -z "${WITH_PERL_DYNAMIC_FALSE}"; then + as_fn_error $? "conditional \"WITH_PERL_DYNAMIC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by ImageMagick $as_me 6.9.12-44, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to . +ImageMagick home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +ImageMagick config.status 6.9.12-44 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +PACKAGE="$PACKAGE" +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SED \ +GREP \ +EGREP \ +FGREP \ +SHELL \ +ECHO \ +LD \ +AS \ +DLLTOOL \ +OBJDUMP \ +PATH_SEPARATOR \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config/config.h") CONFIG_HEADERS="$CONFIG_HEADERS config/config.h" ;; + "magick/magick-baseconfig.h") CONFIG_COMMANDS="$CONFIG_COMMANDS magick/magick-baseconfig.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + "magick.sh.in") CONFIG_COMMANDS="$CONFIG_COMMANDS magick.sh.in" ;; + "MagickCore-config.in") CONFIG_COMMANDS="$CONFIG_COMMANDS MagickCore-config.in" ;; + "Magick-config.in") CONFIG_COMMANDS="$CONFIG_COMMANDS Magick-config.in" ;; + "MagickWand-config.in") CONFIG_COMMANDS="$CONFIG_COMMANDS MagickWand-config.in" ;; + "Wand-config.in") CONFIG_COMMANDS="$CONFIG_COMMANDS Wand-config.in" ;; + "Magick++-config.in") CONFIG_COMMANDS="$CONFIG_COMMANDS Magick++-config.in" ;; + "PerlMagick/check.sh.in") CONFIG_COMMANDS="$CONFIG_COMMANDS PerlMagick/check.sh.in" ;; + "common.shi") CONFIG_FILES="$CONFIG_FILES common.shi" ;; + "config/configure.xml") CONFIG_FILES="$CONFIG_FILES config/configure.xml" ;; + "config/delegates.xml") CONFIG_FILES="$CONFIG_FILES config/delegates.xml" ;; + "config/ImageMagick.rdf") CONFIG_FILES="$CONFIG_FILES config/ImageMagick.rdf" ;; + "config/MagickCore.dox") CONFIG_FILES="$CONFIG_FILES config/MagickCore.dox" ;; + "config/MagickWand.dox") CONFIG_FILES="$CONFIG_FILES config/MagickWand.dox" ;; + "config/Magick++.dox") CONFIG_FILES="$CONFIG_FILES config/Magick++.dox" ;; + "config/type-apple.xml") CONFIG_FILES="$CONFIG_FILES config/type-apple.xml" ;; + "config/type-dejavu.xml") CONFIG_FILES="$CONFIG_FILES config/type-dejavu.xml" ;; + "config/type-ghostscript.xml") CONFIG_FILES="$CONFIG_FILES config/type-ghostscript.xml" ;; + "config/type-urw-base35.xml") CONFIG_FILES="$CONFIG_FILES config/type-urw-base35.xml" ;; + "config/type-windows.xml") CONFIG_FILES="$CONFIG_FILES config/type-windows.xml" ;; + "config/type.xml") CONFIG_FILES="$CONFIG_FILES config/type.xml" ;; + "ImageMagick.spec") CONFIG_FILES="$CONFIG_FILES ImageMagick.spec" ;; + "Magick++/bin/Magick++-config") CONFIG_FILES="$CONFIG_FILES Magick++/bin/Magick++-config" ;; + "magick/ImageMagick.pc") CONFIG_FILES="$CONFIG_FILES magick/ImageMagick.pc" ;; + "Magick++/lib/ImageMagick++.pc") CONFIG_FILES="$CONFIG_FILES Magick++/lib/ImageMagick++.pc" ;; + "Magick++/lib/Magick++.pc") CONFIG_FILES="$CONFIG_FILES Magick++/lib/Magick++.pc" ;; + "magick/Magick-config") CONFIG_FILES="$CONFIG_FILES magick/Magick-config" ;; + "magick/MagickCore-config") CONFIG_FILES="$CONFIG_FILES magick/MagickCore-config" ;; + "magick/MagickCore.pc") CONFIG_FILES="$CONFIG_FILES magick/MagickCore.pc" ;; + "magick/version.h") CONFIG_FILES="$CONFIG_FILES magick/version.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "magick.sh") CONFIG_FILES="$CONFIG_FILES magick.sh" ;; + "PerlMagick/check.sh") CONFIG_FILES="$CONFIG_FILES PerlMagick/check.sh" ;; + "PerlMagick/default/Magick.pm") CONFIG_FILES="$CONFIG_FILES PerlMagick/default/Magick.pm" ;; + "PerlMagick/Makefile.PL") CONFIG_FILES="$CONFIG_FILES PerlMagick/Makefile.PL" ;; + "PerlMagick/default/Makefile.PL") CONFIG_FILES="$CONFIG_FILES PerlMagick/default/Makefile.PL" ;; + "PerlMagick/quantum/Makefile.PL") CONFIG_FILES="$CONFIG_FILES PerlMagick/quantum/Makefile.PL" ;; + "PerlMagick/quantum/quantum.pm") CONFIG_FILES="$CONFIG_FILES PerlMagick/quantum/quantum.pm" ;; + "PerlMagick/quantum/quantum.xs") CONFIG_FILES="$CONFIG_FILES PerlMagick/quantum/quantum.xs" ;; + "PerlMagick/quantum/typemap") CONFIG_FILES="$CONFIG_FILES PerlMagick/quantum/typemap" ;; + "utilities/animate.1") CONFIG_FILES="$CONFIG_FILES utilities/animate.1" ;; + "utilities/compare.1") CONFIG_FILES="$CONFIG_FILES utilities/compare.1" ;; + "utilities/composite.1") CONFIG_FILES="$CONFIG_FILES utilities/composite.1" ;; + "utilities/conjure.1") CONFIG_FILES="$CONFIG_FILES utilities/conjure.1" ;; + "utilities/convert.1") CONFIG_FILES="$CONFIG_FILES utilities/convert.1" ;; + "utilities/display.1") CONFIG_FILES="$CONFIG_FILES utilities/display.1" ;; + "utilities/identify.1") CONFIG_FILES="$CONFIG_FILES utilities/identify.1" ;; + "utilities/ImageMagick.1") CONFIG_FILES="$CONFIG_FILES utilities/ImageMagick.1" ;; + "utilities/import.1") CONFIG_FILES="$CONFIG_FILES utilities/import.1" ;; + "utilities/mogrify.1") CONFIG_FILES="$CONFIG_FILES utilities/mogrify.1" ;; + "utilities/montage.1") CONFIG_FILES="$CONFIG_FILES utilities/montage.1" ;; + "utilities/stream.1") CONFIG_FILES="$CONFIG_FILES utilities/stream.1" ;; + "wand/MagickWand-config") CONFIG_FILES="$CONFIG_FILES wand/MagickWand-config" ;; + "wand/MagickWand.pc") CONFIG_FILES="$CONFIG_FILES wand/MagickWand.pc" ;; + "wand/Wand-config") CONFIG_FILES="$CONFIG_FILES wand/Wand-config" ;; + "wand/Wand.pc") CONFIG_FILES="$CONFIG_FILES wand/Wand.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "magick/magick-baseconfig.h":C) ac_prefix_conf_OUT=`echo magick/magick-baseconfig.h` +ac_prefix_conf_DEF=`echo _$ac_prefix_conf_OUT | sed -e "y:abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:" -e "s/[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g"` +ac_prefix_conf_PKG=`echo MagickCore` +ac_prefix_conf_LOW=`echo _$ac_prefix_conf_PKG | sed -e "y:ABCDEFGHIJKLMNOPQRSTUVWXYZ-:abcdefghijklmnopqrstuvwxyz_:"` +ac_prefix_conf_UPP=`echo $ac_prefix_conf_PKG | sed -e "y:abcdefghijklmnopqrstuvwxyz-:ABCDEFGHIJKLMNOPQRSTUVWXYZ_:" -e "/^[0123456789]/s/^/_/"` +ac_prefix_conf_INP=`echo "" | sed -e 's/ *//'` +if test ".$ac_prefix_conf_INP" = "."; then + for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue + case "$ac_file" in + *.h) ac_prefix_conf_INP=$ac_file ;; + *) + esac + test ".$ac_prefix_conf_INP" != "." && break + done +fi +if test ".$ac_prefix_conf_INP" = "."; then + case "$ac_prefix_conf_OUT" in + */*) ac_prefix_conf_INP=`basename "$ac_prefix_conf_OUT"` + ;; + *-*) ac_prefix_conf_INP=`echo "$ac_prefix_conf_OUT" | sed -e "s/[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*-//"` + ;; + *) ac_prefix_conf_INP=config.h + ;; + esac +fi +if test -z "$ac_prefix_conf_PKG" ; then + as_fn_error $? "no prefix for _PREFIX_PKG_CONFIG_H" "$LINENO" 5 +else + if test ! -f "$ac_prefix_conf_INP" ; then if test -f "$srcdir/$ac_prefix_conf_INP" ; then + ac_prefix_conf_INP="$srcdir/$ac_prefix_conf_INP" + fi fi + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&5 +$as_echo "$as_me: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&6;} + if test -f $ac_prefix_conf_INP ; then + $as_echo "s/^#undef *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_]\\)/#undef $ac_prefix_conf_UPP""_\\1/" > conftest.prefix + $as_echo "s/^#undef *\\([abcdefghijklmnopqrstuvwxyz]\\)/#undef $ac_prefix_conf_LOW""_\\1/" >> conftest.prefix + $as_echo "s/^#define *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_UPP""_\\1\\" >> conftest.prefix + $as_echo "#define $ac_prefix_conf_UPP""_\\1\\2\\" >> conftest.prefix + $as_echo "#endif/" >> conftest.prefix + $as_echo "s/^#define *\\([abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_LOW""_\\1\\" >> conftest.prefix + $as_echo "#define $ac_prefix_conf_LOW""_\\1\\2\\" >> conftest.prefix + $as_echo "#endif/" >> conftest.prefix + # now executing _script on _DEF input to create _OUT output file + echo "#ifndef $ac_prefix_conf_DEF" >$tmp/pconfig.h + echo "#define $ac_prefix_conf_DEF 1" >>$tmp/pconfig.h + echo ' ' >>$tmp/pconfig.h + echo /'*' $ac_prefix_conf_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h + + sed -f conftest.prefix $ac_prefix_conf_INP >>$tmp/pconfig.h + echo ' ' >>$tmp/pconfig.h + echo '/* once:' $ac_prefix_conf_DEF '*/' >>$tmp/pconfig.h + echo "#endif" >>$tmp/pconfig.h + if cmp -s $ac_prefix_conf_OUT $tmp/pconfig.h 2>/dev/null; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_prefix_conf_OUT is unchanged" >&5 +$as_echo "$as_me: $ac_prefix_conf_OUT is unchanged" >&6;} + else + ac_dir=`$as_dirname -- "$ac_prefix_conf_OUT" || +$as_expr X"$ac_prefix_conf_OUT" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_prefix_conf_OUT" : 'X\(//\)[^/]' \| \ + X"$ac_prefix_conf_OUT" : 'X\(//\)$' \| \ + X"$ac_prefix_conf_OUT" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_prefix_conf_OUT" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + rm -f "$ac_prefix_conf_OUT" + mv $tmp/pconfig.h "$ac_prefix_conf_OUT" + fi + else + as_fn_error $? "input file $ac_prefix_conf_INP does not exist - skip generating $ac_prefix_conf_OUT" "$LINENO" 5 + fi + rm -f conftest.* +fi + ;; + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + "magick.sh.in":C) chmod +x magick.sh ;; + "MagickCore-config.in":C) chmod +x magick/MagickCore-config ;; + "Magick-config.in":C) chmod +x magick/Magick-config ;; + "MagickWand-config.in":C) chmod +x wand/MagickWand-config ;; + "Wand-config.in":C) chmod +x wand/Wand-config ;; + "Magick++-config.in":C) chmod +x Magick++/bin/Magick++-config ;; + "PerlMagick/check.sh.in":C) chmod +x PerlMagick/check.sh ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +# ============================================================================== +# ImageMagick Configuration +# ============================================================================== +{ $as_echo "$as_me:${as_lineno-$LINENO}: +============================================================================== +${PACKAGE_NAME} ${PACKAGE_VERSION} is configured as follows. Please verify that this +configuration matches your expectations. + +Host system type: $host +Build system type: $build + + Option Value +------------------------------------------------------------------------------ +Shared libraries --enable-shared=$enable_shared $libtool_build_shared_libs +Static libraries --enable-static=$enable_static $libtool_build_static_libs +Module support --with-modules=$build_modules $build_modules +GNU ld --with-gnu-ld=$with_gnu_ld $lt_cv_prog_gnu_ld +Quantum depth --with-quantum-depth=$with_quantum_depth $with_quantum_depth +High Dynamic Range Imagery + --enable-hdri=$enable_hdri $enable_hdri + +Install documentation: $wantdocs + +Memory allocation library: + JEMalloc --with-jemalloc=$with_jemalloc $have_jemalloc + TCMalloc --with-tcmalloc=$with_tcmalloc $have_tcmalloc + UMem --with-umem=$with_umem $have_umem + +Delegate library configuration: + BZLIB --with-bzlib=$with_bzlib $have_bzlib + Autotrace --with-autotrace=$with_autotrace $have_autotrace + DJVU --with-djvu=$with_djvu $have_djvu + DPS --with-dps=$with_dps $have_dps + FFTW --with-fftw=$with_fftw $have_fftw + FLIF --with-flif=$with_flif $have_flif + FlashPIX --with-fpx=$with_fpx $have_fpx + FontConfig --with-fontconfig=$with_fontconfig $have_fontconfig + FreeType --with-freetype=$with_freetype $have_freetype + Ghostscript lib --with-gslib=$with_gslib $have_gslib + Graphviz --with-gvc=$with_gvc $have_gvc + HEIC --with-heic=$with_heic $have_heic + JBIG --with-jbig=$with_jbig $have_jbig + JPEG v1 --with-jpeg=$with_jpeg $have_jpeg + JPEG XL --with-jxl=$with_jxl $have_jxl + LCMS --with-lcms=$with_lcms $have_lcms + LQR --with-lqr=$with_lqr $have_lqr + LTDL --with-ltdl=$with_ltdl $have_ltdl + LZMA --with-lzma=$with_lzma $have_lzma + Magick++ --with-magick-plus-plus=$with_magick_plus_plus $have_magick_plus_plus + OpenEXR --with-openexr=$with_openexr $have_openexr + OpenJP2 --with-openjp2=$with_openjp2 $have_openjp2 + PANGO --with-pango=$with_pango $have_pango + PERL --with-perl=$with_perl $have_perl + PNG --with-png=$with_png $have_png + RAQM --with-raqm=$with_raqm $have_raqm + RAW --with-raw=$with_raw $have_raw + RSVG --with-rsvg=$with_rsvg $have_rsvg + TIFF --with-tiff=$with_tiff $have_tiff + WEBP --with-webp=$with_webp $have_webp + WMF --with-wmf=$with_wmf $have_wmf + X11 --with-x=$with_x $have_x + XML --with-xml=$with_xml $have_xml + ZLIB --with-zlib=$with_zlib $have_zlib + ZSTD --with-zstd=$with_zstd $have_zstd + +Delegate program configuration: + GhostPCL None $PCLDelegate ($PCLVersion) + GhostXPS None $XPSDelegate ($XPSVersion) + Ghostscript None $PSDelegate ($GSVersion) + +Font configuration: + Apple fonts --with-apple-font-dir=$with_apple_font_dir $result_apple_font_dir + Dejavu fonts --with-dejavu-font-dir=$with_dejavu_font_dir $result_dejavu_font_dir + Ghostscript fonts --with-gs-font-dir=$with_gs_font_dir $result_ghostscript_font_dir + URW-base35 fonts --with-urw-base35-font-dir=$with_urw_base35_font_dir $result_urw_base35_font_dir + Windows fonts --with-windows-font-dir=$with_windows_font_dir $result_windows_font_dir + +X11 configuration: + X_CFLAGS = $X_CFLAGS + X_PRE_LIBS = $X_PRE_LIBS + X_LIBS = $X_LIBS + X_EXTRA_LIBS = $X_EXTRA_LIBS + +Options used to compile and link: + PREFIX = $PREFIX_DIR + EXEC-PREFIX = $EXEC_PREFIX_DIR + VERSION = $PACKAGE_VERSION + CC = $CC + CFLAGS = $CFLAGS + CPPFLAGS = $CPPFLAGS + PCFLAGS = $PCFLAGS + DEFS = $DEFS + LDFLAGS = $LDFLAGS + LIBS = $MAGICK_DEP_LIBS + CXX = $CXX + CXXFLAGS = $CXXFLAGS + FEATURES = $MAGICK_FEATURES + DELEGATES = $MAGICK_DELEGATES +============================================================================== +" >&5 +$as_echo "$as_me: +============================================================================== +${PACKAGE_NAME} ${PACKAGE_VERSION} is configured as follows. Please verify that this +configuration matches your expectations. + +Host system type: $host +Build system type: $build + + Option Value +------------------------------------------------------------------------------ +Shared libraries --enable-shared=$enable_shared $libtool_build_shared_libs +Static libraries --enable-static=$enable_static $libtool_build_static_libs +Module support --with-modules=$build_modules $build_modules +GNU ld --with-gnu-ld=$with_gnu_ld $lt_cv_prog_gnu_ld +Quantum depth --with-quantum-depth=$with_quantum_depth $with_quantum_depth +High Dynamic Range Imagery + --enable-hdri=$enable_hdri $enable_hdri + +Install documentation: $wantdocs + +Memory allocation library: + JEMalloc --with-jemalloc=$with_jemalloc $have_jemalloc + TCMalloc --with-tcmalloc=$with_tcmalloc $have_tcmalloc + UMem --with-umem=$with_umem $have_umem + +Delegate library configuration: + BZLIB --with-bzlib=$with_bzlib $have_bzlib + Autotrace --with-autotrace=$with_autotrace $have_autotrace + DJVU --with-djvu=$with_djvu $have_djvu + DPS --with-dps=$with_dps $have_dps + FFTW --with-fftw=$with_fftw $have_fftw + FLIF --with-flif=$with_flif $have_flif + FlashPIX --with-fpx=$with_fpx $have_fpx + FontConfig --with-fontconfig=$with_fontconfig $have_fontconfig + FreeType --with-freetype=$with_freetype $have_freetype + Ghostscript lib --with-gslib=$with_gslib $have_gslib + Graphviz --with-gvc=$with_gvc $have_gvc + HEIC --with-heic=$with_heic $have_heic + JBIG --with-jbig=$with_jbig $have_jbig + JPEG v1 --with-jpeg=$with_jpeg $have_jpeg + JPEG XL --with-jxl=$with_jxl $have_jxl + LCMS --with-lcms=$with_lcms $have_lcms + LQR --with-lqr=$with_lqr $have_lqr + LTDL --with-ltdl=$with_ltdl $have_ltdl + LZMA --with-lzma=$with_lzma $have_lzma + Magick++ --with-magick-plus-plus=$with_magick_plus_plus $have_magick_plus_plus + OpenEXR --with-openexr=$with_openexr $have_openexr + OpenJP2 --with-openjp2=$with_openjp2 $have_openjp2 + PANGO --with-pango=$with_pango $have_pango + PERL --with-perl=$with_perl $have_perl + PNG --with-png=$with_png $have_png + RAQM --with-raqm=$with_raqm $have_raqm + RAW --with-raw=$with_raw $have_raw + RSVG --with-rsvg=$with_rsvg $have_rsvg + TIFF --with-tiff=$with_tiff $have_tiff + WEBP --with-webp=$with_webp $have_webp + WMF --with-wmf=$with_wmf $have_wmf + X11 --with-x=$with_x $have_x + XML --with-xml=$with_xml $have_xml + ZLIB --with-zlib=$with_zlib $have_zlib + ZSTD --with-zstd=$with_zstd $have_zstd + +Delegate program configuration: + GhostPCL None $PCLDelegate ($PCLVersion) + GhostXPS None $XPSDelegate ($XPSVersion) + Ghostscript None $PSDelegate ($GSVersion) + +Font configuration: + Apple fonts --with-apple-font-dir=$with_apple_font_dir $result_apple_font_dir + Dejavu fonts --with-dejavu-font-dir=$with_dejavu_font_dir $result_dejavu_font_dir + Ghostscript fonts --with-gs-font-dir=$with_gs_font_dir $result_ghostscript_font_dir + URW-base35 fonts --with-urw-base35-font-dir=$with_urw_base35_font_dir $result_urw_base35_font_dir + Windows fonts --with-windows-font-dir=$with_windows_font_dir $result_windows_font_dir + +X11 configuration: + X_CFLAGS = $X_CFLAGS + X_PRE_LIBS = $X_PRE_LIBS + X_LIBS = $X_LIBS + X_EXTRA_LIBS = $X_EXTRA_LIBS + +Options used to compile and link: + PREFIX = $PREFIX_DIR + EXEC-PREFIX = $EXEC_PREFIX_DIR + VERSION = $PACKAGE_VERSION + CC = $CC + CFLAGS = $CFLAGS + CPPFLAGS = $CPPFLAGS + PCFLAGS = $PCFLAGS + DEFS = $DEFS + LDFLAGS = $LDFLAGS + LIBS = $MAGICK_DEP_LIBS + CXX = $CXX + CXXFLAGS = $CXXFLAGS + FEATURES = $MAGICK_FEATURES + DELEGATES = $MAGICK_DELEGATES +============================================================================== +" >&6;} diff --git a/ImageMagick-6.9.12-44/configure.ac b/ImageMagick-6.9.12-44/configure.ac new file mode 100644 index 0000000..ef654ef --- /dev/null +++ b/ImageMagick-6.9.12-44/configure.ac @@ -0,0 +1,4085 @@ +# Copyright © 1999 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright (C) 2003 - 2008 GraphicsMagick Group +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +# Process this file with autoconf to create configure script. +AC_PREREQ(2.69) + +# ============================================================================== +# Initalize Automake +# ============================================================================== +m4_include([m4/version.m4]) +m4_define([magick_base_version], + [magick_major_version.magick_minor_version.magick_micro_version]) +m4_define([magick_version], + [magick_base_version-magick_patchlevel_version])m4_define([magick_lib_version_number], + [magick_major_version,magick_minor_version,magick_micro_version,magick_patchlevel_version]) +m4_define([magick_git_revision], + m4_esyscmd([ + h=$(git rev-parse --short HEAD) + d=$(git log -1 --format=:%cd --date=format:%Y%m%d || date -u +%Y%m%d -r ./ChangeLog.md) + printf %s "$h$d" + ])) +m4_define([magick_release_date], + m4_esyscmd([ + d=$(git log -1 --format=%cd --date=format:%Y-%m-%d || date -u +%F -r ./ChangeLog.md) + printf %s "$d" + ])) + +AC_INIT([magick_name], + [magick_version], + [magick_bugreport], + [magick_tarname], + [magick_url]) + +AC_CONFIG_SRCDIR([magick/MagickCore.h]) +AC_CONFIG_AUX_DIR([config]) +AC_REQUIRE_AUX_FILE([tap-driver.sh]) +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_HEADERS([config/config.h]) +AX_PREFIX_CONFIG_H([magick/magick-baseconfig.h],[MagickCore]) +AC_CANONICAL_SYSTEM +AC_CANONICAL_TARGET + +AM_INIT_AUTOMAKE([foreign no-define color-tests parallel-tests -Wall -Wno-portability subdir-objects dist-bzip2 dist-lzip dist-xz dist-zip tar-ustar]) + +AM_SILENT_RULES([yes]) +AC_SUBST([CONFIGURE_DEPENDENCIES],["$CONFIGURE_DEPENDENCIES \$(top_srcdir)/ChangeLog.md \$(top_srcdir)/m4/version.m4"]) + +# +# Save initial user-tunable values +# +USER_LIBS=$LIBS +for var in CC CFLAGS CPPFLAGS CXX CXXCPP LDFLAGS AR_FLAGS LIBS ; do + eval isset=\${$var+set} + if test "$isset" = 'set'; then + eval val=$`echo $var` + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS}'${var}=${val}' " + fi +done +AC_SUBST([DISTCHECK_CONFIG_FLAGS]) + +CONFIGURE_ARGS="$0 ${ac_configure_args}" +AC_SUBST([CONFIGURE_ARGS]) + +echo "Configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" + +MAGICK_TARGET_CPU=$host_cpu +AC_SUBST([MAGICK_TARGET_CPU]) +AC_DEFINE_UNQUOTED([MAGICK_TARGET_CPU],[$MAGICK_TARGET_CPU],[Target Host CPU]) + +MAGICK_TARGET_VENDOR=$host_vendor +AC_SUBST([MAGICK_TARGET_VENDOR]) +AC_DEFINE_UNQUOTED([MAGICK_TARGET_VENDOR],[$MAGICK_TARGET_VENDOR],[Target Host Vendor]) + +MAGICK_TARGET_OS=$host_os +AC_SUBST([MAGICK_TARGET_OS]) +AC_DEFINE_UNQUOTED([MAGICK_TARGET_OS],[$MAGICK_TARGET_OS],[Target Host OS]) + + +# Substitute versioning +AC_SUBST([MAGICK_MAJOR_VERSION],[magick_major_version]) +AC_SUBST([MAGICK_MINOR_VERSION],[magick_minor_version]) +AC_SUBST([MAGICK_MICRO_VERSION],[magick_micro_version]) +AC_SUBST([MAGICK_PATCHLEVEL_VERSION],[magick_patchlevel_version]) +AC_SUBST([MAGICK_VERSION],[magick_version]) +AC_SUBST([MAGICK_GIT_REVISION],[magick_git_revision]) + +# Substitute library versioning +AC_SUBST([MAGICK_LIBRARY_CURRENT],[magick_library_current])dnl +AC_SUBST([MAGICK_LIBRARY_REVISION],[magick_library_revision])dnl +AC_SUBST([MAGICK_LIBRARY_AGE],[magick_library_age])dnl +AC_SUBST([MAGICK_LIBRARY_CURRENT_MIN], + [`expr $MAGICK_LIBRARY_CURRENT - $MAGICK_LIBRARY_AGE`]) +AC_SUBST([MAGICK_LIBRARY_VERSION_INFO], + [$MAGICK_LIBRARY_CURRENT:$MAGICK_LIBRARY_REVISION:$MAGICK_LIBRARY_AGE]) + +AC_SUBST([MAGICKPP_LIBRARY_CURRENT],[magickpp_library_current])dnl +AC_SUBST([MAGICKPP_LIBRARY_REVISION],[magickpp_library_revision])dnl +AC_SUBST([MAGICKPP_LIBRARY_AGE],[magickpp_library_age])dnl +AC_SUBST([MAGICKPP_LIBRARY_CURRENT_MIN], + [`expr $MAGICKPP_LIBRARY_CURRENT - $MAGICKPP_LIBRARY_AGE`]) +AC_SUBST([MAGICKPP_LIBRARY_VERSION_INFO], + [$MAGICKPP_LIBRARY_CURRENT:$MAGICKPP_LIBRARY_REVISION:$MAGICKPP_LIBRARY_AGE]) + +AC_SUBST([PACKAGE_BASE_VERSION],[magick_base_version]) +AC_SUBST([PACKAGE_PATCHLEVEL_VERSION],[magick_patchlevel_version]) +AC_SUBST([PACKAGE_VERSION_ADDENDUM],[-magick_patchlevel_version]) +AC_SUBST([PACKAGE_LIB_VERSION],[magick_lib_version]) +AC_SUBST([PACKAGE_LIB_VERSION_NUMBER],[magick_lib_version_number]) +AC_SUBST([PACKAGE_RELEASE_DATE],[magick_release_date]) + +# Ensure that make can run correctly +AM_SANITY_CHECK + +# versioning of library +MAGICK_LIB_VERSION="0x" +if test ${MAGICK_LIBRARY_CURRENT} -lt 10 ; then + MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}0 +fi +MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}${MAGICK_LIBRARY_CURRENT} +if test ${MAGICK_LIBRARY_AGE} -lt 10 ; then + MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}0 +fi +MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}${MAGICK_LIBRARY_AGE} +if test ${MAGICK_LIBRARY_REVISION} -lt 10 ; then + MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}0 +fi +MAGICK_LIB_VERSION=${MAGICK_LIB_VERSION}${MAGICK_LIBRARY_REVISION} +AC_SUBST([MAGICK_LIB_VERSION]) + +# Definition used to define MagickLibVersionText in version.h +MAGICK_LIB_VERSION_TEXT="${PACKAGE_BASE_VERSION}" +AC_SUBST([MAGICK_LIB_VERSION_TEXT]) + +# Definition used to define MagickLibVersionNumber in version.h +MAGICK_LIB_VERSION_NUMBER="${MAGICK_LIBRARY_CURRENT},${MAGICK_LIBRARY_AGE},${MAGICK_LIBRARY_REVISION}" +AC_SUBST([MAGICK_LIB_VERSION_NUMBER]) + +MAGICKPP_LIB_VERSION="0x" +if test ${MAGICKPP_LIBRARY_CURRENT} -lt 10 ; then + MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}0 +fi +MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}${MAGICKPP_LIBRARY_CURRENT} +if test ${MAGICKPP_LIBRARY_AGE} -lt 10 ; then + MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}0 +fi +MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}${MAGICKPP_LIBRARY_AGE} +if test ${MAGICKPP_LIBRARY_REVISION} -lt 10 ; then + MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}0 +fi +MAGICKPP_LIB_VERSION=${MAGICKPP_LIB_VERSION}${MAGICKPP_LIBRARY_REVISION} +AC_SUBST([MAGICKPP_LIB_VERSION]) + +# Definition used to define MagickLibVersionText in version.h +MAGICKPP_LIB_VERSION_TEXT="${PACKAGE_BASE_VERSION}" +AC_SUBST([MAGICKPP_LIB_VERSION_TEXT]) + +# Definition used to define MagickLibVersionNumber in version.h +MAGICK_LIB_VERSION_NUMBER="${MAGICK_LIBRARY_CURRENT},${MAGICK_LIBRARY_AGE},${MAGICK_LIBRARY_REVISION}" +AC_SUBST([MAGICK_LIB_VERSION_NUMBER]) + +PERLMAINCC=$CC + +MAGICK_CFLAGS='' +MAGICK_CPPFLAGS=$CPPFLAGS_USER +MAGICK_PCFLAGS=$CPPFLAGS_USER +MAGICK_LDFLAGS='' +MAGICK_LIBS='' +MAGICK_FEATURES='' + +# +# Evaluate shell variable equivalents to Makefile directory variables +# +if test "x$prefix" = xNONE; then + prefix=$ac_default_prefix +fi +# Let make expand exec_prefix. +if test "x$exec_prefix" = xNONE; then + exec_prefix='${prefix}' +fi + +# +eval "eval PREFIX_DIR=${prefix}" +AC_SUBST([PREFIX_DIR]) +eval "eval EXEC_PREFIX_DIR=${exec_prefix}" +AC_SUBST([EXEC_PREFIX_DIR]) +eval "eval BIN_DIR=$bindir" +AC_SUBST([BIN_DIR]) +eval "eval SBIN_DIR=$sbindir" +AC_SUBST([SBIN_DIR]) +eval "eval LIBEXEC_DIR=$libexecdir" +AC_SUBST([LIBEXEC_DIR]) +eval "eval DATA_DIR=$datadir" +AC_SUBST([DATA_DIR]) +eval "eval DOC_DIR=$datadir/doc" +AC_SUBST([DOC_DIR]) +eval "eval SYSCONF_DIR=$sysconfdir" +AC_SUBST([SYSCONF_DIR]) +eval "eval SHAREDSTATE_DIR=$sharedstatedir" +AC_SUBST([SHAREDSTATE_DIR]) +eval "eval LOCALSTATE_DIR=$localstatedir" +AC_SUBST([LOCALSTATE_DIR]) +eval "eval LIB_DIR=$libdir" +AC_SUBST([LIB_DIR]) +eval "eval INCLUDE_DIR=$includedir" +AC_SUBST([INCLUDE_DIR]) +eval "eval PERSISTINCLUDE_DIR=$oldincludedir" +AC_SUBST([PERSISTINCLUDE_DIR]) +eval "eval INFO_DIR=$infodir" +AC_SUBST([INFO_DIR]) +eval "eval MAN_DIR=$mandir" +AC_SUBST([MAN_DIR]) + +# Get full paths to source and build directories +srcdirfull="`cd $srcdir && pwd`" +builddir="`pwd`" + +# +# Compute variables useful for running uninstalled software. +# +MAGICK_CODER_MODULE_PATH="${builddir}/coders" +MAGICK_CONFIGURE_SRC_PATH="${srcdirfull}/config" +MAGICK_CONFIGURE_BUILD_PATH="${builddir}/config" +MAGICK_FILTER_MODULE_PATH="${builddir}/filters" +DIRSEP=':' +case "${build_os}" in + mingw* ) + MAGICK_CODER_MODULE_PATH=`$WinPathScript "${MAGICK_CODER_MODULE_PATH}" 0` + MAGICK_CONFIGURE_SRC_PATH=`$WinPathScript "${MAGICK_CONFIGURE_SRC_PATH}" 0` + MAGICK_CONFIGURE_BUILD_PATH=`$WinPathScript "${MAGICK_CONFIGURE_BUILD_PATH}" 0` + MAGICK_FILTER_MODULE_PATH=`$WinPathScript "${MAGICK_FILTER_MODULE_PATH}" 0` + DIRSEP=';' + ;; +esac +case "${host_os}" in + mingw* ) + DIRSEP=';' + ;; +esac +AC_SUBST([MAGICK_CODER_MODULE_PATH]) +AC_SUBST([MAGICK_CONFIGURE_SRC_PATH]) +AC_SUBST([MAGICK_CONFIGURE_BUILD_PATH]) +AC_SUBST([MAGICK_FILTER_MODULE_PATH]) +AC_SUBST([DIRSEP]) + + +# +# Enable OS features. +# +AC_USE_SYSTEM_EXTENSIONS + +# ============================================================================== +# Find required base packages +# ============================================================================== +m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) +AC_PROG_CC +AC_PROG_CPP +AC_PROG_LD +LT_PATH_LD +AC_SUBST([LD]) +AC_PROG_CC_C99 +AM_PROG_CC_C_O +AX_CFLAGS_WARN_ALL +AC_PROG_INSTALL +AC_PROG_MAKE_SET +AC_PROG_LN_S +AC_PROG_SED +AC_PROG_AWK +AC_PROG_MKDIR_P +AM_WITH_DMALLOC +AX_C___ATTRIBUTE__ +AX_GCC_ARCHFLAG([yes]) +PKG_PROG_PKG_CONFIG([0.20]) +AC_CANONICAL_BUILD +AC_CANONICAL_HOST + +AX_COMPILER_VENDOR + +if test "x$GCC" = "xyes"; then + CFLAGS="$CFLAGS -fexceptions" + touch local.exp +else + cat > local.exp <@]), + [pkgconfigdir="$withval"], [pkgconfigdir='${libdir}/pkgconfig']) +AC_SUBST([pkgconfigdir]) + +# +# Enable support for POSIX thread APIs +# +AC_ARG_WITH([threads], + [AS_HELP_STRING([--without-threads], [disable POSIX threads API support])], + [with_threads=$withval], + [with_threads='yes']) + +THREAD_LIBS='' +have_threads=no +if test "$with_threads" != 'no'; then + AX_PTHREAD() + if test "$ax_pthread_ok" = yes; then + have_threads=yes + DEF_THREAD="$PTHREAD_CFLAGS" + CFLAGS="$CFLAGS $DEF_THREAD" + CXXFLAGS="$CXXFLAGS $DEF_THREAD" + THREAD_LIBS="$PTHREAD_LIBS" + if test "$CC" != "$PTHREAD_CC"; then + AC_MSG_WARN([Replacing compiler $CC with compiler $PTHREAD_CC to support pthreads.]) + CC="$PTHREAD_CC" + fi + AC_DEFINE([THREAD_SUPPORT],[1],[Define if you have POSIX threads libraries and header files.]) + fi +fi +LIBS="$LIBS $THREAD_LIBS" +AC_SUBST([THREAD_LIBS]) + +# Enable support for OpenMP +if test "$have_threads" != 'yes'; then + ac_cv_prog_c_openmp=unsupported +fi +AC_OPENMP([C]) +CFLAGS="$OPENMP_CFLAGS $CFLAGS" +MAGICK_PCFLAGS="$MAGICK_PCFLAGS $OPENMP_CFLAGS" +AC_SUBST([OPENMP_CFLAGS]) +if test "$enable_openmp" != no; then + if test "$ac_cv_prog_c_openmp" != 'unsupported'; then + MAGICK_FEATURES="OpenMP $MAGICK_FEATURES" + fi +fi + +# Enable support for OpenCL +no_cl=yes +AX_HAVE_OPENCL([C]) +if test "X$no_cl" != 'Xyes'; then + MAGICK_FEATURES="OpenCL $MAGICK_FEATURES" +fi + +######## +# +# Check for large file support +# +######## +AC_SYS_LARGEFILE +AC_FUNC_FSEEKO +LFS_CPPFLAGS='' +if test "$enable_largefile" != no; then + case $ac_cv_sys_file_offset_bits in + no) + # nothing to do here as the host supports LFS fine + ;; + unknown) + AC_MSG_CHECKING([for native large file support]) + AC_RUN_IFELSE([AC_LANG_PROGRAM([#include + main () { + exit(!(sizeof(off_t) == 8)); + }])], + [ac_cv_sys_file_offset_bits=64; AC_DEFINE(_FILE_OFFSET_BITS,64) + AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no])]) + ;; + *) + LFS_CPPFLAGS="$LFS_CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" + ;; + esac + if test "$ac_cv_sys_large_files" != 'no'; then + LFS_CPPFLAGS="$LFS_CPPFLAGS -D_LARGE_FILES=1" + fi + if test "$ac_cv_sys_largefile_source" != 'no'; then + LFS_CPPFLAGS="$LFS_CPPFLAGS -D_LARGEFILE_SOURCE=1" + fi +fi +AC_SUBST([LFS_CPPFLAGS]) + +# +# Check for sendfile support +# +######## +AC_CACHE_CHECK([Linux compatible sendfile()],ac_cv_have_linux_sendfile,[ + AC_TRY_LINK([ + #undef _FILE_OFFSET_BITS + #include + #include + #include + ], [ + sendfile(0, 0, (void *) 0, 0); + ], [ + ac_cv_have_linux_sendfile=yes + ], [ + ac_cv_have_linux_sendfile=no + ]) +]) +if test $ac_cv_have_linux_sendfile = yes; then + AC_DEFINE([HAVE_LINUX_SENDFILE],[1], [Define if you have Linux-compatible sendfile()]) +fi + +# +# Set SETJMP_IS_THREAD_SAFE define. +# +case "${host_os}" in + solaris2* ) ;; + *) AC_DEFINE([SETJMP_IS_THREAD_SAFE],[1],[Setjmp/longjmp are thread safe]) ;; +esac + +# Configure libtool +: ${AR_FLAGS=cr} +LT_INIT([win32-dll dlopen]) +LT_LANG([C++]) +AC_SUBST([LIBTOOL_DEPS]) + +# Check to see if building shared libraries +libtool_build_shared_libs='no' +if test "$enable_shared" = 'yes'; then + libtool_build_shared_libs='yes' +fi + +# Check to see if building static libraries +libtool_build_static_libs='no' +if test "$enable_static" = 'yes'; then + libtool_build_static_libs='yes' +fi + +AM_CONDITIONAL([WITH_SHARED_LIBS],[test "${libtool_build_shared_libs}" = 'yes']) +# +# Enable support for building loadable modules +# +build_modules='no' +AC_ARG_WITH([modules], + [AS_HELP_STRING([--with-modules], + [enable building dynamically loadable modules])], + [with_modules=$withval], + [with_modules='no']) + +# Only allow building loadable modules if we are building shared libraries +if test "$with_modules" != 'no' ; then + if test "$libtool_build_shared_libs" = 'no'; then + AC_MSG_WARN([Modules may only be built if building shared libraries is enabled.]) + build_modules='no' + else + build_modules='yes' + fi +fi +if test "$build_modules" != 'no' ; then + AC_DEFINE([BUILD_MODULES],[1],[Define if coders and filters are to be built as modules.]) + MAGICK_FEATURES="$MAGICK_FEATURES Modules" +fi +AM_CONDITIONAL([WITH_MODULES],[test "$build_modules" != 'no']) + +# Enable build using delegate libraries built in subdirectories rather than installed +# delegate libraries (bzlib fftw fpx gslib jp2 jbig jpeg lcms lzma png tiff ttf wmf xml zlib) +AC_ARG_ENABLE([delegate-build], + [AS_HELP_STRING([--enable-delegate-build], + [look for delegate libraries in build directory])], + [enable_delegate_build=$enableval], + [enable_delegate_build='no']) + +AC_ARG_ENABLE([deprecated], + [AS_HELP_STRING([--disable-deprecated], + [exclude deprecated methods in MagickCore and MagickWand APIs])], + [enable_deprecated=$enableval], + [enable_deprecated='no']) + +if test "$enable_deprecated" = 'yes'; then + AC_DEFINE([EXCLUDE_DEPRECATED],[1],[exclude deprecated methods in MagickCore API]) +else + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --disable-deprecated " +fi + +# Build a version of ImageMagick which operates uninstalled. +# Used to build distributions located via MAGICK_HOME / executable path +AC_ARG_ENABLE([installed], + [AS_HELP_STRING([--disable-installed], + [Formally install ImageMagick under PREFIX])], + [enable_installed=$enableval], + [enable_installed='yes']) + +if test "$enable_installed" = 'yes'; then + AC_DEFINE([INSTALLED_SUPPORT],[1],[ImageMagick is formally installed under prefix]) +else + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --disable-installed " +fi + +# Permit enciphering and deciphering image pixels. +AC_ARG_ENABLE([cipher], + [AS_HELP_STRING([--disable-cipher], + [disable enciphering and deciphering image pixels])], + [enable_cipher=$enableval], + [enable_cipher='yes']) + +if test "$enable_cipher" = 'yes'; then + AC_DEFINE([CIPHER_SUPPORT],[1],[permit enciphering and deciphering image pixels]) + MAGICK_FEATURES="Cipher $MAGICK_FEATURES" +fi + +# Build a zero-configuration version of ImageMagick. +AC_ARG_ENABLE([zero-configuration], + [AS_HELP_STRING([--enable-zero-configuration], + [enable self-contained, embeddable, zero-configuration ImageMagick])], + [enable_zero_configuration=$enableval], + [enable_zero_configuration='no']) + +if test "$enable_zero_configuration" = 'yes'; then + AC_DEFINE([ZERO_CONFIGURATION_SUPPORT],[1],[Build self-contained, embeddable, zero-configuration ImageMagick]) + MAGICK_FEATURES="Zero-configuration $MAGICK_FEATURES" +fi +AM_CONDITIONAL([MAGICKCORE_ZERO_CONFIGURATION_SUPPORT],[test "$enable_zero_configuration" = yes]) + +# Build a high dynamic range version of ImageMagick. +AC_ARG_ENABLE([hdri], + [AS_HELP_STRING([--enable-hdri], + [accurately represent the wide range of intensity levels found in real scenes])], + [enable_hdri=$enableval], + [enable_hdri='no']) + +MAGICK_HDRI="" +if test "$enable_hdri" = 'yes'; then + MAGICK_HDRI="HDRI" + magick_hdri_enable='1'; + MAGICK_FEATURES="HDRI $MAGICK_FEATURES" +else + magick_hdri_enable='0' +fi +AC_DEFINE_UNQUOTED([HDRI_ENABLE_OBSOLETE_IN_H],[$magick_hdri_enable],[Whether hdri is enabled or not]) +AC_SUBST([MAGICK_HDRI])dnl +MAGICK_PCFLAGS="$MAGICK_PCFLAGS -DMAGICKCORE_HDRI_ENABLE=$magick_hdri_enable" +CFLAGS="$CFLAGS -DMAGICKCORE_HDRI_ENABLE=$magick_hdri_enable" +CPPFLAGS="$CPPFLAGS -DMAGICKCORE_HDRI_ENABLE=$magick_hdri_enable" + +# Enable pipes (|) in filenames. +AC_ARG_ENABLE([pipes], + [AS_HELP_STRING([--enable-pipes], + [enable pipes (|) in filenames])], + [enable_pipes=$enableval], + [enable_pipes='no']) + +if test "$enable_pipes" = 'yes'; then + AC_DEFINE([PIPES_SUPPORT],[1],[enable pipes (|) in filenames]) + MAGICK_FEATURES="Pipes $MAGICK_FEATURES" +fi + +# Don't emit "rebuild rules" for configure, Makefile.ins, etc. +AM_MAINTAINER_MODE + +# Enable hugepages support +AC_ARG_ENABLE([hugepages], + [AS_HELP_STRING([--enable-hugepages], + [enable 'huge pages' support])], + [enable_hugepages=$enableval], + [enable_hugepages='no']) + +# Enable ccmalloc memory debugging support +AC_ARG_ENABLE([ccmalloc], + [AS_HELP_STRING([--enable-ccmalloc], + [enable 'ccmalloc' memory debug support])], + [enable_ccmalloc=$enableval], + [enable_ccmalloc='no']) + +# Enable Electric Fence memory debugging support +AC_ARG_ENABLE([efence], + [AS_HELP_STRING([--enable-efence], + [enable 'efence' memory debug support])], + [enable_efence=$enableval], + [enable_efence='no']) + +# Enable prof-based profiling support +AC_ARG_ENABLE([prof], + [AS_HELP_STRING([--enable-prof], + [enable 'prof' profiling support])], + [enable_prof=$enableval], + [enable_prof='no']) + +# Enable gprof-based profiling support +AC_ARG_ENABLE([gprof], + [AS_HELP_STRING([--enable-gprof], + [enable 'gprof' profiling support])], + [enable_gprof=$enableval], + [enable_gprof='no']) + +# Enable gcov-based profiling support +AC_ARG_ENABLE([gcov], + [AS_HELP_STRING([--enable-gcov], + [enable 'gcov' profiling support])], + [enable_gcov=$enableval], + [enable_gcov='no']) + +enable_profiling='no' +if test "$enable_prof" = 'yes' || test "$enable_gprof" = 'yes' || test "$enable_gcov" = 'yes'; then + enable_profiling='yes' + if test "$libtool_build_shared_libs" = 'yes'; then + echo "Warning: Can not profile code using shared libraries" + fi +fi + +# Magick API method prefix +AC_ARG_WITH([method-prefix], + [AS_HELP_STRING([--with-method-prefix=PREFIX], + [prefix MagickCore API methods])], + [with_method_prefix=$withval], + [with_method_prefix='no']) + +if test "$with_method_prefix" != 'no'; then + AC_DEFINE_UNQUOTED([NAMESPACE_PREFIX],[$with_method_prefix],[Magick API method prefix]) + AC_DEFINE_UNQUOTED([NAMESPACE_PREFIX_TAG],[$with_method_prefix],[Magick API method prefix tag]) + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-method-prefix " +fi + +# Enable legacy support (default no) +AC_ARG_ENABLE([legacy-support], + [ --enable-legacy-support install legacy command-line utilities (default disabled)], + [with_legacy_support=$enableval], + [with_legacy_support='no']) +AM_CONDITIONAL([LEGACY_SUPPORT],[test "$with_legacy_support" != 'no']) + +# Number of bits in a Quantum +AC_ARG_WITH([quantum-depth], + [AS_HELP_STRING([--with-quantum-depth=DEPTH], + [number of bits in a pixel quantum (default 16)])], + [with_quantum_depth=$withval], + [with_quantum_depth=16]) + +if test "$with_quantum_depth" != '8'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-quantum-depth=$with_quantum_depth " +fi + +case "${with_quantum_depth}" in + 8 ) ;; + 16 ) ;; + 32 ) ;; + 64 ) ;; + * ) AC_MSG_ERROR("Pixel quantum depth must have value of 8, 16, 32, or 64") ;; +esac +QUANTUM_DEPTH="$with_quantum_depth" +AC_DEFINE_UNQUOTED([QUANTUM_DEPTH_OBSOLETE_IN_H],[$QUANTUM_DEPTH],[Number of bits in a pixel Quantum (8/16/32/64)]) +AC_SUBST([QUANTUM_DEPTH])dnl +MAGICK_PCFLAGS="$MAGICK_PCFLAGS -DMAGICKCORE_QUANTUM_DEPTH=$QUANTUM_DEPTH" +CFLAGS="$CFLAGS -DMAGICKCORE_QUANTUM_DEPTH=$QUANTUM_DEPTH" +CPPFLAGS="$CPPFLAGS -DMAGICKCORE_QUANTUM_DEPTH=$QUANTUM_DEPTH" + +# define a lib suffix for abi purpose +MAGICK_ABI_SUFFIX="Q${QUANTUM_DEPTH}" +if test "$enable_hdri" = 'yes'; then + MAGICK_ABI_SUFFIX="Q${QUANTUM_DEPTH}${MAGICK_HDRI}" +fi +AC_SUBST([MAGICK_ABI_SUFFIX]) + +# Set pixel cache threshold +AC_ARG_WITH([cache], + [AS_HELP_STRING([--with-cache=THRESHOLD], + [set pixel cache threshhold in MB (default available memory)])], + [with_cache=$withval], + [with_cache='']) + +if test "$with_cache" != ''; then + AC_DEFINE_UNQUOTED([PixelCacheThreshold],["$with_cache"],[Pixel cache threshold in MB (defaults to available memory)]) + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-cache=$with_cache " +fi + +# Disable/Enable support for full delegate paths +AC_ARG_WITH([frozenpaths], + [AS_HELP_STRING([--with-frozenpaths], + [freeze delegate paths])], + [with_frozenpaths=$withval], + [with_frozenpaths='no']) + +# Enable build/install of Magick++ +AC_ARG_WITH([magick-plus-plus], + [AS_HELP_STRING([--without-magick-plus-plus], + [disable build/install of Magick++])], + [with_magick_plus_plus=$withval], + [with_magick_plus_plus='yes']) + +# Encode the this name into the shared library. +AC_ARG_WITH([package-release-name], + [AS_HELP_STRING([--with-package-release-name=NAME], + [encode this name into the shared library])], +[MAGICK_LT_RELEASE_OPTS="-release $withval"]) +AC_SUBST([MAGICK_LT_RELEASE_OPTS]) + +# Disable build/install of PerlMagick. +AC_ARG_WITH([perl], + [AS_HELP_STRING([--with-perl], + [enable build/install of PerlMagick])], + [with_perl=$withval], + [with_perl='no']) + +# Options to pass when configuring PerlMagick +AC_ARG_WITH([perl-options], + [AS_HELP_STRING([--with-perl-options=OPTIONS], + [options to pass on command-line when generating PerlMagick build file])], +PERL_MAKE_OPTIONS=$withval) +AC_SUBST([PERL_MAKE_OPTIONS]) + +# Enable jemalloc, object-caching memory allocation library. +AC_ARG_WITH([jemalloc], + [ --with-jemalloc enable jemalloc memory allocation library support], + [with_jemalloc=$withval], + [with_jemalloc='no']) +if test "$with_jemalloc" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-jemalloc=$with_jemalloc " +fi + +# Enable use of TCMalloc library. +AC_ARG_WITH([tcmalloc], + AS_HELP_STRING([--with-tcmalloc], + [enable tcmalloc memory allocation library support]), + [with_tcmalloc=$withval], + [with_tcmalloc='no']) +if test "$with_tcmalloc" != 'no' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-tcmalloc=$with_tcmalloc " +fi + +# Enable umem, object-caching memory allocation library. +AC_ARG_WITH([umem], + [ --with-umem enable umem memory allocation library support], + [with_umem=$withval], + [with_umem='no']) +if test "$with_umem" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-umem=$with_umem " +fi + +# +# Specify path to shared libstdc++ if not in normal location +# +AC_ARG_WITH([libstdc], + [AS_HELP_STRING([--with-libstdc=DIR], + [ use libstdc++ in DIR (for GNU C++)])], + [with_libstdc=$withval], + [with_libstdc='']) + +if test "$with_libstdc" != ''; then + if test -d "$with_libstdc"; then + LIBSTDCLDFLAGS="-L$with_libstdc" + fi +fi +AC_SUBST([LIBSTDCLDFLAGS]) + +# Does gcc required -traditional? +AC_PROG_GCC_TRADITIONAL + +######## +# +# Set defines required to build DLLs and modules using MinGW +# +######## +# These options are set for multi-thread DLL module build +# libMagickCore: _DLL _MAGICKMOD_ _MAGICKLIB_ +# module: _DLL +# executable/Magick++: _DLL _MAGICKMOD_ +MODULE_EXTRA_CPPFLAGS='' +LIBRARY_EXTRA_CPPFLAGS='' +if test "${native_win32_build}" = 'yes'; then + if test "${libtool_build_shared_libs}" = 'yes'; then + CPPFLAGS="$CPPFLAGS -D_DLL" + MAGICK_CPPFLAGS="$MAGICK_CPPFLAGS -D_DLL" + MAGICK_PCFLAGS="$MAGICK_PCFLAGS -D_DLL" + LIBRARY_EXTRA_CPPFLAGS="$LIBRARY_EXTRA_CPPFLAGS -D_MAGICKLIB_" + if test "$build_modules" = 'yes'; then + LIBRARY_EXTRA_CPPFLAGS="$LIBRARY_EXTRA_CPPFLAGS -D_MAGICKMOD_" + else + MODULE_EXTRA_CPPFLAGS="$MODULE_EXTRA_CPPFLAGS -D_MAGICKLIB_" + fi + else + CPPFLAGS="$CPPFLAGS -D_LIB" + MAGICK_CPPFLAGS="$MAGICK_CPPFLAGS -D_LIB" + MAGICK_PCFLAGS="$MAGICK_PCFLAGS -D_LIB" + fi + if test "$with_threads" = 'yes'; then + CPPFLAGS="$CPPFLAGS -D_MT" + MAGICK_CPPFLAGS="$MAGICK_CPPFLAGS -D_MT" + MAGICK_PCFLAGS="$MAGICK_PCFLAGS -D_MT" + fi +fi +AC_SUBST([MODULE_EXTRA_CPPFLAGS]) +AC_SUBST([LIBRARY_EXTRA_CPPFLAGS]) + +# Check standard headers +AC_HEADER_STDC +if ! test x"$ac_cv_header_stdc" = x"yes"; then + AC_MSG_WARN([configure has detected that you do not have the ANSI standard C + header files. Compilation cannot proceed. Please install the ANSI C + headers and rerun this script.]); +fi +AC_HEADER_ASSERT +AC_HEADER_DIRENT + +# Check additional headers +AC_CHECK_HEADERS(arm/limits.h arpa/inet.h complex.h errno.h fcntl.h float.h limits.h linux/unistd.h locale.h malloc.h machine/param.h mach-o/dyld.h netdb.h netinet/in.h OS.h process.h stddef.h sun_prefetch.h stdarg.h sys/ipc.h sys/mman.h sys/resource.h sys/sendfile.h sys/socket.h sys/syslimits.h sys/time.h sys/times.h sys/uio.h sys/wait.h utime.h wchar.h xlocale.h) + +######## +# +# Checks for typedefs, structures, and compiler characteristics. +# +######## + +AC_HEADER_STDBOOL +AC_C_VOLATILE +AC_C_STRINGIZE +AC_HEADER_STAT +AC_HEADER_TIME +AC_STRUCT_TM +AC_STRUCT_TIMEZONE +AC_SYS_INTERPRETER + +# +# Checks for language qualifiers and semantics. +# +AC_C_CHAR_UNSIGNED +AC_C_CONST +AC_C_INLINE +AC_C_RESTRICT +AC_C_VOLATILE + +# If words are stored with the most significant byte first (like +# Motorola and SPARC CPUs), define `WORDS_BIGENDIAN'. +AC_C_BIGENDIAN + +# Define to a suitable type, if standard headers do not define it. +AC_TYPE_INT8_T +AC_TYPE_INT16_T +AC_TYPE_INT32_T +AC_TYPE_INT64_T +AC_TYPE_INTMAX_T +AC_TYPE_INTPTR_T +AC_TYPE_MBSTATE_T +AC_TYPE_MODE_T +AC_TYPE_OFF_T +AC_TYPE_PID_T +AC_TYPE_SIZE_T +AC_TYPE_SSIZE_T +AC_TYPE_UID_T +AC_TYPE_UINT8_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T +AC_TYPE_UINTMAX_T +AC_TYPE_UINTPTR_T + +# Float_t and double_t are intended to be the the most efficient type. +AC_CHECK_SIZEOF([float_t], [], [[#include ]]) +AC_CHECK_SIZEOF([double_t], [], [[#include ]]) + +# Get size of float, double and long double for comparaison. +AC_CHECK_SIZEOF([float]) +AC_CHECK_SIZEOF([double]) +AC_CHECK_SIZEOF([long double]) + +# Obtain size of a 'unsigned long long' and define as +# SIZEOF_UNSIGNED_LONG_LONG. If 'unsigned long long' is not +# supported then the value defined is zero. +AC_CHECK_SIZEOF([unsigned long long]) + +AC_CHECK_SIZEOF([void *]) + +AC_MSG_CHECKING([whether our compiler supports __func__]) +AC_TRY_COMPILE([], + [{ const char *func = __func__; return(func != 0 ? 0 : 1); }], + AC_MSG_RESULT([yes]), + AC_MSG_RESULT([no]) + AC_MSG_CHECKING([whether our compiler supports __FUNCTION__]) + AC_TRY_COMPILE([], + [{ const char *func = __FUNCTION__; return(func != 0 ? 0 : 1); }], + AC_MSG_RESULT([yes]) + AC_DEFINE(__func__, __FUNCTION__, + [Define to appropriate substitute if compiler does not have __func__]), + AC_MSG_RESULT([no]) + AC_DEFINE(__func__, __FILE__, + [Define to appropriate substitute if compiler does not have __func__]))) + +######## +# +# Check for functions +# +######## +AC_FUNC_CLOSEDIR_VOID +AC_FUNC_MMAP +AC_FUNC_FORK +AC_FUNC_MALLOC +AC_FUNC_MEMCMP +AC_FUNC_REALLOC +AC_FUNC_SELECT_ARGTYPES +AC_FUNC_SETVBUF_REVERSED +AC_FUNC_STRTOD +AC_FUNC_STRERROR_R +AC_FUNC_VPRINTF + +# +# Find math library +# +MATH_LIBS='' +AC_CHECK_LIB([m],[sqrt],[MATH_LIBS="-lm"],[]) +LIBS="$MATH_LIBS $LIBS" +AC_SUBST([MATH_LIBS]) + +# +# Find socket library +# +AC_SEARCH_LIBS(gethostbyname, resolv nsl) +AC_SEARCH_LIBS(socket, socket, +[ + AC_DEFINE([HAVE_SOCKET],[1],[Define to 1 if you have socket support.]) + MAGICK_FEATURES="DPC $MAGICK_FEATURES" +]) + +# +# Check for clock_gettime(). +# +AC_SEARCH_LIBS(clock_gettime, rt, +[ + AC_DEFINE([HAVE_CLOCK_GETTIME],[1],[Define to 1 if you have clock_gettime.]) + AC_MSG_CHECKING([whether clock_gettime supports CLOCK_REALTIME]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM( + [[#include ]], + [[clockid_t clockType = CLOCK_REALTIME;]])], + [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CLOCK_REALTIME],[1], + [Define to 1 if clock_gettime supports CLOCK_REALTIME.]) + ], + AC_MSG_RESULT([no]) + ) + ], + [ + AC_CHECK_FUNCS([gettimeofday ftime], [break]) + ] +) + +######## +# +# Check for function prototypes +# +######## + +AC_CHECK_DECLS([pread, pwrite],[],[],[ +#include ]) + +AC_CHECK_DECLS([strlcpy],[],[],[ +#include ]) + +AC_CHECK_DECLS([vsnprintf],[],[],[ +#include +#include ]) + +######## +# +# C++ Support Tests (For Magick++) +# +######## +have_magick_plus_plus='no' +if test "$with_magick_plus_plus" = 'yes'; then + OLIBS="$LIBS" + LIBS='' + AC_LANG_PUSH([C++]) + + # Full set of headers used... + # algorithm cctype cerrno cmath cstdio cstdlib cstring ctime exception + # functional iomanip iosfwd iostream iterator list string strstream utility + AC_LANG([C++]) + AC_PROG_CXX + AX_CXX_BOOL + AX_CXX_NAMESPACES + AX_CXX_NAMESPACE_STD + AC_CXX_HAVE_STD_LIBS + AC_OPENMP([C++]) + AC_LANG_POP + + AC_MSG_CHECKING([whether C++ compiler is sufficient for Magick++]) + if \ + test $ax_cv_cxx_bool = 'yes' && \ + test $ax_cv_cxx_namespaces = 'yes' && \ + test $ac_cv_cxx_have_std_libs = 'yes' && \ + test $ax_cv_cxx_have_std_namespace = 'yes'; then + have_magick_plus_plus='yes' + else + have_magick_plus_plus='no (failed tests)' + fi + AC_MSG_RESULT([$have_magick_plus_plus]) + LIBS="$OLIBS" +fi +AM_CONDITIONAL([WITH_MAGICK_PLUS_PLUS],[test "$have_magick_plus_plus" = 'yes']) + +# Only check for delegate libraries in subdirectories if requested. +if test "$enable_delegate_build" != 'no'; then + # Check for delegate sub-directories and add -I & -L options as required. + # This presumes that delegates are installed as detailed in the ImageMagick + # README. If delegates are installed in a standard location where the + # compiler will automatically find them then these options should not be + # required. + + # + # Most delegates have includes in the same directory as the library, but not all... + # + # Includes + for dir in bzlib fftw fpx gslib/src jp2 jbig/libjbig jpeg lcms/include lzma magick openjp2/include png tiff/libtiff ttf/include wand webp/src wmf/include xml/include zlib; do + if test -d "$builddir/$dir"; then + CPPFLAGS="$CPPFLAGS -I$builddir/$dir" + else + if test -d "$srcdirfull/$dir"; then + CPPFLAGS="$CPPFLAGS -I$srcdirfull/$dir" + fi + fi + done + + # Libraries + for dir in bzlib fftw fpx gslib/src jbig/libjbig jpeg lcms/src lzma magick openjp2 png tiff/libtiff ttf/objs wand webp wmf/src xml zlib; do + if test -d "$builddir/$dir/.libs"; then + LDFLAGS="$LDFLAGS -L$builddir/$dir/.libs" + else + if test -d "$srcdirfull/$dir/.libs"; then + LDFLAGS="$LDFLAGS -L$srcdirfull/$dir/.libs" + fi + fi + if test -d "$builddir/$dir"; then + LDFLAGS="$LDFLAGS -L$builddir/$dir" + else + if test -d "$srcdirfull/$dir"; then + LDFLAGS="$LDFLAGS -L$srcdirfull/$dir" + fi + fi + done +fi + +# Assume that delegate headers reside under same directory as ImageMagick +# installation prefix. +MAGICK_CPPFLAGS="-I$INCLUDE_DIR/${PACKAGE_NAME}-$MAGICK_MAJOR_VERSION $MAGICK_CPPFLAGS" + +# +# Find the X11 RGB database +# +AC_CACHE_CHECK([for X11 configure files],[im_cv_x_configure], +[# Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /lib/usr/lib/X11 \ + /usr/X11/lib \ + /usr/X11R4/lib \ + /usr/X11R5/lib \ + /usr/X11R6/lib \ + /usr/X11R7/lib \ + /usr/X386/lib \ + /usr/XFree86/lib/X11 \ + /usr/athena/lib \ + /usr/lib \ + /usr/lib/X11 \ + /usr/lib/X11R4 \ + /usr/lib/X11R5 \ + /usr/lib/X11R6 \ + /usr/lib/X11R7 \ + /usr/local/X11/lib \ + /usr/local/X11R4/lib \ + /usr/local/X11R5/lib \ + /usr/local/X11R6/lib \ + /usr/local/lib \ + /usr/local/lib/X11 \ + /usr/local/lib/X11R4 \ + /usr/local/lib/X11R5 \ + /usr/local/lib/X11R6 \ + /usr/local/lib/X11R7 \ + /usr/local/x11r5/lib \ + /usr/lpp/Xamples/lib \ + /usr/openwin/lib \ + /usr/openwin/share/lib \ + /usr/unsupported/lib \ + /usr/x386/lib \ + ; do + if test -f "$ac_dir/X11/rgb.txt"; then + im_cv_x_configure="$ac_dir/X11/" + break + elif test -f "$ac_dir/rgb.txt"; then + im_cv_x_configure="$ac_dir/" + break + fi + + done]) +X11_CONFIGURE_PATH="$im_cv_x_configure" +case "${build_os}" in + mingw* ) + X11ConfigurePath=`$WinPathScript "$X11ConfigurePath=" 1` + ;; +esac +AC_DEFINE_UNQUOTED([X11_CONFIGURE_PATH],["$X11ConfigurePath"],[Location of X11 configure files]) + +# +# Find OpenMP library +# +GOMP_LIBS='' +if test "$enable_openmp" != 'no'; then + if test "${GCC}" = "yes"; then + # Open64 (passes for GCC but uses different OpenMP implementation) + if test "x$GOMP_LIBS" = x ; then + if $CC --version 2>&1 | grep Open64 > /dev/null ; then + AC_CHECK_LIB([openmp],[omp_get_num_procs],[GOMP_LIBS="-lopenmp"],[],[]) + fi + fi + # Clang (passes for GCC but uses different OpenMP implementation) + if test "x$LIB_OMP" = x ; then + if $CC --version 2>&1 | grep clang > /dev/null ; then + AC_CHECK_LIB([omp],[GOMP_parallel_start],[LIB_OMP="-lomp"],[],[]) + fi + fi + # GCC + if test "x$GOMP_LIBS" = x ; then + AC_CHECK_LIB([gomp],[GOMP_parallel_start],[GOMP_LIBS="-lgomp"],[],[]) + fi + else + # Sun CC + if test "x$GOMP_LIBS" = x ; then + AC_CHECK_LIB([mtsk],[sunw_mp_register_warn],[GOMP_LIBS="-lmtsk"],[],[]) + fi + # AIX xlc + if test "x$GOMP_LIBS" = x ; then + AC_CHECK_LIB([xlsmp],[_xlsmpFlush],[GOMP_LIBS="-lxlsmp"],[],[]) + fi + # SGI IRIX 6.5 MIPSpro C/C++ + if test "x$GOMP_LIBS" = x ; then + AC_CHECK_LIB([mp],[mp_destroy],[GOMP_LIBS="-lmp"],[],[]) + fi + fi + LIBS="$GOMP_LIBS $LIBS" +fi +AC_SUBST([GOMP_LIBS]) + +# +# Check for jemalloc. +# +have_jemalloc='no' +JEMALLOC_LIBS='' +if test "$with_jemalloc" != 'no'; then + AC_MSG_CHECKING([for JEMALLOC support]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + AC_CHECK_HEADER([jemalloc/jemalloc.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_LIB([jemalloc],[malloc_stats_print],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_MSG_CHECKING([if jemalloc memory allocation library is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_jemalloc='no (failed tests)' + else + JEMALLOC_LIBS='-ljemalloc' + LIBS="$JEMALLOC_LIBS $LIBS" + AC_DEFINE([HAVE_JEMALLOC],[1],[Define if you have jemalloc memory allocation library]) + AC_MSG_RESULT([yes]) + have_jemalloc='yes' + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([HAVE_JEMALLOC],[test "$have_jemalloc" = 'yes']) +AC_SUBST([JEMALLOC_LIBS]) + +# +# Check for TCMalloc library +# +have_tcmalloc='no' +TCMALLOC_LIBS='' +OLIBS="$LIBS" +if test "$have_threads" = 'yes' -a "$with_tcmalloc" != 'no'; then + AC_MSG_CHECKING([tcmalloc library support]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + + AC_CHECK_LIB([tcmalloc_minimal],[mallinfo],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + + if test $passed -gt 0; then + if test $failed -gt 0; then + have_tcmalloc='no (some components failed test)' + else + TCMALLOC_LIBS=-ltcmalloc_minimal + LIBS="$TCMALLOC_LIBS $LIBS" + CFLAGS="$CFLAGS -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free" + AC_DEFINE([HAVE_TCMALLOC],[1],[Define if you have the tcmalloc memory allocation library]) + have_tcmalloc='yes' + fi + fi + AC_MSG_CHECKING([if tcmalloc memory allocation library is complete]) + AC_MSG_RESULT([$have_tcmalloc]) +fi +AM_CONDITIONAL([HAVE_TCMALLOC],[test "$have_tcmalloc" = 'yes']) +AC_SUBST([TCMALLOC_LIBS]) + +# +# Check for umem. +# +have_umem='no' +UMEM_LIBS='' +if test "$with_umem" != 'no'; then + AC_MSG_CHECKING([for UMEM support]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + AC_CHECK_HEADER([umem.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_LIB([umem],[umem_alloc],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_CHECK_LIB([umem],[umem_free],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_MSG_CHECKING([if umem memory allocation library is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_umem='no (failed tests)' + else + UMEM_LIBS='-lumem' + LIBS="$UMEM_LIBS $LIBS" + AC_DEFINE([HAVE_UMEM],[1],[Define if you have umem memory allocation library]) + AC_MSG_RESULT([yes]) + have_umem='yes' + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([HAVE_UMEM],[test "$have_umem" = 'yes']) +AC_SUBST([UMEM_LIBS]) + +# +# Add support for ccmalloc memory debugging library if requested +# +have_ccmalloc='no' +CCMALLOC_LIBS='' +if test "$enable_ccmalloc" = 'yes'; then + AC_PATH_PROG([CCMALLOCDelegate],[ccmalloc],[]) + if test -n "$CCMALLOCDelegate"; then + eval `grep PREFIX= $CCMALLOCDelegate | sed -e 's/PREFIX/CCMALLOC_PREFIX/'` + OLIBS="$LIBS" + # Assume that gcc is used with ccmalloc. + LIBS="$LIBS $CCMALLOC_PREFIX/lib/ccmalloc-gcc.o" + AC_CHECK_LIB([ccmalloc],[ccmalloc_malloc],[CCMALLOC_LIBS="$CCMALLOC_PREFIX/lib/ccmalloc-gcc.o -lccmalloc -ldl"],[,-ldl]) + if test -n "$CCMALLOC_LIBS"; then + LIBS="$OLIBS" + LIBS="$LIBS $CCMALLOC_LIBS" + have_ccmalloc='yes' + else + LIBS="$OLIBS" + fi + fi +fi + +# +# Add support for 'huge pages' if requested +# +AS_IF([test "x$enable_hugepages" != "xno"],[ + AC_DEFINE([HAVE_HUGEPAGES],[ 1],[ [Compile with hugepage support]]) +]) + +# +# Add support for efence memory debugging library if requested +# +if test "$enable_efence" = 'yes'; then + EFENCE_LIBS='-lefence' + LIBS="$EFENCE_LIBS $LIBS" +fi + +dnl =========================================================================== + +# +# Check for BZLIB +# + +AC_ARG_WITH([bzlib], + [AS_HELP_STRING([--without-bzlib], + [disable BZLIB support])], + [with_bzlib=$withval], + [with_bzlib='yes']) + +if test "$with_bzlib" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-bzlib=$with_bzlib " +fi + +have_bzlib='no' +if test "$with_bzlib" != 'no'; then + BZLIB_LIBS='' + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for BZLIB]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + found_libbz=0 + AC_CHECK_HEADER([bzlib.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_LIB([bz2],[BZ2_bzDecompress],[found_libbz=`expr $found_libbz + 1`],[],[]) + if test "$native_win32_build" = 'yes'; then + AC_CHECK_LIB([bz2],[_imp__BZ2_decompress],[found_libbz=`expr $found_libbz + 1`],[],[]) + fi + if test $found_libbz -gt 0; then + passed=`expr $passed + 1` + else + failed=`expr $failed + 1` + fi + AC_MSG_CHECKING([if BZLIB package is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_bzlib='no (failed tests)' + else + BZLIB_LIBS='-lbz2' + LIBS="$BZLIB_LIBS $LIBS" + AC_DEFINE([BZLIB_DELEGATE],[1],[Define if you have the bzip2 library]) + AC_MSG_RESULT([yes]) + have_bzlib='yes' + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([BZLIB_DELEGATE],[test "$have_bzlib" = 'yes']) +AC_SUBST([BZLIB_LIBS]) + +# +# Find the X11 include and library directories. +# +IPC_LIBS='' +X11_LIBS='' +XEXT_LIBS='' +XT_LIBS='' +AC_PATH_XTRA +if test "$no_x" != 'yes'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for X11]) + AC_MSG_RESULT([]) + LDFLAGS="$LDFLAGS $X_LIBS" + X11_LIBS="$X_PRE_LIBS -lX11 $X_EXTRA_LIBS" + LIBS="$X11_LIBS $LIBS" + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + AC_DEFINE([X11_DELEGATE],[1],[Define if you have X11 library])dnl + + # + # Check for X11 shared memory extension + # + # shmctl is required to support the shared memory extension + AC_CHECK_FUNC([shmctl],[have_shmctl='yes'],[]) + if test "$have_shmctl" != 'yes'; then + PERSIST_LIBS=$LIBS + LIBS="$LIBS -lcygipc" + AC_TRY_LINK_FUNC([shmctl],[have_shmctl='yes'; IPC_LIBS='-lcygipc'],[]) + LIBS=$PERSIST_LIBS + fi + + if test "$have_shmctl" = 'yes'; then + AC_CHECK_LIB([Xext],[XShmAttach],[XEXT_LIBS='-lXext' ; AC_DEFINE(HAVE_SHARED_MEMORY,1,X11 server supports shared memory extension)],[],[]) + fi + + # + # Check for X11 shape extension + # + AC_CHECK_LIB([Xext],[XShapeCombineMask],[XEXT_LIBS='-lXext' ; AC_DEFINE(HAVE_SHAPE,1,X11 server supports shape extension)],[],[]) + AC_CHECK_LIB([Xt],[XtSetEventDispatcher],[XT_LIBS='-lXt'],[],[]) + LIBS="$XEXT_LIBS $XT_LIBS $LIBS" +fi +if test "$no_x" != 'yes'; then + have_x='yes' +else + have_x='no' +fi +AM_CONDITIONAL([X11_DELEGATE],[test "$have_x" = 'yes']) +AC_SUBST([X11_LIBS]) +AC_SUBST([XEXT_LIBS]) + +dnl =========================================================================== + +# +# Check for ZLIB +# +AC_ARG_WITH([zlib], + [AS_HELP_STRING([--without-zlib], + [disable ZLIB support])], + [with_zlib=$withval], + [with_zlib='yes']) + +if test "$with_zlib" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-zlib=$with_zlib " +fi + +have_zlib='no' +ZLIB_CFLAGS="" +ZLIB_LIBS="" +ZLIB_PKG="" +if test "x$with_zlib" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([ZLIB],[zlib >= 1.0.0],[have_zlib=yes],[have_zlib=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_zlib" = 'yes'; then + AC_DEFINE([ZLIB_DELEGATE],[1],[Define if you have ZLIB library]) + CFLAGS="$ZLIB_CFLAGS $CFLAGS" + LIBS="$ZLIB_LIBS $LIBS" +fi + +AM_CONDITIONAL([ZLIB_DELEGATE],[test "$have_zlib" = 'yes']) +AC_SUBST([ZLIB_CFLAGS]) +AC_SUBST([ZLIB_LIBS]) + +dnl =========================================================================== + +# +# Check for ZSTD +# +AC_ARG_WITH([zstd], + [AS_HELP_STRING([--without-zstd], + [disable ZSTD support])], + [with_zstd=$withval], + [with_zstd='yes']) + +if test "$with_zstd" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-zstd=$with_zstd " +fi + +have_zstd='no' +ZSTD_CFLAGS="" +ZSTD_LIBS="" +ZSTD_PKG="" +if test "x$with_zstd" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([LIBZSTD],[libzstd >= 1.0.0],[have_zstd=yes],[have_zstd=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_zstd" = 'yes'; then + AC_DEFINE([ZSTD_DELEGATE],[1],[Define if you have ZSTD library]) + CFLAGS="$ZSTD_CFLAGS $CFLAGS" + LIBS="$ZSTD_LIBS $LIBS" +fi + +AM_CONDITIONAL([ZSTD_DELEGATE],[test "$have_zstd" = 'yes']) +AC_SUBST([ZSTD_CFLAGS]) +AC_SUBST([ZSTD_LIBS]) + +dnl =========================================================================== + +# whether modules are built or not. +if test "$build_modules" != 'no' || test "X$no_cl" != 'Xyes'; then + with_ltdl='yes' +else + with_ltdl='no' +fi +have_ltdl='no' +LTDL_LIBS='' +if test "$with_ltdl" = 'yes'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for libltdl]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + AC_CHECK_HEADER([[ltdl.h]],[[passed=`expr $passed + 1`]],[[failed=`expr $failed + 1`]]) + AC_CHECK_LIB([ltdl],[lt_dlinit],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_MSG_CHECKING([if libltdl package is complete]) + if test $passed -gt 0 ; then + if test $failed -gt 0 ; then + AC_MSG_RESULT([no -- some components failed test]) + have_ltdl='no (failed tests)' + else + LTDL_LIBS='-lltdl' + LIBS="$LTDL_LIBS $LIBS" + AC_DEFINE([LTDL_DELEGATE],[1],[Define if using libltdl to support dynamically loadable modules and OpenCL]) + AC_DEFINE_UNQUOTED([LTDL_MODULE_EXT],["${shrext_cmds}"],[Native module suffix]) + AC_MSG_RESULT([yes]) + have_ltdl='yes' + fi + else + AC_MSG_RESULT([no]) + fi + if test "$have_ltdl" != 'yes' ; then + AC_MSG_FAILURE([libltdl is required for modules and OpenCL builds],[1]) + fi +fi +AM_CONDITIONAL([WITH_LTDL],[test "$have_ltdl" != 'no']) + +# +# If profiling, then check for -ldl and dlopen (required for Solaris & gcc) +# +LIB_DL='' +if test "$enable_profiling" = 'yes'; then + AC_CHECK_LIB([dl],[dlopen],[LIB_DL='-ldl'],[],[]) + LIBS="$LIB_DL $LIBS" +fi +AC_SUBST([LIB_DL]) + +dnl =========================================================================== + +# +# Set Apple font directory. +# +AC_ARG_WITH([apple-font-dir], + [AS_HELP_STRING([--with-apple-font-dir=DIR], + [Apple font directory])], + [with_apple_font_dir=$withval], + [with_apple_font_dir='default']) + +if test "$with_apple_font_dir" != 'default'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-apple-font-dir=$with_apple_font_dir " +fi + +dnl =========================================================================== + +# +# Check for Autotrace delegate library. +# +AC_ARG_WITH([autotrace], + [AS_HELP_STRING([--with-autotrace], + [enable autotrace support])], + [with_autotrace=$withval], + [with_autotrace='no']) + +if test "$with_autotrace" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-autotrace=$with_autotrace " +fi + +have_autotrace='no' +AUTOTRACE_CFLAGS="" +AUTOTRACE_LIBS="" +AUTOTRACE_PKG="" +if test "x$with_autotrace" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([AUTOTRACE],[autotrace >= 0.31.2],[have_autotrace=yes],[have_autotrace=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_autotrace" = 'yes'; then + AC_DEFINE([AUTOTRACE_DELEGATE],[1],[Define if you have AUTOTRACE library]) + CFLAGS="$AUTOTRACE_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([AUTOTRACE_DELEGATE],[test "$have_autotrace" = 'yes']) +AC_SUBST([AUTOTRACE_CFLAGS]) +AC_SUBST([AUTOTRACE_LIBS]) + +dnl =========================================================================== + +# +# Check for Display Postscript delegate library. +# +AC_ARG_WITH([dps], + [AS_HELP_STRING([--without-dps], + [disable Display Postscript support])], + [with_dps=$withval], + [with_dps='yes']) + +if test "$with_dps" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-dps=$with_dps " +fi + +have_dps='no' +DPS_LIBS='' +if test "$with_dps" != 'no' && test "$with_x" != 'no'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for DPS]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + PERSIST_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -I${ac_x_includes}/X11" + AC_CHECK_HEADER([DPS/dpsXclient.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + # DPS issues: + # XFree86-4.x needs -lXt to provide XtMalloc for -ldps. + # Cygwin doesn't deliver -lXt as a DLL, which prevents a DLL build. + # Adobe DPS (as delivered on Solaris) doesn't require -lXt. + # ImageMagick itself doesn't use -lXt. + have_libdps='no' + LIBDPS_XT='' + AC_CHECK_LIB([dps],[DPSInitialize],[have_libdps='yes'],[have_libdps='no',]) + if test "$have_libdps" != 'yes'; then + # Unset cache variable so we can try again. + unset ac_cv_lib_dps_DPSInitialize + AC_CHECK_LIB([dps],[DPSInitialize],[have_libdps='yes'],[have_libdps='no',-lXt]) + if test "$have_libdps" = 'yes'; then + LIBDPS_XT='-lXt' + fi + fi + if test "$have_libdps" = 'yes'; then + passed=`expr $passed + 1` + else + failed=`expr $failed + 1` + fi + AC_CHECK_LIB([dpstk],[XDPSPixelsPerPoint],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`,-ldps $LIBDPS_XT]) + AC_MSG_CHECKING([if DPS package is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_dps='no (failed tests)' + CPPFLAGS="$PERSIST_CPPFLAGS" + else + DPS_LIBS="-ldpstk -ldps ${LIBDPS_XT}" + LIBS="$DPS_LIBS $LIBS" + AC_DEFINE([DPS_DELEGATE],[1],[Define if you have Display Postscript]) + AC_MSG_RESULT([yes]) + have_dps='yes' + fi + else + AC_MSG_RESULT([no]) + CPPFLAGS=$PERSIST_CPPFLAGS + fi +fi +AM_CONDITIONAL([DPS_DELEGATE],[test "$have_dps" = 'yes']) +AC_SUBST([DPS_LIBS]) + +dnl =========================================================================== + +# +# Set DejaVu font directory. +# +AC_ARG_WITH([dejavu-font-dir], + [AS_HELP_STRING([--with-dejavu-font-dir=DIR], + [DejaVu font directory])], + [with_dejavu_font_dir=$withval], + [with_dejavu_font_dir='default']) + +if test "$with_dejavu_font_dir" != 'default'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-dejavu-font-dir=$with_dejavu_font_dir " +fi + +dnl =========================================================================== + +# +# Check for FFTW delegate library. +# +AC_ARG_WITH([fftw], + [AS_HELP_STRING([--with-fftw], + [enable FFTW support])], + [with_fftw=$withval], + [with_fftw='no']) + +if test "$with_fftw" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-fftw=$with_fftw " +fi + +have_fftw='no' +FFTW_CFLAGS="" +FFTW_LIBS="" +FFTW_PKG="" +if test "x$with_fftw" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([fftw3],[fftw3 >= 3.0.0],[have_fftw=yes],[have_fftw=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_fftw" = 'yes'; then + AC_DEFINE([FFTW_DELEGATE],[1],[Define if you have FFTW library]) + FFTW_CFLAGS="$fftw3_CFLAGS" + FFTW_LIBS="$fftw3_LIBS" + CFLAGS="$fftw3_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([FFTW_DELEGATE],[test "$have_fftw" = 'yes']) +AC_SUBST([FFTW_CFLAGS]) +AC_SUBST([FFTW_LIBS]) + +dnl =========================================================================== + +# +# Check for FLIF delegate library. +# +AC_ARG_WITH([flif], + [AS_HELP_STRING([--without-flif], + [disable FLIF support])], + [with_flif=$withval], + [with_flif='yes']) + +if test "$with_flif" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-flif=$with_flif " +fi + +have_flif='no' +FLIF_LIBS='' +if test "$with_flif" != 'no'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for FLIF]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + AC_CHECK_HEADER([flif.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_LIB([flif],[flif_create_decoder],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_MSG_CHECKING([if FLIF package is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_flif='no (failed tests)' + else + FLIF_LIBS='-lflif' + LIBS="$FLIF_LIBS $LIBS" + AC_DEFINE([FLIF_DELEGATE],[1],[Define if you have FLIF library]) + AC_MSG_RESULT([yes]) + have_flif='yes' + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([FLIF_DELEGATE],[test "$have_flif" = 'yes']) +AC_SUBST([FLIF_LIBS]) + +dnl =========================================================================== + +# +# Check for FlashPIX delegate library. +# +AC_ARG_WITH([fpx], + [AS_HELP_STRING([--without-fpx], + [disable FlashPIX support])], + [with_fpx=$withval], + [with_fpx='yes']) + +if test "$with_fpx" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-fpx=$with_fpx " +fi + +have_fpx='no' +FPX_LIBS='' +if test "$with_fpx" != 'no'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for FlashPIX]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + AC_LANG_PUSH([C++]) + AC_CHECK_HEADER([fpxlib.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_LIB([fpx],[FPX_OpenImageByFilename],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_LANG_POP + AC_MSG_CHECKING([if FlashPIX package is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_fpx='no (failed tests)' + else + FPX_LIBS='-lfpx' + AC_DEFINE([FPX_DELEGATE],[1],[Define if you have FlashPIX library]) + AC_MSG_RESULT([yes]) + have_fpx='yes' + PERLMAINCC="$CXX" + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([FPX_DELEGATE],[test "$have_fpx" = 'yes']) +AC_SUBST([FPX_LIBS]) + +dnl =========================================================================== + +# +# Check for DJVU delegate library. +# +AC_ARG_WITH([djvu], + [AS_HELP_STRING([--without-djvu], + [disable DjVu support])], + [with_djvu=$withval], + [with_djvu='yes']) + +if test "$with_djvu" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-djvu=$with_djvu " +fi + +have_djvu='no' +DJVU_CFLAGS="" +DJVU_LIBS="" +DJVU_PKG="" +if test "x$with_djvu" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([ddjvuapi],[ddjvuapi >= 3.5.0],[have_djvu=yes],[have_djvu=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_djvu" = 'yes'; then + AC_DEFINE([DJVU_DELEGATE],[1],[Define if you have DJVU library]) + DJVU_CFLAGS="$ddjvuapi_CFLAGS" + DJVU_LIBS="$ddjvuapi_LIBS" + CFLAGS="$ddjvuapi_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([DJVU_DELEGATE],[test "$have_djvu" = 'yes']) +AC_SUBST([DJVU_CFLAGS]) +AC_SUBST([DJVU_LIBS]) + +dnl =========================================================================== + +# +# Check for fontconfig delegate library. +# +AC_ARG_WITH([fontconfig], + [AS_HELP_STRING([--without-fontconfig], + [disable fontconfig support])], + [with_fontconfig=$withval], + [with_fontconfig='yes']) + +if test "$with_fontconfig" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-fontconfig=$with_fontconfig " +fi + +have_fontconfig='no' +FONTCONFIG_CFLAGS="" +FONTCONFIG_LIBS="" +FONTCONFIG_PKG="" +if test "x$with_fontconfig" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([FONTCONFIG],[fontconfig >= 2.1.0],[have_fontconfig=yes],[have_fontconfig=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_fontconfig" = 'yes'; then + AC_DEFINE([FONTCONFIG_DELEGATE],[1],[Define if you have FONTCONFIG library]) + CFLAGS="$FONTCONFIG_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([FONTCONFIG_DELEGATE],[test "$have_fontconfig" = 'yes']) +AC_SUBST([FONTCONFIG_CFLAGS]) +AC_SUBST([FONTCONFIG_LIBS]) + +dnl =========================================================================== + +# +# Check for the Freetype delegate library. +# +AC_ARG_WITH([freetype], + [AS_HELP_STRING([--without-freetype], + [disable Freetype support])], + [with_freetype=$withval], + [with_freetype='yes']) + +if test "$with_freetype" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-freetype=$with_freetype " +fi + +have_freetype='no' +FREETYPE_CFLAGS="" +FREETYPE_LIBS="" +FREETYPE_PKG="" +if test "x$with_freetype" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([FREETYPE],[freetype2],[have_freetype=yes],[have_freetype=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_freetype" = 'yes'; then + AC_DEFINE([FREETYPE_DELEGATE],[1],[Define if you have FREETYPE library]) + CFLAGS="$FREETYPE_CFLAGS $CFLAGS" + MAGICKCORE_FREETYPE_DELEGATE=1 +else + MAGICKCORE_FREETYPE_DELEGATE=0 +fi + +AC_SUBST([FREETYPE_CFLAGS]) +AC_SUBST([FREETYPE_LIBS]) +AC_SUBST([MAGICKCORE_FREETYPE_DELEGATE]) + +dnl =========================================================================== + +# +# Check for the raqm delegate library. +# +AC_ARG_WITH([raqm], + [AS_HELP_STRING([--without-raqm], + [disable Raqm support])], + [with_raqm=$withval], + [with_raqm='yes']) + +if test "$with_raqm" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-raqm=$with_raqm " +fi + +have_raqm='no' +RAQM_CFLAGS="" +RAQM_LIBS="" +RAQM_PKG="" +if test "x$with_raqm" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([RAQM],[raqm],[have_raqm=yes],[have_raqm=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_raqm" = 'yes'; then + AC_DEFINE([RAQM_DELEGATE],[1],[Define if you have RAQM library]) + CFLAGS="$RAQM_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([RAQM_DELEGATE],[test "$have_raqm" = 'yes']) +AC_SUBST([RAQM_CFLAGS]) +AC_SUBST([RAQM_LIBS]) + +dnl =========================================================================== + +# +# Enable Windows gdi32 libraries +# +AC_ARG_WITH([gdi32], + AS_HELP_STRING([--without-gdi32], + [disable Windows gdi32 support]), + [with_gdi32=$withval], + [with_gdi32='yes']) +if test "$with_gdi32" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-gdi32=$with_gdi32 " +fi + +# +# Check for Windows gdi32 library. +# +have_gdi32='no' +if test "$with_gdi32" != 'no'; then + GDI32_LIBS='' + AC_MSG_CHECKING([for Windows GDI32 support]) + AC_MSG_RESULT() + failed=0 + passed=0 + AC_CHECK_HEADER([windows.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_HEADER([winuser.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[#include ]) + AC_CHECK_HEADER([wingdi.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[#include ]) + AC_MSG_CHECKING([if Windows GDI32 support is complete]) + if test "$cygwin_build" = yes -o "$native_win32_build" = yes; then + passed=`expr $passed + 1` + fi + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_gdi32='no (failed tests)' + else + GDI32_LIBS='-lgdi32 -luser32' + LIBS="$GDI32_LIBS $LIBS" + AC_DEFINE([WINGDI32_DELEGATE],[1],[Define to use the Windows GDI32 library]) + AC_MSG_RESULT([yes]) + have_gdi32='yes' + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([WINGDI32_DELEGATE], [test "$have_gdi32" = 'yes']) +AC_SUBST([GDI32_LIBS]) + +dnl =========================================================================== + +# +# Check for Ghostscript library or framework. +# +# Test for iapi.h & test for gsapi_new_instance in -lgs +# or -framework Ghostscript + +AC_ARG_WITH([gslib], + [AS_HELP_STRING([--with-gslib], + [enable Ghostscript library support])], + [with_gslib=$withval], + [with_gslib='no']) + +gslib_framework='no' +if test "$with_gslib" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-gslib=$with_gslib " +fi + +have_gslib='no' +GS_LIBS='' +if test "$with_gslib" != 'no'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for Ghostscript]) + AC_MSG_RESULT([]) + framework=0 + failed=0 + passed=0 + AC_CHECK_HEADER([ghostscript/iapi.h],[passed=`expr $passed + 1`], + [failed=`expr $failed + 1`],[]) + AC_CHECK_HEADER([ghostscript/ierrors.h],[passed=`expr $passed + 1`], + [failed=`expr $failed + 1`],[]) + AC_CHECK_FRAMEWORK([Ghostscript],[gsapi_new_instance],[framework=`expr $framework + 1`], + AC_CHECK_LIB([gs],[gsapi_new_instance],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]),[]) + AC_MSG_CHECKING([if Ghostscript package is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_gslib='no (failed tests)' + else + if test $framework -gt 0; then + GS_LIBS='-framework Ghostscript' + gslib_framework='yes' + AC_MSG_RESULT([yes, using framework.]) + else + AC_MSG_RESULT([yes, using library.]) + GS_LIBS='-lgs' + fi + LIBS="$GS_LIBS $LIBS" + AC_DEFINE([GS_DELEGATE],[1],[Define if you have Ghostscript library or framework]) + have_gslib='yes' + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([GS_DELEGATE],[test "$have_gslib" = 'yes']) +AC_SUBST([GS_LIBS]) + +# Set default font search path +AC_ARG_WITH([fontpath], + [AS_HELP_STRING([--with-fontpath=DIR], + [prepend to default font search path])], + [with_fontpath=$withval], + [with_fontpath='']) + +if test "$with_fontpath" != "yes" && test -z "$with_fontpath"; then + with_fontpath='' +else + AC_DEFINE_UNQUOTED([MAGICK_FONT_PATH],["$with_fontpath"],[Define to prepend to default font search path.]) +fi +if test "$with_fontpath=" != ''; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-fontpath=$with_fontpath " +fi + +# Set Ghostscript font directory +AC_ARG_WITH([gs-font-dir], + [AS_HELP_STRING([--with-gs-font-dir=DIR], + [Ghostscript font directory])], + [with_gs_font_dir=$withval], + [with_gs_font_dir='default']) + +if test "$with_gs_font_dir" != 'default'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-gs-font-dir=$with_gs_font_dir " +fi + +dnl =========================================================================== + +# +# Check for GVC delegate library. +# +AC_ARG_WITH([gvc], + [AS_HELP_STRING([--with-gvc], + [enable GVC support])], + [with_gvc=$withval], + [with_gvc='yes']) + +if test "$with_gvc" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-gvc=$with_gvc " +fi + +GVC_PKG="" +if test "x$with_gvc" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([GVC],[libgvc >= 2.9.0],[have_gvc=yes],[have_gvc=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_gvc" = 'yes'; then + AC_DEFINE([GVC_DELEGATE],[1],[Define if you have GVC library]) + CFLAGS="$GVC_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([GVC_DELEGATE],[test "$have_gvc" = 'yes']) +AC_SUBST([GVC_CFLAGS]) +AC_SUBST([GVC_LIBS]) + +dnl =========================================================================== + +# +# Check for the HEIC delegate library. +# +AC_ARG_WITH([heic], + [AS_HELP_STRING([--without-heic], + [disable HEIC support])], + [with_heic=$withval], + [with_heic='yes']) + +if test "$with_heic" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-heic=$with_heic " +fi + +have_heic='no' +HEIF_CFLAGS="" +HEIF_LIBS="" +HEIF_PKG="" +if test "x$with_heic" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([HEIF],[libheif],[have_heic=yes],[have_heic=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_heic" = 'yes'; then + AC_DEFINE([HEIC_DELEGATE],[1],[Define if you have libheif library]) + CFLAGS="$HEIF_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([HEIC_DELEGATE],[test "$have_heic" = 'yes']) +AC_SUBST([HEIF_CFLAGS]) +AC_SUBST([HEIF_LIBS]) + + +dnl =========================================================================== + +# +# Check for JBIG delegate library. +# + +AC_ARG_WITH([jbig], + [AS_HELP_STRING([--without-jbig], + [disable JBIG support])], + [with_jbig=$withval], + [with_jbig='yes']) + +have_jbig='no' +JBIG_LIBS='' +if test "$with_jbig" != 'no'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for JBIG]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + AC_CHECK_HEADER([jbig.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_LIB([jbig],[jbg_dec_init],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_MSG_CHECKING([if JBIG package is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_jbig='no (failed tests)' + else + JBIG_LIBS='-ljbig' + LIBS="$JBIG_LIBS $LIBS" + AC_DEFINE([JBIG_DELEGATE],[1],[Define if you have JBIG library]) + AC_MSG_RESULT([yes]) + have_jbig='yes' + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([JBIG_DELEGATE],[test "$have_jbig" = 'yes']) +AC_SUBST([JBIG_LIBS]) + +dnl =========================================================================== + +# +# Check for JPEG delegate library. +# +AC_ARG_WITH([jpeg], + [AS_HELP_STRING([--without-jpeg], + [disable JPEG support])], + [with_jpeg=$withval], + [with_jpeg='yes']) + +if test "$with_jpeg" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-jpeg=$with_jpeg " +fi + +have_jpeg='no' +JPEG_LIBS='' +if test "$with_jpeg" != 'no'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for JPEG]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + AC_CHECK_HEADER([jconfig.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_HEADER([jerror.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_HEADER([jmorecfg.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_HEADER([jpeglib.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_LIB([jpeg],[jpeg_read_header],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_MSG_CHECKING([if JPEG package is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_jpeg='no (failed tests)' + else + JPEG_LIBS='-ljpeg' + LIBS="$JPEG_LIBS $LIBS" + AC_DEFINE([JPEG_DELEGATE],[1],[Define if you have JPEG library]) + AC_MSG_RESULT([yes]) + have_jpeg='yes' + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([JPEG_DELEGATE],[test "$have_jpeg" = 'yes']) +AC_SUBST([JPEG_LIBS]) + +dnl =========================================================================== + +# +# Check for Jpegxl delegate library. +# +AC_ARG_WITH([jxl], + [AS_HELP_STRING([--without-jxl], + [disable Jpegxl support])], + [with_jxl=$withval], + [with_jxl='yes']) + +if test "$with_jxl" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-jxl=$with_jxl " +fi + +# Check for the brunsli libraries, currently the only libraries used by the jxl coder. +# Full jxl support will be added once the full libraries are released. +have_jxl='no' +JXL_LIBS='' +if test "$with_jxl" != 'no'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for brunsli]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + AC_CHECK_HEADER([brunsli/decode.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_HEADER([brunsli/encode.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_LIB([brunslidec-c],[DecodeBrunsli],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_CHECK_LIB([brunslienc-c],[EncodeBrunsli],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_MSG_CHECKING([if brunsli package is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_jxl='no (failed tests)' + else + JXL_LIBS='-lbrunslidec-c -lbrunslienc-c' + LIBS="$JXL_LIBS $LIBS" + AC_DEFINE([JXL_DELEGATE],[1],[Define if you have brunsli library]) + AC_MSG_RESULT([yes]) + have_jxl='yes' + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([JXL_DELEGATE],[test "$have_jxl" = 'yes']) +AC_SUBST([JXL_LIBS]) + +dnl =========================================================================== + +# +# Check for LCMS delegate library. +# +AC_ARG_WITH([lcms], + [ --without-lcms disable lcms (v1.1X) support], + [with_lcms=$withval], + [with_lcms='yes']) +if test "$with_lcms" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-lcms=$with_lcms " +fi + +have_lcms='no' +LCMS_CFLAGS="" +LCMS_LIBS="" +LCMS_PKG="" +if test "x$with_lcms" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([LCMS2],[lcms2 >= 2.0.0],[have_lcms=yes],[have_lcms=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_lcms" = 'yes'; then + AC_DEFINE([LCMS_DELEGATE],[1],[Define if you have LCMS library]) + LCMS_CFLAGS="$LCMS2_CFLAGS" + LCMS_LIBS="$LCMS2_LIBS" + CFLAGS="$LCMS2_CFLAGS $CFLAGS" + AC_CHECK_HEADER([lcms2/lcms2.h],[have_lcms_header='yes'],[],[]) + if test "$have_lcms_header" = 'yes'; then + AC_DEFINE([HAVE_LCMS2_LCMS2_H],[1],[Define if you have the header file.]) + else + AC_DEFINE([HAVE_LCMS2_H],[1],[Define if you have the header file.]) + fi +fi + +AM_CONDITIONAL([LCMS_DELEGATE],[test "$have_lcms" = 'yes']) +AC_SUBST([LCMS_CFLAGS]) +AC_SUBST([LCMS_LIBS]) + +dnl =========================================================================== + +# +# Check for the OpenJP2 delegate library. +# +AC_ARG_WITH([openjp2], + [AS_HELP_STRING([--without-openjp2], + [disable OpenJP2 support])], + [with_openjp2=$withval], + [with_openjp2='yes']) + +if test "$with_openjp2" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-openjp2=$with_openjp2 " +fi + +have_openjp2='no' +LIBOPENJP2_CFLAGS="" +LIBOPENJP2_LIBS="" +LIBOPENJP2_PKG="" +if test "$with_openjp2" = "yes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([LIBOPENJP2],[libopenjp2 >= 2.1.0],[have_openjp2=yes],[have_openjp2=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_openjp2" = 'yes'; then + AC_DEFINE([LIBOPENJP2_DELEGATE],[1],[Define if you have OPENJP2 library]) + CFLAGS="$LIBOPENJP2_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([LIBOPENJP2_DELEGATE],[test "$have_openjp2" = 'yes']) +AC_SUBST([LIBOPENJP2_CFLAGS]) +AC_SUBST([LIBOPENJP2_LIBS]) + + +dnl =========================================================================== + +# +# Check for the LQR (Liquid Rescale) delegate library. +# +AC_ARG_WITH([lqr], + [AS_HELP_STRING([--without-lqr], + [disable Liquid Rescale support])], + [with_lqr=$withval], + [with_lqr='yes']) + +if test "$with_lqr" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-lqr=$with_lqr " +fi + +have_lqr='no' +LQR_CFLAGS="" +LQR_LIBS="" +LQR_PKG="" +if test "x$with_lqr" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([LQR],[lqr-1 >= 0.1.0],[have_lqr=yes],[have_lqr=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_lqr" = 'yes'; then + AC_DEFINE([LQR_DELEGATE],[1],[Define if you have LQR library]) + CFLAGS="$LQR_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([LQR_DELEGATE],[test "$have_lqr" = 'yes']) +AC_SUBST([LQR_CFLAGS]) +AC_SUBST([LQR_LIBS]) + +dnl =========================================================================== + +# Disable LZMA (lzma library) +AC_ARG_WITH([lzma], + [ --without-lzma disable LZMA support], + [with_lzma=$withval], + [with_lzma='yes']) +if test "$with_lzma" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-lzma=$with_lzma " +fi + +LZMA_PKG="" +if test "x$with_lzma" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([LZMA],[liblzma >= 2.9.0],[have_lzma=yes],[have_lzma=no]) + AC_MSG_RESULT([]) +else + have_lzma=no +fi + +if test "$have_lzma" = 'yes'; then + AC_DEFINE([LZMA_DELEGATE],[1],[Define if you have LZMA library]) + CFLAGS="$LZMA_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([LZMA_DELEGATE],[test "$have_lzma" = 'yes']) +AC_SUBST([LZMA_CFLAGS]) +AC_SUBST([LZMA_LIBS]) + +dnl =========================================================================== + +# +# Check for the OpenEXR delegate library. +# +AC_ARG_WITH([openexr], + [AS_HELP_STRING([--without-openexr], + [disable OpenEXR support])], + [with_openexr=$withval], + [with_openexr='yes']) + +if test "$with_openexr" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-openexr=$with_openexr " +fi + +have_openexr='no' +OPENEXR_CFLAGS="" +OPENEXR_LIBS="" +OPENEXR_PKG="" +if test "x$with_openexr" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([OPENEXR],[OpenEXR >= 1.0.6],[have_openexr=yes],[have_openexr=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_openexr" = 'yes'; then + AC_DEFINE([OPENEXR_DELEGATE],[1],[Define if you have OPENEXR library]) + CFLAGS="$OPENEXR_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([OPENEXR_DELEGATE],[test "$have_openexr" = 'yes']) +AC_SUBST([OPENEXR_CFLAGS]) +AC_SUBST([OPENEXR_LIBS]) + +dnl =========================================================================== + +# +# Check for PANGO delegate library. +# +AC_ARG_WITH([pango], + [AS_HELP_STRING([--without-pango], + [disable PANGO support])], + [with_pango=$withval], + [with_pango='yes']) + +if test "$with_pango" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-pango=$with_pango " +fi + +have_pango='no' +have_pangocairo='no' +PANGO_CFLAGS="" +PANGO_LIBS="" +PANGO_PKG="" +if test "x$with_pango" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([PANGO],[pangocairo >= 1.28.1],[have_pangocairo=yes],[have_pangocairo=no]) + AC_MSG_RESULT([]) + PKG_CHECK_MODULES([PANGO],[pango >= 1.28.1],[have_pango=yes],[have_pango=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_pango" = 'yes'; then + AC_DEFINE([PANGO_DELEGATE],[1],[Define if you have PANGO library]) + CFLAGS="$PANGO_CFLAGS $CFLAGS" +fi + +if test "$have_pangocairo" = 'yes'; then + AC_DEFINE([PANGOCAIRO_DELEGATE],[1],[Define if you have PANGOCAIRO library]) + CFLAGS="$PANGOCAIRO_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([PANGO_DELEGATE],[test "$have_pango" = 'yes']) +AM_CONDITIONAL([PANGOCAIRO_DELEGATE],[test "$have_pangocairo" = 'yes']) +AC_SUBST([PANGO_CFLAGS]) +AC_SUBST([PANGO_LIBS]) + +dnl =========================================================================== + +# +# Check for PNG delegate library. +# +AC_ARG_WITH([png], + [AS_HELP_STRING([--without-png], [disable PNG support])], + [with_png=$withval], + [with_png='yes']) + +if test "$with_png" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-png=$with_png " +fi + +have_png='no' +PNG_CFLAGS="" +PNG_LIBS="" +PNG_PKG="" +if test "x$with_png" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([PNG],[libpng >= 1.0.0],[have_png=yes],[have_png=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_png" = 'yes'; then + AC_DEFINE([PNG_DELEGATE],[1],[Define if you have PNG library]) + CFLAGS="$PNG_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([PNG_DELEGATE],[test "$have_png" = 'yes']) +AC_SUBST([PNG_CFLAGS]) +AC_SUBST([PNG_LIBS]) + +dnl =========================================================================== + +# +# Check for the Raw delegate library. +# +AC_ARG_WITH([raw], + [AS_HELP_STRING([--without-raw], + [disable Raw support])], + [with_raw=$withval], + [with_raw='yes']) + +if test "$with_raw" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-libraw=$with_raw " +fi + +have_raw='no' +RAW_R_CFLAGS="" +RAW_R_LIBS="" +RAW_R_PKG="" +if test "x$with_raw" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([RAW_R],[libraw_r >= 0.14.8],[have_raw=yes],[have_raw=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_raw" = 'yes'; then + AC_DEFINE([RAW_R_DELEGATE],[1],[Define if you have LIBRAW library]) + CFLAGS="$RAW_R_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([RAW_R_DELEGATE],[test "$have_raw" = 'yes']) +AC_SUBST([RAW_R_CFLAGS]) +AC_SUBST([RAW_R_LIBS]) + +dnl =========================================================================== + +# +# Check for RSVG delegate library. +# +AC_ARG_WITH([rsvg], + [AS_HELP_STRING([--with-rsvg], + [enable RSVG support])], + [with_rsvg=$withval], + [with_rsvg='no']) + +if test "$with_rsvg" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-rsvg=$with_rsvg " +fi + +have_rsvg='no' +have_cairo='no' +RSVG_CFLAGS="" +RSVG_LIBS="" +RSVG_PKG="" +if test "x$with_rsvg" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([RSVG],[librsvg-2.0 >= 2.9.0],[have_rsvg=yes],[have_rsvg=no]) + AC_MSG_RESULT([]) + PKG_CHECK_MODULES([CAIRO_SVG],[cairo-svg],[have_cairo=yes],[have_cairo=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_rsvg" = 'yes'; then + AC_DEFINE([RSVG_DELEGATE],[1],[Define if you have RSVG library]) + CFLAGS="$RSVG_CFLAGS $CFLAGS" +fi + +if test "$have_cairo" = 'yes'; then + AC_DEFINE([CAIRO_DELEGATE],[1],[Define if you have CAIRO library]) + CFLAGS="$CAIRO_SVG_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([RSVG_DELEGATE],[test "$have_rsvg" = 'yes']) +AM_CONDITIONAL([CAIRO_DELEGATE],[test "$have_cairo" = 'yes']) +AC_SUBST([RSVG_CFLAGS]) +AC_SUBST([RSVG_LIBS]) + +dnl =========================================================================== + +# +# Check for TIFF delegate library. +# +AC_ARG_WITH([tiff], + [AS_HELP_STRING([--without-tiff], + [disable TIFF support])], + [with_tiff=$withval], + [with_tiff='yes']) + +if test "$with_tiff" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-tiff=$with_tiff " +fi + +have_tiff='no' +TIFF_LIBS='' +if test "$with_tiff" != 'no'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for TIFF]) + AC_MSG_RESULT([]) + failed=0 + passed=0 + AC_CHECK_HEADER([tiff.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_HEADER([tiffio.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`]) + AC_CHECK_LIB([tiff],[TIFFOpen],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_CHECK_LIB([tiff],[TIFFClientOpen],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_CHECK_LIB([tiff],[TIFFIsByteSwapped],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_CHECK_LIB([tiff],[TIFFReadRGBATile],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_CHECK_LIB([tiff],[TIFFReadRGBAStrip],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[]) + AC_MSG_CHECKING([if TIFF package is complete]) + if test $passed -gt 0; then + if test $failed -gt 0; then + AC_MSG_RESULT([no -- some components failed test]) + have_tiff='no (failed tests)' + else + TIFF_LIBS='-ltiff' + LIBS="$TIFF_LIBS $LIBS" + AC_DEFINE([TIFF_DELEGATE],[1],[Define if you have TIFF library]) + AC_MSG_RESULT([yes]) + have_tiff='yes' + AC_CHECK_HEADERS(tiffconf.h) + AC_CHECK_FUNCS([TIFFIsCODECConfigured TIFFMergeFieldInfo \ + TIFFIsBigEndian TIFFSetErrorHandlerExt TIFFSetTagExtender \ + TIFFReadEXIFDirectory TIFFReadGPSDirectory \ + TIFFSetWarningHandlerExt TIFFSwabArrayOfTriples]) + fi + else + AC_MSG_RESULT([no]) + fi +fi +AM_CONDITIONAL([TIFF_DELEGATE],[test "$have_tiff" = 'yes']) +AC_SUBST([TIFF_LIBS]) + +dnl =========================================================================== + +# +# Set URW Base35 font directory. +# +AC_ARG_WITH([urw-base35-font-dir], + [AS_HELP_STRING([--with-urw-base35-font-dir=DIR], + [URW-base35 font directory])], + [with_urw_base35_font_dir=$withval], + [with_urw_base35_font_dir='default']) + +if test "$with_urw_base35_font_dir" != 'default'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-urw-base35-font-dir=$with_urw_base35_font_dir " +fi + +dnl =========================================================================== + +# +# Check for the WEBP delegate library. +# +AC_ARG_WITH([webp], + [AS_HELP_STRING([--without-webp], + [disable WEBP support])], + [with_webp=$withval], + [with_webp='yes']) + +if test "$with_webp" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-webp=$with_webp " +fi + +have_webp='no' +have_webpmux='no' +WEBP_CFLAGS="" +WEBP_LIBS="" +WEBP_PKG="" +WEBPMUX_CFLAGS="" +WEBPMUX_LIBS="" +WEBPMUX_PKG="" +if test "x$with_webp" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([WEBP],[libwebp >= 0.4.1],[have_webp=yes],[have_webp=no]) + PKG_CHECK_MODULES([WEBPMUX],[libwebpmux >= 0.5.0 libwebpdemux >= 0.5.0],[have_webpmux=yes],[have_webpmux=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_webp" = 'yes'; then + AC_DEFINE([WEBP_DELEGATE],[1],[Define if you have WEBP library]) + CFLAGS="$WEBP_CFLAGS $CFLAGS" +fi + +if test "$have_webpmux" = 'yes'; then + AC_DEFINE([WEBPMUX_DELEGATE],[1],[Define if you have WEBPMUX library]) + CFLAGS="$WEBPMUX_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([WEBP_DELEGATE],[test "$have_webp" = 'yes']) +AM_CONDITIONAL([WEBPMUX_DELEGATE],[test "$have_webpmux" = 'yes']) +AC_SUBST([WEBPMUX_CFLAGS]) +AC_SUBST([WEBPMUX_LIBS]) +AC_SUBST([WEBP_CFLAGS]) +AC_SUBST([WEBP_LIBS]) + +dnl =========================================================================== + +# +# Set Windows font directory. +# +AC_ARG_WITH([windows-font-dir], + [AS_HELP_STRING([--with-windows-font-dir=DIR], + [Windows font directory])], + [with_windows_font_dir=$withval], + [with_windows_font_dir='default']) + +if test "$with_windows_font_dir" != 'default'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-windows-font-dir=$with_windows_font_dir " +fi + +dnl =========================================================================== + +# +# Check for WMF delegate library. +# +AC_ARG_WITH([wmf], + [AS_HELP_STRING([--with-wmf], + [enable WMF support])], + [with_wmf=$withval], + [with_wmf=$build_modules]) + +if test "$with_wmf" != 'yes'; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-wmf=$with_wmf " +fi + +have_wmf='no' +WMF_LIBS='' +WMF_CFLAGS='' +OLIBS="$LIBS" +if test "$with_wmf" != 'no'; then + AC_MSG_CHECKING([for WMF support]) + AC_MSG_RESULT([]) + + have_libwmflite='no' + have_libwmf_ipa_h='no' + + AC_CHECK_HEADER([libwmf/ipa.h],[have_libwmf_ipa_h='yes'],[],[$FT2BUILD_H]) + if test "$have_libwmf_ipa_h" = 'yes'; then + AC_CHECK_LIB([wmflite],[wmf_lite_create],[have_libwmflite='yes'],[],[]) + if test "$have_libwmflite" = 'yes'; then + AC_DEFINE([WMF_DELEGATE],[1],[Define if you have WMF library]) + WMF_LIBS='-lwmflite' + LIBS="$WMF_LIBS $LIBS" + have_wmf='yes' + else + AC_MSG_RESULT([no -- some components failed test]) + have_wmf='no (failed tests)' + have_wmflite='no (failed tests)' + LIBS="$OLIBS" + WMF_LIBS='' + fi + fi +fi +AC_MSG_CHECKING([if WMF package is complete]) +if test "$have_wmf" = 'yes'; then + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi +AM_CONDITIONAL([WMF_DELEGATE],[test "$have_wmf" = 'yes']) +AC_SUBST([WMF_CFLAGS]) +AC_SUBST([WMF_LIBS]) + +dnl =========================================================================== + +# +# Check for XML delegate library. +# +AC_ARG_WITH([xml], + [AS_HELP_STRING([--without-xml], + [disable XML support])], + [with_xml=$withval], + [with_xml='yes']) + +if test "$with_xml" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-xml=$with_xml " +fi + +have_xml='no' +XML_CFLAGS="" +XML_LIBS="" +XML_PKG="" +if test "x$with_xml" = "xyes"; then + AC_MSG_RESULT([-------------------------------------------------------------]) + PKG_CHECK_MODULES([XML],[libxml-2.0 >= 2.0.0],[have_xml=yes],[have_xml=no]) + AC_MSG_RESULT([]) +fi + +if test "$have_xml" = 'yes'; then + AC_DEFINE([XML_DELEGATE],[1],[Define if you have XML library]) + CFLAGS="$XML_CFLAGS $CFLAGS" +fi + +AM_CONDITIONAL([XML_DELEGATE],[test "$have_xml" = 'yes']) +AC_SUBST([XML_CFLAGS]) +AC_SUBST([XML_LIBS]) + +dnl =========================================================================== + +# Check for functions +# +AC_CHECK_FUNCS([acosh _aligned_malloc aligned_malloc asinh atanh atoll atexit cabs carg cimag creal clock clock_getres clock_gettime ctime_r directio erf _exit execvp fchmod floor fork ftime ftruncate getc_unlocked getcwd getentropy getexecname getdtablesize getpagesize getpid getpwnam_r getrlimit getrusage gettimeofday gmtime_r isnan j0 j1 lltostr localtime_r lstat mkdir memmove memset mkstemp munmap nanosleep newlocale _NSGetExecutablePath pclose _pclose poll popen _popen posix_fadvise posix_fallocate posix_madvise posix_memalign posix_spawnp pow pread pwrite qsort_r raise rand_r readlink realpath select seekdir sendfile setlocale socket sqrt setvbuf stat strcasestr strchr strrchr strcspn strdup strpbrk strspn strstr strtod strtod_l strtol strtoul symlink sysconf sigemptyset sigaction spawnvp strerror strlcat strlcpy strcasecmp strncasecmp system telldir tempnam times ulltostr uselocale usleep utime vfprintf vfprintf_l vsprintf vsnprintf vsnprintf_l waitpid _wfopen _wstat]) + +# Substitute compiler name to build/link PerlMagick +# +AC_SUBST([PERLMAINCC]) + +# +# Configure install Paths +# + +# Path to ImageMagick header files +INCLUDE_RELATIVE_PATH="${PACKAGE_NAME}-${MAGICK_MAJOR_VERSION}" +INCLUDE_PATH="${INCLUDE_DIR}/${INCLUDE_RELATIVE_PATH}" +DEFINE_INCLUDE_PATH="${INCLUDE_DIR}/${INCLUDE_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_INCLUDE_PATH=`$WinPathScript "$DEFINE_INCLUDE_PATH" 1` + ;; +esac +AC_DEFINE_UNQUOTED([INCLUDE_PATH],["$DEFINE_INCLUDE_PATH"],[Directory where ImageMagick headers live.]) +AC_SUBST([INCLUDE_PATH]) + +# Path to ImageMagick header files (arch part) +INCLUDEARCH_PATH="${INCLUDEARCH_DIR}/${INCLUDE_RELATIVE_PATH}" +DEFINE_INCLUDEARCH_PATH="${INCLUDEARCH_DIR}/${INCLUDE_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_INCLUDEARCH_PATH=`$WinPathScript "$DEFINE_INCLUDEARCH_PATH" 1` + ;; +esac +AC_DEFINE_UNQUOTED([INCLUDEARCH_PATH],["$DEFINE_INCLUDE_PATH"],[Directory where ImageMagick architecture headers live.]) +AC_SUBST([INCLUDEARCH_PATH]) + +# Subdirectory under lib to place ImageMagick lib files +LIBRARY_RELATIVE_PATH="${PACKAGE_NAME}-${PACKAGE_BASE_VERSION}" +AC_DEFINE_UNQUOTED([LIBRARY_RELATIVE_PATH],["$LIBRARY_RELATIVE_PATH"],[Subdirectory of lib where ImageMagick architecture dependent files are installed.]) + +# Path to ImageMagick bin directory +EXECUTABLE_PATH="${BIN_DIR}" +DEFINE_EXECUTABLE_PATH="${BIN_DIR}/" +case "${build_os}" in + mingw* ) + DEFINE_EXECUTABLE_PATH=`$WinPathScript "$DEFINE_EXECUTABLE_PATH" 1` + ;; +esac +AC_DEFINE_UNQUOTED([EXECUTABLE_PATH],["$DEFINE_EXECUTABLE_PATH"],[Directory where executables are installed.]) +AC_SUBST([EXECUTABLE_PATH]) + +# Path to ImageMagick lib +LIBRARY_PATH="${LIB_DIR}/${LIBRARY_RELATIVE_PATH}" +DEFINE_LIBRARY_PATH="${LIB_DIR}/${LIBRARY_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_LIBRARY_PATH=`$WinPathScript "$DEFINE_LIBRARY_PATH" 1` + ;; +esac +AC_DEFINE_UNQUOTED([LIBRARY_PATH],["$DEFINE_LIBRARY_PATH"],[Directory where architecture-dependent files live.]) +AC_SUBST([LIBRARY_PATH]) + +# +# path to local binaries +if test "x$LIB_BIN_BASEDIRNAME" = "x"; then + LIB_BIN_BASEDIRNAME="bin" +fi +AC_DEFINE_UNQUOTED([LIB_BIN_BASEDIRNAME],["$LIB_BIN_BASEDIRNAME"],[Binaries in libraries path base name (will be during install linked to bin)]) +AC_SUBST([LIB_BIN_BASEDIRNAME]) + +if test "x$LIB_BIN_DIR" = "x"; then + LIB_BIN_DIR=${LIB_BIN_BASEDIRNAME}-${MAGICK_ABI_SUFFIX} +fi +AC_SUBST([LIB_BIN_DIR]) + +LIB_BIN_DIR_RELATIVE_PATH=$LIB_BIN_DIR +AC_SUBST([LIB_BIN_DIR_RELATIVE_PATH]) +LIB_BIN_DIR_PATH="${LIBRARY_PATH}/${LIB_BIN_DIR_RELATIVE_PATH}" +AC_SUBST([LIB_BIN_DIR_PATH]) + +# +# path to modules lib +if test "x$MODULES_BASEDIRNAME" = "x"; then + MODULES_BASEDIRNAME="modules" +fi +AC_DEFINE_UNQUOTED([MODULES_BASEDIRNAME],["$MODULES_BASEDIRNAME"],[Module directory name without ABI part.]) +AC_SUBST([MODULES_BASEDIRNAME]) + +if test "x$MODULES_DIRNAME" = "x"; then + MODULES_DIRNAME=${MODULES_BASEDIRNAME}-${MAGICK_ABI_SUFFIX} +else + AC_DEFINE_UNQUOTED([MODULES_DIRNAME],"[$MODULES_DIRNAME"],[Module directory dirname]) +fi +AC_SUBST([MODULES_DIRNAME]) + +MODULES_RELATIVE_PATH="${MODULES_DIRNAME}" +AC_SUBST([MODULES_RELATIVE_PATH]) +MODULES_PATH="${LIBRARY_PATH}/${MODULES_RELATIVE_PATH}" +AC_SUBST([MODULES_PATH]) + +# +# path to coders lib +if test "x$CODER_DIRNAME" = "x"; then + CODER_DIRNAME="coders" +fi +AC_DEFINE_UNQUOTED([CODER_DIRNAME],["$CODER_DIRNAME"],[coders subdirectory.]) +AC_SUBST([CODER_DIRNAME]) + +CODER_RELATIVE_PATH="${CODER_DIRNAME}" +CODER_PATH="${MODULES_PATH}/${CODER_DIRNAME}" +AC_SUBST([CODER_PATH]) + +# +# Subdirectory under lib to place ImageMagick filter module files +# +# path to coders lib +if test "x$FILTER_DIRNAME" = "x"; then + FILTER_DIRNAME="filters" +fi +AC_DEFINE_UNQUOTED([FILTER_DIRNAME],["$FILTER_DIRNAME"],[filter subdirectory.]) +AC_SUBST([FILTER_DIRNAME]) + +FILTER_RELATIVE_PATH="${FILTER_DIRNAME}" +FILTER_PATH="${MODULES_PATH}/${FILTER_DIRNAME}" +AC_SUBST([FILTER_PATH]) + +# +# Path to ImageMagick documentation files +DOCUMENTATION_RELATIVE_PATH="${PACKAGE_NAME}-${MAGICK_MAJOR_VERSION}" +DOCUMENTATION_PATH="${DOC_DIR}/${DOCUMENTATION_RELATIVE_PATH}" +DEFINE_DOCUMENTATION_PATH="${DOC_DIR}/${DOCUMENTATION_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_DOCUMENTATION_PATH=`$WinPathScript "$DEFINE_DOCUMENTATION_PATH" 1` + ;; +esac +AC_DEFINE_UNQUOTED([DOCUMENTATION_PATH],["$DEFINE_DOCUMENTATION_PATH"],[Directory where ImageMagick documents live.]) +AC_SUBST([DOCUMENTATION_PATH]) + +# +# Enable/Disable documentation +AC_ARG_ENABLE([docs], + [AS_HELP_STRING([--disable-docs], + [disable building of documentation])], + wantdocs=$enableval, wantdocs=yes) +AM_CONDITIONAL([INSTALL_DOC],[test "$wantdocs" = "yes"]) + +# Subdirectory to place architecture-dependent configuration files +CONFIGURE_RELATIVE_PATH="${PACKAGE_NAME}-${MAGICK_MAJOR_VERSION}" +AC_DEFINE_UNQUOTED([CONFIGURE_RELATIVE_PATH],"$CONFIGURE_RELATIVE_PATH",[Subdirectory of lib where architecture-dependent configuration files live.]) +CONFIGURE_PATH="${SYSCONF_DIR}/${CONFIGURE_RELATIVE_PATH}/" +DEFINE_CONFIGURE_PATH="${SYSCONF_DIR}/${CONFIGURE_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_CONFIGURE_PATH=`$WinPathScript "$DEFINE_CONFIGURE_PATH" 1` + ;; +esac +AC_DEFINE_UNQUOTED([CONFIGURE_PATH],"$DEFINE_CONFIGURE_PATH",[Directory where architecture-dependent configuration files live.]) +AC_SUBST([CONFIGURE_PATH]) + +# Subdirectory to place architecture-independent configuration files +SHARE_RELATIVE_PATH="${PACKAGE_NAME}-${MAGICK_MAJOR_VERSION}" +AC_DEFINE_UNQUOTED([SHARE_RELATIVE_PATH],"$SHARE_RELATIVE_PATH",[Subdirectory of lib where architecture-independent configuration files live.]) +SHARE_PATH="${DATA_DIR}/${SHARE_RELATIVE_PATH}" +DEFINE_SHARE_PATH="${DATA_DIR}/${SHARE_RELATIVE_PATH}/" +case "${build_os}" in + mingw* ) + DEFINE_SHARE_PATH=`$WinPathScript "$DEFINE_SHARE_PATH" 1` + ;; +esac +AC_DEFINE_UNQUOTED([SHARE_PATH],"$DEFINE_SHARE_PATH",[Directory where architecture-independent configuration files live.]) +AC_SUBST([SHARE_PATH]) + +# +# Subdirectory to place architecture-dependent configuration files. +if test "x$SHAREARCH_BASEDIRNAME" = "x"; then + SHAREARCH_BASEDIRNAME="config" +fi +AC_DEFINE_UNQUOTED([SHAREARCH_BASEDIRNAME],"$SHAREARCH_BASEDIRNAME",[Sharearch directory name without ABI part.]) +AC_SUBST([SHAREARCH_BASEDIRNAME]) + +if test "x$SHAREARCH_DIRNAME" = "x"; then + SHAREARCH_DIRNAME=${SHAREARCH_BASEDIRNAME}-${MAGICK_ABI_SUFFIX} +else + AC_DEFINE_UNQUOTED([SHAREARCH_DIRNAME],["$SHAREARCH_DIRNAME]",[Sharearch directory dirname]) +fi +AC_SUBST([SHAREARCH_DIRNAME]) + +SHAREARCH_RELATIVE_PATH="${SHAREARCH_DIRNAME}" +AC_SUBST([SHAREARCH_RELATIVE_PATH]) +SHAREARCH_PATH="${LIBRARY_PATH}/${SHAREARCH_RELATIVE_PATH}" +AC_SUBST([SHAREARCH_PATH]) + +# +# program_transform_name is formed for use in a Makefile, so create a +# modified version for use in a shell script. +configure_transform_name=`echo ${program_transform_name} | sed 's,\\$\\$,$,'` + +# Default delegate definitions +AC_MSG_RESULT([-------------------------------------------------------------]) +AC_MSG_CHECKING([for ImageMagick delegate programs]) +AC_MSG_RESULT([]) +BPGDecodeDelegateDefault='bpgdec' +BPGEncodeDelegateDefault='bpgenc' +BlenderDecodeDelegateDefault='blender' +BrowseDelegateDefault='xdg-open' +DNGDecodeDelegateDefault='ufraw-batch' +DOCDecodeDelegateDefault='libreoffice' +GVCDecodeDelegateDefault='dot' +DVIDecodeDelegateDefault='dvips' +EditorDelegateDefault='xterm' +ConvertDelegateDefault=`echo convert | sed ${configure_transform_name}` +DisplayDelegateDefault=`echo display | sed ${configure_transform_name}` +MogrifyDelegateDefault=`echo mogrify | sed ${configure_transform_name}` +HPGLDecodeDelegateDefault='hp2xx' +HTMLDecodeDelegateDefault='html2ps' +ILBMDecodeDelegateDefault='ilbmtoppm' +ILBMEncodeDelegateDefault='ppmtoilbm' +JXRDecodeDelegateDefault='JxrDecApp' +JXREncodeDelegateDefault='JxrEncApp' +LEPDelegateDefault='lepton' +LPDelegateDefault='lp' +LPRDelegateDefault='lpr' +LaunchDelegateDefault='gimp' +MrSIDDecodeDelegateDefault='mrsidgeodecode' +MVDelegateDefault='mv' +PCLDelegateDefault='pcl6' +if test "$native_win32_build" = 'yes'; then + PSDelegateDefault='gswin32c' +elif test "$gslib_framework" = 'yes'; then + PSDelegateDefault='gsc' +else + PSDelegateDefault='gs' +fi +RMDelegateDefault='rm' +RSVGDecodeDelegateDefault='rsvg-convert' +SVGDecodeDelegateDefault='inkscape' +TextEncodeDelegateDefault='tesseract' +TraceEncodeDelegateDefault='potrace' +VIDEODecodeDelegateDefault='ffmpeg' +VIDEOEncodeDelegateDefault='ffmpeg' +WebPDecodeDelegateDefault='dwebp' +WebPEncodeDelegateDefault='cwebp' +WWWDecodeDelegateDefault='curl' +XPSDelegateDefault='gxps' + +# Search for delegates +AC_PATH_PROG([BPGDecodeDelegate],["$BPGDecodeDelegateDefault"],["$BPGDecodeDelegateDefault"]) +AC_PATH_PROG([BPGEncodeDelegate],["$BPGEncodeDelegateDefault"],["$BPGEncodeDelegateDefault"]) +AC_PATH_PROG([BlenderDecodeDelegate],["$BlenderDecodeDelegateDefault"],["$BlenderDecodeDelegateDefault"]) +AC_PATH_PROGS([BrowseDelegate],["$BrowseDelegateDefault" google-chrome firefox konqueror mozilla lynx],["$BrowseDelegateDefault"]) +AC_PATH_PROG([DNGDecodeDelegate],["$DNGDecodeDelegateDefault"],["$DNGDecodeDelegateDefault"]) +AC_PATH_PROG([DOCDecodeDelegate],["$DOCDecodeDelegateDefault"],["$DOCDecodeDelegateDefault"]) +AC_PATH_PROG([DVIDecodeDelegate],["$DVIDecodeDelegateDefault"],["$DVIDecodeDelegateDefault"]) +AC_PATH_PROG([ConvertDelegate],["$ConvertDelegateDefault"],["$ConvertDelegateDefault"]) +AC_PATH_PROG([DisplayDelegate],["$DisplayDelegateDefault"],["$DisplayDelegateDefault"]) +AC_PATH_PROG([EditorDelegate],["$EditorDelegateDefault"],["$EditorDelegateDefault"]) +AC_PATH_PROG([GVCDecodeDelegate],["$GVCDecodeDelegateDefault"],["$GVCDecodeDelegateDefault"]) +AC_PATH_PROG([HPGLDecodeDelegate],["$HPGLDecodeDelegateDefault"],["$HPGLDecodeDelegateDefault"]) +AC_PATH_PROG([HTMLDecodeDelegate],["$HTMLDecodeDelegateDefault"],["$HTMLDecodeDelegateDefault"]) +AC_PATH_PROG([ILBMDecodeDelegate],["$ILBMDecodeDelegateDefault"],["$ILBMDecodeDelegateDefault"]) +AC_PATH_PROG([ILBMEncodeDelegate],["$ILBMEncodeDelegateDefault"],["$ILBMEncodeDelegateDefault"]) +AC_PATH_PROG([JXRDecodeDelegate],["$JXRDecodeDelegateDefault"],["$JXRDecodeDelegateDefault"]) +AC_PATH_PROG([JXREncodeDelegate],["$JXREncodeDelegateDefault"],["$JXREncodeDelegateDefault"]) +AC_PATH_PROG([LEPDelegate],["$LEPDelegateDefault"],["$LEPDelegateDefault"]) +AC_PATH_PROG([LPDelegate],["$LPDelegateDefault"],[no]) +AC_PATH_PROG([LPRDelegate],["$LPRDelegateDefault"],["$LPRDelegateDefault"]) +AC_PATH_PROG([LaunchDelegate],["$LaunchDelegateDefault"],["$LaunchDelegateDefault"]) +AC_PATH_PROG([MogrifyDelegate],["$MogrifyDelegateDefault"],["$MogrifyDelegateDefault"]) +AC_PATH_PROG([VIDEODecodeDelegate],["$VIDEODecodeDelegateDefault"],["$VIDEODecodeDelegateDefault"]) +AC_PATH_PROG([VIDEOEncodeDelegate],["$VIDEOEncodeDelegateDefault"],["$VIDEOEncodeDelegateDefault"]) +AC_PATH_PROG([MrSIDDecodeDelegate],["$MrSIDDecodeDelegateDefault"],["$MrSIDDecodeDelegateDefault"]) +AC_PATH_PROG([MVDelegate],["$MVDelegateDefault"],["$MVDelegateDefault"]) +AC_PATH_PROG([PCLDelegate],["$PCLDelegateDefault"],["$PCLDelegateDefault"]) +AC_PATH_PROGS([PSDelegate],[gsx gsc "$PSDelegateDefault"],["$PSDelegateDefault"]) +AC_PATH_PROG([RMDelegate],["$RMDelegateDefault"],["$RMDelegateDefault"]) +AC_PATH_PROG([RSVGDecodeDelegate],["$RSVGDecodeDelegateDefault"],["$RSVGDecodeDelegateDefault"]) +AC_PATH_PROG([SVGDecodeDelegate],["$SVGDecodeDelegateDefault"],["$SVGDecodeDelegateDefault"]) +AC_PATH_PROG([TextEncodeDelegate],["$TextEncodeDelegateDefault"],["$TextEncodeDelegateDefault"]) +AC_PATH_PROG([TraceEncodeDelegate],["$TraceEncodeDelegateDefault"],["$TraceEncodeDelegateDefault"]) +AC_PATH_PROG([WebPDecodeDelegate],["$WebPDecodeDelegateDefault"],["$WebPDecodeDelegateDefault"]) +AC_PATH_PROG([WebPEncodeDelegate],["$WebPEncodeDelegateDefault"],["$WebPEncodeDelegateDefault"]) +AC_PATH_PROG([WWWDecodeDelegate],["$WWWDecodeDelegateDefault"],["$WWWDecodeDelegateDelegateDefault"]) +AC_PATH_PROG([XPSDelegate],["$XPSDelegateDefault"],["$XPSDelegateDefault"]) + +# Prefer lpr to lp; lp needs options tacked on. +if test "$LPRDelegate" != no; then + PrintDelegate="$LPRDelegate" +else + PrintDelegate="$LPDelegate -c -s" +fi +AC_SUBST([PrintDelegate]) + +# Installed ImageMagick utiltity paths +ConvertDelegate="${BIN_DIR}/${ConvertDelegateDefault}" +DisplayDelegate="${BIN_DIR}/${DisplayDelegateDefault}" +MogrifyDelegate="${BIN_DIR}/${MogrifyDelegateDefault}" + +# Set delegate booleans +have_gs='no' ; if test "$PSDelegate" != "$PSDelegateDefault"; then have_gs='yes'; fi +have_hp2xx='no' ; if test "$HPGLDecodeDelegate" != "$HPGLDecodeDelegateDefault" ; then have_hp2xx='yes'; fi +have_ilbmtoppm='no' ; if test "$ILBMDecodeDelegate" != "$ILBMDecodeDelegateDefault" ; then have_ilbmtoppm='yes'; fi +have_mrsid='no'; if test "$MrSIDDecodeDelegate" != "$MrSIDDecodeDelegateDefault" ; then have_mrsid='yes'; fi +have_pcl='no' ; if test "$PCLDelegate" != "$PCLDelegateDefault"; then have_pcl='yes'; fi +have_ppmtoilbm='no' ; if test "$ILBMEncodeDelegate" != "$ILBMEncodeDelegateDefault" ; then have_ppmtoilbm='yes'; fi +have_video='no'; if test "$VIDEODecodeDelegate" != "$VIDEODecodeDelegateDefault" ; then have_video='yes'; fi +have_xps='no' ; if test "$XPSDelegate" != "$XPSDelegateDefault"; then have_xps='yes'; fi + +# +# Test for font directories +# +type_include_files='' + +# Apple fonts. +AC_MSG_CHECKING([for Apple fonts directory]) +apple_font_dir='' +if test "${with_apple_font_dir}" != 'default'; then + apple_font_dir="${with_apple_font_dir}/" +else + for font_dir in '/Library/Fonts/'; do + if test -f "${font_dir}Arial.ttf"; then + apple_font_dir="${font_dir}" + break 1 + fi + done +fi +if test "${apple_font_dir}x" != 'x'; then + type_include_files="${type_include_files} "'' + AC_MSG_RESULT([$apple_font_dir]) +else + AC_MSG_RESULT([not found!]); +fi +AC_SUBST([apple_font_dir]) + +# Dejavu fonts. +AC_MSG_CHECKING([for Dejavu fonts directory]) +dejavu_font_dir='' +if test "${with_dejavu_font_dir}" != 'default'; then + dejavu_font_dir="${with_dejavu_font_dir}/" +else + for font_dir in "${prefix}/share/dejavu/fonts/" '/usr/share/fonts/dejavu/'; do + if test -f "${font_dir}DejaVuSerif.ttf"; then + dejavu_font_dir="${font_dir}" + break 1 + fi + done +fi +if test "${dejavu_font_dir}x" != 'x'; then + type_include_files="${type_include_files} "'' + AC_MSG_RESULT([$dejavu_font_dir]) +else + AC_MSG_RESULT([not found!]); +fi +AC_SUBST([dejavu_font_dir]) + +# Ghostscript +AC_MSG_CHECKING([for Ghostscript fonts directory]) +ghostscript_font_dir='' +if test "${with_gs_font_dir}" != 'default'; then + ghostscript_font_dir="${with_gs_font_dir}/" +else + if test "${native_win32_build}" = 'yes'; then + # Native Windows Build + for font_dir in "c:\\Program Files\\gs\\fonts\\" "c:\\Program Files \(x86\)\\gs\\fonts\\" "c:\\gs\\fonts\\"; do + if test -f "${font_dir}a010013l.pfb"; then + ghostscript_font_dir="$font_dir" + break 1 + fi + done + if test "${PSDelegate}" != 'gswin32c'; then + ghostscript_font_dir=`echo "${PSDelegate}" | sed -e 's:/gs/.*:/gs:;s:^/::;s/./&:/;s:/:\\\\:g'`"\\fonts\\" + fi + else + # Linux / Mac OS X / Unix Build + for font_dir in "${prefix}/share/ghostscript/fonts/" '/usr/share/fonts/default/Type1/' '/usr/share/ghostscript/fonts/' '/usr/share/fonts/ghostscript/' '/usr/share/fonts/type1/gsfonts/' '/opt/local/share/ghostscript/fonts/' '/sw/share/ghostscript/fonts/' '/System/Library/Frameworks/Ghostscript.framework/Resources/fonts/'; do + if test -f "${font_dir}a010013l.pfb"; then + ghostscript_font_dir="${font_dir}" + break 1 + fi + done + if test "${ghostscript_font_dir}x" = 'x'; then + if test "$PSDelegate" != 'gs'; then + ghostscript_font_dir=`echo "$PSDelegate" | sed -e 's:/bin/gs:/share/ghostscript/fonts:'`"/" + fi + fi + fi +fi +if test "${ghostscript_font_dir}x" != 'x'; then + type_include_files="${type_include_files} "'' + AC_MSG_RESULT([$ghostscript_font_dir]) +else + AC_MSG_RESULT([not found!]); +fi +AC_SUBST([ghostscript_font_dir]) +case "${build_os}" in + mingw* ) + PSDelegate=`$WinPathScript "$PSDelegate" 1` + ;; +esac + +# URW-base35 fonts. +AC_MSG_CHECKING([for URW-base35 fonts directory]) +urw_base35_font_dir='' +if test "${with_urw_base35_font_dir}" != 'default'; then + urw_base35_font_dir="${with_urw_base35_font_dir}/" +else + for font_dir in "${prefix}/share/urw-base35/fonts/" '/usr/share/fonts/urw-base35/' '/usr/share/fonts/type1/urw-base35/'; do + if test -f "${font_dir}StandardSymbolsPS.t1"; then + urw_base35_font_dir="${font_dir}" + break 1 + fi + done +fi +if test "${urw_base35_font_dir}x" != 'x'; then + type_include_files="${type_include_files} "'' + AC_MSG_RESULT([$urw_base35_font_dir]) +else + AC_MSG_RESULT([not found!]); +fi +AC_SUBST([urw_base35_font_dir]) + +# Windows fonts. +AC_MSG_CHECKING([for Windows fonts directory]) +windows_font_dir='' +if test "${with_windows_font_dir}" != 'default'; then + windows_font_dir="${with_windows_font_dir}/" +fi +if test "${windows_font_dir}x" != 'x'; then + type_include_files="${type_include_files} "'' + AC_MSG_RESULT([$windows_font_dir]) +else + AC_MSG_RESULT([not found!]); +fi +AC_SUBST([windows_font_dir]) + +AC_SUBST([type_include_files]) + +# +# Handle case where user doesn't want frozen paths +# +if test "$with_frozenpaths" != 'yes'; then + # Re-set delegate definitions to default (no paths) + BPGDecodeDelegate="$BPGDecodeDelegateDefault" + BPGEncodeDelegate="$BPGEncodeDelegateDefault" + BlenderDecodeDelegate="$BlenderDecodeDelegateDefault" + BrowseDelegate="$BrowseDelegateDefault" + ConvertDelegate="$ConvertDelegateDefault" + DisplayDelegate="$DisplayDelegateDefault" + DNGDecodeDelegate="$DNGDecodeDelegateDefault" + DOCDecodeDelegate="$DOCDecodeDelegateDefault" + DVIDecodeDelegate="$DVIDecodeDelegateDefault" + EditorDelegate="$EditorDelegateDefault" + GVCDecodeDelegate="$GVCDecodeDelegateDefault" + HPGLDecodeDelegate="$HPGLDecodeDelegateDefault" + HTMLDecodeDelegate="$HTMLDecodeDelegateDefault" + ILBMDecodeDelegate="$ILBMDecodeDelegateDefault" + ILBMEncodeDelegate="$ILBMEncodeDelegateDefault" + JXRDecodeDelegate="$JXRDecodeDelegateDefault" + JXREncodeDelegate="$JXREncodeDelegateDefault" + LEPDelegate="$LEPDelegateDefault" + LPDelegate="$LPDelegateDefault" + LaunchDelegate="$LaunchDelegateDefault" + VIDEODecodeDelegate="$VIDEODecodeDelegateDefault" + VIDEOEncodeDelegate="$VIDEOEncodeDelegateDefault" + MogrifyDelegate="$MogrifyDelegateDefault" + MrSIDDecodeDelegate="$MrSIDDecodeDelegateDefault" + PCLDelegate="$PCLDelegateDefault" + PSDelegate="$PSDelegateDefault" + RSVGDecodeDelegate="$RSVGDecodeDelegateDefault" + SVGDecodeDelegate="$SVGDecodeDelegateDefault" + ShowImageDelegate="$ShowImageDelegateDefault" + TextEncodeDelegate="$TextEncodeDelegateDefault" + TraceEncodeDelegate="$TraceEncodeDelegateDefault" + WebPDecodeDelegate="$WebPDecodeDelegateDefault" + WebPEncodeDelegate="$WebPEncodeDelegateDefault" + WWWDecodeDelegate="$WWWDecodeDelegateDefault" + XPSDelegate="$XPSDelegateDefault" +fi + +# Delegate substitutions +AC_SUBST([BPGDecodeDelegate]) +AC_SUBST([BPGEncodeDelegate]) +AC_SUBST([BlenderDecodeDelegate]) +AC_SUBST([BrowseDelegate]) +AC_SUBST([ConvertDelegate]) +AC_SUBST([GVCDecodeDelegate]) +AC_SUBST([DVIDecodeDelegate]) +AC_SUBST([EditorDelegate]) +AC_SUBST([HPGLDecodeDelegate]) +AC_SUBST([HTMLDecodeDelegate]) +AC_SUBST([ILBMDecodeDelegate]) +AC_SUBST([ILBMEncodeDelegate]) +AC_SUBST([JXRDecodeDelegate]) +AC_SUBST([JXREncodeDelegate]) +AC_SUBST([LaunchDelegate]) +AC_SUBST([LEPDelegate]) +AC_SUBST([LPDelegate]) +AC_SUBST([VIDEODecodeDelegate]) +AC_SUBST([VIDEOEncodeDelegate]) +AC_SUBST([MogrifyDelegate]) +AC_SUBST([MrSIDDecodeDelegate]) +AC_SUBST([PCLDelegate]) +AC_SUBST([PSDelegate]) +AC_SUBST([ShowImageDelegate]) +AC_SUBST([TextEncodeDelegate]) +AC_SUBST([TraceEncodeDelegate]) +AC_SUBST([WebPDecodeDelegate]) +AC_SUBST([WebPEncodeDelegate]) +AC_SUBST([WWWDecodeDelegate]) +AC_SUBST([XPSDelegate]) + +# +# RPM support. +# +RPM='' +AC_CHECK_PROGS([TAR],[gnutar gtar tar]) +AC_CHECK_PROGS([PERL],[perl]) +AC_CHECK_PROGS([RPM],[rpmbuild rpm]) +AM_MISSING_PROG([ACLOCAL],[aclocal],[$missing_dir]) +AM_MISSING_PROG([AUTOCONF],[autoconf],[$missing_dir]) +AM_MISSING_PROG([AUTOMAKE],[automake],[$missing_dir]) +AM_MISSING_PROG([AUTOHEADER],[autoheader],[$missing_dir]) +AC_SUBST([RPM]) +AM_CONDITIONAL([RPM_DELEGATE],[test "x$RPM" != "x"]) + +# +# 7ZIP support (http://p7zip.sourceforge.net/) +# +P7ZIP='' +AC_CHECK_PROGS([P7ZIP],[7za]) +AC_SUBST([P7ZIP]) +AM_CONDITIONAL([P7ZIP_DELEGATE],[test "x$P7ZIP" != "x"]) + +# +# ZIP support (http://www.info-zip.org/Zip.html) +# +ZIP='' +AC_CHECK_PROGS([ZIP],[zip]) +AC_SUBST([ZIP]) +AM_CONDITIONAL([ZIP_DELEGATE],[test "x$ZIP" != "x"]) + +# +# GhostPCL related configuration. +# +PCLColorDevice=ppmraw +PCLCMYKDevice=pamcmyk32 +PCLMonoDevice=pbmraw +if test -z "$PCLVersion"; then + PCLVersion='unknown' +fi +if test $have_pcl = 'yes'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for PCL]) + AC_MSG_RESULT([]) + # PCLColorDevice + AC_MSG_CHECKING([for pcl color device]) + if $PCLDelegate -dBATCH -sDEVICE=$PCLColorDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + PCLColorDevice=ppmraw + fi + AC_MSG_RESULT([$PCLColorDevice]) + + # PCLCMYKDevice + AC_MSG_CHECKING([for pcl CMYK device]) + if $PCLDelegate -dBATCH -sDEVICE=$PCLColorDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + PCLCMYKDevice=$PCLColorDevice + fi + AC_MSG_RESULT([$PCLCMYKDevice]) + + # PCLMonoDevice + AC_MSG_CHECKING([for pcl mono device]) + if $PCLDelegate -dBATCH -sDEVICE=$PCLMonoDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + PCLMonoDevice=$PCLColorDevice + fi + AC_MSG_RESULT([$PCLMonoDevice]) +fi + +AC_SUBST([PCLMonoDevice]) +AC_SUBST([PCLColorDevice]) +AC_SUBST([PCLCMYKDevice]) +AC_SUBST([PCLVersion]) + +# +# GhostXPS related configuration. +# +XPSColorDevice=ppmraw +XPSCMYKDevice=bmpsep8 +XPSMonoDevice=pbmraw +if test -z "$XPSVersion"; then + XPSVersion='unknown' +fi +if test $have_xps = 'yes'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for XPS]) + AC_MSG_RESULT([]) + # XPSColorDevice + AC_MSG_CHECKING([for xps color device]) + if $XPSDelegate -dBATCH -sDEVICE=$XPSColorDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + XPSColorDevice=ppmraw + fi + AC_MSG_RESULT([$XPSColorDevice]) + + # XPSCMYKDevice + AC_MSG_CHECKING([for xps CMYK device]) + if $XPSDelegate -dBATCH -sDEVICE=$XPSColorDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + XPSCMYKDevice=$XPSColorDevice + fi + AC_MSG_RESULT([$XPSCMYKDevice]) + + # XPSMonoDevice + AC_MSG_CHECKING([for xps mono device]) + if $XPSDelegate -dBATCH -sDEVICE=$XPSMonoDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + XPSMonoDevice=$XPSColorDevice + fi + AC_MSG_RESULT([$XPSMonoDevice]) +fi + +AC_SUBST([XPSMonoDevice]) +AC_SUBST([XPSColorDevice]) +AC_SUBST([XPSCMYKDevice]) +AC_SUBST([XPSVersion]) + +# +# Ghostscript related configuration. +# +GSAlphaDevice=pngalpha +GSColorDevice=png16m +GSCMYKDevice=pamcmyk32 +GSMonoDevice=pbmraw +GSPDFDevice=pdfwrite +GSPSDevice=ps2write +GSEPSDevice=eps2write +GSVersion='unknown' +if test $have_gs = 'yes'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for Ghostscript]) + AC_MSG_RESULT([]) + AC_MSG_CHECKING([for Ghostscript version]) + if GSVersion=`$PSDelegate --version`; then + : + else + GSVersion=`$PSDelegate --help | sed -e '1q' | awk '{ print $3 }'` + fi + AC_MSG_RESULT([$GSVersion]) + + # GSColorDevice + AC_MSG_CHECKING([for gs color device]) + if $PSDelegate -q -dBATCH -sDEVICE=$GSColorDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + GSColorDevice=ppmraw + fi + AC_MSG_RESULT([$GSColorDevice]) + + # GSAlphaDevice + AC_MSG_CHECKING([for gs alpha device]) + if $PSDelegate -q -dBATCH -sDEVICE=$GSAlphaDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + GSAlphaDevice=$GSColorDevice + fi + AC_MSG_RESULT([$GSAlphaDevice]) + + # GSCMYKDevice + AC_MSG_CHECKING([for gs CMYK device]) + if $PSDelegate -q -dBATCH -sDEVICE=$GSCMYKDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + GSCMYKDevice=pam + fi + AC_MSG_RESULT([$GSCMYKDevice]) + + # GSMonoDevice + AC_MSG_CHECKING([for gs mono device]) + if $PSDelegate -q -dBATCH -sDEVICE=$GSMonoDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + GSMonoDevice=$GSColorDevice + fi + AC_MSG_RESULT([$GSMonoDevice]) + + # GSPDFDevice + AC_MSG_CHECKING([for gs PDF writing device]) + if $PSDelegate -q -dBATCH -sDEVICE=$GSPDFDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + GSPDFDevice=nodevice + fi + AC_MSG_RESULT([$GSPDFDevice]) + + # GSPSDevice + AC_MSG_CHECKING([for gs PS writing device]) + if $PSDelegate -q -dBATCH -sDEVICE=$GSPSDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + GSPSDevice=pswrite + fi + AC_MSG_RESULT([$GSPSDevice]) + + # GSEPSDevice + AC_MSG_CHECKING([for gs EPS writing device]) + if $PSDelegate -q -dBATCH -sDEVICE=$GSEPSDevice -sOutputFile=/dev/null < /dev/null 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + : + else + GSEPSDevice=epswrite + fi + AC_MSG_RESULT([$GSEPSDevice]) +fi + +AC_SUBST([GSAlphaDevice]) +AC_SUBST([GSCMYKDevice]) +AC_SUBST([GSColorDevice]) +AC_SUBST([GSEPSDevice]) +AC_SUBST([GSMonoDevice]) +AC_SUBST([GSPDFDevice]) +AC_SUBST([GSPSDevice]) +AC_SUBST([GSVersion]) + +# +# PerlMagick-related configuration +# + +# Look for PERL if PerlMagick requested +# If name/path of desired PERL interpreter is specified, look for that one first +have_perl='no' +if test "$with_perl" != 'no'; then + AC_MSG_RESULT([-------------------------------------------------------------]) + AC_MSG_CHECKING([for Perl]) + AC_MSG_RESULT([]) + if test "$with_perl" != 'yes'; then + AC_CACHE_CHECK([for perl],[ac_cv_path_PERL],[ac_cv_path_PERL="$with_perl"]); + PERL=$ac_cv_path_PERL + AC_SUBST([PERL])dnl + have_perl="$ac_cv_path_PERL" + else + AC_PATH_PROGS([PERL],[perl perl5],[])dnl + if test "$ac_cv_path_PERL"; then + have_perl="$ac_cv_path_PERL" + fi + fi +fi + +if test "$with_perl" != 'yes' ; then + DISTCHECK_CONFIG_FLAGS="${DISTCHECK_CONFIG_FLAGS} --with-perl=$with_perl " +fi + +PERL_SUPPORTS_DESTDIR='no' + +with_perl_static='no' +with_perl_dynamic='no' +if test "$have_perl" != 'no'; then + if test "$with_perl" != 'no' && test "$libtool_build_shared_libs" = 'no'; then + with_perl_static='yes' + fi + if test "$with_perl" != 'no' && test "$libtool_build_shared_libs" = 'yes'; then + with_perl_dynamic='yes' + fi + # Is PERL's MakeMaker new enough to support DESTDIR? + AX_PROG_PERL_VERSION(5.8.1,[PERL_SUPPORTS_DESTDIR='yes'],[PERL_SUPPORTS_DESTDIR='no']) +fi +AM_CONDITIONAL([WITH_PERL],[test "$have_perl" != 'no']) +AM_CONDITIONAL([WITH_PERL_STATIC],[test $with_perl_static = 'yes']) +AM_CONDITIONAL([WITH_PERL_DYNAMIC],[test $with_perl_dynamic = 'yes']) +AC_SUBST([PERL_SUPPORTS_DESTDIR]) + +# Determine path to pick up MagickCore library from for use with building PerlMagick +MAGICKCORE_PATH="${LIB_DIR}" +if test $with_perl_static = 'yes'; then + # Find out where libtool hides its uninstalled libraries (as libtool_objdir) + libtool_objdir=$objdir + + # Linker search path to library, followed by -lMagickCore + MAGICKCORE_PATH="${builddir}/magick/${libtool_objdir}" +fi +AC_SUBST([MAGICKCORE_PATH]) + +# Create a simple string containing format names for all delegate libraries. +MAGICK_DELEGATES='' +if test "$have_autotrace" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES autotrace" +fi +if test "$have_bzlib" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES bzlib" +fi +if test "$have_dps" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES dps" +fi +if test "$have_djvu" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES djvu" +fi +if test "$have_fftw" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES fftw" +fi +if test "$have_flif" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES flif" +fi +if test "$have_fpx" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES fpx" +fi +if test "$have_fontconfig" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES fontconfig" +fi +if test "$have_freetype" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES freetype" +fi +if test "$have_gslib" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES gslib" +fi +if test "$have_heic" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES heic" +fi +if test "$have_jbig" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES jbig" +fi +if test "$have_png$have_jpeg" = 'yesyes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES jng" +fi +if test "$have_jpeg" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES jpeg" +fi +if test "$have_jxl" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES jxl" +fi +if test "$have_lcms" = 'yes' || test "$have_lcms2" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES lcms" +fi +if test "$have_lqr" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES lqr" +fi +if test "$have_lzma" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES lzma" +fi +if test "$have_openexr" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES openexr" +fi +if test "$have_openjp2" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES openjp2" +fi +if test "$have_pango" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES pango" +fi +if test "$have_png" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES png" +fi +have_ps='no' +if test "$have_dps" = 'yes' || \ + test "$have_gs" = 'yes' || \ + test "${native_win32_build}" = 'yes' ; then + have_ps='yes' +fi +if test "$have_ps" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES ps" +fi +if test "$have_raqm" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES raqm" +fi +if test "$have_raw" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES raw" +fi +if test "$have_ra_ppm" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES rad" +fi +if test "$have_rsvg" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES rsvg" +fi +if test "$have_tiff" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES tiff" +fi +if test "$have_ttf" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES ttf" +fi +if test "$have_video" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES video" +fi +if test "$have_webp" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES webp" +fi +if test "$have_wmf" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES wmf" +fi +if test "$have_x" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES x" +fi +if test "$have_xml" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES xml" +fi +if test "$have_zlib" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES zlib" +fi +if test "$have_zstd" = 'yes' ; then + MAGICK_DELEGATES="$MAGICK_DELEGATES zstd" +fi + +# Remove extraneous spaces from output variables (asthetic) +MAGICK_DELEGATES=`echo $MAGICK_DELEGATES | sed -e 's/ */ /g'` +MAGICK_FEATURES=`echo $MAGICK_FEATURES | sed -e 's/ */ /g'` +AC_SUBST([MAGICK_DELEGATES]) +AC_SUBST([MAGICK_FEATURES]) + +# +# Handle special compiler flags +# + +# Add '-p' if prof source profiling support enabled +if test "$enable_prof" = 'yes'; then + CFLAGS="-p $CFLAGS" + CXXFLAGS="-p $CXXFLAGS" + LDFLAGS="-p $LDFLAGS" +fi + +# Add '-pg' if gprof source profiling support enabled +if test "$enable_gprof" = 'yes'; then + CFLAGS="-pg $CFLAGS" + CXXFLAGS="-pg $CXXFLAGS" + LDFLAGS="-pg $LDFLAGS" +fi + +# Add '-ftest-coverage -fprofile-arcs' if gcov source profiling support enabled +# This is a gcc-specific feature +if test "$enable_gcov" = 'yes'; then + AC_CHECK_LIB(gcov,_gcov_init) + AC_CHECK_LIB(gcov,__gcov_init) + case "$target_os" in + darwin*) + OSX_GCOV_LDFLAG="-Wl,-single_module" + ;; + *) + OSX_GCOV_LDFLAG="" + ;; + esac + AC_SUBST([OSX_GCOV_LDFLAG]) + CFLAGS="-ftest-coverage -fprofile-arcs $CFLAGS" + CXXFLAGS="-ftest-coverage -fprofile-arcs $CXXFLAGS" + LDFLAGS="-ftest-coverage -fprofile-arcs $LDFLAGS" +fi + +# +# Build library dependency list for libMagickCore +# + +if test "$build_modules" != 'no'; then + MAGICK_DEP_LIBS="$USER_LIBS $LCMS_LIBS $FREETYPE_LIBS $RAQM_LIBS $LQR_LIBS $FFTW_LIBS $XML_LIBS $FLIF_LIBS $FONTCONFIG_LIBS $XEXT_LIBS $IPC_LIBS $X11_LIBS $XT_LIBS $BZLIB_LIBS $ZLIB_LIBS $ZSTD_LIBS $LTDL_LIBS $GDI32_LIBS $MATH_LIBS $CL_LIBS $UMEM_LIBS $JEMALLOC_LIBS $THREAD_LIBS $TCMALLOC_LIBS" +else + MAGICK_DEP_LIBS="$USER_LIBS $JBIG_LIBS $LCMS_LIBS $TIFF_LIBS $FREETYPE_LIBS $RAQM_LIBS $JPEG_LIBS $JXL_LIBS $GS_LIBS $LQR_LIBS $PNG_LIBS $AUTOTRACE_LIBS $DJVU_LIBS $FFTW_LIBS $FLIF_LIBS $FPX_LIBS $FONTCONFIG_LIBS $HEIF_LIBS $WEBPMUX_LIBS $WEBP_LIBS $WMF_LIBS $DPS_LIBS $XEXT_LIBS $XT_LIBS $IPC_LIBS $X11_LIBS $LZMA_LIBS $BZLIB_LIBS $OPENEXR_LIBS $LIBOPENJP2_LIBS $PANGO_LIBS $RAW_R_LIBS $RSVG_LIBS $XML_LIBS $GVC_LIBS $ZLIB_LIBS $ZSTD_LIBS $LTDL_LIBS $GDI32_LIBS $MATH_LIBS $CL_LIBS $UMEM_LIBS $JEMALLOC_LIBS $THREAD_LIBS $TCMALLOC_LIBS" +fi +MAGICK_EXTRA_DEP_LIBS="$GOMP_LIBS" +AC_SUBST([MAGICK_DEP_LIBS]) +AC_SUBST([MAGICK_EXTRA_DEP_LIBS]) + +# Pass only user-provided LIBS as "global" libraries +LIBS=$USER_LIBS + +#AC_SUBST([CPPFLAGS]) +AC_SUBST([X_CFLAGS]) +#AC_SUBST([LDFLAGS]) +#AC_SUBST([X_PRE_LIBS]) +#AC_SUBST([X_LIBS]) +#AC_SUBST([X_EXTRA_LIBS]) + +MAGICK_CFLAGS=$CFLAGS +MAGICK_CXXFLAGS="$CXXFLAGS" +MAGICK_CPPFLAGS=`echo $MAGICK_CPPFLAGS | sed -e 's/ */ /g'` +MAGICK_PCFLAGS=`echo $MAGICK_PCFLAGS | sed -e 's/ */ /g'` +MAGICK_LDFLAGS="-L$LIB_DIR $LDFLAGS" +MAGICK_LIBS="$MAGICK_DEP_LIBS $MAGICK_EXTRA_DEP_LIBS" + +AC_SUBST([MAGICK_CFLAGS]) +AC_SUBST([MAGICK_CXXFLAGS]) +AC_SUBST([MAGICK_CPPFLAGS]) +AC_SUBST([MAGICK_PCFLAGS]) +AC_SUBST([MAGICK_LDFLAGS]) +AC_SUBST([MAGICK_LIBS]) + +# Set configured scripts to executable. +AC_CONFIG_COMMANDS([default],[],[]) +AC_CONFIG_COMMANDS([magick.sh.in],[chmod +x magick.sh]) +AC_CONFIG_COMMANDS([MagickCore-config.in],[chmod +x magick/MagickCore-config]) +AC_CONFIG_COMMANDS([Magick-config.in],[chmod +x magick/Magick-config]) +AC_CONFIG_COMMANDS([MagickWand-config.in],[chmod +x wand/MagickWand-config]) +AC_CONFIG_COMMANDS([Wand-config.in],[chmod +x wand/Wand-config]) +AC_CONFIG_COMMANDS([Magick++-config.in],[chmod +x Magick++/bin/Magick++-config]) +AC_CONFIG_COMMANDS([PerlMagick/check.sh.in],[chmod +x PerlMagick/check.sh]) + +AC_MSG_RESULT([-------------------------------------------------------------]) +AC_MSG_RESULT([Update ImageMagick configuration]) + +rm -f magick-version + +result_dejavu_font_dir='none' +if test "${dejavu_font_dir}x" != 'x'; then + result_dejavu_font_dir=$dejavu_font_dir +fi + +result_ghostscript_font_dir='none' +if test "${ghostscript_font_dir}x" != 'x'; then + result_ghostscript_font_dir=$ghostscript_font_dir +fi + +result_urw_base35_font_dir='none' +if test "${urw_base35_font_dir}x" != 'x'; then + result_urw_base35_font_dir=$urw_base35_font_dir +fi + +result_windows_font_dir='none' +if test "${windows_font_dir}x" != 'x'; then + result_windows_font_dir=${windows_font_dir} +fi + +# ============================================================================== +# Generate build environment +# ============================================================================== +AC_CONFIG_FILES([\ + common.shi \ + config/configure.xml \ + config/delegates.xml \ + config/ImageMagick.rdf \ + config/MagickCore.dox \ + config/MagickWand.dox \ + config/Magick++.dox \ + config/type-apple.xml \ + config/type-dejavu.xml \ + config/type-ghostscript.xml \ + config/type-urw-base35.xml \ + config/type-windows.xml \ + config/type.xml \ + ImageMagick.spec \ + Magick++/bin/Magick++-config \ + magick/ImageMagick.pc \ + Magick++/lib/ImageMagick++.pc \ + Magick++/lib/Magick++.pc \ + magick/Magick-config \ + magick/MagickCore-config \ + magick/MagickCore.pc \ + magick/version.h \ + Makefile \ + magick.sh \ + PerlMagick/check.sh \ + PerlMagick/default/Magick.pm \ + PerlMagick/Makefile.PL \ + PerlMagick/default/Makefile.PL \ + PerlMagick/quantum/Makefile.PL \ + PerlMagick/quantum/quantum.pm \ + PerlMagick/quantum/quantum.xs \ + PerlMagick/quantum/typemap \ + utilities/animate.1 \ + utilities/compare.1 \ + utilities/composite.1 \ + utilities/conjure.1 \ + utilities/convert.1 \ + utilities/display.1 \ + utilities/identify.1 \ + utilities/ImageMagick.1 \ + utilities/import.1 \ + utilities/mogrify.1 \ + utilities/montage.1 \ + utilities/stream.1 \ + wand/MagickWand-config \ + wand/MagickWand.pc \ + wand/Wand-config \ + wand/Wand.pc]) +AC_OUTPUT + +# ============================================================================== +# ImageMagick Configuration +# ============================================================================== +AC_MSG_NOTICE([ +============================================================================== +${PACKAGE_NAME} ${PACKAGE_VERSION} is configured as follows. Please verify that this +configuration matches your expectations. + +Host system type: $host +Build system type: $build + + Option Value +------------------------------------------------------------------------------ +Shared libraries --enable-shared=$enable_shared $libtool_build_shared_libs +Static libraries --enable-static=$enable_static $libtool_build_static_libs +Module support --with-modules=$build_modules $build_modules +GNU ld --with-gnu-ld=$with_gnu_ld $lt_cv_prog_gnu_ld +Quantum depth --with-quantum-depth=$with_quantum_depth $with_quantum_depth +High Dynamic Range Imagery + --enable-hdri=$enable_hdri $enable_hdri + +Install documentation: $wantdocs + +Memory allocation library: + JEMalloc --with-jemalloc=$with_jemalloc $have_jemalloc + TCMalloc --with-tcmalloc=$with_tcmalloc $have_tcmalloc + UMem --with-umem=$with_umem $have_umem + +Delegate library configuration: + BZLIB --with-bzlib=$with_bzlib $have_bzlib + Autotrace --with-autotrace=$with_autotrace $have_autotrace + DJVU --with-djvu=$with_djvu $have_djvu + DPS --with-dps=$with_dps $have_dps + FFTW --with-fftw=$with_fftw $have_fftw + FLIF --with-flif=$with_flif $have_flif + FlashPIX --with-fpx=$with_fpx $have_fpx + FontConfig --with-fontconfig=$with_fontconfig $have_fontconfig + FreeType --with-freetype=$with_freetype $have_freetype + Ghostscript lib --with-gslib=$with_gslib $have_gslib + Graphviz --with-gvc=$with_gvc $have_gvc + HEIC --with-heic=$with_heic $have_heic + JBIG --with-jbig=$with_jbig $have_jbig + JPEG v1 --with-jpeg=$with_jpeg $have_jpeg + JPEG XL --with-jxl=$with_jxl $have_jxl + LCMS --with-lcms=$with_lcms $have_lcms + LQR --with-lqr=$with_lqr $have_lqr + LTDL --with-ltdl=$with_ltdl $have_ltdl + LZMA --with-lzma=$with_lzma $have_lzma + Magick++ --with-magick-plus-plus=$with_magick_plus_plus $have_magick_plus_plus + OpenEXR --with-openexr=$with_openexr $have_openexr + OpenJP2 --with-openjp2=$with_openjp2 $have_openjp2 + PANGO --with-pango=$with_pango $have_pango + PERL --with-perl=$with_perl $have_perl + PNG --with-png=$with_png $have_png + RAQM --with-raqm=$with_raqm $have_raqm + RAW --with-raw=$with_raw $have_raw + RSVG --with-rsvg=$with_rsvg $have_rsvg + TIFF --with-tiff=$with_tiff $have_tiff + WEBP --with-webp=$with_webp $have_webp + WMF --with-wmf=$with_wmf $have_wmf + X11 --with-x=$with_x $have_x + XML --with-xml=$with_xml $have_xml + ZLIB --with-zlib=$with_zlib $have_zlib + ZSTD --with-zstd=$with_zstd $have_zstd + +Delegate program configuration: + GhostPCL None $PCLDelegate ($PCLVersion) + GhostXPS None $XPSDelegate ($XPSVersion) + Ghostscript None $PSDelegate ($GSVersion) + +Font configuration: + Apple fonts --with-apple-font-dir=$with_apple_font_dir $result_apple_font_dir + Dejavu fonts --with-dejavu-font-dir=$with_dejavu_font_dir $result_dejavu_font_dir + Ghostscript fonts --with-gs-font-dir=$with_gs_font_dir $result_ghostscript_font_dir + URW-base35 fonts --with-urw-base35-font-dir=$with_urw_base35_font_dir $result_urw_base35_font_dir + Windows fonts --with-windows-font-dir=$with_windows_font_dir $result_windows_font_dir + +X11 configuration: + X_CFLAGS = $X_CFLAGS + X_PRE_LIBS = $X_PRE_LIBS + X_LIBS = $X_LIBS + X_EXTRA_LIBS = $X_EXTRA_LIBS + +Options used to compile and link: + PREFIX = $PREFIX_DIR + EXEC-PREFIX = $EXEC_PREFIX_DIR + VERSION = $PACKAGE_VERSION + CC = $CC + CFLAGS = $CFLAGS + CPPFLAGS = $CPPFLAGS + PCFLAGS = $PCFLAGS + DEFS = $DEFS + LDFLAGS = $LDFLAGS + LIBS = $MAGICK_DEP_LIBS + CXX = $CXX + CXXFLAGS = $CXXFLAGS + FEATURES = $MAGICK_FEATURES + DELEGATES = $MAGICK_DELEGATES +============================================================================== +]) diff --git a/ImageMagick-6.9.12-44/filters/Makefile.am b/ImageMagick-6.9.12-44/filters/Makefile.am new file mode 100644 index 0000000..5b39782 --- /dev/null +++ b/ImageMagick-6.9.12-44/filters/Makefile.am @@ -0,0 +1,36 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building ImageMagick filter modules. + +# Where filter modules get installed +filtersdir = $(FILTER_PATH) + +MAGICK_FILTER_CPPFLAGS = $(AM_CPPFLAGS) + +MAGICK_FILTER_SRCS = \ + filters/analyze.c + +if WITH_MODULES +filters_LTLIBRARIES = filters/analyze.la +else +filters_LTLIBRARIES = +endif # WITH_MODULES +filters_CPPFLAGS = $(MAGICK_FILTER_CPPFLAGS) + +# analyze filter module +filters_analyze_la_SOURCES = filters/analyze.c +filters_analyze_la_CPPFLAGS = $(MAGICK_FILTER_CPPFLAGS) +filters_analyze_la_LDFLAGS = $(MODULECOMMONFLAGS) +filters_analyze_la_LIBADD = $(MAGICKCORE_LIBS) $(MATH_LIBS) diff --git a/ImageMagick-6.9.12-44/filters/analyze.c b/ImageMagick-6.9.12-44/filters/analyze.c new file mode 100644 index 0000000..1ba4526 --- /dev/null +++ b/ImageMagick-6.9.12-44/filters/analyze.c @@ -0,0 +1,284 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% AAA N N AAA L Y Y ZZZZZ EEEEE % +% A A NN N A A L Y Y ZZ E % +% AAAAA N N N AAAAA L Y ZZZ EEE % +% A A N NN A A L Y ZZ E % +% A A N N A A LLLLL Y ZZZZZ EEEEE % +% % +% Analyze An Image % +% % +% Software Design % +% Bill Corbis % +% December 1998 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +*/ + +/* + Include declarations. +*/ +#include +#include +#include +#include +#include +#include +#include "magick/studio.h" +#include "magick/MagickCore.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% a n a l y z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% analyzeImage() computes the brightness and saturation mean, standard +% deviation, kurtosis and skewness and stores these values as attributes +% of the image. +% +% The format of the analyzeImage method is: +% +% size_t analyzeImage(Image *images,const int argc,char **argv, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the address of a structure of type Image. +% +% o argc: Specifies a pointer to an integer describing the number of +% elements in the argument vector. +% +% o argv: Specifies a pointer to a text array containing the command line +% arguments. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +typedef struct _StatisticsInfo +{ + double + area, + brightness, + mean, + standard_deviation, + sum[5], + kurtosis, + skewness; +} StatisticsInfo; + +static inline int GetMagickNumberThreads(const Image *source, + const Image *destination,const size_t chunk,int multithreaded) +{ +#define MagickMax(x,y) (((x) > (y)) ? (x) : (y)) +#define MagickMin(x,y) (((x) < (y)) ? (x) : (y)) + + /* + Number of threads bounded by the amount of work and any thread resource + limit. The limit is 2 if the pixel cache type is not memory or + memory-mapped. + */ + if (multithreaded == 0) + return(1); + if (((GetImagePixelCacheType(source) != MemoryCache) && + (GetImagePixelCacheType(source) != MapCache)) || + ((GetImagePixelCacheType(destination) != MemoryCache) && + (GetImagePixelCacheType(destination) != MapCache))) + return(MagickMax(MagickMin(GetMagickResourceLimit(ThreadResource),2),1)); + return(MagickMax(MagickMin((ssize_t) GetMagickResourceLimit(ThreadResource), + (ssize_t) (chunk)/64),1)); +} + +ModuleExport size_t analyzeImage(Image **images,const int argc, + const char **argv,ExceptionInfo *exception) +{ +#define AnalyzeImageFilterTag "Filter/Analyze" +#define magick_number_threads(source,destination,chunk,multithreaded) \ + num_threads(GetMagickNumberThreads(source,destination,chunk,multithreaded)) + + char + text[MagickPathExtent]; + + Image + *image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + assert(images != (Image **) NULL); + assert(*images != (Image *) NULL); + assert((*images)->signature == MagickCoreSignature); + (void) argc; + (void) argv; + image=(*images); + status=MagickTrue; + progress=0; + for ( ; image != (Image *) NULL; image=GetNextImageInList(image)) + { + CacheView + *image_view; + + double + area; + + ssize_t + y; + + StatisticsInfo + brightness, + saturation; + + if (status == MagickFalse) + continue; + (void) memset(&brightness,0,sizeof(brightness)); + (void) memset(&saturation,0,sizeof(saturation)); + status=MagickTrue; + image_view=AcquireVirtualCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) \ + shared(progress,status,brightness,saturation) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *p; + + ssize_t + i, + x; + + StatisticsInfo + local_brightness, + local_saturation; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + (void) memset(&local_brightness,0,sizeof(local_brightness)); + (void) memset(&local_saturation,0,sizeof(local_saturation)); + for (x=0; x < (ssize_t) image->columns; x++) + { + double + b, + h, + s; + + ConvertRGBToHSL(GetPixelRed(p),GetPixelGreen(p),GetPixelBlue(p), + &h,&s,&b); + b*=QuantumRange; + for (i=1; i <= 4; i++) + local_brightness.sum[i]+=pow(b,(double) i); + s*=QuantumRange; + for (i=1; i <= 4; i++) + local_saturation.sum[i]+=pow(s,(double) i); + p++; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp critical (analyzeImage) +#endif + for (i=1; i <= 4; i++) + { + brightness.sum[i]+=local_brightness.sum[i]; + saturation.sum[i]+=local_saturation.sum[i]; + } + } + image_view=DestroyCacheView(image_view); + area=(double) image->columns*image->rows; + brightness.mean=brightness.sum[1]/area; + (void) FormatLocaleString(text,MagickPathExtent,"%g",brightness.mean); + (void) SetImageProperty(image,"filter:brightness:mean",text); + brightness.standard_deviation=sqrt(brightness.sum[2]/area- + (brightness.sum[1]/area*brightness.sum[1]/area)); + (void) FormatLocaleString(text,MagickPathExtent,"%g", + brightness.standard_deviation); + (void) SetImageProperty(image,"filter:brightness:standard-deviation",text); + if (fabs(brightness.standard_deviation) >= MagickEpsilon) + brightness.kurtosis=(brightness.sum[4]/area-4.0*brightness.mean* + brightness.sum[3]/area+6.0*brightness.mean*brightness.mean* + brightness.sum[2]/area-3.0*brightness.mean*brightness.mean* + brightness.mean*brightness.mean)/(brightness.standard_deviation* + brightness.standard_deviation*brightness.standard_deviation* + brightness.standard_deviation)-3.0; + (void) FormatLocaleString(text,MagickPathExtent,"%g",brightness.kurtosis); + (void) SetImageProperty(image,"filter:brightness:kurtosis",text); + if (brightness.standard_deviation != 0) + brightness.skewness=(brightness.sum[3]/area-3.0*brightness.mean* + brightness.sum[2]/area+2.0*brightness.mean*brightness.mean* + brightness.mean)/(brightness.standard_deviation* + brightness.standard_deviation*brightness.standard_deviation); + (void) FormatLocaleString(text,MagickPathExtent,"%g",brightness.skewness); + (void) SetImageProperty(image,"filter:brightness:skewness",text); + saturation.mean=saturation.sum[1]/area; + (void) FormatLocaleString(text,MagickPathExtent,"%g",saturation.mean); + (void) SetImageProperty(image,"filter:saturation:mean",text); + saturation.standard_deviation=sqrt(saturation.sum[2]/area- + (saturation.sum[1]/area*saturation.sum[1]/area)); + (void) FormatLocaleString(text,MagickPathExtent,"%g", + saturation.standard_deviation); + (void) SetImageProperty(image,"filter:saturation:standard-deviation",text); + if (fabs(saturation.standard_deviation) >= MagickEpsilon) + saturation.kurtosis=(saturation.sum[4]/area-4.0*saturation.mean* + saturation.sum[3]/area+6.0*saturation.mean*saturation.mean* + saturation.sum[2]/area-3.0*saturation.mean*saturation.mean* + saturation.mean*saturation.mean)/(saturation.standard_deviation* + saturation.standard_deviation*saturation.standard_deviation* + saturation.standard_deviation)-3.0; + (void) FormatLocaleString(text,MagickPathExtent,"%g",saturation.kurtosis); + (void) SetImageProperty(image,"filter:saturation:kurtosis",text); + if (fabs(saturation.standard_deviation) >= MagickEpsilon) + saturation.skewness=(saturation.sum[3]/area-3.0*saturation.mean* + saturation.sum[2]/area+2.0*saturation.mean*saturation.mean* + saturation.mean)/(saturation.standard_deviation* + saturation.standard_deviation*saturation.standard_deviation); + (void) FormatLocaleString(text,MagickPathExtent,"%g",saturation.skewness); + (void) SetImageProperty(image,"filter:saturation:skewness",text); + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,AnalyzeImageFilterTag,progress, + GetImageListLength(image)); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(MagickImageFilterSignature); +} diff --git a/ImageMagick-6.9.12-44/images/ImageMagick.ico b/ImageMagick-6.9.12-44/images/ImageMagick.ico new file mode 100644 index 0000000000000000000000000000000000000000..cb33b6c679bcdc14f08bee822eb257f68ad677bb GIT binary patch literal 22382 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 Ay#N3J literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/affine.png b/ImageMagick-6.9.12-44/images/affine.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9601bd6e7a46bedb4303f95fca181c961ee406 GIT binary patch literal 2975 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/atop.gif b/ImageMagick-6.9.12-44/images/atop.gif new file mode 100644 index 0000000000000000000000000000000000000000..04273907bbf07913979eeb1cf7cbb624d0ef3323 GIT binary patch literal 1219 zcmZ?wbhEHbv|w;!_};_-1dNP~OiWD7%*-q-EUc`oY;0`o?CcyI9Gsk-TwGk-+}u1o zJiNTTe0+TT{QLp}0)m2qLPA2q!op%=V&dZB5)u-Ul9EzVQZh0!va+&ra&q$W@(KzH zii(QL%E~G#DypigYHDig>gpOA8k(A#+S=MWIy$<#y88P11_lNuCMKq)re zmX>yQcJ}u64h{~kuCDIx?w+2WUS3|_-rhbwKEA%betv%b{{Df1fuW(HVPRq6;o(tH zQPI)SadB}eDJkjc>6w|CSy@>*IXU_H`9(!VB_$>0<>fUsHMO<1t*x!??d{#&-MziN zlP6D}IdkUh*|X=&nKO6p+T|n7u zj>pDDN4q7Av+kVOxcGR#f^(OQ=cXkmCu;<+iaEJy>FMbP$*1OcZcaOGTanYpuwZif z*}2+>KkQ(5;J~S7$;ue9tK`8v4GlhpjE$`i&e?iv$Vhxl@psYk4&`_#$asLiF-U`9 zf>NpiAA?}s0|y3$lLzM7@Lia}{lLwIm!X5FrTM{u*!fHw88RH*6{HWOvAkQdz)fL} z5W^0KBTh?s5At_3^0hE3d~!JIrow!{$$*DJO89ESLZ&4vvzqvnL|T|1v}Reb3I;S( z9PemeDxNpR)<@t#ds8*Tlz_KijUTmbZS3*XiV7%q+*!U*|6lBdM&^z~tGQXu)Rbg4 zMKi5Vvkl;3kPuL|$k6%Fnfv~_=CK*cF1-t-Qkk|kMuzgsKD;C7Hl^U8pUVP84lV|U z#OV&^2UNvly=BC%^49!hy(s6yP}V3|Tp@UnF`nZQYr-zhFCm=lG9Q}K+Alh~L@HZM z4Dr5yG9<;v{m_&r-o*^*mnR3fX+E725|;UNYDC(~r_*A}UOt_k(5Cs!nURsf8UXt+ BT(|%L literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/background.jpg b/ImageMagick-6.9.12-44/images/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eda854a3f44d44581652ff8a4642ac0c378a67d2 GIT binary patch literal 556 zcmex=C#ZktD>@m%n6ZlL(t~1EddRB$6bM$;u8CR~BSo zWMN`tM$#xEn)-a{GFBF`No*mZ*RKD+#lXYN2y_9nAcH-_$=yd<3t!yaW_kKexZw1K zeTTyyK62XeB?rV8aF%Ubdl)2tqj>s_bqa0PywUBQT#qkqc&@)O#*wE?YCFG>=<&sg z=i-xgG)cTM&688n?sq#pXW!967Q-7^cWgYu<$BvKYr7tCByYI7qhi83TWP+c-=aqZ zjwh}z_^23DWhV3Vn|6mHb*-K8UGvhu=#%%h8`th~d2iSJ#Bx7>;J;ZRZ|AMQRah6J Jf3g4nO#sPOo>c$< literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/bitcoin.svg b/ImageMagick-6.9.12-44/images/bitcoin.svg new file mode 100644 index 0000000..8e000fc --- /dev/null +++ b/ImageMagick-6.9.12-44/images/bitcoin.svg @@ -0,0 +1,10 @@ + + + + QR Code + bitcoin:bc1qd7lckxu36ceupgt4wpnvnug3dr8jcnpqxsla2k?label=ImageMagick%20Donation + + + + + diff --git a/ImageMagick-6.9.12-44/images/black.png b/ImageMagick-6.9.12-44/images/black.png new file mode 100644 index 0000000000000000000000000000000000000000..9b11af368ae7417d61009c816458c71bd4fc0f2c GIT binary patch literal 128 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

    moAQ+-Pn&#~ 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/cylinder_shaded.png b/ImageMagick-6.9.12-44/images/cylinder_shaded.png new file mode 100644 index 0000000000000000000000000000000000000000..478750107a0b65dcb9cee747cfeedaf6d0d970a4 GIT binary patch literal 90419 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

    siC`5C)(MXlrQ8QTQq$FrvD6#*&N1K~#8 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 O0000`xYMK}+ekVsodF0ql^a=%4on_OEp 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 z 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

    Q{)RjStQHN$~Pn|PLdS6xWQZxBt+lJnGg0KQ& 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

    (n<%c+2?Lz_ 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�~Gb$~VcqxPTarcV& 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/fuzzy-magick.png b/ImageMagick-6.9.12-44/images/fuzzy-magick.png new file mode 100644 index 0000000000000000000000000000000000000000..bf28b987ff1b4dd990ff8dd49b2f5ec296236a99 GIT binary patch literal 62734 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/gaussian-blur.png b/ImageMagick-6.9.12-44/images/gaussian-blur.png new file mode 100644 index 0000000000000000000000000000000000000000..558d125e8cb4fb21f4a5f1ff5e79ecd4013d77ca GIT binary patch literal 1363 zcmV-Z1+4msP)@jfAp@7n)OXF6T~tMmJO>=QZt+W8X?|BbAF?fk%DYu|@s^mE7#|1#o^?xU}d z**SEHpBa^1ZF(#JMu;8L;)t`^DATgKLClaBPae|Q_$&>kjn1#dBtb$O7bp6QMdN*2 zp3)6svB^uP59!>LA}g~d$+n}A6@j$k`vC?gO4}=ES87ejJDG` zLINpC18AVs3%x9rYt)F0t(Ylj-!Fc>|l?}G_yEE_Cx%F4C86LX1mc*v!jRG_z zp`y-?vRX^a2{JQpXwH;`Z5HCCr-lZt?htA3rtO@!@CcnM@kld=-irHjaN=)82co+uhoY|wMoXMijjtt1APG=BBp` z=`dZwI-|a@&Z2d6{yULX@@)cjg|`9C6gmg5j2U6Sp}?Y7Mx3)@0X4g9cOo97dFg0j z2ntQRs9b!RVbmE>TLMtOC0Q^fN_1yNLehK?o2)==$baGh6j5+xESc&G_TxAmTISk79v=fO6&ki4&R01H0-kz5cMKi9#Y|G2Z<5ux#Cs)WGzh0s)+#sx{nV# zHd9K>aW}bZ6R$!ufTGT%SIO3qI68_{-qLr(q$45qbrn;Ku=dJxER^meYn>2GnRm(h zALn6!BsKBgKnYr@nie_nrW$@m31miGa}i*AF6QJ^S|N$scmfQfwFYuYyTA1p$fJ2M z=A#cg!@0`i#SSPjR|ni&DlI7PP;xvhlC!uBAmZf+0;PFk>7>#N=eQPS+jKsbiz@2H zL8nNKrM>Nh4lR1f&BBHGA>dO=!C8{`TMq1~bL>|8Iy*}TD^C44oeyO@SzLSV>qK>e z_@w0_)uzDJIqS^*$y)o{0CkOIicRP2*EFf|uZqZ=uOdGIZ%joePErKVsPXhtYQfnn z=B{VvFz_PZJoU&Ys9A3@NWQeu;IUSzmE`aX(t(*%$wsO{vB&s$t=g`*JzU4WzK3VQ z@vsy1kzw>kbWc4A^#W}eq`s$2=9(^hZ*q^k&+WwOdzrVm;@Za1#y6$(cE{(f80U3n zn0rqPhhwMP+5naDF7%$>X+OvYN3wF}NXd3R8c@C?R>?aNw`I?kavFVW}KvYqwr}eT~&2z>ILryJ>@qf)|>9f;?$aNaXb2Pd@d;rKVkA7JiPK9iu~#$8d%r9{)`0r`md15~`H0>^afKJqo?9>q&xe*m)0 V9A`y|BhiLx?qokZDx>;5;H?>L-Fq_n4CfE6+$kAr{WSJ_s0l1y@im(JRz&@+r60G5Ehr+u}LJ!rP{8;Z-i-iA)V=6exhSl zWM${wK>UQ~%4$AaroU)9^zlN5phUIHIn4ury6f*<-8EDx`$PGG}rsr_KWk&f=FzG2z zeyM{h{T%l*GsySCq@y;;5gnB1cevg%4nG2ut{RZLbx@%O*E5sl3MOrJi=;Xz(m(O2 zWybjL(D2l#Jfr;@J&s428RGk(;i!zfNBd>^1KO5x`Df5@)u7y?{Tcc`+RWtmBl(FOrAdvaYv=)X6=_~fSs1H`9X-gDk~q=euch` zoy_#}D#UHoBd^qck^Y5CmKf(3py{bG`J1lS=vTPJ#4ulkrla~~LD$RlN8D}+j~|1k ztA^w&x;{fc!0k*7@TZ_@t6Sw-U7x0BalsO!{4``e<;qWVy-GjD1ttdhi;#8HZ8ERx zC5pJl5)MBESy$zx*7XW~7uPV6<&QwtRvYC?T`$r<5G*mqe}OqqjmT3vTBBbeFfqhm zhB-%VmJ>Q!rr%@A5-$G;=3JGR&*|t4eGgMiR&=yN4`4eJ{k#MbTiq;|>1dHYaH-9# zuE|%gJ-HBm==FtOyD+h}ur1-sZK06vSp250c&w}Y#(aETqC1x8UfUI0mx#sAJP~pJ d1MIkW;_f?l{y*^ap%*X&NV>N#xp(81(mzMPfBygg literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/gradients/linear_gradient_default.png b/ImageMagick-6.9.12-44/images/gradients/linear_gradient_default.png new file mode 100644 index 0000000000000000000000000000000000000000..631c1f5995cedafc5e47e0d531e4449d1b8c5f20 GIT binary patch literal 823 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%0A9E8FE0jdA@0}ak*i&LA_qHPPE6)1r`o01BikqW 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/gradients/radial_gradient_diagonal.png b/ImageMagick-6.9.12-44/images/gradients/radial_gradient_diagonal.png new file mode 100644 index 0000000000000000000000000000000000000000..44d7e7052a7ec031e86c1a5ae2c35ae4bab03d7b GIT binary patch literal 46933 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 WtzpXX>0f~w7(8A5T-G@yGywpXp*->c literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/gradients/radial_gradient_ellipse_angle45.png b/ImageMagick-6.9.12-44/images/gradients/radial_gradient_ellipse_angle45.png new file mode 100644 index 0000000000000000000000000000000000000000..89de0230c39e6a308942d3bd6d29090d6a3e7437 GIT binary patch literal 50041 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 F{{cTy`b7W$ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/gradients/radial_gradient_maximum.png b/ImageMagick-6.9.12-44/images/gradients/radial_gradient_maximum.png new file mode 100644 index 0000000000000000000000000000000000000000..47f9d9e8852a610e30dc2002a49f23549b0094a3 GIT binary patch literal 44685 zcmV*pKt{ibP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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�Gk{7wYOmh9!LmARFj5p)^e04X^e&&^CI6wf z^}FQ6E#t-H*U_)(X1->+y}iAk!xr8K1}vj$D;)0t|QvKz)u&IBJlP=IsZ(+nqN z$c*H8Xt#SI_$zhb`yf>;2fBNc>BD%!Jp>{bZwRbu|~)Z zJg$4Q3S~Y@k6`;_v9r2{dgW?KD@E8C3TJP>Z#b2*nlEuekkT!r1Ai@*2n4PIr}?$U zUm*rjSDwqgsV9iED#+Ot`tU=4WqY|fl)>U30NCn}>W3s`gI+ihOw66kod4s>8)$|B z?X#Lp_bgpNB2SgaZt=}Gi}{y59lxgCw;yopdlErwC&iAZq;`oe}*nyz^rjnksq+9!ygZ z{gSabj%HTIgtm@mZ|$Es#;>6@>|XoGHnO=$k?e`|{dAw>Hr}jsex;Pbgu%r`Umk&| zAhs$79)*fTES=^#rWrm>q%=%@0VH5E6!lUPJFb(UUiF(GcP(hQT*j&QE>r3&vc$sP z03y3sfOKj&<@dLIfVB?fgbrTk4jQEngqbF6V^O`|pLcaez(?DAzQQTe{tL;fMG%kV z!<$vH2L#@1fC~grXe5Rn&F4|e5J0g?!H>sqqtC(1k=+r@RI1Om{uM&q4f{YEba) z28=3Y4eg|CHUl*qH0%DXvy?OcXR>U{k|w=D3)Ii1ia6Rs?j-f1TDTb z3mY3c!~$(u<4lbcB|!jxI)3AQDl|Mclp9}5Cr+l#CXD~Bl2af$a8&RNe;#nx)!1$vDWIK*{9Hh){miV!8rkmMyWtc6lP>Apb>@^ri>(uRN|X_f`o@5Iz2Q%^))F) zA^s^2XI1Z5D^_$9ZUb7V0xli3reF6_fhgky_e`zXx9zLV%R8c}h_>NBtg$o70Dk}& z(I6)9)&#xh(1KGTPB3@9kHTUw=jAD(br#^E}xCMBPa7QZ6L=`?Q918 z6)r{VdX4mw;u*J5&X>WO%)b8M4LYl=FYcUQ(Fnx337=p#Q_n4C6?b6(=%V4B%ew`Yt&7y>#FcxT#(@>z@+POjZ<+~Pc?Tzo0c*#^zn_7g0*W4 z?Y$qn8cd<{Wr*{oKRAod>{P2B<-+oDJCy8xjKD6%SL!)){-x@+z~tZ+&x$DRZGhJf z!5?lg7Aa&%^{KCKkFwpZ-P=b_%t}l_j7g5ZSPs5-l;z#pxL1^&S%1f5pn)AiY;DBXB?Tcw?Rg%@*aZWL-cK7i-V@yQM zA*9N-ILrzp+@KF8YZf1F;EO>^L>?Wb!aD%VTNNCJtP!KcC2U+&5REgE&^@`5sk@5^ z)?c-w?(6((RVdy$#aY_yddO9<)NpX&j#$I1P%jQZ_}8MR^eQ+-JheJ1%yD*Clf;u^mNjx%IRuR3~*=_BKwN*NTBgUQ3{YQf;|%|+TdeckE(>-C=uHswUUIlJ7jfE8 z%AMzYGp3lXa6xLTxRHU*vd24ZFTGUWpe8# zm1HynvT9Yj9rhbLPxKA(96GP@sF}(e5}Mb;xIh$ynlUmv zs5!c(ILq9m11n}JOp^M*Z`&Z2JLl$TvUoFt#S#sy{h;|)Mc}n2NB#L7`VSHSkq}LK zlV8??>srvv{&kFqBI#_07Un3^cxMj)Y$A~V$jqXJ=?3G4dhHD^*(}& zOFcj!X=A0bTv|;s6#>WOr1a_3v+(ZUjeOIdyUoj+IU(Y3mmiv?(*n_sg7t!{Zp)`k z2u&0vNwNYN?O(sRy+dFc5f$6a+HQK0f6$z>_Gdq@vBTEs2fGA0gCjL8g1v4i&XJ~bfB}o4Ew0`gdQ;M;dDHkh)4uO(oBU#< z8rwwatN?oRbg00)Gv2?ZOIR)_8INi!xfDyb^z6G)cnQ~}wF*sB^)&YWeD{8yn;MT6 zi|0>VDSoNer$?^AjMTt{r$yJv_=nXbL&J+2Ainxfld#bC8+u9))CKxPQdQEY&glQpx zHjB-Uz>*T(Jz%nVhXma9M-7q0ez!9S5!N#?3}SaEO(^Bc%NJ1ilQOL!T>m}vHWwu$ zWW$C*h@4SO3b(P!wrTw0mBb7gkOIkT!pjrh<$z5M-;<%011>7PXCG8*AgdtTle2R z7asSyoA(En8x)53G)c2}aSi-N(X?2Vp^GO!OMUTeT5R>N79;o~^Dpw5#%7-B!xpV#&qt}b4sJBL zt5;Z4D9$1C?O!w;d4WQVzTbqqMlX`kwjjfQFA?=3XAW)N$3F!^qP})BnbUz2bIsN+ z+P#lgb(S*kI2J!3U?NhM^t`ii%WdQmrOVFn2)~gOy*qyu1D_|<(fdVMQz@*zI z2<`FE5v^AbMuDhaBzoLWW2O9Mw1L!-g@3sNS_-^-;7P8cnmPtD!PzP#Gh%FxJ5N|N zwF+S3O}a?D{_%t_HBr{&WsT#Wi$mavK|M=Cv9C}s z@Io`p@C`k5CpzGk3fluvqk2iwUpg?oXxPoS^l*_!hJ!`53=_SCLCax=D7>rd^*^Ix z-HHjv533WyXVB#ci#=v@`9C(eaiRc#A?2_a|20~wWj~wy{g5m3Is5Nus&I|I?f^P!}a$2dSYGr$0LP_Pn(BQTVGdaC8 zvT5&KF;AIaLZ5xmiFR6PwY5$)skYg$tX?uh-gYb|V#jw}TxqtwnHPSoM`XA?4VO(;bUY-3rzX zA0EchdUK@pn@SR0hbOYR-@DBeL{Ot#q(=V!wFb93rh0kraZTC>(D~SE2YXZLgM#%a z4zW@0V2?+gL;$>5HO|N9delnku+=1$iwR{S2GkGm#`_ zH~GY1PjsiQuV=A*!g7grS=#MMrG?2Lw1xjIV>%t{YI%B6Ez$3ehqR|u%XDA6L%WhM z&4?N^|K^SjYVBP*)_mAC*sT#z-lx+=P8*ULfN}!ILJy;z-z_bpi$j7$^-LE1g9kLsN<7` z+JuJvXMVk#s#Ak6?~kD>A>MbhMnll)L3j73e~PDE?P@7)HXX}*Pis=}DOc$`JKpYK zx@lM)FRJ;x%0ycgiDxb}7jeaOhdiiq7%KXqU!J)WvGyR2WQ&$T?2lo^S%Xl{Ok6E+ zpZIAL$hiYqsiV}T%sis!aZPfm=U7p1Z_Ug0;4;1PQ~d!te)3Vx++q|J{r#eI z<%YswTS#T4WBa0m*4Ofv=CU6V2k5oO@H=ei*!E{^K(3S08Nd5E zUff|An}G&R#l!J35Ga|U`sX>l?3|TaQ8Ja|%>P2#^TtD~iBLFMupV%AR^!$c>u zd=tCSm0eF5V+ukoH9K_uJ-v=R_8r`O^>~buDEo0hvyjUKrHLl4arwKN5}?XMYrj)< z*A*T`?1g04vUt%qyDnunXr#~18bD#PNu+UT52YqBW)g3>Z>q@nxT(gqs;*H5gZOIW zY&zBAY%$MHljg7S>%oq4Umm}=Iuz@$B%yWuPUlvRi$sd-#u}~|G(_i`hg`H^Xgr3F zGiHc;_|b27U7yAzkD0s{#ISw~vHZBvkH8>bII{MS9luP=z8F5#4P<}I8p&!U>aqob_rT6+chiado6)Aw7xc_7%%>K??m5Bb%9mc|)`>zTQ&8YL2tpjV_ zi)XT9C9u@&Ug&9=AZ>b7l}MP4((u#;R!I%7kt0r|weeiJ2MC9}odO`FEO-54txpkH zKMX0+9-{Jx$wF%WzC(Q41D?LV9qdqc>RBs8!@yV|NZEi4eg7wN{TJ;!8u1WqMxX#2 z1Y`r5Dt|XjvFlgJS|MvV-O)^v*75W!Q*7(`#pTfY`@W%Iy!*$eNV@#nRNgiW>+czw z;t=EPual=!r>x&}1&pUVD3QH8$G;7fze}fsLXmL&1qLOLQvAWe zZJ)0A-#cm|Qa`+H$9ISNxKA>sOYwU6%g(U4Nn%*t26>0WbhvriM!Idrvf8HoE+qLPEH-LmNYRq` z>!bW$+W0Aao{P`_{>CRUep4YArAG6-mKl>D)?`#o&z47e%X`FV*lWnb^V!zI{Qb9{ zVV}xA8VM-6OlM89NAan}QQ8SLnnDhq4ftUuX`(mGxC)tzcvIFCbgX1I=nQM5XqAwd zyqGE&3eeX*%(bFR=~_QM@)be3rzPBaBZ0VhW%I`1y%-$>5kQX)-F6*7P^40G5>j0j zo|XEp?-rw6m9$n8z@nX!AVV}IfAmc$3@zuCFa8DJYYQ8mVaUMY!KlD^58QPc*NoeP zJ4aXM11GnccX_9afV$5gf8*=Bmry;b!M+}@Xs-RuF>`Ote0ipVreXe&L{PA0p()thlia^f0kpdrC87th$K+BxGYj#aN3On^=CV^fzgushpcDdMNNFo4eWT?N?2GoRX< z^%^?aIqql$G+%mp?&v07_sq?zc-|D5!sv}xy~jKX@A8)oiDzGblWDY)p@Dyn>c(v#NS+^CV9pb)DMQK$6*@k;ljf6)@l@*6&Jpzq?GLZ37EHxh2u$lt#=Z9lcGl_V^2X?^K zfKKa6A5gS-V3ryg-&>yv;@QlB{a@7S-!(W85$KZZ3FWuXkP+U-tEk4SOhSkW<}e@E zxY_WJ*Z5K(3q=)_J&ye<ah-6(3Df~#o&yi&8xyokG1r;T$WF%H(?rt zNdGm8=m2a~tEp*xWgzD}Iu_``9(OAc8u&A7MyS~PW_yVz&RY5ghYV^AW#=?&-W0e= zcb|Ru4v%cE#dzTn0nhDQzr#aT43Txx`K}Rxq;=%9HROW*BKe}}S~CgMQ}#F}hf*aJ zyvF&~_z(+Me|%IjAI>kFx%`2<7keUN@ySoEuWvR1P;PaQp2Y71hb`HUN+=m#JuPDO z4fSIINE7g?<2myK00O6rL54e@_iJKWqGgg8IJ zIt|Iv7YsPq-P5@%Wl0t~FV}ER1Vkx3%?|HR%-6^r-)ng~D`-Mq8$XVU-L|tnwFkG> zM3<}ALOyH0uK&v&>WLa?7xH`R{dX`}TL|!f(N%f7042B3KW@L7vLdoES?_X?ZI8%) z(wRp{A+F&VHWugkTha-gX$>9zkPC4nQfC;*+E(bEc)MRYcWS3QOZUYC(WKf>3l~ z8#?NGzjsIPdt4}4HOdBzT3eD;@)aaz>EZa@CHO)2Rdh-Ram%8w)|JcHGR{?b&AC9b z&2MT!%?9#wY-F-_@kT#7=V9)y?_{M!tfD^0>Q_Dbl#GL>xojjIo9?pL;S`?lmVr-G~Q|^qRw3SG#lTIPU>!v9)PZvsfjBe-b2>22>@v4 zV!v_^cuiTdnJ~4Bg9rc-4EC|MYH+`Uo5O{*dv|ZA-WrXEVCrX~9uk6&mk0nwjd7j} zeA1T_9hV&J9XGt47l?ys0*m&4Ft|$RD0_vLrgJ13dH|L=Jk8J-UjuJb1MiUzpXR;y zzhIO!_$98i?Ix#p_<%fJ?$V4cwVi&mALpK#Q>lrE&55~OgP@)NNdCGU5>tL=X=z>% z1lV-m&61|)w+xtofbWI(xev0oEjRM6%{amA^IS@xk#&h>MlizBpF9%uPg2f^o*(A9 z8(6M{S5S6{NYZf2zy;#gOnz)8Q^Dq=9c=$TX~8Wr2YkssCjgFp9M4xKh@8dYekx1} z!{&96ttDat94XvQadP`>W%kg#D`15pajG~+L`AWH5G6Wy zMBLA3`>(=T|K21Rh|}>A2`youpP`YStmsQ2D{k^Pz5FlSxx8glZL_3WP$CCeP}-0E zbW)3-v#JCm`J*2(5c@WUY0Lo7@sS6v7-;biDp>(+mOESbY^%3*3%o*ePcyCMavaR8 z`4G}^NxU7j5|6fggGR=60D5BBvmv5+xUt;%XxAx~^L01G zGT9yOTz_Rzy*sRS`g4S{dB=Fnu4Qmfcs2ZeC{JAR^2BrL^dB>~uo4`Oi|-$UM2b#BOr*sHS|yDXZ=J_e2+L+j7nKG`k_6rcvK)d6C8-}G&q~vUbgDtJQQ0g5-NV*{B?7H zgkZ3~0eQT6-1pzSef6u_tT*N+l=pStOUQqdG*Yl9FvNQI6mj+`pb3e2;|Q zDK;q}CM^7<>^qMt2>2lGK*dwZC;=eAg(}=}tX|ZQHDvIu*=?F>AzV3quXu>$uX^q3 ziPDcYd4OP?Bx`d$Hu;4PtYy^e*gqKlm9^!|A5U6q(0Lw3lTfQPyDlwT>~43$DYg?8 zUM_Yyml-2DaTz5(F#&0%G^U)@Wgv5``@U|%a~J^xV1Gt2E5Akm@O9wF)qk?q1G0>d z?F}G8X9k0<>3S*GA2LFfUNKTmWwxVEjIJ9JD34Jdks?aw9#&T&+2il-nutMwgdbn_ z(wZWFi{0*XhSDD{%CxA7_3PBh?xS3-fEK_r!4vRZ*4#)8b*k8 z($OGlw?tVmo-SY?{=$68XgfHlT%9h!AnmiFkr8NQ5Qx%>@A_;e8eJ0OAZ%wm(jP5Z|`ukyPgAOSS=d$DzmL9S+L zPw!dWUH$4T0^)g_WaBLMBjokr$$ClxM)989)%nZoji~F40sKLBdAThsCsZgE=ySYY znP?L86(!~NmEQZfrd+L1+Mojf9zq^eZe}STVMm}MY)}_=ig3I;ti8+c9PvZ|6%2G* zoo#Bk`7R%d=8PDe^%q_t5S2hqX`PMu=T(Z=aFD4q6s{%tXhDQw0j?|l#nut77wXhm zXL3ND2@_o{8(2p=F63NJcPXUF+v)HhsX;P{rQN;?&M06eF!-hyPQOAs*W_O@UxW1? z`X%vWs{7=HPuu4}wk_8PEu~AO7^s+fB~4ZC56M)R#aeR_X0)jqU`?>BK@$OF;yOLH zJWltwc=K|i?`-UMHvb%!kbd3^)(9kHvD-27avvKf1vZn;&$4U~ZFE;luILx4@1UjM<}i+pvopDp1HA3CJ+yw^-+T8UnB{RIo ztH?IyZtTg|y+{Gj$0={ZsthfxSQ+ zPN|emm-yYUiq)*Y@@Zy+DnMw($1QsY)Y0)3DAA7Z8-3T_5J(hT27J1`IV@dCZY0i! z0#qnFeCgyO{!o2xKV&D|9M^!jXgszu>uh8_OAE0GOML|A0hlFZ2i13|5P@ciVy~kI z*35*z4$IpN?xO8te*!5wd=Ix5D2VgleXVpiu0&ysF`+AdJVkrnui^GwQgV?n;>`(#c@as;YQIv#~37BV~Le}}u@^yOu#G_8mLerz?80b|;?04nH5EGfc!kCv3-G1>DEs2H_~9 z514i#t#`*uX&~`D*Z9gA^_?by5e$w+96r6RCmc7MJT_1Rq<0~Z&$c*EX$+vD0xH$> z#9*bz?^Y-%4Osb|=J#7D*<}r-V^?b**KrIW^UaSr*I9f7LWf@0AJ<07>UECK=L?=n z%O2q#o#gu%=(N0I8wNb~K51`$Xf9i5Ac`KNfZQt?`p8C391Rwe!GC?!U=@)O(GN0xp0CoxA z9p;uUp9<%(GLQT|%F3NRm>zvU)BRnk@p}4#V^DCHLp%G@n(Lx@3}5h%;6}a;MGjiN zfM!(%%#c`o00uJk%=IG_wi6kFkuvQmj!($Xn&%tWE^7c(CU_p~+h6Vp%OppTmml(L zO@ONSs=FCr3dW-Z%JTOb-YH(ipCa6=q~kqvAg?j~^X-4zGDLmcau+X+(e?cRau@{< z+;Dm!wVF@b?r~Dd6_m!X#HN^7npm2^YN%)=tDj7(n!s2#P^r2I)eKt*TX_r99Ax11 zPxnn|t#5R4Ti9(}@dJ4PELjO7Rtih{4@0~q5h;Nf9@i-qw@ z&0Nv2x+Sm_$L|hC){vO2WAxa6(sEadGlXga%6}#Jy^TcYe3qR4h2g0JiZ1A)bk{q{ zv$%&7fVpf}=2-HjdPxB}4^zw}bjv;2;nbk5{+{W<0fn}a`I+&!KP5^qI3Mf&Cg?`y zf!uRS__BGbF437ztI6t9nmvfzP~6LAbUsa9(5yXD%}d>@Y5esP2|z7#{)W7l&J2?) zXkV7|4FxJ`4T=1RSsK>Z0y*xupb<&DSRfr`YEW;knVO!KAPbN%>{9w6r&a9~?;YMx zJQGBEcm&GIrjt^^X@o#&vh$E=O{XeH`Gi8Z-tg3}ZGem|ap<(hS`L#ZMKvjp?8Y&G z-}TlY`w#UMt$!3=Ld&_)zuC>@LE?1uUmDIJNsl`sb=ptuGtW9t>E>%0G4E+TDPhqe ztWg`Uj@8{?kWpZK-uJqObj$Ru>)Q8SrD*=T!NIzr()3-d^qs6@{<hJ=L~w;jKe^H_Eows3sOpe^BexJ!-Qst&`N>u z&lR}D0G~GPWA5O2_zn@)b~lbwjo3Ly_49czGzDS(NOb^KD?I`qeIW03f!ZD3_v+$x8CM*@#?Fhz{vhRe z|EJ%BSWYquhL(eXDIFDJ@8~pGC^PfE(v`yniR-Nj&2BvsPzCV~W*|8mKvV8V3t25! z$(}ONv47P>?|QRtod29r5)uWbSoCe(6_yhu2`~{BXBj1Tp$I46Qy@98u(j zd(18KUAw#Yk9|3>zms?1XUU_?1v7*M|L?VW#GOjeG8N`@2TMby3>zlsVo&G5=qdwm zCT3+>MVk9xGp8t=8kHu^Yu_@QCS7)JSF>rF__MrsD<1k5(d5U?L$yf{TdKKeu$69< z2PWmAEGKj3^Q~p*Ap+O49@nlSHYq@&|E%G{)Xf4=MX|OG^ltx8;#ah^w;wLMvW4KwwBQ%M1SIcVSf)1`^i%H;zQrKbTALeZ9vU zgwF#VTELxy@W0rww^Jq#a2Pe|RAQPCj-r#OWg;L3N&p@EFr9&(+1R^kVyo0cMbqM~ ziZ@tV4}m{^ShHYsDt0P-{O@2tUjLZ=^yl?9-;%k|?+32Go(DvP5>!E5_Xp5x zmr|{eg8|LVbWHub2|~$d`MaU&dcYGIJgE8L!n6*nGkJ;V19ie&!dL-GMCl)#cFV1B zoGloHj&EbbB{d)_s(!kJdGPeb3MMXUu^kHgx)DEWVT`(ovea&&<=V(%BC}))Kz`7d zBhv>{Vj@C>YK|PE`}{;gOQ?Qb*>~F~UkAueZ2pUAlm{h@XO0Z}Mlr(^Fguz*x>L|nMnjn2-AgsZ!flD+*hV~Y38 zcS-p{i`P4mi%i?Ez#>eHU(6%0h}O?||4mPRf)#53hK$h~*P7gL{&W;#%x$eWiQF%R zp)I*ip^O+0elCouf4)O}I+Kn>I3M^xox7NUsQLwk?}v%v&p~*0A^QN%i%uZRm@H`_ z{{)xlRIn6Ewf!ldPcPFv-zxgb8RGDXjfUGC2bx2zeI?5LLEKi13&&(V#2b%_Vvf9l zd6v=rgObuna7q*x(_oZZUvEX&&5tF5IdZBf@3{5bcT8LywqhS%MVYmE$`R5!Lc>PP zEE{&}A*3AlZ*)5TC&Btw+%m?m-t|L@-{idK8%Dw^@|F^yfLI{d}|G( z8l_WX*t!OsnT=@{!>JDNgYq!p;GUnBAhJ6*B%&8`wiwkWY4{dtRFqZI)$IFiB>J?e zqQIHwz*;65PiGW-D#}9nt>M+D0zF1D#ubHYU)^UFl$@%dp3Si>0%s;UNSBbP7v<@n;pjY=^$cyZK1HygRM^ZJ(!N^ z4a;=#BJ>*9fM0k#f5X)#@V|e7(m6F%Fm8>!cc0uOP-MthWnKV4umlJAz~Mw!tEI%< z+mEa)HQ2`HI&}pZAn%-v&qfnco4$)EV5Y~$%#@hlSt^V`-^N&XUTyr!yHzoITFVcY zf%y;l=lQkrWN|SuWI5=nX{vrPH8k{FZK6gvg|PilvY;GSuR>w2jjh{b8XFitUS&@3 zXQR(Xi#lVaiyG!A-8c(2Gs~;)$dTE;4R8eYB!~M?hbyAU$xz$h4mQENhvUmN;O<#y zBhq?wL#Rx^*}cNDxd~dAF4CLl*=(erowermE3qN=UHrD1Ma&0v6*D1;vO_otlTzUw*5NcG2i(Eb2x)oUjeM<6 zo{X<7MH549xSqNZzg{zuganh!9w=sZXJ>bHY$3CaMN#fE&5(80UsRQBr3SDPZUAZ# z+7X)E;Efvc8-^+NDMp?Eo^jlrAOBO35V&rTOr;jafS>bVH;lqMR2s&Y>bCv(^COzx zi>ggIW*yuvllr_8slgcR<@I0{6Mm@=TJ`YD{1H=FTR3a=4h^vN31BR0GQv8P7 z0L%Xpd%RUca&wSm-&J138oF6J(z3fQq14GwMpML!7>@W!JcY4*c^4Ps$u^HtMs88x zFI&l`lf?Bk=swN^Pd_RsA@q>`E8VbQ#LXnD0WByM>D7%gB4}jIU|mO!Lm1m`tx8ER z*660{W2H)+pU9xt3DH$O*o%TwJVgFr+QJgc7J9*xDFe7$+h&z~l8>Ms_FaX=-qQfi zIdF@SX&OhAQDja2mz>5+qxt_sPlJeR#?qDlKh!h;%>P4719 zHLtTm1H=Vt6dkc2hI}!!ODGX$jc4^4qDpK^3`tCYr%B0(wFxK~c?MPg3U9l?71F}R zS#cyE1|nF(qZH{Bh7@{+mWQac@3k0o-Da6)nrE?Q4AhFqkkae)gB)hAWj;C=LB89l zDi~8J0!!DBg0dI2cx6L~xr+e(XJz+_9gt`aRDdERMXE;4;hoDZAe1{QHNjLDu7NZr z)v}Vm%k@%QnaX6rr1g?Bus+J#-7l=e56`q~cR@Rzd-^T5ykBz;KZ6Cw-O2-FSjF88C z?J=jOc(NwCXN_4j zelKy2;*oFLc*#Oikv^sEGAG$G)Z8bbHSzn8{IEWUV>Q_q=Hg=u(0kkxMVut_CxS#K zcUEW3LPf!(nUuSj)F}Kn*#|dPaCpf5@jG}idzx^m#31`mhQsQ@pZc$cf!u(uXekiW zI(!LWuB)gEwcGjfA2n&ytj3|1>FS;O{*B*+$4N>V_F7rft=JHS4j}kP#dOh330CrNH5%~FGYISDPyYyIpF66}5 zu@?ac{*z>YcGf3Pn$O z|6DJna!05&X(E|jT896TrG8L(Eic_47$R+B;7q|%=3L%_;z0w&Jnta6N^qZ(fGJ;a z>er2s@wmOlsz<7bGZ8-sN4p$AB7xl_Tm_B)Jh)X-<<51D&U#a}es;fSqdS*R0)+4D z-i9}_eR^aVPEi|KajOGHrgo4`SGMyz+9k3duHU`fl^xX|tr?Y*`&3NHm)u})*H!Q6 zIORY8uw&5$V?B)Me|H5I*Z-q~SE3N-S|Eu|V?d

    ^1>{$zKpV*+oAA8SrF3f51*AYe472hCHd(c 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

    jmlNmtFv#M%9;og6?dGiUQ~&X_Nq!h;dS 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/imade_art2.jpg b/ImageMagick-6.9.12-44/images/imade_art2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..931336cba547917a74407ecd2e05a339e9a6ef7f GIT binary patch literal 1808 zcmbW!dpOjI8VB&-n9Fa5(Yj}*p&6z|v}4Q+Mo26&$dcr~ti@DzlKU{}xRhJUF{s#$ zP)bWh29wpsOpPd3a%tQe_pE!ZaMUd4vgdiuU+0|f`@Da>@AE#-=XqrVvbTVeqdn6e zfIuKX;8p=LDWGA;IT;E7Or}171pXD-An+A{L?A!}90`IT3WbzMt0|%t6wnwI)i2bv zu)DRjus9r^NG9QR_UqzsdZzpKQ;g_z`fie$C4*`~rqQX}M<6H^3axSK$Rgf5wIHoAn+~4Hsqgy$U$Ln1c*e*D{L+Bl>j*i6e@uv)$_WyuYcf;L^?J;F*!9o z^KN!|<^6}>S3j<;Z*03D0Q4WMKV|>nQr>dO!C+7rxb1?-#cefI83rd9Aylm0z;7c| zb*RZmHJjYhniiBU?dXzvP-M5f29Yk^v%F3FyX?P%rTkyAKVkoNNdPnyvh_TuGGGP# z?w>I2nflbnbl`UC9EsDI)Mm?5sm?aE0RvheIbCf0QZ-Su+*&e{o09XQUvX?*%OX)) zR&`kAgVmg+_gdMD$Ew+t_)oRu^r2VKy9aJ1!G7pC1NyZwHa0wdUM^bEa`8r#j~loQ1K%$t2C}?D1JW=N)OgI>OR}(>N0$6Xye6 zXxTl}#Ri-gc@DWZW;@RqwAYCRJu!lf;d z{b42(KTf3RuDeC@nraRUeX4u=vtkCBr_p`O&M>o}7SG~>*In`9-+Qo%86Ck%bBIH; z=L$Mc^id?7CJ#IqYFercl>)9=BqrnySGkh&@UC4Aq)CQ$9qERn39DRAQx1t= zLEgG&F73Q=+Tx2a`pTrvQBx~T*RTCHh4n+GN6v#&^AU7poCoe5wLt-!Hk@m z+T|2aCKJ7+m*UK8p1941Sshv4n^Wb_WZynT@jrqMkI9&ZGCI%kS;xX`d&oZPxolW) zyB`|9;1c%2zFc~d?Zni^^x})+4ZA}eGM+nY?=W`-%ly}_9)3{E?P#{qWOqwUc+Sa< zF~zyCJHwpB35u7RucVdjiEQ{)gn6ynK+1`jcYGVS8fP@(-4cb)TJFF;dN5;+L1d*n z)?OAmH`JfMo{@^#a65!E&0e?>kWq|DuCOK(%~8_@fmXDhzUs4{f|Su#*USosjuE?t zh~N5+2Zm3s_UG*C!bD-(H$}j?q@IOpLUZc#>k9S>Nus~#1IsUuZ}i4kVW*cycEK6kaRpUukfIsL!aA^5(a5$`SE#36ZTy$k&y?s%(`GkeO zqVS4kI#@Jw)wZX%`#h*O*#GfT(z(K)JWYNb76n~5EuE!h9mmGTF#^C*A$L4L33*S& zpO?H+&uMu#zvyAS-t+ZZUQ}G{**l2*&dc-s5dCBGprCEW?4AFo$Au@^k*qA8J-VmI z<~W;24vsyOyz8C17-eV=OWkmPFxW&nOCTQTy0CNJC(?$je&OlE`|WWt$H9Rl>%}5| z_}lyP62GTW;nL>4`^F-Okzy9MmSP4|V&FekbHh%s2}&(kG4_L-yE}2xB5F0i?t$R4 zN7gIJ_{*kPQpOX@nl8pY?0c`Jg3eo|);9wR7k;Tz&Ioit>~P_F)-bVc*_Wv|1N$77 z`tp7@;s;rGy`<%ql+ueDaf`ytqanQ#lc9sd6d54CJ1Wv7CQ_fxsQGdY_=3h*k^xqZ z2^HKc9%&zucoWks?-M$H%q!`v$knjb6Y6v5Uh)$5km(~f|7FwZEU$vse^XLa|B_#4 S^4I;8y=`J^-iZoO_T~?jtR4CQ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/julia-set.png b/ImageMagick-6.9.12-44/images/julia-set.png new file mode 100644 index 0000000000000000000000000000000000000000..079b0618e61cdc60e158d87e2afbb796a85afa74 GIT binary patch literal 229592 zcmX_n19W816YeCNY|M>qYd20dwr$%R+s?+eolI=o+}PH}w%+XT|K7Xj%$YMab-Sy- zu3NXe>g(U~vSJ9ZIIsW!06{`rSP=jKi~aXO1_w#>WW1L_Ul3*jG6DcVZ4BI-0VL=* zk&(Ef3;^Ik0RZ>~0RS%`k>6hcz?lgEIMD|HxKaTCOuNiBg`c25z8Xr234i`~!Kgp3 zgCtN+5;7uC`(P08ByeNyw1l9W0TRLj%5JM?S?)iT6+WM)JL{*Hn~gCg#EmV~G!q*x zJ!dJ3R3ap2igj=$npBgNR}+K6Boo<^pfyleLRQQ!-rwziPTRi7dMJxKZ~0D)TTQHc zUSx5bZ9Y2k9yucCv6_9s06>3W+j(1mce`uX65!{*dKC!&W0bpe`3n-PcMIm(mEAAb znb;}Z&o7rc{e%$unuO@d8M^lcNc2y(y%cvY0et|HDS%{w|I@P}GSq>9;DaSr_r(fQ zMnOhyAPiH-1QSp~4p^xAPi1>LK%M~{9GY1D99pmh8XEe87u3iTJ2Av5yO20K7+7!j z*F0^APw*i9_pi`pBt%3+u_5vd0o_P~HJbSU-2v@`CfEx7;RM}liT*zgbB%v()DuAf z2Z;(nw)y4K6DLOG@(4jMG79`_6inb%piPd#IAZ%z5PA{mzm7n%&@fw+H(gLW82=fI z{C12yCh{j4WGvbL6>K02g+o+A5v%L{ubtj*7-B65dN^YB|0y7QL4HpazdC&@2oU+N zBQSwm;$1BWzA-+s|EKcC6=aRV656d@^FM2e%z46kg#(KDeOD2gKdpzF^EvGJ+i9uffw+5Epz`fbYvVTrzB zKJ}BR4;+a9Q@LUn5N`TV{YZtz$Ww**clojl8=uxk8aMMVC0(^gQJ_4{$d-2YdB zKqjfXr<{!jwNfPXuND3)@34`@9KrT5eH6?8y5_$sK#r??n6Qn|N5O;u0Sbat3e?pq zZnr=UbmL1#5Be3#w!rwWZw92z{M}pL#{czA6J*^8^*?9(v)WEvSl&5rJ_Bpd~@ z1R!Xxx;A$bAX2KbcFQ=TWW^7S{crvO#9B5&w6LH7R6^y+cVh|;{&N#V=oL#IO%YIM zmekO3FW-poBK`v)wlcYB5F#SBTrc!bnJ<)J-#;)ZgG?LI=!w*WG~e-pWKmck^YlRW zoP!BA`2_2s(g{|kBjqVUbR!b$g2df$AaP<28c5vrPi%wqpLQiep2p-6)W4=LK@KC} z8S;k_96TU7IJWX~j;@zvzML8~pHFkd1OE(BBVqwke}sbYB8MYZf%rrW@&UO&3!z|B zp@kyI==j5}I2!GMw4G6#dd8rjL!vLfk0{^X;Dg-$sX^vxL>&pJ{u|s+B;PXS#v;LY z*dU+xR^%5D{D9{alT%tyk0+N2<$NL~>0k1+eYyVK`IhmPk-k8s{#mE_E~9wQeyr?B zlz3_z0J1c|*WXvH3AuOq#n5`}^4HMi&ZRuiSEd{^L~UQ%f7ZRpyuqd4Ps1$cFsKB{ zvVu(gV1*~y zIIqBfwfay=ZXCgn@eh0-M&AU}_r`#GM&QEqZ`s$9d*#Sj`hY_raV#)_wX2fxMLlx$ z&tm2GO0ESjP1O$Q6%uo5Xmn7w&L7&7FH#Vva>~G*g!03`Xdf7_5W8KUI0I8~oWiY2y1N3yf!&%-tDhBiP5Ny{*eRk6P27Dh;pVejp;|+We zdL=e8ZoZ}6T}YIbXf7Om)J+ohOC4fknVBNA(UKa)$kTv0|0XyB{UP&#w(=4Pc{;5K zTntka$n$?8p{JVF=4f9mW)L3kg&_Xzk)7op$l7%DM4U=S!pwPqyaL@RQU*v#kFU%T zQau}Je>!k0+xZfRz#QU(r&H`R1*H*o@pW$7s+__Hi$+)ZYRA4+ztG}7_WNBL{O@?? zRj7{?Yat|&)H-@H;|RZPG2)=eZQJ~Jt3^Tz5XP)sqLP(0C?p6>*9%j)AL~9k7w}VN zc%%q$SkNhz}pom8S1l!$-{%B5i9uuU>QaQGSxu1Y!BGD4ww;yUhiz#0BD7oBAD zjDFegofpt=m{q@D``b#K4zxa)Ta7Vg{S^h8OkaTDIP@y>xkmj57RW6nJphR1(%vqu zO=SKT4BcpxwT(`*$sCphd#)&QZJD09CFPZu%->rLmI4aVPxhsU|4xicA92zkjW3_N z+=Us8((^NmBaYCN8Zt?ebygpaCpRbyEX=Je+rO^I$K1t7UJbnL9XyiP4iZc+!ttFR ztp?9d{eeTnoAG#hF?%%Jw9iL09Nr{_Vdv8xDQ~hnW*HPcNa{DO2amhamf&}Vq?cCe zKzd@{D(etX>&xrcBU~qA0r_(yaYJP8xrJ@rJ=DKgSl23p$~g1W%jIJ)k>jJ&=frFs zD-DUpEacW&Cu{LAFNTqiixnQ*zAfeQi!A#&Q5HYhgvlO`Su5*4PC79Ok*AVQtQT2q zBGO?2Z=uzQHHSWB*7MyL`tE-o=?2||C`|9mVT|q>Y?3nNT{D*U;mJ-VADn~-({*4x z(q?}TH`n{hoVXev#gXPfEc^UoHhaOCa;rU1;AIYM6ejoFkfY1LNqtlvN*GdH&>$O- zYs)G$l++`u;^Z_&7Hk5=NMUGt(kExoG&NfFz9`L?--pw&B(-f~(R%PrgZ;i$Dq;X~ z)>|q(HQl9`?)ZehZj7DX{w3G#twgDUz_gV?5#M*&a`&kzAQQ96tYt1j7Ol+H?6r|J z6K2(`FI<2{d^nJmTpn-MtMy>`)ur$1vR#@2$D)hlNWF){<&7fMwBg97M&;(?VG~X2 zIC4KxFHoA5m)udh{r5OR0E#8VnP;6b?M2tB(u6fhrn5gYkRk5Z(WBPWY25-2dJ`xR z5SiOR6O)>UKjdnhE7yFOG+It+|Fp;O<(&%tVz<`TGHTBllwqnFj30|vR=oVgZSv4% z_WI}c5D!kG=iwNoglhFDVrnS?AI+vwHi1oQxN3W`@V@9ejeRM878lc(o@SqTV01~eO7NQndEA2Z9=9l1f_0NbhFcCO}!&v zrS(h*QE%S;>meyFMyl%yDh?8>&N*!$JY9tS`yKOR<@1WDl~P1 zI07xx<)?5Tc}!58ar0l|?@jwrI`ght3TKkNT?Fd4n#%*314Ex7`ltNLHeT0Cqxt(I zQXb&GjVuL4`!TF)5x4^d6fo~J0jAnwkJ`Gk&$asnQ1Y4T1d}F%B>3tyJXK2yw0?gQ z52tX*YHuKVLmEitNaG{kzAMo_{y5HFw7y4eS~v<|7um1GPf=Hw7pmoF!r_Btg}YE| zBS+Pl@mfz4E05}*-B}mvEQ7OBxR0MQpl)GyI1V z)~)4<1g2$u4=T#G#{R8^N$HpQJ+SZB?vf^*6l*!b0WT@q@mD=YZl${O0u4QzoPQYb z!3y?$Ag(Gltp@8inl)OMiKJu{sM@LK#?|W)-h8~Z&>!zER3Ma-DAt^{lP&Zmwe$yE z5sPtJXiZ%@=V`ZR`%I*|mJVYdBf-8KC{j*%dAY8=_@;5Y5tCSN zbqtU2V*1v@{A@@=ZofOwYhsvOJVNvv&B$%>7h4iZvt*!bxuDDlVJ}0XXt;ovGvikt zfpd1QeeH^KRmcu_Va2~GQCdOV+wo$zo!lgOx_b?z_Bi@MrfzRx9gWIYq) z*jWlD8Qd<9O~E@zSd6FaUYj&KBbR42X#<8EDjDI~iP;5|8#F84tW7Sz2cUz>p+`Ll z>FM~!yA~Xwy>#CcYfz6Iq15z}wHv)~+5Fhn45ZtFloWXKuhNp@j`@|w>Da7^V`wV` z6&pQE#|`G%UC*)kxdw(g={gFEa^_rC$;J?ecncXL+wz1)EJu81oOD@q)qg&&p!E(< zzrrb#X>4SMB>!o4&B0jUAIIjr18eS*la_yp6chS--Uz&ybG#~Lpy(4z=JqIwgSWbd z<(YWc{;fsgAwQpeML&|+8AmI6m2%PUTB7W~{svk^W;V>!3%Qfpe5yOJov+OIIV&&;V~w=n}^eAI_Lb|9-o8 zh`g^gAxSGc%&DDZkbJqw6)FOnLSx1IL_4~h0+92NtZhk**UJ(@+Oto#co!?=YLxwk z2+S%JgS+IAtX>Qvz2vP+6xTy$Few_^G|DWcR`MlbMUd zYYjnWt0Vg+xa{|hq+aNE=Y|#h?mnoqL}!Ya#@(z&8y1mU@lN+Vea~~^@m~UNFb4EM z`W}d_RCpseTC(f=1V_+36|(9erXh($p1i~6sMA49-rNu8yGd~h=m$R^sY#qv8z`SW zbv7H}x^>FM)D%u^KQLbH0(<;ts>$xl$-oD^jKBrH-LhvWX?64Hh5p-vAv|$Yy+5^U z-Ccrz+tD%_KmUbcur`OoXS$_EYmrM+dw!|}R&tcNDH^<;*3P(eg;y4i`ZXFl)NcNY zUMw=XL;omq_NYUJBkq?29qt;$ZETHpErGh+cw&qw93>J9=TZ%`(c3Lj>58)TjM>)} z;|p%7_oZ|Mo%bhNde_z1yx^qd<+Mm+T#KCR{}M7uZ4( zk@Ax>B+Tmcgk>Pw%{=L7{kO{;tkygC8H+%I#(-xr?g{0(v+NWbA|^MB^d>ytCwKJ& zfy%RfAaZ3=kl%No#lUt4rzcLlFS*~G&Br)f5#i2RLvGFU z3URY-S^N{Y0K5bjp$$1Tm^sJS<%Wq1BgY?MSqhAvDjs?mLJMH`C7DLjg75(Hd#ObJKa6jN|Wej z$C;JTu!_U>qQV9;9?UT5a_+R(mNkQwsn*$UGj+;m(rw%^Aq zhFhgemdsL|=~1@wutzBi?3o}57{tD)$h~~8;JW+CP*`o61vrv0(8kjPSDH7<3gEkj z`V}r7oxG;`O~V~~NmC)8R6haHN$@lY9!-d~E7!YBNj(BN^!@8==x)b~&!WB4-pDBI z(uqfMr2!+60)sN|sq7^x_9S76dBd+dDM2bl_iDOtYhEV8Lw^jSW*N z{>cBdf5i4UYOr8Z`;k>uog3N}Zyu)Jb3az>H_AhLigZQ&x8c>9T{oh3DI!4?R@?gJ zWnU43k#7rrhq}-*^wRw5sH(g*B+H}9yNLNnIdo9UmN<{;@*FoupF7OR+vrkQ8no@p z2?}#=B&Wxnv?T4dvkboab*pR0`^`Pvaaave)o6Wx z05dv)g(=HlRDHP@g=!^*bUaR*a4`O1LjO!5@7SqQpqc{93@l}phW(*$cD?hM7}8U$BuuI`gP`TRvX=UsC_qC$NPAJ&NE4Ah3N%d+y2>+J~S$1 zO9jgcSZy`cS0N^F%Q|_j*`SGwgwRq3-quc4UU4Hb8`VB9mEvmWCWy6fU zDu;?&`>7zuVT~W22o)I_d2C^ofAYn7#qyrG@8R~kd2?Fv*4L@XNNskypXHVj6K*&n zhj;6E1dQ7Mm~{Gd`Bdje%l-3wt=#B`N?{gfGt2eU?G7Vj?(pM8#*cV*O@pK%?YdBL zf3x2u5}Cp-M4;SoPhu!3`y@XN9Z@}SF`36*q+xYZ8>%f} z*O@}}sbxeg$LLM%E-SE1TUQ3Y^_YwsNlp%U?b8Ptx>N*JM7A5p`{5e!x5o&kcWn_Y zTFnvWY zD9*AeYA@f*&RDC*^4z@mT^9XU^V5=(7JE#%>UC@L3me=xU&}YKH?YpYQr9|m`WC4q zUi#JWzx#nQnE=4k;w9bpnq|eeu|Ed1Q=p8eBwG=Fd6FAuHy&eB7A{rfHrFm@5gei2 zg9`nyi|F6;Dhw?AO;5V$4d<2g!6{hV%@<{Kd6EXQ3CP{;IkW6exH%862gTx7%wEkY z*q@z(^||e29wbniiQl3DyF4U$t<+lPCRSo&jl zSsvCCu<0`PM8w-ZO&>As(RL@I78ueo3iMhUy(DrifF!ybx}}bl?(yD{KR*1+dE3%f zF6oeUg+RF#=n7jE^LVir4yRusWjvA*cH|}Qkw}Z>>cnryp4;7Kcdrwqz}_v0AXU$R zqt$z7id~jgKy8fcLDgr?Hz@9l_%Dk9T}W&UEP7Iye6fNAHijyse`}0Kr*nT*qd_Mw zLDI_<$k_MVlG4q?{I@ppXiOfQ*}bU2K${2mL3t%LC8j65Z6+MgtE9j-8q|N_N8LkJ z^L6UJ_837;eTH~M|J)T!q7rKmwT7?YV=O%n<;A--oj^9uTDLaw-5qU9ewZKoq_j=%E7P1mM7gkt!@slV5hkC)q2)}yP;lz@ao0oD6 zca>$WtT(v2d3f}Z%3ybKKeT#~)w@CQT*c5VesgA#@)(~L?-P;e`F5D_+t9uF8lJ<~ zZojWTO4RMBl{?KCEj? z@3Cn80{(VVEO>lBoYh*wc84}ENTm!zJwhoVev07$iFFf)hyOgOa)_H=z_zXZO_3$E zBfILid4Cc@2BUgZwM9z$!ZO=`SQ~@VwQA;Frj7qL#S2f8Ws3PsF63Ur?lHFVQd6F~ zo!><$tCM+WjFa|!LJ~|@Zh!s!*w`4Xzed(^c|=mSofB!Ygi-o&xyj(#&{9hzEg}C` zpM}QH0T`_bR`Y0dUYGrdn7x>1_aHQt(b<>XK%U^5Dt*8ZkhDHsHx=1;9kbW6vftHD zkro1dw|#qpgiw;;(%YuQWCk~sCQo>Sx{qb;IM{d5>ok=ayz%w=jpc5TXW)#|^Z_na zBj9YV{Y$8>{u5n}1?3_1qo2^5`Y+#g6pB`}u&p}^XBG+zmxS119Qyn}ObDFcc*zMD z$1G3YddS|BXp8Ni)eMM#!#1DKDf7{fQD05q>HnBwTsgT6K?ht=5#a zDHgQt1_#H6UU}h6FVLW;0~G>TyA&y0AQQ^6svp~?d>cER$R%c_3_6Fj=Y{U`4e(3` zTK&6@a9q;0o1{hB1-+kHs!CBaz?zAwfu%tZVw6RZ1&LE_J3j>zVUHH^yI<`v`|AYt zu1Vc{!G`?iLm<=*S?;Y-k*1-Y98SvZx~j)kY~Bp;7>#+x{2B}PGv`zCd24DYse>G_ zI1wL7G^jK~7$qa3Plh5YnO@0y%06;?C63=0V@`~$%xG|dW<+hq-r-PnfQtj?#W~G0 zrB1CtN{7VG#G{x}tO4iDkSM=fY;-6KU!u!ktq`fLk!jv4R<2@@49e*eKWjDH(lf z0LZXA__g$pocZjL&tbN37~-B@J+J<7A8(OyKHtC(xdE+PCpK*^OY?@^v;S z7+PgdP<*KE68DcE_RNelXbaWQ6M6Y&%kJcBy3p2Qv0nFU3c+Q`5}BWLPw)@%oPJkm zjxJ_>p1d)}Vfo7+n{5-(W#Vgm(`J#^zMuK&+4;96L#lz)@#gfn7KoB}CK(*{`Xa>& ztepgv1sjOZ9TDlS>CIsUo6?1p((j=#acuam%d0oZ3skRcjfvZErB8hwK1^B>^nOU~ zEjw03W;M-4VmPTp=4Q2eU+R827eXR zH!N-MJ_3!o>x;A96}K=@g?dxcfcDJu|2I6fm8L!|F!ecp; z!h(Dhxh2%~%*)~a6JIVj=4+t!gfW23h0{-V!~#FTlT zprG;(^acVR{&*-(0N{$S@uf>yf|T1IfXEnsZUMk+N$@sAi7B@(x(JhY(?zp^bpitb z_M0~w=d+1TNm1Xp&XqDWo8CVUn}xWX1V>brSXk$3AW7712-_`lKrwie0s`((e}{OP z3z@tOqiO)3AXBdgXaWpDbG4Zg*SPO^9YeaO%OF& zMfH3+OyMmsT@&{jxFkg{Ngs6wzM$vLpcwJlGYU~H0#g(~{Vq4vP4^hQ8oYqLLY)x^ zY2gC_yuSC<$2-LpyO#UNL>{>*8CSBpwe?W~)nj2n$;Tq-#jQfsZe9MHS4a`!D85fA z03h!m=ckLGf1hC$J+=I{(kB+*gTv^CS_iErp>#-GJ;PQz6E1E03>3Yp_>xlPC?;2A zrQ&xWq36WFaRopGQ)^XQYu(<@i%Q~Ys_27+o{nu>cU6bg>E3?aK&Tezs8%xiNTB67 za6+t|CI3Us3A&o}%a|LPvLcxWXxF^7Sk)t4r6D?n>M=xAVPyR2BDBYQT3LNV`d4hJMFo-4^mFt;dvad4HG|^X-^NY@B>L-Rtl8j{hSCIF6qs zq*X;Acr4h2aZG0!nseDsHwCGR%<(*X6UDux#)>6f@d*h5m^y{3_hjj~I9w?_6D(Tb z)aPma>x|X0+!Ec&@375 z<)Rhq_wQTLU;Y5D)-|*0Cw5F$yqn++(nEbs99t@mhl;1+zg7pB-{%5z-dQ{H#h;A; zKd^}^>;vv;4hy_QC;qP1KA=7N3_9HrX=I<(-j*}J`)SXdacPCTt<`QU{Xwxooc-e- zI|X@H%c1NB?FImd8e#+N&;h02l(qX$^ovu@oyu|fs>Z=7mt<4ETHP~QQrW1h(h4p* zt+`}Gf!n+yiHE>u@k3yi=C|nk@i^}b-WaxM3m^nt& zj6)5aQjHN#IeX0|KTiuT4KnwXQsBQi>9IXusg7Z&7VWbPoodp%N~@nMvXCHbBOF;0 z?lNk-E)N1dWIO6zmCp;GzGr!kZ|Ofgokf-{(KByEx!kPWnD|U89~i5AG5-DbrAS#` zfZYh4q*`C_r6oHd)Q3}m(Au3<-d95La+-IlGn+e8)MY@o?HYB(tG^{Msw0a%Hlq4` z;%NjLoX22%`qwCy3}u2tuNKpXO>(r~hdXv?SM7t_{TdgJVrKI5VCvMgV2tW@_$5YX z?+9F)XQF5>HITwOCyXl?3E_rcx18Z}UxE|-2+(KK6s5@um5NSTsVcKz_c=q{SH1Zf zI$Z0sE&h3u6UzrFSoneVad8Qkrx8mSt^fYpaslUbnAMEG<~r$LR8#r&>QV9c&}5ht z`jX59${npVYr$feu9X~9#Z@yx$u(xH0V9J)rpyuWcoCvVnY_BXX7y}q=^0zCl;h_; zc=nhwsCjbR|0`UuWJ~RAtV#o)E9yLsdu$oRTw%&@Oa zy~r3eZOX*rv49d8=gHXURjgF^`Z8i^ z%~ffSDQ0q4ZXyPrF`8~IvMRfA@0L0%{U(l`9)H-V?!Ko6BDvi%R1?g!Ji4vAeeIw8 z7@F}g@_?ViO_RnJJ4XD9UpuZlT|ROe@69Lay0Q+&Bf4bEtK*uM=KFnF@K&^t2(FV9 ziy@4)B#w8gQAra0m`lBDu409+v97>>w|v{P58pb;U_*@~ZsG!w_eHuc{Uv}E#$EQI zxQ!@^`QAsiQd6!xz5au!cUmA!?Us1|cx(TXK=BPkSb++G*5Y=#r_GW&J)T$dw2;N| z{KgE$$ql4JeH752usAzz6APqp)NmD4;>}|lbC>=y!9T2O#OXu7?NZ4fm)Ww=uHGU{ zg1WHl*s5e1YCvHhF?ELi(EeI<^*zhtIFCcV#o&+Au%n-}m^$A6H^QTutLUW1u^+XQ zAKshQ%Hlb^sTj(>7nKSJE;l1ueMh?)2F%*$ty7v`hgtu|cUr4OBRYIi{pb~7K<8_| z^P0%ml)ykKh|6T@=ee6fq44fFoh#Pr-m1*);btbT%lom)U{y}mv%Hlp5ETG(V>j5( z!|sZ1RR3$7Gc&1K&^j3U?;AXys-Wa%p<#hGw?&fOxoShRVvQLb=g+QbxD>d&zA41 zW$1B7IP>ngy%@EF9!A!&>#N(Zn~NH90nzCyDc&F0M{I#X?f0kUC4=S&v{ip4E{RWQ z%c!@(AqNXtln6P|2E&be~gpJJo;Q zHn$%?u8{lg9;cGN;HQ0cNfP->x>HG2v!27G4x>K z)Zo!y;rRA)f|4?Stb6slT^^v8E5=SSD7F*^nlsk~ND(11IJ}S4*sblN1o4SUSN;0C z^_ia^$Vu-lB))l+eq>lYf^;s9+rJtRQtOqNLMpH(Kr{kYV{E#Cn~al;QDMgyc34v? zb$QBM{8&>L`Nj3(=s=Hu`kedHfa)hP0r?%dC+kGnhTk(!%*0;`;w4;+M={&jW`zTR zSVb{<$2uC;-_Hd0{I>D7{s^fNZV;(r&V~=7N?-Yix+$_U6tB#=7H3RSEdZavJ1X@8 zh2EQ(yb@@AW$6WBOsC_~XS?JdSZcxkNP{X517fA0# zH(t`_7!3$e87^qSNc`BVV4&H+8DrV{r$2D?e)2u^nhZR2DGZtCwO_UwS?@Glv>)M6 zo%1^UnsiX0v49ywfbka*-sw{3m3;1bC_1d6XR*~>I3IuN$rZyPJjm91e2lC1Wf=Vy z60mZ1nsiHEf;yEd_UDNI5%L|+9a6Bzzz%O6 zqWOwxRx}(_+|x<)SHpnWDl+n5mtW8BG+ z$j$~#YF?zEFK;R3TCAajD!@Y!HH39h@k=m>A4%eye9<6hJiSv*h53f?p1}gV&U_Q8 zyXS)dvKp#&=d0Fn-M_b>6oMQqeJ+Gz?JF?TDgbMs+0wzk{%X-aL&tb#_W2r!O6|^e zA)8Wm8;Z-|)=>ECxg6}yuYhYVnOF6ceY^4`@&z9NAi)0fP=iR~&Ch6ueCNMLM?a2F zb%6&gYX%wwNSg8Cqdp%<7coVnE@0h#%}rL}R@5eMLi-vR=jd7~M>9)l%fr^VCIs*! zsL@TWZZGem^{x>_I7L4Z(ha~1Tti#A5#7cX6#HeiUg}|D@msjxst7@6d9Qr7pGy+6 z1cALlt?M8iW?zcqjc01$`P6+gnxBNT6P!e@d|etRs{a#F8(7ppWT-c^S< zhZ4*-eooSQJlu+u$a&5=MF>k(^(@xe*O!=^SL-YzHy_Y=d**2VaC`QasCXlp1S|Z` zF3gQ>?SJdd=pL+V2ZIL6?Y`zLHCI@(>Q(Bi*th7z(Xr6H;tW%owK3sO(-Sfp>P;FH zIb$4J7UPh`8RF!hmT)W?@B5-D=%``4`VL38;XIz9(pyzTFd^LnPJ6Yt1!hZ}L`ZhP zIe18P%8%m!emeRn5`po7L4j@nzor3613Pz6pl`@uk{sK zVqxn95AZL4PdcnJo)d+5xf2-h46Y3-83QAA5$`m%zdYpx2HKRVo|{b(f!KsLFvN;7 z*9G5FakiXQP{9n1t&SyZqhc#__AdWaP?(`Kd7quUg7`1ojA>=NqEpXah99@(P#xdb zkDfM3O;!jG4k5_tyvC4leJVsF8mWpl|Ae#m8}^Ia9)7vQC<51x-@KWA|Kp=qZVUyr zLnlb3E)Q`$hsK=?J6r7!DURzz`-8l={_N<-_lKvjUtDhu85_D7bK&!R3X|lQ2KEZp z-%WU#jwW05Q8`$f?3TtfHk8d*3nZ!!7=e5g?g=zhc*qj}m9PKG+|VOatO?GDW@BbA zBI~)Mtu-ADA;SHBMr`IsumnBM?Obm%Je|cICds+~xDFq-c%A`Ia9x`JC7yfoq+1#_ zAL|6-7MAl73nhxDvB~O_-Pe&qXZT3U z-jQ3XsE$5BN~~lH*MAS!l;{w?y;?~lEI@S7uB4^>${gs&ApT{F=SJ@l^{IqFHQx>% z170)Cj-BqKfd%?Ev#Y~bhiYE$LhRixfS;KY7LR6_w#X}q-i8g!y>tAB;oI01p)&1L zGnqgsScMg<6dpO@LgF!d+^HS0u{2Sd->YG(Ax}*f`6OPyyg+DnJ)Lrm&$uCA^s+npC3rif2%@4j`G=XJyuqG3 zg3G_g)f|e0D54~5!$y$oTkb{Pr~}+GI``^3$Y%wGa2Mu~7!PILXzY8>rgeYQ7G-|; zHt7}*;@?oPG27#~RH`jz!eXSn`4PYxn!IKbM%lhgPV)~m_%LoES0qR2ynD<`u18!3 z5MJmnaQdH3I9AIH&F)+!M7(hLL+BN*y^<4XT@m1yR;jZZMuq<+ZRB=DYZK;jnZ;t& zfPP`S41GH)lw@;RXlb;G2W=MjPBCZ~vJBeUI{>%qHjg~Xr~D2D9J^vIjODB~ozhZC zjDIa9TBu;$PQ04P6zViwB%PdEW+kJ{M^_nKiijJ@lW4~%c19N#%rL-pbU*(rMFaD> zlzH{(nmELNqj)vdx!_T)3hF$3O7h@zZ*N?1v zxnf!6_W7G*CFuA%TFY<{d{ zDr`V?iZI~(lCpH9si~~s<34-mGPaUWs$TPZzczLYJIgMbD-LX2rwv=k0hbT)~hpavr*479B9I zv;Oj~O-2u?3h;c0ZeotR>Ub9JxBdF2n`IgOQvy>ZBwew-#i=sL>eXpgYO%Dsd2u~* zc`=okA;S{<69oFWJ(So{kF>|=IW@DWor^yBC`39Wo9quL4RBO49HN?E($rc%Tb(Y( zsrzCQ;!_?x`B=AX8iGw+8~i&UYKim;Ac@Os@Q^%m(84Fa0^V|#y&Q+6y9l=|%W!M> zyua?|#Z4A2fa*e(mAPX&BN+_jPFg zdHaQk*QjP8lQCK9NfzdB?T;FBtd9l_Pg_u-&gTqPDt7*h)uMUhce49oN&;7favkPq zZq!I;m@%{3cT8EGIsya?n|=4Vxf*MG#1UjJ`|~Tbq^oQg-peU3mj{Th5*^nrZnraN zJ7qT5pH# zz3nXYmi^`)?wGY+B)U(7E{D^z&GgNS+me+zxK@ZRl{rYPV@#rNc5GD;?E%=TpJ){i5u&_~;!k zu-rx$*wE4R7=Nw{6d>_tJ%!-7ydErJR-v_|`_agI8M?L-gvI*VDO1!S#aDnK8UOQK zk-OQgHkJISunX<}nsF5^5IA_|rh|d3;B0nOyLgHi{1+ z2IPB^95P1C(+8De3|2B*2Cs;bNzlX3@DvDaLBn?uZrzt6o`clhLgQ2kepM>y>~6VF--%)$)48l-?q zx^L<{at1E+ZcdqT4A~#PJjrp4b}@PgxBHvRa_<4DDP5&aHtSX`IhZInLKZo6H5zwm z>-w3vq(}X3poS&jx$ox-H%fi9#Dv2Cmo@WTv}r8ZK#@5T*$cLFkW+X5>#p6h_X3r- z`xhri*MDLvf+413GHURQochUs$bEN>tl(N{)=c6BCA;=4<9i;S+2+TpmAX5=YIp=? z{}HDx4WYriY(k1oMM2M-(Xm`*nN=}lRXAUhHRF6m6Fd?tp>o@Adb`r@pLA63oGw-EM`boF*@Kvx@_jSaO((HMZWOSI<;ocvwOq;?IEqy&>hoJ7F%^@zw9 z7GB08$t|_2%WhGZ*Q@cv{7Wpe)yn}hLR*4Mw@3P%XL3$%g5}@4nGflanl>ycO>10H zU=hKBjRCap&xGkw&^LGIA&Tdnaw17|v8Nv0Vhuh#1?{v zM>p&}0WLA_Um8PSgY$is&GynyfNLfN0-c(V#kJtP3iXE9N#?7 zPUHyj$XHG<4_zhDg;jaCr{4s+YuQ_{VfF%moNWCb^d+OtoOlkNaqAqVh*9=smOGN` z2G*JVhCadAlP<`k+fN&z?O4gLls0K;XA14b#z}5BBZ>atzx!v))}UrD<*>tqYk6pK z9F9o}Qrw@*3mtRhy4@LmQf(AS0ynGis?S`ub@j(tRhb>TnJ zVsQgPYnn4ZEtDu#jKbk9x2?W{myxgKg--l!_58<&6Uv(rCOpkrC5SIQtePhj zhmHc3FaWugN3}2w8ZqU$Snt&%&Yuc#+E7khE^32Xx?h;5{@z<7_O%?n|Cq5D|K(e~ za_xhVivi##kgohHunpegze*{lJG)0%RaJ@&_`m6Ryh$=j;^9IlSl`6reRM?VzHY5{ z)z@xmDFj&LH{Dg;lniE1S*}3IGe(x)BiR-jM#J)wUuPxsSj$f@_VFIbVGLlRpDW<5 zDwC{d^Ah*B^;E%NM?9Q@2RggYl)>RkUJMAsZO7JLEtz`qr4PqE9#%|ERDmoem6oOH z+Gx&TQYhbf09Dkp9W?BR9=~U=VwQD~5ddLNFCmf-m^-iRQZg24cQgJr`Yd(~8hR^( zT{)#zZ~CiqS?m5P3kByMRD*E99Nz8+$p$0O#UjO*N{;*I$Mz^Jof&S8DH{2%*hr0^ zrb>Fy@Mh1p;W@m067{a6>ag8V*^AIlrkQ6-V859z|W?uk!u_|wG=}XJh z0zU8j6KPG7A2>KE*~r+@VqTJN_mLf>-ls{p;BB_<*lN@dZt8@54~jeeKD6*cULh^Au!BHDb-}eJ=bBY7Ir(Uv{gY7Q(a2k9VPeISHukW z)A@#kQpr@>tLo|7IMY_3jnL)`@pbPc?Zo;u#=F<|+ zywIvwCG~cr*sLJ#wXPe~SD{@#k4VsqJ)kKl%;H_6K_>D9$is$G9WXMLP1}`~Mugl? z1^3n!;|R?+Rlu3v#(Dn7BOAvvqxsgcH-ltHl_T*hAwFs`-4N;KSF*(`dfL8|y+2*6 zNrz%oNMg1bZW%1zg8e5{rqXe~JQMTWM>KO8P?=4cqt_vecIoEz)7mY`#B35VVVPOeT629Qmbzz*ezn=v>WF(RK-%c>tM6lM1~ZTcH{BN%*XtSte&aNu!OipI0;9GZR*++KGB4NAZ^2byJV_yty zC_HnOFHVOKShb5f=D2}Xjbw|%=p!qTwTcULx;5YWU3bzFtoNmL8T}1B)2H5nUx%O- zmmZMU|4Mm`VpS?x+h4^?spr1)60%C&z2q1=HxeDKcDFE7&y^zcHP(Z0lx9Nd>aF2t zb3)6MpkpwG#h<&*K*lSo$)$=*I3-8jx%mg;tG@y7h{41n|KopgA}Xg2X7L;kW~$%3 z$RuqlI26D$SZxlBp;guh|8@-ZKC$X;g!?vT3OcuGdLWye;>&yFAw82`d4d#E3#Gz+ zOCzsYgm8&R{l0%PkqxUlS60&3>dez_ogD&U-w}IH)oBEDa z6HG8!Vype`1LP^9m0k!clIgbWE_NflvhB4xtuE}OXOJ~lea(B9T2M2B{8z+mgmo-} zQ580M&BDZAqEa?l|Iq%AaRZsMaO1(|UR(n!Iv1M5#gg^``#`{Sy!L-sItRu&n|2E) zY0$W_t;T6=tFdj{wr$(CZQHhO?)c>GcYed3XZFn8*SeP4qZ;)j1wZ%I4==BHw)H9_ z>;x3_aRT?5))2Q;r`;(gh{E-mjPzRVY_A1?^M7GYNsJ|)P~&Sgo_^Hq=_Nn`Eq69a zi^2Hdn|np8&}p+4i%ceBF@wcOlUH$h_?h@DBrS)>J8u+1_Q|1Sb;#4Lhh#Se9*r}o z_8H2}ide7OATIGO76=ZW(+aBd?cL}73hJvJ7|#J0Cj-0IfjwRaZksULy>LIX1D9C` zbal!513tb6L6^LsWIuhQjQ_7Yu+cH1dZlHK%;xA*dy_WR8N;A3*A8KWz<1eAlv8Ym z@xUL+!>(#hryCIE8{F_%MICxVp;11Pdk5aGk!(Mm>REO)KZnx@E0tZ6W-5&4g%PM! z=fVUmu|PD#k`HV0?BR(kj|ThQp%K!bQKiEiH@mVW{hsCMaNa5ox9GL{Q;Cu-W$HDp zt0!~N0K?!E`3A-?I9qfbsMRz57Rwfej}=T?ojTF5XF%JO?PuEZn4qRzQl8%Fb9xX& z0%rS>)^XJg$jH>QAd56mcP^oKe=fO*k7{JeI?B%WkB&EU)Fl+Jv1m77A8$SN%w*dt zb?*>BnYd@|tviJSI?DM)X2eONa(yAKJZ?(1R+{!}LF*#|u~c{kEsOURx6(yjvQ* zUEJL7P2aMeKt$h?DMBuy|6DXmJ+x-_cz`O?ckXq3pYl>(JV}nv=8tUGn#bCDO@&EP zQG#P;(Z-9|?B!WI$|x+ddz!qEjqIH=LB^_XJd=cz#u+&D8A2T7CWm|k;h2`T)P%$OAj|SeNrUSk?Fpc?(d&-Qn=+U)>kkV14FWzC63Es zQO+|(PMq|X4u6J+@T>M2Ee0;vjdbt8xR8xA_SK|0lVW8$KIp=`1x#n#2sfu3f$Qy> zG$=j1$DirOt82*u>YH?--gh&-;1?!oG~0@WjuxaU@bxLihR!fTtg4CUYcTr$=pRw* zOZo6WIdom=+ybobFh2X+nNHfq<86+gl;9V+Xv{mG;Dir>S&9H5|KogMXGP$$PQ$*HnbaJfQW`HUBe z3-i{cl7mnE7r)`5ir-{JRoiYq!T(@S(;Svp%cW}mZlJ+3vWr6zbta=05-9B6suNpy zcewbBXdi&XtyK)_{yGM8WT*tHj$YS!!sr13 zfmr0NxH=7nn`2C6=f$We*C$^WOr`RWAK-fz1`Y3^4XJPA%C?i%iP}J3F&+mh1zUb1 zgHH_ePsfr0|Ih&;-DywLhWJlZvM^(2xh9?GW^Y1~n%P{RrlZRxy8LCt) z{qtU=wwfZxKQgZ@&si*tv6s*CyBn*T-8!C36(SYO8^B=m73;HzlsXt1+iNE>Db5cD zyzaRtt^;IfUyLL2G%q$wOGFn@d=7Ise>C;J=j64|JPA-4*`>sty+xRJU+a0*fVmM7rx7xY46jxDve)=bO@7C*VpE*Odj1J` zZckfYI1G!|sPRlK)aGb{ll|ga91)1I!Lm(KA&QQL7GJCT5wdWz7vku7mg?esMN3bnt( z)89~C*L)&KKoCaAV+n3b^U5v{G@1NZZU--f z^fD;Xc{4zke^Q+I@_yq|-wB)#VCz!&fL#IM`FsLStn4&FYCgHHF2(z+(FO@E?6ySp z%UAn6HUU%avTt)48}WM0Oh*vzasDcaEg2&;4mJaZaqSwlLDZ*~`sqyH0U#a=>JI5w zuiJ3%_#&g*Z+(wyF!kVd81(0>j)S~_C>`+rRKCC)*4E@^BX@queVZru`XhT+rm~fI z*H^_se=WjW$@BnX@G3@{xT!hLnBpMiXtw@bQ)C9!^y92*l-6nn`)k&v1jlUe&5iArKbU-!Rz5awb9XBsKDS(&hC3 zhFzW3(||s;R2HuD6ysc-^tIm;M}|+EtMB^vRjXCVzqQ(JN~>FwmIhv)*wA_i&VVme z^xSgEJ&lTE!pQTyPNVCZ=o2cGb@TxpeMEV(22t&kKpb7ns9El1@kjHS^Q?C+ugjggPD=xYdP&m-&ZQ^rChKmC45hRW}Fi0kIRXj5$Ct zMu%lhPnFBria1@CjOS!v=ga;6H{lBIj_#P(38RMsrH`um?UwF^0Vl=a$qU!p$sP0? z2lRur@)lZ=mIm5dQya!e3{Vr1pz^H!HxKrFhsdqH;>#3Rj3t?wfB0K_(-I^{bAuQd z6sz*7#@L342Y@DtpF!IvO#1cEyKJH(=Oe0P4tfz)G0d|cZp9R zTmc6wJ&&|jw3Hsnzdy~(b_z^1NwQOC^S4GhcFVj}aCC-Cjh+|lb;n`!F&t2<`hy(b zhoJ>n+X#+V#tM8+++I7pKMbTeV3(6m#&HK*dO!X2`p%|!CGb!RlStZAi1x0FYe`G} zl93o~vmYsu;x-Rt9<8@|sgKP&X4zM!EYi^P^4dZpk78uJ@}JnurE$}$kBPQln2myS z26z56>1N+Ou%k}2e+I?9n-}38big7tSx&{vnR&=?{$`mG37#%xPT>%&yF|mKkCh={p^-}1b9NDP2YD!!@9hN#07XARK9e=mMXLnq5_Xt1{Caw6bJivIK0ajqjP* zIv;T*-WJs2T@~fOBkz;I1wJ_ZM|?k!Df++VslkP3=y&^sI`Txkk?a*7bRMVz?x8mO z>h}g92Ava07}blpv1EAu1%r0m2VVK{cGdyAw&Y)n75hb=K<=$7&i%Q6f(N8E{6OJf z-q>t)&hnUwg3+oGOqv*$*OPDg*-Xf7__TolJ;Xf9 z)MKWXK#0Ag;SW^o3S|= zj^>(4pAbMKFO*T7nNNsFPyU{p9oSB?rbZ`eeXkvtOw;iWMq-Dr*&=U-#+z;Gn3iEK zqRvDvuopsZst9S9gv7yGvi60nY}QyFY)xix5HmR;jLd68zYV<%8#f2#?|zRlbuhML z!Ne!&^-@Gwbi%K$i5rb|`UXtV1cbkbEi0HCwPrEaMYQWP}Xc^DwWx^p(| zj1t=pBvJ=Yt^NIuheenkNVrMcXffxDGXMD{wS)q3o9a?n>@o)9MZ4@OFTB^#3;|9f z6NaEI+^m^*Q(`1a|_m~#V233qGai^#z%~k%G&#C*@zX+Q7 zj%y~y1`WryWj)FE^o!3^QhjIZ^@9Gz9b@Yh+y-42Trqk!=mal;%VLRq9bWFj{X=xc zV~?^0{sW(|)?@p5#7T{rlvS!W<0%-?)5-Tl4j3_RR@eE9KSP+UFGS=uj{kRXtTH0r zEaDF2h7XY!=+L6sf4G8`5Y6gmpE>gw5_HPX)*z#hpP%kja3f{fq56#%HbA}8x3uF+ z*;x60jNMBwEJ^oj-}_yz#`u{{X!Xy1$pL#(TJOwan;vq$6E$ygZ5BKqTV50(peey_ zca_IgPD$Hpo2q#~U9O(F``~JBq3A4Bx6ptE^1s1-vyawF*Q6=_Ed!^gi#aM1DV+>#@%zR*{myjvWhWKk&F@Ey!CC zxP+#$bdmlSE8n!1TEZBL7oaR>U%Ei|76YG&>eTRX zgs>@KP=>4nw3)@vQ&Q7(vh|jTvAj005_R}hx7Vz+^~YLf8=K6>c)XT!=#wLxft0`) z%s>`bV%*>pM9|X4YHoICTTySn>TZ`@nObZe9&^=P0i!6LXhNhrk){h`F4-JJ#u!{m z%iC3ActZFpP|7?nH51Kbn0I*8VgR~P_y zyWKtZSIZ-7@~H#epp{BkqTSj)t!JGc?{w}5ufJR?TsF4URKd330x;|V&~_2>*;`NB z+5LNSAsvq*=J7V7cG(Qo$&|j)U_oY*!e;xYl>ZtfON#?Ur~cq$m(|IAj|O+6loYvy zK2criZGXHRC98wzRE~wn`zQu7kV(J%>%d>LWJ)kX*LD%V{K=rk}5kx5l?* zL$zJD$li?>AEAHBw6$rD-a>b)+c#S$cz`L7U1yl~TQgGSoi+1b464IJ)N-`O73qxp3uG`4Oi>Nf?>n#gDXM#bUzA!-cM(YPf1{lTJWfhk*=1eL z^K4i)WpwdhDf};E#*Vw)VitfEHn2p^bu>$AzGQ~BF>PFJcTW{~o0~w${)q}8z=cLL zD%kf2F?qomfPN$Rzn+a9hkOCBsp&0Y5ZNfX8+JVYHhx#a!tU-2au+3@91NxCsVz4yqm`ezwBU_-AT~^FtjzH!p+-@12JQlIb)-7r_9QM+OG^(j2d5V^lN@tFJa=YpU0C z?NuASx6RMYaItr~b|=W=77xvG3Hf8Uw|YK|8TVFE!cB|dqe03GG|@s>Ut->SN6NEs zuAp5r{d-|8-6KUo(pG?96ua!l&*1o4669D!8a9Q;%p%xZP4xYL%wM? zG%ep~%0trZF-98wkzw-RCz!EegM9DCE`?hO9abLPhkRcXdG@)_!E!F-GQez^LgieL(L}31(+eTyR0Od$n&ZwU=^q)|JL;O=i7MJm zc8>}-D{HIi*7haq&y>_SN8?u6Um6_IW)l~Ya5+N^+4yh|=}@=C)TQi4;B%B2Ui&VF zbvoV-M$Yo`u{%pTx!LZHe1@>g42f?f3@B2IXc@>`TrM@+v2N-+5QwI{$m8vi#tG9S zTqLNIpB>JRjl;elsGyNgR8TbRf%nGHlNPDVjP77nr1RG@9>d{;qA194A;gCAb}=?B zv_+z&sFRJ|CypTYuPc-bBOmum{Sd*SL-Ip(4>8I%Z?E!?#zYUYcGhkSXdE0<8)97D zmMRTxw*cw4Ct4aMq0PVI-Gxe$Y( z7eyti(HG%rWit&T@mdVg3Nj^uVR$hqJ4H?tY*wE{ z%TY-G3*HxgQ66(4$3lZ|80Qo{e`{sI8;6%93jN1$q3xfitzCH!7 z0y-c2ln&5L;VT~sAoNK!kO;NnGWWOR>yYnPPkjrBy+vH)Gpx#2!%{OZ43O3A#iI^o zw-#700a!%0$UOD_llB!=8DIF6QS4KqlB@ixFJAOfr^6Hc=iaTe!Lj%{2;xk%!_erk z2fkCfK(Jwq*zf(j?=QhO+-1A-BkA4v1eS^5$AP-Y=71o^>8LOdOMSbo>fwKLcTQ+Ep8BPw6I6B*v(;7e zmjZR|VV#c6H|yHmuF3n-b8}_NSTwwTs9-VyyG)r4x6*fFvUJn+(N*mAynm+>1di&?sf)%- zzG^t4C#0D)t1*1Kh5+gj;c2CU50eacN)LL@M*kx&bn#}_kA0G zt&Lib04xv-UecfZr1C?u61|Oi(SiFlICt)c;=T2f9pxhM>KW&kk(D{~z~)FdsO#ZC zB_P>7%pOB9k0XpqUVyQ`Pa3dm=t`i74)(kY5VyexVbh@wmdDYr?tvVrfQThYw^-L_ zr`CKhgid&jEv3{eI!353YzF-zWEz`(k>AMw8e^oALH|Kq#x(&FBf{Kpb~LLAWMTT9EHU z-O-$j563R;A09FRA~;Dh@d6rPh|}ikjlLMBkgjb9Qmje8T5|am_&&_<+aO>qh6maH zMn5__6=n0wA}S|P{Ez>A!-_t{c15IP&Hi;C*wHpt+mq&{>_8V=UqI_vNdSoviHkq# z|9(`mcs(g?`KIP}$yW48iT}QOVU^-^FU@z)LcM-DMsowBtTgAbV~=+^_doq&{Mj+q z?_T-G;<0e~Eg|%_St4tS3H08@yOLE5QEsjdG4b$pU5{QDGJ3tQAqedh|H`BIw|g8^ zEvsAmjh2d_j<*NWTD!G+#q09Fn^Vdf>N50Ss}X1#0>K}dEXE;Q z-|5n^7D897QV@7tTjL1oSHvT_*`XTHkgRGCpFd^xj5{-G4m>c({Ym5cIP{_^4o$t! z;tpfNl{ze-*DpI7{4E}j`r(4`wQuW8B%#Ee>VMpv?oQt7=6{TKqLMx-mQ_}0laTX? zLqwnH5qdmumxBsSrpVhpnVaL;vwkmpEJckJ>=mvCmr=*&mS!`yPMc?WF4kydDUHqK zD=AG^uJM<-?~AeXg`42&p=E?x<3%}Ym46W(i# zHL+G?jQ_~(+X3eId2iK$GJC8xT168c;d}eO$`?H~rJ^4bEa}R|^Vq2U%XRw(M#ePj z5#nBpl+EG3rXi8pSXLPK{8{nDq~Vp^4()cFTRfMc{c^cD3e%2L+Sd;%oc6dV$X-{c zM=Tz9(J~$G-xZ?}lyUH^ZHozGs_|7_#ZrC$BC3lJ=Bs(?jV#Wo((H$E9{KqhuY-o3 z%?r=i@}IVy8@1`u5vQ;jG~iLRC)YaLzt<5nL!c7Z3~4V~*6hL$oSjxA^a58a@aAmX zO$}@c`k+or`6s2>d}=9ws~{94POlm|feXa_HeHR6Z_WDyQFP!an_{$n_-H@5Yj;=# zeSf~w&K7E%!M8#!`Xsy^o zj89Iq*Fs{%CdIfy-=<=%J3<`8>Vxfb>ez8FTK!<)Pr_~oJ)lLVo=dP-6VaYSOQ1=| zsH!ls1x%ckYe%_fbUka)`f~*C1qH%*Ezlw`(4O7$p(*oVPxBNkJgWGY!Vdqg^!_k0 zAhqN=$Dcbcxy}7D!pixUS@3EDn0{F8bZax52D~19Q*%&0F|oOXKZ=I5g5Keng}g8= z*}Ba25vZ$|3j2lP<}df9j%(*nfL;;{R98MK^BbgoTk8)%QQew8ns*e}#UqQ)R})0l zYl|$kdX^-!!1M%Pv3acXY)QCo-;BpoE?u0Msdlpy6>ke2sl|F7HzUF(BE4njIt#Yn zwrX4s)@q=T!0w7agsJ4Fo2jM_beYUF4*T)eL9Ag|9KD2Q{>98>A9W22IuL|a#IcjP*9h7)bRGtNEbSi(|At(WVA0~(s$3t+e~ofFXC2v5O?5QF2mR8N;ql$(95M()5QfK zhCn@@aT-CH_S5!={!_~!5DVp52etm(Jc~vv%2Xo{#U|TraX_L}v_kToLHUGFcOrYh zdy^doI!6oMVkF$0#5Rr5_(CjwuOO1sHdc#cL80SrfF=CQ{JyuVd=1LZ0s_=WrR)jE zA*ajCt-pDkR=PmONha_rkW%@+Hm?Ya*+Tpg1>t=o6v-C7nHY!b)CbX6TpWy%?`#h_ zOE+si6zP;=ltIKvu&r9PzMh8FnwEez-A~S6F4f=n2lm@S?=NZ-tB*SKdKcyX@4>RE zK#(P>E0an@Dx=ZQuB(^yVQXTtNpddKJTR`N$R-^sQeY_Fu3V+n=6V>}`~B>$g+dOUrL)EeJZj5mi?l7EbKzfOkI#4fXaKrc`m)x~I;i5ZGgPUf;hA?JUc$w+d<+aLQ^x{RmB9^;IWy(=$4%LzCI%Sm38 zBgfLE;~}GGd_!hXqs3u#qT{krFWbMAXl37#&5$x6b1VYE{?0L0CDyJoJ?u59A=>(RpWf}UY3jW9MO1^O*?29SXwDS&pAk*294D`Np>bF^ z)B5T~xal^+7tQQ~H?5?7thL(&ZSt!=wNfK!=*zLVH1ERZ-d13WlDFJD)p&;X31zo4 zK?UO-I*vyUfSrt2+Qh;*Pb>j4rL1O}6N3oZXq@sBF5z0_D3qROxI2wE4bJ-F zjfhRM16R%D4$j92FHv+s8omt0zpvm2=Qf>v5^!(SlatQM z7--gjpKla}-73+sfX@r$imzh%YPg@&)Qrj|vEZ8?&BvCWx+>R(B4-^1Z%C)ZL-{dj zy|8Zvbp@|KPgX*$EQQ!w^S@eh)xR+_iu5s5;gtbWg3YMaKjH~>W64yqh?W}8=R!J{ z4xN+|l(uV9R!jV8pihqX+*`+E$1+YaBED)VyHNRVb;md5kEr9LT0L0YeR<4tW{Vlp z1&={s>Scl>*1xUhtduz4TODD%*Y&37cqjd4E5ZS_?fi*1;=cLB(&OzC5hAEE|Jl^9 z#U>;f#8z8hjGbch9IDdhe=9qkKu09BZBMy#C!h6m$lsd)01S#8j5p%CvX0uw^oMYi zvcFyi^ZsTJM(XO;cA6kv!J_S8@3V)@lIU4@))k$p2T^pw4G6kG#3{saU(?FO8g!~Y z>EzVd*Nv`zb`0Any0&DHRkXoDWAsP?D~;~KRdrFdLUnJ|lqEITjg}=gWc1p4=F%$% zY-d{}+_i0WwqKh4+59V80z5Ni^RgJLOt%@d&g3k|gN+UNJV`tSJ1>f?a#v^$%aY!T z4i{P{k@rE6#VXyWwsGxgx8~yC>y4Jz(%p*vqp?|ewn-=0c>yiwy^9Rwec=Oh%n*{tZ zS&fKq`p#A0A~Y~lH-^+b;O9K#J0uoC)k}k9ly$ewNAAn^FG@ciKDrd?cSq~8D!7(W zHcrghtV2OnkN#!gX)H;;XxEXv;SSr%O>hY%f5m1Ca?mJrHgsETiW69waTk)lA6=_z zHd{E8`?LNb{Ua$%N*7!d$isSu^2w)ddFU?4{w7y8xTwRx5pZ++>HpB5n~s_e`P9D! zQ^bXg=Ym3@^>TGt9=LJ>OToNtYf=xUF6ng}^+M6r|zAjJN9v9p6&`)MFKIl!-o~95ogi!iCDa@^YQvQMk;471>M*^k$o8^hEY}*yd!mVNonhl6vS+ij|OwY?_bgIIc!}h zLhXzDTA8BYZQZ>P(qH%6zdET7g*;b^;1#uTXJstKG2>R9WS<-Y&Qm-L(;ag7Bu>> z|1fGte6)S!Z0E;BLfp0Z;{d0%JbWgp^h{bwGX#QAH&o>uH>$sNWfsbh>q=L|EEE}! zmC>rG#wzEef)tKI3!g=YqVE3htFm8hakIvyATG&w!XHfQ1s4N4kV}qR0|q(4%j=;_ zETM@2U`BgH?`!#??{TL5oYvj3wx9hoSM@SAJN}z6BOF`#84I5Bduxz(SiCW)C7YkS zkBYM8Df_{rIn?w#sgAqLqk$~d6m(f_5&eT*(E_S*N62@Y4`JW?qH}edbX83D#=7w5 zroO?H&&HX~RHm#~0`6mA5y3qT`LY%|#yrl2blU1^nTA(@;n4xgY`u}1bE-14qOk?M zg=tPzCA&M_zi?8uMMakHNmi?-{2YE%*p0TS;*Vw+eVwV|H@F?CKy~rc#O**cv)ZY- z9})-6FQolbk-o2EKf=%VAZ?EJhKzVzs)RV8#7j_!D7c?bMm#B6t zH+eBeJ*E?>%$2&%^#|H`V5)to1QWakmYe&9gNK#7IdmrQJ*TO+fqgte;Q)wmRR2jdCW_fZEe3ihfAzitJ*kVu^v<2|V*5U-ht z?{Z~^K6`F|Ihbvvsl-LzQ+^n1)qGl`)Vsh8(QE-%ShMKoQ;a(NbBlg}HcMrDs%lT~ z5Z1}!xZm;0xyB<_j4ua}?-uR5!EQzi1UMUI9*Cjzw)`?do-?#C`#(4%%2lPkX zT!Y~>y)d9hCK?shpc26SQ+ah-e~fWf3`7`lgc#s!5oJZPlG57I8xD2Q=PA$dbnbPX zB(YH^3GOVC_Q;T?I2J8Go~Zu@EM?HSZu#J&N4FF zRJ5^Z0IP-{HK$WFoIVuUs|R(QU?IePQrGUC#nAzcW|y zW9!=6L$-lzb_bv#5oJW29WnGriy|?nXxpUq!tU;0!fV?*!P8nlH^8nA?dIv)hBLlx zThZ`^@+`)%iL2X&#VyD!laNb~+q3}7U$ z3T*t4o1$6-)%N=~*KcIeUDu3VtIfPz4pI5}>M-vPH7?AqHi>#vu4?`)Bngi7P}$OzUg~7rs>YMzd;m=no&)bDfPK{YZmql?7cc%trd^|=~s<=)d`?c zlSk2LP`G&a{i0H5ELM|olhpf6mFtOP?3slDxV2%F|8fO;;{rs40Y6p}D{Qa%m%SQQ z_doc%4^4C*yJ0ERIV%e4@ZB`2HYrv*4>k!uDVjfsTGFalb|#ZPZ&^&5{WoZgr>s}BhoI`Hym&mb<*gATAQ@%ba9_ob1=axsauG2tI;rJBt zzK~okj5fCwlhi8Y(z3|V?;E+3;&j^yRKeO3B48oY>T1}^GOLxeJNe~=cZgYvKSq$# zQeWzY{Am;DPcrA@TzAI)i>dN^Qb-fJwMltP7;j&~>WD-Hm_M0akG0Bl;41#D2B9Kc z7SHZua*)=uXd%7*yr8d^IdPKktT_y)!5bg1RC0trvClnl1x;%cwNJh`o;U8IuY)mV z6X2`~;k-OuT3?b~>=BFHs%PqL%(7g|^-Jwz<1ovP@X;#S?pFA?w-sRv}NaU<-&I5^*b(0 zHdnRi5~3Uf!kEAmO!P-{`qWjl$Te_%hK)1WT%jnJp^9|J2wC7^$SG+CN_g3E>uANLF8gF{>Pq>x!uqMH18!%ZT2q9}WvxSfc zVPh%JssV?m>ruE*5D#x4RQ@|%;aB?V@vL~qUeT2Q^${P%w>phb z+7L^5DmkN#?Pk{L4o=beBmbafd8&}8K`RPM(?y?Io?iPPnznq9@_|lWi{yLmAOh_$TTPdrB^wAVrNr$z0;gWLEl2 z8PJL~vUDC>U|9Z`Q2qgr^Lg}B>3-QO*wlY)xZyb_#sASAJycv5T&@{;I7*=%xYvFG zLzfP(1WphaTAga`cNbg&Mg0}ba_hqaLou>pKeiuON%hYOdp33#l%>PGeA@30k}f_| zk~lG^!kJ%KcXDC~bbiqhDn`x*l9wG}H~^<@7FlRhkM&{&7BB1wYayj25T_1l_+Z71 zgtySvxP80*vbM+U4_2Cs2a{eSm6zx4$HQK4LdCl1y5aUhJtRL8!66$&SjO-DXj)2M35oSY!4kTY7VDOBgr{XH{%8HZuY=zefj2C z>+!__+CDI+y!xmk2Q4I}tQQmMur1?o2RoiQ#4s#G5DvJM$4An$G@el0wPEN?%rR}XHZ*c9^9nQRh zksvd4SWVzi%A$8Yxq|c#!|MLJ)LFV!TZMpMc=| zO0*r~!c@D^`GR{a5^<)VNpok?W)rCZ=uj%kJ=mBz-=|sl8>h4JDmPh4@Vm52+tNFy zcY9hDsA#S3-9wQ^#G#!z?!9TE$bsQg1_Rw~yJ}S5@ba>5?jHajV8YbNASbdVtO@5g zvQNGrE8{P)Z969-V%3F6_GOnNIS{^1%f9-^*`Wy z&ESK6?yDe!1(ENSTpB0}JKBFibvpL0hgN6d1Y(c@9oE_Yj7w389#81{B zI&TN=dfrWQZbhA#v^cQlJ^-C_$s5X1Y1vuah7u>5uc?vRk5KNy#A3mXGRld061wB! z4$SYn`V89`?fDI3!6hW3dQxRXT+0kY(PC`*I@a$bD?!czLX7&LPzu^PB)|O6iXmNZR z0@1+P3hwnFmzRzY)ZuD+=ox7Jq>vVvK%e&Hl?vb&D(G9?RHU#mB80gvUox{M2qfu* zjowxfUhiiQdGL*{8TU^+?9$Vvt+8_SzVG}toFU)muRISatxR;~f?rGOZlQR5_}7p; z`2ouiHd;^z$u@s&ogYm5%~UMq7#2d!C8+gw>w2M7kb`+^>^kczUhO8ET}|Z<5xrD1 zXLmWKrdqoci>m4X9WR|yl0G3wbD6yq$xNXe1@@iHl4bV6s|YJRg!2DMM^k3NYX4ef z|3&XcOs!rQt&JmuWCrG2zqwuo z9R>WoNujmi?pedve*G^|(w(lk=*VgD@)c%V{4PMI@){Z6`#)I^V>h=d&cSs#ndY2u z{iY+1RE8ZC{f)~dIzEnX{1&vvvSW64aPG~(zZ$)XV0U&msQZF)g1%CzK$oB(9SNoG z;+JRkySBwM9qSia$Lv2%6{ug)=TC2jOlh9_FO)1XmA9LwcG{Jw+h*2ji^2#MNv|t9 zYwd((kukJ&S7nky(nogi5c=gi@38?JDUm0GesykPyK~F_+KDO?E12!Zz2Tn%{6lji z)6)tf(R>bd$H&jr-k^qrP39ILT^vS^If*@nn}Z>PsX1Pfoy;{fAMd5ukSB~D4>?n^ z(+A!KOm5A(48S zS^~L@@v1-R>z{+9#o4xopC3{*^|!d}GIF1&oHMETHeu1X@EB{XpU*~RqIcQ?BBMJ? z;BssWE8}ikpGn|#Wqa$|J>Xu1_eRY~_1`fHr6M(kGsJB&z7rs zjfW#xyHFlw56)hR!~DgurxH2*-D(Owi)noKwhZ|$>w$z_-P^BYv}o0wI)3Kdj|X_J zvPQ>VWA4mS3Uk+0()(Y2|5#-igMl5XV^)9|(<%0JQr4MAZmOz~!-ARe7kM{V92SU^ zkf!`aq05fIT)swcOPK&(R0wBx+Mi{?UO(%G?$A7NNg-9taZ-4Ka)P%^Ut_!^J%e{# z{fcA#dI3Uer@OYe`UhvQ(c_I$-17{_Y|6s8)f{N<+IPWY;{**PrdDFz-x*H%c@JrwsS`rD1m`9ou;un%cR&VBsWyFbcv>+rTwoh zL#jE$EYIy(oEb9zj58~>bK_5{|JHTu^2UqVoSEM{qzAUgnZ%y&n}*cNHym*QR4H%5 z&9}72#z{}3&-Qq_6^9!?zfG?&hAlI!9C9`O6!y=llQB<0HURQSzOd2Ne=B?(|Iazr ztMvGv{+22DbyA*>ht<4Vl*KSZ*DET|OVV`I6nrxZGWt&@z;}^{xl>F(gyRPxGsjC&4EzbGV>(9f)L-GTv0C!p+ zyO7rLf~7+*SxrZwNuV8YakT@K1eEwF4D96`@h3AEGYilKm|aS|xw}AkuEyDP8(f(r zx~8P=y#Tojue+o0U?e8=c(2Z|Tjgqt+=1z*CS*q0tcI5ct>Q19g|q)koBrun?$-_w zR3GQLx&RJEW|bVZ%+TWh%K*b2U2R~>+6pav2t5aT4$SLtIY0+@X_7+(nY%cxu=TBV z#QQ}L!tlJAd)$WQ7QbbQyR;r=O>lV$5K{VQW0=;^$%Ap4mxb#_EQ<=a^P5Vv}8d>?&rE-*JA( zUz0oB5`XN%u5?Am`7*52hob2V2O87A4fpJaScE7jz=Agh;4^5j{wdo$G@yGj+ zZD2;b)}o*KGd%6Z=J(BD@#1(dX@>%3%=Is(`_I2MC-W_NVirS7T#dmAxLGxINOdAY zQPJdtTmgyO5JJ%$0&El^hch?P^KILYiS>${>anBy|#ceA2-4VwD z*5U3vpHy zn1VmMY31AFR z1J3H@`V7-y>iUG&5G__67BWeKu|&Ewk5c=4tQoq}(d-fjY03xj;1%!}@A{RI6{}h2 z@SG)Xp@!`=)M5KpNR$0`Vf6}@Tt|y%GnZIykMwF(Z|&6z?7_^Jf0E4?0mC4fd599v%CL&%A`p}H zzY-Vni`18Gt#O^`C=vM#E3@EjrfsrP*7 zo{;?#=g>7_*28~TS-#6vS=icIrH%PF788~LCl~E?1y{CvU%R@YY)7&f3jQ%daFd!Z zTY8u*wU(GxG|8&Xa7DD{tRHQF(|&j=H%JB>I^kOK+1Uj#@N06CVOax zH5rFep`=PtOrDmuMK%6BTu``pro7fKBhw%VEdl?$&c8@!j4LP8BzvFHu#2= zw=r9lS^GMlU4AhYp)_4_fw42)k@F2KOE>DJ0XJVaA75R4w;GHP{)nfPCO2ewgdO$w zWZs4~h}w2vNZHEK$uZ(hwrS7GZ~vPGvTSX=noaYtKsjsmAxhQJ*Dw*U zrxd4Z`_olGP1u$%DZY+ex~uBX(6>7dSb?$#!_M=wSd!|lsFh5RqOWyhzp=mMz3Y4E zndeR>*6k!N1pqsQ4uC;gme#pMsR#yj@g2!qI_~N@6Tw@3YHgety0^GLHtGKjazJe%( zfenCqdfV&gik=DE<&KD$aojN-_%H3NmEh21o2D>hDVXifWs@osdeVO>cq;404-JT} z|1dJPn2JfV_bcPCDSjcrIPAks3YtPXWs_;@`U<6^{k_R&-)lFcIR}V*}7p zan}|kzAS!8-hYS(39nb>#&sGk6iccd_5?ksLq-J5IhCd68mcz`Wopp4#89uu3~evf z=SUwG!E$12maKYNG3dB=c8;xT`~+G2n7#AtKvdsuGP-*5%kDLNW7CV@_BM2fl``r~ z(Kg$Y*yy@7#h00J-FBRN8CRO%vFe?79^A}vI-*SO%?G;NJ&A`Npm@=7Uw z(Y}6Mbj^V^`~Qn%Vg}_cmoC3MHR_NXbsHVD3Voun17<6P{3WZ${&X;>z#H>a){MFs z)d=Q3NYLrSKba`J8b7Se|5zuk9ba|}+@bI+zCN6<(m6(9IN0L4H$zn5WQ1z0SUyqU5MAhJgR=RA6+cMf3pfl)5iwQr6}lHfA27M)8h zc}s#VQxxwEkWSTv0eR_1$_~apq_6aAU>3p`yV4LzOyGnC^GA<@3qKpWTNhGjTh8xw zp>VubCH4^>0v>S5XLvWy?Q~#E&;t&ystVhuk@-^C(CdF(GtHh+*s`>rtSnjD zGWoPU(3Z#B*e^BX)Bi>S!xD)R2z5{%zE$%2!`*b0pAwsJa=CbTXivuQ+86JfU4~MR zpl_B2uDfxQdZ~j#4lK60jT>hiVQVJBMEnHC74k;>y;dI+BXXV9eaB#m@mKSXrG~v4 zpOH%L76x!;VN0?Emu$Is_dZD>REJn=K^AvOmznwf@$PVd9u`mTu(NXj`5Qk}O|3Q| zyI%-wTmRx2a~MGXrd0>(XqdYxDB@`1Z|~$JT}Q_+2st`&8@0&iBMn*V`{>f;`Hw_< z#4g~A^mZuYD5hZ0#$x|2eOKg13sx*s`8VM?f06eB^h ze0Y_X7B_=8PP_x@T;s*(qg@~GtBj#JKg%h)=#h{%bK<(PSqhP?5_|yc^9LxN%V$nHeRG?@bVY!B^X9^tmv8 zl_-{X8_$p)9Bit!u*-nO3;OyG*B~3eECj`N z&YE)ZuF;(iVRL%e6)JOQ-kHqxXI1+4pFM*X1dAh7YgdPWw{Q!v!-6vkp=QB#1}jm! zekAqeL7x-p!`9@^og*IbeBix)V?N5}I!He@o(HJ`&Fle5?xMVV&iA#E*PibTQWdQ9 zKOf0eJqF`{FjE9-87!iqoX0f43~H}d4#%eFxR}o299OY0cu6*|ux zlNy*OisPHJdh9fsYw`to3~T!>JG#ZDXw1`5(jDqY#s83<< z)KtkE=_7?A*f?YQ9`gojAC()R7Lzn##JEd9=({RhS&b4K8+Mo*6Pub=_H_N5M3VvZ z2JG<|y-2LTDDx?&Sbnd3DR}nQr>cMwk!X2e_01;TG?TOFExFms{>Twn(O%Ax_gb=5 zAz01zlDh z>neErYp-GDXX95Nt&80u9v@RXR$8{CAK~+L7fX6eY(13+>|#IQCDru9Zc4mF^YGct zm#yX}$hTz*e5>SO!4uJVYOYEmK+LSyeTo_eTK6%yC%(5d<3xW&pYP}5$f^|_7A)hu z_#*sRKfbc3#2-$Fmd;d=&KrQ!q2C`$*AsYkim;QTR!d8Rbmo(^;z%9|Q-B-H8G?}; zI8S8tzOvbh+ZGIDZ>aMM_S95R;!|wvPT&Jo&U_jpo^@y6z?$sRwUuE7FIZ-x>K(ft(OEim`#}2r z#u$~9PRRn56wY`WJnrC9den8Q>wE4Nn9~5eIr*I(Hj`NJ_3&(WpBB|X%Yk?ButrYp z*~m2-G2D>vSAU5R!=XLfIX;0p}ezuG|pMe1bU0 zrg+P?2Y%P$m!4R~-3w>?PMhl;kgYs+S;vVJEAzG*9xVxYKW)Gpn!}BoW|sA_L(y5P zPmiVTy57^)T)Lb}Q~69yturAz>lyZ<@ zHCVvZ^0LDny{J7jk#uXz5KRmHm5;i-`J{A}o(@-84c+DXk@@Ii{--|NXt@0k*>94u zw{Tj3VQ2G8q|c2pGpT%5>1ZE3W8avU?ZmaiQ))kzy%tx&+h*?C+FO_de;Y@PS3y06 zC8=TE#KQ6AE~wVWGEN>@p~4ZZAj>b;?Z2Jp4sTzT#;V^&&%yp2{yNmnuTaC%as-)) zlEOD*3O1r$VI*w%EYFe1>cmM`W{Q@=jNUP0R>!fP!nVO#@XeX@BTZ{h0Q#k*oo$lQ z_$kllLlYWY;N++7ckMf)ydHt0Eg13ec;PR;^fAJBxmfjGAn1{cYsS;o_TBwO!Wna- z&+P=}qtf_nE#b`wz1`IUqaBNHCn&D|YTcJ+^mxq~I&AGh!&cA1f*;Jx^W%GB8n!Cq zqvSj=AeoAvl+MNZMwnD4nf;vhx~_H6PDd9UV6HiHIOwKm>bWo3^XCssM{i7zc)^^m zvYS*0rUL*x;fhg}GYZa0*8AH=a4DW|k-Gxg=j0n}&ItH$o5DQqLu}jHfDJwI$D1lw zti=z|s#(vGbnX}Ev6yT=MvKUFuxKLzR)^M-kRE;+} za-->)i;rFPmv^(<`cV5JCr%Ux0H|~W={kW-{=m;Ys^XE(@^T6R_)uk_o`C>ZD35-U zwG-JgDas;^gr&U_uE8IGFL=UY1R&4PSRSuU5%z^svly_VpQduA1mupbr3MK@w4Fk+~8pkr@~u z*(mY?X>4}+3&|)!CdU|8g*RqB2dga<^n1}!tjst`vZ9y)x2~t`uad=!9fMgZXL;@vM#OqlaecBDq)6FV!{HGSrrsx=62o_!DR>5Am3iHm^l*qgri!-+YOUDw#`m4~Gnv?l8H zM;z-*YXfl8_%C@T)XCNF$o3>R%ex;6G$-pm5LnkSL@GN+)|jZ2YybCFnG7i7kx-V8 zQa-TVAhOhxd)@cLOLzV-yHL$|;RctZX}gtJzI)|MYo1;0_RNx2v}#)CGY>!0oV}9< z+&(|0V-#DjKbU`6E)ZP;jGDI;H2fuPj%NLOWJ`8=^2amI+~ZWk8v`@r;RBe~(jgLf zo3WPT??nArI`g%sXzlxJ+1cWQMKiLx3X3hHv@etY6DSD;|NX5OFze^zPJ3T&dWE^4 z85k7I9x>Bp{Z`89OSW5<)vxKU>{w6P`*=d-M4D4Y?VDX9AB_iH{V9!oa&xk^V9@9L zn$_C5SuGI3k`2nigNGr$27}5?5=B@v&x{#a$RNeqiIc{oEOsH0T zLv|7-ud_@2UB&}si;`_#GHS7-%S@k?dP6JT3|L7Vc5Sc_gVt@!jjU<&Zw(q+JE^jx z@HMIP_O(Is4A;?oWq9dG?;U0o!DS-g9S^J~ zHA`owdy;?m_tvvU-0QlA`dAPMYs$l!FK|Iqc&`I%qr;k8@M{UTEM0d>I%WoQwx*a* z=?*rC^@Tpb_lsvK6_bOD^JpYt8sd7gE|LVM!_~6jV4T=TqJg;IF?e~?rK|A>{mpl# ztqEPQ99sd82nNRC%7$>}pmYRFTCl!9L#L@}(lAw4HirXF@P=zLGWRHrKvUouXiW3` zZv67A3-lM3LH#$QSwG5;N?3c7r>6L&qKnPAo0pDY71w6v2?oO(r+EuDQb>zonaU2m zI;&FpewkmmP&{QfjBt#OM@eI{!!nY337RnS_4e0c2DWOXc~nyn3KGl zb#3{lLX(=i&)m!2P`ksT4_B2QdQ-Y=8n;Fh&w%}yP3p-Nb_`^==j{i9i=%zg5nrdb z&avnOICKRUzk);dvPBRY&yQ4$2a1RlMgD?Z@WiQ}I<=F$xBID(R>L#^*%{E%BLMIj z-kI9nm{FR>)t7>8u#TYqHa!7;bln65?TkNvJ_R;vqE<(u4GQMSqCxCZiVN_o*8R6h6QN?f#{aZEZ_tOwTX(mKnZ+y2Sq zcBX2JhT%NA5CfeNQPp8ei^*)-*p#iMu6;#nTQ_jYUp4~C|n;m@o9 z9~Mpc?D|kMB53q_<^k_cneWWIm)~x%QS(5T=}U?Vg!lT4Q~J!i8SZDrRI)>Cg$U?; zk2P=|r!foRXxxq&BH{Wj0T<}oq!+}HRx4SNYW|8~(!dNk?u%+UEOP%OFTiJP8*$;7 z+!yLxW)d>FH3H+`cyEg?lKOXR*55%3lvr%`K#BDIeTmbv0^zz9-YYQ4<4u(--0=hY zXKiAry6~3r=mRXK*6d!vqpqmm0Rz=A9f_goRi} z`K7d+HFY**Q!E5)IVf3-t}JnlVZH;45K9X1!c(0Nx+wkJh_2cp^u+HNutP zV%Zw@0ulwL{KLhe`^qQ@C{tsW1)LDGN&_4w-0^vZoOPk#|6SA zBA1Cb?XL?a!(unE%ne+_gD1y(1S+fZYYmVy&vHJ;Q;zCsv5dv+m*Y8wwEGd-2Qjey zt7$+|=iy6Mp+r1?rty?IM@il{{MWN4mtd*18)_S$Q&wf3`~=X&n@y01&J z{W{o^Y`+xc8YJZhy_!|sRwlB^_B^<$uSBg$TbE$zdV_gKN?EVxED^7NZgD4vuonOm z%+XMA7E-)`+#fl^*mkZc11KWk?btc2^#h*e$C=SVvHn(RX-XBSGS!&bRt~0PogD4} zWB96R3==P8iiQ*tMUyeFUaYW4_tpx+9m&KZT$kjiKG>K%7})yfVb)&^um)BRwnTjl z<%d5kPW0$6REp8y5&B-%?7KVUyw`=>A3KXqUfKSbGX-Sp=8xR`S!$Maql!7P0t%Ah zI4k|@YfunLU;%@xSpKd3LR zCTW0cp?_%PytXkxq@_8^lj$n79r)3`qk~7G#JF=Q3$P^c_463-cc8g~N!`?ETsyJz z<6D-FZ;hL=;FKhr3RGSiDyuC;Gpb%U=o4;>>_2D>^E_MI$2%!AE_8LVrmj<1HY<2|NJFy9dxJwlCHhXIrlrnJQRxKB{D+)Lu})0=+A^F8IX+ z(JnGdqFJSP$u1aq_PHHrnvpgAF7G}mkgx`ipyQMnT)!Z*YY2VLvd}Td`?nh{wvZ>q zbh)*VL<+EeIv12!Iy&lHSblWXa&j#_4Ko&Z)?a{DlK;zKO|q7=e_BU|@J6Ra15G$n zC&_v)^}xTkV*5Xs^?z-!_E*u>es`XPJ!4zHb?)dO-P)pVtAA{n)7N#XK|0}tAkZ0i zGYgv$807h4^pHbm=u#9#d~$VqM+->^K6=YP7eq0wQ%mf3^}Uhgd%-Ur{=B(RRl6g}oq;!u%Bcv(a`v3ek^fhHNd8jQmVBina!EkoFM zigrVdJmS>_I}54v>yMX5cIgbfw{f3eeh8O2Q?#xt;vy_-A!7jVRXntlNt>V`VBq-- zYycwbHoOhtmw;o(Rhn^;Y$V6vY}wVCh5hCwv(7{P;FO!A>;(C+AP0bz_WUiC7AmPt zulYu{UEl@A_Hyy+4~c4nMfKkA%-znt4lLMF4)#s7y|9#pMJ({!&gX6S=!>(_n|q9W zXLPDlhSZCJd@RZK@4>9!ZIb=DZ*=Qfq4JXzXJ@iz(u^5(n7HSdE4ZAJnomxlFTk|H zjj^`o)iKo>G?26>^!6X%o2m*Hm%ZS#%dSd8srDPF}f9%N; zb-B_Vy4PAWK&&t5qrw$As(jTO7kq|{SXZ^ia8c$@6gqHeDon^Sa*aX^??14Nb&j-%D*{^9GzEYAD`Sjr2 zF;dBUZELr68G-ssV8HZRDRe=%{0)1m(rb-XL|4f~B%~mlzkEI~I5w?!m!YDfWvSf) z9;M$}_7j1=q=>txd;5@dMF(6=S$c5u(`U+rx(!qt3MTcQpC*##x)8?`T;S^B$xAs5 zQ_}j{T_n$m0ohC0Qp#T`BZZYrYl^?fA6Cf_28Zs>2vUqDYy%HRNoX}#yy{n=m1G0K z!`8Qz!}yl)TMCKVG30534JChH97}wJzZ7PP&-wqr)_+s`Cqb2X&tIrfWiMS)BTw29e33t0AMf8iFIDcq|;s`{{gcqR0sBbZ*p^IV42wIX2g5`F$06 z)tOj2#IR}3Qctl*z_5g6-tOw*WMOVfPJoH?gP-;Y?zr_imd zLaX^PM*G48q)r4>4*Bt~Xjl{-zy z_o$lE$geJ(@OBwSzcxAl^)#&i)yV$79RD502YO-zA$%=VZ7-eI$g1qUE_5X9Z8 zP)4mH(PnI`vRHv#C%2%?92MT&XS;ndesn)?v>;AY$%{&pcjifJ35us$b?-(9Wur>( zv@Jo{l8*{~YbjqBDvvGUd;--IfGNA~`Q9bBBR6SPzPZi8bqSb~vCSG- zC9tmZV+hBw3rt;#zbO7f)Dj-!u#8>$<~|37JXtQjGEOO?kC&1-!rMg3ydK#opkqJ( z?*>Av!L+1*_{Wt=L=0&-n0}!kLLxB+n>HBJ?pNBc6Fdh!!e2ywmu&yLi17d0+dmJg z{!D{qAu>k@A)_sqR+E>!QJJN|HC-zoyqc`n@UHAR|5Tpu!&}%=x%&QBq73a*%EyGu zR;)LVTDe)>ZTwB#9wBrPIl%%?P|uIUJvmw|KjaJ1uSG&_QX1~EIt|n$R>-5^TM>O3P*{`kc_mrbb`&gcQ zv1Ea*O=izk=@W8f?8U4!6+y4Gco8@mtw3ia!4vN#D<98?_xn~xL<=LJTJXm7jg{O% zC6pn8KK7l_q$LZB&ODJVUB0QpXl|dD?op{re2+U0+yE&vxkWAN!qx2Tx-Szohd$EU z^mO;fuW~PG3G;lU-}dH=SMrcm@~~Pl_H@rPhl72xf!!n2aHl%-8%|&CR5DFrn|@zMJ^y5{D?N;MQ{+h^3L;P&sev4a^g!kY zj+0~2ZOdr!*BYnUXTP?xWV@VhXmWLK*9_;70DY-6*hjJ!o4Ieu4gy1N#ZX(~48nAh z5>|?)BPDcX;F6UzikeQ?bui;bkaQ?Q$mT!w&vimQ^czyllE6q1#k-B`?XB>j^;T>j zk;-9?fJ9!M?#mR;MPSrjn7*%@?KUTVaVMDzbaly*85RiyDlr{Xe&_zUpC3pMqSBDl ztVDfBPP!h)&=m8{GRo4xtQN<5xM95jr)uNhYI8F64_neH`-oa(BMkYCTeXH8Yxl(4 zMS24NrJ#jZF}~DJo)ph1>uC_JMqwxjJ&&nb!{JT8TbZ~|cuQl**b@BHqREUDnXB=` z6>EDt1yMXdJb<*0G6(yC8jq0h`M<8Ze{*NH=z_!UvDIU@# z5yDeRX0$|1iZBUH!kqv4qMyH0XcQc~I(VD#AG%O=p~hayER!tT@6@ocp3wa~bhk2X zp>Sijtf-i94V$>~4d~2XjLXccLN6kYtyJ5bkS#dXj3<$G>p^cua zf{K7x*(tA29V*zpVo_W6)A>!|w2^lfa)r_doLy}KMzJDiru1+)lXU)FdJpgT&upcScN{U%=wx++>FuzVxYke6v{{`!&AD&m?&mo|U!bm(KXE zyo9|>@>}GC#8oJ3rknwG6#iLHB<$2`c}Dp`{KD+$40fmY%@p?u+|MGU{)qyDrE zsigkOpFbaHzb;n!f9==Xuge?$ybaXd`Hk-mqR%&2lkDd@2BOEU6Cm!MG?%E`tup$O zMr=zu>v31L$b2C?BKp#6mwTceJul5a(XBYmq(h_&_#-<{+Z05Cc$H-A9Bhe!%QA+Q z(XVv-Z9&~M(lqngUzYc42)YgnNol3nJ77;!dNPP9WaUxH0=feF);EZxg82D zAld}4U85VX3&yN2**%0d6k@1QB6fUwM6Y1W$a->DA9q#d{!xrw!#CR=p*x6;<_0ki z5AoAClbztC?>(OqLyjcPMO`;!@-m2P&d07*qqV*Yc=SmqfAI9;jYCynf3R75Q*~=Q zxB6k)yIe+rd@VUg6bXF0W4jaQ5n6yJ4X>MePVp)7D(96~;!A_Ft_)47eLvA+4S&Af zIGq%S2%*S$Dm zE+N(-GZfbas+quJ6n%p)EXR zc^`mrpsPMdwmP-v0sYo_Bws%!Wc62OG^7i^CQxF@w}Ec~^?(9P{&qZ6FqgLr1wl9F ziKrVK1zOwUWXAKj;?!7POKCRlnPFeqD6* zuTp#eJ0cnX2e$r9`|pKQKOE;z_c2;x+#dD*HP?a?(0X7I4Y62rVW?mIowAt%i%Aqi zh2E=S;}B4(YZ9K65k*9UIu?>>)iAZ?RE9N@{mcHvOi|0x6R@zOUu>)=O~TI|e<7#dB@flvLjrX=h-SdSg-DecW=Xul@trTZtP<7+oi(Ge z###1`(Zy}oUUIl>G55o#Rr83$TCVmTT|5NJ2zn+T%dD(v>HKyVcinmRfd!)p#%B=R zf$QR3Wu3qZI6vZ8d%WeO`g(HG`rsvh$(;YW91fLW5ST%jwztB$s0x@fLy&WI{<`*+v& zT&%a(MnEH!?NrN5?B|E)o?N74`EECI*WQ$yaIXm+nc}#Nk&zF?cGlOf2+`tsJ@zib z_-4hf`GkW@Z_S#`e+rPjpV1{FGO2GLL7|#Fa4A!vL`!q#y7-A<5HN#BbWC@qErEJN zfQf2zBL&P@8(sHxRE^Lt38OF-K|MbXPiWovWdZ&;__FbJ*?l+KC=Gr4 zYAeg!ghPNeRiRWq0beuq>+C3!{XotWB<3J`1dmW(O4kegJ$pSX4s8VM;*OTiDQHEs zn)YXT`;dp1iL}LgtggIiJLT;b5hFYfks(2_zzefI+P82mkTy0n2%BAcE) zmE^T@8GB*(OVB#syiRRncNkc+JB(haNHzuv!7Q(hD`OWf;*Iw68w#?GAXZsfQSX6G zJhdRg3f~2>_Wblpml#)RP5Y!R^AE*n?d&cYXt4}u6;>5TYj|PzaoT(RO|M5AcQGdR zOIe;1&ea;9nkfpaiQCrC_eYL1ieDR`3YLkSAi-kKRIM*N4wTq2=YO?L7S`KfCk!l} zH84%*wJcSL{c13|+W>f_5TgRxgXBGd5eb%*u)KujF_hYLCbwqb>K%CJDm3i7dncW+ z_tT2*M`V+hdQve-raEhO8Ts4U8N$!q;nLc2%LtBOdc#nY3nyGAMNl@NI4BqzD1S4M zXb)q4-?FZ4qTLHq6f77=Rg zV{^^NJ4$N*dOSV9Z}Kd`{A0x1uS_2L3D!90u2G{smXT4_BPs$Q_<8I~{C>b#`s*X7 zWQ6JMgY-|VR9)K%!>O6T?b{Ks@i9LmJuudkJBQ?vdriSUck0lO{h#&H@`g5O?N)N6*% zBNc(5E+bEA5#c;phCTwbB{q_+u^brZVKkNu2K~Bq^zX8={zeWKT+EI$H&kR(Ltn6c z@T~6V%{ZMJmhLl#v*tSAgClcXHX-jV;ocSt%{g5MZJ4$1=x0dn(svn04%v*}(Rn-a zW(|@>kOHG&3>IPS{H3d<}`ocRKbggD5)K=Y5*Y>>bIP-0mVlGCv%>B=?fe zqPNRGm9x51N*?R^wvuu0H2JFQMmIT@#s%g*9r2uS`g(E{t}yXi^c{iRi|P%tNfYsf zE$6pIFx{EW2(e9tijs?mj^2q8!Xz749YCTR3t7v>Z09$KZ< z&|RV@H+C&)7jXi)1mg>}_}|b77eVkcf4fz0##bDtRHklMpBjbQwe#0kxi|9#dd-rAS z2>fn%{52v$=fmWb1<|WKr>ss_GqvFLbaMh(2`IFK*Pe{hz@VnLx=$NB2^4a(Y15_} zwzj{-im~OxZOSb<+lo#vye!JA(anBY=iwW@phQC-*&jistumkJ)A5d$PPx1I67|R~ zH-0O6uU$j*3@(@*V}M4p$b0VPU>$uV}WUWavS66abV*8jXN$>)f!)nWQ7(U zCSz*|XGxEU>j){N1xQ=+*Z)lHYGA@nyxmfmj~_Lxw*5}~bYs|od3_5)sk|xjKEh7R z*EDIXTfRF;`$#?LGUszQcX5@da?R0uPSU=Ub_(9G#$S+L-N;^4X;q*pT0ADsv5($L z@}s$;AI=cubz&Vh81}iZ(%Crl< zMj!I%=~LjyKS5_Lw5LBJKYtWK+0g%F*NK!VSk;c#+Bf7b?WiBNq3c-W&6-MCr|VB_ zH}sdgW=*d%Tu$CjR}mfF_v|ZQ*6HCM14W)E7)`+MLb)tYtKSGE3t#@fk3B@Nyn{0e z88!RKs>@Fk<8(dLw212L+^HnqwX|$-4Kob~dM9K~r%AvP07lLI|R6 zy_32oBb9HhnyyVFn4KeYq>edg7FWrgZ7v?wSD!+PAlBgV!kvT?O#786)`!D>#ne97 zIyF1dP}k`D_XMAk_F%Wb8HK_t=o1PT25QNf6qBf+6N4VWA4zt>5^tk8$CHI|id~OI z@0}0qi4+#Uya*5)VyDe8(0>j40hevCDIB)1372>eSF&0^6y{w-x!H$ zzC1f0!*T<|N#n^TFLW{uI#)Fa)^qwD&LQrh5(9WYv=KxyLC-BbPp<>(u!*%djWDZ|MFUw|Zqj#mg*plgVc$efF!0kcq|p zM74r8WIUK4^Pv68Qkah){gq`Z>^J&Fb#pp*e^z<_1ZmmN=vVAZshrCzC+}2RtR0M*4c#CUkL?wnyWUf|uv8&+^LP(=XS`6ZmS}EEW~7V6@4v!Aus0p7}(-aFjlU z)TdB3@7;XS)*}rnqvTn3R$Di)4#?M%bNV7rfBNwB^7!F%M%MWX$mTyn5 zL)4`jfF~0XV1n9!Q?H{Jf(;0*>!OQ ziI6MK`Dooi*rRcDr*1;f<1I~xXrEqaCPzuz5bRh!ZL7BXym2GCrq8@S5gUJc-_HA- zS4n9aZF1$Tlh#Wb+Qe5H>Z58v(G_I;0#RX^w5cV0FmyuihM zS*!13(Xm|{S2YOM5AU-{p^B4?l19#wLUW^cbdM8_&zs$nCp-$l>P2g}k6sl!X{OGo zgqySz#CE(0!ovMe#yrP|y-nGfM%I|TZEm(8h`UgkfPD~cm41gxb*AK>=J|gr-_(d3 z^u3%JA>}Han%&7!!LO({aEF?NZSx>sm!zfZHR>VsLh^0^OYHrp$^wG&%SRkbdV%3> zl+Rr$f0#xSeT1@YSkLux4<7oQA$3&ViQon6en_A+xqN;i ze9>b3m5Wn$5@proQ|HJRvU-(cc$tXqOIyQSPbmMZO5z8m2*vLuBpcF7ckl02nbR0h z&bVG+o7&gEdAxz!HaZI`(e_i;-DQ8cHJ{KZJ@abRDnqu{*7yTQiQ_&GYk21F)pd|( zWPMJZPBFdZ7OAl|>Q;z``tW6>O^_^u#NzT<=i{WTKz4ZM=C4ZyGKbIbZM4RT2; zVc7P8_li@_(#B18UOcsDhHFhuq4f12+0T}gEjoDf^f4*DCPP1;=6IF7s-M5%sK|AJ z^_dtvjZ%WR>_vJnh(`MiUnRATfwF&ypbYkpOjjw9V>Cw0XwL7-k149FlJSQ~)wN=EH8MnM8dEUKioW!ivANzhAS6DK6*D4|N z{T|t3!YkSancY~Wq>~5Cwi9R0yA_a5)Ua1Mtu#FRe*W;tc)?}sk}x313*tnTD9ZJr zlMBuVQcb{-=BaWaz1(BcivTlc8;QXD={)S&SOvrqaUznxy?HDt~^uV4KADgpgCVC-+5E+R+ z2-&afNVP}!%{X9rMo*>|3D%gE~75*r2>dMzDK}X)b z&CZ>T9Y1U1I1)GWbS;>>bYA$(F`o1HdA|Op_=@xf4SgeN8V%G=urgiXwOcJNR z^8Y#d{J$5e0%+wFWb4eu(mvciPu?$x;@!r%Ec>=AqV^A&&uawr9p^gB(D;Zi>YeJ5 zZhmWAyRE5u!H?-VT+iO?_#zr&UPL?og7Y6x=QXgw6zgWP)0MePL=kABoGE8lv@whk zLU+Zx7;ig!`jOPB;O}gr;AH261{%TAzh&Mxp2?*dI_FbK?3*G>EZvQ1)wjm1GnsFR zd+5@}mSCo&2jp9rII*ZJ?4@#pmS3Itgr|06eq$ujfS{O2u-)%9>e5YC&}hT4R-B2- z$JMW6Q_*pRFyyT)hh!X>&0VsXZI|--B}J=Tv!-7%r0ekVFY^3RDMF~N(`?p8qU@y9 zcO&}8Kgcxj?a-b-pOC<&vbLvYenH18_UVfrqV(}Pc`gA9=4G0%P*CxCGWslvQCyE2 z07!xT{C~P3aVTNqM7LXak8hrsl6Trw`>FQ!WSRDNj2ux}!Li%@jmf$*4fn?m<8JP>x@n`xED$+=I2cV%4P%;bJGpf76Q^6A*WU}zDm+4ekSP4! zHV|5gR0W4o6yhRRvV$24!mjqI8k0$NX^R#}v5u7HuLyOxer0~saN0=!mU%Kf z6K`wztv!*li8JT~YpDcsETNPrLmrK4#fCz+(H%SqqD1VLu7{%L{>Qz~rfoXwsom5a zF!bBO<;6SS%9dW{h0ZXxO+Xn}~Ww%Y{N+)0wmMsPEnV zI|<~VQ+XaemlGZrP<)c4^hU;C3;449^|W)t72>DgSgCehN#G)i`l|QvRq4d-LsrCT zu2V0v-h)jfCXz!*Csd|t>k;3uQ5O>FO($OSm8uoVku^|CzjBZfCt|Vu(N5mz1tvaY zn%2G|y>Qeed7SQwHq;`K7 z^#FvTe~@b;h}SEUTH%t;cc94uumb=`z{Su+%*!EPKZvs@*QV+)ZHMM~+BkmlCd;?G zuF)X?#&C=-!UXw^gH93}%8Met(s98qWtOul|KyGepBfwf4GVZHttxb9o15M67)) zwG}E#em8>kD*)@yN3ec4+MnRi{C_*9^}n(GE~tVAqr{hl5;pIqter*;>ClAcB{#6r z5M`s>p2E4_n{B1-wAFU1>Ri1WGUemPNS(_TUKH~FPn#BU!uLJ88pGg77RgHri2Rv2 z)?l$K@fL~65~fKQyTn^0Mljd{V;xv8Lp?R5W`IkSoO@7TG+y$#7Jo}ZMZKsYH;?xT zwu3tS;@y_n9Kj9O*H0*D(|hk$;ddaLN6x>wg?7kpnL|)*Rj!i_h_qUKA?Q^xv3L&NiRCJAT%F-fF z!B#;l(oH+v6vucN7&%F)|3PnKcNe~9l#F#WNlWs`5DN*WUfe)?TR&^uDas?xktvSc zRW7E{+jv*t{6`q7z7fblp%U2jv=sCq;)c2-{JG@O>n-flIC4WXhEE|*guF*~c-l;1 zN*r_K5!Ff4K0mwPo>4@uPx2uzOE8;u>W<&}eeLvINyT`-1@8yU zcVIyVK9T^tKt#Xb0-3n(s2yKF;r?NDzRQ8o6Zu5$xV=*xNM_*b2&PGr3vzRxw?n9} zFG;cddbKpan-q{HSvyU%YgS#P;yP4S+mdATLiqK8^!xSX%CWt}cznCU>IOc=J6HMA z?r!ZR!9LriSyw3UaVzBLmz)KU~Teaa;{NmZZo2l$JF;Slk~vP=L5@IJim=Q;Dt`J3 zm91d8VIlsC2yR~S?@wwc!AIZ^@GiOJ|zmhg0DPKkQUbxPP)uj zU_Az#XQxvN1}vt=5H(eN6DVEP&H9>3xC2HvB3f(gw#VADvo=PZZZkAUCOu~fm+k1z zF~GMtOHBtiD^N>^hxU&7r{zbt(MQa3-m%j5Qq8>g_k{!S zD8ZQ4JJ?anB%Q*3?#%V2rkuk!xWDQKS1@Mr`(SmtH0b94dnv*{53t0Y?;nI&;$Qqf zu=U^C{tQuFQd&?WFy4ti_r_}l`}SNgL?3T7|0FH{X2B_ac68W?OKoqkYK;owlm=Kr zkVa9DVKm8s7>@kARj%Um93*P>D*#LUegMo8zn7@n0+n%_q#k65yLHSWdJ$J<<`&bX^m4L&9oyc) zf|L17?kQ@45fUV6#N>C02GxQqJKr_RQ0-ZDt$jzPlzzIT5K`DTa(R1@0+*pLa-=I$ zY4}FiAG|%lNQbR<{6Rq`V%MF}c6)g5^#~ayNW!v4cgEw6^F&oH%*ydz4`25$vlyqE z%gcu)^h8TN*1#019zmC)8j|a`>d)Seyf8g2rM((sc*d@%U(%)Jf|PHP@Veyb%Z*bcV?NQ z$;urX7qN$MZmkN=-q~aIjamnIClC|BRiEc+a20tiMrc^p{Rf zVv2&v4{nOsdkAFmGl@*J?&p*G^XsXj*jeTe-t{TH2gB6TbI&#iWIcA+?+_`0l>}H) z=o3{(2}ujn)i3rXm~0vChZahjBxDzo*E8R#*j+wIq&XU1-M2GaID$}uol^Q#=`FC< ztqff+^`+6;@;q5y;YCBCR_V>lcBayMUcQ$b#xUdG?2NTC*IZbw$y3gv9J(VyXkE!A z?ZY6p_B6jL{BZ1y$1gp5uhVEZ$4bkP_8ET62xofBsG$iFHx}*SE`hRV7&v@h&Ul~m z`nzh?=Yx+yIc81Fx1KHxO}^@F^IJPCqk`N-BX#NGyx@Zy7oN zRqa>OE0PT!mEWZs|L}{yDINJ=9PJ;`1pnXOey&P2*grDxzlJsFx=Pm>?0fqRYl$st zzDf^rq*sD0WH>cYo!=DJyhELxjaA>sn7noP=<(l9F8|#g{wo5H|IB>@ehj=9GiD_0 zStJ)!5W^Oa30h<$EEyseGFw%a6a0X$3D!5jTY|J2L=KiM^QyqMt>rKHF6h3<$lof+ z3yZ!U)jtd*Z|L3?NobM4bpOqZ4i!#WI(3@O>zN$NIAGq``so)YKbZ3Vecaa@8gZ;F zevV=mmM2UlAK_HuvaV|3!*M-vbU$9&1|>mE3xp)Z=E{5c;Rruyw^+!z+@JhtJs!XxXg59{ za_)YRk!Gfpso*&rQ&PHF5;}{wKxjY$HVxJ!g9!UycpLSVfbEzh?1t8Uc-*y;;D;%X zJdr@a?>#mu^wQyi11`Pf?Zm6-aQ)jjUb|8K%F=NHu3U2PqG6BsZ!%IFVmIVX!*Fv!34(*&^$_kQOY+PIwG~%RT{HEMliTaM5Qb?pGt+O1rmm7(K&V9z&U`cQL~4S2RuFy$3Dc7$TsD~kKMt0Yy~51@K= zbYYdDjEALzaqKg-+=-prq=a+REpr~WZ`qxub>i-~=?p`1LT_@ z{+Y{TkLnsKssI}b!1AE{ZuxHB44M+F!zHQZ$U3#kr?QnGh3B2N#f-3o-Op>sp4MDm z96&HUwovZ4yx*8SO9KL1teEUgrebEN<}@#p3Fy=}&%o}re0_Z6I#s!d?kTh)R*1&n zYaxPVRKq{a&Ef1_X3*x%KdKW{YsE|TxzSk7UB|qGxyuB5=1w02Lj!ixzVEITHhhL$ z*6UU^UK!C~ZOw$08-|1V^j6-tA)RYxBpYsB?;Cluh9~O;a(1x3gf-bd!}DKe?#G1> zCXGA)eSSv`X2TB=olN5$m!m>mv zt8k@FC8$e3nLO-+^nvTIZd_$-xih;ZlRu`wKjr8er{6p8|8y0<466RU*wtW7Qn*qQ zW{I~9aKZb7BS<8Je%KD$QJ^E0NDjqLz?cJ*B?zLLWm#V$Zjknrn~04Dy{qV6@1=9q zi<_13Xx%8+cIYcJE6o>m^lD4>0ID@1!i+2!3?<_F;-aDn~bDKAT^MyUd`~B+zla$I%{kLT`JrSiR z{MG65j-XDi!BJm`%A!&`lR8h(-bj7J+yRDy!WKYPc)w_z`3r@NxKTmv{2@p79O@y& zgIu%!-YsuQtut%(&!FBJ2!IB{EXkfQ@Kvlq^;w{aw$|ho5IFfj42OIL#4;g$497{H zO-AmJYw~Q-_DGqitrP^zElZdBcl~!}upd0^Y!7Hx zYVY25V#;|Z`1idQuL;SJD7sjz($|Rf~CVJI<|7utG_pQ;8 z9fF<%_k8Jj`y2eHs`pu+_`dHNsPXi@@Ptm&neb7x^NYOhX7bd)ZPG8h4rqlkWd!;V z^7!Dws-r$p(GrXk^gtd-aQxh~Eol(cD73BWC%Hm_0ub{HyxlRj4t^r_kXqi&d!=bt zZAqO}9gI8JQ}8S1(0{)DJiqtf9KrgPCK<=#n)l8Xne98UdT#%uV=?~TtWXG(LXaHt z@%2;ArjRDQ-s@CIn|-TQn$P^)F^k#?VLA^~^9@gZdW#q$j-ejj0W zUnRD7vA1RaEOkXWX#tMJ0hX7HTESIFx?)K-*iLq)&%`W8pPQ9V zvjbVYU%B&=6T=VN2hcG8V4p#BTn1}@CN>~BF%NwGjdS?Zkn8`?VCz>RRq$StsJ?df zv{QZW(}(St({tOu#QuKY97$LsNfLnSzg?slOX|)o!6;jPOSE<9mpl1TEw#^1ePQ=8 zP1BJV$ZLUpb*l5wX@30A&-r(I>0f(y01MGH*Soi=EVrySss@J}ClTSCblJH0~r z#ryO3lN)VNII^m8>C_|YMox> zj!L=bm5+qZVKsX<^$rE72dp57&4};h1d0th3s4mpZy$V_FIiMYqLw!4Ccqu~BiTwq zwX}osdO~>iYkwDxwD_Nu;MM)ge=VlFNLYizs}xJFhfo^&X8AsTOkZy6Nl`=*FRP2Q z5%kqy)>D3=<4N3KzNF}(a9O}v^*J&PV50;)U{GKWROVlon-0JA$(7Ecij!XuToB*S zlYA{yy=6ue8^yNR5?V;i%}=oHa+ARjY4`-o17yCs)o?vhH^6k5t=w4Xyfkn9=mbiL zPT}zFX4qtk9^W5-TyXsTB4R(Nx+lq-4(s8Z{WU#Wb5WH zdxy1hpGBciVR$RSViHlD1-kd?z-In=sCkz=H1sIxT8&@8-LA5$w|3|(h=sh?uNXrA zZu=D@onLx_{;Ee2a+ZJ9X$@>JkXhO8j;6HSNLUlfZ+2RGO_s51Ze}^B&z882ya`+A zFoIr2sgD+IE^2$nzwCRr{au?;kV#$IqN0=I41(8WkV@DL;%s_2;RIBg%q3a{@tkZ@ zd@oCVmiaJqrQbI#VZAiBJ2iUQ6NbSay%(o?>?%;J86n^5-m(OlvuFGm&a7Fsd$EnI zpdrKMlkujZaw^A!@1u%0-fX)PqHLtsGlDKJH4_VNiTs9e*Wfj`@_W-wTg?v<7Sgok z%n6Pt5G9CieK{j^n?$)VB-qf27fEZJ&wo$tV3c6$XdPOC#M;D~>r65*pCNqK7+iYy zy-(p%kC*AU`mi#jTa;;pO2Tc@9VC{h7znKfu6o6L4&v_q_cgI~=r4N_O2Vwas)YVm zVAf#lu0Kg6WklciUiAHoxBfV@j^a zi!?Modz0)e_vwoE?sJZ?_)dMra4^R?;1gB?32jMSA0H_?%& zN%4C$+T}7uA%d-f|ES~Z*~XrPz32_D^)_B)VxqIE^65vm*AY_g(r?#e`?hlQ1PZL} zso#y)b){i5k*(Z^i>7x}k*Bymk%2<+{SdV}MZ2L!9o8Na0;QoCfLW5`?V!=D z`+_z+5VA2>9_*E84V!DVwu-(%_>z~8G9SOl$rCBOE&m>jr##9GnoO&HmcbVY>UjtI zUx=)rxMAYsS=D57l)vuD!9%^9(=z7KX0MA%s*rUiAvxuH{WBBu|lQFk}(G zNpgindIC*s>us$&&S=K8%=I{0ho+;J!F%k_$6nxw|9KPW!RiYCGLpM^&z}OU!3ghz z)fI}rC9#T)iuW+>83J`5;R~rUO24ELX}etWZsAIg8~7EbzL2Dy#(z0l?MO7*>mE6LQU7WPa&~BRoIw>8 z!A%c|npbYT`urdR*>+zTRzcdSKIQ($NX_{RSBF5=jF=^0O7=jWUw944c$%)M(Nw|+ zNirscvYoyKvu_B`T=F~Ybj&zx(rfZ809AwOT0wosd+(|!&E+7eI#}%L=g>;L&mfi# z;w`^f?egoA4S$v8^Pg{jl?vCNSttGPg#CZQCbg24(n22$Mzw!!-9&*N2+&B7S5glYT!{02_||}E#}7Q7 z2th2qR-70LV+Y~SA#Nc_5`Zn@_Y#K3P;WTvO2P+v^VRM1qWc~UCTalWfyVolABCrs zr>UD0_K2^do*#!NfYo%bbk{Ll9NmFv2mhd84r+r~6uX@xi(Gqr`rl%$rxecA^%QrC zR4a8H4XWJI`H8);#uo@XXZGbU?tRBpqa@>QLn34jiiALWI5XO?LGCu$yK^*p1=6Fu zYH|!V)nPbEja3U(gfgMbNJNGdp5#ai=ksYpSsq?}18W>ErO0(5jwiUl5p1tv8(FTv zM#>?G?n>VkI+I4C<5nCNwg1uWPD=)}m0LeCjO&l@oLm0koK=O5%gE1@GlxcS%8oY= z|0J*dy4~59(`s zYd4jB6h6&2Et*ew3QAO9HwP>+@&6dhKZ~#W)b;9=U_Ll1J_^ls8|lKTKyuW}qNAF` za(m#<^;^q+BG8W%8@qJxg?k9LGoUO5mO+EVWnM{%2?cxs( zlr3}ZyBIx=Qxk(OP+med9dI`*tCK2fK+6z9NU&pV(uZxXcV=$W?XNq6&n3H@P;66_ z-M2SObxe<;N+#JKJN2XTYQW*S6nKBL27H1cM#tSM~%6N(i>Yzz6PBq;-@z*nh>UiADbb z@&E4lmiP$&gCWTjhXkuH@aO8^rFhKvj-~M_Z8!TQ0Jki^wCmyjLPR??_Ned&&kWXNWqT2rqr+%dY zv^sP(WE59p{j9LduUN$w*FtzZglcvt4d_gJXeU(7QQyyD#@dLkdR3qLIREf6(W z#(nL>Jhm6f1$K!+6?_WN3dCA_gL@+p4{W5-L4**JgjTRWIf`h6E_-)+`^%1ZuIW?n z-F7?RBbU5xLhWUoC3VwzIDx*Bx5(}t^~u5sOGb7rP{^UHh@Q^d@TRP1pK9BuG_@UZ zeycc2aSuJi z{#xEljvh4->lgTm3{dx&6s|pc&+P@pPx5N?i|1^anzAmq%B#y(<$U)_ysbrWF-gDc zsN?pSolDROGF?0H%p>Nz)EYyGO(!Br3eDw?6;g9sBFGw%Sttc?Sx_ukauCBI@`rc-O ztH**B2}C&*j-rvD>Q|j`LXfnk+=uFZgEsO6 zX)U;ia`TjVgp{otPtl!k>&?+Dx;@Xa*z~5r{S0L%Y6~ka?`fmnr07eD(7(ihRFE9z zT^jIcDmPL!MCT5X^r7eZ20?xColkB=%C0T1hK;sA6)zPoohP%lqf#i}9$FC8KZc{1 zKLR&fdDCYRqL8Y{i3Bg0@07H(jedkyaBmrB6i*ONi>WLoND2J_O#fp6X7iuo+<${9 z)~_pL4c7i*4%WYSDqVLP_X&8sbN#mXHDG4^T%aL$+l6JQ(dCi95q;SU*ZX^<^v+&z z$(N?_FNn0UW3avny|k)PSg@%hw2$NiR7A=8n#+t!b8-CTnEa)9SRm%9s#OiDS4H&K zGEY@@rW-PQnjwD-g~9XEEvE3$#0Nu{aCaBIeSWPt@H*dv!#F;2So&nXQw*+i8#g7qJKDgmt^C=J7?q#VOwkN04)s~`6Hh2-F1B;3LHSmIBAft4lR z6aLdb^J*!~$B*)6^q&{S!s~_1%`?0AgT1cgr-{meq~4JF#YL{X#;)L|%>s8&R)cyp z$zwv_0||hHgX{Kn(|_oPzrg7FYx!IMy)3SO?@WFUtzZi%HHXaEI*f3Ul@i!@S#Huc z_xm&wL}<ZmCn@?g%S^7`+SaVqr8t72M%juDzPNx9LAPk?!AM3OLBAqt?kh|5gWh^ zR4uK8D^vA;{&><-`dmUGephmT_Dzu`Hgo9pNlH#90GdF21@aHEm-M&Gk$k4dFu9X^ zdHWvJydGuQEz3Fi^PceYCGOAvYv2=Cr@Uz6c`X_`Z=7g7(8CujOh4Keqgp@0u3`bm zO!yXVn$mG>WODlpb~cD#!1)8Q9RxTa5-HA;)br!;gea@ZO)>=qkLxE>8?Kjw}D zm!|%t`&OAi1i&{v%)~;5wkz;L*+-}DfDs1>x~&s5ib?hmJB0t&|6u$&>V2^<@PH;R z#*)yN|D|VezOWa?{z1*J#8~u85%&SPwSTV-3_|_wO74vv*4ja<@+*jS$ zpT#H#-5N?1gNW(zT3JGzxnjZm7Veg_ahaQ_G=z{Q+KS8(LTIc0{Iy!FrS<{T4)^5A z{B6Cb@^k1a*z(Tnt_i1GmC2+!j=3`Gx<<;SgkVZY3mwFKZ;W|;guLTnz)3o9ox!51fflbu zJE9T&!#M$%BDPR{mNZdV(4o2hX}U>(Pvq+?>pWOFpy#i9&lZ7 z4q>>k0Z}1-aI~7>D0j!&hac4!5SSG#FCty~bgLh05m5z)(Jo|(g7Bl@9Pr`(Z4WkO z{@c*~yY3ZH)}D#H)e%|e&wp@ICS)o5>W=%@EM>-mhn*zM`uS?<&uhy6d}#Rd5wE`r z#{EiiAGWAC8Ll9kJsWkcffFp)dUVs9vWzW@KaM^>KEEk_=)W6c%ArXB2X+s9h;h)gestNv_Dh1qWj_gljFAZ9G8<)zDu~+qu=U-UFaCu zyh|ALe#{Fifk(@-)+8**W8#JgbXe%ZD?}@XWtf{#jzgSGvM2v8%o2ZVfHI%ajY*Fw zae-$($#tGnvA1%^7Js*^yh?nfl`6BFq5_^1=q!4K{lU~bQ2R<)&u_p@iUVq*Nf~bP zv*(J0EPhwD$Q(^YrwRFkkqU}?o@^8_j`ue`ky&cKr}H+)+4=dX>72kWyu}+cmtG*p zC2%=7Yd?N^gX6?W($8=yJ5l39s~YEUH5aSN%F_jby&>JVky3W!$AY7G$IaElLOkU= zXf)Bsj(y!!tg&WQ|5fr=v*#1eji27BPp#wCU9Dfup&!x@KD8OC8S_Pa&i%UYqHKzT z$|GDw&|7MF>2RokwUCisq}-mjU13?a-JX?1L8~C4_#otp43L5N1jI%Z0NQWs52P7s{Kp z*(T1WQtZCMm?_=|=wESnCR>R6MjtuN=aM2WJ=2zd^6<0pID5{q5ffLr+g+TSf(l9X zl&xqNLTE3F0?-T;6q*r3gq40zSr~xdJ*^wGQ>HcP^@yEaeu77M2A1UBm0Z-nwUuP_ z0)MP=Z8#Uxl&MjfM=H8%JNy=B{}jbfCG>^r1-9c+J~@(p7=u87I2-`{KY&^8Gd9`K zCy%+@x*JIm4mH0O+D9s{IAwH!Su3N~dAubCk3>9vFjF6mC8-f}_^n?)^>~s|&(ju5 zQFdEE^Hkw74fWy6Nc~EQ+Gj}K#5v^I$OiP~e|Sdz<(Bv#acId1x5!C=aAo9#5V}Un zruJg7D1zdIzlD)`FppXwCjB#F4Zp;}g7$YXvEWkq6IfCBi6WV6Z&;IHT{R}jv7FvE zU+6YXSaX`a@43ice$+5W(oMj&5LTV+7kr023Cc}1_v$rb3tBgRS%5#jJn~%%z5LM5 zjXr`(b$4T5@>g+32NP)dem?#Ll+8Q1&Dp|{p!o~B>eYTdW~4o*`R{sVOe;Pf=XBna zntQ8;+EiRLWl4*$)Aw;kw*SiCA|M33TIat5K2Kc#F(C@Oc{(Sp+w2XI* zwN$h&b;+)8eSM%-JgjF-4JA}kNx5v)y$nvmT-i=t#$}rYX&czBakgiQNWoI075WI? zptB6qVc*dfj!@AJtr>>m6>@|Zgh?|Nj5x#9Ja3x2c3Mv3Ww#Z@oY@cF74*s^thm3P zVLcds>(@imf34W*e{UPik3s#&wsV9VpU-c?`Mxv{*&zfO*ayJz_p2YR`5AQ^-iGi? zYUh>r3xg^v>OHWDMkn?6<1J<;4m`?3xp?)5L^T-Vp@#$DcvYFUkIgt`aeE1MqWKx+ zFs|>3L#J|jjE4Fz@6d2rc!Key*Rsl|t(=&tpQvOkoUe7@g|hOo&72TRu6p^L**$zA zEmX#a@D%!hq_+F7U$tca1mPHnnMoxo93Zay@}~42Z+n96@m7Jk!?+SNMK2@E%!J;V z5Qmn$qQQ<2SL!myXEowSMSEe~Dj0=Qo@`GUwp#kW>4mx}7j|eS$vNG0vsLOd2Bj;A z4NRYvdzW#KBbfM*|5jS=zAd>|!LII^V3o6}lu6%EsAUEkLtj7_AMgEOSGE~BJb%-s zPvbyUAc)#rI&7#f%XN(`eci*kr9Z@sY0=k^xAH*d+e@6*u~e;Q8}rgc zN}}x2Ya>6{y?lw3(org0r#2_yg@^8hinQtvixvOV~^iuc7# zgq=_N<$KfH^oNkX^Yq>1XWthIN1T|nlcF*(jV1Yi4fbzJj>eMEnZ<5z7aitR^}i53 zv2g4NA~rLvvyM?Tz=yHuq}>uaOJVNYPGJ~dlez(;@S0`PF_Qpy9;b`2H$5x;@wJOh z+v06QK?$8yPl@;sxeBPMl;ZEk_t(7p_*hiYLAtd?-S+WPE&mSQr*k?hXvrYf@clZH zB~gb)Vgmlc-70%=!c>@jpe|A}o;0v$imzynU^ZF_d?~n=p8YN7L~++gpLZ7QXJb5n ztO{HmWs(_9_z&sq{JV88sW(2YQA(#>B18$d;9F&Tdant4(&JAgiL@rK*teRxM#LdU zBVVtwzV7ZJC+6Ode)PTi;)hFfsE|5@5gv{<>yX=##uhXC88lswoF#dsWK&WoWe!$N zRG=Kg#9XeySXqAuA4`&n^|#10{BEKUQZ|Q*kPv!N6E{Y=9O{z^8s2xchn2QH}ViEg4lw`lZIiBkY}EPpKCi2&IBM4yq6SrSl}~9 zqtMZE@%2)!ZFYn9xGtxLIGvph^>f=3MeL*($LkJUe{gwcp%abNSJ!o3bn6?r&Q|E! z{N?j`!Lc_Va-;b7Bz2a5=){r%e+l~PU)2UHA^y2u%O7lqwfj%O&~KcTs^Bn+f_M@@ zs4=^ilwnO>%Ny4U7?3K0SJ;2}@X?Qm$*u{x)zX4SnG#)Il>Voi2Z%bogzuI@f@YcN ze)4L;NylNWH=pgD@l}dyuvL1oR9+oksKRxI_!bEFt;+FzB(w-jtTbWViK^e8jw{Vj zS$2_XnxmM%@1;p~&dvfsAP58u7LFF5|1Zl!{8cii|GjOns8#oyFH41cKu{O{3jkH( z*Eo(8-U{W`!*^L9qXfXWM)esTL&KVBU#_B&&w8>p@)*{hhd9(CFuwvR7I^A)X=6>v z=Qpw3_wo|Jj#urzubM`~kkY=L{P6a!z8Y*F81x=J{xC6n+a`wK!U6fzdDx=fDj&jf zx-fn!S{#l{N}gujW$%+r8vYkaaEW~+^@`5tZTIMlWA}8w7wNRS*UsYKVP+`5B8Gx| z#S*xaY~SV+1v5ub62`}NYBcBJLOJ$92TRq`lTE#CPc|m})h z)AQGqcxTo&U)0&;ag(3Ol0SFk_L`0lBo=W+_j*Jk-fU>tBrUi=8}45}=aRX@<-OeV zDn7dYsa=xy9|Rphn6%ERSq7U+*8aRhv%dIC*nM;ql2E;Jd^1A6?B$l{LVksFx@(hT z(-vAbc_CQ+=reVe;r6~=&VhnG07}H_gZ<>4*w!Oq&)TG>jdhW7=R_}2SdfJ`mCbuM zU$hmL;y?6+U#{W=P$gNW0IwOgF(29IKL$LT$}{lqPQJ*lVL4ep6&-~rBS5PK_eiF_ ztTooO%iW`$9yE3JZc*`92}6{lZr<%vCjvJPennEKLh{$uDVpAxThHvVr@l&qWT^F? zhDw%FuJrv4RTdEY-$+<%fKP{{Gc4=}gI3UfzAyj+yVc!^E{FByS;cLN30V`%oeokIR3(;+D5~q)b-nurAPk#I+)1#j z2^?c%tMLJBf>gf@k06bJSyk=v!dr&x_cyL<<<9~$oEqKdDVzzC>UyBMC#G;nMDG7? zch~<09jt)}k=8AX^>{eTj>?5j^-E=e6cFmIJ3b(*ie!)w#l zBKNsU(uY^%`NiR*jT?%S?xjBA!W54Wt5YS$IW-~Qsf(zM`6xlAwCIF zKJf55FyY}fDb^vY)(}}@Y18o4vK_2d}&GZngpHG<1Cl9PStv&Fm$@Dzhr377><(j4Ol(+tT~#Q>SR!FT`z zVU~FNAYkj~8pQt|*pmDfOjjMHb)y7j0D~Yl2@gD+tzN-4e*1KM zVH*dcCJ-wXyEIaX>DaD;a&`l?ng#-|pF^&{R#X0;Y=fOM+yPhud9PgPh&w^F7%J(2 zUj=bTxc~4i8(sHxREcX|}OXI&bkdN#n%Bsny9xFF^(ye9t`jVlPEx;F8YygK6 zmOAqk?M@1>tn`po>M>{e6Ws}9%ib}%xUK3AoiD`NY}G^bdBk-MR*fq%A*JX~bYIG! z5j)CjEN254sz`FP2KLE;y;=;d;y6-xYyY&44B-vu+%;;n$E)evtO_AJhkBAO?aQU;S^iAD=I>v>VaIkHD6wPC zPfW|X$y#(FwaHi7Xnr(1qc{6B`@>oqzvNZ@{0&EiT81MzjPZs$Jg_(bK-g`!jI^!e zE@XRge7by;v`IFVuSVV+b_X=vsj}LpJ+_ss$mwx2@}tlMjeb78P8c)bWCFvUV0lcV>6WNo5(;6{KT=A*Md0 z$sDn?GDtaq7h%tuzI?P2q9d1Dda_RM7^faN9c>nH@Wa@(-s{4ALeKh`vN2L4>?-ED z4iVIEaeYl(afLLeOgg35zr2~y^Tz7s2fRhH@JN=Yf(Qn23jQ*@@)d6DZW71A77(L` z48tFcT?0m7$#HnF?eHyo`9PpA+XF`fIxg*+ycYj~51?m+J)w2z>^RF{kN~6v`KIw)! zWzU>*UaFPsKHWBfFaj1WZ}GRLh@+#`d7F3KaZdSrrgQ!2AsQ65q2Xf_sGA{h!35Gjz49BcU@wof?PUqD2Iy@FwO(3d9@1svZ%0`PVK~X!5(Tk2D5ikb{l%<#2mT^u%(rdQ)TR^VwmUzH(nKF*!bE2TAxiXFl#zr* zO9IaZoJHl5Wu>rEg!t1bm$IkQd-g1y?b5I3F=4q?`yR9D^A@USG7jVWMQn9@8bjcC z^Ta2upbqrX`RtipLnPm3zJ!l&tWg&geTYNYK(U+9}DM3JKT+q?(yw{ht~O9 z!&d22leXVe>*tO&9^$}XzhqHR8r1|+R9Qw@_wfT$qO1<%B_O7!JWOvk$qmZsB|YrK z*Z5Oz84&HKavl4HPS5V;-6x4t34{4$4LrjCGA+~i@#@Z4>JlNNW{aB1_YTP0X%H*bN%`*;(| z9<060_uSpVah9J!^cAk4oglX3Md{A>mwaN&B`vEm8)0l+ z8^XzkV}8a}bEzSn_0w9=DIi~8X-RMTRwwgx(|iM6h^&AKG$%l)h?#ZX6DAPPHv2K0 z$+PP3rf?g4NfDQtwB?1VhGTdp_)SWXXcTgsQT*CKVUOz)o3yTC$H&4cj3ZCqlky;y zX}*C^WPee}p{t0vkX3-n#CMBY(gN6C?MgK(FX{I?D)*6lheI3@DB%x2aW_dtz-XV9u)ixbejs5(@*f8Q0!a}8 z*gnwp^;hZ&0b0Q#8AdQLX@)rkybgmeCxuaxTD9bz$+q2$*ZRR_oXK5#?XH48yQDY; zz-Tz~55_?fkc(5!(#A~y#z|UhZ;1-95mHf^`pFIoHu8nN<~pGE`^0X3NUl=y)jLR< zKTvF9pba@(%ag>*&YUHar=Mmk3e&gDOKiImv2pSpnG9ykV{d}yJm*%69;f8Rk2?xK zCVUTCVvz=#TVRv~nrd)eP$CARNQ=$V)s+_6v`u}$iwhra9M|jb$C=SVvCeG!WG>(X z{B@p|yI=bHDnYw@mzneQWznR&AOH(OE#l?za8d)>KPk>N3LjE-H#?6uru{IxiaQRx z3-`#l7xt{$Uoe4|RKx1iZrv`F?HkteMmWOo z+4yBwOT+ffZkVgIf1O2?rm3zZd5-GDukMRTe{D~d)^-3FGC}?T59Y5S%Q6fF{c>ZXQE?cPM z$atrIMTXKtyngvc8dSB!csMn(%%JPQ10VeGz#U@U_LSvb{N`m?ULeyQEICh^q%I_O zN674agCV#BKUc;Y*aiYGcx*u64%ENqGzOG2uIoHQar8*iS&O$P4p(curL5Wq`-5uB z^vpF1j3P<3p+SFfAX$DuB&;o?YK~xT&h*4o_6ew3+SR+MO4I}s(pj0s-&B<2>b}mu zz3=({o8!$#O6r+G9Sx|(?BG;?k~zI?lG>DRd9_R}Wx{2T6?204PJtES%Seec4cx90 zkAuVfsp6v%!YnXf30tW94++WB*)j%4f&CS4=>`d<7^ zmCc9+1V6aXndS#-`VyX>E%P8<8H~mCKOb!U99l_|*#Tm;C zwA*`VV~n{@ecTQEciBH;H5vqtcPEEPiY!R-EFo4`cEEPQg;`3(*;zDX_WqeA=*T^N?y$s|IeSFTINts?c+V%l0o-1=i z`}XbtjstGpNj^wig|a}25F$yv&v`L~7|_#K7nB$A`IWKP4>w+xtsdJIhC!|9m9D5> za=qal&OKx`x+q~YM+Mgzhj;9exgM#hVv0{E>tnVPJ3qc<>3|Ls{UwQvw~zt}Yw(B* zQA>D?!+1C~8h^Q;R~x>q!*)@igXl5l>W9F4VZ`er91A_+V*B)PDX|M+0bTJfg?VAfzwlKcC^ z_ImzD+#7gHkj((75$yARgA9F~YD+TvXkmtysnqOHB%Rx3pi-_z#du%VpJO1!c&&_ z5wA7%r6v-lNZKZdV_I1(D&7Ep`FaccG>#mj6blpyl9XoeVLc!1Cp(q5ZOiu&)IJ6M za+R@y6o6J>2wf?I_P8D17Cib%uMo}?js~k4C!GPFPYE>_XH*kAdpTj zbH7Q82O6g5cb~S-g2GK1&dVpko-LZ67<|>l;>TLlV<3D0j*#%L!7HSMbXidh(mwHa zD7GIY$p}*ybKj61M22I^S|_>;1dYAY6Nk~S9G@Q1E7($$r&-m?c6c-Kf%%JlK~d2- z?`dt8Gyjs^r0I%ZX2RON{!0A?oN5H8ng9TR07*naRI~o6bZ)owuB)s7IgPLL>sv*O z;a84~h&V6sX*=JvSF{h-rjNUcuNW_2!tjzY=kuxz<;JfiWrC|3q$$M!eE?Gj7)7fy z9PjpLZSC{;+RyxW<8cDF@7mSRM%){Emd)FFIq_G5*7SXMyd7X5WigP&C7DtjjI;IM zn@0TIUze=Hg9LrdrdT%dpHdIzyie`vMqyaoj$q5*wQ$g?(#5Uiq`SOu6=7#I* zCls`FQJ_Kn=2nH~rMR6(w0Fi@YLfk4_?Q3q^n#el_G}kV-;5pXYU-I&cU%bsk_2 zla<5bfw%OMXUH)4>Nu8pft72TYW5UmL2_`go-7Hi2HQs*iyGurO#OD~x4`p(wBXvl z-I25wq+i7(ke9rCw4(k_*-U}O+XJOh*qkqE4IwzWqy5R^Q(b-EMJWVL zaq@MZ8?8&yENCFKl5AD48}tdcD`GyMLHo0HHtA6EGwr)LjM#=(oMN&!uZp|QXd>3r zTTeU>GTq{9A0SCB`3lSFkiNKA43kkq3^$ARym9uXaJ<#sG!J5Y_|}8rQ%5haIUDg2 zV}<)C23;V&1X-fQm!Gyu$L&4QisV*&4{AM#oGylx+e%FbGbNf;dY9}1=4KjSluC_# zd_=1H(4uJ_eU6f`I7!&RlCcpsH*+a zNIYfHeq4|GtUbPdyeKwH0# zv03kqkez$mTAPK3=i$RX_qWHNe>O7v9l(qI$9|)4_XP zTRN;-pz8!q*sg80_T%N(odSOqdDWR%`qCi%H!QgiLmFyG=}L^MwZpv$Lruo!ZjBGS zP)m3VL-yKno5P9D*B2gbU}ICXLf4Z&0X&stb-?T0oKyGvJN%Z`eU%&9XQt#w2!J5~ z*3Hdj-^OD-;|cd!v<;A?&?l;n5|V&f0t!PpNf({CJND|WUm@T?*jyYm)?vHh?+Us~oy)g51a)@u zh?VFHaNV$_pWT_vwJ)~3BRPOVOjlY9PsH*u9pct=A;#16ylg^TlqfOx>$5-;Z3Vjhisfl970p(gnd&fN{G%rmmuL0DOqm;0ML>gS}I6QArnbzR+!E_7TnPmU`G1q|P;Bdt<-71>@M%EX5 z47IK>MM1?J>|gY;-gu+cu;yG@!ScS{v*&Uz$yZ5fi?r`dGqqy&l)O1Y;^dZo$x*1D zJ2B9*cSO3~ow#3@K9(OU{D>CAwdWKdrODNuwECzi z4~WN4WX#Of)toZPDu5x|M;6{B&U27H7XtN+iY2SoE(l~=x%h0D)AnT3=KeU)tm;@z zIZ0aly134A-Ky%t*l`MKatNy?9ao!T_jV@l`-l-L!XfdQhb(JMXD+20@`2x)GZL55}wpF*72!eKcRlEP-JP9wN# zhmU!-%KqD0+9%R=&@kJzCA^H+RrDeGTDNk&VT}>~gY^>-_J4ToC-20zYUikVh-ROl zNsm*4GCVox}0hr}N z35#Q{V2Xwm5=Ba5HLMB4flo>CVPaSFjSpH^Qcgj^2PEs`?yoB5B*`VV)d})p8Sw3y zvIY6kBY($@QVy2J&kFmkPRXThsSk~(k~+J#N;k-F#a4@>RxI8@6b<0g`-HYnCI4EJL%ds5dhJyI5hy^p6dJs*hbJiF_~8BGQSMKuWc@~p zQ2b+mX`*o81^hrald#bFb>rTFBBfB9wte+tXV&r0ZGE;BpWxQTM7|=V+n#S59m|lS zPHL0FEB*XQtGe>WpRhF~b}CRcoQP%6MPMBa$6wa!`&e{rT)ToXSHYoTRu;k4SLs2H z^vZU-`>EFt#1^dHHKRtkL*pX$5LTHm6p9~){Ul{n1JN>Ab4%Jy9MvWC%4vh>-v-&t znM&j-Z>_sIW7K?k>-clPwVvB{M*Bj@L`UO@1snZa=E?9(vgY2^$AYfB+?GVzdg970 z2KR*N6We&QJ`lPk!`fYIzSs%BTIVUA7A#F&^5i^Py=12RP-)WLAq?;S5D>^%topp3 zDGTQSMBTj#uN|a~Pp)tu-#`0(*b8f6EgTIdxdm4@Ytr%eJ9D>luLFTpK~Js@U-Hqj zA&!{(?hJP{^(;UZaYg4KR@0JEMynIMqbY@Hstcr8&dVduIMU>+?iRlzyDn88qu5Ql zldfsOBpeA+zt9~Hmae_Qy&7n2)8{sC0_USb-&%?SP$N~>bj0!%-yhu8gV#yf-#SUt zJN`mWy-U70@BJ)v9;}vnzw*4Xw4DCwucg~2M4w60nwD7q0Iz&08SQ|x0?rN8B0=K# zE&twSUbvr$%oEv>lS6Kn^n05mE7kGyM)(h3g|#3vIS=I|YKG2=P zt`!C~SPP2v1q913HJ}H^Ie8I zY(6W$%HK>|zbEGOrOH_83EI)zd>#%_w84^tlGinu3@?Ces9kz}{Kh2ql?{ZF1+uyz z`FJ$!N)bN{7@6L=y5zpK*|im`X_MApp0k~+28Hy}Uh+{`44C5%oYWsDr)hFGj4qj2 zKuT@1Xg(uMhi}2Bz&C|sD(Mg>3vV&I$VDQXYqv`pFBS}8O|V=e#cg9`5JH`1bQSd6 zq~nwrTpzv*DZH1DIF|H++9x)vDKXr2Qv>_;wp*V)&ON-3dY6>GLbRN%rnb@fi-om~ z^Qi2hR|K^X^?@V6)FnQeH2WoLh3EQ%4o897qg_C7;^h{4Fi%Qd|GMb7sEuIY<{PMR zO5rqbz2Gu1O?P-&N9xYslT^L-)w7`+oEMs;HV;{ISCC3uu&yd7Nw6$A0Ll6@@gD??N)WIJ{=9sdV2bWJ3u#IRh>ZLS<>QB^Lt+skNyU*Y zx02*+!5lO->wUje!?o4SiM_9&)C@`);Ld=EH_S?~7+%PZh`#h%=F`kzzi&fB8u+}m zP-Cn4-K2mt$@co245?XyfasXG+qbVBVR_xElz;b5a2)Q>x5Kp&qQfxeSChJE?frjr?T!_h>wH<>OJu3B>WV4Klm2${)^fj$k%g`Q=)90$**r#xWuBrEh}6 z9Iii*5TTMHYRQ>lM5}i_!>7`nyzg`>bw8DSYz)=pbNDK$*|HO4kB+mblkZ<5)`NK) z$7?qlab{(jeAfh9S|QsCelc~IWs{L&2Y`6W4o791RRMsEFLMEKXZ#(U#D~ zU)v8o8PVQBPgx&llgw7~eHF}XSsqAS`C28;CDW&u>;hF?+j7JD@fE-r$k3h_%4z{( zGO)zp?hQ7*N!B?+ec3>T6H!J056zDj ze1C6xVd}9Vdmt_NYSx>`XV2GOa=2_USJ6<0i8tvjAKr$&>P&9Uz}0W$yd6y~`kFwA zCEo^s1u>p$j`e9ACE%SvEEWb(y*SG=l;VLs5U%1^3O=BJLPC6!@}(8@H!JDQhr1Tq zk8@-YMz_6felGgFJlgwse~z!u+9M2-<;$_>akgBNN*J~ssvV(nS+Xh_xP#xxwG3e& zOo0$VhcrsaYpb~|70}x5ozyiMsjN#+NX)*8Zz{h%RV0@jylB|tZda$rf(sz*S>J6} zK)SLrw(woIESxj&V?ZYzQsLl0H;naVBTv_pII^;T4M-k@)t_mvz7 zQG$#NaUj?qpx(!a!>7>tZRPrBxc_GONZYJ#scef;Pw8TNBeV_HPA^DMs@HTu&Z zv*71kJo8wSVnH(?nBg~a-@VPwogHv<`Ucw}p!Ws^DBETqSVyr1`HXVB9-qgNausz+2jC0DXPBYrE&5{KcTU9H0TYRV zrj_i}xZ%0Nt6UESx!O5HwO()6wQs4f$UC%^y>gd%ELHTNqoSLNHG)LmC)@f>j+&|? zwPJE&oB9+jC<*(+3#%!?D{P}rvm2A^R&^N``X%<&p zb)T+uaX4hgW93Fya|_H9I_A^W=0fjA$~|sx_S%ChDTlQYQL}GBT%Y=_p@fz zy1Nr^E9q+rUzOO*)Skedw^#nE&HK~nHoYRgt5J0a{u~r8m>4vTX0JOJf9U`T zqtBARK$t>X!(2}&|CM^ff3gksWc7x9_Y=0y%ky*+Y3(xdIK!o--^p}C6eujeJ@w^Y zQY8N!&cZH0oERdAU`BgtPV+LEfTr^O>wCN*ktFmlIpbD=gk%+gHrD@;FwAa$`a@n{ z1V~CkO)h_&@Rd@Z;uo{A5gqGS4GHNX+`C?}irNsqaQ#Z5i@0x8E4fhnKw)TZ=0aJb ztyZepNs7u~J@Dt0Udf&b$#=>6uWp|fCDHR&0gpZj=OX`Xg@2^`FJMqqB@gr9h-QP*mmmcd$0CJ*xzqx#JBn- zShVV`l7+bR%}kf=jFQx+(gf*OP0gYfCrkdxUQ?Nq^iaG5qz#&3SvzpY(J>kvx#5B`uSo0TT|4Xi_gcIYB;T^HT2viEhf9{tma0pF7}(~k`k#8l zV?NN>p`O%=F}@MEm-dvKh>e!iER=*Yl9hwvfB!cVg|OHIMRI^Ll2OLO;oHry$T8Pb<0~kxlYF6BhRmkIPG5Mp`M^ui(1G{Z_)j8_w-o*yk%!rxhpQ;{@j(w!hny zd+ANcokcU;WMWiviR$DbbRof%`i40kyCNQQezP82vc^`tMM6?XGJ*w+wCOb-zSI-I zr7q2X{*k|V*YGb|a#Pd;z8>ZkgSal(YK0bTeks^}XT|0~vVncTkv)R&`+HX{qw1F@ zn`H{wkQI@fg<)9^>}25J7O(o`MLYq*C86ck!OYthhvGNz_f0)8bTP+pLB_gzY7t2D zzz7T+Zn6x01ZMkl+WW5ntbf)jN14!%?0=mm2A3oWv*1!CVHPAue()X|L<$nZo+{GA zrO4I&k2)$v)sx&WMbW1oQegCSy`@iM*rDUh2eJ>b_{97Ez0^0cd5?O!ddxIK=Tbb7 zFZ%ee;?*Ax3ZniX@IMF5##Ry?$QCGHi1-NiemKQyD=YBx%fc;uG7MPH8y?1D;TNLT z@EF_3-}elguB&rUaJ-+7axn%%Sx2Vlbn0-95mX-MO7;9W8vxLpYKwZs#hn zs&R87B8Orpc764Z;4SXcthB^W*DRI(j#{5B?oMI^JnYdY8|hcxOF{&)aVK|<=w$>- zPwTP2_?+IwwBHiE+8-SbZ|p8(GEPNktYY1S$W5;1GwTm;RMt-~HJQ$OF<~Vp{Z1>l zlRMIkJjaFRO-6Kt#PPp@N?p(-Coo=5|9jCBqCD9M6LV8~p0?zP9xTO%h$kPD3W%(!CZHp@Lc=V{05ck#8VDK*JVE}1n|RydwD@e1X=+VLjG z(a7`rV#oIK?k*(okX1su!?LzB+XF)1ERW#FAcT@ho8U}fb=5ktHbuDgmi~}-rn&2c zO$B}RZT?miq4cPRp;z$Q59awBtgH?#-Wz#;rPNiq2-1lDbzLh&XO{KMQO{?LzO<@9 zSdjfGtruI5)T(U^zP=(>9*}c~e7|&4U68J=vdK-cJ^NJhNu&2ky$Asr?9R z-5qu9Hj@i>)Bv;o4inQ~Z$D4X(?7^H5k@FZz{m08j&UyQldf?iQ3>Xm=a>3o-s=gr zx-MysfyDuisGMcp716W!+l$%=bT~=3PE~s17taz_{Js%iN3Qi1R5pLSh|riM_whr* zA!4Dhm9El1A<9BQSFVzNjs8R=oVrR^>1fY4Em0(iUw+5JmiX+*zAqExUaHiSius{b zEyg#|2%;J}8uNRSNZ7!S3x3#ohgx@QT4EMSco&%=(SKZ#AQoRM`795r6(`YGVfZGR zl8q6RxjcC_^7a~jm0$y33-!^Nw3nzhW%Q$uvRh})*A{A0TfVGXQB&eKeYZx*;VnL{ zUq;7kZPN0>Xh0qiB=g;I*)oyqQ?jzzvvGmb&OTc#-9h$aoe9bNGJW5jJvMDV^gg=k zzt}dr&aH~kHaX#RIi_Sx|cuN zrz~Hbma&?2efW7!3C;KO{LvMA+qiNynCm&y+fupH*`-T+pU^W&VR)rubsxD`K#r!X zplqR#{Q^r3yzOXi!K53?WaDG`!GdS_#5wx*4SEGOX2xMXF|=T*B+MOtMIA})L8vE& zbq3#0bCycM9+CRVEGz{f6oGb0LMt(`-5G_V6A(d^gjqj$b7*o6N z$5lT1DD@PU5G8Y@@)!X_O0g~caN3>Ru{2AInsQmzfr}fZx|rvfH}PU&z%Gscu}~F z6kT8BXfsoL0(Z(hEba`kk$zIy1s$(VF3%9E8$_E%5T&UIg=3fDil_$}D+p(#zR8uK z1&TUDvj|J%?VoLBuk#zXY7O@#QY`#B*(B-3p$?vANMD?gVFGDEG#sHnf>wi7PyetF zd}}yz#rI3XthR*e5J4t=iCnw5-oN=`M%7z}m$B;SYL2WxioY9QsXR^nAYsqsv&C2Y zs(hloFuYhTdUy>`l=>+04Etx&cP2bxiReFoAyS*4iC>Omlyv1_iBoc1W9Hy4eK2MVE zXLPL*-HH%}Q@MIYkLbk`%jSuKGs=_oW|G`gZ;U)gNk@qAUr2HMQTs;$*3a8Or$X_c z_X{v^n_LX7kGr2${Nde#0!Vk51&G; zNa{#5!p*KQvwfRC$DE_s0*ch1(&8Af8V26l0SX!XMyduGgaR^&oPY@ z)X)UffZ`C^Qbx~~-_o-A-fiMN>-5b%ZRrS^B0k#uW$%_&u8(#~yQ(9sV;+WF=1$b) zaw(3YLRgt~JZ(-9ZOxvVHdB~l*D!q?W(F&#$_?)Vg?*&;C@J6 zt-}h})>zToyKe3zzGA%CW7ewQ8FO!QWe0JT>N0JA{zT0%(;)J56p0QavEZJh`3Y=+ zsMY1^hq~E)bG|N?A#6tMjVqpZ=)!KwYRY` zpMI>-Gn`r z&Xb#nsnO1hSAOBxWr#))*YP)EXCM*Dp|H3(S1+tinJa6#%%n#!ouA3C!2IY_X)921 zMaJ8(H;*ZfV_F5P%7_?+JcYhS_9W@7GYZfrA)Z5j4E~~1|3V#JXIH%VvFtv|o{y0qqV_YF<+6faz?#MgV!J(XS^L1!@r;1bsI8s80@(8*A(4YTX zVHUK3OBWb?FL7_xQd`(LoysDtJmo<-r&-tgmUI@4C%>PMhxd1M4HKEJeiCa*52^nC z-t)XrRQRdcju@CX<@DkkhXr~xt#yuuBZ?~1Ufoq$Kwek=;JMfSSJ*m?z@27J*8LK` zqoQc&2HN-gbH}cfmJS`=P}X^5u@*m)ZM^kyzRscL4wH;kw`vj-$rp%cq_)Z}$NUgN z2$jZ;kD7!dt{-b7uRt_MFq@PE3nA!x1A#t3u7PfVofZu=;Y^q$5JCv$BR=Xv%ONqH z2dTzXXU`3p8HcKDdj2&72P~MppCurcu z;j&PBC{Q}Qr+E9Qwj6nb5bJ%k#T?p+NuBcaN>qz1{#C>dXVSZ@FA2NY<7s*xOQ>#p zT11Ukea!mA_eBVuKrgpMd6wyA(uwl#&{^#aRU|@h!)i#ht4^q}#h{`+BdBT{AW)FOnW(TtpoiTxK@8_w@I zeo%Ox7=n!znO%6jZH>yQF_Z`|rU!NAzjT=VHLRn$7K8^>ETiWy55BkP8`C}h&?v=i z(#ajoBKMPuuQcS8L;WTjbWR~}CtgLebSa7=KH2FY-GJ2r_Bg;;B_UEbsu@wOyj^gM zX(xlQ7m}$=AhTPHwe&!qBnBk}S)zWl6AfBh2hkl!*NV5q^3UR{#N*OB@(S$CV1~r7 zXO7?FcxHC6`O7fM=NaFXx3iaxy+WJP^X%jyrIB*iCiCCCV>RZvgkeNma^{NHJ5F(y zS?2DwRnVek_E(SM80v}296hAQ^jzfxvRaThVg%Pa#n|l3izo3iGpRHp@oa}7_K5rL z;(^$?6O;^FSDdMSjF(blS{^#j7jl*fl7jowWN`W(^eS-IoI1+BTwzxfKM$Z4&^F-6 z+z{4AbjE+=@L5dPSG{%BloQaWKHr_VgEtpVLg-(i2T5r4bMvSl96Wz2E^W#0&S8GO z8`A9GHEHgikQcFycGGwJ`(H@jbag5Aq?}BcK%efSs}kJzrkqTeC}qx2lMCmLA!?Bi zVp8NGbRppyO(au@V(b;x8AzX-QNLj%+Ao?eQSG||+2S$W_r211GR(jIE?whAvkGX8 z3@O@@LK3s*>z*N_I~0{)bv49wd)>5oA0b*CWiHw#V$E9VFrqUeQg{0?=B2kYYnIHd zJ!BQoaof@0_4rzH>tUbWUcw14%!tFNM-W0th|1A3{ojX6{|!p+|6cn8&maj$A((zx z)oo=Wn}N`3h{FbRt=*tuBX+G{#Sg$&A5MNXwRhPkse*vvuAmeG$QQs0us2{h{y{Hi z5Hf7wj$j$l8i;(1H&kEJ9|GwENLyS{da~|qlJn}>+QXiJw>h|@E6Pdh;@jA!OHJE0 z9yL|o(KSgUZfGo)1R`wkdZd-SpzHpX!rg>+dni8!JzqM1cgXPbl3rAj%FbX1H2ZqM z!aL2U+BSw$7C{;m)P@ec%j#d$11dX$sn`}QbCi~#hNG_eMz&qxHU6`23d06j@R z)^``!Ffi!9^C+5(oVP@TT%l*Jzizy-e;9=EA>E^EYBZHFqR3rzkiK@Vd`M$#W4o}v zPB3?%_AzXMs8vDxwJn^pRmLrENuD6(3bwugcMdHsU(mhn($_+ng)0S9WopUof=rPw zic>N$H`_iIbc#X2tKg+*5B&rY7aqh{oY8WwU~c^G+MbK`O44Lk&=4-tgo;O42~e>v1RFAQl~Wx>++8kwXt=KWRopBd>@8aZ6R|Y0Sb^Em|IX1 zksGJ+Fx`#L^OeV`==R&pix?*jcwpkdkO1V|#GOJ4$DKBhM>QOnb zyb@oE1+3XyG5zqacU7`mml+_#p5)EFQ`QBG8mA(l5IXfcPO)^MO*AbCv2*Rv>Vg z0G3^)85hY$Dt&a99ybpXK%if>{r#a2|4I$R{_qMDu;A(O`lJO-FWoD#uO$~IS=9W3c#5*fd+o|o^{?}Ig;8Ti>dJ(h7)P?KIQjsR;1$F|ZxKeE@5~<) zvid7Cx@S$WMteoe!^I&&&agaI)hkEPSeN`okb(H27>G!Jhq|>QG`aZ6ANHI^u|rOf z;si?j!1IS^eBgG;aZ*wTA4mubA4NOTw!(XBXN#ck4wFJr6fpw!fg|k9b;UVNCR;}P zp@nI|(L?^UDnKA*QiMvOP();3k|IlzJtTzeOO#OAi^!e`Q3wf@ zRN9M*_NJ!UXMTTN^L~GiJ9X#1ect!|yRSdaV;*PDoO9+Zuk$?D^}L?XMQ_gT*CN!{ zeISpEydAAT_~H2vcL6kMeWH(W612&wYPb?LVH)}>YpcuvN$v`NFaK$WSv*0W6ua!v zff8Vt38G%kTeKeL&+_w}DO#$xUy#7#U$9}lmOV4qPWwSuXu{)D(?vDbmp*h#JAo$z zaKa>l&)};8p8*t(B`ITvz=gIvG>6Tb{U$Kgh^GVcq}8ddA;bZ9LXY2V^#(>45SIE; zi~C18SpDC*z8fQZb{c~CeaKjM!_N1+PF=puSPkETorSObqFT||*d52>v6>o>yzjg_ zP~U~&a>cH7Yf%Q6-az*psLq6h``;3&g1YX5H8+}wKKM&VVwX|SDlIw(;s_v?IA>lC zS#}C*t)r!29DBB>hBn`T_lsNb_g_xB&%hfDi$e!8pT2pO+x;P}HPOPatbWvCNwXZejl<&8d z?RPD3ZZX{jq(WU+0B?Svw2K$$gQ~ppLR%Ha>^GfC$Iy<< zrK7I4Jc2=Xl-4*RF$0#I>?!+#K7Wn$)srma)SJ!9Ql8Bg$}dUE;MD~rXjl>yf#ES0 zb@t$Ut_-vblqkPbOKsj>HZ5@UQ0Ug|%)6y}u{EJ#_4~;ciy~JDTU}%*o5$$eEsyNr zv@t=daUZQMRepo@;JORlnE;iNZ<+I$Yv4GmywaOP+>5s%hkXDczGbVzJ!pEM2-Q={ z5(W!AQ53{=K~)@>Sdv?`7kg>Rdj8U!)_)@v(M$UXo`C_}i}I~6lDH3HPAe}HOa2RvLkW(hcN@clcz$_0=^0#e;Pe1} z-r?dzOY&SiIT{|r)pCX5!q5jhvL_Jb$qNY8;tROt~ zk$xfg%$90ZyEdj&Gzt2b@xTJsFY(~pBxpkVEuWd4*uc*XZ4=0i8J3w!#aq36UFn0) zLLVOxs9|JCUHRlN;d9#SQp!@fxbAhHvCVi+5cI?pj1 z(Ce?cjmNObU@4Y$>x0iz{h?2lQdZy2efF^>bv9|&IaNdF;PB_E%$cwT=(1p zfHqO2icLRdcxAcb4b#WdmvQn_ly=<{oXov;uZg?3PLbgyJ>hP}$u*s(Cl%@66`GLhytnZn=r{kw30!#P*lC&$P4zI$T}@|`kdW(9i}{iMtUdxLlTv= zoHh+@uU9Ne;tvSdA5_WCm}D97yvQ-*iF~@H4=D4lmQD_7saG4MXe!Q%I5q5x+<_&w zjW*2clGG+8(uI%$Up?V>6pf}M#9^>DpkM*w>;B47lBDz*XoGmKz?6>=y4-TG!9bSR zj8q6WrruqU@p(df!uHXP(;g=*s*-=A=F`|A2)kY_N^BG;xDykFerh(}!8Qfj8jPk+ zrtWP`ruYpaqCA9FZJbHfv8Y(W)L=7fx{xl}M`?gJ(nN(X!Y^~b4IGaNL^HqY2)~hI zjcyvdRBU=|#SNnDZ8nfPOlo%6LcYhzw#s$MCm;BKk3GUVA(_uWXOT5B6Q6_qhlYSG z^FtM_ndiJy1`}VYw9_kvdu)!I%@luX7dPgJh8{h0pHGXi?8bCNn%!;kAt>2An}E2% z&Np6NVr?0n|oQ8izPggiYcX2#lw!(tEi05jXGn5V$Ny|5++)es&cFjx+llw z$y}!{aLHz$?5a~ZXixLv70OHdi?3qc8OyXHmPohEXtyOFplw4R8XKG9v5R`H-xIm( zIuIfe@4D%~H}AX@hu$L$ZH^BcNNl9c`<)KI4z>=N&MjllYD;?}3-l406TC^?NChGE zUy|?;_&M?gT0W#uLJo1E#ENG{f35*MB>H1ut3R2lp3n*gpoR;D<-Am-7Ck9a6GEsN zNocLhTaPm-W|7%5D>!Az#iduIPR(3z^JYr4Nt~f4r%>5c^9Zp^S}dOfjG&u>6Q^S)Pn#hFf_%c(d)t zX>0P%xo{dE(ET3NFnqf={9b0dkDLIAR3G9`BHyhztlLDrF@8NNMQBkeW#FVISIk8ct*A$@3KCr1)F z=x9ddy)AW``s3Z6TkSTCQ>L+|4jCbB%3MkFk~&RDCNU@*kmaKF&NX(VL?7# zR7;%ssr}Pwg(Ehj z9k3M^{T)qPi|K4O_KU{NNIxE(Yd1+dI6+*TVeE`W$|UNDg*r_-KJ7~fG>_3IFhf6WUr$W@a-6J3TzISTXp!)T(=G89Oe8(S zbYWcT?ZW733x=Q5E7*E0Xcn(cJiR@!t8>zbW#x1uvjh@P>#J(QAQt&s_~rv1gbK^I zQgvOY4(r4OwaFm#9igIIX#z{?JK-08nb;2}NYO&bC0#&QuA@{$M!z>0HKGqhgiJ6P zlb_BvJz^r~BB`O7AoQcQd*AWP01MO|{(K(mR|)Sw9MGPutR;kfX!hqr6|Y#S`wmWi z*WK=9dzLD9zO#5{w%CpmPO~KjI*P1rleJW{-;D1}*<<%Cgb}yrko@azOVjK02cpM{ zTqz5Vr+kBkK253Et7?+)k+pYWHE)WG`>lNGafHFdl;1q*-~_{?(WG^(7j3)o>(Sb% za6&0+1TzvaH(pEV)dI6idDkvc_#4ikkY2ZT|TIzK()yUN9> zHj~Xjx7|l`3*pJoGlznOF1z?Q`Hm<9twbe1{%ibu&;Ls=i(M+t<|&KmyIL=JRqUj9 zO+VAbXGQPvXY!lx5%f_*cOHmw5a^xRyNBe0d5bmM*5n_#G>^GREsM_(| zLWTO3zgF#&$}4myWyW=#eYI`}jI-AoAcPQVlXT_uc?>Q$5! zrV#SfZ?s19ueQ~^pUg|o86lG-b(OnR^9JFda&q-VOPnW zHm^ngCR3Y+F<1m4ysg^a9(jovd?km)$Q*EX$#zF^yr1@}o0JI0(qjkt{?Ov9@Qyx5 zR17kS=gZJy8DE#$sHyCsG6@F9#U+AG0)!BAB|8#Rlv|E$g_G=3HNWx9_eVX*N;k8w zvv@W6W_@;P8DH*P{8bI?>wzU_mQvVcKe`iUhA$uY%va%uiJx56y|^3#xam8O1<@N+ z0^s%6mKWjO?n=wi0M7WuE)iK$4Y)5IBl$DyxHF+qyh`6tg|haeziT9M P_DP3%u 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

    |g; + + s|

    |

    |g; + s|

    |
    LngFmrWbbhW&xE}P3eY^Tht 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 HFjxZsyE@)e literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/logo-sm-flop.png b/ImageMagick-6.9.12-44/images/logo-sm-flop.png new file mode 100644 index 0000000000000000000000000000000000000000..f80b94beadd538f96f9820c23dd84cca6bae6ff9 GIT binary patch literal 8950 zcmai(Wl$VJxA%ty!s44ia9Jd{EU>t{y9aj&ZUF)WNN|VX?j%T%;GW=aK^F-YAh


    ;Yo_~DP4%y*tIwJKch8AXQ<25SAi)3t09#&8O5@oEJ{MCk=(&DNbU^WJ zUYIM&N&!#*edV>6etCX^?jon}{%qy`Q)CA1MF4;*OI}J`%X{&_-^PQizsBk6d^0^} zzSo>EO6nC<3_$skW;aA_r_QfeYxSm-*~Fm#(zD^nHL=^(dpwcFpukc@QKx#xez4)I z6o0~gT)z3m`2%gIr1w;rqK6l-|ucT;Nt2k z&U(Cx095cWDr=Ia)$G}u$!`7Q-yiXvv=_*@zyMZph=)MC@7@y+*Z9oQvNhuRd|Hp@ z10mF#LD>lMofZ^6CHA|ID+eR=Q>gZ$OOfe%Q8P}M-#r7XH^P4`M4W8Y)!>38xuc9(y^=Q`34&euDP-LS;LB(pTK;p_VjGx&D~1!q;ufbJYp zr?zY}QBK=xnF?CVd*JVNa(f~e=y`Ue9BwNT*#UBzT8B{J*iyJ70-Qg2ud17f0g4yN zJddyg9CB~iBmgP^Fh>l1QKh5!Fd*a|ua|PUXupVXPN;DES6|5D4|E-`mJFlurH`=r zM0P&lw3J2e2pq<(%i%Jyml~>Abia6b@QlyD5j+%o^X9!G^I(x{-KsT7vgkchB(>lH z34?;9AB2i_o8aG!7_jN1r5CO#UtYs;_ghm+)3u0DJ2tiBQrl{9+Cv&OKd;6WZ`&i$ zA%%iBg@M?jTV`l4h>h2SFZ2`~?P}t@`uK1`+37?j(X2(Pn}h)hBxhqZwG1?MIQ%O zKMLZbXlWHaoSB>_4bmov?}Tan~VIDvcdi z_*N6yV__6IlKpJO!;o&k^$y;+(?YFqx>8KVxhFYwFc}HeQfU7 z?eYzhNEPMtU%OAY=!-2(ry3Opu zNt6-;q-mt=(+=zbZ*Lc`4*D!?mC~Dck=LfLhzuI6Q`zbb45<32tgPtkn1hd_bs&Qj zNID?S6|?)9C8ZwxH)jV&_YTwV*WFqOml8izh3wfYjxr`6bzZbA{IJ20Y&cW-r32&v zuT(^rR&s7{15U113fmhDKU|v)ZPO@(ey{j++PRDyJn!F5n_hH^oP_XS+5Yo57sL%T z8Pw|<*W-|xmZ+k!6pCE6T_-=$hUT;0WuCFwI zHy(Zuxc%GwZ_eq!@OSD}Gof|+Z?m?$Yr&}1k54}ZozplrNJ6dH^Q1kj$6Pp(7zUKm zhm>+8P)`|4_s*H2Qb8aH!}Wv_k*1CM(u6B^mjHg-dTIv>nCJbGe8AJ)^9SzL9do}_7_05Hy3Z2~^p@q}fkP!mWA1P%56B5OaT+nZbP&-BsN>ri zA0BSivp`39cybGyfllwJ`f;~#hHG`JKD4&}@HB-IV}+^+Co9n*1YY?4bbXd5Dgbsj zGM&_qNd;f=RW&)m2|zd|tyZ<4VptO4W93{BLy-7J7(K?oVqjEEzu{HAi`kOeLyFyu zvdtdXZ+@jYA!9^%i;HFLHSaJ>`}F~6z1Hk8FZ5TMU`x|(fJ5%&%{Bbg`gmCHCI&~KXAgyx&Pr|WQo5E-h_&o zPs`YO!y0js>3cbmoSfv$=hWd&lS-iNsXST`^5YIo0I3fI+ov@Sn0PvT`E+aX_+Dd{ zTKnV1QH;sME*|#9#Wwj|jo$stlh5Ddj{X&+3k}txZ4ajxE2t6JlKa|16f|l&@P09& z^uet2d#GHEi>!~l#dJ+5o;u0eVe4*? z_@1=`^2>#*k>!McK6QIR51dMc4A}m3d&XQuiCiI`+u&S0!(0BTN^{Rw-r3E zl)2C@D=QcTCtl|dGj9){hKZo75n=Y81d=31B?+{ExM_hR0obM?V1Ek+gK zIiePq$|6rE)kv25)Q2=1cDK161 z!p~V%{G)MEX0wfWBXsS+vBNLy@yvkKsp9ahVX7R*;p#&<@A9mgV24uT_t9$X zDu%~Sa2?!D%)r~(alJFjoei>(<+`s_9ba8Zp=UVYeT^k_T7Oq&Z$Cbd(?=v>OF}oC z-S0OAe=w;MksdJ)us!@G&8u$Xm0~qDsC?A$3(=6%jKj{?}k%+i+xH$Xw3d_~ggQKxmgF{n<)Y zfzo1Wa?+0IZ-m+-G|!zNo=!a0icYmQ(?E@H-|t-g25t2@q-pP{Y_c3TXk=qaLOFz7 zxAai4sSWX0n*EJ*e-qf{NN>vh{*hn!=e8v$sjug?NPaEC;LH|-#&{ntEI3=m2C0ZV zdHvhPpXI0N&T&GH9`*QEB?BvSDZ|&Yf02!k3vSmpV`Dt(IKD#9o6^3#ldepPfCy38 zVNd&@l-rFcg`-fd^z@C3`lLLFh`q?@dE3LaA5HAxSzm8odOMd|`G5u}a(yW!v#G0c z?!Ft|^Lo(cy%sWwZ_jJS0ZfC}k(?U0S9}jEo_0-~GSCzy{~oQZC#svd7d{ndTgiUN z7IGwPfulK(G3|-YZ^-;@diwYm`^}e|5&tWkvRzEn{+cMl#-NCi{RQC?P{A-r7W`eGCx7m{(aW(_Rds=e?c8QhFp@N5=Uw*l)X;Ku z+UbXw(aeYftdHnK83%g{0`~9DF8%Gx>6B8psPy|v&81`jAg{XG<>+wq!PRK4C`Dx@ za3mq=&U8dOJy+rDNU-S?qaK`A?DbA%qkw#B1N7H*aZ=l$4F> zS%k&HXOWPQe!D88zLbzQd;H$IQ>)>Q&~fj6(c&h=#P$M!24}=dw|pSWU)RT@S0)e5 zlYudGe%KOReVlZM%uYelaQeB=IOl^drG+f+cORAyBl2krsuf|RElVO{D-#l5J{x>I znOMK0@D3EPF-@_}F0x_7`iScG)7>!C5sUHb-i!Vkh=kGfmBURXJKT5aIs|}-9Y-|V z+t{S89&M<2-_%63K7otBO}M)$L8i5G{dEj#J`J6nG%k%8dy(TmuOFuRlDt4*OFn=0 zn3fh`MG|nCW_V;0H;Sw``5Fu&ejYzKIfAYj4dp5)2+@*Z;~` zj70MC5;UvL1fy@;5>O*4aK{U)hJuTr!SN-#Kg}kmJz--@pD&a}nVG0*U8%84C z$zf!CY?K*8T7NiL@G#KtbtK$C4+bmo4D7?P(wKxE(p+g` zT*zOex%nZT0q^!C-81YlG=x6eJugkHAWafvXuMvxTj(6_rs&0pd&~FjB3z=+V=11s zrBh#YJva^~w6#xhA2U0*bUy4i8Ol>eOX&3MFK}s=1vC0en3b@>Al6(8FSsuSez9F_ zjXU~WK00#$q?JsdR@Ir=b!7DkjIVJ1RXgg){JaCFCl8lJ;MGV<7h|&VBw?<}(NaWv z8^^Ean!L?goro{iUOD1^BNahL1iMxpb82;T6NI{0ScvqwD5(1_#7=RCVFI)$Q_Ev5 zt4}x1GxhZwY%1f6Ja)o$i(BdO+wA1K0RlqN*Wf$|6AmFXZxS+4$7rDAm9)1*=$rT} zmf)%EbN=&m+B4r8FB_dsH@;)VidrfQNXa3li__^xOPx3aiB}LQv1Ro#1XQzejO#Q?7^2UdFxxhaW zrw{EmmgnIQeVpHcC}jqxC!aeRcc$a=g-o7D>>MFU-vIz<&+x^PH^f;o5MhI))axAE z3gyF#1C?pKf(}m>8|0Lk$cVNrZhus~n20@^TKCMpswve&YL!1Fm;<|SZhV>Q$g za*Ill`3$7w&#>tHKu+w2fwB6|ML zAqdte`>RIEcY8=(MB8BQBZMxOBZb$Rib6n#NfNS=@ThTs-I^@t>na$itgI|jG9}|L zhTqrXOmy!%olu zkFw`(T5Vi|-@e{7Z@`5^kYv;D1|E6CE8TQmFCMteIxc%gTW6ukI&IeOzk^*?wvIo< zK(OiTQY-5oPBe#d+@FG=NoZh!TGyT_t+=|FJ?$%Hk|;vevv&!5QB5mFQ}ZjYw~B7R zTXL2w7Qo6!QU~5C>o4XlhsD-~eeO_QX}rGejY1CM+R05OeebY;5`0CEbM#?tt+`gw zbT9IrcP<$n%qx3~a~ToDq5Wlk&2pP6c!-%vMv|}aINEb>mfU_!K)US5p6&AHANGK= zvwwLT79#6kZVrQ|Z23Q*9dVKcHOW^l%vs|7;!+wcT6oRvDO`iX+$wspt4f%|$g4ce zv`4y#6k-bs67M5yTBa6l=2IP|HC|LR*}n=#ezZS&bP)d;!XGO`OrsL$h@f;>oK3xS z5T4Qz_T2aCxN_7_OzJbj$uO130_nodhKdHiNTLRPA5$UcEQw(yz4EG8&f(lb6TM%n z^Rphm<-S%DIh&nrxQ)fHeeEFaoWYQUCe#q~T6)2ar9cd+38P0%|FN22KZZ`m5Otv; zTj342RTbpi7dhmchs<~hu_6anU+w;>-*(R5oY{t0UrKM&vHrhajz)HAI?it^*9XdU zjZGt7*Zp`u9V^#g_iKInAU@ldlsa@E{bW(>snjOAo>g$mqRJQ|&Lid~`&6)3MNcFW9&*woWDwVq?{+lW{dZTJW3 zjSE6B{_zA1K6dfW!t|u8TW)O-lfp!?(oWXoBnCu*QlIfC}XP%?kPp*-!xi@c;AMoco~MQktEiAxY8l&=wKgxhTQg) zD%yOvM3p^^Q7GQkbb89&pwzqGD^e=>WzbTa)Fqe!UVsi57@)2D%uN3sDQ93$CFksh zrC4EOVL>s>5N-mSsEvMZqyM;DzUPJuT*$Og2AqttS+k&sb$b}7&gCds`+8CI&i3iq z_*-mOMzPf!hDA?Se_CSGUB2%%vMVg;!b`O4hB z`Efu^X47bQxD->K%WLuI&YVJ2*eD(*Qew4`4wc&xxp?1FZPmwfamVGpG>L_rY z`nNJp=IDii>QjlB1g!sT?F<|I-7O5+Pe?mXG~*nPUcFdnkyOP2XJ*E3`YeT-UHgl~ zTF@lqEVp{?Wz0^lO#c3j1%yjce$Zz8KXh0Ak zvw^OyN$$XwIu%1E69L3ph~80}7&nY8oLxrNfaTfZj%!-4eme^+QsDU*%h6vQE-cT^ zGGUlgbC~Wd7KC7yDrHZ3RM-vARtkFUH*M$m(#mUaroT~T^;ysEKKbJZKminpc@0j8 z3yv6WirJ@l4Xx3Mu=G-%TOwh>Ai`@wQJ?LS7*f0lDHZ}|Mn?4IQ)vGbj(paeW8rrH zQRUIHve+sj16|$ivl{^5uIGNfjT;eLZZa(b0atgW#w#xm*wbVgtksq(91(SvQ}CYx zMN$Ab2tW|Ui5aE8{PmUOol|3LQJp0;VT3_}g#gccj1uERyAu%DpQ)>@?b+7~iFrJ^ zjWkl8WPPZ8m4OQtP9cLP7R6 zjL8z5Eo1nXs9aMQzKe|{k8AgGY%5Sb=J!H_ zFf87bh(IFz>js~5kzj%XX;vl-1f?u%3Z;6qdS*oNc=+AhkA>LauW>)ZNg$xGEJAPk?R0W8}55$^}rO!Z?oykj@`QVPdp z#o&vC5ms^?VBjU|aPo|__BI?l{Y6iTRS6M(HuuleDH8LD+gG{gCb*)Tm)>kOYV0V5 zQi1t<&%b?`o!c)iEBM{@Q?}wh3p)47Dr#zWV!%c@g8AUx34?BB7>;;|NV~e&DhP$& z@z@@Lp-rX^Po`&!QLRuBNGTOp=5yeR+-AC{=+iGjL8HLSn+LM~hyo}Eh&TAcu z2`&RCJ)xV{)hA;Ze8jSG7@ME2tKpzfHr8RK&2uZ|!JyTJ-Q?Y!J-EnL_;ucNh%}zG zdXlAlqEwJ*K=KcAM5C<7%KB0~WQZqb!;u09+TtO{pu^5z+DR*@V)X zDKW<_Ya0ZS_=E)bl{p#)b!Vp157)BDC(`D4Ntb@#-J5kD;OjS!ECE-~$X$4Edv)9` zm&@Nmx4G8*?=Gd$q}J2JeR!oE7PWvte4euzi`N@{3W@viR{DuOR6DudVYmlE^JTun zYo-dpi#0Bj{h(B@*g;tQ#>@E8vT#^pNiknWgEq&c6oV8?`;;OEM)z|7PUYQ?AC>E0 zj0qa`*ql9|-@8i0UX+!Wv)4Dd#gWAU>iCT2m}O(8SdPeIa-`{>r2IXtn!9(C$ZKgM z5*czDQw(K&?}n~;7;nD7iU1%feQ;yM<+@;&$S7xk14*P4S0ZYTTb>ttEOVrM#;&nDQ4BxPvma?hF<(97`D)=79Go7y zI#xBx`fug<;WgHuy4O4gYH1@27_xYEn=9+Ll6iILk*Cq6kpVDJM}m9XuA#EmV@UT* zhlEh2Mp31(S>vnfc**Y3hxD2@$tBXtC!vT#d>)r_O`=a$jg57xys>1xUHUP=KxHq6 zWY8MH&$fyL3()<|O>eIcQF(NJ^Q~ZiT7Q{+nbotaT|SFR1QCEc`kKe@|=*9%yH``deWKs?xI#=uoB9RsVS=G>-Y4vtt?N9N{0* zx68QP{GwWQKmb3w)@&FKnwYg*#E9MGOjZmh!-GWi-z{c##}YN*sC@kvPm4D0$}$YY z`fPhk*1c_oVHd~z=kIhhF?NrWF9_P zs$03pDwA@LT^P` z^l$s9xG4<7?H;jOg8{rJXjhIgg$v@(_E#3OUX@a@}3hz33? z#5|*cSr|iFc>ipb$x~H50%tmT;kZKcY*__01e zqfzJk^88XTr1NifvXzB`-=m*;3UO#LgDpZwM}7U_A$vLDvT3Co-v*Rh9o#m3x~ziq zEQk@Ql!8u6A(xv9;%w*xmYm}(KDQUVm*6Qlc=s!TqrI(7MIlxlqzgrZAkR}l?dHDX zhYmYiy*@qg$B+~*F|XoXfGHp=gKVT7xp5aF9g6BuNXZc>DL3Bfsvq)c(Z*oWvB;T+=}N>Te;p-U=)4ckHUu=D`y68>hY66 zQ_#y2;wUqRU|6u_d;%XN`nsQ>9P1Vv0@0ycCi5vhLHFE#hD6NGxU zZQ}cFi))=o1S!;vOyq;Z_@kr%AWBuMNrM(Ej!7l&r@0wFs{Psv7u(?Ahmygbt zUW`R8R^il6mi=F7V0^77+rq2;<&Q=!R-DQqWGb0ft@JAQo2nlTAz;IIj4{yAo0m>U z`-@Fh!;hcurguGR+YdsO-r@cf{zW^u8SgkXU*dq5PT=SY4}01F70dDCKsqu~FbaTy zsN;arWeC@VW;pbJ29KB#Q%K}7Cu z3cW43vbqCr59A9QVx_0n>gr?3`ae$zEOS1Tw3OnqjF1B<6X!LtiYyx?(6H^TebTM* z`*F8&aho$}JR^ffJX*XNU=Dpr)xdxdqeIfiv7xmb0&?1Z0X%rGF6b&O3vW=em_*}1n(30J^ zBXA`L%G?L)VB1h@y_5}~lq(K0SuU1tm{7l9d6ti{b9G)`5rZKS)3LV@Tj^Qb;GQm8 zs3g!0+vtxOwf+(Q$+w}|OO_f1A(mtn@bN3O%RQ^?oxXNGOO&Y+5CqYH;Czp?)KA&= zR>#lA2}2x=oqag-@AxFvv6{N=!AJBrQhzy(87lw{TX}i|8F^AqC_(A%Jb};80}mIL zInslp{eOp17tE2LSV_g?Cc|y?#UYmJZhV%h)4Og0*(zb0DX0nC^9iiVzUeeq25D&} z>2gKu5mG$miw!XlbK=kqe)T_S?wWcj;$Wl7m)|japHRsmpeJNEv$N-n7?X#zo`;3A zqob9R2k;Hb!Ozdn$_eA(fXX|X*;px?+1OdwLp41-E$y74N=lM>m5w3L)SLfMZdPU< zR;-rK6~GCD@w37>SvmN%I5-8k_yjokm|-vh7%UQkC;30Xf43B{_z(3AaB#4~I9NHj zv^aPKIQa!QV5~6iXCTkQ_v-%x9GxxgtbP7>U{a)8@qd8-*Y^Jy(oDXU*E0afORGqI ImoWYGU+OsTZ2$lO literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/logo-sm-fx.png b/ImageMagick-6.9.12-44/images/logo-sm-fx.png new file mode 100644 index 0000000000000000000000000000000000000000..385f874b3e4a0c0742c260e45d4a6acb0698c88c GIT binary patch literal 11656 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 U=h8&~^x@zXWz}Trq|C$q2fUuAqW}N^ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/logo-sm.png b/ImageMagick-6.9.12-44/images/logo-sm.png new file mode 100644 index 0000000000000000000000000000000000000000..cbdbc4ae960d9e3415734341096ff9bc70487701 GIT binary patch literal 9009 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/logo.jpg b/ImageMagick-6.9.12-44/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7bd6d0d19d8e69f0930e4ef78e7cc94f9c8ed48d GIT binary patch literal 18749 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
    *kA?xPX{IsEooSJ0o?0j&p<8kMCcL!ec4q3Q0D7 zkDqbkaK%!G_wfC&Dv$T+}>E0NKALEkGxQDo!U+Z{Ru{ZC8n9XkA#w4Ku>(OS5|f6nG*G$t)JjGse6$anUhkX2STW#XyLxuHbC)&I`#;)mvO=sn;tr^%q%bjn zW3swmh>j86u)BdU)NX3fr45Oh_Jk(g^{_u5*(IfAQq$!!E^qPrvLY)Rz1vIlnJ)qv zxJhsq(@U`r3&v33vr*BjH@ssTDDdLpl(f9Z9{8f1>khb(%>qRlek%RUE1aR29=<>s?C3K`lazv}-L&UuKo_?ah-xUKnn(3qkT{MN(1@+F z9?B$6qoG1oDhE>3(r7Dwy3)3wueSE5mfI~3*1s)M*3;M-o1~?hQNED-<^jY;>$!)- z3xP^Y47Na`G=WP;AoA^##&89n06Zh+fp`q_F%Ofh&_esLfpI>850S19Bk>`&|5T_&#Mw31bH8OY z^riw!FPpuJIvHzq;t+F>=YJcVY7J$XL)QQQufU`5wdINAJ|dBKc2*(_h`xnXB)f|4 zDlRE%|1DReWQ`$4trIAg?2;+0sFgjL+l27>XcToLNDCd|US8 zznbvNPUf$tNX+T0Ook7^pazD8pfZS5a8&7+^z8d&PkDYu2$1^qfOKQrklqC3+W#00 zEnl5h$K1W|ty7Lg9sdN>c$x-{~>gFaJi1;ZS286S{-?63El<-R`u2CiN>9?4dhm zo2VeS0#f27WJH8emHz8&rTFZt!KP^}E4*WEUSW0JdAae%2NyKdP&B{9 z<*q&nzZpi(7vBLQkpGXWuMCTF4Z9s0h8$oB>7g0YpmS&h1%;uJQb4-9WayAmQA8;L zkuCx0RzW~OkdzXTZY0k$?(e(KIX}Gi-d^s#dEfVW?pXJ_*YfUyikAq(e>hP0hO_&h ziLvpAFvoabnDcVIq2l0BT@rDceIWT!g5^^?PY7VC|E0iYTra&&YO-r=OWnsK(iO^s zNp0+B3c6q&3sR)~=WYT8fdZ)DWqg%Uz)y+*@~dA;=covd!`H@3|H69m7Qwk3m+i?= z`tKHv+O$PXRs{lU022GCbb*HpJdzquRKysp-p%|ykc$K&^os4Pdoa^Mtf^G&$iwMM zvtL*X)0H`wZs2ZF3pXZavWs1{0!uMBd=R8u?jK{eO>#1OqwVhA1n~(`rTu@C6gij| z4O_?Ak3(_ROt22|rmLUMiN*&@v63OK5Du<6><3$rR^y6!`phlz8YIyBZ@Ev`g@#bm zcU((G+eiL9Ky3#6iLf2_g+x!hF!iS%7JI3xK@S}qR&6E@(T;Ae9(eZ9j|LadV(26a)wR_e9@{8NL-{OYL913LLw znOV9qtoP%pv_e#*Tgo0u^F+`b&bj@%3-CkuCjOlhtCCS&0XNQ=5wb)!#dtp_?&*r) z@+}Q}f6;{t{jUKrF-HpOvHu43#CTlGY})Gfx>ul39b<<#fII@RHEVtZlkt-pJseA9 zeqXL08wY(qP|rID0Ktb8`AAQiNN^%)Ps~?UeYXub>F}*q;`~QQ#X?O+2fkfk^CC=$|U_{uE^E&=xcsjgq&DJ~uat4n~-Su6CP<~^3aD_9Z z7&}nk8C7VB0l~o|+r>S*!aE^`g{LElHsypW@R+2lj)(}fjqBM{wJ_h81#4bL2<2%y z;IqcxUk2CGmel~n7ry$P-ewn93kBP01Q`93{`W+WpR;eCB&02mG2@K_I1Sn;VjF|qDAH$_X z=m@?Fq!$m(QN6SKd+#?g#^R{GH^2`aD>T1V=2&so zd&BMbScByLAG3|iT{57P%8bGi8knBh8D^3teN>Xra2Dq%i!)d z($*`(dCy@ErqMG2FQ+~>qU#euyRU~!+F6Sm(FBOgF0|E09ERr=rJI@rf zG6iCj-<_k>WppwoZ%#tvksa>9))Xly3=goEo~h}o0eoeuI9v`|;%-g?x;P@R_LdT< zD+|HT_H$e7D983W3vtq&1j#E5U_|R#HW+cAE`E?y$d(}&FVT%-YM2o0P~+M&Ed`7z z#t9ay5B=W3n;^{AtY^wgp}~q5;?ytQ^ZWp=zR6#59*iW&e1%rT$MXI*{2?cO2Ql^5 zkhZX-!Us(;A}*nwwee6e*E-oU7&jCD?smX=Um)N z(PX#a@TBv9>!aNe%^PMhI5=SoniAPylY#CQ!B+DH-;bG)^vFK;@;3tASC>aY%<;Nfu~wJ!TcilD4~m@M{}LQn);LDG09URNbWyOQZOl}#13=?g z(~1y+Rmr)e{1wTe5vPFwR^DdEYHo0YIa*!Vzc)h&l>0dThOxC(wL_7%zSO0to+!aK zVmB|*9VMvw9mP=Lp)Z+W5~{GnEFwb>zSMO&Ax!=iOJ_Y zfQq0o#ETW-oND#7(sc&%oT7YIs`j(^0Jb?Q{^PK?hQ{`VOJdlyHy4w#^RlOzEm0kD zN<)oygz?E%SWUfF=fB)7`>P^A;Ck*RK<#1vuHFgB5fLf7yVeR$E4P8^_p2T&Q?ayy z&RP^ii|7?u3cmKmQ3$eT6CYz! z`rG9Tqq_|eM-a&+Np=WRa0OV%y|F~-nf{hc&Zs+B|LOOeP5szzFWuBISr7oC{EpQFNU}zDD{1}hYn1J$M3x8jHuY4x%uFj1iGsJ$B zdYxzS&XM?34$2Vhjtqa5QQ}QvsVeOc3@sfn-m_P1-?C(i{~mH<@)bY*9e7!dH*Zg6 zK1_ZL{gpQUBDaR`PXRBe85mi)YU+alql?kI+~{;Tx4j>Y!-+~lkb)z|^-;{M@Ten_ zNQbY4{cnQ7`q0RFw_~9eg43CR9L&O~=4w0iWMgWDdLU(8s< z(qTKHs2kXc&~(8}cir`3H~77n3bHm_h)}0(pc7O3nKd$u09z2?q$|zhuW5*02!sTa zaNGgg52M>N!{f8h*2JOxdjH2ou z=%|$3j_giB$TC-UDwjLkNH5f*F)!waYH=HP734~9#d(wxlL%S5ml8KeKOwa{F0i?U zl}%y%@!xTBc`><0WlSweoNeA$l&l5ON!}v*tC7hNa)-8FS!*wbSp~J1)4$f}gYAsFl18{XUVb0q<+_saUb9upQ~jT0j!yvR zH}S0VxncFLAhna+y-fc8T=CTN& zP*9Fs8&v;@S-@G?6mniY^+W|bPXF(V`n;HQ`238L3(^XC1q2&MITWVZtA3xSbYHk& z1@j}ScH-uSDYKh1RmodBuqABP-+{{U(k(dgC&TlBIFjF**afBCNBA9?qn)XQTy9cR z|B(eBJ?sYDb>;ug>D%BQApVU7&+lQUJJobxC{S4;d=F^W%dU^W{(BoQl&pR-)BSiT?>j{T8m0;=hl2HK`}3Lc@?P^}k?tIuMePp!G{ts- z0OEMQl7$$1F*T2I=t$G=_odFp;7d(@&wEi+__YBgeUDgX9Lm1Onv#+1ds#oe`D{m7 z8cKuetB3{+n3%8TQeKv;9WlZFJ5o~^ugapE(qL9^BB!7h<)|u?Z%QDu1?Zh%@G8E4 zmRGL!8rgA03yEtR)g-95x-+UXU^1J{>|R2o>ue^<+Zm4uZg*-l%*g4(5|}oWt1ZQU-iYTI;1wB z89Kc_iF*+_cdzn)2POv?41CYwX>vA#s{q6lcKm?z)@YyQrYT44h^8+ld;w~`*>z?_ zuz*{t{JK@{fqYT&E)#h&BA!sgU9-;Nv%w0bVQ5?ahze1w3np2R=5k>2D$}AZPyIDg z@PFclY3E*Ik-U$6pzFi8fqwH{%~&?4$D?3#I^&xFXL%9`Xm?cCYg%#*4Ki^?KMh-e zRUz$@UvhvZA?R|=2smPyBfs~x%6qb0mTaMAt3B09{BWc(H0~4fdVu|`AJ3si5Qt*H8 z6psDZg+ESmwnj+wvn^$Zx4qbmhF<6fz70)={plG`eilE8Kr zXtV%6xm11&Z%~_$fOOw@^u}e*zSf?w_ldII5}`!N^)(2#?3nZG8ru zO8jnkmv-sy3v{<_%#8F2he%D*fpiUt9% zx`HGBH|1VBoqxa1^k)Hzz=iHsePBTOW|@($_dEas-|Ycaco;D2d=xClUyRL49tGRF zq>KX_o_Wo{b`NZ)An3#guy&GwURz0}oL^WDxjK^}-LZRc!gX}{xT^U>gie2Sg=c;Y zObXwou+sYFV2Y!vUsiwV`nM^q4~~&BJ|!_LCOMRCSKq8Y8s-A7cIos75)MxCIHU%# z%!h@?&m+lN0;9#rF4aO0MN4BJKoS8}{g0*prRNAmsmAjR85WG|Teu`uL-BhY15 zF8KuRji}1yVYKINZ0jXg$j->i7?=Wpl-m{`8)gx(dh+`>O@pfD-25AKu8@MM96qS}xe7;BIIOZmj05QR@ zfV5qQlnUSc$-&SKhw^h1>jkpp1AYw&vQ8j!flxb(;0GLru$eHHNB zZGx5Naq>y53ftMV|J~qR=O(c8T+)En)yL9@mwq(l&bt_`s|8}mxAK0JV5O$Ip3xHE z=2-qcshGym<*7-~LfNy4%g%s7biv6hJ{#Y0LO1b zTIsd;l=EKAjoU&ji+iW_Z*`fUk&nk=1+wePB65MNBnQ{=H@NxQG5vo@i56{}45C9N zam25ouQa=nw8(mgnDITRhr+t(@f{4btHy>WB~#Z zU~^Vg9BkbU9}uYo&~_&_!6r6W#GvWlm_e$1&jiiXf@)LL31AiHOHJT>V1KRQcU$y19m%SbY zYpL7J13rNYQOY9fT|Ee%-^voe$9E!DFkxP=GgX^rfA+m&q=CE@jru}YZHG^=89P@o z)vz^`@2CtOejEUfqSeRo+{hJxF{F@n!#92za#kvbQ8rE7j`}`_CoNjy738^m;ZO`rnf}&c_j_CUv^YU zVIMc!4{AJ3=CQr0Zj2v|HH5}abJopo0Wxu;*r=K!jPr4YXTXq-JG%zEJwv{u>h+vR zXVU;?q6F;*v<4XZ!AW!bT7S>;(8q&qTaDg0r-fPY4L^f#_}U0QK2)5MA4j3Ts#wdB zY~T6IXHS6|?{ck&ZDcP|byCC#(fYRTp=6bdRIqkn)xUx6M zA3Rcq+OgQI3>0)D;f%m2_M1PjvJN`mx`rLs*~IAN6Im0GA#(ZljtKD={8CU6@1p>P3~ zqVaGRX}8JMJ8#7AAdV^KZL6M~v9gDWa}dxyi%Gn)hkctCBIek-N^{Rs*973>Kdh_|7UOBd~NPz3jw~R$|oJjJ;fAVW*pOY z%#d>zjKo}Ep#hCA6z}mT%<84c8vr@2n50mwKtUR?_9#_63Ff1~M`=bos;Z^CNMSRK0fstD{UaD%5)4P?Gd_sE}cAwH7GK-V>m;zPX+NkBP z{^C5>8i15qe`eaxLaop>L5eQQ|L&&OTckMeIx-&xI0zu#!~!EukjhEu5ER%QCak&a z4}}2E#&7h-Jti#tOQIjbl)AtG0UsLB-RBdUx!CKo!u5q?QA9_K6@4bm(4veGpIJp48>0(C1T^?=m13=fZBu2iDYbiFWObK@n=LpiC1>IH$m0pI8QZ9=izRM?hfou6++*COJ z1}E&aH^{tZF=d3MjZA&S)igtjpI>w(lpFdUkE!HcWEWv8e$7C(p%2A@^SMkjK!H^k zYsDpTI|vv?^9f(GEBi+5lch@eaU~OI$zxp%r02_@pq%;tM znL+j#Ph|(HUfxez{nWZuw)<~gs};9uP}L(1#Cc%r!{xjLv~a-UX*W=)w*ot;=%7I2nJ{8e2Sr0^%K5^+5?d0v1&_ zvUm(iC6XdBT{djm65Yq(5gvpTKpGJp-{1g80DZ#_M514$r-p>UZ!zd3w&)s!TyS}3 z)6VteyUK}{9Cm#zmS<|!VC;EVfp^7gsY4mvM9}46g;FbDoVkMy$Jx~&O3+{|0$|>q zfc8I0sykRd0vF9ZMr!2cL9Eu6I`*xco)Q^=U6!~1B9Om5 zgEM-Uu3|eU>}jw*7&m$XyS+*E`<=lqF<2X`f9$x5%fz8dS38XYNz!uZw+qWs(^$!` zzBU2*i{;zFdjaZv)LnR>RX_Lb-Qzos1KHMecLc2+4e*1MB0##${4v?VLcb z)u?P#qags}WL&N}I@`d%W_;xGDm~eF)z{r8M9JH1Z{d6}rRj3cYQPygcD%Ln37FCW zXIh^hDKQAxdt$*^O>2zBItft!8?EgScw6BhQ`Uz^@_d_)V;lqCucU^ghmC+Z6{E`~1EqKoNi``7U%D;`SNL zOqz=uJAq{VOE-+0rjcIzfMo6jJ+MOhD*y~tqNxIas`01-L58$u_xTq-`UsOo%(9UC zQ+jaoExSwK%^zdIQh=pZWlbKkEvatb#?DcH zp}B00hVa{51K3Vkrl6L<>%|+8BMyuIpusu5*6QhUZgGnB{iMLa|07Ld?z-*x-K?^| z)%p`ed#V_faKD2X&&bcs3$EzPtBtHcOWNh;| z94QewlM&_LU-eC)YofodsjlS^2o~C#J`g_C_)t!5y8LXGxYr{|u7>I^KdVc5N<86R zjugemxTyo=8TFr=Li;x!`S|)gO3iBKp1b?0s(QbFU-m4MS7xw3XyxoHWohB-9PI{w zA1Q5>Hvv|WZ+YMHRd^)q54vhtA3O64njx(tS;D*DQe?;*uPw7;xf9G;^kk9`^I;C0 z(B#mOPPf24hG{O#o~1{$^tIQi2s301G1B*n-bP9*PI#2+TK_VEp$U)7kO-mP&$YOq zqAI>0nc~>pO?f0e6Z>lDpb-2g!OM@+&nON0wGFCwh-!1r{gj2pCJUS+ev(G2JH+mU z17Cuw$99PyHx@fX{>-r6{qWnR(uaMEZu0)ZndRc|qjb%+iHoUN^aAvHO^=h1m&A?G z;{X|mqDGvs9B~JjVb8r{G8ywwyRqyyUoR}9>aMgJ1jbkYxHQ1GA}|&O{0K0z?{P^Bm>)J;dmHg8f~L@E20x> zdV=>nRXj>p$sN8#;i-k1A=A0MOR1=(n|SBfT|66^)+P5qVqlI#MzO*~PJi2edQuYW zU?6*Q`1@lgCawpCw8d??7MjkL#2nyWt^`4b{8`Xonyxab%Ui-% z`M67@r0=tjaV*khMVQ%R^ki=1SV6C>!LY5Z8CRG9JdogJKVL8l_Z_Lqmeq5@m~2eYX2Yz9eFd=)zB%1G+Z7adIr3nGs779WMZm_9U; zpN)*?y3bIsb17=jmBCXR>1(Q92s68#Gk5cTy~X?&b;8n0cG&`BVxtm0jF{o<8J5Y8kW($RmJt`hb zinV~$LT1AP?tefd$6WzcDWTAlfaDRqm&BxR>uf;*Ci#gu5_43Z+x+%wjk)Q(m-6sX zaD^H9kWa$&y>Il5h0nZD(X*uEl90|i#{O+(g}px^gXcFPehN#~uZA{nj>D;w(j1H* zd!6MGDn{IW&QufJ04pZFuX2t{da=9WWb@G=lYBZ7oZ7y&wWp9dVaB{dn^BA^nM-PA z_6AvmB`U)+l1H1E+L!_OwiNswa?L}s=`C667PchJ8h0c)s_M>M(v<)ZBAC8#NJgJn zM{%Csgc!DEjcrkhWB1RKIT-Gd^%b9hAGE?tHScEu_;iE90*v?Bgd)}cvR}qE=!ztl z>xBtG*6~FoX;KABBC08FHt2@#YYh)F*&T~qiv_osczU8riNkj;nbZExK_Q-bhOZq3 z7;L!5W_z)pj+<9|h{-FEZ-2yhdHy_NA#O<_=blKty7ppf+U9jyvGteN`B`qaUcYAg zw)NMjYbM;0tR*_cJ?-vuLytL%iP~JcKg|2iSAodgIPhDKZ9X3u`JOMq1qD`LhSvuyn03dHz(Y5o$8JJ7vP71=@d@4ij-%X6O@4Vo64T;HFzUr|MjI%>0p#~p z0;@g>3}4iPKjk!YQ&`(b?Cb|w^#HViD0<1yc}HYBq*=)RsI(r^{SF-V)8$X{EH{G% zyaHvH6YTc}K7i=c0Iucgk>4!t5R}wcQpUQ(V2*i&Z5S>19zcd+&rZs4iZdRA!81hS z%+~nC_V1&&f+7c>_e|aj8cul=?0)ummt`}vH9m#A;2WRLzVo^2#V73jV;p*2jt|U1 z8Ce^)86qr|%!@o#V139#l?!0QW-eLO8v!rsL*HY9jCDDJc9WFt|=^nz~5V*V~su5Yk@^X%AGn=Q;DaY7thFJ&l_tYbROk+ zE>G=BT^^hb+C0u_)VtaBM^hNQipMLu1-+j(WrT4mv~L@9%7JwT44FNvF3urNzFFa) z{0fABj$`C49id=K3n*SrII%GW9V=gyFcm7+f_ZpFF-L?>Ni>Hg}K#8GSxuOfW>CD|Fec}}7!E*N_CBIIFBmKVD2XQRXGcQ&f2%xs#}^J&YE zS6!Sg*Axvcvxe@4@tK%VVHynu`zTAxUc(aqHu*<_i?Vj)XM)p2aH!esp&~_Dv2Fr8 z%}itey+iWuSF6=q!Er7vCu<4S7y?(%yI73k;uU>aByd;IqoD(~)m^p^y=->Rr3pK5 zTRkJeaj-@tiJtctI7TkiII1o+asn}c?-2~rZjv!nVN3MrB6=dsY;A`~)6leFK;WnO zi=CK}=81k!6for#v$G{8?Cw&aZ%21?U;Ml*lc{!o_Vu&RJczT@&ITKi0rTTu<+l00 zGCmRY$dMN^$|>^M$RsFzMxrSxZ(LUCQJx{~Ao(UJ7XqocQshl~+w{bSw;cG)+%xp!8KB!Of3QjnkVP(BFe!y2r&^*aBXc zSxd5H%Djl`&$8)J3{e1gEDA*JwrvYn%2U}M7rJNKoiEaRWlbsQcy5ZufpinIDYYOj z`8vu2B%3}4xvX{_>z13X6vm7*B-`rhhS&c5*>_v&VtDQPx$FI@Eci=X{Q7ZrebKG? z3rDC&8L@Z1t^z4skXSh-vMgxTPHj!4qYjVRy)Lws|jp7v28GJhhzGR-DlRjUIl@ z_=S<={ui8dWU=FyN9{~z7_L{|q759U8~gNl5;yGzzmR!Uf>$z(Pj9$eh?iB+TYU*d z3MM^`oOV`DH9xi4xWvl}-Y*07MoxnvA9Zrta>s&<+WfLY(CS=G*XAzm9!VOcuNBw~Kfq>I)_5;(!GSHmM@qKsa zJpt?$?L3!WyJGTtvjV->y(hho?!=ZwHTUen|F3WFV=KmNZZ0&w?{rI+KQD>Bb5HVydr2}=&jwm1;j-{i$aU9?G zkT%UHqHe6#dCdgoAZ1Yoe*&;Rs#Gmv?&onb)~rDs2%U}FROc9Tmy%Pr^Pxn%FEp)( ze@T_l-R^ExMN2f^l}dX1aW6!v@!t5M@r-y+Y}q;7yEk|B+qmeruwnEfGuC}`2E!nK&-JII z-m__ZaChv~*0}4i>B%^q)7yQpMXedP_*ghB_|704lsPORS7x`Mds&|f%)uMu5qj5a zHSjDq4>^$17$0v!BT!Mlk6gBY%!uRtC~wsa2+BlStaeibY@xh49`|by&izDG+0l^1_^6!HBY)_UydG`80PWT|m|w-{JxS&w=1|foYrF2X zZ7?5s`o|#1@2dH&lu((*WT1#_FEH9(mQCf*i2EGGf7(UM9g~xR8U*hS4{Rs=KzFN& zciS<2azC0@4_^*3f*a}?!SX)Go{svGaEe)aSOQyEs#E8Ctz|i5Zf|r=o@UNEo&t`&(QlqC8yM;OnW*)}t-9X0JCVxi?tH8t%nIS=8;b^E&fbMi$&@f&P({U#gUIpbhuwcFsiLS69+r&4e@6(T3b7*KIymy_Jj+=;3uOs~5p(3f-Pep_&nZz( z$ih4De_N=1M;+Lo%s-fPH3+I3{@znU_orK#8i<1tGZ)e-zR#W2m?F#8Dv}T*=J z+>#SvMmyEANR1A*(VljR`PMS#Gdl`}EQ51)BTT2MU8;U~n&w)K)Ps{mSIzL;Sb=Q0 z5?oEVQNoqqwSqeuy_Gj`=%0Y9OWEpM+fk?1$KL(ApRQ_rA6mo+K{NF7`kedvK7Ic^ znzfgUY0D-_ap^2yEe2A$|2Rw?GYWx|#Fb%0g4}ZrU;vN?!!KH^|FDdx;Mw74bZ)st zAK2bsWWLZ34*gqe4KNOCrJrl{wT$VLT>6TzKjKz=YQ%JpFr;h=W=PsaFLqHX<<)f( z2Sc$xdCwdPyw(&EKQ{40#-TZ$rODc6NPO%{DVOo@bTXxdA!GP929E+4H166jU$au( z=lVI)h{Jkik;d}DT4a>8)gmc9<6Z|6jPq2C0NKwNblpCXKX8iZU$4p&R(P|Q39*Ot7Yi>N9c5}xE1!{-3 zEev!g`cE}M%R<%-^ZBysn6P2u{x$K1SYACT0o!`d#M5B>90CqK|BGU@jwn32i3tHVdrIc_lrV4pwZ~ne*Ek+JiF6<>;IF*Z{V7^m* zIL3dnc9m5Em*Hv z>$<3^q37_38ZPV`ej)D*BX!+JII7%z>!SjjJjR8IJegEz zQf2PBfjg*Jz{^U$hwh&8HS72eucNIc4X!d9fKe~T#-4UP3Qov;|K!hvuH*No9!1vi z9ut0XUdg(62DW?8b46-P zi|vDgslR1WP6iD9-wNKCnf=Aw+aOA1bYd&D<$LJw+K0XFcjd628LEmqC=0K4F&z|mF1}b<;bN9X0_iKyBvi0+2$5)=-$Bl4x%X!z@ zaJ3NJX`c<;vSR&@C%zCEYC0ZB>S&MZ-#oL{4;Bj38on!IU3!-i1vgou2%i~(Sl$Q| z$dRrC`paQci~N{aBSGG&$i-;ag!TI?;A~Euo~z29O%upS$R!p%IZgM+JKo7=EL4)% zQ)V$pXB}%seaEL8A`v`d+w91i3%UDXhUcx|NXy8}i+ebk^iyd%)6+j@Bm5soI`;}i zyYNPYGOr+vEawkDdrZ?{_9ve-|2ycPrN*njTGFBai=PhKZ>O1uVL4^;lp?J@oIaab zZ8*=l&NjLa1CyT(vs8;eKOeDkTRO4N1e9L{X)l25RhUxDk+eFBIJd{+O1#)Ys`i5W z`L>`zrD1NlhO79TsAGTKafr~vz89gA6x-qf8{ep$>(TY2>FlYuJxe7;xy+G%Nnq)H z(lhu{l3VlyCR{^i^}$+RkA5&#bE6Ah3;C_WNvErCrAiRC%y7+x&f*|e@S3DF$(jQC zZg%m2mA z!D+md0yMPbdS<4xtS3L?Kvn{=0E;Suz?%D>o95Heowj+J-Aq?uKADK_{kcuUxY)*1 z*&yGqf}>;mHC)5s{3d{MJl6Q4db^c~C9BhV+r+9O_*d%%fCf;{57#fs;KrN*x`$aK ze5|3j`V(=X?6f#W_2|{FzGlyNmf3#N7-2r4>v6Z>!DVn^#i9l1+j5%ix2G>hK6&3M z&VRQo1$M_7Qy88sb@G0-*j%d;kXZ&Z&YH7PlW7OX?RJ3r_+a2;0L6knhP|smWmW|c zRA@p}Ap$v*OO%g1atdxv^l_;4g&Et`U566I7VRjkg@C#rpp)Mei;eKILE%)w@I~h1 z@#;>h($1~oL(+rWtRm@)k*{9_`rE%&#?8n}TqIP(!nL|;G;=Zm6!6Ou3ONX3 z3@Hn48NAV%Ho`gK3#Nwl=q0tqHzRvk(}r(p1vNVREht(0w6?nkTZdzqdX4ipsi@g8 z0&V2M?N<%?NTk%J5l+#u)#H;F%ETOc{iKXfmQ-n&Ca9TDW;lFWXP@iOS2^ehoH)a_fLcc;bn8r>ZxT1u%t zh2DUHM0Di4Zw6rkaAh;N_H4PI{Oq=e=a>2A)tbR=2LBVf5KjwSTEn@oB6YfEZFp~4 z;3mtsm&-DjOxA&Am1l=_nApsZ@}W2&q*vYdO5$PWP_|-v=*x0s15 zY0=o12i@ybt-if26ZPc0ETgN4y_Gc6uo+gld3kVk_LahIh#LocbblBYN?UBdXSYjr z(~D5#N>R3Nq);j9%}>z$H2-ku1qGK^a7^Dqipb4OC{jfMXxAJYuQmHUTJyJkx|+yv z7iXBaVrcd(k}f=Sn74i>cr+>L2hE*rbO8f5CfR-^icHA^)OP|!^nFd}hZn-IyYe%y zX@eg$<_>=&uoJO2kTo(|11^&w#azpYbBlvGp~$ARsK~8%WW1=T9WAb#HUMwdr`QyJ z?8;-kUf>SWh)Jk~2!6%L=I(}PpzJ&4hlNM1EEdJV$Ii{_(JKWf<0Osqi~=XH)LhSU zMKFY+7QI|_$Ov^D8W-^ml#M*E_Vt?G9P1jW6Bhs5Js{4^#k>gm{Qp~A<@dVZ;soSB zTfWq|4(N@QXvVZGg=llxR*KfydZvdrm{{JI*B8M_zkGAs;l>$kk%oi!=vDJAN!VPP z3Ie8TmYXIx_=OuW?;HuJ+)6XtZRlIh8{(}d$xFwjD`SX9Tre*vuQn$2*yg`Jgk2U0 zfq!GwWWL_-y;fjF7@!E;+*gib|2ypT>hz&Olb5OusxUG~O1vMq)-qFn5n< zRK>(r-1;fqT4bzKi{8v?7?lB!>St0v%ktM&0e-k}lEbvSL_>hLX2>4~a7DWns)mNk z>?2p<(VP75wQEB-1aHNN%NS-M)7e*`-S2*t8C$)7C~#uOmez0#G#;()Ps?t<83B1H zGXK?mdt7Hw7h#e)!lxELgTarh6%`2*a@bRs=Iml|NQk|(0P#u+dFz)i%5h}Wyo??t zXwXsVOY>nbu!0E+nb=XEV0)?vg=G?8DDUaPCxP4t??iKa8#{pm z*|rP3DGJ+t56B^SLwVrYSQ5?*Jd2Blf@@HoRT^V|U(?gQS31~&YsEx#FAOH4?x-a* ztSDU`_BuTM&7mclBq<*7eT1p{>%f}qMi#cPSSu{p`mshK!_;I)}6AfN# zDm8uuvKgL)kCXy=XR^5fYz519dZLRxclzrqM|Qo~bx$$yOK-}kMnf>5!Iv^v#iv*N z<%!*!(%3_}t3q?C1?s#x&%g=K2<{DZuN9D=ns7eu*wd2NdqFEHmZRk-O^TyWa!45C zjB_t_mpU53p;tZNv zzWMj`1$lW$p+CS~BdZ;Yin7mL9?lm$*KRsD5o@XUU@b@&=}F(~HfnzOd`*0WSHe?~ zhlIu4!Kfu?G-cNl6e5Q@Mt>-~hup!;YDE<6SozkidX~nha23WUA97qETT5>}Ia9%S zvBxP@!_0(GHwpz`|D^Lu6&d0!A@(U%v}D8?hw_8LsKtbKC>V5f^_YRvC0A28eD7y* zy;ij;Pi*0jaA|SguPgQk|}{VDcL zV$0h8Pb*$E61I*IK`>t$h`2fMT(9^=$828bc)^Zu@edIO(65_lC5L%N&Nd^A%y5R9 z5kK}_%I`j>=NYLytuwvRk6r=O0O~C%?4=_M-)}R^2X!z=iC;ZHzUwG!rpa~LPB}}m zx~Rgd8wtBvYioV@-1ubL@arxBS|X+?LG2b+@Vt*w(ALh&Qh!)PZvCi zv24e@bR?kdc4JzMOH`!_A7u6_g@g^B>jWB&>yMK#gs>jWYS_;!gi267v3+;E(Bt^9 zG>kZ8%^Z1^Lo>V?>TTexcG;Ki%P|i`+bJ$rYxBYDAPd7H$jbz_g(zyZyVlR z0LOG#-;m%Jn9dCj|HhA?5V}ye!i+fvJf#rP9+vudAJ4boN*z!gC$Yn{PBCxm#ul$` zOC8cQ+cRfweH^{BDv45{{Z@-N?Kcixyl3U%01ZfdcIsvolK7HtF zy%yZ-^lWogs}p3w1p4@7k9%|1I%!D?28&huO_KLC)Z{*|QIK9Igb`AW>D`H~_w4Ex!%j#++MiINa zee0vj7nc68a7|`;@u7i}d;7=aK;idANgih=DP0`|IDP~b=psbCmgM5-{LOVqGLqQ1 zM2H7xX%lFhSnpOiMk+k~kA4DU+(T*Qnzj80EaDdx9pupQ6e&4kfiC1=zxj@J9OZ_=I7>FPoXD4ycv7 zkrmgQ3M#ZBjteuAND56nP>WhMM~1bnfU-8!CxGGKOpG~dA&yqPTHp0_O#3Z6qOf!S*%3Gsve&nQ>BjD_ohLsuVZ`Mip$M^o!9H0bko`HBbFB(Gb9@$ zknHcgU;RNmUQb(Ay81L6=;c>7)sm3!&q)v3Nd=J892`6Txe!5Gt8C z{i82i6Ce!0_IY#01B%Sm1)#i$j$K26}xs_7=BR$eS zS%_15!t!C^^~Q;;j>Pu96k7F5LvL!_fS!|S=Hmxw$SqtW;<15TXspiX%9ou_lZz(o z>pYH1v_CKc*ne5zWCcbp;CfVX3%-%jdQgQ~7^{a3!x3-RqFpi{hTu$Z?xuSf zVmUgtqGB15@ZwKxrFtJf`j0Wy;S+$k4I+@4sS7-y|6VB9moX5|7-j30V&)rrpEEDB zCH4Ff`Z!5#wCW9IG4FhW#k@m}7;pb)c3F3zUoEl{Vc!_L&2roAHtjS3? z;T~l%c;J)_Tgc>CIFUDj-!?>9xN;AV*J_h5_?8b9670$t30_Y34J}aaz2K-!c$!z= zfgooq31I{BQ&gyX8|UTt{5&Om!jEgYONu@Wda4)!SUj`tp4I5s%KYrJeYX>ps}Z|L z4^`v`K~#!AtIrT?_<6I3;BVIX;xIP2>)IinklZ1{ZSv)z?*VPtgs~*5?0Qe z_sr}C9J)Wc>5RO>EMv!(z{V&rm z#NG4+d^LPk9_)t{gzjOGCR`&Vz|grDR(i197s41&7DYxnc7HEVNLs(Y1gV(sWmCyK zwc*y+Q(e~8xWIwD>g<{X+07SJ;j_?RLXauT;OT3`7Ms5E#zp_KU3i!$b|5dL1=l>A()nQd_Ti+WbHi$@VLO=nL+N25yBC(~rMWjQKlvYV8DJiiC z>FzEGX+@C~B&4OJ6ckY48w<~Uzdz1B=egeJp1szZbIdV*HTz*T&T*D(dtGI;_(mAX ze_WK_?U|BjYZ@S6+w%p4JLp@f(>h6wG*9|G6njUL{U#vJ8LA zv&`_7YAY%8+dLT)QRP$k$zFs36WFt6wlSHl#kbU+ZUMs^-p5>@X~fllS<@b`mjZv-zIy(U&29q#XZ$fz+a6iIf(3~ zgMQcRKXgx+G&}yBb|de8eGV0s{Koe8h9C33w%-uhE0V>^f?>_%M{h`MnzUhM@hDx_ zDKfoptw4}y41x_65|@(NVwO`s?<^2~EV+zFrKF84DDF#Ng=q#*`I{C1+6yi`_XG(3 zdb^9rw=q=52c&UV(sFAh?P3si)@lvL^k;tC)DfwmTz$b@%DWg;igVa7YIlFE(f z2LOhugHLxYzX#p#Ao;JkpN9Xk6pn)DKGAeJE3R9UA5%nV^=-&c=k!|rc8HNJ#)P;l z+$<PsJmUiWzOPa4gZeI(5BDPuPiB<<~FiJn&PqZndUC!(O8Z6W)E!`V@RIaYE zG4Wk+X0_syYE~F6Rio|Tb`ymF<-hc z2t!TFdd(?rZf8FjOS}j$iCh=IuYpcIfUz>AUTB*r_Qh%8@(la- zrEB{R7E6YBb|a)a6(*>bUa18(mO{a?39h-v76&Hu-oCqT9O5PQl>JpW&ibXz*Y_TZ z-uR&iKea4)HvFxEQYJ=+<5Z2F4D3dr%c$X%iQlWR0VxizaepZCh@2^o)eEwLxdxl}73--^+Xp2CflQ(nBsYm7y`4Ch3? z0Hg0;JOC8~{YTm2|6m#S*UZdWyYIgP_IvEfcG|VAB#&XNT7x+8mh)y_T(+_CD}3`Z z)l>M7{JjW`lw0a>vHlIW7g;zjEoDpU1hz*RRXo$-$YS(u0&xQ}9B1>>+y;KGb8gD6 z)m=2H1q2K-&7w6QFE-j3DRP3K0Lm*>8LhrmhOjUK@m6ceRBh@s{HPBRd<0z9&l z611;9L+7C_j@TPTKG7|1&F4H!^4Xn>Hlb z_qF)b6O`p@nhY0YW6jxY(eV|lh`eR#gnDajjJd$2CG}k}-_F-JI z!cUOdZU1_|Y2xN4F+_IZg)Zz;8k!qqtl#HTemCgZ`y2+$>{mRQL=X~u{f^tBPl5Zd zv3;uFQI^GY;CV66ziwQPtL{C84-Wc99L9j=Z4*nDvh3nRneG@6bQA{5@uVLRi#vpI z79xn|8-b+iWZIq(ia^flG-^$~ZOyPzvArSX!Q$-p!84%8`rI}1Wl`YFIZt-E7iS4% z)-e%M&?;8;!8UV^zwjD<3bL_~vOMmH(YK#+=AJIE@af754IpRE0%`&&GqJ8sq%f@E zqX1SKdR~f*wowz?HFIAzLASBMnAGsy_BmB%-i1rwEJ6sa@4!H(@AL{YLUZBvfw0P# zxZEL@R_RI>RN)twlTl3Pm=%ff32ipc5XnLZU2TN@(8FcEKxv|(XnM*Rt2!97E2T44 zZTft3VB@F7Yw~$-yE7il48iwakT$m9@PmS?Pe-TMEapFLcy)RQuHI!zt+lw995hev zHV%{nvaW&dX?|4+`xvT4Wu9J{9RHH`dezHv4)ryAT_#n9r?%)+nOsry&q|WQk<48c zrsqLqySvpAuN|tZevejfNcpyE8)@}4+6a>94Z42_lkv8#dZ-g-dz1(-t1|$ENccqS znCP#U#49gPVlA%2E=voTg`ITvUIOb?CQw!(V>9S63essVAxo4U)4RtL6VOW9;7Iy^ zXn_;R^^h}-Z*V9s?6LkQIfWYu=cmf-Z)e<9j%g$=d9plOO2xDL1tu8<3no6>_q0C` z#jBi%LSnDr-by*X4F0|1dcyEA{AWNl3EfSbls_*{O>(f=pWCe!wR(yN_h@}C#vEP@ z4@fzZq+1jqJGtU(^Zco#IpIEpK>7QP3H8F6m}&>{I+=p7KKYeD=&Qf7|7$f4f?GlB z&IZs44fvngxdk2kaRW|P&njIoE35WYi#&q!4Kq7kOK;j)*Z(WwL05H$(2|Yn-O^t| z2|{ZT)gQujahG24T0dVgd`gwr;v!|TM-^>8Mf%uVTTvBQpoSj;+dWIZ+dR4AdIO4b zF;=n7A%&Ex^0{jira~-wS>k^X8M0ZJTnhx-pye$3`qHVkKS4$6b{1dOQ5@}{jXxJaC*`LmZI8PayA z9MEA%3jwmk?9psEtLzfB`(cjDn&c}xIViQ&8?`~u3_gDFJ4xRmV&g;ESYeVE2M2Go zt5=qCq^fnqVF7Lho0sn1p?|$t-0u${iyRAj}VA_)DrEme?8dAo*0G!`>#}IL+ zQG!LCh52LDiW#Ys?8|#5gh(6T4G0Sf7T(fQXek>ugAphQ^P7%4&u=lS^=laog~QQw zzPO~|Q^ZYWie^n#Y}()V0!KXGI0aX4U-yJNl*{ zljD8;Vq|^}4E;4lb5yvb9vT z_)hn9l#(YiuC#SIp3kEU8ju3C`tYLJ$4h>J+0QkJ?E^tMiETwR{q$7)hox>sp_PTQ z#a@dk6?()GcxY_oz$4vry=|T*jrtgE_RgyGI0X#&AI=?b+Ve$#@`>NQIzIXYRvU6m zD$^FsYOjlQ-F)3rt%4fDy0Mc;hRr-(4I)FYS=>@0%m0OIj5R$q%xC^|m{;kHg<3ftMksCZ;ooSd}^?$#M(+Lr~QA3A|G zitQzZrl#xCoUI`RJ(?@vFt{w0tx}bX#I2~W;^(I?yFa2k)8@))zAm6Q+8}NCaN&2x zRxU%Zm0ZA%T}ly8j{MKuY7@+T6T%s>E>98;$37Y1DIThrdNEXQFx7m);Vs^34M*N02Qo2r0(6@2d~2%GGeLoOLJaWKD;&-y&EG#}VtD95%9c^R z{|BaaA(b?XaFAQ!J`-1y?6lbRfdIngMUqbxBuT^5-tWUvG`q9`!}i zWvt~W|LcAXkAkHV{O=rEM%EWiWw9L=V^-mZu{Zs^8DeGwGVeQna+t#tKSA=~RkZ-h zvI?pd!ZG1{>zxn8cCDIqblJ5`mDB1CKknP+%rXav4ArvrG@G;CMDkjUAT7!uG2pJdE_Ryy;5Yia#LGa>Pp2P)NL6XO zPQT@SRXV6T0Pdv!R!R0YwKeaH7l>9e7V4nz4cgOSuGAIMzg{>HB;qTneJU>fvb=RtHU~Q{qrPjmG`h>@k2OIRB zT`3=eBdR76Nis445t*R*%UBfBTejd?Qo|UI1zaD2&>C(`JdG|n*gWW)+vFf8QQ%@~ z5ixNvF<$H2&=vN#1(9m*$3Hw~0$J+ZFSA3DQ7P=&rvmA4QY@g;UE1@|CNA0}AO{Pd z(}a_cI}dpZ{oJnS;V-J6iOmAd`rm6)=YTx#^(Jilq#pE@y-f>2EP5 zpU*Y|R41UMol+VvQ@Z+Xs55QvSt*4aNaxK!Yk>HCdPNdU%)A1XEam%@-`2JZs^2R=AU;DV{&rQ_<&VO6gF{)M)s4*b9 z&GO{VP)TEWzK>mHotb-ZjN7)4`Ah?U$646?P)7F17;6R>oRL9ZN|fLUTI+|`Z6o2r zgl$N6jQn|yye;kM?4#>P*Vv2<(!_MoAi1QVLQq?)P-$nvEu9lPvm0ZFj=9DY#(>ka z<oukj&U4AA`RBtdzRVG{{g@PmMW9%7E+V>w>w`?A6b3Lnn_Vc*wU%Yh zIMecRpt2w_^X?71th+Z3X4NYa-{(EN^x%cBIlQEh;Gj(U`Wy3B4T490^D7awwvLwU zq?Z+#8!n?ZPqx2t-kr?<0c_n8^;rh3flnLKXeAl=ca>~jErhn8>SG4dQX^=Px8D~$ z6?3G2p34&hc?v!0kB@^_{XBaLUwUrt-Ir9^Nv_7epckuR|15l8(}y5K4e?$ z@<7wr1h@DrYvM@|*+Y?lb=#mAcDCoO;gytxLYQMc3IG*qJ??HZ$xW*$WCbx{L;MrPrLZ&qJGiHi#`IEl!buW%fwXO`k?CZGQ>aS@m!%Q*7P+T7ub z!d(?5>h2$^(xF+=fB&q0|4k;P{^;5U(f|iEOP?PhZA7z06=TAo`@i2zoM9*T_&0&~ zq=WiSOM$Tf(g?A@VoA7<$LsdKsFiGOwsLs!Wf~ZcL2hS@< zD@~06gs%-b7}u@=Bg9+wGylvjTriBOYPzPh2ZJ#7(@=KRwI zxFt=ip?0-~$K>(7f?1dKcX&edMNK_;-*xzKl3f*P z(!7Olz^&HsumbkO(AMAt?-^~kiQ$z+rG}%)c@jD$HInpQogkZ%2FD&5_3WON-w~rZ zms_XyKEhKc;#=mkQvUSADS8W1pazYfP{avp8yf)V)?Yrc!dFrHd-_V(xZeldH1baf zP_*Si_o<`}>O{7+?{2GG*I30WS-JQ1ySQLd>7!&-s!3DK1;xw#ek0*%wo{j0gtLQI zkWB6z`JliE>9Hr7ArpD#?ka;R)Nql7d7J^JWVkS#E`4L!#1Qk_D?buP=C~z80xl8Y zF7%iERv2+f90OCg@@{vi60rhSgI`*nlGymM`%4Z&PUJdb-YE7dv^1tew*yV(MYsra zX#%@%@~XiY8N-sv^#{oqR3BjJ5?)yDShqZEf`%A@)_Oz9wIp@CZm zQZnR$eDCi#QTB^1hVZ_<(Q z&c2&!GQAsKee2rR{KfhcvpOjKeX9p>cU@47RVxmq>M4vGaDe+%Qxf^M%G&k!F zQScxVX=-s)BpsN*$E`67?wYRBBZ8N&pTHYJgSUwwQS?YV$p!U?W}46XUXDDglE2K^ z)zGjWT_QOq;SngZAdAN|FWi5`P44oma;Xn8XgnX>^&lIbQG0s>*H4Q210*)WNd~Ctmb%o2Gpy|LndPMx;MTb% z`uB7SJ++Sce)YhSA|3VMlWu86(bFxkDxpbN=s8 z{(Yqck7sk2JHYZkvbM!but^(9XzX-Jxm_kdHN5&Bm@yGp2&Tif6Mm-36ofGZEO=kO zAVpE^{@!mqbNMtNGP4>O;60FjC;f)#CZ=+3Iifaw6<--H5%@q?Dxpq+Qw_^1#g|qM z#=x_WzF9fd= zJjF#WpA9@PBE*+oL{F*z-qUn1n$~&@yYQrWE))9}NfQMbz7jfo|MH;=S@N4zVGyI~ zP5dE1RlXT?Vs&=p*Mo2KY=Sy38oppKPbqr(srA|Eu)(?Sd`n4gy{{7@lk8t?2_2rt zV?BY>Kavw=seg1+W#!&?fg9U$KW(teXyg`AZ}VbMLov$+{@up zmBG*LAxW7)6HQ8kUlG`cZAQESOk9=jkM_*_s(q{@tAULK=zW{0LBCzwh?O1vE{l}+ zpTFqfhA}6YFsSuwQSXAWH+s{Sw>@$m_Q9fIL$2{sbYT@DfG(Lp6AS4Xa+<>>Uu6!T zso>e`_&=0$uk2pnqMs#}+OgPTV(&Chg^vGi;B!NnW+^)c4Alu}8v&rU5^uO+IsWa7!;oPCC8mQaONXepL7cT)4UGRPF#e5?>hQNH^)LIkLNGUpV{{II5ails zmCgc(%6T@_2jT&j6O+nIrLbeV#tbEzd&{rwG${DhK0poD~!7B)|FS{w^QK#??P9mu6j>VW+Hbsj(2=$&Q&l;UnyvT&gF?R6hDa{SHtf(?f zw4z8`Xxh$Mv^A4eBm?z}#Gk*A?&HA?VAKooxs=~EV%_h^TpA2|OW~R@?O9Ly$lrD0 zbS*ei7>Hv*XCi->l9}~vE9q6yzvm3E(LsrD4qM)S_mOf$xXMaCIic+n9HRH_!*)(h zA@)9Sk?J~paqdD3uZwMo1gijyo1knk!LQ@N@JCuci=Z;92Ie__sC)CW zl83%~i<|G8O-}3CQ}BjR$Yk-gqbcRc>etrl^$o&UtY%}D&4 z?rG$13f6btUwbJiaAb=y(nXpAOBk8Pn@h~|rgbze>T>QCxtbPk{r>D*cv_9A-j^)q zCR#c19-|Z5P^@M2w}kshT0D-t7(wE|cD6lDOn)~Ra}Q6aSfk6~!mIr_a1iIj^n*Jj zGbvI3uIr$|CqAC4YQT3Rb?NlCyOdbJivGQ0kVz2sE2IfD0thbk(A-eh0Yg_crhK*B zZbKFX;?AvINIPjD(ag`?Mc5~0-l1`{Va2RFcui64R3YGW@mq4H#er_V9s6@Tr#}+Q);q~u+zuW!BqFx_-VJ%}-=`}UuN+aQC zAi(D*7oM)4DfIRU2mk3|%XWXBkA1p4Kxb`>F!JjU?(()bqcpQVK7hd~t-lk@*dSe?+Nr2G##bBuKGI_qy)!d_zPkc18&L zTKoG`aVePSPN*C%UqXzWdeUhxLuv6-@+JgX%cYNomU)keu8&vYvqB~~Jm=ahCFj+$ zCL*FOZ^~xIuZwwTPx?BksO?qkuV|2XU=Y!2?q9 z8IHYbasCawC!`=K&z~~#XT$4*NE3dut>p7NS)|~~BFs>Mw8y#)n@^ogHRE=VNZmOIL129G&NZ3gX-(Rc@*hbYkxZ-6I$aZ@hl|OMq*pTbGxG= zr5J+}^jUdKxhmztd)mVo>-LrEgliEb-UpkHE3FvzkGl@%sUK^+wPz-hSXqK(rFLWk zQTlLl6cY3ab~pdvU*CBf-R4MLb16NDg0t_n1qss~&;M1D)Ia~Qr;#UWZO4Tq%TOJ$ zCB2ItNqeXa_}wS#D>e*Qr~}CIcwhw|IcajMLBRbzO+?+pEPGIoVJ0S z@$j(I%Lr5vl?x&RoQ3qXvx;~@Bus3z`l=}pDQ_~IlXILCxGCc49o=YQlZj*P{q~%1p~DUr8fgEk8F5}BVS2CD3bOdQopPW~Ksw~|BohNlmZ2(qSVvhk zzGh>+{g&q;=4IZ%e9f@G9};y^JY5Z>o4& z)_ic0H8Ah8HitnUqA+l+b5>pEC!}#qB8bNpk&bIW2me{%K4o+~97jb`M9=A+#B*u4n|$l{=P+Tq4dT zF*uprF;5_6v4jAoj<;aBTOK8HZ1{^>cZ;jnXJ1|S5?xO~4 z{!3OY_9iOq7X*tcsn86$q*|#ryD97`~Vl+m=K|!-yKc2MmueAt9u2ZC< zBj{rR^iFOpsEn1cS^k-#k2AVVqxfAt5$Yr`9CU!sepVbTE{@MO{uuZ`JV`qQiZ~1G zev>`x`G^7>mkda9Moy%hc5N_2$~c3>sMr(_f_??1u~{uqshAV`#~&Bx3}Ad<@lZGW z6`uj~ZC4>*LE;`5M``a}M%Z4Y(&^4cFZ~|x)#mNF`ld#O?yQcHm_P!3{J(PG zK>iUb+iVzzx&bn}zitswh;(__iOLTpNv+o{e41^%6H*+LZCr$}ISek2G?8j-ALjrU z@+`n$R6T<0qGcn1^#-c-gg*`iY9cBm5)6z0ZGk0IjksExoz_?aqZ=_H9iCC`Jtd|; zUhsnW{{r-6)OJkO#BfAXEP$}aPi)i6KZXFmJUk;oRqa*j`LeXLrGCOe(&02Jc`iH zS!l>~ueIxVR$TERfyzzt~!P2b+rP`}h+H3Reg@A~;@d)abRV=K$aqb9v7~^aEaels zjuR(W)yBsU$5-*8Ej0Z#p<>JT=6CJ8b^-hW`cT7+LY{-#IGhJ1mk^QA?>z*%(s}@j zs?hnR#-_#bGv}>rglNFzlK3|9%I13kMDYd9C^;qZ8|FuN*;?Cb?jmsm9-^ zG*Cs7v&WKxYN5uL6w<{`BaqHXxl%TA4&>Kb2I_ zr&~tbVkp=6wt^_kojfi4zK!;BjV=ce zleaIqS%lt6X%2-L-Y3x|arhk<_L+Du{|+aXl%kT#-N%lJd;OJrabmQ+51G>|)PW~m zlNSBlPM^5zrP19dL#_WkLhk@lX3yXGJ`v>i2^l(5zgI3iu|E&2B<0J7W^oMRo^iD- znLGmVFN}n5MT~?q(~-e`d1?I$nMRGE1&ihrv*kYS@8Kv^4m~Etq7B+B@-7Ur=qYU% zV@$oKuMK*b{_(-HScZ(AoG}#F{oexT`}&v39XZpAF;EsLe7i`~BqNyME-g~5_qnQ! zxdEY^`j+FhlK;~ddO{UP(VI8&8$ZLfA*n<@77;`ty(ZeYvP60o@VQ1z7%_TAT7i;f!7tJxEqV(&%jLD0c|WuGK3_;= z@PQUnsaIux@BJ^+>e($P`o)`{8(?UVwjrmD_7*Y~C`S1cr>P)bU3M`zqmtXWC~*6M z;F=;Vr49tYK9qP^;Mc!==*(RWudxe$4ZsaDzpFN@KtLo62Z0FeFE<3b6*?_5I2+o7 z&|0{g|M@bXd#wa7lThoADiK>uG(#{Q0uFyHNxtmx`;JsfD5Qi~S?_QD%!y{j4$@Vw z^b<2~t((eEpZ0ryD!)hnA?0IA@&2GbF&z|8iXQ5Y=Lr}B{Yr%RZWps97CD15ITA`O&JEGjL_HNrM~$e4 z9bId+(e{%Cx2^F@L1#Ixw5e5ZmD>}4szKohvOS7l5B|eFwcD2vz^|w1>qV?NIU^j4 z2osWBj6qV=t{40nSl$lfif0)iouOkSkR?_wwUg_6I6c#mvsp!~E@%H6R?6;s(QM)d zeXd4xeui+F$+s4vo4@?Z*O|S)`FY!nuBVOJdq3!S0urmQW+UMS;n*Mo07jMY*>|q7 z(*?~Bd?wksHnbCCq&854wMq>4}`>`8$Zw;u4FjH6*d4yUuv(I8DG%sKwYik zUXmm|I@GLz)1A7z2u%GNm?cxh}+;#f@vZoA-}h4fiH<=f+zk-8H4!Y)Q_* zMerjhGyrPaPk}T-0Wo$te@Wo z#kYxlnRXA$1w$c^517Bda-4#}oL%vAr{AC|jqCm)y~YSB8m*+A%-sr?5PY+l!Dqpb z!o(QaK*}mz;;$?HAiCaU3Z%G*PIV<@{TAPumu$2a zPm>^(=lu$o3!=ZcXtR7Z|DXpk69Lo^E83TYrFk*1XhykiGLw=5jW|dwX@E4fZ)2g* z-*wV-GTD*;5QKU6%`i3+Y@mQr;-f@L9<~7&20RHA3pE?5=3|8fw3`GZ*!|GnDvSN0 zi0oEU7LQ_#)b3|5_(#<4UPEVg+Y*Bkn7{+YVmq{YR}v1}LhqO+ zzn6K+CgCzA)U(wG3?QQG$fdV})vbf42+I_4Z+QD=Q!|7L%3SX*2S~C;5<7Rk@K2ZF zU{fP>08sB=KREF3t-?(eK3bBYzV5wua#3hb$06H6N=KM>rP8jB@0U+vK#DV>=8H z=l!T>dM?H`ffji#YdHI!92(R>qyuR2WWTojQ$TgNTMm})_Od*Z3j@l?+UYrBo$m_g2T z$#xwhv?(~)rLl8^%TZseT3c>fe1BPRf4k?7TJuk+QW6yog~bW%&PDz_h3LY;27Q}= z2$he1F8L?DW1;~PB7qB%sa}mgt#!&miQwETK>(Ias+q>#d-r@E<^RC>psITomontx z;p9l_%_@f9H{w)IQ{5{87*kS;r*bI}VPp`xCxZlA-I2Zyg$Nnf0eI*f_!Gs7&A7@h z1ahMl7;Wo4N#VlP3hB)Pg*tDS#z(Ds?k&07&?4%yiPJJ<*0+ppH~c7m1+mRC?bb4>x`>qh<{9Ie72&LYudN|38GXJ zEz@zDR3ojC*y%hs2m?daGDts@i6t`sD~9YeQr+t>$XA~+zfe6L?!zq;FC8B9#qViY zUJAPWVKFSsU^2dcPXtjN%Bhk;)YKNoj?Yf$Ef7PZst)&+k6=MwGK|F;)MwFBZW=Y>)QWs&EbEw2PDxSii}kQgc^AD zk2*y7#O1RVZ+lqR@!0DSU}c8dl57OhUirC=6bp^8&}2|^ph#Sc&}_2zDBf0COp1QJ zs78#B(r{`_D|sKYcKuf6s-c!d8FjSpp3k7i>EYXRS*E6zyz`+McEQNgQEP2y5y(u5 zD+PFG5#A7=@=QN*Jcr5ouj zCB4V+p>F5IphpcX!Kk5cgf$EP{}v&50MtDV#ACXlWXQhwalRaa7zTnWjU~SSH(drg zkOR_c(Y+S9+wjazfGhvjbzy%|)DSw=Ja_$GT4#Frb*STt`5>wxf~~(M^>qW{ClKH9 z`%JgFQYiXpZ@~3h5v{PbKM?Y3i9%|PC>(R>DBccEAN%4@b$YOg_wJ-=7_z^(> z7&VhhN7u%##-89JL_XqTlVKF7m=Q$;1Uy4rfJ%7NGk_}r@xp9_x|Z$!0kFTD&fwEb%T?d^MID<#TtIwIB(9JTSr=(Vja{{+ z(xG0#aM!1?%$fCs~ur{%Vrm9cB$+zyiDXX-HVq%d+l zsB<04nk$M@fxCO-B8CiT*pLS3qBffCI*ty%veHD>*^iZ^99XcaC-;&LQR*I{5CMl| z`3v&-JQAX{{qZQc4frq2A(vUG$c(X%A?wUUF9mYn0a1&j9Ol+{ zUF1-D9f|z1&dU=6e8~RBYj9bLWzm z2coa&{nQegtf1eUaXxN^*zs)mEygXhJYgRow9u=ItR?^ikb^XcNwHn){q5HgwY`dc z)PN67dL|)%39o4=J(#YRCi{3Ot0J-`vvQz{oJp`ohs%rZG$Qyk0Srl z8AHmyKTPhiUqB--+=}8lyzsY!bvR8fvlqBr+W7HQQa)HVPe?V3b8%$HC5QsxU_9Nu z7jVmlWy7l$+=^>)U&D>U{N4Ni!6Q(Eo1o35%DrpE%!xR&k7eOV-X6dp>Iw8`#L*N~ zgdpW=A>xY zQ)4aH!28S-$&H+eilDf7T@`zVeRJS{GA)_v;vR%vhL5s4^Xoobqc9P->NW{{mY}VL zeGmp9UrseL&}xB2jEtOPmP>y&4Io~k6j#E=nhitewjdE8(9b#Xb;i~x5LJ7=N6L$^ z*?0P%x(o%c6GDHf-!L6dN(8terNY;5LUStGeK%tn?7rTLEL5K21CgznehdwV!RXwW-OU z=(5qn@h$Ul;-iy+)~+Mrwndkt)tUAw*-_J`NN(ts0<>yB!z`ypeFM z@tuC34oVsN8le+_1w(#Jiaf$DX;SF}9K?`whlTz9mZQk$-)G;5>>6R08msIGQ^oZq zj^=%>ti7$qUg+dhY|RyQyd8fWE)og(fa`{_&z9RXJ|_t}{P|0KR^sPCmATJpM@FJ4 zQ4#c#PC%$+8KD`F-kj|=4fjUFzS)5)yR8|KMo$1-s5lj0Oz@`voB%W;c2h*hjmT)O z<^-}Pu0(k_=X`EP!pp$>F2Y}!m82Jp34d5UjSn8#lkO#4F!*Qv3ujUM-Z#<8lT>`; zpS<-7514zQ*H;w>*E=Z^D061j+>!eLsp8WeKQ#{DX@kQgDXPTRj!0a5atXi>B%fx1 zc&hNae)gxzgAIut5@BY=i?#aFHuWUuDT5zkRp~Pc_Led{+^UjY{_8OipJvcDq`R|6 zQlYS^+2mR@!q2)5vni0~j_G{&{|=?fcoyYQuZ|O*QKWqPENyUs9FkCSnRQhpXZ4xU za(DBxdF{0aQJ)(iatDZvm+@r~6fNo^P1*IzJdP?8peBh6p-0|5A$A?x+;ret6&HUz z!)SLz1d*)))zL7RyuEYVxE=nw>~OT$e0YU?_%?A3#^|m$aGj1cIF&tCsFwa5rD#ec zG)d99zd6(&k3%a$&`5v&a@2y_pAGd))Agwr!?PeQQnOP~H1*{$#)X=?a6K^m+-+(A z7w~L01)QdwNkDHv$tefmUUMlvzuB)TD~lD*fY*+N(AY|d9Pf!Mks@7V%WjRZ55_|A z6;=^dAV}&tt$9~he)bK;y_Jz;S|p-g4A(RdhJ3s}y1p=~^`<$WzvmKL!%KWuX_Lg0 zG3()!S$1;z*{7v;ZztdVbLhq*A4L-eCLNz*46Nk?aTXgNr|8Jy>fcFAaJ2pB+hKjH zQ%VFWIA&?6AE=2!wMbj~G{j*i}4H>TVP5TaN25DW=?dDxoY?)NImZh5xCoT9eVNGi>O`!Y0 zH-}VMzrcYY#YZj__+KL)0~IYi_W9T-avcrTR4DN&UKQjX`HR_hitq-l+|%k=VuyV9 zJ^30L_p0OhI3E>=JWcEug5*mt?%Gl)3AvRR{N0P~e&@Cvp>HFKLRK3t^pgE`vVqK~ zgi^`t+ zGf%ArhKBB-`~lwmypEwly`ZAF$;Ch2Z}vOfNOKwqvZRzE3DAVJ{;_mmZ<&xgWnM&qzCQnG@Z-huRh-Q47hYOPSS{2%@Z|tvD zKYlO^M2siBXzzbRg;kr|pDnlKnWmHBeTFpHOTxk3x58KK%XHw6y8DnX^;To(&5xe$ z2LZvEa2t`$9dfG8rN)fw5yj^JkhXN_pW?eLOr8ln6fZBX`?z%|Sv`*i{mN7EY#43A zI^md`IeI{KwfZj};ob|rRc&UhL^69Z-NFe4CqZw}#GRZsw21 zn7s(cD}|I@llG zn&uV0Z$C8R$5GuY)`USxvE{t!htqs@NuZ&EueL08JORShbnhMx0*WGQfNT%sh}o|N zQJjUEvB65Tq$8KDuv^hf$vVQLMdCl3e!iur5w2wnmeeQXa`$1@^QWM&}~ z61jfoTI0;}ZTm@@nPtiU$JAHHMb&*@&yYh8F@VxANViH!N-Cu&AkrZqNO#8|U5bJr zU5ZF4(w$0!NK2`7DV^`R==1%(e;JRThkNfiXP>>-UVE+HYGAY`PXXVLRNm|zjpBig z)Mr1-x>(Dyu*ro7MAy>Zn*W2v(7H7Xr|O}u%rNcX_yfm-Hd+W8b2_a&A02$Naz4%@ zI$I!MOqR9tIAhG|{lJ&q){6OVqW%Z@*j~T#oW#z9I$J7QX57JE6h#@fOS#k~i@zlT zza@DXP;5!NNB^bc(@aduAyMnG0+kXg5l-!WF@OV5oD+gO%bJx+(Ugh;<;y~gV;250 zKby+WjELePIFFWJVkpo2!F{?IcxQIcb0w?V>Ze7miRg z)1}UcHoV&bT^IoZz1~ zhW7*8mz$IkEX?RbBv5MmMrcABcmqZRx5LuvUTVXL(qe(gbTj@R5Ax`wJ)DxV-Y0Yh z5>?u~aj-ow#6x>gV<24s3xg#vO=DCNSX~2-E>IY~!j3@&u5ik#6fFZPV|NKkQh%{Q zR3_F7FRHsfJIOv_vrf#MLbZUq;{Q1g(wVon*m$;{5K3&}C zWKr{+PUa}=&!aAVg}# zJ0(SVmM5;iL&pD{+SQd5JM&F3%D*N3JDEp;Ag{Te(a*v5T>x{~Oq9q<#AiN^8IHmv z3DG?8^>(K5-`}x0Sz_vAlgzPdDtmZ3D?TNZ!^g=EIuJ+~X?7K0jP*|Jh=9dn3BnGz zp29BUXt4+0$|B^mf0{Csoica{St0LX9sxq>C2r7%096T~-%~kZ1qZ&#?yqN+oD5ao z{5+b}14O)0e{=e9A#l0VK_b;X)q5X+hn>_TKO@k51Q$9N`3z_|WCAP!JEkoZ2xov6 z%W+_*0Z39#)?S$PygMmc(aA~{zo$SUghOptt3#!^)RbdfD7rq$bbfgg`e?+p+0xQh(tF3YlUXnw#E6$h9;wzQ^c0{oOhh;3Xi? zI6-w|J9(j)$#WPr;qJFi`X|qHyO+kyXl?>A2n&REp7Ge0>xbo6A!f5i+f8X~H*f!U zwYLl^yg_Mvdj)QG=Z?M@n?~*K3Nw2A%Mm<)qXSfJ>-_U_Y{2{+lawgx54TKMMgv8P zKDuqU`Ab5J#;f>U_o1L7@0I6sJm8gRU9<=9+XZC9UwHT}ElJZ#>UYrCH-7n7rNi)e$L?Y$D@Fjjx(qRL|UMGk%b!?gJ@FXSfx*w zB8Q+~@KT?_m|N`50v@P+!5n`O`?)JV1lUh!h(l2az=kNj8IXAu^!=Fc+8!L+H)iU5 zJ1nmMn-JI3j1bn+mB9LS1X$nVwzMPTWKL#Y0_f*->-o}>>uv?gKvl)2of%uDstG!E zzWZ5Z*|*?k9Sp<#bCt&>aLkG+dEylXM3?SE$GktM)~Oe@J`$mLhc;9Jccvs0jn?2S ztb(F!)D+9P$C74SQsnXT#u*H*I`v+6$rJT_=x2C# z&Rs8O2J#;LJG(jOR!3522a9(OjyxO&G=G0}Wx7>*`)T&(a~XCO6{ZvDY%ZjWfA??y zW6&*VcRbBmHz`Pe?#7A@T}fn({?caL347i4J$e#EKwCp4@W)+a;NK&ve>os5_O^ra zhp2k#2Ym}Fi@>o1Bgh9Ls?9U9tBA~7uoqZe*p4EBFJOgX)+&YK+|XU?=371mOM5;H zfRV9)rUTV0VCsAkLKlGY^>Wp^_N$}pyoupg7aIg;3=bb_o-#1iHn9F`f#ff=mGt0( z>(f|rM;{2r7L#}RDi3mrI5)w$& zJAVXS$g!RT4Fn4gATY*fNpF{+ny$ckztYqHf{o#1x`$(CNn)XU1V=W!ei>305c7fz zLOEB)F;_lu^X5=BYd-w70X;blyKo_ZgviXDF0lj)mAkEd5Ta9{!HX8 z3pvGP7@M^ZyKm~ik?9(eT&JKoR+)O#9Q4ofjm<~MWFlfobseuMaVg6mncur2nS(!> zVcpcDYWPXs6J!kydq3O`GG_RQ5!~|Pp2FQ9W5F983b}=!$g$z6lGkdL{|k;Td%-fr{}!KtJ5+Y@aTvoC9vu+rG_tI5?nwjs(-< z%?GwaJBmCX6WK0S>Lx|+XWN|TZogt0=>P_2_I)3u0)U3B_SQ3_u)thKmG>7I?+-P> zY7UN8DMkspfWdD=(29EkAy(&7nz9UBWy zfTKIZ*Idi{Ufaq62zM|+f;yCBV}K_lt+^l*0$fuEk3?^ zZJ!&;yu-llnd$Nl7+Kv_*pHN6BxDEJQIMoED^P^Y9&=vrz=E#%E-iDqK=}ghZdxe@ zar4EF_kZ60(r->=Mwf9mXGfG?Ws0;+i7UOz>JAK$j!b^&Zy$_){{WvknsfUp^1yve;ROoa)Xo*tZKz-xKk+QT08_pzb9CCm)X z*QsMAvwgMFTa>-O{Vl&s*E8h81D?P)NV|~OM8@G(4Q!to@rOow9A)(a3YIb!%#3!+NN@Cs;EmY*ye)} z3flJSIYH+Ce-4(?1J#8eSB-+06>kzf#WOL%W2)?v4Poez<*!ZV*odoMs?M2buc;>^n1v!B$rYs&{i2?zL~ay0;g`;mASvp zHBF8o;mAx&?M^(%dYSxB>%e6FFNVW|Z<-x@Yz^|K8S#RD^83Q`B=~DX40)Ib+~>4D zN>+XWvTF1T;AaQ_T7(9FY;a~#vK26HTrHg43W~?vqz)9WWjg4RB?#eBy((}x1Ih2a zd*!3ZEEVqlhy@OK#24NcgOCKmznx#2lXr7+`JP_{QU@kG-s8eWb1WgD8!u+Qp--NU zr_ki^l-ejlZ*97xDDVxId}cu<9m8M&&Vx=U$fE6Hp?MH9 z|8n?MYc2(9LICSNdg84AJd=OKu>?B4$})&D}Q_VFD`vE z=n0H4t&kUhZeWxLxi63aMw`_6UV(X|g(Wru*`R?8R+6TQmZ1dJd!Aq&=0!g6&x%wU z39cVDp7`D%txu!O>f7q4x=BNXE8}xg1V&&S_I~b3wxl@VGUGhbSP9oF-mrW5l2ic} z57xruqhu0<8OReu8=k@gvqE2{19QQ6+dcx7ws?ipN(Noel^a^4n+UehU5KlSUzI`|K_6QJCd7*ys@jhqQro5cL)vfmQ zVifv2LL`Y0yBUL+&=-13M1I#Pxq@a*-;{$vWqO(T#-Bf{#KSQlLyeOjjbu7)_3C;3 z)$&qF5KtB{BVZA9xywuzXAFTxND1_<>K}3qY zMV=M|-*4DGtT*y&cRjueg3)XFaIVxHBD(bJ{@#NbmlfPfWa9xgok4d=-&H6% z?{T@I&Hv)R%`bb+mHOwPT5PDu?#0KX2ENB%E)0k#Jrt@2Hav4~V-{3lJz zmD?{Li!wqmhCCh#1l0g?gaOCOZ7>LShmr;`JOLFge@Ytgr6M@I$wQl9L%s@cxKe=sryDsi4z)BstI;`u!kx7mz1|E16OQaO3!;%_mlChA$l?Wf)r>T>GlnK2{;G z>uA>yogux~V2QcD*%c?R2k#Aq<|&i&aK^n%?7$Hkoqh_%(GM;cjTs^6_|Csh0}~~= z6!LEA7mE9gfuUOOyKUDs;x8$J0&TroUuBzHy zU?>HYL4p9X_yR9-ENmDYl|fW;l<^b4T`~YP30hJm3L1rhW3eiork)B&iyHJ8>&$r= z!V@+_^K3(h7WKD>JHIQtE5+GJHjXDn^-3x!qio>46@1f_8 zrsrbKUlH_pe{lEk0lMA3(jdaUUI8Z6V?8y@NUUl!e58fkermwv} zK=L~GXymKs5_i0kszchUUz$QW4r!b2DHEot+$UA7yJ076`|%M{1w47^_w;vzSLsRMweEj&@;jxJO?#WbeMv7|ItWZenynfHvZ&BUW(y)PZAo}%BM=St6i7{71LZ8<1PM-~Pdjjymivjxm34}c z#wU8ax!Xnad%LHP`lB13^B;cT*Om&@@t`3c(A&NRWe#GAzto)b%zv~gf=Nu(?diLN z)$?5uLiCB~SWdZY0w{Apnqcf4K7Jokm9IR_iPFsRln=9sJO4?u;B04_j`^Zr;_e z7N8|~FMb0m>A^QelreWPj!e{p<5k@CIbmz}x3Ax41K5SO0pRiy@Kua!6s*u)b0P)VW!6X$Xw&;WCV~d2h9rh^8q0gw7sF%*80p0Ew|& z;QFf?owXZ+)Qd9oa0J}ggRW*mLvh#{WrzanHwK|_7Y`WD0B|WVTWIDB8?PSkTE7L zvhk+NX5`HkScEAlz1og;V@Cw99T-Uu>ba<*8ZPhnxmiB9l!$kb5usi; z@Ixo!<^WO!NeD4rNC(uTVaKViZtCUag~s>lS-o0Og)VF~s5^)aQx`cJHHowm%>tH5KR zmwz%GvZxk?XTW2CMTjH8U(cZ4eP8;4{cJcC{Envr!Nmi;9cIje!BvzRxcWxFPwl`> z0w7eTCQ){^ZnOaH({>l-WnAh|@E%hf-6Magl+Ti%z?{LJ`J1+1x+6~^+q}dd%`hDi zJZQ*CI~`iIV^0;Qi;MGMxiFbkWiqp#=4?L_as8c^>*_~Kb_F^Xs?23Gi4^`=Sf=&n zFkG=YLE8%!$X4JSlg17vZx0T`IP$Ys-kyieM=%8SlQMO;d-&g@ACng%#E^_eZt7fr z)$to_y0JR*kLJfpvM62f0V1kJ>hdkIK|5o>X_*#+5L5CYST5clx~~2%BQ*&9&LIAo z%o)wmXgB4-_{kkhw9vDIp@&%;sBZW@k(!GQrv$+cusn^gFGSDmb7MG7v>2d>F2`&- zr8O2=c4%0YRf-a^f2{N^+Wn>L*68tnqX9p1D#6_R|LP_gS$3>E7xho)WG= z1qSbFh^}Z@O;9~n08UZCU%Y6X%;!+Uv;oJj%1Aeavd)YVCtC^o>bJr2q6s3AOVNE5 z*+9j&;v@>Z>`=)cY%ub3anOdyz#upXtqBUrKw6{et7iVfr?(FdhRd3U@8^Ma{R+aw zzjY-5DFv2E4y9Y(qPqOIYn4K8NQVbsbTAV;fe|k)16P7!j%ztp15wM*Q$|oJ4YJmo zFOXpb-D>oa8hTlnByw_TGCSLk-!s(%8q0_LlKtyx4syS3+}Qn-AJyu#Vt_~5m=sc9 zku$JkdXOx$>ks;*^2y zNrbI8fY0)VfctVQksbk0@Rt@n7@W2M`;LNzZsfpq)~}Z6BE;#99&)yi zjEb_da@!S#oDG%mxRYt|sajLQK4Z0zC!>+^!gIwaDbP(BbT#%pZ;#8V@BTT}H)6o) zf6(<{*lbZCe*uI_9A?$P_<_mcm{=eMS+rmbgwEoFfRO9obCzp7=3Igt$io3{++b2M zzW>~Me4GdVmYk}P-8F7$OGFLG|6+hPDA#sS<+V zabD*Zp%A2fKl+`BvP>cQfCUpikDxoHel$-UQ`14rr>=6nFJMV7`L?1STk|UFd0$EK z4Tlwdr!5OS&Rl_5g#o*zG&((`QpI8{i)fs3IHl+~T&+SxN;um=7nBPTonj}r!^ z%74d2820yCVompD{m~JG33S2Dl?H4sml9f;DG#;ZJ^UC^YAOvXQcE0T( zzUr6!w5Ef+X0sR*#ewxAm6y&ppOdg$`9RP^sn({h@qGRo>E@Flx~O84@tFV<;3VY` z(~-5Wgx7{5&BYmC1H_H<39!Y9mwbc%i|0Euz4c~nfd;ZJB?rG~e^~54Xd_e&nx_bI zWj;&F&LcSN!)EFnJ=;G%dOQkyV{tLR@J#lToXcV)9+=>WGdyR`Q4Lpz+6aL2Z`xtu z^VSBBy9mkBEw>u-EtH4{6H&_QEHzP`0E!amjjTQlIJJXcL`HtPyjrT_o%{NrJ|ud^ ziuHhqE8m@A;ySp-=HP2N&fjshMJOGHXGHmioyOnS=w$X+WFOxm zswweBst?~kiGo%}3o7s~0vT~)uNE#jWIzJsWZO!4 z4!`8&{-)6#z$N-N_;;^GGy#SOHm65+F;p9Uevy86<{V6G>wPhmomT^b+Q5E}lkm6X zadlpJvP7$v4|3&}=~jaPpR(t4)>{Sn$$=7wBS8jr8l}v?F&m2^$xv)0IWK}+`1taD zD%s_A+qSLTg3I>*;O(~b=c4-UkObe@b{u+ zeybB6d4YsnCDGmXeGZcHdyB;Xg))mkJFHUr6rc7F{f13LCBD34_3~h93J}23LU5Oi zE=aZL=FhIoV7K9E?kV8CKvEv9-pk@p3z_u@8>km`eJ-e9QcsgG#eq!USok_l|Ive_ z^=${es{!NF{HW!^%=zpiEGmQ_$BXZdsYESJ}ETyc8b4!jVxwF-uior(w* z#;_kzDnPG~eio&uBAG>s!eb>-oGcdZD@J9cPh9{C!@`RKq@9H{_Qc`bCtPwMC(Wu{ zT#-#J2BZv(%KJ%+=xPpIlvqII>C@aBGG%wKxDiWy+q@W2w49>)E+ z)!7vhb@w{NQRW(51dW!9a(kXC>z|AQ;PYdbv=x`OnAH1E&v|ra0@W>zG={f?9N+tI z4!09uHKZp;ry#vM3G!(09)}H(wt&8){=KZ^Br=|yZ&}Ij_bVyyj>asM%yzW!khl76 zSv<}8%X!dbvi-?K-517Ptc8)C481vc6^ychD}OLU@}i#&U3@`9O#6hp zs5K)NFxKoK<3akw5Y98<4Ak<0+k}x)GW5D-ZR^`qM~gy(&s^3Gz>=sedjf6RN3u4T z5khQ0sSYr*BY+Umosk^QQ!Zk9FDqhb8Qua{m`#ryPZ=_Xq}EV{7QrWB#lq}*f-LfM zB1N}HowNZ{XjtKZMkf&w93d#Ayya{$N;sP?o}|`#FmIbfPlpdRgXc#3Q}dbOfmZIQ zIUpS!Uy6mSn(zYDB57LdKNpp{F&nhU`kDUQV=9Su!J$65kPOMr27r~36kEHvhX;%6 zaN98h7!Rz-(i$ogDa=1LgLv2afrE85W%8~xEkHD3AeQt&LkYmKQx<@O_jVO-;r|{b zx+FI9I-+&cT7!zjt1!?^R)hBuD*^UH;&zp=pp&$XpATW>A^^iN(m*-zie74_>Exnz8>%&Beb$L;3?1j+_i#oy7r;T5TW!B_q1~ zrV(88^j)ewkQ|5I=Y*x9K-m#oFm{#wR-7_SGgeOfHXfL|cRa`y;WFJ}B@BY+9wG{P zEYe?#7DyBPQLX(`?P9xSFOjj> z$Ru{Lh6=);n$4+@-`O!?O)gbqr+BNjlx_CfNa2oS|7)G$@RLWz#cT0RbrA zazdbXd+8U5u9nFu&Whm;G@#mHh{`9rsCJCm!FEvYWBcC*`nWS%FTY)YHz=-mLq9#v z>g>h8rzVc?F`ngaQ%^+0<8Sbi{0z%@8Z zcQ-fVCV|Msa4(p>bNtap3m)}~Ml97YgyaVDFOI`GZ!CCgpS;-ySQX#*CU4JNX;`=C zt)md)2b)%z;bCn{WPraHmiw7aw6{Nkd`+JPr>5j%)95;bwdi9o!Qa}b1}%8n?f)$} zN9j+axx3Rm_vAu@eA==8ZBlo!SELp@yJVy(uFT$moBLdN9vaLgT|u{~KyzBO&=`mE zRUt*^Y@CQI3dtrd6SyGIv98q*ktIc|pm+dHRQ~ueb5F9(JP`H4*NhG4&IX=pji=hu zMn`@@ePvh!M7%)5ZLH_wi8P>L>%X53e;lW2)!1{dnh4|s%MagG>&jB<9?alZ>-O}I zjwTU}{G;7-1N4BO{ucf-x85gP7Mk>lPPg*DGPk=Hs}%YH-&J76WHAqv86csGD zkU&L}F^|SA(@>x)P$hyv@Y~%@qTqjwpcJPSR|np`tW_w0q8fM@o(M1oLe z@*}IAF&dqdMe7@9Qykdxgm4UG%I2E$ZvCsQM;VRmwQ~s&mc)Pt@xRCK9H75~rHOwy z%@gbhnq-{(?6W3t)l)UM655#8#7X{9KPP%GUNqiX4;z0d2$0shs@*p-Nru3z;@$ib z@cfK`0@)6HJuha&Ai*8^g)Rj&Ik$dbkV(tScZy5L{xv#d)Ot;ORv^}rvpH}5XbMGv z&UYz$k>~y?G4!ZklaJe};GKj7{`dX=<;6>V@AI))!J#RDIy4snYyN7g$-EH@ILx47MS#~G)Sra7tOS*+N8U0S6`g)IzzCK*OiMu!K z6)kJ9t)iAw$PpN2h#vA*u%`5PAmm91y)%PK&c_uW6)u|Du6w)04bh)KH08s9XC&9F zJ5zdtMVPgY-Pj~gse@1j#+95Y(>;k$R!ATAKQJk0%)MmbZqR`uxDvF`if$!Useezk z6CTHKP%fxvy}#$mF@3mqi{x(nOuL*0UbyN+98x_v@IGO}))8w`+*gK>L}nd%lAQJE zyRo!+>=8}XFF*P#ZUg2E#QYik6=3mTZ+c(ZWP9I1q4TF{GnZ_pN3oVMpurCM{R|1( zn9>I*k#jU?kUCukbn?HoP?-s3(G(9_U26_l1B>ec>xu2%+P`@mQdti>Q*h!IT313z z-QX%3>*cLJ6i{IkZ}}WZ9-jEC)&2_^Q5aF4jLl7?9ERMeqiesV*fvz#!fI#MDlVfv z?rg5kCWTyP^LljCJcqsPv89Ks)?g9^j;R^Zg+98f($s%xWt$BEPyyX5HS2qiEbt4v zeo}P_cxGo(LuJ|>SQ4U2_e~2?kn$#DjFtar@TcOY&>A4oXhr$w7t~>B5esYwGiU#1&ZW?%+5d>%|6G-Q~EIqJs)m2yDZZv(nVe>;mDkvDOu27%hkRdC%xO6JDX;`l%l4AC{TVVkF z+E;>W4Y)dqrAVtOcUsbDq;-FNVi$iMZ8vUDh-{h<>B1sQO^MXh+-Uj5ki%B|uwe=7 zkw*Es$9`%`g6G=!HZtXnyfuLy4)QexjvrPO7}6M+baBhPnVAv{T%K8kBs)zI|7}O+ zuk}D!-~#HqmukbprDebhjA=7`aACkIUV8ds+X|b|-^LeqZpmh$sRJWmvt?9BUBFF- zjN3rA8{(hw&rMXw&-p_RDbX0LwBJxt>_l*2nGvRy${$Yw3p?w{Oz)2iwbBp6<*K_TiLT*BV8O5o`YdNp!u~>N z=N{Kr`eI}|QMxmA++T08ZN1Vk$fD5$<7zC+YE*vWxIx08i0kZUl(D_M7{VbEe=WOU zCYTTg7~gYq1;wq+9_7rC;4cc1APX1MXbQ`(%Epqoy#btu!S|Ad|Hq47YDcAvWxpQ@qhpeO>rt|W z#hLAc%kmk!gl}s??VoJ_#c3~28-`5H6acopPuYQfuQxFvg_ zNCnuvdnLvuENIzhU{K%(VCV5)KZQS`Atn8Is4o40u|{U%;{C@mZ2wDv;`IP~le@B$ zvh?S7pe?84XCA#`#4?aX*p>%-mU2ZQ0aitYNRkE8IK~-CaRFzRP4%oaO@uJpOBc-m z+F2C|B&>@L3_Fwl0CzYT&58&<>C4?%1j^1KtlxoR^DJF~iMXzJm*CaBM54qzEIUfM|Ug4}|X}jsl`&bpY0r|8=qHE8u6bY_qtE4?x zmhL%FkbLBuZOAuDbk*=yEBIJh8z%_*v)fm`OUbaR$!6Iz8kJF`NGR;*P1YKWxo{Hg z_iRhlG=j!;CkQel4m`-j4K_}8l}uQsCV4g@2m<=-ezC*@w1PJa2%%h@qV3m#WP=>9 z_@;Sko>b}b=0QtN_;1NmToSRzmK6-a1e7_@jk_tG59U$kpn0x_4DBy81$NQE9t4s? zyHX#H3zMiB+5%>AV7xubMiMutw$y()HQ8U=C4Ts(;}kDdfTvTDEMzBPR3h`lyAP)V*2U)|vbA@B>r|>2`Uk|wY}+x&kkR-XCfb~^q%jVk zfJvP9QaY=Y|B}*3Jyzg6;71+dpqB7*L7c!^(%A}GXIh%(ftjQMJ80*7%qp1GVbxV674xM{8b*S+zUmg^N0l zmSH*lD>|r++(H-wsNs-1*z&PB8?JT;@Gg1ug@6Zk-|-Jn#RJKL+sE&qJ#;Xleg2K3 z2*yf8i=6Y52}O~wmII=Pssxf9{FY=2hd`NY=2$(6N34Te46MJoT& zCHjrzDaQ2RHfHrMz->I3cnJ0f-+MDppn1= zAD@|lv@GHpqzDSdGIToS7Rwph<&97KnT$ak*YmG*G+&f!zA_6R-3@U)PJ=|?i~)cc zZvlk;f!3P}MUT*zIW38JfK^vL`f>~JzOtM@jsN)+IKB%&W&_&0T$IE2R4dJtfbijl z;h_hhPes)f&$sB*mHr~@x;*$KVFR0dRMfDm?U3k|-)d%Ys*~Rb5umqp^f}H;0-1$) zFT|W}tBB4D4Ydt5;?3TVBIrov={kAZv` z1KRMVi(1rY3nteA-YuMpdm6CUCnX*ETkE`k&0csMok~X`kHrE{bd1_o$#l#$iPyP@ zvtFi^6*-X;$oHj0iuI+A)LrsPMhy4khq!zn_2aPS^Q0aJnq?XAUNs;l#5}|zh(CUE zJvD8H$>;ONBacUW4FvuBe}dNf>i#rr)``@9_^|n*pHdbb4&P1MTX6n)j_XY*M1k3- z1sKdLAHN21sM`;I-%K`3rP~v-uA2t~bAjlER*x_k?1x5bxO_Y;?e^7hZ4;Ky)^9f3 zwnCK$2Ify%N*HAu6rZhlxsy{!9ZX}*Y!XELUW~em;UvX@9g$>^30WfWzlHpaayM7{ z9Fe@Su=L8sr%jLg$LL(zeWtz0KiPGx4EqA9mlK<^nM+7ZWDdEW)gyRf({3q`*s z(XJ+Aflrg8vCI6i9__`=B+yST=aM%oiY!F zmX{DI_~oiU;x`2WtEWPUX9SM;>CfAx$=D6=&C!TWFmHnv-aqnn0s6Vnz6@q+5+BD4 z;k3sV9N#_x-w0SBef}hHZZOT$149dJpaP(KwG6NE;q0*#%bhd3GJ>Wat*dJrEG zr?<=P%4<57cv`fh6E`l={xLu7Du-wwh9udZ6h?lb(2et1>-mow1Ir z)$OGFtk?Y#A~oZK)=q;yPyN}{%@rNF1X)gEMAjcRP@ z!mV1|h8aqV_I{KIdA1lb?R)sz>Pz_oQD+lB{Z(^&&*KNNQYrUtd z$=@`YeXbMG^5Y85t)B7)nLiocL zE$CpVeZmh)`;q5vE+u*n3Ax8&PM< zlr&BgYd;gea;$s*d9;I!m`Hx-7Wlj9wVq!_UjAUU!YDr7edB?v$3k z-d{25_;LHIKx~S~^${$61N9z&=ViQ~Y;=($!^Hi?JlIsW3%5mw(*R90SLEylP@PH&j=`xOWL2F!+~|R}XGGT`(f=Q@Ufa3MFB@%l zx_MRY{<_ztlhyrRzPa9Pp`gNZ>&0;KeIV@+&)K|5ec-RDLM5%-qYyqX3(MTR_Qynx z>2uIXAlK*UbHm*`Jv9Pt&R4ru@+7r{H|$Del+6@P2Kgx3$d6fk+JeLYRpTHU$H^mi zYeRpI?RuM$lKb2KGL4thlU!Z)itgT$gh!Rxo+@mFaudIIMrM=}7K#)d#(LS7o(5KAjvnHPuIJ z69OBA|Qk!)Zcznk5p?;rfBKgV4YZz=Ev&&M#9Js*b%yt2vK z>?7iCdquhP>pyZ|tsjTRw*^%_R`$K~fGLco(lAsVU)wLnvr-J1`cN^+C6sxowhgrx zVAbeN^6S%zEZHCTDD-rfhvj$3y{2tLQS2XZs6gs3KHITZg~9B?e!-hweRy=Ty{TxPBaj#Pj*8jfE?wnOTM$h zX|8L(?3&~hS$j^Qd9lOzD}WD_L{(eIKXY0ve&h0Ek51EMCd+@U{E4HhbZXU<2f;M& zrMmD-HShP0l6<~~t?s4IBgSvXl%MZEEsxH>&ajuJ($PTqIgnTKhM?f}MgrW^Nv-(l z*kImCV@;vZUt&m-AGvNO?F@_Ct#kr&z0;S*Tm?}v>k^}6n9|!4%(A6Y9|b6Jn$N}> zdd^CQACrRd9~iz@98m8>w`2%;&i!3wj6xXr05`_`y$GAy>*c@wGGa*%nv1Hb))jPt z7}d*pv)W21qhxqd2w`*V?!xyqig&A~yPAWcu={pAck z=^)9-%gmf&_r#K#cdG+G{Tgm&oDcC81&9U3U_bSLxhqCt{iyO$gcUY?h0mCwRS=$5BVnB3 za&t`}=El6WjyI$`r+?1Rl+`g((eeof_Nt)&-q1nUw0TvHMit^R4p}9kZdu5z&4Nh) zZx!DMZ!x7VdkxCzFJs5EV93R-TKN_KDB=FDv?0%HzaXDWOe+y(hwo|A*|V76O&^Nt z?WNyp(X1p@ur$ZQk#le<99U*XNXQmco{zvKLVBy^2Nu?J8_BLv|43AP_FKGD5p30G z1J(baXNvo48z=#>bkVEs^I#c+GoKqy@yyN{4OSQoV9P)yC!jmM6AGWtL1dMJyr3n~ z4IBSD&WT+w&ee*xPJ>1>zTkyhC>>e6M;g+XLQg$19BC|!NvRn(sHeaAkaM|y@YSLg z78~_)OOJn1vtFy=;AS&T-Sj zlz``1rK=Li443%4p)&{09`>^*;~%XWI%d911HC42#XgD^hTiK#S*-zsqpt=67s$Qw zxfCRsgCl2NsHx7koh-OmD>R&OGgWkF#ic2!RK8TksQS#??tt?|NO;5EbJ{N&OGJT>B~Rkcc8#cnk{?Oo}`RI%%p?{o`@3T#6^ z7y!M)Gr{Zq8;*lBGGS4ER%&`5ZD><+#Sju{V2^E>z~#u6cCBs2!wMGy5cxiu57En9 zeNG_Jk65ZF_}}?^!u#x=1G0UjR8j-v0*vPYr_8Ik1?Hi%^CqS)B}iC(@7z2%f(s7) z{_Fbd+^|$}h<&FLXT>1TStJ;~Or?WKCV5Dtb))by`$AubS_ZgBdN{=+`0_$>z9-G! z8PV;CVD<^%?QWWS_@(tqao6&2uqpP6mS85S_@&;iK5MyKX8458D^u-^--@5$=t^Nm z>SvA{H?ZaKQYMJS-1%_>qy3BvCP(uQzgszMP)&aUDe|neN+Cb>z`e#6`NnY{ZgL+@ z_8Pun)+)}vCoMIbei6qrmm~5?>&?H;xt0fBoKbfN$r(Q=^jwzsUwhZ%Cac(~X>GMG ztSPI$RY>q54qBE29vtiwYJ&IZv|rWk)GEZ5a{mF^MoKvaiaxJs6}GuBVjJ)JXCJ7n zNIngrGXrmXvRj#I&V6P!Gv{9w@L(tOD!62}kA7=Ms}C;r zs+O-hNo2{}jaaav3K{x@xa;+h9vD#gUK0(|+MoJq!+PhDpS9UIl;YCU{fB zYjz%S^_~&+o%=lQE-|ImT6(A8|LgUA~<~I83HAxO-hX!k`u`f<9yjM%i(#+5 zR^HL~Z>GNpO4234*ikc&wWEUHRkd(^iie9h=6{KvlaZd+|H%a#eSm(Oo&zo|%nmPc zwjRzydKJW~nzH*KCH<7(op|Fg4;?>RZNH#Ln2cO^M##6Wd9EPV^K8YJRwXl+zdDHM(3ZKK4Io20fYR-j-Uzj3Jwncje`{% zyMwxK6<-SYp6yU614cPw`2pAju)u7sZ{rRJzTsRq#i~p#Hg=qOy-WgncC1>zVHNrE z)o8Gfzv4Ssbr9YCvcUJSmWT(I8s6-Z-dK2rKvW=QS@*QP^>OLe-c8Pi{F>V*CT>q= zDnzD7TO;jT2p8QMPbup_J0-QWh0E1(+&J!&)M^Ov)r!ldo1TQR_u0*6BJQn8*{?_o z@@r6QIEAjpinpN%ftuC3D%KVk>0p?gBT9FSvDNL8tKmFhJ!6^<5%?6Ag757=sSGjn zIYHnGD<<|o4r7E+y1QTb?BIt$()eA&bCYw9$;N^Z4M*wo<(@MY^{=%$+u>5qP$|eF zg%iSAEFT_MX74*TEY624EI5D3*(XCwFbVF z6@FU1Ft_vFOW#gM3$B~u8W^zOSp6iUV^A{WAeUv-CH;~|>XU=jtx}UOZ@TpacX^Eh zmIO)9okhR(%0z~0_h)%J=1e{zBxuuY?uC<)DC;>jY@pmjl;_`jaip* z$KOv+aoMGMKKPYqaL<6}HNp@KDFrN@mApT6EhVvEdHKe@HAXc$3hBp5>WcT(oz-?M=hn*K z>}S1YZy2S2*oZ+fu119&yYqHc7vi2D?j;aznnRsl9NBX1@Z%TrFgsTu)Bd&)C zGo@m6HXVn)dA*j1PneN(9c) zD`oUh`p$Si#xLwx@jcm3)H3+Pv=3=%oF1{mpL5w!jE|FC%;*ZC^J=O6=K=r}1>Sd@ zG=i0G>NRdW5o@O`|Kp{hL{u)K?;AyW<0Vm~5LNkSAIJnND+P2rom;I+}@nYex#o(xaJK|F&cgWoh0BObxyEf!spEs4)d za>V?`*Sk;X_?~@CW77oTs*Mrv&T9e_?Ki9HE0TDAoWuSW3q{s+cy6sq3wi zM{av$T1<^I2He1o!FGySuUajr%sf%kwNsO`XZUtvjn6H>Za$NAs^un5@FMBi9slbj z>hD)#nSyWU1V;@pvo}Wv!`%Xb)`^Cc8UX`zA8RP_Jhc>MX3uJ^&#?C+^`j3L9VK+I zzZ|S=Sbpl|bsy{cxd=lBqpFm&TV_Mwm*)#lwhKS+Ys06wLP$*t;w&UcG+&g+KZWsbx=u@#Wntwd+0LaX$}H{8WhGq3>o0 zc+WqG{8s$)p*v|u`3$H`t0FlK6e)w>Im^AAmf-SqALHs<(wF9~h2xIL(0&7z?6^9u zNL8OD^Q@t@>5MYGT)lrT&kmG&NoANyA-AH+8b-3o-}R^n0I5;=x_`xVxEtnfF5PHD z75AaQbz1AA_^@029z%dgveM=U5QP`T9Al$EU_);{{I9r=*J}r0BXRZtR-iIGGpmeJ zpwXW^?p%;)pgYhgFcUu$+ahh zjz5qFAV2gu{*Njmgdup?TMHZ>k6KAZd&igZQgFGV3z3FZT{pPx%md{ z%xv7W|M(??wJdj>iea$-3X8F6p0n@M^(}mt+lK4slR!B!<-ZQRJ}~i1CdhWyv3Xf} zjiby-(=RDqa$6Dp{Ya>Y=rX4+6hn^g<}CIS^qyk=A6s7?msQ$zebXh)4T3a^ z(jrQ?loEnSh;&N{l2QWF4F*U^DhQHFNORMmfI&B?gn%F|_3eZ6%=yglSTZ>j8OG)7Ba+)=u09Zf$TQ1<9&LYgU& zJ)_EwQ%|qAQIbf-&$2~R?#bcw*zP~o7bpAO#cn~SwU_9`i73uC)048R zkOhV;S1#YG2&PnxtI@qp&Is_|I~7PQ&HlY^4{oa3>KV zo0bI=h7|-ZX{csy7Rk^Wefmlj2C7KQ6U$hyePCA=+v-6IsqctDNXDE6;k=dTcFjqR zcr0!6>5d7@%g`b+-K6?(q4TwC<@5B(=(K3sTSgl4-@hx^5TuUIIxia%qfC$2rKLTZ zdT{Hnw}y)p*eN=^{@D8L&<_hWa(CrI?>*V|X(bwRCk2m!Z?)35&3OHuP+#7>=U~j! z{-a_x;_ekQm$wvklC*W(liTB?TzFr`xf&iJ^_=s6IE`PS3OTNLs1w%d@kNk`8WN(( zMNU<;1y)z{ZRLGaNT(2t*qq6v;vRQA< zOz@sS6Iz6!q=!`KK*h`BJhZ+1EkPqzQa^TsIUp3LOFdlK2A$}OUbArK&}$b?;15GzNVWH?FAe(;&YNq0(b7@olCXSG7~Ijue8tBKa-*Y$=C2${kaK-snbGknlxr zq?%DlTp{9l*BWS>RW3~?;8e>!-AR#GEngDGI?N$ws7Om;*owyQ3}QY{E=~R6_4{G= zYXa37g@3EJ*uOI$3co^IAG)+z4s%+dP&vw{*Y}>8QRMQwgnX>W%viEXB=sbo(hr10 zFuQ40WuiQ3n~=LAiCjvevMU&Fo^ohlOcVP@o4}XkwV1Y8zZ57a^a#?M#g0;`)w8sz zoCXQyD@SaEgAS#x=rf5U12pcb?GBARyutv#?}yG)0(oAJKHU}brQc*4WIZxycf3v& zs|d6Ah{GcgwyhJIKyTG~v9j{RoMe-nq0N?xv>_zYw2{^Na%tP7;Vav|D= zGqdJqo~5OSLYX-^^fs}@M6U`bRwqRNGGzY_`bJEWMr53Ho3p~G$4q@g(iu@=UxW;C z(Z#FiORUW>4D_=Z|AXIMg0JXxFOy#YDZb?4HCFGiTxh5nRewwoZ67jybzx@F0E=*P z-|2YltDWp(LLr0)_jU3eIqlTRqWEVj6gKCr?2}3{A1SYTc$>;TGo#|GzN^3yNl;;W zU5-PID4kH4Od;l#ht%Y*a*cHY(D-Z%wd33lLB#iFiE%Q8GK;?R7Q{BvtI^fAiQoTQ z@Bj6sQq`YHY-&X-qR2#F%#($8%%_I2sb8*EegsKFv<+>Y>eKeIQ93rgBgLq&zK{Ld z&j%-^a1GAL1Jqzh;gNsK{8cr2OyKGa!Yo1FRD4qpp`l*V+6Pf||5_XDIZl9e+~X zg`02&V#^-DGkbABHVie?pNZ5>2)PPkjGIRX@{EtPO+O8K)9RQI@E4b=B=#SseLq2T zo&V0QBHSTXI8VT8qqm>07VV4VjPLCE3viK8G(lPC@Scv4)6sy-5cdtN>RzN2awGA- zuuh{K%Ah@{kV{^Zjx(VOszeLuPx0v^jN6shcTTl(@NgX~{4YqQ1%BpO<@Bf<5_GN2wHhj zJ8|1q)*1veUr7jQDZG$5a^e=%-Rh(%~$lBj>>cO--g(ry>pc`&=qCyVpw9jV$=W zW{OoVc6LIhJ#>C$dr@jn^v>aH2i`k%o27wmIs( zXNhxysApYpaH0)T z^g~0S12bY}hUS2mL5^4_%KQvOYfq6_C$)VQRpusZ9ndkiY?>v$b1o=KRL=P$-Z}*g zecz|F2sM=N>LdY(FPJY%0W(M@m>7Y=#L}4!USE&POzJD%$Lw;x)w;teYrue=JJ%e^ zg{KbZK?peyUk9@P76{^0vRBv?X=G?&myp^=A*{p966SJ%pXmA=6t!0xu^lH1Prvw! z6#q5RBS;bVe6b3SCRQytSQ-B~;Nlyd(JHb_!Da6(W?UP4ZW z?OOD2;w!Il8bZFNy=Gi6){ygOdU5+536w}P`?&=4W6c^HQ-$pg2oZpcV%Fn47`8Vk z-;O|01wsxM;+Sg8z(>qS^Q#`7RVd43DsjzAza_6L>Ewtuf`=eBo`lEHof)3l;V4@` zczG$Td$c-UAt*nBN0L5uC^9uv#NxUf_5IJ{^7ng}rJja^qHy(rdN#D7Qnan~MCMU= z3GUu$G7VUcAM>ysJ<1dljTiin{^q@J|3lzF-eYY=qX5!F9us>pby1j}rQZJvE)no@ zZ^NqP%WL(98+#bbHZN$HcKX6dOcWnD_Ya3LZ23!l5q(!I2-O~Grfe* z=Cv9e^;<69>PhsQ<`|9wtxM$$uW+M0vqH2>*zDd8PLpi?;H(qidG z4SBwHUi;akj`#6&>J$;79X$)NcCEvA3Bj6=J7zoW5;C-Z`TyXNsd7)C zkrzrfVQw$%-l;Z`k}G04a%tEkuY2BOlkE_r?vM+cZjTZVag!UIT@+_#0-Ss{|L2A! zY7C>(sBuqW+g&y5%Nem@z0(LRS`It}nuqCkjb4K=KJbnT4kpheOIbi{QFfQaf$CRR zExv0k;N|{y*z*m`kHbEi<5ec?a9qlMDgPF>H_qt4L6D6v68lE3D?DmqTYzGScwRiN zrgxyt!tw4yha;O%*Bnj7pxvw2gTUZ_k^v$1@t5sD%8twMzeu>>`|1yco?BZ`n)s%w zzQh>L%5QhtYvRL)j6eR5T98Glrxx1tP2EXDlI++jS6zYafoDm8ji2)u|Rrg4u>%A4Wn;(mGiY@(%b7tLZoa49pql0*l@hBb+ z50UezZlsaX24()F(pw;n$CJ`v_T`*Dx_$QAnm@DaNrC_GK&SZ2-i)EtJR~2kt}{wX z@@Ru*9qLf_RK{;4`oG%1>k#4LCPUxYgKz79vRUIjyT#Pf%z5$L^D<|T+bR<*!VY{* z-9zj?{vkrEt#mW6w#{gk=p0;J@#fIuS{S@1j%BRp$qzg;jS8w%Zr1F$KL0=Z-(U^kZX;r+HIq zk#eCsrM{nv;}t{3D|U6C=;bQAu|z8CSZsY}VsoF>lz)cT)K=HLt{+f~6}(Y0z)$PU z^;6XrHB?g{aS6riy_dSXY=ZM{N+ej2s+FrLzJACeinPphwK1b5`eC7xN6Nt>o@0-_fhH!S0fm6e%%ltuZ>dFpOqbdK_WfQ>(Iv|aBk*KkM*wSR3-z_EPpxSWvbTNsE`4^ zVvF`hqbB6BU5p>yp*EP49dFMaOYWhtH2o6jR##ml!2NTUor-9dT`%R??cmQ7o8TEW=*?Q%O$`)QMK&eGCkOmzdP!x|NkyKgSmn{jdiIZH z%WKLUg8BFA^md4wPc_XLo7uD!8%Vx8ingziZfu32c=_-R2E*WsBs|fJ9G`Yl9+ z+RfXdbIDB<*EYS5e?o|&XE0hB7=Lnaa`w{+a4DH&!{PLYd=}TR-8^8r;|cjJ|5Npp zwkgeK=m~DRa}hnId#vToMGq9Wravc>y5st=C$G@15B?385R(MffV{UMtozhNpC|U@ zJ&LrSC8Tqjt?qJvs9R;fNyY0lH=pL`5@8f*lNSEgZiK#mwgyR*B1Z{<7VwgDpQMU4G_G26lV zC*bc5Dt_MU=+m#__E!7Hj^@N&Y^Cw(E^I-#ozIH*v&-K)o<9B{IK=%E>)RdBRh6UR zC%M%A=*21JPjd`5(4Q&E$2|QV={DZzz>P;M6%R%qgwh7W^I+8JM0a#l`>+g_XQuY( z0;TnQJ4+kkTCpNqHYjvqkLAHq3Ra7pC3C6*{&P8H=g2yGb91^@uTu{CgqlLP&+HR} z>%vzE=YvMiE1ci*b|_bKkWYI?$4*B^*tO;59|kk(x!G`++}&Gd)VFiz00_7B9;N|| z0T(GaMeYT#E@-BWg?In3yj78`=`-W{)o2*rh$l!uZ+A9Q{^n1wmAQ~GcrZk|syLIl z7S6-jVy#Yw>iihnk+7re4I5&Xu}MaFYyBSV4UawbT6`N-JkVg8klQ9{esZR~_h|yo zw~Q#=oDx)Far5a6MuXg5=KIMBo|eE+`5ot2)C%Z0|nE3rC|^f~GG$pO46ir-L) zNlyF#tuxhBhH>$pWVQWzk)TvNfD0%*g1n7nTprE+7xyoTSfUpA-`Lv4z;6n5y{&D} z7@J2o9PW#uUGUs0zxSUBLhFqq6v(9RUt&C1CUp&iT=0TK&S%nV zr~g7m@B&G^klA^R<+WSf5J2C54P`jagDb?UdZ~Y;!tbj6`A``b8q%Wl;sIlugxp7x zcJTX)El*`9*}6b0>aNK?@>s3xnUPIaUIV$83@o>%vqvfUdgzz=Amf##njCQV?iG;c`1 zWKCm)!F1`Io@Os!qtV@UBiAwmMrxqGCt8{e=LDhV}ILn>+ z=IM!MIaWDvLGxRsEq3ohSsVKhk>4nm*GPHae9ZqKRR8thO!+O3Y{ z!Ii?TwNOl|#{4kAGIE|Jjyk(n=kkvV^#48kMPPkF&?rPnE_pSq`S_LnPQVJlU0{SJ z0W9}tahOf4Cl7wk4L|ts@sc;vYfL9VeYyV<;Sh&|(RXJY@}P)T`!7?JV2BB({MX3T z`AOk>nu84qZA65f1?ES|a`T&=I}?99YCny&LSUfd5Qp+|F$40S?qwS}^>p)mc0nqy z%O;_Sa6+3HOe?8=-!KlqlLGINhH zeD-JKNydy7@wCZ=jM=;|mRc&WZpij?Q}m%P$7sq8ysu;@;(__X2GPH|--U_zU_HYG z{8S&s6bo1`MU#24Zvlpwaj3>8cnmK{jD@cEF}fPv`bR+UMuMCMl%op{TC8SQLGg2K z^`(iu%uURLnm)49F8k#y)Ar{dCfR?>3_Lj(prUkee+CQW`x^;YMa|j&X`$sv8+hI17YDf}IhI{<^_6mWJ44AD>p`QRzKghbT_=T)<-C9w7$5458B z$Hdz}RkxurYA0`ekk!-0PG}aw^K{Eaf89mK*Wd+X*1lK~a0I<9Qxy5t@}K15|E53h zd#(TO|55tuylR8i@R?M@5~H;Dx}7Y!EP?EKl=sNCA$cY>*y}@ZV!XVro78QND0XCD z_VM#{M)oUidMwMgxudK@-=^=jI#|Xg$5CD#gR9^S^c!qNtcN*x-j#wgd$2)g;YTPi z$l|61L=OoEi!hH7b?kS=&z2vhYag7FURFpEkD)6n4T%(a0| z4WgJ94GjYV}Z%DXRZC13up=18wlp1!-&_;e%d* zl=bFb{BdDvbbk-UCg{@G6mHm-h5K~DGU+cu$jOAKH?8LBUI>w9i;jQ~TnqzY;LWpr zI^I3j-nROpmAV3`WoRZ!!@G77@JFxd+d3iy(f9NEfxX2oql*|tD2loQ6Eo2-2$6E3 z1>8aBeyy_yJ$!BRAB-OXY3<}ai~u)qU96do`XzXC;h@s&1+C5y@>A~yDXWE*+^-yH z=Gxni%H7GC`&UmAi!#dKz3om0DIB!k0EgrGy_cqT*~~mP-@OLk_a50BLzT=O zGK<3+2?eO+=FRcPSg20`x*#~qi8u7{VdVuh!qdfVRexx7aeuzZQUX7>m*3ube-a+X zPv@=&UqyijE05tV6<5M_4{MTV0;4gFM;_D=|2tx#AhJQQ(7`W$q;n@%(2Vxhq)^XS zQs`t@O4O-b$I0lWUF{J*A&+?_WcUx9u zqFE0YQnG&Fzd*U9ef475;~a8smHMXlJgyU#lYq4--f!aO=`YG~tAT!{bxmOL#J%(eNHqtQzn^y+TH}tMduVe^+OJv21M8iU*C;*55H)2$y4ZK+Pw9@u%d@(fL;cV3}a3$hqrO+oTPqK$WzS*J`bh?Vq3LzzA!JB0zmOrFTZW9%%)Yf2{5GFUG)^^KFx`MI(*i z96W|jItw(2G!rb`_K7&mkDzXs8Y<>bH?bA$Za)$#1D!h~mT5*wm9Y~^W1}*El@nYb z1M$9bU&{H08;Qmh%C(vPVLg+j>U@m*i;|Ar=Z&^|;+hUV_n15122h=TE}nAjQDeoJ zCpuTxX15FF;oh+MGZn+{GTC$aY0EMGd*b47+*EFa{?GUA0QnyE#zXR+?P_b{mH8T2 zUU|IdTypyBd1g4U-`{(o5f_ijjSi6Mn`v

    J&5$7MR`iaX(E#}R7% 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 JGY7XG|1SxQJ1qbJ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/montage.jpg b/ImageMagick-6.9.12-44/images/montage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a572d8423fc9c80e92ad2b8671ab990cf113eee8 GIT binary patch literal 2594 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/objects.gif b/ImageMagick-6.9.12-44/images/objects.gif new file mode 100644 index 0000000000000000000000000000000000000000..45835b62972855efd550fd1eca56880322283091 GIT binary patch literal 1013 zcmVdB2Z{dDwiuH^9hYkoYJbbO1)~gMh^E24vWX+viXcotJmzd z`wfrF=k&V$j-O}q{AEhj7wDHFSeW!@m^g%}*vRt-=qMQjIcW(~d8x_5xampK`6>F5 zIcj=Qda5cDy6W1H`YNl?I%^9Mdn=o(>&n|32I)mv3#=uKJk0rP%#{3GEW+Ge1Z_RN z5ly{#-K~v*y`AGt9zOLgj#Iu)7$Tg0#4fK)iVpu$9?|V?PyGJs4TUuj=I{+Xb*


    xXj21IHJ(%yRcX<4OPyX#G*sP8u3H^` zHI!9rLmgEKo-GtsY}K|5$w3`!bZ*xXZw19QxtA*4Y)@pQ>m(r*5n`0~-1A3%?;Jh;{8)3;r(eYiWd@4~~2H%5NDZ?e^~TR*Qa zJudjY8kQga}cHp@az1 z$6AIS5-6R1;(SQre<6xEUWqF9HJ^a0tO#Ra*`e4>j5a!WfQ6&n$m41`x_DuaLgM!z zhm8!0%8=0YpvnA~Cx(r_% z@5InV{IJD3DyVU~0e9^2xgh)a@yHtoY4W{HraZ8+EMt6`r7+7i=gd-cYje&z@62=0 jKK~4K&_WMQbkRm1jdapVFU@q*PCpHG)KX8aMF9XiS5^M? literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/objects.jpg b/ImageMagick-6.9.12-44/images/objects.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d3a276de5b9da0a8cf5341c34c3d5aaae7664eac GIT binary patch literal 3518 zcma)82{aqp){aKa(U^OysHv@*Y78P=HHM;Us;PP#B^vXrLD3dhB@{&|YA8yhS4^Si zp(qkDHZhMu(IQH#c)b7hzW-nA{cFANtaa92`|P#9v-UareCO!X(F_1=YydX^FfcFx zP6ps;9H0vTo;tzF3_J!S6XOY3n3zs8v9hqSv9hqTvT>Z@U}NWGXJrL(fjG~A!CYWA z4sIT9Fwe0KK57B5vjEDD6EbiCjyeE>$C-i06vz30fr*8c`7|T&cu^Y+U;r{Q02zR+ zOhDF?5C*_0AmeE!E^cNP9#K|a1wJuFh>mSg)eygc+LN^Evlg$#l~k==1EVU3=Z~lW zmXo~NfRBZG|2=MMWzGkvCtCPA8qj1mEvDrIRH?BoGZY8jAv}a%;1n>@mwW+p@Z?s+ z9va=M0o#{~SgCWVf9eh-~ksWmE5^7V)cKw;2apg z8}Pw9Z7sRSdSgt`+EHcL-v{;6zvJsS=+h`v)zYJU7LA?L?&c3ex_T!YMxDa z`E`3g9UJFUF!G=^pRq>&slnE3ttl7=x=*w%c>B=2o_L5dj#HSa|r zK+OhVHa%^CQJNHlFDN)UdKR!7&u=FXO3?>)MApxI=CS^BgXm^m*X zK3f`B+1;|M)FarG@GM=S#i-4G~Glhw^af{eMad31~ z##$40{<`igx5i6^n$d=$a&-&TQ+y6jtHV;Z?YefLmztL%P;@N4@1AL8O)&S=JGralxTK|-Uw6# zMKXiQxM)+rXE|w3u927RJcU&xkAj-ppGEUuXK1HLX_hN5{H97%?m+lE!WRaGDjQ4u z{w}YSt?>_Z!0NjjYff5K@VT6A8__T-ssXGl&<_z%&zlfKO?M^9&F8IN8#{bXCz2xP z`Qo1)*KgQN$`Z8o7*rycvROg(o;a_~WIe8P&Ld(7J|o&xE7G==_+%JR(H`;Rxv|tkqL5e1r*g zg*e6DvweBo_1vSkHu(6DyMAstTSigixa$EXaChyT-kD}D#Qj1%eP8u276;w5K;t4c5t(FstKO#c&kB{i%Hde0WnbTLx$M>T z53}1k->J{X)1(+l<$a}k-eG5ym2n!9*f}9_x?$ejQWZGj^i1N7_oZTDZ^I*M(6Kj` zO1Hmj-7JhQOB4#Bb2tV!JMTJ77Y~k6DigBTAM(`YZhcv&_r^+tKDol35F3g^9)
    jb|HI_gR+%PLVM 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 Cb3$bR literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/circles.png b/ImageMagick-6.9.12-44/images/patterns/circles.png new file mode 100644 index 0000000000000000000000000000000000000000..a2de169ca421c09f4af6a8985474cf134f681919 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q?UTRIEGZ*dOO3BuR(!_Mf2nT z_+!kRjx4GCDjDg1Zp-DwdX`QL;u1|0%QNYV{-1GbSKRlB&i6m9E&Ay2_Q#jUDXD%| z?(eSkuQv^lsM~(HX=m!srRUEHDd;dBf)R}oQR^i?)n8c)6z^F0>h*lhw=<*v7lrZ6 zp8Ki%^V;8CZR^j>4*Pv(^NjShA7`d>+O2J7_^fj)yKY7>v+ZQH$s>%I`*p`%g0S=KLI&L&gJ0s1d!7V2k zePL3iGh^yO2AKSQD00000NkvXXu0mjf+~QGi literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/fishscales.png b/ImageMagick-6.9.12-44/images/patterns/fishscales.png new file mode 100644 index 0000000000000000000000000000000000000000..7c310a668d26cd59ddc7dbfed55d05d2bf2988a2 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q?UQQIEGZ*dVB36SAzmi>%+6( z>z`k4RghYAyVc_6ORZ0<7o_~*ayaH3`ub?uCc95R5+g%hQ)-`npA{qLAbPvqY{Iqm zc1xayFZs0ee&lUy#*}Zj-fu}yJFaRk`9Y|zEavm&)(4v(Pt(6_-F&_;dfwcl=d2z( zpJ@uWu|ECqW+dPFbDt{8rrq7V`9@?rQ0N_Ysq{bWW_pb(##@hm1-h8Q)78&qol`;+ E0ERzm5&!@I literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray0.png b/ImageMagick-6.9.12-44/images/patterns/gray0.png new file mode 100644 index 0000000000000000000000000000000000000000..df63edb93e7eda6f11eed5ab58bf9902daaf2af0 GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sSH98VX=kcwMx4;nH8d50E!_0Q$9 dUjSr6K!t?r0tUu8URrq|zNf37%Q~loCIASa6Bz&i literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray10.png b/ImageMagick-6.9.12-44/images/patterns/gray10.png new file mode 100644 index 0000000000000000000000000000000000000000..24633c770f323e5b9aac19f0941349e7fdb67920 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{RE?*LV@SoVw>J#=7!-M!9sm8$ ze8+03>a|(SdTMH5U_?jpmGbwd=9{0b`n~!8`%vW^N3Uz=zVyXgua`R{wj|~3#e4di zd$U?}Jx<B<$S{^pj`}}u6{1-oD!MLI&H5iCEU;Ovq z-(KBOV2R^Fl{>~B8b=Q*vRps2M);?tbNT;i*PqY+yzhH*zq9y~lo$KnwqE-kU{T`e z)wV8^edA^uFjFu4{hw<2YMEUMs?OK9G~bAn12dm*i2w86`QZgtP03x$WRINt^Z?9U fv-j}-H4N-GKgYee9QrK_=pF`7S3j3^P6e literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray20.png b/ImageMagick-6.9.12-44/images/patterns/gray20.png new file mode 100644 index 0000000000000000000000000000000000000000..c8981c24b0a05d04439e68bd6402c36723c745de GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{RIR6rV@SoVx7Q504jAw_2j2gG z>17m$$ba8O|9KC!_%w2yKQpKJOlnuf{+XY@>nJVcjtV;R*Z%$XKlA<<$GbR*Z&}jO z@^@*f*u)F0x|&J*%PaK2YFrNeyJXbu@uF#($j1BDd-Smg+FZZJeEVI_H`6#)9-u=Q NJYD@<);T3K0RSM2N^}4K literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray25.png b/ImageMagick-6.9.12-44/images/patterns/gray25.png new file mode 100644 index 0000000000000000000000000000000000000000..867391b434ce5ede978467c1e22ad498db784ffd GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{RH~TC7!-M!|NdXT z`@7bqLqS4wWZD#LRRv$$XwJXB2}E| z$9vws`|PagPRV+ER8Rb_yskL=>vlAWGb`WjEBbtDFHnt(tftAcLvy6&)r-wG)o(o( iQ{g?~`{#9sx$OPytP>1W7L)@W#^CAd=d#Wzp$Pzc=u6Q6 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray35.png b/ImageMagick-6.9.12-44/images/patterns/gray35.png new file mode 100644 index 0000000000000000000000000000000000000000..6d5834330756266bfcf44779487705de60e34823 GIT binary patch literal 217 zcmV;~04D#5P)Nkl>SpzhB% z=EFTdbf*;>^WayO^=`8N!~gk)Y!;iPuvzu+&;ER4KHT#|cUqw_7v`z#f~x-jeIEg~ Tg6^Ul00000NkvXXu0mjfXb@zB literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray40.png b/ImageMagick-6.9.12-44/images/patterns/gray40.png new file mode 100644 index 0000000000000000000000000000000000000000..f079c9a99c9c08986f6a22015850c56ba064b0e7 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{)EZA0$B>F!Z>Jb?F(?W!fBx@Z zeY8;HRFRmN@EI{@o@hz4OXh30zL5XB@38EulE>@q6b;3*e(irza_!~0TNkg|-rwZ! zai+CaW3R)tmLoAMF7@vJ1)^X6UvxQgxpnrHt9S41!>htQ{Cmx5kg4Ameqo9f7Ajuo uW&ZCKh+g);+b@0YyETE~<<-AID(qhJJiWg>XL%~n-3*?telF{r5}E+P4rdJj literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray45.png b/ImageMagick-6.9.12-44/images/patterns/gray45.png new file mode 100644 index 0000000000000000000000000000000000000000..3267ae34afff2850417b7092ee3e2461ab0db577 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{)I?7g$B>F!Z>MbJI-nrn{Q19q zZu=!i*Ua`w+;;8m9Og3OJt|wTeX;rCcb{vY;`d)p|Jf|BTsk`cFIVT%fN#8$Uffq` zevGnomSa%>?-#;C22m1E19->^MyZ-R^8`TIqSy$xw(Eq1Xt>Ph0cGx pMJxOke%}RGbnNBi=TQBB4|D%La7vuTS`_3s22WQ%mvv4FO#l_%RP6u& literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray5.png b/ImageMagick-6.9.12-44/images/patterns/gray5.png new file mode 100644 index 0000000000000000000000000000000000000000..baa3bea6e29240935a98f3d0a1fa6600082389bb GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{RDh?8V@SoVx7QAGG8hUl9r$wp z%d#fxPnTO~PX8fp!~Vj+_){|5r+sEC|G#hSY5TuPmANwaf2ucsipihpx{@cdf9pqA mDJ*`tKj)-F-0k|8Z}dBE9P?1SJUa|%HiM_DpUXO@geCxU4mIHb literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray50.png b/ImageMagick-6.9.12-44/images/patterns/gray50.png new file mode 100644 index 0000000000000000000000000000000000000000..ec34108acd801469500fda33ffb5406c5ea2d3ae GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sSH0-i38Ar-gYURub@;3#lp!`uBY ze~Zm?Ri4Sh{^Q-dz03FCl7I8%Q}fbq?AEH?I-7oxLH}i7G+5_F!Z)X^C9WdZIGUvbj zuU%6v9c(Spc&;5K@;Jr7LQqY0<*EmKr{f%j{)#@?pt804$?QKZeM<$>AFj#YaV~Z3 z>t%xW$Aqn>In8O^+;eVM@$=mO-=GR~7H{q-6gzh)(m7(%E!$7Nbxy~FIyM(vGfz2} v1Qf0NrF}y2f8?L^hdTB^vnN=-cCBGZs4LD|y5(aA&~Xf&u6{1-oD!MF!Z)aF@9WdZ=e*0Vg zmh7%2&c7skRDT(9C>lk+Q#M(xWxQHTNr|cc{o|4si}j47&!tX#@>(+gjH__k!8K`V zduP3VR{if}tr>UP)}KF*#e_Wj`)E?X`Ljg^+-ar8-W}YlEN8QBzV)XjSx@UY>(`n+ zhT^S}2CHXBHvR9v@@_MbdGzopr068C8;Q#;t literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray70.png b/ImageMagick-6.9.12-44/images/patterns/gray70.png new file mode 100644 index 0000000000000000000000000000000000000000..26a497b8bc577545f35afbf2fa075a2f52931b44 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{)GSXI$B>F!Z)X^C9WdZwp8Mb4 zO4iE6S>fG-Q(DU%IVSsVGU)7>QG7^JZaY)t3EAR@>XFF{_-CbDj4YjC{p`^1l(oB0 z%>nY{9p260-o7I~#^mIp&94;7&$OQ3y-R8HZTmX^O)u71fpm&}@9tKMED4i+(zml< ucD>T{op%hymu-%7Lf0AnU%s@uo>9Lv+JaN!;~JnV89ZJ6T-G@yGywnuxmH&I literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray75.png b/ImageMagick-6.9.12-44/images/patterns/gray75.png new file mode 100644 index 0000000000000000000000000000000000000000..059083bc3e1e7c5c3b3c6a0000cab53738d92ef2 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{RIR6rV@SoVx05#V9xz~NzVyG} zuiY*{jhmD0iR}F1b9>GIfBd}m$LT#Yj@oh?>8BN*Z#vT*d1tf2=OnT3IwvR-X3+OG WY3C?eH}5ylAq<|belF{r5}E+}N=lyq literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray80.png b/ImageMagick-6.9.12-44/images/patterns/gray80.png new file mode 100644 index 0000000000000000000000000000000000000000..50a1e98bb35fa943fdd734b3a7449fd65afd4cc7 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{)KpIw$B>F!Z)X^CF(~q|^#1?9 zIhT;|-l^E~~1w%9@^@efG1i=C`VQyZ*?eG4 zWD8g91yxh-2i0O0*L9p)^bP0l+XkKF>6uN literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray85.png b/ImageMagick-6.9.12-44/images/patterns/gray85.png new file mode 100644 index 0000000000000000000000000000000000000000..4637990239f67c6c5d9287bd48be7c61e66444ef GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{RF9{NV@SoVw>LI&H5l-?2HyVv z|G5>%qUKLVDX(@mAG_cgr>~g2wp1ax&+uLU|6f1veA$!o^vvt2|KHEeKB;B!|NZ8F ztMwx-=Nyf+J@e;Y-Bszi)7QwHd$dOGOytykDNhT;(!VCm54D6UnXy@`_T;IDI_F*; kv^#CLnjJ}D*g`u-=XTSn%a3Y{0Nusl>FVdQ&MBb@0H+gK5dZ)H literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray90.png b/ImageMagick-6.9.12-44/images/patterns/gray90.png new file mode 100644 index 0000000000000000000000000000000000000000..603bf4fa4a9c3723df9dab5c9ac1ee34e4974f49 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{RKKT-V@SoVw=;Hg9Z(Qp+5GRn z{cI)vzJ!GBJ5J41+ZAy#&Em?O&lM9wwm-RFGxN}-!djKRg0J_Rp5>DG`cLaz?fbHM zX{--)=3G6zLi&0AJ*(xBb{5>}UlYzoKKVW??I%cvxj1anWgYoBt(&VJ*lJt&Z)PeG zJNK&5Qu}1)H2!mkB5gm+6MbT$&5-_Zjhr7#PgJ9<;P*8^r!jcC`njxgN@xNAiLq1L literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/gray95.png b/ImageMagick-6.9.12-44/images/patterns/gray95.png new file mode 100644 index 0000000000000000000000000000000000000000..44e4234a70f8a27e72bf3113330b48478488a28f GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~i!2~3;J-sS{RD-9BV@SoVx7Q50S{wviF23FS zf9`P~UY9=;Io`XTb#ZnSx6NKFfBw(?e+Q;>Xj>ebCHeWUjn!+*YzYqS9q-l{zyH1a z9M_seg*6A}il)sKjX3NO(P*u`=k=NcQf!B~?nEYDi)=LIX%XGA`4Cox`Hv1uzC8N4 R;04ev44$rjF6*2UngD7LOAi15 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/hexagons.png b/ImageMagick-6.9.12-44/images/patterns/hexagons.png new file mode 100644 index 0000000000000000000000000000000000000000..e8decf79633c5fda65aca0049e0b240e30e1c3a6 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q*i;nIEGZ*dOO3BtHFSW#r)|1 zdds-37mjbfOu2SvWYWx276DCUiv4}HnREU`7<33@;5qj z(iu$;u5)X>)dOU;F8OsmKycGsR+HdGb)R1AZ;-#4%aL@a%^|lla|6fCb4*!LiBdXF z+cq~;ZDQj#E#!Uc0%XfY>Ra=QDawB@PhEacDP_Cj1oNd0K+`INxlWXcO$awpIChT7 ait)CYxZ#62lk$PiX7F_Nb6Mw<&;$U0l3NY{ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/horizontal.png b/ImageMagick-6.9.12-44/images/patterns/horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..05ffcf5ee8a746a1ff6fdd53a6e83861afff3994 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q(VJi978H@y}fdflfh7c=|Ie{ z_m%5ge@qaVvC@GhwmbR$nLFn`^we4(@Sft@ex7SaqC;fKk2MXFYC{-1b&y)Dpk)hR}XSvQtX zt%!Nz3{;?6;u=wsl30>zm0Xkxq!^403=MRF$iOtjz{1Md(#qIe*TBTez`$ccmK=(P c-29Zxv`X9>EdO3w1k}Lb>FVdQ&MBb@02rn^9RL6T literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/horizontal3.png b/ImageMagick-6.9.12-44/images/patterns/horizontal3.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf0c747501949c2f88297290edc98e28e34692e GIT binary patch literal 571 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d60VEhw7A~^{QcOwS?k)@rt9q4fi4gkScDiFSQ(pG8Jj~iFu7_505zC_YykS*3hcM! zjMBVph4RE=g|z(Ayc7kE;?z_Hr^Mv!^dc}nIX@@ANJk+tDZeaLb5~r@0%;TlnRz9tMLCJdsqwj~ zB^miC3WKoorXQq^7=wzg3re~Be7@6rP7#bM7eQ>%Fs89u_5F9}j@kOb{ zw&q4U3YBnHXts=K6_A(`_+WYhA^EdJ>iBTKIB0J1#T8IK7q0EuwUJGW@_ hi#3Hn)&xE#ae?_ed5#G`I1h9TgQu&X%Q~loCIF36OGp3! literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/hs_bdiagonal.png b/ImageMagick-6.9.12-44/images/patterns/hs_bdiagonal.png new file mode 100644 index 0000000000000000000000000000000000000000..f91cf3e1db612a26bee692caa3f55a9a90aaa2a0 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q^dk!978H@y}h=Pm%)I8*)ie& z+>;C|bs9M?2FEqV>`Px3`~2OHw}$%?Cc6JT-fw%#zV1!nzmLiNA6dI?j*06OnQu0q zZu{ahx0vNz*YvLz5JJ^rE(rbj)8y)xelgM(N^tt6gOJ_+go&3Uo8(QGo%h$!RbLNu O1%s!npUXO@geCx@SVW}& literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/hs_cross.png b/ImageMagick-6.9.12-44/images/patterns/hs_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8c8c7e132936d54f9698e55f96e0d6e887286f GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q>?;c978H@y}hQ$cf^5*#qsyQ z|Ic~5`Ia5rq$R?ebMoRl%k;FgwDSA!>%W!%=bhhqRQC1!ueIfEjS(<-=iyw@vUG_K kQ7AkrdoMB(q2M611^XOr?O8`o0c~UOboFyt=akR{0HIGij{pDw literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/hs_diagcross.png b/ImageMagick-6.9.12-44/images/patterns/hs_diagcross.png new file mode 100644 index 0000000000000000000000000000000000000000..187f0b87576ae6ab05b3a30bcc2c5c7d63d9d88d GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q&hrZ978H@y`8q3>wp2zk(~ek z?c>|0?Avsu`61igDP2AbIZ|Cby1p9;@B2Jy%Z1NvDnHI;@4fSNZ{8Z?KZo;EKCQO? z%=NAMdGgPSgEPZtR34mp8;BpTIrc)wD!c7+WXZKNU>1JSHEi|_JC{C)vs`c426PjH Mr>mdKI;Vst0E9zZ>i_@% literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/hs_fdiagonal.png b/ImageMagick-6.9.12-44/images/patterns/hs_fdiagonal.png new file mode 100644 index 0000000000000000000000000000000000000000..7b2f08ea45cf7f6d072e11a742eb4905d2f5edb0 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q*^>(978H@y}f45cR+!MC2;-w z`t;>z+SQ^XEG}O7=+JTKsD{!it!b*9^%Y@LmwXl4SH<`9xcZ+t8##;Z?&PyG|2IGN zdDl(5=Z9@)-}}2X{qpYpC9HG5-g>EX7>2A?AAhN1)qU>PyOL=Sp-61*)yE}bb6wMO d%dJj-VCGD}?VSAUFf-6S44$rjF6*2UngE%XQ?CF3 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/hs_horizontal.png b/ImageMagick-6.9.12-44/images/patterns/hs_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..56ab041e9ea068aef474eb0113dfff3cbb733af0 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q#`_B978H@y}fpk^MHZ?>%kfS zs?BtF$hWhkX-#NV-~R0$fBL=K{6B;@&e-@T^7$D90c|MkmVCG701xvaQlP61lO;OXk;vd$@? F2>{6jI>P_} literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/left30.png b/ImageMagick-6.9.12-44/images/patterns/left30.png new file mode 100644 index 0000000000000000000000000000000000000000..573677ed0bd92d2f7c438b73dfc55ecaedf0718b GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1r1Csn978H@y}hC+bijaz+41H7 z{xV1AOGb*^F&*i8E*ZL>m(INSopZVV?sE~Jm+$x4Td9kEU8MQ-?)%Icm+l*CznIY) fIb-WRA{qRum%j1KdoQT~+RWhT>gTe~DWM4f5z|F5 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/left45.png b/ImageMagick-6.9.12-44/images/patterns/left45.png new file mode 100644 index 0000000000000000000000000000000000000000..7b2f08ea45cf7f6d072e11a742eb4905d2f5edb0 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q*^>(978H@y}f45cR+!MC2;-w z`t;>z+SQ^XEG}O7=+JTKsD{!it!b*9^%Y@LmwXl4SH<`9xcZ+t8##;Z?&PyG|2IGN zdDl(5=Z9@)-}}2X{qpYpC9HG5-g>EX7>2A?AAhN1)qU>PyOL=Sp-61*)yE}bb6wMO d%dJj-VCGD}?VSAUFf-6S44$rjF6*2UngE%XQ?CF3 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/leftshingle.png b/ImageMagick-6.9.12-44/images/patterns/leftshingle.png new file mode 100644 index 0000000000000000000000000000000000000000..b9fe822c3316af34b7efd79dc33cb1f18836b1e1 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q$Yd1IEGZ*dOKw!?*Rjz!>|7R zFSgo#Lg1jAm+~VPxdzeCs06Uq9_Yip~kiMxe|G+3sSu1;DH4i!TH~Qq;qm4o1R^G z;qfMxu;Z_0J1+z((doTv)y^wt+*qo#rhXPqy#^yN2BmM^ul-aJeG zwQtgzPl>hO>)-F6cGUXsrSD%Q0;VyfazcrQ^5s_rpIS>@`))Gho%_iX|4a+_`e(nr z+VJmj#`gVx-k!UezV`Q<%{S6(A8$S{RP!ye>Aaoyho5%^7w9ma5?Y|sD15-4D=KZO RtTxcK44$rjF6*2UngAFTWp4lg literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/right30.png b/ImageMagick-6.9.12-44/images/patterns/right30.png new file mode 100644 index 0000000000000000000000000000000000000000..b550d85231f1434d61422b12b322884ab684e89e GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1qzXM<978H@y}hEy$6(0Ad@$nG z|NV2AU9T!Kd$UPTb9GyMckXwUvpj$A`#)cEuFfjGwCwKk+_3a;Ag?cS#?+THQcKPp zTH|wEXL0hhi-z2rjbu0X^hLTI*Ew^l;C|bs9M?2FEqV>`Px3`~2OHw}$%?Cc6JT-fw%#zV1!nzmLiNA6dI?j*06OnQu0q zZu{ahx0vNz*YvLz5JJ^rE(rbj)8y)xelgM(N^tt6gOJ_+go&3Uo8(QGo%h$!RbLNu O1%s!npUXO@geCx@SVW}& literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/rightshingle.png b/ImageMagick-6.9.12-44/images/patterns/rightshingle.png new file mode 100644 index 0000000000000000000000000000000000000000..2d679f09a7151a44632dbbd3b271604551ccee19 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q!xI(IEGZ*dOOpRtHFVXdF}uI z#kT7!GTyvW%X#)r!Ej2$#F@vVl@@*8G3WW4)!!G2hNZc={8tUJ$rE!h*O?mR^KnNc zgYcnA8b_VZFPqZVd5Z7Xt;e%j1Gu{1a;^CUl)Jj&inrm>$7zfViJsFRvG+?#w6*<$ zC^Bd{TE=<mdKI;Vst018l9x&QzG literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/smallfishscales.png b/ImageMagick-6.9.12-44/images/patterns/smallfishscales.png new file mode 100644 index 0000000000000000000000000000000000000000..faf7405d3c7dee0e6b32780de0a5d6309c0e706a GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q*^^)978H@y`5&wcR)epa9q`Y z>*dZ%>k=OFib~GmtaM3;3{Bm=%(IFAkH)q=hqo-FRnHr)<>_U7){GiTnc`}Z#W$JsRpNP-VocOCOK@rsBz0kna^)78&qol`;+0LyU)@~S1S5hW>!C8<`)MX5lF!N|bSKo^J%OhXJTtc)$Kj7)V6OsotHgr`=oMA49& apOTqYiCaU`iNm5m4Gf;HelF{r5}E*&!#J`4 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/verticalbricks.png b/ImageMagick-6.9.12-44/images/patterns/verticalbricks.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d8c2276ed5c125d64f7d2ba439c09641ae42ea GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q$)gJ978H@y}jYc)nLHGdeN=u zzxHuvk0X&YFI9T~<(3p!x=||h>mCU~_4mbxoZoEPKh4fqEJ5c$M8iggWX79!D}K(B z+nt~6`|tkG?DyFm65Iw**@ihE{%<;c@3YQ^@1`t0tZ<3vkqPfB#cte>^GPU`m~lf4 P=mrK)S3j3^P6r8$-TXC^tgDY?09VPQD`d5`&LiFVfq8#rEUVAxZ%VNpAuwi3gd_`r+C z&-T3iEi&EvNyvGhh{(N76Vksn_jgP^e&thzw2*}kQ@d+{^t2@YRp0KkExpma%69*% z<`^LF&-+Lx+ZDGye`%in!tttHzB5oE(DYw?e_fAWE`On~HSeMsh@9wt`O;%s+y0X3 gfUU=GPk6vQ$%{k#)p@}>pz9etUHx3vIVCg!02m@;+5i9m literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/verticalrightshingle.png b/ImageMagick-6.9.12-44/images/patterns/verticalrightshingle.png new file mode 100644 index 0000000000000000000000000000000000000000..118c2429a7059a940c89e0a8c177ff48c94f0d42 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d6!2~4Ft;pL1q}F@7IEGZ*dOPhPUxNaVbNJ@} z|5NwOlu(U|Oi_M2@o@4UX6>l#GERoM@#oEhoOc!&u)i8V~neq9uIlIg;4rkfkR zivI|vrzs}u9(Z{w>T%`9IqTMZ+<5JAhP2Q`9i>UGDh^?H?;R;>O9_4Nt8?7`Vvx?K z|CU?UM4j(`dSR2%m${KLxz0dkE}J^;oH%vAJgv}g(<+dteL-06#Q*0%&Pjgyq~hp4 f$oP literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/patterns/verticalsaw.png b/ImageMagick-6.9.12-44/images/patterns/verticalsaw.png new file mode 100644 index 0000000000000000000000000000000000000000..b6579f6b71d9a78398bb5f5b7f9d4a1eb8796d8b GIT binary patch literal 194 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 DW&*d6 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/radial-gradient.png b/ImageMagick-6.9.12-44/images/radial-gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..a27743b9162d6a9cacd2d9c1e6e049fa86a55eec GIT binary patch literal 14338 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 F`#;?_7WDuC literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/red-ball.png b/ImageMagick-6.9.12-44/images/red-ball.png new file mode 100644 index 0000000000000000000000000000000000000000..b1394d1ed65947f8f0da4e4c4e936bbb54473b78 GIT binary patch literal 8117 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/red-circle.png b/ImageMagick-6.9.12-44/images/red-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..be8ca385f208600ad4bbf48f17eb0f18d08876f4 GIT binary patch literal 1464 zcmah}XH*jg5RN14D0?YT3kZmTuna?qK}J$`K!$(`J0K)jVu%=&6|5jrkVr&81j!!OJBiwV=r zVC~u|-C$0Bo0aL|@s7UfP%JK8ML7HIC-u8srb|{8*-)dnNsVq%o_TMo!oDPIZy684Ju$nd0Kj`T;d>q`I5iY;{Uc=>5 zBVl5>DVPcD=o?kV=9>$GwtUiy`|l-)akjO-#d2e-UZD5EHZF(YrIm&?^WA6I_op&c z1fUf--YcSVwJws17)~8xS1s>k^+iB=J&2DC6R4q=>p*W1Io)QdKW) zd0gkvL!+)SvT;x)Y_81}mRRao7*T=FOAfn={7gPlL7Be$9=?!PvHF@Qc)h+GM-KE& zBU00_WaM<*TVj394)&9zx=7`B|Bxo4K2FWnoq7l?O(#`-bXBtj)~(36yJLPy;Mun0@OE;9Yw6ir0ClsLZQ}M_f;6REbg-g4vDz8KR z>af?!_Al60)S*t}QT+LuJK}pht!=G6o&`&=%C4XTGG4#>{86%S-l>_RrCbh5Rlc=7 zdtD)Q(n!xSd$))vaN)$u)PO1sX|{JCC z^8~eaMaiVd(l3m{6_N$gCI^qhF18^m(q`?LAHJ&Qb?JOcrJwBeQeTv?Ou~as3ssX@ zU1)Dqy*_*wdau8-L0b%spDfOc*+lA;aT^AAQ%Y6MqBFrP_|o*g1)r_(HJaUZCI@kZ zUW5rPvtOHJnYEDDa?wii==q9?fLflf^cxcEnl)#N6{$jfy)lOcH8c4QNJPQ1g+v0a z_7E0FSE0R({&2J{DKq*PQ~J=9DE{fYSUeALc5H#ekY&PXugpC=p{wf~=}&a_Rxn(O zy%ODdWxx*@DP>0vO|oWxbPaci_I|J`^C%UTTh@9uQV~W$T4jL{Pg0J%ARcm z*|nN|LzpYgzp|1Td$DE${U$MHztTo;di%3-)vIav`!g-*5$K#OslQHYBu1CJE>1_# zkLcW%UBH-anRV_=WPE>Nh~yQdM-}EYf<`ta4SU>?H0Zf^6K8uIEmEWy?P}bDsG^dL zf!-bUGcYS>>3_XMZ(VLn;(4gZ1Za%^`P2zk9t8hi1APgB-~fIC=tCgJV2A-&&(KxR t#8ltJ)KDJ`F*JohV6C*ae+1$9fRLc8|0BR0UQXc)07xqb%Nh$z{ND#1u^a#Z literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/right.gif b/ImageMagick-6.9.12-44/images/right.gif new file mode 100644 index 0000000000000000000000000000000000000000..09934d9f008dd02ef80714ef3d2b54edcb8294d5 GIT binary patch literal 82 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 z zhK6$Xw)^|3=g6cXNuuv3Rj^!t2yE6G#7g0{qt{st>sw#P(G=f@%2bT6aGSsCGch1) z>7v=P>f>xQLHWdK5t^deLw(4D$?Bw!TR+UbZDL1H^Q|U0Iqk=aaduI@=guH8S16(F zC2Wk;c>wILO@uOC0Nh%WxjNbK`gOQEw*SY%LRluzQ;r&J#>)TucQ|e11P?I`t!Wh3=Qd0{84I?+Jnt^2e zMPIJ2W|roOK&czj@78SWEGcNqTUT=>x^$7i?tcvhhJDTjR`jMamW3t&QBU6p+fZ~wDUnk1jN zTA_Z#kG}eWWIvTHkyghKzT!zLV}|j33fB2_xK=S#OIlL?eGme2`|$kBPpa>qE^8k0 z;3Yrro=|=GT;C_K_@~vu1DNhKQ9*a$c;zSO+dah8)YQb%-9IaN1qDyzDfj=w5|Bl6LMi zuIdebZ^m|`}f%4w$T_KI4QOvCP83(|0G!|r<{X20}|v!N=YReQ|#2Dis9trP+v&~8YuyujF{>xC_Bne;mLDT$beSUIKac{8U3|WDIX59A* zQRDmWP#^BsOtq74Z#`XWv?D)rygLrvqx*IO$#(!b{~IVD#~9-30sf}8kg(?Y;NtUP z>oaXJyMJht?$Yc=bm2uSFppaOh4Vz=fh(OjKLN4+O7zKVhd6y1e~AYv(Ep?=f5^LNroN)Hm=+=dMs{-(pE;}jw^`4x zxRRl~#CfNYaZ!fKU~pF}na6~92OgSSNXx#0oF>}SiTA0`Xh6xVlGj3qWPs`Yir9Hg z1qii&1L5kleAnK=!C`XMetD|#@~Q0}hqk@>*fu|Ba0VoxoymI_~e%gkFP;toD z)YQ+PQw0YEjg_yF3AtMemcz;kjDP@d$A$tg5@tCfLd`VSQMkW2DX(p#?m3cQ{Qbe7 zd{UxVrndP5fW!ce59nJmGUpy7gP~PUD%Y%l6NX7~KH`na!jS(RLm)lJ0p$ey;U&iD zECCHUc%10y=H}KORO%e&f;2aO@q*5P&W|o`MtXoo@H9+g-_vC@h9rJzz7YKZ6)*ki zkBx=m%hu<0h@WZj8BcQEA^jiQ-Q6qxjUqTu7nNF4pMGo*pbGsPfM)XVK#_88b9vHx z0&swN=C0YzyVzhakGo#yJb{5nQ$quBPUHMJxRxDUSMR)ro~GtG4J|zljrS;T&HuOH dPN1i+cf|i^LBTHg5U_y9(#*=V3hAEke*m{gkm&#b literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/rose-sigmoidal.png b/ImageMagick-6.9.12-44/images/rose-sigmoidal.png new file mode 100644 index 0000000000000000000000000000000000000000..21a988f2e7ddb8d5c4fa16dbf417f72dd4942899 GIT binary patch literal 16733 zcmV)BK*PU@P)A5UK~#9!b-Z_67037g|2ng~ zw{fXbR1~p*4Ma`EhCTKY6$LexsENTSnpmQ-N5xoTiw%41VkNdnjJ=|gL=YLYWBM5}LktrM>hIDK?L-koFPFEg5`ZXIV>$tp z{)IE5M}9Fn1GW~T7X|Q3B1v>&Z2|0MkpK?J11Of_&FukJImDAi0Ok#B9ZgQHO37@? zj|q;UYSf3bdOvoO$B0cL2mnO5m?>6ct5}Y8q7&~a5@{&K0RZ(DnE*}3UcgUL>ME{p zZ@Rl#_O)@V{ac%AFAud!m>qEJ$(u`J=DnozQ41$X@p9?A=^gL(Sr;{^_n~NN((e4> zlo?60{+V*j|IuJsBx0-BjX04=Lunr3uw6_;5P&6s*o{dD1$e1Q1egasq@e)DeT0CK z0JZ{R;iq#@H0I$7Vm{{6a*U<}z{h4I5;0;Xmf#c;V52zEUu1|!B1Algf%|iaAWPMAfH*B$h!DCjJcUZ@03`7C zI0HD(U^Sw|bwKn$W6=vk_;Bisy?l}A1@KFvKcJsM5`fMC4yd#Fc|dEy^03`#0PwTv zk{E?)=E?A47Ofupmr_dqkv+J=mZ@h zi9RELtmR$A3K7Il;UFKU_rpn{AQJbevG@z4)IstBcE|A@8lq!y9le0>bXMbIL__!A zq`vsWBSZ2*n9>TPutplD|HV6qThvSJElMX(*Yo_(X|{MJ1VZVxgNgohq;w;6%q_Br z{-S|15I}9G9fxSBTacrh@;Rx!n~?NODyJ|7NbmfZ5W`Sx~LuBD)= z?YiZ>u|BmV(lDCEA`hTm0Klr#EJVo)t415x zzmlJnW=Rw$gzCFk59SwI4h6)cc5_%qT&b~BHnNk|zm*zDo?cG@WtwnF`*0@BrWV;P z`Nu_q$W+$zZ8TKti&$JKz6Btv@Ejm|*n5a!0ACDXh$;hg)-f4idn{I^gpK=5NF&&R z&^o-6{8pXV_+gzxmqG{RwH%tTe1Fw5N?zoH^KS|r5sp$J~ZKVO2oOv_vX;UJ5kr&?yP)U``Ms1 zW8HqNx8LaM-FN8z_CJ+8C|;a>@j}p+sO`lvfGe!ye+~Fn5r!y$jR26#cZl6MKuOpu z4kJbwFiIG(n+}lc)3AS(#^SJu1%yGw!b*GT<3tER>_&_T1+Z5%Lthb#(TJhF6o*qd z1z-b30$HEE!jxP48pI<`YRtx2c1t4+E6O|bPJCP0A3k4uUo5%v?d`V1oK+g#Z7}Zh;=Jg* z^lKvudKL8lko=wiTu4R?hM=!FOsB9{ z48;(#ViZXqwM*>A0ik0%AaVg3iXoyI_Tm6WBL-k$7$RcX1zZtjltNkJChfvB5ekUa zVl4L;i2#4Y&tWTn!%ccaN2!R{pOsb;%k^!~Wc4%N?$};lS3G(W$Ex#&d4A|Dg6>Xo z?$%b`57(ZnC-VbEe=KK_+(5xOvjGao9wa5=iZc_y6~`~)F_3kI8j_TiMQZ@H7>RVt zd$%Emb(Chyk0dYkj(a=L1`pDP7Dbk%?Fp+=Pj;S{Rw;j5{hMC#KkaVlvLxV@=fK)_ z_j<+~%0jt5Ghh^Y^K)W^h~+ME2mr((BvTsiOEWM|EMi$A6u>$jgi(BNQS^JCq8*MF z?9jdwPMfjyrk^Ul6!ZS6Rc7ExcjshxaV)#C>S;sUqJMX%4NQx^yR`InNhfua%=S=k zY)54Z1IUJx0Gm&fDH6ayMA8~j6=y}62!j=K(M$}%W4gr_bE~+3FwEdUF!jbZY(+Rl zqZ2)(c=W{vx&+n#E(iR#1(cksuxw0y^PbvV_sY|l;5XW zR&NQI=YB|xrGxeW-b-vZPSNLxT>EcG#DVl@Ql2=Bb$VBloaeEEtZKQ^i>{cy$4+)w zUnVud=$Oj7Y{P0EvL`L=>iq`Z(^oRA@6~-Cv&ZTlOGl zy#F&GeT}_sin}ySst2gWnB;bWEp{&T=~Db{*~NC-GJySGbE|0NKP%p^Akfo?j4AfJhXH{2O|Rtsku&0Fwa# z(O!U7C`|bRPmO^V;svv5)J15hy~Ol-5{bw0x!il(F>r7+`zUVPbuMV z0X`iNQThhV<2MXzFi&{aBg|v^z!8ecaNKXPv`99-ancRV320yGEz5?p>X@fb*GB4t z%EluRu!pidY_$${Mf3L4miUwZ%hDjP>ekS?wer5p&Mv=Y2~(!|bo9MxoE>z%WuOoH zF5*EW_X6YWMh`+)XPg=o9nmYzC3+M_S1d1jpU>WIcVD3tJdMrE|1ka0tj+ze{r2wm z)t9-IoQ)iX+@v}v376P&nn8Vx_w{nt+EAC?i^JZBDl4WLwH~+8{5k>Q+l@zzv9<0Q zHyd_UV%D~U4x^N&^9al4&AEiV#5D{AjYWv!a*C;GIO0Zbw6YUhET}A&#;>VpcsxhB(ff^GPD{ zqjAns*)J3)*OxK@1EXDlp(ndWY19CnX^gs1?=Kd*CW@P4pZ){@cq@veEaPE4SR79n zXP)fcy{3_!6~+fA^d05fyH_!OX8FOkN9|Fr8@^P3(@Ug6se)`3muV+&XjSw;nken! z+ssq)#>;!y_q$}kvD@^$>$x5``vygNZ1!w#SR?$)Cir}9?)&`%!>O`<8P#g2a`%ZN zjx>m2iL zfR+G?Npi`frA5q*Ql!o}BPFtb*<#WEBLJ31x5Wvm3LmEj>pA)i{S5aP!^9*0Iqkv~ z5yH4q}J?Vzf>eYtNm}N+{!sSqLGwnT#&Enar}a*Hp`>lvQ3%9 z9C=o!)s<2C0-Gv9 z&%^q8A9^3ptExxF>;nSl$xrUz$t=>gE7!$vxv|vQEdduxciOANM|6_*0c^4RXn?L* zQvkW4e>DK`Y6r;MjV?gRaT=EybK1MeSwafvL8 zEQ`!7$woGeV=LGS%930xmL@BKN(tM-ewRi_e$pfMg8NHV0KKJFsKrr&>?7^-kX79^ z#a2lltetRO62rw~I;ER2iNZvGfO;cVOcOy!q5vAqMoHtPMB{9BjeldDiq5*PW0U9w zNO{^(+Tgq`rqSSv2J!+CWn4qCBJuoVQxi*TtGQ%KdC!tJfL>GbHQl5>N{luVlS`fY zeR}F)R7|oYOYE9ht)!tdO?1BjAkVZ&Rkc4&CT%MvF*837hzTr9#PZhcg1D#ugL%T` zG_z__OOa9aAD?HI5Wu`oF8T12v%mIOtgh&s<*vus_xb){Y+~r|o~}PJ4y8lhM;Ec_>6ujbK~{d^6yyboKlJmz33c2hq=KL*?73BNh5=v=XK%kg_e&P!xIcqs(XTSA92RHvd`C0ax zk^jz;MUXfy9`SJAOt_1MVlMTB1)i)bR_K@c7$ax`HB|b`V?;}>rI`TV&Yb9s zC;-3}?Jqq}G`2t2_i&5q4M~seavlwZu;uDcY%3#3-8JKac0J z5AFxpb2iRbkiR12lrCt)Km$Q*B%RZP!$@*#8LIHG2+bVLAB*Jl2 zn~HfNgZ(ZRBFaz~iGWy?XDt0eBuW*|w%SF2zp409^mm=dQ}LJ=6WKK7|n zaB0-)+J+yM+wz|z$r5wo5niAXfNlT)BMJee(LZ=dpP`i@-56|a@b#@;`iN!~Pqe>c zdq|ci<`2p?%tkMa#xikSyr&joy_iKe$)DyJBpNJMS(*Hb{G=G}FO3NBtCH6-_uE$! zeZN`QW>cp})u*;e>e4ZKY0I-M3Puf3Td6lfzbZ)j(CVpGEQ3W6;tO6w^`?RBlxEf6 zNZsjaS!c0Hv2$H%R5{z2T6sw5Lt}HRku?h4NQ$dg*Y1i_5B8|UTkFYgc~T-vbMMS` zRCe30eL*wK$FY=hj6cy;TIrsMB(~O?L*A^P(m>3^bwhvUq&!8Mpt*9qu*DVMO+)Mx>#fnl+JB-7f zWo$rxK*9R(0dMo(@1=o#T6YX*V|?pZ){u(tVTJ>>Pzc~S+QE!8R7Ih%ijkr~|3-^2 zU$umrTU)2Q?eZKbd6=wbV_nvUou*ExDqdncPeWzF>8$X=MrjHgDQz^gVe#SzB}mjq zp?D>32AmK3s{OrK-^$-qAr=*|$aghOsy?wbWM-5v9C^o%jH})^D*h_& zukPSu_+|4uF@xrL7|@HovdGeWX|B8sE2u7gt|y2$a=hF?ZY3>3IhBZAV!FPB{beYS z3Rw^4po6r-HH#AnE_%T4vsVkn2 z)P}fD%W-Hrtw1E_MF`Z=9j! zBM~hfGj%~7=|z`RhoBaLMVRD)V#1f3F#=nh>J zljwvPDJ_%^vA@|S;iLg*tJ}l|KEU-;t-&o`k2o640_K`5%8&YMgz{#31fXS!=XBF= zZtykZ%)qvF;w%5?xLqlu<$1Hl#`(L(23IIK{WdR^TH%|hW$F3nJ9uDy}4XuqfQavhaQCpl6C+JHwln#5P zdu7u10iMBi;8y&Ftud~;WgC)2anrv%CZme|me`J8I`GdzPoUbhqM`|&XJ_2t-*q3Q zf8U=~H@O+VhV|oG1b4K)G zXodPcb)k!EkJTR9Q?XBkNJpeJ<3?qtP)&6Jy1XpU&d3pH8Wg=2^pg<=MS1pPvs_pYup^=^Jc&_$)C>4RtJ$d+DK) zn|wj3W<26*CL8s$`dWR1Yql~?+|=hv*&^QY!ESQiFmDr8$z@!OJl31$$d^SpTJv)} zUH^^GgSpRjKs*8Te12W5 zc9iKk`aM7o6Y~le_P#UN zm*tz)SL(yJrq^S6JHGhcEW2g+#D7*^yJ{V9z50a8q78E^Y(PbPo1w0FNk`c1vI(NU zqs*LalucH-u~XAjEtrmIPRBNpq`uYTC>HC~-}E>hWKBUF1sGq8cve|N=q0=--N!U+ zRj)`Ev8Hr3r69&U6p(kiwWn=ti+w0>?#R^~fN&Xa=q1#LWsyyC<3Xf|Mfw?9!Y3j@ za?yL^1tclAq%&-k$%D@Mb@r~STZ)I}M^_xR=hzRIPoy;zU9pKG$*T7SFj7huH^rJN ztEw*cI&Ac6@UqzeVSazgd5QekL-!l>y7EbLZH)NfQN9;bKXfn~zf1onoKq&T(sbSX`x6(40A}8Jv=@) zcI7{!Sd>Z+$clLcBJ?n%vUij%&tUJEOX^l%+o`dlw6*+EmBmn0)fc@U~OesR8b-8ZD;x>{SGr3E92o4K1DOml>CTjMEtVToBX;qq7K$WSxm_ z)^zy**^Ey8pkuaU1T_w0MMd!Ax2RGa{_E7nOL5ZL*C*9AdLppD*U80 zR?p{8jh9TSsZQvZ)t6SUI)>ZGXOygN{ebZ0H-LTKgss%h(1F{;Ab)P!}U zI_$dWisQzax*d=+r9?KIx7OqMPIgs4A?njDq0>`z6Zd2Z%k-!8PB`T=0J@s{SZV{V zE>0^Q!8$;=@gP?h{iY#Va%1N$`>f6M(`7wvUy_$}oizQVo}!tY9oPzfRg41IYDd(t0F_cZ~q0LQ&rz|2<}pq?Qd44djMV*MwfV@PQg$1 zEa3d_7x!aX+1b*UzYd%;OYU<)lV%q*YVt&tJr`ctUl?67%eW|{x!co5z3LmQrUqZA z_H&@{c9YJ!clOFE4f3qk=B_0y`cJ7b;5|zQghSl?2ub@C_=Zt5XDb0(BemuZ5s5>T z0|4xa7^UP;P0eXI#h`5mD(*h_e7`hz+(FN`gYpe{KXiS)BpmRncWv51Pds##$dB~v zCQr|)E-%(eYi~@U`pQlnbi*;c{BQB2HcFp|u41e_O(=Ye^iZhMb#}(I*4RW^<~CY> zVn6>uEnBZ#5OykIy+~s%uvYUFqgi|GGu9=U#gv7S>lwRApBanXVfuYBh`zTc>g}2CV zMkzRLOcq^5Y<0bCi}u`fk+%kN~^UQ7`E?VkHX4^GIQ<$JNqPd?4u_f{L}QKv&(vpF?~N^$-k#(VxJ z0p5+I$-&JI*%+6eHEVTPIVNB7T8i6{Yp3Gn~{ z4FU3I9ryrhK)XIsT*|NWx>B+h=I}AiH@7KSWf~tcC*-fP%a~m-)2m9INhNoHv~Jd& ztf9S^dc?3)ODf-~O%$HaXh&1}%B7XZ07CZLDD9F)Q=~dfEZ4*Ixz78dU9roNBG>oY zYW>SpW(2K^m0b4RZY*crI6 z+V|qZ>x;Mg+y9`N`Foyd?1Jk;YJldeM|2N#1@g(25^@I@T(Fc_=UcLc;%Z3UqzX)8 zL0)FD1kc@MfTE>H`IHz=ul2cn6y@{x6a?TAz;^3%xVzyF;>3iC`}sK^CM&4a+U-4> zXU%jJ0~w|H%>d^G?04GO34K`pe4DDZZ&%cA>6Xjn9fDnx)KPJ$P@Q#~m!pwHPjA|7V1r&ZH;2$xvHir8{$L5KKAO2a~Ni_Wrl1bEq-tGX-Rqr_}* zTa1@En_hm0I=R)eR{{KYW&OVn>5T1((!jHi;csQ06vThba&u(88)FYGf37ZKUfML? z-jZvqWDb_HWwqo_#8=cVIw3__y$oMGEhueqZ+uF>ztkgDWje)LvgZImu>kPNo%+f4 zU>B$Xhx3^B8{i@PuC6z;-K#EhSJbyOk=9kY_^fteQ$s;)Y$ziQkn z=rh;dyOlB`3}FtV4r(G+i%!&B&DL$SNe|{0Kpf=|JMH5Ou3=5((qJF>82)stO`)bE zhG-UI*lHT*nwB^8&3GkIUBd69P@68MSz>&q1~(=57OlI#L2Ujp`wV4JX4YSd7WlT_ zn`X4w_(a*jAbn4fu&Gx44E?L0V0H13Zb-l&^-FCywI>-fF$fbyBH9DgkvTVadC3w!PT+x>rsHmbup1YYAUzEPFTcU(H!kn?H5!GW9YxDIa4Tq`dIF zfH9?yZTm}i7)KbAsgkmSEfPJrkXNWxR5u)Uttt6Mz)YBG?6h`Tzhw>x|OI8qL^(+X;*S@C=Xv} zX8L(016t)$dwGN-vV8o@o;kHWoK@y}UeXW0s#1_5!DuiWMKk862a5>(j0TYo(C>OR z;jWcv$g7q)-Lxv8N{w8)B{%Z<7HlFa+D`ujy)`>0VBbqiF_2%bm{^=&-rVuWgJD_g z3yx-OJN|pQRlQi)9^n+CR!(#`nyhjui#7jgd@a{E3{yI@b=qi+Yf*09J@+>}+hjo0 zxy7ps|7LS*T)6-1gGR1})kU3L?*U`)epTNZ->hn*foz>+lWCOJ0}zK@nRd^jDvpRv z-yNa@jqhIk`_IGTn*e}&wI5O2Cv=oF`bqN36~g!4p!-6PRI{DO%1(-5yrJZh>(fMK zqxO`$6gN{}kMsDKy#T~oTe&Ts{tz<($G2gh zueT%{`ceX0f#+hTZr7^;+>0V9f%laX^iXo)cgm7$0phqmNIOnfL}UGyTMg?XlV{Tt z{f}eB_2RT`D3p7d9P_i>R^EHH>$o)9kzBgSw#0eV@}_nZWpM+qp&LER9dEtgJAaoo zW42+8r@?f?de>&K?JaLv*tFoP^E-!!q!RBc4KSB?);IDWyj3{ zR3KU~UuNcA&3%0=ftHB7jk-;{Q|MRnp_=;O@B1AJ6Z}`W*YkhdcXkx>46S@JK*3d; zrFg8Kl`}JA5T3oQmG&B?&x3FJihKWD`g8W_t?9Qjdta;Ii}D8MR74znyZ7yNw<(cF zBMK<4?H_Fzr5Efil=QB-sRdKjmRgGXj@6=pG!OCGkLp9Mk~7p1!Rk=}hKlCY9=%)- zm>1%iRZf*U;IU8;ukOXp74 zJT=1oSNCu>&Cjn8GHm~NUT>SDIm))nsZ5=-n+(%+_^sE_RL73FnR zQlx#JZ~0BR{I#<}_mvy6=Au~Xk23kPSrZdj2Y1b_ZODL(OL?CG4_-WJbgiGq2k&jo ze+q5f@VxcC+CZw0!k35AUTEFyJxZeZW;C}qW(KRj#ZO;ZI?geT!~7m=gRax~K5aXV=J%gpPlJ9CT><_pAP!TsexE0a zdeU|5b+y)8a)Z)WTEmiAW1b|2B1Y5{W7z>fgiB4>0XnW3O45qj>nrtpdb!~luSHMU z8iY#|u#8-60d}B7%tr{dz&-fj9#$Ypa#Ktq6HpxlF-pj2CQ<+l$6U#R&7|o!`Fa59 ztT845yc@p3WIdQw(^JG)YKYV1WU^8~M_A<=gMj=y1-FoD>gMS+9C<$GOm?5z88 z*~jr#P0@1zDM)ylk9rof-?jgzBviDZE%QN>3^1;J6Cp-YCv@u6#WrXTbZ< zJU&>5*6r5L+3AaVuYx)RpD=DITw1tPw8*|#5~Y`yB{(KCgQ+iDEIk6)Ty1u4Y|h<( zE@ofUmOmY9ykgj@dAyrt-7Y@MF&oA?`q0%6w~B6I+V!b-9;m$%JMQ?IMeuWaig_Dt zV^xhgqAMkd!~CEyXv0|^;4GCQ0GeuEWH>IRVFkHZ#K$iKc?|!JJ?1fb9jOa9=!1+v zBHdEF*g#VG(C8H z2zdD5pAj_KrJ23OA}QLvr|&7L^5!9D{Jy2?5q?Ws3{txoUCtdRr}-6udxd|M_cUGr z0OhtGEKW&Td=j88V2{yH{R6Rp{FWlgg)@ADc^W;X;6cJ=6sK_kL2RN(-JLOtYjWyA=?SC6_hP9SS-!~ zELKEeo_Nf6Pzq^|*MK-&wvIig=(1YuIhB<5(br;5MNKV`-m`(qtiW`<)Mu2Gl{1f3 zg}-+T;b-&i@n6Mq^%wVUF@}l5ayST@fb$ z_)BAzV!hCE*>u2I*X_FLYk7OsX_YHJ)4N-`^x5%SaIe62-W?wKJoJ4xIKQaqiEWav zw|4{nW69fhvyw+=pUOx&l&dYP__APK#Z39I{77jk_mP@3ZA7Q2X8*A4o5f4(%_^>N zdP#@*1(Az?=?V_$EhP(Yp=L`iKnc{>vgyUYQ$wL^J@`3M*|(0oz;IkXWnOIZcvrp5 zYFlF1L~F3koG0Sh2;*Ru%8I3)Vify@njwys;JL`)r8L%UwZ|&4!N1IhIXb?(oc)us z&h=cIO&vr$Uq^13gglaYsbry^%tP8GUhq=HQV1pR^J+6Cjh`zB(c{$Tg&Ytm>JI>V z=QP(_@{KKi^H}8_>Rr?0M$;3H2KF9r&#Wx)KU3B{;apm~>?~^+pLWdg<%Auz8e6*7 z@)}bq?0tOE2`MPy!k7=2huR<8wmPCC$Bg!J-)3yvtO}c5*uLvm<9 z@o%?xtf@NNP)i->7vvY|<|q4gb}uphNCs@8uh5?=qcd`uyGSxOknYKKjfF~(xS;kf zE_|ZinD+OFxTl%q=~b^sQJC$?%bjVi4~t%%uehwgw|Sa7(vGq@UKNH%BFKBH`A_z* z($pL*_wRPSXerS3MEP+?8nw2abwsN^;xYD08>C-oh8Tcf5CHH}wnn~zE#k09rZs>_ zrbtREst|#Egk_k%R$ps@J+-3P@331d(++G>M~EEis{3KFY!F~0>8jq6C-IR|B2aFS zI*6+F0p)sOq2iVKd6Ct9A3cz!%Z2)V>3{&h{BVFx(lzmbZPBgp#0vf;mNE}!5UnXi z>YyH=6~a(B8F4u9J{5o=+edU2FZ1r8lvQoF%6CqcS@~v1+3U=-axbfzsrpzxXh#~A zj@V;qyVUsevfj=;KRmkn;LFJkMmN2hQk0)w;u^0lbuAOQ@?lFVvvFN|EsbzpG)dLtNR~Y*QW67&*)u z@3F#A%dpiHW;V_3B`@{(tiw;4?TZ%B+2WZ6M~kW$WPPef0d9+Qv zhk5GuH=US=n(D~J3c%Y;Yv{di9X4P7Qn{dikSv(VzY)_!AoCEaFtAwRE(GsZ*@SgR(~5u36k!87q|;o{_>!MK}epEffbB{{~t_{P?p^_mHnz zH!>b6YNIx0a{$iOP=1^-*Ga#{{%1UH@Wp`P)Sbb%S`^HruJw3 zd3%1x7;6}&===pBj_X<4Xss_GZ`FPS0L_Ev15#ee{?ch`kGDSg_VRH1e08Fb0coFP zVVzi>w5t-6s&M~v9v;QszLnkbR#!O6;k1@y>%lyR-!}H6CDa((sphBK9>quzkAAii zYRGC|?60>}Rl_c}g_^f?!z77&ZKD)$lofr40mW3DdGjiikbYDe1&asUeON%g|F21 zddah=fIc((D?oVWN3&RLE9xUg;b@7_uJOU)HB220_o^)L$#Jje8fJNARNUT)nFckh z72qtGxuke)-alpC3#RkBh6#oZmP}9Cy+k@vKDQ*Kte-X;acl}Lk>4V!RqEt_DoqVe zYvZQODpT|}06#2Ub}jTjZFPAxvRDnw_uI?mHR(qjM**M9^6!z$JYaO4^vcr1}}?BBXJi@r{;!WWJYu8!JYe3CN| z&|G;LfL?fSk9V62YgezJRspTue#!|mu62Zzwaq`HtrP+Lxs*n!EQ>bKE{vm7@S|_7 z$5}7guXzO9#)cbymjA{Auc`8CQwOOprAiH)7qo2s$%9ke%jNwd-t88P&e_Q8^3~ZL zc~cLNG=;LMp0k;dI3oJ1H@zOHg+HzgWoa3eR*_okQ$|34>Z|f3{y(wB*VB$ z^&&?2Y;WT7^3<9>+IDek$&{c0q0=gT_HN!Ib8bAZi&cC!EfE>)1wiv~h51U0C`I}b z2>@?H@AygOuz8DNmL#AKoX$0kwRE=K)%MBQ#$KbcCs3zORc1XEQ2ywiad$$ zR8CciP+me~U+JxMfBM-Op)Ka;=z>0-?-zl*6>kqv3wv8l1*8SKC*T_lnBR4f{2mkBTnQ7o)=xkbpO*D0Jl+qD9RZm-6Z7Bph$pE=SkRW&(`aS zp{k(C1gA~35r>U1$ddiF(-I-~vW$>M%R8A%A1dCzT4MU(TKAj!Xx7UC<(2${czMmg z+GSZgz3hFt^j&(zwBl^BSlUb544cF>v4WqYC1M()3LfQ{?0?su4tO=iRXLf#>Tho2 zHsE2_%K`cO3T-+0PSy8lmG2~!&&jK%70UlpdyLWYRz=qi>*4$d0O5ePnLTu^`wv9D zjl6+1qIBv6P`cjRcu&;kX8^sg98=Ov`-!&>^sf4a#~qLB?pImAmlv{?k_nHRvz2=0 z!vdwNQc~?w`TFviK8`0f|NTap!Jo3HQVAf}=gss$mk0Mjw%*Wi3=NGTn5q}MCQ@^~ z6Cj$=Z82PQMqBMGj05ln3vosa)3|;|OwP$hD*=qgFm}?{TV!Cl^EU!NXHNvMRVqdt z#yY+SXe1HIuL6RuV(P(2zFYKgaBt5O-8QMAY}A)I^hpb z4=^{DYn&q8vb?L}(3?>~$$h0JaDTpcq8chsuf$A0nP&4#>Za@-cf%Y*oz?Rqd0*zC zcA)`Ck;daOZ$qOfPFkWa(RY+O?sejC>@B*4Nw+GYN~$%b^l(lrkhS#T&f?7`*?o!9 zN|W`y%v3SS_FSza^L%y_Ko)xlAV|6_j_X-y^Iysp1OP1Lzd{$C0DyXbJaabY;cQh& zv$7sesrvqgyX(J;zcsP&hfx2fes2O=tp9sM!&wX0Ox@ynX5gV!BEG^yc}Ba~6jrsU zW!cs`l@(ob+dM?+Zkb+pnQOWUatk%Z6;ECY^s!hbc}WAs0Ne(Ii;@X^lngS%iq0ZQ zmPB7ls@{%gvoOm!KtECPgnIFw&aG&U_W{L>{dJg3I+g*bAJ40T>wZ_69A0X zmx*|aQ$uKtfU~k*itWxou^c^I!!S)8woMkR#XYYbe3+;jG@Jjx{&2K#d#ap%d2?GK#CQM^n3gq+w(x!k7=)lH+Ei7Q}n{|W5>4BY6ZToY(rbe&)P^j zq!$CY#K!@2LsR)UislOdu}FmQ^K1wo$LF};kQPZ6e|LT!kQO6WWZFNlRFP}{008z( z5l^SoVi8Zld^$jJYAJwmb_=bc-X#M8pr{T1Mr0O$i%H^9smfzSt}_t871uCK!;p%t zSVGYi$>Ju?IBmLtpOb>*ck=A(Q{}_j*gqEJRx4=t_~Pq9C01Kz&MjvNCOaER%Unmw z*YTi=pX~McL276|Bi|8GEDzvb`W$_bP<1=@+S}OX^PcQ$z&tqfWbTb(XTgH>e8*it zEv22>PxcQIX+Jq8bE8;MmOyz7pmgfQ^C_J=Ig>uFO#ht&Q2KxHu;%O?i}{o`0>o9% zJCm?mHZdZG>hppf$AQ-%efFO9xD=f;tRDKDl}_cD9TV!hdO zF;m-I`Jv|s&#CLH9=Nk_g1LC^kU3uF&Uc60&*eA!RPFt%trjnLTAgh~f~%uG0-Z$y zpnV0<48ERq5G_OkMKU+K!D6km0cKOY019@*0T`kd0~DZ^1Gu8k04Po^r%39pIw_I{ z7qvm62r4`WAgXvVCD72~ivVCV&=Lx84Wk5#Q_qq{L(AugaYdH|4|9QE3!SmVRLu*dFN@mc_mF4}6&3(zQvq%0o?s z(lXjW??k57f_v#B&{@x+hu#g`8-yghZt*19@rT~5^f5QM>g3(!>s2lPky^(v43NkX zko86%Eb}tE1T)t@%RRs@wI3tTOwB4W-B0X3>MY zQ-ZdcKcfH|PN4v9pcy6s`ZEXgZETVfAyrjU%rO$wpUXG!P{~WGP>SBoN;kXGvJRbX zWE09u7J^}}w9=VsOSV$EFInBdr!%Fr#>*qlyE3z~VwnK|JMw=`ZvQzJ^9}p~_cFYc zr?O&gxy`_wYKHp_?@A$m%o?;HVZBeinpNNUUZG{^3DZYFn2LN12au1J0GeY7KY_`v z18TIjE6};ykV9>Dw;9vs!j}bPWF%bz;Dfq&37`;l0PK{fSKr(UwRgU_{H{2^V}G?x z>W6k0+dl~M_Ei+wK`D|q+frPJjl5;Se7>HY)2H)TG1KD3N1GP$7QR_+Sp&-Q%< zLtNlx*usdTiGT;44(PA}#b%5yf>2DV603?e< z;SL}Q%K>Z!07SuGbP}Dg4tqr>;VwF9o1J^O7yngN`L7P6&C``#vNXF!dAVa!0aw3s z{PHGWJ3)CB9i;J=Y5HDst{VCFoH(wZaD33q{|BW1(ji~wWMe<3#BV2yZH+6Wl( zC1O_Q%bGrImOcN~345G#p*kCd|8;30t|DK|rNeYi%%?My%=?MP;*wTNQt6c2>Z)?! z{bq+Ol`M7LjZ~XzQ~OU~3sH!I|J9HkSOx&d2e8xK*yO}lMa?oFm(96TKn`V z%%wgraq0J+9RO9WNan{yd$pc4gqKr-@;AV$nTOCs`Ldfkb4g|HF7})a1lShj@l@$3 zW!av{3s}eEwvr!Be9?;g>qFkIvNQ$k-*}sq#rih?Glq;On{sEozxV!4wo=vuB7kx#dh{axU9D6AVOGFP*rrX7C?o#iH z-E15iB~NEt0JgIH`}ZzqiNhx+%%y3^@@ukHWxL;y8j8KT9orc%<6a+i~yh_QigdY z&5;{R@c=$qlSuu4-~o1^4q9U>UIG|_sh?^uWOIzMzF!8;Pd@srY4Z)Qnm+h9$Y)50 zuz@9S-BvSOUW&7+tMQxjt^`-({Eb>0ZFh0LSgo}weJuLxcAEi7qH0zrr78R6-DqPO z*$N|!hiQ!UTJ1ybo6Bt`E6sTKMOi=R%&g6Yydoyl5NhzLl%9A0&N~;NE)gkgoV-BV z&&EkER+%{@KNcpHNxRt3N~D}E-;llJR#LvSOl~EOmqtlxtT)B8lWYWrU>qO}{Jk&$ z{73W^yLm%Ei*^|GLDG1-ZIBH!Ezb-wPFKYf?dzo5U;agB0C>5Z1~`BeCy;cg9xRIQsDV}I<( zE$d%agDTi=DGk6wj6fmkAQgoGp5gx`z3~!ta1wQpie*@aaJ+;Mjsu?_2p?ur=6DXT zb0qTg#v`}pt?ZutO{ve{K?NCwCr%!Fop$@EdMBWY^6QI8`HFrbZ<5Su39j@*_RaaE{`n@wAgl*jaJ{#f$UfDgumG%2)CU))aGd zWh^^Du>d=OB(l*G0Kf`5LN=_Bj<6N1qimF}OA#!ORg?V;E0l#wUBgVprQBAk$vdT& z(lYrJk|`3&*ek;6EKlbyY_%UQ|K5IBbpX0mE^%ur*LTfxE^~Ep-c=VmJ^<8EG?PnT z8uHapMV5m_RZl2iN?^XuB${MS(3}7o$(j=D8pd;luQQ2DBA*qrMiw-C5HYyLZ7CDs z=!16HfgNZ92okcmsCCfaYjqp}Apze0Bek;?Co8@sV6}Ol*v;>Yn^eel5KxHT_y|Ab z6J8$xF8~xG9{}*=6Y!n@DxoEOumvyhtLTaE#eOjX`)MKj48RD~MInGXSVsBM3ke1< zw@j+yeWKr+Y=>SZhIv1C|AAGrPqsJV-&CA%rDL8N$?wxFKI!9b zdse|Gi4`1l4)LtIm`Q7BCgoB?`35avsnkUNmi-Ec@Dq>qIJ&`W@p3FfPbE-)W<6QE zRN0S{@>aQL#hTZP_%E_zxkoh(&pf)z7qo93*R}Nj0|lz@bK4p>!uV^F-L((lMGeT|D#Rp0-dy36q zx$?+yzO3W*!aUi|*Y8q3CUfIj;Tc0GGb>k*jRp&3#D5#jQ@N0dMr&pLJczA42fkTo zX^k_g+bURCfdc%~mnIvspiE|#g(Um;F2^Nu#l7@)N_75fFBq%KNqC#%hb05ogVNSj zg962u8|zmwsg%5|tcC(9oJLWUg4i%?jV7W$J+4See!nf!#AgPHJod*vlFWT7tPyQ0 zz~Ho|Y0GP@U|1lQGr6On!-0ExSKHn!$&x;?N6CL>ja*VSaK-rUBrjBhGW+w21|!Y;FB%dGxZeS}CQaXy5~?l#BCmQ0s^2X6Yp8IPS07t3l^`^p`3Pu}aI?q28OH#}x`F5O*JmCHjmn)qOth z$7>^`{w0_P99Ph6T1KG%fUw|_p9eEuqTk;d73GU}ttDD+_8tpt%rp{e(!?vCWMKA& z%=4nU$SY7a`Bs<3JMt>g-eeUr2p?R)YJ*~i+Vzq{hL@WZmP$*4n)PBy-qg|}{n@hZSCe^sorHz#oJymo}u$Sp22 zwnfTMeC+)!^V+Am==cQ{#@oUJX$B|(T%${6fZYzXu%1gUgrwB8(_lY8v$QF~T&RiK zUXK3R|B~laDh)KAd`Tn-mM1MgVdC0UsVc)Teqc>D5<)Pe0JCGF>ZiMG+bLw~p3+7G`DzxNUA5~+A%au3EY z4)!_@8W^_)Pxj3A|MTjz=zP6<@FpSz#q>tabLgI}On;!AjO4DuS?7_b_uk$l4tEL< z=oL!>D^mDYbP`$wPKp=X!hiiyrEscaO!V%E54K!>)Ahrm)i{~g21-c;3BEs-XTRp9 z9;==JQizEtjHMtJ^3t2X6%?+a;NVLsdCW7|V<=KuKcl8dIf0F0?-v$gzADC&)cZXZ zkG2)mC^b6E%@@B{PCV3l_L(ccXm3VrGG9(4G`YRzNb$9Y$fYcJq(?j4cYLNhVm6dR zd|yQyBs_vwa&`PN#trV=i*(%d=`mL+w;2d8Qs!Hyu|spK{Gxy88XStisrtYxwdvfk zsRcqulP@$I&H$hZQu38=9C=LZ6l1U{iYLT`FI8N6ee7qgh?c==GVdXi@Waq*@OQ zKHDxoA1kl~+C`xE9WmyAMARZTz>!ku8|GNa;;wSzuRFbc5NC(10EY`S{j2tupW0;b zEM@7?8N!pok2{88;~hyS zRQbqmSc{wfLE@=+p&%LBo_+68>0%wSp5d8YorJ?J*5U`{MJ`sJBM#VVC(@X2*`Yp^ zPwfNgxi8DBkpS)mI@7fWD{LQ>M}|tJUEhxNhIs|T^%G1B+tuN-Q)n*pBZIikdTY_^ z?na|38H@tulP1l(-(R|8ZljkPFO8;u>%HTra^uBtNur?xQh_K}z~fEZknL`Hx+d_k zQs|Lf*(r=CZwGgFF{Rt(#8zfSZv$e=FO0oqchg#MDE2X?UwY;t-nHsJEKnWk@`cIF z``FzOi`Un<5LT6k^+QB8oqgzADRT{EuQe|x6)M%taH2MA6#QY&4Nwu+x&ne~1L4t? zINbnD;JX#wc5=Dpuwo-qNa<4;P=GnJ$Klf z*@eDZypo8HmtO7|Kki4|J8Bc*G`Gi^f#t3ytg2JXm+$329T75y&Jpn5a{>17iQ;MV zWM&j&z{?&eY80)`YW&gxRsa*CqIx-d+)B9&3FV6N=%&89;dJD{@P>(N?9Bqr+-VL$ zHNLml*g2I`Fj0EH?I-l$ILmIp<-sS_L8sy@!}Mj@rU*x-Av^c90j*2)b=n3r*nDe9 zaKBXj_yb00;DW$8aL=mbU}xoBvK~_uep2kB_`D=fTrkE)jDc7^wUb+$t4!%Kk+@Y8 z$M)KTl{U#%P7j!hP?dG>=8c$@l^}jmLNLp(o5aHl9^|`1_!r_-S%h18qOai76Kpfm z69pxx?*F1zjTi9QsZ}+rg;=Z9Na%jEN-&xlc~D@G6r*jxMbCGG)%sM*vWBN7M>4tR zql91*t@Wvu(POXZL(h98wmpNF&?OD6X5A*0J&T3K7I`-xTizHGSde4&MbS;(7aS9` z-Be46yFwzC@{-%~qWsj%HQB$#KN@HW7q10|I#YrPdm}Dhmz(n)6|Ht+~GZZz~tsbl`*$Ff7+E%d?`l<%%x*QsYq`-rMgmta}d*`SgY^W zu0>B&|-Y+*nmU*$(`)Qu9uNySrv~<5Q!99Wss}DHO|MkTD0N zXDASE9bUW04aSe4+P3d}?ar6&5_#KG%QIn97HnG=-+PJUXPdVNLk_7u(W1&y8HXiWyC#LSc7 z7#=GcVJ8k_+Kp~&zM;>Zkrx@h7B%!=7ym5A&-;pWRQN`3is9&2CY ziB{&QlPCQk5fcG{5w{!E9|c^D!@9M53&Dap3Ae;W+0oY4n7<$0pMZn1ldZg8pN`Km zSa%QV4=N_lfznioQe_o$OzdaH=8#<~sUw6mvSf5{^__inS(m+?&>(F<{KAi|)kc^r z37`6&*?&IQ&_y*`{ES4JQpOw^N}#oHA41Lnt+Cy;p~$C4dv`60r{(>ODC|?U!;;Jg z0j@fkQug;knYld`G(owmSHHEJ^%Exb&OZVn-g(-3uTAC5wBc;D zZ2X_(_hjW|xvwUiN-lH=zZTYJ!e$uGhRD??u&0*X%oKz!j&=K=9m*1=q`t+Ff3KIS z?<5Vpx8B`oPqwyWJz8VZ<3lT4k7QTKFwM$=KlXM)R&+S!W*61=N6ZmKnXbp-p$KX% z#ZLFXH|&|PxJ39arCaGnUd*cfK@QeLS}4ep#^XBSgj8R}y9+1mMzVvcWdg!74l^we zf6|tmNYW|Y9I{QB?wmAp##61U4|0Lk)>g;6|CxD9RJ||z1>MKI-03>iYBy>;8Mu|9 zW!HA$U~d|$a8>P9+ED4pax@}Df;{UVi+*N_ep-a)Zy_Gt1SPt8MNw)SJqW%#jBdH!saREVp86ulO);g z9T7~Ego#z~s}y1ie@fL>N5@;;I-Zwlg461q)9f;ip$!F3Na|0P?wPeu=qTXaYXwbx zBAzO72|XTqzTRi4Vw~h`mb-C`E-Awr$Jm<&69+2kM8h5vsGP>ScbBvj?5i9lCSS~- zY<dE9D@2a6czOLXpH#&sIh}Er{%<}y=i^VH;_G|VpQODBrs z22t4=e)D8gsvCjc>jo)*XN$ZReOoyrtC)k)v9q5E5`x62x*4Y5H`?WhHj06`t4ZEB z#zV#RS&RWr^w$Z+jgL!JM9D{>K7?g-V?bFp6wquFvXtMiBBZ_kZO|b5>rcY_=&A{& c?QZ_2u-08d;>V7lbD;Ut`uW`d0Ql%M;s5{u literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/rose.png b/ImageMagick-6.9.12-44/images/rose.png new file mode 100644 index 0000000000000000000000000000000000000000..1b44690bd7a43f522f29049f6f2e4b11ec519cad GIT binary patch literal 6939 zcmV+$8|37PP)krE{k5+%xzK*IuTKsNk?4A`(93>Yx%H!pwzLzV;ywk%t= zOp&8yG@R+_>6u=tySnOD-MZV^GBd&tHKgT0;yj#(lP5AFzgWJYw|?deOyroDjA3Rl z1reDU05elnGb17Z5eWnl5fNt29CGiR5Sua~H{23_$?QmZ>WXXD8=93}45r5}JhXKO z4TOqxW9Upwm0$#8b`JhP&||sF@<;3HB)F6mP%}%W(TD&^5W~@+|Mu4S+TqLdqpy6n zw#Og-8N1cdZ_5Q!|3XU{C`SKmZ781^`4%Ffhs0do!q!X)-m1 znk8duoZAqVF$|(*SsoMAEHfh@5L#1%!pHzKn85(RRH0-7luAQpWnQLa$e1)4Kv0kp ziGc+%=q9vPb5Yk99r-#^S0&QW1v*O!q#!d<5QuuBrRG5f z)wtKx9dDu{86gryz`$k}jf`*+y1zWXTn`R!_O^<3skXCOoS%O1;K9kK{h>_q%z?xJ zRV5^-DXAF)V4|yIBmnHp48*2Uj17haRV5Zx03cH(mX@RHGWY>_U4=)PMVE1zN1=<( zDq}IIacdgD(aZn^Cvwhtc2aBB-M*GRe{}8Ra`wrC^=j2cGZ5_agETf{#FU>!y1BPA z*_*Dx`p&J(*=4?Sbmyg`uH8KP;4d6l0KiBAP&8vRBuy;B001>bQV}5n8L647UOA#C zfl)Gp8j?a|C(;?0WD_P%yg|1T?VGQYtC8506dfTLK~n%FVtDUd*{QB4TbtLer=#h$ zx{jO6RzthkXk%U+5ETX@VsMgZQAd}-{b+hKf92b|ntuLl{5+hP2G7}S}WR?IUB2^`VCuKHaB4X2&jF1e})+}{Ot_>vFQBHlsqq@p+9}T3k zA%i1MNSbPvV44$`g(K%Q>mR>yGaXD4v)?VtZhOmt?qO4H(v?4e8Dc^T3tCs3i%55q zM`wE}=9~7csomoIqN+RR#E8HKCjx+CQX(P)yH3HKF`E+DDcFnz=DdZRkvU=^B}9S- zQbMV;b7^bhlZ<5($moztF=-QdN8T)^C?R!ZOK<2Tk!a=wVnU1Ud_5(~Qo&?}l>5VC z(C4D8fBaeVY~_-K%qc-3NXkiKRh-Y)sgLE|mKX|8F>gam0nU35fQg03iLirN@~Q^T z)r=zyi5bKofJB5du&`#1m_!X^P$C1>;?+SBJ<-Z^n#|>{^gX2xAynclY9Nkcz6#&G zetXsL{g3&h%aV(s8|?Ad-=CK!^yua7bLL$?-t2RK&?_W8)qCrUwx*CdKdoIUHhuYE zy4yQlo(sHap41o4Q`@$wVKzrZM06Eh1YpMob_O<8jh2y_0BAL(WH1$&c;tl45gCPO z!eorZ)DQ6&Cr4wpSzNqWjOws(ZNt=c91A8+lVvF%V(seiOU2QhO?c=#jC-4@f028C z|0CZ2n-kDkx8JXa<$6%o!>n~qtJ{42=EZLPes%tbCm+p*>V|$g!Fa1zJ6Myv(xluT zW!vj+by=VJ+&NVR!I>i_CdX_5GpT4w8kLeVo02C2lOi!EfjGVb4!eqENw`D$c7O7Z zv+esQAO1ygu@}Qx47rFSzSz`b*E>LUbCWNfta{o0YBgWZC~e=lvs<;{d+3i(o<2Cz zU6+?9^K7;py8&E*YyjlQJu>%=oxQhq_y6U?A3l|Mbnx1>>tC!*a^{=6+t>CEg@*Tz z?>{|$>iStP1BYhOwtTR{me-3cY96ItzOxu#LveF<{=mie+VeeW zUfC`u2_%VQXM_YM=aWR2@Krv{Z-4C%rq!?h#y=b$yqZUI<2Dyou$=Pn}^P#xnc#HI11O~0(8 zy|}1+mxQ*EA5iJpr_|<2x7f+L9+{*}a+sRVq;p12GS@_Db!p8rU9VG9X)Lm$?{lLh zt^l$0`s@l8PaHPqr|$LJ@1NcO_P4&d|I$mte&L5gJti+cFUrh&N7s&S$er8Q7^W#P zl$i@g&#|Z*ZN2u!JHK`7g>M|){L;-^uk;36U8mrorO3RAUgqeh{C5BFg~7OY!>3zC z$Wv2zS0)>Fn3@d8jZL=64-8vHIc=(GtGQb3uyUzoLZY%9%J%q^)%hweN^)C%;In=O zWJFo7AC;J$7QQPX)={3OZ9AQ<^xE$D^)Dn(U_-1)$?A4_d3JQTb$H{Jy!^rq=a`@| zMK<>AGpAw(-rK(Zv%~G_bgQ?2aARld)!g06Y@fKes45M1INbZz8^8KXH{SY%Rrp%F z@$1Jibw%O{xgA#wi8<;tFM1$NAuF??cljy+vT(9d>k2Q-XuCnyXO%XrJlM13qv5=* ziqdyNR2F%jTNfNV<{(~E*FMzx&zt3Iue?U%i4t*2L@9Rh^x5N`gHb*h$QNFH&O2dd z29pt-7g4gtkWa6_I__VS$QqH1i@~Hf-loxX)bD@A@Y_P)IeR>L_{03!hlinN5)v6p zHYM+4)V4Dr(@?int<9ybBl~SX4#pRRp7gFIFG!k;?~ge;uPG#L$l6qQ?WPs3ne+Z& zI2=GhigFo`;IMFtA_04(AP@5~?!&lb95a+Tu2 zSS`g=g*6;XfaBcYZ-7F4&@Z%Tm&8J~eS##mLyx+^~Y%AuP`{3>AVm^$r!Pm4HYSFa$V{Mu_h_TlY{!~k!ja8U4)#km$|EUCWE#Z*uDhB z$Z0h61M63J_RsG9C{YB14NLRL7aDl(pv{{k{lU{#Lf9)b)PVC zT7)!vyl8B5@pF%V{M`G05@ptK8EM?=WQ6)4${~F0> zX*NR~n)gNdm}5(cyyxY5$mEAp9gk0!vkKg>Bv|O`d9xVVPTO?_Wy8+7s%}q?&qwY4 zjjf&McCK>jr`^e;<-;3pc&(h)7i;C6Y`_-&niSP9j28ZAPw*4aHaxautecUyCAOpX3hZMVAFEdj-29 z-z|EM`6SPqs8mZ=BP{YY+2v9R*bd=Vo3qs;3vH&^ z(O?IgYHHYo^>~;cOrKlK&pSs=9_A7aewdfjBxG{V3G*jtuhQ`L&Do6sMDF#%I{quu< zzjt}>;g6dqj|R<7zt|h(8V48EMa|u@kWV_`quB3L8;VqxpOKJ^n$3N--bTxY;o~Y;bon0(V)hstd~u^U{%9rM4?VKnjb+Q@ZiI%X>ceUc8y@Zz)keoz*Uxv9!dM0nY>BuHunkjyf2&APTt7Zz3CgpH^F+MQ?`OK_af zwY3N_8F5m?wrR0hw%y!Cg%bh`fq)cKKOf%Ox&GA-hfmJK{^aI6FZnNh>EoU0#j4u9 zv~S)m|9Y~L+h-I0^fQn4(PDX#@xj4fwYWbT?kb1au3PX@H|wXL+&a3GOTRZ7j{Ae~ zqrX5fiYd%zsoFHh$77AW_*ezo&L7mUz&ISx_Gi4 zWN}ls))pg|xKSfAX{u(uZrhEznD_go9Nj#MDg_&H@`Iz@y?5Jga(cQR{)mM)1eVN}P~ za=UEKSDVw`sv9kA*ksuPMJq{olL;|p3Ky+Kj2w&=q(X=iR?x$vR|X5gO5bzKe>Q(V z!mX>tXq@NeC{P1d2UhJ6#gi*@;Y|5*Q(tbHRh_EVINMoPxc}ghs+(+WE9v}V_2hAV z@+8jZ-LjpHR_E%wwTt_m59iILm+|wrqesdRVH87hHcxHGDp942l0qqIGk;diXT2aJ z#iq{#)N0 z?`)~1UYhp9rV2AE|k~TD*U8`u;N86w1!{ zF0a1Qki9pP)x}nhCRktb)KOz7SS;z;5t^c-u*roM;!C(KCpOb6bAN|e4yMO)3?seD2&@?S2 z^*JkZvd;HPw>9XgIfeS7fzFby>bhGl4~G348tzx?Dpb~OKHgk@i0-l{j#+j&yD>js zo_^8~DRZ_Vtvy_%1tWIhC>sxb`4L^@V1XMHdEZ2g8g%``?akKc!L#FG+j)XFWC~_h zGh^tQSubkd7n_FW zmn*X}cL@eX8BGaBywvtAHdxv1@iuklBE~9th_%OOJ}wszvXvZCu^oMYD90cjL7Caa zZ-^G4C1{;u4L6wV{kL%Oa1b?%U-;(XH-7HRA3Z$zqu;wX`)pNLshng+&Wj)uCZA~I z3s(+$?S|ZFIOLzS^9jT*5mFZ(cHINBB%)niZMv>1@}gHbV3hY>xJ=x+$7RbY42{&l zN)U78E)gY*)}+ZI9E6^+co>;mgyw|T9bsffVkFv2*1|fWj-`X2bNZ}VU2tlEwP|wM z-S%?M)=6)#zcqUGmEZjj@4f%ty-~K!N_plLM&b&e5i=|@abEN+y7_G3y!Th!(G{B{ zk{ir4fg@lA98k_K+w)C@rW0-|ncW`ke6`!#R8OkZdUD19jEqdt5l*{mO8t^EKNuWq zb<$MPyEAKpcPykKe%5SaHaK()rp{+)2`BaD3FO%zJYjWq`FsEV zM^BEs$>8SB*ex$kI?E|3UG2)rIP~(N#^qk&=o1r(ZfWUW~=g&0|Sl(bCnh#SW>!=lBYDxB1$ zELWv>;wjl>5r6RPK{HH;x3?ZWxVM@oM`NQzs#UcaV*(bR73Z^6Rki(|baixB_7N6U z1)vlGK!u1vDyC3rl_t|kS<1tw>kE$e^88}Ge)i-+PdP^xL){>btjDpVh(H<<3?MR% zRv`hdP)m{`jLZ@QpbhcHl!z73L^(Um>S^e6Sj=MMsqjN3L0_YU8B>u09p;h+8a|NMhL z`QtyJI-gyXSzhL&TD!Ij(A+FmtBslo@x|#GB3KX`ixCcV zMZR89e)#FV0$`?Xq+2h)@!h}s{nuZ6!#n=gn{Pe8xAkv+|96+0)_3`zZ>l&hU-{P0 z(?=gn9vn;FiwsE`8G*G_8+%u_2%MrA6ww%95E&>EM~f*XV=`61C9-G~lBJMH1f#lt{UjvbS&chNBm_8Sn zy8iYre((E#=S%Mj6JXgiyY~8iUgF`sdtudF-@X1TfA9O>_$UA1=<8oOJ%0A&__IKX zK$JiPR;rlKVrq#J3?>N-kck*^1MMtDP$VQ`fR(I`v5j3h7;gH5_fC!_?oSvUI%ZilQ;Jw>i1bOG3*FbjVXm%BH!9)O5)mkg}Z@+l` z&TV1Sw1{S-V!BuKKK|&_(%sWwxPLKS2%G6pe;l>LF5jQ{lHY}vGqM3N>8fg>ovkUDilc_FFo z29wETfB(V5hcJXLit}0KPaiCqNQnH^V)9^jRel9l*Wds8x4-+fci)~k@qn5@Gk_~? z)Z@)BzWMf-zcx77hp@tc;<;b@N5A+_eqcdoUQoF)T{l-n;YNU;m9e*Y*Ht>dwwjH|^X~b#Xr59vyuBXTSZ* zORwg6`T5WQjEsxv&du-s^0G+x-~X#()wq;*K~~ORdLP7+NOaN?MV3POs&iw)mbo;@ zyOKIj*5 zY>ph1V@Kt4cV4}5xJ$68O&8bXT5DRX{mVDseC~zU^D@60Ao&SYrj7(~x8D5f{@c$# zJidQ2JE^;>PHp3ilQ0RhCt@LHAPKdeTA_>7bd#L=ne{Ui#b1AP*I7nH%>Uo0f|;o) zjEGDP7E$CqVc9G~8^OWX_bN1H=Yb7_F3%Us%dSfbQ?_WDDAk#3 zax^*juI-$4)vQ@{vAuQU#`*c>*|Q7pdm_vtPQ***oOkZ0iH@b1D1kuQS=k%-(ycek zm^5})*Nsb1F$NPUjKDt$Olqb;*&7Jqs(Hk)^?bECPkS#<(DQ}_D8N5e$tg!pnzs&~ z&4YGc{Q7Uc`1RjtH&4zVKb{?b`aA#PpIlkti$$GbM5gFekHQMwIVw z?|Via0;8(ev-#|_xoE_SwrecF9OLt0BgNIEiNPru<=Qp%`l1+Z!?S_&{=w19JvZ`x zXVNvx-PTwKC^4s5j^N$0000bbVXQnWMOn=I%9HWVRU5xGB7bPEigGP zGBQ*!H###mIx#mbFf=+aFisyW@&Et;C3HntbYx+4WjbwdWNBu305UK!FfA}SEiy7x hFgH3gHaamkEig1XFfcztl}-Qv002ovPDHLkV1n^P&{qHe literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/rose.pnm b/ImageMagick-6.9.12-44/images/rose.pnm new file mode 100644 index 0000000..920fe6c --- /dev/null +++ b/ImageMagick-6.9.12-44/images/rose.pnm @@ -0,0 +1,4 @@ +P6 +70 46 +255 +0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT?Jjw008CVe-9`i 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 O00006lCeDX{~B^S}D1^Vh2)q&yaF{8ve z0%ap%)1}xoGL0x{K1$@-q*WCT+S4sdvyoJfEvI}3?a?}O8fq_Q^mEuz&tgu2&XBFI&JLJUQvKG6QyDaShgxXN L9(Z2<PKf)jeb}9oh;NSv^%L*_sF@q2SEEh|E$;KfOdL5(GEeWYo5*8(YT0XDp+x!%}M=qcDYhU`k zXWyI^k7n^5Tf6l|`&66H*SGvu{4RLz&wB57pMDh{HIeO&&c4X6Rr!2<<~Qee%5#6l zO~3o}%j2#LYpHG57s-WuJ|B1aP5T{p>rZ?2cb|TFT;xKTY3_O#o0ZS!?OlG8e@9>W z)2jIL>6iO77re>39oJDAeBQR&f0KNn%==Sc_Py6%E)(o{tV`TADvgx?*{>%y0QudKBg^~S)( IhWr1U0LIr-DgXcg literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/sprite.jpg b/ImageMagick-6.9.12-44/images/sprite.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cbfc48bcd962ebe51a898a54a3f9dd13225fa4f0 GIT binary patch literal 13288 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/t-shirt.png b/ImageMagick-6.9.12-44/images/t-shirt.png new file mode 100644 index 0000000000000000000000000000000000000000..c8be06330b7391adbf0f703b9ccee9bdb48b7677 GIT binary patch literal 276684 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�%rM&pZuQfX$F(brMad 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�h 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 Ay#N3J literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/wand.png b/ImageMagick-6.9.12-44/images/wand.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8522cb487b032255bef3d6dad099ff348b1791 GIT binary patch literal 2441 zcmZ`*XEfUn7yd=Gs9I^OgQjR~)u_}AA{DDBiYjWaq^VIWYBbbnt1m4MHDlDS)gdKD zB>mU!G9nbEVuezgx3+)!@%`|gd+vSCz4tuNx#!&b;XbmqG7&m*<_G`)LT08$wp>L0 zb^gQLSd9&y14giP=0IGyUq#P#4b$Q}c!+(lW z9|a1;>6FD072e~3DwNUiD5T0WiRuj@k*HOw6C`N(fKFnLhXMCFD!zxmD^%^ z)rItI!gW2D$z60>uenA<=vwxqtEz4=kEfdB+oj!4!IbH}KOP+1XxsRu8~pwOO{uSK z(bP3~S{jDxI2hJ%{qT>3L=}W*Y03S^2lZ8wI-mZo=tx~+%nlU}ST_Y$v^M7?Q(7E1 z7ArD$_S7x!34=>)pb{bmBNoTRgntC$W@1symJ>W6$2a_i_n|nPd!M+qJuurAl{5cm zgKhorK1L=KcP7b0N=NsmZq0cq=)7jeY50hznoO*Lghs&ZdZ~#=SL)#B)z&L!&JrDx zlC!n`nZ&x%w2m8t@Z7veLMx~#Cka~rOiU~MXvi0thH?3h4~ww+mro4pU3$`VbO^@$ z+Z4){8N6E$DsuIf>Kt<=BjleSzeB^O*((KQhff`T?|EvTVr5fQM2xx{vQ>Lflap@lz@QGDgONuM5UPc^!LRr<1iFLpb zRjybGm&2q1#ez>(a*M)=n|OD?p-z%9Z*k?CCsDfW#DuNN2fyLr&{Zb*%fjNuYdIch z%yHNvtsGVT74bU`6ke$`m+cmN&~Z}?bbEwI_wWgP9IrPaCYtgkazXT9;x!-cwqI^| zewIqye(Y$I5U^NNzsc<8x18?^t#LfqEQRai*KZ@=E+J$VbG z)z3IaZq32Bq^|8S0fn%zs^Mc_t3MczzB&|W!pHVf8(QQcy-UI4X7(Ek+*_2d&JU5N zXmQ|On#bC`<`Lgg>#SgJnF&3Tq;Oq#pV!Zy z6U&c{A5BHhBTla^)mS_Aejg7UEK*qhf=Kl!qd+mz5iR{sVL{E6Dk|^avBdS8IU~Qz zzxfS^F>dxv%?*4W@!hMdp>ww8RhAaMM}WcjvuDe$4z{~>_SmI#*`!GphZ~!FMSSx( z>qY3hM3fC31UFk#A-pv&?m8UyHXua?|8f*!; z{<2Tb*6GVdB_%w7y?wzA*GQj&0pF-@*4?+2)!WZJPDNP`;%_y2CXP)`S|QG`ij#S` z`Y2W{nV-Y?73u1VJ8UF_NTj!VpYngiYc3O)ZsBB-C)8Yh1e0Ym6U=Tcmp=4BvS;*9 zgiPy1z(Fa@tO6HNj!jAwtu4pKmawVq7x;B@;bku zbK+|Dx=nzptRIB|7uC~4Iy?2Y$QPpg&)~;0w;c!DB_#P)O%Fj)>9C3tg+3QmM%qMx zX2@K>$3ZM%<#J1jjc`7Da@r$&E4p?4C*@&$yx@amgb9^*^Kun6ExR1c?(6L>#QOVd zaT>X+|8=`=`rJCKUI|jX^W6|P_pwazqR8XNs?q(}6kseV@woW*f zK(Q!E7IHKnE8a8dT3Az8zL+HOy?v)#T&JvkaV;LB-u*LOS_Rm?}ny7VNn`X z(l8MpM;apH;|=IUwM|pljDnI<%j|TAA4-Epx+LX14VvBBm!g65wV z%ep5-_cxWxxJG{SX1AiUvYWftbRys8IV5v%pR%#l&i!6wLotq_-X5VoI$n2uxBy&& zt7%?*kiPd@FEo&1{CxfS}pUXO@geCwjY=zSR literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/wizard.jpg b/ImageMagick-6.9.12-44/images/wizard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e64cca4a9bfb6000e03d18cc516368f67119682 GIT binary patch literal 23367 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/wizard.png b/ImageMagick-6.9.12-44/images/wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..ccecae986eb95de0837ca9482db17aa9d3e5201b GIT binary patch literal 1363471 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 ^sq9kA}K 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

    B}gq}0TsvM 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�dw*6uU)Bh9qA}w4( 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

    l82 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%0D-c#l@l_MwIuBWa^YcvE?@BFLWi@(tskGAS8$K zVacOneW2CQ@jNKm>gvRiQPaVy5Mz?|u+M1?7;}XJ={!kwg3KXeaeb!l2~+A2uwoFn zza?7*CZGFnk20T0v0Fw8o4EOztn|(B420M?ZLPG>r$g7&37s9jY9&+9_i&?#sCSnqN?IdcK)Gc_0z7yL z^kS^H6)o6ZH1APYWodt9TtBn$XI(oQX{Y*R-Qswrg!tK<-Q|xnYgWKs2(zVD>^vY!^Y0r7{apTev$vyKO6Prl^Os_Ob1Td zd=4}_K%GOH1N=|R(~u+-m@Dva`-(rBCt3zEmRxZ7=D1~{$(xsV&7Glf)ty)Lnc~H9 zc1}m%$l!~wZwgJ=_xuH`%j?IE;YrvyP9K_KP35Z$ngi`8<7V~1u7xD-(Mb}sZux4*3W z+WoB5++mDT9Pv55^{2S?JEI|7tYvlyaK^YwvEOTtvDVf-9G&@F>sad%67(Ah%q!x z2aKeE&hUJK6KR?hF_d-QIn})zk;KBB`-nh#7>6g7Bu9WN<1+tME|oROyc|ICW>c>o zWu3IY-&fvplH?T4`KH#80V=hky`3%BaLvfovY=Jn&7{>)-d};v-tCyW#W@^?TBHq# zIwUyx`m^_h;4ttKKrngWYn_~M;VSWxV+Sv_Yc}+UYvN`x0d%9JI;CJN&5YwO*AtJuTdZ2&xdH3Cn|O#vg1Ieo&NITBV*jL}{j7cW z?`FxlMGLEnJO)z30e-ja4J1=mC*u3*h4oppz4ZWaA^`?;nz29Rom%T$+iT$e_Fj(QA7NN^|QCjlcA8UetHi}=6V|E-G zj_(~3Z$8bwqoARvOvD=Jm~4uT7&^peqE=`K&`n-|W2Bkt5@?Wv55&Sn$=W?@5JOkZ zxMjQ)XW5Tn7!ddurL`<{928)Lx~fc6kK<{l9gjIDhgz;>9*G}GX%ipI!x<_&j4=+NKc{z|vA>`OS}4 zde(e`qNcTOP^u-SmSA>C@z1PHeiUl*%+|B$8k#dCiyYW43ZuK`52@A%FWUI3)F3WQ1d-hKW+UyJ}%*L$mg}V zjLE|$ZyM(oOHH2OnB9{qtW^l^P83o}5XUqAR>;DUFCP957K6V}Ks}*H<)r=A^24yk zdIEk(Z*z9dgr4pQWo1>7a1;0Mnmp#O_{dZGAKUpH<`D92FSRW5MbG4R2fuN$QM^q`0 z$V__wmXBCuf= zuLaZuMBj!{WN3{P3RG1o`Nl_pOPHE%fnGi3kcsuyXQ zV9eFWRS%cDdF%GeEsEWTLq|#lQzfFBy5DleT$1|lqGe#`_D9?@yH$MQ{&Z(s9^S^- zTaWj2hrSslYf++Aj^0&Y_`JI!w=ejz(*pW*9i9{ddg5M(=%3v7p4K#RMO(d4`4lurRmqy|4w!TiO(1**IMR%%DgLMLuLb>Pm^Ju zFHHclwKWni9AF~QBptUXt6$Q+B`R_97NVA|$r!D11s(=D8kO{?@#u)~8gDrgBQULaQ=PY6OKR;k@Y5QkmM_6fw z*C)>%#EMmG>t%4cV+beATv)%b0sL&lgl*h!HZ7>8;i)WEYar<07QUVYZr)FC;;@yO;*v&_>X7VfT7@ zq>P}+{3&%dgW{zCvMT<(Yd9KAK)r~G=o$rdnoyHhK{jm7WEc=Jxr)>47L=|L^m~Ec zB@>*1BodkCPjU(Aj%?Y2`&CWFo#xhQ$F|+Us}4Ezf%W!6={1P1jB_+ z4Aak)21-r{q^WbSKJR%&9^z9kQqw$jte%1fqv7_O1XB+9qxnFpg)7txcW)iro7 z4e*O=-#fcnM|%(>$WqeM!7HTn=A%GVX!lCG_X5B(pnMyO4@}V*=Zj|QQan}gOmy)~ zQV}@7u|JRiFUe`ys-KK$?eg0y7A%pfj(Y5*@=_XF|yo;1&RIoMrz{ zucu)`ukxnUq*Z+>x?+QML?-$dDXXv1@)HF&bCU|O3*T|cp^zoCF~JfhsMejc)&L$>sJL-dhtWS<3r-C<5Ez3E}sgJ>7Oi#o6V#Iu~A&LvxW{GCXKW%2=U~sM^os^t)7uz8StErP>a$92%*dG!7b_ZMmJ|xvIKYy!?8*tQdFc)-bLZyY*Dq zZJYg__u-CYO(ch<)Gk6}r^bH9kAcv?`axKQi;wsF;u z7iKc-0>o5_`jlLMEO?Aw12UdKDj{L`7LpkTOdQy(sN!^YU%b#}$p&LK|K^bUNO4CZ zYb?|~e1N|DE_Em}F%HQ5pG}Hh`5vvd#erkz>vu_RPFhm!W-Q&zBjS9YQ17lBpV0wh zbJ=HvT0^V%<$BcVeP*9)XcPC6cZS=_oo>KYw@Y_nBGKl0FLO{pycf&DF)xe zCQjLKjnfT8GfC6Vop+(Zmq9;sDkIZ$;`IFbvAw?<#x`LGNzcjHaRh#;zPG-cs2SN$mplD5IJbCmam30KmkN?ongysXwT!@-U*nn~Op~nrwg`b_v<s|@HhC`*gXdkCbgQqnyKpN0exWoEm_r%oYSRN&KtAbSoB%!g82pjiHl&J|> z?Ki0y#nCAE5{@NN##A(nN_*_p8Dlv}W)P+bN1Z;8IZR7h1|}R< z%P+wg*{Yi1)+Okw#wAn8N;3ZEt~!F5 zP_S+FlP60NDy@N+#gD}=Ufn~Qhb7Jr5pD#YstLE}W4P(S8-{>Y=sx zU9j=E`)0M7TZNY-xKP*q&w7!=OWMoJ@qYNdA_~ivPgI)zt1YJ?6b?h}>?%q1Vlx46 z*=2l5&)}o!X&|DMGv@nt{BoQv@mN$GghdL!y|o>N+`Fcd$qYhHg>Y~w^B_AFr(14i zIcJ$qIEEzj7f79|uAqVvBda&R3!wpQ)k{K-y4|BL9Iu|6m!b9rAVCHY-&o>IdUVTJPv2 z3!UW1V`>wBH%M>ghYojq9|G`CO0A} zzzTb%sAjd1YI55fi|C?h^C!1M`bf?S@8%lO6Wf*ST|*3yKHxe0v_o}9_S`hSSV%LkyGui0VAH?Bo&GtJL0@%LzG)nk z+`9a=%6aX@i09Ysd)twRrt$+Vwq4dAzj8!F-ypu8yOc1w*qJ9t;Dk~+o8IldUVT67 zu3g&(dcMMbAKIT%k8rBw^7RMWI<7Yeo^0F=ZTW0meiv65N?P+tmJD-PZ?Ag75_CT@ zbv|c)qp0`=M)g7QO}2<{_GpZDa~swByLD92;n!V?=U1`L#RE=5K#T!o6NlgT?mLYR zyNkhdz|QD6r>ntQpYy2iTfr3fL_L0Se9>N;=dzwp)m3=N=!QDI&b{E#lHo{7jQQnx zN{mCl(Vaz-@(+rI!SFJ+(HwS5O;JTImVCY!MB~Db5Wqqe)5ixoiZUsq@4R1k*LGLm z`UR{3o16YE9{!|I9sHPl{PEk#K?6Zr{eJmhLk{tqTh5Hr+vcALVBJHTHsta$Ccgtw zk=}@;;&Zep%`dj2A|U$7X7z!!0}vyk9XB<3PCk%;Y#X)A$ZbJ|ex49k%4OBq zAqC9HLKt#$TTdMW*3@Z-T&-_FeTriMw$|S~6m6v>zJ*W@d$|5!%@~jpTnI26~ zV=8DKmlvJ}No!;B-*|xii`>yO_Du$IH10<)4w=W#6|DZ`W(Hb+1OB-fODRZtJZFK4 zar-V^=e~cL5R9JXFkgVJ@Iz;CoNH2CUEfvG0G=qu0~@eH8h{ZSUhQ-TEc}4GGgT{FYeSlqH{eIsX-kh1*>if{nXd zmMK9h#b@}r9KqhSwVXA*-^QL@e3VDM=4EAzD0UWmUchEXkjappzommGgtS(rjHxGu zzkw+{G2#t5ODVo~0(IZK!kBl^FMuSG0u6LW6wiB&=FnC$hPDv^l?LT_?q}diJppg1 z3qx-ITUB;$?$H?DHJK@^k9xP}ZtZJ_Y?(s}`TbLkZhkwKFL-Z7ANafo@Y3N<6$-wf zP~peS@?5wgzMW^HQQ0~Fr2daVt!8`tDMK_y2Z0LH^EUN_j8Au?O_nh@ehUJ96I#Vq zglLTR!$&aoP-Au^WyvS!L*9v+fy#G*p{+QPq2)i!ZJ!9)ki2hL4v*K!*Zf!+GDtHul<$!rSmN|11@xI376>`joGnt2dAHf@=-0s2%~9vzF!w>nbO zAZ$8PDR{T&>P9OVVDNFr#GB6%BADS1MPS|cLmZQ@k zWpeD|k4`1hr;edIjEf(}wFZwwmSnJ#?SL@MCt(VTu2yOaoReq0@`$hxKTLyvat3u$ zDkG~%z*Xv?e!toOdChL4_gqc!Sjyz^5!cY?zE5maL>**u|NV8V;~ZF%Nba+V z`bq>uz|FrkOV$$C*0hFKGSL_RV5dhQ6aUUB42Em_&EYK{ zxApC*G(tNQV=lT~>H=>+?&VAfBsLGoui(JY`Ruw67;YlP6yHr$qzX zIeq+LiScKi_`eh+R6}ylGkO0$1@lUm(qq{f=E&@M^ywl}#|HH5*{H z(?1*YXb($bz;YSwBK`f^&Nh8`y?68IvlYlTY3;%1as!F(${Fs8d(H9x(~dazb!Wy| zrUxDvxPb*)D9`VY$M6B2{FVEysE??}^1XZerI~;F>jRf)-=9A^k<<(zdhZ-6`Cnod)f>!nanS7LymW+{@1=UEhrJy3y3T5J}*eRRSfycyx zWvOx~wJ}ZfE}%?DTT=zp%u8jx)1EA1nk_AZSFg#5sh7>jZAt>vWPsQ+U$A873)BMK zz!>%l{SN>ZQfqd5>vGWdI(E@b2PdN)f4@-}*g|xKeYV;V!=h(%=z!|bbaFu3L8;pe* zXRKA?MFq0{PSJL*vEsKNfSchE_GVBZ2GaHai;$X|9-s`@$ZBJ9{1^o|a6AS>eW6F> zZ!5b1!anU_9E`?b)o`1yC6-X7zI_O&Kfq_blF@ zpL>AAJzMY|I5*AYtkaiX9DZ0h(m4EqDM@MHpuyxxD(#~mqWBCavzN6MEo92;#S72U zf5m8oa-Jqwws8a?&__?21ZhyM&T@?l*ikzDW*X4pm(HEaSP9cXIUR1^r6o}K>zuAW z)un^nP?jNTfGTGcOfEk2`QOo{mN{S<&Ym+z$)fXlKV{7`S=zWWD3G?+f(fRqRBJtV z*k#{8vbdkF_T*VvO7(fMYUXCq9bP;HcHAlEsNWfg3K!T2Ck|b+UrPe#(}9h&E$e z=|{dC0_^j1wkOzA@0;&&!M|DPEq}xpSfmia*bOMl5Dec*9lz7CEy1UUNQp!7GleQa z-Oz5dWD+hvS0o2$DwZvaxk$HQ)C@}2572R`ofvk&Y${W|)y70VErq*0mm<$F8Z2Fh zOF~CcFaJQ!6gDZdULl3TVP!-*Q2>gTAeK#Fgbs=sK%K1c)ZUr5iH1nL5&uk$feeZm zc|clB+O7AOPc^Jjmr)nXy)9`i7!12=rkPr%E)SwU)+~%2)cYtxO%a&a83DqBS^+Ov z{SNz(b{1YGuTBCPM|@A+v#z3~qN^#pU;?b3uPujNW*|dr+AX$~O*hgEPN6KKWTAqj z4lCHD1l5A{O)Co*COpg417(p&tnocVY6;ZIX6b9pBQOqp$%=5v&99rZ5_O8j|B(l3 zq<2nOH6|2LgXl1Gxb_624`4n4Jn%4ebP1SQ#91OZdSY?Hh8Imry_kUx_mJ!-b9i0e zG$)w1pn_SY-pV6$kX=SDW|XOw0_Y1_KW)Dat2JDGVHl|H<7XpBp4;`a-hhnCbidvL zJ=3JN6 zeO+-=^Lz8#zAmB)tG64xkk>tr(D!H;XWz}gT}f$4aBWz43v+9sRiD@h4A8Ty`Z=@n zQsKPg>IpPrlzZ9a!dN*?$_jWs5rCr6KroOkvi~*PGkDk=$oRe@y<#c7!?x+M_h?Vb z@xBGT&vv=oAI!`w=j(GFku!j-?oE2@d+!3!D5m9+?k%b33Z;9l0#NnAbHcc(!)x$G zv@3)1ArtMjS73EiP`y77zqUM|N9;fD}-uYwBqc5 zM7`-7!ow2UlLRo;qffKm`uY!?($(@r%F`LGAzkZ8(vy9QiPwK+fgwKK7VB9$d$gpC z3NEMA5Cqc)06^4y06O`63^JFn7`fSxn_TfBF~k5Rc}0E|YjMFgB;d<}X(JxW zf{62iu|_@Lj0vU^c1Y#^oUl5kinbtfjf=PZ@W1G1`ug^eG5o=R4v{-Rp$9hpvG*3; zRq=mkPXfto0oQ1UK5u=2xmZmTA)>!yqgVFmHPLD8&W6Ak3V49XkL+XbYa6!BYW zoiP!m^0wfc8E#Kw&iRiLHh~)I_T>iJo|^eeQq_|T(T3nE#waRwDUV zs;X-EyxUyrabia476M$TvfaN)32bRRSKe{R_;G1)y++P=A#-Bu_&&Vpf(u;@ z*wQsejH!8ZveJ{*am9V&_qdXtCz+%6wNL4}2o~sU=PV+WEBYAYPqEhzwW{YvP}Ig? zoKAEqh)B#Olf;&H!Ywr){q>6=CE{E}j5tiT0DL%Tw0ovN>8nJhAK6VqExpP%VXzr3 zk;Nl{;Z!6W3g0wtB`2+&3^B+otOS3MG|?=(Hm6R(qeYw51?hfP3R0j=iNfw<`YlkV z^+7ga*NQB~h3^AcQ8`{Ox%qcACu45pq?}rF^uLg3AFT~AqpZFdhpUA|gRqoSbuqdDbB_Vt#X3{p5Mx6$C+CmU(y7OAaY>_o)zT%pw z4F@W9@*|jmha=fJJxSGdQY*B+ctwcgAff2Sgaf@QA3$2M+9XAEft*AMu=;^8##z}f z*5ZYTHFb)4k_a0(i+D;%NaEoxsWRIo*;H5ASb6S;u_3B{a(MEJpcwL^59v?}bNT0B z1fQAhKhl8`ysb^Ap*!sNL{MdH8QdQDugcEbzmJ0TcDmm4t-{~_x_Y!G@)4Qp9}5iJFe+kSNh_+QvX{vVoX$wFvRG0uJnS*A4s3hMb9lu z%YtI+>AKm=7z{p26G;QO%Z1QZ55+T|%cY^``JfBbr1x?4)fFMo}$h~)sEwSI&-NU^kQ;>mCOhL$?|9HkITg!2XHwRFZaUB3Wh(l zEtjL?bJ>B+eR3fm>v0SFS&V~vw9@igRD2p~xh*Y9#_D~#kz?46^sWSK#Lp;)^2;`7Li^%)=6WD(=x)ks8+s%50f^qJWyC>V^wU`eKKoG882x zvI1dea<=#PY#5IN>RYrqGPZ2{XBZ76z^wdlk@Qu7wES&t`wctS<>}`MQ5nZe{nihY z0{P6SNaCbanEK67Z1f_$<}6EKU#lz{j1j;AIk{a3N1}`i2j{S-*tvaC$5H_0p@Ad; zIQl}llJDsO164VpQsbSlKoTz=o#Fia9X&!)*bLB=O4Bzi!)1^RV; zV`qD*=;<9zegBbqIxgt>X3zF=A1&SnYngxFSVx)#in`o^0~e6QCo_MC0{Rdols38n z(9A9P_~dgd3*01lga)>+?7!TT0D)AGEyfxjOsEWK^yo>D{YPJS#(3h7k=`MmAg4^f zQ$Ap@uRhJB$RC{T@{YC!UT}e1QW*(#yxmXXSQlbhl-JO)t79-Zjd>^V*V7j+R5D@0 zy^~}EaWCW5IA_5^*L(D%5w?KG%+Br2Ydi85SBgvPUpP3|?6h7~slz+HK+n>5Up*7A z<^Q9ew0KFV>FKS3!}c{kCnguJF=I!cb{bX#%0t0LPUi3$xV)A)2(yH_-Ra>ciyZV8 zw*_uNXr#$rgn^Rs`rg7?$Qm}orUA2VP%e#6o0Yg5J`q#!;^}G&WV`6eoK`EHnt9Q% zqpHazK1u9l8Eh#^0`+Cnk+DOkpFCRSb`dTF<|3wtKP5d^sK;dhOg4F4TKPljMQgs% zO0bLBC4MQSA4(?pHQmsm1(6D}b}hU%>T7(D`}z;?zp)G;nTAA|gp3zJn@p_uD~7X> zvcSjExIv3-KIcSgVM#|9JUW7gGAk9=)x|rs`qLb@(f=CKfzUtikb>2=a6#fc;ncJ#{6zgU%H_rvh5 zScYVfO~CQ;a*euq7{Den{+J33ZEN*zGl^i`Oo&^3Aw9-n?*~Il!OMAONqI$+4^Wq6 zJ=dAe&3N;`?u{Yr6tPssPYrUYlC!#RRB~A7^%|oe7)i5o^IXAio-1f;b2V&DnM<|T z$qa&QnV5vS1)?>w`LxB%yA*?D2$QTx&^~%lS`6gU=Ts5|W^`Hzt8st~NefA0E^$u@ z%o!8t%au(+`uL@Zm?9;x<)e7i_)0$7Cz2xNYVe+q(b)I(y2|Zinrpv3lYrUsCkJtU z02&Dt1GO^QXOo*`n{gzhw}YwZt@3-w%7_jhdvgN1fFcMaFXZfi+nd94fg2%9*hx!`Y+P z+=;YQk(&<>PH7mU{@*P_jlUlH;N4E9`Mq3ZJdEJl{QP(`wMPoa#@aAy8^G{F_c`SE zkteGYUYq}QPxF%`p`X|E`cRgAi|&H>>0!D(92I0$Qac3%Z-AO6jlb2Gz5p&QBP*p< zm=!Ts$9K6oq87bf6B!a*J%8`e^vwF+>k5a&q!w&(k>3@V{4lpwo5&s0RQF2!dDD0Xx*iRCLo-^>`VX?oz}a`8xt9h=H%M?58`&!!G9<`9pf zJYeT{!IN%RuZ{K*&-@vy?Ce z$?U1hvj|}7&QvDUrluBe6|9w#Kab#_4jah0bamCovPwk@YM=P@Hjv1YkQ7cy#k?CG zWB$p+c!A?wE16!$@3yU8Ms4oCNDhmjNBI* zMPVgL9yVvA*eLLahqg*eN*DKRKCxA6ui7XuZ1YUF-I2$|FY}P<2HMDj-%h8@8juA} zJkFJb<;RV;T!I~h;DPrnjw{U??JfyeK9iHL9*FU+P2&$~>2vL4G3tsQLSf&%Q@3PQ zDFcMqnl5u&IK=-bh9adEm7yQpQ%gJkn>^ZQdxfd>Cuw|(!NoC%&cKjYN+7T@^3Ksa zb=C=V(xbqY!TDK7q)82hF~4bLL(AeS^a@PO!LloV`TmF^WbAzVzFC$#}*F&fiMd5bl)Abg`|F-ZZ0+ zDJI!;DUjieyj32+g&y1DVG3Z*j@uYZLwLs1%iR#4hwEHe-()r!7M6=ItRl<Z(v@6zAulusU3HOxT z;4g-CDZV_-W}4qQ;oyVtN$cf%gJb!3W4ZsDNgYf8^tP^baK+J|4X`d*40qxYqS4sZ zdkIBvv+9zdLgP(aH;uK9uk}LDGiDelz5+QYsBg(S^Z9(;1LJ%K1~M|1hJl_!fuyA9 zP~V3Y<=8e)XvTddzE^+$1A0!WK1s~G7>g_jd4A#gbjS0d(8FM`mRG;yOFtVnGDqW@ z^IHke2D_CmnmCc(KUer(+Ri7-)^!?0mHLK8CSK+Vd@6$%$qpV#OQ$}h-Z$jykD}+2 zkVF*u#0e`Nucrjmru$UG|326rvHl*#>1J8|-ix}ZW1$6GWBO2J;Oa?mk_q0bKbe&%-uf#NfOzJjf7XYk6@zZjc#Y>R~y^(7c&`xfim!) zi`ewS2biEhnXIQVP?Q4nSpkwvpw6yA(0{4^?ydQ@TU1bwJTQ8j0=ELo3yV7IS@I!g zZ+U|CkMh|^pMm^;q+JT|inO^a=2Cvv)|^Sx(_`WAHf*(7ZX7vkzB7Ubj9uBg^0v!k zt5Bs-sS^GlNoTJn#1d zm^G|5YoC4YxNayghVmQ`Wwh_;j?x(Mizv|9ZO?o|0{Wk0^|)8wDOCEF1uo%0nkHh0 zMRBql^`er+2i2OZ--F27CD1Xke5E5i(SD2cbDf;YDv)t(e?gTV;8IlHfK~?rk`e5{ zn@{{N05*B^p>Ugj=RmoBmVd`02b41u+@x6c>xobuvgrIqM!ym%3~-qRM6vU zlw?eo?4W0kt+3AhUuZH1g)B#q?LQqAh^l;23@^i+h#owQQxd02#15Wmx=H^bG~fJ& zPX1xGiTNdh?YGAVcRzH?{qkQ(RY6XA8k0Jh=H~j8|3DVlHmj$+&A)Yod@>qJmDzuP ztT)iW%S3@!_-)^o4ayi?1#mFZM*#DzDfklY?lcx55Yz7l-Y=d4C1K83S=Tpe(erWY zacV_MqCIMw%dSGZ=q#tywkPZ8L_yH02A-s?^@R9G4iYNNe~wk1MeWnPEqF=C(+$!=qgQH zx*VG$n6gTpT&E1C<0U(yDR!x}FUis;aeTQ5|NA8%j^$-n=TI>iI`+FCx_8tN1Vt%89 zKpYktb|c1=+R6tO(n8-@H6WtNvf(iU--@OGxo8LhI))olN{^~j3=VSvL~A`E0IPuQCNX~cR<3lAG!N@cXOhdbS*tAhbC5{vP$>I=^ae_cRJsB z+F%N$V;ljuV%vM-%1`tw+XTpXjv8G>Dw(G(y}z*87*DFn-E3V|m;NV&IWq5S5$TTCvXA zCVwC3nFg@;7~=$hSL)#W@(|VexApD+J1YY0It$$d>*7!bNpZskA zQj>8>mJFNsGVeHXA}=47NIC<;$lnAeAjU_W3RC}bb=N-7IUlY06Hb4G{ z(!#$z;TrMW+uo#9QNe~;T2N2&PT~6-IEM*nEl%|xk2yPAG%e!*9*L?tHVmmyo@+l) z0m>4*UQ<-s>^m6N$P&I~u(H~e&WcXYXbbv9QrrE+4uH6~P7o+@Dkh9aRuhX|i~$t{ zd*qs1AHKHR!s^T(RPMwobCk}W(YJzP-5`)qP?vPuBom%w@1b4a{Dca8T&xT1a3k=T z0Z85ekxM|M1qhmtz}S~qZ%Pa3nfTmNDlUVM@k&+RkSY|=9Y=&kBdRzN;)KvVe25u0!vtUxIk1@K3&8mrK%p3hgaH~@2`jG)ADe05x1SYn|r|l(Spq-Q% zbL+s#<%NH=1*0AcT>d4F;Xcn&fBPzvi6_! z^S6#PfYv_R@Hwl3&+SE9N9c8}QJ{&$)@rQ-ArKDGXJ*zsQj3~`*t2LUoE3>?iih1PB6YB}s`CD>*-$|;bV)dG_CBqff4uJd~ zMR5^xD6lm_`9~p~Mc*6bOMo;{P!wtIFzTVjE|% z+?uy{RKnLR&Y#}SNOSS?5B+o*NzV}RR|jX)d`3IESB??PN)$2%m+=Q9TuhlOen2qz zoDcnqmv-Se7QMw3M1im2Wc2M$A$Iy)s<-e?BjDO!4prGvP9i*QV`|90lm8A-%v}EM zF*Hxw=WiTQB%7HzBaIq4b>MFXk7_3c4CIVi+a72R*yMtx)OPnTacSyl}gYXM^rruThF7XofY+moaf|K4UH zS%~Ri3Ms8XBOw80 zE=%ppSkn+v6tGGQs^=R}Gf9v&Rg+Dm8jzhC&TA?rL~LJFcVTuL$dl!jrlDY;)(JESB{0`EhM9cL#XZnQ%$$PI*eyy2wnXM8n%MH{r>R= z!4ToMWBBf)CeyxP4nABqFeQ+shiivat6QG5GYAr;IlG_H!;*pbWLsc7AUHnBy{yz%G*k1bCF3P99 zW8X(MAJ2h0{^rQ|IMxJH6p65NFik8Wu^ndc=UQ5qea5_}129IhCWF`;%V6dyqr;X( z=Vjnv3@~`7?)5z&R-aa*6BBkd^MgRmKk1>{eO)I7$NkkB2P95I{bEwJi=`ulO+~LL z?V}t6>hW%SnM$_+4!9+!i9d#R)pt*U8?NNV21U$-r8&n5`~2k3hc)wMk}$r#!uLX> zK;t7ZPWt5xz`4^Kdq()Z#J%D6ynFRbt!-W!HS>O2SzR^zwrQH0h6gMYSy_FLoivKu zd>=e#=jRDwbq=*1UjNGvfao4}(t4!3^ekP>W8l%r4tfJ5_+rhzeoc(I<*~AY$j+xz zL=zC_TKqY$YpUx9(mF#Y>mpyOIQq-POB?!jis{J4<1)C(}|wPL-ugv#NjOkEqA96q7GT2J;M%uH-spG5$7#GbRj23kGi%6eXg)&$o)t;(&Vtfu#tL1>4tBfJdg(DS5kp;kF zS9JUmf9#?ev`A-so3Ys#_%{cUl~#yW5|P);Hn+Rh4IO~}H`#IYU3qTBBg5$4GUN0a zVAue(m;BjwWKjZZzE;_$?+6SERZ*O$Ho+W(1AS6IHqy#I#hJ&@$t@C~vL#vT`wyl^ z3qN<07ehDm=2-Ey4n7R7F+^he@&U{jw2_E#8HGJh^vYs&;o9u}B&a}&taU4Lo%%|N z;vab=?&;BW5$^Fc$9#-p4CItFF$abgM|5)a@;H+_&)CtSX$+Af)k}l-dbAqWySj_o z-RkYIkM{MA5<;Egg`Ok~B%wi3eBWZ^-N>c>ntNVy-E>%&eTohAr^qPL5)5~So^uT< z;~e=nhfjc7}2Qcyos{DnRSVnR=U&<;9^h9lsEC%nPgQ2uMxJe`^ z8M>ULajce(TItEdH-wp(A|#K4H*EKZfygt#QnE+T*rcEU1jFIAJy71`YDpuhnGIQ1|+`Y&JyUbZ@ z=^y0)L--F2HE0hQf}&frNmNR3k|}sS54pYxr8y6bT+hmm2kWpvTY*L)498QEAVzJE zBWEdZRv>g&tId1cMNx$j!2CZ}qx<1cYQ>x_;+f)HYL#}M`IGMtLJoS&_j~UbgR--0 zs+%;{p~}Wn#z;r}mjp&W7nNHycJ>9NfQC5xw#WBfgzgqb+8~37db{Q%BHu0WDX==G zH=FQ#G(us#{a+&DUb$`kwh#?S=!@9lMlf5)2h`vyq{c@3Orl@_X01-28&H@cK#_)7 zE;!K+zL4Dw{F-hbq^XQ}z+YTdn~Wqw?5#3S4%eDPHxbDx%sNr0r%}#e&;wpQPf0?X z9zn;+DXgO^k>$$kb-}frrJg{k#^K|Hr#`Hv5xP6V^}W7tei%&B&svdcT+&Cz4Ew`4})wv+1{2hp=K|7^0*snk4V{s<+F5DZhuQrOQq zhZiKJACMf{scORP;xgI9(USzUd4b^t;bn09fx(TioL?y|0wCIm!V-y(2=MiT zQgBe7l%w!W`yKg6JDM1uCE{88Y53-7e}&$J@%s*$^Zntg7sF-f`upRO+V2P-S+sq) z`GH7L{iGzH@M#0pcR$VdXYOm*d+-mRXwhryHaYeMUVecQJPT@N;tRok)`$G~pPUYq8 z{PO;Nq-Vq(7%;d_IDf`$#1y(d!G5`jd-e2QD%7gMT=<1x_cJRie7-yWkUEBs4h{dNVr1CARAi{s?wmBNt% z1X-u28#!S8+9Y1y`6PCidwBKFF%PRTAN=r#V(c`?b8C)D&*pxP*Lfk9l&he=j-76+ zYwVY*seyBk8=kedCb48uJ@-xrl^0{vzuuVv&Vt`Y^jRd4N3ID`*?=6R#R?smTdBo` z=)<&wxuSexrJB<(8+!sYR)1AZVi^v7e!V!yB9%f<{8(-J>9BnfG0hc)R5yN)J+_OT z>-TVZH@4g1?3;GBxv!f+Hk%X6e>(UdPd2UJ`$Q)fhv#nuO8--ww4PzqxD_xIXU_kl z@?wbZcz( zfIwNkfQB81huA-7)clukc=ew)1_JQ>aLNkbzMz^s*s#z|6FQE!)aUz#s?Ec2C31O) zl(S?p<3mVEx{8g?b&_q#*BLG~vmy||3MZTI_=;!SE~OUzLBZ|?%s#XBgKX2Gq3(@O zN~B2m4I`=He0O|bB^kO-9P{%5!40cw1$n;unuxy2SR&rZFmPxD{%8qFmG>8_0m3cF=Ixh=8d0kLhH; zbK^;9W)}VxiacHn-~FukZKm)uV+{X`V+IvDRB_dpF1HU+aNFwkzqk3&Z082hsVaFq zz6Fn&hi>dU)5?{pYYaNcCPCc}qm19OOH&6IuMosiO=-+dDFs>VN{tB`*+F#x;Pt}Uz>lGyuS zsu&1RQ*C&yZCWzYE2klE7sxL+eXp9oa4YN9cDY1is1p(?daI$UohGix@_iuERVvmp43$Osw~~wxuU@`@;U1ugstX7~$-!12 z#}p~zz86);Z(M~*_+N`N41yr?jk6Rq-N6~VJB(4K<8rE|@-fMObdZ=FE2S90L)d#- zJIF!M-b+ISQd_+`8ne}eSFw~Bfsxj_V=%~VR>wE-@*vL()7&}+B^Skfq?i=eaW@Rz zXiZirwZLIzjDkv;EE-u$G5HM^tW!7Vswd)hIO zbcmZbe{V2PB$bRVx(ZsYl>QV8j??&M;s2!yjKG*Moic>`HYxh9>-!Mq8=d>a z_D-yorrqYa&3vELnmf;yD~=EA;P;?b$#Jsg<)5-ImGk3?_>gM9|FOZfgVa%|`(dB0 z-g%!h)^&6~9T}f3o_Ip#B_wyd=atwms}j&1)?6og$`qvjL8_X7d`RF2j1`NbQ$FS-mG>A_98HJ|GP0b7@M#^j`1ENM?z zOV9B~W;TPtLum3`>m2?NRaT&$Lrz5)Ytuv@o`h+eYE~&FH`YaeMvVfUNVC11J<{g* zMgr8WNc?UcURr9_-u%|LBs{0G-?rb^dq>DWuir7ZleX-#;4xL$8T|B%l(!7++kzgp z7%a3bavYsgs+gdN^baS$1q*>3M5>|-z7X;hK- zuadA4jOc}jUCSQrz?;)1(Pw?In-u^c?XT-j_r~VaZ{&Gef|3nB=<1BA_##RPZY{9t zc9JQ!KQc@Cz5Z=p&t1RA4k_ePDST4aHpmE3+JA@1k|K7W0T$6 z%qVIlxFEqOmRKs`nqcl4%0X1czs8?-vV7yrBqlDVj$EGAXV}aq-oTK@lSZT>;s2hcfE;Bp;Ca^lt}?sP=}-P= zMGweep*1tS15afQ*XF4mPaf$)OgrMt&WnCIj0OAe6Z-gkD-nq))W+t|6)wNrVM2>F z*ZfB+v=axvd2RCj!*Ah3U)zsZf>rr`Tt6XF=Y4fAD%Y~MJLp4yQ5aq}Cy5ZoJyxCb z{&@>AS%L%}RFB_%F-;Q06q3R{axBZh5kjZJc~#_UJELB3O<+r6psil6h3GAdt%}3P z3)Tk)$dZiA*dTU_C1plir0>Xs6A@M|*GO!$?2<+7iIE&|`l;AtHZPIezKbJh_NjAYq`LPsqbU64KtH zws}qjv+5A`DUeRIfrlS``>nK;zd>tb$tnze<~9IRz_^WIwFee}2q|+u$RJV4Y#~aN z(FD*tS{^0Oqv7o0hMc#8K5sEbF|ov`*4G?4R-SThPU{lk>fj@ldu|t}*LXYiF6v2_ zikc+LT~X1J#fl*(1CRcYvVZ0lDSz~wPtE1jzDfRZbqbcj!9m#H3Mbe{bTnvmQ>~r= zeYSud6jmS#n&Or^pnUy6iE5j=%}06rWlUNTE)%rBBg3lJ6uT=IT1R;i@H;QKM3jJ2 zzL~&HaG7}+kD>Y)Q#Js9k6^xZDQ!1t^U8>@0?BLt{&apzw5J6%=E`w zD(9OhqPl#SwC#HyX^qbt8#>-IU*y^@6aUUY)nEpa&TJTMsvtKLmTKRs2FGi!5k&Fw zukPvCDF|~d!6TACFFQ2Uw+_a=J>=3OP%SPk%?txGbgi>3 zuq8nV#rbZ22qT$aykaClbYOM?j6r3MT15-rZNJM}6gXAe=m*)fo5!9Z`PNo~ply>L zNzXG(_9PF$y(+a5<2T6Y8N3?jOequ3*(ZSU#c@7)*dS@UX1zPv7}=(lDgUI8^7N5p zr0MTw`bG^Z|JaZt4KSR!h$BPbFR+!#hh4tUKpmyAa2 za)oZtc1Sz3RKDz?=Ph+5VhFnR9BtV`;<-0m_uSl+mJd^Vr-B&2dG2`p+-J&# zGuiATAGuuv2EW4@p9$_Da!GEDu@OmbR`)*S;;E1CbBO5~KBDtpqLLU&E{Cx_vYHzz z?#EJEc%subwf-C&Ug)nBYHn=9IMHxXH-eChPJxY>w1_afR-=@+MJb@wT67W4s3Eza zTkjekPbThx;#Cn1ckE#l^1}-)IFG+Ox9+DPaK0Z_=FpRUV<)Qo+HsOTXS8sMv4(W}-sK~jTo8GC@-=(yBu$*304&%>Q zLv-HU&Q`+iA3GkB5wJWs!FtV>a%qycI+HIM!V(fndUTZ}`iNawWmGh~9)yFngeunn zwQ%6;ny~X2v(dNZ=n+y?g{qah)FQVDo3pu0X4Aa@PrP*SIdkKCTaMHfodV8Ms%_2l zdlTewvCzQ&{Hsx)M&e}zA{v>XeAkL3{uu9bh2EE-^=KTI6dyCA$KjsQD&^N&k=R`= z%;BMX@!+f3AHm0P6fATNI@GG-g>rmwH8u?>~X4*!-{;xBqN1ZUWZx@`k`h$5T04ngv)rjXo5 zl85?M8--zjGp#t1f%c9Uw2J>Zbb*+OLcZ1#EcFoewmkN`-{vmnhdUHrZEevZNq~C!QBDd45kz1It3wOA z80D1c(Pk&Iv>}e)52XNUxGEN4QWdV9Ck%Z|M#1n@-17wbdpNND!@=Mf3JjP90ky8c zT@Vc%gHUBeoo*xqIUef>vg|#`J_bDhZkw3y^6%di@uZS`A2E(MAWLWUv^1)mRsRjW z)dPXW^>yFBmxmpXf6t$x@K_B^%)Fz&bOkN~0OIUKANNy1qmp%gzvwelhsLnB>QC)x zF%NW8o-8(3Kit-ikllwYYF<$>1?9@u_9IWL4}P6qx_xe5YK7U@c@gwEXPxo;XmYKW zH&M}>|H%dW?;w;m_^jegycpCms1sF3Tk#DdpfFs}M`Rc|E+4YX7mN$sj(u{B--~m1 z>HYqdwjJj@*NQtI{GK=zPl9ArO|syz8q-DodN3V4ScGHC`4L;plvcL%kAil-!3((g z3t?j?$ub;${iYg4)xG;lzLntK6{Tz)B>|6KTh}xMVk*;QjE+$$D56ma9UOp?M>sgR zOR!`pob~6Hv*Fdx5`D&!N~mkA8~*o?aTlBG>(|QJV>ge>KQ4op;nX8%>xTZi#)kV` zxlepDv1E{&sM4~9U$V46SGiRYAA z@ak1suO8g%HE_Vi&lN6o=Z+oS&l7ot%b#L2c=e=#&rx!gtbj{xv{EPONEL_h{f329 z+~v_dJI^y^^w`mNBbpdMM`>h$FP*G=9=m3JebY^}NSWQjiq#lM&k{P%kHQ2LaRMc5 zt-EABT3$Amn5vRl0kB$h*+LvA5errv9>YyI%?gErpoMPO(NA=$qNrpMwfzqReVzs_ zQ%~dChhK#x0MtBzffzp}m`_5eJ&-(_G9?bOC?A#%WF99mf|GED!lxFm2MeW&kS<>E zhKq29{1+c2qC>S0-HZmW^$@n}8!s5GGV`cwk- zP!#niSzN#ug?mK?23YYJNQzKw8qX*d0DR~Zv~K&@OUNc`lR-V&v7Irsk~ZKuB$nzA z4lv2)>lk`Q1OKgbDZ-ISOOs}@M!uft_p+QFl0zIELPrqz%E2I8H&6Dcr^jI=gC~k5lpb zM{s+9@>*4_zPF%fP@^sqwnkOFNQ41RsmYMoI$**;u2s9$id)oxnzzTH%S#ghzi(Yt zSEBeRCv7;D`$jZz&E|A9rn1vcX6h4Kn(G;=?4G1-jV;43%P=-)krvoay!KJrejG6Z z0`DqFO0k=ReSf(!{lZ!?QEIF5H(-%polzju+NLpf=G+~ti`HQoR$lKi<jBM>`#vze z+d;`SKW~C6m6KHR*d*8!dL7$;Sas8X-Lnsul5vq-V8nm{Ej>V{1u^L@^0_k2R!upU+!KL;LtyaU z4rU=8ogEQ7<^oR@8QC%muYckCJLo znt#S;$;-9tzR*ciNaI27ivIRxCN@Y7tuEjcD==mU(83k_TS-xO<*wH@BmV-;mj`cf~xLx=40J*7~TTl|c z@z$Sm2x5Qu-~tFYx%w|V&wfssFhaZcokB56c_5@E0(hlqXzp4LAD{ea`fnC;Be+f|kxQ20&ypjI$$w5Zhsw}=sk2fB$LtGk~&&XM4!tllhWcoZ75AuMze z$eiXnG&K3PiJl1Yi8Kq|mDDNx@7Vv{0XmvF?i{>12@C)AtZVp26?5nF@J6GbIlb+P znvCSQE?`?P4G8wfSynTG1LHf^w%lh0t9<=7d@4QeXiMe(JVj$fF$Wus^nd%FR+r=w zc>qO68A1b0pe6!efQI?WCOc0_FA%vOe4I{otmd#D!NXs@L=~I1vhE!U7{k&7p1^U= ztw$f;1v}^J^1S+MZHcg<_2L;+UdD6Qdq3isg~5PZxD9=J36S4@d^)a(<03E^ywCLT z4cgvKk#pnl`Z;6M!{)=&o$)8i*qjB6s*Ln~sb{t%}rQf85&XRoeEPiB{(P zu?H%(Dh5E#Ph;G(0X1Pl(F_yMOD67-xQ6Z<+(@BebbSlk+}SPYs>?!IT6y^vRhj`M zk`^S3qA?6Zi$5cGlqm{1r8?$iEqC=z-*dh$OK4*ouoaD(H7>0Ez+qJv(8+HOz*b0z zYt|57-{{LoCX?20RCav*AoI9?*$;J8kQM*MJj3hnTM&#|_K?DKgY!OZXb_s$J=xyL zN&{c4La`pT64vkLn5rgPnLWnr)ibo(;^YT#Z{8*(0Dg0L!<|$@hGls8?&@Ue{Syhj zI6mU-9U#b^9kk62m8nBMo_l>718pCYx;t+5iq!I(wtf`o`fNU;rE|85`O#rCU_dX5 zhp3#yXbtX0&pl^JdDnBGuHyECis&O>^{(TRusa6<8sW{e<}V(Sdp)S#W7fwEPVWz| z>*R0PNvHx~9b2p?GC26nriWjyVUgw`g$6~Sc@-fUv#K~8A{mg-G}M)V zxjEK>-s+Gx}4Ccshap4qZT8YF*{$;ajH#46h8b!^sPe;$wDT?lmiJ<^0)i7;b}QVm`AU67JT zaA2ZgaJ1!tWJhC*b~LJ5;ei52y^5`r+-RX5k0-IyYX0{%!B6J{ZtGL**;MkrGLb$a z-CL61i%P5Oo6xy8A}j-~Tg^!=G? zRu=Et4L83||7b8bT2NRs6d7~-!TMdF*?J^GGhAJv^3Ocuz2Xj~I)aesy3&yoNf<@^ z%h`x;P@0iPY|jP$yIo-IIB=B5gcLJ*Zv~MT%znj`#NFXOsP;OOFp-s!u%e@HbG)OC zB@>={d65E=1rbS@;H~+}Pr8P>dt2M)FQvxMZo_mXA3$?iF4j|+p_oD2@jt4j#^;S}al$Qd+f_s$u+15PCDKl(}- zmXXe!1Xz3`U8dybNZ-gdf0K5TzVq+$e%$}Q9_!%JnX|CoRM)sJvj(?}Q!E5X9C{-J z`X-T>i(eAeY&$C404j@~b%!nHA|A>Q>#+tA{OLEW+b50>jj>MIM1a@$dS?4C#{9np zrq%JZ__;o}ioqZS&0k)K1%S~GNDomkeKb{d@Qxcu(COLFMj2IJ7X!A;cuQ5Be%qg9 z=Xt&~4Gq z`pFr~iY4S1J%R6=Ict*hZ56&_nX?r3 z33;y4sx<2uJup{qTA9C=s~ZoIo16U;_ArWC9F&NL1G28}2}5?3tiCz3TSCKwC|-~@ z@4HVP`+Gh6b3cvEFX!k9?pRH}f>XcM*S(-lWxt?%-?fPL|HOZzUKj=woeDC{k(npm zV`-Jt4sW%maK=cN${qn1c%d5UuBJ5hFAd!u8B|f2(1B%OuYVwf&-DgZm5n#95|woX zh99&^-II5B+xzZ>Cu&OcDOA6OW1#7@ohEXv=lnr5=o$W(;!?@l8Lb}aQQO3%>@^bM zUSHqXt5B+v$^Z`z-xbiFmuuc^n~Sktd$jhtoknLYlI#CBhh%!_^0X4i>34aI@>J1C zeNwH&d$TH3>>|9;;(L6NQ(ku$P0mp7s@WdT2FE z=w8j&AKwFbVibHQosI&Oni1sL5;1}(RR$wat#XXPAFzn)19yCc;0S%M5b#*{#p(lGz!V#fP#Y~YuJgN3IivX*$2%+dexvqpcy!l^`NS; zTIawFU?`k5d+R-3V=*LXnXR2I2Jj)HL9YdL+Ew+%} zR)_OtDfR-o+5}M9&@`5jD#DKGmCqy@2x|FzH;3N6&Z$9?OZR%%jj~;ZTUvWUz;qY0>n1=m_^hs}1FI;9?C~V;|S*3s|UJ+e(d zKJVz;@KDnt&p2IYbnbu!y6e6%-Js%=y|544eX+9naqHUnK>|>eMc@jdq9(LGw*Mf5 z_AmO!AQ^+V@)26${Glq4{N9WRMVs!QOr5WLogHsrz zqO^644WaDH7KwkKijMXdM+JlZ$sbUXIB_38ZeCK7j8H0@TUj4C1{bXzUtLh2gNX-r z<9s5t>;lJ*bQx2S&VQV{*ZZAQ3XKdTBzBI57a$2t*#60Us1Dn0-_uK?V+g=kty(a; zf7^_0@%?{6{((0v-XYoty0$TSo?PBwNd~D7Ro=n`7R-&hJZJVPYtZeNj-9HqSc^-> z_64W9z}HIAF-J$TkqZ0cB8$NRDaM5$6P8%)`t~c_Wb7SJB_L^dXg2saNOWrbjhrSz zo6q^Br$G3UUAuXR};JB^1Vp0*)tnzCkLUXb2=ut^CZ={8bK+whIUf zq6kLHXNbIN4RCp2@qioqE;E}C+EFmVQNV(xT^Ku^x%q2^;Zm&7n%N8+A(J?thf$`` zc@iDd8WT-BPWU9RuKp|1z?)~$RSQdIDF@vq83|$kI9c+|k()7H^Z@~}U;0YhIc?=h z{%9D@C1=cmFo1wZ6C(gtPK`=jGZ4$Q0ELT{A|whTNkB^NNRa6f4Cw8pdV-3nUlWTn z6@Pc80iut8(UK4Bz80V3-n8>gb&n#(+xCQ@i2V56(>0_4UKbU6vu(zB`tY6P; zip#}4y7Z{@c>TOxNHP$*maBIa)A?C4ifzynt15y3pD)y&iL7IO5hS4APGC-m##{D> zKKz$C=+nB^4%<=ZxKqNfKlZb9n|P>hqjQ+j5DU570@=}PHN-}O0O$U>5>2}+Zo26m zb!{<$lb&ls#ouHfDOU{ix7N#RIC*^tvKYM%?o{^(hXZ&0HP4#rz1Lj#vhzcFhN1zI*3M87bMV^ERpZ2q`ZuVSR~y!YcYML+s(sQMdX?)wP@ z`1NWs;#O`z`B!tAjpNQ`k2_C7|7CqH^4LaxXA)=p6i)PqQN&bp0FPh3^$_K%AN=cs zg0d+iUu@iLsQAMg#ZO86BVK|f8NPi3_u9Jgvb8=JRB>sT6e8(|;x&Z?Y;@{A=LB(ooYq({BE0sf`kQ+4hr&i^Ti8`uaTWDzLy~ew;WPu}_BPXW z;?M}oba7FpaF+m147JD!Mi_PCP-;1Pj+>n^DBD66E zqZEiX=GTP9goH=r<6{KLL&N^pBwhfzTw;9bM;f9ur~qb1Np$u^`Qu zhI8=CrOuI{%SjWiQ1qb-32B?oQ|2pzu7a7TXQe5NdlASrM=7eP68Hj&)6krtL#AXb z%3=BQv~D9?{2m;LdxKt{?ya9+*C-?W9u@q0m%6Vkt*lB`{4PM}&s*+S-S<7Y3k$SF zRX~(>s|_t_p3C7&-+|WaFpGxcU$OPp*te>pqjjBckAE97zq{aax8Y^AiufGq)$T8( zJCt*|P&+!4=I(uF5O3)YH@w(O?dWV~KO_E9kVye*87KL%!Mow6-|_UU+Mant+-yA0 zxKt}>xFjPVQioTLqo$L;sq$$3e&a`_f=%Y}kiGui>>gi2c>dTM=DGiS;-!z?H?z-V zH11_t(iKoc*Dz+~ml*I~ZS# zt6m8Q2#~FLd^mqWvdu~k>=)B&>#f@Zn^qs zNDBZ=xd?PBuu0u^3=lducNNE(OoRw0W7h$nxZCaqc)5D72)o#EK=&4AW6Cze{&Tx% zum(&YPL8N_sypELX6U^VRNcKEnn~u|0!oi<>;^zNKeX@aT^?N1HTH=HLO5EY@;&!R zi$uV?fsVlg&Abaa;N?bovvr+KXjVKoyD7`dqzE0GDaAtKH1>*{qmLIsS7ZZy{D9vm zB}0f>&^or5wbxcyYlODFG6YUdcl zxQb(won*~Xp{=Y@-eem~+Dp{M)Lb$dix&wD|Cw;xuFH6mm5jO@`WCrPGzsi)@$Kz^5FM-Wx#7+?rdRPY;a~Pmu6{2r6Zf!cmSPvf$f+uhEm9N7PC7!FuR+B7Tb=9g0@BeS z`e;wyt(P{g%F0ToY2kZd?M5661_}Y5oj?QHLJ&=L$>@Hn*2?avuCd`lsz=>n3l_;x zHnM!An)hT zY{3T#$I4Whtwh2~TYzL{nYeGuaEiU17_6<-IE3jDeaJQTJix(_K9hK}%KkWUMUfB4 zWQgOfIw=&Fm!HS18ip{Y89CYLS$=tpbDj(pNd-(Yt8L{454pKW(nWmvEFA$uBaipc zj{zZ6YYK@cQbSxmalLq9jQvymJ-XsD1*{s6m3ND<4<~69fB`$)pmS^zOsC1OPD602 zY6nvkLK7dzN1OokL=LOT73uGUw$dEpyT^z%zT~37F?sK}iw@`fL}WEK+L7429$0^$ z8Te{%p9mow-aDikxLrS{>vL%Cc_<7&R<}D*;`L^-JY%OhLH*D->1ueQ^zR~L|L?`V zvdniw{yVpcABLCu&;Qg<>`tCfV@WA*I9aUeQ>;h6`RdRAK4TZaT|y4eJhfn`JFP#! zkP_*+tLOphNFtLRo3A1nlX%C(nJ{W0F_SEJ=c0qdtDMN%sR;eyQKi$DO>BNSZ;M0< z$Y~yHLFZe)+tOw|rE!7@%rAs;siOGV1^YywR{X|)=kO=*o_)zgwCmLarUM1Y6cn`o zD?UvF`nk|83gAZw5~9JiR_`3v?Mj-$?t_5Bla8UG=~wT>7U36V*VO!EGkfzOAWjNk z72LaygS<~#d?S2oCLCuVTYUr3O(PE{)*^i-Gp27lu*yxjyW8%aNi=dc+?ml$!#cXU zMd}ra`}|E`aLp+Ypp!L$wk(n`i2aBEM41-Vo3Nxk&)@6aGQD~`7MAXr zO{suK=*u3#L%5Hg{SjKIC*qtOU@R0va5?&H0EOrbk<#g&pRFwA7$RCfF3W?jt4OHhhE?& z-Q-KaAOsf__2;E9Iusd*_Lu)buj{@7Y*{bFKwkIF_s!YkPFbuPE{@ypyi2*3mY3JT zv)t7h64pK>Ey_*4;e1Agv)#y|Br^CMO;6xpS6$;rfs|EW=G2s-Y3fSpSjGo%CXi49 z{uUbQ_RjFoyZ7qF+E!&<1u%-^Qe}6Q`o|S*FOMVvvltixEL>ckSl;VWoDz|(;u*1N z9Zk8;rHlE5;Ty8Apu$eXtYJ5`-HKKfArU?Oe=MCgoC>ePH@8D?(Xiv9fG?A zm*5cG2_7^AcXt^i1b6q~?snd9o&SDj&6=C;-LZ>`Le~l&22ZqpA02b_`!w(gM7)RhOlUhW&Aa&2eNj~lw-T+Z^ zKe8%qi&TYRO_fw-jxrJnhOTjp(ZvYMoZ!G?Ku&JseS~7Z1tn+G02dj1R<&_)p%in6|s}sHN3_{C65j(A4hD<(~!-|W| zc&dFFAl!uxZP>FdZOka>kw-`w(18096q7AW-=lg-6NarrAy+Y&oF*E~j2hcR;fgjs z$*$>ECY4mH_X96w37RG0ODl~MoE|X|S3D<-N>7&@zByV!&Fsj(8v}kmKsiZGDy}5a z)(h2N7Dpk|65#u^V4%nT$AhEql6!Q(nql}VlrnuctoN&em|?UyN;52c2(m{?GI4YQ zp?GWP&!0SuHI)6u@bty3#l8uen(oUIyj)*W3Q_PWC}MFWndLu48xP7xk2CdiO88I& z9jj5($>SEWA?^e_tFjM8{ho|XoGu2NRp6Li5r~B{aFEdU{0p_MRObJe|5;Sfpg=a~ zWb6Eq3~p0LzL~`(mN#tC!i*4b*i@S}?*BQge@Nv%514oc0W zl1iNHS#85IF5EJrF>~#2;`yrY$^ZAGcFyUBqS_JU4g?yUyC1C(p>)}|Zw~S04NJca_hYO=*6%wa`XkWQK=5|1;Ufvs z{e|<^>SdBey3#ZiHFKw`PE9~xAg$M?!})+-e=0-zr9niyGLX5&&)v#>CZ&{9uL~Rd z;yu*L!GbkMXt?Xz7|k77(C~fO-7eu~y<60WeBq#?;ncrLu=X$Rx604R31aWe^b{mFD(h&2E6I z4FrHO%ql-soKVOu5Z+8o+vnvk_#%y>N7qeDl^U;I(bpFI_bzJ^4~x07v;&5OpRtSadJCM(o%g7voOFv zfX_kEK{jBa{?%|9!Yy<5IP>KY@6rTmj~9{g^iV+I=bC#orNW^j^K|ZN{Ep^_pkqyf zOk8^-RXb&kA~u^x0I@!4Yi@ZXWZfy`%Tt<6kjD=&54y<34uGMlLv_R)-XoQAYWa+sdZqheb4yAL7i> zBdROXD`c7CY_`B}jLStQFh*Z~#J4d=t{ka|NMiObNc^%0ebo|wk+lmyi6?<0as!NF zUO`fa!CuFxqt!E+j>+ggAXr(HWv$_DCFQ{XjCeUpMn?y;1>b(3C*X#2E<7L?;fBWb z+>&6M%d(>h#DqAYs1*(Va;@7Du+(13KjN3=L{_Uare`i07HerB2}(&z(`F^rv0OpF z)hoN6c1%G1nn zI@WdjbF2V7)JLKPm&WwwNW@X%IGj4Dn-(Ya&{Vd z9SnAeHcXe_y{O%Ir0#xWc#rD77kPm}C(Ya|E6v^QJby$#6T19h^*3h=^1iCV!66{C z*~-Xhu)TKv_Q6{)e~px?;xnJ`8!mj#*R(V|o5mp;+=8F)b zE@pfeZhn16W~O9(xV1_&V5x1YbCfx2`;~hk?MK#%aUE2BjHPdkvQ@I+SY%&9?3_jB zExgs=?EU+|du>AEJn`df7XLR5!KZ)Ei{0;-7+t4{b$n7w+{wxHEpcOAuLxe3gUNyy zO)|3689s$k8@4WseA2lVs4_5_mE2)mAn)%x-qz-a_LcoX5(`4@0^L8IZe0dXTZo#W zQdV39-ZFNyK7PsW(NKAzP#6FFg94FO$M}_~^3EUReJIQ!{7PB`7DI<1VU0>0hx%Oe z+H{Q04`~b(;ulv96!!aTdymnRRIzW zQ6)}`Q3$6l08xvwJT|J}q5)%%1E?_zWb+okOP=9mF3W>1{Jl_A9~K;~edo?04?-oM zoSDzZ5bzb0OA(94Rj0N7;_L3K31|~o|U=cF-isG69 z=y&-9xQwt7;@+tBAiyd+(iY*eknY60ym12w<`qM`bn0}|?xLUVIJmtN<{yN8><%#dR5OAF&buNsCWIn(yjR`cVR%Zq z&xg?S&0>3Rp+9hQbN}<;_uCZ0xEv_6*uPtgE{C3O2uVP?&gGbQq$nmw{M~*iFrRU3LFB>WMB5vBvWx#-#wlIC#Y%GlD^8Gt|8sJn5Ot5H z#Su>9n?#(mU`#5gDT+IM669_!_X$@=K~x=?Q2?6fG&vSlt8MlOix<9wt*%Ap9}gSi z)vTCZbP{Q68n|8FkzJ5Qrj)SC7>;~|!?oP&Nuk{D4nzK;i0E+^ruj?pziBoZ=&Ev6 zMC7eB$};$h8rjN3bR7oSE9fnsSs?_KFaN~1BB$2|)q;mHko+(vl3{}sWW@%d7?6kT zNHv@Dx%P2j;YHLRf`)GMBjG4jAG&&6K9*#nD?@3~2P3zLNwTx&yV5^16jAlh{!9_F z3<$?GWYw()#M9A2z zLjchu?X(7_>RT;*F$sO@w{+vyo{iV@H~9ag@QSL!Gpw+Yg5K z&WEcC1oBoj8l}1Y81x2h?pWPdu=lI}!B)8sMC$UkjqoAspYX;5pFH1<(a8kRMLi#p zfi;vPOPZ|tp=XMYJ=^8 zPK??X=O4iEesl|ON^qIV;+IMGk|;8^xCmQn>_-Z@wQgGWd#z<*7wU{??R;)IK6}o{ z>lW1l`2n{l?8N;AOrD#SQJf82?3fqn-I|1_=(yjkG#Uw;pn(A z)2ult1=!8vC3gN7iN)?D1+|4AJOM={0P)_hJ61h_jyjqWbp^1n$Id}ylNys;Z4|IN z8P}*Md_VtwzIf#(E;pu%N(b_$eYZrYJ_nI9(GLN{6LvvNYu-RB5i|CDTDLe63jn5> zcm~r-%0~cS9c#iwtaA?mXPSGQ-_IO(^{vB*44tgrJ0GkCMqiG|V2QJFKY|OVumQun zlp+ZW(57v1G`>?&=?4T^r@zDwK5kGc%oE&90Q}`OkZ!!-61{`a4Eo$MR0fK$WD_K2wV6; z&$8`}mh=U#%wUL?v{x_Wpb=A);BQJYJ}vb}rbL=!MMYupw5sINEZH)GJfBd#9aaD? zN2xTgllcxh9y7LhdvU61d%*<=I&p=Rbzh>%Gc7$fJT=NblE;+T!~*Mx_{qV@=;{~j zYQgt+Q@2wa>3*6bcOZNPn3up1bJx3%F)AA>R@W9l>{lF_x$6q)DF-EViU6k`gEBON z*%k1&P@l2>t4t_GT8kY++ybJ;+?iV@IqUnlSAxAdqbYQsf0S4#q(xvN2Z@7AK^$Cg zL%XtD-XMnKzUC8>A!hHPAT+Fu#sOh0zoO!Xf*SRWuXf}PQ_Ap^_vp_M z1S7+Lc^NH_qV@M+9wrHJyk#TPV1v3T31O8ti zG*Y&Z6>1umx`!)WNYKb+ZvaB_PWx8FV_kakQu-y&K=>79(D{*X1CL@JH8C!l8#-jb zlRAI^>p>|c$xH1c9f(^F3O@%DX(lUj=ITOIa%is}Z<3(T&P3oC^9v3Sj#E5@oo<<0 z71h}g!9x8?kwQ{F@hcX6|91j&D#xLVmkChu8eTP*Phz69} zShRe)ridwn$pYxeaQzUO_UyYC1V%W1^_X=kEi{OFA^5YM-%nL!c86NZ2m_5vj?mjg z`J{M8bx@1C1{z5bw~maOwG_*Bf*3A^L`B%27SJaMR+9Uy3_)xip_V*+A!x7dp$fmf){VyTHkIw)sI`|kqr&zF1#O$HGmLN-up{> zhOxncL%g7Tr5e?DLA}#YY9KQuDCj;`NxFl~k?zeW{9XO5m^I1fo2SziH(Qhpo+&9K zTr1oaNHjKYE1j3?oa4P_Us*G>ijhR>Ex+lap~Z4mKVfs9mQi_*W9y|BZorzC`TfOj zq08eO>D7xe_qEpFxcY6M0p226yZ;N9gK6xL3uwNN<*hGpb6}13!8qW~c*;7ywy8-P zGn9nShbQlSo6PmzAH(G?RpXCwS5Gu;9^h`gzwqsT)~A+JEa&P4c*=CF;V9|M3Dk5$ zU$TX-k?VoIDH|7BO4G=4Mp9+1VInyquh#>sG$1Qb8({*3!zJr2Z_*I4yuraScm6EY z=l?nj?aIf%do>LmqCZjkHr-W>qg8b6CE#fZJ$Pg^(#_vEK5P2P*5>{)4dwest;OTUQ0_@;WLv4Cm=Q#vpB9mQehbE0K^QQj1+f=`@$j>01eirNk8Y0NFDO#ZF^gY z2;1LlG5rNCXyA7Fh93w88)~I@_w>D-7i1&b)b*u~kumAg=V*ZUTps@BiQykMp{U9? zdSF6gBO}tw=Hs_pzQ(OS8t*)s6XdXw7@9iVvH@2B;@*t?hJ^3Q&uK%M($HR5V0#P1 zyQZXK8q-YA1-<7XL=u?}n9}vIQzYZ_YYoe^0IR32^$iq(thm6e<$y^5Goz^}_76^F-;1mLI2gv9&J}Wov@Bc6j1HYW<+< z`Hj1ANR7Vn74-OR>P6W+nw9^zb62av_HQ`?q5tWklBxVMeKm4Yl6zLs=kr+E0A>NB0kuWLgg zbP7Wct!?)-vsidFJ-KHw6cO73gFH&5CY!_X*i<(i-09O;f?FTK``P4O-Jvm-PJsG1 zF?D(;uaUL}CsivXM@NfQ%#3)0;4e6_mFU?O?PfKB`8avZoVX_uToaX$#CwPZ%QiDJ z(*S`~brn0wO)WarP1Fk5ka`efx_A(Rs}CyN41NA`y*%o--!2|kB#v2`JpT}{ZL5=S zU)l~rAkEjRP98w&BHQ-CUBp}ZJi0We-WK4hitI>~Rm38E_wJEGJZekTgJK8L{qAhb z+b3qH!H$V+SW;6YB&aUVLN$Zr(GYijz!*op?BQa6$e&ykJ~$pT_tUho^dBn17pXt2 zAE(aoGYUSCgzHVpJ?(AkLKceG)Xd-v3nVAFZcUr8eiKc zg`f7F#rpHd(4?X$F}_UBd7Z36Rq#_oIcY3wAyLai(7^TYhak!dtzX(C!Na{sh84*2 z4#eeZxe{#CEmdMZ%<4X&U6MKxePH@jBypQWURh}{MFKtT1Waf{i&5xK%kB`>Z@s>n z@9Nmb!JnZa*T1v`3sisl<@FKNaWYhvMS~jPi^1$+<}_9bb40nddM~&i?I1u?`}TL$ z9=*W%+};U)unP>gnUnP+F;76WOS$@Jz+INJGJ9IVaC5aAvE+vIz(CX6$edi~qGcID z5oq=|g>m4?vEOBV-agFvJ9$`bwn!k<#_ghxaWTi@wt(;r)(~xpbrXco10qDyeIP7+ z->Twze~H7${5N^P|4wn@;!xzlP`V#$X9uUEy0YfHM@;y!43H%nK3w?a)n2-Mm~DbF zG6Hp6jWRrRP3+Ec-dctf4~}K~Y!OZ~T7cqfmM4D!H=NpA7t$|HJ3tiM2ar1k9bR!A z!~gEv4LY3Dyf{UXd!yRV&27z)gMiM^@0R6KAW6ZuIhLs^p2tmuZWJ0^b@`_d=2Y8Q z$Lg{9`A_onSBz34NlOkvjdQpuNs5XStioKe2ag+9_09rs*Mt9C?aI3I*L3(Ll^x!* zb3NzqI;M^{(*Byi!wJ;@(}0o3YXZ^j)KhR$w!c0m2$Erj;(+&(Km8Zpmp>&p<%H4U zp6^!1RE7>G&ybXjV9o5;8#i%|yS;^!&7yBdB%>mvV~THuC4cdbP``)jb9N=3g@Tl^ za=k)HheR(@e)_&|-E?kcJK^ba_`))^;*&UafxY%O8n9oMah>G@i7jtoa)kw~K2!fw zq$DpiJ5E#9*eR;-W;J#p?X8!navjnH<5+X()7ClQ9Fq?C)FY@*R_iLA-Uz3c5wbg6 zM*O!d38PY3uD9YkN(AGoyD(QB3YFfpqd-;*03e$?97Y3?E${hWmvZ1ITiM?cfTv7G zwqM3lCz%;*Cc>g0I(1kW1xLU^R5#s^v(uC$aP&;fH?`pFa}e7yRDd1wE7x5 z?rLNPtxcbWym$=oY$6uOrR|Fh?myMf9z|HI2>py~ zJ6LS?WO4F+FugmqscrSagG60)5VZ|YJ|-}pVrhxTeH5tE*bY2%+|K&`anlTel}*}d zgShduh056CYlnG|9|NYv!SlzTz3M1?KBe#!RbTh97W}o>*RUUSI$Xmi0*>kxmB$N6 zq8c-w$$S!|?XV|x%#9>`T(o)TJFeyewIa6)@aIciBrvv~2tcDzhfZjOac0|zG#?!j zmu$zB!>mT5&Q^|Epq=#1#-*0+3uTnoi~ zYf;rvH!yXU5=+BdRK$W6_F{6Sx*V4E(SI3Y$=Tx(ZkEP~K5zZ}>VQUMbD087GZMo@ z8zXJrKrwEfByJumO%M$V7L~I_mz1XnRoIjmO#N&iH|JLN$ejFDN}#~K`^r^3bsI@R zfc;Mcjk%IF5AO3F-ydb)n0SQGe!aO%372eQZUy2F^!aRS`Rtaz#^;@hHR(0JmXK!W z^Dj`^dw;fKSRAIHqt@l2C8S2({w7^Gn!Chb&ym!A&*yjlnsnHtU20l9?hH&u2t zL?jB0h1bo^kBwG0L59)|zA{u4rX;>g`~hGWa$F&(;GaV&Pu%du_vh~CK<;l=Y}L?23Y*hZ<83ed)vxe&V+xGbj;;r_ zJ0~m6={49}&&-XsVLkUj?5UNDY7t#f~?@iGG{C90rlEg}3~&l`3@ zC=2zHM%`~Th~~ytdF2*s@)5Ufc5Ue7bqlLJE*hJ=nrJ@JcF+4~(f%{V9qVrb3mQie zQHE^J=1L=iY(C9Om0Z?2KfeZH27`YmTBODM-z=1AiR+msH$Z5Y7InjIVrk4yX9n4dW0!1^6US7K2c{;9h&VMdho5t?nD6r&Xaq2sS)&NZ^Z_|N~9PQd_ zphFL#oMVDW0AksL;rE?!r>}U7qKBf~K3VhpP|4N* z_CbcOgtinw!M=Y`tNc5=N@7|pPawH^zqwM@oCySxW6ZXB_v3c%Cmowx*#mzFoVVqP zbw{Tpjp6?_jV)fXXXD}u!GvD8Rs-S%Pn>!?K%nGG(0pS3b@uqw)!tp;ZQy@P-DcT} z>iETFJyE)J@<>3bPMdd51*TL)3e!meg~WS8H2kTy2G*MwZgn3(1_vmXV?)b3?#)I6 zdJ>%hF?u@$Hg(F~p5a>0Pz@tG#?SDbX9_JwC;<4TRVmmcY089j!U>S485y*NHQL5P z>k$w0Q&fuUB5qTw+5hFSz?p`)G~fcJ9jpg)kZwA8#?bu==kk3)ii+=c4mk<^9E_q; zcly+(I$spDU^VdCAOW(j7@dEkAKrMOgXUd+^zBNntfJ726K z6Rco}#@lsuUr6LS`m7re5ySh(WDk>y^;?W!ChWElaO|u6KW;efJOkk{{}8cvAg~1` z^H@iR`Q+Fbzxmc-S35arU5O=z!PB(s}Va|T@p8gWTfG;csm?P=~lGf)HV5eZm zFWVEufzv;Ztm&U)$DfzSiR~5&Q;Tc?r1vWV|2c@gM$V{yg!VhBT^1%+Sar< zO4ZuuWGVgg`0%UT!f=9r3CbcAa{+N+{Ws~tyF)BI$a~)WZCVOIG5pEx1c1cwAiW&~ zwWW0}^9pIi+Huh(!@7+)b!QGj=8|icSDA^ZWpOy>A%3svlx57YpV&l#3u3>ZA=O*( z6v~)v8_5Q`rxcAewD~wF+}u2o&OwK5XJ2_X1SkB|MtBG z;k*7K2?pU3exz!tYy2xKWAA`=d4s51aa|Taab3p3l1vq45Ydy0$`LXL7xYd1U_eef zdk^G8tk?jgLHSSQF^uKtk%@8#pq&7{29LS<7`n?$+ zB(jv>)GdCk8n)b^;N+HE&thPDxQe-gV9v#1j(*NtGFg|uqM-VtFGX4|;}75#(89xN z9FfAMJJw+l*N>L^SxKYtT^&3x@19Aas$)7LC7Gs|8Jl1`2*-p}82tSlzzl(!K#HD% zB--0D6iHC6O*hHe2KXQ%*FsD$zzE6(y}-8X9S6n^?qO;CS`>Y-A9_oqX3e(T>jIuB zIZE>o%Gaw*I-qm&^yB@Q=Uddk#0|HAtQ%=}(rnD{pQ%x*3>;5V%^aIAVQ#1hLbkC) zQn^Xg60kI0;f=GzXnx(WO&jhTJ;dizj>Rmu%WBK3MoKeSJW!I3M$yN*l+7Q)PZ|Mq zvBA!9zQh6y*LE76IL(8vl8~d;8CPI5aaT?C`riI+%bxHy+K#!??mAK7R9lNQrxk)I z-Lt#-2^VU19Y)e9Q>%KMMDh03Wqe@Fgx}NsBZtW442hsu%EmjuMr&&szWGCv&XQdm zsd0BIq*%>EKEZ|0l4~)!whak5nYjAHu|dv&oa?pCrlp;JXzwsxu|RMq08o+N=-$o) z56;hwVlj*B^DvXBm0R4mpy$7!!V9fG2VppSyZrDJeljXxr5s@=^}k0@6~Ag#@z1_y z$tfYy`jL?_WIeX0a1d31Ty@S?Zxt635$Affiz4{Es!_pY*bCy5=L1S|4Hn=iTKx{8 z&;1sjTR8(0{UhS0iO8%DM=es+t#fc-p>~pSPDH#i^ct0O(=7-zYGX={b_rn1{eo6ZM}dOXV*Jk`WV(!4|%+*GG%kn*%=CgRHlhBecaKK zgEv#M;vF^R93*y5f|4#W^d}dX`+#Ja!mPfG?6yV42;CLb+!2LAb9+26$n7{>6ongj!8r z)L#=Ab+%7u0D;_=+dE{7XAzjY!FP@|(8f(!ll5H}oXXXeY_yBdW{9;ym7}O=IFXV6 zR-RhRq>a=g$ZVHGliq&pwuyRyjL`J5k=W4H+XZ*$t%#)x6(ML(A%e4%r}#wjIi)C=wj0&%ngNA{HZHA>z=z&DuPJAZt~5j_xalV`U{J6j?s+>w^fl3p--gsSACg z#B_8bWsl1h`&URhNG^z&m*67|X><;jRWswWM3_5O%$4r>9T+)EDxnBzh@dFp#trQ; zfigWbC|t)>n$2Zl(OipUsLuBvVl6C$2$8+9%^rrjVem$X+Ai>fZZiC9z%Hg_hG+f7l- z3wJ7OgI<{96c@u)Dx|lWWtz(@P>0zFk^gm(BFT@nh&q9R86@>UIuwOTFZmmKi=d($ zGcFlex>TSg&usAq1+)mMw`Iq!!zF_lpf%-QbYIKBksg91@zVkV#l{G3+)xjcOcp-eR3E zGW<*1z&>{io-1bfvbguFYYZad0Ais5w#Ft{ZqwTJ6vrFxa?(U8_!b(OV*r#EoWh!7 zot1i6QkfwB`4E^BvH7VoGRt=UWpK(R1Oy$Iy_{jZ2tn}<;ptS>wGEuLm~ci&IN zyS^-{;c0WX>^!W^+H&pRomsf~7rQIiHr8krevQLCDWU0_da(4VaYE8Q7e7IBj1??7hXI*3(W6}ibT`h3K- zTrTuCjHo!{)|idSQwy}pFJG=%F1ues-gBEpUJ%LN zhB0conu4&uOGLz9&Oy2cqHr+Ci#JbN(-#+yoZnKD5g9kG6Uiu_-s|r-)I6xY1IV7D zB5%A6*RH~X5r{;6IfP1lEj?Dzt=1}b654ma7Yx(#+mLzZK2QtEt2mX(kjlpwNlrzA zVkHw5n6;1B{>0_w;tE{A!ZO`4UbJF7JBjlRiZhacT^)Aeop+r&$)NSB68W%JDU-%s9M6Vub! zS;WUJRS*=Gj-J|ngeV!HTfP5Qu&%&lVIAgV**5`rEdV0xFga08;5$W~c|yRfH}ZNJ_ZpD+H-u zXwf5wbB#JG{XaavOmqY7MzqC3ITF(6d~vMW+Bd=FFZ$vQhEHoe09QY^Cg5A|rV_Un zP#5nXa`)itye8+fmc00vVC{_V$~}1;NL$U{o3`)l4o0TuKC|fPzaYoWkt2G{Sbwyz zy`ysHHi9m!O_AYj`F1|B#cQspEYv$NivaMUJ4~9OrTA%C+eGQ&qslNGmq6!h(?F{= z*x{NK*iKX3zgpPd`s--*x?C5repcYpp*5cSDPeb*oUl|yz$Fc{&2bq30i&-odGZEE)jJWC~f#pDchEaK398@Lt!0ykkJz0BVle_(c=`)h$L^ zK}Rcxb15H8HOg-G^^yVTKRM^UUf!_c<&_cC`=m6lmNxbDhuUYm^xdQg}wXe*g^g^Jpl2VaNQfoo0^YS^OcJ_bL* z?#w*bIz({JC{FxgjR^;+(YO3B&6;wl-e5b;H+3}02x8j0#+mLD?qd!D8*|BT z4T41#Ix6{eVJb-sqv8dML#zu1q+rQ5v2l;#u>52@=1M1ZYZMC-Xg*5kk0dsUCEO*P z?rm6drZ_(NpGWuhxP1Bv^u@-R>1I%wP?Q;WZ{{hv+4IJZ4IAPf=4Vh|jsrb&38I{- z(?Z2VlJJ^nhS5?GLpgcVda%O_CR3vm*uiCGe8@Ctx<3ysEgHcNtsvc?O4KwaMEf8n zlq2ELCQ&-2ey-4IaIpT)+GPKQs zs!n8w!a5l3`uRYpk56d!fK@9#f5Sh z%&cGlDPg5~RSqUa8aTVci2VB5$1wa|%vOclLG-vcea;5&tQ&-47_;J2Ih+4(AV8kYCW>*t=7pEaFWypPEMGC%OF-A4=)^tML0SE z+G2%~#c(fHqq^4a-snRdX=nVejpAVrqS#L%V)zy-B)onphV6GI^5YK!pq#(J)OY%C zSawX>zV*^8cLE$`)1>FuzQgQ%^-SgomD29Q(^cqF*{^S8WajqD#m${7BVThubX>k6 zNk_Kgs0xBpfAs1#;)Gwwql~Lc`ZNX}qn+@fE~F`{A-J0;7=tY~NV%H)WCb$(oq?$( ztFvJo1l^WzB%*`#$I|eVm9S#xfBh>I+f$nM?P8tYunWYHOIq0(bSW&H+X)~f9Pd!6 zE^xygKeOZ&<+Fp?q-nlzMmBK!$z=_Rv0Rz6C3Hv0%vWR4F^iH6Kt+AAiBNNoGJWSX zb#NNQV}lz?35}JgU<{09G?b8yo-3}_NJ9c(LWFrp+)5o({~br5DT7+Y;T}DCLsJ3<)*#Vr4z{@kO)F( zZhk6Nav(eaHljp404Na7T#;-g@?4_`xSQC2rmR2q)`^drNm}h#*b7u}>NJJ&gw@oX zehT?ZH%e(X0q~vw1s4#Q@==&;V34Pdt*)PM)ndHzJoHlQPSYH*aPU3zw%_?@)Ue6u z0Cw1A6_UzCNjumrUf=Ua>MoJEI*GgWYq>LTU|MKA?+31u*T2vujF>A=pQd|V^h~Iw za#g=zg`DB`4ZYCUTYmWP?Sq`8*k_P8wx&HaT9cs+eR|z6eORCd+IRXjT(V;NXw$~M zNew(HxC&XRw7AG8U=5pXVevI~rc}jc>m>_#Q*Wz%7E%(oS88(VrY~z&r~FQNP;UIn z9(RmGixhZ88<;JGAS_zF(5uDDaai--6Yw^C?~gqkbY;l6p>_1En`Unl=0}UbZK-fB zdDbvBe(Gk`yGY#Jt%jIJeAQBYSh32yW@C5L)wmt7cV&^pyR`)&l>ti?E>)~bvI0VE z2^ByguXChn(zcQQ@Hl4tX!iwN-XpDx4uX?z1GR}F#)9xhFP-~{a;a)p@y3Yx`VBUh zNz=3sjznvJ+#tRttf55+0=aRir1Ti}2u?XV9H}&0ZUh=#E!DIn1MaABs%f$Kq6H}n ziL^8sg37X};HH?vTaB*AS*f?V?sjn=l?%q$q;N@Mg zNZO#}ziDglMJ}>ZM^hegM2D0EQ$-ky_yj5VJ;Yc9ix@nmiZ-b7IB?Kvenh4#qMn>H zwYoSbYosEjLs*6P$r2eRC(VJjI(OUm%buYm?CzcCX|H`%8|=T#04##>3&?3 z74Cq|f|CzS?9zHB<@V(&BfsXz-BD8Zu;Rmczhrd8519h+!;k0;3LXMIUlls?v12sj zV6ab|Nhsi|3TqrtHn6A*BdO(8hg9+Sin$4L$ib1%S@{~%YVtN=DbrH27_=9WGBl&* zRuLi(#&n_%0)~Wcr)<|g}{(~-EnIXPY?gY ze^8#V^BM#%{LaDlFIo05Fbh3N$KUYXuG5;QXqVOxxb-{3Xj~=qCMs{0)_r!5gOXQ@ zUJ%{J%r}IU{(WNISGIcgNL~?`_b*L2o{p;WZ_3H_Q9w(}x(;s=MXbF2yTQ|pUEq2V z%!H*&k126H+SIas@i5;U=k^kI;JxuIJp7#dfM}t6v5hiuHOCSVSM7J{CU~(~7*jwI zonD=`%?dM(*3mYuqY$kJ2T;z42~<~Im$<=6Tdco5qTdwK11tF z)@tzY9Ak&c7vh4zUI0n)oO~uY6#1q#e_1W_7fydtXNy?@DH4C&+=4V4>FD+Sp*A8)l z6RM+aVln5AtFiin+`qd%x{$EV2Sk<~%Go2pcWUq|Ckq~Hi+JZ59dPkyRa3%}@IU4K zR0?9o31w?Jy~lhz!S19Ho(4kefkExf-rx7UNY>Lj`bo@1nZGGUxB*s6I|W3PC_; z6u?H4jUh*ci|>%>5TV!OvXX2?46!y9VTN7u)`2_QQFLohT%_KBz? zYDamR#P=JgZnc4bgA6CHOy*bXra0`->kjXuJn~Q}%rh}x!vD4{&qUJN!KDh?fy5NB zaUx=>D-rW>m)1YXSHt!iYZ%EyGFGsc<^aCXSj@XxT?M2j5O3v9PI_$7Bi1+WwKRp_ z!t4oVj<4xVi~!O0dSFU(ej!%|QLg;;gSgHOe>Ki63w!hZvr7l}_`KRxM;onlKb*a1 z_Ru0$!Imbu*fF$7#=vbRXb{sJnZzmSS76kV5Shtjd#HssNa{~+KUpD{KcYq&Y8&7O z&ZdaswpQ7YF}EihuMK&)m5Ui!G!Tl~d7v&N)txSF55QV*GD{KHJJWhfmu@BPf5Qd> z3G>-Bq*XI32KnpDVXEjUswqfy6*}OyS?l7&Hc46HF{Gxe3Nd^nFnA0bVplMhw5LD| zJ~%T?u^t-o+Xna5ITVE!ECys&WnCD*=RrAe+GJi$QpH~{KIiVHrsp0km3GCLqahl~ zb^43ojBCPo;tIbAiNp~9abxm7_*lK=7*+rFtREThyp5MXjqYq#)w;6Uv9N;r;xwq< zy7v2ldlMO5mw)r+5k>GZF`kV_U~F`h9cZ`E#~DRdtzjab`0BBI^JHw_npA1{Cg0Th zz*IfItYITTAf_w+BW~DL%2Cvs*a9U}DZ;w2->0BuSw)Uu3f10~vaRilB7cV8H&rHS z{s^@wZf4@bqycbUFQS95JGV~;qMlLI1#G`^pGp6wvOc3@NyT2$WSBcEc{2Bu-YCAv ziUkv1%d|9jn0^~Kt&U!8DCv6?4HVFERa+G1fFfP?iHC+uU!6#z3`N~gh|0Vx8k43g ziSxuZtm{mChNY|>TgAptVOv3>Kf+RB``N@dT#%)A@gFoiG4!57#bob?Q5}MxYO;!% z;x-yYvE0yOw_x^=8wbW8swG4@w(hx5NX3qrvz$vrEmcEzAGx3CbW2!2&yOWn2B))F zz=}`W>wq<|W7Yj=P0ZN)(eG6`>}0F+sc9KNRSbz~N@<#YHJnVfDH8u|W3-A232c^3 z!is*BOmcS(gHPbqgY2FGe=%q1q)Jo-I=yobq99kFO%rB;C_d2`J(vUIbDTL}3V$Dg zT%m|sXdbAMc>YQAV5n`)d*x%(u)h7zai*E*rty?B_on72Bl0sairu=H z+)5dfQ~gXVjR8V|okmoT)BVy)-}VX$)=EL$N*iEAO(?lwd3$^xJ$n=agnNwXI`7xm zg~d)gmUzJ%@VW1M#A5yX2L^^{#fiUc!fb<2%kSM>zN=i#@xFL&N&G-w~OYP_6Qff5~ z?qTDxTxad?ruzr?bxlouk8Vz`H;b=|6Q}!bdC!_9B_#y0@PAI1#+I)rTbaGi^d~mM z(D(uQN6;?@<=`(noABW5iD2nO-rk^9_sHrW#x#psrwxiv0G{Rw1abMrMWmCa)H&DZ zdSW-x5hO$En~mRfDdp42Y_#b0jPjMIt9<8-@qL9v@4Xj9)Ir?+emSqXX)Bs@023PO zcmTLa`KH}Fr_ulIA#inoB5zt&vpPkh4u++U5J(8`x5~Ip!5&OL7wR6q<_lRe+ zBBErp0c=n_2wltp=$D}a7!>VJCf@?iIUDz}rrmL%fR7AcL%DQFc6wuoIbi4l4x=OR z-loqCXC?%A#7wUF{jm1JvVdz?#xPkTwPV;QVwCoJL)EimWH9;q=;?Jm`!21kr8Pzn za-hP-efPlv3k!|qXGOy0$o)1#`=Wt=&>%y%RGK4zuQO5j*BI3xh&g%M5xx_rwkwf> z44|Ab2>6d#%vQKURb#fLFoE-X-E{#dYI#L8$BAceJ^)0WXQ~r{i)89T+^YhWwA+N~ zt-dS~2#4`2hvXD=oHie`_Zuj7{wEV{2^7G>=vx*Xzr(^~e&Nn4XPF`r39YkFn9OX6 zkhp*4O*`FcgR+^1qSEPn!p>>bm_2e^eO?Sy^u03T4Cgf}KZy!)VHEgsdsP09(#rk{ z)6_q+j!}$1l^}=t|42IPpeWzBi!0qAARPirEG*q!($Wen9nzhGbSmB54bn?D5=%+9 zl(dv|*YEkh?+kzK>^LmobwBsH&N&~TLdPTX{nMw-G9|8q`Z|D}l4?X>HulkuiMb@2 z?V{?FoMg)Tx%WLJMJpbMV5ZS5t_k@>G&-avJu{1EruJ)bS(SiEdg3(^*RdsY)TEAd zb>~&ZVooc2fJ_nM*HhWxZS zPa=L*WOK`2$Ew$=gJxZ_u>ZI0<^bHE`}}KphPFU~tu!I_sW0y64-)x9+fl6h;E~;1 zS?iQ47eZsi&yFHj>k9PJ=9qzQB5qU!a&&;_zgm(xu3x8Dtpq)rX)7618iti%62A5G zKz@e$ZQ6>3fZF@MD9MEQw?Kv=4(nb=Az63Y;5(^1cJQoIH63s`#OL=n*%i!g%$6uK z*fZ$j#2CP)7JTk(Ss-?x77RN*jl4LGKl0&=^AxY_!0J+_n8B7%wC$Adm9iK^JR~M2 z3d4C2bl-0!s8tf2Gq5tRph?7az9>|+8!TlxuGP2?JoM9VtX{`VrxoPMyCm??kGh8Z zs_VxCb1}V@EwvH}F``Y1R7ZwmFi*}fO(MQ80ed4x^uiaZR16Abz7r58`AUj#=%l<` zIttPP)mh*H9T+O*Z>6l)jzE=H*g0lQF2PJF+g_4X?s4W3^t?l48p+0U9BuuCd2YE} z@d6kSx;Fsd1~6UULur5hO;XPXM#Zg4Ak09&Mn$J);~rxWF`M`=B!7sPc9cn$Q_;4E zX6zxU_86m*+`3_O7_I}0eG;i#O+e6@- znS1Qwh@`rxIN{aKldVU2VgEBx_|e>u@%iw{gStw#(9g{|WRZ0&NC|Yz!wp+MifkKw$sVrSdAp)|G3vTqNiwk6FC<4Ug6>4VEu_f zcVF4UshEoF-!S4>S?PJL6f4z+v&S!R3h#E|LkAzrEw+Gjdz^(UhaqqW`IoJ0=dI<5 zI$r07fD=_StdI>ueMcaEdJr8vn<=NRB~g08jG5}64K&)L0nf*OP+ftn7mP%`;#eAt zTC6Wb&i*E(JsoI$nmzFTUZ`Z1J$2mivszUA7f{QPzNE?__#_GcjXP~cC8-z*ECa6l z&9G33t$AW;LTD?G`H{1hV z?Y^jnfF0G+O(1CUN6PY6k*z0aRWG&jF)$?v=dWF8*!!-)-4*Z;N=Y}_z6f(1%B zaO}GkB?@*2>(ZlMTn}ylm}q{c#I%!O=?nWDY~@K>W#Y1{@aR;n;c(KefH$t0LRx4Q z4>~3Y^JcmblN5->gCP_^aEoMkTIA#97F7~;xA3gnVvhN&RYl;NJL{X%tuL773yY06 z-%cMDdVf=)bn=s4j&pE6iQPZBUOw!psbtrM%PDN}B1P;jcIs$FH_kaupX3xQ2oChm zK1lusIFGp8uGAYtPyXQohGsUq=)Lz;^C`LX2f2fJ<-EA+gq+SDLC3S;X)*XVXo@Qh zznFqg+sK?ppFz0|Vt9`-qFO2UVKzr}85W)|e)5K3DIq(CKW#fw9 zjGRxJE96AU7f`iTN~9GG#ZM!uE5Dmk+a=Xaecz`X_T8xc9}PwFX$mIXvf%VFNmJyZId--hz#@y^eWu$Dc+P!~%5{FqYpRGbj|zG9TWGE(-2sVlVm}CG%=cU^|Scq&61z-YTk{$fzp7d zO}s9H#jAe8cu{;;FWw;yVZ7Sbn-CjqohePvNXwfgs^{hwxg4VVb+Rg_gQ?Tv5?EY; zDNwDH0v9HNHG3DV$Ky|7-!q*2y1yl>eOHaB@~=|Q<-u(2nWPyqv0|}B{>=NON933N z7hk2$wSl|G>dlh#b+3ts<7|1O8UAt!(fYy~7f~el=yKZ7BCQ+Gi!mji=Z#HhHJd&y8p6RC!{Onf z8z0~8{>x+OT|V{wrTcOF*jIHusphvVvbF|-sP+S0qV3@*(nQ3>P(7oS~8;}A3JVgS|kH`$AmbLboUvo1`7M>xPBS?O`NlU48E6T2brcnPL9Kl$ei0m`X+d*4z_6wYQ83=P8wo80tX z*)5xxyOS`nESXm2?5P&b-JJx2yZAME$|@=D zZ+dAekAX*o$h{YA$=XPuDgsv7cW{2fLB_h_Mex2)Y4!kh(p(C^CXV=xLWh)&umrHW zwAXHUzie%~bQKY9a#zXfpZ#xl6nI|`Nn0kP+VoEkU8d6Uf%=z(cPnF;M}y5;1DXJv z*Oq_yLQLwn=TA0Rr5uz282In93Ykn{cEG>*KBJ0`HB|sgH-Y*-*cE_jrSq@fqLLVV z%#-g3`8k>6iL1~Np+RM0kE^Iybe@)Whu36KxGo$Fe^(@vE_Wn+s~K|Dx&2>b9aEuI zpvB>T-J?vSdv&;vzMC5ePvhu(S~(`B2b}^A!6K_byAgPISA6*Q$P6%VvFB5}C99kR z3~$`A!iJX^zsrppV^uG}F-w71F>dfPluyeD*jxy@o#gJF-x)EIR;g8-?2d#QZQa(t zuvRFka{ld9hey7^>WA74r7E~-TH z{Np$>FrV!F1s@^T|9YXMlk&~{F3Gw-?+a^}wbpb~bE@Q@zSn%kZ zFShnRKHuagDGMENwcq$Ql;UU-3Vt2MS#lm^a#x5i{d|U3o`s<=X}`3L(cwffTCTng zmdOB6j)m^Pf>*~#EEqn3y&P3QRch#sTtnZ6jyM90k6Hyg5W zl#%=MtC{c!s1IEc1lb2x4k>Zs>}eJMN<=|`g+wD*{1h#IuN}o-cZ~^>Jf^;J@dgJ$XwM+d6Q(J)%BINydar zvs6RScl^lvmQWa0V@aNv$=2_T;S6Iua<-bH_rLS!S6*9hgJcOicjecXh!V0Um_R9_JsgTj`yBQ-cX!C+3(`n{$ezcrPc2 zDyKP;Sqwtpwh1Zhr<4j+7H>T9ZZQ@(b!Z3A?Ta)%|5i%^nxGnvjUlM-!#R18!1Cc> zjJ&+rFs_lw@*)bEBq8b2H_TL$`08-7^c!_4V~XgH$an8#m3|(`!j089{#stjW|;gK zjz|cz z$C&IbA^eZyP9KBDUk4s0eJ)J$S)?PsPG7!o5~_dE#37V&tW$0B27y8E08{>-+emg; zT^Ic3rKc2XU|76-JZ;5Sj{I5?qqoQMq|0})Ns2kpUbxwFb4}36WvlPCI004B3P5_ zlf0MXi&3bQ`;Uq_P{qHSooq?#jils8_l38U{x>?gldVhgn!36sMQBlSjIKz(yIsLXK&!z;z#qN!uVKJ4 zp_v5d9?5U0=4qsRtG@egROEcf+logI1pT#m3wrWP)i(5tsle36Q`~%b4b2HGf5ilT zr)*jjr{ATs-*}X@<8Iw>BJvNW(M7)5?&|i1{~z3+!?}uXR-k1KNlHhD4^X-R!K2Fg zySf|jILI>hqjS9W_^bI@`{i4}8;{foj-a*hz1puzjT*@FPpR#qUj9K>JP7|??>28# zwC)Q$??bfNo@o1?NdbOs3URjtp#jb4S3q13@oab{1!x(-18)c?;Gm>0JARFH_Lmuu zi1_AnfI|&4N>wB#iSIc4X7VrxM8#?bbyqBOUO~so0QS3Mb*QiVfOxLLra7bnp7#X> z*j!AQMlqBfGfV&l1)aHoyaO_%p)wdC=`6-908(RNPZzU?sOYxdB*0Qvk^^YpKm?Q~ zb5V*fK_b+XKp@Oq@AfA}+b=cdcM)ufpo*wy@rWe0vH3bhC6qw(xz}nVbQ51mG+!Z% zmTNjv^#08XA0BMxF%i0b<^eujkxSXajidSsCYCup7PQ}UjfcCQdccD$$y_l7ci(+2 zZ%Igsr$Z{kZWEOoxVS)DE;HqU5bq4u*V5r>_Y%uoW0!O11gr3=Qw;8Qu@SnH7d?T0 zBmlR?t4+c20(-ha$#M(SWKf|a(G>lWPeZ53In}cvut6k(mOi{4qJK*Uov!%T&BYiq zpZ@!bb3rn#@4fFUN>fJ4o3%xp=lc*+<_LvZeomUIeSM+LZLt2-vw z&cm;yCIuC}vbsC8ram{@y-sdp5c<;o+C13;%pyt%1RH+_e>>C9EtrJV*csy;{qBq` zlmjXfm+u+)B5dS*qsicg`hzK#{w4!upHl?_u``D2=*-JAG>cJKP-Fo`LxiK*(Ws+^AQclTDkKqpE@l|z4G$|wV$w_?%IK+! zmzVVl@8#H6f{P4%o?*c1smCJ7FW8sY4g3ttw_1Ss7){&hL^aYk6>^O9Vp4!`a?H$@ z_+sed;N^aLg8T9s*JiNU-oHUyZwNU7f4{ssa~{dH!aaRl{uWSqp(ez5yo1IfqkzaD zxlP2NAkQav$@dNL>w_^BL46dmtx~416WTt$N57nAKoktC(``{E9?dOS!zycr*CokT zpcF4N;NEC9WDrVy8W(MiR?C=@H*4s}C2L_5@C(?{&Ev*Elrb!jw_ZYiI8KxOEeFNO z=S~8HFOmv|IJ~0tD(C>$DC-Ch>K6VzQS~Zl2Hym=VXz0&mxu0LJw$^(xJC81(O9hS z-ng}|r6e260!Lm8B zZR?1s5=C2X{@^}G>Sa3uvo%sDjpWY8WA~onstYp*-;OW8_*yBQU{_Qv=?X6P&BBO` z!g<5kM(a{O*SiiV4ww-u=M)a4n_>3V#KWC+KF;=sdK&{@zLVeo6DC2muBt$eq+Pex z_Rw&3uyZol{a)pkZa@DmDM5E^3p4ixp;U!p@7bIBvz=+i2FK=%_<7j=HLd3vX$INUCscT}O-m+{# zFUfq^ELI%Is$E6%<~$BDE`2#gt8c$nw{2Kzzj=4{?hnwiL`CI!`bH&JOd+d8Yl1Nc$pVec#7TbQetV|85;Wqpd0~)8#kVW+Aom32&obkN((bBbX)s21Lj3klIPe zy#qQQ{DZD<3*YrPlSRdLqarS@f;r(hN2{4rTnpTYoSpnVp z)k3bR-J`nh@wfe(aeHMO?58zS*(roAf|I_RQuIErd95x5y#Kr_W)}av!4YUxnkAOv z01WJjm|K>tHDFaz^Bh^Eu=FdIE@g`qhBK!6H& z@d~90wUjxGZTN41{2u4&mOOT~w|_GMTt3uOIQ;~Gv|4A;5<}sJjLn8&!?=9nCyFmv zqd)9l3q=BZ5K@$JpZ&LA4PfwSTH}u6 z$B5giJ^@4WV*Lmo-~)zN5R0oiK4GV@`C^ybQ9V!kM<36pXL)@ewd{VM;bt9kES)OY z_l%&M`iuIW$;6jv830XM4A;|W43Btdk{3L4nQ6+Ui(jfIQ6|tMCa8ZC_@_=JXuZ;R zl@St6DjUp;$5*|uM)pbxi(Yqc?tlot7$GDMt1TJ(OHM3aZ!Zan4EbAw=E^Jtn`l5& z!di{4xHTad#CD<}rjxe0;#2i~8Z8pkImhwv(~HeXvQg^5y-fKKVN^lKn(6z1J9&)l zwHXZ5i8e`=F4LhQJagda__5pLt|#=;1ym_)6=M>&o;;%tB@l)fyVzvtR-q?F$%+EC zS@dv52GZQJ=@AdMtbhn~5V-!zZGWfRtldNDdq)p|mLM1Y$XbW|#oQ=iqbmDuCqcV&DM$E%~*SdQZ56==9SxE!K8zn`-FyPSkV4*PVOZljZq*? z4w{S3VyOrkXrxL9vygA%+vIG|?LFv2qt!KNi$F8L&F3s1##BDAo?cyGz@zIa4F*Z_L#oo5D+ZH7fGBVz>XoX6N zX$M6cHi3fvD=YyvS>l$i{0T+uIBSpDp79tz?Iq-Ts}XRi|i z>LRU*_yK8(K{yN)ye4G1E+U;`u0K)Y*$!T4yiEGSXyMDPbMB3jwNk#;tdrEe5u+gAe3Ayt^utQnTU$1R7v!=ZDxYhCID#hHW*}K@&^is>no=3m? zv^Mlso(8>-Y%sQaMEp+f1ylT*E*B{G{HuCe%2;M5P-Hr!nB-yue`b&r5;5A1af1FsZJ3fkH#RaUXppY+gB`P`~EaIUys z`kh1eri&vfgxm<1>%MQjVHdf9$fVE|_qtQ`)_N!hXe&}IY#sEP&-2d%h*JI)G{*`` z5B@Het$%OZ0r}>J*TK)#&>K-znY!Kx;jFQ_Ow1FC%tl|Oh}$|txVjL~7;@BMWHZf9Ph0)|CX0wH^4 zWcp%%;QZJ~y8DjrCeSMDEhNRHx%SGpc|kOAsh+U`nZZ=6m{g zSXtu-tZaeG9n_(S*94l>#*5<8_y#njtW!&#Z$@$cdZs9ehtm#%q0k>Tti3AX2to0e9L98Sk2n8!uH2SXq%Wew0uAt`yGOdyHPW@1kb zh$$g)pu%Fs_w$*rG>yTrAj6Vh-$26_^q#^kQAW$79zsqTl^Tu|w4-fqd@%&r<1~1) z>-*pEO4(8-NseGfnb5W zlu1s%^V|zi-7OZo0}h+ga=a2+SJwd$$+HZw0&x?rp|g+eyLt8^8}t6_uA1+zINKdi z37&%X$C7}FwqkGfJC%wKdh!Q%I-1szm%Y_ax(HRX7^EelOD9-&P>0s4nPztO-A_`*SEee$!!dTJN zc*g|hArxXS%)%EuGgx#A@ls@#mG((ldXrhY-=Tl^lJG4MhHu0UTt3Ij&F|+y zh)IRML+Dvt8eHOj2!*LBQ`CfUs>x=0#z_Aa4vEG~3U0EwZG6>0LnV_`Tr^~+NT9Jz zFN<7u7JwEmX)4G|(XD7km{RiH6;k{rB|2V^h))rmRU6&F(~BObg(DL|kI%$Pme1fu z7-LCr&%rI6PWe1J!6fmvSkkuD^+D^1V1VggT~pggbB=EegtdGwLm+01QS44GEjM@F zON*6WA@NO~pxZ4+qbz2W-(b(Mu<}gnyl^cYnyo{*v&(VrVS5~TQ>WQdhp3YaD#I`~ zwH@_M$%(@&TnA}t&My*r4r1ecw#7p8S6Dg1Pb<}%3!CsSv&+JWs|6v=`rq_Y>JZ-> z5QML;wYM?6#gwvRha9aK&8=&I6|s%(Hi^r;s4gCE5_bi)*^NvWs#hue_w_0rE2qmA zNM+u1jx#J-_17-!TqV}L>-KlQqgFIyCp;`rLE- zyx=|ye8ZtKvG^JztFyJ{{V$M~5z7aMQshJDQqhzh0g8Lqb0fRUd1LBSo3XoB_=1r) z>EMl^%Ql*NcVDtnDtLs#nx({Ik7*>!gr`64;KMeNuoijrR+~VKvhx_*sl(&z7;!AR zUch+&{A%zDD{1snh&aGTMom5yv;?#z4^6Wvbo6ikLbX;Ff#3h;E*iEeb}!JMZqP%o z{F)dgn|k)BU|}H+ADK=C*j17(6)tW=bV=uUy_>yD{z~z3$+foga^PG*_9;)tt$X>C z3&Q#`L(xtQHUOUCfBt*&&nkehWUA*ccJ661jTR1ldmmiiq7uxJHQ1E->*$_PCVdik zcOAWA`^%~SuRQ-Sfi@`-UE0bMda|rR7(xVX0YtOII0iuLe%?m`MzyZ(c*iqtQ-fSg zoH-@10%f5jN(AgNz{-Hoz{Kk;5)Et}D=w?EteoRciZyP!1l&ISAnk!LpAjxPc3CR} zF3|^P5&tHQPikx$%;ULtrAbg~aD~UQyDB%(KRQ!ST|6ZuTjh*9p0ZeVtPB8z%zSqa z^+j%EJdW>PXB?xV^$Pah`*j$HeYMAxX_HLHMYm~(cHO^qOXsLRB&cNb4<5Tp1xJc$ zw2EB!zw`rsB#~p9P#FLk)^r$WYh8khM> zzNb*Y8&Vr5rA~xyy^_zQv62^k$Zy@?kqGyVu^Lv|CW0LcxiFPc#--Q z{bQgJ{r&YK^EyVrl81djX8BG~grLTG)n1OJ!vsK3J{3ZV%7YM$6!bWYmRNe2EQvX0 z`+h{6+W4d2=JA}GC8Zp>@?+))Sl@aEHu}Rq0ZgoAriFrHga+%CA`3VBR(Yv3g3x9Q zW?WwZ_K}vb%!&@%rpi5zAA$!b1}ks4+1RbaWE4r{ zA;cpH31}H+I1V6y9N0TFB$d0iFuC-EDTjUNCWM|70 zN3v6fHA;82&mAF&St11F9Kp;AQQy1;f_!g9 z-A{5S>=~Vy*Q*gimR@ha#h8Q`82n+$eGy6dcqHtW1X33C{7WVFL?bgRu0nFEt>V$yH^Sx^=ic(Zd(y=U0g>- zaXewJE##Um)%HHDPk(=}JK_qgl;fO~(KxQ_JI*{WWSpwB8~JBD+C3a5CO1X4StLS= z-3_+VtG>V%U2LoG?R~S$j+!o%@j|kMy)%IHET#U$)-bMrQ0v`O1LK|!RL`;iV5L`! z3gk>2)^ztCGR9u)Q$HyXrKXlG*idxsktAwzcif(jiacFvVzn8Jz(AuKRNhDG&$}!_;Fhh{w-1VtvJ3FTB&TGH5FKNpiDHd5&fd?YJng7V9mkqv0ggMtk03 z*I>VY>yJw3B9;?5z5t>N*cjvt)*1L6af^rBF9Q-8(6|`>r8+QfL4uGKx%x(nvd~fc zBU|wOdUsy?S<@M+FOMgn*i&aLw%_;_LEiMzPrOs*kJA8LHJ0xCqdFdx3!#2DJV5GJ z9GJN_pRG}8kP_>uC7E#-GJBmFCFO&RV`D7ohFP8OgQXNeqS2{#e)D$==EC?DwZQ2eH^pVVs8^2jP(tOE&$z}$*T{3 zQQp*#{w8iefnK`x+TPbHr<%kxQ`5TiF!in5`h$aVp>iCnMY+=RaL+PYY zUtK0iwi%R0YKfv{Zvt-?SIzdQl=qp#&pu|!U_ElH;j{y6*B(ecK7E*#*L?S1CRd`~ zH>z=GJs-#pG|dzZp?W@pWcczR8ol?g56tBD?YhF)5}EBo@%htanNSC*n#EIN8<$eqL|H?*NSn} z*xbUDdCXpOIq%+?ZKB(}s);a-VyoV!3sKuF+K)gjU%Q+g7WUxykSj1mSc3VB9Z^H>Bam>p(X2Ljt5L^bsyOX5g}fh@}xJ zb&IA6Yl4OF(JKNTxRLP}xLVTPxQ_TJCg2oU>wLJa_urjx*}Qemh$aGVn_R@}9sT9n zMslQMdCRTkc_(UiOL@-@hiAv~tF3d-&GXr<*DoWR$oJV)7Z(>KSk@Uw+c09NO2X$) zx+!Z-QC)r*G)tzrgf$`;3(8q$4+!q@~(!(A-#5Aj+~j z2q2&cHdTdB<4>sTi`0!seUV>H;IWq}P%6^UA<_ZJK=?cfEf6&g8e}GO4g^3SWx*WO z5@_oE^ma1OEwBnH0)IWQC)J7`FQupmff zF5T?zwQkXN_)kJo^M3_$$jlA3J{5}XqY~t5`QL18)c6WMa2jG`e-@SG8^SY*zJCfAS#(9gi3xXgC3&KKM2Z{s39Z~&We0%sC6<|NU(ybkGxl&o;Ap@2;jnK zHCMOWbdUHP0-;06L~mk=OHrCNVEAWirzxebK@#mkR`!ZVP-+0Jd=if5E-bJ9ryXNC zCHZetkm=`B1nSX?SApXg3820!#RwjTaIUeUT8|ZEV)2q=h8p9 z=MHRnO~ZOIVmsjwg#^f^Yxfnjz-nlvx|4}sVe3u%&A+}g{RB_>bjAio_^A{w|0%i+ zHr^&H0iBt{<5N3=N>fkRa=o$xYF5wKhrq)_Ct>*T)t|$w-|zS-5;7Z<{=Jhr*Mbkb zr;PAVsX1UO9zE)xaDdjB5xiaNSAH0tAPBT3It*i*ufB>|E$LX+$2Hg`xs3j_e9&ES z9*#`NebRmj(yZx*|LhwCW-kYz){p`;u4hY#e%BDA*xA$3T4(HB zGCf%|(ear=j`uY=g|LTstjN8X)`Hg1c~JLL^NWyXqUNonyscf-O~;Azv$*)h!r9Yr zdvZxM=oO8HFl)oK>(aakqI9R08R6h8Vl3ChU-yc-*ge6@8rH(3&|?7#{|#u)(|sy> z5E-ucqoJMo*~lpS=~!vEN}(Y9EH!tpeEkkT+9HuhDLpL%jwxkf;XxB+^77mVL}uY| zX7l)suQXel+`q<8OiW!eK*~esHYR05t`vivDJf>}Ce9U;7UX}ONF_b54xEVgT{^5F z|6jjCb@);%0}#r@13()Jga)7Ocfb**0o1=JmyDJ-$dr3(Hs!zDVsLbMLW5~jHPS|W9Q#Yy_| zyiv>rfm2J8Lt1A!_#+hyi|Wj(NMNzZLE~zc_fu|t>oe_{RXpwCmVlWXzv0HpzCXH@ z%hiY@P$6JLtTyU?O3 zu>fL~yiwpIHWR%NMy7Vj@aR}BJmYc*db4Xl-}lY2(g>)BQvr@yn0`_NM;l1Vy9i4C zp?E#9m=l`vQE&`p8YGp+*;d4a37GBU%`f?C5~A*-!ZJa9%52$Q85fwME2tfmC|^?Zo;!#Q&zvFqsP;`!^Lbm<7}ApRe?$BT(Y_B zRIP3~L9^m&IZ9Th?L@IH=0sbLcqna- zNUv$GI*&02iAihFa5`Ti0k%y{q>&;MR}yYrv3j7)7d+?l#@9_d8zyDT30h_9C`TOu zAUQ^QkJrrXX=xtN4wAE3O!AhLzRyKnefxUP^}E z?gP3^{uKO=VqndWOP+?IOh&|SF0rJ6~xE)BMN*Tq;{3=VvPb0On+CH-eMw^w8UN2-BQSKd0F zu=D)y;PY2&g{$o&gZ0u-O3i%k<{kuG2fCL03pG2WVKs&}SdH>*S#;R@G-6w`Znn`W}qO@zxlrm(Xvk{$I4j$_5-xzUa&3mKjeua;IaqW3UrEVFDDW}wrHT3)x{|! z>uB*Iz<&AXD=XyfA0bxV;|J#zPKr`M0RczQ#4Ps$B?Daa5o|zb!H01lE0$!*nI)f4 z-7TtKryO9wW{>@snF6S@iz}Xi*SCF(KrxL$-$m(J2YQl=`bf!wX!zcQI&dZ}c%{Qg zfF*;5Zj$+j3_CkP{7{|@IrWkJWiNNj%-W`0kRd2MrHuFFC+?m?;wP9}A_OXPNU==X z=RU|GyX7_W;R8T=zve7?M`rlh?<95;xm~B_aTF*f0J6NZzrGF6C}U+zS;b4fV0H0_ z!lXs~5tec4R*Bjuex^jUCGi19{5@q33jNQ%JJuZZz&Hm?@?op4Eo%a4_{%uzDF7}0 z>#Xp1ROeQBQmMzWAjtljiZobfXT}g@mi82*dFz=-7;>ZH?J-mS(eKFvzIimpIEli} z)bhJQu)CJBNC*vSl_nwh%n2xr08&mNjSvEgQk9I$+H5D({xUl>$#!kk6iJ0svcFz6%g69hXu!1?^R;0zDSe&?> zrD(EuteS-SFiIxQyOylyIYn1U%lYKPw3-;q%*#ZF)u^V2*;)G-}tPTexaTcGXG}Sb#;I{8n2K zWVDt7w~#l71${LjeV?rQ@Z&uE5M4cIa@4K?X%BM zN@*r-d_#$?K+Hh>x(?$oZ(!l1)SDgp9DF@%3jE-bS(K{sX|Ey)MM($dh)y*WIYo?4 zQ7RkMR6b0ID6hF>Ps$WM+)NMY3ZwE=L}# zorcqgaC?@lHiR8Imv9A_N;P$iz=Y&e$8<6fiaL`T7`my(V4<3+t`OA6Rxv0%hRutb_h!Iv%n z)Orgd&8Ji+k(sP~b4xSLJcL1Rtpr)FDtiXjixNbPi&i4b(tq-mwd%fR;TIDYPkk<= z0K2T@1-f7{p(?!vIpdDv&j}B4=|}}3mD@o^^FozVtVSTx>DVRLexP*!KNG@aN%J!F zVG77y^}uut|f0;yvoXV+EJZj%wIgNF83 z;lNc#Iu+m1g8pd#mCDYiYva)?siK9Z#rZakkuI5BT^h$A+jj%eMwlWKW&$MVH_zAW zz#re4rvLp!zEa;@D3G8!-niS#-T3Bz#0a3VNa%DrzJ>!+{tk1m#cf}tCRb!Ul3lDX zZ{5t--d*nIbH}R1dY9;9cJ~eLdRJ$)66Rc+MC!o2Z~;Qd^O^Yl!{@W_1;4!h4QP9A z22<~B46e!XP`J2n;G3(T&MtJxb48G3rfr`mD^;?y)_qxjo#S^_rV}- z*%4#e19U(u4$Ej{k#p31#=}4F0INkyd;4M+US^Dlj?d;^;e+cBNbMdcX1?y}<@==P zkUnf5iiy6wX1KD`LF1O2HW2`f!9&HRe!5=O`LZR9|Amz4%a+5V7(APS(u_4NLnsV( z@V*aoHuDBg4ii|VLhSZaqry`E+I57OFQhGB^jT>FjmU&;AJWo%*kvuPvbo3%0f)(d z;*IMs<``i~^{7SfKa9ZBv@W?_yRtf{WsOjSR|k4edEPO2l%wkWchRWlq7)d_s(42Q zOKqv%{~kt}So)m@ho^BAe`on_QJV@Y149=OV<-k4rk4b|%%w}!Qj~JsYmZT?uKQ*) z2T8DM)EudbhrUJ?C@qc)xO)3%fehs2Q71BG!Q^HdMJ~*G=15zKCj(8kz-?gPUDebL zu(`(pcL~yp(QauS@euM4zy<+#kh0=cif1y6#Ci9sTh4L|JLor6k;`c?^t^InGkLwo z`M>=E2nzezyJN&S{2%tQ{V?%p^@WjXG-UifGD@|BIEn^s&nj9R>0?FD2u|Dx9TjUr zDdlg1*y$WktkLR3OGF%sJ58Wn2eevLfA_Um8~@jafb#FeSkuX(!na{hu8Uejmn(8{ z(+trIq}SuqQ190tep)ri1E&1&{hNgTLkfX&MqtEOD6NAcwVPc+tExm6vA~p3^CX)1 zxTy+qhk%EE2dU**!0U~=?QscT6FI*XT~R@|7vN1o>12Tzc;$#hf+O85lkA|c0c-!o zVBCl#b0!QD2ZJ$Q_d45*3BrmZIg!2i-V^V~xEH{DI-KyA?P-hTpg;mkL-~UpwfO^3 z__&PDOv8t$?w?H?iEc|kVm37W{l7-&Ql`-)PeNzs{66?Svu%Zv-UQjgYk|2Fp6J)D zyiP0li_2sIep}@=XUn-S6fuYA2jK)Fmy3lW_d|Vvo?GyXAVP#rX(l4{oN{dQ&0@?2 zrTKmr_h}J+OthSVO4mIZK-_JB>*=I~CgG^j7Wa4nJjqg~=A+_fGt1;<6b@T$vCJwX zzoka^@Nmr$^)PL+%@5oWifj(dC<>BdgdJaD(iA%lj6M)OJQNzgys|s0F^hnt+J?oA z#~ofGZBxFl$RxPw4+C~rW)S!KC1hlHRv{ha;5N$NFulNm*Epx}_`3QlcyET~B1@NT9- z8!`Xz0+$Hs#;u?VT`3c`jQ@9t5(kc!)h7rVegira57Q_EX?0?Z;(cGzN2X1w+PZ|= zB`^t=*}Xb?@lVYNS}sUsa^-u{-x3BGWM~Htfe9HMNa{hV9mTALYCm9z?kkFmE-p+J;}#C7b(3HZe@9;KfSBi(gJTsw{%%8tGx4Xu@C&GVp*FMsRERQ{9tY z2j={6iUnM+|I>*?Rf{`WjA!PFqXFEWf63*DYXN;>?e^&k%*#(?=MY#z!lT>$$?C=; zJRuwAsJTb}a@&a&jMr@a-WllDiEPdwKdUok@2iI#g$N!_CV(@c2lTgjWe+JqKzf5^#ODw;s21A7>s%*qZg;Qm9lf#QFL9EYR+ex#^q-d4|z z%%XjULMx!frts5OX_yKCu#H(Zb-54L7r3eC(Mu+h*I6EPasqsgKQ9=p8>tJ{MP+Kd z6JXyZ_kd?-rxngNZ56eQDA_G4vMRdUpKN^mh8A{@&JhK%2^o?nSlQ8u?+k(BM~Nyw zyzZuN0#K7l|HQg8xz^L&7X`KD&{TV_&cj5|85gjAjjl7h*nB|9ax^SR+n z1n9{W@V_>Kxm+oIhNccL#RC3@iCp^8uO!)1t3Gc70slOF_dZg`+Epoz56F)J8G`;D z{Oqe#JdOB%+vG^qwx5Wx&-_>@draqO%hmv;7mm9(RR4MeC-1}GFY7&LzkmI^BUI=J zg8#Xj0qjTuU!yku-~;o0dr{gylu0*_iIxL7yHPuB`H6GWDp1|+ZMjcn>y6nmRa+GJ z0*NV3OKm?@eqdy7k2JR}bqx+3@3_VkdF)r^=6vArBHFk!YbcG`Tqxm?<=}k4Q}<7g zPEL$crh3m3I+elmZ+cZkuD&zXZMJZ2O`7cHtd~zih$+!XX_b?{cpOi+*CQhAHQ1iH zpj|m9)+q}wFp|T#op*XlC=GamE`Vf~bt}y3(MLc0g)N!{gVa%%xi6#oZ$t}Nr(_0$ zKHFw7fr=D#v6+*LAeeT83<{>_BFKOXYZnWeQ2XV?FoseTuEb8cHx%DV(SAdskd+6) zEC;ngn2&L2x}~jo9NUu~4Djc!sIMOYA93arDsEhVVbw!#0fZaC*fr`RE_>7-XU^*l zc#slFT=(wz%UU?+Q z4AbKT3$lF4_b3>rqM<4nT>3<8vi-p%){d_w>txEgqd3q^G|2`O85vFq?LXnq(`&QA z^>rzxF(43{?@Dnci!R4ZZ`w?clceHO!ltc~%JM{%K23z?_atG^@JJ~YAsNZrNX^tz zLcmT(_*E?1>@$27z_wLBNQ%G`W&O3D_2viDVf+bvCaA`%7$ak)RJXWIA^In&+FBD5 zTWAzEfyW-b3Z0~odlbpWH=L58A?5EwJhYKNi2y)>0M#&uw5L0SV2c;g#Tt)Jnnp>= zn#5hsSV3Pqej9Ixo>7|zCG=xhYX)+gqMVC;>MYua@~PHnm;nZuQ<07pSI(l}`hOgq zWmHs+8ikc^=^VNnWatu*?vU>8?v|8pRJsu)hwkofkdhXL?&hBF{sm^S&VqH`+WXm2 zt`xHHYWPJipM_@mIwwB2iQyA?#}Us^NT_{Uk;s!thNHB@MYG`^>W%KHJqz^$P~h4vvE2**1WGAv9YCV7~+DbIGY8ntm`tm01Ez6q0M=^$+VD zN>!Z7j`!zEPirPAtJ`e6Kd06xZhcYt%=F$Z=uh!+HW@drJ&!mL60bhvIiTr&*H+u; z%xXFmh411uc$$b!hC(4P>v1+ZXJE&M&`*YU(XE5T;Du4(T&c$9b&Dy(c<~aPQl0&m z;B|cp;&&zzcrN|MXY_PLAX^7222JJ)PHa)%adL9XHmweL>R(oTvYW_#E_(|Dd?4Jq z4G5K*F;juJOWyzThrAE>4r=XVx~}I$Cu*O_ny*&$hny=muJqpZE0!@TivZc~55K#_ zI~MYWU8@W`|~@Tg=mG(6=3Sp|J<~gXX)9r-$LYS1i!b z{vM#c?<0SsNu_ONz;cAoVX|;&Axg7%Z(XjsJLzgU9c&VAR8JakcwB8m`#%~}UR+ki z6_3)ce+D~;SJv<|Tti2Z4kFMABWzg=4!FIgPs9;0UQ(vx&93{W6@077!Uv>_bS1gQ zn>}yeq^^(v_^*BG!2TdAm^hN?R;dnhPurR~#DDYn7P14@?tJ98FCDqxO@V88VbOo2 z)g@3O0;%MOG%uL7|JL-N4mnaM>{QNQL0dK);&enf!$}3ehSgPLRdP(kt(bg)p8g@Cgwm!OA2I(F?=cJ+{|ATa2(ML&>@HwWK*GDbVo?Q5y_sJ&DAgBf<@##`4B2*X($3uC0tdA!6bx&Rv z8ramrG|--6kZ24!Fg~f$%`|x5>lA4>YN5{-g?FpqQ=`#-J4qX~!}a?5%RVYb zu7!-+xt(qlnIR^NC5}ng#Ub`~UJMxQ3BWGTiN1CjBP*drK4L25fUoaj%pcnFJvjP( za4^-9eN}b7M{UEXX7QQ1j$B5Ge!Kfu&$bDmPl438D|Bs2Gi7#NdA(7ZbVQu+=@mGq zAw&ggQLl+&S`RhxhP|V)ncbVsERo)#SLFLe#&P=?~)H zst5k`$~JKu4ng2$F$#MU876&RO#5R9a9UMIT4Jzl(m8}ljaTtYzR9G7^bBKK5UiUOHg{V^vE+_I#5WI>nX7Cp=1f=-WYIznD9mlt~hI2kk zh`=PQUkuYOZU+A6qKrx7}N9<~q{B0ok;fG^Khy`R;Y>hfwjx_3pror8d?@t0bdAX^^9-8-8hE*my^QGumN zW)cHes&K9lUx``-v&zY*i}?q>v#`c>qQ-7{O~&V?eCyaZLM=pvNw=}z1;yS*9n~NV zSG%}`zhqi6eiD5Uj=>c|c%&#{Vh^&Jb5vIO{Z)#xn2K3H%#Jd)yB01mAeLqUm+0Pv z)F5Q9IklyyQCK4YWdc8DOy<%Whml5dWfg)x$@o#s*v_8$a|T>e@jw5tgH`YRn9Ym< z7qwnzwp_ozZ*1rc>gh;z+27O-MQscq?d`+cy)b4I2=vOGliRZ>UAH7%Bc*^|2Tbfy zgqvz1R;fDV0jva;Ggvmza@u3uvmF|H8aa+8cWyA$JRDQ(OskgUTLvb*Ai|xUhEBCI z8#5d&6NXJQ6fIx4i&C{4Ulv^*8Fo(QJU6P+HmQ1COH0}e-t*dw90O@!ByXK=@0)^u zj^7;1*O}#ayciU7nt9%CV7(*23#Nkezd-F8s9G_2ZhBkaH1%}MQ6rhm3Je8kH6j;f zRv%7 zw-VZ(GCKRsN|}LYXkr{wyVr;Vj0Xb!Xp($3v{}J==HpmNwUkMwRO6nd^0Ecbd{(t_g zpII+RlAIN5e!)VkaA-G!ViBRJ|2|qe-X&0^$>-eEoDf%uN@7>5;7R~g%`1`6SDTCp zKQSaog}lmYj03Nj9Dp9~a!ZE9V!=Ec6SOKI^{s0wr3Bu2Z20ex7kKonJ(sGC(nft} zyu^})gpiL@g^7PBvXeKGe8<)HiX`5hcPF){mU;v5X)qV>G||!@1NEJffyb)s{0>n7 zXrFmSipzZO#FGyKAQiBL02mqYc>x=-8kXFe&Rp<`CQGakj5?6HMaOQoy@hvl(@{@P zwzu741i*O!ZT^ni0Gm0b46d1_%# z&dln%yL)>dIw|md(%^3nb>z9-7eOSQT4zVh;SNRnHqbL7?U84;!$ohg{Jfo_=gEp< z*_iD|J2V^6oQ{!|tuKlL*h1A*XQ9YSy67D|->1~Tn}a|#ZvWNWc7zKPA~Y8Enq|yX25BNX(-sqtN79o4KPd@ycatP+-Nk z5U^F{qG^h!lOO9Np-kI`u?MIy1az4gR#PPv4kcmfMGV}7NG!;`ghE5&C^D!Lo!mq< z?iM45+89;!&iYM|b++FNSK=f<8rKgi&Y2p*YG&I`N@wob5b#XJH4Od5Rn zHZN|1CGdBFItx_ehq|DXJeiPLtX&OoqCy2Of+RzHh%PDMt-Okj?Ahw zJqo3IbWw2oCwkgWgHI(`KA$(Hru(o)YP#_m$)c&)RXvMMzVsunn@m3Xj_l#x?`cWd z)4(@;;ym!1m+YC|Et0uCzD0&nED1REvBzk#EQExyu+0bzphCgA+){;TyzU%6Qt9}7 z@u4-DNZH1Wl1UckvT|AGH1N1K5!mm=V{1r1lu2s`k~S@N<6}q)^rH@O(C`@s6L|ll z8iMG9R;6_Di&f2iiakujJ)(;~6%gJ^_0MGdYx`x+|*#iI0 z<>rfmTwf=++FhUFH|}0PeB|VhJGt+d?JbURn*F6ktTG{$0%6hC@9e$rhx^Yh*3>q# z;$}51bv4hMONZ3kRMxQq6I``^w_4Dwrpv2;R_%WnX>(QgY<;|ZSe6s38qQib&T}#mvl<;!z!w)u@|A^lP8vUIUN;MY&a3z(FNwFQ zq$;S&Z(hEDM_hX4_Fiwlth=DU5`>gQBqT#OLb_%S#Bs!ZhTm1M->lBM3Rz@NpOmg~ zunw!)jZRLky`4DDe|)9Br_vZ z?;J+CHE6~%=ss2N^~Ip`=rL1-dV^fY!Lp>S^gTArx4AC zTOjd2V7;apL%;O2aQ2zA&IqUy2lthTkW)y{InAo)E2i!N%XmNp>#C?+(+ic(Vjp^= z^Y(J}#VGG9W$1>gF3ugK{h5$UPXy4t6Em{LjsRx}O!*cTc7H50*KO;xfd^44P_~)> z5h)<4bg3WynbOsB*~0$O>(R^QWkl^)qgU9H;lo>v^Jxq)Qpo-R1pV?1He8^rf|>TH zvY&TA^4Djp7k=Qy+s`Uz$jhRs+Pd1H?QabNTm7lfB8#;(ylQOF;3j^EF(gNHCU zKp^^G3Nt5UFz*`%$zo+?lX>pCo{aKSCBQ-w#Fg06%z)0QSZzJp;^BDtuFpdE^8q0< zYQmh3AQD5W>-(>J8W%6f$<2L7EeDCCbn$-_6gEc(FU2A{`01=13;An5jFnNPNi?+J zShVdKD>2PBPt|mF|D-mekdJ^%W6Z$uyLhIP`VN~VM4DD6A)fjOqeht)Uax;iMMqqj zXhnITW%-GssKe$0umHdr6cL1Byo`Rf$+vHDU!26mSWHx#Ib#7ZK0EN}o}2e&d;AV$5IkRM@Gzs01^eobSncX#(4P3D@kr({Ukp-%)o^~@_;#eF zu2hGwslPG1O-0TznpJRDN2+=$f5Tp_lDF1@;6P383jTnM;8W1f?>9X%THzrl9;}=M zl`oe75T)S<&VlKp#Dr9-u}$UJrK=1(PnZCGBigK&vz-X5vI>wpK!`)1JRiL0tsPJI zYwwR@K@SoQ|Guv9%0i zV7*;Wv4I<3Jk2M*Er=l{r$&isj<%g;l9NmTpKkF>Fu5F-)kqbUh6}H+%4J!Q(Ru;T z#E@fCmXMBrz1>)N;+uQV@sC~7HngBEvU|G^E6;to_7`0*Y4}0VQo8%CNCUb-W5PWa zFL*1#jN-2YqbfCECM2#HlPsJjoNESJ@}k{Pq$Ip$O{uzclLM^Ka5hx>#|pNH3bvxK zj&JTiW(*EFk8CEhPv%Z`St?4<#AP$^+xfoN@hKqbqiP|QyoBhNuy~+EB=u?{WFrGw zP@|jk3Xl!Iw&sVhem89Q9Q7MiVm!sa`-Bcy8cfZGpFqg|Q_{N0G-NXdQ1u)CL3(-> z9=HbLP81h=ROPT=eA1D>|AD0s6XiV6{u9K9RABB7_FbZ-l}n3>8Q$OT?Cj1`MM=?= z(Sa(r7oFtj9G}A~#fS~`-@*0o%LNjK1OGTz1ML1^0Vc@RIije7oqq^@j(2R=v)1d! zchZK!pRuKnSG$1flqhE~jm}@4?acaj1PWGT3#QjHVay6L2sE=b^fcl5-#3d2C(_0^L#Z@;CMeh}>Hh+>0)rbZ*UkJLDE{j^< z$G{43vbfvYo`-0^SXxhbpwQnytCg%)&D(qv-!?tye7uY$a$6`G$A+?~m7dtk!QGbj zYTZ4?E;2TLjNdyGOf@x(8b_|-Y+pLRHRD_NLMxk$3HScxHFzt}Z{qIU*Z*$N17Y;0 znQU{AA-X`nqic|_3G=F$y-TK2M53_eJNSe{XG;Z@LO7*3{^{|-X+@+L|GA)qCBG9v^W*=b1Ely~AR=V$A z&;cLJjw5J!xb2cAuHI_hsi+oCz)c3P7~9^iGaLeMb4euCl0W^>W~CHr#5edr4hgqo zjIf%hUigqB&w?2kwLf87LXte#7cjJ@lY8|&Zn&*|=um=o8021h$2cwqb z4t|jC)Oa8uTsE>H&5H5zN7)MEsH;b`(TaFSL+<3CF=G@^>7+A9q#6c7-*~(i zwgx>QsM-|y65W&$;%i4AuQ%XAVy^SKK{FaERmk1Dg(7uO{8HnZD9(ArzU9kZw3ixE zE>*}9$%3w$9%liVzKw7PP0<*B7Eou6CL!tGg5T;6}CyOT5E`T22B_9DaxvqOD$)eej}G5mUZzwnf5=g zLe&^~ZhV{1eQdl~HtJ1pv*Ve8@QFh98U1_p{t{;vbCCZYMcW-&-b_aK573w=W^c)+ z-Q3w7QEnETdIZIc2UnDOq}X?k9~09I zM|J7x;?d-gXH_GH;W6;nJ!A9DrM^)OUK-ebm9Dc;=)Nv#@gvb+Ei0#nRHlot;-^k`zsi>s!lB(EWk-%eWgR zmLNk^;56Tdn+J3bU5xDw&hW5b6?cH#Pu@jo1?05c zFYD*5yWE&nHNSW`ZJ72tZdACM8g@m+P)zeu|M9(%ZCo4};Aw@^_Ey)~z8UHmu+YzU z)SAv~k;8*`LeKcYOX_md!CuaprQFh@;Nv84NE;mX7v>6Q)asMHKrTO!9HaNVb@qnw zcKi0k{;)h0l=UItI+EY>nb3}TY&@G^?C;Z>E7Slj0yZL4#D#G7%r5ZTeh(?iX z{JV}g7Ij8F3%Hl)SC#qAKlpQw-i9Z$UU#S8Mxld$5D4O;kMGbF*z*>NH1xsRyjrex z`;cy-TB#vZ_oLUEsevxNSf(zP1MTO}^~pk`Cv4FduArYd(jVq*<7S{9oVx0j3oR#A zPbzX);goUv+ACJw@T`RdIWGbUqL)L@4Mz6^XXP$EH}{L%egHeD57X?LmpiJ1Y-tBr zQFJ{zo%$_737#LTUx>xc@5Nx{Tlh}l#2F%9%qY5VN`5Wg!PYcBBMII;!=;TXecI9T z{Oe<3tB~PoQ!T2P?*6S$a<)Dul_wo<+Iqd$*%@Vt)Cw2_fK(X6GY-Ny;H?L$r7nAtj#XjC;}c;hnXcen`hNzx@ANNXD5&f|D5JCh)u!FE<7EZz zZ3Q>RG;pE@+nMR%C0oNYvZT5*x(DWy+TOerjUWJ@fP%&@Ia{-=wU|~9J&gKXh;b#w zRr_~!$lrf1ghwIeBF=*AR(r4Whjs##Y=lT)#=%Y1qyo760?v|21C%Y#f%H zD2n=3^qbk!Px50@O@fkyP+iuT8Vw-m5OBXIY{QHB zieft19!(fp^im~S_ei2IdIh-J=~Ojv;rP4ZJrMXZPHWgs2nP(d0|$&gWula6Sr!BH zTzhINP$K&3teYb=zf70Q4>C_zEQ9GmN9ZwSbjPbl9O`p<+&*k0s6A5F-VWRc^HM$e zo`XqZ!@NA$oi21{HR)VILVc?Eal|a{D3j>+y)aBUC8u(p3P^*Q_;Ib_4#;6(I6Q*w zM1szZog^zMp&*v+c|e$S;EoWn@ry#9p&>3ce3nQ~{0Hu}FMMRYmH(shsA&e)GQQ%b zNu%Xl6pnBHemcp~aTbt(D&w{sFbB7g@rh($`A4{hh`8pAj#PRPpbOK)@F^)pq=Vhv^LL^y`a~i7cP`a7t&mU z96yvzkCnDJI>*i%rFe2b^mh;UTv8fPrgcmj-(2w;93O*=9hC>n8uts|Z5D(@?za*s_HOtO zbMNkRx9uwT;2T{$gHMfz@9Nx7-THwusm#$0ta*uahNtWf zIvi%CJdJFooQ2@b{*#vBv(=j0TUU1@G_26=z6Y&}S1H{ysu!pL0H673T5@oH{K@&n z=GhoE^23W=#*P;kVby zGbB~D3{tNUu)|I>Ysjc)vUh-6Z>4hwBcxus!-v}Lw-FE%pzjn7J~3Y5uAdy4W&8T2 z$3?G#O;n1IZFmloz*|ccSW$$++CLpWVkI}uoYz8uZbXkZiVBtFkA6}Wg@cwOpy*AA6ut=DBb zd|=~wm8@RS#2f?xk|aeZVm z(2$r?>Kz{lW2|zS8bpXOr5!L)=&iTlSqplIZ9aB;2K1_C+M1O-Q=xuM<+-p9ojgJ= zpRn295~$MaD_1m~O{78{fsBSwKv!y)4`y~`9~uu`T^Jn`8nW`+7Mr&Pv{W}(6GC_SnsbBt zN!9dTi2WstB;!-`c0NH*6tlwM1m10zcsri6tH~URXFINtPvPQ-#mU#|3`4gExeVq2 zlaTpAE)Vc;JJ> zTc+vcbYv)93_e)&bUih_MMpy~z1}w1RS72msZw^^X@DT2V{06rtj`&uh(gfxkQXy> zWN^Oh$0`6@m^mPCx;Q(;um^6X$k5u%lK_#Yfv*QaIZvCnx4imO3;iye`e$Pu)eD(f z!T}lCt6mhbf77%QW_66HmAT3n5KiL0gr!!nvAgXyXx+b(Kf+0-a~^#FoM+&So#k{> zFtO_#s}~S@FP>f;R){rGi)`8CxD!=9QRla0*m(A*?|DT%ODGU+^~&ep)>)yU-FYwS z)cLKKX#drekSylCyP!i+R<{djYO&meaJIT_JJB}ZcAA!<37A;bNk2E`)hFT1=N;gV z3oQNZEL=6jE!_cZf#5>(KckR1VC!4Of)7n~-ivtkBZ(?fJlZ)56c zGzINRI!Y>L*NjuOeXu47ZpbG%oA;R(xM|Z&NiZ#B6R7FOa#pa44(0_VOI^`jQdwGT zDQg=A#&YPI+HV^kP3R$&w@nMs$_p0BM#_0uAtRwFnYc%sO-(~VR8dRkFE$ZWEJSVso06tVR58PIxf3c42(!d$Lc`s1EuirU5Q|l5zRRO7 z1hkWzgHH@V1soq2>0iDV2JQh{hP@>pdH{< zM{aC#I@jzNvt=AF1XXuB?rVgiJ<%trsXDEF;>#Giq2nkpr@v2Qy-(9Yc)?*98$vDN zUAJPvpL#`J^$HNRQhud8nDkGlSuys%WGirn7yU8lY3siD0eikNWsp?A>FXk=_^-?M z4t4Jye9K1B{>M=_w5O|U!6BCpeA)RyPdWP1yw>o%kFpup7oo@kK#FoG-OavIszJ{n zfP@AU&1MJzOLCyU544J}6eRydG2^3T<`3K}q80&gDE$o+gT)pfcY$*#-|=+TGQ4ofmgHy%n84i;V_~osPjK`|lY?O|-`g_7)U(57 z_w}!_X~mKymX>An<)62LZ5sf=jx)GmXvt~aDg)Zg3n z!zz4+hYDPJ9?Qa23@C9I<=4HbV7$+&QbB}Ca*9~R;GqDH#DR#4cdTFgDNEnkY&`)U zGmv~@X>=g3`M(l#>L_xg=ja$LeyQ&YslSHL-J;@AHMO`1MTFr2Wcn4VSD-5k(bK z6x_pM2F3>BYtkJ!h4X!e-Vcm+*R)fvEUUEdXyzt#wncH7)t&@T9jlY(1kjaysau&D z|A}PWQhG5`_J}_>Cz6JYT1*2i#p!&O$?c0lo`@bm$HCqbK$3Pf8#D3DlvLf#66XG^ zZlvh#z-aaKBhCR;ExSel7o-=%0WoejO)?KjSLaYA0B4Yy;eEfQV7+U?ldTkY^kIl<#uW#Gh>t^5tO{-v+Fqt{CGg$Tvqyy~tq_u&B^G`6+B>eT0HpN>DpNqj3qCF^kD zDJ0sB`-r`i&HJsS^Xrj|r1REu?h;&+H!Bc%GSvG(D3%m?EhL9G<+Ad8`-?KDELFPsrxsgk(drfb^EgrU=|x{WaU|0 zdD`+O=Gc6p$&tY|l%VoE0Y{3HcheoQPOtG|n>S~_=jm)Ge)X)`UNDf^g)!9C z#UzKGEGX-)<4hPyK0nTK^A(nbEvwkj$#jLM!!c9y_dwP96A&LzF#N3-)4+N%M?@*d zs>o&(Sgp}pO=X$-xa4FywuBz!`b9Gkt5q)W33{Q70jV87SQKrltJTVQ?~e~e20HH6 zre<5}uKh^q=;+Rc2pIE4iLo?B!`swQm69wOCwxhV8h`O-Z0f@5C!Cev=O}Nr{I@7l zZ^n2&FnVyn$KNm0gv!{MtbFM`2UQ75<*S!iZcbQxXMlBkRHm&rG(zaqova)lu$UGc zkluGpirtdkGXpPC(`gMmKYr&i_SqAVxx<4UgNX_M7vhP`kt<5coM{{2Hql8=iPy>7 z~?kznK@@MQ@?Y&oe#2b zIjuuOEd93grCzD#7}zBNd?LY@$={#1uyNF#cJ621;CeB`QFkR{3C7jR?5UOv|C z0bwwJ4wGVea(wY_=P4zuke@}c8`s7rlf=Gwr8S&S_mBHqZ5glAXC$$t$O;zWXlR`J z@3Vn_xQq^|t^l~dZ}1N)Fk;>82d3^7cqjW>{e2XU4dLkw)w8$b?p)e$p$+8baVhHr#7runT%H+H(Q1Xmm?Z=plqrj#wQdB5ehlN zj~1dDi`ey%@!O+l)T2jPLXu_%ZqXbslZ@pz4)rBYmJSz^a(5uaSO6cKTK{9+<*kG+ zI&#e%>#LL%=cp@BLK4Fm0%eVTF3k~Uqyb=e77Iv^DSynwJ)X#VbG1D4+4{0lxEW$scTJN5al-ktK>E(CL2luuP6=l%tZJ&y2ms_-^O#!4)tz>5 zqDV7!wT+;`a0wufrHqooEira280c+*pEd7Bof4fg<}kMKNn1Izi6;w)W7R9M2A7P! zpII=*c2Oh`a0*WhF6ij&pY26?a%%s{5;t;%wsggaGLg5$jCdU1CTkQ}ND}tR7&aM) zo-9uEY9(mP=Y|!6iNOz(T@+R($v#OqfXvsRR>Y1tRrkv`#CN@fOs1riL_zU!-tJ3z zj%A5uou60C1!oM{SE@&YrRBb+M^mK{rciP-l*!^u{Ba$Z zGQzpX|Dr{~cq0!^E@BW%)DOnBbW^ioi0%1fu1mz2BxN>@t7}|%4hpxBg(-7MH7(!c zBqA(1!t^dMFPvv(!i&kuqG9^?K}||R`-lhu`CGd&q@>v=v+sph$A2>v@3grvnoaIv zmkQ52m>xGf-=rgjGZyUy*Kwn~`ARb~8*#9Pjx`zGd-wNPmVvCzN`}^V?ze}5SfiK0 zZ|t3*i{et?gup3v?bZmkM=5?-VjJyaVVRwK?33Eashp}zXIf_{`$;I1yq3ymI0 zy`8b@Vqps8_%( z(sOwU6B?Ln1@MIR99xpeAA1rY_4WOe27bR5NH!IAIxRlWe2ZJ4)zn(L|0^xhyOSWS z1oTRkP3v(`A7IRIs;G4X*l>yWInp@?<~pPE^I#VcWq989e~~c0B6>|H#(ad+hxI=* zGEAmAVcV~J>*npyeNT8sHECwP1$Idn>+Wnkk(r;pl00l5h)g`U_?!m)72}8y>r$>< zY|dMv3hQ<;F!b9a@owCw7QLqqDsccrNL&}fQ=k5;2ZDH7*!KRvy_fugBIew>#8iuR zB|k6w5KU!vUk!ds;pyvtVRcxytbfiWhxM*kGS9)Qa zs9hzzR^}9ba!mG41KWJpr5!C?5)L7^@4K=(yu;w)e!=j~{;p%>7k{%y|6~1@GQ>E2 z^6@HGaZOoeMJ(BV`iyL_@%Me&30kBTU_Vf)JTo(UVYF-#isb|X*Kn5Y30a75ikp(&j?HoksecLYCk21A{MiO2paJKEi zUazuq5wm^_+P@>RTL&1U)VlPzlAq0bgi90h5U^l#wrsB4Wg;wSpbZ5viry^R+S!YygHJ%2#~ZY_1+tUFGsp-RZ1@EAWeY9R6Tt2&$wRTO@o%t zE7WMOQ4iyYH{krD$3(lG`r+9g{>_3P&xlkkQUVHM zehh?5W=!DgWaP!be5C+k9D4d`FyZ-&ekzOc9N2H)iRaHhjDye)Hp@S8RN3j9;Rki_3Rydmiq)3FJ zhM&Y!$ZNq-Wm#Kxj8;=L<_2+-aDA#`%naxLac8@5UrjJc3YJxtG3eVO(j4Q@P)#XU zRF~Fj#!OZl5p2~yH4Ln+5rwfXcS>9|lyV~;a9gF|4kOhzdx@WKta2L(@onGb;;gl- zma0UAt48eT@rk>XlVCH9#FtA{(Ry*ywo=)c<)fY-MNp{JM@BgK35V$w=i+;-CE+us z+ft&0GfM3iysK1E8W~4UK_d9hqAwl;lkcCXQp731ijSOtkvL8=kyz8F6~xg5kEk$zLd64lY3gUd*`tvf{STy% z0gO*Y_2BQ~AJHP)?|V_lr?LUgM9v;T;Kf;iM+8)0-2Nx6qS>}}{}Xv2`3?@NR3D`{ zivChSw%I835bpb#VHF;q5A*DhUaiEq1y7XXVpL1X<%WJK^GKZ`*_=1Ej2em$D)sbt zncs$iZ@)EnGoTM8>uk(wPYCJ5-0$hWw=ZQBFx1#TO)#qK8Wm+bC!xCqX89bReur_k z$Y!(P&R$x=(r%37j1YZ(*(~U2929+}f5R>s=-uX50tqVc5r2%8T8BGB$!s>&YB{00an1g{tAJCc8e4ABq+>0=lEa=E?t;iB)Xcfj2$XKO&yJ zTNgvQy&kkS?O{;xNFCeg<&0#+!4wdIXaN=qJ*jtoVFdK7KtT|bi5BX;7@QF>v4kQb zNnc(6ss8(zQooejcU4l8s$A#6oPHTqNL$`uz^4={_QsHQMAn+EWevsvy5&R;o%MMbR+yUzEXiR(^h+K}RO}%5`M)Ox-O{Fty z5pctp>RNMxvgI7_cwpfl6utEqPRxQpoMGEKT!?%&qd9Zy91Q)fyyFJ|D6%P*fyGra zLGF_uun`MM1ZVK7R-Q=7#P~w-k8Vih-fLy6O#X2NrW-({e4?Nr{0ZL)FfA{8Hn@wHpV2EWj@C0U=haO8xTkrL;grgDAK_NxPgcSnOzZ^V11k49yKzMsHZ9rI}I}gVD5IF~uM$*JR z>R2V~`di~RJf;R6mQvk7s~Fr$bx>(Eq&+!&hxf2ic?*&Cc@)mj0wql9ouuKZk9D2`B^{>0Pvs`&D<4@n?wn_Sd;UJ+zu}IH`-iCCB)O9N}n3-n|M=?Y$4mg;_SQfhPtY{nb zKvcm4}F%UgQeGQ?Pd)D zqj1=CJFPNVCsDy@?$ok*ZvRYhTmw&>Z;WlF{if@UVtV@8jX>j$OQ4$RA;(Ot=B8c?zfrd5Q76YF;02fP{;IQm)zF}? zQWMF?QG?5(PsHae95nyLIik5P+bNWAW-$}l#EBC{NCL$8#*zG^J|g^<`Sp}s&d%sM zF_S_`C`PSPq$3;39!oiwf%erwK6#CTb{|v3IyUZckE=*PXTy6F)}?P1tz3O661V z7Kgj05`TmngNE!aWGRq*q`t5p`D!y_(8Rs$qK;}ywzc+6%TT)je|cO%aGp8jFv46~ zKIs~+sR8%xue6O#)4#Qc9N&Z+$@q@j7cVvMziL&6AJA7WtXU1B`SSQK(TaERPOxPDG$hvDOHh zuP)@b69N@CD8AW0gpO3ScSa0EZ!>3uD^VvNG{BTJqiQmFb2Ip(x9WQO#g`<3=EHH(966=l7|!{&a%x z*n9?a(V@Nx&JX#~Kr&zIc}YoFF&{$eP657V^fORs0yq>jua^!SgQi>o7z zb=C9ycuslR(W$1hRtgux=e)-YSo(K{lD{3k0jZjv2I?_JW5WF8ZdS?{hsuG`Tvke4 zBAg?mqXH&;+oygTQpJGX)ofAoyNhswVUtAVM!^cP+37g4R3Rn6)sU)_ES(c$jM;MT z29jqgNjcz@jD;~n>lM_i&20+}j=&jW}FgEIdm}>fO@M5_+z8!?RTdd;smtwm$*3PZlhk>yGiw4C0Mz!BVaEPPVwe8? ze`c3{E!;VksA$NhV026}o9mE|l>>u-1qa{2^6m?8>Ww~A{$3>_4ynDw1)Rk>qOx6H zVF2OIhisO(E0e~MR^G39gGLrI*qAMu65!U;%1fLl7y<%C` zyFG?3LRf+9vZYL8*GB_zCa-$gsVN{V6bi}!q^>?&2`iA7LcUYJ?Ax*CQ#iSmWlz|p z-0mwYx%bO6AaNO%w!ul^TnfcMgxMTH`yW>kB}ITolsVjfnDaLD zscKlDR~aoHrXDOMD_RPOW6WP%jQRNFRkAHi9|Hk7u1mA-Q6u;kCKIgB=+aK7#?T6lw65+N@4tSDjoXai z;TK0Km{H?j*1)bkEZF7y^0=;UF8NtywfC?vmo`d3!>$PHD!FUowYw zIen<6DV`i|EpX0pp8)?CFUgwg80&KUKrQtUzvnRn?}k4!f>@3fVPWn1?8l!4#?xnY z^^k4`rHA66#}7V#9qu?pc_WMMTi1ESkt{9m(v=??LKq0z!g(w8Ut18=c*4y*uw3@9 zi3aKD02J`M_p@rh6j5c0?S-b;xt01Kz#;N6s`j?IML|~tA`Gxv%MH5lsHl1+xMg{# zVr|)V?dhEV=*DwNATzwMw`IJrdnhx8R;wBjA5+@I4&=3^4 zjMiip+JE2rGm~BRnwdbnPLCs%cJwYm+*fqoda8C zf4GM8WbVm!&CX56WV^|ntjV@*+cizLCfk~9yC%EN`k!+?KzrBj+H0-f`#$&mB>5FU zba3Y<73d(5JXlkPaLv&|Vg_Pj!~0VYK_(?=2yf9M$-vWBiB%TFDYNO$G`u>PEW5&1 z*{C>nH?mii*6NV#a^W5;q8L~zM0Rj;wrn@~dAq7E)lK|xSTnKIQnpYvkCEEZn7NcG z(6B8b)sp=bK=81%=H!TFHA@z)`+T^7*Pqb?9|G+k;fOj;yYcZYJGP^%XNbho;YE%( zm>~}Tq{(=-We?ibgU>5-tjxL3h(@ACdP@tj5a#Qup9wA{A{p&@XmCDG@tT)*a#?!i zqh%Na$bCk<9ZQv;WXRwWTTY!X)FX>l$s&qNGG4=`fd>F)1rraSfLNp z+ny&$UIi1&Dw`i$JI%FqR+44FbQ)TErWa=xo$vidz`p-e=Vc)n40hO+7XAfy!L9AV~?tTTfOxJVU8WsUKZby~SU`JrKOIW)~C;%<@G2ONL275H)# zm1_qDVkR@T)v54Xp0i$4qH?j{+5Xz3UMRDUSGGcMs~yqKtW!xOlVhXaliXbgt>62g zrGCd1lO7hXQ+zTVN%h=ZTTr-@)QOxskK^`lMh4C)%*oQ(6p`r!GFrwK-ely@n-6%% z5_pfISyfzS~(X(=P1yfV|OcSHbT7J@)E9k6<(T+#P?{KdCc$ z5?h}d28SLS^DYff*fKkwipZvLhTZTo*^GNP_e{RN3xW$9&o>Rvx7^@ml$?M{H{Z|UeEs^|ich9*?Hc2vJ zVQY^rc69vv`z!NS%X{#1Th-8CKjeky=yF8((ugCdm+V|yEI_u3O{ED z693tEhtj>}lN=V=5q9hnrEi!Pvv9~Mx>PZX8d{G=)Mgt%+NrO2Zi0Gi+dUB|nGfFH zqP#nhBL&rK3l1+Qc8N81R?8AaEdJs|jVtB{w!=jmT;1kw5exnNl3yV5B@;Qu4m-a! zHlbO#Q?)9WMfCCz)s_ByF9N>e! zG(3$#tEqkFTaQ+^sO}iPU2v`Qz8o5!6%b;M-sSjL&L%l#Vsa(*I*PnI=gP+7C}^=J zB%Nw{Dz28ALn_5He&H2n*AjNFIxQy7r$ZLa6Q!^oq>O4YD?*pL@r+QU%s%)~+vxxV zmh4}tqp$dj|CZL_IZd%1O&DpSc0?!kZ}ZF_sA0RE58|Oro2J`r*UYFSbwW z2cL1bH#_WwxYVvrdQxc}MCxZq<=DWh!gOLv!1$*`&DMrhX`|-1m2~8Z-0F|Fv5%>b z46l1O-yMZ0PSF%g2eL3MxfIKUcvG9NH*mU|#v>25gO-P(*9O{pmCm_!HC^dZDU@ zn&YOgt#sXW|G<5!b9OH_->IA0gTmz+mhw9QI0`q&rv4B1)yZ*EVJV7e#xf5~)dcO> z@dNUCyz#VLt5w(3#0y^tf8QlPr$J|F`fqn*ZdIEe4LRoFJWh}?uH|QuZS(t$omy}0 zY_)lD+Gwj{jbv(h6T(Dncy{{|T;vy3Gg~q3goyI+1SkgUfQTO;3!lSyD(n<2>n|ni zBUePhwJ^^5@q-!il)qF5k8eYwz9N-aA{v3#*-LRvxulae>4^YHc9RD18qba2Y zh*bX(jW-(~mz_IzF^`Gfb{7~-dd40E(OT%vlIiTgJNgv(iYe}SO_5b$aJBxyJ>BU*O zD0uCdr7gEbOLX4ToGo=`N;k^4uOARyzC#%8VpV`A>g(EuuV?ul)^8xpCJ9SBY9}|| zIR7hBaM=4t7V<_6#Cj7Y)|?l!`5q@-Yi)*ztG;$FJGpMUx@|w%{!3=^#ane*?sR10 zbvZBo$|6*_Y|KT-D(ISVRST4QPS$uY5+|twpIVk_xmd@{H!Hcy4N~~u=DN&m?XWiN zoa+uaV)+2ceYiEY+5G?&QD9)$L9Jjmw-<@QYa1i&JPpr%;k&t!pFjl}f z$gV-Wk;mT#miBlHsC^G91uk!^EkEq>HwVa#NoVGZ5aL$|R3SNfUgL zGHv!w^Y9i_YWe2*=1y3O0QLN~`P z7j3KrHV|S@@r9fw-}m1gxL7ww5U^`z`$9%h|B_QGvo&GY5T-|3EZ=VX?1W+HbUdtL zF}|}zEKLvQ%p2~#-q7L@{>>UZ1cImRdnZ@MEm8!Dg%GeSjS5Sa>x`sgj@2mv1U4yg zqlMgAw>`8@^NxvS#eQ zSyhNBmic_qLpIS7vc6Zo3%s*Q2(Bo>uZTHA7-uO(ZbF&T-QUKa z0=CNJS1YO!aRWV^f`xUl-8s})tsO&6a>)+DpWjF+qPWp?$l@}piW2a0&4uXU;y9RQ zy&@-21yL+ty?W$BF16MIE{8*h;5Mr>MhphB|VMvG`}c6`LLucQ7h)*8Ap zn)+i$E+G{aW);eu+6{(ZH=kP*-(WWbY90f!jnQ0PB`kbP9>#J6?RQF?z zVW-MG4BBg2GC2k<6eJ1lEZwsm-iUjTTw1vHVMXx-I;m>28qt7Y5v4s@4p?&$TZ5xp z6tNVnVDFR^-Y12R?2imiE$vs?R1eT$?!?VmqVOT1phw!|Al$6-n%AnX*S^AgT65QK z_TNmD0`vZpYs`mrUqQg_l95IVAAponB^IB2mMCW*8QDETl|5k6hVOU`^I_RN@);e< zalm`hmTPLXMcG~5E}?aF@8jA!aV&gQ&tu&EJXVflfOGZSCvyFE-tzUCb93cbdP}wt z{E2SU?oA!mjFE;NNjc@2+EgWR#JpqV87!Du2V$QO-dcR0>)Kr^4}G-i`scdTcnJYm zNjhGB?p+Oa4lda6mMxwZYn-m|R1?3#VI|HH@?PUBBT`eBxF0OjJnb@hWoR{u11#Li zHQ%MjV&K|G_i8JEKesOESKEp)*?HTfR}0>;A3>RD<62-0BDA|+_SEX~36e&OvvX+D zG_U*Ej#N#srlcHTK!L{&&W=_1o*owgDI!Fpcp$sXudiB!+}HF~hb-Lufpyl_tK@{p zT<*8bS9bj`8xN2fmG&jn)NUtN)!WYk^U}#49YVOlZa#iCn)^$e4(P)FMrEdURs%u> zALDJ`zqs*tp6>krpo+U;Qd3tiPr0&7OiLjhI&=SDFjJO^w|7jQ@_@^U1MQVqtlR-T6pii+ z2SH4LRAvPjAjQm4hA+yzp&K|~m0K^rV+6$kM3@;nmlS4oozh&8h5>;mYNp zY3TYyY1yDv@%r1S+jX!!uP@eAAg1gawKD{qG|k#jFO&W{qnzMrc?T|H2rvekpOYMZ z{cKwS_TNiOZjfYDLN&?v&-DNW&aAWZFW*g%8w?0*rJcVteNJ+}9|i74dltj3Y_WEI z=YlApCB1CE*yCn}*{mfI#dLBhX`IhP2yw#65TWO+XA>0YZpkdyPCK(?wbux%Fny258pbXTcLWXYxSZx=}ZM48C+$&-jg*QQ5mPT};hPJ`dMj6uH5qS&7 z7mq3$DKchv>`F`f3!XkMtTGQW?`vJBP&+?93HJUSmnS`VRW8SYIooig0OTC$`tPOq>0JUF-O^7N za0=1}TT3(QcqEwy4;$XJtK`2_l~RD(C`=*6{29X1EWh-~@_B$@#I%Eq=z4Q~SH5qo zCc4F+|1HVtPlM9ye1zg?YFTXK!uv(HgZ?w1;T6YIGN#>uYM`ESvLLc1ObX%yI&-I6 zDdpJ3$is|8l#D6E^CiEI+K1O?k&nQOL{G96Xc$R_D^Kgo)FyvJ9InrzoRUHegkqHr ziN+?4_oL>7)7BiG`252k#zG}-*BUBNN>2bS1xg`VHt}~MJmD{1IM=yB4YFDWk@?T6 z^om#3uPM=k!njgZWOARID5NNmW}}KI{;d^d{e2Mbb?zAz@1+gWA#fo3$2TA)0+7!z+17a^{OwRKI z@4I#h>?pS9{XozmgHPHju@8==oRoe!Pz6+fnY@?36tBE>^nvi8Lt;%%l3Hh_R<@E^ z_+9b$XDgrwM2Zmahm2T4R1J8*X^go!g2F|K^K^bgj`4Dk8g4CH9;O7FUc+%05i8-;EP| z{c#4l*s-Kb&;G%z{I(nq*&$@;*ia*|&v5gF-P(&L4Re>7-Wzr1P#4^)tlnj)dRST6 z8oe@2JE}ank<%YNeb|JVWaME&h~N{^6PfZI;7NmO9T{iIG+-LEE(uDG010m% zUa)z+v-x%p0j&x!fd26D6xHyTbAI`l!{7X8v~N<{T{qt(wy+X3r*HQTGZ(wwbft595$+-~?x zdDp=6Ro87#fhH3}sR4uO-I7e((#=!WBikC2F_(;q+6hlaJHk-Y!jaxqNAP$qMT{`t zkco|Rx>lup2Ib!q6g{^KJYt`ZP{|$KMQ2St&7G$93*ZIp?r)`hjwE~#W$1uHEN>IM zRr_D_876J%=v-A(wG^SiU4xXQYx3JuPS`0U-{P)^SEdMEX8Q7Z<`;;=85g&kSYw1L zcFXBs1O;~4b{foI-&~5WkDJi`Gqc{4A!e&oUi98+613nz|0dZ z{f80{UTLXj!x>?@*4MtX2X0_Qcy*I%6=|)?fS6KKhTbWKoN3$z3O3!7XSP7i8&5JI z_x?ovmyrn}VgJJ>4Lu)ZI-4e&4_YSQ-CP6i?^;I9z@M{qRQ?fj75)OC;ChI61(? z_lL!Upc+H9DWRX}_dL;XB}d=|f;`dt1STlG1%(+{vxARoFAs9}$FDX`F8ulmyn-1--iHs$(wKLgB*b4FE;c3j6PVf@r;$^0gsXw)&;4&G&oWGjL8r2| z9auv)Nf*ND(F=5=mOmqA>5%cuq{nuAUcgoQ165J+W(dL>s+p^_b#Z@a@1&w8N9w{T zFZ?+&p&dl59Bk7U3fYPp(3KVUFxrNhF<+%4*@? zpqT2oR?4%|zfeLsBCZUB7>E`!PH-M7Eh@t9a_;U*Dd@C@cEPaH35L_K8g(&Mqc%{i%yEaTlNl0jUyf3dK|c0XtSGDiy{ONes%KIem1x|3PgM9jJRyvKKt{QJl%Y4gq2(}0 zHU@}vQr<~_`wjd3Q$WPdmKAsORnmNPQauthDv74BX~vs2pNqAwSUbbBVWyIxi9;{> zEQ-%f`H)mW+EpdCQo-;JYJGdAYLW=Cm73Zow@w*T%2v8x>ahMsbLYVzL(v=%W%yw2 zS50F{sNq?{N^3>Dj-LdH2|l-n@4iqq*HF{Xy&!ezaF&`D=2(^x96dMxzR=izwIpwJ zKuoUZ?LpAb!TMk->!3eg-TknAQ!FC{Flz*XaCPM^k-UkQybIYTlKsML8RQP{e8ay4 zblKKXbs}OKR&_pUL&R<{vk*lw};1 z8JqAwj^zyQCz>YPXqkKSio6j-#K}1F$;v<}Hjb}L_U~iWudMJ(zPk)y28JCTRNsG| zU2=uXJK2{WX?J(uulY)8*|R6{3*#lSsH0*PfZg?^?b~4WR=dE&0dA>6u5d&W$=h=7 z_WP&JfxX+a+>@U=GR7le7vh=x?GMbj;w_yDIfqM4f%=uKgm?Bjq1(#2J$a!lil7V^ zGn7@A^jyKQvs>Wngs%GgY{d~;uekSSN1|7@u?u`HdzX_cUYf$1vdfp0v1cgSr! z_;87bH&DO)YFPa}ti$u(h#NJyu>k^Xo9l=fId>SSw0lO{TF4nDhgp4o=&l>a)CI zkp=Y}1B-3I$OkiHP8`Sxt2{^iHfbf=2MZ`II_{ARd+2ty`2Y)2hdqV;pBR(m6;j}L zxGD7w)q62OsJV@)ZMuf35}Y_|y4=0@e8+>6%5qw2d!rDYVYRQDlxzOrFR%-yv`D1p z$FBtF4FR8;XstK6mD4HKGa@68`!@gu1l%4&UyjHNwAK;YNKtX5L8MH=*L>uNskP^b^DD%_Fluja`y=d7o|WZ}V1w-_!#-Qbj2jfUrzxvc1k+gN zU?Qi*rAHJbYTKrCOim^fdb?`IEROY;dSniF-%WB%2r+oWX}bp=yt?TGl|Z|Xj$cEt4i-At)-5f^ zy!bdvG$FykumRG^(#5?7({P1Sg<*VSLc@`hWYrJ%Yhdv@I>OA4K;LUl*^Y<~XBp^4 z6^&qVnMf{KJQQU$PF6U3AthYIN~uu1QK;k8JY38jm}ejd;L|&+oa@6x&B!js2%lIt zX$%@DpLxhtOj}r6? zXL^$u@q-6zyPIHA7;3&-JZ2a%O9p)}DMp}-+2585EJOs$Y%O8OP@wnrI8b$(DZwN3 zig9sRWMJKmB`6Y8%gpqFTFZ6~BclG`#6NuPs50%ak`$)>CmGc1$l#=d&V@bC@RhYX zI3d6szN|?I;h&CT2sr*IPg-fU*F0{9H{V!E5)xUh$T#jz&c+ zyZg2Q-E>v(VuNB;f3qW{!6(F3Y)Zp`qlbx5fh(lt$HyqMmSGV02ce`U>$1+`_TtA) zHEHlxs?RaW%!WqkvN>zJ3DTWbba*%dAgaJ_7@>=peSZ7{Z^J#(2Ct>_7q%5XC+iY5 zYT4LO$FRV5@>hzx1mEcujj z!w6)c>b3B)Fue7ckW`PEz@4Xt^tGe!RW%z6OCL~MyHsx`_=2|9AEVojmzh|ZguC!wD*4=3x&K&W%dtMU9<_!^W*#H^ zcgJz-HwdK`QNWyP=}qF!u>)`pVmK^7R+W{*oy5LnoHOT1tiU+Bwcgi{OawkH%L8IF z7yR|>E5bKL5W@TkF>t>ycHU7<9k~QHx1NN;~6NtWZx$$jWzQA1^;B zSDqVL9`NrsRg5hVk&ppdU89E~Aao@bpCsHmJKzkU$Wp*zW&1XKQ}h&hwJgyTItbuT z+-c@lP&pQIDdb+<-r18!Ip8`d_Lc!OkLYoOGCSIq`Rj|owY6x6Jv1&LQVmrmZko&6 zXu&AULgJw>?7^EY5-D^ZD;Ykw0FDKAXY?Hx<$K3|z^{`J&gEKfFePqBGNg08dXc}bl!V0jubuNLpmX6d=qs5 zwRQ@#Q6HH@r?Wv0`6G!gtaL;;b}z$B4rYLS8|50k285`Z#3|=w$s+h@04E2IuCWIG zHBEnu(Mz)I^jSx73L1FSMyXNTVdhx|OCS9G+?J@Pc9mm=X0R zZqhvw)_!DbU1x0WwKS|bjm*o;;}tV1jn@(6zm=kGD}qy8`O7BRnvw!GS&PX3&l$aI ztA`e*fj;-6#x;%pQ{AdHM@?hiwp0*n8l~70;wp=z$uN=#rr91#R0!S-vxr5s)felr z5~Wqp?F5QYrMyXnKaQ$WmB{q30J|$foFbWg(5&N8qtOmmsUZCks>*f2U!{?q0CI+~ zoh%)Zd=xPtyd*B|KjDrpm3SJUY6Zd!B%Ol|MlXWz7DAHKGq)zYf}lVwV#yPt4XlHW z$u{~DZbCVVxwk^vKsLpIXha(&lCp#M1ub3j2CAqLl z*D;L#8MaVK+`rctHf5jr>*^d!ja%W^;)SPLRoYLK0?ahGGb}r z=#uUhk(i=QWiY*7@`}dJfXk3Va`b;9&$uT1KJA1L{F1zw4^D38du^Sd8 z+VrBgnGuoe6*X zqjpX4G53)Vk$#wIAhC=l-Y-C4% zwy!wjjtcD3TWl%Q7nvAwycFEr1k5T;k^j;lKj6rB*T0ySy)0b0{A2pG&ghWC=cLp( zqoO4Q^vjlf|4#ZPhtEAL7dR)7Ey7mTvfxLK4cxV8Wi2|lU`OsQFIyzde}hleeeuB_vWf3MH6V>qFI%|ZYTb2vN4EN+ z;9qy_f=1@ITuIVvPlGW_Cg<5Oc#*fs8-boMIXDL5>ANeL<}ow9C#$pe10_&YzdA-( zhn+^%IuA+Up(?O^y+KV1(mNz&tH0bWS$#+4+_;Ve6mj-68v33oq-kWt6J)`?=Fy6b z9UCkKfP^Kt_lEk|6^-qPs8nlHqPQt@VTq`J1Wqh|)}kxwa;mQOe!OIIln2Q%*VOqK z12LP0`wbPqEc^`LZ!aB>2tI9)MH2hS|YNA~Wy^*GT*t#U`G zMl9@QH!SJ{#d!$AwO$t(CzYAzQR}i9w?_~1vso?Kd<0t_Mx-FljdxDKxir3=`p$%X z*coI3D?9neTSdkcb*Rip7AQTcYrAD{((S9Yit;eC3j`qP4$2ug<+gsqOfX)Z&85U} zJx1X>cS*Cr@L7!O*7GiHX~1c0Dwc}M2`BBBZhL&=5qMo=T8rd@+WV4qJN(q~c%(q9 zU{yVYragohqAhplof_>rnF@$Pq#)YS8&aX)4ysks)RFplL)9^JR#S<^2x9T%$pcl; zmw5tBpJllJX3oLWaXnwB9yj4AN^h%{O!satm*(yPQ8|deC(hPGC9BH@-ZrpPH+BpV zBOiCwA3*5!-w6;SA2y0DtZ7hYkuo6;b2>8>b;A$SG6*Nr8e+xalCenkR(v~xQo-%5ARS=^ zBXfilFw>INCilC7I`<1eAgv$lAn}BKxH6P^A<%vtGA*M2q|8G2 zB;~eNYzs-E({MNx^ zOg@2hlu0}`N0Z46K{ReO`CDz*JCj2<12U*>Ysa>EsbTuFvD9c{EPurAlABQXalKjE zMqTj2BbR%MGLR2hN7cgNs?shoJ&G*Itpj zESg-UbGo3a!^)2*Px>bF=v4iRY}f6bZbcSw(1YHS%hj)n`r_=GTHZZB9@n4DxPSK< zgab}u;)p@7b6RM{3>?6X;_{81g4VWupK4l{+ZlZtP4Q65Im8H|>w3@q;J5nn+#F#w&r3I8ySaqEU#tJPcIdWs;Ta}DfsHeX@hDKLKxE`> z5sx*5y6Y~W2kg1b9mXnMnK=aP^HB!qtu#`^Flnr5_EDJz&SqOOi1RGr^wu*J=vZ)Fdzf0T zzoc2xa8F1cs78m;2AF9!{A@$7Yhsu4H-IecaN_6`%5io(FZP{8ntFo{>2uey#VjLq z!k}QG-B&tF1D0vxI7j3MYw19tw0wLpP-O9+>ebE-d-b=D}nQYh7B74Dtk4lro?3p;`ZfDI-eZ4B2!}ZbL9s zhpw?FY?vgvjM+gKbPDeuAEILhPc4p#AwL~l&Vc9EL!ycrQf^sjR{XyH?0@6vrw4g(*L`Y2AA0R9LB2u6PM?Tc_ z*;zr^75uxi*WtG@T?G?>U#G|Hc`%A;kvc?zWrv;oKwCRolIUD{m_fz319&tCh(32$ zaj9*140KAuq*3DWb+Z#vDspUbQL%Jz2vOpAg~U+>P>F~+z9#*(?y+qq+m=F=RcYz} z$i9v>r(kt4Xeh6q-hM!ibC_yg60F5qqAQ4a>5X>YqO9 zA2zQNh#uT&UMqiN@ouhiPGu7^hrxV{gGi%G_@S6bTMb@Ks5C!6eXJ$ixO-XIP}kGe zvsgTJ-ng?`PS|gxtTvXyri%X&LrRYEDR5-_V7l2cSL6H3(D4Wx1TD2@?$g8})H;o7 zw#s^G+ez8s10Pq8LNN?of>J^}LF!ukA3L6d{&b8OrzKvB^xvKumCGv;%jPItt+R(Y z62$TX|F&~)A@Xksa$EGO`;HTtZkCL450}kyOfPf1*)!R6xP1K=7C3~^<4zmweqzB* z-3Wp5GF$LLbV;Js(pN3)NWKhPds-pGa**L;w$-r0j3h=?jHd^>Q61X@6VJH>=OaiJ zTccf>NRbU$072zpXwgey1~n0|hLy!)z~kD=@MYv#GG1T*y{ zsC?yAnQr%CXY{39rX8QMt;k9Reojw%J-($%1{e7MeLRZ^JiU`+ng!EWv z%q;&;+*jxNVR+I0VJM&D6)gC;O%1|_8~6D$sW5_p8fzr)uiAaGi-Y2x6NN(}OTL1X4#HZI_f7Ms4j z`zBe(MUr1J2 zi6WoFGilDg)kpFqwDErL`rijl6G85^NfT}~OKHN6i}^^FZ288j%`n9VRHvL6gu!ygC1A8&=K$WC=-FY8_ktr8xC?ix5qh8{|5+ygG<9Ja@+m2z8B zg9p%9*lyHZE}sN4RM6t7b>TYdEA(D>G*)3SXzRoG&gXT1ENLw%FV(m4aaa{VN-VHhoA#@Fe0E^FFa7r!5z3IAo1*XoqBjDj zI2(gCUHy~yk$>?+)7S4%XN$(nYs8CP{O<3OfPPXy&*9RfPl;~>nR499sZvf-((afr zIf;;<6uI!Mj(4vRVKkpu)`kprUlbNR&m)f#It_GJ7$eW(1(zs%w z@QMbamg>Dyc4U8^bsILH7C)qWTc8iU@FJM2{{$H(0hH}^ta&dIJXU^OpL*>WkqpJ> z%|$7f38O!zLMHu}Vh_quu(Ap~KDIz5;f^}}?)O^fGGisUr~ckq<~PVdO}azf-epe) z87f~ok*L5o^7j^*CvtgXg?fy2hxP{-Axl?HSQ4W_OZrdYo*zmO$AZuLA0bhdiiQ1D zk;*zKou%kil=y?VD5J?-?&4BXb)poNfv5CP`pWcyDgogk-B+x$lw>&Ah2P2uv$dV* zr_JH)NAq}%(=0=jChb(slQe9~RH39h6_(Nd@rCwFA}6fjM$Kp-!};&h@-2$c`Og>~ z9J+y$58;gHAYir&VB)NTYANv>6uI^QDvcgp`13-473nQX75!QAF5#?>|8Tr;j7{8U zc$uzpdw!DbP%i(_WIFq^Lae~kR7kN_&5~8lEIyK%bE=|n@q-jT#(sx#=WsR1LRGd1 z9ZB)DcL;vm?H0sl@G!EdRLHm86t7vYpwlPSasetjB_5OZ;-^`tn*e(WGjyM#-Tcz0$nT3bOg75>$D-M{e3qeQ$|@)=*PViI3TNdGF6P zb~Z_F=6hBX_@}!mr-(R`fNR7G2pR2lt05Ey%V$$_R9X-LK;h~)dyb4R=SX(zHeMH< zygeXpMS317hy2_O<=CQgFV~%z=^UVb>heeW5ApQg@5#OI(wNnn2XaVVBQ4__dlM+g zSYY@_bk579$l$;NlZLOmK5;BtWVXtO$-d9xFqhY@i$3`3>hz55<4>JK$8$2T_r6cg z7p;eo#BRHNwAD4w6ZKJCF>d>hER%pc>R5&8W;Swas}(ht?^^BtlGpE)OLgpf3S-XU zT<)XphTSGKfLvd2IfRkCs`zG@I!2JfKdFf|&uzz0xc-~&i_O!?Z4K7#x0fxQ>s(9e z_~~g)Rv|fu8$>CEc>;`~4tH7^t;)ZsS~&ypZGjbD1}*JVaJJys>@2Ly3Ilq;y5~bJ zK+QSm%u<%J%&DeF@aTRD);zU`)#O(g?-`_`~ z9U54h#C|lwXogH$wdd_DR`R16JR+brQUAb|=jc}AuLG08m;8H!D;_15PKK_i_KMJZ zfJt7#_q#?`fc+`up-W_fvD|~+^pE~LPfQ~Ro@{m6 z?`W*tZ>GTY{d2(YZ)Jam*LGgGJf;+Gj@sWTVzhT}!+mAYW#dixSI$#0;1kTThRO|{ zq^n(1y6ovt55zEZ^s;q$z0F0{qKpZ zV)>>}u~tim4%Y{P=nPL~CC!YxXr<54KI9Lx!{Xk23D~_Scq?Sb_KjE)Sr+^(GiI*P z(*?;Lo9l+Ly}!^=;^jfbnniX1hVZtbnZo#r%65ac>n;Zq*S`vXJZrwuXJ;25Y375K zEdd0)vd<53Q5ivW{J1&qJNkWhh^2%^%GhXLXwe7Ww9Ufp&d5WRTP-GDT`@CwGvJb#L2E5Hpg^5KF=~+(jNLjr(V*7{gXpOa+lbhgB-6B0%)3!8|~Rc&`dFq)vGZ; zFS>#dtZ;nnd;mUot8@1K70}Ct+ZSH#!;yNJNUAX-)@*b&K-JAUS~+trakkl>iF62r zl%~+^2Z^09&0Q&SyzlX(_gNJL-;m(|DrYZYa)1OdKkI*#^nZ`cu6DrleZ)l?I&klA ztv7QY;@#-!-=nl=El_35k2W+boygpHWu89)rJiS3>yKgw)Y{a(-F>{|nwd>iJx7ng zaR<e;@jtI&HN^gkZ&k=cGAp~pcVFzgWZCQ%Sf&)Yy^*B^VK139vKq2~Q zE13N2UoWUwCPG<<{T72YUux1Ri8YJVG$^Kf$rcC97-d705tI6VU-eI$!fPLCO2Jey zEGa7o#QgvtQrHKJ4U>P`u&4A`BkY7y_i$6*=EYRkbP|BGssNM+N!W|_(^_%+0hBEL z(Bb8?0k0-P_=nT``pQ85SavwISPus%z`AW+?8>&%5+G*ic0jnFj!xMNaCQ~ zGiFck@a`Q&Q+8TWso8Leb`J2O9C{NX58Wlx6HG(y&Xb1pq#u)M;BG4ndtKA6bxVX( z)9GnJSkhYvBSB0EMB$~B$}&x^m_?U%C&Cf60hSuWr{d|N#Tma+=Lm3%f|S4iP`Z7| z7}5)KJ4+}2TsB-EHN~HqS8PzH`NN9V{VF-=r^FlqJWsr#cM&c%lmfTvDP}2%)Jq7{ zDvGh2Zc$ydR#aMqo@y>Jf^TETo8&oXFXx4X@wKtB0}2+=KQ4e)>c~Zl(DNM@Zk-X0 z?-Bi!AQQ}>Z|q?jGPp;nnK5l~S<~4mU#ukpVS1M5z%U0{<-FP|A9P3E%2u8H?r^tC zF!wVeW(SdJk7spFdk20oqFgVdYL#G#S)Bq|J+iLT^ugK2)gGnfipR4y^R}6Dw_8{2 zp_R(O;q6J?QMljguU-9hL@=93PH7qo>5m}~UG*$HB#hZiNDfY*`GcOp=*u1fmL8=K zdO{K2$C>X3kja0VMDt0r^bU~s41Idy2Qy{UEM|m~_z)mDBDIX}KON?px_H19>->&J zh-!SjW_lwyFva0=*rPq1%pFW{c+iz#;$8CkLLrCM>kwXcjAwbrv;H#`Jk{!UMd+i^ zYfm(qOrLCtl5Gaje+5qlz8eXcXzyqY{u+|r3ft7&ytJ~mwUtk?=Kj#ZURn|-Y$jM+3rVx zi0dm%eS2ph`}!c$lycQY-%^m?C8cmMd&x!VoKL4grRqb?LpPdY)%gHgDaLODMW+>} z9S>*1=3euLLA#pX*H=%wBn6EO=uFILwWEir>B}7Qe>A}BPiDWH&?k2QNhNOAXTkUq zURZR@X58DUgnn&vm9TrM?b-7`vaM~gdF)fKJFdWWI%skd37q`_1XBgY0d6|eN}qJh zqoUFaIU9}J{Y-!6Gz$h)c@F3`@b^dc=o=|0rH~3Gl4RJjc<&+yJQLAVaDcbpin-%P zC4M*THHguAlQ%uskZOLz1UeMtyRLofysio*kI9QalY87M5mtyTUTR(86Rvj%@|o^ODzWc?+dm->+Wi%{nc@h?~z2=2uGG;HZtmR3S z)e%^cg?qvjYn~)Zq_4iYaHJ5^gtr0Wq~iMA{Q;VH6yY{XCA4fYH@#%H2IyXjDU~2q zRhoOUByB&9CP}NfS%!*+^}Jy-4!GmT7N5^kOwnQnY!y-%v)HPx$7IPe>}%BcKMRvW zPlGBLy7~{UWp1^{kYBX-+{a%xUNrb0z?IQ+;0s?0pECIzDyL?~>t3Ue^yLBGE1B;_ zyVEDPc*r~z6^vJ-BW$~nu|m;8Nj}wMy9#`$!vA_6x>7wac}D#MKS5q1Zrz0XJhqyG z-sSYYo=Zr-LNT8;G}$MKN`JCJmdYSc+S|KQpI*T}7juFAADYfOD9ZQ!{)lvUxx~_o zbVy4`rvlR54NFLO3oPATBGM(@CEY3ACEfXb-oN>MX841FftlUedG6~z*E#2f(O#Hf z*@YGW91r5@PeC284SINVmw&p%sEWe2JQz0&qa+x`vc
    *zuxSxS`?!UDOz~X^15Y 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𝔘faG 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�e3pJx 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π%!(99@dmaS0rdMMJ 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

    UTHI?(!T!x8M-=a+ov@+Z2R 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%0D%@6D-7ez{!imj}l~yV%6_t4`CsC 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

    + +
    + + + + +
    + +
    +
    +
    +

    ImageMagick (legacy)

    + +

    +Use ImageMagick® to create, edit, compose, or convert digital images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, GIF, WebP, HEIC, SVG, PDF, DPX, EXR and TIFF. ImageMagick can resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves.

    + +

    ImageMagick is free software delivered as a ready-to-run binary distribution or as source code that you may use, copy, modify, and distribute in both open and proprietary applications. It is distributed under a derived Apache 2.0 license.

    + +

    ImageMagick utilizes multiple computational threads to increase performance and can read, process, or write mega-, giga-, or tera-pixel image sizes.

    + +

    The current release is ImageMagick 6.9.12-40. It runs on Linux, Windows, Mac Os X, iOS, Android OS, and others.

    + +

    The authoritative ImageMagick version 6 web site is https://legacy.imagemagick.org. The authoritative source code repository is https://github.com/ImageMagick/ImageMagick6. Find the latest release of ImageMagick, version 7, at https://imagemagick.org.

    + +

    The design of ImageMagick is an evolutionary process, with the design and implementation efforts serving to influence and guide further progress in the other. With ImageMagick version 7, we aim to improve the design based on lessons learned from the version 6 implementation. As ImageMagick version 6 is near end of life, we recommend you switch to ImageMagick version 7. In the mean-time we continue to support and add security patches, but not enhance, ImageMagick version 6, until at least August 1, 2028.

    +

    + +

    Features and Capabilities

    +

    Here are just a few examples of what ImageMagick can do for you:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Animationcreate a GIF animation sequence from a group of images.
    Color managementaccurate color management with color profiles or in lieu of-- built-in gamma compression or expansion as demanded by the colorspace.
    Command-line processingutilize ImageMagick from the command-line.
    Complex text layoutbidirectional text support and shaping.
    Compositeoverlap one image over another.
    Connected component labelinguniquely label connected regions in an image.
    Decorateadd a border or frame to an image.
    Delineate image featuresCanny edge detection, Hough lines.
    Discrete Fourier transformimplements the forward and inverse DFT.
    Distributed pixel cacheoffload intermediate pixel storage to one or more remote servers.
    Drawadd shapes or text to an image.
    Encipher or decipher an imageconvert ordinary images into unintelligible gibberish and back again.
    Format conversionconvert an image from one format to another (e.g. PNG to JPEG).
    Generalized pixel distortioncorrect for, or induce image distortions including perspective.
    Heterogeneous distributed processingcertain algorithms are OpenCL-enabled to take advantage of speed-ups offered by executing in concert across heterogeneous platforms consisting of CPUs, GPUs, and other processors.
    High dynamic-range imagesaccurately represent the wide range of intensity levels found in real scenes ranging from the brightest direct sunlight to the deepest darkest shadows.
    Image calculatorapply a mathematical expression to an image, image sequence, or image channels.
    Image gradientscreate a gradual blend of two colors whose shape is horizontal, vertical, circular, or elliptical.
    Image identificationdescribe the format and attributes of an image.
    ImageMagick on the iPhoneconvert, edit, or compose images on your iOS device such as the iPhone or iPad.
    Large image supportread, process, or write mega-, giga-, or tera-pixel image sizes.
    Montagejuxtapose image thumbnails on an image canvas.
    Morphology of shapesextract features, describe shapes, and recognize patterns in images.
    Motion picture supportread and write the common image formats used in digital film work.
    Noise and color reductionKuwahara Filter, mean-shift.
    Perceptual hashmap visually identical images to the same or similar hash-- useful in image retrieval, authentication, indexing, or copy detection as well as digital watermarking.
    Special effectsblur, sharpen, threshold, or tint an image.
    Text & commentsinsert descriptive or artistic text in an image.
    Threads of execution supportImageMagick is thread safe and most internal algorithms execute in parallel to take advantage of speed-ups offered by multicore processor chips.
    Transformresize, rotate, deskew, crop, flip or trim an image.
    Transparencyrender portions of an image invisible.
    Virtual pixel supportconvenient access to pixels outside the image boundaries.
    +
    + +

    Examples of ImageMagick Usage shows how to use ImageMagick from the command-line to accomplish any of these tasks and much more. Also, see Fred's ImageMagick Scripts: a plethora of command-line scripts that perform geometric transforms, blurs, sharpens, edging, noise removal, and color manipulations. With Magick.NET, use ImageMagick without having to install ImageMagick on your server or desktop. Finally, see Snibgo's ImageMagick Cookbook for Windows-based ImageMagick scripting.

    + +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/m4/Makefile.am b/ImageMagick-6.9.12-44/m4/Makefile.am new file mode 100644 index 0000000..4c26a32 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/Makefile.am @@ -0,0 +1,43 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building ImageMagick m4 macros. + +M4_EXTRA_DIST = \ + ac_func_fseeko.m4 \ + ax_append_flag.m4 \ + ax_c___attribute__.m4 \ + ax_cflags_warn_all.m4 \ + ax_check_framework.m4 \ + ax_compare_version.m4 \ + ax_cxx_bool.m4 \ + ax_cxx_namespaces.m4 \ + ax_cxx_namespace_std.m4 \ + ax_lang_compiler_ms.m4 \ + ax_have_opencl.m4 \ + ax_prefix_config_h.m4 \ + ax_prog_perl_version.m4 \ + ax_pthread.m4 \ + ax_require_defined.m4 \ + cxx_have_lstring.m4 \ + cxx_have_std_libs.m4 \ + framework.m4 \ + libtool.m4 \ + lt~obsolete.m4 \ + ltoptions.m4 \ + ltsugar.m4 \ + ltversion.m4 \ + magick_check_pthread_lib.m4 \ + pkg.m4 \ + version.m4 diff --git a/ImageMagick-6.9.12-44/m4/ac_func_fseeko.m4 b/ImageMagick-6.9.12-44/m4/ac_func_fseeko.m4 new file mode 100644 index 0000000..eaeabb9 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ac_func_fseeko.m4 @@ -0,0 +1,72 @@ +# This file is part of Autoconf. -*- Autoconf -*- +# Checking for functions. +# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software +# Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception, the Free Software Foundation gives unlimited +# permission to copy, distribute and modify the configure scripts that +# are the output of Autoconf. You need not follow the terms of the GNU +# General Public License when using or distributing such scripts, even +# though portions of the text of Autoconf appear in them. The GNU +# General Public License (GPL) does govern all other use of the material +# that constitutes the Autoconf program. +# +# Certain portions of the Autoconf source text are designed to be copied +# (in certain cases, depending on the input) into the output of +# Autoconf. We call these the "data" portions. The rest of the Autoconf +# source text consists of comments plus executable code that decides which +# of the data portions to output in any given case. We call these +# comments and executable code the "non-data" portions. Autoconf never +# copies any of the non-data portions into its output. +# +# This special exception to the GPL applies to versions of Autoconf +# released by the Free Software Foundation. When you make and +# distribute a modified version of Autoconf, you may extend this special +# exception to the GPL to apply to your modified version as well, *unless* +# your modified version has the potential to copy into its output some +# of the text that was the non-data portion of the version that you started +# with. (In other words, unless your change moves or copies text from +# the non-data portions to the data portions.) If your modification has +# such potential, you must delete any notice of this special exception +# to the GPL from your modified version. +# +# Written by David MacKenzie, with help from +# Franc,ois Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor, +# Roland McGrath, Noah Friedman, david d zuhn, and many others. + +# AC_FUNC_FSEEKO +# -------------- +AN_FUNCTION([ftello], [AC_FUNC_FSEEKO]) +AN_FUNCTION([fseeko], [AC_FUNC_FSEEKO]) +AC_DEFUN([AC_FUNC_FSEEKO], +[_AC_SYS_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE, 1, + [ac_cv_sys_largefile_source], + [Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2).], + [[#include /* for off_t */ + #include ]], + [[int (*fp) (FILE *, off_t, int) = fseeko; + return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);]]) + +# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug +# in glibc 2.1.3, but that breaks too many other things. +# If you want fseeko and ftello with glibc, upgrade to a fixed glibc. +if test $ac_cv_sys_largefile_source != unknown; then + AC_DEFINE(HAVE_FSEEKO, 1, + [Define to 1 if fseeko (and presumably ftello) exists and is declared.]) +fi +])# AC_FUNC_FSEEKO diff --git a/ImageMagick-6.9.12-44/m4/ax_c___attribute__.m4 b/ImageMagick-6.9.12-44/m4/ax_c___attribute__.m4 new file mode 100644 index 0000000..6a1ede1 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_c___attribute__.m4 @@ -0,0 +1,66 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_c___attribute__.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_C___ATTRIBUTE__ +# +# DESCRIPTION +# +# Provides a test for the compiler support of __attribute__ extensions. +# Defines HAVE___ATTRIBUTE__ if it is found. +# +# LICENSE +# +# Copyright (c) 2008 Stepan Kasal +# Copyright (c) 2008 Christian Haggstrom +# Copyright (c) 2008 Ryan McCabe +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 9 + +AC_DEFUN([AX_C___ATTRIBUTE__], [ + AC_CACHE_CHECK([for __attribute__], [ax_cv___attribute__], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + static void foo(void) __attribute__ ((unused)); + static void + foo(void) { + exit(1); + } + ]], [])], + [ax_cv___attribute__=yes], + [ax_cv___attribute__=no] + ) + ]) + if test "$ax_cv___attribute__" = "yes"; then + AC_DEFINE([HAVE___ATTRIBUTE__], 1, [define if your compiler has __attribute__]) + fi +]) diff --git a/ImageMagick-6.9.12-44/m4/ax_cflags_warn_all.m4 b/ImageMagick-6.9.12-44/m4/ax_cflags_warn_all.m4 new file mode 100644 index 0000000..9235a18 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_cflags_warn_all.m4 @@ -0,0 +1,158 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CFLAGS_WARN_ALL [(shellvar[, default[, action-if-found[, action-if-not-found]]])] +# AX_CXXFLAGS_WARN_ALL [(shellvar[, default[, action-if-found[, action-if-not-found]]])] +# AX_FCFLAGS_WARN_ALL [(shellvar[, default[, action-if-found[, action-if-not-found]]])] +# +# DESCRIPTION +# +# Specify compiler options that enable most reasonable warnings. For the +# GNU Compiler Collection (GCC), for example, it will be "-Wall". The +# result is added to shellvar, one of CFLAGS, CXXFLAGS or FCFLAGS if the +# first parameter is not specified. +# +# Each of these macros accepts the following optional arguments: +# +# - $1 - shellvar +# shell variable to use (CFLAGS, CXXFLAGS or FCFLAGS if not +# specified, depending on macro) +# +# - $2 - default +# value to use for flags if compiler vendor cannot be determined (by +# default, "") +# +# - $3 - action-if-found +# action to take if the compiler vendor has been successfully +# determined (by default, add the appropriate compiler flags to +# shellvar) +# +# - $4 - action-if-not-found +# action to take if the compiler vendor has not been determined or +# is unknown (by default, add the default flags, or "" if not +# specified, to shellvar) +# +# These macros use AX_COMPILER_VENDOR to determine which flags should be +# returned for a given compiler. Not all compilers currently have flags +# defined for them; patches are welcome. If need be, compiler flags may +# be made language-dependent: use a construct like the following: +# +# [vendor_name], [m4_if(_AC_LANG_PREFIX,[C], VAR="--relevant-c-flags",dnl +# m4_if(_AC_LANG_PREFIX,[CXX], VAR="--relevant-c++-flags",dnl +# m4_if(_AC_LANG_PREFIX,[FC], VAR="--relevant-fortran-flags",dnl +# VAR="$2"; FOUND="no")))], +# +# Note: These macros also depend on AX_PREPEND_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2010 Rhys Ulerich +# Copyright (c) 2018 John Zaitseff +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 25 + +AC_DEFUN([AX_FLAGS_WARN_ALL], [ + AX_REQUIRE_DEFINED([AX_PREPEND_FLAG])dnl + AC_REQUIRE([AX_COMPILER_VENDOR])dnl + + AS_VAR_PUSHDEF([FLAGS], [m4_default($1,_AC_LANG_PREFIX[]FLAGS)])dnl + AS_VAR_PUSHDEF([VAR], [ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl + AS_VAR_PUSHDEF([FOUND], [ac_save_[]_AC_LANG_ABBREV[]flags_warn_all_found])dnl + + AC_CACHE_CHECK([FLAGS for most reasonable warnings], VAR, [ + VAR="" + FOUND="yes" + dnl Cases are listed in the order found in ax_compiler_vendor.m4 + AS_CASE("$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor", + [intel], [VAR="-w2"], + [ibm], [VAR="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd"], + [pathscale], [], + [clang], [VAR="-Wall"], + [cray], [VAR="-h msglevel 2"], + [fujitsu], [], + [sdcc], [], + [sx], [VAR="-pvctl[,]fullmsg"], + [portland], [], + [gnu], [VAR="-Wall"], + [sun], [VAR="-v"], + [hp], [VAR="+w1"], + [dec], [VAR="-verbose -w0 -warnprotos"], + [borland], [], + [comeau], [], + [kai], [], + [lcc], [], + [sgi], [VAR="-fullwarn"], + [microsoft], [], + [metrowerks], [], + [watcom], [], + [tcc], [], + [unknown], [ + VAR="$2" + FOUND="no" + ], + [ + AC_MSG_WARN([Unknown compiler vendor returned by [AX_COMPILER_VENDOR]]) + VAR="$2" + FOUND="no" + ] + ) + + AS_IF([test "x$FOUND" = "xyes"], [dnl + m4_default($3, [AS_IF([test "x$VAR" != "x"], [AX_PREPEND_FLAG([$VAR], [FLAGS])])]) + ], [dnl + m4_default($4, [m4_ifval($2, [AX_PREPEND_FLAG([$VAR], [FLAGS])], [true])]) + ])dnl + ])dnl + + AS_VAR_POPDEF([FOUND])dnl + AS_VAR_POPDEF([VAR])dnl + AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_FLAGS_WARN_ALL + +AC_DEFUN([AX_CFLAGS_WARN_ALL], [dnl + AC_LANG_PUSH([C]) + AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) + AC_LANG_POP([C]) +])dnl + +AC_DEFUN([AX_CXXFLAGS_WARN_ALL], [dnl + AC_LANG_PUSH([C++]) + AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) + AC_LANG_POP([C++]) +])dnl + +AC_DEFUN([AX_FCFLAGS_WARN_ALL], [dnl + AC_LANG_PUSH([Fortran]) + AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) + AC_LANG_POP([Fortran]) +])dnl diff --git a/ImageMagick-6.9.12-44/m4/ax_check_compile_flag.m4 b/ImageMagick-6.9.12-44/m4/ax_check_compile_flag.m4 new file mode 100644 index 0000000..bd753b3 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_check_compile_flag.m4 @@ -0,0 +1,53 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 6 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/ImageMagick-6.9.12-44/m4/ax_check_framework.m4 b/ImageMagick-6.9.12-44/m4/ax_check_framework.m4 new file mode 100644 index 0000000..f1624e2 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_check_framework.m4 @@ -0,0 +1,36 @@ +dnl ax_check_framework.m4 +dnl +dnl COPYRIGHT (c) 2008 John Reppy (http://cs.uchicago.edu/~jhr) +dnl All rights reserved. +dnl +dnl @synopsis AX_CHECK_FRAMEWORK(framework, [action-if-found], [action-if-not-found]) +dnl +dnl This macro is similar to the AC_CHECK_LIB macro, except that it works +dnl for Mac OS X frameworks. It checks to see if the given framework exists +dnl on the host sytem and if so prepends "-framework framework" to the FRAMEWORKS +dnl variable. +dnl +dnl @author John Reppy +dnl +AC_DEFUN([AX_CHECK_FRAMEWORK],[ + AC_REQUIRE([AC_CANONICAL_HOST])dnl + case x"$host_os" in + xdarwin*) + AS_VAR_PUSHDEF([ax_Check], [ax_cv_check_$1]) + AC_CACHE_CHECK([for framework $1], [ax_Check],[ + AC_LANG_PUSH([C]) + ac_check_framework_save_LIBS=$LIBS + LIBS="-framework $1 $LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [ax_Check="yes"], [ax_Check="no"]) + AC_LANG_POP([C])dnl + ]) + if test x"$ax_Check" = "xyes" ; then + m4_ifvaln([$2],[$2],[:])dnl + else + m4_ifvaln([$3],[$3],[:])dnl + fi + LIBS=$ac_check_framework_save_LIBS + AS_VAR_POPDEF([ax_Check])dnl + ;; + esac +])dnl diff --git a/ImageMagick-6.9.12-44/m4/ax_compare_version.m4 b/ImageMagick-6.9.12-44/m4/ax_compare_version.m4 new file mode 100644 index 0000000..ffb4997 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_compare_version.m4 @@ -0,0 +1,177 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_compare_version.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +# +# DESCRIPTION +# +# This macro compares two version strings. Due to the various number of +# minor-version numbers that can exist, and the fact that string +# comparisons are not compatible with numeric comparisons, this is not +# necessarily trivial to do in a autoconf script. This macro makes doing +# these comparisons easy. +# +# The six basic comparisons are available, as well as checking equality +# limited to a certain number of minor-version levels. +# +# The operator OP determines what type of comparison to do, and can be one +# of: +# +# eq - equal (test A == B) +# ne - not equal (test A != B) +# le - less than or equal (test A <= B) +# ge - greater than or equal (test A >= B) +# lt - less than (test A < B) +# gt - greater than (test A > B) +# +# Additionally, the eq and ne operator can have a number after it to limit +# the test to that number of minor versions. +# +# eq0 - equal up to the length of the shorter version +# ne0 - not equal up to the length of the shorter version +# eqN - equal up to N sub-version levels +# neN - not equal up to N sub-version levels +# +# When the condition is true, shell commands ACTION-IF-TRUE are run, +# otherwise shell commands ACTION-IF-FALSE are run. The environment +# variable 'ax_compare_version' is always set to either 'true' or 'false' +# as well. +# +# Examples: +# +# AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) +# AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) +# +# would both be true. +# +# AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) +# AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) +# +# would both be false. +# +# AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) +# +# would be true because it is only comparing two minor versions. +# +# AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) +# +# would be true because it is only comparing the lesser number of minor +# versions of the two values. +# +# Note: The characters that separate the version numbers do not matter. An +# empty string is the same as version 0. OP is evaluated by autoconf, not +# configure, so must be a string, not a variable. +# +# The author would like to acknowledge Guido Draheim whose advice about +# the m4_case and m4_ifvaln functions make this macro only include the +# portions necessary to perform the specific comparison specified by the +# OP argument in the final configure script. +# +# LICENSE +# +# Copyright (c) 2008 Tim Toolan +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 13 + +dnl ######################################################################### +AC_DEFUN([AX_COMPARE_VERSION], [ + AC_REQUIRE([AC_PROG_AWK]) + + # Used to indicate true or false condition + ax_compare_version=false + + # Convert the two version strings to be compared into a format that + # allows a simple string comparison. The end result is that a version + # string of the form 1.12.5-r617 will be converted to the form + # 0001001200050617. In other words, each number is zero padded to four + # digits, and non digits are removed. + AS_VAR_PUSHDEF([A],[ax_compare_version_A]) + A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ + -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/[[^0-9]]//g'` + + AS_VAR_PUSHDEF([B],[ax_compare_version_B]) + B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ + -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/[[^0-9]]//g'` + + dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary + dnl # then the first line is used to determine if the condition is true. + dnl # The sed right after the echo is to remove any indented white space. + m4_case(m4_tolower($2), + [lt],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` + ], + [gt],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` + ], + [le],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` + ], + [ge],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` + ],[ + dnl Split the operator from the subversion count if present. + m4_bmatch(m4_substr($2,2), + [0],[ + # A count of zero means use the length of the shorter version. + # Determine the number of characters in A and B. + ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'` + ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'` + + # Set A to no more than B's length and B to no more than A's length. + A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` + B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` + ], + [[0-9]+],[ + # A count greater than zero means use only that many subversions + A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` + B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` + ], + [.+],[ + AC_WARNING( + [invalid OP numeric parameter: $2]) + ],[]) + + # Pad zeros at end of numbers to make same length. + ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" + B="$B`echo $A | sed 's/./0/g'`" + A="$ax_compare_version_tmp_A" + + # Check for equality or inequality as necessary. + m4_case(m4_tolower(m4_substr($2,0,2)), + [eq],[ + test "x$A" = "x$B" && ax_compare_version=true + ], + [ne],[ + test "x$A" != "x$B" && ax_compare_version=true + ],[ + AC_WARNING([invalid OP parameter: $2]) + ]) + ]) + + AS_VAR_POPDEF([A])dnl + AS_VAR_POPDEF([B])dnl + + dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. + if test "$ax_compare_version" = "true" ; then + m4_ifvaln([$4],[$4],[:])dnl + m4_ifvaln([$5],[else $5])dnl + fi +]) dnl AX_COMPARE_VERSION diff --git a/ImageMagick-6.9.12-44/m4/ax_compiler_vendor.m4 b/ImageMagick-6.9.12-44/m4/ax_compiler_vendor.m4 new file mode 100644 index 0000000..f06e865 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_compiler_vendor.m4 @@ -0,0 +1,117 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_COMPILER_VENDOR +# +# DESCRIPTION +# +# Determine the vendor of the C, C++ or Fortran compiler. The vendor is +# returned in the cache variable $ax_cv_c_compiler_vendor for C, +# $ax_cv_cxx_compiler_vendor for C++ or $ax_cv_fc_compiler_vendor for +# (modern) Fortran. The value is one of "intel", "ibm", "pathscale", +# "clang" (LLVM), "cray", "fujitsu", "sdcc", "sx", "portland" (PGI), "gnu" +# (GCC), "sun" (Oracle Developer Studio), "hp", "dec", "borland", +# "comeau", "kai", "lcc", "sgi", "microsoft", "metrowerks", "watcom", +# "tcc" (Tiny CC) or "unknown" (if the compiler cannot be determined). +# +# To check for a Fortran compiler, you must first call AC_FC_PP_SRCEXT +# with an appropriate preprocessor-enabled extension. For example: +# +# AC_LANG_PUSH([Fortran]) +# AC_PROG_FC +# AC_FC_PP_SRCEXT([F]) +# AX_COMPILER_VENDOR +# AC_LANG_POP([Fortran]) +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2008 Matteo Frigo +# Copyright (c) 2018-19 John Zaitseff +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 30 + +AC_DEFUN([AX_COMPILER_VENDOR], [dnl + AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, [dnl + dnl If you modify this list of vendors, please add similar support + dnl to ax_compiler_version.m4 if at all possible. + dnl + dnl Note: Do NOT check for GCC first since some other compilers + dnl define __GNUC__ to remain compatible with it. Compilers that + dnl are very slow to start (such as Intel) are listed first. + + vendors=" + intel: __ICC,__ECC,__INTEL_COMPILER + ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__,__ibmxl__ + pathscale: __PATHCC__,__PATHSCALE__ + clang: __clang__ + cray: _CRAYC + fujitsu: __FUJITSU + sdcc: SDCC,__SDCC + sx: _SX + portland: __PGI + gnu: __GNUC__ + sun: __SUNPRO_C,__SUNPRO_CC,__SUNPRO_F90,__SUNPRO_F95 + hp: __HP_cc,__HP_aCC + dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER + borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ + comeau: __COMO__ + kai: __KCC + lcc: __LCC__ + sgi: __sgi,sgi + microsoft: _MSC_VER + metrowerks: __MWERKS__ + watcom: __WATCOMC__ + tcc: __TINYC__ + unknown: UNKNOWN + " + for ventest in $vendors; do + case $ventest in + *:) + vendor=$ventest + continue + ;; + *) + vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" + ;; + esac + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[ +#if !($vencpp) + thisisanerror; +#endif + ]])], [break]) + done + + ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1` + ]) +])dnl diff --git a/ImageMagick-6.9.12-44/m4/ax_cxx_bool.m4 b/ImageMagick-6.9.12-44/m4/ax_cxx_bool.m4 new file mode 100644 index 0000000..d12275b --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_cxx_bool.m4 @@ -0,0 +1,45 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_cxx_bool.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_BOOL +# +# DESCRIPTION +# +# If the compiler recognizes bool as a separate built-in type, define +# HAVE_BOOL. Note that a typedef is not a separate type since you cannot +# overload a function such that it accepts either the basic type or the +# typedef. +# +# LICENSE +# +# Copyright (c) 2008 Todd Veldhuizen +# Copyright (c) 2008 Luc Maisonobe +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 8 + +AU_ALIAS([AC_CXX_BOOL], [AX_CXX_BOOL]) +AC_DEFUN([AX_CXX_BOOL], +[dnl + AC_CACHE_CHECK(whether the compiler recognizes bool as a built-in type, + ax_cv_cxx_bool, + [dnl + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([dnl + AC_LANG_PROGRAM([int f(int x){return 1;} + int f(char x){return 1;} + int f(bool x){return 1;}], + [bool b = true; return f(b);])], + ax_cv_cxx_bool=yes, ax_cv_cxx_bool=no) + AC_LANG_POP([C++]) + ]) + AS_IF([test "X$ax_cv_cxx_bool" = Xyes], + [AC_DEFINE(HAVE_BOOL,,[define if bool is a built-in type])]) +]) diff --git a/ImageMagick-6.9.12-44/m4/ax_cxx_namespace_std.m4 b/ImageMagick-6.9.12-44/m4/ax_cxx_namespace_std.m4 new file mode 100644 index 0000000..967f6f7 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_cxx_namespace_std.m4 @@ -0,0 +1,38 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_cxx_namespace_std.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_NAMESPACE_STD +# +# DESCRIPTION +# +# If the compiler supports namespace std, define HAVE_NAMESPACE_STD. +# +# LICENSE +# +# Copyright (c) 2009 Todd Veldhuizen +# Copyright (c) 2009 Luc Maisonobe +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 8 + +AU_ALIAS([AC_CXX_NAMESPACE_STD], [AX_CXX_NAMESPACE_STD]) +AC_DEFUN([AX_CXX_NAMESPACE_STD], [ + AC_CACHE_CHECK(if g++ supports namespace std, + ax_cv_cxx_have_std_namespace, + [AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + std::istream& is = std::cin;]], [])], + [ax_cv_cxx_have_std_namespace=yes], [ax_cv_cxx_have_std_namespace=no]) + AC_LANG_POP([C++]) + ]) + if test "$ax_cv_cxx_have_std_namespace" = yes; then + AC_DEFINE(HAVE_NAMESPACE_STD,,[Define if g++ supports namespace std. ]) + fi +]) diff --git a/ImageMagick-6.9.12-44/m4/ax_cxx_namespaces.m4 b/ImageMagick-6.9.12-44/m4/ax_cxx_namespaces.m4 new file mode 100644 index 0000000..389654b --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_cxx_namespaces.m4 @@ -0,0 +1,40 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_cxx_namespaces.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_NAMESPACES +# +# DESCRIPTION +# +# If the compiler can prevent names clashes using namespaces, define +# HAVE_NAMESPACES. +# +# LICENSE +# +# Copyright (c) 2008 Todd Veldhuizen +# Copyright (c) 2008 Luc Maisonobe +# Copyright (c) 2013 Bastien Roucaries +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 9 + +AU_ALIAS([AC_CXX_NAMESPACES], [AX_CXX_NAMESPACES]) +AC_DEFUN([AX_CXX_NAMESPACES], +[AC_CACHE_CHECK(whether the compiler implements namespaces, +ax_cv_cxx_namespaces, +[AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([namespace Outer { namespace Inner { int i = 0; }} + using namespace Outer::Inner; int foo(void) { return i;} ])], + ax_cv_cxx_namespaces=yes, ax_cv_cxx_namespaces=no) + AC_LANG_POP +]) +if test "$ax_cv_cxx_namespaces" = yes; then + AC_DEFINE(HAVE_NAMESPACES,,[define if the compiler implements namespaces]) +fi +]) diff --git a/ImageMagick-6.9.12-44/m4/ax_gcc_archflag.m4 b/ImageMagick-6.9.12-44/m4/ax_gcc_archflag.m4 new file mode 100644 index 0000000..c52b9b2 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_gcc_archflag.m4 @@ -0,0 +1,267 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_gcc_archflag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE]) +# +# DESCRIPTION +# +# This macro tries to guess the "native" arch corresponding to the target +# architecture for use with gcc's -march=arch or -mtune=arch flags. If +# found, the cache variable $ax_cv_gcc_archflag is set to this flag and +# ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is set to +# "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is +# to add $ax_cv_gcc_archflag to the end of $CFLAGS. +# +# PORTABLE? should be either [yes] (default) or [no]. In the former case, +# the flag is set to -mtune (or equivalent) so that the architecture is +# only used for tuning, but the instruction set used is still portable. In +# the latter case, the flag is set to -march (or equivalent) so that +# architecture-specific instructions are enabled. +# +# The user can specify --with-gcc-arch= in order to override the +# macro's choice of architecture, or --without-gcc-arch to disable this. +# +# When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is +# called unless the user specified --with-gcc-arch manually. +# +# Requires macros: AX_CHECK_COMPILE_FLAG, AX_GCC_X86_CPUID +# +# (The main emphasis here is on recent CPUs, on the principle that doing +# high-performance computing on old hardware is uncommon.) +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2008 Matteo Frigo +# Copyright (c) 2014 Tsukasa Oi +# Copyright (c) 2017-2018 Alexey Kopytov +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 22 + +AC_DEFUN([AX_GCC_ARCHFLAG], +[AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_SED]) +AC_REQUIRE([AX_COMPILER_VENDOR]) + +AC_ARG_WITH(gcc-arch, [AS_HELP_STRING([--with-gcc-arch=], [use architecture for gcc -march/-mtune, instead of guessing])], + ax_gcc_arch=$withval, ax_gcc_arch=yes) + +AC_MSG_CHECKING([for gcc architecture flag]) +AC_MSG_RESULT([]) +AC_CACHE_VAL(ax_cv_gcc_archflag, +[ +ax_cv_gcc_archflag="unknown" + +if test "$GCC" = yes; then + +if test "x$ax_gcc_arch" = xyes; then +ax_gcc_arch="" +if test "$cross_compiling" = no; then +case $host_cpu in + i[[3456]]86*|x86_64*|amd64*) # use cpuid codes + AX_GCC_X86_CPUID(0) + AX_GCC_X86_CPUID(1) + case $ax_cv_gcc_x86_cpuid_0 in + *:756e6547:6c65746e:49656e69) # Intel + case $ax_cv_gcc_x86_cpuid_1 in + *5[[4578]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; + *5[[123]]?:*:*:*) ax_gcc_arch=pentium ;; + *0?61?:*:*:*|?61?:*:*:*|61?:*:*:*) ax_gcc_arch=pentiumpro ;; + *0?6[[356]]?:*:*:*|?6[[356]]?:*:*:*|6[[356]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; + *0?6[[78ab]]?:*:*:*|?6[[78ab]]?:*:*:*|6[[78ab]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; + *0?6[[9d]]?:*:*:*|?6[[9d]]?:*:*:*|6[[9d]]?:*:*:*|*1?65?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; + *0?6e?:*:*:*|?6e?:*:*:*|6e?:*:*:*) ax_gcc_arch="yonah pentium-m pentium3 pentiumpro" ;; + *0?6f?:*:*:*|?6f?:*:*:*|6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; + *1?6[[7d]]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; + *1?6[[aef]]?:*:*:*|*2?6e?:*:*:*) ax_gcc_arch="nehalem corei7 core2 pentium-m pentium3 pentiumpro" ;; + *2?6[[5cf]]?:*:*:*) ax_gcc_arch="westmere corei7 core2 pentium-m pentium3 pentiumpro" ;; + *2?6[[ad]]?:*:*:*) ax_gcc_arch="sandybridge corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *3?6[[ae]]?:*:*:*) ax_gcc_arch="ivybridge core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *3?6[[cf]]?:*:*:*|*4?6[[56]]?:*:*:*) ax_gcc_arch="haswell core-avx2 core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *3?6d?:*:*:*|*4?6[[7f]]?:*:*:*|*5?66?:*:*:*) ax_gcc_arch="broadwell core-avx2 core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *1?6c?:*:*:*|*2?6[[67]]?:*:*:*|*3?6[[56]]?:*:*:*) ax_gcc_arch="bonnell atom core2 pentium-m pentium3 pentiumpro" ;; + *3?67?:*:*:*|*[[45]]?6[[ad]]?:*:*:*) ax_gcc_arch="silvermont atom core2 pentium-m pentium3 pentiumpro" ;; + *000?f[[012]]?:*:*:*|?f[[012]]?:*:*:*|f[[012]]?:*:*:*) ax_gcc_arch="pentium4 pentiumpro" ;; + *000?f[[346]]?:*:*:*|?f[[346]]?:*:*:*|f[[346]]?:*:*:*) ax_gcc_arch="nocona prescott pentium4 pentiumpro" ;; + # fallback + *5??:*:*:*) ax_gcc_arch=pentium ;; + *??6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; + *6??:*:*:*) ax_gcc_arch=pentiumpro ;; + *00??f??:*:*:*|??f??:*:*:*|?f??:*:*:*|f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro" ;; + esac ;; + *:68747541:444d4163:69746e65) # AMD + case $ax_cv_gcc_x86_cpuid_1 in + *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;; + *5[[8]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; + *5[[9d]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; + *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;; + *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; + *6[[678a]]?:*:*:*) ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; + *000?f[[4578bcef]]?:*:*:*|?f[[4578bcef]]?:*:*:*|f[[4578bcef]]?:*:*:*|*001?f[[4578bcf]]?:*:*:*|1?f[[4578bcf]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; + *002?f[[13457bcf]]?:*:*:*|2?f[[13457bcf]]?:*:*:*|*004?f[[138bcf]]?:*:*:*|4?f[[138bcf]]?:*:*:*|*005?f[[df]]?:*:*:*|5?f[[df]]?:*:*:*|*006?f[[8bcf]]?:*:*:*|6?f[[8bcf]]?:*:*:*|*007?f[[cf]]?:*:*:*|7?f[[cf]]?:*:*:*|*00c?f1?:*:*:*|c?f1?:*:*:*|*020?f3?:*:*:*|20?f3?:*:*:*) ax_gcc_arch="athlon64-sse3 k8-sse3 athlon64 k8" ;; + *010?f[[245689a]]?:*:*:*|10?f[[245689a]]?:*:*:*|*030?f1?:*:*:*|30?f1?:*:*:*) ax_gcc_arch="barcelona amdfam10 k8" ;; + *050?f[[12]]?:*:*:*|50?f[[12]]?:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; + *060?f1?:*:*:*|60?f1?:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; + *060?f2?:*:*:*|60?f2?:*:*:*|*061?f[[03]]?:*:*:*|61?f[[03]]?:*:*:*) ax_gcc_arch="bdver2 bdver1 amdfam10 k8" ;; + *063?f0?:*:*:*|63?f0?:*:*:*) ax_gcc_arch="bdver3 bdver2 bdver1 amdfam10 k8" ;; + *07[[03]]?f0?:*:*:*|7[[03]]?f0?:*:*:*) ax_gcc_arch="btver2 btver1 amdfam10 k8" ;; + # fallback + *0[[13]]??f??:*:*:*|[[13]]??f??:*:*:*) ax_gcc_arch="barcelona amdfam10 k8" ;; + *020?f??:*:*:*|20?f??:*:*:*) ax_gcc_arch="athlon64-sse3 k8-sse3 athlon64 k8" ;; + *05??f??:*:*:*|5??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; + *060?f??:*:*:*|60?f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; + *061?f??:*:*:*|61?f??:*:*:*) ax_gcc_arch="bdver2 bdver1 amdfam10 k8" ;; + *06??f??:*:*:*|6??f??:*:*:*) ax_gcc_arch="bdver3 bdver2 bdver1 amdfam10 k8" ;; + *070?f??:*:*:*|70?f??:*:*:*) ax_gcc_arch="btver2 btver1 amdfam10 k8" ;; + *???f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; + esac ;; + *:746e6543:736c7561:48727561) # IDT / VIA (Centaur) + case $ax_cv_gcc_x86_cpuid_1 in + *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; + *5[[89]]?:*:*:*) ax_gcc_arch=winchip2 ;; + *66?:*:*:*) ax_gcc_arch=winchip2 ;; + *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;; + *6[[9adf]]?:*:*:*) ax_gcc_arch="c3-2 c3" ;; + esac ;; + esac + if test x"$ax_gcc_arch" = x; then # fallback + case $host_cpu in + i586*) ax_gcc_arch=pentium ;; + i686*) ax_gcc_arch=pentiumpro ;; + esac + fi + ;; + + sparc*) + AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/]) + cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` + cputype=`echo "$cputype" | tr -d ' -' | $SED 's/SPARCIIi/SPARCII/' |tr $as_cr_LETTERS $as_cr_letters` + case $cputype in + *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; + *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; + *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; + *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;; + *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;; + *cypress*) ax_gcc_arch=cypress ;; + esac ;; + + alphaev5) ax_gcc_arch=ev5 ;; + alphaev56) ax_gcc_arch=ev56 ;; + alphapca56) ax_gcc_arch="pca56 ev56" ;; + alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; + alphaev6) ax_gcc_arch=ev6 ;; + alphaev67) ax_gcc_arch=ev67 ;; + alphaev68) ax_gcc_arch="ev68 ev67" ;; + alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; + alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; + alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; + + powerpc*) + cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | $SED 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` + cputype=`echo $cputype | $SED -e 's/ppc//g;s/ *//g'` + case $cputype in + *750*) ax_gcc_arch="750 G3" ;; + *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;; + *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;; + *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;; + *970*) ax_gcc_arch="970 G5 power4";; + *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; + *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; + 603ev|8240) ax_gcc_arch="$cputype 603e 603";; + *POWER7*) ax_gcc_arch="power7";; + *POWER8*) ax_gcc_arch="power8";; + *POWER9*) ax_gcc_arch="power9";; + *POWER10*) ax_gcc_arch="power10";; + *) ax_gcc_arch=$cputype ;; + esac + ax_gcc_arch="$ax_gcc_arch powerpc" + ;; + aarch64) + cpuimpl=`grep 'CPU implementer' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` + cpuarch=`grep 'CPU architecture' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` + cpuvar=`grep 'CPU variant' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` + case $cpuimpl in + 0x42) case $cpuarch in + 8) case $cpuvar in + 0x0) ax_gcc_arch="thunderx2t99 vulcan armv8.1-a armv8-a+lse armv8-a native" ;; + esac + ;; + esac + ;; + 0x43) case $cpuarch in + 8) case $cpuvar in + 0x0) ax_gcc_arch="thunderx armv8-a native" ;; + 0x1) ax_gcc_arch="thunderx+lse armv8.1-a armv8-a+lse armv8-a native" ;; + esac + ;; + esac + ;; + esac + ;; +esac +fi # not cross-compiling +fi # guess arch + +if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then +if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code + flag_prefixes="-mtune=" + if test "x$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor" = xclang; then flag_prefixes="-march="; fi + # -mcpu=$arch and m$arch generate nonportable code on every arch except + # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. + case $host_cpu in i*86|x86_64*|amd64*) flag_prefixes="$flag_prefixes -mcpu= -m";; esac +else + flag_prefixes="-march= -mcpu= -m" +fi +for flag_prefix in $flag_prefixes; do + for arch in $ax_gcc_arch; do + flag="$flag_prefix$arch" + AX_CHECK_COMPILE_FLAG($flag, [if test "x$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor" = xclang; then + if test "x[]m4_default([$1],yes)" = xyes; then + if test "x$flag" = "x-march=$arch"; then flag=-mtune=$arch; fi + fi + fi; ax_cv_gcc_archflag=$flag; break]) + done + test "x$ax_cv_gcc_archflag" = xunknown || break +done +fi + +fi # $GCC=yes +]) +AC_MSG_CHECKING([for gcc architecture flag]) +AC_MSG_RESULT($ax_cv_gcc_archflag) +if test "x$ax_cv_gcc_archflag" = xunknown; then + m4_default([$3],:) +else + m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"]) +fi +]) diff --git a/ImageMagick-6.9.12-44/m4/ax_gcc_x86_cpuid.m4 b/ImageMagick-6.9.12-44/m4/ax_gcc_x86_cpuid.m4 new file mode 100644 index 0000000..df95465 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_gcc_x86_cpuid.m4 @@ -0,0 +1,89 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_GCC_X86_CPUID(OP) +# AX_GCC_X86_CPUID_COUNT(OP, COUNT) +# +# DESCRIPTION +# +# On Pentium and later x86 processors, with gcc or a compiler that has a +# compatible syntax for inline assembly instructions, run a small program +# that executes the cpuid instruction with input OP. This can be used to +# detect the CPU type. AX_GCC_X86_CPUID_COUNT takes an additional COUNT +# parameter that gets passed into register ECX before calling cpuid. +# +# On output, the values of the eax, ebx, ecx, and edx registers are stored +# as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable +# ax_cv_gcc_x86_cpuid_OP. +# +# If the cpuid instruction fails (because you are running a +# cross-compiler, or because you are not using gcc, or because you are on +# a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP +# is set to the string "unknown". +# +# This macro mainly exists to be used in AX_GCC_ARCHFLAG. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2008 Matteo Frigo +# Copyright (c) 2015 Michael Petch +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 10 + +AC_DEFUN([AX_GCC_X86_CPUID], +[AX_GCC_X86_CPUID_COUNT($1, 0) +]) + +AC_DEFUN([AX_GCC_X86_CPUID_COUNT], +[AC_REQUIRE([AC_PROG_CC]) +AC_LANG_PUSH([C]) +AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1, + [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include ], [ + int op = $1, level = $2, eax, ebx, ecx, edx; + FILE *f; + __asm__ __volatile__ ("xchg %%ebx, %1\n" + "cpuid\n" + "xchg %%ebx, %1\n" + : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op), "2" (level)); + + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; +])], + [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid], + [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid], + [ax_cv_gcc_x86_cpuid_$1=unknown])]) +AC_LANG_POP([C]) +]) diff --git a/ImageMagick-6.9.12-44/m4/ax_have_opencl.m4 b/ImageMagick-6.9.12-44/m4/ax_have_opencl.m4 new file mode 100644 index 0000000..af42d2e --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_have_opencl.m4 @@ -0,0 +1,149 @@ +# -*- mode: autoconf -*- +# +# AX_HAVE_OPENCL +# +# Check for an OpenCL implementation. If CL is found, HAVE_OPENCL is defined +# and the required CPP and linker flags are included in the output variables +# "CL_CPPFLAGS" and "CL_LIBS", respectively. If no usable CL implementation is +# found then "no_cl" is set to "yes" (otherwise it is set to "no"). +# +# If the header is found, "HAVE_CL_OPENCL_H" is defined. If the +# header is found, HAVE_OPENCL_OPENCL_H is defined. These +# preprocessor definitions may not be mutually exclusive. +# +# This macro first checks /usr/include and /usr/lib for OpenCL support; if it is not +# found in those locations, then it checks in the standard installation locations +# for AMD's (/opt/AMDAPP) and NVIDIA's (/usr/local/cuda) SDKs. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception, the you may copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts. +# +AC_DEFUN([AX_HAVE_OPENCL], +[dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_ARG_ENABLE([opencl], + [AS_HELP_STRING([--enable-opencl], + [use OpenCL])], + [enable_opencl=$enableval], + [enable_opencl='no']) + if test x"$enable_opencl" != xno ; then + CPPFLAGS_CL="" + AC_CHECK_HEADERS([CL/cl.h OpenCL/cl.h], [HAVE_CL_H="yes"; break], [HAVE_CL_H="no"]) + if test x"$HAVE_CL_H" = xno ; then + # check for AMD's SDK + AC_MSG_CHECKING([for AMD's SDK cl.h]) + if test -d /opt/AMDAPP/include/CL ; then + HAVE_CL_H="yes" + AC_DEFINE([HAVE_CL_CL_H]) + CPPFLAGS_CL="-I/opt/AMDAPP/include" + fi + AC_MSG_RESULT([$HAVE_CL_H]) + fi + if test x"$HAVE_CL_H" = xno ; then + # check for NVIDIA's SDK + AC_MSG_CHECKING([for NVIDIA's SDK cl.h]) + if test -d /usr/local/cuda/include/CL ; then + HAVE_CL_H="yes" + AC_DEFINE([HAVE_CL_CL_H]) + CPPFLAGS_CL="-I/usr/local/cuda/include" + elif test -d /usr/local/cuda-6.5/include/CL ; then + HAVE_CL_H="yes" + AC_DEFINE([HAVE_CL_CL_H]) + CPPFLAGS_CL="-I/usr/local/cuda-6.5/include" + elif test -d /usr/local/cuda-6.0/include/CL ; then + HAVE_CL_H="yes" + AC_DEFINE([HAVE_CL_CL_H]) + CPPFLAGS_CL="-I/usr/local/cuda-6.0/include" + elif test -d /usr/local/cuda-5.5/include/CL ; then + HAVE_CL_H="yes" + AC_DEFINE([HAVE_CL_CL_H]) + CPPFLAGS_CL="-I/usr/local/cuda-5.5/include" + fi + AC_MSG_RESULT([$HAVE_CL_H]) + fi + if test x"$HAVE_CL_H" = xno ; then + no_cl=yes + AC_MSG_WARN([no OpenCL headers found]) + CL_ENABLED=false + CL_VERSION=0 + else + # + # First we check for Mac OS X, since OpenCL is standard there + # + LIBS_CL="none" + AC_MSG_CHECKING([for OpenCL library]) + case "$host_os" in + darwin*) # On Mac OS X we check for installed frameworks + AX_CHECK_FRAMEWORK([OpenCL], [ + LIBS_CL="-framework OpenCL" + no_cl=no + AC_MSG_RESULT(yes) + CL_ENABLED=true + CL_VERSION=1 + ] + , + [ + no_cl=yes + AC_MSG_RESULT(no) + CL_ENABLED=false + CL_VERSION=0 + ]) + ;; + *) + save_LIBS=$LIBS + save_CFLAGS=$CFLAGS + CFLAGS=$CPPFLAGS_CL + LIBS="$save_LIBS -L/usr/lib64/nvidia -L/usr/lib/nvidia -lOpenCL" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([ + #ifdef HAVE_OPENCL_CL_H + #include + #elif defined(HAVE_CL_CL_H) + #include + #endif + #include + ],[ + clGetPlatformIDs(0, NULL, NULL); + ])],[ + no_cl=no + AC_MSG_RESULT(yes) + CL_ENABLED=true + CL_VERSION=1 + LIBS_CL="$save_LIBS -L/usr/lib64/nvidia -L/usr/lib/nvidia -lOpenCL" + ],[ + no_cl=yes + AC_MSG_RESULT(no) + CL_ENABLED=false + CL_VERSION=0 + ]) + + LIBS=$save_LIBS + CFLAGS=$save_CFLAGS + ;; + esac + fi + else + no_cl=yes + AC_MSG_CHECKING([for OpenCL library]) + AC_MSG_RESULT(disabled) + CL_ENABLED=false + CL_VERSION=0 + fi +]) diff --git a/ImageMagick-6.9.12-44/m4/ax_prefix_config_h.m4 b/ImageMagick-6.9.12-44/m4/ax_prefix_config_h.m4 new file mode 100644 index 0000000..22acbac --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_prefix_config_h.m4 @@ -0,0 +1,203 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_prefix_config_h.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PREFIX_CONFIG_H [(OUTPUT-HEADER [,PREFIX [,ORIG-HEADER]])] +# +# DESCRIPTION +# +# Generate an installable config.h. +# +# A package should not normally install its config.h as a system header, +# but if it must, this macro can be used to avoid namespace pollution by +# making a copy of config.h with a prefix added to all the macro names. +# +# Each "#define SOMEDEF" line of the configuration header has the given +# prefix added, in the same case as the first character of the macro name. +# +# Defaults: +# +# OUTPUT-HEADER = $PACKAGE-config.h +# PREFIX = $PACKAGE +# ORIG-HEADER, from AM_CONFIG_HEADER(config.h) +# +# Your configure.ac script should contain both macros in this order. +# +# Example: +# +# AC_INIT(config.h.in) # config.h.in as created by "autoheader" +# AM_INIT_AUTOMAKE(testpkg, 0.1.1) # makes #undef VERSION and PACKAGE +# AM_CONFIG_HEADER(config.h) # prep config.h from config.h.in +# AX_PREFIX_CONFIG_H(mylib/_config.h) # prep mylib/_config.h from it.. +# AC_MEMORY_H # makes "#undef NEED_MEMORY_H" +# AC_C_CONST_H # makes "#undef const" +# AC_OUTPUT(Makefile) # creates the "config.h" now +# # and also mylib/_config.h +# +# If the argument to AX_PREFIX_CONFIG_H would have been omitted then the +# default output file would have been called simply "testpkg-config.h", +# but even under the name "mylib/_config.h" it contains prefix-defines +# like +# +# #ifndef TESTPKG_VERSION +# #define TESTPKG_VERSION "0.1.1" +# #endif +# #ifndef TESTPKG_NEED_MEMORY_H +# #define TESTPKG_NEED_MEMORY_H 1 +# #endif +# #ifndef _testpkg_const +# #define _testpkg_const _const +# #endif +# +# and this "mylib/_config.h" can be installed along with other header +# files, which is most convenient when creating a shared library (that has +# some headers) whose functionality depends on features detected at +# compile-time. No need to invent some "mylib-confdefs.h.in" manually. +# +# Note that some AC_DEFINEs that end up in the config.h file are actually +# self-referential - e.g. AC_C_INLINE, AC_C_CONST, and the AC_TYPE_OFF_T +# say that they "will define inline|const|off_t if the system does not do +# it by itself". You might want to clean up about these - consider an +# extra mylib/conf.h that reads something like: +# +# #include +# #ifndef _testpkg_const +# #define _testpkg_const const +# #endif +# +# and then start using _testpkg_const in the header files. That is also a +# good thing to differentiate whether some library-user has starting to +# take up with a different compiler, so perhaps it could read something +# like this: +# +# #ifdef _MSC_VER +# #include +# #else +# #include +# #endif +# #ifndef _testpkg_const +# #define _testpkg_const const +# #endif +# +# LICENSE +# +# Copyright (c) 2014 Reuben Thomas +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2008 Marten Svantesson +# Copyright (c) 2008 Gerald Point +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 16 + +AC_DEFUN([AX_PREFIX_CONFIG_H],[dnl +AC_PREREQ([2.62]) +AC_BEFORE([AC_CONFIG_HEADERS],[$0])dnl +AC_CONFIG_COMMANDS(m4_default([$1], [$PACKAGE-config.h]),[dnl +AS_VAR_PUSHDEF([_OUT],[ac_prefix_conf_OUT])dnl +AS_VAR_PUSHDEF([_DEF],[ac_prefix_conf_DEF])dnl +AS_VAR_PUSHDEF([_PKG],[ac_prefix_conf_PKG])dnl +AS_VAR_PUSHDEF([_LOW],[ac_prefix_conf_LOW])dnl +AS_VAR_PUSHDEF([_UPP],[ac_prefix_conf_UPP])dnl +AS_VAR_PUSHDEF([_INP],[ac_prefix_conf_INP])dnl +m4_pushdef([_script],[conftest.prefix])dnl +m4_pushdef([_symbol],[m4_cr_Letters[]m4_cr_digits[]_])dnl +_OUT=`echo m4_default([$1], [$PACKAGE-config.h])` +_DEF=`echo _$_OUT | sed -e "y:m4_cr_letters:m4_cr_LETTERS[]:" -e "s/@<:@^m4_cr_Letters@:>@/_/g"` +_PKG=`echo m4_default([$2], [$PACKAGE])` +_LOW=`echo _$_PKG | sed -e "y:m4_cr_LETTERS-:m4_cr_letters[]_:"` +_UPP=`echo $_PKG | sed -e "y:m4_cr_letters-:m4_cr_LETTERS[]_:" -e "/^@<:@m4_cr_digits@:>@/s/^/_/"` +_INP=`echo "$3" | sed -e 's/ *//'` +if test ".$_INP" = "."; then + for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue + case "$ac_file" in + *.h) _INP=$ac_file ;; + *) + esac + test ".$_INP" != "." && break + done +fi +if test ".$_INP" = "."; then + case "$_OUT" in + */*) _INP=`basename "$_OUT"` + ;; + *-*) _INP=`echo "$_OUT" | sed -e "s/@<:@_symbol@:>@*-//"` + ;; + *) _INP=config.h + ;; + esac +fi +if test -z "$_PKG" ; then + AC_MSG_ERROR([no prefix for _PREFIX_PKG_CONFIG_H]) +else + if test ! -f "$_INP" ; then if test -f "$srcdir/$_INP" ; then + _INP="$srcdir/$_INP" + fi fi + AC_MSG_NOTICE(creating $_OUT - prefix $_UPP for $_INP defines) + if test -f $_INP ; then + AS_ECHO(["s/^@%:@undef *\\(@<:@m4_cr_LETTERS[]_@:>@\\)/@%:@undef $_UPP""_\\1/"]) > _script + AS_ECHO(["s/^@%:@undef *\\(@<:@m4_cr_letters@:>@\\)/@%:@undef $_LOW""_\\1/"]) >> _script + AS_ECHO(["s/^@%:@def[]ine *\\(@<:@m4_cr_LETTERS[]_@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_UPP""_\\1\\"]) >> _script + AS_ECHO(["@%:@def[]ine $_UPP""_\\1\\2\\"]) >> _script + AS_ECHO(["@%:@endif/"]) >> _script + AS_ECHO(["s/^@%:@def[]ine *\\(@<:@m4_cr_letters@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_LOW""_\\1\\"]) >> _script + AS_ECHO(["@%:@define $_LOW""_\\1\\2\\"]) >> _script + AS_ECHO(["@%:@endif/"]) >> _script + # now executing _script on _DEF input to create _OUT output file + echo "@%:@ifndef $_DEF" >$tmp/pconfig.h + echo "@%:@def[]ine $_DEF 1" >>$tmp/pconfig.h + echo ' ' >>$tmp/pconfig.h + echo /'*' $_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h + + sed -f _script $_INP >>$tmp/pconfig.h + echo ' ' >>$tmp/pconfig.h + echo '/* once:' $_DEF '*/' >>$tmp/pconfig.h + echo "@%:@endif" >>$tmp/pconfig.h + if cmp -s $_OUT $tmp/pconfig.h 2>/dev/null; then + AC_MSG_NOTICE([$_OUT is unchanged]) + else + ac_dir=`AS_DIRNAME(["$_OUT"])` + AS_MKDIR_P(["$ac_dir"]) + rm -f "$_OUT" + mv $tmp/pconfig.h "$_OUT" + fi + else + AC_MSG_ERROR([input file $_INP does not exist - skip generating $_OUT]) + fi + rm -f conftest.* +fi +m4_popdef([_symbol])dnl +m4_popdef([_script])dnl +AS_VAR_POPDEF([_INP])dnl +AS_VAR_POPDEF([_UPP])dnl +AS_VAR_POPDEF([_LOW])dnl +AS_VAR_POPDEF([_PKG])dnl +AS_VAR_POPDEF([_DEF])dnl +AS_VAR_POPDEF([_OUT])dnl +],[PACKAGE="$PACKAGE"])]) diff --git a/ImageMagick-6.9.12-44/m4/ax_prepend_flag.m4 b/ImageMagick-6.9.12-44/m4/ax_prepend_flag.m4 new file mode 100644 index 0000000..adac8c5 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_prepend_flag.m4 @@ -0,0 +1,51 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_prepend_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PREPEND_FLAG(FLAG, [FLAGS-VARIABLE]) +# +# DESCRIPTION +# +# FLAG is added to the front of the FLAGS-VARIABLE shell variable, with a +# space added in between. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains +# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly +# FLAG. +# +# NOTE: Implementation based on AX_APPEND_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# Copyright (c) 2018 John Zaitseff +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 2 + +AC_DEFUN([AX_PREPEND_FLAG], +[dnl +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) +AS_VAR_SET_IF(FLAGS,[ + AS_CASE([" AS_VAR_GET(FLAGS) "], + [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], + [ + FLAGS="$1 $FLAGS" + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) + ], + [ + AS_VAR_SET(FLAGS,[$1]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) +AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_PREPEND_FLAG diff --git a/ImageMagick-6.9.12-44/m4/ax_prog_perl_version.m4 b/ImageMagick-6.9.12-44/m4/ax_prog_perl_version.m4 new file mode 100644 index 0000000..46a8a4e --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_prog_perl_version.m4 @@ -0,0 +1,70 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_prog_perl_version.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_PERL_VERSION([VERSION],[ACTION-IF-TRUE],[ACTION-IF-FALSE]) +# +# DESCRIPTION +# +# Makes sure that perl supports the version indicated. If true the shell +# commands in ACTION-IF-TRUE are executed. If not the shell commands in +# ACTION-IF-FALSE are run. Note if $PERL is not set (for example by +# running AC_CHECK_PROG or AC_PATH_PROG) the macro will fail. +# +# Example: +# +# AC_PATH_PROG([PERL],[perl]) +# AX_PROG_PERL_VERSION([5.8.0],[ ... ],[ ... ]) +# +# This will check to make sure that the perl you have supports at least +# version 5.8.0. +# +# NOTE: This macro uses the $PERL variable to perform the check. +# AX_WITH_PERL can be used to set that variable prior to running this +# macro. The $PERL_VERSION variable will be valorized with the detected +# version. +# +# LICENSE +# +# Copyright (c) 2009 Francesco Salvestrini +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 13 + +AC_DEFUN([AX_PROG_PERL_VERSION],[ + AC_REQUIRE([AC_PROG_SED]) + AC_REQUIRE([AC_PROG_GREP]) + + AS_IF([test -n "$PERL"],[ + ax_perl_version="$1" + + AC_MSG_CHECKING([for perl version]) + changequote(<<,>>) + perl_version=`$PERL --version 2>&1 \ + | $SED -n -e '/This is perl/b inspect +b +: inspect +s/.* (\{0,1\}v\([0-9]*\.[0-9]*\.[0-9]*\))\{0,1\} .*/\1/;p'` + changequote([,]) + AC_MSG_RESULT($perl_version) + + AC_SUBST([PERL_VERSION],[$perl_version]) + + AX_COMPARE_VERSION([$ax_perl_version],[le],[$perl_version],[ + : + $2 + ],[ + : + $3 + ]) + ],[ + AC_MSG_WARN([could not find the perl interpreter]) + $3 + ]) +]) diff --git a/ImageMagick-6.9.12-44/m4/ax_pthread.m4 b/ImageMagick-6.9.12-44/m4/ax_pthread.m4 new file mode 100644 index 0000000..1598d07 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_pthread.m4 @@ -0,0 +1,507 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). (This +# is necessary on AIX to use the special cc_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also to link with them as well. For example, you might link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threaded programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# Updated for Autoconf 2.68 by Daniel Richard G. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. +# Copyright (c) 2019 Marc Stevens +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 27 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_SED]) +AC_LANG_PUSH([C]) +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) + AC_MSG_RESULT([$ax_pthread_ok]) + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], + [ +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + ], + [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" + ;; +esac + +# Are we compiling with Clang? + +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + ], + [ax_cv_PTHREAD_CLANG=yes]) + fi + ]) +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +AS_IF([test "x$GCC" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +AS_IF([test "x$ax_pthread_clang" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread"]) + + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +AS_IF([test "x$ax_pthread_check_macro" = "x--"], + [ax_pthread_check_cond=0], + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) + + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; }], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */])], + [ax_pthread_ok=yes], + []) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + AC_MSG_RESULT([$ax_pthread_ok]) + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [ac_link="$ax_pthread_2step_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [break]) + ]) + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + ]) + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + + + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_CACHE_CHECK([for joinable pthread attribute], + [ax_cv_PTHREAD_JOINABLE_ATTR], + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $ax_pthread_attr; return attr /* ; */])], + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], + []) + done + ]) + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"], + [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], + [$ax_cv_PTHREAD_JOINABLE_ATTR], + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + ax_pthread_joinable_attr_defined=yes + ]) + + AC_CACHE_CHECK([whether more special flags are required for pthreads], + [ax_cv_PTHREAD_SPECIAL_FLAGS], + [ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ]) + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"], + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes]) + + AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + [ax_cv_PTHREAD_PRIO_INHERIT], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT; + return i;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) + ]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"], + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) + ax_pthread_prio_inherit_defined=yes + ]) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + AS_CASE(["x/$CC"], + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], + [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + +AC_SUBST([PTHREAD_LIBS]) +AC_SUBST([PTHREAD_CFLAGS]) +AC_SUBST([PTHREAD_CC]) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_POP +])dnl AX_PTHREAD diff --git a/ImageMagick-6.9.12-44/m4/ax_require_defined.m4 b/ImageMagick-6.9.12-44/m4/ax_require_defined.m4 new file mode 100644 index 0000000..17c3eab --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ax_require_defined.m4 @@ -0,0 +1,37 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_require_defined.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_REQUIRE_DEFINED(MACRO) +# +# DESCRIPTION +# +# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have +# been defined and thus are available for use. This avoids random issues +# where a macro isn't expanded. Instead the configure script emits a +# non-fatal: +# +# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found +# +# It's like AC_REQUIRE except it doesn't expand the required macro. +# +# Here's an example: +# +# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) +# +# LICENSE +# +# Copyright (c) 2014 Mike Frysinger +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 2 + +AC_DEFUN([AX_REQUIRE_DEFINED], [dnl + m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) +])dnl AX_REQUIRE_DEFINED diff --git a/ImageMagick-6.9.12-44/m4/cxx_have_std_libs.m4 b/ImageMagick-6.9.12-44/m4/cxx_have_std_libs.m4 new file mode 100644 index 0000000..cfdbfdb --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/cxx_have_std_libs.m4 @@ -0,0 +1,32 @@ +dnl @synopsis AC_CXX_HAVE_STD_LIBS +dnl +dnl If the compiler supports ISO C++ standard library (i.e., can +dnl include the files iostream, map, iomanip and cmath}), define +dnl HAVE_STD_LIBS. +dnl +dnl @category Cxx +dnl @author Todd Veldhuizen +dnl @author Luc Maisonobe +dnl @version 2004-02-04 +dnl @license AllPermissive + +AC_DEFUN([AC_CXX_HAVE_STD_LIBS], +[AC_CACHE_CHECK(whether the compiler supports ISO C++ standard library, +ac_cv_cxx_have_std_libs, +[AC_REQUIRE([AX_CXX_NAMESPACES]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include +#include +#include +#include +#ifdef HAVE_NAMESPACES +using namespace std; +#endif],[return 0;], + ac_cv_cxx_have_std_libs=yes, ac_cv_cxx_have_std_libs=no) + AC_LANG_RESTORE +]) +if test "$ac_cv_cxx_have_std_libs" = yes; then + AC_DEFINE(HAVE_STD_LIBS,,[define if the compiler supports ISO C++ standard library]) +fi +]) diff --git a/ImageMagick-6.9.12-44/m4/framework.m4 b/ImageMagick-6.9.12-44/m4/framework.m4 new file mode 100644 index 0000000..cacf8c5 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/framework.m4 @@ -0,0 +1,217 @@ +# http://svn.saurik.com/repos/cycript/trunk/framework.m4 +# +# GNU LESSER GENERAL PUBLIC LICENSE +# Version 3, 29 June 2007 +# +# Copyright (C) 2007 Free Software Foundation, Inc. +# Everyone is permitted to copy and distribute verbatim copies +# of this license document, but changing it is not allowed. +# +# +# This version of the GNU Lesser General Public License incorporates +# the terms and conditions of version 3 of the GNU General Public +# License, supplemented by the additional permissions listed below. +# +# 0. Additional Definitions. +# +# As used herein, "this License" refers to version 3 of the GNU Lesser +# General Public License, and the "GNU GPL" refers to version 3 of the GNU +# General Public License. +# +# "The Library" refers to a covered work governed by this License, +# other than an Application or a Combined Work as defined below. +# +# An "Application" is any work that makes use of an interface provided +# by the Library, but which is not otherwise based on the Library. +# Defining a subclass of a class defined by the Library is deemed a mode +# of using an interface provided by the Library. +# +# A "Combined Work" is a work produced by combining or linking an +# Application with the Library. The particular version of the Library +# with which the Combined Work was made is also called the "Linked +# Version". +# +# The "Minimal Corresponding Source" for a Combined Work means the +# Corresponding Source for the Combined Work, excluding any source code +# for portions of the Combined Work that, considered in isolation, are +# based on the Application, and not on the Linked Version. +# +# The "Corresponding Application Code" for a Combined Work means the +# object code and/or source code for the Application, including any data +# and utility programs needed for reproducing the Combined Work from the +# Application, but excluding the System Libraries of the Combined Work. +# +# 1. Exception to Section 3 of the GNU GPL. +# +# You may convey a covered work under sections 3 and 4 of this License +# without being bound by section 3 of the GNU GPL. +# +# 2. Conveying Modified Versions. +# +# If you modify a copy of the Library, and, in your modifications, a +# facility refers to a function or data to be supplied by an Application +# that uses the facility (other than as an argument passed when the +# facility is invoked), then you may convey a copy of the modified +# version: +# +# a) under this License, provided that you make a good faith effort to +# ensure that, in the event an Application does not supply the +# function or data, the facility still operates, and performs +# whatever part of its purpose remains meaningful, or +# +# b) under the GNU GPL, with none of the additional permissions of +# this License applicable to that copy. +# +# 3. Object Code Incorporating Material from Library Header Files. +# +# The object code form of an Application may incorporate material from +# a header file that is part of the Library. You may convey such object +# code under terms of your choice, provided that, if the incorporated +# material is not limited to numerical parameters, data structure +# layouts and accessors, or small macros, inline functions and templates +# (ten or fewer lines in length), you do both of the following: +# +# a) Give prominent notice with each copy of the object code that the +# Library is used in it and that the Library and its use are +# covered by this License. +# +# b) Accompany the object code with a copy of the GNU GPL and this license +# document. +# +# 4. Combined Works. +# +# You may convey a Combined Work under terms of your choice that, +# taken together, effectively do not restrict modification of the +# portions of the Library contained in the Combined Work and reverse +# engineering for debugging such modifications, if you also do each of +# the following: +# +# a) Give prominent notice with each copy of the Combined Work that +# the Library is used in it and that the Library and its use are +# covered by this License. +# +# b) Accompany the Combined Work with a copy of the GNU GPL and this license +# document. +# +# c) For a Combined Work that displays copyright notices during +# execution, include the copyright notice for the Library among +# these notices, as well as a reference directing the user to the +# copies of the GNU GPL and this license document. +# +# d) Do one of the following: +# +# 0) Convey the Minimal Corresponding Source under the terms of this +# License, and the Corresponding Application Code in a form +# suitable for, and under terms that permit, the user to +# recombine or relink the Application with a modified version of +# the Linked Version to produce a modified Combined Work, in the +# manner specified by section 6 of the GNU GPL for conveying +# Corresponding Source. +# +# 1) Use a suitable shared library mechanism for linking with the +# Library. A suitable mechanism is one that (a) uses at run time +# a copy of the Library already present on the user's computer +# system, and (b) will operate properly with a modified version +# of the Library that is interface-compatible with the Linked +# Version. +# +# e) Provide Installation Information, but only if you would otherwise +# be required to provide such information under section 6 of the +# GNU GPL, and only to the extent that such information is +# necessary to install and execute a modified version of the +# Combined Work produced by recombining or relinking the +# Application with a modified version of the Linked Version. (If +# you use option 4d0, the Installation Information must accompany +# the Minimal Corresponding Source and Corresponding Application +# Code. If you use option 4d1, you must provide the Installation +# Information in the manner specified by section 6 of the GNU GPL +# for conveying Corresponding Source.) +# +# 5. Combined Libraries. +# +# You may place library facilities that are a work based on the +# Library side by side in a single library together with other library +# facilities that are not Applications and are not covered by this +# License, and convey such a combined library under terms of your +# choice, if you do both of the following: +# +# a) Accompany the combined library with a copy of the same work based +# on the Library, uncombined with any other library facilities, +# conveyed under the terms of this License. +# +# b) Give prominent notice with the combined library that part of it +# is a work based on the Library, and explaining where to find the +# accompanying uncombined form of the same work. +# +# 6. Revised Versions of the GNU Lesser General Public License. +# +# The Free Software Foundation may publish revised and/or new versions +# of the GNU Lesser General Public License from time to time. Such new +# versions will be similar in spirit to the present version, but may +# differ in detail to address new problems or concerns. +# +# Each version is given a distinguishing version number. If the +# Library as you received it specifies that a certain numbered version +# of the GNU Lesser General Public License "or any later version" +# applies to it, you have the option of following the terms and +# conditions either of that published version or of any later version +# published by the Free Software Foundation. If the Library as you +# received it does not specify a version number of the GNU Lesser +# General Public License, you may choose any version of the GNU Lesser +# General Public License ever published by the Free Software Foundation. +# +# If the Library as you received it specifies that a proxy can decide +# whether future versions of the GNU Lesser General Public License shall +# apply, that proxy's public statement of acceptance of any version is +# permanent authorization for you to choose that version for the +# Library. + +# AC_CHECK_FRAMEWORK(FRAMEWORK, FUNCTION, +# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], +# [OTHER-LIBRARIES]) +# ------------------------------------------------------ +# +# Use a cache variable name containing both the framework and function name, +# because the test really is for framework $1 defining function $2, not +# just for framework $1. Separate tests with the same $1 and different $2s +# may have different results. +# +# Note that using directly AS_VAR_PUSHDEF([ac_Framework], [ac_cv_framework_$1_$2]) +# is asking for troubles, since AC_CHECK_FRAMEWORK($framework, fun) would give +# ac_cv_framework_$framework_fun, which is definitely not what was meant. Hence +# the AS_LITERAL_IF indirection. +# +# FIXME: This macro is extremely suspicious. It DEFINEs unconditionally, +# whatever the FUNCTION, in addition to not being a *S macro. Note +# that the cache does depend upon the function we are looking for. +# +# It is on purpose we used `ac_check_framework_save_LIBS' and not just +# `ac_save_LIBS': there are many macros which don't want to see `LIBS' +# changed but still want to use AC_CHECK_FRAMEWORK, so they save `LIBS'. +# And ``ac_save_LIBS' is too tempting a name, so let's leave them some +# freedom. +AC_DEFUN([AC_CHECK_FRAMEWORK], +[m4_ifval([$3], , [AH_CHECK_FRAMEWORK([$1])])dnl +AS_LITERAL_IF([$1], + [AS_VAR_PUSHDEF([ac_Framework], [ac_cv_framework_$1_$2])], + [AS_VAR_PUSHDEF([ac_Framework], [ac_cv_framework_$1''_$2])])dnl +AC_CACHE_CHECK([for $2 in $1 framework], ac_Framework, +[ac_check_framework_save_LIBS=$LIBS +LIBS="-framework $1 $5 $LIBS" +AC_LINK_IFELSE([AC_LANG_CALL([], [$2])], + [AS_VAR_SET(ac_Framework, yes)], + [AS_VAR_SET(ac_Framework, no)]) +LIBS=$ac_check_framework_save_LIBS]) +AS_IF([test AS_VAR_GET(ac_Framework) = yes], + [m4_default([$3], [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FRAMEWORK_$1)) + LIBS="-framework $1 $LIBS" +])], + [$4])dnl +AS_VAR_POPDEF([ac_Framework])dnl +])# AC_CHECK_FRAMEWORK + +# AH_CHECK_FRAMEWORK(FRAMEWORK) +# --------------------- +m4_define([AH_CHECK_FRAMEWORK], +[AH_TEMPLATE(AS_TR_CPP(HAVE_FRAMEWORK_$1), + [Define to 1 if you have the `]$1[' framework (-framework ]$1[).])]) diff --git a/ImageMagick-6.9.12-44/m4/ld-version-script.m4 b/ImageMagick-6.9.12-44/m4/ld-version-script.m4 new file mode 100644 index 0000000..211d67b --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ld-version-script.m4 @@ -0,0 +1,48 @@ +# ld-version-script.m4 serial 4 +dnl Copyright (C) 2008-2015 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Simon Josefsson + +# FIXME: The test below returns a false positive for mingw +# cross-compiles, 'local:' statements does not reduce number of +# exported symbols in a DLL. Use --disable-ld-version-script to work +# around the problem. + +# gl_LD_VERSION_SCRIPT +# -------------------- +# Check if LD supports linker scripts, and define automake conditional +# HAVE_LD_VERSION_SCRIPT if so. +AC_DEFUN([gl_LD_VERSION_SCRIPT], +[ + AC_ARG_ENABLE([ld-version-script], + [AS_HELP_STRING([--enable-ld-version-script], + [enable linker version script (default is enabled when possible)])], + [have_ld_version_script=$enableval], + [AC_CACHE_CHECK([if LD -Wl,--version-script works], + [gl_cv_sys_ld_version_script], + [gl_cv_sys_ld_version_script=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" + echo foo >conftest.map + AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], + [], + [cat > conftest.map <. +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/ImageMagick-6.9.12-44/m4/ltoptions.m4 b/ImageMagick-6.9.12-44/m4/ltoptions.m4 new file mode 100644 index 0000000..94b0829 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/ImageMagick-6.9.12-44/m4/ltsugar.m4 b/ImageMagick-6.9.12-44/m4/ltsugar.m4 new file mode 100644 index 0000000..48bc934 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/ImageMagick-6.9.12-44/m4/ltversion.m4 b/ImageMagick-6.9.12-44/m4/ltversion.m4 new file mode 100644 index 0000000..fa04b52 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/ImageMagick-6.9.12-44/m4/lt~obsolete.m4 b/ImageMagick-6.9.12-44/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c6b26f8 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/ImageMagick-6.9.12-44/m4/pkg.m4 b/ImageMagick-6.9.12-44/m4/pkg.m4 new file mode 100644 index 0000000..13a8890 --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/pkg.m4 @@ -0,0 +1,275 @@ +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 12 (pkg-config-0.29.2) + +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.2]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $2]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR diff --git a/ImageMagick-6.9.12-44/m4/version.m4 b/ImageMagick-6.9.12-44/m4/version.m4 new file mode 100644 index 0000000..6f4798f --- /dev/null +++ b/ImageMagick-6.9.12-44/m4/version.m4 @@ -0,0 +1,60 @@ +# Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Given a version number MAJOR.MINOR.MICRO-PATCH, increment the: +# +# 1. MAJOR version for incompatible API changes, +# 2. MINOR version when MICRO version exceeds 15 e.g. 0x60F becomes 0x610 +# 3. MICRO version for added functionality in backwards compatible +# manner, and +# 4. PATCH version when you make backwards compatible bug fixes. +# +# Additional labels for pre-release and build metadata are available as +# extensions to the MAJOR.MINOR.MICRO-PATCH format. +# +m4_define([magick_name], [ImageMagick]) +m4_define([magick_major_version], [6]) +m4_define([magick_minor_version], [9]) +m4_define([magick_micro_version], [12]) +m4_define([magick_patchlevel_version], [44]) +m4_define([magick_base_version], + [magick_major_version.magick_minor_version.magick_micro_version]) +m4_define([magick_version], + [magick_base_version-magick_patchlevel_version]) +m4_define([magick_bugreport], + [https://github.com/ImageMagick/ImageMagick6/issues]) +m4_define([magick_url], [https://legacy.imagemagick.org]) +m4_define([magick_lib_version], [0x69C]) +m4_define([magick_tarname],[ImageMagick]) + +# +# If the library source code has changed at all since the last update, +# increment revision (‘c:r:a’ becomes ‘c:r+1:a’). If any interfaces have been +# added, removed, or changed since the last update, increment current, and set +# revision to 0. If any interfaces have been added since the last public +# release, then increment age. If any interfaces have been removed or changed +# since the last public release, then set age to 0. +# +# PLEASE NOTE that doing a SO BUMP aka raising the CURRENT REVISION +# could be avoided using libversioning aka map files. You MUST change .map +# files if you raise these versions. +# +# Bump the minor release # whenever there is an SOVersion bump. +m4_define([magick_library_current], [7]) +m4_define([magick_library_revision], [0]) +m4_define([magick_library_age], [0]) + +m4_define([magickpp_library_current], [9]) +m4_define([magickpp_library_revision], [0]) +m4_define([magickpp_library_age], [0]) diff --git a/ImageMagick-6.9.12-44/magick.sh.in b/ImageMagick-6.9.12-44/magick.sh.in new file mode 100755 index 0000000..83e12ff --- /dev/null +++ b/ImageMagick-6.9.12-44/magick.sh.in @@ -0,0 +1,43 @@ +#!/bin/sh +# +# Copyright © 1999 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Convenience script to verify the ImageMagick build before you install. For +# example: +# +# magick.sh convert -size 640x480 gradient:black-yellow gradient.png + +top_srcdir='@abs_top_srcdir@' +top_builddir='@abs_top_builddir@' + +MAGICK_CODER_MODULE_PATH='@MAGICK_CODER_MODULE_PATH@' +MAGICK_CONFIGURE_SRC_PATH='@MAGICK_CONFIGURE_SRC_PATH@' +MAGICK_CONFIGURE_BUILD_PATH='@MAGICK_CONFIGURE_BUILD_PATH@' +MAGICK_FILTER_MODULE_PATH='@MAGICK_FILTER_MODULE_PATH@' +DIRSEP=':' + +PATH="${top_builddir}/utilities:${PATH}" + +if test -n "$VERBOSE" +then + echo "$@" +fi +env \ + LD_LIBRARY_PATH="${top_builddir}/magick/.libs:${top_builddir}/wand/.libs${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \ + MAGICK_CODER_MODULE_PATH="${MAGICK_CODER_MODULE_PATH}" \ + MAGICK_CONFIGURE_PATH="${MAGICK_CONFIGURE_BUILD_PATH}${DIRSEP}${MAGICK_CONFIGURE_SRC_PATH}" \ + MAGICK_FILTER_MODULE_PATH="${MAGICK_FILTER_MODULE_PATH}" \ + PATH="${PATH}" \ + "$@" diff --git a/ImageMagick-6.9.12-44/magick/ImageMagick.h b/ImageMagick-6.9.12-44/magick/ImageMagick.h new file mode 100644 index 0000000..b3a6442 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/ImageMagick.h @@ -0,0 +1,34 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Deprecated as of ImageMagick 6.2.3. + + MagickCore Application Programming Interface declarations. +*/ + +#ifndef MAGICKCORE_IMAGEMAGICK_DEPRECATED_H +#define MAGICKCORE_IMAGEMAGICK_DEPRECATED_H + +#include "magick/MagickCore.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/ImageMagick.pc.in b/ImageMagick-6.9.12-44/magick/ImageMagick.pc.in new file mode 100644 index 0000000..d9d1ca2 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/ImageMagick.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/ImageMagick-@MAGICK_MAJOR_VERSION@ +includearchdir=@INCLUDEARCH_DIR@/ImageMagick-@MAGICK_MAJOR_VERSION@ +libname=MagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + +Name: ImageMagick +Description: ImageMagick - convert, edit, and compose images (ABI @MAGICK_ABI_SUFFIX@) +URL: https://github.com/ImageMagick/ImageMagick6 +Version: @PACKAGE_BASE_VERSION@ +Cflags: -I${includearchdir} -I${includedir} @MAGICK_PCFLAGS@ +Libs: -L${libdir} -l${libname} +Libs.private: -L${libdir} -l${libname} @MAGICK_LIBS@ @MATH_LIBS@ diff --git a/ImageMagick-6.9.12-44/magick/Magick-config.1 b/ImageMagick-6.9.12-44/magick/Magick-config.1 new file mode 100644 index 0000000..346176d --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/Magick-config.1 @@ -0,0 +1,69 @@ +.ad l +.nh +.TH Magick-Config 1 "2 May 2002" "ImageMagick" +.SH NAME +Magick-config \- get information about the installed version of ImageMagick +.SH SYNOPSIS +.B Magick-config +.B [--cflags] +.B [--cppflags] +.B [--exec-prefix] +.B [--ldflags] +.B [--libs] +.B [--prefix] +.B [--version] +.SH DESCRIPTION +.B Magick-config +prints the compiler and linker flags required to compile and link programs +that use the +.BR ImageMagick +Application Programmer Interface. +.SH EXAMPLES +To print the version of the installed distribution of +.BR ImageMagick , +use: + +.nf + Magick-config \-\-version +.fi + +To compile a program that calls the +.BR ImageMagick +Application Programmer Interface, use: + +.nf + cc `Magick-config \-\-cflags \-\-cppflags \-\-ldflags \-\-libs` program.c +.fi + +.SH OPTIONS +.TP +.B \-\-cflags +Print the compiler flags that were used to compile +.BR libMagick . +.TP +.B \-\-cppflags +Print the preprocessor flags that are needed to find the +.B ImageMagick +C include files and defines to ensure that the ImageMagick data structures match between +your program and the installed libraries. +.TP +.B \-\-exec-prefix +Print the directory under which target specific binaries and executables are installed. +.TP +.B \-\-ldflags +Print the linker flags that are needed to link with the +.B ImageMagick +library. +.TP +.B \-\-libs +Print the linker flags that are needed to link a program with +.BR libMagick . +.TP +.B \-\-version +Print the version of the +.B ImageMagick +distribution to standard output. +.SH LICENSE +See http://imagemagick.org/script/license.php. +.SH AUTHORS +Cristy, ImageMagick Studio LLC diff --git a/ImageMagick-6.9.12-44/magick/Magick-config.in b/ImageMagick-6.9.12-44/magick/Magick-config.in new file mode 100644 index 0000000..e42a020 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/Magick-config.in @@ -0,0 +1,61 @@ +#!/bin/sh +# +# Configure options script for re-calling MagickCore compilation options +# required to use the MagickCore library. +# + +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +usage="\ +Usage: Magick-config [--cflags] [--cppflags] [--exec-prefix] [--ldflags] [--libs] [--prefix] [--version]" + +if test $# -eq 0; then + echo "${usage}" 1>&2 + echo "Example: gcc \`Magick-config --cflags --cppflags\` -o core core.c \`Magick-config --ldflags --libs\`" 1>&2 + exit 1 +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + case $1 in + --prefix=*) + prefix=$optarg + ;; + --prefix) + echo $prefix + ;; + --exec-prefix=*) + exec_prefix=$optarg + ;; + --exec-prefix) + echo $exec_prefix + ;; + --version) + echo '@PACKAGE_VERSION@ Q@QUANTUM_DEPTH@ @MAGICK_HDRI@' + ;; + --cflags) + @PKG_CONFIG@ --cflags MagickCore + ;; + --cxxflags) + @PKG_CONFIG@ --cflags MagickCore + ;; + --cppflags) + @PKG_CONFIG@ --cflags MagickCore + ;; + --ldflags) + @PKG_CONFIG@ --libs MagickCore + ;; + --libs) + @PKG_CONFIG@ --libs MagickCore + ;; + *) + echo "${usage}" 1>&2 + exit 1 + ;; + esac + shift +done diff --git a/ImageMagick-6.9.12-44/magick/MagickCore-config.1 b/ImageMagick-6.9.12-44/magick/MagickCore-config.1 new file mode 100644 index 0000000..71ce76d --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/MagickCore-config.1 @@ -0,0 +1,73 @@ +.Dd July 13, 2015 +.Dt MAGICKCORE-CONFIG 1 +.Os +.Sh NAME +.Nm MagickCore-config +.Nd get information about the installed version of ImageMagick +.Sh SYNOPSIS +.Nm MagickCore-config +.Op Fl -cflags +.Op Fl -cppflags +.Op Fl -exec-prefix +.Op Fl -ldflags +.Op Fl -libs +.Op Fl -prefix +.Op Fl -version +.Sh DESCRIPTION +The +.Nm MagickCore-config +utility prints the compiler and linker flags required +to compile and link programs that use the +.Nm ImageMagick "Core" +Application Programmer Interface. +.Pp +The following options are available: +.Bl -tag -width Fl +.It Fl -cppflags , -cflags , -cxxflags +Print the compiler flags that are needed to find the +.Xr ImageMagick 1 +C include files and defines to ensure that the ImageMagick data structures match between +your program and the installed libraries. +.It Fl -prefix , -exec-prefix +Print the directory under which target specific binaries and executables are installed. +.It Fl -ldflags , -libs +Print the linker flags that are needed to link with the +.Xr ImageMagick 1 +library. +.It Fl -version +Print the version of the +.Xr ImageMagick 1 +distribution to standard output. +.It Fl -coder-path +Print the path where the +.Xr ImageMagick 1 +coder modules are installed. +.It Fl -filter-path +Print the path where the +.Xr ImageMagick 1 +filter modules are installed. +.El +.Sh EXAMPLES +To print the version of the installed distribution of +.Nm ImageMagick +use: + +.Dl MagickCore-config --version +.sp +To compile a program that calls the +.Xr ImageMagick 1 +Application Programmer Interface, use: + +.Dl cc `MagickCore-config --cppflags --ldflags` program.c +.Sh SEE ALSO +.Xr ImageMagick 1 +.Sh LICENSE +.Nm ImageMagick +is licensed with a derived Apache license 2.0. See +http://imagemagick.org/script/license.php for more details. +.Sh AUTHORS +.An -nosplit +The +.Nm ImageMagick +suite and this manual page where written by +.An Cristy, ImageMagick Studio LLC . diff --git a/ImageMagick-6.9.12-44/magick/MagickCore-config.in b/ImageMagick-6.9.12-44/magick/MagickCore-config.in new file mode 100644 index 0000000..2e74c3b --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/MagickCore-config.in @@ -0,0 +1,61 @@ +#!/bin/sh +# +# Configure options script for re-calling MagickCore compilation options +# required to use the MagickCore library. +# + +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +usage="\ +Usage: MagickCore-config [--cflags] [--cppflags] [--exec-prefix] [--ldflags] [--libs] [--prefix] [--version]" + +if test $# -eq 0; then + echo "${usage}" 1>&2 + echo "Example: gcc \`MagickCore-config --cflags --cppflags\` -o core core.c \`Magick-config --ldflags --libs\`" 1>&2 + exit 1 +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + case $1 in + --prefix=*) + prefix=$optarg + ;; + --prefix) + echo $prefix + ;; + --exec-prefix=*) + exec_prefix=$optarg + ;; + --exec-prefix) + echo $exec_prefix + ;; + --version) + echo '@PACKAGE_VERSION@ Q@QUANTUM_DEPTH@ @MAGICK_HDRI@' + ;; + --cflags) + @PKG_CONFIG@ --cflags MagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --cxxflags) + @PKG_CONFIG@ --cflags MagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --cppflags) + @PKG_CONFIG@ --cflags MagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --ldflags) + @PKG_CONFIG@ --libs MagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --libs) + @PKG_CONFIG@ --libs MagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + *) + echo "${usage}" 1>&2 + exit 1 + ;; + esac + shift +done diff --git a/ImageMagick-6.9.12-44/magick/MagickCore.h b/ImageMagick-6.9.12-44/magick/MagickCore.h new file mode 100644 index 0000000..c4594dc --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/MagickCore.h @@ -0,0 +1,171 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore Application Programming Interface declarations. +*/ + +#ifndef MAGICKCORE_CORE_H +#define MAGICKCORE_CORE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if !defined(MAGICKCORE_CONFIG_H) +# define MAGICKCORE_CONFIG_H +# if !defined(vms) && !defined(macintosh) +# include "magick/magick-config.h" +# else +# include "magick-config.h" +# endif +#if defined(_magickcore_const) && !defined(const) +# define const _magickcore_const +#endif +#if defined(_magickcore_inline) && !defined(inline) +# define inline _magickcore_inline +#endif +#if !defined(magick_restrict) +# if !defined(_magickcore_restrict) +# define magick_restrict restrict +# else +# define magick_restrict _magickcore_restrict +# endif +#endif +# if defined(__cplusplus) || defined(c_plusplus) +# undef inline +# endif +#endif + +#define MAGICKCORE_CHECK_VERSION(major,minor,micro) \ + ((MAGICKCORE_MAJOR_VERSION > (major)) || \ + ((MAGICKCORE_MAJOR_VERSION == (major)) && \ + (MAGICKCORE_MINOR_VERSION > (minor))) || \ + ((MAGICKCORE_MAJOR_VERSION == (major)) && \ + (MAGICKCORE_MINOR_VERSION == (minor)) && \ + (MAGICKCORE_MICRO_VERSION >= (micro)))) + +#include +#include +#include +#include +#include +#include +#include + +#if defined(WIN32) || defined(WIN64) +# define MAGICKCORE_WINDOWS_SUPPORT +#else +# define MAGICKCORE_POSIX_SUPPORT +#endif + +#include "magick/method-attribute.h" + +#if defined(MAGICKCORE_NAMESPACE_PREFIX) +# include "magick/methods.h" +#endif +#include "magick/magick-type.h" +#include "magick/animate.h" +#include "magick/annotate.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/cache.h" +#include "magick/cache-view.h" +#include "magick/channel.h" +#include "magick/cipher.h" +#include "magick/client.h" +#include "magick/coder.h" +#include "magick/color.h" +#include "magick/colorspace.h" +#include "magick/colormap.h" +#include "magick/compare.h" +#include "magick/composite.h" +#include "magick/compress.h" +#include "magick/configure.h" +#include "magick/constitute.h" +#include "magick/decorate.h" +#include "magick/delegate.h" +#include "magick/deprecate.h" +#include "magick/display.h" +#include "magick/distort.h" +#include "magick/distribute-cache.h" +#include "magick/draw.h" +#include "magick/effect.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/feature.h" +#include "magick/fourier.h" +#include "magick/fx.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/hashmap.h" +#include "magick/histogram.h" +#include "magick/identify.h" +#include "magick/image.h" +#include "magick/image-view.h" +#include "magick/layer.h" +#include "magick/list.h" +#include "magick/locale_.h" +#include "magick/log.h" +#include "magick/magic.h" +#include "magick/magick.h" +#include "magick/matrix.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/mime.h" +#include "magick/monitor.h" +#include "magick/montage.h" +#include "magick/morphology.h" +#include "magick/opencl.h" +#include "magick/option.h" +#include "magick/paint.h" +#include "magick/pixel.h" +#include "magick/pixel-accessor.h" +#include "magick/policy.h" +#include "magick/prepress.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/quantum.h" +#include "magick/registry.h" +#include "magick/random_.h" +#include "magick/resample.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/segment.h" +#include "magick/shear.h" +#include "magick/signature.h" +#include "magick/splay-tree.h" +#include "magick/static.h" +#include "magick/stream.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/timer.h" +#include "magick/token.h" +#include "magick/transform.h" +#include "magick/threshold.h" +#include "magick/type.h" +#include "magick/utility.h" +#include "magick/version.h" +#include "magick/vision.h" +#include "magick/visual-effects.h" +#include "magick/xml-tree.h" +#include "magick/xwindow.h" + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/MagickCore.pc.in b/ImageMagick-6.9.12-44/magick/MagickCore.pc.in new file mode 100644 index 0000000..a915deb --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/MagickCore.pc.in @@ -0,0 +1,15 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/ImageMagick-@MAGICK_MAJOR_VERSION@ +includearchdir=@INCLUDEARCH_DIR@/ImageMagick-@MAGICK_MAJOR_VERSION@ +libname=MagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ +moduledir=@libdir@/ImageMagick-@MAGICK_MAJOR_VERSION@.@MAGICK_MINOR_VERSION@.@MAGICK_MICRO_VERSION@/modules-@MAGICK_ABI_SUFFIX@ + +Name: MagickCore +Description: MagickCore - C API for ImageMagick (ABI @MAGICK_ABI_SUFFIX@) +URL: https://github.com/ImageMagick/ImageMagick6 +Version: @PACKAGE_BASE_VERSION@ +Cflags: -I${includearchdir} -I${includedir} @MAGICK_PCFLAGS@ +Libs: -L${libdir} -l${libname} +Libs.private: -L${libdir} -l${libname} @MAGICK_LIBS@ @MATH_LIBS@ diff --git a/ImageMagick-6.9.12-44/magick/Makefile.am b/ImageMagick-6.9.12-44/magick/Makefile.am new file mode 100644 index 0000000..f0361e8 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/Makefile.am @@ -0,0 +1,498 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# http://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building the MagickCore API. +# + +magickincdir = $(INCLUDE_PATH)/magick +magickincarchdir = $(INCLUDEARCH_PATH)/magick + +# Headers which are installed +magickinc_HEADERS = \ + $(MAGICK_INCLUDE_HDRS) + +magickincarch_HEADERS = \ + $(MAGICK_INCLUDEARCH_HDRS) + +MAGICK_BIN_SCRPTS = \ + magick/Magick-config \ + magick/MagickCore-config + +MAGICK_PKGCONFIG = \ + magick/ImageMagick.pc \ + magick/ImageMagick-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc \ + magick/MagickCore.pc \ + magick/MagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc + +OSX_GCOV_LDFLAG = @OSX_GCOV_LDFLAG@ + +MAGICK_MANS = \ + magick/Magick-config.1 \ + magick/MagickCore-config.1 + +MAGICKCORE_LIBS = magick/libMagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la + +if WITH_MODULES +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES = $(MAGICK_BASE_SRCS) $(MAGICK_PLATFORM_SRCS) +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD = $(MAGICK_DEP_LIBS) +else +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES = $(MAGICK_BASE_SRCS) $(MAGICK_PLATFORM_SRCS) $(MAGICK_CODER_SRCS) $(MAGICK_FILTER_SRCS) +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD = $(MAGICK_DEP_LIBS) +endif # WITH_MODULES + +nodist_magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES = +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBRARY_EXTRA_CPPFLAGS) + +if HAVE_LD_VERSION_SCRIPT +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -Wl,--version-script=$(top_srcdir)/magick/libMagickCore.map +else +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -export-symbols-regex ".*" +endif + +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS = -no-undefined \ + $(magick_libMagickCore_la_LDFLAGS_VERSION) \ + $(OSX_GCOV_LDFLAG) $(MAGICK_LT_RELEASE_OPTS) -version-info \ + $(MAGICK_LIBRARY_CURRENT):$(MAGICK_LIBRARY_REVISION):$(MAGICK_LIBRARY_AGE) +magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_DEPENDENCIES = + +# Library base sources +MAGICK_BASE_SRCS = \ + magick/ImageMagick.h \ + magick/MagickCore.h \ + magick/accelerate.c \ + magick/accelerate-private.h \ + magick/accelerate-kernels-private.h \ + magick/animate.c \ + magick/animate.h \ + magick/animate-private.h \ + magick/annotate.c \ + magick/annotate.h \ + magick/api.h \ + magick/artifact.c \ + magick/artifact.h \ + magick/attribute.c \ + magick/attribute.h \ + magick/blob.c \ + magick/blob.h \ + magick/blob-private.h \ + magick/cache.c \ + magick/cache.h \ + magick/cache-private.h \ + magick/cache-view.c \ + magick/cache-view.h \ + magick/channel.c \ + magick/channel.h \ + magick/cipher.c \ + magick/cipher.h \ + magick/client.c \ + magick/client.h \ + magick/coder.c \ + magick/coder.h \ + magick/color.c \ + magick/color.h \ + magick/color-private.h \ + magick/colormap.c \ + magick/colormap.h \ + magick/colormap-private.h \ + magick/colorspace.c \ + magick/colorspace.h \ + magick/colorspace-private.h \ + magick/compare.c \ + magick/compare.h \ + magick/composite.c \ + magick/composite.h \ + magick/composite-private.h \ + magick/compress.c \ + magick/compress.h \ + magick/configure.c \ + magick/configure.h \ + magick/constitute.c \ + magick/constitute.h \ + magick/decorate.c \ + magick/decorate.h \ + magick/distribute-cache.c \ + magick/distribute-cache.h \ + magick/distribute-cache-private.h \ + magick/delegate.c \ + magick/delegate.h \ + magick/delegate-private.h \ + magick/deprecate.c \ + magick/deprecate.h \ + magick/display.c \ + magick/display.h \ + magick/display-private.h \ + magick/distort.c \ + magick/distort.h \ + magick/draw.c \ + magick/draw.h \ + magick/draw-private.h \ + magick/effect.c \ + magick/effect.h \ + magick/enhance.c \ + magick/enhance.h \ + magick/exception.c \ + magick/exception.h \ + magick/exception-private.h \ + magick/feature.c \ + magick/feature.h \ + magick/fourier.c \ + magick/fourier.h \ + magick/fx.c \ + magick/fx.h \ + magick/fx-private.h \ + magick/gem.c \ + magick/gem.h \ + magick/gem-private.h \ + magick/geometry.c \ + magick/geometry.h \ + magick/hashmap.c \ + magick/hashmap.h \ + magick/histogram.c \ + magick/histogram.h \ + magick/identify.c \ + magick/identify.h \ + magick/image.c \ + magick/image.h \ + magick/image-private.h \ + magick/image-view.c \ + magick/image-view.h \ + magick/layer.c \ + magick/layer.h \ + magick/list.c \ + magick/list.h \ + magick/locale.c \ + magick/locale_.h \ + magick/locale-private.h \ + magick/log.c \ + magick/log.h \ + magick/mac.h \ + magick/magic.c \ + magick/magic.h \ + magick/magick.c \ + magick/magick-baseconfig.h \ + magick/magick-config.h \ + magick/magick-type.h \ + magick/magick.h \ + magick/matrix.c \ + magick/matrix.h \ + magick/memory.c \ + magick/memory_.h \ + magick/memory-private.h \ + magick/methods.h \ + magick/method-attribute.h \ + magick/mime.c \ + magick/mime.h \ + magick/module.c \ + magick/module.h \ + magick/monitor.c \ + magick/monitor.h \ + magick/monitor-private.h \ + magick/montage.c \ + magick/montage.h \ + magick/morphology.c \ + magick/morphology.h \ + magick/morphology-private.h \ + magick/mutex.h \ + magick/nt-base.h \ + magick/nt-base-private.h \ + magick/nt-feature.h \ + magick/opencl.c \ + magick/opencl.h \ + magick/opencl-private.h \ + magick/option.c \ + magick/option.h \ + magick/option-private.h \ + magick/paint.c \ + magick/paint.h \ + magick/pixel.c \ + magick/pixel.h \ + magick/pixel-accessor.h \ + magick/pixel-private.h \ + magick/policy.c \ + magick/policy.h \ + magick/policy-private.h \ + magick/prepress.c \ + magick/prepress.h \ + magick/property.c \ + magick/property.h \ + magick/profile.c \ + magick/profile.h \ + magick/quantize.c \ + magick/quantize.h \ + magick/quantum.c \ + magick/quantum.h \ + magick/quantum-export.c \ + magick/quantum-import.c \ + magick/quantum-private.h \ + magick/random.c \ + magick/random_.h \ + magick/random-private.h \ + magick/registry.c \ + magick/registry.h \ + magick/resample.c \ + magick/resample.h \ + magick/resample-private.h \ + magick/resize.c \ + magick/resize.h \ + magick/resize-private.h \ + magick/resource.c \ + magick/resource_.h \ + magick/segment.c \ + magick/segment.h \ + magick/semaphore.c \ + magick/semaphore.h \ + magick/semaphore-private.h \ + magick/shear.c \ + magick/shear.h \ + magick/signature.c \ + magick/signature.h \ + magick/signature-private.h \ + magick/splay-tree.c \ + magick/splay-tree.h \ + magick/static.c \ + magick/static.h \ + magick/statistic.c \ + magick/statistic.h \ + magick/stream.c \ + magick/stream.h \ + magick/stream-private.h \ + magick/string.c \ + magick/string_.h \ + magick/string-private.h \ + magick/studio.h \ + magick/thread.c \ + magick/thread_.h \ + magick/thread-private.h \ + magick/timer.c \ + magick/timer.h \ + magick/timer-private.h \ + magick/token.c \ + magick/token.h \ + magick/token-private.h \ + magick/transform.c \ + magick/transform.h \ + magick/threshold.c \ + magick/threshold.h \ + magick/type.c \ + magick/type.h \ + magick/utility.c \ + magick/utility.h \ + magick/utility-private.h \ + magick/version.c \ + magick/version.h \ + magick/version-private.h \ + magick/vision.c \ + magick/vision.h \ + magick/visual-effects.c \ + magick/visual-effects.h \ + magick/vms.h \ + magick/widget.c \ + magick/widget.h \ + magick/xml-tree.c \ + magick/xml-tree.h \ + magick/xml-tree-private.h \ + magick/xwindow.c \ + magick/xwindow.h + +if WIN32_NATIVE_BUILD +MAGICK_PLATFORM_SRCS = \ + magick/nt-base.c \ + magick/nt-base.h \ + magick/nt-base-private.h \ + magick/nt-feature.c \ + magick/nt-feature.h +else +if CYGWIN_BUILD +MAGICK_PLATFORM_SRCS = \ + magick/nt-feature.c \ + magick/nt-feature.h +else +MAGICK_PLATFORM_SRCS = +endif # if CYGWIN_BUILD +endif # if WIN32_NATIVE_BUILD + +MAGICK_INCLUDE_HDRS = \ + magick/ImageMagick.h \ + magick/MagickCore.h \ + magick/animate.h \ + magick/annotate.h \ + magick/api.h \ + magick/artifact.h \ + magick/attribute.h \ + magick/blob.h \ + magick/cache.h \ + magick/cache-view.h \ + magick/channel.h \ + magick/cipher.h \ + magick/client.h \ + magick/coder.h \ + magick/color.h \ + magick/colormap.h \ + magick/colorspace.h \ + magick/compare.h \ + magick/composite.h \ + magick/compress.h \ + magick/configure.h \ + magick/constitute.h \ + magick/decorate.h \ + magick/delegate.h \ + magick/deprecate.h \ + magick/display.h \ + magick/distribute-cache.h \ + magick/distort.h \ + magick/draw.h \ + magick/effect.h \ + magick/enhance.h \ + magick/exception.h \ + magick/feature.h \ + magick/fourier.h \ + magick/fx.h \ + magick/gem.h \ + magick/geometry.h \ + magick/hashmap.h \ + magick/histogram.h \ + magick/identify.h \ + magick/image.h \ + magick/image-view.h \ + magick/layer.h \ + magick/list.h \ + magick/locale_.h \ + magick/log.h \ + magick/magic.h \ + magick/magick.h \ + magick/magick-config.h \ + magick/magick-type.h \ + magick/matrix.h \ + magick/memory_.h \ + magick/methods.h \ + magick/method-attribute.h \ + magick/mime.h \ + magick/module.h \ + magick/monitor.h \ + magick/montage.h \ + magick/morphology.h \ + magick/opencl.h \ + magick/option.h \ + magick/paint.h \ + magick/pixel.h \ + magick/pixel-accessor.h \ + magick/policy.h \ + magick/prepress.h \ + magick/profile.h \ + magick/property.h \ + magick/quantize.h \ + magick/quantum.h \ + magick/random_.h \ + magick/registry.h \ + magick/resample.h \ + magick/resize.h \ + magick/resource_.h \ + magick/segment.h \ + magick/semaphore.h \ + magick/shear.h \ + magick/signature.h \ + magick/splay-tree.h \ + magick/static.h \ + magick/statistic.h \ + magick/stream.h \ + magick/string_.h \ + magick/studio.h \ + magick/timer.h \ + magick/token.h \ + magick/transform.h \ + magick/threshold.h \ + magick/type.h \ + magick/utility.h \ + magick/version.h \ + magick/vision.h \ + magick/visual-effects.h \ + magick/widget.h \ + magick/xml-tree.h \ + magick/xwindow.h + +MAGICK_NOINST_HDRS = \ + magick/accelerate-private.h \ + magick/accelerate-kernels-private.h \ + magick/animate-private.h \ + magick/blob-private.h \ + magick/cache-private.h \ + magick/color-private.h \ + magick/colormap-private.h \ + magick/colorspace-private.h \ + magick/composite-private.h \ + magick/delegate-private.h \ + magick/display-private.h \ + magick/distribute-cache-private.h \ + magick/draw-private.h \ + magick/exception-private.h \ + magick/fx-private.h \ + magick/gem-private.h \ + magick/image-private.h \ + magick/locale-private.h \ + magick/mac.h \ + magick/memory-private.h \ + magick/mime-private.h \ + magick/monitor-private.h \ + magick/morphology-private.h \ + magick/mutex.h \ + magick/nt-base.h \ + magick/nt-base-private.h \ + magick/nt-feature.h \ + magick/opencl.h \ + magick/option-private.h \ + magick/pixel-private.h \ + magick/policy-private.h \ + magick/quantum-private.h \ + magick/random-private.h \ + magick/resample-private.h \ + magick/resize-private.h \ + magick/semaphore-private.h \ + magick/signature-private.h \ + magick/stream-private.h \ + magick/string-private.h \ + magick/thread_.h \ + magick/thread-private.h \ + magick/timer-private.h \ + magick/token-private.h \ + magick/utility-private.h \ + magick/version-private.h \ + magick/xml-tree-private.h \ + magick/xwindow-private.h \ + magick/vms.h + +MAGICK_INCLUDEARCH_HDRS = \ + magick/magick-baseconfig.h + +MAGICK_EXTRA_DIST = \ + magick/Magick-config.in \ + magick/MagickCore-config.in \ + $(MAGICK_MANS) \ + magick/ImageMagick.pc.in \ + magick/libMagickCore.map \ + magick/MagickCore.pc.in \ + magick/config.h_vms \ + magick/mac.c \ + magick/nt-base.c \ + magick/nt-feature.c \ + magick/vms.c \ + magick/xwdfile.h_vms + +if MAGICKCORE_ZERO_CONFIGURATION_SUPPORT +libMagickCore_threshold_target = magick/libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la-threshold.lo +$(libMagickCore_threshold_target): magick/threshold-map.h +nodist_magick_libMagickCore_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES += magick/threshold-map.h +CLEANFILES += magick/threshold-map.h +magick/threshold-map.h: config/thresholds.xml Makefile + $(AM_V_GEN){ printf '%s\n %s=\n' 'static const char *const' BuiltinMap; sed -e 's/"/\\"/g; s/^.*$$/ "&\\n"/; $$s/$$/;/' $<; } >$@ +endif diff --git a/ImageMagick-6.9.12-44/magick/accelerate-kernels-private.h b/ImageMagick-6.9.12-44/magick/accelerate-kernels-private.h new file mode 100644 index 0000000..509f727 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/accelerate-kernels-private.h @@ -0,0 +1,3428 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore private methods for accelerated functions. +*/ + +#ifndef MAGICKCORE_ACCELERATE_KERNELS_PRIVATE_H +#define MAGICKCORE_ACCELERATE_KERNELS_PRIVATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if defined(MAGICKCORE_OPENCL_SUPPORT) + +/* + Define declarations. +*/ +#define OPENCL_DEFINE(VAR,...) "\n #""define " #VAR " " #__VA_ARGS__ " \n" +#define OPENCL_ELIF(...) "\n #""elif " #__VA_ARGS__ " \n" +#define OPENCL_ELSE() "\n #""else " " \n" +#define OPENCL_ENDIF() "\n #""endif " " \n" +#define OPENCL_IF(...) "\n #""if " #__VA_ARGS__ " \n" +#define STRINGIFY(...) #__VA_ARGS__ "\n" + +const char* accelerateKernels = + +/* + Define declarations. +*/ + OPENCL_DEFINE(GetPixelAlpha(pixel),(QuantumRange-(pixel).w)) + OPENCL_DEFINE(SigmaUniform, (attenuate*0.015625f)) + OPENCL_DEFINE(SigmaGaussian, (attenuate*0.015625f)) + OPENCL_DEFINE(SigmaImpulse, (attenuate*0.1f)) + OPENCL_DEFINE(SigmaLaplacian, (attenuate*0.0390625f)) + OPENCL_DEFINE(SigmaMultiplicativeGaussian, (attenuate*0.5f)) + OPENCL_DEFINE(SigmaPoisson, (attenuate*12.5f)) + OPENCL_DEFINE(SigmaRandom, (attenuate)) + OPENCL_DEFINE(TauGaussian, (attenuate*0.078125f)) + OPENCL_DEFINE(MagickMax(x, y), (((x) > (y)) ? (x) : (y))) + OPENCL_DEFINE(MagickMin(x, y), (((x) < (y)) ? (x) : (y))) + +/* + Typedef declarations. +*/ + STRINGIFY( + typedef enum + { + UndefinedColorspace, + RGBColorspace, /* Linear RGB colorspace */ + GRAYColorspace, /* greyscale (non-linear) image (faked 1 channel) */ + TransparentColorspace, + OHTAColorspace, + LabColorspace, + XYZColorspace, + YCbCrColorspace, + YCCColorspace, + YIQColorspace, + YPbPrColorspace, + YUVColorspace, + CMYKColorspace, /* negared linear RGB with black separated */ + sRGBColorspace, /* Default: non-lienar sRGB colorspace */ + HSBColorspace, + HSLColorspace, + HWBColorspace, + Rec601LumaColorspace, + Rec601YCbCrColorspace, + Rec709LumaColorspace, + Rec709YCbCrColorspace, + LogColorspace, + CMYColorspace, /* negated linear RGB colorspace */ + LuvColorspace, + HCLColorspace, + LCHColorspace, /* alias for LCHuv */ + LMSColorspace, + LCHabColorspace, /* Cylindrical (Polar) Lab */ + LCHuvColorspace, /* Cylindrical (Polar) Luv */ + scRGBColorspace, + HSIColorspace, + HSVColorspace, /* alias for HSB */ + HCLpColorspace, + YDbDrColorspace, + LinearGRAYColorspace /* greyscale (linear) image (faked 1 channel) */ + } ColorspaceType; + ) + + STRINGIFY( + typedef enum + { + UndefinedCompositeOp, + NoCompositeOp, + ModulusAddCompositeOp, + AtopCompositeOp, + BlendCompositeOp, + BumpmapCompositeOp, + ChangeMaskCompositeOp, + ClearCompositeOp, + ColorBurnCompositeOp, + ColorDodgeCompositeOp, + ColorizeCompositeOp, + CopyBlackCompositeOp, + CopyBlueCompositeOp, + CopyCompositeOp, + CopyCyanCompositeOp, + CopyGreenCompositeOp, + CopyMagentaCompositeOp, + CopyOpacityCompositeOp, + CopyRedCompositeOp, + CopyYellowCompositeOp, + DarkenCompositeOp, + DstAtopCompositeOp, + DstCompositeOp, + DstInCompositeOp, + DstOutCompositeOp, + DstOverCompositeOp, + DifferenceCompositeOp, + DisplaceCompositeOp, + DissolveCompositeOp, + ExclusionCompositeOp, + HardLightCompositeOp, + HueCompositeOp, + InCompositeOp, + LightenCompositeOp, + LinearLightCompositeOp, + LuminizeCompositeOp, + MinusDstCompositeOp, + ModulateCompositeOp, + MultiplyCompositeOp, + OutCompositeOp, + OverCompositeOp, + OverlayCompositeOp, + PlusCompositeOp, + ReplaceCompositeOp, + SaturateCompositeOp, + ScreenCompositeOp, + SoftLightCompositeOp, + SrcAtopCompositeOp, + SrcCompositeOp, + SrcInCompositeOp, + SrcOutCompositeOp, + SrcOverCompositeOp, + ModulusSubtractCompositeOp, + ThresholdCompositeOp, + XorCompositeOp, + /* These are new operators, added after the above was last sorted. + * The list should be re-sorted only when a new library version is + * created. + */ + DivideDstCompositeOp, + DistortCompositeOp, + BlurCompositeOp, + PegtopLightCompositeOp, + VividLightCompositeOp, + PinLightCompositeOp, + LinearDodgeCompositeOp, + LinearBurnCompositeOp, + MathematicsCompositeOp, + DivideSrcCompositeOp, + MinusSrcCompositeOp, + DarkenIntensityCompositeOp, + LightenIntensityCompositeOp + } CompositeOperator; + ) + + STRINGIFY( + typedef enum + { + UndefinedFunction, + PolynomialFunction, + SinusoidFunction, + ArcsinFunction, + ArctanFunction + } MagickFunction; + ) + + STRINGIFY( + typedef enum + { + UndefinedNoise, + UniformNoise, + GaussianNoise, + MultiplicativeGaussianNoise, + ImpulseNoise, + LaplacianNoise, + PoissonNoise, + RandomNoise + } NoiseType; + ) + + STRINGIFY( + typedef enum + { + UndefinedPixelIntensityMethod = 0, + AveragePixelIntensityMethod, + BrightnessPixelIntensityMethod, + LightnessPixelIntensityMethod, + Rec601LumaPixelIntensityMethod, + Rec601LuminancePixelIntensityMethod, + Rec709LumaPixelIntensityMethod, + Rec709LuminancePixelIntensityMethod, + RMSPixelIntensityMethod, + MSPixelIntensityMethod + } PixelIntensityMethod; + ) + + STRINGIFY( + typedef enum { + BoxWeightingFunction = 0, + TriangleWeightingFunction, + CubicBCWeightingFunction, + HanningWeightingFunction, + HammingWeightingFunction, + BlackmanWeightingFunction, + GaussianWeightingFunction, + QuadraticWeightingFunction, + JincWeightingFunction, + SincWeightingFunction, + SincFastWeightingFunction, + KaiserWeightingFunction, + WelshWeightingFunction, + BohmanWeightingFunction, + LagrangeWeightingFunction, + CosineWeightingFunction, + } ResizeWeightingFunctionType; + ) + + STRINGIFY( + typedef enum + { + UndefinedChannel, + RedChannel = 0x0001, + GrayChannel = 0x0001, + CyanChannel = 0x0001, + GreenChannel = 0x0002, + MagentaChannel = 0x0002, + BlueChannel = 0x0004, + YellowChannel = 0x0004, + AlphaChannel = 0x0008, + OpacityChannel = 0x0008, + MatteChannel = 0x0008, /* deprecated */ + BlackChannel = 0x0020, + IndexChannel = 0x0020, + CompositeChannels = 0x002F, + AllChannels = 0x7ffffff, + /* + Special purpose channel types. + */ + TrueAlphaChannel = 0x0040, /* extract actual alpha channel from opacity */ + RGBChannels = 0x0080, /* set alpha from grayscale mask in RGB */ + GrayChannels = 0x0080, + SyncChannels = 0x0100, /* channels should be modified equally */ + DefaultChannels = ((AllChannels | SyncChannels) &~ OpacityChannel) + } ChannelType; + ) + +/* + Helper functions. +*/ + +OPENCL_IF((MAGICKCORE_QUANTUM_DEPTH == 8)) + + STRINGIFY( + static inline CLQuantum ScaleCharToQuantum(const unsigned char value) + { + return((CLQuantum) value); + } + ) + +OPENCL_ELIF((MAGICKCORE_QUANTUM_DEPTH == 16)) + + STRINGIFY( + static inline CLQuantum ScaleCharToQuantum(const unsigned char value) + { + return((CLQuantum) (257.0f*value)); + } + ) + +OPENCL_ELIF((MAGICKCORE_QUANTUM_DEPTH == 32)) + + STRINGIFY( + static inline CLQuantum ScaleCharToQuantum(const unsigned char value) + { + return((CLQuantum) (16843009.0*value)); + } + ) + +OPENCL_ENDIF() + +OPENCL_IF((MAGICKCORE_HDRI_SUPPORT == 1)) + + STRINGIFY( + static inline CLQuantum ClampToQuantum(const float value) + { + return (CLQuantum) value; + } + ) + +OPENCL_ELSE() + + STRINGIFY( + static inline CLQuantum ClampToQuantum(const float value) + { + return (CLQuantum) (clamp(value, 0.0f, QuantumRange) + 0.5f); + } + ) + +OPENCL_ENDIF() + + STRINGIFY( + static inline int ClampToCanvas(const int offset, const int range) + { + return clamp(offset, (int)0, range - 1); + } + ) + + STRINGIFY( + static inline int ClampToCanvasWithHalo(const int offset, const int range, const int edge, const int section) + { + return clamp(offset, section ? (int)(0 - edge) : (int)0, section ? (range - 1) : (range - 1 + edge)); + } + ) + + STRINGIFY( + static inline uint ScaleQuantumToMap(CLQuantum value) + { + if (value >= (CLQuantum)MaxMap) + return ((uint)MaxMap); + else + return ((uint)value); + } + ) + + STRINGIFY( + static inline float PerceptibleReciprocal(const float x) + { + float sign = x < (float) 0.0 ? (float)-1.0 : (float) 1.0; + return((sign*x) >= MagickEpsilon ? (float) 1.0 / x : sign*((float) 1.0 / MagickEpsilon)); + } + ) + + STRINGIFY( + static inline float RoundToUnity(const float value) + { + return clamp(value, 0.0f, 1.0f); + } + ) + + STRINGIFY( + + static inline CLQuantum getBlue(CLPixelType p) { return p.x; } + static inline void setBlue(CLPixelType* p, CLQuantum value) { (*p).x = value; } + static inline float getBlueF4(float4 p) { return p.x; } + static inline void setBlueF4(float4* p, float value) { (*p).x = value; } + + static inline CLQuantum getGreen(CLPixelType p) { return p.y; } + static inline void setGreen(CLPixelType* p, CLQuantum value) { (*p).y = value; } + static inline float getGreenF4(float4 p) { return p.y; } + static inline void setGreenF4(float4* p, float value) { (*p).y = value; } + + static inline CLQuantum getRed(CLPixelType p) { return p.z; } + static inline void setRed(CLPixelType* p, CLQuantum value) { (*p).z = value; } + static inline float getRedF4(float4 p) { return p.z; } + static inline void setRedF4(float4* p, float value) { (*p).z = value; } + + static inline CLQuantum getOpacity(CLPixelType p) { return p.w; } + static inline void setOpacity(CLPixelType* p, CLQuantum value) { (*p).w = value; } + static inline float getOpacityF4(float4 p) { return p.w; } + static inline void setOpacityF4(float4* p, float value) { (*p).w = value; } + + static inline void setGray(CLPixelType* p, CLQuantum value) { (*p).z = value; (*p).y = value; (*p).x = value; } + + static inline float GetPixelIntensity(const int method, const int colorspace, CLPixelType p) + { + float red = getRed(p); + float green = getGreen(p); + float blue = getBlue(p); + + float intensity; + + if (colorspace == GRAYColorspace) + return red; + + switch (method) + { + case AveragePixelIntensityMethod: + { + intensity = (red + green + blue) / 3.0; + break; + } + case BrightnessPixelIntensityMethod: + { + intensity = MagickMax(MagickMax(red, green), blue); + break; + } + case LightnessPixelIntensityMethod: + { + intensity = (MagickMin(MagickMin(red, green), blue) + + MagickMax(MagickMax(red, green), blue)) / 2.0; + break; + } + case MSPixelIntensityMethod: + { + intensity = (float)(((float)red*red + green*green + blue*blue) / + (3.0*QuantumRange)); + break; + } + case Rec601LumaPixelIntensityMethod: + { + /* + if (image->colorspace == RGBColorspace) + { + red=EncodePixelGamma(red); + green=EncodePixelGamma(green); + blue=EncodePixelGamma(blue); + } + */ + intensity = 0.298839*red + 0.586811*green + 0.114350*blue; + break; + } + case Rec601LuminancePixelIntensityMethod: + { + /* + if (image->colorspace == sRGBColorspace) + { + red=DecodePixelGamma(red); + green=DecodePixelGamma(green); + blue=DecodePixelGamma(blue); + } + */ + intensity = 0.298839*red + 0.586811*green + 0.114350*blue; + break; + } + case Rec709LumaPixelIntensityMethod: + default: + { + /* + if (image->colorspace == RGBColorspace) + { + red=EncodePixelGamma(red); + green=EncodePixelGamma(green); + blue=EncodePixelGamma(blue); + } + */ + intensity = 0.212656*red + 0.715158*green + 0.072186*blue; + break; + } + case Rec709LuminancePixelIntensityMethod: + { + /* + if (image->colorspace == sRGBColorspace) + { + red=DecodePixelGamma(red); + green=DecodePixelGamma(green); + blue=DecodePixelGamma(blue); + } + */ + intensity = 0.212656*red + 0.715158*green + 0.072186*blue; + break; + } + case RMSPixelIntensityMethod: + { + intensity = (float)(sqrt((float)red*red + green*green + blue*blue) / + sqrt(3.0)); + break; + } + } + + return intensity; + + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A d d N o i s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +STRINGIFY( + +/* +Part of MWC64X by David Thomas, dt10@imperial.ac.uk +This is provided under BSD, full license is with the main package. +See http://www.doc.ic.ac.uk/~dt10/research +*/ + +// Pre: a=M) || (v=M) || (convert_float(v) < convert_float(a)) ) // workaround for what appears to be an optimizer bug. + v=v-M; + return v; +} + +// Pre: a>1; + } + return r; +} + + +// Pre: a=0 +// Post: r=(a^b) mod M +// This takes at most ~64^2 modular additions, so probably about 2^15 or so instructions on +// most architectures +ulong MWC_PowMod64(ulong a, ulong e, ulong M) +{ + ulong sqr=a, acc=1; + while(e!=0){ + if(e&1) + acc=MWC_MulMod64(acc,sqr,M); + sqr=MWC_MulMod64(sqr,sqr,M); + e=e>>1; + } + return acc; +} + +uint2 MWC_SkipImpl_Mod64(uint2 curr, ulong A, ulong M, ulong distance) +{ + ulong m=MWC_PowMod64(A, distance, M); + ulong x=curr.x*(ulong)A+curr.y; + x=MWC_MulMod64(x, m, M); + return (uint2)((uint)(x/A), (uint)(x%A)); +} + +uint2 MWC_SeedImpl_Mod64(ulong A, ulong M, uint vecSize, uint vecOffset, ulong streamBase, ulong streamGap) +{ + // This is an arbitrary constant for starting LCG jumping from. I didn't + // want to start from 1, as then you end up with the two or three first values + // being a bit poor in ones - once you've decided that, one constant is as + // good as any another. There is no deep mathematical reason for it, I just + // generated a random number. + enum{ MWC_BASEID = 4077358422479273989UL }; + + ulong dist=streamBase + (get_global_id(0)*vecSize+vecOffset)*streamGap; + ulong m=MWC_PowMod64(A, dist, M); + + ulong x=MWC_MulMod64(MWC_BASEID, m, M); + return (uint2)((uint)(x/A), (uint)(x%A)); +} + +//! Represents the state of a particular generator +typedef struct{ uint x; uint c; uint seed0; ulong seed1; } mwc64x_state_t; + +void MWC64X_Step(mwc64x_state_t *s) +{ + uint X=s->x, C=s->c; + + uint Xn=s->seed0*X+C; + uint carry=(uint)(Xnseed0,X,carry); + + s->x=Xn; + s->c=Cn; +} + +void MWC64X_Skip(mwc64x_state_t *s, ulong distance) +{ + uint2 tmp=MWC_SkipImpl_Mod64((uint2)(s->x,s->c), s->seed0, s->seed1, distance); + s->x=tmp.x; + s->c=tmp.y; +} + +void MWC64X_SeedStreams(mwc64x_state_t *s, ulong baseOffset, ulong perStreamOffset) +{ + uint2 tmp=MWC_SeedImpl_Mod64(s->seed0, s->seed1, 1, 0, baseOffset, perStreamOffset); + s->x=tmp.x; + s->c=tmp.y; +} + +//! Return a 32-bit integer in the range [0..2^32) +uint MWC64X_NextUint(mwc64x_state_t *s) +{ + uint res=s->x ^ s->c; + MWC64X_Step(s); + return res; +} + +// +// End of MWC64X excerpt +// + + float mwcReadPseudoRandomValue(mwc64x_state_t* rng) { + return (1.0f * MWC64X_NextUint(rng)) / (float)(0xffffffff); // normalized to 1.0 + } + + + float mwcGenerateDifferentialNoise(mwc64x_state_t* r, CLQuantum pixel, NoiseType noise_type, float attenuate) { + + float + alpha, + beta, + noise, + sigma; + + noise = 0.0f; + alpha=mwcReadPseudoRandomValue(r); + switch(noise_type) { + case UniformNoise: + default: + { + noise=(pixel+QuantumRange*SigmaUniform*(alpha-0.5f)); + break; + } + case GaussianNoise: + { + float + gamma, + tau; + + if (alpha == 0.0f) + alpha=1.0f; + beta=mwcReadPseudoRandomValue(r); + gamma=sqrt(-2.0f*log(alpha)); + sigma=gamma*cospi((2.0f*beta)); + tau=gamma*sinpi((2.0f*beta)); + noise=(float)(pixel+sqrt((float) pixel)*SigmaGaussian*sigma+ + QuantumRange*TauGaussian*tau); + break; + } + + + case ImpulseNoise: + { + if (alpha < (SigmaImpulse/2.0f)) + noise=0.0f; + else + if (alpha >= (1.0f-(SigmaImpulse/2.0f))) + noise=(float)QuantumRange; + else + noise=(float)pixel; + break; + } + case LaplacianNoise: + { + if (alpha <= 0.5f) + { + if (alpha <= MagickEpsilon) + noise=(float) (pixel-QuantumRange); + else + noise=(float) (pixel+QuantumRange*SigmaLaplacian*log(2.0f*alpha)+ + 0.5f); + break; + } + beta=1.0f-alpha; + if (beta <= (0.5f*MagickEpsilon)) + noise=(float) (pixel+QuantumRange); + else + noise=(float) (pixel-QuantumRange*SigmaLaplacian*log(2.0f*beta)+0.5f); + break; + } + case MultiplicativeGaussianNoise: + { + sigma=1.0f; + if (alpha > MagickEpsilon) + sigma=sqrt(-2.0f*log(alpha)); + beta=mwcReadPseudoRandomValue(r); + noise=(float) (pixel+pixel*SigmaMultiplicativeGaussian*sigma* + cospi((float) (2.0f*beta))/2.0f); + break; + } + case PoissonNoise: + { + float + poisson; + unsigned int i; + poisson=exp(-SigmaPoisson*QuantumScale*pixel); + for (i=0; alpha > poisson; i++) + { + beta=mwcReadPseudoRandomValue(r); + alpha*=beta; + } + noise=(float) (QuantumRange*i*PerceptibleReciprocal(SigmaPoisson)); + break; + } + case RandomNoise: + { + noise=(float) (QuantumRange*SigmaRandom*alpha); + break; + } + + }; + return noise; + } + + __kernel + void AddNoise(const __global CLPixelType* inputImage, __global CLPixelType* filteredImage + ,const unsigned int inputPixelCount, const unsigned int pixelsPerWorkItem + ,const ChannelType channel + ,const NoiseType noise_type, const float attenuate + ,const unsigned int seed0, const unsigned int seed1 + ,const unsigned int numRandomNumbersPerPixel) { + + mwc64x_state_t rng; + rng.seed0 = seed0; + rng.seed1 = seed1; + + uint span = pixelsPerWorkItem * numRandomNumbersPerPixel; // length of RNG substream each workitem will use + uint offset = span * get_local_size(0) * get_group_id(0); // offset of this workgroup's RNG substream (in master stream); + + MWC64X_SeedStreams(&rng, offset, span); // Seed the RNG streams + + uint pos = get_local_size(0) * get_group_id(0) * pixelsPerWorkItem + get_local_id(0); // pixel to process + + uint count = pixelsPerWorkItem; + + while (count > 0) { + if (pos < inputPixelCount) { + CLPixelType p = inputImage[pos]; + + if ((channel&RedChannel)!=0) { + setRed(&p,ClampToQuantum(mwcGenerateDifferentialNoise(&rng,getRed(p),noise_type,attenuate))); + } + + if ((channel&GreenChannel)!=0) { + setGreen(&p,ClampToQuantum(mwcGenerateDifferentialNoise(&rng,getGreen(p),noise_type,attenuate))); + } + + if ((channel&BlueChannel)!=0) { + setBlue(&p,ClampToQuantum(mwcGenerateDifferentialNoise(&rng,getBlue(p),noise_type,attenuate))); + } + + if ((channel & OpacityChannel) != 0) { + setOpacity(&p,ClampToQuantum(mwcGenerateDifferentialNoise(&rng,getOpacity(p),noise_type,attenuate))); + } + + filteredImage[pos] = p; + //filteredImage[pos] = (CLPixelType)(MWC64X_NextUint(&rng) % 256, MWC64X_NextUint(&rng) % 256, MWC64X_NextUint(&rng) % 256, 255); + } + pos += get_local_size(0); + --count; + } + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% B l u r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + /* + Reduce image noise and reduce detail levels by row + im: input pixels filtered_in filtered_im: output pixels + filter : convolve kernel width: convolve kernel size + channel : define which channel is blured + is_RGBA_BGRA : define the input is RGBA or BGRA + */ + __kernel void BlurRow(__global CLPixelType *im, __global float4 *filtered_im, + const ChannelType channel, __constant float *filter, + const unsigned int width, + const unsigned int imageColumns, const unsigned int imageRows, + __local CLPixelType *temp) + { + const int x = get_global_id(0); + const int y = get_global_id(1); + + const int columns = imageColumns; + + const unsigned int radius = (width-1)/2; + const int wsize = get_local_size(0); + const unsigned int loadSize = wsize+width; + + //load chunk only for now + //event_t e = async_work_group_copy(temp+radius, im+x+y*columns, wsize, 0); + //wait_group_events(1,&e); + + //parallel load and clamp + /* + int count = 0; + for (int i=0; i < loadSize; i=i+wsize) + { + int currentX = x + wsize*(count++); + + int localId = get_local_id(0); + + if ((localId+i) > loadSize) + break; + + temp[localId+i] = im[y*columns+ClampToCanvas(currentX-radius, columns)]; + + if (y==0 && get_group_id(0) == 0) + { + printf("(%d %d) temp %d load %d currentX %d\n", x, y, localId+i, ClampToCanvas(currentX-radius, columns), currentX); + } + } + */ + + //group coordinate + const int groupX=get_local_size(0)*get_group_id(0); + const int groupY=get_local_size(1)*get_group_id(1); + + //parallel load and clamp + for (int i=get_local_id(0); i < loadSize; i=i+get_local_size(0)) + { + //int cx = ClampToCanvas(groupX+i, columns); + temp[i] = im[y * columns + ClampToCanvas(i+groupX-radius, columns)]; + + /*if (0 && y==0 && get_group_id(1) == 0) + { + printf("(%d %d) temp %d load %d groupX %d\n", x, y, i, ClampToCanvas(groupX+i, columns), groupX); + }*/ + } + + // barrier + barrier(CLK_LOCAL_MEM_FENCE); + + // only do the work if this is not a patched item + if (get_global_id(0) < columns) + { + // compute + float4 result = (float4) 0; + + int i = 0; + + \n #ifndef UFACTOR \n + \n #define UFACTOR 8 \n + \n #endif \n + + for ( ; i+UFACTOR < width; ) + { + \n #pragma unroll UFACTOR\n + for (int j=0; j < UFACTOR; j++, i++) + { + result+=filter[i]*convert_float4(temp[i+get_local_id(0)]); + } + } + + for ( ; i < width; i++) + { + result+=filter[i]*convert_float4(temp[i+get_local_id(0)]); + } + + result.x = ClampToQuantum(result.x); + result.y = ClampToQuantum(result.y); + result.z = ClampToQuantum(result.z); + result.w = ClampToQuantum(result.w); + + // write back to global + filtered_im[y*columns+x] = result; + } + } + ) + + STRINGIFY( + /* + Reduce image noise and reduce detail levels by line + im: input pixels filtered_in filtered_im: output pixels + filter : convolve kernel width: convolve kernel size + channel : define which channel is blured\ + is_RGBA_BGRA : define the input is RGBA or BGRA + */ + __kernel void BlurColumn(const __global float4 *blurRowData, __global CLPixelType *filtered_im, + const ChannelType channel, __constant float *filter, + const unsigned int width, + const unsigned int imageColumns, const unsigned int imageRows, + __local float4 *temp) + { + const int x = get_global_id(0); + const int y = get_global_id(1); + + //const int columns = get_global_size(0); + //const int rows = get_global_size(1); + const int columns = imageColumns; + const int rows = imageRows; + + unsigned int radius = (width-1)/2; + const int wsize = get_local_size(1); + const unsigned int loadSize = wsize+width; + + //group coordinate + const int groupX=get_local_size(0)*get_group_id(0); + const int groupY=get_local_size(1)*get_group_id(1); + //notice that get_local_size(0) is 1, so + //groupX=get_group_id(0); + + //parallel load and clamp + for (int i = get_local_id(1); i < loadSize; i=i+get_local_size(1)) + { + temp[i] = blurRowData[ClampToCanvas(i+groupY-radius, rows) * columns + groupX]; + } + + // barrier + barrier(CLK_LOCAL_MEM_FENCE); + + // only do the work if this is not a patched item + if (get_global_id(1) < rows) + { + // compute + float4 result = (float4) 0; + + int i = 0; + + \n #ifndef UFACTOR \n + \n #define UFACTOR 8 \n + \n #endif \n + + for ( ; i+UFACTOR < width; ) + { + \n #pragma unroll UFACTOR \n + for (int j=0; j < UFACTOR; j++, i++) + { + result+=filter[i]*temp[i+get_local_id(1)]; + } + } + + for ( ; i < width; i++) + { + result+=filter[i]*temp[i+get_local_id(1)]; + } + + result.x = ClampToQuantum(result.x); + result.y = ClampToQuantum(result.y); + result.z = ClampToQuantum(result.z); + result.w = ClampToQuantum(result.w); + + // write back to global + filtered_im[y*columns+x] = (CLPixelType) (result.x,result.y,result.z,result.w); + } + + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o m p o s i t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + static inline float ColorDodge(const float Sca, + const float Sa,const float Dca,const float Da) + { + /* + Oct 2004 SVG specification. + */ + if ((Sca*Da+Dca*Sa) >= Sa*Da) + return(Sa*Da+Sca*(1.0-Da)+Dca*(1.0-Sa)); + return(Dca*Sa*Sa/(Sa-Sca)+Sca*(1.0-Da)+Dca*(1.0-Sa)); + + + /* + New specification, March 2009 SVG specification. This specification was + also wrong of non-overlap cases. + */ + /* + if ((fabs(Sca-Sa) < MagickEpsilon) && (fabs(Dca) < MagickEpsilon)) + return(Sca*(1.0-Da)); + if (fabs(Sca-Sa) < MagickEpsilon) + return(Sa*Da+Sca*(1.0-Da)+Dca*(1.0-Sa)); + return(Sa*MagickMin(Da,Dca*Sa/(Sa-Sca))); + */ + + /* + Working from first principles using the original formula: + + f(Sc,Dc) = Dc/(1-Sc) + + This works correctly! Looks like the 2004 model was right but just + required a extra condition for correct handling. + */ + + /* + if ((fabs(Sca-Sa) < MagickEpsilon) && (fabs(Dca) < MagickEpsilon)) + return(Sca*(1.0-Da)+Dca*(1.0-Sa)); + if (fabs(Sca-Sa) < MagickEpsilon) + return(Sa*Da+Sca*(1.0-Da)+Dca*(1.0-Sa)); + return(Dca*Sa*Sa/(Sa-Sca)+Sca*(1.0-Da)+Dca*(1.0-Sa)); + */ + } + + static inline void CompositeColorDodge(const float4 *p, + const float4 *q,float4 *composite) { + + float + Da, + gamma, + Sa; + + Sa=1.0f-QuantumScale*getOpacityF4(*p); /* simplify and speed up equations */ + Da=1.0f-QuantumScale*getOpacityF4(*q); + gamma=RoundToUnity(Sa+Da-Sa*Da); /* over blend, as per SVG doc */ + setOpacityF4(composite, QuantumRange*(1.0-gamma)); + gamma=QuantumRange/(fabs(gamma) < MagickEpsilon ? MagickEpsilon : gamma); + setRedF4(composite,gamma*ColorDodge(QuantumScale*getRedF4(*p)*Sa,Sa,QuantumScale* + getRedF4(*q)*Da,Da)); + setGreenF4(composite,gamma*ColorDodge(QuantumScale*getGreenF4(*p)*Sa,Sa,QuantumScale* + getGreenF4(*q)*Da,Da)); + setBlueF4(composite,gamma*ColorDodge(QuantumScale*getBlueF4(*p)*Sa,Sa,QuantumScale* + getBlueF4(*q)*Da,Da)); + } + ) + + STRINGIFY( + static inline void MagickPixelCompositePlus(const float4 *p, + const float alpha,const float4 *q, + const float beta,float4 *composite) + { + float + gamma; + + float + Da, + Sa; + /* + Add two pixels with the given opacities. + */ + Sa=1.0-QuantumScale*alpha; + Da=1.0-QuantumScale*beta; + gamma=RoundToUnity(Sa+Da); /* 'Plus' blending -- not 'Over' blending */ + setOpacityF4(composite,(float) QuantumRange*(1.0-gamma)); + gamma=PerceptibleReciprocal(gamma); + setRedF4(composite,gamma*(Sa*getRedF4(*p)+Da*getRedF4(*q))); + setGreenF4(composite,gamma*(Sa*getGreenF4(*p)+Da*getGreenF4(*q))); + setBlueF4(composite,gamma*(Sa*getBlueF4(*p)+Da*getBlueF4(*q))); + } + ) + + STRINGIFY( + static inline void MagickPixelCompositeBlend(const float4 *p, + const float alpha,const float4 *q, + const float beta,float4 *composite) + { + MagickPixelCompositePlus(p,(float) (QuantumRange-alpha* + (QuantumRange-getOpacityF4(*p))),q,(float) (QuantumRange-beta* + (QuantumRange-getOpacityF4(*q))),composite); + } + ) + + STRINGIFY( + __kernel + void Composite(__global CLPixelType *image, + const unsigned int imageWidth, + const unsigned int imageHeight, + const unsigned int imageMatte, + const __global CLPixelType *compositeImage, + const unsigned int compositeWidth, + const unsigned int compositeHeight, + const unsigned int compositeMatte, + const unsigned int compose, + const ChannelType channel, + const float destination_dissolve, + const float source_dissolve) { + + uint2 index; + index.x = get_global_id(0); + index.y = get_global_id(1); + + + if (index.x >= imageWidth + || index.y >= imageHeight) { + return; + } + const CLPixelType inputPixel = image[index.y*imageWidth+index.x]; + float4 destination; + setRedF4(&destination,getRed(inputPixel)); + setGreenF4(&destination,getGreen(inputPixel)); + setBlueF4(&destination,getBlue(inputPixel)); + + + const CLPixelType compositePixel + = compositeImage[index.y*imageWidth+index.x]; + float4 source; + setRedF4(&source,getRed(compositePixel)); + setGreenF4(&source,getGreen(compositePixel)); + setBlueF4(&source,getBlue(compositePixel)); + + if (imageMatte != 0) { + setOpacityF4(&destination,getOpacity(inputPixel)); + } + else { + setOpacityF4(&destination,0.0f); + } + + if (compositeMatte != 0) { + setOpacityF4(&source,getOpacity(compositePixel)); + } + else { + setOpacityF4(&source,0.0f); + } + + float4 composite=destination; + + CompositeOperator op = (CompositeOperator)compose; + switch (op) { + case ColorDodgeCompositeOp: + CompositeColorDodge(&source,&destination,&composite); + break; + case BlendCompositeOp: + MagickPixelCompositeBlend(&source,source_dissolve,&destination, + destination_dissolve,&composite); + break; + default: + // unsupported operators + break; + }; + + CLPixelType outputPixel; + setRed(&outputPixel, ClampToQuantum(getRedF4(composite))); + setGreen(&outputPixel, ClampToQuantum(getGreenF4(composite))); + setBlue(&outputPixel, ClampToQuantum(getBlueF4(composite))); + setOpacity(&outputPixel, ClampToQuantum(getOpacityF4(composite))); + image[index.y*imageWidth+index.x] = outputPixel; + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n t r a s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + + static inline float3 ConvertRGBToHSB(CLPixelType pixel) { + float3 HueSaturationBrightness; + HueSaturationBrightness.x = 0.0f; // Hue + HueSaturationBrightness.y = 0.0f; // Saturation + HueSaturationBrightness.z = 0.0f; // Brightness + + float r=(float) getRed(pixel); + float g=(float) getGreen(pixel); + float b=(float) getBlue(pixel); + + float tmin=MagickMin(MagickMin(r,g),b); + float tmax= MagickMax(MagickMax(r,g),b); + + if (tmax!=0.0f) { + float delta=tmax-tmin; + HueSaturationBrightness.y=delta/tmax; + HueSaturationBrightness.z=QuantumScale*tmax; + + if (delta != 0.0f) { + HueSaturationBrightness.x = ((r == tmax)?0.0f:((g == tmax)?2.0f:4.0f)); + HueSaturationBrightness.x += ((r == tmax)?(g-b):((g == tmax)?(b-r):(r-g)))/delta; + HueSaturationBrightness.x/=6.0f; + HueSaturationBrightness.x += (HueSaturationBrightness.x < 0.0f)?0.0f:1.0f; + } + } + return HueSaturationBrightness; + } + + static inline CLPixelType ConvertHSBToRGB(float3 HueSaturationBrightness) { + + float hue = HueSaturationBrightness.x; + float brightness = HueSaturationBrightness.z; + float saturation = HueSaturationBrightness.y; + + CLPixelType rgb; + + if (saturation == 0.0f) { + setRed(&rgb,ClampToQuantum(QuantumRange*brightness)); + setGreen(&rgb,getRed(rgb)); + setBlue(&rgb,getRed(rgb)); + } + else { + + float h=6.0f*(hue-floor(hue)); + float f=h-floor(h); + float p=brightness*(1.0f-saturation); + float q=brightness*(1.0f-saturation*f); + float t=brightness*(1.0f-(saturation*(1.0f-f))); + + float clampedBrightness = ClampToQuantum(QuantumRange*brightness); + float clamped_t = ClampToQuantum(QuantumRange*t); + float clamped_p = ClampToQuantum(QuantumRange*p); + float clamped_q = ClampToQuantum(QuantumRange*q); + int ih = (int)h; + setRed(&rgb, (ih == 1)?clamped_q: + (ih == 2 || ih == 3)?clamped_p: + (ih == 4)?clamped_t: + clampedBrightness); + + setGreen(&rgb, (ih == 1 || ih == 2)?clampedBrightness: + (ih == 3)?clamped_q: + (ih == 4 || ih == 5)?clamped_p: + clamped_t); + + setBlue(&rgb, (ih == 2)?clamped_t: + (ih == 3 || ih == 4)?clampedBrightness: + (ih == 5)?clamped_q: + clamped_p); + } + return rgb; + } + + __kernel void Contrast(__global CLPixelType *im, const unsigned int sharpen) + { + + const int sign = sharpen!=0?1:-1; + const int x = get_global_id(0); + const int y = get_global_id(1); + const int columns = get_global_size(0); + const int c = x + y * columns; + + CLPixelType pixel = im[c]; + float3 HueSaturationBrightness = ConvertRGBToHSB(pixel); + float brightness = HueSaturationBrightness.z; + brightness+=0.5f*sign*(0.5f*(sinpi(brightness-0.5f)+1.0f)-brightness); + brightness = clamp(brightness,0.0f,1.0f); + HueSaturationBrightness.z = brightness; + + CLPixelType filteredPixel = ConvertHSBToRGB(HueSaturationBrightness); + filteredPixel.w = pixel.w; + im[c] = filteredPixel; + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n t r a s t S t r e t c h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + /* + */ + __kernel void Histogram(__global CLPixelType * restrict im, + const ChannelType channel, + const int method, + const int colorspace, + __global uint4 * restrict histogram) + { + const int x = get_global_id(0); + const int y = get_global_id(1); + const int columns = get_global_size(0); + const int c = x + y * columns; + if ((channel & SyncChannels) != 0) + { + float intensity = GetPixelIntensity(method, colorspace,im[c]); + uint pos = ScaleQuantumToMap(ClampToQuantum(intensity)); + atomic_inc((__global uint *)(&(histogram[pos]))+2); //red position + } + else + { + // for equalizing, we always need all channels? + // otherwise something more + } + } + ) + + STRINGIFY( + /* + */ + __kernel void ContrastStretch(__global CLPixelType * restrict im, + const ChannelType channel, + __global CLPixelType * restrict stretch_map, + const float4 white, const float4 black) + { + const int x = get_global_id(0); + const int y = get_global_id(1); + const int columns = get_global_size(0); + const int c = x + y * columns; + + uint ePos; + CLPixelType oValue, eValue; + CLQuantum red, green, blue, opacity; + + //read from global + oValue=im[c]; + + if ((channel & RedChannel) != 0) + { + if (getRedF4(white) != getRedF4(black)) + { + ePos = ScaleQuantumToMap(getRed(oValue)); + eValue = stretch_map[ePos]; + red = getRed(eValue); + } + } + + if ((channel & GreenChannel) != 0) + { + if (getGreenF4(white) != getGreenF4(black)) + { + ePos = ScaleQuantumToMap(getGreen(oValue)); + eValue = stretch_map[ePos]; + green = getGreen(eValue); + } + } + + if ((channel & BlueChannel) != 0) + { + if (getBlueF4(white) != getBlueF4(black)) + { + ePos = ScaleQuantumToMap(getBlue(oValue)); + eValue = stretch_map[ePos]; + blue = getBlue(eValue); + } + } + + if ((channel & OpacityChannel) != 0) + { + if (getOpacityF4(white) != getOpacityF4(black)) + { + ePos = ScaleQuantumToMap(getOpacity(oValue)); + eValue = stretch_map[ePos]; + opacity = getOpacity(eValue); + } + } + + //write back + im[c]=(CLPixelType)(blue, green, red, opacity); + + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v o l v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + __kernel + void ConvolveOptimized(const __global CLPixelType *input, __global CLPixelType *output, + const unsigned int imageWidth, const unsigned int imageHeight, + __constant float *filter, const unsigned int filterWidth, const unsigned int filterHeight, + const uint matte, const ChannelType channel, __local CLPixelType *pixelLocalCache, __local float* filterCache) { + + int2 blockID; + blockID.x = get_group_id(0); + blockID.y = get_group_id(1); + + // image area processed by this workgroup + int2 imageAreaOrg; + imageAreaOrg.x = blockID.x * get_local_size(0); + imageAreaOrg.y = blockID.y * get_local_size(1); + + int2 midFilterDimen; + midFilterDimen.x = (filterWidth-1)/2; + midFilterDimen.y = (filterHeight-1)/2; + + int2 cachedAreaOrg = imageAreaOrg - midFilterDimen; + + // dimension of the local cache + int2 cachedAreaDimen; + cachedAreaDimen.x = get_local_size(0) + filterWidth - 1; + cachedAreaDimen.y = get_local_size(1) + filterHeight - 1; + + // cache the pixels accessed by this workgroup in local memory + int localID = get_local_id(1)*get_local_size(0)+get_local_id(0); + int cachedAreaNumPixels = cachedAreaDimen.x * cachedAreaDimen.y; + int groupSize = get_local_size(0) * get_local_size(1); + for (int i = localID; i < cachedAreaNumPixels; i+=groupSize) { + + int2 cachedAreaIndex; + cachedAreaIndex.x = i % cachedAreaDimen.x; + cachedAreaIndex.y = i / cachedAreaDimen.x; + + int2 imagePixelIndex; + imagePixelIndex = cachedAreaOrg + cachedAreaIndex; + + // only support EdgeVirtualPixelMethod through ClampToCanvas + // TODO: implement other virtual pixel method + imagePixelIndex.x = ClampToCanvas(imagePixelIndex.x, imageWidth); + imagePixelIndex.y = ClampToCanvas(imagePixelIndex.y, imageHeight); + + pixelLocalCache[i] = input[imagePixelIndex.y * imageWidth + imagePixelIndex.x]; + } + + // cache the filter + for (int i = localID; i < filterHeight*filterWidth; i+=groupSize) { + filterCache[i] = filter[i]; + } + barrier(CLK_LOCAL_MEM_FENCE); + + + int2 imageIndex; + imageIndex.x = imageAreaOrg.x + get_local_id(0); + imageIndex.y = imageAreaOrg.y + get_local_id(1); + + // if out-of-range, stops here and quit + if (imageIndex.x >= imageWidth + || imageIndex.y >= imageHeight) { + return; + } + + int filterIndex = 0; + float4 sum = (float4)0.0f; + float gamma = 0.0f; + if (((channel & OpacityChannel) == 0) || (matte == 0)) { + int cacheIndexY = get_local_id(1); + for (int j = 0; j < filterHeight; j++) { + int cacheIndexX = get_local_id(0); + for (int i = 0; i < filterWidth; i++) { + CLPixelType p = pixelLocalCache[cacheIndexY*cachedAreaDimen.x + cacheIndexX]; + float f = filterCache[filterIndex]; + + sum.x += f * p.x; + sum.y += f * p.y; + sum.z += f * p.z; + sum.w += f * p.w; + + gamma += f; + filterIndex++; + cacheIndexX++; + } + cacheIndexY++; + } + } + else { + int cacheIndexY = get_local_id(1); + for (int j = 0; j < filterHeight; j++) { + int cacheIndexX = get_local_id(0); + for (int i = 0; i < filterWidth; i++) { + + CLPixelType p = pixelLocalCache[cacheIndexY*cachedAreaDimen.x + cacheIndexX]; + float alpha = QuantumScale*(QuantumRange-p.w); + float f = filterCache[filterIndex]; + float g = alpha * f; + + sum.x += g*p.x; + sum.y += g*p.y; + sum.z += g*p.z; + sum.w += f*p.w; + + gamma += g; + filterIndex++; + cacheIndexX++; + } + cacheIndexY++; + } + gamma = PerceptibleReciprocal(gamma); + sum.xyz = gamma*sum.xyz; + } + CLPixelType outputPixel; + outputPixel.x = ClampToQuantum(sum.x); + outputPixel.y = ClampToQuantum(sum.y); + outputPixel.z = ClampToQuantum(sum.z); + outputPixel.w = ((channel & OpacityChannel)!=0)?ClampToQuantum(sum.w):input[imageIndex.y * imageWidth + imageIndex.x].w; + + output[imageIndex.y * imageWidth + imageIndex.x] = outputPixel; + } + ) + + STRINGIFY( + __kernel + void Convolve(const __global CLPixelType *input, __global CLPixelType *output, + const uint imageWidth, const uint imageHeight, + __constant float *filter, const unsigned int filterWidth, const unsigned int filterHeight, + const uint matte, const ChannelType channel) { + + int2 imageIndex; + imageIndex.x = get_global_id(0); + imageIndex.y = get_global_id(1); + + /* + unsigned int imageWidth = get_global_size(0); + unsigned int imageHeight = get_global_size(1); + */ + if (imageIndex.x >= imageWidth + || imageIndex.y >= imageHeight) + return; + + int2 midFilterDimen; + midFilterDimen.x = (filterWidth-1)/2; + midFilterDimen.y = (filterHeight-1)/2; + + int filterIndex = 0; + float4 sum = (float4)0.0f; + float gamma = 0.0f; + if (((channel & OpacityChannel) == 0) || (matte == 0)) { + for (int j = 0; j < filterHeight; j++) { + int2 inputPixelIndex; + inputPixelIndex.y = imageIndex.y - midFilterDimen.y + j; + inputPixelIndex.y = ClampToCanvas(inputPixelIndex.y, imageHeight); + for (int i = 0; i < filterWidth; i++) { + inputPixelIndex.x = imageIndex.x - midFilterDimen.x + i; + inputPixelIndex.x = ClampToCanvas(inputPixelIndex.x, imageWidth); + + CLPixelType p = input[inputPixelIndex.y * imageWidth + inputPixelIndex.x]; + float f = filter[filterIndex]; + + sum.x += f * p.x; + sum.y += f * p.y; + sum.z += f * p.z; + sum.w += f * p.w; + + gamma += f; + + filterIndex++; + } + } + } + else { + + for (int j = 0; j < filterHeight; j++) { + int2 inputPixelIndex; + inputPixelIndex.y = imageIndex.y - midFilterDimen.y + j; + inputPixelIndex.y = ClampToCanvas(inputPixelIndex.y, imageHeight); + for (int i = 0; i < filterWidth; i++) { + inputPixelIndex.x = imageIndex.x - midFilterDimen.x + i; + inputPixelIndex.x = ClampToCanvas(inputPixelIndex.x, imageWidth); + + CLPixelType p = input[inputPixelIndex.y * imageWidth + inputPixelIndex.x]; + float alpha = QuantumScale*(QuantumRange-p.w); + float f = filter[filterIndex]; + float g = alpha * f; + + sum.x += g*p.x; + sum.y += g*p.y; + sum.z += g*p.z; + sum.w += f*p.w; + + gamma += g; + + + filterIndex++; + } + } + gamma = PerceptibleReciprocal(gamma); + sum.xyz = gamma*sum.xyz; + } + + CLPixelType outputPixel; + outputPixel.x = ClampToQuantum(sum.x); + outputPixel.y = ClampToQuantum(sum.y); + outputPixel.z = ClampToQuantum(sum.z); + outputPixel.w = ((channel & OpacityChannel)!=0)?ClampToQuantum(sum.w):input[imageIndex.y * imageWidth + imageIndex.x].w; + + output[imageIndex.y * imageWidth + imageIndex.x] = outputPixel; + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s p e c k l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + + __kernel void HullPass1(const __global CLPixelType *inputImage, __global CLPixelType *outputImage + , const unsigned int imageWidth, const unsigned int imageHeight + , const int2 offset, const int polarity, const int matte) { + + int x = get_global_id(0); + int y = get_global_id(1); + + CLPixelType v = inputImage[y*imageWidth+x]; + + int2 neighbor; + neighbor.y = y + offset.y; + neighbor.x = x + offset.x; + + int2 clampedNeighbor; + clampedNeighbor.x = ClampToCanvas(neighbor.x, imageWidth); + clampedNeighbor.y = ClampToCanvas(neighbor.y, imageHeight); + + CLPixelType r = (clampedNeighbor.x == neighbor.x + && clampedNeighbor.y == neighbor.y)?inputImage[clampedNeighbor.y*imageWidth+clampedNeighbor.x] + :(CLPixelType)0; + + int sv[4]; + sv[0] = (int)v.x; + sv[1] = (int)v.y; + sv[2] = (int)v.z; + sv[3] = (int)v.w; + + int sr[4]; + sr[0] = (int)r.x; + sr[1] = (int)r.y; + sr[2] = (int)r.z; + sr[3] = (int)r.w; + + if (polarity > 0) { + \n #pragma unroll 4\n + for (unsigned int i = 0; i < 4; i++) { + sv[i] = (sr[i] >= (sv[i]+ScaleCharToQuantum(2)))?(sv[i]+ScaleCharToQuantum(1)):sv[i]; + } + } + else { + \n #pragma unroll 4\n + for (unsigned int i = 0; i < 4; i++) { + sv[i] = (sr[i] <= (sv[i]-ScaleCharToQuantum(2)))?(sv[i]-ScaleCharToQuantum(1)):sv[i]; + } + + } + + v.x = (CLQuantum)sv[0]; + v.y = (CLQuantum)sv[1]; + v.z = (CLQuantum)sv[2]; + + if (matte!=0) + v.w = (CLQuantum)sv[3]; + + outputImage[y*imageWidth+x] = v; + + } + + + ) + + + + STRINGIFY( + + __kernel void HullPass2(const __global CLPixelType *inputImage, __global CLPixelType *outputImage + , const unsigned int imageWidth, const unsigned int imageHeight + , const int2 offset, const int polarity, const int matte) { + + int x = get_global_id(0); + int y = get_global_id(1); + + CLPixelType v = inputImage[y*imageWidth+x]; + + int2 neighbor, clampedNeighbor; + + neighbor.y = y + offset.y; + neighbor.x = x + offset.x; + clampedNeighbor.x = ClampToCanvas(neighbor.x, imageWidth); + clampedNeighbor.y = ClampToCanvas(neighbor.y, imageHeight); + + CLPixelType r = (clampedNeighbor.x == neighbor.x + && clampedNeighbor.y == neighbor.y)?inputImage[clampedNeighbor.y*imageWidth+clampedNeighbor.x] + :(CLPixelType)0; + + + neighbor.y = y - offset.y; + neighbor.x = x - offset.x; + clampedNeighbor.x = ClampToCanvas(neighbor.x, imageWidth); + clampedNeighbor.y = ClampToCanvas(neighbor.y, imageHeight); + + CLPixelType s = (clampedNeighbor.x == neighbor.x + && clampedNeighbor.y == neighbor.y)?inputImage[clampedNeighbor.y*imageWidth+clampedNeighbor.x] + :(CLPixelType)0; + + + int sv[4]; + sv[0] = (int)v.x; + sv[1] = (int)v.y; + sv[2] = (int)v.z; + sv[3] = (int)v.w; + + int sr[4]; + sr[0] = (int)r.x; + sr[1] = (int)r.y; + sr[2] = (int)r.z; + sr[3] = (int)r.w; + + int ss[4]; + ss[0] = (int)s.x; + ss[1] = (int)s.y; + ss[2] = (int)s.z; + ss[3] = (int)s.w; + + if (polarity > 0) { + \n #pragma unroll 4\n + for (unsigned int i = 0; i < 4; i++) { + //sv[i] = (ss[i] >= (sv[i]+ScaleCharToQuantum(2)) && sr[i] > sv[i] ) ? (sv[i]+ScaleCharToQuantum(1)):sv[i]; + // + //sv[i] =(!( (int)(ss[i] >= (sv[i]+ScaleCharToQuantum(2))) && (int) (sr[i] > sv[i] ) )) ? sv[i]:(sv[i]+ScaleCharToQuantum(1)); + //sv[i] =(( (int)( ss[i] < (sv[i]+ScaleCharToQuantum(2))) || (int) ( sr[i] <= sv[i] ) )) ? sv[i]:(sv[i]+ScaleCharToQuantum(1)); + sv[i] =(( (int)( ss[i] < (sv[i]+ScaleCharToQuantum(2))) + (int) ( sr[i] <= sv[i] ) ) !=0) ? sv[i]:(sv[i]+ScaleCharToQuantum(1)); + } + } + else { + \n #pragma unroll 4\n + for (unsigned int i = 0; i < 4; i++) { + //sv[i] = (ss[i] <= (sv[i]-ScaleCharToQuantum(2)) && sr[i] < sv[i] ) ? (sv[i]-ScaleCharToQuantum(1)):sv[i]; + // + //sv[i] = ( (int)(ss[i] <= (sv[i]-ScaleCharToQuantum(2)) ) + (int)( sr[i] < sv[i] ) ==0) ? sv[i]:(sv[i]-ScaleCharToQuantum(1)); + sv[i] = (( (int)(ss[i] > (sv[i]-ScaleCharToQuantum(2))) + (int)( sr[i] >= sv[i] )) !=0) ? sv[i]:(sv[i]-ScaleCharToQuantum(1)); + } + } + + v.x = (CLQuantum)sv[0]; + v.y = (CLQuantum)sv[1]; + v.z = (CLQuantum)sv[2]; + + if (matte!=0) + v.w = (CLQuantum)sv[3]; + + outputImage[y*imageWidth+x] = v; + + } + + + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E q u a l i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + /* + */ + __kernel void Equalize(__global CLPixelType * restrict im, + const ChannelType channel, + __global CLPixelType * restrict equalize_map, + const float4 white, const float4 black) + { + const int x = get_global_id(0); + const int y = get_global_id(1); + const int columns = get_global_size(0); + const int c = x + y * columns; + + uint ePos; + CLPixelType oValue, eValue; + CLQuantum red, green, blue, opacity; + + //read from global + oValue=im[c]; + + if ((channel & SyncChannels) != 0) + { + if (getRedF4(white) != getRedF4(black)) + { + ePos = ScaleQuantumToMap(getRed(oValue)); + eValue = equalize_map[ePos]; + red = getRed(eValue); + ePos = ScaleQuantumToMap(getGreen(oValue)); + eValue = equalize_map[ePos]; + green = getRed(eValue); + ePos = ScaleQuantumToMap(getBlue(oValue)); + eValue = equalize_map[ePos]; + blue = getRed(eValue); + ePos = ScaleQuantumToMap(getOpacity(oValue)); + eValue = equalize_map[ePos]; + opacity = getRed(eValue); + + //write back + im[c]=(CLPixelType)(blue, green, red, opacity); + } + + } + + // for equalizing, we always need all channels? + // otherwise something more + + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% F u n c t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + + /* + apply FunctionImageChannel(braightness-contrast) + */ + CLPixelType ApplyFunction(CLPixelType pixel,const MagickFunction function, + const unsigned int number_parameters, + __constant float *parameters) + { + float4 result = (float4) 0.0f; + switch (function) + { + case PolynomialFunction: + { + for (unsigned int i=0; i < number_parameters; i++) + result = result*(float4)QuantumScale*convert_float4(pixel) + parameters[i]; + result *= (float4)QuantumRange; + break; + } + case SinusoidFunction: + { + float freq,phase,ampl,bias; + freq = ( number_parameters >= 1 ) ? parameters[0] : 1.0f; + phase = ( number_parameters >= 2 ) ? parameters[1] : 0.0f; + ampl = ( number_parameters >= 3 ) ? parameters[2] : 0.5f; + bias = ( number_parameters >= 4 ) ? parameters[3] : 0.5f; + result.x = QuantumRange*(ampl*sin(2.0f*MagickPI* + (freq*QuantumScale*(float)pixel.x + phase/360.0f)) + bias); + result.y = QuantumRange*(ampl*sin(2.0f*MagickPI* + (freq*QuantumScale*(float)pixel.y + phase/360.0f)) + bias); + result.z = QuantumRange*(ampl*sin(2.0f*MagickPI* + (freq*QuantumScale*(float)pixel.z + phase/360.0f)) + bias); + result.w = QuantumRange*(ampl*sin(2.0f*MagickPI* + (freq*QuantumScale*(float)pixel.w + phase/360.0f)) + bias); + break; + } + case ArcsinFunction: + { + float width,range,center,bias; + width = ( number_parameters >= 1 ) ? parameters[0] : 1.0f; + center = ( number_parameters >= 2 ) ? parameters[1] : 0.5f; + range = ( number_parameters >= 3 ) ? parameters[2] : 1.0f; + bias = ( number_parameters >= 4 ) ? parameters[3] : 0.5f; + + result.x = 2.0f/width*(QuantumScale*(float)pixel.x - center); + result.x = range/MagickPI*asin(result.x)+bias; + result.x = ( result.x <= -1.0f ) ? bias - range/2.0f : result.x; + result.x = ( result.x >= 1.0f ) ? bias + range/2.0f : result.x; + + result.y = 2.0f/width*(QuantumScale*(float)pixel.y - center); + result.y = range/MagickPI*asin(result.y)+bias; + result.y = ( result.y <= -1.0f ) ? bias - range/2.0f : result.y; + result.y = ( result.y >= 1.0f ) ? bias + range/2.0f : result.y; + + result.z = 2.0f/width*(QuantumScale*(float)pixel.z - center); + result.z = range/MagickPI*asin(result.z)+bias; + result.z = ( result.z <= -1.0f ) ? bias - range/2.0f : result.x; + result.z = ( result.z >= 1.0f ) ? bias + range/2.0f : result.x; + + + result.w = 2.0f/width*(QuantumScale*(float)pixel.w - center); + result.w = range/MagickPI*asin(result.w)+bias; + result.w = ( result.w <= -1.0f ) ? bias - range/2.0f : result.w; + result.w = ( result.w >= 1.0f ) ? bias + range/2.0f : result.w; + + result *= (float4)QuantumRange; + break; + } + case ArctanFunction: + { + float slope,range,center,bias; + slope = ( number_parameters >= 1 ) ? parameters[0] : 1.0f; + center = ( number_parameters >= 2 ) ? parameters[1] : 0.5f; + range = ( number_parameters >= 3 ) ? parameters[2] : 1.0f; + bias = ( number_parameters >= 4 ) ? parameters[3] : 0.5f; + result = (float4)MagickPI*(float4)slope*((float4)QuantumScale*convert_float4(pixel)-(float4)center); + result = (float4)QuantumRange*((float4)range/(float4)MagickPI*atan(result) + (float4)bias); + break; + } + case UndefinedFunction: + break; + } + return (CLPixelType) (ClampToQuantum(result.x), ClampToQuantum(result.y), + ClampToQuantum(result.z), ClampToQuantum(result.w)); + } + ) + + STRINGIFY( + /* + Improve brightness / contrast of the image + channel : define which channel is improved + function : the function called to enchance the brightness contrast + number_parameters : numbers of parameters + parameters : the parameter + */ + __kernel void ComputeFunction(__global CLPixelType *im, + const ChannelType channel, const MagickFunction function, + const unsigned int number_parameters, __constant float *parameters) + { + const int x = get_global_id(0); + const int y = get_global_id(1); + const int columns = get_global_size(0); + const int c = x + y * columns; + im[c] = ApplyFunction(im[c], function, number_parameters, parameters); + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G r a y s c a l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + __kernel void Grayscale(__global CLPixelType *im, + const int method, const int colorspace) + { + + const int x = get_global_id(0); + const int y = get_global_id(1); + const int columns = get_global_size(0); + const int c = x + y * columns; + + CLPixelType pixel = im[c]; + + float + blue, + green, + intensity, + red; + + red=(float)getRed(pixel); + green=(float)getGreen(pixel); + blue=(float)getBlue(pixel); + + intensity=0.0; + + CLPixelType filteredPixel; + + switch (method) + { + case AveragePixelIntensityMethod: + { + intensity=(red+green+blue)/3.0; + break; + } + case BrightnessPixelIntensityMethod: + { + intensity=MagickMax(MagickMax(red,green),blue); + break; + } + case LightnessPixelIntensityMethod: + { + intensity=(MagickMin(MagickMin(red,green),blue)+ + MagickMax(MagickMax(red,green),blue))/2.0; + break; + } + case MSPixelIntensityMethod: + { + intensity=(float) (((float) red*red+green*green+ + blue*blue)/(3.0*QuantumRange)); + break; + } + case Rec601LumaPixelIntensityMethod: + { + /* + if (colorspace == RGBColorspace) + { + red=EncodePixelGamma(red); + green=EncodePixelGamma(green); + blue=EncodePixelGamma(blue); + } + */ + intensity=0.298839*red+0.586811*green+0.114350*blue; + break; + } + case Rec601LuminancePixelIntensityMethod: + { + /* + if (image->colorspace == sRGBColorspace) + { + red=DecodePixelGamma(red); + green=DecodePixelGamma(green); + blue=DecodePixelGamma(blue); + } + */ + intensity=0.298839*red+0.586811*green+0.114350*blue; + break; + } + case Rec709LumaPixelIntensityMethod: + default: + { + /* + if (image->colorspace == RGBColorspace) + { + red=EncodePixelGamma(red); + green=EncodePixelGamma(green); + blue=EncodePixelGamma(blue); + } + */ + intensity=0.212656*red+0.715158*green+0.072186*blue; + break; + } + case Rec709LuminancePixelIntensityMethod: + { + /* + if (image->colorspace == sRGBColorspace) + { + red=DecodePixelGamma(red); + green=DecodePixelGamma(green); + blue=DecodePixelGamma(blue); + } + */ + intensity=0.212656*red+0.715158*green+0.072186*blue; + break; + } + case RMSPixelIntensityMethod: + { + intensity=(float) (sqrt((float) red*red+green*green+ + blue*blue)/sqrt(3.0)); + break; + } + + } + + setGray(&filteredPixel, ClampToQuantum(intensity)); + + filteredPixel.w = pixel.w; + + im[c] = filteredPixel; + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L o c a l C o n t r a s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + static inline int mirrorBottom(int value) + { + return (value < 0) ? - (value) : value; + } + static inline int mirrorTop(int value, int width) + { + return (value >= width) ? (2 * width - value - 1) : value; + } + + __kernel void LocalContrastBlurRow(__global CLPixelType *srcImage, __global CLPixelType *dstImage, __global float *tmpImage, + const int radius, + const int imageWidth, + const int imageHeight) + { + const float4 RGB = ((float4)(0.2126f, 0.7152f, 0.0722f, 0.0f)); + + int x = get_local_id(0); + int y = get_global_id(1); + + if ((x >= imageWidth) || (y >= imageHeight)) + return; + + global CLPixelType *src = srcImage + y * imageWidth; + + for (int i = x; i < imageWidth; i += get_local_size(0)) { + float sum = 0.0f; + float weight = 1.0f; + + int j = i - radius; + while ((j + 7) < i) { + for (int k = 0; k < 8; ++k) // Unroll 8x + sum += (weight + k) * dot(RGB, convert_float4(src[mirrorBottom(j+k)])); + weight += 8.0f; + j+=8; + } + while (j < i) { + sum += weight * dot(RGB, convert_float4(src[mirrorBottom(j)])); + weight += 1.0f; + ++j; + } + + while ((j + 7) < radius + i) { + for (int k = 0; k < 8; ++k) // Unroll 8x + sum += (weight - k) * dot(RGB, convert_float4(src[mirrorTop(j + k, imageWidth)])); + weight -= 8.0f; + j+=8; + } + while (j < radius + i) { + sum += weight * dot(RGB, convert_float4(src[mirrorTop(j, imageWidth)])); + weight -= 1.0f; + ++j; + } + + tmpImage[i + y * imageWidth] = sum / ((radius + 1) * (radius + 1)); + } + } + ) + + STRINGIFY( + __kernel void LocalContrastBlurApplyColumn(__global CLPixelType *srcImage, __global CLPixelType *dstImage, __global float *blurImage, + const int radius, + const float strength, + const int imageWidth, + const int imageHeight) + { + const float4 RGB = (float4)(0.2126f, 0.7152f, 0.0722f, 0.0f); + + int x = get_global_id(0); + int y = get_global_id(1); + + if ((x >= imageWidth) || (y >= imageHeight)) + return; + + global float *src = blurImage + x; + + float sum = 0.0f; + float weight = 1.0f; + + int j = y - radius; + while ((j + 7) < y) { + for (int k = 0; k < 8; ++k) // Unroll 8x + sum += (weight + k) * src[mirrorBottom(j+k) * imageWidth]; + weight += 8.0f; + j+=8; + } + while (j < y) { + sum += weight * src[mirrorBottom(j) * imageWidth]; + weight += 1.0f; + ++j; + } + + while ((j + 7) < radius + y) { + for (int k = 0; k < 8; ++k) // Unroll 8x + sum += (weight - k) * src[mirrorTop(j + k, imageHeight) * imageWidth]; + weight -= 8.0f; + j+=8; + } + while (j < radius + y) { + sum += weight * src[mirrorTop(j, imageHeight) * imageWidth]; + weight -= 1.0f; + ++j; + } + + CLPixelType pixel = srcImage[x + y * imageWidth]; + float srcVal = dot(RGB, convert_float4(pixel)); + float mult = (srcVal - (sum / ((radius + 1) * (radius + 1)))) * (strength / 100.0f); + mult = (srcVal + mult) / srcVal; + + pixel.x = ClampToQuantum(pixel.x * mult); + pixel.y = ClampToQuantum(pixel.y * mult); + pixel.z = ClampToQuantum(pixel.z * mult); + + dstImage[x + y * imageWidth] = pixel; + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M o d u l a t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + + static inline void ConvertRGBToHSL(const CLQuantum red,const CLQuantum green, const CLQuantum blue, + float *hue, float *saturation, float *lightness) + { + float + c, + tmax, + tmin; + + /* + Convert RGB to HSL colorspace. + */ + tmax=MagickMax(QuantumScale*red,MagickMax(QuantumScale*green, QuantumScale*blue)); + tmin=MagickMin(QuantumScale*red,MagickMin(QuantumScale*green, QuantumScale*blue)); + + c=tmax-tmin; + + *lightness=(tmax+tmin)/2.0; + if (c <= 0.0) + { + *hue=0.0; + *saturation=0.0; + return; + } + + if (tmax == (QuantumScale*red)) + { + *hue=(QuantumScale*green-QuantumScale*blue)/c; + if ((QuantumScale*green) < (QuantumScale*blue)) + *hue+=6.0; + } + else + if (tmax == (QuantumScale*green)) + *hue=2.0+(QuantumScale*blue-QuantumScale*red)/c; + else + *hue=4.0+(QuantumScale*red-QuantumScale*green)/c; + + *hue*=60.0/360.0; + if (*lightness <= 0.5) + *saturation=c/(2.0*(*lightness)); + else + *saturation=c/(2.0-2.0*(*lightness)); + } + + static inline void ConvertHSLToRGB(const float hue,const float saturation, const float lightness, + CLQuantum *red,CLQuantum *green,CLQuantum *blue) + { + float + b, + c, + g, + h, + tmin, + r, + x; + + /* + Convert HSL to RGB colorspace. + */ + h=hue*360.0; + if (lightness <= 0.5) + c=2.0*lightness*saturation; + else + c=(2.0-2.0*lightness)*saturation; + tmin=lightness-0.5*c; + h-=360.0*floor(h/360.0); + h/=60.0; + x=c*(1.0-fabs(h-2.0*floor(h/2.0)-1.0)); + switch ((int) floor(h) % 6) + { + case 0: + { + r=tmin+c; + g=tmin+x; + b=tmin; + break; + } + case 1: + { + r=tmin+x; + g=tmin+c; + b=tmin; + break; + } + case 2: + { + r=tmin; + g=tmin+c; + b=tmin+x; + break; + } + case 3: + { + r=tmin; + g=tmin+x; + b=tmin+c; + break; + } + case 4: + { + r=tmin+x; + g=tmin; + b=tmin+c; + break; + } + case 5: + { + r=tmin+c; + g=tmin; + b=tmin+x; + break; + } + default: + { + r=0.0; + g=0.0; + b=0.0; + } + } + *red=ClampToQuantum(QuantumRange*r); + *green=ClampToQuantum(QuantumRange*g); + *blue=ClampToQuantum(QuantumRange*b); + } + + static inline void ModulateHSL(const float percent_hue, const float percent_saturation,const float percent_lightness, + CLQuantum *red,CLQuantum *green,CLQuantum *blue) + { + float + hue, + lightness, + saturation; + + /* + Increase or decrease color lightness, saturation, or hue. + */ + ConvertRGBToHSL(*red,*green,*blue,&hue,&saturation,&lightness); + hue+=0.5*(0.01*percent_hue-1.0); + while (hue < 0.0) + hue+=1.0; + while (hue >= 1.0) + hue-=1.0; + saturation*=0.01*percent_saturation; + lightness*=0.01*percent_lightness; + ConvertHSLToRGB(hue,saturation,lightness,red,green,blue); + } + + __kernel void Modulate(__global CLPixelType *im, + const float percent_brightness, + const float percent_hue, + const float percent_saturation, + const int colorspace) + { + + const int x = get_global_id(0); + const int y = get_global_id(1); + const int columns = get_global_size(0); + const int c = x + y * columns; + + CLPixelType pixel = im[c]; + + CLQuantum + blue, + green, + red; + + red=getRed(pixel); + green=getGreen(pixel); + blue=getBlue(pixel); + + switch (colorspace) + { + case HSLColorspace: + default: + { + ModulateHSL(percent_hue, percent_saturation, percent_brightness, + &red, &green, &blue); + } + + } + + CLPixelType filteredPixel; + + setRed(&filteredPixel, red); + setGreen(&filteredPixel, green); + setBlue(&filteredPixel, blue); + filteredPixel.w = pixel.w; + + im[c] = filteredPixel; + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M o t i o n B l u r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + __kernel + void MotionBlur(const __global CLPixelType *input, __global CLPixelType *output, + const unsigned int imageWidth, const unsigned int imageHeight, + const __global float *filter, const unsigned int width, const __global int2* offset, + const float4 bias, + const ChannelType channel, const unsigned int matte) { + + int2 currentPixel; + currentPixel.x = get_global_id(0); + currentPixel.y = get_global_id(1); + + if (currentPixel.x >= imageWidth + || currentPixel.y >= imageHeight) + return; + + float4 pixel; + pixel.x = (float)bias.x; + pixel.y = (float)bias.y; + pixel.z = (float)bias.z; + pixel.w = (float)bias.w; + + if (((channel & OpacityChannel) == 0) || (matte == 0)) { + + for (int i = 0; i < width; i++) { + // only support EdgeVirtualPixelMethod through ClampToCanvas + // TODO: implement other virtual pixel method + int2 samplePixel = currentPixel + offset[i]; + samplePixel.x = ClampToCanvas(samplePixel.x, imageWidth); + samplePixel.y = ClampToCanvas(samplePixel.y, imageHeight); + CLPixelType samplePixelValue = input[ samplePixel.y * imageWidth + samplePixel.x]; + + pixel.x += (filter[i] * (float)samplePixelValue.x); + pixel.y += (filter[i] * (float)samplePixelValue.y); + pixel.z += (filter[i] * (float)samplePixelValue.z); + pixel.w += (filter[i] * (float)samplePixelValue.w); + } + + CLPixelType outputPixel; + outputPixel.x = ClampToQuantum(pixel.x); + outputPixel.y = ClampToQuantum(pixel.y); + outputPixel.z = ClampToQuantum(pixel.z); + outputPixel.w = ClampToQuantum(pixel.w); + output[currentPixel.y * imageWidth + currentPixel.x] = outputPixel; + } + else { + + float gamma = 0.0f; + for (int i = 0; i < width; i++) { + // only support EdgeVirtualPixelMethod through ClampToCanvas + // TODO: implement other virtual pixel method + int2 samplePixel = currentPixel + offset[i]; + samplePixel.x = ClampToCanvas(samplePixel.x, imageWidth); + samplePixel.y = ClampToCanvas(samplePixel.y, imageHeight); + + CLPixelType samplePixelValue = input[ samplePixel.y * imageWidth + samplePixel.x]; + + float alpha = QuantumScale*(QuantumRange-samplePixelValue.w); + float k = filter[i]; + pixel.x = pixel.x + k * alpha * samplePixelValue.x; + pixel.y = pixel.y + k * alpha * samplePixelValue.y; + pixel.z = pixel.z + k * alpha * samplePixelValue.z; + + pixel.w += k * alpha * samplePixelValue.w; + + gamma+=k*alpha; + } + gamma = PerceptibleReciprocal(gamma); + pixel.xyz = gamma*pixel.xyz; + + CLPixelType outputPixel; + outputPixel.x = ClampToQuantum(pixel.x); + outputPixel.y = ClampToQuantum(pixel.y); + outputPixel.z = ClampToQuantum(pixel.z); + outputPixel.w = ClampToQuantum(pixel.w); + output[currentPixel.y * imageWidth + currentPixel.x] = outputPixel; + } + } + ) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R a d i a l B l u r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + + STRINGIFY( + __kernel void RadialBlur(const __global CLPixelType *im, __global CLPixelType *filtered_im, + const float4 bias, + const unsigned int channel, const unsigned int matte, + const float2 blurCenter, + __constant float *cos_theta, __constant float *sin_theta, + const unsigned int cossin_theta_size) + { + const int x = get_global_id(0); + const int y = get_global_id(1); + const int columns = get_global_size(0); + const int rows = get_global_size(1); + unsigned int step = 1; + float center_x = (float) x - blurCenter.x; + float center_y = (float) y - blurCenter.y; + float radius = hypot(center_x, center_y); + + //float blur_radius = hypot((float) columns/2.0f, (float) rows/2.0f); + float blur_radius = hypot(blurCenter.x, blurCenter.y); + + if (radius > MagickEpsilon) + { + step = (unsigned int) (blur_radius / radius); + if (step == 0) + step = 1; + if (step >= cossin_theta_size) + step = cossin_theta_size-1; + } + + float4 result; + result.x = (float)bias.x; + result.y = (float)bias.y; + result.z = (float)bias.z; + result.w = (float)bias.w; + float normalize = 0.0f; + + if (((channel & OpacityChannel) == 0) || (matte == 0)) { + for (unsigned int i=0; i= 0 + && groupStopY < imageRows) { + event_t e = async_work_group_strided_copy(cachedData + ,blurRowData+groupStartY*imageColumns+groupX + ,groupStopY-groupStartY,imageColumns,0); + wait_group_events(1,&e); + } + else { + for (int i = get_local_id(1); i < (groupStopY - groupStartY); i+=get_local_size(1)) { + cachedData[i] = blurRowData[ClampToCanvas(groupStartY+i,imageRows)*imageColumns+ groupX]; + } + barrier(CLK_LOCAL_MEM_FENCE); + } + // cache the filter as well + event_t e = async_work_group_copy(cachedFilter,filter,width,0); + wait_group_events(1,&e); + + // only do the work if this is not a patched item + //const int cy = get_group_id(1)*get_local_size(1)+get_local_id(1); + const int cy = get_global_id(1); + + if (cy < imageRows) { + float4 blurredPixel = (float4) 0.0f; + + int i = 0; + + \n #ifndef UFACTOR \n + \n #define UFACTOR 8 \n + \n #endif \n + + for ( ; i+UFACTOR < width; ) + { + \n #pragma unroll UFACTOR \n + for (int j=0; j < UFACTOR; j++, i++) + { + blurredPixel+=cachedFilter[i]*cachedData[i+get_local_id(1)]; + } + } + + for ( ; i < width; i++) + { + blurredPixel+=cachedFilter[i]*cachedData[i+get_local_id(1)]; + } + + blurredPixel = floor((float4)(ClampToQuantum(blurredPixel.x), ClampToQuantum(blurredPixel.y) + ,ClampToQuantum(blurredPixel.z), ClampToQuantum(blurredPixel.w))); + + float4 inputImagePixel = convert_float4(inputImage[cy*imageColumns+groupX]); + float4 outputPixel = inputImagePixel - blurredPixel; + + float quantumThreshold = QuantumRange*threshold; + + int4 mask = isless(fabs(2.0f*outputPixel), (float4)quantumThreshold); + outputPixel = select(inputImagePixel + outputPixel * gain, inputImagePixel, mask); + + //write back + filtered_im[cy*imageColumns+groupX] = (CLPixelType) (ClampToQuantum(outputPixel.x), ClampToQuantum(outputPixel.y) + ,ClampToQuantum(outputPixel.z), ClampToQuantum(outputPixel.w)); + + } + } + ) + + + + STRINGIFY( + __kernel void UnsharpMask(__global CLPixelType *im, __global CLPixelType *filtered_im, + __constant float *filter, + const unsigned int width, + const unsigned int imageColumns, const unsigned int imageRows, + __local float4 *pixels, + const float gain, const float threshold, const unsigned int justBlur) + { + const int x = get_global_id(0); + const int y = get_global_id(1); + + const unsigned int radius = (width - 1) / 2; + + int row = y - radius; + int baseRow = get_group_id(1) * get_local_size(1) - radius; + int endRow = (get_group_id(1) + 1) * get_local_size(1) + radius; + + while (row < endRow) { + int srcy = (row < 0) ? -row : row; // mirror pad + srcy = (srcy >= imageRows) ? (2 * imageRows - srcy - 1) : srcy; + + float4 value = 0.0f; + + int ix = x - radius; + int i = 0; + + while (i + 7 < width) { + for (int j = 0; j < 8; ++j) { // unrolled + int srcx = ix + j; + srcx = (srcx < 0) ? -srcx : srcx; + srcx = (srcx >= imageColumns) ? (2 * imageColumns - srcx - 1) : srcx; + value += filter[i + j] * convert_float4(im[srcx + srcy * imageColumns]); + } + ix += 8; + i += 8; + } + + while (i < width) { + int srcx = (ix < 0) ? -ix : ix; // mirror pad + srcx = (srcx >= imageColumns) ? (2 * imageColumns - srcx - 1) : srcx; + value += filter[i] * convert_float4(im[srcx + srcy * imageColumns]); + ++i; + ++ix; + } + pixels[(row - baseRow) * get_local_size(0) + get_local_id(0)] = value; + row += get_local_size(1); + } + + + barrier(CLK_LOCAL_MEM_FENCE); + + + const int px = get_local_id(0); + const int py = get_local_id(1); + const int prp = get_local_size(0); + float4 value = (float4)(0.0f); + + int i = 0; + while (i + 7 < width) { // unrolled + value += (float4)(filter[i]) * pixels[px + (py + i) * prp]; + value += (float4)(filter[i]) * pixels[px + (py + i + 1) * prp]; + value += (float4)(filter[i]) * pixels[px + (py + i + 2) * prp]; + value += (float4)(filter[i]) * pixels[px + (py + i + 3) * prp]; + value += (float4)(filter[i]) * pixels[px + (py + i + 4) * prp]; + value += (float4)(filter[i]) * pixels[px + (py + i + 5) * prp]; + value += (float4)(filter[i]) * pixels[px + (py + i + 6) * prp]; + value += (float4)(filter[i]) * pixels[px + (py + i + 7) * prp]; + i += 8; + } + while (i < width) { + value += (float4)(filter[i]) * pixels[px + (py + i) * prp]; + ++i; + } + if ((x < imageColumns) && (y < imageRows)) { + if (justBlur == 0) { // apply sharpening + float4 srcPixel = convert_float4(im[x + y * imageColumns]); + float4 diff = srcPixel - value; + + float quantumThreshold = QuantumRange*threshold; + + int4 mask = isless(fabs(2.0f * diff), (float4)quantumThreshold); + value = select(srcPixel + diff * gain, srcPixel, mask); + } + filtered_im[x + y * imageColumns] = (CLPixelType)(ClampToQuantum(value.s0), ClampToQuantum(value.s1), ClampToQuantum(value.s2), ClampToQuantum(value.s3)); + } + } + ) + + STRINGIFY( + __kernel __attribute__((reqd_work_group_size(64, 4, 1))) void WaveletDenoise(__global CLPixelType *srcImage, __global CLPixelType *dstImage, + const float threshold, + const int passes, + const int imageWidth, + const int imageHeight) + { + const int pad = (1 << (passes - 1)); + const int tileSize = 64; + const int tileRowPixels = 64; + const float noise[] = { 0.8002, 0.2735, 0.1202, 0.0585, 0.0291, 0.0152, 0.0080, 0.0044 }; + + CLPixelType stage[16]; + + local float buffer[64 * 64]; + + int srcx = (get_group_id(0) + get_global_offset(0) / tileSize) * (tileSize - 2 * pad) - pad + get_local_id(0); + int srcy = (get_group_id(1) + get_global_offset(1) / 4) * (tileSize - 2 * pad) - pad; + + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) { + stage[i / 4] = srcImage[mirrorTop(mirrorBottom(srcx), imageWidth) + (mirrorTop(mirrorBottom(srcy + i) , imageHeight)) * imageWidth]; + } + + + for (int channel = 0; channel < 3; ++channel) { + // Load LDS + switch (channel) { + case 0: + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) + buffer[get_local_id(0) + i * tileRowPixels] = convert_float(stage[i / 4].s0); + break; + case 1: + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) + buffer[get_local_id(0) + i * tileRowPixels] = convert_float(stage[i / 4].s1); + break; + case 2: + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) + buffer[get_local_id(0) + i * tileRowPixels] = convert_float(stage[i / 4].s2); + break; + } + + + // Process + + float tmp[16]; + float accum[16]; + float pixel; + + for (int pass = 0; pass < passes; ++pass) { + const int radius = 1 << pass; + const int x = get_local_id(0); + const float thresh = threshold * noise[pass]; + + if (pass == 0) + accum[0] = accum[1] = accum[2] = accum[3] = accum[4] = accum[5] = accum[6] = accum[6] = accum[7] = accum[8] = accum[9] = accum[10] = accum[11] = accum[12] = accum[13] = accum[14] = accum[15] = 0.0f; + + // Snapshot input + + // Apply horizontal hat + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) { + const int offset = i * tileRowPixels; + if (pass == 0) + tmp[i / 4] = buffer[x + offset]; // snapshot input on first pass + pixel = 0.5f * tmp[i / 4] + 0.25 * (buffer[mirrorBottom(x - radius) + offset] + buffer[mirrorTop(x + radius, tileSize) + offset]); + barrier(CLK_LOCAL_MEM_FENCE); + buffer[x + offset] = pixel; + } + barrier(CLK_LOCAL_MEM_FENCE); + // Apply vertical hat + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) { + pixel = 0.5f * buffer[x + i * tileRowPixels] + 0.25 * (buffer[x + mirrorBottom(i - radius) * tileRowPixels] + buffer[x + mirrorTop(i + radius, tileRowPixels) * tileRowPixels]); + float delta = tmp[i / 4] - pixel; + tmp[i / 4] = pixel; // hold output in tmp until all workitems are done + if (delta < -thresh) + delta += thresh; + else if (delta > thresh) + delta -= thresh; + else + delta = 0; + accum[i / 4] += delta; + + } + barrier(CLK_LOCAL_MEM_FENCE); + if (pass < passes - 1) + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) + buffer[x + i * tileRowPixels] = tmp[i / 4]; // store lowpass for next pass + else // last pass + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) + accum[i / 4] += tmp[i / 4]; // add the lowpass signal back to output + barrier(CLK_LOCAL_MEM_FENCE); + } + + switch (channel) { + case 0: + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) + stage[i / 4].s0 = ClampToQuantum(accum[i / 4]); + break; + case 1: + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) + stage[i / 4].s1 = ClampToQuantum(accum[i / 4]); + break; + case 2: + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) + stage[i / 4].s2 = ClampToQuantum(accum[i / 4]); + break; + } + + barrier(CLK_LOCAL_MEM_FENCE); + } + + // Write from stage to output + + if ((get_local_id(0) >= pad) && (get_local_id(0) < tileSize - pad) && (srcx >= 0) && (srcx < imageWidth)) { + //for (int i = pad + get_local_id(1); i < tileSize - pad; i += get_local_size(1)) { + for (int i = get_local_id(1); i < tileSize; i += get_local_size(1)) { + if ((i >= pad) && (i < tileSize - pad) && (srcy + i >= 0) && (srcy + i < imageHeight)) { + dstImage[srcx + (srcy + i) * imageWidth] = stage[i / 4]; + } + } + } + } + ) + ; + +#endif // MAGICKCORE_OPENCL_SUPPORT + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif // MAGICKCORE_ACCELERATE_PRIVATE_H diff --git a/ImageMagick-6.9.12-44/magick/accelerate-private.h b/ImageMagick-6.9.12-44/magick/accelerate-private.h new file mode 100644 index 0000000..462af2c --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/accelerate-private.h @@ -0,0 +1,73 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore acceleration methods. +*/ +#ifndef MAGICKCORE_ACCELERATE_PRIVATE_H +#define MAGICKCORE_ACCELERATE_PRIVATE_H + +#include "magick/morphology.h" +#include "magick/resample.h" +#include "magick/resize.h" +#include "magick/statistic.h" +#include "magick/visual-effects.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if defined(MAGICKCORE_OPENCL_SUPPORT) + +extern MagickPrivate Image + *AccelerateAddNoiseImage(const Image*,const ChannelType,const NoiseType, + ExceptionInfo *), + *AccelerateBlurImage(const Image *,const ChannelType,const double, + const double,ExceptionInfo *), + *AccelerateConvolveImageChannel(const Image *,const ChannelType, + const KernelInfo *,ExceptionInfo *), + *AccelerateDespeckleImage(const Image *,ExceptionInfo *), + *AccelerateLocalContrastImage(const Image *,const double,const double, + ExceptionInfo *), + *AccelerateMotionBlurImage(const Image*, const ChannelType, + const double*,const size_t,const OffsetInfo*,ExceptionInfo*), + *AccelerateRadialBlurImage(const Image *,const ChannelType,const double, + ExceptionInfo *), + *AccelerateResizeImage(const Image *,const size_t,const size_t, + const ResizeFilter *,ExceptionInfo *), + *AccelerateUnsharpMaskImage(const Image *,const ChannelType,const double, + const double,const double,const double,ExceptionInfo *), + *AccelerateWaveletDenoiseImage(const Image *,const double,ExceptionInfo *); + +extern MagickPrivate MagickBooleanType + AccelerateCompositeImage(Image *,const ChannelType,const CompositeOperator, + const Image *,const ssize_t,const ssize_t,const float,const float,ExceptionInfo *), + AccelerateContrastImage(Image *,const MagickBooleanType,ExceptionInfo *), + AccelerateContrastStretchImageChannel(Image *, const ChannelType, const double, const double, + ExceptionInfo*), + AccelerateEqualizeImage(Image *,const ChannelType,ExceptionInfo *), + AccelerateFunctionImage(Image *,const ChannelType,const MagickFunction, + const size_t,const double *,ExceptionInfo *), + AccelerateGrayscaleImage(Image*, const PixelIntensityMethod, + ExceptionInfo *), + AccelerateModulateImage(Image*, double, double, double, + ColorspaceType, ExceptionInfo*); + +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/accelerate.c b/ImageMagick-6.9.12-44/magick/accelerate.c new file mode 100644 index 0000000..c9cdd68 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/accelerate.c @@ -0,0 +1,5255 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% AAA CCCC CCCC EEEEE L EEEEE RRRR AAA TTTTT EEEEE % +% A A C C E L E R R A A T E % +% AAAAA C C EEE L EEE RRRR AAAAA T EEE % +% A A C C E L E R R A A T E % +% A A CCCC CCCC EEEEE LLLLL EEEEE R R A A T EEEEE % +% % +% % +% MagickCore Acceleration Methods % +% % +% Software Design % +% Cristy % +% SiuChi Chan % +% Guansong Zhang % +% January 2010 % +% Dirk Lemstra % +% May 2016 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +/* +Include declarations. +*/ +#include "magick/studio.h" +#include "magick/accelerate-private.h" +#include "magick/accelerate-kernels-private.h" +#include "magick/artifact.h" +#include "magick/cache.h" +#include "magick/cache-private.h" +#include "magick/cache-view.h" +#include "magick/color-private.h" +#include "magick/delegate-private.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/gem.h" +#include "magick/hashmap.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/memory_.h" +#include "magick/monitor-private.h" +#include "magick/opencl.h" +#include "magick/opencl-private.h" +#include "magick/option.h" +#include "magick/pixel-private.h" +#include "magick/prepress.h" +#include "magick/quantize.h" +#include "magick/random_.h" +#include "magick/random-private.h" +#include "magick/registry.h" +#include "magick/resize.h" +#include "magick/resize-private.h" +#include "magick/semaphore.h" +#include "magick/splay-tree.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/token.h" + +#ifdef MAGICKCORE_CLPERFMARKER +#include "CLPerfMarker.h" +#endif + +#define MAGICK_MAX(x,y) (((x) >= (y))?(x):(y)) +#define MAGICK_MIN(x,y) (((x) <= (y))?(x):(y)) + +#if defined(MAGICKCORE_OPENCL_SUPPORT) + +/* + Define declarations. +*/ +#define ALIGNED(pointer,type) ((((size_t)(pointer)) & (sizeof(type)-1)) == 0) + +/* + Static declarations. +*/ +static const ResizeWeightingFunctionType supportedResizeWeighting[] = +{ + BoxWeightingFunction, + TriangleWeightingFunction, + HanningWeightingFunction, + HammingWeightingFunction, + BlackmanWeightingFunction, + CubicBCWeightingFunction, + SincWeightingFunction, + SincFastWeightingFunction, + LastWeightingFunction +}; + +/* + Forward declarations. +*/ +static Image *ComputeUnsharpMaskImageSingle(const Image *image, + const double radius,const double sigma,const double gain, + const double threshold,int blurOnly, ExceptionInfo *exception); + +/* + Helper functions. +*/ + +static MagickBooleanType checkAccelerateCondition(const Image* image, + const ChannelType channel) +{ + /* only direct class images are supported */ + if (image->storage_class != DirectClass) + return(MagickFalse); + + /* check if the image's colorspace is supported */ + if (image->colorspace != RGBColorspace && + image->colorspace != sRGBColorspace && + image->colorspace != LinearGRAYColorspace && + image->colorspace != GRAYColorspace) + return(MagickFalse); + + /* check if the channel is supported */ + if (((channel & RedChannel) == 0) || + ((channel & GreenChannel) == 0) || + ((channel & BlueChannel) == 0)) + return(MagickFalse); + + /* check if the virtual pixel method is compatible with the OpenCL implementation */ + if ((GetImageVirtualPixelMethod(image) != UndefinedVirtualPixelMethod) && + (GetImageVirtualPixelMethod(image) != EdgeVirtualPixelMethod)) + return(MagickFalse); + + /* check if the image has clip_mask / mask */ + if ((image->clip_mask != (Image *) NULL) || (image->mask != (Image *) NULL)) + return(MagickFalse); + + return(MagickTrue); +} + +static MagickBooleanType checkHistogramCondition(Image *image, + const ChannelType channel) +{ + /* ensure this is the only pass get in for now. */ + if ((channel & SyncChannels) == 0) + return MagickFalse; + + if (image->intensity == Rec601LuminancePixelIntensityMethod || + image->intensity == Rec709LuminancePixelIntensityMethod) + return MagickFalse; + + if (image->colorspace != sRGBColorspace) + return MagickFalse; + + return MagickTrue; +} + +static MagickBooleanType checkOpenCLEnvironment(ExceptionInfo* exception) +{ + MagickBooleanType + flag; + + MagickCLEnv + clEnv; + + clEnv=GetDefaultOpenCLEnv(); + + GetMagickOpenCLEnvParam(clEnv,MAGICK_OPENCL_ENV_PARAM_OPENCL_DISABLED, + sizeof(MagickBooleanType),&flag,exception); + if (flag != MagickFalse) + return(MagickFalse); + + GetMagickOpenCLEnvParam(clEnv,MAGICK_OPENCL_ENV_PARAM_OPENCL_INITIALIZED, + sizeof(MagickBooleanType),&flag,exception); + if (flag == MagickFalse) + { + if (InitOpenCLEnv(clEnv,exception) == MagickFalse) + return(MagickFalse); + + GetMagickOpenCLEnvParam(clEnv,MAGICK_OPENCL_ENV_PARAM_OPENCL_DISABLED, + sizeof(MagickBooleanType),&flag,exception); + if (flag != MagickFalse) + return(MagickFalse); + } + + return(MagickTrue); +} + +/* pad the global workgroup size to the next multiple of + the local workgroup size */ +inline static unsigned int padGlobalWorkgroupSizeToLocalWorkgroupSize( + const unsigned int orgGlobalSize,const unsigned int localGroupSize) +{ + return ((orgGlobalSize+(localGroupSize-1))/localGroupSize*localGroupSize); +} + +static MagickBooleanType paramMatchesValue(MagickCLEnv clEnv, + MagickOpenCLEnvParam param,const char *value,ExceptionInfo *exception) +{ + char + *val; + + MagickBooleanType + status; + + status=GetMagickOpenCLEnvParam(clEnv,param,sizeof(val),&val,exception); + if (status != MagickFalse) + { + status=strcmp(value,val) == 0 ? MagickTrue : MagickFalse; + RelinquishMagickMemory(val); + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e A d d N o i s e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static Image *ComputeAddNoiseImage(const Image *image, + const ChannelType channel,const NoiseType noise_type, + ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_context + context; + + cl_int + inputPixelCount, + pixelsPerWorkitem, + clStatus; + + cl_uint + event_count, + seed0, + seed1; + + cl_kernel + addNoiseKernel; + + cl_event + event; + + cl_mem + filteredImageBuffer, + imageBuffer; + + const char + *option; + + cl_event + *events; + + float + attenuate; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + Image + *filteredImage; + + RandomInfo + **magick_restrict random_info; + + size_t + global_work_size[1], + local_work_size[1]; + + unsigned int + k, + numRandomNumberPerPixel; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + unsigned long + key; +#endif + + outputReady = MagickFalse; + clEnv = NULL; + filteredImage = NULL; + context = NULL; + imageBuffer = NULL; + filteredImageBuffer = NULL; + queue = NULL; + addNoiseKernel = NULL; + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + filteredImage = CloneImage(image,0,0,MagickTrue,exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer = GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer = GetAuthenticOpenCLBuffer(filteredImage,exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + /* find out how many random numbers needed by pixel */ + numRandomNumberPerPixel = 0; + { + unsigned int numRandPerChannel = 0; + switch (noise_type) + { + case UniformNoise: + case ImpulseNoise: + case LaplacianNoise: + case RandomNoise: + default: + numRandPerChannel = 1; + break; + case GaussianNoise: + case MultiplicativeGaussianNoise: + case PoissonNoise: + numRandPerChannel = 2; + break; + }; + + if ((channel & RedChannel) != 0) + numRandomNumberPerPixel+=numRandPerChannel; + if ((channel & GreenChannel) != 0) + numRandomNumberPerPixel+=numRandPerChannel; + if ((channel & BlueChannel) != 0) + numRandomNumberPerPixel+=numRandPerChannel; + if ((channel & OpacityChannel) != 0) + numRandomNumberPerPixel+=numRandPerChannel; + } + + /* set up the random number generators */ + attenuate=1.0; + option=GetImageArtifact(image,"attenuate"); + if (option != (char *) NULL) + attenuate=StringToDouble(option,(char **) NULL); + random_info=AcquireRandomInfoTLS(); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + key=GetRandomSecretKey(random_info[0]); + (void) key; +#endif + + addNoiseKernel = AcquireOpenCLKernel(clEnv,MAGICK_OPENCL_ACCELERATE,"AddNoise"); + + { + cl_uint computeUnitCount; + cl_uint workItemCount; + clEnv->library->clGetDeviceInfo(clEnv->device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(cl_uint), &computeUnitCount, NULL); + workItemCount = computeUnitCount * 2 * 256; // 256 work items per group, 2 groups per CU + inputPixelCount = (cl_int) (image->columns * image->rows); + pixelsPerWorkitem = (inputPixelCount + workItemCount - 1) / workItemCount; + pixelsPerWorkitem = ((pixelsPerWorkitem + 3) / 4) * 4; + + local_work_size[0] = 256; + global_work_size[0] = workItemCount; + } + { + RandomInfo* randomInfo = AcquireRandomInfo(); + const unsigned long* s = GetRandomInfoSeed(randomInfo); + seed0 = s[0]; + GetPseudoRandomValue(randomInfo); + seed1 = s[0]; + randomInfo = DestroyRandomInfo(randomInfo); + } + + k = 0; + clEnv->library->clSetKernelArg(addNoiseKernel,k++,sizeof(cl_mem),(void *)&imageBuffer); + clEnv->library->clSetKernelArg(addNoiseKernel,k++,sizeof(cl_mem),(void *)&filteredImageBuffer); + clEnv->library->clSetKernelArg(addNoiseKernel,k++,sizeof(cl_uint),(void *)&inputPixelCount); + clEnv->library->clSetKernelArg(addNoiseKernel,k++,sizeof(cl_uint),(void *)&pixelsPerWorkitem); + clEnv->library->clSetKernelArg(addNoiseKernel,k++,sizeof(ChannelType),(void *)&channel); + clEnv->library->clSetKernelArg(addNoiseKernel,k++,sizeof(NoiseType),(void *)&noise_type); + attenuate=1.0f; + option=GetImageArtifact(image,"attenuate"); + if (option != (char *) NULL) + attenuate=(float)StringToDouble(option,(char **) NULL); + clEnv->library->clSetKernelArg(addNoiseKernel,k++,sizeof(float),(void *)&attenuate); + clEnv->library->clSetKernelArg(addNoiseKernel,k++,sizeof(cl_uint),(void *)&seed0); + clEnv->library->clSetKernelArg(addNoiseKernel,k++,sizeof(cl_uint),(void *)&seed1); + clEnv->library->clSetKernelArg(addNoiseKernel,k++,sizeof(unsigned int),(void *)&numRandomNumberPerPixel); + + events=GetOpenCLEvents(image,&event_count); + clStatus=clEnv->library->clEnqueueNDRangeKernel(queue,addNoiseKernel,1,NULL,global_work_size,NULL,event_count,events,&event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,AddNoiseKernel,event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage,event); + } + clEnv->library->clReleaseEvent(event); + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + if (queue!=NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + if (addNoiseKernel!=NULL) RelinquishOpenCLKernel(clEnv, addNoiseKernel); + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + + return(filteredImage); +} + +MagickPrivate Image *AccelerateAddNoiseImage(const Image *image, + const ChannelType channel,const NoiseType noise_type, + ExceptionInfo *exception) +{ + /* Temporary disabled because of repetition. + + Image + *filteredImage; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, channel) == MagickFalse)) + return NULL; + + filteredImage = ComputeAddNoiseImage(image,channel,noise_type,exception); + + return(filteredImage); + */ + magick_unreferenced(image); + magick_unreferenced(channel); + magick_unreferenced(noise_type); + magick_unreferenced(exception); + return((Image *)NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static Image *ComputeBlurImage(const Image* image,const ChannelType channel, + const double radius,const double sigma,ExceptionInfo *exception) +{ + char + geometry[MaxTextExtent]; + + cl_command_queue + queue; + + cl_context + context; + + cl_int + clStatus; + + cl_kernel + blurColumnKernel, + blurRowKernel; + + cl_event + event; + + cl_mem + filteredImageBuffer, + imageBuffer, + imageKernelBuffer, + tempImageBuffer; + + cl_uint + event_count; + + cl_event + *events; + + float + *kernelBufferPtr; + + Image + *filteredImage; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + MagickSizeType + length; + + KernelInfo + *kernel; + + unsigned int + i, + imageColumns, + imageRows, + kernelWidth; + + context = NULL; + filteredImage = NULL; + imageBuffer = NULL; + tempImageBuffer = NULL; + filteredImageBuffer = NULL; + imageKernelBuffer = NULL; + blurRowKernel = NULL; + blurColumnKernel = NULL; + queue = NULL; + kernel = NULL; + + outputReady = MagickFalse; + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + filteredImage = CloneImage(image,0,0,MagickTrue,exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer = GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer = GetAuthenticOpenCLBuffer(filteredImage,exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + /* create processing kernel */ + { + (void) FormatLocaleString(geometry,MaxTextExtent,"blur:%.20gx%.20g;blur:%.20gx%.20g+90",radius,sigma,radius,sigma); + kernel=AcquireKernelInfo(geometry); + if (kernel == (KernelInfo *) NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "MemoryAllocationFailed.","."); + goto cleanup; + } + + { + kernelBufferPtr = (float *)AcquireMagickMemory(kernel->width * sizeof(float)); + if (kernelBufferPtr == (float *) NULL) + { + (void)OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"AcquireMagickMemory failed.", "'%s'", "."); + goto cleanup; + } + for (i = 0; i < kernel->width; i++) + kernelBufferPtr[i] = (float)kernel->values[i]; + + imageKernelBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, kernel->width * sizeof(float), kernelBufferPtr, &clStatus); + RelinquishMagickMemory(kernelBufferPtr); + if (clStatus != CL_SUCCESS) + { + (void)OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.", "."); + goto cleanup; + } + } + } + + { + + /* create temp buffer */ + { + length = image->columns * image->rows; + tempImageBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_WRITE, length * 4 * sizeof(float), NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + } + + /* get the OpenCL kernels */ + { + blurRowKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "BlurRow"); + if (blurRowKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + }; + + blurColumnKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "BlurColumn"); + if (blurColumnKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + }; + } + + { + /* need logic to decide this value */ + int chunkSize = 256; + + { + imageColumns = (unsigned int) image->columns; + imageRows = (unsigned int) image->rows; + + /* set the kernel arguments */ + i = 0; + clStatus=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&tempImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(ChannelType),&channel); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&imageKernelBuffer); + kernelWidth = (unsigned int) kernel->width; + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(unsigned int),(void *)&kernelWidth); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(unsigned int),(void *)&imageColumns); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(unsigned int),(void *)&imageRows); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(CLPixelPacket)*(chunkSize+kernel->width),(void *) NULL); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + } + + /* launch the kernel */ + { + size_t gsize[2]; + size_t wsize[2]; + + gsize[0] = chunkSize*((image->columns+chunkSize-1)/chunkSize); + gsize[1] = image->rows; + wsize[0] = chunkSize; + wsize[1] = 1; + + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, blurRowKernel, 2, NULL, gsize, wsize, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,BlurRowKernel,event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage,event); + } + clEnv->library->clReleaseEvent(event); + } + } + + { + /* need logic to decide this value */ + int chunkSize = 256; + + { + imageColumns = (unsigned int) image->columns; + imageRows = (unsigned int) image->rows; + + /* set the kernel arguments */ + i = 0; + clStatus=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(cl_mem),(void *)&tempImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(cl_mem),(void *)&filteredImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(ChannelType),&channel); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(cl_mem),(void *)&imageKernelBuffer); + kernelWidth = (unsigned int) kernel->width; + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(unsigned int),(void *)&kernelWidth); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(unsigned int),(void *)&imageColumns); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(unsigned int),(void *)&imageRows); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(cl_float4)*(chunkSize+kernel->width),(void *) NULL); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + } + + /* launch the kernel */ + { + size_t gsize[2]; + size_t wsize[2]; + + gsize[0] = image->columns; + gsize[1] = chunkSize*((image->rows+chunkSize-1)/chunkSize); + wsize[0] = 1; + wsize[1] = chunkSize; + + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, blurColumnKernel, 2, NULL, gsize, wsize, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,BlurColumnKernel,event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage,event); + } + clEnv->library->clReleaseEvent(event); + } + } + + } + + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + if (tempImageBuffer!=NULL) clEnv->library->clReleaseMemObject(tempImageBuffer); + if (imageKernelBuffer!=NULL) clEnv->library->clReleaseMemObject(imageKernelBuffer); + if (blurRowKernel!=NULL) RelinquishOpenCLKernel(clEnv, blurRowKernel); + if (blurColumnKernel!=NULL) RelinquishOpenCLKernel(clEnv, blurColumnKernel); + if (queue != NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + if (kernel!=NULL) DestroyKernelInfo(kernel); + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + return(filteredImage); +} + +MagickPrivate Image* AccelerateBlurImage(const Image *image, + const ChannelType channel,const double radius,const double sigma, + ExceptionInfo *exception) +{ + Image + *filteredImage; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, channel) == MagickFalse)) + return NULL; + + filteredImage=ComputeBlurImage(image, channel, radius, sigma, exception); + return(filteredImage); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e C o m p o s i t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static MagickBooleanType LaunchCompositeKernel(const Image *image, + MagickCLEnv clEnv,cl_command_queue queue,cl_mem imageBuffer, + const unsigned int inputWidth,const unsigned int inputHeight, + const unsigned int inputMatte,const ChannelType channel, + const CompositeOperator compose,const cl_mem compositeImageBuffer, + const unsigned int compositeWidth,const unsigned int compositeHeight, + const unsigned int compositeMatte,const float destination_dissolve, + const float source_dissolve) +{ + cl_int + clStatus; + + cl_kernel + compositeKernel; + + cl_event + event; + + cl_uint + event_count; + + cl_event + *events; + + int + k; + + size_t + global_work_size[2], + local_work_size[2]; + + unsigned int + composeOp; + + compositeKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, + "Composite"); + + k = 0; + clStatus = clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(cl_mem), (void*)&imageBuffer); + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(unsigned int), (void*)&inputWidth); + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(unsigned int), (void*)&inputHeight); + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(unsigned int), (void*)&inputMatte); + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(cl_mem), (void*)&compositeImageBuffer); + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(unsigned int), (void*)&compositeWidth); + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(unsigned int), (void*)&compositeHeight); + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(unsigned int), (void*)&compositeMatte); + composeOp = (unsigned int)compose; + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(unsigned int), (void*)&composeOp); + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(ChannelType), (void*)&channel); + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(float), (void*)&destination_dissolve); + clStatus |= clEnv->library->clSetKernelArg(compositeKernel, k++, sizeof(float), (void*)&source_dissolve); + + if (clStatus != CL_SUCCESS) + return MagickFalse; + + local_work_size[0] = 64; + local_work_size[1] = 1; + + global_work_size[0] = padGlobalWorkgroupSizeToLocalWorkgroupSize(inputWidth, + (unsigned int)local_work_size[0]); + global_work_size[1] = inputHeight; + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, compositeKernel, 2, NULL, + global_work_size, local_work_size, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus == CL_SUCCESS) + AddOpenCLEvent(image,event); + clEnv->library->clReleaseEvent(event); + + RelinquishOpenCLKernel(clEnv, compositeKernel); + + return((clStatus == CL_SUCCESS) ? MagickTrue : MagickFalse); +} + +static MagickBooleanType ComputeCompositeImage(Image *image, + const ChannelType channel, const CompositeOperator compose, + const Image *compositeImage, const ssize_t magick_unused(x_offset), + const ssize_t magick_unused(y_offset), const float destination_dissolve, + const float source_dissolve, ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_context + context; + + cl_mem + compositeImageBuffer, + imageBuffer; + + MagickBooleanType + outputReady, + status; + + MagickCLEnv + clEnv; + + magick_unreferenced(x_offset); + magick_unreferenced(y_offset); + + status = MagickFalse; + outputReady = MagickFalse; + imageBuffer = NULL; + compositeImageBuffer = NULL; + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + imageBuffer = GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + compositeImageBuffer = GetAuthenticOpenCLBuffer(compositeImage,exception); + if (compositeImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + status = LaunchCompositeKernel(image,clEnv, queue, imageBuffer, + (unsigned int)image->columns, + (unsigned int)image->rows, + (unsigned int)image->matte, + channel, compose, compositeImageBuffer, + (unsigned int)compositeImage->columns, + (unsigned int)compositeImage->rows, + (unsigned int)compositeImage->matte, + destination_dissolve, source_dissolve); + + if (status == MagickFalse) + goto cleanup; + + outputReady = MagickTrue; + +cleanup: + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (compositeImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(compositeImageBuffer); + if (queue != NULL) + RelinquishOpenCLCommandQueue(clEnv, queue); + + return(outputReady); +} + +MagickPrivate MagickBooleanType AccelerateCompositeImage(Image *image, + const ChannelType channel, const CompositeOperator compose, + const Image *composite, const ssize_t x_offset, const ssize_t y_offset, + const float destination_dissolve, const float source_dissolve, + ExceptionInfo *exception) +{ + MagickBooleanType + status; + + assert(image != NULL); + assert(exception != (ExceptionInfo *)NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, channel) == MagickFalse)) + return(MagickFalse); + + /* only support zero offset and + images with the size for now */ + if (x_offset != 0 + || y_offset != 0 + || image->columns != composite->columns + || image->rows != composite->rows) + return MagickFalse; + + switch (compose) { + case ColorDodgeCompositeOp: + case BlendCompositeOp: + break; + default: + /* unsupported compose operator, quit */ + return MagickFalse; + }; + + status = ComputeCompositeImage(image, channel, compose, composite, + x_offset, y_offset, destination_dissolve, source_dissolve, exception); + + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e C o n t r a s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static MagickBooleanType ComputeContrastImage(Image *image, + const MagickBooleanType sharpen,ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_context + context; + + cl_int + clStatus; + + cl_kernel + filterKernel; + + cl_event + event; + + cl_mem + imageBuffer; + + cl_uint + event_count; + + cl_event + *events; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + size_t + global_work_size[2]; + + unsigned int + i, + uSharpen; + + outputReady = MagickFalse; + clEnv = NULL; + context = NULL; + imageBuffer = NULL; + filterKernel = NULL; + queue = NULL; + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + + imageBuffer=GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + filterKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "Contrast"); + if (filterKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + i = 0; + clStatus=clEnv->library->clSetKernelArg(filterKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + + uSharpen = (sharpen == MagickFalse)?0:1; + clStatus|=clEnv->library->clSetKernelArg(filterKernel,i++,sizeof(cl_uint),&uSharpen); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + global_work_size[0] = image->columns; + global_work_size[1] = image->rows; + /* launch the kernel */ + queue = AcquireOpenCLCommandQueue(clEnv); + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, filterKernel, 2, NULL, global_work_size, NULL, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,ContrastKernel,event) == MagickFalse) + AddOpenCLEvent(image,event); + clEnv->library->clReleaseEvent(event); + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filterKernel!=NULL) RelinquishOpenCLKernel(clEnv, filterKernel); + if (queue != NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + return(outputReady); +} + +MagickPrivate MagickBooleanType AccelerateContrastImage(Image *image, + const MagickBooleanType sharpen,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, AllChannels) == MagickFalse)) + return(MagickFalse); + + status = ComputeContrastImage(image,sharpen,exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e C o n t r a s t S t r e t c h I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static MagickBooleanType LaunchHistogramKernel(MagickCLEnv clEnv, + cl_command_queue queue,cl_mem imageBuffer,cl_mem histogramBuffer, + Image *image,const ChannelType channel,ExceptionInfo *exception) +{ + MagickBooleanType + outputReady; + + cl_event + event; + + cl_int + clStatus, + colorspace, + method; + + cl_kernel + histogramKernel; + + cl_uint + event_count; + + cl_event + *events; + + ssize_t + i; + + size_t + global_work_size[2]; + + histogramKernel = NULL; + + outputReady = MagickFalse; + method = image->intensity; + colorspace = image->colorspace; + + /* get the OpenCL kernel */ + histogramKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "Histogram"); + if (histogramKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + /* set the kernel arguments */ + i = 0; + clStatus=clEnv->library->clSetKernelArg(histogramKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(histogramKernel,i++,sizeof(ChannelType),&channel); + clStatus|=clEnv->library->clSetKernelArg(histogramKernel,i++,sizeof(cl_int),&method); + clStatus|=clEnv->library->clSetKernelArg(histogramKernel,i++,sizeof(cl_int),&colorspace); + clStatus|=clEnv->library->clSetKernelArg(histogramKernel,i++,sizeof(cl_mem),(void *)&histogramBuffer); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + /* launch the kernel */ + global_work_size[0] = image->columns; + global_work_size[1] = image->rows; + + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, histogramKernel, 2, NULL, global_work_size, NULL, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,HistogramKernel,event) == MagickFalse) + AddOpenCLEvent(image,event); + clEnv->library->clReleaseEvent(event); + + outputReady = MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (histogramKernel!=NULL) + RelinquishOpenCLKernel(clEnv, histogramKernel); + + return(outputReady); +} + +MagickPrivate MagickBooleanType ComputeContrastStretchImageChannel(Image *image, + const ChannelType channel,const double black_point,const double white_point, + ExceptionInfo *exception) +{ +#define ContrastStretchImageTag "ContrastStretch/Image" +#define MaxRange(color) ((MagickRealType) ScaleQuantumToMap((Quantum) (color))) + cl_command_queue + queue; + + cl_context + context; + + cl_int + clStatus; + + cl_mem + histogramBuffer, + imageBuffer, + stretchMapBuffer; + + cl_kernel + histogramKernel, + stretchKernel; + + cl_event + event; + + cl_uint + event_count; + + cl_uint4 + *histogram; + + cl_event + *events; + + double + intensity; + + cl_float4 + black, + white; + + MagickBooleanType + outputReady, + status; + + MagickCLEnv + clEnv; + + MagickSizeType + length; + + PixelPacket + *stretch_map; + + ssize_t + i; + + size_t + global_work_size[2]; + + histogram=NULL; + stretch_map=NULL; + imageBuffer = NULL; + histogramBuffer = NULL; + stretchMapBuffer = NULL; + histogramKernel = NULL; + stretchKernel = NULL; + context = NULL; + queue = NULL; + outputReady = MagickFalse; + + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + + /* exception=(&image->exception); */ + + /* + * initialize opencl env + */ + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + /* + Allocate and initialize histogram arrays. + */ + length = (MaxMap+1); + histogram=(cl_uint4 *) AcquireQuantumMemory(length, sizeof(*histogram)); + + if (histogram == (cl_uint4 *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", image->filename); + + /* reset histogram */ + (void) memset(histogram,0,length*sizeof(*histogram)); + + /* + if (SetImageGray(image,exception) != MagickFalse) + (void) SetImageColorspace(image,GRAYColorspace); + */ + + status=MagickTrue; + + imageBuffer=GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + /* create a CL buffer for histogram */ + histogramBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR, length * sizeof(cl_uint4), histogram, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + status = LaunchHistogramKernel(clEnv, queue, imageBuffer, histogramBuffer, image, channel, exception); + if (status == MagickFalse) + goto cleanup; + + /* this blocks, should be fixed it in the future */ + events=GetOpenCLEvents(image,&event_count); + clEnv->library->clEnqueueMapBuffer(queue, histogramBuffer, CL_TRUE, CL_MAP_READ|CL_MAP_WRITE, 0, length * sizeof(cl_uint4), event_count, events, NULL, &clStatus); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "Reading output image from CL buffer failed.", "'%s'", "."); + goto cleanup; + } + + /* unmap, don't block gpu to use this buffer again. */ + clStatus = clEnv->library->clEnqueueUnmapMemObject(queue, histogramBuffer, histogram, 0, NULL, NULL); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueUnmapMemObject failed.", "'%s'", "."); + goto cleanup; + } + + /* CPU stuff */ + /* + Find the histogram boundaries by locating the black/white levels. + */ + black.z=0.0; + white.z=MaxRange(QuantumRange); + if ((channel & RedChannel) != 0) + { + intensity=0.0; + for (i=0; i <= (ssize_t) MaxMap; i++) + { + intensity+=histogram[i].s[2]; + if (intensity > black_point) + break; + } + black.z=(MagickRealType) i; + intensity=0.0; + for (i=(ssize_t) MaxMap; i != 0; i--) + { + intensity+=histogram[i].s[2]; + if (intensity > ((double) image->columns*image->rows-white_point)) + break; + } + white.z=(MagickRealType) i; + } + black.y=0.0; + white.y=MaxRange(QuantumRange); + if ((channel & GreenChannel) != 0) + { + intensity=0.0; + for (i=0; i <= (ssize_t) MaxMap; i++) + { + intensity+=histogram[i].s[2]; + if (intensity > black_point) + break; + } + black.y=(MagickRealType) i; + intensity=0.0; + for (i=(ssize_t) MaxMap; i != 0; i--) + { + intensity+=histogram[i].s[2]; + if (intensity > ((double) image->columns*image->rows-white_point)) + break; + } + white.y=(MagickRealType) i; + } + black.x=0.0; + white.x=MaxRange(QuantumRange); + if ((channel & BlueChannel) != 0) + { + intensity=0.0; + for (i=0; i <= (ssize_t) MaxMap; i++) + { + intensity+=histogram[i].s[2]; + if (intensity > black_point) + break; + } + black.x=(MagickRealType) i; + intensity=0.0; + for (i=(ssize_t) MaxMap; i != 0; i--) + { + intensity+=histogram[i].s[2]; + if (intensity > ((double) image->columns*image->rows-white_point)) + break; + } + white.x=(MagickRealType) i; + } + black.w=0.0; + white.w=MaxRange(QuantumRange); + if ((channel & OpacityChannel) != 0) + { + intensity=0.0; + for (i=0; i <= (ssize_t) MaxMap; i++) + { + intensity+=histogram[i].s[2]; + if (intensity > black_point) + break; + } + black.w=(MagickRealType) i; + intensity=0.0; + for (i=(ssize_t) MaxMap; i != 0; i--) + { + intensity+=histogram[i].s[2]; + if (intensity > ((double) image->columns*image->rows-white_point)) + break; + } + white.w=(MagickRealType) i; + } + /* + black.index=0.0; + white.index=MaxRange(QuantumRange); + if (((channel & IndexChannel) != 0) && (image->colorspace == CMYKColorspace)) + { + intensity=0.0; + for (i=0; i <= (ssize_t) MaxMap; i++) + { + intensity+=histogram[i].index; + if (intensity > black_point) + break; + } + black.index=(MagickRealType) i; + intensity=0.0; + for (i=(ssize_t) MaxMap; i != 0; i--) + { + intensity+=histogram[i].index; + if (intensity > ((double) image->columns*image->rows-white_point)) + break; + } + white.index=(MagickRealType) i; + } + */ + + + stretch_map=(PixelPacket *) AcquireQuantumMemory(length, + sizeof(*stretch_map)); + + if (stretch_map == (PixelPacket *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + + /* + Stretch the histogram to create the stretched image mapping. + */ + (void) memset(stretch_map,0,length*sizeof(*stretch_map)); + for (i=0; i <= (ssize_t) MaxMap; i++) + { + if ((channel & RedChannel) != 0) + { + if (i < (ssize_t) black.z) + stretch_map[i].red=(Quantum) 0; + else + if (i > (ssize_t) white.z) + stretch_map[i].red=QuantumRange; + else + if (black.z != white.z) + stretch_map[i].red=ScaleMapToQuantum((MagickRealType) (MaxMap* + (i-black.z)/(white.z-black.z))); + } + if ((channel & GreenChannel) != 0) + { + if (i < (ssize_t) black.y) + stretch_map[i].green=0; + else + if (i > (ssize_t) white.y) + stretch_map[i].green=QuantumRange; + else + if (black.y != white.y) + stretch_map[i].green=ScaleMapToQuantum((MagickRealType) (MaxMap* + (i-black.y)/(white.y-black.y))); + } + if ((channel & BlueChannel) != 0) + { + if (i < (ssize_t) black.x) + stretch_map[i].blue=0; + else + if (i > (ssize_t) white.x) + stretch_map[i].blue= QuantumRange; + else + if (black.x != white.x) + stretch_map[i].blue=ScaleMapToQuantum((MagickRealType) (MaxMap* + (i-black.x)/(white.x-black.x))); + } + if ((channel & OpacityChannel) != 0) + { + if (i < (ssize_t) black.w) + stretch_map[i].opacity=0; + else + if (i > (ssize_t) white.w) + stretch_map[i].opacity=QuantumRange; + else + if (black.w != white.w) + stretch_map[i].opacity=ScaleMapToQuantum((MagickRealType) (MaxMap* + (i-black.w)/(white.w-black.w))); + } + /* + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + if (i < (ssize_t) black.index) + stretch_map[i].index=0; + else + if (i > (ssize_t) white.index) + stretch_map[i].index=QuantumRange; + else + if (black.index != white.index) + stretch_map[i].index=ScaleMapToQuantum((MagickRealType) (MaxMap* + (i-black.index)/(white.index-black.index))); + } + */ + } + + /* + Stretch the image. + */ + if (((channel & OpacityChannel) != 0) || (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace))) + image->storage_class=DirectClass; + if (image->storage_class == PseudoClass) + { + /* + Stretch colormap. + */ + for (i=0; i < (ssize_t) image->colors; i++) + { + if ((channel & RedChannel) != 0) + { + if (black.z != white.z) + image->colormap[i].red=stretch_map[ + ScaleQuantumToMap(image->colormap[i].red)].red; + } + if ((channel & GreenChannel) != 0) + { + if (black.y != white.y) + image->colormap[i].green=stretch_map[ + ScaleQuantumToMap(image->colormap[i].green)].green; + } + if ((channel & BlueChannel) != 0) + { + if (black.x != white.x) + image->colormap[i].blue=stretch_map[ + ScaleQuantumToMap(image->colormap[i].blue)].blue; + } + if ((channel & OpacityChannel) != 0) + { + if (black.w != white.w) + image->colormap[i].opacity=stretch_map[ + ScaleQuantumToMap(image->colormap[i].opacity)].opacity; + } + } + } + + + /* create a CL buffer for stretch_map */ + stretchMapBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR, length, stretch_map, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + /* get the OpenCL kernel */ + stretchKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "ContrastStretch"); + if (stretchKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + /* set the kernel arguments */ + i = 0; + clStatus=clEnv->library->clSetKernelArg(stretchKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(stretchKernel,i++,sizeof(ChannelType),&channel); + clStatus|=clEnv->library->clSetKernelArg(stretchKernel,i++,sizeof(cl_mem),(void *)&stretchMapBuffer); + clStatus|=clEnv->library->clSetKernelArg(stretchKernel,i++,sizeof(cl_float4),&white); + clStatus|=clEnv->library->clSetKernelArg(stretchKernel,i++,sizeof(cl_float4),&black); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + /* launch the kernel */ + global_work_size[0] = image->columns; + global_work_size[1] = image->rows; + + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, stretchKernel, 2, NULL, global_work_size, NULL, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + + if (RecordProfileData(clEnv,ContrastStretchKernel,event) == MagickFalse) + AddOpenCLEvent(image, event); + clEnv->library->clReleaseEvent(event); + + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + + if (stretchMapBuffer!=NULL) + clEnv->library->clReleaseMemObject(stretchMapBuffer); + if (stretch_map!=NULL) + stretch_map=(PixelPacket *) RelinquishMagickMemory(stretch_map); + + + if (histogramBuffer!=NULL) + clEnv->library->clReleaseMemObject(histogramBuffer); + if (histogram!=NULL) + histogram=(cl_uint4 *) RelinquishMagickMemory(histogram); + + + if (histogramKernel!=NULL) + RelinquishOpenCLKernel(clEnv, histogramKernel); + if (stretchKernel!=NULL) + RelinquishOpenCLKernel(clEnv, stretchKernel); + + if (queue != NULL) + RelinquishOpenCLCommandQueue(clEnv, queue); + + return(outputReady); +} + +MagickPrivate MagickBooleanType AccelerateContrastStretchImageChannel( + Image *image,const ChannelType channel,const double black_point, + const double white_point,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, channel) == MagickFalse) || + (checkHistogramCondition(image, channel) == MagickFalse)) + return(MagickFalse); + + status=ComputeContrastStretchImageChannel(image,channel, black_point, white_point, exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e C o n v o l v e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static Image *ComputeConvolveImage(const Image* image, + const ChannelType channel,const KernelInfo *kernel,ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_context + context; + + cl_kernel + clkernel; + + cl_event + event; + + cl_int + clStatus; + + cl_mem + convolutionKernel, + filteredImageBuffer, + imageBuffer; + + cl_uint + event_count; + + cl_ulong + deviceLocalMemorySize; + + cl_event + *events; + + float + *kernelBufferPtr; + + Image + *filteredImage; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + size_t + global_work_size[3], + localGroupSize[3], + localMemoryRequirement; + + unsigned + kernelSize; + + unsigned int + filterHeight, + filterWidth, + i, + imageHeight, + imageWidth, + matte; + + /* intialize all CL objects to NULL */ + context = NULL; + imageBuffer = NULL; + filteredImageBuffer = NULL; + convolutionKernel = NULL; + clkernel = NULL; + queue = NULL; + + filteredImage = NULL; + outputReady = MagickFalse; + + clEnv = GetDefaultOpenCLEnv(); + + context = GetOpenCLContext(clEnv); + + filteredImage = CloneImage(image,0,0,MagickTrue,exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer = GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer=GetAuthenticOpenCLBuffer(filteredImage,exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + kernelSize = (unsigned int) (kernel->width * kernel->height); + convolutionKernel = clEnv->library->clCreateBuffer(context, CL_MEM_READ_ONLY|CL_MEM_ALLOC_HOST_PTR, kernelSize * sizeof(float), NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + queue = AcquireOpenCLCommandQueue(clEnv); + + kernelBufferPtr = (float*)clEnv->library->clEnqueueMapBuffer(queue, convolutionKernel, CL_TRUE, CL_MAP_WRITE, 0, kernelSize * sizeof(float) + , 0, NULL, NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueMapBuffer failed.","."); + goto cleanup; + } + for (i = 0; i < kernelSize; i++) + { + kernelBufferPtr[i] = (float) kernel->values[i]; + } + clStatus = clEnv->library->clEnqueueUnmapMemObject(queue, convolutionKernel, kernelBufferPtr, 0, NULL, NULL); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueUnmapMemObject failed.", "'%s'", "."); + goto cleanup; + } + + deviceLocalMemorySize = GetOpenCLDeviceLocalMemorySize(clEnv); + + /* Compute the local memory requirement for a 16x16 workgroup. + If it's larger than 16k, reduce the workgroup size to 8x8 */ + localGroupSize[0] = 16; + localGroupSize[1] = 16; + localMemoryRequirement = (localGroupSize[0]+kernel->width-1) * (localGroupSize[1]+kernel->height-1) * sizeof(CLPixelPacket) + + kernel->width*kernel->height*sizeof(float); + + if (localMemoryRequirement > deviceLocalMemorySize) + { + localGroupSize[0] = 8; + localGroupSize[1] = 8; + localMemoryRequirement = (localGroupSize[0]+kernel->width-1) * (localGroupSize[1]+kernel->height-1) * sizeof(CLPixelPacket) + + kernel->width*kernel->height*sizeof(float); + } + if (localMemoryRequirement <= deviceLocalMemorySize) + { + /* get the OpenCL kernel */ + clkernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "ConvolveOptimized"); + if (clkernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + /* set the kernel arguments */ + i = 0; + clStatus =clEnv->library->clSetKernelArg(clkernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(cl_mem),(void *)&filteredImageBuffer); + imageWidth = (unsigned int) image->columns; + imageHeight = (unsigned int) image->rows; + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&imageWidth); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&imageHeight); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(cl_mem),(void *)&convolutionKernel); + filterWidth = (unsigned int) kernel->width; + filterHeight = (unsigned int) kernel->height; + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&filterWidth); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&filterHeight); + matte = (image->matte==MagickTrue)?1:0; + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&matte); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(ChannelType),(void *)&channel); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++, (localGroupSize[0] + kernel->width-1)*(localGroupSize[1] + kernel->height-1)*sizeof(CLPixelPacket),NULL); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++, kernel->width*kernel->height*sizeof(float),NULL); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + /* pad the global size to a multiple of the local work size dimension */ + global_work_size[0] = ((image->columns + localGroupSize[0] - 1)/localGroupSize[0] ) * localGroupSize[0] ; + global_work_size[1] = ((image->rows + localGroupSize[1] - 1)/localGroupSize[1]) * localGroupSize[1]; + + /* launch the kernel */ + events = GetOpenCLEvents(image, &event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, clkernel, 2, NULL, global_work_size, localGroupSize, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,ConvolveKernel,event) == MagickFalse) + { + AddOpenCLEvent(image, event); + AddOpenCLEvent(filteredImage, event); + } + clEnv->library->clReleaseEvent(event); + } + else + { + /* get the OpenCL kernel */ + clkernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "Convolve"); + if (clkernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + /* set the kernel arguments */ + i = 0; + clStatus =clEnv->library->clSetKernelArg(clkernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(cl_mem),(void *)&filteredImageBuffer); + imageWidth = (unsigned int) image->columns; + imageHeight = (unsigned int) image->rows; + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&imageWidth); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&imageHeight); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(cl_mem),(void *)&convolutionKernel); + filterWidth = (unsigned int) kernel->width; + filterHeight = (unsigned int) kernel->height; + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&filterWidth); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&filterHeight); + matte = (image->matte==MagickTrue)?1:0; + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&matte); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(ChannelType),(void *)&channel); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + localGroupSize[0] = 8; + localGroupSize[1] = 8; + global_work_size[0] = (image->columns + (localGroupSize[0]-1))/localGroupSize[0] * localGroupSize[0]; + global_work_size[1] = (image->rows + (localGroupSize[1]-1))/localGroupSize[1] * localGroupSize[1]; + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, clkernel, 2, NULL, global_work_size, localGroupSize, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,ConvolveKernel,event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage,event); + } + clEnv->library->clReleaseEvent(event); + } + + outputReady = MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + + if (convolutionKernel != NULL) + clEnv->library->clReleaseMemObject(convolutionKernel); + + if (clkernel != NULL) + RelinquishOpenCLKernel(clEnv, clkernel); + + if (queue != NULL) + RelinquishOpenCLCommandQueue(clEnv, queue); + + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + + return(filteredImage); +} + +MagickPrivate Image *AccelerateConvolveImageChannel(const Image *image, + const ChannelType channel,const KernelInfo *kernel,ExceptionInfo *exception) +{ + Image + *filteredImage; + + assert(image != NULL); + assert(kernel != (KernelInfo *) NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, channel) == MagickFalse)) + return NULL; + + filteredImage=ComputeConvolveImage(image, channel, kernel, exception); + return(filteredImage); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e D e s p e c k l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static Image *ComputeDespeckleImage(const Image *image, + ExceptionInfo*exception) +{ + static const int + X[4] = {0, 1, 1,-1}, + Y[4] = {1, 0, 1, 1}; + + cl_command_queue + queue; + + cl_context + context; + + cl_int + clStatus; + + cl_kernel + hullPass1, + hullPass2; + + cl_event + event; + + cl_mem + filteredImageBuffer, + imageBuffer, + tempImageBuffer[2]; + + cl_uint + event_count; + + cl_event + *events; + + Image + *filteredImage; + + int + k, + matte; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + size_t + global_work_size[2]; + + unsigned int + imageHeight, + imageWidth; + + outputReady = MagickFalse; + clEnv = NULL; + filteredImage = NULL; + context = NULL; + imageBuffer = NULL; + filteredImageBuffer = NULL; + hullPass1 = NULL; + hullPass2 = NULL; + queue = NULL; + tempImageBuffer[0] = tempImageBuffer[1] = NULL; + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + events = NULL; + + filteredImage = CloneImage(image,0,0,MagickTrue,exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer = GetAuthenticOpenCLBuffer(image, exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer = GetAuthenticOpenCLBuffer(filteredImage, exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + hullPass1 = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "HullPass1"); + hullPass2 = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "HullPass2"); + + clStatus =clEnv->library->clSetKernelArg(hullPass1,0,sizeof(cl_mem),(void *)&imageBuffer); + clStatus |=clEnv->library->clSetKernelArg(hullPass1,1,sizeof(cl_mem),(void *)(tempImageBuffer+1)); + imageWidth = (unsigned int) image->columns; + clStatus |=clEnv->library->clSetKernelArg(hullPass1,2,sizeof(unsigned int),(void *)&imageWidth); + imageHeight = (unsigned int) image->rows; + clStatus |=clEnv->library->clSetKernelArg(hullPass1,3,sizeof(unsigned int),(void *)&imageHeight); + matte = (image->matte==MagickFalse)?0:1; + clStatus |=clEnv->library->clSetKernelArg(hullPass1,6,sizeof(int),(void *)&matte); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + clStatus = clEnv->library->clSetKernelArg(hullPass2,0,sizeof(cl_mem),(void *)(tempImageBuffer+1)); + clStatus |=clEnv->library->clSetKernelArg(hullPass2,1,sizeof(cl_mem),(void *)tempImageBuffer); + imageWidth = (unsigned int) image->columns; + clStatus |=clEnv->library->clSetKernelArg(hullPass2,2,sizeof(unsigned int),(void *)&imageWidth); + imageHeight = (unsigned int) image->rows; + clStatus |=clEnv->library->clSetKernelArg(hullPass2,3,sizeof(unsigned int),(void *)&imageHeight); + matte = (image->matte==MagickFalse)?0:1; + clStatus |=clEnv->library->clSetKernelArg(hullPass2,6,sizeof(int),(void *)&matte); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + + global_work_size[0] = image->columns; + global_work_size[1] = image->rows; + + events=GetOpenCLEvents(image,&event_count); + for (k = 0; k < 4; k++) + { + cl_int2 offset; + int polarity; + + + offset.s[0] = X[k]; + offset.s[1] = Y[k]; + polarity = 1; + clStatus = clEnv->library->clSetKernelArg(hullPass1,4,sizeof(cl_int2),(void *)&offset); + clStatus|= clEnv->library->clSetKernelArg(hullPass1,5,sizeof(int),(void *)&polarity); + clStatus|=clEnv->library->clSetKernelArg(hullPass2,4,sizeof(cl_int2),(void *)&offset); + clStatus|=clEnv->library->clSetKernelArg(hullPass2,5,sizeof(int),(void *)&polarity); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + /* launch the kernel */ + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass1, 2, NULL, global_work_size, NULL, event_count, events, &event); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + RecordProfileData(clEnv,HullPass1Kernel,event); + clEnv->library->clReleaseEvent(event); + /* launch the kernel */ + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass2, 2, NULL, global_work_size, NULL, event_count, events, &event); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + RecordProfileData(clEnv,HullPass2Kernel,event); + clEnv->library->clReleaseEvent(event); + + + if (k == 0) + clStatus =clEnv->library->clSetKernelArg(hullPass1,0,sizeof(cl_mem),(void *)(tempImageBuffer)); + offset.s[0] = -X[k]; + offset.s[1] = -Y[k]; + polarity = 1; + clStatus = clEnv->library->clSetKernelArg(hullPass1,4,sizeof(cl_int2),(void *)&offset); + clStatus|= clEnv->library->clSetKernelArg(hullPass1,5,sizeof(int),(void *)&polarity); + clStatus|=clEnv->library->clSetKernelArg(hullPass2,4,sizeof(cl_int2),(void *)&offset); + clStatus|=clEnv->library->clSetKernelArg(hullPass2,5,sizeof(int),(void *)&polarity); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + /* launch the kernel */ + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass1, 2, NULL, global_work_size, NULL, event_count, events, &event); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + RecordProfileData(clEnv,HullPass1Kernel,event); + clEnv->library->clReleaseEvent(event); + /* launch the kernel */ + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass2, 2, NULL, global_work_size, NULL, event_count, events, &event); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + RecordProfileData(clEnv,HullPass2Kernel,event); + clEnv->library->clReleaseEvent(event); + + offset.s[0] = -X[k]; + offset.s[1] = -Y[k]; + polarity = -1; + clStatus = clEnv->library->clSetKernelArg(hullPass1,4,sizeof(cl_int2),(void *)&offset); + clStatus|= clEnv->library->clSetKernelArg(hullPass1,5,sizeof(int),(void *)&polarity); + clStatus|=clEnv->library->clSetKernelArg(hullPass2,4,sizeof(cl_int2),(void *)&offset); + clStatus|=clEnv->library->clSetKernelArg(hullPass2,5,sizeof(int),(void *)&polarity); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + /* launch the kernel */ + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass1, 2, NULL, global_work_size, NULL, event_count, events, &event); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + RecordProfileData(clEnv,HullPass1Kernel,event); + clEnv->library->clReleaseEvent(event); + /* launch the kernel */ + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass2, 2, NULL, global_work_size, NULL, event_count, events, &event); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + RecordProfileData(clEnv,HullPass2Kernel,event); + clEnv->library->clReleaseEvent(event); + + offset.s[0] = X[k]; + offset.s[1] = Y[k]; + polarity = -1; + clStatus = clEnv->library->clSetKernelArg(hullPass1,4,sizeof(cl_int2),(void *)&offset); + clStatus|= clEnv->library->clSetKernelArg(hullPass1,5,sizeof(int),(void *)&polarity); + clStatus|=clEnv->library->clSetKernelArg(hullPass2,4,sizeof(cl_int2),(void *)&offset); + clStatus|=clEnv->library->clSetKernelArg(hullPass2,5,sizeof(int),(void *)&polarity); + + if (k == 3) + clStatus |=clEnv->library->clSetKernelArg(hullPass2,1,sizeof(cl_mem),(void *)&filteredImageBuffer); + + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + /* launch the kernel */ + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass1, 2, NULL, global_work_size, NULL, event_count, events, &event); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + RecordProfileData(clEnv,HullPass1Kernel,event); + clEnv->library->clReleaseEvent(event); + /* launch the kernel */ + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass2, 2, NULL, global_work_size, NULL, event_count, events, &event); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if ((k == 3) && (RecordProfileData(clEnv,HullPass2Kernel,event) == MagickFalse)) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage,event); + } + clEnv->library->clReleaseEvent(event); + } + + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + events=(cl_event *) RelinquishMagickMemory(events); + if (queue != NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + for (k = 0; k < 2; k++) + { + if (tempImageBuffer[k]!=NULL) clEnv->library->clReleaseMemObject(tempImageBuffer[k]); + } + if (hullPass1!=NULL) RelinquishOpenCLKernel(clEnv, hullPass1); + if (hullPass2!=NULL) RelinquishOpenCLKernel(clEnv, hullPass2); + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + return(filteredImage); +} + +MagickPrivate Image *AccelerateDespeckleImage(const Image* image, + ExceptionInfo* exception) +{ + Image + *filteredImage; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, AllChannels) == MagickFalse)) + return NULL; + + filteredImage=ComputeDespeckleImage(image,exception); + return(filteredImage); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e E q u a l i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +MagickPrivate MagickBooleanType ComputeEqualizeImage(Image *image, + const ChannelType channel,ExceptionInfo *exception) +{ +#define EqualizeImageTag "Equalize/Image" + + cl_command_queue + queue; + + cl_context + context; + + cl_int + clStatus; + + cl_mem + equalizeMapBuffer, + histogramBuffer, + imageBuffer; + + cl_kernel + equalizeKernel, + histogramKernel; + + cl_event + event; + + cl_uint + event_count; + + cl_uint4 + *histogram; + + cl_event + *events; + + cl_float4 + white, + black, + intensity, + *map; + + MagickBooleanType + outputReady, + status; + + MagickCLEnv + clEnv; + + MagickSizeType + length; + + PixelPacket + *equalize_map; + + ssize_t + i; + + size_t + global_work_size[2]; + + map=NULL; + histogram=NULL; + equalize_map=NULL; + imageBuffer = NULL; + histogramBuffer = NULL; + equalizeMapBuffer = NULL; + histogramKernel = NULL; + equalizeKernel = NULL; + context = NULL; + queue = NULL; + outputReady = MagickFalse; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + + /* + * initialize opencl env + */ + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + /* + Allocate and initialize histogram arrays. + */ + length=MaxMap+1UL; + histogram=(cl_uint4 *) AcquireQuantumMemory(length, sizeof(*histogram)); + if (histogram == (cl_uint4 *) NULL) + ThrowBinaryException(ResourceLimitWarning,"MemoryAllocationFailed", image->filename); + + /* reset histogram */ + (void) memset(histogram,0,length*sizeof(*histogram)); + + imageBuffer = GetAuthenticOpenCLBuffer(image, exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + /* create a CL buffer for histogram */ + histogramBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR, length * sizeof(cl_uint4), histogram, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + status = LaunchHistogramKernel(clEnv, queue, imageBuffer, histogramBuffer, image, channel, exception); + if (status == MagickFalse) + goto cleanup; + + /* this blocks, should be fixed it in the future */ + events=GetOpenCLEvents(image,&event_count); + clEnv->library->clEnqueueMapBuffer(queue, histogramBuffer, CL_TRUE, CL_MAP_READ|CL_MAP_WRITE, 0, length * sizeof(cl_uint4), event_count, events, NULL, &clStatus); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "Reading output image from CL buffer failed.", "'%s'", "."); + goto cleanup; + } + + /* unmap, don't block gpu to use this buffer again. */ + clStatus = clEnv->library->clEnqueueUnmapMemObject(queue, histogramBuffer, histogram, 0, NULL, NULL); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueUnmapMemObject failed.", "'%s'", "."); + goto cleanup; + } + + /* CPU stuff */ + equalize_map=(PixelPacket *) AcquireQuantumMemory(length, sizeof(*equalize_map)); + if (equalize_map == (PixelPacket *) NULL) + ThrowBinaryException(ResourceLimitWarning,"MemoryAllocationFailed", image->filename); + + map=(cl_float4 *) AcquireQuantumMemory(length,sizeof(*map)); + if (map == (cl_float4 *) NULL) + ThrowBinaryException(ResourceLimitWarning,"MemoryAllocationFailed", image->filename); + + /* + Integrate the histogram to get the equalization map. + */ + (void) memset(&intensity,0,sizeof(intensity)); + for (i=0; i <= (ssize_t) MaxMap; i++) + { + if ((channel & SyncChannels) != 0) + { + intensity.z+=histogram[i].s[2]; + map[i]=intensity; + continue; + } + if ((channel & RedChannel) != 0) + intensity.z+=histogram[i].s[2]; + if ((channel & GreenChannel) != 0) + intensity.y+=histogram[i].s[1]; + if ((channel & BlueChannel) != 0) + intensity.x+=histogram[i].s[0]; + if ((channel & OpacityChannel) != 0) + intensity.w+=histogram[i].s[3]; + /* + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + intensity.index+=histogram[i].index; + } + */ + map[i]=intensity; + } + black=map[0]; + white=map[(int) MaxMap]; + (void) memset(equalize_map,0,length*sizeof(*equalize_map)); + for (i=0; i <= (ssize_t) MaxMap; i++) + { + if ((channel & SyncChannels) != 0) + { + if (white.z != black.z) + equalize_map[i].red=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].z-black.z))/(white.z-black.z))); + continue; + } + if (((channel & RedChannel) != 0) && (white.z != black.z)) + equalize_map[i].red=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].z-black.z))/(white.z-black.z))); + if (((channel & GreenChannel) != 0) && (white.y != black.y)) + equalize_map[i].green=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].y-black.y))/(white.y-black.y))); + if (((channel & BlueChannel) != 0) && (white.x != black.x)) + equalize_map[i].blue=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].x-black.x))/(white.x-black.x))); + if (((channel & OpacityChannel) != 0) && (white.w != black.w)) + equalize_map[i].opacity=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].w-black.w))/(white.w-black.w))); + /* + if ((((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) && + (white.index != black.index)) + equalize_map[i].index=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].index-black.index))/(white.index-black.index))); + */ + } + + if (image->storage_class == PseudoClass) + { + /* + Equalize colormap. + */ + for (i=0; i < (ssize_t) image->colors; i++) + { + if ((channel & SyncChannels) != 0) + { + if (white.z != black.z) + { + image->colormap[i].red=equalize_map[ + ScaleQuantumToMap(image->colormap[i].red)].red; + image->colormap[i].green=equalize_map[ + ScaleQuantumToMap(image->colormap[i].green)].red; + image->colormap[i].blue=equalize_map[ + ScaleQuantumToMap(image->colormap[i].blue)].red; + image->colormap[i].opacity=equalize_map[ + ScaleQuantumToMap(image->colormap[i].opacity)].red; + } + continue; + } + if (((channel & RedChannel) != 0) && (white.z != black.z)) + image->colormap[i].red=equalize_map[ + ScaleQuantumToMap(image->colormap[i].red)].red; + if (((channel & GreenChannel) != 0) && (white.y != black.y)) + image->colormap[i].green=equalize_map[ + ScaleQuantumToMap(image->colormap[i].green)].green; + if (((channel & BlueChannel) != 0) && (white.x != black.x)) + image->colormap[i].blue=equalize_map[ + ScaleQuantumToMap(image->colormap[i].blue)].blue; + if (((channel & OpacityChannel) != 0) && + (white.w != black.w)) + image->colormap[i].opacity=equalize_map[ + ScaleQuantumToMap(image->colormap[i].opacity)].opacity; + } + } + + /* create a CL buffer for eqaulize_map */ + equalizeMapBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR, length * sizeof(PixelPacket), equalize_map, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + /* get the OpenCL kernel */ + equalizeKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "Equalize"); + if (equalizeKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + /* set the kernel arguments */ + i = 0; + clStatus=clEnv->library->clSetKernelArg(equalizeKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(equalizeKernel,i++,sizeof(ChannelType),&channel); + clStatus|=clEnv->library->clSetKernelArg(equalizeKernel,i++,sizeof(cl_mem),(void *)&equalizeMapBuffer); + clStatus|=clEnv->library->clSetKernelArg(equalizeKernel,i++,sizeof(cl_float4),&white); + clStatus|=clEnv->library->clSetKernelArg(equalizeKernel,i++,sizeof(cl_float4),&black); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + /* launch the kernel */ + global_work_size[0] = image->columns; + global_work_size[1] = image->rows; + + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, equalizeKernel, 2, NULL, global_work_size, NULL, 0, NULL, &event); + + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,EqualizeKernel,event) == MagickFalse) + AddOpenCLEvent(image,event); + clEnv->library->clReleaseEvent(event); + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + + if (map!=NULL) + map=(cl_float4 *) RelinquishMagickMemory(map); + + if (equalizeMapBuffer!=NULL) + clEnv->library->clReleaseMemObject(equalizeMapBuffer); + if (equalize_map!=NULL) + equalize_map=(PixelPacket *) RelinquishMagickMemory(equalize_map); + + if (histogramBuffer!=NULL) + clEnv->library->clReleaseMemObject(histogramBuffer); + if (histogram!=NULL) + histogram=(cl_uint4 *) RelinquishMagickMemory(histogram); + + if (histogramKernel!=NULL) + RelinquishOpenCLKernel(clEnv, histogramKernel); + if (equalizeKernel!=NULL) + RelinquishOpenCLKernel(clEnv, equalizeKernel); + + if (queue != NULL) + RelinquishOpenCLCommandQueue(clEnv, queue); + + return(outputReady); +} + +MagickPrivate MagickBooleanType AccelerateEqualizeImage(Image *image, + const ChannelType channel,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, channel) == MagickFalse) || + (checkHistogramCondition(image, channel) == MagickFalse)) + return(MagickFalse); + + status=ComputeEqualizeImage(image,channel,exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e F u n c t i o n I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static MagickBooleanType ComputeFunctionImage(Image *image, + const ChannelType channel,const MagickFunction function, + const size_t number_parameters,const double *parameters, + ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_context + context; + + cl_int + clStatus; + + cl_kernel + clkernel; + + cl_event + event; + + cl_mem + imageBuffer, + parametersBuffer; + + cl_event + *events; + + float + *parametersBufferPtr; + + MagickBooleanType + status; + + MagickCLEnv + clEnv; + + size_t + globalWorkSize[2]; + + unsigned int + event_count, + i; + + status = MagickFalse; + + context = NULL; + clkernel = NULL; + queue = NULL; + imageBuffer = NULL; + parametersBuffer = NULL; + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + + queue = AcquireOpenCLCommandQueue(clEnv); + + imageBuffer = GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + + { + parametersBufferPtr = (float*)AcquireMagickMemory(number_parameters * sizeof(float)); + + for (i = 0; i < number_parameters; i++) + parametersBufferPtr[i] = (float)parameters[i]; + + parametersBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, number_parameters * sizeof(float), parametersBufferPtr, &clStatus); + parametersBufferPtr=RelinquishMagickMemory(parametersBufferPtr); + } + + clkernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "ComputeFunction"); + if (clkernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + /* set the kernel arguments */ + i = 0; + clStatus =clEnv->library->clSetKernelArg(clkernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(ChannelType),(void *)&channel); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(MagickFunction),(void *)&function); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(unsigned int),(void *)&number_parameters); + clStatus|=clEnv->library->clSetKernelArg(clkernel,i++,sizeof(cl_mem),(void *)¶metersBuffer); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + globalWorkSize[0] = image->columns; + globalWorkSize[1] = image->rows; + /* launch the kernel */ + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, clkernel, 2, NULL, globalWorkSize, NULL, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,ComputeFunctionKernel,event) == MagickFalse) + AddOpenCLEvent(image,event); + clEnv->library->clReleaseEvent(event); + status = MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (clkernel != NULL) RelinquishOpenCLKernel(clEnv, clkernel); + if (queue != NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + if (parametersBuffer != NULL) clEnv->library->clReleaseMemObject(parametersBuffer); + + return(status); +} + +MagickPrivate MagickBooleanType AccelerateFunctionImage(Image *image, + const ChannelType channel,const MagickFunction function, + const size_t number_parameters,const double *parameters, + ExceptionInfo *exception) +{ + MagickBooleanType + status; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, channel) == MagickFalse)) + return(MagickFalse); + + status=ComputeFunctionImage(image, channel, function, number_parameters, parameters, exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e G r a y s c a l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +MagickBooleanType ComputeGrayscaleImage(Image *image, + const PixelIntensityMethod method,ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_context + context; + + cl_int + clStatus, + intensityMethod; + + cl_int + colorspace; + + cl_kernel + grayscaleKernel; + + cl_event + event; + + cl_mem + imageBuffer; + + cl_uint + event_count; + + cl_event + *events; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + ssize_t + i; + + imageBuffer = NULL; + grayscaleKernel = NULL; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + + /* + * initialize opencl env + */ + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + outputReady = MagickFalse; + + imageBuffer = GetAuthenticOpenCLBuffer(image, exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + intensityMethod = method; + colorspace = image->colorspace; + + grayscaleKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "Grayscale"); + if (grayscaleKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + i = 0; + clStatus=clEnv->library->clSetKernelArg(grayscaleKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(grayscaleKernel,i++,sizeof(cl_int),&intensityMethod); + clStatus|=clEnv->library->clSetKernelArg(grayscaleKernel,i++,sizeof(cl_int),&colorspace); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + printf("no kernel\n"); + goto cleanup; + } + + { + size_t global_work_size[2]; + global_work_size[0] = image->columns; + global_work_size[1] = image->rows; + /* launch the kernel */ + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, grayscaleKernel, 2, NULL, global_work_size, NULL, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,GrayScaleKernel,event) == MagickFalse) + AddOpenCLEvent(image,event); + clEnv->library->clReleaseEvent(event); + } + + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (grayscaleKernel!=NULL) + RelinquishOpenCLKernel(clEnv, grayscaleKernel); + if (queue != NULL) + RelinquishOpenCLCommandQueue(clEnv, queue); + + return(outputReady); +} + +MagickPrivate MagickBooleanType AccelerateGrayscaleImage(Image* image, + const PixelIntensityMethod method,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, AllChannels) == MagickFalse)) + return(MagickFalse); + + if (method == Rec601LuminancePixelIntensityMethod || method == Rec709LuminancePixelIntensityMethod) + return(MagickFalse); + + if (image->colorspace != sRGBColorspace) + return(MagickFalse); + + status=ComputeGrayscaleImage(image,method,exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e L o c a l C o n t r a s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static Image *ComputeLocalContrastImage(const Image *image, + const double radius,const double strength,ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_context + context; + + cl_int + clStatus, + iRadius; + + cl_kernel + blurRowKernel, + blurColumnKernel; + + cl_event + event; + + cl_mem + filteredImageBuffer, + imageBuffer, + tempImageBuffer; + + cl_event + *events; + + Image + *filteredImage; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + MagickSizeType + length; + + unsigned int + event_count, + i, + imageColumns, + imageRows, + passes; + + clEnv = NULL; + filteredImage = NULL; + context = NULL; + imageBuffer = NULL; + filteredImageBuffer = NULL; + tempImageBuffer = NULL; + blurRowKernel = NULL; + blurColumnKernel = NULL; + queue = NULL; + outputReady = MagickFalse; + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + filteredImage = CloneImage(image,0,0,MagickTrue,exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer = GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer = GetAuthenticOpenCLBuffer(filteredImage,exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + { + /* create temp buffer */ + { + length = image->columns * image->rows; + tempImageBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_WRITE, length * sizeof(float), NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + } + + /* get the opencl kernel */ + { + blurRowKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "LocalContrastBlurRow"); + if (blurRowKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + }; + + blurColumnKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "LocalContrastBlurApplyColumn"); + if (blurColumnKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + }; + } + + { + imageColumns = (unsigned int) image->columns; + imageRows = (unsigned int) image->rows; + iRadius = (cl_int) (image->rows > image->columns ? image->rows : image->columns) * 0.002f * fabs(radius); /*Normalized radius, 100% gives blur radius of 20% of the largest dimension */ + + passes = (((1.0f * imageRows) * imageColumns * iRadius) + 3999999999) / 4000000000.0f; + passes = (passes < 1) ? 1: passes; + + /* set the kernel arguments */ + i = 0; + clStatus=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&filteredImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&tempImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_int),(void *)&iRadius); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(unsigned int),(void *)&imageColumns); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(unsigned int),(void *)&imageRows); + + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + } + + /* launch the kernel */ + { + int x; + for (x = 0; x < passes; ++x) { + size_t gsize[2]; + size_t wsize[2]; + size_t goffset[2]; + + gsize[0] = 256; + gsize[1] = (image->rows + passes - 1) / passes; + wsize[0] = 256; + wsize[1] = 1; + goffset[0] = 0; + goffset[1] = x * gsize[1]; + + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, blurRowKernel, 2, goffset, gsize, wsize, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + clEnv->library->clFlush(queue); + if (RecordProfileData(clEnv,LocalContrastBlurRowKernel,event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage, event); + } + clEnv->library->clReleaseEvent(event); + } + } + + { + cl_float FStrength = strength; + i = 0; + clStatus=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(cl_mem),(void *)&filteredImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(cl_mem),(void *)&tempImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(unsigned int),(void *)&iRadius); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(cl_float),(void *)&FStrength); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(unsigned int),(void *)&imageColumns); + clStatus|=clEnv->library->clSetKernelArg(blurColumnKernel,i++,sizeof(unsigned int),(void *)&imageRows); + + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + } + + /* launch the kernel */ + { + int x; + for (x = 0; x < passes; ++x) { + size_t gsize[2]; + size_t wsize[2]; + size_t goffset[2]; + + gsize[0] = ((image->columns + 3) / 4) * 4; + gsize[1] = ((((image->rows + 63) / 64) + (passes + 1)) / passes) * 64; + wsize[0] = 4; + wsize[1] = 64; + goffset[0] = 0; + goffset[1] = x * gsize[1]; + + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, blurColumnKernel, 2, goffset, gsize, wsize, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + clEnv->library->clFlush(queue); + if (RecordProfileData(clEnv, LocalContrastBlurApplyColumnKernel, event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage,event); + } + clEnv->library->clReleaseEvent(event); + } + } + } + + outputReady = MagickTrue; + + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + if (tempImageBuffer!=NULL) clEnv->library->clReleaseMemObject(tempImageBuffer); + if (blurRowKernel!=NULL) RelinquishOpenCLKernel(clEnv, blurRowKernel); + if (blurColumnKernel!=NULL) RelinquishOpenCLKernel(clEnv, blurColumnKernel); + if (queue != NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + return(filteredImage); +} + +MagickPrivate Image *AccelerateLocalContrastImage(const Image *image, + const double radius,const double strength,ExceptionInfo *exception) +{ + Image + *filteredImage; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse)) + return NULL; + + filteredImage=ComputeLocalContrastImage(image,radius,strength,exception); + + return(filteredImage); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e M o d u l a t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +MagickBooleanType ComputeModulateImage(Image *image, + double percent_brightness, double percent_hue, double percent_saturation, + ColorspaceType colorspace, ExceptionInfo *exception) +{ + cl_float + bright, + hue, + saturation; + + cl_context + context; + + cl_command_queue + queue; + + cl_int + color, + clStatus; + + cl_kernel + modulateKernel; + + cl_event + event; + + cl_mem + imageBuffer; + + cl_event + *events; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + ssize_t + i; + + unsigned int + event_count; + + imageBuffer = NULL; + modulateKernel = NULL; + event_count = 0; + + assert(image != (Image *)NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent, GetMagickModule(), "%s", image->filename); + + /* + * initialize opencl env + */ + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + outputReady = MagickFalse; + + imageBuffer = GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + modulateKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "Modulate"); + if (modulateKernel == NULL) + { + (void)OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + bright = percent_brightness; + hue = percent_hue; + saturation = percent_saturation; + color = colorspace; + + i = 0; + clStatus = clEnv->library->clSetKernelArg(modulateKernel, i++, sizeof(cl_mem), (void *)&imageBuffer); + clStatus |= clEnv->library->clSetKernelArg(modulateKernel, i++, sizeof(cl_float), &bright); + clStatus |= clEnv->library->clSetKernelArg(modulateKernel, i++, sizeof(cl_float), &hue); + clStatus |= clEnv->library->clSetKernelArg(modulateKernel, i++, sizeof(cl_float), &saturation); + clStatus |= clEnv->library->clSetKernelArg(modulateKernel, i++, sizeof(cl_float), &color); + if (clStatus != CL_SUCCESS) + { + (void)OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + printf("no kernel\n"); + goto cleanup; + } + + { + size_t global_work_size[2]; + global_work_size[0] = image->columns; + global_work_size[1] = image->rows; + /* launch the kernel */ + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, modulateKernel, 2, NULL, global_work_size, NULL, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void)OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv, ModulateKernel, event) == MagickFalse) + AddOpenCLEvent(image,event); + clEnv->library->clReleaseEvent(event); + } + + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__, __LINE__, exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (modulateKernel != NULL) + RelinquishOpenCLKernel(clEnv, modulateKernel); + if (queue != NULL) + RelinquishOpenCLCommandQueue(clEnv, queue); + + return(outputReady); +} + +MagickPrivate MagickBooleanType AccelerateModulateImage(Image *image, + double percent_brightness, double percent_hue, double percent_saturation, + ColorspaceType colorspace, ExceptionInfo *exception) +{ + MagickBooleanType + status; + + assert(image != NULL); + assert(exception != (ExceptionInfo *)NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, AllChannels) == MagickFalse)) + return(MagickFalse); + + if ((colorspace != HSLColorspace && colorspace != UndefinedColorspace)) + return(MagickFalse); + + status = ComputeModulateImage(image, percent_brightness, percent_hue, percent_saturation, colorspace, exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e M o t i o n B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static Image* ComputeMotionBlurImage(const Image *image, + const ChannelType channel,const double *kernel,const size_t width, + const OffsetInfo *offset,ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_context + context; + + cl_float4 + biasPixel; + + cl_int + clStatus; + + cl_kernel + motionBlurKernel; + + cl_event + event; + + cl_mem + filteredImageBuffer, + imageBuffer, + imageKernelBuffer, + offsetBuffer; + + cl_uint + event_count; + + cl_event + *events; + + float + *kernelBufferPtr; + + Image + *filteredImage; + + int + *offsetBufferPtr; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + MagickPixelPacket + bias; + + size_t + global_work_size[2], + local_work_size[2]; + + unsigned int + i, + imageHeight, + imageWidth, + matte; + + outputReady = MagickFalse; + context = NULL; + filteredImage = NULL; + imageBuffer = NULL; + filteredImageBuffer = NULL; + imageKernelBuffer = NULL; + motionBlurKernel = NULL; + queue = NULL; + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + + filteredImage = CloneImage(image,0,0,MagickTrue,exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer = GetAuthenticOpenCLBuffer(image, exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer = GetAuthenticOpenCLBuffer(filteredImage, exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + imageKernelBuffer = clEnv->library->clCreateBuffer(context, + CL_MEM_READ_ONLY|CL_MEM_ALLOC_HOST_PTR, width * sizeof(float), NULL, + &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) ThrowMagickException(exception, GetMagickModule(), + ResourceLimitError, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + queue = AcquireOpenCLCommandQueue(clEnv); + events=GetOpenCLEvents(image,&event_count); + /* this blocks, should be fixed it in the future */ + kernelBufferPtr = (float*)clEnv->library->clEnqueueMapBuffer(queue, imageKernelBuffer, + CL_TRUE, CL_MAP_WRITE, 0, width * sizeof(float), event_count, events, NULL, &clStatus); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) ThrowMagickException(exception, GetMagickModule(), + ResourceLimitError, "clEnv->library->clEnqueueMapBuffer failed.","."); + goto cleanup; + } + for (i = 0; i < width; i++) + { + kernelBufferPtr[i] = (float) kernel[i]; + } + clStatus = clEnv->library->clEnqueueUnmapMemObject(queue, imageKernelBuffer, kernelBufferPtr, + 0, NULL, NULL); + if (clStatus != CL_SUCCESS) + { + (void) ThrowMagickException(exception, GetMagickModule(), ModuleFatalError, + "clEnv->library->clEnqueueUnmapMemObject failed.", "'%s'", "."); + goto cleanup; + } + + offsetBuffer = clEnv->library->clCreateBuffer(context, + CL_MEM_READ_ONLY|CL_MEM_ALLOC_HOST_PTR, width * sizeof(cl_int2), NULL, + &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) ThrowMagickException(exception, GetMagickModule(), + ResourceLimitError, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + offsetBufferPtr = (int*)clEnv->library->clEnqueueMapBuffer(queue, offsetBuffer, CL_TRUE, + CL_MAP_WRITE, 0, width * sizeof(cl_int2), 0, NULL, NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) ThrowMagickException(exception, GetMagickModule(), + ResourceLimitError, "clEnv->library->clEnqueueMapBuffer failed.","."); + goto cleanup; + } + for (i = 0; i < width; i++) + { + offsetBufferPtr[2*i] = (int)offset[i].x; + offsetBufferPtr[2*i+1] = (int)offset[i].y; + } + clStatus = clEnv->library->clEnqueueUnmapMemObject(queue, offsetBuffer, offsetBufferPtr, 0, + NULL, NULL); + if (clStatus != CL_SUCCESS) + { + (void) ThrowMagickException(exception, GetMagickModule(), ModuleFatalError, + "clEnv->library->clEnqueueUnmapMemObject failed.", "'%s'", "."); + goto cleanup; + } + + + /* + Get the OpenCL kernel. + */ + motionBlurKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, + "MotionBlur"); + if (motionBlurKernel == NULL) + { + (void) ThrowMagickException(exception, GetMagickModule(), ModuleFatalError, + "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + /* + Set the kernel arguments. + */ + i = 0; + clStatus=clEnv->library->clSetKernelArg(motionBlurKernel,i++,sizeof(cl_mem), + (void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(motionBlurKernel,i++,sizeof(cl_mem), + (void *)&filteredImageBuffer); + imageWidth = (unsigned int) image->columns; + imageHeight = (unsigned int) image->rows; + clStatus|=clEnv->library->clSetKernelArg(motionBlurKernel,i++,sizeof(unsigned int), + &imageWidth); + clStatus|=clEnv->library->clSetKernelArg(motionBlurKernel,i++,sizeof(unsigned int), + &imageHeight); + clStatus|=clEnv->library->clSetKernelArg(motionBlurKernel,i++,sizeof(cl_mem), + (void *)&imageKernelBuffer); + clStatus|=clEnv->library->clSetKernelArg(motionBlurKernel,i++,sizeof(unsigned int), + &width); + clStatus|=clEnv->library->clSetKernelArg(motionBlurKernel,i++,sizeof(cl_mem), + (void *)&offsetBuffer); + + GetMagickPixelPacket(image,&bias); + biasPixel.s[0] = bias.red; + biasPixel.s[1] = bias.green; + biasPixel.s[2] = bias.blue; + biasPixel.s[3] = bias.opacity; + clStatus|=clEnv->library->clSetKernelArg(motionBlurKernel,i++,sizeof(cl_float4), &biasPixel); + + clStatus|=clEnv->library->clSetKernelArg(motionBlurKernel,i++,sizeof(ChannelType), &channel); + matte = (image->matte != MagickFalse)?1:0; + clStatus|=clEnv->library->clSetKernelArg(motionBlurKernel,i++,sizeof(unsigned int), &matte); + if (clStatus != CL_SUCCESS) + { + (void) ThrowMagickException(exception, GetMagickModule(), ModuleFatalError, + "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + /* + Launch the kernel. + */ + local_work_size[0] = 16; + local_work_size[1] = 16; + global_work_size[0] = (size_t)padGlobalWorkgroupSizeToLocalWorkgroupSize( + (unsigned int) image->columns,(unsigned int) local_work_size[0]); + global_work_size[1] = (size_t)padGlobalWorkgroupSizeToLocalWorkgroupSize( + (unsigned int) image->rows,(unsigned int) local_work_size[1]); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, motionBlurKernel, 2, NULL, + global_work_size, local_work_size, 0, NULL, &event); + + if (clStatus != CL_SUCCESS) + { + (void) ThrowMagickException(exception, GetMagickModule(), ModuleFatalError, + "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,MotionBlurKernel,event) == MagickFalse) + { + AddOpenCLEvent(image, event); + AddOpenCLEvent(filteredImage, event); + } + clEnv->library->clReleaseEvent(event); + + outputReady = MagickTrue; + +cleanup: + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + if (imageKernelBuffer!=NULL) clEnv->library->clReleaseMemObject(imageKernelBuffer); + if (motionBlurKernel!=NULL) RelinquishOpenCLKernel(clEnv, motionBlurKernel); + if (queue != NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + + return(filteredImage); +} + +MagickPrivate Image *AccelerateMotionBlurImage(const Image *image, + const ChannelType channel,const double* kernel,const size_t width, + const OffsetInfo *offset,ExceptionInfo *exception) +{ + Image + *filteredImage; + + assert(image != NULL); + assert(kernel != (double *) NULL); + assert(offset != (OffsetInfo *) NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, channel) == MagickFalse)) + return NULL; + + filteredImage=ComputeMotionBlurImage(image, channel, kernel, width, + offset, exception); + return(filteredImage); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e R a d i a l B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static Image *ComputeRadialBlurImage(const Image *image, + const ChannelType channel,const double angle,ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_context + context; + + cl_float2 + blurCenter; + + cl_float4 + biasPixel; + + cl_int + clStatus; + + cl_mem + cosThetaBuffer, + filteredImageBuffer, + imageBuffer, + sinThetaBuffer; + + cl_kernel + radialBlurKernel; + + cl_event + event; + + cl_uint + event_count; + + cl_event + *events; + + float + blurRadius, + *cosThetaPtr, + offset, + *sinThetaPtr, + theta; + + Image + *filteredImage; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + MagickPixelPacket + bias; + + size_t + global_work_size[2]; + + unsigned int + cossin_theta_size, + i, + matte; + + outputReady = MagickFalse; + context = NULL; + filteredImage = NULL; + imageBuffer = NULL; + filteredImageBuffer = NULL; + sinThetaBuffer = NULL; + cosThetaBuffer = NULL; + queue = NULL; + radialBlurKernel = NULL; + + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + + filteredImage = CloneImage(image,0,0,MagickTrue,exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer = GetAuthenticOpenCLBuffer(image, exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer = GetAuthenticOpenCLBuffer(filteredImage, exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + blurCenter.s[0] = (float) (image->columns-1)/2.0; + blurCenter.s[1] = (float) (image->rows-1)/2.0; + blurRadius=hypot(blurCenter.s[0],blurCenter.s[1]); + cossin_theta_size=(unsigned int) fabs(4.0*DegreesToRadians(angle)*sqrt((double)blurRadius)+2UL); + + /* create a buffer for sin_theta and cos_theta */ + sinThetaBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_ONLY|CL_MEM_ALLOC_HOST_PTR, cossin_theta_size * sizeof(float), NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + cosThetaBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_ONLY|CL_MEM_ALLOC_HOST_PTR, cossin_theta_size * sizeof(float), NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + queue = AcquireOpenCLCommandQueue(clEnv); + events=GetOpenCLEvents(image,&event_count); + /* this blocks, should be fixed it in the future */ + sinThetaPtr = (float*) clEnv->library->clEnqueueMapBuffer(queue, sinThetaBuffer, CL_TRUE, CL_MAP_WRITE, 0, cossin_theta_size*sizeof(float), event_count, events, NULL, &clStatus); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnqueuemapBuffer failed.","."); + goto cleanup; + } + + cosThetaPtr = (float*) clEnv->library->clEnqueueMapBuffer(queue, cosThetaBuffer, CL_TRUE, CL_MAP_WRITE, 0, cossin_theta_size*sizeof(float), 0, NULL, NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnqueuemapBuffer failed.","."); + goto cleanup; + } + + theta=DegreesToRadians(angle)/(MagickRealType) (cossin_theta_size-1); + offset=theta*(MagickRealType) (cossin_theta_size-1)/2.0; + for (i=0; i < (ssize_t) cossin_theta_size; i++) + { + cosThetaPtr[i]=(float)cos((double) (theta*i-offset)); + sinThetaPtr[i]=(float)sin((double) (theta*i-offset)); + } + + clStatus = clEnv->library->clEnqueueUnmapMemObject(queue, sinThetaBuffer, sinThetaPtr, 0, NULL, NULL); + clStatus |= clEnv->library->clEnqueueUnmapMemObject(queue, cosThetaBuffer, cosThetaPtr, 0, NULL, NULL); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueUnmapMemObject failed.", "'%s'", "."); + goto cleanup; + } + + /* get the OpenCL kernel */ + radialBlurKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "RadialBlur"); + if (radialBlurKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + + /* set the kernel arguments */ + i = 0; + clStatus=clEnv->library->clSetKernelArg(radialBlurKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(radialBlurKernel,i++,sizeof(cl_mem),(void *)&filteredImageBuffer); + + GetMagickPixelPacket(image,&bias); + biasPixel.s[0] = bias.red; + biasPixel.s[1] = bias.green; + biasPixel.s[2] = bias.blue; + biasPixel.s[3] = bias.opacity; + clStatus|=clEnv->library->clSetKernelArg(radialBlurKernel,i++,sizeof(cl_float4), &biasPixel); + clStatus|=clEnv->library->clSetKernelArg(radialBlurKernel,i++,sizeof(ChannelType), &channel); + + matte = (image->matte != MagickFalse)?1:0; + clStatus|=clEnv->library->clSetKernelArg(radialBlurKernel,i++,sizeof(unsigned int), &matte); + + clStatus=clEnv->library->clSetKernelArg(radialBlurKernel,i++,sizeof(cl_float2), &blurCenter); + + clStatus|=clEnv->library->clSetKernelArg(radialBlurKernel,i++,sizeof(cl_mem),(void *)&cosThetaBuffer); + clStatus|=clEnv->library->clSetKernelArg(radialBlurKernel,i++,sizeof(cl_mem),(void *)&sinThetaBuffer); + clStatus|=clEnv->library->clSetKernelArg(radialBlurKernel,i++,sizeof(unsigned int), &cossin_theta_size); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + + global_work_size[0] = image->columns; + global_work_size[1] = image->rows; + /* launch the kernel */ + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, radialBlurKernel, 2, NULL, global_work_size, NULL, 0, NULL, &event); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,RadialBlurKernel,event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage,event); + } + clEnv->library->clReleaseEvent(event); + + outputReady = MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + if (sinThetaBuffer!=NULL) clEnv->library->clReleaseMemObject(sinThetaBuffer); + if (cosThetaBuffer!=NULL) clEnv->library->clReleaseMemObject(cosThetaBuffer); + if (radialBlurKernel!=NULL) RelinquishOpenCLKernel(clEnv, radialBlurKernel); + if (queue != NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + return filteredImage; +} + +MagickPrivate Image *AccelerateRadialBlurImage(const Image *image, + const ChannelType channel,const double angle,ExceptionInfo *exception) +{ + Image + *filteredImage; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, channel) == MagickFalse)) + return NULL; + + filteredImage=ComputeRadialBlurImage(image, channel, angle, exception); + return filteredImage; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e R e s i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static MagickBooleanType resizeHorizontalFilter(const Image *image, + const Image *filteredImage,cl_mem imageBuffer,const unsigned int imageColumns, + const unsigned int imageRows,const unsigned int matte,cl_mem resizedImage, + const unsigned int resizedColumns,const unsigned int resizedRows, + const ResizeFilter *resizeFilter,cl_mem resizeFilterCubicCoefficients, + const float xFactor,MagickCLEnv clEnv,cl_command_queue queue, + ExceptionInfo *exception) +{ + cl_kernel + horizontalKernel; + + cl_event + event; + + cl_int + clStatus; + + cl_uint + event_count; + + cl_event + *events; + + const unsigned int + workgroupSize = 256; + + float + resizeFilterScale, + resizeFilterSupport, + resizeFilterWindowSupport, + resizeFilterBlur, + scale, + support; + + int + cacheRangeStart, + cacheRangeEnd, + numCachedPixels, + resizeFilterType, + resizeWindowType; + + MagickBooleanType + status = MagickFalse; + + size_t + deviceLocalMemorySize, + gammaAccumulatorLocalMemorySize, + global_work_size[2], + imageCacheLocalMemorySize, + pixelAccumulatorLocalMemorySize, + local_work_size[2], + totalLocalMemorySize, + weightAccumulatorLocalMemorySize; + + unsigned int + chunkSize, + i, + pixelPerWorkgroup; + + horizontalKernel = NULL; + status = MagickFalse; + + /* + Apply filter to resize vertically from image to resize image. + */ + scale=MAGICK_MAX(1.0/xFactor+MagickEpsilon,1.0); + support=scale*GetResizeFilterSupport(resizeFilter); + if (support < 0.5) + { + /* + Support too small even for nearest neighbour: Reduce to point + sampling. + */ + support=(MagickRealType) 0.5; + scale=1.0; + } + scale=PerceptibleReciprocal(scale); + + if (resizedColumns < workgroupSize) + { + chunkSize = 32; + pixelPerWorkgroup = 32; + } + else + { + chunkSize = workgroupSize; + pixelPerWorkgroup = workgroupSize; + } + + /* get the local memory size supported by the device */ + deviceLocalMemorySize = GetOpenCLDeviceLocalMemorySize(clEnv); + +DisableMSCWarning(4127) + while(1) +RestoreMSCWarning + { + /* calculate the local memory size needed per workgroup */ + cacheRangeStart = (int) (((0 + 0.5)/xFactor+MagickEpsilon)-support+0.5); + cacheRangeEnd = (int) ((((pixelPerWorkgroup-1) + 0.5)/xFactor+MagickEpsilon)+support+0.5); + numCachedPixels = cacheRangeEnd - cacheRangeStart + 1; + imageCacheLocalMemorySize = numCachedPixels * sizeof(CLPixelPacket); + totalLocalMemorySize = imageCacheLocalMemorySize; + + /* local size for the pixel accumulator */ + pixelAccumulatorLocalMemorySize = chunkSize * sizeof(cl_float4); + totalLocalMemorySize+=pixelAccumulatorLocalMemorySize; + + /* local memory size for the weight accumulator */ + weightAccumulatorLocalMemorySize = chunkSize * sizeof(float); + totalLocalMemorySize+=weightAccumulatorLocalMemorySize; + + /* local memory size for the gamma accumulator */ + if (matte == 0) + gammaAccumulatorLocalMemorySize = sizeof(float); + else + gammaAccumulatorLocalMemorySize = chunkSize * sizeof(float); + totalLocalMemorySize+=gammaAccumulatorLocalMemorySize; + + if (totalLocalMemorySize <= deviceLocalMemorySize) + break; + else + { + pixelPerWorkgroup = pixelPerWorkgroup/2; + chunkSize = chunkSize/2; + if (pixelPerWorkgroup == 0 + || chunkSize == 0) + { + /* quit, fallback to CPU */ + goto cleanup; + } + } + } + + resizeFilterType = (int)GetResizeFilterWeightingType(resizeFilter); + resizeWindowType = (int)GetResizeFilterWindowWeightingType(resizeFilter); + + horizontalKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "ResizeHorizontalFilter"); + if (horizontalKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + i = 0; + clStatus = clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(cl_mem), (void*)&imageBuffer); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), (void*)&imageColumns); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), (void*)&imageRows); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), (void*)&matte); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(float), (void*)&xFactor); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(cl_mem), (void*)&resizedImage); + + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), (void*)&resizedColumns); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), (void*)&resizedRows); + + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(int), (void*)&resizeFilterType); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(int), (void*)&resizeWindowType); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(cl_mem), (void*)&resizeFilterCubicCoefficients); + + resizeFilterScale = (float) GetResizeFilterScale(resizeFilter); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(float), (void*)&resizeFilterScale); + + resizeFilterSupport = (float) GetResizeFilterSupport(resizeFilter); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(float), (void*)&resizeFilterSupport); + + resizeFilterWindowSupport = (float) GetResizeFilterWindowSupport(resizeFilter); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(float), (void*)&resizeFilterWindowSupport); + + resizeFilterBlur = (float) GetResizeFilterBlur(resizeFilter); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(float), (void*)&resizeFilterBlur); + + + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, imageCacheLocalMemorySize, NULL); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(int), &numCachedPixels); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), &pixelPerWorkgroup); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), &chunkSize); + + + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, pixelAccumulatorLocalMemorySize, NULL); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, weightAccumulatorLocalMemorySize, NULL); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, gammaAccumulatorLocalMemorySize, NULL); + + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + global_work_size[0] = (resizedColumns+pixelPerWorkgroup-1)/pixelPerWorkgroup*workgroupSize; + global_work_size[1] = resizedRows; + + local_work_size[0] = workgroupSize; + local_work_size[1] = 1; + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, horizontalKernel, 2, NULL, global_work_size, local_work_size, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,ResizeHorizontalKernel,event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage,event); + } + clEnv->library->clReleaseEvent(event); + status = MagickTrue; + + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (horizontalKernel != NULL) RelinquishOpenCLKernel(clEnv, horizontalKernel); + + return(status); +} + +static MagickBooleanType resizeVerticalFilter(const Image *image, + const Image *filteredImage,cl_mem imageBuffer,const unsigned int imageColumns, + const unsigned int imageRows,const unsigned int matte,cl_mem resizedImage, + const unsigned int resizedColumns,const unsigned int resizedRows, + const ResizeFilter *resizeFilter,cl_mem resizeFilterCubicCoefficients, + const float yFactor,MagickCLEnv clEnv,cl_command_queue queue, + ExceptionInfo *exception) +{ + cl_kernel + horizontalKernel; + + cl_event + event; + + cl_int + clStatus; + + cl_uint + event_count; + + cl_event + *events; + + const unsigned int + workgroupSize = 256; + + float + resizeFilterScale, + resizeFilterSupport, + resizeFilterWindowSupport, + resizeFilterBlur, + scale, + support; + + int + cacheRangeStart, + cacheRangeEnd, + numCachedPixels, + resizeFilterType, + resizeWindowType; + + MagickBooleanType + status = MagickFalse; + + size_t + deviceLocalMemorySize, + gammaAccumulatorLocalMemorySize, + global_work_size[2], + imageCacheLocalMemorySize, + pixelAccumulatorLocalMemorySize, + local_work_size[2], + totalLocalMemorySize, + weightAccumulatorLocalMemorySize; + + unsigned int + chunkSize, + i, + pixelPerWorkgroup; + + horizontalKernel = NULL; + status = MagickFalse; + + /* + Apply filter to resize vertically from image to resize image. + */ + scale=MAGICK_MAX(1.0/yFactor+MagickEpsilon,1.0); + support=scale*GetResizeFilterSupport(resizeFilter); + if (support < 0.5) + { + /* + Support too small even for nearest neighbour: Reduce to point + sampling. + */ + support=(MagickRealType) 0.5; + scale=1.0; + } + scale=PerceptibleReciprocal(scale); + + if (resizedRows < workgroupSize) + { + chunkSize = 32; + pixelPerWorkgroup = 32; + } + else + { + chunkSize = workgroupSize; + pixelPerWorkgroup = workgroupSize; + } + + /* get the local memory size supported by the device */ + deviceLocalMemorySize = GetOpenCLDeviceLocalMemorySize(clEnv); + +DisableMSCWarning(4127) + while(1) +RestoreMSCWarning + { + /* calculate the local memory size needed per workgroup */ + cacheRangeStart = (int) (((0 + 0.5)/yFactor+MagickEpsilon)-support+0.5); + cacheRangeEnd = (int) ((((pixelPerWorkgroup-1) + 0.5)/yFactor+MagickEpsilon)+support+0.5); + numCachedPixels = cacheRangeEnd - cacheRangeStart + 1; + imageCacheLocalMemorySize = numCachedPixels * sizeof(CLPixelPacket); + totalLocalMemorySize = imageCacheLocalMemorySize; + + /* local size for the pixel accumulator */ + pixelAccumulatorLocalMemorySize = chunkSize * sizeof(cl_float4); + totalLocalMemorySize+=pixelAccumulatorLocalMemorySize; + + /* local memory size for the weight accumulator */ + weightAccumulatorLocalMemorySize = chunkSize * sizeof(float); + totalLocalMemorySize+=weightAccumulatorLocalMemorySize; + + /* local memory size for the gamma accumulator */ + if (matte == 0) + gammaAccumulatorLocalMemorySize = sizeof(float); + else + gammaAccumulatorLocalMemorySize = chunkSize * sizeof(float); + totalLocalMemorySize+=gammaAccumulatorLocalMemorySize; + + if (totalLocalMemorySize <= deviceLocalMemorySize) + break; + else + { + pixelPerWorkgroup = pixelPerWorkgroup/2; + chunkSize = chunkSize/2; + if (pixelPerWorkgroup == 0 + || chunkSize == 0) + { + /* quit, fallback to CPU */ + goto cleanup; + } + } + } + + resizeFilterType = (int)GetResizeFilterWeightingType(resizeFilter); + resizeWindowType = (int)GetResizeFilterWindowWeightingType(resizeFilter); + + horizontalKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "ResizeVerticalFilter"); + if (horizontalKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + } + + i = 0; + clStatus = clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(cl_mem), (void*)&imageBuffer); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), (void*)&imageColumns); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), (void*)&imageRows); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), (void*)&matte); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(float), (void*)&yFactor); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(cl_mem), (void*)&resizedImage); + + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), (void*)&resizedColumns); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), (void*)&resizedRows); + + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(int), (void*)&resizeFilterType); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(int), (void*)&resizeWindowType); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(cl_mem), (void*)&resizeFilterCubicCoefficients); + + resizeFilterScale = (float) GetResizeFilterScale(resizeFilter); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(float), (void*)&resizeFilterScale); + + resizeFilterSupport = (float) GetResizeFilterSupport(resizeFilter); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(float), (void*)&resizeFilterSupport); + + resizeFilterWindowSupport = (float) GetResizeFilterWindowSupport(resizeFilter); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(float), (void*)&resizeFilterWindowSupport); + + resizeFilterBlur = (float) GetResizeFilterBlur(resizeFilter); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(float), (void*)&resizeFilterBlur); + + + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, imageCacheLocalMemorySize, NULL); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(int), &numCachedPixels); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), &pixelPerWorkgroup); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, sizeof(unsigned int), &chunkSize); + + + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, pixelAccumulatorLocalMemorySize, NULL); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, weightAccumulatorLocalMemorySize, NULL); + clStatus |= clEnv->library->clSetKernelArg(horizontalKernel, i++, gammaAccumulatorLocalMemorySize, NULL); + + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + + global_work_size[0] = resizedColumns; + global_work_size[1] = (resizedRows+pixelPerWorkgroup-1)/pixelPerWorkgroup*workgroupSize; + + local_work_size[0] = 1; + local_work_size[1] = workgroupSize; + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, horizontalKernel, 2, NULL, global_work_size, local_work_size, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,ResizeVerticalKernel,event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage,event); + } + clEnv->library->clReleaseEvent(event); + status = MagickTrue; + + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (horizontalKernel != NULL) RelinquishOpenCLKernel(clEnv, horizontalKernel); + + return(status); +} + +static Image *ComputeResizeImage(const Image* image, + const size_t resizedColumns,const size_t resizedRows, + const ResizeFilter *resizeFilter,ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_int + clStatus; + + cl_context + context; + + cl_mem + cubicCoefficientsBuffer, + filteredImageBuffer, + imageBuffer, + tempImageBuffer; + + const MagickRealType + *resizeFilterCoefficient; + + float + coefficientBuffer[7], + xFactor, + yFactor; + + MagickBooleanType + outputReady, + status; + + MagickCLEnv + clEnv; + + MagickSizeType + length; + + Image + *filteredImage; + + size_t + i; + + outputReady = MagickFalse; + filteredImage = NULL; + clEnv = NULL; + context = NULL; + imageBuffer = NULL; + tempImageBuffer = NULL; + filteredImageBuffer = NULL; + cubicCoefficientsBuffer = NULL; + queue = NULL; + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + filteredImage=CloneImage(image,resizedColumns,resizedRows,MagickTrue,exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer=GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer=GetAuthenticOpenCLBuffer(filteredImage,exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + resizeFilterCoefficient=GetResizeFilterCoefficient(resizeFilter); + for (i = 0; i < 7; i++) + coefficientBuffer[i]=(float) resizeFilterCoefficient[i]; + + cubicCoefficientsBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(coefficientBuffer), coefficientBuffer, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + xFactor=(float) resizedColumns/(float) image->columns; + yFactor=(float) resizedRows/(float) image->rows; + if (xFactor > yFactor) + { + + length = resizedColumns*image->rows; + tempImageBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_WRITE, length*sizeof(CLPixelPacket), NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + status = resizeHorizontalFilter(image,filteredImage,imageBuffer, (unsigned int) image->columns, (unsigned int) image->rows, (image->matte != MagickFalse)?1:0 + , tempImageBuffer, (unsigned int) resizedColumns, (unsigned int) image->rows + , resizeFilter, cubicCoefficientsBuffer + , xFactor, clEnv, queue, exception); + if (status != MagickTrue) + goto cleanup; + + status = resizeVerticalFilter(image,filteredImage,tempImageBuffer, (unsigned int) resizedColumns, (unsigned int) image->rows, (image->matte != MagickFalse)?1:0 + , filteredImageBuffer, (unsigned int) resizedColumns, (unsigned int) resizedRows + , resizeFilter, cubicCoefficientsBuffer + , yFactor, clEnv, queue, exception); + if (status != MagickTrue) + goto cleanup; + } + else + { + length = image->columns*resizedRows; + tempImageBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_WRITE, length*sizeof(CLPixelPacket), NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + + status = resizeVerticalFilter(image,filteredImage,imageBuffer, (unsigned int) image->columns, (unsigned int) image->rows, (image->matte != MagickFalse)?1:0 + , tempImageBuffer, (unsigned int) image->columns, (unsigned int) resizedRows + , resizeFilter, cubicCoefficientsBuffer + , yFactor, clEnv, queue, exception); + if (status != MagickTrue) + goto cleanup; + + status = resizeHorizontalFilter(image,filteredImage,tempImageBuffer, (unsigned int) image->columns, (unsigned int) resizedRows, (image->matte != MagickFalse)?1:0 + , filteredImageBuffer, (unsigned int) resizedColumns, (unsigned int) resizedRows + , resizeFilter, cubicCoefficientsBuffer + , xFactor, clEnv, queue, exception); + if (status != MagickTrue) + goto cleanup; + } + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + if (tempImageBuffer!=NULL) clEnv->library->clReleaseMemObject(tempImageBuffer); + if (cubicCoefficientsBuffer!=NULL) clEnv->library->clReleaseMemObject(cubicCoefficientsBuffer); + if (queue != NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + return(filteredImage); +} + +static MagickBooleanType gpuSupportedResizeWeighting( + ResizeWeightingFunctionType f) +{ + unsigned int + i; + + for (i = 0; ;i++) + { + if (supportedResizeWeighting[i] == LastWeightingFunction) + break; + if (supportedResizeWeighting[i] == f) + return(MagickTrue); + } + return(MagickFalse); +} + +MagickPrivate Image *AccelerateResizeImage(const Image *image, + const size_t resizedColumns,const size_t resizedRows, + const ResizeFilter *resizeFilter,ExceptionInfo *exception) +{ + Image + *filteredImage; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, AllChannels) == MagickFalse)) + return NULL; + + if (gpuSupportedResizeWeighting(GetResizeFilterWeightingType(resizeFilter)) == MagickFalse || + gpuSupportedResizeWeighting(GetResizeFilterWindowWeightingType(resizeFilter)) == MagickFalse) + return NULL; + + filteredImage=ComputeResizeImage(image,resizedColumns,resizedRows,resizeFilter,exception); + return(filteredImage); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c c e l e r a t e U n s h a r p M a s k I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +*/ + +static Image *ComputeUnsharpMaskImage(const Image *image, + const ChannelType channel,const double radius,const double sigma, + const double gain,const double threshold,ExceptionInfo *exception) +{ + char + geometry[MaxTextExtent]; + + cl_command_queue + queue; + + cl_context + context; + + cl_event + event; + + cl_int + clStatus; + + cl_kernel + blurRowKernel, + unsharpMaskBlurColumnKernel; + + cl_mem + filteredImageBuffer, + imageBuffer, + imageKernelBuffer, + tempImageBuffer; + + cl_uint + event_count; + + cl_event + *events; + + float + fGain, + fThreshold, + *kernelBufferPtr; + + Image + *filteredImage; + + int + chunkSize; + + KernelInfo + *kernel; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + MagickSizeType + length; + + unsigned int + imageColumns, + imageRows, + kernelWidth; + + size_t + i; + + clEnv = NULL; + filteredImage = NULL; + kernel = NULL; + context = NULL; + imageBuffer = NULL; + filteredImageBuffer = NULL; + tempImageBuffer = NULL; + imageKernelBuffer = NULL; + blurRowKernel = NULL; + unsharpMaskBlurColumnKernel = NULL; + queue = NULL; + outputReady = MagickFalse; + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + filteredImage = CloneImage(image,0,0,MagickTrue,exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer=GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer=GetAuthenticOpenCLBuffer(filteredImage,exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + /* create the blur kernel */ + { + (void) FormatLocaleString(geometry,MaxTextExtent,"blur:%.20gx%.20g;blur:%.20gx%.20g+90",radius,sigma,radius,sigma); + kernel=AcquireKernelInfo(geometry); + if (kernel == (KernelInfo *) NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireKernelInfo failed.","."); + goto cleanup; + } + + kernelBufferPtr=AcquireQuantumMemory(kernel->width,sizeof(float)); + if (kernelBufferPtr == (float *) NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "Memory allocation failed.","."); + goto cleanup; + } + for (i = 0; i < kernel->width; i++) + kernelBufferPtr[i]=(float) kernel->values[i]; + + imageKernelBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, kernel->width * sizeof(float), kernelBufferPtr, &clStatus); + kernelBufferPtr=RelinquishMagickMemory(kernelBufferPtr); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + } + + { + /* create temp buffer */ + { + length = image->columns * image->rows; + tempImageBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_READ_WRITE, length * 4 * sizeof(float), NULL, &clStatus); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + } + + /* get the opencl kernel */ + { + blurRowKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "BlurRow"); + if (blurRowKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + }; + + unsharpMaskBlurColumnKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "UnsharpMaskBlurColumn"); + if (unsharpMaskBlurColumnKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + }; + } + + { + chunkSize = 256; + + imageColumns = (unsigned int) image->columns; + imageRows = (unsigned int) image->rows; + + kernelWidth = (unsigned int) kernel->width; + + /* set the kernel arguments */ + i = 0; + clStatus=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&tempImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(ChannelType),&channel); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&imageKernelBuffer); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(unsigned int),(void *)&kernelWidth); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(unsigned int),(void *)&imageColumns); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(unsigned int),(void *)&imageRows); + clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(CLPixelPacket)*(chunkSize+kernel->width),(void *) NULL); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + } + + /* launch the kernel */ + { + size_t gsize[2]; + size_t wsize[2]; + + gsize[0] = chunkSize*((image->columns+chunkSize-1)/chunkSize); + gsize[1] = image->rows; + wsize[0] = chunkSize; + wsize[1] = 1; + + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, blurRowKernel, 2, NULL, gsize, wsize, event_count, events, NULL); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + } + + + { + chunkSize = 256; + imageColumns = (unsigned int) image->columns; + imageRows = (unsigned int) image->rows; + kernelWidth = (unsigned int) kernel->width; + fGain = (float) gain; + fThreshold = (float) threshold; + + i = 0; + clStatus=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++,sizeof(cl_mem),(void *)&tempImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++,sizeof(cl_mem),(void *)&filteredImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++,sizeof(unsigned int),(void *)&imageColumns); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++,sizeof(unsigned int),(void *)&imageRows); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++, (chunkSize+kernelWidth-1)*sizeof(cl_float4),NULL); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++, kernelWidth*sizeof(float),NULL); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++,sizeof(ChannelType),&channel); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++,sizeof(cl_mem),(void *)&imageKernelBuffer); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++,sizeof(unsigned int),(void *)&kernelWidth); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++,sizeof(float),(void *)&fGain); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskBlurColumnKernel,i++,sizeof(float),(void *)&fThreshold); + + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + } + + /* launch the kernel */ + { + size_t gsize[2]; + size_t wsize[2]; + + gsize[0] = image->columns; + gsize[1] = chunkSize*((image->rows+chunkSize-1)/chunkSize); + wsize[0] = 1; + wsize[1] = chunkSize; + + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, unsharpMaskBlurColumnKernel, 2, NULL, gsize, wsize, event_count, events, &event); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,UnsharpMaskBlurColumnKernel,event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage,event); + } + clEnv->library->clReleaseEvent(event); + } + + } + + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + if (kernel != NULL) kernel=DestroyKernelInfo(kernel); + if (tempImageBuffer!=NULL) clEnv->library->clReleaseMemObject(tempImageBuffer); + if (imageKernelBuffer!=NULL) clEnv->library->clReleaseMemObject(imageKernelBuffer); + if (blurRowKernel!=NULL) RelinquishOpenCLKernel(clEnv, blurRowKernel); + if (unsharpMaskBlurColumnKernel!=NULL) RelinquishOpenCLKernel(clEnv, unsharpMaskBlurColumnKernel); + if (queue != NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + return(filteredImage); +} + +static Image *ComputeUnsharpMaskImageSingle(const Image *image, + const double radius,const double sigma,const double gain, + const double threshold,int blurOnly, ExceptionInfo *exception) +{ + char + geometry[MaxTextExtent]; + + cl_command_queue + queue; + + cl_context + context; + + cl_int + justBlur, + clStatus; + + cl_kernel + unsharpMaskKernel; + + cl_event + event; + + cl_mem + filteredImageBuffer, + imageBuffer, + imageKernelBuffer; + + cl_event + *events; + + float + fGain, + fThreshold; + + Image + *filteredImage; + + KernelInfo + *kernel; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + unsigned int + event_count, + i, + imageColumns, + imageRows, + kernelWidth; + + clEnv = NULL; + filteredImage = NULL; + kernel = NULL; + context = NULL; + imageBuffer = NULL; + filteredImageBuffer = NULL; + imageKernelBuffer = NULL; + unsharpMaskKernel = NULL; + queue = NULL; + outputReady = MagickFalse; + + clEnv = GetDefaultOpenCLEnv(); + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + filteredImage = CloneImage(image,0,0,MagickTrue,exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer = GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer = GetAuthenticOpenCLBuffer(filteredImage,exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + /* create the blur kernel */ + { + (void) FormatLocaleString(geometry,MaxTextExtent,"blur:%.20gx%.20g;blur:%.20gx%.20g+90",radius,sigma,radius,sigma); + kernel=AcquireKernelInfo(geometry); + if (kernel == (KernelInfo *) NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireKernelInfo failed.","."); + goto cleanup; + } + + { + float *kernelBufferPtr = (float *) AcquireQuantumMemory(kernel->width, sizeof(float)); + for (i = 0; i < kernel->width; i++) + kernelBufferPtr[i] = (float)kernel->values[i]; + + imageKernelBuffer = clEnv->library->clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, kernel->width * sizeof(float), kernelBufferPtr, &clStatus); + RelinquishMagickMemory(kernelBufferPtr); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clCreateBuffer failed.","."); + goto cleanup; + } + } + } + + { + /* get the opencl kernel */ + { + unsharpMaskKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "UnsharpMask"); + if (unsharpMaskKernel == NULL) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + }; + } + + { + imageColumns = (unsigned int) image->columns; + imageRows = (unsigned int) image->rows; + kernelWidth = (unsigned int) kernel->width; + fGain = (float) gain; + fThreshold = (float) threshold; + justBlur = blurOnly; + + /* set the kernel arguments */ + i = 0; + clStatus=clEnv->library->clSetKernelArg(unsharpMaskKernel,i++,sizeof(cl_mem),(void *)&imageBuffer); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskKernel,i++,sizeof(cl_mem),(void *)&filteredImageBuffer); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskKernel,i++,sizeof(cl_mem),(void *)&imageKernelBuffer); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskKernel,i++,sizeof(unsigned int),(void *)&kernelWidth); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskKernel,i++,sizeof(unsigned int),(void *)&imageColumns); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskKernel,i++,sizeof(unsigned int),(void *)&imageRows); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskKernel,i++,sizeof(cl_float4)*(8 * (32 + kernel->width)),(void *) NULL); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskKernel,i++,sizeof(float),(void *)&fGain); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskKernel,i++,sizeof(float),(void *)&fThreshold); + clStatus|=clEnv->library->clSetKernelArg(unsharpMaskKernel,i++,sizeof(cl_uint),(void *)&justBlur); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clSetKernelArg failed.", "'%s'", "."); + goto cleanup; + } + } + + /* launch the kernel */ + { + size_t gsize[2]; + size_t wsize[2]; + + gsize[0] = ((image->columns + 7) / 8) * 8; + gsize[1] = ((image->rows + 31) / 32) * 32; + wsize[0] = 8; + wsize[1] = 32; + + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, unsharpMaskKernel, 2, NULL, gsize, wsize, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void) OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + if (RecordProfileData(clEnv,UnsharpMaskKernel,event) == MagickFalse) + { + AddOpenCLEvent(image,event); + AddOpenCLEvent(filteredImage, event); + } + clEnv->library->clReleaseEvent(event); + } + } + + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__,__LINE__,exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + if (kernel != NULL) kernel=DestroyKernelInfo(kernel); + if (imageKernelBuffer!=NULL) clEnv->library->clReleaseMemObject(imageKernelBuffer); + if (unsharpMaskKernel!=NULL) RelinquishOpenCLKernel(clEnv, unsharpMaskKernel); + if (queue != NULL) RelinquishOpenCLCommandQueue(clEnv, queue); + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + return(filteredImage); +} + +MagickPrivate Image *AccelerateUnsharpMaskImage(const Image *image, + const ChannelType channel,const double radius,const double sigma, + const double gain,const double threshold,ExceptionInfo *exception) +{ + Image + *filteredImage; + + assert(image != NULL); + assert(exception != (ExceptionInfo *) NULL); + + if ((checkOpenCLEnvironment(exception) == MagickFalse) || + (checkAccelerateCondition(image, channel) == MagickFalse)) + return NULL; + + if (radius < 12.1) + filteredImage = ComputeUnsharpMaskImageSingle(image,radius,sigma,gain,threshold, 0, exception); + else + filteredImage = ComputeUnsharpMaskImage(image,channel,radius,sigma,gain,threshold,exception); + + return(filteredImage); +} + +static Image *ComputeWaveletDenoiseImage(const Image *image, + const double threshold,ExceptionInfo *exception) +{ + cl_command_queue + queue; + + cl_context + context; + + cl_int + clStatus; + + cl_kernel + denoiseKernel; + + cl_event + event; + + cl_mem + filteredImageBuffer, + imageBuffer; + + cl_event + *events; + + Image + *filteredImage; + + MagickBooleanType + outputReady; + + MagickCLEnv + clEnv; + + unsigned int + event_count, + i, + passes; + + clEnv = NULL; + filteredImage = NULL; + context = NULL; + imageBuffer = NULL; + filteredImageBuffer = NULL; + denoiseKernel = NULL; + queue = NULL; + outputReady = MagickFalse; + + clEnv = GetDefaultOpenCLEnv(); + + /* Work around an issue on low end Intel devices */ + if (paramMatchesValue(clEnv,MAGICK_OPENCL_ENV_PARAM_DEVICE_NAME, + "Intel(R) HD Graphics",exception) != MagickFalse) + goto cleanup; + + context = GetOpenCLContext(clEnv); + queue = AcquireOpenCLCommandQueue(clEnv); + + filteredImage = CloneImage(image,0,0,MagickTrue, exception); + if (filteredImage == (Image *) NULL) + goto cleanup; + + imageBuffer = GetAuthenticOpenCLBuffer(image,exception); + if (imageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + filteredImageBuffer = GetAuthenticOpenCLBuffer(filteredImage,exception); + if (filteredImageBuffer == (cl_mem) NULL) + { + (void) OpenCLThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"GetAuthenticOpenCLBuffer failed.","."); + goto cleanup; + } + + /* get the opencl kernel */ + denoiseKernel = AcquireOpenCLKernel(clEnv, MAGICK_OPENCL_ACCELERATE, "WaveletDenoise"); + if (denoiseKernel == NULL) + { + (void)OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "AcquireOpenCLKernel failed.", "'%s'", "."); + goto cleanup; + }; + + /* + Process image. + */ + { + int x; + const int PASSES = 5; + cl_int width = (cl_int)image->columns; + cl_int height = (cl_int)image->rows; + cl_float thresh = threshold; + + passes = (((1.0f * image->columns) * image->rows) + 1999999.0f) / 2000000.0f; + passes = (passes < 1) ? 1 : passes; + + /* set the kernel arguments */ + i = 0; + clStatus |= clEnv->library->clSetKernelArg(denoiseKernel, i++, sizeof(cl_mem), (void *)&imageBuffer); + clStatus |= clEnv->library->clSetKernelArg(denoiseKernel, i++, sizeof(cl_mem), (void *)&filteredImageBuffer); + clStatus |= clEnv->library->clSetKernelArg(denoiseKernel, i++, sizeof(cl_float), (void *)&thresh); + clStatus |= clEnv->library->clSetKernelArg(denoiseKernel, i++, sizeof(cl_int), (void *)&PASSES); + clStatus |= clEnv->library->clSetKernelArg(denoiseKernel, i++, sizeof(cl_int), (void *)&width); + clStatus |= clEnv->library->clSetKernelArg(denoiseKernel, i++, sizeof(cl_int), (void *)&height); + + for (x = 0; x < passes; ++x) + { + const int TILESIZE = 64; + const int PAD = 1 << (PASSES - 1); + const int SIZE = TILESIZE - 2 * PAD; + + size_t gsize[2]; + size_t wsize[2]; + size_t goffset[2]; + + gsize[0] = ((width + (SIZE - 1)) / SIZE) * TILESIZE; + gsize[1] = ((((height + (SIZE - 1)) / SIZE) + passes - 1) / passes) * 4; + wsize[0] = TILESIZE; + wsize[1] = 4; + goffset[0] = 0; + goffset[1] = x * gsize[1]; + + events=GetOpenCLEvents(image,&event_count); + clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, denoiseKernel, 2, goffset, gsize, wsize, event_count, events, &event); + events=(cl_event *) RelinquishMagickMemory(events); + if (clStatus != CL_SUCCESS) + { + (void)OpenCLThrowMagickException(exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", "."); + goto cleanup; + } + clEnv->library->clFlush(queue); + if (RecordProfileData(clEnv, WaveletDenoiseKernel, event) == MagickFalse) + { + AddOpenCLEvent(image, event); + AddOpenCLEvent(filteredImage, event); + } + clEnv->library->clReleaseEvent(event); + } + } + + outputReady=MagickTrue; + +cleanup: + OpenCLLogException(__FUNCTION__, __LINE__, exception); + + if (imageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(imageBuffer); + if (filteredImageBuffer != (cl_mem) NULL) + clEnv->library->clReleaseMemObject(filteredImageBuffer); + if (denoiseKernel != NULL) + RelinquishOpenCLKernel(clEnv, denoiseKernel); + if (queue != NULL) + RelinquishOpenCLCommandQueue(clEnv, queue); + if ((outputReady == MagickFalse) && (filteredImage != NULL)) + filteredImage=(Image *) DestroyImage(filteredImage); + return(filteredImage); +} + +MagickPrivate Image *AccelerateWaveletDenoiseImage(const Image *image, + const double threshold,ExceptionInfo *exception) +{ + Image + *filteredImage; + + assert(image != NULL); + assert(exception != (ExceptionInfo *)NULL); + + if ((checkAccelerateCondition(image,DefaultChannels) == MagickFalse) || + (checkOpenCLEnvironment(exception) == MagickFalse)) + return (Image *) NULL; + + filteredImage=ComputeWaveletDenoiseImage(image,threshold,exception); + + return(filteredImage); +} + +#endif /* MAGICKCORE_OPENCL_SUPPORT */ diff --git a/ImageMagick-6.9.12-44/magick/animate-private.h b/ImageMagick-6.9.12-44/magick/animate-private.h new file mode 100644 index 0000000..e8c2f06 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/animate-private.h @@ -0,0 +1,41 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore private methods to interactively animate an image sequence. +*/ +#ifndef MAGICKCORE_ANIMATE_PRIVATE_H +#define MAGICKCORE_ANIMATE_PRIVATE_H + +#if defined(MAGICKCORE_X11_DELEGATE) +#include "magick/xwindow-private.h" +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if defined(MAGICKCORE_X11_DELEGATE) +extern MagickExport Image + *XAnimateImages(Display *,XResourceInfo *,char **,const int,Image *); + +extern MagickExport void + XAnimateBackgroundImage(Display *,XResourceInfo *,Image *); +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/animate.c b/ImageMagick-6.9.12-44/magick/animate.c new file mode 100644 index 0000000..3488a71 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/animate.c @@ -0,0 +1,3050 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% AAA N N IIIII M M AAA TTTTT EEEEE % +% A A NN N I MM MM A A T E % +% AAAAA N N N I M M M AAAAA T EEE % +% A A N NN I M M A A T E % +% A A N N IIIII M M A A T EEEEE % +% % +% % +% Methods to Interactively Animate an Image Sequence % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/animate.h" +#include "magick/animate-private.h" +#include "magick/attribute.h" +#include "magick/client.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/constitute.h" +#include "magick/delegate.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image-private.h" +#include "magick/layer.h" +#include "magick/list.h" +#include "magick/locale-private.h" +#include "magick/log.h" +#include "magick/image.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/property.h" +#include "magick/resource_.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/timer-private.h" +#include "magick/transform.h" +#include "magick/utility.h" +#include "magick/version.h" +#include "magick/widget.h" +#include "magick/xwindow-private.h" + +#if defined(MAGICKCORE_X11_DELEGATE) +/* + Animate state declarations. +*/ +#define AutoReverseAnimationState 0x0004 +#define ForwardAnimationState 0x0008 +#define HighlightState 0x0010 +#define PlayAnimationState 0x0020 +#define RepeatAnimationState 0x0040 +#define StepAnimationState 0x0080 + +/* + Static declarations. +*/ +static const char + AnimateHelp[] = + { + "BUTTONS\n" + "\n" + " Press any button to map or unmap the Command widget.\n" + "\n" + "COMMAND WIDGET\n" + " The Command widget lists a number of sub-menus and commands.\n" + " They are\n" + "\n" + " Animate\n" + " Open...\n" + " Save...\n" + " Play\n" + " Step\n" + " Repeat\n" + " Auto Reverse\n" + " Speed\n" + " Slower\n" + " Faster\n" + " Direction\n" + " Forward\n" + " Reverse\n" + " Help\n" + " Overview\n" + " Browse Documentation\n" + " About Animate\n" + " Image Info\n" + " Quit\n" + "\n" + " Menu items with a indented triangle have a sub-menu. They\n" + " are represented above as the indented items. To access a\n" + " sub-menu item, move the pointer to the appropriate menu and\n" + " press a button and drag. When you find the desired sub-menu\n" + " item, release the button and the command is executed. Move\n" + " the pointer away from the sub-menu if you decide not to\n" + " execute a particular command.\n" + "\n" + "KEYBOARD ACCELERATORS\n" + " Accelerators are one or two key presses that effect a\n" + " particular command. The keyboard accelerators that\n" + " animate(1) understands is:\n" + "\n" + " Ctl+O Press to open an image from a file.\n" + "\n" + " space Press to display the next image in the sequence.\n" + "\n" + " < Press to speed-up the display of the images. Refer to\n" + " -delay for more information.\n" + "\n" + " > Press to slow the display of the images. Refer to\n" + " -delay for more information.\n" + "\n" + " F1 Press to display helpful information about animate(1).\n" + "\n" + " Find Press to browse documentation about ImageMagick.\n" + "\n" + " ? Press to display information about the image. Press\n" + " any key or button to erase the information.\n" + "\n" + " This information is printed: image name; image size;\n" + " and the total number of unique colors in the image.\n" + "\n" + " Ctl-q Press to discard all images and exit program.\n" + }; + +/* + Constant declarations. +*/ +static const char + *PageSizes[] = + { + "Letter", + "Tabloid", + "Ledger", + "Legal", + "Statement", + "Executive", + "A3", + "A4", + "A5", + "B4", + "B5", + "Folio", + "Quarto", + "10x14", + (char *) NULL + }; + +static const unsigned char + HighlightBitmap[8] = + { + (unsigned char) 0xaa, + (unsigned char) 0x55, + (unsigned char) 0xaa, + (unsigned char) 0x55, + (unsigned char) 0xaa, + (unsigned char) 0x55, + (unsigned char) 0xaa, + (unsigned char) 0x55 + }, + ShadowBitmap[8] = + { + (unsigned char) 0x00, + (unsigned char) 0x00, + (unsigned char) 0x00, + (unsigned char) 0x00, + (unsigned char) 0x00, + (unsigned char) 0x00, + (unsigned char) 0x00, + (unsigned char) 0x00 + }; + +/* + Enumeration declarations. +*/ +typedef enum +{ + OpenCommand, + SaveCommand, + PlayCommand, + StepCommand, + RepeatCommand, + AutoReverseCommand, + SlowerCommand, + FasterCommand, + ForwardCommand, + ReverseCommand, + HelpCommand, + BrowseDocumentationCommand, + VersionCommand, + InfoCommand, + QuitCommand, + StepBackwardCommand, + StepForwardCommand, + NullCommand +} CommandType; + +/* + Stipples. +*/ +#define HighlightWidth 8 +#define HighlightHeight 8 +#define ShadowWidth 8 +#define ShadowHeight 8 + +/* + Forward declarations. +*/ +static Image + *XMagickCommand(Display *,XResourceInfo *,XWindows *,const CommandType, + Image **,MagickStatusType *); + +static MagickBooleanType + XSaveImage(Display *,XResourceInfo *,XWindows *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A n i m a t e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AnimateImages() repeatedly displays an image sequence to any X window +% screen. It returns a value other than 0 if successful. Check the +% exception member of image to determine the reason for any failure. +% +% The format of the AnimateImages method is: +% +% MagickBooleanType AnimateImages(const ImageInfo *image_info, +% Image *images) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType AnimateImages(const ImageInfo *image_info, + Image *images) +{ + char + *argv[1]; + + Display + *display; + + MagickStatusType + status; + + XrmDatabase + resource_database; + + XResourceInfo + resource_info; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(images != (Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + display=XOpenDisplay(image_info->server_name); + if (display == (Display *) NULL) + { + (void) ThrowMagickException(&images->exception,GetMagickModule(), + XServerError,"UnableToOpenXServer","`%s'",XDisplayName( + image_info->server_name)); + return(MagickFalse); + } + if (images->exception.severity != UndefinedException) + CatchException(&images->exception); + (void) XSetErrorHandler(XError); + resource_database=XGetResourceDatabase(display,GetClientName()); + (void) memset(&resource_info,0,sizeof(XResourceInfo)); + XGetResourceInfo(image_info,resource_database,GetClientName(),&resource_info); + if (image_info->page != (char *) NULL) + resource_info.image_geometry=AcquireString(image_info->page); + resource_info.immutable=MagickTrue; + argv[0]=AcquireString(GetClientName()); + (void) XAnimateImages(display,&resource_info,argv,1,images); + (void) SetErrorHandler((ErrorHandler) NULL); + (void) SetWarningHandler((WarningHandler) NULL); + argv[0]=DestroyString(argv[0]); + (void) XCloseDisplay(display); + XDestroyResourceInfo(&resource_info); + status=images->exception.severity == UndefinedException ? + MagickTrue : MagickFalse; + return(status != 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ X M a g i c k C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% XMagickCommand() makes a transform to the image or Image window as specified +% by a user menu button or keyboard command. +% +% The format of the XMagickCommand method is: +% +% Image *XMagickCommand(Display *display,XResourceInfo *resource_info, +% XWindows *windows,const CommandType command_type,Image **image, +% MagickStatusType *state) +% +% A description of each parameter follows: +% +% o display: Specifies a connection to an X server; returned from +% XOpenDisplay. +% +% o resource_info: Specifies a pointer to a X11 XResourceInfo structure. +% +% o windows: Specifies a pointer to a XWindows structure. +% +% o image: the image; XMagickCommand +% may transform the image and return a new image pointer. +% +% o state: Specifies a MagickStatusType; XMagickCommand may return a +% modified state. +% +% +*/ +static Image *XMagickCommand(Display *display,XResourceInfo *resource_info, + XWindows *windows,const CommandType command_type,Image **image, + MagickStatusType *state) +{ + Image + *nexus; + + MagickBooleanType + proceed; + + MagickStatusType + status; + + XTextProperty + window_name; + + /* + Process user command. + */ + nexus=NewImageList(); + switch (command_type) + { + case OpenCommand: + { + char + **filelist; + + ExceptionInfo + *exception; + + Image + *images, + *next; + + ImageInfo + *read_info; + + int + number_files; + + int + i; + + static char + filenames[MaxTextExtent] = "*"; + + if (resource_info->immutable != MagickFalse) + break; + /* + Request file name from user. + */ + XFileBrowserWidget(display,windows,"Animate",filenames); + if (*filenames == '\0') + return((Image *) NULL); + /* + Expand the filenames. + */ + filelist=(char **) AcquireMagickMemory(sizeof(char *)); + if (filelist == (char **) NULL) + { + ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed", + filenames); + return((Image *) NULL); + } + number_files=1; + filelist[0]=filenames; + status=ExpandFilenames(&number_files,&filelist); + if ((status == MagickFalse) || (number_files == 0)) + { + for (i=0; i < number_files; i++) + filelist[i]=DestroyString(filelist[i]); + filelist=(char **) RelinquishMagickMemory(filelist); + if (number_files == 0) + { + ThrowXWindowException(ImageError,"NoImagesWereLoaded",filenames); + return((Image *) NULL); + } + ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed", + filenames); + return((Image *) NULL); + } + read_info=CloneImageInfo(resource_info->image_info); + exception=AcquireExceptionInfo(); + images=NewImageList(); + XSetCursorState(display,windows,MagickTrue); + XCheckRefreshWindows(display,windows); + for (i=0; i < number_files; i++) + { + (void) CopyMagickString(read_info->filename,filelist[i],MaxTextExtent); + filelist[i]=DestroyString(filelist[i]); + *read_info->magick='\0'; + next=ReadImage(read_info,exception); + CatchException(exception); + if (next != (Image *) NULL) + AppendImageToList(&images,next); + if (number_files <= 5) + continue; + proceed=SetImageProgress(images,LoadImageTag,i,(MagickSizeType) + number_files); + if (proceed == MagickFalse) + break; + } + filelist=(char **) RelinquishMagickMemory(filelist); + exception=DestroyExceptionInfo(exception); + read_info=DestroyImageInfo(read_info); + if (images == (Image *) NULL) + { + XSetCursorState(display,windows,MagickFalse); + ThrowXWindowException(ImageError,"NoImagesWereLoaded",filenames); + return((Image *) NULL); + } + nexus=GetFirstImageInList(images); + *state|=ExitState; + break; + } + case PlayCommand: + { + char + basename[MaxTextExtent], + name[MaxTextExtent]; + + int + status; + + /* + Window name is the base of the filename. + */ + *state|=PlayAnimationState; + *state&=(~AutoReverseAnimationState); + GetPathComponent((*image)->magick_filename,BasePath,basename); + (void) FormatLocaleString(name,MaxTextExtent,"%s: %s", MagickPackageName, + basename); + (void) CloneString(&windows->image.name,name); + if (resource_info->title != (char *) NULL) + { + char + *title; + + title=InterpretImageProperties(resource_info->image_info,*image, + resource_info->title); + (void) CloneString(&windows->image.name,title); + title=DestroyString(title); + } + status=XStringListToTextProperty(&windows->image.name,1,&window_name); + if (status == 0) + break; + XSetWMName(display,windows->image.id,&window_name); + (void) XFree((void *) window_name.value); + break; + } + case StepCommand: + case StepBackwardCommand: + case StepForwardCommand: + { + *state|=StepAnimationState; + *state&=(~PlayAnimationState); + if (command_type == StepBackwardCommand) + *state&=(~ForwardAnimationState); + if (command_type == StepForwardCommand) + *state|=ForwardAnimationState; + if (resource_info->title != (char *) NULL) + break; + break; + } + case RepeatCommand: + { + *state|=RepeatAnimationState; + *state&=(~AutoReverseAnimationState); + *state|=PlayAnimationState; + break; + } + case AutoReverseCommand: + { + *state|=AutoReverseAnimationState; + *state&=(~RepeatAnimationState); + *state|=PlayAnimationState; + break; + } + case SaveCommand: + { + /* + Save image. + */ + status=XSaveImage(display,resource_info,windows,*image); + if (status == MagickFalse) + { + char + message[MaxTextExtent]; + + (void) FormatLocaleString(message,MaxTextExtent,"%s:%s", + (*image)->exception.reason != (char *) NULL ? + (*image)->exception.reason : "", + (*image)->exception.description != (char *) NULL ? + (*image)->exception.description : ""); + XNoticeWidget(display,windows,"Unable to save file:",message); + break; + } + break; + } + case SlowerCommand: + { + resource_info->delay++; + break; + } + case FasterCommand: + { + if (resource_info->delay == 0) + break; + resource_info->delay--; + break; + } + case ForwardCommand: + { + *state=ForwardAnimationState; + *state&=(~AutoReverseAnimationState); + break; + } + case ReverseCommand: + { + *state&=(~ForwardAnimationState); + *state&=(~AutoReverseAnimationState); + break; + } + case InfoCommand: + { + XDisplayImageInfo(display,resource_info,windows,(Image *) NULL,*image); + break; + } + case HelpCommand: + { + /* + User requested help. + */ + XTextViewHelp(display,resource_info,windows,MagickFalse, + "Help Viewer - Animate",AnimateHelp); + break; + } + case BrowseDocumentationCommand: + { + Atom + mozilla_atom; + + Window + mozilla_window, + root_window; + + /* + Browse the ImageMagick documentation. + */ + root_window=XRootWindow(display,XDefaultScreen(display)); + mozilla_atom=XInternAtom(display,"_MOZILLA_VERSION",MagickFalse); + mozilla_window=XWindowByProperty(display,root_window,mozilla_atom); + if (mozilla_window != (Window) NULL) + { + char + command[MaxTextExtent]; + + /* + Display documentation using Netscape remote control. + */ + (void) FormatLocaleString(command,MaxTextExtent, + "openurl(%s,new-tab)",MagickAuthoritativeURL); + mozilla_atom=XInternAtom(display,"_MOZILLA_COMMAND",MagickFalse); + (void) XChangeProperty(display,mozilla_window,mozilla_atom, + XA_STRING,8,PropModeReplace,(unsigned char *) command, + (int) strlen(command)); + XSetCursorState(display,windows,MagickFalse); + break; + } + XSetCursorState(display,windows,MagickTrue); + XCheckRefreshWindows(display,windows); + status=InvokeDelegate(resource_info->image_info,*image,"browse", + (char *) NULL,&(*image)->exception); + if (status == MagickFalse) + XNoticeWidget(display,windows,"Unable to browse documentation", + (char *) NULL); + XDelay(display,1500); + XSetCursorState(display,windows,MagickFalse); + break; + } + case VersionCommand: + { + XNoticeWidget(display,windows,GetMagickVersion((size_t *) NULL), + GetMagickCopyright()); + break; + } + case QuitCommand: + { + /* + exit program + */ + if (resource_info->confirm_exit == MagickFalse) + XClientMessage(display,windows->image.id,windows->im_protocols, + windows->im_exit,CurrentTime); + else + { + int + status; + + /* + Confirm program exit. + */ + status=XConfirmWidget(display,windows,"Do you really want to exit", + resource_info->client_name); + if (status != 0) + XClientMessage(display,windows->image.id,windows->im_protocols, + windows->im_exit,CurrentTime); + } + break; + } + default: + break; + } + return(nexus); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ X A n i m a t e B a c k g r o u n d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% XAnimateBackgroundImage() animates an image sequence in the background of +% a window. +% +% The format of the XAnimateBackgroundImage method is: +% +% void XAnimateBackgroundImage(Display *display, +% XResourceInfo *resource_info,Image *images) +% +% A description of each parameter follows: +% +% o display: Specifies a connection to an X server; returned from +% XOpenDisplay. +% +% o resource_info: Specifies a pointer to a X11 XResourceInfo structure. +% +% o images: the image list. +% +*/ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static int SceneCompare(const void *x,const void *y) +{ + const Image + **image_1, + **image_2; + + image_1=(const Image **) x; + image_2=(const Image **) y; + return((int) ((*image_1)->scene-(*image_2)->scene)); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +MagickExport void XAnimateBackgroundImage(Display *display, + XResourceInfo *resource_info,Image *images) +{ + char + geometry[MaxTextExtent], + visual_type[MaxTextExtent]; + + Image + *coalesce_image, + *display_image, + **image_list; + + int + scene; + + MagickStatusType + status; + + RectangleInfo + geometry_info; + + ssize_t + i; + + size_t + delay, + number_scenes; + + ssize_t + iterations; + + static XPixelInfo + pixel; + + static XStandardColormap + *map_info; + + static XVisualInfo + *visual_info = (XVisualInfo *) NULL; + + static XWindowInfo + window_info; + + unsigned int + height, + width; + + Window + root_window; + + XEvent + event; + + XGCValues + context_values; + + XResourceInfo + resources; + + XWindowAttributes + window_attributes; + + /* + Determine target window. + */ + assert(images != (Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + resources=(*resource_info); + window_info.id=(Window) NULL; + root_window=XRootWindow(display,XDefaultScreen(display)); + if (LocaleCompare(resources.window_id,"root") == 0) + window_info.id=root_window; + else + { + if (isdigit((int) ((unsigned char) *resources.window_id)) != 0) + window_info.id=XWindowByID(display,root_window, + (Window) strtol((char *) resources.window_id,(char **) NULL,0)); + if (window_info.id == (Window) NULL) + window_info.id= + XWindowByName(display,root_window,resources.window_id); + } + if (window_info.id == (Window) NULL) + { + ThrowXWindowException(XServerError,"NoWindowWithSpecifiedIDExists", + resources.window_id); + return; + } + /* + Determine window visual id. + */ + window_attributes.width=XDisplayWidth(display,XDefaultScreen(display)); + window_attributes.height=XDisplayHeight(display,XDefaultScreen(display)); + (void) CopyMagickString(visual_type,"default",MaxTextExtent); + status=XGetWindowAttributes(display,window_info.id,&window_attributes) != 0 ? + MagickTrue : MagickFalse; + if (status != MagickFalse) + (void) FormatLocaleString(visual_type,MaxTextExtent,"0x%lx", + XVisualIDFromVisual(window_attributes.visual)); + if (visual_info == (XVisualInfo *) NULL) + { + /* + Allocate standard colormap. + */ + map_info=XAllocStandardColormap(); + if (map_info == (XStandardColormap *) NULL) + ThrowXWindowFatalException(ResourceLimitFatalError, + "MemoryAllocationFailed",images->filename); + map_info->colormap=(Colormap) NULL; + pixel.pixels=(unsigned long *) NULL; + /* + Initialize visual info. + */ + resources.map_type=(char *) NULL; + resources.visual_type=visual_type; + visual_info=XBestVisualInfo(display,map_info,&resources); + if (visual_info == (XVisualInfo *) NULL) + ThrowXWindowFatalException(XServerFatalError,"UnableToGetVisual", + images->filename); + /* + Initialize window info. + */ + window_info.ximage=(XImage *) NULL; + window_info.matte_image=(XImage *) NULL; + window_info.pixmap=(Pixmap) NULL; + window_info.matte_pixmap=(Pixmap) NULL; + } + /* + Free previous root colors. + */ + if (window_info.id == root_window) + XDestroyWindowColors(display,root_window); + coalesce_image=CoalesceImages(images,&images->exception); + if (coalesce_image == (Image *) NULL) + ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + images->filename); + images=coalesce_image; + if (resources.map_type == (char *) NULL) + if ((visual_info->klass != TrueColor) && + (visual_info->klass != DirectColor)) + { + Image + *next; + + /* + Determine if the sequence of images has the identical colormap. + */ + for (next=images; next != (Image *) NULL; ) + { + next->matte=MagickFalse; + if ((next->storage_class == DirectClass) || + (next->colors != images->colors) || + (next->colors > (size_t) visual_info->colormap_size)) + break; + for (i=0; i < (ssize_t) images->colors; i++) + if (IsColorEqual(next->colormap+i,images->colormap+i) == MagickFalse) + break; + if (i < (ssize_t) images->colors) + break; + next=GetNextImageInList(next); + } + if (next != (Image *) NULL) + (void) RemapImages(resources.quantize_info,images,(Image *) NULL); + } + /* + Sort images by increasing scene number. + */ + number_scenes=GetImageListLength(images); + image_list=ImageListToArray(images,&images->exception); + if (image_list == (Image **) NULL) + ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + images->filename); + for (i=0; i < (ssize_t) number_scenes; i++) + if (image_list[i]->scene == 0) + break; + if (i == (ssize_t) number_scenes) + qsort((void *) image_list,number_scenes,sizeof(Image *),SceneCompare); + /* + Initialize Standard Colormap. + */ + resources.colormap=SharedColormap; + display_image=image_list[0]; + for (scene=0; scene < (int) number_scenes; scene++) + { + if ((resource_info->map_type != (char *) NULL) || + (visual_info->klass == TrueColor) || + (visual_info->klass == DirectColor)) + (void) SetImageType(image_list[scene],image_list[scene]->matte == + MagickFalse ? TrueColorType : TrueColorMatteType); + if ((display_image->columns < image_list[scene]->columns) && + (display_image->rows < image_list[scene]->rows)) + display_image=image_list[scene]; + } + if ((resource_info->map_type != (char *) NULL) || + (visual_info->klass == TrueColor) || (visual_info->klass == DirectColor)) + (void) SetImageType(display_image,display_image->matte == MagickFalse ? + TrueColorType : TrueColorMatteType); + XMakeStandardColormap(display,visual_info,&resources,display_image,map_info, + &pixel); + /* + Graphic context superclass. + */ + context_values.background=pixel.background_color.pixel; + context_values.foreground=pixel.foreground_color.pixel; + pixel.annotate_context=XCreateGC(display,window_info.id,(unsigned long) + (GCBackground | GCForeground),&context_values); + if (pixel.annotate_context == (GC) NULL) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateGraphicContext", + images->filename); + /* + Initialize Image window attributes. + */ + XGetWindowInfo(display,visual_info,map_info,&pixel,(XFontStruct *) NULL, + &resources,&window_info); + /* + Create the X image. + */ + window_info.width=(unsigned int) image_list[0]->columns; + window_info.height=(unsigned int) image_list[0]->rows; + if ((image_list[0]->columns != window_info.width) || + (image_list[0]->rows != window_info.height)) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateXImage", + image_list[0]->filename); + (void) FormatLocaleString(geometry,MaxTextExtent,"%ux%u+0+0>", + window_attributes.width,window_attributes.height); + geometry_info.width=window_info.width; + geometry_info.height=window_info.height; + geometry_info.x=(ssize_t) window_info.x; + geometry_info.y=(ssize_t) window_info.y; + (void) ParseMetaGeometry(geometry,&geometry_info.x,&geometry_info.y, + &geometry_info.width,&geometry_info.height); + window_info.width=(unsigned int) geometry_info.width; + window_info.height=(unsigned int) geometry_info.height; + window_info.x=(int) geometry_info.x; + window_info.y=(int) geometry_info.y; + status=XMakeImage(display,&resources,&window_info,image_list[0], + window_info.width,window_info.height); + if (status == MagickFalse) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateXImage", + images->filename); + window_info.x=0; + window_info.y=0; + if (display_image->debug != MagickFalse) + { + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Image: %s[%.20g] %.20gx%.20g ",image_list[0]->filename,(double) + image_list[0]->scene,(double) image_list[0]->columns,(double) + image_list[0]->rows); + if (image_list[0]->colors != 0) + (void) LogMagickEvent(X11Event,GetMagickModule(),"%.20gc ",(double) + image_list[0]->colors); + (void) LogMagickEvent(X11Event,GetMagickModule(),"%s", + image_list[0]->magick); + } + /* + Adjust image dimensions as specified by backdrop or geometry options. + */ + width=window_info.width; + height=window_info.height; + if (resources.backdrop != MagickFalse) + { + /* + Center image on window. + */ + window_info.x=(int) (window_attributes.width/2)- + (window_info.ximage->width/2); + window_info.y=(int) (window_attributes.height/2)- + (window_info.ximage->height/2); + width=(unsigned int) window_attributes.width; + height=(unsigned int) window_attributes.height; + } + if (resources.image_geometry != (char *) NULL) + { + char + default_geometry[MaxTextExtent]; + + int + flags, + gravity; + + XSizeHints + *size_hints; + + /* + User specified geometry. + */ + size_hints=XAllocSizeHints(); + if (size_hints == (XSizeHints *) NULL) + ThrowXWindowFatalException(ResourceLimitFatalError, + "MemoryAllocationFailed",images->filename); + size_hints->flags=0L; + (void) FormatLocaleString(default_geometry,MaxTextExtent,"%ux%u",width, + height); + flags=XWMGeometry(display,visual_info->screen,resources.image_geometry, + default_geometry,window_info.border_width,size_hints,&window_info.x, + &window_info.y,(int *) &width,(int *) &height,&gravity); + if (((flags & (XValue | YValue))) != 0) + { + width=(unsigned int) window_attributes.width; + height=(unsigned int) window_attributes.height; + } + (void) XFree((void *) size_hints); + } + /* + Create the X pixmap. + */ + window_info.pixmap=XCreatePixmap(display,window_info.id,(unsigned int) width, + (unsigned int) height,window_info.depth); + if (window_info.pixmap == (Pixmap) NULL) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateXPixmap", + images->filename); + /* + Display pixmap on the window. + */ + if (((unsigned int) width > window_info.width) || + ((unsigned int) height > window_info.height)) + (void) XFillRectangle(display,window_info.pixmap, + window_info.annotate_context,0,0,(unsigned int) width, + (unsigned int) height); + (void) XPutImage(display,window_info.pixmap,window_info.annotate_context, + window_info.ximage,0,0,window_info.x,window_info.y,window_info.width, + window_info.height); + (void) XSetWindowBackgroundPixmap(display,window_info.id,window_info.pixmap); + (void) XClearWindow(display,window_info.id); + /* + Initialize image pixmaps structure. + */ + window_info.pixmaps=(Pixmap *) AcquireQuantumMemory(number_scenes, + sizeof(*window_info.pixmaps)); + window_info.matte_pixmaps=(Pixmap *) AcquireQuantumMemory(number_scenes, + sizeof(*window_info.matte_pixmaps)); + if ((window_info.pixmaps == (Pixmap *) NULL) || + (window_info.matte_pixmaps == (Pixmap *) NULL)) + ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + images->filename); + window_info.pixmaps[0]=window_info.pixmap; + window_info.matte_pixmaps[0]=window_info.pixmap; + for (scene=1; scene < (int) number_scenes; scene++) + { + unsigned int + columns, + rows; + + /* + Create X image. + */ + window_info.pixmap=(Pixmap) NULL; + window_info.matte_pixmap=(Pixmap) NULL; + if ((resources.map_type != (char *) NULL) || + (visual_info->klass == TrueColor) || + (visual_info->klass == DirectColor)) + if (image_list[scene]->storage_class == PseudoClass) + XGetPixelPacket(display,visual_info,map_info,&resources, + image_list[scene],window_info.pixel_info); + columns=(unsigned int) image_list[scene]->columns; + rows=(unsigned int) image_list[scene]->rows; + if ((image_list[scene]->columns != columns) || + (image_list[scene]->rows != rows)) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateXImage", + image_list[scene]->filename); + status=XMakeImage(display,&resources,&window_info,image_list[scene], + columns,rows); + if (status == MagickFalse) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateXImage", + images->filename); + if (display_image->debug != MagickFalse) + { + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Image: [%.20g] %s %.20gx%.20g ",(double) image_list[scene]->scene, + image_list[scene]->filename,(double) columns,(double) rows); + if (image_list[scene]->colors != 0) + (void) LogMagickEvent(X11Event,GetMagickModule(),"%.20gc ",(double) + image_list[scene]->colors); + (void) LogMagickEvent(X11Event,GetMagickModule(),"%s", + image_list[scene]->magick); + } + /* + Create the X pixmap. + */ + window_info.pixmap=XCreatePixmap(display,window_info.id,width,height, + window_info.depth); + if (window_info.pixmap == (Pixmap) NULL) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateXPixmap", + images->filename); + /* + Display pixmap on the window. + */ + if ((width > window_info.width) || (height > window_info.height)) + (void) XFillRectangle(display,window_info.pixmap, + window_info.annotate_context,0,0,width,height); + (void) XPutImage(display,window_info.pixmap,window_info.annotate_context, + window_info.ximage,0,0,window_info.x,window_info.y,window_info.width, + window_info.height); + (void) XSetWindowBackgroundPixmap(display,window_info.id, + window_info.pixmap); + (void) XClearWindow(display,window_info.id); + window_info.pixmaps[scene]=window_info.pixmap; + window_info.matte_pixmaps[scene]=window_info.matte_pixmap; + if (image_list[scene]->matte) + (void) XClearWindow(display,window_info.id); + delay=1000*image_list[scene]->delay/MagickMax( + image_list[scene]->ticks_per_second,1L); + XDelay(display,resources.delay*(delay == 0 ? 10 : delay)); + } + window_info.pixel_info=(&pixel); + /* + Display pixmap on the window. + */ + (void) XSelectInput(display,window_info.id,SubstructureNotifyMask); + event.type=Expose; + iterations=0; + do + { + for (scene=0; scene < (int) number_scenes; scene++) + { + if (XEventsQueued(display,QueuedAfterFlush) > 0) + { + (void) XNextEvent(display,&event); + if (event.type == DestroyNotify) + break; + } + window_info.pixmap=window_info.pixmaps[scene]; + window_info.matte_pixmap=window_info.matte_pixmaps[scene]; + (void) XSetWindowBackgroundPixmap(display,window_info.id, + window_info.pixmap); + (void) XClearWindow(display,window_info.id); + (void) XSync(display,MagickFalse); + delay=1000*image_list[scene]->delay/MagickMax( + image_list[scene]->ticks_per_second,1L); + XDelay(display,resources.delay*(delay == 0 ? 10 : delay)); + } + iterations++; + if (iterations == (ssize_t) image_list[0]->iterations) + break; + } while (event.type != DestroyNotify); + (void) XSync(display,MagickFalse); + image_list=(Image **) RelinquishMagickMemory(image_list); + images=DestroyImageList(images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ X A n i m a t e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% XAnimateImages() displays an image via X11. +% +% The format of the XAnimateImages method is: +% +% Image *XAnimateImages(Display *display,XResourceInfo *resource_info, +% char **argv,const int argc,Image *images) +% +% A description of each parameter follows: +% +% o display: Specifies a connection to an X server; returned from +% XOpenDisplay. +% +% o resource_info: Specifies a pointer to a X11 XResourceInfo structure. +% +% o argv: Specifies the application's argument list. +% +% o argc: Specifies the number of arguments. +% +% o images: the image list. +% +*/ +MagickExport Image *XAnimateImages(Display *display, + XResourceInfo *resource_info,char **argv,const int argc,Image *images) +{ +#define MagickMenus 4 +#define MaXWindows 8 +#define MagickTitle "Commands" + + const char + *const CommandMenu[]= + { + "Animate", + "Speed", + "Direction", + "Help", + "Image Info", + "Quit", + (char *) NULL + }, + *const AnimateMenu[]= + { + "Open...", + "Play", + "Step", + "Repeat", + "Auto Reverse", + "Save...", + (char *) NULL + }, + *const SpeedMenu[]= + { + "Faster", + "Slower", + (char *) NULL + }, + *const DirectionMenu[]= + { + "Forward", + "Reverse", + (char *) NULL + }, + *const HelpMenu[]= + { + "Overview", + "Browse Documentation", + "About Animate", + (char *) NULL + }; + + const char + *const *Menus[MagickMenus]= + { + AnimateMenu, + SpeedMenu, + DirectionMenu, + HelpMenu + }; + + static const CommandType + CommandMenus[]= + { + NullCommand, + NullCommand, + NullCommand, + NullCommand, + InfoCommand, + QuitCommand + }, + CommandTypes[]= + { + OpenCommand, + PlayCommand, + StepCommand, + RepeatCommand, + AutoReverseCommand, + SaveCommand + }, + SpeedCommands[]= + { + FasterCommand, + SlowerCommand + }, + DirectionCommands[]= + { + ForwardCommand, + ReverseCommand + }, + HelpCommands[]= + { + HelpCommand, + BrowseDocumentationCommand, + VersionCommand + }; + + static const CommandType + *Commands[MagickMenus]= + { + CommandTypes, + SpeedCommands, + DirectionCommands, + HelpCommands + }; + + char + command[MaxTextExtent], + *directory, + geometry[MaxTextExtent], + resource_name[MaxTextExtent]; + + CommandType + command_type; + + Image + *coalesce_image, + *display_image, + *image, + **image_list, + *nexus; + + int + status; + + KeySym + key_symbol; + + MagickStatusType + context_mask, + state; + + RectangleInfo + geometry_info; + + char + *p; + + ssize_t + i; + + ssize_t + first_scene, + iterations, + scene; + + static char + working_directory[MaxTextExtent]; + + static size_t + number_windows; + + static XWindowInfo + *magick_windows[MaXWindows]; + + time_t + timestamp; + + size_t + delay, + number_scenes; + + WarningHandler + warning_handler; + + Window + root_window; + + XClassHint + *class_hints; + + XEvent + event; + + XFontStruct + *font_info; + + XGCValues + context_values; + + XPixelInfo + *icon_pixel, + *pixel; + + XResourceInfo + *icon_resources; + + XStandardColormap + *icon_map, + *map_info; + + XTextProperty + window_name; + + XVisualInfo + *icon_visual, + *visual_info; + + XWindowChanges + window_changes; + + XWindows + *windows; + + XWMHints + *manager_hints; + + assert(images != (Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + warning_handler=(WarningHandler) NULL; + windows=XSetWindows((XWindows *) ~0); + if (windows != (XWindows *) NULL) + { + int + status; + + if (*working_directory == '\0') + (void) CopyMagickString(working_directory,".",MaxTextExtent); + status=chdir(working_directory); + if (status == -1) + (void) ThrowMagickException(&images->exception,GetMagickModule(), + FileOpenError,"UnableToOpenFile","%s",working_directory); + warning_handler=resource_info->display_warnings ? + SetErrorHandler(XWarning) : SetErrorHandler((ErrorHandler) NULL); + warning_handler=resource_info->display_warnings ? + SetWarningHandler(XWarning) : SetWarningHandler((WarningHandler) NULL); + } + else + { + Image + *p; + + /* + Initialize window structure. + */ + for (p=images; p != (Image *) NULL; p=GetNextImageInList(p)) + { + if (p->storage_class == DirectClass) + { + resource_info->colors=0; + break; + } + if (p->colors > resource_info->colors) + resource_info->colors=p->colors; + } + windows=XSetWindows(XInitializeWindows(display,resource_info)); + if (windows == (XWindows *) NULL) + ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed", + images->filename); + /* + Initialize window id's. + */ + number_windows=0; + magick_windows[number_windows++]=(&windows->icon); + magick_windows[number_windows++]=(&windows->backdrop); + magick_windows[number_windows++]=(&windows->image); + magick_windows[number_windows++]=(&windows->info); + magick_windows[number_windows++]=(&windows->command); + magick_windows[number_windows++]=(&windows->widget); + magick_windows[number_windows++]=(&windows->popup); + for (i=0; i < (ssize_t) number_windows; i++) + magick_windows[i]->id=(Window) NULL; + } + /* + Initialize font info. + */ + if (windows->font_info != (XFontStruct *) NULL) + (void) XFreeFont(display,windows->font_info); + windows->font_info=XBestFont(display,resource_info,MagickFalse); + if (windows->font_info == (XFontStruct *) NULL) + ThrowXWindowFatalException(XServerFatalError,"UnableToLoadFont", + resource_info->font); + /* + Initialize Standard Colormap. + */ + map_info=windows->map_info; + icon_map=windows->icon_map; + visual_info=windows->visual_info; + icon_visual=windows->icon_visual; + pixel=windows->pixel_info; + icon_pixel=windows->icon_pixel; + font_info=windows->font_info; + icon_resources=windows->icon_resources; + class_hints=windows->class_hints; + manager_hints=windows->manager_hints; + root_window=XRootWindow(display,visual_info->screen); + coalesce_image=CoalesceImages(images,&images->exception); + if (coalesce_image == (Image *) NULL) + ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed", + images->filename); + images=coalesce_image; + if (resource_info->map_type == (char *) NULL) + if ((visual_info->klass != TrueColor) && + (visual_info->klass != DirectColor)) + { + Image + *next; + + /* + Determine if the sequence of images has the identical colormap. + */ + for (next=images; next != (Image *) NULL; ) + { + next->matte=MagickFalse; + if ((next->storage_class == DirectClass) || + (next->colors != images->colors) || + (next->colors > (size_t) visual_info->colormap_size)) + break; + for (i=0; i < (ssize_t) images->colors; i++) + if (IsColorEqual(next->colormap+i,images->colormap+i) == MagickFalse) + break; + if (i < (ssize_t) images->colors) + break; + next=GetNextImageInList(next); + } + if (next != (Image *) NULL) + (void) RemapImages(resource_info->quantize_info,images, + (Image *) NULL); + } + /* + Sort images by increasing scene number. + */ + number_scenes=GetImageListLength(images); + image_list=ImageListToArray(images,&images->exception); + if (image_list == (Image **) NULL) + ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + images->filename); + for (scene=0; scene < (ssize_t) number_scenes; scene++) + if (image_list[scene]->scene == 0) + break; + if (scene == (ssize_t) number_scenes) + qsort((void *) image_list,number_scenes,sizeof(Image *),SceneCompare); + /* + Initialize Standard Colormap. + */ + nexus=NewImageList(); + display_image=image_list[0]; + for (scene=0; scene < (ssize_t) number_scenes; scene++) + { + if ((resource_info->map_type != (char *) NULL) || + (visual_info->klass == TrueColor) || + (visual_info->klass == DirectColor)) + (void) SetImageType(image_list[scene],image_list[scene]->matte == + MagickFalse ? TrueColorType : TrueColorMatteType); + if ((display_image->columns < image_list[scene]->columns) && + (display_image->rows < image_list[scene]->rows)) + display_image=image_list[scene]; + } + if (display_image->debug != MagickFalse) + { + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Image: %s[%.20g] %.20gx%.20g ",display_image->filename,(double) + display_image->scene,(double) display_image->columns,(double) + display_image->rows); + if (display_image->colors != 0) + (void) LogMagickEvent(X11Event,GetMagickModule(),"%.20gc ",(double) + display_image->colors); + (void) LogMagickEvent(X11Event,GetMagickModule(),"%s", + display_image->magick); + } + XMakeStandardColormap(display,visual_info,resource_info,display_image, + map_info,pixel); + /* + Initialize graphic context. + */ + windows->context.id=(Window) NULL; + XGetWindowInfo(display,visual_info,map_info,pixel,font_info, + resource_info,&windows->context); + (void) CloneString(&class_hints->res_name,resource_info->client_name); + (void) CloneString(&class_hints->res_class,resource_info->client_name); + class_hints->res_class[0]=(char) LocaleToUppercase((int) + class_hints->res_class[0]); + manager_hints->flags=InputHint | StateHint; + manager_hints->input=MagickFalse; + manager_hints->initial_state=WithdrawnState; + XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints, + &windows->context); + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Window id: 0x%lx (context)",windows->context.id); + context_values.background=pixel->background_color.pixel; + context_values.font=font_info->fid; + context_values.foreground=pixel->foreground_color.pixel; + context_values.graphics_exposures=MagickFalse; + context_mask=(MagickStatusType) + (GCBackground | GCFont | GCForeground | GCGraphicsExposures); + if (pixel->annotate_context != (GC) NULL) + (void) XFreeGC(display,pixel->annotate_context); + pixel->annotate_context= + XCreateGC(display,windows->context.id,context_mask,&context_values); + if (pixel->annotate_context == (GC) NULL) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateGraphicContext", + images->filename); + context_values.background=pixel->depth_color.pixel; + if (pixel->widget_context != (GC) NULL) + (void) XFreeGC(display,pixel->widget_context); + pixel->widget_context= + XCreateGC(display,windows->context.id,context_mask,&context_values); + if (pixel->widget_context == (GC) NULL) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateGraphicContext", + images->filename); + context_values.background=pixel->foreground_color.pixel; + context_values.foreground=pixel->background_color.pixel; + context_values.plane_mask= + context_values.background ^ context_values.foreground; + if (pixel->highlight_context != (GC) NULL) + (void) XFreeGC(display,pixel->highlight_context); + pixel->highlight_context=XCreateGC(display,windows->context.id, + (size_t) (context_mask | GCPlaneMask),&context_values); + if (pixel->highlight_context == (GC) NULL) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateGraphicContext", + images->filename); + (void) XDestroyWindow(display,windows->context.id); + /* + Initialize icon window. + */ + XGetWindowInfo(display,icon_visual,icon_map,icon_pixel,(XFontStruct *) NULL, + icon_resources,&windows->icon); + windows->icon.geometry=resource_info->icon_geometry; + XBestIconSize(display,&windows->icon,display_image); + windows->icon.attributes.colormap= + XDefaultColormap(display,icon_visual->screen); + windows->icon.attributes.event_mask=ExposureMask | StructureNotifyMask; + manager_hints->flags=InputHint | StateHint; + manager_hints->input=MagickFalse; + manager_hints->initial_state=IconicState; + XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints, + &windows->icon); + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(),"Window id: 0x%lx (icon)", + windows->icon.id); + /* + Initialize graphic context for icon window. + */ + if (icon_pixel->annotate_context != (GC) NULL) + (void) XFreeGC(display,icon_pixel->annotate_context); + context_values.background=icon_pixel->background_color.pixel; + context_values.foreground=icon_pixel->foreground_color.pixel; + icon_pixel->annotate_context=XCreateGC(display,windows->icon.id, + (size_t) (GCBackground | GCForeground),&context_values); + if (icon_pixel->annotate_context == (GC) NULL) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateGraphicContext", + images->filename); + windows->icon.annotate_context=icon_pixel->annotate_context; + /* + Initialize Image window. + */ + XGetWindowInfo(display,visual_info,map_info,pixel,font_info, + resource_info,&windows->image); + windows->image.shape=MagickTrue; /* non-rectangular shape hint */ + if (resource_info->use_shared_memory == MagickFalse) + windows->image.shared_memory=MagickFalse; + if (resource_info->title != (char *) NULL) + { + char + *title; + + title=InterpretImageProperties(resource_info->image_info,display_image, + resource_info->title); + (void) CloneString(&windows->image.name,title); + (void) CloneString(&windows->image.icon_name,title); + title=DestroyString(title); + } + else + { + char + filename[MaxTextExtent], + window_name[MaxTextExtent]; + + /* + Window name is the base of the filename. + */ + GetPathComponent(display_image->magick_filename,TailPath,filename); + (void) FormatLocaleString(window_name,MaxTextExtent, + "%s: %s[scene: %.20g frames: %.20g]",MagickPackageName,filename,(double) + display_image->scene,(double) number_scenes); + (void) CloneString(&windows->image.name,window_name); + (void) CloneString(&windows->image.icon_name,filename); + } + if (resource_info->immutable != MagickFalse) + windows->image.immutable=MagickTrue; + windows->image.shape=MagickTrue; + windows->image.geometry=resource_info->image_geometry; + (void) FormatLocaleString(geometry,MaxTextExtent,"%ux%u+0+0>!", + XDisplayWidth(display,visual_info->screen), + XDisplayHeight(display,visual_info->screen)); + geometry_info.width=display_image->columns; + geometry_info.height=display_image->rows; + geometry_info.x=0; + geometry_info.y=0; + (void) ParseMetaGeometry(geometry,&geometry_info.x,&geometry_info.y, + &geometry_info.width,&geometry_info.height); + windows->image.width=(unsigned int) geometry_info.width; + windows->image.height=(unsigned int) geometry_info.height; + windows->image.attributes.event_mask=ButtonMotionMask | ButtonPressMask | + ButtonReleaseMask | EnterWindowMask | ExposureMask | KeyPressMask | + KeyReleaseMask | LeaveWindowMask | OwnerGrabButtonMask | + PropertyChangeMask | StructureNotifyMask | SubstructureNotifyMask; + XGetWindowInfo(display,visual_info,map_info,pixel,font_info, + resource_info,&windows->backdrop); + if ((resource_info->backdrop) || (windows->backdrop.id != (Window) NULL)) + { + /* + Initialize backdrop window. + */ + windows->backdrop.x=0; + windows->backdrop.y=0; + (void) CloneString(&windows->backdrop.name,"ImageMagick Backdrop"); + windows->backdrop.flags=(size_t) (USSize | USPosition); + windows->backdrop.width=(unsigned int) + XDisplayWidth(display,visual_info->screen); + windows->backdrop.height=(unsigned int) + XDisplayHeight(display,visual_info->screen); + windows->backdrop.border_width=0; + windows->backdrop.immutable=MagickTrue; + windows->backdrop.attributes.do_not_propagate_mask=ButtonPressMask | + ButtonReleaseMask; + windows->backdrop.attributes.event_mask=ButtonPressMask | KeyPressMask | + StructureNotifyMask; + manager_hints->flags=IconWindowHint | InputHint | StateHint; + manager_hints->icon_window=windows->icon.id; + manager_hints->input=MagickTrue; + manager_hints->initial_state= + resource_info->iconic ? IconicState : NormalState; + XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints, + &windows->backdrop); + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Window id: 0x%lx (backdrop)",windows->backdrop.id); + (void) XMapWindow(display,windows->backdrop.id); + (void) XClearWindow(display,windows->backdrop.id); + if (windows->image.id != (Window) NULL) + { + (void) XDestroyWindow(display,windows->image.id); + windows->image.id=(Window) NULL; + } + /* + Position image in the center the backdrop. + */ + windows->image.flags|=USPosition; + windows->image.x=(XDisplayWidth(display,visual_info->screen)/2)- + (windows->image.width/2); + windows->image.y=(XDisplayHeight(display,visual_info->screen)/2)- + (windows->image.height/2); + } + manager_hints->flags=IconWindowHint | InputHint | StateHint; + manager_hints->icon_window=windows->icon.id; + manager_hints->input=MagickTrue; + manager_hints->initial_state= + resource_info->iconic ? IconicState : NormalState; + if (windows->group_leader.id != (Window) NULL) + { + /* + Follow the leader. + */ + manager_hints->flags|=(MagickStatusType) WindowGroupHint; + manager_hints->window_group=windows->group_leader.id; + (void) XSelectInput(display,windows->group_leader.id,StructureNotifyMask); + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Window id: 0x%lx (group leader)",windows->group_leader.id); + } + XMakeWindow(display, + (Window) (resource_info->backdrop ? windows->backdrop.id : root_window), + argv,argc,class_hints,manager_hints,&windows->image); + (void) XChangeProperty(display,windows->image.id,windows->im_protocols, + XA_STRING,8,PropModeReplace,(unsigned char *) NULL,0); + if (windows->group_leader.id != (Window) NULL) + (void) XSetTransientForHint(display,windows->image.id, + windows->group_leader.id); + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(),"Window id: 0x%lx (image)", + windows->image.id); + /* + Initialize Info widget. + */ + XGetWindowInfo(display,visual_info,map_info,pixel,font_info, + resource_info,&windows->info); + (void) CloneString(&windows->info.name,"Info"); + (void) CloneString(&windows->info.icon_name,"Info"); + windows->info.border_width=1; + windows->info.x=2; + windows->info.y=2; + windows->info.flags|=PPosition; + windows->info.attributes.win_gravity=UnmapGravity; + windows->info.attributes.event_mask=ButtonPressMask | ExposureMask | + StructureNotifyMask; + manager_hints->flags=InputHint | StateHint | WindowGroupHint; + manager_hints->input=MagickFalse; + manager_hints->initial_state=NormalState; + manager_hints->window_group=windows->image.id; + XMakeWindow(display,windows->image.id,argv,argc,class_hints,manager_hints, + &windows->info); + windows->info.highlight_stipple=XCreateBitmapFromData(display, + windows->info.id,(char *) HighlightBitmap,HighlightWidth,HighlightHeight); + windows->info.shadow_stipple=XCreateBitmapFromData(display, + windows->info.id,(char *) ShadowBitmap,ShadowWidth,ShadowHeight); + (void) XSetTransientForHint(display,windows->info.id,windows->image.id); + if (windows->image.mapped) + (void) XWithdrawWindow(display,windows->info.id,windows->info.screen); + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(),"Window id: 0x%lx (info)", + windows->info.id); + /* + Initialize Command widget. + */ + XGetWindowInfo(display,visual_info,map_info,pixel,font_info, + resource_info,&windows->command); + windows->command.data=MagickMenus; + (void) XCommandWidget(display,windows,CommandMenu,(XEvent *) NULL); + (void) FormatLocaleString(resource_name,MaxTextExtent,"%s.command", + resource_info->client_name); + windows->command.geometry=XGetResourceClass(resource_info->resource_database, + resource_name,"geometry",(char *) NULL); + (void) CloneString(&windows->command.name,MagickTitle); + windows->command.border_width=0; + windows->command.flags|=PPosition; + windows->command.attributes.event_mask=ButtonMotionMask | ButtonPressMask | + ButtonReleaseMask | EnterWindowMask | ExposureMask | LeaveWindowMask | + OwnerGrabButtonMask | StructureNotifyMask; + manager_hints->flags=InputHint | StateHint | WindowGroupHint; + manager_hints->input=MagickTrue; + manager_hints->initial_state=NormalState; + manager_hints->window_group=windows->image.id; + XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints, + &windows->command); + windows->command.highlight_stipple=XCreateBitmapFromData(display, + windows->command.id,(char *) HighlightBitmap,HighlightWidth, + HighlightHeight); + windows->command.shadow_stipple=XCreateBitmapFromData(display, + windows->command.id,(char *) ShadowBitmap,ShadowWidth,ShadowHeight); + (void) XSetTransientForHint(display,windows->command.id,windows->image.id); + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Window id: 0x%lx (command)",windows->command.id); + /* + Initialize Widget window. + */ + XGetWindowInfo(display,visual_info,map_info,pixel,font_info, + resource_info,&windows->widget); + (void) FormatLocaleString(resource_name,MaxTextExtent,"%s.widget", + resource_info->client_name); + windows->widget.geometry=XGetResourceClass(resource_info->resource_database, + resource_name,"geometry",(char *) NULL); + windows->widget.border_width=0; + windows->widget.flags|=PPosition; + windows->widget.attributes.event_mask=ButtonMotionMask | ButtonPressMask | + ButtonReleaseMask | EnterWindowMask | ExposureMask | KeyPressMask | + KeyReleaseMask | LeaveWindowMask | OwnerGrabButtonMask | + StructureNotifyMask; + manager_hints->flags=InputHint | StateHint | WindowGroupHint; + manager_hints->input=MagickTrue; + manager_hints->initial_state=NormalState; + manager_hints->window_group=windows->image.id; + XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints, + &windows->widget); + windows->widget.highlight_stipple=XCreateBitmapFromData(display, + windows->widget.id,(char *) HighlightBitmap,HighlightWidth,HighlightHeight); + windows->widget.shadow_stipple=XCreateBitmapFromData(display, + windows->widget.id,(char *) ShadowBitmap,ShadowWidth,ShadowHeight); + (void) XSetTransientForHint(display,windows->widget.id,windows->image.id); + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Window id: 0x%lx (widget)",windows->widget.id); + /* + Initialize popup window. + */ + XGetWindowInfo(display,visual_info,map_info,pixel,font_info, + resource_info,&windows->popup); + windows->popup.border_width=0; + windows->popup.flags|=PPosition; + windows->popup.attributes.event_mask=ButtonMotionMask | ButtonPressMask | + ButtonReleaseMask | EnterWindowMask | ExposureMask | KeyPressMask | + KeyReleaseMask | LeaveWindowMask | StructureNotifyMask; + manager_hints->flags=InputHint | StateHint | WindowGroupHint; + manager_hints->input=MagickTrue; + manager_hints->initial_state=NormalState; + manager_hints->window_group=windows->image.id; + XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints, + &windows->popup); + windows->popup.highlight_stipple=XCreateBitmapFromData(display, + windows->popup.id,(char *) HighlightBitmap,HighlightWidth,HighlightHeight); + windows->popup.shadow_stipple=XCreateBitmapFromData(display, + windows->popup.id,(char *) ShadowBitmap,ShadowWidth,ShadowHeight); + (void) XSetTransientForHint(display,windows->popup.id,windows->image.id); + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Window id: 0x%lx (pop up)",windows->popup.id); + /* + Set out progress and warning handlers. + */ + if (warning_handler == (WarningHandler) NULL) + { + warning_handler=resource_info->display_warnings ? + SetErrorHandler(XWarning) : SetErrorHandler((ErrorHandler) NULL); + warning_handler=resource_info->display_warnings ? + SetWarningHandler(XWarning) : SetWarningHandler((WarningHandler) NULL); + } + /* + Initialize X image structure. + */ + windows->image.x=0; + windows->image.y=0; + /* + Initialize image pixmaps structure. + */ + window_changes.width=(int) windows->image.width; + window_changes.height=(int) windows->image.height; + (void) XReconfigureWMWindow(display,windows->image.id,windows->command.screen, + (unsigned int) (CWWidth | CWHeight),&window_changes); + windows->image.pixmaps=(Pixmap *) AcquireQuantumMemory(number_scenes, + sizeof(*windows->image.pixmaps)); + windows->image.matte_pixmaps=(Pixmap *) AcquireQuantumMemory(number_scenes, + sizeof(*windows->image.pixmaps)); + if ((windows->image.pixmaps == (Pixmap *) NULL) || + (windows->image.matte_pixmaps == (Pixmap *) NULL)) + ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + images->filename); + if ((windows->image.mapped == MagickFalse) || + (windows->backdrop.id != (Window) NULL)) + (void) XMapWindow(display,windows->image.id); + XSetCursorState(display,windows,MagickTrue); + for (scene=0; scene < (ssize_t) number_scenes; scene++) + { + unsigned int + columns, + rows; + + /* + Create X image. + */ + windows->image.pixmap=(Pixmap) NULL; + windows->image.matte_pixmap=(Pixmap) NULL; + if ((resource_info->map_type != (char *) NULL) || + (visual_info->klass == TrueColor) || + (visual_info->klass == DirectColor)) + if (image_list[scene]->storage_class == PseudoClass) + XGetPixelPacket(display,visual_info,map_info,resource_info, + image_list[scene],windows->image.pixel_info); + columns=(unsigned int) image_list[scene]->columns; + rows=(unsigned int) image_list[scene]->rows; + if ((image_list[scene]->columns != columns) || + (image_list[scene]->rows != rows)) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateXImage", + image_list[scene]->filename); + status=XMakeImage(display,resource_info,&windows->image,image_list[scene], + columns,rows); + if (status == MagickFalse) + ThrowXWindowFatalException(XServerFatalError,"UnableToCreateXImage", + images->filename); + if (image_list[scene]->debug != MagickFalse) + { + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Image: [%.20g] %s %.20gx%.20g ",(double) image_list[scene]->scene, + image_list[scene]->filename,(double) columns,(double) rows); + if (image_list[scene]->colors != 0) + (void) LogMagickEvent(X11Event,GetMagickModule(),"%.20gc ",(double) + image_list[scene]->colors); + (void) LogMagickEvent(X11Event,GetMagickModule(),"%s", + image_list[scene]->magick); + } + /* + Window name is the base of the filename. + */ + if (resource_info->title != (char *) NULL) + { + char + *title; + + title=InterpretImageProperties(resource_info->image_info, + image_list[scene],resource_info->title); + (void) CloneString(&windows->image.name,title); + title=DestroyString(title); + } + else + { + char + window_name[MaxTextExtent]; + + p=image_list[scene]->magick_filename+ + strlen(image_list[scene]->magick_filename)-1; + while ((p > image_list[scene]->magick_filename) && (*(p-1) != '/')) + p--; + (void) FormatLocaleString(window_name,MaxTextExtent, + "%s: %s[%.20g of %.20g]",MagickPackageName,p,(double) scene+1, + (double) number_scenes); + (void) CloneString(&windows->image.name,window_name); + } + status=XStringListToTextProperty(&windows->image.name,1,&window_name); + if (status != Success) + { + XSetWMName(display,windows->image.id,&window_name); + (void) XFree((void *) window_name.value); + } + windows->image.pixmaps[scene]=windows->image.pixmap; + windows->image.matte_pixmaps[scene]=windows->image.matte_pixmap; + if (scene == 0) + { + event.xexpose.x=0; + event.xexpose.y=0; + event.xexpose.width=(int) image_list[scene]->columns; + event.xexpose.height=(int) image_list[scene]->rows; + XRefreshWindow(display,&windows->image,&event); + (void) XSync(display,MagickFalse); + } + } + XSetCursorState(display,windows,MagickFalse); + if (windows->command.mapped) + (void) XMapRaised(display,windows->command.id); + /* + Respond to events. + */ + nexus=NewImageList(); + scene=0; + first_scene=0; + iterations=0; + image=image_list[0]; + state=(MagickStatusType) (ForwardAnimationState | RepeatAnimationState); + (void) XMagickCommand(display,resource_info,windows,PlayCommand,&images, + &state); + do + { + if (XEventsQueued(display,QueuedAfterFlush) == 0) + if ((state & PlayAnimationState) || (state & StepAnimationState)) + { + MagickBooleanType + pause; + + pause=MagickFalse; + delay=1000*image->delay/MagickMax(image->ticks_per_second,1L); + XDelay(display,resource_info->delay*(delay == 0 ? 10 : delay)); + if (state & ForwardAnimationState) + { + /* + Forward animation: increment scene number. + */ + if (scene < ((ssize_t) number_scenes-1)) + scene++; + else + { + iterations++; + if (iterations == (ssize_t) image_list[0]->iterations) + { + iterations=0; + state|=ExitState; + } + if ((state & AutoReverseAnimationState) != 0) + { + state&=(~ForwardAnimationState); + scene--; + } + else + { + if ((state & RepeatAnimationState) == 0) + state&=(~PlayAnimationState); + scene=first_scene; + pause=MagickTrue; + } + } + } + else + { + /* + Reverse animation: decrement scene number. + */ + if (scene > first_scene) + scene--; + else + { + iterations++; + if (iterations == (ssize_t) image_list[0]->iterations) + { + iterations=0; + state&=(~RepeatAnimationState); + } + if (state & AutoReverseAnimationState) + { + state|=ForwardAnimationState; + scene=first_scene; + pause=MagickTrue; + } + else + { + if ((state & RepeatAnimationState) == MagickFalse) + state&=(~PlayAnimationState); + scene=(ssize_t) number_scenes-1; + } + } + } + scene=MagickMax(scene,0); + image=image_list[scene]; + if ((image != (Image *) NULL) && (image->start_loop != 0)) + first_scene=scene; + if ((state & StepAnimationState) || + (resource_info->title != (char *) NULL)) + { + char + name[MaxTextExtent]; + + /* + Update window title. + */ + p=image_list[scene]->filename+ + strlen(image_list[scene]->filename)-1; + while ((p > image_list[scene]->filename) && (*(p-1) != '/')) + p--; + (void) FormatLocaleString(name,MaxTextExtent, + "%s: %s[%.20g of %.20g]",MagickPackageName,p,(double) scene+1, + (double) number_scenes); + (void) CloneString(&windows->image.name,name); + if (resource_info->title != (char *) NULL) + { + char + *title; + + title=InterpretImageProperties(resource_info->image_info, + image,resource_info->title); + (void) CloneString(&windows->image.name,title); + title=DestroyString(title); + } + status=XStringListToTextProperty(&windows->image.name,1, + &window_name); + if (status != Success) + { + XSetWMName(display,windows->image.id,&window_name); + (void) XFree((void *) window_name.value); + } + } + /* + Copy X pixmap to Image window. + */ + XGetPixelPacket(display,visual_info,map_info,resource_info, + image_list[scene],windows->image.pixel_info); + windows->image.ximage->width=(int) image->columns; + windows->image.ximage->height=(int) image->rows; + windows->image.pixmap=windows->image.pixmaps[scene]; + windows->image.matte_pixmap=windows->image.matte_pixmaps[scene]; + event.xexpose.x=0; + event.xexpose.y=0; + event.xexpose.width=(int) image->columns; + event.xexpose.height=(int) image->rows; + if ((state & ExitState) == 0) + { + XRefreshWindow(display,&windows->image,&event); + (void) XSync(display,MagickFalse); + } + state&=(~StepAnimationState); + if (pause != MagickFalse) + for (i=0; i < (ssize_t) resource_info->pause; i++) + { + int + status; + + status=XCheckTypedWindowEvent(display,windows->image.id,KeyPress, + &event); + if (status != 0) + { + int + length; + + length=XLookupString((XKeyEvent *) &event.xkey,command,(int) + sizeof(command),&key_symbol,(XComposeStatus *) NULL); + *(command+length)='\0'; + if ((key_symbol == XK_q) || (key_symbol == XK_Escape)) + { + XClientMessage(display,windows->image.id, + windows->im_protocols,windows->im_exit,CurrentTime); + break; + } + } + MagickDelay(1000); + } + continue; + } + /* + Handle a window event. + */ + timestamp=GetMagickTime(); + (void) XNextEvent(display,&event); + if (windows->image.stasis == MagickFalse) + windows->image.stasis=(GetMagickTime()-timestamp) > 0 ? + MagickTrue : MagickFalse; + if (event.xany.window == windows->command.id) + { + int + id; + + /* + Select a command from the Command widget. + */ + id=XCommandWidget(display,windows,CommandMenu,&event); + if (id < 0) + continue; + (void) CopyMagickString(command,CommandMenu[id],MaxTextExtent); + command_type=CommandMenus[id]; + if (id < MagickMenus) + { + int + entry; + + /* + Select a command from a pop-up menu. + */ + entry=XMenuWidget(display,windows,CommandMenu[id],Menus[id], + command); + if (entry < 0) + continue; + (void) CopyMagickString(command,Menus[id][entry],MaxTextExtent); + command_type=Commands[id][entry]; + } + if (command_type != NullCommand) + nexus=XMagickCommand(display,resource_info,windows, + command_type,&image,&state); + continue; + } + switch (event.type) + { + case ButtonPress: + { + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Button Press: 0x%lx %u +%d+%d",event.xbutton.window, + event.xbutton.button,event.xbutton.x,event.xbutton.y); + if ((event.xbutton.button == Button3) && + (event.xbutton.state & Mod1Mask)) + { + /* + Convert Alt-Button3 to Button2. + */ + event.xbutton.button=Button2; + event.xbutton.state&=(~Mod1Mask); + } + if (event.xbutton.window == windows->backdrop.id) + { + (void) XSetInputFocus(display,event.xbutton.window,RevertToParent, + event.xbutton.time); + break; + } + if (event.xbutton.window == windows->image.id) + { + if (resource_info->immutable != MagickFalse) + { + state|=ExitState; + break; + } + /* + Map/unmap Command widget. + */ + if (windows->command.mapped) + (void) XWithdrawWindow(display,windows->command.id, + windows->command.screen); + else + { + (void) XCommandWidget(display,windows,CommandMenu, + (XEvent *) NULL); + (void) XMapRaised(display,windows->command.id); + } + } + break; + } + case ButtonRelease: + { + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Button Release: 0x%lx %u +%d+%d",event.xbutton.window, + event.xbutton.button,event.xbutton.x,event.xbutton.y); + break; + } + case ClientMessage: + { + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Client Message: 0x%lx 0x%lx %d 0x%lx",(unsigned long) + event.xclient.window,(unsigned long) event.xclient.message_type, + event.xclient.format,(unsigned long) event.xclient.data.l[0]); + if (event.xclient.message_type == windows->im_protocols) + { + if (*event.xclient.data.l == (long) windows->im_update_colormap) + { + /* + Update graphic context and window colormap. + */ + for (i=0; i < (ssize_t) number_windows; i++) + { + if (magick_windows[i]->id == windows->icon.id) + continue; + context_values.background=pixel->background_color.pixel; + context_values.foreground=pixel->foreground_color.pixel; + (void) XChangeGC(display,magick_windows[i]->annotate_context, + context_mask,&context_values); + (void) XChangeGC(display,magick_windows[i]->widget_context, + context_mask,&context_values); + context_values.background=pixel->foreground_color.pixel; + context_values.foreground=pixel->background_color.pixel; + context_values.plane_mask= + context_values.background ^ context_values.foreground; + (void) XChangeGC(display,magick_windows[i]->highlight_context, + (size_t) (context_mask | GCPlaneMask), + &context_values); + magick_windows[i]->attributes.background_pixel= + pixel->background_color.pixel; + magick_windows[i]->attributes.border_pixel= + pixel->border_color.pixel; + magick_windows[i]->attributes.colormap=map_info->colormap; + (void) XChangeWindowAttributes(display,magick_windows[i]->id, + (unsigned long) magick_windows[i]->mask, + &magick_windows[i]->attributes); + } + if (windows->backdrop.id != (Window) NULL) + (void) XInstallColormap(display,map_info->colormap); + break; + } + if (*event.xclient.data.l == (long) windows->im_exit) + { + state|=ExitState; + break; + } + break; + } + if (event.xclient.message_type == windows->dnd_protocols) + { + Atom + selection, + type; + + int + format, + status; + + unsigned char + *data; + + unsigned long + after, + length; + + /* + Display image named by the Drag-and-Drop selection. + */ + if ((*event.xclient.data.l != 2) && (*event.xclient.data.l != 128)) + break; + selection=XInternAtom(display,"DndSelection",MagickFalse); + status=XGetWindowProperty(display,root_window,selection,0L,2047L, + MagickFalse,(Atom) AnyPropertyType,&type,&format,&length,&after, + &data); + if ((status != Success) || (length == 0)) + break; + if (*event.xclient.data.l == 2) + { + /* + Offix DND. + */ + (void) CopyMagickString(resource_info->image_info->filename, + (char *) data,MaxTextExtent); + } + else + { + /* + XDND. + */ + if (LocaleNCompare((char *) data,"file:",5) != 0) + { + (void) XFree((void *) data); + break; + } + (void) CopyMagickString(resource_info->image_info->filename, + ((char *) data)+5,MaxTextExtent); + } + nexus=ReadImage(resource_info->image_info,&image->exception); + CatchException(&image->exception); + if (nexus != (Image *) NULL) + state|=ExitState; + (void) XFree((void *) data); + break; + } + /* + If client window delete message, exit. + */ + if (event.xclient.message_type != windows->wm_protocols) + break; + if (*event.xclient.data.l == (long) windows->wm_take_focus) + { + (void) XSetInputFocus(display,event.xclient.window,RevertToParent, + (Time) event.xclient.data.l[1]); + break; + } + if (*event.xclient.data.l != (long) windows->wm_delete_window) + break; + (void) XWithdrawWindow(display,event.xclient.window, + visual_info->screen); + if (event.xclient.window == windows->image.id) + { + state|=ExitState; + break; + } + break; + } + case ConfigureNotify: + { + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Configure Notify: 0x%lx %dx%d+%d+%d %d",event.xconfigure.window, + event.xconfigure.width,event.xconfigure.height,event.xconfigure.x, + event.xconfigure.y,event.xconfigure.send_event); + if (event.xconfigure.window == windows->image.id) + { + if (event.xconfigure.send_event != 0) + { + XWindowChanges + window_changes; + + /* + Position the transient windows relative of the Image window. + */ + if (windows->command.geometry == (char *) NULL) + if (windows->command.mapped == MagickFalse) + { + windows->command.x= + event.xconfigure.x-windows->command.width-25; + windows->command.y=event.xconfigure.y; + XConstrainWindowPosition(display,&windows->command); + window_changes.x=windows->command.x; + window_changes.y=windows->command.y; + (void) XReconfigureWMWindow(display,windows->command.id, + windows->command.screen,(unsigned int) (CWX | CWY), + &window_changes); + } + if (windows->widget.geometry == (char *) NULL) + if (windows->widget.mapped == MagickFalse) + { + windows->widget.x= + event.xconfigure.x+event.xconfigure.width/10; + windows->widget.y= + event.xconfigure.y+event.xconfigure.height/10; + XConstrainWindowPosition(display,&windows->widget); + window_changes.x=windows->widget.x; + window_changes.y=windows->widget.y; + (void) XReconfigureWMWindow(display,windows->widget.id, + windows->widget.screen,(unsigned int) (CWX | CWY), + &window_changes); + } + } + /* + Image window has a new configuration. + */ + windows->image.width=(unsigned int) event.xconfigure.width; + windows->image.height=(unsigned int) event.xconfigure.height; + break; + } + if (event.xconfigure.window == windows->icon.id) + { + /* + Icon window has a new configuration. + */ + windows->icon.width=(unsigned int) event.xconfigure.width; + windows->icon.height=(unsigned int) event.xconfigure.height; + break; + } + break; + } + case DestroyNotify: + { + /* + Group leader has exited. + */ + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Destroy Notify: 0x%lx",event.xdestroywindow.window); + if (event.xdestroywindow.window == windows->group_leader.id) + { + state|=ExitState; + break; + } + break; + } + case EnterNotify: + { + /* + Selectively install colormap. + */ + if (map_info->colormap != XDefaultColormap(display,visual_info->screen)) + if (event.xcrossing.mode != NotifyUngrab) + XInstallColormap(display,map_info->colormap); + break; + } + case Expose: + { + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Expose: 0x%lx %dx%d+%d+%d",event.xexpose.window, + event.xexpose.width,event.xexpose.height,event.xexpose.x, + event.xexpose.y); + /* + Repaint windows that are now exposed. + */ + if (event.xexpose.window == windows->image.id) + { + windows->image.pixmap=windows->image.pixmaps[scene]; + windows->image.matte_pixmap=windows->image.matte_pixmaps[scene]; + XRefreshWindow(display,&windows->image,&event); + break; + } + if (event.xexpose.window == windows->icon.id) + if (event.xexpose.count == 0) + { + XRefreshWindow(display,&windows->icon,&event); + break; + } + break; + } + case KeyPress: + { + static int + length; + + /* + Respond to a user key press. + */ + length=XLookupString((XKeyEvent *) &event.xkey,command,(int) + sizeof(command),&key_symbol,(XComposeStatus *) NULL); + *(command+length)='\0'; + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Key press: 0x%lx (%c)",(unsigned long) key_symbol,*command); + command_type=NullCommand; + switch (key_symbol) + { + case XK_o: + { + if ((event.xkey.state & ControlMask) == MagickFalse) + break; + command_type=OpenCommand; + break; + } + case XK_BackSpace: + { + command_type=StepBackwardCommand; + break; + } + case XK_space: + { + command_type=StepForwardCommand; + break; + } + case XK_less: + { + command_type=FasterCommand; + break; + } + case XK_greater: + { + command_type=SlowerCommand; + break; + } + case XK_F1: + { + command_type=HelpCommand; + break; + } + case XK_Find: + { + command_type=BrowseDocumentationCommand; + break; + } + case XK_question: + { + command_type=InfoCommand; + break; + } + case XK_q: + case XK_Escape: + { + command_type=QuitCommand; + break; + } + default: + break; + } + if (command_type != NullCommand) + nexus=XMagickCommand(display,resource_info,windows, + command_type,&image,&state); + break; + } + case KeyRelease: + { + /* + Respond to a user key release. + */ + (void) XLookupString((XKeyEvent *) &event.xkey,command,(int) + sizeof(command),&key_symbol,(XComposeStatus *) NULL); + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Key release: 0x%lx (%c)",(unsigned long) key_symbol,*command); + break; + } + case LeaveNotify: + { + /* + Selectively uninstall colormap. + */ + if (map_info->colormap != XDefaultColormap(display,visual_info->screen)) + if (event.xcrossing.mode != NotifyUngrab) + XUninstallColormap(display,map_info->colormap); + break; + } + case MapNotify: + { + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(),"Map Notify: 0x%lx", + event.xmap.window); + if (event.xmap.window == windows->backdrop.id) + { + (void) XSetInputFocus(display,event.xmap.window,RevertToParent, + CurrentTime); + windows->backdrop.mapped=MagickTrue; + break; + } + if (event.xmap.window == windows->image.id) + { + if (windows->backdrop.id != (Window) NULL) + (void) XInstallColormap(display,map_info->colormap); + if (LocaleCompare(image_list[0]->magick,"LOGO") == 0) + { + if (LocaleCompare(display_image->filename,"LOGO") == 0) + nexus=XMagickCommand(display,resource_info,windows, + OpenCommand,&image,&state); + else + state|=ExitState; + } + windows->image.mapped=MagickTrue; + break; + } + if (event.xmap.window == windows->info.id) + { + windows->info.mapped=MagickTrue; + break; + } + if (event.xmap.window == windows->icon.id) + { + /* + Create an icon image. + */ + XMakeStandardColormap(display,icon_visual,icon_resources, + display_image,icon_map,icon_pixel); + (void) XMakeImage(display,icon_resources,&windows->icon, + display_image,windows->icon.width,windows->icon.height); + (void) XSetWindowBackgroundPixmap(display,windows->icon.id, + windows->icon.pixmap); + (void) XClearWindow(display,windows->icon.id); + (void) XWithdrawWindow(display,windows->info.id, + windows->info.screen); + windows->icon.mapped=MagickTrue; + break; + } + if (event.xmap.window == windows->command.id) + { + windows->command.mapped=MagickTrue; + break; + } + if (event.xmap.window == windows->popup.id) + { + windows->popup.mapped=MagickTrue; + break; + } + if (event.xmap.window == windows->widget.id) + { + windows->widget.mapped=MagickTrue; + break; + } + break; + } + case MappingNotify: + { + (void) XRefreshKeyboardMapping(&event.xmapping); + break; + } + case NoExpose: + break; + case PropertyNotify: + { + Atom + type; + + int + format, + status; + + unsigned char + *data; + + unsigned long + after, + length; + + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Property Notify: 0x%lx 0x%lx %d",(unsigned long) + event.xproperty.window,(unsigned long) event.xproperty.atom, + event.xproperty.state); + if (event.xproperty.atom != windows->im_remote_command) + break; + /* + Display image named by the remote command protocol. + */ + status=XGetWindowProperty(display,event.xproperty.window, + event.xproperty.atom,0L,(long) MaxTextExtent,MagickFalse,(Atom) + AnyPropertyType,&type,&format,&length,&after,&data); + if ((status != Success) || (length == 0)) + break; + (void) CopyMagickString(resource_info->image_info->filename, + (char *) data,MaxTextExtent); + nexus=ReadImage(resource_info->image_info,&image->exception); + CatchException(&image->exception); + if (nexus != (Image *) NULL) + state|=ExitState; + (void) XFree((void *) data); + break; + } + case ReparentNotify: + { + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Reparent Notify: 0x%lx=>0x%lx",event.xreparent.parent, + event.xreparent.window); + break; + } + case UnmapNotify: + { + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(), + "Unmap Notify: 0x%lx",event.xunmap.window); + if (event.xunmap.window == windows->backdrop.id) + { + windows->backdrop.mapped=MagickFalse; + break; + } + if (event.xunmap.window == windows->image.id) + { + windows->image.mapped=MagickFalse; + break; + } + if (event.xunmap.window == windows->info.id) + { + windows->info.mapped=MagickFalse; + break; + } + if (event.xunmap.window == windows->icon.id) + { + if (map_info->colormap == icon_map->colormap) + XConfigureImageColormap(display,resource_info,windows, + display_image); + (void) XFreeStandardColormap(display,icon_visual,icon_map, + icon_pixel); + windows->icon.mapped=MagickFalse; + break; + } + if (event.xunmap.window == windows->command.id) + { + windows->command.mapped=MagickFalse; + break; + } + if (event.xunmap.window == windows->popup.id) + { + if (windows->backdrop.id != (Window) NULL) + (void) XSetInputFocus(display,windows->image.id,RevertToParent, + CurrentTime); + windows->popup.mapped=MagickFalse; + break; + } + if (event.xunmap.window == windows->widget.id) + { + if (windows->backdrop.id != (Window) NULL) + (void) XSetInputFocus(display,windows->image.id,RevertToParent, + CurrentTime); + windows->widget.mapped=MagickFalse; + break; + } + break; + } + default: + { + if (display_image->debug != MagickFalse) + (void) LogMagickEvent(X11Event,GetMagickModule(),"Event type: %d", + event.type); + break; + } + } + } + while (!(state & ExitState)); + image_list=(Image **) RelinquishMagickMemory(image_list); + images=DestroyImageList(images); + if ((windows->visual_info->klass == GrayScale) || + (windows->visual_info->klass == PseudoColor) || + (windows->visual_info->klass == DirectColor)) + { + /* + Withdraw windows. + */ + if (windows->info.mapped) + (void) XWithdrawWindow(display,windows->info.id,windows->info.screen); + if (windows->command.mapped) + (void) XWithdrawWindow(display,windows->command.id, + windows->command.screen); + } + if (resource_info->backdrop == MagickFalse) + if (windows->backdrop.mapped) + { + (void) XWithdrawWindow(display,windows->backdrop.id,\ + windows->backdrop.screen); + (void) XDestroyWindow(display,windows->backdrop.id); + windows->backdrop.id=(Window) NULL; + (void) XWithdrawWindow(display,windows->image.id,windows->image.screen); + (void) XDestroyWindow(display,windows->image.id); + windows->image.id=(Window) NULL; + } + XSetCursorState(display,windows,MagickTrue); + XCheckRefreshWindows(display,windows); + for (scene=1; scene < (ssize_t) number_scenes; scene++) + { + if (windows->image.pixmaps[scene] != (Pixmap) NULL) + (void) XFreePixmap(display,windows->image.pixmaps[scene]); + windows->image.pixmaps[scene]=(Pixmap) NULL; + if (windows->image.matte_pixmaps[scene] != (Pixmap) NULL) + (void) XFreePixmap(display,windows->image.matte_pixmaps[scene]); + windows->image.matte_pixmaps[scene]=(Pixmap) NULL; + } + XSetCursorState(display,windows,MagickFalse); + windows->image.pixmaps=(Pixmap *) + RelinquishMagickMemory(windows->image.pixmaps); + windows->image.matte_pixmaps=(Pixmap *) + RelinquishMagickMemory(windows->image.matte_pixmaps); + if (nexus == (Image *) NULL) + { + /* + Free X resources. + */ + if (windows->image.mapped != MagickFalse) + (void) XWithdrawWindow(display,windows->image.id,windows->image.screen); + XDelay(display,SuspendTime); + (void) XFreeStandardColormap(display,icon_visual,icon_map,icon_pixel); + if (resource_info->map_type == (char *) NULL) + (void) XFreeStandardColormap(display,visual_info,map_info,pixel); + DestroyXResources(); + } + (void) XSync(display,MagickFalse); + /* + Restore our progress monitor and warning handlers. + */ + (void) SetErrorHandler(warning_handler); + (void) SetWarningHandler(warning_handler); + /* + Change to home directory. + */ + directory=getcwd(working_directory,MaxTextExtent); + (void) directory; + if (*resource_info->home_directory == '\0') + (void) CopyMagickString(resource_info->home_directory,".",MaxTextExtent); + status=chdir(resource_info->home_directory); + if (status == -1) + (void) ThrowMagickException(&images->exception,GetMagickModule(), + FileOpenError,"UnableToOpenFile","%s",resource_info->home_directory); + return(nexus); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ X S a v e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% XSaveImage() saves an image to a file. +% +% The format of the XSaveImage method is: +% +% MagickBooleanType XSaveImage(Display *display, +% XResourceInfo *resource_info,XWindows *windows,Image *image) +% +% A description of each parameter follows: +% +% o status: Method XSaveImage return True if the image is +% written. False is returned is there is a memory shortage or if the +% image fails to write. +% +% o display: Specifies a connection to an X server; returned from +% XOpenDisplay. +% +% o resource_info: Specifies a pointer to a X11 XResourceInfo structure. +% +% o windows: Specifies a pointer to a XWindows structure. +% +% o image: the image. +% +*/ +static MagickBooleanType XSaveImage(Display *display, + XResourceInfo *resource_info,XWindows *windows,Image *image) +{ + char + filename[MaxTextExtent]; + + ImageInfo + *image_info; + + MagickStatusType + status; + + /* + Request file name from user. + */ + if (resource_info->write_filename != (char *) NULL) + (void) CopyMagickString(filename,resource_info->write_filename, + MaxTextExtent); + else + { + char + path[MaxTextExtent]; + + int + status; + + GetPathComponent(image->filename,HeadPath,path); + GetPathComponent(image->filename,TailPath,filename); + if (*path == '\0') + (void) CopyMagickString(path,".",MaxTextExtent); + status=chdir(path); + if (status == -1) + (void) ThrowMagickException(&image->exception,GetMagickModule(), + FileOpenError,"UnableToOpenFile","%s",path); + } + XFileBrowserWidget(display,windows,"Save",filename); + if (*filename == '\0') + return(MagickTrue); + if (IsPathAccessible(filename) != MagickFalse) + { + int + status; + + /* + File exists-- seek user's permission before overwriting. + */ + status=XConfirmWidget(display,windows,"Overwrite",filename); + if (status == 0) + return(MagickTrue); + } + image_info=CloneImageInfo(resource_info->image_info); + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + (void) SetImageInfo(image_info,1,&image->exception); + if ((LocaleCompare(image_info->magick,"JPEG") == 0) || + (LocaleCompare(image_info->magick,"JPG") == 0)) + { + char + quality[MaxTextExtent]; + + int + status; + + /* + Request JPEG quality from user. + */ + (void) FormatLocaleString(quality,MaxTextExtent,"%.20g",(double) + image_info->quality); + status=XDialogWidget(display,windows,"Save","Enter JPEG quality:", + quality); + if (*quality == '\0') + return(MagickTrue); + image->quality=StringToUnsignedLong(quality); + image_info->interlace=status != MagickFalse ? NoInterlace : + PlaneInterlace; + } + if ((LocaleCompare(image_info->magick,"EPS") == 0) || + (LocaleCompare(image_info->magick,"PDF") == 0) || + (LocaleCompare(image_info->magick,"PS") == 0) || + (LocaleCompare(image_info->magick,"PS2") == 0)) + { + char + geometry[MaxTextExtent]; + + /* + Request page geometry from user. + */ + (void) CopyMagickString(geometry,PSPageGeometry,MaxTextExtent); + if (LocaleCompare(image_info->magick,"PDF") == 0) + (void) CopyMagickString(geometry,PSPageGeometry,MaxTextExtent); + if (image_info->page != (char *) NULL) + (void) CopyMagickString(geometry,image_info->page,MaxTextExtent); + XListBrowserWidget(display,windows,&windows->widget,PageSizes,"Select", + "Select page geometry:",geometry); + if (*geometry != '\0') + image_info->page=GetPageGeometry(geometry); + } + /* + Write image. + */ + image=GetFirstImageInList(image); + status=WriteImages(image_info,image,filename,&image->exception); + if (status != MagickFalse) + image->taint=MagickFalse; + image_info=DestroyImageInfo(image_info); + XSetCursorState(display,windows,MagickFalse); + return(status != 0 ? MagickTrue : MagickFalse); +} +#else + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A n i m a t e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AnimateImages() repeatedly displays an image sequence to any X window +% screen. It returns a value other than 0 if successful. Check the +% exception member of image to determine the reason for any failure. +% +% The format of the AnimateImages method is: +% +% MagickBooleanType AnimateImages(const ImageInfo *image_info, +% Image *images) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType AnimateImages(const ImageInfo *image_info, + Image *image) +{ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + (void) image_info; + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + (void) ThrowMagickException(&image->exception,GetMagickModule(), + MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","`%s' (X11)", + image->filename); + return(MagickFalse); +} +#endif diff --git a/ImageMagick-6.9.12-44/magick/animate.h b/ImageMagick-6.9.12-44/magick/animate.h new file mode 100644 index 0000000..33da090 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/animate.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore methods to interactively animate an image sequence. +*/ +#ifndef MAGICKCORE_ANIMATE_H +#define MAGICKCORE_ANIMATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport MagickBooleanType + AnimateImages(const ImageInfo *,Image *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/annotate.c b/ImageMagick-6.9.12-44/magick/annotate.c new file mode 100644 index 0000000..dd4302a --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/annotate.c @@ -0,0 +1,2254 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% AAA N N N N OOO TTTTT AAA TTTTT EEEEE % +% A A NN N NN N O O T A A T E % +% AAAAA N N N N N N O O T AAAAA T EEE % +% A A N NN N NN O O T A A T E % +% A A N N N N OOO T A A T EEEEE % +% % +% % +% MagickCore Image Annotation Methods % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Digital Applications (www.digapp.com) contributed the stroked text algorithm. +% It was written by Leonard Rosenthol. +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/annotate.h" +#include "magick/attribute.h" +#include "magick/cache-private.h" +#include "magick/cache-view.h" +#include "magick/channel.h" +#include "magick/client.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace-private.h" +#include "magick/composite.h" +#include "magick/composite-private.h" +#include "magick/constitute.h" +#include "magick/draw.h" +#include "magick/draw-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/image-private.h" +#include "magick/log.h" +#include "magick/quantum.h" +#include "magick/quantum-private.h" +#include "magick/pixel-accessor.h" +#include "magick/policy.h" +#include "magick/property.h" +#include "magick/resource_.h" +#include "magick/semaphore.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/token.h" +#include "magick/token-private.h" +#include "magick/transform.h" +#include "magick/type.h" +#include "magick/utility.h" +#include "magick/xwindow-private.h" +#if defined(MAGICKCORE_FREETYPE_DELEGATE) +#if defined(__MINGW32__) +# undef interface +#endif +#include +#if defined(FT_FREETYPE_H) +# include FT_FREETYPE_H +#else +# include +#endif +#if defined(FT_GLYPH_H) +# include FT_GLYPH_H +#else +# include +#endif +#if defined(FT_OUTLINE_H) +# include FT_OUTLINE_H +#else +# include +#endif +#if defined(FT_BBOX_H) +# include FT_BBOX_H +#else +# include +#endif /* defined(FT_BBOX_H) */ +#endif +#if defined(MAGICKCORE_RAQM_DELEGATE) +#include +#endif +typedef struct _GraphemeInfo +{ + ssize_t + index, + x_offset, + x_advance, + y_offset; + + size_t + cluster; +} GraphemeInfo; + +/* + Annotate semaphores. +*/ +static SemaphoreInfo + *annotate_semaphore = (SemaphoreInfo *) NULL; + +/* + Forward declarations. +*/ +static MagickBooleanType + RenderType(Image *,const DrawInfo *,const PointInfo *,TypeMetric *), + RenderPostscript(Image *,const DrawInfo *,const PointInfo *,TypeMetric *), + RenderFreetype(Image *,const DrawInfo *,const char *,const PointInfo *, + TypeMetric *), + RenderX11(Image *,const DrawInfo *,const PointInfo *,TypeMetric *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A n n o t a t e C o m p o n e n t G e n e s i s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AnnotateComponentGenesis() instantiates the annotate component. +% +% The format of the AnnotateComponentGenesis method is: +% +% MagickBooleanType AnnotateComponentGenesis(void) +% +*/ +MagickExport MagickBooleanType AnnotateComponentGenesis(void) +{ + if (annotate_semaphore == (SemaphoreInfo *) NULL) + annotate_semaphore=AllocateSemaphoreInfo(); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A n n o t a t e C o m p o n e n t T e r m i n u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AnnotateComponentTerminus() destroys the annotate component. +% +% The format of the AnnotateComponentTerminus method is: +% +% AnnotateComponentTerminus(void) +% +*/ +MagickExport void AnnotateComponentTerminus(void) +{ + if (annotate_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&annotate_semaphore); + DestroySemaphoreInfo(&annotate_semaphore); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A n n o t a t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AnnotateImage() annotates an image with text. +% +% The format of the AnnotateImage method is: +% +% MagickBooleanType AnnotateImage(Image *image,DrawInfo *draw_info) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +*/ +MagickExport MagickBooleanType AnnotateImage(Image *image, + const DrawInfo *draw_info) +{ + char + *p, + color[MaxTextExtent], + primitive[MaxTextExtent], + *text, + **textlist; + + DrawInfo + *annotate, + *annotate_info; + + GeometryInfo + geometry_info; + + MagickBooleanType + status; + + PixelPacket + pixel; + + PointInfo + offset; + + RectangleInfo + geometry; + + ssize_t + i; + + TypeMetric + metrics; + + size_t + height, + number_lines; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(draw_info != (DrawInfo *) NULL); + assert(draw_info->signature == MagickCoreSignature); + if (draw_info->text == (char *) NULL) + return(MagickFalse); + if (*draw_info->text == '\0') + return(MagickTrue); + annotate=CloneDrawInfo((ImageInfo *) NULL,draw_info); + text=annotate->text; + annotate->text=(char *) NULL; + annotate_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + number_lines=1; + for (p=text; *p != '\0'; p++) + if (*p == '\n') + number_lines++; + textlist=(char **) AcquireQuantumMemory(number_lines+1,sizeof(*textlist)); + if (textlist == (char **) NULL) + { + annotate_info=DestroyDrawInfo(annotate_info); + annotate=DestroyDrawInfo(annotate); + text=DestroyString(text); + return(MagickFalse); + } + p=text; + for (i=0; i < (ssize_t) number_lines; i++) + { + char + *q; + + textlist[i]=p; + for (q=p; *q != '\0'; q++) + if ((*q == '\r') || (*q == '\n')) + break; + if (*q == '\r') + { + *q='\0'; + q++; + } + *q='\0'; + p=q+1; + } + textlist[i]=(char *) NULL; + SetGeometry(image,&geometry); + SetGeometryInfo(&geometry_info); + if (annotate_info->geometry != (char *) NULL) + { + (void) ParsePageGeometry(image,annotate_info->geometry,&geometry, + &image->exception); + (void) ParseGeometry(annotate_info->geometry,&geometry_info); + } + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + { + annotate_info=DestroyDrawInfo(annotate_info); + annotate=DestroyDrawInfo(annotate); + textlist=(char **) RelinquishMagickMemory(textlist); + text=DestroyString(text); + return(MagickFalse); + } + if (IsGrayColorspace(image->colorspace) != MagickFalse) + (void) SetImageColorspace(image,sRGBColorspace); + status=MagickTrue; + (void) memset(&metrics,0,sizeof(metrics)); + for (i=0; textlist[i] != (char *) NULL; i++) + { + if (*textlist[i] == '\0') + continue; + /* + Position text relative to image. + */ + annotate_info->affine.tx=geometry_info.xi-image->page.x; + annotate_info->affine.ty=geometry_info.psi-image->page.y; + (void) CloneString(&annotate->text,textlist[i]); + if ((metrics.width == 0) || (annotate->gravity != NorthWestGravity)) + (void) GetTypeMetrics(image,annotate,&metrics); + height=(size_t) floor(metrics.ascent-metrics.descent+0.5); + if (height == 0) + height=draw_info->pointsize; + height+=(size_t) floor(draw_info->interline_spacing+0.5); + switch (annotate->gravity) + { + case UndefinedGravity: + default: + { + offset.x=annotate_info->affine.tx+i*annotate_info->affine.ry*height; + offset.y=annotate_info->affine.ty+i*annotate_info->affine.sy*height; + break; + } + case NorthWestGravity: + { + offset.x=(geometry.width == 0 ? -1.0 : 1.0)*annotate_info->affine.tx+i* + annotate_info->affine.ry*height+annotate_info->affine.ry* + (metrics.ascent+metrics.descent); + offset.y=(geometry.height == 0 ? -1.0 : 1.0)*annotate_info->affine.ty+i* + annotate_info->affine.sy*height+annotate_info->affine.sy* + metrics.ascent; + break; + } + case NorthGravity: + { + offset.x=(geometry.width == 0 ? -1.0 : 1.0)*annotate_info->affine.tx+ + geometry.width/2.0+i*annotate_info->affine.ry*height- + annotate_info->affine.sx*metrics.width/2.0+annotate_info->affine.ry* + (metrics.ascent+metrics.descent); + offset.y=(geometry.height == 0 ? -1.0 : 1.0)*annotate_info->affine.ty+i* + annotate_info->affine.sy*height+annotate_info->affine.sy* + metrics.ascent-annotate_info->affine.rx*metrics.width/2.0; + break; + } + case NorthEastGravity: + { + offset.x=(geometry.width == 0 ? 1.0 : -1.0)*annotate_info->affine.tx+ + geometry.width+i*annotate_info->affine.ry*height- + annotate_info->affine.sx*metrics.width+annotate_info->affine.ry* + (metrics.ascent+metrics.descent)-1.0; + offset.y=(geometry.height == 0 ? -1.0 : 1.0)*annotate_info->affine.ty+i* + annotate_info->affine.sy*height+annotate_info->affine.sy* + metrics.ascent-annotate_info->affine.rx*metrics.width; + break; + } + case WestGravity: + { + offset.x=(geometry.width == 0 ? -1.0 : 1.0)*annotate_info->affine.tx+i* + annotate_info->affine.ry*height+annotate_info->affine.ry* + (metrics.ascent+metrics.descent-(number_lines-1.0)*height)/2.0; + offset.y=(geometry.height == 0 ? -1.0 : 1.0)*annotate_info->affine.ty+ + geometry.height/2.0+i*annotate_info->affine.sy*height+ + annotate_info->affine.sy*(metrics.ascent+metrics.descent- + (number_lines-1.0)*height)/2.0; + break; + } + case StaticGravity: + case CenterGravity: + { + offset.x=(geometry.width == 0 ? -1.0 : 1.0)*annotate_info->affine.tx+ + geometry.width/2.0+i*annotate_info->affine.ry*height- + annotate_info->affine.sx*metrics.width/2.0+annotate_info->affine.ry* + (metrics.ascent+metrics.descent-(number_lines-1)*height)/2.0; + offset.y=(geometry.height == 0 ? -1.0 : 1.0)*annotate_info->affine.ty+ + geometry.height/2.0+i*annotate_info->affine.sy*height- + annotate_info->affine.rx*metrics.width/2.0+annotate_info->affine.sy* + (metrics.ascent+metrics.descent-(number_lines-1.0)*height)/2.0; + break; + } + case EastGravity: + { + offset.x=(geometry.width == 0 ? 1.0 : -1.0)*annotate_info->affine.tx+ + geometry.width+i*annotate_info->affine.ry*height- + annotate_info->affine.sx*metrics.width+annotate_info->affine.ry* + (metrics.ascent+metrics.descent-(number_lines-1.0)*height)/2.0-1.0; + offset.y=(geometry.height == 0 ? -1.0 : 1.0)*annotate_info->affine.ty+ + geometry.height/2.0+i*annotate_info->affine.sy*height- + annotate_info->affine.rx*metrics.width+annotate_info->affine.sy* + (metrics.ascent+metrics.descent-(number_lines-1.0)*height)/2.0; + break; + } + case SouthWestGravity: + { + offset.x=(geometry.width == 0 ? -1.0 : 1.0)*annotate_info->affine.tx+i* + annotate_info->affine.ry*height-annotate_info->affine.ry* + (number_lines-1.0)*height; + offset.y=(geometry.height == 0 ? 1.0 : -1.0)*annotate_info->affine.ty+ + geometry.height+i*annotate_info->affine.sy*height- + annotate_info->affine.sy*(number_lines-1.0)*height+metrics.descent; + break; + } + case SouthGravity: + { + offset.x=(geometry.width == 0 ? -1.0 : 1.0)*annotate_info->affine.tx+ + geometry.width/2.0+i*annotate_info->affine.ry*height- + annotate_info->affine.sx*metrics.width/2.0-annotate_info->affine.ry* + (number_lines-1.0)*height/2.0; + offset.y=(geometry.height == 0 ? 1.0 : -1.0)*annotate_info->affine.ty+ + geometry.height+i*annotate_info->affine.sy*height- + annotate_info->affine.rx*metrics.width/2.0-annotate_info->affine.sy* + (number_lines-1.0)*height+metrics.descent; + break; + } + case SouthEastGravity: + { + offset.x=(geometry.width == 0 ? 1.0 : -1.0)*annotate_info->affine.tx+ + geometry.width+i*annotate_info->affine.ry*height- + annotate_info->affine.sx*metrics.width-annotate_info->affine.ry* + (number_lines-1.0)*height-1.0; + offset.y=(geometry.height == 0 ? 1.0 : -1.0)*annotate_info->affine.ty+ + geometry.height+i*annotate_info->affine.sy*height- + annotate_info->affine.rx*metrics.width-annotate_info->affine.sy* + (number_lines-1.0)*height+metrics.descent; + break; + } + } + switch (annotate->align) + { + case LeftAlign: + { + offset.x=annotate_info->affine.tx+i*annotate_info->affine.ry*height; + offset.y=annotate_info->affine.ty+i*annotate_info->affine.sy*height; + break; + } + case CenterAlign: + { + offset.x=annotate_info->affine.tx+i*annotate_info->affine.ry*height- + annotate_info->affine.sx*metrics.width/2.0; + offset.y=annotate_info->affine.ty+i*annotate_info->affine.sy*height- + annotate_info->affine.rx*metrics.width/2.0; + break; + } + case RightAlign: + { + offset.x=annotate_info->affine.tx+i*annotate_info->affine.ry*height- + annotate_info->affine.sx*metrics.width; + offset.y=annotate_info->affine.ty+i*annotate_info->affine.sy*height- + annotate_info->affine.rx*metrics.width; + break; + } + default: + break; + } + if (draw_info->undercolor.opacity != TransparentOpacity) + { + DrawInfo + *undercolor_info; + + /* + Text box. + */ + undercolor_info=CloneDrawInfo((ImageInfo *) NULL,(DrawInfo *) NULL); + undercolor_info->fill=draw_info->undercolor; + undercolor_info->affine=draw_info->affine; + undercolor_info->affine.tx=offset.x-draw_info->affine.ry*metrics.ascent; + undercolor_info->affine.ty=offset.y-draw_info->affine.sy*metrics.ascent; + (void) FormatLocaleString(primitive,MaxTextExtent, + "rectangle 0.0,0.0 %g,%g",metrics.origin.x,(double) height); + (void) CloneString(&undercolor_info->primitive,primitive); + (void) DrawImage(image,undercolor_info); + (void) DestroyDrawInfo(undercolor_info); + } + annotate_info->affine.tx=offset.x; + annotate_info->affine.ty=offset.y; + pixel=annotate_info->fill; + if (annotate_info->stroke.opacity != TransparentOpacity) + pixel=annotate_info->stroke; + (void) QueryColorname(image,&pixel,SVGCompliance,color,&image->exception); + (void) FormatLocaleString(primitive,MagickPathExtent,"stroke %s " + "stroke-width %g line 0,0 %g,0",color,(double) + metrics.underline_thickness,(double) metrics.width); + /* + Annotate image with text. + */ + switch (annotate->decorate) + { + case OverlineDecoration: + { + annotate_info->affine.ty-=(draw_info->affine.sy*(metrics.ascent+ + metrics.descent-metrics.underline_position)); + (void) CloneString(&annotate_info->primitive,primitive); + (void) DrawImage(image,annotate_info); + break; + } + case UnderlineDecoration: + { + annotate_info->affine.ty-=(draw_info->affine.sy* + metrics.underline_position); + (void) CloneString(&annotate_info->primitive,primitive); + (void) DrawImage(image,annotate_info); + break; + } + default: + break; + } + status=RenderType(image,annotate,&offset,&metrics); + if (status == MagickFalse) + break; + if (annotate->decorate == LineThroughDecoration) + { + annotate_info->affine.ty-=(draw_info->affine.sy*(height+ + metrics.underline_position+metrics.descent*2)/2.0); + (void) CloneString(&annotate_info->primitive,primitive); + (void) DrawImage(image,annotate_info); + } + } + /* + Relinquish resources. + */ + annotate_info=DestroyDrawInfo(annotate_info); + annotate=DestroyDrawInfo(annotate); + textlist=(char **) RelinquishMagickMemory(textlist); + text=DestroyString(text); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% F o r m a t M a g i c k C a p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FormatMagickCaption() formats a caption so that it fits within the image +% width. It returns the number of lines in the formatted caption. +% +% The format of the FormatMagickCaption method is: +% +% ssize_t FormatMagickCaption(Image *image,DrawInfo *draw_info, +% const MagickBooleanType split,TypeMetric *metrics,char **caption) +% +% A description of each parameter follows. +% +% o image: The image. +% +% o draw_info: the draw info. +% +% o split: when no convenient line breaks-- insert newline. +% +% o metrics: Return the font metrics in this structure. +% +% o caption: the caption. +% +*/ + +static inline char *ReplaceSpaceWithNewline(char **caption,char *space) +{ + size_t + octets; + + octets=(size_t) GetUTFOctets(space); + if (octets == 1) + *space='\n'; + else + { + char + *target; + + size_t + length, + offset; + + length=strlen(*caption); + *space='\n'; + offset=space-(*caption); + target=AcquireString(*caption); + CopyMagickString(target,*caption,offset+2); + ConcatenateMagickString(target,space+octets,length); + (void) DestroyString(*caption); + *caption=target; + space=(*caption)+offset; + } + return(space); +} + +MagickExport ssize_t FormatMagickCaption(Image *image,DrawInfo *draw_info, + const MagickBooleanType split,TypeMetric *metrics,char **caption) +{ + MagickBooleanType + status; + + char + *p, + *q, + *s; + + ssize_t + i; + + size_t + width; + + ssize_t + n; + + q=draw_info->text; + s=(char *) NULL; + width=0; + for (p=(*caption); GetUTFCode(p) != 0; p+=GetUTFOctets(p)) + { + int + code; + + code=GetUTFCode(p); + if (code == '\n') + { + q=draw_info->text; + continue; + } + if ((IsUTFSpace(code) != MagickFalse) && + (IsNonBreakingUTFSpace(code) == MagickFalse)) + { + s=p; + if (width > image->columns) + p=ReplaceSpaceWithNewline(caption,s); + } + for (i=0; i < (ssize_t) GetUTFOctets(p); i++) + *q++=(*(p+i)); + *q='\0'; + status=GetTypeMetrics(image,draw_info,metrics); + if (status == MagickFalse) + break; + width=(size_t) floor(metrics->width+draw_info->stroke_width+0.5); + if (width <= image->columns) + continue; + if (s != (char *) NULL) + p=ReplaceSpaceWithNewline(caption,s); + else + if ((split != MagickFalse) || (GetUTFOctets(p) > 2)) + { + /* + No convenient line breaks-- insert newline. + */ + n=p-(*caption); + if ((n > 0) && ((*caption)[n-1] != '\n')) + { + char + *target; + + target=AcquireString(*caption); + CopyMagickString(target,*caption,n+1); + ConcatenateMagickString(target,"\n",strlen(*caption)+1); + ConcatenateMagickString(target,p,strlen(*caption)+2); + (void) DestroyString(*caption); + *caption=target; + p=(*caption)+n; + } + } + q=draw_info->text; + s=(char *) NULL; + } + n=0; + for (p=(*caption); GetUTFCode(p) != 0; p+=GetUTFOctets(p)) + if (GetUTFCode(p) == '\n') + n++; + return(n); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t M u l t i l i n e T y p e M e t r i c s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetMultilineTypeMetrics() returns the following information for the +% specified font and text: +% +% character width +% character height +% ascender +% descender +% text width +% text height +% maximum horizontal advance +% bounds: x1 +% bounds: y1 +% bounds: x2 +% bounds: y2 +% origin: x +% origin: y +% underline position +% underline thickness +% +% This method is like GetTypeMetrics() but it returns the maximum text width +% and height for multiple lines of text. +% +% The format of the GetMultilineTypeMetrics method is: +% +% MagickBooleanType GetMultilineTypeMetrics(Image *image, +% const DrawInfo *draw_info,TypeMetric *metrics) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o metrics: Return the font metrics in this structure. +% +*/ +MagickExport MagickBooleanType GetMultilineTypeMetrics(Image *image, + const DrawInfo *draw_info,TypeMetric *metrics) +{ + char + **textlist; + + double + height; + + DrawInfo + *annotate_info; + + MagickBooleanType + status; + + MagickSizeType + size; + + ssize_t + i; + + size_t + count; + + TypeMetric + extent; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(draw_info != (DrawInfo *) NULL); + assert(draw_info->text != (char *) NULL); + assert(draw_info->signature == MagickCoreSignature); + if (*draw_info->text == '\0') + return(MagickFalse); + annotate_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + annotate_info->text=DestroyString(annotate_info->text); + /* + Convert newlines to multiple lines of text. + */ + textlist=StringToStrings(draw_info->text,&count); + if (textlist == (char **) NULL) + return(MagickFalse); + annotate_info->render=MagickFalse; + annotate_info->direction=UndefinedDirection; + (void) memset(metrics,0,sizeof(*metrics)); + (void) memset(&extent,0,sizeof(extent)); + /* + Find the widest of the text lines. + */ + annotate_info->text=textlist[0]; + status=GetTypeMetrics(image,annotate_info,&extent); + *metrics=extent; + height=(count*(size_t) (metrics->ascent-metrics->descent+ + 0.5)+(count-1)*draw_info->interline_spacing); + size=(MagickSizeType) fabs(height); + if (AcquireMagickResource(HeightResource,size) == MagickFalse) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ImageError,"WidthOrHeightExceedsLimit","`%s'",image->filename); + status=MagickFalse; + } + else + { + for (i=1; i < (ssize_t) count; i++) + { + annotate_info->text=textlist[i]; + status=GetTypeMetrics(image,annotate_info,&extent); + if (status == MagickFalse) + break; + if (extent.width > metrics->width) + *metrics=extent; + size=(MagickSizeType) fabs(extent.width); + if (AcquireMagickResource(WidthResource,size) == MagickFalse) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ImageError,"WidthOrHeightExceedsLimit","`%s'",image->filename); + status=MagickFalse; + break; + } + } + metrics->height=(double) height; + } + /* + Relinquish resources. + */ + annotate_info->text=(char *) NULL; + annotate_info=DestroyDrawInfo(annotate_info); + for (i=0; i < (ssize_t) count; i++) + textlist[i]=DestroyString(textlist[i]); + textlist=(char **) RelinquishMagickMemory(textlist); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t T y p e M e t r i c s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetTypeMetrics() returns the following information for the specified font +% and text: +% +% character width +% character height +% ascender +% descender +% text width +% text height +% maximum horizontal advance +% bounds: x1 +% bounds: y1 +% bounds: x2 +% bounds: y2 +% origin: x +% origin: y +% underline position +% underline thickness +% +% The format of the GetTypeMetrics method is: +% +% MagickBooleanType GetTypeMetrics(Image *image,const DrawInfo *draw_info, +% TypeMetric *metrics) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o metrics: Return the font metrics in this structure. +% +*/ +MagickExport MagickBooleanType GetTypeMetrics(Image *image, + const DrawInfo *draw_info,TypeMetric *metrics) +{ + DrawInfo + *annotate_info; + + MagickBooleanType + status; + + PointInfo + offset; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(draw_info != (DrawInfo *) NULL); + assert(draw_info->text != (char *) NULL); + assert(draw_info->signature == MagickCoreSignature); + annotate_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + annotate_info->render=MagickFalse; + annotate_info->direction=UndefinedDirection; + (void) memset(metrics,0,sizeof(*metrics)); + offset.x=0.0; + offset.y=0.0; + status=RenderType(image,annotate_info,&offset,metrics); + if (image->debug != MagickFalse) + (void) LogMagickEvent(AnnotateEvent,GetMagickModule(),"Metrics: text: %s; " + "width: %g; height: %g; ascent: %g; descent: %g; max advance: %g; " + "bounds: %g,%g %g,%g; origin: %g,%g; pixels per em: %g,%g; " + "underline position: %g; underline thickness: %g",annotate_info->text, + metrics->width,metrics->height,metrics->ascent,metrics->descent, + metrics->max_advance,metrics->bounds.x1,metrics->bounds.y1, + metrics->bounds.x2,metrics->bounds.y2,metrics->origin.x,metrics->origin.y, + metrics->pixels_per_em.x,metrics->pixels_per_em.y, + metrics->underline_position,metrics->underline_thickness); + annotate_info=DestroyDrawInfo(annotate_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e n d e r T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RenderType() renders text on the image. It also returns the bounding box of +% the text relative to the image. +% +% The format of the RenderType method is: +% +% MagickBooleanType RenderType(Image *image,DrawInfo *draw_info, +% const PointInfo *offset,TypeMetric *metrics) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o offset: (x,y) location of text relative to image. +% +% o metrics: bounding box of text. +% +*/ +static MagickBooleanType RenderType(Image *image,const DrawInfo *draw_info, + const PointInfo *offset,TypeMetric *metrics) +{ + char + *font; + + const TypeInfo + *type_info; + + DrawInfo + *annotate_info; + + ExceptionInfo + *sans_exception; + + MagickBooleanType + status; + + type_info=(const TypeInfo *) NULL; + if (draw_info->font != (char *) NULL) + { + if (*draw_info->font == '@') + { + status=RenderFreetype(image,draw_info,draw_info->encoding,offset, + metrics); + return(status); + } + if (*draw_info->font == '-') + return(RenderX11(image,draw_info,offset,metrics)); + if (*draw_info->font == '^') + return(RenderPostscript(image,draw_info,offset,metrics)); + if (IsPathAccessible(draw_info->font) != MagickFalse) + { + status=RenderFreetype(image,draw_info,draw_info->encoding,offset, + metrics); + return(status); + } + type_info=GetTypeInfo(draw_info->font,&image->exception); + if (type_info == (const TypeInfo *) NULL) + (void) ThrowMagickException(&image->exception,GetMagickModule(), + TypeWarning,"UnableToReadFont","`%s'",draw_info->font); + } + if ((type_info == (const TypeInfo *) NULL) && + (draw_info->family != (const char *) NULL)) + { + if (strstr(draw_info->family,",'\"") == (char *) NULL) + type_info=GetTypeInfoByFamily(draw_info->family,draw_info->style, + draw_info->stretch,draw_info->weight,&image->exception); + if (type_info == (const TypeInfo *) NULL) + { + char + **family; + + int + number_families; + + ssize_t + i; + + /* + Parse font family list. + */ + family=StringToArgv(draw_info->family,&number_families); + for (i=1; i < (ssize_t) number_families; i++) + { + (void) SubstituteString(&family[i],",",""); + type_info=GetTypeInfoByFamily(family[i],draw_info->style, + draw_info->stretch,draw_info->weight,&image->exception); + if ((type_info != (const TypeInfo *) NULL) && + (LocaleCompare(family[i],type_info->family) == 0)) + break; + } + for (i=0; i < (ssize_t) number_families; i++) + family[i]=DestroyString(family[i]); + family=(char **) RelinquishMagickMemory(family); + if (type_info == (const TypeInfo *) NULL) + (void) ThrowMagickException(&image->exception,GetMagickModule(), + TypeWarning,"UnableToReadFont","`%s'",draw_info->family); + } + } + font=GetPolicyValue("system:font"); + if (font != (char *) NULL) + { + if (IsPathAccessible(font) != MagickFalse) + { + /* + Render with default system font. + */ + annotate_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + annotate_info->font=font; + status=RenderFreetype(image,annotate_info,annotate_info->encoding, + offset,metrics); + annotate_info=DestroyDrawInfo(annotate_info); + return(status); + } + font=DestroyString(font); + } + sans_exception=AcquireExceptionInfo(); + if (type_info == (const TypeInfo *) NULL) + type_info=GetTypeInfoByFamily("Open Sans",draw_info->style, + draw_info->stretch,draw_info->weight,sans_exception); + if (type_info == (const TypeInfo *) NULL) + type_info=GetTypeInfoByFamily("Sans Serif",draw_info->style, + draw_info->stretch,draw_info->weight,sans_exception); + if (type_info == (const TypeInfo *) NULL) + type_info=GetTypeInfoByFamily((const char *) NULL,draw_info->style, + draw_info->stretch,draw_info->weight,sans_exception); + if (type_info == (const TypeInfo *) NULL) + type_info=GetTypeInfo("*",sans_exception); + sans_exception=DestroyExceptionInfo(sans_exception); + if (type_info == (const TypeInfo *) NULL) + { + status=RenderFreetype(image,draw_info,draw_info->encoding,offset,metrics); + return(status); + } + annotate_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + annotate_info->face=type_info->face; + if (type_info->metrics != (char *) NULL) + (void) CloneString(&annotate_info->metrics,type_info->metrics); + if (type_info->glyphs != (char *) NULL) + (void) CloneString(&annotate_info->font,type_info->glyphs); + status=RenderFreetype(image,annotate_info,type_info->encoding,offset,metrics); + annotate_info=DestroyDrawInfo(annotate_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e n d e r F r e e t y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RenderFreetype() renders text on the image with a Truetype font. It also +% returns the bounding box of the text relative to the image. +% +% The format of the RenderFreetype method is: +% +% MagickBooleanType RenderFreetype(Image *image,DrawInfo *draw_info, +% const char *encoding,const PointInfo *offset,TypeMetric *metrics) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o encoding: the font encoding. +% +% o offset: (x,y) location of text relative to image. +% +% o metrics: bounding box of text. +% +*/ + +#if defined(MAGICKCORE_FREETYPE_DELEGATE) + +static size_t ComplexTextLayout(const Image *image,const DrawInfo *draw_info, + const char *text,const size_t length,const FT_Face face,const FT_Int32 flags, + GraphemeInfo **grapheme) +{ +#if defined(MAGICKCORE_RAQM_DELEGATE) + const char + *features; + + raqm_t + *rq; + + raqm_glyph_t + *glyphs; + + ssize_t + i; + + size_t + extent; + + magick_unreferenced(flags); + extent=0; + rq=raqm_create(); + if (rq == (raqm_t *) NULL) + goto cleanup; + if (raqm_set_text_utf8(rq,text,length) == 0) + goto cleanup; + if (raqm_set_par_direction(rq,(raqm_direction_t) draw_info->direction) == 0) + goto cleanup; + if (raqm_set_freetype_face(rq,face) == 0) + goto cleanup; + features=GetImageProperty(image,"type:features"); + if (features != (const char *) NULL) + { + char + breaker, + quote, + *token; + + int + next, + status_token; + + TokenInfo + *token_info; + + next=0; + token_info=AcquireTokenInfo(); + token=AcquireString(""); + status_token=Tokenizer(token_info,0,token,50,features,"",",","",'\0', + &breaker,&next,"e); + while (status_token == 0) + { + raqm_add_font_feature(rq,token,strlen(token)); + status_token=Tokenizer(token_info,0,token,50,features,"",",","",'\0', + &breaker,&next,"e); + } + token_info=DestroyTokenInfo(token_info); + token=DestroyString(token); + } + if (raqm_layout(rq) == 0) + goto cleanup; + glyphs=raqm_get_glyphs(rq,&extent); + if (glyphs == (raqm_glyph_t *) NULL) + { + extent=0; + goto cleanup; + } + *grapheme=(GraphemeInfo *) AcquireQuantumMemory(extent,sizeof(**grapheme)); + if (*grapheme == (GraphemeInfo *) NULL) + { + extent=0; + goto cleanup; + } + for (i=0; i < (ssize_t) extent; i++) + { + (*grapheme)[i].index=glyphs[i].index; + (*grapheme)[i].x_offset=glyphs[i].x_offset; + (*grapheme)[i].x_advance=glyphs[i].x_advance; + (*grapheme)[i].y_offset=glyphs[i].y_offset; + (*grapheme)[i].cluster=glyphs[i].cluster; + } + +cleanup: + raqm_destroy(rq); + return(extent); +#else + const char + *p; + + FT_Error + ft_status; + + ssize_t + i; + + ssize_t + last_glyph; + + /* + Simple layout for bi-directional text (right-to-left or left-to-right). + */ + magick_unreferenced(image); + *grapheme=(GraphemeInfo *) AcquireQuantumMemory(length+1,sizeof(**grapheme)); + if (*grapheme == (GraphemeInfo *) NULL) + return(0); + last_glyph=0; + p=text; + for (i=0; GetUTFCode(p) != 0; p+=GetUTFOctets(p), i++) + { + (*grapheme)[i].index=FT_Get_Char_Index(face,GetUTFCode(p)); + (*grapheme)[i].x_offset=0; + (*grapheme)[i].y_offset=0; + if (((*grapheme)[i].index != 0) && (last_glyph != 0)) + { + if (FT_HAS_KERNING(face)) + { + FT_Vector + kerning; + + ft_status=FT_Get_Kerning(face,(FT_UInt) last_glyph,(FT_UInt) + (*grapheme)[i].index,ft_kerning_default,&kerning); + if (ft_status == 0) + (*grapheme)[i-1].x_advance+=(FT_Pos) ((draw_info->direction == + RightToLeftDirection ? -1.0 : 1.0)*kerning.x); + } + } + ft_status=FT_Load_Glyph(face,(*grapheme)[i].index,flags); + (*grapheme)[i].x_advance=face->glyph->advance.x; + (*grapheme)[i].cluster=p-text; + last_glyph=(*grapheme)[i].index; + } + return((size_t) i); +#endif +} + +static inline MagickBooleanType IsEmptyOutline(FT_Outline outline) +{ + return((outline.n_points == 0) || (outline.n_contours <= 0) ? MagickTrue : + MagickFalse); +} + +static int TraceCubicBezier(FT_Vector *p,FT_Vector *q,FT_Vector *to, + DrawInfo *draw_info) +{ + AffineMatrix + affine; + + char + path[MaxTextExtent]; + + affine=draw_info->affine; + (void) FormatLocaleString(path,MaxTextExtent,"C%g,%g %g,%g %g,%g",affine.tx+ + p->x/64.0,affine.ty-p->y/64.0,affine.tx+q->x/64.0,affine.ty-q->y/64.0, + affine.tx+to->x/64.0,affine.ty-to->y/64.0); + (void) ConcatenateString(&draw_info->primitive,path); + return(0); +} + +static int TraceLineTo(FT_Vector *to,DrawInfo *draw_info) +{ + AffineMatrix + affine; + + char + path[MaxTextExtent]; + + affine=draw_info->affine; + (void) FormatLocaleString(path,MaxTextExtent,"L%g,%g",affine.tx+to->x/64.0, + affine.ty-to->y/64.0); + (void) ConcatenateString(&draw_info->primitive,path); + return(0); +} + +static int TraceMoveTo(FT_Vector *to,DrawInfo *draw_info) +{ + AffineMatrix + affine; + + char + path[MaxTextExtent]; + + affine=draw_info->affine; + (void) FormatLocaleString(path,MaxTextExtent,"M%g,%g",affine.tx+to->x/64.0, + affine.ty-to->y/64.0); + (void) ConcatenateString(&draw_info->primitive,path); + return(0); +} + +static int TraceQuadraticBezier(FT_Vector *control,FT_Vector *to, + DrawInfo *draw_info) +{ + AffineMatrix + affine; + + char + path[MaxTextExtent]; + + affine=draw_info->affine; + (void) FormatLocaleString(path,MaxTextExtent,"Q%g,%g %g,%g",affine.tx+ + control->x/64.0,affine.ty-control->y/64.0,affine.tx+to->x/64.0,affine.ty- + to->y/64.0); + (void) ConcatenateString(&draw_info->primitive,path); + return(0); +} + +static MagickBooleanType RenderFreetype(Image *image,const DrawInfo *draw_info, + const char *encoding,const PointInfo *offset,TypeMetric *metrics) +{ +#if !defined(FT_OPEN_PATHNAME) +#define FT_OPEN_PATHNAME ft_open_pathname +#endif + + typedef struct _GlyphInfo + { + FT_UInt + id; + + FT_Vector + origin; + + FT_Glyph + image; + } GlyphInfo; + + const char + *value; + + DrawInfo + *annotate_info; + + ExceptionInfo + *exception; + + FT_BBox + bounds; + + FT_Encoding + encoding_type; + + FT_Error + ft_status; + + FT_Face + face; + + FT_Int32 + flags; + + FT_Library + library; + + FT_Long + face_index; + + FT_Matrix + affine; + + FT_Open_Args + args; + + FT_UInt + first_glyph_id, + last_glyph_id, + missing_glyph_id; + + FT_Vector + origin; + + GlyphInfo + glyph; + + GraphemeInfo + *grapheme; + + MagickBooleanType + status; + + PointInfo + resolution; + + char + *p; + + ssize_t + i; + + size_t + length; + + ssize_t + code, + last_character, + y; + + static FT_Outline_Funcs + OutlineMethods = + { + (FT_Outline_MoveTo_Func) TraceMoveTo, + (FT_Outline_LineTo_Func) TraceLineTo, + (FT_Outline_ConicTo_Func) TraceQuadraticBezier, + (FT_Outline_CubicTo_Func) TraceCubicBezier, + 0, 0 + }; + + unsigned char + *utf8; + + /* + Initialize Truetype library. + */ + exception=(&image->exception); + ft_status=FT_Init_FreeType(&library); + if (ft_status != 0) + ThrowBinaryException(TypeError,"UnableToInitializeFreetypeLibrary", + image->filename); + face_index=(FT_Long) draw_info->face; + args.flags=FT_OPEN_PATHNAME; + if (draw_info->font == (char *) NULL) + args.pathname=ConstantString("helvetica"); + else + if (*draw_info->font != '@') + args.pathname=ConstantString(draw_info->font); + else + { + /* + Extract face index, e.g. @msgothic[1]. + */ + ImageInfo *image_info=AcquireImageInfo(); + (void) strcpy(image_info->filename,draw_info->font+1); + (void) SetImageInfo(image_info,0,exception); + face_index=(FT_Long) image_info->scene; + args.pathname=ConstantString(image_info->filename); + image_info=DestroyImageInfo(image_info); + } + face=(FT_Face) NULL; + ft_status=FT_Open_Face(library,&args,face_index,&face); + if (ft_status != 0) + { + (void) FT_Done_FreeType(library); + (void) ThrowMagickException(exception,GetMagickModule(),TypeError, + "UnableToReadFont","`%s'",args.pathname); + args.pathname=DestroyString(args.pathname); + return(MagickFalse); + } + args.pathname=DestroyString(args.pathname); + if ((draw_info->metrics != (char *) NULL) && + (IsPathAccessible(draw_info->metrics) != MagickFalse)) + (void) FT_Attach_File(face,draw_info->metrics); + encoding_type=FT_ENCODING_UNICODE; + ft_status=FT_Select_Charmap(face,encoding_type); + if ((ft_status != 0) && (face->num_charmaps != 0)) + ft_status=FT_Set_Charmap(face,face->charmaps[0]); + if (encoding != (const char *) NULL) + { + if (LocaleCompare(encoding,"AdobeCustom") == 0) + encoding_type=FT_ENCODING_ADOBE_CUSTOM; + if (LocaleCompare(encoding,"AdobeExpert") == 0) + encoding_type=FT_ENCODING_ADOBE_EXPERT; + if (LocaleCompare(encoding,"AdobeStandard") == 0) + encoding_type=FT_ENCODING_ADOBE_STANDARD; + if (LocaleCompare(encoding,"AppleRoman") == 0) + encoding_type=FT_ENCODING_APPLE_ROMAN; + if (LocaleCompare(encoding,"BIG5") == 0) + encoding_type=FT_ENCODING_BIG5; +#if defined(FT_ENCODING_PRC) + if (LocaleCompare(encoding,"GB2312") == 0) + encoding_type=FT_ENCODING_PRC; +#endif +#if defined(FT_ENCODING_JOHAB) + if (LocaleCompare(encoding,"Johab") == 0) + encoding_type=FT_ENCODING_JOHAB; +#endif +#if defined(FT_ENCODING_ADOBE_LATIN_1) + if (LocaleCompare(encoding,"Latin-1") == 0) + encoding_type=FT_ENCODING_ADOBE_LATIN_1; +#endif +#if defined(FT_ENCODING_ADOBE_LATIN_2) + if (LocaleCompare(encoding,"Latin-2") == 0) + encoding_type=FT_ENCODING_OLD_LATIN_2; +#endif + if (LocaleCompare(encoding,"None") == 0) + encoding_type=FT_ENCODING_NONE; + if (LocaleCompare(encoding,"SJIScode") == 0) + encoding_type=FT_ENCODING_SJIS; + if (LocaleCompare(encoding,"Symbol") == 0) + encoding_type=FT_ENCODING_MS_SYMBOL; + if (LocaleCompare(encoding,"Unicode") == 0) + encoding_type=FT_ENCODING_UNICODE; + if (LocaleCompare(encoding,"Wansung") == 0) + encoding_type=FT_ENCODING_WANSUNG; + ft_status=FT_Select_Charmap(face,encoding_type); + if (ft_status != 0) + { + (void) FT_Done_Face(face); + (void) FT_Done_FreeType(library); + ThrowBinaryException(TypeError,"UnrecognizedFontEncoding",encoding); + } + } + /* + Set text size. + */ + resolution.x=DefaultResolution; + resolution.y=DefaultResolution; + if (draw_info->density != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(draw_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + ft_status=FT_Set_Char_Size(face,(FT_F26Dot6) (64.0*draw_info->pointsize), + (FT_F26Dot6) (64.0*draw_info->pointsize),(FT_UInt) resolution.x, + (FT_UInt) resolution.y); + if (ft_status != 0) + { + (void) FT_Done_Face(face); + (void) FT_Done_FreeType(library); + ThrowBinaryException(TypeError,"UnableToReadFont",draw_info->font); + } + metrics->pixels_per_em.x=face->size->metrics.x_ppem; + metrics->pixels_per_em.y=face->size->metrics.y_ppem; + metrics->ascent=(double) face->size->metrics.ascender/64.0; + metrics->descent=(double) face->size->metrics.descender/64.0; + if (face->size->metrics.ascender == 0) + { + /* + Sanitize buggy ascender and descender values. + */ + metrics->ascent=face->size->metrics.y_ppem; + if (face->size->metrics.descender == 0) + metrics->descent=face->size->metrics.y_ppem/-3.5; + } + metrics->width=0; + metrics->origin.x=0; + metrics->origin.y=0; + metrics->height=(double) face->size->metrics.height/64.0; + metrics->max_advance=0.0; + if (face->size->metrics.max_advance > MagickEpsilon) + metrics->max_advance=(double) face->size->metrics.max_advance/64.0; + metrics->bounds.x1=0.0; + metrics->bounds.y1=metrics->descent; + metrics->bounds.x2=metrics->ascent+metrics->descent; + metrics->bounds.y2=metrics->ascent+metrics->descent; + metrics->underline_position=face->underline_position* + (metrics->pixels_per_em.x*PerceptibleReciprocal(face->units_per_EM)); + metrics->underline_thickness=face->underline_thickness* + (metrics->pixels_per_em.x*PerceptibleReciprocal(face->units_per_EM)); + first_glyph_id=0; + FT_Get_First_Char(face,&first_glyph_id); + if ((draw_info->text == (char *) NULL) || (*draw_info->text == '\0') || + (first_glyph_id == 0)) + { + (void) FT_Done_Face(face); + (void) FT_Done_FreeType(library); + return(MagickTrue); + } + /* + Compute bounding box. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(AnnotateEvent,GetMagickModule(),"Font %s; " + "font-encoding %s; text-encoding %s; pointsize %g", + draw_info->font != (char *) NULL ? draw_info->font : "none", + encoding != (char *) NULL ? encoding : "none", + draw_info->encoding != (char *) NULL ? draw_info->encoding : "none", + draw_info->pointsize); + flags=FT_LOAD_DEFAULT; + if (draw_info->render == MagickFalse) + flags=FT_LOAD_NO_BITMAP; + if (draw_info->text_antialias == MagickFalse) + flags|=FT_LOAD_TARGET_MONO; + else + { +#if defined(FT_LOAD_TARGET_LIGHT) + flags|=FT_LOAD_TARGET_LIGHT; +#elif defined(FT_LOAD_TARGET_LCD) + flags|=FT_LOAD_TARGET_LCD; +#endif + } + value=GetImageProperty(image,"type:hinting"); + if ((value != (const char *) NULL) && (LocaleCompare(value,"off") == 0)) + flags|=FT_LOAD_NO_HINTING; + glyph.id=0; + glyph.image=(FT_Glyph) NULL; + last_glyph_id=0; + origin.x=0; + origin.y=0; + affine.xx=65536L; + affine.yx=0L; + affine.xy=0L; + affine.yy=65536L; + if (draw_info->render != MagickFalse) + { + affine.xx=(FT_Fixed) (65536L*draw_info->affine.sx+0.5); + affine.yx=(FT_Fixed) (-65536L*draw_info->affine.rx+0.5); + affine.xy=(FT_Fixed) (-65536L*draw_info->affine.ry+0.5); + affine.yy=(FT_Fixed) (65536L*draw_info->affine.sy+0.5); + } + annotate_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + if (annotate_info->dash_pattern != (double *) NULL) + annotate_info->dash_pattern[0]=0.0; + (void) CloneString(&annotate_info->primitive,"path '"); + status=MagickTrue; + if (draw_info->render != MagickFalse) + { + if (image->storage_class != DirectClass) + (void) SetImageStorageClass(image,DirectClass); + if (image->matte == MagickFalse) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + } + for (p=draw_info->text; GetUTFCode(p) != 0; p+=GetUTFOctets(p)) + if (GetUTFCode(p) < 0) + break; + utf8=(unsigned char *) NULL; + if (GetUTFCode(p) == 0) + p=draw_info->text; + else + { + utf8=ConvertLatin1ToUTF8((unsigned char *) draw_info->text); + if (utf8 != (unsigned char *) NULL) + p=(char *) utf8; + } + grapheme=(GraphemeInfo *) NULL; + length=ComplexTextLayout(image,draw_info,p,strlen(p),face,flags,&grapheme); + missing_glyph_id=FT_Get_Char_Index(face,' '); + code=0; + last_character=(ssize_t) length-1; + for (i=0; i < (ssize_t) length; i++) + { + FT_BitmapGlyph + bitmap; + + FT_Outline + outline; + + PointInfo + point; + + /* + Render UTF-8 sequence. + */ + glyph.id=grapheme[i].index; + if (glyph.id == 0) + glyph.id=missing_glyph_id; + if ((glyph.id != 0) && (last_glyph_id != 0)) + origin.x+=(FT_Pos) (64.0*draw_info->kerning); + glyph.origin=origin; + glyph.origin.x+=grapheme[i].x_offset; + glyph.origin.y+=grapheme[i].y_offset; + if (glyph.image != (FT_Glyph) NULL) + { + FT_Done_Glyph(glyph.image); + glyph.image=(FT_Glyph) NULL; + } + ft_status=FT_Load_Glyph(face,glyph.id,flags); + if (ft_status != 0) + continue; + ft_status=FT_Get_Glyph(face->glyph,&glyph.image); + if (ft_status != 0) + continue; + outline=((FT_OutlineGlyph) glyph.image)->outline; + if ((glyph.image->format != FT_GLYPH_FORMAT_OUTLINE) && + (IsEmptyOutline(outline) == MagickFalse)) + continue; + ft_status=FT_Outline_Get_BBox(&outline,&bounds); + if (ft_status != 0) + continue; + if ((bounds.xMin < metrics->bounds.x1) && (bounds.xMin != 0)) + metrics->bounds.x1=(double) bounds.xMin; + if ((bounds.yMin < metrics->bounds.y1) && (bounds.yMin != 0)) + metrics->bounds.y1=(double) bounds.yMin; + if ((bounds.xMax > metrics->bounds.x2) && (bounds.xMax != 0)) + metrics->bounds.x2=(double) bounds.xMax; + if ((bounds.yMax > metrics->bounds.y2) && (bounds.yMax != 0)) + metrics->bounds.y2=(double) bounds.yMax; + if (((draw_info->stroke.opacity != TransparentOpacity) || + (draw_info->stroke_pattern != (Image *) NULL)) && + ((status != MagickFalse) && (draw_info->render != MagickFalse))) + { + /* + Trace the glyph. + */ + annotate_info->affine.tx=glyph.origin.x/64.0; + annotate_info->affine.ty=(-glyph.origin.y/64.0); + if (IsEmptyOutline(outline) == MagickFalse) + ft_status=FT_Outline_Decompose(&outline,&OutlineMethods, + annotate_info); + } + FT_Vector_Transform(&glyph.origin,&affine); + (void) FT_Glyph_Transform(glyph.image,&affine,&glyph.origin); + ft_status=FT_Glyph_To_Bitmap(&glyph.image,FT_RENDER_MODE_NORMAL, + (FT_Vector *) NULL,MagickTrue); + if (ft_status != 0) + continue; + bitmap=(FT_BitmapGlyph) glyph.image; + point.x=offset->x+bitmap->left; + if (bitmap->bitmap.pixel_mode == ft_pixel_mode_mono) + point.x+=(origin.x/64.0); + point.y=offset->y-bitmap->top; + if (draw_info->render != MagickFalse) + { + CacheView + *image_view; + + unsigned char + *p; + + MagickBooleanType + transparent_fill; + + /* + Rasterize the glyph. + */ + transparent_fill=((draw_info->fill.opacity == TransparentOpacity) && + (draw_info->fill_pattern == (Image *) NULL) && + (draw_info->stroke.opacity == TransparentOpacity) && + (draw_info->stroke_pattern == (Image *) NULL)) ? MagickTrue : + MagickFalse; + p=bitmap->bitmap.buffer; + image_view=AcquireAuthenticCacheView(image,exception); + for (y=0; y < (ssize_t) bitmap->bitmap.rows; y++) + { + MagickBooleanType + active, + sync; + + MagickRealType + fill_opacity; + + PixelPacket + fill_color, + *magick_restrict q; + + ssize_t + x; + + ssize_t + n, + x_offset, + y_offset; + + if (status == MagickFalse) + continue; + x_offset=CastDoubleToLong(ceil(point.x-0.5)); + y_offset=CastDoubleToLong(ceil(point.y+y-0.5)); + if ((y_offset < 0) || (y_offset >= (ssize_t) image->rows)) + continue; + q=(PixelPacket *) NULL; + if ((x_offset < 0) || (x_offset >= (ssize_t) image->columns)) + active=MagickFalse; + else + { + q=GetCacheViewAuthenticPixels(image_view,x_offset,y_offset, + bitmap->bitmap.width,1,exception); + active=q != (PixelPacket *) NULL ? MagickTrue : MagickFalse; + } + n=y*bitmap->bitmap.pitch; + for (x=0; x < (ssize_t) bitmap->bitmap.width; x++, n++) + { + x_offset=CastDoubleToLong(ceil(point.x+x-0.5)); + if ((x_offset < 0) || (x_offset >= (ssize_t) image->columns)) + { + if (q != (PixelPacket *) NULL) + q++; + continue; + } + fill_opacity=1.0; + if (bitmap->bitmap.buffer != (unsigned char *) NULL) + { + if (bitmap->bitmap.pixel_mode == ft_pixel_mode_grays) + fill_opacity=(MagickRealType) (p[n])/( + bitmap->bitmap.num_grays-1); + else + if (bitmap->bitmap.pixel_mode == ft_pixel_mode_mono) + fill_opacity=((p[(x >> 3)+y*bitmap->bitmap.pitch] & + (1 << (~x & 0x07)))) == 0 ? 0.0 : 1.0; + } + if (draw_info->text_antialias == MagickFalse) + fill_opacity=fill_opacity >= 0.5 ? 1.0 : 0.0; + if (active == MagickFalse) + q=GetCacheViewAuthenticPixels(image_view,x_offset,y_offset,1,1, + exception); + if (q == (PixelPacket *) NULL) + continue; + if (transparent_fill == MagickFalse) + { + (void) GetFillColor(draw_info,x_offset,y_offset,&fill_color); + fill_opacity=QuantumRange-fill_opacity*(QuantumRange- + fill_color.opacity); + MagickCompositeOver(&fill_color,fill_opacity,q,q->opacity,q); + } + else + { + double + Sa, + Da; + + Da=1.0-(QuantumScale*(QuantumRange-q->opacity)); + Sa=fill_opacity; + fill_opacity=(1.0-RoundToUnity(Sa+Da-Sa*Da))*QuantumRange; + SetPixelAlpha(q,fill_opacity); + } + if (active == MagickFalse) + { + sync=SyncCacheViewAuthenticPixels(image_view,exception); + if (sync == MagickFalse) + status=MagickFalse; + } + q++; + } + sync=SyncCacheViewAuthenticPixels(image_view,exception); + if (sync == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + if (((draw_info->stroke.opacity != TransparentOpacity) || + (draw_info->stroke_pattern != (Image *) NULL)) && + (status != MagickFalse)) + { + /* + Draw text stroke. + */ + annotate_info->linejoin=RoundJoin; + annotate_info->affine.tx=offset->x; + annotate_info->affine.ty=offset->y; + (void) ConcatenateString(&annotate_info->primitive,"'"); + if (strlen(annotate_info->primitive) > 7) + (void) DrawImage(image,annotate_info); + (void) CloneString(&annotate_info->primitive,"path '"); + } + } + if ((fabs(draw_info->interword_spacing) >= MagickEpsilon) && + (IsUTFSpace(GetUTFCode(p+grapheme[i].cluster)) != MagickFalse) && + (IsUTFSpace(code) == MagickFalse)) + origin.x+=(FT_Pos) (64.0*draw_info->interword_spacing); + else + if (i == last_character) + origin.x+=MagickMax((FT_Pos) grapheme[i].x_advance,bounds.xMax); + else + origin.x+=(FT_Pos) grapheme[i].x_advance; + metrics->origin.x=(double) origin.x; + metrics->origin.y=(double) origin.y; + if (metrics->origin.x > metrics->width) + metrics->width=metrics->origin.x; + last_glyph_id=glyph.id; + code=GetUTFCode(p+grapheme[i].cluster); + } + if (grapheme != (GraphemeInfo *) NULL) + grapheme=(GraphemeInfo *) RelinquishMagickMemory(grapheme); + if (utf8 != (unsigned char *) NULL) + utf8=(unsigned char *) RelinquishMagickMemory(utf8); + if (glyph.image != (FT_Glyph) NULL) + { + FT_Done_Glyph(glyph.image); + glyph.image=(FT_Glyph) NULL; + } + /* + Determine font metrics. + */ + metrics->bounds.x1/=64.0; + metrics->bounds.y1/=64.0; + metrics->bounds.x2/=64.0; + metrics->bounds.y2/=64.0; + metrics->origin.x/=64.0; + metrics->origin.y/=64.0; + metrics->width/=64.0; + /* + Relinquish resources. + */ + annotate_info=DestroyDrawInfo(annotate_info); + (void) FT_Done_Face(face); + (void) FT_Done_FreeType(library); + return(status); +} +#else +static MagickBooleanType RenderFreetype(Image *image,const DrawInfo *draw_info, + const char *magick_unused(encoding),const PointInfo *offset, + TypeMetric *metrics) +{ + (void) ThrowMagickException(&image->exception,GetMagickModule(), + MissingDelegateWarning,"DelegateLibrarySupportNotBuiltIn","`%s' (Freetype)", + draw_info->font != (char *) NULL ? draw_info->font : "none"); + return(RenderPostscript(image,draw_info,offset,metrics)); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e n d e r P o s t s c r i p t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RenderPostscript() renders text on the image with a Postscript font. It +% also returns the bounding box of the text relative to the image. +% +% The format of the RenderPostscript method is: +% +% MagickBooleanType RenderPostscript(Image *image,DrawInfo *draw_info, +% const PointInfo *offset,TypeMetric *metrics) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o offset: (x,y) location of text relative to image. +% +% o metrics: bounding box of text. +% +*/ + +static char *EscapeParenthesis(const char *source) +{ + char + *destination; + + char + *q; + + const char + *p; + + size_t + length; + + assert(source != (const char *) NULL); + length=0; + for (p=source; *p != '\0'; p++) + { + if ((*p == '\\') || (*p == '(') || (*p == ')')) + { + if (~length < 1) + ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString"); + length++; + } + length++; + } + destination=(char *) NULL; + if (~length >= (MaxTextExtent-1)) + destination=(char *) AcquireQuantumMemory(length+MaxTextExtent, + sizeof(*destination)); + if (destination == (char *) NULL) + ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString"); + *destination='\0'; + q=destination; + for (p=source; *p != '\0'; p++) + { + if ((*p == '\\') || (*p == '(') || (*p == ')')) + *q++='\\'; + *q++=(*p); + } + *q='\0'; + return(destination); +} + +static MagickBooleanType RenderPostscript(Image *image, + const DrawInfo *draw_info,const PointInfo *offset,TypeMetric *metrics) +{ + char + filename[MaxTextExtent], + geometry[MaxTextExtent], + *text; + + FILE + *file; + + Image + *annotate_image; + + ImageInfo + *annotate_info; + + int + unique_file; + + MagickBooleanType + identity; + + PointInfo + extent, + point, + resolution; + + ssize_t + i; + + size_t + length; + + ssize_t + y; + + /* + Render label with a Postscript font. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(AnnotateEvent,GetMagickModule(), + "Font %s; pointsize %g",draw_info->font != (char *) NULL ? + draw_info->font : "none",draw_info->pointsize); + file=(FILE *) NULL; + unique_file=AcquireUniqueFileResource(filename); + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + { + ThrowFileException(&image->exception,FileOpenError,"UnableToOpenFile", + filename); + return(MagickFalse); + } + (void) FormatLocaleFile(file,"%%!PS-Adobe-3.0\n"); + (void) FormatLocaleFile(file,"/ReencodeType\n"); + (void) FormatLocaleFile(file,"{\n"); + (void) FormatLocaleFile(file," findfont dup length\n"); + (void) FormatLocaleFile(file, + " dict begin { 1 index /FID ne {def} {pop pop} ifelse } forall\n"); + (void) FormatLocaleFile(file, + " /Encoding ISOLatin1Encoding def currentdict end definefont pop\n"); + (void) FormatLocaleFile(file,"} bind def\n"); + /* + Sample to compute bounding box. + */ + identity=(fabs(draw_info->affine.sx-draw_info->affine.sy) < MagickEpsilon) && + (fabs(draw_info->affine.rx) < MagickEpsilon) && + (fabs(draw_info->affine.ry) < MagickEpsilon) ? MagickTrue : MagickFalse; + extent.x=0.0; + extent.y=0.0; + length=strlen(draw_info->text); + for (i=0; i <= (ssize_t) (length+2); i++) + { + point.x=fabs(draw_info->affine.sx*i*draw_info->pointsize+ + draw_info->affine.ry*2.0*draw_info->pointsize); + point.y=fabs(draw_info->affine.rx*i*draw_info->pointsize+ + draw_info->affine.sy*2.0*draw_info->pointsize); + if (point.x > extent.x) + extent.x=point.x; + if (point.y > extent.y) + extent.y=point.y; + } + (void) FormatLocaleFile(file,"%g %g moveto\n",identity != MagickFalse ? 0.0 : + extent.x/2.0,extent.y/2.0); + (void) FormatLocaleFile(file,"%g %g scale\n",draw_info->pointsize, + draw_info->pointsize); + if ((draw_info->font == (char *) NULL) || (*draw_info->font == '\0') || + (strchr(draw_info->font,'/') != (char *) NULL)) + (void) FormatLocaleFile(file, + "/Times-Roman-ISO dup /Times-Roman ReencodeType findfont setfont\n"); + else + (void) FormatLocaleFile(file, + "/%s-ISO dup /%s ReencodeType findfont setfont\n",draw_info->font, + draw_info->font); + (void) FormatLocaleFile(file,"[%g %g %g %g 0 0] concat\n", + draw_info->affine.sx,-draw_info->affine.rx,-draw_info->affine.ry, + draw_info->affine.sy); + text=EscapeParenthesis(draw_info->text); + if (identity == MagickFalse) + (void) FormatLocaleFile(file,"(%s) stringwidth pop -0.5 mul -0.5 rmoveto\n", + text); + (void) FormatLocaleFile(file,"(%s) show\n",text); + text=DestroyString(text); + (void) FormatLocaleFile(file,"showpage\n"); + (void) fclose(file); + (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.20g+0+0!", + floor(extent.x+0.5),floor(extent.y+0.5)); + annotate_info=AcquireImageInfo(); + (void) FormatLocaleString(annotate_info->filename,MaxTextExtent,"ps:%s", + filename); + (void) CloneString(&annotate_info->page,geometry); + if (draw_info->density != (char *) NULL) + (void) CloneString(&annotate_info->density,draw_info->density); + annotate_info->antialias=draw_info->text_antialias; + annotate_image=ReadImage(annotate_info,&image->exception); + CatchException(&image->exception); + annotate_info=DestroyImageInfo(annotate_info); + (void) RelinquishUniqueFileResource(filename); + if (annotate_image == (Image *) NULL) + return(MagickFalse); + resolution.x=DefaultResolution; + resolution.y=DefaultResolution; + if (draw_info->density != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(draw_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + if (identity == MagickFalse) + (void) TransformImage(&annotate_image,"0x0",(char *) NULL); + else + { + RectangleInfo + crop_info; + + crop_info=GetImageBoundingBox(annotate_image,&annotate_image->exception); + crop_info.height=(size_t) ((resolution.y/DefaultResolution)* + ExpandAffine(&draw_info->affine)*draw_info->pointsize+0.5); + crop_info.y=CastDoubleToLong(ceil((resolution.y/DefaultResolution)* + extent.y/8.0-0.5)); + (void) FormatLocaleString(geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) crop_info.width,(double) + crop_info.height,(double) crop_info.x,(double) crop_info.y); + (void) TransformImage(&annotate_image,geometry,(char *) NULL); + } + metrics->pixels_per_em.x=(resolution.y/DefaultResolution)* + ExpandAffine(&draw_info->affine)*draw_info->pointsize; + metrics->pixels_per_em.y=metrics->pixels_per_em.x; + metrics->ascent=metrics->pixels_per_em.y; + metrics->descent=metrics->pixels_per_em.y/-5.0; + metrics->width=(double) annotate_image->columns/ + ExpandAffine(&draw_info->affine); + metrics->height=floor(metrics->ascent-metrics->descent+0.5); + metrics->max_advance=metrics->pixels_per_em.x; + metrics->bounds.x1=0.0; + metrics->bounds.y1=metrics->descent; + metrics->bounds.x2=metrics->ascent+metrics->descent; + metrics->bounds.y2=metrics->ascent+metrics->descent; + metrics->underline_position=(-2.0); + metrics->underline_thickness=1.0; + if (draw_info->render == MagickFalse) + { + annotate_image=DestroyImage(annotate_image); + return(MagickTrue); + } + if (draw_info->fill.opacity != TransparentOpacity) + { + ExceptionInfo + *exception; + + MagickBooleanType + sync; + + PixelPacket + fill_color; + + CacheView + *annotate_view; + + /* + Render fill color. + */ + if (image->matte == MagickFalse) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + if (annotate_image->matte == MagickFalse) + (void) SetImageAlphaChannel(annotate_image,OpaqueAlphaChannel); + fill_color=draw_info->fill; + exception=(&image->exception); + annotate_view=AcquireAuthenticCacheView(annotate_image,exception); + for (y=0; y < (ssize_t) annotate_image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + q=GetCacheViewAuthenticPixels(annotate_view,0,y,annotate_image->columns, + 1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) annotate_image->columns; x++) + { + (void) GetFillColor(draw_info,x,y,&fill_color); + SetPixelAlpha(q,ClampToQuantum((((QuantumRange-GetPixelIntensity( + annotate_image,q))*(QuantumRange-fill_color.opacity))/ + QuantumRange))); + SetPixelRed(q,fill_color.red); + SetPixelGreen(q,fill_color.green); + SetPixelBlue(q,fill_color.blue); + q++; + } + sync=SyncCacheViewAuthenticPixels(annotate_view,exception); + if (sync == MagickFalse) + break; + } + annotate_view=DestroyCacheView(annotate_view); + (void) CompositeImage(image,OverCompositeOp,annotate_image, + (ssize_t) ceil(offset->x-0.5),(ssize_t) ceil(offset->y-(metrics->ascent+ + metrics->descent)-0.5)); + } + annotate_image=DestroyImage(annotate_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e n d e r X 1 1 % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RenderX11() renders text on the image with an X11 font. It also returns the +% bounding box of the text relative to the image. +% +% The format of the RenderX11 method is: +% +% MagickBooleanType RenderX11(Image *image,DrawInfo *draw_info, +% const PointInfo *offset,TypeMetric *metrics) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o offset: (x,y) location of text relative to image. +% +% o metrics: bounding box of text. +% +*/ +static MagickBooleanType RenderX11(Image *image,const DrawInfo *draw_info, + const PointInfo *offset,TypeMetric *metrics) +{ + MagickBooleanType + status; + + if (annotate_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&annotate_semaphore); + LockSemaphoreInfo(annotate_semaphore); + status=XRenderImage(image,draw_info,offset,metrics); + UnlockSemaphoreInfo(annotate_semaphore); + return(status); +} diff --git a/ImageMagick-6.9.12-44/magick/annotate.h b/ImageMagick-6.9.12-44/magick/annotate.h new file mode 100644 index 0000000..5f44ae1 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/annotate.h @@ -0,0 +1,44 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image annotation methods. +*/ +#ifndef MAGICKCORE_ANNOTATE_H +#define MAGICKCORE_ANNOTATE_H + +#include "magick/draw.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport MagickBooleanType + AnnotateComponentGenesis(void), + AnnotateImage(Image *,const DrawInfo *), + GetMultilineTypeMetrics(Image *,const DrawInfo *,TypeMetric *), + GetTypeMetrics(Image *,const DrawInfo *,TypeMetric *); + +extern MagickExport ssize_t + FormatMagickCaption(Image *,DrawInfo *,const MagickBooleanType,TypeMetric *, + char **); + +extern MagickExport void + AnnotateComponentTerminus(void); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/api.h b/ImageMagick-6.9.12-44/magick/api.h new file mode 100644 index 0000000..1e4af34 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/api.h @@ -0,0 +1,34 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Deprecated as of ImageMagick 6.2.3. + + MagickCore Application Programming Interface declarations. +*/ + +#ifndef MAGICKCORE_API_DEPRECATED_H +#define MAGICKCORE_API_DEPRECATED_H + +#include "magick/MagickCore.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/artifact.c b/ImageMagick-6.9.12-44/magick/artifact.c new file mode 100644 index 0000000..1043a6f --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/artifact.c @@ -0,0 +1,461 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% AAA RRRR TTTTT IIIII FFFFF AAA CCCC TTTTT % +% A A R R T I F A A C T % +% AAAAA RRRRR T I FFF AAAAA C T % +% A A R R T I F A A C T % +% A A R R T IIIII F A A CCCCC T % +% % +% % +% MagickCore Artifact Methods % +% % +% Software Design % +% Cristy % +% March 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/compare.h" +#include "magick/constitute.h" +#include "magick/draw.h" +#include "magick/effect.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/fx.h" +#include "magick/fx-private.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/layer.h" +#include "magick/list.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/montage.h" +#include "magick/option.h" +#include "magick/profile.h" +#include "magick/quantum.h" +#include "magick/resource_.h" +#include "magick/splay-tree.h" +#include "magick/signature-private.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/xml-tree.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e I m a g e A r t i f a c t s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneImageArtifacts() clones one or more image artifacts. +% +% The format of the CloneImageArtifacts method is: +% +% MagickBooleanType CloneImageArtifacts(Image *image, +% const Image *clone_image) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o clone_image: the clone image. +% +*/ +MagickExport MagickBooleanType CloneImageArtifacts(Image *image, + const Image *clone_image) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(clone_image != (const Image *) NULL); + assert(clone_image->signature == MagickCoreSignature); + if (clone_image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + clone_image->filename); + if (clone_image->artifacts != (void *) NULL) + { + if (image->artifacts != (void *) NULL) + DestroyImageArtifacts(image); + image->artifacts=CloneSplayTree((SplayTreeInfo *) clone_image->artifacts, + (void *(*)(void *)) ConstantString,(void *(*)(void *)) ConstantString); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e f i n e I m a g e A r t i f a c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DefineImageArtifact() associates a key/value pair with an image artifact. +% +% The format of the DefineImageArtifact method is: +% +% MagickBooleanType DefineImageArtifact(Image *image, +% const char *artifact) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o artifact: the image artifact. +% +*/ +MagickExport MagickBooleanType DefineImageArtifact(Image *image, + const char *artifact) +{ + char + key[MaxTextExtent], + value[MaxTextExtent]; + + char + *p; + + assert(image != (Image *) NULL); + assert(artifact != (const char *) NULL); + (void) CopyMagickString(key,artifact,MaxTextExtent-1); + for (p=key; *p != '\0'; p++) + if (*p == '=') + break; + *value='\0'; + if (*p == '=') + (void) CopyMagickString(value,p+1,MaxTextExtent); + *p='\0'; + return(SetImageArtifact(image,key,value)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e l e t e I m a g e A r t i f a c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DeleteImageArtifact() deletes an image artifact. +% +% The format of the DeleteImageArtifact method is: +% +% MagickBooleanType DeleteImageArtifact(Image *image,const char *artifact) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o artifact: the image artifact. +% +*/ +MagickExport MagickBooleanType DeleteImageArtifact(Image *image, + const char *artifact) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->artifacts == (void *) NULL) + return(MagickFalse); + return(DeleteNodeFromSplayTree((SplayTreeInfo *) image->artifacts,artifact)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y I m a g e A r t i f a c t s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyImageArtifacts() releases memory associated with image artifact +% values. +% +% The format of the DestroyDefines method is: +% +% void DestroyImageArtifacts(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport void DestroyImageArtifacts(Image *image) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->artifacts != (void *) NULL) + image->artifacts=(void *) DestroySplayTree((SplayTreeInfo *) + image->artifacts); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e A r t i f a c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageArtifact() gets a value associated with an image artifact. +% +% Note, the artifact is a constant. Do not attempt to free it. +% +% The format of the GetImageArtifact method is: +% +% const char *GetImageArtifact(const Image *image,const char *key) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o key: the key. +% +*/ +MagickExport const char *GetImageArtifact(const Image *image, + const char *artifact) +{ + const char + *p; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + p=(const char *) NULL; + if (artifact == (const char *) NULL) + { + ResetSplayTreeIterator((SplayTreeInfo *) image->artifacts); + p=(const char *) GetNextValueInSplayTree((SplayTreeInfo *) + image->artifacts); + return(p); + } + if (image->artifacts != (void *) NULL) + { + p=(const char *) GetValueFromSplayTree((SplayTreeInfo *) image->artifacts, + artifact); + if (p != (const char *) NULL) + return(p); + } + return(p); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t N e x t I m a g e A r t i f a c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetNextImageArtifact() gets the next image artifact value. +% +% The format of the GetNextImageArtifact method is: +% +% char *GetNextImageArtifact(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport char *GetNextImageArtifact(const Image *image) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->artifacts == (void *) NULL) + return((char *) NULL); + return((char *) GetNextKeyInSplayTree((SplayTreeInfo *) image->artifacts)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e m o v e I m a g e A r t i f a c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RemoveImageArtifact() removes an artifact from the image and returns its +% value. +% +% The format of the RemoveImageArtifact method is: +% +% char *RemoveImageArtifact(Image *image,const char *artifact) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o artifact: the image artifact. +% +*/ +MagickExport char *RemoveImageArtifact(Image *image,const char *artifact) +{ + char + *value; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->artifacts == (void *) NULL) + return((char *) NULL); + value=(char *) RemoveNodeFromSplayTree((SplayTreeInfo *) image->artifacts, + artifact); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e s e t I m a g e A r t i f a c t I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ResetImageArtifactIterator() resets the image artifact iterator. Use it +% in conjunction with GetNextImageArtifact() to iterate over all the values +% associated with an image artifact. +% +% The format of the ResetImageArtifactIterator method is: +% +% ResetImageArtifactIterator(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport void ResetImageArtifactIterator(const Image *image) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->artifacts == (void *) NULL) + return; + ResetSplayTreeIterator((SplayTreeInfo *) image->artifacts); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e A r t i f a c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageArtifact() sets a key-value pair in the image artifact namespace. +% Artifacts differ from properties. Properties are public and are generally +% exported to an external image format if the format supports it. Artifacts +% are private and are utilized by the internal ImageMagick API to modify the +% behavior of certain algorithms. +% +% The format of the SetImageArtifact method is: +% +% MagickBooleanType SetImageArtifact(Image *image,const char *artifact, +% const char *value) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o artifact: the image artifact key. +% +% o value: the image artifact value. +% +*/ +MagickExport MagickBooleanType SetImageArtifact(Image *image, + const char *artifact,const char *value) +{ + MagickBooleanType + status; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + /* + Create tree if needed. + */ + if (image->artifacts == (void *) NULL) + image->artifacts=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory, + RelinquishMagickMemory); + /* + Delete artifact if NULL -- empty string values are valid! + */ + if (value == (const char *) NULL) + return(DeleteImageArtifact(image,artifact)); + /* + Add artifact to tree. + */ + status=AddValueToSplayTree((SplayTreeInfo *) image->artifacts, + ConstantString(artifact),ConstantString(value)); + return(status); +} diff --git a/ImageMagick-6.9.12-44/magick/artifact.h b/ImageMagick-6.9.12-44/magick/artifact.h new file mode 100644 index 0000000..77b2ff3 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/artifact.h @@ -0,0 +1,46 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore artifact methods. +*/ +#ifndef MAGICKCORE_ARTIFACT_H +#define MAGICKCORE_ARTIFACT_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport char + *GetNextImageArtifact(const Image *), + *RemoveImageArtifact(Image *,const char *); + +extern MagickExport const char + *GetImageArtifact(const Image *,const char *); + +extern MagickExport MagickBooleanType + CloneImageArtifacts(Image *,const Image *), + DefineImageArtifact(Image *,const char *), + DeleteImageArtifact(Image *,const char *), + SetImageArtifact(Image *,const char *,const char *); + +extern MagickExport void + DestroyImageArtifacts(Image *), + ResetImageArtifactIterator(const Image *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/attribute.c b/ImageMagick-6.9.12-44/magick/attribute.c new file mode 100644 index 0000000..84e7321 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/attribute.c @@ -0,0 +1,1678 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% AAA TTTTT TTTTT RRRR IIIII BBBB U U TTTTT EEEEE % +% A A T T R R I B B U U T E % +% AAAAA T T RRRR I BBBB U U T EEE % +% A A T T R R I B B U U T E % +% A A T T R R IIIII BBBB UUU T EEEEE % +% % +% % +% MagickCore Get / Set Image Attributes % +% % +% Software Design % +% Cristy % +% October 2002 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/cache-private.h" +#include "magick/cache-view.h" +#include "magick/client.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/composite.h" +#include "magick/composite-private.h" +#include "magick/constitute.h" +#include "magick/deprecate.h" +#include "magick/draw.h" +#include "magick/draw-private.h" +#include "magick/effect.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/histogram.h" +#include "magick/identify.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/memory_.h" +#include "magick/magick.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/paint.h" +#include "magick/pixel.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/random_.h" +#include "magick/resource_.h" +#include "magick/semaphore.h" +#include "magick/segment.h" +#include "magick/splay-tree.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/thread-private.h" +#include "magick/threshold.h" +#include "magick/transform.h" +#include "magick/utility.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t I m a g e B o u n d i n g B o x % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageBoundingBox() returns the bounding box of an image canvas. +% +% The format of the GetImageBoundingBox method is: +% +% RectangleInfo GetImageBoundingBox(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o bounds: Method GetImageBoundingBox returns the bounding box of an +% image canvas. +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +typedef struct _EdgeInfo +{ + double + left, + right, + top, + bottom; +} EdgeInfo; + +static double GetEdgeBackgroundFactor(const Image *image, + const CacheView *image_view,const GravityType gravity,const size_t width, + const size_t height,const ssize_t x_offset,const ssize_t y_offset, + ExceptionInfo *exception) +{ + CacheView + *edge_view; + + const char + *artifact; + + double + factor; + + Image + *edge_image; + + MagickPixelPacket + background, + pixel; + + RectangleInfo + edge_geometry; + + const PixelPacket + *p; + + ssize_t + y; + + /* + Determine the percent of image background for this edge. + */ + switch (gravity) + { + case NorthWestGravity: + case NorthGravity: + default: + { + p=GetCacheViewVirtualPixels(image_view,0,0,1,1,exception); + break; + } + case NorthEastGravity: + case EastGravity: + { + p=GetCacheViewVirtualPixels(image_view,(ssize_t) image->columns-1,0,1,1, + exception); + break; + } + case SouthEastGravity: + case SouthGravity: + { + p=GetCacheViewVirtualPixels(image_view,(ssize_t) image->columns-1, + (ssize_t) image->rows-1,1,1,exception); + break; + } + case SouthWestGravity: + case WestGravity: + { + p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) image->rows-1,1,1, + exception); + break; + } + } + GetMagickPixelPacket(image,&background); + SetMagickPixelPacket(image,p,(IndexPacket *) NULL,&background); + artifact=GetImageArtifact(image,"background"); + if (artifact != (const char *) NULL) + (void) QueryMagickColor(artifact,&background,exception); + artifact=GetImageArtifact(image,"trim:background-color"); + if (artifact != (const char *) NULL) + (void) QueryMagickColor(artifact,&background,exception); + edge_geometry.width=width; + edge_geometry.height=height; + edge_geometry.x=x_offset; + edge_geometry.y=y_offset; + GravityAdjustGeometry(image->columns,image->rows,gravity,&edge_geometry); + edge_image=CropImage(image,&edge_geometry,exception); + if (edge_image == (Image *) NULL) + return(0.0); + factor=0.0; + GetMagickPixelPacket(edge_image,&pixel); + edge_view=AcquireVirtualCacheView(edge_image,exception); + for (y=0; y < (ssize_t) edge_image->rows; y++) + { + ssize_t + x; + + p=GetCacheViewVirtualPixels(edge_view,0,y,edge_image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) edge_image->columns; x++) + { + SetMagickPixelPacket(edge_image,p,(IndexPacket *) NULL,&pixel); + if (IsMagickColorSimilar(&pixel,&background) == MagickFalse) + factor++; + p++; + } + } + factor/=((double) edge_image->columns*edge_image->rows); + edge_view=DestroyCacheView(edge_view); + edge_image=DestroyImage(edge_image); + return(factor); +} + +static inline double GetMinEdgeBackgroundFactor(const EdgeInfo *edge) +{ + double + factor; + + factor=MagickMin(MagickMin(MagickMin(edge->left,edge->right),edge->top), + edge->bottom); + return(factor); +} + +static RectangleInfo GetEdgeBoundingBox(const Image *image, + ExceptionInfo *exception) +{ + CacheView + *edge_view; + + const char + *artifact; + + double + background_factor, + percent_background; + + EdgeInfo + edge, + vertex; + + Image + *edge_image; + + RectangleInfo + bounds; + + /* + Get the image bounding box. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + SetGeometry(image,&bounds); + edge_image=CloneImage(image,0,0,MagickTrue,exception); + if (edge_image == (Image *) NULL) + return(bounds); + (void) ParseAbsoluteGeometry("0x0+0+0",&edge_image->page); + memset(&vertex,0,sizeof(vertex)); + edge_view=AcquireVirtualCacheView(edge_image,exception); + edge.left=GetEdgeBackgroundFactor(edge_image,edge_view,WestGravity, + 1,0,0,0,exception); + edge.right=GetEdgeBackgroundFactor(edge_image,edge_view,EastGravity, + 1,0,0,0,exception); + edge.top=GetEdgeBackgroundFactor(edge_image,edge_view,NorthGravity, + 0,1,0,0,exception); + edge.bottom=GetEdgeBackgroundFactor(edge_image,edge_view,SouthGravity, + 0,1,0,0,exception); + percent_background=MagickEpsilon; + artifact=GetImageArtifact(edge_image,"trim:percent-background"); + if (artifact != (const char *) NULL) + percent_background=StringToDouble(artifact,(char **) NULL)/100.0; + percent_background=MagickMin(MagickMax(1.0-percent_background,MagickEpsilon), + MagickEpsilon); + background_factor=GetMinEdgeBackgroundFactor(&edge); + for ( ; background_factor < percent_background; + background_factor=GetMinEdgeBackgroundFactor(&edge)) + { + if ((bounds.width == 0) || (bounds.height == 0)) + break; + if (fabs(edge.left-background_factor) < MagickEpsilon) + { + /* + Trim left edge. + */ + vertex.left++; + bounds.width--; + edge.left=GetEdgeBackgroundFactor(edge_image,edge_view, + NorthWestGravity,1,bounds.height,(ssize_t) vertex.left,(ssize_t) + vertex.top,exception); + edge.top=GetEdgeBackgroundFactor(edge_image,edge_view, + NorthWestGravity,bounds.width,1,(ssize_t) vertex.left,(ssize_t) + vertex.top,exception); + edge.bottom=GetEdgeBackgroundFactor(edge_image,edge_view, + SouthWestGravity,bounds.width,1,(ssize_t) vertex.left,(ssize_t) + vertex.bottom,exception); + continue; + } + if (fabs(edge.right-background_factor) < MagickEpsilon) + { + /* + Trim right edge. + */ + vertex.right++; + bounds.width--; + edge.right=GetEdgeBackgroundFactor(edge_image,edge_view, + NorthEastGravity,1,bounds.height,(ssize_t) vertex.right,(ssize_t) + vertex.top,exception); + edge.top=GetEdgeBackgroundFactor(edge_image,edge_view, + NorthWestGravity,bounds.width,1,(ssize_t) vertex.left,(ssize_t) + vertex.top,exception); + edge.bottom=GetEdgeBackgroundFactor(edge_image,edge_view, + SouthWestGravity,bounds.width,1,(ssize_t) vertex.left,(ssize_t) + vertex.bottom,exception); + continue; + } + if (fabs(edge.top-background_factor) < MagickEpsilon) + { + /* + Trim top edge. + */ + vertex.top++; + bounds.height--; + edge.left=GetEdgeBackgroundFactor(edge_image,edge_view, + NorthWestGravity,1,bounds.height,(ssize_t) vertex.left,(ssize_t) + vertex.top,exception); + edge.right=GetEdgeBackgroundFactor(edge_image,edge_view, + NorthEastGravity,1,bounds.height,(ssize_t) vertex.right,(ssize_t) + vertex.top,exception); + edge.top=GetEdgeBackgroundFactor(edge_image,edge_view, + NorthWestGravity,bounds.width,1,(ssize_t) vertex.left,(ssize_t) + vertex.top,exception); + continue; + } + if (fabs(edge.bottom-background_factor) < MagickEpsilon) + { + /* + Trim bottom edge. + */ + vertex.bottom++; + bounds.height--; + edge.left=GetEdgeBackgroundFactor(edge_image,edge_view, + NorthWestGravity,1,bounds.height,(ssize_t) vertex.left,(ssize_t) + vertex.top,exception); + edge.right=GetEdgeBackgroundFactor(edge_image,edge_view, + NorthEastGravity,1,bounds.height,(ssize_t) vertex.right,(ssize_t) + vertex.top,exception); + edge.bottom=GetEdgeBackgroundFactor(edge_image,edge_view, + SouthWestGravity,bounds.width,1,(ssize_t) vertex.left,(ssize_t) + vertex.bottom,exception); + continue; + } + } + edge_view=DestroyCacheView(edge_view); + edge_image=DestroyImage(edge_image); + bounds.x=(ssize_t) vertex.left; + bounds.y=(ssize_t) vertex.top; + if ((bounds.width == 0) || (bounds.height == 0)) + (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning, + "GeometryDoesNotContainImage","`%s'",image->filename); + return(bounds); +} + +MagickExport RectangleInfo GetImageBoundingBox(const Image *image, + ExceptionInfo *exception) +{ + CacheView + *image_view; + + const char + *artifact; + + MagickBooleanType + status; + + MagickPixelPacket + target[4], + zero; + + RectangleInfo + bounds; + + const PixelPacket + *p; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + artifact=GetImageArtifact(image,"trim:percent-background"); + if (artifact != (const char *) NULL) + return(GetEdgeBoundingBox(image,exception)); + bounds.width=image->columns == 1 ? 1 : 0; + bounds.height=image->rows == 1 ? 1 : 0; + bounds.x=(ssize_t) image->columns; + bounds.y=(ssize_t) image->rows; + GetMagickPixelPacket(image,&target[0]); + image_view=AcquireVirtualCacheView(image,exception); + p=GetCacheViewVirtualPixels(image_view,0,0,1,1,exception); + if (p == (const PixelPacket *) NULL) + { + image_view=DestroyCacheView(image_view); + return(bounds); + } + SetMagickPixelPacket(image,p,GetCacheViewVirtualIndexQueue(image_view), + &target[0]); + GetMagickPixelPacket(image,&target[1]); + p=GetCacheViewVirtualPixels(image_view,(ssize_t) image->columns-1,0,1,1, + exception); + if (p != (const PixelPacket *) NULL) + SetMagickPixelPacket(image,p,GetCacheViewVirtualIndexQueue(image_view), + &target[1]); + GetMagickPixelPacket(image,&target[2]); + p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) image->rows-1,1,1, + exception); + if (p != (const PixelPacket *) NULL) + SetMagickPixelPacket(image,p,GetCacheViewVirtualIndexQueue(image_view), + &target[2]); + GetMagickPixelPacket(image,&target[3]); + p=GetCacheViewVirtualPixels(image_view,(ssize_t) image->columns-1, + (ssize_t) image->rows-1,1,1,exception); + if (p != (const PixelPacket *) NULL) + SetMagickPixelPacket(image,p,GetCacheViewVirtualIndexQueue(image_view), + &target[3]); + status=MagickTrue; + GetMagickPixelPacket(image,&zero); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickPixelPacket + pixel; + + RectangleInfo + bounding_box; + + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + if (status == MagickFalse) + continue; +#if defined(MAGICKCORE_OPENMP_SUPPORT) +# pragma omp critical (MagickCore_GetImageBoundingBox) +#endif + bounding_box=bounds; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(image_view); + pixel=zero; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetMagickPixelPacket(image,p,indexes+x,&pixel); + if ((x < bounding_box.x) && + (IsMagickColorSimilar(&pixel,&target[0]) == MagickFalse)) + bounding_box.x=x; + if ((x > (ssize_t) bounding_box.width) && + (IsMagickColorSimilar(&pixel,&target[1]) == MagickFalse)) + bounding_box.width=(size_t) x; + if ((y < bounding_box.y) && + (IsMagickColorSimilar(&pixel,&target[0]) == MagickFalse)) + bounding_box.y=y; + if ((y > (ssize_t) bounding_box.height) && + (IsMagickColorSimilar(&pixel,&target[2]) == MagickFalse)) + bounding_box.height=(size_t) y; + if ((x < (ssize_t) bounding_box.width) && + (y > (ssize_t) bounding_box.height) && + (IsMagickColorSimilar(&pixel,&target[3]) == MagickFalse)) + { + bounding_box.width=(size_t) x; + bounding_box.height=(size_t) y; + } + p++; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) +# pragma omp critical (MagickCore_GetImageBoundingBox) +#endif + { + if (bounding_box.x < bounds.x) + bounds.x=bounding_box.x; + if (bounding_box.y < bounds.y) + bounds.y=bounding_box.y; + if (bounding_box.width > bounds.width) + bounds.width=bounding_box.width; + if (bounding_box.height > bounds.height) + bounds.height=bounding_box.height; + } + } + image_view=DestroyCacheView(image_view); + if ((bounds.width == 0) || (bounds.height == 0)) + (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning, + "GeometryDoesNotContainImage","`%s'",image->filename); + else + { + bounds.width-=(bounds.x-1); + bounds.height-=(bounds.y-1); + } + return(bounds); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e C h a n n e l D e p t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageChannelDepth() returns the depth of a particular image channel. +% +% The format of the GetImageChannelDepth method is: +% +% size_t GetImageDepth(const Image *image,ExceptionInfo *exception) +% size_t GetImageChannelDepth(const Image *image, +% const ChannelType channel,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport size_t GetImageDepth(const Image *image,ExceptionInfo *exception) +{ + return(GetImageChannelDepth(image,CompositeChannels,exception)); +} + +MagickExport size_t GetImageChannelDepth(const Image *image, + const ChannelType channel,ExceptionInfo *exception) +{ + CacheView + *image_view; + + MagickBooleanType + status; + + ssize_t + i; + + size_t + *current_depth, + depth, + number_threads; + + ssize_t + y; + + /* + Compute image depth. + */ + assert(image != (Image *) NULL); + + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + number_threads=(size_t) GetMagickResourceLimit(ThreadResource); + current_depth=(size_t *) AcquireQuantumMemory(number_threads, + sizeof(*current_depth)); + if (current_depth == (size_t *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + status=MagickTrue; + for (i=0; i < (ssize_t) number_threads; i++) + current_depth[i]=1; + if ((image->storage_class == PseudoClass) && (image->matte == MagickFalse)) + { +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->colors,1) +#endif + for (i=0; i < (ssize_t) image->colors; i++) + { + const int + id = GetOpenMPThreadId(); + + while (current_depth[id] < MAGICKCORE_QUANTUM_DEPTH) + { + MagickBooleanType + atDepth; + + QuantumAny + range; + + atDepth=MagickTrue; + range=GetQuantumRange(current_depth[id]); + if ((channel & RedChannel) != 0) + if (IsPixelAtDepth(image->colormap[i].red,range) == MagickFalse) + atDepth=MagickFalse; + if ((atDepth != MagickFalse) && ((channel & GreenChannel) != 0)) + if (IsPixelAtDepth(image->colormap[i].green,range) == MagickFalse) + atDepth=MagickFalse; + if ((atDepth != MagickFalse) && ((channel & BlueChannel) != 0)) + if (IsPixelAtDepth(image->colormap[i].blue,range) == MagickFalse) + atDepth=MagickFalse; + if ((atDepth != MagickFalse)) + break; + current_depth[id]++; + } + } + depth=current_depth[0]; + for (i=1; i < (ssize_t) number_threads; i++) + if (depth < current_depth[i]) + depth=current_depth[i]; + current_depth=(size_t *) RelinquishMagickMemory(current_depth); + return(depth); + } + image_view=AcquireVirtualCacheView(image,exception); +#if !defined(MAGICKCORE_HDRI_SUPPORT) +DisableMSCWarning(4127) + if (1UL*QuantumRange <= MaxMap) +RestoreMSCWarning + { + size_t + *depth_map; + + /* + Scale pixels to desired (optimized with depth map). + */ + depth_map=(size_t *) AcquireQuantumMemory(MaxMap+1,sizeof(*depth_map)); + if (depth_map == (size_t *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + for (i=0; i <= (ssize_t) MaxMap; i++) + { + unsigned int + depth; + + for (depth=1; depth < MAGICKCORE_QUANTUM_DEPTH; depth++) + { + Quantum + pixel; + + QuantumAny + range; + + range=GetQuantumRange(depth); + pixel=(Quantum) i; + if (pixel == ScaleAnyToQuantum(ScaleQuantumToAny(pixel,range),range)) + break; + } + depth_map[i]=depth; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + const int + id = GetOpenMPThreadId(); + + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + continue; + indexes=GetCacheViewVirtualIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + Quantum + pixel; + + if ((channel & RedChannel) != 0) + { + pixel=GetPixelRed(p); + if (depth_map[ScaleQuantumToMap(pixel)] > current_depth[id]) + current_depth[id]=depth_map[ScaleQuantumToMap(pixel)]; + } + if ((channel & GreenChannel) != 0) + { + pixel=GetPixelGreen(p); + if (depth_map[ScaleQuantumToMap(pixel)] > current_depth[id]) + current_depth[id]=depth_map[ScaleQuantumToMap(pixel)]; + } + if ((channel & BlueChannel) != 0) + { + pixel=GetPixelBlue(p); + if (depth_map[ScaleQuantumToMap(pixel)] > current_depth[id]) + current_depth[id]=depth_map[ScaleQuantumToMap(pixel)]; + } + if (((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + { + pixel=GetPixelOpacity(p); + if (depth_map[ScaleQuantumToMap(pixel)] > current_depth[id]) + current_depth[id]=depth_map[ScaleQuantumToMap(pixel)]; + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + pixel=GetPixelIndex(indexes+x); + if (depth_map[ScaleQuantumToMap(pixel)] > current_depth[id]) + current_depth[id]=depth_map[ScaleQuantumToMap(pixel)]; + } + p++; + } + if (current_depth[id] == MAGICKCORE_QUANTUM_DEPTH) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + depth=current_depth[0]; + for (i=1; i < (ssize_t) number_threads; i++) + if (depth < current_depth[i]) + depth=current_depth[i]; + depth_map=(size_t *) RelinquishMagickMemory(depth_map); + current_depth=(size_t *) RelinquishMagickMemory(current_depth); + return(depth); + } +#endif +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + const int + id = GetOpenMPThreadId(); + + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + continue; + indexes=GetCacheViewVirtualIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + while (current_depth[id] < MAGICKCORE_QUANTUM_DEPTH) + { + MagickBooleanType + atDepth; + + QuantumAny + range; + + atDepth=MagickTrue; + range=GetQuantumRange(current_depth[id]); + if ((atDepth != MagickFalse) && ((channel & RedChannel) != 0)) + if (IsPixelAtDepth(GetPixelRed(p),range) == MagickFalse) + atDepth=MagickFalse; + if ((atDepth != MagickFalse) && ((channel & GreenChannel) != 0)) + if (IsPixelAtDepth(GetPixelGreen(p),range) == MagickFalse) + atDepth=MagickFalse; + if ((atDepth != MagickFalse) && ((channel & BlueChannel) != 0)) + if (IsPixelAtDepth(GetPixelBlue(p),range) == MagickFalse) + atDepth=MagickFalse; + if ((atDepth != MagickFalse) && ((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + if (IsPixelAtDepth(GetPixelOpacity(p),range) == MagickFalse) + atDepth=MagickTrue; + if ((atDepth != MagickFalse) && ((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + if (IsPixelAtDepth(GetPixelIndex(indexes+x),range) == MagickFalse) + atDepth=MagickFalse; + if ((atDepth != MagickFalse)) + break; + current_depth[id]++; + } + p++; + } + if (current_depth[id] == MAGICKCORE_QUANTUM_DEPTH) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + depth=current_depth[0]; + for (i=1; i < (ssize_t) number_threads; i++) + if (depth < current_depth[i]) + depth=current_depth[i]; + current_depth=(size_t *) RelinquishMagickMemory(current_depth); + return(depth); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e Q u a n t u m D e p t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageQuantumDepth() returns the depth of the image rounded to a legal +% quantum depth: 8, 16, or 32. +% +% The format of the GetImageQuantumDepth method is: +% +% size_t GetImageQuantumDepth(const Image *image, +% const MagickBooleanType constrain) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o constrain: A value other than MagickFalse, constrains the depth to +% a maximum of MAGICKCORE_QUANTUM_DEPTH. +% +*/ +MagickExport size_t GetImageQuantumDepth(const Image *image, + const MagickBooleanType constrain) +{ + size_t + depth; + + depth=image->depth; + if (depth <= 8) + depth=8; + else + if (depth <= 16) + depth=16; + else + if (depth <= 32) + depth=32; + else + if (depth <= 64) + depth=64; + if (constrain != MagickFalse) + depth=(size_t) MagickMin((double) depth,(double) MAGICKCORE_QUANTUM_DEPTH); + return(depth); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageType() returns the potential type of image: +% +% Bilevel Grayscale GrayscaleMatte +% Palette PaletteMatte TrueColor +% TrueColorMatte ColorSeparation ColorSeparationMatte +% +% To ensure the image type matches its potential, use SetImageType(): +% +% (void) SetImageType(image,GetImageType(image)); +% +% The format of the GetImageType method is: +% +% ImageType GetImageType(const Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport ImageType GetImageType(const Image *image,ExceptionInfo *exception) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->colorspace == CMYKColorspace) + { + if (image->matte == MagickFalse) + return(ColorSeparationType); + return(ColorSeparationMatteType); + } + if (IsMonochromeImage(image,exception) != MagickFalse) + return(BilevelType); + if (IsGrayImage(image,exception) != MagickFalse) + { + if (image->matte != MagickFalse) + return(GrayscaleMatteType); + return(GrayscaleType); + } + if (IsPaletteImage(image,exception) != MagickFalse) + { + if (image->matte != MagickFalse) + return(PaletteMatteType); + return(PaletteType); + } + if (image->matte != MagickFalse) + return(TrueColorMatteType); + return(TrueColorType); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I d e n t i f y I m a g e G r a y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% either 0 or QuantumRange. Otherwise undefined is returned. +% +% The format of the IdentifyImageGray method is: +% +% ImageType IdentifyImageGray(const Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport ImageType IdentifyImageGray(const Image *image, + ExceptionInfo *exception) +{ + CacheView + *image_view; + + ImageType + type; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((image->type == BilevelType) || (image->type == GrayscaleType) || + (image->type == GrayscaleMatteType)) + return(image->type); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + return(UndefinedType); + type=BilevelType; + image_view=AcquireVirtualCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (IsPixelGray(p) == MagickFalse) + { + type=UndefinedType; + break; + } + if ((type == BilevelType) && (IsPixelMonochrome(p) == MagickFalse)) + type=GrayscaleType; + p++; + } + if (type == UndefinedType) + break; + } + image_view=DestroyCacheView(image_view); + if ((type == GrayscaleType) && (image->matte != MagickFalse)) + type=GrayscaleMatteType; + return(type); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I d e n t i f y I m a g e M o n o c h r o m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IdentifyImageMonochrome() returns MagickTrue if all the pixels in the image +% have the same red, green, and blue intensities and the intensity is either +% 0 or QuantumRange. +% +% The format of the IdentifyImageMonochrome method is: +% +% MagickBooleanType IdentifyImageMonochrome(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType IdentifyImageMonochrome(const Image *image, + ExceptionInfo *exception) +{ + CacheView + *image_view; + + ImageType + type; + + ssize_t + x; + + const PixelPacket + *p; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->type == BilevelType) + return(MagickTrue); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + return(MagickFalse); + type=BilevelType; + image_view=AcquireVirtualCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (IsPixelMonochrome(p) == MagickFalse) + { + type=UndefinedType; + break; + } + p++; + } + if (type == UndefinedType) + break; + } + image_view=DestroyCacheView(image_view); + if (type == BilevelType) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I d e n t i f y I m a g e T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IdentifyImageType() returns the potential type of image: +% +% Bilevel Grayscale GrayscaleMatte +% Palette PaletteMatte TrueColor +% TrueColorMatte ColorSeparation ColorSeparationMatte +% +% To ensure the image type matches its potential, use SetImageType(): +% +% (void) SetImageType(image,IdentifyImageType(image,exception),exception); +% +% The format of the IdentifyImageType method is: +% +% ImageType IdentifyImageType(const Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport ImageType IdentifyImageType(const Image *image, + ExceptionInfo *exception) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->colorspace == CMYKColorspace) + { + if (image->matte == MagickFalse) + return(ColorSeparationType); + return(ColorSeparationMatteType); + } + if (IdentifyImageMonochrome(image,exception) != MagickFalse) + return(BilevelType); + if (IdentifyImageGray(image,exception) != UndefinedType) + { + if (image->matte != MagickFalse) + return(GrayscaleMatteType); + return(GrayscaleType); + } + if (IdentifyPaletteImage(image,exception) != MagickFalse) + { + if (image->matte != MagickFalse) + return(PaletteMatteType); + return(PaletteType); + } + if (image->matte != MagickFalse) + return(TrueColorMatteType); + return(TrueColorType); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s G r a y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsGrayImage() returns MagickTrue if the type of the image is grayscale or +% bi-level. +% +% The format of the IsGrayImage method is: +% +% MagickBooleanType IsGrayImage(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType IsGrayImage(const Image *image, + ExceptionInfo *exception) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + magick_unreferenced(exception); + if ((image->type == BilevelType) || (image->type == GrayscaleType) || + (image->type == GrayscaleMatteType)) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s M o n o c h r o m e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsMonochromeImage() returns MagickTrue if type of the image is bi-level. +% +% The format of the IsMonochromeImage method is: +% +% MagickBooleanType IsMonochromeImage(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType IsMonochromeImage(const Image *image, + ExceptionInfo *exception) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + magick_unreferenced(exception); + if (image->type == BilevelType) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s O p a q u e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsOpaqueImage() returns MagickTrue if none of the pixels in the image have +% an opacity value other than opaque (0). +% +% The format of the IsOpaqueImage method is: +% +% MagickBooleanType IsOpaqueImage(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType IsOpaqueImage(const Image *image, + ExceptionInfo *exception) +{ + CacheView + *image_view; + + const PixelPacket + *p; + + ssize_t + x; + + ssize_t + y; + + /* + Determine if image is opaque. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->matte == MagickFalse) + return(MagickTrue); + image_view=AcquireVirtualCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelOpacity(p) != OpaqueOpacity) + break; + p++; + } + if (x < (ssize_t) image->columns) + break; + } + image_view=DestroyCacheView(image_view); + return(y < (ssize_t) image->rows ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e C h a n n e l D e p t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageChannelDepth() sets the depth of the image. +% +% The format of the SetImageChannelDepth method is: +% +% MagickBooleanType SetImageDepth(Image *image,const size_t depth) +% MagickBooleanType SetImageChannelDepth(Image *image, +% const ChannelType channel,const size_t depth) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o depth: the image depth. +% +*/ + +MagickExport MagickBooleanType SetImageDepth(Image *image, + const size_t depth) +{ + return(SetImageChannelDepth(image,CompositeChannels,depth)); +} + +MagickExport MagickBooleanType SetImageChannelDepth(Image *image, + const ChannelType channel,const size_t depth) +{ + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + QuantumAny + range; + + ssize_t + y; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + if (depth >= MAGICKCORE_QUANTUM_DEPTH) + { + image->depth=depth; + return(MagickTrue); + } + range=GetQuantumRange(depth); + if (image->storage_class == PseudoClass) + { + ssize_t + i; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (i=0; i < (ssize_t) image->colors; i++) + { + if ((channel & RedChannel) != 0) + image->colormap[i].red=ScaleAnyToQuantum(ScaleQuantumToAny( + ClampPixel((MagickRealType) image->colormap[i].red),range),range); + if ((channel & GreenChannel) != 0) + image->colormap[i].green=ScaleAnyToQuantum(ScaleQuantumToAny( + ClampPixel((MagickRealType) image->colormap[i].green),range),range); + if ((channel & BlueChannel) != 0) + image->colormap[i].blue=ScaleAnyToQuantum(ScaleQuantumToAny( + ClampPixel((MagickRealType) image->colormap[i].blue),range),range); + if ((channel & OpacityChannel) != 0) + image->colormap[i].opacity=ScaleAnyToQuantum(ScaleQuantumToAny( + ClampPixel((MagickRealType) image->colormap[i].opacity),range), + range); + } + } + status=MagickTrue; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if !defined(MAGICKCORE_HDRI_SUPPORT) +DisableMSCWarning(4127) + if (1UL*QuantumRange <= MaxMap) +RestoreMSCWarning + { + Quantum + *depth_map; + + ssize_t + i; + + /* + Scale pixels to desired (optimized with depth map). + */ + depth_map=(Quantum *) AcquireQuantumMemory(MaxMap+1,sizeof(*depth_map)); + if (depth_map == (Quantum *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + for (i=0; i <= (ssize_t) MaxMap; i++) + depth_map[i]=ScaleAnyToQuantum(ScaleQuantumToAny((Quantum) i,range), + range); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + SetPixelRed(q,depth_map[ScaleQuantumToMap(GetPixelRed(q))]); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,depth_map[ScaleQuantumToMap(GetPixelGreen(q))]); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,depth_map[ScaleQuantumToMap(GetPixelBlue(q))]); + if (((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + SetPixelOpacity(q,depth_map[ScaleQuantumToMap(GetPixelOpacity(q))]); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + { + status=MagickFalse; + continue; + } + } + image_view=DestroyCacheView(image_view); + depth_map=(Quantum *) RelinquishMagickMemory(depth_map); + if (status != MagickFalse) + image->depth=depth; + return(status); + } +#endif + /* + Scale pixels to desired depth. + */ +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + SetPixelRed(q,ScaleAnyToQuantum(ScaleQuantumToAny(ClampPixel( + (MagickRealType) GetPixelRed(q)),range),range)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ScaleAnyToQuantum(ScaleQuantumToAny(ClampPixel( + (MagickRealType) GetPixelGreen(q)),range),range)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ScaleAnyToQuantum(ScaleQuantumToAny(ClampPixel( + (MagickRealType) GetPixelBlue(q)),range),range)); + if (((channel & OpacityChannel) != 0) && (image->matte != MagickFalse)) + SetPixelOpacity(q,ScaleAnyToQuantum(ScaleQuantumToAny(ClampPixel( + (MagickRealType) GetPixelOpacity(q)),range),range)); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + { + status=MagickFalse; + continue; + } + } + image_view=DestroyCacheView(image_view); + if (status != MagickFalse) + image->depth=depth; + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageType() sets the type of image. Choose from these types: +% +% BilevelType, GrayscaleType, GrayscaleMatteType, PaletteType, +% PaletteMatteType, TrueColorType, TrueColorMatteType, +% ColorSeparationType, ColorSeparationMatteType, OptimizeType +% +% The format of the SetImageType method is: +% +% MagickBooleanType SetImageType(Image *image,const ImageType type) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o type: Image type. +% +*/ +MagickExport MagickBooleanType SetImageType(Image *image,const ImageType type) +{ + const char + *artifact; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + QuantizeInfo + *quantize_info; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + status=MagickTrue; + image_info=AcquireImageInfo(); + image_info->dither=image->dither; + artifact=GetImageArtifact(image,"dither"); + if (artifact != (const char *) NULL) + (void) SetImageOption(image_info,"dither",artifact); + switch (type) + { + case BilevelType: + { + status=TransformImageColorspace(image,GRAYColorspace); + (void) NormalizeImage(image); + quantize_info=AcquireQuantizeInfo(image_info); + quantize_info->number_colors=2; + quantize_info->colorspace=GRAYColorspace; + status=QuantizeImage(quantize_info,image); + quantize_info=DestroyQuantizeInfo(quantize_info); + image->matte=MagickFalse; + break; + } + case GrayscaleType: + { + status=TransformImageColorspace(image,GRAYColorspace); + image->matte=MagickFalse; + break; + } + case GrayscaleMatteType: + { + status=TransformImageColorspace(image,GRAYColorspace); + if (image->matte == MagickFalse) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + break; + } + case PaletteType: + { + status=TransformImageColorspace(image,sRGBColorspace); + if ((image->storage_class == DirectClass) || (image->colors > 256)) + { + quantize_info=AcquireQuantizeInfo(image_info); + quantize_info->number_colors=256; + status=QuantizeImage(quantize_info,image); + quantize_info=DestroyQuantizeInfo(quantize_info); + } + image->matte=MagickFalse; + break; + } + case PaletteBilevelMatteType: + { + status=TransformImageColorspace(image,sRGBColorspace); + if (image->matte == MagickFalse) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + (void) BilevelImageChannel(image,AlphaChannel,(double) QuantumRange/2.0); + quantize_info=AcquireQuantizeInfo(image_info); + status=QuantizeImage(quantize_info,image); + quantize_info=DestroyQuantizeInfo(quantize_info); + break; + } + case PaletteMatteType: + { + status=TransformImageColorspace(image,sRGBColorspace); + if (image->matte == MagickFalse) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + quantize_info=AcquireQuantizeInfo(image_info); + quantize_info->colorspace=TransparentColorspace; + status=QuantizeImage(quantize_info,image); + quantize_info=DestroyQuantizeInfo(quantize_info); + break; + } + case TrueColorType: + { + status=TransformImageColorspace(image,sRGBColorspace); + if (image->storage_class != DirectClass) + status=SetImageStorageClass(image,DirectClass); + image->matte=MagickFalse; + break; + } + case TrueColorMatteType: + { + status=TransformImageColorspace(image,sRGBColorspace); + if (image->storage_class != DirectClass) + status=SetImageStorageClass(image,DirectClass); + if (image->matte == MagickFalse) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + break; + } + case ColorSeparationType: + { + status=TransformImageColorspace(image,CMYKColorspace); + if (image->storage_class != DirectClass) + status=SetImageStorageClass(image,DirectClass); + image->matte=MagickFalse; + break; + } + case ColorSeparationMatteType: + { + status=TransformImageColorspace(image,CMYKColorspace); + if (image->storage_class != DirectClass) + status=SetImageStorageClass(image,DirectClass); + if (image->matte == MagickFalse) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + break; + } + case OptimizeType: + case UndefinedType: + break; + } + image_info=DestroyImageInfo(image_info); + if (status == MagickFalse) + return(MagickFalse); + image->type=type; + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/magick/attribute.h b/ImageMagick-6.9.12-44/magick/attribute.h new file mode 100644 index 0000000..73a0b6e --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/attribute.h @@ -0,0 +1,54 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore methods to set or get image attributes. +*/ +#ifndef MAGICKCORE_ATTRIBUTE_H +#define MAGICKCORE_ATTRIBUTE_H + +#include "magick/image.h" +#include "magick/exception.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport ImageType + GetImageType(const Image *,ExceptionInfo *), + IdentifyImageGray(const Image *,ExceptionInfo *), + IdentifyImageType(const Image *,ExceptionInfo *); + +extern MagickExport MagickBooleanType + IdentifyImageMonochrome(const Image *,ExceptionInfo *), + IsGrayImage(const Image *,ExceptionInfo *), + IsMonochromeImage(const Image *,ExceptionInfo *), + IsOpaqueImage(const Image *,ExceptionInfo *), + SetImageChannelDepth(Image *,const ChannelType,const size_t), + SetImageDepth(Image *,const size_t), + SetImageType(Image *,const ImageType); + +extern MagickExport RectangleInfo + GetImageBoundingBox(const Image *,ExceptionInfo *exception); + +extern MagickExport size_t + GetImageChannelDepth(const Image *,const ChannelType,ExceptionInfo *), + GetImageDepth(const Image *,ExceptionInfo *), + GetImageQuantumDepth(const Image *,const MagickBooleanType); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/blob-private.h b/ImageMagick-6.9.12-44/magick/blob-private.h new file mode 100644 index 0000000..f138e4c --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/blob-private.h @@ -0,0 +1,156 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore Binary Large OBjects private methods. +*/ +#ifndef MAGICKCORE_BLOB_PRIVATE_H +#define MAGICKCORE_BLOB_PRIVATE_H + +#include "magick/image.h" +#include "magick/stream.h" +#include "magick/nt-base-private.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define MagickMinBlobExtent 32767L +#if defined(MAGICKCORE_HAVE_FSEEKO) +# define fseek fseeko +# define ftell ftello +#endif + +typedef enum +{ + UndefinedBlobMode, + ReadBlobMode, + ReadBinaryBlobMode, + WriteBlobMode, + WriteBinaryBlobMode, + AppendBlobMode, + AppendBinaryBlobMode +} BlobMode; + +typedef enum +{ + UndefinedStream, + FileStream, + StandardStream, + PipeStream, + ZipStream, + BZipStream, + FifoStream, + BlobStream +} StreamType; + +typedef int + *(*BlobFifo)(const Image *,const void *,const size_t); + +extern MagickExport BlobInfo + *CloneBlobInfo(const BlobInfo *), + *ReferenceBlob(BlobInfo *); + +extern MagickExport char + *ReadBlobString(Image *,char *); + +extern MagickExport const struct stat + *GetBlobProperties(const Image *); + +extern MagickExport const void + *ReadBlobStream(Image *,const size_t,void *magick_restrict,ssize_t *) + magick_hot_spot; + +extern MagickExport double + ReadBlobDouble(Image *); + +extern MagickExport float + ReadBlobFloat(Image *); + +extern MagickExport int + EOFBlob(const Image *), + ErrorBlob(const Image *), + ReadBlobByte(Image *); + +extern MagickExport MagickBooleanType + CloseBlob(Image *), + DiscardBlobBytes(Image *,const MagickSizeType), + OpenBlob(const ImageInfo *,Image *,const BlobMode,ExceptionInfo *), + SetBlobExtent(Image *,const MagickSizeType), + UnmapBlob(void *,const size_t); + +extern MagickExport MagickOffsetType + SeekBlob(Image *,const MagickOffsetType,const int), + TellBlob(const Image *); + +extern MagickExport MagickSizeType + ReadBlobLongLong(Image *), + ReadBlobMSBLongLong(Image *); + +extern MagickExport signed int + ReadBlobLSBSignedLong(Image *), + ReadBlobMSBSignedLong(Image *), + ReadBlobSignedLong(Image *); + +extern MagickExport signed short + ReadBlobLSBSignedShort(Image *), + ReadBlobMSBSignedShort(Image *), + ReadBlobSignedShort(Image *); + +extern MagickExport ssize_t + ReadBlob(Image *,const size_t,unsigned char *), + WriteBlob(Image *,const size_t,const unsigned char *), + WriteBlobByte(Image *,const unsigned char), + WriteBlobFloat(Image *,const float), + WriteBlobLong(Image *,const unsigned int), + WriteBlobShort(Image *,const unsigned short), + WriteBlobLSBLong(Image *,const unsigned int), + WriteBlobLSBShort(Image *,const unsigned short), + WriteBlobLSBSignedLong(Image *,const signed int), + WriteBlobLSBSignedShort(Image *,const signed short), + WriteBlobMSBLong(Image *,const unsigned int), + WriteBlobMSBLongLong(Image *,const MagickSizeType), + WriteBlobMSBShort(Image *,const unsigned short), + WriteBlobMSBSignedLong(Image *,const signed int), + WriteBlobMSBSignedShort(Image *,const signed short), + WriteBlobString(Image *,const char *); + +extern MagickExport unsigned char + *DetachBlob(BlobInfo *), + *MapBlob(int,const MapMode,const MagickOffsetType,const size_t); + +extern MagickExport unsigned int + ReadBlobLong(Image *), + ReadBlobLSBLong(Image *), + ReadBlobMSBLong(Image *); + +extern MagickExport unsigned short + ReadBlobShort(Image *), + ReadBlobLSBShort(Image *), + ReadBlobMSBShort(Image *); + +extern MagickExport void + AttachBlob(BlobInfo *,const void *,const size_t), + GetBlobInfo(BlobInfo *), + MSBOrderLong(unsigned char *,const size_t), + MSBOrderShort(unsigned char *,const size_t); + +extern MagickPrivate void + DisassociateBlob(Image *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/blob.c b/ImageMagick-6.9.12-44/magick/blob.c new file mode 100644 index 0000000..c878558 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/blob.c @@ -0,0 +1,5619 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% BBBB L OOO BBBB % +% B B L O O B B % +% BBBB L O O BBBB % +% B B L O O B B % +% BBBB LLLLL OOO BBBB % +% % +% % +% MagickCore Binary Large OBjectS Methods % +% % +% Software Design % +% Cristy % +% July 1999 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#ifdef __VMS +#include +#include +#endif +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/client.h" +#include "magick/constitute.h" +#include "magick/delegate.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/locale_.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/nt-base-private.h" +#include "magick/option.h" +#include "magick/policy.h" +#include "magick/resource_.h" +#include "magick/semaphore.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/timer-private.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/utility-private.h" +#if defined(MAGICKCORE_ZLIB_DELEGATE) +#include "zlib.h" +#endif +#if defined(MAGICKCORE_BZLIB_DELEGATE) +#include "bzlib.h" +#endif + +/* + Define declarations. +*/ +#define MagickMaxBlobExtent 65541 +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +# define MAP_ANONYMOUS MAP_ANON +#endif +#if !defined(MAP_FAILED) +#define MAP_FAILED ((void *) -1) +#endif +#if defined(__OS2__) +#include +#define _O_BINARY O_BINARY +#endif + +/* + Typedef declarations. +*/ +typedef union FileInfo +{ + FILE + *file; + +#if defined(MAGICKCORE_ZLIB_DELEGATE) + gzFile + gzfile; +#endif + +#if defined(MAGICKCORE_BZLIB_DELEGATE) + BZFILE + *bzfile; +#endif +} FileInfo; + +struct _BlobInfo +{ + size_t + length, + extent, + quantum; + + BlobMode + mode; + + MagickBooleanType + mapped, + eof; + + int + error, + error_number; + + MagickOffsetType + offset; + + MagickSizeType + size; + + MagickBooleanType + exempt, + synchronize, + status, + temporary; + + StreamType + type; + + FileInfo + file_info; + + struct stat + properties; + + StreamHandler + stream; + + unsigned char + *data; + + MagickBooleanType + debug; + + SemaphoreInfo + *semaphore; + + ssize_t + reference_count; + + size_t + signature; +}; + +/* + Forward declarations. +*/ +static int + SyncBlob(Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A t t a c h B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AttachBlob() attaches a blob to the BlobInfo structure. +% +% The format of the AttachBlob method is: +% +% void AttachBlob(BlobInfo *blob_info,const void *blob,const size_t length) +% +% A description of each parameter follows: +% +% o blob_info: Specifies a pointer to a BlobInfo structure. +% +% o blob: the address of a character stream in one of the image formats +% understood by ImageMagick. +% +% o length: This size_t integer reflects the length in bytes of the blob. +% +*/ +MagickExport void AttachBlob(BlobInfo *blob_info,const void *blob, + const size_t length) +{ + assert(blob_info != (BlobInfo *) NULL); + if (blob_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + blob_info->length=length; + blob_info->extent=length; + blob_info->quantum=(size_t) MagickMaxBlobExtent; + blob_info->offset=0; + blob_info->type=BlobStream; + blob_info->file_info.file=(FILE *) NULL; + blob_info->data=(unsigned char *) blob; + blob_info->mapped=MagickFalse; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ B l o b T o F i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% BlobToFile() writes a blob to a file. It returns MagickFalse if an error +% occurs otherwise MagickTrue. +% +% The format of the BlobToFile method is: +% +% MagickBooleanType BlobToFile(char *filename,const void *blob, +% const size_t length,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o filename: Write the blob to this file. +% +% o blob: the address of a blob. +% +% o length: This length in bytes of the blob. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType BlobToFile(char *filename,const void *blob, + const size_t length,ExceptionInfo *exception) +{ + int + file; + + size_t + i; + + ssize_t + count; + + assert(filename != (const char *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename); + assert(blob != (const void *) NULL); + if (*filename == '\0') + file=AcquireUniqueFileResource(filename); + else + file=open_utf8(filename,O_RDWR | O_CREAT | O_EXCL | O_BINARY,S_MODE); + if (file == -1) + { + ThrowFileException(exception,BlobError,"UnableToWriteBlob",filename); + return(MagickFalse); + } + for (i=0; i < length; i+=count) + { + count=write(file,(const char *) blob+i,MagickMin(length-i,(size_t) + MAGICK_SSIZE_MAX)); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + file=close(file); + if ((file == -1) || (i < length)) + { + ThrowFileException(exception,BlobError,"UnableToWriteBlob",filename); + return(MagickFalse); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% B l o b T o I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% BlobToImage() implements direct to memory image formats. It returns the +% blob as an image. +% +% The format of the BlobToImage method is: +% +% Image *BlobToImage(const ImageInfo *image_info,const void *blob, +% const size_t length,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o blob: the address of a character stream in one of the image formats +% understood by ImageMagick. +% +% o length: This size_t integer reflects the length in bytes of the blob. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *BlobToImage(const ImageInfo *image_info,const void *blob, + const size_t length,ExceptionInfo *exception) +{ + const MagickInfo + *magick_info; + + Image + *image; + + ImageInfo + *blob_info, + *clone_info; + + MagickBooleanType + status; + + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + if ((blob == (const void *) NULL) || (length == 0)) + { + (void) ThrowMagickException(exception,GetMagickModule(),BlobError, + "ZeroLengthBlobNotPermitted","`%s'",image_info->filename); + return((Image *) NULL); + } + blob_info=CloneImageInfo(image_info); + blob_info->blob=(void *) blob; + blob_info->length=length; + if (*blob_info->magick == '\0') + (void) SetImageInfo(blob_info,0,exception); + magick_info=GetMagickInfo(blob_info->magick,exception); + if (magick_info == (const MagickInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + MissingDelegateError,"NoDecodeDelegateForThisImageFormat","`%s'", + blob_info->magick); + blob_info=DestroyImageInfo(blob_info); + return((Image *) NULL); + } + if (GetMagickBlobSupport(magick_info) != MagickFalse) + { + char + filename[MagickPathExtent]; + + /* + Native blob support for this image format. + */ + (void) CopyMagickString(filename,blob_info->filename,MagickPathExtent); + (void) FormatLocaleString(blob_info->filename,MaxTextExtent,"%s:%s", + blob_info->magick,filename); + image=ReadImage(blob_info,exception); + if (image != (Image *) NULL) + (void) DetachBlob(image->blob); + blob_info=DestroyImageInfo(blob_info); + return(image); + } + /* + Write blob to a temporary file on disk. + */ + blob_info->blob=(void *) NULL; + blob_info->length=0; + *blob_info->filename='\0'; + status=BlobToFile(blob_info->filename,blob,length,exception); + if (status == MagickFalse) + { + (void) RelinquishUniqueFileResource(blob_info->filename); + blob_info=DestroyImageInfo(blob_info); + return((Image *) NULL); + } + clone_info=CloneImageInfo(blob_info); + (void) FormatLocaleString(clone_info->filename,MaxTextExtent,"%s:%s", + blob_info->magick,blob_info->filename); + image=ReadImage(clone_info,exception); + if (image != (Image *) NULL) + { + Image + *images; + + /* + Restore original filenames and image format. + */ + for (images=GetFirstImageInList(image); images != (Image *) NULL; ) + { + (void) CopyMagickString(images->filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(images->magick_filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(images->magick,magick_info->name,MaxTextExtent); + images=GetNextImageInList(images); + } + } + clone_info=DestroyImageInfo(clone_info); + (void) RelinquishUniqueFileResource(blob_info->filename); + blob_info=DestroyImageInfo(blob_info); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C l o n e B l o b I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneBlobInfo() makes a duplicate of the given blob info structure, or if +% blob info is NULL, a new one. +% +% The format of the CloneBlobInfo method is: +% +% BlobInfo *CloneBlobInfo(const BlobInfo *blob_info) +% +% A description of each parameter follows: +% +% o blob_info: the blob info. +% +*/ +MagickExport BlobInfo *CloneBlobInfo(const BlobInfo *blob_info) +{ + BlobInfo + *clone_info; + + SemaphoreInfo + *semaphore; + + clone_info=(BlobInfo *) AcquireMagickMemory(sizeof(*clone_info)); + GetBlobInfo(clone_info); + if (blob_info == (BlobInfo *) NULL) + return(clone_info); + semaphore=clone_info->semaphore; + (void) memcpy(clone_info,blob_info,sizeof(*clone_info)); + if (blob_info->mapped != MagickFalse) + (void) AcquireMagickResource(MapResource,blob_info->length); + clone_info->semaphore=semaphore; + LockSemaphoreInfo(clone_info->semaphore); + clone_info->reference_count=1; + UnlockSemaphoreInfo(clone_info->semaphore); + return(clone_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C l o s e B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloseBlob() closes a stream associated with the image. +% +% The format of the CloseBlob method is: +% +% MagickBooleanType CloseBlob(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ + +static inline void ThrowBlobException(BlobInfo *blob_info) +{ + if ((blob_info->status == MagickFalse) && (errno != 0)) + blob_info->error_number=errno; + blob_info->status=MagickTrue; +} + +MagickExport MagickBooleanType CloseBlob(Image *image) +{ + BlobInfo + *magick_restrict blob_info; + + int + status; + + /* + Close image file. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + blob_info=image->blob; + if ((blob_info == (BlobInfo *) NULL) || (blob_info->type == UndefinedStream)) + return(MagickTrue); + status=SyncBlob(image); + switch (blob_info->type) + { + case UndefinedStream: + case StandardStream: + break; + case FileStream: + case PipeStream: + { + if (blob_info->synchronize != MagickFalse) + { + status=fflush(blob_info->file_info.file); + if (status != 0) + ThrowBlobException(blob_info); + status=fsync(fileno(blob_info->file_info.file)); + if (status != 0) + ThrowBlobException(blob_info); + } + if ((status != 0) && (ferror(blob_info->file_info.file) != 0)) + ThrowBlobException(blob_info); + break; + } + case ZipStream: + { +#if defined(MAGICKCORE_ZLIB_DELEGATE) + status=Z_OK; + (void) gzerror(blob_info->file_info.gzfile,&status); + if (status != Z_OK) + ThrowBlobException(blob_info); +#endif + break; + } + case BZipStream: + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + status=BZ_OK; + (void) BZ2_bzerror(blob_info->file_info.bzfile,&status); + if (status != BZ_OK) + ThrowBlobException(blob_info); +#endif + break; + } + case FifoStream: + break; + case BlobStream: + { + if (blob_info->file_info.file != (FILE *) NULL) + { + if (blob_info->synchronize != MagickFalse) + { + status=fflush(blob_info->file_info.file); + if (status != 0) + ThrowBlobException(blob_info); + status=fsync(fileno(blob_info->file_info.file)); + if (status != 0) + ThrowBlobException(blob_info); + } + if ((status != 0) && (ferror(blob_info->file_info.file) != 0)) + ThrowBlobException(blob_info); + } + break; + } + } + blob_info->size=GetBlobSize(image); + image->extent=blob_info->size; + blob_info->eof=MagickFalse; + blob_info->error=0; + if (blob_info->exempt != MagickFalse) + { + blob_info->type=UndefinedStream; + return(blob_info->status); + } + switch (blob_info->type) + { + case UndefinedStream: + case StandardStream: + break; + case FileStream: + { + if (fileno(blob_info->file_info.file) != -1) + { + status=fclose(blob_info->file_info.file); + if (status != 0) + ThrowBlobException(blob_info); + } + break; + } + case PipeStream: + { +#if defined(MAGICKCORE_HAVE_PCLOSE) + status=pclose(blob_info->file_info.file); + if (status != 0) + ThrowBlobException(blob_info); +#endif + break; + } + case ZipStream: + { +#if defined(MAGICKCORE_ZLIB_DELEGATE) + status=gzclose(blob_info->file_info.gzfile); + if (status != Z_OK) + ThrowBlobException(blob_info); +#endif + break; + } + case BZipStream: + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + BZ2_bzclose(blob_info->file_info.bzfile); +#endif + break; + } + case FifoStream: + break; + case BlobStream: + { + if (blob_info->file_info.file != (FILE *) NULL) + { + status=fclose(blob_info->file_info.file); + if (status != 0) + ThrowBlobException(blob_info); + } + break; + } + } + (void) DetachBlob(blob_info); + return(blob_info->status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e s t r o y B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyBlob() deallocates memory associated with a blob. +% +% The format of the DestroyBlob method is: +% +% void DestroyBlob(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport void DestroyBlob(Image *image) +{ + BlobInfo + *magick_restrict blob_info; + + MagickBooleanType + destroy; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->signature == MagickCoreSignature); + blob_info=image->blob; + destroy=MagickFalse; + LockSemaphoreInfo(blob_info->semaphore); + blob_info->reference_count--; + assert(blob_info->reference_count >= 0); + if (blob_info->reference_count == 0) + destroy=MagickTrue; + UnlockSemaphoreInfo(blob_info->semaphore); + if (destroy == MagickFalse) + { + image->blob=(BlobInfo *) NULL; + return; + } + (void) CloseBlob(image); + if (blob_info->mapped != MagickFalse) + { + (void) UnmapBlob(blob_info->data,blob_info->length); + RelinquishMagickResource(MapResource,blob_info->length); + } + if (blob_info->semaphore != (SemaphoreInfo *) NULL) + DestroySemaphoreInfo(&blob_info->semaphore); + blob_info->signature=(~MagickCoreSignature); + image->blob=(BlobInfo *) RelinquishMagickMemory(blob_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e t a c h B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DetachBlob() detaches a blob from the BlobInfo structure. +% +% The format of the DetachBlob method is: +% +% unsigned char *DetachBlob(BlobInfo *blob_info) +% +% A description of each parameter follows: +% +% o blob_info: Specifies a pointer to a BlobInfo structure. +% +*/ +MagickExport unsigned char *DetachBlob(BlobInfo *blob_info) +{ + unsigned char + *data; + + assert(blob_info != (BlobInfo *) NULL); + if (blob_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + if (blob_info->mapped != MagickFalse) + { + (void) UnmapBlob(blob_info->data,blob_info->length); + blob_info->data=NULL; + RelinquishMagickResource(MapResource,blob_info->length); + } + blob_info->mapped=MagickFalse; + blob_info->length=0; + blob_info->offset=0; + blob_info->eof=MagickFalse; + blob_info->error=0; + blob_info->exempt=MagickFalse; + blob_info->type=UndefinedStream; + blob_info->file_info.file=(FILE *) NULL; + data=blob_info->data; + blob_info->data=(unsigned char *) NULL; + blob_info->stream=(StreamHandler) NULL; + return(data); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D i s a s s o c i a t e B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DisassociateBlob() disassociates the image stream. It checks if the +% blob of the specified image is referenced by other images. If the reference +% count is higher then 1 a new blob is assigned to the specified image. +% +% The format of the DisassociateBlob method is: +% +% void DisassociateBlob(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickPrivate void DisassociateBlob(Image *image) +{ + BlobInfo + *magick_restrict blob_info, + *clone_info; + + MagickBooleanType + clone; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->signature == MagickCoreSignature); + blob_info=image->blob; + clone=MagickFalse; + LockSemaphoreInfo(blob_info->semaphore); + assert(blob_info->reference_count >= 0); + if (blob_info->reference_count > 1) + clone=MagickTrue; + UnlockSemaphoreInfo(blob_info->semaphore); + if (clone == MagickFalse) + return; + clone_info=CloneBlobInfo(blob_info); + DestroyBlob(image); + image->blob=clone_info; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D i s c a r d B l o b B y t e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DiscardBlobBytes() discards bytes in a blob. +% +% The format of the DiscardBlobBytes method is: +% +% MagickBooleanType DiscardBlobBytes(Image *image, +% const MagickSizeType length) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o length: the number of bytes to skip. +% +*/ +MagickExport MagickBooleanType DiscardBlobBytes(Image *image, + const MagickSizeType length) +{ + MagickOffsetType + i; + + size_t + quantum; + + ssize_t + count; + + unsigned char + buffer[MagickMinBufferExtent >> 1]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (length != (MagickSizeType) ((MagickOffsetType) length)) + return(MagickFalse); + count=0; + for (i=0; i < (MagickOffsetType) length; i+=count) + { + quantum=(size_t) MagickMin(length-i,sizeof(buffer)); + (void) ReadBlobStream(image,quantum,buffer,&count); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + return(i < (MagickOffsetType) length ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D u p l i c a t e s B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DuplicateBlob() duplicates a blob descriptor. +% +% The format of the DuplicateBlob method is: +% +% void DuplicateBlob(Image *image,const Image *duplicate) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o duplicate: the duplicate image. +% +*/ +MagickExport void DuplicateBlob(Image *image,const Image *duplicate) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(duplicate != (Image *) NULL); + assert(duplicate->signature == MagickCoreSignature); + DestroyBlob(image); + image->blob=ReferenceBlob(duplicate->blob); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ E O F B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EOFBlob() returns a non-zero value when EOF has been detected reading from +% a blob or file. +% +% The format of the EOFBlob method is: +% +% int EOFBlob(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport int EOFBlob(const Image *image) +{ + BlobInfo + *magick_restrict blob_info; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + blob_info=image->blob; + switch (blob_info->type) + { + case UndefinedStream: + case StandardStream: + break; + case FileStream: + case PipeStream: + { + blob_info->eof=feof(blob_info->file_info.file) != 0 ? MagickTrue : + MagickFalse; + break; + } + case ZipStream: + { +#if defined(MAGICKCORE_ZLIB_DELEGATE) + blob_info->eof=gzeof(blob_info->file_info.gzfile) != 0 ? MagickTrue : + MagickFalse; +#endif + break; + } + case BZipStream: + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + int + status; + + status=0; + (void) BZ2_bzerror(blob_info->file_info.bzfile,&status); + blob_info->eof=status == BZ_UNEXPECTED_EOF ? MagickTrue : MagickFalse; +#endif + break; + } + case FifoStream: + { + blob_info->eof=MagickFalse; + break; + } + case BlobStream: + break; + } + return((int) blob_info->eof); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ E r r o r B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ErrorBlob() returns a non-zero value when an error has been detected reading +% from a blob or file. +% +% The format of the ErrorBlob method is: +% +% int ErrorBlob(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport int ErrorBlob(const Image *image) +{ + BlobInfo + *magick_restrict blob_info; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + blob_info=image->blob; + switch (blob_info->type) + { + case UndefinedStream: + case StandardStream: + break; + case FileStream: + case PipeStream: + { + blob_info->error=ferror(blob_info->file_info.file); + break; + } + case ZipStream: + { +#if defined(MAGICKCORE_ZLIB_DELEGATE) + (void) gzerror(blob_info->file_info.gzfile,&blob_info->error); +#endif + break; + } + case BZipStream: + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + (void) BZ2_bzerror(blob_info->file_info.bzfile,&blob_info->error); +#endif + break; + } + case FifoStream: + { + blob_info->error=0; + break; + } + case BlobStream: + break; + } + return(blob_info->error); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% F i l e T o B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FileToBlob() returns the contents of a file as a buffer terminated with +% the '\0' character. The length of the buffer (not including the extra +% terminating '\0' character) is returned via the 'length' parameter. Free +% the buffer with RelinquishMagickMemory(). +% +% The format of the FileToBlob method is: +% +% unsigned char *FileToBlob(const char *filename,const size_t extent, +% size_t *length,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o blob: FileToBlob() returns the contents of a file as a blob. If +% an error occurs NULL is returned. +% +% o filename: the filename. +% +% o extent: The maximum length of the blob. +% +% o length: On return, this reflects the actual length of the blob. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport unsigned char *FileToBlob(const char *filename,const size_t extent, + size_t *length,ExceptionInfo *exception) +{ + int + file; + + MagickBooleanType + status; + + MagickOffsetType + offset; + + size_t + i; + + ssize_t + count; + + struct stat + attributes; + + unsigned char + *blob; + + void + *map; + + assert(filename != (const char *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename); + assert(exception != (ExceptionInfo *) NULL); + *length=0; + status=IsRightsAuthorized(PathPolicyDomain,ReadPolicyRights,filename); + if (status == MagickFalse) + { + errno=EPERM; + (void) ThrowMagickException(exception,GetMagickModule(),PolicyError, + "NotAuthorized","`%s'",filename); + return(NULL); + } + file=fileno(stdin); + if (LocaleCompare(filename,"-") != 0) + { + status=GetPathAttributes(filename,&attributes); + if ((status == MagickFalse) || (S_ISDIR(attributes.st_mode) != 0)) + { + ThrowFileException(exception,BlobError,"UnableToReadBlob",filename); + return(NULL); + } + file=open_utf8(filename,O_RDONLY | O_BINARY,0); + } + if (file == -1) + { + ThrowFileException(exception,BlobError,"UnableToOpenFile",filename); + return((unsigned char *) NULL); + } + offset=(MagickOffsetType) lseek(file,0,SEEK_END); + count=0; + if ((file == fileno(stdin)) || (offset < 0) || + (offset != (MagickOffsetType) ((ssize_t) offset))) + { + size_t + quantum; + + struct stat + file_stats; + + /* + Stream is not seekable. + */ + offset=(MagickOffsetType) lseek(file,0,SEEK_SET); + quantum=(size_t) MagickMaxBufferExtent; + if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0)) + quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent); + blob=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*blob)); + for (i=0; blob != (unsigned char *) NULL; i+=count) + { + count=read(file,blob+i,quantum); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + if (~((size_t) i) < (quantum+1)) + { + blob=(unsigned char *) RelinquishMagickMemory(blob); + break; + } + blob=(unsigned char *) ResizeQuantumMemory(blob,i+quantum+1, + sizeof(*blob)); + if ((size_t) (i+count) >= extent) + break; + } + if (LocaleCompare(filename,"-") != 0) + file=close(file); + if (blob == (unsigned char *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",filename); + return((unsigned char *) NULL); + } + if (file == -1) + { + blob=(unsigned char *) RelinquishMagickMemory(blob); + ThrowFileException(exception,BlobError,"UnableToReadBlob",filename); + return((unsigned char *) NULL); + } + *length=(size_t) MagickMin(i+count,extent); + blob[*length]='\0'; + return(blob); + } + *length=(size_t) MagickMin(offset,(MagickOffsetType) + MagickMin(extent,MAGICK_SSIZE_MAX)); + blob=(unsigned char *) NULL; + if (~(*length) >= (MaxTextExtent-1)) + blob=(unsigned char *) AcquireQuantumMemory(*length+MaxTextExtent, + sizeof(*blob)); + if (blob == (unsigned char *) NULL) + { + file=close(file); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",filename); + return((unsigned char *) NULL); + } + map=MapBlob(file,ReadMode,0,*length); + if (map != (unsigned char *) NULL) + { + (void) memcpy(blob,map,*length); + (void) UnmapBlob(map,*length); + } + else + { + (void) lseek(file,0,SEEK_SET); + for (i=0; i < *length; i+=count) + { + count=read(file,blob+i,MagickMin(*length-i,(size_t) MAGICK_SSIZE_MAX)); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + if (i < *length) + { + file=close(file)-1; + blob=(unsigned char *) RelinquishMagickMemory(blob); + ThrowFileException(exception,BlobError,"UnableToReadBlob",filename); + return((unsigned char *) NULL); + } + } + blob[*length]='\0'; + if (LocaleCompare(filename,"-") != 0) + file=close(file); + if (file == -1) + { + blob=(unsigned char *) RelinquishMagickMemory(blob); + ThrowFileException(exception,BlobError,"UnableToReadBlob",filename); + } + return(blob); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% F i l e T o I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FileToImage() write the contents of a file to an image. +% +% The format of the FileToImage method is: +% +% MagickBooleanType FileToImage(Image *,const char *filename) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o filename: the filename. +% +*/ + +static inline ssize_t WriteBlobStream(Image *image,const size_t length, + const unsigned char *magick_restrict data) +{ + BlobInfo + *magick_restrict blob_info; + + MagickSizeType + extent; + + unsigned char + *magick_restrict q; + + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + assert(data != (void *) NULL); + blob_info=image->blob; + if (blob_info->type != BlobStream) + return(WriteBlob(image,length,data)); + extent=(MagickSizeType) (blob_info->offset+(MagickOffsetType) length); + if (extent >= blob_info->extent) + { + extent=blob_info->extent+blob_info->quantum+length; + blob_info->quantum<<=1; + if (SetBlobExtent(image,extent) == MagickFalse) + return(0); + } + q=blob_info->data+blob_info->offset; + (void) memcpy(q,data,length); + blob_info->offset+=length; + if (blob_info->offset >= (MagickOffsetType) blob_info->length) + blob_info->length=(size_t) blob_info->offset; + return((ssize_t) length); +} + +MagickExport MagickBooleanType FileToImage(Image *image,const char *filename) +{ + int + file; + + MagickBooleanType + status; + + size_t + length, + quantum; + + ssize_t + count; + + struct stat + file_stats; + + unsigned char + *blob; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(filename != (const char *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename); + status=IsRightsAuthorized(PathPolicyDomain,WritePolicyRights,filename); + if (status == MagickFalse) + { + errno=EPERM; + (void) ThrowMagickException(&image->exception,GetMagickModule(), + PolicyError,"NotAuthorized","`%s'",filename); + return(MagickFalse); + } + file=fileno(stdin); + if (LocaleCompare(filename,"-") != 0) + file=open_utf8(filename,O_RDONLY | O_BINARY,0); + if (file == -1) + { + ThrowFileException(&image->exception,BlobError,"UnableToOpenBlob", + filename); + return(MagickFalse); + } + quantum=(size_t) MagickMaxBufferExtent; + if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0)) + quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent); + blob=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*blob)); + if (blob == (unsigned char *) NULL) + { + file=close(file); + ThrowFileException(&image->exception,ResourceLimitError, + "MemoryAllocationFailed",filename); + return(MagickFalse); + } + for ( ; ; ) + { + count=read(file,blob,quantum); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + length=(size_t) count; + count=WriteBlobStream(image,length,blob); + if (count != (ssize_t) length) + { + ThrowFileException(&image->exception,BlobError,"UnableToWriteBlob", + filename); + break; + } + } + file=close(file); + if (file == -1) + ThrowFileException(&image->exception,BlobError,"UnableToWriteBlob", + filename); + blob=(unsigned char *) RelinquishMagickMemory(blob); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t B l o b E r r o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetBlobError() returns MagickTrue if the blob associated with the specified +% image encountered an error. +% +% The format of the GetBlobError method is: +% +% MagickBooleanType GetBlobError(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType GetBlobError(const Image *image) +{ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((image->blob->status != MagickFalse) && (image->blob->error_number != 0)) + errno=image->blob->error_number; + return(image->blob->status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t B l o b F i l e H a n d l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetBlobFileHandle() returns the file handle associated with the image blob. +% +% The format of the GetBlobFile method is: +% +% FILE *GetBlobFileHandle(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport FILE *GetBlobFileHandle(const Image *image) +{ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + return(image->blob->file_info.file); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t B l o b I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetBlobInfo() initializes the BlobInfo structure. +% +% The format of the GetBlobInfo method is: +% +% void GetBlobInfo(BlobInfo *blob_info) +% +% A description of each parameter follows: +% +% o blob_info: Specifies a pointer to a BlobInfo structure. +% +*/ +MagickExport void GetBlobInfo(BlobInfo *blob_info) +{ + assert(blob_info != (BlobInfo *) NULL); + (void) memset(blob_info,0,sizeof(*blob_info)); + blob_info->type=UndefinedStream; + blob_info->quantum=(size_t) MagickMaxBlobExtent; + blob_info->properties.st_mtime=GetMagickTime(); + blob_info->properties.st_ctime=blob_info->properties.st_mtime; + blob_info->debug=IsEventLogging(); + blob_info->reference_count=1; + blob_info->semaphore=AllocateSemaphoreInfo(); + blob_info->signature=MagickCoreSignature; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t B l o b P r o p e r t i e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetBlobProperties() returns information about an image blob. +% +% The format of the GetBlobProperties method is: +% +% const struct stat *GetBlobProperties(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport const struct stat *GetBlobProperties(const Image *image) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + return(&image->blob->properties); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t B l o b S i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetBlobSize() returns the current length of the image file or blob; zero is +% returned if the size cannot be determined. +% +% The format of the GetBlobSize method is: +% +% MagickSizeType GetBlobSize(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickSizeType GetBlobSize(const Image *image) +{ + BlobInfo + *magick_restrict blob_info; + + MagickSizeType + extent; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->blob != (BlobInfo *) NULL); + blob_info=image->blob; + extent=0; + switch (blob_info->type) + { + case UndefinedStream: + case StandardStream: + { + extent=blob_info->size; + break; + } + case FileStream: + { + int + file_descriptor; + + extent=(MagickSizeType) blob_info->properties.st_size; + if (extent == 0) + extent=blob_info->size; + file_descriptor=fileno(blob_info->file_info.file); + if (file_descriptor == -1) + break; + if (fstat(file_descriptor,&blob_info->properties) == 0) + extent=(MagickSizeType) blob_info->properties.st_size; + break; + } + case PipeStream: + { + extent=blob_info->size; + break; + } + case ZipStream: + case BZipStream: + { + MagickBooleanType + status; + + status=GetPathAttributes(image->filename,&blob_info->properties); + if (status != MagickFalse) + extent=(MagickSizeType) blob_info->properties.st_size; + break; + } + case FifoStream: + break; + case BlobStream: + { + extent=(MagickSizeType) blob_info->length; + break; + } + } + return(extent); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t B l o b S t r e a m D a t a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetBlobStreamData() returns the stream data for the image. +% +% The format of the GetBlobStreamData method is: +% +% unsigned char *GetBlobStreamData(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport unsigned char *GetBlobStreamData(const Image *image) +{ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + return(image->blob->data); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t B l o b S t r e a m H a n d l e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetBlobStreamHandler() returns the stream handler for the image. +% +% The format of the GetBlobStreamHandler method is: +% +% StreamHandler GetBlobStreamHandler(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport StreamHandler GetBlobStreamHandler(const Image *image) +{ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + return(image->blob->stream); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I m a g e T o B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ImageToBlob() implements direct to memory image formats. It returns the +% image as a formatted blob and its length. The magick member of the Image +% structure determines the format of the returned blob (GIF, JPEG, PNG, +% etc.). This method is the equivalent of WriteImage(), but writes the +% formatted "file" to a memory buffer rather than to an actual file. +% +% The format of the ImageToBlob method is: +% +% unsigned char *ImageToBlob(const ImageInfo *image_info,Image *image, +% size_t *length,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the image. +% +% o length: return the actual length of the blob. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport unsigned char *ImageToBlob(const ImageInfo *image_info, + Image *image,size_t *length,ExceptionInfo *exception) +{ + const MagickInfo + *magick_info; + + ImageInfo + *blob_info; + + MagickBooleanType + status; + + unsigned char + *blob; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(exception != (ExceptionInfo *) NULL); + *length=0; + blob=(unsigned char *) NULL; + blob_info=CloneImageInfo(image_info); + blob_info->adjoin=MagickFalse; + (void) SetImageInfo(blob_info,1,exception); + if (*blob_info->magick != '\0') + (void) CopyMagickString(image->magick,blob_info->magick,MaxTextExtent); + magick_info=GetMagickInfo(image->magick,exception); + if (magick_info == (const MagickInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + MissingDelegateError,"NoDecodeDelegateForThisImageFormat","`%s'", + image->magick); + blob_info=DestroyImageInfo(blob_info); + return(blob); + } + (void) CopyMagickString(blob_info->magick,image->magick,MaxTextExtent); + if (GetMagickBlobSupport(magick_info) != MagickFalse) + { + /* + Native blob support for this image format. + */ + blob_info->length=0; + blob_info->blob=AcquireQuantumMemory(MagickMaxBlobExtent, + sizeof(unsigned char)); + if (blob_info->blob == (void *) NULL) + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + else + { + (void) CloseBlob(image); + image->blob->exempt=MagickTrue; + *image->filename='\0'; + status=WriteImage(blob_info,image); + InheritException(exception,&image->exception); + *length=image->blob->length; + blob=DetachBlob(image->blob); + if (blob == (unsigned char *) NULL) + blob_info->blob=RelinquishMagickMemory(blob_info->blob); + else if (status == MagickFalse) + blob=(unsigned char *) RelinquishMagickMemory(blob); + else + blob=(unsigned char *) ResizeQuantumMemory(blob,*length+1, + sizeof(*blob)); + } + } + else + { + char + unique[MaxTextExtent]; + + int + file; + + /* + Write file to disk in blob image format. + */ + file=AcquireUniqueFileResource(unique); + if (file == -1) + { + ThrowFileException(exception,BlobError,"UnableToWriteBlob", + image_info->filename); + } + else + { + blob_info->file=fdopen(file,"wb"); + if (blob_info->file != (FILE *) NULL) + { + (void) FormatLocaleString(image->filename,MaxTextExtent,"%s:%s", + image->magick,unique); + status=WriteImage(blob_info,image); + (void) CloseBlob(image); + (void) fclose(blob_info->file); + if (status == MagickFalse) + InheritException(exception,&image->exception); + else + blob=FileToBlob(unique,~0UL,length,exception); + } + (void) RelinquishUniqueFileResource(unique); + } + } + blob_info=DestroyImageInfo(blob_info); + return(blob); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I m a g e T o F i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ImageToFile() writes an image to a file. It returns MagickFalse if an error +% occurs otherwise MagickTrue. +% +% The format of the ImageToFile method is: +% +% MagickBooleanType ImageToFile(Image *image,char *filename, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o filename: Write the image to this file. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType ImageToFile(Image *image,char *filename, + ExceptionInfo *exception) +{ + int + file; + + const unsigned char + *p; + + size_t + i; + + size_t + length, + quantum; + + ssize_t + count; + + struct stat + file_stats; + + unsigned char + *buffer; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename); + assert(filename != (const char *) NULL); + if (*filename == '\0') + file=AcquireUniqueFileResource(filename); + else + if (LocaleCompare(filename,"-") == 0) + file=fileno(stdout); + else + file=open_utf8(filename,O_RDWR | O_CREAT | O_EXCL | O_BINARY,S_MODE); + if (file == -1) + { + ThrowFileException(exception,BlobError,"UnableToWriteBlob",filename); + return(MagickFalse); + } + quantum=(size_t) MagickMaxBufferExtent; + if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0)) + quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent); + buffer=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*buffer)); + if (buffer == (unsigned char *) NULL) + { + file=close(file)-1; + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationError","`%s'",filename); + return(MagickFalse); + } + length=0; + p=(const unsigned char *) ReadBlobStream(image,quantum,buffer,&count); + for (i=0; count > 0; ) + { + length=(size_t) count; + for (i=0; i < length; i+=count) + { + count=write(file,p+i,(size_t) (length-i)); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + if (i < length) + break; + p=(const unsigned char *) ReadBlobStream(image,quantum,buffer,&count); + } + if (LocaleCompare(filename,"-") != 0) + file=close(file); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + if ((file == -1) || (i < length)) + { + ThrowFileException(exception,BlobError,"UnableToWriteBlob",filename); + return(MagickFalse); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I m a g e s T o B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ImagesToBlob() implements direct to memory image formats. It returns the +% image sequence as a blob and its length. The magick member of the ImageInfo +% structure determines the format of the returned blob (GIF, JPEG, PNG, etc.) +% +% Note, some image formats do not permit multiple images to the same image +% stream (e.g. JPEG). in this instance, just the first image of the +% sequence is returned as a blob. +% +% The format of the ImagesToBlob method is: +% +% unsigned char *ImagesToBlob(const ImageInfo *image_info,Image *images, +% size_t *length,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o images: the image list. +% +% o length: return the actual length of the blob. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport unsigned char *ImagesToBlob(const ImageInfo *image_info, + Image *images,size_t *length,ExceptionInfo *exception) +{ + const MagickInfo + *magick_info; + + ImageInfo + *clone_info; + + MagickBooleanType + status; + + unsigned char + *blob; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(images != (Image *) NULL); + assert(images->signature == MagickCoreSignature); + assert(exception != (ExceptionInfo *) NULL); + *length=0; + blob=(unsigned char *) NULL; + clone_info=CloneImageInfo(image_info); + (void) SetImageInfo(clone_info,(unsigned int) GetImageListLength(images), + exception); + if (*clone_info->magick != '\0') + (void) CopyMagickString(images->magick,clone_info->magick,MaxTextExtent); + magick_info=GetMagickInfo(images->magick,exception); + if (magick_info == (const MagickInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + MissingDelegateError,"NoDecodeDelegateForThisImageFormat","`%s'", + images->magick); + clone_info=DestroyImageInfo(clone_info); + return(blob); + } + if (GetMagickAdjoin(magick_info) == MagickFalse) + { + clone_info=DestroyImageInfo(clone_info); + return(ImageToBlob(image_info,images,length,exception)); + } + (void) CopyMagickString(clone_info->magick,images->magick,MaxTextExtent); + if (GetMagickBlobSupport(magick_info) != MagickFalse) + { + /* + Native blob support for this images format. + */ + clone_info->length=0; + clone_info->blob=AcquireQuantumMemory(MagickMaxBlobExtent, + sizeof(unsigned char)); + if (clone_info->blob == (void *) NULL) + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",images->filename); + else + { + (void) CloseBlob(images); + images->blob->exempt=MagickTrue; + *images->filename='\0'; + status=WriteImages(clone_info,images,images->filename,exception); + *length=images->blob->length; + blob=DetachBlob(images->blob); + if (blob == (unsigned char *) NULL) + clone_info->blob=RelinquishMagickMemory(clone_info->blob); + else if (status == MagickFalse) + blob=(unsigned char *) RelinquishMagickMemory(blob); + else + blob=(unsigned char *) ResizeQuantumMemory(blob,*length+1, + sizeof(*blob)); + } + } + else + { + char + filename[MaxTextExtent], + unique[MaxTextExtent]; + + int + file; + + /* + Write file to disk in blob images format. + */ + file=AcquireUniqueFileResource(unique); + if (file == -1) + { + ThrowFileException(exception,FileOpenError,"UnableToWriteBlob", + image_info->filename); + } + else + { + clone_info->file=fdopen(file,"wb"); + if (clone_info->file != (FILE *) NULL) + { + (void) FormatLocaleString(filename,MaxTextExtent,"%s:%s", + images->magick,unique); + status=WriteImages(clone_info,images,filename,exception); + (void) CloseBlob(images); + (void) fclose(clone_info->file); + if (status == MagickFalse) + InheritException(exception,&images->exception); + else + blob=FileToBlob(unique,~0UL,length,exception); + } + (void) RelinquishUniqueFileResource(unique); + } + } + clone_info=DestroyImageInfo(clone_info); + return(blob); +} +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I n j e c t I m a g e B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% InjectImageBlob() injects the image with a copy of itself in the specified +% format (e.g. inject JPEG into a PDF image). +% +% The format of the InjectImageBlob method is: +% +% MagickBooleanType InjectImageBlob(const ImageInfo *image_info, +% Image *image,Image *inject_image,const char *format, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info.. +% +% o image: the image. +% +% o inject_image: inject into the image stream. +% +% o format: the image format. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType InjectImageBlob(const ImageInfo *image_info, + Image *image,Image *inject_image,const char *format,ExceptionInfo *exception) +{ + char + filename[MaxTextExtent]; + + FILE + *unique_file; + + Image + *byte_image; + + ImageInfo + *write_info; + + int + file; + + MagickBooleanType + status; + + size_t + quantum; + + struct stat + file_stats; + + unsigned char + *buffer; + + /* + Write inject image to a temporary file. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(inject_image != (Image *) NULL); + assert(inject_image->signature == MagickCoreSignature); + assert(exception != (ExceptionInfo *) NULL); + unique_file=(FILE *) NULL; + file=AcquireUniqueFileResource(filename); + if (file != -1) + unique_file=fdopen(file,"wb"); + if ((file == -1) || (unique_file == (FILE *) NULL)) + { + (void) CopyMagickString(image->filename,filename,MaxTextExtent); + ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile", + image->filename); + return(MagickFalse); + } + byte_image=CloneImage(inject_image,0,0,MagickFalse,exception); + if (byte_image == (Image *) NULL) + { + (void) fclose(unique_file); + (void) RelinquishUniqueFileResource(filename); + return(MagickFalse); + } + (void) FormatLocaleString(byte_image->filename,MaxTextExtent,"%s:%s",format, + filename); + DestroyBlob(byte_image); + byte_image->blob=CloneBlobInfo((BlobInfo *) NULL); + write_info=CloneImageInfo(image_info); + *write_info->magick='\0'; + SetImageInfoFile(write_info,unique_file); + status=WriteImage(write_info,byte_image); + write_info=DestroyImageInfo(write_info); + byte_image=DestroyImage(byte_image); + (void) fclose(unique_file); + if (status == MagickFalse) + { + (void) RelinquishUniqueFileResource(filename); + return(MagickFalse); + } + /* + Inject into image stream. + */ + file=open_utf8(filename,O_RDONLY | O_BINARY,0); + if (file == -1) + { + (void) RelinquishUniqueFileResource(filename); + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + image_info->filename); + return(MagickFalse); + } + quantum=(size_t) MagickMaxBufferExtent; + if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0)) + quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent); + buffer=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*buffer)); + if (buffer == (unsigned char *) NULL) + { + (void) RelinquishUniqueFileResource(filename); + file=close(file); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + for ( ; ; ) + { + ssize_t count = read(file,buffer,quantum); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + status=WriteBlobStream(image,(size_t) count,buffer) == count ? MagickTrue : + MagickFalse; + } + file=close(file); + if (file == -1) + ThrowFileException(exception,FileOpenError,"UnableToWriteBlob",filename); + (void) RelinquishUniqueFileResource(filename); + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s B l o b E x e m p t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsBlobExempt() returns true if the blob is exempt. +% +% The format of the IsBlobExempt method is: +% +% MagickBooleanType IsBlobExempt(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType IsBlobExempt(const Image *image) +{ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + return(image->blob->exempt); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ I s B l o b S e e k a b l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsBlobSeekable() returns true if the blob is seekable. +% +% The format of the IsBlobSeekable method is: +% +% MagickBooleanType IsBlobSeekable(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType IsBlobSeekable(const Image *image) +{ + BlobInfo + *magick_restrict blob_info; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + blob_info=image->blob; + switch (blob_info->type) + { + case BlobStream: + return(MagickTrue); + case FileStream: + { + int + status; + + if (blob_info->file_info.file == (FILE *) NULL) + return(MagickFalse); + status=fseek(blob_info->file_info.file,0,SEEK_CUR); + return(status == -1 ? MagickFalse : MagickTrue); + } + case ZipStream: + { +#if defined(MAGICKCORE_ZLIB_DELEGATE) + MagickOffsetType + offset; + + if (blob_info->file_info.gzfile == (gzFile) NULL) + return(MagickFalse); + offset=gzseek(blob_info->file_info.gzfile,0,SEEK_CUR); + return(offset < 0 ? MagickFalse : MagickTrue); +#else + break; +#endif + } + case UndefinedStream: + case BZipStream: + case FifoStream: + case PipeStream: + case StandardStream: + break; + default: + break; + } + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s B l o b T e m p o r a r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsBlobTemporary() returns true if the blob is temporary. +% +% The format of the IsBlobTemporary method is: +% +% MagickBooleanType IsBlobTemporary(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType IsBlobTemporary(const Image *image) +{ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + return(image->blob->temporary); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M a p B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MapBlob() creates a mapping from a file to a binary large object. +% +% The format of the MapBlob method is: +% +% unsigned char *MapBlob(int file,const MapMode mode, +% const MagickOffsetType offset,const size_t length) +% +% A description of each parameter follows: +% +% o file: map this file descriptor. +% +% o mode: ReadMode, WriteMode, or IOMode. +% +% o offset: starting at this offset within the file. +% +% o length: the length of the mapping is returned in this pointer. +% +*/ +MagickExport unsigned char *MapBlob(int file,const MapMode mode, + const MagickOffsetType offset,const size_t length) +{ +#if defined(MAGICKCORE_HAVE_MMAP) + int + flags, + protection; + + unsigned char + *map; + + /* + Map file. + */ + flags=0; + if (file == -1) +#if defined(MAP_ANONYMOUS) + flags|=MAP_ANONYMOUS; +#else + return((unsigned char *) NULL); +#endif + switch (mode) + { + case ReadMode: + default: + { + protection=PROT_READ; + flags|=MAP_PRIVATE; + break; + } + case WriteMode: + { + protection=PROT_WRITE; + flags|=MAP_SHARED; + break; + } + case IOMode: + { + protection=PROT_READ | PROT_WRITE; + flags|=MAP_SHARED; + break; + } + } +#if !defined(MAGICKCORE_HAVE_HUGEPAGES) || !defined(MAP_HUGETLB) + map=(unsigned char *) mmap((char *) NULL,length,protection,flags,file,offset); +#else + map=(unsigned char *) mmap((char *) NULL,length,protection,flags | + MAP_HUGETLB,file,offset); + if (map == (unsigned char *) MAP_FAILED) + map=(unsigned char *) mmap((char *) NULL,length,protection,flags,file, + offset); +#endif + if (map == (unsigned char *) MAP_FAILED) + return((unsigned char *) NULL); + return(map); +#else + (void) file; + (void) mode; + (void) offset; + (void) length; + return((unsigned char *) NULL); +#endif +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M S B O r d e r L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MSBOrderLong() converts a least-significant byte first buffer of integers to +% most-significant byte first. +% +% The format of the MSBOrderLong method is: +% +% void MSBOrderLong(unsigned char *buffer,const size_t length) +% +% A description of each parameter follows. +% +% o buffer: Specifies a pointer to a buffer of integers. +% +% o length: Specifies the length of the buffer. +% +*/ +MagickExport void MSBOrderLong(unsigned char *buffer,const size_t length) +{ + int + c; + + unsigned char + *p, + *q; + + assert(buffer != (unsigned char *) NULL); + q=buffer+length; + while (buffer < q) + { + p=buffer+3; + c=(int) (*p); + *p=(*buffer); + *buffer++=(unsigned char) c; + p=buffer+1; + c=(int) (*p); + *p=(*buffer); + *buffer++=(unsigned char) c; + buffer+=2; + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M S B O r d e r S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MSBOrderShort() converts a least-significant byte first buffer of integers +% to most-significant byte first. +% +% The format of the MSBOrderShort method is: +% +% void MSBOrderShort(unsigned char *p,const size_t length) +% +% A description of each parameter follows. +% +% o p: Specifies a pointer to a buffer of integers. +% +% o length: Specifies the length of the buffer. +% +*/ +MagickExport void MSBOrderShort(unsigned char *p,const size_t length) +{ + int + c; + + unsigned char + *q; + + assert(p != (unsigned char *) NULL); + q=p+length; + while (p < q) + { + c=(int) (*p); + *p=(*(p+1)); + p++; + *p++=(unsigned char) c; + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ O p e n B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% OpenBlob() opens a file associated with the image. A file name of '-' sets +% the file to stdin for type 'r' and stdout for type 'w'. If the filename +% suffix is '.gz' or '.Z', the image is decompressed for type 'r' and +% compressed for type 'w'. If the filename prefix is '|', it is piped to or +% from a system command. +% +% The format of the OpenBlob method is: +% +% MagickBooleanType OpenBlob(const ImageInfo *image_info,Image *image, +% const BlobMode mode,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the image. +% +% o mode: the mode for opening the file. +% +*/ + +static inline MagickBooleanType SetStreamBuffering(const ImageInfo *image_info, + Image *image) +{ + const char + *option; + + int + status; + + size_t + size; + + size=MagickMinBufferExtent; + option=GetImageOption(image_info,"stream:buffer-size"); + if (option != (const char *) NULL) + size=StringToUnsignedLong(option); + status=setvbuf(image->blob->file_info.file,(char *) NULL,size == 0 ? + _IONBF : _IOFBF,size); + return(status == 0 ? MagickTrue : MagickFalse); +} + +MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info, + Image *image,const BlobMode mode,ExceptionInfo *exception) +{ + BlobInfo + *magick_restrict blob_info; + + char + extension[MaxTextExtent], + filename[MaxTextExtent]; + + const char + *type; + + MagickBooleanType + status; + + PolicyRights + rights; + + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + blob_info=image->blob; + if (image_info->blob != (void *) NULL) + { + if (image_info->stream != (StreamHandler) NULL) + blob_info->stream=(StreamHandler) image_info->stream; + AttachBlob(blob_info,image_info->blob,image_info->length); + return(MagickTrue); + } + (void) DetachBlob(blob_info); + blob_info->mode=mode; + switch (mode) + { + default: type="r"; break; + case ReadBlobMode: type="r"; break; + case ReadBinaryBlobMode: type="rb"; break; + case WriteBlobMode: type="w"; break; + case WriteBinaryBlobMode: type="w+b"; break; + case AppendBlobMode: type="a"; break; + case AppendBinaryBlobMode: type="a+b"; break; + } + if (*type != 'r') + blob_info->synchronize=image_info->synchronize; + if (image_info->stream != (StreamHandler) NULL) + { + blob_info->stream=(StreamHandler) image_info->stream; + if (*type == 'w') + { + blob_info->type=FifoStream; + return(MagickTrue); + } + } + /* + Open image file. + */ + *filename='\0'; + (void) CopyMagickString(filename,image->filename,MaxTextExtent); + rights=ReadPolicyRights; + if (*type == 'w') + rights=WritePolicyRights; + if (IsRightsAuthorized(PathPolicyDomain,rights,filename) == MagickFalse) + { + errno=EPERM; + (void) ThrowMagickException(exception,GetMagickModule(),PolicyError, + "NotAuthorized","`%s'",filename); + return(MagickFalse); + } + if ((LocaleCompare(filename,"-") == 0) || + ((*filename == '\0') && (image_info->file == (FILE *) NULL))) + { + blob_info->file_info.file=(*type == 'r') ? stdin : stdout; +#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__) + if (strchr(type,'b') != (char *) NULL) + setmode(fileno(blob_info->file_info.file),_O_BINARY); +#endif + blob_info->type=StandardStream; + blob_info->exempt=MagickTrue; + return(SetStreamBuffering(image_info,image)); + } + if ((LocaleNCompare(filename,"fd:",3) == 0) && + (IsGeometry(filename+3) != MagickFalse)) + { + char + mode[MaxTextExtent]; + + *mode=(*type); + mode[1]='\0'; + blob_info->file_info.file=fdopen(StringToLong(filename+3),mode); + if (blob_info->file_info.file == (FILE *) NULL) + { + ThrowFileException(exception,BlobError,"UnableToOpenBlob",filename); + return(MagickFalse); + } +#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__) + if (strchr(type,'b') != (char *) NULL) + setmode(fileno(blob_info->file_info.file),_O_BINARY); +#endif + blob_info->type=FileStream; + blob_info->exempt=MagickTrue; + return(SetStreamBuffering(image_info,image)); + } +#if defined(MAGICKCORE_HAVE_POPEN) && defined(MAGICKCORE_PIPES_SUPPORT) + if (*filename == '|') + { + char + fileMode[MaxTextExtent], + *sanitize_command; + + /* + Pipe image to or from a system command. + */ +#if defined(SIGPIPE) + if (*type == 'w') + (void) signal(SIGPIPE,SIG_IGN); +#endif + *fileMode=(*type); + fileMode[1]='\0'; + sanitize_command=SanitizeString(filename+1); + blob_info->file_info.file=(FILE *) popen_utf8(sanitize_command, + fileMode); + sanitize_command=DestroyString(sanitize_command); + if (blob_info->file_info.file == (FILE *) NULL) + { + ThrowFileException(exception,BlobError,"UnableToOpenBlob",filename); + return(MagickFalse); + } + blob_info->type=PipeStream; + blob_info->exempt=MagickTrue; + return(SetStreamBuffering(image_info,image)); + } +#endif + status=GetPathAttributes(filename,&blob_info->properties); +#if defined(S_ISFIFO) + if ((status != MagickFalse) && S_ISFIFO(blob_info->properties.st_mode)) + { + blob_info->file_info.file=(FILE *) fopen_utf8(filename,type); + if (blob_info->file_info.file == (FILE *) NULL) + { + ThrowFileException(exception,BlobError,"UnableToOpenBlob",filename); + return(MagickFalse); + } + blob_info->type=FileStream; + blob_info->exempt=MagickTrue; + return(SetStreamBuffering(image_info,image)); + } +#endif + GetPathComponent(image->filename,ExtensionPath,extension); + if (*type == 'w') + { + (void) CopyMagickString(filename,image->filename,MaxTextExtent); + if ((image_info->adjoin == MagickFalse) || + (strchr(filename,'%') != (char *) NULL)) + { + /* + Form filename for multi-part images. + */ + (void) InterpretImageFilename(image_info,image,image->filename,(int) + image->scene,filename); + if ((LocaleCompare(filename,image->filename) == 0) && + ((GetPreviousImageInList(image) != (Image *) NULL) || + (GetNextImageInList(image) != (Image *) NULL))) + { + char + path[MaxTextExtent]; + + GetPathComponent(image->filename,RootPath,path); + if (*extension == '\0') + (void) FormatLocaleString(filename,MaxTextExtent,"%s-%.20g", + path,(double) image->scene); + else + (void) FormatLocaleString(filename,MaxTextExtent,"%s-%.20g.%s", + path,(double) image->scene,extension); + } + (void) CopyMagickString(image->filename,filename,MaxTextExtent); +#if defined(macintosh) + SetApplicationType(filename,image_info->magick,'8BIM'); +#endif + } + } + if (image_info->file != (FILE *) NULL) + { + blob_info->file_info.file=image_info->file; + blob_info->type=FileStream; + blob_info->exempt=MagickTrue; + } + else + if (*type == 'r') + { + blob_info->file_info.file=(FILE *) fopen_utf8(filename,type); + if (blob_info->file_info.file != (FILE *) NULL) + { + size_t + count; + + unsigned char + magick[3]; + + blob_info->type=FileStream; + (void) fstat(fileno(blob_info->file_info.file), + &blob_info->properties); + (void) SetStreamBuffering(image_info,image); + (void) memset(magick,0,sizeof(magick)); + count=fread(magick,1,sizeof(magick),blob_info->file_info.file); + (void) fseek(blob_info->file_info.file,-((off_t) count),SEEK_CUR); +#if defined(MAGICKCORE_POSIX_SUPPORT) + (void) fflush(blob_info->file_info.file); +#endif + (void) LogMagickEvent(BlobEvent,GetMagickModule(), + " read %.20g magic header bytes",(double) count); +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if (((int) magick[0] == 0x1F) && ((int) magick[1] == 0x8B) && + ((int) magick[2] == 0x08)) + { + if (blob_info->file_info.file != (FILE *) NULL) + (void) fclose(blob_info->file_info.file); + blob_info->file_info.file=(FILE *) NULL; + blob_info->file_info.gzfile=gzopen(filename,"rb"); + if (blob_info->file_info.gzfile != (gzFile) NULL) + blob_info->type=ZipStream; + } +#endif +#if defined(MAGICKCORE_BZLIB_DELEGATE) + if (strncmp((char *) magick,"BZh",3) == 0) + { + if (blob_info->file_info.file != (FILE *) NULL) + (void) fclose(blob_info->file_info.file); + blob_info->file_info.file=(FILE *) NULL; + blob_info->file_info.bzfile=BZ2_bzopen(filename,"r"); + if (blob_info->file_info.bzfile != (BZFILE *) NULL) + blob_info->type=BZipStream; + } +#endif + if (blob_info->type == FileStream) + { + const MagickInfo + *magick_info; + + ExceptionInfo + *sans_exception; + + size_t + length; + + sans_exception=AcquireExceptionInfo(); + magick_info=GetMagickInfo(image_info->magick,sans_exception); + sans_exception=DestroyExceptionInfo(sans_exception); + length=(size_t) blob_info->properties.st_size; + if ((magick_info != (const MagickInfo *) NULL) && + (GetMagickBlobSupport(magick_info) != MagickFalse) && + (length > MagickMaxBufferExtent) && + (AcquireMagickResource(MapResource,length) != MagickFalse)) + { + void + *blob; + + blob=MapBlob(fileno(blob_info->file_info.file),ReadMode,0, + length); + if (blob == (void *) NULL) + RelinquishMagickResource(MapResource,length); + else + { + /* + Format supports blobs-- use memory-mapped I/O. + */ + if (image_info->file != (FILE *) NULL) + blob_info->exempt=MagickFalse; + else + { + (void) fclose(blob_info->file_info.file); + blob_info->file_info.file=(FILE *) NULL; + } + AttachBlob(blob_info,blob,length); + blob_info->mapped=MagickTrue; + } + } + } + } + } + else +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if ((LocaleCompare(extension,"Z") == 0) || + (LocaleCompare(extension,"gz") == 0) || + (LocaleCompare(extension,"wmz") == 0) || + (LocaleCompare(extension,"svgz") == 0)) + { + blob_info->file_info.gzfile=gzopen(filename,"wb"); + if (blob_info->file_info.gzfile != (gzFile) NULL) + blob_info->type=ZipStream; + } + else +#endif +#if defined(MAGICKCORE_BZLIB_DELEGATE) + if (LocaleCompare(extension,"bz2") == 0) + { + if (mode == WriteBinaryBlobMode) + type="w"; + blob_info->file_info.bzfile=BZ2_bzopen(filename,"w"); + if (blob_info->file_info.bzfile != (BZFILE *) NULL) + blob_info->type=BZipStream; + } + else +#endif + { + blob_info->file_info.file=(FILE *) fopen_utf8(filename,type); + if (blob_info->file_info.file != (FILE *) NULL) + { + blob_info->type=FileStream; + (void) SetStreamBuffering(image_info,image); + } + } + blob_info->status=MagickFalse; + blob_info->error_number=0; + if (blob_info->type != UndefinedStream) + blob_info->size=GetBlobSize(image); + else + { + ThrowFileException(exception,BlobError,"UnableToOpenBlob",filename); + return(MagickFalse); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ P i n g B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PingBlob() returns all the attributes of an image or image sequence except +% for the pixels. It is much faster and consumes far less memory than +% BlobToImage(). On failure, a NULL image is returned and exception +% describes the reason for the failure. +% +% The format of the PingBlob method is: +% +% Image *PingBlob(const ImageInfo *image_info,const void *blob, +% const size_t length,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o blob: the address of a character stream in one of the image formats +% understood by ImageMagick. +% +% o length: This size_t integer reflects the length in bytes of the blob. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static size_t PingStream(const Image *magick_unused(image), + const void *magick_unused(pixels),const size_t columns) +{ + magick_unreferenced(image); + magick_unreferenced(pixels); + + return(columns); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +MagickExport Image *PingBlob(const ImageInfo *image_info,const void *blob, + const size_t length,ExceptionInfo *exception) +{ + const MagickInfo + *magick_info; + + Image + *image; + + ImageInfo + *clone_info, + *ping_info; + + MagickBooleanType + status; + + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + if ((blob == (const void *) NULL) || (length == 0)) + { + (void) ThrowMagickException(exception,GetMagickModule(),BlobError, + "ZeroLengthBlobNotPermitted","`%s'",image_info->filename); + return((Image *) NULL); + } + ping_info=CloneImageInfo(image_info); + ping_info->blob=(void *) blob; + ping_info->length=length; + ping_info->ping=MagickTrue; + if (*ping_info->magick == '\0') + (void) SetImageInfo(ping_info,0,exception); + magick_info=GetMagickInfo(ping_info->magick,exception); + if (magick_info == (const MagickInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + MissingDelegateError,"NoDecodeDelegateForThisImageFormat","`%s'", + ping_info->magick); + ping_info=DestroyImageInfo(ping_info); + return((Image *) NULL); + } + if (GetMagickBlobSupport(magick_info) != MagickFalse) + { + char + filename[MagickPathExtent]; + + /* + Native blob support for this image format. + */ + (void) CopyMagickString(filename,ping_info->filename,MagickPathExtent); + (void) FormatLocaleString(ping_info->filename,MaxTextExtent,"%s:%s", + ping_info->magick,filename); + image=ReadStream(ping_info,&PingStream,exception); + if (image != (Image *) NULL) + (void) DetachBlob(image->blob); + ping_info=DestroyImageInfo(ping_info); + return(image); + } + /* + Write blob to a temporary file on disk. + */ + ping_info->blob=(void *) NULL; + ping_info->length=0; + *ping_info->filename='\0'; + status=BlobToFile(ping_info->filename,blob,length,exception); + if (status == MagickFalse) + { + (void) RelinquishUniqueFileResource(ping_info->filename); + ping_info=DestroyImageInfo(ping_info); + return((Image *) NULL); + } + clone_info=CloneImageInfo(ping_info); + (void) FormatLocaleString(clone_info->filename,MaxTextExtent,"%s:%s", + ping_info->magick,ping_info->filename); + image=ReadStream(clone_info,&PingStream,exception); + if (image != (Image *) NULL) + { + Image + *images; + + /* + Restore original filenames and image format. + */ + for (images=GetFirstImageInList(image); images != (Image *) NULL; ) + { + (void) CopyMagickString(images->filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(images->magick_filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(images->magick,magick_info->name,MaxTextExtent); + images=GetNextImageInList(images); + } + } + clone_info=DestroyImageInfo(clone_info); + (void) RelinquishUniqueFileResource(ping_info->filename); + ping_info=DestroyImageInfo(ping_info); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlob() reads data from the blob or image file and returns it. It +% returns the number of bytes read. If length is zero, ReadBlob() returns +% zero and has no other results. If length is greater than MAGICK_SSIZE_MAX, the +% result is unspecified. +% +% The format of the ReadBlob method is: +% +% ssize_t ReadBlob(Image *image,const size_t length,unsigned char *data) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o length: Specifies an integer representing the number of bytes to read +% from the file. +% +% o data: Specifies an area to place the information requested from the +% file. +% +*/ +MagickExport ssize_t ReadBlob(Image *image,const size_t length, + unsigned char *data) +{ + BlobInfo + *magick_restrict blob_info; + + int + c; + + unsigned char + *q; + + ssize_t + count; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + if (length == 0) + return(0); + assert(data != (void *) NULL); + blob_info=image->blob; + count=0; + q=data; + switch (blob_info->type) + { + case UndefinedStream: + break; + case StandardStream: + case FileStream: + case PipeStream: + { + switch (length) + { + default: + { + count=(ssize_t) fread(q,1,length,blob_info->file_info.file); + break; + } + case 4: + { + c=getc(blob_info->file_info.file); + if (c == EOF) + break; + *q++=(unsigned char) c; + count++; + } + case 3: + { + c=getc(blob_info->file_info.file); + if (c == EOF) + break; + *q++=(unsigned char) c; + count++; + } + case 2: + { + c=getc(blob_info->file_info.file); + if (c == EOF) + break; + *q++=(unsigned char) c; + count++; + } + case 1: + { + c=getc(blob_info->file_info.file); + if (c == EOF) + break; + *q++=(unsigned char) c; + count++; + } + case 0: + break; + } + if ((count != (ssize_t) length) && + (ferror(blob_info->file_info.file) != 0)) + ThrowBlobException(blob_info); + break; + } + case ZipStream: + { +#if defined(MAGICKCORE_ZLIB_DELEGATE) + int + status; + + switch (length) + { + default: + { + ssize_t + i; + + for (i=0; i < (ssize_t) length; i+=count) + { + count=(ssize_t) gzread(blob_info->file_info.gzfile,q+i, + (unsigned int) MagickMin(length-i,MagickMaxBufferExtent)); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + count=i; + break; + } + case 4: + { + c=gzgetc(blob_info->file_info.gzfile); + if (c == EOF) + break; + *q++=(unsigned char) c; + count++; + } + case 3: + { + c=gzgetc(blob_info->file_info.gzfile); + if (c == EOF) + break; + *q++=(unsigned char) c; + count++; + } + case 2: + { + c=gzgetc(blob_info->file_info.gzfile); + if (c == EOF) + break; + *q++=(unsigned char) c; + count++; + } + case 1: + { + c=gzgetc(blob_info->file_info.gzfile); + if (c == EOF) + break; + *q++=(unsigned char) c; + count++; + } + case 0: + break; + } + status=Z_OK; + (void) gzerror(blob_info->file_info.gzfile,&status); + if ((count != (ssize_t) length) && (status != Z_OK)) + ThrowBlobException(blob_info); + if (blob_info->eof == MagickFalse) + blob_info->eof=gzeof(blob_info->file_info.gzfile) != 0 ? MagickTrue : + MagickFalse; +#endif + break; + } + case BZipStream: + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + int + status; + + ssize_t + i; + + for (i=0; i < (ssize_t) length; i+=count) + { + count=(ssize_t) BZ2_bzread(blob_info->file_info.bzfile,q+i, + (unsigned int) MagickMin(length-i,MagickMaxBufferExtent)); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + count=i; + status=BZ_OK; + (void) BZ2_bzerror(blob_info->file_info.bzfile,&status); + if ((count != (ssize_t) length) && (status != BZ_OK)) + ThrowBlobException(blob_info); +#endif + break; + } + case FifoStream: + break; + case BlobStream: + { + const unsigned char + *p; + + if (blob_info->offset >= (MagickOffsetType) blob_info->length) + { + blob_info->eof=MagickTrue; + break; + } + p=blob_info->data+blob_info->offset; + count=(ssize_t) MagickMin((MagickOffsetType) length,(MagickOffsetType) + blob_info->length-blob_info->offset); + blob_info->offset+=count; + if (count != (ssize_t) length) + blob_info->eof=MagickTrue; + (void) memcpy(q,p,(size_t) count); + break; + } + } + return(count); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b B y t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobByte() reads a single byte from the image file and returns it. +% +% The format of the ReadBlobByte method is: +% +% int ReadBlobByte(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport int ReadBlobByte(Image *image) +{ + BlobInfo + *magick_restrict blob_info; + + const unsigned char + *p; + + unsigned char + buffer[1]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + blob_info=image->blob; + switch (blob_info->type) + { + case StandardStream: + case FileStream: + case PipeStream: + { + int + c; + + p=(const unsigned char *) buffer; + c=getc(blob_info->file_info.file); + if (c == EOF) + return(EOF); + *buffer=(unsigned char) c; + break; + } + default: + { + ssize_t + count; + + p=(const unsigned char *) ReadBlobStream(image,1,buffer,&count); + if (count != 1) + return(EOF); + break; + } + } + return((int) (*p)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b D o u b l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobDouble() reads a double value as a 64-bit quantity in the byte-order +% specified by the endian member of the image structure. +% +% The format of the ReadBlobDouble method is: +% +% double ReadBlobDouble(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport double ReadBlobDouble(Image *image) +{ + union + { + MagickSizeType + unsigned_value; + + double + double_value; + } quantum; + + quantum.double_value=0.0; + quantum.unsigned_value=ReadBlobLongLong(image); + return(quantum.double_value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b F l o a t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobFloat() reads a float value as a 32-bit quantity in the byte-order +% specified by the endian member of the image structure. +% +% The format of the ReadBlobFloat method is: +% +% float ReadBlobFloat(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport float ReadBlobFloat(Image *image) +{ + union + { + unsigned int + unsigned_value; + + float + float_value; + } quantum; + + quantum.float_value=0.0; + quantum.unsigned_value=ReadBlobLong(image); + return(quantum.float_value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobLong() reads a unsigned int value as a 32-bit quantity in the +% byte-order specified by the endian member of the image structure. +% +% The format of the ReadBlobLong method is: +% +% unsigned int ReadBlobLong(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport unsigned int ReadBlobLong(Image *image) +{ + const unsigned char + *p; + + ssize_t + count; + + unsigned char + buffer[4]; + + unsigned int + value; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + *buffer='\0'; + p=(const unsigned char *) ReadBlobStream(image,4,buffer,&count); + if (count != 4) + return(0UL); + if (image->endian == LSBEndian) + { + value=(unsigned int) (*p++); + value|=(unsigned int) (*p++) << 8; + value|=(unsigned int) (*p++) << 16; + value|=(unsigned int) (*p++) << 24; + return(value); + } + value=(unsigned int) (*p++) << 24; + value|=(unsigned int) (*p++) << 16; + value|=(unsigned int) (*p++) << 8; + value|=(unsigned int) (*p++); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b L o n g L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobLongLong() reads a long long value as a 64-bit quantity in the +% byte-order specified by the endian member of the image structure. +% +% The format of the ReadBlobLongLong method is: +% +% MagickSizeType ReadBlobLongLong(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport MagickSizeType ReadBlobLongLong(Image *image) +{ + MagickSizeType + value; + + const unsigned char + *p; + + ssize_t + count; + + unsigned char + buffer[8]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + *buffer='\0'; + p=(const unsigned char *) ReadBlobStream(image,8,buffer,&count); + if (count != 8) + return(MagickULLConstant(0)); + if (image->endian == LSBEndian) + { + value=(MagickSizeType) (*p++); + value|=(MagickSizeType) (*p++) << 8; + value|=(MagickSizeType) (*p++) << 16; + value|=(MagickSizeType) (*p++) << 24; + value|=(MagickSizeType) (*p++) << 32; + value|=(MagickSizeType) (*p++) << 40; + value|=(MagickSizeType) (*p++) << 48; + value|=(MagickSizeType) (*p++) << 56; + return(value); + } + value=(MagickSizeType) (*p++) << 56; + value|=(MagickSizeType) (*p++) << 48; + value|=(MagickSizeType) (*p++) << 40; + value|=(MagickSizeType) (*p++) << 32; + value|=(MagickSizeType) (*p++) << 24; + value|=(MagickSizeType) (*p++) << 16; + value|=(MagickSizeType) (*p++) << 8; + value|=(MagickSizeType) (*p++); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobShort() reads a short value as a 16-bit quantity in the byte-order +% specified by the endian member of the image structure. +% +% The format of the ReadBlobShort method is: +% +% unsigned short ReadBlobShort(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport unsigned short ReadBlobShort(Image *image) +{ + const unsigned char + *p; + + unsigned short + value; + + ssize_t + count; + + unsigned char + buffer[2]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + *buffer='\0'; + p=(const unsigned char *) ReadBlobStream(image,2,buffer,&count); + if (count != 2) + return((unsigned short) 0U); + if (image->endian == LSBEndian) + { + value=(unsigned short) (*p++); + value|=(unsigned short) (*p++) << 8; + return(value); + } + value=(unsigned short) ((unsigned short) (*p++) << 8); + value|=(unsigned short) (*p++); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b L S B L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobLSBLong() reads a unsigned int value as a 32-bit quantity in +% least-significant byte first order. +% +% The format of the ReadBlobLSBLong method is: +% +% unsigned int ReadBlobLSBLong(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport unsigned int ReadBlobLSBLong(Image *image) +{ + const unsigned char + *p; + + unsigned int + value; + + ssize_t + count; + + unsigned char + buffer[4]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + *buffer='\0'; + p=(const unsigned char *) ReadBlobStream(image,4,buffer,&count); + if (count != 4) + return(0U); + value=(unsigned int) (*p++); + value|=(unsigned int) (*p++) << 8; + value|=(unsigned int) (*p++) << 16; + value|=(unsigned int) (*p++) << 24; + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b L S B S i g n e d L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobLSBSignedLong() reads a signed int value as a 32-bit quantity in +% least-significant byte first order. +% +% The format of the ReadBlobLSBSignedLong method is: +% +% signed int ReadBlobLSBSignedLong(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport signed int ReadBlobLSBSignedLong(Image *image) +{ + union + { + unsigned int + unsigned_value; + + signed int + signed_value; + } quantum; + + quantum.unsigned_value=ReadBlobLSBLong(image); + return(quantum.signed_value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b L S B S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobLSBShort() reads a short value as a 16-bit quantity in +% least-significant byte first order. +% +% The format of the ReadBlobLSBShort method is: +% +% unsigned short ReadBlobLSBShort(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport unsigned short ReadBlobLSBShort(Image *image) +{ + const unsigned char + *p; + + unsigned short + value; + + ssize_t + count; + + unsigned char + buffer[2]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + *buffer='\0'; + p=(const unsigned char *) ReadBlobStream(image,2,buffer,&count); + if (count != 2) + return((unsigned short) 0U); + value=(unsigned short) (*p++); + value|=(unsigned short) (*p++) << 8; + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b L S B S i g n e d S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobLSBSignedShort() reads a signed short value as a 16-bit quantity in +% least-significant byte-order. +% +% The format of the ReadBlobLSBSignedShort method is: +% +% signed short ReadBlobLSBSignedShort(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport signed short ReadBlobLSBSignedShort(Image *image) +{ + union + { + unsigned short + unsigned_value; + + signed short + signed_value; + } quantum; + + quantum.unsigned_value=ReadBlobLSBShort(image); + return(quantum.signed_value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b M S B L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobMSBLong() reads a unsigned int value as a 32-bit quantity in +% most-significant byte first order. +% +% The format of the ReadBlobMSBLong method is: +% +% unsigned int ReadBlobMSBLong(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport unsigned int ReadBlobMSBLong(Image *image) +{ + const unsigned char + *p; + + unsigned int + value; + + ssize_t + count; + + unsigned char + buffer[4]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + *buffer='\0'; + p=(const unsigned char *) ReadBlobStream(image,4,buffer,&count); + if (count != 4) + return(0UL); + value=(unsigned int) (*p++) << 24; + value|=(unsigned int) (*p++) << 16; + value|=(unsigned int) (*p++) << 8; + value|=(unsigned int) (*p++); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b M S B L o n g L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobMSBLongLong() reads a unsigned long int value as a 64-bit quantity +% in most-significant byte first order. +% +% The format of the ReadBlobMSBLongLong method is: +% +% unsigned int ReadBlobMSBLongLong(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport MagickSizeType ReadBlobMSBLongLong(Image *image) +{ + const unsigned char + *p; + + MagickSizeType + value; + + ssize_t + count; + + unsigned char + buffer[8]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + *buffer='\0'; + p=(const unsigned char *) ReadBlobStream(image,8,buffer,&count); + if (count != 8) + return(MagickULLConstant(0)); + value=(MagickSizeType) (*p++) << 56; + value|=(MagickSizeType) (*p++) << 48; + value|=(MagickSizeType) (*p++) << 40; + value|=(MagickSizeType) (*p++) << 32; + value|=(MagickSizeType) (*p++) << 24; + value|=(MagickSizeType) (*p++) << 16; + value|=(MagickSizeType) (*p++) << 8; + value|=(MagickSizeType) (*p++); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b M S B S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobMSBShort() reads a short value as a 16-bit quantity in +% most-significant byte first order. +% +% The format of the ReadBlobMSBShort method is: +% +% unsigned short ReadBlobMSBShort(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport unsigned short ReadBlobMSBShort(Image *image) +{ + const unsigned char + *p; + + unsigned short + value; + + ssize_t + count; + + unsigned char + buffer[2]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + *buffer='\0'; + p=(const unsigned char *) ReadBlobStream(image,2,buffer,&count); + if (count != 2) + return((unsigned short) 0U); + value=(unsigned short) ((unsigned short) (*p++) << 8); + value|=(unsigned short) (*p++); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b M S B S i g n e d L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobMSBSignedLong() reads a signed int value as a 32-bit quantity in +% most-significant byte-order. +% +% The format of the ReadBlobMSBSignedLong method is: +% +% signed int ReadBlobMSBSignedLong(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport signed int ReadBlobMSBSignedLong(Image *image) +{ + union + { + unsigned int + unsigned_value; + + signed int + signed_value; + } quantum; + + quantum.unsigned_value=ReadBlobMSBLong(image); + return(quantum.signed_value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b M S B S i g n e d S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobMSBSignedShort() reads a signed short value as a 16-bit quantity in +% most-significant byte-order. +% +% The format of the ReadBlobMSBSignedShort method is: +% +% signed short ReadBlobMSBSignedShort(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport signed short ReadBlobMSBSignedShort(Image *image) +{ + union + { + unsigned short + unsigned_value; + + signed short + signed_value; + } quantum; + + quantum.unsigned_value=ReadBlobMSBShort(image); + return(quantum.signed_value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b S i g n e d L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobSignedLong() reads a signed int value as a 32-bit quantity in the +% byte-order specified by the endian member of the image structure. +% +% The format of the ReadBlobSignedLong method is: +% +% signed int ReadBlobSignedLong(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport signed int ReadBlobSignedLong(Image *image) +{ + union + { + unsigned int + unsigned_value; + + signed int + signed_value; + } quantum; + + quantum.unsigned_value=ReadBlobLong(image); + return(quantum.signed_value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b S i g n e d S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobSignedShort() reads a signed short value as a 16-bit quantity in the +% byte-order specified by the endian member of the image structure. +% +% The format of the ReadBlobSignedShort method is: +% +% signed short ReadBlobSignedShort(Image *image) +% +% A description of each parameter follows. +% +% o image: the image. +% +*/ +MagickExport signed short ReadBlobSignedShort(Image *image) +{ + union + { + unsigned short + unsigned_value; + + signed short + signed_value; + } quantum; + + quantum.unsigned_value=ReadBlobShort(image); + return(quantum.signed_value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b S t r e a m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobStream() reads data from the blob or image file and returns it. It +% returns a pointer to the data buffer you supply or to the image memory +% buffer if its supported (zero-copy). If length is zero, ReadBlobStream() +% returns a count of zero and has no other results. If length is greater than +% MAGICK_SSIZE_MAX, the result is unspecified. +% +% The format of the ReadBlobStream method is: +% +% const void *ReadBlobStream(Image *image,const size_t length, +% void *magick_restrict data,ssize_t *count) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o length: Specifies an integer representing the number of bytes to read +% from the file. +% +% o length: returns the number of bytes read. +% +% o data: Specifies an area to place the information requested from the +% file. +% +*/ +MagickExport magick_hot_spot const void *ReadBlobStream(Image *image, + const size_t length,void *magick_restrict data,ssize_t *count) +{ + BlobInfo + *magick_restrict blob_info; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + assert(count != (ssize_t *) NULL); + blob_info=image->blob; + if (blob_info->type != BlobStream) + { + assert(data != NULL); + *count=ReadBlob(image,length,(unsigned char *) data); + return(data); + } + if (blob_info->offset >= (MagickOffsetType) blob_info->length) + { + *count=0; + blob_info->eof=MagickTrue; + return(data); + } + data=blob_info->data+blob_info->offset; + *count=(ssize_t) MagickMin((MagickOffsetType) length,(MagickOffsetType) + blob_info->length-blob_info->offset); + blob_info->offset+=(*count); + if (*count != (ssize_t) length) + blob_info->eof=MagickTrue; + return(data); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d B l o b S t r i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadBlobString() reads characters from a blob or file until a newline +% character is read or an end-of-file condition is encountered. +% +% The format of the ReadBlobString method is: +% +% char *ReadBlobString(Image *image,char *string) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o string: the address of a character buffer. +% +*/ +MagickExport char *ReadBlobString(Image *image,char *string) +{ + int + c; + + ssize_t + i; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + for (i=0; i < (MaxTextExtent-1L); i++) + { + c=ReadBlobByte(image); + if (c == EOF) + { + if (i == 0) + return((char *) NULL); + break; + } + string[i]=c; + if (c == '\n') + { + if ((i > 0) && (string[i-1] == '\r')) + i--; + break; + } + } + string[i]='\0'; + return(string); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e f e r e n c e B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReferenceBlob() increments the reference count associated with the pixel +% blob returning a pointer to the blob. +% +% The format of the ReferenceBlob method is: +% +% BlobInfo ReferenceBlob(BlobInfo *blob_info) +% +% A description of each parameter follows: +% +% o blob_info: the blob_info. +% +*/ +MagickExport BlobInfo *ReferenceBlob(BlobInfo *blob) +{ + assert(blob != (BlobInfo *) NULL); + assert(blob->signature == MagickCoreSignature); + if (blob->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + LockSemaphoreInfo(blob->semaphore); + blob->reference_count++; + UnlockSemaphoreInfo(blob->semaphore); + return(blob); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S e e k B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SeekBlob() sets the offset in bytes from the beginning of a blob or file +% and returns the resulting offset. +% +% The format of the SeekBlob method is: +% +% MagickOffsetType SeekBlob(Image *image,const MagickOffsetType offset, +% const int whence) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o offset: Specifies an integer representing the offset in bytes. +% +% o whence: Specifies an integer representing how the offset is +% treated relative to the beginning of the blob as follows: +% +% SEEK_SET Set position equal to offset bytes. +% SEEK_CUR Set position to current location plus offset. +% SEEK_END Set position to EOF plus offset. +% +*/ +MagickExport MagickOffsetType SeekBlob(Image *image, + const MagickOffsetType offset,const int whence) +{ + BlobInfo + *magick_restrict blob_info; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + blob_info=image->blob; + switch (blob_info->type) + { + case UndefinedStream: + break; + case StandardStream: + case PipeStream: + return(-1); + case FileStream: + { + if ((offset < 0) && (whence == SEEK_SET)) + return(-1); + if (fseek(blob_info->file_info.file,offset,whence) < 0) + return(-1); + blob_info->offset=TellBlob(image); + break; + } + case ZipStream: + { +#if defined(MAGICKCORE_ZLIB_DELEGATE) + if (gzseek(blob_info->file_info.gzfile,(off_t) offset,whence) < 0) + return(-1); +#endif + blob_info->offset=TellBlob(image); + break; + } + case BZipStream: + return(-1); + case FifoStream: + return(-1); + case BlobStream: + { + switch (whence) + { + case SEEK_SET: + default: + { + if (offset < 0) + return(-1); + blob_info->offset=offset; + break; + } + case SEEK_CUR: + { + if (((offset > 0) && (blob_info->offset > (MAGICK_SSIZE_MAX-offset))) || + ((offset < 0) && (blob_info->offset < (MAGICK_SSIZE_MIN-offset)))) + { + errno=EOVERFLOW; + return(-1); + } + if ((blob_info->offset+offset) < 0) + return(-1); + blob_info->offset+=offset; + break; + } + case SEEK_END: + { + if (((MagickOffsetType) blob_info->length+offset) < 0) + return(-1); + blob_info->offset=blob_info->length+offset; + break; + } + } + if (blob_info->offset < (MagickOffsetType) ((off_t) blob_info->length)) + { + blob_info->eof=MagickFalse; + break; + } + if (blob_info->offset >= (MagickOffsetType) ((off_t) blob_info->extent)) + return(-1); + break; + } + } + return(blob_info->offset); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S e t B l o b E x e m p t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetBlobExempt() sets the blob exempt status. +% +% The format of the SetBlobExempt method is: +% +% MagickBooleanType SetBlobExempt(const Image *image, +% const MagickBooleanType exempt) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exempt: Set to true if this blob is exempt from being closed. +% +*/ +MagickExport void SetBlobExempt(Image *image,const MagickBooleanType exempt) +{ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + image->blob->exempt=exempt; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S e t B l o b E x t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetBlobExtent() ensures enough space is allocated for the blob. If the +% method is successful, subsequent writes to bytes in the specified range are +% guaranteed not to fail. +% +% The format of the SetBlobExtent method is: +% +% MagickBooleanType SetBlobExtent(Image *image,const MagickSizeType extent) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o extent: the blob maximum extent. +% +*/ +MagickExport MagickBooleanType SetBlobExtent(Image *image, + const MagickSizeType extent) +{ + BlobInfo + *magick_restrict blob_info; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + blob_info=image->blob; + switch (blob_info->type) + { + case UndefinedStream: + break; + case StandardStream: + return(MagickFalse); + case FileStream: + { + MagickOffsetType + offset; + + ssize_t + count; + + if (extent != (MagickSizeType) ((off_t) extent)) + return(MagickFalse); + offset=SeekBlob(image,0,SEEK_END); + if (offset < 0) + return(MagickFalse); + if ((MagickSizeType) offset >= extent) + break; + offset=SeekBlob(image,(MagickOffsetType) extent-1,SEEK_SET); + if (offset < 0) + break; + count=(ssize_t) fwrite((const unsigned char *) "",1,1, + blob_info->file_info.file); +#if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE) + if (blob_info->synchronize != MagickFalse) + { + int + file; + + file=fileno(blob_info->file_info.file); + if ((file == -1) || (offset < 0)) + return(MagickFalse); + (void) posix_fallocate(file,offset,extent-offset); + } +#endif + offset=SeekBlob(image,offset,SEEK_SET); + if (count != 1) + return(MagickFalse); + break; + } + case PipeStream: + case ZipStream: + return(MagickFalse); + case BZipStream: + return(MagickFalse); + case FifoStream: + return(MagickFalse); + case BlobStream: + { + if (extent != (MagickSizeType) ((size_t) extent)) + return(MagickFalse); + if (blob_info->mapped != MagickFalse) + { + MagickOffsetType + offset; + + ssize_t + count; + + (void) UnmapBlob(blob_info->data,blob_info->length); + RelinquishMagickResource(MapResource,blob_info->length); + if (extent != (MagickSizeType) ((off_t) extent)) + return(MagickFalse); + offset=SeekBlob(image,0,SEEK_END); + if (offset < 0) + return(MagickFalse); + if ((MagickSizeType) offset >= extent) + break; + offset=SeekBlob(image,(MagickOffsetType) extent-1,SEEK_SET); + count=(ssize_t) fwrite((const unsigned char *) "",1,1, + blob_info->file_info.file); +#if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE) + if (blob_info->synchronize != MagickFalse) + { + int + file; + + file=fileno(blob_info->file_info.file); + if ((file == -1) || (offset < 0)) + return(MagickFalse); + (void) posix_fallocate(file,offset,extent-offset); + } +#endif + offset=SeekBlob(image,offset,SEEK_SET); + if (count != 1) + return(MagickFalse); + (void) AcquireMagickResource(MapResource,extent); + blob_info->data=(unsigned char*) MapBlob(fileno( + blob_info->file_info.file),WriteMode,0,(size_t) extent); + blob_info->extent=(size_t) extent; + blob_info->length=(size_t) extent; + (void) SyncBlob(image); + break; + } + blob_info->extent=(size_t) extent; + blob_info->data=(unsigned char *) ResizeQuantumMemory(blob_info->data, + blob_info->extent+1,sizeof(*blob_info->data)); + (void) SyncBlob(image); + if (blob_info->data == (unsigned char *) NULL) + { + (void) DetachBlob(blob_info); + return(MagickFalse); + } + break; + } + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S y n c B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncBlob() flushes the datastream if it is a file or synchronizes the data +% attributes if it is an blob. +% +% The format of the SyncBlob method is: +% +% int SyncBlob(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +static int SyncBlob(Image *image) +{ + BlobInfo + *magick_restrict blob_info; + + int + status; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + blob_info=image->blob; + status=0; + switch (blob_info->type) + { + case UndefinedStream: + case StandardStream: + break; + case FileStream: + case PipeStream: + { + status=fflush(blob_info->file_info.file); + break; + } + case ZipStream: + { +#if defined(MAGICKCORE_ZLIB_DELEGATE) + status=gzflush(blob_info->file_info.gzfile,Z_SYNC_FLUSH); +#endif + break; + } + case BZipStream: + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + status=BZ2_bzflush(blob_info->file_info.bzfile); +#endif + break; + } + case FifoStream: + break; + case BlobStream: + break; + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ T e l l B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% TellBlob() obtains the current value of the blob or file position. +% +% The format of the TellBlob method is: +% +% MagickOffsetType TellBlob(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickOffsetType TellBlob(const Image *image) +{ + BlobInfo + *magick_restrict blob_info; + + MagickOffsetType + offset; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + blob_info=image->blob; + offset=(-1); + switch (blob_info->type) + { + case UndefinedStream: + case StandardStream: + break; + case FileStream: + { + offset=ftell(blob_info->file_info.file); + break; + } + case PipeStream: + break; + case ZipStream: + { +#if defined(MAGICKCORE_ZLIB_DELEGATE) + offset=(MagickOffsetType) gztell(blob_info->file_info.gzfile); +#endif + break; + } + case BZipStream: + break; + case FifoStream: + break; + case BlobStream: + { + offset=blob_info->offset; + break; + } + } + return(offset); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ U n m a p B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnmapBlob() deallocates the binary large object previously allocated with +% the MapBlob method. +% +% The format of the UnmapBlob method is: +% +% MagickBooleanType UnmapBlob(void *map,const size_t length) +% +% A description of each parameter follows: +% +% o map: the address of the binary large object. +% +% o length: the length of the binary large object. +% +*/ +MagickExport MagickBooleanType UnmapBlob(void *map,const size_t length) +{ +#if defined(MAGICKCORE_HAVE_MMAP) + int + status; + + status=munmap(map,length); + return(status == -1 ? MagickFalse : MagickTrue); +#else + (void) map; + (void) length; + return(MagickFalse); +#endif +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlob() writes data to a blob or image file. It returns the number of +% bytes written. +% +% The format of the WriteBlob method is: +% +% ssize_t WriteBlob(Image *image,const size_t length, +% const unsigned char *data) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o length: Specifies an integer representing the number of bytes to +% write to the file. +% +% o data: The address of the data to write to the blob or file. +% +*/ +MagickExport ssize_t WriteBlob(Image *image,const size_t length, + const unsigned char *data) +{ + BlobInfo + *magick_restrict blob_info; + + int + c; + + const unsigned char + *p; + + unsigned char + *q; + + ssize_t + count; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + if (length == 0) + return(0); + assert(data != (const unsigned char *) NULL); + blob_info=image->blob; + count=0; + p=(const unsigned char *) data; + q=(unsigned char *) data; + switch (blob_info->type) + { + case UndefinedStream: + break; + case StandardStream: + case FileStream: + case PipeStream: + { + switch (length) + { + default: + { + count=(ssize_t) fwrite((const char *) data,1,length, + blob_info->file_info.file); + break; + } + case 4: + { + c=putc((int) *p++,blob_info->file_info.file); + if (c == EOF) + break; + count++; + } + case 3: + { + c=putc((int) *p++,blob_info->file_info.file); + if (c == EOF) + break; + count++; + } + case 2: + { + c=putc((int) *p++,blob_info->file_info.file); + if (c == EOF) + break; + count++; + } + case 1: + { + c=putc((int) *p++,blob_info->file_info.file); + if (c == EOF) + break; + count++; + } + case 0: + break; + } + if ((count != (ssize_t) length) && + (ferror(blob_info->file_info.file) != 0)) + ThrowBlobException(blob_info); + break; + } + case ZipStream: + { +#if defined(MAGICKCORE_ZLIB_DELEGATE) + int + status; + + switch (length) + { + default: + { + ssize_t + i; + + for (i=0; i < (ssize_t) length; i+=count) + { + count=(ssize_t) gzwrite(blob_info->file_info.gzfile,q+i, + (unsigned int) MagickMin(length-i,MagickMaxBufferExtent)); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + count=i; + break; + } + case 4: + { + c=gzputc(blob_info->file_info.gzfile,(int) *p++); + if (c == EOF) + break; + count++; + } + case 3: + { + c=gzputc(blob_info->file_info.gzfile,(int) *p++); + if (c == EOF) + break; + count++; + } + case 2: + { + c=gzputc(blob_info->file_info.gzfile,(int) *p++); + if (c == EOF) + break; + count++; + } + case 1: + { + c=gzputc(blob_info->file_info.gzfile,(int) *p++); + if (c == EOF) + break; + count++; + } + case 0: + break; + } + status=Z_OK; + (void) gzerror(blob_info->file_info.gzfile,&status); + if ((count != (ssize_t) length) && (status != Z_OK)) + ThrowBlobException(blob_info); +#endif + break; + } + case BZipStream: + { +#if defined(MAGICKCORE_BZLIB_DELEGATE) + int + status; + + ssize_t + i; + + for (i=0; i < (ssize_t) length; i+=count) + { + count=(ssize_t) BZ2_bzwrite(blob_info->file_info.bzfile,q+i, + (int) MagickMin(length-i,MagickMaxBufferExtent)); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + count=i; + status=BZ_OK; + (void) BZ2_bzerror(blob_info->file_info.bzfile,&status); + if ((count != (ssize_t) length) && (status != BZ_OK)) + ThrowBlobException(blob_info); +#endif + break; + } + case FifoStream: + { + count=(ssize_t) blob_info->stream(image,data,length); + break; + } + case BlobStream: + { + if ((blob_info->offset+(MagickOffsetType) length) >= + (MagickOffsetType) blob_info->extent) + { + if (blob_info->mapped != MagickFalse) + return(0); + blob_info->extent+=length+blob_info->quantum; + blob_info->quantum<<=1; + blob_info->data=(unsigned char *) ResizeQuantumMemory( + blob_info->data,blob_info->extent+1,sizeof(*blob_info->data)); + (void) SyncBlob(image); + if (blob_info->data == (unsigned char *) NULL) + { + (void) DetachBlob(blob_info); + return(0); + } + } + q=blob_info->data+blob_info->offset; + (void) memcpy(q,p,length); + blob_info->offset+=length; + if (blob_info->offset >= (MagickOffsetType) blob_info->length) + blob_info->length=(size_t) blob_info->offset; + count=(ssize_t) length; + } + } + if (count != (ssize_t) length) + ThrowBlobException(blob_info); + return(count); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b B y t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobByte() write an integer to a blob. It returns the number of bytes +% written (either 0 or 1); +% +% The format of the WriteBlobByte method is: +% +% ssize_t WriteBlobByte(Image *image,const unsigned char value) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o value: Specifies the value to write. +% +*/ +MagickExport ssize_t WriteBlobByte(Image *image,const unsigned char value) +{ + BlobInfo + *magick_restrict blob_info; + + ssize_t + count; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->type != UndefinedStream); + blob_info=image->blob; + count=0; + switch (blob_info->type) + { + case StandardStream: + case FileStream: + case PipeStream: + { + int + c; + + c=putc((int) value,blob_info->file_info.file); + if (c == EOF) + { + if (ferror(blob_info->file_info.file) != 0) + ThrowBlobException(blob_info); + break; + } + count++; + break; + } + default: + { + count=WriteBlobStream(image,1,&value); + break; + } + } + return(count); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b F l o a t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobFloat() writes a float value as a 32-bit quantity in the byte-order +% specified by the endian member of the image structure. +% +% The format of the WriteBlobFloat method is: +% +% ssize_t WriteBlobFloat(Image *image,const float value) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o value: Specifies the value to write. +% +*/ +MagickExport ssize_t WriteBlobFloat(Image *image,const float value) +{ + union + { + unsigned int + unsigned_value; + + float + float_value; + } quantum; + + quantum.unsigned_value=0U; + quantum.float_value=value; + return(WriteBlobLong(image,quantum.unsigned_value)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobLong() writes a unsigned int value as a 32-bit quantity in the +% byte-order specified by the endian member of the image structure. +% +% The format of the WriteBlobLong method is: +% +% ssize_t WriteBlobLong(Image *image,const unsigned int value) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o value: Specifies the value to write. +% +*/ +MagickExport ssize_t WriteBlobLong(Image *image,const unsigned int value) +{ + unsigned char + buffer[4]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->endian == LSBEndian) + { + buffer[0]=(unsigned char) value; + buffer[1]=(unsigned char) (value >> 8); + buffer[2]=(unsigned char) (value >> 16); + buffer[3]=(unsigned char) (value >> 24); + return(WriteBlobStream(image,4,buffer)); + } + buffer[0]=(unsigned char) (value >> 24); + buffer[1]=(unsigned char) (value >> 16); + buffer[2]=(unsigned char) (value >> 8); + buffer[3]=(unsigned char) value; + return(WriteBlobStream(image,4,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobShort() writes a short value as a 16-bit quantity in the +% byte-order specified by the endian member of the image structure. +% +% The format of the WriteBlobShort method is: +% +% ssize_t WriteBlobShort(Image *image,const unsigned short value) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o value: Specifies the value to write. +% +*/ +MagickExport ssize_t WriteBlobShort(Image *image,const unsigned short value) +{ + unsigned char + buffer[2]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->endian == LSBEndian) + { + buffer[0]=(unsigned char) value; + buffer[1]=(unsigned char) (value >> 8); + return(WriteBlobStream(image,2,buffer)); + } + buffer[0]=(unsigned char) (value >> 8); + buffer[1]=(unsigned char) value; + return(WriteBlobStream(image,2,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b L S B L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobLSBLong() writes a unsigned int value as a 32-bit quantity in +% least-significant byte first order. +% +% The format of the WriteBlobLSBLong method is: +% +% ssize_t WriteBlobLSBLong(Image *image,const unsigned int value) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o value: Specifies the value to write. +% +*/ +MagickExport ssize_t WriteBlobLSBLong(Image *image,const unsigned int value) +{ + unsigned char + buffer[4]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + buffer[0]=(unsigned char) value; + buffer[1]=(unsigned char) (value >> 8); + buffer[2]=(unsigned char) (value >> 16); + buffer[3]=(unsigned char) (value >> 24); + return(WriteBlobStream(image,4,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b L S B S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobLSBShort() writes a unsigned short value as a 16-bit quantity in +% least-significant byte first order. +% +% The format of the WriteBlobLSBShort method is: +% +% ssize_t WriteBlobLSBShort(Image *image,const unsigned short value) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o value: Specifies the value to write. +% +*/ +MagickExport ssize_t WriteBlobLSBShort(Image *image,const unsigned short value) +{ + unsigned char + buffer[2]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + buffer[0]=(unsigned char) value; + buffer[1]=(unsigned char) (value >> 8); + return(WriteBlobStream(image,2,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b L S B S i g n e d L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobLSBSignedLong() writes a signed value as a 32-bit quantity in +% least-significant byte first order. +% +% The format of the WriteBlobLSBSignedLong method is: +% +% ssize_t WriteBlobLSBSignedLong(Image *image,const signed int value) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o value: Specifies the value to write. +% +*/ +MagickExport ssize_t WriteBlobLSBSignedLong(Image *image,const signed int value) +{ + union + { + unsigned int + unsigned_value; + + signed int + signed_value; + } quantum; + + unsigned char + buffer[4]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + quantum.signed_value=value; + buffer[0]=(unsigned char) quantum.unsigned_value; + buffer[1]=(unsigned char) (quantum.unsigned_value >> 8); + buffer[2]=(unsigned char) (quantum.unsigned_value >> 16); + buffer[3]=(unsigned char) (quantum.unsigned_value >> 24); + return(WriteBlobStream(image,4,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b L S B S i g n e d S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobLSBSignedShort() writes a signed short value as a 16-bit quantity +% in least-significant byte first order. +% +% The format of the WriteBlobLSBSignedShort method is: +% +% ssize_t WriteBlobLSBSignedShort(Image *image,const signed short value) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o value: Specifies the value to write. +% +*/ +MagickExport ssize_t WriteBlobLSBSignedShort(Image *image, + const signed short value) +{ + union + { + unsigned short + unsigned_value; + + signed short + signed_value; + } quantum; + + unsigned char + buffer[2]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + quantum.signed_value=value; + buffer[0]=(unsigned char) quantum.unsigned_value; + buffer[1]=(unsigned char) (quantum.unsigned_value >> 8); + return(WriteBlobStream(image,2,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b M S B L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobMSBLong() writes a unsigned int value as a 32-bit quantity in +% most-significant byte first order. +% +% The format of the WriteBlobMSBLong method is: +% +% ssize_t WriteBlobMSBLong(Image *image,const unsigned int value) +% +% A description of each parameter follows. +% +% o value: Specifies the value to write. +% +% o image: the image. +% +*/ +MagickExport ssize_t WriteBlobMSBLong(Image *image,const unsigned int value) +{ + unsigned char + buffer[4]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + buffer[0]=(unsigned char) (value >> 24); + buffer[1]=(unsigned char) (value >> 16); + buffer[2]=(unsigned char) (value >> 8); + buffer[3]=(unsigned char) value; + return(WriteBlobStream(image,4,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b M S B L o n g L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobMSBLongLong() writes a long long value as a 64-bit quantity in +% most-significant byte first order. +% +% The format of the WriteBlobMSBLongLong method is: +% +% ssize_t WriteBlobMSBLongLong(Image *image,const MagickSizeType value) +% +% A description of each parameter follows. +% +% o value: Specifies the value to write. +% +% o image: the image. +% +*/ +MagickExport ssize_t WriteBlobMSBLongLong(Image *image, + const MagickSizeType value) +{ + unsigned char + buffer[8]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + buffer[0]=(unsigned char) (value >> 56); + buffer[1]=(unsigned char) (value >> 48); + buffer[2]=(unsigned char) (value >> 40); + buffer[3]=(unsigned char) (value >> 32); + buffer[4]=(unsigned char) (value >> 24); + buffer[5]=(unsigned char) (value >> 16); + buffer[6]=(unsigned char) (value >> 8); + buffer[7]=(unsigned char) value; + return(WriteBlobStream(image,8,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b M S B S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobMSBShort() writes a unsigned short value as a 16-bit quantity in +% most-significant byte first order. +% +% The format of the WriteBlobMSBShort method is: +% +% ssize_t WriteBlobMSBShort(Image *image,const unsigned short value) +% +% A description of each parameter follows. +% +% o value: Specifies the value to write. +% +% o file: Specifies the file to write the data to. +% +*/ +MagickExport ssize_t WriteBlobMSBShort(Image *image,const unsigned short value) +{ + unsigned char + buffer[2]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + buffer[0]=(unsigned char) (value >> 8); + buffer[1]=(unsigned char) value; + return(WriteBlobStream(image,2,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b M S B S i g n e d L o n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobMSBSignedLong() writes a signed value as a 32-bit quantity in +% most-significant byte first order. +% +% The format of the WriteBlobMSBSignedLong method is: +% +% ssize_t WriteBlobMSBSignedLong(Image *image,const signed int value) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o value: Specifies the value to write. +% +*/ +MagickExport ssize_t WriteBlobMSBSignedLong(Image *image,const signed int value) +{ + union + { + unsigned int + unsigned_value; + + signed int + signed_value; + } quantum; + + unsigned char + buffer[4]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + quantum.signed_value=value; + buffer[0]=(unsigned char) (quantum.unsigned_value >> 24); + buffer[1]=(unsigned char) (quantum.unsigned_value >> 16); + buffer[2]=(unsigned char) (quantum.unsigned_value >> 8); + buffer[3]=(unsigned char) quantum.unsigned_value; + return(WriteBlobStream(image,4,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b M S B S i g n e d S h o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobMSBSignedShort() writes a signed short value as a 16-bit quantity +% in most-significant byte first order. +% +% The format of the WriteBlobMSBSignedShort method is: +% +% ssize_t WriteBlobMSBSignedShort(Image *image,const signed short value) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o value: Specifies the value to write. +% +*/ +MagickExport ssize_t WriteBlobMSBSignedShort(Image *image, + const signed short value) +{ + union + { + unsigned short + unsigned_value; + + signed short + signed_value; + } quantum; + + unsigned char + buffer[2]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + quantum.signed_value=value; + buffer[0]=(unsigned char) (quantum.unsigned_value >> 8); + buffer[1]=(unsigned char) quantum.unsigned_value; + return(WriteBlobStream(image,2,buffer)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e B l o b S t r i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteBlobString() write a string to a blob. It returns the number of +% characters written. +% +% The format of the WriteBlobString method is: +% +% ssize_t WriteBlobString(Image *image,const char *string) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o string: Specifies the string to write. +% +*/ +MagickExport ssize_t WriteBlobString(Image *image,const char *string) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(string != (const char *) NULL); + return(WriteBlobStream(image,strlen(string),(const unsigned char *) string)); +} diff --git a/ImageMagick-6.9.12-44/magick/blob.h b/ImageMagick-6.9.12-44/magick/blob.h new file mode 100644 index 0000000..f4596ae --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/blob.h @@ -0,0 +1,78 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore Binary Large OBjects methods. +*/ +#ifndef MAGICKCORE_BLOB_H +#define MAGICKCORE_BLOB_H + +#include "magick/image.h" +#include "magick/stream.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define MagickMaxBufferExtent 81920 +#define MagickMinBufferExtent 16384 + +typedef enum +{ + ReadMode, + WriteMode, + IOMode, + PersistMode +} MapMode; + +extern MagickExport FILE + *GetBlobFileHandle(const Image *) magick_attribute((__pure__)); + +extern MagickExport Image + *BlobToImage(const ImageInfo *,const void *,const size_t,ExceptionInfo *), + *PingBlob(const ImageInfo *,const void *,const size_t,ExceptionInfo *); + +extern MagickExport MagickBooleanType + BlobToFile(char *,const void *,const size_t,ExceptionInfo *), + FileToImage(Image *,const char *), + GetBlobError(const Image *) magick_attribute((__pure__)), + ImageToFile(Image *,char *,ExceptionInfo *), + InjectImageBlob(const ImageInfo *,Image *,Image *,const char *, + ExceptionInfo *), + IsBlobExempt(const Image *) magick_attribute((__pure__)), + IsBlobSeekable(const Image *) magick_attribute((__pure__)), + IsBlobTemporary(const Image *) magick_attribute((__pure__)); + +extern MagickExport MagickSizeType + GetBlobSize(const Image *); + +extern MagickExport StreamHandler + GetBlobStreamHandler(const Image *) magick_attribute((__pure__)); + +extern MagickExport unsigned char + *FileToBlob(const char *,const size_t,size_t *,ExceptionInfo *), + *GetBlobStreamData(const Image *) magick_attribute((__pure__)), + *ImageToBlob(const ImageInfo *,Image *,size_t *,ExceptionInfo *), + *ImagesToBlob(const ImageInfo *,Image *,size_t *,ExceptionInfo *); + +extern MagickExport void + DestroyBlob(Image *), + DuplicateBlob(Image *,const Image *), + SetBlobExempt(Image *,const MagickBooleanType); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/cache-private.h b/ImageMagick-6.9.12-44/magick/cache-private.h new file mode 100644 index 0000000..9352d4b --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/cache-private.h @@ -0,0 +1,327 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore cache private methods. +*/ +#ifndef MAGICKCORE_CACHE_PRIVATE_H +#define MAGICKCORE_CACHE_PRIVATE_H + +#include +#include "magick/cache.h" +#include "magick/distribute-cache.h" +#include "magick/opencl-private.h" +#include "magick/random_.h" +#include "magick/thread-private.h" +#include "magick/semaphore.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef void + *Cache; + +typedef const IndexPacket + *(*GetVirtualIndexesFromHandler)(const Image *); + +typedef IndexPacket + *(*GetAuthenticIndexesFromHandler)(const Image *); + +typedef MagickBooleanType + (*GetOneAuthenticPixelFromHandler)(Image *,const ssize_t,const ssize_t, + PixelPacket *,ExceptionInfo *), + (*GetOneVirtualPixelFromHandler)(const Image *,const VirtualPixelMethod, + const ssize_t,const ssize_t,PixelPacket *,ExceptionInfo *), + (*SyncAuthenticPixelsHandler)(Image *,ExceptionInfo *); + +typedef const PixelPacket + *(*GetVirtualPixelHandler)(const Image *,const VirtualPixelMethod, + const ssize_t,const ssize_t,const size_t,const size_t,ExceptionInfo *), + *(*GetVirtualPixelsHandler)(const Image *); + +typedef PixelPacket + *(*GetAuthenticPixelsHandler)(Image *,const ssize_t,const ssize_t, + const size_t,const size_t,ExceptionInfo *); + +typedef PixelPacket + *(*GetAuthenticPixelsFromHandler)(const Image *); + +typedef PixelPacket + *(*QueueAuthenticPixelsHandler)(Image *,const ssize_t,const ssize_t, + const size_t,const size_t,ExceptionInfo *); + +typedef void + (*DestroyPixelHandler)(Image *); + +typedef struct _CacheMethods +{ + GetVirtualPixelHandler + get_virtual_pixel_handler; + + GetVirtualPixelsHandler + get_virtual_pixels_handler; + + GetVirtualIndexesFromHandler + get_virtual_indexes_from_handler; + + GetOneVirtualPixelFromHandler + get_one_virtual_pixel_from_handler; + + GetAuthenticPixelsHandler + get_authentic_pixels_handler; + + GetAuthenticIndexesFromHandler + get_authentic_indexes_from_handler; + + GetOneAuthenticPixelFromHandler + get_one_authentic_pixel_from_handler; + + GetAuthenticPixelsFromHandler + get_authentic_pixels_from_handler; + + QueueAuthenticPixelsHandler + queue_authentic_pixels_handler; + + SyncAuthenticPixelsHandler + sync_authentic_pixels_handler; + + DestroyPixelHandler + destroy_pixel_handler; +} CacheMethods; + +typedef struct _NexusInfo +{ + MagickBooleanType + mapped; + + RectangleInfo + region; + + MagickSizeType + length; + + PixelPacket + *cache, + *pixels; + + MagickBooleanType + authentic_pixel_cache; + + IndexPacket + *indexes; + + size_t + signature; + + struct _NexusInfo + *virtual_nexus; +} NexusInfo; + +typedef struct _OpenCLCacheInfo +{ + cl_event + *events; + + cl_mem + buffer; + + cl_uint + event_count; + + MagickSizeType + length; + + PixelPacket + *pixels; + + SemaphoreInfo + *events_semaphore; +} OpenCLCacheInfo; + +typedef struct _CacheInfo +{ + ClassType + storage_class; + + ColorspaceType + colorspace; + + size_t + channels; + + CacheType + type; + + MapMode + mode, + disk_mode; + + MagickBooleanType + mapped; + + size_t + columns, + rows; + + MagickOffsetType + offset; + + MagickSizeType + length; + + VirtualPixelMethod + virtual_pixel_method; + + MagickPixelPacket + virtual_pixel_color; + + size_t + number_threads; + + NexusInfo + **nexus_info; + + PixelPacket + *pixels; + + IndexPacket + *indexes; + + MagickBooleanType + active_index_channel; + + int + file; + + char + filename[MaxTextExtent], + cache_filename[MaxTextExtent]; + + CacheMethods + methods; + + RandomInfo + *random_info; + + size_t + number_connections; + + void + *server_info; + + MagickBooleanType + synchronize, + debug; + + MagickThreadType + id; + + ssize_t + reference_count; + + SemaphoreInfo + *semaphore, + *file_semaphore; + + time_t + timestamp; + + size_t + signature; + + OpenCLCacheInfo + *opencl; + + MagickSizeType + width_limit, + height_limit; +} CacheInfo; + +extern MagickExport Cache + AcquirePixelCache(const size_t), + ClonePixelCache(const Cache), + DestroyPixelCache(Cache), + ReferencePixelCache(Cache); + +extern MagickExport CacheType + GetPixelCacheType(const Image *); + +extern MagickExport ClassType + GetPixelCacheStorageClass(const Cache); + +extern MagickExport ColorspaceType + GetPixelCacheColorspace(const Cache); + +extern MagickExport const IndexPacket + *GetVirtualIndexesFromNexus(const Cache,NexusInfo *); + +extern MagickExport const PixelPacket + *GetVirtualPixelCacheNexus(const Image *,const VirtualPixelMethod, + const ssize_t,const ssize_t,const size_t,const size_t,NexusInfo *, + ExceptionInfo *) magick_hot_spot, + *GetVirtualPixelsNexus(const Cache,NexusInfo *); + +extern MagickExport MagickBooleanType + SyncAuthenticPixelCacheNexus(Image *,NexusInfo *magick_restrict, + ExceptionInfo *) magick_hot_spot; + +extern MagickExport MagickSizeType + GetPixelCacheNexusExtent(const Cache,NexusInfo *); + +extern MagickExport NexusInfo + **AcquirePixelCacheNexus(const size_t), + **DestroyPixelCacheNexus(NexusInfo **,const size_t); + +extern MagickExport PixelPacket + *GetAuthenticPixelCacheNexus(Image *,const ssize_t,const ssize_t, + const size_t,const size_t,NexusInfo *,ExceptionInfo *) magick_hot_spot, + *QueueAuthenticPixel(Image *,const ssize_t,const ssize_t,const size_t, + const size_t,const MagickBooleanType,NexusInfo *,ExceptionInfo *), + *QueueAuthenticPixelCacheNexus(Image *,const ssize_t,const ssize_t, + const size_t,const size_t,const MagickBooleanType,NexusInfo *, + ExceptionInfo *) magick_hot_spot; + +extern MagickExport size_t + GetPixelCacheChannels(const Cache); + +extern MagickExport void + ClonePixelCacheMethods(Cache,const Cache), + GetPixelCacheTileSize(const Image *,size_t *,size_t *), + GetPixelCacheMethods(CacheMethods *), + SetPixelCacheMethods(Cache,CacheMethods *); + +extern MagickPrivate void + ResetPixelCacheEpoch(void); + +extern MagickPrivate MagickBooleanType + SyncImagePixelCache(Image *,ExceptionInfo *); + +#if defined(MAGICKCORE_OPENCL_SUPPORT) +extern MagickPrivate cl_event + *GetOpenCLEvents(const Image *,cl_uint *); + +extern MagickPrivate cl_mem + GetAuthenticOpenCLBuffer(const Image *,ExceptionInfo *); + +extern MagickPrivate void + AddOpenCLEvent(const Image *,cl_event), + SyncAuthenticOpenCLBuffer(const Image *); +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/cache-view.c b/ImageMagick-6.9.12-44/magick/cache-view.c new file mode 100644 index 0000000..0d03cc2 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/cache-view.c @@ -0,0 +1,1011 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC AAA CCCC H H EEEEE % +% C A A C H H E % +% C AAAAA C HHHHH EEE % +% C A A C H H E % +% CCCC A A CCCC H H EEEEE % +% % +% V V IIIII EEEEE W W % +% V V I E W W % +% V V I EEE W W W % +% V V I E WW WW % +% V IIIII EEEEE W W % +% % +% % +% MagickCore Cache View Methods % +% % +% Software Design % +% Cristy % +% February 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/cache.h" +#include "magick/cache-private.h" +#include "magick/cache-view.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/resource_.h" +#include "magick/string_.h" +#include "magick/thread-private.h" + +/* + Typedef declarations. +*/ +struct _CacheView +{ + Image + *image; + + VirtualPixelMethod + virtual_pixel_method; + + size_t + number_threads; + + NexusInfo + **nexus_info; + + MagickBooleanType + debug; + + size_t + signature; +}; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e A u t h e n t i c C a c h e V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireAuthenticCacheView() acquires an authentic view into the pixel cache. +% +% The format of the AcquireAuthenticCacheView method is: +% +% CacheView *AcquireAuthenticCacheView(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport CacheView *AcquireAuthenticCacheView(const Image *image, + ExceptionInfo *exception) +{ + CacheView + *magick_restrict cache_view; + + cache_view=AcquireVirtualCacheView(image,exception); + return(cache_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e V i r t u a l C a c h e V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireVirtualCacheView() acquires a virtual view into the pixel cache, +% using the VirtualPixelMethod that is defined within the given image itself. +% +% The format of the AcquireVirtualCacheView method is: +% +% CacheView *AcquireVirtualCacheView(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport CacheView *AcquireCacheView(const Image *image) +{ + return(AcquireVirtualCacheView(image,&((Image *) image)->exception)); +} + +MagickExport CacheView *AcquireVirtualCacheView(const Image *image, + ExceptionInfo *exception) +{ + CacheView + *magick_restrict cache_view; + + magick_unreferenced(exception); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); +#if defined(MAGICKCORE_OPENCL_SUPPORT) + SyncAuthenticOpenCLBuffer(image); +#endif + cache_view=(CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1, + sizeof(*cache_view))); + if (cache_view == (CacheView *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(cache_view,0,sizeof(*cache_view)); + cache_view->image=ReferenceImage((Image *) image); + cache_view->number_threads=GetOpenMPMaximumThreads(); + if (GetMagickResourceLimit(ThreadResource) > cache_view->number_threads) + cache_view->number_threads=(size_t) GetMagickResourceLimit(ThreadResource); + if (cache_view->number_threads == 0) + cache_view->number_threads=1; + cache_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads); + cache_view->virtual_pixel_method=GetImageVirtualPixelMethod(image); + cache_view->debug=IsEventLogging(); + cache_view->signature=MagickCoreSignature; + if (cache_view->nexus_info == (NexusInfo **) NULL) + ThrowFatalException(CacheFatalError,"UnableToAcquireCacheView"); + return(cache_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e C a c h e V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneCacheView() makes an exact copy of the specified cache view. +% +% The format of the CloneCacheView method is: +% +% CacheView *CloneCacheView(const CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport CacheView *CloneCacheView(const CacheView *cache_view) +{ + CacheView + *magick_restrict clone_view; + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + if (cache_view->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_view->image->filename); + clone_view=(CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1, + sizeof(*clone_view))); + if (clone_view == (CacheView *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(clone_view,0,sizeof(*clone_view)); + clone_view->image=ReferenceImage(cache_view->image); + clone_view->number_threads=cache_view->number_threads; + clone_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads); + clone_view->virtual_pixel_method=cache_view->virtual_pixel_method; + clone_view->debug=cache_view->debug; + clone_view->signature=MagickCoreSignature; + return(clone_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y C a c h e V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyCacheView() destroys the specified view returned by a previous call +% to AcquireVirtualCacheView(). +% +% The format of the DestroyCacheView method is: +% +% CacheView *DestroyCacheView(CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport CacheView *DestroyCacheView(CacheView *cache_view) +{ + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + if (cache_view->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_view->image->filename); + if (cache_view->nexus_info != (NexusInfo **) NULL) + cache_view->nexus_info=DestroyPixelCacheNexus(cache_view->nexus_info, + cache_view->number_threads); + cache_view->image=DestroyImage(cache_view->image); + cache_view->signature=(~MagickCoreSignature); + cache_view=(CacheView *) RelinquishAlignedMemory(cache_view); + return(cache_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C a c h e V i e w C h a n n e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewChannels() returns the image pixel channels associated with +% the specified view. +% +% The format of the GetCacheViewChannels method is: +% +% size_t GetCacheViewChannels(const CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport size_t GetCacheViewChannels(const CacheView *cache_view) +{ + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + if (cache_view->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_view->image->filename); + return(GetPixelCacheChannels(cache_view->image->cache)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C a c h e V i e w C o l o r s p a c e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewColorspace() returns the image colorspace associated with the +% specified view. +% +% The format of the GetCacheViewColorspace method is: +% +% ColorspaceType GetCacheViewColorspace(const CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport ColorspaceType GetCacheViewColorspace(const CacheView *cache_view) +{ + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + if (cache_view->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_view->image->filename); + return(GetPixelCacheColorspace(cache_view->image->cache)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C a c h e V i e w E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewException() returns the image exception associated with the +% specified view. +% +% The format of the GetCacheViewException method is: +% +% ExceptionInfo GetCacheViewException(const CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport ExceptionInfo *GetCacheViewException(const CacheView *cache_view) +{ + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + if (cache_view->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_view->image->filename); + return(&cache_view->image->exception); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t C a c h e V i e w E x t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewExtent() returns the extent of the pixels associated with the +% last call to QueueCacheViewAuthenticPixels() or +% GetCacheViewAuthenticPixels(). +% +% The format of the GetCacheViewExtent() method is: +% +% MagickSizeType GetCacheViewExtent(const CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport MagickSizeType GetCacheViewExtent(const CacheView *cache_view) +{ + const int + id = GetOpenMPThreadId(); + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + if (cache_view->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_view->image->filename); + assert(cache_view->image->cache != (Cache) NULL); + assert(id < (int) cache_view->number_threads); + return(GetPixelCacheNexusExtent(cache_view->image->cache, + cache_view->nexus_info[id])); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C a c h e V i e w S t o r a g e C l a s s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewStorageClass() returns the image storage class associated with +% the specified view. +% +% The format of the GetCacheViewStorageClass method is: +% +% ClassType GetCacheViewStorageClass(const CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport ClassType GetCacheViewStorageClass(const CacheView *cache_view) +{ + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + if (cache_view->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_view->image->filename); + return(GetPixelCacheStorageClass(cache_view->image->cache)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C a c h e V i e w A u t h e n t i c P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewAuthenticPixels() gets pixels from the in-memory or disk pixel +% cache as defined by the geometry parameters. A pointer to the pixels is +% returned if the pixels are transferred, otherwise a NULL is returned. +% +% The format of the GetCacheViewAuthenticPixels method is: +% +% PixelPacket *GetCacheViewAuthenticPixels(CacheView *cache_view, +% const ssize_t x,const ssize_t y,const size_t columns, +% const size_t rows,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +*/ +MagickExport PixelPacket *GetCacheViewAuthenticPixels(CacheView *cache_view, + const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, + ExceptionInfo *exception) +{ + const int + id = GetOpenMPThreadId(); + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + assert(id < (int) cache_view->number_threads); + return(GetAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows, + cache_view->nexus_info[id],exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t O n e C a c h e V i e w A u t h e n t i c P i x e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOneCacheViewAuthenticPixel() returns a single pixel at the specified (x,y) +% location. The image background color is returned if an error occurs. +% +% The format of the GetOneCacheViewAuthenticPixel method is: +% +% MagickBooleaNType GetOneCacheViewAuthenticPixel( +% const CacheView *cache_view,const ssize_t x,const ssize_t y, +% PixelPacket *pixel,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +% o x,y: These values define the offset of the pixel. +% +% o pixel: return a pixel at the specified (x,y) location. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel( + const CacheView *magick_restrict cache_view,const ssize_t x,const ssize_t y, + PixelPacket *magick_restrict pixel,ExceptionInfo *exception) +{ + const int + id = GetOpenMPThreadId(); + + PixelPacket + *magick_restrict pixels; + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + *pixel=cache_view->image->background_color; + assert(id < (int) cache_view->number_threads); + pixels=GetAuthenticPixelCacheNexus(cache_view->image,x,y,1,1, + cache_view->nexus_info[id],exception); + if (pixels == (const PixelPacket *) NULL) + return(MagickFalse); + *pixel=(*pixels); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C a c h e V i e w A u t h e n t i c I n d e x Q u e u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewAuthenticIndexQueue() returns the indexes associated with the +% last call to SetCacheViewIndexes() or GetCacheViewAuthenticIndexQueue(). The +% indexes are authentic and can be updated. +% +% The format of the GetCacheViewAuthenticIndexQueue() method is: +% +% IndexPacket *GetCacheViewAuthenticIndexQueue(CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport IndexPacket *GetCacheViewAuthenticIndexQueue(CacheView *cache_view) +{ + const int + id = GetOpenMPThreadId(); + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + assert(cache_view->image->cache != (Cache) NULL); + assert(id < (int) cache_view->number_threads); + return(cache_view->nexus_info[id]->indexes); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C a c h e V i e w A u t h e n t i c P i x e l Q u e u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewAuthenticPixelQueue() returns the pixels associated with the +% last call to QueueCacheViewAuthenticPixels() or +% GetCacheViewAuthenticPixels(). The pixels are authentic and therefore can be +% updated. +% +% The format of the GetCacheViewAuthenticPixelQueue() method is: +% +% PixelPacket *GetCacheViewAuthenticPixelQueue(CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport PixelPacket *GetCacheViewAuthenticPixelQueue(CacheView *cache_view) +{ + const int + id = GetOpenMPThreadId(); + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + assert(cache_view->image->cache != (Cache) NULL); + assert(id < (int) cache_view->number_threads); + return(cache_view->nexus_info[id]->pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C a c h e V i e w V i r t u a l I n d e x Q u e u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewVirtualIndexQueue() returns the indexes associated with the +% last call to GetCacheViewVirtualIndexQueue(). The indexes are virtual and +% therefore cannot be updated. +% +% The format of the GetCacheViewVirtualIndexQueue() method is: +% +% const IndexPacket *GetCacheViewVirtualIndexQueue( +% const CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport const IndexPacket *GetCacheViewVirtualIndexQueue( + const CacheView *cache_view) +{ + const int + id = GetOpenMPThreadId(); + + assert(cache_view != (const CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + assert(cache_view->image->cache != (Cache) NULL); + assert(id < (int) cache_view->number_threads); + return(GetVirtualIndexesFromNexus(cache_view->image->cache, + cache_view->nexus_info[id])); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C a c h e V i e w V i r t u a l P i x e l Q u e u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewVirtualPixelQueue() returns the pixels associated with +% the last call to GetCacheViewVirtualPixels(). The pixels are virtual +% and therefore cannot be updated. +% +% The format of the GetCacheViewVirtualPixelQueue() method is: +% +% const PixelPacket *GetCacheViewVirtualPixelQueue( +% const CacheView *cache_view) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +*/ +MagickExport const PixelPacket *GetCacheViewVirtualPixelQueue( + const CacheView *cache_view) +{ + const int + id = GetOpenMPThreadId(); + + assert(cache_view != (const CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + assert(cache_view->image->cache != (Cache) NULL); + assert(id < (int) cache_view->number_threads); + return(GetVirtualPixelsNexus(cache_view->image->cache, + cache_view->nexus_info[id])); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C a c h e V i e w V i r t u a l P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCacheViewVirtualPixels() gets virtual pixels from the in-memory or +% disk pixel cache as defined by the geometry parameters. A pointer to the +% pixels is returned if the pixels are transferred, otherwise a NULL is +% returned. +% +% The format of the GetCacheViewVirtualPixels method is: +% +% const PixelPacket *GetCacheViewVirtualPixels( +% const CacheView *cache_view,const ssize_t x,const ssize_t y, +% const size_t columns,const size_t rows,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport const PixelPacket *GetCacheViewVirtualPixels( + const CacheView *cache_view,const ssize_t x,const ssize_t y, + const size_t columns,const size_t rows,ExceptionInfo *exception) +{ + const int + id = GetOpenMPThreadId(); + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + assert(id < (int) cache_view->number_threads); + return(GetVirtualPixelCacheNexus(cache_view->image, + cache_view->virtual_pixel_method,x,y,columns,rows, + cache_view->nexus_info[id],exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t O n e C a c h e V i e w V i r t u a l P i x e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOneCacheViewVirtualPixel() returns a single pixel at the specified (x,y) +% location. The image background color is returned if an error occurs. If +% you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead. +% +% The format of the GetOneCacheViewVirtualPixel method is: +% +% MagickBooleanType GetOneCacheViewVirtualPixel( +% const CacheView *cache_view,const ssize_t x,const ssize_t y, +% PixelPacket *pixel,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +% o x,y: These values define the offset of the pixel. +% +% o pixel: return a pixel at the specified (x,y) location. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType GetOneCacheViewVirtualPixel( + const CacheView *magick_restrict cache_view,const ssize_t x,const ssize_t y, + PixelPacket *magick_restrict pixel,ExceptionInfo *exception) +{ + const int + id = GetOpenMPThreadId(); + + const PixelPacket + *magick_restrict pixels; + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + *pixel=cache_view->image->background_color; + assert(id < (int) cache_view->number_threads); + pixels=GetVirtualPixelCacheNexus(cache_view->image, + cache_view->virtual_pixel_method,x,y,1,1,cache_view->nexus_info[id], + exception); + if (pixels == (const PixelPacket *) NULL) + return(MagickFalse); + *pixel=(*pixels); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t O n e C a c h e V i e w V i r t u a l P i x e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOneCacheViewVirtualMethodPixel() returns a single virtual pixel at +% the specified (x,y) location. The image background color is returned if an +% error occurs. If you plan to modify the pixel, use +% GetOneCacheViewAuthenticPixel() instead. +% +% The format of the GetOneCacheViewVirtualPixel method is: +% +% MagickBooleanType GetOneCacheViewVirtualMethodPixel( +% const CacheView *cache_view, +% const VirtualPixelMethod virtual_pixel_method,const ssize_t x, +% const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +% o virtual_pixel_method: the virtual pixel method. +% +% o x,y: These values define the offset of the pixel. +% +% o pixel: return a pixel at the specified (x,y) location. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType GetOneCacheViewVirtualMethodPixel( + const CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method, + const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception) +{ + const int + id = GetOpenMPThreadId(); + + const PixelPacket + *magick_restrict pixels; + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + *pixel=cache_view->image->background_color; + assert(id < (int) cache_view->number_threads); + pixels=GetVirtualPixelCacheNexus(cache_view->image,virtual_pixel_method,x,y,1, + 1,cache_view->nexus_info[id],exception); + if (pixels == (const PixelPacket *) NULL) + return(MagickFalse); + *pixel=(*pixels); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% Q u e u e C a c h e V i e w A u t h e n t i c P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% QueueCacheViewAuthenticPixels() queues authentic pixels from the in-memory or +% disk pixel cache as defined by the geometry parameters. A pointer to the +% pixels is returned if the pixels are transferred, otherwise a NULL is +% returned. +% +% The format of the QueueCacheViewAuthenticPixels method is: +% +% PixelPacket *QueueCacheViewAuthenticPixels(CacheView *cache_view, +% const ssize_t x,const ssize_t y,const size_t columns, +% const size_t rows,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport PixelPacket *QueueCacheViewAuthenticPixels(CacheView *cache_view, + const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, + ExceptionInfo *exception) +{ + const int + id = GetOpenMPThreadId(); + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + assert(id < (int) cache_view->number_threads); + return(QueueAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows, + MagickFalse,cache_view->nexus_info[id],exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t C a c h e V i e w S t o r a g e C l a s s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetCacheViewStorageClass() sets the image storage class associated with +% the specified view. +% +% The format of the SetCacheViewStorageClass method is: +% +% MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view, +% const ClassType storage_class) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +% o storage_class: the image storage class: PseudoClass or DirectClass. +% +*/ +MagickExport MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view, + const ClassType storage_class) +{ + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + if (cache_view->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_view->image->filename); + return(SetImageStorageClass(cache_view->image,storage_class)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t C a c h e V i e w V i r t u a l P i x e l M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetCacheViewVirtualPixelMethod() sets the virtual pixel method associated +% with the specified cache view. +% +% The format of the SetCacheViewVirtualPixelMethod method is: +% +% MagickBooleanType SetCacheViewVirtualPixelMethod(CacheView *cache_view, +% const VirtualPixelMethod virtual_pixel_method) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +% o virtual_pixel_method: the virtual pixel method. +% +*/ +MagickExport MagickBooleanType SetCacheViewVirtualPixelMethod( + CacheView *magick_restrict cache_view, + const VirtualPixelMethod virtual_pixel_method) +{ + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + if (cache_view->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_view->image->filename); + cache_view->virtual_pixel_method=virtual_pixel_method; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S y n c C a c h e V i e w A u t h e n t i c P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncCacheViewAuthenticPixels() saves the cache view pixels to the in-memory +% or disk cache. It returns MagickTrue if the pixel region is flushed, +% otherwise MagickFalse. +% +% The format of the SyncCacheViewAuthenticPixels method is: +% +% MagickBooleanType SyncCacheViewAuthenticPixels(CacheView *cache_view, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_view: the cache view. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType SyncCacheViewAuthenticPixels( + CacheView *magick_restrict cache_view,ExceptionInfo *exception) +{ + const int + id = GetOpenMPThreadId(); + + assert(cache_view != (CacheView *) NULL); + assert(cache_view->signature == MagickCoreSignature); + assert(id < (int) cache_view->number_threads); + return(SyncAuthenticPixelCacheNexus(cache_view->image, + cache_view->nexus_info[id],exception)); +} diff --git a/ImageMagick-6.9.12-44/magick/cache-view.h b/ImageMagick-6.9.12-44/magick/cache-view.h new file mode 100644 index 0000000..3d20493 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/cache-view.h @@ -0,0 +1,111 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore cache view methods. +*/ +#ifndef MAGICKCORE_CACHE_VIEW_H +#define MAGICKCORE_CACHE_VIEW_H + +#include "magick/pixel.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef enum +{ + UndefinedVirtualPixelMethod, + BackgroundVirtualPixelMethod, + ConstantVirtualPixelMethod, /* deprecated */ + DitherVirtualPixelMethod, + EdgeVirtualPixelMethod, + MirrorVirtualPixelMethod, + RandomVirtualPixelMethod, + TileVirtualPixelMethod, + TransparentVirtualPixelMethod, + MaskVirtualPixelMethod, + BlackVirtualPixelMethod, + GrayVirtualPixelMethod, + WhiteVirtualPixelMethod, + HorizontalTileVirtualPixelMethod, + VerticalTileVirtualPixelMethod, + HorizontalTileEdgeVirtualPixelMethod, + VerticalTileEdgeVirtualPixelMethod, + CheckerTileVirtualPixelMethod +} VirtualPixelMethod; + +typedef struct _CacheView + CacheView; + +extern MagickExport CacheView + *AcquireAuthenticCacheView(const Image *,ExceptionInfo *), + *AcquireCacheView(const Image *), + *AcquireVirtualCacheView(const Image *,ExceptionInfo *), + *CloneCacheView(const CacheView *), + *DestroyCacheView(CacheView *); + +extern MagickExport ClassType + GetCacheViewStorageClass(const CacheView *) magick_attribute((__pure__)); + +extern MagickExport ColorspaceType + GetCacheViewColorspace(const CacheView *) magick_attribute((__pure__)); + +extern MagickExport const IndexPacket + *GetCacheViewVirtualIndexQueue(const CacheView *) + magick_attribute((__pure__)); + +extern MagickExport const PixelPacket + *GetCacheViewVirtualPixels(const CacheView *,const ssize_t,const ssize_t, + const size_t,const size_t,ExceptionInfo *) magick_hot_spot, + *GetCacheViewVirtualPixelQueue(const CacheView *) magick_hot_spot; + +extern MagickExport ExceptionInfo + *GetCacheViewException(const CacheView *) magick_attribute((__pure__)); + +extern MagickExport IndexPacket + *GetCacheViewAuthenticIndexQueue(CacheView *) magick_attribute((__pure__)); + +extern MagickExport MagickBooleanType + GetOneCacheViewAuthenticPixel(const CacheView *magick_restrict,const ssize_t, + const ssize_t,PixelPacket *magick_restrict,ExceptionInfo *), + GetOneCacheViewVirtualMethodPixel(const CacheView *, + const VirtualPixelMethod,const ssize_t,const ssize_t,PixelPacket *, + ExceptionInfo *), + GetOneCacheViewVirtualPixel(const CacheView *magick_restrict,const ssize_t, + const ssize_t,PixelPacket *magick_restrict,ExceptionInfo *), + SetCacheViewStorageClass(CacheView *,const ClassType), + SetCacheViewVirtualPixelMethod(CacheView *magick_restrict, + const VirtualPixelMethod), + SyncCacheViewAuthenticPixels(CacheView *magick_restrict,ExceptionInfo *) + magick_hot_spot; + +extern MagickExport MagickSizeType + GetCacheViewExtent(const CacheView *); + +extern MagickExport size_t + GetCacheViewChannels(const CacheView *); + +extern MagickExport PixelPacket + *GetCacheViewAuthenticPixelQueue(CacheView *) magick_hot_spot, + *GetCacheViewAuthenticPixels(CacheView *,const ssize_t,const ssize_t, + const size_t,const size_t,ExceptionInfo *) magick_hot_spot, + *QueueCacheViewAuthenticPixels(CacheView *,const ssize_t,const ssize_t, + const size_t,const size_t,ExceptionInfo *) magick_hot_spot; + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/cache.c b/ImageMagick-6.9.12-44/magick/cache.c new file mode 100644 index 0000000..f26fe3c --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/cache.c @@ -0,0 +1,6025 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC AAA CCCC H H EEEEE % +% C A A C H H E % +% C AAAAA C HHHHH EEE % +% C A A C H H E % +% CCCC A A CCCC H H EEEEE % +% % +% % +% MagickCore Pixel Cache Methods % +% % +% Software Design % +% Cristy % +% July 1999 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/cache-private.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/composite-private.h" +#include "magick/distribute-cache-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/nt-base-private.h" +#include "magick/option.h" +#include "magick/pixel.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/policy.h" +#include "magick/quantum.h" +#include "magick/random_.h" +#include "magick/registry.h" +#include "magick/resource_.h" +#include "magick/semaphore.h" +#include "magick/splay-tree.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/thread-private.h" +#include "magick/timer-private.h" +#include "magick/utility.h" +#include "magick/utility-private.h" +#if defined(MAGICKCORE_ZLIB_DELEGATE) +#include "zlib.h" +#endif + +/* + Define declarations. +*/ +#define CacheTick(offset,extent) QuantumTick((MagickOffsetType) offset,extent) +#define IsFileDescriptorLimitExceeded() (GetMagickResource(FileResource) > \ + GetMagickResourceLimit(FileResource) ? MagickTrue : MagickFalse) + +/* + Typedef declarations. +*/ +typedef struct _MagickModulo +{ + ssize_t + quotient, + remainder; +} MagickModulo; + +/* + Forward declarations. +*/ +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static Cache + GetImagePixelCache(Image *,const MagickBooleanType,ExceptionInfo *) + magick_hot_spot; + +static const IndexPacket + *GetVirtualIndexesFromCache(const Image *); + +static const PixelPacket + *GetVirtualPixelCache(const Image *,const VirtualPixelMethod,const ssize_t, + const ssize_t,const size_t,const size_t,ExceptionInfo *), + *GetVirtualPixelsCache(const Image *); + +static MagickBooleanType + GetOneAuthenticPixelFromCache(Image *,const ssize_t,const ssize_t, + PixelPacket *,ExceptionInfo *), + GetOneVirtualPixelFromCache(const Image *,const VirtualPixelMethod, + const ssize_t,const ssize_t,PixelPacket *,ExceptionInfo *), + OpenPixelCache(Image *,const MapMode,ExceptionInfo *), + OpenPixelCacheOnDisk(CacheInfo *,const MapMode), + ReadPixelCacheIndexes(CacheInfo *magick_restrict,NexusInfo *magick_restrict, + ExceptionInfo *), + ReadPixelCachePixels(CacheInfo *magick_restrict,NexusInfo *magick_restrict, + ExceptionInfo *), + SyncAuthenticPixelsCache(Image *,ExceptionInfo *), + WritePixelCacheIndexes(CacheInfo *,NexusInfo *magick_restrict, + ExceptionInfo *), + WritePixelCachePixels(CacheInfo *,NexusInfo *magick_restrict, + ExceptionInfo *); + +static PixelPacket + *GetAuthenticPixelsCache(Image *,const ssize_t,const ssize_t,const size_t, + const size_t,ExceptionInfo *), + *QueueAuthenticPixelsCache(Image *,const ssize_t,const ssize_t,const size_t, + const size_t,ExceptionInfo *), + *SetPixelCacheNexusPixels(const CacheInfo *magick_restrict,const MapMode, + const ssize_t,const ssize_t,const size_t,const size_t, + const MagickBooleanType,NexusInfo *magick_restrict,ExceptionInfo *) + magick_hot_spot; + +#if defined(MAGICKCORE_OPENCL_SUPPORT) +static void + CopyOpenCLBuffer(CacheInfo *magick_restrict); +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +/* + Global declarations. +*/ +static SemaphoreInfo + *cache_semaphore = (SemaphoreInfo *) NULL; + +static ssize_t + cache_anonymous_memory = (-1); + +static time_t + cache_epoch = 0; + +#if defined(MAGICKCORE_OPENCL_SUPPORT) +static inline OpenCLCacheInfo *RelinquishOpenCLCacheInfo(MagickCLEnv clEnv, + OpenCLCacheInfo *info) +{ + ssize_t + i; + + for (i=0; i < (ssize_t) info->event_count; i++) + clEnv->library->clReleaseEvent(info->events[i]); + info->events=(cl_event *) RelinquishMagickMemory(info->events); + DestroySemaphoreInfo(&info->events_semaphore); + if (info->buffer != (cl_mem) NULL) + { + clEnv->library->clReleaseMemObject(info->buffer); + info->buffer=(cl_mem) NULL; + } + return((OpenCLCacheInfo *) RelinquishMagickMemory(info)); +} + +static void CL_API_CALL RelinquishPixelCachePixelsDelayed( + cl_event magick_unused(event),cl_int magick_unused(event_command_exec_status), + void *user_data) +{ + MagickCLEnv + clEnv; + + OpenCLCacheInfo + *info; + + PixelPacket + *pixels; + + ssize_t + i; + + magick_unreferenced(event); + magick_unreferenced(event_command_exec_status); + info=(OpenCLCacheInfo *) user_data; + clEnv=GetDefaultOpenCLEnv(); + for (i=(ssize_t)info->event_count-1; i >= 0; i--) + { + cl_int + event_status; + + cl_uint + status; + + status=clEnv->library->clGetEventInfo(info->events[i], + CL_EVENT_COMMAND_EXECUTION_STATUS,sizeof(cl_int),&event_status,NULL); + if ((status == CL_SUCCESS) && (event_status > CL_COMPLETE)) + { + clEnv->library->clSetEventCallback(info->events[i],CL_COMPLETE, + &RelinquishPixelCachePixelsDelayed,info); + return; + } + } + pixels=info->pixels; + RelinquishMagickResource(MemoryResource,info->length); + (void) RelinquishOpenCLCacheInfo(clEnv,info); + (void) RelinquishAlignedMemory(pixels); +} + +static MagickBooleanType RelinquishOpenCLBuffer( + CacheInfo *magick_restrict cache_info) +{ + MagickCLEnv + clEnv; + + assert(cache_info != (CacheInfo *) NULL); + if (cache_info->opencl == (OpenCLCacheInfo *) NULL) + return(MagickFalse); + RelinquishPixelCachePixelsDelayed((cl_event) NULL,0,cache_info->opencl); + return(MagickTrue); +} + +static cl_event *CopyOpenCLEvents(OpenCLCacheInfo *opencl_info, + cl_uint *event_count) +{ + cl_event + *events; + + size_t + i; + + assert(opencl_info != (OpenCLCacheInfo *) NULL); + events=(cl_event *) NULL; + LockSemaphoreInfo(opencl_info->events_semaphore); + *event_count=opencl_info->event_count; + if (*event_count > 0) + { + events=AcquireQuantumMemory(*event_count,sizeof(*events)); + if (events == (cl_event *) NULL) + *event_count=0; + else + { + for (i=0; i < opencl_info->event_count; i++) + events[i]=opencl_info->events[i]; + } + } + UnlockSemaphoreInfo(opencl_info->events_semaphore); + return(events); +} +#endif + +#if defined(MAGICKCORE_OPENCL_SUPPORT) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A d d O p e n C L E v e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AddOpenCLEvent() adds an event to the list of operations the next operation +% should wait for. +% +% The format of the AddOpenCLEvent() method is: +% +% void AddOpenCLEvent(const Image *image,cl_event event) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o event: the event that should be added. +% +*/ +extern MagickPrivate void AddOpenCLEvent(const Image *image,cl_event event) +{ + CacheInfo + *magick_restrict cache_info; + + MagickCLEnv + clEnv; + + assert(image != (const Image *) NULL); + assert(event != (cl_event) NULL); + cache_info=(CacheInfo *)image->cache; + assert(cache_info->opencl != (OpenCLCacheInfo *) NULL); + clEnv=GetDefaultOpenCLEnv(); + if (clEnv->library->clRetainEvent(event) != CL_SUCCESS) + { + clEnv->library->clWaitForEvents(1,&event); + return; + } + LockSemaphoreInfo(cache_info->opencl->events_semaphore); + if (cache_info->opencl->events == (cl_event *) NULL) + { + cache_info->opencl->events=AcquireMagickMemory(sizeof( + *cache_info->opencl->events)); + cache_info->opencl->event_count=1; + } + else + cache_info->opencl->events=ResizeQuantumMemory(cache_info->opencl->events, + ++cache_info->opencl->event_count,sizeof(*cache_info->opencl->events)); + if (cache_info->opencl->events == (cl_event *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + cache_info->opencl->events[cache_info->opencl->event_count-1]=event; + UnlockSemaphoreInfo(cache_info->opencl->events_semaphore); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A c q u i r e P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquirePixelCache() acquires a pixel cache. +% +% The format of the AcquirePixelCache() method is: +% +% Cache AcquirePixelCache(const size_t number_threads) +% +% A description of each parameter follows: +% +% o number_threads: the number of nexus threads. +% +*/ +MagickExport Cache AcquirePixelCache(const size_t number_threads) +{ + CacheInfo + *magick_restrict cache_info; + + char + *value; + + cache_info=(CacheInfo *) AcquireAlignedMemory(1,sizeof(*cache_info)); + if (cache_info == (CacheInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(cache_info,0,sizeof(*cache_info)); + cache_info->type=UndefinedCache; + cache_info->mode=IOMode; + cache_info->disk_mode=IOMode; + cache_info->colorspace=sRGBColorspace; + cache_info->channels=4; + cache_info->file=(-1); + cache_info->id=GetMagickThreadId(); + cache_info->number_threads=number_threads; + if (GetOpenMPMaximumThreads() > cache_info->number_threads) + cache_info->number_threads=GetOpenMPMaximumThreads(); + if (GetMagickResourceLimit(ThreadResource) > cache_info->number_threads) + cache_info->number_threads=(size_t) GetMagickResourceLimit(ThreadResource); + if (cache_info->number_threads == 0) + cache_info->number_threads=1; + cache_info->nexus_info=AcquirePixelCacheNexus(cache_info->number_threads); + value=GetEnvironmentValue("MAGICK_SYNCHRONIZE"); + if (value != (const char *) NULL) + { + cache_info->synchronize=IsStringTrue(value); + value=DestroyString(value); + } + value=GetPolicyValue("cache:synchronize"); + if (value != (const char *) NULL) + { + cache_info->synchronize=IsStringTrue(value); + value=DestroyString(value); + } + cache_info->width_limit=MagickMin(GetMagickResourceLimit(WidthResource), + (MagickSizeType) MAGICK_SSIZE_MAX); + cache_info->height_limit=MagickMin(GetMagickResourceLimit(HeightResource), + (MagickSizeType) MAGICK_SSIZE_MAX); + cache_info->semaphore=AllocateSemaphoreInfo(); + cache_info->reference_count=1; + cache_info->file_semaphore=AllocateSemaphoreInfo(); + cache_info->debug=IsEventLogging(); + cache_info->signature=MagickCoreSignature; + return((Cache ) cache_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e P i x e l C a c h e N e x u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquirePixelCacheNexus() allocates the NexusInfo structure. +% +% The format of the AcquirePixelCacheNexus method is: +% +% NexusInfo **AcquirePixelCacheNexus(const size_t number_threads) +% +% A description of each parameter follows: +% +% o number_threads: the number of nexus threads. +% +*/ +MagickExport NexusInfo **AcquirePixelCacheNexus(const size_t number_threads) +{ + NexusInfo + **magick_restrict nexus_info; + + ssize_t + i; + + nexus_info=(NexusInfo **) MagickAssumeAligned(AcquireAlignedMemory(2* + number_threads,sizeof(*nexus_info))); + if (nexus_info == (NexusInfo **) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + *nexus_info=(NexusInfo *) AcquireQuantumMemory(number_threads, + 2*sizeof(**nexus_info)); + if (*nexus_info == (NexusInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(*nexus_info,0,2*number_threads*sizeof(**nexus_info)); + for (i=0; i < (ssize_t) (2*number_threads); i++) + { + nexus_info[i]=(*nexus_info+i); + if (i < (ssize_t) number_threads) + nexus_info[i]->virtual_nexus=(*nexus_info+number_threads+i); + nexus_info[i]->signature=MagickCoreSignature; + } + return(nexus_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e P i x e l C a c h e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquirePixelCachePixels() returns the pixels associated with the specified +% image. +% +% The format of the AcquirePixelCachePixels() method is: +% +% const void *AcquirePixelCachePixels(const Image *image, +% MagickSizeType *length,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o length: the pixel cache length. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport const void *AcquirePixelCachePixels(const Image *image, + MagickSizeType *length,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + (void) exception; + *length=0; + if ((cache_info->type != MemoryCache) && (cache_info->type != MapCache)) + return((const void *) NULL); + *length=cache_info->length; + return((const void *) cache_info->pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C a c h e C o m p o n e n t G e n e s i s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CacheComponentGenesis() instantiates the cache component. +% +% The format of the CacheComponentGenesis method is: +% +% MagickBooleanType CacheComponentGenesis(void) +% +*/ +MagickExport MagickBooleanType CacheComponentGenesis(void) +{ + if (cache_semaphore == (SemaphoreInfo *) NULL) + cache_semaphore=AllocateSemaphoreInfo(); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C a c h e C o m p o n e n t T e r m i n u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CacheComponentTerminus() destroys the cache component. +% +% The format of the CacheComponentTerminus() method is: +% +% CacheComponentTerminus(void) +% +*/ +MagickExport void CacheComponentTerminus(void) +{ + if (cache_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&cache_semaphore); + /* no op-- nothing to destroy */ + DestroySemaphoreInfo(&cache_semaphore); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C l i p P i x e l C a c h e N e x u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClipPixelCacheNexus() clips the cache nexus as defined by the image clip +% mask. The method returns MagickTrue if the pixel region is clipped, +% otherwise MagickFalse. +% +% The format of the ClipPixelCacheNexus() method is: +% +% MagickBooleanType ClipPixelCacheNexus(Image *image,NexusInfo *nexus_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o nexus_info: the cache nexus to clip. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType ClipPixelCacheNexus(Image *image, + NexusInfo *nexus_info,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const PixelPacket + *magick_restrict r; + + IndexPacket + *magick_restrict nexus_indexes, + *magick_restrict indexes; + + MagickOffsetType + n; + + NexusInfo + **magick_restrict clip_nexus; + + PixelPacket + *magick_restrict p, + *magick_restrict q; + + ssize_t + y; + + /* + Apply clip mask. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((image->clip_mask == (Image *) NULL) || + (image->storage_class == PseudoClass)) + return(MagickTrue); + if ((nexus_info->region.width == 0) || (nexus_info->region.height == 0)) + return(MagickTrue); + cache_info=(CacheInfo *) image->cache; + if (cache_info == (Cache) NULL) + return(MagickFalse); + clip_nexus=AcquirePixelCacheNexus(1); + p=GetAuthenticPixelCacheNexus(image,nexus_info->region.x,nexus_info->region.y, + nexus_info->region.width,nexus_info->region.height, + nexus_info->virtual_nexus,exception); + indexes=nexus_info->virtual_nexus->indexes; + q=nexus_info->pixels; + nexus_indexes=nexus_info->indexes; + r=GetVirtualPixelCacheNexus(image->clip_mask,MaskVirtualPixelMethod, + nexus_info->region.x,nexus_info->region.y,nexus_info->region.width, + nexus_info->region.height,clip_nexus[0],exception); + if ((p == (PixelPacket *) NULL) || (q == (PixelPacket *) NULL) || + (r == (const PixelPacket *) NULL)) + return(MagickFalse); + n=0; + for (y=0; y < (ssize_t) nexus_info->region.height; y++) + { + ssize_t + x; + + for (x=0; x < (ssize_t) nexus_info->region.width; x++) + { + double + mask_alpha; + + mask_alpha=QuantumScale*GetPixelIntensity(image,r); + if (fabs(mask_alpha) >= MagickEpsilon) + { + SetPixelRed(q,mask_alpha*MagickOver_((MagickRealType) p->red, + (MagickRealType) GetPixelOpacity(p),(MagickRealType) q->red, + (MagickRealType) GetPixelOpacity(q))); + SetPixelGreen(q,mask_alpha*MagickOver_((MagickRealType) p->green, + (MagickRealType) GetPixelOpacity(p),(MagickRealType) q->green, + (MagickRealType) GetPixelOpacity(q))); + SetPixelBlue(q,mask_alpha*MagickOver_((MagickRealType) p->blue, + (MagickRealType) GetPixelOpacity(p),(MagickRealType) q->blue, + (MagickRealType) GetPixelOpacity(q))); + SetPixelOpacity(q,GetPixelOpacity(p)); + if (cache_info->active_index_channel != MagickFalse) + SetPixelIndex(nexus_indexes+n,GetPixelIndex(indexes+n)); + } + p++; + q++; + r++; + n++; + } + } + clip_nexus=DestroyPixelCacheNexus(clip_nexus,1); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C l o n e P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClonePixelCache() clones a pixel cache. +% +% The format of the ClonePixelCache() method is: +% +% Cache ClonePixelCache(const Cache cache) +% +% A description of each parameter follows: +% +% o cache: the pixel cache. +% +*/ +MagickExport Cache ClonePixelCache(const Cache cache) +{ + CacheInfo + *magick_restrict clone_info; + + const CacheInfo + *magick_restrict cache_info; + + assert(cache != NULL); + cache_info=(const CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_info->filename); + clone_info=(CacheInfo *) AcquirePixelCache(cache_info->number_threads); + clone_info->virtual_pixel_method=cache_info->virtual_pixel_method; + return((Cache ) clone_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C l o n e P i x e l C a c h e M e t h o d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClonePixelCacheMethods() clones the pixel cache methods from one cache to +% another. +% +% The format of the ClonePixelCacheMethods() method is: +% +% void ClonePixelCacheMethods(Cache clone,const Cache cache) +% +% A description of each parameter follows: +% +% o clone: Specifies a pointer to a Cache structure. +% +% o cache: the pixel cache. +% +*/ +MagickExport void ClonePixelCacheMethods(Cache clone,const Cache cache) +{ + CacheInfo + *magick_restrict cache_info, + *magick_restrict source_info; + + assert(clone != (Cache) NULL); + source_info=(CacheInfo *) clone; + assert(source_info->signature == MagickCoreSignature); + if (source_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + source_info->filename); + assert(cache != (Cache) NULL); + cache_info=(CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + source_info->methods=cache_info->methods; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C l o n e P i x e l C a c h e R e p o s i t o r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% ClonePixelCacheRepository() clones the source pixel cache to the destination +% cache. +% +% The format of the ClonePixelCacheRepository() method is: +% +% MagickBooleanType ClonePixelCacheRepository(CacheInfo *cache_info, +% CacheInfo *source_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_info: the pixel cache. +% +% o source_info: the source pixel cache. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType ClonePixelCacheOnDisk( + CacheInfo *magick_restrict cache_info,CacheInfo *magick_restrict clone_info) +{ + MagickSizeType + extent; + + size_t + quantum; + + ssize_t + count; + + struct stat + file_stats; + + unsigned char + *buffer; + + /* + Clone pixel cache on disk with identical morphology. + */ + if ((OpenPixelCacheOnDisk(cache_info,ReadMode) == MagickFalse) || + (OpenPixelCacheOnDisk(clone_info,IOMode) == MagickFalse)) + return(MagickFalse); + if ((lseek(cache_info->file,0,SEEK_SET) < 0) || + (lseek(clone_info->file,0,SEEK_SET) < 0)) + return(MagickFalse); + quantum=(size_t) MagickMaxBufferExtent; + if ((fstat(cache_info->file,&file_stats) == 0) && (file_stats.st_size > 0)) + { +#if defined(MAGICKCORE_HAVE_LINUX_SENDFILE) + if (cache_info->length < 0x7ffff000) + { + count=sendfile(clone_info->file,cache_info->file,(off_t *) NULL, + (size_t) cache_info->length); + if (count == (ssize_t) cache_info->length) + return(MagickTrue); + if ((lseek(cache_info->file,0,SEEK_SET) < 0) || + (lseek(clone_info->file,0,SEEK_SET) < 0)) + return(MagickFalse); + } +#endif + quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent); + } + buffer=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*buffer)); + if (buffer == (unsigned char *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + extent=0; + while ((count=read(cache_info->file,buffer,quantum)) > 0) + { + ssize_t + number_bytes; + + number_bytes=write(clone_info->file,buffer,(size_t) count); + if (number_bytes != count) + break; + extent+=number_bytes; + } + buffer=(unsigned char *) RelinquishMagickMemory(buffer); + if (extent != cache_info->length) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ClonePixelCacheRepository( + CacheInfo *magick_restrict clone_info,CacheInfo *magick_restrict cache_info, + ExceptionInfo *exception) +{ +#define MaxCacheThreads ((size_t) GetMagickResourceLimit(ThreadResource)) +#define cache_number_threads(source,destination,chunk,multithreaded) \ + num_threads((multithreaded) == 0 ? 1 : \ + (((source)->type != MemoryCache) && ((source)->type != MapCache)) || \ + (((destination)->type != MemoryCache) && ((destination)->type != MapCache)) ? \ + MagickMax(MagickMin(GetMagickResourceLimit(ThreadResource),2),1) : \ + MagickMax(MagickMin((ssize_t) GetMagickResourceLimit(ThreadResource),(ssize_t) (chunk)/256),1)) + + MagickBooleanType + status; + + NexusInfo + **magick_restrict cache_nexus, + **magick_restrict clone_nexus; + + size_t + length; + + ssize_t + y; + + assert(cache_info != (CacheInfo *) NULL); + assert(clone_info != (CacheInfo *) NULL); + assert(exception != (ExceptionInfo *) NULL); + if (cache_info->type == PingCache) + return(MagickTrue); + if ((cache_info->storage_class == clone_info->storage_class) && + (cache_info->colorspace == clone_info->colorspace) && + (cache_info->channels == clone_info->channels) && + (cache_info->columns == clone_info->columns) && + (cache_info->rows == clone_info->rows) && + (cache_info->active_index_channel == clone_info->active_index_channel)) + { + /* + Identical pixel cache morphology. + */ + if (((cache_info->type == MemoryCache) || + (cache_info->type == MapCache)) && + ((clone_info->type == MemoryCache) || + (clone_info->type == MapCache))) + { + (void) memcpy(clone_info->pixels,cache_info->pixels, + cache_info->columns*cache_info->rows*sizeof(*cache_info->pixels)); + if ((cache_info->active_index_channel != MagickFalse) && + (clone_info->active_index_channel != MagickFalse)) + (void) memcpy(clone_info->indexes,cache_info->indexes, + cache_info->columns*cache_info->rows* + sizeof(*cache_info->indexes)); + return(MagickTrue); + } + if ((cache_info->type == DiskCache) && (clone_info->type == DiskCache)) + return(ClonePixelCacheOnDisk(cache_info,clone_info)); + } + /* + Mismatched pixel cache morphology. + */ + cache_nexus=AcquirePixelCacheNexus(cache_info->number_threads); + clone_nexus=AcquirePixelCacheNexus(clone_info->number_threads); + length=(size_t) MagickMin(cache_info->columns,clone_info->columns)* + sizeof(*cache_info->pixels); + status=MagickTrue; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + cache_number_threads(cache_info,clone_info,cache_info->rows,1) +#endif + for (y=0; y < (ssize_t) cache_info->rows; y++) + { + const int + id = GetOpenMPThreadId(); + + PixelPacket + *pixels; + + if (status == MagickFalse) + continue; + if (y >= (ssize_t) clone_info->rows) + continue; + pixels=SetPixelCacheNexusPixels(cache_info,ReadMode,0,y, + cache_info->columns,1,MagickFalse,cache_nexus[id],exception); + if (pixels == (PixelPacket *) NULL) + continue; + status=ReadPixelCachePixels(cache_info,cache_nexus[id],exception); + if (status == MagickFalse) + continue; + pixels=SetPixelCacheNexusPixels(clone_info,WriteMode,0,y, + clone_info->columns,1,MagickFalse,clone_nexus[id],exception); + if (pixels == (PixelPacket *) NULL) + continue; + (void) memset(clone_nexus[id]->pixels,0,(size_t) clone_nexus[id]->length); + (void) memcpy(clone_nexus[id]->pixels,cache_nexus[id]->pixels,length); + status=WritePixelCachePixels(clone_info,clone_nexus[id],exception); + } + if ((cache_info->active_index_channel != MagickFalse) && + (clone_info->active_index_channel != MagickFalse)) + { + /* + Clone indexes. + */ + length=(size_t) MagickMin(cache_info->columns,clone_info->columns)* + sizeof(*cache_info->indexes); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + cache_number_threads(cache_info,clone_info,cache_info->rows,1) +#endif + for (y=0; y < (ssize_t) cache_info->rows; y++) + { + const int + id = GetOpenMPThreadId(); + + PixelPacket + *pixels; + + if (status == MagickFalse) + continue; + if (y >= (ssize_t) clone_info->rows) + continue; + pixels=SetPixelCacheNexusPixels(cache_info,ReadMode,0,y, + cache_info->columns,1,MagickFalse,cache_nexus[id],exception); + if (pixels == (PixelPacket *) NULL) + continue; + status=ReadPixelCacheIndexes(cache_info,cache_nexus[id],exception); + if (status == MagickFalse) + continue; + pixels=SetPixelCacheNexusPixels(clone_info,WriteMode,0,y, + clone_info->columns,1,MagickFalse,clone_nexus[id],exception); + if (pixels == (PixelPacket *) NULL) + continue; + (void) memcpy(clone_nexus[id]->indexes,cache_nexus[id]->indexes,length); + status=WritePixelCacheIndexes(clone_info,clone_nexus[id],exception); + } + } + clone_nexus=DestroyPixelCacheNexus(clone_nexus,clone_info->number_threads); + cache_nexus=DestroyPixelCacheNexus(cache_nexus,cache_info->number_threads); + if (cache_info->debug != MagickFalse) + { + char + message[MaxTextExtent]; + + (void) FormatLocaleString(message,MaxTextExtent,"%s => %s", + CommandOptionToMnemonic(MagickCacheOptions,(ssize_t) cache_info->type), + CommandOptionToMnemonic(MagickCacheOptions,(ssize_t) clone_info->type)); + (void) LogMagickEvent(CacheEvent,GetMagickModule(),"%s",message); + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e s t r o y I m a g e P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyImagePixelCache() deallocates memory associated with the pixel cache. +% +% The format of the DestroyImagePixelCache() method is: +% +% void DestroyImagePixelCache(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +static void DestroyImagePixelCache(Image *image) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->cache != (void *) NULL) + image->cache=DestroyPixelCache(image->cache); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e s t r o y I m a g e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyImagePixels() deallocates memory associated with the pixel cache. +% +% The format of the DestroyImagePixels() method is: +% +% void DestroyImagePixels(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport void DestroyImagePixels(Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->methods.destroy_pixel_handler != (DestroyPixelHandler) NULL) + { + cache_info->methods.destroy_pixel_handler(image); + return; + } + image->cache=DestroyPixelCache(image->cache); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e s t r o y P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyPixelCache() deallocates memory associated with the pixel cache. +% +% The format of the DestroyPixelCache() method is: +% +% Cache DestroyPixelCache(Cache cache) +% +% A description of each parameter follows: +% +% o cache: the pixel cache. +% +*/ + +static MagickBooleanType ClosePixelCacheOnDisk(CacheInfo *cache_info) +{ + int + status; + + status=(-1); + if (cache_info->file != -1) + { + status=close(cache_info->file); + cache_info->file=(-1); + RelinquishMagickResource(FileResource,1); + } + return(status == -1 ? MagickFalse : MagickTrue); +} + +static inline void RelinquishPixelCachePixels(CacheInfo *cache_info) +{ + switch (cache_info->type) + { + case MemoryCache: + { +#if defined(MAGICKCORE_OPENCL_SUPPORT) + if (RelinquishOpenCLBuffer(cache_info) != MagickFalse) + { + cache_info->pixels=(PixelPacket *) NULL; + break; + } +#endif + if (cache_info->mapped == MagickFalse) + cache_info->pixels=(PixelPacket *) RelinquishAlignedMemory( + cache_info->pixels); + else + (void) UnmapBlob(cache_info->pixels,(size_t) cache_info->length); + RelinquishMagickResource(MemoryResource,cache_info->length); + break; + } + case MapCache: + { + (void) UnmapBlob(cache_info->pixels,(size_t) cache_info->length); + cache_info->pixels=(PixelPacket *) NULL; + if ((cache_info->mode != ReadMode) && (cache_info->mode != PersistMode)) + (void) RelinquishUniqueFileResource(cache_info->cache_filename); + *cache_info->cache_filename='\0'; + RelinquishMagickResource(MapResource,cache_info->length); + } + case DiskCache: + { + if (cache_info->file != -1) + (void) ClosePixelCacheOnDisk(cache_info); + if ((cache_info->mode != ReadMode) && (cache_info->mode != PersistMode)) + (void) RelinquishUniqueFileResource(cache_info->cache_filename); + *cache_info->cache_filename='\0'; + RelinquishMagickResource(DiskResource,cache_info->length); + break; + } + case DistributedCache: + { + *cache_info->cache_filename='\0'; + (void) RelinquishDistributePixelCache((DistributeCacheInfo *) + cache_info->server_info); + break; + } + default: + break; + } + cache_info->type=UndefinedCache; + cache_info->mapped=MagickFalse; + cache_info->indexes=(IndexPacket *) NULL; +} + +MagickExport Cache DestroyPixelCache(Cache cache) +{ + CacheInfo + *magick_restrict cache_info; + + assert(cache != (Cache) NULL); + cache_info=(CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_info->filename); + LockSemaphoreInfo(cache_info->semaphore); + cache_info->reference_count--; + if (cache_info->reference_count != 0) + { + UnlockSemaphoreInfo(cache_info->semaphore); + return((Cache) NULL); + } + UnlockSemaphoreInfo(cache_info->semaphore); + if (cache_info->debug != MagickFalse) + { + char + message[MaxTextExtent]; + + (void) FormatLocaleString(message,MaxTextExtent,"destroy %s", + cache_info->filename); + (void) LogMagickEvent(CacheEvent,GetMagickModule(),"%s",message); + } + RelinquishPixelCachePixels(cache_info); + if (cache_info->server_info != (DistributeCacheInfo *) NULL) + cache_info->server_info=DestroyDistributeCacheInfo((DistributeCacheInfo *) + cache_info->server_info); + if (cache_info->nexus_info != (NexusInfo **) NULL) + cache_info->nexus_info=DestroyPixelCacheNexus(cache_info->nexus_info, + cache_info->number_threads); + if (cache_info->random_info != (RandomInfo *) NULL) + cache_info->random_info=DestroyRandomInfo(cache_info->random_info); + if (cache_info->file_semaphore != (SemaphoreInfo *) NULL) + DestroySemaphoreInfo(&cache_info->file_semaphore); + if (cache_info->semaphore != (SemaphoreInfo *) NULL) + DestroySemaphoreInfo(&cache_info->semaphore); + cache_info->signature=(~MagickCoreSignature); + cache_info=(CacheInfo *) RelinquishAlignedMemory(cache_info); + cache=(Cache) NULL; + return(cache); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e s t r o y P i x e l C a c h e N e x u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyPixelCacheNexus() destroys a pixel cache nexus. +% +% The format of the DestroyPixelCacheNexus() method is: +% +% NexusInfo **DestroyPixelCacheNexus(NexusInfo *nexus_info, +% const size_t number_threads) +% +% A description of each parameter follows: +% +% o nexus_info: the nexus to destroy. +% +% o number_threads: the number of nexus threads. +% +*/ + +static inline void RelinquishCacheNexusPixels(NexusInfo *nexus_info) +{ + if (nexus_info->mapped == MagickFalse) + (void) RelinquishAlignedMemory(nexus_info->cache); + else + (void) UnmapBlob(nexus_info->cache,(size_t) nexus_info->length); + nexus_info->cache=(PixelPacket *) NULL; + nexus_info->pixels=(PixelPacket *) NULL; + nexus_info->indexes=(IndexPacket *) NULL; + nexus_info->length=0; + nexus_info->mapped=MagickFalse; +} + +MagickExport NexusInfo **DestroyPixelCacheNexus(NexusInfo **nexus_info, + const size_t number_threads) +{ + ssize_t + i; + + assert(nexus_info != (NexusInfo **) NULL); + for (i=0; i < (ssize_t) (2*number_threads); i++) + { + if (nexus_info[i]->cache != (PixelPacket *) NULL) + RelinquishCacheNexusPixels(nexus_info[i]); + nexus_info[i]->signature=(~MagickCoreSignature); + } + *nexus_info=(NexusInfo *) RelinquishMagickMemory(*nexus_info); + nexus_info=(NexusInfo **) RelinquishAlignedMemory(nexus_info); + return(nexus_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t A u t h e n t i c I n d e x e s F r o m C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetAuthenticIndexesFromCache() returns the indexes associated with the last +% call to QueueAuthenticPixelsCache() or GetAuthenticPixelsCache(). +% +% The format of the GetAuthenticIndexesFromCache() method is: +% +% IndexPacket *GetAuthenticIndexesFromCache(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +static IndexPacket *GetAuthenticIndexesFromCache(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + return(cache_info->nexus_info[id]->indexes); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t A u t h e n t i c I n d e x Q u e u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetAuthenticIndexQueue() returns the authentic black channel or the colormap +% indexes associated with the last call to QueueAuthenticPixels() or +% GetVirtualPixels(). NULL is returned if the black channel or colormap +% indexes are not available. +% +% The format of the GetAuthenticIndexQueue() method is: +% +% IndexPacket *GetAuthenticIndexQueue(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport IndexPacket *GetAuthenticIndexQueue(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->methods.get_authentic_indexes_from_handler != + (GetAuthenticIndexesFromHandler) NULL) + return(cache_info->methods.get_authentic_indexes_from_handler(image)); + assert(id < (int) cache_info->number_threads); + return(cache_info->nexus_info[id]->indexes); +} + +#if defined(MAGICKCORE_OPENCL_SUPPORT) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t A u t h e n t i c O p e n C L B u f f e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetAuthenticOpenCLBuffer() returns an OpenCL buffer used to execute OpenCL +% operations. +% +% The format of the GetAuthenticOpenCLBuffer() method is: +% +% cl_mem GetAuthenticOpenCLBuffer(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickPrivate cl_mem GetAuthenticOpenCLBuffer(const Image *image, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + cl_context + context; + + cl_int + status; + + MagickCLEnv + clEnv; + + assert(image != (const Image *) NULL); + cache_info=(CacheInfo *)image->cache; + if ((cache_info->type == UndefinedCache) || (cache_info->reference_count > 1)) + { + SyncImagePixelCache((Image *) image,exception); + cache_info=(CacheInfo *)image->cache; + } + if ((cache_info->type != MemoryCache) || (cache_info->mapped != MagickFalse)) + return((cl_mem) NULL); + LockSemaphoreInfo(cache_info->semaphore); + clEnv=GetDefaultOpenCLEnv(); + if (cache_info->opencl == (OpenCLCacheInfo *) NULL) + { + assert(cache_info->pixels != NULL); + context=GetOpenCLContext(clEnv); + cache_info->opencl=(OpenCLCacheInfo *) AcquireCriticalMemory( + sizeof(*cache_info->opencl)); + (void) memset(cache_info->opencl,0,sizeof(*cache_info->opencl)); + cache_info->opencl->events_semaphore=AllocateSemaphoreInfo(); + cache_info->opencl->length=cache_info->length; + cache_info->opencl->pixels=cache_info->pixels; + cache_info->opencl->buffer=clEnv->library->clCreateBuffer(context, + CL_MEM_USE_HOST_PTR,cache_info->length,cache_info->pixels,&status); + if (status != CL_SUCCESS) + cache_info->opencl=RelinquishOpenCLCacheInfo(clEnv,cache_info->opencl); + } + if (cache_info->opencl != (OpenCLCacheInfo *) NULL) + clEnv->library->clRetainMemObject(cache_info->opencl->buffer); + UnlockSemaphoreInfo(cache_info->semaphore); + if (cache_info->opencl == (OpenCLCacheInfo *) NULL) + return((cl_mem) NULL); + return(cache_info->opencl->buffer); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t A u t h e n t i c P i x e l C a c h e N e x u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetAuthenticPixelCacheNexus() gets authentic pixels from the in-memory or +% disk pixel cache as defined by the geometry parameters. A pointer to the +% pixels is returned if the pixels are transferred, otherwise a NULL is +% returned. +% +% The format of the GetAuthenticPixelCacheNexus() method is: +% +% PixelPacket *GetAuthenticPixelCacheNexus(Image *image,const ssize_t x, +% const ssize_t y,const size_t columns,const size_t rows, +% NexusInfo *nexus_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o nexus_info: the cache nexus to return. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport PixelPacket *GetAuthenticPixelCacheNexus(Image *image, + const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, + NexusInfo *nexus_info,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + PixelPacket + *magick_restrict pixels; + + /* + Transfer pixels from the cache. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + pixels=QueueAuthenticPixelCacheNexus(image,x,y,columns,rows,MagickTrue, + nexus_info,exception); + if (pixels == (PixelPacket *) NULL) + return((PixelPacket *) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (nexus_info->authentic_pixel_cache != MagickFalse) + return(pixels); + if (ReadPixelCachePixels(cache_info,nexus_info,exception) == MagickFalse) + return((PixelPacket *) NULL); + if (cache_info->active_index_channel != MagickFalse) + if (ReadPixelCacheIndexes(cache_info,nexus_info,exception) == MagickFalse) + return((PixelPacket *) NULL); + return(pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t A u t h e n t i c P i x e l s F r o m C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetAuthenticPixelsFromCache() returns the pixels associated with the last +% call to the QueueAuthenticPixelsCache() or GetAuthenticPixelsCache() methods. +% +% The format of the GetAuthenticPixelsFromCache() method is: +% +% PixelPacket *GetAuthenticPixelsFromCache(const Image image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +static PixelPacket *GetAuthenticPixelsFromCache(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + return(cache_info->nexus_info[id]->pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t A u t h e n t i c P i x e l Q u e u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetAuthenticPixelQueue() returns the authentic pixels associated with the +% last call to QueueAuthenticPixels() or GetAuthenticPixels(). +% +% The format of the GetAuthenticPixelQueue() method is: +% +% PixelPacket *GetAuthenticPixelQueue(const Image image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport PixelPacket *GetAuthenticPixelQueue(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->methods.get_authentic_pixels_from_handler != + (GetAuthenticPixelsFromHandler) NULL) + return(cache_info->methods.get_authentic_pixels_from_handler(image)); + assert(id < (int) cache_info->number_threads); + return(cache_info->nexus_info[id]->pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t A u t h e n t i c P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetAuthenticPixels() obtains a pixel region for read/write access. If the +% region is successfully accessed, a pointer to a PixelPacket array +% representing the region is returned, otherwise NULL is returned. +% +% The returned pointer may point to a temporary working copy of the pixels +% or it may point to the original pixels in memory. Performance is maximized +% if the selected region is part of one row, or one or more full rows, since +% then there is opportunity to access the pixels in-place (without a copy) +% if the image is in memory, or in a memory-mapped file. The returned pointer +% must *never* be deallocated by the user. +% +% Pixels accessed via the returned pointer represent a simple array of type +% PixelPacket. If the image type is CMYK or if the storage class is +% PseduoClass, call GetAuthenticIndexQueue() after invoking +% GetAuthenticPixels() to obtain the black color component or colormap indexes +% (of type IndexPacket) corresponding to the region. Once the PixelPacket +% (and/or IndexPacket) array has been updated, the changes must be saved back +% to the underlying image using SyncAuthenticPixels() or they may be lost. +% +% The format of the GetAuthenticPixels() method is: +% +% PixelPacket *GetAuthenticPixels(Image *image,const ssize_t x, +% const ssize_t y,const size_t columns,const size_t rows, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport PixelPacket *GetAuthenticPixels(Image *image,const ssize_t x, + const ssize_t y,const size_t columns,const size_t rows, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->methods.get_authentic_pixels_handler != + (GetAuthenticPixelsHandler) NULL) + return(cache_info->methods.get_authentic_pixels_handler(image,x,y,columns, + rows,exception)); + assert(id < (int) cache_info->number_threads); + return(GetAuthenticPixelCacheNexus(image,x,y,columns,rows, + cache_info->nexus_info[id],exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t A u t h e n t i c P i x e l s C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetAuthenticPixelsCache() gets pixels from the in-memory or disk pixel cache +% as defined by the geometry parameters. A pointer to the pixels is returned +% if the pixels are transferred, otherwise a NULL is returned. +% +% The format of the GetAuthenticPixelsCache() method is: +% +% PixelPacket *GetAuthenticPixelsCache(Image *image,const ssize_t x, +% const ssize_t y,const size_t columns,const size_t rows, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static PixelPacket *GetAuthenticPixelsCache(Image *image,const ssize_t x, + const ssize_t y,const size_t columns,const size_t rows, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + if (cache_info == (Cache) NULL) + return((PixelPacket *) NULL); + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + return(GetAuthenticPixelCacheNexus(image,x,y,columns,rows, + cache_info->nexus_info[id],exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t I m a g e E x t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageExtent() returns the extent of the pixels associated with the +% last call to QueueAuthenticPixels() or GetAuthenticPixels(). +% +% The format of the GetImageExtent() method is: +% +% MagickSizeType GetImageExtent(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickSizeType GetImageExtent(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + return(GetPixelCacheNexusExtent(cache_info,cache_info->nexus_info[id])); +} + +#if defined(MAGICKCORE_OPENCL_SUPPORT) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t O p e n C L E v e n t s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOpenCLEvents() returns the events that the next operation should wait +% for. The argument event_count is set to the number of events. +% +% The format of the GetOpenCLEvents() method is: +% +% const cl_event *GetOpenCLEvents(const Image *image, +% cl_command_queue queue) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o event_count: will be set to the number of events. +% +*/ + +extern MagickPrivate cl_event *GetOpenCLEvents(const Image *image, + cl_uint *event_count) +{ + CacheInfo + *magick_restrict cache_info; + + cl_event + *events; + + assert(image != (const Image *) NULL); + assert(event_count != (cl_uint *) NULL); + cache_info=(CacheInfo *) image->cache; + *event_count=0; + events=(cl_event *) NULL; + if (cache_info->opencl != (OpenCLCacheInfo *) NULL) + events=CopyOpenCLEvents(cache_info->opencl,event_count); + return(events); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t I m a g e P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImagePixelCache() ensures that there is only a single reference to the +% pixel cache to be modified, updating the provided cache pointer to point to +% a clone of the original pixel cache if necessary. +% +% The format of the GetImagePixelCache method is: +% +% Cache GetImagePixelCache(Image *image,const MagickBooleanType clone, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o clone: any value other than MagickFalse clones the cache pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline MagickBooleanType ValidatePixelCacheMorphology( + const Image *magick_restrict image) +{ + CacheInfo + *magick_restrict cache_info; + + /* + Does the image match the pixel cache morphology? + */ + cache_info=(CacheInfo *) image->cache; + if ((image->storage_class != cache_info->storage_class) || + (image->colorspace != cache_info->colorspace) || + (image->channels != cache_info->channels) || + (image->columns != cache_info->columns) || + (image->rows != cache_info->rows) || + (cache_info->nexus_info == (NexusInfo **) NULL)) + return(MagickFalse); + return(MagickTrue); +} + +static Cache GetImagePixelCache(Image *image,const MagickBooleanType clone, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + MagickBooleanType + destroy, + status; + + static MagickSizeType + cache_timelimit = MagickResourceInfinity, + cpu_throttle = MagickResourceInfinity, + cycles = 0; + + status=MagickTrue; + if (cpu_throttle == MagickResourceInfinity) + cpu_throttle=GetMagickResourceLimit(ThrottleResource); + if ((cpu_throttle != 0) && ((cycles++ % 32) == 0)) + MagickDelay(cpu_throttle); + if (cache_epoch == 0) + { + /* + Set the expire time in seconds. + */ + cache_epoch=GetMagickTime(); + cache_timelimit=GetMagickResourceLimit(TimeResource); + } + if ((cache_timelimit != MagickResourceInfinity) && + ((MagickSizeType) (GetMagickTime()-cache_epoch) >= cache_timelimit)) + { +#if defined(ECANCELED) + errno=ECANCELED; +#endif + cache_info=(CacheInfo *) image->cache; + if (cache_info->file != -1) + (void) ClosePixelCacheOnDisk(cache_info); + ThrowFatalException(ResourceLimitFatalError,"TimeLimitExceeded"); + } + LockSemaphoreInfo(image->semaphore); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; +#if defined(MAGICKCORE_OPENCL_SUPPORT) + CopyOpenCLBuffer(cache_info); +#endif + destroy=MagickFalse; + if ((cache_info->reference_count > 1) || (cache_info->mode == ReadMode)) + { + LockSemaphoreInfo(cache_info->semaphore); + if ((cache_info->reference_count > 1) || (cache_info->mode == ReadMode)) + { + CacheInfo + *clone_info; + + Image + clone_image; + + /* + Clone pixel cache. + */ + clone_image=(*image); + clone_image.semaphore=AllocateSemaphoreInfo(); + clone_image.reference_count=1; + clone_image.cache=ClonePixelCache(cache_info); + clone_info=(CacheInfo *) clone_image.cache; + status=OpenPixelCache(&clone_image,IOMode,exception); + if (status == MagickFalse) + clone_info=(CacheInfo *) DestroyPixelCache(clone_info); + else + { + if (clone != MagickFalse) + status=ClonePixelCacheRepository(clone_info,cache_info, + exception); + if (status == MagickFalse) + clone_info=(CacheInfo *) DestroyPixelCache(clone_info); + else + { + destroy=MagickTrue; + image->cache=clone_info; + } + } + DestroySemaphoreInfo(&clone_image.semaphore); + } + UnlockSemaphoreInfo(cache_info->semaphore); + } + if (destroy != MagickFalse) + cache_info=(CacheInfo *) DestroyPixelCache(cache_info); + if (status != MagickFalse) + { + /* + Ensure the image matches the pixel cache morphology. + */ + if (image->type != UndefinedType) + image->type=UndefinedType; + if (ValidatePixelCacheMorphology(image) == MagickFalse) + { + status=OpenPixelCache(image,IOMode,exception); + cache_info=(CacheInfo *) image->cache; + if (cache_info->file != -1) + (void) ClosePixelCacheOnDisk(cache_info); + } + } + UnlockSemaphoreInfo(image->semaphore); + if (status == MagickFalse) + return((Cache) NULL); + return(image->cache); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t I m a g e P i x e l C a c h e T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImagePixelCacheType() returns the pixel cache type: UndefinedCache, +% DiskCache, MapCache, MemoryCache, or PingCache. +% +% The format of the GetImagePixelCacheType() method is: +% +% CacheType GetImagePixelCacheType(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ + +MagickExport CacheType GetPixelCacheType(const Image *image) +{ + return(GetImagePixelCacheType(image)); +} + +MagickExport CacheType GetImagePixelCacheType(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + return(cache_info->type); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t O n e A u t h e n t i c P i x e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOneAuthenticPixel() returns a single pixel at the specified (x,y) +% location. The image background color is returned if an error occurs. +% +% The format of the GetOneAuthenticPixel() method is: +% +% MagickBooleanType GetOneAuthenticPixel(const Image image,const ssize_t x, +% const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y: These values define the location of the pixel to return. +% +% o pixel: return a pixel at the specified (x,y) location. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType GetOneAuthenticPixel(Image *image, + const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + PixelPacket + *magick_restrict pixels; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + *pixel=image->background_color; + if (cache_info->methods.get_one_authentic_pixel_from_handler != (GetOneAuthenticPixelFromHandler) NULL) + return(cache_info->methods.get_one_authentic_pixel_from_handler(image,x,y,pixel,exception)); + pixels=GetAuthenticPixelsCache(image,x,y,1UL,1UL,exception); + if (pixels == (PixelPacket *) NULL) + return(MagickFalse); + *pixel=(*pixels); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t O n e A u t h e n t i c P i x e l F r o m C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOneAuthenticPixelFromCache() returns a single pixel at the specified (x,y) +% location. The image background color is returned if an error occurs. +% +% The format of the GetOneAuthenticPixelFromCache() method is: +% +% MagickBooleanType GetOneAuthenticPixelFromCache(const Image image, +% const ssize_t x,const ssize_t y,PixelPacket *pixel, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y: These values define the location of the pixel to return. +% +% o pixel: return a pixel at the specified (x,y) location. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType GetOneAuthenticPixelFromCache(Image *image, + const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + PixelPacket + *magick_restrict pixels; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + *pixel=image->background_color; + assert(id < (int) cache_info->number_threads); + pixels=GetAuthenticPixelCacheNexus(image,x,y,1UL,1UL, + cache_info->nexus_info[id],exception); + if (pixels == (PixelPacket *) NULL) + return(MagickFalse); + *pixel=(*pixels); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t O n e V i r t u a l M a g i c k P i x e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOneVirtualMagickPixel() returns a single pixel at the specified (x,y) +% location. The image background color is returned if an error occurs. If +% you plan to modify the pixel, use GetOneAuthenticPixel() instead. +% +% The format of the GetOneVirtualMagickPixel() method is: +% +% MagickBooleanType GetOneVirtualMagickPixel(const Image image, +% const ssize_t x,const ssize_t y,MagickPixelPacket *pixel, +% ExceptionInfo exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y: these values define the location of the pixel to return. +% +% o pixel: return a pixel at the specified (x,y) location. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType GetOneVirtualMagickPixel(const Image *image, + const ssize_t x,const ssize_t y,MagickPixelPacket *pixel, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict pixels; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + pixels=GetVirtualPixelCacheNexus(image,GetPixelCacheVirtualMethod(image),x,y, + 1UL,1UL,cache_info->nexus_info[id],exception); + GetMagickPixelPacket(image,pixel); + if (pixels == (const PixelPacket *) NULL) + return(MagickFalse); + indexes=GetVirtualIndexesFromNexus(cache_info,cache_info->nexus_info[id]); + SetMagickPixelPacket(image,pixels,indexes,pixel); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t O n e V i r t u a l M e t h o d P i x e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOneVirtualMethodPixel() returns a single pixel at the specified (x,y) +% location as defined by specified pixel method. The image background color +% is returned if an error occurs. If you plan to modify the pixel, use +% GetOneAuthenticPixel() instead. +% +% The format of the GetOneVirtualMethodPixel() method is: +% +% MagickBooleanType GetOneVirtualMethodPixel(const Image image, +% const VirtualPixelMethod virtual_pixel_method,const ssize_t x, +% const ssize_t y,Pixelpacket *pixel,ExceptionInfo exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o virtual_pixel_method: the virtual pixel method. +% +% o x,y: These values define the location of the pixel to return. +% +% o pixel: return a pixel at the specified (x,y) location. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType GetOneVirtualMethodPixel(const Image *image, + const VirtualPixelMethod virtual_pixel_method,const ssize_t x,const ssize_t y, + PixelPacket *pixel,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + const PixelPacket + *magick_restrict pixels; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + *pixel=image->background_color; + if (cache_info->methods.get_one_virtual_pixel_from_handler != + (GetOneVirtualPixelFromHandler) NULL) + return(cache_info->methods.get_one_virtual_pixel_from_handler(image, + virtual_pixel_method,x,y,pixel,exception)); + assert(id < (int) cache_info->number_threads); + pixels=GetVirtualPixelCacheNexus(image,virtual_pixel_method,x,y,1UL,1UL, + cache_info->nexus_info[id],exception); + if (pixels == (const PixelPacket *) NULL) + return(MagickFalse); + *pixel=(*pixels); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t O n e V i r t u a l P i x e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOneVirtualPixel() returns a single virtual pixel at the specified +% (x,y) location. The image background color is returned if an error occurs. +% If you plan to modify the pixel, use GetOneAuthenticPixel() instead. +% +% The format of the GetOneVirtualPixel() method is: +% +% MagickBooleanType GetOneVirtualPixel(const Image image,const ssize_t x, +% const ssize_t y,PixelPacket *pixel,ExceptionInfo exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y: These values define the location of the pixel to return. +% +% o pixel: return a pixel at the specified (x,y) location. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType GetOneVirtualPixel(const Image *image, + const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + const PixelPacket + *magick_restrict pixels; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + *pixel=image->background_color; + if (cache_info->methods.get_one_virtual_pixel_from_handler != + (GetOneVirtualPixelFromHandler) NULL) + return(cache_info->methods.get_one_virtual_pixel_from_handler(image, + GetPixelCacheVirtualMethod(image),x,y,pixel,exception)); + assert(id < (int) cache_info->number_threads); + pixels=GetVirtualPixelCacheNexus(image,GetPixelCacheVirtualMethod(image),x,y, + 1UL,1UL,cache_info->nexus_info[id],exception); + if (pixels == (const PixelPacket *) NULL) + return(MagickFalse); + *pixel=(*pixels); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t O n e V i r t u a l P i x e l F r o m C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOneVirtualPixelFromCache() returns a single virtual pixel at the +% specified (x,y) location. The image background color is returned if an +% error occurs. +% +% The format of the GetOneVirtualPixelFromCache() method is: +% +% MagickBooleanType GetOneVirtualPixelFromCache(const Image image, +% const VirtualPixelPacket method,const ssize_t x,const ssize_t y, +% PixelPacket *pixel,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o virtual_pixel_method: the virtual pixel method. +% +% o x,y: These values define the location of the pixel to return. +% +% o pixel: return a pixel at the specified (x,y) location. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType GetOneVirtualPixelFromCache(const Image *image, + const VirtualPixelMethod virtual_pixel_method,const ssize_t x,const ssize_t y, + PixelPacket *pixel,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + const PixelPacket + *magick_restrict pixels; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + *pixel=image->background_color; + pixels=GetVirtualPixelCacheNexus(image,virtual_pixel_method,x,y,1UL,1UL, + cache_info->nexus_info[id],exception); + if (pixels == (const PixelPacket *) NULL) + return(MagickFalse); + *pixel=(*pixels); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t P i x e l C a c h e C h a n n e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelCacheChannels() returns the number of pixel channels associated +% with this instance of the pixel cache. +% +% The format of the GetPixelCacheChannels() method is: +% +% size_t GetPixelCacheChannels(Cache cache) +% +% A description of each parameter follows: +% +% o type: GetPixelCacheChannels returns DirectClass or PseudoClass. +% +% o cache: the pixel cache. +% +*/ +MagickExport size_t GetPixelCacheChannels(const Cache cache) +{ + CacheInfo + *magick_restrict cache_info; + + assert(cache != (Cache) NULL); + cache_info=(CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_info->filename); + return(cache_info->channels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t P i x e l C a c h e C o l o r s p a c e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelCacheColorspace() returns the colorspace of the pixel cache. +% +% The format of the GetPixelCacheColorspace() method is: +% +% Colorspace GetPixelCacheColorspace(const Cache cache) +% +% A description of each parameter follows: +% +% o cache: the pixel cache. +% +*/ +MagickExport ColorspaceType GetPixelCacheColorspace(const Cache cache) +{ + CacheInfo + *magick_restrict cache_info; + + assert(cache != (Cache) NULL); + cache_info=(CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_info->filename); + return(cache_info->colorspace); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t P i x e l C a c h e F i l e n a m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelCacheFilename() returns the filename associated with the pixel +% cache. +% +% The format of the GetPixelCacheFilename() method is: +% +% const char *GetPixelCacheFilename(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport const char *GetPixelCacheFilename(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + return(cache_info->cache_filename); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t P i x e l C a c h e M e t h o d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelCacheMethods() initializes the CacheMethods structure. +% +% The format of the GetPixelCacheMethods() method is: +% +% void GetPixelCacheMethods(CacheMethods *cache_methods) +% +% A description of each parameter follows: +% +% o cache_methods: Specifies a pointer to a CacheMethods structure. +% +*/ +MagickExport void GetPixelCacheMethods(CacheMethods *cache_methods) +{ + assert(cache_methods != (CacheMethods *) NULL); + (void) memset(cache_methods,0,sizeof(*cache_methods)); + cache_methods->get_virtual_pixel_handler=GetVirtualPixelCache; + cache_methods->get_virtual_pixels_handler=GetVirtualPixelsCache; + cache_methods->get_virtual_indexes_from_handler=GetVirtualIndexesFromCache; + cache_methods->get_one_virtual_pixel_from_handler=GetOneVirtualPixelFromCache; + cache_methods->get_authentic_pixels_handler=GetAuthenticPixelsCache; + cache_methods->get_authentic_indexes_from_handler= + GetAuthenticIndexesFromCache; + cache_methods->get_authentic_pixels_from_handler=GetAuthenticPixelsFromCache; + cache_methods->get_one_authentic_pixel_from_handler= + GetOneAuthenticPixelFromCache; + cache_methods->queue_authentic_pixels_handler=QueueAuthenticPixelsCache; + cache_methods->sync_authentic_pixels_handler=SyncAuthenticPixelsCache; + cache_methods->destroy_pixel_handler=DestroyImagePixelCache; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t P i x e l C a c h e N e x u s E x t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelCacheNexusExtent() returns the extent of the pixels associated with +% the last call to SetPixelCacheNexusPixels() or GetPixelCacheNexusPixels(). +% +% The format of the GetPixelCacheNexusExtent() method is: +% +% MagickSizeType GetPixelCacheNexusExtent(const Cache cache, +% NexusInfo *nexus_info) +% +% A description of each parameter follows: +% +% o nexus_info: the nexus info. +% +*/ +MagickExport MagickSizeType GetPixelCacheNexusExtent(const Cache cache, + NexusInfo *nexus_info) +{ + CacheInfo + *magick_restrict cache_info; + + MagickSizeType + extent; + + assert(cache != NULL); + cache_info=(CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + extent=(MagickSizeType) nexus_info->region.width*nexus_info->region.height; + if (extent == 0) + return((MagickSizeType) cache_info->columns*cache_info->rows); + return(extent); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t P i x e l C a c h e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelCachePixels() returns the pixels associated with the specified image. +% +% The format of the GetPixelCachePixels() method is: +% +% void *GetPixelCachePixels(Image *image,MagickSizeType *length, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o length: the pixel cache length. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport void *GetPixelCachePixels(Image *image,MagickSizeType *length, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + assert(length != (MagickSizeType *) NULL); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + (void) exception; + *length=cache_info->length; + if ((cache_info->type != MemoryCache) && (cache_info->type != MapCache)) + return((void *) NULL); + return((void *) cache_info->pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t P i x e l C a c h e S t o r a g e C l a s s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelCacheStorageClass() returns the class type of the pixel cache. +% +% The format of the GetPixelCacheStorageClass() method is: +% +% ClassType GetPixelCacheStorageClass(Cache cache) +% +% A description of each parameter follows: +% +% o type: GetPixelCacheStorageClass returns DirectClass or PseudoClass. +% +% o cache: the pixel cache. +% +*/ +MagickExport ClassType GetPixelCacheStorageClass(const Cache cache) +{ + CacheInfo + *magick_restrict cache_info; + + assert(cache != (Cache) NULL); + cache_info=(CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_info->filename); + return(cache_info->storage_class); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t P i x e l C a c h e T i l e S i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelCacheTileSize() returns the pixel cache tile size. +% +% The format of the GetPixelCacheTileSize() method is: +% +% void GetPixelCacheTileSize(const Image *image,size_t *width, +% size_t *height) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o width: the optimize cache tile width in pixels. +% +% o height: the optimize cache tile height in pixels. +% +*/ +MagickExport void GetPixelCacheTileSize(const Image *image,size_t *width, + size_t *height) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + *width=2048UL/sizeof(PixelPacket); + if (GetImagePixelCacheType(image) == DiskCache) + *width=8192UL/sizeof(PixelPacket); + *height=(*width); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t P i x e l C a c h e V i r t u a l M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelCacheVirtualMethod() gets the "virtual pixels" method for the +% pixel cache. A virtual pixel is any pixel access that is outside the +% boundaries of the image cache. +% +% The format of the GetPixelCacheVirtualMethod() method is: +% +% VirtualPixelMethod GetPixelCacheVirtualMethod(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport VirtualPixelMethod GetPixelCacheVirtualMethod(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + return(cache_info->virtual_pixel_method); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t V i r t u a l I n d e x e s F r o m C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetVirtualIndexesFromCache() returns the indexes associated with the last +% call to QueueAuthenticPixelsCache() or GetVirtualPixelCache(). +% +% The format of the GetVirtualIndexesFromCache() method is: +% +% IndexPacket *GetVirtualIndexesFromCache(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +static const IndexPacket *GetVirtualIndexesFromCache(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + return(GetVirtualIndexesFromNexus(cache_info,cache_info->nexus_info[id])); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t V i r t u a l I n d e x e s F r o m N e x u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetVirtualIndexesFromNexus() returns the indexes associated with the +% specified cache nexus. +% +% The format of the GetVirtualIndexesFromNexus() method is: +% +% const IndexPacket *GetVirtualIndexesFromNexus(const Cache cache, +% NexusInfo *nexus_info) +% +% A description of each parameter follows: +% +% o cache: the pixel cache. +% +% o nexus_info: the cache nexus to return the colormap indexes. +% +*/ +MagickExport const IndexPacket *GetVirtualIndexesFromNexus(const Cache cache, + NexusInfo *nexus_info) +{ + CacheInfo + *magick_restrict cache_info; + + assert(cache != (Cache) NULL); + cache_info=(CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->storage_class == UndefinedClass) + return((IndexPacket *) NULL); + return(nexus_info->indexes); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t V i r t u a l I n d e x Q u e u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetVirtualIndexQueue() returns the virtual black channel or the +% colormap indexes associated with the last call to QueueAuthenticPixels() or +% GetVirtualPixels(). NULL is returned if the black channel or colormap +% indexes are not available. +% +% The format of the GetVirtualIndexQueue() method is: +% +% const IndexPacket *GetVirtualIndexQueue(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport const IndexPacket *GetVirtualIndexQueue(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->methods.get_virtual_indexes_from_handler != + (GetVirtualIndexesFromHandler) NULL) + return(cache_info->methods.get_virtual_indexes_from_handler(image)); + assert(id < (int) cache_info->number_threads); + return(GetVirtualIndexesFromNexus(cache_info,cache_info->nexus_info[id])); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t V i r t u a l P i x e l C a c h e N e x u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetVirtualPixelCacheNexus() gets virtual pixels from the in-memory or disk +% pixel cache as defined by the geometry parameters. A pointer to the pixels +% is returned if the pixels are transferred, otherwise a NULL is returned. +% +% The format of the GetVirtualPixelCacheNexus() method is: +% +% PixelPacket *GetVirtualPixelCacheNexus(const Image *image, +% const VirtualPixelMethod method,const ssize_t x,const ssize_t y, +% const size_t columns,const size_t rows,NexusInfo *nexus_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o virtual_pixel_method: the virtual pixel method. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o nexus_info: the cache nexus to acquire. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static ssize_t + DitherMatrix[64] = + { + 0, 48, 12, 60, 3, 51, 15, 63, + 32, 16, 44, 28, 35, 19, 47, 31, + 8, 56, 4, 52, 11, 59, 7, 55, + 40, 24, 36, 20, 43, 27, 39, 23, + 2, 50, 14, 62, 1, 49, 13, 61, + 34, 18, 46, 30, 33, 17, 45, 29, + 10, 58, 6, 54, 9, 57, 5, 53, + 42, 26, 38, 22, 41, 25, 37, 21 + }; + +static inline ssize_t DitherX(const ssize_t x,const size_t columns) +{ + ssize_t + index; + + index=x+DitherMatrix[x & 0x07]-32L; + if (index < 0L) + return(0L); + if (index >= (ssize_t) columns) + return((ssize_t) columns-1L); + return(index); +} + +static inline ssize_t DitherY(const ssize_t y,const size_t rows) +{ + ssize_t + index; + + index=y+DitherMatrix[y & 0x07]-32L; + if (index < 0L) + return(0L); + if (index >= (ssize_t) rows) + return((ssize_t) rows-1L); + return(index); +} + +static inline ssize_t EdgeX(const ssize_t x,const size_t columns) +{ + if (x < 0L) + return(0L); + if (x >= (ssize_t) columns) + return((ssize_t) (columns-1)); + return(x); +} + +static inline ssize_t EdgeY(const ssize_t y,const size_t rows) +{ + if (y < 0L) + return(0L); + if (y >= (ssize_t) rows) + return((ssize_t) (rows-1)); + return(y); +} + +static inline ssize_t RandomX(RandomInfo *random_info,const size_t columns) +{ + return((ssize_t) (columns*GetPseudoRandomValue(random_info))); +} + +static inline ssize_t RandomY(RandomInfo *random_info,const size_t rows) +{ + return((ssize_t) (rows*GetPseudoRandomValue(random_info))); +} + +static inline MagickModulo VirtualPixelModulo(const ssize_t offset, + const size_t extent) +{ + MagickModulo + modulo; + + modulo.quotient=offset; + if (extent != 0) + modulo.quotient=offset/((ssize_t) extent); + modulo.remainder=offset % ((ssize_t) extent); + if ((modulo.remainder != 0) && ((offset ^ ((ssize_t) extent)) < 0)) + { + modulo.quotient-=1; + modulo.remainder+=((ssize_t) extent); + } + return(modulo); +} + +MagickExport const PixelPacket *GetVirtualPixelCacheNexus(const Image *image, + const VirtualPixelMethod virtual_pixel_method,const ssize_t x,const ssize_t y, + const size_t columns,const size_t rows,NexusInfo *nexus_info, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const IndexPacket + *magick_restrict virtual_indexes; + + const PixelPacket + *magick_restrict p; + + IndexPacket + virtual_index, + *magick_restrict indexes; + + MagickOffsetType + offset; + + MagickSizeType + length, + number_pixels; + + NexusInfo + *magick_restrict virtual_nexus; + + PixelPacket + *magick_restrict pixels, + *magick_restrict q, + virtual_pixel; + + ssize_t + u, + v; + + /* + Acquire pixels. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->type == UndefinedCache) + return((const PixelPacket *) NULL); +#if defined(MAGICKCORE_OPENCL_SUPPORT) + CopyOpenCLBuffer(cache_info); +#endif + pixels=SetPixelCacheNexusPixels(cache_info,ReadMode,x,y,columns,rows, + (image->clip_mask != (Image *) NULL) || (image->mask != (Image *) NULL) ? + MagickTrue : MagickFalse,nexus_info,exception); + if (pixels == (PixelPacket *) NULL) + return((const PixelPacket *) NULL); + offset=(MagickOffsetType) nexus_info->region.y*cache_info->columns+ + nexus_info->region.x; + length=(MagickSizeType) (nexus_info->region.height-1L)*cache_info->columns+ + nexus_info->region.width-1L; + number_pixels=(MagickSizeType) cache_info->columns*cache_info->rows; + if ((offset >= 0) && (((MagickSizeType) offset+length) < number_pixels)) + if ((x >= 0) && ((ssize_t) (x+columns) <= (ssize_t) cache_info->columns) && + (y >= 0) && ((ssize_t) (y+rows) <= (ssize_t) cache_info->rows)) + { + MagickBooleanType + status; + + /* + Pixel request is inside cache extents. + */ + if (nexus_info->authentic_pixel_cache != MagickFalse) + return(pixels); + status=ReadPixelCachePixels(cache_info,nexus_info,exception); + if (status == MagickFalse) + return((const PixelPacket *) NULL); + if ((cache_info->storage_class == PseudoClass) || + (cache_info->colorspace == CMYKColorspace)) + { + status=ReadPixelCacheIndexes(cache_info,nexus_info,exception); + if (status == MagickFalse) + return((const PixelPacket *) NULL); + } + return(pixels); + } + /* + Pixel request is outside cache extents. + */ + virtual_nexus=nexus_info->virtual_nexus; + q=pixels; + indexes=nexus_info->indexes; + switch (virtual_pixel_method) + { + case BlackVirtualPixelMethod: + { + SetPixelRed(&virtual_pixel,0); + SetPixelGreen(&virtual_pixel,0); + SetPixelBlue(&virtual_pixel,0); + SetPixelOpacity(&virtual_pixel,OpaqueOpacity); + break; + } + case GrayVirtualPixelMethod: + { + SetPixelRed(&virtual_pixel,QuantumRange/2); + SetPixelGreen(&virtual_pixel,QuantumRange/2); + SetPixelBlue(&virtual_pixel,QuantumRange/2); + SetPixelOpacity(&virtual_pixel,OpaqueOpacity); + break; + } + case TransparentVirtualPixelMethod: + { + SetPixelRed(&virtual_pixel,0); + SetPixelGreen(&virtual_pixel,0); + SetPixelBlue(&virtual_pixel,0); + SetPixelOpacity(&virtual_pixel,TransparentOpacity); + break; + } + case MaskVirtualPixelMethod: + case WhiteVirtualPixelMethod: + { + SetPixelRed(&virtual_pixel,QuantumRange); + SetPixelGreen(&virtual_pixel,QuantumRange); + SetPixelBlue(&virtual_pixel,QuantumRange); + SetPixelOpacity(&virtual_pixel,OpaqueOpacity); + break; + } + default: + { + virtual_pixel=image->background_color; + break; + } + } + virtual_index=(IndexPacket) 0; + for (v=0; v < (ssize_t) rows; v++) + { + ssize_t + y_offset; + + y_offset=y+v; + if ((virtual_pixel_method == EdgeVirtualPixelMethod) || + (virtual_pixel_method == UndefinedVirtualPixelMethod)) + y_offset=EdgeY(y_offset,cache_info->rows); + for (u=0; u < (ssize_t) columns; u+=length) + { + ssize_t + x_offset; + + x_offset=x+u; + length=(MagickSizeType) MagickMin(cache_info->columns-x_offset,columns-u); + if (((x_offset < 0) || (x_offset >= (ssize_t) cache_info->columns)) || + ((y_offset < 0) || (y_offset >= (ssize_t) cache_info->rows)) || + (length == 0)) + { + MagickModulo + x_modulo, + y_modulo; + + /* + Transfer a single pixel. + */ + length=(MagickSizeType) 1; + switch (virtual_pixel_method) + { + case BackgroundVirtualPixelMethod: + case ConstantVirtualPixelMethod: + case BlackVirtualPixelMethod: + case GrayVirtualPixelMethod: + case TransparentVirtualPixelMethod: + case MaskVirtualPixelMethod: + case WhiteVirtualPixelMethod: + { + p=(&virtual_pixel); + virtual_indexes=(&virtual_index); + break; + } + case EdgeVirtualPixelMethod: + default: + { + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, + EdgeX(x_offset,cache_info->columns), + EdgeY(y_offset,cache_info->rows),1UL,1UL,virtual_nexus, + exception); + virtual_indexes=GetVirtualIndexesFromNexus(cache_info, + virtual_nexus); + break; + } + case RandomVirtualPixelMethod: + { + if (cache_info->random_info == (RandomInfo *) NULL) + cache_info->random_info=AcquireRandomInfo(); + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, + RandomX(cache_info->random_info,cache_info->columns), + RandomY(cache_info->random_info,cache_info->rows),1UL,1UL, + virtual_nexus,exception); + virtual_indexes=GetVirtualIndexesFromNexus(cache_info, + virtual_nexus); + break; + } + case DitherVirtualPixelMethod: + { + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, + DitherX(x_offset,cache_info->columns), + DitherY(y_offset,cache_info->rows),1UL,1UL,virtual_nexus, + exception); + virtual_indexes=GetVirtualIndexesFromNexus(cache_info, + virtual_nexus); + break; + } + case TileVirtualPixelMethod: + { + x_modulo=VirtualPixelModulo(x_offset,cache_info->columns); + y_modulo=VirtualPixelModulo(y_offset,cache_info->rows); + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, + x_modulo.remainder,y_modulo.remainder,1UL,1UL,virtual_nexus, + exception); + virtual_indexes=GetVirtualIndexesFromNexus(cache_info, + virtual_nexus); + break; + } + case MirrorVirtualPixelMethod: + { + x_modulo=VirtualPixelModulo(x_offset,cache_info->columns); + if ((x_modulo.quotient & 0x01) == 1L) + x_modulo.remainder=(ssize_t) cache_info->columns- + x_modulo.remainder-1L; + y_modulo=VirtualPixelModulo(y_offset,cache_info->rows); + if ((y_modulo.quotient & 0x01) == 1L) + y_modulo.remainder=(ssize_t) cache_info->rows- + y_modulo.remainder-1L; + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, + x_modulo.remainder,y_modulo.remainder,1UL,1UL,virtual_nexus, + exception); + virtual_indexes=GetVirtualIndexesFromNexus(cache_info, + virtual_nexus); + break; + } + case CheckerTileVirtualPixelMethod: + { + x_modulo=VirtualPixelModulo(x_offset,cache_info->columns); + y_modulo=VirtualPixelModulo(y_offset,cache_info->rows); + if (((x_modulo.quotient ^ y_modulo.quotient) & 0x01) != 0L) + { + p=(&virtual_pixel); + virtual_indexes=(&virtual_index); + break; + } + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, + x_modulo.remainder,y_modulo.remainder,1UL,1UL,virtual_nexus, + exception); + virtual_indexes=GetVirtualIndexesFromNexus(cache_info, + virtual_nexus); + break; + } + case HorizontalTileVirtualPixelMethod: + { + if ((y_offset < 0) || (y_offset >= (ssize_t) cache_info->rows)) + { + p=(&virtual_pixel); + virtual_indexes=(&virtual_index); + break; + } + x_modulo=VirtualPixelModulo(x_offset,cache_info->columns); + y_modulo=VirtualPixelModulo(y_offset,cache_info->rows); + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, + x_modulo.remainder,y_modulo.remainder,1UL,1UL,virtual_nexus, + exception); + virtual_indexes=GetVirtualIndexesFromNexus(cache_info, + virtual_nexus); + break; + } + case VerticalTileVirtualPixelMethod: + { + if ((x_offset < 0) || (x_offset >= (ssize_t) cache_info->columns)) + { + p=(&virtual_pixel); + virtual_indexes=(&virtual_index); + break; + } + x_modulo=VirtualPixelModulo(x_offset,cache_info->columns); + y_modulo=VirtualPixelModulo(y_offset,cache_info->rows); + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, + x_modulo.remainder,y_modulo.remainder,1UL,1UL,virtual_nexus, + exception); + virtual_indexes=GetVirtualIndexesFromNexus(cache_info, + virtual_nexus); + break; + } + case HorizontalTileEdgeVirtualPixelMethod: + { + x_modulo=VirtualPixelModulo(x_offset,cache_info->columns); + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, + x_modulo.remainder,EdgeY(y_offset,cache_info->rows),1UL,1UL, + virtual_nexus,exception); + virtual_indexes=GetVirtualIndexesFromNexus(cache_info, + virtual_nexus); + break; + } + case VerticalTileEdgeVirtualPixelMethod: + { + y_modulo=VirtualPixelModulo(y_offset,cache_info->rows); + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, + EdgeX(x_offset,cache_info->columns),y_modulo.remainder,1UL,1UL, + virtual_nexus,exception); + virtual_indexes=GetVirtualIndexesFromNexus(cache_info, + virtual_nexus); + break; + } + } + if (p == (const PixelPacket *) NULL) + break; + *q++=(*p); + if ((indexes != (IndexPacket *) NULL) && + (virtual_indexes != (const IndexPacket *) NULL)) + *indexes++=(*virtual_indexes); + continue; + } + /* + Transfer a run of pixels. + */ + p=GetVirtualPixelCacheNexus(image,virtual_pixel_method,x_offset,y_offset, + (size_t) length,1UL,virtual_nexus,exception); + if (p == (const PixelPacket *) NULL) + break; + virtual_indexes=GetVirtualIndexesFromNexus(cache_info,virtual_nexus); + (void) memcpy(q,p,(size_t) length*sizeof(*p)); + q+=length; + if ((indexes != (IndexPacket *) NULL) && + (virtual_indexes != (const IndexPacket *) NULL)) + { + (void) memcpy(indexes,virtual_indexes,(size_t) length* + sizeof(*virtual_indexes)); + indexes+=length; + } + } + if (u < (ssize_t) columns) + break; + } + /* + Free resources. + */ + if (v < (ssize_t) rows) + return((const PixelPacket *) NULL); + return(pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t V i r t u a l P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetVirtualPixelCache() get virtual pixels from the in-memory or disk pixel +% cache as defined by the geometry parameters. A pointer to the pixels +% is returned if the pixels are transferred, otherwise a NULL is returned. +% +% The format of the GetVirtualPixelCache() method is: +% +% const PixelPacket *GetVirtualPixelCache(const Image *image, +% const VirtualPixelMethod virtual_pixel_method,const ssize_t x, +% const ssize_t y,const size_t columns,const size_t rows, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o virtual_pixel_method: the virtual pixel method. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static const PixelPacket *GetVirtualPixelCache(const Image *image, + const VirtualPixelMethod virtual_pixel_method,const ssize_t x,const ssize_t y, + const size_t columns,const size_t rows,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + return(GetVirtualPixelCacheNexus(image,virtual_pixel_method,x,y,columns,rows, + cache_info->nexus_info[id],exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t V i r t u a l P i x e l Q u e u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetVirtualPixelQueue() returns the virtual pixels associated with the +% last call to QueueAuthenticPixels() or GetVirtualPixels(). +% +% The format of the GetVirtualPixelQueue() method is: +% +% const PixelPacket *GetVirtualPixelQueue(const Image image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport const PixelPacket *GetVirtualPixelQueue(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->methods.get_virtual_pixels_handler != + (GetVirtualPixelsHandler) NULL) + return(cache_info->methods.get_virtual_pixels_handler(image)); + assert(id < (int) cache_info->number_threads); + return(GetVirtualPixelsNexus(cache_info,cache_info->nexus_info[id])); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t V i r t u a l P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetVirtualPixels() returns an immutable pixel region. If the +% region is successfully accessed, a pointer to it is returned, otherwise +% NULL is returned. The returned pointer may point to a temporary working +% copy of the pixels or it may point to the original pixels in memory. +% Performance is maximized if the selected region is part of one row, or one +% or more full rows, since there is opportunity to access the pixels in-place +% (without a copy) if the image is in memory, or in a memory-mapped file. The +% returned pointer must *never* be deallocated by the user. +% +% Pixels accessed via the returned pointer represent a simple array of type +% PixelPacket. If the image type is CMYK or the storage class is PseudoClass, +% call GetAuthenticIndexQueue() after invoking GetAuthenticPixels() to access +% the black color component or to obtain the colormap indexes (of type +% IndexPacket) corresponding to the region. +% +% If you plan to modify the pixels, use GetAuthenticPixels() instead. +% +% Note, the GetVirtualPixels() and GetAuthenticPixels() methods are not thread- +% safe. In a threaded environment, use GetCacheViewVirtualPixels() or +% GetCacheViewAuthenticPixels() instead. +% +% The format of the GetVirtualPixels() method is: +% +% const PixelPacket *GetVirtualPixels(const Image *image,const ssize_t x, +% const ssize_t y,const size_t columns,const size_t rows, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport const PixelPacket *GetVirtualPixels(const Image *image, + const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->methods.get_virtual_pixel_handler != + (GetVirtualPixelHandler) NULL) + return(cache_info->methods.get_virtual_pixel_handler(image, + GetPixelCacheVirtualMethod(image),x,y,columns,rows,exception)); + assert(id < (int) cache_info->number_threads); + return(GetVirtualPixelCacheNexus(image,GetPixelCacheVirtualMethod(image),x,y, + columns,rows,cache_info->nexus_info[id],exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t V i r t u a l P i x e l s F r o m C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetVirtualPixelsCache() returns the pixels associated with the last call +% to QueueAuthenticPixelsCache() or GetVirtualPixelCache(). +% +% The format of the GetVirtualPixelsCache() method is: +% +% PixelPacket *GetVirtualPixelsCache(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +static const PixelPacket *GetVirtualPixelsCache(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + return(GetVirtualPixelsNexus(image->cache,cache_info->nexus_info[id])); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t V i r t u a l P i x e l s N e x u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetVirtualPixelsNexus() returns the pixels associated with the specified +% cache nexus. +% +% The format of the GetVirtualPixelsNexus() method is: +% +% const IndexPacket *GetVirtualPixelsNexus(const Cache cache, +% NexusInfo *nexus_info) +% +% A description of each parameter follows: +% +% o cache: the pixel cache. +% +% o nexus_info: the cache nexus to return the colormap pixels. +% +*/ +MagickExport const PixelPacket *GetVirtualPixelsNexus(const Cache cache, + NexusInfo *nexus_info) +{ + CacheInfo + *magick_restrict cache_info; + + assert(cache != (Cache) NULL); + cache_info=(CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->storage_class == UndefinedClass) + return((PixelPacket *) NULL); + return((const PixelPacket *) nexus_info->pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M a s k P i x e l C a c h e N e x u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MaskPixelCacheNexus() masks the cache nexus as defined by the image mask. +% The method returns MagickTrue if the pixel region is masked, otherwise +% MagickFalse. +% +% The format of the MaskPixelCacheNexus() method is: +% +% MagickBooleanType MaskPixelCacheNexus(Image *image, +% NexusInfo *nexus_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o nexus_info: the cache nexus to clip. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline void ApplyPixelCompositeMask(const MagickPixelPacket *p, + const MagickRealType alpha,const MagickPixelPacket *q, + const MagickRealType beta,MagickPixelPacket *composite) +{ + double + gamma; + + if (fabs((double) (alpha-TransparentOpacity)) < MagickEpsilon) + { + *composite=(*q); + return; + } + gamma=1.0-QuantumScale*QuantumScale*alpha*beta; + gamma=PerceptibleReciprocal(gamma); + composite->red=gamma*MagickOver_(p->red,alpha,q->red,beta); + composite->green=gamma*MagickOver_(p->green,alpha,q->green,beta); + composite->blue=gamma*MagickOver_(p->blue,alpha,q->blue,beta); + if ((p->colorspace == CMYKColorspace) && (q->colorspace == CMYKColorspace)) + composite->index=gamma*MagickOver_(p->index,alpha,q->index,beta); +} + +static MagickBooleanType MaskPixelCacheNexus(Image *image,NexusInfo *nexus_info, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const PixelPacket + *magick_restrict r; + + IndexPacket + *magick_restrict nexus_indexes, + *magick_restrict indexes; + + MagickOffsetType + n; + + MagickPixelPacket + alpha, + beta; + + NexusInfo + **magick_restrict mask_nexus; + + PixelPacket + *magick_restrict p, + *magick_restrict q; + + ssize_t + y; + + /* + Apply composite mask. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((image->mask == (Image *) NULL) || (image->storage_class == PseudoClass)) + return(MagickTrue); + if ((nexus_info->region.width == 0) || (nexus_info->region.height == 0)) + return(MagickTrue); + cache_info=(CacheInfo *) image->cache; + if (cache_info == (Cache) NULL) + return(MagickFalse); + mask_nexus=AcquirePixelCacheNexus(1); + p=GetAuthenticPixelCacheNexus(image,nexus_info->region.x,nexus_info->region.y, nexus_info->region.width,nexus_info->region.height, + nexus_info->virtual_nexus,exception); + indexes=nexus_info->virtual_nexus->indexes; + q=nexus_info->pixels; + nexus_indexes=nexus_info->indexes; + r=GetVirtualPixelCacheNexus(image->mask,MaskVirtualPixelMethod, + nexus_info->region.x,nexus_info->region.y,nexus_info->region.width, + nexus_info->region.height,mask_nexus[0],&image->exception); + if ((p == (PixelPacket *) NULL) || (q == (PixelPacket *) NULL) || + (r == (const PixelPacket *) NULL)) + return(MagickFalse); + n=0; + GetMagickPixelPacket(image,&alpha); + GetMagickPixelPacket(image,&beta); + for (y=0; y < (ssize_t) nexus_info->region.height; y++) + { + ssize_t + x; + + for (x=0; x < (ssize_t) nexus_info->region.width; x++) + { + SetMagickPixelPacket(image,p,indexes+n,&alpha); + SetMagickPixelPacket(image,q,nexus_indexes+n,&beta); + ApplyPixelCompositeMask(&beta,GetPixelIntensity(image,r),&alpha, + alpha.opacity,&beta); + SetPixelRed(q,ClampToQuantum(beta.red)); + SetPixelGreen(q,ClampToQuantum(beta.green)); + SetPixelBlue(q,ClampToQuantum(beta.blue)); + SetPixelOpacity(q,ClampToQuantum(beta.opacity)); + if (cache_info->active_index_channel != MagickFalse) + SetPixelIndex(nexus_indexes+n,GetPixelIndex(indexes+n)); + p++; + q++; + r++; + n++; + } + } + mask_nexus=DestroyPixelCacheNexus(mask_nexus,1); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ O p e n P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% OpenPixelCache() allocates the pixel cache. This includes defining the cache +% dimensions, allocating space for the image pixels and optionally the +% colormap indexes, and memory mapping the cache if it is disk based. The +% cache nexus array is initialized as well. +% +% The format of the OpenPixelCache() method is: +% +% MagickBooleanType OpenPixelCache(Image *image,const MapMode mode, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o mode: ReadMode, WriteMode, or IOMode. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType OpenPixelCacheOnDisk(CacheInfo *cache_info, + const MapMode mode) +{ + int + file; + + /* + Open pixel cache on disk. + */ + if ((cache_info->file != -1) && (cache_info->disk_mode == mode)) + return(MagickTrue); /* cache already open and in the proper mode */ + if (*cache_info->cache_filename == '\0') + file=AcquireUniqueFileResource(cache_info->cache_filename); + else + switch (mode) + { + case ReadMode: + { + file=open_utf8(cache_info->cache_filename,O_RDONLY | O_BINARY,0); + break; + } + case WriteMode: + { + file=open_utf8(cache_info->cache_filename,O_WRONLY | O_CREAT | + O_BINARY | O_EXCL,S_MODE); + if (file == -1) + file=open_utf8(cache_info->cache_filename,O_WRONLY | O_BINARY,S_MODE); + break; + } + case IOMode: + default: + { + file=open_utf8(cache_info->cache_filename,O_RDWR | O_CREAT | O_BINARY | + O_EXCL,S_MODE); + if (file == -1) + file=open_utf8(cache_info->cache_filename,O_RDWR | O_BINARY,S_MODE); + break; + } + } + if (file == -1) + return(MagickFalse); + (void) AcquireMagickResource(FileResource,1); + if (cache_info->file != -1) + (void) ClosePixelCacheOnDisk(cache_info); + cache_info->file=file; + cache_info->disk_mode=mode; + return(MagickTrue); +} + +static inline MagickOffsetType WritePixelCacheRegion( + const CacheInfo *magick_restrict cache_info,const MagickOffsetType offset, + const MagickSizeType length,const unsigned char *magick_restrict buffer) +{ + MagickOffsetType + i; + + ssize_t + count; + +#if !defined(MAGICKCORE_HAVE_PWRITE) + if (lseek(cache_info->file,offset,SEEK_SET) < 0) + return((MagickOffsetType) -1); +#endif + count=0; + for (i=0; i < (MagickOffsetType) length; i+=count) + { +#if !defined(MAGICKCORE_HAVE_PWRITE) + count=write(cache_info->file,buffer+i,(size_t) MagickMin(length-i,(size_t) + MAGICK_SSIZE_MAX)); +#else + count=pwrite(cache_info->file,buffer+i,(size_t) MagickMin(length-i,(size_t) + MAGICK_SSIZE_MAX),offset+i); +#endif + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + return(i); +} + +static MagickBooleanType SetPixelCacheExtent(Image *image,MagickSizeType length) +{ + CacheInfo + *magick_restrict cache_info; + + MagickOffsetType + count, + extent, + offset; + + cache_info=(CacheInfo *) image->cache; + if (image->debug != MagickFalse) + { + char + format[MaxTextExtent], + message[MaxTextExtent]; + + (void) FormatMagickSize(length,MagickFalse,format); + (void) FormatLocaleString(message,MaxTextExtent, + "extend %s (%s[%d], disk, %s)",cache_info->filename, + cache_info->cache_filename,cache_info->file,format); + (void) LogMagickEvent(CacheEvent,GetMagickModule(),"%s",message); + } + offset=(MagickOffsetType) lseek(cache_info->file,0,SEEK_END); + if (offset < 0) + return(MagickFalse); + if ((MagickSizeType) offset >= length) + count=(MagickOffsetType) 1; + else + { + extent=(MagickOffsetType) length-1; + count=WritePixelCacheRegion(cache_info,extent,1,(const unsigned char *) + ""); + if (count != 1) + return(MagickFalse); +#if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE) + if (cache_info->synchronize != MagickFalse) + if (posix_fallocate(cache_info->file,offset+1,extent-offset) != 0) + return(MagickFalse); +#endif + } + offset=(MagickOffsetType) lseek(cache_info->file,0,SEEK_SET); + if (offset < 0) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info, + source_info; + + char + format[MaxTextExtent], + message[MaxTextExtent]; + + const char + *hosts, + *type; + + MagickSizeType + length, + number_pixels; + + MagickStatusType + status; + + size_t + columns, + packet_size; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (cache_anonymous_memory < 0) + { + char + *value; + + /* + Does the security policy require anonymous mapping for pixel cache? + */ + cache_anonymous_memory=0; + value=GetPolicyValue("pixel-cache-memory"); + if (value == (char *) NULL) + value=GetPolicyValue("cache:memory-map"); + if (LocaleCompare(value,"anonymous") == 0) + { +#if defined(MAGICKCORE_HAVE_MMAP) && defined(MAP_ANONYMOUS) + cache_anonymous_memory=1; +#else + (void) ThrowMagickException(exception,GetMagickModule(), + MissingDelegateError,"DelegateLibrarySupportNotBuiltIn", + "'%s' (policy requires anonymous memory mapping)",image->filename); +#endif + } + value=DestroyString(value); + } + if ((image->columns == 0) || (image->rows == 0)) + ThrowBinaryException(CacheError,"NoPixelsDefinedInCache",image->filename); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (((MagickSizeType) image->columns > cache_info->width_limit) || + ((MagickSizeType) image->rows > cache_info->height_limit)) + ThrowBinaryException(ImageError,"WidthOrHeightExceedsLimit", + image->filename); + if (GetMagickResourceLimit(ListLengthResource) != MagickResourceInfinity) + { + length=GetImageListLength(image); + if (AcquireMagickResource(ListLengthResource,length) == MagickFalse) + ThrowBinaryException(ResourceLimitError,"ListLengthExceedsLimit", + image->filename); + } + source_info=(*cache_info); + source_info.file=(-1); + (void) FormatLocaleString(cache_info->filename,MaxTextExtent,"%s[%.20g]", + image->filename,(double) image->scene); + cache_info->storage_class=image->storage_class; + cache_info->colorspace=image->colorspace; + cache_info->rows=image->rows; + cache_info->columns=image->columns; + cache_info->channels=image->channels; + cache_info->active_index_channel=((image->storage_class == PseudoClass) || + (image->colorspace == CMYKColorspace)) ? MagickTrue : MagickFalse; + cache_info->mode=mode; + number_pixels=(MagickSizeType) cache_info->columns*cache_info->rows; + packet_size=sizeof(PixelPacket); + if (cache_info->active_index_channel != MagickFalse) + packet_size+=sizeof(IndexPacket); + length=number_pixels*packet_size; + columns=(size_t) (length/cache_info->rows/packet_size); + if ((cache_info->columns != columns) || ((ssize_t) cache_info->columns < 0) || + ((ssize_t) cache_info->rows < 0)) + ThrowBinaryException(ResourceLimitError,"PixelCacheAllocationFailed", + image->filename); + cache_info->length=length; + if (image->ping != MagickFalse) + { + cache_info->type=PingCache; + return(MagickTrue); + } + status=AcquireMagickResource(AreaResource,(MagickSizeType) + cache_info->columns*cache_info->rows); + if (cache_info->mode == PersistMode) + status=MagickFalse; + length=number_pixels*(sizeof(PixelPacket)+sizeof(IndexPacket)); + if ((status != MagickFalse) && + (length == (MagickSizeType) ((size_t) length)) && + ((cache_info->type == UndefinedCache) || + (cache_info->type == MemoryCache))) + { + status=AcquireMagickResource(MemoryResource,cache_info->length); + if (status != MagickFalse) + { + status=MagickTrue; + if (cache_anonymous_memory <= 0) + { + cache_info->mapped=MagickFalse; + cache_info->pixels=(PixelPacket *) MagickAssumeAligned( + AcquireAlignedMemory(1,(size_t) cache_info->length)); + } + else + { + cache_info->mapped=MagickTrue; + cache_info->pixels=(PixelPacket *) MapBlob(-1,IOMode,0,(size_t) + cache_info->length); + } + if (cache_info->pixels == (PixelPacket *) NULL) + { + cache_info->mapped=source_info.mapped; + cache_info->pixels=source_info.pixels; + } + else + { + /* + Create memory pixel cache. + */ + cache_info->colorspace=image->colorspace; + cache_info->type=MemoryCache; + cache_info->indexes=(IndexPacket *) NULL; + if (cache_info->active_index_channel != MagickFalse) + cache_info->indexes=(IndexPacket *) (cache_info->pixels+ + number_pixels); + if ((source_info.storage_class != UndefinedClass) && + (mode != ReadMode)) + { + status&=ClonePixelCacheRepository(cache_info,&source_info, + exception); + RelinquishPixelCachePixels(&source_info); + } + if (image->debug != MagickFalse) + { + (void) FormatMagickSize(cache_info->length,MagickTrue,format); + type=CommandOptionToMnemonic(MagickCacheOptions,(ssize_t) + cache_info->type); + (void) FormatLocaleString(message,MaxTextExtent, + "open %s (%s %s, %.20gx%.20g %s)",cache_info->filename, + cache_info->mapped != MagickFalse ? "Anonymous" : "Heap", + type,(double) cache_info->columns,(double) cache_info->rows, + format); + (void) LogMagickEvent(CacheEvent,GetMagickModule(),"%s", + message); + } + cache_info->storage_class=image->storage_class; + if (status == 0) + { + cache_info->type=UndefinedCache; + return(MagickFalse); + } + return(MagickTrue); + } + } + } + status=AcquireMagickResource(DiskResource,cache_info->length); + hosts=(const char *) GetImageRegistry(StringRegistryType,"cache:hosts", + exception); + if ((status == MagickFalse) && (hosts != (const char *) NULL)) + { + DistributeCacheInfo + *server_info; + + /* + Distribute the pixel cache to a remote server. + */ + server_info=AcquireDistributeCacheInfo(exception); + if (server_info != (DistributeCacheInfo *) NULL) + { + status=OpenDistributePixelCache(server_info,image); + if (status == MagickFalse) + { + ThrowFileException(exception,CacheError,"UnableToOpenPixelCache", + GetDistributeCacheHostname(server_info)); + server_info=DestroyDistributeCacheInfo(server_info); + } + else + { + /* + Create a distributed pixel cache. + */ + status=MagickTrue; + cache_info->type=DistributedCache; + cache_info->storage_class=image->storage_class; + cache_info->colorspace=image->colorspace; + cache_info->server_info=server_info; + (void) FormatLocaleString(cache_info->cache_filename, + MaxTextExtent,"%s:%d",GetDistributeCacheHostname( + (DistributeCacheInfo *) cache_info->server_info), + GetDistributeCachePort((DistributeCacheInfo *) + cache_info->server_info)); + if ((source_info.storage_class != UndefinedClass) && + (mode != ReadMode)) + { + status=ClonePixelCacheRepository(cache_info,&source_info, + exception); + RelinquishPixelCachePixels(&source_info); + } + if (image->debug != MagickFalse) + { + (void) FormatMagickSize(cache_info->length,MagickFalse, + format); + type=CommandOptionToMnemonic(MagickCacheOptions,(ssize_t) + cache_info->type); + (void) FormatLocaleString(message,MaxTextExtent, + "open %s (%s[%d], %s, %.20gx%.20g %s)",cache_info->filename, + cache_info->cache_filename,GetDistributeCacheFile( + (DistributeCacheInfo *) cache_info->server_info),type, + (double) cache_info->columns,(double) cache_info->rows, + format); + (void) LogMagickEvent(CacheEvent,GetMagickModule(),"%s", + message); + } + if (status == 0) + { + cache_info->type=UndefinedCache; + return(MagickFalse); + } + return(MagickTrue); + } + } + cache_info->type=UndefinedCache; + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "CacheResourcesExhausted","`%s'",image->filename); + return(MagickFalse); + } + /* + Create pixel cache on disk. + */ + if (status == MagickFalse) + { + cache_info->type=UndefinedCache; + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "CacheResourcesExhausted","`%s'",image->filename); + return(MagickFalse); + } + if ((source_info.storage_class != UndefinedClass) && (mode != ReadMode) && + (cache_info->mode != PersistMode)) + { + (void) ClosePixelCacheOnDisk(cache_info); + *cache_info->cache_filename='\0'; + } + if (OpenPixelCacheOnDisk(cache_info,mode) == MagickFalse) + { + cache_info->type=UndefinedCache; + ThrowFileException(exception,CacheError,"UnableToOpenPixelCache", + image->filename); + return(MagickFalse); + } + status=SetPixelCacheExtent(image,(MagickSizeType) cache_info->offset+ + cache_info->length); + if (status == MagickFalse) + { + cache_info->type=UndefinedCache; + ThrowFileException(exception,CacheError,"UnableToExtendCache", + image->filename); + return(MagickFalse); + } + cache_info->storage_class=image->storage_class; + cache_info->colorspace=image->colorspace; + cache_info->type=DiskCache; + length=number_pixels*(sizeof(PixelPacket)+sizeof(IndexPacket)); + if (length == (MagickSizeType) ((size_t) length)) + { + status=AcquireMagickResource(MapResource,cache_info->length); + if (status != MagickFalse) + { + cache_info->pixels=(PixelPacket *) MapBlob(cache_info->file,mode, + cache_info->offset,(size_t) cache_info->length); + if (cache_info->pixels == (PixelPacket *) NULL) + { + cache_info->mapped=source_info.mapped; + cache_info->pixels=source_info.pixels; + RelinquishMagickResource(MapResource,cache_info->length); + } + else + { + /* + Create file-backed memory-mapped pixel cache. + */ + (void) ClosePixelCacheOnDisk(cache_info); + cache_info->type=MapCache; + cache_info->mapped=MagickTrue; + cache_info->indexes=(IndexPacket *) NULL; + if (cache_info->active_index_channel != MagickFalse) + cache_info->indexes=(IndexPacket *) (cache_info->pixels+ + number_pixels); + if ((source_info.storage_class != UndefinedClass) && + (mode != ReadMode)) + { + status=ClonePixelCacheRepository(cache_info,&source_info, + exception); + RelinquishPixelCachePixels(&source_info); + } + if (image->debug != MagickFalse) + { + (void) FormatMagickSize(cache_info->length,MagickTrue,format); + type=CommandOptionToMnemonic(MagickCacheOptions,(ssize_t) + cache_info->type); + (void) FormatLocaleString(message,MaxTextExtent, + "open %s (%s[%d], %s, %.20gx%.20g %s)", + cache_info->filename,cache_info->cache_filename, + cache_info->file,type,(double) cache_info->columns, + (double) cache_info->rows,format); + (void) LogMagickEvent(CacheEvent,GetMagickModule(),"%s", + message); + } + if (status == 0) + { + cache_info->type=UndefinedCache; + return(MagickFalse); + } + return(MagickTrue); + } + } + } + status=MagickTrue; + if ((source_info.storage_class != UndefinedClass) && (mode != ReadMode)) + { + status=ClonePixelCacheRepository(cache_info,&source_info,exception); + RelinquishPixelCachePixels(&source_info); + } + if (image->debug != MagickFalse) + { + (void) FormatMagickSize(cache_info->length,MagickFalse,format); + type=CommandOptionToMnemonic(MagickCacheOptions,(ssize_t) + cache_info->type); + (void) FormatLocaleString(message,MaxTextExtent, + "open %s (%s[%d], %s, %.20gx%.20g %s)",cache_info->filename, + cache_info->cache_filename,cache_info->file,type,(double) + cache_info->columns,(double) cache_info->rows,format); + (void) LogMagickEvent(CacheEvent,GetMagickModule(),"%s",message); + } + if (status == 0) + { + cache_info->type=UndefinedCache; + return(MagickFalse); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ P e r s i s t P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PersistPixelCache() attaches to or initializes a persistent pixel cache. A +% persistent pixel cache is one that resides on disk and is not destroyed +% when the program exits. +% +% The format of the PersistPixelCache() method is: +% +% MagickBooleanType PersistPixelCache(Image *image,const char *filename, +% const MagickBooleanType attach,MagickOffsetType *offset, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o filename: the persistent pixel cache filename. +% +% o attach: A value other than zero initializes the persistent pixel cache. +% +% o initialize: A value other than zero initializes the persistent pixel +% cache. +% +% o offset: the offset in the persistent cache to store pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType PersistPixelCache(Image *image, + const char *filename,const MagickBooleanType attach,MagickOffsetType *offset, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info, + *magick_restrict clone_info; + + MagickBooleanType + status; + + ssize_t + page_size; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->cache != (void *) NULL); + assert(filename != (const char *) NULL); + assert(offset != (MagickOffsetType *) NULL); + page_size=GetMagickPageSize(); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); +#if defined(MAGICKCORE_OPENCL_SUPPORT) + CopyOpenCLBuffer(cache_info); +#endif + if (attach != MagickFalse) + { + /* + Attach existing persistent pixel cache. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(CacheEvent,GetMagickModule(), + "attach persistent cache"); + (void) CopyMagickString(cache_info->cache_filename,filename, + MaxTextExtent); + cache_info->type=MapCache; + cache_info->offset=(*offset); + if (OpenPixelCache(image,ReadMode,exception) == MagickFalse) + return(MagickFalse); + *offset+=cache_info->length+page_size-(cache_info->length % page_size); + return(MagickTrue); + } + /* + Clone persistent pixel cache. + */ + status=AcquireMagickResource(DiskResource,cache_info->length); + if (status == MagickFalse) + { + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "CacheResourcesExhausted","`%s'",image->filename); + return(MagickFalse); + } + clone_info=(CacheInfo *) ClonePixelCache(cache_info); + clone_info->type=DiskCache; + (void) CopyMagickString(clone_info->cache_filename,filename,MaxTextExtent); + clone_info->file=(-1); + clone_info->storage_class=cache_info->storage_class; + clone_info->colorspace=cache_info->colorspace; + clone_info->columns=cache_info->columns; + clone_info->rows=cache_info->rows; + clone_info->active_index_channel=cache_info->active_index_channel; + clone_info->mode=PersistMode; + clone_info->length=cache_info->length; + clone_info->channels=cache_info->channels; + clone_info->offset=(*offset); + status=ClonePixelCacheRepository(clone_info,cache_info,exception); + *offset+=cache_info->length+page_size-(cache_info->length % page_size); + clone_info=(CacheInfo *) DestroyPixelCache(clone_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ Q u e u e A u t h e n t i c P i x e l C a c h e N e x u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% QueueAuthenticPixelCacheNexus() allocates an region to store image pixels as +% defined by the region rectangle and returns a pointer to the region. This +% region is subsequently transferred from the pixel cache with +% SyncAuthenticPixelsCache(). A pointer to the pixels is returned if the +% pixels are transferred, otherwise a NULL is returned. +% +% The format of the QueueAuthenticPixelCacheNexus() method is: +% +% PixelPacket *QueueAuthenticPixelCacheNexus(Image *image,const ssize_t x, +% const ssize_t y,const size_t columns,const size_t rows, +% const MagickBooleanType clone,NexusInfo *nexus_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o nexus_info: the cache nexus to set. +% +% o clone: clone the pixel cache. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport PixelPacket *QueueAuthenticPixel(Image *image,const ssize_t x, + const ssize_t y,const size_t columns,const size_t rows, + const MagickBooleanType clone,NexusInfo *nexus_info, + ExceptionInfo *exception) +{ + return(QueueAuthenticPixelCacheNexus(image,x,y,columns,rows,clone,nexus_info, + exception)); +} + +MagickExport PixelPacket *QueueAuthenticPixelCacheNexus(Image *image, + const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, + const MagickBooleanType clone,NexusInfo *nexus_info,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + MagickOffsetType + offset; + + MagickSizeType + number_pixels; + + PixelPacket + *magick_restrict pixels; + + /* + Validate pixel cache geometry. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) GetImagePixelCache(image,clone,exception); + if (cache_info == (Cache) NULL) + return((PixelPacket *) NULL); + assert(cache_info->signature == MagickCoreSignature); + if ((cache_info->columns == 0) || (cache_info->rows == 0) || (x < 0) || + (y < 0) || (x >= (ssize_t) cache_info->columns) || + (y >= (ssize_t) cache_info->rows)) + { + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "PixelsAreNotAuthentic","`%s'",image->filename); + return((PixelPacket *) NULL); + } + offset=(MagickOffsetType) y*cache_info->columns+x; + if (offset < 0) + return((PixelPacket *) NULL); + number_pixels=(MagickSizeType) cache_info->columns*cache_info->rows; + offset+=(MagickOffsetType) (rows-1)*cache_info->columns+columns-1; + if ((MagickSizeType) offset >= number_pixels) + return((PixelPacket *) NULL); + /* + Return pixel cache. + */ + pixels=SetPixelCacheNexusPixels(cache_info,WriteMode,x,y,columns,rows, + (image->clip_mask != (Image *) NULL) || (image->mask != (Image *) NULL) ? + MagickTrue : MagickFalse,nexus_info,exception); + return(pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ Q u e u e A u t h e n t i c P i x e l s C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% QueueAuthenticPixelsCache() allocates an region to store image pixels as +% defined by the region rectangle and returns a pointer to the region. This +% region is subsequently transferred from the pixel cache with +% SyncAuthenticPixelsCache(). A pointer to the pixels is returned if the +% pixels are transferred, otherwise a NULL is returned. +% +% The format of the QueueAuthenticPixelsCache() method is: +% +% PixelPacket *QueueAuthenticPixelsCache(Image *image,const ssize_t x, +% const ssize_t y,const size_t columns,const size_t rows, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static PixelPacket *QueueAuthenticPixelsCache(Image *image,const ssize_t x, + const ssize_t y,const size_t columns,const size_t rows, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + return(QueueAuthenticPixelCacheNexus(image,x,y,columns,rows,MagickFalse, + cache_info->nexus_info[id],exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% Q u e u e A u t h e n t i c P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% QueueAuthenticPixels() queues a mutable pixel region. If the region is +% successfully initialized a pointer to a PixelPacket array representing the +% region is returned, otherwise NULL is returned. The returned pointer may +% point to a temporary working buffer for the pixels or it may point to the +% final location of the pixels in memory. +% +% Write-only access means that any existing pixel values corresponding to +% the region are ignored. This is useful if the initial image is being +% created from scratch, or if the existing pixel values are to be +% completely replaced without need to refer to their pre-existing values. +% The application is free to read and write the pixel buffer returned by +% QueueAuthenticPixels() any way it pleases. QueueAuthenticPixels() does not +% initialize the pixel array values. Initializing pixel array values is the +% application's responsibility. +% +% Performance is maximized if the selected region is part of one row, or +% one or more full rows, since then there is opportunity to access the +% pixels in-place (without a copy) if the image is in memory, or in a +% memory-mapped file. The returned pointer must *never* be deallocated +% by the user. +% +% Pixels accessed via the returned pointer represent a simple array of type +% PixelPacket. If the image type is CMYK or the storage class is PseudoClass, +% call GetAuthenticIndexQueue() after invoking GetAuthenticPixels() to obtain +% the black color component or the colormap indexes (of type IndexPacket) +% corresponding to the region. Once the PixelPacket (and/or IndexPacket) +% array has been updated, the changes must be saved back to the underlying +% image using SyncAuthenticPixels() or they may be lost. +% +% The format of the QueueAuthenticPixels() method is: +% +% PixelPacket *QueueAuthenticPixels(Image *image,const ssize_t x, +% const ssize_t y,const size_t columns,const size_t rows, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport PixelPacket *QueueAuthenticPixels(Image *image,const ssize_t x, + const ssize_t y,const size_t columns,const size_t rows, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->methods.queue_authentic_pixels_handler != + (QueueAuthenticPixelsHandler) NULL) + return(cache_info->methods.queue_authentic_pixels_handler(image,x,y,columns, + rows,exception)); + assert(id < (int) cache_info->number_threads); + return(QueueAuthenticPixelCacheNexus(image,x,y,columns,rows,MagickFalse, + cache_info->nexus_info[id],exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d P i x e l C a c h e I n d e x e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPixelCacheIndexes() reads colormap indexes from the specified region of +% the pixel cache. +% +% The format of the ReadPixelCacheIndexes() method is: +% +% MagickBooleanType ReadPixelCacheIndexes(CacheInfo *cache_info, +% NexusInfo *nexus_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_info: the pixel cache. +% +% o nexus_info: the cache nexus to read the colormap indexes. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline MagickOffsetType ReadPixelCacheRegion( + const CacheInfo *magick_restrict cache_info,const MagickOffsetType offset, + const MagickSizeType length,unsigned char *magick_restrict buffer) +{ + MagickOffsetType + i; + + ssize_t + count; + +#if !defined(MAGICKCORE_HAVE_PREAD) + if (lseek(cache_info->file,offset,SEEK_SET) < 0) + return((MagickOffsetType) -1); +#endif + count=0; + for (i=0; i < (MagickOffsetType) length; i+=count) + { +#if !defined(MAGICKCORE_HAVE_PREAD) + count=read(cache_info->file,buffer+i,(size_t) MagickMin(length-i,(size_t) + MAGICK_SSIZE_MAX)); +#else + count=pread(cache_info->file,buffer+i,(size_t) MagickMin(length-i,(size_t) + MAGICK_SSIZE_MAX),offset+i); +#endif + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + return(i); +} + +static MagickBooleanType ReadPixelCacheIndexes( + CacheInfo *magick_restrict cache_info,NexusInfo *magick_restrict nexus_info, + ExceptionInfo *exception) +{ + IndexPacket + *magick_restrict q; + + MagickOffsetType + count, + offset; + + MagickSizeType + extent, + length; + + ssize_t + y; + + size_t + rows; + + if (cache_info->active_index_channel == MagickFalse) + return(MagickFalse); + if (nexus_info->authentic_pixel_cache != MagickFalse) + return(MagickTrue); + offset=(MagickOffsetType) nexus_info->region.y*cache_info->columns+ + nexus_info->region.x; + length=(MagickSizeType) nexus_info->region.width*sizeof(IndexPacket); + rows=nexus_info->region.height; + extent=length*rows; + q=nexus_info->indexes; + y=0; + switch (cache_info->type) + { + case MemoryCache: + case MapCache: + { + IndexPacket + *magick_restrict p; + + /* + Read indexes from memory. + */ + if ((cache_info->columns == nexus_info->region.width) && + (extent == (MagickSizeType) ((size_t) extent))) + { + length=extent; + rows=1UL; + } + p=cache_info->indexes+offset; + for (y=0; y < (ssize_t) rows; y++) + { + (void) memcpy(q,p,(size_t) length); + p+=cache_info->columns; + q+=nexus_info->region.width; + } + break; + } + case DiskCache: + { + /* + Read indexes from disk. + */ + LockSemaphoreInfo(cache_info->file_semaphore); + if (OpenPixelCacheOnDisk(cache_info,IOMode) == MagickFalse) + { + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + cache_info->cache_filename); + UnlockSemaphoreInfo(cache_info->file_semaphore); + return(MagickFalse); + } + if ((cache_info->columns == nexus_info->region.width) && + (extent <= MagickMaxBufferExtent)) + { + length=extent; + rows=1UL; + } + extent=(MagickSizeType) cache_info->columns*cache_info->rows; + for (y=0; y < (ssize_t) rows; y++) + { + count=ReadPixelCacheRegion(cache_info,cache_info->offset+extent* + sizeof(PixelPacket)+offset*sizeof(*q),length,(unsigned char *) q); + if (count < (MagickOffsetType) length) + break; + offset+=cache_info->columns; + q+=nexus_info->region.width; + } + if (IsFileDescriptorLimitExceeded() != MagickFalse) + (void) ClosePixelCacheOnDisk(cache_info); + UnlockSemaphoreInfo(cache_info->file_semaphore); + break; + } + case DistributedCache: + { + RectangleInfo + region; + + /* + Read indexes from distributed cache. + */ + LockSemaphoreInfo(cache_info->file_semaphore); + region=nexus_info->region; + if ((cache_info->columns != nexus_info->region.width) || + (extent > MagickMaxBufferExtent)) + region.height=1UL; + else + { + length=extent; + rows=1UL; + } + for (y=0; y < (ssize_t) rows; y++) + { + count=ReadDistributePixelCacheIndexes((DistributeCacheInfo *) + cache_info->server_info,®ion,length,(unsigned char *) q); + if (count != (MagickOffsetType) length) + break; + q+=nexus_info->region.width; + region.y++; + } + UnlockSemaphoreInfo(cache_info->file_semaphore); + break; + } + default: + break; + } + if (y < (ssize_t) rows) + { + ThrowFileException(exception,CacheError,"UnableToReadPixelCache", + cache_info->cache_filename); + return(MagickFalse); + } + if ((cache_info->debug != MagickFalse) && + (CacheTick(nexus_info->region.y,cache_info->rows) != MagickFalse)) + (void) LogMagickEvent(CacheEvent,GetMagickModule(), + "%s[%.20gx%.20g%+.20g%+.20g]",cache_info->filename,(double) + nexus_info->region.width,(double) nexus_info->region.height,(double) + nexus_info->region.x,(double) nexus_info->region.y); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d P i x e l C a c h e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadPixelCachePixels() reads pixels from the specified region of the pixel +% cache. +% +% The format of the ReadPixelCachePixels() method is: +% +% MagickBooleanType ReadPixelCachePixels(CacheInfo *cache_info, +% NexusInfo *nexus_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_info: the pixel cache. +% +% o nexus_info: the cache nexus to read the pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType ReadPixelCachePixels( + CacheInfo *magick_restrict cache_info,NexusInfo *magick_restrict nexus_info, + ExceptionInfo *exception) +{ + MagickOffsetType + count, + offset; + + MagickSizeType + extent, + length; + + PixelPacket + *magick_restrict q; + + ssize_t + y; + + size_t + rows; + + if (nexus_info->authentic_pixel_cache != MagickFalse) + return(MagickTrue); + offset=(MagickOffsetType) nexus_info->region.y*cache_info->columns; + if ((ssize_t) (offset/cache_info->columns) != nexus_info->region.y) + return(MagickFalse); + offset+=nexus_info->region.x; + length=(MagickSizeType) nexus_info->region.width*sizeof(PixelPacket); + if ((length/sizeof(PixelPacket)) != nexus_info->region.width) + return(MagickFalse); + rows=nexus_info->region.height; + extent=length*rows; + if ((extent == 0) || ((extent/length) != rows)) + return(MagickFalse); + q=nexus_info->pixels; + y=0; + switch (cache_info->type) + { + case MemoryCache: + case MapCache: + { + PixelPacket + *magick_restrict p; + + /* + Read pixels from memory. + */ + if ((cache_info->columns == nexus_info->region.width) && + (extent == (MagickSizeType) ((size_t) extent))) + { + length=extent; + rows=1UL; + } + p=cache_info->pixels+offset; + for (y=0; y < (ssize_t) rows; y++) + { + (void) memcpy(q,p,(size_t) length); + p+=cache_info->columns; + q+=nexus_info->region.width; + } + break; + } + case DiskCache: + { + /* + Read pixels from disk. + */ + LockSemaphoreInfo(cache_info->file_semaphore); + if (OpenPixelCacheOnDisk(cache_info,IOMode) == MagickFalse) + { + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + cache_info->cache_filename); + UnlockSemaphoreInfo(cache_info->file_semaphore); + return(MagickFalse); + } + if ((cache_info->columns == nexus_info->region.width) && + (extent <= MagickMaxBufferExtent)) + { + length=extent; + rows=1UL; + } + for (y=0; y < (ssize_t) rows; y++) + { + count=ReadPixelCacheRegion(cache_info,cache_info->offset+offset* + sizeof(*q),length,(unsigned char *) q); + if (count < (MagickOffsetType) length) + break; + offset+=cache_info->columns; + q+=nexus_info->region.width; + } + if (IsFileDescriptorLimitExceeded() != MagickFalse) + (void) ClosePixelCacheOnDisk(cache_info); + UnlockSemaphoreInfo(cache_info->file_semaphore); + break; + } + case DistributedCache: + { + RectangleInfo + region; + + /* + Read pixels from distributed cache. + */ + LockSemaphoreInfo(cache_info->file_semaphore); + region=nexus_info->region; + if ((cache_info->columns != nexus_info->region.width) || + (extent > MagickMaxBufferExtent)) + region.height=1UL; + else + { + length=extent; + rows=1UL; + } + for (y=0; y < (ssize_t) rows; y++) + { + count=ReadDistributePixelCachePixels((DistributeCacheInfo *) + cache_info->server_info,®ion,length,(unsigned char *) q); + if (count != (MagickOffsetType) length) + break; + q+=nexus_info->region.width; + region.y++; + } + UnlockSemaphoreInfo(cache_info->file_semaphore); + break; + } + default: + break; + } + if (y < (ssize_t) rows) + { + ThrowFileException(exception,CacheError,"UnableToReadPixelCache", + cache_info->cache_filename); + return(MagickFalse); + } + if ((cache_info->debug != MagickFalse) && + (CacheTick(nexus_info->region.y,cache_info->rows) != MagickFalse)) + (void) LogMagickEvent(CacheEvent,GetMagickModule(), + "%s[%.20gx%.20g%+.20g%+.20g]",cache_info->filename,(double) + nexus_info->region.width,(double) nexus_info->region.height,(double) + nexus_info->region.x,(double) nexus_info->region.y); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e f e r e n c e P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReferencePixelCache() increments the reference count associated with the +% pixel cache returning a pointer to the cache. +% +% The format of the ReferencePixelCache method is: +% +% Cache ReferencePixelCache(Cache cache_info) +% +% A description of each parameter follows: +% +% o cache_info: the pixel cache. +% +*/ +MagickExport Cache ReferencePixelCache(Cache cache) +{ + CacheInfo + *magick_restrict cache_info; + + assert(cache != (Cache *) NULL); + cache_info=(CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + LockSemaphoreInfo(cache_info->semaphore); + cache_info->reference_count++; + UnlockSemaphoreInfo(cache_info->semaphore); + return(cache_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e s e t P i x e l C a c h e E p o c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ResetPixelCacheEpoch() resets the pixel cache epoch. +% +% The format of the ResetPixelCacheEpoch method is: +% +% void ResetPixelCacheEpoch(void) +% +*/ +MagickPrivate void ResetPixelCacheEpoch(void) +{ + cache_epoch=0; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S e t P i x e l C a c h e M e t h o d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetPixelCacheMethods() sets the image pixel methods to the specified ones. +% +% The format of the SetPixelCacheMethods() method is: +% +% SetPixelCacheMethods(Cache *,CacheMethods *cache_methods) +% +% A description of each parameter follows: +% +% o cache: the pixel cache. +% +% o cache_methods: Specifies a pointer to a CacheMethods structure. +% +*/ +MagickExport void SetPixelCacheMethods(Cache cache,CacheMethods *cache_methods) +{ + CacheInfo + *magick_restrict cache_info; + + GetOneAuthenticPixelFromHandler + get_one_authentic_pixel_from_handler; + + GetOneVirtualPixelFromHandler + get_one_virtual_pixel_from_handler; + + /* + Set cache pixel methods. + */ + assert(cache != (Cache) NULL); + assert(cache_methods != (CacheMethods *) NULL); + cache_info=(CacheInfo *) cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + cache_info->filename); + if (cache_methods->get_virtual_pixel_handler != (GetVirtualPixelHandler) NULL) + cache_info->methods.get_virtual_pixel_handler= + cache_methods->get_virtual_pixel_handler; + if (cache_methods->destroy_pixel_handler != (DestroyPixelHandler) NULL) + cache_info->methods.destroy_pixel_handler= + cache_methods->destroy_pixel_handler; + if (cache_methods->get_virtual_indexes_from_handler != + (GetVirtualIndexesFromHandler) NULL) + cache_info->methods.get_virtual_indexes_from_handler= + cache_methods->get_virtual_indexes_from_handler; + if (cache_methods->get_authentic_pixels_handler != + (GetAuthenticPixelsHandler) NULL) + cache_info->methods.get_authentic_pixels_handler= + cache_methods->get_authentic_pixels_handler; + if (cache_methods->queue_authentic_pixels_handler != + (QueueAuthenticPixelsHandler) NULL) + cache_info->methods.queue_authentic_pixels_handler= + cache_methods->queue_authentic_pixels_handler; + if (cache_methods->sync_authentic_pixels_handler != + (SyncAuthenticPixelsHandler) NULL) + cache_info->methods.sync_authentic_pixels_handler= + cache_methods->sync_authentic_pixels_handler; + if (cache_methods->get_authentic_pixels_from_handler != + (GetAuthenticPixelsFromHandler) NULL) + cache_info->methods.get_authentic_pixels_from_handler= + cache_methods->get_authentic_pixels_from_handler; + if (cache_methods->get_authentic_indexes_from_handler != + (GetAuthenticIndexesFromHandler) NULL) + cache_info->methods.get_authentic_indexes_from_handler= + cache_methods->get_authentic_indexes_from_handler; + get_one_virtual_pixel_from_handler= + cache_info->methods.get_one_virtual_pixel_from_handler; + if (get_one_virtual_pixel_from_handler != + (GetOneVirtualPixelFromHandler) NULL) + cache_info->methods.get_one_virtual_pixel_from_handler= + cache_methods->get_one_virtual_pixel_from_handler; + get_one_authentic_pixel_from_handler= + cache_methods->get_one_authentic_pixel_from_handler; + if (get_one_authentic_pixel_from_handler != + (GetOneAuthenticPixelFromHandler) NULL) + cache_info->methods.get_one_authentic_pixel_from_handler= + cache_methods->get_one_authentic_pixel_from_handler; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S e t P i x e l C a c h e N e x u s P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetPixelCacheNexusPixels() defines the region of the cache for the +% specified cache nexus. +% +% The format of the SetPixelCacheNexusPixels() method is: +% +% PixelPacket SetPixelCacheNexusPixels( +% const CacheInfo *magick_restrcit cache_info,const MapMode mode, +% const ssize_t y,const size_t width,const size_t height, +% const MagickBooleanType buffered,NexusInfo *magick_restrict nexus_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_info: the pixel cache. +% +% o mode: ReadMode, WriteMode, or IOMode. +% +% o x,y,width,height: define the region of this particular cache nexus. +% +% o buffered: pixels are buffered. +% +% o nexus_info: the cache nexus to set. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline MagickBooleanType AcquireCacheNexusPixels( + const CacheInfo *magick_restrict cache_info,const MagickSizeType length, + NexusInfo *magick_restrict nexus_info,ExceptionInfo *exception) +{ + if (length != (MagickSizeType) ((size_t) length)) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"PixelCacheAllocationFailed","`%s'", + cache_info->filename); + return(MagickFalse); + } + nexus_info->length=0; + nexus_info->mapped=MagickFalse; + if (cache_anonymous_memory <= 0) + { + nexus_info->cache=(PixelPacket *) MagickAssumeAligned( + AcquireAlignedMemory(1,(size_t) length)); + if (nexus_info->cache != (PixelPacket *) NULL) + (void) memset(nexus_info->cache,0,(size_t) length); + } + else + { + nexus_info->cache=(PixelPacket *) MapBlob(-1,IOMode,0,(size_t) length); + if (nexus_info->cache != (PixelPacket *) NULL) + nexus_info->mapped=MagickTrue; + } + if (nexus_info->cache == (PixelPacket *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"PixelCacheAllocationFailed","`%s'", + cache_info->filename); + return(MagickFalse); + } + nexus_info->length=length; + return(MagickTrue); +} + +static inline void PrefetchPixelCacheNexusPixels(const NexusInfo *nexus_info, + const MapMode mode) +{ + if (nexus_info->length < CACHE_LINE_SIZE) + return; + if (mode == ReadMode) + { + MagickCachePrefetch((unsigned char *) nexus_info->pixels+CACHE_LINE_SIZE, + 0,1); + return; + } + MagickCachePrefetch((unsigned char *) nexus_info->pixels+CACHE_LINE_SIZE,1,1); +} + +static inline MagickBooleanType ValidatePixelOffset(const ssize_t x, + const size_t a) +{ + if ((x >= 0) && (x >= ((ssize_t) MAGICK_SSIZE_MAX-(ssize_t) a))) + return(MagickFalse); + if (x <= ((ssize_t) MAGICK_SSIZE_MIN+(ssize_t) a)) + return(MagickFalse); + return(MagickTrue); +} + +static PixelPacket *SetPixelCacheNexusPixels( + const CacheInfo *magick_restrict cache_info,const MapMode mode, + const ssize_t x,const ssize_t y,const size_t width,const size_t height, + const MagickBooleanType buffered,NexusInfo *magick_restrict nexus_info, + ExceptionInfo *exception) +{ + MagickBooleanType + status; + + MagickSizeType + length, + number_pixels; + + assert(cache_info != (const CacheInfo *) NULL); + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->type == UndefinedCache) + return((PixelPacket *) NULL); + assert(nexus_info->signature == MagickCoreSignature); + (void) memset(&nexus_info->region,0,sizeof(nexus_info->region)); + if ((width == 0) || (height == 0)) + { + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "NoPixelsDefinedInCache","`%s'",cache_info->filename); + return((PixelPacket *) NULL); + } + if (((MagickSizeType) width > cache_info->width_limit) || + ((MagickSizeType) height > cache_info->height_limit) || + (ValidatePixelOffset(x,width) == MagickFalse) || + (ValidatePixelOffset(y,height) == MagickFalse)) + { + (void) ThrowMagickException(exception,GetMagickModule(),ImageError, + "WidthOrHeightExceedsLimit","`%s'",cache_info->filename); + return((PixelPacket *) NULL); + } + if (((cache_info->type == MemoryCache) || (cache_info->type == MapCache)) && + (buffered == MagickFalse)) + { + if (((x >= 0) && (y >= 0) && + (((ssize_t) height+y-1) < (ssize_t) cache_info->rows)) && + (((x == 0) && (width == cache_info->columns)) || ((height == 1) && + (((ssize_t) width+x-1) < (ssize_t) cache_info->columns)))) + { + MagickOffsetType + offset; + + /* + Pixels are accessed directly from memory. + */ + offset=(MagickOffsetType) y*cache_info->columns+x; + nexus_info->pixels=cache_info->pixels+offset; + nexus_info->indexes=(IndexPacket *) NULL; + if (cache_info->active_index_channel != MagickFalse) + nexus_info->indexes=cache_info->indexes+offset; + nexus_info->region.width=width; + nexus_info->region.height=height; + nexus_info->region.x=x; + nexus_info->region.y=y; + nexus_info->authentic_pixel_cache=MagickTrue; + PrefetchPixelCacheNexusPixels(nexus_info,mode); + return(nexus_info->pixels); + } + } + /* + Pixels are stored in a staging region until they are synced to the cache. + */ + number_pixels=(MagickSizeType) width*height; + length=MagickMax(number_pixels,MagickMax(cache_info->columns, + cache_info->rows))*sizeof(PixelPacket); + if (cache_info->active_index_channel != MagickFalse) + length+=number_pixels*sizeof(IndexPacket); + status=MagickTrue; + if (nexus_info->cache == (PixelPacket *) NULL) + status=AcquireCacheNexusPixels(cache_info,length,nexus_info,exception); + else + if (nexus_info->length < length) + { + RelinquishCacheNexusPixels(nexus_info); + status=AcquireCacheNexusPixels(cache_info,length,nexus_info,exception); + } + if (status == MagickFalse) + { + (void) memset(&nexus_info->region,0,sizeof(nexus_info->region)); + return((PixelPacket *) NULL); + } + nexus_info->pixels=nexus_info->cache; + nexus_info->indexes=(IndexPacket *) NULL; + if (cache_info->active_index_channel != MagickFalse) + nexus_info->indexes=(IndexPacket *) (nexus_info->pixels+number_pixels); + nexus_info->region.width=width; + nexus_info->region.height=height; + nexus_info->region.x=x; + nexus_info->region.y=y; + nexus_info->authentic_pixel_cache=cache_info->type == PingCache ? + MagickTrue : MagickFalse; + PrefetchPixelCacheNexusPixels(nexus_info,mode); + return(nexus_info->pixels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t P i x e l C a c h e V i r t u a l M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetPixelCacheVirtualMethod() sets the "virtual pixels" method for the +% pixel cache and returns the previous setting. A virtual pixel is any pixel +% access that is outside the boundaries of the image cache. +% +% The format of the SetPixelCacheVirtualMethod() method is: +% +% VirtualPixelMethod SetPixelCacheVirtualMethod(const Image *image, +% const VirtualPixelMethod virtual_pixel_method) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o virtual_pixel_method: choose the type of virtual pixel. +% +*/ + +static MagickBooleanType SetCacheAlphaChannel(Image *image, + const Quantum opacity) +{ + CacheInfo + *magick_restrict cache_info; + + CacheView + *magick_restrict image_view; + + MagickBooleanType + status; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + image->matte=MagickTrue; + status=MagickTrue; + image_view=AcquireVirtualCacheView(image,&image->exception); /* must be virtual */ +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + &image->exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + q->opacity=opacity; + q++; + } + status=SyncCacheViewAuthenticPixels(image_view,&image->exception); + } + image_view=DestroyCacheView(image_view); + return(status); +} + +MagickExport VirtualPixelMethod SetPixelCacheVirtualMethod(const Image *image, + const VirtualPixelMethod virtual_pixel_method) +{ + CacheInfo + *magick_restrict cache_info; + + VirtualPixelMethod + method; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + method=cache_info->virtual_pixel_method; + cache_info->virtual_pixel_method=virtual_pixel_method; + if ((image->columns != 0) && (image->rows != 0)) + switch (virtual_pixel_method) + { + case BackgroundVirtualPixelMethod: + { + if ((image->background_color.opacity != OpaqueOpacity) && + (image->matte == MagickFalse)) + (void) SetCacheAlphaChannel((Image *) image,OpaqueOpacity); + if ((IsPixelGray(&image->background_color) == MagickFalse) && + (IsGrayColorspace(image->colorspace) != MagickFalse)) + (void) SetImageColorspace((Image *) image,sRGBColorspace); + break; + } + case TransparentVirtualPixelMethod: + { + if (image->matte == MagickFalse) + (void) SetCacheAlphaChannel((Image *) image,OpaqueOpacity); + break; + } + default: + break; + } + return(method); +} + +#if defined(MAGICKCORE_OPENCL_SUPPORT) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S y n c A u t h e n t i c O p e n C L B u f f e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncAuthenticOpenCLBuffer() ensures all the OpenCL operations have been +% completed and updates the host memory. +% +% The format of the SyncAuthenticOpenCLBuffer() method is: +% +% void SyncAuthenticOpenCLBuffer(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +static void CopyOpenCLBuffer(CacheInfo *magick_restrict cache_info) +{ + MagickCLEnv + clEnv; + + assert(cache_info != (CacheInfo *)NULL); + if ((cache_info->type != MemoryCache) || + (cache_info->opencl == (OpenCLCacheInfo *)NULL)) + return; + /* + Ensure single threaded access to OpenCL environment. + */ + LockSemaphoreInfo(cache_info->semaphore); + if (cache_info->opencl != (OpenCLCacheInfo *)NULL) + { + cl_event + *events; + + cl_uint + event_count; + + clEnv=GetDefaultOpenCLEnv(); + events=CopyOpenCLEvents(cache_info->opencl,&event_count); + if (events != (cl_event *) NULL) + { + cl_command_queue + queue; + + cl_context + context; + + cl_int + status; + + PixelPacket + *pixels; + + context=GetOpenCLContext(clEnv); + queue=AcquireOpenCLCommandQueue(clEnv); + pixels=(PixelPacket *) clEnv->library->clEnqueueMapBuffer(queue, + cache_info->opencl->buffer,CL_TRUE, CL_MAP_READ | CL_MAP_WRITE,0, + cache_info->length,event_count,events,NULL,&status); + assert(pixels == cache_info->pixels); + events=(cl_event *) RelinquishMagickMemory(events); + RelinquishOpenCLCommandQueue(clEnv,queue); + } + cache_info->opencl=RelinquishOpenCLCacheInfo(clEnv,cache_info->opencl); + } + UnlockSemaphoreInfo(cache_info->semaphore); +} + +MagickPrivate void SyncAuthenticOpenCLBuffer(const Image *image) +{ + CacheInfo + *magick_restrict cache_info; + + assert(image != (Image *)NULL); + cache_info = (CacheInfo *)image->cache; + CopyOpenCLBuffer(cache_info); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S y n c A u t h e n t i c P i x e l C a c h e N e x u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncAuthenticPixelCacheNexus() saves the authentic image pixels to the +% in-memory or disk cache. The method returns MagickTrue if the pixel region +% is synced, otherwise MagickFalse. +% +% The format of the SyncAuthenticPixelCacheNexus() method is: +% +% MagickBooleanType SyncAuthenticPixelCacheNexus(Image *image, +% NexusInfo *nexus_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o nexus_info: the cache nexus to sync. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType SyncAuthenticPixelCacheNexus(Image *image, + NexusInfo *magick_restrict nexus_info,ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + MagickBooleanType + status; + + /* + Transfer pixels to the cache. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->cache == (Cache) NULL) + ThrowBinaryException(CacheError,"PixelCacheIsNotOpen",image->filename); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->type == UndefinedCache) + return(MagickFalse); + if ((image->storage_class == DirectClass) && + (image->clip_mask != (Image *) NULL) && + (ClipPixelCacheNexus(image,nexus_info,exception) == MagickFalse)) + return(MagickFalse); + if ((image->storage_class == DirectClass) && + (image->mask != (Image *) NULL) && + (MaskPixelCacheNexus(image,nexus_info,exception) == MagickFalse)) + return(MagickFalse); + if (nexus_info->authentic_pixel_cache != MagickFalse) + { + if (image->taint == MagickFalse) + image->taint=MagickTrue; + return(MagickTrue); + } + assert(cache_info->signature == MagickCoreSignature); + status=WritePixelCachePixels(cache_info,nexus_info,exception); + if ((cache_info->active_index_channel != MagickFalse) && + (WritePixelCacheIndexes(cache_info,nexus_info,exception) == MagickFalse)) + return(MagickFalse); + if ((status != MagickFalse) && (image->taint == MagickFalse)) + image->taint=MagickTrue; + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S y n c A u t h e n t i c P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncAuthenticPixelsCache() saves the authentic image pixels to the in-memory +% or disk cache. The method returns MagickTrue if the pixel region is synced, +% otherwise MagickFalse. +% +% The format of the SyncAuthenticPixelsCache() method is: +% +% MagickBooleanType SyncAuthenticPixelsCache(Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType SyncAuthenticPixelsCache(Image *image, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + status; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + assert(id < (int) cache_info->number_threads); + status=SyncAuthenticPixelCacheNexus(image,cache_info->nexus_info[id], + exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S y n c A u t h e n t i c P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncAuthenticPixels() saves the image pixels to the in-memory or disk cache. +% The method returns MagickTrue if the pixel region is flushed, otherwise +% MagickFalse. +% +% The format of the SyncAuthenticPixels() method is: +% +% MagickBooleanType SyncAuthenticPixels(Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType SyncAuthenticPixels(Image *image, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + status; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + assert(image->cache != (Cache) NULL); + cache_info=(CacheInfo *) image->cache; + assert(cache_info->signature == MagickCoreSignature); + if (cache_info->methods.sync_authentic_pixels_handler != + (SyncAuthenticPixelsHandler) NULL) + return(cache_info->methods.sync_authentic_pixels_handler(image,exception)); + assert(id < (int) cache_info->number_threads); + status=SyncAuthenticPixelCacheNexus(image,cache_info->nexus_info[id], + exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S y n c I m a g e P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncImagePixelCache() saves the image pixels to the in-memory or disk cache. +% The method returns MagickTrue if the pixel region is flushed, otherwise +% MagickFalse. +% +% The format of the SyncImagePixelCache() method is: +% +% MagickBooleanType SyncImagePixelCache(Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickPrivate MagickBooleanType SyncImagePixelCache(Image *image, + ExceptionInfo *exception) +{ + CacheInfo + *magick_restrict cache_info; + + assert(image != (Image *) NULL); + assert(exception != (ExceptionInfo *) NULL); + cache_info=(CacheInfo *) GetImagePixelCache(image,MagickTrue,exception); + return(cache_info == (CacheInfo *) NULL ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e P i x e l C a c h e I n d e x e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePixelCacheIndexes() writes the colormap indexes to the specified +% region of the pixel cache. +% +% The format of the WritePixelCacheIndexes() method is: +% +% MagickBooleanType WritePixelCacheIndexes(CacheInfo *cache_info, +% NexusInfo *nexus_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_info: the pixel cache. +% +% o nexus_info: the cache nexus to write the colormap indexes. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType WritePixelCacheIndexes(CacheInfo *cache_info, + NexusInfo *magick_restrict nexus_info,ExceptionInfo *exception) +{ + MagickOffsetType + count, + offset; + + MagickSizeType + extent, + length; + + const IndexPacket + *magick_restrict p; + + ssize_t + y; + + size_t + rows; + + if (cache_info->active_index_channel == MagickFalse) + return(MagickFalse); + if (nexus_info->authentic_pixel_cache != MagickFalse) + return(MagickTrue); + offset=(MagickOffsetType) nexus_info->region.y*cache_info->columns+ + nexus_info->region.x; + length=(MagickSizeType) nexus_info->region.width*sizeof(IndexPacket); + rows=nexus_info->region.height; + extent=(MagickSizeType) length*rows; + p=nexus_info->indexes; + y=0; + switch (cache_info->type) + { + case MemoryCache: + case MapCache: + { + IndexPacket + *magick_restrict q; + + /* + Write indexes to memory. + */ + if ((cache_info->columns == nexus_info->region.width) && + (extent == (MagickSizeType) ((size_t) extent))) + { + length=extent; + rows=1UL; + } + q=cache_info->indexes+offset; + for (y=0; y < (ssize_t) rows; y++) + { + (void) memcpy(q,p,(size_t) length); + p+=nexus_info->region.width; + q+=cache_info->columns; + } + break; + } + case DiskCache: + { + /* + Write indexes to disk. + */ + LockSemaphoreInfo(cache_info->file_semaphore); + if (OpenPixelCacheOnDisk(cache_info,IOMode) == MagickFalse) + { + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + cache_info->cache_filename); + UnlockSemaphoreInfo(cache_info->file_semaphore); + return(MagickFalse); + } + if ((cache_info->columns == nexus_info->region.width) && + (extent <= MagickMaxBufferExtent)) + { + length=extent; + rows=1UL; + } + extent=(MagickSizeType) cache_info->columns*cache_info->rows; + for (y=0; y < (ssize_t) rows; y++) + { + count=WritePixelCacheRegion(cache_info,cache_info->offset+extent* + sizeof(PixelPacket)+offset*sizeof(*p),length,(const unsigned char *) + p); + if (count < (MagickOffsetType) length) + break; + p+=nexus_info->region.width; + offset+=cache_info->columns; + } + if (IsFileDescriptorLimitExceeded() != MagickFalse) + (void) ClosePixelCacheOnDisk(cache_info); + UnlockSemaphoreInfo(cache_info->file_semaphore); + break; + } + case DistributedCache: + { + RectangleInfo + region; + + /* + Write indexes to distributed cache. + */ + LockSemaphoreInfo(cache_info->file_semaphore); + region=nexus_info->region; + if ((cache_info->columns != nexus_info->region.width) || + (extent > MagickMaxBufferExtent)) + region.height=1UL; + else + { + length=extent; + rows=1UL; + } + for (y=0; y < (ssize_t) rows; y++) + { + count=WriteDistributePixelCacheIndexes((DistributeCacheInfo *) + cache_info->server_info,®ion,length,(const unsigned char *) p); + if (count != (MagickOffsetType) length) + break; + p+=nexus_info->region.width; + region.y++; + } + UnlockSemaphoreInfo(cache_info->file_semaphore); + break; + } + default: + break; + } + if (y < (ssize_t) rows) + { + ThrowFileException(exception,CacheError,"UnableToWritePixelCache", + cache_info->cache_filename); + return(MagickFalse); + } + if ((cache_info->debug != MagickFalse) && + (CacheTick(nexus_info->region.y,cache_info->rows) != MagickFalse)) + (void) LogMagickEvent(CacheEvent,GetMagickModule(), + "%s[%.20gx%.20g%+.20g%+.20g]",cache_info->filename,(double) + nexus_info->region.width,(double) nexus_info->region.height,(double) + nexus_info->region.x,(double) nexus_info->region.y); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e P i x e l C a c h e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WritePixelCachePixels() writes image pixels to the specified region of the +% pixel cache. +% +% The format of the WritePixelCachePixels() method is: +% +% MagickBooleanType WritePixelCachePixels(CacheInfo *cache_info, +% NexusInfo *nexus_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o cache_info: the pixel cache. +% +% o nexus_info: the cache nexus to write the pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType WritePixelCachePixels(CacheInfo *cache_info, + NexusInfo *magick_restrict nexus_info,ExceptionInfo *exception) +{ + MagickOffsetType + count, + offset; + + MagickSizeType + extent, + length; + + const PixelPacket + *magick_restrict p; + + ssize_t + y; + + size_t + rows; + + if (nexus_info->authentic_pixel_cache != MagickFalse) + return(MagickTrue); + offset=(MagickOffsetType) nexus_info->region.y*cache_info->columns+ + nexus_info->region.x; + length=(MagickSizeType) nexus_info->region.width*sizeof(PixelPacket); + rows=nexus_info->region.height; + extent=length*rows; + p=nexus_info->pixels; + y=0; + switch (cache_info->type) + { + case MemoryCache: + case MapCache: + { + PixelPacket + *magick_restrict q; + + /* + Write pixels to memory. + */ + if ((cache_info->columns == nexus_info->region.width) && + (extent == (MagickSizeType) ((size_t) extent))) + { + length=extent; + rows=1UL; + } + q=cache_info->pixels+offset; + for (y=0; y < (ssize_t) rows; y++) + { + (void) memcpy(q,p,(size_t) length); + p+=nexus_info->region.width; + q+=cache_info->columns; + } + break; + } + case DiskCache: + { + /* + Write pixels to disk. + */ + LockSemaphoreInfo(cache_info->file_semaphore); + if (OpenPixelCacheOnDisk(cache_info,IOMode) == MagickFalse) + { + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + cache_info->cache_filename); + UnlockSemaphoreInfo(cache_info->file_semaphore); + return(MagickFalse); + } + if ((cache_info->columns == nexus_info->region.width) && + (extent <= MagickMaxBufferExtent)) + { + length=extent; + rows=1UL; + } + for (y=0; y < (ssize_t) rows; y++) + { + count=WritePixelCacheRegion(cache_info,cache_info->offset+offset* + sizeof(*p),length,(const unsigned char *) p); + if (count < (MagickOffsetType) length) + break; + p+=nexus_info->region.width; + offset+=cache_info->columns; + } + if (IsFileDescriptorLimitExceeded() != MagickFalse) + (void) ClosePixelCacheOnDisk(cache_info); + UnlockSemaphoreInfo(cache_info->file_semaphore); + break; + } + case DistributedCache: + { + RectangleInfo + region; + + /* + Write pixels to distributed cache. + */ + LockSemaphoreInfo(cache_info->file_semaphore); + region=nexus_info->region; + if ((cache_info->columns != nexus_info->region.width) || + (extent > MagickMaxBufferExtent)) + region.height=1UL; + else + { + length=extent; + rows=1UL; + } + for (y=0; y < (ssize_t) rows; y++) + { + count=WriteDistributePixelCachePixels((DistributeCacheInfo *) + cache_info->server_info,®ion,length,(const unsigned char *) p); + if (count != (MagickOffsetType) length) + break; + p+=nexus_info->region.width; + region.y++; + } + UnlockSemaphoreInfo(cache_info->file_semaphore); + break; + } + default: + break; + } + if (y < (ssize_t) rows) + { + ThrowFileException(exception,CacheError,"UnableToWritePixelCache", + cache_info->cache_filename); + return(MagickFalse); + } + if ((cache_info->debug != MagickFalse) && + (CacheTick(nexus_info->region.y,cache_info->rows) != MagickFalse)) + (void) LogMagickEvent(CacheEvent,GetMagickModule(), + "%s[%.20gx%.20g%+.20g%+.20g]",cache_info->filename,(double) + nexus_info->region.width,(double) nexus_info->region.height,(double) + nexus_info->region.x,(double) nexus_info->region.y); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/magick/cache.h b/ImageMagick-6.9.12-44/magick/cache.h new file mode 100644 index 0000000..e6715fa --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/cache.h @@ -0,0 +1,93 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore cache methods. +*/ +#ifndef MAGICKCORE_CACHE_H +#define MAGICKCORE_CACHE_H + +#include "magick/blob.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef enum +{ + UndefinedCache, + MemoryCache, + MapCache, + DiskCache, + PingCache, + DistributedCache +} CacheType; + +extern MagickExport CacheType + GetImagePixelCacheType(const Image *); + +extern MagickExport const char + *GetPixelCacheFilename(const Image *); + +extern MagickExport const IndexPacket + *GetVirtualIndexQueue(const Image *); + +extern MagickExport const PixelPacket + *GetVirtualPixels(const Image *,const ssize_t,const ssize_t,const size_t, + const size_t,ExceptionInfo *), + *GetVirtualPixelQueue(const Image *); + +extern MagickExport const void + *AcquirePixelCachePixels(const Image *,MagickSizeType *,ExceptionInfo *); + +extern MagickExport IndexPacket + *GetAuthenticIndexQueue(const Image *); + +extern MagickExport MagickBooleanType + CacheComponentGenesis(void), + GetOneVirtualMagickPixel(const Image *,const ssize_t,const ssize_t, + MagickPixelPacket *,ExceptionInfo *), + GetOneVirtualPixel(const Image *,const ssize_t,const ssize_t,PixelPacket *, + ExceptionInfo *), + GetOneVirtualMethodPixel(const Image *,const VirtualPixelMethod,const ssize_t, + const ssize_t,PixelPacket *,ExceptionInfo *), + GetOneAuthenticPixel(Image *,const ssize_t,const ssize_t,PixelPacket *, + ExceptionInfo *), + PersistPixelCache(Image *,const char *,const MagickBooleanType, + MagickOffsetType *,ExceptionInfo *), + SyncAuthenticPixels(Image *,ExceptionInfo *); + +extern MagickExport MagickSizeType + GetImageExtent(const Image *); + +extern MagickExport PixelPacket + *GetAuthenticPixels(Image *,const ssize_t,const ssize_t,const size_t, + const size_t,ExceptionInfo *), + *GetAuthenticPixelQueue(const Image *), + *QueueAuthenticPixels(Image *,const ssize_t,const ssize_t,const size_t, + const size_t,ExceptionInfo *); + +extern MagickExport VirtualPixelMethod + GetPixelCacheVirtualMethod(const Image *), + SetPixelCacheVirtualMethod(const Image *,const VirtualPixelMethod); + +extern MagickExport void + CacheComponentTerminus(void), + *GetPixelCachePixels(Image *,MagickSizeType *,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/channel.c b/ImageMagick-6.9.12-44/magick/channel.c new file mode 100644 index 0000000..b89d3bd --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/channel.c @@ -0,0 +1,1001 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC H H AAA N N N N EEEEE L % +% C H H A A NN N NN N E L % +% C HHHHH AAAAA N N N N N N EEE L % +% C H H A A N NN N NN E L % +% CCCC H H A A N N N N EEEEE LLLLL % +% % +% % +% MagickCore Image Channel Methods % +% % +% Software Design % +% Cristy % +% December 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/cache-private.h" +#include "magick/channel.h" +#include "magick/color-private.h" +#include "magick/colorspace-private.h" +#include "magick/composite-private.h" +#include "magick/exception-private.h" +#include "magick/enhance.h" +#include "magick/image.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/resource_.h" +#include "magick/string-private.h" +#include "magick/thread-private.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/version.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o m b i n e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CombineImages() combines one or more images into a single image. The +% grayscale value of the pixels of each image in the sequence is assigned in +% order to the specified channels of the combined image. The typical +% ordering would be image 1 => Red, 2 => Green, 3 => Blue, etc. +% +% The format of the CombineImages method is: +% +% Image *CombineImages(const Image *image,const ChannelType channel, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *CombineImages(const Image *image,const ChannelType channel, + ExceptionInfo *exception) +{ +#define CombineImageTag "Combine/Image" + + CacheView + *combine_view; + + const Image + *next; + + Image + *combine_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + /* + Ensure the image are the same size. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + for (next=image; next != (Image *) NULL; next=GetNextImageInList(next)) + { + if ((next->columns != image->columns) || (next->rows != image->rows)) + ThrowImageException(OptionError,"ImagesAreNotTheSameSize"); + } + combine_image=CloneImage(image,0,0,MagickTrue,exception); + if (combine_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(combine_image,DirectClass) == MagickFalse) + { + InheritException(exception,&combine_image->exception); + combine_image=DestroyImage(combine_image); + return((Image *) NULL); + } + if (IssRGBCompatibleColorspace(image->colorspace) != MagickFalse) + { + if (fabs(image->gamma-1.0) <= MagickEpsilon) + (void) SetImageColorspace(combine_image,RGBColorspace); + else + (void) SetImageColorspace(combine_image,sRGBColorspace); + } + if ((channel & OpacityChannel) != 0) + combine_image->matte=MagickTrue; + (void) SetImageBackgroundColor(combine_image); + /* + Combine images. + */ + status=MagickTrue; + progress=0; + combine_view=AcquireAuthenticCacheView(combine_image,exception); + for (y=0; y < (ssize_t) combine_image->rows; y++) + { + CacheView + *image_view; + + const Image + *next; + + PixelPacket + *pixels; + + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewAuthenticPixels(combine_view,0,y,combine_image->columns, + 1,exception); + if (pixels == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + next=image; + if (((channel & RedChannel) != 0) && (next != (Image *) NULL)) + { + image_view=AcquireVirtualCacheView(next,exception); + p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception); + if (p == (const PixelPacket *) NULL) + continue; + q=pixels; + for (x=0; x < (ssize_t) combine_image->columns; x++) + { + SetPixelRed(q,ClampToQuantum(GetPixelIntensity(image,p))); + p++; + q++; + } + image_view=DestroyCacheView(image_view); + next=GetNextImageInList(next); + } + if (((channel & GreenChannel) != 0) && (next != (Image *) NULL)) + { + image_view=AcquireVirtualCacheView(next,exception); + p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception); + if (p == (const PixelPacket *) NULL) + continue; + q=pixels; + for (x=0; x < (ssize_t) combine_image->columns; x++) + { + SetPixelGreen(q,ClampToQuantum(GetPixelIntensity(image,p))); + p++; + q++; + } + image_view=DestroyCacheView(image_view); + next=GetNextImageInList(next); + } + if (((channel & BlueChannel) != 0) && (next != (Image *) NULL)) + { + image_view=AcquireVirtualCacheView(next,exception); + p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception); + if (p == (const PixelPacket *) NULL) + continue; + q=pixels; + for (x=0; x < (ssize_t) combine_image->columns; x++) + { + SetPixelBlue(q,ClampToQuantum(GetPixelIntensity(image,p))); + p++; + q++; + } + image_view=DestroyCacheView(image_view); + next=GetNextImageInList(next); + } + if (((channel & OpacityChannel) != 0) && (next != (Image *) NULL)) + { + image_view=AcquireVirtualCacheView(next,exception); + p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception); + if (p == (const PixelPacket *) NULL) + continue; + q=pixels; + for (x=0; x < (ssize_t) combine_image->columns; x++) + { + SetPixelAlpha(q,ClampToQuantum(GetPixelIntensity(image,p))); + p++; + q++; + } + image_view=DestroyCacheView(image_view); + next=GetNextImageInList(next); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace) && (next != (Image *) NULL)) + { + IndexPacket + *indexes; + + image_view=AcquireVirtualCacheView(next,exception); + p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception); + if (p == (const PixelPacket *) NULL) + continue; + indexes=GetCacheViewAuthenticIndexQueue(combine_view); + for (x=0; x < (ssize_t) combine_image->columns; x++) + { + SetPixelIndex(indexes+x,ClampToQuantum(GetPixelIntensity(image,p))); + p++; + } + image_view=DestroyCacheView(image_view); + next=GetNextImageInList(next); + } + if (SyncCacheViewAuthenticPixels(combine_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,CombineImageTag,progress, + combine_image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + combine_view=DestroyCacheView(combine_view); + if (IsGrayColorspace(combine_image->colorspace) != MagickFalse) + (void) TransformImageColorspace(combine_image,sRGBColorspace); + if (status == MagickFalse) + combine_image=DestroyImage(combine_image); + return(combine_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e A l p h a C h a n n e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageAlphaChannel() returns MagickFalse if the image alpha channel is +% not activated. That is, the image is RGB rather than RGBA or CMYK rather +% than CMYKA. +% +% The format of the GetImageAlphaChannel method is: +% +% MagickBooleanType GetImageAlphaChannel(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType GetImageAlphaChannel(const Image *image) +{ + assert(image != (const Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + return(image->matte); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e p a r a t e I m a g e C h a n n e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SeparateImageChannel() separates a channel from the image and returns it as +% a grayscale image. A channel is a particular color component of each pixel +% in the image. +% +% The format of the SeparateImageChannel method is: +% +% MagickBooleanType SeparateImageChannel(Image *image, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: Identify which channel to extract: RedChannel, GreenChannel, +% BlueChannel, OpacityChannel, CyanChannel, MagentaChannel, +% YellowChannel, or BlackChannel. +% +*/ + +MagickExport Image *SeparateImage(const Image *image,const ChannelType channel, + ExceptionInfo *exception) +{ + Image + *separate_image; + + MagickBooleanType + status; + + /* + Initialize separate image attributes. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + separate_image=CloneImage(image,0,0,MagickTrue,exception); + if (separate_image == (Image *) NULL) + return((Image *) NULL); + status=SeparateImageChannel(separate_image,channel); + if (status == MagickFalse) + separate_image=DestroyImage(separate_image); + return(separate_image); +} + +MagickExport MagickBooleanType SeparateImageChannel(Image *image, + const ChannelType channel) +{ +#define SeparateImageTag "Separate/Image" + + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + if (channel == GrayChannels) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + /* + Separate image channels. + */ + status=MagickTrue; + progress=0; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + switch (channel) + { + case RedChannel: + { + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGreen(q,GetPixelRed(q)); + SetPixelBlue(q,GetPixelRed(q)); + q++; + } + break; + } + case GreenChannel: + { + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelGreen(q)); + SetPixelBlue(q,GetPixelGreen(q)); + q++; + } + break; + } + case BlueChannel: + { + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelBlue(q)); + SetPixelGreen(q,GetPixelBlue(q)); + q++; + } + break; + } + case OpacityChannel: + { + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelOpacity(q)); + SetPixelGreen(q,GetPixelOpacity(q)); + SetPixelBlue(q,GetPixelOpacity(q)); + q++; + } + break; + } + case BlackChannel: + { + if ((image->storage_class != PseudoClass) && + (image->colorspace != CMYKColorspace)) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelIndex(indexes+x)); + SetPixelGreen(q,GetPixelIndex(indexes+x)); + SetPixelBlue(q,GetPixelIndex(indexes+x)); + q++; + } + break; + } + case TrueAlphaChannel: + { + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,GetPixelAlpha(q)); + SetPixelGreen(q,GetPixelAlpha(q)); + SetPixelBlue(q,GetPixelAlpha(q)); + q++; + } + break; + } + case GrayChannels: + { + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelAlpha(q,ClampToQuantum(GetPixelIntensity(image,q))); + q++; + } + break; + } + default: + break; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,SeparateImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + if (channel != GrayChannels) + { + image->matte=MagickFalse; + (void) SetImageColorspace(image,GRAYColorspace); + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e p a r a t e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SeparateImages() returns a separate grayscale image for each channel +% specified. +% +% The format of the SeparateImages method is: +% +% MagickBooleanType SeparateImages(const Image *image, +% const ChannelType channel,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: Identify which channels to extract: RedChannel, GreenChannel, +% BlueChannel, OpacityChannel, CyanChannel, MagentaChannel, +% YellowChannel, or BlackChannel. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *SeparateImages(const Image *image,const ChannelType channel, + ExceptionInfo *exception) +{ + Image + *images, + *separate_image; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + images=NewImageList(); + if ((channel & RedChannel) != 0) + { + separate_image=CloneImage(image,0,0,MagickTrue,exception); + (void) SeparateImageChannel(separate_image,RedChannel); + AppendImageToList(&images,separate_image); + } + if ((channel & GreenChannel) != 0) + { + separate_image=CloneImage(image,0,0,MagickTrue,exception); + (void) SeparateImageChannel(separate_image,GreenChannel); + AppendImageToList(&images,separate_image); + } + if ((channel & BlueChannel) != 0) + { + separate_image=CloneImage(image,0,0,MagickTrue,exception); + (void) SeparateImageChannel(separate_image,BlueChannel); + AppendImageToList(&images,separate_image); + } + if (((channel & BlackChannel) != 0) && (image->colorspace == CMYKColorspace)) + { + separate_image=CloneImage(image,0,0,MagickTrue,exception); + (void) SeparateImageChannel(separate_image,BlackChannel); + AppendImageToList(&images,separate_image); + } + if ((channel & AlphaChannel) != 0) + { + separate_image=CloneImage(image,0,0,MagickTrue,exception); + (void) SeparateImageChannel(separate_image,TrueAlphaChannel); + AppendImageToList(&images,separate_image); + } + return(images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e A l p h a C h a n n e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageAlphaChannel() activates, deactivates, resets, or sets the alpha +% channel. +% +% The format of the SetImageAlphaChannel method is: +% +% MagickBooleanType SetImageAlphaChannel(Image *image, +% const AlphaChannelType alpha_type) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o alpha_type: The alpha channel type: ActivateAlphaChannel, +% AssociateAlphaChannel, CopyAlphaChannel, Disassociate, +% DeactivateAlphaChannel, ExtractAlphaChannel, OpaqueAlphaChannel, +% ResetAlphaChannel, SetAlphaChannel, ShapeAlphaChannel, and +% TransparentAlphaChannel. +% +*/ +MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, + const AlphaChannelType alpha_type) +{ + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + ssize_t + y; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + exception=(&image->exception); + status=MagickTrue; + switch (alpha_type) + { + case ActivateAlphaChannel: + { + if (image->matte == MagickTrue) + return(status); + image->matte=MagickTrue; + break; + } + case AssociateAlphaChannel: + { + /* + Associate alpha. + */ + status=SetImageStorageClass(image,DirectClass); + if (status == MagickFalse) + break; + image_view=AcquireAuthenticCacheView(image,exception); + #if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) + #endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + double + gamma; + + gamma=QuantumScale*GetPixelAlpha(q); + SetPixelRed(q,ClampToQuantum(gamma*GetPixelRed(q))); + SetPixelGreen(q,ClampToQuantum(gamma*GetPixelGreen(q))); + SetPixelBlue(q,ClampToQuantum(gamma*GetPixelBlue(q))); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + image->matte=MagickFalse; + break; + } + case BackgroundAlphaChannel: + { + IndexPacket + index; + + MagickBooleanType + status; + + MagickPixelPacket + background; + + PixelPacket + pixel; + + /* + Set transparent pixels to background color. + */ + if (image->matte == MagickFalse) + break; + status=SetImageStorageClass(image,DirectClass); + if (status == MagickFalse) + break; + GetMagickPixelPacket(image,&background); + SetMagickPixelPacket(image,&image->background_color,(const IndexPacket *) + NULL,&background); + if (image->colorspace == CMYKColorspace) + ConvertRGBToCMYK(&background); + index=0; + SetPixelPacket(image,&background,&pixel,&index); + status=MagickTrue; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); + #if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) + #endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + if (q->opacity == TransparentOpacity) + { + SetPixelRed(q,pixel.red); + SetPixelGreen(q,pixel.green); + SetPixelBlue(q,pixel.blue); + } + q++; + } + if (image->colorspace == CMYKColorspace) + { + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,index); + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + return(status); + } + case CopyAlphaChannel: + case ShapeAlphaChannel: + { + /* + Special usage case for SeparateImageChannel(): copy grayscale color to + the alpha channel. + */ + status=SeparateImageChannel(image,GrayChannels); + image->matte=MagickTrue; /* make sure transparency is now on! */ + if (alpha_type == ShapeAlphaChannel) + { + MagickPixelPacket + background; + + /* + Reset all color channels to background color. + */ + GetMagickPixelPacket(image,&background); + SetMagickPixelPacket(image,&(image->background_color),(IndexPacket *) + NULL,&background); + (void) LevelColorsImage(image,&background,&background,MagickTrue); + } + break; + } + case DeactivateAlphaChannel: + { + if (image->matte == MagickFalse) + return(status); + image->matte=MagickFalse; + break; + } + case DisassociateAlphaChannel: + { + status=SetImageStorageClass(image,DirectClass); + if (status == MagickFalse) + break; + image->matte=MagickTrue; + image_view=AcquireAuthenticCacheView(image,exception); + #if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) + #endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + double + alpha, + gamma; + + alpha=QuantumScale*GetPixelAlpha(q); + gamma=PerceptibleReciprocal(alpha); + SetPixelRed(q,ClampToQuantum(gamma*GetPixelRed(q))); + SetPixelGreen(q,ClampToQuantum(gamma*GetPixelGreen(q))); + SetPixelBlue(q,ClampToQuantum(gamma*GetPixelBlue(q))); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + image->matte=MagickFalse; + break; + } + case ExtractAlphaChannel: + { + status=SeparateImageChannel(image,TrueAlphaChannel); + image->matte=MagickFalse; + break; + } + case RemoveAlphaChannel: + case FlattenAlphaChannel: + { + IndexPacket + index; + + MagickPixelPacket + background; + + PixelPacket + pixel; + + /* + Flatten image pixels over the background pixels. + */ + if (image->matte == MagickFalse) + break; + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + break; + GetMagickPixelPacket(image,&background); + SetMagickPixelPacket(image,&image->background_color,(const IndexPacket *) + NULL,&background); + if (image->colorspace == CMYKColorspace) + ConvertRGBToCMYK(&background); + (void) memset(&pixel,0,sizeof(pixel)); + index=0; + SetPixelPacket(image,&background,&pixel,&index); + image_view=AcquireAuthenticCacheView(image,exception); + #if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) + #endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + double + gamma, + opacity; + + gamma=1.0-QuantumScale*QuantumScale*q->opacity*pixel.opacity; + opacity=(double) QuantumRange*(1.0-gamma); + gamma=PerceptibleReciprocal(gamma); + q->red=ClampToQuantum(gamma*MagickOver_((MagickRealType) q->red, + (MagickRealType) q->opacity,(MagickRealType) pixel.red, + (MagickRealType) pixel.opacity)); + q->green=ClampToQuantum(gamma*MagickOver_((MagickRealType) q->green, + (MagickRealType) q->opacity,(MagickRealType) pixel.green, + (MagickRealType) pixel.opacity)); + q->blue=ClampToQuantum(gamma*MagickOver_((MagickRealType) q->blue, + (MagickRealType) q->opacity,(MagickRealType) pixel.blue, + (MagickRealType) pixel.opacity)); + q->opacity=ClampToQuantum(opacity); + q++; + } + if (image->colorspace == CMYKColorspace) + { + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,index); + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + return(status); + } + case ResetAlphaChannel: /* deprecated */ + case OpaqueAlphaChannel: + { + status=SetImageOpacity(image,OpaqueOpacity); + break; + } + case SetAlphaChannel: + { + if (image->matte == MagickFalse) + status=SetImageOpacity(image,OpaqueOpacity); + break; + } + case TransparentAlphaChannel: + { + status=SetImageOpacity(image,TransparentOpacity); + break; + } + case UndefinedAlphaChannel: + break; + } + if (status == MagickFalse) + return(status); + return(SyncImagePixelCache(image,&image->exception)); +} diff --git a/ImageMagick-6.9.12-44/magick/channel.h b/ImageMagick-6.9.12-44/magick/channel.h new file mode 100644 index 0000000..372c613 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/channel.h @@ -0,0 +1,41 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image channel methods. +*/ +#ifndef MAGICKCORE_CHANNEL_H +#define MAGICKCORE_CHANNEL_H + +#include "magick/image.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport Image + *CombineImages(const Image *,const ChannelType,ExceptionInfo *), + *SeparateImage(const Image *,const ChannelType,ExceptionInfo *), + *SeparateImages(const Image *,const ChannelType,ExceptionInfo *); + +extern MagickExport MagickBooleanType + GetImageAlphaChannel(const Image *), + SeparateImageChannel(Image *,const ChannelType), + SetImageAlphaChannel(Image *,const AlphaChannelType); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/cipher.c b/ImageMagick-6.9.12-44/magick/cipher.c new file mode 100644 index 0000000..e7b5a81 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/cipher.c @@ -0,0 +1,1190 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% CCCC IIIII PPPP H H EEEEE RRRR % +% C I P P H H E R R % +% C I PPPP HHHHH EEE RRRR % +% C I P H H E R R % +% CCCC IIIII P H H EEEEE R R % +% % +% % +% MagickCore Cipher Methods % +% % +% Software Design % +% Cristy % +% March 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/cache.h" +#include "magick/cipher.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/hashmap.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/registry.h" +#include "magick/semaphore.h" +#include "magick/signature-private.h" +#include "magick/splay-tree.h" +#include "magick/statistic.h" +#include "magick/string_.h" + +#if defined(MAGICKCORE_CIPHER_SUPPORT) +/* + Define declarations. +*/ +#define AESBlocksize 16 + +/* + Typedef declarations. +*/ +typedef struct _AESInfo +{ + StringInfo + *key; + + unsigned int + blocksize, + *encipher_key, + *decipher_key; + + ssize_t + rounds, + timestamp; + + size_t + signature; +} AESInfo; + +/* + Global declarations. +*/ +static unsigned char + InverseLog[256] = + { + 1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, + 19, 53, 95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, + 30, 34, 102, 170, 229, 52, 92, 228, 55, 89, 235, 38, 106, 190, + 217, 112, 144, 171, 230, 49, 83, 245, 4, 12, 20, 60, 68, 204, + 79, 209, 104, 184, 211, 110, 178, 205, 76, 212, 103, 169, 224, 59, + 77, 215, 98, 166, 241, 8, 24, 40, 120, 136, 131, 158, 185, 208, + 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154, 181, 196, + 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163, + 254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, + 96, 160, 251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, + 250, 21, 63, 65, 195, 94, 226, 61, 71, 201, 64, 192, 91, 237, + 44, 116, 156, 191, 218, 117, 159, 186, 213, 100, 172, 239, 42, 126, + 130, 157, 188, 223, 122, 142, 137, 128, 155, 182, 193, 88, 232, 35, + 101, 175, 234, 37, 111, 177, 200, 67, 197, 84, 252, 31, 33, 99, + 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202, 69, 207, + 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14, + 18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, + 13, 23, 57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, + 199, 82, 246, 1 + }, + Log[256] = + { + 0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, + 223, 3, 100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, + 248, 105, 28, 193, 125, 194, 29, 181, 249, 185, 39, 106, 77, 228, + 166, 114, 154, 201, 9, 120, 101, 47, 138, 5, 33, 15, 225, 36, + 18, 240, 130, 69, 53, 147, 218, 142, 150, 143, 219, 189, 54, 208, + 206, 148, 19, 92, 210, 241, 64, 70, 131, 56, 102, 221, 253, 48, + 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16, 126, 110, + 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61, 186, + 43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115, + 167, 87, 175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, + 231, 230, 173, 232, 44, 215, 117, 122, 235, 22, 11, 245, 89, 203, + 95, 176, 156, 169, 81, 160, 127, 12, 246, 111, 23, 196, 73, 236, + 216, 67, 31, 45, 164, 118, 123, 183, 204, 187, 62, 90, 251, 96, + 177, 134, 59, 82, 161, 108, 170, 85, 41, 157, 151, 178, 135, 144, + 97, 190, 220, 252, 188, 149, 207, 205, 55, 63, 91, 209, 83, 57, + 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211, 171, + 68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153, + 227, 165, 103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, + 192, 247, 112, 7, + }, + SBox[256] = + { + 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, + 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, + 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, + 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, + 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, + 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, + 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, + 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, + 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, + 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, + 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, + 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, + 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, + 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, + 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, + 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, + 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, + 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, + 176, 84, 187, 22 + }; + +/* + Forward declarations. +*/ +static AESInfo + *DestroyAESInfo(AESInfo *); + +static void + EncipherAESBlock(AESInfo *,const unsigned char *,unsigned char *), + SetAESKey(AESInfo *,const StringInfo *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e A E S I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireAESInfo() allocate the AESInfo structure. +% +% The format of the AcquireAESInfo method is: +% +% AESInfo *AcquireAESInfo(void) +% +*/ +static AESInfo *AcquireAESInfo(void) +{ + AESInfo + *aes_info; + + aes_info=(AESInfo *) AcquireMagickMemory(sizeof(*aes_info)); + if (aes_info == (AESInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(aes_info,0,sizeof(*aes_info)); + aes_info->blocksize=AESBlocksize; + aes_info->key=AcquireStringInfo(32); + aes_info->encipher_key=(unsigned int *) AcquireQuantumMemory(60UL,sizeof( + *aes_info->encipher_key)); + aes_info->decipher_key=(unsigned int *) AcquireQuantumMemory(60UL,sizeof( + *aes_info->decipher_key)); + if ((aes_info->key == (StringInfo *) NULL) || + (aes_info->encipher_key == (unsigned int *) NULL) || + (aes_info->decipher_key == (unsigned int *) NULL)) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + aes_info->timestamp=(ssize_t) time(0); + aes_info->signature=MagickCoreSignature; + return(aes_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y A E S I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyAESInfo() zeros memory associated with the AESInfo structure. +% +% The format of the DestroyAESInfo method is: +% +% AESInfo *DestroyAESInfo(AESInfo *aes_info) +% +% A description of each parameter follows: +% +% o aes_info: the cipher context. +% +*/ +static AESInfo *DestroyAESInfo(AESInfo *aes_info) +{ + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(aes_info != (AESInfo *) NULL); + assert(aes_info->signature == MagickCoreSignature); + if (aes_info->decipher_key != (unsigned int *) NULL) + aes_info->decipher_key=(unsigned int *) RelinquishMagickMemory( + aes_info->decipher_key); + if (aes_info->encipher_key != (unsigned int *) NULL) + aes_info->encipher_key=(unsigned int *) RelinquishMagickMemory( + aes_info->encipher_key); + if (aes_info->key != (StringInfo *) NULL) + aes_info->key=DestroyStringInfo(aes_info->key); + aes_info->signature=(~MagickCoreSignature); + aes_info=(AESInfo *) RelinquishMagickMemory(aes_info); + return(aes_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E n c i p h e r A E S B l o c k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EncipherAESBlock() enciphers a single block of plaintext to produce a block +% of ciphertext. +% +% The format of the EncipherAESBlock method is: +% +% void EncipherAES(AESInfo *aes_info,const unsigned char *plaintext, +% unsigned char *ciphertext) +% +% A description of each parameter follows: +% +% o aes_info: the cipher context. +% +% o plaintext: the plain text. +% +% o ciphertext: the cipher text. +% +*/ + +static inline void AddRoundKey(const unsigned int *ciphertext, + const unsigned int *key,unsigned int *plaintext) +{ + ssize_t + i; + + /* + Xor corresponding text input and round key input bytes. + */ + for (i=0; i < 4; i++) + plaintext[i]=key[i] ^ ciphertext[i]; +} + +static inline unsigned int ByteMultiply(const unsigned char alpha, + const unsigned char beta) +{ + /* + Byte multiply two elements of GF(2^m) (mix columns and inverse mix columns). + */ + if ((alpha == 0) || (beta == 0)) + return(0); + return((unsigned int) InverseLog[(Log[alpha]+Log[beta]) % 0xff]); +} + +static inline unsigned int ByteSubTransform(unsigned int x, + unsigned char *s_box) +{ + unsigned int + key; + + /* + Non-linear layer resists differential and linear cryptoanalysis attacks. + */ + key=((unsigned int) s_box[x & 0xff]) | + ((unsigned int) s_box[(x >> 8) & 0xff] << 8) | + ((unsigned int) s_box[(x >> 16) & 0xff] << 16) | + ((unsigned int) s_box[(x >> 24) & 0xff] << 24); + return(key); +} + +static void FinalizeRoundKey(const unsigned int *ciphertext, + const unsigned int *key,unsigned char *plaintext) +{ + unsigned char + *p; + + unsigned int + i, + j; + + unsigned int + value; + + /* + The round key is XORed with the result of the mix-column transformation. + */ + p=plaintext; + for (i=0; i < 4; i++) + { + value=ciphertext[i] ^ key[i]; + for (j=0; j < 4; j++) + *p++=(unsigned char) ((value >> (8*j)) & 0xff); + } + /* + Reset registers. + */ + value=0; +} + +static void InitializeRoundKey(const unsigned char *ciphertext, + const unsigned int *key,unsigned int *plaintext) +{ + const unsigned char + *p; + + unsigned int + i, + j; + + unsigned int + value; + + p=ciphertext; + for (i=0; i < 4; i++) + { + value=0; + for (j=0; j < 4; j++) + value|=((unsigned int) *p++ << (8*j)); + plaintext[i]=key[i] ^ value; + } + /* + Reset registers. + */ + value=0; +} + +static inline unsigned int RotateLeft(const unsigned int x) +{ + return(((x << 8) | ((x >> 24) & 0xff))); +} + +static void EncipherAESBlock(AESInfo *aes_info,const unsigned char *plaintext, + unsigned char *ciphertext) +{ + ssize_t + i, + j; + + static int + map[4][4] = + { + { 0, 1, 2, 3 }, + { 1, 2, 3, 0 }, + { 2, 3, 0, 1 }, + { 3, 0, 1, 2 } + }; + + static unsigned int + D[] = + { + 0xa56363c6U, 0x847c7cf8U, 0x997777eeU, 0x8d7b7bf6U, 0x0df2f2ffU, + 0xbd6b6bd6U, 0xb16f6fdeU, 0x54c5c591U, 0x50303060U, 0x03010102U, + 0xa96767ceU, 0x7d2b2b56U, 0x19fefee7U, 0x62d7d7b5U, 0xe6abab4dU, + 0x9a7676ecU, 0x45caca8fU, 0x9d82821fU, 0x40c9c989U, 0x877d7dfaU, + 0x15fafaefU, 0xeb5959b2U, 0xc947478eU, 0x0bf0f0fbU, 0xecadad41U, + 0x67d4d4b3U, 0xfda2a25fU, 0xeaafaf45U, 0xbf9c9c23U, 0xf7a4a453U, + 0x967272e4U, 0x5bc0c09bU, 0xc2b7b775U, 0x1cfdfde1U, 0xae93933dU, + 0x6a26264cU, 0x5a36366cU, 0x413f3f7eU, 0x02f7f7f5U, 0x4fcccc83U, + 0x5c343468U, 0xf4a5a551U, 0x34e5e5d1U, 0x08f1f1f9U, 0x937171e2U, + 0x73d8d8abU, 0x53313162U, 0x3f15152aU, 0x0c040408U, 0x52c7c795U, + 0x65232346U, 0x5ec3c39dU, 0x28181830U, 0xa1969637U, 0x0f05050aU, + 0xb59a9a2fU, 0x0907070eU, 0x36121224U, 0x9b80801bU, 0x3de2e2dfU, + 0x26ebebcdU, 0x6927274eU, 0xcdb2b27fU, 0x9f7575eaU, 0x1b090912U, + 0x9e83831dU, 0x742c2c58U, 0x2e1a1a34U, 0x2d1b1b36U, 0xb26e6edcU, + 0xee5a5ab4U, 0xfba0a05bU, 0xf65252a4U, 0x4d3b3b76U, 0x61d6d6b7U, + 0xceb3b37dU, 0x7b292952U, 0x3ee3e3ddU, 0x712f2f5eU, 0x97848413U, + 0xf55353a6U, 0x68d1d1b9U, 0x00000000U, 0x2cededc1U, 0x60202040U, + 0x1ffcfce3U, 0xc8b1b179U, 0xed5b5bb6U, 0xbe6a6ad4U, 0x46cbcb8dU, + 0xd9bebe67U, 0x4b393972U, 0xde4a4a94U, 0xd44c4c98U, 0xe85858b0U, + 0x4acfcf85U, 0x6bd0d0bbU, 0x2aefefc5U, 0xe5aaaa4fU, 0x16fbfbedU, + 0xc5434386U, 0xd74d4d9aU, 0x55333366U, 0x94858511U, 0xcf45458aU, + 0x10f9f9e9U, 0x06020204U, 0x817f7ffeU, 0xf05050a0U, 0x443c3c78U, + 0xba9f9f25U, 0xe3a8a84bU, 0xf35151a2U, 0xfea3a35dU, 0xc0404080U, + 0x8a8f8f05U, 0xad92923fU, 0xbc9d9d21U, 0x48383870U, 0x04f5f5f1U, + 0xdfbcbc63U, 0xc1b6b677U, 0x75dadaafU, 0x63212142U, 0x30101020U, + 0x1affffe5U, 0x0ef3f3fdU, 0x6dd2d2bfU, 0x4ccdcd81U, 0x140c0c18U, + 0x35131326U, 0x2fececc3U, 0xe15f5fbeU, 0xa2979735U, 0xcc444488U, + 0x3917172eU, 0x57c4c493U, 0xf2a7a755U, 0x827e7efcU, 0x473d3d7aU, + 0xac6464c8U, 0xe75d5dbaU, 0x2b191932U, 0x957373e6U, 0xa06060c0U, + 0x98818119U, 0xd14f4f9eU, 0x7fdcdca3U, 0x66222244U, 0x7e2a2a54U, + 0xab90903bU, 0x8388880bU, 0xca46468cU, 0x29eeeec7U, 0xd3b8b86bU, + 0x3c141428U, 0x79dedea7U, 0xe25e5ebcU, 0x1d0b0b16U, 0x76dbdbadU, + 0x3be0e0dbU, 0x56323264U, 0x4e3a3a74U, 0x1e0a0a14U, 0xdb494992U, + 0x0a06060cU, 0x6c242448U, 0xe45c5cb8U, 0x5dc2c29fU, 0x6ed3d3bdU, + 0xefacac43U, 0xa66262c4U, 0xa8919139U, 0xa4959531U, 0x37e4e4d3U, + 0x8b7979f2U, 0x32e7e7d5U, 0x43c8c88bU, 0x5937376eU, 0xb76d6ddaU, + 0x8c8d8d01U, 0x64d5d5b1U, 0xd24e4e9cU, 0xe0a9a949U, 0xb46c6cd8U, + 0xfa5656acU, 0x07f4f4f3U, 0x25eaeacfU, 0xaf6565caU, 0x8e7a7af4U, + 0xe9aeae47U, 0x18080810U, 0xd5baba6fU, 0x887878f0U, 0x6f25254aU, + 0x722e2e5cU, 0x241c1c38U, 0xf1a6a657U, 0xc7b4b473U, 0x51c6c697U, + 0x23e8e8cbU, 0x7cdddda1U, 0x9c7474e8U, 0x211f1f3eU, 0xdd4b4b96U, + 0xdcbdbd61U, 0x868b8b0dU, 0x858a8a0fU, 0x907070e0U, 0x423e3e7cU, + 0xc4b5b571U, 0xaa6666ccU, 0xd8484890U, 0x05030306U, 0x01f6f6f7U, + 0x120e0e1cU, 0xa36161c2U, 0x5f35356aU, 0xf95757aeU, 0xd0b9b969U, + 0x91868617U, 0x58c1c199U, 0x271d1d3aU, 0xb99e9e27U, 0x38e1e1d9U, + 0x13f8f8ebU, 0xb398982bU, 0x33111122U, 0xbb6969d2U, 0x70d9d9a9U, + 0x898e8e07U, 0xa7949433U, 0xb69b9b2dU, 0x221e1e3cU, 0x92878715U, + 0x20e9e9c9U, 0x49cece87U, 0xff5555aaU, 0x78282850U, 0x7adfdfa5U, + 0x8f8c8c03U, 0xf8a1a159U, 0x80898909U, 0x170d0d1aU, 0xdabfbf65U, + 0x31e6e6d7U, 0xc6424284U, 0xb86868d0U, 0xc3414182U, 0xb0999929U, + 0x772d2d5aU, 0x110f0f1eU, 0xcbb0b07bU, 0xfc5454a8U, 0xd6bbbb6dU, + 0x3a16162cU + }; + + unsigned int + alpha, + key[4], + text[4]; + + /* + Encipher one block. + */ + (void) memset(text,0,sizeof(text)); + InitializeRoundKey(plaintext,aes_info->encipher_key,text); + for (i=1; i < aes_info->rounds; i++) + { + /* + Linear mixing step: cause diffusion of the bits over multiple rounds. + */ + for (j=0; j < 4; j++) + key[j]=D[text[j] & 0xff] ^ + RotateLeft(D[(text[map[1][j]] >> 8) & 0xff] ^ + RotateLeft(D[(text[map[2][j]] >> 16) & 0xff] ^ + RotateLeft(D[(text[map[3][j]] >> 24) & 0xff]))); + AddRoundKey(key,aes_info->encipher_key+4*i,text); + } + for (i=0; i < 4; i++) + { + alpha=(text[i] & 0x000000ff) | ((text[map[1][i]]) & 0x0000ff00) | + ((text[map[2][i]]) & 0x00ff0000) | ((text[map[3][i]]) & 0xff000000); + key[i]=ByteSubTransform(alpha,SBox); + } + FinalizeRoundKey(key,aes_info->encipher_key+4*aes_info->rounds,ciphertext); + /* + Reset registers. + */ + alpha=0; + (void) ResetMagickMemory(key,0,sizeof(key)); + (void) ResetMagickMemory(text,0,sizeof(text)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P a s s k e y D e c i p h e r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PasskeyDecipherImage() converts cipher pixels to plain pixels. +% +% The format of the PasskeyDecipherImage method is: +% +% MagickBooleanType PasskeyDecipherImage(Image *image, +% const StringInfo *passkey,ExceptionInfo *exception) +% MagickBooleanType DecipherImage(Image *image,const char *passphrase, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o passphrase: decipher cipher pixels with this passphrase. +% +% o passkey: decrypt cipher pixels with this passkey. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline void IncrementCipherNonce(const size_t length, + unsigned char *nonce) +{ + ssize_t + i; + + for (i=(ssize_t) (length-1); i >= 0; i--) + { + nonce[i]++; + if (nonce[i] != 0) + return; + } + ThrowFatalException(ResourceLimitFatalError,"Sequence wrap error `%s'"); +} + +MagickExport MagickBooleanType DecipherImage(Image *image, + const char *passphrase,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + StringInfo + *passkey; + + if (passphrase == (const char *) NULL) + return(MagickTrue); + passkey=StringToStringInfo(passphrase); + if (passkey == (StringInfo *) NULL) + return(MagickFalse); + status=PasskeyDecipherImage(image,passkey,exception); + passkey=DestroyStringInfo(passkey); + return(status); +} + +MagickExport MagickBooleanType PasskeyDecipherImage(Image *image, + const StringInfo *passkey,ExceptionInfo *exception) +{ +#define DecipherImageTag "Decipher/Image " + + AESInfo + *aes_info; + + CacheView + *image_view; + + const unsigned char + *digest; + + MagickBooleanType + proceed; + + MagickSizeType + extent; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + SignatureInfo + *signature_info; + + unsigned char + *p; + + size_t + length; + + ssize_t + y; + + StringInfo + *key, + *nonce; + + unsigned char + input_block[AESBlocksize], + output_block[AESBlocksize], + *pixels; + + /* + Generate decipher key and nonce. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if (passkey == (const StringInfo *) NULL) + return(MagickTrue); + aes_info=AcquireAESInfo(); + key=CloneStringInfo(passkey); + if (key == (StringInfo *) NULL) + { + aes_info=DestroyAESInfo(aes_info); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + nonce=SplitStringInfo(key,GetStringInfoLength(key)/2); + if (nonce == (StringInfo *) NULL) + { + key=DestroyStringInfo(key); + aes_info=DestroyAESInfo(aes_info); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + SetAESKey(aes_info,key); + key=DestroyStringInfo(key); + signature_info=AcquireSignatureInfo(); + UpdateSignature(signature_info,nonce); + extent=(MagickSizeType) image->columns*image->rows; + SetStringInfoLength(nonce,sizeof(extent)); + SetStringInfoDatum(nonce,(const unsigned char *) &extent); + UpdateSignature(signature_info,nonce); + nonce=DestroyStringInfo(nonce); + FinalizeSignature(signature_info); + (void) memset(input_block,0,sizeof(input_block)); + digest=GetStringInfoDatum(GetSignatureDigest(signature_info)); + (void) memcpy(input_block,digest,MagickMin(AESBlocksize, + GetSignatureDigestsize(signature_info))*sizeof(*input_block)); + signature_info=DestroySignatureInfo(signature_info); + /* + Convert cipher pixels to plain pixels. + */ + quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image); + if (quantum_info == (QuantumInfo *) NULL) + { + aes_info=DestroyAESInfo(aes_info); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + quantum_type=GetQuantumType(image,exception); + pixels=GetQuantumPixels(quantum_info); + image_view=AcquireAuthenticCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + ssize_t + i, + x; + + PixelPacket + *magick_restrict q; + + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,image_view,quantum_info,quantum_type, + pixels,exception); + p=pixels; + for (x=0; x < (ssize_t) length; x+=AESBlocksize) + { + (void) memmove(output_block,input_block,AESBlocksize* + sizeof(*output_block)); + IncrementCipherNonce(AESBlocksize,input_block); + EncipherAESBlock(aes_info,output_block,output_block); + for (i=0; i < AESBlocksize; i++) + p[i]^=output_block[i]; + p+=AESBlocksize; + } + (void) memmove(output_block,input_block,AESBlocksize*sizeof(*output_block)); + EncipherAESBlock(aes_info,output_block,output_block); + for (i=0; x < (ssize_t) length; x++) + { + p[i]^=output_block[i]; + i++; + } + (void) ImportQuantumPixels(image,image_view,quantum_info,quantum_type, + pixels,exception); + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + break; + proceed=SetImageProgress(image,DecipherImageTag,(MagickOffsetType) y, + image->rows); + if (proceed == MagickFalse) + break; + } + image_view=DestroyCacheView(image_view); + (void) DeleteImageProperty(image,"cipher:type"); + (void) DeleteImageProperty(image,"cipher:mode"); + (void) DeleteImageProperty(image,"cipher:nonce"); + image->taint=MagickFalse; + /* + Free resources. + */ + quantum_info=DestroyQuantumInfo(quantum_info); + aes_info=DestroyAESInfo(aes_info); + (void) ResetMagickMemory(input_block,0,sizeof(input_block)); + (void) ResetMagickMemory(output_block,0,sizeof(output_block)); + return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P a s s k e y E n c i p h e r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PasskeyEncipherImage() converts pixels to cipher-pixels. +% +% The format of the PasskeyEncipherImage method is: +% +% MagickBooleanType PasskeyEncipherImage(Image *image, +% const StringInfo *passkey,ExceptionInfo *exception) +% MagickBooleanType EncipherImage(Image *image,const char *passphrase, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o passphrase: encipher pixels with this passphrase. +% +% o passkey: decrypt cipher pixels with this passkey. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport MagickBooleanType EncipherImage(Image *image, + const char *passphrase,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + StringInfo + *passkey; + + if (passphrase == (const char *) NULL) + return(MagickTrue); + passkey=StringToStringInfo(passphrase); + if (passkey == (StringInfo *) NULL) + return(MagickFalse); + status=PasskeyEncipherImage(image,passkey,exception); + passkey=DestroyStringInfo(passkey); + return(status); +} + +MagickExport MagickBooleanType PasskeyEncipherImage(Image *image, + const StringInfo *passkey,ExceptionInfo *exception) +{ +#define EncipherImageTag "Encipher/Image " + + AESInfo + *aes_info; + + CacheView + *image_view; + + char + *signature; + + const unsigned char + *digest; + + MagickBooleanType + proceed; + + MagickSizeType + extent; + + QuantumInfo + *quantum_info; + + QuantumType + quantum_type; + + unsigned char + *p; + + SignatureInfo + *signature_info; + + size_t + length; + + ssize_t + y; + + StringInfo + *key, + *nonce; + + unsigned char + input_block[AESBlocksize], + output_block[AESBlocksize], + *pixels; + + /* + Generate encipher key and nonce. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if (passkey == (const StringInfo *) NULL) + return(MagickTrue); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + aes_info=AcquireAESInfo(); + key=CloneStringInfo(passkey); + if (key == (StringInfo *) NULL) + { + aes_info=DestroyAESInfo(aes_info); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + nonce=SplitStringInfo(key,GetStringInfoLength(key)/2); + if (nonce == (StringInfo *) NULL) + { + key=DestroyStringInfo(key); + aes_info=DestroyAESInfo(aes_info); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + SetAESKey(aes_info,key); + key=DestroyStringInfo(key); + signature_info=AcquireSignatureInfo(); + UpdateSignature(signature_info,nonce); + extent=(MagickSizeType) image->columns*image->rows; + SetStringInfoLength(nonce,sizeof(extent)); + SetStringInfoDatum(nonce,(const unsigned char *) &extent); + UpdateSignature(signature_info,nonce); + nonce=DestroyStringInfo(nonce); + FinalizeSignature(signature_info); + (void) memset(input_block,0,sizeof(input_block)); + digest=GetStringInfoDatum(GetSignatureDigest(signature_info)); + (void) memcpy(input_block,digest,MagickMin(AESBlocksize, + GetSignatureDigestsize(signature_info))*sizeof(*input_block)); + signature=StringInfoToHexString(GetSignatureDigest(signature_info)); + (void) SetImageProperty(image,"cipher:type","AES"); + (void) SetImageProperty(image,"cipher:mode","CTR"); + (void) SetImageProperty(image,"cipher:nonce",signature); + signature=DestroyString(signature); + signature_info=DestroySignatureInfo(signature_info); + /* + Convert plain pixels to cipher pixels. + */ + quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image); + if (quantum_info == (QuantumInfo *) NULL) + { + aes_info=DestroyAESInfo(aes_info); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + quantum_type=GetQuantumType(image,exception); + pixels=GetQuantumPixels(quantum_info); + image_view=AcquireAuthenticCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + ssize_t + i, + x; + + PixelPacket + *magick_restrict q; + + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + length=ExportQuantumPixels(image,image_view,quantum_info,quantum_type, + pixels,exception); + p=pixels; + for (x=0; x < (ssize_t) length; x+=AESBlocksize) + { + (void) memmove(output_block,input_block,AESBlocksize* + sizeof(*output_block)); + IncrementCipherNonce(AESBlocksize,input_block); + EncipherAESBlock(aes_info,output_block,output_block); + for (i=0; i < AESBlocksize; i++) + p[i]^=output_block[i]; + p+=AESBlocksize; + } + (void) memmove(output_block,input_block,AESBlocksize* + sizeof(*output_block)); + EncipherAESBlock(aes_info,output_block,output_block); + for (i=0; x < (ssize_t) length; x++) + { + p[i]^=output_block[i]; + i++; + } + (void) ImportQuantumPixels(image,image_view,quantum_info,quantum_type, + pixels,exception); + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + break; + proceed=SetImageProgress(image,EncipherImageTag,(MagickOffsetType) y, + image->rows); + if (proceed == MagickFalse) + break; + } + image_view=DestroyCacheView(image_view); + image->taint=MagickFalse; + /* + Free resources. + */ + quantum_info=DestroyQuantumInfo(quantum_info); + aes_info=DestroyAESInfo(aes_info); + (void) ResetMagickMemory(input_block,0,sizeof(input_block)); + (void) ResetMagickMemory(output_block,0,sizeof(output_block)); + return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t A E S K e y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetAESKey() sets the key for the AES cipher. The key length is specified +% in bits. Valid values are 128, 192, or 256 requiring a key buffer length +% in bytes of 16, 24, and 32 respectively. +% +% The format of the SetAESKey method is: +% +% SetAESKey(AESInfo *aes_info,const StringInfo *key) +% +% A description of each parameter follows: +% +% o aes_info: the cipher context. +% +% o key: the key. +% +*/ + +static inline void InverseAddRoundKey(const unsigned int *alpha, + unsigned int *beta) +{ + unsigned int + i, + j; + + for (i=0; i < 4; i++) + { + beta[i]=0; + for (j=0; j < 4; j++) + beta[i]|=(ByteMultiply(0xe,(alpha[i] >> (8*j)) & 0xff) ^ + ByteMultiply(0xb,(alpha[i] >> (8*((j+1) % 4))) & 0xff) ^ + ByteMultiply(0xd,(alpha[i] >> (8*((j+2) % 4))) & 0xff) ^ + ByteMultiply(0x9,(alpha[i] >> (8*((j+3) % 4))) & 0xff)) << (8*j); + } +} + +static inline unsigned int XTime(unsigned char alpha) +{ + unsigned char + beta; + + beta=(unsigned char) ((alpha & 0x80) != 0 ? 0x1b : 0); + alpha<<=1; + alpha^=beta; + return(alpha); +} + +static inline unsigned int RotateRight(const unsigned int x) +{ + return((x >> 8) | ((x & 0xff) << 24)); +} + +static void SetAESKey(AESInfo *aes_info,const StringInfo *key) +{ + ssize_t + i; + + ssize_t + bytes, + n; + + unsigned char + *datum; + + unsigned int + alpha, + beta; + + /* + Determine the number of rounds based on the number of bits in key. + */ + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(aes_info != (AESInfo *) NULL); + assert(aes_info->signature == MagickCoreSignature); + assert(key != (StringInfo *) NULL); + n=4; + aes_info->rounds=10; + if ((8*GetStringInfoLength(key)) >= 256) + { + n=8; + aes_info->rounds=14; + } + else + if ((8*GetStringInfoLength(key)) >= 192) + { + n=6; + aes_info->rounds=12; + } + /* + Generate crypt key. + */ + datum=GetStringInfoDatum(aes_info->key); + (void) memset(datum,0,GetStringInfoLength(aes_info->key)); + (void) memcpy(datum,GetStringInfoDatum(key),MagickMin( + GetStringInfoLength(key),GetStringInfoLength(aes_info->key))); + for (i=0; i < n; i++) + aes_info->encipher_key[i]=(unsigned int) datum[4*i] | + ((unsigned int) datum[4*i+1] << 8) | + ((unsigned int) datum[4*i+2] << 16) | + ((unsigned int) datum[4*i+3] << 24); + beta=1; + bytes=(AESBlocksize/4)*(aes_info->rounds+1); + for (i=n; i < bytes; i++) + { + alpha=aes_info->encipher_key[i-1]; + if ((i % n) == 0) + { + alpha=ByteSubTransform(RotateRight(alpha),SBox) ^ beta; + beta=XTime((unsigned char) (beta & 0xff)); + } + else + if ((n > 6) && ((i % n) == 4)) + alpha=ByteSubTransform(alpha,SBox); + aes_info->encipher_key[i]=aes_info->encipher_key[i-n] ^ alpha; + } + /* + Generate deciper key (in reverse order). + */ + for (i=0; i < 4; i++) + { + aes_info->decipher_key[i]=aes_info->encipher_key[i]; + aes_info->decipher_key[bytes-4+i]=aes_info->encipher_key[bytes-4+i]; + } + for (i=4; i < (bytes-4); i+=4) + InverseAddRoundKey(aes_info->encipher_key+i,aes_info->decipher_key+i); + /* + Reset registers. + */ + datum=GetStringInfoDatum(aes_info->key); + (void) memset(datum,0,GetStringInfoLength(aes_info->key)); + alpha=0; + beta=0; +} +#else + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P a s s k e y D e c i p h e r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PasskeyDecipherImage() converts cipher pixels to plain pixels. +% +% The format of the PasskeyDecipherImage method is: +% +% MagickBooleanType PasskeyDecipherImage(Image *image, +% const StringInfo *passkey,ExceptionInfo *exception) +% MagickBooleanType DecipherImage(Image *image,const char *passphrase, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o passphrase: decipher cipher pixels with this passphrase. +% +% o passkey: decrypt cipher pixels with this passkey. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport MagickBooleanType DecipherImage(Image *image, + const char *passphrase,ExceptionInfo *exception) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + (void) passphrase; + ThrowBinaryException(ImageError,"CipherSupportNotEnabled",image->filename); +} + +MagickExport MagickBooleanType PasskeyDecipherImage(Image *image, + const StringInfo *passkey,ExceptionInfo *exception) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + (void) passkey; + ThrowBinaryException(ImageError,"CipherSupportNotEnabled",image->filename); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P a s s k e y E n c i p h e r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PasskeyEncipherImage() converts pixels to cipher-pixels. +% +% The format of the PasskeyEncipherImage method is: +% +% MagickBooleanType PasskeyEncipherImage(Image *image, +% const StringInfo *passkey,ExceptionInfo *exception) +% MagickBooleanType EncipherImage(Image *image,const char *passphrase, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o passphrase: decipher cipher pixels with this passphrase. +% +% o passkey: decrypt cipher pixels with this passkey. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport MagickBooleanType EncipherImage(Image *image, + const char *passphrase,ExceptionInfo *exception) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + (void) passphrase; + ThrowBinaryException(ImageError,"CipherSupportNotEnabled",image->filename); +} + +MagickExport MagickBooleanType PasskeyEncipherImage(Image *image, + const StringInfo *passkey,ExceptionInfo *exception) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + (void) passkey; + ThrowBinaryException(ImageError,"CipherSupportNotEnabled",image->filename); +} +#endif diff --git a/ImageMagick-6.9.12-44/magick/cipher.h b/ImageMagick-6.9.12-44/magick/cipher.h new file mode 100644 index 0000000..0443451 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/cipher.h @@ -0,0 +1,35 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore cipher methods. +*/ +#ifndef MAGICKCORE_CIPHER_H +#define MAGICKCORE_CIPHER_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport MagickBooleanType + DecipherImage(Image *,const char *,ExceptionInfo *), + EncipherImage(Image *,const char *,ExceptionInfo *), + PasskeyDecipherImage(Image *,const StringInfo *,ExceptionInfo *), + PasskeyEncipherImage(Image *,const StringInfo *,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/client.c b/ImageMagick-6.9.12-44/magick/client.c new file mode 100644 index 0000000..5cfeee3 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/client.c @@ -0,0 +1,163 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC L IIIII EEEEE N N TTTTT % +% C L I E NN N T % +% C L I EEE N N N T % +% C L I E N NN T % +% CCCC LLLLL IIIII EEEEE N N T % +% % +% % +% MagickCore Client Methods % +% % +% Software Design % +% Cristy % +% March 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/client.h" +#include "magick/log.h" +#include "magick/string_.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C l i e n t N a m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetClientName returns the current client name. +% +% The format of the GetClientName method is: +% +% const char *GetClientName(void) +% +*/ +MagickExport const char *GetClientName(void) +{ + return(SetClientName((const char *) NULL)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C l i e n t P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetClientPath returns the current client name. +% +% The format of the GetClientPath method is: +% +% const char *GetClientPath(void) +% +*/ +MagickExport const char *GetClientPath(void) +{ + return(SetClientPath((const char *) NULL)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t C l i e n t N a m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetClientName sets the client name and returns it. +% +% The format of the SetClientName method is: +% +% const char *SetClientName(const char *name) +% +% A description of each parameter follows: +% +% o name: Specifies the new client name. +% +*/ +MagickExport const char *SetClientName(const char *name) +{ + static char + client_name[256] = ""; + + if ((name != (char *) NULL) && (*name != '\0')) + { + (void) CopyMagickString(client_name,name,sizeof(client_name)); + (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),"%s",client_name); + } + return(*client_name == '\0' ? "Magick" : client_name); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t C l i e n t P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetClientPath() sets the client path if the name is specified. Otherwise +% the current client path is returned. A zero-length string is returned if +% the client path has never been set. +% +% The format of the SetClientPath method is: +% +% const char *SetClientPath(const char *path) +% +% A description of each parameter follows: +% +% o path: Specifies the new client path. +% +*/ +MagickExport const char *SetClientPath(const char *path) +{ + static char + client_path[MaxTextExtent] = ""; + + if ((path != (char *) NULL) && (*path != '\0')) + { + (void) CopyMagickString(client_path,path,MaxTextExtent); + (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),"%s",path); + } + return(client_path); +} diff --git a/ImageMagick-6.9.12-44/magick/client.h b/ImageMagick-6.9.12-44/magick/client.h new file mode 100644 index 0000000..28f4c26 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/client.h @@ -0,0 +1,35 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore client methods. +*/ +#ifndef MAGICKCORE_CLIENT_H +#define MAGICKCORE_CLIENT_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport const char + *GetClientPath(void) magick_attribute((__const__)), + *GetClientName(void) magick_attribute((__const__)), + *SetClientName(const char *), + *SetClientPath(const char *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/coder.c b/ImageMagick-6.9.12-44/magick/coder.c new file mode 100644 index 0000000..3bd92fa --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/coder.c @@ -0,0 +1,977 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC OOO DDDD EEEEE RRRR % +% C O O D D E R R % +% C O O D D EEE RRRR % +% C O O D D E R R % +% CCCC OOO DDDD EEEEE R R % +% % +% % +% MagickCore Image Coder Methods % +% % +% Software Design % +% Cristy % +% May 2001 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/client.h" +#include "magick/coder.h" +#include "magick/configure.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/hashmap.h" +#include "magick/log.h" +#include "magick/memory_.h" +#include "magick/option.h" +#include "magick/semaphore.h" +#include "magick/string_.h" +#include "magick/splay-tree.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/xml-tree.h" +#include "magick/xml-tree-private.h" + +/* + Define declarations. +*/ +#define MagickCoderFilename "coder.xml" + +/* + Typedef declarations. +*/ +typedef struct _CoderMapInfo +{ + const char + *magick, + *name; +} CoderMapInfo; + +/* + Static declarations. +*/ +static const CoderMapInfo + CoderMap[] = + { + { "3FR", "DNG" }, + { "3GP", "VIDEO" }, + { "3G2", "VIDEO" }, + { "8BIM", "META" }, + { "8BIMTEXT", "META" }, + { "8BIMWTEXT", "META" }, + { "AFM", "TTF" }, + { "A", "RAW" }, + { "AI", "PDF" }, + { "APNG", "VIDEO" }, + { "APP1JPEG", "META" }, + { "APP1", "META" }, + { "ARW", "DNG" }, + { "AVI", "VIDEO" }, + { "AVIF", "HEIC" }, + { "BIE", "JBIG" }, + { "BMP2", "BMP" }, + { "BMP3", "BMP" }, + { "B", "RAW" }, + { "BRF", "BRAILLE" }, + { "BGRA", "BGR" }, + { "BGRO", "BGR" }, + { "CMYKA", "CMYK" }, + { "C", "RAW" }, + { "CAL", "CALS" }, + { "CANVAS", "XC" }, + { "CMYKA", "CMYK" }, + { "CR2", "DNG" }, + { "CR3", "DNG" }, + { "CRW", "DNG" }, + { "CUR", "ICON" }, + { "DATA", "INLINE" }, + { "DCR", "DNG" }, + { "DCX", "PCX" }, + { "DFONT", "TTF" }, + { "DXT1", "DDS" }, + { "DXT5", "DDS" }, + { "EPDF", "PDF" }, + { "EPI", "PS" }, + { "EPS2", "PS2" }, + { "EPS3", "PS3" }, + { "EPSF", "PS" }, + { "EPSI", "PS" }, + { "EPS", "PS" }, + { "EPT2", "EPT" }, + { "EPT3", "EPT" }, + { "ERF", "DNG" }, + { "EXIF", "META" }, + { "FILE", "URL" }, + { "FRACTAL", "PLASMA" }, + { "FTP", "URL" }, + { "FTS", "FITS" }, + { "G3", "FAX" }, + { "G4", "FAX" }, + { "GIF87", "GIF" }, + { "G", "RAW" }, + { "GRANITE", "MAGICK" }, + { "GRAYA", "GRAY" }, + { "GROUP4", "TIFF" }, + { "GV", "DOT" }, + { "HTM", "HTML" }, + { "ICB", "TGA" }, + { "ICO", "ICON" }, + { "ICODIB", "DIB" }, + { "IIQ", "DNG" }, + { "K25", "DNG" }, + { "KDC", "DNG" }, + { "H", "MAGICK" }, + { "HTM", "HTML" }, + { "HTTP", "URL" }, + { "HTTPS", "URL" }, + { "ICB", "TGA" }, + { "ICC", "META" }, + { "ICM", "META" }, + { "ICO", "ICON" }, + { "IMPLICIT", "***" }, + { "IPTC", "META" }, + { "IPTCTEXT", "META" }, + { "IPTCWTEXT", "META" }, + { "ISOBRL", "BRAILLE" }, + { "ISOBRL6", "BRAILLE" }, + { "JBG", "JBIG" }, + { "JNG", "PNG" }, + { "JPC", "JP2" }, + { "JPT", "JP2" }, + { "JPM", "JP2" }, + { "J2C", "JP2" }, + { "J2K", "JP2" }, + { "JNG", "PNG" }, + { "JPE", "JPEG" }, + { "JPG", "JPEG" }, + { "JPM", "JP2" }, + { "JPS", "JPEG" }, + { "JPT", "JP2" }, + { "JPX", "JP2" }, + { "K", "RAW" }, + { "K25", "DNG" }, + { "KDC", "DNG" }, + { "LOGO", "MAGICK" }, + { "M", "RAW" }, + { "M2V", "VIDEO" }, + { "M4V", "VIDEO" }, + { "MEF", "DNG" }, + { "MKV", "VIDEO" }, + { "MNG", "PNG" }, + { "MOV", "VIDEO" }, + { "MP4", "VIDEO" }, + { "MPEG", "VIDEO" }, + { "MPG", "VIDEO" }, + { "MPRI", "MPR" }, + { "MEF", "DNG" }, + { "MRW", "DNG" }, + { "MSVG", "SVG" }, + { "NEF", "DNG" }, + { "NETSCAPE", "MAGICK" }, + { "NRW", "DNG" }, + { "O", "RAW" }, + { "ORF", "DNG" }, + { "OTF", "TTF" }, + { "P7", "PNM" }, + { "PAL", "UYVY" }, + { "PAM", "PNM" }, + { "PBM", "PNM" }, + { "PCDS", "PCD" }, + { "PCT", "PICT" }, + { "PDFA", "PDF" }, + { "PEF", "DNG" }, + { "PEF", "DNG" }, + { "PFA", "TTF" }, + { "PFB", "TTF" }, + { "PFM", "PNM" }, + { "PGM", "PNM" }, + { "PICON", "XPM" }, + { "PJPEG", "JPEG" }, + { "PM", "XPM" }, + { "PNG00", "PNG" }, + { "PNG24", "PNG" }, + { "PNG32", "PNG" }, + { "PNG48", "PNG" }, + { "PNG64", "PNG" }, + { "PNG8", "PNG" }, + { "PPM", "PNM" }, + { "PSB", "PSD" }, + { "PTIF", "TIFF" }, + { "R", "RAW" }, + { "RADIAL-GRADIENT", "GRADIENT" }, + { "RAF", "DNG" }, + { "RAS", "SUN" }, + { "RAW", "DNG" }, + { "RGBA", "RGB" }, + { "RGBO", "RGB" }, + { "RMF", "DNG" }, + { "ROSE", "MAGICK" }, + { "RW2", "DNG" }, + { "SHTML", "HTML" }, + { "SIX", "SIXEL" }, + { "SPARSE-COLOR", "TXT" }, + { "SR2", "DNG" }, + { "SRF", "DNG" }, + { "SVGZ", "SVG" }, + { "TEXT", "TXT" }, + { "TIFF64", "TIFF" }, + { "TIF", "TIFF" }, + { "TTC", "TTF" }, + { "UBRL", "BRAILLE" }, + { "UBRL6", "BRAILLE" }, + { "VDA", "TGA" }, + { "VST", "TGA" }, + { "WEBM", "VIDEO" }, + { "WIZARD", "MAGICK" }, +#if defined(MAGICKCORE_WINGDI32_DELEGATE) + { "WMF", "EMF" }, +#endif + { "WMV", "VIDEO" }, + { "WMZ", "WMF" }, + { "X3f", "DNG" }, + { "XMP", "META" }, + { "XV", "VIFF" }, + { "Y", "RAW" }, + { "YCbCrA", "YCbCr" } + }; + +static SemaphoreInfo + *coder_semaphore = (SemaphoreInfo *) NULL; + +static SplayTreeInfo + *coder_cache = (SplayTreeInfo *) NULL; + +/* + Forward declarations. +*/ +static MagickBooleanType + IsCoderTreeInstantiated(ExceptionInfo *); + +#if !MAGICKCORE_ZERO_CONFIGURATION_SUPPORT +static MagickBooleanType + LoadCoderCache(SplayTreeInfo *,const char *,const char *,const size_t, + ExceptionInfo *); +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A c q u i r e C o d e r C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireCoderCache() caches one or more coder configurations which +% provides a mapping between coder attributes and a coder name. +% +% The format of the AcquireCoderCache coder is: +% +% SplayTreeInfo *AcquireCoderCache(const char *filename, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o filename: the font file name. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static void *DestroyCoderNode(void *coder_info) +{ + CoderInfo + *p; + + p=(CoderInfo *) coder_info; + if (p->exempt == MagickFalse) + { + if (p->path != (char *) NULL) + p->path=DestroyString(p->path); + if (p->name != (char *) NULL) + p->name=DestroyString(p->name); + if (p->magick != (char *) NULL) + p->magick=DestroyString(p->magick); + } + return(RelinquishMagickMemory(p)); +} + +static SplayTreeInfo *AcquireCoderCache(const char *filename, + ExceptionInfo *exception) +{ + MagickStatusType + status; + + ssize_t + i; + + SplayTreeInfo + *cache; + + /* + Load external coder map. + */ + cache=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory, + DestroyCoderNode); + if (cache == (SplayTreeInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + status=MagickTrue; +#if !MAGICKCORE_ZERO_CONFIGURATION_SUPPORT + { + const StringInfo + *option; + + LinkedListInfo + *options; + + options=GetConfigureOptions(filename,exception); + option=(const StringInfo *) GetNextValueInLinkedList(options); + while (option != (const StringInfo *) NULL) + { + status&=LoadCoderCache(cache,(const char *) + GetStringInfoDatum(option),GetStringInfoPath(option),0,exception); + option=(const StringInfo *) GetNextValueInLinkedList(options); + } + options=DestroyConfigureOptions(options); + } +#endif + /* + Load built-in coder map. + */ + for (i=0; i < (ssize_t) (sizeof(CoderMap)/sizeof(*CoderMap)); i++) + { + CoderInfo + *coder_info; + + const CoderMapInfo + *p; + + p=CoderMap+i; + coder_info=(CoderInfo *) AcquireMagickMemory(sizeof(*coder_info)); + if (coder_info == (CoderInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",p->name); + continue; + } + (void) memset(coder_info,0,sizeof(*coder_info)); + coder_info->path=(char *) "[built-in]"; + coder_info->magick=(char *) p->magick; + coder_info->name=(char *) p->name; + coder_info->exempt=MagickTrue; + coder_info->signature=MagickCoreSignature; + status&=AddValueToSplayTree(cache,ConstantString(coder_info->magick), + coder_info); + if (status == MagickFalse) + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",coder_info->name); + } + return(cache); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C o d e r C o m p o n e n t G e n e s i s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CoderComponentGenesis() instantiates the coder component. +% +% The format of the CoderComponentGenesis method is: +% +% MagickBooleanType CoderComponentGenesis(void) +% +*/ +MagickExport MagickBooleanType CoderComponentGenesis(void) +{ + if (coder_semaphore == (SemaphoreInfo *) NULL) + coder_semaphore=AllocateSemaphoreInfo(); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C o d e r C o m p o n e n t T e r m i n u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CoderComponentTerminus() destroys the coder component. +% +% The format of the CoderComponentTerminus method is: +% +% CoderComponentTerminus(void) +% +*/ +MagickExport void CoderComponentTerminus(void) +{ + if (coder_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&coder_semaphore); + LockSemaphoreInfo(coder_semaphore); + if (coder_cache != (SplayTreeInfo *) NULL) + coder_cache=DestroySplayTree(coder_cache); + UnlockSemaphoreInfo(coder_semaphore); + DestroySemaphoreInfo(&coder_semaphore); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t C o d e r I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCoderInfo searches the coder list for the specified name and if found +% returns attributes for that coder. +% +% The format of the GetCoderInfo method is: +% +% const CoderInfo *GetCoderInfo(const char *name,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o name: the coder name. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport const CoderInfo *GetCoderInfo(const char *name, + ExceptionInfo *exception) +{ + assert(exception != (ExceptionInfo *) NULL); + if (IsCoderTreeInstantiated(exception) == MagickFalse) + return((const CoderInfo *) NULL); + if ((name == (const char *) NULL) || (LocaleCompare(name,"*") == 0)) + return((const CoderInfo *) GetRootValueFromSplayTree(coder_cache)); + return((const CoderInfo *) GetValueFromSplayTree(coder_cache,name)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C o d e r I n f o L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCoderInfoList() returns any coder_map that match the specified pattern. +% The format of the GetCoderInfoList function is: +% +% const CoderInfo **GetCoderInfoList(const char *pattern, +% size_t *number_coders,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_coders: This integer returns the number of coders in the list. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static int CoderInfoCompare(const void *x,const void *y) +{ + const CoderInfo + **p, + **q; + + p=(const CoderInfo **) x, + q=(const CoderInfo **) y; + if (LocaleCompare((*p)->path,(*q)->path) == 0) + return(LocaleCompare((*p)->name,(*q)->name)); + return(LocaleCompare((*p)->path,(*q)->path)); +} + +MagickExport const CoderInfo **GetCoderInfoList(const char *pattern, + size_t *number_coders,ExceptionInfo *exception) +{ + const CoderInfo + **coder_map; + + const CoderInfo + *p; + + ssize_t + i; + + /* + Allocate coder list. + */ + assert(pattern != (char *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern); + assert(number_coders != (size_t *) NULL); + *number_coders=0; + p=GetCoderInfo("*",exception); + if (p == (const CoderInfo *) NULL) + return((const CoderInfo **) NULL); + coder_map=(const CoderInfo **) AcquireQuantumMemory((size_t) + GetNumberOfNodesInSplayTree(coder_cache)+1UL,sizeof(*coder_map)); + if (coder_map == (const CoderInfo **) NULL) + return((const CoderInfo **) NULL); + /* + Generate coder list. + */ + LockSemaphoreInfo(coder_semaphore); + ResetSplayTreeIterator(coder_cache); + p=(const CoderInfo *) GetNextValueInSplayTree(coder_cache); + for (i=0; p != (const CoderInfo *) NULL; ) + { + if ((p->stealth == MagickFalse) && + (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse)) + coder_map[i++]=p; + p=(const CoderInfo *) GetNextValueInSplayTree(coder_cache); + } + UnlockSemaphoreInfo(coder_semaphore); + qsort((void *) coder_map,(size_t) i,sizeof(*coder_map),CoderInfoCompare); + coder_map[i]=(CoderInfo *) NULL; + *number_coders=(size_t) i; + return(coder_map); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t C o d e r L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCoderList() returns any coder_map that match the specified pattern. +% +% The format of the GetCoderList function is: +% +% char **GetCoderList(const char *pattern,size_t *number_coders, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_coders: This integer returns the number of coders in the list. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static int CoderCompare(const void *x,const void *y) +{ + const char + **p, + **q; + + p=(const char **) x; + q=(const char **) y; + return(LocaleCompare(*p,*q)); +} + +MagickExport char **GetCoderList(const char *pattern, + size_t *number_coders,ExceptionInfo *exception) +{ + char + **coder_map; + + const CoderInfo + *p; + + ssize_t + i; + + /* + Allocate coder list. + */ + assert(pattern != (char *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern); + assert(number_coders != (size_t *) NULL); + *number_coders=0; + p=GetCoderInfo("*",exception); + if (p == (const CoderInfo *) NULL) + return((char **) NULL); + coder_map=(char **) AcquireQuantumMemory((size_t) + GetNumberOfNodesInSplayTree(coder_cache)+1UL,sizeof(*coder_map)); + if (coder_map == (char **) NULL) + return((char **) NULL); + /* + Generate coder list. + */ + LockSemaphoreInfo(coder_semaphore); + ResetSplayTreeIterator(coder_cache); + p=(const CoderInfo *) GetNextValueInSplayTree(coder_cache); + for (i=0; p != (const CoderInfo *) NULL; ) + { + if ((p->stealth == MagickFalse) && + (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse)) + coder_map[i++]=ConstantString(p->name); + p=(const CoderInfo *) GetNextValueInSplayTree(coder_cache); + } + UnlockSemaphoreInfo(coder_semaphore); + qsort((void *) coder_map,(size_t) i,sizeof(*coder_map),CoderCompare); + coder_map[i]=(char *) NULL; + *number_coders=(size_t) i; + return(coder_map); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ I s C o d e r T r e e I n s t a n t i a t e d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsCoderTreeInstantiated() determines if the coder tree is instantiated. If +% not, it instantiates the tree and returns it. +% +% The format of the IsCoderInstantiated method is: +% +% MagickBooleanType IsCoderTreeInstantiated(ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType IsCoderTreeInstantiated(ExceptionInfo *exception) +{ + if (coder_cache == (SplayTreeInfo *) NULL) + { + if (coder_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&coder_semaphore); + LockSemaphoreInfo(coder_semaphore); + if (coder_cache == (SplayTreeInfo *) NULL) + coder_cache=AcquireCoderCache(MagickCoderFilename,exception); + UnlockSemaphoreInfo(coder_semaphore); + } + return(coder_cache != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L i s t C o d e r I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ListCoderInfo() lists the coder info to a file. +% +% The format of the ListCoderInfo coder is: +% +% MagickBooleanType ListCoderInfo(FILE *file,ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o file: An pointer to a FILE. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType ListCoderInfo(FILE *file, + ExceptionInfo *exception) +{ + const char + *path; + + const CoderInfo + **coder_info; + + ssize_t + i; + + size_t + number_coders; + + ssize_t + j; + + if (file == (const FILE *) NULL) + file=stdout; + coder_info=GetCoderInfoList("*",&number_coders,exception); + if (coder_info == (const CoderInfo **) NULL) + return(MagickFalse); + path=(const char *) NULL; + for (i=0; i < (ssize_t) number_coders; i++) + { + if (coder_info[i]->stealth != MagickFalse) + continue; + if ((path == (const char *) NULL) || + (LocaleCompare(path,coder_info[i]->path) != 0)) + { + if (coder_info[i]->path != (char *) NULL) + (void) FormatLocaleFile(file,"\nPath: %s\n\n",coder_info[i]->path); + (void) FormatLocaleFile(file,"Magick Coder\n"); + (void) FormatLocaleFile(file, + "-------------------------------------------------" + "------------------------------\n"); + } + path=coder_info[i]->path; + (void) FormatLocaleFile(file,"%s",coder_info[i]->magick); + for (j=(ssize_t) strlen(coder_info[i]->magick); j <= 11; j++) + (void) FormatLocaleFile(file," "); + if (coder_info[i]->name != (char *) NULL) + (void) FormatLocaleFile(file,"%s",coder_info[i]->name); + (void) FormatLocaleFile(file,"\n"); + } + coder_info=(const CoderInfo **) RelinquishMagickMemory((void *) coder_info); + (void) fflush(file); + return(MagickTrue); +} + +#if !MAGICKCORE_ZERO_CONFIGURATION_SUPPORT +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ L o a d C o d e r C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% LoadCoderCache() loads the coder configurations which provides a +% mapping between coder attributes and a coder name. +% +% The format of the LoadCoderCache coder is: +% +% MagickBooleanType LoadCoderCache(SplayTreeInfo *cache,const char *xml, +% const char *filename,const size_t depth,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o xml: The coder list in XML format. +% +% o filename: The coder list filename. +% +% o depth: depth of statements. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType LoadCoderCache(SplayTreeInfo *cache,const char *xml, + const char *filename,const size_t depth,ExceptionInfo *exception) +{ + char + keyword[MaxTextExtent], + *token; + + const char + *q; + + CoderInfo + *coder_info; + + MagickStatusType + status; + + size_t + extent; + + /* + Load the coder map file. + */ + (void) LogMagickEvent(ConfigureEvent,GetMagickModule(), + "Loading coder configuration file \"%s\" ...",filename); + if (xml == (const char *) NULL) + return(MagickFalse); + status=MagickTrue; + coder_info=(CoderInfo *) NULL; + token=AcquireString(xml); + extent=strlen(token)+MaxTextExtent; + for (q=(char *) xml; *q != '\0'; ) + { + /* + Interpret XML. + */ + (void) GetNextToken(q,&q,extent,token); + if (*token == '\0') + break; + (void) CopyMagickString(keyword,token,MaxTextExtent); + if (LocaleNCompare(keyword,"",2) != 0) && (*q != '\0')) + (void) GetNextToken(q,&q,extent,token); + continue; + } + if (LocaleNCompare(keyword," min, max coords */ + + MagickBooleanType + fix_bounds = MagickTrue; /* enlarge bounds for VP handling */ + + s.x=s.y=min.x=max.x=min.y=max.y=0.0; /* keep compiler happy */ + +/* defines to figure out the bounds of the distorted image */ +#define InitalBounds(p) \ +{ \ + /* printf("%lg,%lg -> %lg,%lg\n", s.x,s.y, d.x,d.y); */ \ + min.x = max.x = p.x; \ + min.y = max.y = p.y; \ +} +#define ExpandBounds(p) \ +{ \ + /* printf("%lg,%lg -> %lg,%lg\n", s.x,s.y, d.x,d.y); */ \ + min.x = MagickMin(min.x,p.x); \ + max.x = MagickMax(max.x,p.x); \ + min.y = MagickMin(min.y,p.y); \ + max.y = MagickMax(max.y,p.y); \ +} + + switch (method) + { + case AffineDistortion: + { double inverse[6]; + InvertAffineCoefficients(coeff, inverse); + s.x = (double) image->page.x; + s.y = (double) image->page.y; + d.x = inverse[0]*s.x+inverse[1]*s.y+inverse[2]; + d.y = inverse[3]*s.x+inverse[4]*s.y+inverse[5]; + InitalBounds(d); + s.x = (double) image->page.x+image->columns; + s.y = (double) image->page.y; + d.x = inverse[0]*s.x+inverse[1]*s.y+inverse[2]; + d.y = inverse[3]*s.x+inverse[4]*s.y+inverse[5]; + ExpandBounds(d); + s.x = (double) image->page.x; + s.y = (double) image->page.y+image->rows; + d.x = inverse[0]*s.x+inverse[1]*s.y+inverse[2]; + d.y = inverse[3]*s.x+inverse[4]*s.y+inverse[5]; + ExpandBounds(d); + s.x = (double) image->page.x+image->columns; + s.y = (double) image->page.y+image->rows; + d.x = inverse[0]*s.x+inverse[1]*s.y+inverse[2]; + d.y = inverse[3]*s.x+inverse[4]*s.y+inverse[5]; + ExpandBounds(d); + break; + } + case PerspectiveDistortion: + { double inverse[8], scale; + InvertPerspectiveCoefficients(coeff, inverse); + s.x = (double) image->page.x; + s.y = (double) image->page.y; + scale=inverse[6]*s.x+inverse[7]*s.y+1.0; + scale=PerceptibleReciprocal(scale); + d.x = scale*(inverse[0]*s.x+inverse[1]*s.y+inverse[2]); + d.y = scale*(inverse[3]*s.x+inverse[4]*s.y+inverse[5]); + InitalBounds(d); + s.x = (double) image->page.x+image->columns; + s.y = (double) image->page.y; + scale=inverse[6]*s.x+inverse[7]*s.y+1.0; + scale=PerceptibleReciprocal(scale); + d.x = scale*(inverse[0]*s.x+inverse[1]*s.y+inverse[2]); + d.y = scale*(inverse[3]*s.x+inverse[4]*s.y+inverse[5]); + ExpandBounds(d); + s.x = (double) image->page.x; + s.y = (double) image->page.y+image->rows; + scale=inverse[6]*s.x+inverse[7]*s.y+1.0; + scale=PerceptibleReciprocal(scale); + d.x = scale*(inverse[0]*s.x+inverse[1]*s.y+inverse[2]); + d.y = scale*(inverse[3]*s.x+inverse[4]*s.y+inverse[5]); + ExpandBounds(d); + s.x = (double) image->page.x+image->columns; + s.y = (double) image->page.y+image->rows; + scale=inverse[6]*s.x+inverse[7]*s.y+1.0; + scale=PerceptibleReciprocal(scale); + d.x = scale*(inverse[0]*s.x+inverse[1]*s.y+inverse[2]); + d.y = scale*(inverse[3]*s.x+inverse[4]*s.y+inverse[5]); + ExpandBounds(d); + break; + } + case ArcDistortion: + { double a, ca, sa; + /* Forward Map Corners */ + a = coeff[0]-coeff[1]/2; ca = cos(a); sa = sin(a); + d.x = coeff[2]*ca; + d.y = coeff[2]*sa; + InitalBounds(d); + d.x = (coeff[2]-coeff[3])*ca; + d.y = (coeff[2]-coeff[3])*sa; + ExpandBounds(d); + a = coeff[0]+coeff[1]/2; ca = cos(a); sa = sin(a); + d.x = coeff[2]*ca; + d.y = coeff[2]*sa; + ExpandBounds(d); + d.x = (coeff[2]-coeff[3])*ca; + d.y = (coeff[2]-coeff[3])*sa; + ExpandBounds(d); + /* Orthogonal points along top of arc */ + for( a=(double) (ceil((double) ((coeff[0]-coeff[1]/2.0)/MagickPI2))*MagickPI2); + a<(coeff[0]+coeff[1]/2.0); a+=MagickPI2 ) { + ca = cos(a); sa = sin(a); + d.x = coeff[2]*ca; + d.y = coeff[2]*sa; + ExpandBounds(d); + } + /* + Convert the angle_to_width and radius_to_height + to appropriate scaling factors, to allow faster processing + in the mapping function. + */ + coeff[1] = (double) (Magick2PI*image->columns/coeff[1]); + coeff[3] = (double)image->rows/coeff[3]; + break; + } + case PolarDistortion: + { + if (number_arguments < 2) + coeff[2] = coeff[3] = 0.0; + min.x = coeff[2]-coeff[0]; + max.x = coeff[2]+coeff[0]; + min.y = coeff[3]-coeff[0]; + max.y = coeff[3]+coeff[0]; + /* should be about 1.0 if Rmin = 0 */ + coeff[7]=(double) geometry.height/(coeff[0]-coeff[1]); + break; + } + case DePolarDistortion: + { + /* direct calculation as it needs to tile correctly + * for reversibility in a DePolar-Polar cycle */ + fix_bounds = MagickFalse; + geometry.x = geometry.y = 0; + geometry.height = (size_t) ceil(coeff[0]-coeff[1]); + geometry.width = (size_t) ceil((coeff[0]-coeff[1])* + (coeff[5]-coeff[4])*0.5); + /* correct scaling factors relative to new size */ + coeff[6]=(coeff[5]-coeff[4])*PerceptibleReciprocal(geometry.width); /* changed width */ + coeff[7]=(coeff[0]-coeff[1])*PerceptibleReciprocal(geometry.height); /* should be about 1.0 */ + break; + } + case Cylinder2PlaneDistortion: + { + /* direct calculation so center of distortion is either a pixel + * center, or pixel edge. This allows for reversibility of the + * distortion */ + geometry.x = geometry.y = 0; + geometry.width = (size_t) ceil( 2.0*coeff[1]*tan(coeff[0]/2.0) ); + geometry.height = (size_t) ceil( 2.0*coeff[3]/cos(coeff[0]/2.0) ); + /* correct center of distortion relative to new size */ + coeff[4] = (double) geometry.width/2.0; + coeff[5] = (double) geometry.height/2.0; + fix_bounds = MagickFalse; + break; + } + case Plane2CylinderDistortion: + { + /* direct calculation center is either pixel center, or pixel edge + * so as to allow reversibility of the image distortion */ + geometry.x = geometry.y = 0; + geometry.width = (size_t) ceil(coeff[0]*coeff[1]); /* FOV * radius */ + geometry.height = (size_t) (2*coeff[3]); /* input image height */ + /* correct center of distortion relative to new size */ + coeff[4] = (double) geometry.width/2.0; + coeff[5] = (double) geometry.height/2.0; + fix_bounds = MagickFalse; + break; + } + + case ShepardsDistortion: + case BilinearForwardDistortion: + case BilinearReverseDistortion: +#if 0 + case QuadrilateralDistortion: +#endif + case PolynomialDistortion: + case BarrelDistortion: + case BarrelInverseDistortion: + default: + /* no calculated bestfit available for these distortions */ + bestfit = MagickFalse; + fix_bounds = MagickFalse; + break; + } + + /* Set the output image geometry to calculated 'bestfit'. + Yes this tends to 'over do' the file image size, ON PURPOSE! + Do not do this for DePolar which needs to be exact for virtual tiling. + */ + if ( fix_bounds ) { + geometry.x = (ssize_t) floor(min.x-0.5); + geometry.y = (ssize_t) floor(min.y-0.5); + geometry.width=(size_t) ceil(max.x-geometry.x+0.5); + geometry.height=(size_t) ceil(max.y-geometry.y+0.5); + } + + } /* end bestfit destination image calculations */ + + /* The user provided a 'viewport' expert option which may + overrides some parts of the current output image geometry. + This also overrides its default 'bestfit' setting. + */ + { const char *artifact=GetImageArtifact(image,"distort:viewport"); + viewport_given = MagickFalse; + if ( artifact != (const char *) NULL ) { + MagickStatusType flags=ParseAbsoluteGeometry(artifact,&geometry); + if (flags==NoValue) + (void) ThrowMagickException(exception,GetMagickModule(), + OptionWarning,"InvalidGeometry","`%s' `%s'", + "distort:viewport",artifact); + else + viewport_given = MagickTrue; + } + } + + /* Verbose output */ + if ( GetImageArtifact(image,"verbose") != (const char *) NULL ) { + ssize_t + i; + char image_gen[MaxTextExtent]; + const char *lookup; + + /* Set destination image size and virtual offset */ + if ( bestfit || viewport_given ) { + (void) FormatLocaleString(image_gen, MaxTextExtent," -size %.20gx%.20g " + "-page %+.20g%+.20g xc: +insert \\\n",(double) geometry.width, + (double) geometry.height,(double) geometry.x,(double) geometry.y); + lookup="v.p{ xx-v.page.x-.5, yy-v.page.y-.5 }"; + } + else { + image_gen[0] = '\0'; /* no destination to generate */ + lookup = "p{ xx-page.x-.5, yy-page.y-.5 }"; /* simplify lookup */ + } + + switch (method) + { + case AffineDistortion: + { + double + *inverse; + + inverse=(double *) AcquireQuantumMemory(6,sizeof(*inverse)); + if (inverse == (double *) NULL) + { + coeff=(double *) RelinquishMagickMemory(coeff); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","%s","DistortImages"); + return((Image *) NULL); + } + InvertAffineCoefficients(coeff, inverse); + CoefficientsToAffineArgs(inverse); + (void) FormatLocaleFile(stderr, "Affine Projection:\n"); + (void) FormatLocaleFile(stderr, + " -distort AffineProjection \\\n '"); + for (i=0; i < 5; i++) + (void) FormatLocaleFile(stderr, "%lf,", inverse[i]); + (void) FormatLocaleFile(stderr, "%lf'\n", inverse[5]); + inverse=(double *) RelinquishMagickMemory(inverse); + (void) FormatLocaleFile(stderr, "Affine Distort, FX Equivelent:\n"); + (void) FormatLocaleFile(stderr, "%s", image_gen); + (void) FormatLocaleFile(stderr, + " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n"); + (void) FormatLocaleFile(stderr," xx=%+lf*ii %+lf*jj %+lf;\n", + coeff[0],coeff[1],coeff[2]); + (void) FormatLocaleFile(stderr," yy=%+lf*ii %+lf*jj %+lf;\n", + coeff[3],coeff[4],coeff[5]); + (void) FormatLocaleFile(stderr," %s' \\\n",lookup); + break; + } + case PerspectiveDistortion: + { + double + *inverse; + + inverse=(double *) AcquireQuantumMemory(8,sizeof(*inverse)); + if (inverse == (double *) NULL) + { + coeff=(double *) RelinquishMagickMemory(coeff); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","%s", + "DistortCoefficients"); + return((Image *) NULL); + } + InvertPerspectiveCoefficients(coeff, inverse); + (void) FormatLocaleFile(stderr,"Perspective Projection:\n"); + (void) FormatLocaleFile(stderr, + " -distort PerspectiveProjection \\\n '"); + for (i=0; i < 4; i++) + (void) FormatLocaleFile(stderr, "%.*g, ",GetMagickPrecision(), + inverse[i]); + (void) FormatLocaleFile(stderr, "\n "); + for ( ; i < 7; i++) + (void) FormatLocaleFile(stderr, "%.*g, ",GetMagickPrecision(), + inverse[i]); + (void) FormatLocaleFile(stderr, "%.*g'\n",GetMagickPrecision(), + inverse[7]); + inverse=(double *) RelinquishMagickMemory(inverse); + (void) FormatLocaleFile(stderr,"Perspective Distort, FX Equivelent:\n"); + (void) FormatLocaleFile(stderr,"%.1024s",image_gen); + (void) FormatLocaleFile(stderr, + " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n"); + (void) FormatLocaleFile(stderr," rr=%+.*g*ii %+.*g*jj + 1;\n", + GetMagickPrecision(),coeff[6],GetMagickPrecision(),coeff[7]); + (void) FormatLocaleFile(stderr, + " xx=(%+.*g*ii %+.*g*jj %+.*g)/rr;\n", + GetMagickPrecision(),coeff[0],GetMagickPrecision(),coeff[1], + GetMagickPrecision(),coeff[2]); + (void) FormatLocaleFile(stderr, + " yy=(%+.*g*ii %+.*g*jj %+.*g)/rr;\n", + GetMagickPrecision(),coeff[3],GetMagickPrecision(),coeff[4], + GetMagickPrecision(),coeff[5]); + (void) FormatLocaleFile(stderr," rr%s0 ? %s : blue' \\\n", + coeff[8] < 0.0 ? "<" : ">", lookup); + break; + } + case BilinearForwardDistortion: + { + (void) FormatLocaleFile(stderr,"BilinearForward Mapping Equations:\n"); + (void) FormatLocaleFile(stderr,"%s", image_gen); + (void) FormatLocaleFile(stderr," i = %+lf*x %+lf*y %+lf*x*y %+lf;\n", + coeff[0],coeff[1],coeff[2],coeff[3]); + (void) FormatLocaleFile(stderr," j = %+lf*x %+lf*y %+lf*x*y %+lf;\n", + coeff[4],coeff[5],coeff[6],coeff[7]); +#if 0 + /* for debugging */ + (void) FormatLocaleFile(stderr, " c8 = %+lf c9 = 2*a = %+lf;\n", + coeff[8], coeff[9]); +#endif + (void) FormatLocaleFile(stderr, + "BilinearForward Distort, FX Equivelent:\n"); + (void) FormatLocaleFile(stderr,"%s", image_gen); + (void) FormatLocaleFile(stderr, + " -fx 'ii=i+page.x%+lf; jj=j+page.y%+lf;\n",0.5-coeff[3],0.5- + coeff[7]); + (void) FormatLocaleFile(stderr," bb=%lf*ii %+lf*jj %+lf;\n", + coeff[6], -coeff[2], coeff[8]); + /* Handle Special degenerate (non-quadratic) or trapezoidal case */ + if (coeff[9] != 0) + { + (void) FormatLocaleFile(stderr, + " rt=bb*bb %+lf*(%lf*ii%+lf*jj);\n",-2*coeff[9],coeff[4], + -coeff[0]); + (void) FormatLocaleFile(stderr, + " yy=( -bb + sqrt(rt) ) / %lf;\n",coeff[9]); + } + else + (void) FormatLocaleFile(stderr," yy=(%lf*ii%+lf*jj)/bb;\n", + -coeff[4],coeff[0]); + (void) FormatLocaleFile(stderr, + " xx=(ii %+lf*yy)/(%lf %+lf*yy);\n",-coeff[1],coeff[0], + coeff[2]); + if ( coeff[9] != 0 ) + (void) FormatLocaleFile(stderr," (rt < 0 ) ? red : %s'\n", + lookup); + else + (void) FormatLocaleFile(stderr," %s' \\\n", lookup); + break; + } + case BilinearReverseDistortion: + { +#if 0 + (void) FormatLocaleFile(stderr, "Polynomial Projection Distort:\n"); + (void) FormatLocaleFile(stderr, " -distort PolynomialProjection \\\n"); + (void) FormatLocaleFile(stderr, " '1.5, %lf, %lf, %lf, %lf,\n", + coeff[3], coeff[0], coeff[1], coeff[2]); + (void) FormatLocaleFile(stderr, " %lf, %lf, %lf, %lf'\n", + coeff[7], coeff[4], coeff[5], coeff[6]); +#endif + (void) FormatLocaleFile(stderr, + "BilinearReverse Distort, FX Equivelent:\n"); + (void) FormatLocaleFile(stderr,"%s", image_gen); + (void) FormatLocaleFile(stderr, + " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n"); + (void) FormatLocaleFile(stderr, + " xx=%+lf*ii %+lf*jj %+lf*ii*jj %+lf;\n",coeff[0],coeff[1], + coeff[2], coeff[3]); + (void) FormatLocaleFile(stderr, + " yy=%+lf*ii %+lf*jj %+lf*ii*jj %+lf;\n",coeff[4],coeff[5], + coeff[6], coeff[7]); + (void) FormatLocaleFile(stderr," %s' \\\n", lookup); + break; + } + case PolynomialDistortion: + { + size_t nterms = (size_t) coeff[1]; + (void) FormatLocaleFile(stderr, + "Polynomial (order %lg, terms %lu), FX Equivelent\n",coeff[0], + (unsigned long) nterms); + (void) FormatLocaleFile(stderr,"%s", image_gen); + (void) FormatLocaleFile(stderr, + " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n"); + (void) FormatLocaleFile(stderr, " xx ="); + for (i=0; i < (ssize_t) nterms; i++) + { + if ((i != 0) && (i%4 == 0)) + (void) FormatLocaleFile(stderr, "\n "); + (void) FormatLocaleFile(stderr," %+lf%s",coeff[2+i], + poly_basis_str(i)); + } + (void) FormatLocaleFile(stderr,";\n yy ="); + for (i=0; i < (ssize_t) nterms; i++) + { + if ((i != 0) && (i%4 == 0)) + (void) FormatLocaleFile(stderr,"\n "); + (void) FormatLocaleFile(stderr," %+lf%s",coeff[2+i+nterms], + poly_basis_str(i)); + } + (void) FormatLocaleFile(stderr,";\n %s' \\\n", lookup); + break; + } + case ArcDistortion: + { + (void) FormatLocaleFile(stderr,"Arc Distort, Internal Coefficients:\n"); + for (i=0; i < 5; i++) + (void) FormatLocaleFile(stderr, + " c%.20g = %+lf\n",(double) i,coeff[i]); + (void) FormatLocaleFile(stderr,"Arc Distort, FX Equivelent:\n"); + (void) FormatLocaleFile(stderr,"%s", image_gen); + (void) FormatLocaleFile(stderr," -fx 'ii=i+page.x; jj=j+page.y;\n"); + (void) FormatLocaleFile(stderr," xx=(atan2(jj,ii)%+lf)/(2*pi);\n", + -coeff[0]); + (void) FormatLocaleFile(stderr," xx=xx-round(xx);\n"); + (void) FormatLocaleFile(stderr," xx=xx*%lf %+lf;\n",coeff[1], + coeff[4]); + (void) FormatLocaleFile(stderr, + " yy=(%lf - hypot(ii,jj)) * %lf;\n",coeff[2],coeff[3]); + (void) FormatLocaleFile(stderr," v.p{xx-.5,yy-.5}' \\\n"); + break; + } + case PolarDistortion: + { + (void) FormatLocaleFile(stderr,"Polar Distort, Internal Coefficents\n"); + for (i=0; i < 8; i++) + (void) FormatLocaleFile(stderr," c%.20g = %+lf\n",(double) i, + coeff[i]); + (void) FormatLocaleFile(stderr,"Polar Distort, FX Equivelent:\n"); + (void) FormatLocaleFile(stderr,"%s", image_gen); + (void) FormatLocaleFile(stderr, + " -fx 'ii=i+page.x%+lf; jj=j+page.y%+lf;\n",-coeff[2],-coeff[3]); + (void) FormatLocaleFile(stderr," xx=(atan2(ii,jj)%+lf)/(2*pi);\n", + -(coeff[4]+coeff[5])/2 ); + (void) FormatLocaleFile(stderr," xx=xx-round(xx);\n"); + (void) FormatLocaleFile(stderr," xx=xx*2*pi*%lf + v.w/2;\n", + coeff[6] ); + (void) FormatLocaleFile(stderr," yy=(hypot(ii,jj)%+lf)*%lf;\n", + -coeff[1],coeff[7] ); + (void) FormatLocaleFile(stderr," v.p{xx-.5,yy-.5}' \\\n"); + break; + } + case DePolarDistortion: + { + (void) FormatLocaleFile(stderr, + "DePolar Distort, Internal Coefficents\n"); + for (i=0; i < 8; i++) + (void) FormatLocaleFile(stderr," c%.20g = %+lf\n",(double) i, + coeff[i]); + (void) FormatLocaleFile(stderr,"DePolar Distort, FX Equivelent:\n"); + (void) FormatLocaleFile(stderr,"%s", image_gen); + (void) FormatLocaleFile(stderr," -fx 'aa=(i+.5)*%lf %+lf;\n", + coeff[6],+coeff[4]); + (void) FormatLocaleFile(stderr," rr=(j+.5)*%lf %+lf;\n", + coeff[7],+coeff[1]); + (void) FormatLocaleFile(stderr," xx=rr*sin(aa) %+lf;\n", + coeff[2]); + (void) FormatLocaleFile(stderr," yy=rr*cos(aa) %+lf;\n", + coeff[3]); + (void) FormatLocaleFile(stderr," v.p{xx-.5,yy-.5}' \\\n"); + break; + } + case Cylinder2PlaneDistortion: + { + (void) FormatLocaleFile(stderr, + "Cylinder to Plane Distort, Internal Coefficents\n"); + (void) FormatLocaleFile(stderr," cylinder_radius = %+lf\n",coeff[1]); + (void) FormatLocaleFile(stderr, + "Cylinder to Plane Distort, FX Equivelent:\n"); + (void) FormatLocaleFile(stderr, "%s", image_gen); + (void) FormatLocaleFile(stderr, + " -fx 'ii=i+page.x%+lf+0.5; jj=j+page.y%+lf+0.5;\n",-coeff[4], + -coeff[5]); + (void) FormatLocaleFile(stderr," aa=atan(ii/%+lf);\n",coeff[1]); + (void) FormatLocaleFile(stderr," xx=%lf*aa%+lf;\n", + coeff[1],coeff[2]); + (void) FormatLocaleFile(stderr," yy=jj*cos(aa)%+lf;\n",coeff[3]); + (void) FormatLocaleFile(stderr," %s' \\\n", lookup); + break; + } + case Plane2CylinderDistortion: + { + (void) FormatLocaleFile(stderr, + "Plane to Cylinder Distort, Internal Coefficents\n"); + (void) FormatLocaleFile(stderr," cylinder_radius = %+lf\n",coeff[1]); + (void) FormatLocaleFile(stderr, + "Plane to Cylinder Distort, FX Equivelent:\n"); + (void) FormatLocaleFile(stderr,"%s", image_gen); + (void) FormatLocaleFile(stderr, + " -fx 'ii=i+page.x%+lf+0.5; jj=j+page.y%+lf+0.5;\n",-coeff[4], + -coeff[5]); + (void) FormatLocaleFile(stderr," ii=ii/%+lf;\n",coeff[1]); + (void) FormatLocaleFile(stderr," xx=%lf*tan(ii)%+lf;\n",coeff[1], + coeff[2] ); + (void) FormatLocaleFile(stderr," yy=jj/cos(ii)%+lf;\n",coeff[3]); + (void) FormatLocaleFile(stderr," %s' \\\n", lookup); + break; + } + case BarrelDistortion: + case BarrelInverseDistortion: + { + double + xc, + yc; + + /* + NOTE: This does the barrel roll in pixel coords not image coords + The internal distortion must do it in image coordinates, so that is + what the center coeff (8,9) is given in. + */ + xc=((double)image->columns-1.0)/2.0+image->page.x; + yc=((double)image->rows-1.0)/2.0+image->page.y; + (void) FormatLocaleFile(stderr, "Barrel%s Distort, FX Equivelent:\n", + method == BarrelDistortion ? "" : "Inv"); + (void) FormatLocaleFile(stderr, "%s", image_gen); + if ( fabs(coeff[8]-xc-0.5) < 0.1 && fabs(coeff[9]-yc-0.5) < 0.1 ) + (void) FormatLocaleFile(stderr," -fx 'xc=(w-1)/2; yc=(h-1)/2;\n"); + else + (void) FormatLocaleFile(stderr," -fx 'xc=%lf; yc=%lf;\n",coeff[8]- + 0.5,coeff[9]-0.5); + (void) FormatLocaleFile(stderr, + " ii=i-xc; jj=j-yc; rr=hypot(ii,jj);\n"); + (void) FormatLocaleFile(stderr, + " ii=ii%s(%lf*rr*rr*rr %+lf*rr*rr %+lf*rr %+lf);\n", + method == BarrelDistortion ? "*" : "/",coeff[0],coeff[1],coeff[2], + coeff[3]); + (void) FormatLocaleFile(stderr, + " jj=jj%s(%lf*rr*rr*rr %+lf*rr*rr %+lf*rr %+lf);\n", + method == BarrelDistortion ? "*" : "/",coeff[4],coeff[5],coeff[6], + coeff[7]); + (void) FormatLocaleFile(stderr," v.p{fx*ii+xc,fy*jj+yc}' \\\n"); + } + default: + break; + } + } + /* + The user provided a 'scale' expert option will scale the output image size, + by the factor given allowing for super-sampling of the distorted image + space. Any scaling factors must naturally be halved as a result. + */ + { const char *artifact; + artifact=GetImageArtifact(image,"distort:scale"); + output_scaling = 1.0; + if (artifact != (const char *) NULL) { + output_scaling = fabs(StringToDouble(artifact,(char **) NULL)); + geometry.width=(size_t) (output_scaling*geometry.width+0.5); + geometry.height=(size_t) (output_scaling*geometry.height+0.5); + geometry.x=(ssize_t) (output_scaling*geometry.x+0.5); + geometry.y=(ssize_t) (output_scaling*geometry.y+0.5); + if ( output_scaling < 0.1 ) { + coeff = (double *) RelinquishMagickMemory(coeff); + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"InvalidArgument","%s","-define distort:scale" ); + return((Image *) NULL); + } + output_scaling = 1/output_scaling; + } + } +#define ScaleFilter(F,A,B,C,D) \ + ScaleResampleFilter( (F), \ + output_scaling*(A), output_scaling*(B), \ + output_scaling*(C), output_scaling*(D) ) + + /* + Initialize the distort image attributes. + */ + distort_image=CloneImage(image,geometry.width,geometry.height,MagickTrue, + exception); + if (distort_image == (Image *) NULL) + { + coeff=(double *) RelinquishMagickMemory(coeff); + return((Image *) NULL); + } + /* if image is ColorMapped - change it to DirectClass */ + if (SetImageStorageClass(distort_image,DirectClass) == MagickFalse) + { + coeff=(double *) RelinquishMagickMemory(coeff); + InheritException(exception,&distort_image->exception); + distort_image=DestroyImage(distort_image); + return((Image *) NULL); + } + if ((IsPixelGray(&distort_image->background_color) == MagickFalse) && + (IsGrayColorspace(distort_image->colorspace) != MagickFalse)) + (void) SetImageColorspace(distort_image,sRGBColorspace); + if (distort_image->background_color.opacity != OpaqueOpacity) + distort_image->matte=MagickTrue; + distort_image->page.x=geometry.x; + distort_image->page.y=geometry.y; + + { /* ----- MAIN CODE ----- + Sample the source image to each pixel in the distort image. + */ + CacheView + *distort_view; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + zero; + + ResampleFilter + **magick_restrict resample_filter; + + ssize_t + j; + + status=MagickTrue; + progress=0; + GetMagickPixelPacket(distort_image,&zero); + resample_filter=AcquireResampleFilterTLS(image,UndefinedVirtualPixelMethod, + MagickFalse,exception); + distort_view=AcquireAuthenticCacheView(distort_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,distort_image,distort_image->rows,1) +#endif + for (j=0; j < (ssize_t) distort_image->rows; j++) + { + const int + id = GetOpenMPThreadId(); + + double + validity; /* how mathematically valid is this the mapping */ + + MagickBooleanType + sync; + + MagickPixelPacket + pixel, /* pixel color to assign to distorted image */ + invalid; /* the color to assign when distort result is invalid */ + + PointInfo + d, + s; /* transform destination image x,y to source image x,y */ + + IndexPacket + *magick_restrict indexes; + + ssize_t + i; + + PixelPacket + *magick_restrict q; + + q=QueueCacheViewAuthenticPixels(distort_view,0,j,distort_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(distort_view); + pixel=zero; + + /* Define constant scaling vectors for Affine Distortions + Other methods are either variable, or use interpolated lookup + */ + switch (method) + { + case AffineDistortion: + ScaleFilter( resample_filter[id], + coeff[0], coeff[1], + coeff[3], coeff[4] ); + break; + default: + break; + } + + /* Initialize default pixel validity + * negative: pixel is invalid output 'matte_color' + * 0.0 to 1.0: antialiased, mix with resample output + * 1.0 or greater: use resampled output. + */ + validity = 1.0; + + GetMagickPixelPacket(distort_image,&invalid); + SetMagickPixelPacket(distort_image,&distort_image->matte_color, + (IndexPacket *) NULL, &invalid); + if (distort_image->colorspace == CMYKColorspace) + ConvertRGBToCMYK(&invalid); /* what about other color spaces? */ + + for (i=0; i < (ssize_t) distort_image->columns; i++) + { + /* map pixel coordinate to distortion space coordinate */ + d.x = (double) (geometry.x+i+0.5)*output_scaling; + d.y = (double) (geometry.y+j+0.5)*output_scaling; + s = d; /* default is a no-op mapping */ + switch (method) + { + case AffineDistortion: + { + s.x=coeff[0]*d.x+coeff[1]*d.y+coeff[2]; + s.y=coeff[3]*d.x+coeff[4]*d.y+coeff[5]; + /* Affine partial derivitives are constant -- set above */ + break; + } + case PerspectiveDistortion: + { + double + p,q,r,abs_r,abs_c6,abs_c7,scale; + /* perspective is a ratio of affines */ + p=coeff[0]*d.x+coeff[1]*d.y+coeff[2]; + q=coeff[3]*d.x+coeff[4]*d.y+coeff[5]; + r=coeff[6]*d.x+coeff[7]*d.y+1.0; + /* Pixel Validity -- is it a 'sky' or 'ground' pixel */ + validity = (r*coeff[8] < 0.0) ? 0.0 : 1.0; + /* Determine horizon anti-alias blending */ + abs_r = fabs(r)*2; + abs_c6 = fabs(coeff[6]); + abs_c7 = fabs(coeff[7]); + if ( abs_c6 > abs_c7 ) { + if ( abs_r < abs_c6*output_scaling ) + validity = 0.5 - coeff[8]*r/(coeff[6]*output_scaling); + } + else if ( abs_r < abs_c7*output_scaling ) + validity = 0.5 - coeff[8]*r/(coeff[7]*output_scaling); + /* Perspective Sampling Point (if valid) */ + if ( validity > 0.0 ) { + /* divide by r affine, for perspective scaling */ + scale = 1.0/r; + s.x = p*scale; + s.y = q*scale; + /* Perspective Partial Derivatives or Scaling Vectors */ + scale *= scale; + ScaleFilter( resample_filter[id], + (r*coeff[0] - p*coeff[6])*scale, + (r*coeff[1] - p*coeff[7])*scale, + (r*coeff[3] - q*coeff[6])*scale, + (r*coeff[4] - q*coeff[7])*scale ); + } + break; + } + case BilinearReverseDistortion: + { + /* Reversed Mapped is just a simple polynomial */ + s.x=coeff[0]*d.x+coeff[1]*d.y+coeff[2]*d.x*d.y+coeff[3]; + s.y=coeff[4]*d.x+coeff[5]*d.y + +coeff[6]*d.x*d.y+coeff[7]; + /* Bilinear partial derivitives of scaling vectors */ + ScaleFilter( resample_filter[id], + coeff[0] + coeff[2]*d.y, + coeff[1] + coeff[2]*d.x, + coeff[4] + coeff[6]*d.y, + coeff[5] + coeff[6]*d.x ); + break; + } + case BilinearForwardDistortion: + { + /* Forward mapped needs reversed polynomial equations + * which unfortunatally requires a square root! */ + double b,c; + d.x -= coeff[3]; d.y -= coeff[7]; + b = coeff[6]*d.x - coeff[2]*d.y + coeff[8]; + c = coeff[4]*d.x - coeff[0]*d.y; + + validity = 1.0; + /* Handle Special degenerate (non-quadratic) case + * Currently without horizon anti-alising */ + if ( fabs(coeff[9]) < MagickEpsilon ) + s.y = -c/b; + else { + c = b*b - 2*coeff[9]*c; + if ( c < 0.0 ) + validity = 0.0; + else + s.y = ( -b + sqrt(c) )/coeff[9]; + } + if ( validity > 0.0 ) + s.x = ( d.x - coeff[1]*s.y) / ( coeff[0] + coeff[2]*s.y ); + + /* NOTE: the sign of the square root should be -ve for parts + where the source image becomes 'flipped' or 'mirrored'. + FUTURE: Horizon handling + FUTURE: Scaling factors or Deritives (how?) + */ + break; + } +#if 0 + case BilinearDistortion: + /* Bilinear mapping of any Quadrilateral to any Quadrilateral */ + /* UNDER DEVELOPMENT */ + break; +#endif + case PolynomialDistortion: + { + /* multi-ordered polynomial */ + ssize_t + k; + + ssize_t + nterms=(ssize_t)coeff[1]; + + PointInfo + du,dv; /* the du,dv vectors from unit dx,dy -- derivatives */ + + s.x=s.y=du.x=du.y=dv.x=dv.y=0.0; + for(k=0; k < nterms; k++) { + s.x += poly_basis_fn(k,d.x,d.y)*coeff[2+k]; + du.x += poly_basis_dx(k,d.x,d.y)*coeff[2+k]; + du.y += poly_basis_dy(k,d.x,d.y)*coeff[2+k]; + s.y += poly_basis_fn(k,d.x,d.y)*coeff[2+k+nterms]; + dv.x += poly_basis_dx(k,d.x,d.y)*coeff[2+k+nterms]; + dv.y += poly_basis_dy(k,d.x,d.y)*coeff[2+k+nterms]; + } + ScaleFilter( resample_filter[id], du.x,du.y,dv.x,dv.y ); + break; + } + case ArcDistortion: + { + /* what is the angle and radius in the destination image */ + s.x = (double) ((atan2(d.y,d.x) - coeff[0])/Magick2PI); + s.x -= MagickRound(s.x); /* angle */ + s.y = hypot(d.x,d.y); /* radius */ + + /* Arc Distortion Partial Scaling Vectors + Are derived by mapping the perpendicular unit vectors + dR and dA*R*2PI rather than trying to map dx and dy + The results is a very simple orthogonal aligned ellipse. + */ + if ( s.y > MagickEpsilon ) + ScaleFilter( resample_filter[id], + (double) (coeff[1]/(Magick2PI*s.y)), 0, 0, coeff[3] ); + else + ScaleFilter( resample_filter[id], + distort_image->columns*2, 0, 0, coeff[3] ); + + /* now scale the angle and radius for source image lookup point */ + s.x = s.x*coeff[1] + coeff[4] + image->page.x +0.5; + s.y = (coeff[2] - s.y) * coeff[3] + image->page.y; + break; + } + case PolarDistortion: + { /* 2D Cartesain to Polar View */ + d.x -= coeff[2]; + d.y -= coeff[3]; + s.x = atan2(d.x,d.y) - (coeff[4]+coeff[5])/2; + s.x /= Magick2PI; + s.x -= MagickRound(s.x); + s.x *= Magick2PI; /* angle - relative to centerline */ + s.y = hypot(d.x,d.y); /* radius */ + + /* Polar Scaling vectors are based on mapping dR and dA vectors + This results in very simple orthogonal scaling vectors + */ + if ( s.y > MagickEpsilon ) + ScaleFilter( resample_filter[id], + (double) (coeff[6]/(Magick2PI*s.y)), 0, 0, coeff[7] ); + else + ScaleFilter( resample_filter[id], + distort_image->columns*2, 0, 0, coeff[7] ); + + /* now finish mapping radius/angle to source x,y coords */ + s.x = s.x*coeff[6] + (double)image->columns/2.0 + image->page.x; + s.y = (s.y-coeff[1])*coeff[7] + image->page.y; + break; + } + case DePolarDistortion: + { /* @D Polar to Carteasain */ + /* ignore all destination virtual offsets */ + d.x = ((double)i+0.5)*output_scaling*coeff[6]+coeff[4]; + d.y = ((double)j+0.5)*output_scaling*coeff[7]+coeff[1]; + s.x = d.y*sin(d.x) + coeff[2]; + s.y = d.y*cos(d.x) + coeff[3]; + /* derivatives are usless - better to use SuperSampling */ + break; + } + case Cylinder2PlaneDistortion: + { /* 3D Cylinder to Tangential Plane */ + double ax, cx; + /* relative to center of distortion */ + d.x -= coeff[4]; d.y -= coeff[5]; + d.x /= coeff[1]; /* x' = x/r */ + ax=atan(d.x); /* aa = atan(x/r) = u/r */ + cx=cos(ax); /* cx = cos(atan(x/r)) = 1/sqrt(x^2+u^2) */ + s.x = coeff[1]*ax; /* u = r*atan(x/r) */ + s.y = d.y*cx; /* v = y*cos(u/r) */ + /* derivatives... (see personnal notes) */ + ScaleFilter( resample_filter[id], + 1.0/(1.0+d.x*d.x), 0.0, -d.x*s.y*cx*cx/coeff[1], s.y/d.y ); +#if 0 +if ( i == 0 && j == 0 ) { + fprintf(stderr, "x=%lf y=%lf u=%lf v=%lf\n", d.x*coeff[1], d.y, s.x, s.y); + fprintf(stderr, "phi = %lf\n", (double)(ax * 180.0/MagickPI) ); + fprintf(stderr, "du/dx=%lf du/dx=%lf dv/dx=%lf dv/dy=%lf\n", + 1.0/(1.0+d.x*d.x), 0.0, -d.x*s.y*cx*cx/coeff[1], s.y/d.y ); + fflush(stderr); } +#endif + /* add center of distortion in source */ + s.x += coeff[2]; s.y += coeff[3]; + break; + } + case Plane2CylinderDistortion: + { /* 3D Cylinder to Tangential Plane */ + /* relative to center of distortion */ + d.x -= coeff[4]; d.y -= coeff[5]; + + /* is pixel valid - horizon of a infinite Virtual-Pixel Plane + * (see Anthony Thyssen's personal note) */ + validity = (double) ((coeff[1]*MagickPI2 - fabs(d.x))/output_scaling + 0.5); + + if ( validity > 0.0 ) { + double cx,tx; + d.x /= coeff[1]; /* x'= x/r */ + cx = 1/cos(d.x); /* cx = 1/cos(x/r) */ + tx = tan(d.x); /* tx = tan(x/r) */ + s.x = coeff[1]*tx; /* u = r * tan(x/r) */ + s.y = d.y*cx; /* v = y / cos(x/r) */ + /* derivatives... (see Anthony Thyssen's personal notes) */ + ScaleFilter( resample_filter[id], + cx*cx, 0.0, s.y*cx/coeff[1], cx ); +#if 1 +/*if ( i == 0 && j == 0 ) {*/ +if ( d.x == 0.5 && d.y == 0.5 ) { + fprintf(stderr, "x=%lf y=%lf u=%lf v=%lf\n", d.x*coeff[1], d.y, s.x, s.y); + fprintf(stderr, "radius = %lf phi = %lf validity = %lf\n", + coeff[1], (double)(d.x * 180.0/MagickPI), validity ); + fprintf(stderr, "du/dx=%lf du/dx=%lf dv/dx=%lf dv/dy=%lf\n", + cx*cx, 0.0, s.y*cx/coeff[1], cx); + fflush(stderr); } +#endif + } + /* add center of distortion in source */ + s.x += coeff[2]; s.y += coeff[3]; + break; + } + case BarrelDistortion: + case BarrelInverseDistortion: + { /* Lens Barrel Distionion Correction */ + double r,fx,fy,gx,gy; + /* Radial Polynomial Distortion (de-normalized) */ + d.x -= coeff[8]; + d.y -= coeff[9]; + r = sqrt(d.x*d.x+d.y*d.y); + if ( r > MagickEpsilon ) { + fx = ((coeff[0]*r + coeff[1])*r + coeff[2])*r + coeff[3]; + fy = ((coeff[4]*r + coeff[5])*r + coeff[6])*r + coeff[7]; + gx = ((3*coeff[0]*r + 2*coeff[1])*r + coeff[2])/r; + gy = ((3*coeff[4]*r + 2*coeff[5])*r + coeff[6])/r; + /* adjust functions and scaling for 'inverse' form */ + if ( method == BarrelInverseDistortion ) { + fx = 1/fx; fy = 1/fy; + gx *= -fx*fx; gy *= -fy*fy; + } + /* Set the source pixel to lookup and EWA derivative vectors */ + s.x = d.x*fx + coeff[8]; + s.y = d.y*fy + coeff[9]; + ScaleFilter( resample_filter[id], + gx*d.x*d.x + fx, gx*d.x*d.y, + gy*d.x*d.y, gy*d.y*d.y + fy ); + } + else { + /* Special handling to avoid divide by zero when r==0 + ** + ** The source and destination pixels match in this case + ** which was set at the top of the loop using s = d; + ** otherwise... s.x=coeff[8]; s.y=coeff[9]; + */ + if ( method == BarrelDistortion ) + ScaleFilter( resample_filter[id], + coeff[3], 0, 0, coeff[7] ); + else /* method == BarrelInverseDistortion */ + /* FUTURE, trap for D==0 causing division by zero */ + ScaleFilter( resample_filter[id], + 1.0/coeff[3], 0, 0, 1.0/coeff[7] ); + } + break; + } + case ShepardsDistortion: + { /* Shepards Method, or Inverse Weighted Distance for + displacement around the destination image control points + The input arguments are the coefficents to the function. + This is more of a 'displacement' function rather than an + absolute distortion function. + + Note: We can not determine derivatives using shepards method + so only a point sample interpolatation can be used. + */ + size_t + i; + double + denominator; + + denominator = s.x = s.y = 0; + for(i=0; ipage.x; + s.y -= image->page.y; + } + s.x -= 0.5; + s.y -= 0.5; + + if ( validity <= 0.0 ) { + /* result of distortion is an invalid pixel - don't resample */ + SetPixelPacket(distort_image,&invalid,q,indexes); + } + else { + /* resample the source image to find its correct color */ + (void) ResamplePixelColor(resample_filter[id],s.x,s.y,&pixel); + /* if validity between 0.0 and 1.0 mix result with invalid pixel */ + if ( validity < 1.0 ) { + /* Do a blend of sample color and invalid pixel */ + /* should this be a 'Blend', or an 'Over' compose */ + MagickPixelCompositeBlend(&pixel,validity,&invalid,(1.0-validity), + &pixel); + } + SetPixelPacket(distort_image,&pixel,q,indexes); + } + q++; + indexes++; + } + sync=SyncCacheViewAuthenticPixels(distort_view,exception); + if (sync == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,DistortImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + distort_view=DestroyCacheView(distort_view); + resample_filter=DestroyResampleFilterTLS(resample_filter); + + if (status == MagickFalse) + distort_image=DestroyImage(distort_image); + } + + /* Arc does not return an offset unless 'bestfit' is in effect + And the user has not provided an overriding 'viewport'. + */ + if ( method == ArcDistortion && !bestfit && !viewport_given ) { + distort_image->page.x = 0; + distort_image->page.y = 0; + } + coeff=(double *) RelinquishMagickMemory(coeff); + return(distort_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R o t a t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RotateImage() creates a new image that is a rotated copy of an existing +% one. Positive angles rotate counter-clockwise (right-hand rule), while +% negative angles rotate clockwise. Rotated images are usually larger than +% the originals and have 'empty' triangular corners. X axis. Empty +% triangles left over from shearing the image are filled with the background +% color defined by member 'background_color' of the image. RotateImage +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the RotateImage method is: +% +% Image *RotateImage(const Image *image,const double degrees, +% ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o degrees: Specifies the number of degrees to rotate the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *RotateImage(const Image *image,const double degrees, + ExceptionInfo *exception) +{ + Image + *distort_image, + *rotate_image; + + MagickRealType + angle; + + PointInfo + shear; + + size_t + rotations; + + /* + Adjust rotation angle. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + angle=fmod(degrees,360.0); + while (angle < -45.0) + angle+=360.0; + for (rotations=0; angle > 45.0; rotations++) + angle-=90.0; + rotations%=4; + shear.x=(-tan((double) DegreesToRadians(angle)/2.0)); + shear.y=sin((double) DegreesToRadians(angle)); + if ((fabs(shear.x) < MagickEpsilon) && (fabs(shear.y) < MagickEpsilon)) + return(IntegralRotateImage(image,rotations,exception)); + distort_image=CloneImage(image,0,0,MagickTrue,exception); + if (distort_image == (Image *) NULL) + return((Image *) NULL); + (void) SetImageVirtualPixelMethod(distort_image,BackgroundVirtualPixelMethod); + rotate_image=DistortImage(distort_image,ScaleRotateTranslateDistortion,1, + °rees,MagickTrue,exception); + distort_image=DestroyImage(distort_image); + return(rotate_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S p a r s e C o l o r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SparseColorImage(), given a set of coordinates, interpolates the colors +% found at those coordinates, across the whole image, using various methods. +% +% The format of the SparseColorImage() method is: +% +% Image *SparseColorImage(const Image *image,const ChannelType channel, +% const SparseColorMethod method,const size_t number_arguments, +% const double *arguments,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image to be filled in. +% +% o channel: Specify which color values (in RGBKA sequence) are being set. +% This also determines the number of color_values in above. +% +% o method: the method to fill in the gradient between the control points. +% +% The methods used for SparseColor() are often simular to methods +% used for DistortImage(), and even share the same code for determination +% of the function coefficents, though with more dimensions (or resulting +% values). +% +% o number_arguments: the number of arguments given. +% +% o arguments: array of floating point arguments for this method-- +% x,y,color_values-- with color_values given as normalized values. +% +% o exception: return any errors or warnings in this structure +% +*/ +MagickExport Image *SparseColorImage(const Image *image, + const ChannelType channel,const SparseColorMethod method, + const size_t number_arguments,const double *arguments, + ExceptionInfo *exception) +{ +#define SparseColorTag "Distort/SparseColor" + + SparseColorMethod + sparse_method; + + double + *coeff; + + Image + *sparse_image; + + size_t + number_colors; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + + /* Determine number of color values needed per control point */ + number_colors=0; + if ( channel & RedChannel ) number_colors++; + if ( channel & GreenChannel ) number_colors++; + if ( channel & BlueChannel ) number_colors++; + if ( channel & IndexChannel ) number_colors++; + if ( channel & OpacityChannel ) number_colors++; + + /* + Convert input arguments into mapping coefficients, this this case + we are mapping (distorting) colors, rather than coordinates. + */ + { DistortImageMethod + distort_method; + + distort_method=(DistortImageMethod) method; + if ( distort_method >= SentinelDistortion ) + distort_method = ShepardsDistortion; /* Pretend to be Shepards */ + coeff = GenerateCoefficients(image, &distort_method, number_arguments, + arguments, number_colors, exception); + if ( coeff == (double *) NULL ) + return((Image *) NULL); + /* + Note some Distort Methods may fall back to other simpler methods, + Currently the only fallback of concern is Bilinear to Affine + (Barycentric), which is alaso sparse_colr method. This also ensures + correct two and one color Barycentric handling. + */ + sparse_method = (SparseColorMethod) distort_method; + if ( distort_method == ShepardsDistortion ) + sparse_method = method; /* return non-distort methods to normal */ + if ( sparse_method == InverseColorInterpolate ) + coeff[0]=0.5; /* sqrt() the squared distance for inverse */ + } + + /* Verbose output */ + if ( GetImageArtifact(image,"verbose") != (const char *) NULL ) { + + switch (sparse_method) { + case BarycentricColorInterpolate: + { + ssize_t x=0; + (void) FormatLocaleFile(stderr, "Barycentric Sparse Color:\n"); + if ( channel & RedChannel ) + (void) FormatLocaleFile(stderr, " -channel R -fx '%+lf*i %+lf*j %+lf' \\\n", + coeff[x], coeff[x+1], coeff[x+2]),x+=3; + if ( channel & GreenChannel ) + (void) FormatLocaleFile(stderr, " -channel G -fx '%+lf*i %+lf*j %+lf' \\\n", + coeff[x], coeff[x+1], coeff[x+2]),x+=3; + if ( channel & BlueChannel ) + (void) FormatLocaleFile(stderr, " -channel B -fx '%+lf*i %+lf*j %+lf' \\\n", + coeff[x], coeff[x+1], coeff[x+2]),x+=3; + if ( channel & IndexChannel ) + (void) FormatLocaleFile(stderr, " -channel K -fx '%+lf*i %+lf*j %+lf' \\\n", + coeff[x], coeff[x+1], coeff[x+2]),x+=3; + if ( channel & OpacityChannel ) + (void) FormatLocaleFile(stderr, " -channel A -fx '%+lf*i %+lf*j %+lf' \\\n", + coeff[x], coeff[x+1], coeff[x+2]),x+=3; + break; + } + case BilinearColorInterpolate: + { + ssize_t x=0; + (void) FormatLocaleFile(stderr, "Bilinear Sparse Color\n"); + if ( channel & RedChannel ) + (void) FormatLocaleFile(stderr, " -channel R -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n", + coeff[ x ], coeff[x+1], + coeff[x+2], coeff[x+3]),x+=4; + if ( channel & GreenChannel ) + (void) FormatLocaleFile(stderr, " -channel G -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n", + coeff[ x ], coeff[x+1], + coeff[x+2], coeff[x+3]),x+=4; + if ( channel & BlueChannel ) + (void) FormatLocaleFile(stderr, " -channel B -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n", + coeff[ x ], coeff[x+1], + coeff[x+2], coeff[x+3]),x+=4; + if ( channel & IndexChannel ) + (void) FormatLocaleFile(stderr, " -channel K -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n", + coeff[ x ], coeff[x+1], + coeff[x+2], coeff[x+3]),x+=4; + if ( channel & OpacityChannel ) + (void) FormatLocaleFile(stderr, " -channel A -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n", + coeff[ x ], coeff[x+1], + coeff[x+2], coeff[x+3]),x+=4; + break; + } + default: + /* sparse color method is too complex for FX emulation */ + break; + } + } + + /* Generate new image for generated interpolated gradient. + * ASIDE: Actually we could have just replaced the colors of the original + * image, but IM Core policy, is if storage class could change then clone + * the image. + */ + + sparse_image=CloneImage(image,0,0,MagickTrue,exception); + if (sparse_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(sparse_image,DirectClass) == MagickFalse) + { /* if image is ColorMapped - change it to DirectClass */ + InheritException(exception,&image->exception); + sparse_image=DestroyImage(sparse_image); + return((Image *) NULL); + } + { /* ----- MAIN CODE ----- */ + CacheView + *sparse_view; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + j; + + status=MagickTrue; + progress=0; + sparse_view=AcquireAuthenticCacheView(sparse_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,sparse_image,sparse_image->rows,1) +#endif + for (j=0; j < (ssize_t) sparse_image->rows; j++) + { + MagickBooleanType + sync; + + MagickPixelPacket + pixel; /* pixel to assign to distorted image */ + + IndexPacket + *magick_restrict indexes; + + ssize_t + i; + + PixelPacket + *magick_restrict q; + + q=GetCacheViewAuthenticPixels(sparse_view,0,j,sparse_image->columns, + 1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(sparse_view); + GetMagickPixelPacket(sparse_image,&pixel); + for (i=0; i < (ssize_t) image->columns; i++) + { + SetMagickPixelPacket(image,q,indexes,&pixel); + switch (sparse_method) + { + case BarycentricColorInterpolate: + { + ssize_t x=0; + if ( channel & RedChannel ) + pixel.red = coeff[x]*i +coeff[x+1]*j + +coeff[x+2], x+=3; + if ( channel & GreenChannel ) + pixel.green = coeff[x]*i +coeff[x+1]*j + +coeff[x+2], x+=3; + if ( channel & BlueChannel ) + pixel.blue = coeff[x]*i +coeff[x+1]*j + +coeff[x+2], x+=3; + if ( channel & IndexChannel ) + pixel.index = coeff[x]*i +coeff[x+1]*j + +coeff[x+2], x+=3; + if ( channel & OpacityChannel ) + pixel.opacity = coeff[x]*i +coeff[x+1]*j + +coeff[x+2], x+=3; + break; + } + case BilinearColorInterpolate: + { + ssize_t x=0; + if ( channel & RedChannel ) + pixel.red = coeff[x]*i + coeff[x+1]*j + + coeff[x+2]*i*j + coeff[x+3], x+=4; + if ( channel & GreenChannel ) + pixel.green = coeff[x]*i + coeff[x+1]*j + + coeff[x+2]*i*j + coeff[x+3], x+=4; + if ( channel & BlueChannel ) + pixel.blue = coeff[x]*i + coeff[x+1]*j + + coeff[x+2]*i*j + coeff[x+3], x+=4; + if ( channel & IndexChannel ) + pixel.index = coeff[x]*i + coeff[x+1]*j + + coeff[x+2]*i*j + coeff[x+3], x+=4; + if ( channel & OpacityChannel ) + pixel.opacity = coeff[x]*i + coeff[x+1]*j + + coeff[x+2]*i*j + coeff[x+3], x+=4; + break; + } + case InverseColorInterpolate: + case ShepardsColorInterpolate: + { /* Inverse (Squared) Distance weights average (IDW) */ + size_t + k; + double + denominator; + + if ( channel & RedChannel ) pixel.red = 0.0; + if ( channel & GreenChannel ) pixel.green = 0.0; + if ( channel & BlueChannel ) pixel.blue = 0.0; + if ( channel & IndexChannel ) pixel.index = 0.0; + if ( channel & OpacityChannel ) pixel.opacity = 0.0; + denominator = 0.0; + for(k=0; kprogress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,SparseColorTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + sparse_view=DestroyCacheView(sparse_view); + if (status == MagickFalse) + sparse_image=DestroyImage(sparse_image); + } + coeff = (double *) RelinquishMagickMemory(coeff); + return(sparse_image); +} diff --git a/ImageMagick-6.9.12-44/magick/distort.h b/ImageMagick-6.9.12-44/magick/distort.h new file mode 100644 index 0000000..abd2870 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/distort.h @@ -0,0 +1,86 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image distortion methods. +*/ +#ifndef MAGICKCORE_DISTORT_H +#define MAGICKCORE_DISTORT_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +/* + These two enum are linked, with common enumerated values. Both + DistortImages() and SparseColor() often share code to determine functional + coefficients for common methods. + + Caution should be taken to ensure that only the common methods contain the + same enumerated value, while all others remain unique across both + enumerations. +*/ +typedef enum +{ + UndefinedDistortion, + AffineDistortion, + AffineProjectionDistortion, + ScaleRotateTranslateDistortion, + PerspectiveDistortion, + PerspectiveProjectionDistortion, + BilinearForwardDistortion, + BilinearDistortion = BilinearForwardDistortion, + BilinearReverseDistortion, + PolynomialDistortion, + ArcDistortion, + PolarDistortion, + DePolarDistortion, + Cylinder2PlaneDistortion, + Plane2CylinderDistortion, + BarrelDistortion, + BarrelInverseDistortion, + ShepardsDistortion, + ResizeDistortion, + SentinelDistortion +} DistortImageMethod; + +typedef enum +{ + UndefinedColorInterpolate = UndefinedDistortion, + BarycentricColorInterpolate = AffineDistortion, + BilinearColorInterpolate = BilinearReverseDistortion, + PolynomialColorInterpolate = PolynomialDistortion, + ShepardsColorInterpolate = ShepardsDistortion, + /* + Methods unique to SparseColor(). + */ + VoronoiColorInterpolate = SentinelDistortion, + InverseColorInterpolate, + ManhattanColorInterpolate +} SparseColorMethod; + +extern MagickExport Image + *AffineTransformImage(const Image *,const AffineMatrix *,ExceptionInfo *), + *DistortImage(const Image *,const DistortImageMethod,const size_t, + const double *,MagickBooleanType,ExceptionInfo *exception), + *DistortResizeImage(const Image *,const size_t,const size_t,ExceptionInfo *), + *RotateImage(const Image *,const double,ExceptionInfo *), + *SparseColorImage(const Image *,const ChannelType,const SparseColorMethod, + const size_t,const double *,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/distribute-cache-private.h b/ImageMagick-6.9.12-44/magick/distribute-cache-private.h new file mode 100644 index 0000000..b9a318f --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/distribute-cache-private.h @@ -0,0 +1,78 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore distributed cache private methods. +*/ +#ifndef MAGICKCORE_DISTRIBUTE_CACHE_PRIVATE_H +#define MAGICKCORE_DISTRIBUTE_CACHE_PRIVATE_H + +#include "magick/geometry.h" +#include "magick/exception.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct _DistributeCacheInfo +{ + int + file; + + size_t + session_key; + + char + hostname[MaxTextExtent]; + + int + port; + + size_t + signature; + + MagickBooleanType + debug; +} DistributeCacheInfo; + +extern MagickPrivate const char + *GetDistributeCacheHostname(const DistributeCacheInfo *); + +extern MagickPrivate DistributeCacheInfo + *AcquireDistributeCacheInfo(ExceptionInfo *), + *DestroyDistributeCacheInfo(DistributeCacheInfo *); + +extern MagickPrivate int + GetDistributeCacheFile(const DistributeCacheInfo *), + GetDistributeCachePort(const DistributeCacheInfo *); + +extern MagickPrivate MagickBooleanType + OpenDistributePixelCache(DistributeCacheInfo *,Image *), + RelinquishDistributePixelCache(DistributeCacheInfo *); + +extern MagickPrivate MagickOffsetType + ReadDistributePixelCacheIndexes(DistributeCacheInfo *, + const RectangleInfo *,const MagickSizeType,unsigned char *), + ReadDistributePixelCachePixels(DistributeCacheInfo *,const RectangleInfo *, + const MagickSizeType,unsigned char *magick_restrict), + WriteDistributePixelCacheIndexes(DistributeCacheInfo *, + const RectangleInfo *,const MagickSizeType,const unsigned char *), + WriteDistributePixelCachePixels(DistributeCacheInfo *,const RectangleInfo *, + const MagickSizeType,const unsigned char *magick_restrict); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/distribute-cache.c b/ImageMagick-6.9.12-44/magick/distribute-cache.c new file mode 100755 index 0000000..a5fb3c8 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/distribute-cache.c @@ -0,0 +1,1496 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% DDDD IIIII SSSSS TTTTT RRRR IIIII BBBB U U TTTTT EEEEE % +% D D I SS T R R I B B U U T E % +% D D I SSS T RRRR I BBBB U U T EEE % +% D D I SS T R R I B B U U T E % +% DDDDA IIIII SSSSS T R R IIIII BBBB UUU T EEEEE % +% % +% CCCC AAA CCCC H H EEEEE % +% C A A C H H E % +% C AAAAA C HHHHH EEE % +% C A A C H H E % +% CCCC A A CCCC H H EEEEE % +% % +% % +% MagickCore Distributed Pixel Cache Methods % +% % +% Software Design % +% Cristy % +% January 2013 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% A distributed pixel cache is an extension of the traditional pixel cache +% available on a single host. The distributed pixel cache may span multiple +% servers so that it can grow in size and transactional capacity to support +% very large images. Start up the pixel cache server on one or more machines. +% When you read or operate on an image and the local pixel cache resources are +% exhausted, ImageMagick contacts one or more of these remote pixel servers to +% store or retrieve pixels. +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/cache.h" +#include "magick/cache-private.h" +#include "magick/distribute-cache.h" +#include "magick/distribute-cache-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/locale_.h" +#include "magick/memory_.h" +#include "magick/nt-base-private.h" +#include "magick/policy.h" +#include "magick/random_.h" +#include "magick/registry.h" +#include "magick/splay-tree.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/version.h" +#include "magick/version-private.h" +#undef MAGICKCORE_HAVE_DISTRIBUTE_CACHE +#if defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT) +#include +#include +#include +#include +#define CHAR_TYPE_CAST +#define CLOSE_SOCKET(socket) (void) close(socket) +#define HANDLER_RETURN_TYPE void * +#define HANDLER_RETURN_VALUE (void *) NULL +#define SOCKET_TYPE int +#define LENGTH_TYPE size_t +#define MAGICKCORE_HAVE_DISTRIBUTE_CACHE +#elif defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__MINGW32__) +#define CHAR_TYPE_CAST (char *) +#define CLOSE_SOCKET(socket) (void) closesocket(socket) +#define HANDLER_RETURN_TYPE DWORD WINAPI +#define HANDLER_RETURN_VALUE 0 +#define SOCKET_TYPE SOCKET +#define LENGTH_TYPE int +#define MAGICKCORE_HAVE_DISTRIBUTE_CACHE +#else +#ifdef __VMS +#define CLOSE_SOCKET(socket) (void) close(socket) +#else +#define CLOSE_SOCKET(socket) +#endif +#define HANDLER_RETURN_TYPE void * +#define HANDLER_RETURN_VALUE (void *) NULL +#define SOCKET_TYPE int +#define LENGTH_TYPE size_t +#undef send +#undef recv +#define send(file,buffer,length,flags) 0 +#define recv(file,buffer,length,flags) 0 +#endif + +/* + Define declarations. +*/ +#define DPCHostname "127.0.0.1" +#define DPCPendingConnections 10 +#define DPCPort 6668 +#define DPCSessionKeyLength 8 +#ifndef MSG_NOSIGNAL +# define MSG_NOSIGNAL 0 +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A c q u i r e D i s t r i b u t e C a c h e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireDistributeCacheInfo() allocates the DistributeCacheInfo structure. +% +% The format of the AcquireDistributeCacheInfo method is: +% +% DistributeCacheInfo *AcquireDistributeCacheInfo(ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline MagickOffsetType dpc_read(int file,const MagickSizeType length, + unsigned char *magick_restrict message) +{ + MagickOffsetType + i; + + ssize_t + count; + +#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE) + magick_unreferenced(file); + magick_unreferenced(message); +#endif + count=0; + for (i=0; i < (MagickOffsetType) length; i+=count) + { + count=recv(file,CHAR_TYPE_CAST message+i,(LENGTH_TYPE) MagickMin(length-i, + (MagickSizeType) MAGICK_SSIZE_MAX),0); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + return(i); +} + +static int ConnectPixelCacheServer(const char *hostname,const int port, + size_t *session_key,ExceptionInfo *exception) +{ +#if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE) + char + service[MaxTextExtent], + *shared_secret; + + int + status; + + SOCKET_TYPE + client_socket; + + ssize_t + count; + + struct addrinfo + hint, + *result; + + unsigned char + secret[MaxTextExtent]; + + /* + Connect to distributed pixel cache and get session key. + */ + *session_key=0; + shared_secret=GetPolicyValue("cache:shared-secret"); + if (shared_secret == (char *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "DistributedPixelCache","'%s'","shared secret expected"); + return(-1); + } + shared_secret=DestroyString(shared_secret); +#if defined(MAGICKCORE_WINDOWS_SUPPORT) + NTInitializeWinsock(MagickTrue); +#endif + (void) memset(&hint,0,sizeof(hint)); + hint.ai_family=AF_INET; + hint.ai_socktype=SOCK_STREAM; + hint.ai_flags=AI_PASSIVE; + (void) FormatLocaleString(service,MaxTextExtent,"%d",port); + status=getaddrinfo(hostname,service,&hint,&result); + if (status != 0) + { + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "DistributedPixelCache","'%s'",hostname); + return(-1); + } + client_socket=socket(result->ai_family,result->ai_socktype, + result->ai_protocol); + if (client_socket == -1) + { + freeaddrinfo(result); + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "DistributedPixelCache","'%s'",hostname); + return(-1); + } + status=connect(client_socket,result->ai_addr,(socklen_t) result->ai_addrlen); + if (status == -1) + { + CLOSE_SOCKET(client_socket); + freeaddrinfo(result); + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "DistributedPixelCache","'%s'",hostname); + return(-1); + } + count=recv(client_socket,CHAR_TYPE_CAST secret,MaxTextExtent,0); + if (count != -1) + { + StringInfo + *nonce; + + nonce=AcquireStringInfo(count); + (void) memcpy(GetStringInfoDatum(nonce),secret,(size_t) count); + *session_key=GetMagickCoreSignature(nonce); + nonce=DestroyStringInfo(nonce); + } + if (*session_key == 0) + { + CLOSE_SOCKET(client_socket); + client_socket=(SOCKET_TYPE) (-1); + } + freeaddrinfo(result); + return(client_socket); +#else + magick_unreferenced(hostname); + magick_unreferenced(port); + magick_unreferenced(session_key); + magick_unreferenced(exception); + (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError, + "DelegateLibrarySupportNotBuiltIn","distributed pixel cache"); + return(MagickFalse); +#endif +} + +static char *GetHostname(int *port,ExceptionInfo *exception) +{ + char + *host, + *hosts, + **hostlist; + + int + argc; + + ssize_t + i; + + static size_t + id = 0; + + /* + Parse host list (e.g. 192.168.100.1:6668,192.168.100.2:6668). + */ + hosts=(char *) GetImageRegistry(StringRegistryType,"cache:hosts",exception); + if (hosts == (char *) NULL) + { + *port=DPCPort; + return(AcquireString(DPCHostname)); + } + (void) SubstituteString(&hosts,","," "); + hostlist=StringToArgv(hosts,&argc); + hosts=DestroyString(hosts); + if (hostlist == (char **) NULL) + { + *port=DPCPort; + return(AcquireString(DPCHostname)); + } + hosts=AcquireString(hostlist[(id++ % (argc-1))+1]); + for (i=0; i < (ssize_t) argc; i++) + hostlist[i]=DestroyString(hostlist[i]); + hostlist=(char **) RelinquishMagickMemory(hostlist); + (void) SubstituteString(&hosts,":"," "); + hostlist=StringToArgv(hosts,&argc); + if (hostlist == (char **) NULL) + { + *port=DPCPort; + return(AcquireString(DPCHostname)); + } + host=AcquireString(hostlist[1]); + if (hostlist[2] == (char *) NULL) + *port=DPCPort; + else + *port=StringToLong(hostlist[2]); + for (i=0; i < (ssize_t) argc; i++) + hostlist[i]=DestroyString(hostlist[i]); + hostlist=(char **) RelinquishMagickMemory(hostlist); + return(host); +} + +MagickPrivate DistributeCacheInfo *AcquireDistributeCacheInfo( + ExceptionInfo *exception) +{ + char + *hostname; + + DistributeCacheInfo + *server_info; + + size_t + session_key; + + /* + Connect to the distributed pixel cache server. + */ + server_info=(DistributeCacheInfo *) AcquireMagickMemory(sizeof(*server_info)); + if (server_info == (DistributeCacheInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(server_info,0,sizeof(*server_info)); + server_info->signature=MagickCoreSignature; + server_info->port=0; + hostname=GetHostname(&server_info->port,exception); + session_key=0; + server_info->file=ConnectPixelCacheServer(hostname,server_info->port, + &session_key,exception); + if (server_info->file == -1) + server_info=DestroyDistributeCacheInfo(server_info); + else + { + server_info->session_key=session_key; + (void) CopyMagickString(server_info->hostname,hostname,MaxTextExtent); + server_info->debug=IsEventLogging(); + } + hostname=DestroyString(hostname); + return(server_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e s t r o y D i s t r i b u t e C a c h e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyDistributeCacheInfo() deallocates memory associated with an +% DistributeCacheInfo structure. +% +% The format of the DestroyDistributeCacheInfo method is: +% +% DistributeCacheInfo *DestroyDistributeCacheInfo( +% DistributeCacheInfo *server_info) +% +% A description of each parameter follows: +% +% o server_info: the distributed cache info. +% +*/ +MagickPrivate DistributeCacheInfo *DestroyDistributeCacheInfo( + DistributeCacheInfo *server_info) +{ + assert(server_info != (DistributeCacheInfo *) NULL); + assert(server_info->signature == MagickCoreSignature); + if (server_info->file > 0) + CLOSE_SOCKET(server_info->file); + server_info->signature=(~MagickCoreSignature); + server_info=(DistributeCacheInfo *) RelinquishMagickMemory(server_info); + return(server_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D i s t r i b u t e P i x e l C a c h e S e r v e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DistributePixelCacheServer() waits on the specified port for commands to +% create, read, update, or destroy a pixel cache. +% +% The format of the DistributePixelCacheServer() method is: +% +% void DistributePixelCacheServer(const int port) +% +% A description of each parameter follows: +% +% o port: connect the distributed pixel cache at this port. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType DestroyDistributeCache(SplayTreeInfo *registry, + const size_t session_key) +{ + /* + Destroy distributed pixel cache. + */ + return(DeleteNodeFromSplayTree(registry,(const void *) session_key)); +} + +static inline MagickOffsetType dpc_send(int file,const MagickSizeType length, + const unsigned char *magick_restrict message) +{ + MagickOffsetType + count; + + MagickOffsetType + i; + +#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE) + magick_unreferenced(file); + magick_unreferenced(message); +#endif + + /* + Ensure a complete message is sent. + */ + count=0; + for (i=0; i < (MagickOffsetType) length; i+=count) + { + count=(MagickOffsetType) send(file,CHAR_TYPE_CAST message+i,(LENGTH_TYPE) + MagickMin(length-i,(MagickSizeType) MAGICK_SSIZE_MAX),MSG_NOSIGNAL); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + return(i); +} + +static MagickBooleanType OpenDistributeCache(SplayTreeInfo *registry,int file, + const size_t session_key,ExceptionInfo *exception) +{ + Image + *image; + + MagickBooleanType + status; + + MagickOffsetType + count; + + MagickSizeType + length; + + unsigned char + message[MaxTextExtent], + *p; + + /* + Open distributed pixel cache. + */ + image=AcquireImage((ImageInfo *) NULL); + if (image == (Image *) NULL) + return(MagickFalse); + length=sizeof(image->storage_class)+sizeof(image->colorspace)+ + sizeof(image->channels)+sizeof(image->columns)+sizeof(image->rows); + count=dpc_read(file,length,message); + if (count != (MagickOffsetType) length) + return(MagickFalse); + /* + Deserialize the image attributes. + */ + p=message; + (void) memcpy(&image->storage_class,p,sizeof(image->storage_class)); + p+=sizeof(image->storage_class); + (void) memcpy(&image->colorspace,p,sizeof(image->colorspace)); + p+=sizeof(image->colorspace); + (void) memcpy(&image->channels,p,sizeof(image->channels)); + p+=sizeof(image->channels); + (void) memcpy(&image->columns,p,sizeof(image->columns)); + p+=sizeof(image->columns); + (void) memcpy(&image->rows,p,sizeof(image->rows)); + p+=sizeof(image->rows); + if (SyncImagePixelCache(image,exception) == MagickFalse) + return(MagickFalse); + status=AddValueToSplayTree(registry,(const void *) session_key,image); + return(status); +} + +static MagickBooleanType ReadDistributeCacheIndexes(SplayTreeInfo *registry, + int file,const size_t session_key,ExceptionInfo *exception) +{ + const IndexPacket + *indexes; + + const PixelPacket + *p; + + Image + *image; + + MagickOffsetType + count; + + MagickSizeType + length; + + RectangleInfo + region; + + unsigned char + message[MaxTextExtent], + *q; + + /* + Read distributed pixel cache indexes. + */ + image=(Image *) GetValueFromSplayTree(registry,(const void *) session_key); + if (image == (Image *) NULL) + return(MagickFalse); + length=sizeof(region.width)+sizeof(region.height)+sizeof(region.x)+ + sizeof(region.y)+sizeof(length); + count=dpc_read(file,length,message); + if (count != (MagickOffsetType) length) + return(MagickFalse); + q=message; + (void) memcpy(®ion.width,q,sizeof(region.width)); + q+=sizeof(region.width); + (void) memcpy(®ion.height,q,sizeof(region.height)); + q+=sizeof(region.height); + (void) memcpy(®ion.x,q,sizeof(region.x)); + q+=sizeof(region.x); + (void) memcpy(®ion.y,q,sizeof(region.y)); + q+=sizeof(region.y); + (void) memcpy(&length,q,sizeof(length)); + q+=sizeof(length); + p=GetVirtualPixels(image,region.x,region.y,region.width,region.height, + exception); + if (p == (const PixelPacket *) NULL) + return(MagickFalse); + indexes=GetVirtualIndexQueue(image); + count=dpc_send(file,length,(unsigned char *) indexes); + if (count != (MagickOffsetType) length) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ReadDistributeCachePixels(SplayTreeInfo *registry, + int file,const size_t session_key,ExceptionInfo *exception) +{ + const PixelPacket + *p; + + Image + *image; + + MagickOffsetType + count; + + MagickSizeType + length; + + RectangleInfo + region; + + unsigned char + message[MaxTextExtent], + *q; + + /* + Read distributed pixel cache pixels. + */ + image=(Image *) GetValueFromSplayTree(registry,(const void *) session_key); + if (image == (Image *) NULL) + return(MagickFalse); + length=sizeof(region.width)+sizeof(region.height)+sizeof(region.x)+ + sizeof(region.y)+sizeof(length); + count=dpc_read(file,length,message); + if (count != (MagickOffsetType) length) + return(MagickFalse); + q=message; + (void) memcpy(®ion.width,q,sizeof(region.width)); + q+=sizeof(region.width); + (void) memcpy(®ion.height,q,sizeof(region.height)); + q+=sizeof(region.height); + (void) memcpy(®ion.x,q,sizeof(region.x)); + q+=sizeof(region.x); + (void) memcpy(®ion.y,q,sizeof(region.y)); + q+=sizeof(region.y); + (void) memcpy(&length,q,sizeof(length)); + q+=sizeof(length); + p=GetVirtualPixels(image,region.x,region.y,region.width,region.height, + exception); + if (p == (const PixelPacket *) NULL) + return(MagickFalse); + count=dpc_send(file,length,(unsigned char *) p); + if (count != (MagickOffsetType) length) + return(MagickFalse); + return(MagickTrue); +} + +static void *RelinquishImageRegistry(void *image) +{ + return((void *) DestroyImageList((Image *) image)); +} + +static MagickBooleanType WriteDistributeCacheIndexes(SplayTreeInfo *registry, + int file,const size_t session_key,ExceptionInfo *exception) +{ + Image + *image; + + IndexPacket + *indexes; + + MagickOffsetType + count; + + MagickSizeType + length; + + RectangleInfo + region; + PixelPacket + *q; + + unsigned char + message[MaxTextExtent], + *p; + + /* + Write distributed pixel cache indexes. + */ + image=(Image *) GetValueFromSplayTree(registry,(const void *) session_key); + if (image == (Image *) NULL) + return(MagickFalse); + length=sizeof(region.width)+sizeof(region.height)+sizeof(region.x)+ + sizeof(region.y)+sizeof(length); + count=dpc_read(file,length,message); + if (count != (MagickOffsetType) length) + return(MagickFalse); + p=message; + (void) memcpy(®ion.width,p,sizeof(region.width)); + p+=sizeof(region.width); + (void) memcpy(®ion.height,p,sizeof(region.height)); + p+=sizeof(region.height); + (void) memcpy(®ion.x,p,sizeof(region.x)); + p+=sizeof(region.x); + (void) memcpy(®ion.y,p,sizeof(region.y)); + p+=sizeof(region.y); + (void) memcpy(&length,p,sizeof(length)); + p+=sizeof(length); + q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height, + exception); + if (q == (PixelPacket *) NULL) + return(MagickFalse); + indexes=GetAuthenticIndexQueue(image); + count=dpc_read(file,length,(unsigned char *) indexes); + if (count != (MagickOffsetType) length) + return(MagickFalse); + return(SyncAuthenticPixels(image,exception)); +} + +static MagickBooleanType WriteDistributeCachePixels(SplayTreeInfo *registry, + int file,const size_t session_key,ExceptionInfo *exception) +{ + Image + *image; + + MagickOffsetType + count; + + MagickSizeType + length; + + PixelPacket + *q; + + RectangleInfo + region; + + unsigned char + message[MaxTextExtent], + *p; + + /* + Write distributed pixel cache pixels. + */ + image=(Image *) GetValueFromSplayTree(registry,(const void *) session_key); + if (image == (Image *) NULL) + return(MagickFalse); + length=sizeof(region.width)+sizeof(region.height)+sizeof(region.x)+ + sizeof(region.y)+sizeof(length); + count=dpc_read(file,length,message); + if (count != (MagickOffsetType) length) + return(MagickFalse); + p=message; + (void) memcpy(®ion.width,p,sizeof(region.width)); + p+=sizeof(region.width); + (void) memcpy(®ion.height,p,sizeof(region.height)); + p+=sizeof(region.height); + (void) memcpy(®ion.x,p,sizeof(region.x)); + p+=sizeof(region.x); + (void) memcpy(®ion.y,p,sizeof(region.y)); + p+=sizeof(region.y); + (void) memcpy(&length,p,sizeof(length)); + p+=sizeof(length); + q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height, + exception); + if (q == (PixelPacket *) NULL) + return(MagickFalse); + count=dpc_read(file,length,(unsigned char *) q); + if (count != (MagickOffsetType) length) + return(MagickFalse); + return(SyncAuthenticPixels(image,exception)); +} + +static HANDLER_RETURN_TYPE DistributePixelCacheClient(void *socket) +{ + char + *shared_secret; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + count; + + RandomInfo + *random_info; + + unsigned char + *p; + + size_t + key, + session_key; + + SOCKET_TYPE + client_socket; + + SplayTreeInfo + *registry; + + StringInfo + *secret; + + unsigned char + command, + session[2*MaxTextExtent]; + + /* + Distributed pixel cache client. + */ + shared_secret=GetPolicyValue("cache:shared-secret"); + if (shared_secret == (char *) NULL) + ThrowFatalException(CacheFatalError,"shared secret expected"); + p=session; + (void) CopyMagickString((char *) p,shared_secret,MaxTextExtent); + p+=strlen(shared_secret); + shared_secret=DestroyString(shared_secret); + random_info=AcquireRandomInfo(); + secret=GetRandomKey(random_info,DPCSessionKeyLength); + (void) memcpy(p,GetStringInfoDatum(secret),DPCSessionKeyLength); + session_key=GetMagickCoreSignature(secret); + random_info=DestroyRandomInfo(random_info); + exception=AcquireExceptionInfo(); + registry=NewSplayTree((int (*)(const void *,const void *)) NULL, + (void *(*)(void *)) NULL,RelinquishImageRegistry); + client_socket=(*(int *) socket); + count=dpc_send(client_socket,DPCSessionKeyLength,GetStringInfoDatum(secret)); + secret=DestroyStringInfo(secret); + for ( ; ; ) + { + count=dpc_read(client_socket,1,(unsigned char *) &command); + if (count <= 0) + break; + count=dpc_read(client_socket,sizeof(key),(unsigned char *) &key); + if ((count != (MagickOffsetType) sizeof(key)) || (key != session_key)) + break; + status=MagickFalse; + switch (command) + { + case 'o': + { + status=OpenDistributeCache(registry,client_socket,session_key, + exception); + count=dpc_send(client_socket,sizeof(status),(unsigned char *) &status); + break; + } + case 'r': + { + status=ReadDistributeCachePixels(registry,client_socket,session_key, + exception); + break; + } + case 'R': + { + status=ReadDistributeCacheIndexes(registry,client_socket,session_key, + exception); + break; + } + case 'w': + { + status=WriteDistributeCachePixels(registry,client_socket,session_key, + exception); + break; + } + case 'W': + { + status=WriteDistributeCacheIndexes(registry,client_socket,session_key, + exception); + break; + } + case 'd': + { + status=DestroyDistributeCache(registry,session_key); + break; + } + default: + break; + } + if (status == MagickFalse) + break; + if (command == 'd') + break; + } + count=dpc_send(client_socket,sizeof(status),(unsigned char *) &status); + CLOSE_SOCKET(client_socket); + exception=DestroyExceptionInfo(exception); + registry=DestroySplayTree(registry); + return(HANDLER_RETURN_VALUE); +} + +MagickExport void DistributePixelCacheServer(const int port, + ExceptionInfo *exception) +{ +#if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE) + char + service[MaxTextExtent]; + + int + status; + +#if defined(MAGICKCORE_THREAD_SUPPORT) + pthread_attr_t + attributes; + + pthread_t + threads; +#elif defined(MAGICKCORE_WINDOWS_SUPPORT) + DWORD + threadID; +#else + Not implemented! +#endif + + struct addrinfo + *p; + + SOCKET_TYPE + server_socket; + + struct addrinfo + hint, + *result; + + struct sockaddr_in + address; + + /* + Launch distributed pixel cache server. + */ + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + magick_unreferenced(exception); +#if defined(MAGICKCORE_WINDOWS_SUPPORT) + NTInitializeWinsock(MagickFalse); +#endif + (void) memset(&hint,0,sizeof(hint)); + hint.ai_family=AF_INET; + hint.ai_socktype=SOCK_STREAM; + hint.ai_flags=AI_PASSIVE; + (void) FormatLocaleString(service,MaxTextExtent,"%d",port); + status=getaddrinfo((const char *) NULL,service,&hint,&result); + if (status != 0) + ThrowFatalException(CacheFatalError,"UnableToListen"); + server_socket=(SOCKET_TYPE) 0; + for (p=result; p != (struct addrinfo *) NULL; p=p->ai_next) + { + int + one; + + server_socket=socket(p->ai_family,p->ai_socktype,p->ai_protocol); + if (server_socket == -1) + continue; + one=1; + status=setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR, + CHAR_TYPE_CAST &one,(socklen_t) sizeof(one)); + if (status == -1) + { + CLOSE_SOCKET(server_socket); + continue; + } + status=bind(server_socket,p->ai_addr,(socklen_t) p->ai_addrlen); + if (status == -1) + { + CLOSE_SOCKET(server_socket); + continue; + } + break; + } + if (p == (struct addrinfo *) NULL) + ThrowFatalException(CacheFatalError,"UnableToBind"); + freeaddrinfo(result); + status=listen(server_socket,DPCPendingConnections); + if (status != 0) + ThrowFatalException(CacheFatalError,"UnableToListen"); +#if defined(MAGICKCORE_THREAD_SUPPORT) + pthread_attr_init(&attributes); +#endif + for ( ; ; ) + { + SOCKET_TYPE + client_socket; + + socklen_t + length; + + length=(socklen_t) sizeof(address); + client_socket=accept(server_socket,(struct sockaddr *) &address,&length); + if (client_socket == -1) + ThrowFatalException(CacheFatalError,"UnableToEstablishConnection"); +#if defined(MAGICKCORE_THREAD_SUPPORT) + status=pthread_create(&threads,&attributes,DistributePixelCacheClient, + (void *) &client_socket); + if (status == -1) + ThrowFatalException(CacheFatalError,"UnableToCreateClientThread"); +#elif defined(MAGICKCORE_WINDOWS_SUPPORT) + if (CreateThread(0,0,DistributePixelCacheClient,(void*) &client_socket,0, + &threadID) == (HANDLE) NULL) + ThrowFatalException(CacheFatalError,"UnableToCreateClientThread"); +#else + Not implemented! +#endif + } +#else + magick_unreferenced(port); + magick_unreferenced(exception); + ThrowFatalException(MissingDelegateError,"DelegateLibrarySupportNotBuiltIn"); +#endif +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t D i s t r i b u t e C a c h e F i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetDistributeCacheFile() returns the file associated with this +% DistributeCacheInfo structure. +% +% The format of the GetDistributeCacheFile method is: +% +% int GetDistributeCacheFile(const DistributeCacheInfo *server_info) +% +% A description of each parameter follows: +% +% o server_info: the distributed cache info. +% +*/ +MagickPrivate int GetDistributeCacheFile(const DistributeCacheInfo *server_info) +{ + assert(server_info != (DistributeCacheInfo *) NULL); + assert(server_info->signature == MagickCoreSignature); + return(server_info->file); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t D i s t r i b u t e C a c h e H o s t n a m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetDistributeCacheHostname() returns the hostname associated with this +% DistributeCacheInfo structure. +% +% The format of the GetDistributeCacheHostname method is: +% +% const char *GetDistributeCacheHostname( +% const DistributeCacheInfo *server_info) +% +% A description of each parameter follows: +% +% o server_info: the distributed cache info. +% +*/ +MagickPrivate const char *GetDistributeCacheHostname( + const DistributeCacheInfo *server_info) +{ + assert(server_info != (DistributeCacheInfo *) NULL); + assert(server_info->signature == MagickCoreSignature); + return(server_info->hostname); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t D i s t r i b u t e C a c h e P o r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetDistributeCachePort() returns the port associated with this +% DistributeCacheInfo structure. +% +% The format of the GetDistributeCachePort method is: +% +% int GetDistributeCachePort(const DistributeCacheInfo *server_info) +% +% A description of each parameter follows: +% +% o server_info: the distributed cache info. +% +*/ +MagickPrivate int GetDistributeCachePort(const DistributeCacheInfo *server_info) +{ + assert(server_info != (DistributeCacheInfo *) NULL); + assert(server_info->signature == MagickCoreSignature); + return(server_info->port); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ O p e n D i s t r i b u t e P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% OpenDistributePixelCache() opens a pixel cache on a remote server. +% +% The format of the OpenDistributePixelCache method is: +% +% MagickBooleanType *OpenDistributePixelCache( +% DistributeCacheInfo *server_info,Image *image) +% +% A description of each parameter follows: +% +% o server_info: the distributed cache info. +% +% o image: the image. +% +*/ +MagickPrivate MagickBooleanType OpenDistributePixelCache( + DistributeCacheInfo *server_info,Image *image) +{ + MagickBooleanType + status; + + MagickOffsetType + count; + + unsigned char + message[MaxTextExtent], + *p; + + /* + Open distributed pixel cache. + */ + assert(server_info != (DistributeCacheInfo *) NULL); + assert(server_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + p=message; + *p++='o'; /* open */ + /* + Serialize image attributes (see ValidatePixelCacheMorphology()). + */ + (void) memcpy(p,&server_info->session_key,sizeof(server_info->session_key)); + p+=sizeof(server_info->session_key); + (void) memcpy(p,&image->storage_class,sizeof(image->storage_class)); + p+=sizeof(image->storage_class); + (void) memcpy(p,&image->colorspace,sizeof(image->colorspace)); + p+=sizeof(image->colorspace); + (void) memcpy(p,&image->channels,sizeof(image->channels)); + p+=sizeof(image->channels); + (void) memcpy(p,&image->columns,sizeof(image->columns)); + p+=sizeof(image->columns); + (void) memcpy(p,&image->rows,sizeof(image->rows)); + p+=sizeof(image->rows); + count=dpc_send(server_info->file,p-message,message); + if (count != (MagickOffsetType) (p-message)) + return(MagickFalse); + status=MagickFalse; + count=dpc_read(server_info->file,sizeof(status),(unsigned char *) &status); + if (count != (MagickOffsetType) sizeof(status)) + return(MagickFalse); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d D i s t r i b u t e P i x e l C a c h e I n d e x e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadDistributePixelCacheIndexes() reads indexes from the specified region +% of the distributed pixel cache. +% +% The format of the ReadDistributePixelCacheIndexes method is: +% +% MagickOffsetType ReadDistributePixelCacheIndexes( +% DistributeCacheInfo *server_info,const RectangleInfo *region, +% const MagickSizeType length,unsigned char *indexes) +% +% A description of each parameter follows: +% +% o server_info: the distributed cache info. +% +% o image: the image. +% +% o region: read the indexes from this region of the image. +% +% o length: the length in bytes of the indexes. +% +% o indexes: read these indexes from the pixel cache. +% +*/ +MagickPrivate MagickOffsetType ReadDistributePixelCacheIndexes( + DistributeCacheInfo *server_info,const RectangleInfo *region, + const MagickSizeType length,unsigned char *indexes) +{ + MagickOffsetType + count; + + unsigned char + message[MaxTextExtent], + *p; + + /* + Read distributed pixel cache indexes. + */ + assert(server_info != (DistributeCacheInfo *) NULL); + assert(server_info->signature == MagickCoreSignature); + assert(region != (RectangleInfo *) NULL); + assert(indexes != (unsigned char *) NULL); + if (length > (MagickSizeType) MAGICK_SSIZE_MAX) + return(-1); + p=message; + *p++='R'; + (void) memcpy(p,&server_info->session_key,sizeof(server_info->session_key)); + p+=sizeof(server_info->session_key); + (void) memcpy(p,®ion->width,sizeof(region->width)); + p+=sizeof(region->width); + (void) memcpy(p,®ion->height,sizeof(region->height)); + p+=sizeof(region->height); + (void) memcpy(p,®ion->x,sizeof(region->x)); + p+=sizeof(region->x); + (void) memcpy(p,®ion->y,sizeof(region->y)); + p+=sizeof(region->y); + (void) memcpy(p,&length,sizeof(length)); + p+=sizeof(length); + count=dpc_send(server_info->file,p-message,message); + if (count != (MagickOffsetType) (p-message)) + return(-1); + return(dpc_read(server_info->file,length,indexes)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e a d D i s t r i b u t e P i x e l C a c h e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadDistributePixelCachePixels() reads pixels from the specified region of +% the distributed pixel cache. +% +% The format of the ReadDistributePixelCachePixels method is: +% +% MagickOffsetType ReadDistributePixelCachePixels( +% DistributeCacheInfo *server_info,const RectangleInfo *region, +% const MagickSizeType length,unsigned char *magick_restrict pixels) +% +% A description of each parameter follows: +% +% o server_info: the distributed cache info. +% +% o image: the image. +% +% o region: read the pixels from this region of the image. +% +% o length: the length in bytes of the pixels. +% +% o pixels: read these pixels from the pixel cache. +% +*/ +MagickPrivate MagickOffsetType ReadDistributePixelCachePixels( + DistributeCacheInfo *server_info,const RectangleInfo *region, + const MagickSizeType length,unsigned char *magick_restrict pixels) +{ + MagickOffsetType + count; + + unsigned char + message[MaxTextExtent], + *p; + + /* + Read distributed pixel cache pixels. + */ + assert(server_info != (DistributeCacheInfo *) NULL); + assert(server_info->signature == MagickCoreSignature); + assert(region != (RectangleInfo *) NULL); + assert(pixels != (unsigned char *) NULL); + if (length > (MagickSizeType) MAGICK_SSIZE_MAX) + return(-1); + p=message; + *p++='r'; + (void) memcpy(p,&server_info->session_key,sizeof(server_info->session_key)); + p+=sizeof(server_info->session_key); + (void) memcpy(p,®ion->width,sizeof(region->width)); + p+=sizeof(region->width); + (void) memcpy(p,®ion->height,sizeof(region->height)); + p+=sizeof(region->height); + (void) memcpy(p,®ion->x,sizeof(region->x)); + p+=sizeof(region->x); + (void) memcpy(p,®ion->y,sizeof(region->y)); + p+=sizeof(region->y); + (void) memcpy(p,&length,sizeof(length)); + p+=sizeof(length); + count=dpc_send(server_info->file,p-message,message); + if (count != (MagickOffsetType) (p-message)) + return(-1); + return(dpc_read(server_info->file,length,pixels)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ R e l i n q u i s h D i s t r i b u t e P i x e l C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RelinquishDistributePixelCache() frees resources acquired with +% OpenDistributePixelCache(). +% +% The format of the RelinquishDistributePixelCache method is: +% +% MagickBooleanType RelinquishDistributePixelCache( +% DistributeCacheInfo *server_info) +% +% A description of each parameter follows: +% +% o server_info: the distributed cache info. +% +*/ +MagickPrivate MagickBooleanType RelinquishDistributePixelCache( + DistributeCacheInfo *server_info) +{ + MagickBooleanType + status; + + MagickOffsetType + count; + + unsigned char + message[MaxTextExtent], + *p; + + /* + Delete distributed pixel cache. + */ + assert(server_info != (DistributeCacheInfo *) NULL); + assert(server_info->signature == MagickCoreSignature); + p=message; + *p++='d'; + (void) memcpy(p,&server_info->session_key,sizeof(server_info->session_key)); + p+=sizeof(server_info->session_key); + count=dpc_send(server_info->file,p-message,message); + if (count != (MagickOffsetType) (p-message)) + return(MagickFalse); + status=MagickFalse; + count=dpc_read(server_info->file,sizeof(status),(unsigned char *) &status); + if (count != (MagickOffsetType) sizeof(status)) + return(MagickFalse); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e D i s t r i b u t e P i x e l C a c h e I n d e x e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteDistributePixelCacheIndexes() writes image indexes to the specified +% region of the distributed pixel cache. +% +% The format of the WriteDistributePixelCacheIndexes method is: +% +% MagickOffsetType WriteDistributePixelCacheIndexes( +% DistributeCacheInfo *server_info,const RectangleInfo *region, +% const MagickSizeType length,const unsigned char *indexes) +% +% A description of each parameter follows: +% +% o server_info: the distributed cache info. +% +% o image: the image. +% +% o region: write the indexes to this region of the image. +% +% o length: the length in bytes of the indexes. +% +% o indexes: write these indexes to the pixel cache. +% +*/ +MagickPrivate MagickOffsetType WriteDistributePixelCacheIndexes( + DistributeCacheInfo *server_info,const RectangleInfo *region, + const MagickSizeType length,const unsigned char *indexes) +{ + MagickOffsetType + count; + + unsigned char + message[MaxTextExtent], + *p; + + /* + Write distributed pixel cache indexes. + */ + assert(server_info != (DistributeCacheInfo *) NULL); + assert(server_info->signature == MagickCoreSignature); + assert(region != (RectangleInfo *) NULL); + assert(indexes != (unsigned char *) NULL); + if (length > (MagickSizeType) MAGICK_SSIZE_MAX) + return(-1); + p=message; + *p++='W'; + (void) memcpy(p,&server_info->session_key,sizeof(server_info->session_key)); + p+=sizeof(server_info->session_key); + (void) memcpy(p,®ion->width,sizeof(region->width)); + p+=sizeof(region->width); + (void) memcpy(p,®ion->height,sizeof(region->height)); + p+=sizeof(region->height); + (void) memcpy(p,®ion->x,sizeof(region->x)); + p+=sizeof(region->x); + (void) memcpy(p,®ion->y,sizeof(region->y)); + p+=sizeof(region->y); + (void) memcpy(p,&length,sizeof(length)); + p+=sizeof(length); + count=dpc_send(server_info->file,p-message,message); + if (count != (MagickOffsetType) (p-message)) + return(-1); + return(dpc_send(server_info->file,length,indexes)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ W r i t e D i s t r i b u t e P i x e l C a c h e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteDistributePixelCachePixels() writes image pixels to the specified +% region of the distributed pixel cache. +% +% The format of the WriteDistributePixelCachePixels method is: +% +% MagickBooleanType WriteDistributePixelCachePixels( +% DistributeCacheInfo *server_info,const RectangleInfo *region, +% const MagickSizeType length, +% const unsigned char *magick_restrict pixels) +% +% A description of each parameter follows: +% +% o server_info: the distributed cache info. +% +% o image: the image. +% +% o region: write the pixels to this region of the image. +% +% o length: the length in bytes of the pixels. +% +% o pixels: write these pixels to the pixel cache. +% +*/ +MagickPrivate MagickOffsetType WriteDistributePixelCachePixels( + DistributeCacheInfo *server_info,const RectangleInfo *region, + const MagickSizeType length,const unsigned char *magick_restrict pixels) +{ + MagickOffsetType + count; + + unsigned char + message[MaxTextExtent], + *p; + + /* + Write distributed pixel cache pixels. + */ + assert(server_info != (DistributeCacheInfo *) NULL); + assert(server_info->signature == MagickCoreSignature); + assert(region != (RectangleInfo *) NULL); + assert(pixels != (const unsigned char *) NULL); + if (length > (MagickSizeType) MAGICK_SSIZE_MAX) + return(-1); + p=message; + *p++='w'; + (void) memcpy(p,&server_info->session_key,sizeof(server_info->session_key)); + p+=sizeof(server_info->session_key); + (void) memcpy(p,®ion->width,sizeof(region->width)); + p+=sizeof(region->width); + (void) memcpy(p,®ion->height,sizeof(region->height)); + p+=sizeof(region->height); + (void) memcpy(p,®ion->x,sizeof(region->x)); + p+=sizeof(region->x); + (void) memcpy(p,®ion->y,sizeof(region->y)); + p+=sizeof(region->y); + (void) memcpy(p,&length,sizeof(length)); + p+=sizeof(length); + count=dpc_send(server_info->file,p-message,message); + if (count != (MagickOffsetType) (p-message)) + return(-1); + return(dpc_send(server_info->file,length,pixels)); +} diff --git a/ImageMagick-6.9.12-44/magick/distribute-cache.h b/ImageMagick-6.9.12-44/magick/distribute-cache.h new file mode 100644 index 0000000..132c3aa --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/distribute-cache.h @@ -0,0 +1,34 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore distributed cache methods. +*/ +#ifndef MAGICKCORE_DISTRIBUTE_CACHE_H +#define MAGICKCORE_DISTRIBUTE_CACHE_H + +#include "magick/exception.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport void + DistributePixelCacheServer(const int,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/draw-private.h b/ImageMagick-6.9.12-44/magick/draw-private.h new file mode 100644 index 0000000..39f0112 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/draw-private.h @@ -0,0 +1,84 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore private image drawing methods. +*/ +#ifndef MAGICKCORE_DRAW_PRIVATE_H +#define MAGICKCORE_DRAW_PRIVATE_H + +#include "magick/cache.h" +#include "magick/image.h" +#include "magick/memory_.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static inline MagickBooleanType GetFillColor(const DrawInfo *draw_info, + const ssize_t x,const ssize_t y,PixelPacket *fill) +{ + Image + *pattern; + + MagickBooleanType + status; + + pattern=draw_info->fill_pattern; + if (pattern == (Image *) NULL) + { + *fill=draw_info->fill; + return(MagickTrue); + } + status=GetOneVirtualMethodPixel(pattern,TileVirtualPixelMethod, + x+pattern->tile_offset.x,y+pattern->tile_offset.y,fill,&pattern->exception); + if (pattern->matte == MagickFalse) + fill->opacity=OpaqueOpacity; + if (fabs(draw_info->fill_opacity-TransparentOpacity) >= MagickEpsilon) + fill->opacity=(Quantum) (QuantumRange-(QuantumRange-fill->opacity)* + QuantumScale*(QuantumRange-draw_info->fill_opacity)); + return(status); +} + +static inline MagickBooleanType GetStrokeColor(const DrawInfo *draw_info, + const ssize_t x,const ssize_t y,PixelPacket *stroke) +{ + Image + *pattern; + + MagickBooleanType + status; + + pattern=draw_info->stroke_pattern; + if (pattern == (Image *) NULL) + { + *stroke=draw_info->stroke; + return(MagickTrue); + } + status=GetOneVirtualMethodPixel(pattern,TileVirtualPixelMethod, + x+pattern->tile_offset.x,y+pattern->tile_offset.y,stroke, + &pattern->exception); + if (pattern->matte == MagickFalse) + stroke->opacity=OpaqueOpacity; + if (fabs(draw_info->stroke_opacity-TransparentOpacity) >= MagickEpsilon) + stroke->opacity=(Quantum) (QuantumRange-(QuantumRange-stroke->opacity)* + QuantumScale*(QuantumRange-draw_info->stroke_opacity)); + return(status); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/draw.c b/ImageMagick-6.9.12-44/magick/draw.c new file mode 100644 index 0000000..3aad640 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/draw.c @@ -0,0 +1,7647 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD RRRR AAA W W % +% D D R R A A W W % +% D D RRRR AAAAA W W W % +% D D R RN A A WW WW % +% DDDD R R A A W W % +% % +% % +% MagickCore Image Drawing Methods % +% % +% % +% Software Design % +% Cristy % +% July 1998 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Bill Radcliffe of Corbis (www.corbis.com) contributed the polygon +% rendering code based on Paul Heckbert's "Concave Polygon Scan Conversion", +% Graphics Gems, 1990. Leonard Rosenthal and David Harr of Appligent +% (www.appligent.com) contributed the dash pattern, linecap stroking +% algorithm, and minor rendering improvements. +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/annotate.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/cache.h" +#include "magick/cache-private.h" +#include "magick/cache-view.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/composite.h" +#include "magick/composite-private.h" +#include "magick/constitute.h" +#include "magick/draw.h" +#include "magick/draw-private.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/memory-private.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/paint.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/resample.h" +#include "magick/resample-private.h" +#include "magick/resource_.h" +#include "magick/splay-tree.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/thread-private.h" +#include "magick/token.h" +#include "magick/transform.h" +#include "magick/utility.h" + +/* + Define declarations. +*/ +#define BezierQuantum 200 +#define PrimitiveExtentPad 4296.0 +#define MaxBezierCoordinates 67108864 +#define ThrowPointExpectedException(image,token) \ +{ \ + (void) ThrowMagickException(&(image)->exception,GetMagickModule(),DrawError, \ + "NonconformingDrawingPrimitiveDefinition","`%s'",token); \ + status=MagickFalse; \ + break; \ +} + +/* + Typedef declarations. +*/ +typedef struct _EdgeInfo +{ + SegmentInfo + bounds; + + double + scanline; + + PointInfo + *points; + + size_t + number_points; + + ssize_t + direction; + + MagickBooleanType + ghostline; + + size_t + highwater; +} EdgeInfo; + +typedef struct _ElementInfo +{ + double + cx, + cy, + major, + minor, + angle; +} ElementInfo; + +typedef struct _MVGInfo +{ + PrimitiveInfo + **primitive_info; + + size_t + *extent; + + ssize_t + offset; + + PointInfo + point; + + ExceptionInfo + *exception; +} MVGInfo; + +typedef struct _PolygonInfo +{ + EdgeInfo + *edges; + + size_t + number_edges; +} PolygonInfo; + +typedef enum +{ + MoveToCode, + OpenCode, + GhostlineCode, + LineToCode, + EndCode +} PathInfoCode; + +typedef struct _PathInfo +{ + PointInfo + point; + + PathInfoCode + code; +} PathInfo; + +/* + Forward declarations. +*/ +static Image + *DrawClippingMask(Image *,const DrawInfo *,const char *,const char *, + ExceptionInfo *); + +static MagickBooleanType + DrawStrokePolygon(Image *,const DrawInfo *,const PrimitiveInfo *), + RenderMVGContent(Image *,const DrawInfo *,const size_t), + TraceArc(MVGInfo *,const PointInfo,const PointInfo,const PointInfo), + TraceArcPath(MVGInfo *,const PointInfo,const PointInfo,const PointInfo, + const double,const MagickBooleanType,const MagickBooleanType), + TraceBezier(MVGInfo *,const size_t), + TraceCircle(MVGInfo *,const PointInfo,const PointInfo), + TraceEllipse(MVGInfo *,const PointInfo,const PointInfo,const PointInfo), + TraceLine(PrimitiveInfo *,const PointInfo,const PointInfo), + TraceRectangle(PrimitiveInfo *,const PointInfo,const PointInfo), + TraceRoundRectangle(MVGInfo *,const PointInfo,const PointInfo,PointInfo), + TraceSquareLinecap(PrimitiveInfo *,const size_t,const double); + +static PrimitiveInfo + *TraceStrokePolygon(const DrawInfo *,const PrimitiveInfo *,ExceptionInfo *); + +static ssize_t + TracePath(Image *,MVGInfo *,const char *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e D r a w I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireDrawInfo() returns a DrawInfo structure properly initialized. +% +% The format of the AcquireDrawInfo method is: +% +% DrawInfo *AcquireDrawInfo(void) +% +*/ +MagickExport DrawInfo *AcquireDrawInfo(void) +{ + DrawInfo + *draw_info; + + draw_info=(DrawInfo *) AcquireCriticalMemory(sizeof(*draw_info)); + GetDrawInfo((ImageInfo *) NULL,draw_info); + return(draw_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e D r a w I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneDrawInfo() makes a copy of the given draw_info structure. If NULL +% is specified, a new DrawInfo structure is created initialized to default +% values. +% +% The format of the CloneDrawInfo method is: +% +% DrawInfo *CloneDrawInfo(const ImageInfo *image_info, +% const DrawInfo *draw_info) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o draw_info: the draw info. +% +*/ +MagickExport DrawInfo *CloneDrawInfo(const ImageInfo *image_info, + const DrawInfo *draw_info) +{ + DrawInfo + *clone_info; + + clone_info=(DrawInfo *) AcquireCriticalMemory(sizeof(*clone_info)); + GetDrawInfo(image_info,clone_info); + if (draw_info == (DrawInfo *) NULL) + return(clone_info); + if (draw_info->id != (char *) NULL) + (void) CloneString(&clone_info->id,draw_info->id); + if (draw_info->primitive != (char *) NULL) + (void) CloneString(&clone_info->primitive,draw_info->primitive); + if (draw_info->geometry != (char *) NULL) + (void) CloneString(&clone_info->geometry,draw_info->geometry); + clone_info->compliance=draw_info->compliance; + clone_info->viewbox=draw_info->viewbox; + clone_info->affine=draw_info->affine; + clone_info->gravity=draw_info->gravity; + clone_info->fill=draw_info->fill; + clone_info->stroke=draw_info->stroke; + clone_info->stroke_width=draw_info->stroke_width; + if (draw_info->fill_pattern != (Image *) NULL) + clone_info->fill_pattern=CloneImage(draw_info->fill_pattern,0,0,MagickTrue, + &draw_info->fill_pattern->exception); + else + if (draw_info->tile != (Image *) NULL) + clone_info->fill_pattern=CloneImage(draw_info->tile,0,0,MagickTrue, + &draw_info->tile->exception); + clone_info->tile=NewImageList(); /* tile is deprecated */ + if (draw_info->stroke_pattern != (Image *) NULL) + clone_info->stroke_pattern=CloneImage(draw_info->stroke_pattern,0,0, + MagickTrue,&draw_info->stroke_pattern->exception); + clone_info->stroke_antialias=draw_info->stroke_antialias; + clone_info->text_antialias=draw_info->text_antialias; + clone_info->fill_rule=draw_info->fill_rule; + clone_info->linecap=draw_info->linecap; + clone_info->linejoin=draw_info->linejoin; + clone_info->miterlimit=draw_info->miterlimit; + clone_info->dash_offset=draw_info->dash_offset; + clone_info->decorate=draw_info->decorate; + clone_info->compose=draw_info->compose; + if (draw_info->text != (char *) NULL) + (void) CloneString(&clone_info->text,draw_info->text); + if (draw_info->font != (char *) NULL) + (void) CloneString(&clone_info->font,draw_info->font); + if (draw_info->metrics != (char *) NULL) + (void) CloneString(&clone_info->metrics,draw_info->metrics); + if (draw_info->family != (char *) NULL) + (void) CloneString(&clone_info->family,draw_info->family); + clone_info->style=draw_info->style; + clone_info->stretch=draw_info->stretch; + clone_info->weight=draw_info->weight; + if (draw_info->encoding != (char *) NULL) + (void) CloneString(&clone_info->encoding,draw_info->encoding); + clone_info->pointsize=draw_info->pointsize; + clone_info->kerning=draw_info->kerning; + clone_info->interline_spacing=draw_info->interline_spacing; + clone_info->interword_spacing=draw_info->interword_spacing; + clone_info->direction=draw_info->direction; + if (draw_info->density != (char *) NULL) + (void) CloneString(&clone_info->density,draw_info->density); + clone_info->align=draw_info->align; + clone_info->undercolor=draw_info->undercolor; + clone_info->border_color=draw_info->border_color; + if (draw_info->server_name != (char *) NULL) + (void) CloneString(&clone_info->server_name,draw_info->server_name); + if (draw_info->dash_pattern != (double *) NULL) + { + ssize_t + x; + + for (x=0; fabs(draw_info->dash_pattern[x]) >= MagickEpsilon; x++) ; + clone_info->dash_pattern=(double *) AcquireQuantumMemory((size_t) (2*x+2), + sizeof(*clone_info->dash_pattern)); + if (clone_info->dash_pattern == (double *) NULL) + ThrowFatalException(ResourceLimitFatalError, + "UnableToAllocateDashPattern"); + (void) memset(clone_info->dash_pattern,0,(size_t) (2*x+2)* + sizeof(*clone_info->dash_pattern)); + (void) memcpy(clone_info->dash_pattern,draw_info->dash_pattern,(size_t) + (x+1)*sizeof(*clone_info->dash_pattern)); + } + clone_info->gradient=draw_info->gradient; + if (draw_info->gradient.stops != (StopInfo *) NULL) + { + size_t + number_stops; + + number_stops=clone_info->gradient.number_stops; + clone_info->gradient.stops=(StopInfo *) AcquireQuantumMemory((size_t) + number_stops,sizeof(*clone_info->gradient.stops)); + if (clone_info->gradient.stops == (StopInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError, + "UnableToAllocateDashPattern"); + (void) memcpy(clone_info->gradient.stops,draw_info->gradient.stops, + (size_t) number_stops*sizeof(*clone_info->gradient.stops)); + } + clone_info->bounds=draw_info->bounds; + clone_info->fill_opacity=draw_info->fill_opacity; + clone_info->stroke_opacity=draw_info->stroke_opacity; + clone_info->element_reference=draw_info->element_reference; + clone_info->clip_path=draw_info->clip_path; + clone_info->clip_units=draw_info->clip_units; + if (draw_info->clip_mask != (char *) NULL) + (void) CloneString(&clone_info->clip_mask,draw_info->clip_mask); + if (draw_info->clipping_mask != (Image *) NULL) + clone_info->clipping_mask=CloneImage(draw_info->clipping_mask,0,0, + MagickTrue,&draw_info->clipping_mask->exception); + if (draw_info->composite_mask != (Image *) NULL) + clone_info->composite_mask=CloneImage(draw_info->composite_mask,0,0, + MagickTrue,&draw_info->composite_mask->exception); + clone_info->render=draw_info->render; + clone_info->debug=IsEventLogging(); + return(clone_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C o n v e r t P a t h T o P o l y g o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertPathToPolygon() converts a path to the more efficient sorted +% rendering form. +% +% The format of the ConvertPathToPolygon method is: +% +% PolygonInfo *ConvertPathToPolygon(const PathInfo *path_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o ConvertPathToPolygon() returns the path in a more efficient sorted +% rendering form of type PolygonInfo. +% +% o draw_info: Specifies a pointer to an DrawInfo structure. +% +% o path_info: Specifies a pointer to an PathInfo structure. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static PolygonInfo *DestroyPolygonInfo(PolygonInfo *polygon_info) +{ + ssize_t + i; + + if (polygon_info->edges != (EdgeInfo *) NULL) + { + for (i=0; i < (ssize_t) polygon_info->number_edges; i++) + if (polygon_info->edges[i].points != (PointInfo *) NULL) + polygon_info->edges[i].points=(PointInfo *) + RelinquishMagickMemory(polygon_info->edges[i].points); + polygon_info->edges=(EdgeInfo *) RelinquishMagickMemory( + polygon_info->edges); + } + return((PolygonInfo *) RelinquishMagickMemory(polygon_info)); +} + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static int DrawCompareEdges(const void *p_edge,const void *q_edge) +{ +#define DrawCompareEdge(p,q) \ +{ \ + if (((p)-(q)) < 0.0) \ + return(-1); \ + if (((p)-(q)) > 0.0) \ + return(1); \ +} + + const PointInfo + *p, + *q; + + /* + Edge sorting for right-handed coordinate system. + */ + p=((const EdgeInfo *) p_edge)->points; + q=((const EdgeInfo *) q_edge)->points; + DrawCompareEdge(p[0].y,q[0].y); + DrawCompareEdge(p[0].x,q[0].x); + DrawCompareEdge((p[1].x-p[0].x)*(q[1].y-q[0].y),(p[1].y-p[0].y)* + (q[1].x-q[0].x)); + DrawCompareEdge(p[1].y,q[1].y); + DrawCompareEdge(p[1].x,q[1].x); + return(0); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +static void LogPolygonInfo(const PolygonInfo *polygon_info) +{ + EdgeInfo + *p; + + ssize_t + i, + j; + + (void) LogMagickEvent(DrawEvent,GetMagickModule()," begin active-edge"); + p=polygon_info->edges; + for (i=0; i < (ssize_t) polygon_info->number_edges; i++) + { + (void) LogMagickEvent(DrawEvent,GetMagickModule()," edge %.20g:", + (double) i); + (void) LogMagickEvent(DrawEvent,GetMagickModule()," direction: %s", + p->direction != MagickFalse ? "down" : "up"); + (void) LogMagickEvent(DrawEvent,GetMagickModule()," ghostline: %s", + p->ghostline != MagickFalse ? "transparent" : "opaque"); + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + " bounds: %g,%g - %g,%g",p->bounds.x1,p->bounds.y1, + p->bounds.x2,p->bounds.y2); + for (j=0; j < (ssize_t) p->number_points; j++) + (void) LogMagickEvent(DrawEvent,GetMagickModule()," %g,%g", + p->points[j].x,p->points[j].y); + p++; + } + (void) LogMagickEvent(DrawEvent,GetMagickModule()," end active-edge"); +} + +static void ReversePoints(PointInfo *points,const size_t number_points) +{ + PointInfo + point; + + ssize_t + i; + + for (i=0; i < (ssize_t) (number_points >> 1); i++) + { + point=points[i]; + points[i]=points[number_points-(i+1)]; + points[number_points-(i+1)]=point; + } +} + +static PolygonInfo *ConvertPathToPolygon(const PathInfo *path_info, + ExceptionInfo *exception) +{ + long + direction, + next_direction; + + PointInfo + point, + *points; + + PolygonInfo + *polygon_info; + + SegmentInfo + bounds; + + ssize_t + i, + n; + + MagickBooleanType + ghostline; + + size_t + edge, + number_edges, + number_points; + + /* + Convert a path to the more efficient sorted rendering form. + */ + polygon_info=(PolygonInfo *) AcquireMagickMemory(sizeof(*polygon_info)); + if (polygon_info == (PolygonInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return((PolygonInfo *) NULL); + } + number_edges=16; + polygon_info->edges=(EdgeInfo *) AcquireQuantumMemory(number_edges, + sizeof(*polygon_info->edges)); + if (polygon_info->edges == (EdgeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(DestroyPolygonInfo(polygon_info)); + } + (void) memset(polygon_info->edges,0,number_edges* + sizeof(*polygon_info->edges)); + direction=0; + edge=0; + ghostline=MagickFalse; + n=0; + number_points=0; + points=(PointInfo *) NULL; + (void) memset(&point,0,sizeof(point)); + (void) memset(&bounds,0,sizeof(bounds)); + polygon_info->edges[edge].number_points=(size_t) n; + polygon_info->edges[edge].scanline=0.0; + polygon_info->edges[edge].highwater=0; + polygon_info->edges[edge].ghostline=ghostline; + polygon_info->edges[edge].direction=(ssize_t) direction; + polygon_info->edges[edge].points=points; + polygon_info->edges[edge].bounds=bounds; + polygon_info->number_edges=0; + for (i=0; path_info[i].code != EndCode; i++) + { + if ((path_info[i].code == MoveToCode) || (path_info[i].code == OpenCode) || + (path_info[i].code == GhostlineCode)) + { + /* + Move to. + */ + if ((points != (PointInfo *) NULL) && (n >= 2)) + { + if (edge == number_edges) + { + number_edges<<=1; + polygon_info->edges=(EdgeInfo *) ResizeQuantumMemory( + polygon_info->edges,(size_t) number_edges, + sizeof(*polygon_info->edges)); + if (polygon_info->edges == (EdgeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + points=(PointInfo *) RelinquishMagickMemory(points); + return(DestroyPolygonInfo(polygon_info)); + } + } + polygon_info->edges[edge].number_points=(size_t) n; + polygon_info->edges[edge].scanline=(-1.0); + polygon_info->edges[edge].highwater=0; + polygon_info->edges[edge].ghostline=ghostline; + polygon_info->edges[edge].direction=(ssize_t) (direction > 0); + if (direction < 0) + ReversePoints(points,(size_t) n); + polygon_info->edges[edge].points=points; + polygon_info->edges[edge].bounds=bounds; + polygon_info->edges[edge].bounds.y1=points[0].y; + polygon_info->edges[edge].bounds.y2=points[n-1].y; + points=(PointInfo *) NULL; + ghostline=MagickFalse; + edge++; + polygon_info->number_edges=edge; + } + if (points == (PointInfo *) NULL) + { + number_points=16; + points=(PointInfo *) AcquireQuantumMemory((size_t) number_points, + sizeof(*points)); + if (points == (PointInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(DestroyPolygonInfo(polygon_info)); + } + } + ghostline=path_info[i].code == GhostlineCode ? MagickTrue : MagickFalse; + point=path_info[i].point; + points[0]=point; + bounds.x1=point.x; + bounds.x2=point.x; + direction=0; + n=1; + continue; + } + /* + Line to. + */ + next_direction=((path_info[i].point.y > point.y) || + ((fabs(path_info[i].point.y-point.y) < MagickEpsilon) && + (path_info[i].point.x > point.x))) ? 1 : -1; + if ((points != (PointInfo *) NULL) && (direction != 0) && + (direction != next_direction)) + { + /* + New edge. + */ + point=points[n-1]; + if (edge == number_edges) + { + number_edges<<=1; + polygon_info->edges=(EdgeInfo *) ResizeQuantumMemory( + polygon_info->edges,(size_t) number_edges, + sizeof(*polygon_info->edges)); + if (polygon_info->edges == (EdgeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + points=(PointInfo *) RelinquishMagickMemory(points); + return(DestroyPolygonInfo(polygon_info)); + } + } + polygon_info->edges[edge].number_points=(size_t) n; + polygon_info->edges[edge].scanline=(-1.0); + polygon_info->edges[edge].highwater=0; + polygon_info->edges[edge].ghostline=ghostline; + polygon_info->edges[edge].direction=(ssize_t) (direction > 0); + if (direction < 0) + ReversePoints(points,(size_t) n); + polygon_info->edges[edge].points=points; + polygon_info->edges[edge].bounds=bounds; + polygon_info->edges[edge].bounds.y1=points[0].y; + polygon_info->edges[edge].bounds.y2=points[n-1].y; + polygon_info->number_edges=edge+1; + points=(PointInfo *) NULL; + number_points=16; + points=(PointInfo *) AcquireQuantumMemory((size_t) number_points, + sizeof(*points)); + if (points == (PointInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(DestroyPolygonInfo(polygon_info)); + } + n=1; + ghostline=MagickFalse; + points[0]=point; + bounds.x1=point.x; + bounds.x2=point.x; + edge++; + } + direction=next_direction; + if (points == (PointInfo *) NULL) + continue; + if (n == (ssize_t) number_points) + { + number_points<<=1; + points=(PointInfo *) ResizeQuantumMemory(points,(size_t) number_points, + sizeof(*points)); + if (points == (PointInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(DestroyPolygonInfo(polygon_info)); + } + } + point=path_info[i].point; + points[n]=point; + if (point.x < bounds.x1) + bounds.x1=point.x; + if (point.x > bounds.x2) + bounds.x2=point.x; + n++; + } + if (points != (PointInfo *) NULL) + { + if (n < 2) + points=(PointInfo *) RelinquishMagickMemory(points); + else + { + if (edge == number_edges) + { + number_edges<<=1; + polygon_info->edges=(EdgeInfo *) ResizeQuantumMemory( + polygon_info->edges,(size_t) number_edges, + sizeof(*polygon_info->edges)); + if (polygon_info->edges == (EdgeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(DestroyPolygonInfo(polygon_info)); + } + } + polygon_info->edges[edge].number_points=(size_t) n; + polygon_info->edges[edge].scanline=(-1.0); + polygon_info->edges[edge].highwater=0; + polygon_info->edges[edge].ghostline=ghostline; + polygon_info->edges[edge].direction=(ssize_t) (direction > 0); + if (direction < 0) + ReversePoints(points,(size_t) n); + polygon_info->edges[edge].points=points; + polygon_info->edges[edge].bounds=bounds; + polygon_info->edges[edge].bounds.y1=points[0].y; + polygon_info->edges[edge].bounds.y2=points[n-1].y; + points=(PointInfo *) NULL; + ghostline=MagickFalse; + edge++; + polygon_info->number_edges=edge; + } + } + polygon_info->number_edges=edge; + polygon_info->number_edges=edge; + polygon_info->edges=(EdgeInfo *) ResizeQuantumMemory(polygon_info->edges, + polygon_info->number_edges,sizeof(*polygon_info->edges)); + if (polygon_info->edges == (EdgeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(DestroyPolygonInfo(polygon_info)); + } + for (i=0; i < (ssize_t) polygon_info->number_edges; i++) + { + EdgeInfo + *edge_info; + + edge_info=polygon_info->edges+i; + edge_info->points=(PointInfo *) ResizeQuantumMemory(edge_info->points, + edge_info->number_points,sizeof(*edge_info->points)); + if (edge_info->points == (PointInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(DestroyPolygonInfo(polygon_info)); + } + } + qsort(polygon_info->edges,(size_t) polygon_info->number_edges, + sizeof(*polygon_info->edges),DrawCompareEdges); + if (IsEventLogging() != MagickFalse) + LogPolygonInfo(polygon_info); + return(polygon_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C o n v e r t P r i m i t i v e T o P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertPrimitiveToPath() converts a PrimitiveInfo structure into a vector +% path structure. +% +% The format of the ConvertPrimitiveToPath method is: +% +% PathInfo *ConvertPrimitiveToPath(const DrawInfo *draw_info, +% const PrimitiveInfo *primitive_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o ConvertPrimitiveToPath() returns a vector path structure of type +% PathInfo. +% +% o draw_info: a structure of type DrawInfo. +% +% o primitive_info: Specifies a pointer to an PrimitiveInfo structure. +% +% +*/ + +static void LogPathInfo(const PathInfo *path_info) +{ + const PathInfo + *p; + + (void) LogMagickEvent(DrawEvent,GetMagickModule()," begin vector-path"); + for (p=path_info; p->code != EndCode; p++) + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + " %g,%g %s",p->point.x,p->point.y,p->code == GhostlineCode ? + "moveto ghostline" : p->code == OpenCode ? "moveto open" : + p->code == MoveToCode ? "moveto" : p->code == LineToCode ? "lineto" : + "?"); + (void) LogMagickEvent(DrawEvent,GetMagickModule()," end vector-path"); +} + +static PathInfo *ConvertPrimitiveToPath( + const DrawInfo *magick_unused(draw_info),const PrimitiveInfo *primitive_info, + ExceptionInfo *exception) +{ + MagickBooleanType + closed_subpath; + + PathInfo + *path_info; + + PathInfoCode + code; + + PointInfo + p, + q; + + ssize_t + i, + n; + + ssize_t + coordinates, + start; + + magick_unreferenced(draw_info); + + /* + Converts a PrimitiveInfo structure into a vector path structure. + */ + switch (primitive_info->primitive) + { + case PointPrimitive: + case ColorPrimitive: + case MattePrimitive: + case TextPrimitive: + case ImagePrimitive: + return((PathInfo *) NULL); + default: + break; + } + for (i=0; primitive_info[i].primitive != UndefinedPrimitive; i++) ; + path_info=(PathInfo *) AcquireQuantumMemory((size_t) (3UL*i+1UL), + sizeof(*path_info)); + if (path_info == (PathInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return((PathInfo *) NULL); + } + coordinates=0; + closed_subpath=MagickFalse; + n=0; + p.x=(-1.0); + p.y=(-1.0); + q.x=(-1.0); + q.y=(-1.0); + start=0; + for (i=0; primitive_info[i].primitive != UndefinedPrimitive; i++) + { + code=LineToCode; + if (coordinates <= 0) + { + /* + New subpath. + */ + coordinates=(ssize_t) primitive_info[i].coordinates; + p=primitive_info[i].point; + start=n; + code=MoveToCode; + closed_subpath=primitive_info[i].closed_subpath; + } + coordinates--; + if ((code == MoveToCode) || (coordinates <= 0) || + (fabs(q.x-primitive_info[i].point.x) >= MagickEpsilon) || + (fabs(q.y-primitive_info[i].point.y) >= MagickEpsilon)) + { + /* + Eliminate duplicate points. + */ + path_info[n].code=code; + path_info[n].point=primitive_info[i].point; + q=primitive_info[i].point; + n++; + } + if (coordinates > 0) + continue; /* next point in current subpath */ + if (closed_subpath != MagickFalse) + { + closed_subpath=MagickFalse; + continue; + } + /* + Mark the p point as open if the subpath is not closed. + */ + path_info[start].code=OpenCode; + path_info[n].code=GhostlineCode; + path_info[n].point=primitive_info[i].point; + n++; + path_info[n].code=LineToCode; + path_info[n].point=p; + n++; + } + path_info[n].code=EndCode; + path_info[n].point.x=0.0; + path_info[n].point.y=0.0; + if (IsEventLogging() != MagickFalse) + LogPathInfo(path_info); + path_info=(PathInfo *) ResizeQuantumMemory(path_info,(size_t) (n+1), + sizeof(*path_info)); + return(path_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y D r a w I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyDrawInfo() deallocates memory associated with an DrawInfo structure. +% +% The format of the DestroyDrawInfo method is: +% +% DrawInfo *DestroyDrawInfo(DrawInfo *draw_info) +% +% A description of each parameter follows: +% +% o draw_info: the draw info. +% +*/ +MagickExport DrawInfo *DestroyDrawInfo(DrawInfo *draw_info) +{ + assert(draw_info != (DrawInfo *) NULL); + if (draw_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(draw_info->signature == MagickCoreSignature); + if (draw_info->id != (char *) NULL) + draw_info->id=DestroyString(draw_info->id); + if (draw_info->primitive != (char *) NULL) + draw_info->primitive=DestroyString(draw_info->primitive); + if (draw_info->text != (char *) NULL) + draw_info->text=DestroyString(draw_info->text); + if (draw_info->geometry != (char *) NULL) + draw_info->geometry=DestroyString(draw_info->geometry); + if (draw_info->tile != (Image *) NULL) + draw_info->tile=DestroyImage(draw_info->tile); + if (draw_info->fill_pattern != (Image *) NULL) + draw_info->fill_pattern=DestroyImage(draw_info->fill_pattern); + if (draw_info->stroke_pattern != (Image *) NULL) + draw_info->stroke_pattern=DestroyImage(draw_info->stroke_pattern); + if (draw_info->font != (char *) NULL) + draw_info->font=DestroyString(draw_info->font); + if (draw_info->metrics != (char *) NULL) + draw_info->metrics=DestroyString(draw_info->metrics); + if (draw_info->family != (char *) NULL) + draw_info->family=DestroyString(draw_info->family); + if (draw_info->encoding != (char *) NULL) + draw_info->encoding=DestroyString(draw_info->encoding); + if (draw_info->density != (char *) NULL) + draw_info->density=DestroyString(draw_info->density); + if (draw_info->server_name != (char *) NULL) + draw_info->server_name=(char *) + RelinquishMagickMemory(draw_info->server_name); + if (draw_info->dash_pattern != (double *) NULL) + draw_info->dash_pattern=(double *) RelinquishMagickMemory( + draw_info->dash_pattern); + if (draw_info->gradient.stops != (StopInfo *) NULL) + draw_info->gradient.stops=(StopInfo *) RelinquishMagickMemory( + draw_info->gradient.stops); + if (draw_info->clip_mask != (char *) NULL) + draw_info->clip_mask=DestroyString(draw_info->clip_mask); + if (draw_info->clipping_mask != (Image *) NULL) + draw_info->clipping_mask=DestroyImage(draw_info->clipping_mask); + if (draw_info->composite_mask != (Image *) NULL) + draw_info->composite_mask=DestroyImage(draw_info->composite_mask); + draw_info->signature=(~MagickCoreSignature); + draw_info=(DrawInfo *) RelinquishMagickMemory(draw_info); + return(draw_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w A f f i n e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawAffineImage() composites the source over the destination image as +% dictated by the affine transform. +% +% The format of the DrawAffineImage method is: +% +% MagickBooleanType DrawAffineImage(Image *image,const Image *source, +% const AffineMatrix *affine) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o source: the source image. +% +% o affine: the affine transform. +% +*/ + +static SegmentInfo AffineEdge(const Image *image,const AffineMatrix *affine, + const double y,const SegmentInfo *edge) +{ + double + intercept, + z; + + double + x; + + SegmentInfo + inverse_edge; + + /* + Determine left and right edges. + */ + inverse_edge.x1=edge->x1; + inverse_edge.y1=edge->y1; + inverse_edge.x2=edge->x2; + inverse_edge.y2=edge->y2; + z=affine->ry*y+affine->tx; + if (affine->sx >= MagickEpsilon) + { + intercept=(-z/affine->sx); + x=intercept; + if (x > inverse_edge.x1) + inverse_edge.x1=x; + intercept=(-z+(double) image->columns)/affine->sx; + x=intercept; + if (x < inverse_edge.x2) + inverse_edge.x2=x; + } + else + if (affine->sx < -MagickEpsilon) + { + intercept=(-z+(double) image->columns)/affine->sx; + x=intercept; + if (x > inverse_edge.x1) + inverse_edge.x1=x; + intercept=(-z/affine->sx); + x=intercept; + if (x < inverse_edge.x2) + inverse_edge.x2=x; + } + else + if ((z < 0.0) || ((size_t) floor(z+0.5) >= image->columns)) + { + inverse_edge.x2=edge->x1; + return(inverse_edge); + } + /* + Determine top and bottom edges. + */ + z=affine->sy*y+affine->ty; + if (affine->rx >= MagickEpsilon) + { + intercept=(-z/affine->rx); + x=intercept; + if (x > inverse_edge.x1) + inverse_edge.x1=x; + intercept=(-z+(double) image->rows)/affine->rx; + x=intercept; + if (x < inverse_edge.x2) + inverse_edge.x2=x; + } + else + if (affine->rx < -MagickEpsilon) + { + intercept=(-z+(double) image->rows)/affine->rx; + x=intercept; + if (x > inverse_edge.x1) + inverse_edge.x1=x; + intercept=(-z/affine->rx); + x=intercept; + if (x < inverse_edge.x2) + inverse_edge.x2=x; + } + else + if ((z < 0.0) || ((size_t) floor(z+0.5) >= image->rows)) + { + inverse_edge.x2=edge->x2; + return(inverse_edge); + } + return(inverse_edge); +} + +static AffineMatrix InverseAffineMatrix(const AffineMatrix *affine) +{ + AffineMatrix + inverse_affine; + + double + determinant; + + determinant=PerceptibleReciprocal(affine->sx*affine->sy-affine->rx* + affine->ry); + inverse_affine.sx=determinant*affine->sy; + inverse_affine.rx=determinant*(-affine->rx); + inverse_affine.ry=determinant*(-affine->ry); + inverse_affine.sy=determinant*affine->sx; + inverse_affine.tx=(-affine->tx)*inverse_affine.sx-affine->ty* + inverse_affine.ry; + inverse_affine.ty=(-affine->tx)*inverse_affine.rx-affine->ty* + inverse_affine.sy; + return(inverse_affine); +} + +MagickExport MagickBooleanType DrawAffineImage(Image *image, + const Image *source,const AffineMatrix *affine) +{ + AffineMatrix + inverse_affine; + + CacheView + *image_view, + *source_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickPixelPacket + zero; + + PointInfo + extent[4], + min, + max, + point; + + ssize_t + i; + + SegmentInfo + edge; + + ssize_t + start, + stop, + y; + + /* + Determine bounding box. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(source != (const Image *) NULL); + assert(source->signature == MagickCoreSignature); + assert(affine != (AffineMatrix *) NULL); + extent[0].x=0.0; + extent[0].y=0.0; + extent[1].x=(double) source->columns-1.0; + extent[1].y=0.0; + extent[2].x=(double) source->columns-1.0; + extent[2].y=(double) source->rows-1.0; + extent[3].x=0.0; + extent[3].y=(double) source->rows-1.0; + for (i=0; i < 4; i++) + { + point=extent[i]; + extent[i].x=point.x*affine->sx+point.y*affine->ry+affine->tx; + extent[i].y=point.x*affine->rx+point.y*affine->sy+affine->ty; + } + min=extent[0]; + max=extent[0]; + for (i=1; i < 4; i++) + { + if (min.x > extent[i].x) + min.x=extent[i].x; + if (min.y > extent[i].y) + min.y=extent[i].y; + if (max.x < extent[i].x) + max.x=extent[i].x; + if (max.y < extent[i].y) + max.y=extent[i].y; + } + /* + Affine transform image. + */ + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + edge.x1=MagickMax(min.x,0.0); + edge.y1=MagickMax(min.y,0.0); + edge.x2=MagickMin(max.x,(double) image->columns-1.0); + edge.y2=MagickMin(max.y,(double) image->rows-1.0); + inverse_affine=InverseAffineMatrix(affine); + GetMagickPixelPacket(image,&zero); + exception=(&image->exception); + start=CastDoubleToLong(ceil(edge.y1-0.5)); + stop=CastDoubleToLong(floor(edge.y2+0.5)); + source_view=AcquireVirtualCacheView(source,exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(source,image,stop-start,1) +#endif + for (y=start; y <= stop; y++) + { + MagickPixelPacket + composite, + pixel; + + PointInfo + point; + + IndexPacket + *magick_restrict indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict q; + + SegmentInfo + inverse_edge; + + ssize_t + x_offset; + + if (status == MagickFalse) + continue; + inverse_edge=AffineEdge(source,&inverse_affine,(double) y,&edge); + if (inverse_edge.x2 < inverse_edge.x1) + continue; + q=GetCacheViewAuthenticPixels(image_view,CastDoubleToLong( + ceil(inverse_edge.x1-0.5)),y,(size_t) CastDoubleToLong(floor( + inverse_edge.x2+0.5)-ceil(inverse_edge.x1-0.5)+1),1,exception); + if (q == (PixelPacket *) NULL) + continue; + indexes=GetCacheViewAuthenticIndexQueue(image_view); + pixel=zero; + composite=zero; + x_offset=0; + for (x=CastDoubleToLong(ceil(inverse_edge.x1-0.5)); + x <= CastDoubleToLong(floor(inverse_edge.x2+0.5)); x++) + { + point.x=(double) x*inverse_affine.sx+y*inverse_affine.ry+ + inverse_affine.tx; + point.y=(double) x*inverse_affine.rx+y*inverse_affine.sy+ + inverse_affine.ty; + status=InterpolateMagickPixelPacket(source,source_view, + UndefinedInterpolatePixel,point.x,point.y,&pixel,exception); + if (status == MagickFalse) + break; + SetMagickPixelPacket(image,q,indexes+x_offset,&composite); + MagickPixelCompositeOver(&pixel,pixel.opacity,&composite, + composite.opacity,&composite); + SetPixelPacket(image,&composite,q,indexes+x_offset); + x_offset++; + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + source_view=DestroyCacheView(source_view); + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D r a w B o u n d i n g R e c t a n g l e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawBoundingRectangles() draws the bounding rectangles on the image. This +% is only useful for developers debugging the rendering algorithm. +% +% The format of the DrawBoundingRectangles method is: +% +% MagickBooleanType DrawBoundingRectangles(Image *image, +% const DrawInfo *draw_info,PolygonInfo *polygon_info) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o polygon_info: Specifies a pointer to a PolygonInfo structure. +% +*/ + +static MagickBooleanType DrawBoundingRectangles(Image *image, + const DrawInfo *draw_info,const PolygonInfo *polygon_info) +{ + double + mid; + + DrawInfo + *clone_info; + + MagickStatusType + status; + + PointInfo + end, + resolution, + start; + + PrimitiveInfo + primitive_info[6]; + + ssize_t + i; + + SegmentInfo + bounds; + + ssize_t + coordinates; + + (void) memset(primitive_info,0,sizeof(primitive_info)); + clone_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + status=QueryColorDatabase("#0000",&clone_info->fill,&image->exception); + if (status == MagickFalse) + { + clone_info=DestroyDrawInfo(clone_info); + return(MagickFalse); + } + resolution.x=96.0; + resolution.y=96.0; + if (clone_info->density != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(clone_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + resolution.x=geometry_info.rho; + resolution.y=resolution.x; + if ((flags & SigmaValue) != 0) + resolution.y=geometry_info.sigma; + } + mid=(resolution.x/96.0)*ExpandAffine(&clone_info->affine)* + clone_info->stroke_width/2.0; + bounds.x1=0.0; + bounds.y1=0.0; + bounds.x2=0.0; + bounds.y2=0.0; + if (polygon_info != (PolygonInfo *) NULL) + { + bounds=polygon_info->edges[0].bounds; + for (i=1; i < (ssize_t) polygon_info->number_edges; i++) + { + if (polygon_info->edges[i].bounds.x1 < (double) bounds.x1) + bounds.x1=polygon_info->edges[i].bounds.x1; + if (polygon_info->edges[i].bounds.y1 < (double) bounds.y1) + bounds.y1=polygon_info->edges[i].bounds.y1; + if (polygon_info->edges[i].bounds.x2 > (double) bounds.x2) + bounds.x2=polygon_info->edges[i].bounds.x2; + if (polygon_info->edges[i].bounds.y2 > (double) bounds.y2) + bounds.y2=polygon_info->edges[i].bounds.y2; + } + bounds.x1-=mid; + bounds.x1=bounds.x1 < 0.0 ? 0.0 : bounds.x1 >= (double) + image->columns ? (double) image->columns-1 : bounds.x1; + bounds.y1-=mid; + bounds.y1=bounds.y1 < 0.0 ? 0.0 : bounds.y1 >= (double) + image->rows ? (double) image->rows-1 : bounds.y1; + bounds.x2+=mid; + bounds.x2=bounds.x2 < 0.0 ? 0.0 : bounds.x2 >= (double) + image->columns ? (double) image->columns-1 : bounds.x2; + bounds.y2+=mid; + bounds.y2=bounds.y2 < 0.0 ? 0.0 : bounds.y2 >= (double) + image->rows ? (double) image->rows-1 : bounds.y2; + for (i=0; i < (ssize_t) polygon_info->number_edges; i++) + { + if (polygon_info->edges[i].direction != 0) + status=QueryColorDatabase("#f00",&clone_info->stroke, + &image->exception); + else + status=QueryColorDatabase("#0f0",&clone_info->stroke, + &image->exception); + if (status == MagickFalse) + break; + start.x=(double) (polygon_info->edges[i].bounds.x1-mid); + start.y=(double) (polygon_info->edges[i].bounds.y1-mid); + end.x=(double) (polygon_info->edges[i].bounds.x2+mid); + end.y=(double) (polygon_info->edges[i].bounds.y2+mid); + primitive_info[0].primitive=RectanglePrimitive; + status&=TraceRectangle(primitive_info,start,end); + primitive_info[0].method=ReplaceMethod; + coordinates=(ssize_t) primitive_info[0].coordinates; + primitive_info[coordinates].primitive=UndefinedPrimitive; + status=DrawPrimitive(image,clone_info,primitive_info); + if (status == MagickFalse) + break; + } + if (i < (ssize_t) polygon_info->number_edges) + { + clone_info=DestroyDrawInfo(clone_info); + return(status == 0 ? MagickFalse : MagickTrue); + } + } + status=QueryColorDatabase("#00f",&clone_info->stroke,&image->exception); + if (status == MagickFalse) + { + clone_info=DestroyDrawInfo(clone_info); + return(MagickFalse); + } + start.x=(double) (bounds.x1-mid); + start.y=(double) (bounds.y1-mid); + end.x=(double) (bounds.x2+mid); + end.y=(double) (bounds.y2+mid); + primitive_info[0].primitive=RectanglePrimitive; + status&=TraceRectangle(primitive_info,start,end); + primitive_info[0].method=ReplaceMethod; + coordinates=(ssize_t) primitive_info[0].coordinates; + primitive_info[coordinates].primitive=UndefinedPrimitive; + status=DrawPrimitive(image,clone_info,primitive_info); + clone_info=DestroyDrawInfo(clone_info); + return(status == 0 ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w C l i p P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawClipPath() draws the clip path on the image mask. +% +% The format of the DrawClipPath method is: +% +% MagickBooleanType DrawClipPath(Image *image,const DrawInfo *draw_info, +% const char *id) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o id: the clip path id. +% +*/ +MagickExport MagickBooleanType DrawClipPath(Image *image, + const DrawInfo *draw_info,const char *id) +{ + const char + *clip_path; + + Image + *clipping_mask; + + MagickBooleanType + status; + + clip_path=GetImageArtifact(image,id); + if (clip_path == (const char *) NULL) + return(MagickFalse); + clipping_mask=DrawClippingMask(image,draw_info,draw_info->clip_mask,clip_path, + &image->exception); + if (clipping_mask == (Image *) NULL) + return(MagickFalse); + status=SetImageClipMask(image,clipping_mask); + clipping_mask=DestroyImage(clipping_mask); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w C l i p p i n g M a s k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawClippingMask() draws the clip path and returns it as an image clipping +% mask. +% +% The format of the DrawClippingMask method is: +% +% Image *DrawClippingMask(Image *image,const DrawInfo *draw_info, +% const char *id,const char *clip_path,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o id: the clip path id. +% +% o clip_path: the clip path. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *DrawClippingMask(Image *image,const DrawInfo *draw_info, + const char *id,const char *clip_path,ExceptionInfo *exception) +{ + DrawInfo + *clone_info; + + Image + *clip_mask; + + MagickStatusType + status; + + /* + Draw a clip path. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(draw_info != (const DrawInfo *) NULL); + clip_mask=AcquireImage((const ImageInfo *) NULL); + status=SetImageExtent(clip_mask,image->columns,image->rows); + if (status == MagickFalse) + return(DestroyImage(clip_mask)); + status=SetImageClipMask(image,(Image *) NULL); + status=QueryColorCompliance("#0000",AllCompliance, + &clip_mask->background_color,exception); + clip_mask->background_color.opacity=(Quantum) TransparentOpacity; + status=SetImageBackgroundColor(clip_mask); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(),"\nbegin clip-path %s", + id); + clone_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + (void) CloneString(&clone_info->primitive,clip_path); + status=QueryColorCompliance("#ffffff",AllCompliance,&clone_info->fill, + exception); + if (clone_info->clip_mask != (char *) NULL) + clone_info->clip_mask=DestroyString(clone_info->clip_mask); + (void) QueryColorCompliance("#00000000",AllCompliance,&clone_info->stroke, + exception); + clone_info->stroke_width=0.0; + clone_info->opacity=OpaqueOpacity; + clone_info->clip_path=MagickTrue; + status=RenderMVGContent(clip_mask,clone_info,0); + clone_info=DestroyDrawInfo(clone_info); + status&=SeparateImageChannel(clip_mask,TrueAlphaChannel); + if (draw_info->compliance != SVGCompliance) + status&=NegateImage(clip_mask,MagickFalse); + if (status == MagickFalse) + clip_mask=DestroyImage(clip_mask); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(),"end clip-path"); + return(clip_mask); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w C o m p o s i t e M a s k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawCompositeMask() draws the mask path and returns it as an image mask. +% +% The format of the DrawCompositeMask method is: +% +% Image *DrawCompositeMask(Image *image,const DrawInfo *draw_info, +% const char *id,const char *mask_path,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o id: the mask path id. +% +% o mask_path: the mask path. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *DrawCompositeMask(Image *image,const DrawInfo *draw_info, + const char *id,const char *mask_path,ExceptionInfo *exception) +{ + Image + *composite_mask; + + DrawInfo + *clone_info; + + MagickStatusType + status; + + /* + Draw a mask path. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(draw_info != (const DrawInfo *) NULL); + composite_mask=AcquireImage((const ImageInfo *) NULL); + status=SetImageExtent(composite_mask,image->columns,image->rows); + if (status == MagickFalse) + return(DestroyImage(composite_mask)); + status=SetImageMask(image,(Image *) NULL); + status=QueryColorCompliance("#0000",AllCompliance, + &composite_mask->background_color,exception); + composite_mask->background_color.opacity=(Quantum) TransparentOpacity; + (void) SetImageBackgroundColor(composite_mask); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(),"\nbegin mask-path %s", + id); + clone_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + (void) CloneString(&clone_info->primitive,mask_path); + status=QueryColorCompliance("#ffffff",AllCompliance,&clone_info->fill, + exception); + status=QueryColorCompliance("#00000000",AllCompliance,&clone_info->stroke, + exception); + clone_info->stroke_width=0.0; + clone_info->opacity=OpaqueOpacity; + status=RenderMVGContent(composite_mask,clone_info,0); + clone_info=DestroyDrawInfo(clone_info); + status&=SeparateImageChannel(composite_mask,TrueAlphaChannel); + status&=NegateImage(composite_mask,MagickFalse); + if (status == MagickFalse) + composite_mask=DestroyImage(composite_mask); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(),"end mask-path"); + return(composite_mask); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D r a w D a s h P o l y g o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawDashPolygon() draws a dashed polygon (line, rectangle, ellipse) on the +% image while respecting the dash offset and dash pattern attributes. +% +% The format of the DrawDashPolygon method is: +% +% MagickBooleanType DrawDashPolygon(const DrawInfo *draw_info, +% const PrimitiveInfo *primitive_info,Image *image) +% +% A description of each parameter follows: +% +% o draw_info: the draw info. +% +% o primitive_info: Specifies a pointer to a PrimitiveInfo structure. +% +% o image: the image. +% +% +*/ +static MagickBooleanType DrawDashPolygon(const DrawInfo *draw_info, + const PrimitiveInfo *primitive_info,Image *image) +{ + double + length, + maximum_length, + offset, + scale, + total_length; + + DrawInfo + *clone_info; + + MagickStatusType + status; + + PrimitiveInfo + *dash_polygon; + + double + dx, + dy; + + ssize_t + i; + + size_t + number_vertices; + + ssize_t + j, + n; + + assert(draw_info != (const DrawInfo *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule()," begin draw-dash"); + for (i=0; primitive_info[i].primitive != UndefinedPrimitive; i++) ; + number_vertices=(size_t) i; + dash_polygon=(PrimitiveInfo *) AcquireQuantumMemory((size_t) + (2UL*number_vertices+32UL),sizeof(*dash_polygon)); + if (dash_polygon == (PrimitiveInfo *) NULL) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(MagickFalse); + } + (void) memset(dash_polygon,0,(2UL*number_vertices+32UL)* + sizeof(*dash_polygon)); + clone_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + clone_info->miterlimit=0; + dash_polygon[0]=primitive_info[0]; + scale=ExpandAffine(&draw_info->affine); + length=scale*draw_info->dash_pattern[0]; + offset=fabs(draw_info->dash_offset) >= MagickEpsilon ? + scale*draw_info->dash_offset : 0.0; + j=1; + for (n=0; offset > 0.0; j=0) + { + if (draw_info->dash_pattern[n] <= 0.0) + break; + length=scale*(draw_info->dash_pattern[n]+(n == 0 ? -0.5 : 0.5)); + if (offset > length) + { + offset-=length; + n++; + length=scale*draw_info->dash_pattern[n]; + continue; + } + if (offset < length) + { + length-=offset; + offset=0.0; + break; + } + offset=0.0; + n++; + } + status=MagickTrue; + maximum_length=0.0; + total_length=0.0; + for (i=1; (i < (ssize_t) number_vertices) && (length >= 0.0); i++) + { + dx=primitive_info[i].point.x-primitive_info[i-1].point.x; + dy=primitive_info[i].point.y-primitive_info[i-1].point.y; + maximum_length=hypot(dx,dy); + if (maximum_length > (double) (MaxBezierCoordinates >> 2)) + continue; + if (fabs(length) < MagickEpsilon) + { + if (fabs(draw_info->dash_pattern[n]) >= MagickEpsilon) + n++; + if (fabs(draw_info->dash_pattern[n]) < MagickEpsilon) + n=0; + length=scale*draw_info->dash_pattern[n]; + } + for (total_length=0.0; (length >= 0.0) && (maximum_length >= (total_length+length)); ) + { + total_length+=length; + if ((n & 0x01) != 0) + { + dash_polygon[0]=primitive_info[0]; + dash_polygon[0].point.x=(double) (primitive_info[i-1].point.x+dx* + total_length*PerceptibleReciprocal(maximum_length)); + dash_polygon[0].point.y=(double) (primitive_info[i-1].point.y+dy* + total_length*PerceptibleReciprocal(maximum_length)); + j=1; + } + else + { + if ((j+1) > (ssize_t) number_vertices) + break; + dash_polygon[j]=primitive_info[i-1]; + dash_polygon[j].point.x=(double) (primitive_info[i-1].point.x+dx* + total_length*PerceptibleReciprocal(maximum_length)); + dash_polygon[j].point.y=(double) (primitive_info[i-1].point.y+dy* + total_length*PerceptibleReciprocal(maximum_length)); + dash_polygon[j].coordinates=1; + j++; + dash_polygon[0].coordinates=(size_t) j; + dash_polygon[j].primitive=UndefinedPrimitive; + status&=DrawStrokePolygon(image,clone_info,dash_polygon); + if (status == MagickFalse) + break; + } + if (fabs(draw_info->dash_pattern[n]) >= MagickEpsilon) + n++; + if (fabs(draw_info->dash_pattern[n]) < MagickEpsilon) + n=0; + length=scale*draw_info->dash_pattern[n]; + } + length-=(maximum_length-total_length); + if ((n & 0x01) != 0) + continue; + dash_polygon[j]=primitive_info[i]; + dash_polygon[j].coordinates=1; + j++; + } + if ((status != MagickFalse) && (total_length < maximum_length) && + ((n & 0x01) == 0) && (j > 1)) + { + dash_polygon[j]=primitive_info[i-1]; + dash_polygon[j].point.x+=MagickEpsilon; + dash_polygon[j].point.y+=MagickEpsilon; + dash_polygon[j].coordinates=1; + j++; + dash_polygon[0].coordinates=(size_t) j; + dash_polygon[j].primitive=UndefinedPrimitive; + status&=DrawStrokePolygon(image,clone_info,dash_polygon); + } + dash_polygon=(PrimitiveInfo *) RelinquishMagickMemory(dash_polygon); + clone_info=DestroyDrawInfo(clone_info); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule()," end draw-dash"); + return(status != 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G r a d i e n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGradientImage() draws a linear gradient on the image. +% +% The format of the DrawGradientImage method is: +% +% MagickBooleanType DrawGradientImage(Image *image, +% const DrawInfo *draw_info) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +*/ + +static inline double GetStopColorOffset(const GradientInfo *gradient, + const ssize_t x,const ssize_t y) +{ + switch (gradient->type) + { + case UndefinedGradient: + case LinearGradient: + { + double + gamma, + length, + offset, + scale; + + PointInfo + p, + q; + + const SegmentInfo + *gradient_vector; + + gradient_vector=(&gradient->gradient_vector); + p.x=gradient_vector->x2-gradient_vector->x1; + p.y=gradient_vector->y2-gradient_vector->y1; + q.x=(double) x-gradient_vector->x1; + q.y=(double) y-gradient_vector->y1; + length=sqrt(q.x*q.x+q.y*q.y); + gamma=sqrt(p.x*p.x+p.y*p.y)*length; + gamma=PerceptibleReciprocal(gamma); + scale=p.x*q.x+p.y*q.y; + offset=gamma*scale*length; + return(offset); + } + case RadialGradient: + { + PointInfo + v; + + if (gradient->spread == RepeatSpread) + { + v.x=(double) x-gradient->center.x; + v.y=(double) y-gradient->center.y; + return(sqrt(v.x*v.x+v.y*v.y)); + } + v.x=(double) (((x-gradient->center.x)*cos(DegreesToRadians( + gradient->angle)))+((y-gradient->center.y)*sin(DegreesToRadians( + gradient->angle))))*PerceptibleReciprocal(gradient->radii.x); + v.y=(double) (((x-gradient->center.x)*sin(DegreesToRadians( + gradient->angle)))-((y-gradient->center.y)*cos(DegreesToRadians( + gradient->angle))))*PerceptibleReciprocal(gradient->radii.y); + return(sqrt(v.x*v.x+v.y*v.y)); + } + } + return(0.0); +} + +MagickExport MagickBooleanType DrawGradientImage(Image *image, + const DrawInfo *draw_info) +{ + CacheView + *image_view; + + const GradientInfo + *gradient; + + const SegmentInfo + *gradient_vector; + + double + length; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickPixelPacket + zero; + + PointInfo + point; + + RectangleInfo + bounding_box; + + ssize_t + y; + + /* + Draw linear or radial gradient on image. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(draw_info != (const DrawInfo *) NULL); + gradient=(&draw_info->gradient); + gradient_vector=(&gradient->gradient_vector); + point.x=gradient_vector->x2-gradient_vector->x1; + point.y=gradient_vector->y2-gradient_vector->y1; + length=sqrt(point.x*point.x+point.y*point.y); + bounding_box=gradient->bounding_box; + status=MagickTrue; + exception=(&image->exception); + GetMagickPixelPacket(image,&zero); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,bounding_box.height-bounding_box.y,1) +#endif + for (y=bounding_box.y; y < (ssize_t) bounding_box.height; y++) + { + double + alpha, + offset; + + MagickPixelPacket + composite, + pixel; + + IndexPacket + *magick_restrict indexes; + + ssize_t + i, + x; + + PixelPacket + *magick_restrict q; + + ssize_t + j; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + pixel=zero; + composite=zero; + offset=GetStopColorOffset(gradient,0,y); + if (gradient->type != RadialGradient) + offset*=PerceptibleReciprocal(length); + for (x=bounding_box.x; x < (ssize_t) bounding_box.width; x++) + { + SetMagickPixelPacket(image,q,indexes+x,&pixel); + switch (gradient->spread) + { + case UndefinedSpread: + case PadSpread: + { + if ((x != CastDoubleToLong(ceil(gradient_vector->x1-0.5))) || + (y != CastDoubleToLong(ceil(gradient_vector->y1-0.5)))) + { + offset=GetStopColorOffset(gradient,x,y); + if (gradient->type != RadialGradient) + offset*=PerceptibleReciprocal(length); + } + for (i=0; i < (ssize_t) gradient->number_stops; i++) + if (offset < gradient->stops[i].offset) + break; + if ((offset < 0.0) || (i == 0)) + composite=gradient->stops[0].color; + else + if ((offset > 1.0) || (i == (ssize_t) gradient->number_stops)) + composite=gradient->stops[gradient->number_stops-1].color; + else + { + j=i; + i--; + alpha=(offset-gradient->stops[i].offset)/ + (gradient->stops[j].offset-gradient->stops[i].offset); + MagickPixelCompositeBlend(&gradient->stops[i].color,1.0-alpha, + &gradient->stops[j].color,alpha,&composite); + } + break; + } + case ReflectSpread: + { + if ((x != CastDoubleToLong(ceil(gradient_vector->x1-0.5))) || + (y != CastDoubleToLong(ceil(gradient_vector->y1-0.5)))) + { + offset=GetStopColorOffset(gradient,x,y); + if (gradient->type != RadialGradient) + offset*=PerceptibleReciprocal(length); + } + if (offset < 0.0) + offset=(-offset); + if ((ssize_t) fmod(offset,2.0) == 0) + offset=fmod(offset,1.0); + else + offset=1.0-fmod(offset,1.0); + for (i=0; i < (ssize_t) gradient->number_stops; i++) + if (offset < gradient->stops[i].offset) + break; + if (i == 0) + composite=gradient->stops[0].color; + else + if (i == (ssize_t) gradient->number_stops) + composite=gradient->stops[gradient->number_stops-1].color; + else + { + j=i; + i--; + alpha=(offset-gradient->stops[i].offset)/ + (gradient->stops[j].offset-gradient->stops[i].offset); + MagickPixelCompositeBlend(&gradient->stops[i].color,1.0-alpha, + &gradient->stops[j].color,alpha,&composite); + } + break; + } + case RepeatSpread: + { + double + repeat; + + MagickBooleanType + antialias; + + antialias=MagickFalse; + repeat=0.0; + if ((x != CastDoubleToLong(ceil(gradient_vector->x1-0.5))) || + (y != CastDoubleToLong(ceil(gradient_vector->y1-0.5)))) + { + offset=GetStopColorOffset(gradient,x,y); + if (gradient->type == LinearGradient) + { + repeat=fmod(offset,length); + if (repeat < 0.0) + repeat=length-fmod(-repeat,length); + else + repeat=fmod(offset,length); + antialias=(repeat < length) && ((repeat+1.0) > length) ? + MagickTrue : MagickFalse; + offset=PerceptibleReciprocal(length)*repeat; + } + else + { + repeat=fmod(offset,(double) gradient->radius); + if (repeat < 0.0) + repeat=gradient->radius-fmod(-repeat, + (double) gradient->radius); + else + repeat=fmod(offset,(double) gradient->radius); + antialias=repeat+1.0 > gradient->radius ? MagickTrue : + MagickFalse; + offset=repeat*PerceptibleReciprocal(gradient->radius); + } + } + for (i=0; i < (ssize_t) gradient->number_stops; i++) + if (offset < gradient->stops[i].offset) + break; + if (i == 0) + composite=gradient->stops[0].color; + else + if (i == (ssize_t) gradient->number_stops) + composite=gradient->stops[gradient->number_stops-1].color; + else + { + j=i; + i--; + alpha=(offset-gradient->stops[i].offset)/ + (gradient->stops[j].offset-gradient->stops[i].offset); + if (antialias != MagickFalse) + { + if (gradient->type == LinearGradient) + alpha=length-repeat; + else + alpha=gradient->radius-repeat; + i=0; + j=(ssize_t) gradient->number_stops-1L; + } + MagickPixelCompositeBlend(&gradient->stops[i].color,1.0-alpha, + &gradient->stops[j].color,alpha,&composite); + } + break; + } + } + MagickPixelCompositeOver(&composite,composite.opacity,&pixel, + pixel.opacity,&pixel); + SetPixelPacket(image,&pixel,q,indexes+x); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawImage() draws a graphic primitive on your image. The primitive +% may be represented as a string or filename. Precede the filename with an +% "at" sign (@) and the contents of the file are drawn on the image. You +% can affect how text is drawn by setting one or more members of the draw +% info structure. +% +% The format of the DrawImage method is: +% +% MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +*/ + +static MagickBooleanType CheckPrimitiveExtent(MVGInfo *mvg_info, + const double pad) +{ + char + *text = (char *) NULL; + + double + extent; + + size_t + quantum; + + ssize_t + i; + + /* + Check if there is enough storage for drawing primitives. + */ + quantum=sizeof(**mvg_info->primitive_info); + extent=(double) mvg_info->offset+pad+(PrimitiveExtentPad+1)*quantum; + if (extent <= (double) *mvg_info->extent) + return(MagickTrue); + if ((extent >= (double) MAGICK_SSIZE_MAX) || (IsNaN(extent) != 0)) + return(MagickFalse); + for (i=0; i < mvg_info->offset; i++) + if (((*mvg_info->primitive_info)[i].primitive == TextPrimitive) || + ((*mvg_info->primitive_info)[i].primitive == ImagePrimitive)) + if ((*mvg_info->primitive_info)[i].text != (char *) NULL) + text=(*mvg_info->primitive_info)[i].text; + *mvg_info->primitive_info=(PrimitiveInfo *) ResizeQuantumMemory( + *mvg_info->primitive_info,(size_t) (extent+1),quantum); + if (*mvg_info->primitive_info != (PrimitiveInfo *) NULL) + { + *mvg_info->extent=(size_t) extent; + for (i=mvg_info->offset+1; i <= (ssize_t) extent; i++) + { + (*mvg_info->primitive_info)[i].primitive=UndefinedPrimitive; + (*mvg_info->primitive_info)[i].text=(char *) NULL; + } + return(MagickTrue); + } + /* + Reallocation failed, allocate a primitive to facilitate unwinding. + */ + (void) ThrowMagickException(mvg_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + *mvg_info->primitive_info=(PrimitiveInfo *) AcquireCriticalMemory((size_t) + (PrimitiveExtentPad+1)*quantum); + (void) memset(*mvg_info->primitive_info,0,(size_t) ((PrimitiveExtentPad+1)* + quantum)); + *mvg_info->extent=1; + (*mvg_info->primitive_info)[0].text=text; + mvg_info->offset=0; + return(MagickFalse); +} + +static inline double GetDrawValue(const char *magick_restrict string, + char **magick_restrict sentinal) +{ + char + **magick_restrict q; + + double + value; + + q=sentinal; + value=InterpretLocaleValue(string,q); + sentinal=q; + return(value); +} + +static int MVGMacroCompare(const void *target,const void *source) +{ + const char + *p, + *q; + + p=(const char *) target; + q=(const char *) source; + return(strcmp(p,q)); +} + +static SplayTreeInfo *GetMVGMacros(const char *primitive) +{ + char + *macro, + *token; + + const char + *q; + + size_t + extent; + + SplayTreeInfo + *macros; + + /* + Scan graphic primitives for definitions and classes. + */ + if (primitive == (const char *) NULL) + return((SplayTreeInfo *) NULL); + macros=NewSplayTree(MVGMacroCompare,RelinquishMagickMemory, + RelinquishMagickMemory); + macro=AcquireString(primitive); + token=AcquireString(primitive); + extent=strlen(token)+MagickPathExtent; + for (q=primitive; *q != '\0'; ) + { + if (GetNextToken(q,&q,extent,token) < 1) + break; + if (*token == '\0') + break; + if (LocaleCompare("push",token) == 0) + { + const char + *end, + *start; + + (void) GetNextToken(q,&q,extent,token); + if (*q == '"') + { + char + name[MagickPathExtent]; + + const char + *p; + + ssize_t + n; + + /* + Named macro (e.g. push graphic-context "wheel"). + */ + (void) GetNextToken(q,&q,extent,token); + start=q; + end=q; + (void) CopyMagickString(name,token,MagickPathExtent); + n=1; + for (p=q; *p != '\0'; ) + { + if (GetNextToken(p,&p,extent,token) < 1) + break; + if (*token == '\0') + break; + if (LocaleCompare(token,"pop") == 0) + { + end=p-strlen(token)-1; + n--; + } + if (LocaleCompare(token,"push") == 0) + n++; + if ((n == 0) && (end > start)) + { + /* + Extract macro. + */ + (void) GetNextToken(p,&p,extent,token); + (void) CopyMagickString(macro,start,(size_t) (end-start)); + (void) AddValueToSplayTree(macros,ConstantString(name), + ConstantString(macro)); + break; + } + } + } + } + } + token=DestroyString(token); + macro=DestroyString(macro); + return(macros); +} + +static inline MagickBooleanType IsPoint(const char *point) +{ + char + *p; + + double + value; + + value=GetDrawValue(point,&p); + return((fabs(value) < MagickEpsilon) && (p == point) ? MagickFalse : + MagickTrue); +} + +static inline MagickBooleanType TracePoint(PrimitiveInfo *primitive_info, + const PointInfo point) +{ + primitive_info->coordinates=1; + primitive_info->closed_subpath=MagickFalse; + primitive_info->point=point; + return(MagickTrue); +} + +static MagickBooleanType RenderMVGContent(Image *image, + const DrawInfo *draw_info,const size_t depth) +{ +#define RenderImageTag "Render/Image" + + AffineMatrix + affine, + current; + + char + key[2*MaxTextExtent], + keyword[MaxTextExtent], + geometry[MaxTextExtent], + name[MaxTextExtent], + *next_token, + pattern[MaxTextExtent], + *primitive, + *token; + + const char + *q; + + double + angle, + coordinates, + cursor, + factor, + primitive_extent; + + DrawInfo + *clone_info, + **graphic_context; + + MagickBooleanType + proceed; + + MagickStatusType + status; + + MVGInfo + mvg_info; + + PointInfo + point; + + PixelPacket + start_color; + + PrimitiveInfo + *primitive_info; + + PrimitiveType + primitive_type; + + const char + *p; + + ssize_t + i, + x; + + SegmentInfo + bounds; + + size_t + extent, + number_points; + + SplayTreeInfo + *macros; + + ssize_t + defsDepth, + j, + k, + n, + symbolDepth; + + TypeMetric + metrics; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(draw_info != (DrawInfo *) NULL); + assert(draw_info->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + if (depth > MagickMaxRecursionDepth) + ThrowBinaryImageException(DrawError,"VectorGraphicsNestedTooDeeply", + image->filename); + if ((draw_info->primitive == (char *) NULL) || + (*draw_info->primitive == '\0')) + return(MagickFalse); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(),"begin draw-image"); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + if (image->matte == MagickFalse) + { + status=SetImageAlphaChannel(image,OpaqueAlphaChannel); + if (status == MagickFalse) + return(MagickFalse); + } + primitive=(char *) NULL; + if ((*draw_info->primitive == '@') && (strlen(draw_info->primitive) > 1) && + (*(draw_info->primitive+1) != '-') && (depth == 0)) + primitive=FileToString(draw_info->primitive+1,~0UL,&image->exception); + else + primitive=AcquireString(draw_info->primitive); + if (primitive == (char *) NULL) + return(MagickFalse); + primitive_extent=(double) strlen(primitive); + (void) SetImageArtifact(image,"mvg:vector-graphics",primitive); + n=0; + /* + Allocate primitive info memory. + */ + graphic_context=(DrawInfo **) AcquireMagickMemory(sizeof(*graphic_context)); + if (graphic_context == (DrawInfo **) NULL) + { + primitive=DestroyString(primitive); + ThrowBinaryImageException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + number_points=(size_t) PrimitiveExtentPad; + primitive_info=(PrimitiveInfo *) AcquireQuantumMemory((size_t) + (number_points+1),sizeof(*primitive_info)); + if (primitive_info == (PrimitiveInfo *) NULL) + { + primitive=DestroyString(primitive); + for ( ; n >= 0; n--) + graphic_context[n]=DestroyDrawInfo(graphic_context[n]); + graphic_context=(DrawInfo **) RelinquishMagickMemory(graphic_context); + ThrowBinaryImageException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + (void) memset(primitive_info,0,(size_t) (number_points+1)* + sizeof(*primitive_info)); + (void) memset(&mvg_info,0,sizeof(mvg_info)); + mvg_info.primitive_info=(&primitive_info); + mvg_info.extent=(&number_points); + mvg_info.exception=(&image->exception); + graphic_context[n]=CloneDrawInfo((ImageInfo *) NULL,draw_info); + graphic_context[n]->viewbox=image->page; + if ((image->page.width == 0) || (image->page.height == 0)) + { + graphic_context[n]->viewbox.width=image->columns; + graphic_context[n]->viewbox.height=image->rows; + } + token=AcquireString(primitive); + extent=strlen(token)+MaxTextExtent; + cursor=0.0; + defsDepth=0; + symbolDepth=0; + macros=GetMVGMacros(primitive); + status=QueryColorDatabase("#000000",&start_color,&image->exception); + for (q=primitive; *q != '\0'; ) + { + /* + Interpret graphic primitive. + */ + if (GetNextToken(q,&q,MaxTextExtent,keyword) < 1) + break; + if (*keyword == '\0') + break; + if (*keyword == '#') + { + /* + Comment. + */ + while ((*q != '\n') && (*q != '\0')) + q++; + continue; + } + p=q-strlen(keyword)-1; + primitive_type=UndefinedPrimitive; + current=graphic_context[n]->affine; + GetAffineMatrix(&affine); + *token='\0'; + switch (*keyword) + { + case ';': + break; + case 'a': + case 'A': + { + if (LocaleCompare("affine",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + affine.sx=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.rx=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.ry=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.sy=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.tx=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.ty=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + if (LocaleCompare("arc",keyword) == 0) + { + primitive_type=ArcPrimitive; + break; + } + status=MagickFalse; + break; + } + case 'b': + case 'B': + { + if (LocaleCompare("bezier",keyword) == 0) + { + primitive_type=BezierPrimitive; + break; + } + if (LocaleCompare("border-color",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + status&=QueryColorDatabase(token,&graphic_context[n]->border_color, + &image->exception); + break; + } + status=MagickFalse; + break; + } + case 'c': + case 'C': + { + if (LocaleCompare("class",keyword) == 0) + { + const char + *mvg_class; + + (void) GetNextToken(q,&q,extent,token); + if (*token == '\0') + { + status=MagickFalse; + break; + } + if (LocaleCompare(token,graphic_context[n]->id) == 0) + break; + mvg_class=(const char *) GetValueFromSplayTree(macros,token); + if ((graphic_context[n]->render != MagickFalse) && + (mvg_class != (const char *) NULL) && (p > primitive)) + { + char + *elements; + + ssize_t + offset; + + /* + Inject class elements in stream. + */ + offset=(ssize_t) (p-primitive); + elements=AcquireString(primitive); + elements[offset]='\0'; + (void) ConcatenateString(&elements,mvg_class); + (void) ConcatenateString(&elements,"\n"); + (void) ConcatenateString(&elements,q); + primitive=DestroyString(primitive); + primitive=elements; + q=primitive+offset; + } + break; + } + if (LocaleCompare("clip-path",keyword) == 0) + { + const char + *clip_path; + + /* + Take a node from within the MVG document, and duplicate it here. + */ + (void) GetNextToken(q,&q,extent,token); + if (*token == '\0') + { + status=MagickFalse; + break; + } + (void) CloneString(&graphic_context[n]->clip_mask,token); + clip_path=(const char *) GetValueFromSplayTree(macros,token); + if (clip_path != (const char *) NULL) + { + if (graphic_context[n]->clipping_mask != (Image *) NULL) + graphic_context[n]->clipping_mask= + DestroyImage(graphic_context[n]->clipping_mask); + graphic_context[n]->clipping_mask=DrawClippingMask(image, + graphic_context[n],token,clip_path,&image->exception); + if (graphic_context[n]->compliance != SVGCompliance) + { + const char + *clip_path; + + clip_path=(const char *) GetValueFromSplayTree(macros, + graphic_context[n]->clip_mask); + if (clip_path != (const char *) NULL) + (void) SetImageArtifact(image, + graphic_context[n]->clip_mask,clip_path); + status&=DrawClipPath(image,graphic_context[n], + graphic_context[n]->clip_mask); + } + } + break; + } + if (LocaleCompare("clip-rule",keyword) == 0) + { + ssize_t + fill_rule; + + (void) GetNextToken(q,&q,extent,token); + fill_rule=ParseCommandOption(MagickFillRuleOptions,MagickFalse, + token); + if (fill_rule == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->fill_rule=(FillRule) fill_rule; + break; + } + if (LocaleCompare("clip-units",keyword) == 0) + { + ssize_t + clip_units; + + (void) GetNextToken(q,&q,extent,token); + clip_units=ParseCommandOption(MagickClipPathOptions,MagickFalse, + token); + if (clip_units == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->clip_units=(ClipPathUnits) clip_units; + if (clip_units == ObjectBoundingBox) + { + GetAffineMatrix(¤t); + affine.sx=draw_info->bounds.x2; + affine.sy=draw_info->bounds.y2; + affine.tx=draw_info->bounds.x1; + affine.ty=draw_info->bounds.y1; + break; + } + break; + } + if (LocaleCompare("circle",keyword) == 0) + { + primitive_type=CirclePrimitive; + break; + } + if (LocaleCompare("color",keyword) == 0) + { + primitive_type=ColorPrimitive; + break; + } + if (LocaleCompare("compliance",keyword) == 0) + { + /* + MVG compliance associates a clipping mask with an image; SVG + compliance associates a clipping mask with a graphics context. + */ + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->compliance=(ComplianceType) ParseCommandOption( + MagickComplianceOptions,MagickFalse,token); + break; + } + if (LocaleCompare("currentColor",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + break; + } + status=MagickFalse; + break; + } + case 'd': + case 'D': + { + if (LocaleCompare("decorate",keyword) == 0) + { + ssize_t + decorate; + + (void) GetNextToken(q,&q,extent,token); + decorate=ParseCommandOption(MagickDecorateOptions,MagickFalse, + token); + if (decorate == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->decorate=(DecorationType) decorate; + break; + } + if (LocaleCompare("density",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) CloneString(&graphic_context[n]->density,token); + break; + } + if (LocaleCompare("direction",keyword) == 0) + { + ssize_t + direction; + + (void) GetNextToken(q,&q,extent,token); + direction=ParseCommandOption(MagickDirectionOptions,MagickFalse, + token); + if (direction == -1) + status=MagickFalse; + else + graphic_context[n]->direction=(DirectionType) direction; + break; + } + status=MagickFalse; + break; + } + case 'e': + case 'E': + { + if (LocaleCompare("ellipse",keyword) == 0) + { + primitive_type=EllipsePrimitive; + break; + } + if (LocaleCompare("encoding",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) CloneString(&graphic_context[n]->encoding,token); + break; + } + status=MagickFalse; + break; + } + case 'f': + case 'F': + { + if (LocaleCompare("fill",keyword) == 0) + { + const char + *mvg_class; + + (void) GetNextToken(q,&q,extent,token); + if (graphic_context[n]->clip_path != MagickFalse) + break; + mvg_class=(const char *) GetValueFromSplayTree(macros,token); + if (mvg_class != (const char *) NULL) + { + (void) DrawPatternPath(image,draw_info,mvg_class, + &graphic_context[n]->fill_pattern); + break; + } + (void) FormatLocaleString(pattern,MaxTextExtent,"%s",token); + if (GetImageArtifact(image,pattern) != (const char *) NULL) + { + (void) DrawPatternPath(image,draw_info,token, + &graphic_context[n]->fill_pattern); + break; + } + status&=QueryColorDatabase(token,&graphic_context[n]->fill, + &image->exception); + if (graphic_context[n]->fill_opacity != OpaqueOpacity) + graphic_context[n]->fill.opacity=ClampToQuantum( + graphic_context[n]->fill_opacity); + break; + } + if (LocaleCompare("fill-opacity",keyword) == 0) + { + double + opacity; + + (void) GetNextToken(q,&q,extent,token); + if (graphic_context[n]->clip_path != MagickFalse) + break; + factor=strchr(token,'%') != (char *) NULL ? 0.01 : 1.0; + opacity=MagickMin(MagickMax(factor* + GetDrawValue(token,&next_token),0.0),1.0); + if (token == next_token) + ThrowPointExpectedException(image,token); + if (graphic_context[n]->compliance == SVGCompliance) + graphic_context[n]->fill_opacity*=(1.0-opacity); + else + graphic_context[n]->fill_opacity=(QuantumRange- + graphic_context[n]->fill_opacity)*(1.0-opacity); + if (graphic_context[n]->fill.opacity != TransparentOpacity) + graphic_context[n]->fill.opacity=(Quantum) + graphic_context[n]->fill_opacity; + else + graphic_context[n]->fill.opacity=ClampToQuantum(QuantumRange* + opacity); + break; + } + if (LocaleCompare("fill-rule",keyword) == 0) + { + ssize_t + fill_rule; + + (void) GetNextToken(q,&q,extent,token); + fill_rule=ParseCommandOption(MagickFillRuleOptions,MagickFalse, + token); + if (fill_rule == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->fill_rule=(FillRule) fill_rule; + break; + } + if (LocaleCompare("font",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) CloneString(&graphic_context[n]->font,token); + if (LocaleCompare("none",token) == 0) + graphic_context[n]->font=(char *) RelinquishMagickMemory( + graphic_context[n]->font); + break; + } + if (LocaleCompare("font-family",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + (void) CloneString(&graphic_context[n]->family,token); + break; + } + if (LocaleCompare("font-size",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->pointsize=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + if (LocaleCompare("font-stretch",keyword) == 0) + { + ssize_t + stretch; + + (void) GetNextToken(q,&q,extent,token); + stretch=ParseCommandOption(MagickStretchOptions,MagickFalse,token); + if (stretch == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->stretch=(StretchType) stretch; + break; + } + if (LocaleCompare("font-style",keyword) == 0) + { + ssize_t + style; + + (void) GetNextToken(q,&q,extent,token); + style=ParseCommandOption(MagickStyleOptions,MagickFalse,token); + if (style == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->style=(StyleType) style; + break; + } + if (LocaleCompare("font-weight",keyword) == 0) + { + ssize_t + weight; + + (void) GetNextToken(q,&q,extent,token); + weight=ParseCommandOption(MagickWeightOptions,MagickFalse,token); + if (weight == -1) + weight=(ssize_t) StringToUnsignedLong(token); + graphic_context[n]->weight=(size_t) weight; + break; + } + status=MagickFalse; + break; + } + case 'g': + case 'G': + { + if (LocaleCompare("gradient-units",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + break; + } + if (LocaleCompare("gravity",keyword) == 0) + { + ssize_t + gravity; + + (void) GetNextToken(q,&q,extent,token); + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,token); + if (gravity == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->gravity=(GravityType) gravity; + break; + } + status=MagickFalse; + break; + } + case 'i': + case 'I': + { + if (LocaleCompare("image",keyword) == 0) + { + ssize_t + compose; + + primitive_type=ImagePrimitive; + (void) GetNextToken(q,&q,extent,token); + compose=ParseCommandOption(MagickComposeOptions,MagickFalse,token); + if (compose == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->compose=(CompositeOperator) compose; + break; + } + if (LocaleCompare("interline-spacing",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->interline_spacing=GetDrawValue(token, + &next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + if (LocaleCompare("interword-spacing",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->interword_spacing=GetDrawValue(token, + &next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + status=MagickFalse; + break; + } + case 'k': + case 'K': + { + if (LocaleCompare("kerning",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->kerning=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + status=MagickFalse; + break; + } + case 'l': + case 'L': + { + if (LocaleCompare("letter-spacing",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + if (IsPoint(token) == MagickFalse) + break; + clone_info=CloneDrawInfo((ImageInfo *) NULL,graphic_context[n]); + clone_info->text=AcquireString(" "); + status&=GetTypeMetrics(image,clone_info,&metrics); + graphic_context[n]->kerning=metrics.width* + GetDrawValue(token,&next_token); + clone_info=DestroyDrawInfo(clone_info); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + if (LocaleCompare("line",keyword) == 0) + { + primitive_type=LinePrimitive; + break; + } + status=MagickFalse; + break; + } + case 'm': + case 'M': + { + if (LocaleCompare("mask",keyword) == 0) + { + const char + *mask_path; + + /* + Take a node from within the MVG document, and duplicate it here. + */ + (void) GetNextToken(q,&q,extent,token); + mask_path=(const char *) GetValueFromSplayTree(macros,token); + if (mask_path != (const char *) NULL) + { + if (graphic_context[n]->composite_mask != (Image *) NULL) + graphic_context[n]->composite_mask= + DestroyImage(graphic_context[n]->composite_mask); + graphic_context[n]->composite_mask=DrawCompositeMask(image, + graphic_context[n],token,mask_path,&image->exception); + if (graphic_context[n]->compliance != SVGCompliance) + status=SetImageMask(image,graphic_context[n]->composite_mask); + } + break; + } + if (LocaleCompare("matte",keyword) == 0) + { + primitive_type=MattePrimitive; + break; + } + status=MagickFalse; + break; + } + case 'o': + case 'O': + { + if (LocaleCompare("offset",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + break; + } + if (LocaleCompare("opacity",keyword) == 0) + { + double + opacity; + + (void) GetNextToken(q,&q,extent,token); + if (graphic_context[n]->clip_path != MagickFalse) + break; + factor=strchr(token,'%') != (char *) NULL ? 0.01 : 1.0; + opacity=MagickMin(MagickMax(factor* + GetDrawValue(token,&next_token),0.0),1.0); + if (token == next_token) + ThrowPointExpectedException(image,token); + if (graphic_context[n]->compliance == SVGCompliance) + { + graphic_context[n]->fill_opacity*=(1.0-opacity); + graphic_context[n]->stroke_opacity*=(1.0-opacity); + } + else + { + graphic_context[n]->fill_opacity=(QuantumRange- + graphic_context[n]->fill_opacity)*(1.0-opacity); + graphic_context[n]->stroke_opacity=(QuantumRange- + graphic_context[n]->stroke_opacity)*(1.0-opacity); + } + break; + } + status=MagickFalse; + break; + } + case 'p': + case 'P': + { + if (LocaleCompare("path",keyword) == 0) + { + primitive_type=PathPrimitive; + break; + } + if (LocaleCompare("point",keyword) == 0) + { + primitive_type=PointPrimitive; + break; + } + if (LocaleCompare("polyline",keyword) == 0) + { + primitive_type=PolylinePrimitive; + break; + } + if (LocaleCompare("polygon",keyword) == 0) + { + primitive_type=PolygonPrimitive; + break; + } + if (LocaleCompare("pop",keyword) == 0) + { + if (GetNextToken(q,&q,extent,token) < 1) + break; + if (LocaleCompare("class",token) == 0) + break; + if (LocaleCompare("clip-path",token) == 0) + break; + if (LocaleCompare("defs",token) == 0) + { + defsDepth--; + graphic_context[n]->render=defsDepth > 0 ? MagickFalse : + MagickTrue; + break; + } + if (LocaleCompare("gradient",token) == 0) + break; + if (LocaleCompare("graphic-context",token) == 0) + { + if (n <= 0) + { + (void) ThrowMagickException(&image->exception, + GetMagickModule(),DrawError, + "UnbalancedGraphicContextPushPop","`%s'",token); + status=MagickFalse; + n=0; + break; + } + if ((graphic_context[n]->clip_mask != (char *) NULL) && + (graphic_context[n]->compliance != SVGCompliance)) + if (LocaleCompare(graphic_context[n]->clip_mask, + graphic_context[n-1]->clip_mask) != 0) + status=SetImageClipMask(image,(Image *) NULL); + graphic_context[n]=DestroyDrawInfo(graphic_context[n]); + n--; + break; + } + if (LocaleCompare("mask",token) == 0) + break; + if (LocaleCompare("pattern",token) == 0) + break; + if (LocaleCompare("symbol",token) == 0) + { + symbolDepth--; + graphic_context[n]->render=symbolDepth > 0 ? MagickFalse : + MagickTrue; + break; + } + status=MagickFalse; + break; + } + if (LocaleCompare("push",keyword) == 0) + { + if (GetNextToken(q,&q,extent,token) < 1) + break; + if (LocaleCompare("class",token) == 0) + { + /* + Class context. + */ + for (p=q; *q != '\0'; ) + { + if (GetNextToken(q,&q,extent,token) < 1) + break; + if (LocaleCompare(token,"pop") != 0) + continue; + (void) GetNextToken(q,(const char **) NULL,extent,token); + if (LocaleCompare(token,"class") != 0) + continue; + break; + } + (void) GetNextToken(q,&q,extent,token); + break; + } + if (LocaleCompare("clip-path",token) == 0) + { + (void) GetNextToken(q,&q,extent,token); + for (p=q; *q != '\0'; ) + { + if (GetNextToken(q,&q,extent,token) < 1) + break; + if (LocaleCompare(token,"pop") != 0) + continue; + (void) GetNextToken(q,(const char **) NULL,extent,token); + if (LocaleCompare(token,"clip-path") != 0) + continue; + break; + } + if ((q == (char *) NULL) || (p == (char *) NULL) || ((q-4) < p)) + { + status=MagickFalse; + break; + } + (void) GetNextToken(q,&q,extent,token); + break; + } + if (LocaleCompare("defs",token) == 0) + { + defsDepth++; + graphic_context[n]->render=defsDepth > 0 ? MagickFalse : + MagickTrue; + break; + } + if (LocaleCompare("gradient",token) == 0) + { + char + key[2*MaxTextExtent], + name[MaxTextExtent], + type[MaxTextExtent]; + + SegmentInfo + segment; + + (void) GetNextToken(q,&q,extent,token); + (void) CopyMagickString(name,token,MaxTextExtent); + (void) GetNextToken(q,&q,extent,token); + (void) CopyMagickString(type,token,MaxTextExtent); + (void) GetNextToken(q,&q,extent,token); + segment.x1=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + segment.y1=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + segment.x2=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + segment.y2=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + if (LocaleCompare(type,"radial") == 0) + { + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + } + for (p=q; *q != '\0'; ) + { + if (GetNextToken(q,&q,extent,token) < 1) + break; + if (LocaleCompare(token,"pop") != 0) + continue; + (void) GetNextToken(q,(const char **) NULL,extent,token); + if (LocaleCompare(token,"gradient") != 0) + continue; + break; + } + if ((q == (char *) NULL) || (p == (char *) NULL) || ((q-4) < p)) + { + status=MagickFalse; + break; + } + (void) CopyMagickString(token,p,(size_t) (q-p-4+1)); + bounds.x1=graphic_context[n]->affine.sx*segment.x1+ + graphic_context[n]->affine.ry*segment.y1+ + graphic_context[n]->affine.tx; + bounds.y1=graphic_context[n]->affine.rx*segment.x1+ + graphic_context[n]->affine.sy*segment.y1+ + graphic_context[n]->affine.ty; + bounds.x2=graphic_context[n]->affine.sx*segment.x2+ + graphic_context[n]->affine.ry*segment.y2+ + graphic_context[n]->affine.tx; + bounds.y2=graphic_context[n]->affine.rx*segment.x2+ + graphic_context[n]->affine.sy*segment.y2+ + graphic_context[n]->affine.ty; + (void) FormatLocaleString(key,MaxTextExtent,"%s",name); + (void) SetImageArtifact(image,key,token); + (void) FormatLocaleString(key,MaxTextExtent,"%s-type",name); + (void) SetImageArtifact(image,key,type); + (void) FormatLocaleString(key,MaxTextExtent,"%s-geometry",name); + (void) FormatLocaleString(geometry,MaxTextExtent, + "%gx%g%+.15g%+.15g", + MagickMax(fabs(bounds.x2-bounds.x1+1.0),1.0), + MagickMax(fabs(bounds.y2-bounds.y1+1.0),1.0), + bounds.x1,bounds.y1); + (void) SetImageArtifact(image,key,geometry); + (void) GetNextToken(q,&q,extent,token); + break; + } + if (LocaleCompare("graphic-context",token) == 0) + { + n++; + graphic_context=(DrawInfo **) ResizeQuantumMemory( + graphic_context,(size_t) (n+1),sizeof(*graphic_context)); + if (graphic_context == (DrawInfo **) NULL) + { + (void) ThrowMagickException(&image->exception, + GetMagickModule(),ResourceLimitError, + "MemoryAllocationFailed","`%s'",image->filename); + break; + } + graphic_context[n]=CloneDrawInfo((ImageInfo *) NULL, + graphic_context[n-1]); + if (*q == '"') + { + (void) GetNextToken(q,&q,extent,token); + (void) CloneString(&graphic_context[n]->id,token); + } + break; + } + if (LocaleCompare("mask",token) == 0) + { + (void) GetNextToken(q,&q,extent,token); + break; + } + if (LocaleCompare("pattern",token) == 0) + { + RectangleInfo + bounds; + + (void) GetNextToken(q,&q,extent,token); + (void) CopyMagickString(name,token,MaxTextExtent); + (void) GetNextToken(q,&q,extent,token); + bounds.x=CastDoubleToLong(ceil(GetDrawValue(token, + &next_token)-0.5)); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + bounds.y=CastDoubleToLong(ceil(GetDrawValue(token, + &next_token)-0.5)); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + bounds.width=(size_t) floor(GetDrawValue(token,&next_token)+ + 0.5); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + bounds.height=(size_t) floor(GetDrawValue(token,&next_token)+ + 0.5); + if (token == next_token) + ThrowPointExpectedException(image,token); + for (p=q; *q != '\0'; ) + { + if (GetNextToken(q,&q,extent,token) < 1) + break; + if (LocaleCompare(token,"pop") != 0) + continue; + (void) GetNextToken(q,(const char **) NULL,extent,token); + if (LocaleCompare(token,"pattern") != 0) + continue; + break; + } + if ((q == (char *) NULL) || (p == (char *) NULL) || ((q-4) < p)) + { + status=MagickFalse; + break; + } + (void) CopyMagickString(token,p,(size_t) (q-p-4+1)); + (void) FormatLocaleString(key,MaxTextExtent,"%s",name); + (void) SetImageArtifact(image,key,token); + (void) FormatLocaleString(key,MaxTextExtent,"%s-geometry",name); + (void) FormatLocaleString(geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) bounds.width,(double) + bounds.height,(double) bounds.x,(double) bounds.y); + (void) SetImageArtifact(image,key,geometry); + (void) GetNextToken(q,&q,extent,token); + break; + } + if (LocaleCompare("symbol",token) == 0) + { + symbolDepth++; + graphic_context[n]->render=symbolDepth > 0 ? MagickFalse : + MagickTrue; + break; + } + status=MagickFalse; + break; + } + status=MagickFalse; + break; + } + case 'r': + case 'R': + { + if (LocaleCompare("rectangle",keyword) == 0) + { + primitive_type=RectanglePrimitive; + break; + } + if (LocaleCompare("rotate",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + angle=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + affine.sx=cos(DegreesToRadians(fmod((double) angle,360.0))); + affine.rx=sin(DegreesToRadians(fmod((double) angle,360.0))); + affine.ry=(-sin(DegreesToRadians(fmod((double) angle,360.0)))); + affine.sy=cos(DegreesToRadians(fmod((double) angle,360.0))); + break; + } + if (LocaleCompare("roundRectangle",keyword) == 0) + { + primitive_type=RoundRectanglePrimitive; + break; + } + status=MagickFalse; + break; + } + case 's': + case 'S': + { + if (LocaleCompare("scale",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + affine.sx=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.sy=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + if (LocaleCompare("skewX",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + angle=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + affine.ry=sin(DegreesToRadians(angle)); + break; + } + if (LocaleCompare("skewY",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + angle=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + affine.rx=(-tan(DegreesToRadians(angle)/2.0)); + break; + } + if (LocaleCompare("stop-color",keyword) == 0) + { + GradientType + type; + + PixelPacket + stop_color; + + (void) GetNextToken(q,&q,extent,token); + status&=QueryColorDatabase(token,&stop_color,&image->exception); + type=LinearGradient; + if (draw_info->gradient.type == RadialGradient) + type=RadialGradient; + (void) GradientImage(image,type,PadSpread,&start_color,&stop_color); + start_color=stop_color; + (void) GetNextToken(q,&q,extent,token); + break; + } + if (LocaleCompare("stroke",keyword) == 0) + { + const char + *mvg_class; + + (void) GetNextToken(q,&q,extent,token); + if (graphic_context[n]->clip_path != MagickFalse) + break; + mvg_class=(const char *) GetValueFromSplayTree(macros,token); + if (mvg_class != (const char *) NULL) + { + (void) DrawPatternPath(image,draw_info,mvg_class, + &graphic_context[n]->stroke_pattern); + break; + } + (void) FormatLocaleString(pattern,MaxTextExtent,"%s",token); + if (GetImageArtifact(image,pattern) != (const char *) NULL) + { + (void) DrawPatternPath(image,draw_info,token, + &graphic_context[n]->stroke_pattern); + break; + } + status&=QueryColorDatabase(token,&graphic_context[n]->stroke, + &image->exception); + if (graphic_context[n]->stroke_opacity != OpaqueOpacity) + graphic_context[n]->stroke.opacity=ClampToQuantum( + graphic_context[n]->stroke_opacity); + break; + } + if (LocaleCompare("stroke-antialias",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->stroke_antialias=StringToLong(token) != 0 ? + MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("stroke-dasharray",keyword) == 0) + { + if (graphic_context[n]->dash_pattern != (double *) NULL) + graphic_context[n]->dash_pattern=(double *) + RelinquishMagickMemory(graphic_context[n]->dash_pattern); + if (IsPoint(q) != MagickFalse) + { + const char + *p; + + p=q; + (void) GetNextToken(p,&p,extent,token); + if (*token == ',') + (void) GetNextToken(p,&p,extent,token); + for (x=0; IsPoint(token) != MagickFalse; x++) + { + (void) GetNextToken(p,&p,extent,token); + if (*token == ',') + (void) GetNextToken(p,&p,extent,token); + } + graphic_context[n]->dash_pattern=(double *) + AcquireQuantumMemory((size_t) (2*x+2), + sizeof(*graphic_context[n]->dash_pattern)); + if (graphic_context[n]->dash_pattern == (double *) NULL) + { + (void) ThrowMagickException(&image->exception, + GetMagickModule(),ResourceLimitError, + "MemoryAllocationFailed","`%s'",image->filename); + status=MagickFalse; + break; + } + (void) memset(graphic_context[n]->dash_pattern,0,(size_t) + (2*x+2)*sizeof(*graphic_context[n]->dash_pattern)); + for (j=0; j < x; j++) + { + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->dash_pattern[j]=GetDrawValue(token, + &next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + if (graphic_context[n]->dash_pattern[j] < 0.0) + status=MagickFalse; + } + if ((x & 0x01) != 0) + for ( ; j < (2*x); j++) + graphic_context[n]->dash_pattern[j]= + graphic_context[n]->dash_pattern[j-x]; + graphic_context[n]->dash_pattern[j]=0.0; + break; + } + (void) GetNextToken(q,&q,extent,token); + break; + } + if (LocaleCompare("stroke-dashoffset",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->dash_offset=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + if (LocaleCompare("stroke-linecap",keyword) == 0) + { + ssize_t + linecap; + + (void) GetNextToken(q,&q,extent,token); + linecap=ParseCommandOption(MagickLineCapOptions,MagickFalse,token); + if (linecap == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->linecap=(LineCap) linecap; + break; + } + if (LocaleCompare("stroke-linejoin",keyword) == 0) + { + ssize_t + linejoin; + + (void) GetNextToken(q,&q,extent,token); + linejoin=ParseCommandOption(MagickLineJoinOptions,MagickFalse, + token); + if (linejoin == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->linejoin=(LineJoin) linejoin; + break; + } + if (LocaleCompare("stroke-miterlimit",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->miterlimit=StringToUnsignedLong(token); + break; + } + if (LocaleCompare("stroke-opacity",keyword) == 0) + { + double + opacity; + + (void) GetNextToken(q,&q,extent,token); + if (graphic_context[n]->clip_path != MagickFalse) + break; + factor=strchr(token,'%') != (char *) NULL ? 0.01 : 1.0; + opacity=MagickMin(MagickMax(factor* + GetDrawValue(token,&next_token),0.0),1.0); + if (token == next_token) + ThrowPointExpectedException(image,token); + if (graphic_context[n]->compliance == SVGCompliance) + graphic_context[n]->stroke_opacity*=(1.0-opacity); + else + graphic_context[n]->stroke_opacity=(QuantumRange- + graphic_context[n]->stroke_opacity)*(1.0-opacity); + if (graphic_context[n]->stroke.opacity != TransparentOpacity) + graphic_context[n]->stroke.opacity=(Quantum) + graphic_context[n]->stroke_opacity; + else + graphic_context[n]->stroke.opacity=ClampToQuantum(QuantumRange* + opacity); + break; + } + if (LocaleCompare("stroke-width",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + if (graphic_context[n]->clip_path != MagickFalse) + break; + graphic_context[n]->stroke_width=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + status=MagickFalse; + break; + } + case 't': + case 'T': + { + if (LocaleCompare("text",keyword) == 0) + { + primitive_type=TextPrimitive; + cursor=0.0; + break; + } + if (LocaleCompare("text-align",keyword) == 0) + { + ssize_t + align; + + (void) GetNextToken(q,&q,extent,token); + align=ParseCommandOption(MagickAlignOptions,MagickFalse,token); + if (align == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->align=(AlignType) align; + break; + } + if (LocaleCompare("text-anchor",keyword) == 0) + { + ssize_t + align; + + (void) GetNextToken(q,&q,extent,token); + align=ParseCommandOption(MagickAlignOptions,MagickFalse,token); + if (align == -1) + { + status=MagickFalse; + break; + } + graphic_context[n]->align=(AlignType) align; + break; + } + if (LocaleCompare("text-antialias",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->text_antialias=StringToLong(token) != 0 ? + MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("text-undercolor",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + status&=QueryColorDatabase(token,&graphic_context[n]->undercolor, + &image->exception); + break; + } + if (LocaleCompare("translate",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + affine.tx=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + affine.ty=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + status=MagickFalse; + break; + } + case 'u': + case 'U': + { + if (LocaleCompare("use",keyword) == 0) + { + const char + *use; + + /* + Get a macro from the MVG document, and "use" it here. + */ + (void) GetNextToken(q,&q,extent,token); + use=(const char *) GetValueFromSplayTree(macros,token); + if (use != (const char *) NULL) + { + clone_info=CloneDrawInfo((ImageInfo *) NULL,graphic_context[n]); + (void) CloneString(&clone_info->primitive,use); + status=RenderMVGContent(image,clone_info,depth+1); + clone_info=DestroyDrawInfo(clone_info); + } + break; + } + status=MagickFalse; + break; + } + case 'v': + case 'V': + { + if (LocaleCompare("viewbox",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->viewbox.x=CastDoubleToLong(ceil( + GetDrawValue(token,&next_token)-0.5)); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->viewbox.y=CastDoubleToLong(ceil( + GetDrawValue(token,&next_token)-0.5)); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->viewbox.width=(size_t) floor(GetDrawValue( + token,&next_token)+0.5); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->viewbox.height=(size_t) floor(GetDrawValue( + token,&next_token)+0.5); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + status=MagickFalse; + break; + } + case 'w': + case 'W': + { + if (LocaleCompare("word-spacing",keyword) == 0) + { + (void) GetNextToken(q,&q,extent,token); + graphic_context[n]->interword_spacing=GetDrawValue(token, + &next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + break; + } + status=MagickFalse; + break; + } + default: + { + status=MagickFalse; + break; + } + } + if (status == MagickFalse) + break; + if ((fabs(affine.sx-1.0) >= MagickEpsilon) || + (fabs(affine.rx) >= MagickEpsilon) || (fabs(affine.ry) >= MagickEpsilon) || + (fabs(affine.sy-1.0) >= MagickEpsilon) || + (fabs(affine.tx) >= MagickEpsilon) || (fabs(affine.ty) >= MagickEpsilon)) + { + graphic_context[n]->affine.sx=current.sx*affine.sx+current.ry*affine.rx; + graphic_context[n]->affine.rx=current.rx*affine.sx+current.sy*affine.rx; + graphic_context[n]->affine.ry=current.sx*affine.ry+current.ry*affine.sy; + graphic_context[n]->affine.sy=current.rx*affine.ry+current.sy*affine.sy; + graphic_context[n]->affine.tx=current.sx*affine.tx+current.ry*affine.ty+ + current.tx; + graphic_context[n]->affine.ty=current.rx*affine.tx+current.sy*affine.ty+ + current.ty; + } + if (primitive_type == UndefinedPrimitive) + { + if ((image->debug != MagickFalse) && (q > p)) + (void) LogMagickEvent(DrawEvent,GetMagickModule()," %.*s",(int) + (q-p-1),p); + continue; + } + /* + Parse the primitive attributes. + */ + for (i=0; primitive_info[i].primitive != UndefinedPrimitive; i++) + if ((primitive_info[i].primitive == TextPrimitive) || + (primitive_info[i].primitive == ImagePrimitive)) + if (primitive_info[i].text != (char *) NULL) + primitive_info[i].text=DestroyString(primitive_info[i].text); + i=0; + mvg_info.offset=i; + j=0; + primitive_info[0].point.x=0.0; + primitive_info[0].point.y=0.0; + primitive_info[0].coordinates=0; + primitive_info[0].method=FloodfillMethod; + primitive_info[0].closed_subpath=MagickFalse; + for (x=0; *q != '\0'; x++) + { + /* + Define points. + */ + if (IsPoint(q) == MagickFalse) + break; + (void) GetNextToken(q,&q,extent,token); + point.x=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,&q,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + point.y=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(q,(const char **) NULL,extent,token); + if (*token == ',') + (void) GetNextToken(q,&q,extent,token); + primitive_info[i].primitive=primitive_type; + primitive_info[i].point=point; + primitive_info[i].coordinates=0; + primitive_info[i].method=FloodfillMethod; + primitive_info[i].closed_subpath=MagickFalse; + i++; + mvg_info.offset=i; + if (i < (ssize_t) number_points) + continue; + status&=CheckPrimitiveExtent(&mvg_info,(double) number_points); + } + if (status == MagickFalse) + break; + primitive_info[j].primitive=primitive_type; + primitive_info[j].coordinates=(size_t) x; + primitive_info[j].method=FloodfillMethod; + primitive_info[j].closed_subpath=MagickFalse; + /* + Circumscribe primitive within a circle. + */ + bounds.x1=primitive_info[j].point.x; + bounds.y1=primitive_info[j].point.y; + bounds.x2=primitive_info[j].point.x; + bounds.y2=primitive_info[j].point.y; + for (k=1; k < (ssize_t) primitive_info[j].coordinates; k++) + { + point=primitive_info[j+k].point; + if (point.x < bounds.x1) + bounds.x1=point.x; + if (point.y < bounds.y1) + bounds.y1=point.y; + if (point.x > bounds.x2) + bounds.x2=point.x; + if (point.y > bounds.y2) + bounds.y2=point.y; + } + /* + Speculate how many points our primitive might consume. + */ + coordinates=(double) primitive_info[j].coordinates; + switch (primitive_type) + { + case RectanglePrimitive: + { + coordinates*=5.0; + break; + } + case RoundRectanglePrimitive: + { + double + alpha, + beta, + radius; + + alpha=bounds.x2-bounds.x1; + beta=bounds.y2-bounds.y1; + radius=hypot(alpha,beta); + coordinates*=5.0; + coordinates+=2.0*((size_t) ceil((double) MagickPI*radius))+6.0* + BezierQuantum+360.0; + break; + } + case BezierPrimitive: + { + coordinates=(BezierQuantum*(double) primitive_info[j].coordinates); + break; + } + case PathPrimitive: + { + char + *s, + *t; + + (void) GetNextToken(q,&q,extent,token); + coordinates=1.0; + t=token; + for (s=token; *s != '\0'; s=t) + { + double + value; + + value=GetDrawValue(s,&t); + (void) value; + if (s == t) + { + t++; + continue; + } + coordinates++; + } + for (s=token; *s != '\0'; s++) + if (strspn(s,"AaCcQqSsTt") != 0) + coordinates+=(20.0*BezierQuantum)+360.0; + break; + } + default: + break; + } + if (status == MagickFalse) + break; + if (((size_t) (i+coordinates)) >= number_points) + { + /* + Resize based on speculative points required by primitive. + */ + number_points+=coordinates+1; + if (number_points < (size_t) coordinates) + { + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + image->filename); + break; + } + mvg_info.offset=i; + status&=CheckPrimitiveExtent(&mvg_info,(double) number_points); + } + status&=CheckPrimitiveExtent(&mvg_info,PrimitiveExtentPad); + if (status == MagickFalse) + break; + mvg_info.offset=j; + switch (primitive_type) + { + case PointPrimitive: + default: + { + if (primitive_info[j].coordinates != 1) + { + status=MagickFalse; + break; + } + status&=TracePoint(primitive_info+j,primitive_info[j].point); + i=(ssize_t) (j+primitive_info[j].coordinates); + break; + } + case LinePrimitive: + { + double + dx, + dy, + maximum_length; + + if (primitive_info[j].coordinates != 2) + { + status=MagickFalse; + break; + } + dx=primitive_info[i].point.x-primitive_info[i-1].point.x; + dy=primitive_info[i].point.y-primitive_info[i-1].point.y; + maximum_length=hypot(dx,dy); + if (maximum_length > (MaxBezierCoordinates/100.0)) + ThrowPointExpectedException(image,keyword); + status&=TraceLine(primitive_info+j,primitive_info[j].point, + primitive_info[j+1].point); + i=(ssize_t) (j+primitive_info[j].coordinates); + break; + } + case RectanglePrimitive: + { + if (primitive_info[j].coordinates != 2) + { + status=MagickFalse; + break; + } + status&=TraceRectangle(primitive_info+j,primitive_info[j].point, + primitive_info[j+1].point); + i=(ssize_t) (j+primitive_info[j].coordinates); + break; + } + case RoundRectanglePrimitive: + { + if (primitive_info[j].coordinates != 3) + { + status=MagickFalse; + break; + } + if ((primitive_info[j+2].point.x < 0.0) || + (primitive_info[j+2].point.y < 0.0)) + { + status=MagickFalse; + break; + } + if ((primitive_info[j+1].point.x-primitive_info[j].point.x) < 0.0) + { + status=MagickFalse; + break; + } + if ((primitive_info[j+1].point.y-primitive_info[j].point.y) < 0.0) + { + status=MagickFalse; + break; + } + status&=TraceRoundRectangle(&mvg_info,primitive_info[j].point, + primitive_info[j+1].point,primitive_info[j+2].point); + i=(ssize_t) (j+primitive_info[j].coordinates); + break; + } + case ArcPrimitive: + { + if (primitive_info[j].coordinates != 3) + { + status=MagickFalse; + break; + } + status&=TraceArc(&mvg_info,primitive_info[j].point, + primitive_info[j+1].point,primitive_info[j+2].point); + i=(ssize_t) (j+primitive_info[j].coordinates); + break; + } + case EllipsePrimitive: + { + if (primitive_info[j].coordinates != 3) + { + status=MagickFalse; + break; + } + if ((primitive_info[j+1].point.x < 0.0) || + (primitive_info[j+1].point.y < 0.0)) + { + status=MagickFalse; + break; + } + status&=TraceEllipse(&mvg_info,primitive_info[j].point, + primitive_info[j+1].point,primitive_info[j+2].point); + i=(ssize_t) (j+primitive_info[j].coordinates); + break; + } + case CirclePrimitive: + { + if (primitive_info[j].coordinates != 2) + { + status=MagickFalse; + break; + } + status&=TraceCircle(&mvg_info,primitive_info[j].point, + primitive_info[j+1].point); + i=(ssize_t) (j+primitive_info[j].coordinates); + break; + } + case PolylinePrimitive: + { + if (primitive_info[j].coordinates < 1) + { + status=MagickFalse; + break; + } + break; + } + case PolygonPrimitive: + { + if (primitive_info[j].coordinates < 3) + { + status=MagickFalse; + break; + } + primitive_info[i]=primitive_info[j]; + primitive_info[i].coordinates=0; + primitive_info[j].coordinates++; + primitive_info[j].closed_subpath=MagickTrue; + i++; + break; + } + case BezierPrimitive: + { + if (primitive_info[j].coordinates < 3) + { + status=MagickFalse; + break; + } + status&=TraceBezier(&mvg_info,primitive_info[j].coordinates); + i=(ssize_t) (j+primitive_info[j].coordinates); + break; + } + case PathPrimitive: + { + coordinates=(double) TracePath(image,&mvg_info,token); + if (coordinates < 0.0) + { + status=MagickFalse; + break; + } + i=(ssize_t) (j+coordinates); + break; + } + case ColorPrimitive: + case MattePrimitive: + { + ssize_t + method; + + if (primitive_info[j].coordinates != 1) + { + status=MagickFalse; + break; + } + (void) GetNextToken(q,&q,extent,token); + method=ParseCommandOption(MagickMethodOptions,MagickFalse,token); + if (method == -1) + { + status=MagickFalse; + break; + } + primitive_info[j].method=(PaintMethod) method; + break; + } + case TextPrimitive: + { + char + geometry[MagickPathExtent]; + + if (primitive_info[j].coordinates != 1) + { + status=MagickFalse; + break; + } + if (*token != ',') + (void) GetNextToken(q,&q,extent,token); + (void) CloneString(&primitive_info[j].text,token); + /* + Compute text cursor offset. + */ + clone_info=CloneDrawInfo((ImageInfo *) NULL,graphic_context[n]); + if ((fabs(mvg_info.point.x-primitive_info->point.x) < MagickEpsilon) && + (fabs(mvg_info.point.y-primitive_info->point.y) < MagickEpsilon)) + { + mvg_info.point=primitive_info->point; + primitive_info->point.x+=cursor; + } + else + { + mvg_info.point=primitive_info->point; + cursor=0.0; + } + (void) FormatLocaleString(geometry,MagickPathExtent,"%+f%+f", + primitive_info->point.x,primitive_info->point.y); + clone_info->render=MagickFalse; + clone_info->text=AcquireString(token); + status&=GetTypeMetrics(image,clone_info,&metrics); + clone_info=DestroyDrawInfo(clone_info); + cursor+=metrics.width; + if (graphic_context[n]->compliance != SVGCompliance) + cursor=0.0; + break; + } + case ImagePrimitive: + { + if (primitive_info[j].coordinates != 2) + { + status=MagickFalse; + break; + } + (void) GetNextToken(q,&q,extent,token); + (void) CloneString(&primitive_info[j].text,token); + break; + } + } + mvg_info.offset=i; + if (status == 0) + break; + primitive_info[i].primitive=UndefinedPrimitive; + if ((image->debug != MagickFalse) && (q > p)) + (void) LogMagickEvent(DrawEvent,GetMagickModule()," %.*s",(int) (q-p),p); + /* + Sanity check. + */ + status&=CheckPrimitiveExtent(&mvg_info,ExpandAffine( + &graphic_context[n]->affine)); + if (status == 0) + break; + status&=CheckPrimitiveExtent(&mvg_info,(double) + graphic_context[n]->stroke_width); + if (status == 0) + break; + if (i == 0) + continue; + /* + Transform points. + */ + for (i=0; primitive_info[i].primitive != UndefinedPrimitive; i++) + { + point=primitive_info[i].point; + primitive_info[i].point.x=graphic_context[n]->affine.sx*point.x+ + graphic_context[n]->affine.ry*point.y+graphic_context[n]->affine.tx; + primitive_info[i].point.y=graphic_context[n]->affine.rx*point.x+ + graphic_context[n]->affine.sy*point.y+graphic_context[n]->affine.ty; + point=primitive_info[i].point; + if (point.x < graphic_context[n]->bounds.x1) + graphic_context[n]->bounds.x1=point.x; + if (point.y < graphic_context[n]->bounds.y1) + graphic_context[n]->bounds.y1=point.y; + if (point.x > graphic_context[n]->bounds.x2) + graphic_context[n]->bounds.x2=point.x; + if (point.y > graphic_context[n]->bounds.y2) + graphic_context[n]->bounds.y2=point.y; + if (primitive_info[i].primitive == ImagePrimitive) + break; + if (i >= (ssize_t) number_points) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + } + if (graphic_context[n]->render != MagickFalse) + { + if ((n != 0) && (graphic_context[n]->compliance != SVGCompliance) && + (graphic_context[n]->clip_mask != (char *) NULL) && + (LocaleCompare(graphic_context[n]->clip_mask, + graphic_context[n-1]->clip_mask) != 0)) + { + const char + *clip_path; + + clip_path=(const char *) GetValueFromSplayTree(macros, + graphic_context[n]->clip_mask); + if (clip_path != (const char *) NULL) + (void) SetImageArtifact(image,graphic_context[n]->clip_mask, + clip_path); + status&=DrawClipPath(image,graphic_context[n], + graphic_context[n]->clip_mask); + } + status&=DrawPrimitive(image,graphic_context[n],primitive_info); + } + proceed=SetImageProgress(image,RenderImageTag,q-primitive,(MagickSizeType) + primitive_extent); + if (proceed == MagickFalse) + break; + if (status == 0) + break; + } + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(),"end draw-image"); + /* + Relinquish resources. + */ + macros=DestroySplayTree(macros); + token=DestroyString(token); + if (primitive_info != (PrimitiveInfo *) NULL) + { + for (i=0; primitive_info[i].primitive != UndefinedPrimitive; i++) + if ((primitive_info[i].primitive == TextPrimitive) || + (primitive_info[i].primitive == ImagePrimitive)) + if (primitive_info[i].text != (char *) NULL) + primitive_info[i].text=DestroyString(primitive_info[i].text); + primitive_info=(PrimitiveInfo *) RelinquishMagickMemory(primitive_info); + } + primitive=DestroyString(primitive); + for ( ; n >= 0; n--) + graphic_context[n]=DestroyDrawInfo(graphic_context[n]); + graphic_context=(DrawInfo **) RelinquishMagickMemory(graphic_context); + if (status == MagickFalse) + ThrowBinaryImageException(DrawError, + "NonconformingDrawingPrimitiveDefinition",keyword); + return(status != 0 ? MagickTrue : MagickFalse); +} + +MagickExport MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info) +{ + return(RenderMVGContent(image,draw_info,0)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t t e r n P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPatternPath() draws a pattern. +% +% The format of the DrawPatternPath method is: +% +% MagickBooleanType DrawPatternPath(Image *image,const DrawInfo *draw_info, +% const char *name,Image **pattern) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o name: the pattern name. +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType DrawPatternPath(Image *image, + const DrawInfo *draw_info,const char *name,Image **pattern) +{ + char + property[MaxTextExtent]; + + const char + *geometry, + *path, + *type; + + DrawInfo + *clone_info; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(draw_info != (const DrawInfo *) NULL); + assert(name != (const char *) NULL); + (void) FormatLocaleString(property,MaxTextExtent,"%s",name); + path=GetImageArtifact(image,property); + if (path == (const char *) NULL) + return(MagickFalse); + (void) FormatLocaleString(property,MaxTextExtent,"%s-geometry",name); + geometry=GetImageArtifact(image,property); + if (geometry == (const char *) NULL) + return(MagickFalse); + if ((*pattern) != (Image *) NULL) + *pattern=DestroyImage(*pattern); + image_info=AcquireImageInfo(); + image_info->size=AcquireString(geometry); + *pattern=AcquireImage(image_info); + image_info=DestroyImageInfo(image_info); + (void) QueryColorDatabase("#00000000",&(*pattern)->background_color, + &image->exception); + (void) SetImageBackgroundColor(*pattern); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + "begin pattern-path %s %s",name,geometry); + clone_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + if (clone_info->fill_pattern != (Image *) NULL) + clone_info->fill_pattern=DestroyImage(clone_info->fill_pattern); + if (clone_info->stroke_pattern != (Image *) NULL) + clone_info->stroke_pattern=DestroyImage(clone_info->stroke_pattern); + (void) FormatLocaleString(property,MaxTextExtent,"%s-type",name); + type=GetImageArtifact(image,property); + if (type != (const char *) NULL) + clone_info->gradient.type=(GradientType) ParseCommandOption( + MagickGradientOptions,MagickFalse,type); + (void) CloneString(&clone_info->primitive,path); + status=RenderMVGContent(*pattern,clone_info,0); + clone_info=DestroyDrawInfo(clone_info); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(),"end pattern-path"); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D r a w P o l y g o n P r i m i t i v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPolygonPrimitive() draws a polygon on the image. +% +% The format of the DrawPolygonPrimitive method is: +% +% MagickBooleanType DrawPolygonPrimitive(Image *image, +% const DrawInfo *draw_info,const PrimitiveInfo *primitive_info) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o primitive_info: Specifies a pointer to a PrimitiveInfo structure. +% +*/ + +static PolygonInfo **DestroyPolygonTLS(PolygonInfo **polygon_info) +{ + ssize_t + i; + + assert(polygon_info != (PolygonInfo **) NULL); + for (i=0; i < (ssize_t) GetMagickResourceLimit(ThreadResource); i++) + if (polygon_info[i] != (PolygonInfo *) NULL) + polygon_info[i]=DestroyPolygonInfo(polygon_info[i]); + polygon_info=(PolygonInfo **) RelinquishMagickMemory(polygon_info); + return(polygon_info); +} + +static PolygonInfo **AcquirePolygonTLS(const DrawInfo *draw_info, + const PrimitiveInfo *primitive_info,ExceptionInfo *exception) +{ + PathInfo + *magick_restrict path_info; + + PolygonInfo + **polygon_info; + + size_t + number_threads; + + number_threads=(size_t) GetMagickResourceLimit(ThreadResource); + polygon_info=(PolygonInfo **) AcquireQuantumMemory(number_threads, + sizeof(*polygon_info)); + if (polygon_info == (PolygonInfo **) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return((PolygonInfo **) NULL); + } + (void) memset(polygon_info,0,number_threads*sizeof(*polygon_info)); + path_info=ConvertPrimitiveToPath(draw_info,primitive_info,exception); + if (path_info == (PathInfo *) NULL) + return(DestroyPolygonTLS(polygon_info)); + polygon_info[0]=ConvertPathToPolygon(path_info,exception); + if (polygon_info[0] == (PolygonInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(DestroyPolygonTLS(polygon_info)); + } + path_info=(PathInfo *) RelinquishMagickMemory(path_info); + return(polygon_info); +} + +static MagickBooleanType AcquirePolygonEdgesTLS(PolygonInfo **polygon_info, + const size_t number_threads,ExceptionInfo *exception) +{ + ssize_t + i; + + for (i=1; i < (ssize_t) number_threads; i++) + { + EdgeInfo + *edge_info; + + ssize_t + j; + + polygon_info[i]=(PolygonInfo *) AcquireMagickMemory( + sizeof(*polygon_info[i])); + if (polygon_info[i] == (PolygonInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(MagickFalse); + } + polygon_info[i]->number_edges=0; + edge_info=polygon_info[0]->edges; + polygon_info[i]->edges=(EdgeInfo *) AcquireQuantumMemory( + polygon_info[0]->number_edges,sizeof(*edge_info)); + if (polygon_info[i]->edges == (EdgeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(MagickFalse); + } + (void) memcpy(polygon_info[i]->edges,edge_info, + polygon_info[0]->number_edges*sizeof(*edge_info)); + for (j=0; j < (ssize_t) polygon_info[i]->number_edges; j++) + polygon_info[i]->edges[j].points=(PointInfo *) NULL; + polygon_info[i]->number_edges=polygon_info[0]->number_edges; + for (j=0; j < (ssize_t) polygon_info[i]->number_edges; j++) + { + edge_info=polygon_info[0]->edges+j; + polygon_info[i]->edges[j].points=(PointInfo *) AcquireQuantumMemory( + edge_info->number_points,sizeof(*edge_info)); + if (polygon_info[i]->edges[j].points == (PointInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(MagickFalse); + } + (void) memcpy(polygon_info[i]->edges[j].points,edge_info->points, + edge_info->number_points*sizeof(*edge_info->points)); + } + } + return(MagickTrue); +} + +static size_t DestroyEdge(PolygonInfo *polygon_info,const ssize_t edge) +{ + assert(edge < (ssize_t) polygon_info->number_edges); + polygon_info->edges[edge].points=(PointInfo *) RelinquishMagickMemory( + polygon_info->edges[edge].points); + polygon_info->number_edges--; + if (edge < (ssize_t) polygon_info->number_edges) + (void) memmove(polygon_info->edges+edge,polygon_info->edges+edge+1, + (size_t) (polygon_info->number_edges-edge)*sizeof(*polygon_info->edges)); + return(polygon_info->number_edges); +} + +static double GetOpacityPixel(PolygonInfo *polygon_info,const double mid, + const MagickBooleanType fill,const FillRule fill_rule,const ssize_t x, + const ssize_t y,double *stroke_opacity) +{ + double + alpha, + beta, + distance, + subpath_opacity; + + PointInfo + delta; + + EdgeInfo + *p; + + const PointInfo + *q; + + ssize_t + i; + + ssize_t + j, + winding_number; + + /* + Compute fill & stroke opacity for this (x,y) point. + */ + *stroke_opacity=0.0; + subpath_opacity=0.0; + p=polygon_info->edges; + for (j=0; j < (ssize_t) polygon_info->number_edges; j++, p++) + { + if ((double) y <= (p->bounds.y1-mid-0.5)) + break; + if ((double) y > (p->bounds.y2+mid+0.5)) + { + p--; + (void) DestroyEdge(polygon_info,j--); + continue; + } + if (((double) x <= (p->bounds.x1-mid-0.5)) || + ((double) x > (p->bounds.x2+mid+0.5))) + continue; + i=(ssize_t) MagickMax((double) p->highwater,1.0); + for ( ; i < (ssize_t) p->number_points; i++) + { + if ((double) y <= (p->points[i-1].y-mid-0.5)) + break; + if ((double) y > (p->points[i].y+mid+0.5)) + continue; + if (p->scanline != (double) y) + { + p->scanline=(double) y; + p->highwater=(size_t) i; + } + /* + Compute distance between a point and an edge. + */ + q=p->points+i-1; + delta.x=(q+1)->x-q->x; + delta.y=(q+1)->y-q->y; + beta=delta.x*(x-q->x)+delta.y*(y-q->y); + if (beta <= 0.0) + { + delta.x=(double) x-q->x; + delta.y=(double) y-q->y; + distance=delta.x*delta.x+delta.y*delta.y; + } + else + { + alpha=delta.x*delta.x+delta.y*delta.y; + if (beta >= alpha) + { + delta.x=(double) x-(q+1)->x; + delta.y=(double) y-(q+1)->y; + distance=delta.x*delta.x+delta.y*delta.y; + } + else + { + alpha=PerceptibleReciprocal(alpha); + beta=delta.x*(y-q->y)-delta.y*(x-q->x); + distance=alpha*beta*beta; + } + } + /* + Compute stroke & subpath opacity. + */ + beta=0.0; + if (p->ghostline == MagickFalse) + { + alpha=mid+0.5; + if ((*stroke_opacity < 1.0) && + (distance <= ((alpha+0.25)*(alpha+0.25)))) + { + alpha=mid-0.5; + if (distance <= ((alpha+0.25)*(alpha+0.25))) + *stroke_opacity=1.0; + else + { + beta=1.0; + if (fabs(distance-1.0) >= MagickEpsilon) + beta=sqrt((double) distance); + alpha=beta-mid-0.5; + if (*stroke_opacity < ((alpha-0.25)*(alpha-0.25))) + *stroke_opacity=(alpha-0.25)*(alpha-0.25); + } + } + } + if ((fill == MagickFalse) || (distance > 1.0) || (subpath_opacity >= 1.0)) + continue; + if (distance <= 0.0) + { + subpath_opacity=1.0; + continue; + } + if (distance > 1.0) + continue; + if (fabs(beta) < MagickEpsilon) + { + beta=1.0; + if (fabs(distance-1.0) >= MagickEpsilon) + beta=sqrt(distance); + } + alpha=beta-1.0; + if (subpath_opacity < (alpha*alpha)) + subpath_opacity=alpha*alpha; + } + } + /* + Compute fill opacity. + */ + if (fill == MagickFalse) + return(0.0); + if (subpath_opacity >= 1.0) + return(1.0); + /* + Determine winding number. + */ + winding_number=0; + p=polygon_info->edges; + for (j=0; j < (ssize_t) polygon_info->number_edges; j++, p++) + { + if ((double) y <= p->bounds.y1) + break; + if (((double) y > p->bounds.y2) || ((double) x <= p->bounds.x1)) + continue; + if ((double) x > p->bounds.x2) + { + winding_number+=p->direction != 0 ? 1 : -1; + continue; + } + i=(ssize_t) MagickMax((double) p->highwater,1.0); + for ( ; i < (ssize_t) (p->number_points-1); i++) + if ((double) y <= p->points[i].y) + break; + q=p->points+i-1; + if ((((q+1)->x-q->x)*(y-q->y)) <= (((q+1)->y-q->y)*(x-q->x))) + winding_number+=p->direction != 0 ? 1 : -1; + } + if (fill_rule != NonZeroRule) + { + if ((MagickAbsoluteValue(winding_number) & 0x01) != 0) + return(1.0); + } + else + if (MagickAbsoluteValue(winding_number) != 0) + return(1.0); + return(subpath_opacity); +} + +static MagickBooleanType DrawPolygonPrimitive(Image *image, + const DrawInfo *draw_info,const PrimitiveInfo *primitive_info) +{ + typedef struct _ExtentInfo + { + ssize_t + x1, + y1, + x2, + y2; + } ExtentInfo; + + CacheView + *image_view; + + const char + *artifact; + + double + mid; + + ExceptionInfo + *exception; + + ExtentInfo + poly_extent; + + MagickBooleanType + fill, + status; + + PolygonInfo + **magick_restrict polygon_info; + + EdgeInfo + *p; + + SegmentInfo + bounds; + + size_t + number_threads = 1; + + ssize_t + i, + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(draw_info != (DrawInfo *) NULL); + assert(draw_info->signature == MagickCoreSignature); + assert(primitive_info != (PrimitiveInfo *) NULL); + if (primitive_info->coordinates <= 1) + return(MagickTrue); + /* + Compute bounding box. + */ + polygon_info=AcquirePolygonTLS(draw_info,primitive_info,&image->exception); + if (polygon_info == (PolygonInfo **) NULL) + return(MagickFalse); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule()," begin draw-polygon"); + fill=(primitive_info->method == FillToBorderMethod) || + (primitive_info->method == FloodfillMethod) ? MagickTrue : MagickFalse; + mid=ExpandAffine(&draw_info->affine)*draw_info->stroke_width/2.0; + bounds=polygon_info[0]->edges[0].bounds; + artifact=GetImageArtifact(image,"draw:render-bounding-rectangles"); + if (IsStringTrue(artifact) != MagickFalse) + (void) DrawBoundingRectangles(image,draw_info,polygon_info[0]); + for (i=1; i < (ssize_t) polygon_info[0]->number_edges; i++) + { + p=polygon_info[0]->edges+i; + if (p->bounds.x1 < bounds.x1) + bounds.x1=p->bounds.x1; + if (p->bounds.y1 < bounds.y1) + bounds.y1=p->bounds.y1; + if (p->bounds.x2 > bounds.x2) + bounds.x2=p->bounds.x2; + if (p->bounds.y2 > bounds.y2) + bounds.y2=p->bounds.y2; + } + bounds.x1-=(mid+1.0); + bounds.y1-=(mid+1.0); + bounds.x2+=(mid+1.0); + bounds.y2+=(mid+1.0); + if ((bounds.x1 >= (double) image->columns) || + (bounds.y1 >= (double) image->rows) || + (bounds.x2 <= 0.0) || (bounds.y2 <= 0.0)) + { + polygon_info=DestroyPolygonTLS(polygon_info); + return(MagickTrue); /* virtual polygon */ + } + bounds.x1=bounds.x1 < 0.0 ? 0.0 : bounds.x1 >= (double) image->columns-1.0 ? + (double) image->columns-1.0 : bounds.x1; + bounds.y1=bounds.y1 < 0.0 ? 0.0 : bounds.y1 >= (double) image->rows-1.0 ? + (double) image->rows-1.0 : bounds.y1; + bounds.x2=bounds.x2 < 0.0 ? 0.0 : bounds.x2 >= (double) image->columns-1.0 ? + (double) image->columns-1.0 : bounds.x2; + bounds.y2=bounds.y2 < 0.0 ? 0.0 : bounds.y2 >= (double) image->rows-1.0 ? + (double) image->rows-1.0 : bounds.y2; + poly_extent.x1=CastDoubleToLong(ceil(bounds.x1-0.5)); + poly_extent.y1=CastDoubleToLong(ceil(bounds.y1-0.5)); + poly_extent.x2=CastDoubleToLong(floor(bounds.x2+0.5)); + poly_extent.y2=CastDoubleToLong(floor(bounds.y2+0.5)); + number_threads=GetMagickNumberThreads(image,image,poly_extent.y2- + poly_extent.y1+1,1); + status=AcquirePolygonEdgesTLS(polygon_info,number_threads,&image->exception); + if (status == MagickFalse) + { + polygon_info=DestroyPolygonTLS(polygon_info); + return(status); + } + status=MagickTrue; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); + if ((primitive_info->coordinates == 1) || + (polygon_info[0]->number_edges == 0)) + { + /* + Draw point. + */ +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + num_threads(number_threads) +#endif + for (y=poly_extent.y1; y <= poly_extent.y2; y++) + { + MagickBooleanType + sync; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + x=poly_extent.x1; + q=GetCacheViewAuthenticPixels(image_view,x,y,(size_t) (poly_extent.x2- + x+1),1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for ( ; x <= poly_extent.x2; x++) + { + if ((x == CastDoubleToLong(ceil(primitive_info->point.x-0.5))) && + (y == CastDoubleToLong(ceil(primitive_info->point.y-0.5)))) + (void) GetFillColor(draw_info,x-poly_extent.x1,y-poly_extent.y1,q); + q++; + } + sync=SyncCacheViewAuthenticPixels(image_view,exception); + if (sync == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + polygon_info=DestroyPolygonTLS(polygon_info); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + " end draw-polygon"); + return(status); + } + /* + Draw polygon or line. + */ + poly_extent.y1=CastDoubleToLong(ceil(bounds.y1-0.5)); + poly_extent.y2=CastDoubleToLong(floor(bounds.y2+0.5)); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + num_threads(number_threads) +#endif + for (y=poly_extent.y1; y <= poly_extent.y2; y++) + { + const int + id = GetOpenMPThreadId(); + + PixelPacket + fill_color, + stroke_color; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,poly_extent.x1,y,(size_t) + (poly_extent.x2-poly_extent.x1+1),1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=poly_extent.x1; x <= poly_extent.x2; x++) + { + double + fill_opacity, + stroke_opacity; + + /* + Fill and/or stroke. + */ + fill_opacity=GetOpacityPixel(polygon_info[id],mid,fill, + draw_info->fill_rule,x,y,&stroke_opacity); + if (draw_info->stroke_antialias == MagickFalse) + { + fill_opacity=fill_opacity > 0.5 ? 1.0 : 0.0; + stroke_opacity=stroke_opacity > 0.5 ? 1.0 : 0.0; + } + (void) GetFillColor(draw_info,x-poly_extent.x1,y-poly_extent.y1, + &fill_color); + fill_opacity=(double) (QuantumRange-fill_opacity*(QuantumRange- + fill_color.opacity)); + MagickCompositeOver(&fill_color,(MagickRealType) fill_opacity,q, + (MagickRealType) q->opacity,q); + (void) GetStrokeColor(draw_info,x-poly_extent.x1,y-poly_extent.y1, + &stroke_color); + stroke_opacity=(double) (QuantumRange-stroke_opacity*(QuantumRange- + stroke_color.opacity)); + MagickCompositeOver(&stroke_color,(MagickRealType) stroke_opacity,q, + (MagickRealType) q->opacity,q); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + polygon_info=DestroyPolygonTLS(polygon_info); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule()," end draw-polygon"); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P r i m i t i v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPrimitive() draws a primitive (line, rectangle, ellipse) on the image. +% +% The format of the DrawPrimitive method is: +% +% MagickBooleanType DrawPrimitive(Image *image,const DrawInfo *draw_info, +% PrimitiveInfo *primitive_info) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o primitive_info: Specifies a pointer to a PrimitiveInfo structure. +% +*/ +static void LogPrimitiveInfo(const PrimitiveInfo *primitive_info) +{ + const char + *methods[] = + { + "point", + "replace", + "floodfill", + "filltoborder", + "reset", + "?" + }; + + PointInfo + p, + q, + point; + + ssize_t + i, + x; + + ssize_t + coordinates, + y; + + x=CastDoubleToLong(ceil(primitive_info->point.x-0.5)); + y=CastDoubleToLong(ceil(primitive_info->point.y-0.5)); + switch (primitive_info->primitive) + { + case PointPrimitive: + { + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + "PointPrimitive %.20g,%.20g %s",(double) x,(double) y, + methods[primitive_info->method]); + return; + } + case ColorPrimitive: + { + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + "ColorPrimitive %.20g,%.20g %s",(double) x,(double) y, + methods[primitive_info->method]); + return; + } + case MattePrimitive: + { + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + "MattePrimitive %.20g,%.20g %s",(double) x,(double) y, + methods[primitive_info->method]); + return; + } + case TextPrimitive: + { + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + "TextPrimitive %.20g,%.20g",(double) x,(double) y); + return; + } + case ImagePrimitive: + { + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + "ImagePrimitive %.20g,%.20g",(double) x,(double) y); + return; + } + default: + break; + } + coordinates=0; + p=primitive_info[0].point; + q.x=(-1.0); + q.y=(-1.0); + for (i=0; primitive_info[i].primitive != UndefinedPrimitive; i++) + { + point=primitive_info[i].point; + if (coordinates <= 0) + { + coordinates=(ssize_t) primitive_info[i].coordinates; + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + " begin open (%.20g)",(double) coordinates); + p=point; + } + point=primitive_info[i].point; + if ((fabs(q.x-point.x) >= MagickEpsilon) || + (fabs(q.y-point.y) >= MagickEpsilon)) + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + " %.20g: %.18g,%.18g",(double) coordinates,point.x,point.y); + else + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + " %.20g: %g %g (duplicate)",(double) coordinates,point.x,point.y); + q=point; + coordinates--; + if (coordinates > 0) + continue; + if ((fabs(p.x-point.x) >= MagickEpsilon) || + (fabs(p.y-point.y) >= MagickEpsilon)) + (void) LogMagickEvent(DrawEvent,GetMagickModule()," end last (%.20g)", + (double) coordinates); + else + (void) LogMagickEvent(DrawEvent,GetMagickModule()," end open (%.20g)", + (double) coordinates); + } +} + +MagickExport MagickBooleanType DrawPrimitive(Image *image, + const DrawInfo *draw_info,const PrimitiveInfo *primitive_info) +{ + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickStatusType + status; + + ssize_t + i, + x; + + ssize_t + y; + + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + " begin draw-primitive"); + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + " affine: %g,%g,%g,%g,%g,%g",draw_info->affine.sx, + draw_info->affine.rx,draw_info->affine.ry,draw_info->affine.sy, + draw_info->affine.tx,draw_info->affine.ty); + } + exception=(&image->exception); + status=MagickTrue; + if ((IsGrayColorspace(image->colorspace) != MagickFalse) && + ((IsPixelGray(&draw_info->fill) == MagickFalse) || + (IsPixelGray(&draw_info->stroke) == MagickFalse))) + status=SetImageColorspace(image,sRGBColorspace); + if (draw_info->compliance == SVGCompliance) + { + status&=SetImageClipMask(image,draw_info->clipping_mask); + status&=SetImageMask(image,draw_info->composite_mask); + } + x=CastDoubleToLong(ceil(primitive_info->point.x-0.5)); + y=CastDoubleToLong(ceil(primitive_info->point.y-0.5)); + image_view=AcquireAuthenticCacheView(image,exception); + switch (primitive_info->primitive) + { + case ColorPrimitive: + { + switch (primitive_info->method) + { + case PointMethod: + default: + { + PixelPacket + *q; + + q=GetCacheViewAuthenticPixels(image_view,x,y,1,1,exception); + if (q == (PixelPacket *) NULL) + break; + (void) GetFillColor(draw_info,x,y,q); + status&=SyncCacheViewAuthenticPixels(image_view,exception); + break; + } + case ReplaceMethod: + { + PixelPacket + target; + + status&=GetOneCacheViewVirtualPixel(image_view,x,y,&target,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (IsColorSimilar(image,q,&target) == MagickFalse) + { + q++; + continue; + } + (void) GetFillColor(draw_info,x,y,q); + q++; + } + status&=SyncCacheViewAuthenticPixels(image_view,exception); + if (status == MagickFalse) + break; + } + break; + } + case FloodfillMethod: + case FillToBorderMethod: + { + MagickPixelPacket + target; + + status&=GetOneVirtualMagickPixel(image,x,y,&target,exception); + if (primitive_info->method == FillToBorderMethod) + { + target.red=(MagickRealType) draw_info->border_color.red; + target.green=(MagickRealType) draw_info->border_color.green; + target.blue=(MagickRealType) draw_info->border_color.blue; + } + status&=FloodfillPaintImage(image,DefaultChannels,draw_info,&target,x, + y,primitive_info->method == FloodfillMethod ? MagickFalse : + MagickTrue); + break; + } + case ResetMethod: + { + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + (void) GetFillColor(draw_info,x,y,q); + q++; + } + status&=SyncCacheViewAuthenticPixels(image_view,exception); + if (status == MagickFalse) + break; + } + break; + } + } + break; + } + case MattePrimitive: + { + if (image->matte == MagickFalse) + status&=SetImageAlphaChannel(image,OpaqueAlphaChannel); + switch (primitive_info->method) + { + case PointMethod: + default: + { + PixelPacket + pixel; + + PixelPacket + *q; + + q=GetCacheViewAuthenticPixels(image_view,x,y,1,1,exception); + if (q == (PixelPacket *) NULL) + break; + (void) GetFillColor(draw_info,x,y,&pixel); + SetPixelOpacity(q,pixel.opacity); + status&=SyncCacheViewAuthenticPixels(image_view,exception); + break; + } + case ReplaceMethod: + { + PixelPacket + pixel, + target; + + status&=GetOneCacheViewVirtualPixel(image_view,x,y,&target,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + if (IsColorSimilar(image,q,&target) == MagickFalse) + { + q++; + continue; + } + (void) GetFillColor(draw_info,x,y,&pixel); + SetPixelOpacity(q,pixel.opacity); + q++; + } + status&=SyncCacheViewAuthenticPixels(image_view,exception); + if (status == MagickFalse) + break; + } + break; + } + case FloodfillMethod: + case FillToBorderMethod: + { + MagickPixelPacket + target; + + status&=GetOneVirtualMagickPixel(image,x,y,&target,exception); + if (primitive_info->method == FillToBorderMethod) + { + target.red=(MagickRealType) draw_info->border_color.red; + target.green=(MagickRealType) draw_info->border_color.green; + target.blue=(MagickRealType) draw_info->border_color.blue; + } + status&=FloodfillPaintImage(image,OpacityChannel,draw_info,&target,x, + y,primitive_info->method == FloodfillMethod ? MagickFalse : + MagickTrue); + break; + } + case ResetMethod: + { + PixelPacket + pixel; + + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + (void) GetFillColor(draw_info,x,y,&pixel); + SetPixelOpacity(q,pixel.opacity); + q++; + } + status&=SyncCacheViewAuthenticPixels(image_view,exception); + if (status == MagickFalse) + break; + } + break; + } + } + break; + } + case ImagePrimitive: + { + AffineMatrix + affine; + + char + composite_geometry[MaxTextExtent]; + + Image + *composite_image, + *composite_images; + + ImageInfo + *clone_info; + + RectangleInfo + geometry; + + ssize_t + x1, + y1; + + if (primitive_info->text == (char *) NULL) + break; + clone_info=AcquireImageInfo(); + composite_images=(Image *) NULL; + if (LocaleNCompare(primitive_info->text,"data:",5) == 0) + composite_images=ReadInlineImage(clone_info,primitive_info->text, + &image->exception); + else + if (*primitive_info->text != '\0') + { + MagickStatusType + path_status; + + struct stat + attributes; + + /* + Read composite image. + */ + (void) CopyMagickString(clone_info->filename,primitive_info->text, + MagickPathExtent); + (void) SetImageInfo(clone_info,1,exception); + (void) CopyMagickString(clone_info->filename,primitive_info->text, + MagickPathExtent); + if (clone_info->size != (char *) NULL) + clone_info->size=DestroyString(clone_info->size); + if (clone_info->extract != (char *) NULL) + clone_info->extract=DestroyString(clone_info->extract); + path_status=GetPathAttributes(clone_info->filename,&attributes); + if (path_status != MagickFalse) + { + if (S_ISCHR(attributes.st_mode) == 0) + composite_images=ReadImage(clone_info,exception); + else + (void) ThrowMagickException(exception,GetMagickModule(), + FileOpenError,"UnableToOpenFile","`%s'", + clone_info->filename); + } + else + if ((LocaleCompare(clone_info->magick,"ftp") != 0) && + (LocaleCompare(clone_info->magick,"http") != 0) && + (LocaleCompare(clone_info->magick,"https") != 0) && + (LocaleCompare(clone_info->magick,"vid") != 0)) + composite_images=ReadImage(clone_info,exception); + else + (void) ThrowMagickException(exception,GetMagickModule(), + FileOpenError,"UnableToOpenFile","`%s'",clone_info->filename); + } + clone_info=DestroyImageInfo(clone_info); + if (composite_images == (Image *) NULL) + { + status=0; + break; + } + composite_image=RemoveFirstImageFromList(&composite_images); + composite_images=DestroyImageList(composite_images); + (void) SetImageProgressMonitor(composite_image,(MagickProgressMonitor) + NULL,(void *) NULL); + x1=CastDoubleToLong(ceil(primitive_info[1].point.x-0.5)); + y1=CastDoubleToLong(ceil(primitive_info[1].point.y-0.5)); + if (((x1 != 0L) && (x1 != (ssize_t) composite_image->columns)) || + ((y1 != 0L) && (y1 != (ssize_t) composite_image->rows))) + { + char + geometry[MaxTextExtent]; + + /* + Resize image. + */ + (void) FormatLocaleString(geometry,MaxTextExtent,"%gx%g!", + primitive_info[1].point.x,primitive_info[1].point.y); + composite_image->filter=image->filter; + status&=TransformImage(&composite_image,(char *) NULL,geometry); + } + if (composite_image->matte == MagickFalse) + status&=SetImageAlphaChannel(composite_image,OpaqueAlphaChannel); + if (draw_info->opacity != OpaqueOpacity) + status&=SetImageOpacity(composite_image,draw_info->opacity); + SetGeometry(image,&geometry); + image->gravity=draw_info->gravity; + geometry.x=x; + geometry.y=y; + (void) FormatLocaleString(composite_geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) composite_image->columns,(double) + composite_image->rows,(double) geometry.x,(double) geometry.y); + (void) ParseGravityGeometry(image,composite_geometry,&geometry, + &image->exception); + affine=draw_info->affine; + affine.tx=(double) geometry.x; + affine.ty=(double) geometry.y; + composite_image->interpolate=image->interpolate; + if ((draw_info->compose == OverCompositeOp) || + (draw_info->compose == SrcOverCompositeOp)) + status&=DrawAffineImage(image,composite_image,&affine); + else + status&=CompositeImage(image,draw_info->compose,composite_image, + geometry.x,geometry.y); + composite_image=DestroyImage(composite_image); + break; + } + case PointPrimitive: + { + PixelPacket + fill_color; + + PixelPacket + *q; + + if ((y < 0) || (y >= (ssize_t) image->rows)) + break; + if ((x < 0) || (x >= (ssize_t) image->columns)) + break; + q=GetCacheViewAuthenticPixels(image_view,x,y,1,1,exception); + if (q == (PixelPacket *) NULL) + break; + (void) GetFillColor(draw_info,x,y,&fill_color); + MagickCompositeOver(&fill_color,(MagickRealType) fill_color.opacity,q, + (MagickRealType) q->opacity,q); + status&=SyncCacheViewAuthenticPixels(image_view,exception); + break; + } + case TextPrimitive: + { + char + geometry[MaxTextExtent]; + + DrawInfo + *clone_info; + + if (primitive_info->text == (char *) NULL) + break; + clone_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + (void) CloneString(&clone_info->text,primitive_info->text); + (void) FormatLocaleString(geometry,MaxTextExtent,"%+f%+f", + primitive_info->point.x,primitive_info->point.y); + (void) CloneString(&clone_info->geometry,geometry); + status&=AnnotateImage(image,clone_info); + clone_info=DestroyDrawInfo(clone_info); + break; + } + default: + { + double + mid, + scale; + + DrawInfo + *clone_info; + + if (IsEventLogging() != MagickFalse) + LogPrimitiveInfo(primitive_info); + scale=ExpandAffine(&draw_info->affine); + if ((draw_info->dash_pattern != (double *) NULL) && + (fabs(draw_info->dash_pattern[0]) >= MagickEpsilon) && + (fabs(scale*draw_info->stroke_width) >= MagickEpsilon) && + (draw_info->stroke.opacity != (Quantum) TransparentOpacity)) + { + /* + Draw dash polygon. + */ + clone_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + clone_info->stroke_width=0.0; + clone_info->stroke.opacity=(Quantum) TransparentOpacity; + status&=DrawPolygonPrimitive(image,clone_info,primitive_info); + clone_info=DestroyDrawInfo(clone_info); + if (status != MagickFalse) + status&=DrawDashPolygon(draw_info,primitive_info,image); + break; + } + mid=ExpandAffine(&draw_info->affine)*draw_info->stroke_width/2.0; + if ((mid > 1.0) && + ((draw_info->stroke.opacity != (Quantum) TransparentOpacity) || + (draw_info->stroke_pattern != (Image *) NULL))) + { + double + x, + y; + + MagickBooleanType + closed_path; + + /* + Draw strokes while respecting line cap/join attributes. + */ + closed_path=primitive_info[0].closed_subpath; + i=(ssize_t) primitive_info[0].coordinates; + x=fabs(primitive_info[i-1].point.x-primitive_info[0].point.x); + y=fabs(primitive_info[i-1].point.y-primitive_info[0].point.y); + if ((x < MagickEpsilon) && (y < MagickEpsilon)) + closed_path=MagickTrue; + if ((((draw_info->linecap == RoundCap) || + (closed_path != MagickFalse)) && + (draw_info->linejoin == RoundJoin)) || + (primitive_info[i].primitive != UndefinedPrimitive)) + { + status&=DrawPolygonPrimitive(image,draw_info,primitive_info); + break; + } + clone_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + clone_info->stroke_width=0.0; + clone_info->stroke.opacity=(Quantum) TransparentOpacity; + status&=DrawPolygonPrimitive(image,clone_info,primitive_info); + clone_info=DestroyDrawInfo(clone_info); + if (status != MagickFalse) + status&=DrawStrokePolygon(image,draw_info,primitive_info); + break; + } + status&=DrawPolygonPrimitive(image,draw_info,primitive_info); + break; + } + } + image_view=DestroyCacheView(image_view); + if (draw_info->compliance == SVGCompliance) + { + status&=SetImageClipMask(image,(Image *) NULL); + status&=SetImageMask(image,(Image *) NULL); + } + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule()," end draw-primitive"); + return(status != 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D r a w S t r o k e P o l y g o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawStrokePolygon() draws a stroked polygon (line, rectangle, ellipse) on +% the image while respecting the line cap and join attributes. +% +% The format of the DrawStrokePolygon method is: +% +% MagickBooleanType DrawStrokePolygon(Image *image, +% const DrawInfo *draw_info,const PrimitiveInfo *primitive_info) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o draw_info: the draw info. +% +% o primitive_info: Specifies a pointer to a PrimitiveInfo structure. +% +% +*/ + +static MagickBooleanType DrawRoundLinecap(Image *image, + const DrawInfo *draw_info,const PrimitiveInfo *primitive_info) +{ + PrimitiveInfo + linecap[5]; + + ssize_t + i; + + for (i=0; i < 4; i++) + linecap[i]=(*primitive_info); + linecap[0].coordinates=4; + linecap[1].point.x+=2.0*MagickEpsilon; + linecap[2].point.x+=2.0*MagickEpsilon; + linecap[2].point.y+=2.0*MagickEpsilon; + linecap[3].point.y+=2.0*MagickEpsilon; + linecap[4].primitive=UndefinedPrimitive; + return(DrawPolygonPrimitive(image,draw_info,linecap)); +} + +static MagickBooleanType DrawStrokePolygon(Image *image, + const DrawInfo *draw_info,const PrimitiveInfo *primitive_info) +{ + DrawInfo + *clone_info; + + MagickBooleanType + closed_path; + + MagickStatusType + status; + + PrimitiveInfo + *stroke_polygon; + + const PrimitiveInfo + *p, + *q; + + /* + Draw stroked polygon. + */ + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + " begin draw-stroke-polygon"); + clone_info=CloneDrawInfo((ImageInfo *) NULL,draw_info); + clone_info->fill=draw_info->stroke; + if (clone_info->fill_pattern != (Image *) NULL) + clone_info->fill_pattern=DestroyImage(clone_info->fill_pattern); + if (clone_info->stroke_pattern != (Image *) NULL) + clone_info->fill_pattern=CloneImage(clone_info->stroke_pattern,0,0, + MagickTrue,&clone_info->stroke_pattern->exception); + clone_info->stroke.opacity=(Quantum) TransparentOpacity; + clone_info->stroke_width=0.0; + clone_info->fill_rule=NonZeroRule; + status=MagickTrue; + for (p=primitive_info; p->primitive != UndefinedPrimitive; p+=p->coordinates) + { + if (p->coordinates == 1) + continue; + stroke_polygon=TraceStrokePolygon(draw_info,p,&image->exception); + if (stroke_polygon == (PrimitiveInfo *) NULL) + { + status=0; + break; + } + status&=DrawPolygonPrimitive(image,clone_info,stroke_polygon); + stroke_polygon=(PrimitiveInfo *) RelinquishMagickMemory(stroke_polygon); + if (status == 0) + break; + q=p+p->coordinates-1; + closed_path=p->closed_subpath; + if ((draw_info->linecap == RoundCap) && (closed_path == MagickFalse)) + { + status&=DrawRoundLinecap(image,draw_info,p); + status&=DrawRoundLinecap(image,draw_info,q); + } + } + clone_info=DestroyDrawInfo(clone_info); + if (image->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(), + " end draw-stroke-polygon"); + return(status != 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t A f f i n e M a t r i x % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetAffineMatrix() returns an AffineMatrix initialized to the identity +% matrix. +% +% The format of the GetAffineMatrix method is: +% +% void GetAffineMatrix(AffineMatrix *affine_matrix) +% +% A description of each parameter follows: +% +% o affine_matrix: the affine matrix. +% +*/ +MagickExport void GetAffineMatrix(AffineMatrix *affine_matrix) +{ + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(affine_matrix != (AffineMatrix *) NULL); + (void) memset(affine_matrix,0,sizeof(*affine_matrix)); + affine_matrix->sx=1.0; + affine_matrix->sy=1.0; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t D r a w I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetDrawInfo() initializes draw_info to default values from image_info. +% +% The format of the GetDrawInfo method is: +% +% void GetDrawInfo(const ImageInfo *image_info,DrawInfo *draw_info) +% +% A description of each parameter follows: +% +% o image_info: the image info.. +% +% o draw_info: the draw info. +% +*/ +MagickExport void GetDrawInfo(const ImageInfo *image_info,DrawInfo *draw_info) +{ + char + *next_token; + + const char + *option; + + ExceptionInfo + *exception; + + ImageInfo + *clone_info; + + /* + Initialize draw attributes. + */ + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(draw_info != (DrawInfo *) NULL); + (void) memset(draw_info,0,sizeof(*draw_info)); + clone_info=CloneImageInfo(image_info); + GetAffineMatrix(&draw_info->affine); + exception=AcquireExceptionInfo(); + (void) QueryColorDatabase("#000F",&draw_info->fill,exception); + (void) QueryColorDatabase("#FFF0",&draw_info->stroke,exception); + draw_info->stroke_antialias=clone_info->antialias; + draw_info->stroke_width=1.0; + draw_info->fill_rule=EvenOddRule; + draw_info->opacity=OpaqueOpacity; + draw_info->fill_opacity=OpaqueOpacity; + draw_info->stroke_opacity=OpaqueOpacity; + draw_info->linecap=ButtCap; + draw_info->linejoin=MiterJoin; + draw_info->miterlimit=10; + draw_info->decorate=NoDecoration; + if (clone_info->font != (char *) NULL) + draw_info->font=AcquireString(clone_info->font); + if (clone_info->density != (char *) NULL) + draw_info->density=AcquireString(clone_info->density); + draw_info->text_antialias=clone_info->antialias; + draw_info->pointsize=12.0; + if (fabs(clone_info->pointsize) >= MagickEpsilon) + draw_info->pointsize=clone_info->pointsize; + draw_info->undercolor.opacity=(Quantum) TransparentOpacity; + draw_info->border_color=clone_info->border_color; + draw_info->compose=OverCompositeOp; + if (clone_info->server_name != (char *) NULL) + draw_info->server_name=AcquireString(clone_info->server_name); + draw_info->render=MagickTrue; + draw_info->clip_path=MagickFalse; + draw_info->debug=IsEventLogging(); + option=GetImageOption(clone_info,"direction"); + if (option != (const char *) NULL) + draw_info->direction=(DirectionType) ParseCommandOption( + MagickDirectionOptions,MagickFalse,option); + else + draw_info->direction=UndefinedDirection; + option=GetImageOption(clone_info,"encoding"); + if (option != (const char *) NULL) + (void) CloneString(&draw_info->encoding,option); + option=GetImageOption(clone_info,"family"); + if (option != (const char *) NULL) + (void) CloneString(&draw_info->family,option); + option=GetImageOption(clone_info,"fill"); + if (option != (const char *) NULL) + (void) QueryColorDatabase(option,&draw_info->fill,exception); + option=GetImageOption(clone_info,"gravity"); + if (option != (const char *) NULL) + draw_info->gravity=(GravityType) ParseCommandOption(MagickGravityOptions, + MagickFalse,option); + option=GetImageOption(clone_info,"interline-spacing"); + if (option != (const char *) NULL) + draw_info->interline_spacing=GetDrawValue(option,&next_token); + option=GetImageOption(clone_info,"interword-spacing"); + if (option != (const char *) NULL) + draw_info->interword_spacing=GetDrawValue(option,&next_token); + option=GetImageOption(clone_info,"kerning"); + if (option != (const char *) NULL) + draw_info->kerning=GetDrawValue(option,&next_token); + option=GetImageOption(clone_info,"stroke"); + if (option != (const char *) NULL) + (void) QueryColorDatabase(option,&draw_info->stroke,exception); + option=GetImageOption(clone_info,"strokewidth"); + if (option != (const char *) NULL) + draw_info->stroke_width=GetDrawValue(option,&next_token); + option=GetImageOption(clone_info,"style"); + if (option != (const char *) NULL) + draw_info->style=(StyleType) ParseCommandOption(MagickStyleOptions, + MagickFalse,option); + option=GetImageOption(clone_info,"undercolor"); + if (option != (const char *) NULL) + (void) QueryColorDatabase(option,&draw_info->undercolor,exception); + option=GetImageOption(clone_info,"weight"); + if (option != (const char *) NULL) + { + ssize_t + weight; + + weight=ParseCommandOption(MagickWeightOptions,MagickFalse,option); + if (weight == -1) + weight=(ssize_t) StringToUnsignedLong(option); + draw_info->weight=(size_t) weight; + } + exception=DestroyExceptionInfo(exception); + draw_info->signature=MagickCoreSignature; + clone_info=DestroyImageInfo(clone_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ P e r m u t a t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Permutate() returns the permuation of the (n,k). +% +% The format of the Permutate method is: +% +% void Permutate(ssize_t n,ssize_t k) +% +% A description of each parameter follows: +% +% o n: +% +% o k: +% +% +*/ +static inline double Permutate(const ssize_t n,const ssize_t k) +{ + double + r; + + ssize_t + i; + + r=1.0; + for (i=k+1; i <= n; i++) + r*=i; + for (i=1; i <= (n-k); i++) + r/=i; + return(r); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ T r a c e P r i m i t i v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% TracePrimitive is a collection of methods for generating graphic +% primitives such as arcs, ellipses, paths, etc. +% +*/ + +static MagickBooleanType TraceArc(MVGInfo *mvg_info,const PointInfo start, + const PointInfo end,const PointInfo degrees) +{ + PointInfo + center, + radius; + + center.x=0.5*(end.x+start.x); + center.y=0.5*(end.y+start.y); + radius.x=fabs(center.x-start.x); + radius.y=fabs(center.y-start.y); + return(TraceEllipse(mvg_info,center,radius,degrees)); +} + +static MagickBooleanType TraceArcPath(MVGInfo *mvg_info,const PointInfo start, + const PointInfo end,const PointInfo arc,const double angle, + const MagickBooleanType large_arc,const MagickBooleanType sweep) +{ + double + alpha, + beta, + delta, + factor, + gamma, + theta; + + MagickStatusType + status; + + PointInfo + center, + points[3], + radii; + + double + cosine, + sine; + + PrimitiveInfo + *primitive_info; + + PrimitiveInfo + *p; + + ssize_t + i; + + size_t + arc_segments; + + ssize_t + offset; + + offset=mvg_info->offset; + primitive_info=(*mvg_info->primitive_info)+mvg_info->offset; + primitive_info->coordinates=0; + if ((fabs(start.x-end.x) < MagickEpsilon) && + (fabs(start.y-end.y) < MagickEpsilon)) + return(TracePoint(primitive_info,end)); + radii.x=fabs(arc.x); + radii.y=fabs(arc.y); + if ((radii.x < MagickEpsilon) || (radii.y < MagickEpsilon)) + return(TraceLine(primitive_info,start,end)); + cosine=cos(DegreesToRadians(fmod((double) angle,360.0))); + sine=sin(DegreesToRadians(fmod((double) angle,360.0))); + center.x=(double) (cosine*(end.x-start.x)/2+sine*(end.y-start.y)/2); + center.y=(double) (cosine*(end.y-start.y)/2-sine*(end.x-start.x)/2); + delta=(center.x*center.x)/(radii.x*radii.x)+(center.y*center.y)/ + (radii.y*radii.y); + if (delta < MagickEpsilon) + return(TraceLine(primitive_info,start,end)); + if (delta > 1.0) + { + radii.x*=sqrt((double) delta); + radii.y*=sqrt((double) delta); + } + points[0].x=(double) (cosine*start.x/radii.x+sine*start.y/radii.x); + points[0].y=(double) (cosine*start.y/radii.y-sine*start.x/radii.y); + points[1].x=(double) (cosine*end.x/radii.x+sine*end.y/radii.x); + points[1].y=(double) (cosine*end.y/radii.y-sine*end.x/radii.y); + alpha=points[1].x-points[0].x; + beta=points[1].y-points[0].y; + if (fabs(alpha*alpha+beta*beta) < MagickEpsilon) + return(TraceLine(primitive_info,start,end)); + factor=PerceptibleReciprocal(alpha*alpha+beta*beta)-0.25; + if (factor <= 0.0) + factor=0.0; + else + { + factor=sqrt((double) factor); + if (sweep == large_arc) + factor=(-factor); + } + center.x=(double) ((points[0].x+points[1].x)/2-factor*beta); + center.y=(double) ((points[0].y+points[1].y)/2+factor*alpha); + alpha=atan2(points[0].y-center.y,points[0].x-center.x); + theta=atan2(points[1].y-center.y,points[1].x-center.x)-alpha; + if ((theta < 0.0) && (sweep != MagickFalse)) + theta+=2.0*MagickPI; + else + if ((theta > 0.0) && (sweep == MagickFalse)) + theta-=2.0*MagickPI; + arc_segments=(size_t) CastDoubleToLong(ceil(fabs((double) (theta/(0.5* + MagickPI+MagickEpsilon))))); + p=primitive_info; + status=MagickTrue; + for (i=0; i < (ssize_t) arc_segments; i++) + { + beta=0.5*((alpha+(i+1)*theta/arc_segments)-(alpha+i*theta/arc_segments)); + gamma=(8.0/3.0)*sin(fmod((double) (0.5*beta),DegreesToRadians(360.0)))* + sin(fmod((double) (0.5*beta),DegreesToRadians(360.0)))/ + sin(fmod((double) beta,DegreesToRadians(360.0))); + points[0].x=(double) (center.x+cos(fmod((double) (alpha+(double) i*theta/ + arc_segments),DegreesToRadians(360.0)))-gamma*sin(fmod((double) (alpha+ + (double) i*theta/arc_segments),DegreesToRadians(360.0)))); + points[0].y=(double) (center.y+sin(fmod((double) (alpha+(double) i*theta/ + arc_segments),DegreesToRadians(360.0)))+gamma*cos(fmod((double) (alpha+ + (double) i*theta/arc_segments),DegreesToRadians(360.0)))); + points[2].x=(double) (center.x+cos(fmod((double) (alpha+(double) (i+1)* + theta/arc_segments),DegreesToRadians(360.0)))); + points[2].y=(double) (center.y+sin(fmod((double) (alpha+(double) (i+1)* + theta/arc_segments),DegreesToRadians(360.0)))); + points[1].x=(double) (points[2].x+gamma*sin(fmod((double) (alpha+(double) + (i+1)*theta/arc_segments),DegreesToRadians(360.0)))); + points[1].y=(double) (points[2].y-gamma*cos(fmod((double) (alpha+(double) + (i+1)*theta/arc_segments),DegreesToRadians(360.0)))); + p->point.x=(p == primitive_info) ? start.x : (p-1)->point.x; + p->point.y=(p == primitive_info) ? start.y : (p-1)->point.y; + (p+1)->point.x=(double) (cosine*radii.x*points[0].x-sine*radii.y* + points[0].y); + (p+1)->point.y=(double) (sine*radii.x*points[0].x+cosine*radii.y* + points[0].y); + (p+2)->point.x=(double) (cosine*radii.x*points[1].x-sine*radii.y* + points[1].y); + (p+2)->point.y=(double) (sine*radii.x*points[1].x+cosine*radii.y* + points[1].y); + (p+3)->point.x=(double) (cosine*radii.x*points[2].x-sine*radii.y* + points[2].y); + (p+3)->point.y=(double) (sine*radii.x*points[2].x+cosine*radii.y* + points[2].y); + if (i == (ssize_t) (arc_segments-1)) + (p+3)->point=end; + status&=TraceBezier(mvg_info,4); + if (status == 0) + break; + p=(*mvg_info->primitive_info)+mvg_info->offset; + mvg_info->offset+=p->coordinates; + p+=p->coordinates; + } + if (status == 0) + return(MagickFalse); + mvg_info->offset=offset; + primitive_info=(*mvg_info->primitive_info)+mvg_info->offset; + primitive_info->coordinates=(size_t) (p-primitive_info); + primitive_info->closed_subpath=MagickFalse; + for (i=0; i < (ssize_t) primitive_info->coordinates; i++) + { + p->primitive=primitive_info->primitive; + p--; + } + return(MagickTrue); +} + +static MagickBooleanType TraceBezier(MVGInfo *mvg_info, + const size_t number_coordinates) +{ + double + alpha, + *coefficients, + weight; + + PointInfo + end, + point, + *points; + + PrimitiveInfo + *primitive_info; + + PrimitiveInfo + *p; + + ssize_t + i, + j; + + size_t + control_points, + quantum; + + /* + Allocate coefficients. + */ + primitive_info=(*mvg_info->primitive_info)+mvg_info->offset; + quantum=number_coordinates; + for (i=0; i < (ssize_t) number_coordinates; i++) + { + for (j=i+1; j < (ssize_t) number_coordinates; j++) + { + alpha=fabs(primitive_info[j].point.x-primitive_info[i].point.x); + if (alpha > (double) MAGICK_SSIZE_MAX) + { + (void) ThrowMagickException(mvg_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(MagickFalse); + } + if (alpha > (double) quantum) + quantum=(size_t) alpha; + alpha=fabs(primitive_info[j].point.y-primitive_info[i].point.y); + if (alpha > (double) MAGICK_SSIZE_MAX) + { + (void) ThrowMagickException(mvg_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(MagickFalse); + } + if (alpha > (double) quantum) + quantum=(size_t) alpha; + } + } + coefficients=(double *) AcquireQuantumMemory(number_coordinates, + sizeof(*coefficients)); + quantum=MagickMin(quantum/number_coordinates,BezierQuantum); + points=(PointInfo *) AcquireQuantumMemory(quantum,number_coordinates* + sizeof(*points)); + if ((coefficients == (double *) NULL) || (points == (PointInfo *) NULL)) + { + if (points != (PointInfo *) NULL) + points=(PointInfo *) RelinquishMagickMemory(points); + if (coefficients != (double *) NULL) + coefficients=(double *) RelinquishMagickMemory(coefficients); + (void) ThrowMagickException(mvg_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return(MagickFalse); + } + control_points=quantum*number_coordinates; + if (CheckPrimitiveExtent(mvg_info,(double) control_points+1) == MagickFalse) + { + points=(PointInfo *) RelinquishMagickMemory(points); + coefficients=(double *) RelinquishMagickMemory(coefficients); + return(MagickFalse); + } + primitive_info=(*mvg_info->primitive_info)+mvg_info->offset; + /* + Compute bezier points. + */ + end=primitive_info[number_coordinates-1].point; + for (i=0; i < (ssize_t) number_coordinates; i++) + coefficients[i]=Permutate((ssize_t) number_coordinates-1,i); + weight=0.0; + for (i=0; i < (ssize_t) control_points; i++) + { + p=primitive_info; + point.x=0.0; + point.y=0.0; + alpha=pow((double) (1.0-weight),(double) number_coordinates-1.0); + for (j=0; j < (ssize_t) number_coordinates; j++) + { + point.x+=alpha*coefficients[j]*p->point.x; + point.y+=alpha*coefficients[j]*p->point.y; + alpha*=weight/(1.0-weight); + p++; + } + points[i]=point; + weight+=1.0/control_points; + } + /* + Bezier curves are just short segmented polys. + */ + p=primitive_info; + for (i=0; i < (ssize_t) control_points; i++) + { + if (TracePoint(p,points[i]) == MagickFalse) + { + points=(PointInfo *) RelinquishMagickMemory(points); + coefficients=(double *) RelinquishMagickMemory(coefficients); + return(MagickFalse); + } + p+=p->coordinates; + } + if (TracePoint(p,end) == MagickFalse) + { + points=(PointInfo *) RelinquishMagickMemory(points); + coefficients=(double *) RelinquishMagickMemory(coefficients); + return(MagickFalse); + } + p+=p->coordinates; + primitive_info->coordinates=(size_t) (p-primitive_info); + primitive_info->closed_subpath=MagickFalse; + for (i=0; i < (ssize_t) primitive_info->coordinates; i++) + { + p->primitive=primitive_info->primitive; + p--; + } + points=(PointInfo *) RelinquishMagickMemory(points); + coefficients=(double *) RelinquishMagickMemory(coefficients); + return(MagickTrue); +} + +static MagickBooleanType TraceCircle(MVGInfo *mvg_info,const PointInfo start, + const PointInfo end) +{ + double + alpha, + beta, + radius; + + PointInfo + offset, + degrees; + + alpha=end.x-start.x; + beta=end.y-start.y; + radius=hypot((double) alpha,(double) beta); + offset.x=(double) radius; + offset.y=(double) radius; + degrees.x=0.0; + degrees.y=360.0; + return(TraceEllipse(mvg_info,start,offset,degrees)); +} + +static MagickBooleanType TraceEllipse(MVGInfo *mvg_info,const PointInfo center, + const PointInfo radii,const PointInfo arc) +{ + double + coordinates, + delta, + step, + x, + y; + + PointInfo + angle, + point; + + PrimitiveInfo + *primitive_info; + + PrimitiveInfo + *p; + + ssize_t + i; + + /* + Ellipses are just short segmented polys. + */ + primitive_info=(*mvg_info->primitive_info)+mvg_info->offset; + primitive_info->coordinates=0; + if ((fabs(radii.x) < MagickEpsilon) || (fabs(radii.y) < MagickEpsilon)) + return(MagickTrue); + delta=2.0*PerceptibleReciprocal(MagickMax(radii.x,radii.y)); + step=MagickPI/8.0; + if ((delta >= 0.0) && (delta < (MagickPI/8.0))) + step=MagickPI/4.0/(MagickPI*PerceptibleReciprocal(delta)/2.0); + angle.x=DegreesToRadians(arc.x); + y=arc.y; + while (y < arc.x) + y+=360.0; + angle.y=DegreesToRadians(y); + coordinates=ceil((angle.y-angle.x)/step+1.0); + if (CheckPrimitiveExtent(mvg_info,coordinates) == MagickFalse) + return(MagickFalse); + primitive_info=(*mvg_info->primitive_info)+mvg_info->offset; + for (p=primitive_info; angle.x < angle.y; angle.x+=step) + { + point.x=cos(fmod(angle.x,DegreesToRadians(360.0)))*radii.x+center.x; + point.y=sin(fmod(angle.x,DegreesToRadians(360.0)))*radii.y+center.y; + if (TracePoint(p,point) == MagickFalse) + return(MagickFalse); + p+=p->coordinates; + } + point.x=cos(fmod(angle.y,DegreesToRadians(360.0)))*radii.x+center.x; + point.y=sin(fmod(angle.y,DegreesToRadians(360.0)))*radii.y+center.y; + if (TracePoint(p,point) == MagickFalse) + return(MagickFalse); + p+=p->coordinates; + primitive_info->coordinates=(size_t) (p-primitive_info); + primitive_info->closed_subpath=MagickFalse; + x=fabs(primitive_info[0].point.x- + primitive_info[primitive_info->coordinates-1].point.x); + y=fabs(primitive_info[0].point.y- + primitive_info[primitive_info->coordinates-1].point.y); + if ((x < MagickEpsilon) && (y < MagickEpsilon)) + primitive_info->closed_subpath=MagickTrue; + for (i=0; i < (ssize_t) primitive_info->coordinates; i++) + { + p->primitive=primitive_info->primitive; + p--; + } + return(MagickTrue); +} + +static MagickBooleanType TraceLine(PrimitiveInfo *primitive_info, + const PointInfo start,const PointInfo end) +{ + if (TracePoint(primitive_info,start) == MagickFalse) + return(MagickFalse); + if ((fabs(start.x-end.x) < MagickEpsilon) && + (fabs(start.y-end.y) < MagickEpsilon)) + { + primitive_info->primitive=PointPrimitive; + primitive_info->coordinates=1; + return(MagickTrue); + } + if (TracePoint(primitive_info+1,end) == MagickFalse) + return(MagickFalse); + (primitive_info+1)->primitive=primitive_info->primitive; + primitive_info->coordinates=2; + primitive_info->closed_subpath=MagickFalse; + return(MagickTrue); +} + +static ssize_t TracePath(Image *image,MVGInfo *mvg_info,const char *path) +{ + char + *next_token, + token[MaxTextExtent]; + + const char + *p; + + double + x, + y; + + int + attribute, + last_attribute; + + MagickStatusType + status; + + PointInfo + end = {0.0, 0.0}, + points[4] = { {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0} }, + point = {0.0, 0.0}, + start = {0.0, 0.0}; + + PrimitiveInfo + *primitive_info; + + PrimitiveType + primitive_type; + + PrimitiveInfo + *q; + + ssize_t + i; + + size_t + number_coordinates, + z_count; + + ssize_t + subpath_offset; + + subpath_offset=mvg_info->offset; + primitive_info=(*mvg_info->primitive_info)+mvg_info->offset; + status=MagickTrue; + attribute=0; + number_coordinates=0; + z_count=0; + primitive_type=primitive_info->primitive; + q=primitive_info; + for (p=path; *p != '\0'; ) + { + if (status == MagickFalse) + break; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == '\0') + break; + last_attribute=attribute; + attribute=(int) (*p++); + switch (attribute) + { + case 'a': + case 'A': + { + double + angle = 0.0; + + MagickBooleanType + large_arc = MagickFalse, + sweep = MagickFalse; + + PointInfo + arc = {0.0, 0.0}; + + /* + Elliptical arc. + */ + do + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + arc.x=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + arc.y=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + angle=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + large_arc=StringToLong(token) != 0 ? MagickTrue : MagickFalse; + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + sweep=StringToLong(token) != 0 ? MagickTrue : MagickFalse; + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + x=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + y=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + end.x=(double) (attribute == (int) 'A' ? x : point.x+x); + end.y=(double) (attribute == (int) 'A' ? y : point.y+y); + status&=TraceArcPath(mvg_info,point,end,arc,angle,large_arc,sweep); + q=(*mvg_info->primitive_info)+mvg_info->offset; + mvg_info->offset+=q->coordinates; + q+=q->coordinates; + point=end; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == ',') + p++; + } while (IsPoint(p) != MagickFalse); + break; + } + case 'c': + case 'C': + { + /* + Cubic Bézier curve. + */ + do + { + points[0]=point; + for (i=1; i < 4; i++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + x=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + y=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + end.x=(double) (attribute == (int) 'C' ? x : point.x+x); + end.y=(double) (attribute == (int) 'C' ? y : point.y+y); + points[i]=end; + } + for (i=0; i < 4; i++) + (q+i)->point=points[i]; + if (TraceBezier(mvg_info,4) == MagickFalse) + return(-1); + q=(*mvg_info->primitive_info)+mvg_info->offset; + mvg_info->offset+=q->coordinates; + q+=q->coordinates; + point=end; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == ',') + p++; + } while (IsPoint(p) != MagickFalse); + break; + } + case 'H': + case 'h': + { + do + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + x=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + point.x=(double) (attribute == (int) 'H' ? x: point.x+x); + if (CheckPrimitiveExtent(mvg_info,PrimitiveExtentPad) == MagickFalse) + return(-1); + q=(*mvg_info->primitive_info)+mvg_info->offset; + if (TracePoint(q,point) == MagickFalse) + return(-1); + mvg_info->offset+=q->coordinates; + q+=q->coordinates; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == ',') + p++; + } while (IsPoint(p) != MagickFalse); + break; + } + case 'l': + case 'L': + { + /* + Line to. + */ + do + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + x=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + y=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + point.x=(double) (attribute == (int) 'L' ? x : point.x+x); + point.y=(double) (attribute == (int) 'L' ? y : point.y+y); + if (CheckPrimitiveExtent(mvg_info,PrimitiveExtentPad) == MagickFalse) + return(-1); + q=(*mvg_info->primitive_info)+mvg_info->offset; + if (TracePoint(q,point) == MagickFalse) + return(-1); + mvg_info->offset+=q->coordinates; + q+=q->coordinates; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == ',') + p++; + } while (IsPoint(p) != MagickFalse); + break; + } + case 'M': + case 'm': + { + /* + Move to. + */ + if (mvg_info->offset != subpath_offset) + { + primitive_info=(*mvg_info->primitive_info)+subpath_offset; + primitive_info->coordinates=(size_t) (q-primitive_info); + number_coordinates+=primitive_info->coordinates; + primitive_info=q; + subpath_offset=mvg_info->offset; + } + i=0; + do + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + x=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + y=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + point.x=(double) (attribute == (int) 'M' ? x : point.x+x); + point.y=(double) (attribute == (int) 'M' ? y : point.y+y); + if (i == 0) + start=point; + i++; + if (CheckPrimitiveExtent(mvg_info,PrimitiveExtentPad) == MagickFalse) + return(-1); + q=(*mvg_info->primitive_info)+mvg_info->offset; + if (TracePoint(q,point) == MagickFalse) + return(-1); + mvg_info->offset+=q->coordinates; + q+=q->coordinates; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == ',') + p++; + } while (IsPoint(p) != MagickFalse); + break; + } + case 'q': + case 'Q': + { + /* + Quadratic Bézier curve. + */ + do + { + points[0]=point; + for (i=1; i < 3; i++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + x=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + y=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + if (*p == ',') + p++; + end.x=(double) (attribute == (int) 'Q' ? x : point.x+x); + end.y=(double) (attribute == (int) 'Q' ? y : point.y+y); + points[i]=end; + } + for (i=0; i < 3; i++) + (q+i)->point=points[i]; + if (TraceBezier(mvg_info,3) == MagickFalse) + return(-1); + q=(*mvg_info->primitive_info)+mvg_info->offset; + mvg_info->offset+=q->coordinates; + q+=q->coordinates; + point=end; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == ',') + p++; + } while (IsPoint(p) != MagickFalse); + break; + } + case 's': + case 'S': + { + /* + Cubic Bézier curve. + */ + do + { + points[0]=points[3]; + points[1].x=2.0*points[3].x-points[2].x; + points[1].y=2.0*points[3].y-points[2].y; + for (i=2; i < 4; i++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + x=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + y=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + if (*p == ',') + p++; + end.x=(double) (attribute == (int) 'S' ? x : point.x+x); + end.y=(double) (attribute == (int) 'S' ? y : point.y+y); + points[i]=end; + } + if (strchr("CcSs",last_attribute) == (char *) NULL) + { + points[0]=point; + points[1]=point; + } + for (i=0; i < 4; i++) + (q+i)->point=points[i]; + if (TraceBezier(mvg_info,4) == MagickFalse) + return(-1); + q=(*mvg_info->primitive_info)+mvg_info->offset; + mvg_info->offset+=q->coordinates; + q+=q->coordinates; + point=end; + last_attribute=attribute; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == ',') + p++; + } while (IsPoint(p) != MagickFalse); + break; + } + case 't': + case 'T': + { + /* + Quadratic Bézier curve. + */ + do + { + points[0]=points[2]; + points[1].x=2.0*points[2].x-points[1].x; + points[1].y=2.0*points[2].y-points[1].y; + for (i=2; i < 3; i++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + x=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + y=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + end.x=(double) (attribute == (int) 'T' ? x : point.x+x); + end.y=(double) (attribute == (int) 'T' ? y : point.y+y); + points[i]=end; + } + if (status == MagickFalse) + break; + if (strchr("QqTt",last_attribute) == (char *) NULL) + { + points[0]=point; + points[1]=point; + } + for (i=0; i < 3; i++) + (q+i)->point=points[i]; + if (TraceBezier(mvg_info,3) == MagickFalse) + return(-1); + q=(*mvg_info->primitive_info)+mvg_info->offset; + mvg_info->offset+=q->coordinates; + q+=q->coordinates; + point=end; + last_attribute=attribute; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == ',') + p++; + } while (IsPoint(p) != MagickFalse); + break; + } + case 'v': + case 'V': + { + /* + Line to. + */ + do + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + y=GetDrawValue(token,&next_token); + if (token == next_token) + ThrowPointExpectedException(image,token); + point.y=(double) (attribute == (int) 'V' ? y : point.y+y); + if (CheckPrimitiveExtent(mvg_info,PrimitiveExtentPad) == MagickFalse) + return(-1); + q=(*mvg_info->primitive_info)+mvg_info->offset; + if (TracePoint(q,point) == MagickFalse) + return(-1); + mvg_info->offset+=q->coordinates; + q+=q->coordinates; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == ',') + p++; + } while (IsPoint(p) != MagickFalse); + break; + } + case 'z': + case 'Z': + { + /* + Close path. + */ + point=start; + if (CheckPrimitiveExtent(mvg_info,PrimitiveExtentPad) == MagickFalse) + return(-1); + q=(*mvg_info->primitive_info)+mvg_info->offset; + if (TracePoint(q,point) == MagickFalse) + return(-1); + mvg_info->offset+=q->coordinates; + q+=q->coordinates; + primitive_info=(*mvg_info->primitive_info)+subpath_offset; + primitive_info->coordinates=(size_t) (q-primitive_info); + primitive_info->closed_subpath=MagickTrue; + number_coordinates+=primitive_info->coordinates; + primitive_info=q; + subpath_offset=mvg_info->offset; + z_count++; + break; + } + default: + { + ThrowPointExpectedException(image,token); + break; + } + } + } + if (status == MagickFalse) + return(-1); + primitive_info=(*mvg_info->primitive_info)+subpath_offset; + primitive_info->coordinates=(size_t) (q-primitive_info); + number_coordinates+=primitive_info->coordinates; + for (i=0; i < (ssize_t) number_coordinates; i++) + { + q--; + q->primitive=primitive_type; + if (z_count > 1) + q->method=FillToBorderMethod; + } + q=primitive_info; + return((ssize_t) number_coordinates); +} + +static MagickBooleanType TraceRectangle(PrimitiveInfo *primitive_info, + const PointInfo start,const PointInfo end) +{ + PointInfo + point; + + PrimitiveInfo + *p; + + ssize_t + i; + + p=primitive_info; + if (TracePoint(p,start) == MagickFalse) + return(MagickFalse); + p+=p->coordinates; + point.x=start.x; + point.y=end.y; + if (TracePoint(p,point) == MagickFalse) + return(MagickFalse); + p+=p->coordinates; + if (TracePoint(p,end) == MagickFalse) + return(MagickFalse); + p+=p->coordinates; + point.x=end.x; + point.y=start.y; + if (TracePoint(p,point) == MagickFalse) + return(MagickFalse); + p+=p->coordinates; + if (TracePoint(p,start) == MagickFalse) + return(MagickFalse); + p+=p->coordinates; + primitive_info->coordinates=(size_t) (p-primitive_info); + primitive_info->closed_subpath=MagickTrue; + for (i=0; i < (ssize_t) primitive_info->coordinates; i++) + { + p->primitive=primitive_info->primitive; + p--; + } + return(MagickTrue); +} + +static MagickBooleanType TraceRoundRectangle(MVGInfo *mvg_info, + const PointInfo start,const PointInfo end,PointInfo arc) +{ + PointInfo + degrees, + point, + segment; + + PrimitiveInfo + *primitive_info; + + PrimitiveInfo + *p; + + ssize_t + i; + + ssize_t + offset; + + offset=mvg_info->offset; + segment.x=fabs(end.x-start.x); + segment.y=fabs(end.y-start.y); + if ((segment.x < MagickEpsilon) || (segment.y < MagickEpsilon)) + { + (*mvg_info->primitive_info+mvg_info->offset)->coordinates=0; + return(MagickTrue); + } + if (arc.x > (0.5*segment.x)) + arc.x=0.5*segment.x; + if (arc.y > (0.5*segment.y)) + arc.y=0.5*segment.y; + point.x=start.x+segment.x-arc.x; + point.y=start.y+arc.y; + degrees.x=270.0; + degrees.y=360.0; + if (TraceEllipse(mvg_info,point,arc,degrees) == MagickFalse) + return(MagickFalse); + p=(*mvg_info->primitive_info)+mvg_info->offset; + mvg_info->offset+=p->coordinates; + point.x=start.x+segment.x-arc.x; + point.y=start.y+segment.y-arc.y; + degrees.x=0.0; + degrees.y=90.0; + if (TraceEllipse(mvg_info,point,arc,degrees) == MagickFalse) + return(MagickFalse); + p=(*mvg_info->primitive_info)+mvg_info->offset; + mvg_info->offset+=p->coordinates; + point.x=start.x+arc.x; + point.y=start.y+segment.y-arc.y; + degrees.x=90.0; + degrees.y=180.0; + if (TraceEllipse(mvg_info,point,arc,degrees) == MagickFalse) + return(MagickFalse); + p=(*mvg_info->primitive_info)+mvg_info->offset; + mvg_info->offset+=p->coordinates; + point.x=start.x+arc.x; + point.y=start.y+arc.y; + degrees.x=180.0; + degrees.y=270.0; + if (TraceEllipse(mvg_info,point,arc,degrees) == MagickFalse) + return(MagickFalse); + p=(*mvg_info->primitive_info)+mvg_info->offset; + mvg_info->offset+=p->coordinates; + if (CheckPrimitiveExtent(mvg_info,PrimitiveExtentPad) == MagickFalse) + return(MagickFalse); + p=(*mvg_info->primitive_info)+mvg_info->offset; + if (TracePoint(p,(*mvg_info->primitive_info+offset)->point) == MagickFalse) + return(MagickFalse); + p+=p->coordinates; + mvg_info->offset=offset; + primitive_info=(*mvg_info->primitive_info)+offset; + primitive_info->coordinates=(size_t) (p-primitive_info); + primitive_info->closed_subpath=MagickTrue; + for (i=0; i < (ssize_t) primitive_info->coordinates; i++) + { + p->primitive=primitive_info->primitive; + p--; + } + return(MagickTrue); +} + +static MagickBooleanType TraceSquareLinecap(PrimitiveInfo *primitive_info, + const size_t number_vertices,const double offset) +{ + double + distance; + + double + dx, + dy; + + ssize_t + i; + + ssize_t + j; + + dx=0.0; + dy=0.0; + for (i=1; i < (ssize_t) number_vertices; i++) + { + dx=primitive_info[0].point.x-primitive_info[i].point.x; + dy=primitive_info[0].point.y-primitive_info[i].point.y; + if ((fabs((double) dx) >= MagickEpsilon) || + (fabs((double) dy) >= MagickEpsilon)) + break; + } + if (i == (ssize_t) number_vertices) + i=(ssize_t) number_vertices-1L; + distance=hypot((double) dx,(double) dy); + primitive_info[0].point.x=(double) (primitive_info[i].point.x+ + dx*(distance+offset)/distance); + primitive_info[0].point.y=(double) (primitive_info[i].point.y+ + dy*(distance+offset)/distance); + for (j=(ssize_t) number_vertices-2; j >= 0; j--) + { + dx=primitive_info[number_vertices-1].point.x-primitive_info[j].point.x; + dy=primitive_info[number_vertices-1].point.y-primitive_info[j].point.y; + if ((fabs((double) dx) >= MagickEpsilon) || + (fabs((double) dy) >= MagickEpsilon)) + break; + } + distance=hypot((double) dx,(double) dy); + primitive_info[number_vertices-1].point.x=(double) (primitive_info[j].point.x+ + dx*(distance+offset)/distance); + primitive_info[number_vertices-1].point.y=(double) (primitive_info[j].point.y+ + dy*(distance+offset)/distance); + return(MagickTrue); +} + +static PrimitiveInfo *TraceStrokePolygon(const DrawInfo *draw_info, + const PrimitiveInfo *primitive_info,ExceptionInfo *exception) +{ +#define MaxStrokePad (6*BezierQuantum+360) +#define CheckPathExtent(pad_p,pad_q) \ +{ \ + if ((pad_p) > MaxBezierCoordinates) \ + stroke_p=(PointInfo *) RelinquishMagickMemory(stroke_p); \ + else \ + if ((ssize_t) (p+(pad_p)) >= (ssize_t) extent_p) \ + { \ + if (~extent_p < (pad_p)) \ + stroke_p=(PointInfo *) RelinquishMagickMemory(stroke_p); \ + else \ + { \ + extent_p+=(pad_p); \ + stroke_p=(PointInfo *) ResizeQuantumMemory(stroke_p,extent_p+ \ + MaxStrokePad,sizeof(*stroke_p)); \ + } \ + } \ + if ((pad_q) > MaxBezierCoordinates) \ + stroke_q=(PointInfo *) RelinquishMagickMemory(stroke_q); \ + else \ + if ((ssize_t) (q+(pad_q)) >= (ssize_t) extent_q) \ + { \ + if (~extent_q < (pad_q)) \ + stroke_q=(PointInfo *) RelinquishMagickMemory(stroke_q); \ + else \ + { \ + extent_q+=(pad_q); \ + stroke_q=(PointInfo *) ResizeQuantumMemory(stroke_q,extent_q+ \ + MaxStrokePad,sizeof(*stroke_q)); \ + } \ + } \ + if ((stroke_p == (PointInfo *) NULL) || (stroke_q == (PointInfo *) NULL)) \ + { \ + if (stroke_p != (PointInfo *) NULL) \ + stroke_p=(PointInfo *) RelinquishMagickMemory(stroke_p); \ + if (stroke_q != (PointInfo *) NULL) \ + stroke_q=(PointInfo *) RelinquishMagickMemory(stroke_q); \ + polygon_primitive=(PrimitiveInfo *) \ + RelinquishMagickMemory(polygon_primitive); \ + (void) ThrowMagickException(exception,GetMagickModule(), \ + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); \ + return((PrimitiveInfo *) NULL); \ + } \ +} + + typedef struct _StrokeSegment + { + double + p, + q; + } StrokeSegment; + + double + delta_theta, + dot_product, + mid, + miterlimit; + + MagickBooleanType + closed_path; + + PointInfo + box_p[5], + box_q[5], + center, + offset, + *stroke_p, + *stroke_q; + + PrimitiveInfo + *polygon_primitive, + *stroke_polygon; + + ssize_t + i; + + size_t + arc_segments, + extent_p, + extent_q, + number_vertices; + + ssize_t + j, + n, + p, + q; + + StrokeSegment + dx = {0.0, 0.0}, + dy = {0.0, 0.0}, + inverse_slope = {0.0, 0.0}, + slope = {0.0, 0.0}, + theta = {0.0, 0.0}; + + /* + Allocate paths. + */ + number_vertices=primitive_info->coordinates; + polygon_primitive=(PrimitiveInfo *) AcquireQuantumMemory((size_t) + number_vertices+2UL,sizeof(*polygon_primitive)); + if (polygon_primitive == (PrimitiveInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return((PrimitiveInfo *) NULL); + } + (void) memcpy(polygon_primitive,primitive_info,(size_t) number_vertices* + sizeof(*polygon_primitive)); + offset.x=primitive_info[number_vertices-1].point.x-primitive_info[0].point.x; + offset.y=primitive_info[number_vertices-1].point.y-primitive_info[0].point.y; + closed_path=(fabs(offset.x) < MagickEpsilon) && + (fabs(offset.y) < MagickEpsilon) ? MagickTrue : MagickFalse; + if (((draw_info->linejoin == RoundJoin) || + (draw_info->linejoin == MiterJoin)) && (closed_path != MagickFalse)) + { + polygon_primitive[number_vertices]=primitive_info[1]; + number_vertices++; + } + polygon_primitive[number_vertices].primitive=UndefinedPrimitive; + /* + Compute the slope for the first line segment, p. + */ + dx.p=0.0; + dy.p=0.0; + for (n=1; n < (ssize_t) number_vertices; n++) + { + dx.p=polygon_primitive[n].point.x-polygon_primitive[0].point.x; + dy.p=polygon_primitive[n].point.y-polygon_primitive[0].point.y; + if ((fabs(dx.p) >= MagickEpsilon) || (fabs(dy.p) >= MagickEpsilon)) + break; + } + if (n == (ssize_t) number_vertices) + { + if ((draw_info->linecap != RoundCap) || (closed_path != MagickFalse)) + { + /* + Zero length subpath. + */ + stroke_polygon=(PrimitiveInfo *) AcquireCriticalMemory( + sizeof(*stroke_polygon)); + stroke_polygon[0]=polygon_primitive[0]; + stroke_polygon[0].coordinates=0; + polygon_primitive=(PrimitiveInfo *) RelinquishMagickMemory( + polygon_primitive); + return(stroke_polygon); + } + n=(ssize_t) number_vertices-1L; + } + extent_p=2*number_vertices; + extent_q=2*number_vertices; + stroke_p=(PointInfo *) AcquireQuantumMemory((size_t) extent_p+MaxStrokePad, + sizeof(*stroke_p)); + stroke_q=(PointInfo *) AcquireQuantumMemory((size_t) extent_q+MaxStrokePad, + sizeof(*stroke_q)); + if ((stroke_p == (PointInfo *) NULL) || (stroke_q == (PointInfo *) NULL)) + { + if (stroke_p != (PointInfo *) NULL) + stroke_p=(PointInfo *) RelinquishMagickMemory(stroke_p); + if (stroke_q != (PointInfo *) NULL) + stroke_q=(PointInfo *) RelinquishMagickMemory(stroke_q); + polygon_primitive=(PrimitiveInfo *) + RelinquishMagickMemory(polygon_primitive); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + return((PrimitiveInfo *) NULL); + } + slope.p=0.0; + inverse_slope.p=0.0; + if (fabs(dx.p) < MagickEpsilon) + { + if (dx.p >= 0.0) + slope.p=dy.p < 0.0 ? -1.0/MagickEpsilon : 1.0/MagickEpsilon; + else + slope.p=dy.p < 0.0 ? 1.0/MagickEpsilon : -1.0/MagickEpsilon; + } + else + if (fabs(dy.p) < MagickEpsilon) + { + if (dy.p >= 0.0) + inverse_slope.p=dx.p < 0.0 ? -1.0/MagickEpsilon : 1.0/MagickEpsilon; + else + inverse_slope.p=dx.p < 0.0 ? 1.0/MagickEpsilon : -1.0/MagickEpsilon; + } + else + { + slope.p=dy.p/dx.p; + inverse_slope.p=(-1.0*PerceptibleReciprocal(slope.p)); + } + mid=ExpandAffine(&draw_info->affine)*draw_info->stroke_width/2.0; + miterlimit=(double) (draw_info->miterlimit*draw_info->miterlimit*mid*mid); + if ((draw_info->linecap == SquareCap) && (closed_path == MagickFalse)) + (void) TraceSquareLinecap(polygon_primitive,number_vertices,mid); + offset.x=sqrt((double) (mid*mid/(inverse_slope.p*inverse_slope.p+1.0))); + offset.y=(double) (offset.x*inverse_slope.p); + if ((dy.p*offset.x-dx.p*offset.y) > 0.0) + { + box_p[0].x=polygon_primitive[0].point.x-offset.x; + box_p[0].y=polygon_primitive[0].point.y-offset.x*inverse_slope.p; + box_p[1].x=polygon_primitive[n].point.x-offset.x; + box_p[1].y=polygon_primitive[n].point.y-offset.x*inverse_slope.p; + box_q[0].x=polygon_primitive[0].point.x+offset.x; + box_q[0].y=polygon_primitive[0].point.y+offset.x*inverse_slope.p; + box_q[1].x=polygon_primitive[n].point.x+offset.x; + box_q[1].y=polygon_primitive[n].point.y+offset.x*inverse_slope.p; + } + else + { + box_p[0].x=polygon_primitive[0].point.x+offset.x; + box_p[0].y=polygon_primitive[0].point.y+offset.y; + box_p[1].x=polygon_primitive[n].point.x+offset.x; + box_p[1].y=polygon_primitive[n].point.y+offset.y; + box_q[0].x=polygon_primitive[0].point.x-offset.x; + box_q[0].y=polygon_primitive[0].point.y-offset.y; + box_q[1].x=polygon_primitive[n].point.x-offset.x; + box_q[1].y=polygon_primitive[n].point.y-offset.y; + } + /* + Create strokes for the line join attribute: bevel, miter, round. + */ + p=0; + q=0; + stroke_q[p++]=box_q[0]; + stroke_p[q++]=box_p[0]; + for (i=(ssize_t) n+1; i < (ssize_t) number_vertices; i++) + { + /* + Compute the slope for this line segment, q. + */ + dx.q=polygon_primitive[i].point.x-polygon_primitive[n].point.x; + dy.q=polygon_primitive[i].point.y-polygon_primitive[n].point.y; + dot_product=dx.q*dx.q+dy.q*dy.q; + if (dot_product < 0.25) + continue; + slope.q=0.0; + inverse_slope.q=0.0; + if (fabs(dx.q) < MagickEpsilon) + { + if (dx.q >= 0.0) + slope.q=dy.q < 0.0 ? -1.0/MagickEpsilon : 1.0/MagickEpsilon; + else + slope.q=dy.q < 0.0 ? 1.0/MagickEpsilon : -1.0/MagickEpsilon; + } + else + if (fabs(dy.q) < MagickEpsilon) + { + if (dy.q >= 0.0) + inverse_slope.q=dx.q < 0.0 ? -1.0/MagickEpsilon : 1.0/MagickEpsilon; + else + inverse_slope.q=dx.q < 0.0 ? 1.0/MagickEpsilon : -1.0/MagickEpsilon; + } + else + { + slope.q=dy.q/dx.q; + inverse_slope.q=(-1.0/slope.q); + } + offset.x=sqrt((double) (mid*mid/(inverse_slope.q*inverse_slope.q+1.0))); + offset.y=(double) (offset.x*inverse_slope.q); + dot_product=dy.q*offset.x-dx.q*offset.y; + if (dot_product > 0.0) + { + box_p[2].x=polygon_primitive[n].point.x-offset.x; + box_p[2].y=polygon_primitive[n].point.y-offset.y; + box_p[3].x=polygon_primitive[i].point.x-offset.x; + box_p[3].y=polygon_primitive[i].point.y-offset.y; + box_q[2].x=polygon_primitive[n].point.x+offset.x; + box_q[2].y=polygon_primitive[n].point.y+offset.y; + box_q[3].x=polygon_primitive[i].point.x+offset.x; + box_q[3].y=polygon_primitive[i].point.y+offset.y; + } + else + { + box_p[2].x=polygon_primitive[n].point.x+offset.x; + box_p[2].y=polygon_primitive[n].point.y+offset.y; + box_p[3].x=polygon_primitive[i].point.x+offset.x; + box_p[3].y=polygon_primitive[i].point.y+offset.y; + box_q[2].x=polygon_primitive[n].point.x-offset.x; + box_q[2].y=polygon_primitive[n].point.y-offset.y; + box_q[3].x=polygon_primitive[i].point.x-offset.x; + box_q[3].y=polygon_primitive[i].point.y-offset.y; + } + if (fabs((double) (slope.p-slope.q)) < MagickEpsilon) + { + box_p[4]=box_p[1]; + box_q[4]=box_q[1]; + } + else + { + box_p[4].x=(double) ((slope.p*box_p[0].x-box_p[0].y-slope.q*box_p[3].x+ + box_p[3].y)/(slope.p-slope.q)); + box_p[4].y=(double) (slope.p*(box_p[4].x-box_p[0].x)+box_p[0].y); + box_q[4].x=(double) ((slope.p*box_q[0].x-box_q[0].y-slope.q*box_q[3].x+ + box_q[3].y)/(slope.p-slope.q)); + box_q[4].y=(double) (slope.p*(box_q[4].x-box_q[0].x)+box_q[0].y); + } + CheckPathExtent(MaxStrokePad,MaxStrokePad); + dot_product=dx.q*dy.p-dx.p*dy.q; + if (dot_product <= 0.0) + switch (draw_info->linejoin) + { + case BevelJoin: + { + stroke_q[q++]=box_q[1]; + stroke_q[q++]=box_q[2]; + dot_product=(box_q[4].x-box_p[4].x)*(box_q[4].x-box_p[4].x)+ + (box_q[4].y-box_p[4].y)*(box_q[4].y-box_p[4].y); + if (dot_product <= miterlimit) + stroke_p[p++]=box_p[4]; + else + { + stroke_p[p++]=box_p[1]; + stroke_p[p++]=box_p[2]; + } + break; + } + case MiterJoin: + { + dot_product=(box_q[4].x-box_p[4].x)*(box_q[4].x-box_p[4].x)+ + (box_q[4].y-box_p[4].y)*(box_q[4].y-box_p[4].y); + if (dot_product <= miterlimit) + { + stroke_q[q++]=box_q[4]; + stroke_p[p++]=box_p[4]; + } + else + { + stroke_q[q++]=box_q[1]; + stroke_q[q++]=box_q[2]; + stroke_p[p++]=box_p[1]; + stroke_p[p++]=box_p[2]; + } + break; + } + case RoundJoin: + { + dot_product=(box_q[4].x-box_p[4].x)*(box_q[4].x-box_p[4].x)+ + (box_q[4].y-box_p[4].y)*(box_q[4].y-box_p[4].y); + if (dot_product <= miterlimit) + stroke_p[p++]=box_p[4]; + else + { + stroke_p[p++]=box_p[1]; + stroke_p[p++]=box_p[2]; + } + center=polygon_primitive[n].point; + theta.p=atan2(box_q[1].y-center.y,box_q[1].x-center.x); + theta.q=atan2(box_q[2].y-center.y,box_q[2].x-center.x); + if (theta.q < theta.p) + theta.q+=2.0*MagickPI; + arc_segments=(size_t) CastDoubleToLong(ceil((double) ((theta.q- + theta.p)/(2.0*sqrt(PerceptibleReciprocal(mid)))))); + CheckPathExtent(MaxStrokePad,arc_segments+MaxStrokePad); + stroke_q[q].x=box_q[1].x; + stroke_q[q].y=box_q[1].y; + q++; + for (j=1; j < (ssize_t) arc_segments; j++) + { + delta_theta=(double) (j*(theta.q-theta.p)/arc_segments); + stroke_q[q].x=(double) (center.x+mid*cos(fmod((double) + (theta.p+delta_theta),DegreesToRadians(360.0)))); + stroke_q[q].y=(double) (center.y+mid*sin(fmod((double) + (theta.p+delta_theta),DegreesToRadians(360.0)))); + q++; + } + stroke_q[q++]=box_q[2]; + break; + } + default: + break; + } + else + switch (draw_info->linejoin) + { + case BevelJoin: + { + stroke_p[p++]=box_p[1]; + stroke_p[p++]=box_p[2]; + dot_product=(box_q[4].x-box_p[4].x)*(box_q[4].x-box_p[4].x)+ + (box_q[4].y-box_p[4].y)*(box_q[4].y-box_p[4].y); + if (dot_product <= miterlimit) + stroke_q[q++]=box_q[4]; + else + { + stroke_q[q++]=box_q[1]; + stroke_q[q++]=box_q[2]; + } + break; + } + case MiterJoin: + { + dot_product=(box_q[4].x-box_p[4].x)*(box_q[4].x-box_p[4].x)+ + (box_q[4].y-box_p[4].y)*(box_q[4].y-box_p[4].y); + if (dot_product <= miterlimit) + { + stroke_q[q++]=box_q[4]; + stroke_p[p++]=box_p[4]; + } + else + { + stroke_q[q++]=box_q[1]; + stroke_q[q++]=box_q[2]; + stroke_p[p++]=box_p[1]; + stroke_p[p++]=box_p[2]; + } + break; + } + case RoundJoin: + { + dot_product=(box_q[4].x-box_p[4].x)*(box_q[4].x-box_p[4].x)+ + (box_q[4].y-box_p[4].y)*(box_q[4].y-box_p[4].y); + if (dot_product <= miterlimit) + stroke_q[q++]=box_q[4]; + else + { + stroke_q[q++]=box_q[1]; + stroke_q[q++]=box_q[2]; + } + center=polygon_primitive[n].point; + theta.p=atan2(box_p[1].y-center.y,box_p[1].x-center.x); + theta.q=atan2(box_p[2].y-center.y,box_p[2].x-center.x); + if (theta.p < theta.q) + theta.p+=2.0*MagickPI; + arc_segments=(size_t) CastDoubleToLong(ceil((double) ((theta.p- + theta.q)/(2.0*sqrt((double) (PerceptibleReciprocal(mid))))))); + CheckPathExtent(arc_segments+MaxStrokePad,MaxStrokePad); + stroke_p[p++]=box_p[1]; + for (j=1; j < (ssize_t) arc_segments; j++) + { + delta_theta=(double) (j*(theta.q-theta.p)/arc_segments); + stroke_p[p].x=(double) (center.x+mid*cos(fmod((double) + (theta.p+delta_theta),DegreesToRadians(360.0)))); + stroke_p[p].y=(double) (center.y+mid*sin(fmod((double) + (theta.p+delta_theta),DegreesToRadians(360.0)))); + p++; + } + stroke_p[p++]=box_p[2]; + break; + } + default: + break; + } + slope.p=slope.q; + inverse_slope.p=inverse_slope.q; + box_p[0]=box_p[2]; + box_p[1]=box_p[3]; + box_q[0]=box_q[2]; + box_q[1]=box_q[3]; + dx.p=dx.q; + dy.p=dy.q; + n=i; + } + stroke_p[p++]=box_p[1]; + stroke_q[q++]=box_q[1]; + /* + Trace stroked polygon. + */ + stroke_polygon=(PrimitiveInfo *) AcquireQuantumMemory((size_t) + (p+q+2UL*closed_path+2UL),sizeof(*stroke_polygon)); + if (stroke_polygon == (PrimitiveInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + stroke_p=(PointInfo *) RelinquishMagickMemory(stroke_p); + stroke_q=(PointInfo *) RelinquishMagickMemory(stroke_q); + polygon_primitive=(PrimitiveInfo *) RelinquishMagickMemory( + polygon_primitive); + return(stroke_polygon); + } + for (i=0; i < (ssize_t) p; i++) + { + stroke_polygon[i]=polygon_primitive[0]; + stroke_polygon[i].point=stroke_p[i]; + } + if (closed_path != MagickFalse) + { + stroke_polygon[i]=polygon_primitive[0]; + stroke_polygon[i].point=stroke_polygon[0].point; + i++; + } + for ( ; i < (ssize_t) (p+q+closed_path); i++) + { + stroke_polygon[i]=polygon_primitive[0]; + stroke_polygon[i].point=stroke_q[p+q+closed_path-(i+1)]; + } + if (closed_path != MagickFalse) + { + stroke_polygon[i]=polygon_primitive[0]; + stroke_polygon[i].point=stroke_polygon[p+closed_path].point; + i++; + } + stroke_polygon[i]=polygon_primitive[0]; + stroke_polygon[i].point=stroke_polygon[0].point; + i++; + stroke_polygon[i].primitive=UndefinedPrimitive; + stroke_polygon[0].coordinates=(size_t) (p+q+2*closed_path+1); + stroke_p=(PointInfo *) RelinquishMagickMemory(stroke_p); + stroke_q=(PointInfo *) RelinquishMagickMemory(stroke_q); + polygon_primitive=(PrimitiveInfo *) RelinquishMagickMemory(polygon_primitive); + return(stroke_polygon); +} diff --git a/ImageMagick-6.9.12-44/magick/draw.h b/ImageMagick-6.9.12-44/magick/draw.h new file mode 100644 index 0000000..a44ef3a --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/draw.h @@ -0,0 +1,422 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore drawing methods. +*/ +#ifndef MAGICKCORE_DRAW_H +#define MAGICKCORE_DRAW_H + +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/pixel.h" +#include "magick/type.h" +#include "magick/color.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef enum +{ + UndefinedAlign, + LeftAlign, + CenterAlign, + RightAlign +} AlignType; + +typedef enum +{ + UndefinedPathUnits, + UserSpace, + UserSpaceOnUse, + ObjectBoundingBox +} ClipPathUnits; + +typedef enum +{ + UndefinedDecoration, + NoDecoration, + UnderlineDecoration, + OverlineDecoration, + LineThroughDecoration +} DecorationType; + +typedef enum +{ + UndefinedDirection, + RightToLeftDirection, + LeftToRightDirection +} DirectionType; + +typedef enum +{ + UndefinedRule, +#undef EvenOddRule + EvenOddRule, + NonZeroRule +} FillRule; + +typedef enum +{ + UndefinedGradient, + LinearGradient, + RadialGradient +} GradientType; + +typedef enum +{ + UndefinedCap, + ButtCap, + RoundCap, + SquareCap +} LineCap; + +typedef enum +{ + UndefinedJoin, + MiterJoin, + RoundJoin, + BevelJoin +} LineJoin; + +typedef enum +{ + UndefinedMethod, + PointMethod, + ReplaceMethod, + FloodfillMethod, + FillToBorderMethod, + ResetMethod +} PaintMethod; + +typedef enum +{ + UndefinedPrimitive, + PointPrimitive, + LinePrimitive, + RectanglePrimitive, + RoundRectanglePrimitive, + ArcPrimitive, + EllipsePrimitive, + CirclePrimitive, + PolylinePrimitive, + PolygonPrimitive, + BezierPrimitive, + ColorPrimitive, + MattePrimitive, + TextPrimitive, + ImagePrimitive, + PathPrimitive +} PrimitiveType; + +typedef enum +{ + UndefinedReference, + GradientReference +} ReferenceType; + +typedef enum +{ + UndefinedSpread, + PadSpread, + ReflectSpread, + RepeatSpread +} SpreadMethod; + +typedef struct _PointInfo +{ + double + x, + y; +} PointInfo; + +typedef struct _StopInfo +{ + MagickPixelPacket + color; + + MagickRealType + offset; +} StopInfo; + +typedef struct _GradientInfo +{ + GradientType + type; + + RectangleInfo + bounding_box; + + SegmentInfo + gradient_vector; + + StopInfo + *stops; + + size_t + number_stops; + + SpreadMethod + spread; + + MagickBooleanType + debug; + + size_t + signature; + + PointInfo + center; + + MagickRealType + radius, + angle; + + PointInfo + radii; +} GradientInfo; + +typedef struct _ElementReference +{ + char + *id; + + ReferenceType + type; + + GradientInfo + gradient; + + size_t + signature; + + struct _ElementReference + *previous, + *next; +} ElementReference; + +typedef struct _DrawInfo +{ + char + *primitive, + *geometry; + + RectangleInfo + viewbox; + + AffineMatrix + affine; + + GravityType + gravity; + + PixelPacket + fill, + stroke; + + double + stroke_width; + + GradientInfo + gradient; + + Image + *fill_pattern, + *tile, + *stroke_pattern; + + MagickBooleanType + stroke_antialias, + text_antialias; + + FillRule + fill_rule; + + LineCap + linecap; + + LineJoin + linejoin; + + size_t + miterlimit; + + double + dash_offset; + + DecorationType + decorate; + + CompositeOperator + compose; + + char + *text; + + size_t + face; + + char + *font, + *metrics, + *family; + + StyleType + style; + + StretchType + stretch; + + size_t + weight; + + char + *encoding; + + double + pointsize; + + char + *density; + + AlignType + align; + + PixelPacket + undercolor, + border_color; + + char + *server_name; + + double + *dash_pattern; + + char + *clip_mask; + + SegmentInfo + bounds; + + ClipPathUnits + clip_units; + + Quantum + opacity; + + MagickBooleanType + render; + + ElementReference + element_reference; + + MagickBooleanType + debug; + + size_t + signature; + + double + kerning, + interword_spacing, + interline_spacing; + + DirectionType + direction; + + double + fill_opacity, + stroke_opacity; + + MagickBooleanType + clip_path; + + Image + *clipping_mask; + + ComplianceType + compliance; + + Image + *composite_mask; + + char + *id; +} DrawInfo; + +typedef struct _PrimitiveInfo +{ + PointInfo + point; + + size_t + coordinates; + + PrimitiveType + primitive; + + PaintMethod + method; + + char + *text; + + MagickBooleanType + closed_subpath; +} PrimitiveInfo; + +typedef struct _TypeMetric +{ + PointInfo + pixels_per_em; + + double + ascent, + descent, + width, + height, + max_advance, + underline_position, + underline_thickness; + + SegmentInfo + bounds; + + PointInfo + origin; +} TypeMetric; + +extern MagickExport DrawInfo + *AcquireDrawInfo(void), + *CloneDrawInfo(const ImageInfo *,const DrawInfo *), + *DestroyDrawInfo(DrawInfo *); + +extern MagickExport MagickBooleanType + DrawAffineImage(Image *,const Image *,const AffineMatrix *), + DrawClipPath(Image *,const DrawInfo *,const char *), + DrawGradientImage(Image *,const DrawInfo *), + DrawImage(Image *,const DrawInfo *), + DrawPatternPath(Image *,const DrawInfo *,const char *,Image **), + DrawPrimitive(Image *,const DrawInfo *,const PrimitiveInfo *); + +extern MagickExport void + GetAffineMatrix(AffineMatrix *), + GetDrawInfo(const ImageInfo *,DrawInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/effect.c b/ImageMagick-6.9.12-44/magick/effect.c new file mode 100644 index 0000000..9833129 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/effect.c @@ -0,0 +1,4762 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% EEEEE FFFFF FFFFF EEEEE CCCC TTTTT % +% E F F E C T % +% EEE FFF FFF EEE C T % +% E F F E C T % +% EEEEE F F EEEEE CCCC T % +% % +% % +% MagickCore Image Effects Methods % +% % +% Software Design % +% Cristy % +% October 1996 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/accelerate-private.h" +#include "magick/blob.h" +#include "magick/cache-view.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/constitute.h" +#include "magick/decorate.h" +#include "magick/distort.h" +#include "magick/draw.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/effect.h" +#include "magick/fx.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/matrix.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/montage.h" +#include "magick/morphology.h" +#include "magick/morphology-private.h" +#include "magick/opencl-private.h" +#include "magick/paint.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/quantum.h" +#include "magick/random_.h" +#include "magick/random-private.h" +#include "magick/resample.h" +#include "magick/resample-private.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/segment.h" +#include "magick/shear.h" +#include "magick/signature-private.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/thread-private.h" +#include "magick/transform.h" +#include "magick/threshold.h" + +#ifdef MAGICKCORE_CLPERFMARKER +#include "CLPerfMarker.h" +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A d a p t i v e B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AdaptiveBlurImage() adaptively blurs the image by blurring less +% intensely near image edges and more intensely far from edges. We blur the +% image with a Gaussian operator of the given radius and standard deviation +% (sigma). For reasonable results, radius should be larger than sigma. Use a +% radius of 0 and AdaptiveBlurImage() selects a suitable radius for you. +% +% The format of the AdaptiveBlurImage method is: +% +% Image *AdaptiveBlurImage(const Image *image,const double radius, +% const double sigma,ExceptionInfo *exception) +% Image *AdaptiveBlurImageChannel(const Image *image, +% const ChannelType channel,double radius,const double sigma, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Laplacian, in pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *AdaptiveBlurImage(const Image *image,const double radius, + const double sigma,ExceptionInfo *exception) +{ + Image + *blur_image; + + blur_image=AdaptiveBlurImageChannel(image,DefaultChannels,radius,sigma, + exception); + return(blur_image); +} + +MagickExport Image *AdaptiveBlurImageChannel(const Image *image, + const ChannelType channel,const double radius,const double sigma, + ExceptionInfo *exception) +{ +#define AdaptiveBlurImageTag "Convolve/Image" +#define MagickSigma (fabs(sigma) < MagickEpsilon ? MagickEpsilon : sigma) + + CacheView + *blur_view, + *edge_view, + *image_view; + + double + **kernel, + normalize; + + Image + *blur_image, + *edge_image, + *gaussian_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + bias; + + ssize_t + i; + + size_t + width; + + ssize_t + j, + k, + u, + v, + y; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + blur_image=CloneImage(image,0,0,MagickTrue,exception); + if (blur_image == (Image *) NULL) + return((Image *) NULL); + if (fabs(sigma) <= MagickEpsilon) + return(blur_image); + if (SetImageStorageClass(blur_image,DirectClass) == MagickFalse) + { + InheritException(exception,&blur_image->exception); + blur_image=DestroyImage(blur_image); + return((Image *) NULL); + } + /* + Edge detect the image brighness channel, level, blur, and level again. + */ + edge_image=EdgeImage(image,radius,exception); + if (edge_image == (Image *) NULL) + { + blur_image=DestroyImage(blur_image); + return((Image *) NULL); + } + (void) AutoLevelImage(edge_image); + gaussian_image=BlurImage(edge_image,radius,sigma,exception); + if (gaussian_image != (Image *) NULL) + { + edge_image=DestroyImage(edge_image); + edge_image=gaussian_image; + } + (void) AutoLevelImage(edge_image); + /* + Create a set of kernels from maximum (radius,sigma) to minimum. + */ + width=GetOptimalKernelWidth2D(radius,sigma); + kernel=(double **) MagickAssumeAligned(AcquireAlignedMemory((size_t) width, + sizeof(*kernel))); + if (kernel == (double **) NULL) + { + edge_image=DestroyImage(edge_image); + blur_image=DestroyImage(blur_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(kernel,0,(size_t) width*sizeof(*kernel)); + for (i=0; i < (ssize_t) width; i+=2) + { + kernel[i]=(double *) MagickAssumeAligned(AcquireAlignedMemory((size_t) + (width-i),(width-i)*sizeof(**kernel))); + if (kernel[i] == (double *) NULL) + break; + normalize=0.0; + j=(ssize_t) (width-i-1)/2; + k=0; + for (v=(-j); v <= j; v++) + { + for (u=(-j); u <= j; u++) + { + kernel[i][k]=(double) (exp(-((double) u*u+v*v)/(2.0*MagickSigma* + MagickSigma))/(2.0*MagickPI*MagickSigma*MagickSigma)); + normalize+=kernel[i][k]; + k++; + } + } + kernel[i][(k-1)/2]+=(1.0-normalize); + if (sigma < MagickEpsilon) + kernel[i][(k-1)/2]=1.0; + } + if (i < (ssize_t) width) + { + for (i-=2; i >= 0; i-=2) + kernel[i]=(double *) RelinquishAlignedMemory(kernel[i]); + kernel=(double **) RelinquishAlignedMemory(kernel); + edge_image=DestroyImage(edge_image); + blur_image=DestroyImage(blur_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Adaptively blur image. + */ + status=MagickTrue; + progress=0; + GetMagickPixelPacket(image,&bias); + SetMagickPixelPacketBias(image,&bias); + image_view=AcquireVirtualCacheView(image,exception); + edge_view=AcquireVirtualCacheView(edge_image,exception); + blur_view=AcquireAuthenticCacheView(blur_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,blur_image,blur_image->rows,1) +#endif + for (y=0; y < (ssize_t) blur_image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p, + *magick_restrict r; + + IndexPacket + *magick_restrict blur_indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + r=GetCacheViewVirtualPixels(edge_view,0,y,edge_image->columns,1,exception); + q=QueueCacheViewAuthenticPixels(blur_view,0,y,blur_image->columns,1, + exception); + if ((r == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + blur_indexes=GetCacheViewAuthenticIndexQueue(blur_view); + for (x=0; x < (ssize_t) blur_image->columns; x++) + { + double + alpha, + gamma; + + DoublePixelPacket + pixel; + + const double + *magick_restrict k; + + ssize_t + i, + u, + v; + + gamma=0.0; + i=CastDoubleToLong(ceil((double) width*QuantumScale* + GetPixelIntensity(edge_image,r)-0.5)); + if (i < 0) + i=0; + else + if (i > (ssize_t) width) + i=(ssize_t) width; + if ((i & 0x01) != 0) + i--; + p=GetCacheViewVirtualPixels(image_view,x-((ssize_t) (width-i)/2L),y- + (ssize_t) ((width-i)/2L),width-i,width-i,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetCacheViewVirtualIndexQueue(image_view); + pixel.red=bias.red; + pixel.green=bias.green; + pixel.blue=bias.blue; + pixel.opacity=bias.opacity; + pixel.index=bias.index; + k=kernel[i]; + for (v=0; v < (ssize_t) (width-i); v++) + { + for (u=0; u < (ssize_t) (width-i); u++) + { + alpha=1.0; + if (((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + alpha=(MagickRealType) (QuantumScale*GetPixelAlpha(p)); + if ((channel & RedChannel) != 0) + pixel.red+=(*k)*alpha*GetPixelRed(p); + if ((channel & GreenChannel) != 0) + pixel.green+=(*k)*alpha*GetPixelGreen(p); + if ((channel & BlueChannel) != 0) + pixel.blue+=(*k)*alpha*GetPixelBlue(p); + if ((channel & OpacityChannel) != 0) + pixel.opacity+=(*k)*GetPixelOpacity(p); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + pixel.index+=(*k)*alpha*GetPixelIndex(indexes+x+(width-i)*v+u); + gamma+=(*k)*alpha; + k++; + p++; + } + } + gamma=PerceptibleReciprocal(gamma); + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(gamma*pixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(gamma*pixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(gamma*pixel.blue)); + if ((channel & OpacityChannel) != 0) + SetPixelOpacity(q,ClampToQuantum(pixel.opacity)); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(blur_indexes+x,ClampToQuantum(gamma*pixel.index)); + q++; + r++; + } + if (SyncCacheViewAuthenticPixels(blur_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,AdaptiveBlurImageTag,progress, + image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + blur_image->type=image->type; + blur_view=DestroyCacheView(blur_view); + edge_view=DestroyCacheView(edge_view); + image_view=DestroyCacheView(image_view); + edge_image=DestroyImage(edge_image); + for (i=0; i < (ssize_t) width; i+=2) + kernel[i]=(double *) RelinquishAlignedMemory(kernel[i]); + kernel=(double **) RelinquishAlignedMemory(kernel); + if (status == MagickFalse) + blur_image=DestroyImage(blur_image); + return(blur_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A d a p t i v e S h a r p e n I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AdaptiveSharpenImage() adaptively sharpens the image by sharpening more +% intensely near image edges and less intensely far from edges. We sharpen the +% image with a Gaussian operator of the given radius and standard deviation +% (sigma). For reasonable results, radius should be larger than sigma. Use a +% radius of 0 and AdaptiveSharpenImage() selects a suitable radius for you. +% +% The format of the AdaptiveSharpenImage method is: +% +% Image *AdaptiveSharpenImage(const Image *image,const double radius, +% const double sigma,ExceptionInfo *exception) +% Image *AdaptiveSharpenImageChannel(const Image *image, +% const ChannelType channel,double radius,const double sigma, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Laplacian, in pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius, + const double sigma,ExceptionInfo *exception) +{ + Image + *sharp_image; + + sharp_image=AdaptiveSharpenImageChannel(image,DefaultChannels,radius,sigma, + exception); + return(sharp_image); +} + +MagickExport Image *AdaptiveSharpenImageChannel(const Image *image, + const ChannelType channel,const double radius,const double sigma, + ExceptionInfo *exception) +{ +#define AdaptiveSharpenImageTag "Convolve/Image" +#define MagickSigma (fabs(sigma) < MagickEpsilon ? MagickEpsilon : sigma) + + CacheView + *sharp_view, + *edge_view, + *image_view; + + double + **kernel, + normalize; + + Image + *sharp_image, + *edge_image, + *gaussian_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + bias; + + ssize_t + i; + + size_t + width; + + ssize_t + j, + k, + u, + v, + y; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + sharp_image=CloneImage(image,0,0,MagickTrue,exception); + if (sharp_image == (Image *) NULL) + return((Image *) NULL); + if (fabs(sigma) <= MagickEpsilon) + return(sharp_image); + if (SetImageStorageClass(sharp_image,DirectClass) == MagickFalse) + { + InheritException(exception,&sharp_image->exception); + sharp_image=DestroyImage(sharp_image); + return((Image *) NULL); + } + /* + Edge detect the image brighness channel, level, sharp, and level again. + */ + edge_image=EdgeImage(image,radius,exception); + if (edge_image == (Image *) NULL) + { + sharp_image=DestroyImage(sharp_image); + return((Image *) NULL); + } + (void) AutoLevelImage(edge_image); + gaussian_image=BlurImage(edge_image,radius,sigma,exception); + if (gaussian_image != (Image *) NULL) + { + edge_image=DestroyImage(edge_image); + edge_image=gaussian_image; + } + (void) AutoLevelImage(edge_image); + /* + Create a set of kernels from maximum (radius,sigma) to minimum. + */ + width=GetOptimalKernelWidth2D(radius,sigma); + kernel=(double **) MagickAssumeAligned(AcquireAlignedMemory((size_t) width, + sizeof(*kernel))); + if (kernel == (double **) NULL) + { + edge_image=DestroyImage(edge_image); + sharp_image=DestroyImage(sharp_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memset(kernel,0,(size_t) width*sizeof(*kernel)); + for (i=0; i < (ssize_t) width; i+=2) + { + kernel[i]=(double *) MagickAssumeAligned(AcquireAlignedMemory((size_t) + (width-i),(width-i)*sizeof(**kernel))); + if (kernel[i] == (double *) NULL) + break; + normalize=0.0; + j=(ssize_t) (width-i-1)/2; + k=0; + for (v=(-j); v <= j; v++) + { + for (u=(-j); u <= j; u++) + { + kernel[i][k]=(double) (-exp(-((double) u*u+v*v)/(2.0*MagickSigma* + MagickSigma))/(2.0*MagickPI*MagickSigma*MagickSigma)); + normalize+=kernel[i][k]; + k++; + } + } + kernel[i][(k-1)/2]=(double) ((-2.0)*normalize); + if (sigma < MagickEpsilon) + kernel[i][(k-1)/2]=1.0; + } + if (i < (ssize_t) width) + { + for (i-=2; i >= 0; i-=2) + kernel[i]=(double *) RelinquishAlignedMemory(kernel[i]); + kernel=(double **) RelinquishAlignedMemory(kernel); + edge_image=DestroyImage(edge_image); + sharp_image=DestroyImage(sharp_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Adaptively sharpen image. + */ + status=MagickTrue; + progress=0; + GetMagickPixelPacket(image,&bias); + SetMagickPixelPacketBias(image,&bias); + image_view=AcquireVirtualCacheView(image,exception); + edge_view=AcquireVirtualCacheView(edge_image,exception); + sharp_view=AcquireAuthenticCacheView(sharp_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,sharp_image,sharp_image->rows,1) +#endif + for (y=0; y < (ssize_t) sharp_image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p, + *magick_restrict r; + + IndexPacket + *magick_restrict sharp_indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + r=GetCacheViewVirtualPixels(edge_view,0,y,edge_image->columns,1,exception); + q=QueueCacheViewAuthenticPixels(sharp_view,0,y,sharp_image->columns,1, + exception); + if ((r == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + sharp_indexes=GetCacheViewAuthenticIndexQueue(sharp_view); + for (x=0; x < (ssize_t) sharp_image->columns; x++) + { + double + alpha, + gamma; + + DoublePixelPacket + pixel; + + const double + *magick_restrict k; + + ssize_t + i, + u, + v; + + gamma=0.0; + i=CastDoubleToLong(ceil((double) width*(1.0-QuantumScale* + GetPixelIntensity(edge_image,r))-0.5)); + if (i < 0) + i=0; + else + if (i > (ssize_t) width) + i=(ssize_t) width; + if ((i & 0x01) != 0) + i--; + p=GetCacheViewVirtualPixels(image_view,x-((ssize_t) (width-i)/2L),y- + (ssize_t) ((width-i)/2L),width-i,width-i,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetCacheViewVirtualIndexQueue(image_view); + k=kernel[i]; + pixel.red=bias.red; + pixel.green=bias.green; + pixel.blue=bias.blue; + pixel.opacity=bias.opacity; + pixel.index=bias.index; + for (v=0; v < (ssize_t) (width-i); v++) + { + for (u=0; u < (ssize_t) (width-i); u++) + { + alpha=1.0; + if (((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + alpha=(MagickRealType) (QuantumScale*GetPixelAlpha(p)); + if ((channel & RedChannel) != 0) + pixel.red+=(*k)*alpha*GetPixelRed(p); + if ((channel & GreenChannel) != 0) + pixel.green+=(*k)*alpha*GetPixelGreen(p); + if ((channel & BlueChannel) != 0) + pixel.blue+=(*k)*alpha*GetPixelBlue(p); + if ((channel & OpacityChannel) != 0) + pixel.opacity+=(*k)*GetPixelOpacity(p); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + pixel.index+=(*k)*alpha*GetPixelIndex(indexes+x+(width-i)*v+u); + gamma+=(*k)*alpha; + k++; + p++; + } + } + gamma=PerceptibleReciprocal(gamma); + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(gamma*pixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(gamma*pixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(gamma*pixel.blue)); + if ((channel & OpacityChannel) != 0) + SetPixelOpacity(q,ClampToQuantum(pixel.opacity)); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(sharp_indexes+x,ClampToQuantum(gamma*pixel.index)); + q++; + r++; + } + if (SyncCacheViewAuthenticPixels(sharp_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,AdaptiveSharpenImageTag,progress, + image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + sharp_image->type=image->type; + sharp_view=DestroyCacheView(sharp_view); + edge_view=DestroyCacheView(edge_view); + image_view=DestroyCacheView(image_view); + edge_image=DestroyImage(edge_image); + for (i=0; i < (ssize_t) width; i+=2) + kernel[i]=(double *) RelinquishAlignedMemory(kernel[i]); + kernel=(double **) RelinquishAlignedMemory(kernel); + if (status == MagickFalse) + sharp_image=DestroyImage(sharp_image); + return(sharp_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% BlurImage() blurs an image. We convolve the image with a Gaussian operator +% of the given radius and standard deviation (sigma). For reasonable results, +% the radius should be larger than sigma. Use a radius of 0 and BlurImage() +% selects a suitable radius for you. +% +% The format of the BlurImage method is: +% +% Image *BlurImage(const Image *image,const double radius, +% const double sigma,ExceptionInfo *exception) +% Image *BlurImageChannel(const Image *image,const ChannelType channel, +% const double radius,const double sigma,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *BlurImage(const Image *image,const double radius, + const double sigma,ExceptionInfo *exception) +{ + Image + *blur_image; + + blur_image=BlurImageChannel(image,DefaultChannels,radius,sigma,exception); + return(blur_image); +} + +MagickExport Image *BlurImageChannel(const Image *image, + const ChannelType channel,const double radius,const double sigma, + ExceptionInfo *exception) +{ + char + geometry[MaxTextExtent]; + + KernelInfo + *kernel_info; + + Image + *blur_image = NULL; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); +#if defined(MAGICKCORE_OPENCL_SUPPORT) + blur_image=AccelerateBlurImage(image,channel,radius,sigma,exception); + if (blur_image != (Image *) NULL) + return(blur_image); +#endif + (void) FormatLocaleString(geometry,MaxTextExtent, + "blur:%.20gx%.20g;blur:%.20gx%.20g+90",radius,sigma,radius,sigma); + kernel_info=AcquireKernelInfo(geometry); + if (kernel_info == (KernelInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + blur_image=MorphologyImageChannel(image,channel,ConvolveMorphology,1, + kernel_info,exception); + kernel_info=DestroyKernelInfo(kernel_info); + return(blur_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v o l v e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvolveImage() applies a custom convolution kernel to the image. +% +% The format of the ConvolveImage method is: +% +% Image *ConvolveImage(const Image *image,const size_t order, +% const double *kernel,ExceptionInfo *exception) +% Image *ConvolveImageChannel(const Image *image,const ChannelType channel, +% const size_t order,const double *kernel,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o order: the number of columns and rows in the filter kernel. +% +% o kernel: An array of double representing the convolution kernel. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *ConvolveImage(const Image *image,const size_t order, + const double *kernel,ExceptionInfo *exception) +{ + Image + *convolve_image; + +#ifdef MAGICKCORE_CLPERFMARKER + clBeginPerfMarkerAMD(__FUNCTION__,""); +#endif + + convolve_image=ConvolveImageChannel(image,DefaultChannels,order,kernel, + exception); + +#ifdef MAGICKCORE_CLPERFMARKER + clEndPerfMarkerAMD(); +#endif + return(convolve_image); +} + +MagickExport Image *ConvolveImageChannel(const Image *image, + const ChannelType channel,const size_t order,const double *kernel, + ExceptionInfo *exception) +{ + Image + *convolve_image; + + KernelInfo + *kernel_info; + + ssize_t + i; + + kernel_info=AcquireKernelInfo((const char *) NULL); + if (kernel_info == (KernelInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + kernel_info->width=order; + kernel_info->height=order; + kernel_info->x=(ssize_t) (order-1)/2; + kernel_info->y=(ssize_t) (order-1)/2; + kernel_info->signature=MagickCoreSignature; + kernel_info->values=(double *) MagickAssumeAligned(AcquireAlignedMemory( + kernel_info->width,kernel_info->width*sizeof(*kernel_info->values))); + if (kernel_info->values == (double *) NULL) + { + kernel_info=DestroyKernelInfo(kernel_info); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (i=0; i < (ssize_t) (order*order); i++) + kernel_info->values[i]=kernel[i]; + convolve_image=(Image *) NULL; +#if defined(MAGICKCORE_OPENCL_SUPPORT) + convolve_image=AccelerateConvolveImageChannel(image,channel,kernel_info, + exception); +#endif + if (convolve_image == (Image *) NULL) + convolve_image=MorphologyImageChannel(image,channel,ConvolveMorphology,1, + kernel_info,exception); + kernel_info=DestroyKernelInfo(kernel_info); + return(convolve_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s p e c k l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DespeckleImage() reduces the speckle noise in an image while perserving the +% edges of the original image. A speckle removing filter uses a complementary +% hulling technique (raising pixels that are darker than their surrounding +% neighbors, then complementarily lowering pixels that are brighter than their +% surrounding neighbors) to reduce the speckle index of that image (reference +% Crimmins speckle removal). +% +% The format of the DespeckleImage method is: +% +% Image *DespeckleImage(const Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static void Hull(const Image *image,const ssize_t x_offset, + const ssize_t y_offset,const size_t columns,const size_t rows, + const int polarity,Quantum *magick_restrict f,Quantum *magick_restrict g) +{ + Quantum + *p, + *q, + *r, + *s; + + ssize_t + y; + + assert(f != (Quantum *) NULL); + assert(g != (Quantum *) NULL); + p=f+(columns+2); + q=g+(columns+2); + r=p+(y_offset*((ssize_t) columns+2)+x_offset); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) \ + magick_number_threads(image,image,rows,1) +#endif + for (y=0; y < (ssize_t) rows; y++) + { + ssize_t + i, + x; + + SignedQuantum + v; + + i=(2*y+1)+y*columns; + if (polarity > 0) + for (x=0; x < (ssize_t) columns; x++) + { + v=(SignedQuantum) p[i]; + if ((SignedQuantum) r[i] >= (v+ScaleCharToQuantum(2))) + v+=ScaleCharToQuantum(1); + q[i]=(Quantum) v; + i++; + } + else + for (x=0; x < (ssize_t) columns; x++) + { + v=(SignedQuantum) p[i]; + if ((SignedQuantum) r[i] <= (v-ScaleCharToQuantum(2))) + v-=ScaleCharToQuantum(1); + q[i]=(Quantum) v; + i++; + } + } + + p=f+(columns+2); + q=g+(columns+2); + r=q+(y_offset*((ssize_t) columns+2)+x_offset); + s=q-(y_offset*((ssize_t) columns+2)+x_offset); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) \ + magick_number_threads(image,image,rows,1) +#endif + for (y=0; y < (ssize_t) rows; y++) + { + ssize_t + i, + x; + + SignedQuantum + v; + + i=(2*y+1)+y*columns; + if (polarity > 0) + for (x=0; x < (ssize_t) columns; x++) + { + v=(SignedQuantum) q[i]; + if (((SignedQuantum) s[i] >= (v+ScaleCharToQuantum(2))) && + ((SignedQuantum) r[i] > v)) + v+=ScaleCharToQuantum(1); + p[i]=(Quantum) v; + i++; + } + else + for (x=0; x < (ssize_t) columns; x++) + { + v=(SignedQuantum) q[i]; + if (((SignedQuantum) s[i] <= (v-ScaleCharToQuantum(2))) && + ((SignedQuantum) r[i] < v)) + v-=ScaleCharToQuantum(1); + p[i]=(Quantum) v; + i++; + } + } +} + +MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) +{ +#define DespeckleImageTag "Despeckle/Image" + + CacheView + *despeckle_view, + *image_view; + + Image + *despeckle_image; + + MagickBooleanType + status; + + MemoryInfo + *buffer_info, + *pixel_info; + + ssize_t + i; + + Quantum + *magick_restrict buffer, + *magick_restrict pixels; + + size_t + length, + number_channels; + + static const ssize_t + X[4] = {0, 1, 1,-1}, + Y[4] = {1, 0, 1, 1}; + + /* + Allocate despeckled image. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); +#if defined(MAGICKCORE_OPENCL_SUPPORT) + despeckle_image=AccelerateDespeckleImage(image, exception); + if (despeckle_image != (Image *) NULL) + return(despeckle_image); +#endif + despeckle_image=CloneImage(image,0,0,MagickTrue,exception); + if (despeckle_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(despeckle_image,DirectClass) == MagickFalse) + { + InheritException(exception,&despeckle_image->exception); + despeckle_image=DestroyImage(despeckle_image); + return((Image *) NULL); + } + /* + Allocate image buffer. + */ + length=(size_t) ((image->columns+2)*(image->rows+2)); + pixel_info=AcquireVirtualMemory(length,sizeof(*pixels)); + buffer_info=AcquireVirtualMemory(length,sizeof(*buffer)); + if ((pixel_info == (MemoryInfo *) NULL) || + (buffer_info == (MemoryInfo *) NULL)) + { + if (buffer_info != (MemoryInfo *) NULL) + buffer_info=RelinquishVirtualMemory(buffer_info); + if (pixel_info != (MemoryInfo *) NULL) + pixel_info=RelinquishVirtualMemory(pixel_info); + despeckle_image=DestroyImage(despeckle_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + pixels=(Quantum *) GetVirtualMemoryBlob(pixel_info); + buffer=(Quantum *) GetVirtualMemoryBlob(buffer_info); + /* + Reduce speckle in the image. + */ + status=MagickTrue; + number_channels=(size_t) (image->colorspace == CMYKColorspace ? 5 : 4); + image_view=AcquireVirtualCacheView(image,exception); + despeckle_view=AcquireAuthenticCacheView(despeckle_image,exception); + for (i=0; i < (ssize_t) number_channels; i++) + { + ssize_t + k, + x; + + ssize_t + j, + y; + + if (status == MagickFalse) + continue; + if ((image->matte == MagickFalse) && (i == 3)) + continue; + (void) memset(pixels,0,length*sizeof(*pixels)); + j=(ssize_t) image->columns+2; + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetCacheViewVirtualIndexQueue(image_view); + j++; + for (x=0; x < (ssize_t) image->columns; x++) + { + switch (i) + { + case 0: pixels[j]=GetPixelRed(p); break; + case 1: pixels[j]=GetPixelGreen(p); break; + case 2: pixels[j]=GetPixelBlue(p); break; + case 3: pixels[j]=GetPixelOpacity(p); break; + case 4: pixels[j]=GetPixelBlack(indexes+x); break; + default: break; + } + p++; + j++; + } + j++; + } + (void) memset(buffer,0,length*sizeof(*buffer)); + for (k=0; k < 4; k++) + { + Hull(image,X[k],Y[k],image->columns,image->rows,1,pixels,buffer); + Hull(image,-X[k],-Y[k],image->columns,image->rows,1,pixels,buffer); + Hull(image,-X[k],-Y[k],image->columns,image->rows,-1,pixels,buffer); + Hull(image,X[k],Y[k],image->columns,image->rows,-1,pixels,buffer); + } + j=(ssize_t) image->columns+2; + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickBooleanType + sync; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + q=GetCacheViewAuthenticPixels(despeckle_view,0,y,despeckle_image->columns, + 1,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetCacheViewAuthenticIndexQueue(despeckle_view); + j++; + for (x=0; x < (ssize_t) image->columns; x++) + { + switch (i) + { + case 0: SetPixelRed(q,pixels[j]); break; + case 1: SetPixelGreen(q,pixels[j]); break; + case 2: SetPixelBlue(q,pixels[j]); break; + case 3: SetPixelOpacity(q,pixels[j]); break; + case 4: SetPixelIndex(indexes+x,pixels[j]); break; + default: break; + } + q++; + j++; + } + sync=SyncCacheViewAuthenticPixels(despeckle_view,exception); + if (sync == MagickFalse) + { + status=MagickFalse; + break; + } + j++; + } + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(image,DespeckleImageTag,(MagickOffsetType) i, + number_channels); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + despeckle_view=DestroyCacheView(despeckle_view); + image_view=DestroyCacheView(image_view); + buffer_info=RelinquishVirtualMemory(buffer_info); + pixel_info=RelinquishVirtualMemory(pixel_info); + despeckle_image->type=image->type; + if (status == MagickFalse) + despeckle_image=DestroyImage(despeckle_image); + return(despeckle_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E d g e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EdgeImage() finds edges in an image. Radius defines the radius of the +% convolution filter. Use a radius of 0 and EdgeImage() selects a suitable +% radius for you. +% +% The format of the EdgeImage method is: +% +% Image *EdgeImage(const Image *image,const double radius, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o radius: the radius of the pixel neighborhood. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *EdgeImage(const Image *image,const double radius, + ExceptionInfo *exception) +{ + Image + *edge_image; + + KernelInfo + *kernel_info; + + ssize_t + i; + + size_t + width; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + width=GetOptimalKernelWidth1D(radius,0.5); + kernel_info=AcquireKernelInfo((const char *) NULL); + if (kernel_info == (KernelInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(kernel_info,0,sizeof(*kernel_info)); + kernel_info->width=width; + kernel_info->height=width; + kernel_info->x=(ssize_t) (kernel_info->width-1)/2; + kernel_info->y=(ssize_t) (kernel_info->height-1)/2; + kernel_info->signature=MagickCoreSignature; + kernel_info->values=(double *) MagickAssumeAligned(AcquireAlignedMemory( + kernel_info->width,kernel_info->height*sizeof(*kernel_info->values))); + if (kernel_info->values == (double *) NULL) + { + kernel_info=DestroyKernelInfo(kernel_info); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (i=0; i < (ssize_t) (kernel_info->width*kernel_info->height); i++) + kernel_info->values[i]=(-1.0); + kernel_info->values[i/2]=(double) kernel_info->width*kernel_info->height-1.0; + edge_image=(Image *) NULL; +#if defined(MAGICKCORE_OPENCL_SUPPORT) + edge_image=AccelerateConvolveImageChannel(image,DefaultChannels,kernel_info, + exception); +#endif + if (edge_image == (Image *) NULL) + edge_image=MorphologyImageChannel(image,DefaultChannels,ConvolveMorphology, + 1,kernel_info,exception); + kernel_info=DestroyKernelInfo(kernel_info); + return(edge_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E m b o s s I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EmbossImage() returns a grayscale image with a three-dimensional effect. +% We convolve the image with a Gaussian operator of the given radius and +% standard deviation (sigma). For reasonable results, radius should be +% larger than sigma. Use a radius of 0 and Emboss() selects a suitable +% radius for you. +% +% The format of the EmbossImage method is: +% +% Image *EmbossImage(const Image *image,const double radius, +% const double sigma,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o radius: the radius of the pixel neighborhood. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *EmbossImage(const Image *image,const double radius, + const double sigma,ExceptionInfo *exception) +{ + double + gamma, + normalize; + + Image + *emboss_image; + + KernelInfo + *kernel_info; + + ssize_t + i; + + size_t + width; + + ssize_t + j, + k, + u, + v; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + width=GetOptimalKernelWidth1D(radius,sigma); + kernel_info=AcquireKernelInfo((const char *) NULL); + if (kernel_info == (KernelInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + kernel_info->width=width; + kernel_info->height=width; + kernel_info->x=(ssize_t) (width-1)/2; + kernel_info->y=(ssize_t) (width-1)/2; + kernel_info->values=(double *) MagickAssumeAligned(AcquireAlignedMemory( + kernel_info->width,kernel_info->width*sizeof(*kernel_info->values))); + if (kernel_info->values == (double *) NULL) + { + kernel_info=DestroyKernelInfo(kernel_info); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + j=(ssize_t) (kernel_info->width-1)/2; + k=j; + i=0; + for (v=(-j); v <= j; v++) + { + for (u=(-j); u <= j; u++) + { + kernel_info->values[i]=(double) (((u < 0) || (v < 0) ? -8.0 : + 8.0)*exp(-((double) u*u+v*v)/(2.0*MagickSigma*MagickSigma))/ + (2.0*MagickPI*MagickSigma*MagickSigma)); + if (u != k) + kernel_info->values[i]=0.0; + i++; + } + k--; + } + normalize=0.0; + for (i=0; i < (ssize_t) (kernel_info->width*kernel_info->height); i++) + normalize+=kernel_info->values[i]; + gamma=PerceptibleReciprocal(normalize); + for (i=0; i < (ssize_t) (kernel_info->width*kernel_info->height); i++) + kernel_info->values[i]*=gamma; + emboss_image=(Image *) NULL; +#if defined(MAGICKCORE_OPENCL_SUPPORT) + emboss_image=AccelerateConvolveImageChannel(image,DefaultChannels,kernel_info, + exception); +#endif + if (emboss_image == (Image *) NULL) + emboss_image=MorphologyImageChannel(image,DefaultChannels, + ConvolveMorphology,1,kernel_info,exception); + kernel_info=DestroyKernelInfo(kernel_info); + if (emboss_image != (Image *) NULL) + (void) EqualizeImageChannel(emboss_image,(ChannelType) + (AllChannels &~ SyncChannels)); + return(emboss_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% F i l t e r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FilterImage() applies a custom convolution kernel to the image. +% +% The format of the FilterImage method is: +% +% Image *FilterImage(const Image *image,const KernelInfo *kernel, +% ExceptionInfo *exception) +% Image *FilterImageChannel(const Image *image,const ChannelType channel, +% const KernelInfo *kernel,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o kernel: the filtering kernel. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *FilterImage(const Image *image,const KernelInfo *kernel, + ExceptionInfo *exception) +{ + Image + *filter_image; + + filter_image=FilterImageChannel(image,DefaultChannels,kernel,exception); + return(filter_image); +} + +MagickExport Image *FilterImageChannel(const Image *image, + const ChannelType channel,const KernelInfo *kernel,ExceptionInfo *exception) +{ +#define FilterImageTag "Filter/Image" + + CacheView + *filter_view, + *image_view; + + Image + *filter_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + bias; + + MagickRealType + *filter_kernel; + + ssize_t + i; + + ssize_t + y; + +#ifdef MAGICKCORE_CLPERFMARKER + clBeginPerfMarkerAMD(__FUNCTION__,""); +#endif + + /* + Initialize filter image attributes. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if ((kernel->width % 2) == 0) + ThrowImageException(OptionError,"KernelWidthMustBeAnOddNumber"); + if (image->debug != MagickFalse) + { + char + format[MaxTextExtent], + *message; + + const double + *k; + + ssize_t + u, + v; + + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " FilterImage with %.20gx%.20g kernel:",(double) kernel->width,(double) + kernel->height); + message=AcquireString(""); + k=kernel->values; + for (v=0; v < (ssize_t) kernel->height; v++) + { + *message='\0'; + (void) FormatLocaleString(format,MaxTextExtent,"%.20g: ",(double) v); + (void) ConcatenateString(&message,format); + for (u=0; u < (ssize_t) kernel->width; u++) + { + (void) FormatLocaleString(format,MaxTextExtent,"%g ",*k++); + (void) ConcatenateString(&message,format); + } + (void) LogMagickEvent(TransformEvent,GetMagickModule(),"%s",message); + } + message=DestroyString(message); + } +#if defined(MAGICKCORE_OPENCL_SUPPORT) + filter_image=AccelerateConvolveImageChannel(image,channel,kernel,exception); + if (filter_image != (Image *) NULL) + { +#ifdef MAGICKCORE_CLPERFMARKER + clEndPerfMarkerAMD(); +#endif + return(filter_image); + } +#endif + filter_image=CloneImage(image,0,0,MagickTrue,exception); + if (filter_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(filter_image,DirectClass) == MagickFalse) + { + InheritException(exception,&filter_image->exception); + filter_image=DestroyImage(filter_image); + return((Image *) NULL); + } + /* + Normalize kernel. + */ + filter_kernel=(MagickRealType *) MagickAssumeAligned(AcquireAlignedMemory( + kernel->width,kernel->height*sizeof(*filter_kernel))); + if (filter_kernel == (MagickRealType *) NULL) + { + filter_image=DestroyImage(filter_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (i=0; i < (ssize_t) (kernel->width*kernel->height); i++) + filter_kernel[i]=(MagickRealType) kernel->values[i]; + /* + Filter image. + */ + status=MagickTrue; + progress=0; + GetMagickPixelPacket(image,&bias); + SetMagickPixelPacketBias(image,&bias); + image_view=AcquireVirtualCacheView(image,exception); + filter_view=AcquireAuthenticCacheView(filter_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,filter_image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickBooleanType + sync; + + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + IndexPacket + *magick_restrict filter_indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,-((ssize_t) (kernel->width-1)/2L),y- + (ssize_t) ((kernel->height-1)/2L),image->columns+kernel->width, + kernel->height,exception); + q=GetCacheViewAuthenticPixels(filter_view,0,y,filter_image->columns,1, + exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(image_view); + filter_indexes=GetCacheViewAuthenticIndexQueue(filter_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + DoublePixelPacket + pixel; + + const MagickRealType + *magick_restrict k; + + const PixelPacket + *magick_restrict kernel_pixels; + + ssize_t + u; + + ssize_t + v; + + pixel.red=bias.red; + pixel.green=bias.green; + pixel.blue=bias.blue; + pixel.opacity=bias.opacity; + pixel.index=bias.index; + k=filter_kernel; + kernel_pixels=p; + if (((channel & OpacityChannel) == 0) || (image->matte == MagickFalse)) + { + for (v=0; v < (ssize_t) kernel->width; v++) + { + for (u=0; u < (ssize_t) kernel->height; u++) + { + pixel.red+=(*k)*kernel_pixels[u].red; + pixel.green+=(*k)*kernel_pixels[u].green; + pixel.blue+=(*k)*kernel_pixels[u].blue; + k++; + } + kernel_pixels+=image->columns+kernel->width; + } + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(pixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(pixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(pixel.blue)); + if ((channel & OpacityChannel) != 0) + { + k=filter_kernel; + kernel_pixels=p; + for (v=0; v < (ssize_t) kernel->width; v++) + { + for (u=0; u < (ssize_t) kernel->height; u++) + { + pixel.opacity+=(*k)*kernel_pixels[u].opacity; + k++; + } + kernel_pixels+=image->columns+kernel->width; + } + SetPixelOpacity(q,ClampToQuantum(pixel.opacity)); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + const IndexPacket + *magick_restrict kernel_indexes; + + k=filter_kernel; + kernel_indexes=indexes; + for (v=0; v < (ssize_t) kernel->width; v++) + { + for (u=0; u < (ssize_t) kernel->height; u++) + { + pixel.index+=(*k)*GetPixelIndex(kernel_indexes+u); + k++; + } + kernel_indexes+=image->columns+kernel->width; + } + SetPixelIndex(filter_indexes+x,ClampToQuantum(pixel.index)); + } + } + else + { + double + alpha, + gamma; + + gamma=0.0; + for (v=0; v < (ssize_t) kernel->width; v++) + { + for (u=0; u < (ssize_t) kernel->height; u++) + { + alpha=(MagickRealType) (QuantumScale*(QuantumRange- + GetPixelOpacity(kernel_pixels+u))); + pixel.red+=(*k)*alpha*GetPixelRed(kernel_pixels+u); + pixel.green+=(*k)*alpha*GetPixelGreen(kernel_pixels+u); + pixel.blue+=(*k)*alpha*GetPixelBlue(kernel_pixels+u); + gamma+=(*k)*alpha; + k++; + } + kernel_pixels+=image->columns+kernel->width; + } + gamma=PerceptibleReciprocal(gamma); + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(gamma*pixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(gamma*pixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(gamma*pixel.blue)); + if ((channel & OpacityChannel) != 0) + { + k=filter_kernel; + kernel_pixels=p; + for (v=0; v < (ssize_t) kernel->width; v++) + { + for (u=0; u < (ssize_t) kernel->height; u++) + { + pixel.opacity+=(*k)*GetPixelOpacity(kernel_pixels+u); + k++; + } + kernel_pixels+=image->columns+kernel->width; + } + SetPixelOpacity(q,ClampToQuantum(pixel.opacity)); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + const IndexPacket + *magick_restrict kernel_indexes; + + k=filter_kernel; + kernel_pixels=p; + kernel_indexes=indexes; + for (v=0; v < (ssize_t) kernel->width; v++) + { + for (u=0; u < (ssize_t) kernel->height; u++) + { + alpha=(MagickRealType) (QuantumScale*(QuantumRange- + kernel_pixels[u].opacity)); + pixel.index+=(*k)*alpha*GetPixelIndex(kernel_indexes+u); + k++; + } + kernel_pixels+=image->columns+kernel->width; + kernel_indexes+=image->columns+kernel->width; + } + SetPixelIndex(filter_indexes+x,ClampToQuantum(gamma*pixel.index)); + } + } + indexes++; + p++; + q++; + } + sync=SyncCacheViewAuthenticPixels(filter_view,exception); + if (sync == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,FilterImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + filter_image->type=image->type; + filter_view=DestroyCacheView(filter_view); + image_view=DestroyCacheView(image_view); + filter_kernel=(MagickRealType *) RelinquishAlignedMemory(filter_kernel); + if (status == MagickFalse) + filter_image=DestroyImage(filter_image); +#ifdef MAGICKCORE_CLPERFMARKER + clEndPerfMarkerAMD(); +#endif + return(filter_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G a u s s i a n B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GaussianBlurImage() blurs an image. We convolve the image with a +% Gaussian operator of the given radius and standard deviation (sigma). +% For reasonable results, the radius should be larger than sigma. Use a +% radius of 0 and GaussianBlurImage() selects a suitable radius for you. +% +% The format of the GaussianBlurImage method is: +% +% Image *GaussianBlurImage(const Image *image,onst double radius, +% const double sigma,ExceptionInfo *exception) +% Image *GaussianBlurImageChannel(const Image *image, +% const ChannelType channel,const double radius,const double sigma, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *GaussianBlurImage(const Image *image,const double radius, + const double sigma,ExceptionInfo *exception) +{ + Image + *blur_image; + + blur_image=GaussianBlurImageChannel(image,DefaultChannels,radius,sigma, + exception); + return(blur_image); +} + +MagickExport Image *GaussianBlurImageChannel(const Image *image, + const ChannelType channel,const double radius,const double sigma, + ExceptionInfo *exception) +{ + char + geometry[MaxTextExtent]; + + KernelInfo + *kernel_info; + + Image + *blur_image; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + (void) FormatLocaleString(geometry,MaxTextExtent,"gaussian:%.20gx%.20g", + radius,sigma); + kernel_info=AcquireKernelInfo(geometry); + if (kernel_info == (KernelInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + blur_image=(Image *) NULL; +#if defined(MAGICKCORE_OPENCL_SUPPORT) + blur_image=AccelerateConvolveImageChannel(image,channel,kernel_info, + exception); +#endif + if (blur_image == (Image *) NULL) + blur_image=MorphologyImageChannel(image,channel,ConvolveMorphology,1, + kernel_info,exception); + kernel_info=DestroyKernelInfo(kernel_info); + return(blur_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M o t i o n B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MotionBlurImage() simulates motion blur. We convolve the image with a +% Gaussian operator of the given radius and standard deviation (sigma). +% For reasonable results, radius should be larger than sigma. Use a +% radius of 0 and MotionBlurImage() selects a suitable radius for you. +% Angle gives the angle of the blurring motion. +% +% Andrew Protano contributed this effect. +% +% The format of the MotionBlurImage method is: +% +% Image *MotionBlurImage(const Image *image,const double radius, +% const double sigma,const double angle,ExceptionInfo *exception) +% Image *MotionBlurImageChannel(const Image *image,const ChannelType channel, +% const double radius,const double sigma,const double angle, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o angle: Apply the effect along this angle. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static double *GetMotionBlurKernel(const size_t width,const double sigma) +{ + double + *kernel, + normalize; + + ssize_t + i; + + /* + Generate a 1-D convolution kernel. + */ + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + kernel=(double *) MagickAssumeAligned(AcquireAlignedMemory((size_t) width, + sizeof(*kernel))); + if (kernel == (double *) NULL) + return(kernel); + normalize=0.0; + for (i=0; i < (ssize_t) width; i++) + { + kernel[i]=(double) (exp((-((double) i*i)/(double) (2.0*MagickSigma* + MagickSigma)))/(MagickSQ2PI*MagickSigma)); + normalize+=kernel[i]; + } + for (i=0; i < (ssize_t) width; i++) + kernel[i]/=normalize; + return(kernel); +} + +MagickExport Image *MotionBlurImage(const Image *image,const double radius, + const double sigma,const double angle,ExceptionInfo *exception) +{ + Image + *motion_blur; + + motion_blur=MotionBlurImageChannel(image,DefaultChannels,radius,sigma,angle, + exception); + return(motion_blur); +} + +MagickExport Image *MotionBlurImageChannel(const Image *image, + const ChannelType channel,const double radius,const double sigma, + const double angle,ExceptionInfo *exception) +{ +#define BlurImageTag "Blur/Image" + + CacheView + *blur_view, + *image_view; + + double + *kernel; + + Image + *blur_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + bias; + + OffsetInfo + *offset; + + PointInfo + point; + + ssize_t + i; + + size_t + width; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + width=GetOptimalKernelWidth1D(radius,sigma); + kernel=GetMotionBlurKernel(width,sigma); + if (kernel == (double *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + offset=(OffsetInfo *) AcquireQuantumMemory(width,sizeof(*offset)); + if (offset == (OffsetInfo *) NULL) + { + kernel=(double *) RelinquishAlignedMemory(kernel); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + + point.x=(double) width*sin(DegreesToRadians(angle)); + point.y=(double) width*cos(DegreesToRadians(angle)); + for (i=0; i < (ssize_t) width; i++) + { + offset[i].x=CastDoubleToLong(ceil((double) (i*point.y)/ + hypot(point.x,point.y)-0.5)); + offset[i].y=CastDoubleToLong(ceil((double) (i*point.x)/ + hypot(point.x,point.y)-0.5)); + } + + /* + Motion blur image. + */ +#if defined(MAGICKCORE_OPENCL_SUPPORT) + blur_image=AccelerateMotionBlurImage(image,channel,kernel,width,offset, + exception); + if (blur_image != (Image *) NULL) + return blur_image; +#endif + blur_image=CloneImage(image,0,0,MagickTrue,exception); + if (blur_image == (Image *) NULL) + { + kernel=(double *) RelinquishAlignedMemory(kernel); + offset=(OffsetInfo *) RelinquishMagickMemory(offset); + return((Image *) NULL); + } + if (SetImageStorageClass(blur_image,DirectClass) == MagickFalse) + { + kernel=(double *) RelinquishAlignedMemory(kernel); + offset=(OffsetInfo *) RelinquishMagickMemory(offset); + InheritException(exception,&blur_image->exception); + blur_image=DestroyImage(blur_image); + return((Image *) NULL); + } + + status=MagickTrue; + progress=0; + GetMagickPixelPacket(image,&bias); + image_view=AcquireVirtualCacheView(image,exception); + blur_view=AcquireAuthenticCacheView(blur_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,blur_image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict blur_indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(blur_view,0,y,blur_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + blur_indexes=GetCacheViewAuthenticIndexQueue(blur_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + MagickPixelPacket + qixel; + + PixelPacket + pixel; + + const IndexPacket + *magick_restrict indexes; + + double + *magick_restrict k; + + ssize_t + i; + + k=kernel; + qixel=bias; + if (((channel & OpacityChannel) == 0) || (image->matte == MagickFalse)) + { + for (i=0; i < (ssize_t) width; i++) + { + (void) GetOneCacheViewVirtualPixel(image_view,x+offset[i].x,y+ + offset[i].y,&pixel,exception); + qixel.red+=(*k)*pixel.red; + qixel.green+=(*k)*pixel.green; + qixel.blue+=(*k)*pixel.blue; + qixel.opacity+=(*k)*pixel.opacity; + if (image->colorspace == CMYKColorspace) + { + indexes=GetCacheViewVirtualIndexQueue(image_view); + qixel.index+=(*k)*(*indexes); + } + k++; + } + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(qixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(qixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(qixel.blue)); + if ((channel & OpacityChannel) != 0) + SetPixelOpacity(q,ClampToQuantum(qixel.opacity)); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(blur_indexes+x,ClampToQuantum(qixel.index)); + } + else + { + double + alpha, + gamma; + + alpha=0.0; + gamma=0.0; + for (i=0; i < (ssize_t) width; i++) + { + (void) GetOneCacheViewVirtualPixel(image_view,x+offset[i].x,y+ + offset[i].y,&pixel,exception); + alpha=(MagickRealType) (QuantumScale*GetPixelAlpha(&pixel)); + qixel.red+=(*k)*alpha*pixel.red; + qixel.green+=(*k)*alpha*pixel.green; + qixel.blue+=(*k)*alpha*pixel.blue; + qixel.opacity+=(*k)*pixel.opacity; + if (image->colorspace == CMYKColorspace) + { + indexes=GetCacheViewVirtualIndexQueue(image_view); + qixel.index+=(*k)*alpha*GetPixelIndex(indexes); + } + gamma+=(*k)*alpha; + k++; + } + gamma=PerceptibleReciprocal(gamma); + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(gamma*qixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(gamma*qixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(gamma*qixel.blue)); + if ((channel & OpacityChannel) != 0) + SetPixelOpacity(q,ClampToQuantum(qixel.opacity)); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(blur_indexes+x,ClampToQuantum(gamma*qixel.index)); + } + q++; + } + if (SyncCacheViewAuthenticPixels(blur_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,BlurImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + blur_view=DestroyCacheView(blur_view); + image_view=DestroyCacheView(image_view); + kernel=(double *) RelinquishAlignedMemory(kernel); + offset=(OffsetInfo *) RelinquishMagickMemory(offset); + if (status == MagickFalse) + blur_image=DestroyImage(blur_image); + return(blur_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% K u w a h a r a I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% KuwaharaImage() is an edge preserving noise reduction filter. +% +% The format of the KuwaharaImage method is: +% +% Image *KuwaharaImage(const Image *image,const double width, +% const double sigma,ExceptionInfo *exception) +% Image *KuwaharaImageChannel(const Image *image,const ChannelType channel, +% const double width,const double sigma,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o radius: the square window radius. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *KuwaharaImage(const Image *image,const double radius, + const double sigma,ExceptionInfo *exception) +{ + Image + *kuwahara_image; + + kuwahara_image=KuwaharaImageChannel(image,DefaultChannels,radius,sigma, + exception); + return(kuwahara_image); +} + +MagickExport Image *KuwaharaImageChannel(const Image *image, + const ChannelType channel,const double radius,const double sigma, + ExceptionInfo *exception) +{ +#define KuwaharaImageTag "Kiwahara/Image" + + CacheView + *image_view, + *kuwahara_view; + + Image + *gaussian_image, + *kuwahara_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + size_t + width; + + ssize_t + y; + + /* + Initialize Kuwahara image attributes. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + (void) channel; + width=(size_t) radius+1; + gaussian_image=BlurImage(image,radius,sigma,exception); + if (gaussian_image == (Image *) NULL) + return((Image *) NULL); + kuwahara_image=CloneImage(image,0,0,MagickTrue,exception); + if (kuwahara_image == (Image *) NULL) + { + gaussian_image=DestroyImage(gaussian_image); + return((Image *) NULL); + } + if (SetImageStorageClass(kuwahara_image,DirectClass) == MagickFalse) + { + InheritException(exception,&kuwahara_image->exception); + gaussian_image=DestroyImage(gaussian_image); + kuwahara_image=DestroyImage(kuwahara_image); + return((Image *) NULL); + } + /* + Edge preserving noise reduction filter. + */ + status=MagickTrue; + progress=0; + image_view=AcquireVirtualCacheView(gaussian_image,exception); + kuwahara_view=AcquireAuthenticCacheView(kuwahara_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,kuwahara_image,kuwahara_image->rows,1) +#endif + for (y=0; y < (ssize_t) kuwahara_image->rows; y++) + { + IndexPacket + *magick_restrict kuwahara_indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=QueueCacheViewAuthenticPixels(kuwahara_view,0,y,kuwahara_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + kuwahara_indexes=GetCacheViewAuthenticIndexQueue(kuwahara_view); + for (x=0; x < (ssize_t) kuwahara_image->columns; x++) + { + double + min_variance; + + MagickPixelPacket + pixel; + + RectangleInfo + quadrant, + target; + + ssize_t + i; + + min_variance=MagickMaximumValue; + SetGeometry(gaussian_image,&target); + quadrant.width=width; + quadrant.height=width; + for (i=0; i < 4; i++) + { + const PixelPacket + *magick_restrict p; + + double + variance; + + MagickPixelPacket + mean; + + const PixelPacket + *magick_restrict k; + + ssize_t + n; + + quadrant.x=x; + quadrant.y=y; + switch (i) + { + case 0: + { + quadrant.x=x-(ssize_t) (width-1); + quadrant.y=y-(ssize_t) (width-1); + break; + } + case 1: + { + quadrant.y=y-(ssize_t) (width-1); + break; + } + case 2: + { + quadrant.x=x-(ssize_t) (width-1); + break; + } + default: + break; + } + p=GetCacheViewVirtualPixels(image_view,quadrant.x,quadrant.y, + quadrant.width,quadrant.height,exception); + if (p == (const PixelPacket *) NULL) + break; + GetMagickPixelPacket(image,&mean); + k=p; + for (n=0; n < (ssize_t) (width*width); n++) + { + mean.red+=(double) k->red; + mean.green+=(double) k->green; + mean.blue+=(double) k->blue; + k++; + } + mean.red/=(double) (width*width); + mean.green/=(double) (width*width); + mean.blue/=(double) (width*width); + k=p; + variance=0.0; + for (n=0; n < (ssize_t) (width*width); n++) + { + double + luma; + + luma=GetPixelLuma(image,k); + variance+=(luma-MagickPixelLuma(&mean))*(luma-MagickPixelLuma(&mean)); + k++; + } + if (variance < min_variance) + { + min_variance=variance; + target=quadrant; + } + } + if (i < 4) + { + status=MagickFalse; + break; + } + status=InterpolateMagickPixelPacket(gaussian_image,image_view, + UndefinedInterpolatePixel,(double) target.x+target.width/2.0, + (double) target.y+target.height/2.0,&pixel,exception); + if (status == MagickFalse) + break; + SetPixelPacket(kuwahara_image,&pixel,q,kuwahara_indexes+x); + q++; + } + if (SyncCacheViewAuthenticPixels(kuwahara_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,KuwaharaImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + kuwahara_view=DestroyCacheView(kuwahara_view); + image_view=DestroyCacheView(image_view); + gaussian_image=DestroyImage(gaussian_image); + if (status == MagickFalse) + kuwahara_image=DestroyImage(kuwahara_image); + return(kuwahara_image); +} + + /* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L o c a l C o n t r a s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% LocalContrastImage() attempts to increase the appearance of large-scale +% light-dark transitions. Local contrast enhancement works similarly to +% sharpening with an unsharp mask, however the mask is instead created using +% an image with a greater blur distance. +% +% The format of the LocalContrastImage method is: +% +% Image *LocalContrastImage(const Image *image, const double radius, +% const double strength, ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o radius: the radius of the Gaussian blur, in percentage with 100% +% resulting in a blur radius of 20% of largest dimension. +% +% o strength: the strength of the blur mask in percentage. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *LocalContrastImage(const Image *image,const double radius, + const double strength,ExceptionInfo *exception) +{ +#define LocalContrastImageTag "LocalContrast/Image" + + CacheView + *image_view, + *contrast_view; + + float + *interImage, + *scanline, + totalWeight; + + Image + *contrast_image; + + MagickBooleanType + status; + + MemoryInfo + *interImage_info, + *scanline_info; + + ssize_t + scanLineSize, + width; + + /* + Initialize contrast image attributes. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); +#if defined(MAGICKCORE_OPENCL_SUPPORT) + contrast_image=AccelerateLocalContrastImage(image,radius,strength,exception); + if (contrast_image != (Image *) NULL) + return(contrast_image); +#endif + contrast_image=CloneImage(image,0,0,MagickTrue,exception); + if (contrast_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(contrast_image,DirectClass) == MagickFalse) + { + InheritException(exception,&contrast_image->exception); + contrast_image=DestroyImage(contrast_image); + return((Image *) NULL); + } + image_view=AcquireVirtualCacheView(image,exception); + contrast_view=AcquireAuthenticCacheView(contrast_image,exception); + scanLineSize=(ssize_t) MagickMax(image->columns,image->rows); + width=(ssize_t) scanLineSize*0.002f*fabs(radius); + scanLineSize+=(2*width); + scanline_info=AcquireVirtualMemory(GetOpenMPMaximumThreads()* + scanLineSize,sizeof(*scanline)); + if (scanline_info == (MemoryInfo *) NULL) + { + contrast_view=DestroyCacheView(contrast_view); + image_view=DestroyCacheView(image_view); + contrast_image=DestroyImage(contrast_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + scanline=(float *) GetVirtualMemoryBlob(scanline_info); + /* + Create intermediate buffer. + */ + interImage_info=AcquireVirtualMemory(image->rows*(image->columns+(2*width)), + sizeof(*interImage)); + if (interImage_info == (MemoryInfo *) NULL) + { + scanline_info=RelinquishVirtualMemory(scanline_info); + contrast_view=DestroyCacheView(contrast_view); + image_view=DestroyCacheView(image_view); + contrast_image=DestroyImage(contrast_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + interImage=(float *) GetVirtualMemoryBlob(interImage_info); + totalWeight=(width+1)*(width+1); + /* + Vertical pass. + */ + status=MagickTrue; + { + ssize_t + x; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) \ + magick_number_threads(image,image,image->columns,1) +#endif + for (x=0; x < (ssize_t) image->columns; x++) + { + const int + id = GetOpenMPThreadId(); + + const PixelPacket + *magick_restrict p; + + float + *out, + *pix, + *pixels; + + ssize_t + y; + + ssize_t + i; + + if (status == MagickFalse) + continue; + pixels=scanline; + pixels+=id*scanLineSize; + pix=pixels; + p=GetCacheViewVirtualPixels(image_view,x,-width,1,image->rows+(2*width), + exception); + if (p == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (y=0; y < (ssize_t) image->rows+(2*width); y++) + { + *pix++=(float)GetPixelLuma(image,p); + p++; + } + out=interImage+x+width; + for (y=0; y < (ssize_t) image->rows; y++) + { + float + sum, + weight; + + weight=1.0f; + sum=0; + pix=pixels+y; + for (i=0; i < width; i++) + { + sum+=weight*(*pix++); + weight+=1.0f; + } + for (i=width+1; i < (2*width); i++) + { + sum+=weight*(*pix++); + weight-=1.0f; + } + /* write to output */ + *out=sum/totalWeight; + /* mirror into padding */ + if (x <= width && x != 0) + *(out-(x*2))=*out; + if ((x > (ssize_t) image->columns-width-2) && + (x != (ssize_t) image->columns-1)) + *(out+((image->columns-x-1)*2))=*out; + out+=image->columns+(width*2); + } + } + } + /* + Horizontal pass. + */ + { + ssize_t + y; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) +#pragma omp parallel for schedule(static) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + const int + id = GetOpenMPThreadId(); + + const PixelPacket + *magick_restrict p; + + float + *pix, + *pixels; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + ssize_t + i; + + if (status == MagickFalse) + continue; + pixels=scanline; + pixels+=id*scanLineSize; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1, + exception); + q=GetCacheViewAuthenticPixels(contrast_view,0,y,image->columns,1, + exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + memcpy(pixels,interImage+(y*(image->columns+(2*width))),(image->columns+ + (2*width))*sizeof(float)); + for (x=0; x < (ssize_t) image->columns; x++) + { + float + mult, + srcVal, + sum, + weight; + + weight=1.0f; + sum=0; + pix=pixels+x; + for (i=0; i < width; i++) + { + sum+=weight*(*pix++); + weight+=1.0f; + } + for (i=width+1; i < (2*width); i++) + { + sum+=weight*(*pix++); + weight-=1.0f; + } + /* Apply and write */ + srcVal=(float) GetPixelLuma(image,p); + mult=(srcVal-(sum/totalWeight))*(strength/100.0f); + mult=(srcVal+mult)/srcVal; + SetPixelRed(q,ClampToQuantum((MagickRealType) GetPixelRed(p)*mult)); + SetPixelGreen(q,ClampToQuantum((MagickRealType) GetPixelGreen(p)*mult)); + SetPixelBlue(q,ClampToQuantum((MagickRealType) GetPixelBlue(p)*mult)); + p++; + q++; + } + if (SyncCacheViewAuthenticPixels(contrast_view,exception) == MagickFalse) + status=MagickFalse; + } + } + scanline_info=RelinquishVirtualMemory(scanline_info); + interImage_info=RelinquishVirtualMemory(interImage_info); + contrast_view=DestroyCacheView(contrast_view); + image_view=DestroyCacheView(image_view); + if (status == MagickFalse) + contrast_image=DestroyImage(contrast_image); + return(contrast_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P r e v i e w I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PreviewImage() tiles 9 thumbnails of the specified image with an image +% processing operation applied with varying parameters. This may be helpful +% pin-pointing an appropriate parameter for a particular image processing +% operation. +% +% The format of the PreviewImages method is: +% +% Image *PreviewImages(const Image *image,const PreviewType preview, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o preview: the image processing operation. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *PreviewImage(const Image *image,const PreviewType preview, + ExceptionInfo *exception) +{ +#define NumberTiles 9 +#define PreviewImageTag "Preview/Image" +#define DefaultPreviewGeometry "204x204+10+10" + + char + factor[MaxTextExtent], + label[MaxTextExtent]; + + double + degrees, + gamma, + percentage, + radius, + sigma, + threshold; + + Image + *images, + *montage_image, + *preview_image, + *thumbnail; + + ImageInfo + *preview_info; + + MagickBooleanType + proceed; + + MontageInfo + *montage_info; + + QuantizeInfo + quantize_info; + + RectangleInfo + geometry; + + ssize_t + i, + x; + + size_t + colors; + + ssize_t + y; + + /* + Open output image file. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + colors=2; + degrees=0.0; + gamma=(-0.2f); + preview_info=AcquireImageInfo(); + SetGeometry(image,&geometry); + (void) ParseMetaGeometry(DefaultPreviewGeometry,&geometry.x,&geometry.y, + &geometry.width,&geometry.height); + images=NewImageList(); + percentage=12.5; + GetQuantizeInfo(&quantize_info); + radius=0.0; + sigma=1.0; + threshold=0.0; + x=0; + y=0; + for (i=0; i < NumberTiles; i++) + { + thumbnail=ThumbnailImage(image,geometry.width,geometry.height,exception); + if (thumbnail == (Image *) NULL) + break; + (void) SetImageProgressMonitor(thumbnail,(MagickProgressMonitor) NULL, + (void *) NULL); + (void) SetImageProperty(thumbnail,"label",DefaultTileLabel); + if (i == (NumberTiles/2)) + { + (void) QueryColorDatabase("#dfdfdf",&thumbnail->matte_color,exception); + AppendImageToList(&images,thumbnail); + continue; + } + switch (preview) + { + case RotatePreview: + { + degrees+=45.0; + preview_image=RotateImage(thumbnail,degrees,exception); + (void) FormatLocaleString(label,MaxTextExtent,"rotate %g",degrees); + break; + } + case ShearPreview: + { + degrees+=5.0; + preview_image=ShearImage(thumbnail,degrees,degrees,exception); + (void) FormatLocaleString(label,MaxTextExtent,"shear %gx%g", + degrees,2.0*degrees); + break; + } + case RollPreview: + { + x=(ssize_t) ((i+1)*thumbnail->columns)/NumberTiles; + y=(ssize_t) ((i+1)*thumbnail->rows)/NumberTiles; + preview_image=RollImage(thumbnail,x,y,exception); + (void) FormatLocaleString(label,MaxTextExtent,"roll %+.20gx%+.20g", + (double) x,(double) y); + break; + } + case HuePreview: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + (void) FormatLocaleString(factor,MaxTextExtent,"100,100,%g", + 2.0*percentage); + (void) ModulateImage(preview_image,factor); + (void) FormatLocaleString(label,MaxTextExtent,"modulate %s",factor); + break; + } + case SaturationPreview: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + (void) FormatLocaleString(factor,MaxTextExtent,"100,%g",2.0*percentage); + (void) ModulateImage(preview_image,factor); + (void) FormatLocaleString(label,MaxTextExtent,"modulate %s",factor); + break; + } + case BrightnessPreview: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + (void) FormatLocaleString(factor,MaxTextExtent,"%g",2.0*percentage); + (void) ModulateImage(preview_image,factor); + (void) FormatLocaleString(label,MaxTextExtent,"modulate %s",factor); + break; + } + case GammaPreview: + default: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + gamma+=0.4f; + (void) GammaImageChannel(preview_image,DefaultChannels,gamma); + (void) FormatLocaleString(label,MaxTextExtent,"gamma %g",gamma); + break; + } + case SpiffPreview: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image != (Image *) NULL) + for (x=0; x < i; x++) + (void) ContrastImage(preview_image,MagickTrue); + (void) FormatLocaleString(label,MaxTextExtent,"contrast (%.20g)", + (double) i+1); + break; + } + case DullPreview: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + for (x=0; x < i; x++) + (void) ContrastImage(preview_image,MagickFalse); + (void) FormatLocaleString(label,MaxTextExtent,"+contrast (%.20g)", + (double) i+1); + break; + } + case GrayscalePreview: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + colors<<=1; + quantize_info.number_colors=colors; + quantize_info.colorspace=GRAYColorspace; + (void) QuantizeImage(&quantize_info,preview_image); + (void) FormatLocaleString(label,MaxTextExtent, + "-colorspace gray -colors %.20g",(double) colors); + break; + } + case QuantizePreview: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + colors<<=1; + quantize_info.number_colors=colors; + (void) QuantizeImage(&quantize_info,preview_image); + (void) FormatLocaleString(label,MaxTextExtent,"colors %.20g",(double) + colors); + break; + } + case DespecklePreview: + { + for (x=0; x < (i-1); x++) + { + preview_image=DespeckleImage(thumbnail,exception); + if (preview_image == (Image *) NULL) + break; + thumbnail=DestroyImage(thumbnail); + thumbnail=preview_image; + } + preview_image=DespeckleImage(thumbnail,exception); + if (preview_image == (Image *) NULL) + break; + (void) FormatLocaleString(label,MaxTextExtent,"despeckle (%.20g)", + (double) i+1); + break; + } + case ReduceNoisePreview: + { + preview_image=StatisticImage(thumbnail,NonpeakStatistic,(size_t) radius, + (size_t) radius,exception); + (void) FormatLocaleString(label,MaxTextExtent,"noise %g",radius); + break; + } + case AddNoisePreview: + { + switch ((int) i) + { + case 0: + { + (void) CopyMagickString(factor,"uniform",MaxTextExtent); + break; + } + case 1: + { + (void) CopyMagickString(factor,"gaussian",MaxTextExtent); + break; + } + case 2: + { + (void) CopyMagickString(factor,"multiplicative",MaxTextExtent); + break; + } + case 3: + { + (void) CopyMagickString(factor,"impulse",MaxTextExtent); + break; + } + case 5: + { + (void) CopyMagickString(factor,"laplacian",MaxTextExtent); + break; + } + case 6: + { + (void) CopyMagickString(factor,"poisson",MaxTextExtent); + break; + } + default: + { + (void) CopyMagickString(thumbnail->magick,"NULL",MaxTextExtent); + break; + } + } + preview_image=StatisticImage(thumbnail,NonpeakStatistic,(size_t) i, + (size_t) i,exception); + (void) FormatLocaleString(label,MaxTextExtent,"+noise %s",factor); + break; + } + case SharpenPreview: + { + preview_image=SharpenImage(thumbnail,radius,sigma,exception); + (void) FormatLocaleString(label,MaxTextExtent,"sharpen %gx%g", + radius,sigma); + break; + } + case BlurPreview: + { + preview_image=BlurImage(thumbnail,radius,sigma,exception); + (void) FormatLocaleString(label,MaxTextExtent,"blur %gx%g",radius, + sigma); + break; + } + case ThresholdPreview: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + (void) BilevelImage(thumbnail, + (double) (percentage*((MagickRealType) QuantumRange+1.0))/100.0); + (void) FormatLocaleString(label,MaxTextExtent,"threshold %g", + (double) (percentage*((MagickRealType) QuantumRange+1.0))/100.0); + break; + } + case EdgeDetectPreview: + { + preview_image=EdgeImage(thumbnail,radius,exception); + (void) FormatLocaleString(label,MaxTextExtent,"edge %g",radius); + break; + } + case SpreadPreview: + { + preview_image=SpreadImage(thumbnail,radius,exception); + (void) FormatLocaleString(label,MaxTextExtent,"spread %g", + radius+0.5); + break; + } + case SolarizePreview: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + (void) SolarizeImage(preview_image,(double) QuantumRange* + percentage/100.0); + (void) FormatLocaleString(label,MaxTextExtent,"solarize %g", + (QuantumRange*percentage)/100.0); + break; + } + case ShadePreview: + { + degrees+=10.0; + preview_image=ShadeImage(thumbnail,MagickTrue,degrees,degrees, + exception); + (void) FormatLocaleString(label,MaxTextExtent,"shade %gx%g", + degrees,degrees); + break; + } + case RaisePreview: + { + RectangleInfo + raise; + + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + raise.width=(size_t) (2*i+2); + raise.height=(size_t) (2*i+2); + raise.x=(i-1)/2; + raise.y=(i-1)/2; + (void) RaiseImage(preview_image,&raise,MagickTrue); + (void) FormatLocaleString(label,MaxTextExtent, + "raise %.20gx%.20g%+.20g%+.20g",(double) raise.width,(double) + raise.height,(double) raise.x,(double) raise.y); + break; + } + case SegmentPreview: + { + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + threshold+=0.4f; + (void) SegmentImage(preview_image,sRGBColorspace,MagickFalse,threshold, + threshold); + (void) FormatLocaleString(label,MaxTextExtent,"segment %gx%g", + threshold,threshold); + break; + } + case SwirlPreview: + { + preview_image=SwirlImage(thumbnail,degrees,exception); + (void) FormatLocaleString(label,MaxTextExtent,"swirl %g",degrees); + degrees+=45.0; + break; + } + case ImplodePreview: + { + degrees+=0.1f; + preview_image=ImplodeImage(thumbnail,degrees,exception); + (void) FormatLocaleString(label,MaxTextExtent,"implode %g",degrees); + break; + } + case WavePreview: + { + degrees+=5.0f; + preview_image=WaveImage(thumbnail,0.5*degrees,2.0*degrees,exception); + (void) FormatLocaleString(label,MaxTextExtent,"wave %gx%g", + 0.5*degrees,2.0*degrees); + break; + } + case OilPaintPreview: + { + preview_image=OilPaintImage(thumbnail,(double) radius,exception); + (void) FormatLocaleString(label,MaxTextExtent,"paint %g",radius); + break; + } + case CharcoalDrawingPreview: + { + preview_image=CharcoalImage(thumbnail,(double) radius,(double) sigma, + exception); + (void) FormatLocaleString(label,MaxTextExtent,"charcoal %gx%g", + radius,sigma); + break; + } + case JPEGPreview: + { + char + filename[MaxTextExtent]; + + int + file; + + MagickBooleanType + status; + + preview_image=CloneImage(thumbnail,0,0,MagickTrue,exception); + if (preview_image == (Image *) NULL) + break; + preview_info->quality=(size_t) percentage; + (void) FormatLocaleString(factor,MaxTextExtent,"%.20g",(double) + preview_info->quality); + file=AcquireUniqueFileResource(filename); + if (file != -1) + file=close(file)-1; + (void) FormatLocaleString(preview_image->filename,MaxTextExtent, + "jpeg:%s",filename); + status=WriteImage(preview_info,preview_image); + if (status != MagickFalse) + { + Image + *quality_image; + + (void) CopyMagickString(preview_info->filename, + preview_image->filename,MaxTextExtent); + quality_image=ReadImage(preview_info,exception); + if (quality_image != (Image *) NULL) + { + preview_image=DestroyImage(preview_image); + preview_image=quality_image; + } + } + (void) RelinquishUniqueFileResource(preview_image->filename); + if ((GetBlobSize(preview_image)/1024) >= 1024) + (void) FormatLocaleString(label,MaxTextExtent,"quality %s\n%gmb ", + factor,(double) ((MagickOffsetType) GetBlobSize(preview_image))/ + 1024.0/1024.0); + else + if (GetBlobSize(preview_image) >= 1024) + (void) FormatLocaleString(label,MaxTextExtent, + "quality %s\n%gkb ",factor,(double) ((MagickOffsetType) + GetBlobSize(preview_image))/1024.0); + else + (void) FormatLocaleString(label,MaxTextExtent,"quality %s\n%.20gb ", + factor,(double) ((MagickOffsetType) GetBlobSize(thumbnail))); + break; + } + } + thumbnail=DestroyImage(thumbnail); + percentage+=12.5; + radius+=0.5; + sigma+=0.25; + if (preview_image == (Image *) NULL) + break; + (void) DeleteImageProperty(preview_image,"label"); + (void) SetImageProperty(preview_image,"label",label); + AppendImageToList(&images,preview_image); + proceed=SetImageProgress(image,PreviewImageTag,(MagickOffsetType) i, + NumberTiles); + if (proceed == MagickFalse) + break; + } + if (images == (Image *) NULL) + { + preview_info=DestroyImageInfo(preview_info); + return((Image *) NULL); + } + /* + Create the montage. + */ + montage_info=CloneMontageInfo(preview_info,(MontageInfo *) NULL); + (void) CopyMagickString(montage_info->filename,image->filename,MaxTextExtent); + montage_info->shadow=MagickTrue; + (void) CloneString(&montage_info->tile,"3x3"); + (void) CloneString(&montage_info->geometry,DefaultPreviewGeometry); + (void) CloneString(&montage_info->frame,DefaultTileFrame); + montage_image=MontageImages(images,montage_info,exception); + montage_info=DestroyMontageInfo(montage_info); + images=DestroyImageList(images); + if (montage_image == (Image *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + if (montage_image->montage != (char *) NULL) + { + /* + Free image directory. + */ + montage_image->montage=(char *) RelinquishMagickMemory( + montage_image->montage); + if (image->directory != (char *) NULL) + montage_image->directory=(char *) RelinquishMagickMemory( + montage_image->directory); + } + preview_info=DestroyImageInfo(preview_info); + return(montage_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R o t a t i o n a l B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RotationalBlurImage() applies a rotational blur to the image. +% +% Andrew Protano contributed this effect. +% +% The format of the RotationalBlurImage method is: +% +% Image *RotationalBlurImage(const Image *image,const double angle, +% ExceptionInfo *exception) +% Image *RotationalBlurImageChannel(const Image *image, +% const ChannelType channel,const double angle,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o angle: the angle of the rotational blur. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *RotationalBlurImage(const Image *image,const double angle, + ExceptionInfo *exception) +{ + Image + *blur_image; + + blur_image=RotationalBlurImageChannel(image,DefaultChannels,angle,exception); + return(blur_image); +} + +MagickExport Image *RotationalBlurImageChannel(const Image *image, + const ChannelType channel,const double angle,ExceptionInfo *exception) +{ + CacheView + *blur_view, + *image_view; + + Image + *blur_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + bias; + + MagickRealType + blur_radius, + *cos_theta, + offset, + *sin_theta, + theta; + + PointInfo + blur_center; + + ssize_t + i; + + size_t + n; + + ssize_t + y; + + /* + Allocate blur image. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); +#if defined(MAGICKCORE_OPENCL_SUPPORT) + blur_image=AccelerateRadialBlurImage(image,channel,angle,exception); + if (blur_image != (Image *) NULL) + return(blur_image); +#endif + blur_image=CloneImage(image,0,0,MagickTrue,exception); + if (blur_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(blur_image,DirectClass) == MagickFalse) + { + InheritException(exception,&blur_image->exception); + blur_image=DestroyImage(blur_image); + return((Image *) NULL); + } + blur_center.x=(double) (image->columns-1)/2.0; + blur_center.y=(double) (image->rows-1)/2.0; + blur_radius=hypot(blur_center.x,blur_center.y); + n=(size_t) fabs(4.0*DegreesToRadians(angle)*sqrt((double) blur_radius)+2UL); + theta=DegreesToRadians(angle)/(MagickRealType) (n-1); + cos_theta=(MagickRealType *) AcquireQuantumMemory((size_t) n, + sizeof(*cos_theta)); + sin_theta=(MagickRealType *) AcquireQuantumMemory((size_t) n, + sizeof(*sin_theta)); + if ((cos_theta == (MagickRealType *) NULL) || + (sin_theta == (MagickRealType *) NULL)) + { + if (cos_theta != (MagickRealType *) NULL) + cos_theta=(MagickRealType *) RelinquishMagickMemory(cos_theta); + if (sin_theta != (MagickRealType *) NULL) + sin_theta=(MagickRealType *) RelinquishMagickMemory(sin_theta); + blur_image=DestroyImage(blur_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + offset=theta*(MagickRealType) (n-1)/2.0; + for (i=0; i < (ssize_t) n; i++) + { + cos_theta[i]=cos((double) (theta*i-offset)); + sin_theta[i]=sin((double) (theta*i-offset)); + } + /* + Radial blur image. + */ + status=MagickTrue; + progress=0; + GetMagickPixelPacket(image,&bias); + image_view=AcquireVirtualCacheView(image,exception); + blur_view=AcquireAuthenticCacheView(blur_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,blur_image,blur_image->rows,1) +#endif + for (y=0; y < (ssize_t) blur_image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + IndexPacket + *magick_restrict blur_indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(blur_view,0,y,blur_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + blur_indexes=GetCacheViewAuthenticIndexQueue(blur_view); + for (x=0; x < (ssize_t) blur_image->columns; x++) + { + MagickPixelPacket + qixel; + + MagickRealType + normalize, + radius; + + PixelPacket + pixel; + + PointInfo + center; + + ssize_t + i; + + size_t + step; + + center.x=(double) x-blur_center.x; + center.y=(double) y-blur_center.y; + radius=hypot((double) center.x,center.y); + if (radius == 0) + step=1; + else + { + step=(size_t) (blur_radius/radius); + if (step == 0) + step=1; + else + if (step >= n) + step=n-1; + } + normalize=0.0; + qixel=bias; + if (((channel & OpacityChannel) == 0) || (image->matte == MagickFalse)) + { + for (i=0; i < (ssize_t) n; i+=(ssize_t) step) + { + (void) GetOneCacheViewVirtualPixel(image_view,(ssize_t) + (blur_center.x+center.x*cos_theta[i]-center.y*sin_theta[i]+0.5), + (ssize_t) (blur_center.y+center.x*sin_theta[i]+center.y* + cos_theta[i]+0.5),&pixel,exception); + qixel.red+=pixel.red; + qixel.green+=pixel.green; + qixel.blue+=pixel.blue; + qixel.opacity+=pixel.opacity; + if (image->colorspace == CMYKColorspace) + { + indexes=GetCacheViewVirtualIndexQueue(image_view); + qixel.index+=(*indexes); + } + normalize+=1.0; + } + normalize=PerceptibleReciprocal(normalize); + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(normalize*qixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(normalize*qixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(normalize*qixel.blue)); + if ((channel & OpacityChannel) != 0) + SetPixelOpacity(q,ClampToQuantum(normalize*qixel.opacity)); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(blur_indexes+x,ClampToQuantum(normalize*qixel.index)); + } + else + { + double + alpha, + gamma; + + alpha=1.0; + gamma=0.0; + for (i=0; i < (ssize_t) n; i+=(ssize_t) step) + { + (void) GetOneCacheViewVirtualPixel(image_view,(ssize_t) + (blur_center.x+center.x*cos_theta[i]-center.y*sin_theta[i]+0.5), + (ssize_t) (blur_center.y+center.x*sin_theta[i]+center.y* + cos_theta[i]+0.5),&pixel,exception); + alpha=(MagickRealType) (QuantumScale*GetPixelAlpha(&pixel)); + qixel.red+=alpha*pixel.red; + qixel.green+=alpha*pixel.green; + qixel.blue+=alpha*pixel.blue; + qixel.opacity+=pixel.opacity; + if (image->colorspace == CMYKColorspace) + { + indexes=GetCacheViewVirtualIndexQueue(image_view); + qixel.index+=alpha*(*indexes); + } + gamma+=alpha; + normalize+=1.0; + } + gamma=PerceptibleReciprocal(gamma); + normalize=PerceptibleReciprocal(normalize); + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(gamma*qixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(gamma*qixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(gamma*qixel.blue)); + if ((channel & OpacityChannel) != 0) + SetPixelOpacity(q,ClampToQuantum(normalize*qixel.opacity)); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(blur_indexes+x,ClampToQuantum(gamma*qixel.index)); + } + q++; + } + if (SyncCacheViewAuthenticPixels(blur_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,BlurImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + blur_view=DestroyCacheView(blur_view); + image_view=DestroyCacheView(image_view); + cos_theta=(MagickRealType *) RelinquishMagickMemory(cos_theta); + sin_theta=(MagickRealType *) RelinquishMagickMemory(sin_theta); + if (status == MagickFalse) + blur_image=DestroyImage(blur_image); + return(blur_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e l e c t i v e B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SelectiveBlurImage() selectively blur pixels within a contrast threshold. +% It is similar to the unsharpen mask that sharpens everything with contrast +% above a certain threshold. +% +% The format of the SelectiveBlurImage method is: +% +% Image *SelectiveBlurImage(const Image *image,const double radius, +% const double sigma,const double threshold,ExceptionInfo *exception) +% Image *SelectiveBlurImageChannel(const Image *image, +% const ChannelType channel,const double radius,const double sigma, +% const double threshold,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o threshold: only pixels within this contrast threshold are included +% in the blur operation. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *SelectiveBlurImage(const Image *image,const double radius, + const double sigma,const double threshold,ExceptionInfo *exception) +{ + Image + *blur_image; + + blur_image=SelectiveBlurImageChannel(image,DefaultChannels,radius,sigma, + threshold,exception); + return(blur_image); +} + +MagickExport Image *SelectiveBlurImageChannel(const Image *image, + const ChannelType channel,const double radius,const double sigma, + const double threshold,ExceptionInfo *exception) +{ +#define SelectiveBlurImageTag "SelectiveBlur/Image" + + CacheView + *blur_view, + *image_view, + *luminance_view; + + double + *kernel; + + Image + *blur_image, + *luminance_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + bias; + + ssize_t + i; + + size_t + width; + + ssize_t + center, + j, + u, + v, + y; + + /* + Initialize blur image attributes. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + width=GetOptimalKernelWidth1D(radius,sigma); + kernel=(double *) MagickAssumeAligned(AcquireAlignedMemory((size_t) width, + width*sizeof(*kernel))); + if (kernel == (double *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + j=(ssize_t) (width-1)/2; + i=0; + for (v=(-j); v <= j; v++) + { + for (u=(-j); u <= j; u++) + kernel[i++]=(double) (exp(-((double) u*u+v*v)/(2.0*MagickSigma* + MagickSigma))/(2.0*MagickPI*MagickSigma*MagickSigma)); + } + if (image->debug != MagickFalse) + { + char + format[MaxTextExtent], + *message; + + const double + *k; + + ssize_t + u, + v; + + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " SelectiveBlurImage with %.20gx%.20g kernel:",(double) width,(double) + width); + message=AcquireString(""); + k=kernel; + for (v=0; v < (ssize_t) width; v++) + { + *message='\0'; + (void) FormatLocaleString(format,MaxTextExtent,"%.20g: ",(double) v); + (void) ConcatenateString(&message,format); + for (u=0; u < (ssize_t) width; u++) + { + (void) FormatLocaleString(format,MaxTextExtent,"%+f ",*k++); + (void) ConcatenateString(&message,format); + } + (void) LogMagickEvent(TransformEvent,GetMagickModule(),"%s",message); + } + message=DestroyString(message); + } + blur_image=CloneImage(image,0,0,MagickTrue,exception); + if (blur_image == (Image *) NULL) + { + kernel=(double *) RelinquishAlignedMemory(kernel); + return((Image *) NULL); + } + if (SetImageStorageClass(blur_image,DirectClass) == MagickFalse) + { + kernel=(double *) RelinquishAlignedMemory(kernel); + InheritException(exception,&blur_image->exception); + blur_image=DestroyImage(blur_image); + return((Image *) NULL); + } + luminance_image=CloneImage(image,0,0,MagickTrue,exception); + if (luminance_image == (Image *) NULL) + { + kernel=(double *) RelinquishAlignedMemory(kernel); + blur_image=DestroyImage(blur_image); + return((Image *) NULL); + } + status=TransformImageColorspace(luminance_image,GRAYColorspace); + if (status == MagickFalse) + { + InheritException(exception,&luminance_image->exception); + kernel=(double *) RelinquishAlignedMemory(kernel); + blur_image=DestroyImage(blur_image); + luminance_image=DestroyImage(luminance_image); + return((Image *) NULL); + } + /* + Threshold blur image. + */ + status=MagickTrue; + progress=0; + center=(ssize_t) ((image->columns+width)*((width-1)/2L)+((width-1)/2L)); + GetMagickPixelPacket(image,&bias); + SetMagickPixelPacketBias(image,&bias); + image_view=AcquireVirtualCacheView(image,exception); + luminance_view=AcquireVirtualCacheView(luminance_image,exception); + blur_view=AcquireAuthenticCacheView(blur_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,blur_image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + double + gamma; + + MagickBooleanType + sync; + + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict l, + *magick_restrict p; + + IndexPacket + *magick_restrict blur_indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,-((ssize_t) (width-1)/2L),y-(ssize_t) + ((width-1)/2L),image->columns+width,width,exception); + l=GetCacheViewVirtualPixels(luminance_view,-((ssize_t) (width-1)/2L),y- + (ssize_t) ((width-1)/2L),luminance_image->columns+width,width,exception); + q=GetCacheViewAuthenticPixels(blur_view,0,y,blur_image->columns,1, + exception); + if ((p == (const PixelPacket *) NULL) || + (l == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(image_view); + blur_indexes=GetCacheViewAuthenticIndexQueue(blur_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + double + contrast; + + DoublePixelPacket + pixel; + + MagickRealType + intensity; + + const double + *magick_restrict k; + + ssize_t + u; + + ssize_t + j, + v; + + pixel.red=bias.red; + pixel.green=bias.green; + pixel.blue=bias.blue; + pixel.opacity=bias.opacity; + pixel.index=bias.index; + k=kernel; + intensity=GetPixelIntensity(image,p+center); + gamma=0.0; + j=0; + if (((channel & OpacityChannel) == 0) || (image->matte == MagickFalse)) + { + for (v=0; v < (ssize_t) width; v++) + { + for (u=0; u < (ssize_t) width; u++) + { + contrast=GetPixelIntensity(luminance_image,l+u+j)-intensity; + if (fabs(contrast) < threshold) + { + pixel.red+=(*k)*GetPixelRed(p+u+j); + pixel.green+=(*k)*GetPixelGreen(p+u+j); + pixel.blue+=(*k)*GetPixelBlue(p+u+j); + gamma+=(*k); + } + k++; + } + j+=(ssize_t) (image->columns+width); + } + if (gamma != 0.0) + { + gamma=PerceptibleReciprocal(gamma); + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(gamma*pixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(gamma*pixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(gamma*pixel.blue)); + } + if ((channel & OpacityChannel) != 0) + { + gamma=0.0; + j=0; + for (v=0; v < (ssize_t) width; v++) + { + for (u=0; u < (ssize_t) width; u++) + { + contrast=GetPixelIntensity(luminance_image,l+u+j)-intensity; + if (fabs(contrast) < threshold) + { + pixel.opacity+=(*k)*(p+u+j)->opacity; + gamma+=(*k); + } + k++; + } + j+=(ssize_t) (image->columns+width); + } + gamma=PerceptibleReciprocal(gamma); + SetPixelOpacity(q,ClampToQuantum(gamma*pixel.opacity)); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + gamma=0.0; + j=0; + for (v=0; v < (ssize_t) width; v++) + { + for (u=0; u < (ssize_t) width; u++) + { + contrast=GetPixelIntensity(luminance_image,l+u+j)-intensity; + if (fabs(contrast) < threshold) + { + pixel.index+=(*k)*GetPixelIndex(indexes+x+u+j); + gamma+=(*k); + } + k++; + } + j+=(ssize_t) (image->columns+width); + } + gamma=PerceptibleReciprocal(gamma); + SetPixelIndex(blur_indexes+x,ClampToQuantum(gamma*pixel.index)); + } + } + else + { + MagickRealType + alpha; + + for (v=0; v < (ssize_t) width; v++) + { + for (u=0; u < (ssize_t) width; u++) + { + contrast=GetPixelIntensity(luminance_image,l+u+j)-intensity; + if (fabs(contrast) < threshold) + { + alpha=(MagickRealType) (QuantumScale*GetPixelAlpha(p+u+j)); + pixel.red+=(*k)*alpha*GetPixelRed(p+u+j); + pixel.green+=(*k)*alpha*GetPixelGreen(p+u+j); + pixel.blue+=(*k)*alpha*GetPixelBlue(p+u+j); + pixel.opacity+=(*k)*GetPixelOpacity(p+u+j); + gamma+=(*k)*alpha; + } + k++; + } + j+=(ssize_t) (image->columns+width); + } + if (gamma != 0.0) + { + gamma=PerceptibleReciprocal(gamma); + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(gamma*pixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(gamma*pixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(gamma*pixel.blue)); + } + if ((channel & OpacityChannel) != 0) + { + j=0; + for (v=0; v < (ssize_t) width; v++) + { + for (u=0; u < (ssize_t) width; u++) + { + contrast=GetPixelIntensity(luminance_image,l+u+j)-intensity; + if (fabs(contrast) < threshold) + pixel.opacity+=(*k)*GetPixelOpacity(p+u+j); + k++; + } + j+=(ssize_t) (image->columns+width); + } + SetPixelOpacity(q,ClampToQuantum(pixel.opacity)); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + gamma=0.0; + j=0; + for (v=0; v < (ssize_t) width; v++) + { + for (u=0; u < (ssize_t) width; u++) + { + contrast=GetPixelIntensity(luminance_image,l+u+j)-intensity; + if (fabs(contrast) < threshold) + { + alpha=(MagickRealType) (QuantumScale* + GetPixelAlpha(p+u+j)); + pixel.index+=(*k)*alpha*GetPixelIndex(indexes+x+u+j); + gamma+=(*k); + } + k++; + } + j+=(ssize_t) (image->columns+width); + } + gamma=PerceptibleReciprocal(gamma); + SetPixelIndex(blur_indexes+x,ClampToQuantum(gamma*pixel.index)); + } + } + p++; + l++; + q++; + } + sync=SyncCacheViewAuthenticPixels(blur_view,exception); + if (sync == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,SelectiveBlurImageTag,progress, + image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + blur_image->type=image->type; + blur_view=DestroyCacheView(blur_view); + luminance_view=DestroyCacheView(luminance_view); + image_view=DestroyCacheView(image_view); + luminance_image=DestroyImage(luminance_image); + kernel=(double *) RelinquishAlignedMemory(kernel); + if (status == MagickFalse) + blur_image=DestroyImage(blur_image); + return(blur_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S h a d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ShadeImage() shines a distant light on an image to create a +% three-dimensional effect. You control the positioning of the light with +% azimuth and elevation; azimuth is measured in degrees off the x axis +% and elevation is measured in pixels above the Z axis. +% +% The format of the ShadeImage method is: +% +% Image *ShadeImage(const Image *image,const MagickBooleanType gray, +% const double azimuth,const double elevation,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o gray: A value other than zero shades the intensity of each pixel. +% +% o azimuth, elevation: Define the light source direction. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *ShadeImage(const Image *image,const MagickBooleanType gray, + const double azimuth,const double elevation,ExceptionInfo *exception) +{ +#define GetShadeIntensity(image,pixel) \ + ClampPixel(GetPixelIntensity((image),(pixel))) +#define ShadeImageTag "Shade/Image" + + CacheView + *image_view, + *shade_view; + + Image + *linear_image, + *shade_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + PrimaryInfo + light; + + ssize_t + y; + + /* + Initialize shaded image attributes. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + linear_image=CloneImage(image,0,0,MagickTrue,exception); + shade_image=CloneImage(image,0,0,MagickTrue,exception); + if ((linear_image == (Image *) NULL) || (shade_image == (Image *) NULL)) + { + if (linear_image != (Image *) NULL) + linear_image=DestroyImage(linear_image); + if (shade_image != (Image *) NULL) + shade_image=DestroyImage(shade_image); + return((Image *) NULL); + } + if (SetImageStorageClass(shade_image,DirectClass) == MagickFalse) + { + InheritException(exception,&shade_image->exception); + linear_image=DestroyImage(linear_image); + shade_image=DestroyImage(shade_image); + return((Image *) NULL); + } + /* + Compute the light vector. + */ + light.x=(double) QuantumRange*cos(DegreesToRadians(azimuth))* + cos(DegreesToRadians(elevation)); + light.y=(double) QuantumRange*sin(DegreesToRadians(azimuth))* + cos(DegreesToRadians(elevation)); + light.z=(double) QuantumRange*sin(DegreesToRadians(elevation)); + /* + Shade image. + */ + status=MagickTrue; + progress=0; + image_view=AcquireVirtualCacheView(linear_image,exception); + shade_view=AcquireAuthenticCacheView(shade_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(linear_image,shade_image,linear_image->rows,1) +#endif + for (y=0; y < (ssize_t) linear_image->rows; y++) + { + MagickRealType + distance, + normal_distance, + shade; + + PrimaryInfo + normal; + + const PixelPacket + *magick_restrict p, + *magick_restrict s0, + *magick_restrict s1, + *magick_restrict s2; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,-1,y-1,linear_image->columns+2,3, + exception); + q=QueueCacheViewAuthenticPixels(shade_view,0,y,shade_image->columns,1, + exception); + if ((p == (PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + /* + Shade this row of pixels. + */ + normal.z=2.0*(double) QuantumRange; /* constant Z of surface normal */ + for (x=0; x < (ssize_t) linear_image->columns; x++) + { + /* + Determine the surface normal and compute shading. + */ + s0=p+1; + s1=s0+image->columns+2; + s2=s1+image->columns+2; + normal.x=(double) (GetShadeIntensity(linear_image,s0-1)+ + GetShadeIntensity(linear_image,s1-1)+ + GetShadeIntensity(linear_image,s2-1)- + GetShadeIntensity(linear_image,s0+1)- + GetShadeIntensity(linear_image,s1+1)- + GetShadeIntensity(linear_image,s2+1)); + normal.y=(double) (GetShadeIntensity(linear_image,s2-1)+ + GetShadeIntensity(linear_image,s2)+ + GetShadeIntensity(linear_image,s2+1)- + GetShadeIntensity(linear_image,s0-1)- + GetShadeIntensity(linear_image,s0)- + GetShadeIntensity(linear_image,s0+1)); + if ((fabs(normal.x) <= MagickEpsilon) && + (fabs(normal.y) <= MagickEpsilon)) + shade=light.z; + else + { + shade=0.0; + distance=normal.x*light.x+normal.y*light.y+normal.z*light.z; + if (distance > MagickEpsilon) + { + normal_distance=normal.x*normal.x+normal.y*normal.y+normal.z* + normal.z; + if (normal_distance > (MagickEpsilon*MagickEpsilon)) + shade=distance/sqrt((double) normal_distance); + } + } + if (gray != MagickFalse) + { + SetPixelRed(q,shade); + SetPixelGreen(q,shade); + SetPixelBlue(q,shade); + } + else + { + SetPixelRed(q,ClampToQuantum(QuantumScale*shade*GetPixelRed(s1))); + SetPixelGreen(q,ClampToQuantum(QuantumScale*shade*GetPixelGreen(s1))); + SetPixelBlue(q,ClampToQuantum(QuantumScale*shade*GetPixelBlue(s1))); + } + q->opacity=s1->opacity; + p++; + q++; + } + if (SyncCacheViewAuthenticPixels(shade_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,ShadeImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + shade_view=DestroyCacheView(shade_view); + image_view=DestroyCacheView(image_view); + linear_image=DestroyImage(linear_image); + if (status == MagickFalse) + shade_image=DestroyImage(shade_image); + return(shade_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S h a r p e n I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SharpenImage() sharpens the image. We convolve the image with a Gaussian +% operator of the given radius and standard deviation (sigma). For +% reasonable results, radius should be larger than sigma. Use a radius of 0 +% and SharpenImage() selects a suitable radius for you. +% +% Using a separable kernel would be faster, but the negative weights cancel +% out on the corners of the kernel producing often undesirable ringing in the +% filtered result; this can be avoided by using a 2D gaussian shaped image +% sharpening kernel instead. +% +% The format of the SharpenImage method is: +% +% Image *SharpenImage(const Image *image,const double radius, +% const double sigma,ExceptionInfo *exception) +% Image *SharpenImageChannel(const Image *image,const ChannelType channel, +% const double radius,const double sigma,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Laplacian, in pixels. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *SharpenImage(const Image *image,const double radius, + const double sigma,ExceptionInfo *exception) +{ + Image + *sharp_image; + + sharp_image=SharpenImageChannel(image,DefaultChannels,radius,sigma,exception); + return(sharp_image); +} + +MagickExport Image *SharpenImageChannel(const Image *image, + const ChannelType channel,const double radius,const double sigma, + ExceptionInfo *exception) +{ + double + gamma, + normalize; + + Image + *sharp_image; + + KernelInfo + *kernel_info; + + ssize_t + i; + + size_t + width; + + ssize_t + j, + u, + v; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + width=GetOptimalKernelWidth2D(radius,sigma); + kernel_info=AcquireKernelInfo((const char *) NULL); + if (kernel_info == (KernelInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + (void) memset(kernel_info,0,sizeof(*kernel_info)); + kernel_info->width=width; + kernel_info->height=width; + kernel_info->x=(ssize_t) (width-1)/2; + kernel_info->y=(ssize_t) (width-1)/2; + kernel_info->signature=MagickCoreSignature; + kernel_info->values=(double *) MagickAssumeAligned(AcquireAlignedMemory( + kernel_info->width,kernel_info->height*sizeof(*kernel_info->values))); + if (kernel_info->values == (double *) NULL) + { + kernel_info=DestroyKernelInfo(kernel_info); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + normalize=0.0; + j=(ssize_t) (kernel_info->width-1)/2; + i=0; + for (v=(-j); v <= j; v++) + { + for (u=(-j); u <= j; u++) + { + kernel_info->values[i]=(double) (-exp(-((double) u*u+v*v)/(2.0* + MagickSigma*MagickSigma))/(2.0*MagickPI*MagickSigma*MagickSigma)); + normalize+=kernel_info->values[i]; + i++; + } + } + kernel_info->values[i/2]=(double) ((-2.0)*normalize); + normalize=0.0; + for (i=0; i < (ssize_t) (kernel_info->width*kernel_info->height); i++) + normalize+=kernel_info->values[i]; + gamma=PerceptibleReciprocal(normalize); + for (i=0; i < (ssize_t) (kernel_info->width*kernel_info->height); i++) + kernel_info->values[i]*=gamma; + sharp_image=MorphologyImageChannel(image,channel,ConvolveMorphology,1, + kernel_info,exception); + kernel_info=DestroyKernelInfo(kernel_info); + return(sharp_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S p r e a d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SpreadImage() is a special effects method that randomly displaces each +% pixel in a block defined by the radius parameter. +% +% The format of the SpreadImage method is: +% +% Image *SpreadImage(const Image *image,const double radius, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o radius: Choose a random pixel in a neighborhood of this extent. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *SpreadImage(const Image *image,const double radius, + ExceptionInfo *exception) +{ +#define SpreadImageTag "Spread/Image" + + CacheView + *image_view, + *spread_view; + + Image + *spread_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + bias; + + RandomInfo + **magick_restrict random_info; + + size_t + width; + + ssize_t + y; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + unsigned long + key; +#endif + + /* + Initialize spread image attributes. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + spread_image=CloneImage(image,0,0,MagickTrue,exception); + if (spread_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(spread_image,DirectClass) == MagickFalse) + { + InheritException(exception,&spread_image->exception); + spread_image=DestroyImage(spread_image); + return((Image *) NULL); + } + /* + Spread image. + */ + status=MagickTrue; + progress=0; + GetMagickPixelPacket(spread_image,&bias); + width=GetOptimalKernelWidth1D(radius,0.5); + random_info=AcquireRandomInfoTLS(); + image_view=AcquireVirtualCacheView(image,exception); + spread_view=AcquireAuthenticCacheView(spread_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + key=GetRandomSecretKey(random_info[0]); + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,spread_image,spread_image->rows,key == ~0UL) +#endif + for (y=0; y < (ssize_t) spread_image->rows; y++) + { + const int + id = GetOpenMPThreadId(); + + MagickPixelPacket + pixel; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=QueueCacheViewAuthenticPixels(spread_view,0,y,spread_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(spread_view); + pixel=bias; + for (x=0; x < (ssize_t) spread_image->columns; x++) + { + PointInfo + point; + + point.x=GetPseudoRandomValue(random_info[id]); + point.y=GetPseudoRandomValue(random_info[id]); + status=InterpolateMagickPixelPacket(image,image_view,image->interpolate, + (double) x+width*(point.x-0.5),(double) y+width*(point.y-0.5),&pixel, + exception); + if (status == MagickFalse) + break; + SetPixelPacket(spread_image,&pixel,q,indexes+x); + q++; + } + if (SyncCacheViewAuthenticPixels(spread_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,SpreadImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + spread_view=DestroyCacheView(spread_view); + image_view=DestroyCacheView(image_view); + random_info=DestroyRandomInfoTLS(random_info); + if (status == MagickFalse) + spread_image=DestroyImage(spread_image); + return(spread_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n s h a r p M a s k I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnsharpMaskImage() sharpens one or more image channels. We convolve the +% image with a Gaussian operator of the given radius and standard deviation +% (sigma). For reasonable results, radius should be larger than sigma. Use a +% radius of 0 and UnsharpMaskImage() selects a suitable radius for you. +% +% The format of the UnsharpMaskImage method is: +% +% Image *UnsharpMaskImage(const Image *image,const double radius, +% const double sigma,const double amount,const double threshold, +% ExceptionInfo *exception) +% Image *UnsharpMaskImageChannel(const Image *image, +% const ChannelType channel,const double radius,const double sigma, +% const double gain,const double threshold,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel type. +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o gain: the percentage of the difference between the original and the +% blur image that is added back into the original. +% +% o threshold: the threshold in pixels needed to apply the diffence gain. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *UnsharpMaskImage(const Image *image,const double radius, + const double sigma,const double gain,const double threshold, + ExceptionInfo *exception) +{ + Image + *sharp_image; + + + sharp_image=UnsharpMaskImageChannel(image,DefaultChannels,radius,sigma,gain, + threshold,exception); + + return(sharp_image); +} + +MagickExport Image *UnsharpMaskImageChannel(const Image *image, + const ChannelType channel,const double radius,const double sigma, + const double gain,const double threshold,ExceptionInfo *exception) +{ +#define SharpenImageTag "Sharpen/Image" + + CacheView + *image_view, + *unsharp_view; + + Image + *unsharp_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + bias; + + MagickRealType + quantum_threshold; + + ssize_t + y; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); +/* This kernel appears to be broken. +#if defined(MAGICKCORE_OPENCL_SUPPORT) + unsharp_image=AccelerateUnsharpMaskImage(image,channel,radius,sigma,gain, + threshold,exception); + if (unsharp_image != (Image *) NULL) + return(unsharp_image); +#endif +*/ + unsharp_image=BlurImageChannel(image,(ChannelType) (channel &~ SyncChannels), + radius,sigma,exception); + if (unsharp_image == (Image *) NULL) + return((Image *) NULL); + quantum_threshold=(MagickRealType) QuantumRange*threshold; + /* + Unsharp-mask image. + */ + status=MagickTrue; + progress=0; + GetMagickPixelPacket(image,&bias); + image_view=AcquireVirtualCacheView(image,exception); + unsharp_view=AcquireAuthenticCacheView(unsharp_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,unsharp_image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + DoublePixelPacket + pixel; + + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + IndexPacket + *magick_restrict unsharp_indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + q=GetCacheViewAuthenticPixels(unsharp_view,0,y,unsharp_image->columns,1, + exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(image_view); + unsharp_indexes=GetCacheViewAuthenticIndexQueue(unsharp_view); + pixel.red=bias.red; + pixel.green=bias.green; + pixel.blue=bias.blue; + pixel.opacity=bias.opacity; + pixel.index=bias.index; + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + { + pixel.red=GetPixelRed(p)-(MagickRealType) GetPixelRed(q); + if (fabs(2.0*pixel.red) < quantum_threshold) + pixel.red=(MagickRealType) GetPixelRed(p); + else + pixel.red=(MagickRealType) GetPixelRed(p)+(pixel.red*gain); + SetPixelRed(q,ClampToQuantum(pixel.red)); + } + if ((channel & GreenChannel) != 0) + { + pixel.green=GetPixelGreen(p)-(MagickRealType) q->green; + if (fabs(2.0*pixel.green) < quantum_threshold) + pixel.green=(MagickRealType) GetPixelGreen(p); + else + pixel.green=(MagickRealType) GetPixelGreen(p)+(pixel.green*gain); + SetPixelGreen(q,ClampToQuantum(pixel.green)); + } + if ((channel & BlueChannel) != 0) + { + pixel.blue=GetPixelBlue(p)-(MagickRealType) q->blue; + if (fabs(2.0*pixel.blue) < quantum_threshold) + pixel.blue=(MagickRealType) GetPixelBlue(p); + else + pixel.blue=(MagickRealType) GetPixelBlue(p)+(pixel.blue*gain); + SetPixelBlue(q,ClampToQuantum(pixel.blue)); + } + if ((channel & OpacityChannel) != 0) + { + pixel.opacity=GetPixelOpacity(p)-(MagickRealType) q->opacity; + if (fabs(2.0*pixel.opacity) < quantum_threshold) + pixel.opacity=(MagickRealType) GetPixelOpacity(p); + else + pixel.opacity=GetPixelOpacity(p)+(pixel.opacity*gain); + SetPixelOpacity(q,ClampToQuantum(pixel.opacity)); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + pixel.index=GetPixelIndex(indexes+x)-(MagickRealType) + GetPixelIndex(unsharp_indexes+x); + if (fabs(2.0*pixel.index) < quantum_threshold) + pixel.index=(MagickRealType) GetPixelIndex(indexes+x); + else + pixel.index=(MagickRealType) GetPixelIndex(indexes+x)+ + (pixel.index*gain); + SetPixelIndex(unsharp_indexes+x,ClampToQuantum(pixel.index)); + } + p++; + q++; + } + if (SyncCacheViewAuthenticPixels(unsharp_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,SharpenImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + unsharp_image->type=image->type; + unsharp_view=DestroyCacheView(unsharp_view); + image_view=DestroyCacheView(image_view); + if (status == MagickFalse) + unsharp_image=DestroyImage(unsharp_image); + return(unsharp_image); +} diff --git a/ImageMagick-6.9.12-44/magick/effect.h b/ImageMagick-6.9.12-44/magick/effect.h new file mode 100644 index 0000000..d6d7a42 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/effect.h @@ -0,0 +1,115 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image effects methods. +*/ +#ifndef MAGICKCORE_EFFECT_H +#define MAGICKCORE_EFFECT_H + +#include "magick/morphology.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef enum +{ + UndefinedPreview, + RotatePreview, + ShearPreview, + RollPreview, + HuePreview, + SaturationPreview, + BrightnessPreview, + GammaPreview, + SpiffPreview, + DullPreview, + GrayscalePreview, + QuantizePreview, + DespecklePreview, + ReduceNoisePreview, + AddNoisePreview, + SharpenPreview, + BlurPreview, + ThresholdPreview, + EdgeDetectPreview, + SpreadPreview, + SolarizePreview, + ShadePreview, + RaisePreview, + SegmentPreview, + SwirlPreview, + ImplodePreview, + WavePreview, + OilPaintPreview, + CharcoalDrawingPreview, + JPEGPreview +} PreviewType; + +extern MagickExport Image + *AdaptiveBlurImage(const Image *,const double,const double,ExceptionInfo *), + *AdaptiveBlurImageChannel(const Image *,const ChannelType,const double, + const double,ExceptionInfo *), + *AdaptiveSharpenImage(const Image *,const double,const double, + ExceptionInfo *), + *AdaptiveSharpenImageChannel(const Image *,const ChannelType,const double, + const double,ExceptionInfo *), + *BlurImage(const Image *,const double,const double,ExceptionInfo *), + *BlurImageChannel(const Image *,const ChannelType,const double,const double, + ExceptionInfo *), + *ConvolveImage(const Image *,const size_t,const double *,ExceptionInfo *), + *ConvolveImageChannel(const Image *,const ChannelType,const size_t, + const double *,ExceptionInfo *), + *DespeckleImage(const Image *,ExceptionInfo *), + *EdgeImage(const Image *,const double,ExceptionInfo *), + *EmbossImage(const Image *,const double,const double,ExceptionInfo *), + *FilterImage(const Image *,const KernelInfo *,ExceptionInfo *), + *FilterImageChannel(const Image *,const ChannelType,const KernelInfo *, + ExceptionInfo *), + *GaussianBlurImage(const Image *,const double,const double,ExceptionInfo *), + *GaussianBlurImageChannel(const Image *,const ChannelType,const double, + const double,ExceptionInfo *), + *KuwaharaImage(const Image *,const double,const double,ExceptionInfo *), + *KuwaharaImageChannel(const Image *,const ChannelType,const double, + const double,ExceptionInfo *), + *LocalContrastImage(const Image *,const double,const double,ExceptionInfo *), + *MotionBlurImage(const Image *,const double,const double,const double, + ExceptionInfo *), + *MotionBlurImageChannel(const Image *,const ChannelType,const double, + const double,const double,ExceptionInfo *), + *PreviewImage(const Image *,const PreviewType,ExceptionInfo *), + *RotationalBlurImage(const Image *,const double,ExceptionInfo *), + *RotationalBlurImageChannel(const Image *,const ChannelType,const double, + ExceptionInfo *), + *SelectiveBlurImage(const Image *,const double,const double,const double, + ExceptionInfo *), + *SelectiveBlurImageChannel(const Image *,const ChannelType,const double, + const double,const double,ExceptionInfo *), + *ShadeImage(const Image *,const MagickBooleanType,const double,const double, + ExceptionInfo *), + *SharpenImage(const Image *,const double,const double,ExceptionInfo *), + *SharpenImageChannel(const Image *,const ChannelType,const double, + const double,ExceptionInfo *), + *SpreadImage(const Image *,const double,ExceptionInfo *), + *UnsharpMaskImage(const Image *,const double,const double,const double, + const double,ExceptionInfo *), + *UnsharpMaskImageChannel(const Image *,const ChannelType,const double, + const double,const double,const double,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/enhance.c b/ImageMagick-6.9.12-44/magick/enhance.c new file mode 100644 index 0000000..35f2d34 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/enhance.c @@ -0,0 +1,4522 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% EEEEE N N H H AAA N N CCCC EEEEE % +% E NN N H H A A NN N C E % +% EEE N N N HHHHH AAAAA N N N C EEE % +% E N NN H H A A N NN C E % +% EEEEE N N H H A A N N CCCC EEEEE % +% % +% % +% MagickCore Image Enhancement Methods % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/accelerate-private.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/cache.h" +#include "magick/cache-view.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/composite-private.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/fx.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/histogram.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/opencl.h" +#include "magick/opencl-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/quantum.h" +#include "magick/quantum-private.h" +#include "magick/resample.h" +#include "magick/resample-private.h" +#include "magick/resource_.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/thread-private.h" +#include "magick/threshold.h" +#include "magick/token.h" +#include "magick/xml-tree.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A u t o G a m m a I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AutoGammaImage() extract the 'mean' from the image and adjust the image +% to try make set its gamma appropriatally. +% +% The format of the AutoGammaImage method is: +% +% MagickBooleanType AutoGammaImage(Image *image) +% MagickBooleanType AutoGammaImageChannel(Image *image, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o image: The image to auto-level +% +% o channel: The channels to auto-level. If the special 'SyncChannels' +% flag is set all given channels is adjusted in the same way using the +% mean average of those channels. +% +*/ + +MagickExport MagickBooleanType AutoGammaImage(Image *image) +{ + return(AutoGammaImageChannel(image,DefaultChannels)); +} + +MagickExport MagickBooleanType AutoGammaImageChannel(Image *image, + const ChannelType channel) +{ + double + gamma, + mean, + logmean, + sans; + + MagickStatusType + status; + + logmean=log(0.5); + if ((channel & SyncChannels) != 0) + { + /* + Apply gamma correction equally accross all given channels + */ + (void) GetImageChannelMean(image,channel,&mean,&sans,&image->exception); + gamma=log(mean*QuantumScale)/logmean; + return(LevelImageChannel(image,channel,0.0,(double) QuantumRange,gamma)); + } + /* + Auto-gamma each channel separateally + */ + status = MagickTrue; + if ((channel & RedChannel) != 0) + { + (void) GetImageChannelMean(image,RedChannel,&mean,&sans, + &image->exception); + gamma=log(mean*QuantumScale)/logmean; + status&=LevelImageChannel(image,RedChannel,0.0,(double) QuantumRange, + gamma); + } + if ((channel & GreenChannel) != 0) + { + (void) GetImageChannelMean(image,GreenChannel,&mean,&sans, + &image->exception); + gamma=log(mean*QuantumScale)/logmean; + status&=LevelImageChannel(image,GreenChannel,0.0,(double) QuantumRange, + gamma); + } + if ((channel & BlueChannel) != 0) + { + (void) GetImageChannelMean(image,BlueChannel,&mean,&sans, + &image->exception); + gamma=log(mean*QuantumScale)/logmean; + status&=LevelImageChannel(image,BlueChannel,0.0,(double) QuantumRange, + gamma); + } + if (((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + { + (void) GetImageChannelMean(image,OpacityChannel,&mean,&sans, + &image->exception); + gamma=log(mean*QuantumScale)/logmean; + status&=LevelImageChannel(image,OpacityChannel,0.0,(double) QuantumRange, + gamma); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + (void) GetImageChannelMean(image,IndexChannel,&mean,&sans, + &image->exception); + gamma=log(mean*QuantumScale)/logmean; + status&=LevelImageChannel(image,IndexChannel,0.0,(double) QuantumRange, + gamma); + } + return(status != 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A u t o L e v e l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AutoLevelImage() adjusts the levels of a particular image channel by +% scaling the minimum and maximum values to the full quantum range. +% +% The format of the LevelImage method is: +% +% MagickBooleanType AutoLevelImage(Image *image) +% MagickBooleanType AutoLevelImageChannel(Image *image, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o image: The image to auto-level +% +% o channel: The channels to auto-level. If the special 'SyncChannels' +% flag is set the min/max/mean value of all given channels is used for +% all given channels, to all channels in the same way. +% +*/ + +MagickExport MagickBooleanType AutoLevelImage(Image *image) +{ + return(AutoLevelImageChannel(image,DefaultChannels)); +} + +MagickExport MagickBooleanType AutoLevelImageChannel(Image *image, + const ChannelType channel) +{ + /* + Convenience method for a min/max histogram stretch. + */ + return(MinMaxStretchImage(image,channel,0.0,0.0)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% B r i g h t n e s s C o n t r a s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% BrightnessContrastImage() changes the brightness and/or contrast of an +% image. It converts the brightness and contrast parameters into slope and +% intercept and calls a polynomical function to apply to the image. +% +% The format of the BrightnessContrastImage method is: +% +% MagickBooleanType BrightnessContrastImage(Image *image, +% const double brightness,const double contrast) +% MagickBooleanType BrightnessContrastImageChannel(Image *image, +% const ChannelType channel,const double brightness, +% const double contrast) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o brightness: the brightness percent (-100 .. 100). +% +% o contrast: the contrast percent (-100 .. 100). +% +*/ + +MagickExport MagickBooleanType BrightnessContrastImage(Image *image, + const double brightness,const double contrast) +{ + MagickBooleanType + status; + + status=BrightnessContrastImageChannel(image,DefaultChannels,brightness, + contrast); + return(status); +} + +MagickExport MagickBooleanType BrightnessContrastImageChannel(Image *image, + const ChannelType channel,const double brightness,const double contrast) +{ +#define BrightnessContastImageTag "BrightnessContast/Image" + + double + alpha, + intercept, + coefficients[2], + slope; + + MagickBooleanType + status; + + /* + Compute slope and intercept. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + alpha=contrast; + slope=tan((double) (MagickPI*(alpha/100.0+1.0)/4.0)); + if (slope < 0.0) + slope=0.0; + intercept=brightness/100.0+((100-brightness)/200.0)*(1.0-slope); + coefficients[0]=slope; + coefficients[1]=intercept; + status=FunctionImageChannel(image,channel,PolynomialFunction,2,coefficients, + &image->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o l o r D e c i s i o n L i s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ColorDecisionListImage() accepts a lightweight Color Correction Collection +% (CCC) file which solely contains one or more color corrections and applies +% the correction to the image. Here is a sample CCC file: +% +% +% +% +% 0.9 1.2 0.5 +% 0.4 -0.5 0.6 +% 1.0 0.8 1.5 +% +% +% 0.85 +% +% +% +% +% which includes the slop, offset, and power for each of the RGB channels +% as well as the saturation. +% +% The format of the ColorDecisionListImage method is: +% +% MagickBooleanType ColorDecisionListImage(Image *image, +% const char *color_correction_collection) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o color_correction_collection: the color correction collection in XML. +% +*/ +MagickExport MagickBooleanType ColorDecisionListImage(Image *image, + const char *color_correction_collection) +{ +#define ColorDecisionListCorrectImageTag "ColorDecisionList/Image" + + typedef struct _Correction + { + double + slope, + offset, + power; + } Correction; + + typedef struct _ColorCorrection + { + Correction + red, + green, + blue; + + double + saturation; + } ColorCorrection; + + CacheView + *image_view; + + char + token[MaxTextExtent]; + + ColorCorrection + color_correction; + + const char + *content, + *p; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + PixelPacket + *cdl_map; + + ssize_t + i; + + ssize_t + y; + + XMLTreeInfo + *cc, + *ccc, + *sat, + *sop; + + /* + Allocate and initialize cdl maps. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (color_correction_collection == (const char *) NULL) + return(MagickFalse); + exception=(&image->exception); + ccc=NewXMLTree((const char *) color_correction_collection,&image->exception); + if (ccc == (XMLTreeInfo *) NULL) + return(MagickFalse); + cc=GetXMLTreeChild(ccc,"ColorCorrection"); + if (cc == (XMLTreeInfo *) NULL) + { + ccc=DestroyXMLTree(ccc); + return(MagickFalse); + } + color_correction.red.slope=1.0; + color_correction.red.offset=0.0; + color_correction.red.power=1.0; + color_correction.green.slope=1.0; + color_correction.green.offset=0.0; + color_correction.green.power=1.0; + color_correction.blue.slope=1.0; + color_correction.blue.offset=0.0; + color_correction.blue.power=1.0; + color_correction.saturation=0.0; + sop=GetXMLTreeChild(cc,"SOPNode"); + if (sop != (XMLTreeInfo *) NULL) + { + XMLTreeInfo + *offset, + *power, + *slope; + + slope=GetXMLTreeChild(sop,"Slope"); + if (slope != (XMLTreeInfo *) NULL) + { + content=GetXMLTreeContent(slope); + p=(const char *) content; + for (i=0; (*p != '\0') && (i < 3); i++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + switch (i) + { + case 0: + { + color_correction.red.slope=StringToDouble(token,(char **) NULL); + break; + } + case 1: + { + color_correction.green.slope=StringToDouble(token, + (char **) NULL); + break; + } + case 2: + { + color_correction.blue.slope=StringToDouble(token, + (char **) NULL); + break; + } + } + } + } + offset=GetXMLTreeChild(sop,"Offset"); + if (offset != (XMLTreeInfo *) NULL) + { + content=GetXMLTreeContent(offset); + p=(const char *) content; + for (i=0; (*p != '\0') && (i < 3); i++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + switch (i) + { + case 0: + { + color_correction.red.offset=StringToDouble(token, + (char **) NULL); + break; + } + case 1: + { + color_correction.green.offset=StringToDouble(token, + (char **) NULL); + break; + } + case 2: + { + color_correction.blue.offset=StringToDouble(token, + (char **) NULL); + break; + } + } + } + } + power=GetXMLTreeChild(sop,"Power"); + if (power != (XMLTreeInfo *) NULL) + { + content=GetXMLTreeContent(power); + p=(const char *) content; + for (i=0; (*p != '\0') && (i < 3); i++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + switch (i) + { + case 0: + { + color_correction.red.power=StringToDouble(token,(char **) NULL); + break; + } + case 1: + { + color_correction.green.power=StringToDouble(token, + (char **) NULL); + break; + } + case 2: + { + color_correction.blue.power=StringToDouble(token, + (char **) NULL); + break; + } + } + } + } + } + sat=GetXMLTreeChild(cc,"SATNode"); + if (sat != (XMLTreeInfo *) NULL) + { + XMLTreeInfo + *saturation; + + saturation=GetXMLTreeChild(sat,"Saturation"); + if (saturation != (XMLTreeInfo *) NULL) + { + content=GetXMLTreeContent(saturation); + p=(const char *) content; + (void) GetNextToken(p,&p,MaxTextExtent,token); + color_correction.saturation=StringToDouble(token,(char **) NULL); + } + } + ccc=DestroyXMLTree(ccc); + if (image->debug != MagickFalse) + { + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " Color Correction Collection:"); + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " color_correction.red.slope: %g",color_correction.red.slope); + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " color_correction.red.offset: %g",color_correction.red.offset); + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " color_correction.red.power: %g",color_correction.red.power); + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " color_correction.green.slope: %g",color_correction.green.slope); + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " color_correction.green.offset: %g",color_correction.green.offset); + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " color_correction.green.power: %g",color_correction.green.power); + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " color_correction.blue.slope: %g",color_correction.blue.slope); + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " color_correction.blue.offset: %g",color_correction.blue.offset); + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " color_correction.blue.power: %g",color_correction.blue.power); + (void) LogMagickEvent(TransformEvent,GetMagickModule(), + " color_correction.saturation: %g",color_correction.saturation); + } + cdl_map=(PixelPacket *) AcquireQuantumMemory(MaxMap+1UL,sizeof(*cdl_map)); + if (cdl_map == (PixelPacket *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + for (i=0; i <= (ssize_t) MaxMap; i++) + { + cdl_map[i].red=ClampToQuantum((MagickRealType) ScaleMapToQuantum(( + MagickRealType) (MaxMap*(pow(color_correction.red.slope*i/MaxMap+ + color_correction.red.offset,color_correction.red.power))))); + cdl_map[i].green=ClampToQuantum((MagickRealType) ScaleMapToQuantum(( + MagickRealType) (MaxMap*(pow(color_correction.green.slope*i/MaxMap+ + color_correction.green.offset,color_correction.green.power))))); + cdl_map[i].blue=ClampToQuantum((MagickRealType) ScaleMapToQuantum(( + MagickRealType) (MaxMap*(pow(color_correction.blue.slope*i/MaxMap+ + color_correction.blue.offset,color_correction.blue.power))))); + } + if (image->storage_class == PseudoClass) + { + /* + Apply transfer function to colormap. + */ + for (i=0; i < (ssize_t) image->colors; i++) + { + double + luma; + + luma=0.212656*image->colormap[i].red+0.715158*image->colormap[i].green+ + 0.072186*image->colormap[i].blue; + image->colormap[i].red=ClampToQuantum(luma+color_correction.saturation* + cdl_map[ScaleQuantumToMap(image->colormap[i].red)].red-luma); + image->colormap[i].green=ClampToQuantum(luma+ + color_correction.saturation*cdl_map[ScaleQuantumToMap( + image->colormap[i].green)].green-luma); + image->colormap[i].blue=ClampToQuantum(luma+color_correction.saturation* + cdl_map[ScaleQuantumToMap(image->colormap[i].blue)].blue-luma); + } + } + /* + Apply transfer function to image. + */ + status=MagickTrue; + progress=0; + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + double + luma; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + luma=0.212656*GetPixelRed(q)+0.715158*GetPixelGreen(q)+ + 0.072186*GetPixelBlue(q); + SetPixelRed(q,ClampToQuantum(luma+color_correction.saturation* + (cdl_map[ScaleQuantumToMap(GetPixelRed(q))].red-luma))); + SetPixelGreen(q,ClampToQuantum(luma+color_correction.saturation* + (cdl_map[ScaleQuantumToMap(GetPixelGreen(q))].green-luma))); + SetPixelBlue(q,ClampToQuantum(luma+color_correction.saturation* + (cdl_map[ScaleQuantumToMap(GetPixelBlue(q))].blue-luma))); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,ColorDecisionListCorrectImageTag, + progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + cdl_map=(PixelPacket *) RelinquishMagickMemory(cdl_map); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l u t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClutImage() replaces each color value in the given image, by using it as an +% index to lookup a replacement color value in a Color Look UP Table in the +% form of an image. The values are extracted along a diagonal of the CLUT +% image so either a horizontal or vertial gradient image can be used. +% +% Typically this is used to either re-color a gray-scale image according to a +% color gradient in the CLUT image, or to perform a freeform histogram +% (level) adjustment according to the (typically gray-scale) gradient in the +% CLUT image. +% +% When the 'channel' mask includes the matte/alpha transparency channel but +% one image has no such channel it is assumed that that image is a simple +% gray-scale image that will effect the alpha channel values, either for +% gray-scale coloring (with transparent or semi-transparent colors), or +% a histogram adjustment of existing alpha channel values. If both images +% have matte channels, direct and normal indexing is applied, which is rarely +% used. +% +% The format of the ClutImage method is: +% +% MagickBooleanType ClutImage(Image *image,Image *clut_image) +% MagickBooleanType ClutImageChannel(Image *image, +% const ChannelType channel,Image *clut_image) +% +% A description of each parameter follows: +% +% o image: the image, which is replaced by indexed CLUT values +% +% o clut_image: the color lookup table image for replacement color values. +% +% o channel: the channel. +% +*/ + +MagickExport MagickBooleanType ClutImage(Image *image,const Image *clut_image) +{ + return(ClutImageChannel(image,DefaultChannels,clut_image)); +} + +MagickExport MagickBooleanType ClutImageChannel(Image *image, + const ChannelType channel,const Image *clut_image) +{ +#define ClutImageTag "Clut/Image" + + CacheView + *clut_view, + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + *clut_map; + + ssize_t + i; + + ssize_t + adjust, + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(clut_image != (Image *) NULL); + assert(clut_image->signature == MagickCoreSignature); + exception=(&image->exception); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + if ((IsGrayColorspace(image->colorspace) != MagickFalse) && + (IsGrayColorspace(clut_image->colorspace) == MagickFalse)) + (void) SetImageColorspace(image,sRGBColorspace); + clut_map=(MagickPixelPacket *) AcquireQuantumMemory(MaxMap+1UL, + sizeof(*clut_map)); + if (clut_map == (MagickPixelPacket *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + /* + Clut image. + */ + status=MagickTrue; + progress=0; + adjust=(ssize_t) (clut_image->interpolate == IntegerInterpolatePixel ? 0 : 1); + clut_view=AcquireAuthenticCacheView(clut_image,exception); + for (i=0; i <= (ssize_t) MaxMap; i++) + { + GetMagickPixelPacket(clut_image,clut_map+i); + status=InterpolateMagickPixelPacket(clut_image,clut_view, + UndefinedInterpolatePixel,(double) i*(clut_image->columns-adjust)/MaxMap, + (double) i*(clut_image->rows-adjust)/MaxMap,clut_map+i,exception); + if (status == MagickFalse) + break; + } + clut_view=DestroyCacheView(clut_view); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickPixelPacket + pixel; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + GetMagickPixelPacket(image,&pixel); + for (x=0; x < (ssize_t) image->columns; x++) + { + SetMagickPixelPacket(image,q,indexes+x,&pixel); + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampPixelRed(clut_map+ + ScaleQuantumToMap(GetPixelRed(q)))); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampPixelGreen(clut_map+ + ScaleQuantumToMap(GetPixelGreen(q)))); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampPixelBlue(clut_map+ + ScaleQuantumToMap(GetPixelBlue(q)))); + if ((channel & OpacityChannel) != 0) + { + if (clut_image->matte == MagickFalse) + SetPixelAlpha(q,MagickPixelIntensityToQuantum(clut_map+ + ScaleQuantumToMap((Quantum) GetPixelAlpha(q)))); + else + if (image->matte == MagickFalse) + SetPixelOpacity(q,ClampPixelOpacity(clut_map+ + ScaleQuantumToMap((Quantum) MagickPixelIntensity(&pixel)))); + else + SetPixelOpacity(q,ClampPixelOpacity( + clut_map+ScaleQuantumToMap(GetPixelOpacity(q)))); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(indexes+x,ClampToQuantum((clut_map+(ssize_t) + GetPixelIndex(indexes+x))->index)); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,ClutImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + clut_map=(MagickPixelPacket *) RelinquishMagickMemory(clut_map); + if ((clut_image->matte != MagickFalse) && ((channel & OpacityChannel) != 0)) + (void) SetImageAlphaChannel(image,ActivateAlphaChannel); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n t r a s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ContrastImage() enhances the intensity differences between the lighter and +% darker elements of the image. Set sharpen to a MagickTrue to increase the +% image contrast otherwise the contrast is reduced. +% +% The format of the ContrastImage method is: +% +% MagickBooleanType ContrastImage(Image *image, +% const MagickBooleanType sharpen) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o sharpen: Increase or decrease image contrast. +% +*/ + +static void Contrast(const int sign,Quantum *red,Quantum *green,Quantum *blue) +{ + double + brightness, + hue, + saturation; + + /* + Enhance contrast: dark color become darker, light color become lighter. + */ + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + hue=0.0; + saturation=0.0; + brightness=0.0; + ConvertRGBToHSB(*red,*green,*blue,&hue,&saturation,&brightness); + brightness+=0.5*sign*(0.5*(sin((double) (MagickPI*(brightness-0.5)))+1.0)- + brightness); + if (brightness > 1.0) + brightness=1.0; + else + if (brightness < 0.0) + brightness=0.0; + ConvertHSBToRGB(hue,saturation,brightness,red,green,blue); +} + +MagickExport MagickBooleanType ContrastImage(Image *image, + const MagickBooleanType sharpen) +{ +#define ContrastImageTag "Contrast/Image" + + CacheView + *image_view; + + ExceptionInfo + *exception; + + int + sign; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + i; + + ssize_t + y; + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + sign=sharpen != MagickFalse ? 1 : -1; + if (image->storage_class == PseudoClass) + { + /* + Contrast enhance colormap. + */ + for (i=0; i < (ssize_t) image->colors; i++) + Contrast(sign,&image->colormap[i].red,&image->colormap[i].green, + &image->colormap[i].blue); + } + /* + Contrast enhance image. + */ +#if defined(MAGICKCORE_OPENCL_SUPPORT) + status=AccelerateContrastImage(image,sharpen,&image->exception); + if (status != MagickFalse) + return status; +#endif + status=MagickTrue; + progress=0; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + Quantum + blue, + green, + red; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + red=GetPixelRed(q); + green=GetPixelGreen(q); + blue=GetPixelBlue(q); + Contrast(sign,&red,&green,&blue); + SetPixelRed(q,red); + SetPixelGreen(q,green); + SetPixelBlue(q,blue); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,ContrastImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n t r a s t S t r e t c h I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ContrastStretchImage() is a simple image enhancement technique that attempts +% to improve the contrast in an image by `stretching' the range of intensity +% values it contains to span a desired range of values. It differs from the +% more sophisticated histogram equalization in that it can only apply a +% linear scaling function to the image pixel values. As a result the +% `enhancement' is less harsh. +% +% The format of the ContrastStretchImage method is: +% +% MagickBooleanType ContrastStretchImage(Image *image, +% const char *levels) +% MagickBooleanType ContrastStretchImageChannel(Image *image, +% const size_t channel,const double black_point, +% const double white_point) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o black_point: the black point. +% +% o white_point: the white point. +% +% o levels: Specify the levels where the black and white points have the +% range of 0 to number-of-pixels (e.g. 1%, 10x90%, etc.). +% +*/ + +MagickExport MagickBooleanType ContrastStretchImage(Image *image, + const char *levels) +{ + double + black_point = 0.0, + white_point = (double) image->columns*image->rows; + + GeometryInfo + geometry_info; + + MagickBooleanType + status; + + MagickStatusType + flags; + + /* + Parse levels. + */ + if (levels == (char *) NULL) + return(MagickFalse); + flags=ParseGeometry(levels,&geometry_info); + if ((flags & RhoValue) != 0) + black_point=geometry_info.rho; + if ((flags & SigmaValue) != 0) + white_point=geometry_info.sigma; + if ((flags & PercentValue) != 0) + { + black_point*=(double) QuantumRange/100.0; + white_point*=(double) QuantumRange/100.0; + } + if ((flags & SigmaValue) == 0) + white_point=(double) image->columns*image->rows-black_point; + status=ContrastStretchImageChannel(image,DefaultChannels,black_point, + white_point); + return(status); +} + +MagickExport MagickBooleanType ContrastStretchImageChannel(Image *image, + const ChannelType channel,const double black_point,const double white_point) +{ +#define MaxRange(color) ((MagickRealType) ScaleQuantumToMap((Quantum) (color))) +#define ContrastStretchImageTag "ContrastStretch/Image" + + CacheView + *image_view; + + double + intensity; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + black, + *histogram, + white; + + QuantumPixelPacket + *stretch_map; + + ssize_t + i; + + ssize_t + y; + + /* + Allocate histogram and stretch map. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=(&image->exception); + +#if defined(MAGICKCORE_OPENCL_SUPPORT) && 0 + /* Call OpenCL version */ + status=AccelerateContrastStretchImageChannel(image,channel,black_point, + white_point,&image->exception); + if (status != MagickFalse) + return status; +#endif + histogram=(MagickPixelPacket *) AcquireQuantumMemory(MaxMap+1UL, + sizeof(*histogram)); + stretch_map=(QuantumPixelPacket *) AcquireQuantumMemory(MaxMap+1UL, + sizeof(*stretch_map)); + if ((histogram == (MagickPixelPacket *) NULL) || + (stretch_map == (QuantumPixelPacket *) NULL)) + { + if (stretch_map != (QuantumPixelPacket *) NULL) + stretch_map=(QuantumPixelPacket *) RelinquishMagickMemory(stretch_map); + if (histogram != (MagickPixelPacket *) NULL) + histogram=(MagickPixelPacket *) RelinquishMagickMemory(histogram); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + /* + Form histogram. + */ + if (SetImageGray(image,exception) != MagickFalse) + (void) SetImageColorspace(image,GRAYColorspace); + status=MagickTrue; + (void) memset(histogram,0,(MaxMap+1)*sizeof(*histogram)); + image_view=AcquireAuthenticCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + IndexPacket + *magick_restrict indexes; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + if ((channel & SyncChannels) != 0) + for (x=0; x < (ssize_t) image->columns; x++) + { + Quantum + intensity; + + intensity=ClampToQuantum(GetPixelIntensity(image,p)); + histogram[ScaleQuantumToMap(intensity)].red++; + histogram[ScaleQuantumToMap(intensity)].green++; + histogram[ScaleQuantumToMap(intensity)].blue++; + histogram[ScaleQuantumToMap(intensity)].index++; + p++; + } + else + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + histogram[ScaleQuantumToMap(GetPixelRed(p))].red++; + if ((channel & GreenChannel) != 0) + histogram[ScaleQuantumToMap(GetPixelGreen(p))].green++; + if ((channel & BlueChannel) != 0) + histogram[ScaleQuantumToMap(GetPixelBlue(p))].blue++; + if ((channel & OpacityChannel) != 0) + histogram[ScaleQuantumToMap(GetPixelOpacity(p))].opacity++; + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + histogram[ScaleQuantumToMap(GetPixelIndex(indexes+x))].index++; + p++; + } + } + /* + Find the histogram boundaries by locating the black/white levels. + */ + black.red=0.0; + white.red=MaxRange(QuantumRange); + if ((channel & RedChannel) != 0) + { + intensity=0.0; + for (i=0; i <= (ssize_t) MaxMap; i++) + { + intensity+=histogram[i].red; + if (intensity > black_point) + break; + } + black.red=(MagickRealType) i; + intensity=0.0; + for (i=(ssize_t) MaxMap; i != 0; i--) + { + intensity+=histogram[i].red; + if (intensity > ((double) image->columns*image->rows-white_point)) + break; + } + white.red=(MagickRealType) i; + } + black.green=0.0; + white.green=MaxRange(QuantumRange); + if ((channel & GreenChannel) != 0) + { + intensity=0.0; + for (i=0; i <= (ssize_t) MaxMap; i++) + { + intensity+=histogram[i].green; + if (intensity > black_point) + break; + } + black.green=(MagickRealType) i; + intensity=0.0; + for (i=(ssize_t) MaxMap; i != 0; i--) + { + intensity+=histogram[i].green; + if (intensity > ((double) image->columns*image->rows-white_point)) + break; + } + white.green=(MagickRealType) i; + } + black.blue=0.0; + white.blue=MaxRange(QuantumRange); + if ((channel & BlueChannel) != 0) + { + intensity=0.0; + for (i=0; i <= (ssize_t) MaxMap; i++) + { + intensity+=histogram[i].blue; + if (intensity > black_point) + break; + } + black.blue=(MagickRealType) i; + intensity=0.0; + for (i=(ssize_t) MaxMap; i != 0; i--) + { + intensity+=histogram[i].blue; + if (intensity > ((double) image->columns*image->rows-white_point)) + break; + } + white.blue=(MagickRealType) i; + } + black.opacity=0.0; + white.opacity=MaxRange(QuantumRange); + if ((channel & OpacityChannel) != 0) + { + intensity=0.0; + for (i=0; i <= (ssize_t) MaxMap; i++) + { + intensity+=histogram[i].opacity; + if (intensity > black_point) + break; + } + black.opacity=(MagickRealType) i; + intensity=0.0; + for (i=(ssize_t) MaxMap; i != 0; i--) + { + intensity+=histogram[i].opacity; + if (intensity > ((double) image->columns*image->rows-white_point)) + break; + } + white.opacity=(MagickRealType) i; + } + black.index=0.0; + white.index=MaxRange(QuantumRange); + if (((channel & IndexChannel) != 0) && (image->colorspace == CMYKColorspace)) + { + intensity=0.0; + for (i=0; i <= (ssize_t) MaxMap; i++) + { + intensity+=histogram[i].index; + if (intensity > black_point) + break; + } + black.index=(MagickRealType) i; + intensity=0.0; + for (i=(ssize_t) MaxMap; i != 0; i--) + { + intensity+=histogram[i].index; + if (intensity > ((double) image->columns*image->rows-white_point)) + break; + } + white.index=(MagickRealType) i; + } + histogram=(MagickPixelPacket *) RelinquishMagickMemory(histogram); + /* + Stretch the histogram to create the stretched image mapping. + */ + (void) memset(stretch_map,0,(MaxMap+1)*sizeof(*stretch_map)); + for (i=0; i <= (ssize_t) MaxMap; i++) + { + if ((channel & RedChannel) != 0) + { + if (i < (ssize_t) black.red) + stretch_map[i].red=(Quantum) 0; + else + if (i > (ssize_t) white.red) + stretch_map[i].red=QuantumRange; + else + if (black.red != white.red) + stretch_map[i].red=ScaleMapToQuantum((MagickRealType) (MaxMap* + (i-black.red)/(white.red-black.red))); + } + if ((channel & GreenChannel) != 0) + { + if (i < (ssize_t) black.green) + stretch_map[i].green=0; + else + if (i > (ssize_t) white.green) + stretch_map[i].green=QuantumRange; + else + if (black.green != white.green) + stretch_map[i].green=ScaleMapToQuantum((MagickRealType) (MaxMap* + (i-black.green)/(white.green-black.green))); + } + if ((channel & BlueChannel) != 0) + { + if (i < (ssize_t) black.blue) + stretch_map[i].blue=0; + else + if (i > (ssize_t) white.blue) + stretch_map[i].blue= QuantumRange; + else + if (black.blue != white.blue) + stretch_map[i].blue=ScaleMapToQuantum((MagickRealType) (MaxMap* + (i-black.blue)/(white.blue-black.blue))); + } + if ((channel & OpacityChannel) != 0) + { + if (i < (ssize_t) black.opacity) + stretch_map[i].opacity=0; + else + if (i > (ssize_t) white.opacity) + stretch_map[i].opacity=QuantumRange; + else + if (black.opacity != white.opacity) + stretch_map[i].opacity=ScaleMapToQuantum((MagickRealType) (MaxMap* + (i-black.opacity)/(white.opacity-black.opacity))); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + if (i < (ssize_t) black.index) + stretch_map[i].index=0; + else + if (i > (ssize_t) white.index) + stretch_map[i].index=QuantumRange; + else + if (black.index != white.index) + stretch_map[i].index=ScaleMapToQuantum((MagickRealType) (MaxMap* + (i-black.index)/(white.index-black.index))); + } + } + /* + Stretch the image. + */ + if (((channel & OpacityChannel) != 0) || (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace))) + image->storage_class=DirectClass; + if (image->storage_class == PseudoClass) + { + /* + Stretch colormap. + */ + for (i=0; i < (ssize_t) image->colors; i++) + { + if ((channel & RedChannel) != 0) + { + if (black.red != white.red) + image->colormap[i].red=stretch_map[ + ScaleQuantumToMap(image->colormap[i].red)].red; + } + if ((channel & GreenChannel) != 0) + { + if (black.green != white.green) + image->colormap[i].green=stretch_map[ + ScaleQuantumToMap(image->colormap[i].green)].green; + } + if ((channel & BlueChannel) != 0) + { + if (black.blue != white.blue) + image->colormap[i].blue=stretch_map[ + ScaleQuantumToMap(image->colormap[i].blue)].blue; + } + if ((channel & OpacityChannel) != 0) + { + if (black.opacity != white.opacity) + image->colormap[i].opacity=stretch_map[ + ScaleQuantumToMap(image->colormap[i].opacity)].opacity; + } + } + } + /* + Stretch image. + */ + status=MagickTrue; + progress=0; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + { + if (black.red != white.red) + SetPixelRed(q,stretch_map[ + ScaleQuantumToMap(GetPixelRed(q))].red); + } + if ((channel & GreenChannel) != 0) + { + if (black.green != white.green) + SetPixelGreen(q,stretch_map[ + ScaleQuantumToMap(GetPixelGreen(q))].green); + } + if ((channel & BlueChannel) != 0) + { + if (black.blue != white.blue) + SetPixelBlue(q,stretch_map[ + ScaleQuantumToMap(GetPixelBlue(q))].blue); + } + if ((channel & OpacityChannel) != 0) + { + if (black.opacity != white.opacity) + SetPixelOpacity(q,stretch_map[ + ScaleQuantumToMap(GetPixelOpacity(q))].opacity); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + if (black.index != white.index) + SetPixelIndex(indexes+x,stretch_map[ + ScaleQuantumToMap(GetPixelIndex(indexes+x))].index); + } + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,ContrastStretchImageTag,progress, + image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + stretch_map=(QuantumPixelPacket *) RelinquishMagickMemory(stretch_map); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E n h a n c e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EnhanceImage() applies a digital filter that improves the quality of a +% noisy image. +% +% The format of the EnhanceImage method is: +% +% Image *EnhanceImage(const Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *EnhanceImage(const Image *image,ExceptionInfo *exception) +{ +#define EnhancePixel(weight) \ + mean=QuantumScale*((double) GetPixelRed(r)+pixel.red)/2.0; \ + distance=QuantumScale*((double) GetPixelRed(r)-pixel.red); \ + distance_squared=(4.0+mean)*distance*distance; \ + mean=QuantumScale*((double) GetPixelGreen(r)+pixel.green)/2.0; \ + distance=QuantumScale*((double) GetPixelGreen(r)-pixel.green); \ + distance_squared+=(7.0-mean)*distance*distance; \ + mean=QuantumScale*((double) GetPixelBlue(r)+pixel.blue)/2.0; \ + distance=QuantumScale*((double) GetPixelBlue(r)-pixel.blue); \ + distance_squared+=(5.0-mean)*distance*distance; \ + mean=QuantumScale*((double) GetPixelOpacity(r)+pixel.opacity)/2.0; \ + distance=QuantumScale*((double) GetPixelOpacity(r)-pixel.opacity); \ + distance_squared+=(5.0-mean)*distance*distance; \ + if (distance_squared < 0.069) \ + { \ + aggregate.red+=(weight)*GetPixelRed(r); \ + aggregate.green+=(weight)*GetPixelGreen(r); \ + aggregate.blue+=(weight)*GetPixelBlue(r); \ + aggregate.opacity+=(weight)*GetPixelOpacity(r); \ + total_weight+=(weight); \ + } \ + r++; +#define EnhanceImageTag "Enhance/Image" + + CacheView + *enhance_view, + *image_view; + + Image + *enhance_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + zero; + + ssize_t + y; + + /* + Initialize enhanced image attributes. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if ((image->columns < 5) || (image->rows < 5)) + return((Image *) NULL); + enhance_image=CloneImage(image,0,0,MagickTrue,exception); + if (enhance_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(enhance_image,DirectClass) == MagickFalse) + { + InheritException(exception,&enhance_image->exception); + enhance_image=DestroyImage(enhance_image); + return((Image *) NULL); + } + /* + Enhance image. + */ + status=MagickTrue; + progress=0; + (void) memset(&zero,0,sizeof(zero)); + image_view=AcquireAuthenticCacheView(image,exception); + enhance_view=AcquireAuthenticCacheView(enhance_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,enhance_image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + /* + Read another scan line. + */ + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,-2,y-2,image->columns+4,5,exception); + q=QueueCacheViewAuthenticPixels(enhance_view,0,y,enhance_image->columns,1, + exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + double + distance, + distance_squared, + mean, + total_weight; + + MagickPixelPacket + aggregate; + + PixelPacket + pixel; + + const PixelPacket + *magick_restrict r; + + /* + Compute weighted average of target pixel color components. + */ + aggregate=zero; + total_weight=0.0; + r=p+2*(image->columns+4)+2; + pixel=(*r); + r=p; + EnhancePixel(5.0); EnhancePixel(8.0); EnhancePixel(10.0); + EnhancePixel(8.0); EnhancePixel(5.0); + r=p+(image->columns+4); + EnhancePixel(8.0); EnhancePixel(20.0); EnhancePixel(40.0); + EnhancePixel(20.0); EnhancePixel(8.0); + r=p+2*(image->columns+4); + EnhancePixel(10.0); EnhancePixel(40.0); EnhancePixel(80.0); + EnhancePixel(40.0); EnhancePixel(10.0); + r=p+3*(image->columns+4); + EnhancePixel(8.0); EnhancePixel(20.0); EnhancePixel(40.0); + EnhancePixel(20.0); EnhancePixel(8.0); + r=p+4*(image->columns+4); + EnhancePixel(5.0); EnhancePixel(8.0); EnhancePixel(10.0); + EnhancePixel(8.0); EnhancePixel(5.0); + if (total_weight > MagickEpsilon) + { + SetPixelRed(q,(aggregate.red+(total_weight/2)-1)/total_weight); + SetPixelGreen(q,(aggregate.green+(total_weight/2)-1)/total_weight); + SetPixelBlue(q,(aggregate.blue+(total_weight/2)-1)/total_weight); + SetPixelOpacity(q,(aggregate.opacity+(total_weight/2)-1)/ + total_weight); + } + p++; + q++; + } + if (SyncCacheViewAuthenticPixels(enhance_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,EnhanceImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + enhance_view=DestroyCacheView(enhance_view); + image_view=DestroyCacheView(image_view); + if (status == MagickFalse) + enhance_image=DestroyImage(enhance_image); + return(enhance_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E q u a l i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EqualizeImage() applies a histogram equalization to the image. +% +% The format of the EqualizeImage method is: +% +% MagickBooleanType EqualizeImage(Image *image) +% MagickBooleanType EqualizeImageChannel(Image *image, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +*/ + +MagickExport MagickBooleanType EqualizeImage(Image *image) +{ + return(EqualizeImageChannel(image,DefaultChannels)); +} + +MagickExport MagickBooleanType EqualizeImageChannel(Image *image, + const ChannelType channel) +{ +#define EqualizeImageTag "Equalize/Image" + + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + black, + *histogram, + intensity, + *map, + white; + + QuantumPixelPacket + *equalize_map; + + ssize_t + i; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=(&image->exception); + +#if defined(MAGICKCORE_OPENCL_SUPPORT) + /* Call OpenCL version */ + status=AccelerateEqualizeImage(image,channel,&image->exception); + if (status != MagickFalse) + return status; +#endif + /* + Allocate and initialize histogram arrays. + */ + equalize_map=(QuantumPixelPacket *) AcquireQuantumMemory(MaxMap+1UL, + sizeof(*equalize_map)); + histogram=(MagickPixelPacket *) AcquireQuantumMemory(MaxMap+1UL, + sizeof(*histogram)); + map=(MagickPixelPacket *) AcquireQuantumMemory(MaxMap+1UL,sizeof(*map)); + if ((equalize_map == (QuantumPixelPacket *) NULL) || + (histogram == (MagickPixelPacket *) NULL) || + (map == (MagickPixelPacket *) NULL)) + { + if (map != (MagickPixelPacket *) NULL) + map=(MagickPixelPacket *) RelinquishMagickMemory(map); + if (histogram != (MagickPixelPacket *) NULL) + histogram=(MagickPixelPacket *) RelinquishMagickMemory(histogram); + if (equalize_map != (QuantumPixelPacket *) NULL) + equalize_map=(QuantumPixelPacket *) RelinquishMagickMemory( + equalize_map); + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + } + /* + Form histogram. + */ + (void) memset(histogram,0,(MaxMap+1)*sizeof(*histogram)); + image_view=AcquireVirtualCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetCacheViewVirtualIndexQueue(image_view); + if ((channel & SyncChannels) != 0) + for (x=0; x < (ssize_t) image->columns; x++) + { + MagickRealType intensity=GetPixelIntensity(image,p); + histogram[ScaleQuantumToMap(ClampToQuantum(intensity))].red++; + p++; + } + else + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + histogram[ScaleQuantumToMap(GetPixelRed(p))].red++; + if ((channel & GreenChannel) != 0) + histogram[ScaleQuantumToMap(GetPixelGreen(p))].green++; + if ((channel & BlueChannel) != 0) + histogram[ScaleQuantumToMap(GetPixelBlue(p))].blue++; + if ((channel & OpacityChannel) != 0) + histogram[ScaleQuantumToMap(GetPixelOpacity(p))].opacity++; + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + histogram[ScaleQuantumToMap(GetPixelIndex(indexes+x))].index++; + p++; + } + } + image_view=DestroyCacheView(image_view); + /* + Integrate the histogram to get the equalization map. + */ + (void) memset(&intensity,0,sizeof(intensity)); + for (i=0; i <= (ssize_t) MaxMap; i++) + { + if ((channel & SyncChannels) != 0) + { + intensity.red+=histogram[i].red; + map[i]=intensity; + continue; + } + if ((channel & RedChannel) != 0) + intensity.red+=histogram[i].red; + if ((channel & GreenChannel) != 0) + intensity.green+=histogram[i].green; + if ((channel & BlueChannel) != 0) + intensity.blue+=histogram[i].blue; + if ((channel & OpacityChannel) != 0) + intensity.opacity+=histogram[i].opacity; + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + intensity.index+=histogram[i].index; + map[i]=intensity; + } + black=map[0]; + white=map[(int) MaxMap]; + (void) memset(equalize_map,0,(MaxMap+1)*sizeof(*equalize_map)); + for (i=0; i <= (ssize_t) MaxMap; i++) + { + if ((channel & SyncChannels) != 0) + { + if (white.red != black.red) + equalize_map[i].red=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].red-black.red))/(white.red-black.red))); + continue; + } + if (((channel & RedChannel) != 0) && (white.red != black.red)) + equalize_map[i].red=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].red-black.red))/(white.red-black.red))); + if (((channel & GreenChannel) != 0) && (white.green != black.green)) + equalize_map[i].green=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].green-black.green))/(white.green-black.green))); + if (((channel & BlueChannel) != 0) && (white.blue != black.blue)) + equalize_map[i].blue=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].blue-black.blue))/(white.blue-black.blue))); + if (((channel & OpacityChannel) != 0) && (white.opacity != black.opacity)) + equalize_map[i].opacity=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].opacity-black.opacity))/(white.opacity-black.opacity))); + if ((((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) && + (white.index != black.index)) + equalize_map[i].index=ScaleMapToQuantum((MagickRealType) ((MaxMap* + (map[i].index-black.index))/(white.index-black.index))); + } + histogram=(MagickPixelPacket *) RelinquishMagickMemory(histogram); + map=(MagickPixelPacket *) RelinquishMagickMemory(map); + if (image->storage_class == PseudoClass) + { + /* + Equalize colormap. + */ + for (i=0; i < (ssize_t) image->colors; i++) + { + if ((channel & SyncChannels) != 0) + { + if (white.red != black.red) + { + image->colormap[i].red=equalize_map[ + ScaleQuantumToMap(image->colormap[i].red)].red; + image->colormap[i].green=equalize_map[ + ScaleQuantumToMap(image->colormap[i].green)].red; + image->colormap[i].blue=equalize_map[ + ScaleQuantumToMap(image->colormap[i].blue)].red; + image->colormap[i].opacity=equalize_map[ + ScaleQuantumToMap(image->colormap[i].opacity)].red; + } + continue; + } + if (((channel & RedChannel) != 0) && (white.red != black.red)) + image->colormap[i].red=equalize_map[ + ScaleQuantumToMap(image->colormap[i].red)].red; + if (((channel & GreenChannel) != 0) && (white.green != black.green)) + image->colormap[i].green=equalize_map[ + ScaleQuantumToMap(image->colormap[i].green)].green; + if (((channel & BlueChannel) != 0) && (white.blue != black.blue)) + image->colormap[i].blue=equalize_map[ + ScaleQuantumToMap(image->colormap[i].blue)].blue; + if (((channel & OpacityChannel) != 0) && + (white.opacity != black.opacity)) + image->colormap[i].opacity=equalize_map[ + ScaleQuantumToMap(image->colormap[i].opacity)].opacity; + } + } + /* + Equalize image. + */ + status=MagickTrue; + progress=0; + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & SyncChannels) != 0) + { + if (white.red != black.red) + { + SetPixelRed(q,equalize_map[ + ScaleQuantumToMap(GetPixelRed(q))].red); + SetPixelGreen(q,equalize_map[ + ScaleQuantumToMap(GetPixelGreen(q))].red); + SetPixelBlue(q,equalize_map[ + ScaleQuantumToMap(GetPixelBlue(q))].red); + SetPixelOpacity(q,equalize_map[ + ScaleQuantumToMap(GetPixelOpacity(q))].red); + if (image->colorspace == CMYKColorspace) + SetPixelIndex(indexes+x,equalize_map[ + ScaleQuantumToMap(GetPixelIndex(indexes+x))].red); + } + q++; + continue; + } + if (((channel & RedChannel) != 0) && (white.red != black.red)) + SetPixelRed(q,equalize_map[ + ScaleQuantumToMap(GetPixelRed(q))].red); + if (((channel & GreenChannel) != 0) && (white.green != black.green)) + SetPixelGreen(q,equalize_map[ + ScaleQuantumToMap(GetPixelGreen(q))].green); + if (((channel & BlueChannel) != 0) && (white.blue != black.blue)) + SetPixelBlue(q,equalize_map[ + ScaleQuantumToMap(GetPixelBlue(q))].blue); + if (((channel & OpacityChannel) != 0) && (white.opacity != black.opacity)) + SetPixelOpacity(q,equalize_map[ + ScaleQuantumToMap(GetPixelOpacity(q))].opacity); + if ((((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) && + (white.index != black.index)) + SetPixelIndex(indexes+x,equalize_map[ + ScaleQuantumToMap(GetPixelIndex(indexes+x))].index); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,EqualizeImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + equalize_map=(QuantumPixelPacket *) RelinquishMagickMemory(equalize_map); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G a m m a I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GammaImage() gamma-corrects a particular image channel. The same +% image viewed on different devices will have perceptual differences in the +% way the image's intensities are represented on the screen. Specify +% individual gamma levels for the red, green, and blue channels, or adjust +% all three with the gamma parameter. Values typically range from 0.8 to 2.3. +% +% You can also reduce the influence of a particular channel with a gamma +% value of 0. +% +% The format of the GammaImage method is: +% +% MagickBooleanType GammaImage(Image *image,const char *level) +% MagickBooleanType GammaImageChannel(Image *image, +% const ChannelType channel,const double gamma) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o level: the image gamma as a string (e.g. 1.6,1.2,1.0). +% +% o gamma: the image gamma. +% +*/ + +static inline double gamma_pow(const double value,const double gamma) +{ + return(value < 0.0 ? value : pow(value,gamma)); +} + +MagickExport MagickBooleanType GammaImage(Image *image,const char *level) +{ + GeometryInfo + geometry_info; + + MagickPixelPacket + gamma; + + MagickStatusType + flags, + status; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (level == (char *) NULL) + return(MagickFalse); + gamma.red=0.0; + flags=ParseGeometry(level,&geometry_info); + if ((flags & RhoValue) != 0) + gamma.red=geometry_info.rho; + gamma.green=gamma.red; + if ((flags & SigmaValue) != 0) + gamma.green=geometry_info.sigma; + gamma.blue=gamma.red; + if ((flags & XiValue) != 0) + gamma.blue=geometry_info.xi; + if ((gamma.red == 1.0) && (gamma.green == 1.0) && (gamma.blue == 1.0)) + return(MagickTrue); + if ((gamma.red == gamma.green) && (gamma.green == gamma.blue)) + status=GammaImageChannel(image,(ChannelType) (RedChannel | GreenChannel | + BlueChannel),(double) gamma.red); + else + { + status=GammaImageChannel(image,RedChannel,(double) gamma.red); + status&=GammaImageChannel(image,GreenChannel,(double) gamma.green); + status&=GammaImageChannel(image,BlueChannel,(double) gamma.blue); + } + return(status != 0 ? MagickTrue : MagickFalse); +} + +MagickExport MagickBooleanType GammaImageChannel(Image *image, + const ChannelType channel,const double gamma) +{ +#define GammaImageTag "Gamma/Image" + + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + Quantum + *gamma_map; + + ssize_t + i; + + ssize_t + y; + + /* + Allocate and initialize gamma maps. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=(&image->exception); + if (gamma == 1.0) + return(MagickTrue); + gamma_map=(Quantum *) AcquireQuantumMemory(MaxMap+1UL,sizeof(*gamma_map)); + if (gamma_map == (Quantum *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + (void) memset(gamma_map,0,(MaxMap+1)*sizeof(*gamma_map)); + if (gamma != 0.0) + for (i=0; i <= (ssize_t) MaxMap; i++) + gamma_map[i]=ClampToQuantum((MagickRealType) ScaleMapToQuantum(( + MagickRealType) (MaxMap*pow((double) i/MaxMap, + PerceptibleReciprocal(gamma))))); + if (image->storage_class == PseudoClass) + { + /* + Gamma-correct colormap. + */ + for (i=0; i < (ssize_t) image->colors; i++) + { +#if !defined(MAGICKCORE_HDRI_SUPPORT) + if ((channel & RedChannel) != 0) + image->colormap[i].red=gamma_map[ScaleQuantumToMap( + image->colormap[i].red)]; + if ((channel & GreenChannel) != 0) + image->colormap[i].green=gamma_map[ScaleQuantumToMap( + image->colormap[i].green)]; + if ((channel & BlueChannel) != 0) + image->colormap[i].blue=gamma_map[ScaleQuantumToMap( + image->colormap[i].blue)]; + if ((channel & OpacityChannel) != 0) + { + if (image->matte == MagickFalse) + image->colormap[i].opacity=gamma_map[ScaleQuantumToMap( + image->colormap[i].opacity)]; + else + image->colormap[i].opacity=QuantumRange-gamma_map[ + ScaleQuantumToMap((Quantum) (QuantumRange- + image->colormap[i].opacity))]; + } +#else + if ((channel & RedChannel) != 0) + image->colormap[i].red=QuantumRange*gamma_pow(QuantumScale* + image->colormap[i].red,PerceptibleReciprocal(gamma)); + if ((channel & GreenChannel) != 0) + image->colormap[i].green=QuantumRange*gamma_pow(QuantumScale* + image->colormap[i].green,PerceptibleReciprocal(gamma)); + if ((channel & BlueChannel) != 0) + image->colormap[i].blue=QuantumRange*gamma_pow(QuantumScale* + image->colormap[i].blue,PerceptibleReciprocal(gamma)); + if ((channel & OpacityChannel) != 0) + { + if (image->matte == MagickFalse) + image->colormap[i].opacity=QuantumRange*gamma_pow(QuantumScale* + image->colormap[i].opacity,PerceptibleReciprocal(gamma)); + else + image->colormap[i].opacity=QuantumRange-QuantumRange*gamma_pow( + QuantumScale*(QuantumRange-image->colormap[i].opacity),1.0/ + gamma); + } +#endif + } + } + /* + Gamma-correct image. + */ + status=MagickTrue; + progress=0; + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { +#if !defined(MAGICKCORE_HDRI_SUPPORT) + if ((channel & SyncChannels) != 0) + { + SetPixelRed(q,gamma_map[ScaleQuantumToMap(GetPixelRed(q))]); + SetPixelGreen(q,gamma_map[ScaleQuantumToMap(GetPixelGreen(q))]); + SetPixelBlue(q,gamma_map[ScaleQuantumToMap(GetPixelBlue(q))]); + } + else + { + if ((channel & RedChannel) != 0) + SetPixelRed(q,gamma_map[ScaleQuantumToMap(GetPixelRed(q))]); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,gamma_map[ScaleQuantumToMap(GetPixelGreen(q))]); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,gamma_map[ScaleQuantumToMap(GetPixelBlue(q))]); + if ((channel & OpacityChannel) != 0) + { + if (image->matte == MagickFalse) + SetPixelOpacity(q,gamma_map[ScaleQuantumToMap( + GetPixelOpacity(q))]); + else + SetPixelAlpha(q,gamma_map[ScaleQuantumToMap((Quantum) + GetPixelAlpha(q))]); + } + } +#else + if ((channel & SyncChannels) != 0) + { + SetPixelRed(q,QuantumRange*gamma_pow(QuantumScale*GetPixelRed(q), + PerceptibleReciprocal(gamma))); + SetPixelGreen(q,QuantumRange*gamma_pow(QuantumScale*GetPixelGreen(q), + PerceptibleReciprocal(gamma))); + SetPixelBlue(q,QuantumRange*gamma_pow(QuantumScale*GetPixelBlue(q), + PerceptibleReciprocal(gamma))); + } + else + { + if ((channel & RedChannel) != 0) + SetPixelRed(q,QuantumRange*gamma_pow(QuantumScale*GetPixelRed(q), + PerceptibleReciprocal(gamma))); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,QuantumRange*gamma_pow(QuantumScale* + GetPixelGreen(q),PerceptibleReciprocal(gamma))); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,QuantumRange*gamma_pow(QuantumScale*GetPixelBlue(q), + PerceptibleReciprocal(gamma))); + if ((channel & OpacityChannel) != 0) + { + if (image->matte == MagickFalse) + SetPixelOpacity(q,QuantumRange*gamma_pow(QuantumScale* + GetPixelOpacity(q),PerceptibleReciprocal(gamma))); + else + SetPixelAlpha(q,QuantumRange*gamma_pow(QuantumScale* + GetPixelAlpha(q),PerceptibleReciprocal(gamma))); + } + } +#endif + q++; + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,gamma_map[ScaleQuantumToMap( + GetPixelIndex(indexes+x))]); + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,GammaImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + gamma_map=(Quantum *) RelinquishMagickMemory(gamma_map); + if (image->gamma != 0.0) + image->gamma*=gamma; + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G r a y s c a l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GrayscaleImage() converts the colors in the reference image to gray. +% +% The format of the GrayscaleImageChannel method is: +% +% MagickBooleanType GrayscaleImage(Image *image, +% const PixelIntensityMethod method) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +*/ +MagickExport MagickBooleanType GrayscaleImage(Image *image, + const PixelIntensityMethod method) +{ +#define GrayscaleImageTag "Grayscale/Image" + + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->storage_class == PseudoClass) + { + if (SyncImage(image) == MagickFalse) + return(MagickFalse); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + } + + /* + Grayscale image. + */ + + /* call opencl version */ +#if defined(MAGICKCORE_OPENCL_SUPPORT) + if (AccelerateGrayscaleImage(image,method,&image->exception) != MagickFalse) + { + image->intensity=method; + image->type=GrayscaleType; + if ((method == Rec601LuminancePixelIntensityMethod) || + (method == Rec709LuminancePixelIntensityMethod)) + return(SetImageColorspace(image,LinearGRAYColorspace)); + return(SetImageColorspace(image,GRAYColorspace)); + } +#endif + status=MagickTrue; + progress=0; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + MagickRealType + blue, + green, + intensity, + red; + + red=(MagickRealType) q->red; + green=(MagickRealType) q->green; + blue=(MagickRealType) q->blue; + intensity=0.0; + switch (method) + { + case AveragePixelIntensityMethod: + { + intensity=(red+green+blue)/3.0; + break; + } + case BrightnessPixelIntensityMethod: + { + intensity=MagickMax(MagickMax(red,green),blue); + break; + } + case LightnessPixelIntensityMethod: + { + intensity=(MagickMin(MagickMin(red,green),blue)+ + MagickMax(MagickMax(red,green),blue))/2.0; + break; + } + case MSPixelIntensityMethod: + { + intensity=(MagickRealType) (((double) red*red+green*green+ + blue*blue)/(3.0*QuantumRange)); + break; + } + case Rec601LumaPixelIntensityMethod: + { + if (image->colorspace == RGBColorspace) + { + red=EncodePixelGamma(red); + green=EncodePixelGamma(green); + blue=EncodePixelGamma(blue); + } + intensity=0.298839*red+0.586811*green+0.114350*blue; + break; + } + case Rec601LuminancePixelIntensityMethod: + { + if (image->colorspace == sRGBColorspace) + { + red=DecodePixelGamma(red); + green=DecodePixelGamma(green); + blue=DecodePixelGamma(blue); + } + intensity=0.298839*red+0.586811*green+0.114350*blue; + break; + } + case Rec709LumaPixelIntensityMethod: + default: + { + if (image->colorspace == RGBColorspace) + { + red=EncodePixelGamma(red); + green=EncodePixelGamma(green); + blue=EncodePixelGamma(blue); + } + intensity=0.212656*red+0.715158*green+0.072186*blue; + break; + } + case Rec709LuminancePixelIntensityMethod: + { + if (image->colorspace == sRGBColorspace) + { + red=DecodePixelGamma(red); + green=DecodePixelGamma(green); + blue=DecodePixelGamma(blue); + } + intensity=0.212656*red+0.715158*green+0.072186*blue; + break; + } + case RMSPixelIntensityMethod: + { + intensity=(MagickRealType) (sqrt((double) red*red+green*green+ + blue*blue)/sqrt(3.0)); + break; + } + } + SetPixelGray(q,ClampToQuantum(intensity)); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,GrayscaleImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + image->intensity=method; + image->type=GrayscaleType; + if ((method == Rec601LuminancePixelIntensityMethod) || + (method == Rec709LuminancePixelIntensityMethod)) + return(SetImageColorspace(image,LinearGRAYColorspace)); + return(SetImageColorspace(image,GRAYColorspace)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H a l d C l u t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% HaldClutImage() applies a Hald color lookup table to the image. A Hald +% color lookup table is a 3-dimensional color cube mapped to 2 dimensions. +% Create it with the HALD coder. You can apply any color transformation to +% the Hald image and then use this method to apply the transform to the +% image. +% +% The format of the HaldClutImage method is: +% +% MagickBooleanType HaldClutImage(Image *image,Image *hald_image) +% MagickBooleanType HaldClutImageChannel(Image *image, +% const ChannelType channel,Image *hald_image) +% +% A description of each parameter follows: +% +% o image: the image, which is replaced by indexed CLUT values +% +% o hald_image: the color lookup table image for replacement color values. +% +% o channel: the channel. +% +*/ + +MagickExport MagickBooleanType HaldClutImage(Image *image, + const Image *hald_image) +{ + return(HaldClutImageChannel(image,DefaultChannels,hald_image)); +} + +MagickExport MagickBooleanType HaldClutImageChannel(Image *image, + const ChannelType channel,const Image *hald_image) +{ +#define HaldClutImageTag "Clut/Image" + + typedef struct _HaldInfo + { + MagickRealType + x, + y, + z; + } HaldInfo; + + CacheView + *hald_view, + *image_view; + + double + width; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickPixelPacket + zero; + + size_t + cube_size, + length, + level; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(hald_image != (Image *) NULL); + assert(hald_image->signature == MagickCoreSignature); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + if (IsGrayColorspace(image->colorspace) != MagickFalse) + (void) SetImageColorspace(image,sRGBColorspace); + if (image->matte == MagickFalse) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + /* + Hald clut image. + */ + status=MagickTrue; + progress=0; + length=(size_t) MagickMin((MagickRealType) hald_image->columns, + (MagickRealType) hald_image->rows); + for (level=2; (level*level*level) < length; level++) ; + level*=level; + cube_size=level*level; + width=(double) hald_image->columns; + GetMagickPixelPacket(hald_image,&zero); + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); + hald_view=AcquireAuthenticCacheView(hald_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,hald_image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + double + area, + offset; + + HaldInfo + point; + + MagickPixelPacket + pixel, + pixel1, + pixel2, + pixel3, + pixel4; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(hald_view); + pixel=zero; + pixel1=zero; + pixel2=zero; + pixel3=zero; + pixel4=zero; + for (x=0; x < (ssize_t) image->columns; x++) + { + point.x=QuantumScale*(level-1.0)*GetPixelRed(q); + point.y=QuantumScale*(level-1.0)*GetPixelGreen(q); + point.z=QuantumScale*(level-1.0)*GetPixelBlue(q); + offset=(double) (point.x+level*floor(point.y)+cube_size*floor(point.z)); + point.x-=floor(point.x); + point.y-=floor(point.y); + point.z-=floor(point.z); + status=InterpolateMagickPixelPacket(image,hald_view, + UndefinedInterpolatePixel,fmod(offset,width),floor(offset/width), + &pixel1,exception); + if (status == MagickFalse) + break; + status=InterpolateMagickPixelPacket(image,hald_view, + UndefinedInterpolatePixel,fmod(offset+level,width),floor((offset+level)/ + width),&pixel2,exception); + if (status == MagickFalse) + break; + area=point.y; + if (hald_image->interpolate == NearestNeighborInterpolatePixel) + area=(point.y < 0.5) ? 0.0 : 1.0; + MagickPixelCompositeAreaBlend(&pixel1,pixel1.opacity,&pixel2, + pixel2.opacity,area,&pixel3); + offset+=cube_size; + status=InterpolateMagickPixelPacket(image,hald_view, + UndefinedInterpolatePixel,fmod(offset,width),floor(offset/width), + &pixel1,exception); + if (status == MagickFalse) + break; + status=InterpolateMagickPixelPacket(image,hald_view, + UndefinedInterpolatePixel,fmod(offset+level,width),floor((offset+level)/ + width),&pixel2,exception); + if (status == MagickFalse) + break; + MagickPixelCompositeAreaBlend(&pixel1,pixel1.opacity,&pixel2, + pixel2.opacity,area,&pixel4); + area=point.z; + if (hald_image->interpolate == NearestNeighborInterpolatePixel) + area=(point.z < 0.5)? 0.0 : 1.0; + MagickPixelCompositeAreaBlend(&pixel3,pixel3.opacity,&pixel4, + pixel4.opacity,area,&pixel); + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(pixel.red)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(pixel.green)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(pixel.blue)); + if (((channel & OpacityChannel) != 0) && (image->matte != MagickFalse)) + SetPixelOpacity(q,ClampToQuantum(pixel.opacity)); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(indexes+x,ClampToQuantum(pixel.index)); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,HaldClutImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + hald_view=DestroyCacheView(hald_view); + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L e v e l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% LevelImage() adjusts the levels of a particular image channel by +% scaling the colors falling between specified white and black points to +% the full available quantum range. +% +% The parameters provided represent the black, and white points. The black +% point specifies the darkest color in the image. Colors darker than the +% black point are set to zero. White point specifies the lightest color in +% the image. Colors brighter than the white point are set to the maximum +% quantum value. +% +% If a '!' flag is given, map black and white colors to the given levels +% rather than mapping those levels to black and white. See +% LevelizeImageChannel() and LevelizeImageChannel(), below. +% +% Gamma specifies a gamma correction to apply to the image. +% +% The format of the LevelImage method is: +% +% MagickBooleanType LevelImage(Image *image,const char *levels) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o levels: Specify the levels where the black and white points have the +% range of 0-QuantumRange, and gamma has the range 0-10 (e.g. 10x90%+2). +% A '!' flag inverts the re-mapping. +% +*/ + +MagickExport MagickBooleanType LevelImage(Image *image,const char *levels) +{ + double + black_point = 0.0, + gamma = 1.0, + white_point = (double) QuantumRange; + + GeometryInfo + geometry_info; + + MagickBooleanType + status; + + MagickStatusType + flags; + + /* + Parse levels. + */ + if (levels == (char *) NULL) + return(MagickFalse); + flags=ParseGeometry(levels,&geometry_info); + if ((flags & RhoValue) != 0) + black_point=geometry_info.rho; + if ((flags & SigmaValue) != 0) + white_point=geometry_info.sigma; + if ((flags & XiValue) != 0) + gamma=geometry_info.xi; + if ((flags & PercentValue) != 0) + { + black_point*=(double) image->columns*image->rows/100.0; + white_point*=(double) image->columns*image->rows/100.0; + } + if ((flags & SigmaValue) == 0) + white_point=(double) QuantumRange-black_point; + if ((flags & AspectValue ) == 0) + status=LevelImageChannel(image,DefaultChannels,black_point,white_point, + gamma); + else + status=LevelizeImage(image,black_point,white_point,gamma); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L e v e l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% LevelImage() applies the normal level operation to the image, spreading +% out the values between the black and white points over the entire range of +% values. Gamma correction is also applied after the values has been mapped. +% +% It is typically used to improve image contrast, or to provide a controlled +% linear threshold for the image. If the black and white points are set to +% the minimum and maximum values found in the image, the image can be +% normalized. or by swapping black and white values, negate the image. +% +% The format of the LevelImage method is: +% +% MagickBooleanType LevelImage(Image *image,const double black_point, +% const double white_point,const double gamma) +% MagickBooleanType LevelImageChannel(Image *image, +% const ChannelType channel,const double black_point, +% const double white_point,const double gamma) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o black_point: The level which is to be mapped to zero (black) +% +% o white_point: The level which is to be mapped to QuantumRange (white) +% +% o gamma: adjust gamma by this factor before mapping values. +% use 1.0 for purely linear stretching of image color values +% +*/ + +static inline double LevelPixel(const double black_point, + const double white_point,const double gamma,const MagickRealType pixel) +{ + double + level_pixel, + scale; + + scale=PerceptibleReciprocal(white_point-black_point); + level_pixel=QuantumRange*gamma_pow(scale*((double) pixel-black_point), + PerceptibleReciprocal(gamma)); + return(level_pixel); +} + +MagickExport MagickBooleanType LevelImageChannel(Image *image, + const ChannelType channel,const double black_point,const double white_point, + const double gamma) +{ +#define LevelImageTag "Level/Image" + + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + i; + + ssize_t + y; + + /* + Allocate and initialize levels map. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->storage_class == PseudoClass) + for (i=0; i < (ssize_t) image->colors; i++) + { + /* + Level colormap. + */ + if ((channel & RedChannel) != 0) + image->colormap[i].red=(Quantum) ClampToQuantum(LevelPixel(black_point, + white_point,gamma,(MagickRealType) image->colormap[i].red)); + if ((channel & GreenChannel) != 0) + image->colormap[i].green=(Quantum) ClampToQuantum(LevelPixel( + black_point,white_point,gamma,(MagickRealType) + image->colormap[i].green)); + if ((channel & BlueChannel) != 0) + image->colormap[i].blue=(Quantum) ClampToQuantum(LevelPixel(black_point, + white_point,gamma,(MagickRealType) image->colormap[i].blue)); + if ((channel & OpacityChannel) != 0) + image->colormap[i].opacity=(Quantum) (QuantumRange-(Quantum) + ClampToQuantum(LevelPixel(black_point,white_point,gamma, + (MagickRealType) (QuantumRange-image->colormap[i].opacity)))); + } + /* + Level image. + */ + status=MagickTrue; + progress=0; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(LevelPixel(black_point,white_point,gamma, + (MagickRealType) GetPixelRed(q)))); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(LevelPixel(black_point,white_point,gamma, + (MagickRealType) GetPixelGreen(q)))); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(LevelPixel(black_point,white_point,gamma, + (MagickRealType) GetPixelBlue(q)))); + if (((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + SetPixelAlpha(q,ClampToQuantum(LevelPixel(black_point,white_point,gamma, + (MagickRealType) GetPixelAlpha(q)))); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(indexes+x,ClampToQuantum(LevelPixel(black_point, + white_point,gamma,(MagickRealType) GetPixelIndex(indexes+x)))); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,LevelImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + (void) ClampImage(image); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L e v e l i z e I m a g e C h a n n e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% LevelizeImageChannel() applies the reversed LevelImage() operation to just +% the specific channels specified. It compresses the full range of color +% values, so that they lie between the given black and white points. Gamma is +% applied before the values are mapped. +% +% LevelizeImageChannel() can be called with by using a +level command line +% API option, or using a '!' on a -level or LevelImage() geometry string. +% +% It can be used for example de-contrast a greyscale image to the exact +% levels specified. Or by using specific levels for each channel of an image +% you can convert a gray-scale image to any linear color gradient, according +% to those levels. +% +% The format of the LevelizeImageChannel method is: +% +% MagickBooleanType LevelizeImageChannel(Image *image, +% const ChannelType channel,const char *levels) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o black_point: The level to map zero (black) to. +% +% o white_point: The level to map QuantumRange (white) to. +% +% o gamma: adjust gamma by this factor before mapping values. +% +*/ + +MagickExport MagickBooleanType LevelizeImage(Image *image, + const double black_point,const double white_point,const double gamma) +{ + MagickBooleanType + status; + + status=LevelizeImageChannel(image,DefaultChannels,black_point,white_point, + gamma); + return(status); +} + +MagickExport MagickBooleanType LevelizeImageChannel(Image *image, + const ChannelType channel,const double black_point,const double white_point, + const double gamma) +{ +#define LevelizeImageTag "Levelize/Image" +#define LevelizeValue(x) ClampToQuantum(((MagickRealType) gamma_pow((double) \ + (QuantumScale*(x)),gamma))*(white_point-black_point)+black_point) + + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + i; + + ssize_t + y; + + /* + Allocate and initialize levels map. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->storage_class == PseudoClass) + for (i=0; i < (ssize_t) image->colors; i++) + { + /* + Level colormap. + */ + if ((channel & RedChannel) != 0) + image->colormap[i].red=LevelizeValue(image->colormap[i].red); + if ((channel & GreenChannel) != 0) + image->colormap[i].green=LevelizeValue(image->colormap[i].green); + if ((channel & BlueChannel) != 0) + image->colormap[i].blue=LevelizeValue(image->colormap[i].blue); + if ((channel & OpacityChannel) != 0) + image->colormap[i].opacity=(Quantum) (QuantumRange-LevelizeValue( + QuantumRange-image->colormap[i].opacity)); + } + /* + Level image. + */ + status=MagickTrue; + progress=0; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + SetPixelRed(q,LevelizeValue(GetPixelRed(q))); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,LevelizeValue(GetPixelGreen(q))); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,LevelizeValue(GetPixelBlue(q))); + if (((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + SetPixelAlpha(q,LevelizeValue(GetPixelAlpha(q))); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(indexes+x,LevelizeValue(GetPixelIndex(indexes+x))); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,LevelizeImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L e v e l I m a g e C o l o r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% LevelImageColor() maps the given color to "black" and "white" values, +% linearly spreading out the colors, and level values on a channel by channel +% bases, as per LevelImage(). The given colors allows you to specify +% different level ranges for each of the color channels separately. +% +% If the boolean 'invert' is set true the image values will modifyed in the +% reverse direction. That is any existing "black" and "white" colors in the +% image will become the color values given, with all other values compressed +% appropriatally. This effectivally maps a greyscale gradient into the given +% color gradient. +% +% The format of the LevelColorsImageChannel method is: +% +% MagickBooleanType LevelColorsImage(Image *image, +% const MagickPixelPacket *black_color, +% const MagickPixelPacket *white_color,const MagickBooleanType invert) +% MagickBooleanType LevelColorsImageChannel(Image *image, +% const ChannelType channel,const MagickPixelPacket *black_color, +% const MagickPixelPacket *white_color,const MagickBooleanType invert) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o black_color: The color to map black to/from +% +% o white_point: The color to map white to/from +% +% o invert: if true map the colors (levelize), rather than from (level) +% +*/ + +MagickExport MagickBooleanType LevelColorsImage(Image *image, + const MagickPixelPacket *black_color,const MagickPixelPacket *white_color, + const MagickBooleanType invert) +{ + MagickBooleanType + status; + + status=LevelColorsImageChannel(image,DefaultChannels,black_color,white_color, + invert); + return(status); +} + +MagickExport MagickBooleanType LevelColorsImageChannel(Image *image, + const ChannelType channel,const MagickPixelPacket *black_color, + const MagickPixelPacket *white_color,const MagickBooleanType invert) +{ + MagickStatusType + status; + + /* + Allocate and initialize levels map. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((IsGrayColorspace(image->colorspace) != MagickFalse) && + ((IsGrayColorspace(black_color->colorspace) != MagickFalse) || + (IsGrayColorspace(white_color->colorspace) != MagickFalse))) + (void) SetImageColorspace(image,sRGBColorspace); + status=MagickTrue; + if (invert == MagickFalse) + { + if ((channel & RedChannel) != 0) + status&=LevelImageChannel(image,RedChannel,black_color->red, + white_color->red,(double) 1.0); + if ((channel & GreenChannel) != 0) + status&=LevelImageChannel(image,GreenChannel,black_color->green, + white_color->green,(double) 1.0); + if ((channel & BlueChannel) != 0) + status&=LevelImageChannel(image,BlueChannel,black_color->blue, + white_color->blue,(double) 1.0); + if (((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + status&=LevelImageChannel(image,OpacityChannel,black_color->opacity, + white_color->opacity,(double) 1.0); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + status&=LevelImageChannel(image,IndexChannel,black_color->index, + white_color->index,(double) 1.0); + } + else + { + if ((channel & RedChannel) != 0) + status&=LevelizeImageChannel(image,RedChannel,black_color->red, + white_color->red,(double) 1.0); + if ((channel & GreenChannel) != 0) + status&=LevelizeImageChannel(image,GreenChannel,black_color->green, + white_color->green,(double) 1.0); + if ((channel & BlueChannel) != 0) + status&=LevelizeImageChannel(image,BlueChannel,black_color->blue, + white_color->blue,(double) 1.0); + if (((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + status&=LevelizeImageChannel(image,OpacityChannel,black_color->opacity, + white_color->opacity,(double) 1.0); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + status&=LevelizeImageChannel(image,IndexChannel,black_color->index, + white_color->index,(double) 1.0); + } + return(status == 0 ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L i n e a r S t r e t c h I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% LinearStretchImage() discards any pixels below the black point and above +% the white point and levels the remaining pixels. +% +% The format of the LinearStretchImage method is: +% +% MagickBooleanType LinearStretchImage(Image *image, +% const double black_point,const double white_point) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o black_point: the black point. +% +% o white_point: the white point. +% +*/ +MagickExport MagickBooleanType LinearStretchImage(Image *image, + const double black_point,const double white_point) +{ +#define LinearStretchImageTag "LinearStretch/Image" + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickRealType + *histogram, + intensity; + + ssize_t + black, + white, + y; + + /* + Allocate histogram and linear map. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + exception=(&image->exception); + histogram=(MagickRealType *) AcquireQuantumMemory(MaxMap+1UL, + sizeof(*histogram)); + if (histogram == (MagickRealType *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + /* + Form histogram. + */ + (void) memset(histogram,0,(MaxMap+1)*sizeof(*histogram)); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=(ssize_t) image->columns-1; x >= 0; x--) + { + histogram[ScaleQuantumToMap(ClampToQuantum(GetPixelIntensity(image,p)))]++; + p++; + } + } + /* + Find the histogram boundaries by locating the black and white point levels. + */ + intensity=0.0; + for (black=0; black < (ssize_t) MaxMap; black++) + { + intensity+=histogram[black]; + if (intensity >= black_point) + break; + } + intensity=0.0; + for (white=(ssize_t) MaxMap; white != 0; white--) + { + intensity+=histogram[white]; + if (intensity >= white_point) + break; + } + histogram=(MagickRealType *) RelinquishMagickMemory(histogram); + status=LevelImageChannel(image,DefaultChannels,(double) + ScaleMapToQuantum(black),(double) ScaleMapToQuantum(white),1.0); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M o d u l a t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ModulateImage() lets you control the brightness, saturation, and hue +% of an image. Modulate represents the brightness, saturation, and hue +% as one parameter (e.g. 90,150,100). If the image colorspace is HSL, the +% modulation is lightness, saturation, and hue. For HWB, use blackness, +% whiteness, and hue. And for HCL, use chrome, luma, and hue. +% +% The format of the ModulateImage method is: +% +% MagickBooleanType ModulateImage(Image *image,const char *modulate) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o modulate: Define the percent change in brightness, saturation, and +% hue. +% +*/ + +static inline void ModulateHCL(const double percent_hue, + const double percent_chroma,const double percent_luma,Quantum *red, + Quantum *green,Quantum *blue) +{ + double + hue, + luma, + chroma; + + /* + Increase or decrease color luma, chroma, or hue. + */ + ConvertRGBToHCL(*red,*green,*blue,&hue,&chroma,&luma); + hue+=fmod((percent_hue-100.0),200.0)/200.0; + chroma*=0.01*percent_chroma; + luma*=0.01*percent_luma; + ConvertHCLToRGB(hue,chroma,luma,red,green,blue); +} + +static inline void ModulateHCLp(const double percent_hue, + const double percent_chroma,const double percent_luma,Quantum *red, + Quantum *green,Quantum *blue) +{ + double + hue, + luma, + chroma; + + /* + Increase or decrease color luma, chroma, or hue. + */ + ConvertRGBToHCLp(*red,*green,*blue,&hue,&chroma,&luma); + hue+=fmod((percent_hue-100.0),200.0)/200.0; + chroma*=0.01*percent_chroma; + luma*=0.01*percent_luma; + ConvertHCLpToRGB(hue,chroma,luma,red,green,blue); +} + +static inline void ModulateHSB(const double percent_hue, + const double percent_saturation,const double percent_brightness,Quantum *red, + Quantum *green,Quantum *blue) +{ + double + brightness, + hue, + saturation; + + /* + Increase or decrease color brightness, saturation, or hue. + */ + ConvertRGBToHSB(*red,*green,*blue,&hue,&saturation,&brightness); + hue+=fmod((percent_hue-100.0),200.0)/200.0; + saturation*=0.01*percent_saturation; + brightness*=0.01*percent_brightness; + ConvertHSBToRGB(hue,saturation,brightness,red,green,blue); +} + +static inline void ModulateHSI(const double percent_hue, + const double percent_saturation,const double percent_intensity,Quantum *red, + Quantum *green,Quantum *blue) +{ + double + intensity, + hue, + saturation; + + /* + Increase or decrease color intensity, saturation, or hue. + */ + ConvertRGBToHSI(*red,*green,*blue,&hue,&saturation,&intensity); + hue+=fmod((percent_hue-100.0),200.0)/200.0; + saturation*=0.01*percent_saturation; + intensity*=0.01*percent_intensity; + ConvertHSIToRGB(hue,saturation,intensity,red,green,blue); +} + +static inline void ModulateHSL(const double percent_hue, + const double percent_saturation,const double percent_lightness,Quantum *red, + Quantum *green,Quantum *blue) +{ + double + hue, + lightness, + saturation; + + /* + Increase or decrease color lightness, saturation, or hue. + */ + ConvertRGBToHSL(*red,*green,*blue,&hue,&saturation,&lightness); + hue+=fmod((percent_hue-100.0),200.0)/200.0; + saturation*=0.01*percent_saturation; + lightness*=0.01*percent_lightness; + ConvertHSLToRGB(hue,saturation,lightness,red,green,blue); +} + +static inline void ModulateHSV(const double percent_hue, + const double percent_saturation,const double percent_value,Quantum *red, + Quantum *green,Quantum *blue) +{ + double + hue, + saturation, + value; + + /* + Increase or decrease color value, saturation, or hue. + */ + ConvertRGBToHSV(*red,*green,*blue,&hue,&saturation,&value); + hue+=fmod((percent_hue-100.0),200.0)/200.0; + saturation*=0.01*percent_saturation; + value*=0.01*percent_value; + ConvertHSVToRGB(hue,saturation,value,red,green,blue); +} + +static inline void ModulateHWB(const double percent_hue, + const double percent_whiteness,const double percent_blackness,Quantum *red, + Quantum *green,Quantum *blue) +{ + double + blackness, + hue, + whiteness; + + /* + Increase or decrease color blackness, whiteness, or hue. + */ + ConvertRGBToHWB(*red,*green,*blue,&hue,&whiteness,&blackness); + hue+=fmod((percent_hue-100.0),200.0)/200.0; + blackness*=0.01*percent_blackness; + whiteness*=0.01*percent_whiteness; + ConvertHWBToRGB(hue,whiteness,blackness,red,green,blue); +} + +static inline void ModulateLCHab(const double percent_luma, + const double percent_chroma,const double percent_hue,Quantum *red, + Quantum *green,Quantum *blue) +{ + double + hue, + luma, + chroma; + + /* + Increase or decrease color luma, chroma, or hue. + */ + ConvertRGBToLCHab(*red,*green,*blue,&luma,&chroma,&hue); + luma*=0.01*percent_luma; + chroma*=0.01*percent_chroma; + hue+=fmod((percent_hue-100.0),200.0)/200.0; + ConvertLCHabToRGB(luma,chroma,hue,red,green,blue); +} + +static inline void ModulateLCHuv(const double percent_luma, + const double percent_chroma,const double percent_hue,Quantum *red, + Quantum *green,Quantum *blue) +{ + double + hue, + luma, + chroma; + + /* + Increase or decrease color luma, chroma, or hue. + */ + ConvertRGBToLCHuv(*red,*green,*blue,&luma,&chroma,&hue); + luma*=0.01*percent_luma; + chroma*=0.01*percent_chroma; + hue+=fmod((percent_hue-100.0),200.0)/200.0; + ConvertLCHuvToRGB(luma,chroma,hue,red,green,blue); +} + +MagickExport MagickBooleanType ModulateImage(Image *image,const char *modulate) +{ +#define ModulateImageTag "Modulate/Image" + + CacheView + *image_view; + + ColorspaceType + colorspace; + + const char + *artifact; + + double + percent_brightness = 100.0, + percent_hue = 100.0, + percent_saturation = 100.0; + + ExceptionInfo + *exception; + + GeometryInfo + geometry_info; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickStatusType + flags; + + ssize_t + i; + + ssize_t + y; + + /* + Initialize modulate table. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (modulate == (char *) NULL) + return(MagickFalse); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) SetImageColorspace(image,sRGBColorspace); + flags=ParseGeometry(modulate,&geometry_info); + if ((flags & RhoValue) != 0) + percent_brightness=geometry_info.rho; + if ((flags & SigmaValue) != 0) + percent_saturation=geometry_info.sigma; + if ((flags & XiValue) != 0) + percent_hue=geometry_info.xi; + colorspace=UndefinedColorspace; + artifact=GetImageArtifact(image,"modulate:colorspace"); + if (artifact != (const char *) NULL) + colorspace=(ColorspaceType) ParseCommandOption(MagickColorspaceOptions, + MagickFalse,artifact); + if (image->storage_class == PseudoClass) + for (i=0; i < (ssize_t) image->colors; i++) + { + Quantum + blue, + green, + red; + + /* + Modulate image colormap. + */ + red=image->colormap[i].red; + green=image->colormap[i].green; + blue=image->colormap[i].blue; + switch (colorspace) + { + case HCLColorspace: + { + ModulateHCL(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HCLpColorspace: + { + ModulateHCLp(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HSBColorspace: + { + ModulateHSB(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HSIColorspace: + { + ModulateHSI(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HSLColorspace: + default: + { + ModulateHSL(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HSVColorspace: + { + ModulateHSV(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HWBColorspace: + { + ModulateHWB(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case LCHabColorspace: + case LCHColorspace: + { + ModulateLCHab(percent_brightness,percent_saturation,percent_hue, + &red,&green,&blue); + break; + } + case LCHuvColorspace: + { + ModulateLCHuv(percent_brightness,percent_saturation,percent_hue, + &red,&green,&blue); + break; + } + } + image->colormap[i].red=red; + image->colormap[i].green=green; + image->colormap[i].blue=blue; + } + + /* + Modulate image. + */ + + /* call opencl version */ +#if defined(MAGICKCORE_OPENCL_SUPPORT) + status=AccelerateModulateImage(image,percent_brightness,percent_hue, + percent_saturation,colorspace,&image->exception); + if (status != MagickFalse) + return status; +#endif + status=MagickTrue; + progress=0; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + Quantum + blue, + green, + red; + + red=GetPixelRed(q); + green=GetPixelGreen(q); + blue=GetPixelBlue(q); + switch (colorspace) + { + case HCLColorspace: + { + ModulateHCL(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HCLpColorspace: + { + ModulateHCLp(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HSBColorspace: + { + ModulateHSB(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HSLColorspace: + default: + { + ModulateHSL(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HSVColorspace: + { + ModulateHSV(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case HWBColorspace: + { + ModulateHWB(percent_hue,percent_saturation,percent_brightness, + &red,&green,&blue); + break; + } + case LCHabColorspace: + { + ModulateLCHab(percent_brightness,percent_saturation,percent_hue, + &red,&green,&blue); + break; + } + case LCHColorspace: + case LCHuvColorspace: + { + ModulateLCHuv(percent_brightness,percent_saturation,percent_hue, + &red,&green,&blue); + break; + } + } + SetPixelRed(q,red); + SetPixelGreen(q,green); + SetPixelBlue(q,blue); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,ModulateImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e g a t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NegateImage() negates the colors in the reference image. The grayscale +% option means that only grayscale values within the image are negated. +% +% The format of the NegateImageChannel method is: +% +% MagickBooleanType NegateImage(Image *image, +% const MagickBooleanType grayscale) +% MagickBooleanType NegateImageChannel(Image *image, +% const ChannelType channel,const MagickBooleanType grayscale) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o grayscale: If MagickTrue, only negate grayscale pixels within the image. +% +*/ + +MagickExport MagickBooleanType NegateImage(Image *image, + const MagickBooleanType grayscale) +{ + MagickBooleanType + status; + + status=NegateImageChannel(image,DefaultChannels,grayscale); + return(status); +} + +MagickExport MagickBooleanType NegateImageChannel(Image *image, + const ChannelType channel,const MagickBooleanType grayscale) +{ +#define NegateImageTag "Negate/Image" + + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + i; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->storage_class == PseudoClass) + { + /* + Negate colormap. + */ + for (i=0; i < (ssize_t) image->colors; i++) + { + if (grayscale != MagickFalse) + if ((image->colormap[i].red != image->colormap[i].green) || + (image->colormap[i].green != image->colormap[i].blue)) + continue; + if ((channel & RedChannel) != 0) + image->colormap[i].red=QuantumRange-image->colormap[i].red; + if ((channel & GreenChannel) != 0) + image->colormap[i].green=QuantumRange-image->colormap[i].green; + if ((channel & BlueChannel) != 0) + image->colormap[i].blue=QuantumRange-image->colormap[i].blue; + } + } + /* + Negate image. + */ + status=MagickTrue; + progress=0; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); + if (grayscale != MagickFalse) + { +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickBooleanType + sync; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((GetPixelRed(q) != GetPixelGreen(q)) || + (GetPixelGreen(q) != GetPixelBlue(q))) + { + q++; + continue; + } + if ((channel & RedChannel) != 0) + SetPixelRed(q,QuantumRange-GetPixelRed(q)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,QuantumRange-GetPixelGreen(q)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,QuantumRange-GetPixelBlue(q)); + if ((channel & OpacityChannel) != 0) + SetPixelOpacity(q,QuantumRange-GetPixelOpacity(q)); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(indexes+x,QuantumRange-GetPixelIndex(indexes+x)); + q++; + } + sync=SyncCacheViewAuthenticPixels(image_view,exception); + if (sync == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,NegateImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + return(MagickTrue); + } + /* + Negate image. + */ +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + if (channel == DefaultChannels) + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q+x,QuantumRange-GetPixelRed(q+x)); + SetPixelGreen(q+x,QuantumRange-GetPixelGreen(q+x)); + SetPixelBlue(q+x,QuantumRange-GetPixelBlue(q+x)); + } + else + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + SetPixelRed(q+x,QuantumRange-GetPixelRed(q+x)); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q+x,QuantumRange-GetPixelGreen(q+x)); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q+x,QuantumRange-GetPixelBlue(q+x)); + if ((channel & OpacityChannel) != 0) + SetPixelOpacity(q+x,QuantumRange-GetPixelOpacity(q+x)); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,QuantumRange-GetPixelIndex(indexes+x)); + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,NegateImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N o r m a l i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% The NormalizeImage() method enhances the contrast of a color image by +% mapping the darkest 2 percent of all pixel to black and the brightest +% 1 percent to white. +% +% The format of the NormalizeImage method is: +% +% MagickBooleanType NormalizeImage(Image *image) +% MagickBooleanType NormalizeImageChannel(Image *image, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +*/ + +MagickExport MagickBooleanType NormalizeImage(Image *image) +{ + MagickBooleanType + status; + + status=NormalizeImageChannel(image,DefaultChannels); + return(status); +} + +MagickExport MagickBooleanType NormalizeImageChannel(Image *image, + const ChannelType channel) +{ + double + black_point, + white_point; + + black_point=(double) image->columns*image->rows*0.0015; + white_point=(double) image->columns*image->rows*0.9995; + return(ContrastStretchImageChannel(image,channel,black_point,white_point)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S i g m o i d a l C o n t r a s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SigmoidalContrastImage() adjusts the contrast of an image with a non-linear +% sigmoidal contrast algorithm. Increase the contrast of the image using a +% sigmoidal transfer function without saturating highlights or shadows. +% Contrast indicates how much to increase the contrast (0 is none; 3 is +% typical; 20 is pushing it); mid-point indicates where midtones fall in the +% resultant image (0 is white; 50% is middle-gray; 100% is black). Set +% sharpen to MagickTrue to increase the image contrast otherwise the contrast +% is reduced. +% +% The format of the SigmoidalContrastImage method is: +% +% MagickBooleanType SigmoidalContrastImage(Image *image, +% const MagickBooleanType sharpen,const char *levels) +% MagickBooleanType SigmoidalContrastImageChannel(Image *image, +% const ChannelType channel,const MagickBooleanType sharpen, +% const double contrast,const double midpoint) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o sharpen: Increase or decrease image contrast. +% +% o contrast: strength of the contrast, the larger the number the more +% 'threshold-like' it becomes. +% +% o midpoint: midpoint of the function as a color value 0 to QuantumRange. +% +*/ + +/* + ImageMagick 7 has a version of this function which does not use LUTs. +*/ + +/* + Sigmoidal function Sigmoidal with inflexion point moved to b and "slope + constant" set to a. + + The first version, based on the hyperbolic tangent tanh, when combined with + the scaling step, is an exact arithmetic clone of the sigmoid function + based on the logistic curve. The equivalence is based on the identity + + 1/(1+exp(-t)) = (1+tanh(t/2))/2 + + (http://de.wikipedia.org/wiki/Sigmoidfunktion) and the fact that the + scaled sigmoidal derivation is invariant under affine transformations of + the ordinate. + + The tanh version is almost certainly more accurate and cheaper. The 0.5 + factor in the argument is to clone the legacy ImageMagick behavior. The + reason for making the define depend on atanh even though it only uses tanh + has to do with the construction of the inverse of the scaled sigmoidal. +*/ +#if defined(MAGICKCORE_HAVE_ATANH) +#define Sigmoidal(a,b,x) ( tanh((0.5*(a))*((x)-(b))) ) +#else +#define Sigmoidal(a,b,x) ( 1.0/(1.0+exp((a)*((b)-(x)))) ) +#endif +/* + Scaled sigmoidal function: + + ( Sigmoidal(a,b,x) - Sigmoidal(a,b,0) ) / + ( Sigmoidal(a,b,1) - Sigmoidal(a,b,0) ) + + See http://osdir.com/ml/video.image-magick.devel/2005-04/msg00006.html and + http://www.cs.dartmouth.edu/farid/downloads/tutorials/fip.pdf. The limit + of ScaledSigmoidal as a->0 is the identity, but a=0 gives a division by + zero. This is fixed below by exiting immediately when contrast is small, + leaving the image (or colormap) unmodified. This appears to be safe because + the series expansion of the logistic sigmoidal function around x=b is + + 1/2-a*(b-x)/4+... + + so that the key denominator s(1)-s(0) is about a/4 (a/2 with tanh). +*/ +#define ScaledSigmoidal(a,b,x) ( \ + (Sigmoidal((a),(b),(x))-Sigmoidal((a),(b),0.0)) / \ + (Sigmoidal((a),(b),1.0)-Sigmoidal((a),(b),0.0)) ) +/* + Inverse of ScaledSigmoidal, used for +sigmoidal-contrast. Because b + may be 0 or 1, the argument of the hyperbolic tangent (resp. logistic + sigmoidal) may be outside of the interval (-1,1) (resp. (0,1)), even + when creating a LUT from in gamut values, hence the branching. In + addition, HDRI may have out of gamut values. + InverseScaledSigmoidal is not a two-sided inverse of ScaledSigmoidal: + It is only a right inverse. This is unavoidable. +*/ +static inline double InverseScaledSigmoidal(const double a,const double b, + const double x) +{ + const double sig0=Sigmoidal(a,b,0.0); + const double sig1=Sigmoidal(a,b,1.0); + const double argument=(sig1-sig0)*x+sig0; + const double clamped= + ( +#if defined(MAGICKCORE_HAVE_ATANH) + argument < -1+MagickEpsilon + ? + -1+MagickEpsilon + : + ( argument > 1-MagickEpsilon ? 1-MagickEpsilon : argument ) + ); + return(b+(2.0/a)*atanh(clamped)); +#else + argument < MagickEpsilon + ? + MagickEpsilon + : + ( argument > 1-MagickEpsilon ? 1-MagickEpsilon : argument ) + ); + return(b-log(1.0/clamped-1.0)/a); +#endif +} + +MagickExport MagickBooleanType SigmoidalContrastImage(Image *image, + const MagickBooleanType sharpen,const char *levels) +{ + GeometryInfo + geometry_info; + + MagickBooleanType + status; + + MagickStatusType + flags; + + flags=ParseGeometry(levels,&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0*QuantumRange/2.0; + if ((flags & PercentValue) != 0) + geometry_info.sigma=1.0*QuantumRange*geometry_info.sigma/100.0; + status=SigmoidalContrastImageChannel(image,DefaultChannels,sharpen, + geometry_info.rho,geometry_info.sigma); + return(status); +} + +MagickExport MagickBooleanType SigmoidalContrastImageChannel(Image *image, + const ChannelType channel,const MagickBooleanType sharpen, + const double contrast,const double midpoint) +{ +#define SigmoidalContrastImageTag "SigmoidalContrast/Image" + + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MagickRealType + *sigmoidal_map; + + ssize_t + i; + + ssize_t + y; + + /* + Side effect: clamps values unless contrastsignature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=(&image->exception); + sigmoidal_map=(MagickRealType *) AcquireQuantumMemory(MaxMap+1UL, + sizeof(*sigmoidal_map)); + if (sigmoidal_map == (MagickRealType *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + (void) memset(sigmoidal_map,0,(MaxMap+1)*sizeof(*sigmoidal_map)); + if (sharpen != MagickFalse) + for (i=0; i <= (ssize_t) MaxMap; i++) + sigmoidal_map[i]=(MagickRealType) ScaleMapToQuantum((MagickRealType) + (MaxMap*ScaledSigmoidal(contrast,QuantumScale*midpoint,(double) i/ + MaxMap))); + else + for (i=0; i <= (ssize_t) MaxMap; i++) + sigmoidal_map[i]=(MagickRealType) ScaleMapToQuantum((MagickRealType) ( + MaxMap*InverseScaledSigmoidal(contrast,QuantumScale*midpoint,(double) i/ + MaxMap))); + /* + Sigmoidal-contrast enhance colormap. + */ + if (image->storage_class == PseudoClass) + for (i=0; i < (ssize_t) image->colors; i++) + { + if ((channel & RedChannel) != 0) + image->colormap[i].red=ClampToQuantum(sigmoidal_map[ + ScaleQuantumToMap(image->colormap[i].red)]); + if ((channel & GreenChannel) != 0) + image->colormap[i].green=ClampToQuantum(sigmoidal_map[ + ScaleQuantumToMap(image->colormap[i].green)]); + if ((channel & BlueChannel) != 0) + image->colormap[i].blue=ClampToQuantum(sigmoidal_map[ + ScaleQuantumToMap(image->colormap[i].blue)]); + if ((channel & OpacityChannel) != 0) + image->colormap[i].opacity=ClampToQuantum(sigmoidal_map[ + ScaleQuantumToMap(image->colormap[i].opacity)]); + } + /* + Sigmoidal-contrast enhance image. + */ + status=MagickTrue; + progress=0; + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + if ((channel & RedChannel) != 0) + SetPixelRed(q,ClampToQuantum(sigmoidal_map[ScaleQuantumToMap( + GetPixelRed(q))])); + if ((channel & GreenChannel) != 0) + SetPixelGreen(q,ClampToQuantum(sigmoidal_map[ScaleQuantumToMap( + GetPixelGreen(q))])); + if ((channel & BlueChannel) != 0) + SetPixelBlue(q,ClampToQuantum(sigmoidal_map[ScaleQuantumToMap( + GetPixelBlue(q))])); + if ((channel & OpacityChannel) != 0) + SetPixelOpacity(q,ClampToQuantum(sigmoidal_map[ScaleQuantumToMap( + GetPixelOpacity(q))])); + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + SetPixelIndex(indexes+x,ClampToQuantum(sigmoidal_map[ScaleQuantumToMap( + GetPixelIndex(indexes+x))])); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,SigmoidalContrastImageTag,progress, + image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + sigmoidal_map=(MagickRealType *) RelinquishMagickMemory(sigmoidal_map); + return(status); +} diff --git a/ImageMagick-6.9.12-44/magick/enhance.h b/ImageMagick-6.9.12-44/magick/enhance.h new file mode 100644 index 0000000..4e3a2a1 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/enhance.h @@ -0,0 +1,76 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image enhance methods. +*/ +#ifndef MAGICKCORE_ENHANCE_H +#define MAGICKCORE_ENHANCE_H + +#include "magick/pixel.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport MagickBooleanType + AutoGammaImage(Image *), + AutoGammaImageChannel(Image *,const ChannelType), + AutoLevelImage(Image *), + AutoLevelImageChannel(Image *,const ChannelType), + BrightnessContrastImage(Image *,const double,const double), + BrightnessContrastImageChannel(Image *,const ChannelType,const double, + const double), + ClutImage(Image *,const Image *), + ClutImageChannel(Image *,const ChannelType,const Image *), + ColorDecisionListImage(Image *,const char *), + ContrastImage(Image *,const MagickBooleanType), + ContrastStretchImage(Image *,const char *), + ContrastStretchImageChannel(Image *,const ChannelType,const double, + const double), + EqualizeImage(Image *image), + EqualizeImageChannel(Image *image,const ChannelType), + GammaImage(Image *,const char *), + GammaImageChannel(Image *,const ChannelType,const double), + GrayscaleImage(Image *,const PixelIntensityMethod), + HaldClutImage(Image *,const Image *), + HaldClutImageChannel(Image *,const ChannelType,const Image *), + LevelImage(Image *,const char *), + LevelImageChannel(Image *,const ChannelType,const double,const double, + const double), + LevelizeImage(Image *,const double,const double,const double), + LevelizeImageChannel(Image *,const ChannelType,const double,const double, + const double), + LevelColorsImage(Image *,const MagickPixelPacket *,const MagickPixelPacket *, + const MagickBooleanType), + LevelColorsImageChannel(Image *,const ChannelType,const MagickPixelPacket *, + const MagickPixelPacket *,const MagickBooleanType), + LinearStretchImage(Image *,const double,const double), + ModulateImage(Image *,const char *), + NegateImage(Image *,const MagickBooleanType), + NegateImageChannel(Image *,const ChannelType,const MagickBooleanType), + NormalizeImage(Image *), + NormalizeImageChannel(Image *,const ChannelType), + SigmoidalContrastImage(Image *,const MagickBooleanType,const char *), + SigmoidalContrastImageChannel(Image *,const ChannelType, + const MagickBooleanType,const double,const double); + +extern MagickExport Image + *EnhanceImage(const Image *,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/exception-private.h b/ImageMagick-6.9.12-44/magick/exception-private.h new file mode 100644 index 0000000..70e8f18 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/exception-private.h @@ -0,0 +1,110 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore exception private methods. +*/ +#ifndef MAGICKCORE_EXCEPTION_PRIVATE_H +#define MAGICKCORE_EXCEPTION_PRIVATE_H + +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/string_.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define ThrowBinaryException(severity,tag,context) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),severity, \ + tag == (const char *) NULL ? "unknown" : tag,"`%s'",context); \ + return(MagickFalse); \ +} +#define ThrowBinaryImageException(severity,tag,context) \ +{ \ + if (image != (Image *) NULL) \ + (void) ThrowMagickException(&image->exception,GetMagickModule(),severity, \ + tag == (const char *) NULL ? "unknown" : tag,"`%s'",context); \ + return(MagickFalse); \ +} +#define ThrowFatalException(severity,tag) \ +{ \ + char \ + *fatal_message; \ + \ + ExceptionInfo \ + *fatal_exception; \ + \ + fatal_exception=AcquireExceptionInfo(); \ + fatal_message=GetExceptionMessage(errno); \ + (void) ThrowMagickException(fatal_exception,GetMagickModule(),severity, \ + tag == (const char *) NULL ? "unknown" : tag,"`%s'",fatal_message); \ + fatal_message=DestroyString(fatal_message); \ + CatchException(fatal_exception); \ + (void) DestroyExceptionInfo(fatal_exception); \ + MagickCoreTerminus(); \ + _exit((int) (severity-FatalErrorException)+1); \ +} +#define ThrowFileException(exception,severity,tag,context) \ +{ \ + char \ + *message; \ + \ + message=GetExceptionMessage(errno); \ + (void) ThrowMagickException(exception,GetMagickModule(),severity, \ + tag == (const char *) NULL ? "unknown" : tag,"`%s': %s",context,message); \ + message=DestroyString(message); \ +} +#define ThrowImageException(severity,tag) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),severity, \ + tag == (const char *) NULL ? "unknown" : tag,"`%s'",image->filename); \ + return((Image *) NULL); \ +} +#define ThrowReaderException(severity,tag) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),severity, \ + tag == (const char *) NULL ? "unknown" : tag,"`%s'",image_info->filename); \ + if ((image) != (Image *) NULL) \ + { \ + (void) CloseBlob(image); \ + image=DestroyImageList(image); \ + } \ + return((Image *) NULL); \ +} +#define ThrowWriterException(severity,tag) \ +{ \ + (void) ThrowMagickException(&image->exception,GetMagickModule(),severity, \ + tag == (const char *) NULL ? "unknown" : tag,"`%s'",image->filename); \ + if (image_info->adjoin != MagickFalse) \ + while (image->previous != (Image *) NULL) \ + image=image->previous; \ + (void) CloseBlob(image); \ + return(MagickFalse); \ +} + +extern MagickPrivate MagickBooleanType + ClearExceptionInfo(ExceptionInfo *,MagickBooleanType), + ExceptionComponentGenesis(void); + +extern MagickPrivate void + ExceptionComponentTerminus(void), + InitializeExceptionInfo(ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/exception.c b/ImageMagick-6.9.12-44/magick/exception.c new file mode 100644 index 0000000..8cb6fdc --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/exception.c @@ -0,0 +1,1164 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% EEEEE X X CCCC EEEEE PPPP TTTTT IIIII OOO N N % +% E X X C E P P T I O O NN N % +% EEE X C EEE PPPP T I O O N N N % +% E X X C E P T I O O N NN % +% EEEEE X X CCCC EEEEE P T IIIII OOO N N % +% % +% % +% MagickCore Exception Methods % +% % +% Software Design % +% Cristy % +% July 1993 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/client.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/hashmap.h" +#include "magick/locale_.h" +#include "magick/log.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/semaphore.h" +#include "magick/string_.h" +#include "magick/utility.h" + +/* + Define declarations. +*/ +#define MaxExceptionList 64 + +/* + Forward declarations. +*/ +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static void + DefaultErrorHandler(const ExceptionType,const char *,const char *), + DefaultFatalErrorHandler(const ExceptionType,const char *,const char *), + DefaultWarningHandler(const ExceptionType,const char *,const char *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +/* + Global declarations. +*/ +static ErrorHandler + error_handler = DefaultErrorHandler; + +static FatalErrorHandler + fatal_error_handler = DefaultFatalErrorHandler; + +static WarningHandler + warning_handler = DefaultWarningHandler; + +/* + Static declarations. +*/ +static SemaphoreInfo + *exception_semaphore = (SemaphoreInfo *) NULL; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e E x c e p t i o n I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireExceptionInfo() allocates the ExceptionInfo structure. +% +% The format of the AcquireExceptionInfo method is: +% +% ExceptionInfo *AcquireExceptionInfo(void) +% +*/ +MagickExport ExceptionInfo *AcquireExceptionInfo(void) +{ + ExceptionInfo + *exception; + + exception=(ExceptionInfo *) AcquireMagickMemory(sizeof(*exception)); + if (exception == (ExceptionInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + InitializeExceptionInfo(exception); + exception->relinquish=MagickTrue; + return(exception); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l e a r M a g i c k E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClearMagickException() clears any exception that may not have been caught +% yet. +% +% The format of the ClearMagickException method is: +% +% ClearMagickException(ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o exception: the exception info. +% +*/ + +static void *DestroyExceptionElement(void *exception) +{ + ExceptionInfo + *p; + + p=(ExceptionInfo *) exception; + if (p->reason != (char *) NULL) + p->reason=DestroyString(p->reason); + if (p->description != (char *) NULL) + p->description=DestroyString(p->description); + p=(ExceptionInfo *) RelinquishMagickMemory(p); + return((void *) NULL); +} + +MagickExport void ClearMagickException(ExceptionInfo *exception) +{ + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if (exception->exceptions == (void *) NULL) + return; + LockSemaphoreInfo(exception->semaphore); + ClearLinkedList((LinkedListInfo *) exception->exceptions, + DestroyExceptionElement); + exception->severity=UndefinedException; + exception->reason=(char *) NULL; + exception->description=(char *) NULL; + UnlockSemaphoreInfo(exception->semaphore); + errno=0; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C a t c h E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CatchException() returns if no exceptions is found otherwise it reports +% the exception as a warning, error, or fatal depending on the severity. +% +% The format of the CatchException method is: +% +% CatchException(ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o exception: the exception info. +% +*/ +MagickExport void CatchException(ExceptionInfo *exception) +{ + LinkedListInfo + *exceptions; + + const ExceptionInfo + *p; + + ssize_t + i; + + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if (exception->exceptions == (void *) NULL) + return; + LockSemaphoreInfo(exception->semaphore); + exceptions=(LinkedListInfo *) exception->exceptions; + ResetLinkedListIterator(exceptions); + p=(const ExceptionInfo *) GetNextValueInLinkedList(exceptions); + for (i=0; p != (const ExceptionInfo *) NULL; i++) + { + if (p->severity >= FatalErrorException) + MagickFatalError(p->severity,p->reason,p->description); + if ((p->severity >= ErrorException) && (p->severity < FatalErrorException)) + MagickError(p->severity,p->reason,p->description); + if ((p->severity >= WarningException) && (p->severity < ErrorException)) + MagickWarning(p->severity,p->reason,p->description); + p=(const ExceptionInfo *) GetNextValueInLinkedList(exceptions); + } + UnlockSemaphoreInfo(exception->semaphore); + ClearMagickException(exception); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e E x c e p t i o n I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneExceptionInfo() clones the ExceptionInfo structure. +% +% The format of the CloneExceptionInfo method is: +% +% ExceptionInfo *CloneException(ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o exception: the exception info. +% +*/ +MagickExport ExceptionInfo *CloneExceptionInfo(ExceptionInfo *exception) +{ + ExceptionInfo + *clone_exception; + + clone_exception=(ExceptionInfo *) AcquireMagickMemory(sizeof(*exception)); + if (clone_exception == (ExceptionInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + InitializeExceptionInfo(clone_exception); + InheritException(clone_exception,exception); + clone_exception->relinquish=MagickTrue; + return(clone_exception); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e f a u l t E r r o r H a n d l e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DefaultErrorHandler() displays an error reason. +% +% The format of the DefaultErrorHandler method is: +% +% void MagickError(const ExceptionType severity,const char *reason, +% const char *description) +% +% A description of each parameter follows: +% +% o severity: Specifies the numeric error category. +% +% o reason: Specifies the reason to display before terminating the +% program. +% +% o description: Specifies any description to the reason. +% +*/ +static void DefaultErrorHandler(const ExceptionType magick_unused(severity), + const char *reason,const char *description) +{ + magick_unreferenced(severity); + + if (reason == (char *) NULL) + return; + (void) FormatLocaleFile(stderr,"%s: %s",GetClientName(),reason); + if (description != (char *) NULL) + (void) FormatLocaleFile(stderr," (%s)",description); + (void) FormatLocaleFile(stderr,".\n"); + (void) fflush(stderr); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e f a u l t F a t a l E r r o r H a n d l e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DefaultFatalErrorHandler() displays an error reason and then terminates the +% program. +% +% The format of the DefaultFatalErrorHandler method is: +% +% void MagickFatalError(const ExceptionType severity,const char *reason, +% const char *description) +% +% A description of each parameter follows: +% +% o severity: Specifies the numeric error category. +% +% o reason: Specifies the reason to display before terminating the program. +% +% o description: Specifies any description to the reason. +% +*/ +static void DefaultFatalErrorHandler(const ExceptionType severity, + const char *reason,const char *description) +{ + if (reason == (char *) NULL) + return; + (void) FormatLocaleFile(stderr,"%s: %s",GetClientName(),reason); + if (description != (char *) NULL) + (void) FormatLocaleFile(stderr," (%s)",description); + (void) FormatLocaleFile(stderr,".\n"); + (void) fflush(stderr); + MagickCoreTerminus(); + exit((int) (severity-FatalErrorException)+1); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e f a u l t W a r n i n g H a n d l e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DefaultWarningHandler() displays a warning reason. +% +% The format of the DefaultWarningHandler method is: +% +% void DefaultWarningHandler(const ExceptionType severity, +% const char *reason,const char *description) +% +% A description of each parameter follows: +% +% o severity: Specifies the numeric warning category. +% +% o reason: Specifies the reason to display before terminating the +% program. +% +% o description: Specifies any description to the reason. +% +*/ +static void DefaultWarningHandler(const ExceptionType magick_unused(severity), + const char *reason,const char *description) +{ + magick_unreferenced(severity); + + if (reason == (char *) NULL) + return; + (void) FormatLocaleFile(stderr,"%s: %s",GetClientName(),reason); + if (description != (char *) NULL) + (void) FormatLocaleFile(stderr," (%s)",description); + (void) FormatLocaleFile(stderr,".\n"); + (void) fflush(stderr); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y E x c e p t i o n I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyExceptionInfo() deallocates memory associated with an exception. +% +% The format of the DestroyExceptionInfo method is: +% +% ExceptionInfo *DestroyExceptionInfo(ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o exception: the exception info. +% +*/ + +MagickPrivate MagickBooleanType ClearExceptionInfo(ExceptionInfo *exception, + MagickBooleanType relinquish) +{ + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if (exception->semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&exception->semaphore); + LockSemaphoreInfo(exception->semaphore); + if (relinquish == MagickFalse) + relinquish=exception->relinquish; + exception->severity=UndefinedException; + if (relinquish != MagickFalse) + { + exception->signature=(~MagickCoreSignature); + if (exception->exceptions != (void *) NULL) + exception->exceptions=(void *) DestroyLinkedList((LinkedListInfo *) + exception->exceptions,DestroyExceptionElement); + } + else if (exception->exceptions != (void *) NULL) + ClearLinkedList((LinkedListInfo *) exception->exceptions, + DestroyExceptionElement); + UnlockSemaphoreInfo(exception->semaphore); + if (relinquish != MagickFalse) + DestroySemaphoreInfo(&exception->semaphore); + return(relinquish); +} + +MagickExport ExceptionInfo *DestroyExceptionInfo(ExceptionInfo *exception) +{ + if (ClearExceptionInfo(exception,MagickFalse) != MagickFalse) + exception=(ExceptionInfo *) RelinquishMagickMemory(exception); + return(exception); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ E x e c e p t i o n C o m p o n e n t G e n e s i s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ExceptionComponentGenesis() instantiates the exception component. +% +% The format of the ExceptionComponentGenesis method is: +% +% MagickBooleanType ExceptionComponentGenesis(void) +% +*/ +MagickPrivate MagickBooleanType ExceptionComponentGenesis(void) +{ + if (exception_semaphore == (SemaphoreInfo *) NULL) + exception_semaphore=AllocateSemaphoreInfo(); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ E x c e p t i o n C o m p o n e n t T e r m i n u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ExceptionComponentTerminus() destroys the exception component. +% +% The format of the ExceptionComponentTerminus method is: +% +% void ExceptionComponentTerminus(void) +% +*/ +MagickPrivate void ExceptionComponentTerminus(void) +{ + if (exception_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&exception_semaphore); + LockSemaphoreInfo(exception_semaphore); + UnlockSemaphoreInfo(exception_semaphore); + DestroySemaphoreInfo(&exception_semaphore); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t E x c e p t i o n M e s s a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetExceptionMessage() returns the error message defined by the specified +% error code. +% +% The format of the GetExceptionMessage method is: +% +% char *GetExceptionMessage(const int error) +% +% A description of each parameter follows: +% +% o error: the error code. +% +*/ +MagickExport char *GetExceptionMessage(const int error) +{ + char + exception[MaxTextExtent]; + + *exception='\0'; +#if defined(MAGICKCORE_HAVE_STRERROR_R) +#if !defined(MAGICKCORE_STRERROR_R_CHAR_P) + (void) strerror_r(error,exception,sizeof(exception)); +#else + (void) CopyMagickString(exception,strerror_r(error,exception, + sizeof(exception)),sizeof(exception)); +#endif +#else + (void) CopyMagickString(exception,strerror(error),sizeof(exception)); +#endif + return(ConstantString(exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t L o c a l e E x c e p t i o n M e s s a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetLocaleExceptionMessage() converts a enumerated exception severity and tag +% to a message in the current locale. +% +% The format of the GetLocaleExceptionMessage method is: +% +% const char *GetLocaleExceptionMessage(const ExceptionType severity, +% const char *tag) +% +% A description of each parameter follows: +% +% o severity: the severity of the exception. +% +% o tag: the message tag. +% +*/ + +static const char *ExceptionSeverityToTag(const ExceptionType severity) +{ + switch (severity) + { + case ResourceLimitWarning: return("Resource/Limit/Warning/"); + case TypeWarning: return("Type/Warning/"); + case OptionWarning: return("Option/Warning/"); + case DelegateWarning: return("Delegate/Warning/"); + case MissingDelegateWarning: return("Missing/Delegate/Warning/"); + case CorruptImageWarning: return("Corrupt/Image/Warning/"); + case FileOpenWarning: return("File/Open/Warning/"); + case BlobWarning: return("Blob/Warning/"); + case StreamWarning: return("Stream/Warning/"); + case CacheWarning: return("Cache/Warning/"); + case CoderWarning: return("Coder/Warning/"); + case FilterWarning: return("Filter/Warning/"); + case ModuleWarning: return("Module/Warning/"); + case DrawWarning: return("Draw/Warning/"); + case ImageWarning: return("Image/Warning/"); + case WandWarning: return("Wand/Warning/"); + case XServerWarning: return("XServer/Warning/"); + case MonitorWarning: return("Monitor/Warning/"); + case RegistryWarning: return("Registry/Warning/"); + case ConfigureWarning: return("Configure/Warning/"); + case PolicyWarning: return("Policy/Warning/"); + case ResourceLimitError: return("Resource/Limit/Error/"); + case TypeError: return("Type/Error/"); + case OptionError: return("Option/Error/"); + case DelegateError: return("Delegate/Error/"); + case MissingDelegateError: return("Missing/Delegate/Error/"); + case CorruptImageError: return("Corrupt/Image/Error/"); + case FileOpenError: return("File/Open/Error/"); + case BlobError: return("Blob/Error/"); + case StreamError: return("Stream/Error/"); + case CacheError: return("Cache/Error/"); + case CoderError: return("Coder/Error/"); + case FilterError: return("Filter/Error/"); + case ModuleError: return("Module/Error/"); + case DrawError: return("Draw/Error/"); + case ImageError: return("Image/Error/"); + case WandError: return("Wand/Error/"); + case XServerError: return("XServer/Error/"); + case MonitorError: return("Monitor/Error/"); + case RegistryError: return("Registry/Error/"); + case ConfigureError: return("Configure/Error/"); + case PolicyError: return("Policy/Error/"); + case ResourceLimitFatalError: return("Resource/Limit/FatalError/"); + case TypeFatalError: return("Type/FatalError/"); + case OptionFatalError: return("Option/FatalError/"); + case DelegateFatalError: return("Delegate/FatalError/"); + case MissingDelegateFatalError: return("Missing/Delegate/FatalError/"); + case CorruptImageFatalError: return("Corrupt/Image/FatalError/"); + case FileOpenFatalError: return("File/Open/FatalError/"); + case BlobFatalError: return("Blob/FatalError/"); + case StreamFatalError: return("Stream/FatalError/"); + case CacheFatalError: return("Cache/FatalError/"); + case CoderFatalError: return("Coder/FatalError/"); + case FilterFatalError: return("Filter/FatalError/"); + case ModuleFatalError: return("Module/FatalError/"); + case DrawFatalError: return("Draw/FatalError/"); + case ImageFatalError: return("Image/FatalError/"); + case WandFatalError: return("Wand/FatalError/"); + case XServerFatalError: return("XServer/FatalError/"); + case MonitorFatalError: return("Monitor/FatalError/"); + case RegistryFatalError: return("Registry/FatalError/"); + case ConfigureFatalError: return("Configure/FatalError/"); + case PolicyFatalError: return("Policy/FatalError/"); + default: break; + } + return(""); +} + +MagickExport const char *GetLocaleExceptionMessage(const ExceptionType severity, + const char *tag) +{ + char + message[MaxTextExtent]; + + const char + *locale_message; + + assert(tag != (const char *) NULL); + (void) FormatLocaleString(message,MaxTextExtent,"Exception/%s%s", + ExceptionSeverityToTag(severity),tag); + locale_message=GetLocaleMessage(message); + if (locale_message == (const char *) NULL) + return(tag); + if (locale_message == message) + return(tag); + return(locale_message); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I n h e r i t E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% InheritException() inherits an exception from a related exception. +% +% The format of the InheritException method is: +% +% InheritException(ExceptionInfo *exception,const ExceptionInfo *relative) +% +% A description of each parameter follows: +% +% o exception: the exception info. +% +% o relative: the related exception info. +% +*/ +MagickExport void InheritException(ExceptionInfo *exception, + const ExceptionInfo *relative) +{ + const ExceptionInfo + *p; + + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + assert(relative != (ExceptionInfo *) NULL); + assert(relative->signature == MagickCoreSignature); + assert(exception != relative); + if (relative->exceptions == (void *) NULL) + return; + LockSemaphoreInfo(relative->semaphore); + ResetLinkedListIterator((LinkedListInfo *) relative->exceptions); + p=(const ExceptionInfo *) GetNextValueInLinkedList((LinkedListInfo *) + relative->exceptions); + while (p != (const ExceptionInfo *) NULL) + { + (void) ThrowException(exception,p->severity,p->reason,p->description); + p=(const ExceptionInfo *) GetNextValueInLinkedList((LinkedListInfo *) + relative->exceptions); + } + UnlockSemaphoreInfo(relative->semaphore); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I n i t i a l i z e E x c e p t i o n I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% InitializeExceptionInfo() initializes an exception to default values. +% +% The format of the InitializeExceptionInfo method is: +% +% InitializeExceptionInfo(ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o exception: the exception info. +% +*/ +MagickPrivate void InitializeExceptionInfo(ExceptionInfo *exception) +{ + assert(exception != (ExceptionInfo *) NULL); + (void) memset(exception,0,sizeof(*exception)); + exception->severity=UndefinedException; + exception->exceptions=(void *) NewLinkedList(0); + exception->semaphore=AllocateSemaphoreInfo(); + exception->signature=MagickCoreSignature; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k E r r o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickError() calls the exception handler methods with an error reason. +% +% The format of the MagickError method is: +% +% void MagickError(const ExceptionType error,const char *reason, +% const char *description) +% +% A description of each parameter follows: +% +% o exception: Specifies the numeric error category. +% +% o reason: Specifies the reason to display before terminating the +% program. +% +% o description: Specifies any description to the reason. +% +*/ +MagickExport void MagickError(const ExceptionType error,const char *reason, + const char *description) +{ + if (error_handler != (ErrorHandler) NULL) + (*error_handler)(error,reason,description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k F a t al E r r o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickFatalError() calls the fatal exception handler methods with an error +% reason. +% +% The format of the MagickError method is: +% +% void MagickFatalError(const ExceptionType error,const char *reason, +% const char *description) +% +% A description of each parameter follows: +% +% o exception: Specifies the numeric error category. +% +% o reason: Specifies the reason to display before terminating the +% program. +% +% o description: Specifies any description to the reason. +% +*/ +MagickExport void MagickFatalError(const ExceptionType error,const char *reason, + const char *description) +{ + if (fatal_error_handler != (ErrorHandler) NULL) + (*fatal_error_handler)(error,reason,description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k W a r n i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickWarning() calls the warning handler methods with a warning reason. +% +% The format of the MagickWarning method is: +% +% void MagickWarning(const ExceptionType warning,const char *reason, +% const char *description) +% +% A description of each parameter follows: +% +% o warning: the warning severity. +% +% o reason: Define the reason for the warning. +% +% o description: Describe the warning. +% +*/ +MagickExport void MagickWarning(const ExceptionType warning,const char *reason, + const char *description) +{ + if (warning_handler != (WarningHandler) NULL) + (*warning_handler)(warning,reason,description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t E r r o r H a n d l e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetErrorHandler() sets the exception handler to the specified method +% and returns the previous exception handler. +% +% The format of the SetErrorHandler method is: +% +% ErrorHandler SetErrorHandler(ErrorHandler handler) +% +% A description of each parameter follows: +% +% o handler: the method to handle errors. +% +*/ +MagickExport ErrorHandler SetErrorHandler(ErrorHandler handler) +{ + ErrorHandler + previous_handler; + + if (exception_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&exception_semaphore); + LockSemaphoreInfo(exception_semaphore); + previous_handler=error_handler; + error_handler=handler; + UnlockSemaphoreInfo(exception_semaphore); + return(previous_handler); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t F a t a l E r r o r H a n d l e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetFatalErrorHandler() sets the fatal exception handler to the specified +% method and returns the previous fatal exception handler. +% +% The format of the SetErrorHandler method is: +% +% ErrorHandler SetErrorHandler(ErrorHandler handler) +% +% A description of each parameter follows: +% +% o handler: the method to handle errors. +% +*/ +MagickExport FatalErrorHandler SetFatalErrorHandler(FatalErrorHandler handler) +{ + FatalErrorHandler + previous_handler; + + if (exception_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&exception_semaphore); + LockSemaphoreInfo(exception_semaphore); + previous_handler=fatal_error_handler; + fatal_error_handler=handler; + UnlockSemaphoreInfo(exception_semaphore); + return(previous_handler); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t W a r n i n g H a n d l e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetWarningHandler() sets the warning handler to the specified method +% and returns the previous warning handler. +% +% The format of the SetWarningHandler method is: +% +% ErrorHandler SetWarningHandler(ErrorHandler handler) +% +% A description of each parameter follows: +% +% o handler: the method to handle warnings. +% +*/ +MagickExport WarningHandler SetWarningHandler(WarningHandler handler) +{ + WarningHandler + previous_handler; + + if (exception_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&exception_semaphore); + LockSemaphoreInfo(exception_semaphore); + previous_handler=warning_handler; + warning_handler=handler; + UnlockSemaphoreInfo(exception_semaphore); + return(previous_handler); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% T h r o w E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ThrowException() throws an exception with the specified severity code, +% reason, and optional description. +% +% The format of the ThrowException method is: +% +% MagickBooleanType ThrowException(ExceptionInfo *exception, +% const ExceptionType severity,const char *reason, +% const char *description) +% +% A description of each parameter follows: +% +% o exception: the exception info. +% +% o severity: the severity of the exception. +% +% o reason: the reason for the exception. +% +% o description: the exception description. +% +*/ +MagickExport MagickBooleanType ThrowException(ExceptionInfo *exception, + const ExceptionType severity,const char *reason,const char *description) +{ + LinkedListInfo + *exceptions; + + ExceptionInfo + *p; + + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + LockSemaphoreInfo(exception->semaphore); + exceptions=(LinkedListInfo *) exception->exceptions; + if (GetNumberOfElementsInLinkedList(exceptions) > MaxExceptionList) + { + if (severity < ErrorException) + { + UnlockSemaphoreInfo(exception->semaphore); + return(MagickTrue); + } + p=(ExceptionInfo *) GetLastValueInLinkedList(exceptions); + if (p->severity >= ErrorException) + { + UnlockSemaphoreInfo(exception->semaphore); + return(MagickTrue); + } + } + p=(ExceptionInfo *) GetLastValueInLinkedList(exceptions); + if ((p != (ExceptionInfo *) NULL) && (p->severity == severity) && + (LocaleCompare(exception->reason,reason) == 0) && + (LocaleCompare(exception->description,description) == 0)) + { + UnlockSemaphoreInfo(exception->semaphore); + return(MagickTrue); + } + p=(ExceptionInfo *) AcquireMagickMemory(sizeof(*p)); + if (p == (ExceptionInfo *) NULL) + { + UnlockSemaphoreInfo(exception->semaphore); + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + } + (void) memset(p,0,sizeof(*p)); + p->severity=severity; + if (reason != (const char *) NULL) + p->reason=ConstantString(reason); + if (description != (const char *) NULL) + p->description=ConstantString(description); + p->signature=MagickCoreSignature; + (void) AppendValueToLinkedList(exceptions,p); + if (p->severity > exception->severity) + { + exception->severity=p->severity; + exception->reason=p->reason; + exception->description=p->description; + } + UnlockSemaphoreInfo(exception->semaphore); + if (GetNumberOfElementsInLinkedList(exceptions) == MaxExceptionList) + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitWarning,"TooManyExceptions", + "(exception processing is suspended)"); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% T h r o w M a g i c k E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ThrowMagickException logs an exception as determined by the log configuration +% file. If an error occurs, MagickFalse is returned otherwise MagickTrue. +% +% The format of the ThrowMagickException method is: +% +% MagickBooleanType ThrowFileException(ExceptionInfo *exception, +% const char *module,const char *function,const size_t line, +% const ExceptionType severity,const char *tag,const char *format,...) +% +% A description of each parameter follows: +% +% o exception: the exception info. +% +% o filename: the source module filename. +% +% o function: the function name. +% +% o line: the line number of the source module. +% +% o severity: Specifies the numeric error category. +% +% o tag: the locale tag. +% +% o format: the output format. +% +*/ + +MagickExport MagickBooleanType ThrowMagickExceptionList( + ExceptionInfo *exception,const char *module,const char *function, + const size_t line,const ExceptionType severity,const char *tag, + const char *format,va_list operands) +{ + char + message[MaxTextExtent], + path[MaxTextExtent], + reason[MaxTextExtent]; + + const char + *locale, + *type; + + int + n; + + MagickBooleanType + status; + + size_t + length; + + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + locale=GetLocaleExceptionMessage(severity,tag); + (void) CopyMagickString(reason,locale,MaxTextExtent); + (void) ConcatenateMagickString(reason," ",MaxTextExtent); + length=strlen(reason); +#if defined(MAGICKCORE_HAVE_VSNPRINTF) + n=vsnprintf(reason+length,MaxTextExtent-length,format,operands); +#else + n=vsprintf(reason+length,format,operands); +#endif + if (n < 0) + reason[MaxTextExtent-1]='\0'; + status=LogMagickEvent(ExceptionEvent,module,function,line,"%s",reason); + GetPathComponent(module,TailPath,path); + type="undefined"; + if ((severity >= WarningException) && (severity < ErrorException)) + type="warning"; + if ((severity >= ErrorException) && (severity < FatalErrorException)) + type="error"; + if (severity >= FatalErrorException) + type="fatal"; + (void) FormatLocaleString(message,MaxTextExtent,"%s @ %s/%s/%s/%.20g",reason, + type,path,function,(double) line); + (void) ThrowException(exception,severity,message,(char *) NULL); + return(status); +} + +MagickExport MagickBooleanType ThrowMagickException(ExceptionInfo *exception, + const char *module,const char *function,const size_t line, + const ExceptionType severity,const char *tag,const char *format,...) +{ + MagickBooleanType + status; + + va_list + operands; + + va_start(operands,format); + status=ThrowMagickExceptionList(exception,module,function,line,severity,tag, + format,operands); + va_end(operands); + return(status); +} diff --git a/ImageMagick-6.9.12-44/magick/exception.h b/ImageMagick-6.9.12-44/magick/exception.h new file mode 100644 index 0000000..6bcf8e1 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/exception.h @@ -0,0 +1,178 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore exception methods. +*/ +#ifndef MAGICKCORE_EXCEPTION_H +#define MAGICKCORE_EXCEPTION_H + +#include +#include "magick/semaphore.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef enum +{ + UndefinedException, + WarningException = 300, + ResourceLimitWarning = 300, + TypeWarning = 305, + OptionWarning = 310, + DelegateWarning = 315, + MissingDelegateWarning = 320, + CorruptImageWarning = 325, + FileOpenWarning = 330, + BlobWarning = 335, + StreamWarning = 340, + CacheWarning = 345, + CoderWarning = 350, + FilterWarning = 352, + ModuleWarning = 355, + DrawWarning = 360, + ImageWarning = 365, + WandWarning = 370, + RandomWarning = 375, + XServerWarning = 380, + MonitorWarning = 385, + RegistryWarning = 390, + ConfigureWarning = 395, + PolicyWarning = 399, + ErrorException = 400, + ResourceLimitError = 400, + TypeError = 405, + OptionError = 410, + DelegateError = 415, + MissingDelegateError = 420, + CorruptImageError = 425, + FileOpenError = 430, + BlobError = 435, + StreamError = 440, + CacheError = 445, + CoderError = 450, + FilterError = 452, + ModuleError = 455, + DrawError = 460, + ImageError = 465, + WandError = 470, + RandomError = 475, + XServerError = 480, + MonitorError = 485, + RegistryError = 490, + ConfigureError = 495, + PolicyError = 499, + FatalErrorException = 700, + ResourceLimitFatalError = 700, + TypeFatalError = 705, + OptionFatalError = 710, + DelegateFatalError = 715, + MissingDelegateFatalError = 720, + CorruptImageFatalError = 725, + FileOpenFatalError = 730, + BlobFatalError = 735, + StreamFatalError = 740, + CacheFatalError = 745, + CoderFatalError = 750, + FilterFatalError = 752, + ModuleFatalError = 755, + DrawFatalError = 760, + ImageFatalError = 765, + WandFatalError = 770, + RandomFatalError = 775, + XServerFatalError = 780, + MonitorFatalError = 785, + RegistryFatalError = 790, + ConfigureFatalError = 795, + PolicyFatalError = 799 +} ExceptionType; + +struct _ExceptionInfo +{ + ExceptionType + severity; + + int + error_number; + + char + *reason, + *description; + + void + *exceptions; + + MagickBooleanType + relinquish; + + SemaphoreInfo + *semaphore; + + size_t + signature; +}; + +typedef void + (*ErrorHandler)(const ExceptionType,const char *,const char *); + +typedef void + (*FatalErrorHandler)(const ExceptionType,const char *,const char *); + +typedef void + (*WarningHandler)(const ExceptionType,const char *,const char *); + +extern MagickExport char + *GetExceptionMessage(const int); + +extern MagickExport const char + *GetLocaleExceptionMessage(const ExceptionType,const char *); + +extern MagickExport ErrorHandler + SetErrorHandler(ErrorHandler); + +extern MagickExport ExceptionInfo + *AcquireExceptionInfo(void), + *CloneExceptionInfo(ExceptionInfo *), + *DestroyExceptionInfo(ExceptionInfo *); + +extern MagickExport FatalErrorHandler + SetFatalErrorHandler(FatalErrorHandler); + +extern MagickExport MagickBooleanType + ThrowException(ExceptionInfo *,const ExceptionType,const char *, + const char *), + ThrowMagickException(ExceptionInfo *,const char *,const char *,const size_t, + const ExceptionType,const char *,const char *,...) + magick_attribute((__format__ (__printf__,7,8))), + ThrowMagickExceptionList(ExceptionInfo *,const char *,const char *, + const size_t,const ExceptionType,const char *,const char *,va_list) + magick_attribute((__format__ (__printf__,7,0))); + +extern MagickExport void + CatchException(ExceptionInfo *), + ClearMagickException(ExceptionInfo *), + InheritException(ExceptionInfo *,const ExceptionInfo *), + MagickError(const ExceptionType,const char *,const char *), + MagickFatalError(const ExceptionType,const char *,const char *), + MagickWarning(const ExceptionType,const char *,const char *); + +extern MagickExport WarningHandler + SetWarningHandler(WarningHandler); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/feature.c b/ImageMagick-6.9.12-44/magick/feature.c new file mode 100644 index 0000000..8cdd439 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/feature.c @@ -0,0 +1,2373 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% FFFFF EEEEE AAA TTTTT U U RRRR EEEEE % +% F E A A T U U R R E % +% FFF EEE AAAAA T U U RRRR EEE % +% F E A A T U U R R E % +% F EEEEE A A T UUU R R EEEEE % +% % +% % +% MagickCore Image Feature Methods % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/animate.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/cache-private.h" +#include "magick/cache-view.h" +#include "magick/channel.h" +#include "magick/client.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/composite.h" +#include "magick/composite-private.h" +#include "magick/compress.h" +#include "magick/constitute.h" +#include "magick/deprecate.h" +#include "magick/display.h" +#include "magick/draw.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/feature.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/list.h" +#include "magick/image-private.h" +#include "magick/magic.h" +#include "magick/magick.h" +#include "magick/matrix.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/morphology-private.h" +#include "magick/option.h" +#include "magick/paint.h" +#include "magick/pixel-private.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/random_.h" +#include "magick/resource_.h" +#include "magick/segment.h" +#include "magick/semaphore.h" +#include "magick/signature-private.h" +#include "magick/string_.h" +#include "magick/thread-private.h" +#include "magick/timer.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/version.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C a n n y E d g e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CannyEdgeImage() uses a multi-stage algorithm to detect a wide range of +% edges in images. +% +% The format of the CannyEdgeImage method is: +% +% Image *CannyEdgeImage(const Image *image,const double radius, +% const double sigma,const double lower_percent, +% const double upper_percent,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o radius: the radius of the gaussian smoothing filter. +% +% o sigma: the sigma of the gaussian smoothing filter. +% +% o lower_percent: percentage of edge pixels in the lower threshold. +% +% o upper_percent: percentage of edge pixels in the upper threshold. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +typedef struct _CannyInfo +{ + double + magnitude, + intensity; + + int + orientation; + + ssize_t + x, + y; +} CannyInfo; + +static inline MagickBooleanType IsAuthenticPixel(const Image *image, + const ssize_t x,const ssize_t y) +{ + if ((x < 0) || (x >= (ssize_t) image->columns)) + return(MagickFalse); + if ((y < 0) || (y >= (ssize_t) image->rows)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType TraceEdges(Image *edge_image,CacheView *edge_view, + MatrixInfo *canny_cache,const ssize_t x,const ssize_t y, + const double lower_threshold,ExceptionInfo *exception) +{ + CannyInfo + edge, + pixel; + + MagickBooleanType + status; + + PixelPacket + *q; + + ssize_t + i; + + q=GetCacheViewAuthenticPixels(edge_view,x,y,1,1,exception); + if (q == (PixelPacket *) NULL) + return(MagickFalse); + q->red=QuantumRange; + q->green=QuantumRange; + q->blue=QuantumRange; + status=SyncCacheViewAuthenticPixels(edge_view,exception); + if (status == MagickFalse) + return(MagickFalse); + if (GetMatrixElement(canny_cache,0,0,&edge) == MagickFalse) + return(MagickFalse); + edge.x=x; + edge.y=y; + if (SetMatrixElement(canny_cache,0,0,&edge) == MagickFalse) + return(MagickFalse); + for (i=1; i != 0; ) + { + ssize_t + v; + + i--; + status=GetMatrixElement(canny_cache,i,0,&edge); + if (status == MagickFalse) + return(MagickFalse); + for (v=(-1); v <= 1; v++) + { + ssize_t + u; + + for (u=(-1); u <= 1; u++) + { + if ((u == 0) && (v == 0)) + continue; + if (IsAuthenticPixel(edge_image,edge.x+u,edge.y+v) == MagickFalse) + continue; + /* + Not an edge if gradient value is below the lower threshold. + */ + q=GetCacheViewAuthenticPixels(edge_view,edge.x+u,edge.y+v,1,1, + exception); + if (q == (PixelPacket *) NULL) + return(MagickFalse); + status=GetMatrixElement(canny_cache,edge.x+u,edge.y+v,&pixel); + if (status == MagickFalse) + return(MagickFalse); + if ((GetPixelIntensity(edge_image,q) == 0.0) && + (pixel.intensity >= lower_threshold)) + { + q->red=QuantumRange; + q->green=QuantumRange; + q->blue=QuantumRange; + status=SyncCacheViewAuthenticPixels(edge_view,exception); + if (status == MagickFalse) + return(MagickFalse); + edge.x+=u; + edge.y+=v; + status=SetMatrixElement(canny_cache,i,0,&edge); + if (status == MagickFalse) + return(MagickFalse); + i++; + } + } + } + } + return(MagickTrue); +} + +MagickExport Image *CannyEdgeImage(const Image *image,const double radius, + const double sigma,const double lower_percent,const double upper_percent, + ExceptionInfo *exception) +{ +#define CannyEdgeImageTag "CannyEdge/Image" + + CacheView + *edge_view; + + CannyInfo + element; + + char + geometry[MaxTextExtent]; + + double + lower_threshold, + max, + min, + upper_threshold; + + Image + *edge_image; + + KernelInfo + *kernel_info; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MatrixInfo + *canny_cache; + + ssize_t + y; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + /* + Filter out noise. + */ + (void) FormatLocaleString(geometry,MaxTextExtent, + "blur:%.20gx%.20g;blur:%.20gx%.20g+90",radius,sigma,radius,sigma); + kernel_info=AcquireKernelInfo(geometry); + if (kernel_info == (KernelInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + edge_image=MorphologyImageChannel(image,DefaultChannels,ConvolveMorphology,1, + kernel_info,exception); + kernel_info=DestroyKernelInfo(kernel_info); + if (edge_image == (Image *) NULL) + return((Image *) NULL); + if (TransformImageColorspace(edge_image,GRAYColorspace) == MagickFalse) + { + edge_image=DestroyImage(edge_image); + return((Image *) NULL); + } + (void) SetImageAlphaChannel(edge_image,DeactivateAlphaChannel); + /* + Find the intensity gradient of the image. + */ + canny_cache=AcquireMatrixInfo(edge_image->columns,edge_image->rows, + sizeof(CannyInfo),exception); + if (canny_cache == (MatrixInfo *) NULL) + { + edge_image=DestroyImage(edge_image); + return((Image *) NULL); + } + status=MagickTrue; + edge_view=AcquireVirtualCacheView(edge_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(edge_image,edge_image,edge_image->rows,1) +#endif + for (y=0; y < (ssize_t) edge_image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(edge_view,0,y,edge_image->columns+1,2, + exception); + if (p == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) edge_image->columns; x++) + { + CannyInfo + pixel; + + double + dx, + dy; + + const PixelPacket + *magick_restrict kernel_pixels; + + ssize_t + v; + + static double + Gx[2][2] = + { + { -1.0, +1.0 }, + { -1.0, +1.0 } + }, + Gy[2][2] = + { + { +1.0, +1.0 }, + { -1.0, -1.0 } + }; + + (void) memset(&pixel,0,sizeof(pixel)); + dx=0.0; + dy=0.0; + kernel_pixels=p; + for (v=0; v < 2; v++) + { + ssize_t + u; + + for (u=0; u < 2; u++) + { + double + intensity; + + intensity=GetPixelIntensity(edge_image,kernel_pixels+u); + dx+=0.5*Gx[v][u]*intensity; + dy+=0.5*Gy[v][u]*intensity; + } + kernel_pixels+=edge_image->columns+1; + } + pixel.magnitude=hypot(dx,dy); + pixel.orientation=0; + if (fabs(dx) > MagickEpsilon) + { + double + slope; + + slope=dy/dx; + if (slope < 0.0) + { + if (slope < -2.41421356237) + pixel.orientation=0; + else + if (slope < -0.414213562373) + pixel.orientation=1; + else + pixel.orientation=2; + } + else + { + if (slope > 2.41421356237) + pixel.orientation=0; + else + if (slope > 0.414213562373) + pixel.orientation=3; + else + pixel.orientation=2; + } + } + if (SetMatrixElement(canny_cache,x,y,&pixel) == MagickFalse) + continue; + p++; + } + } + edge_view=DestroyCacheView(edge_view); + /* + Non-maxima suppression, remove pixels that are not considered to be part + of an edge. + */ + progress=0; + (void) GetMatrixElement(canny_cache,0,0,&element); + max=element.intensity; + min=element.intensity; + edge_view=AcquireAuthenticCacheView(edge_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(edge_image,edge_image,edge_image->rows,1) +#endif + for (y=0; y < (ssize_t) edge_image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(edge_view,0,y,edge_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) edge_image->columns; x++) + { + CannyInfo + alpha_pixel, + beta_pixel, + pixel; + + (void) GetMatrixElement(canny_cache,x,y,&pixel); + switch (pixel.orientation) + { + case 0: + default: + { + /* + 0 degrees, north and south. + */ + (void) GetMatrixElement(canny_cache,x,y-1,&alpha_pixel); + (void) GetMatrixElement(canny_cache,x,y+1,&beta_pixel); + break; + } + case 1: + { + /* + 45 degrees, northwest and southeast. + */ + (void) GetMatrixElement(canny_cache,x-1,y-1,&alpha_pixel); + (void) GetMatrixElement(canny_cache,x+1,y+1,&beta_pixel); + break; + } + case 2: + { + /* + 90 degrees, east and west. + */ + (void) GetMatrixElement(canny_cache,x-1,y,&alpha_pixel); + (void) GetMatrixElement(canny_cache,x+1,y,&beta_pixel); + break; + } + case 3: + { + /* + 135 degrees, northeast and southwest. + */ + (void) GetMatrixElement(canny_cache,x+1,y-1,&beta_pixel); + (void) GetMatrixElement(canny_cache,x-1,y+1,&alpha_pixel); + break; + } + } + pixel.intensity=pixel.magnitude; + if ((pixel.magnitude < alpha_pixel.magnitude) || + (pixel.magnitude < beta_pixel.magnitude)) + pixel.intensity=0; + (void) SetMatrixElement(canny_cache,x,y,&pixel); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp critical (MagickCore_CannyEdgeImage) +#endif + { + if (pixel.intensity < min) + min=pixel.intensity; + if (pixel.intensity > max) + max=pixel.intensity; + } + q->red=0; + q->green=0; + q->blue=0; + q++; + } + if (SyncCacheViewAuthenticPixels(edge_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,CannyEdgeImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + edge_view=DestroyCacheView(edge_view); + /* + Estimate hysteresis threshold. + */ + lower_threshold=lower_percent*(max-min)+min; + upper_threshold=upper_percent*(max-min)+min; + /* + Hysteresis threshold. + */ + edge_view=AcquireAuthenticCacheView(edge_image,exception); + for (y=0; y < (ssize_t) edge_image->rows; y++) + { + ssize_t + x; + + if (status == MagickFalse) + continue; + for (x=0; x < (ssize_t) edge_image->columns; x++) + { + CannyInfo + pixel; + + const PixelPacket + *magick_restrict p; + + /* + Edge if pixel gradient higher than upper threshold. + */ + p=GetCacheViewVirtualPixels(edge_view,x,y,1,1,exception); + if (p == (const PixelPacket *) NULL) + continue; + status=GetMatrixElement(canny_cache,x,y,&pixel); + if (status == MagickFalse) + continue; + if ((GetPixelIntensity(edge_image,p) == 0.0) && + (pixel.intensity >= upper_threshold)) + status=TraceEdges(edge_image,edge_view,canny_cache,x,y,lower_threshold, + exception); + } + } + edge_view=DestroyCacheView(edge_view); + /* + Free resources. + */ + canny_cache=DestroyMatrixInfo(canny_cache); + return(edge_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e C h a n n e l F e a t u r e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageChannelFeatures() returns features for each channel in the image in +% each of four directions (horizontal, vertical, left and right diagonals) +% for the specified distance. The features include the angular second +% moment, contrast, correlation, sum of squares: variance, inverse difference +% moment, sum average, sum varience, sum entropy, entropy, difference variance,% difference entropy, information measures of correlation 1, information +% measures of correlation 2, and maximum correlation coefficient. You can +% access the red channel contrast, for example, like this: +% +% channel_features=GetImageChannelFeatures(image,1,exception); +% contrast=channel_features[RedChannel].contrast[0]; +% +% Use MagickRelinquishMemory() to free the features buffer. +% +% The format of the GetImageChannelFeatures method is: +% +% ChannelFeatures *GetImageChannelFeatures(const Image *image, +% const size_t distance,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o distance: the distance. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline double MagickLog10(const double x) +{ +#define Log10Epsilon (1.0e-11) + + if (fabs(x) < Log10Epsilon) + return(log10(Log10Epsilon)); + return(log10(fabs(x))); +} + +MagickExport ChannelFeatures *GetImageChannelFeatures(const Image *image, + const size_t distance,ExceptionInfo *exception) +{ + typedef struct _ChannelStatistics + { + DoublePixelPacket + direction[4]; /* horizontal, vertical, left and right diagonals */ + } ChannelStatistics; + + CacheView + *image_view; + + ChannelFeatures + *channel_features; + + ChannelStatistics + **cooccurrence, + correlation, + *density_x, + *density_xy, + *density_y, + entropy_x, + entropy_xy, + entropy_xy1, + entropy_xy2, + entropy_y, + mean, + **Q, + *sum, + sum_squares, + variance; + + LongPixelPacket + gray, + *grays; + + MagickBooleanType + status; + + ssize_t + i; + + size_t + length; + + ssize_t + y; + + unsigned int + number_grays; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((image->columns < (distance+1)) || (image->rows < (distance+1))) + return((ChannelFeatures *) NULL); + length=CompositeChannels+1UL; + channel_features=(ChannelFeatures *) AcquireQuantumMemory(length, + sizeof(*channel_features)); + if (channel_features == (ChannelFeatures *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(channel_features,0,length* + sizeof(*channel_features)); + /* + Form grays. + */ + grays=(LongPixelPacket *) AcquireQuantumMemory(MaxMap+1UL,sizeof(*grays)); + if (grays == (LongPixelPacket *) NULL) + { + channel_features=(ChannelFeatures *) RelinquishMagickMemory( + channel_features); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(channel_features); + } + for (i=0; i <= (ssize_t) MaxMap; i++) + { + grays[i].red=(~0U); + grays[i].green=(~0U); + grays[i].blue=(~0U); + grays[i].opacity=(~0U); + grays[i].index=(~0U); + } + status=MagickTrue; + image_view=AcquireVirtualCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + grays[ScaleQuantumToMap(GetPixelRed(p))].red= + ScaleQuantumToMap(GetPixelRed(p)); + grays[ScaleQuantumToMap(GetPixelGreen(p))].green= + ScaleQuantumToMap(GetPixelGreen(p)); + grays[ScaleQuantumToMap(GetPixelBlue(p))].blue= + ScaleQuantumToMap(GetPixelBlue(p)); + if (image->colorspace == CMYKColorspace) + grays[ScaleQuantumToMap(GetPixelIndex(indexes+x))].index= + ScaleQuantumToMap(GetPixelIndex(indexes+x)); + if (image->matte != MagickFalse) + grays[ScaleQuantumToMap(GetPixelOpacity(p))].opacity= + ScaleQuantumToMap(GetPixelOpacity(p)); + p++; + } + } + image_view=DestroyCacheView(image_view); + if (status == MagickFalse) + { + grays=(LongPixelPacket *) RelinquishMagickMemory(grays); + channel_features=(ChannelFeatures *) RelinquishMagickMemory( + channel_features); + return(channel_features); + } + (void) memset(&gray,0,sizeof(gray)); + for (i=0; i <= (ssize_t) MaxMap; i++) + { + if (grays[i].red != ~0U) + grays[(ssize_t) gray.red++].red=grays[i].red; + if (grays[i].green != ~0U) + grays[(ssize_t) gray.green++].green=grays[i].green; + if (grays[i].blue != ~0U) + grays[(ssize_t) gray.blue++].blue=grays[i].blue; + if (image->colorspace == CMYKColorspace) + if (grays[i].index != ~0U) + grays[(ssize_t) gray.index++].index=grays[i].index; + if (image->matte != MagickFalse) + if (grays[i].opacity != ~0U) + grays[(ssize_t) gray.opacity++].opacity=grays[i].opacity; + } + /* + Allocate spatial dependence matrix. + */ + number_grays=gray.red; + if (gray.green > number_grays) + number_grays=gray.green; + if (gray.blue > number_grays) + number_grays=gray.blue; + if (image->colorspace == CMYKColorspace) + if (gray.index > number_grays) + number_grays=gray.index; + if (image->matte != MagickFalse) + if (gray.opacity > number_grays) + number_grays=gray.opacity; + cooccurrence=(ChannelStatistics **) AcquireQuantumMemory(number_grays, + sizeof(*cooccurrence)); + density_x=(ChannelStatistics *) AcquireQuantumMemory(number_grays+1, + 2*sizeof(*density_x)); + density_xy=(ChannelStatistics *) AcquireQuantumMemory(number_grays+1, + 2*sizeof(*density_xy)); + density_y=(ChannelStatistics *) AcquireQuantumMemory(number_grays+1, + 2*sizeof(*density_y)); + Q=(ChannelStatistics **) AcquireQuantumMemory(number_grays,sizeof(*Q)); + sum=(ChannelStatistics *) AcquireQuantumMemory(number_grays,sizeof(*sum)); + if ((cooccurrence == (ChannelStatistics **) NULL) || + (density_x == (ChannelStatistics *) NULL) || + (density_xy == (ChannelStatistics *) NULL) || + (density_y == (ChannelStatistics *) NULL) || + (Q == (ChannelStatistics **) NULL) || + (sum == (ChannelStatistics *) NULL)) + { + if (Q != (ChannelStatistics **) NULL) + { + for (i=0; i < (ssize_t) number_grays; i++) + Q[i]=(ChannelStatistics *) RelinquishMagickMemory(Q[i]); + Q=(ChannelStatistics **) RelinquishMagickMemory(Q); + } + if (sum != (ChannelStatistics *) NULL) + sum=(ChannelStatistics *) RelinquishMagickMemory(sum); + if (density_y != (ChannelStatistics *) NULL) + density_y=(ChannelStatistics *) RelinquishMagickMemory(density_y); + if (density_xy != (ChannelStatistics *) NULL) + density_xy=(ChannelStatistics *) RelinquishMagickMemory(density_xy); + if (density_x != (ChannelStatistics *) NULL) + density_x=(ChannelStatistics *) RelinquishMagickMemory(density_x); + if (cooccurrence != (ChannelStatistics **) NULL) + { + for (i=0; i < (ssize_t) number_grays; i++) + cooccurrence[i]=(ChannelStatistics *) + RelinquishMagickMemory(cooccurrence[i]); + cooccurrence=(ChannelStatistics **) RelinquishMagickMemory( + cooccurrence); + } + grays=(LongPixelPacket *) RelinquishMagickMemory(grays); + channel_features=(ChannelFeatures *) RelinquishMagickMemory( + channel_features); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(channel_features); + } + (void) memset(&correlation,0,sizeof(correlation)); + (void) memset(density_x,0,2*(number_grays+1)*sizeof(*density_x)); + (void) memset(density_xy,0,2*(number_grays+1)*sizeof(*density_xy)); + (void) memset(density_y,0,2*(number_grays+1)*sizeof(*density_y)); + (void) memset(&mean,0,sizeof(mean)); + (void) memset(sum,0,number_grays*sizeof(*sum)); + (void) memset(&sum_squares,0,sizeof(sum_squares)); + (void) memset(density_xy,0,2*number_grays*sizeof(*density_xy)); + (void) memset(&entropy_x,0,sizeof(entropy_x)); + (void) memset(&entropy_xy,0,sizeof(entropy_xy)); + (void) memset(&entropy_xy1,0,sizeof(entropy_xy1)); + (void) memset(&entropy_xy2,0,sizeof(entropy_xy2)); + (void) memset(&entropy_y,0,sizeof(entropy_y)); + (void) memset(&variance,0,sizeof(variance)); + for (i=0; i < (ssize_t) number_grays; i++) + { + cooccurrence[i]=(ChannelStatistics *) AcquireQuantumMemory(number_grays, + sizeof(**cooccurrence)); + Q[i]=(ChannelStatistics *) AcquireQuantumMemory(number_grays,sizeof(**Q)); + if ((cooccurrence[i] == (ChannelStatistics *) NULL) || + (Q[i] == (ChannelStatistics *) NULL)) + break; + (void) memset(cooccurrence[i],0,number_grays* + sizeof(**cooccurrence)); + (void) memset(Q[i],0,number_grays*sizeof(**Q)); + } + if (i < (ssize_t) number_grays) + { + for (i--; i >= 0; i--) + { + if (Q[i] != (ChannelStatistics *) NULL) + Q[i]=(ChannelStatistics *) RelinquishMagickMemory(Q[i]); + if (cooccurrence[i] != (ChannelStatistics *) NULL) + cooccurrence[i]=(ChannelStatistics *) + RelinquishMagickMemory(cooccurrence[i]); + } + Q=(ChannelStatistics **) RelinquishMagickMemory(Q); + cooccurrence=(ChannelStatistics **) RelinquishMagickMemory(cooccurrence); + sum=(ChannelStatistics *) RelinquishMagickMemory(sum); + density_y=(ChannelStatistics *) RelinquishMagickMemory(density_y); + density_xy=(ChannelStatistics *) RelinquishMagickMemory(density_xy); + density_x=(ChannelStatistics *) RelinquishMagickMemory(density_x); + grays=(LongPixelPacket *) RelinquishMagickMemory(grays); + channel_features=(ChannelFeatures *) RelinquishMagickMemory( + channel_features); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(channel_features); + } + /* + Initialize spatial dependence matrix. + */ + status=MagickTrue; + image_view=AcquireVirtualCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + ssize_t + i, + offset, + u, + v; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,-(ssize_t) distance,y,image->columns+ + 2*distance,distance+2,exception); + if (p == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(image_view); + p+=distance; + indexes+=distance; + for (x=0; x < (ssize_t) image->columns; x++) + { + for (i=0; i < 4; i++) + { + switch (i) + { + case 0: + default: + { + /* + Horizontal adjacency. + */ + offset=(ssize_t) distance; + break; + } + case 1: + { + /* + Vertical adjacency. + */ + offset=(ssize_t) (image->columns+2*distance); + break; + } + case 2: + { + /* + Right diagonal adjacency. + */ + offset=(ssize_t) ((image->columns+2*distance)-distance); + break; + } + case 3: + { + /* + Left diagonal adjacency. + */ + offset=(ssize_t) ((image->columns+2*distance)+distance); + break; + } + } + u=0; + v=0; + while (grays[u].red != ScaleQuantumToMap(GetPixelRed(p))) + u++; + while (grays[v].red != ScaleQuantumToMap(GetPixelRed(p+offset))) + v++; + cooccurrence[u][v].direction[i].red++; + cooccurrence[v][u].direction[i].red++; + u=0; + v=0; + while (grays[u].green != ScaleQuantumToMap(GetPixelGreen(p))) + u++; + while (grays[v].green != ScaleQuantumToMap(GetPixelGreen(p+offset))) + v++; + cooccurrence[u][v].direction[i].green++; + cooccurrence[v][u].direction[i].green++; + u=0; + v=0; + while (grays[u].blue != ScaleQuantumToMap(GetPixelBlue(p))) + u++; + while (grays[v].blue != ScaleQuantumToMap((p+offset)->blue)) + v++; + cooccurrence[u][v].direction[i].blue++; + cooccurrence[v][u].direction[i].blue++; + if (image->colorspace == CMYKColorspace) + { + u=0; + v=0; + while (grays[u].index != ScaleQuantumToMap(GetPixelIndex(indexes+x))) + u++; + while (grays[v].index != ScaleQuantumToMap(GetPixelIndex(indexes+x+offset))) + v++; + cooccurrence[u][v].direction[i].index++; + cooccurrence[v][u].direction[i].index++; + } + if (image->matte != MagickFalse) + { + u=0; + v=0; + while (grays[u].opacity != ScaleQuantumToMap(GetPixelOpacity(p))) + u++; + while (grays[v].opacity != ScaleQuantumToMap((p+offset)->opacity)) + v++; + cooccurrence[u][v].direction[i].opacity++; + cooccurrence[v][u].direction[i].opacity++; + } + } + p++; + } + } + grays=(LongPixelPacket *) RelinquishMagickMemory(grays); + image_view=DestroyCacheView(image_view); + if (status == MagickFalse) + { + for (i=0; i < (ssize_t) number_grays; i++) + cooccurrence[i]=(ChannelStatistics *) + RelinquishMagickMemory(cooccurrence[i]); + cooccurrence=(ChannelStatistics **) RelinquishMagickMemory(cooccurrence); + channel_features=(ChannelFeatures *) RelinquishMagickMemory( + channel_features); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(channel_features); + } + /* + Normalize spatial dependence matrix. + */ + for (i=0; i < 4; i++) + { + double + normalize; + + ssize_t + y; + + switch (i) + { + case 0: + default: + { + /* + Horizontal adjacency. + */ + normalize=2.0*image->rows*(image->columns-distance); + break; + } + case 1: + { + /* + Vertical adjacency. + */ + normalize=2.0*(image->rows-distance)*image->columns; + break; + } + case 2: + { + /* + Right diagonal adjacency. + */ + normalize=2.0*(image->rows-distance)*(image->columns-distance); + break; + } + case 3: + { + /* + Left diagonal adjacency. + */ + normalize=2.0*(image->rows-distance)*(image->columns-distance); + break; + } + } + normalize=PerceptibleReciprocal(normalize); + for (y=0; y < (ssize_t) number_grays; y++) + { + ssize_t + x; + + for (x=0; x < (ssize_t) number_grays; x++) + { + cooccurrence[x][y].direction[i].red*=normalize; + cooccurrence[x][y].direction[i].green*=normalize; + cooccurrence[x][y].direction[i].blue*=normalize; + if (image->colorspace == CMYKColorspace) + cooccurrence[x][y].direction[i].index*=normalize; + if (image->matte != MagickFalse) + cooccurrence[x][y].direction[i].opacity*=normalize; + } + } + } + /* + Compute texture features. + */ +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,number_grays,1) +#endif + for (i=0; i < 4; i++) + { + ssize_t + y; + + for (y=0; y < (ssize_t) number_grays; y++) + { + ssize_t + x; + + for (x=0; x < (ssize_t) number_grays; x++) + { + /* + Angular second moment: measure of homogeneity of the image. + */ + channel_features[RedChannel].angular_second_moment[i]+= + cooccurrence[x][y].direction[i].red* + cooccurrence[x][y].direction[i].red; + channel_features[GreenChannel].angular_second_moment[i]+= + cooccurrence[x][y].direction[i].green* + cooccurrence[x][y].direction[i].green; + channel_features[BlueChannel].angular_second_moment[i]+= + cooccurrence[x][y].direction[i].blue* + cooccurrence[x][y].direction[i].blue; + if (image->colorspace == CMYKColorspace) + channel_features[BlackChannel].angular_second_moment[i]+= + cooccurrence[x][y].direction[i].index* + cooccurrence[x][y].direction[i].index; + if (image->matte != MagickFalse) + channel_features[OpacityChannel].angular_second_moment[i]+= + cooccurrence[x][y].direction[i].opacity* + cooccurrence[x][y].direction[i].opacity; + /* + Correlation: measure of linear-dependencies in the image. + */ + sum[y].direction[i].red+=cooccurrence[x][y].direction[i].red; + sum[y].direction[i].green+=cooccurrence[x][y].direction[i].green; + sum[y].direction[i].blue+=cooccurrence[x][y].direction[i].blue; + if (image->colorspace == CMYKColorspace) + sum[y].direction[i].index+=cooccurrence[x][y].direction[i].index; + if (image->matte != MagickFalse) + sum[y].direction[i].opacity+=cooccurrence[x][y].direction[i].opacity; + correlation.direction[i].red+=x*y*cooccurrence[x][y].direction[i].red; + correlation.direction[i].green+=x*y* + cooccurrence[x][y].direction[i].green; + correlation.direction[i].blue+=x*y* + cooccurrence[x][y].direction[i].blue; + if (image->colorspace == CMYKColorspace) + correlation.direction[i].index+=x*y* + cooccurrence[x][y].direction[i].index; + if (image->matte != MagickFalse) + correlation.direction[i].opacity+=x*y* + cooccurrence[x][y].direction[i].opacity; + /* + Inverse Difference Moment. + */ + channel_features[RedChannel].inverse_difference_moment[i]+= + cooccurrence[x][y].direction[i].red/((y-x)*(y-x)+1); + channel_features[GreenChannel].inverse_difference_moment[i]+= + cooccurrence[x][y].direction[i].green/((y-x)*(y-x)+1); + channel_features[BlueChannel].inverse_difference_moment[i]+= + cooccurrence[x][y].direction[i].blue/((y-x)*(y-x)+1); + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].inverse_difference_moment[i]+= + cooccurrence[x][y].direction[i].index/((y-x)*(y-x)+1); + if (image->matte != MagickFalse) + channel_features[OpacityChannel].inverse_difference_moment[i]+= + cooccurrence[x][y].direction[i].opacity/((y-x)*(y-x)+1); + /* + Sum average. + */ + density_xy[y+x+2].direction[i].red+= + cooccurrence[x][y].direction[i].red; + density_xy[y+x+2].direction[i].green+= + cooccurrence[x][y].direction[i].green; + density_xy[y+x+2].direction[i].blue+= + cooccurrence[x][y].direction[i].blue; + if (image->colorspace == CMYKColorspace) + density_xy[y+x+2].direction[i].index+= + cooccurrence[x][y].direction[i].index; + if (image->matte != MagickFalse) + density_xy[y+x+2].direction[i].opacity+= + cooccurrence[x][y].direction[i].opacity; + /* + Entropy. + */ + channel_features[RedChannel].entropy[i]-= + cooccurrence[x][y].direction[i].red* + MagickLog10(cooccurrence[x][y].direction[i].red); + channel_features[GreenChannel].entropy[i]-= + cooccurrence[x][y].direction[i].green* + MagickLog10(cooccurrence[x][y].direction[i].green); + channel_features[BlueChannel].entropy[i]-= + cooccurrence[x][y].direction[i].blue* + MagickLog10(cooccurrence[x][y].direction[i].blue); + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].entropy[i]-= + cooccurrence[x][y].direction[i].index* + MagickLog10(cooccurrence[x][y].direction[i].index); + if (image->matte != MagickFalse) + channel_features[OpacityChannel].entropy[i]-= + cooccurrence[x][y].direction[i].opacity* + MagickLog10(cooccurrence[x][y].direction[i].opacity); + /* + Information Measures of Correlation. + */ + density_x[x].direction[i].red+=cooccurrence[x][y].direction[i].red; + density_x[x].direction[i].green+=cooccurrence[x][y].direction[i].green; + density_x[x].direction[i].blue+=cooccurrence[x][y].direction[i].blue; + if (image->colorspace == CMYKColorspace) + density_x[x].direction[i].index+= + cooccurrence[x][y].direction[i].index; + if (image->matte != MagickFalse) + density_x[x].direction[i].opacity+= + cooccurrence[x][y].direction[i].opacity; + density_y[y].direction[i].red+=cooccurrence[x][y].direction[i].red; + density_y[y].direction[i].green+=cooccurrence[x][y].direction[i].green; + density_y[y].direction[i].blue+=cooccurrence[x][y].direction[i].blue; + if (image->colorspace == CMYKColorspace) + density_y[y].direction[i].index+= + cooccurrence[x][y].direction[i].index; + if (image->matte != MagickFalse) + density_y[y].direction[i].opacity+= + cooccurrence[x][y].direction[i].opacity; + } + mean.direction[i].red+=y*sum[y].direction[i].red; + sum_squares.direction[i].red+=y*y*sum[y].direction[i].red; + mean.direction[i].green+=y*sum[y].direction[i].green; + sum_squares.direction[i].green+=y*y*sum[y].direction[i].green; + mean.direction[i].blue+=y*sum[y].direction[i].blue; + sum_squares.direction[i].blue+=y*y*sum[y].direction[i].blue; + if (image->colorspace == CMYKColorspace) + { + mean.direction[i].index+=y*sum[y].direction[i].index; + sum_squares.direction[i].index+=y*y*sum[y].direction[i].index; + } + if (image->matte != MagickFalse) + { + mean.direction[i].opacity+=y*sum[y].direction[i].opacity; + sum_squares.direction[i].opacity+=y*y*sum[y].direction[i].opacity; + } + } + /* + Correlation: measure of linear-dependencies in the image. + */ + channel_features[RedChannel].correlation[i]= + (correlation.direction[i].red-mean.direction[i].red* + mean.direction[i].red)/(sqrt(sum_squares.direction[i].red- + (mean.direction[i].red*mean.direction[i].red))*sqrt( + sum_squares.direction[i].red-(mean.direction[i].red* + mean.direction[i].red))); + channel_features[GreenChannel].correlation[i]= + (correlation.direction[i].green-mean.direction[i].green* + mean.direction[i].green)/(sqrt(sum_squares.direction[i].green- + (mean.direction[i].green*mean.direction[i].green))*sqrt( + sum_squares.direction[i].green-(mean.direction[i].green* + mean.direction[i].green))); + channel_features[BlueChannel].correlation[i]= + (correlation.direction[i].blue-mean.direction[i].blue* + mean.direction[i].blue)/(sqrt(sum_squares.direction[i].blue- + (mean.direction[i].blue*mean.direction[i].blue))*sqrt( + sum_squares.direction[i].blue-(mean.direction[i].blue* + mean.direction[i].blue))); + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].correlation[i]= + (correlation.direction[i].index-mean.direction[i].index* + mean.direction[i].index)/(sqrt(sum_squares.direction[i].index- + (mean.direction[i].index*mean.direction[i].index))*sqrt( + sum_squares.direction[i].index-(mean.direction[i].index* + mean.direction[i].index))); + if (image->matte != MagickFalse) + channel_features[OpacityChannel].correlation[i]= + (correlation.direction[i].opacity-mean.direction[i].opacity* + mean.direction[i].opacity)/(sqrt(sum_squares.direction[i].opacity- + (mean.direction[i].opacity*mean.direction[i].opacity))*sqrt( + sum_squares.direction[i].opacity-(mean.direction[i].opacity* + mean.direction[i].opacity))); + } + /* + Compute more texture features. + */ +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,number_grays,1) +#endif + for (i=0; i < 4; i++) + { + ssize_t + x; + + for (x=2; x < (ssize_t) (2*number_grays); x++) + { + /* + Sum average. + */ + channel_features[RedChannel].sum_average[i]+= + x*density_xy[x].direction[i].red; + channel_features[GreenChannel].sum_average[i]+= + x*density_xy[x].direction[i].green; + channel_features[BlueChannel].sum_average[i]+= + x*density_xy[x].direction[i].blue; + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].sum_average[i]+= + x*density_xy[x].direction[i].index; + if (image->matte != MagickFalse) + channel_features[OpacityChannel].sum_average[i]+= + x*density_xy[x].direction[i].opacity; + /* + Sum entropy. + */ + channel_features[RedChannel].sum_entropy[i]-= + density_xy[x].direction[i].red* + MagickLog10(density_xy[x].direction[i].red); + channel_features[GreenChannel].sum_entropy[i]-= + density_xy[x].direction[i].green* + MagickLog10(density_xy[x].direction[i].green); + channel_features[BlueChannel].sum_entropy[i]-= + density_xy[x].direction[i].blue* + MagickLog10(density_xy[x].direction[i].blue); + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].sum_entropy[i]-= + density_xy[x].direction[i].index* + MagickLog10(density_xy[x].direction[i].index); + if (image->matte != MagickFalse) + channel_features[OpacityChannel].sum_entropy[i]-= + density_xy[x].direction[i].opacity* + MagickLog10(density_xy[x].direction[i].opacity); + /* + Sum variance. + */ + channel_features[RedChannel].sum_variance[i]+= + (x-channel_features[RedChannel].sum_entropy[i])* + (x-channel_features[RedChannel].sum_entropy[i])* + density_xy[x].direction[i].red; + channel_features[GreenChannel].sum_variance[i]+= + (x-channel_features[GreenChannel].sum_entropy[i])* + (x-channel_features[GreenChannel].sum_entropy[i])* + density_xy[x].direction[i].green; + channel_features[BlueChannel].sum_variance[i]+= + (x-channel_features[BlueChannel].sum_entropy[i])* + (x-channel_features[BlueChannel].sum_entropy[i])* + density_xy[x].direction[i].blue; + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].sum_variance[i]+= + (x-channel_features[IndexChannel].sum_entropy[i])* + (x-channel_features[IndexChannel].sum_entropy[i])* + density_xy[x].direction[i].index; + if (image->matte != MagickFalse) + channel_features[OpacityChannel].sum_variance[i]+= + (x-channel_features[OpacityChannel].sum_entropy[i])* + (x-channel_features[OpacityChannel].sum_entropy[i])* + density_xy[x].direction[i].opacity; + } + } + /* + Compute more texture features. + */ +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,number_grays,1) +#endif + for (i=0; i < 4; i++) + { + ssize_t + y; + + for (y=0; y < (ssize_t) number_grays; y++) + { + ssize_t + x; + + for (x=0; x < (ssize_t) number_grays; x++) + { + /* + Sum of Squares: Variance + */ + variance.direction[i].red+=(y-mean.direction[i].red+1)* + (y-mean.direction[i].red+1)*cooccurrence[x][y].direction[i].red; + variance.direction[i].green+=(y-mean.direction[i].green+1)* + (y-mean.direction[i].green+1)*cooccurrence[x][y].direction[i].green; + variance.direction[i].blue+=(y-mean.direction[i].blue+1)* + (y-mean.direction[i].blue+1)*cooccurrence[x][y].direction[i].blue; + if (image->colorspace == CMYKColorspace) + variance.direction[i].index+=(y-mean.direction[i].index+1)* + (y-mean.direction[i].index+1)*cooccurrence[x][y].direction[i].index; + if (image->matte != MagickFalse) + variance.direction[i].opacity+=(y-mean.direction[i].opacity+1)* + (y-mean.direction[i].opacity+1)* + cooccurrence[x][y].direction[i].opacity; + /* + Sum average / Difference Variance. + */ + density_xy[MagickAbsoluteValue(y-x)].direction[i].red+= + cooccurrence[x][y].direction[i].red; + density_xy[MagickAbsoluteValue(y-x)].direction[i].green+= + cooccurrence[x][y].direction[i].green; + density_xy[MagickAbsoluteValue(y-x)].direction[i].blue+= + cooccurrence[x][y].direction[i].blue; + if (image->colorspace == CMYKColorspace) + density_xy[MagickAbsoluteValue(y-x)].direction[i].index+= + cooccurrence[x][y].direction[i].index; + if (image->matte != MagickFalse) + density_xy[MagickAbsoluteValue(y-x)].direction[i].opacity+= + cooccurrence[x][y].direction[i].opacity; + /* + Information Measures of Correlation. + */ + entropy_xy.direction[i].red-=cooccurrence[x][y].direction[i].red* + MagickLog10(cooccurrence[x][y].direction[i].red); + entropy_xy.direction[i].green-=cooccurrence[x][y].direction[i].green* + MagickLog10(cooccurrence[x][y].direction[i].green); + entropy_xy.direction[i].blue-=cooccurrence[x][y].direction[i].blue* + MagickLog10(cooccurrence[x][y].direction[i].blue); + if (image->colorspace == CMYKColorspace) + entropy_xy.direction[i].index-=cooccurrence[x][y].direction[i].index* + MagickLog10(cooccurrence[x][y].direction[i].index); + if (image->matte != MagickFalse) + entropy_xy.direction[i].opacity-= + cooccurrence[x][y].direction[i].opacity*MagickLog10( + cooccurrence[x][y].direction[i].opacity); + entropy_xy1.direction[i].red-=(cooccurrence[x][y].direction[i].red* + MagickLog10(density_x[x].direction[i].red* + density_y[y].direction[i].red)); + entropy_xy1.direction[i].green-=(cooccurrence[x][y].direction[i].green* + MagickLog10(density_x[x].direction[i].green* + density_y[y].direction[i].green)); + entropy_xy1.direction[i].blue-=(cooccurrence[x][y].direction[i].blue* + MagickLog10(density_x[x].direction[i].blue* + density_y[y].direction[i].blue)); + if (image->colorspace == CMYKColorspace) + entropy_xy1.direction[i].index-=( + cooccurrence[x][y].direction[i].index*MagickLog10( + density_x[x].direction[i].index*density_y[y].direction[i].index)); + if (image->matte != MagickFalse) + entropy_xy1.direction[i].opacity-=( + cooccurrence[x][y].direction[i].opacity*MagickLog10( + density_x[x].direction[i].opacity* + density_y[y].direction[i].opacity)); + entropy_xy2.direction[i].red-=(density_x[x].direction[i].red* + density_y[y].direction[i].red*MagickLog10( + density_x[x].direction[i].red*density_y[y].direction[i].red)); + entropy_xy2.direction[i].green-=(density_x[x].direction[i].green* + density_y[y].direction[i].green*MagickLog10( + density_x[x].direction[i].green*density_y[y].direction[i].green)); + entropy_xy2.direction[i].blue-=(density_x[x].direction[i].blue* + density_y[y].direction[i].blue*MagickLog10( + density_x[x].direction[i].blue*density_y[y].direction[i].blue)); + if (image->colorspace == CMYKColorspace) + entropy_xy2.direction[i].index-=(density_x[x].direction[i].index* + density_y[y].direction[i].index*MagickLog10( + density_x[x].direction[i].index*density_y[y].direction[i].index)); + if (image->matte != MagickFalse) + entropy_xy2.direction[i].opacity-=(density_x[x].direction[i].opacity* + density_y[y].direction[i].opacity*MagickLog10( + density_x[x].direction[i].opacity* + density_y[y].direction[i].opacity)); + } + } + channel_features[RedChannel].variance_sum_of_squares[i]= + variance.direction[i].red; + channel_features[GreenChannel].variance_sum_of_squares[i]= + variance.direction[i].green; + channel_features[BlueChannel].variance_sum_of_squares[i]= + variance.direction[i].blue; + if (image->colorspace == CMYKColorspace) + channel_features[RedChannel].variance_sum_of_squares[i]= + variance.direction[i].index; + if (image->matte != MagickFalse) + channel_features[RedChannel].variance_sum_of_squares[i]= + variance.direction[i].opacity; + } + /* + Compute more texture features. + */ + (void) memset(&variance,0,sizeof(variance)); + (void) memset(&sum_squares,0,sizeof(sum_squares)); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,number_grays,1) +#endif + for (i=0; i < 4; i++) + { + ssize_t + x; + + for (x=0; x < (ssize_t) number_grays; x++) + { + /* + Difference variance. + */ + variance.direction[i].red+=density_xy[x].direction[i].red; + variance.direction[i].green+=density_xy[x].direction[i].green; + variance.direction[i].blue+=density_xy[x].direction[i].blue; + if (image->colorspace == CMYKColorspace) + variance.direction[i].index+=density_xy[x].direction[i].index; + if (image->matte != MagickFalse) + variance.direction[i].opacity+=density_xy[x].direction[i].opacity; + sum_squares.direction[i].red+=density_xy[x].direction[i].red* + density_xy[x].direction[i].red; + sum_squares.direction[i].green+=density_xy[x].direction[i].green* + density_xy[x].direction[i].green; + sum_squares.direction[i].blue+=density_xy[x].direction[i].blue* + density_xy[x].direction[i].blue; + if (image->colorspace == CMYKColorspace) + sum_squares.direction[i].index+=density_xy[x].direction[i].index* + density_xy[x].direction[i].index; + if (image->matte != MagickFalse) + sum_squares.direction[i].opacity+=density_xy[x].direction[i].opacity* + density_xy[x].direction[i].opacity; + /* + Difference entropy. + */ + channel_features[RedChannel].difference_entropy[i]-= + density_xy[x].direction[i].red* + MagickLog10(density_xy[x].direction[i].red); + channel_features[GreenChannel].difference_entropy[i]-= + density_xy[x].direction[i].green* + MagickLog10(density_xy[x].direction[i].green); + channel_features[BlueChannel].difference_entropy[i]-= + density_xy[x].direction[i].blue* + MagickLog10(density_xy[x].direction[i].blue); + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].difference_entropy[i]-= + density_xy[x].direction[i].index* + MagickLog10(density_xy[x].direction[i].index); + if (image->matte != MagickFalse) + channel_features[OpacityChannel].difference_entropy[i]-= + density_xy[x].direction[i].opacity* + MagickLog10(density_xy[x].direction[i].opacity); + /* + Information Measures of Correlation. + */ + entropy_x.direction[i].red-=(density_x[x].direction[i].red* + MagickLog10(density_x[x].direction[i].red)); + entropy_x.direction[i].green-=(density_x[x].direction[i].green* + MagickLog10(density_x[x].direction[i].green)); + entropy_x.direction[i].blue-=(density_x[x].direction[i].blue* + MagickLog10(density_x[x].direction[i].blue)); + if (image->colorspace == CMYKColorspace) + entropy_x.direction[i].index-=(density_x[x].direction[i].index* + MagickLog10(density_x[x].direction[i].index)); + if (image->matte != MagickFalse) + entropy_x.direction[i].opacity-=(density_x[x].direction[i].opacity* + MagickLog10(density_x[x].direction[i].opacity)); + entropy_y.direction[i].red-=(density_y[x].direction[i].red* + MagickLog10(density_y[x].direction[i].red)); + entropy_y.direction[i].green-=(density_y[x].direction[i].green* + MagickLog10(density_y[x].direction[i].green)); + entropy_y.direction[i].blue-=(density_y[x].direction[i].blue* + MagickLog10(density_y[x].direction[i].blue)); + if (image->colorspace == CMYKColorspace) + entropy_y.direction[i].index-=(density_y[x].direction[i].index* + MagickLog10(density_y[x].direction[i].index)); + if (image->matte != MagickFalse) + entropy_y.direction[i].opacity-=(density_y[x].direction[i].opacity* + MagickLog10(density_y[x].direction[i].opacity)); + } + /* + Difference variance. + */ + channel_features[RedChannel].difference_variance[i]= + (((double) number_grays*number_grays*sum_squares.direction[i].red)- + (variance.direction[i].red*variance.direction[i].red))/ + ((double) number_grays*number_grays*number_grays*number_grays); + channel_features[GreenChannel].difference_variance[i]= + (((double) number_grays*number_grays*sum_squares.direction[i].green)- + (variance.direction[i].green*variance.direction[i].green))/ + ((double) number_grays*number_grays*number_grays*number_grays); + channel_features[BlueChannel].difference_variance[i]= + (((double) number_grays*number_grays*sum_squares.direction[i].blue)- + (variance.direction[i].blue*variance.direction[i].blue))/ + ((double) number_grays*number_grays*number_grays*number_grays); + if (image->matte != MagickFalse) + channel_features[OpacityChannel].difference_variance[i]= + (((double) number_grays*number_grays*sum_squares.direction[i].opacity)- + (variance.direction[i].opacity*variance.direction[i].opacity))/ + ((double) number_grays*number_grays*number_grays*number_grays); + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].difference_variance[i]= + (((double) number_grays*number_grays*sum_squares.direction[i].index)- + (variance.direction[i].index*variance.direction[i].index))/ + ((double) number_grays*number_grays*number_grays*number_grays); + /* + Information Measures of Correlation. + */ + channel_features[RedChannel].measure_of_correlation_1[i]= + (entropy_xy.direction[i].red-entropy_xy1.direction[i].red)/ + (entropy_x.direction[i].red > entropy_y.direction[i].red ? + entropy_x.direction[i].red : entropy_y.direction[i].red); + channel_features[GreenChannel].measure_of_correlation_1[i]= + (entropy_xy.direction[i].green-entropy_xy1.direction[i].green)/ + (entropy_x.direction[i].green > entropy_y.direction[i].green ? + entropy_x.direction[i].green : entropy_y.direction[i].green); + channel_features[BlueChannel].measure_of_correlation_1[i]= + (entropy_xy.direction[i].blue-entropy_xy1.direction[i].blue)/ + (entropy_x.direction[i].blue > entropy_y.direction[i].blue ? + entropy_x.direction[i].blue : entropy_y.direction[i].blue); + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].measure_of_correlation_1[i]= + (entropy_xy.direction[i].index-entropy_xy1.direction[i].index)/ + (entropy_x.direction[i].index > entropy_y.direction[i].index ? + entropy_x.direction[i].index : entropy_y.direction[i].index); + if (image->matte != MagickFalse) + channel_features[OpacityChannel].measure_of_correlation_1[i]= + (entropy_xy.direction[i].opacity-entropy_xy1.direction[i].opacity)/ + (entropy_x.direction[i].opacity > entropy_y.direction[i].opacity ? + entropy_x.direction[i].opacity : entropy_y.direction[i].opacity); + channel_features[RedChannel].measure_of_correlation_2[i]= + (sqrt(fabs(1.0-exp(-2.0*(entropy_xy2.direction[i].red- + entropy_xy.direction[i].red))))); + channel_features[GreenChannel].measure_of_correlation_2[i]= + (sqrt(fabs(1.0-exp(-2.0*(entropy_xy2.direction[i].green- + entropy_xy.direction[i].green))))); + channel_features[BlueChannel].measure_of_correlation_2[i]= + (sqrt(fabs(1.0-exp(-2.0*(entropy_xy2.direction[i].blue- + entropy_xy.direction[i].blue))))); + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].measure_of_correlation_2[i]= + (sqrt(fabs(1.0-exp(-2.0*(entropy_xy2.direction[i].index- + entropy_xy.direction[i].index))))); + if (image->matte != MagickFalse) + channel_features[OpacityChannel].measure_of_correlation_2[i]= + (sqrt(fabs(1.0-exp(-2.0*(entropy_xy2.direction[i].opacity- + entropy_xy.direction[i].opacity))))); + } + /* + Compute more texture features. + */ +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,number_grays,1) +#endif + for (i=0; i < 4; i++) + { + ssize_t + z; + + for (z=0; z < (ssize_t) number_grays; z++) + { + ssize_t + y; + + ChannelStatistics + pixel; + + (void) memset(&pixel,0,sizeof(pixel)); + for (y=0; y < (ssize_t) number_grays; y++) + { + ssize_t + x; + + for (x=0; x < (ssize_t) number_grays; x++) + { + /* + Contrast: amount of local variations present in an image. + */ + if (((y-x) == z) || ((x-y) == z)) + { + pixel.direction[i].red+=cooccurrence[x][y].direction[i].red; + pixel.direction[i].green+=cooccurrence[x][y].direction[i].green; + pixel.direction[i].blue+=cooccurrence[x][y].direction[i].blue; + if (image->colorspace == CMYKColorspace) + pixel.direction[i].index+=cooccurrence[x][y].direction[i].index; + if (image->matte != MagickFalse) + pixel.direction[i].opacity+= + cooccurrence[x][y].direction[i].opacity; + } + /* + Maximum Correlation Coefficient. + */ + if ((fabs(density_x[z].direction[i].red) > MagickEpsilon) && + (fabs(density_y[x].direction[i].red) > MagickEpsilon)) + Q[z][y].direction[i].red+=cooccurrence[z][x].direction[i].red* + cooccurrence[y][x].direction[i].red/density_x[z].direction[i].red/ + density_y[x].direction[i].red; + if ((fabs(density_x[z].direction[i].green) > MagickEpsilon) && + (fabs(density_y[x].direction[i].red) > MagickEpsilon)) + Q[z][y].direction[i].green+=cooccurrence[z][x].direction[i].green* + cooccurrence[y][x].direction[i].green/ + density_x[z].direction[i].green/density_y[x].direction[i].red; + if ((fabs(density_x[z].direction[i].blue) > MagickEpsilon) && + (fabs(density_y[x].direction[i].blue) > MagickEpsilon)) + Q[z][y].direction[i].blue+=cooccurrence[z][x].direction[i].blue* + cooccurrence[y][x].direction[i].blue/ + density_x[z].direction[i].blue/density_y[x].direction[i].blue; + if (image->colorspace == CMYKColorspace) + if ((fabs(density_x[z].direction[i].index) > MagickEpsilon) && + (fabs(density_y[x].direction[i].index) > MagickEpsilon)) + Q[z][y].direction[i].index+=cooccurrence[z][x].direction[i].index* + cooccurrence[y][x].direction[i].index/ + density_x[z].direction[i].index/density_y[x].direction[i].index; + if (image->matte != MagickFalse) + if ((fabs(density_x[z].direction[i].opacity) > MagickEpsilon) && + (fabs(density_y[x].direction[i].opacity) > MagickEpsilon)) + Q[z][y].direction[i].opacity+= + cooccurrence[z][x].direction[i].opacity* + cooccurrence[y][x].direction[i].opacity/ + density_x[z].direction[i].opacity/ + density_y[x].direction[i].opacity; + } + } + channel_features[RedChannel].contrast[i]+=z*z*pixel.direction[i].red; + channel_features[GreenChannel].contrast[i]+=z*z*pixel.direction[i].green; + channel_features[BlueChannel].contrast[i]+=z*z*pixel.direction[i].blue; + if (image->colorspace == CMYKColorspace) + channel_features[BlackChannel].contrast[i]+=z*z* + pixel.direction[i].index; + if (image->matte != MagickFalse) + channel_features[OpacityChannel].contrast[i]+=z*z* + pixel.direction[i].opacity; + } + /* + Maximum Correlation Coefficient. + Future: return second largest eigenvalue of Q. + */ + channel_features[RedChannel].maximum_correlation_coefficient[i]= + sqrt((double) -1.0); + channel_features[GreenChannel].maximum_correlation_coefficient[i]= + sqrt((double) -1.0); + channel_features[BlueChannel].maximum_correlation_coefficient[i]= + sqrt((double) -1.0); + if (image->colorspace == CMYKColorspace) + channel_features[IndexChannel].maximum_correlation_coefficient[i]= + sqrt((double) -1.0); + if (image->matte != MagickFalse) + channel_features[OpacityChannel].maximum_correlation_coefficient[i]= + sqrt((double) -1.0); + } + /* + Relinquish resources. + */ + sum=(ChannelStatistics *) RelinquishMagickMemory(sum); + for (i=0; i < (ssize_t) number_grays; i++) + Q[i]=(ChannelStatistics *) RelinquishMagickMemory(Q[i]); + Q=(ChannelStatistics **) RelinquishMagickMemory(Q); + density_y=(ChannelStatistics *) RelinquishMagickMemory(density_y); + density_xy=(ChannelStatistics *) RelinquishMagickMemory(density_xy); + density_x=(ChannelStatistics *) RelinquishMagickMemory(density_x); + for (i=0; i < (ssize_t) number_grays; i++) + cooccurrence[i]=(ChannelStatistics *) + RelinquishMagickMemory(cooccurrence[i]); + cooccurrence=(ChannelStatistics **) RelinquishMagickMemory(cooccurrence); + return(channel_features); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H o u g h L i n e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Use HoughLineImage() in conjunction with any binary edge extracted image (we +% recommand Canny) to identify lines in the image. The algorithm accumulates +% counts for every white pixel for every possible orientation (for angles from +% 0 to 179 in 1 degree increments) and distance from the center of the image to +% the corner (in 1 px increments) and stores the counts in an accumulator +% matrix of angle vs distance. The size of the accumulator is 180x(diagonal/2).% Next it searches this space for peaks in counts and converts the locations +% of the peaks to slope and intercept in the normal x,y input image space. Use +% the slope/intercepts to find the endpoints clipped to the bounds of the +% image. The lines are then drawn. The counts are a measure of the length of +% the lines. +% +% The format of the HoughLineImage method is: +% +% Image *HoughLineImage(const Image *image,const size_t width, +% const size_t height,const size_t threshold,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o width, height: find line pairs as local maxima in this neighborhood. +% +% o threshold: the line count threshold. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline double MagickRound(double x) +{ + /* + Round the fraction to nearest integer. + */ + if ((x-floor(x)) < (ceil(x)-x)) + return(floor(x)); + return(ceil(x)); +} + +static Image *RenderHoughLines(const ImageInfo *image_info,const size_t columns, + const size_t rows,ExceptionInfo *exception) +{ +#define BoundingBox "viewbox" + + DrawInfo + *draw_info; + + Image + *image; + + MagickBooleanType + status; + + /* + Open image. + */ + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + image->columns=columns; + image->rows=rows; + draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL); + draw_info->affine.sx=image->x_resolution == 0.0 ? 1.0 : image->x_resolution/ + DefaultResolution; + draw_info->affine.sy=image->y_resolution == 0.0 ? 1.0 : image->y_resolution/ + DefaultResolution; + image->columns=(size_t) (draw_info->affine.sx*image->columns); + image->rows=(size_t) (draw_info->affine.sy*image->rows); + status=SetImageExtent(image,image->columns,image->rows); + if (status == MagickFalse) + return(DestroyImageList(image)); + if (SetImageBackgroundColor(image) == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Render drawing. + */ + if (GetBlobStreamData(image) == (unsigned char *) NULL) + draw_info->primitive=FileToString(image->filename,~0UL,exception); + else + { + draw_info->primitive=(char *) AcquireQuantumMemory(1,(size_t) + GetBlobSize(image)+1); + if (draw_info->primitive != (char *) NULL) + { + (void) memcpy(draw_info->primitive,GetBlobStreamData(image), + (size_t) GetBlobSize(image)); + draw_info->primitive[GetBlobSize(image)]='\0'; + } + } + (void) DrawImage(image,draw_info); + draw_info=DestroyDrawInfo(draw_info); + (void) CloseBlob(image); + return(GetFirstImageInList(image)); +} + +MagickExport Image *HoughLineImage(const Image *image,const size_t width, + const size_t height,const size_t threshold,ExceptionInfo *exception) +{ +#define HoughLineImageTag "HoughLine/Image" + + CacheView + *image_view; + + char + message[MaxTextExtent], + path[MaxTextExtent]; + + const char + *artifact; + + double + hough_height; + + Image + *lines_image = NULL; + + ImageInfo + *image_info; + + int + file; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + MatrixInfo + *accumulator; + + PointInfo + center; + + ssize_t + y; + + size_t + accumulator_height, + accumulator_width, + line_count; + + /* + Create the accumulator. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + accumulator_width=180; + hough_height=((sqrt(2.0)*(double) (image->rows > image->columns ? + image->rows : image->columns))/2.0); + accumulator_height=(size_t) (2.0*hough_height); + accumulator=AcquireMatrixInfo(accumulator_width,accumulator_height, + sizeof(double),exception); + if (accumulator == (MatrixInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + if (NullMatrix(accumulator) == MagickFalse) + { + accumulator=DestroyMatrixInfo(accumulator); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Populate the accumulator. + */ + status=MagickTrue; + progress=0; + center.x=(double) image->columns/2.0; + center.y=(double) image->rows/2.0; + image_view=AcquireVirtualCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelIntensity(image,p) > (QuantumRange/2.0)) + { + ssize_t + i; + + for (i=0; i < 180; i++) + { + double + count, + radius; + + radius=(((double) x-center.x)*cos(DegreesToRadians((double) i)))+ + (((double) y-center.y)*sin(DegreesToRadians((double) i))); + (void) GetMatrixElement(accumulator,i,(ssize_t) + MagickRound(radius+hough_height),&count); + count++; + (void) SetMatrixElement(accumulator,i,(ssize_t) + MagickRound(radius+hough_height),&count); + } + } + p++; + } + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,HoughLineImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + if (status == MagickFalse) + { + accumulator=DestroyMatrixInfo(accumulator); + return((Image *) NULL); + } + /* + Generate line segments from accumulator. + */ + file=AcquireUniqueFileResource(path); + if (file == -1) + { + accumulator=DestroyMatrixInfo(accumulator); + return((Image *) NULL); + } + (void) FormatLocaleString(message,MaxTextExtent, + "# Hough line transform: %.20gx%.20g%+.20g\n",(double) width, + (double) height,(double) threshold); + if (write(file,message,strlen(message)) != (ssize_t) strlen(message)) + status=MagickFalse; + (void) FormatLocaleString(message,MaxTextExtent,"viewbox 0 0 %.20g %.20g\n", + (double) image->columns,(double) image->rows); + if (write(file,message,strlen(message)) != (ssize_t) strlen(message)) + status=MagickFalse; + (void) FormatLocaleString(message,MaxTextExtent, + "# x1,y1 x2,y2 # count angle distance\n"); + if (write(file,message,strlen(message)) != (ssize_t) strlen(message)) + status=MagickFalse; + line_count=image->columns > image->rows ? image->columns/4 : image->rows/4; + if (threshold != 0) + line_count=threshold; + for (y=0; y < (ssize_t) accumulator_height; y++) + { + ssize_t + x; + + for (x=0; x < (ssize_t) accumulator_width; x++) + { + double + count; + + (void) GetMatrixElement(accumulator,x,y,&count); + if (count >= (double) line_count) + { + double + maxima; + + SegmentInfo + line; + + ssize_t + v; + + /* + Is point a local maxima? + */ + maxima=count; + for (v=(-((ssize_t) height/2)); v <= (((ssize_t) height/2)); v++) + { + ssize_t + u; + + for (u=(-((ssize_t) width/2)); u <= (((ssize_t) width/2)); u++) + { + if ((u != 0) || (v !=0)) + { + (void) GetMatrixElement(accumulator,x+u,y+v,&count); + if (count > maxima) + { + maxima=count; + break; + } + } + } + if (u < (ssize_t) (width/2)) + break; + } + (void) GetMatrixElement(accumulator,x,y,&count); + if (maxima > count) + continue; + if ((x >= 45) && (x <= 135)) + { + /* + y = (r-x cos(t))/sin(t) + */ + line.x1=0.0; + line.y1=((double) (y-(accumulator_height/2.0))-((line.x1- + (image->columns/2.0))*cos(DegreesToRadians((double) x))))/ + sin(DegreesToRadians((double) x))+(image->rows/2.0); + line.x2=(double) image->columns; + line.y2=((double) (y-(accumulator_height/2.0))-((line.x2- + (image->columns/2.0))*cos(DegreesToRadians((double) x))))/ + sin(DegreesToRadians((double) x))+(image->rows/2.0); + } + else + { + /* + x = (r-y cos(t))/sin(t) + */ + line.y1=0.0; + line.x1=((double) (y-(accumulator_height/2.0))-((line.y1- + (image->rows/2.0))*sin(DegreesToRadians((double) x))))/ + cos(DegreesToRadians((double) x))+(image->columns/2.0); + line.y2=(double) image->rows; + line.x2=((double) (y-(accumulator_height/2.0))-((line.y2- + (image->rows/2.0))*sin(DegreesToRadians((double) x))))/ + cos(DegreesToRadians((double) x))+(image->columns/2.0); + } + (void) FormatLocaleString(message,MaxTextExtent, + "line %g,%g %g,%g # %g %g %g\n",line.x1,line.y1,line.x2,line.y2, + maxima,(double) x,(double) y); + if (write(file,message,strlen(message)) != (ssize_t) strlen(message)) + status=MagickFalse; + } + } + } + (void) close(file); + /* + Render lines to image canvas. + */ + image_info=AcquireImageInfo(); + image_info->background_color=image->background_color; + (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s",path); + artifact=GetImageArtifact(image,"background"); + if (artifact != (const char *) NULL) + (void) SetImageOption(image_info,"background",artifact); + artifact=GetImageArtifact(image,"fill"); + if (artifact != (const char *) NULL) + (void) SetImageOption(image_info,"fill",artifact); + artifact=GetImageArtifact(image,"stroke"); + if (artifact != (const char *) NULL) + (void) SetImageOption(image_info,"stroke",artifact); + artifact=GetImageArtifact(image,"strokewidth"); + if (artifact != (const char *) NULL) + (void) SetImageOption(image_info,"strokewidth",artifact); + lines_image=RenderHoughLines(image_info,image->columns,image->rows,exception); + artifact=GetImageArtifact(image,"hough-lines:accumulator"); + if ((lines_image != (Image *) NULL) && + (IsMagickTrue(artifact) != MagickFalse)) + { + Image + *accumulator_image; + + accumulator_image=MatrixToImage(accumulator,exception); + if (accumulator_image != (Image *) NULL) + AppendImageToList(&lines_image,accumulator_image); + } + /* + Free resources. + */ + accumulator=DestroyMatrixInfo(accumulator); + image_info=DestroyImageInfo(image_info); + (void) RelinquishUniqueFileResource(path); + return(GetFirstImageInList(lines_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M e a n S h i f t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MeanShiftImage() delineate arbitrarily shaped clusters in the image. For +% each pixel, it visits all the pixels in the neighborhood specified by +% the window centered at the pixel and excludes those that are outside the +% radius=(window-1)/2 surrounding the pixel. From those pixels, it finds those +% that are within the specified color distance from the current mean, and +% computes a new x,y centroid from those coordinates and a new mean. This new +% x,y centroid is used as the center for a new window. This process iterates +% until it converges and the final mean is replaces the (original window +% center) pixel value. It repeats this process for the next pixel, etc., +% until it processes all pixels in the image. Results are typically better with +% colorspaces other than sRGB. We recommend YIQ, YUV or YCbCr. +% +% The format of the MeanShiftImage method is: +% +% Image *MeanShiftImage(const Image *image,const size_t width, +% const size_t height,const double color_distance, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o width, height: find pixels in this neighborhood. +% +% o color_distance: the color distance. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *MeanShiftImage(const Image *image,const size_t width, + const size_t height,const double color_distance,ExceptionInfo *exception) +{ +#define MaxMeanShiftIterations 100 +#define MeanShiftImageTag "MeanShift/Image" + + CacheView + *image_view, + *mean_view, + *pixel_view; + + Image + *mean_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + mean_image=CloneImage(image,0,0,MagickTrue,exception); + if (mean_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(mean_image,DirectClass) == MagickFalse) + { + InheritException(exception,&mean_image->exception); + mean_image=DestroyImage(mean_image); + return((Image *) NULL); + } + status=MagickTrue; + progress=0; + image_view=AcquireVirtualCacheView(image,exception); + pixel_view=AcquireVirtualCacheView(image,exception); + mean_view=AcquireAuthenticCacheView(mean_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status,progress) \ + magick_number_threads(mean_image,mean_image,mean_image->rows,1) +#endif + for (y=0; y < (ssize_t) mean_image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + q=GetCacheViewAuthenticPixels(mean_view,0,y,mean_image->columns,1, + exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(image_view); + for (x=0; x < (ssize_t) mean_image->columns; x++) + { + MagickPixelPacket + mean_pixel, + previous_pixel; + + PointInfo + mean_location, + previous_location; + + ssize_t + i; + + GetMagickPixelPacket(image,&mean_pixel); + SetMagickPixelPacket(image,p,indexes+x,&mean_pixel); + mean_location.x=(double) x; + mean_location.y=(double) y; + for (i=0; i < MaxMeanShiftIterations; i++) + { + double + distance, + gamma; + + MagickPixelPacket + sum_pixel; + + PointInfo + sum_location; + + ssize_t + count, + v; + + sum_location.x=0.0; + sum_location.y=0.0; + GetMagickPixelPacket(image,&sum_pixel); + previous_location=mean_location; + previous_pixel=mean_pixel; + count=0; + for (v=(-((ssize_t) height/2)); v <= (((ssize_t) height/2)); v++) + { + ssize_t + u; + + for (u=(-((ssize_t) width/2)); u <= (((ssize_t) width/2)); u++) + { + if ((v*v+u*u) <= (ssize_t) ((width/2)*(height/2))) + { + PixelPacket + pixel; + + status=GetOneCacheViewVirtualPixel(pixel_view,(ssize_t) + MagickRound(mean_location.x+u),(ssize_t) MagickRound( + mean_location.y+v),&pixel,exception); + distance=(mean_pixel.red-pixel.red)*(mean_pixel.red-pixel.red)+ + (mean_pixel.green-pixel.green)*(mean_pixel.green-pixel.green)+ + (mean_pixel.blue-pixel.blue)*(mean_pixel.blue-pixel.blue); + if (distance <= (color_distance*color_distance)) + { + sum_location.x+=mean_location.x+u; + sum_location.y+=mean_location.y+v; + sum_pixel.red+=pixel.red; + sum_pixel.green+=pixel.green; + sum_pixel.blue+=pixel.blue; + sum_pixel.opacity+=pixel.opacity; + count++; + } + } + } + } + gamma=PerceptibleReciprocal(count); + mean_location.x=gamma*sum_location.x; + mean_location.y=gamma*sum_location.y; + mean_pixel.red=gamma*sum_pixel.red; + mean_pixel.green=gamma*sum_pixel.green; + mean_pixel.blue=gamma*sum_pixel.blue; + mean_pixel.opacity=gamma*sum_pixel.opacity; + distance=(mean_location.x-previous_location.x)* + (mean_location.x-previous_location.x)+ + (mean_location.y-previous_location.y)* + (mean_location.y-previous_location.y)+ + 255.0*QuantumScale*(mean_pixel.red-previous_pixel.red)* + 255.0*QuantumScale*(mean_pixel.red-previous_pixel.red)+ + 255.0*QuantumScale*(mean_pixel.green-previous_pixel.green)* + 255.0*QuantumScale*(mean_pixel.green-previous_pixel.green)+ + 255.0*QuantumScale*(mean_pixel.blue-previous_pixel.blue)* + 255.0*QuantumScale*(mean_pixel.blue-previous_pixel.blue); + if (distance <= 3.0) + break; + } + q->red=ClampToQuantum(mean_pixel.red); + q->green=ClampToQuantum(mean_pixel.green); + q->blue=ClampToQuantum(mean_pixel.blue); + q->opacity=ClampToQuantum(mean_pixel.opacity); + p++; + q++; + } + if (SyncCacheViewAuthenticPixels(mean_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,MeanShiftImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + mean_view=DestroyCacheView(mean_view); + pixel_view=DestroyCacheView(pixel_view); + image_view=DestroyCacheView(image_view); + return(mean_image); +} diff --git a/ImageMagick-6.9.12-44/magick/feature.h b/ImageMagick-6.9.12-44/magick/feature.h new file mode 100644 index 0000000..c4b02b9 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/feature.h @@ -0,0 +1,62 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore feature methods. +*/ +#ifndef MAGICKCORE_FEATURE_H +#define MAGICKCORE_FEATURE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +/* + Haralick texture features. +*/ +typedef struct _ChannelFeatures +{ + double + angular_second_moment[4], + contrast[4], + correlation[4], + variance_sum_of_squares[4], + inverse_difference_moment[4], + sum_average[4], + sum_variance[4], + sum_entropy[4], + entropy[4], + difference_variance[4], + difference_entropy[4], + measure_of_correlation_1[4], + measure_of_correlation_2[4], + maximum_correlation_coefficient[4]; +} ChannelFeatures; + +extern MagickExport ChannelFeatures + *GetImageChannelFeatures(const Image *,const size_t,ExceptionInfo *); + +extern MagickExport Image + *CannyEdgeImage(const Image *,const double,const double,const double, + const double,ExceptionInfo *), + *HoughLineImage(const Image *,const size_t,const size_t,const size_t, + ExceptionInfo *), + *MeanShiftImage(const Image *,const size_t,const size_t,const double, + ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/fourier.c b/ImageMagick-6.9.12-44/magick/fourier.c new file mode 100644 index 0000000..f1c001c --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/fourier.c @@ -0,0 +1,1724 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% FFFFF OOO U U RRRR IIIII EEEEE RRRR % +% F O O U U R R I E R R % +% FFF O O U U RRRR I EEE RRRR % +% F O O U U R R I E R R % +% F OOO UUU R R IIIII EEEEE R R % +% % +% % +% MagickCore Discrete Fourier Transform Methods % +% % +% Software Design % +% Sean Burke % +% Fred Weinhaus % +% Cristy % +% July 2009 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/cache.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/fourier.h" +#include "magick/log.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/quantum-private.h" +#include "magick/resource_.h" +#include "magick/string-private.h" +#include "magick/thread-private.h" +#if defined(MAGICKCORE_FFTW_DELEGATE) +#if defined(MAGICKCORE_HAVE_COMPLEX_H) +#include +#endif +#include +#if !defined(MAGICKCORE_HAVE_CABS) +#define cabs(z) (sqrt(z[0]*z[0]+z[1]*z[1])) +#endif +#if !defined(MAGICKCORE_HAVE_CARG) +#define carg(z) (atan2(cimag(z),creal(z))) +#endif +#if !defined(MAGICKCORE_HAVE_CIMAG) +#define cimag(z) (z[1]) +#endif +#if !defined(MAGICKCORE_HAVE_CREAL) +#define creal(z) (z[0]) +#endif +#endif + +/* + Typedef declarations. +*/ +typedef struct _FourierInfo +{ + ChannelType + channel; + + MagickBooleanType + modulus; + + size_t + width, + height; + + ssize_t + center; +} FourierInfo; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o m p l e x I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ComplexImages() performs complex mathematics on an image sequence. +% +% The format of the ComplexImages method is: +% +% MagickBooleanType ComplexImages(Image *images,const ComplexOperator op, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o op: A complex operator. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *ComplexImages(const Image *images,const ComplexOperator op, + ExceptionInfo *exception) +{ +#define ComplexImageTag "Complex/Image" + + CacheView + *Ai_view, + *Ar_view, + *Bi_view, + *Br_view, + *Ci_view, + *Cr_view; + + const char + *artifact; + + const Image + *Ai_image, + *Ar_image, + *Bi_image, + *Br_image; + + double + snr; + + Image + *Ci_image, + *complex_images, + *Cr_image, + *image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + size_t + columns, + rows; + + ssize_t + y; + + assert(images != (Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if (images->next == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),ImageError, + "ImageSequenceRequired","`%s'",images->filename); + return((Image *) NULL); + } + image=CloneImage(images,0,0,MagickTrue,exception); + if (image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + { + image=DestroyImageList(image); + return(image); + } + image->depth=32UL; + complex_images=NewImageList(); + AppendImageToList(&complex_images,image); + image=CloneImage(images->next,0,0,MagickTrue,exception); + if (image == (Image *) NULL) + { + complex_images=DestroyImageList(complex_images); + return(complex_images); + } + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + { + image=DestroyImageList(image); + return(image); + } + image->depth=32UL; + AppendImageToList(&complex_images,image); + /* + Apply complex mathematics to image pixels. + */ + artifact=GetImageArtifact(image,"complex:snr"); + snr=0.0; + if (artifact != (const char *) NULL) + snr=StringToDouble(artifact,(char **) NULL); + Ar_image=images; + Ai_image=images->next; + Br_image=images; + Bi_image=images->next; + if ((images->next->next != (Image *) NULL) && + (images->next->next->next != (Image *) NULL)) + { + Br_image=images->next->next; + Bi_image=images->next->next->next; + } + Cr_image=complex_images; + Ci_image=complex_images->next; + Ar_view=AcquireVirtualCacheView(Ar_image,exception); + Ai_view=AcquireVirtualCacheView(Ai_image,exception); + Br_view=AcquireVirtualCacheView(Br_image,exception); + Bi_view=AcquireVirtualCacheView(Bi_image,exception); + Cr_view=AcquireAuthenticCacheView(Cr_image,exception); + Ci_view=AcquireAuthenticCacheView(Ci_image,exception); + status=MagickTrue; + progress=0; + columns=MagickMin(Cr_image->columns,Ci_image->columns); + rows=MagickMin(Cr_image->rows,Ci_image->rows); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(Cr_image,complex_images,rows,1L) +#endif + for (y=0; y < (ssize_t) rows; y++) + { + const PixelPacket + *magick_restrict Ai, + *magick_restrict Ar, + *magick_restrict Bi, + *magick_restrict Br; + + PixelPacket + *magick_restrict Ci, + *magick_restrict Cr; + + ssize_t + x; + + if (status == MagickFalse) + continue; + Ar=GetCacheViewVirtualPixels(Ar_view,0,y,columns,1,exception); + Ai=GetCacheViewVirtualPixels(Ai_view,0,y,columns,1,exception); + Br=GetCacheViewVirtualPixels(Br_view,0,y,columns,1,exception); + Bi=GetCacheViewVirtualPixels(Bi_view,0,y,columns,1,exception); + Cr=QueueCacheViewAuthenticPixels(Cr_view,0,y,columns,1,exception); + Ci=QueueCacheViewAuthenticPixels(Ci_view,0,y,columns,1,exception); + if ((Ar == (const PixelPacket *) NULL) || + (Ai == (const PixelPacket *) NULL) || + (Br == (const PixelPacket *) NULL) || + (Bi == (const PixelPacket *) NULL) || + (Cr == (PixelPacket *) NULL) || (Ci == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) columns; x++) + { + switch (op) + { + case AddComplexOperator: + { + Cr->red=Ar->red+Br->red; + Ci->red=Ai->red+Bi->red; + Cr->green=Ar->green+Br->green; + Ci->green=Ai->green+Bi->green; + Cr->blue=Ar->blue+Br->blue; + Ci->blue=Ai->blue+Bi->blue; + if (images->matte != MagickFalse) + { + Cr->opacity=Ar->opacity+Br->opacity; + Ci->opacity=Ai->opacity+Bi->opacity; + } + break; + } + case ConjugateComplexOperator: + default: + { + Cr->red=Ar->red; + Ci->red=(-Ai->red); + Cr->green=Ar->green; + Ci->green=(-Ai->green); + Cr->blue=Ar->blue; + Ci->blue=(-Ai->blue); + if (images->matte != MagickFalse) + { + Cr->opacity=Ar->opacity; + Ci->opacity=(-Ai->opacity); + } + break; + } + case DivideComplexOperator: + { + double + gamma; + + gamma=QuantumRange*PerceptibleReciprocal(QuantumScale*Br->red*Br->red+ + QuantumScale*Bi->red*Bi->red+snr); + Cr->red=gamma*(QuantumScale*Ar->red*Br->red+QuantumScale*Ai->red* + Bi->red); + Ci->red=gamma*(QuantumScale*Ai->red*Br->red-QuantumScale*Ar->red* + Bi->red); + gamma=QuantumRange*PerceptibleReciprocal(QuantumScale*Br->green* + Br->green+QuantumScale*Bi->green*Bi->green+snr); + Cr->green=gamma*(QuantumScale*Ar->green*Br->green+QuantumScale* + Ai->green*Bi->green); + Ci->green=gamma*(QuantumScale*Ai->green*Br->green-QuantumScale* + Ar->green*Bi->green); + gamma=QuantumRange*PerceptibleReciprocal(QuantumScale*Br->blue* + Br->blue+QuantumScale*Bi->blue*Bi->blue+snr); + Cr->blue=gamma*(QuantumScale*Ar->blue*Br->blue+QuantumScale* + Ai->blue*Bi->blue); + Ci->blue=gamma*(QuantumScale*Ai->blue*Br->blue-QuantumScale* + Ar->blue*Bi->blue); + if (images->matte != MagickFalse) + { + gamma=QuantumRange*PerceptibleReciprocal(QuantumScale*Br->opacity* + Br->opacity+QuantumScale*Bi->opacity*Bi->opacity+snr); + Cr->opacity=gamma*(QuantumScale*Ar->opacity*Br->opacity+ + QuantumScale*Ai->opacity*Bi->opacity); + Ci->opacity=gamma*(QuantumScale*Ai->opacity*Br->opacity- + QuantumScale*Ar->opacity*Bi->opacity); + } + break; + } + case MagnitudePhaseComplexOperator: + { + Cr->red=sqrt(QuantumScale*Ar->red*Ar->red+QuantumScale* + Ai->red*Ai->red); + Ci->red=atan2((double) Ai->red,(double) Ar->red)/(2.0*MagickPI)+0.5; + Cr->green=sqrt(QuantumScale*Ar->green*Ar->green+QuantumScale* + Ai->green*Ai->green); + Ci->green=atan2((double) Ai->green,(double) Ar->green)/ + (2.0*MagickPI)+0.5; + Cr->blue=sqrt(QuantumScale*Ar->blue*Ar->blue+QuantumScale* + Ai->blue*Ai->blue); + Ci->blue=atan2(Ai->blue,Ar->blue)/(2.0*MagickPI)+0.5; + if (images->matte != MagickFalse) + { + Cr->opacity=sqrt(QuantumScale*Ar->opacity*Ar->opacity+ + QuantumScale*Ai->opacity*Ai->opacity); + Ci->opacity=atan2((double) Ai->opacity,(double) Ar->opacity)/ + (2.0*MagickPI)+0.5; + } + break; + } + case MultiplyComplexOperator: + { + Cr->red=(QuantumScale*Ar->red*Br->red-(double) + Ai->red*Bi->red); + Ci->red=(QuantumScale*Ai->red*Br->red+(double) + Ar->red*Bi->red); + Cr->green=(QuantumScale*Ar->green*Br->green-(double) + Ai->green*Bi->green); + Ci->green=(QuantumScale*Ai->green*Br->green+(double) + Ar->green*Bi->green); + Cr->blue=(QuantumScale*Ar->blue*Br->blue-(double) + Ai->blue*Bi->blue); + Ci->blue=(QuantumScale*Ai->blue*Br->blue+(double) + Ar->blue*Bi->blue); + if (images->matte != MagickFalse) + { + Cr->opacity=(QuantumScale*Ar->opacity*Br->opacity- + QuantumScale*Ai->opacity*Bi->opacity); + Ci->opacity=(QuantumScale*Ai->opacity*Br->opacity+ + QuantumScale*Ar->opacity*Bi->opacity); + } + break; + } + case RealImaginaryComplexOperator: + { + Cr->red=Ar->red*cos(2.0*MagickPI*(Ai->red-0.5)); + Ci->red=Ar->red*sin(2.0*MagickPI*(Ai->red-0.5)); + Cr->green=Ar->green*cos(2.0*MagickPI*(Ai->green-0.5)); + Ci->green=Ar->green*sin(2.0*MagickPI*(Ai->green-0.5)); + Cr->blue=Ar->blue*cos(2.0*MagickPI*(Ai->blue-0.5)); + Ci->blue=Ar->blue*sin(2.0*MagickPI*(Ai->blue-0.5)); + if (images->matte != MagickFalse) + { + Cr->opacity=Ar->opacity*cos(2.0*MagickPI*(Ai->opacity-0.5)); + Ci->opacity=Ar->opacity*sin(2.0*MagickPI*(Ai->opacity-0.5)); + } + break; + } + case SubtractComplexOperator: + { + Cr->red=Ar->red-Br->red; + Ci->red=Ai->red-Bi->red; + Cr->green=Ar->green-Br->green; + Ci->green=Ai->green-Bi->green; + Cr->blue=Ar->blue-Br->blue; + Ci->blue=Ai->blue-Bi->blue; + if (Cr_image->matte != MagickFalse) + { + Cr->opacity=Ar->opacity-Br->opacity; + Ci->opacity=Ai->opacity-Bi->opacity; + } + break; + } + } + Ar++; + Ai++; + Br++; + Bi++; + Cr++; + Ci++; + } + if (SyncCacheViewAuthenticPixels(Ci_view,exception) == MagickFalse) + status=MagickFalse; + if (SyncCacheViewAuthenticPixels(Cr_view,exception) == MagickFalse) + status=MagickFalse; + if (images->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(images,ComplexImageTag,progress,images->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + Cr_view=DestroyCacheView(Cr_view); + Ci_view=DestroyCacheView(Ci_view); + Br_view=DestroyCacheView(Br_view); + Bi_view=DestroyCacheView(Bi_view); + Ar_view=DestroyCacheView(Ar_view); + Ai_view=DestroyCacheView(Ai_view); + if (status == MagickFalse) + complex_images=DestroyImageList(complex_images); + return(complex_images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% F o r w a r d F o u r i e r T r a n s f o r m I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ForwardFourierTransformImage() implements the discrete Fourier transform +% (DFT) of the image either as a magnitude / phase or real / imaginary image +% pair. +% +% The format of the ForwadFourierTransformImage method is: +% +% Image *ForwardFourierTransformImage(const Image *image, +% const MagickBooleanType modulus,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o modulus: if true, return as transform as a magnitude / phase pair +% otherwise a real / imaginary image pair. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(MAGICKCORE_FFTW_DELEGATE) + +static MagickBooleanType RollFourier(const size_t width,const size_t height, + const ssize_t x_offset,const ssize_t y_offset,double *roll_pixels) +{ + double + *source_pixels; + + MemoryInfo + *source_info; + + ssize_t + i, + x; + + ssize_t + u, + v, + y; + + /* + Move zero frequency (DC, average color) from (0,0) to (width/2,height/2). + */ + source_info=AcquireVirtualMemory(width,height*sizeof(*source_pixels)); + if (source_info == (MemoryInfo *) NULL) + return(MagickFalse); + source_pixels=(double *) GetVirtualMemoryBlob(source_info); + i=0L; + for (y=0L; y < (ssize_t) height; y++) + { + if (y_offset < 0L) + v=((y+y_offset) < 0L) ? y+y_offset+(ssize_t) height : y+y_offset; + else + v=((y+y_offset) > ((ssize_t) height-1L)) ? y+y_offset-(ssize_t) height : + y+y_offset; + for (x=0L; x < (ssize_t) width; x++) + { + if (x_offset < 0L) + u=((x+x_offset) < 0L) ? x+x_offset+(ssize_t) width : x+x_offset; + else + u=((x+x_offset) > ((ssize_t) width-1L)) ? x+x_offset-(ssize_t) width : + x+x_offset; + source_pixels[v*width+u]=roll_pixels[i++]; + } + } + (void) memcpy(roll_pixels,source_pixels,height*width*sizeof(*source_pixels)); + source_info=RelinquishVirtualMemory(source_info); + return(MagickTrue); +} + +static MagickBooleanType ForwardQuadrantSwap(const size_t width, + const size_t height,double *source_pixels,double *forward_pixels) +{ + MagickBooleanType + status; + + ssize_t + x; + + ssize_t + center, + y; + + /* + Swap quadrants. + */ + center=(ssize_t) (width/2L)+1L; + status=RollFourier((size_t) center,height,0L,(ssize_t) height/2L, + source_pixels); + if (status == MagickFalse) + return(MagickFalse); + for (y=0L; y < (ssize_t) height; y++) + for (x=0L; x < (ssize_t) (width/2L); x++) + forward_pixels[y*width+x+width/2L]=source_pixels[y*center+x]; + for (y=1; y < (ssize_t) height; y++) + for (x=0L; x < (ssize_t) (width/2L); x++) + forward_pixels[(height-y)*width+width/2L-x-1L]= + source_pixels[y*center+x+1L]; + for (x=0L; x < (ssize_t) (width/2L); x++) + forward_pixels[width/2L-x-1L]=source_pixels[x+1L]; + return(MagickTrue); +} + +static void CorrectPhaseLHS(const size_t width,const size_t height, + double *fourier_pixels) +{ + ssize_t + x; + + ssize_t + y; + + for (y=0L; y < (ssize_t) height; y++) + for (x=0L; x < (ssize_t) (width/2L); x++) + fourier_pixels[y*width+x]*=(-1.0); +} + +static MagickBooleanType ForwardFourier(const FourierInfo *fourier_info, + Image *image,double *magnitude,double *phase,ExceptionInfo *exception) +{ + CacheView + *magnitude_view, + *phase_view; + + double + *magnitude_pixels, + *phase_pixels; + + Image + *magnitude_image, + *phase_image; + + MagickBooleanType + status; + + MemoryInfo + *magnitude_info, + *phase_info; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + x; + + ssize_t + i, + y; + + magnitude_image=GetFirstImageInList(image); + phase_image=GetNextImageInList(image); + if (phase_image == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),ImageError, + "ImageSequenceRequired","`%s'",image->filename); + return(MagickFalse); + } + /* + Create "Fourier Transform" image from constituent arrays. + */ + magnitude_info=AcquireVirtualMemory((size_t) fourier_info->width, + fourier_info->height*sizeof(*magnitude_pixels)); + phase_info=AcquireVirtualMemory((size_t) fourier_info->width, + fourier_info->height*sizeof(*phase_pixels)); + if ((magnitude_info == (MemoryInfo *) NULL) || + (phase_info == (MemoryInfo *) NULL)) + { + if (phase_info != (MemoryInfo *) NULL) + phase_info=RelinquishVirtualMemory(phase_info); + if (magnitude_info != (MemoryInfo *) NULL) + magnitude_info=RelinquishVirtualMemory(magnitude_info); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(MagickFalse); + } + magnitude_pixels=(double *) GetVirtualMemoryBlob(magnitude_info); + (void) memset(magnitude_pixels,0,fourier_info->width* + fourier_info->height*sizeof(*magnitude_pixels)); + phase_pixels=(double *) GetVirtualMemoryBlob(phase_info); + (void) memset(phase_pixels,0,fourier_info->width* + fourier_info->height*sizeof(*phase_pixels)); + status=ForwardQuadrantSwap(fourier_info->width,fourier_info->height, + magnitude,magnitude_pixels); + if (status != MagickFalse) + status=ForwardQuadrantSwap(fourier_info->width,fourier_info->height,phase, + phase_pixels); + CorrectPhaseLHS(fourier_info->width,fourier_info->height,phase_pixels); + if (fourier_info->modulus != MagickFalse) + { + i=0L; + for (y=0L; y < (ssize_t) fourier_info->height; y++) + for (x=0L; x < (ssize_t) fourier_info->width; x++) + { + phase_pixels[i]/=(2.0*MagickPI); + phase_pixels[i]+=0.5; + i++; + } + } + magnitude_view=AcquireAuthenticCacheView(magnitude_image,exception); + i=0L; + for (y=0L; y < (ssize_t) fourier_info->height; y++) + { + q=GetCacheViewAuthenticPixels(magnitude_view,0L,y,fourier_info->width,1UL, + exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetCacheViewAuthenticIndexQueue(magnitude_view); + for (x=0L; x < (ssize_t) fourier_info->width; x++) + { + switch (fourier_info->channel) + { + case RedChannel: + default: + { + SetPixelRed(q,ClampToQuantum(QuantumRange*magnitude_pixels[i])); + break; + } + case GreenChannel: + { + SetPixelGreen(q,ClampToQuantum(QuantumRange*magnitude_pixels[i])); + break; + } + case BlueChannel: + { + SetPixelBlue(q,ClampToQuantum(QuantumRange*magnitude_pixels[i])); + break; + } + case OpacityChannel: + { + SetPixelOpacity(q,ClampToQuantum(QuantumRange*magnitude_pixels[i])); + break; + } + case IndexChannel: + { + SetPixelIndex(indexes+x,ClampToQuantum(QuantumRange* + magnitude_pixels[i])); + break; + } + case GrayChannels: + { + SetPixelGray(q,ClampToQuantum(QuantumRange*magnitude_pixels[i])); + break; + } + } + i++; + q++; + } + status=SyncCacheViewAuthenticPixels(magnitude_view,exception); + if (status == MagickFalse) + break; + } + magnitude_view=DestroyCacheView(magnitude_view); + i=0L; + phase_view=AcquireAuthenticCacheView(phase_image,exception); + for (y=0L; y < (ssize_t) fourier_info->height; y++) + { + q=GetCacheViewAuthenticPixels(phase_view,0L,y,fourier_info->width,1UL, + exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetCacheViewAuthenticIndexQueue(phase_view); + for (x=0L; x < (ssize_t) fourier_info->width; x++) + { + switch (fourier_info->channel) + { + case RedChannel: + default: + { + SetPixelRed(q,ClampToQuantum(QuantumRange*phase_pixels[i])); + break; + } + case GreenChannel: + { + SetPixelGreen(q,ClampToQuantum(QuantumRange*phase_pixels[i])); + break; + } + case BlueChannel: + { + SetPixelBlue(q,ClampToQuantum(QuantumRange*phase_pixels[i])); + break; + } + case OpacityChannel: + { + SetPixelOpacity(q,ClampToQuantum(QuantumRange*phase_pixels[i])); + break; + } + case IndexChannel: + { + SetPixelIndex(indexes+x,ClampToQuantum(QuantumRange*phase_pixels[i])); + break; + } + case GrayChannels: + { + SetPixelGray(q,ClampToQuantum(QuantumRange*phase_pixels[i])); + break; + } + } + i++; + q++; + } + status=SyncCacheViewAuthenticPixels(phase_view,exception); + if (status == MagickFalse) + break; + } + phase_view=DestroyCacheView(phase_view); + phase_info=RelinquishVirtualMemory(phase_info); + magnitude_info=RelinquishVirtualMemory(magnitude_info); + return(status); +} + +static MagickBooleanType ForwardFourierTransform(FourierInfo *fourier_info, + const Image *image,double *magnitude_pixels,double *phase_pixels, + ExceptionInfo *exception) +{ + CacheView + *image_view; + + const char + *value; + + double + *source_pixels; + + fftw_complex + *forward_pixels; + + fftw_plan + fftw_r2c_plan; + + MemoryInfo + *forward_info, + *source_info; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + ssize_t + y; + + /* + Generate the forward Fourier transform. + */ + source_info=AcquireVirtualMemory((size_t) fourier_info->width, + fourier_info->height*sizeof(*source_pixels)); + if (source_info == (MemoryInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(MagickFalse); + } + source_pixels=(double *) GetVirtualMemoryBlob(source_info); + memset(source_pixels,0,fourier_info->width*fourier_info->height* + sizeof(*source_pixels)); + i=0L; + image_view=AcquireVirtualCacheView(image,exception); + for (y=0L; y < (ssize_t) fourier_info->height; y++) + { + p=GetCacheViewVirtualPixels(image_view,0L,y,fourier_info->width,1UL, + exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetCacheViewVirtualIndexQueue(image_view); + for (x=0L; x < (ssize_t) fourier_info->width; x++) + { + switch (fourier_info->channel) + { + case RedChannel: + default: + { + source_pixels[i]=QuantumScale*GetPixelRed(p); + break; + } + case GreenChannel: + { + source_pixels[i]=QuantumScale*GetPixelGreen(p); + break; + } + case BlueChannel: + { + source_pixels[i]=QuantumScale*GetPixelBlue(p); + break; + } + case OpacityChannel: + { + source_pixels[i]=QuantumScale*GetPixelOpacity(p); + break; + } + case IndexChannel: + { + source_pixels[i]=QuantumScale*GetPixelIndex(indexes+x); + break; + } + case GrayChannels: + { + source_pixels[i]=QuantumScale*GetPixelGray(p); + break; + } + } + i++; + p++; + } + } + image_view=DestroyCacheView(image_view); + forward_info=AcquireVirtualMemory((size_t) fourier_info->width, + (fourier_info->height/2+1)*sizeof(*forward_pixels)); + if (forward_info == (MemoryInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + source_info=(MemoryInfo *) RelinquishVirtualMemory(source_info); + return(MagickFalse); + } + forward_pixels=(fftw_complex *) GetVirtualMemoryBlob(forward_info); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp critical (MagickCore_ForwardFourierTransform) +#endif + fftw_r2c_plan=fftw_plan_dft_r2c_2d(fourier_info->width,fourier_info->height, + source_pixels,forward_pixels,FFTW_ESTIMATE); + fftw_execute_dft_r2c(fftw_r2c_plan,source_pixels,forward_pixels); + fftw_destroy_plan(fftw_r2c_plan); + source_info=(MemoryInfo *) RelinquishVirtualMemory(source_info); + value=GetImageArtifact(image,"fourier:normalize"); + if ((value == (const char *) NULL) || (LocaleCompare(value,"forward") == 0)) + { + double + gamma; + + /* + Normalize forward transform. + */ + i=0L; + gamma=PerceptibleReciprocal((double) fourier_info->width* + fourier_info->height); + for (y=0L; y < (ssize_t) fourier_info->height; y++) + for (x=0L; x < (ssize_t) fourier_info->center; x++) + { +#if defined(MAGICKCORE_HAVE_COMPLEX_H) + forward_pixels[i]*=gamma; +#else + forward_pixels[i][0]*=gamma; + forward_pixels[i][1]*=gamma; +#endif + i++; + } + } + /* + Generate magnitude and phase (or real and imaginary). + */ + i=0L; + if (fourier_info->modulus != MagickFalse) + for (y=0L; y < (ssize_t) fourier_info->height; y++) + for (x=0L; x < (ssize_t) fourier_info->center; x++) + { + magnitude_pixels[i]=cabs(forward_pixels[i]); + phase_pixels[i]=carg(forward_pixels[i]); + i++; + } + else + for (y=0L; y < (ssize_t) fourier_info->height; y++) + for (x=0L; x < (ssize_t) fourier_info->center; x++) + { + magnitude_pixels[i]=creal(forward_pixels[i]); + phase_pixels[i]=cimag(forward_pixels[i]); + i++; + } + forward_info=(MemoryInfo *) RelinquishVirtualMemory(forward_info); + return(MagickTrue); +} + +static MagickBooleanType ForwardFourierTransformChannel(const Image *image, + const ChannelType channel,const MagickBooleanType modulus, + Image *fourier_image,ExceptionInfo *exception) +{ + double + *magnitude_pixels, + *phase_pixels; + + FourierInfo + fourier_info; + + MagickBooleanType + status; + + MemoryInfo + *magnitude_info, + *phase_info; + + fourier_info.width=image->columns; + fourier_info.height=image->rows; + if ((image->columns != image->rows) || ((image->columns % 2) != 0) || + ((image->rows % 2) != 0)) + { + size_t extent=image->columns < image->rows ? image->rows : image->columns; + fourier_info.width=(extent & 0x01) == 1 ? extent+1UL : extent; + } + fourier_info.height=fourier_info.width; + fourier_info.center=(ssize_t) (fourier_info.width/2L)+1L; + fourier_info.channel=channel; + fourier_info.modulus=modulus; + magnitude_info=AcquireVirtualMemory((size_t) fourier_info.width, + (fourier_info.height/2+1)*sizeof(*magnitude_pixels)); + phase_info=AcquireVirtualMemory((size_t) fourier_info.width, + (fourier_info.height/2+1)*sizeof(*phase_pixels)); + if ((magnitude_info == (MemoryInfo *) NULL) || + (phase_info == (MemoryInfo *) NULL)) + { + if (phase_info != (MemoryInfo *) NULL) + phase_info=RelinquishVirtualMemory(phase_info); + if (magnitude_info == (MemoryInfo *) NULL) + magnitude_info=RelinquishVirtualMemory(magnitude_info); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(MagickFalse); + } + magnitude_pixels=(double *) GetVirtualMemoryBlob(magnitude_info); + phase_pixels=(double *) GetVirtualMemoryBlob(phase_info); + status=ForwardFourierTransform(&fourier_info,image,magnitude_pixels, + phase_pixels,exception); + if (status != MagickFalse) + status=ForwardFourier(&fourier_info,fourier_image,magnitude_pixels, + phase_pixels,exception); + phase_info=RelinquishVirtualMemory(phase_info); + magnitude_info=RelinquishVirtualMemory(magnitude_info); + return(status); +} +#endif + +MagickExport Image *ForwardFourierTransformImage(const Image *image, + const MagickBooleanType modulus,ExceptionInfo *exception) +{ + Image + *fourier_image; + + fourier_image=NewImageList(); +#if !defined(MAGICKCORE_FFTW_DELEGATE) + (void) modulus; + (void) ThrowMagickException(exception,GetMagickModule(), + MissingDelegateWarning,"DelegateLibrarySupportNotBuiltIn","`%s' (FFTW)", + image->filename); +#else + { + Image + *magnitude_image; + + size_t + height, + width; + + width=image->columns; + height=image->rows; + if ((image->columns != image->rows) || ((image->columns % 2) != 0) || + ((image->rows % 2) != 0)) + { + size_t extent=image->columns < image->rows ? image->rows : + image->columns; + width=(extent & 0x01) == 1 ? extent+1UL : extent; + } + height=width; + magnitude_image=CloneImage(image,width,height,MagickTrue,exception); + if (magnitude_image != (Image *) NULL) + { + Image + *phase_image; + + magnitude_image->storage_class=DirectClass; + magnitude_image->depth=32UL; + phase_image=CloneImage(image,width,height,MagickTrue,exception); + if (phase_image == (Image *) NULL) + magnitude_image=DestroyImage(magnitude_image); + else + { + MagickBooleanType + is_gray, + status; + + phase_image->storage_class=DirectClass; + phase_image->depth=32UL; + AppendImageToList(&fourier_image,magnitude_image); + AppendImageToList(&fourier_image,phase_image); + status=MagickTrue; + is_gray=IsGrayImage(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel sections +#endif + { +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp section +#endif + { + MagickBooleanType + thread_status; + + if (is_gray != MagickFalse) + thread_status=ForwardFourierTransformChannel(image, + GrayChannels,modulus,fourier_image,exception); + else + thread_status=ForwardFourierTransformChannel(image,RedChannel, + modulus,fourier_image,exception); + if (thread_status == MagickFalse) + status=thread_status; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp section +#endif + { + MagickBooleanType + thread_status; + + thread_status=MagickTrue; + if (is_gray == MagickFalse) + thread_status=ForwardFourierTransformChannel(image, + GreenChannel,modulus,fourier_image,exception); + if (thread_status == MagickFalse) + status=thread_status; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp section +#endif + { + MagickBooleanType + thread_status; + + thread_status=MagickTrue; + if (is_gray == MagickFalse) + thread_status=ForwardFourierTransformChannel(image, + BlueChannel,modulus,fourier_image,exception); + if (thread_status == MagickFalse) + status=thread_status; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp section +#endif + { + MagickBooleanType + thread_status; + + thread_status=MagickTrue; + if (image->matte != MagickFalse) + thread_status=ForwardFourierTransformChannel(image, + OpacityChannel,modulus,fourier_image,exception); + if (thread_status == MagickFalse) + status=thread_status; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp section +#endif + { + MagickBooleanType + thread_status; + + thread_status=MagickTrue; + if (image->colorspace == CMYKColorspace) + thread_status=ForwardFourierTransformChannel(image, + IndexChannel,modulus,fourier_image,exception); + if (thread_status == MagickFalse) + status=thread_status; + } + } + if (status == MagickFalse) + fourier_image=DestroyImageList(fourier_image); + fftw_cleanup(); + } + } + } +#endif + return(fourier_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I n v e r s e F o u r i e r T r a n s f o r m I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% InverseFourierTransformImage() implements the inverse discrete Fourier +% transform (DFT) of the image either as a magnitude / phase or real / +% imaginary image pair. +% +% The format of the InverseFourierTransformImage method is: +% +% Image *InverseFourierTransformImage(const Image *magnitude_image, +% const Image *phase_image,const MagickBooleanType modulus, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o magnitude_image: the magnitude or real image. +% +% o phase_image: the phase or imaginary image. +% +% o modulus: if true, return transform as a magnitude / phase pair +% otherwise a real / imaginary image pair. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(MAGICKCORE_FFTW_DELEGATE) +static MagickBooleanType InverseQuadrantSwap(const size_t width, + const size_t height,const double *source,double *destination) +{ + ssize_t + x; + + ssize_t + center, + y; + + /* + Swap quadrants. + */ + center=(ssize_t) (width/2L)+1L; + for (y=1L; y < (ssize_t) height; y++) + for (x=0L; x < (ssize_t) (width/2L+1L); x++) + destination[(height-y)*center-x+width/2L]=source[y*width+x]; + for (y=0L; y < (ssize_t) height; y++) + destination[y*center]=source[y*width+width/2L]; + for (x=0L; x < center; x++) + destination[x]=source[center-x-1L]; + return(RollFourier(center,height,0L,(ssize_t) height/-2L,destination)); +} + +static MagickBooleanType InverseFourier(FourierInfo *fourier_info, + const Image *magnitude_image,const Image *phase_image, + fftw_complex *fourier_pixels,ExceptionInfo *exception) +{ + CacheView + *magnitude_view, + *phase_view; + + double + *inverse_pixels, + *magnitude_pixels, + *phase_pixels; + + MagickBooleanType + status; + + MemoryInfo + *inverse_info, + *magnitude_info, + *phase_info; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + i, + x; + + ssize_t + y; + + /* + Inverse Fourier - read image and break down into a double array. + */ + magnitude_info=AcquireVirtualMemory((size_t) fourier_info->width, + fourier_info->height*sizeof(*magnitude_pixels)); + phase_info=AcquireVirtualMemory((size_t) fourier_info->width, + fourier_info->height*sizeof(*phase_pixels)); + inverse_info=AcquireVirtualMemory((size_t) fourier_info->width, + (fourier_info->height/2+1)*sizeof(*inverse_pixels)); + if ((magnitude_info == (MemoryInfo *) NULL) || + (phase_info == (MemoryInfo *) NULL) || + (inverse_info == (MemoryInfo *) NULL)) + { + if (magnitude_info != (MemoryInfo *) NULL) + magnitude_info=RelinquishVirtualMemory(magnitude_info); + if (phase_info != (MemoryInfo *) NULL) + phase_info=RelinquishVirtualMemory(phase_info); + if (inverse_info != (MemoryInfo *) NULL) + inverse_info=RelinquishVirtualMemory(inverse_info); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + magnitude_image->filename); + return(MagickFalse); + } + magnitude_pixels=(double *) GetVirtualMemoryBlob(magnitude_info); + phase_pixels=(double *) GetVirtualMemoryBlob(phase_info); + inverse_pixels=(double *) GetVirtualMemoryBlob(inverse_info); + i=0L; + magnitude_view=AcquireVirtualCacheView(magnitude_image,exception); + for (y=0L; y < (ssize_t) fourier_info->height; y++) + { + p=GetCacheViewVirtualPixels(magnitude_view,0L,y,fourier_info->width,1UL, + exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetCacheViewAuthenticIndexQueue(magnitude_view); + for (x=0L; x < (ssize_t) fourier_info->width; x++) + { + switch (fourier_info->channel) + { + case RedChannel: + default: + { + magnitude_pixels[i]=QuantumScale*GetPixelRed(p); + break; + } + case GreenChannel: + { + magnitude_pixels[i]=QuantumScale*GetPixelGreen(p); + break; + } + case BlueChannel: + { + magnitude_pixels[i]=QuantumScale*GetPixelBlue(p); + break; + } + case OpacityChannel: + { + magnitude_pixels[i]=QuantumScale*GetPixelOpacity(p); + break; + } + case IndexChannel: + { + magnitude_pixels[i]=QuantumScale*GetPixelIndex(indexes+x); + break; + } + case GrayChannels: + { + magnitude_pixels[i]=QuantumScale*GetPixelGray(p); + break; + } + } + i++; + p++; + } + } + magnitude_view=DestroyCacheView(magnitude_view); + status=InverseQuadrantSwap(fourier_info->width,fourier_info->height, + magnitude_pixels,inverse_pixels); + (void) memcpy(magnitude_pixels,inverse_pixels,fourier_info->height* + fourier_info->center*sizeof(*magnitude_pixels)); + i=0L; + phase_view=AcquireVirtualCacheView(phase_image,exception); + for (y=0L; y < (ssize_t) fourier_info->height; y++) + { + p=GetCacheViewVirtualPixels(phase_view,0,y,fourier_info->width,1, + exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetCacheViewAuthenticIndexQueue(phase_view); + for (x=0L; x < (ssize_t) fourier_info->width; x++) + { + switch (fourier_info->channel) + { + case RedChannel: + default: + { + phase_pixels[i]=QuantumScale*GetPixelRed(p); + break; + } + case GreenChannel: + { + phase_pixels[i]=QuantumScale*GetPixelGreen(p); + break; + } + case BlueChannel: + { + phase_pixels[i]=QuantumScale*GetPixelBlue(p); + break; + } + case OpacityChannel: + { + phase_pixels[i]=QuantumScale*GetPixelOpacity(p); + break; + } + case IndexChannel: + { + phase_pixels[i]=QuantumScale*GetPixelIndex(indexes+x); + break; + } + case GrayChannels: + { + phase_pixels[i]=QuantumScale*GetPixelGray(p); + break; + } + } + i++; + p++; + } + } + if (fourier_info->modulus != MagickFalse) + { + i=0L; + for (y=0L; y < (ssize_t) fourier_info->height; y++) + for (x=0L; x < (ssize_t) fourier_info->width; x++) + { + phase_pixels[i]-=0.5; + phase_pixels[i]*=(2.0*MagickPI); + i++; + } + } + phase_view=DestroyCacheView(phase_view); + CorrectPhaseLHS(fourier_info->width,fourier_info->height,phase_pixels); + if (status != MagickFalse) + status=InverseQuadrantSwap(fourier_info->width,fourier_info->height, + phase_pixels,inverse_pixels); + (void) memcpy(phase_pixels,inverse_pixels,fourier_info->height* + fourier_info->center*sizeof(*phase_pixels)); + inverse_info=RelinquishVirtualMemory(inverse_info); + /* + Merge two sets. + */ + i=0L; + if (fourier_info->modulus != MagickFalse) + for (y=0L; y < (ssize_t) fourier_info->height; y++) + for (x=0L; x < (ssize_t) fourier_info->center; x++) + { +#if defined(MAGICKCORE_HAVE_COMPLEX_H) + fourier_pixels[i]=magnitude_pixels[i]*cos(phase_pixels[i])+I* + magnitude_pixels[i]*sin(phase_pixels[i]); +#else + fourier_pixels[i][0]=magnitude_pixels[i]*cos(phase_pixels[i]); + fourier_pixels[i][1]=magnitude_pixels[i]*sin(phase_pixels[i]); +#endif + i++; + } + else + for (y=0L; y < (ssize_t) fourier_info->height; y++) + for (x=0L; x < (ssize_t) fourier_info->center; x++) + { +#if defined(MAGICKCORE_HAVE_COMPLEX_H) + fourier_pixels[i]=magnitude_pixels[i]+I*phase_pixels[i]; +#else + fourier_pixels[i][0]=magnitude_pixels[i]; + fourier_pixels[i][1]=phase_pixels[i]; +#endif + i++; + } + magnitude_info=RelinquishVirtualMemory(magnitude_info); + phase_info=RelinquishVirtualMemory(phase_info); + return(status); +} + +static MagickBooleanType InverseFourierTransform(FourierInfo *fourier_info, + fftw_complex *fourier_pixels,Image *image,ExceptionInfo *exception) +{ + CacheView + *image_view; + + double + *source_pixels; + + const char + *value; + + fftw_plan + fftw_c2r_plan; + + MemoryInfo + *source_info; + + IndexPacket + *indexes; + + PixelPacket + *q; + + ssize_t + i, + x; + + ssize_t + y; + + source_info=AcquireVirtualMemory((size_t) fourier_info->width, + fourier_info->height*sizeof(*source_pixels)); + if (source_info == (MemoryInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(MagickFalse); + } + source_pixels=(double *) GetVirtualMemoryBlob(source_info); + value=GetImageArtifact(image,"fourier:normalize"); + if (LocaleCompare(value,"inverse") == 0) + { + double + gamma; + + /* + Normalize inverse transform. + */ + i=0L; + gamma=PerceptibleReciprocal((double) fourier_info->width* + fourier_info->height); + for (y=0L; y < (ssize_t) fourier_info->height; y++) + for (x=0L; x < (ssize_t) fourier_info->center; x++) + { +#if defined(MAGICKCORE_HAVE_COMPLEX_H) + fourier_pixels[i]*=gamma; +#else + fourier_pixels[i][0]*=gamma; + fourier_pixels[i][1]*=gamma; +#endif + i++; + } + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp critical (MagickCore_InverseFourierTransform) +#endif + fftw_c2r_plan=fftw_plan_dft_c2r_2d(fourier_info->width,fourier_info->height, + fourier_pixels,source_pixels,FFTW_ESTIMATE); + fftw_execute_dft_c2r(fftw_c2r_plan,fourier_pixels,source_pixels); + fftw_destroy_plan(fftw_c2r_plan); + i=0L; + image_view=AcquireAuthenticCacheView(image,exception); + for (y=0L; y < (ssize_t) fourier_info->height; y++) + { + if (y >= (ssize_t) image->rows) + break; + q=GetCacheViewAuthenticPixels(image_view,0L,y,fourier_info->width > + image->columns ? image->columns : fourier_info->width,1UL,exception); + if (q == (PixelPacket *) NULL) + break; + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0L; x < (ssize_t) fourier_info->width; x++) + { + if (x < (ssize_t) image->columns) + switch (fourier_info->channel) + { + case RedChannel: + default: + { + SetPixelRed(q,ClampToQuantum(QuantumRange*source_pixels[i])); + break; + } + case GreenChannel: + { + SetPixelGreen(q,ClampToQuantum(QuantumRange*source_pixels[i])); + break; + } + case BlueChannel: + { + SetPixelBlue(q,ClampToQuantum(QuantumRange*source_pixels[i])); + break; + } + case OpacityChannel: + { + SetPixelOpacity(q,ClampToQuantum(QuantumRange*source_pixels[i])); + break; + } + case IndexChannel: + { + SetPixelIndex(indexes+x,ClampToQuantum(QuantumRange* + source_pixels[i])); + break; + } + case GrayChannels: + { + SetPixelGray(q,ClampToQuantum(QuantumRange*source_pixels[i])); + break; + } + } + i++; + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + break; + } + image_view=DestroyCacheView(image_view); + source_info=RelinquishVirtualMemory(source_info); + return(MagickTrue); +} + +static MagickBooleanType InverseFourierTransformChannel( + const Image *magnitude_image,const Image *phase_image, + const ChannelType channel,const MagickBooleanType modulus, + Image *fourier_image,ExceptionInfo *exception) +{ + fftw_complex + *inverse_pixels; + + FourierInfo + fourier_info; + + MagickBooleanType + status; + + MemoryInfo + *inverse_info; + + fourier_info.width=magnitude_image->columns; + fourier_info.height=magnitude_image->rows; + if ((magnitude_image->columns != magnitude_image->rows) || + ((magnitude_image->columns % 2) != 0) || + ((magnitude_image->rows % 2) != 0)) + { + size_t extent=magnitude_image->columns < magnitude_image->rows ? + magnitude_image->rows : magnitude_image->columns; + fourier_info.width=(extent & 0x01) == 1 ? extent+1UL : extent; + } + fourier_info.height=fourier_info.width; + fourier_info.center=(ssize_t) (fourier_info.width/2L)+1L; + fourier_info.channel=channel; + fourier_info.modulus=modulus; + inverse_info=AcquireVirtualMemory((size_t) fourier_info.width, + (fourier_info.height/2+1)*sizeof(*inverse_pixels)); + if (inverse_info == (MemoryInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + magnitude_image->filename); + return(MagickFalse); + } + inverse_pixels=(fftw_complex *) GetVirtualMemoryBlob(inverse_info); + status=InverseFourier(&fourier_info,magnitude_image,phase_image, + inverse_pixels,exception); + if (status != MagickFalse) + status=InverseFourierTransform(&fourier_info,inverse_pixels,fourier_image, + exception); + inverse_info=RelinquishVirtualMemory(inverse_info); + return(status); +} +#endif + +MagickExport Image *InverseFourierTransformImage(const Image *magnitude_image, + const Image *phase_image,const MagickBooleanType modulus, + ExceptionInfo *exception) +{ + Image + *fourier_image; + + assert(magnitude_image != (Image *) NULL); + assert(magnitude_image->signature == MagickCoreSignature); + if (magnitude_image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + magnitude_image->filename); + if (phase_image == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),ImageError, + "ImageSequenceRequired","`%s'",magnitude_image->filename); + return((Image *) NULL); + } +#if !defined(MAGICKCORE_FFTW_DELEGATE) + fourier_image=(Image *) NULL; + (void) modulus; + (void) ThrowMagickException(exception,GetMagickModule(), + MissingDelegateWarning,"DelegateLibrarySupportNotBuiltIn","`%s' (FFTW)", + magnitude_image->filename); +#else + { + fourier_image=CloneImage(magnitude_image,magnitude_image->columns, + magnitude_image->rows,MagickTrue,exception); + if (fourier_image != (Image *) NULL) + { + MagickBooleanType + is_gray, + status; + + status=MagickTrue; + is_gray=IsGrayImage(magnitude_image,exception); + if (is_gray != MagickFalse) + is_gray=IsGrayImage(phase_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel sections +#endif + { +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp section +#endif + { + MagickBooleanType + thread_status; + + if (is_gray != MagickFalse) + thread_status=InverseFourierTransformChannel(magnitude_image, + phase_image,GrayChannels,modulus,fourier_image,exception); + else + thread_status=InverseFourierTransformChannel(magnitude_image, + phase_image,RedChannel,modulus,fourier_image,exception); + if (thread_status == MagickFalse) + status=thread_status; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp section +#endif + { + MagickBooleanType + thread_status; + + thread_status=MagickTrue; + if (is_gray == MagickFalse) + thread_status=InverseFourierTransformChannel(magnitude_image, + phase_image,GreenChannel,modulus,fourier_image,exception); + if (thread_status == MagickFalse) + status=thread_status; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp section +#endif + { + MagickBooleanType + thread_status; + + thread_status=MagickTrue; + if (is_gray == MagickFalse) + thread_status=InverseFourierTransformChannel(magnitude_image, + phase_image,BlueChannel,modulus,fourier_image,exception); + if (thread_status == MagickFalse) + status=thread_status; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp section +#endif + { + MagickBooleanType + thread_status; + + thread_status=MagickTrue; + if (magnitude_image->matte != MagickFalse) + thread_status=InverseFourierTransformChannel(magnitude_image, + phase_image,OpacityChannel,modulus,fourier_image,exception); + if (thread_status == MagickFalse) + status=thread_status; + } +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp section +#endif + { + MagickBooleanType + thread_status; + + thread_status=MagickTrue; + if (magnitude_image->colorspace == CMYKColorspace) + thread_status=InverseFourierTransformChannel(magnitude_image, + phase_image,IndexChannel,modulus,fourier_image,exception); + if (thread_status == MagickFalse) + status=thread_status; + } + } + if (status == MagickFalse) + fourier_image=DestroyImage(fourier_image); + } + fftw_cleanup(); + } +#endif + return(fourier_image); +} diff --git a/ImageMagick-6.9.12-44/magick/fourier.h b/ImageMagick-6.9.12-44/magick/fourier.h new file mode 100644 index 0000000..06efb05 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/fourier.h @@ -0,0 +1,48 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore discrete Fourier transform (DFT) methods. +*/ +#ifndef MAGICKCORE_FFT_H +#define MAGICKCORE_FFT_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef enum +{ + UndefinedComplexOperator, + AddComplexOperator, + ConjugateComplexOperator, + DivideComplexOperator, + MagnitudePhaseComplexOperator, + MultiplyComplexOperator, + RealImaginaryComplexOperator, + SubtractComplexOperator +} ComplexOperator; + +extern MagickExport Image + *ComplexImages(const Image *,const ComplexOperator,ExceptionInfo *), + *ForwardFourierTransformImage(const Image *,const MagickBooleanType, + ExceptionInfo *), + *InverseFourierTransformImage(const Image *,const Image *, + const MagickBooleanType,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/fx-private.h b/ImageMagick-6.9.12-44/magick/fx-private.h new file mode 100644 index 0000000..3685286 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/fx-private.h @@ -0,0 +1,41 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore private image f/x methods. +*/ +#ifndef MAGICKCORE_FX_PRIVATE_H +#define MAGICKCORE_FX_PRIVATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct _FxInfo + FxInfo; + +extern MagickExport FxInfo + *AcquireFxInfo(const Image *,const char *), + *DestroyFxInfo(FxInfo *); + +extern MagickExport MagickBooleanType + FxEvaluateExpression(FxInfo *,double *,ExceptionInfo *), + FxEvaluateChannelExpression(FxInfo *,const ChannelType,const ssize_t, + const ssize_t,double *,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/fx.c b/ImageMagick-6.9.12-44/magick/fx.c new file mode 100644 index 0000000..f26e717 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/fx.c @@ -0,0 +1,2938 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% FFFFF X X % +% F X X % +% FFF X % +% F X X % +% F X X % +% % +% % +% MagickCore Image Special Effects Methods % +% % +% Software Design % +% Cristy % +% October 1996 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/accelerate-private.h" +#include "magick/annotate.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/cache.h" +#include "magick/cache-view.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/composite.h" +#include "magick/decorate.h" +#include "magick/distort.h" +#include "magick/draw.h" +#include "magick/effect.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/fx.h" +#include "magick/fx-private.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/layer.h" +#include "magick/list.h" +#include "magick/log.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/opencl-private.h" +#include "magick/option.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/quantum.h" +#include "magick/quantum-private.h" +#include "magick/random_.h" +#include "magick/random-private.h" +#include "magick/resample.h" +#include "magick/resample-private.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/splay-tree.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/thread-private.h" +#include "magick/threshold.h" +#include "magick/token.h" +#include "magick/transform.h" +#include "magick/utility.h" + +/* + Define declarations. +*/ +typedef enum +{ + BitwiseAndAssignmentOperator = 0xd9U, + BitwiseOrAssignmentOperator, + LeftShiftAssignmentOperator, + RightShiftAssignmentOperator, + PowerAssignmentOperator, + ModuloAssignmentOperator, + PlusAssignmentOperator, + SubtractAssignmentOperator, + MultiplyAssignmentOperator, + DivideAssignmentOperator, + IncrementAssignmentOperator, + DecrementAssignmentOperator, + LeftShiftOperator, + RightShiftOperator, + LessThanEqualOperator, + GreaterThanEqualOperator, + EqualOperator, + NotEqualOperator, + LogicalAndOperator, + LogicalOrOperator, + ExponentialNotation +} FxOperator; + +struct _FxInfo +{ + const Image + *images; + + char + *expression; + + FILE + *file; + + SplayTreeInfo + *colors, + *symbols; + + CacheView + **view; + + RandomInfo + *random_info; + + ExceptionInfo + *exception; +}; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A c q u i r e F x I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireFxInfo() allocates the FxInfo structure. +% +% The format of the AcquireFxInfo method is: +% +% FxInfo *AcquireFxInfo(Image *images,const char *expression) +% +% A description of each parameter follows: +% +% o images: the image sequence. +% +% o expression: the expression. +% +*/ +MagickExport FxInfo *AcquireFxInfo(const Image *images,const char *expression) +{ + const Image + *next; + + FxInfo + *fx_info; + + ssize_t + i; + + unsigned char + fx_op[2]; + + fx_info=(FxInfo *) AcquireCriticalMemory(sizeof(*fx_info)); + (void) memset(fx_info,0,sizeof(*fx_info)); + fx_info->exception=AcquireExceptionInfo(); + fx_info->images=images; + fx_info->colors=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory, + RelinquishMagickMemory); + fx_info->symbols=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory, + RelinquishMagickMemory); + fx_info->view=(CacheView **) AcquireQuantumMemory(GetImageListLength( + fx_info->images),sizeof(*fx_info->view)); + if (fx_info->view == (CacheView **) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + i=0; + next=GetFirstImageInList(fx_info->images); + for ( ; next != (Image *) NULL; next=next->next) + { + fx_info->view[i]=AcquireVirtualCacheView(next,fx_info->exception); + i++; + } + fx_info->random_info=AcquireRandomInfo(); + fx_info->expression=ConstantString(expression); + fx_info->file=stderr; + /* + Convert compound to simple operators. + */ + fx_op[1]='\0'; + *fx_op=(unsigned char) BitwiseAndAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"&=",(char *) fx_op); + *fx_op=(unsigned char) BitwiseOrAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"|=",(char *) fx_op); + *fx_op=(unsigned char) LeftShiftAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"<<=",(char *) fx_op); + *fx_op=(unsigned char) RightShiftAssignmentOperator; + (void) SubstituteString(&fx_info->expression,">>=",(char *) fx_op); + *fx_op=(unsigned char) PowerAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"^=",(char *) fx_op); + *fx_op=(unsigned char) ModuloAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"%=",(char *) fx_op); + *fx_op=(unsigned char) PlusAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"+=",(char *) fx_op); + *fx_op=(unsigned char) SubtractAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"-=",(char *) fx_op); + *fx_op=(unsigned char) MultiplyAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"*=",(char *) fx_op); + *fx_op=(unsigned char) DivideAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"/=",(char *) fx_op); + *fx_op=(unsigned char) IncrementAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"++",(char *) fx_op); + *fx_op=(unsigned char) DecrementAssignmentOperator; + (void) SubstituteString(&fx_info->expression,"--",(char *) fx_op); + *fx_op=(unsigned char) LeftShiftOperator; + (void) SubstituteString(&fx_info->expression,"<<",(char *) fx_op); + *fx_op=(unsigned char) RightShiftOperator; + (void) SubstituteString(&fx_info->expression,">>",(char *) fx_op); + *fx_op=(unsigned char) LessThanEqualOperator; + (void) SubstituteString(&fx_info->expression,"<=",(char *) fx_op); + *fx_op=(unsigned char) GreaterThanEqualOperator; + (void) SubstituteString(&fx_info->expression,">=",(char *) fx_op); + *fx_op=(unsigned char) EqualOperator; + (void) SubstituteString(&fx_info->expression,"==",(char *) fx_op); + *fx_op=(unsigned char) NotEqualOperator; + (void) SubstituteString(&fx_info->expression,"!=",(char *) fx_op); + *fx_op=(unsigned char) LogicalAndOperator; + (void) SubstituteString(&fx_info->expression,"&&",(char *) fx_op); + *fx_op=(unsigned char) LogicalOrOperator; + (void) SubstituteString(&fx_info->expression,"||",(char *) fx_op); + *fx_op=(unsigned char) ExponentialNotation; + (void) SubstituteString(&fx_info->expression,"**",(char *) fx_op); + /* + Force right-to-left associativity for unary negation. + */ + (void) SubstituteString(&fx_info->expression,"-","-1.0*"); + (void) SubstituteString(&fx_info->expression,"^-1.0*","^-"); + (void) SubstituteString(&fx_info->expression,"E-1.0*","E-"); + (void) SubstituteString(&fx_info->expression,"e-1.0*","e-"); + (void) SubstituteString(&fx_info->expression," ",""); /* compact string */ + return(fx_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e s t r o y F x I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyFxInfo() deallocates memory associated with an FxInfo structure. +% +% The format of the DestroyFxInfo method is: +% +% ImageInfo *DestroyFxInfo(ImageInfo *fx_info) +% +% A description of each parameter follows: +% +% o fx_info: the fx info. +% +*/ +MagickExport FxInfo *DestroyFxInfo(FxInfo *fx_info) +{ + ssize_t + i; + + fx_info->exception=DestroyExceptionInfo(fx_info->exception); + fx_info->expression=DestroyString(fx_info->expression); + fx_info->symbols=DestroySplayTree(fx_info->symbols); + fx_info->colors=DestroySplayTree(fx_info->colors); + for (i=(ssize_t) GetImageListLength(fx_info->images)-1; i >= 0; i--) + fx_info->view[i]=DestroyCacheView(fx_info->view[i]); + fx_info->view=(CacheView **) RelinquishMagickMemory(fx_info->view); + fx_info->random_info=DestroyRandomInfo(fx_info->random_info); + fx_info=(FxInfo *) RelinquishMagickMemory(fx_info); + return(fx_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ F x E v a l u a t e C h a n n e l E x p r e s s i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FxEvaluateChannelExpression() evaluates an expression and returns the +% results. +% +% The format of the FxEvaluateExpression method is: +% +% MagickBooleanType FxEvaluateChannelExpression(FxInfo *fx_info, +% const ChannelType channel,const ssize_t x,const ssize_t y, +% double *alpha,Exceptioninfo *exception) +% MagickBooleanType FxEvaluateExpression(FxInfo *fx_info,double *alpha, +% Exceptioninfo *exception) +% +% A description of each parameter follows: +% +% o fx_info: the fx info. +% +% o channel: the channel. +% +% o x,y: the pixel position. +% +% o alpha: the result. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline const double *GetFxSymbolValue(FxInfo *fx_info,const char *symbol) +{ + return((const double *) GetValueFromSplayTree(fx_info->symbols,symbol)); +} + +static inline MagickBooleanType SetFxSymbolValue( + FxInfo *magick_restrict fx_info,const char *magick_restrict symbol, + const double value) +{ + double + *object; + + object=(double *) GetValueFromSplayTree(fx_info->symbols,symbol); + if (object != (double *) NULL) + { + *object=value; + return(MagickTrue); + } + object=(double *) AcquireMagickMemory(sizeof(*object)); + if (object == (double *) NULL) + { + (void) ThrowMagickException(fx_info->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + fx_info->images->filename); + return(MagickFalse); + } + *object=value; + return(AddValueToSplayTree(fx_info->symbols,ConstantString(symbol),object)); +} + +static double FxChannelStatistics(FxInfo *fx_info,const Image *image, + ChannelType channel,const char *symbol,ExceptionInfo *exception) +{ + char + channel_symbol[MaxTextExtent], + key[MaxTextExtent]; + + const double + *value; + + double + statistic; + + const char + *p; + + for (p=symbol; (*p != '.') && (*p != '\0'); p++) ; + *channel_symbol='\0'; + if (*p == '.') + { + ssize_t + option; + + (void) CopyMagickString(channel_symbol,p+1,MaxTextExtent); + option=ParseCommandOption(MagickChannelOptions,MagickTrue,channel_symbol); + if (option >= 0) + channel=(ChannelType) option; + } + (void) FormatLocaleString(key,MaxTextExtent,"%p.%.20g.%s",(void *) image, + (double) channel,symbol); + value=GetFxSymbolValue(fx_info,key); + if (value != (const double *) NULL) + return(QuantumScale*(*value)); + statistic=0.0; + if (LocaleNCompare(symbol,"depth",5) == 0) + { + size_t + depth; + + depth=GetImageChannelDepth(image,channel,exception); + statistic=(double) depth; + } + if (LocaleNCompare(symbol,"kurtosis",8) == 0) + { + double + kurtosis, + skewness; + + (void) GetImageChannelKurtosis(image,channel,&kurtosis,&skewness, + exception); + statistic=kurtosis; + } + if (LocaleNCompare(symbol,"maxima",6) == 0) + { + double + maxima, + minima; + + (void) GetImageChannelRange(image,channel,&minima,&maxima,exception); + statistic=maxima; + } + if (LocaleNCompare(symbol,"mean",4) == 0) + { + double + mean, + standard_deviation; + + (void) GetImageChannelMean(image,channel,&mean,&standard_deviation, + exception); + statistic=mean; + } + if (LocaleNCompare(symbol,"minima",6) == 0) + { + double + maxima, + minima; + + (void) GetImageChannelRange(image,channel,&minima,&maxima,exception); + statistic=minima; + } + if (LocaleNCompare(symbol,"skewness",8) == 0) + { + double + kurtosis, + skewness; + + (void) GetImageChannelKurtosis(image,channel,&kurtosis,&skewness, + exception); + statistic=skewness; + } + if (LocaleNCompare(symbol,"standard_deviation",18) == 0) + { + double + mean, + standard_deviation; + + (void) GetImageChannelMean(image,channel,&mean,&standard_deviation, + exception); + statistic=standard_deviation; + } + if (SetFxSymbolValue(fx_info,key,statistic) == MagickFalse) + return(0.0); + return(QuantumScale*statistic); +} + +static double + FxEvaluateSubexpression(FxInfo *,const ChannelType,const ssize_t, + const ssize_t,const char *,const size_t,double *,ExceptionInfo *); + +static inline MagickBooleanType IsFxFunction(const char *expression, + const char *name,const size_t length) +{ + int + c; + + size_t + i; + + for (i=0; i <= length; i++) + if (expression[i] == '\0') + return(MagickFalse); + c=expression[length]; + if ((LocaleNCompare(expression,name,length) == 0) && + ((isspace((int) ((unsigned char) c)) == 0) || (c == '('))) + return(MagickTrue); + return(MagickFalse); +} + +static inline double FxGCD(const double alpha,const double beta, + const size_t depth) +{ +#define FxMaxFunctionDepth 200 + + if (alpha < beta) + return(FxGCD(beta,alpha,depth+1)); + if ((fabs(beta) < 0.001) || (depth >= FxMaxFunctionDepth)) + return(alpha); + return(FxGCD(beta,alpha-beta*floor(alpha/beta),depth+1)); +} + +static inline const char *FxSubexpression(const char *expression, + ExceptionInfo *exception) +{ + const char + *subexpression; + + ssize_t + level; + + level=0; + subexpression=expression; + while ((*subexpression != '\0') && + ((level != 1) || (strchr(")",(int) *subexpression) == (char *) NULL))) + { + if (strchr("(",(int) *subexpression) != (char *) NULL) + level++; + else + if (strchr(")",(int) *subexpression) != (char *) NULL) + level--; + subexpression++; + } + if (*subexpression == '\0') + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "UnbalancedParenthesis","`%s'",expression); + return(subexpression); +} + +static double FxGetSymbol(FxInfo *fx_info,const ChannelType channel, + const ssize_t x,const ssize_t y,const char *expression,const size_t depth, + ExceptionInfo *exception) +{ + char + *q, + symbol[MaxTextExtent]; + + const char + *artifact, + *p; + + const double + *value; + + double + alpha, + beta; + + Image + *image; + + MagickBooleanType + status; + + MagickPixelPacket + pixel; + + PointInfo + point; + + ssize_t + i; + + size_t + level; + + p=expression; + i=GetImageIndexInList(fx_info->images); + level=0; + point.x=(double) x; + point.y=(double) y; + if (isalpha((int) ((unsigned char) *(p+1))) == 0) + { + char + *subexpression; + + subexpression=AcquireString(expression); + if (strchr("suv",(int) *p) != (char *) NULL) + { + switch (*p) + { + case 's': + default: + { + i=GetImageIndexInList(fx_info->images); + break; + } + case 'u': i=0; break; + case 'v': i=1; break; + } + p++; + if (*p == '[') + { + level++; + q=subexpression; + for (p++; *p != '\0'; ) + { + if (*p == '[') + level++; + else + if (*p == ']') + { + level--; + if (level == 0) + break; + } + *q++=(*p++); + } + *q='\0'; + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,subexpression, + depth,&beta,exception); + i=(ssize_t) alpha; + if (*p != '\0') + p++; + } + if (*p == '.') + p++; + } + if ((*p == 'p') && (isalpha((int) ((unsigned char) *(p+1))) == 0)) + { + p++; + if (*p == '{') + { + level++; + q=subexpression; + for (p++; *p != '\0'; ) + { + if (*p == '{') + level++; + else + if (*p == '}') + { + level--; + if (level == 0) + break; + } + *q++=(*p++); + } + *q='\0'; + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,subexpression, + depth,&beta,exception); + point.x=alpha; + point.y=beta; + if (*p != '\0') + p++; + } + else + if (*p == '[') + { + level++; + q=subexpression; + for (p++; *p != '\0'; ) + { + if (*p == '[') + level++; + else + if (*p == ']') + { + level--; + if (level == 0) + break; + } + *q++=(*p++); + } + *q='\0'; + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,subexpression, + depth,&beta,exception); + point.x+=alpha; + point.y+=beta; + if (*p != '\0') + p++; + } + if (*p == '.') + p++; + } + subexpression=DestroyString(subexpression); + } + image=GetImageFromList(fx_info->images,i); + if (image == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "NoSuchImage","`%s'",expression); + return(0.0); + } + i=GetImageIndexInList(image); + GetMagickPixelPacket(image,&pixel); + status=InterpolateMagickPixelPacket(image,fx_info->view[i],image->interpolate, + point.x,point.y,&pixel,exception); + (void) status; + if ((*p != '\0') && (*(p+1) != '\0') && (*(p+2) != '\0') && + (LocaleCompare(p,"intensity") != 0) && (LocaleCompare(p,"luma") != 0) && + (LocaleCompare(p,"luminance") != 0) && (LocaleCompare(p,"hue") != 0) && + (LocaleCompare(p,"saturation") != 0) && + (LocaleCompare(p,"lightness") != 0)) + { + char + name[MaxTextExtent]; + + size_t + length; + + (void) CopyMagickString(name,p,MaxTextExtent); + length=strlen(name); + for (q=name+length-1; q > name; q--) + { + if (*q == ')') + break; + if (*q == '.') + { + *q='\0'; + break; + } + } + q=name; + if ((*q != '\0') && (*(q+1) != '\0') && (*(q+2) != '\0') && + (GetFxSymbolValue(fx_info,name) == (const double *) NULL)) + { + MagickPixelPacket + *color; + + color=(MagickPixelPacket *) GetValueFromSplayTree(fx_info->colors, + name); + if (color != (MagickPixelPacket *) NULL) + { + pixel=(*color); + p+=length; + } + else + if (QueryMagickColor(name,&pixel,fx_info->exception) != MagickFalse) + { + (void) AddValueToSplayTree(fx_info->colors,ConstantString(name), + CloneMagickPixelPacket(&pixel)); + p+=length; + } + } + } + (void) CopyMagickString(symbol,p,MaxTextExtent); + StripString(symbol); + if (*symbol == '\0') + { + switch (channel) + { + case RedChannel: return(QuantumScale*pixel.red); + case GreenChannel: return(QuantumScale*pixel.green); + case BlueChannel: return(QuantumScale*pixel.blue); + case OpacityChannel: + { + double + alpha; + + if (pixel.matte == MagickFalse) + return(1.0); + alpha=(double) (QuantumScale*GetPixelAlpha(&pixel)); + return(alpha); + } + case IndexChannel: + { + if (image->colorspace != CMYKColorspace) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ImageError,"ColorSeparatedImageRequired","`%s'", + image->filename); + return(0.0); + } + return(QuantumScale*pixel.index); + } + case DefaultChannels: + return(QuantumScale*GetMagickPixelIntensity(image,&pixel)); + default: + break; + } + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "UnableToParseExpression","`%s'",p); + return(0.0); + } + switch (*symbol) + { + case 'A': + case 'a': + { + if (LocaleCompare(symbol,"a") == 0) + return((double) (QuantumScale*GetPixelAlpha(&pixel))); + break; + } + case 'B': + case 'b': + { + if (LocaleCompare(symbol,"b") == 0) + return(QuantumScale*pixel.blue); + break; + } + case 'C': + case 'c': + { + if (IsFxFunction(symbol,"channel",7) != MagickFalse) + { + GeometryInfo + channel_info; + + MagickStatusType + flags; + + flags=ParseGeometry(symbol+7,&channel_info); + if (image->colorspace == CMYKColorspace) + switch (channel) + { + case CyanChannel: + { + if ((flags & RhoValue) == 0) + return(0.0); + return(channel_info.rho); + } + case MagentaChannel: + { + if ((flags & SigmaValue) == 0) + return(0.0); + return(channel_info.sigma); + } + case YellowChannel: + { + if ((flags & XiValue) == 0) + return(0.0); + return(channel_info.xi); + } + case BlackChannel: + { + if ((flags & PsiValue) == 0) + return(0.0); + return(channel_info.psi); + } + case OpacityChannel: + { + if ((flags & ChiValue) == 0) + return(0.0); + return(channel_info.chi); + } + default: + return(0.0); + } + switch (channel) + { + case RedChannel: + { + if ((flags & RhoValue) == 0) + return(0.0); + return(channel_info.rho); + } + case GreenChannel: + { + if ((flags & SigmaValue) == 0) + return(0.0); + return(channel_info.sigma); + } + case BlueChannel: + { + if ((flags & XiValue) == 0) + return(0.0); + return(channel_info.xi); + } + case OpacityChannel: + { + if ((flags & PsiValue) == 0) + return(0.0); + return(channel_info.psi); + } + case IndexChannel: + { + if ((flags & ChiValue) == 0) + return(0.0); + return(channel_info.chi); + } + default: + return(0.0); + } + } + if (LocaleCompare(symbol,"c") == 0) + return(QuantumScale*pixel.red); + break; + } + case 'D': + case 'd': + { + if (LocaleNCompare(symbol,"depth",5) == 0) + return(FxChannelStatistics(fx_info,image,channel,symbol,exception)); + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(symbol,"extent") == 0) + { + if (image->extent != 0) + return((double) image->extent); + return((double) GetBlobSize(image)); + } + break; + } + case 'G': + case 'g': + { + if (LocaleCompare(symbol,"g") == 0) + return(QuantumScale*pixel.green); + break; + } + case 'K': + case 'k': + { + if (LocaleNCompare(symbol,"kurtosis",8) == 0) + return(FxChannelStatistics(fx_info,image,channel,symbol,exception)); + if (LocaleCompare(symbol,"k") == 0) + { + if (image->colorspace != CMYKColorspace) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"ColorSeparatedImageRequired","`%s'", + image->filename); + return(0.0); + } + return(QuantumScale*pixel.index); + } + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(symbol,"h") == 0) + return((double) image->rows); + if (LocaleCompare(symbol,"hue") == 0) + { + double + hue, + lightness, + saturation; + + ConvertRGBToHSL(ClampToQuantum(pixel.red),ClampToQuantum(pixel.green), + ClampToQuantum(pixel.blue),&hue,&saturation,&lightness); + return(hue); + } + break; + } + case 'I': + case 'i': + { + if ((LocaleCompare(symbol,"image.depth") == 0) || + (LocaleCompare(symbol,"image.minima") == 0) || + (LocaleCompare(symbol,"image.maxima") == 0) || + (LocaleCompare(symbol,"image.mean") == 0) || + (LocaleCompare(symbol,"image.kurtosis") == 0) || + (LocaleCompare(symbol,"image.skewness") == 0) || + (LocaleCompare(symbol,"image.standard_deviation") == 0)) + return(FxChannelStatistics(fx_info,image,channel,symbol+6,exception)); + if (LocaleCompare(symbol,"image.resolution.x") == 0) + return(image->x_resolution); + if (LocaleCompare(symbol,"image.resolution.y") == 0) + return(image->y_resolution); + if (LocaleCompare(symbol,"intensity") == 0) + return(QuantumScale*GetMagickPixelIntensity(image,&pixel)); + if (LocaleCompare(symbol,"i") == 0) + return((double) x); + break; + } + case 'J': + case 'j': + { + if (LocaleCompare(symbol,"j") == 0) + return((double) y); + break; + } + case 'L': + case 'l': + { + if (LocaleCompare(symbol,"lightness") == 0) + { + double + hue, + lightness, + saturation; + + ConvertRGBToHSL(ClampToQuantum(pixel.red),ClampToQuantum(pixel.green), + ClampToQuantum(pixel.blue),&hue,&saturation,&lightness); + return(lightness); + } + if (LocaleCompare(symbol,"luma") == 0) + { + double + luma; + + luma=0.212656*pixel.red+0.715158*pixel.green+0.072186*pixel.blue; + return(QuantumScale*luma); + } + if (LocaleCompare(symbol,"luminance") == 0) + { + double + luminance; + + luminance=0.212656*pixel.red+0.715158*pixel.green+0.072186*pixel.blue; + return(QuantumScale*luminance); + } + break; + } + case 'M': + case 'm': + { + if (LocaleNCompare(symbol,"maxima",6) == 0) + return(FxChannelStatistics(fx_info,image,channel,symbol,exception)); + if (LocaleNCompare(symbol,"mean",4) == 0) + return(FxChannelStatistics(fx_info,image,channel,symbol,exception)); + if (LocaleNCompare(symbol,"minima",6) == 0) + return(FxChannelStatistics(fx_info,image,channel,symbol,exception)); + if (LocaleCompare(symbol,"m") == 0) + return(QuantumScale*pixel.green); + break; + } + case 'N': + case 'n': + { + if (LocaleCompare(symbol,"n") == 0) + return((double) GetImageListLength(fx_info->images)); + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(symbol,"o") == 0) + return(QuantumScale*pixel.opacity); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(symbol,"page.height") == 0) + return((double) image->page.height); + if (LocaleCompare(symbol,"page.width") == 0) + return((double) image->page.width); + if (LocaleCompare(symbol,"page.x") == 0) + return((double) image->page.x); + if (LocaleCompare(symbol,"page.y") == 0) + return((double) image->page.y); + if (LocaleCompare(symbol,"printsize.x") == 0) + return(PerceptibleReciprocal(image->x_resolution)*image->columns); + if (LocaleCompare(symbol,"printsize.y") == 0) + return(PerceptibleReciprocal(image->y_resolution)*image->rows); + break; + } + case 'Q': + case 'q': + { + if (LocaleCompare(symbol,"quality") == 0) + return((double) image->quality); + break; + } + case 'R': + case 'r': + { + if (LocaleCompare(symbol,"resolution.x") == 0) + return(image->x_resolution); + if (LocaleCompare(symbol,"resolution.y") == 0) + return(image->y_resolution); + if (LocaleCompare(symbol,"r") == 0) + return(QuantumScale*pixel.red); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(symbol,"saturation") == 0) + { + double + hue, + lightness, + saturation; + + ConvertRGBToHSL(ClampToQuantum(pixel.red),ClampToQuantum(pixel.green), + ClampToQuantum(pixel.blue),&hue,&saturation,&lightness); + return(saturation); + } + if (LocaleNCompare(symbol,"skewness",8) == 0) + return(FxChannelStatistics(fx_info,image,channel,symbol,exception)); + if (LocaleNCompare(symbol,"standard_deviation",18) == 0) + return(FxChannelStatistics(fx_info,image,channel,symbol,exception)); + break; + } + case 'T': + case 't': + { + if (LocaleCompare(symbol,"t") == 0) + return((double) GetImageIndexInList(fx_info->images)); + break; + } + case 'W': + case 'w': + { + if (LocaleCompare(symbol,"w") == 0) + return((double) image->columns); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(symbol,"y") == 0) + return(QuantumScale*pixel.blue); + break; + } + case 'Z': + case 'z': + { + if (LocaleCompare(symbol,"z") == 0) + { + double + depth; + + depth=(double) GetImageChannelDepth(image,channel,fx_info->exception); + return(depth); + } + break; + } + default: + break; + } + value=GetFxSymbolValue(fx_info,symbol); + if (value != (const double *) NULL) + return(*value); + artifact=GetImageArtifact(image,symbol); + if (artifact != (const char *) NULL) + return(StringToDouble(artifact,(char **) NULL)); + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "UndefinedVariable","`%s'",symbol); + (void) SetFxSymbolValue(fx_info,symbol,0.0); + return(0.0); +} + +static const char *FxOperatorPrecedence(const char *expression, + ExceptionInfo *exception) +{ + typedef enum + { + UndefinedPrecedence, + NullPrecedence, + BitwiseComplementPrecedence, + ExponentPrecedence, + ExponentialNotationPrecedence, + MultiplyPrecedence, + AdditionPrecedence, + ShiftPrecedence, + RelationalPrecedence, + EquivalencyPrecedence, + BitwiseAndPrecedence, + BitwiseOrPrecedence, + LogicalAndPrecedence, + LogicalOrPrecedence, + TernaryPrecedence, + AssignmentPrecedence, + CommaPrecedence, + SeparatorPrecedence + } FxPrecedence; + + FxPrecedence + precedence, + target; + + const char + *subexpression; + + int + c; + + size_t + level; + + c=(-1); + level=0; + subexpression=(const char *) NULL; + target=NullPrecedence; + while ((c != '\0') && (*expression != '\0')) + { + precedence=UndefinedPrecedence; + if ((isspace((int) ((unsigned char) *expression)) != 0) || (c == (int) '@')) + { + expression++; + continue; + } + switch (*expression) + { + case 'A': + case 'a': + { +#if defined(MAGICKCORE_HAVE_ACOSH) + if (IsFxFunction(expression,"acosh",5) != MagickFalse) + { + expression+=5; + break; + } +#endif +#if defined(MAGICKCORE_HAVE_ASINH) + if (IsFxFunction(expression,"asinh",5) != MagickFalse) + { + expression+=5; + break; + } +#endif +#if defined(MAGICKCORE_HAVE_ATANH) + if (IsFxFunction(expression,"atanh",5) != MagickFalse) + { + expression+=5; + break; + } +#endif + if (IsFxFunction(expression,"atan2",5) != MagickFalse) + { + expression+=5; + break; + } + break; + } + case 'E': + case 'e': + { + if ((isdigit((int) ((unsigned char) c)) != 0) && + ((LocaleNCompare(expression,"E+",2) == 0) || + (LocaleNCompare(expression,"E-",2) == 0))) + { + expression+=2; /* scientific notation */ + break; + } + } + case 'J': + case 'j': + { + if ((IsFxFunction(expression,"j0",2) != MagickFalse) || + (IsFxFunction(expression,"j1",2) != MagickFalse)) + { + expression+=2; + break; + } + break; + } + case '#': + { + while (isxdigit((int) ((unsigned char) *(expression+1))) != 0) + expression++; + break; + } + default: + break; + } + if ((c == (int) '{') || (c == (int) '[')) + level++; + else + if ((c == (int) '}') || (c == (int) ']')) + level--; + if (level == 0) + switch ((unsigned char) *expression) + { + case '~': + case '!': + { + precedence=BitwiseComplementPrecedence; + break; + } + case '^': + case '@': + { + precedence=ExponentPrecedence; + break; + } + default: + { + if (((c != 0) && ((isdigit((int) ((unsigned char) c)) != 0) || + (strchr(")",c) != (char *) NULL))) && + (((islower((int) ((unsigned char) *expression)) != 0) || + (strchr("(",(int) ((unsigned char) *expression)) != (char *) NULL)) || + ((isdigit((int) ((unsigned char) c)) == 0) && + (isdigit((int) ((unsigned char) *expression)) != 0))) && + (strchr("xy",(int) ((unsigned char) *expression)) == (char *) NULL)) + precedence=MultiplyPrecedence; + break; + } + case '*': + case '/': + case '%': + { + precedence=MultiplyPrecedence; + break; + } + case '+': + case '-': + { + if ((strchr("(+-/*%:&^|<>~,",c) == (char *) NULL) || + (isalpha((int) ((unsigned char) c)) != 0)) + precedence=AdditionPrecedence; + break; + } + case BitwiseAndAssignmentOperator: + case BitwiseOrAssignmentOperator: + case LeftShiftAssignmentOperator: + case RightShiftAssignmentOperator: + case PowerAssignmentOperator: + case ModuloAssignmentOperator: + case PlusAssignmentOperator: + case SubtractAssignmentOperator: + case MultiplyAssignmentOperator: + case DivideAssignmentOperator: + case IncrementAssignmentOperator: + case DecrementAssignmentOperator: + { + precedence=AssignmentPrecedence; + break; + } + case LeftShiftOperator: + case RightShiftOperator: + { + precedence=ShiftPrecedence; + break; + } + case '<': + case LessThanEqualOperator: + case GreaterThanEqualOperator: + case '>': + { + precedence=RelationalPrecedence; + break; + } + case EqualOperator: + case NotEqualOperator: + { + precedence=EquivalencyPrecedence; + break; + } + case '&': + { + precedence=BitwiseAndPrecedence; + break; + } + case '|': + { + precedence=BitwiseOrPrecedence; + break; + } + case LogicalAndOperator: + { + precedence=LogicalAndPrecedence; + break; + } + case LogicalOrOperator: + { + precedence=LogicalOrPrecedence; + break; + } + case ExponentialNotation: + { + precedence=ExponentialNotationPrecedence; + break; + } + case ':': + case '?': + { + precedence=TernaryPrecedence; + break; + } + case '=': + { + precedence=AssignmentPrecedence; + break; + } + case ',': + { + precedence=CommaPrecedence; + break; + } + case ';': + { + precedence=SeparatorPrecedence; + break; + } + } + if ((precedence == BitwiseComplementPrecedence) || + (precedence == TernaryPrecedence) || + (precedence == AssignmentPrecedence)) + { + if (precedence > target) + { + /* + Right-to-left associativity. + */ + target=precedence; + subexpression=expression; + } + } + else + if (precedence >= target) + { + /* + Left-to-right associativity. + */ + target=precedence; + subexpression=expression; + } + if (strchr("(",(int) *expression) != (char *) NULL) + expression=FxSubexpression(expression,exception); + c=(int) (*expression++); + } + return(subexpression); +} + +static double FxEvaluateSubexpression(FxInfo *fx_info,const ChannelType channel, + const ssize_t x,const ssize_t y,const char *expression,const size_t depth, + double *beta,ExceptionInfo *exception) +{ +#define FxMaxParenthesisDepth 58 +#define FxMaxSubexpressionDepth 200 +#define FxReturn(value) \ +{ \ + subexpression=DestroyString(subexpression); \ + return(value); \ +} +#define FxParseConditional(subexpression,sentinal,p,q) \ +{ \ + p=subexpression; \ + for (q=(char *) p; (*q != (sentinal)) && (*q != '\0'); q++) \ + if (*q == '(') \ + { \ + for (q++; (*q != ')') && (*q != '\0'); q++); \ + if (*q == '\0') \ + break; \ + } \ + if (*q == '\0') \ + { \ + (void) ThrowMagickException(exception,GetMagickModule(), \ + OptionError,"UnableToParseExpression","`%s'",subexpression); \ + FxReturn(0.0); \ + } \ + if (strlen(q) == 1) \ + *(q+1)='\0'; \ + *q='\0'; \ +} + + char + *q, + *subexpression; + + double + alpha, + gamma, + sans, + value; + + const char + *p; + + *beta=0.0; + sans=0.0; + subexpression=AcquireString(expression); + *subexpression='\0'; + if (depth > FxMaxSubexpressionDepth) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "UnableToParseExpression","`%s'",expression); + FxReturn(0.0); + } + if (exception->severity >= ErrorException) + FxReturn(0.0); + while (isspace((int) ((unsigned char) *expression)) != 0) + expression++; + if (*expression == '\0') + FxReturn(0.0); + p=FxOperatorPrecedence(expression,exception); + if (p != (const char *) NULL) + { + (void) CopyMagickString(subexpression,expression,(size_t) + (p-expression+1)); + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,subexpression,depth+1, + beta,exception); + switch ((unsigned char) *p) + { + case '~': + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + *beta=(double) (~(size_t) *beta); + FxReturn(*beta); + } + case '!': + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(*beta == 0.0 ? 1.0 : 0.0); + } + case '^': + { + *beta=pow(alpha,FxEvaluateSubexpression(fx_info,channel,x,y,++p, + depth+1,beta,exception)); + FxReturn(*beta); + } + case '*': + case ExponentialNotation: + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(alpha*(*beta)); + } + case '/': + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(PerceptibleReciprocal(*beta)*alpha); + } + case '%': + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(fmod(alpha,*beta)); + } + case '+': + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(alpha+(*beta)); + } + case '-': + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(alpha-(*beta)); + } + case BitwiseAndAssignmentOperator: + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=(double) ((size_t) (alpha+0.5) & (size_t) (*beta+0.5)); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case BitwiseOrAssignmentOperator: + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=(double) ((size_t) (alpha+0.5) | (size_t) (*beta+0.5)); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case LeftShiftAssignmentOperator: + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + if ((size_t) (*beta+0.5) >= (8*sizeof(size_t))) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"ShiftCountOverflow","`%s'",subexpression); + FxReturn(0.0); + } + value=(double) ((size_t) (alpha+0.5) << (size_t) (*beta+0.5)); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case RightShiftAssignmentOperator: + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + if ((size_t) (*beta+0.5) >= (8*sizeof(size_t))) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"ShiftCountOverflow","`%s'",subexpression); + FxReturn(0.0); + } + value=(double) ((size_t) (alpha+0.5) >> (size_t) (*beta+0.5)); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case PowerAssignmentOperator: + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=pow(alpha,*beta); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case ModuloAssignmentOperator: + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=fmod(alpha,*beta); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case PlusAssignmentOperator: + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=alpha+(*beta); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case SubtractAssignmentOperator: + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=alpha-(*beta); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case MultiplyAssignmentOperator: + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=alpha*(*beta); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case DivideAssignmentOperator: + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=alpha*PerceptibleReciprocal(*beta); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case IncrementAssignmentOperator: + { + if (*subexpression == '\0') + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=alpha+1.0; + if (*subexpression == '\0') + { + if (SetFxSymbolValue(fx_info,p,value) == MagickFalse) + return(0.0); + } + else + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case DecrementAssignmentOperator: + { + if (*subexpression == '\0') + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=alpha-1.0; + if (*subexpression == '\0') + { + if (SetFxSymbolValue(fx_info,p,value) == MagickFalse) + return(0.0); + } + else + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case LeftShiftOperator: + { + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + if ((size_t) (gamma+0.5) >= (8*sizeof(size_t))) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"ShiftCountOverflow","`%s'",subexpression); + FxReturn(0.0); + } + *beta=(double) ((size_t) (alpha+0.5) << (size_t) (gamma+0.5)); + FxReturn(*beta); + } + case RightShiftOperator: + { + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + if ((size_t) (gamma+0.5) >= (8*sizeof(size_t))) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"ShiftCountOverflow","`%s'",subexpression); + FxReturn(0.0); + } + *beta=(double) ((size_t) (alpha+0.5) >> (size_t) (gamma+0.5)); + FxReturn(*beta); + } + case '<': + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(alpha < *beta ? 1.0 : 0.0); + } + case LessThanEqualOperator: + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(alpha <= *beta ? 1.0 : 0.0); + } + case '>': + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(alpha > *beta ? 1.0 : 0.0); + } + case GreaterThanEqualOperator: + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(alpha >= *beta ? 1.0 : 0.0); + } + case EqualOperator: + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(fabs(alpha-(*beta)) < MagickEpsilon ? 1.0 : 0.0); + } + case NotEqualOperator: + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(fabs(alpha-(*beta)) >= MagickEpsilon ? 1.0 : 0.0); + } + case '&': + { + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + *beta=(double) ((size_t) (alpha+0.5) & (size_t) (gamma+0.5)); + FxReturn(*beta); + } + case '|': + { + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + *beta=(double) ((size_t) (alpha+0.5) | (size_t) (gamma+0.5)); + FxReturn(*beta); + } + case LogicalAndOperator: + { + p++; + if (alpha <= 0.0) + { + *beta=0.0; + FxReturn(*beta); + } + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,p,depth+1,beta, + exception); + *beta=(gamma > 0.0) ? 1.0 : 0.0; + FxReturn(*beta); + } + case LogicalOrOperator: + { + p++; + if (alpha > 0.0) + { + *beta=1.0; + FxReturn(*beta); + } + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,p,depth+1,beta, + exception); + *beta=(gamma > 0.0) ? 1.0 : 0.0; + FxReturn(*beta); + } + case '?': + { + double + gamma; + + (void) CopyMagickString(subexpression,++p,MaxTextExtent-1); + FxParseConditional(subexpression,':',p,q); + if (fabs(alpha) >= MagickEpsilon) + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,p,depth+1,beta, + exception); + else + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,q+1,depth+1,beta, + exception); + FxReturn(gamma); + } + case '=': + { + q=subexpression; + while (isalpha((int) ((unsigned char) *q)) != 0) + q++; + if (*q != '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnableToParseExpression","`%s'",subexpression); + FxReturn(0.0); + } + ClearMagickException(exception); + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + value=(*beta); + if (SetFxSymbolValue(fx_info,subexpression,value) == MagickFalse) + return(0.0); + FxReturn(*beta); + } + case ',': + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(alpha); + } + case ';': + { + *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1,beta, + exception); + FxReturn(*beta); + } + default: + { + gamma=alpha*FxEvaluateSubexpression(fx_info,channel,x,y,++p,depth+1, + beta,exception); + FxReturn(gamma); + } + } + } + if (strchr("(",(int) *expression) != (char *) NULL) + { + size_t + length; + + if (depth >= FxMaxParenthesisDepth) + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "ParenthesisNestedTooDeeply","`%s'",expression); + length=CopyMagickString(subexpression,expression+1,MaxTextExtent); + if (length != 0) + subexpression[length-1]='\0'; + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,subexpression,depth+1, + beta,exception); + FxReturn(gamma); + } + switch (*expression) + { + case '+': + { + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,expression+1,depth+1, + beta,exception); + FxReturn(1.0*gamma); + } + case '-': + { + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,expression+1,depth+1, + beta,exception); + FxReturn(-1.0*gamma); + } + case '~': + { + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,expression+1,depth+1, + beta,exception); + FxReturn((double) (~(size_t) (gamma+0.5))); + } + case 'A': + case 'a': + { + if (IsFxFunction(expression,"abs",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(fabs(alpha)); + } +#if defined(MAGICKCORE_HAVE_ACOSH) + if (IsFxFunction(expression,"acosh",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + FxReturn(acosh(alpha)); + } +#endif + if (IsFxFunction(expression,"acos",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + FxReturn(acos(alpha)); + } +#if defined(MAGICKCORE_HAVE_J1) + if (IsFxFunction(expression,"airy",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + if (alpha == 0.0) + FxReturn(1.0); + gamma=2.0*j1((MagickPI*alpha))/(MagickPI*alpha); + FxReturn(gamma*gamma); + } +#endif +#if defined(MAGICKCORE_HAVE_ASINH) + if (IsFxFunction(expression,"asinh",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + FxReturn(asinh(alpha)); + } +#endif + if (IsFxFunction(expression,"asin",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + FxReturn(asin(alpha)); + } + if (IsFxFunction(expression,"alt",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(((ssize_t) alpha) & 0x01 ? -1.0 : 1.0); + } + if (IsFxFunction(expression,"atan2",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + FxReturn(atan2(alpha,*beta)); + } +#if defined(MAGICKCORE_HAVE_ATANH) + if (IsFxFunction(expression,"atanh",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + FxReturn(atanh(alpha)); + } +#endif + if (IsFxFunction(expression,"atan",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + FxReturn(atan(alpha)); + } + if (LocaleCompare(expression,"a") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'B': + case 'b': + { + if (LocaleCompare(expression,"b") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'C': + case 'c': + { + if (IsFxFunction(expression,"ceil",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + FxReturn(ceil(alpha)); + } + if (IsFxFunction(expression,"clamp",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + if (alpha < 0.0) + FxReturn(0.0); + if (alpha > 1.0) + FxReturn(1.0); + FxReturn(alpha); + } + if (IsFxFunction(expression,"cosh",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + FxReturn(cosh(alpha)); + } + if (IsFxFunction(expression,"cos",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(cos(alpha)); + } + if (LocaleCompare(expression,"c") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'D': + case 'd': + { + if (IsFxFunction(expression,"debug",5) != MagickFalse) + { + const char + *type; + + size_t + length; + + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + switch (fx_info->images->colorspace) + { + case CMYKColorspace: + { + switch (channel) + { + case CyanChannel: type="cyan"; break; + case MagentaChannel: type="magenta"; break; + case YellowChannel: type="yellow"; break; + case AlphaChannel: type="alpha"; break; + case BlackChannel: type="black"; break; + default: type="unknown"; break; + } + break; + } + case GRAYColorspace: + { + switch (channel) + { + case RedChannel: type="gray"; break; + case AlphaChannel: type="alpha"; break; + default: type="unknown"; break; + } + break; + } + default: + { + switch (channel) + { + case RedChannel: type="red"; break; + case GreenChannel: type="green"; break; + case BlueChannel: type="blue"; break; + case AlphaChannel: type="alpha"; break; + default: type="unknown"; break; + } + break; + } + } + *subexpression='\0'; + length=1; + if (strlen(expression) > 6) + length=CopyMagickString(subexpression,expression+6,MaxTextExtent); + if (length != 0) + subexpression[length-1]='\0'; + if (fx_info->file != (FILE *) NULL) + (void) FormatLocaleFile(fx_info->file, + "%s[%.20g,%.20g].%s: %s=%.*g\n",fx_info->images->filename, + (double) x,(double) y,type,subexpression,GetMagickPrecision(), + (double) alpha); + FxReturn(alpha); + } + if (IsFxFunction(expression,"do",2) != MagickFalse) + { + size_t + length; + + /* + Parse do(expression,condition test). + */ + length=CopyMagickString(subexpression,expression+6, + MagickPathExtent-1); + if (length != 0) + subexpression[length-1]='\0'; + FxParseConditional(subexpression,',',p,q); + for (alpha=0.0; ; ) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,q+1,depth+1,beta, + exception); + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,p,depth+1,&sans, + exception); + if (fabs(gamma) < MagickEpsilon) + break; + } + FxReturn(alpha); + } + if (IsFxFunction(expression,"drc",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(alpha*PerceptibleReciprocal(*beta*(alpha-1.0)+1.0)); + } + break; + } + case 'E': + case 'e': + { + if (LocaleCompare(expression,"epsilon") == 0) + FxReturn(MagickEpsilon); +#if defined(MAGICKCORE_HAVE_ERF) + if (IsFxFunction(expression,"erf",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(erf(alpha)); + } +#endif + if (IsFxFunction(expression,"exp",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(exp(alpha)); + } + if (LocaleCompare(expression,"e") == 0) + FxReturn(2.7182818284590452354); + break; + } + case 'F': + case 'f': + { + if (IsFxFunction(expression,"floor",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + FxReturn(floor(alpha)); + } + if (IsFxFunction(expression,"for",3) != MagickFalse) + { + double + sans = 0.0; + + size_t + length; + + /* + Parse for(initialization, condition test, expression). + */ + length=CopyMagickString(subexpression,expression+4, + MagickPathExtent-1); + if (length != 0) + subexpression[length-1]='\0'; + FxParseConditional(subexpression,',',p,q); + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,p,depth+1,&sans, + exception); + (void) CopyMagickString(subexpression,q+1,MagickPathExtent-1); + FxParseConditional(subexpression,',',p,q); + for (alpha=0.0; ; ) + { + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,p,depth+1,&sans, + exception); + if (fabs(gamma) < MagickEpsilon) + break; + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,q+1,depth+1,beta, + exception); + } + FxReturn(alpha); + } + break; + } + case 'G': + case 'g': + { + if (IsFxFunction(expression,"gauss",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + FxReturn(exp((-alpha*alpha/2.0))/sqrt(2.0*MagickPI)); + } + if (IsFxFunction(expression,"gcd",3) != MagickFalse) + { + double + gcd; + + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + if (IsNaN(alpha)) + FxReturn(alpha); + gcd=FxGCD(alpha,*beta,0); + FxReturn(gcd); + } + if (LocaleCompare(expression,"g") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'H': + case 'h': + { + if (LocaleCompare(expression,"h") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + if (LocaleCompare(expression,"hue") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + if (IsFxFunction(expression,"hypot",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + FxReturn(hypot(alpha,*beta)); + } + break; + } + case 'K': + case 'k': + { + if (LocaleCompare(expression,"k") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'I': + case 'i': + { + if (IsFxFunction(expression,"if",2) != MagickFalse) + { + double + sans = 0.0; + + size_t + length; + + /* + Parse if(condition test, true-expression, false-expression). + */ + length=CopyMagickString(subexpression,expression+3, + MagickPathExtent-1); + if (length != 0) + subexpression[length-1]='\0'; + FxParseConditional(subexpression,',',p,q); + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,p,depth+1,&sans, + exception); + (void) CopyMagickString(subexpression,q+1,MagickPathExtent-1); + FxParseConditional(subexpression,',',p,q); + if (fabs(alpha) >= MagickEpsilon) + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,p,depth+1,beta, + exception); + else + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,q+1,depth+1,beta, + exception); + FxReturn(alpha); + } + if (LocaleCompare(expression,"intensity") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + if (IsFxFunction(expression,"int",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(floor(alpha)); + } + if (IsFxFunction(expression,"isnan",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + FxReturn((double) !!IsNaN(alpha)); + } + if (LocaleCompare(expression,"i") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'J': + case 'j': + { + if (LocaleCompare(expression,"j") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); +#if defined(MAGICKCORE_HAVE_J0) + if (IsFxFunction(expression,"j0",2) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+2, + depth+1,beta,exception); + FxReturn(j0(alpha)); + } +#endif +#if defined(MAGICKCORE_HAVE_J1) + if (IsFxFunction(expression,"j1",2) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+2, + depth+1,beta,exception); + FxReturn(j1(alpha)); + } +#endif +#if defined(MAGICKCORE_HAVE_J1) + if (IsFxFunction(expression,"jinc",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + if (alpha == 0.0) + FxReturn(1.0); + FxReturn((2.0*j1((MagickPI*alpha))/(MagickPI*alpha))); + } +#endif + break; + } + case 'L': + case 'l': + { + if (IsFxFunction(expression,"ln",2) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+2, + depth+1,beta,exception); + FxReturn(log(alpha)); + } + if (IsFxFunction(expression,"logtwo",6) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+6, + depth+1,beta,exception); + FxReturn(log10(alpha)/log10(2.0)); + } + if (IsFxFunction(expression,"log",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(log10(alpha)); + } + if (LocaleCompare(expression,"lightness") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'M': + case 'm': + { + if (LocaleCompare(expression,"MaxRGB") == 0) + FxReturn((double) QuantumRange); + if (LocaleNCompare(expression,"maxima",6) == 0) + break; + if (IsFxFunction(expression,"max",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(alpha > *beta ? alpha : *beta); + } + if (LocaleNCompare(expression,"minima",6) == 0) + break; + if (IsFxFunction(expression,"min",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(alpha < *beta ? alpha : *beta); + } + if (IsFxFunction(expression,"mod",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(alpha-floor((alpha*PerceptibleReciprocal(*beta)))*(*beta)); + } + if (LocaleCompare(expression,"m") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'N': + case 'n': + { + if (IsFxFunction(expression,"not",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn((double) (alpha < MagickEpsilon)); + } + if (LocaleCompare(expression,"n") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'O': + case 'o': + { + if (LocaleCompare(expression,"Opaque") == 0) + FxReturn(1.0); + if (LocaleCompare(expression,"o") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'P': + case 'p': + { + if (LocaleCompare(expression,"phi") == 0) + FxReturn(MagickPHI); + if (LocaleCompare(expression,"pi") == 0) + FxReturn(MagickPI); + if (IsFxFunction(expression,"pow",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(pow(alpha,*beta)); + } + if (LocaleCompare(expression,"p") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'Q': + case 'q': + { + if (LocaleCompare(expression,"QuantumRange") == 0) + FxReturn((double) QuantumRange); + if (LocaleCompare(expression,"QuantumScale") == 0) + FxReturn(QuantumScale); + break; + } + case 'R': + case 'r': + { + if (IsFxFunction(expression,"rand",4) != MagickFalse) + { + double + alpha; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp critical (MagickCore_FxEvaluateSubexpression) +#endif + alpha=GetPseudoRandomValue(fx_info->random_info); + FxReturn(alpha); + } + if (IsFxFunction(expression,"round",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + if ((alpha-floor(alpha)) < (ceil(alpha)-alpha)) + FxReturn(floor(alpha)); + FxReturn(ceil(alpha)); + } + if (LocaleCompare(expression,"r") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'S': + case 's': + { + if (LocaleCompare(expression,"saturation") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + if (IsFxFunction(expression,"sign",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + FxReturn(alpha < 0.0 ? -1.0 : 1.0); + } + if (IsFxFunction(expression,"sinc",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + if (alpha == 0) + FxReturn(1.0); + FxReturn(sin((MagickPI*alpha))/(MagickPI*alpha)); + } + if (IsFxFunction(expression,"sinh",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + FxReturn(sinh(alpha)); + } + if (IsFxFunction(expression,"sin",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(sin(alpha)); + } + if (IsFxFunction(expression,"sqrt",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + FxReturn(sqrt(alpha)); + } + if (IsFxFunction(expression,"squish",6) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+6, + depth+1,beta,exception); + FxReturn((1.0/(1.0+exp(-alpha)))); + } + if (LocaleCompare(expression,"s") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'T': + case 't': + { + if (IsFxFunction(expression,"tanh",4) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+4, + depth+1,beta,exception); + FxReturn(tanh(alpha)); + } + if (IsFxFunction(expression,"tan",3) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+3, + depth+1,beta,exception); + FxReturn(tan(alpha)); + } + if (LocaleCompare(expression,"Transparent") == 0) + FxReturn(0.0); + if (IsFxFunction(expression,"trunc",5) != MagickFalse) + { + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5, + depth+1,beta,exception); + if (alpha >= 0.0) + FxReturn(floor(alpha)); + FxReturn(ceil(alpha)); + } + if (LocaleCompare(expression,"t") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'U': + case 'u': + { + if (LocaleCompare(expression,"u") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'V': + case 'v': + { + if (LocaleCompare(expression,"v") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'W': + case 'w': + { + if (IsFxFunction(expression,"while",5) != MagickFalse) + { + size_t + length; + + /* + Parse while(condition,expression). + */ + length=CopyMagickString(subexpression,expression+6, + MagickPathExtent-1); + if (length != 0) + subexpression[length-1]='\0'; + FxParseConditional(subexpression,',',p,q); + for (alpha=0.0; ; ) + { + gamma=FxEvaluateSubexpression(fx_info,channel,x,y,p,depth+1,beta, + exception); + if (fabs(gamma) < MagickEpsilon) + break; + alpha=FxEvaluateSubexpression(fx_info,channel,x,y,q+1,depth+1,beta, + exception); + } + FxReturn(alpha); + } + if (LocaleCompare(expression,"w") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'Y': + case 'y': + { + if (LocaleCompare(expression,"y") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + case 'Z': + case 'z': + { + if (LocaleCompare(expression,"z") == 0) + FxReturn(FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception)); + break; + } + default: + break; + } + q=(char *) expression; + alpha=InterpretSiPrefixValue(expression,&q); + if (q == expression) + alpha=FxGetSymbol(fx_info,channel,x,y,expression,depth+1,exception); + if (*q == ')') + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "UnbalancedParenthesis","`%s'",expression); + FxReturn(alpha); +} + +MagickExport MagickBooleanType FxEvaluateExpression(FxInfo *fx_info, + double *alpha,ExceptionInfo *exception) +{ + MagickBooleanType + status; + + status=FxEvaluateChannelExpression(fx_info,GrayChannel,0,0,alpha,exception); + return(status); +} + +MagickExport MagickBooleanType FxPreprocessExpression(FxInfo *fx_info, + double *alpha,ExceptionInfo *exception) +{ + FILE + *file; + + MagickBooleanType + status; + + file=fx_info->file; + fx_info->file=(FILE *) NULL; + status=FxEvaluateChannelExpression(fx_info,GrayChannel,0,0,alpha,exception); + fx_info->file=file; + return(status); +} + +MagickExport MagickBooleanType FxEvaluateChannelExpression(FxInfo *fx_info, + const ChannelType channel,const ssize_t x,const ssize_t y,double *alpha, + ExceptionInfo *exception) +{ + double + beta; + + beta=0.0; + *alpha=FxEvaluateSubexpression(fx_info,channel,x,y,fx_info->expression,0, + &beta,exception); + return(exception->severity == OptionError ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% F x I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FxImage() applies a mathematical expression to the specified image. +% +% The format of the FxImage method is: +% +% Image *FxImage(const Image *image,const char *expression, +% ExceptionInfo *exception) +% Image *FxImageChannel(const Image *image,const ChannelType channel, +% const char *expression,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel. +% +% o expression: A mathematical expression. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static FxInfo **DestroyFxTLS(FxInfo **fx_info) +{ + ssize_t + i; + + assert(fx_info != (FxInfo **) NULL); + for (i=0; i < (ssize_t) GetMagickResourceLimit(ThreadResource); i++) + if (fx_info[i] != (FxInfo *) NULL) + fx_info[i]=DestroyFxInfo(fx_info[i]); + fx_info=(FxInfo **) RelinquishMagickMemory(fx_info); + return(fx_info); +} + +static FxInfo **AcquireFxTLS(const Image *image,const char *expression, + ExceptionInfo *exception) +{ + char + *fx_expression; + + double + alpha; + + FxInfo + **fx_info; + + ssize_t + i; + + size_t + number_threads; + + number_threads=(size_t) GetMagickResourceLimit(ThreadResource); + fx_info=(FxInfo **) AcquireQuantumMemory(number_threads,sizeof(*fx_info)); + if (fx_info == (FxInfo **) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return((FxInfo **) NULL); + } + (void) memset(fx_info,0,number_threads*sizeof(*fx_info)); + if (*expression != '@') + fx_expression=ConstantString(expression); + else + fx_expression=FileToString(expression+1,~0UL,exception); + for (i=0; i < (ssize_t) number_threads; i++) + { + MagickBooleanType + status; + + fx_info[i]=AcquireFxInfo(image,fx_expression); + if (fx_info[i] == (FxInfo *) NULL) + break; + status=FxPreprocessExpression(fx_info[i],&alpha,exception); + if (status == MagickFalse) + break; + } + fx_expression=DestroyString(fx_expression); + if (i < (ssize_t) number_threads) + fx_info=DestroyFxTLS(fx_info); + return(fx_info); +} + +MagickExport Image *FxImage(const Image *image,const char *expression, + ExceptionInfo *exception) +{ + Image + *fx_image; + + fx_image=FxImageChannel(image,GrayChannel,expression,exception); + return(fx_image); +} + +MagickExport Image *FxImageChannel(const Image *image,const ChannelType channel, + const char *expression,ExceptionInfo *exception) +{ +#define FxImageTag "Fx/Image" + + CacheView + *fx_view; + + FxInfo + **magick_restrict fx_info; + + Image + *fx_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (expression == (const char *) NULL) + return(CloneImage(image,0,0,MagickTrue,exception)); + fx_info=AcquireFxTLS(image,expression,exception); + if (fx_info == (FxInfo **) NULL) + return((Image *) NULL); + fx_image=CloneImage(image,0,0,MagickTrue,exception); + if (fx_image == (Image *) NULL) + { + fx_info=DestroyFxTLS(fx_info); + return((Image *) NULL); + } + if (SetImageStorageClass(fx_image,DirectClass) == MagickFalse) + { + InheritException(exception,&fx_image->exception); + fx_info=DestroyFxTLS(fx_info); + fx_image=DestroyImage(fx_image); + return((Image *) NULL); + } + /* + Fx image. + */ + status=MagickTrue; + progress=0; + fx_view=AcquireAuthenticCacheView(fx_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(dynamic) shared(progress,status) \ + magick_number_threads(image,fx_image,fx_image->rows, \ + GlobExpression(fx_info[0]->expression,"*debug(*",MagickTrue) == 0 ? 1 : 0) +#endif + for (y=0; y < (ssize_t) fx_image->rows; y++) + { + const int + id = GetOpenMPThreadId(); + + double + alpha; + + IndexPacket + *magick_restrict fx_indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict q; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(fx_view,0,y,fx_image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + fx_indexes=GetCacheViewAuthenticIndexQueue(fx_view); + alpha=0.0; + for (x=0; x < (ssize_t) fx_image->columns; x++) + { + if ((channel & RedChannel) != 0) + { + (void) FxEvaluateChannelExpression(fx_info[id],RedChannel,x,y, + &alpha,exception); + SetPixelRed(q,ClampToQuantum((MagickRealType) QuantumRange*alpha)); + } + if ((channel & GreenChannel) != 0) + { + (void) FxEvaluateChannelExpression(fx_info[id],GreenChannel,x,y, + &alpha,exception); + SetPixelGreen(q,ClampToQuantum((MagickRealType) QuantumRange*alpha)); + } + if ((channel & BlueChannel) != 0) + { + (void) FxEvaluateChannelExpression(fx_info[id],BlueChannel,x,y, + &alpha,exception); + SetPixelBlue(q,ClampToQuantum((MagickRealType) QuantumRange*alpha)); + } + if ((channel & OpacityChannel) != 0) + { + (void) FxEvaluateChannelExpression(fx_info[id],OpacityChannel,x,y, + &alpha,exception); + if (image->matte == MagickFalse) + SetPixelOpacity(q,ClampToQuantum((MagickRealType) QuantumRange* + alpha)); + else + SetPixelOpacity(q,ClampToQuantum((MagickRealType) (QuantumRange- + QuantumRange*alpha))); + } + if (((channel & IndexChannel) != 0) && + (fx_image->colorspace == CMYKColorspace)) + { + (void) FxEvaluateChannelExpression(fx_info[id],IndexChannel,x,y, + &alpha,exception); + SetPixelIndex(fx_indexes+x,ClampToQuantum((MagickRealType) + QuantumRange*alpha)); + } + q++; + } + if (SyncCacheViewAuthenticPixels(fx_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,FxImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + fx_view=DestroyCacheView(fx_view); + fx_info=DestroyFxTLS(fx_info); + if (status == MagickFalse) + fx_image=DestroyImage(fx_image); + return(fx_image); +} diff --git a/ImageMagick-6.9.12-44/magick/fx.h b/ImageMagick-6.9.12-44/magick/fx.h new file mode 100644 index 0000000..a7f8f7d --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/fx.h @@ -0,0 +1,35 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image f/x methods. +*/ +#ifndef MAGICKCORE_FX_H +#define MAGICKCORE_FX_H + +#include "magick/draw.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport Image + *FxImage(const Image *,const char *,ExceptionInfo *), + *FxImageChannel(const Image *,const ChannelType,const char *,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/gem-private.h b/ImageMagick-6.9.12-44/magick/gem-private.h new file mode 100644 index 0000000..92e56bc --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/gem-private.h @@ -0,0 +1,177 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore private graphic gems methods. +*/ +#ifndef MAGICKCORE_GEM_PRIVATE_H +#define MAGICKCORE_GEM_PRIVATE_H + +#include "magick/pixel-accessor.h" +#include "magick/visual-effects.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define D65X 0.95047 +#define D65Y 1.0 +#define D65Z 1.08883 +#define CIEEpsilon (216.0/24389.0) +#define CIEK (24389.0/27.0) + +static inline void ConvertLabToXYZ(const double L,const double a,const double b, + double *X,double *Y,double *Z) +{ + double + x, + y, + z; + + assert(X != (double *) NULL); + assert(Y != (double *) NULL); + assert(Z != (double *) NULL); + y=(L+16.0)/116.0; + x=y+a/500.0; + z=y-b/200.0; + if ((x*x*x) > CIEEpsilon) + x=(x*x*x); + else + x=(116.0*x-16.0)/CIEK; + if (L > (CIEK*CIEEpsilon)) + y=(y*y*y); + else + y=L/CIEK; + if ((z*z*z) > CIEEpsilon) + z=(z*z*z); + else + z=(116.0*z-16.0)/CIEK; + *X=D65X*x; + *Y=D65Y*y; + *Z=D65Z*z; +} + +static inline void ConvertXYZToLuv(const double X,const double Y,const double Z, + double *L,double *u,double *v) +{ + double + alpha; + + assert(L != (double *) NULL); + assert(u != (double *) NULL); + assert(v != (double *) NULL); + if ((Y/D65Y) > CIEEpsilon) + *L=(double) (116.0*pow(Y/D65Y,1.0/3.0)-16.0); + else + *L=CIEK*(Y/D65Y); + alpha=PerceptibleReciprocal(X+15.0*Y+3.0*Z); + *u=13.0*(*L)*((4.0*alpha*X)-(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))); + *v=13.0*(*L)*((9.0*alpha*Y)-(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z))); + *L/=100.0; + *u=(*u+134.0)/354.0; + *v=(*v+140.0)/262.0; +} + +static inline void ConvertRGBToXYZ(const Quantum red,const Quantum green, + const Quantum blue,double *X,double *Y,double *Z) +{ + double + b, + g, + r; + + assert(X != (double *) NULL); + assert(Y != (double *) NULL); + assert(Z != (double *) NULL); + r=QuantumScale*DecodePixelGamma((MagickRealType) red); + g=QuantumScale*DecodePixelGamma((MagickRealType) green); + b=QuantumScale*DecodePixelGamma((MagickRealType) blue); + *X=0.4124564*r+0.3575761*g+0.1804375*b; + *Y=0.2126729*r+0.7151522*g+0.0721750*b; + *Z=0.0193339*r+0.1191920*g+0.9503041*b; +} + +static inline void ConvertXYZToLab(const double X,const double Y,const double Z, + double *L,double *a,double *b) +{ + double + x, + y, + z; + + assert(L != (double *) NULL); + assert(a != (double *) NULL); + assert(b != (double *) NULL); + if ((X/D65X) > CIEEpsilon) + x=pow(X/D65X,1.0/3.0); + else + x=(CIEK*X/D65X+16.0)/116.0; + if ((Y/D65Y) > CIEEpsilon) + y=pow(Y/D65Y,1.0/3.0); + else + y=(CIEK*Y/D65Y+16.0)/116.0; + if ((Z/D65Z) > CIEEpsilon) + z=pow(Z/D65Z,1.0/3.0); + else + z=(CIEK*Z/D65Z+16.0)/116.0; + *L=((116.0*y)-16.0)/100.0; + *a=(500.0*(x-y))/255.0+0.5; + *b=(200.0*(y-z))/255.0+0.5; +} + +static inline void ConvertLuvToXYZ(const double L,const double u,const double v, + double *X,double *Y,double *Z) +{ + double + gamma; + + assert(X != (double *) NULL); + assert(Y != (double *) NULL); + assert(Z != (double *) NULL); + if (L > (CIEK*CIEEpsilon)) + *Y=(double) pow((L+16.0)/116.0,3.0); + else + *Y=L/CIEK; + gamma=PerceptibleReciprocal((((52.0*L*PerceptibleReciprocal(u+13.0*L* + (4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))))-1.0)/3.0)-(-1.0/3.0)); + *X=gamma*((*Y*((39.0*L*PerceptibleReciprocal(v+13.0*L*(9.0*D65Y/ + (D65X+15.0*D65Y+3.0*D65Z))))-5.0))+5.0*(*Y)); + *Z=(*X*(((52.0*L*PerceptibleReciprocal(u+13.0*L*(4.0*D65X/ + (D65X+15.0*D65Y+3.0*D65Z))))-1.0)/3.0))-5.0*(*Y); +} + +static inline void ConvertXYZToRGB(const double X,const double Y,const double Z, + Quantum *red,Quantum *green,Quantum *blue) +{ + double + b, + g, + r; + + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + r=3.2404542*X-1.5371385*Y-0.4985314*Z; + g=(-0.9692660)*X+1.8760108*Y+0.0415560*Z; + b=0.0556434*X-0.2040259*Y+1.0572252*Z; + *red=ClampToQuantum((MagickRealType) EncodePixelGamma(QuantumRange*r)); + *green=ClampToQuantum((MagickRealType) EncodePixelGamma(QuantumRange*g)); + *blue=ClampToQuantum((MagickRealType) EncodePixelGamma(QuantumRange*b)); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/gem.c b/ImageMagick-6.9.12-44/magick/gem.c new file mode 100644 index 0000000..9ae1ffc --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/gem.c @@ -0,0 +1,1708 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% GGGG EEEEE M M % +% G E MM MM % +% G GG EEE M M M % +% G G E M M % +% GGGG EEEEE M M % +% % +% % +% Graphic Gems - Graphic Support Methods % +% % +% Software Design % +% Cristy % +% August 1996 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/color-private.h" +#include "magick/draw.h" +#include "magick/gem.h" +#include "magick/gem-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/log.h" +#include "magick/memory_.h" +#include "magick/pixel-private.h" +#include "magick/quantum.h" +#include "magick/random_.h" +#include "magick/resize.h" +#include "magick/transform.h" +#include "magick/signature-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t H C L T o R G B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertHCLToRGB() transforms a (hue, chroma, luma) to a (red, green, +% blue) triple. +% +% The format of the ConvertHCLToRGBImage method is: +% +% void ConvertHCLToRGB(const double hue,const double chroma, +% const double luma,Quantum *red,Quantum *green,Quantum *blue) +% +% A description of each parameter follows: +% +% o hue, chroma, luma: A double value representing a component of the +% HCL color space. +% +% o red, green, blue: A pointer to a pixel component of type Quantum. +% +*/ +MagickExport void ConvertHCLToRGB(const double hue,const double chroma, + const double luma,Quantum *red,Quantum *green,Quantum *blue) +{ + double + b, + c, + g, + h, + m, + r, + x; + + /* + Convert HCL to RGB colorspace. + */ + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + h=6.0*hue; + c=chroma; + x=c*(1.0-fabs(fmod(h,2.0)-1.0)); + r=0.0; + g=0.0; + b=0.0; + if ((0.0 <= h) && (h < 1.0)) + { + r=c; + g=x; + } + else + if ((1.0 <= h) && (h < 2.0)) + { + r=x; + g=c; + } + else + if ((2.0 <= h) && (h < 3.0)) + { + g=c; + b=x; + } + else + if ((3.0 <= h) && (h < 4.0)) + { + g=x; + b=c; + } + else + if ((4.0 <= h) && (h < 5.0)) + { + r=x; + b=c; + } + else + if ((5.0 <= h) && (h < 6.0)) + { + r=c; + b=x; + } + m=luma-(0.298839*r+0.586811*g+0.114350*b); + *red=ClampToQuantum(QuantumRange*(r+m)); + *green=ClampToQuantum(QuantumRange*(g+m)); + *blue=ClampToQuantum(QuantumRange*(b+m)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t H C L p T o R G B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertHCLpToRGB() transforms a (hue, chroma, luma) to a (red, green, +% blue) triple. Since HCL colorspace is wider than RGB, we instead choose a +% saturation strategy to project it on the RGB cube. +% +% The format of the ConvertHCLpToRGBImage method is: +% +% void ConvertHCLpToRGB(const double hue,const double chroma, +% const double luma,Quantum *red,Quantum *green,Quantum *blue) +% +% A description of each parameter follows: +% +% o hue, chroma, luma: A double value representing a component of the +% HCLp color space. +% +% o red, green, blue: A pointer to a pixel component of type Quantum. +% +*/ +MagickExport void ConvertHCLpToRGB(const double hue,const double chroma, + const double luma,Quantum *red,Quantum *green,Quantum *blue) +{ + double + b, + c, + g, + h, + m, + r, + x, + z; + + /* + Convert HCLp to RGB colorspace. + */ + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + h=6.0*hue; + c=chroma; + x=c*(1.0-fabs(fmod(h,2.0)-1.0)); + r=0.0; + g=0.0; + b=0.0; + if ((0.0 <= h) && (h < 1.0)) + { + r=c; + g=x; + } + else + if ((1.0 <= h) && (h < 2.0)) + { + r=x; + g=c; + } + else + if ((2.0 <= h) && (h < 3.0)) + { + g=c; + b=x; + } + else + if ((3.0 <= h) && (h < 4.0)) + { + g=x; + b=c; + } + else + if ((4.0 <= h) && (h < 5.0)) + { + r=x; + b=c; + } + else + if ((5.0 <= h) && (h < 6.0)) + { + r=c; + b=x; + } + m=luma-(0.298839*r+0.586811*g+0.114350*b); + z=1.0; + if (m < 0.0) + { + z=luma/(luma-m); + m=0.0; + } + else + if (m+c > 1.0) + { + z=(1.0-luma)/(m+c-luma); + m=1.0-z*c; + } + *red=ClampToQuantum(QuantumRange*(z*r+m)); + *green=ClampToQuantum(QuantumRange*(z*g+m)); + *blue=ClampToQuantum(QuantumRange*(z*b+m)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t H S B T o R G B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertHSBToRGB() transforms a (hue, saturation, brightness) to a (red, +% green, blue) triple. +% +% The format of the ConvertHSBToRGBImage method is: +% +% void ConvertHSBToRGB(const double hue,const double saturation, +% const double brightness,Quantum *red,Quantum *green,Quantum *blue) +% +% A description of each parameter follows: +% +% o hue, saturation, brightness: A double value representing a +% component of the HSB color space. +% +% o red, green, blue: A pointer to a pixel component of type Quantum. +% +*/ +MagickExport void ConvertHSBToRGB(const double hue,const double saturation, + const double brightness,Quantum *red,Quantum *green,Quantum *blue) +{ + double + f, + h, + p, + q, + t; + + /* + Convert HSB to RGB colorspace. + */ + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + if (fabs(saturation) < MagickEpsilon) + { + *red=ClampToQuantum(QuantumRange*brightness); + *green=(*red); + *blue=(*red); + return; + } + h=6.0*(hue-floor(hue)); + f=h-floor((double) h); + p=brightness*(1.0-saturation); + q=brightness*(1.0-saturation*f); + t=brightness*(1.0-(saturation*(1.0-f))); + switch ((int) h) + { + case 0: + default: + { + *red=ClampToQuantum(QuantumRange*brightness); + *green=ClampToQuantum(QuantumRange*t); + *blue=ClampToQuantum(QuantumRange*p); + break; + } + case 1: + { + *red=ClampToQuantum(QuantumRange*q); + *green=ClampToQuantum(QuantumRange*brightness); + *blue=ClampToQuantum(QuantumRange*p); + break; + } + case 2: + { + *red=ClampToQuantum(QuantumRange*p); + *green=ClampToQuantum(QuantumRange*brightness); + *blue=ClampToQuantum(QuantumRange*t); + break; + } + case 3: + { + *red=ClampToQuantum(QuantumRange*p); + *green=ClampToQuantum(QuantumRange*q); + *blue=ClampToQuantum(QuantumRange*brightness); + break; + } + case 4: + { + *red=ClampToQuantum(QuantumRange*t); + *green=ClampToQuantum(QuantumRange*p); + *blue=ClampToQuantum(QuantumRange*brightness); + break; + } + case 5: + { + *red=ClampToQuantum(QuantumRange*brightness); + *green=ClampToQuantum(QuantumRange*p); + *blue=ClampToQuantum(QuantumRange*q); + break; + } + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t H S I T o R G B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertHSIToRGB() transforms a (hue, saturation, intensity) to a (red, +% green, blue) triple. +% +% The format of the ConvertHSIToRGBImage method is: +% +% void ConvertHSIToRGB(const double hue,const double saturation, +% const double intensity,Quantum *red,Quantum *green,Quantum *blue) +% +% A description of each parameter follows: +% +% o hue, saturation, intensity: A double value representing a +% component of the HSI color space. +% +% o red, green, blue: A pointer to a pixel component of type Quantum. +% +*/ +MagickExport void ConvertHSIToRGB(const double hue,const double saturation, + const double intensity,Quantum *red,Quantum *green,Quantum *blue) +{ + double + b, + g, + h, + r; + + /* + Convert HSI to RGB colorspace. + */ + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + h=360.0*hue; + h-=360.0*floor(h/360.0); + if (h < 120.0) + { + b=intensity*(1.0-saturation); + r=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)* + (MagickPI/180.0))); + g=3.0*intensity-r-b; + } + else + if (h < 240.0) + { + h-=120.0; + r=intensity*(1.0-saturation); + g=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)* + (MagickPI/180.0))); + b=3.0*intensity-r-g; + } + else + { + h-=240.0; + g=intensity*(1.0-saturation); + b=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)* + (MagickPI/180.0))); + r=3.0*intensity-g-b; + } + *red=ClampToQuantum(QuantumRange*r); + *green=ClampToQuantum(QuantumRange*g); + *blue=ClampToQuantum(QuantumRange*b); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t H S L T o R G B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertHSLToRGB() transforms a (hue, saturation, lightness) to a (red, +% green, blue) triple. +% +% The format of the ConvertHSLToRGBImage method is: +% +% void ConvertHSLToRGB(const double hue,const double saturation, +% const double lightness,Quantum *red,Quantum *green,Quantum *blue) +% +% A description of each parameter follows: +% +% o hue, saturation, lightness: A double value representing a +% component of the HSL color space. +% +% o red, green, blue: A pointer to a pixel component of type Quantum. +% +*/ +MagickExport void ConvertHSLToRGB(const double hue,const double saturation, + const double lightness,Quantum *red,Quantum *green,Quantum *blue) +{ + double + b, + c, + g, + h, + min, + r, + x; + + /* + Convert HSL to RGB colorspace. + */ + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + h=hue*360.0; + if (lightness <= 0.5) + c=2.0*lightness*saturation; + else + c=(2.0-2.0*lightness)*saturation; + min=lightness-0.5*c; + h-=360.0*floor(h/360.0); + h/=60.0; + x=c*(1.0-fabs(h-2.0*floor(h/2.0)-1.0)); + switch ((int) floor(h)) + { + case 0: + { + r=min+c; + g=min+x; + b=min; + break; + } + case 1: + { + r=min+x; + g=min+c; + b=min; + break; + } + case 2: + { + r=min; + g=min+c; + b=min+x; + break; + } + case 3: + { + r=min; + g=min+x; + b=min+c; + break; + } + case 4: + { + r=min+x; + g=min; + b=min+c; + break; + } + case 5: + { + r=min+c; + g=min; + b=min+x; + break; + } + default: + { + r=0.0; + g=0.0; + b=0.0; + } + } + *red=ClampToQuantum(QuantumRange*r); + *green=ClampToQuantum(QuantumRange*g); + *blue=ClampToQuantum(QuantumRange*b); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t H S V T o R G B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertHSVToRGB() transforms a (hue, saturation, value) to a (red, +% green, blue) triple. +% +% The format of the ConvertHSVToRGBImage method is: +% +% void ConvertHSVToRGB(const double hue,const double saturation, +% const double value,Quantum *red,Quantum *green,Quantum *blue) +% +% A description of each parameter follows: +% +% o hue, saturation, value: A double value representing a +% component of the HSV color space. +% +% o red, green, blue: A pointer to a pixel component of type Quantum. +% +*/ +MagickExport void ConvertHSVToRGB(const double hue,const double saturation, + const double value,Quantum *red,Quantum *green,Quantum *blue) +{ + double + b, + c, + g, + h, + min, + r, + x; + + /* + Convert HSV to RGB colorspace. + */ + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + h=hue*360.0; + c=value*saturation; + min=value-c; + h-=360.0*floor(h/360.0); + h/=60.0; + x=c*(1.0-fabs(h-2.0*floor(h/2.0)-1.0)); + switch ((int) floor(h)) + { + case 0: + { + r=min+c; + g=min+x; + b=min; + break; + } + case 1: + { + r=min+x; + g=min+c; + b=min; + break; + } + case 2: + { + r=min; + g=min+c; + b=min+x; + break; + } + case 3: + { + r=min; + g=min+x; + b=min+c; + break; + } + case 4: + { + r=min+x; + g=min; + b=min+c; + break; + } + case 5: + { + r=min+c; + g=min; + b=min+x; + break; + } + default: + { + r=0.0; + g=0.0; + b=0.0; + } + } + *red=ClampToQuantum(QuantumRange*r); + *green=ClampToQuantum(QuantumRange*g); + *blue=ClampToQuantum(QuantumRange*b); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t H W B T o R G B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertHWBToRGB() transforms a (hue, whiteness, blackness) to a (red, green, +% blue) triple. +% +% The format of the ConvertHWBToRGBImage method is: +% +% void ConvertHWBToRGB(const double hue,const double whiteness, +% const double blackness,Quantum *red,Quantum *green,Quantum *blue) +% +% A description of each parameter follows: +% +% o hue, whiteness, blackness: A double value representing a +% component of the HWB color space. +% +% o red, green, blue: A pointer to a pixel component of type Quantum. +% +*/ +MagickExport void ConvertHWBToRGB(const double hue,const double whiteness, + const double blackness,Quantum *red,Quantum *green,Quantum *blue) +{ + double + b, + f, + g, + n, + r, + v; + + ssize_t + i; + + /* + Convert HWB to RGB colorspace. + */ + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + v=1.0-blackness; + if (fabs(hue-(-1.0)) < MagickEpsilon) + { + *red=ClampToQuantum(QuantumRange*v); + *green=ClampToQuantum(QuantumRange*v); + *blue=ClampToQuantum(QuantumRange*v); + return; + } + i=CastDoubleToLong(floor(6.0*hue)); + f=6.0*hue-i; + if ((i & 0x01) != 0) + f=1.0-f; + n=whiteness+f*(v-whiteness); /* linear interpolation */ + switch (i) + { + default: + case 6: + case 0: r=v; g=n; b=whiteness; break; + case 1: r=n; g=v; b=whiteness; break; + case 2: r=whiteness; g=v; b=n; break; + case 3: r=whiteness; g=n; b=v; break; + case 4: r=n; g=whiteness; b=v; break; + case 5: r=v; g=whiteness; b=n; break; + } + *red=ClampToQuantum(QuantumRange*r); + *green=ClampToQuantum(QuantumRange*g); + *blue=ClampToQuantum(QuantumRange*b); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t L C H a b T o R G B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertLCHabToRGB() transforms a (luma, chroma, hue) to a (red, green, +% blue) triple. +% +% The format of the ConvertLCHabToRGBImage method is: +% +% void ConvertLCHabToRGB(const double luma,const double chroma, +% const double hue,Quantum *red,Quantum *green,Quantum *blue) +% +% A description of each parameter follows: +% +% o luma, chroma, hue: A double value representing a component of the LCHab +% color space. +% +% o red, green, blue: A pointer to a pixel component of type Quantum. +% +*/ + +static inline void ConvertLCHabToXYZ(const double luma,const double chroma, + const double hue,double *X,double *Y,double *Z) +{ + ConvertLabToXYZ(luma,chroma*cos(hue*MagickPI/180.0),chroma* + sin(hue*MagickPI/180.0),X,Y,Z); +} + +MagickExport void ConvertLCHabToRGB(const double luma,const double chroma, + const double hue,Quantum *red,Quantum *green,Quantum *blue) +{ + double + X, + Y, + Z; + + /* + Convert LCHab to RGB colorspace. + */ + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + ConvertLCHabToXYZ(100.0*luma,255.0*(chroma-0.5),360.0*hue,&X,&Y,&Z); + ConvertXYZToRGB(X,Y,Z,red,green,blue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t L C H u v T o R G B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertLCHuvToRGB() transforms a (luma, chroma, hue) to a (red, green, +% blue) triple. +% +% The format of the ConvertLCHuvToRGBImage method is: +% +% void ConvertLCHuvToRGB(const double luma,const double chroma, +% const double hue,Quantum *red,Quantum *green,Quantum *blue) +% +% A description of each parameter follows: +% +% o luma, chroma, hue: A double value representing a component of the LCHuv +% color space. +% +% o red, green, blue: A pointer to a pixel component of type Quantum. +% +*/ + +static inline void ConvertLCHuvToXYZ(const double luma,const double chroma, + const double hue,double *X,double *Y,double *Z) +{ + ConvertLuvToXYZ(luma,chroma*cos(hue*MagickPI/180.0),chroma* + sin(hue*MagickPI/180.0),X,Y,Z); +} + +MagickExport void ConvertLCHuvToRGB(const double luma,const double chroma, + const double hue,Quantum *red,Quantum *green,Quantum *blue) +{ + double + X, + Y, + Z; + + /* + Convert LCHuv to RGB colorspace. + */ + assert(red != (Quantum *) NULL); + assert(green != (Quantum *) NULL); + assert(blue != (Quantum *) NULL); + ConvertLCHuvToXYZ(100.0*luma,255.0*(chroma-0.5),360.0*hue,&X,&Y,&Z); + ConvertXYZToRGB(X,Y,Z,red,green,blue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t R G B T o H C L % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertRGBToHCL() transforms a (red, green, blue) to a (hue, chroma, +% luma) triple. +% +% The format of the ConvertRGBToHCL method is: +% +% void ConvertRGBToHCL(const Quantum red,const Quantum green, +% const Quantum blue,double *hue,double *chroma,double *luma) +% +% A description of each parameter follows: +% +% o red, green, blue: A Quantum value representing the red, green, and +% blue component of a pixel. +% +% o hue, chroma, luma: A pointer to a double value representing a +% component of the HCL color space. +% +*/ +MagickExport void ConvertRGBToHCL(const Quantum red,const Quantum green, + const Quantum blue,double *hue,double *chroma,double *luma) +{ + double + b, + c, + g, + h, + max, + r; + + /* + Convert RGB to HCL colorspace. + */ + assert(hue != (double *) NULL); + assert(chroma != (double *) NULL); + assert(luma != (double *) NULL); + r=(double) red; + g=(double) green; + b=(double) blue; + max=MagickMax(r,MagickMax(g,b)); + c=max-(double) MagickMin(r,MagickMin(g,b)); + h=0.0; + if (fabs(c) < MagickEpsilon) + h=0.0; + else + if (red == (Quantum) max) + h=fmod((g-b)/c+6.0,6.0); + else + if (green == (Quantum) max) + h=((b-r)/c)+2.0; + else + if (blue == (Quantum) max) + h=((r-g)/c)+4.0; + *hue=(h/6.0); + *chroma=QuantumScale*c; + *luma=QuantumScale*(0.298839*r+0.586811*g+0.114350*b); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t R G B T o H C L p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertRGBToHCLp() transforms a (red, green, blue) to a (hue, chroma, +% luma) triple. +% +% The format of the ConvertRGBToHCLp method is: +% +% void ConvertRGBToHCLp(const Quantum red,const Quantum green, +% const Quantum blue,double *hue,double *chroma,double *luma) +% +% A description of each parameter follows: +% +% o red, green, blue: A Quantum value representing the red, green, and +% blue component of a pixel. +% +% o hue, chroma, luma: A pointer to a double value representing a +% component of the HCLp color space. +% +*/ +MagickExport void ConvertRGBToHCLp(const Quantum red,const Quantum green, + const Quantum blue,double *hue,double *chroma,double *luma) +{ + double + b, + c, + g, + h, + max, + r; + + /* + Convert RGB to HCLp colorspace. + */ + assert(hue != (double *) NULL); + assert(chroma != (double *) NULL); + assert(luma != (double *) NULL); + r=(double) red; + g=(double) green; + b=(double) blue; + max=MagickMax(r,MagickMax(g,b)); + c=max-(double) MagickMin(r,MagickMin(g,b)); + h=0.0; + if (fabs(c) < MagickEpsilon) + h=0.0; + else + if (red == (Quantum) max) + h=fmod((g-b)/c+6.0,6.0); + else + if (green == (Quantum) max) + h=((b-r)/c)+2.0; + else + if (blue == (Quantum) max) + h=((r-g)/c)+4.0; + *hue=(h/6.0); + *chroma=QuantumScale*c; + *luma=QuantumScale*(0.298839*r+0.586811*g+0.114350*b); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t R G B T o H S B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertRGBToHSB() transforms a (red, green, blue) to a (hue, saturation, +% brightness) triple. +% +% The format of the ConvertRGBToHSB method is: +% +% void ConvertRGBToHSB(const Quantum red,const Quantum green, +% const Quantum blue,double *hue,double *saturation,double *brightness) +% +% A description of each parameter follows: +% +% o red, green, blue: A Quantum value representing the red, green, and +% blue component of a pixel.. +% +% o hue, saturation, brightness: A pointer to a double value representing a +% component of the HSB color space. +% +*/ +MagickExport void ConvertRGBToHSB(const Quantum red,const Quantum green, + const Quantum blue,double *hue,double *saturation,double *brightness) +{ + double + b, + delta, + g, + max, + min, + r; + + /* + Convert RGB to HSB colorspace. + */ + assert(hue != (double *) NULL); + assert(saturation != (double *) NULL); + assert(brightness != (double *) NULL); + *hue=0.0; + *saturation=0.0; + *brightness=0.0; + r=(double) red; + g=(double) green; + b=(double) blue; + min=r < g ? r : g; + if (b < min) + min=b; + max=r > g ? r : g; + if (b > max) + max=b; + if (fabs(max) < MagickEpsilon) + return; + delta=max-min; + *saturation=delta/max; + *brightness=QuantumScale*max; + if (fabs(delta) < MagickEpsilon) + return; + if (fabs(r-max) < MagickEpsilon) + *hue=(g-b)/delta; + else + if (fabs(g-max) < MagickEpsilon) + *hue=2.0+(b-r)/delta; + else + *hue=4.0+(r-g)/delta; + *hue/=6.0; + if (*hue < 0.0) + *hue+=1.0; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t R G B T o H S I % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertRGBToHSI() transforms a (red, green, blue) to a (hue, saturation, +% intensity) triple. +% +% The format of the ConvertRGBToHSI method is: +% +% void ConvertRGBToHSI(const Quantum red,const Quantum green, +% const Quantum blue,double *hue,double *saturation,double *intensity) +% +% A description of each parameter follows: +% +% o red, green, blue: A Quantum value representing the red, green, and +% blue component of a pixel.. +% +% o hue, saturation, intensity: A pointer to a double value representing a +% component of the HSI color space. +% +*/ +MagickExport void ConvertRGBToHSI(const Quantum red,const Quantum green, + const Quantum blue,double *hue,double *saturation,double *intensity) +{ + double + alpha, + beta; + + /* + Convert RGB to HSI colorspace. + */ + assert(hue != (double *) NULL); + assert(saturation != (double *) NULL); + assert(intensity != (double *) NULL); + *intensity=(QuantumScale*red+QuantumScale*green+QuantumScale*blue)/3.0; + if (*intensity <= 0.0) + { + *hue=0.0; + *saturation=0.0; + return; + } + *saturation=1.0-MagickMin(QuantumScale*red,MagickMin(QuantumScale*green, + QuantumScale*blue))/(*intensity); + alpha=0.5*(2.0*QuantumScale*red-QuantumScale*green-QuantumScale*blue); + beta=0.8660254037844385*(QuantumScale*green-QuantumScale*blue); + *hue=atan2(beta,alpha)*(180.0/MagickPI)/360.0; + if (*hue < 0.0) + *hue+=1.0; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t R G B T o H S L % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertRGBToHSL() transforms a (red, green, blue) to a (hue, saturation, +% lightness) triple. +% +% The format of the ConvertRGBToHSL method is: +% +% void ConvertRGBToHSL(const Quantum red,const Quantum green, +% const Quantum blue,double *hue,double *saturation,double *lightness) +% +% A description of each parameter follows: +% +% o red, green, blue: A Quantum value representing the red, green, and +% blue component of a pixel.. +% +% o hue, saturation, lightness: A pointer to a double value representing a +% component of the HSL color space. +% +*/ +MagickExport void ConvertRGBToHSL(const Quantum red,const Quantum green, + const Quantum blue,double *hue,double *saturation,double *lightness) +{ + double + c, + max, + min; + + /* + Convert RGB to HSL colorspace. + */ + assert(hue != (double *) NULL); + assert(saturation != (double *) NULL); + assert(lightness != (double *) NULL); + max=MagickMax(QuantumScale*red,MagickMax(QuantumScale*green, + QuantumScale*blue)); + min=MagickMin(QuantumScale*red,MagickMin(QuantumScale*green, + QuantumScale*blue)); + c=max-min; + *lightness=(max+min)/2.0; + if (c <= 0.0) + { + *hue=0.0; + *saturation=0.0; + return; + } + if (fabs(max-QuantumScale*red) < MagickEpsilon) + { + *hue=(QuantumScale*green-QuantumScale*blue)/c; + if ((QuantumScale*green) < (QuantumScale*blue)) + *hue+=6.0; + } + else + if (fabs(max-QuantumScale*green) < MagickEpsilon) + *hue=2.0+(QuantumScale*blue-QuantumScale*red)/c; + else + *hue=4.0+(QuantumScale*red-QuantumScale*green)/c; + *hue*=60.0/360.0; + if (*lightness <= 0.5) + *saturation=c*PerceptibleReciprocal(2.0*(*lightness)); + else + *saturation=c*PerceptibleReciprocal(2.0-2.0*(*lightness)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t R G B T o H S V % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertRGBToHSV() transforms a (red, green, blue) to a (hue, saturation, +% value) triple. +% +% The format of the ConvertRGBToHSV method is: +% +% void ConvertRGBToHSV(const Quantum red,const Quantum green, +% const Quantum blue,double *hue,double *saturation,double *value) +% +% A description of each parameter follows: +% +% o red, green, blue: A Quantum value representing the red, green, and +% blue component of a pixel.. +% +% o hue, saturation, value: A pointer to a double value representing a +% component of the HSV color space. +% +*/ +MagickExport void ConvertRGBToHSV(const Quantum red,const Quantum green, + const Quantum blue,double *hue,double *saturation,double *value) +{ + double + c, + max, + min; + + /* + Convert RGB to HSV colorspace. + */ + assert(hue != (double *) NULL); + assert(saturation != (double *) NULL); + assert(value != (double *) NULL); + max=MagickMax(QuantumScale*red,MagickMax(QuantumScale*green, + QuantumScale*blue)); + min=MagickMin(QuantumScale*red,MagickMin(QuantumScale*green, + QuantumScale*blue)); + c=max-min; + *value=max; + if (c <= 0.0) + { + *hue=0.0; + *saturation=0.0; + return; + } + if (fabs(max-QuantumScale*red) < MagickEpsilon) + { + *hue=(QuantumScale*green-QuantumScale*blue)/c; + if ((QuantumScale*green) < (QuantumScale*blue)) + *hue+=6.0; + } + else + if (fabs(max-QuantumScale*green) < MagickEpsilon) + *hue=2.0+(QuantumScale*blue-QuantumScale*red)/c; + else + *hue=4.0+(QuantumScale*red-QuantumScale*green)/c; + *hue*=60.0/360.0; + *saturation=c*PerceptibleReciprocal(max); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t R G B T o H W B % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertRGBToHWB() transforms a (red, green, blue) to a (hue, whiteness, +% blackness) triple. +% +% The format of the ConvertRGBToHWB method is: +% +% void ConvertRGBToHWB(const Quantum red,const Quantum green, +% const Quantum blue,double *hue,double *whiteness,double *blackness) +% +% A description of each parameter follows: +% +% o red, green, blue: A Quantum value representing the red, green, and +% blue component of a pixel. +% +% o hue, whiteness, blackness: A pointer to a double value representing a +% component of the HWB color space. +% +*/ +MagickExport void ConvertRGBToHWB(const Quantum red,const Quantum green, + const Quantum blue,double *hue,double *whiteness,double *blackness) +{ + double + b, + f, + g, + p, + r, + v, + w; + + /* + Convert RGB to HWB colorspace. + */ + assert(hue != (double *) NULL); + assert(whiteness != (double *) NULL); + assert(blackness != (double *) NULL); + r=(double) red; + g=(double) green; + b=(double) blue; + w=MagickMin(r,MagickMin(g,b)); + v=MagickMax(r,MagickMax(g,b)); + *blackness=1.0-QuantumScale*v; + *whiteness=QuantumScale*w; + if (fabs(v-w) < MagickEpsilon) + { + *hue=(-1.0); + return; + } + f=(fabs(r-w) < MagickEpsilon) ? g-b : ((fabs(g-w) < MagickEpsilon) ? b-r : r-g); + p=(fabs(r-w) < MagickEpsilon) ? 3.0 : ((fabs(g-w) < MagickEpsilon) ? 5.0 : 1.0); + *hue=(p-f/(v-1.0*w))/6.0; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t R G B T o L C H a b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertRGBToLCHab() transforms a (red, green, blue) to a (luma, chroma, +% hue) triple. +% +% The format of the ConvertRGBToLCHab method is: +% +% void ConvertRGBToLCHab(const Quantum red,const Quantum green, +% const Quantum blue,double *luma,double *chroma,double *hue) +% +% A description of each parameter follows: +% +% o red, green, blue: A Quantum value representing the red, green, and +% blue component of a pixel. +% +% o hue, chroma, luma: A pointer to a double value representing a +% component of the LCHab color space. +% +*/ +static inline void ConvertXYZToLCHab(const double X,const double Y, + const double Z,double *luma,double *chroma,double *hue) +{ + double + a, + b; + + ConvertXYZToLab(X,Y,Z,luma,&a,&b); + *chroma=hypot(255.0*(a-0.5),255.0*(b-0.5))/255.0+0.5; + *hue=180.0*atan2(255.0*(b-0.5),255.0*(a-0.5))/MagickPI/360.0; + if (*hue < 0.0) + *hue+=1.0; +} + +MagickExport void ConvertRGBToLCHab(const Quantum red,const Quantum green, + const Quantum blue,double *luma,double *chroma,double *hue) +{ + double + X, + Y, + Z; + + /* + Convert RGB to LCHab colorspace. + */ + assert(luma != (double *) NULL); + assert(chroma != (double *) NULL); + assert(hue != (double *) NULL); + ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); + ConvertXYZToLCHab(X,Y,Z,luma,chroma,hue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o n v e r t R G B T o L C H u v % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertRGBToLCHuv() transforms a (red, green, blue) to a (luma, chroma, +% hue) triple. +% +% The format of the ConvertRGBToLCHuv method is: +% +% void ConvertRGBToLCHuv(const Quantum red,const Quantum green, +% const Quantum blue,double *luma,double *chroma,double *hue) +% +% A description of each parameter follows: +% +% o red, green, blue: A Quantum value representing the red, green, and +% blue component of a pixel. +% +% o hue, chroma, luma: A pointer to a double value representing a +% component of the LCHuv color space. +% +*/ + +static inline void ConvertXYZToLCHuv(const double X,const double Y, + const double Z,double *luma,double *chroma,double *hue) +{ + double + u, + v; + + ConvertXYZToLuv(X,Y,Z,luma,&u,&v); + *chroma=hypot(354.0*u-134.0,262.0*v-140.0)/255.0+0.5; + *hue=180.0*atan2(262.0*v-140.0,354.0*u-134.0)/MagickPI/360.0; + if (*hue < 0.0) + *hue+=1.0; +} + +MagickExport void ConvertRGBToLCHuv(const Quantum red,const Quantum green, + const Quantum blue,double *luma,double *chroma,double *hue) +{ + double + X, + Y, + Z; + + /* + Convert RGB to LCHuv colorspace. + */ + assert(luma != (double *) NULL); + assert(chroma != (double *) NULL); + assert(hue != (double *) NULL); + ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); + ConvertXYZToLCHuv(X,Y,Z,luma,chroma,hue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% E x p a n d A f f i n e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ExpandAffine() computes the affine's expansion factor, i.e. the square root +% of the factor by which the affine transform affects area. In an affine +% transform composed of scaling, rotation, shearing, and translation, returns +% the amount of scaling. +% +% The format of the ExpandAffine method is: +% +% double ExpandAffine(const AffineMatrix *affine) +% +% A description of each parameter follows: +% +% o expansion: ExpandAffine returns the affine's expansion factor. +% +% o affine: A pointer the affine transform of type AffineMatrix. +% +*/ +MagickExport double ExpandAffine(const AffineMatrix *affine) +{ + assert(affine != (const AffineMatrix *) NULL); + return(sqrt(fabs(affine->sx*affine->sy-affine->rx*affine->ry))); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e n e r a t e D i f f e r e n t i a l N o i s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GenerateDifferentialNoise() generates differentual noise. +% +% The format of the GenerateDifferentialNoise method is: +% +% double GenerateDifferentialNoise(RandomInfo *random_info, +% const Quantum pixel,const NoiseType noise_type, +% const MagickRealType attenuate) +% +% A description of each parameter follows: +% +% o random_info: the random info. +% +% o pixel: noise is relative to this pixel value. +% +% o noise_type: the type of noise. +% +% o attenuate: attenuate the noise. +% +*/ +MagickExport double GenerateDifferentialNoise(RandomInfo *random_info, + const Quantum pixel,const NoiseType noise_type,const MagickRealType attenuate) +{ +#define SigmaUniform (attenuate*0.015625) +#define SigmaGaussian (attenuate*0.015625) +#define SigmaImpulse (attenuate*0.1) +#define SigmaLaplacian (attenuate*0.0390625) +#define SigmaMultiplicativeGaussian (attenuate*0.5) +#define SigmaPoisson (attenuate*12.5) +#define SigmaRandom (attenuate) +#define TauGaussian (attenuate*0.078125) + + double + alpha, + beta, + noise, + sigma; + + alpha=GetPseudoRandomValue(random_info); + switch (noise_type) + { + case UniformNoise: + default: + { + noise=(double) (pixel+QuantumRange*SigmaUniform*(alpha-0.5)); + break; + } + case GaussianNoise: + { + double + gamma, + tau; + + if (fabs(alpha) < MagickEpsilon) + alpha=1.0; + beta=GetPseudoRandomValue(random_info); + gamma=sqrt(-2.0*log(alpha)); + sigma=gamma*cos((double) (2.0*MagickPI*beta)); + tau=gamma*sin((double) (2.0*MagickPI*beta)); + noise=(double) (pixel+sqrt((double) pixel)*SigmaGaussian*sigma+ + QuantumRange*TauGaussian*tau); + break; + } + case ImpulseNoise: + { + if (alpha < (SigmaImpulse/2.0)) + noise=0.0; + else + if (alpha >= (1.0-(SigmaImpulse/2.0))) + noise=(double) QuantumRange; + else + noise=(double) pixel; + break; + } + case LaplacianNoise: + { + if (alpha <= 0.5) + { + if (alpha <= MagickEpsilon) + noise=(double) (pixel-QuantumRange); + else + noise=(double) (pixel+QuantumRange*SigmaLaplacian*log(2.0*alpha)+ + 0.5); + break; + } + beta=1.0-alpha; + if (beta <= (0.5*MagickEpsilon)) + noise=(double) (pixel+QuantumRange); + else + noise=(double) (pixel-QuantumRange*SigmaLaplacian*log(2.0*beta)+0.5); + break; + } + case MultiplicativeGaussianNoise: + { + sigma=1.0; + if (alpha > MagickEpsilon) + sigma=sqrt(-2.0*log(alpha)); + beta=GetPseudoRandomValue(random_info); + noise=(double) (pixel+pixel*SigmaMultiplicativeGaussian*sigma* + cos((double) (2.0*MagickPI*beta))/2.0); + break; + } + case PoissonNoise: + { + double + poisson; + + ssize_t + i; + + poisson=exp(-SigmaPoisson*QuantumScale*pixel); + for (i=0; alpha > poisson; i++) + { + beta=GetPseudoRandomValue(random_info); + alpha*=beta; + } + noise=(double) (QuantumRange*i*PerceptibleReciprocal(SigmaPoisson)); + break; + } + case RandomNoise: + { + noise=(double) (QuantumRange*SigmaRandom*alpha); + break; + } + } + return(noise); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t O p t i m a l K e r n e l W i d t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetOptimalKernelWidth() computes the optimal kernel radius for a convolution +% filter. Start with the minimum value of 3 pixels and walk out until we drop +% below the threshold of one pixel numerical accuracy. +% +% The format of the GetOptimalKernelWidth method is: +% +% size_t GetOptimalKernelWidth(const double radius,const double sigma) +% +% A description of each parameter follows: +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +*/ +MagickExport size_t GetOptimalKernelWidth1D(const double radius, + const double sigma) +{ + double + alpha, + beta, + gamma, + normalize, + value; + + ssize_t + i; + + size_t + width; + + ssize_t + j; + + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + if (radius > MagickEpsilon) + return((size_t) (2.0*ceil(radius)+1.0)); + gamma=fabs(sigma); + if (gamma <= MagickEpsilon) + return(3UL); + alpha=PerceptibleReciprocal(2.0*gamma*gamma); + beta=(double) PerceptibleReciprocal((double) MagickSQ2PI*gamma); + for (width=5; ; ) + { + normalize=0.0; + j=(ssize_t) (width-1)/2; + for (i=(-j); i <= j; i++) + normalize+=exp(-((double) (i*i))*alpha)*beta; + value=exp(-((double) (j*j))*alpha)*beta/normalize; + if ((value < QuantumScale) || (value < MagickEpsilon)) + break; + width+=2; + } + return((size_t) (width-2)); +} + +MagickExport size_t GetOptimalKernelWidth2D(const double radius, + const double sigma) +{ + double + alpha, + beta, + gamma, + normalize, + value; + + size_t + width; + + ssize_t + j, + u, + v; + + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + if (radius > MagickEpsilon) + return((size_t) (2.0*ceil(radius)+1.0)); + gamma=fabs(sigma); + if (gamma <= MagickEpsilon) + return(3UL); + alpha=PerceptibleReciprocal(2.0*gamma*gamma); + beta=(double) PerceptibleReciprocal((double) Magick2PI*gamma*gamma); + for (width=5; ; ) + { + normalize=0.0; + j=(ssize_t) (width-1)/2; + for (v=(-j); v <= j; v++) + for (u=(-j); u <= j; u++) + normalize+=exp(-((double) (u*u+v*v))*alpha)*beta; + value=exp(-((double) (j*j))*alpha)*beta/normalize; + if ((value < QuantumScale) || (value < MagickEpsilon)) + break; + width+=2; + } + return((size_t) (width-2)); +} + +MagickExport size_t GetOptimalKernelWidth(const double radius, + const double sigma) +{ + return(GetOptimalKernelWidth1D(radius,sigma)); +} diff --git a/ImageMagick-6.9.12-44/magick/gem.h b/ImageMagick-6.9.12-44/magick/gem.h new file mode 100644 index 0000000..c0731ba --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/gem.h @@ -0,0 +1,80 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore private graphic gems methods. +*/ +#ifndef MAGICKCORE_GEM_H +#define MAGICKCORE_GEM_H + +#include "magick/random_.h" +#include "magick/visual-effects.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport double + ExpandAffine(const AffineMatrix *), + GenerateDifferentialNoise(RandomInfo *,const Quantum,const NoiseType, + const MagickRealType); + +extern MagickExport size_t + GetOptimalKernelWidth(const double,const double), + GetOptimalKernelWidth1D(const double,const double), + GetOptimalKernelWidth2D(const double,const double); + +extern MagickExport void + ConvertHCLToRGB(const double,const double,const double,Quantum *,Quantum *, + Quantum *), + ConvertHCLpToRGB(const double,const double,const double,Quantum *,Quantum *, + Quantum *), + ConvertHSBToRGB(const double,const double,const double,Quantum *,Quantum *, + Quantum *), + ConvertHSIToRGB(const double,const double,const double,Quantum *,Quantum *, + Quantum *), + ConvertHSLToRGB(const double,const double,const double,Quantum *,Quantum *, + Quantum *), + ConvertHSVToRGB(const double,const double,const double,Quantum *,Quantum *, + Quantum *), + ConvertHWBToRGB(const double,const double,const double,Quantum *,Quantum *, + Quantum *), + ConvertLCHabToRGB(const double,const double,const double,Quantum *,Quantum *, + Quantum *), + ConvertLCHuvToRGB(const double,const double,const double,Quantum *,Quantum *, + Quantum *), + ConvertRGBToHCL(const Quantum,const Quantum,const Quantum,double *,double *, + double *), + ConvertRGBToHCLp(const Quantum,const Quantum,const Quantum,double *,double *, + double *), + ConvertRGBToHSB(const Quantum,const Quantum,const Quantum,double *,double *, + double *), + ConvertRGBToHSI(const Quantum,const Quantum,const Quantum,double *,double *, + double *), + ConvertRGBToHSL(const Quantum,const Quantum,const Quantum,double *,double *, + double *), + ConvertRGBToHSV(const Quantum,const Quantum,const Quantum,double *,double *, + double *), + ConvertRGBToHWB(const Quantum,const Quantum,const Quantum,double *,double *, + double *), + ConvertRGBToLCHab(const Quantum,const Quantum,const Quantum,double *,double *, + double *), + ConvertRGBToLCHuv(const Quantum,const Quantum,const Quantum,double *,double *, + double *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/geometry.c b/ImageMagick-6.9.12-44/magick/geometry.c new file mode 100644 index 0000000..002f360 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/geometry.c @@ -0,0 +1,1724 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% GGGG EEEEE OOO M M EEEEE TTTTT RRRR Y Y % +% G E O O MM MM E T R R Y Y % +% G GG EEE O O M M M EEE T RRRR Y % +% G G E O O M M E T R R Y % +% GGGG EEEEE OOO M M EEEEE T R R Y % +% % +% % +% MagickCore Geometry Methods % +% % +% Software Design % +% Cristy % +% January 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/constitute.h" +#include "magick/draw.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image-private.h" +#include "magick/memory_.h" +#include "magick/pixel-accessor.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/token.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetGeometry() parses a geometry specification and returns the width, +% height, x, and y values. It also returns flags that indicates which +% of the four values (width, height, x, y) were located in the string, and +% whether the x or y values are negative. In addition, there are flags to +% report any meta characters (%, !, <, or >). +% +% The value must form a proper geometry style specification of WxH+X+Y +% of integers only, and values can not be separated by comma, colon, or +% slash charcaters. See ParseGeometry() below. +% +% Offsets may be prefixed by multiple signs to make offset string +% substitutions easier to handle from shell scripts. +% For example: "-10-10", "-+10-+10", or "+-10+-10" will generate negtive +% offsets, while "+10+10", "++10++10", or "--10--10" will generate positive +% offsets. +% +% The format of the GetGeometry method is: +% +% MagickStatusType GetGeometry(const char *geometry,ssize_t *x,ssize_t *y, +% size_t *width,size_t *height) +% +% A description of each parameter follows: +% +% o geometry: The geometry. +% +% o x,y: The x and y offset as determined by the geometry specification. +% +% o width,height: The width and height as determined by the geometry +% specification. +% +*/ +MagickExport MagickStatusType GetGeometry(const char *geometry,ssize_t *x, + ssize_t *y,size_t *width,size_t *height) +{ + char + *p, + pedantic_geometry[MaxTextExtent], + *q; + + double + value; + + int + c; + + MagickStatusType + flags; + + /* + Remove whitespace and meta characters from geometry specification. + */ + flags=NoValue; + if ((geometry == (char *) NULL) || (*geometry == '\0')) + return(flags); + if (strlen(geometry) >= (MaxTextExtent-1)) + return(flags); + (void) CopyMagickString(pedantic_geometry,geometry,MaxTextExtent); + for (p=pedantic_geometry; *p != '\0'; ) + { + if (isspace((int) ((unsigned char) *p)) != 0) + { + (void) CopyMagickString(p,p+1,MaxTextExtent); + continue; + } + c=(int) *p; + switch (c) + { + case '%': + { + flags|=PercentValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '!': + { + flags|=AspectValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '<': + { + flags|=LessValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '>': + { + flags|=GreaterValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '^': + { + flags|=MinimumValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '@': + { + flags|=AreaValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '(': + { + if (*(p+1) == ')') + return(flags); + } + case ')': + { + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case 'x': + case 'X': + { + flags|=SeparatorValue; + p++; + break; + } + case '-': + case ',': + case '+': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 215: + case 'e': + case 'E': + { + p++; + break; + } + case '.': + { + p++; + flags|=DecimalValue; + break; + } + case ':': + { + p++; + flags|=AspectRatioValue; + break; + } + default: + return(flags); + } + } + /* + Parse width, height, x, and y. + */ + p=pedantic_geometry; + if (*p == '\0') + return(flags); + q=p; + value=StringToDouble(p,&q); + (void) value; + if (LocaleNCompare(p,"0x",2) == 0) + value=(double) strtol(p,&q,10); + if ((*p != '+') && (*p != '-')) + { + c=(int) ((unsigned char) *q); + if ((c == 215) || (*q == 'x') || (*q == 'X') || (*q == ':') || + (*q == '\0')) + { + /* + Parse width. + */ + q=p; + if (width != (size_t *) NULL) + { + if (LocaleNCompare(p,"0x",2) == 0) + *width=(size_t) strtol(p,&p,10); + else + *width=((size_t) floor(StringToDouble(p,&p)+0.5)) & 0x7fffffff; + } + if (p != q) + flags|=WidthValue; + } + } + if ((*p != '+') && (*p != '-')) + { + c=(int) ((unsigned char) *p); + if ((c == 215) || (*p == 'x') || (*p == 'X') || (*p == ':')) + { + p++; + if ((*p != '+') && (*p != '-')) + { + /* + Parse height. + */ + q=p; + if (height != (size_t *) NULL) + *height=((size_t) floor(StringToDouble(p,&p)+0.5)) & 0x7fffffff; + if (p != q) + flags|=HeightValue; + } + } + } + if ((*p == '+') || (*p == '-')) + { + /* + Parse x value. + */ + while ((*p == '+') || (*p == '-')) + { + if (*p == '-') + flags^=XNegative; /* negate sign */ + p++; + } + q=p; + if (x != (ssize_t *) NULL) + *x=((ssize_t) ceil(StringToDouble(p,&p)-0.5)) & 0x7fffffff; + if (p != q) + { + flags|=XValue; + if (((flags & XNegative) != 0) && (x != (ssize_t *) NULL)) + *x=(-*x); + } + } + if ((*p == '+') || (*p == '-')) + { + /* + Parse y value. + */ + while ((*p == '+') || (*p == '-')) + { + if (*p == '-') + flags^=YNegative; /* negate sign */ + p++; + } + q=p; + if (y != (ssize_t *) NULL) + *y=((ssize_t) ceil(StringToDouble(p,&p)-0.5)) & 0x7fffffff; + if (p != q) + { + flags|=YValue; + if (((flags & YNegative) != 0) && (y != (ssize_t *) NULL)) + *y=(-*y); + } + } + if ((flags & PercentValue) != 0) + { + if (((flags & SeparatorValue) == 0) && ((flags & HeightValue) == 0)) + { + if ((height != (size_t *) NULL) && (width != (size_t *) NULL)) + *height=(*width); + flags|=HeightValue; + } + if (((flags & SeparatorValue) != 0) && ((flags & WidthValue) == 0) && + (height != (size_t *) NULL) && (width != (size_t *) NULL)) + *width=(*height); + } +#if 0 + /* + Debugging geometry. + */ + (void) fprintf(stderr,"GetGeometry...\n"); + (void) fprintf(stderr,"Input: %s\n",geometry); + (void) fprintf(stderr,"Flags: %c %c %s %s\n", + (flags & WidthValue) ? 'W' : ' ',(flags & HeightValue) ? 'H' : ' ', + (flags & XValue) ? ((flags & XNegative) ? "-X" : "+X") : " ", + (flags & YValue) ? ((flags & YNegative) ? "-Y" : "+Y") : " "); + (void) fprintf(stderr,"Geometry: %ldx%ld%+ld%+ld\n",(long) *width,(long) + *height,(long) *x,(long) *y); +#endif + return(flags); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P a g e G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPageGeometry() replaces any page mneumonic with the equivalent size in +% picas. +% +% The format of the GetPageGeometry method is: +% +% char *GetPageGeometry(const char *page_geometry) +% +% A description of each parameter follows. +% +% o page_geometry: Specifies a pointer to an array of characters. The +% string is either a Postscript page name (e.g. A4) or a postscript page +% geometry (e.g. 612x792+36+36). +% +*/ +MagickExport char *GetPageGeometry(const char *page_geometry) +{ +#define MagickPageSize(name,geometry) { (name), sizeof(name)-1, (geometry) } + + typedef struct _PageInfo + { + const char + name[12]; + + size_t + extent; + + const char + geometry[10]; + } PageInfo; + + static const PageInfo + PageSizes[] = + { + MagickPageSize("4x6", "288x432"), + MagickPageSize("5x7", "360x504"), + MagickPageSize("7x9", "504x648"), + MagickPageSize("8x10", "576x720"), + MagickPageSize("9x11", "648x792"), + MagickPageSize("9x12", "648x864"), + MagickPageSize("10x13", "720x936"), + MagickPageSize("10x14", "720x1008"), + MagickPageSize("11x17", "792x1224"), + MagickPageSize("4A0", "4768x6741"), + MagickPageSize("2A0", "3370x4768"), + MagickPageSize("a0", "2384x3370"), + MagickPageSize("a1", "1684x2384"), + MagickPageSize("a2", "1191x1684"), + MagickPageSize("a3", "842x1191"), + MagickPageSize("a4", "595x842"), + MagickPageSize("a4small", "595x842"), + MagickPageSize("a5", "420x595"), + MagickPageSize("a6", "298x420"), + MagickPageSize("a7", "210x298"), + MagickPageSize("a8", "147x210"), + MagickPageSize("a9", "105x147"), + MagickPageSize("a10", "74x105"), + MagickPageSize("archa", "648x864"), + MagickPageSize("archb", "864x1296"), + MagickPageSize("archC", "1296x1728"), + MagickPageSize("archd", "1728x2592"), + MagickPageSize("arche", "2592x3456"), + MagickPageSize("b0", "2920x4127"), + MagickPageSize("b1", "2064x2920"), + MagickPageSize("b10", "91x127"), + MagickPageSize("b2", "1460x2064"), + MagickPageSize("b3", "1032x1460"), + MagickPageSize("b4", "729x1032"), + MagickPageSize("b5", "516x729"), + MagickPageSize("b6", "363x516"), + MagickPageSize("b7", "258x363"), + MagickPageSize("b8", "181x258"), + MagickPageSize("b9", "127x181"), + MagickPageSize("c0", "2599x3676"), + MagickPageSize("c1", "1837x2599"), + MagickPageSize("c2", "1298x1837"), + MagickPageSize("c3", "918x1296"), + MagickPageSize("c4", "649x918"), + MagickPageSize("c5", "459x649"), + MagickPageSize("c6", "323x459"), + MagickPageSize("c7", "230x323"), + MagickPageSize("csheet", "1224x1584"), + MagickPageSize("dsheet", "1584x2448"), + MagickPageSize("esheet", "2448x3168"), + MagickPageSize("executive", "540x720"), + MagickPageSize("flsa", "612x936"), + MagickPageSize("flse", "612x936"), + MagickPageSize("folio", "612x936"), + MagickPageSize("halfletter", "396x612"), + MagickPageSize("isob0", "2835x4008"), + MagickPageSize("isob1", "2004x2835"), + MagickPageSize("isob10", "88x125"), + MagickPageSize("isob2", "1417x2004"), + MagickPageSize("isob3", "1001x1417"), + MagickPageSize("isob4", "709x1001"), + MagickPageSize("isob5", "499x709"), + MagickPageSize("isob6", "354x499"), + MagickPageSize("isob7", "249x354"), + MagickPageSize("isob8", "176x249"), + MagickPageSize("isob9", "125x176"), + MagickPageSize("jisb0", "1030x1456"), + MagickPageSize("jisb1", "728x1030"), + MagickPageSize("jisb2", "515x728"), + MagickPageSize("jisb3", "364x515"), + MagickPageSize("jisb4", "257x364"), + MagickPageSize("jisb5", "182x257"), + MagickPageSize("jisb6", "128x182"), + MagickPageSize("ledger", "1224x792"), + MagickPageSize("legal", "612x1008"), + MagickPageSize("letter", "612x792"), + MagickPageSize("lettersmall", "612x792"), + MagickPageSize("monarch", "279x540"), + MagickPageSize("quarto", "610x780"), + MagickPageSize("statement", "396x612"), + MagickPageSize("tabloid", "792x1224") + }; + + char + page[MaxTextExtent]; + + ssize_t + i; + + assert(page_geometry != (char *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",page_geometry); + (void) CopyMagickString(page,page_geometry,MaxTextExtent); + for (i=0; i < (ssize_t) (sizeof(PageSizes)/sizeof(PageSizes[0])); i++) + { + int + status; + + status=LocaleNCompare(PageSizes[i].name,page_geometry,PageSizes[i].extent); + if (status == 0) + { + MagickStatusType + flags; + + RectangleInfo + geometry; + + /* + Replace mneumonic with the equivalent size in dots-per-inch. + */ + (void) FormatLocaleString(page,MaxTextExtent,"%s%.80s", + PageSizes[i].geometry,page_geometry+PageSizes[i].extent); + flags=GetGeometry(page,&geometry.x,&geometry.y,&geometry.width, + &geometry.height); + if ((flags & GreaterValue) == 0) + (void) ConcatenateMagickString(page,">",MaxTextExtent); + break; + } + } + return(AcquireString(page)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G r a v i t y A d j u s t G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GravityAdjustGeometry() adjusts the offset of a region with regard to the +% given: width, height and gravity; against which it is positioned. +% +% The region should also have an appropriate width and height to correctly +% set the right offset of the top left corner of the region. +% +% The format of the GravityAdjustGeometry method is: +% +% void GravityAdjustGeometry(const size_t width, const size_t height, +% const GravityType gravity,RectangleInfo *region); +% +% A description of each parameter follows: +% +% o width, height: the larger area the region is relative to +% +% o gravity: the edge/corner the current offset is relative to +% +% o region: The region requiring a offset adjustment relative to gravity +% +*/ +MagickExport void GravityAdjustGeometry(const size_t width, + const size_t height,const GravityType gravity,RectangleInfo *region) +{ + if (region->height == 0) + region->height=height; + if (region->width == 0) + region->width=width; + switch (gravity) + { + case NorthEastGravity: + case EastGravity: + case SouthEastGravity: + { + region->x=(ssize_t) (width-region->width-region->x); + break; + } + case NorthGravity: + case SouthGravity: + case CenterGravity: + case StaticGravity: + { + region->x+=(ssize_t) (width/2-region->width/2); + break; + } + case ForgetGravity: + case NorthWestGravity: + case WestGravity: + case SouthWestGravity: + default: + break; + } + switch (gravity) + { + case SouthWestGravity: + case SouthGravity: + case SouthEastGravity: + { + region->y=(ssize_t) (height-region->height-region->y); + break; + } + case EastGravity: + case WestGravity: + case CenterGravity: + case StaticGravity: + { + region->y+=(ssize_t) (height/2-region->height/2); + break; + } + case ForgetGravity: + case NorthWestGravity: + case NorthGravity: + case NorthEastGravity: + default: + break; + } + return; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ I s G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsGeometry() returns MagickTrue if the geometry specification is valid. +% Examples are 100, 100x200, x200, 100x200+10+20, +10+20, 200%, 200x200!, etc. +% +% The format of the IsGeometry method is: +% +% MagickBooleanType IsGeometry(const char *geometry) +% +% A description of each parameter follows: +% +% o geometry: This string is the geometry specification. +% +*/ +MagickExport MagickBooleanType IsGeometry(const char *geometry) +{ + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + if (geometry == (const char *) NULL) + return(MagickFalse); + flags=ParseGeometry(geometry,&geometry_info); + return(flags != NoValue ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ I s S c e n e G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsSceneGeometry() returns MagickTrue if the geometry is a valid scene +% specification (e.g. [1], [1-9], [1,7,4]). +% +% The format of the IsSceneGeometry method is: +% +% MagickBooleanType IsSceneGeometry(const char *geometry, +% const MagickBooleanType pedantic) +% +% A description of each parameter follows: +% +% o geometry: This string is the geometry specification. +% +% o pedantic: A value other than 0 invokes a more restrictive set of +% conditions for a valid specification (e.g. [1], [1-4], [4-1]). +% +*/ +MagickExport MagickBooleanType IsSceneGeometry(const char *geometry, + const MagickBooleanType pedantic) +{ + char + *p; + + double + value; + + if (geometry == (const char *) NULL) + return(MagickFalse); + p=(char *) geometry; + value=StringToDouble(geometry,&p); + if (IsNaN(value) != 0) + return(MagickFalse); + if (value > (double) MAGICK_SSIZE_MAX) + return(MagickFalse); + if (value < (double) MAGICK_SSIZE_MIN) + return(MagickFalse); + if (p == geometry) + return(MagickFalse); + if (strspn(geometry,"0123456789-, ") != strlen(geometry)) + return(MagickFalse); + if ((pedantic != MagickFalse) && (strchr(geometry,',') != (char *) NULL)) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P a r s e A b s o l u t e G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ParseAbsoluteGeometry() returns a region as defined by the geometry string, +% without any modification by percentages or gravity. +% +% It currently just a wrapper around GetGeometry(), but may be expanded in +% the future to handle other positioning information. +% +% The format of the ParseAbsoluteGeometry method is: +% +% MagickStatusType ParseAbsoluteGeometry(const char *geometry, +% RectangleInfo *region_info) +% +% A description of each parameter follows: +% +% o geometry: The geometry string (e.g. "100x100+10+10"). +% +% o region_info: the region as defined by the geometry string. +% +*/ +MagickExport MagickStatusType ParseAbsoluteGeometry(const char *geometry, + RectangleInfo *region_info) +{ + MagickStatusType + flags; + + flags=GetGeometry(geometry,®ion_info->x,®ion_info->y, + ®ion_info->width,®ion_info->height); + return(flags); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P a r s e A f f i n e G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ParseAffineGeometry() returns an affine matrix as defined by a string of 4 +% to 6 comma/space separated floating point values. +% +% The affine matrix determinant is checked for validity of the values. +% +% The format of the ParseAffineGeometry method is: +% +% MagickStatusType ParseAffineGeometry(const char *geometry, +% AffineMatrix *affine_matrix,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o geometry: The geometry string (e.g. "1.0,0.0,0.0,1.0,3.2,1.2"). +% +% o affine_matrix: the affine matrix as defined by the geometry string. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickStatusType ParseAffineGeometry(const char *geometry, + AffineMatrix *affine_matrix,ExceptionInfo *exception) +{ + char + token[MaxTextExtent]; + + const char + *p; + + double + determinant; + + MagickStatusType + flags; + + ssize_t + i; + + GetAffineMatrix(affine_matrix); + flags=NoValue; + p=(char *) geometry; + for (i=0; (*p != '\0') && (i < 6); i++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + switch (i) + { + case 0: + { + affine_matrix->sx=StringToDouble(token,(char **) NULL); + break; + } + case 1: + { + affine_matrix->rx=StringToDouble(token,(char **) NULL); + break; + } + case 2: + { + affine_matrix->ry=StringToDouble(token,(char **) NULL); + break; + } + case 3: + { + affine_matrix->sy=StringToDouble(token,(char **) NULL); + break; + } + case 4: + { + affine_matrix->tx=StringToDouble(token,(char **) NULL); + flags|=XValue; + break; + } + case 5: + { + affine_matrix->ty=StringToDouble(token,(char **) NULL); + flags|=YValue; + break; + } + } + } + determinant=(affine_matrix->sx*affine_matrix->sy-affine_matrix->rx* + affine_matrix->ry); + if (fabs(determinant) < MagickEpsilon) + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "InvalidArgument","'%s' : 'Indeterminate Matrix'",geometry); + return(flags); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P a r s e G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ParseGeometry() parses a geometry specification and returns the sigma, +% rho, xi, and psi values. It also returns flags that indicates which +% of the four values (sigma, rho, xi, psi) were located in the string, and +% whether the xi or pi values are negative. +% +% In addition, it reports if there are any of meta characters (%, !, <, >, @, +% and ^) flags present. It does not report the location of the percentage +% relative to the values. +% +% Values may also be separated by commas, colons, or slashes, and offsets. +$ Chroma subsampling definitions have to be in the form of a:b:c. Offsets may +% be prefixed by multiple signs to make offset string substitutions easier to +% handle from shell scripts. For example: "-10-10", "-+10-+10", or "+-10+-10" +% will generate negtive offsets, while "+10+10", "++10++10", or "--10--10" +% will generate positive offsets. +% +% The format of the ParseGeometry method is: +% +% MagickStatusType ParseGeometry(const char *geometry, +% GeometryInfo *geometry_info) +% +% A description of each parameter follows: +% +% o geometry: The geometry string (e.g. "100x100+10+10"). +% +% o geometry_info: returns the parsed width/height/x/y in this structure. +% +*/ +MagickExport MagickStatusType ParseGeometry(const char *geometry, + GeometryInfo *geometry_info) +{ + char + *p, + pedantic_geometry[MaxTextExtent], + *q; + + double + value; + + int + c; + + MagickStatusType + flags; + + /* + Remove whitespaces meta characters from geometry specification. + */ + assert(geometry_info != (GeometryInfo *) NULL); + (void) memset(geometry_info,0,sizeof(*geometry_info)); + flags=NoValue; + if ((geometry == (char *) NULL) || (*geometry == '\0')) + return(flags); + if (strlen(geometry) >= (MaxTextExtent-1)) + return(flags); + (void) CopyMagickString(pedantic_geometry,geometry,MaxTextExtent); + for (p=pedantic_geometry; *p != '\0'; ) + { + c=(int) ((unsigned char) *p); + if (isspace((int) ((unsigned char) c)) != 0) + { + (void) CopyMagickString(p,p+1,MaxTextExtent); + continue; + } + switch (c) + { + case '%': + { + flags|=PercentValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '!': + { + flags|=AspectValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '<': + { + flags|=LessValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '>': + { + flags|=GreaterValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '^': + { + flags|=MinimumValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '@': + { + flags|=AreaValue; + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case '(': + case ')': + { + (void) CopyMagickString(p,p+1,MaxTextExtent); + break; + } + case 'x': + case 'X': + { + flags|=SeparatorValue; + p++; + break; + } + case '-': + case '+': + case ',': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '/': + case 215: + case 'e': + case 'E': + { + p++; + break; + } + case '.': + { + p++; + flags|=DecimalValue; + break; + } + case ':': + { + p++; + flags|=AspectRatioValue; + break; + } + default: + return(NoValue); + } + } + /* + Parse rho, sigma, xi, psi, and optionally chi. + */ + p=pedantic_geometry; + if (*p == '\0') + return(flags); + q=p; + value=StringToDouble(p,&q); + if (LocaleNCompare(p,"0x",2) == 0) + (void) strtol(p,&q,10); + c=(int) ((unsigned char) *q); + if ((c == 215) || (*q == 'x') || (*q == 'X') || (*q == ':') || + (*q == ',') || (*q == '/') || (*q =='\0')) + { + /* + Parse rho. + */ + q=p; + if (LocaleNCompare(p,"0x",2) == 0) + value=(double) strtol(p,&p,10); + else + value=StringToDouble(p,&p); + if (p != q) + { + flags|=RhoValue; + geometry_info->rho=value; + } + } + q=p; + c=(int) ((unsigned char) *p); + if ((c == 215) || (*p == 'x') || (*p == 'X') || (*p == ':') || (*p == ',') || + (*p == '/')) + { + /* + Parse sigma. + */ + p++; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + c=(int) ((unsigned char) *q); + if (((c != 215) && (*q != 'x') && (*q != 'X') && (*q != ':')) || + ((*p != '+') && (*p != '-'))) + { + q=p; + value=StringToDouble(p,&p); + if (p != q) + { + flags|=SigmaValue; + geometry_info->sigma=value; + } + } + } + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if ((*p == '+') || (*p == '-') || (*p == ',') || (*p == '/') || (*p == ':')) + { + /* + Parse xi value. + */ + if ((*p == ',') || (*p == '/') || (*p == ':') ) + p++; + while ((*p == '+') || (*p == '-')) + { + if (*p == '-') + flags^=XiNegative; /* negate sign */ + p++; + } + q=p; + value=StringToDouble(p,&p); + if (p != q) + { + flags|=XiValue; + if ((flags & XiNegative) != 0) + value=(-value); + geometry_info->xi=value; + } + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if ((*p == '+') || (*p == '-') || (*p == ',') || (*p == '/') || + (*p == ':')) + { + /* + Parse psi value. + */ + if ((*p == ',') || (*p == '/') || (*p == ':')) + p++; + while ((*p == '+') || (*p == '-')) + { + if (*p == '-') + flags^=PsiNegative; /* negate sign */ + p++; + } + q=p; + value=StringToDouble(p,&p); + if (p != q) + { + flags|=PsiValue; + if ((flags & PsiNegative) != 0) + value=(-value); + geometry_info->psi=value; + } + } + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if ((*p == '+') || (*p == '-') || (*p == ',') || (*p == '/') || + (*p == ':')) + { + /* + Parse chi value. + */ + if ((*p == ',') || (*p == '/') || (*p == ':')) + p++; + while ((*p == '+') || (*p == '-')) + { + if (*p == '-') + flags^=ChiNegative; /* negate sign */ + p++; + } + q=p; + value=StringToDouble(p,&p); + if (p != q) + { + flags|=ChiValue; + if ((flags & ChiNegative) != 0) + value=(-value); + geometry_info->chi=value; + } + } + } + if (strchr(pedantic_geometry,':') != (char *) NULL) + { + /* + Normalize sampling factor (e.g. 4:2:2 => 2x1). + */ + if ((flags & SigmaValue) != 0) + geometry_info->rho*=PerceptibleReciprocal(geometry_info->sigma); + geometry_info->sigma=1.0; + if (((flags & XiValue) != 0) && (geometry_info->xi == 0.0)) + geometry_info->sigma=2.0; + } + if (((flags & RhoValue) != 0) && ((flags & SigmaValue) == 0) && + ((flags & XiValue) != 0) && ((flags & XiNegative) != 0)) + { + if ((flags & PsiValue) == 0) + { + /* + Support negative height values (e.g. 30x-20). + */ + geometry_info->sigma=geometry_info->xi; + geometry_info->xi=0.0; + flags|=SigmaValue; + flags&=(~XiValue); + } + else + if ((flags & ChiValue) == 0) + { + /* + Support negative height values (e.g. 30x-20+10). + */ + geometry_info->sigma=geometry_info->xi; + geometry_info->xi=geometry_info->psi; + flags|=SigmaValue; + flags|=XiValue; + flags&=(~PsiValue); + } + else + { + /* + Support negative height values (e.g. 30x-20+10+10). + */ + geometry_info->sigma=geometry_info->xi; + geometry_info->xi=geometry_info->psi; + geometry_info->psi=geometry_info->chi; + flags|=SigmaValue; + flags|=XiValue; + flags|=PsiValue; + flags&=(~ChiValue); + } + } + if ((flags & PercentValue) != 0) + { + if (((flags & SeparatorValue) == 0) && ((flags & SigmaValue) == 0)) + geometry_info->sigma=geometry_info->rho; + if (((flags & SeparatorValue) != 0) && ((flags & RhoValue) == 0)) + geometry_info->rho=geometry_info->sigma; + } +#if 0 + /* Debugging Geometry */ + (void) fprintf(stderr,"ParseGeometry...\n"); + (void) fprintf(stderr,"Flags: %c %c %s %s %s\n", + (flags & RhoValue) ? 'W' : ' ',(flags & SigmaValue) ? 'H' : ' ', + (flags & XiValue) ? ((flags & XiNegative) ? "-X" : "+X") : " ", + (flags & PsiValue) ? ((flags & PsiNegative) ? "-Y" : "+Y") : " ", + (flags & ChiValue) ? ((flags & ChiNegative) ? "-Z" : "+Z") : " "); + (void) fprintf(stderr,"Geometry: %lg,%lg,%lg,%lg,%lg\n",geometry_info->rho, + geometry_info->sigma,geometry_info->xi,geometry_info->psi, + geometry_info->chi); +#endif + return(flags); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P a r s e G r a v i t y G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ParseGravityGeometry() returns a region as defined by the geometry string +% with respect to the given image page (canvas) dimensions and the images +% gravity setting. +% +% This is typically used for specifing a area within a given image for +% cropping images to a smaller size, chopping out rows and or columns, or +% resizing and positioning overlay images. +% +% Percentages are relative to image size and not page size, and are set to +% nearest integer (pixel) size. +% +% The format of the ParseGravityGeometry method is: +% +% MagickStatusType ParseGravityGeometry(Image *image,const char *geometry, +% RectangeInfo *region_info,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o geometry: The geometry string (e.g. "100x100+10+10"). +% +% o region_info: the region as defined by the geometry string with respect +% to the image dimensions and its gravity. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickStatusType ParseGravityGeometry(const Image *image, + const char *geometry,RectangleInfo *region_info,ExceptionInfo *exception) +{ + MagickStatusType + flags; + + size_t + height, + width; + + SetGeometry(image,region_info); + if (image->page.width != 0) + region_info->width=image->page.width; + if (image->page.height != 0) + region_info->height=image->page.height; + flags=ParseAbsoluteGeometry(geometry,region_info); + if (flags == NoValue) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "InvalidGeometry","`%s'",geometry); + return(flags); + } + if ((flags & PercentValue) != 0) + { + GeometryInfo + geometry_info; + + MagickStatusType + status; + + PointInfo + scale; + + /* + Geometry is a percentage of the image size, not canvas size + */ + if (image->gravity != UndefinedGravity) + flags|=XValue | YValue; + status=ParseGeometry(geometry,&geometry_info); + scale.x=geometry_info.rho; + if ((status & RhoValue) == 0) + scale.x=100.0; + scale.y=geometry_info.sigma; + if ((status & SigmaValue) == 0) + scale.y=scale.x; + region_info->width=(size_t) floor((scale.x*image->columns/100.0)+0.5); + region_info->height=(size_t) floor((scale.y*image->rows/100.0)+0.5); + } + if ((flags & AspectRatioValue) != 0) + { + double + geometry_ratio, + image_ratio; + + GeometryInfo + geometry_info; + + /* + Geometry is a relative to image size and aspect ratio. + */ + if (image->gravity != UndefinedGravity) + flags|=XValue | YValue; + (void) ParseGeometry(geometry,&geometry_info); + geometry_ratio=geometry_info.rho; + image_ratio=(double) image->columns/image->rows; + if (geometry_ratio >= image_ratio) + { + region_info->width=image->columns; + region_info->height=(size_t) floor((double) (image->rows*image_ratio/ + geometry_ratio)+0.5); + } + else + { + region_info->width=(size_t) floor((double) (image->columns* + geometry_ratio/image_ratio)+0.5); + region_info->height=image->rows; + } + } + /* + Adjust offset according to gravity setting. + */ + width=region_info->width; + height=region_info->height; + if (width == 0) + region_info->width=image->page.width | image->columns; + if (height == 0) + region_info->height=image->page.height | image->rows; + GravityAdjustGeometry(image->columns,image->rows,image->gravity,region_info); + region_info->width=width; + region_info->height=height; + return(flags); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ P a r s e M e t a G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ParseMetaGeometry() is similar to GetGeometry() except the returned +% geometry is modified as determined by the meta characters: %, !, <, >, @, +% and ^ in relation to image resizing. +% +% Final image dimensions are adjusted so as to preserve the aspect ratio as +% much as possible, while generating a integer (pixel) size, and fitting the +% image within the specified geometry width and height. +% +% Flags are interpreted... +% % geometry size is given percentage of original width and height given +% ! do not try to preserve aspect ratio +% < only enlarge images smaller that geometry +% > only shrink images larger than geometry +% @ Fit image to contain at most this many pixels +% ^ Contain the given geometry given, (minimal dimensions given) +% +% The format of the ParseMetaGeometry method is: +% +% MagickStatusType ParseMetaGeometry(const char *geometry,ssize_t *x, +% ssize_t *y, size_t *width,size_t *height) +% +% A description of each parameter follows: +% +% o geometry: The geometry string (e.g. "100x100+10+10"). +% +% o x,y: The x and y offset, set according to the geometry specification. +% +% o width,height: The width and height of original image, modified by +% the given geometry specification. +% +*/ + +MagickExport MagickStatusType ParseMetaGeometry(const char *geometry,ssize_t *x, + ssize_t *y,size_t *width,size_t *height) +{ + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + size_t + former_height, + former_width; + + /* + Ensure the image geometry is valid. + */ + assert(x != (ssize_t *) NULL); + assert(y != (ssize_t *) NULL); + assert(width != (size_t *) NULL); + assert(height != (size_t *) NULL); + if ((geometry == (char *) NULL) || (*geometry == '\0')) + return(NoValue); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",geometry); + /* + Parse geometry using GetGeometry. + */ + SetGeometryInfo(&geometry_info); + former_width=(*width); + former_height=(*height); + flags=GetGeometry(geometry,x,y,width,height); + if ((flags & PercentValue) != 0) + { + MagickStatusType + flags; + + PointInfo + scale; + + /* + Geometry is a percentage of the image size. + */ + flags=ParseGeometry(geometry,&geometry_info); + scale.x=geometry_info.rho; + if ((flags & RhoValue) == 0) + scale.x=100.0; + scale.y=geometry_info.sigma; + if ((flags & SigmaValue) == 0) + scale.y=scale.x; + *width=(size_t) floor(scale.x*former_width/100.0+0.5); + *height=(size_t) floor(scale.y*former_height/100.0+0.5); + former_width=(*width); + former_height=(*height); + } + if ((flags & AspectRatioValue) != 0) + { + double + geometry_ratio, + image_ratio; + + GeometryInfo + geometry_info; + + /* + Geometry is a relative to image size and aspect ratio. + */ + (void) ParseGeometry(geometry,&geometry_info); + geometry_ratio=geometry_info.rho; + image_ratio=(double) former_width*PerceptibleReciprocal(former_height); + if (geometry_ratio >= image_ratio) + { + *width=former_width; + *height=(size_t) floor((double) (PerceptibleReciprocal( + geometry_ratio)*former_height*image_ratio)+0.5); + } + else + { + *width=(size_t) floor((double) (PerceptibleReciprocal( + image_ratio)*former_width*geometry_ratio)+0.5); + *height=former_height; + } + former_width=(*width); + former_height=(*height); + } + if (((flags & AspectValue) != 0) || ((*width == former_width) && + (*height == former_height))) + { + if ((flags & RhoValue) == 0) + *width=former_width; + if ((flags & SigmaValue) == 0) + *height=former_height; + } + else + { + double + scale_factor; + + /* + Respect aspect ratio of the image. + */ + if ((former_width == 0) || (former_height == 0)) + scale_factor=1.0; + else + if (((flags & RhoValue) != 0) && (flags & SigmaValue) != 0) + { + scale_factor=(double) *width/(double) former_width; + if ((flags & MinimumValue) == 0) + { + if (scale_factor > ((double) *height/(double) former_height)) + scale_factor=(double) *height/(double) former_height; + } + else + if (scale_factor < ((double) *height/(double) former_height)) + scale_factor=(double) *height/(double) former_height; + } + else + if ((flags & RhoValue) != 0) + { + scale_factor=(double) *width/(double) former_width; + if (((flags & MinimumValue) != 0) && + (scale_factor < ((double) *width/(double) former_height))) + scale_factor=(double) *width/(double) former_height; + } + else + { + scale_factor=(double) *height/(double) former_height; + if (((flags & MinimumValue) != 0) && + (scale_factor < ((double) *height/(double) former_width))) + scale_factor=(double) *height/(double) former_width; + } + *width=MagickMax((size_t) floor(scale_factor*former_width+0.5),1UL); + *height=MagickMax((size_t) floor(scale_factor*former_height+0.5),1UL); + } + if ((flags & GreaterValue) != 0) + { + if (former_width < *width) + *width=former_width; + if (former_height < *height) + *height=former_height; + } + if ((flags & LessValue) != 0) + { + if (former_width > *width) + *width=former_width; + if (former_height > *height) + *height=former_height; + } + if ((flags & AreaValue) != 0) + { + double + area, + distance; + + PointInfo + scale; + + /* + Geometry is a maximum area in pixels. + */ + (void) ParseGeometry(geometry,&geometry_info); + area=geometry_info.rho+sqrt(MagickEpsilon); + distance=sqrt((double) former_width*former_height); + scale.x=(double) former_width*PerceptibleReciprocal(distance* + PerceptibleReciprocal(sqrt(area))); + scale.y=(double) former_height*PerceptibleReciprocal(distance* + PerceptibleReciprocal(sqrt(area))); + if ((scale.x < (double) *width) || (scale.y < (double) *height)) + { + *width=(unsigned long) (former_width*PerceptibleReciprocal( + distance*PerceptibleReciprocal(sqrt(area)))); + *height=(unsigned long) (former_height*PerceptibleReciprocal( + distance*PerceptibleReciprocal(sqrt(area)))); + } + former_width=(*width); + former_height=(*height); + } + return(flags); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P a r s e P a g e G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ParsePageGeometry() returns a region as defined by the geometry string with +% respect to the image page (canvas) dimensions. +% +% WARNING: Percentage dimensions remain relative to the actual image +% dimensions, and not canvas dimensions. +% +% The format of the ParsePageGeometry method is: +% +% MagickStatusType ParsePageGeometry(const Image *image, +% const char *geometry,RectangeInfo *region_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o geometry: The geometry string (e.g. "100x100+10+10"). +% +% o region_info: the region as defined by the geometry string with +% respect to the image and its gravity. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickStatusType ParsePageGeometry(const Image *image, + const char *geometry,RectangleInfo *region_info,ExceptionInfo *exception) +{ + MagickStatusType + flags; + + SetGeometry(image,region_info); + if (image->page.width != 0) + region_info->width=image->page.width; + if (image->page.height != 0) + region_info->height=image->page.height; + flags=ParseAbsoluteGeometry(geometry,region_info); + if (flags == NoValue) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "InvalidGeometry","`%s'",geometry); + return(flags); + } + if ((flags & PercentValue) != 0) + { + region_info->width=image->columns; + region_info->height=image->rows; + } + flags=ParseMetaGeometry(geometry,®ion_info->x,®ion_info->y, + ®ion_info->width,®ion_info->height); + if ((((flags & WidthValue) != 0) || ((flags & HeightValue) != 0)) && + (((flags & PercentValue) != 0) || ((flags & SeparatorValue) == 0))) + { + if ((flags & WidthValue) == 0) + region_info->width=region_info->height; + if ((flags & HeightValue) == 0) + region_info->height=region_info->width; + } + return(flags); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P a r s e R e g i o n G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ParseRegionGeometry() returns a region as defined by the geometry string +% with respect to the image dimensions and aspect ratio. +% +% This is basically a wrapper around ParseMetaGeometry. This is typically +% used to parse a geometry string to work out the final integer dimensions +% for image resizing. +% +% The format of the ParseRegionGeometry method is: +% +% MagickStatusType ParseRegionGeometry(const Image *image, +% const char *geometry,RectangeInfo *region_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o geometry: The geometry string (e.g. "100x100+10+10"). +% +% o region_info: the region as defined by the geometry string. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickStatusType ParseRegionGeometry(const Image *image, + const char *geometry,RectangleInfo *region_info,ExceptionInfo *exception) +{ + MagickStatusType + flags; + + SetGeometry(image,region_info); + flags=ParseMetaGeometry(geometry,®ion_info->x,®ion_info->y, + ®ion_info->width,®ion_info->height); + if (flags == NoValue) + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "InvalidGeometry","`%s'",geometry); + return(flags); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t G e o m e t r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetGeometry() sets the geometry to its default values. +% +% The format of the SetGeometry method is: +% +% SetGeometry(const Image *image,RectangleInfo *geometry) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o geometry: the geometry. +% +*/ +MagickExport void SetGeometry(const Image *image,RectangleInfo *geometry) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(geometry != (RectangleInfo *) NULL); + (void) memset(geometry,0,sizeof(*geometry)); + geometry->width=image->columns; + geometry->height=image->rows; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t G e o m e t r y I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetGeometryInfo sets the GeometryInfo structure to its default values. +% +% The format of the SetGeometryInfo method is: +% +% SetGeometryInfo(GeometryInfo *geometry_info) +% +% A description of each parameter follows: +% +% o geometry_info: the geometry info structure. +% +*/ +MagickExport void SetGeometryInfo(GeometryInfo *geometry_info) +{ + assert(geometry_info != (GeometryInfo *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + (void) memset(geometry_info,0,sizeof(*geometry_info)); +} diff --git a/ImageMagick-6.9.12-44/magick/geometry.h b/ImageMagick-6.9.12-44/magick/geometry.h new file mode 100644 index 0000000..4ef2f15 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/geometry.h @@ -0,0 +1,163 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image geometry methods. +*/ +#ifndef MAGICKCORE_GEOMETRY_H +#define MAGICKCORE_GEOMETRY_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef enum +{ +#undef NoValue + NoValue = 0x0000, +#undef XValue + XValue = 0x0001, + XiValue = 0x0001, +#undef YValue + YValue = 0x0002, + PsiValue = 0x0002, +#undef WidthValue + WidthValue = 0x0004, + RhoValue = 0x0004, +#undef HeightValue + HeightValue = 0x0008, + SigmaValue = 0x0008, + ChiValue = 0x0010, + XiNegative = 0x0020, +#undef XNegative + XNegative = 0x0020, + PsiNegative = 0x0040, +#undef YNegative + YNegative = 0x0040, + ChiNegative = 0x0080, + PercentValue = 0x1000, /* '%' percentage of something */ + AspectValue = 0x2000, /* '!' resize no-aspect - special use flag */ + NormalizeValue = 0x2000, /* '!' ScaleKernelValue() in morphology.c */ + LessValue = 0x4000, /* '<' resize smaller - special use flag */ + GreaterValue = 0x8000, /* '>' resize larger - spacial use flag */ + MinimumValue = 0x10000, /* '^' special handling needed */ + CorrelateNormalizeValue = 0x10000, /* '^' see ScaleKernelValue() */ + AreaValue = 0x20000, /* '@' resize to area - special use flag */ + DecimalValue = 0x40000, /* '.' floating point numbers found */ + SeparatorValue = 0x80000, /* 'x' separator found */ + AspectRatioValue = 0x100000, /* '~' special handling needed */ + AlphaValue = 0x200000, /* '/' alpha */ +#undef AllValues + AllValues = 0x7fffffff +} GeometryFlags; + +#if defined(ForgetGravity) +#undef ForgetGravity +#undef NorthWestGravity +#undef NorthGravity +#undef NorthEastGravity +#undef WestGravity +#undef CenterGravity +#undef EastGravity +#undef SouthWestGravity +#undef SouthGravity +#undef SouthEastGravity +#undef StaticGravity +#endif + +typedef enum +{ + UndefinedGravity, + ForgetGravity = 0, + NorthWestGravity = 1, + NorthGravity = 2, + NorthEastGravity = 3, + WestGravity = 4, + CenterGravity = 5, + EastGravity = 6, + SouthWestGravity = 7, + SouthGravity = 8, + SouthEastGravity = 9, + StaticGravity = 10 +} GravityType; + +typedef struct _AffineMatrix +{ + double + sx, + rx, + ry, + sy, + tx, + ty; +} AffineMatrix; + +typedef struct _GeometryInfo +{ + double + rho, + sigma, + xi, + psi, + chi; +} GeometryInfo; + +typedef struct _OffsetInfo +{ + ssize_t + x, + y; +} OffsetInfo; + +typedef struct _RectangleInfo +{ + size_t + width, + height; + + ssize_t + x, + y; +} RectangleInfo; + +extern MagickExport char + *GetPageGeometry(const char *); + +extern MagickExport MagickBooleanType + IsGeometry(const char *), + IsSceneGeometry(const char *,const MagickBooleanType); + +extern MagickExport MagickStatusType + GetGeometry(const char *,ssize_t *,ssize_t *,size_t *,size_t *), + ParseAbsoluteGeometry(const char *,RectangleInfo *), + ParseAffineGeometry(const char *,AffineMatrix *,ExceptionInfo *), + ParseGeometry(const char *,GeometryInfo *), + ParseGravityGeometry(const Image *,const char *,RectangleInfo *, + ExceptionInfo *), + ParseMetaGeometry(const char *,ssize_t *,ssize_t *,size_t *,size_t *), + ParsePageGeometry(const Image *,const char *,RectangleInfo *,ExceptionInfo *), + ParseRegionGeometry(const Image *,const char *,RectangleInfo *, + ExceptionInfo *); + +extern MagickExport void + GravityAdjustGeometry(const size_t,const size_t,const GravityType, + RectangleInfo *), + SetGeometry(const Image *,RectangleInfo *), + SetGeometryInfo(GeometryInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/hashmap.c b/ImageMagick-6.9.12-44/magick/hashmap.c new file mode 100644 index 0000000..b57bf3a --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/hashmap.c @@ -0,0 +1,1928 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H H AAA SSSSS H H M M AAA PPPP % +% H H A A SS H H MM MM A A P P % +% HHHHH AAAAA SSS HHHHH M M M AAAAA PPPP % +% H H A A SS H H M M A A P % +% H H A A SSSSS H H M M A A P % +% % +% % +% MagickCore Hash-map and Linked-list Methods % +% % +% Software Design % +% Cristy % +% December 2002 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% This module implements the standard handy hash and linked-list methods for +% storing and retrieving large numbers of data elements. It is loosely based +% on the Java implementation of these algorithms. +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/hashmap.h" +#include "magick/locale_.h" +#include "magick/memory_.h" +#include "magick/semaphore.h" +#include "magick/signature-private.h" +#include "magick/string_.h" + +/* + Typedef declarations. +*/ +typedef struct _ElementInfo +{ + void + *value; + + struct _ElementInfo + *next; +} ElementInfo; + +typedef struct _EntryInfo +{ + size_t + hash; + + void + *key, + *value; +} EntryInfo; + +struct _LinkedListInfo +{ + size_t + capacity, + elements; + + ElementInfo + *head, + *tail, + *next; + + SemaphoreInfo + *semaphore; + + size_t + signature; +}; + +struct _HashmapInfo +{ + size_t + (*hash)(const void *); + + MagickBooleanType + (*compare)(const void *,const void *); + + void + *(*relinquish_key)(void *), + *(*relinquish_value)(void *); + + size_t + capacity, + entries, + next; + + MagickBooleanType + head_of_list; + + LinkedListInfo + **map; + + SemaphoreInfo + *semaphore; + + size_t + signature; +}; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A p p e n d V a l u e T o L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AppendValueToLinkedList() appends a value to the end of the linked-list. +% +% The format of the AppendValueToLinkedList method is: +% +% MagickBooleanType AppendValueToLinkedList(LinkedListInfo *list_info, +% const void *value) +% +% A description of each parameter follows: +% +% o list_info: the linked-list info. +% +% o value: the value. +% +*/ +MagickExport MagickBooleanType AppendValueToLinkedList( + LinkedListInfo *list_info,const void *value) +{ + ElementInfo + *next; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + if (list_info->elements == list_info->capacity) + return(MagickFalse); + next=(ElementInfo *) AcquireMagickMemory(sizeof(*next)); + if (next == (ElementInfo *) NULL) + return(MagickFalse); + next->value=(void *) value; + next->next=(ElementInfo *) NULL; + LockSemaphoreInfo(list_info->semaphore); + if (list_info->next == (ElementInfo *) NULL) + list_info->next=next; + if (list_info->elements == 0) + list_info->head=next; + else + list_info->tail->next=next; + list_info->tail=next; + list_info->elements++; + UnlockSemaphoreInfo(list_info->semaphore); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l e a r L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClearLinkedList() clears all the elements from the linked-list. +% +% The format of the ClearLinkedList method is: +% +% void ClearLinkedList(LinkedListInfo *list_info, +% void *(*relinquish_value)(void *)) +% +% A description of each parameter follows: +% +% o list_info: the linked-list info. +% +% o relinquish_value: the value deallocation method; typically +% RelinquishMagickMemory(). +% +*/ +MagickExport void ClearLinkedList(LinkedListInfo *list_info, + void *(*relinquish_value)(void *)) +{ + ElementInfo + *element; + + ElementInfo + *next; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + LockSemaphoreInfo(list_info->semaphore); + next=list_info->head; + while (next != (ElementInfo *) NULL) + { + if (relinquish_value != (void *(*)(void *)) NULL) + next->value=relinquish_value(next->value); + element=next; + next=next->next; + element=(ElementInfo *) RelinquishMagickMemory(element); + } + list_info->head=(ElementInfo *) NULL; + list_info->tail=(ElementInfo *) NULL; + list_info->next=(ElementInfo *) NULL; + list_info->elements=0; + UnlockSemaphoreInfo(list_info->semaphore); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o m p a r e H a s h m a p S t r i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CompareHashmapString() finds an entry in a hash-map based on the contents +% of a string. +% +% The format of the CompareHashmapString method is: +% +% MagickBooleanType CompareHashmapString(const void *target, +% const void *source) +% +% A description of each parameter follows: +% +% o target: the target string. +% +% o source: the source string. +% +*/ +MagickExport MagickBooleanType CompareHashmapString(const void *target, + const void *source) +{ + const char + *p, + *q; + + p=(const char *) target; + q=(const char *) source; + return(LocaleCompare(p,q) == 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o m p a r e H a s h m a p S t r i n g I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CompareHashmapStringInfo() finds an entry in a hash-map based on the +% contents of a string. +% +% The format of the CompareHashmapStringInfo method is: +% +% MagickBooleanType CompareHashmapStringInfo(const void *target, +% const void *source) +% +% A description of each parameter follows: +% +% o target: the target string. +% +% o source: the source string. +% +*/ +MagickExport MagickBooleanType CompareHashmapStringInfo(const void *target, + const void *source) +{ + const StringInfo + *p, + *q; + + p=(const StringInfo *) target; + q=(const StringInfo *) source; + return(CompareStringInfo(p,q) == 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y H a s h m a p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyHashmap() frees the hash-map and all associated resources. +% +% The format of the DestroyHashmap method is: +% +% HashmapInfo *DestroyHashmap(HashmapInfo *hashmap_info) +% +% A description of each parameter follows: +% +% o hashmap_info: the hashmap info. +% +*/ +MagickExport HashmapInfo *DestroyHashmap(HashmapInfo *hashmap_info) +{ + LinkedListInfo + *list_info; + + EntryInfo + *entry; + + ssize_t + i; + + assert(hashmap_info != (HashmapInfo *) NULL); + assert(hashmap_info->signature == MagickCoreSignature); + LockSemaphoreInfo(hashmap_info->semaphore); + for (i=0; i < (ssize_t) hashmap_info->capacity; i++) + { + list_info=hashmap_info->map[i]; + if (list_info != (LinkedListInfo *) NULL) + { + list_info->next=list_info->head; + entry=(EntryInfo *) GetNextValueInLinkedList(list_info); + while (entry != (EntryInfo *) NULL) + { + if (hashmap_info->relinquish_key != (void *(*)(void *)) NULL) + entry->key=hashmap_info->relinquish_key(entry->key); + if (hashmap_info->relinquish_value != (void *(*)(void *)) NULL) + entry->value=hashmap_info->relinquish_value(entry->value); + entry=(EntryInfo *) GetNextValueInLinkedList(list_info); + } + } + if (list_info != (LinkedListInfo *) NULL) + list_info=DestroyLinkedList(list_info,RelinquishMagickMemory); + } + hashmap_info->map=(LinkedListInfo **) RelinquishMagickMemory( + hashmap_info->map); + hashmap_info->signature=(~MagickCoreSignature); + UnlockSemaphoreInfo(hashmap_info->semaphore); + DestroySemaphoreInfo(&hashmap_info->semaphore); + hashmap_info=(HashmapInfo *) RelinquishMagickMemory(hashmap_info); + return(hashmap_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyLinkedList() frees the linked-list and all associated resources. +% +% The format of the DestroyLinkedList method is: +% +% LinkedListInfo *DestroyLinkedList(LinkedListInfo *list_info, +% void *(*relinquish_value)(void *)) +% +% A description of each parameter follows: +% +% o list_info: the linked-list info. +% +% o relinquish_value: the value deallocation method; typically +% RelinquishMagickMemory(). +% +*/ +MagickExport LinkedListInfo *DestroyLinkedList(LinkedListInfo *list_info, + void *(*relinquish_value)(void *)) +{ + ElementInfo + *entry; + + ElementInfo + *next; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + LockSemaphoreInfo(list_info->semaphore); + for (next=list_info->head; next != (ElementInfo *) NULL; ) + { + if (relinquish_value != (void *(*)(void *)) NULL) + next->value=relinquish_value(next->value); + entry=next; + next=next->next; + entry=(ElementInfo *) RelinquishMagickMemory(entry); + } + list_info->signature=(~MagickCoreSignature); + UnlockSemaphoreInfo(list_info->semaphore); + DestroySemaphoreInfo(&list_info->semaphore); + list_info=(LinkedListInfo *) RelinquishMagickMemory(list_info); + return(list_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t L a s t V a l u e I n L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetLastValueInLinkedList() gets the last value in the linked-list. +% +% The format of the GetLastValueInLinkedList method is: +% +% void *GetLastValueInLinkedList(LinkedListInfo *list_info) +% +% A description of each parameter follows: +% +% o list_info: the linked_list info. +% +*/ +MagickExport void *GetLastValueInLinkedList(LinkedListInfo *list_info) +{ + void + *value; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + if (list_info->elements == 0) + return((void *) NULL); + LockSemaphoreInfo(list_info->semaphore); + value=list_info->tail->value; + UnlockSemaphoreInfo(list_info->semaphore); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t N e x t K e y I n H a s h m a p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetNextKeyInHashmap() gets the next key in the hash-map. +% +% The format of the GetNextKeyInHashmap method is: +% +% void *GetNextKeyInHashmap(HashmapInfo *hashmap_info) +% +% A description of each parameter follows: +% +% o hashmap_info: the hashmap info. +% +*/ +MagickExport void *GetNextKeyInHashmap(HashmapInfo *hashmap_info) +{ + LinkedListInfo + *list_info; + + EntryInfo + *entry; + + void + *key; + + assert(hashmap_info != (HashmapInfo *) NULL); + assert(hashmap_info->signature == MagickCoreSignature); + LockSemaphoreInfo(hashmap_info->semaphore); + while (hashmap_info->next < hashmap_info->capacity) + { + list_info=hashmap_info->map[hashmap_info->next]; + if (list_info != (LinkedListInfo *) NULL) + { + if (hashmap_info->head_of_list == MagickFalse) + { + list_info->next=list_info->head; + hashmap_info->head_of_list=MagickTrue; + } + entry=(EntryInfo *) GetNextValueInLinkedList(list_info); + if (entry != (EntryInfo *) NULL) + { + key=entry->key; + UnlockSemaphoreInfo(hashmap_info->semaphore); + return(key); + } + hashmap_info->head_of_list=MagickFalse; + } + hashmap_info->next++; + } + UnlockSemaphoreInfo(hashmap_info->semaphore); + return((void *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t N e x t V a l u e I n H a s h m a p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetNextValueInHashmap() gets the next value in the hash-map. +% +% The format of the GetNextValueInHashmap method is: +% +% void *GetNextValueInHashmap(HashmapInfo *hashmap_info) +% +% A description of each parameter follows: +% +% o hashmap_info: the hashmap info. +% +*/ +MagickExport void *GetNextValueInHashmap(HashmapInfo *hashmap_info) +{ + LinkedListInfo + *list_info; + + EntryInfo + *entry; + + void + *value; + + assert(hashmap_info != (HashmapInfo *) NULL); + assert(hashmap_info->signature == MagickCoreSignature); + LockSemaphoreInfo(hashmap_info->semaphore); + while (hashmap_info->next < hashmap_info->capacity) + { + list_info=hashmap_info->map[hashmap_info->next]; + if (list_info != (LinkedListInfo *) NULL) + { + if (hashmap_info->head_of_list == MagickFalse) + { + list_info->next=list_info->head; + hashmap_info->head_of_list=MagickTrue; + } + entry=(EntryInfo *) GetNextValueInLinkedList(list_info); + if (entry != (EntryInfo *) NULL) + { + value=entry->value; + UnlockSemaphoreInfo(hashmap_info->semaphore); + return(value); + } + hashmap_info->head_of_list=MagickFalse; + } + hashmap_info->next++; + } + UnlockSemaphoreInfo(hashmap_info->semaphore); + return((void *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t N e x t V a l u e I n L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetNextValueInLinkedList() gets the next value in the linked-list. +% +% The format of the GetNextValueInLinkedList method is: +% +% void *GetNextValueInLinkedList(LinkedListInfo *list_info) +% +% A description of each parameter follows: +% +% o list_info: the linked-list info. +% +*/ +MagickExport void *GetNextValueInLinkedList(LinkedListInfo *list_info) +{ + void + *value; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + LockSemaphoreInfo(list_info->semaphore); + if (list_info->next == (ElementInfo *) NULL) + { + UnlockSemaphoreInfo(list_info->semaphore); + return((void *) NULL); + } + value=list_info->next->value; + list_info->next=list_info->next->next; + UnlockSemaphoreInfo(list_info->semaphore); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t N u m b e r O f E n t r i e s I n H a s h m a p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetNumberOfEntriesInHashmap() returns the number of entries in the hash-map. +% +% The format of the GetNumberOfEntriesInHashmap method is: +% +% size_t GetNumberOfEntriesInHashmap(const HashmapInfo *hashmap_info) +% +% A description of each parameter follows: +% +% o hashmap_info: the hashmap info. +% +*/ +MagickExport size_t GetNumberOfEntriesInHashmap( + const HashmapInfo *hashmap_info) +{ + assert(hashmap_info != (HashmapInfo *) NULL); + assert(hashmap_info->signature == MagickCoreSignature); + return(hashmap_info->entries); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t N u m b e r O f E l e m e n t s I n L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetNumberOfElementsInLinkedList() returns the number of entries in the +% linked-list. +% +% The format of the GetNumberOfElementsInLinkedList method is: +% +% size_t GetNumberOfElementsInLinkedList( +% const LinkedListInfo *list_info) +% +% A description of each parameter follows: +% +% o list_info: the linked-list info. +% +*/ +MagickExport size_t GetNumberOfElementsInLinkedList( + const LinkedListInfo *list_info) +{ + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + return(list_info->elements); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t V a l u e F r o m H a s h m a p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetValueFromHashmap() gets an entry from the hash-map by its key. +% +% The format of the GetValueFromHashmap method is: +% +% void *GetValueFromHashmap(HashmapInfo *hashmap_info,const void *key) +% +% A description of each parameter follows: +% +% o hashmap_info: the hashmap info. +% +% o key: the key. +% +*/ +MagickExport void *GetValueFromHashmap(HashmapInfo *hashmap_info, + const void *key) +{ + LinkedListInfo + *list_info; + + EntryInfo + *entry; + + size_t + hash; + + void + *value; + + assert(hashmap_info != (HashmapInfo *) NULL); + assert(hashmap_info->signature == MagickCoreSignature); + if (key == (const void *) NULL) + return((void *) NULL); + LockSemaphoreInfo(hashmap_info->semaphore); + hash=hashmap_info->hash(key); + list_info=hashmap_info->map[hash % hashmap_info->capacity]; + if (list_info != (LinkedListInfo *) NULL) + { + list_info->next=list_info->head; + entry=(EntryInfo *) GetNextValueInLinkedList(list_info); + while (entry != (EntryInfo *) NULL) + { + if (entry->hash == hash) + { + MagickBooleanType + compare; + + compare=MagickTrue; + if (hashmap_info->compare != + (MagickBooleanType (*)(const void *,const void *)) NULL) + compare=hashmap_info->compare(key,entry->key); + if (compare != MagickFalse) + { + value=entry->value; + UnlockSemaphoreInfo(hashmap_info->semaphore); + return(value); + } + } + entry=(EntryInfo *) GetNextValueInLinkedList(list_info); + } + } + UnlockSemaphoreInfo(hashmap_info->semaphore); + return((void *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t V a l u e F r o m L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetValueFromLinkedList() gets a value from the linked-list at the specified +% location. +% +% The format of the GetValueFromLinkedList method is: +% +% void *GetValueFromLinkedList(LinkedListInfo *list_info, +% const size_t index) +% +% A description of each parameter follows: +% +% o list_info: the linked_list info. +% +% o index: the list index. +% +*/ +MagickExport void *GetValueFromLinkedList(LinkedListInfo *list_info, + const size_t index) +{ + ElementInfo + *next; + + ssize_t + i; + + void + *value; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + if (index >= list_info->elements) + return((void *) NULL); + LockSemaphoreInfo(list_info->semaphore); + if (index == 0) + { + value=list_info->head->value; + UnlockSemaphoreInfo(list_info->semaphore); + return(value); + } + if (index == (list_info->elements-1)) + { + value=list_info->tail->value; + UnlockSemaphoreInfo(list_info->semaphore); + return(value); + } + next=list_info->head; + for (i=0; i < (ssize_t) index; i++) + next=next->next; + value=next->value; + UnlockSemaphoreInfo(list_info->semaphore); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H a s h P o i n t e r T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% HashPointerType() finds an entry in a hash-map based on the address of a +% pointer. +% +% The format of the HashPointerType method is: +% +% size_t HashPointerType(const void *pointer) +% +% A description of each parameter follows: +% +% o pointer: compute the hash entry location from this pointer address. +% +*/ +MagickExport size_t HashPointerType(const void *pointer) +{ + size_t + hash; + + hash=(size_t) pointer; + hash+=(~(hash << 9)); + hash^=(hash >> 14); + hash+=(hash << 4); + hash^=(hash >> 10); + return(hash); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H a s h S t r i n g T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% HashStringType() finds an entry in a hash-map based on the contents of a +% string. +% +% The format of the HashStringType method is: +% +% size_t HashStringType(const void *string) +% +% A description of each parameter follows: +% +% o string: compute the hash entry location from this string. +% +*/ +MagickExport size_t HashStringType(const void *string) +{ + const unsigned char + *digest; + + ssize_t + i; + + SignatureInfo + *signature_info; + + size_t + hash; + + StringInfo + *signature; + + signature_info=AcquireSignatureInfo(); + signature=StringToStringInfo((const char *) string); + UpdateSignature(signature_info,signature); + FinalizeSignature(signature_info); + digest=GetStringInfoDatum(GetSignatureDigest(signature_info)); + hash=0; + for (i=0; i < 8; i++) + hash^=digest[i]; + signature=DestroyStringInfo(signature); + signature_info=DestroySignatureInfo(signature_info); + return(hash); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H a s h S t r i n g I n f o T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Specify the HashStringInfoType() method in NewHashmap() to find an entry +% in a hash-map based on the contents of a string. +% +% The format of the HashStringInfoType method is: +% +% size_t HashStringInfoType(const void *string_info) +% +% A description of each parameter follows: +% +% o string_info: compute the hash entry location from this string. +% +*/ +MagickExport size_t HashStringInfoType(const void *string_info) +{ + const unsigned char + *digest; + + ssize_t + i; + + SignatureInfo + *signature_info; + + size_t + hash; + + signature_info=AcquireSignatureInfo(); + UpdateSignature(signature_info,(const StringInfo *) string_info); + FinalizeSignature(signature_info); + digest=GetStringInfoDatum(GetSignatureDigest(signature_info)); + hash=0; + for (i=0; i < 8; i++) + hash^=digest[i]; + signature_info=DestroySignatureInfo(signature_info); + return(hash); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I n s e r t V a l u e I n L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% InsertValueInLinkedList() inserts an element in the linked-list at the +% specified location. +% +% The format of the InsertValueInLinkedList method is: +% +% MagickBooleanType InsertValueInLinkedList(ListInfo *list_info, +% const size_t index,const void *value) +% +% A description of each parameter follows: +% +% o list_info: the hashmap info. +% +% o index: the index. +% +% o value: the value. +% +*/ +MagickExport MagickBooleanType InsertValueInLinkedList( + LinkedListInfo *list_info,const size_t index,const void *value) +{ + ElementInfo + *next; + + ssize_t + i; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + if (value == (const void *) NULL) + return(MagickFalse); + if ((index > list_info->elements) || + (list_info->elements == list_info->capacity)) + return(MagickFalse); + next=(ElementInfo *) AcquireMagickMemory(sizeof(*next)); + if (next == (ElementInfo *) NULL) + return(MagickFalse); + next->value=(void *) value; + next->next=(ElementInfo *) NULL; + LockSemaphoreInfo(list_info->semaphore); + if (list_info->elements == 0) + { + if (list_info->next == (ElementInfo *) NULL) + list_info->next=next; + list_info->head=next; + list_info->tail=next; + } + else + { + if (index == 0) + { + if (list_info->next == list_info->head) + list_info->next=next; + next->next=list_info->head; + list_info->head=next; + } + else + if (index == list_info->elements) + { + if (list_info->next == (ElementInfo *) NULL) + list_info->next=next; + list_info->tail->next=next; + list_info->tail=next; + } + else + { + ElementInfo + *element; + + element=list_info->head; + next->next=element->next; + for (i=1; i < (ssize_t) index; i++) + { + element=element->next; + next->next=element->next; + } + next=next->next; + element->next=next; + if (list_info->next == next->next) + list_info->next=next; + } + } + list_info->elements++; + UnlockSemaphoreInfo(list_info->semaphore); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I n s e r t V a l u e I n S o r t e d L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% InsertValueInSortedLinkedList() inserts a value in the sorted linked-list. +% +% The format of the InsertValueInSortedLinkedList method is: +% +% MagickBooleanType InsertValueInSortedLinkedList(ListInfo *list_info, +% int (*compare)(const void *,const void *),void **replace, +% const void *value) +% +% A description of each parameter follows: +% +% o list_info: the hashmap info. +% +% o index: the index. +% +% o compare: the compare method. +% +% o replace: return previous element here. +% +% o value: the value. +% +*/ +MagickExport MagickBooleanType InsertValueInSortedLinkedList( + LinkedListInfo *list_info,int (*compare)(const void *,const void *), + void **replace,const void *value) +{ + ElementInfo + *element; + + ElementInfo + *next; + + ssize_t + i; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + if ((compare == (int (*)(const void *,const void *)) NULL) || + (value == (const void *) NULL)) + return(MagickFalse); + if (list_info->elements == list_info->capacity) + return(MagickFalse); + next=(ElementInfo *) AcquireMagickMemory(sizeof(*next)); + if (next == (ElementInfo *) NULL) + return(MagickFalse); + next->value=(void *) value; + element=(ElementInfo *) NULL; + LockSemaphoreInfo(list_info->semaphore); + next->next=list_info->head; + while (next->next != (ElementInfo *) NULL) + { + i=(ssize_t) compare(value,next->next->value); + if ((i < 0) || ((replace != (void **) NULL) && (i == 0))) + { + if (i == 0) + { + *replace=next->next->value; + next->next=next->next->next; + if (element != (ElementInfo *) NULL) + element->next=(ElementInfo *) RelinquishMagickMemory( + element->next); + list_info->elements--; + } + if (element != (ElementInfo *) NULL) + element->next=next; + else + list_info->head=next; + break; + } + element=next->next; + next->next=next->next->next; + } + if (next->next == (ElementInfo *) NULL) + { + if (element != (ElementInfo *) NULL) + element->next=next; + else + list_info->head=next; + list_info->tail=next; + } + list_info->elements++; + UnlockSemaphoreInfo(list_info->semaphore); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s H a s h m a p E m p t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsHashmapEmpty() returns MagickTrue if the hash-map is empty. +% +% The format of the IsHashmapEmpty method is: +% +% MagickBooleanType IsHashmapEmpty(const HashmapInfo *hashmap_info) +% +% A description of each parameter follows: +% +% o hashmap_info: the hashmap info. +% +*/ +MagickExport MagickBooleanType IsHashmapEmpty(const HashmapInfo *hashmap_info) +{ + assert(hashmap_info != (HashmapInfo *) NULL); + assert(hashmap_info->signature == MagickCoreSignature); + return(hashmap_info->entries == 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s L i n k e d L i s t E m p t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsLinkedListEmpty() returns MagickTrue if the linked-list is empty. +% +% The format of the IsLinkedListEmpty method is: +% +% MagickBooleanType IsLinkedListEmpty(LinkedListInfo *list_info) +% +% A description of each parameter follows: +% +% o list_info: the linked-list info. +% +*/ +MagickExport MagickBooleanType IsLinkedListEmpty( + const LinkedListInfo *list_info) +{ + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + return(list_info->elements == 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L i n k e d L i s t T o A r r a y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% LinkedListToArray() converts the linked-list to an array. +% +% The format of the LinkedListToArray method is: +% +% MagickBooleanType LinkedListToArray(LinkedListInfo *list_info, +% void **array) +% +% A description of each parameter follows: +% +% o list_info: the linked-list info. +% +% o array: the array. +% +*/ +MagickExport MagickBooleanType LinkedListToArray(LinkedListInfo *list_info, + void **array) +{ + ElementInfo + *next; + + ssize_t + i; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + if (array == (void **) NULL) + return(MagickFalse); + LockSemaphoreInfo(list_info->semaphore); + next=list_info->head; + for (i=0; next != (ElementInfo *) NULL; i++) + { + array[i]=next->value; + next=next->next; + } + UnlockSemaphoreInfo(list_info->semaphore); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w H a s h m a p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewHashmap() returns a pointer to a HashmapInfo structure initialized +% to default values. The capacity is an initial estimate. The hashmap will +% increase capacity dynamically as the demand requires. +% +% The format of the NewHashmap method is: +% +% HashmapInfo *NewHashmap(const size_t capacity, +% size_t (*hash)(const void *), +% MagickBooleanType (*compare)(const void *,const void *), +% void *(*relinquish_key)(void *),void *(*relinquish_value)(void *)) +% +% A description of each parameter follows: +% +% o capacity: the initial number entries in the hash-map: typically +% SmallHashmapSize, MediumHashmapSize, or LargeHashmapSize. The +% hashmap will dynamically increase its capacity on demand. +% +% o hash: the hash method, typically HashPointerType(), HashStringType(), +% or HashStringInfoType(). +% +% o compare: the compare method, typically NULL, CompareHashmapString(), +% or CompareHashmapStringInfo(). +% +% o relinquish_key: the key deallocation method, typically +% RelinquishMagickMemory(), called whenever a key is removed from the +% hash-map. +% +% o relinquish_value: the value deallocation method; typically +% RelinquishMagickMemory(), called whenever a value object is removed from +% the hash-map. +% +*/ +MagickExport HashmapInfo *NewHashmap(const size_t capacity, + size_t (*hash)(const void *), + MagickBooleanType (*compare)(const void *,const void *), + void *(*relinquish_key)(void *),void *(*relinquish_value)(void *)) +{ + HashmapInfo + *hashmap_info; + + hashmap_info=(HashmapInfo *) AcquireMagickMemory(sizeof(*hashmap_info)); + if (hashmap_info == (HashmapInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(hashmap_info,0,sizeof(*hashmap_info)); + hashmap_info->hash=HashPointerType; + if (hash != (size_t (*)(const void *)) NULL) + hashmap_info->hash=hash; + hashmap_info->compare=(MagickBooleanType (*)(const void *,const void *)) NULL; + if (compare != (MagickBooleanType (*)(const void *,const void *)) NULL) + hashmap_info->compare=compare; + hashmap_info->relinquish_key=relinquish_key; + hashmap_info->relinquish_value=relinquish_value; + hashmap_info->entries=0; + hashmap_info->capacity=capacity; + hashmap_info->map=(LinkedListInfo **) NULL; + if (~capacity >= 1UL) + hashmap_info->map=(LinkedListInfo **) AcquireQuantumMemory((size_t) + capacity+1UL,sizeof(*hashmap_info->map)); + if (hashmap_info->map == (LinkedListInfo **) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(hashmap_info->map,0,(size_t) capacity* + sizeof(*hashmap_info->map)); + hashmap_info->semaphore=AllocateSemaphoreInfo(); + hashmap_info->signature=MagickCoreSignature; + return(hashmap_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w L i n k e d L i s t I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewLinkedList() returns a pointer to a LinkedListInfo structure +% initialized to default values. +% +% The format of the NewLinkedList method is: +% +% LinkedListInfo *NewLinkedList(const size_t capacity) +% +% A description of each parameter follows: +% +% o capacity: the maximum number of elements in the list. +% +*/ +MagickExport LinkedListInfo *NewLinkedList(const size_t capacity) +{ + LinkedListInfo + *list_info; + + list_info=(LinkedListInfo *) AcquireMagickMemory(sizeof(*list_info)); + if (list_info == (LinkedListInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(list_info,0,sizeof(*list_info)); + list_info->capacity=capacity == 0 ? (size_t) (~0) : capacity; + list_info->elements=0; + list_info->head=(ElementInfo *) NULL; + list_info->tail=(ElementInfo *) NULL; + list_info->next=(ElementInfo *) NULL; + list_info->semaphore=AllocateSemaphoreInfo(); + list_info->signature=MagickCoreSignature; + return(list_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P u t E n t r y I n H a s h m a p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PutEntryInHashmap() puts an entry in the hash-map. If the key already +% exists in the map it is first removed. +% +% The format of the PutEntryInHashmap method is: +% +% MagickBooleanType PutEntryInHashmap(HashmapInfo *hashmap_info, +% const void *key,const void *value) +% +% A description of each parameter follows: +% +% o hashmap_info: the hashmap info. +% +% o key: the key. +% +% o value: the value. +% +*/ + +static MagickBooleanType IncreaseHashmapCapacity(HashmapInfo *hashmap_info) +{ +#define MaxCapacities 20 + + const size_t + capacities[MaxCapacities] = + { + 17, 31, 61, 131, 257, 509, 1021, 2053, 4099, 8191, 16381, 32771, + 65537, 131071, 262147, 524287, 1048573, 2097143, 4194301, 8388617 + }; + + ElementInfo + *element; + + EntryInfo + *entry; + + LinkedListInfo + *map_info, + **map; + + ElementInfo + *next; + + ssize_t + i; + + size_t + capacity; + + /* + Increase to the next prime capacity. + */ + for (i=0; i < MaxCapacities; i++) + if (hashmap_info->capacity < capacities[i]) + break; + if (i >= (MaxCapacities-1)) + return(MagickFalse); + capacity=capacities[i+1]; + map=(LinkedListInfo **) AcquireQuantumMemory((size_t) capacity+1UL, + sizeof(*map)); + if (map == (LinkedListInfo **) NULL) + return(MagickFalse); + (void) memset(map,0,(size_t) capacity*sizeof(*map)); + /* + Copy entries to new hashmap with increased capacity. + */ + for (i=0; i < (ssize_t) hashmap_info->capacity; i++) + { + LinkedListInfo + *list_info; + + list_info=hashmap_info->map[i]; + if (list_info == (LinkedListInfo *) NULL) + continue; + LockSemaphoreInfo(list_info->semaphore); + for (next=list_info->head; next != (ElementInfo *) NULL; ) + { + element=next; + next=next->next; + entry=(EntryInfo *) element->value; + map_info=map[entry->hash % capacity]; + if (map_info == (LinkedListInfo *) NULL) + { + map_info=NewLinkedList(0); + map[entry->hash % capacity]=map_info; + } + map_info->next=element; + element->next=map_info->head; + map_info->head=element; + map_info->elements++; + } + list_info->signature=(~MagickCoreSignature); + UnlockSemaphoreInfo(list_info->semaphore); + DestroySemaphoreInfo(&list_info->semaphore); + list_info=(LinkedListInfo *) RelinquishMagickMemory(list_info); + } + hashmap_info->map=(LinkedListInfo **) RelinquishMagickMemory( + hashmap_info->map); + hashmap_info->map=map; + hashmap_info->capacity=capacity; + return(MagickTrue); +} + +MagickExport MagickBooleanType PutEntryInHashmap(HashmapInfo *hashmap_info, + const void *key,const void *value) +{ + EntryInfo + *entry, + *next; + + LinkedListInfo + *list_info; + + size_t + i; + + assert(hashmap_info != (HashmapInfo *) NULL); + assert(hashmap_info->signature == MagickCoreSignature); + if ((key == (void *) NULL) || (value == (void *) NULL)) + return(MagickFalse); + next=(EntryInfo *) AcquireMagickMemory(sizeof(*next)); + if (next == (EntryInfo *) NULL) + return(MagickFalse); + LockSemaphoreInfo(hashmap_info->semaphore); + next->hash=hashmap_info->hash(key); + next->key=(void *) key; + next->value=(void *) value; + list_info=hashmap_info->map[next->hash % hashmap_info->capacity]; + if (list_info == (LinkedListInfo *) NULL) + { + list_info=NewLinkedList(0); + hashmap_info->map[next->hash % hashmap_info->capacity]=list_info; + } + else + { + list_info->next=list_info->head; + entry=(EntryInfo *) GetNextValueInLinkedList(list_info); + for (i=0; entry != (EntryInfo *) NULL; i++) + { + if (entry->hash == next->hash) + { + MagickBooleanType + compare; + + compare=MagickTrue; + if (hashmap_info->compare != + (MagickBooleanType (*)(const void *,const void *)) NULL) + compare=hashmap_info->compare(key,entry->key); + if (compare != MagickFalse) + { + (void) RemoveElementFromLinkedList(list_info,i); + if (hashmap_info->relinquish_key != (void *(*)(void *)) NULL) + entry->key=hashmap_info->relinquish_key(entry->key); + if (hashmap_info->relinquish_value != (void *(*)(void *)) NULL) + entry->value=hashmap_info->relinquish_value(entry->value); + entry=(EntryInfo *) RelinquishMagickMemory(entry); + break; + } + } + entry=(EntryInfo *) GetNextValueInLinkedList(list_info); + } + } + if (InsertValueInLinkedList(list_info,0,next) == MagickFalse) + { + next=(EntryInfo *) RelinquishMagickMemory(next); + UnlockSemaphoreInfo(hashmap_info->semaphore); + return(MagickFalse); + } + if (list_info->elements >= (hashmap_info->capacity-1)) + if (IncreaseHashmapCapacity(hashmap_info) == MagickFalse) + { + UnlockSemaphoreInfo(hashmap_info->semaphore); + return(MagickFalse); + } + hashmap_info->entries++; + UnlockSemaphoreInfo(hashmap_info->semaphore); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e m o v e E l e m e n t B y V a l u e F r o m L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RemoveElementByValueFromLinkedList() removes an element from the linked-list +% by value. +% +% The format of the RemoveElementByValueFromLinkedList method is: +% +% void *RemoveElementByValueFromLinkedList(LinkedListInfo *list_info, +% const void *value) +% +% A description of each parameter follows: +% +% o list_info: the list info. +% +% o value: the value. +% +*/ +MagickExport void *RemoveElementByValueFromLinkedList(LinkedListInfo *list_info, + const void *value) +{ + ElementInfo + *next; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + if ((list_info->elements == 0) || (value == (const void *) NULL)) + return((void *) NULL); + LockSemaphoreInfo(list_info->semaphore); + if (value == list_info->head->value) + { + if (list_info->next == list_info->head) + list_info->next=list_info->head->next; + next=list_info->head; + list_info->head=list_info->head->next; + next=(ElementInfo *) RelinquishMagickMemory(next); + } + else + { + ElementInfo + *element; + + next=list_info->head; + while ((next->next != (ElementInfo *) NULL) && + (next->next->value != value)) + next=next->next; + if (next->next == (ElementInfo *) NULL) + { + UnlockSemaphoreInfo(list_info->semaphore); + return((void *) NULL); + } + element=next->next; + next->next=element->next; + if (element == list_info->tail) + list_info->tail=next; + if (list_info->next == element) + list_info->next=element->next; + element=(ElementInfo *) RelinquishMagickMemory(element); + } + list_info->elements--; + UnlockSemaphoreInfo(list_info->semaphore); + return((void *) value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e m o v e E l e m e n t F r o m L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RemoveElementFromLinkedList() removes an element from the linked-list at the +% specified location. +% +% The format of the RemoveElementFromLinkedList method is: +% +% void *RemoveElementFromLinkedList(LinkedListInfo *list_info, +% const size_t index) +% +% A description of each parameter follows: +% +% o list_info: the linked-list info. +% +% o index: the index. +% +*/ +MagickExport void *RemoveElementFromLinkedList(LinkedListInfo *list_info, + const size_t index) +{ + ElementInfo + *next; + + ssize_t + i; + + void + *value; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + if (index >= list_info->elements) + return((void *) NULL); + LockSemaphoreInfo(list_info->semaphore); + if (index == 0) + { + if (list_info->next == list_info->head) + list_info->next=list_info->head->next; + value=list_info->head->value; + next=list_info->head; + list_info->head=list_info->head->next; + next=(ElementInfo *) RelinquishMagickMemory(next); + } + else + { + ElementInfo + *element; + + next=list_info->head; + for (i=1; i < (ssize_t) index; i++) + next=next->next; + element=next->next; + next->next=element->next; + if (element == list_info->tail) + list_info->tail=next; + if (list_info->next == element) + list_info->next=element->next; + value=element->value; + element=(ElementInfo *) RelinquishMagickMemory(element); + } + list_info->elements--; + UnlockSemaphoreInfo(list_info->semaphore); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e m o v e E n t r y F r o m H a s h m a p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RemoveEntryFromHashmap() removes an entry from the hash-map by its key. +% +% The format of the RemoveEntryFromHashmap method is: +% +% void *RemoveEntryFromHashmap(HashmapInfo *hashmap_info,void *key) +% +% A description of each parameter follows: +% +% o hashmap_info: the hashmap info. +% +% o key: the key. +% +*/ +MagickExport void *RemoveEntryFromHashmap(HashmapInfo *hashmap_info, + const void *key) +{ + EntryInfo + *entry; + + LinkedListInfo + *list_info; + + size_t + i; + + size_t + hash; + + void + *value; + + assert(hashmap_info != (HashmapInfo *) NULL); + assert(hashmap_info->signature == MagickCoreSignature); + if (key == (const void *) NULL) + return((void *) NULL); + LockSemaphoreInfo(hashmap_info->semaphore); + hash=hashmap_info->hash(key); + list_info=hashmap_info->map[hash % hashmap_info->capacity]; + if (list_info != (LinkedListInfo *) NULL) + { + list_info->next=list_info->head; + entry=(EntryInfo *) GetNextValueInLinkedList(list_info); + for (i=0; entry != (EntryInfo *) NULL; i++) + { + if (entry->hash == hash) + { + MagickBooleanType + compare; + + compare=MagickTrue; + if (hashmap_info->compare != + (MagickBooleanType (*)(const void *,const void *)) NULL) + compare=hashmap_info->compare(key,entry->key); + if (compare != MagickFalse) + { + entry=(EntryInfo *) RemoveElementFromLinkedList(list_info,i); + if (entry == (EntryInfo *) NULL) + { + UnlockSemaphoreInfo(hashmap_info->semaphore); + return((void *) NULL); + } + if (hashmap_info->relinquish_key != (void *(*)(void *)) NULL) + entry->key=hashmap_info->relinquish_key(entry->key); + value=entry->value; + entry=(EntryInfo *) RelinquishMagickMemory(entry); + hashmap_info->entries--; + UnlockSemaphoreInfo(hashmap_info->semaphore); + return(value); + } + } + entry=(EntryInfo *) GetNextValueInLinkedList(list_info); + } + } + UnlockSemaphoreInfo(hashmap_info->semaphore); + return((void *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e m o v e L a s t E l e m e n t F r o m L i n k e d L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RemoveLastElementFromLinkedList() removes the last element from the +% linked-list. +% +% The format of the RemoveLastElementFromLinkedList method is: +% +% void *RemoveLastElementFromLinkedList(LinkedListInfo *list_info) +% +% A description of each parameter follows: +% +% o list_info: the linked-list info. +% +*/ +MagickExport void *RemoveLastElementFromLinkedList(LinkedListInfo *list_info) +{ + void + *value; + + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + if (list_info->elements == 0) + return((void *) NULL); + LockSemaphoreInfo(list_info->semaphore); + if (list_info->next == list_info->tail) + list_info->next=(ElementInfo *) NULL; + if (list_info->elements == 1UL) + { + value=list_info->head->value; + list_info->head=(ElementInfo *) NULL; + list_info->tail=(ElementInfo *) RelinquishMagickMemory(list_info->tail); + } + else + { + ElementInfo + *next; + + value=list_info->tail->value; + next=list_info->head; + while (next->next != list_info->tail) + next=next->next; + list_info->tail=(ElementInfo *) RelinquishMagickMemory(list_info->tail); + list_info->tail=next; + next->next=(ElementInfo *) NULL; + } + list_info->elements--; + UnlockSemaphoreInfo(list_info->semaphore); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e s e t H a s h m a p I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ResetHashmapIterator() resets the hash-map iterator. Use it in conjunction +% with GetNextKeyInHashmap() to iterate over all the keys in the hash-map. +% +% The format of the ResetHashmapIterator method is: +% +% ResetHashmapIterator(HashmapInfo *hashmap_info) +% +% A description of each parameter follows: +% +% o hashmap_info: the hashmap info. +% +*/ +MagickExport void ResetHashmapIterator(HashmapInfo *hashmap_info) +{ + assert(hashmap_info != (HashmapInfo *) NULL); + assert(hashmap_info->signature == MagickCoreSignature); + LockSemaphoreInfo(hashmap_info->semaphore); + hashmap_info->next=0; + hashmap_info->head_of_list=MagickFalse; + UnlockSemaphoreInfo(hashmap_info->semaphore); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e s e t L i n k e d L i s t I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ResetLinkedListIterator() resets the lined-list iterator. Use it in +% conjunction with GetNextValueInLinkedList() to iterate over all the values +% in the linked-list. +% +% The format of the ResetLinkedListIterator method is: +% +% ResetLinkedListIterator(LinkedListInfo *list_info) +% +% A description of each parameter follows: +% +% o list_info: the linked-list info. +% +*/ +MagickExport void ResetLinkedListIterator(LinkedListInfo *list_info) +{ + assert(list_info != (LinkedListInfo *) NULL); + assert(list_info->signature == MagickCoreSignature); + LockSemaphoreInfo(list_info->semaphore); + list_info->next=list_info->head; + UnlockSemaphoreInfo(list_info->semaphore); +} diff --git a/ImageMagick-6.9.12-44/magick/hashmap.h b/ImageMagick-6.9.12-44/magick/hashmap.h new file mode 100644 index 0000000..9859ece --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/hashmap.h @@ -0,0 +1,83 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore hash methods. +*/ +#ifndef MAGICKCORE_HASHMAP_H +#define MAGICKCORE_HASHMAP_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define SmallHashmapSize 17 +#define MediumHashmapSize 509 +#define LargeHashmapSize 8191 +#define HugeHashmapSize 131071 + +typedef struct _HashmapInfo + HashmapInfo; + +typedef struct _LinkedListInfo + LinkedListInfo; + +extern MagickExport HashmapInfo + *DestroyHashmap(HashmapInfo *), + *NewHashmap(const size_t,size_t (*)(const void *),MagickBooleanType (*) + (const void *,const void *),void *(*)(void *),void *(*)(void *)); + +extern MagickExport LinkedListInfo + *DestroyLinkedList(LinkedListInfo *,void *(*)(void *)), + *NewLinkedList(const size_t); + +extern MagickExport MagickBooleanType + AppendValueToLinkedList(LinkedListInfo *,const void *), + CompareHashmapString(const void *,const void *), + CompareHashmapStringInfo(const void *,const void *), + InsertValueInLinkedList(LinkedListInfo *,const size_t,const void *), + InsertValueInSortedLinkedList(LinkedListInfo *, + int (*)(const void *,const void *),void **,const void *), + IsHashmapEmpty(const HashmapInfo *), + IsLinkedListEmpty(const LinkedListInfo *), + LinkedListToArray(LinkedListInfo *,void **), + PutEntryInHashmap(HashmapInfo *,const void *,const void *); + +extern MagickExport size_t + GetNumberOfElementsInLinkedList(const LinkedListInfo *), + GetNumberOfEntriesInHashmap(const HashmapInfo *), + HashPointerType(const void *), + HashStringType(const void *), + HashStringInfoType(const void *); + +extern MagickExport void + ClearLinkedList(LinkedListInfo *,void *(*)(void *)), + *GetLastValueInLinkedList(LinkedListInfo *), + *GetNextKeyInHashmap(HashmapInfo *), + *GetNextValueInHashmap(HashmapInfo *), + *GetNextValueInLinkedList(LinkedListInfo *), + *GetValueFromHashmap(HashmapInfo *,const void *), + *GetValueFromLinkedList(LinkedListInfo *,const size_t), + *RemoveElementByValueFromLinkedList(LinkedListInfo *,const void *), + *RemoveElementFromLinkedList(LinkedListInfo *,const size_t), + *RemoveEntryFromHashmap(HashmapInfo *,const void *), + *RemoveLastElementFromLinkedList(LinkedListInfo *), + ResetHashmapIterator(HashmapInfo *), + ResetLinkedListIterator(LinkedListInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/histogram.c b/ImageMagick-6.9.12-44/magick/histogram.c new file mode 100644 index 0000000..518c365 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/histogram.c @@ -0,0 +1,1416 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% H H IIIII SSSSS TTTTT OOO GGGG RRRR AAA M M % +% H H I SS T O O G R R A A MM MM % +% HHHHH I SSS T O O G GG RRRR AAAAA M M M % +% H H I SS T O O G G R R A A M M % +% H H IIIII SSSSS T OOO GGG R R A A M M % +% % +% % +% MagickCore Histogram Methods % +% % +% Software Design % +% Anthony Thyssen % +% Fred Weinhaus % +% August 2009 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/cache-view.h" +#include "magick/color-private.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/hashmap.h" +#include "magick/histogram.h" +#include "magick/image.h" +#include "magick/list.h" +#include "magick/memory_.h" +#include "magick/monitor-private.h" +#include "magick/pixel-private.h" +#include "magick/prepress.h" +#include "magick/quantize.h" +#include "magick/registry.h" +#include "magick/semaphore.h" +#include "magick/splay-tree.h" +#include "magick/statistic.h" +#include "magick/string_.h" + +/* + Define declarations. +*/ +#define MaxTreeDepth 8 +#define NodesInAList 1536 + +/* + Typedef declarations. +*/ +typedef struct _NodeInfo +{ + struct _NodeInfo + *child[16]; + + ColorPacket + *list; + + size_t + extent; + + MagickSizeType + number_unique; + + size_t + level; +} NodeInfo; + +typedef struct _Nodes +{ + NodeInfo + nodes[NodesInAList]; + + struct _Nodes + *next; +} Nodes; + +typedef struct _CubeInfo +{ + NodeInfo + *root; + + ssize_t + x; + + MagickOffsetType + progress; + + size_t + colors, + free_nodes; + + NodeInfo + *node_info; + + Nodes + *node_queue; +} CubeInfo; + +/* + Forward declarations. +*/ +static CubeInfo + *GetCubeInfo(void); + +static NodeInfo + *GetNodeInfo(CubeInfo *,const size_t); + +static void + DestroyColorCube(const Image *,NodeInfo *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C l a s s i f y I m a g e C o l o r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClassifyImageColors() builds a populated CubeInfo tree for the specified +% image. The returned tree should be deallocated using DestroyCubeInfo() +% once it is no longer needed. +% +% The format of the ClassifyImageColors() method is: +% +% CubeInfo *ClassifyImageColors(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline size_t ColorToNodeId(const Image *image, + const MagickPixelPacket *pixel,size_t index) +{ + size_t + id; + + id=(size_t) ( + ((ScaleQuantumToChar(ClampToQuantum(pixel->red)) >> index) & 0x01) | + ((ScaleQuantumToChar(ClampToQuantum(pixel->green)) >> index) & 0x01) << 1 | + ((ScaleQuantumToChar(ClampToQuantum(pixel->blue)) >> index) & 0x01) << 2); + if (image->matte != MagickFalse) + id|=((ScaleQuantumToChar(ClampToQuantum(pixel->opacity)) >> index) & + 0x01) << 3; + return(id); +} + +static inline MagickBooleanType IsMagickColorMatch(const MagickPixelPacket *p, + const MagickPixelPacket *q) +{ + MagickRealType + alpha, + beta; + + alpha=p->matte == MagickFalse ? OpaqueOpacity : p->opacity; + beta=q->matte == MagickFalse ? OpaqueOpacity : q->opacity; + if (AbsolutePixelValue(alpha-beta) >= MagickEpsilon) + return(MagickFalse); + if ((AbsolutePixelValue(alpha-TransparentOpacity) < MagickEpsilon) || + (AbsolutePixelValue(beta-TransparentOpacity) < MagickEpsilon)) + return(MagickTrue); /* no color component if pixel is transparent */ + if (AbsolutePixelValue(p->red-q->red) >= MagickEpsilon) + return(MagickFalse); + if (AbsolutePixelValue(p->green-q->green) >= MagickEpsilon) + return(MagickFalse); + if (AbsolutePixelValue(p->blue-q->blue) >= MagickEpsilon) + return(MagickFalse); + if (p->colorspace == CMYKColorspace) + { + if (AbsolutePixelValue(p->index-q->index) >= MagickEpsilon) + return(MagickFalse); + } + return(MagickTrue); +} + + +static CubeInfo *ClassifyImageColors(const Image *image, + ExceptionInfo *exception) +{ +#define EvaluateImageTag " Compute image colors... " + + CacheView + *image_view; + + CubeInfo + *cube_info; + + MagickBooleanType + proceed; + + MagickPixelPacket + pixel, + target; + + NodeInfo + *node_info; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + size_t + id, + index, + level; + + ssize_t + i, + x; + + ssize_t + y; + + /* + Initialize color description tree. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + cube_info=GetCubeInfo(); + if (cube_info == (CubeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(cube_info); + } + GetMagickPixelPacket(image,&pixel); + GetMagickPixelPacket(image,&target); + image_view=AcquireVirtualCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetCacheViewVirtualIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + /* + Start at the root and proceed level by level. + */ + node_info=cube_info->root; + index=MaxTreeDepth-1; + for (level=1; level < MaxTreeDepth; level++) + { + SetMagickPixelPacket(image,p,indexes+x,&pixel); + id=ColorToNodeId(image,&pixel,index); + if (node_info->child[id] == (NodeInfo *) NULL) + { + node_info->child[id]=GetNodeInfo(cube_info,level); + if (node_info->child[id] == (NodeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + image->filename); + return(0); + } + } + node_info=node_info->child[id]; + index--; + } + for (i=0; i < (ssize_t) node_info->number_unique; i++) + { + SetMagickPixelPacket(image,&node_info->list[i].pixel, + &node_info->list[i].index,&target); + if (IsMagickColorMatch(&pixel,&target) != MagickFalse) + break; + } + if (i < (ssize_t) node_info->number_unique) + node_info->list[i].count++; + else + { + if (node_info->number_unique == 0) + { + node_info->extent=1; + node_info->list=(ColorPacket *) AcquireQuantumMemory( + node_info->extent,sizeof(*node_info->list)); + } + else + if (i >= (ssize_t) node_info->extent) + { + node_info->extent<<=1; + node_info->list=(ColorPacket *) ResizeQuantumMemory( + node_info->list,node_info->extent,sizeof(*node_info->list)); + } + if (node_info->list == (ColorPacket *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + image->filename); + return(0); + } + node_info->list[i].pixel=(*p); + if ((image->colorspace == CMYKColorspace) || + (image->storage_class == PseudoClass)) + node_info->list[i].index=GetPixelIndex(indexes+x); + node_info->list[i].count=1; + node_info->number_unique++; + cube_info->colors++; + } + p++; + } + proceed=SetImageProgress(image,EvaluateImageTag,(MagickOffsetType) y, + image->rows); + if (proceed == MagickFalse) + break; + } + image_view=DestroyCacheView(image_view); + return(cube_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e f i n e I m a g e H i s t o g r a m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DefineImageHistogram() traverses the color cube tree and notes each colormap +% entry. A colormap entry is any node in the color cube tree where the +% of unique colors is not zero. +% +% The format of the DefineImageHistogram method is: +% +% DefineImageHistogram(const Image *image,NodeInfo *node_info, +% ColorPacket **unique_colors) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o node_info: the address of a structure of type NodeInfo which points to a +% node in the color cube tree that is to be pruned. +% +% o histogram: the image histogram. +% +*/ +static void DefineImageHistogram(const Image *image,NodeInfo *node_info, + ColorPacket **histogram) +{ + ssize_t + i; + + size_t + number_children; + + /* + Traverse any children. + */ + number_children=image->matte == MagickFalse ? 8UL : 16UL; + for (i=0; i < (ssize_t) number_children; i++) + if (node_info->child[i] != (NodeInfo *) NULL) + DefineImageHistogram(image,node_info->child[i],histogram); + if (node_info->level == (MaxTreeDepth-1)) + { + ColorPacket + *p; + + p=node_info->list; + for (i=0; i < (ssize_t) node_info->number_unique; i++) + { + (*histogram)->pixel=p->pixel; + (*histogram)->index=p->index; + (*histogram)->count=p->count; + (*histogram)++; + p++; + } + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e s t r o y C u b e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyCubeInfo() deallocates memory associated with a CubeInfo structure. +% +% The format of the DestroyCubeInfo method is: +% +% DestroyCubeInfo(const Image *image,CubeInfo *cube_info) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o cube_info: the address of a structure of type CubeInfo. +% +*/ +static CubeInfo *DestroyCubeInfo(const Image *image,CubeInfo *cube_info) +{ + Nodes + *nodes; + + /* + Release color cube tree storage. + */ + DestroyColorCube(image,cube_info->root); + do + { + nodes=cube_info->node_queue->next; + cube_info->node_queue=(Nodes *) + RelinquishMagickMemory(cube_info->node_queue); + cube_info->node_queue=nodes; + } while (cube_info->node_queue != (Nodes *) NULL); + return((CubeInfo *) RelinquishMagickMemory(cube_info)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e s t r o y C o l o r C u b e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyColorCube() traverses the color cube tree and frees the list of +% unique colors. +% +% The format of the DestroyColorCube method is: +% +% void DestroyColorCube(const Image *image,const NodeInfo *node_info) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o node_info: the address of a structure of type NodeInfo which points to a +% node in the color cube tree that is to be pruned. +% +*/ +static void DestroyColorCube(const Image *image,NodeInfo *node_info) +{ + ssize_t + i; + + size_t + number_children; + + /* + Traverse any children. + */ + number_children=image->matte == MagickFalse ? 8UL : 16UL; + for (i=0; i < (ssize_t) number_children; i++) + if (node_info->child[i] != (NodeInfo *) NULL) + DestroyColorCube(image,node_info->child[i]); + if (node_info->list != (ColorPacket *) NULL) + node_info->list=(ColorPacket *) RelinquishMagickMemory(node_info->list); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t C u b e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetCubeInfo() initializes the CubeInfo data structure. +% +% The format of the GetCubeInfo method is: +% +% cube_info=GetCubeInfo() +% +% A description of each parameter follows. +% +% o cube_info: A pointer to the Cube structure. +% +*/ +static CubeInfo *GetCubeInfo(void) +{ + CubeInfo + *cube_info; + + /* + Initialize tree to describe color cube. + */ + cube_info=(CubeInfo *) AcquireMagickMemory(sizeof(*cube_info)); + if (cube_info == (CubeInfo *) NULL) + return((CubeInfo *) NULL); + (void) memset(cube_info,0,sizeof(*cube_info)); + /* + Initialize root node. + */ + cube_info->root=GetNodeInfo(cube_info,0); + if (cube_info->root == (NodeInfo *) NULL) + return((CubeInfo *) NULL); + return(cube_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e H i s t o g r a m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageHistogram() returns the unique colors in an image. +% +% The format of the GetImageHistogram method is: +% +% size_t GetImageHistogram(const Image *image, +% size_t *number_colors,ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o file: Write a histogram of the color distribution to this file handle. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport ColorPacket *GetImageHistogram(const Image *image, + size_t *number_colors,ExceptionInfo *exception) +{ + ColorPacket + *histogram; + + CubeInfo + *cube_info; + + *number_colors=0; + histogram=(ColorPacket *) NULL; + cube_info=ClassifyImageColors(image,exception); + if (cube_info != (CubeInfo *) NULL) + { + histogram=(ColorPacket *) AcquireQuantumMemory((size_t) + cube_info->colors+1,sizeof(*histogram)); + if (histogram == (ColorPacket *) NULL) + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + else + { + ColorPacket + *root; + + *number_colors=cube_info->colors; + root=histogram; + DefineImageHistogram(image,cube_info->root,&root); + } + } + cube_info=DestroyCubeInfo(image,cube_info); + return(histogram); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t N o d e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetNodeInfo() allocates memory for a new node in the color cube tree and +% presets all fields to zero. +% +% The format of the GetNodeInfo method is: +% +% NodeInfo *GetNodeInfo(CubeInfo *cube_info,const size_t level) +% +% A description of each parameter follows. +% +% o cube_info: A pointer to the CubeInfo structure. +% +% o level: Specifies the level in the storage_class the node resides. +% +*/ +static NodeInfo *GetNodeInfo(CubeInfo *cube_info,const size_t level) +{ + NodeInfo + *node_info; + + if (cube_info->free_nodes == 0) + { + Nodes + *nodes; + + /* + Allocate a new nodes of nodes. + */ + nodes=(Nodes *) AcquireMagickMemory(sizeof(*nodes)); + if (nodes == (Nodes *) NULL) + return((NodeInfo *) NULL); + nodes->next=cube_info->node_queue; + cube_info->node_queue=nodes; + cube_info->node_info=nodes->nodes; + cube_info->free_nodes=NodesInAList; + } + cube_info->free_nodes--; + node_info=cube_info->node_info++; + (void) memset(node_info,0,sizeof(*node_info)); + node_info->level=level; + return(node_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I d e n t i f y P a l e t t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IdentifyPaletteImage() returns MagickTrue if the image has 256 unique colors +% or less. +% +% The format of the IdentifyPaletteImage method is: +% +% MagickBooleanType IdentifyPaletteImage(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType CheckImageColors(const Image *image, + ExceptionInfo *exception,size_t max_colors) +{ + CacheView + *image_view; + + CubeInfo + *cube_info; + + MagickPixelPacket + pixel, + target; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + NodeInfo + *node_info; + + ssize_t + i; + + size_t + id, + index, + level; + + ssize_t + y; + + if (image->storage_class == PseudoClass) + return((image->colors <= max_colors) ? MagickTrue : MagickFalse); + /* + Initialize color description tree. + */ + cube_info=GetCubeInfo(); + if (cube_info == (CubeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(MagickFalse); + } + GetMagickPixelPacket(image,&pixel); + GetMagickPixelPacket(image,&target); + image_view=AcquireVirtualCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetCacheViewVirtualIndexQueue(image_view); + if (indexes == (const IndexPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + /* + Start at the root and proceed level by level. + */ + node_info=cube_info->root; + index=MaxTreeDepth-1; + for (level=1; level < MaxTreeDepth; level++) + { + SetMagickPixelPacket(image,p,indexes+x,&pixel); + id=ColorToNodeId(image,&pixel,index); + if (node_info->child[id] == (NodeInfo *) NULL) + { + node_info->child[id]=GetNodeInfo(cube_info,level); + if (node_info->child[id] == (NodeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + image->filename); + break; + } + } + node_info=node_info->child[id]; + index--; + } + if (level < MaxTreeDepth) + break; + for (i=0; i < (ssize_t) node_info->number_unique; i++) + { + SetMagickPixelPacket(image,&node_info->list[i].pixel, + &node_info->list[i].index,&target); + if (IsMagickColorMatch(&pixel,&target) != MagickFalse) + break; + } + if (i < (ssize_t) node_info->number_unique) + node_info->list[i].count++; + else + { + /* + Add this unique color to the color list. + */ + if (node_info->list == (ColorPacket *) NULL) + node_info->list=(ColorPacket *) AcquireQuantumMemory(1, + sizeof(*node_info->list)); + else + node_info->list=(ColorPacket *) ResizeQuantumMemory(node_info->list, + (size_t) (i+1),sizeof(*node_info->list)); + if (node_info->list == (ColorPacket *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + image->filename); + break; + } + node_info->list[i].pixel=(*p); + if ((image->colorspace == CMYKColorspace) || + (image->storage_class == PseudoClass)) + node_info->list[i].index=GetPixelIndex(indexes+x); + node_info->list[i].count=1; + node_info->number_unique++; + cube_info->colors++; + if (cube_info->colors > max_colors) + break; + } + p++; + } + if (x < (ssize_t) image->columns) + break; + } + image_view=DestroyCacheView(image_view); + cube_info=DestroyCubeInfo(image,cube_info); + return(y < (ssize_t) image->rows ? MagickFalse : MagickTrue); +} + +MagickExport MagickBooleanType IdentifyPaletteImage(const Image *image, + ExceptionInfo *exception) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + return(CheckImageColors(image,exception,256)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s H i s t o g r a m I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsHistogramImage() returns MagickTrue if the image has 1024 unique colors or +% less. +% +% The format of the IsHistogramImage method is: +% +% MagickBooleanType IsHistogramImage(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType IsHistogramImage(const Image *image, + ExceptionInfo *exception) +{ +#define MaximumUniqueColors 1024 + + CacheView + *image_view; + + CubeInfo + *cube_info; + + MagickPixelPacket + pixel, + target; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + NodeInfo + *node_info; + + ssize_t + i; + + size_t + id, + index, + level; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((image->storage_class == PseudoClass) && + (image->colors <= MaximumUniqueColors)) + return(MagickTrue); + if (image->storage_class == PseudoClass) + return(MagickFalse); + /* + Initialize color description tree. + */ + cube_info=GetCubeInfo(); + if (cube_info == (CubeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return(MagickFalse); + } + GetMagickPixelPacket(image,&pixel); + GetMagickPixelPacket(image,&target); + image_view=AcquireVirtualCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetCacheViewVirtualIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + /* + Start at the root and proceed level by level. + */ + node_info=cube_info->root; + index=MaxTreeDepth-1; + for (level=1; level < MaxTreeDepth; level++) + { + SetMagickPixelPacket(image,p,indexes+x,&pixel); + id=ColorToNodeId(image,&pixel,index); + if (node_info->child[id] == (NodeInfo *) NULL) + { + node_info->child[id]=GetNodeInfo(cube_info,level); + if (node_info->child[id] == (NodeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + image->filename); + break; + } + } + node_info=node_info->child[id]; + index--; + } + if (level < MaxTreeDepth) + break; + for (i=0; i < (ssize_t) node_info->number_unique; i++) + { + SetMagickPixelPacket(image,&node_info->list[i].pixel, + &node_info->list[i].index,&target); + if (IsMagickColorMatch(&pixel,&target) != MagickFalse) + break; + } + if (i < (ssize_t) node_info->number_unique) + node_info->list[i].count++; + else + { + /* + Add this unique color to the color list. + */ + if (node_info->number_unique == 0) + node_info->list=(ColorPacket *) AcquireQuantumMemory(1, + sizeof(*node_info->list)); + else + node_info->list=(ColorPacket *) ResizeQuantumMemory(node_info->list, + (size_t) (i+1),sizeof(*node_info->list)); + if (node_info->list == (ColorPacket *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + image->filename); + break; + } + node_info->list[i].pixel=(*p); + if ((image->colorspace == CMYKColorspace) || + (image->storage_class == PseudoClass)) + node_info->list[i].index=GetPixelIndex(indexes+x); + node_info->list[i].count=1; + node_info->number_unique++; + cube_info->colors++; + if (cube_info->colors > MaximumUniqueColors) + break; + } + p++; + } + if (x < (ssize_t) image->columns) + break; + } + image_view=DestroyCacheView(image_view); + cube_info=DestroyCubeInfo(image,cube_info); + return(y < (ssize_t) image->rows ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P a l e t t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPaletteImage() returns MagickTrue if the image is PseudoClass and has 256 +% unique colors or less. +% +% The format of the IsPaletteImage method is: +% +% MagickBooleanType IsPaletteImage(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType IsPaletteImage(const Image *image, + ExceptionInfo *exception) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + magick_unreferenced(exception); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->storage_class != PseudoClass) + return(MagickFalse); + return((image->colors <= 256) ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M i n M a x S t r e t c h I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MinMaxStretchImage() uses the exact minimum and maximum values found in +% each of the channels given, as the BlackPoint and WhitePoint to linearly +% stretch the colors (and histogram) of the image. The stretch points are +% also moved further inward by the adjustment values given. +% +% If the adjustment values are both zero this function is equivalent to a +% perfect normalization (or autolevel) of the image. +% +% Each channel is stretched independantally of each other (producing color +% distortion) unless the special 'SyncChannels' flag is also provided in the +% channels setting. If this flag is present the minimum and maximum point +% will be extracted from all the given channels, and those channels will be +% stretched by exactly the same amount (preventing color distortion). +% +% In the special case that only ONE value is found in a channel of the image +% that value is not stretched, that value is left as is. +% +% The 'SyncChannels' is turned on in the 'DefaultChannels' setting by +% default. +% +% The format of the MinMaxStretchImage method is: +% +% MagickBooleanType MinMaxStretchImage(Image *image, +% const ChannelType channel, const double black_adjust, +% const double white_adjust) +% +% A description of each parameter follows: +% +% o image: The image to auto-level +% +% o channel: The channels to auto-level. If the special 'SyncChannels' +% flag is set, all the given channels are stretched by the same amount. +% +% o black_adjust, white_adjust: Move the Black/White Point inward +% from the minimum and maximum points by this color value. +% +*/ + +MagickExport MagickBooleanType MinMaxStretchImage(Image *image, + const ChannelType channel,const double black_value,const double white_value) +{ + double + min, + max; + + MagickStatusType + status; + + status=MagickTrue; + if ((channel & SyncChannels) != 0) + { + /* + Auto-level all channels equally. + */ + (void) GetImageChannelRange(image,channel,&min,&max,&image->exception); + min+=black_value; + max-=white_value; + if (fabs(min-max) >= MagickEpsilon) + status&=LevelImageChannel(image,channel,min,max,1.0); + return(status != 0 ? MagickTrue : MagickFalse); + } + /* + Auto-level each channel separately. + */ + if ((channel & RedChannel) != 0) + { + (void) GetImageChannelRange(image,RedChannel,&min,&max,&image->exception); + min+=black_value; + max-=white_value; + if (fabs(min-max) >= MagickEpsilon) + status&=LevelImageChannel(image,RedChannel,min,max,1.0); + } + if ((channel & GreenChannel) != 0) + { + (void) GetImageChannelRange(image,GreenChannel,&min,&max, + &image->exception); + min+=black_value; + max-=white_value; + if (fabs(min-max) >= MagickEpsilon) + status&=LevelImageChannel(image,GreenChannel,min,max,1.0); + } + if ((channel & BlueChannel) != 0) + { + (void) GetImageChannelRange(image,BlueChannel,&min,&max, + &image->exception); + min+=black_value; + max-=white_value; + if (fabs(min-max) >= MagickEpsilon) + status&=LevelImageChannel(image,BlueChannel,min,max,1.0); + } + if (((channel & OpacityChannel) != 0) && + (image->matte != MagickFalse)) + { + (void) GetImageChannelRange(image,OpacityChannel,&min,&max, + &image->exception); + min+=black_value; + max-=white_value; + if (fabs(min-max) >= MagickEpsilon) + status&=LevelImageChannel(image,OpacityChannel,min,max,1.0); + } + if (((channel & IndexChannel) != 0) && + (image->colorspace == CMYKColorspace)) + { + (void) GetImageChannelRange(image,IndexChannel,&min,&max, + &image->exception); + min+=black_value; + max-=white_value; + if (fabs(min-max) >= MagickEpsilon) + status&=LevelImageChannel(image,IndexChannel,min,max,1.0); + } + return(status != 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t N u m b e r C o l o r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetNumberColors() returns the number of unique colors in an image. +% +% The format of the GetNumberColors method is: +% +% size_t GetNumberColors(const Image *image,FILE *file, +% ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o file: Write a histogram of the color distribution to this file handle. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static int HistogramCompare(const void *x,const void *y) +{ + const ColorPacket + *color_1, + *color_2; + + color_1=(const ColorPacket *) x; + color_2=(const ColorPacket *) y; + if (color_2->pixel.red != color_1->pixel.red) + return((int) ((ssize_t) color_1->pixel.red-(ssize_t) color_2->pixel.red)); + if (color_2->pixel.green != color_1->pixel.green) + return((int) ((ssize_t) color_1->pixel.green-(ssize_t) color_2->pixel.green)); + if (color_2->pixel.blue != color_1->pixel.blue) + return((int) ((ssize_t) color_1->pixel.blue-(ssize_t) color_2->pixel.blue)); + return((int) ((ssize_t) color_2->count-(ssize_t) color_1->count)); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +MagickExport size_t GetNumberColors(const Image *image,FILE *file, + ExceptionInfo *exception) +{ +#define HistogramImageTag "Histogram/Image" + + char + color[MaxTextExtent], + count[MaxTextExtent], + hex[MaxTextExtent], + tuple[MaxTextExtent]; + + ColorPacket + *histogram; + + MagickBooleanType + status; + + MagickPixelPacket + pixel; + + ColorPacket + *p; + + ssize_t + i; + + size_t + number_colors; + + number_colors=0; + if (file == (FILE *) NULL) + { + CubeInfo + *cube_info; + + cube_info=ClassifyImageColors(image,exception); + if (cube_info != (CubeInfo *) NULL) + number_colors=cube_info->colors; + cube_info=DestroyCubeInfo(image,cube_info); + return(number_colors); + } + histogram=GetImageHistogram(image,&number_colors,exception); + if (histogram == (ColorPacket *) NULL) + return(number_colors); + qsort((void *) histogram,(size_t) number_colors,sizeof(*histogram), + HistogramCompare); + GetMagickPixelPacket(image,&pixel); + p=histogram; + status=MagickTrue; + for (i=0; i < (ssize_t) number_colors; i++) + { + SetMagickPixelPacket(image,&p->pixel,&p->index,&pixel); + (void) CopyMagickString(tuple,"(",MaxTextExtent); + ConcatenateColorComponent(&pixel,RedChannel,NoCompliance,tuple); + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,GreenChannel,NoCompliance,tuple); + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,BlueChannel,NoCompliance,tuple); + if (pixel.colorspace == CMYKColorspace) + { + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,IndexChannel,NoCompliance,tuple); + } + if (pixel.matte != MagickFalse) + { + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,OpacityChannel,NoCompliance,tuple); + } + (void) ConcatenateMagickString(tuple,")",MaxTextExtent); + (void) QueryMagickColorname(image,&pixel,SVGCompliance,color,exception); + GetColorTuple(&pixel,MagickTrue,hex); + (void) sprintf(count,"%.20g:",(double) ((MagickOffsetType) p->count)); + (void) FormatLocaleFile(file," %s %s %s %s\n",count,tuple,hex,color); + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(image,HistogramImageTag,(MagickOffsetType) i, + number_colors); + if (proceed == MagickFalse) + status=MagickFalse; + } + p++; + } + (void) fflush(file); + histogram=(ColorPacket *) RelinquishMagickMemory(histogram); + if (status == MagickFalse) + return(0); + return(number_colors); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n i q u e I m a g e C o l o r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UniqueImageColors() returns the unique colors of an image. +% +% The format of the UniqueImageColors method is: +% +% Image *UniqueImageColors(const Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static void UniqueColorsToImage(Image *unique_image,CacheView *unique_view, + CubeInfo *cube_info,const NodeInfo *node_info,ExceptionInfo *exception) +{ +#define UniqueColorsImageTag "UniqueColors/Image" + + MagickBooleanType + status; + + ssize_t + i; + + size_t + number_children; + + /* + Traverse any children. + */ + number_children=unique_image->matte == MagickFalse ? 8UL : 16UL; + for (i=0; i < (ssize_t) number_children; i++) + if (node_info->child[i] != (NodeInfo *) NULL) + UniqueColorsToImage(unique_image,unique_view,cube_info, + node_info->child[i],exception); + if (node_info->level == (MaxTreeDepth-1)) + { + ColorPacket + *p; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + status=MagickTrue; + p=node_info->list; + for (i=0; i < (ssize_t) node_info->number_unique; i++) + { + q=QueueCacheViewAuthenticPixels(unique_view,cube_info->x,0,1,1, + exception); + if (q == (PixelPacket *) NULL) + continue; + indexes=GetCacheViewAuthenticIndexQueue(unique_view); + *q=p->pixel; + if (unique_image->colorspace == CMYKColorspace) + *indexes=p->index; + if (SyncCacheViewAuthenticPixels(unique_view,exception) == MagickFalse) + break; + cube_info->x++; + p++; + } + if (unique_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(unique_image,UniqueColorsImageTag, + cube_info->progress,cube_info->colors); + if (proceed == MagickFalse) + status=MagickFalse; + } + cube_info->progress++; + if (status == MagickFalse) + return; + } +} + +MagickExport Image *UniqueImageColors(const Image *image, + ExceptionInfo *exception) +{ + CacheView + *unique_view; + + CubeInfo + *cube_info; + + Image + *unique_image; + + cube_info=ClassifyImageColors(image,exception); + if (cube_info == (CubeInfo *) NULL) + return((Image *) NULL); + unique_image=CloneImage(image,cube_info->colors,1,MagickTrue,exception); + if (unique_image == (Image *) NULL) + return(unique_image); + if (SetImageStorageClass(unique_image,DirectClass) == MagickFalse) + { + InheritException(exception,&unique_image->exception); + unique_image=DestroyImage(unique_image); + return((Image *) NULL); + } + unique_view=AcquireVirtualCacheView(unique_image,exception); + UniqueColorsToImage(unique_image,unique_view,cube_info,cube_info->root, + exception); + unique_view=DestroyCacheView(unique_view); + cube_info=DestroyCubeInfo(image,cube_info); + return(unique_image); +} diff --git a/ImageMagick-6.9.12-44/magick/histogram.h b/ImageMagick-6.9.12-44/magick/histogram.h new file mode 100644 index 0000000..8c2adc6 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/histogram.h @@ -0,0 +1,56 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore histogram methods. +*/ +#ifndef MAGICKCORE_HISTOGRAM_H +#define MAGICKCORE_HISTOGRAM_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct _ColorPacket +{ + PixelPacket + pixel; + + IndexPacket + index; + + MagickSizeType + count; +} ColorPacket; + +extern MagickExport ColorPacket + *GetImageHistogram(const Image *,size_t *,ExceptionInfo *); + +extern MagickExport Image + *UniqueImageColors(const Image *,ExceptionInfo *); + +extern MagickExport MagickBooleanType + IdentifyPaletteImage(const Image *,ExceptionInfo *), + IsHistogramImage(const Image *,ExceptionInfo *), + IsPaletteImage(const Image *,ExceptionInfo *), + MinMaxStretchImage(Image *,const ChannelType,const double,const double); + +extern MagickExport size_t + GetNumberColors(const Image *,FILE *,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/identify.c b/ImageMagick-6.9.12-44/magick/identify.c new file mode 100644 index 0000000..a4b479d --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/identify.c @@ -0,0 +1,1462 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% IIIII DDDD EEEEE N N TTTTT IIIII FFFFF Y Y % +% I D D E NN N T I F Y Y % +% I D D EEE N N N T I FFF Y % +% I D D E N NN T I F Y % +% IIIII DDDD EEEEE N N T IIIII F Y % +% % +% % +% Identify an Image Format and Characteristics. % +% % +% Software Design % +% Cristy % +% September 1994 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Identify describes the format and characteristics of one or more image +% files. It will also report if an image is incomplete or corrupt. +% +% +*/ + + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/annotate.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/blob.h" +#include "magick/cache.h" +#include "magick/client.h" +#include "magick/coder.h" +#include "magick/color.h" +#include "magick/configure.h" +#include "magick/constitute.h" +#include "magick/decorate.h" +#include "magick/delegate.h" +#include "magick/draw.h" +#include "magick/effect.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/feature.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/histogram.h" +#include "magick/identify.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/locale_.h" +#include "magick/log.h" +#include "magick/magic.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/montage.h" +#include "magick/option.h" +#include "magick/pixel-private.h" +#include "magick/prepress.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/quantum.h" +#include "magick/random_.h" +#include "magick/registry.h" +#include "magick/resize.h" +#include "magick/resource_.h" +#include "magick/signature.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/timer.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/version.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I d e n t i f y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IdentifyImage() identifies an image by printing its attributes to the file. +% Attributes include the image width, height, size, and others. +% +% The format of the IdentifyImage method is: +% +% MagickBooleanType IdentifyImage(Image *image,FILE *file, +% const MagickBooleanType verbose) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o file: the file, typically stdout. +% +% o verbose: A value other than zero prints more detailed information +% about the image. +% +*/ + +static ChannelStatistics *GetLocationStatistics(const Image *image, + const StatisticType type,ExceptionInfo *exception) +{ + ChannelStatistics + *channel_statistics; + + ssize_t + i; + + size_t + length; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + length=CompositeChannels+1UL; + channel_statistics=(ChannelStatistics *) AcquireQuantumMemory(length, + sizeof(*channel_statistics)); + if (channel_statistics == (ChannelStatistics *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(channel_statistics,0,length* + sizeof(*channel_statistics)); + for (i=0; i <= (ssize_t) CompositeChannels; i++) + { + switch (type) + { + case MaximumStatistic: + default: + { + channel_statistics[i].maxima=(-MagickMaximumValue); + break; + } + case MinimumStatistic: + { + channel_statistics[i].minima=MagickMaximumValue; + break; + } + } + } + for (y=0; y < (ssize_t) image->rows; y++) + { + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + switch (type) + { + case MaximumStatistic: + default: + { + if ((double) GetPixelRed(p) > channel_statistics[RedChannel].maxima) + channel_statistics[RedChannel].maxima=(double) GetPixelRed(p); + if ((double) GetPixelGreen(p) > channel_statistics[GreenChannel].maxima) + channel_statistics[GreenChannel].maxima=(double) GetPixelGreen(p); + if ((double) GetPixelBlue(p) > channel_statistics[BlueChannel].maxima) + channel_statistics[BlueChannel].maxima=(double) GetPixelBlue(p); + if ((image->matte != MagickFalse) && + ((double) GetPixelOpacity(p) > channel_statistics[OpacityChannel].maxima)) + channel_statistics[OpacityChannel].maxima=(double) + GetPixelOpacity(p); + if ((image->colorspace == CMYKColorspace) && + ((double) GetPixelIndex(indexes+x) > channel_statistics[BlackChannel].maxima)) + channel_statistics[BlackChannel].maxima=(double) + GetPixelIndex(indexes+x); + break; + } + case MinimumStatistic: + { + if ((double) GetPixelRed(p) < channel_statistics[RedChannel].minima) + channel_statistics[RedChannel].minima=(double) GetPixelRed(p); + if ((double) GetPixelGreen(p) < channel_statistics[GreenChannel].minima) + channel_statistics[GreenChannel].minima=(double) GetPixelGreen(p); + if ((double) GetPixelBlue(p) < channel_statistics[BlueChannel].minima) + channel_statistics[BlueChannel].minima=(double) GetPixelBlue(p); + if ((image->matte != MagickFalse) && + ((double) GetPixelOpacity(p) < channel_statistics[OpacityChannel].minima)) + channel_statistics[OpacityChannel].minima=(double) + GetPixelOpacity(p); + if ((image->colorspace == CMYKColorspace) && + ((double) GetPixelIndex(indexes+x) < channel_statistics[BlackChannel].minima)) + channel_statistics[BlackChannel].minima=(double) + GetPixelIndex(indexes+x); + break; + } + } + p++; + } + } + return(channel_statistics); +} + +static ssize_t PrintChannelFeatures(FILE *file,const ChannelType channel, + const char *name,const ChannelFeatures *channel_features) +{ +#define PrintFeature(feature) \ + GetMagickPrecision(),(feature)[0], \ + GetMagickPrecision(),(feature)[1], \ + GetMagickPrecision(),(feature)[2], \ + GetMagickPrecision(),(feature)[3], \ + GetMagickPrecision(),((feature)[0]+(feature)[1]+(feature)[2]+(feature)[3])/4.0 \ + +#define FeaturesFormat " %s:\n" \ + " Angular Second Moment:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Contrast:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Correlation:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Sum of Squares Variance:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Inverse Difference Moment:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Sum Average:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Sum Variance:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Sum Entropy:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Entropy:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Difference Variance:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Difference Entropy:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Information Measure of Correlation 1:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Information Measure of Correlation 2:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" \ + " Maximum Correlation Coefficient:\n" \ + " %.*g, %.*g, %.*g, %.*g, %.*g\n" + + ssize_t + n; + + n=FormatLocaleFile(file,FeaturesFormat,name, + PrintFeature(channel_features[channel].angular_second_moment), + PrintFeature(channel_features[channel].contrast), + PrintFeature(channel_features[channel].correlation), + PrintFeature(channel_features[channel].variance_sum_of_squares), + PrintFeature(channel_features[channel].inverse_difference_moment), + PrintFeature(channel_features[channel].sum_average), + PrintFeature(channel_features[channel].sum_variance), + PrintFeature(channel_features[channel].sum_entropy), + PrintFeature(channel_features[channel].entropy), + PrintFeature(channel_features[channel].difference_variance), + PrintFeature(channel_features[channel].difference_entropy), + PrintFeature(channel_features[channel].measure_of_correlation_1), + PrintFeature(channel_features[channel].measure_of_correlation_2), + PrintFeature(channel_features[channel].maximum_correlation_coefficient)); + return(n); +} + +static ssize_t PrintChannelLocations(FILE *file,const Image *image, + const ChannelType channel,const char *name,const StatisticType type, + const size_t max_locations,const ChannelStatistics *channel_statistics) +{ + double + target; + + ExceptionInfo + *exception; + + ssize_t + n, + y; + + switch (type) + { + case MaximumStatistic: + default: + { + target=channel_statistics[channel].maxima; + break; + } + case MeanStatistic: + { + target=channel_statistics[channel].mean; + break; + } + case MinimumStatistic: + { + target=channel_statistics[channel].minima; + break; + } + } + (void) FormatLocaleFile(file," %s: %.*g (%.*g)",name,GetMagickPrecision(), + target,GetMagickPrecision(),QuantumScale*target); + exception=AcquireExceptionInfo(); + n=0; + for (y=0; y < (ssize_t) image->rows; y++) + { + const PixelPacket + *p; + + ssize_t + x; + + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + MagickBooleanType + match; + + match=MagickFalse; + switch (channel) + { + case RedChannel: + { + match=fabs((double) (p->red-target)) < 0.5 ? MagickTrue : MagickFalse; + break; + } + case GreenChannel: + { + match=fabs((double) (p->green-target)) < 0.5 ? MagickTrue : + MagickFalse; + break; + } + case BlueChannel: + { + match=fabs((double) (p->blue-target)) < 0.5 ? MagickTrue : + MagickFalse; + break; + } + case AlphaChannel: + { + match=fabs((double) (p->opacity-target)) < 0.5 ? MagickTrue : + MagickFalse; + break; + } + default: + break; + } + if (match != MagickFalse) + { + if ((max_locations != 0) && (n >= (ssize_t) max_locations)) + break; + (void) FormatLocaleFile(file," %.20g,%.20g",(double) x,(double) y); + n++; + } + p++; + } + if (x < (ssize_t) image->columns) + break; + } + (void) FormatLocaleFile(file,"\n"); + return(n); +} + +static ssize_t PrintChannelMoments(FILE *file,const ChannelType channel, + const char *name,const double scale,const ChannelMoments *channel_moments) +{ + double + powers[MaximumNumberOfImageMoments] = + { 1.0, 2.0, 3.0, 3.0, 6.0, 4.0, 6.0, 4.0 }; + + ssize_t + i; + + ssize_t + n; + + n=FormatLocaleFile(file," %s:\n",name); + n+=FormatLocaleFile(file," Centroid: %.*g,%.*g\n", + GetMagickPrecision(),channel_moments[channel].centroid.x, + GetMagickPrecision(),channel_moments[channel].centroid.y); + n+=FormatLocaleFile(file," Ellipse Semi-Major/Minor axis: %.*g,%.*g\n", + GetMagickPrecision(),channel_moments[channel].ellipse_axis.x, + GetMagickPrecision(),channel_moments[channel].ellipse_axis.y); + n+=FormatLocaleFile(file," Ellipse angle: %.*g\n", + GetMagickPrecision(),channel_moments[channel].ellipse_angle); + n+=FormatLocaleFile(file," Ellipse eccentricity: %.*g\n", + GetMagickPrecision(),channel_moments[channel].ellipse_eccentricity); + n+=FormatLocaleFile(file," Ellipse intensity: %.*g (%.*g)\n", + GetMagickPrecision(),pow(scale,powers[0])* + channel_moments[channel].ellipse_intensity,GetMagickPrecision(), + channel_moments[channel].ellipse_intensity); + for (i=0; i < MaximumNumberOfImageMoments; i++) + n+=FormatLocaleFile(file," I%.20g: %.*g (%.*g)\n",i+1.0, + GetMagickPrecision(),channel_moments[channel].I[i]/pow(scale,powers[i]), + GetMagickPrecision(),channel_moments[channel].I[i]); + return(n); +} + +static ssize_t PrintChannelPerceptualHash(FILE *file,const ChannelType channel, + const char *name,const ChannelPerceptualHash *channel_phash) +{ + ssize_t + i; + + ssize_t + n; + + n=FormatLocaleFile(file," %s:\n",name); + for (i=0; i < MaximumNumberOfPerceptualHashes; i++) + n+=FormatLocaleFile(file," PH%.20g: %.*g, %.*g\n",i+1.0, + GetMagickPrecision(),channel_phash[channel].P[i], + GetMagickPrecision(),channel_phash[channel].Q[i]); + return(n); +} + +static ssize_t PrintChannelStatistics(FILE *file,const ChannelType channel, + const char *name,const double scale, + const ChannelStatistics *channel_statistics) +{ +#define StatisticsFormat " %s:\n min: %.*g (%.*g)\n " \ + "max: %.*g (%.*g)\n mean: %.*g (%.*g)\n " \ + "standard deviation: %.*g (%.*g)\n kurtosis: %.*g\n " \ + "skewness: %.*g\n entropy: %.*g\n" + + ssize_t + n; + + n=FormatLocaleFile(file,StatisticsFormat,name,GetMagickPrecision(), + (double) ClampToQuantum((MagickRealType) (scale* + channel_statistics[channel].minima)),GetMagickPrecision(), + channel_statistics[channel].minima/(double) QuantumRange, + GetMagickPrecision(),(double) ClampToQuantum((MagickRealType) (scale* + channel_statistics[channel].maxima)),GetMagickPrecision(), + channel_statistics[channel].maxima/(double) QuantumRange, + GetMagickPrecision(),scale*channel_statistics[channel].mean, + GetMagickPrecision(),channel_statistics[channel].mean/(double) QuantumRange, + GetMagickPrecision(),scale*channel_statistics[channel].standard_deviation, + GetMagickPrecision(),channel_statistics[channel].standard_deviation/ + (double) QuantumRange,GetMagickPrecision(), + channel_statistics[channel].kurtosis,GetMagickPrecision(), + channel_statistics[channel].skewness,GetMagickPrecision(), + channel_statistics[channel].entropy); + return(n); +} + +MagickExport MagickBooleanType IdentifyImage(Image *image,FILE *file, + const MagickBooleanType verbose) +{ + char + color[MaxTextExtent], + format[MaxTextExtent], + key[MaxTextExtent]; + + ChannelFeatures + *channel_features; + + ChannelMoments + *channel_moments; + + ChannelPerceptualHash + *channel_phash; + + ChannelStatistics + *channel_statistics; + + ColorspaceType + colorspace; + + const char + *artifact, + *locate, + *name, + *property, + *registry, + *value; + + const MagickInfo + *magick_info; + + const PixelPacket + *pixels; + + double + elapsed_time, + scale, + user_time; + + ExceptionInfo + *exception; + + ImageType + type; + + MagickBooleanType + ping; + + ssize_t + i, + x; + + size_t + depth, + distance; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (file == (FILE *) NULL) + file=stdout; + exception=AcquireExceptionInfo(); + colorspace=image->colorspace; + locate=GetImageArtifact(image,"identify:locate"); + if (locate != (const char *) NULL) + { + const char + *limit; + + size_t + max_locations; + + StatisticType + statistic_type; + + /* + Display minimum, maximum, or mean pixel locations. + */ + statistic_type=(StatisticType) ParseCommandOption(MagickStatisticOptions, + MagickFalse,locate); + limit=GetImageArtifact(image,"identify:limit"); + max_locations=0; + if (limit != (const char *) NULL) + max_locations=StringToUnsignedLong(limit); + channel_statistics=GetLocationStatistics(image,statistic_type,exception); + if (channel_statistics == (ChannelStatistics *) NULL) + return(MagickFalse); + (void) FormatLocaleFile(file," Channel %s locations:\n",locate); + switch (colorspace) + { + case RGBColorspace: + default: + { + (void) PrintChannelLocations(file,image,RedChannel,"Red", + statistic_type,max_locations,channel_statistics); + (void) PrintChannelLocations(file,image,GreenChannel,"Green", + statistic_type,max_locations,channel_statistics); + (void) PrintChannelLocations(file,image,BlueChannel,"Blue", + statistic_type,max_locations,channel_statistics); + break; + } + case CMYKColorspace: + { + (void) PrintChannelLocations(file,image,CyanChannel,"Cyan", + statistic_type,max_locations,channel_statistics); + (void) PrintChannelLocations(file,image,MagentaChannel,"Magenta", + statistic_type,max_locations,channel_statistics); + (void) PrintChannelLocations(file,image,YellowChannel,"Yellow", + statistic_type,max_locations,channel_statistics); + (void) PrintChannelLocations(file,image,BlackChannel,"Black", + statistic_type,max_locations,channel_statistics); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) PrintChannelLocations(file,image,GrayChannel,"Gray", + statistic_type,max_locations,channel_statistics); + break; + } + } + if (image->matte != MagickFalse) + (void) PrintChannelLocations(file,image,AlphaChannel,"Alpha", + statistic_type,max_locations,channel_statistics); + channel_statistics=(ChannelStatistics *) RelinquishMagickMemory( + channel_statistics); + exception=DestroyExceptionInfo(exception); + return(ferror(file) != 0 ? MagickFalse : MagickTrue); + } + *format='\0'; + elapsed_time=GetElapsedTime(&image->timer); + user_time=GetUserTime(&image->timer); + GetTimerInfo(&image->timer); + if (verbose == MagickFalse) + { + /* + Display summary info about the image. + */ + if (*image->magick_filename != '\0') + if (LocaleCompare(image->magick_filename,image->filename) != 0) + (void) FormatLocaleFile(file,"%s=>",image->magick_filename); + if ((GetPreviousImageInList(image) == (Image *) NULL) && + (GetNextImageInList(image) == (Image *) NULL) && (image->scene == 0)) + (void) FormatLocaleFile(file,"%s ",image->filename); + else + (void) FormatLocaleFile(file,"%s[%.20g] ",image->filename,(double) + image->scene); + (void) FormatLocaleFile(file,"%s ",image->magick); + if ((image->magick_columns != 0) || (image->magick_rows != 0)) + if ((image->magick_columns != image->columns) || + (image->magick_rows != image->rows)) + (void) FormatLocaleFile(file,"%.20gx%.20g=>",(double) + image->magick_columns,(double) image->magick_rows); + (void) FormatLocaleFile(file,"%.20gx%.20g ",(double) image->columns, + (double) image->rows); + if ((image->page.width != 0) || (image->page.height != 0) || + (image->page.x != 0) || (image->page.y != 0)) + (void) FormatLocaleFile(file,"%.20gx%.20g%+.20g%+.20g ",(double) + image->page.width,(double) image->page.height,(double) image->page.x, + (double) image->page.y); + (void) FormatLocaleFile(file,"%.20g-bit ",(double) image->depth); + if (image->type != UndefinedType) + (void) FormatLocaleFile(file,"%s ",CommandOptionToMnemonic( + MagickTypeOptions,(ssize_t) image->type)); + if (colorspace != UndefinedColorspace) + (void) FormatLocaleFile(file,"%s ",CommandOptionToMnemonic( + MagickColorspaceOptions,(ssize_t) colorspace)); + if (image->storage_class == DirectClass) + { + if (image->total_colors != 0) + { + (void) FormatMagickSize(image->total_colors,MagickFalse,format); + (void) FormatLocaleFile(file,"%s ",format); + } + } + else + if (image->total_colors <= image->colors) + (void) FormatLocaleFile(file,"%.20gc ",(double) image->colors); + else + (void) FormatLocaleFile(file,"%.20g=>%.20gc ",(double) + image->total_colors,(double) image->colors); + if (image->error.mean_error_per_pixel != 0.0) + (void) FormatLocaleFile(file,"%.20g/%f/%fdb ",(double) + (image->error.mean_error_per_pixel+0.5), + image->error.normalized_mean_error, + image->error.normalized_maximum_error); + if (image->extent != 0) + { + (void) FormatMagickSize(image->extent,MagickTrue,format); + (void) FormatLocaleFile(file,"%s ",format); + } + (void) FormatLocaleFile(file,"%0.3fu %lu:%02lu.%03lu",user_time, + (unsigned long) (elapsed_time/60.0),(unsigned long) floor(fmod( + elapsed_time,60.0)),(unsigned long) (1000.0*(elapsed_time- + floor(elapsed_time)))); + (void) FormatLocaleFile(file,"\n"); + (void) fflush(file); + exception=DestroyExceptionInfo(exception); + return(ferror(file) != 0 ? MagickFalse : MagickTrue); + } + /* + Display verbose info about the image. + */ + pixels=GetVirtualPixels(image,0,0,1,1,exception); + exception=DestroyExceptionInfo(exception); + ping=pixels == (const PixelPacket *) NULL ? MagickTrue : MagickFalse; + exception=(&image->exception); + (void) SignatureImage(image); + channel_statistics=(ChannelStatistics *) NULL; + channel_moments=(ChannelMoments *) NULL; + channel_phash=(ChannelPerceptualHash *) NULL; + channel_features=(ChannelFeatures *) NULL; + depth=0; + if (ping == MagickFalse) + { + depth=GetImageDepth(image,exception); + channel_statistics=GetImageChannelStatistics(image,exception); + if (channel_statistics == (ChannelStatistics *) NULL) + return(MagickFalse); + artifact=GetImageArtifact(image,"identify:moments"); + if (artifact != (const char *) NULL) + { + channel_moments=GetImageChannelMoments(image,exception); + channel_phash=GetImageChannelPerceptualHash(image,exception); + } + artifact=GetImageArtifact(image,"identify:features"); + if (artifact != (const char *) NULL) + { + distance=StringToUnsignedLong(artifact); + channel_features=GetImageChannelFeatures(image,distance,exception); + } + } + (void) FormatLocaleFile(file,"Image:\n Filename: %s\n",image->filename); + if (*image->magick_filename != '\0') + if (LocaleCompare(image->magick_filename,image->filename) != 0) + { + char + filename[MaxTextExtent]; + + GetPathComponent(image->magick_filename,TailPath,filename); + (void) FormatLocaleFile(file," Base filename: %s\n",filename); + } + magick_info=GetMagickInfo(image->magick,exception); + if ((magick_info == (const MagickInfo *) NULL) || + (GetMagickDescription(magick_info) == (const char *) NULL)) + (void) FormatLocaleFile(file," Format: %s\n",image->magick); + else + (void) FormatLocaleFile(file," Format: %s (%s)\n",image->magick, + GetMagickDescription(magick_info)); + if ((magick_info != (const MagickInfo *) NULL) && + (GetMagickMimeType(magick_info) != (const char *) NULL)) + (void) FormatLocaleFile(file," Mime type: %s\n",GetMagickMimeType( + magick_info)); + (void) FormatLocaleFile(file," Class: %s\n",CommandOptionToMnemonic( + MagickClassOptions,(ssize_t) image->storage_class)); + (void) FormatLocaleFile(file," Geometry: %.20gx%.20g%+.20g%+.20g\n",(double) + image->columns,(double) image->rows,(double) image->tile_offset.x,(double) + image->tile_offset.y); + if ((image->magick_columns != 0) || (image->magick_rows != 0)) + if ((image->magick_columns != image->columns) || + (image->magick_rows != image->rows)) + (void) FormatLocaleFile(file," Base geometry: %.20gx%.20g\n",(double) + image->magick_columns,(double) image->magick_rows); + if ((image->x_resolution != 0.0) && (image->y_resolution != 0.0)) + { + (void) FormatLocaleFile(file," Resolution: %gx%g\n",image->x_resolution, + image->y_resolution); + (void) FormatLocaleFile(file," Print size: %gx%g\n",(double) + image->columns/image->x_resolution,(double) image->rows/ + image->y_resolution); + } + (void) FormatLocaleFile(file," Units: %s\n",CommandOptionToMnemonic( + MagickResolutionOptions,(ssize_t) image->units)); + (void) FormatLocaleFile(file," Colorspace: %s\n",CommandOptionToMnemonic( + MagickColorspaceOptions,(ssize_t) colorspace)); + type=IdentifyImageType(image,exception); + (void) FormatLocaleFile(file," Type: %s\n",CommandOptionToMnemonic( + MagickTypeOptions,(ssize_t) type)); + if (image->type != type) + (void) FormatLocaleFile(file," Base type: %s\n",CommandOptionToMnemonic( + MagickTypeOptions,(ssize_t) image->type)); + (void) FormatLocaleFile(file," Endianness: %s\n",CommandOptionToMnemonic( + MagickEndianOptions,(ssize_t) image->endian)); + if (depth != 0) + { + if (image->depth == depth) + (void) FormatLocaleFile(file," Depth: %.20g-bit\n",(double) + image->depth); + else + (void) FormatLocaleFile(file," Depth: %.20g/%.20g-bit\n",(double) + image->depth,(double) depth); + } + if (channel_statistics != (ChannelStatistics *) NULL) + { + /* + Detail channel depth and extrema. + */ + (void) FormatLocaleFile(file," Channel depth:\n"); + switch (colorspace) + { + case RGBColorspace: + default: + { + (void) FormatLocaleFile(file," red: %.20g-bit\n",(double) + channel_statistics[RedChannel].depth); + (void) FormatLocaleFile(file," green: %.20g-bit\n",(double) + channel_statistics[GreenChannel].depth); + (void) FormatLocaleFile(file," blue: %.20g-bit\n",(double) + channel_statistics[BlueChannel].depth); + break; + } + case CMYKColorspace: + { + (void) FormatLocaleFile(file," cyan: %.20g-bit\n",(double) + channel_statistics[CyanChannel].depth); + (void) FormatLocaleFile(file," magenta: %.20g-bit\n",(double) + channel_statistics[MagentaChannel].depth); + (void) FormatLocaleFile(file," yellow: %.20g-bit\n",(double) + channel_statistics[YellowChannel].depth); + (void) FormatLocaleFile(file," black: %.20g-bit\n",(double) + channel_statistics[BlackChannel].depth); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) FormatLocaleFile(file," gray: %.20g-bit\n",(double) + channel_statistics[GrayChannel].depth); + break; + } + } + if (image->matte != MagickFalse) + (void) FormatLocaleFile(file," alpha: %.20g-bit\n",(double) + channel_statistics[OpacityChannel].depth); + scale=1.0; + if (image->depth <= MAGICKCORE_QUANTUM_DEPTH) + scale=(double) QuantumRange/((size_t) QuantumRange >> ((size_t) + MAGICKCORE_QUANTUM_DEPTH-image->depth)); + (void) FormatLocaleFile(file," Channel statistics:\n"); + (void) FormatLocaleFile(file," Pixels: %.20g\n",(double) + image->columns*image->rows); + switch (colorspace) + { + case RGBColorspace: + default: + { + (void) PrintChannelStatistics(file,RedChannel,"Red",1.0/scale, + channel_statistics); + (void) PrintChannelStatistics(file,GreenChannel,"Green",1.0/scale, + channel_statistics); + (void) PrintChannelStatistics(file,BlueChannel,"Blue",1.0/scale, + channel_statistics); + break; + } + case CMYKColorspace: + { + (void) PrintChannelStatistics(file,CyanChannel,"Cyan",1.0/scale, + channel_statistics); + (void) PrintChannelStatistics(file,MagentaChannel,"Magenta",1.0/scale, + channel_statistics); + (void) PrintChannelStatistics(file,YellowChannel,"Yellow",1.0/scale, + channel_statistics); + (void) PrintChannelStatistics(file,BlackChannel,"Black",1.0/scale, + channel_statistics); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) PrintChannelStatistics(file,GrayChannel,"Gray",1.0/scale, + channel_statistics); + break; + } + } + if (image->matte != MagickFalse) + (void) PrintChannelStatistics(file,AlphaChannel,"Alpha",1.0/scale, + channel_statistics); + if ((colorspace != LinearGRAYColorspace) && (colorspace != GRAYColorspace)) + { + (void) FormatLocaleFile(file," Image statistics:\n"); + (void) PrintChannelStatistics(file,CompositeChannels,"Overall",1.0/ + scale,channel_statistics); + } + channel_statistics=(ChannelStatistics *) RelinquishMagickMemory( + channel_statistics); + } + if (channel_moments != (ChannelMoments *) NULL) + { + scale=(double) ((1UL << image->depth)-1); + (void) FormatLocaleFile(file," Channel moments:\n"); + switch (colorspace) + { + case RGBColorspace: + default: + { + (void) PrintChannelMoments(file,RedChannel,"Red",scale, + channel_moments); + (void) PrintChannelMoments(file,GreenChannel,"Green",scale, + channel_moments); + (void) PrintChannelMoments(file,BlueChannel,"Blue",scale, + channel_moments); + break; + } + case CMYKColorspace: + { + (void) PrintChannelMoments(file,CyanChannel,"Cyan",scale, + channel_moments); + (void) PrintChannelMoments(file,MagentaChannel,"Magenta",scale, + channel_moments); + (void) PrintChannelMoments(file,YellowChannel,"Yellow",scale, + channel_moments); + (void) PrintChannelMoments(file,BlackChannel,"Black",scale, + channel_moments); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) PrintChannelMoments(file,GrayChannel,"Gray",scale, + channel_moments); + break; + } + } + if (image->matte != MagickFalse) + (void) PrintChannelMoments(file,AlphaChannel,"Alpha",scale, + channel_moments); + if ((colorspace != LinearGRAYColorspace) && (colorspace != GRAYColorspace)) + { + (void) FormatLocaleFile(file," Image moments:\n"); + (void) PrintChannelMoments(file,CompositeChannels,"Overall",scale, + channel_moments); + } + channel_moments=(ChannelMoments *) RelinquishMagickMemory( + channel_moments); + } + if (channel_phash != (ChannelPerceptualHash *) NULL) + { + (void) FormatLocaleFile(file," Channel perceptual hash:\n"); + (void) PrintChannelPerceptualHash(file,RedChannel,"Red, Hue", + channel_phash); + (void) PrintChannelPerceptualHash(file,GreenChannel,"Green, Chroma", + channel_phash); + (void) PrintChannelPerceptualHash(file,BlueChannel,"Blue, Luma", + channel_phash); + if (image->matte != MagickFalse) + (void) PrintChannelPerceptualHash(file,AlphaChannel,"Alpha, Alpha", + channel_phash); + channel_phash=(ChannelPerceptualHash *) RelinquishMagickMemory( + channel_phash); + } + if (channel_features != (ChannelFeatures *) NULL) + { + (void) FormatLocaleFile(file," Channel features (horizontal, vertical, " + "left and right diagonals, average):\n"); + switch (colorspace) + { + case RGBColorspace: + default: + { + (void) PrintChannelFeatures(file,RedChannel,"Red",channel_features); + (void) PrintChannelFeatures(file,GreenChannel,"Green", + channel_features); + (void) PrintChannelFeatures(file,BlueChannel,"Blue",channel_features); + break; + } + case CMYKColorspace: + { + (void) PrintChannelFeatures(file,CyanChannel,"Cyan",channel_features); + (void) PrintChannelFeatures(file,MagentaChannel,"Magenta", + channel_features); + (void) PrintChannelFeatures(file,YellowChannel,"Yellow", + channel_features); + (void) PrintChannelFeatures(file,BlackChannel,"Black", + channel_features); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) PrintChannelFeatures(file,GrayChannel,"Gray",channel_features); + break; + } + } + if (image->matte != MagickFalse) + (void) PrintChannelFeatures(file,AlphaChannel,"Alpha",channel_features); + channel_features=(ChannelFeatures *) RelinquishMagickMemory( + channel_features); + } + if (ping == MagickFalse) + { + if (colorspace == CMYKColorspace) + (void) FormatLocaleFile(file," Total ink density: %.*g%%\n", + GetMagickPrecision(),100.0*GetImageTotalInkDensity(image)/(double) + QuantumRange); + x=0; + if (image->matte != MagickFalse) + { + MagickBooleanType + found = MagickFalse; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + p=(PixelPacket *) NULL; + indexes=(IndexPacket *) NULL; + for (y=0; y < (ssize_t) image->rows; y++) + { + p=GetVirtualPixels(image,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + break; + indexes=GetVirtualIndexQueue(image); + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelOpacity(p) == (Quantum) TransparentOpacity) + { + found=MagickTrue; + break; + } + p++; + } + if (found != MagickFalse) + break; + } + if (found != MagickFalse) + { + char + tuple[MaxTextExtent]; + + MagickPixelPacket + pixel; + + GetMagickPixelPacket(image,&pixel); + SetMagickPixelPacket(image,p,indexes+x,&pixel); + (void) QueryMagickColorname(image,&pixel,SVGCompliance,tuple, + exception); + (void) FormatLocaleFile(file," Alpha: %s ",tuple); + GetColorTuple(&pixel,MagickTrue,tuple); + (void) FormatLocaleFile(file," %s\n",tuple); + } + } + artifact=GetImageArtifact(image,"identify:unique-colors"); + if (IsHistogramImage(image,exception) != MagickFalse) + { + (void) FormatLocaleFile(file," Colors: %.20g\n",(double) + GetNumberColors(image,(FILE *) NULL,exception)); + (void) FormatLocaleFile(file," Histogram:\n"); + (void) GetNumberColors(image,file,exception); + } + else + if ((artifact != (const char *) NULL) && + (IsMagickTrue(artifact) != MagickFalse)) + (void) FormatLocaleFile(file," Colors: %.20g\n",(double) + GetNumberColors(image,(FILE *) NULL,exception)); + } + if (image->storage_class == PseudoClass) + { + (void) FormatLocaleFile(file," Colormap entries: %.20g\n",(double) + image->colors); + (void) FormatLocaleFile(file," Colormap:\n"); + if (image->colors <= 1024) + { + char + color[MaxTextExtent], + hex[MaxTextExtent], + tuple[MaxTextExtent]; + + MagickPixelPacket + pixel; + + PixelPacket + *magick_restrict p; + + GetMagickPixelPacket(image,&pixel); + p=image->colormap; + for (i=0; i < (ssize_t) image->colors; i++) + { + SetMagickPixelPacket(image,p,(IndexPacket *) NULL,&pixel); + (void) CopyMagickString(tuple,"(",MaxTextExtent); + ConcatenateColorComponent(&pixel,RedChannel,X11Compliance,tuple); + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,GreenChannel,X11Compliance,tuple); + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,BlueChannel,X11Compliance,tuple); + if (pixel.colorspace == CMYKColorspace) + { + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,IndexChannel,X11Compliance, + tuple); + } + if (pixel.matte != MagickFalse) + { + (void) ConcatenateMagickString(tuple,",",MaxTextExtent); + ConcatenateColorComponent(&pixel,AlphaChannel,X11Compliance, + tuple); + } + (void) ConcatenateMagickString(tuple,")",MaxTextExtent); + (void) QueryMagickColorname(image,&pixel,SVGCompliance,color, + exception); + GetColorTuple(&pixel,MagickTrue,hex); + (void) FormatLocaleFile(file," %g: %s %s %s\n",(double) i,tuple, + hex,color); + p++; + } + } + } + if (image->error.mean_error_per_pixel != 0.0) + (void) FormatLocaleFile(file," Mean error per pixel: %g\n", + image->error.mean_error_per_pixel); + if (image->error.normalized_mean_error != 0.0) + (void) FormatLocaleFile(file," Normalized mean error: %g\n", + image->error.normalized_mean_error); + if (image->error.normalized_maximum_error != 0.0) + (void) FormatLocaleFile(file," Normalized maximum error: %g\n", + image->error.normalized_maximum_error); + (void) FormatLocaleFile(file," Rendering intent: %s\n", + CommandOptionToMnemonic(MagickIntentOptions,(ssize_t) + image->rendering_intent)); + if (image->gamma != 0.0) + (void) FormatLocaleFile(file," Gamma: %g\n",image->gamma); + if ((image->chromaticity.red_primary.x != 0.0) || + (image->chromaticity.green_primary.x != 0.0) || + (image->chromaticity.blue_primary.x != 0.0) || + (image->chromaticity.white_point.x != 0.0)) + { + /* + Display image chromaticity. + */ + (void) FormatLocaleFile(file," Chromaticity:\n"); + (void) FormatLocaleFile(file," red primary: (%g,%g)\n", + image->chromaticity.red_primary.x,image->chromaticity.red_primary.y); + (void) FormatLocaleFile(file," green primary: (%g,%g)\n", + image->chromaticity.green_primary.x, + image->chromaticity.green_primary.y); + (void) FormatLocaleFile(file," blue primary: (%g,%g)\n", + image->chromaticity.blue_primary.x,image->chromaticity.blue_primary.y); + (void) FormatLocaleFile(file," white point: (%g,%g)\n", + image->chromaticity.white_point.x,image->chromaticity.white_point.y); + } + if ((image->extract_info.width*image->extract_info.height) != 0) + (void) FormatLocaleFile(file," Tile geometry: %.20gx%.20g%+.20g%+.20g\n", + (double) image->extract_info.width,(double) image->extract_info.height, + (double) image->extract_info.x,(double) image->extract_info.y); + (void) QueryColorname(image,&image->background_color,SVGCompliance,color, + exception); + (void) FormatLocaleFile(file," Background color: %s\n",color); + (void) QueryColorname(image,&image->border_color,SVGCompliance,color, + exception); + (void) FormatLocaleFile(file," Border color: %s\n",color); + (void) QueryColorname(image,&image->matte_color,SVGCompliance,color, + exception); + (void) FormatLocaleFile(file," Matte color: %s\n",color); + (void) QueryColorname(image,&image->transparent_color,SVGCompliance,color, + exception); + (void) FormatLocaleFile(file," Transparent color: %s\n",color); + (void) FormatLocaleFile(file," Interlace: %s\n",CommandOptionToMnemonic( + MagickInterlaceOptions,(ssize_t) image->interlace)); + (void) FormatLocaleFile(file," Intensity: %s\n",CommandOptionToMnemonic( + MagickPixelIntensityOptions,(ssize_t) image->intensity)); + (void) FormatLocaleFile(file," Compose: %s\n",CommandOptionToMnemonic( + MagickComposeOptions,(ssize_t) image->compose)); + if ((image->page.width != 0) || (image->page.height != 0) || + (image->page.x != 0) || (image->page.y != 0)) + (void) FormatLocaleFile(file," Page geometry: %.20gx%.20g%+.20g%+.20g\n", + (double) image->page.width,(double) image->page.height,(double) + image->page.x,(double) image->page.y); + if ((image->page.x != 0) || (image->page.y != 0)) + (void) FormatLocaleFile(file," Origin geometry: %+.20g%+.20g\n",(double) + image->page.x,(double) image->page.y); + (void) FormatLocaleFile(file," Dispose: %s\n",CommandOptionToMnemonic( + MagickDisposeOptions,(ssize_t) image->dispose)); + if (image->delay != 0) + (void) FormatLocaleFile(file," Delay: %.20gx%.20g\n",(double) image->delay, + (double) image->ticks_per_second); + if (image->iterations != 1) + (void) FormatLocaleFile(file," Iterations: %.20g\n",(double) + image->iterations); + if (image->duration != 0) + (void) FormatLocaleFile(file," Duration: %.20g\n",(double) + image->duration); + if ((image->next != (Image *) NULL) || (image->previous != (Image *) NULL)) + (void) FormatLocaleFile(file," Scene: %.20g of %.20g\n",(double) + image->scene,(double) GetImageListLength(image)); + else + if (image->scene != 0) + (void) FormatLocaleFile(file," Scene: %.20g\n",(double) image->scene); + (void) FormatLocaleFile(file," Compression: %s\n",CommandOptionToMnemonic( + MagickCompressOptions,(ssize_t) image->compression)); + if (image->quality != UndefinedCompressionQuality) + (void) FormatLocaleFile(file," Quality: %.20g\n",(double) image->quality); + (void) FormatLocaleFile(file," Orientation: %s\n",CommandOptionToMnemonic( + MagickOrientationOptions,(ssize_t) image->orientation)); + if (image->montage != (char *) NULL) + (void) FormatLocaleFile(file," Montage: %s\n",image->montage); + if (image->directory != (char *) NULL) + { + Image + *tile; + + ImageInfo + *image_info; + + char + *p, + *q; + + WarningHandler + handler; + + /* + Display visual image directory. + */ + image_info=AcquireImageInfo(); + (void) CloneString(&image_info->size,"64x64"); + (void) FormatLocaleFile(file," Directory:\n"); + for (p=image->directory; *p != '\0'; p++) + { + q=p; + while ((*q != '\xff') && (*q != '\0') && + ((size_t) (q-p) < sizeof(image_info->filename))) + q++; + (void) CopyMagickString(image_info->filename,p,(size_t) (q-p+1)); + p=q; + (void) FormatLocaleFile(file," %s",image_info->filename); + handler=SetWarningHandler((WarningHandler) NULL); + tile=ReadImage(image_info,exception); + (void) SetWarningHandler(handler); + if (tile == (Image *) NULL) + { + (void) FormatLocaleFile(file,"\n"); + continue; + } + (void) FormatLocaleFile(file," %.20gx%.20g %s\n",(double) + tile->magick_columns,(double) tile->magick_rows,tile->magick); + (void) SignatureImage(tile); + ResetImagePropertyIterator(tile); + property=GetNextImageProperty(tile); + while (property != (const char *) NULL) + { + (void) FormatLocaleFile(file," %s:\n",property); + value=GetImageProperty(tile,property); + if (value != (const char *) NULL) + (void) FormatLocaleFile(file,"%s\n",value); + property=GetNextImageProperty(tile); + } + tile=DestroyImage(tile); + } + image_info=DestroyImageInfo(image_info); + } + (void) FormatLocaleString(key,MaxTextExtent,"8BIM:1999,2998:#1"); + value=GetImageProperty(image,key); + if (value != (const char *) NULL) + { + /* + Display clipping path. + */ + (void) FormatLocaleFile(file," Clipping path: "); + if (strlen(value) > 80) + (void) fputc('\n',file); + (void) FormatLocaleFile(file,"%s\n",value); + } + ResetImageProfileIterator(image); + name=GetNextImageProfile(image); + if (name != (char *) NULL) + { + const StringInfo + *profile; + + /* + Identify image profiles. + */ + (void) FormatLocaleFile(file," Profiles:\n"); + while (name != (char *) NULL) + { + profile=GetImageProfile(image,name); + if (profile == (StringInfo *) NULL) + continue; + (void) FormatLocaleFile(file," Profile-%s: %.20g bytes\n",name, + (double) GetStringInfoLength(profile)); + if (LocaleCompare(name,"iptc") == 0) + { + char + *attribute, + **attribute_list; + + const char + *tag; + + long + dataset, + record, + sentinel; + + ssize_t + j; + + size_t + length, + profile_length; + + profile_length=GetStringInfoLength(profile); + for (i=0; i < (ssize_t) profile_length-5; i+=(ssize_t) length) + { + length=1; + sentinel=GetStringInfoDatum(profile)[i++]; + if (sentinel != 0x1c) + continue; + dataset=GetStringInfoDatum(profile)[i++]; + record=GetStringInfoDatum(profile)[i++]; + switch (record) + { + case 5: tag="Image Name"; break; + case 7: tag="Edit Status"; break; + case 10: tag="Priority"; break; + case 15: tag="Category"; break; + case 20: tag="Supplemental Category"; break; + case 22: tag="Fixture Identifier"; break; + case 25: tag="Keyword"; break; + case 30: tag="Release Date"; break; + case 35: tag="Release Time"; break; + case 40: tag="Special Instructions"; break; + case 45: tag="Reference Service"; break; + case 47: tag="Reference Date"; break; + case 50: tag="Reference Number"; break; + case 55: tag="Created Date"; break; + case 60: tag="Created Time"; break; + case 65: tag="Originating Program"; break; + case 70: tag="Program Version"; break; + case 75: tag="Object Cycle"; break; + case 80: tag="Byline"; break; + case 85: tag="Byline Title"; break; + case 90: tag="City"; break; + case 92: tag="Sub-Location"; break; + case 95: tag="Province State"; break; + case 100: tag="Country Code"; break; + case 101: tag="Country"; break; + case 103: tag="Original Transmission Reference"; break; + case 105: tag="Headline"; break; + case 110: tag="Credit"; break; + case 115: tag="Src"; break; + case 116: tag="Copyright String"; break; + case 120: tag="Caption"; break; + case 121: tag="Local Caption"; break; + case 122: tag="Caption Writer"; break; + case 200: tag="Custom Field 1"; break; + case 201: tag="Custom Field 2"; break; + case 202: tag="Custom Field 3"; break; + case 203: tag="Custom Field 4"; break; + case 204: tag="Custom Field 5"; break; + case 205: tag="Custom Field 6"; break; + case 206: tag="Custom Field 7"; break; + case 207: tag="Custom Field 8"; break; + case 208: tag="Custom Field 9"; break; + case 209: tag="Custom Field 10"; break; + case 210: tag="Custom Field 11"; break; + case 211: tag="Custom Field 12"; break; + case 212: tag="Custom Field 13"; break; + case 213: tag="Custom Field 14"; break; + case 214: tag="Custom Field 15"; break; + case 215: tag="Custom Field 16"; break; + case 216: tag="Custom Field 17"; break; + case 217: tag="Custom Field 18"; break; + case 218: tag="Custom Field 19"; break; + case 219: tag="Custom Field 20"; break; + default: tag="unknown"; break; + } + (void) FormatLocaleFile(file," %s[%.20g,%.20g]: ",tag, + (double) dataset,(double) record); + length=(size_t) (GetStringInfoDatum(profile)[i++] << 8); + length|=GetStringInfoDatum(profile)[i++]; + length=MagickMin(length,profile_length-i); + attribute=(char *) NULL; + if (~length >= (MaxTextExtent-1)) + attribute=(char *) AcquireQuantumMemory(length+ + MaxTextExtent,sizeof(*attribute)); + if (attribute != (char *) NULL) + { + (void) CopyMagickString(attribute,(char *) + GetStringInfoDatum(profile)+i,length+1); + attribute_list=StringToList(attribute); + if (attribute_list != (char **) NULL) + { + for (j=0; attribute_list[j] != (char *) NULL; j++) + { + (void) fputs(attribute_list[j],file); + (void) fputs("\n",file); + attribute_list[j]=(char *) RelinquishMagickMemory( + attribute_list[j]); + } + attribute_list=(char **) RelinquishMagickMemory( + attribute_list); + } + attribute=DestroyString(attribute); + } + } + } + if (image->debug != MagickFalse) + PrintStringInfo(file,name,profile); + name=GetNextImageProfile(image); + } + } + ResetImagePropertyIterator(image); + property=GetNextImageProperty(image); + if (property != (const char *) NULL) + { + /* + Display image properties. + */ + (void) FormatLocaleFile(file," Properties:\n"); + while (property != (const char *) NULL) + { + (void) FormatLocaleFile(file," %s: ",property); + value=GetImageProperty(image,property); + if (value != (const char *) NULL) + (void) FormatLocaleFile(file,"%s\n",value); + property=GetNextImageProperty(image); + } + } + ResetImageArtifactIterator(image); + artifact=GetNextImageArtifact(image); + if (artifact != (const char *) NULL) + { + /* + Display image artifacts. + */ + (void) FormatLocaleFile(file," Artifacts:\n"); + while (artifact != (const char *) NULL) + { + (void) FormatLocaleFile(file," %s: ",artifact); + value=GetImageArtifact(image,artifact); + if (value != (const char *) NULL) + (void) FormatLocaleFile(file,"%s\n",value); + artifact=GetNextImageArtifact(image); + } + } + ResetImageRegistryIterator(); + registry=GetNextImageRegistry(); + if (registry != (const char *) NULL) + { + /* + Display image registry. + */ + (void) FormatLocaleFile(file," Registry:\n"); + while (registry != (const char *) NULL) + { + (void) FormatLocaleFile(file," %s: ",registry); + value=(const char *) GetImageRegistry(StringRegistryType,registry, + exception); + if (value != (const char *) NULL) + (void) FormatLocaleFile(file,"%s\n",value); + registry=GetNextImageRegistry(); + } + } + (void) FormatLocaleFile(file," Tainted: %s\n",CommandOptionToMnemonic( + MagickBooleanOptions,(ssize_t) image->taint)); + (void) FormatMagickSize(image->extent,MagickTrue,format); + (void) FormatLocaleFile(file," Filesize: %s\n",format); + (void) FormatMagickSize((MagickSizeType) image->columns*image->rows, + MagickFalse,format); + if (strlen(format) > 1) + format[strlen(format)-1]='\0'; + (void) FormatLocaleFile(file," Number pixels: %s\n",format); + if (elapsed_time > MagickEpsilon) + { + (void) FormatMagickSize((MagickSizeType) ((double) image->columns* + image->rows/elapsed_time+0.5),MagickFalse,format); + (void) FormatLocaleFile(file," Pixels per second: %s\n",format); + } + (void) FormatLocaleFile(file," User time: %0.3fu\n",user_time); + (void) FormatLocaleFile(file," Elapsed time: %lu:%02lu.%03lu\n", + (unsigned long) (elapsed_time/60.0),(unsigned long) ceil(fmod( + elapsed_time,60.0)),(unsigned long) (1000.0*(elapsed_time-floor( + elapsed_time)))); + (void) FormatLocaleFile(file," Version: %s\n",GetMagickVersion((size_t *) + NULL)); + (void) fflush(file); + return(ferror(file) != 0 ? MagickFalse : MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/magick/identify.h b/ImageMagick-6.9.12-44/magick/identify.h new file mode 100644 index 0000000..e673c36 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/identify.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image identify method. +*/ +#ifndef MAGICKCORE_IDENTIFY_H +#define MAGICKCORE_IDENTIFY_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport MagickBooleanType + IdentifyImage(Image *,FILE *,const MagickBooleanType); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/image-private.h b/ImageMagick-6.9.12-44/magick/image-private.h new file mode 100644 index 0000000..d301374 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/image-private.h @@ -0,0 +1,111 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image private methods. +*/ +#ifndef MAGICKCORE_IMAGE_PRIVATE_H +#define MAGICKCORE_IMAGE_PRIVATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define BackgroundColor "#ffffff" /* white */ +#define BorderColor "#dfdfdf" /* gray */ +#define DefaultResolution 72.0 +#define DefaultTileFrame "15x15+3+3" +#define DefaultTileGeometry "120x120+4+3>" +#define DefaultTileLabel "%f\n%G\n%b" +#define ForegroundColor "#000" /* black */ +#define LoadImagesTag "Load/Images" +#define LoadImageTag "Load/Image" +#define Magick2PI 6.28318530717958647692528676655900576839433879875020 +#define MagickAbsoluteValue(x) ((x) < 0 ? -(x) : (x)) +#define MagickMax(x,y) (((x) > (y)) ? (x) : (y)) +#define MagickMin(x,y) (((x) < (y)) ? (x) : (y)) +#define MagickPHI 1.61803398874989484820458683436563811772030917980576 +#define MagickPI2 1.57079632679489661923132169163975144209858469968755 +#define MagickPI 3.14159265358979323846264338327950288419716939937510 +#define MagickSQ1_2 0.70710678118654752440084436210484903928483593768847 +#define MagickSQ2 1.41421356237309504880168872420969807856967187537695 +#define MagickSQ2PI 2.50662827463100024161235523934010416269302368164062 +#define MatteColor "#bdbdbd" /* gray */ +#define PSDensityGeometry "72.0x72.0" +#define PSPageGeometry "612x792" +#define SaveImagesTag "Save/Images" +#define SaveImageTag "Save/Image" +#define TransparentColor "#00000000" /* transparent black */ +#define UndefinedCompressionQuality 0UL +#define UndefinedTicksPerSecond 100L + +static inline ssize_t CastDoubleToLong(const double x) +{ + if (IsNaN(x) != 0) + return(0); + if (x > ((double) MAGICK_SSIZE_MAX+0.5)) + return((ssize_t) MAGICK_SSIZE_MAX); + if (x < ((double) MAGICK_SSIZE_MIN-0.5)) + return((ssize_t) MAGICK_SSIZE_MIN); + if (x >= 0.0) + return((ssize_t) (x+0.5)); + return((ssize_t) (x-0.5)); +} + +static inline QuantumAny CastDoubleToQuantumAny(const double x) +{ + if (IsNaN(x) != 0) + return(0); + if (x > ((double) ((QuantumAny) ~0))) + return((QuantumAny) ~0); + if (x < 0.0) + return((QuantumAny) 0); + return((QuantumAny) (x+0.5)); +} + +static inline double DegreesToRadians(const double degrees) +{ + return((double) (MagickPI*degrees/180.0)); +} + +static inline MagickRealType RadiansToDegrees(const MagickRealType radians) +{ + return((MagickRealType) (180.0*radians/MagickPI)); +} + +static inline unsigned char ScaleColor5to8(const unsigned int color) +{ + return((unsigned char) (((color) << 3) | ((color) >> 2))); +} + +static inline unsigned char ScaleColor6to8(const unsigned int color) +{ + return((unsigned char) (((color) << 2) | ((color) >> 4))); +} + +static inline unsigned int ScaleColor8to5(const unsigned char color) +{ + return((unsigned int) (((color) & ~0x07) >> 3)); +} + +static inline unsigned int ScaleColor8to6(const unsigned char color) +{ + return((unsigned int) (((color) & ~0x03) >> 2)); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/image-view.c b/ImageMagick-6.9.12-44/magick/image-view.c new file mode 100644 index 0000000..6b882fd --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/image-view.c @@ -0,0 +1,1270 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% IIIII M M AAA GGGG EEEEE % +% I MM MM A A G E % +% I M M M AAAAA G GG EEE % +% I M M A A G G E % +% IIIII M M A A GGGG EEEEE % +% % +% V V IIIII EEEEE W W % +% V V I E W W % +% V V I EEE W W W % +% V V I E WW WW % +% V IIIII EEEEE W W % +% % +% % +% MagickCore Image View Methods % +% % +% Software Design % +% Cristy % +% March 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/MagickCore.h" +#include "magick/exception-private.h" +#include "magick/monitor-private.h" +#include "magick/thread-private.h" + +/* + Typedef declarations. +*/ +struct _ImageView +{ + char + *description; + + RectangleInfo + extent; + + Image + *image; + + CacheView + *view; + + size_t + number_threads; + + ExceptionInfo + *exception; + + MagickBooleanType + debug; + + size_t + signature; +}; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e I m a g e V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneImageView() makes a copy of the specified image view. +% +% The format of the CloneImageView method is: +% +% ImageView *CloneImageView(const ImageView *image_view) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +*/ +MagickExport ImageView *CloneImageView(const ImageView *image_view) +{ + ImageView + *clone_view; + + assert(image_view != (ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + clone_view=(ImageView *) AcquireMagickMemory(sizeof(*clone_view)); + if (clone_view == (ImageView *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(clone_view,0,sizeof(*clone_view)); + clone_view->description=ConstantString(image_view->description); + clone_view->extent=image_view->extent; + clone_view->view=CloneCacheView(image_view->view); + clone_view->number_threads=image_view->number_threads; + clone_view->exception=AcquireExceptionInfo(); + InheritException(clone_view->exception,image_view->exception); + clone_view->debug=image_view->debug; + clone_view->signature=MagickCoreSignature; + return(clone_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y I m a g e V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyImageView() deallocates memory associated with a image view. +% +% The format of the DestroyImageView method is: +% +% ImageView *DestroyImageView(ImageView *image_view) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +*/ +MagickExport ImageView *DestroyImageView(ImageView *image_view) +{ + assert(image_view != (ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + if (image_view->description != (char *) NULL) + image_view->description=DestroyString(image_view->description); + image_view->view=DestroyCacheView(image_view->view); + image_view->exception=DestroyExceptionInfo(image_view->exception); + image_view->signature=(~MagickCoreSignature); + image_view=(ImageView *) RelinquishMagickMemory(image_view); + return(image_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D u p l e x T r a n s f e r I m a g e V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DuplexTransferImageViewIterator() iterates over three image views in +% parallel and calls your transfer method for each scanline of the view. The +% source and duplex pixel extent is not confined to the image canvas-- that is +% you can include negative offsets or widths or heights that exceed the image +% dimension. However, the destination image view is confined to the image +% canvas-- that is no negative offsets or widths or heights that exceed the +% image dimension are permitted. +% +% The callback signature is: +% +% MagickBooleanType DuplexTransferImageViewMethod(const ImageView *source, +% const ImageView *duplex,ImageView *destination,const ssize_t y, +% const int thread_id,void *context) +% +% Use this pragma if the view is not single threaded: +% +% #pragma omp critical +% +% to define a section of code in your callback transfer method that must be +% executed by a single thread at a time. +% +% The format of the DuplexTransferImageViewIterator method is: +% +% MagickBooleanType DuplexTransferImageViewIterator(ImageView *source, +% ImageView *duplex,ImageView *destination, +% DuplexTransferImageViewMethod transfer,void *context) +% +% A description of each parameter follows: +% +% o source: the source image view. +% +% o duplex: the duplex image view. +% +% o destination: the destination image view. +% +% o transfer: the transfer callback method. +% +% o context: the user defined context. +% +*/ +MagickExport MagickBooleanType DuplexTransferImageViewIterator( + ImageView *source,ImageView *duplex,ImageView *destination, + DuplexTransferImageViewMethod transfer,void *context) +{ + ExceptionInfo + *exception; + + Image + *destination_image, + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + size_t + height; +#endif + + ssize_t + y; + + assert(source != (ImageView *) NULL); + assert(source->signature == MagickCoreSignature); + if (transfer == (DuplexTransferImageViewMethod) NULL) + return(MagickFalse); + source_image=source->image; + destination_image=destination->image; + if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=destination->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + height=(size_t) (source->extent.height-source->extent.y); + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(source_image,destination_image,height,1) +#endif + for (y=source->extent.y; y < (ssize_t) source->extent.height; y++) + { + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + sync; + + const PixelPacket + *magick_restrict duplex_pixels, + *magick_restrict pixels; + + PixelPacket + *magick_restrict destination_pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewVirtualPixels(source->view,source->extent.x,y, + source->extent.width,1,source->exception); + if (pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + duplex_pixels=GetCacheViewVirtualPixels(duplex->view,duplex->extent.x,y, + duplex->extent.width,1,duplex->exception); + if (duplex_pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + destination_pixels=GetCacheViewAuthenticPixels(destination->view, + destination->extent.x,y,destination->extent.width,1,exception); + if (destination_pixels == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + if (transfer(source,duplex,destination,y,id,context) == MagickFalse) + status=MagickFalse; + sync=SyncCacheViewAuthenticPixels(destination->view,exception); + if (sync == MagickFalse) + { + InheritException(destination->exception,GetCacheViewException( + source->view)); + status=MagickFalse; + } + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,source->description,progress, + source->extent.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e V i e w A u t h e n t i c I n d e x e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageViewAuthenticIndexes() returns the image view authentic indexes. +% +% The format of the GetImageViewAuthenticPixels method is: +% +% IndexPacket *GetImageViewAuthenticIndexes(const ImageView *image_view) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +*/ +MagickExport IndexPacket *GetImageViewAuthenticIndexes( + const ImageView *image_view) +{ + assert(image_view != (ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + return(GetCacheViewAuthenticIndexQueue(image_view->view)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e V i e w A u t h e n t i c P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageViewAuthenticPixels() returns the image view authentic pixels. +% +% The format of the GetImageViewAuthenticPixels method is: +% +% PixelPacket *GetImageViewAuthenticPixels(const ImageView *image_view) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +*/ +MagickExport PixelPacket *GetImageViewAuthenticPixels( + const ImageView *image_view) +{ + assert(image_view != (ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + return(GetCacheViewAuthenticPixelQueue(image_view->view)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e V i e w E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageViewException() returns the severity, reason, and description of any +% error that occurs when utilizing a image view. +% +% The format of the GetImageViewException method is: +% +% char *GetImageViewException(const PixelImage *image_view, +% ExceptionType *severity) +% +% A description of each parameter follows: +% +% o image_view: the pixel image_view. +% +% o severity: the severity of the error is returned here. +% +*/ +MagickExport char *GetImageViewException(const ImageView *image_view, + ExceptionType *severity) +{ + char + *description; + + assert(image_view != (const ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + assert(severity != (ExceptionType *) NULL); + *severity=image_view->exception->severity; + description=(char *) AcquireQuantumMemory(MaxTextExtent, + 2*sizeof(*description)); + if (description == (char *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + *description='\0'; + if (image_view->exception->reason != (char *) NULL) + (void) CopyMagickString(description,GetLocaleExceptionMessage( + image_view->exception->severity,image_view->exception->reason), + MaxTextExtent); + if (image_view->exception->description != (char *) NULL) + { + (void) ConcatenateMagickString(description," (",MaxTextExtent); + (void) ConcatenateMagickString(description,GetLocaleExceptionMessage( + image_view->exception->severity,image_view->exception->description), + MaxTextExtent); + (void) ConcatenateMagickString(description,")",MaxTextExtent); + } + return(description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e V i e w E x t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageViewExtent() returns the image view extent. +% +% The format of the GetImageViewExtent method is: +% +% RectangleInfo GetImageViewExtent(const ImageView *image_view) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +*/ +MagickExport RectangleInfo GetImageViewExtent(const ImageView *image_view) +{ + assert(image_view != (ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + return(image_view->extent); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e V i e w I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageViewImage() returns the image associated with the image view. +% +% The format of the GetImageViewImage method is: +% +% MagickCore *GetImageViewImage(const ImageView *image_view) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +*/ +MagickExport Image *GetImageViewImage(const ImageView *image_view) +{ + assert(image_view != (ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + return(image_view->image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageViewIterator() iterates over the image view in parallel and calls +% your get method for each scanline of the view. The pixel extent is +% not confined to the image canvas-- that is you can include negative offsets +% or widths or heights that exceed the image dimension. Any updates to +% the pixels in your callback are ignored. +% +% The callback signature is: +% +% MagickBooleanType GetImageViewMethod(const ImageView *source, +% const ssize_t y,const int thread_id,void *context) +% +% Use this pragma if the view is not single threaded: +% +% #pragma omp critical +% +% to define a section of code in your callback get method that must be +% executed by a single thread at a time. +% +% The format of the GetImageViewIterator method is: +% +% MagickBooleanType GetImageViewIterator(ImageView *source, +% GetImageViewMethod get,void *context) +% +% A description of each parameter follows: +% +% o source: the source image view. +% +% o get: the get callback method. +% +% o context: the user defined context. +% +*/ +MagickExport MagickBooleanType GetImageViewIterator(ImageView *source, + GetImageViewMethod get,void *context) +{ + Image + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + size_t + height; +#endif + + ssize_t + y; + + assert(source != (ImageView *) NULL); + assert(source->signature == MagickCoreSignature); + if (get == (GetImageViewMethod) NULL) + return(MagickFalse); + source_image=source->image; + status=MagickTrue; + progress=0; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + height=(size_t) (source->extent.height-source->extent.y); + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(source_image,source_image,height,1) +#endif + for (y=source->extent.y; y < (ssize_t) source->extent.height; y++) + { + const int + id = GetOpenMPThreadId(); + + const PixelPacket + *pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewVirtualPixels(source->view,source->extent.x,y, + source->extent.width,1,source->exception); + if (pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + if (get(source,y,id,context) == MagickFalse) + status=MagickFalse; + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,source->description,progress, + source->extent.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e V i e w V i r t u a l I n d e x e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageViewVirtualIndexes() returns the image view virtual indexes. +% +% The format of the GetImageViewVirtualIndexes method is: +% +% const IndexPacket *GetImageViewVirtualIndexes( +% const ImageView *image_view) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +*/ +MagickExport const IndexPacket *GetImageViewVirtualIndexes( + const ImageView *image_view) +{ + assert(image_view != (ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + return(GetCacheViewVirtualIndexQueue(image_view->view)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e V i e w V i r t u a l P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageViewVirtualPixels() returns the image view virtual pixels. +% +% The format of the GetImageViewVirtualPixels method is: +% +% const PixelPacket *GetImageViewVirtualPixels(const ImageView *image_view) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +*/ +MagickExport const PixelPacket *GetImageViewVirtualPixels( + const ImageView *image_view) +{ + assert(image_view != (ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + return(GetCacheViewVirtualPixelQueue(image_view->view)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s I m a g e V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsImageView() returns MagickTrue if the parameter is verified as a image +% view object. +% +% The format of the IsImageView method is: +% +% MagickBooleanType IsImageView(const ImageView *image_view) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +*/ +MagickExport MagickBooleanType IsImageView(const ImageView *image_view) +{ + if (image_view == (const ImageView *) NULL) + return(MagickFalse); + if (image_view->signature != MagickCoreSignature) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w I m a g e V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewImageView() returns a image view required for all other methods in the +% Image View API. +% +% The format of the NewImageView method is: +% +% ImageView *NewImageView(MagickCore *wand) +% +% A description of each parameter follows: +% +% o wand: the wand. +% +*/ +MagickExport ImageView *NewImageView(Image *image) +{ + ImageView + *image_view; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + image_view=(ImageView *) AcquireMagickMemory(sizeof(*image_view)); + if (image_view == (ImageView *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(image_view,0,sizeof(*image_view)); + image_view->description=ConstantString("ImageView"); + image_view->image=image; + image_view->exception=AcquireExceptionInfo(); + image_view->view=AcquireVirtualCacheView(image_view->image, + image_view->exception); + image_view->extent.width=image->columns; + image_view->extent.height=image->rows; + image_view->extent.x=0; + image_view->extent.y=0; + image_view->number_threads=(size_t) GetMagickResourceLimit(ThreadResource); + image_view->debug=IsEventLogging(); + image_view->signature=MagickCoreSignature; + return(image_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w I m a g e V i e w R e g i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewImageViewRegion() returns a image view required for all other methods +% in the Image View API. +% +% The format of the NewImageViewRegion method is: +% +% ImageView *NewImageViewRegion(MagickCore *wand,const ssize_t x, +% const ssize_t y,const size_t width,const size_t height) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x,y,columns,rows: These values define the perimeter of a extent of +% pixel_wands view. +% +*/ +MagickExport ImageView *NewImageViewRegion(Image *image,const ssize_t x, + const ssize_t y,const size_t width,const size_t height) +{ + ImageView + *image_view; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + image_view=(ImageView *) AcquireMagickMemory(sizeof(*image_view)); + if (image_view == (ImageView *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + (void) memset(image_view,0,sizeof(*image_view)); + image_view->description=ConstantString("ImageView"); + image_view->exception=AcquireExceptionInfo(); + image_view->view=AcquireVirtualCacheView(image_view->image, + image_view->exception); + image_view->image=image; + image_view->extent.width=width; + image_view->extent.height=height; + image_view->extent.x=x; + image_view->extent.y=y; + image_view->number_threads=(size_t) GetMagickResourceLimit(ThreadResource); + image_view->debug=IsEventLogging(); + image_view->signature=MagickCoreSignature; + return(image_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e V i e w D e s c r i p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageViewDescription() associates a description with an image view. +% +% The format of the SetImageViewDescription method is: +% +% void SetImageViewDescription(ImageView *image_view, +% const char *description) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +% o description: the image view description. +% +*/ +MagickExport void SetImageViewDescription(ImageView *image_view, + const char *description) +{ + assert(image_view != (ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + image_view->description=ConstantString(description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageViewIterator() iterates over the image view in parallel and calls +% your set method for each scanline of the view. The pixel extent is +% confined to the image canvas-- that is no negative offsets or widths or +% heights that exceed the image dimension. The pixels are initiallly +% undefined and any settings you make in the callback method are automagically +% synced back to your image. +% +% The callback signature is: +% +% MagickBooleanType SetImageViewMethod(ImageView *destination, +% const ssize_t y,const int thread_id,void *context) +% +% Use this pragma if the view is not single threaded: +% +% #pragma omp critical +% +% to define a section of code in your callback set method that must be +% executed by a single thread at a time. +% +% The format of the SetImageViewIterator method is: +% +% MagickBooleanType SetImageViewIterator(ImageView *destination, +% SetImageViewMethod set,void *context) +% +% A description of each parameter follows: +% +% o destination: the image view. +% +% o set: the set callback method. +% +% o context: the user defined context. +% +*/ +MagickExport MagickBooleanType SetImageViewIterator(ImageView *destination, + SetImageViewMethod set,void *context) +{ + ExceptionInfo + *exception; + + Image + *destination_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + size_t + height; +#endif + + ssize_t + y; + + assert(destination != (ImageView *) NULL); + assert(destination->signature == MagickCoreSignature); + if (set == (SetImageViewMethod) NULL) + return(MagickFalse); + destination_image=destination->image; + if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + height=(size_t) (destination->extent.height-destination->extent.y); +#endif + exception=destination->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(destination_image,destination_image,height,1) +#endif + for (y=destination->extent.y; y < (ssize_t) destination->extent.height; y++) + { + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + sync; + + PixelPacket + *magick_restrict pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewAuthenticPixels(destination->view,destination->extent.x, + y,destination->extent.width,1,exception); + if (pixels == (PixelPacket *) NULL) + { + InheritException(destination->exception,GetCacheViewException( + destination->view)); + status=MagickFalse; + continue; + } + if (set(destination,y,id,context) == MagickFalse) + status=MagickFalse; + sync=SyncCacheViewAuthenticPixels(destination->view,exception); + if (sync == MagickFalse) + { + InheritException(destination->exception,GetCacheViewException( + destination->view)); + status=MagickFalse; + } + if (destination_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(destination_image,destination->description, + progress,destination->extent.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e V i e w T h r e a d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageViewThreads() sets the number of threads in a thread team. +% +% The format of the SetImageViewDescription method is: +% +% void SetImageViewThreads(ImageView *image_view, +% const size_t number_threads) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +% o number_threads: the number of threads in a thread team. +% +*/ +MagickExport void SetImageViewThreads(ImageView *image_view, + const size_t number_threads) +{ + assert(image_view != (ImageView *) NULL); + assert(image_view->signature == MagickCoreSignature); + image_view->number_threads=number_threads; + if (number_threads > (size_t) GetMagickResourceLimit(ThreadResource)) + image_view->number_threads=(size_t) GetMagickResourceLimit(ThreadResource); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% T r a n s f e r I m a g e V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% TransferImageViewIterator() iterates over two image views in parallel and +% calls your transfer method for each scanline of the view. The source pixel +% extent is not confined to the image canvas-- that is you can include +% negative offsets or widths or heights that exceed the image dimension. +% However, the destination image view is confined to the image canvas-- that +% is no negative offsets or widths or heights that exceed the image dimension +% are permitted. +% +% The callback signature is: +% +% MagickBooleanType TransferImageViewMethod(const ImageView *source, +% ImageView *destination,const ssize_t y,const int thread_id, +% void *context) +% +% Use this pragma if the view is not single threaded: +% +% #pragma omp critical +% +% to define a section of code in your callback transfer method that must be +% executed by a single thread at a time. +% +% The format of the TransferImageViewIterator method is: +% +% MagickBooleanType TransferImageViewIterator(ImageView *source, +% ImageView *destination,TransferImageViewMethod transfer,void *context) +% +% A description of each parameter follows: +% +% o source: the source image view. +% +% o destination: the destination image view. +% +% o transfer: the transfer callback method. +% +% o context: the user defined context. +% +*/ +MagickExport MagickBooleanType TransferImageViewIterator(ImageView *source, + ImageView *destination,TransferImageViewMethod transfer,void *context) +{ + ExceptionInfo + *exception; + + Image + *destination_image, + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + size_t + height; +#endif + + ssize_t + y; + + assert(source != (ImageView *) NULL); + assert(source->signature == MagickCoreSignature); + if (transfer == (TransferImageViewMethod) NULL) + return(MagickFalse); + source_image=source->image; + destination_image=destination->image; + if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=destination->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + height=(size_t) (source->extent.height-source->extent.y); + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(source_image,destination_image,height,1) +#endif + for (y=source->extent.y; y < (ssize_t) source->extent.height; y++) + { + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + sync; + + const PixelPacket + *magick_restrict pixels; + + PixelPacket + *magick_restrict destination_pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewVirtualPixels(source->view,source->extent.x,y, + source->extent.width,1,source->exception); + if (pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + destination_pixels=GetCacheViewAuthenticPixels(destination->view, + destination->extent.x,y,destination->extent.width,1,exception); + if (destination_pixels == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + if (transfer(source,destination,y,id,context) == MagickFalse) + status=MagickFalse; + sync=SyncCacheViewAuthenticPixels(destination->view,exception); + if (sync == MagickFalse) + { + InheritException(destination->exception,GetCacheViewException( + source->view)); + status=MagickFalse; + } + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,source->description,progress, + source->extent.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U p d a t e I m a g e V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UpdateImageViewIterator() iterates over the image view in parallel and calls +% your update method for each scanline of the view. The pixel extent is +% confined to the image canvas-- that is no negative offsets or widths or +% heights that exceed the image dimension are permitted. Updates to pixels +% in your callback are automagically synced back to the image. +% +% The callback signature is: +% +% MagickBooleanType UpdateImageViewMethod(ImageView *source, +% const ssize_t y,const int thread_id,void *context) +% +% Use this pragma if the view is not single threaded: +% +% #pragma omp critical +% +% to define a section of code in your callback update method that must be +% executed by a single thread at a time. +% +% The format of the UpdateImageViewIterator method is: +% +% MagickBooleanType UpdateImageViewIterator(ImageView *source, +% UpdateImageViewMethod update,void *context) +% +% A description of each parameter follows: +% +% o source: the source image view. +% +% o update: the update callback method. +% +% o context: the user defined context. +% +*/ +MagickExport MagickBooleanType UpdateImageViewIterator(ImageView *source, + UpdateImageViewMethod update,void *context) +{ + ExceptionInfo + *exception; + + Image + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + size_t + height; +#endif + + ssize_t + y; + + assert(source != (ImageView *) NULL); + assert(source->signature == MagickCoreSignature); + if (update == (UpdateImageViewMethod) NULL) + return(MagickFalse); + source_image=source->image; + if (SetImageStorageClass(source_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=source->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + height=(size_t) (source->extent.height-source->extent.y); + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(source_image,source_image,height,1) +#endif + for (y=source->extent.y; y < (ssize_t) source->extent.height; y++) + { + const int + id = GetOpenMPThreadId(); + + PixelPacket + *magick_restrict pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewAuthenticPixels(source->view,source->extent.x,y, + source->extent.width,1,exception); + if (pixels == (PixelPacket *) NULL) + { + InheritException(source->exception,GetCacheViewException(source->view)); + status=MagickFalse; + continue; + } + if (update(source,y,id,context) == MagickFalse) + status=MagickFalse; + if (SyncCacheViewAuthenticPixels(source->view,exception) == MagickFalse) + { + InheritException(source->exception,GetCacheViewException(source->view)); + status=MagickFalse; + } + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,source->description,progress, + source->extent.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} diff --git a/ImageMagick-6.9.12-44/magick/image-view.h b/ImageMagick-6.9.12-44/magick/image-view.h new file mode 100644 index 0000000..f5f4e5c --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/image-view.h @@ -0,0 +1,83 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITTransferNS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image view methods. +*/ +#ifndef MAGICKCORE_IMAGE_VIEW_H +#define MAGICKCORE_IMAGE_VIEW_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct _ImageView + ImageView; + +typedef MagickBooleanType + (*DuplexTransferImageViewMethod)(const ImageView *,const ImageView *, + ImageView *,const ssize_t,const int,void *), + (*GetImageViewMethod)(const ImageView *,const ssize_t,const int,void *), + (*SetImageViewMethod)(ImageView *,const ssize_t,const int,void *), + (*TransferImageViewMethod)(const ImageView *,ImageView *,const ssize_t, + const int,void *), + (*UpdateImageViewMethod)(ImageView *,const ssize_t,const int,void *); + +extern MagickExport char + *GetImageViewException(const ImageView *,ExceptionType *); + +extern MagickExport const IndexPacket + *GetImageViewVirtualIndexes(const ImageView *); + +extern MagickExport const PixelPacket + *GetImageViewVirtualPixels(const ImageView *); + +extern MagickExport Image + *GetImageViewImage(const ImageView *); + +extern MagickExport ImageView + *CloneImageView(const ImageView *), + *DestroyImageView(ImageView *), + *NewImageView(Image *), + *NewImageViewRegion(Image *,const ssize_t,const ssize_t,const size_t, + const size_t); + +extern MagickExport IndexPacket + *GetImageViewAuthenticIndexes(const ImageView *); + +extern MagickExport MagickBooleanType + DuplexTransferImageViewIterator(ImageView *,ImageView *,ImageView *, + DuplexTransferImageViewMethod,void *), + GetImageViewIterator(ImageView *,GetImageViewMethod,void *), + IsImageView(const ImageView *), + SetImageViewIterator(ImageView *,SetImageViewMethod,void *), + TransferImageViewIterator(ImageView *,ImageView *,TransferImageViewMethod, + void *), + UpdateImageViewIterator(ImageView *,UpdateImageViewMethod,void *); + +extern MagickExport PixelPacket + *GetImageViewAuthenticPixels(const ImageView *); + +extern MagickExport RectangleInfo + GetImageViewExtent(const ImageView *); + +extern MagickExport void + SetImageViewDescription(ImageView *,const char *), + SetImageViewThreads(ImageView *,const size_t); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/image.c b/ImageMagick-6.9.12-44/magick/image.c new file mode 100644 index 0000000..1c0a834 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/image.c @@ -0,0 +1,4045 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% IIIII M M AAA GGGG EEEEE % +% I MM MM A A G E % +% I M M M AAAAA G GG EEE % +% I M M A A G G E % +% IIIII M M A A GGGG EEEEE % +% % +% % +% MagickCore Image Methods % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/animate.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/cache-private.h" +#include "magick/cache-view.h" +#include "magick/channel.h" +#include "magick/client.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colorspace.h" +#include "magick/colorspace-private.h" +#include "magick/composite.h" +#include "magick/composite-private.h" +#include "magick/compress.h" +#include "magick/constitute.h" +#include "magick/delegate.h" +#include "magick/deprecate.h" +#include "magick/display.h" +#include "magick/draw.h" +#include "magick/enhance.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/histogram.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magic.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/memory-private.h" +#include "magick/module.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/paint.h" +#include "magick/pixel-accessor.h" +#include "magick/pixel-private.h" +#include "magick/profile.h" +#include "magick/property.h" +#include "magick/quantize.h" +#include "magick/random_.h" +#include "magick/resource_.h" +#include "magick/segment.h" +#include "magick/semaphore.h" +#include "magick/signature-private.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/string-private.h" +#include "magick/thread-private.h" +#include "magick/threshold.h" +#include "magick/timer.h" +#include "magick/timer-private.h" +#include "magick/token.h" +#include "magick/token-private.h" +#include "magick/utility.h" +#include "magick/version.h" +#include "magick/xwindow-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireImage() returns a pointer to an image structure initialized to +% default values. +% +% The format of the AcquireImage method is: +% +% Image *AcquireImage(const ImageInfo *image_info) +% +% A description of each parameter follows: +% +% o image_info: Many of the image default values are set from this +% structure. For example, filename, compression, depth, background color, +% and others. +% +*/ +MagickExport Image *AcquireImage(const ImageInfo *image_info) +{ + const char + *option; + + Image + *image; + + MagickStatusType + flags; + + /* + Allocate image structure. + */ + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + image=(Image *) AcquireCriticalMemory(sizeof(*image)); + (void) memset(image,0,sizeof(*image)); + /* + Initialize Image structure. + */ + (void) CopyMagickString(image->magick,"MIFF",MaxTextExtent); + image->storage_class=DirectClass; + image->depth=MAGICKCORE_QUANTUM_DEPTH; + image->colorspace=sRGBColorspace; + image->rendering_intent=PerceptualIntent; + image->gamma=1.000f/2.200f; + image->chromaticity.red_primary.x=0.6400f; + image->chromaticity.red_primary.y=0.3300f; + image->chromaticity.red_primary.z=0.0300f; + image->chromaticity.green_primary.x=0.3000f; + image->chromaticity.green_primary.y=0.6000f; + image->chromaticity.green_primary.z=0.1000f; + image->chromaticity.blue_primary.x=0.1500f; + image->chromaticity.blue_primary.y=0.0600f; + image->chromaticity.blue_primary.z=0.7900f; + image->chromaticity.white_point.x=0.3127f; + image->chromaticity.white_point.y=0.3290f; + image->chromaticity.white_point.z=0.3583f; + image->interlace=NoInterlace; + image->ticks_per_second=UndefinedTicksPerSecond; + image->compose=OverCompositeOp; + image->blur=1.0; + InitializeExceptionInfo(&image->exception); + (void) QueryColorDatabase(BackgroundColor,&image->background_color, + &image->exception); + (void) QueryColorDatabase(BorderColor,&image->border_color,&image->exception); + (void) QueryColorDatabase(MatteColor,&image->matte_color,&image->exception); + (void) QueryColorDatabase(TransparentColor,&image->transparent_color, + &image->exception); + GetTimerInfo(&image->timer); + image->ping=MagickFalse; + image->cache=AcquirePixelCache(0); + image->blob=CloneBlobInfo((BlobInfo *) NULL); + image->timestamp=GetMagickTime(); + image->debug=IsEventLogging(); + image->reference_count=1; + image->semaphore=AllocateSemaphoreInfo(); + image->signature=MagickCoreSignature; + if (image_info == (ImageInfo *) NULL) + return(image); + /* + Transfer image info. + */ + SetBlobExempt(image,image_info->file != (FILE *) NULL ? MagickTrue : + MagickFalse); + (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent); + (void) CopyMagickString(image->magick_filename,image_info->filename, + MaxTextExtent); + (void) CopyMagickString(image->magick,image_info->magick,MaxTextExtent); + if (image_info->size != (char *) NULL) + { + (void) ParseAbsoluteGeometry(image_info->size,&image->extract_info); + image->columns=image->extract_info.width; + image->rows=image->extract_info.height; + image->offset=image->extract_info.x; + image->extract_info.x=0; + image->extract_info.y=0; + } + if (image_info->extract != (char *) NULL) + { + RectangleInfo + geometry; + + (void) memset(&geometry,0,sizeof(geometry)); + flags=ParseAbsoluteGeometry(image_info->extract,&geometry); + if (((flags & XValue) != 0) || ((flags & YValue) != 0)) + { + image->extract_info=geometry; + Swap(image->columns,image->extract_info.width); + Swap(image->rows,image->extract_info.height); + } + } + image->compression=image_info->compression; + image->quality=image_info->quality; + image->endian=image_info->endian; + image->interlace=image_info->interlace; + image->units=image_info->units; + if (image_info->density != (char *) NULL) + { + GeometryInfo + geometry_info; + + flags=ParseGeometry(image_info->density,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + if (image_info->page != (char *) NULL) + { + char + *geometry; + + image->page=image->extract_info; + geometry=GetPageGeometry(image_info->page); + (void) ParseAbsoluteGeometry(geometry,&image->page); + geometry=DestroyString(geometry); + } + if (image_info->depth != 0) + image->depth=image_info->depth; + image->dither=image_info->dither; + image->background_color=image_info->background_color; + image->border_color=image_info->border_color; + image->matte_color=image_info->matte_color; + image->transparent_color=image_info->transparent_color; + image->ping=image_info->ping; + image->progress_monitor=image_info->progress_monitor; + image->client_data=image_info->client_data; + if (image_info->cache != (void *) NULL) + ClonePixelCacheMethods(image->cache,image_info->cache); + (void) SyncImageSettings(image_info,image); + option=GetImageOption(image_info,"delay"); + if (option != (const char *) NULL) + { + GeometryInfo + geometry_info; + + flags=ParseGeometry(option,&geometry_info); + if ((flags & GreaterValue) != 0) + { + if ((double) image->delay > floor(geometry_info.rho+0.5)) + image->delay=(size_t) CastDoubleToLong(floor( + geometry_info.rho+0.5)); + } + else + if ((flags & LessValue) != 0) + { + if ((double) image->delay < floor(geometry_info.rho+0.5)) + image->ticks_per_second=CastDoubleToLong(floor( + geometry_info.sigma+0.5)); + } + else + image->delay=(size_t) CastDoubleToLong(floor( + geometry_info.rho+0.5)); + if ((flags & SigmaValue) != 0) + image->ticks_per_second=CastDoubleToLong(floor( + geometry_info.sigma+0.5)); + } + option=GetImageOption(image_info,"dispose"); + if (option != (const char *) NULL) + image->dispose=(DisposeType) ParseCommandOption(MagickDisposeOptions, + MagickFalse,option); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e I m a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireImageInfo() allocates the ImageInfo structure. +% +% The format of the AcquireImageInfo method is: +% +% ImageInfo *AcquireImageInfo(void) +% +*/ +MagickExport ImageInfo *AcquireImageInfo(void) +{ + ImageInfo + *image_info; + + image_info=(ImageInfo *) AcquireMagickMemory(sizeof(*image_info)); + if (image_info == (ImageInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + GetImageInfo(image_info); + return(image_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e N e x t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireNextImage() initializes the next image in a sequence to +% default values. The next member of image points to the newly allocated +% image. If there is a memory shortage, next is assigned NULL. +% +% The format of the AcquireNextImage method is: +% +% void AcquireNextImage(const ImageInfo *image_info,Image *image) +% +% A description of each parameter follows: +% +% o image_info: Many of the image default values are set from this +% structure. For example, filename, compression, depth, background color, +% and others. +% +% o image: the image. +% +*/ +MagickExport void AcquireNextImage(const ImageInfo *image_info,Image *image) +{ + /* + Allocate image structure. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + image->next=AcquireImage(image_info); + if (GetNextImageInList(image) == (Image *) NULL) + return; + (void) CopyMagickString(GetNextImageInList(image)->filename,image->filename, + MaxTextExtent); + if (image_info != (ImageInfo *) NULL) + (void) CopyMagickString(GetNextImageInList(image)->filename, + image_info->filename,MaxTextExtent); + DestroyBlob(GetNextImageInList(image)); + image->next->blob=ReferenceBlob(image->blob); + image->next->endian=image->endian; + image->next->scene=image->scene+1; + image->next->previous=image; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A p p e n d I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AppendImages() takes all images from the current image pointer to the end +% of the image list and appends them to each other top-to-bottom if the +% stack parameter is true, otherwise left-to-right. +% +% The current gravity setting now effects how the image is justified in the +% final image. +% +% The format of the AppendImages method is: +% +% Image *AppendImages(const Image *images,const MagickBooleanType stack, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o images: the image sequence. +% +% o stack: A value other than 0 stacks the images top-to-bottom. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *AppendImages(const Image *images, + const MagickBooleanType stack,ExceptionInfo *exception) +{ +#define AppendImageTag "Append/Image" + + CacheView + *append_view; + + Image + *append_image; + + MagickBooleanType + homogeneous_colorspace, + matte, + status; + + MagickOffsetType + n; + + RectangleInfo + geometry; + + const Image + *next; + + size_t + depth, + height, + number_images, + width; + + ssize_t + x_offset, + y, + y_offset; + + /* + Compute maximum area of appended area. + */ + assert(images != (Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + matte=images->matte; + number_images=1; + width=images->columns; + height=images->rows; + depth=images->depth; + homogeneous_colorspace=MagickTrue; + next=GetNextImageInList(images); + for ( ; next != (Image *) NULL; next=GetNextImageInList(next)) + { + if (next->depth > depth) + depth=next->depth; + if (next->colorspace != images->colorspace) + homogeneous_colorspace=MagickFalse; + if (next->matte != MagickFalse) + matte=MagickTrue; + number_images++; + if (stack != MagickFalse) + { + if (next->columns > width) + width=next->columns; + height+=next->rows; + continue; + } + width+=next->columns; + if (next->rows > height) + height=next->rows; + } + /* + Append images. + */ + append_image=CloneImage(images,width,height,MagickTrue,exception); + if (append_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(append_image,DirectClass) == MagickFalse) + { + InheritException(exception,&append_image->exception); + append_image=DestroyImage(append_image); + return((Image *) NULL); + } + if (homogeneous_colorspace == MagickFalse) + (void) SetImageColorspace(append_image,sRGBColorspace); + append_image->depth=depth; + append_image->matte=matte; + append_image->page=images->page; + (void) SetImageBackgroundColor(append_image); + status=MagickTrue; + x_offset=0; + y_offset=0; + next=images; + append_view=AcquireAuthenticCacheView(append_image,exception); + for (n=0; n < (MagickOffsetType) number_images; n++) + { + CacheView + *image_view; + + MagickBooleanType + proceed; + + SetGeometry(append_image,&geometry); + GravityAdjustGeometry(next->columns,next->rows,next->gravity,&geometry); + if (stack != MagickFalse) + x_offset-=geometry.x; + else + y_offset-=geometry.y; + image_view=AcquireVirtualCacheView(next,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(next,next,next->rows,1) +#endif + for (y=0; y < (ssize_t) next->rows; y++) + { + MagickBooleanType + sync; + + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict p; + + IndexPacket + *magick_restrict append_indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception); + q=QueueCacheViewAuthenticPixels(append_view,x_offset,y+y_offset, + next->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(image_view); + append_indexes=GetCacheViewAuthenticIndexQueue(append_view); + for (x=0; x < (ssize_t) next->columns; x++) + { + SetPixelRed(q,GetPixelRed(p)); + SetPixelGreen(q,GetPixelGreen(p)); + SetPixelBlue(q,GetPixelBlue(p)); + SetPixelOpacity(q,OpaqueOpacity); + if (next->matte != MagickFalse) + SetPixelOpacity(q,GetPixelOpacity(p)); + if ((next->colorspace == CMYKColorspace) && + (append_image->colorspace == CMYKColorspace)) + SetPixelIndex(append_indexes+x,GetPixelIndex(indexes+x)); + p++; + q++; + } + sync=SyncCacheViewAuthenticPixels(append_view,exception); + if (sync == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + if (stack == MagickFalse) + { + x_offset+=(ssize_t) next->columns; + y_offset=0; + } + else + { + x_offset=0; + y_offset+=(ssize_t) next->rows; + } + proceed=SetImageProgress(append_image,AppendImageTag,n,number_images); + if (proceed == MagickFalse) + break; + next=GetNextImageInList(next); + } + append_view=DestroyCacheView(append_view); + if (status == MagickFalse) + append_image=DestroyImage(append_image); + return(append_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C a t c h I m a g e E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CatchImageException() returns if no exceptions are found in the image +% sequence, otherwise it determines the most severe exception and reports +% it as a warning or error depending on the severity. +% +% The format of the CatchImageException method is: +% +% ExceptionType CatchImageException(Image *image) +% +% A description of each parameter follows: +% +% o image: An image sequence. +% +*/ +MagickExport ExceptionType CatchImageException(Image *image) +{ + ExceptionInfo + *exception; + + ExceptionType + severity; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + exception=AcquireExceptionInfo(); + GetImageException(image,exception); + CatchException(exception); + severity=exception->severity; + exception=DestroyExceptionInfo(exception); + return(severity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l i p I m a g e P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClipImagePath() sets the image clip mask based any clipping path information +% if it exists. +% +% The format of the ClipImagePath method is: +% +% MagickBooleanType ClipImagePath(Image *image,const char *pathname, +% const MagickBooleanType inside) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o pathname: name of clipping path resource. If name is preceded by #, use +% clipping path numbered by name. +% +% o inside: if non-zero, later operations take effect inside clipping path. +% Otherwise later operations take effect outside clipping path. +% +*/ + +MagickExport MagickBooleanType ClipImage(Image *image) +{ + return(ClipImagePath(image,"#1",MagickTrue)); +} + +MagickExport MagickBooleanType ClipImagePath(Image *image,const char *pathname, + const MagickBooleanType inside) +{ +#define ClipImagePathTag "ClipPath/Image" + + char + *property; + + const char + *value; + + Image + *clip_mask; + + ImageInfo + *image_info; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(pathname != NULL); + property=AcquireString(pathname); + (void) FormatLocaleString(property,MaxTextExtent,"8BIM:1999,2998:%s", + pathname); + value=GetImageProperty(image,property); + property=DestroyString(property); + if (value == (const char *) NULL) + { + ThrowFileException(&image->exception,OptionError,"NoClipPathDefined", + image->filename); + return(MagickFalse); + } + image_info=AcquireImageInfo(); + (void) CopyMagickString(image_info->filename,image->filename,MaxTextExtent); + (void) ConcatenateMagickString(image_info->filename,pathname,MaxTextExtent); + clip_mask=BlobToImage(image_info,value,strlen(value),&image->exception); + image_info=DestroyImageInfo(image_info); + if (clip_mask == (Image *) NULL) + return(MagickFalse); + if (clip_mask->storage_class == PseudoClass) + { + (void) SyncImage(clip_mask); + if (SetImageStorageClass(clip_mask,DirectClass) == MagickFalse) + return(MagickFalse); + } + if (inside == MagickFalse) + (void) NegateImage(clip_mask,MagickFalse); + (void) FormatLocaleString(clip_mask->magick_filename,MaxTextExtent, + "8BIM:1999,2998:%s\nPS",pathname); + (void) SetImageClipMask(image,clip_mask); + clip_mask=DestroyImage(clip_mask); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneImage() copies an image and returns the copy as a new image object. +% +% If the specified columns and rows is 0, an exact copy of the image is +% returned, otherwise the pixel data is undefined and must be initialized +% with the QueueAuthenticPixels() and SyncAuthenticPixels() methods. On +% failure, a NULL image is returned and exception describes the reason for the +% failure. +% +% The format of the CloneImage method is: +% +% Image *CloneImage(const Image *image,const size_t columns, +% const size_t rows,const MagickBooleanType orphan, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o columns: the number of columns in the cloned image. +% +% o rows: the number of rows in the cloned image. +% +% o detach: With a value other than 0, the cloned image is detached from +% its parent I/O stream. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *CloneImage(const Image *image,const size_t columns, + const size_t rows,const MagickBooleanType detach,ExceptionInfo *exception) +{ + double + scale_x, + scale_y; + + Image + *clone_image; + + size_t + length; + + /* + Clone the image. + */ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if ((image->columns == 0) || (image->rows == 0)) + { + (void) ThrowMagickException(exception,GetMagickModule(),CorruptImageError, + "NegativeOrZeroImageSize","`%s'",image->filename); + return((Image *) NULL); + } + clone_image=(Image *) AcquireCriticalMemory(sizeof(*clone_image)); + (void) memset(clone_image,0,sizeof(*clone_image)); + clone_image->signature=MagickCoreSignature; + clone_image->storage_class=image->storage_class; + clone_image->channels=image->channels; + clone_image->colorspace=image->colorspace; + clone_image->matte=image->matte; + clone_image->columns=image->columns; + clone_image->rows=image->rows; + clone_image->dither=image->dither; + (void) CloneImageProfiles(clone_image,image); + (void) CloneImageProperties(clone_image,image); + (void) CloneImageArtifacts(clone_image,image); + GetTimerInfo(&clone_image->timer); + InitializeExceptionInfo(&clone_image->exception); + InheritException(&clone_image->exception,&image->exception); + if (image->ascii85 != (void *) NULL) + Ascii85Initialize(clone_image); + clone_image->extent=image->extent; + clone_image->magick_columns=image->magick_columns; + clone_image->magick_rows=image->magick_rows; + clone_image->type=image->type; + (void) CopyMagickString(clone_image->magick_filename,image->magick_filename, + MaxTextExtent); + (void) CopyMagickString(clone_image->magick,image->magick,MaxTextExtent); + (void) CopyMagickString(clone_image->filename,image->filename,MaxTextExtent); + clone_image->progress_monitor=image->progress_monitor; + clone_image->client_data=image->client_data; + clone_image->reference_count=1; + clone_image->next=image->next; + clone_image->previous=image->previous; + clone_image->list=NewImageList(); + clone_image->clip_mask=NewImageList(); + clone_image->mask=NewImageList(); + if (detach == MagickFalse) + clone_image->blob=ReferenceBlob(image->blob); + else + { + clone_image->next=NewImageList(); + clone_image->previous=NewImageList(); + clone_image->blob=CloneBlobInfo((BlobInfo *) NULL); + } + clone_image->ping=image->ping; + clone_image->debug=IsEventLogging(); + clone_image->semaphore=AllocateSemaphoreInfo(); + if (image->colormap != (PixelPacket *) NULL) + { + /* + Allocate and copy the image colormap. + */ + clone_image->colors=image->colors; + length=(size_t) image->colors; + clone_image->colormap=(PixelPacket *) AcquireQuantumMemory(length+1, + sizeof(*clone_image->colormap)); + if (clone_image->colormap == (PixelPacket *) NULL) + { + clone_image=DestroyImage(clone_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + (void) memcpy(clone_image->colormap,image->colormap,length* + sizeof(*clone_image->colormap)); + } + if ((columns == 0) || (rows == 0)) + { + if (image->montage != (char *) NULL) + (void) CloneString(&clone_image->montage,image->montage); + if (image->directory != (char *) NULL) + (void) CloneString(&clone_image->directory,image->directory); + if (image->clip_mask != (Image *) NULL) + clone_image->clip_mask=CloneImage(image->clip_mask,0,0,MagickTrue, + exception); + if (image->mask != (Image *) NULL) + clone_image->mask=CloneImage(image->mask,0,0,MagickTrue,exception); + clone_image->cache=ReferencePixelCache(image->cache); + return(clone_image); + } + if ((columns == image->columns) && (rows == image->rows)) + { + if (image->clip_mask != (Image *) NULL) + clone_image->clip_mask=CloneImage(image->clip_mask,0,0,MagickTrue, + exception); + if (image->mask != (Image *) NULL) + clone_image->mask=CloneImage(image->mask,0,0,MagickTrue,exception); + } + scale_x=1.0; + scale_y=1.0; + if (image->columns != 0) + scale_x=(double) columns/(double) image->columns; + if (image->rows != 0) + scale_y=(double) rows/(double) image->rows; + clone_image->page.width=(size_t) CastDoubleToLong(floor(scale_x* + image->page.width+0.5)); + clone_image->page.height=(size_t) CastDoubleToLong(floor(scale_y* + image->page.height+0.5)); + if (MagickAbsoluteValue(scale_x-scale_y) < 2.0) + scale_x=scale_y=MagickMin(scale_x,scale_y); + clone_image->page.x=CastDoubleToLong(ceil(scale_x*image->page.x-0.5)); + clone_image->tile_offset.x=CastDoubleToLong(ceil(scale_x* + image->tile_offset.x-0.5)); + clone_image->page.y=CastDoubleToLong(ceil(scale_y*image->page.y-0.5)); + clone_image->tile_offset.y=CastDoubleToLong(ceil(scale_y* + image->tile_offset.y-0.5)); + clone_image->cache=ClonePixelCache(image->cache); + if (SetImageExtent(clone_image,columns,rows) == MagickFalse) + { + InheritException(exception,&clone_image->exception); + clone_image=DestroyImage(clone_image); + } + return(clone_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e I m a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneImageInfo() makes a copy of the given image info structure. If +% NULL is specified, a new image info structure is created initialized to +% default values. +% +% The format of the CloneImageInfo method is: +% +% ImageInfo *CloneImageInfo(const ImageInfo *image_info) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +*/ +MagickExport ImageInfo *CloneImageInfo(const ImageInfo *image_info) +{ + ImageInfo + *clone_info; + + clone_info=AcquireImageInfo(); + if (image_info == (ImageInfo *) NULL) + return(clone_info); + clone_info->compression=image_info->compression; + clone_info->temporary=image_info->temporary; + clone_info->adjoin=image_info->adjoin; + clone_info->antialias=image_info->antialias; + clone_info->scene=image_info->scene; + clone_info->number_scenes=image_info->number_scenes; + clone_info->depth=image_info->depth; + if (image_info->size != (char *) NULL) + (void) CloneString(&clone_info->size,image_info->size); + if (image_info->extract != (char *) NULL) + (void) CloneString(&clone_info->extract,image_info->extract); + if (image_info->scenes != (char *) NULL) + (void) CloneString(&clone_info->scenes,image_info->scenes); + if (image_info->page != (char *) NULL) + (void) CloneString(&clone_info->page,image_info->page); + clone_info->interlace=image_info->interlace; + clone_info->endian=image_info->endian; + clone_info->units=image_info->units; + clone_info->quality=image_info->quality; + if (image_info->sampling_factor != (char *) NULL) + (void) CloneString(&clone_info->sampling_factor, + image_info->sampling_factor); + if (image_info->server_name != (char *) NULL) + (void) CloneString(&clone_info->server_name,image_info->server_name); + if (image_info->font != (char *) NULL) + (void) CloneString(&clone_info->font,image_info->font); + if (image_info->texture != (char *) NULL) + (void) CloneString(&clone_info->texture,image_info->texture); + if (image_info->density != (char *) NULL) + (void) CloneString(&clone_info->density,image_info->density); + clone_info->pointsize=image_info->pointsize; + clone_info->fuzz=image_info->fuzz; + clone_info->pen=image_info->pen; + clone_info->background_color=image_info->background_color; + clone_info->border_color=image_info->border_color; + clone_info->matte_color=image_info->matte_color; + clone_info->transparent_color=image_info->transparent_color; + clone_info->dither=image_info->dither; + clone_info->monochrome=image_info->monochrome; + clone_info->colors=image_info->colors; + clone_info->colorspace=image_info->colorspace; + clone_info->type=image_info->type; + clone_info->orientation=image_info->orientation; + clone_info->preview_type=image_info->preview_type; + clone_info->group=image_info->group; + clone_info->ping=image_info->ping; + clone_info->verbose=image_info->verbose; + if (image_info->view != (char *) NULL) + (void) CloneString(&clone_info->view,image_info->view); + if (image_info->authenticate != (char *) NULL) + (void) CloneString(&clone_info->authenticate,image_info->authenticate); + (void) CloneImageOptions(clone_info,image_info); + clone_info->progress_monitor=image_info->progress_monitor; + clone_info->client_data=image_info->client_data; + clone_info->cache=image_info->cache; + if (image_info->cache != (void *) NULL) + clone_info->cache=ReferencePixelCache(image_info->cache); + if (image_info->profile != (void *) NULL) + clone_info->profile=(void *) CloneStringInfo((StringInfo *) + image_info->profile); + SetImageInfoFile(clone_info,image_info->file); + SetImageInfoBlob(clone_info,image_info->blob,image_info->length); + clone_info->stream=image_info->stream; + clone_info->virtual_pixel_method=image_info->virtual_pixel_method; + (void) CopyMagickString(clone_info->magick,image_info->magick,MaxTextExtent); + (void) CopyMagickString(clone_info->unique,image_info->unique,MaxTextExtent); + (void) CopyMagickString(clone_info->zero,image_info->zero,MaxTextExtent); + (void) CopyMagickString(clone_info->filename,image_info->filename, + MaxTextExtent); + clone_info->subimage=image_info->scene; /* deprecated */ + clone_info->subrange=image_info->number_scenes; /* deprecated */ + clone_info->channel=image_info->channel; + clone_info->debug=IsEventLogging(); + clone_info->signature=image_info->signature; + return(clone_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o p y I m a g e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CopyImagePixels() copies pixels from the source image as defined by the +% geometry the destination image at the specified offset. +% +% The format of the CopyImagePixels method is: +% +% MagickBooleanType CopyImagePixels(Image *image,const Image *source_image, +% const RectangleInfo *geometry,const OffsetInfo *offset, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the destination image. +% +% o source_image: the source image. +% +% o geometry: define the dimensions of the source pixel rectangle. +% +% o offset: define the offset in the destination image. +% +% o exception: return the highest severity exception. +% +*/ +MagickExport MagickBooleanType CopyImagePixels(Image *image, + const Image *source_image,const RectangleInfo *geometry, + const OffsetInfo *offset,ExceptionInfo *exception) +{ +#define CopyImageTag "Copy/Image" + + CacheView + *image_view, + *source_view; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(source_image != (Image *) NULL); + assert(geometry != (RectangleInfo *) NULL); + assert(offset != (OffsetInfo *) NULL); + if ((offset->x < 0) || (offset->y < 0) || + ((ssize_t) (offset->x+geometry->width) > (ssize_t) image->columns) || + ((ssize_t) (offset->y+geometry->height) > (ssize_t) image->rows)) + ThrowBinaryException(OptionError,"GeometryDoesNotContainImage", + image->filename); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + /* + Copy image pixels. + */ + status=MagickTrue; + progress=0; + source_view=AcquireVirtualCacheView(source_image,exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(source_image,image,geometry->height,1) +#endif + for (y=0; y < (ssize_t) geometry->height; y++) + { + const IndexPacket + *magick_restrict source_indexes; + + const PixelPacket + *magick_restrict p; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(source_view,geometry->x,y+geometry->y, + geometry->width,1,exception); + q=GetCacheViewAuthenticPixels(image_view,offset->x,y+offset->y, + geometry->width,1,exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + source_indexes=GetCacheViewVirtualIndexQueue(source_view); + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) geometry->width; x++) + { + *q=(*p); + if (image->colorspace == CMYKColorspace) + indexes[x]=source_indexes[x]; + p++; + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(image,CopyImageTag,progress,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + image_view=DestroyCacheView(image_view); + source_view=DestroyCacheView(source_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyImage() dereferences an image, deallocating memory associated with +% the image if the reference count becomes zero. +% +% The format of the DestroyImage method is: +% +% Image *DestroyImage(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport Image *DestroyImage(Image *image) +{ + MagickBooleanType + destroy; + + /* + Dereference image. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + destroy=MagickFalse; + LockSemaphoreInfo(image->semaphore); + image->reference_count--; + if (image->reference_count == 0) + destroy=MagickTrue; + UnlockSemaphoreInfo(image->semaphore); + if (destroy == MagickFalse) + return((Image *) NULL); + /* + Destroy image. + */ + DestroyImagePixels(image); + if (image->clip_mask != (Image *) NULL) + image->clip_mask=DestroyImage(image->clip_mask); + if (image->mask != (Image *) NULL) + image->mask=DestroyImage(image->mask); + if (image->montage != (char *) NULL) + image->montage=DestroyString(image->montage); + if (image->directory != (char *) NULL) + image->directory=DestroyString(image->directory); + if (image->colormap != (PixelPacket *) NULL) + image->colormap=(PixelPacket *) RelinquishMagickMemory(image->colormap); + if (image->geometry != (char *) NULL) + image->geometry=DestroyString(image->geometry); + DestroyImageProfiles(image); + DestroyImageProperties(image); + DestroyImageArtifacts(image); + if (image->ascii85 != (Ascii85Info*) NULL) + image->ascii85=(Ascii85Info *) RelinquishMagickMemory(image->ascii85); + DestroyBlob(image); + (void) ClearExceptionInfo(&image->exception,MagickTrue); + if (image->semaphore != (SemaphoreInfo *) NULL) + DestroySemaphoreInfo(&image->semaphore); + image->signature=(~MagickCoreSignature); + image=(Image *) RelinquishMagickMemory(image); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y I m a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyImageInfo() deallocates memory associated with an ImageInfo +% structure. +% +% The format of the DestroyImageInfo method is: +% +% ImageInfo *DestroyImageInfo(ImageInfo *image_info) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +*/ +MagickExport ImageInfo *DestroyImageInfo(ImageInfo *image_info) +{ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + if (image_info->size != (char *) NULL) + image_info->size=DestroyString(image_info->size); + if (image_info->extract != (char *) NULL) + image_info->extract=DestroyString(image_info->extract); + if (image_info->scenes != (char *) NULL) + image_info->scenes=DestroyString(image_info->scenes); + if (image_info->page != (char *) NULL) + image_info->page=DestroyString(image_info->page); + if (image_info->sampling_factor != (char *) NULL) + image_info->sampling_factor=DestroyString( + image_info->sampling_factor); + if (image_info->server_name != (char *) NULL) + image_info->server_name=DestroyString( + image_info->server_name); + if (image_info->font != (char *) NULL) + image_info->font=DestroyString(image_info->font); + if (image_info->texture != (char *) NULL) + image_info->texture=DestroyString(image_info->texture); + if (image_info->density != (char *) NULL) + image_info->density=DestroyString(image_info->density); + if (image_info->view != (char *) NULL) + image_info->view=DestroyString(image_info->view); + if (image_info->authenticate != (char *) NULL) + image_info->authenticate=DestroyString( + image_info->authenticate); + DestroyImageOptions(image_info); + if (image_info->cache != (void *) NULL) + image_info->cache=DestroyPixelCache(image_info->cache); + if (image_info->profile != (StringInfo *) NULL) + image_info->profile=(void *) DestroyStringInfo((StringInfo *) + image_info->profile); + image_info->signature=(~MagickCoreSignature); + image_info=(ImageInfo *) RelinquishMagickMemory(image_info); + return(image_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D i s a s s o c i a t e I m a g e S t r e a m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DisassociateImageStream() disassociates the image stream. It checks if the +% blob of the specified image is referenced by other images. If the reference +% count is higher then 1 a new blob is assigned to the specified image. +% +% The format of the DisassociateImageStream method is: +% +% void DisassociateImageStream(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport void DisassociateImageStream(Image *image) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + DisassociateBlob(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e C l i p M a s k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageClipMask() returns the clip path associated with the image. +% +% The format of the GetImageClipMask method is: +% +% Image *GetImageClipMask(const Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport Image *GetImageClipMask(const Image *image, + ExceptionInfo *exception) +{ + assert(image != (const Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + if (image->clip_mask == (Image *) NULL) + return((Image *) NULL); + return(CloneImage(image->clip_mask,0,0,MagickTrue,exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageException() traverses an image sequence and returns any +% error more severe than noted by the exception parameter. +% +% The format of the GetImageException method is: +% +% void GetImageException(Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: Specifies a pointer to a list of one or more images. +% +% o exception: return the highest severity exception. +% +*/ +MagickExport void GetImageException(Image *image,ExceptionInfo *exception) +{ + Image + *next; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + for (next=image; next != (Image *) NULL; next=GetNextImageInList(next)) + { + if (next->exception.severity == UndefinedException) + continue; + if (next->exception.severity > exception->severity) + InheritException(exception,&next->exception); + next->exception.severity=UndefinedException; + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageInfo() initializes image_info to default values. +% +% The format of the GetImageInfo method is: +% +% void GetImageInfo(ImageInfo *image_info) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +*/ +MagickExport void GetImageInfo(ImageInfo *image_info) +{ + char + *synchronize; + + ExceptionInfo + *exception; + + /* + File and image dimension members. + */ + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image_info != (ImageInfo *) NULL); + (void) memset(image_info,0,sizeof(*image_info)); + image_info->adjoin=MagickTrue; + image_info->interlace=NoInterlace; + image_info->channel=DefaultChannels; + image_info->quality=UndefinedCompressionQuality; + image_info->antialias=MagickTrue; + image_info->dither=MagickTrue; + synchronize=GetEnvironmentValue("MAGICK_SYNCHRONIZE"); + if (synchronize != (const char *) NULL) + { + image_info->synchronize=IsStringTrue(synchronize); + synchronize=DestroyString(synchronize); + } + exception=AcquireExceptionInfo(); + (void) QueryColorDatabase(BackgroundColor,&image_info->background_color, + exception); + (void) QueryColorDatabase(BorderColor,&image_info->border_color,exception); + (void) QueryColorDatabase(MatteColor,&image_info->matte_color,exception); + (void) QueryColorDatabase(TransparentColor,&image_info->transparent_color, + exception); + exception=DestroyExceptionInfo(exception); + image_info->debug=IsEventLogging(); + image_info->signature=MagickCoreSignature; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e I n f o F i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageInfoFile() returns the image info file member. +% +% The format of the GetImageInfoFile method is: +% +% FILE *GetImageInfoFile(const ImageInfo *image_info) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +*/ +MagickExport FILE *GetImageInfoFile(const ImageInfo *image_info) +{ + return(image_info->file); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e M a s k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageMask() returns the mask associated with the image. +% +% The format of the GetImageMask method is: +% +% Image *GetImageMask(const Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport Image *GetImageMask(const Image *image,ExceptionInfo *exception) +{ + assert(image != (const Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + if (image->mask == (Image *) NULL) + return((Image *) NULL); + return(CloneImage(image->mask,0,0,MagickTrue,exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e C h a n n e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageChannels() returns the number of pixel channels associated with the +% specified image. +% +% The format of the GetChannels method is: +% +% size_t GetImageChannels(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport size_t GetImageChannels(Image *image) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + return(image->channels); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t I m a g e R e f e r e n c e C o u n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageReferenceCount() returns the image reference count. +% +% The format of the GetReferenceCount method is: +% +% ssize_t GetImageReferenceCount(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport ssize_t GetImageReferenceCount(Image *image) +{ + ssize_t + reference_count; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + LockSemaphoreInfo(image->semaphore); + reference_count=image->reference_count; + UnlockSemaphoreInfo(image->semaphore); + return(reference_count); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e V i r t u a l P i x e l M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageVirtualPixelMethod() gets the "virtual pixels" method for the +% image. A virtual pixel is any pixel access that is outside the boundaries +% of the image cache. +% +% The format of the GetImageVirtualPixelMethod() method is: +% +% VirtualPixelMethod GetImageVirtualPixelMethod(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport VirtualPixelMethod GetImageVirtualPixelMethod(const Image *image) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + return(GetPixelCacheVirtualMethod(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I n t e r p r e t I m a g e F i l e n a m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% InterpretImageFilename() interprets embedded characters in an image filename. +% The filename length is returned. +% +% The format of the InterpretImageFilename method is: +% +% size_t InterpretImageFilename(const ImageInfo *image_info,Image *image, +% const char *format,int value,char *filename) +% +% A description of each parameter follows. +% +% o image_info: the image info.. +% +% o image: the image. +% +% o format: A filename describing the format to use to write the numeric +% argument. Only the first numeric format identifier is replaced. +% +% o value: Numeric value to substitute into format filename. +% +% o filename: return the formatted filename in this character buffer. +% +*/ +MagickExport size_t InterpretImageFilename(const ImageInfo *image_info, + Image *image,const char *format,int value,char *filename) +{ + char + *q; + + const char + *p; + + int + c; + + MagickBooleanType + canonical; + + ssize_t + field_width, + offset; + + canonical=MagickFalse; + offset=0; + (void) CopyMagickString(filename,format,MaxTextExtent); + if (IsStringTrue(GetImageOption(image_info,"filename:literal")) != MagickFalse) + return(strlen(filename)); + for (p=strchr(format,'%'); p != (char *) NULL; p=strchr(p+1,'%')) + { + q=(char *) p+1; + if (*q == '%') + { + p=q+1; + continue; + } + field_width=0; + if (*q == '0') + field_width=(ssize_t) strtol(q,&q,10); + switch (*q) + { + case 'd': + case 'o': + case 'x': + { + q++; + c=(*q); + *q='\0'; + (void) FormatLocaleString(filename+(p-format-offset),(size_t) + (MaxTextExtent-(p-format-offset)),p,value); + offset+=(4-field_width); + *q=c; + (void) ConcatenateMagickString(filename,q,MaxTextExtent); + canonical=MagickTrue; + if (*(q-1) != '%') + break; + p++; + break; + } + case '[': + { + char + pattern[MaxTextExtent]; + + const char + *value; + + char + *r; + + ssize_t + i; + + ssize_t + depth; + + /* + Image option. + */ + if (strchr(p,']') == (char *) NULL) + break; + depth=1; + r=q+1; + for (i=0; (i < (MaxTextExtent-1L)) && (*r != '\0'); i++) + { + if (*r == '[') + depth++; + if (*r == ']') + depth--; + if (depth <= 0) + break; + pattern[i]=(*r++); + } + pattern[i]='\0'; + if (LocaleNCompare(pattern,"filename:",9) != 0) + break; + value=(const char *) NULL; + if (image != (Image *) NULL) + value=GetImageProperty(image,pattern); + if ((value == (const char *) NULL) && + (image != (Image *) NULL)) + value=GetImageArtifact(image,pattern); + if ((value == (const char *) NULL) && + (image_info != (ImageInfo *) NULL)) + value=GetImageOption(image_info,pattern); + if (value == (const char *) NULL) + break; + q--; + c=(*q); + *q='\0'; + (void) CopyMagickString(filename+(p-format-offset),value,(size_t) + (MaxTextExtent-(p-format-offset))); + offset+=strlen(pattern)-strlen(value)+3; + *q=c; + (void) ConcatenateMagickString(filename,r+1,MaxTextExtent); + canonical=MagickTrue; + if (*(q-1) != '%') + break; + p++; + break; + } + default: + break; + } + } + if (canonical == MagickFalse) + (void) CopyMagickString(filename,format,MaxTextExtent); + else + for (q=filename; *q != '\0'; q++) + if ((*q == '%') && (*(q+1) == '%')) + (void) CopyMagickString(q,q+1,(size_t) (MaxTextExtent-(q-filename))); + return(strlen(filename)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s H i g h D y n a m i c R a n g e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsHighDynamicRangeImage() returns MagickTrue if any pixel component is +% non-integer or exceeds the bounds of the quantum depth (e.g. for Q16 +% 0..65535. +% +% The format of the IsHighDynamicRangeImage method is: +% +% MagickBooleanType IsHighDynamicRangeImage(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType IsHighDynamicRangeImage(const Image *image, + ExceptionInfo *exception) +{ +#if !defined(MAGICKCORE_HDRI_SUPPORT) + (void) image; + (void) exception; + return(MagickFalse); +#else + CacheView + *image_view; + + MagickBooleanType + status; + + MagickPixelPacket + zero; + + ssize_t + y; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=MagickTrue; + GetMagickPixelPacket(image,&zero); + image_view=AcquireVirtualCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + MagickPixelPacket + pixel; + + const IndexPacket + *indexes; + + const PixelPacket + *p; + + ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(image_view); + pixel=zero; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetMagickPixelPacket(image,p,indexes+x,&pixel); + if ((pixel.red < 0.0) || (pixel.red > QuantumRange) || + (pixel.red != (QuantumAny) pixel.red)) + break; + if ((pixel.green < 0.0) || (pixel.green > QuantumRange) || + (pixel.green != (QuantumAny) pixel.green)) + break; + if ((pixel.blue < 0.0) || (pixel.blue > QuantumRange) || + (pixel.blue != (QuantumAny) pixel.blue)) + break; + if (pixel.matte != MagickFalse) + { + if ((pixel.opacity < 0.0) || (pixel.opacity > QuantumRange) || + (pixel.opacity != (QuantumAny) pixel.opacity)) + break; + } + if (pixel.colorspace == CMYKColorspace) + { + if ((pixel.index < 0.0) || (pixel.index > QuantumRange) || + (pixel.index != (QuantumAny) pixel.index)) + break; + } + p++; + } + if (x < (ssize_t) image->columns) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + return(status != MagickFalse ? MagickFalse : MagickTrue); +#endif +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s I m a g e O b j e c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsImageObject() returns MagickTrue if the image sequence contains a valid +% set of image objects. +% +% The format of the IsImageObject method is: +% +% MagickBooleanType IsImageObject(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType IsImageObject(const Image *image) +{ + const Image + *p; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + for (p=image; p != (Image *) NULL; p=GetNextImageInList(p)) + if (p->signature != MagickCoreSignature) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s T a i n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsTaintImage() returns MagickTrue any pixel in the image has been altered +% since it was first constituted. +% +% The format of the IsTaintImage method is: +% +% MagickBooleanType IsTaintImage(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType IsTaintImage(const Image *image) +{ + char + magick[MaxTextExtent], + filename[MaxTextExtent]; + + const Image + *p; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + (void) CopyMagickString(magick,image->magick,MaxTextExtent); + (void) CopyMagickString(filename,image->filename,MaxTextExtent); + for (p=image; p != (Image *) NULL; p=GetNextImageInList(p)) + { + if (p->taint != MagickFalse) + return(MagickTrue); + if (LocaleCompare(p->magick,magick) != 0) + return(MagickTrue); + if (LocaleCompare(p->filename,filename) != 0) + return(MagickTrue); + } + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M o d i f y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ModifyImage() ensures that there is only a single reference to the image +% to be modified, updating the provided image pointer to point to a clone of +% the original image if necessary. +% +% The format of the ModifyImage method is: +% +% MagickBooleanType ModifyImage(Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType ModifyImage(Image **image, + ExceptionInfo *exception) +{ + Image + *clone_image; + + assert(image != (Image **) NULL); + assert(*image != (Image *) NULL); + assert((*image)->signature == MagickCoreSignature); + if ((*image)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename); + if (GetImageReferenceCount(*image) <= 1) + return(MagickTrue); + clone_image=CloneImage(*image,0,0,MagickTrue,exception); + LockSemaphoreInfo((*image)->semaphore); + (*image)->reference_count--; + UnlockSemaphoreInfo((*image)->semaphore); + *image=clone_image; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w M a g i c k I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewMagickImage() creates a blank image canvas of the specified size and +% background color. +% +% The format of the NewMagickImage method is: +% +% Image *NewMagickImage(const ImageInfo *image_info,const size_t width, +% const size_t height,const MagickPixelPacket *background) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o width: the image width. +% +% o height: the image height. +% +% o background: the image color. +% +*/ +MagickExport Image *NewMagickImage(const ImageInfo *image_info, + const size_t width,const size_t height,const MagickPixelPacket *background) +{ + CacheView + *image_view; + + ExceptionInfo + *exception; + + Image + *image; + + ssize_t + y; + + MagickBooleanType + status; + + assert(image_info != (const ImageInfo *) NULL); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image_info->signature == MagickCoreSignature); + assert(background != (const MagickPixelPacket *) NULL); + image=AcquireImage(image_info); + image->columns=width; + image->rows=height; + image->colorspace=background->colorspace; + image->matte=background->matte; + image->fuzz=background->fuzz; + image->depth=background->depth; + status=MagickTrue; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=QueueCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelPacket(image,background,q,indexes+x); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + if (status == MagickFalse) + image=DestroyImage(image); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e f e r e n c e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReferenceImage() increments the reference count associated with an image +% returning a pointer to the image. +% +% The format of the ReferenceImage method is: +% +% Image *ReferenceImage(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport Image *ReferenceImage(Image *image) +{ + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + LockSemaphoreInfo(image->semaphore); + image->reference_count++; + UnlockSemaphoreInfo(image->semaphore); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e s e t I m a g e P a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ResetImagePage() resets the image page canvas and position. +% +% The format of the ResetImagePage method is: +% +% MagickBooleanType ResetImagePage(Image *image,const char *page) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o page: the relative page specification. +% +*/ +MagickExport MagickBooleanType ResetImagePage(Image *image,const char *page) +{ + MagickStatusType + flags; + + RectangleInfo + geometry; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + flags=ParseAbsoluteGeometry(page,&geometry); + if ((flags & WidthValue) != 0) + { + if ((flags & HeightValue) == 0) + geometry.height=geometry.width; + image->page.width=geometry.width; + image->page.height=geometry.height; + } + if ((flags & AspectValue) != 0) + { + if ((flags & XValue) != 0) + image->page.x+=geometry.x; + if ((flags & YValue) != 0) + image->page.y+=geometry.y; + } + else + { + if ((flags & XValue) != 0) + { + image->page.x=geometry.x; + if ((image->page.width == 0) && (geometry.x > 0)) + image->page.width=image->columns+geometry.x; + } + if ((flags & YValue) != 0) + { + image->page.y=geometry.y; + if ((image->page.height == 0) && (geometry.y > 0)) + image->page.height=image->rows+geometry.y; + } + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e s e t I m a g e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ResetImagePixels() reset the image pixels, that is, all the pixel components +% are zereod. +% +% The format of the SetImage method is: +% +% MagickBooleanType ResetImagePixels(Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType ResetImagePixels(Image *image, + ExceptionInfo *exception) +{ + CacheView + *image_view; + + const void + *pixels; + + MagickBooleanType + status; + + MagickSizeType + length; + + ssize_t + y; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + pixels=AcquirePixelCachePixels(image,&length,exception); + if (pixels != (void *) NULL) + { + /* + Reset in-core image pixels. + */ + (void) memset((void *) pixels,0,(size_t) length); + return(MagickTrue); + } + /* + Reset image pixels. + */ + status=MagickTrue; + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=QueueCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + (void) memset(q,0,sizeof(PixelPacket)); + if ((image->storage_class == PseudoClass) || + (image->colorspace == CMYKColorspace)) + indexes[x]=0; + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e B a c k g r o u n d C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageBackgroundColor() initializes the image pixels to the image +% background color. The background color is defined by the background_color +% member of the image structure. +% +% The format of the SetImage method is: +% +% MagickBooleanType SetImageBackgroundColor(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType SetImageBackgroundColor(Image *image) +{ + CacheView + *image_view; + + ExceptionInfo + *exception; + + IndexPacket + index; + + MagickBooleanType + status; + + MagickPixelPacket + background; + + PixelPacket + pixel; + + ssize_t + y; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + if ((IsPixelGray(&image->background_color) == MagickFalse) && + (IsGrayColorspace(image->colorspace) != MagickFalse)) + (void) TransformImageColorspace(image,RGBColorspace); + if ((image->background_color.opacity != OpaqueOpacity) && + (image->matte == MagickFalse)) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + GetMagickPixelPacket(image,&background); + SetMagickPixelPacket(image,&image->background_color,(const IndexPacket *) + NULL,&background); + if (image->colorspace == CMYKColorspace) + ConvertRGBToCMYK(&background); + index=0; + pixel.opacity=OpaqueOpacity; + SetPixelPacket(image,&background,&pixel,&index); + /* + Set image background color. + */ + status=MagickTrue; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=QueueCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + *q++=pixel; + if (image->colorspace == CMYKColorspace) + { + IndexPacket + *magick_restrict indexes; + + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelIndex(indexes+x,index); + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e C h a n n e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageChannels() sets the number of pixels channels associated with the +% image. +% +% The format of the SetImageChannels method is: +% +% MagickBooleanType SetImageChannels(Image *image,const size_t channels) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channels: The number of pixel channels. +% +*/ +MagickExport MagickBooleanType SetImageChannels(Image *image, + const size_t channels) +{ + image->channels=channels; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageColor() set the entire image canvas to the specified color. +% +% The format of the SetImageColor method is: +% +% MagickBooleanType SetImageColor(Image *image, +% const MagickPixelPacket *color) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o background: the image color. +% +*/ +MagickExport MagickBooleanType SetImageColor(Image *image, + const MagickPixelPacket *color) +{ + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + ssize_t + y; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + assert(color != (const MagickPixelPacket *) NULL); + image->colorspace=color->colorspace; + image->matte=color->matte; + image->fuzz=color->fuzz; + image->depth=color->depth; + status=MagickTrue; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=QueueCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelPacket(image,color,q, + indexes == (IndexPacket *) NULL ? NULL : indexes+x); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e S t o r a g e C l a s s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageStorageClass() sets the image class: DirectClass for true color +% images or PseudoClass for colormapped images. +% +% The format of the SetImageStorageClass method is: +% +% MagickBooleanType SetImageStorageClass(Image *image, +% const ClassType storage_class) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o storage_class: The image class. +% +*/ +MagickExport MagickBooleanType SetImageStorageClass(Image *image, + const ClassType storage_class) +{ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + image->storage_class=storage_class; + return(SyncImagePixelCache(image,&image->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e C l i p M a s k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageClipMask() associates a clip path with the image. The clip path +% must be the same dimensions as the image. Set any pixel component of +% the clip path to TransparentOpacity to prevent that corresponding image +% pixel component from being updated when SyncAuthenticPixels() is applied. +% +% The format of the SetImageClipMask method is: +% +% MagickBooleanType SetImageClipMask(Image *image,const Image *clip_mask) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o clip_mask: the image clip path. +% +*/ +MagickExport MagickBooleanType SetImageClipMask(Image *image, + const Image *clip_mask) +{ + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + if (clip_mask != (const Image *) NULL) + if ((clip_mask->columns != image->columns) || + (clip_mask->rows != image->rows)) + ThrowBinaryImageException(ImageError,"ImageSizeDiffers",image->filename); + if (image->clip_mask != (Image *) NULL) + image->clip_mask=DestroyImage(image->clip_mask); + image->clip_mask=NewImageList(); + if (clip_mask == (Image *) NULL) + return(MagickTrue); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + image->clip_mask=CloneImage(clip_mask,0,0,MagickTrue,&image->exception); + if (image->clip_mask == (Image *) NULL) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e E x t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageExtent() sets the image size (i.e. columns & rows). +% +% The format of the SetImageExtent method is: +% +% MagickBooleanType SetImageExtent(Image *image,const size_t columns, +% const size_t rows) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o columns: The image width in pixels. +% +% o rows: The image height in pixels. +% +*/ +MagickExport MagickBooleanType SetImageExtent(Image *image,const size_t columns, + const size_t rows) +{ + if ((columns == 0) || (rows == 0)) + ThrowBinaryImageException(ImageError,"NegativeOrZeroImageSize", + image->filename); + image->columns=columns; + image->rows=rows; + if (image->depth == 0) + { + image->depth=8; + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ImageError,"ImageDepthNotSupported","`%s'",image->filename); + } + if (image->depth > (8*sizeof(MagickSizeType))) + { + image->depth=8*sizeof(MagickSizeType); + (void) ThrowMagickException(&image->exception,GetMagickModule(), + ImageError,"ImageDepthNotSupported","`%s'",image->filename); + } + return(SyncImagePixelCache(image,&image->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S e t I m a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageInfo() initializes the `magick' field of the ImageInfo structure. +% It is set to a type of image format based on the prefix or suffix of the +% filename. For example, `ps:image' returns PS indicating a Postscript image. +% JPEG is returned for this filename: `image.jpg'. The filename prefix has +% precendence over the suffix. Use an optional index enclosed in brackets +% after a file name to specify a desired scene of a multi-resolution image +% format like Photo CD (e.g. img0001.pcd[4]). A True (non-zero) return value +% indicates success. +% +% The format of the SetImageInfo method is: +% +% MagickBooleanType SetImageInfo(ImageInfo *image_info, +% const unsigned int frames,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o frames: the number of images you intend to write. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType SetImageInfo(ImageInfo *image_info, + const unsigned int frames,ExceptionInfo *exception) +{ + char + extension[MaxTextExtent], + filename[MaxTextExtent], + magic[MaxTextExtent], + *q, + subimage[MaxTextExtent]; + + const MagicInfo + *magic_info; + + const MagickInfo + *magick_info; + + ExceptionInfo + *sans_exception; + + Image + *image; + + MagickBooleanType + status; + + const char + *p; + + ssize_t + count; + + unsigned char + magick[2*MaxTextExtent]; + + /* + Look for 'image.format' in filename. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + *subimage='\0'; + GetPathComponent(image_info->filename,SubimagePath,subimage); + if (*subimage != '\0') + { + /* + Look for scene specification (e.g. img0001.pcd[4]). + */ + if (IsSceneGeometry(subimage,MagickFalse) == MagickFalse) + { + if (IsGeometry(subimage) != MagickFalse) + (void) CloneString(&image_info->extract,subimage); + } + else + { + size_t + first, + last; + + (void) CloneString(&image_info->scenes,subimage); + image_info->scene=StringToUnsignedLong(image_info->scenes); + image_info->number_scenes=image_info->scene; + p=image_info->scenes; + for (q=(char *) image_info->scenes; *q != '\0'; p++) + { + while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ',')) + p++; + first=(size_t) strtol(p,&q,10); + last=first; + while (isspace((int) ((unsigned char) *q)) != 0) + q++; + if (*q == '-') + last=(size_t) strtol(q+1,&q,10); + if (first > last) + Swap(first,last); + if (first < image_info->scene) + image_info->scene=first; + if (last > image_info->number_scenes) + image_info->number_scenes=last; + p=q; + } + image_info->number_scenes-=image_info->scene-1; + image_info->subimage=image_info->scene; + image_info->subrange=image_info->number_scenes; + } + } + *extension='\0'; + if (*image_info->magick == '\0') + GetPathComponent(image_info->filename,ExtensionPath,extension); + if (*extension != '\0') + { + char + path[MaxTextExtent]; + + /* + Base path sans any compression extension. + */ + GetPathComponent(image_info->filename,BasePathSansCompressExtension,path); + GetPathComponent(path,ExtensionPath,extension); + } + image_info->affirm=MagickFalse; + sans_exception=AcquireExceptionInfo(); + if ((*extension != '\0') && (IsGlob(extension) == MagickFalse)) + { + MagickFormatType + format_type; + + ssize_t + i; + + static const char + *format_type_formats[] = + { + "AUTOTRACE", + "BROWSE", + "DCRAW", + "EDIT", + "LAUNCH", + "MPEG:DECODE", + "MPEG:ENCODE", + "PRINT", + "PS:ALPHA", + "PS:CMYK", + "PS:COLOR", + "PS:GRAY", + "PS:MONO", + "SCAN", + "SHOW", + "WIN", + (char *) NULL + }; + + /* + User specified image format. + */ + (void) CopyMagickString(magic,extension,MaxTextExtent); + LocaleUpper(magic); + /* + Look for explicit image formats. + */ + format_type=UndefinedFormatType; + i=0; + while ((format_type == UndefinedFormatType) && + (format_type_formats[i] != (char *) NULL)) + { + if ((*magic == *format_type_formats[i]) && + (LocaleCompare(magic,format_type_formats[i]) == 0)) + format_type=ExplicitFormatType; + i++; + } + magick_info=GetMagickInfo(magic,sans_exception); + if ((magick_info != (const MagickInfo *) NULL) && + (magick_info->format_type != UndefinedFormatType)) + format_type=magick_info->format_type; + if (format_type == UndefinedFormatType) + (void) CopyMagickString(image_info->magick,magic,MaxTextExtent); + else + if (format_type == ExplicitFormatType) + { + image_info->affirm=MagickTrue; + (void) CopyMagickString(image_info->magick,magic,MaxTextExtent); + } + if (LocaleCompare(magic,"RGB") == 0) + image_info->affirm=MagickFalse; /* maybe SGI disguised as RGB */ + } + /* + Look for explicit 'format:image' in filename. + */ + *magic='\0'; + GetPathComponent(image_info->filename,MagickPath,magic); + if (*magic == '\0') + { + (void) CopyMagickString(magic,image_info->magick,MaxTextExtent); + magick_info=GetMagickInfo(magic,sans_exception); + if (frames == 0) + GetPathComponent(image_info->filename,CanonicalPath,filename); + else + GetPathComponent(image_info->filename,SubcanonicalPath,filename); + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + } + else + { + const DelegateInfo + *delegate_info; + + /* + User specified image format. + */ + LocaleUpper(magic); + magick_info=GetMagickInfo(magic,sans_exception); + delegate_info=GetDelegateInfo(magic,"*",sans_exception); + if (delegate_info == (const DelegateInfo *) NULL) + delegate_info=GetDelegateInfo("*",magic,sans_exception); + if (((magick_info != (const MagickInfo *) NULL) || + (delegate_info != (const DelegateInfo *) NULL)) && + (IsMagickConflict(magic) == MagickFalse)) + { + image_info->affirm=MagickTrue; + (void) CopyMagickString(image_info->magick,magic,MaxTextExtent); + GetPathComponent(image_info->filename,CanonicalPath,filename); + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + } + } + sans_exception=DestroyExceptionInfo(sans_exception); + if ((magick_info == (const MagickInfo *) NULL) || + (GetMagickEndianSupport(magick_info) == MagickFalse)) + image_info->endian=UndefinedEndian; + if ((image_info->adjoin != MagickFalse) && (frames > 1)) + { + /* + Test for multiple image support (e.g. image%02d.png). + */ + (void) InterpretImageFilename(image_info,(Image *) NULL, + image_info->filename,(int) image_info->scene,filename); + if ((LocaleCompare(filename,image_info->filename) != 0) && + (strchr(filename,'%') == (char *) NULL)) + image_info->adjoin=MagickFalse; + } + if ((image_info->adjoin != MagickFalse) && (frames > 0)) + { + /* + Some image formats do not support multiple frames per file. + */ + magick_info=GetMagickInfo(magic,exception); + if (magick_info != (const MagickInfo *) NULL) + if (GetMagickAdjoin(magick_info) == MagickFalse) + image_info->adjoin=MagickFalse; + } + if (image_info->affirm != MagickFalse) + return(MagickTrue); + if (frames == 0) + { + /* + Determine the image format from the first few bytes of the file. + */ + image=AcquireImage(image_info); + (void) CopyMagickString(image->filename,image_info->filename, + MaxTextExtent); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImage(image); + return(MagickFalse); + } + if ((IsBlobSeekable(image) == MagickFalse) || + (IsBlobExempt(image) != MagickFalse)) + { + /* + Copy image to a seekable temporary file. + */ + *filename='\0'; + status=ImageToFile(image,filename,exception); + (void) CloseBlob(image); + if (status == MagickFalse) + { + (void) RelinquishUniqueFileResource(filename); + image=DestroyImage(image); + return(MagickFalse); + } + SetImageInfoFile(image_info,(FILE *) NULL); + (void) CopyMagickString(image->filename,filename,MaxTextExtent); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + (void) RelinquishUniqueFileResource(filename); + image=DestroyImage(image); + return(MagickFalse); + } + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + image_info->temporary=MagickTrue; + } + (void) memset(magick,0,sizeof(magick)); + count=ReadBlob(image,2*MaxTextExtent,magick); + (void) SeekBlob(image,-((MagickOffsetType) count),SEEK_CUR); + (void) CloseBlob(image); + image=DestroyImage(image); + /* + Check magic.xml configuration file. + */ + sans_exception=AcquireExceptionInfo(); + magic_info=GetMagicInfo(magick,(size_t) count,sans_exception); + if ((magic_info != (const MagicInfo *) NULL) && + (GetMagicName(magic_info) != (char *) NULL)) + { + (void) CopyMagickString(image_info->magick,GetMagicName(magic_info), + MaxTextExtent); + magick_info=GetMagickInfo(image_info->magick,sans_exception); + if ((magick_info == (const MagickInfo *) NULL) || + (GetMagickEndianSupport(magick_info) == MagickFalse)) + image_info->endian=UndefinedEndian; + sans_exception=DestroyExceptionInfo(sans_exception); + return(MagickTrue); + } + magick_info=GetMagickInfo(image_info->magick,sans_exception); + if ((magick_info == (const MagickInfo *) NULL) || + (GetMagickEndianSupport(magick_info) == MagickFalse)) + image_info->endian=UndefinedEndian; + sans_exception=DestroyExceptionInfo(sans_exception); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e I n f o B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageInfoBlob() sets the image info blob member. +% +% The format of the SetImageInfoBlob method is: +% +% void SetImageInfoBlob(ImageInfo *image_info,const void *blob, +% const size_t length) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o blob: the blob. +% +% o length: the blob length. +% +*/ +MagickExport void SetImageInfoBlob(ImageInfo *image_info,const void *blob, + const size_t length) +{ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + image_info->blob=(void *) blob; + image_info->length=length; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e I n f o F i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageInfoFile() sets the image info file member. +% +% The format of the SetImageInfoFile method is: +% +% void SetImageInfoFile(ImageInfo *image_info,FILE *file) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o file: the file. +% +*/ +MagickExport void SetImageInfoFile(ImageInfo *image_info,FILE *file) +{ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + image_info->file=file; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e M a s k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageMask() associates a mask with the image. The mask must be the same +% dimensions as the image. +% +% The format of the SetImageMask method is: +% +% MagickBooleanType SetImageMask(Image *image,const Image *mask) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o mask: the image mask. +% +*/ +MagickExport MagickBooleanType SetImageMask(Image *image,const Image *mask) +{ + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + if (mask != (const Image *) NULL) + if ((mask->columns != image->columns) || (mask->rows != image->rows)) + ThrowBinaryImageException(ImageError,"ImageSizeDiffers",image->filename); + if (image->mask != (Image *) NULL) + image->mask=DestroyImage(image->mask); + image->mask=NewImageList(); + if (mask == (Image *) NULL) + return(MagickTrue); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + image->mask=CloneImage(mask,0,0,MagickTrue,&image->exception); + if (image->mask == (Image *) NULL) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e O p a c i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageOpacity() sets the opacity levels of the image. +% +% The format of the SetImageOpacity method is: +% +% MagickBooleanType SetImageOpacity(Image *image,const Quantum opacity) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o opacity: the level of transparency: 0 is fully opaque and QuantumRange is +% fully transparent. +% +*/ +MagickExport MagickBooleanType SetImageOpacity(Image *image, + const Quantum opacity) +{ + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + status; + + ssize_t + y; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + image->matte=MagickTrue; + status=MagickTrue; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelOpacity(q,opacity); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t I m a g e V i r t u a l P i x e l M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetImageVirtualPixelMethod() sets the "virtual pixels" method for the +% image and returns the previous setting. A virtual pixel is any pixel access +% that is outside the boundaries of the image cache. +% +% The format of the SetImageVirtualPixelMethod() method is: +% +% VirtualPixelMethod SetImageVirtualPixelMethod(const Image *image, +% const VirtualPixelMethod virtual_pixel_method) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o virtual_pixel_method: choose the type of virtual pixel. +% +*/ +MagickExport VirtualPixelMethod SetImageVirtualPixelMethod(const Image *image, + const VirtualPixelMethod virtual_pixel_method) +{ + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + return(SetPixelCacheVirtualMethod(image,virtual_pixel_method)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S m u s h I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SmushImages() takes all images from the current image pointer to the end +% of the image list and smushes them to each other top-to-bottom if the +% stack parameter is true, otherwise left-to-right. +% +% The current gravity setting now effects how the image is justified in the +% final image. +% +% The format of the SmushImages method is: +% +% Image *SmushImages(const Image *images,const MagickBooleanType stack, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o images: the image sequence. +% +% o stack: A value other than 0 stacks the images top-to-bottom. +% +% o offset: minimum distance in pixels between images. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static ssize_t SmushXGap(const Image *smush_image,const Image *images, + const ssize_t offset,ExceptionInfo *exception) +{ + CacheView + *left_view, + *right_view; + + const Image + *left_image, + *right_image; + + RectangleInfo + left_geometry, + right_geometry; + + const PixelPacket + *p; + + ssize_t + i, + y; + + size_t + gap; + + ssize_t + x; + + if (images->previous == (Image *) NULL) + return(0); + right_image=images; + SetGeometry(smush_image,&right_geometry); + GravityAdjustGeometry(right_image->columns,right_image->rows, + right_image->gravity,&right_geometry); + left_image=images->previous; + SetGeometry(smush_image,&left_geometry); + GravityAdjustGeometry(left_image->columns,left_image->rows, + left_image->gravity,&left_geometry); + gap=right_image->columns; + left_view=AcquireVirtualCacheView(left_image,exception); + right_view=AcquireVirtualCacheView(right_image,exception); + for (y=0; y < (ssize_t) smush_image->rows; y++) + { + for (x=(ssize_t) left_image->columns-1; x > 0; x--) + { + p=GetCacheViewVirtualPixels(left_view,x,left_geometry.y+y,1,1,exception); + if ((p == (const PixelPacket *) NULL) || + (GetPixelOpacity(p) != TransparentOpacity) || + ((left_image->columns-x-1) >= gap)) + break; + } + i=(ssize_t) left_image->columns-x-1; + for (x=0; x < (ssize_t) right_image->columns; x++) + { + p=GetCacheViewVirtualPixels(right_view,x,right_geometry.y+y,1,1, + exception); + if ((p == (const PixelPacket *) NULL) || + (GetPixelOpacity(p) != TransparentOpacity) || + ((x+i) >= (ssize_t) gap)) + break; + } + if ((x+i) < (ssize_t) gap) + gap=(size_t) (x+i); + } + right_view=DestroyCacheView(right_view); + left_view=DestroyCacheView(left_view); + if (y < (ssize_t) smush_image->rows) + return(offset); + return((ssize_t) gap-offset); +} + +static ssize_t SmushYGap(const Image *smush_image,const Image *images, + const ssize_t offset,ExceptionInfo *exception) +{ + CacheView + *bottom_view, + *top_view; + + const Image + *bottom_image, + *top_image; + + RectangleInfo + bottom_geometry, + top_geometry; + + const PixelPacket + *p; + + ssize_t + i, + x; + + size_t + gap; + + ssize_t + y; + + if (images->previous == (Image *) NULL) + return(0); + bottom_image=images; + SetGeometry(smush_image,&bottom_geometry); + GravityAdjustGeometry(bottom_image->columns,bottom_image->rows, + bottom_image->gravity,&bottom_geometry); + top_image=images->previous; + SetGeometry(smush_image,&top_geometry); + GravityAdjustGeometry(top_image->columns,top_image->rows,top_image->gravity, + &top_geometry); + gap=bottom_image->rows; + top_view=AcquireVirtualCacheView(top_image,exception); + bottom_view=AcquireVirtualCacheView(bottom_image,exception); + for (x=0; x < (ssize_t) smush_image->columns; x++) + { + for (y=(ssize_t) top_image->rows-1; y > 0; y--) + { + p=GetCacheViewVirtualPixels(top_view,top_geometry.x+x,y,1,1,exception); + if ((p == (const PixelPacket *) NULL) || + (GetPixelOpacity(p) != TransparentOpacity) || + ((top_image->rows-y-1) >= gap)) + break; + } + i=(ssize_t) top_image->rows-y-1; + for (y=0; y < (ssize_t) bottom_image->rows; y++) + { + p=GetCacheViewVirtualPixels(bottom_view,bottom_geometry.x+x,y,1,1, + exception); + if ((p == (const PixelPacket *) NULL) || + (GetPixelOpacity(p) != TransparentOpacity) || + ((y+i) >= (ssize_t) gap)) + break; + } + if ((y+i) < (ssize_t) gap) + gap=(size_t) (y+i); + } + bottom_view=DestroyCacheView(bottom_view); + top_view=DestroyCacheView(top_view); + if (x < (ssize_t) smush_image->columns) + return(offset); + return((ssize_t) gap-offset); +} + +MagickExport Image *SmushImages(const Image *images, + const MagickBooleanType stack,const ssize_t offset,ExceptionInfo *exception) +{ +#define SmushImageTag "Smush/Image" + + CacheView + *smush_view; + + const Image + *image; + + Image + *smush_image; + + MagickBooleanType + matte, + proceed, + status; + + MagickOffsetType + n; + + RectangleInfo + geometry; + + const Image + *next; + + size_t + height, + number_images, + width; + + ssize_t + x_offset, + y_offset; + + /* + Compute maximum area of smushed area. + */ + assert(images != (Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=images; + matte=image->matte; + number_images=1; + width=image->columns; + height=image->rows; + next=GetNextImageInList(image); + for ( ; next != (Image *) NULL; next=GetNextImageInList(next)) + { + if (next->matte != MagickFalse) + matte=MagickTrue; + number_images++; + if (stack != MagickFalse) + { + if (next->columns > width) + width=next->columns; + height+=next->rows; + if (next->previous != (Image *) NULL) + height+=offset; + continue; + } + width+=next->columns; + if (next->previous != (Image *) NULL) + width+=offset; + if (next->rows > height) + height=next->rows; + } + /* + Smush images. + */ + smush_image=CloneImage(image,width,height,MagickTrue,exception); + if (smush_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(smush_image,DirectClass) == MagickFalse) + { + InheritException(exception,&smush_image->exception); + smush_image=DestroyImage(smush_image); + return((Image *) NULL); + } + smush_image->matte=matte; + (void) SetImageBackgroundColor(smush_image); + status=MagickTrue; + x_offset=0; + y_offset=0; + smush_view=AcquireVirtualCacheView(smush_image,exception); + for (n=0; n < (MagickOffsetType) number_images; n++) + { + SetGeometry(smush_image,&geometry); + GravityAdjustGeometry(image->columns,image->rows,image->gravity,&geometry); + if (stack != MagickFalse) + { + x_offset-=geometry.x; + y_offset-=SmushYGap(smush_image,image,offset,exception); + } + else + { + x_offset-=SmushXGap(smush_image,image,offset,exception); + y_offset-=geometry.y; + } + status=CompositeImage(smush_image,OverCompositeOp,image,x_offset,y_offset); + proceed=SetImageProgress(image,SmushImageTag,n,number_images); + if (proceed == MagickFalse) + break; + if (stack == MagickFalse) + { + x_offset+=(ssize_t) image->columns; + y_offset=0; + } + else + { + x_offset=0; + y_offset+=(ssize_t) image->rows; + } + image=GetNextImageInList(image); + } + if (stack == MagickFalse) + smush_image->columns=(size_t) x_offset; + else + smush_image->rows=(size_t) y_offset; + smush_view=DestroyCacheView(smush_view); + if (status == MagickFalse) + smush_image=DestroyImage(smush_image); + return(smush_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S t r i p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% StripImage() strips an image of all profiles and comments. +% +% The format of the StripImage method is: +% +% MagickBooleanType StripImage(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickExport MagickBooleanType StripImage(Image *image) +{ + MagickBooleanType + status; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + DestroyImageProfiles(image); + (void) DeleteImageProperty(image,"comment"); + (void) DeleteImageProperty(image,"date:create"); + (void) DeleteImageProperty(image,"date:modify"); + status=SetImageArtifact(image,"png:exclude-chunk", + "bKGD,caNv,cHRM,eXIf,gAMA,iCCP,iTXt,pHYs,sRGB,tEXt,zCCP,zTXt,date"); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S y n c I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncImage() initializes the red, green, and blue intensities of each pixel +% as defined by the colormap index. +% +% The format of the SyncImage method is: +% +% MagickBooleanType SyncImage(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ + +static inline IndexPacket PushColormapIndex(Image *image, + const size_t index,MagickBooleanType *range_exception) +{ + if (index < image->colors) + return((IndexPacket) index); + *range_exception=MagickTrue; + return((IndexPacket) 0); +} + +MagickExport MagickBooleanType SyncImage(Image *image) +{ + CacheView + *image_view; + + ExceptionInfo + *exception; + + MagickBooleanType + range_exception, + status, + taint; + + ssize_t + y; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickCoreSignature); + if (image->ping != MagickFalse) + return(MagickTrue); + if (image->storage_class != PseudoClass) + return(MagickFalse); + assert(image->colormap != (PixelPacket *) NULL); + range_exception=MagickFalse; + status=MagickTrue; + taint=image->taint; + exception=(&image->exception); + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(range_exception,status) \ + magick_number_threads(image,image,image->rows,1) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + IndexPacket + index; + + IndexPacket + *magick_restrict indexes; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (ssize_t) image->columns; x++) + { + index=PushColormapIndex(image,(size_t) GetPixelIndex(indexes+x), + &range_exception); + if (image->matte == MagickFalse) + SetPixelRgb(q,image->colormap+(ssize_t) index) + else + SetPixelRGBO(q,image->colormap+(ssize_t) index); + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + image->taint=taint; + if ((image->ping == MagickFalse) && (range_exception != MagickFalse)) + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CorruptImageWarning,"InvalidColormapIndex","`%s'",image->filename); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S y n c I m a g e S e t t i n g s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncImageSettings() syncs image_info options into per-image attributes. +% +% The format of the SyncImageSettings method is: +% +% MagickBooleanType SyncImageSettings(const ImageInfo *image_info, +% Image *image) +% MagickBooleanType SyncImagesSettings(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o image: the image. +% +*/ + +MagickExport MagickBooleanType SyncImagesSettings(ImageInfo *image_info, + Image *images) +{ + Image + *image; + + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(images != (Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + image=images; + for ( ; image != (Image *) NULL; image=GetNextImageInList(image)) + (void) SyncImageSettings(image_info,image); + (void) DeleteImageOption(image_info,"page"); + return(MagickTrue); +} + +MagickExport MagickBooleanType SyncImageSettings(const ImageInfo *image_info, + Image *image) +{ + char + property[MaxTextExtent]; + + const char + *option, + *value; + + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + ResolutionType + units; + + /* + Sync image options. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + option=GetImageOption(image_info,"background"); + if (option != (const char *) NULL) + (void) QueryColorDatabase(option,&image->background_color, + &image->exception); + option=GetImageOption(image_info,"bias"); + if (option != (const char *) NULL) + image->bias=StringToDoubleInterval(option,(double) QuantumRange+1.0); + option=GetImageOption(image_info,"black-point-compensation"); + if (option != (const char *) NULL) + image->black_point_compensation=(MagickBooleanType) ParseCommandOption( + MagickBooleanOptions,MagickFalse,option); + option=GetImageOption(image_info,"blue-primary"); + if (option != (const char *) NULL) + { + flags=ParseGeometry(option,&geometry_info); + if ((flags & RhoValue) != 0) + image->chromaticity.blue_primary.x=geometry_info.rho; + image->chromaticity.blue_primary.y=image->chromaticity.blue_primary.x; + if ((flags & SigmaValue) != 0) + image->chromaticity.blue_primary.y=geometry_info.sigma; + } + option=GetImageOption(image_info,"bordercolor"); + if (option != (const char *) NULL) + (void) QueryColorDatabase(option,&image->border_color,&image->exception); + option=GetImageOption(image_info,"colors"); + if (option != (const char *) NULL) + image->colors=StringToUnsignedLong(option); + option=GetImageOption(image_info,"compose"); + if (option != (const char *) NULL) + image->compose=(CompositeOperator) ParseCommandOption(MagickComposeOptions, + MagickFalse,option); + option=GetImageOption(image_info,"compress"); + if (option != (const char *) NULL) + image->compression=(CompressionType) ParseCommandOption( + MagickCompressOptions,MagickFalse,option); + option=GetImageOption(image_info,"debug"); + if (option != (const char *) NULL) + image->debug=(MagickBooleanType) ParseCommandOption(MagickBooleanOptions, + MagickFalse,option); + option=GetImageOption(image_info,"density"); + if (option != (const char *) NULL) + { + GeometryInfo + geometry_info; + + /* + Set image density. + */ + flags=ParseGeometry(option,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + option=GetImageOption(image_info,"depth"); + if (option != (const char *) NULL) + image->depth=StringToUnsignedLong(option); + option=GetImageOption(image_info,"endian"); + if (option != (const char *) NULL) + image->endian=(EndianType) ParseCommandOption(MagickEndianOptions, + MagickFalse,option); + option=GetImageOption(image_info,"filter"); + if (option != (const char *) NULL) + image->filter=(FilterTypes) ParseCommandOption(MagickFilterOptions, + MagickFalse,option); + option=GetImageOption(image_info,"fuzz"); + if (option != (const char *) NULL) + image->fuzz=StringToDoubleInterval(option,(double) QuantumRange+1.0); + option=GetImageOption(image_info,"gravity"); + if (option != (const char *) NULL) + image->gravity=(GravityType) ParseCommandOption(MagickGravityOptions, + MagickFalse,option); + option=GetImageOption(image_info,"green-primary"); + if (option != (const char *) NULL) + { + flags=ParseGeometry(option,&geometry_info); + if ((flags & RhoValue) != 0) + image->chromaticity.green_primary.x=geometry_info.rho; + image->chromaticity.green_primary.y=image->chromaticity.green_primary.x; + if ((flags & SigmaValue) != 0) + image->chromaticity.green_primary.y=geometry_info.sigma; + } + option=GetImageOption(image_info,"intensity"); + if (option != (const char *) NULL) + image->intensity=(PixelIntensityMethod) ParseCommandOption( + MagickPixelIntensityOptions,MagickFalse,option); + option=GetImageOption(image_info,"intent"); + if (option != (const char *) NULL) + image->rendering_intent=(RenderingIntent) ParseCommandOption( + MagickIntentOptions,MagickFalse,option); + option=GetImageOption(image_info,"interlace"); + if (option != (const char *) NULL) + image->interlace=(InterlaceType) ParseCommandOption(MagickInterlaceOptions, + MagickFalse,option); + option=GetImageOption(image_info,"interpolate"); + if (option != (const char *) NULL) + image->interpolate=(InterpolatePixelMethod) ParseCommandOption( + MagickInterpolateOptions,MagickFalse,option); + option=GetImageOption(image_info,"loop"); + if (option != (const char *) NULL) + image->iterations=StringToUnsignedLong(option); + option=GetImageOption(image_info,"mattecolor"); + if (option != (const char *) NULL) + (void) QueryColorDatabase(option,&image->matte_color,&image->exception); + option=GetImageOption(image_info,"orient"); + if (option != (const char *) NULL) + image->orientation=(OrientationType) ParseCommandOption( + MagickOrientationOptions,MagickFalse,option); + option=GetImageOption(image_info,"page"); + if (option != (const char *) NULL) + { + char + *geometry; + + geometry=GetPageGeometry(option); + flags=ParseAbsoluteGeometry(geometry,&image->page); + geometry=DestroyString(geometry); + } + option=GetImageOption(image_info,"quality"); + if (option != (const char *) NULL) + image->quality=StringToUnsignedLong(option); + option=GetImageOption(image_info,"red-primary"); + if (option != (const char *) NULL) + { + flags=ParseGeometry(option,&geometry_info); + if ((flags & RhoValue) != 0) + image->chromaticity.red_primary.x=geometry_info.rho; + image->chromaticity.red_primary.y=image->chromaticity.red_primary.x; + if ((flags & SigmaValue) != 0) + image->chromaticity.red_primary.y=geometry_info.sigma; + } + if (image_info->quality != UndefinedCompressionQuality) + image->quality=image_info->quality; + option=GetImageOption(image_info,"scene"); + if (option != (const char *) NULL) + image->scene=StringToUnsignedLong(option); + option=GetImageOption(image_info,"taint"); + if (option != (const char *) NULL) + image->taint=(MagickBooleanType) ParseCommandOption(MagickBooleanOptions, + MagickFalse,option); + option=GetImageOption(image_info,"tile-offset"); + if (option != (const char *) NULL) + { + char + *geometry; + + geometry=GetPageGeometry(option); + flags=ParseAbsoluteGeometry(geometry,&image->tile_offset); + geometry=DestroyString(geometry); + } + option=GetImageOption(image_info,"transparent-color"); + if (option != (const char *) NULL) + (void) QueryColorDatabase(option,&image->transparent_color, + &image->exception); + option=GetImageOption(image_info,"type"); + if (option != (const char *) NULL) + image->type=(ImageType) ParseCommandOption(MagickTypeOptions,MagickFalse, + option); + option=GetImageOption(image_info,"units"); + units=image_info->units; + if (option != (const char *) NULL) + units=(ResolutionType) ParseCommandOption(MagickResolutionOptions, + MagickFalse,option); + if (units != UndefinedResolution) + { + if (image->units != units) + switch (image->units) + { + case PixelsPerInchResolution: + { + if (units == PixelsPerCentimeterResolution) + { + image->x_resolution/=2.54; + image->y_resolution/=2.54; + } + break; + } + case PixelsPerCentimeterResolution: + { + if (units == PixelsPerInchResolution) + { + image->x_resolution=(double) ((size_t) (100.0*2.54* + image->x_resolution+0.5))/100.0; + image->y_resolution=(double) ((size_t) (100.0*2.54* + image->y_resolution+0.5))/100.0; + } + break; + } + default: + break; + } + image->units=units; + option=GetImageOption(image_info,"density"); + if (option != (const char *) NULL) + { + flags=ParseGeometry(option,&geometry_info); + if ((flags & RhoValue) != 0) + image->x_resolution=geometry_info.rho; + image->y_resolution=image->x_resolution; + if ((flags & SigmaValue) != 0) + image->y_resolution=geometry_info.sigma; + } + } + option=GetImageOption(image_info,"white-point"); + if (option != (const char *) NULL) + { + flags=ParseGeometry(option,&geometry_info); + if ((flags & RhoValue) != 0) + image->chromaticity.white_point.x=geometry_info.rho; + image->chromaticity.white_point.y=image->chromaticity.white_point.x; + if ((flags & SigmaValue) != 0) + image->chromaticity.white_point.y=geometry_info.sigma; + } + ResetImageOptionIterator(image_info); + for (option=GetNextImageOption(image_info); option != (const char *) NULL; ) + { + value=GetImageOption(image_info,option); + if (value != (const char *) NULL) + { + (void) FormatLocaleString(property,MaxTextExtent,"%s",option); + (void) SetImageArtifact(image,property,value); + } + option=GetNextImageOption(image_info); + } + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/magick/image.h b/ImageMagick-6.9.12-44/magick/image.h new file mode 100644 index 0000000..2e0b960 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/image.h @@ -0,0 +1,582 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image methods. +*/ +#ifndef MAGICKCORE_IMAGE_H +#define MAGICKCORE_IMAGE_H + +#include "magick/color.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define OpaqueOpacity ((Quantum) 0UL) +#define TransparentOpacity (QuantumRange) + +typedef enum +{ + UndefinedAlphaChannel, + ActivateAlphaChannel, + BackgroundAlphaChannel, + CopyAlphaChannel, + DeactivateAlphaChannel, + ExtractAlphaChannel, + OpaqueAlphaChannel, + ResetAlphaChannel, /* deprecated */ + SetAlphaChannel, + ShapeAlphaChannel, + TransparentAlphaChannel, + FlattenAlphaChannel, + RemoveAlphaChannel, + AssociateAlphaChannel, + DisassociateAlphaChannel +} AlphaChannelType; + +typedef enum +{ + UndefinedType, + BilevelType, + GrayscaleType, + GrayscaleMatteType, + PaletteType, + PaletteMatteType, + TrueColorType, + TrueColorMatteType, + ColorSeparationType, + ColorSeparationMatteType, + OptimizeType, + PaletteBilevelMatteType +} ImageType; + +typedef enum +{ + UndefinedInterlace, + NoInterlace, + LineInterlace, + PlaneInterlace, + PartitionInterlace, + GIFInterlace, + JPEGInterlace, + PNGInterlace +} InterlaceType; + +typedef enum +{ + UndefinedOrientation, + TopLeftOrientation, + TopRightOrientation, + BottomRightOrientation, + BottomLeftOrientation, + LeftTopOrientation, + RightTopOrientation, + RightBottomOrientation, + LeftBottomOrientation +} OrientationType; + +typedef enum +{ + UndefinedResolution, + PixelsPerInchResolution, + PixelsPerCentimeterResolution +} ResolutionType; + +typedef struct _PrimaryInfo +{ + double + x, + y, + z; +} PrimaryInfo; + +typedef struct _SegmentInfo +{ + double + x1, + y1, + x2, + y2; +} SegmentInfo; + +typedef enum +{ + UndefinedTransmitType, + FileTransmitType, + BlobTransmitType, + StreamTransmitType, + ImageTransmitType +} TransmitType; + +typedef struct _ChromaticityInfo +{ + PrimaryInfo + red_primary, + green_primary, + blue_primary, + white_point; +} ChromaticityInfo; + +#include "magick/blob.h" +#include "magick/colorspace.h" +#include "magick/cache-view.h" +#include "magick/color.h" +#include "magick/composite.h" +#include "magick/compress.h" +#include "magick/effect.h" +#include "magick/geometry.h" +#include "magick/layer.h" +#include "magick/locale_.h" +#include "magick/monitor.h" +#include "magick/pixel.h" +#include "magick/profile.h" +#include "magick/quantum.h" +#include "magick/resample.h" +#include "magick/resize.h" +#include "magick/semaphore.h" +#include "magick/stream.h" +#include "magick/timer.h" + +struct _Image +{ + ClassType + storage_class; + + ColorspaceType + colorspace; /* colorspace of image data */ + + CompressionType + compression; /* compression of image when read/write */ + + size_t + quality; /* compression quality setting, meaning varies */ + + OrientationType + orientation; /* photo orientation of image */ + + MagickBooleanType + taint, /* has image been modified since reading */ + matte; /* is transparency channel defined and active */ + + size_t + columns, /* physical size of image */ + rows, + depth, /* depth of image on read/write */ + colors; /* size of color table on read */ + + PixelPacket + *colormap, + background_color, /* current background color attribute */ + border_color, /* current bordercolor attribute */ + matte_color; /* current mattecolor attribute */ + + double + gamma; + + ChromaticityInfo + chromaticity; + + RenderingIntent + rendering_intent; + + void + *profiles; + + ResolutionType + units; /* resolution/density ppi or ppc */ + + char + *montage, + *directory, + *geometry; + + ssize_t + offset; + + double + x_resolution, /* image resolution/density */ + y_resolution; + + RectangleInfo + page, /* virtual canvas size and offset of image */ + extract_info, + tile_info; /* deprecated */ + + double + bias, + blur, /* deprecated */ + fuzz; /* current color fuzz attribute */ + + FilterTypes + filter; /* resize/distort filter to apply */ + + InterlaceType + interlace; + + EndianType + endian; /* raw data integer ordering on read/write */ + + GravityType + gravity; /* Gravity attribute for positioning in image */ + + CompositeOperator + compose; /* alpha composition method for layered images */ + + DisposeType + dispose; /* GIF animation disposal method */ + + struct _Image + *clip_mask; + + size_t + scene, /* index of image in multi-image file */ + delay; /* Animation delay time */ + + ssize_t + ticks_per_second; /* units for delay time, default 100 for GIF */ + + size_t + iterations, + total_colors; + + ssize_t + start_loop; + + ErrorInfo + error; + + TimerInfo + timer; + + MagickProgressMonitor + progress_monitor; + + void + *client_data, + *cache, + *attributes; /* deprecated */ + + Ascii85Info + *ascii85; + + BlobInfo + *blob; + + char + filename[MaxTextExtent], /* images input filename */ + magick_filename[MaxTextExtent], /* ditto with coders, and read_mods */ + magick[MaxTextExtent]; /* Coder used to decode image */ + + size_t + magick_columns, + magick_rows; + + ExceptionInfo + exception; /* Error handling report */ + + MagickBooleanType + debug; /* debug output attribute */ + + volatile ssize_t + reference_count; + + SemaphoreInfo + *semaphore; + + ProfileInfo + color_profile, + iptc_profile, + *generic_profile; + + size_t + generic_profiles; /* this & ProfileInfo is deprecated */ + + size_t + signature; + + struct _Image + *previous, /* Image list links */ + *list, /* Undo/Redo image processing list (for display) */ + *next; /* Image list links */ + + InterpolatePixelMethod + interpolate; /* Interpolation of color for between pixel lookups */ + + MagickBooleanType + black_point_compensation; + + PixelPacket + transparent_color; /* color for 'transparent' color index in GIF */ + + struct _Image + *mask; + + RectangleInfo + tile_offset; + + void + *properties, /* per image properities */ + *artifacts; /* per image sequence image artifacts */ + + ImageType + type; + + MagickBooleanType + dither; /* dithering method during color reduction */ + + MagickSizeType + extent; + + MagickBooleanType + ping; + + size_t + channels; + + time_t + timestamp; + + PixelIntensityMethod + intensity; /* method to generate an intensity value from a pixel */ + + size_t + duration; /* Total animation duration sum(delay*iterations) */ + + long + tietz_offset; +}; + +struct _ImageInfo +{ + CompressionType + compression; + + OrientationType + orientation; + + MagickBooleanType + temporary, + adjoin, + affirm, + antialias; + + char + *size, + *extract, + *page, + *scenes; + + size_t + scene, + number_scenes, + depth; + + InterlaceType + interlace; + + EndianType + endian; + + ResolutionType + units; + + size_t + quality; + + char + *sampling_factor, /* Chroma subsampling ratio string */ + *server_name, + *font, + *texture, + *density; + + double + pointsize, + fuzz; + + PixelPacket + background_color, + border_color, + matte_color; + + MagickBooleanType + dither, + monochrome; + + size_t + colors; + + ColorspaceType + colorspace; + + ImageType + type; + + PreviewType + preview_type; + + ssize_t + group; + + MagickBooleanType + ping, + verbose; + + char + *view, + *authenticate; + + ChannelType + channel; + + Image + *attributes; /* deprecated */ + + void + *options; + + MagickProgressMonitor + progress_monitor; + + void + *client_data, + *cache; + + StreamHandler + stream; + + FILE + *file; + + void + *blob; + + size_t + length; + + char + magick[MaxTextExtent], + unique[MaxTextExtent], + zero[MaxTextExtent], + filename[MaxTextExtent]; + + MagickBooleanType + debug; + + char + *tile; /* deprecated */ + + size_t + subimage, /* deprecated */ + subrange; /* deprecated */ + + PixelPacket + pen; /* deprecated */ + + size_t + signature; + + VirtualPixelMethod + virtual_pixel_method; + + PixelPacket + transparent_color; + + void + *profile; + + MagickBooleanType + synchronize; +}; + +extern MagickExport ExceptionType + CatchImageException(Image *); + +extern MagickExport FILE + *GetImageInfoFile(const ImageInfo *); + +extern MagickExport Image + *AcquireImage(const ImageInfo *), + *AppendImages(const Image *,const MagickBooleanType,ExceptionInfo *), + *CloneImage(const Image *,const size_t,const size_t,const MagickBooleanType, + ExceptionInfo *), + *DestroyImage(Image *), + *GetImageClipMask(const Image *,ExceptionInfo *) magick_attribute((__pure__)), + *GetImageMask(const Image *,ExceptionInfo *) magick_attribute((__pure__)), + *NewMagickImage(const ImageInfo *,const size_t,const size_t, + const MagickPixelPacket *), + *ReferenceImage(Image *), + *SmushImages(const Image *,const MagickBooleanType,const ssize_t, + ExceptionInfo *); + +extern MagickExport ImageInfo + *AcquireImageInfo(void), + *CloneImageInfo(const ImageInfo *), + *DestroyImageInfo(ImageInfo *); + +extern MagickExport MagickBooleanType + ClipImage(Image *), + ClipImagePath(Image *,const char *,const MagickBooleanType), + CopyImagePixels(Image *,const Image *,const RectangleInfo *, + const OffsetInfo *,ExceptionInfo *), + IsTaintImage(const Image *), + IsMagickConflict(const char *) magick_attribute((__pure__)), + IsHighDynamicRangeImage(const Image *,ExceptionInfo *), + IsImageObject(const Image *), + ListMagickInfo(FILE *,ExceptionInfo *), + ModifyImage(Image **,ExceptionInfo *), + ResetImagePage(Image *,const char *), + ResetImagePixels(Image *,ExceptionInfo *), + SetImageBackgroundColor(Image *), + SetImageClipMask(Image *,const Image *), + SetImageColor(Image *,const MagickPixelPacket *), + SetImageExtent(Image *,const size_t,const size_t), + SetImageInfo(ImageInfo *,const unsigned int,ExceptionInfo *), + SetImageMask(Image *,const Image *), + SetImageOpacity(Image *,const Quantum), + SetImageChannels(Image *,const size_t), + SetImageStorageClass(Image *,const ClassType), + StripImage(Image *), + SyncImage(Image *), + SyncImageSettings(const ImageInfo *,Image *), + SyncImagesSettings(ImageInfo *,Image *); + +extern MagickExport size_t + InterpretImageFilename(const ImageInfo *,Image *,const char *,int,char *); + +extern MagickExport ssize_t + GetImageReferenceCount(Image *); + +extern MagickExport size_t + GetImageChannels(Image *); + +extern MagickExport VirtualPixelMethod + GetImageVirtualPixelMethod(const Image *), + SetImageVirtualPixelMethod(const Image *,const VirtualPixelMethod); + +extern MagickExport void + AcquireNextImage(const ImageInfo *,Image *), + DestroyImagePixels(Image *), + DisassociateImageStream(Image *), + GetImageException(Image *,ExceptionInfo *), + GetImageInfo(ImageInfo *), + SetImageInfoBlob(ImageInfo *,const void *,const size_t), + SetImageInfoFile(ImageInfo *,FILE *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/layer.c b/ImageMagick-6.9.12-44/magick/layer.c new file mode 100644 index 0000000..4af34b7 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/layer.c @@ -0,0 +1,2098 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% L AAA Y Y EEEEE RRRR % +% L A A Y Y E R R % +% L AAAAA Y EEE RRRR % +% L A A Y E R R % +% LLLLL A A Y EEEEE R R % +% % +% MagickCore Image Layering Methods % +% % +% Software Design % +% Cristy % +% Anthony Thyssen % +% January 2006 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/attribute.h" +#include "magick/cache.h" +#include "magick/channel.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/composite.h" +#include "magick/effect.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/geometry.h" +#include "magick/image.h" +#include "magick/layer.h" +#include "magick/list.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-private.h" +#include "magick/property.h" +#include "magick/profile.h" +#include "magick/resource_.h" +#include "magick/resize.h" +#include "magick/statistic.h" +#include "magick/string_.h" +#include "magick/transform.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C l e a r B o u n d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClearBounds() Clear the area specified by the bounds in an image to +% transparency. This typically used to handle Background Disposal for the +% previous frame in an animation sequence. +% +% Warning: no bounds checks are performed, except for the null or missed +% image, for images that don't change. in all other cases bound must fall +% within the image. +% +% The format is: +% +% void ClearBounds(Image *image,RectangleInfo *bounds) +% +% A description of each parameter follows: +% +% o image: the image to had the area cleared in +% +% o bounds: the area to be clear within the imag image +% +*/ +static void ClearBounds(Image *image,RectangleInfo *bounds) +{ + ExceptionInfo + *exception; + + ssize_t + y; + + if (bounds->x < 0) + return; + if (image->matte == MagickFalse) + (void) SetImageAlphaChannel(image,OpaqueAlphaChannel); + exception=(&image->exception); + for (y=0; y < (ssize_t) bounds->height; y++) + { + ssize_t + x; + + PixelPacket + *magick_restrict q; + + q=GetAuthenticPixels(image,bounds->x,bounds->y+y,bounds->width,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) bounds->width; x++) + { + q->opacity=(Quantum) TransparentOpacity; + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ I s B o u n d s C l e a r e d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsBoundsCleared() tests whether any pixel in the bounds given, gets cleared +% when going from the first image to the second image. This typically used +% to check if a proposed disposal method will work successfully to generate +% the second frame image from the first disposed form of the previous frame. +% +% Warning: no bounds checks are performed, except for the null or missed +% image, for images that don't change. in all other cases bound must fall +% within the image. +% +% The format is: +% +% MagickBooleanType IsBoundsCleared(const Image *image1, +% const Image *image2,RectangleInfo bounds,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image1, image 2: the images to check for cleared pixels +% +% o bounds: the area to be clear within the imag image +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType IsBoundsCleared(const Image *image1, + const Image *image2,RectangleInfo *bounds,ExceptionInfo *exception) +{ + const PixelPacket + *p, + *q; + + ssize_t + x; + + ssize_t + y; + + if (bounds->x < 0) + return(MagickFalse); + for (y=0; y < (ssize_t) bounds->height; y++) + { + p=GetVirtualPixels(image1,bounds->x,bounds->y+y,bounds->width,1, + exception); + q=GetVirtualPixels(image2,bounds->x,bounds->y+y,bounds->width,1, + exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + break; + for (x=0; x < (ssize_t) bounds->width; x++) + { + if ((GetPixelOpacity(p) <= (Quantum) (QuantumRange/2)) && + (GetPixelOpacity(q) > (Quantum) (QuantumRange/2))) + break; + p++; + q++; + } + if (x < (ssize_t) bounds->width) + break; + } + return(y < (ssize_t) bounds->height ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o a l e s c e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CoalesceImages() composites a set of images while respecting any page +% offsets and disposal methods. GIF, MIFF, and MNG animation sequences +% typically start with an image background and each subsequent image +% varies in size and offset. A new image sequence is returned with all +% images the same size as the first images virtual canvas and composited +% with the next image in the sequence. +% +% The format of the CoalesceImages method is: +% +% Image *CoalesceImages(Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image sequence. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *CoalesceImages(const Image *image,ExceptionInfo *exception) +{ + Image + *coalesce_image, + *dispose_image, + *previous; + + Image + *next; + + RectangleInfo + bounds; + + /* + Coalesce the image sequence. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + + /* initialise first image */ + next=GetFirstImageInList(image); + bounds=next->page; + if (bounds.width == 0) + { + bounds.width=next->columns; + if (bounds.x > 0) + bounds.width+=bounds.x; + } + if (bounds.height == 0) + { + bounds.height=next->rows; + if (bounds.y > 0) + bounds.height+=bounds.y; + } + bounds.x=0; + bounds.y=0; + coalesce_image=CloneImage(next,bounds.width,bounds.height,MagickTrue, + exception); + if (coalesce_image == (Image *) NULL) + return((Image *) NULL); + coalesce_image->background_color.opacity=(Quantum) TransparentOpacity; + (void) SetImageBackgroundColor(coalesce_image); + coalesce_image->matte=next->matte; + coalesce_image->page=bounds; + coalesce_image->dispose=NoneDispose; + /* + Coalesce rest of the images. + */ + dispose_image=CloneImage(coalesce_image,0,0,MagickTrue,exception); + (void) CompositeImage(coalesce_image,CopyCompositeOp,next,next->page.x, + next->page.y); + next=GetNextImageInList(next); + for ( ; next != (Image *) NULL; next=GetNextImageInList(next)) + { + /* + Determine the bounds that was overlaid in the previous image. + */ + previous=GetPreviousImageInList(next); + bounds=previous->page; + bounds.width=previous->columns; + bounds.height=previous->rows; + if (bounds.x < 0) + { + bounds.width+=bounds.x; + bounds.x=0; + } + if ((ssize_t) (bounds.x+bounds.width) > (ssize_t) coalesce_image->columns) + bounds.width=coalesce_image->columns-bounds.x; + if (bounds.y < 0) + { + bounds.height+=bounds.y; + bounds.y=0; + } + if ((ssize_t) (bounds.y+bounds.height) > (ssize_t) coalesce_image->rows) + bounds.height=coalesce_image->rows-bounds.y; + /* + Replace the dispose image with the new coalesced image. + */ + if (GetPreviousImageInList(next)->dispose != PreviousDispose) + { + dispose_image=DestroyImage(dispose_image); + dispose_image=CloneImage(coalesce_image,0,0,MagickTrue,exception); + if (dispose_image == (Image *) NULL) + { + coalesce_image=DestroyImageList(coalesce_image); + return((Image *) NULL); + } + } + /* + Clear the overlaid area of the coalesced bounds for background disposal + */ + if (next->previous->dispose == BackgroundDispose) + ClearBounds(dispose_image,&bounds); + /* + Next image is the dispose image, overlaid with next frame in sequence. + */ + coalesce_image->next=CloneImage(dispose_image,0,0,MagickTrue,exception); + if (coalesce_image->next != NULL) + coalesce_image->next->previous=coalesce_image; + previous=coalesce_image; + coalesce_image=GetNextImageInList(coalesce_image); + (void) CompositeImage(coalesce_image,next->matte != MagickFalse ? + OverCompositeOp : CopyCompositeOp,next,next->page.x,next->page.y); + (void) CloneImageProfiles(coalesce_image,next); + (void) CloneImageProperties(coalesce_image,next); + (void) CloneImageArtifacts(coalesce_image,next); + coalesce_image->page=previous->page; + /* + If a pixel goes opaque to transparent, use background dispose. + */ + if (IsBoundsCleared(previous,coalesce_image,&bounds,exception) != MagickFalse) + coalesce_image->dispose=BackgroundDispose; + else + coalesce_image->dispose=NoneDispose; + previous->dispose=coalesce_image->dispose; + } + dispose_image=DestroyImage(dispose_image); + return(GetFirstImageInList(coalesce_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D i s p o s e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DisposeImages() returns the coalesced frames of a GIF animation as it would +% appear after the GIF dispose method of that frame has been applied. That is +% it returned the appearance of each frame before the next is overlaid. +% +% The format of the DisposeImages method is: +% +% Image *DisposeImages(Image *images,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image sequence. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *DisposeImages(const Image *images,ExceptionInfo *exception) +{ + Image + *dispose_image, + *dispose_images; + + RectangleInfo + bounds; + + Image + *image, + *next; + + /* + Run the image through the animation sequence + */ + assert(images != (Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=GetFirstImageInList(images); + dispose_image=CloneImage(image,image->page.width,image->page.height, + MagickTrue,exception); + if (dispose_image == (Image *) NULL) + return((Image *) NULL); + dispose_image->page=image->page; + dispose_image->page.x=0; + dispose_image->page.y=0; + dispose_image->dispose=NoneDispose; + dispose_image->background_color.opacity=(Quantum) TransparentOpacity; + (void) SetImageBackgroundColor(dispose_image); + dispose_images=NewImageList(); + for (next=image; next != (Image *) NULL; next=GetNextImageInList(next)) + { + Image + *current_image; + + /* + Overlay this frame's image over the previous disposal image. + */ + current_image=CloneImage(dispose_image,0,0,MagickTrue,exception); + if (current_image == (Image *) NULL) + { + dispose_images=DestroyImageList(dispose_images); + dispose_image=DestroyImage(dispose_image); + return((Image *) NULL); + } + (void) CompositeImage(current_image,next->matte != MagickFalse ? + OverCompositeOp : CopyCompositeOp,next,next->page.x,next->page.y); + /* + Handle Background dispose: image is displayed for the delay period. + */ + if (next->dispose == BackgroundDispose) + { + bounds=next->page; + bounds.width=next->columns; + bounds.height=next->rows; + if (bounds.x < 0) + { + bounds.width+=bounds.x; + bounds.x=0; + } + if ((ssize_t) (bounds.x+bounds.width) > (ssize_t) current_image->columns) + bounds.width=current_image->columns-bounds.x; + if (bounds.y < 0) + { + bounds.height+=bounds.y; + bounds.y=0; + } + if ((ssize_t) (bounds.y+bounds.height) > (ssize_t) current_image->rows) + bounds.height=current_image->rows-bounds.y; + ClearBounds(current_image,&bounds); + } + /* + Select the appropriate previous/disposed image. + */ + if (next->dispose == PreviousDispose) + current_image=DestroyImage(current_image); + else + { + dispose_image=DestroyImage(dispose_image); + dispose_image=current_image; + current_image=(Image *) NULL; + } + /* + Save the dispose image just calculated for return. + */ + { + Image + *dispose; + + dispose=CloneImage(dispose_image,0,0,MagickTrue,exception); + if (dispose == (Image *) NULL) + { + dispose_images=DestroyImageList(dispose_images); + dispose_image=DestroyImage(dispose_image); + return((Image *) NULL); + } + (void) CloneImageProfiles(dispose,next); + (void) CloneImageProperties(dispose,next); + (void) CloneImageArtifacts(dispose,next); + dispose->page.x=0; + dispose->page.y=0; + dispose->dispose=next->dispose; + AppendImageToList(&dispose_images,dispose); + } + } + dispose_image=DestroyImage(dispose_image); + return(GetFirstImageInList(dispose_images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C o m p a r e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ComparePixels() Compare the two pixels and return true if the pixels +% differ according to the given LayerType comparision method. +% +% This currently only used internally by CompareImageBounds(). It is +% doubtful that this sub-routine will be useful outside this module. +% +% The format of the ComparePixels method is: +% +% MagickBooleanType *ComparePixels(const ImageLayerMethod method, +% const MagickPixelPacket *p,const MagickPixelPacket *q) +% +% A description of each parameter follows: +% +% o method: What differences to look for. Must be one of +% CompareAnyLayer, CompareClearLayer, CompareOverlayLayer. +% +% o p, q: the pixels to test for appropriate differences. +% +*/ + +static MagickBooleanType ComparePixels(const ImageLayerMethod method, + const MagickPixelPacket *p,const MagickPixelPacket *q) +{ + MagickRealType + o1, + o2; + + /* + Any change in pixel values + */ + if (method == CompareAnyLayer) + return((MagickBooleanType)(IsMagickColorSimilar(p,q) == MagickFalse)); + + o1 = (p->matte != MagickFalse) ? GetPixelOpacity(p) : OpaqueOpacity; + o2 = (q->matte != MagickFalse) ? q->opacity : OpaqueOpacity; + + /* + Pixel goes from opaque to transprency + */ + if (method == CompareClearLayer) + return((MagickBooleanType) ( (o1 <= ((MagickRealType) QuantumRange/2.0)) && + (o2 > ((MagickRealType) QuantumRange/2.0)) ) ); + + /* + overlay would change first pixel by second + */ + if (method == CompareOverlayLayer) + { + if (o2 > ((MagickRealType) QuantumRange/2.0)) + return MagickFalse; + return((MagickBooleanType) (IsMagickColorSimilar(p,q) == MagickFalse)); + } + return(MagickFalse); +} + + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C o m p a r e I m a g e B o u n d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CompareImageBounds() Given two images return the smallest rectangular area +% by which the two images differ, accourding to the given 'Compare...' +% layer method. +% +% This currently only used internally in this module, but may eventually +% be used by other modules. +% +% The format of the CompareImageBounds method is: +% +% RectangleInfo *CompareImageBounds(const ImageLayerMethod method, +% const Image *image1,const Image *image2,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o method: What differences to look for. Must be one of +% CompareAnyLayer, CompareClearLayer, CompareOverlayLayer. +% +% o image1, image2: the two images to compare. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static RectangleInfo CompareImageBounds(const Image *image1,const Image *image2, + const ImageLayerMethod method,ExceptionInfo *exception) +{ + RectangleInfo + bounds; + + MagickPixelPacket + pixel1, + pixel2; + + const IndexPacket + *indexes1, + *indexes2; + + const PixelPacket + *p, + *q; + + ssize_t + x; + + ssize_t + y; + +#if 0 + /* only same sized images can be compared */ + assert(image1->columns == image2->columns); + assert(image1->rows == image2->rows); +#endif + + /* + Set bounding box of the differences between images + */ + GetMagickPixelPacket(image1,&pixel1); + GetMagickPixelPacket(image2,&pixel2); + for (x=0; x < (ssize_t) image1->columns; x++) + { + p=GetVirtualPixels(image1,x,0,1,image1->rows,exception); + q=GetVirtualPixels(image2,x,0,1,image1->rows,exception); + if ((p == (const PixelPacket *) NULL) || (q == (const PixelPacket *) NULL)) + break; + indexes1=GetVirtualIndexQueue(image1); + indexes2=GetVirtualIndexQueue(image2); + for (y=0; y < (ssize_t) image1->rows; y++) + { + SetMagickPixelPacket(image1,p,indexes1+x,&pixel1); + SetMagickPixelPacket(image2,q,indexes2+x,&pixel2); + if (ComparePixels(method,&pixel1,&pixel2)) + break; + p++; + q++; + } + if (y < (ssize_t) image1->rows) + break; + } + if (x >= (ssize_t) image1->columns) + { + /* + Images are identical, return a null image. + */ + bounds.x=-1; + bounds.y=-1; + bounds.width=1; + bounds.height=1; + return(bounds); + } + bounds.x=x; + for (x=(ssize_t) image1->columns-1; x >= 0; x--) + { + p=GetVirtualPixels(image1,x,0,1,image1->rows,exception); + q=GetVirtualPixels(image2,x,0,1,image1->rows,exception); + if ((p == (const PixelPacket *) NULL) || (q == (const PixelPacket *) NULL)) + break; + indexes1=GetVirtualIndexQueue(image1); + indexes2=GetVirtualIndexQueue(image2); + for (y=0; y < (ssize_t) image1->rows; y++) + { + SetMagickPixelPacket(image1,p,indexes1+x,&pixel1); + SetMagickPixelPacket(image2,q,indexes2+x,&pixel2); + if (ComparePixels(method,&pixel1,&pixel2)) + break; + p++; + q++; + } + if (y < (ssize_t) image1->rows) + break; + } + bounds.width=(size_t) (x-bounds.x+1); + for (y=0; y < (ssize_t) image1->rows; y++) + { + p=GetVirtualPixels(image1,0,y,image1->columns,1,exception); + q=GetVirtualPixels(image2,0,y,image1->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || (q == (const PixelPacket *) NULL)) + break; + indexes1=GetVirtualIndexQueue(image1); + indexes2=GetVirtualIndexQueue(image2); + for (x=0; x < (ssize_t) image1->columns; x++) + { + SetMagickPixelPacket(image1,p,indexes1+x,&pixel1); + SetMagickPixelPacket(image2,q,indexes2+x,&pixel2); + if (ComparePixels(method,&pixel1,&pixel2)) + break; + p++; + q++; + } + if (x < (ssize_t) image1->columns) + break; + } + bounds.y=y; + for (y=(ssize_t) image1->rows-1; y >= 0; y--) + { + p=GetVirtualPixels(image1,0,y,image1->columns,1,exception); + q=GetVirtualPixels(image2,0,y,image1->columns,1,exception); + if ((p == (const PixelPacket *) NULL) || (q == (const PixelPacket *) NULL)) + break; + indexes1=GetVirtualIndexQueue(image1); + indexes2=GetVirtualIndexQueue(image2); + for (x=0; x < (ssize_t) image1->columns; x++) + { + SetMagickPixelPacket(image1,p,indexes1+x,&pixel1); + SetMagickPixelPacket(image2,q,indexes2+x,&pixel2); + if (ComparePixels(method,&pixel1,&pixel2)) + break; + p++; + q++; + } + if (x < (ssize_t) image1->columns) + break; + } + bounds.height=(size_t) (y-bounds.y+1); + return(bounds); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o m p a r e I m a g e L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CompareImageLayers() compares each image with the next in a sequence and +% returns the minimum bounding region of all the pixel differences (of the +% ImageLayerMethod specified) it discovers. +% +% Images do NOT have to be the same size, though it is best that all the +% images are 'coalesced' (images are all the same size, on a flattened +% canvas, so as to represent exactly how an specific frame should look). +% +% No GIF dispose methods are applied, so GIF animations must be coalesced +% before applying this image operator to find differences to them. +% +% The format of the CompareImageLayers method is: +% +% Image *CompareImageLayers(const Image *images, +% const ImageLayerMethod method,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o method: the layers type to compare images with. Must be one of... +% CompareAnyLayer, CompareClearLayer, CompareOverlayLayer. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *CompareImageLayers(const Image *image, + const ImageLayerMethod method,ExceptionInfo *exception) +{ + Image + *image_a, + *image_b, + *layers; + + RectangleInfo + *bounds; + + const Image + *next; + + ssize_t + i; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + assert((method == CompareAnyLayer) || + (method == CompareClearLayer) || + (method == CompareOverlayLayer)); + /* + Allocate bounds memory. + */ + next=GetFirstImageInList(image); + bounds=(RectangleInfo *) AcquireQuantumMemory((size_t) + GetImageListLength(next),sizeof(*bounds)); + if (bounds == (RectangleInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Set up first comparision images. + */ + image_a=CloneImage(next,next->page.width,next->page.height, + MagickTrue,exception); + if (image_a == (Image *) NULL) + { + bounds=(RectangleInfo *) RelinquishMagickMemory(bounds); + return((Image *) NULL); + } + image_a->background_color.opacity=(Quantum) TransparentOpacity; + (void) SetImageBackgroundColor(image_a); + image_a->page=next->page; + image_a->page.x=0; + image_a->page.y=0; + (void) CompositeImage(image_a,CopyCompositeOp,next,next->page.x,next->page.y); + /* + Compute the bounding box of changes for the later images + */ + i=0; + next=GetNextImageInList(next); + for ( ; next != (const Image *) NULL; next=GetNextImageInList(next)) + { + image_b=CloneImage(image_a,0,0,MagickTrue,exception); + if (image_b == (Image *) NULL) + { + image_a=DestroyImage(image_a); + bounds=(RectangleInfo *) RelinquishMagickMemory(bounds); + return((Image *) NULL); + } + (void) CompositeImage(image_a,CopyCompositeOp,next,next->page.x, + next->page.y); + bounds[i]=CompareImageBounds(image_b,image_a,method,exception); + + image_b=DestroyImage(image_b); + i++; + } + image_a=DestroyImage(image_a); + /* + Clone first image in sequence. + */ + next=GetFirstImageInList(image); + layers=CloneImage(next,0,0,MagickTrue,exception); + if (layers == (Image *) NULL) + { + bounds=(RectangleInfo *) RelinquishMagickMemory(bounds); + return((Image *) NULL); + } + /* + Deconstruct the image sequence. + */ + i=0; + next=GetNextImageInList(next); + for ( ; next != (const Image *) NULL; next=GetNextImageInList(next)) + { + if ((bounds[i].x == -1) && (bounds[i].y == -1) && + (bounds[i].width == 1) && (bounds[i].height == 1)) + { + /* + An empty frame is returned from CompareImageBounds(), which means the + current frame is identical to the previous frame. + */ + i++; + continue; + } + image_a=CloneImage(next,0,0,MagickTrue,exception); + if (image_a == (Image *) NULL) + break; + image_b=CropImage(image_a,&bounds[i],exception); + image_a=DestroyImage(image_a); + if (image_b == (Image *) NULL) + break; + AppendImageToList(&layers,image_b); + i++; + } + bounds=(RectangleInfo *) RelinquishMagickMemory(bounds); + if (next != (Image *) NULL) + { + layers=DestroyImageList(layers); + return((Image *) NULL); + } + return(GetFirstImageInList(layers)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e c o n s t r u c t I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DeconstructImages() compares each image with the next in a sequence and +% returns the minimum bounding region of all differences from the first image. +% +% This function is deprecated in favor of the more universal +% CompareImageLayers() function. +% +% The format of the DeconstructImages method is: +% +% Image *DeconstructImages(const Image *images,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +MagickExport Image *DeconstructImages(const Image *images, + ExceptionInfo *exception) +{ + return(CompareImageLayers(images,CompareAnyLayer,exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ O p t i m i z e L a y e r F r a m e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% OptimizeLayerFrames() takes a coalesced GIF animation, and compares each +% frame against the three different 'disposal' forms of the previous frame. +% From this it then attempts to select the smallest cropped image and +% disposal method needed to reproduce the resulting image. +% +% Note that this not easy, and may require the expansion of the bounds +% of previous frame, simply clear pixels for the next animation frame to +% transparency according to the selected dispose method. +% +% The format of the OptimizeLayerFrames method is: +% +% static Image *OptimizeLayerFrames(const Image *image, +% const ImageLayerMethod method,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o method: the layers technique to optimize with. Must be one of... +% OptimizeImageLayer, or OptimizePlusLayer. The Plus form allows +% the addition of extra 'zero delay' frames to clear pixels from +% the previous frame, and the removal of frames that done change, +% merging the delay times together. +% +% o exception: return any errors or warnings in this structure. +% +*/ +/* + Define a 'fake' dispose method where the frame is duplicated, (for + OptimizePlusLayer) with a extra zero time delay frame which does a + BackgroundDisposal to clear the pixels that need to be cleared. +*/ +#define DupDispose ((DisposeType)9) +/* + Another 'fake' dispose method used to removed frames that don't change. +*/ +#define DelDispose ((DisposeType)8) + +#define DEBUG_OPT_FRAME 0 + +static Image *OptimizeLayerFrames(const Image *image, + const ImageLayerMethod method,ExceptionInfo *exception) +{ + ExceptionInfo + *sans_exception; + + Image + *prev_image, + *dup_image, + *bgnd_image, + *optimized_image; + + RectangleInfo + try_bounds, + bgnd_bounds, + dup_bounds, + *bounds; + + MagickBooleanType + add_frames, + try_cleared, + cleared; + + DisposeType + *disposals; + + const Image + *curr; + + ssize_t + i; + + assert(image != (const Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + assert(method == OptimizeLayer || + method == OptimizeImageLayer || + method == OptimizePlusLayer); + + /* + Are we allowed to add/remove frames from animation + */ + add_frames=method == OptimizePlusLayer ? MagickTrue : MagickFalse; + /* + Ensure all the images are the same size + */ + curr=GetFirstImageInList(image); + for (; curr != (Image *) NULL; curr=GetNextImageInList(curr)) + { + if ((curr->columns != image->columns) || (curr->rows != image->rows)) + ThrowImageException(OptionError,"ImagesAreNotTheSameSize"); + if ((curr->page.x != 0) || (curr->page.y != 0) || + (curr->page.width != image->page.width) || + (curr->page.height != image->page.height)) + ThrowImageException(OptionError,"ImagePagesAreNotCoalesced"); + } + /* + Allocate memory (times 2 if we allow the use of frame duplications) + */ + curr=GetFirstImageInList(image); + bounds=(RectangleInfo *) AcquireQuantumMemory((size_t) + GetImageListLength(curr),(add_frames != MagickFalse ? 2UL : 1UL)* + sizeof(*bounds)); + if (bounds == (RectangleInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + disposals=(DisposeType *) AcquireQuantumMemory((size_t) + GetImageListLength(image),(add_frames != MagickFalse ? 2UL : 1UL)* + sizeof(*disposals)); + if (disposals == (DisposeType *) NULL) + { + bounds=(RectangleInfo *) RelinquishMagickMemory(bounds); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Initialise Previous Image as fully transparent + */ + prev_image=CloneImage(curr,curr->page.width,curr->page.height, + MagickTrue,exception); + if (prev_image == (Image *) NULL) + { + bounds=(RectangleInfo *) RelinquishMagickMemory(bounds); + disposals=(DisposeType *) RelinquishMagickMemory(disposals); + return((Image *) NULL); + } + prev_image->page=curr->page; /* ERROR: <-- should not be need, but is! */ + prev_image->page.x=0; + prev_image->page.y=0; + prev_image->dispose=NoneDispose; + + prev_image->background_color.opacity=(Quantum) TransparentOpacity; + (void) SetImageBackgroundColor(prev_image); + /* + Figure out the area of overlay of the first frame + No pixel could be cleared as all pixels are already cleared. + */ +#if DEBUG_OPT_FRAME + i=0; + (void) FormatLocaleFile(stderr,"frame %.20g :-\n",(double) i); +#endif + disposals[0]=NoneDispose; + bounds[0]=CompareImageBounds(prev_image,curr,CompareAnyLayer,exception); +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr, "overlay: %.20gx%.20g%+.20g%+.20g\n\n", + (double) bounds[i].width,(double) bounds[i].height, + (double) bounds[i].x,(double) bounds[i].y ); +#endif + /* + Compute the bounding box of changes for each pair of images. + */ + i=1; + bgnd_image=(Image *) NULL; + dup_image=(Image *) NULL; + dup_bounds.width=0; + dup_bounds.height=0; + dup_bounds.x=0; + dup_bounds.y=0; + curr=GetNextImageInList(curr); + for ( ; curr != (const Image *) NULL; curr=GetNextImageInList(curr)) + { +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr,"frame %.20g :-\n",(double) i); +#endif + /* + Assume none disposal is the best + */ + bounds[i]=CompareImageBounds(curr->previous,curr,CompareAnyLayer,exception); + cleared=IsBoundsCleared(curr->previous,curr,&bounds[i],exception); + disposals[i-1]=NoneDispose; +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr, "overlay: %.20gx%.20g%+.20g%+.20g%s%s\n", + (double) bounds[i].width,(double) bounds[i].height, + (double) bounds[i].x,(double) bounds[i].y, + bounds[i].x < 0?" (unchanged)":"", + cleared?" (pixels cleared)":""); +#endif + if ( bounds[i].x < 0 ) { + /* + Image frame is exactly the same as the previous frame! + If not adding frames leave it to be cropped down to a null image. + Otherwise mark previous image for deleted, transfering its crop bounds + to the current image. + */ + if ( add_frames && i>=2 ) { + disposals[i-1]=DelDispose; + disposals[i]=NoneDispose; + bounds[i]=bounds[i-1]; + i++; + continue; + } + } + else + { + /* + Compare a none disposal against a previous disposal + */ + try_bounds=CompareImageBounds(prev_image,curr,CompareAnyLayer,exception); + try_cleared=IsBoundsCleared(prev_image,curr,&try_bounds,exception); +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr, "test_prev: %.20gx%.20g%+.20g%+.20g%s\n", + (double) try_bounds.width,(double) try_bounds.height, + (double) try_bounds.x,(double) try_bounds.y, + try_cleared?" (pixels were cleared)":""); +#endif + if ( (!try_cleared && cleared ) || + try_bounds.width * try_bounds.height + < bounds[i].width * bounds[i].height ) + { + cleared=try_cleared; + bounds[i]=try_bounds; + disposals[i-1]=PreviousDispose; +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr,"previous: accepted\n"); + } else { + (void) FormatLocaleFile(stderr,"previous: rejected\n"); +#endif + } + + /* + If we are allowed lets try a complex frame duplication. + It is useless if the previous image already clears pixels correctly. + This method will always clear all the pixels that need to be cleared. + */ + dup_bounds.width=dup_bounds.height=0; /* no dup, no pixel added */ + if ( add_frames ) + { + dup_image=CloneImage(curr->previous,0,0,MagickTrue,exception); + if (dup_image == (Image *) NULL) + { + bounds=(RectangleInfo *) RelinquishMagickMemory(bounds); + disposals=(DisposeType *) RelinquishMagickMemory(disposals); + prev_image=DestroyImage(prev_image); + return((Image *) NULL); + } + dup_bounds=CompareImageBounds(dup_image,curr,CompareClearLayer,exception); + ClearBounds(dup_image,&dup_bounds); + try_bounds=CompareImageBounds(dup_image,curr,CompareAnyLayer,exception); + if ( cleared || + dup_bounds.width*dup_bounds.height + +try_bounds.width*try_bounds.height + < bounds[i].width * bounds[i].height ) + { + cleared=MagickFalse; + bounds[i]=try_bounds; + disposals[i-1]=DupDispose; + /* to be finalised later, if found to be optimial */ + } + else + dup_bounds.width=dup_bounds.height=0; + } + /* + Now compare against a simple background disposal + */ + bgnd_image=CloneImage(curr->previous,0,0,MagickTrue,exception); + if (bgnd_image == (Image *) NULL) + { + bounds=(RectangleInfo *) RelinquishMagickMemory(bounds); + disposals=(DisposeType *) RelinquishMagickMemory(disposals); + prev_image=DestroyImage(prev_image); + if ( dup_image != (Image *) NULL) + dup_image=DestroyImage(dup_image); + return((Image *) NULL); + } + bgnd_bounds=bounds[i-1]; /* interum bounds of the previous image */ + ClearBounds(bgnd_image,&bgnd_bounds); + try_bounds=CompareImageBounds(bgnd_image,curr,CompareAnyLayer,exception); + try_cleared=IsBoundsCleared(bgnd_image,curr,&try_bounds,exception); +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr, "background: %s\n", + try_cleared?"(pixels cleared)":""); +#endif + if ( try_cleared ) + { + /* + Straight background disposal failed to clear pixels needed! + Lets try expanding the disposal area of the previous frame, to + include the pixels that are cleared. This guaranteed + to work, though may not be the most optimized solution. + */ + try_bounds=CompareImageBounds(curr->previous,curr,CompareClearLayer,exception); +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr, "expand_clear: %.20gx%.20g%+.20g%+.20g%s\n", + (double) try_bounds.width,(double) try_bounds.height, + (double) try_bounds.x,(double) try_bounds.y, + try_bounds.x<0?" (no expand nessary)":""); +#endif + if ( bgnd_bounds.x < 0 ) + bgnd_bounds = try_bounds; + else + { +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr, "expand_bgnd: %.20gx%.20g%+.20g%+.20g\n", + (double) bgnd_bounds.width,(double) bgnd_bounds.height, + (double) bgnd_bounds.x,(double) bgnd_bounds.y ); +#endif + if ( try_bounds.x < bgnd_bounds.x ) + { + bgnd_bounds.width+= bgnd_bounds.x-try_bounds.x; + if ( bgnd_bounds.width < try_bounds.width ) + bgnd_bounds.width = try_bounds.width; + bgnd_bounds.x = try_bounds.x; + } + else + { + try_bounds.width += try_bounds.x - bgnd_bounds.x; + if ( bgnd_bounds.width < try_bounds.width ) + bgnd_bounds.width = try_bounds.width; + } + if ( try_bounds.y < bgnd_bounds.y ) + { + bgnd_bounds.height += bgnd_bounds.y - try_bounds.y; + if ( bgnd_bounds.height < try_bounds.height ) + bgnd_bounds.height = try_bounds.height; + bgnd_bounds.y = try_bounds.y; + } + else + { + try_bounds.height += try_bounds.y - bgnd_bounds.y; + if ( bgnd_bounds.height < try_bounds.height ) + bgnd_bounds.height = try_bounds.height; + } +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr, " to : %.20gx%.20g%+.20g%+.20g\n", + (double) bgnd_bounds.width,(double) bgnd_bounds.height, + (double) bgnd_bounds.x,(double) bgnd_bounds.y ); +#endif + } + ClearBounds(bgnd_image,&bgnd_bounds); +#if DEBUG_OPT_FRAME +/* Something strange is happening with a specific animation + * CompareAnyLayers (normal method) and CompareClearLayers returns the whole + * image, which is not posibly correct! As verified by previous tests. + * Something changed beyond the bgnd_bounds clearing. But without being able + * to see, or writet he image at this point it is hard to tell what is wrong! + * Only CompareOverlay seemed to return something sensible. + */ + try_bounds=CompareImageBounds(bgnd_image,curr,CompareClearLayer,exception); + (void) FormatLocaleFile(stderr, "expand_ctst: %.20gx%.20g%+.20g%+.20g\n", + (double) try_bounds.width,(double) try_bounds.height, + (double) try_bounds.x,(double) try_bounds.y ); + try_bounds=CompareImageBounds(bgnd_image,curr,CompareAnyLayer,exception); + try_cleared=IsBoundsCleared(bgnd_image,curr,&try_bounds,exception); + (void) FormatLocaleFile(stderr, "expand_any : %.20gx%.20g%+.20g%+.20g%s\n", + (double) try_bounds.width,(double) try_bounds.height, + (double) try_bounds.x,(double) try_bounds.y, + try_cleared?" (pixels cleared)":""); +#endif + try_bounds=CompareImageBounds(bgnd_image,curr,CompareOverlayLayer,exception); +#if DEBUG_OPT_FRAME + try_cleared=IsBoundsCleared(bgnd_image,curr,&try_bounds,exception); + (void) FormatLocaleFile(stderr, "expand_test: %.20gx%.20g%+.20g%+.20g%s\n", + (double) try_bounds.width,(double) try_bounds.height, + (double) try_bounds.x,(double) try_bounds.y, + try_cleared?" (pixels cleared)":""); +#endif + } + /* + Test if this background dispose is smaller than any of the + other methods we tryed before this (including duplicated frame) + */ + if ( cleared || + bgnd_bounds.width*bgnd_bounds.height + +try_bounds.width*try_bounds.height + < bounds[i-1].width*bounds[i-1].height + +dup_bounds.width*dup_bounds.height + +bounds[i].width*bounds[i].height ) + { + cleared=MagickFalse; + bounds[i-1]=bgnd_bounds; + bounds[i]=try_bounds; + if ( disposals[i-1] == DupDispose ) + dup_image=DestroyImage(dup_image); + disposals[i-1]=BackgroundDispose; +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr,"expand_bgnd: accepted\n"); + } else { + (void) FormatLocaleFile(stderr,"expand_bgnd: reject\n"); +#endif + } + } + /* + Finalise choice of dispose, set new prev_image, + and junk any extra images as appropriate, + */ + if ( disposals[i-1] == DupDispose ) + { + if (bgnd_image != (Image *) NULL) + bgnd_image=DestroyImage(bgnd_image); + prev_image=DestroyImage(prev_image); + prev_image=dup_image, dup_image=(Image *) NULL; + bounds[i+1]=bounds[i]; + bounds[i]=dup_bounds; + disposals[i-1]=DupDispose; + disposals[i]=BackgroundDispose; + i++; + } + else + { + if ( dup_image != (Image *) NULL) + dup_image=DestroyImage(dup_image); + if ( disposals[i-1] != PreviousDispose ) + prev_image=DestroyImage(prev_image); + if ( disposals[i-1] == BackgroundDispose ) + prev_image=bgnd_image, bgnd_image=(Image *) NULL; + if (bgnd_image != (Image *) NULL) + bgnd_image=DestroyImage(bgnd_image); + if ( disposals[i-1] == NoneDispose ) + { + prev_image=ReferenceImage(curr->previous); + if (prev_image == (Image *) NULL) + { + bounds=(RectangleInfo *) RelinquishMagickMemory(bounds); + disposals=(DisposeType *) RelinquishMagickMemory(disposals); + return((Image *) NULL); + } + } + + } + assert(prev_image != (Image *) NULL); + disposals[i]=disposals[i-1]; +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr, "final %.20g : %s %.20gx%.20g%+.20g%+.20g\n", + (double) i-1, + CommandOptionToMnemonic(MagickDisposeOptions,disposals[i-1]), + (double) bounds[i-1].width,(double) bounds[i-1].height, + (double) bounds[i-1].x,(double) bounds[i-1].y ); +#endif +#if DEBUG_OPT_FRAME + (void) FormatLocaleFile(stderr, "interum %.20g : %s %.20gx%.20g%+.20g%+.20g\n", + (double) i, + CommandOptionToMnemonic(MagickDisposeOptions,disposals[i]), + (double) bounds[i].width,(double) bounds[i].height, + (double) bounds[i].x,(double) bounds[i].y ); + (void) FormatLocaleFile(stderr,"\n"); +#endif + i++; + } + prev_image=DestroyImage(prev_image); + /* + Optimize all images in sequence. + */ + sans_exception=AcquireExceptionInfo(); + i=0; + curr=GetFirstImageInList(image); + optimized_image=NewImageList(); + while ( curr != (const Image *) NULL ) + { + prev_image=CloneImage(curr,0,0,MagickTrue,exception); + if (prev_image == (Image *) NULL) + break; + if ( disposals[i] == DelDispose ) { + size_t time = 0; + while ( disposals[i] == DelDispose ) { + time += (size_t) (curr->delay*1000* + PerceptibleReciprocal((double) curr->ticks_per_second)); + curr=GetNextImageInList(curr); + i++; + } + time += (size_t) (curr->delay*1000* + PerceptibleReciprocal((double) curr->ticks_per_second)); + prev_image->ticks_per_second = 100L; + prev_image->delay = time*prev_image->ticks_per_second/1000; + } + bgnd_image=CropImage(prev_image,&bounds[i],sans_exception); + prev_image=DestroyImage(prev_image); + if (bgnd_image == (Image *) NULL) + break; + bgnd_image->dispose=disposals[i]; + if ( disposals[i] == DupDispose ) { + bgnd_image->delay=0; + bgnd_image->dispose=NoneDispose; + } + else + curr=GetNextImageInList(curr); + AppendImageToList(&optimized_image,bgnd_image); + i++; + } + sans_exception=DestroyExceptionInfo(sans_exception); + bounds=(RectangleInfo *) RelinquishMagickMemory(bounds); + disposals=(DisposeType *) RelinquishMagickMemory(disposals); + if (curr != (Image *) NULL) + { + optimized_image=DestroyImageList(optimized_image); + return((Image *) NULL); + } + return(GetFirstImageInList(optimized_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% O p t i m i z e I m a g e L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% OptimizeImageLayers() compares each image the GIF disposed forms of the +% previous image in the sequence. From this it attempts to select the +% smallest cropped image to replace each frame, while preserving the results +% of the GIF animation. +% +% The format of the OptimizeImageLayers method is: +% +% Image *OptimizeImageLayers(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *OptimizeImageLayers(const Image *image, + ExceptionInfo *exception) +{ + return(OptimizeLayerFrames(image,OptimizeImageLayer,exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% O p t i m i z e P l u s I m a g e L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% OptimizeImagePlusLayers() is exactly as OptimizeImageLayers(), but may +% also add or even remove extra frames in the animation, if it improves +% the total number of pixels in the resulting GIF animation. +% +% The format of the OptimizePlusImageLayers method is: +% +% Image *OptimizePlusImageLayers(const Image *image, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *OptimizePlusImageLayers(const Image *image, + ExceptionInfo *exception) +{ + return OptimizeLayerFrames(image,OptimizePlusLayer,exception); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% O p t i m i z e I m a g e T r a n s p a r e n c y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% OptimizeImageTransparency() takes a frame optimized GIF animation, and +% compares the overlayed pixels against the disposal image resulting from all +% the previous frames in the animation. Any pixel that does not change the +% disposal image (and thus does not effect the outcome of an overlay) is made +% transparent. +% +% WARNING: This modifies the current images directly, rather than generate +% a new image sequence. +% +% The format of the OptimizeImageTransperency method is: +% +% void OptimizeImageTransperency(Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image sequence +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport void OptimizeImageTransparency(const Image *image, + ExceptionInfo *exception) +{ + Image + *dispose_image; + + Image + *next; + + /* + Run the image through the animation sequence + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + next=GetFirstImageInList(image); + dispose_image=CloneImage(next,next->page.width,next->page.height, + MagickTrue,exception); + if (dispose_image == (Image *) NULL) + return; + dispose_image->page=next->page; + dispose_image->page.x=0; + dispose_image->page.y=0; + dispose_image->dispose=NoneDispose; + dispose_image->background_color.opacity=(Quantum) TransparentOpacity; + (void) SetImageBackgroundColor(dispose_image); + + while ( next != (Image *) NULL ) + { + Image + *current_image; + + /* + Overlay this frame's image over the previous disposal image + */ + current_image=CloneImage(dispose_image,0,0,MagickTrue,exception); + if (current_image == (Image *) NULL) + { + dispose_image=DestroyImage(dispose_image); + return; + } + (void) CompositeImage(current_image,next->matte != MagickFalse ? + OverCompositeOp : CopyCompositeOp,next,next->page.x,next->page.y); + /* + At this point the image would be displayed, for the delay period + ** + Work out the disposal of the previous image + */ + if (next->dispose == BackgroundDispose) + { + RectangleInfo + bounds=next->page; + + bounds.width=next->columns; + bounds.height=next->rows; + if (bounds.x < 0) + { + bounds.width+=bounds.x; + bounds.x=0; + } + if ((ssize_t) (bounds.x+bounds.width) > (ssize_t) current_image->columns) + bounds.width=current_image->columns-bounds.x; + if (bounds.y < 0) + { + bounds.height+=bounds.y; + bounds.y=0; + } + if ((ssize_t) (bounds.y+bounds.height) > (ssize_t) current_image->rows) + bounds.height=current_image->rows-bounds.y; + ClearBounds(current_image,&bounds); + } + if (next->dispose != PreviousDispose) + { + dispose_image=DestroyImage(dispose_image); + dispose_image=current_image; + } + else + current_image=DestroyImage(current_image); + + /* + Optimize Transparency of the next frame (if present) + */ + next=GetNextImageInList(next); + if (next != (Image *) NULL) + (void) CompositeImage(next,ChangeMaskCompositeOp,dispose_image, + -(next->page.x),-(next->page.y)); + } + dispose_image=DestroyImage(dispose_image); + return; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e m o v e D u p l i c a t e L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RemoveDuplicateLayers() removes any image that is exactly the same as the +% next image in the given image list. Image size and virtual canvas offset +% must also match, though not the virtual canvas size itself. +% +% No check is made with regards to image disposal setting, though it is the +% dispose setting of later image that is kept. Also any time delays are also +% added together. As such coalesced image animations should still produce the +% same result, though with duplicte frames merged into a single frame. +% +% The format of the RemoveDuplicateLayers method is: +% +% void RemoveDuplicateLayers(Image **image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o images: the image list +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport void RemoveDuplicateLayers(Image **images,ExceptionInfo *exception) +{ + RectangleInfo + bounds; + + Image + *image, + *next; + + assert((*images) != (const Image *) NULL); + assert((*images)->signature == MagickCoreSignature); + if ((*images)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + (*images)->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + image=GetFirstImageInList(*images); + for ( ; (next=GetNextImageInList(image)) != (Image *) NULL; image=next) + { + if ((image->columns != next->columns) || (image->rows != next->rows) || + (image->page.x != next->page.x) || (image->page.y != next->page.y)) + continue; + bounds=CompareImageBounds(image,next,CompareAnyLayer,exception); + if (bounds.x < 0) + { + /* + Two images are the same, merge time delays and delete one. + */ + size_t + time; + + time=1000*image->delay*PerceptibleReciprocal(image->ticks_per_second); + time+=1000*next->delay*PerceptibleReciprocal(next->ticks_per_second); + next->ticks_per_second=100L; + next->delay=time*image->ticks_per_second/1000; + next->iterations=image->iterations; + *images=image; + (void) DeleteImageFromList(images); + } + } + *images=GetFirstImageInList(*images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e m o v e Z e r o D e l a y L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RemoveZeroDelayLayers() removes any image that as a zero delay time. Such +% images generally represent intermediate or partial updates in GIF +% animations used for file optimization. They are not ment to be displayed +% to users of the animation. Viewable images in an animation should have a +% time delay of 3 or more centi-seconds (hundredths of a second). +% +% However if all the frames have a zero time delay, then either the animation +% is as yet incomplete, or it is not a GIF animation. This a non-sensible +% situation, so no image will be removed and a 'Zero Time Animation' warning +% (exception) given. +% +% No warning will be given if no image was removed because all images had an +% appropriate non-zero time delay set. +% +% Due to the special requirements of GIF disposal handling, GIF animations +% should be coalesced first, before calling this function, though that is not +% a requirement. +% +% The format of the RemoveZeroDelayLayers method is: +% +% void RemoveZeroDelayLayers(Image **image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o images: the image list +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport void RemoveZeroDelayLayers(Image **images, + ExceptionInfo *exception) +{ + Image + *i; + + assert((*images) != (const Image *) NULL); + assert((*images)->signature == MagickCoreSignature); + if ((*images)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*images)->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + + i=GetFirstImageInList(*images); + for ( ; i != (Image *) NULL; i=GetNextImageInList(i)) + if ( i->delay != 0L ) break; + if ( i == (Image *) NULL ) { + (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning, + "ZeroTimeAnimation","`%s'",GetFirstImageInList(*images)->filename); + return; + } + i=GetFirstImageInList(*images); + while ( i != (Image *) NULL ) + { + if ( i->delay == 0L ) { + (void) DeleteImageFromList(&i); + *images=i; + } + else + i=GetNextImageInList(i); + } + *images=GetFirstImageInList(*images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o m p o s i t e L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CompositeLayers() compose the source image sequence over the destination +% image sequence, starting with the current image in both lists. +% +% Each layer from the two image lists are composted together until the end of +% one of the image lists is reached. The offset of each composition is also +% adjusted to match the virtual canvas offsets of each layer. As such the +% given offset is relative to the virtual canvas, and not the actual image. +% +% Composition uses given x and y offsets, as the 'origin' location of the +% source images virtual canvas (not the real image) allowing you to compose a +% list of 'layer images' into the destiantioni images. This makes it well +% sutiable for directly composing 'Clears Frame Animations' or 'Coaleased +% Animations' onto a static or other 'Coaleased Animation' destination image +% list. GIF disposal handling is not looked at. +% +% Special case:- If one of the image sequences is the last image (just a +% single image remaining), that image is repeatally composed with all the +% images in the other image list. Either the source or destination lists may +% be the single image, for this situation. +% +% In the case of a single destination image (or last image given), that image +% will ve cloned to match the number of images remaining in the source image +% list. +% +% This is equivelent to the "-layer Composite" Shell API operator. +% +% +% The format of the CompositeLayers method is: +% +% void CompositeLayers(Image *destination, +% const CompositeOperator compose, Image *source, +% const ssize_t x_offset, const ssize_t y_offset, +% ExceptionInfo *exception); +% +% A description of each parameter follows: +% +% o destination: the destination images and results +% +% o source: source image(s) for the layer composition +% +% o compose, x_offset, y_offset: arguments passed on to CompositeImages() +% +% o exception: return any errors or warnings in this structure. +% +*/ +static inline void CompositeCanvas(Image *destination, + const CompositeOperator compose, Image *source,ssize_t x_offset, + ssize_t y_offset ) +{ + x_offset+=source->page.x-destination->page.x; + y_offset+=source->page.y-destination->page.y; + (void) CompositeImage(destination,compose,source,x_offset,y_offset); +} + +MagickExport void CompositeLayers(Image *destination, + const CompositeOperator compose, Image *source,const ssize_t x_offset, + const ssize_t y_offset,ExceptionInfo *exception) +{ + assert(destination != (Image *) NULL); + assert(destination->signature == MagickCoreSignature); + assert(source != (Image *) NULL); + assert(source->signature == MagickCoreSignature); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + if (source->debug != MagickFalse || destination->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s - %s", + source->filename,destination->filename); + + /* + Overlay single source image over destation image/list + */ + if ( source->next == (Image *) NULL ) + while ( destination != (Image *) NULL ) + { + CompositeCanvas(destination,compose,source,x_offset,y_offset); + destination=GetNextImageInList(destination); + } + + /* + Overlay source image list over single destination + Generating multiple clones of destination image to match source list. + Original Destination image becomes first image of generated list. + As such the image list pointer does not require any change in caller. + Some animation attributes however also needs coping in this case. + */ + else if ( destination->next == (Image *) NULL ) + { + Image *dest = CloneImage(destination,0,0,MagickTrue,exception); + + CompositeCanvas(destination,compose,source,x_offset,y_offset); + /* copy source image attributes ? */ + if ( source->next != (Image *) NULL ) + { + destination->delay = source->delay; + destination->iterations = source->iterations; + } + source=GetNextImageInList(source); + + while ( source != (Image *) NULL ) + { + AppendImageToList(&destination, + CloneImage(dest,0,0,MagickTrue,exception)); + destination=GetLastImageInList(destination); + + CompositeCanvas(destination,compose,source,x_offset,y_offset); + destination->delay = source->delay; + destination->iterations = source->iterations; + source=GetNextImageInList(source); + } + dest=DestroyImage(dest); + } + + /* + Overlay a source image list over a destination image list + until either list runs out of images. (Does not repeat) + */ + else + while ( source != (Image *) NULL && destination != (Image *) NULL ) + { + CompositeCanvas(destination,compose,source,x_offset,y_offset); + source=GetNextImageInList(source); + destination=GetNextImageInList(destination); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M e r g e I m a g e L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MergeImageLayers() composes all the image layers from the current given +% image onward to produce a single image of the merged layers. +% +% The inital canvas's size depends on the given ImageLayerMethod, and is +% initialized using the first images background color. The images +% are then compositied onto that image in sequence using the given +% composition that has been assigned to each individual image. +% +% The format of the MergeImageLayers is: +% +% Image *MergeImageLayers(const Image *image, +% const ImageLayerMethod method,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image list to be composited together +% +% o method: the method of selecting the size of the initial canvas. +% +% MergeLayer: Merge all layers onto a canvas just large enough +% to hold all the actual images. The virtual canvas of the +% first image is preserved but otherwise ignored. +% +% FlattenLayer: Use the virtual canvas size of first image. +% Images which fall outside this canvas is clipped. +% This can be used to 'fill out' a given virtual canvas. +% +% MosaicLayer: Start with the virtual canvas of the first image, +% enlarging left and right edges to contain all images. +% Images with negative offsets will be clipped. +% +% TrimBoundsLayer: Determine the overall bounds of all the image +% layers just as in "MergeLayer", then adjust the canvas +% and offsets to be relative to those bounds, without overlaying +% the images. +% +% WARNING: a new image is not returned, the original image +% sequence page data is modified instead. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *MergeImageLayers(Image *image, + const ImageLayerMethod method,ExceptionInfo *exception) +{ +#define MergeLayersTag "Merge/Layers" + + Image + *canvas; + + MagickBooleanType + proceed; + + RectangleInfo + page; + + const Image + *next; + + size_t + number_images, + height, + width; + + ssize_t + scene; + + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + /* + Determine canvas image size, and its virtual canvas size and offset. + */ + page=image->page; + width=image->columns; + height=image->rows; + switch (method) + { + case TrimBoundsLayer: + case MergeLayer: + default: + { + next=GetNextImageInList(image); + for ( ; next != (Image *) NULL; next=GetNextImageInList(next)) + { + if (page.x > next->page.x) + { + width+=page.x-next->page.x; + page.x=next->page.x; + } + if (page.y > next->page.y) + { + height+=page.y-next->page.y; + page.y=next->page.y; + } + if ((ssize_t) width < (next->page.x+(ssize_t) next->columns-page.x)) + width=(size_t) next->page.x+(ssize_t) next->columns-page.x; + if ((ssize_t) height < (next->page.y+(ssize_t) next->rows-page.y)) + height=(size_t) next->page.y+(ssize_t) next->rows-page.y; + } + break; + } + case FlattenLayer: + { + if (page.width > 0) + width=page.width; + if (page.height > 0) + height=page.height; + page.x=0; + page.y=0; + break; + } + case MosaicLayer: + { + if (page.width > 0) + width=page.width; + if (page.height > 0) + height=page.height; + for (next=image; next != (Image *) NULL; next=GetNextImageInList(next)) + { + if ((ssize_t) width < (next->page.x+(ssize_t) next->columns)) + width=(size_t) next->page.x+next->columns; + if ((ssize_t) height < (next->page.y+(ssize_t) next->rows)) + height=(size_t) next->page.y+next->rows; + } + page.width=width; + page.height=height; + page.x=0; + page.y=0; + break; + } + } + /* + Set virtual canvas size if not defined. + */ + if (page.width == 0) + page.width=page.x < 0 ? width : width+page.x; + if (page.height == 0) + page.height=page.y < 0 ? height : height+page.y; + /* + Handle "TrimBoundsLayer" method separately to normal 'layer merge'. + */ + if (method == TrimBoundsLayer) + { + number_images=GetImageListLength(image); + for (scene=0; scene < (ssize_t) number_images; scene++) + { + image->page.x-=page.x; + image->page.y-=page.y; + image->page.width=width; + image->page.height=height; + proceed=SetImageProgress(image,MergeLayersTag,(MagickOffsetType) scene, + number_images); + if (proceed == MagickFalse) + break; + image=GetNextImageInList(image); + if (image == (Image *) NULL) + break; + } + return((Image *) NULL); + } + /* + Create canvas size of width and height, and background color. + */ + canvas=CloneImage(image,width,height,MagickTrue,exception); + if (canvas == (Image *) NULL) + return((Image *) NULL); + (void) SetImageBackgroundColor(canvas); + canvas->page=page; + canvas->dispose=UndefinedDispose; + /* + Compose images onto canvas, with progress monitor + */ + number_images=GetImageListLength(image); + for (scene=0; scene < (ssize_t) number_images; scene++) + { + (void) CompositeImage(canvas,image->compose,image,image->page.x- + canvas->page.x,image->page.y-canvas->page.y); + proceed=SetImageProgress(image,MergeLayersTag,(MagickOffsetType) scene, + number_images); + if (proceed == MagickFalse) + break; + image=GetNextImageInList(image); + if (image == (Image *) NULL) + break; + } + return(canvas); +} diff --git a/ImageMagick-6.9.12-44/magick/layer.h b/ImageMagick-6.9.12-44/magick/layer.h new file mode 100644 index 0000000..e02b3a8 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/layer.h @@ -0,0 +1,75 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image layer methods. +*/ +#ifndef MAGICKCORE_LAYER_H +#define MAGICKCORE_LAYER_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef enum +{ + UnrecognizedDispose, + UndefinedDispose = 0, + NoneDispose = 1, + BackgroundDispose = 2, + PreviousDispose = 3 +} DisposeType; + +typedef enum +{ + UndefinedLayer, + CoalesceLayer, + CompareAnyLayer, + CompareClearLayer, + CompareOverlayLayer, + DisposeLayer, + OptimizeLayer, + OptimizeImageLayer, + OptimizePlusLayer, + OptimizeTransLayer, + RemoveDupsLayer, + RemoveZeroLayer, + CompositeLayer, + MergeLayer, + FlattenLayer, + MosaicLayer, + TrimBoundsLayer +} ImageLayerMethod; + +extern MagickExport Image + *CoalesceImages(const Image *,ExceptionInfo *), + *DisposeImages(const Image *,ExceptionInfo *), + *CompareImageLayers(const Image *,const ImageLayerMethod,ExceptionInfo *), + *DeconstructImages(const Image *,ExceptionInfo *), + *MergeImageLayers(Image *,const ImageLayerMethod,ExceptionInfo *), + *OptimizeImageLayers(const Image *,ExceptionInfo *), + *OptimizePlusImageLayers(const Image *,ExceptionInfo *); + +extern MagickExport void + CompositeLayers(Image *,const CompositeOperator,Image *,const ssize_t, + const ssize_t,ExceptionInfo *), + OptimizeImageTransparency(const Image *,ExceptionInfo *), + RemoveDuplicateLayers(Image **,ExceptionInfo *), + RemoveZeroDelayLayers(Image **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/libMagickCore.map b/ImageMagick-6.9.12-44/magick/libMagickCore.map new file mode 100644 index 0000000..85297c9 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/libMagickCore.map @@ -0,0 +1,4 @@ + VERS_7.0 { + global: + *; + }; diff --git a/ImageMagick-6.9.12-44/magick/list.c b/ImageMagick-6.9.12-44/magick/list.c new file mode 100644 index 0000000..c784bdd --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/list.c @@ -0,0 +1,1490 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L IIIII SSSSS TTTTT % +% L I SS T % +% L I SSS T % +% L I SS T % +% LLLLL IIIII SSSSS T % +% % +% % +% MagickCore Image List Methods % +% % +% Software Design % +% Cristy % +% December 2002 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/artifact.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/memory_.h" +#include "magick/string_.h" +#include "magick/string-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A p p e n d I m a g e T o L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AppendImageToList() appends the second image list to the end of the first +% list. The given image list pointer is left unchanged, unless it was empty. +% +% The format of the AppendImageToList method is: +% +% AppendImageToList(Image *images,const Image *image) +% +% A description of each parameter follows: +% +% o images: the image list to be appended to. +% +% o image: the appended image or image list. +% +*/ +MagickExport void AppendImageToList(Image **images,const Image *append) +{ + Image + *p, + *q; + + assert(images != (Image **) NULL); + if (append == (Image *) NULL) + return; + assert(append->signature == MagickCoreSignature); + if (append->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",append->filename); + if ((*images) == (Image *) NULL) + { + *images=(Image *) append; + return; + } + assert((*images)->signature == MagickCoreSignature); + p=GetLastImageInList(*images); + q=GetFirstImageInList(append); + p->next=q; + q->previous=p; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e I m a g e L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneImageList() returns a duplicate of the image list. +% +% The format of the CloneImageList method is: +% +% Image *CloneImageList(const Image *images,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o images: the image list. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *CloneImageList(const Image *images,ExceptionInfo *exception) +{ + Image + *clone, + *image; + + Image + *p; + + if (images == (Image *) NULL) + return((Image *) NULL); + assert(images->signature == MagickCoreSignature); + while (images->previous != (Image *) NULL) + { + assert(images != images->previous); + images=images->previous; + } + image=(Image *) NULL; + for (p=(Image *) NULL; images != (Image *) NULL; images=images->next) + { + assert(images != images->next); + clone=CloneImage(images,0,0,MagickTrue,exception); + if (clone == (Image *) NULL) + { + if (image != (Image *) NULL) + image=DestroyImageList(image); + return((Image *) NULL); + } + if (image == (Image *) NULL) + { + image=clone; + p=image; + continue; + } + p->next=clone; + clone->previous=p; + p=p->next; + } + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneImages() clones one or more images from an image sequence, using a +% comma separated list of image numbers or ranges. +% +% The numbers start at 0 for the first image in the list, while negative +% numbers refer to images starting counting from the end of the range. Images +% may be referred to multiple times to clone them multiple times. Images +% referred beyond the available number of images in list are ignored. +% +% Images referenced may be reversed, and results in a clone of those images +% also being made with a reversed order. +% +% The format of the CloneImages method is: +% +% Image *CloneImages(const Image *images,const char *scenes, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o images: the image sequence. +% +% o scenes: This character string specifies which scenes to clone +% (e.g. 1,3-5,7-3,2). +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *CloneImages(const Image *images,const char *scenes, + ExceptionInfo *exception) +{ + char + *p; + + const char + *artifact; + + const Image + *next; + + Image + *clone_images, + *image; + + ssize_t + i; + + size_t + length; + + ssize_t + first, + last, + step; + + assert(images != (const Image *) NULL); + assert(images->signature == MagickCoreSignature); + assert(scenes != (char *) NULL); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + clone_images=NewImageList(); + images=GetFirstImageInList(images); + artifact=GetImageArtifact(images,"frames:step"); + length=GetImageListLength(images); + for (p=(char *) scenes; *p != '\0';) + { + MagickBooleanType + match; + + while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ',')) + p++; + first=(ssize_t) strtol(p,&p,10); + if (first < 0) + first+=(ssize_t) length; + else + if (first > (ssize_t) length) + first=(ssize_t) length; + first%=(length << 1); + last=first; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == '-') + { + last=(ssize_t) strtol(p+1,&p,10); + if (last < 0) + last+=(ssize_t) length; + else + if (last > (ssize_t) length) + last=(ssize_t) length; + } + last%=(length << 1); + match=MagickFalse; + step=1; + if (artifact != (const char *) NULL) + { + step=(ssize_t) StringToLong(artifact); + if (step == 0) + step=1; + } + step=(ssize_t) (first > last ? -step : step); + for ( ; step > 0 ? (last-first) >= 0 : (last-first) <= 0; first+=step) + { + i=0; + for (next=images; next != (Image *) NULL; next=GetNextImageInList(next)) + { + if (i == (ssize_t) first) + { + image=CloneImage(next,0,0,MagickTrue,exception); + if (image == (Image *) NULL) + break; + AppendImageToList(&clone_images,image); + match=MagickTrue; + } + i++; + } + if (match == MagickFalse) + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + "InvalidImageIndex","`%s'",images->filename); + } + } + return(GetFirstImageInList(clone_images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e l e t e I m a g e F r o m L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DeleteImageFromList() deletes an image from the list. List pointer +% is moved to the next image, if one is present. See RemoveImageFromList(). +% +% The format of the DeleteImageFromList method is: +% +% DeleteImageFromList(Image **images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport void DeleteImageFromList(Image **images) +{ + Image + *image; + + image=RemoveImageFromList(images); + if (image != (Image *) NULL) + (void) DestroyImage(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e l e t e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DeleteImages() deletes one or more images from an image sequence, using a +% comma separated list of image numbers or ranges. +% +% The numbers start at 0 for the first image, while negative numbers refer to +% images starting counting from the end of the range. Images may be referred to +% multiple times without problems. Image referred beyond the available number +% of images in list are ignored. +% +% If the referenced images are in the reverse order, that range will be +% completely ignored, unlike CloneImages(). +% +% The format of the DeleteImages method is: +% +% DeleteImages(Image **images,const char *scenes,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o images: the image sequence. +% +% o scenes: This character string specifies which scenes to delete +% (e.g. 1,3-5,-2-6,2). +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport void DeleteImages(Image **images,const char *scenes, + ExceptionInfo *exception) +{ + char + *p; + + Image + *image; + + long + first, + last; + + MagickBooleanType + *delete_list; + + ssize_t + i; + + size_t + length; + + assert(images != (Image **) NULL); + assert((*images)->signature == MagickCoreSignature); + assert(scenes != (char *) NULL); + if ((*images)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + (*images)->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + *images=GetFirstImageInList(*images); + length=GetImageListLength(*images); + delete_list=(MagickBooleanType *) AcquireQuantumMemory(length, + sizeof(*delete_list)); + if (delete_list == (MagickBooleanType *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",(*images)->filename); + return; + } + image=(*images); + for (i=0; i < (ssize_t) length; i++) + delete_list[i]=MagickFalse; + /* + Note which images will be deleted, avoid duplicates. + */ + for (p=(char *) scenes; *p != '\0';) + { + while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ',')) + p++; + first=strtol(p,&p,10); + if (first < 0) + first+=(long) length; + last=first; + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + if (*p == '-') + { + last=strtol(p+1,&p,10); + if (last < 0) + last+=(long) length; + } + if (first > last) + continue; + for (i=(ssize_t) first; i <= (ssize_t) last; i++) + if ((i >= 0) && (i < (ssize_t) length)) + delete_list[i]=MagickTrue; + } + /* + Delete images marked for deletion, once only. + */ + image=(*images); + for (i=0; i < (ssize_t) length; i++) + { + *images=image; + image=GetNextImageInList(image); + if (delete_list[i] != MagickFalse) + DeleteImageFromList(images); + } + (void) RelinquishMagickMemory(delete_list); + *images=GetFirstImageInList(*images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y I m a g e L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyImageList() destroys an image list. +% +% The format of the DestroyImageList method is: +% +% Image *DestroyImageList(Image *image) +% +% A description of each parameter follows: +% +% o image: the image sequence. +% +*/ +MagickExport Image *DestroyImageList(Image *images) +{ + if (images == (Image *) NULL) + return((Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + while (images != (Image *) NULL) + DeleteImageFromList(&images); + return((Image *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D u p l i c a t e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DuplicateImages() duplicates one or more images from an image sequence, +% using a count and a comma separated list of image numbers or ranges. +% +% The numbers start at 0 for the first image, while negative numbers refer to +% images starting counting from the end of the range. Images may be referred to +% multiple times without problems. Image referred beyond the available number +% of images in list are ignored. +% +% The format of the DuplicateImages method is: +% +% Image *DuplicateImages(Image *images,const size_t number_duplicates, +% const char *scenes,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o images: the image sequence. +% +% o number_duplicates: duplicate the image sequence this number of times. +% +% o scenes: This character string specifies which scenes to duplicate (e.g. +% 1,3-5,-2-6,2). +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image *DuplicateImages(Image *images, + const size_t number_duplicates,const char *scenes,ExceptionInfo *exception) +{ + Image + *clone_images, + *duplicate_images; + + ssize_t + i; + + /* + Duplicate images. + */ + assert(images != (Image *) NULL); + assert(images->signature == MagickCoreSignature); + assert(scenes != (char *) NULL); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + duplicate_images=NewImageList(); + for (i=0; i < (ssize_t) number_duplicates; i++) + { + clone_images=CloneImages(images,scenes,exception); + AppendImageToList(&duplicate_images,clone_images); + } + return(duplicate_images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t F i r s t I m a g e I n L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetFirstImageInList() returns a pointer to the first image in the list. +% +% The format of the GetFirstImageInList method is: +% +% Image *GetFirstImageInList(const Image *images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport Image *GetFirstImageInList(const Image *images) +{ + const Image + *p; + + if (images == (Image *) NULL) + return((Image *) NULL); + assert(images->signature == MagickCoreSignature); + for (p=images; p->previous != (Image *) NULL; p=p->previous) ; + return((Image *) p); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e F r o m L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageFromList() returns an image at the specified index from the image +% list. Starting with 0 as the first image in the list. +% +% A negative offset will return the image from the end of the list, such that +% an index of -1 is the last image. +% +% If no such image exists at the specified offset a NULL image pointer is +% returned. This will only happen if index is less that the negative of +% the list length, or larger than list length -1. EG: ( -N to N-1 ) +% +% The format of the GetImageFromList method is: +% +% Image *GetImageFromList(const Image *images,const ssize_t index) +% +% A description of each parameter follows: +% +% o images: the image list. +% +% o index: the position within the list. +% +*/ +MagickExport Image *GetImageFromList(const Image *images,const ssize_t index) +{ + const Image + *p; + + ssize_t + i; + + if (images == (Image *) NULL) + return((Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + if (index < 0) + { + p=GetLastImageInList(images); + for (i=(-1); p != (Image *) NULL; p=p->previous) + if (i-- == index) + break; + } + else + { + p=GetFirstImageInList(images); + for (i=0; p != (Image *) NULL; p=p->next) + if (i++ == index) + break; + } + return((Image *) p); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e I n d e x I n L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageIndexInList() returns the offset in the list of the specified image. +% +% The format of the GetImageIndexInList method is: +% +% ssize_t GetImageIndexInList(const Image *images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport ssize_t GetImageIndexInList(const Image *images) +{ + ssize_t + i; + + if (images == (const Image *) NULL) + return(-1); + assert(images->signature == MagickCoreSignature); + for (i=0; images->previous != (Image *) NULL; i++) + { + assert(images != images->previous); + images=images->previous; + } + return(i); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e L i s t L e n g t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageListLength() returns the length of the list (the number of images in +% the list). +% +% The format of the GetImageListLength method is: +% +% size_t GetImageListLength(const Image *images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport size_t GetImageListLength(const Image *images) +{ + ssize_t + i; + + if (images == (Image *) NULL) + return(0); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + images=GetLastImageInList(images); + for (i=0; images != (Image *) NULL; images=images->previous) + { + assert(images != images->previous); + i++; + } + return((size_t) i); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t L a s t I m a g e I n L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetLastImageInList() returns a pointer to the last image in the list. +% +% The format of the GetLastImageInList method is: +% +% Image *GetLastImageInList(const Image *images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport Image *GetLastImageInList(const Image *images) +{ + const Image + *p; + + if (images == (Image *) NULL) + return((Image *) NULL); + assert(images->signature == MagickCoreSignature); + for (p=images; p->next != (Image *) NULL; p=p->next) ; + return((Image *) p); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t N e x t I m a g e I n L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetNextImageInList() returns the next image in the list. +% +% The format of the GetNextImageInList method is: +% +% Image *GetNextImageInList(const Image *images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport Image *GetNextImageInList(const Image *images) +{ + if (images == (Image *) NULL) + return((Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + return(images->next); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P r e v i o u s I m a g e I n L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPreviousImageInList() returns the previous image in the list. +% +% The format of the GetPreviousImageInList method is: +% +% Image *GetPreviousImageInList(const Image *images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport Image *GetPreviousImageInList(const Image *images) +{ + if (images == (Image *) NULL) + return((Image *) NULL); + assert(images->signature == MagickCoreSignature); + return(images->previous); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% I m a g e L i s t T o A r r a y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ImageListToArray() is a convenience method that converts an image list to +% a sequential array, with a NULL image pointer at the end of the array. +% +% The images remain part of the original image list, with the array providing +% an alternative means of indexing the image array. +% +% group = ImageListToArray(images, exception); +% while (i = 0; group[i] != (Image *) NULL; i++) +% printf("%s\n", group[i]->filename); +% printf("%d images\n", i); +% group = RelinquishMagickMemory(group); +% +% The format of the ImageListToArray method is: +% +% Image **ImageListToArray(const Image *images,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image list. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport Image **ImageListToArray(const Image *images, + ExceptionInfo *exception) +{ + Image + **group; + + ssize_t + i; + + if (images == (Image *) NULL) + return((Image **) NULL); + assert(images->signature == MagickCoreSignature); + if (images->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename); + group=(Image **) AcquireQuantumMemory((size_t) GetImageListLength(images)+1UL, + sizeof(*group)); + if (group == (Image **) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",images->filename); + return((Image **) NULL); + } + images=GetFirstImageInList(images); + for (i=0; images != (Image *) NULL; images=images->next) + { + assert(images != images->next); + group[i++]=(Image *) images; + } + group[i]=(Image *) NULL; + return(group); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I n s e r t I m a g e I n L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% InsertImageInList() insert the given image or image list, into the first +% image list, immediately AFTER the image pointed to. The given image list +% pointer is left unchanged unless previously empty. +% +% The format of the InsertImageInList method is: +% +% InsertImageInList(Image **images,Image *insert) +% +% A description of each parameter follows: +% +% o images: the image list to insert into. +% +% o insert: the image list to insert. +% +*/ +MagickExport void InsertImageInList(Image **images,Image *insert) +{ + Image + *split; + + assert(images != (Image **) NULL); + assert(insert != (Image *) NULL); + assert(insert->signature == MagickCoreSignature); + if (insert->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",insert->filename); + if ((*images) == (Image *) NULL) + return; + assert((*images)->signature == MagickCoreSignature); + split=SplitImageList(*images); + AppendImageToList(images,insert); + AppendImageToList(images,split); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w I m a g e L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewImageList() creates an empty image list. +% +% The format of the NewImageList method is: +% +% Image *NewImageList(void) +% +*/ +MagickExport Image *NewImageList(void) +{ + return((Image *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P r e p e n d I m a g e T o L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PrependImageToList() prepends the image to the beginning of the list. +% +% The format of the PrependImageToList method is: +% +% PrependImageToList(Image *images,Image *image) +% +% A description of each parameter follows: +% +% o images: the image list. +% +% o image: the image. +% +*/ +MagickExport void PrependImageToList(Image **images,Image *image) +{ + AppendImageToList(&image,*images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e m o v e I m a g e F r o m L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RemoveImageFromList() removes and returns the image pointed to. +% +% The given image list pointer is set to point to the next image in list +% if it exists, otherwise it is set to the previous image, or NULL if list +% was emptied. +% +% The format of the RemoveImageFromList method is: +% +% Image *RemoveImageFromList(Image **images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport Image *RemoveImageFromList(Image **images) +{ + Image + *p; + + assert(images != (Image **) NULL); + if ((*images) == (Image *) NULL) + return((Image *) NULL); + assert((*images)->signature == MagickCoreSignature); + if ((*images)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + (*images)->filename); + p=(*images); + if ((p->previous == (Image *) NULL) && (p->next == (Image *) NULL)) + *images=(Image *) NULL; + else + { + if (p->previous != (Image *) NULL) + { + p->previous->next=p->next; + *images=p->previous; + } + if (p->next != (Image *) NULL) + { + p->next->previous=p->previous; + *images=p->next; + } + p->previous=(Image *) NULL; + p->next=(Image *) NULL; + } + return(p); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e m o v e F i r s t I m a g e F r o m L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RemoveFirstImageFromList() removes and returns the first image in the list. +% +% If the given image list pointer pointed to the removed first image, it is +% set to the new first image of list, or NULL if list was emptied, otherwise +% it is left as is. +% +% The format of the RemoveFirstImageFromList method is: +% +% Image *RemoveFirstImageFromList(Image **images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport Image *RemoveFirstImageFromList(Image **images) +{ + Image + *image; + + assert(images != (Image **) NULL); + if ((*images) == (Image *) NULL) + return((Image *) NULL); + assert((*images)->signature == MagickCoreSignature); + if ((*images)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + (*images)->filename); + image=(*images); + while (image->previous != (Image *) NULL) + image=image->previous; + if (image == *images) + *images=(*images)->next; + if (image->next != (Image *) NULL) + { + image->next->previous=(Image *) NULL; + image->next=(Image *) NULL; + } + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e m o v e L a s t I m a g e F r o m L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RemoveLastImageFromList() removes and returns the last image from the list. +% +% If the given image list pointer pointed to the removed last image, it is +% set to the new last image of list, or NULL if list was emptied, otherwise +% it is left as is. +% +% The format of the RemoveLastImageFromList method is: +% +% Image *RemoveLastImageFromList(Image **images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport Image *RemoveLastImageFromList(Image **images) +{ + Image + *image; + + assert(images != (Image **) NULL); + if ((*images) == (Image *) NULL) + return((Image *) NULL); + assert((*images)->signature == MagickCoreSignature); + if ((*images)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + (*images)->filename); + image=(*images); + while (image->next != (Image *) NULL) + image=image->next; + if (image == *images) + *images=(*images)->previous; + if (image->previous != (Image *) NULL) + { + image->previous->next=(Image *) NULL; + image->previous=(Image *) NULL; + } + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e p l a c e I m a g e I n L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReplaceImageInList() replaces an image in the list with the given image, or +% list of images. Old image is destroyed. +% +% The images list pointer is set to point to the first image of the inserted +% list of images. +% +% The format of the ReplaceImageInList method is: +% +% ReplaceImageInList(Image **images,Image *replace) +% +% A description of each parameter follows: +% +% o images: the list and pointer to image to replace +% +% o replace: the image or image list replacing the original +% +*/ +MagickExport void ReplaceImageInList(Image **images,Image *replace) +{ + assert(images != (Image **) NULL); + assert(replace != (Image *) NULL); + assert(replace->signature == MagickCoreSignature); + if (replace->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",replace->filename); + if ((*images) == (Image *) NULL) + return; + assert((*images)->signature == MagickCoreSignature); + /* + Link next pointer. + */ + replace=GetLastImageInList(replace); + replace->next=(*images)->next; + if (replace->next != (Image *) NULL) + replace->next->previous=replace; + /* + Link previous pointer - set images position to first replacement image. + */ + replace=GetFirstImageInList(replace); + replace->previous=(*images)->previous; + if (replace->previous != (Image *) NULL) + replace->previous->next=replace; + /* + Destroy the replaced image that was in images. + */ + (void) DestroyImage(*images); + (*images)=replace; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e p l a c e I m a g e I n L i s t R e t u r n L a s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReplaceImageInListReturnLast() is exactly as ReplaceImageInList() except +% the images pointer is set to the last image in the list of replacement +% images. +% +% This allows you to simply use GetNextImageInList() to go to the image +% that follows the just replaced image, even if a list of replacement images +% was inserted. +% +% The format of the ReplaceImageInList method is: +% +% ReplaceImageInListReturnLast(Image **images,Image *replace) +% +% A description of each parameter follows: +% +% o images: the list and pointer to image to replace +% +% o replace: the image or image list replacing the original +% +*/ +MagickExport void ReplaceImageInListReturnLast(Image **images,Image *replace) +{ + assert(images != (Image **) NULL); + assert(replace != (Image *) NULL); + assert(replace->signature == MagickCoreSignature); + if (replace->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",replace->filename); + if ((*images) == (Image *) NULL) + return; + assert((*images)->signature == MagickCoreSignature); + /* + Link previous pointer. + */ + replace=GetFirstImageInList(replace); + replace->previous=(*images)->previous; + if (replace->previous != (Image *) NULL) + replace->previous->next=replace; + /* + Link next pointer - set images position to last replacement image. + */ + replace=GetLastImageInList(replace); + replace->next=(*images)->next; + if (replace->next != (Image *) NULL) + replace->next->previous=replace; + /* + Destroy the replaced image that was in images. + */ + (void) DestroyImage(*images); + (*images)=replace; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e v e r s e I m a g e L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReverseImageList() reverses the order of an image list. +% The list pointer is reset to that start of the re-ordered list. +% +% The format of the ReverseImageList method is: +% +% void ReverseImageList(Image **images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport void ReverseImageList(Image **images) +{ + Image + *next; + + Image + *p; + + assert(images != (Image **) NULL); + if ((*images) == (Image *) NULL) + return; + assert((*images)->signature == MagickCoreSignature); + if ((*images)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + (*images)->filename); + for (p=(*images); p->next != (Image *) NULL; p=p->next) ; + *images=p; + for ( ; p != (Image *) NULL; p=p->next) + { + next=p->next; + p->next=p->previous; + p->previous=next; + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S p l i c e I m a g e I n t o L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SpliceImageIntoList() removes 'length' images from the list and replaces +% them with the specified splice. Removed images are returned. +% +% The format of the SpliceImageIntoList method is: +% +% SpliceImageIntoList(Image **images,const size_t, +% const Image *splice) +% +% A description of each parameter follows: +% +% o images: the image list. +% +% o length: the length of the image list to remove. +% +% o splice: Replace the removed image list with this list. +% +*/ +MagickExport Image *SpliceImageIntoList(Image **images, + const size_t length,const Image *splice) +{ + Image + *image, + *split; + + size_t + i; + + assert(images != (Image **) NULL); + assert(splice != (Image *) NULL); + assert(splice->signature == MagickCoreSignature); + if ((*images) == (Image *) NULL) + return((Image *) NULL); + assert((*images)->signature == MagickCoreSignature); + if ((*images)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + (*images)->filename); + split=SplitImageList(*images); + AppendImageToList(images,splice); + image=(Image *) NULL; + for (i=0; (i < length) && (split != (Image *) NULL); i++) + AppendImageToList(&image,RemoveImageFromList(&split)); + AppendImageToList(images,split); + return(image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S p l i t I m a g e L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SplitImageList() splits an image into two lists, after given image +% The list that was split off is returned, which may be empty. +% +% The format of the SplitImageList method is: +% +% Image *SplitImageList(Image *images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport Image *SplitImageList(Image *images) +{ + if ((images == (Image *) NULL) || (images->next == (Image *) NULL)) + return((Image *) NULL); + images=images->next; + images->previous->next=(Image *) NULL; + images->previous=(Image *) NULL; + return(images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S y n c I m a g e L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncImageList() synchronizes the scene numbers in an image list. +% +% The format of the SyncImageList method is: +% +% void SyncImageList(Image *images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport void SyncImageList(Image *images) +{ + Image + *p, + *q; + + if (images == (Image *) NULL) + return; + assert(images->signature == MagickCoreSignature); + for (p=images; p != (Image *) NULL; p=p->next) + { + for (q=p->next; q != (Image *) NULL; q=q->next) + if (p->scene == q->scene) + break; + if (q != (Image *) NULL) + break; + } + if (p == (Image *) NULL) + return; + for (p=images->next; p != (Image *) NULL; p=p->next) + p->scene=p->previous->scene+1; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S y n c N e x t I m a g e I n L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SyncNextImageInList() returns the next image in the list after the blob +% referenced is synchronized with the current image. +% +% The format of the SyncNextImageInList method is: +% +% Image *SyncNextImageInList(const Image *images) +% +% A description of each parameter follows: +% +% o images: the image list. +% +*/ +MagickExport Image *SyncNextImageInList(const Image *images) +{ + if (images == (Image *) NULL) + return((Image *) NULL); + assert(images->signature == MagickCoreSignature); + if (images->next == (Image *) NULL) + return((Image *) NULL); + if (images->blob != images->next->blob) + { + DestroyBlob(images->next); + images->next->blob=ReferenceBlob(images->blob); + } + if (images->next->compression == UndefinedCompression) + images->next->compression=images->compression; + if (images->next->endian == UndefinedEndian) + images->next->endian=images->endian; + return(images->next); +} diff --git a/ImageMagick-6.9.12-44/magick/list.h b/ImageMagick-6.9.12-44/magick/list.h new file mode 100644 index 0000000..12b73ea --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/list.h @@ -0,0 +1,65 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image list methods. +*/ +#ifndef MAGICKCORE_LIST_H +#define MAGICKCORE_LIST_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport Image + *CloneImageList(const Image *,ExceptionInfo *), + *CloneImages(const Image *,const char *,ExceptionInfo *), + *DestroyImageList(Image *), + *DuplicateImages(Image *,const size_t,const char *,ExceptionInfo *), + *GetFirstImageInList(const Image *) magick_attribute((__pure__)), + *GetImageFromList(const Image *,const ssize_t) magick_attribute((__pure__)), + *GetLastImageInList(const Image *) magick_attribute((__pure__)), + *GetNextImageInList(const Image *) magick_attribute((__pure__)), + *GetPreviousImageInList(const Image *) magick_attribute((__pure__)), + **ImageListToArray(const Image *,ExceptionInfo *), + *NewImageList(void) magick_attribute((__const__)), + *RemoveImageFromList(Image **), + *RemoveLastImageFromList(Image **), + *RemoveFirstImageFromList(Image **), + *SpliceImageIntoList(Image **,const size_t,const Image *), + *SplitImageList(Image *), + *SyncNextImageInList(const Image *); + +extern MagickExport size_t + GetImageListLength(const Image *) magick_attribute((__pure__)); + +extern MagickExport ssize_t + GetImageIndexInList(const Image *) magick_attribute((__pure__)); + +extern MagickExport void + AppendImageToList(Image **,const Image *), + DeleteImageFromList(Image **), + DeleteImages(Image **,const char *,ExceptionInfo *), + InsertImageInList(Image **,Image *), + PrependImageToList(Image **,Image *), + ReplaceImageInList(Image **,Image *), + ReplaceImageInListReturnLast(Image **,Image *), + ReverseImageList(Image **), + SyncImageList(Image *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/locale-private.h b/ImageMagick-6.9.12-44/magick/locale-private.h new file mode 100644 index 0000000..ce1fd6b --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/locale-private.h @@ -0,0 +1,51 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore private locale methods. +*/ +#ifndef MAGICKCORE_LOCALE_PRIVATE_H +#define MAGICKCORE_LOCALE_PRIVATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static inline int LocaleToLowercase(const int c) +{ + if ((c == EOF) || (c != (unsigned char) c)) + return(c); +#if defined(MAGICKCORE_LOCALE_SUPPORT) + if (c_locale != (locale_t) NULL) + return(tolower_l((int) ((unsigned char) c),c_locale)); +#endif + return(tolower((int) ((unsigned char) c))); +} + +static inline int LocaleToUppercase(const int c) +{ + if ((c == EOF) || (c != (unsigned char) c)) + return(c); +#if defined(MAGICKCORE_LOCALE_SUPPORT) + if (c_locale != (locale_t) NULL) + return(toupper_l((int) ((unsigned char) c),c_locale)); +#endif + return(toupper((int) ((unsigned char) c))); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/magick/locale.c b/ImageMagick-6.9.12-44/magick/locale.c new file mode 100644 index 0000000..eaa85c7 --- /dev/null +++ b/ImageMagick-6.9.12-44/magick/locale.c @@ -0,0 +1,1720 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L OOO CCCC AAA L EEEEE % +% L O O C A A L E % +% L O O C AAAAA L EEE % +% L O O C A A L E % +% LLLLL OOO CCCC A A LLLLL EEEEE % +% % +% % +% MagickCore Image Locale Methods % +% % +% Software Design % +% Cristy % +% July 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/client.h" +#include "magick/configure.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/hashmap.h" +#include "magick/image-private.h" +#include "magick/locale_.h" +#include "magick/locale-private.h" +#include "magick/log.h" +#include "magick/memory_.h" +#include "magick/nt-base-private.h" +#include "magick/semaphore.h" +#include "magick/splay-tree.h" +#include "magick/string_.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/xml-tree.h" +#include "magick/xml-tree-private.h" + +/* + Define declarations. +*/ +#if (defined(MAGICKCORE_HAVE_NEWLOCALE) || defined(MAGICKCORE_WINDOWS_SUPPORT)) && !defined(__MINGW32__) +# define MAGICKCORE_LOCALE_SUPPORT +#endif +#define LocaleFilename "locale.xml" +#define MaxRecursionDepth 200 + +/* + Static declarations. +*/ +static const char + *LocaleMap = + "" + "" + " " + " " + " " + " " + " " + " " + ""; + +#ifdef __VMS +#define asciimap AsciiMap +#endif +#if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP) +static const unsigned char + AsciiMap[] = + { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, + 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, + 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff, + }; +#endif + +static SemaphoreInfo + *locale_semaphore = (SemaphoreInfo *) NULL; + +static SplayTreeInfo + *locale_cache = (SplayTreeInfo *) NULL; + +#if defined(MAGICKCORE_LOCALE_SUPPORT) +static volatile locale_t + c_locale = (locale_t) NULL; +#endif + +/* + Forward declarations. +*/ +static MagickBooleanType + IsLocaleTreeInstantiated(ExceptionInfo *), + LoadLocaleCache(SplayTreeInfo *,const char *,const char *,const char *, + const size_t,ExceptionInfo *); + +#if defined(MAGICKCORE_LOCALE_SUPPORT) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A c q u i r e C L o c a l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireCLocale() allocates the C locale object, or (locale_t) 0 with +% errno set if it cannot be acquired. +% +% The format of the AcquireCLocale method is: +% +% locale_t AcquireCLocale(void) +% +*/ +static locale_t AcquireCLocale(void) +{ +#if defined(MAGICKCORE_HAVE_NEWLOCALE) + if (c_locale == (locale_t) NULL) + c_locale=newlocale(LC_ALL_MASK,"C",(locale_t) 0); +#elif defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__MINGW32__) + if (c_locale == (locale_t) NULL) + c_locale=_create_locale(LC_ALL,"C"); +#endif + return(c_locale); +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e L o c a l e S p l a y T r e e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireLocaleSplayTree() caches one or more locale configurations which +% provides a mapping between locale attributes and a locale tag. +% +% The format of the AcquireLocaleSplayTree method is: +% +% SplayTreeInfo *AcquireLocaleSplayTree(const char *filename, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o filename: the font file tag. +% +% o locale: the actual locale. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static void *DestroyLocaleNode(void *locale_info) +{ + LocaleInfo + *p; + + p=(LocaleInfo *) locale_info; + if (p->path != (char *) NULL) + p->path=DestroyString(p->path); + if (p->tag != (char *) NULL) + p->tag=DestroyString(p->tag); + if (p->message != (char *) NULL) + p->message=DestroyString(p->message); + return(RelinquishMagickMemory(p)); +} + +static SplayTreeInfo *AcquireLocaleSplayTree(const char *filename, + const char *locale,ExceptionInfo *exception) +{ + MagickStatusType + status; + + SplayTreeInfo + *cache; + + cache=NewSplayTree(CompareSplayTreeString,(void *(*)(void *)) NULL, + DestroyLocaleNode); + if (cache == (SplayTreeInfo *) NULL) + ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); + status=MagickTrue; +#if !MAGICKCORE_ZERO_CONFIGURATION_SUPPORT + { + const StringInfo + *option; + + LinkedListInfo + *options; + + options=GetLocaleOptions(filename,exception); + option=(const StringInfo *) GetNextValueInLinkedList(options); + while (option != (const StringInfo *) NULL) + { + status&=LoadLocaleCache(cache,(const char *) GetStringInfoDatum(option), + GetStringInfoPath(option),locale,0,exception); + option=(const StringInfo *) GetNextValueInLinkedList(options); + } + options=DestroyLocaleOptions(options); + if (GetNumberOfNodesInSplayTree(cache) == 0) + { + options=GetLocaleOptions("english.xml",exception); + option=(const StringInfo *) GetNextValueInLinkedList(options); + while (option != (const StringInfo *) NULL) + { + status&=LoadLocaleCache(cache,(const char *) + GetStringInfoDatum(option),GetStringInfoPath(option),locale,0, + exception); + option=(const StringInfo *) GetNextValueInLinkedList(options); + } + options=DestroyLocaleOptions(options); + } + } +#endif + if (GetNumberOfNodesInSplayTree(cache) == 0) + status&=LoadLocaleCache(cache,LocaleMap,"built-in",locale,0, + exception); + return(cache); +} + +#if defined(MAGICKCORE_LOCALE_SUPPORT) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D e s t r o y C L o c a l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyCLocale() releases the resources allocated for a locale object +% returned by a call to the AcquireCLocale() method. +% +% The format of the DestroyCLocale method is: +% +% void DestroyCLocale(void) +% +*/ +static void DestroyCLocale(void) +{ + if (c_locale != (locale_t) NULL) + freelocale(c_locale); + c_locale=(locale_t) NULL; +} +#endif + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y L o c a l e O p t i o n s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyLocaleOptions() releases memory associated with an locale +% messages. +% +% The format of the DestroyProfiles method is: +% +% LinkedListInfo *DestroyLocaleOptions(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ + +static void *DestroyOptions(void *message) +{ + return(DestroyStringInfo((StringInfo *) message)); +} + +MagickExport LinkedListInfo *DestroyLocaleOptions(LinkedListInfo *messages) +{ + assert(messages != (LinkedListInfo *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + return(DestroyLinkedList(messages,DestroyOptions)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ F o r m a t L o c a l e F i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FormatLocaleFile() prints formatted output of a variable argument list to a +% file in the "C" locale. +% +% The format of the FormatLocaleFile method is: +% +% ssize_t FormatLocaleFile(FILE *file,const char *format,...) +% +% A description of each parameter follows. +% +% o file: the file. +% +% o format: A file describing the format to use to write the remaining +% arguments. +% +*/ + +MagickExport ssize_t FormatLocaleFileList(FILE *file, + const char *magick_restrict format,va_list operands) +{ + ssize_t + n; + +#if defined(MAGICKCORE_LOCALE_SUPPORT) && defined(MAGICKCORE_HAVE_VFPRINTF_L) + { + locale_t + locale; + + locale=AcquireCLocale(); + if (locale == (locale_t) NULL) + n=(ssize_t) vfprintf(file,format,operands); + else +#if defined(MAGICKCORE_WINDOWS_SUPPORT) + n=(ssize_t) vfprintf_l(file,format,locale,operands); +#else + n=(ssize_t) vfprintf_l(file,locale,format,operands); +#endif + } +#else +#if defined(MAGICKCORE_LOCALE_SUPPORT) && defined(MAGICKCORE_HAVE_USELOCALE) + { + locale_t + locale, + previous_locale; + + locale=AcquireCLocale(); + if (locale == (locale_t) NULL) + n=(ssize_t) vfprintf(file,format,operands); + else + { + previous_locale=uselocale(locale); + n=(ssize_t) vfprintf(file,format,operands); + uselocale(previous_locale); + } + } +#else + n=(ssize_t) vfprintf(file,format,operands); +#endif +#endif + return(n); +} + +MagickExport ssize_t FormatLocaleFile(FILE *file, + const char *magick_restrict format,...) +{ + ssize_t + n; + + va_list + operands; + + va_start(operands,format); + n=FormatLocaleFileList(file,format,operands); + va_end(operands); + return(n); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ F o r m a t L o c a l e S t r i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FormatLocaleString() prints formatted output of a variable argument list to +% a string buffer in the "C" locale. +% +% The format of the FormatLocaleString method is: +% +% ssize_t FormatLocaleString(char *string,const size_t length, +% const char *format,...) +% +% A description of each parameter follows. +% +% o string: FormatLocaleString() returns the formatted string in this +% character buffer. +% +% o length: the maximum length of the string. +% +% o format: A string describing the format to use to write the remaining +% arguments. +% +*/ + +MagickExport ssize_t FormatLocaleStringList(char *magick_restrict string, + const size_t length,const char *magick_restrict format,va_list operands) +{ + ssize_t + n; + +#if defined(MAGICKCORE_LOCALE_SUPPORT) && defined(MAGICKCORE_HAVE_VSNPRINTF_L) + { + locale_t + locale; + + locale=AcquireCLocale(); + if (locale == (locale_t) NULL) + n=(ssize_t) vsnprintf(string,length,format,operands); + else +#if defined(MAGICKCORE_WINDOWS_SUPPORT) + n=(ssize_t) vsnprintf_l(string,length,format,locale,operands); +#else + n=(ssize_t) vsnprintf_l(string,length,locale,format,operands); +#endif + } +#elif defined(MAGICKCORE_HAVE_VSNPRINTF) +#if defined(MAGICKCORE_LOCALE_SUPPORT) && defined(MAGICKCORE_HAVE_USELOCALE) + { + locale_t + locale, + previous_locale; + + locale=AcquireCLocale(); + if (locale == (locale_t) NULL) + n=(ssize_t) vsnprintf(string,length,format,operands); + else + { + previous_locale=uselocale(locale); + n=(ssize_t) vsnprintf(string,length,format,operands); + uselocale(previous_locale); + } + } +#else + n=(ssize_t) vsnprintf(string,length,format,operands); +#endif +#else + n=(ssize_t) vsprintf(string,format,operands); +#endif + if (n < 0) + string[length-1]='\0'; + return(n); +} + +MagickExport ssize_t FormatLocaleString(char *magick_restrict string, + const size_t length,const char *magick_restrict format,...) +{ + ssize_t + n; + + va_list + operands; + + va_start(operands,format); + n=FormatLocaleStringList(string,length,format,operands); + va_end(operands); + return(n); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ G e t L o c a l e I n f o _ % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetLocaleInfo_() searches the locale list for the specified tag and if +% found returns attributes for that element. +% +% The format of the GetLocaleInfo method is: +% +% const LocaleInfo *GetLocaleInfo_(const char *tag, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o tag: the locale tag. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport const LocaleInfo *GetLocaleInfo_(const char *tag, + ExceptionInfo *exception) +{ + const LocaleInfo + *locale_info; + + assert(exception != (ExceptionInfo *) NULL); + if (IsLocaleTreeInstantiated(exception) == MagickFalse) + return((const LocaleInfo *) NULL); + LockSemaphoreInfo(locale_semaphore); + if ((tag == (const char *) NULL) || (LocaleCompare(tag,"*") == 0)) + { + ResetSplayTreeIterator(locale_cache); + locale_info=(const LocaleInfo *) GetNextValueInSplayTree(locale_cache); + UnlockSemaphoreInfo(locale_semaphore); + return(locale_info); + } + locale_info=(const LocaleInfo *) GetValueFromSplayTree(locale_cache,tag); + UnlockSemaphoreInfo(locale_semaphore); + return(locale_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t L o c a l e I n f o L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetLocaleInfoList() returns any locale messages that match the +% specified pattern. +% +% The format of the GetLocaleInfoList function is: +% +% const LocaleInfo **GetLocaleInfoList(const char *pattern, +% size_t *number_messages,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_messages: This integer returns the number of locale messages in +% the list. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static int LocaleInfoCompare(const void *x,const void *y) +{ + const LocaleInfo + **p, + **q; + + p=(const LocaleInfo **) x, + q=(const LocaleInfo **) y; + if (LocaleCompare((*p)->path,(*q)->path) == 0) + return(LocaleCompare((*p)->tag,(*q)->tag)); + return(LocaleCompare((*p)->path,(*q)->path)); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +MagickExport const LocaleInfo **GetLocaleInfoList(const char *pattern, + size_t *number_messages,ExceptionInfo *exception) +{ + const LocaleInfo + **messages; + + const LocaleInfo + *p; + + ssize_t + i; + + /* + Allocate locale list. + */ + assert(pattern != (char *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern); + assert(number_messages != (size_t *) NULL); + *number_messages=0; + p=GetLocaleInfo_("*",exception); + if (p == (const LocaleInfo *) NULL) + return((const LocaleInfo **) NULL); + messages=(const LocaleInfo **) AcquireQuantumMemory((size_t) + GetNumberOfNodesInSplayTree(locale_cache)+1UL,sizeof(*messages)); + if (messages == (const LocaleInfo **) NULL) + return((const LocaleInfo **) NULL); + /* + Generate locale list. + */ + LockSemaphoreInfo(locale_semaphore); + ResetSplayTreeIterator(locale_cache); + p=(const LocaleInfo *) GetNextValueInSplayTree(locale_cache); + for (i=0; p != (const LocaleInfo *) NULL; ) + { + if ((p->stealth == MagickFalse) && + (GlobExpression(p->tag,pattern,MagickTrue) != MagickFalse)) + messages[i++]=p; + p=(const LocaleInfo *) GetNextValueInSplayTree(locale_cache); + } + UnlockSemaphoreInfo(locale_semaphore); + qsort((void *) messages,(size_t) i,sizeof(*messages),LocaleInfoCompare); + messages[i]=(LocaleInfo *) NULL; + *number_messages=(size_t) i; + return(messages); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t L o c a l e L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetLocaleList() returns any locale messages that match the specified +% pattern. +% +% The format of the GetLocaleList function is: +% +% char **GetLocaleList(const char *pattern,size_t *number_messages, +% Exceptioninfo *exception) +% +% A description of each parameter follows: +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_messages: This integer returns the number of messages in the +% list. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static int LocaleTagCompare(const void *x,const void *y) +{ + char + **p, + **q; + + p=(char **) x; + q=(char **) y; + return(LocaleCompare(*p,*q)); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +MagickExport char **GetLocaleList(const char *pattern, + size_t *number_messages,ExceptionInfo *exception) +{ + char + **messages; + + const LocaleInfo + *p; + + ssize_t + i; + + /* + Allocate locale list. + */ + assert(pattern != (char *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern); + assert(number_messages != (size_t *) NULL); + *number_messages=0; + p=GetLocaleInfo_("*",exception); + if (p == (const LocaleInfo *) NULL) + return((char **) NULL); + messages=(char **) AcquireQuantumMemory((size_t) + GetNumberOfNodesInSplayTree(locale_cache)+1UL,sizeof(*messages)); + if (messages == (char **) NULL) + return((char **) NULL); + LockSemaphoreInfo(locale_semaphore); + p=(const LocaleInfo *) GetNextValueInSplayTree(locale_cache); + for (i=0; p != (const LocaleInfo *) NULL; ) + { + if ((p->stealth == MagickFalse) && + (GlobExpression(p->tag,pattern,MagickTrue) != MagickFalse)) + messages[i++]=ConstantString(p->tag); + p=(const LocaleInfo *) GetNextValueInSplayTree(locale_cache); + } + UnlockSemaphoreInfo(locale_semaphore); + qsort((void *) messages,(size_t) i,sizeof(*messages),LocaleTagCompare); + messages[i]=(char *) NULL; + *number_messages=(size_t) i; + return(messages); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t L o c a l e M e s s a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetLocaleMessage() returns a message in the current locale that matches the +% supplied tag. +% +% The format of the GetLocaleMessage method is: +% +% const char *GetLocaleMessage(const char *tag) +% +% A description of each parameter follows: +% +% o tag: Return a message that matches this tag in the current locale. +% +*/ +MagickExport const char *GetLocaleMessage(const char *tag) +{ + char + name[MaxTextExtent]; + + const LocaleInfo + *locale_info; + + ExceptionInfo + *exception; + + if ((tag == (const char *) NULL) || (*tag == '\0')) + return(tag); + exception=AcquireExceptionInfo(); + (void) FormatLocaleString(name,MaxTextExtent,"%s/",tag); + locale_info=GetLocaleInfo_(name,exception); + exception=DestroyExceptionInfo(exception); + if (locale_info != (const LocaleInfo *) NULL) + return(locale_info->message); + return(tag); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t L o c a l e O p t i o n s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetLocaleOptions() returns any Magick configuration messages associated +% with the specified filename. +% +% The format of the GetLocaleOptions method is: +% +% LinkedListInfo *GetLocaleOptions(const char *filename, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o filename: the locale file tag. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport LinkedListInfo *GetLocaleOptions(const char *filename, + ExceptionInfo *exception) +{ + char + path[MaxTextExtent]; + + const char + *element; + + LinkedListInfo + *messages, + *paths; + + StringInfo + *xml; + + assert(filename != (const char *) NULL); + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename); + assert(exception != (ExceptionInfo *) NULL); + (void) CopyMagickString(path,filename,MaxTextExtent); + /* + Load XML from configuration files to linked-list. + */ + messages=NewLinkedList(0); + paths=GetConfigurePaths(filename,exception); + if (paths != (LinkedListInfo *) NULL) + { + ResetLinkedListIterator(paths); + element=(const char *) GetNextValueInLinkedList(paths); + while (element != (const char *) NULL) + { + (void) FormatLocaleString(path,MaxTextExtent,"%s%s",element,filename); + (void) LogMagickEvent(LocaleEvent,GetMagickModule(), + "Searching for locale file: \"%s\"",path); + xml=ConfigureFileToStringInfo(path); + if (xml != (StringInfo *) NULL) + (void) AppendValueToLinkedList(messages,xml); + element=(const char *) GetNextValueInLinkedList(paths); + } + paths=DestroyLinkedList(paths,RelinquishMagickMemory); + } +#if defined(MAGICKCORE_WINDOWS_SUPPORT) + { + char + *blob; + + blob=(char *) NTResourceToBlob(filename); + if (blob != (char *) NULL) + { + xml=AcquireStringInfo(0); + SetStringInfoLength(xml,strlen(blob)+1); + SetStringInfoDatum(xml,(const unsigned char *) blob); + blob=(char *) RelinquishMagickMemory(blob); + SetStringInfoPath(xml,filename); + (void) AppendValueToLinkedList(messages,xml); + } + } +#endif + ResetLinkedListIterator(messages); + return(messages); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t L o c a l e V a l u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetLocaleValue() returns the message associated with the locale info. +% +% The format of the GetLocaleValue method is: +% +% const char *GetLocaleValue(const LocaleInfo *locale_info) +% +% A description of each parameter follows: +% +% o locale_info: The locale info. +% +*/ +MagickExport const char *GetLocaleValue(const LocaleInfo *locale_info) +{ + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(locale_info != (LocaleInfo *) NULL); + assert(locale_info->signature == MagickCoreSignature); + return(locale_info->message); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ I s L o c a l e T r e e I n s t a n t i a t e d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsLocaleTreeInstantiated() determines if the locale tree is instantiated. +% If not, it instantiates the tree and returns it. +% +% The format of the IsLocaleInstantiated method is: +% +% MagickBooleanType IsLocaleTreeInstantiated(ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static MagickBooleanType IsLocaleTreeInstantiated(ExceptionInfo *exception) +{ + if (locale_cache == (SplayTreeInfo *) NULL) + { + if (locale_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&locale_semaphore); + LockSemaphoreInfo(locale_semaphore); + if (locale_cache == (SplayTreeInfo *) NULL) + { + char + *locale; + + const char + *p; + + locale=(char *) NULL; + p=setlocale(LC_CTYPE,(const char *) NULL); + if (p != (const char *) NULL) + locale=ConstantString(p); + if (locale == (char *) NULL) + locale=GetEnvironmentValue("LC_ALL"); + if (locale == (char *) NULL) + locale=GetEnvironmentValue("LC_MESSAGES"); + if (locale == (char *) NULL) + locale=GetEnvironmentValue("LC_CTYPE"); + if (locale == (char *) NULL) + locale=GetEnvironmentValue("LANG"); + if (locale == (char *) NULL) + locale=ConstantString("C"); + locale_cache=AcquireLocaleSplayTree(LocaleFilename,locale,exception); + locale=DestroyString(locale); + } + UnlockSemaphoreInfo(locale_semaphore); + } + return(locale_cache != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ I n t e r p r e t L o c a l e V a l u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% InterpretLocaleValue() interprets the string as a floating point number in +% the "C" locale and returns its value as a double. If sentinal is not a null +% pointer, the method also sets the value pointed by sentinal to point to the +% first character after the number. +% +% The format of the InterpretLocaleValue method is: +% +% double InterpretLocaleValue(const char *value,char **sentinal) +% +% A description of each parameter follows: +% +% o value: the string value. +% +% o sentinal: if sentinal is not NULL, a pointer to the character after the +% last character used in the conversion is stored in the location +% referenced by sentinal. +% +*/ +MagickExport double InterpretLocaleValue(const char *magick_restrict string, + char **magick_restrict sentinal) +{ + char + *q; + + double + value; + + if ((*string == '0') && ((string[1] | 0x20)=='x')) + value=(double) strtoul(string,&q,16); + else + { +#if defined(MAGICKCORE_LOCALE_SUPPORT) && defined(MAGICKCORE_HAVE_STRTOD_L) + locale_t + locale; + + locale=AcquireCLocale(); + if (locale == (locale_t) NULL) + value=strtod(string,&q); + else + value=strtod_l(string,&q,locale); +#else + value=strtod(string,&q); +#endif + } + if (sentinal != (char **) NULL) + *sentinal=q; + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% L i s t L o c a l e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ListLocaleInfo() lists the locale info to a file. +% +% The format of the ListLocaleInfo method is: +% +% MagickBooleanType ListLocaleInfo(FILE *file,ExceptionInfo *exception) +% +% A description of each parameter follows. +% +% o file: An pointer to a FILE. +% +% o exception: return any errors or warnings in this structure. +% +*/ +MagickExport MagickBooleanType ListLocaleInfo(FILE *file, + ExceptionInfo *exception) +{ + const char + *path; + + const LocaleInfo + **locale_info; + + ssize_t + i; + + size_t + number_messages; + + if (file == (const FILE *) NULL) + file=stdout; + number_messages=0; + locale_info=GetLocaleInfoList("*",&number_messages,exception); + if (locale_info == (const LocaleInfo **) NULL) + return(MagickFalse); + path=(const char *) NULL; + for (i=0; i < (ssize_t) number_messages; i++) + { + if (locale_info[i]->stealth != MagickFalse) + continue; + if ((path == (const char *) NULL) || + (LocaleCompare(path,locale_info[i]->path) != 0)) + { + if (locale_info[i]->path != (char *) NULL) + (void) FormatLocaleFile(file,"\nPath: %s\n\n",locale_info[i]->path); + (void) FormatLocaleFile(file,"Tag/Message\n"); + (void) FormatLocaleFile(file, + "-------------------------------------------------" + "------------------------------\n"); + } + path=locale_info[i]->path; + (void) FormatLocaleFile(file,"%s\n",locale_info[i]->tag); + if (locale_info[i]->message != (char *) NULL) + (void) FormatLocaleFile(file," %s",locale_info[i]->message); + (void) FormatLocaleFile(file,"\n"); + } + (void) fflush(file); + locale_info=(const LocaleInfo **) + RelinquishMagickMemory((void *) locale_info); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ L o a d L o c a l e C a c h e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% LoadLocaleCache() loads the locale configurations which provides a mapping +% between locale attributes and a locale name. +% +% The format of the LoadLocaleCache method is: +% +% MagickBooleanType LoadLocaleCache(SplayTreeInfo *cache,const char *xml, +% const char *filename,const size_t depth,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o xml: The locale list in XML format. +% +% o filename: The locale list filename. +% +% o depth: depth of statements. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static void ChopLocaleComponents(char *path,const size_t components) +{ + char + *p; + + ssize_t + count; + + if (*path == '\0') + return; + p=path+strlen(path)-1; + if (*p == '/') + *p='\0'; + for (count=0; (count < (ssize_t) components) && (p > path); p--) + if (*p == '/') + { + *p='\0'; + count++; + } + if (count < (ssize_t) components) + *path='\0'; +} + +static void LocaleFatalErrorHandler( + const ExceptionType magick_unused(severity), + const char *reason,const char *description) +{ + magick_unreferenced(severity); + + if (reason == (char *) NULL) + return; + (void) FormatLocaleFile(stderr,"%s: %s",GetClientName(),reason); + if (description != (char *) NULL) + (void) FormatLocaleFile(stderr," (%s)",description); + (void) FormatLocaleFile(stderr,".\n"); + (void) fflush(stderr); + exit(1); +} + +static MagickBooleanType LoadLocaleCache(SplayTreeInfo *cache,const char *xml, + const char *filename,const char *locale,const size_t depth, + ExceptionInfo *exception) +{ + char + keyword[MaxTextExtent], + message[MaxTextExtent], + tag[MaxTextExtent], + *token; + + const char + *q; + + FatalErrorHandler + fatal_handler; + + LocaleInfo + *locale_info; + + MagickStatusType + status; + + char + *p; + + size_t + extent; + + /* + Read the locale configure file. + */ + (void) LogMagickEvent(ConfigureEvent,GetMagickModule(), + "Loading locale configure file \"%s\" ...",filename); + if (xml == (const char *) NULL) + return(MagickFalse); + status=MagickTrue; + locale_info=(LocaleInfo *) NULL; + *tag='\0'; + *message='\0'; + *keyword='\0'; + fatal_handler=SetFatalErrorHandler(LocaleFatalErrorHandler); + token=AcquireString(xml); + extent=strlen(token)+MaxTextExtent; + for (q=(char *) xml; *q != '\0'; ) + { + /* + Interpret XML. + */ + (void) GetNextToken(q,&q,extent,token); + if (*token == '\0') + break; + (void) CopyMagickString(keyword,token,MaxTextExtent); + if (LocaleNCompare(keyword,"",2) != 0) && (*q != '\0')) + { + (void) GetNextToken(q,&q,extent,token); + while (isspace((int) ((unsigned char) *q)) != 0) + q++; + } + continue; + } + if (LocaleNCompare(keyword,""); + else + if (strncmp(xml,""); + if (xml != (char *) NULL) + { + ParseProcessingInstructions(root,c,(size_t) (xml-c)); + xml++; + } + } + else + if (*xml == '<') + xml=strchr(xml,'>'); + else + if ((*(xml++) == '%') && (root->standalone == MagickFalse)) + break; + } + predefined_entitites=(char **) RelinquishMagickMemory(predefined_entitites); + return(MagickTrue); +} + +static void ParseOpenTag(XMLTreeRoot *root,char *tag,char **attributes) +{ + XMLTreeInfo + *xml_info; + + xml_info=root->node; + if (xml_info->tag == (char *) NULL) + xml_info->tag=ConstantString(tag); + else + xml_info=AddChildToXMLTree(xml_info,tag,strlen(xml_info->content)); + if (xml_info != (XMLTreeInfo *) NULL) + xml_info->attributes=attributes; + root->node=xml_info; +} + +static const char + *skip_tags[3] = + { + "rdf:Bag", + "rdf:Seq", + (const char *) NULL + }; + +static inline MagickBooleanType IsSkipTag(const char *tag) +{ + ssize_t + i; + + i=0; + while (skip_tags[i] != (const char *) NULL) + { + if (LocaleCompare(tag,skip_tags[i]) == 0) + return(MagickTrue); + i++; + } + return(MagickFalse); +} + +MagickExport XMLTreeInfo *NewXMLTree(const char *xml,ExceptionInfo *exception) +{ + char + **attribute, + **attributes, + *tag, + *utf8; + + int + c, + terminal; + + MagickBooleanType + status; + + char + *p; + + ssize_t + i; + + size_t + ignore_depth, + length; + + ssize_t + j, + l; + + XMLTreeRoot + *root; + + /* + Convert xml-string to UTF8. + */ + if ((xml == (const char *) NULL) || (strlen(xml) == 0)) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning, + "ParseError","root tag missing"); + return((XMLTreeInfo *) NULL); + } + root=(XMLTreeRoot *) NewXMLTreeTag((char *) NULL); + length=strlen(xml); + utf8=ConvertUTF16ToUTF8(xml,&length); + if (utf8 == (char *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning, + "ParseError","UTF16 to UTF8 failed"); + return((XMLTreeInfo *) NULL); + } + terminal=utf8[length-1]; + utf8[length-1]='\0'; + p=utf8; + while ((*p != '\0') && (*p != '<')) + p++; + if (*p == '\0') + { + (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning, + "ParseError","root tag missing"); + utf8=DestroyString(utf8); + return((XMLTreeInfo *) NULL); + } + attribute=(char **) NULL; + l=0; + ignore_depth=0; + for (p++; ; p++) + { + attributes=(char **) sentinel; + tag=p; + c=(*p); + if ((isalpha((int) ((unsigned char) *p)) !=0) || (*p == '_') || + (*p == ':') || (c < '\0')) + { + /* + Tag. + */ + if (root->node == (XMLTreeInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionWarning,"ParseError","root tag missing"); + utf8=DestroyString(utf8); + return(&root->root); + } + p+=strcspn(p,XMLWhitespace "/>"); + while (isspace((int) ((unsigned char) *p)) != 0) + *p++='\0'; + if (((isalpha((int) ((unsigned char) *p)) != 0) || (*p == '_')) && + (ignore_depth == 0)) + { + if ((*p != '\0') && (*p != '/') && (*p != '>')) + { + /* + Find tag in default attributes list. + */ + i=0; + while ((root->attributes[i] != (char **) NULL) && + (strcmp(root->attributes[i][0],tag) != 0)) + i++; + attribute=root->attributes[i]; + } + for (l=0; (*p != '\0') && (*p != '/') && (*p != '>'); l+=2) + { + /* + Attribute. + */ + if (l == 0) + attributes=(char **) AcquireQuantumMemory(4, + sizeof(*attributes)); + else + attributes=(char **) ResizeQuantumMemory(attributes, + (size_t) (l+4),sizeof(*attributes)); + if (attributes == (char **) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",""); + utf8=DestroyString(utf8); + return(&root->root); + } + attributes[l+2]=(char *) NULL; + attributes[l+1]=(char *) NULL; + attributes[l]=p; + p+=strcspn(p,XMLWhitespace "=/>"); + if ((*p != '=') && (isspace((int) ((unsigned char) *p)) == 0)) + attributes[l]=ConstantString(""); + else + { + *p++='\0'; + p+=strspn(p,XMLWhitespace "="); + c=(*p); + if ((c == '"') || (c == '\'')) + { + /* + Attributes value. + */ + p++; + attributes[l+1]=p; + while ((*p != '\0') && (*p != c)) + p++; + if (*p != '\0') + *p++='\0'; + else + { + attributes[l]=ConstantString(""); + attributes[l+1]=ConstantString(""); + (void) DestroyXMLTreeAttributes(attributes); + (void) ThrowMagickException(exception, + GetMagickModule(),OptionWarning,"ParseError", + "missing %c",c); + utf8=DestroyString(utf8); + return(&root->root); + } + j=1; + while ((attribute != (char **) NULL) && + (attribute[j] != (char *) NULL) && + (strcmp(attribute[j],attributes[l]) != 0)) + j+=3; + attributes[l+1]=ParseEntities(attributes[l+1], + root->entities,(attribute != (char **) NULL) && + (attribute[j] != (char *) NULL) ? *attribute[j+2] : + ' '); + } + attributes[l]=ConstantString(attributes[l]); + } + while (isspace((int) ((unsigned char) *p)) != 0) + p++; + } + } + else + { + while((*p != '\0') && (*p != '/') && (*p != '>')) + p++; + } + if (*p == '/') + { + /* + Self closing tag. + */ + *p++='\0'; + if (((*p != '\0') && (*p != '>')) || + ((*p == '\0') && (terminal != '>'))) + { + if (l != 0) + (void) DestroyXMLTreeAttributes(attributes); + (void) ThrowMagickException(exception,GetMagickModule(), + OptionWarning,"ParseError","missing >"); + utf8=DestroyString(utf8); + return(&root->root); + } + if ((ignore_depth != 0) || (IsSkipTag(tag) != MagickFalse)) + (void) DestroyXMLTreeAttributes(attributes); + else + { + ParseOpenTag(root,tag,attributes); + (void) ParseCloseTag(root,tag,exception); + } + } + else + { + c=(*p); + if ((*p == '>') || ((*p == '\0') && (terminal == '>'))) + { + *p='\0'; + if ((ignore_depth == 0) && (IsSkipTag(tag) == MagickFalse)) + ParseOpenTag(root,tag,attributes); + else + { + ignore_depth++; + (void) DestroyXMLTreeAttributes(attributes); + } + *p=c; + } + else + { + if (l != 0) + (void) DestroyXMLTreeAttributes(attributes); + (void) ThrowMagickException(exception,GetMagickModule(), + OptionWarning,"ParseError","missing >"); + utf8=DestroyString(utf8); + return(&root->root); + } + } + } + else + if (*p == '/') + { + /* + Close tag. + */ + tag=p+1; + p+=strcspn(tag,XMLWhitespace ">")+1; + c=(*p); + if ((c == '\0') && (terminal != '>')) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionWarning,"ParseError","missing >"); + utf8=DestroyString(utf8); + return(&root->root); + } + *p='\0'; + if ((ignore_depth == 0) && + (ParseCloseTag(root,tag,exception) != (XMLTreeInfo *) NULL)) + { + utf8=DestroyString(utf8); + return(&root->root); + } + if (ignore_depth > 0) + ignore_depth--; + *p=c; + if (isspace((int) ((unsigned char) *p)) != 0) + p+=strspn(p,XMLWhitespace); + } + else + if (strncmp(p,"!--",3) == 0) + { + /* + Comment. + */ + p=strstr(p+3,"--"); + if ((p == (char *) NULL) || ((*(p+=2) != '>') && (*p != '\0')) || + ((*p == '\0') && (terminal != '>'))) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionWarning,"ParseError","unclosed + +|; + s|||; + s|| + + + + + + + + +
    Powered by NetworkElevenImageMagick logo
    + + + + +
    +
    +
    +
    +
    +
    + + + +
    +|; + s|| +
    + +Top of page +
    + + "Image manipulation software that works like magick" +
    + + +|; + s|||g; + s|||g; + + s|

    |

    |g; + s|

    |

    &KaGH)Gkda(+aWpNT?UWYtAe69ZJ61CQ+ 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�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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/index.html b/ImageMagick-6.9.12-44/index.html new file mode 100644 index 0000000..95e7eff --- /dev/null +++ b/ImageMagick-6.9.12-44/index.html @@ -0,0 +1,276 @@ + + + + + + + + + + ImageMagick (legacy) – Convert, Edit, or Compose Digital Images + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    57FBsDH&XcGBupIpv`zRO1@h(;> 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%0D-{j3U8%uLD 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¥8kWK~H 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

    |g; + + s|
    |

    |g; + s|
    |
    |g; + s|
    |
    |g; + s|
    |
    |g; + s|

    |

    |g; + s|

    |

    |g; + s|||g; + s|>o |>|g; + s|unsignedint|unsigned int|g; + print( OUT $_ ); + } + close( TMP ); + close( IN ); +} + +# +# Pre-process file into intermediate form +# +# Initializes globals: +# +# @functions - Function names +# %synopsis - Function synopsis +# +sub pre_format { + my($infile, $tmpfile) = @_; + + my $inpara = 0; # Set to 1 if in paragraph + my $inlist = 0; # Set to 1 if in list-item paragraph + + # Open C source file + open( IN, "<$infile" ) || die("Failed to open \"$infile\" for read\n" ); + + # Open TMP file + open( TMP, ">$tmpfile" ) || die("Failed to open \"$tmpfile\" for write\n" ); + + undef @functions; + undef %synopsis; + + # Skip past first form feed + while() { + last if m/\014/; + } + +LINE: + while() { + if (m/^\+/) { + while() { + last unless m/^%/; + } + next; + } + next unless m/^%/ ; + chop; + + # Extract and save function title + if (m/^%\s+((\w )+)\s+%/) { + ($ftitle = $1) =~ s/ //g; + push(@functions, $ftitle); + print( TMP "===$ftitle\n" ); + next; + } + + # Zap text we don't want + next if ( m/^%.+%/ ); # "%*% + s/^%\s{0,2}//; + + # Extract and save synopsis info + if (m /\(\)/ ) { + # nothing + ; + } + elsif ( m/${ftitle}\(.*\)$/ ) { + s/,/ , /g; + s/\(/ ( /g; + s/\)/ ) /g; + s/\*/ * /g; + s/\s+/ /g; + + s/\(\s+\*/(*/g; + s/ ,/,/g; + s/ \(/(/g; + s/\) /)/g; + s/ \* / */g; + + s/^\s*//; + $synopsis{$ftitle} = $_ . ';'; # Append semi-colon, prototype style + print ( TMP " " . $synopsis{$ftitle} . "\n" ); + next LINE; + } + elsif ( m/${ftitle}\(.*/ ) { + $synopsis{$ftitle} = $_; + do { + $_ = ; + chop; + # Zap text we don't want + next if m/^%.+%/; # "%*% + s/^%\s{0,2}//; + $synopsis{$ftitle} .= $_; + } until m/^\s*$/; + $_ = $synopsis{$ftitle}; + + s/,/ , /g; + s/\(/ ( /g; + s/\)/ ) /g; + s/\*/ * /g; + s/\s+/ /g; + + s/\(\s+\*/(*/g; + s/ ,/,/g; + s/ \(/(/g; + s/\) /)/g; + s/ \* / */g; + + s/^\s*//; + $synopsis{$ftitle} = $_ . ';'; # Append semi-colon, prototype style + print ( TMP " " . $synopsis{$ftitle} . "\n" ); + next LINE; + } + + # Keep track of paragraphing + if( ! m/^$/ ) { + if ( $inpara == 0 ) { + $inpara = 1; # Start of paragraph + $para = "$_"; # Start paragraph string + } else { + # Inside paragraph + $para .= " $_"; # Add line to paragraph + } + } + # Keep track of list items so they can + # be wrapped as a paragraph + if( m/^\s+(o[^:]+:|o|[0-9]\.)\s(.*)/ ) { + $inlist = 1; + } + + if ( $inpara == 1 ) { + if( $para =~ m/^\s+\S+/ && ! $inlist ) { + # Lines that start with a space shouldn't be munged + $inpara = 0; # End of paragraph + $inlist = 0; + $para .= ""; # Terminate paragraph + print( TMP "$para\n" ); + } + elsif( m/^$/ ) { + # End of paragraph + $inpara = 0; # End of paragraph + $inlist = 0; + $para .= ""; # Terminate paragraph + $para =~ s/^\s+//g; # Eliminate any leading space + $para =~ s/\s+/ /g; # Canonicalize whitespace + $para =~ s/ $//; # Trim final space + $para =~ s/([a-zA-Z0-9][.!?][)'"]*) /$1 /g; #' Fix sentance ends + print( TMP "\n$para\n\n" ); + } + } + } + + close( TMP ); + close( IN ); +} + +# +# Second pass +# Process into formatted form +# +sub format_to_pod { + my($infile, $outfile) = @_; + + my $func; + + my $inlist = 0; # Set to one if in indented list + + # Open input file + open( IN, "<$infile" ) || die("Failed to open \"$infile\" for read\n" ); + + # Open output file + open( OUT, ">$outfile" ) || die("Failed to open \"$outfile\" for write\n" ); + + # Name field + print( OUT head1("NAME") ); + if (!defined($whatis{$base})) { + print("Whatis definition missing for \"$base\"!\n"); + print( OUT "${base} - Unknown\n\n" ); + } else { + print( OUT "${base} - $whatis{$base}\n\n" ); + } + + # Synopsis field (function signatures) + print( OUT head1("SYNOPSIS") ); + foreach $func (sort( @functions )) { + if (defined $synopsis{$func} ) { + $_ = $synopsis{$func}; + s/$func/ B<$func>/; + s/^\s*//; + my $synopsis = $_; + print( OUT $synopsis, "\n\n" ); + } + } + + # Description field + print( OUT head1("FUNCTION DESCRIPTIONS") ); + + while(){ + chop; + next if m/^$/; + + # Match list element + if( m/^(o[^:]+:|o|[0-9]\.?)\s(.*)/ ) { + my $bullet = $1; + my $bullet_text = $2; + + print( OUT startlist() ) unless $inlist; + $inlist = 1; + print( OUT item($bullet), "$bullet_text\n\n" ); + next; + } else { + print( OUT endlist() ) if $inlist; + $inlist = 0; + } + + # Match synopsis item + if( defined $func && m/$func\s*\(.*\)/ ) { + # Split all words with spaces to aid with tokenization + s/,/ , /g; + s/\(/ ( /g; + s/\)/ ) /g; + s/\*/ * /g; + + my $html = ''; + + # Replace tokens matching keywords with HTML links. +TOKEN: foreach $token ( split(' ', $_ ) ) { + foreach $keyword ( %keywords ) { + if ( $token eq $keyword ) { + $html .= linked( $keyword, $keywords{$keyword} ); + $html .= " "; + next TOKEN; + } + } + $html .= "$token "; + } + $_ = $html; + # Remove excess spaces + s/\s+/ /g; + s/ ,/,/g; + s/\* /*/g; + s/\)\s*\;/);/; + s/^\s*//; + s/ \( *\)/\(\)/; + + # This is very poor because text is output specifically + # for HTML so the text isn't output at all for other target + # formats. + print( OUT html("
    $_
    ") ); + next; + } + + # Match function title + if( m/===([a-zA-Z0-9]+)/ ) { + $func = $1; + print( OUT head2($func) ); + next; + } + + print( OUT "\n") if /^[^ ]/; + print( OUT "$_\n") ; + print( OUT "\n") if /^[^ ]/; + } + + close( OUT ); + close( IN ); +} + +# +# Return level 1 heading +# Similar to:

    heading

    +# +sub head1 { + my($heading) = @_; + return( "=head1 $heading\n\n" ); +} + +# +# Return level 2 heading +# Similar to:

    heading

    +# +sub head2 { + my($heading) = @_; + return( "=head2 $heading\n\n" ); +} + + +# +# Return item +# Simlar to: +# +sub item { + my($item) = @_; + return( "=item $item\n\n" ); +} + + +# +# Start list +# Similar to:
      +# +sub startlist { + return( "=over 4\n\n" ) +} + +# +# End list +# Similar to:
    +# +sub endlist { + return( "=back\n\n" ); +} + +# +# Preformatted text +# Similar to
    
    +#
    +sub formated {
    +    my($text) = @_;
    +    return( " $text\n\n" );
    +}
    +
    +#
    +# Raw HTML paragraph
    +#
    +sub html {
    +  my($html) = @_;
    +  return return( "=for html $html\n\n" );
    +}
    +
    +#
    +# HTML Link
    +# Similar to: description
    +#
    +sub linked {
    +  local($description, $url) = @_;
    +  return( "" . $description . "" );
    +}
    diff --git a/ImageMagick-6.9.12-44/scripts/txt2html b/ImageMagick-6.9.12-44/scripts/txt2html
    new file mode 100755
    index 0000000..39526c1
    --- /dev/null
    +++ b/ImageMagick-6.9.12-44/scripts/txt2html
    @@ -0,0 +1,969 @@
    +#!/usr/bin/perl
    +    eval 'exec perl -S $0 "$@"'
    +    if $runnning_under_some_shell;
    +#
    +# txt2html.pl
    +# Convert raw text to something with a little HTML formatting
    +#
    +# Written by Seth Golub 
    +#            http://www.cs.wustl.edu/~seth/txt2html/
    +#
    +# $Revision: 1.15 $
    +# $Date: 2004/10/05 20:30:33 $
    +# $Author: cristy $
    +#
    +#
    +# $Log: txt2html,v $
    +# Revision 1.15  2004/10/05 20:30:33  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.14  2004/04/26 19:53:42  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.13  2004/04/26 15:03:00  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.12  2004/04/24 13:48:50  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.11  2003/10/28 18:40:59  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.10  2003/10/28 03:44:38  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.9  2003/10/17 13:59:12  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.8  2003/10/16 22:26:06  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.7  2003/10/12 04:10:15  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.6  2003/07/20 03:39:50  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.5  2003/07/19 19:44:20  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.4  2003/04/07 23:35:40  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.3  2003/04/05 02:52:42  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.2  2003/04/04 20:50:50  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.1  2003/03/25 15:10:23  cristy
    +# genesis
    +#
    +# Revision 1.1  2003/03/22 17:02:00  cristy
    +# *** empty log message ***
    +#
    +# Revision 1.10  1994/12/28  20:10:25  seth
    +#  * Added --extract, etc.
    +#
    +# Revision 1.9  94/12/13  15:16:23  15:16:23  seth (Seth Golub)
    +#  * Changed from #!/usr/local/bin/perl to the more clever version in
    +#    the man page.  (How did I manage not to read this for so long?)
    +#  * Swapped hrule & header back to handle double lines.  Why should
    +#    this order screw up headers?
    +#
    +# Revision 1.8  1994/11/30  21:07:03  seth
    +#  * put mail_anchor back in.  (Why did I take this out?)
    +#  * Finally added handling of lettered lists (ordered lists marked with
    +#    letters)
    +#  * Added title option (--title, -t)
    +#  * Shortline now looks at how long the line was before txt2html
    +#    started adding tags.   ($line_length)
    +#  * Changed list references to scalars where appropriate.  (@foo[0] -> $foo[0])
    +#  * Added untabify() to homogenize leading indentation for list
    +#    prefixes and functions that use line length
    +#  * Added "underline tolerance" for when underlines are not exactly the
    +#    same length as what they underline.
    +#  * Added error message for unrecognized options
    +#  * removed \w matching on --capstag
    +#  * Tagline now removes leading & trailing whitespace before tagging
    +#  * swapped order of caps & heading in main loop
    +#  * Cleaned up code for speed and to get rid of warnings
    +#  * Added more restrictions to something being a mail header
    +#  * Added indentation for lists, just to make the output more readable.
    +#  * Fixed major bug in lists: $OL and $UL were never set, so when a
    +#    list was ended "" was *always* used!
    +#  * swapped order of hrule & header to properly handle long underlines
    +#
    +# Revision 1.7  94/10/28  13:16:11  13:16:11  seth (Seth Golub)
    +#  * Added to comments in options section
    +#  * renamed blank to is_blank
    +#  * Page break is converted to horizontal rule 
    +# * moved usage subroutine up top so people who look through code see +# it sooner +# +# Revision 1.6 94/10/28 12:43:46 12:43:46 seth (Seth Golub) +# * Creates anchors at each heading +# +# Revision 1.5 94/07/14 17:43:59 17:43:59 seth (Seth Golub) +# * Fixed minor bug in Headers +# * Preformatting can be set to only start/stop when TWO lines of +# [non]formatted-looking-text are encountered. Old behavior is still +# possible through command line options (-pb 1 -pe 1). +# * Can preformat entire document (-pb 0) or disable preformatting +# completely (-pe 0). +# * Fixed minor bug in CAPS handling (paragraph breaks broke) +# * Puts paragraph tags *before* paragraphs, not just between them. +# +# Revision 1.4 94/06/20 16:42:55 16:42:55 seth (Seth Golub) +# * Allow ':' for numbered lists (e.g. "1: Figs") +# * Whitespace at end of line will not start or end preformatting +# * Mailmode is now off by default +# * Doesn't break short lines if they are the first line in a list +# item. It *should* break them anyway if the next line is a +# continuation of the list item, but I haven't dealt with this yet. +# * Added action on lines that are all capital letters. You can change +# how these lines get tagged, as well as the mininum number of +# consecutive capital letters required to fire off this action. +# +# Revision 1.3 94/05/17 15:58:58 15:58:58 seth (Seth Golub) +# * Tiny bugfix in unhyphenation +# +# Revision 1.2 94/05/16 18:15:16 18:15:16 seth (Seth Golub) +# * Added unhyphenation +# +# Revision 1.1 94/05/16 16:19:03 16:19:03 seth (Seth Golub) +# Initial revision +# +# +# 1.02 Allow '-' in mail headers +# Added handling for multiline mail headers +# +# +# +# Oscar Nierstrasz has a nice script for hypertextifying URLs. +# It is available at: +# http://cui_www.unige.ch/ftp/PUBLIC/oscar/scripts/html.pl +# + +######################### +# Configurable options +# + +# [-s ] | [--shortline ] +$short_line_length = 40; # Lines this short (or shorter) must be + # intentionally broken and are kept + # that short.
    + +# [-p ] | [--prewhite ] +$preformat_whitespace_min = 5; # Minimum number of consecutive leading + # whitespace characters to trigger + # preformatting. + # NOTE: Tabs are now expanded to + # spaces before this check is made. + # That means if $tab_width is 8 and + # this is 5, then one tab is expanded + # to 8 spaces, which is enough to + # trigger preformatting. + +# [-pb ] | [--prebegin ] +$preformat_trigger_lines = 2; # How many lines of preformatted-looking + # text are needed to switch to
    +                                # <= 0 : Preformat entire document
    +                                #    1 : one line triggers
    +                                # >= 2 : two lines trigger
    +
    +# [-pe    ] | [--preend                     ]
    +$endpreformat_trigger_lines = 2; # How many lines of unpreformatted-looking
    +                                 # text are needed to switch from 
    +                                 # <= 0 : Never preformat within document
    +                                 #    1 : one line triggers
    +                                 # >= 2 : two lines trigger
    +# NOTE for --prebegin and --preend:
    +# A zero takes precedence.  If one is zero, the other is ignored.
    +# If both are zero, entire document is preformatted.
    +
    +
    +# [-r     ] | [--hrule                      ]
    +$hrule_min = 4;                 # Min number of ---s for an HRule.
    +
    +# [-c     ] | [--caps                       ]
    +$min_caps_length = 3;           # min sequential CAPS for an all-caps line
    +
    +# [-ct  ] | [--capstag                  ]
    +$caps_tag = "STRONG";           # Tag to put around all-caps lines
    +
    +# [-m/+m     ] | [--mail        / --nomail        ]
    +$mailmode = 0;                  # Deal with mail headers & quoted text
    +
    +# [-u/+u     ] | [--unhyphenate / --nounhyphenate ]
    +$unhyphenation = 1;             # Enables unhyphenation of text.
    +
    +# [-a  ] | [--append                  ]
    +# [+a        ] | [--noappend                      ]
    +$append_file = 0;               # If you want something appended by
    +                                # default, put the filename here.
    +                                # The appended text will not be
    +                                # processed at all, so make sure it's
    +                                # plain text or decent HTML.  i.e. do
    +                                # not have things like:
    +                                #   Seth Golub 
    +                                # but instead, have:
    +                                #   Seth Golub <seth@cs.wustl.edu>
    +
    +# [-t ] | [--title <title>                 ]
    +$title = 0;                     # You can specify a title.
    +                                # Otherwise it won't put one in.
    +
    +# [-ul <n>   ] | [--underlinelong <n>             ]
    +$underline_tolerance_long = 1;  # How much longer can underlines
    +                                # be and still be underlines?
    +
    +# [-us <n>   ] | [--underlineshort <n>            ]
    +$underline_tolerance_short = 1; # How much shorter can underlines
    +                                # be and still be underlines?
    +
    +# [-tw <n>   ] | [--tabwidth <n>                  ]
    +$tab_width = 8;                 # How many spaces equal a tab?
    +
    +
    +# [-iw <n>   ] | [--indent <n>                    ]
    +$indent_width = 2;              # Indents this many spaces for each
    +                                # level of a list
    +
    +# [-/+e      ] | [--extract / --noextract         ]
    +$extract = 0;                   # Extract Mode (suitable for inserting)
    +
    +# END OF CONFIGURABLE OPTIONS
    +########################################
    +
    +
    +########################################
    +# Definitions  (Don't change these)
    +#
    +$NONE       =   0;
    +$LIST       =   1;
    +$HRULE      =   2;
    +$PAR        =   4;
    +$PRE        =   8;
    +$END        =  16;
    +$BREAK      =  32;
    +$HEADER     =  64;
    +$MAILHEADER = 128;
    +$MAILQUOTE  = 256;
    +$CAPS       = 512;
    +
    +$OL = 1;
    +$UL = 2;
    +
    +sub usage
    +{
    +    $0 =~ s#.*/##;
    +    local($s) = " " x length($0);
    +    print STDERR <<EOF;
    +
    +Usage: $0 [options]
    +
    +where options are:
    +       $s [-v        ] | [--version                       ]
    +       $s [-h        ] | [--help                          ]
    +       $s [-s <n>    ] | [--shortline <n>                 ]
    +       $s [-p <n>    ] | [--prewhite <n>                  ]
    +       $s [-pb <n>   ] | [--prebegin <n>                  ]
    +       $s [-pe <n>   ] | [--preend <n>                    ]
    +       $s [-e/+e     ] | [--extract / --noextract         ]
    +       $s [-r <n>    ] | [--hrule <n>                     ]
    +       $s [-c <n>    ] | [--caps <n>                      ]
    +       $s [-ct <tag> ] | [--capstag <tag>                 ]
    +       $s [-m/+m     ] | [--mail     / --nomail           ]
    +       $s [-u/+u     ] | [--unhyphen / --nounhyphen       ]
    +       $s [-a <file> ] | [--append <file>                 ]
    +       $s [+a        ] | [--noappend                      ]
    +       $s [-t <title>] | [--title <title>                 ]
    +       $s [-tw <n>   ] | [--tabwidth <n>                  ]
    +       $s [-iw <n>   ] | [--indent <n>                    ]
    +       $s [-ul <n>   ] | [--underlinelong <n>             ]
    +       $s [-us <n>   ] | [--underlineshort <n>            ]
    +
    +  More complete explanations of these options can be found in
    +  comments near the beginning of the script.
    +
    +EOF
    +}
    +
    +
    +sub deal_with_options
    +{
    +    while ($ARGV[0] =~ /^[-+].+/)
    +    {
    +        if (($ARGV[0] eq "-r" || $ARGV[0] eq "--hrule") &&
    +            $ARGV[1] =~ /^%d+$/)
    +        {
    +            $hrule_min = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-s" || $ARGV[0] eq "--shortline") &&
    +            $ARGV[1] =~ /^\d+$/)
    +        {
    +            $short_line_length = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-p" || $ARGV[0] eq "--prewhite") &&
    +            $ARGV[1] =~ /^\d+$/)
    +        {
    +            $preformat_whitespace_min = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-pb" || $ARGV[0] eq "--prebegin") &&
    +            $ARGV[1] =~ /^\d+$/)
    +        {
    +            $preformat_trigger_lines = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-pe" || $ARGV[0] eq "--preend") &&
    +            $ARGV[1] =~ /^\d+$/)
    +        {
    +            $endpreformat_trigger_lines = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-e" || $ARGV[0] eq "--extract"))
    +        {
    +            $extract = 1;
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "+e" || $ARGV[0] eq "--noextract"))
    +        {
    +            $extract = 0;
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-c" || $ARGV[0] eq "--caps") &&
    +            $ARGV[1] =~ /^\d+$/)
    +        {
    +            $min_caps_length = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-ct" || $ARGV[0] eq "--capstag") &&
    +            $ARGV[1])
    +        {
    +            $caps_tag = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if ($ARGV[0] eq "-m" || $ARGV[0] eq "--mail")
    +        {
    +            $mailmode = 1;
    +            next;
    +        }
    +
    +        if ($ARGV[0] eq "+m" || $ARGV[0] eq "--nomail")
    +        {
    +            $mailmode = 0;
    +            next;
    +        }
    +
    +        if ($ARGV[0] eq "-u" || $ARGV[0] eq "--unhyphen")
    +        {
    +            $unhyphenation = 1;
    +            next;
    +        }
    +
    +        if ($ARGV[0] eq "+u" || $ARGV[0] eq "--nounhyphen")
    +        {
    +            $unhyphenation = 0;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-a" || $ARGV[0] eq "--append") &&
    +            $ARGV[1])
    +        {
    +            if (-r $ARGV[1]) {
    +                $append_file = $ARGV[1];
    +            } else {
    +                print STDERR "Can't find or read $ARGV[1].\n";
    +            }
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if ($ARGV[0] eq "+a" || $ARGV[0] eq "--noappend")
    +        {
    +            $append_file = 0;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-t" || $ARGV[0] eq "--title") &&
    +            $ARGV[1])
    +        {
    +            $title = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-ul" || $ARGV[0] eq "--underlinelong") &&
    +            $ARGV[1] =~ /^\d+$/)
    +        {
    +            $underline_tolerance_long = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-us" || $ARGV[0] eq "--underlineshort") &&
    +            $ARGV[1] =~ /^\d+$/)
    +        {
    +            $underline_tolerance_short = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-tw" || $ARGV[0] eq "--tabwidth") &&
    +            $ARGV[1] =~ /^\d+$/)
    +        {
    +            $tab_width = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if (($ARGV[0] eq "-iw" || $ARGV[0] eq "--indentwidth") &&
    +            $ARGV[1] =~ /^\d+$/)
    +        {
    +            $indent_width = $ARGV[1];
    +            shift @ARGV;
    +            next;
    +        }
    +
    +        if ($ARGV[0] eq "-v" || $ARGV[0] eq "--version")
    +        {
    +            print '$Header: /users/hilco/seth/projects/txt2html/txt2html.pl,v 1
    +.10 1994/12/28 20:10:25 seth Exp seth $ ';
    +            print "\n";
    +            exit;
    +        }
    +
    +        if ($ARGV[0] eq "-h" || $ARGV[0] eq "--help")
    +        {
    +            &usage;
    +            exit;
    +        }
    +
    +        print STDERR "Unrecognized option: $ARGV[0]\n";
    +        print STDERR " or bad paramater: $ARGV[1]\n" if($ARGV[1]);
    +
    +        &usage;
    +        exit(1);
    +
    +    } continue {
    +
    +        shift @ARGV;
    +    }
    +
    +    $preformat_trigger_lines = 0 if ($preformat_trigger_lines < 0);
    +    $preformat_trigger_lines = 2 if ($preformat_trigger_lines > 2);
    +
    +    $endpreformat_trigger_lines = 1 if ($preformat_trigger_lines == 0);
    +    $endpreformat_trigger_lines = 0 if ($endpreformat_trigger_lines < 0);
    +    $endpreformat_trigger_lines = 2 if ($endpreformat_trigger_lines > 2);
    +
    +    $underline_tolerance_long  = 0 if $underline_tolerance_long < 0;
    +    $underline_tolerance_short = 0 if $underline_tolerance_short < 0;
    +}
    +
    +sub is_blank
    +{
    +    return $_[0] =~ /^\s*$/;
    +}
    +
    +sub escape
    +{
    +    $line =~ s/&/&/g;
    +    $line =~ s/>/>/g;
    +    $line =~ s/</</g;
    +    $line =~ s/\014/\n<HR>\n/g; # Linefeeds become horizontal rules
    +}
    +
    +sub hrule
    +{
    +    if ($line =~ /^\s*([-_~=\*]\s*){$hrule_min,}$/)
    +    {
    +        $line = "<HR>\n";
    +        $prev =~ s/<p>//;
    +        $line_action |= $HRULE;
    +    }
    +}
    +
    +sub shortline
    +{
    +    if (!($mode & $PRE) &&
    +        !&is_blank($line) &&
    +        ($line_length < $short_line_length) &&
    +        !&is_blank($nextline) &&
    +        !($line_action & ($HEADER | $HRULE | $BREAK | $LIST)))
    +    {
    +        $line =~ s/$/<BR>/;
    +        $line_action |= $BREAK;
    +    }
    +}
    +
    +sub mailstuff
    +{
    +    if ((($line =~ /^\w*>/) || # Handle "FF> Werewolves."
    +         ($line =~ /^\w*\|/))&&  # Handle "Igor| There wolves."
    +        !&is_blank($nextline))
    +    {
    +        $line =~ s/$/<BR>/;
    +        $line_action |= $BREAK | $MAILQUOTE;
    +    } elsif (($line =~ /^[\w\-]*:/) # Handle "Some-Header: blah"
    +             && (($previous_action & $MAILHEADER) || &is_blank($prev))
    +             && !&is_blank($nextline))
    +    {
    +        &anchor_mail if !($previous_action & $MAILHEADER);
    +        $line =~ s/$/<BR>/;
    +        $line_action |= $BREAK | $MAILHEADER;
    +    } elsif (($line =~ /^\s+\S/) &&   # Handle multi-line mail headers
    +             ($previous_action & $MAILHEADER) &&
    +             !&is_blank($nextline))
    +    {
    +        $line =~ s/$/<BR>/;
    +        $line_action |= $BREAK | $MAILHEADER;
    +    }
    +}
    +
    +sub paragraph
    +{
    +    $prev .= "<p>\n";
    +    $line_action |= $PAR;
    +}
    +
    +sub listprefix
    +{
    +    local($line) = @_;
    +    local($prefix, $number, $rawprefix);
    +
    +    return (0,0,0) if (!($line =~ /^\s*[-=\*o]\s+\S/ ) &&
    +                       !($line =~ /^\s*(\d+|[a-zA-Z])[\.\)\]:]\s+\S/ ));
    +
    +    ($number) = $line =~ /^\s*(\d+|[a-zA-Z])/;
    +
    +    # That slippery exception of "o" as a bullet
    +    # (This ought to be determined more through the context of what lists
    +    #  we have in progress, but this will probably work well enough.)
    +    if($line =~ /^\s*o\s/)
    +    {
    +        $number = 0;
    +    }
    +
    +    if ($number)
    +    {
    +        ($rawprefix) = $line =~ /^(\s*(\d+|[a-zA-Z]).)/;
    +        $prefix = $rawprefix;
    +        $prefix =~ s/(\d+|[a-zA-Z])//;  # Take the number out
    +    } else {
    +        ($rawprefix) = $line =~ /^(\s*[-=o\*].)/;
    +        $prefix = $rawprefix;
    +    }
    +    ($prefix, $number, $rawprefix);
    +}
    +
    +sub startlist
    +{
    +    local($prefix, $number, $rawprefix) = @_;
    +
    +    $listprefix[$listnum] = $prefix;
    +    if($number)
    +    {
    +        # It doesn't start with 1,a,A.  Let's not screw with it.
    +        if (($number != 1) && ($number ne "a") && ($number ne "A"))
    +        {
    +            return;
    +        }
    +        $prev .= "$list_indent<OL>\n";
    +        $list[$listnum] = $OL;
    +    } else {
    +        $prev .= "$list_indent<font size=-2><UL>\n";
    +        $list[$listnum] = $UL;
    +    }
    +    $listnum++;
    +    $list_indent = " " x $listnum x $indent_width;
    +    $line_action |= $LIST;
    +    $mode |= $LIST;
    +}
    +
    +
    +sub endlist                     # End N lists
    +{
    +    local($n) = @_;
    +    for(; $n > 0; $n--, $listnum--)
    +    {
    +        $list_indent = " " x ($listnum-1) x $indent_width;
    +        if($list[$listnum-1] == $UL)
    +        {
    +            $prev .= "$list_indent</UL></font>\n";
    +        } elsif($list[$listnum-1] == $OL)
    +        {
    +            $prev .= "$list_indent</OL>\n";
    +        } else
    +        {
    +            print STDERR "Encountered list of unknown type\n";
    +        }
    +    }
    +    $line_action |= $END;
    +    $mode ^= ($LIST & $mode) if (!$listnum);
    +}
    +
    +sub continuelist
    +{
    +    $line =~ s/^\s*[-=o\*]\s*/$list_indent<LI> / if $list[$listnum-1] == $UL;
    +    $line =~ s/^\s*(\d+|[a-zA-Z]).\s*/$list_indent<LI> /    if $list[$listnum-1
    +] == $OL;
    +    $line_action |= $LIST;
    +}
    +
    +sub liststuff
    +{
    +    local($i);
    +
    +    local($prefix, $number, $rawprefix) = &listprefix($line);
    +
    +    $i = $listnum;
    +    if (!$prefix)
    +    {
    +        return if !&is_blank($prev); # inside a list item
    +
    +        # This ain't no list.  We'll want to end all of them.
    +        return if !($mode & $LIST);     # This just speeds up the inevitable
    +        $i = 0;
    +    } else
    +    {
    +        # Maybe we're going back up to a previous list
    +        $i-- while (($prefix ne $listprefix[$i-1]) && ($i >= 0));
    +    }
    +
    +    if (($i >= 0) && ($i != $listnum))
    +    {
    +        &endlist($listnum - $i);
    +    } elsif (!$listnum || $i != $listnum)
    +    {
    +        &startlist($prefix, $number, $rawprefix);
    +    }
    +
    +    &continuelist($prefix, $number, $rawprefix) if ($mode & $LIST);
    +}
    +
    +sub endpreformat
    +{
    +    if(!($line =~ /\s{$preformat_whitespace_min,}\S+/) &&
    +       ($endpreformat_trigger_lines == 1 ||
    +        !($nextline =~ /\s{$preformat_whitespace_min,}\S+/)))
    +    {
    +        $prev =~ s#$#\n</PRE></font>#;
    +        $mode ^= ($PRE & $mode);
    +        $line_action |= $END;
    +    }
    +}
    +
    +sub preformat
    +{
    +    if($preformat_trigger_lines == 0 ||
    +       (($line =~ /\s{$preformat_whitespace_min,}\S+/) &&
    +        ($preformat_trigger_lines == 1 ||
    +         $nextline =~ /\s{$preformat_whitespace_min,}\S+/)))
    +    {
    +        $line =~ s/^/<font size=-1><PRE>\n/;
    +        $prev =~ s/<p>//;
    +        $mode |= $PRE;
    +        $line_action |= $PRE;
    +    }
    +}
    +
    +sub make_new_anchor
    +{
    +    $anchor++;
    +    $anchor;
    +}
    +
    +sub anchor_mail
    +{
    +    local($text) = $line =~ /\S+: *(.*) *$/;
    +    local($anchor) = &make_new_anchor($text);
    +    $line =~ s/(.*)/<A NAME="$anchor">$1<\/A>/;
    +}
    +
    +sub anchor_heading
    +{
    +    local($heading) = @_;
    +    local($anchor) = &make_new_anchor($heading);
    +    $line =~ s/(<H.>.*<\/H.>)/<A NAME="$anchor">$1<\/A>/;
    +}
    +
    +sub heading
    +{
    +    local($hindent, $heading) = $line =~ /^(\s*)(.+)$/;
    +    $hindent = 0;               # This isn't used yet, but Perl warns of
    +                                # "possible typo" if I declare a var
    +                                # and never reference it.
    +
    +    # This is now taken care of in main()
    +#    $heading =~ s/\s+$//;      # get rid of trailing whitespace.
    +
    +    local($underline) = $nextline =~ /^\s*(\S+)\s*$/;
    +
    +    if((length($heading) > (length($underline) + $underline_tolerance_short))
    +       || (length($heading) < (length($underline) -$underline_tolerance_long)))
    +    {
    +        return;
    +    }
    +
    +#    $underline =~ s/(^.).*/$1/;     # Could I do this any less efficiently?
    +    $underline = substr($underline,0,1);
    +
    +    local($hlevel);
    +    $hlevel = 1 if $underline eq "*";
    +    $hlevel = 2 if $underline eq "=";
    +    $hlevel = 3 if $underline eq "+";
    +    $hlevel = 4 if $underline eq "-";
    +    $hlevel = 5 if $underline eq "~";
    +    $hlevel = 6 if $underline eq ".";
    +    return if !$hlevel;
    +
    +    $nextline = <STDIN>;        # Eat the underline
    +    &tagline("H${hlevel}");
    +    &anchor_heading($heading);
    +    $line_action |= $HEADER;
    +}
    +
    +sub unhyphenate
    +{
    +    local($second);
    +
    +    # This looks hairy because of all the quoted characters.
    +    # All I'm doing is pulling out the word that begins the next line.
    +    # Along with it, I pull out any punctuation that follows.
    +    # Preceding whitespace is preserved.  We don't want to screw up
    +    # our own guessing systems that rely on indentation.
    +    ($second) = $nextline =~ /^\s*([a-zA-Z]+[\)\}\]\.,:;\'\"\>]*\s*)/; # "
    +    $nextline =~ s/^(\s*)[a-zA-Z]+[\)\}\]\.,:;\'\"\>]*\s*/$1/; # "
    +    # (The silly comments are for my less-than-perfect code hilighter)
    +
    +    $line =~ s/\-\s*$/$second/;
    +    $line .= "\n";
    +}
    +
    +sub untabify
    +{
    +    local($oldws) = $line =~ /^([ \011]+)/;
    +    local($oldlen) = (length($oldws));
    +
    +    local($i, $column);
    +    for($i=0, $column = 0; $i < $oldlen; $i++)
    +    {
    +        if(substr($oldws, $i, 1) eq " ")
    +        {                       # Space
    +            $column++;
    +        } else {                # Tab
    +            $column += $tab_width - ($column % $tab_width);
    +        }
    +    }
    +    $line = (" " x $column) . substr($line, $oldlen);
    +}
    +
    +sub tagline
    +{
    +    local($tag) = @_;
    +    $line =~ s/^\s*(.*)\s*$/<$tag>$1<\/$tag>\n/;
    +}
    +
    +sub caps
    +{
    +    if($line =~ /^[^a-z<]*[A-Z]{$min_caps_length,}[^a-z<]*$/)
    +    {
    +        &tagline($caps_tag);
    +        $line_action |= $CAPS;
    +    }
    +}
    +
    +
    +
    +sub main
    +{
    +    &deal_with_options;
    +
    +    if(1)
    +    {
    +	print q(
    +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    +  "http://www.w3.org/TR/html4/loose.dtd">
    +<html lang="en-US">
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    +<meta name="Description" content="ImageMagick - a robust collection of tools and libraries to read, write and manipulate an image in any of the popular image formats. ImageMagick allows dynamic creation of GIFs, making it suitable for Web applications.">
    +<meta name="Keywords" content="ImageMagick,Image Magick,Image Magic,PerlMagick,Perl Magick,Perl Magic,WebMagick,Web Magic,image processing,software development,simulation,image software,AniMagick,Animagic,Magick++">
    +<meta name="Resource-type" content="document">
    +<meta name="Robots" content="ALL">
    +<link rel="stylesheet" type="text/css" href="../www/magick.css">
    +</head>
    +
    +<body marginheight=1 marginwidth=1 topmargin=1 leftmargin=1>
    +<a name="top"></a>
    +<table border="0" cellpadding="0" cellspacing="0" summary="Masthead" width="100%">
    +<tbody>
    +<tr>
    +<td bgcolor="#003399" width="25%" height="118" background="../images/background.gif"><a href="https://imagemagick.org/"><img src="../images/script.gif" width="278" height="118" border="0" alt="" /></a></td>
    +<td bgcolor="#003399" width="60%" height="118" background="../images/background.gif"><a href="http://www.networkeleven.com/direct.php?magick_all"><img src="../images/promote.png" border="0" width="186" height="52" vspace="29" alt="Powered by NetworkEleven" /></a></td>
    +<td bgcolor="#003399" width="114" height="118" align="right"><img src="../images/sprite.png" width="114" height="118" alt="" /></td>
    +<td bgcolor="#003399" width="114" height="118" align="right"><a href="http://www.imagemagick.net"><img src="../images/logo.png" width="114" height="118" border="0" alt="ImageMagick logo" /></a></td>
    +</tr></tbody></table>
    +</table><table align="left" border=0 cellpadding=2 cellspacing=2 summary="Navigation buttons" width="20%">
    + <tr>
    +  <td>
    +   <form target="_self" action="../index.html"><input type="submit" title="ImageMagick Home" value=" Home " style="background-image:url('../images/background.gif'); color:#fbc713; font-weight:bold"></form>
    +  </td><td>
    +   <form target="_self" action="../www/apis.html"><input type="submit" title="ImageMagick API" value=" API " style="background-image:url('../images/background.gif'); color:#fbc713; font-weight:bold"></form>
    +  </td><td>
    +   <form target="_self" action="../www/archives.html"><input type="submit" title="ImageMagick Download" value="Download" style="background-image:url('../images/background.gif'); color:#fbc713; font-weight:bold"></form>
    +  </td>
    + </tr>
    +</table>
    +<div align="right" style="margin-top:3px; padding-right:4px">
    +  <form action="http://studio.imagemagick.org/Sage/scripts/Sage.cgi">
    +	<input type="TEXT" name="query" size=32 maxlength=255>
    +	<input type="SUBMIT" name="sa" value="Search" style="background-image:url('../images/background.gif'); bgcolor:#003399; color:#fbc713; font-weight:bold"> 
    + </form><br>
    +</div>
    +<table align="left" border=0 cellpadding=10 cellspacing=0 style="margin-top:-17px" width="100%"><tr><td>
    +
    +<br> <br>
    +) . "\n";
    +        print "<HTML>\n";
    +        print "<HEAD>\n";
    +
    +        # It'd be nice if we could guess a title from the first header,
    +        # but even that would be too late if we're doing this in one pass.
    +        print "<TITLE>$title\n" if($title);
    +
    +        print "\n";
    +
    +	print q() . "\n";
    +
    +        if ($title) {
    +	    print "

    $title

    \n"; + } + } + + $prev = ""; + $line = ; + $nextline = ; + do + { + $line =~ s/[ \011]*$//; # Chop trailing whitespace + + &untabify; # Change leading whitespace into spaces + + $line_length = length($line); # Do this before tags go in + + &escape; + + &endpreformat if (($mode & $PRE) && ($preformat_trigger_lines != 0)); + + &hrule if !($mode & $PRE); + + &heading if (!($mode & $PRE) && + $nextline =~ /^\s*[=\-\*\.~\+]+$/); + + &caps if !($mode & $PRE); + + &liststuff if (!($mode & $PRE) && + !&is_blank($line)); + + &mailstuff if ($mailmode && + !($mode & $PRE) && + !($line_action & $HEADER)); + + &preformat if (!($line_action & ($HEADER | $LIST | $MAILHEADER)) && + !($mode & ($LIST | $PRE)) && + ($endpreformat_trigger_lines != 0)); + + ¶graph if ((&is_blank($prev) || ($line_action & $END)) && + !&is_blank($line) && + !($mode & ($LIST | $PRE)) && # paragraphs in lists + # *should* be allowed. + (!$line_action || + ($line_action & ($CAPS | $END | $MAILQUOTE)))); + + &shortline; + + &unhyphenate if ($unhyphenation && + ($line =~ /[a-zA-Z]\-$/) && # ends in hyphen + # next line starts w/letters + ($nextline =~ /^\s*[a-zA-Z]/) && + !($mode & ($PRE | $HEADER | $MAILHEADER | $BREAK))); + + + # Print it out and move on. + + print $prev; + + if (!&is_blank($nextline)) + { + $previous_action = $line_action; + $line_action = $NONE; + } + + $prev = $line; + $line = $nextline; + $nextline = ; + } until (!$nextline && !$line && !$prev); + + $prev = ""; + &endlist($listnum) if ($mode & $LIST); # End all lists + print $prev; + + print "\n"; + + print "
    \n" if ($mode & $PRE); + + if ($append_file) + { + if(-r $append_file) + { + open(APPEND, $append_file); + print while ; + } else { + print STDERR "Can't find or read file $append_file to append.\n"; + } + } else { + print q(
    ) . "\n"; +print q( +Top of page +
    + + "Image manipulation software that works like magick" +
    + +) . "\n"; + } + + if(!$extract) + { + print "\n"; + print "\n"; + } +} + +&main(); + + diff --git a/ImageMagick-6.9.12-44/scripts/xsnap b/ImageMagick-6.9.12-44/scripts/xsnap new file mode 100644 index 0000000..c026aa1 --- /dev/null +++ b/ImageMagick-6.9.12-44/scripts/xsnap @@ -0,0 +1,606 @@ +#!/bin/sh +# \ +exec wish "$0" "$@" + +# +# XSnap, X-Windows Snapshot. A GUI for the ImageMagick import command +# +# Software design, Cristy (magick@dupont.com), March 1996 +# +# Copyright (C) 1999-2016 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# This software and documentation is provided "as is," and the copyright +# holders and contributing author(s) make no representations or warranties, +# express or implied, including but not limited to, warranties of +# merchantability or fitness for any particular purpose or that the use of +# the software or documentation will not infringe any third party patents, +# copyrights, trademarks or other rights. +# +# The copyright holders and contributing author(s) will not be held liable +# for any direct, indirect, special or consequential damages arising out of +# any use of the software or documentation, even if advised of the +# possibility of such damage. +# +# Permission is hereby granted to use, copy, modify, and distribute this +# source code, or portions hereof, documentation and executables, for any +# purpose, without fee, subject to the following restrictions: +# +# 1. The origin of this source code must not be misrepresented. +# 2. Altered versions must be plainly marked as such and must not be +# misrepresented as being the original source. +# 3. This Copyright notice may not be removed or altered from any source +# or altered source distribution. +# +# The copyright holders and contributing author(s) specifically permit, +# without fee, and encourage the use of this source code as a component for +# supporting image processing in commercial products. If you use this +# source code in a product, acknowledgment is not required but would be +# +# + +# +# Create an alert window and display a message to the user. +# +proc Alert {dograb message args} { + # + # Initialize alert window. + # + catch {destroy .alert} + toplevel .alert -class alert + wm title .alert Alert + wm iconname .alert alert + wm group .alert . + wm transient .alert . + wm geometry .alert \ + +[expr {[winfo width .]+[winfo x .]+100}]+[expr {[winfo y .]+75}] + # + # Create alert window frame. + # + frame .alert.top -relief raised -border 1 + frame .alert.bottom -relief raised -border 1 + pack append .alert .alert.top {top fill expand} .alert.bottom \ + {top fill expand} + message .alert.top.message -width 350 -justify left -text $message + pack append .alert.top .alert.top.message {top expand padx 5 pady 5} + if {[llength $args] > 0} { + # + # Create as many buttons as needed and arrange them from left to right. + # + set arg [lindex $args 0] + frame .alert.bottom.0 -relief sunken -border 1 + pack append .alert.bottom .alert.bottom.0 {left expand padx 10 pady 10} + button .alert.bottom.0.button -text [lindex $arg 0] \ + -command "[lindex $arg 1]; destroy .alert" + pack append .alert.bottom.0 .alert.bottom.0.button {expand padx 12 pady 12} + bind .alert "[lindex $arg 1]; destroy .alert" + focus .alert + set i 1 + foreach arg [lrange $args 1 end] { + button .alert.bottom.$i -text [lindex $arg 0] \ + -command "[lindex $arg 1]; destroy .alert" + pack append .alert.bottom .alert.bottom.$i {left expand padx 20} + set i [expr $i+1] + } + } + bind .alert [list focus .alert] + if {$dograb == "grab"} { + tkwait visibility .alert + grab set .alert + } else { + focus .alert + } +} + +# +# Proc AppendImageFormat appends the image format type to the filename. +# +proc AppendImageFormat {w} { + set snap(format) \ + [$w.format.list get [lindex [$w.format.list curselection] 0]] + set filename [$w.file.entry get] + set extension [file extension $filename] + $w.file.entry delete \ + [expr {[string length $filename]-[string length $extension]}] end + $w.file.entry insert end . + $w.file.entry insert end $snap(format) +} + +# +# Proc Options creates the options window. +# +proc Options {} { + # + # Initialize snap window. + # + catch {destroy .options} + toplevel .options -class Options + wm title .options "Set Image Options" + wm group .options . + wm transient .options . + wm geometry .options \ + +[expr {[winfo width .]+[winfo x .]+25}]+[winfo y .] + # + # Create options window frame. + # + frame .options.input_title + label .options.input_title.label -text "Input" + pack .options.input_title.label + pack .options.input_title + frame .options.input -relief sunken -borderwidth 2 + frame .options.input.checks + checkbutton .options.input.checks.border -text "Borders" -width 11 \ + -anchor w -variable snap(border) + checkbutton .options.input.checks.frame -text "Frame" -width 11 \ + -anchor w -variable snap(frame) + checkbutton .options.input.checks.screen -text "Screen" -width 11 \ + -anchor w -variable snap(screen) + checkbutton .options.input.checks.descend -text "Descend" -anchor w \ + -variable snap(descend) + pack .options.input.checks.border .options.input.checks.frame \ + .options.input.checks.screen .options.input.checks.descend -side left + pack .options.input.checks + frame .options.input.delay + label .options.input.delay.label -text "Delay:" -width 9 -anchor w + scale .options.input.delay.scale -orient horizontal -length 11c \ + -from 0 -to 120 -tickinterval 15 -variable snap(delay) + pack .options.input.delay.label .options.input.delay.scale -side left + pack .options.input.delay + frame .options.input.id + label .options.input.id.window -text "Window:" -width 9 -anchor w + entry .options.input.id.window_entry -width 18 -relief sunken \ + -textvariable snap(window) + label .options.input.id.display -text "Display:" + entry .options.input.id.display_entry -width 18 -relief sunken \ + -textvariable snap(display) + pack .options.input.id.window .options.input.id.window_entry \ + .options.input.id.display .options.input.id.display_entry -side left + pack .options.input.checks .options.input.delay .options.input.id \ + -padx 1m -anchor w + pack .options.input.id -pady 1m + pack .options.input -expand 1 -fill both + frame .options.processing_title + label .options.processing_title.label -text "Image Processing" + pack .options.processing_title.label + pack .options.processing_title + frame .options.processing -relief sunken -borderwidth 2 + frame .options.processing.checks + checkbutton .options.processing.checks.dither -text "Dither" -width 11 \ + -anchor w -variable snap(dither) + checkbutton .options.processing.checks.negate -text "Negate" -width 11 \ + -anchor w -variable snap(negate) + checkbutton .options.processing.checks.monochrome -text "Monochrome" \ + -width 11 -anchor w -variable snap(monochrome) + checkbutton .options.processing.checks.trim -text "Trim" -anchor w \ + -variable snap(trim) + pack .options.processing.checks.dither .options.processing.checks.negate \ + .options.processing.checks.monochrome .options.processing.checks.trim \ + -side left + pack .options.processing.checks + frame .options.processing.colors + label .options.processing.colors.label -text "Colors:" -width 9 -anchor w + scale .options.processing.colors.scale -orient horizontal -length 11c \ + -from 0 -to 256 -tickinterval 32 -variable snap(colors) + pack .options.processing.colors.label .options.processing.colors.scale \ + -side left + pack .options.processing.colors + frame .options.processing.rotate + label .options.processing.rotate.label -text "Rotate:" -width 9 -anchor w + scale .options.processing.rotate.scale -orient horizontal -length 11c \ + -from 0 -to 360 -tickinterval 45 -variable snap(degrees) + pack .options.processing.rotate.label .options.processing.rotate.scale \ + -side left + pack .options.processing.rotate + pack .options.processing.checks .options.processing.colors \ + .options.processing.rotate -padx 1m -anchor w + pack .options.processing -expand 1 -fill both + frame .options.output_title + label .options.output_title.label -text "Output" + pack .options.output_title.label + pack .options.output_title + frame .options.output -relief sunken -borderwidth 2 + frame .options.output.checks + checkbutton .options.output.checks.compress -text "Compress" -width 11 \ + -anchor w -variable snap(compress) + checkbutton .options.output.checks.interlace -text "Interlace" -width 11 \ + -anchor w -variable snap(interlace) + checkbutton .options.output.checks.verbose -text "Verbose" -anchor w \ + -variable snap(verbose) + pack .options.output.checks.compress .options.output.checks.interlace \ + .options.output.checks.verbose -side left + pack .options.output.checks + frame .options.output.scene + label .options.output.scene.label -text "Scene:" -width 9 -anchor w + scale .options.output.scene.scale -orient horizontal -length 11c \ + -from 0 -to 40 -tickinterval 5 -variable snap(scene) + pack .options.output.scene.label .options.output.scene.scale -side left + pack .options.output.scene + frame .options.output.comment + label .options.output.comment.label -text "Comment:" -width 9 -anchor w + entry .options.output.comment.entry -width 45 -relief sunken \ + -textvariable snap(comment) + pack .options.output.comment.label .options.output.comment.entry \ + -side left + pack .options.output.comment + frame .options.output.label + label .options.output.label.label -text "Label:" -width 9 -anchor w + entry .options.output.label.entry -width 45 -relief sunken \ + -textvariable snap(label) + pack .options.output.label.label .options.output.label.entry -side left + pack .options.output.label + frame .options.output.id + label .options.output.id.page -text "Page:" -width 9 -anchor w + entry .options.output.id.page_entry -width 18 -relief sunken \ + -textvariable snap(page) + label .options.output.id.density -text "Density:" + entry .options.output.id.density_entry -width 18 -relief sunken \ + -textvariable snap(density) + pack .options.output.id.page .options.output.id.page_entry \ + .options.output.id.density .options.output.id.density_entry -side left + pack .options.output.checks .options.output.scene \ + .options.output.comment .options.output.label .options.output.id \ + -padx 1m -anchor w + pack .options.output.id -pady 1m + pack .options.output -expand 1 -fill both + button .options.button -text Ok -command {destroy .options} + pack .options.button + bind .options {destroy .options} + # + # Map options window. + # + pack .options.input_title .options.input .options.processing_title \ + .options.processing .options.output_title .options.output .options.button \ + -side top -padx 2m -pady 1m +} + +# +# Proc Print prints the snapped image to a printer or command. +# +proc Print {} { + global snap + + . configure -cursor watch + update + set command convert + set command [concat $command $snap(snapshot)] + set option +compress + if {$snap(compress)} { + set option "-compress zip" + } + set command [concat $command $option] + set command [concat $command -density \"$snap(density)\"] + set command [concat $command -page \"$snap(page)\"] + set command [concat $command \"ps:|$snap(printer)\"] + eval exec $command + . configure -cursor {} +} + +# +# Proc PrintImage allows the user to provide a command name to print with. +# +proc PrintImage {} { + # + # Initialize print window. + # + catch {destroy .print} + toplevel .print -class Print + wm title .print Print + wm group .print . + wm transient .print . + wm geometry .print \ + +[expr {[winfo width .]+[winfo x .]+75}]+[expr {[winfo y .]+50}] + # + # Create print window frame. + # + frame .print.format + scrollbar .print.format.scroll -command ".print.format.list yview" + listbox .print.format.list -yscroll ".print.format.scroll set" -setgrid 1 \ + -height 8 + pack .print.format.scroll -side right -fill y + pack .print.format.list -side top -expand 1 -fill both + .print.format.list insert 0 \ + Letter Tabloid Ledger Legal Statement Executive A3 A4 A5 B4 B5 Folio \ + Quarto 10x14 + .print.format.list selection set 0 + pack .print.format + frame .print.file + entry .print.file.entry -width 18 -relief sunken -textvariable snap(printer) + pack .print.file.entry -side right -expand 1 -fill both + pack .print.file + frame .print.buttons + button .print.buttons.print -text Print -command Print + button .print.buttons.cancel -text Cancel -command {destroy .print} + pack .print.buttons.print .print.buttons.cancel -side left -expand 1 \ + -fill both -padx 2m + pack .print.buttons + # + # Map print window. + # + pack .print.format .print.file .print.buttons -padx 2m -pady 2m -expand 1 \ + -fill both + return +} + +# +# Proc Save saves the snapped image to disk. +# +proc Save {} { + global snap + + if ![file readable $snap(snapshot)] { + Alert grab "You must snap an image before you can save it!" {" OK " {}} + tkwait window .alert + return + } + . configure -cursor watch + update + set command convert + set command [concat $command $snap(snapshot)] + set option +compress + if {$snap(compress)} { + set option "-compress zip" + } + set command [concat $command $option] + set command [concat $command -density \"$snap(density)\"] + set command [concat $command -page \"$snap(page)\"] + set filename $snap(filename) + if {$snap(format) != {}} { + set filename "$snap(format):$snap(filename)" + } + set command [concat $command $filename] + eval exec $command + . configure -cursor {} +} + +proc SaveImage {} { + # + # Initialize save window. + # + catch {destroy .save} + toplevel .save -class Saves + wm title .save "Save As..." + wm group .save . + wm transient .save . + wm geometry .save \ + +[expr {[winfo width .]+[winfo x .]+50}]+[expr {[winfo y .]+25}] + # + # Create save window frame. + # + frame .save.format + scrollbar .save.format.scroll -command ".save.format.list yview" + listbox .save.format.list -yscroll ".save.format.scroll set" -setgrid 1 \ + -height 8 + pack .save.format.scroll -side right -fill y + pack .save.format.list -side top -expand 1 -fill both + .save.format.list insert 0 \ + ps avs bie bmp cmyk dcx eps epsf epsi fax fits gif gif87 gray g3 hdf \ + histogram jbig jpeg jpg map matte miff mpg mtv pbm pcd pcx pdf pgm pict \ + png ppm pnm ps2 ras rgb rle sgi sun tga tiff uyvy vid viff x xbm xpm \ + xv xwd yuv yuv3 + .save.format.list selection set 0 + pack .save.format + frame .save.file + entry .save.file.entry -width 18 -relief sunken -textvariable snap(filename) + pack .save.file.entry -side right -expand 1 -fill both + pack .save.file + frame .save.buttons + button .save.buttons.save -text Save -command Save + button .save.buttons.cancel -text Cancel -command {destroy .save} + pack .save.buttons.save .save.buttons.cancel -side left -expand 1 \ + -fill both -padx 2m + pack .save.buttons + # + # Bind buttons to print window. + # + bind .save.format.list { + set snap(format) \ + [.save.format.list get [lindex [.save.format.list curselection] 0]] + } + bind .save.format.list {AppendImageFormat .save} + # + # Map save window. + # + pack .save.format .save.file .save.buttons -padx 2m -pady 2m -expand 1 \ + -fill both + return +} + +# +# Proc ShowImage displays the full-sized snapped image in a top level window. +# +proc ShowImage { title name } { + catch {destroy .show} + toplevel .show -visual best + wm title .show $title + button .show.image -image $name -command {destroy .show} + pack .show.image +} + +# +# Proc Snap executes the ImageMagick import program to grab the image +# from the X server screen. +# +proc Snap {} { + global snap + + # + # Initialize import command. + # + set command import + set command [concat $command -depth 8] + set option +border + if {$snap(border)} { + set option -border + } + set command [concat $command $option] + if {$snap(colors)} { + set command [concat $command -colors $snap(colors)] + } + set command [concat $command -comment \"$snap(comment)\"] + set option +compress + if {$snap(compress)} { + set option "-compress zip" + } + set command [concat $command $option] + if {$snap(delay)} { + set command [concat $command -delay $snap(delay)] + } + set command [concat $command -density \"$snap(density)\"] + if {$snap(descend)} { + set command [concat $command -descend] + } + set command [concat $command -display \"$snap(display)\"] + set option +dither + if {$snap(dither)} { + set option -dither + } + set command [concat $command $option] + set option +frame + if {$snap(frame)} { + set option -frame + } + set command [concat $command $option] + set option +interlace + if {$snap(interlace)} { + set option "-interlace plane" + } + set command [concat $command $option] + set command [concat $command -label \"$snap(label)\"] + set option +monochrome + if {$snap(monochrome)} { + set option -monochrome + } + set command [concat $command $option] + set option +negate + if {$snap(negate)} { + set option -negate + } + set command [concat $command $option] + set command [concat $command -page \"$snap(page)\"] + if {$snap(degrees)} { + set command [concat $command -rotate $snap(degrees)] + } + if {$snap(scene)} { + set command [concat $command -scene $snap(scene)] + } + set option +screen + if {$snap(screen)} { + set option -screen + } + set command [concat $command $option] + if {$snap(trim)} { + set command [concat $command -crop 0x0] + } + set option +verbose + if {$snap(verbose)} { + set option -verbose + } + set command [concat $command $option] + set command [concat $command $snap(snapshot)] + # + # Import the image from the X server screen. + # + . configure -cursor watch + update + wm withdraw . + eval exec $command + wm deiconify . + update + catch {image delete snapshot} + image create photo snapshot -file $snap(snapshot) + # + # Convert to an image tile. + # + exec convert -geometry 320x320> $snap(snapshot) -depth 8 $snap(tile) + catch {image delete tile} + image create photo tile -file $snap(tile) + exec rm -f $snap(tile) + # + # Display tile image as a button. + # + if [winfo exists .canvas.label] { + destroy .canvas.label + destroy .canvas.button + } + label .canvas.label -text $snap(filename) + button .canvas.button -image tile -relief sunken -borderwidth 2 \ + -command { ShowImage $snap(filename) snapshot } + pack .canvas.label .canvas.button -side top -expand 1 -fill both \ + -padx 1m -pady 1m + bind . { ShowImage $snap(filename) snapshot } + . configure -cursor {} +} + +# +# Proc SnapWindow creates the top level window. +# +proc SnapWindow {} { + # + # Initialize snap window. + # + wm title . "X-Windows Snapshot" + wm iconname . "xsnap" + # + # Create snap window frame. + # + frame .toolbar -relief raised -bd 2 + menubutton .toolbar.file -text "File" -menu .toolbar.file.menu -underline 0 + menu .toolbar.file.menu + .toolbar.file.menu add command -label "Save" -command Save + .toolbar.file.menu add command -label "Save As ..." -command "SaveImage" + .toolbar.file.menu add command -label Print -command PrintImage + .toolbar.file.menu add separator + .toolbar.file.menu add command -label Quit \ + -command { exec rm -f $snap(snapshot); exit } + pack .toolbar.file -side left + pack .toolbar -side top -fill x + canvas .canvas -width 256 -height 128 + pack .canvas + frame .buttons + button .buttons.snap -text Snap -command Snap + button .buttons.options -text Options -command Options + pack .buttons.snap .buttons.options -side left -expand 1 + pack .buttons -side bottom -fill x -padx 2m -pady 2m + # + # Map snap window. + # + pack .toolbar .canvas .buttons +} + +# +# Initalize snap options. +# +set snap(border) 0 +set snap(colors) 0 +set snap(comment) "Imported from %m image: %f" +set snap(compress) 1 +set snap(degrees) 0 +set snap(delay) 0 +set snap(density) 72x72 +set snap(descend) 0 +set snap(display) :0 +if [info exists env(DISPLAY)] { + set snap(display) $env(DISPLAY) +} +set snap(dither) 1 +set snap(filename) magick.ps +set snap(format) {} +set snap(frame) 0 +set snap(interlace) 1 +set snap(label) "%f %wx%h" +set snap(monochrome) 0 +set snap(negate) 0 +set snap(page) Letter +set snap(printer) lp +set snap(scene) 0 +set snap(screen) 0 +set snap(snapshot) /tmp/snap[pid].ppm +set snap(tile) /tmp/tile[pid].ppm +set snap(trim) 0 +set snap(verbose) 0 +# +# Create top level snap window. +# +SnapWindow +tkwait window . +exec rm -f $snap(snapshot) diff --git a/ImageMagick-6.9.12-44/tests/Makefile.am b/ImageMagick-6.9.12-44/tests/Makefile.am new file mode 100644 index 0000000..4b951f3 --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/Makefile.am @@ -0,0 +1,69 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for the ImageMagick validation suite. +# +TESTS_CPPFLAGS = $(AM_CPPFLAGS) + +TESTS_CHECK_PGRMS = \ + tests/validate \ + tests/drawtest \ + tests/wandtest + +tests_validate_SOURCES = tests/validate.c tests/validate.h +tests_validate_CPPFLAGS = $(TESTS_CPPFLAGS) +tests_validate_LDFLAGS = $(LDFLAGS) +tests_validate_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) $(MATH_LIBS) + +tests_drawtest_SOURCES = tests/drawtest.c +tests_drawtest_CPPFLAGS = $(TESTS_CPPFLAGS) +tests_drawtest_LDFLAGS = $(LDFLAGS) +tests_drawtest_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) + +tests_wandtest_SOURCES = tests/wandtest.c +tests_wandtest_CPPFLAGS = $(TESTS_CPPFLAGS) +tests_wandtest_LDFLAGS = $(LDFLAGS) +tests_wandtest_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) + +TESTS_XFAIL_TESTS = + +TESTS_TESTS = \ + tests/cli-pipe.tap \ + tests/cli-colorspace.tap \ + tests/validate-colorspace.tap \ + tests/validate-compare.tap \ + tests/validate-composite.tap \ + tests/validate-convert.tap \ + tests/validate-formats-disk.tap \ + tests/validate-formats-map.tap \ + tests/validate-formats-memory.tap \ + tests/validate-identify.tap \ + tests/validate-import.tap \ + tests/validate-montage.tap \ + tests/validate-stream.tap \ + tests/drawtest.tap \ + tests/wandtest.tap + +TESTS_EXTRA_DIST = \ + tests/common.shi \ + tests/rose.pnm \ + tests/input_256c.miff \ + tests/input_bilevel.miff \ + tests/input_gray.miff \ + tests/input_truecolor.miff \ + tests/sequence.miff \ + $(TESTS_TESTS) + +TESTS_CLEANFILES = \ + tests/*_out.* diff --git a/ImageMagick-6.9.12-44/tests/cli-colorspace.tap b/ImageMagick-6.9.12-44/tests/cli-colorspace.tap new file mode 100755 index 0000000..3c203a8 --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/cli-colorspace.tap @@ -0,0 +1,116 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +. ./common.shi +. ${srcdir}/tests/common.shi + +depth=`eval ${CONVERT} xc:none -format '%[fx:QuantumRange]' info:-` +if [ "X$depth" = "X255" ]; then + echo "1..1" + echo "ok" + exit 0 +fi +echo "1..19" + +# how to generate a one pixel (average rose) color and output its values +in="rose: -scale 1x1" # a one pixel image of the average color. +out="-format '%[fx:int(255*r+.5)],%[fx:int(255*g+.5)],%[fx:int(255*b+.5)]' info:-" + +# ---------------- + +# Colors to compare results to. +error=false +average=`eval ${CONVERT} "$in" -noop "$out"` +too_dark=`eval ${CONVERT} "$in" -colorspace RGB "$out"` +too_light=`eval ${CONVERT} "$in" -set colorspace RGB -colorspace sRGB "$out"` +format='%-30s%s\n' # results formating +format2='%-30s%-14s%s\n' + +printf "$format2" "Average \"rose:\" Color" "$average" "sRGB(rose)" +printf "$format2" "Too Dark Color" "$too_dark" "sRGB(rose)->RGB result" +printf "$format2" "Too Light Color" "$too_light" "RGB(rose)->sRGB result" +echo '' + +# +# Sanity checks +# +# NOTE: as a extra validation on sanity checks below... +# eval ${CONVERT} "$in" -gamma .454545 "$out" +# produces a value of 74,25,20 which is close to 73,26,21 below. +# eval ${CONVERT} "$in" -gamma 2.2 "$out" +# produces a value of 198,158,151 whcih is close to 199,160,152 below. +# +# Actual values used below come from IM v6.5.4-7 colorspace conversions +# +error=false +if [ "X$average" != "X146,89,80" ]; then + echo "Sanity Failure: Average expected to be 145,89,80 - ABORTING" + error=true +fi +if [ "X$too_dark" != "X73,26,21" ]; then + echo "Sanity Failure: Too Dark expected to be 73,26,21 - ABORTING" + error=true +fi +if [ "X$too_light" != "X199,160,152" ]; then + echo "Sanity Failure: Too Light expected to be 199,160,152 - ABORTING" + error=true +fi +$error && exit 1 + +test_color() { + test="sRGB" + cs=''; + for i in "$@"; do + test="${test}->$i" # format of the test being performed + cs="$cs -colorspace $i" # colorspace operations to perform test + done + color=`eval ${CONVERT} "$in" $cs "$out"` + + if [ "X$color" = "X$average" ]; then + return 0 + fi + # Its failed the round-trip test, now report how it failed! + if [ "X$color" = "X$too_light" ]; then + return 1 + fi + if [ "X$color" = "X$too_dark" ]; then + return 1 + fi + return 1 +} + +# ---------------- + +test_color RGB sRGB && echo "ok" || echo "not ok" +test_color XYZ sRGB && echo "ok" || echo "not ok" +test_color XYZ RGB sRGB && echo "ok" || echo "not ok" +test_color RGB XYZ sRGB && echo "ok" || echo "not ok" +test_color LAB sRGB && echo "ok" || echo "not ok" +test_color XYZ LAB sRGB && echo "ok" || echo "not ok" +test_color LAB XYZ sRGB && echo "ok" || echo "not ok" +test_color RGB LAB sRGB && echo "ok" || echo "not ok" +test_color LAB RGB sRGB && echo "ok" || echo "not ok" +test_color CMY sRGB && echo "ok" || echo "not ok" +test_color CMYK sRGB && echo "ok" || echo "not ok" +test_color HSL sRGB && echo "ok" || echo "not ok" +test_color HSB sRGB && echo "ok" || echo "not ok" +test_color HWB sRGB && echo "ok" || echo "not ok" +test_color Log sRGB && echo "ok" || echo "not ok" +test_color YIQ sRGB && echo "ok" || echo "not ok" +test_color YUV sRGB && echo "ok" || echo "not ok" +test_color YCbCr sRGB && echo "ok" || echo "not ok" +test_color OHTA sRGB && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/cli-pipe.tap b/ImageMagick-6.9.12-44/tests/cli-pipe.tap new file mode 100755 index 0000000..a2348d8 --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/cli-pipe.tap @@ -0,0 +1,31 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..8" + +${CONVERT} pnm:- 'null:' < ${SRCDIR}/rose.pnm && echo "ok" || echo "not ok" +${CONVERT} pnm:- miff:- < ${SRCDIR}/rose.pnm | ${IDENTIFY} - && echo "ok" || echo "not ok" +${CONVERT} pnm:- - < ${SRCDIR}/rose.pnm | ${IDENTIFY} - && echo "ok" || echo "not ok" +${CONVERT} - 'null:' < ${SRCDIR}/rose.pnm && echo "ok" || echo "not ok" +${CONVERT} - miff:- < ${SRCDIR}/rose.pnm | ${IDENTIFY} - && echo "ok" || echo "not ok" +${CONVERT} - - < ${SRCDIR}/rose.pnm | ${IDENTIFY} - && echo "ok" || echo "not ok" +${CONVERT} ${SRCDIR}/rose.pnm - | ${IDENTIFY} - && echo "ok" || echo "not ok" +${CONVERT} ${SRCDIR}/rose.pnm miff:- | ${IDENTIFY} - && echo "ok" || echo "not ok" + diff --git a/ImageMagick-6.9.12-44/tests/common.shi b/ImageMagick-6.9.12-44/tests/common.shi new file mode 100644 index 0000000..748672e --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/common.shi @@ -0,0 +1,11 @@ +# Test environment +SRCDIR=`dirname $0` +SRCDIR=`cd $SRCDIR && pwd` +TOPSRCDIR=`cd $srcdir && pwd` +REFERENCE_IMAGE="${TOPSRCDIR}/images/rose.pnm" +. ./common.shi +[ "X$CONVERT" = "X" ] && CONVERT=convert +[ "X$IDENTIFY" = "X" ] && IDENTIFY=identify +export SRCDIR TOPSRCDIR +cd tests || exit 1 + diff --git a/ImageMagick-6.9.12-44/tests/drawtest.c b/ImageMagick-6.9.12-44/tests/drawtest.c new file mode 100644 index 0000000..0078619 --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/drawtest.c @@ -0,0 +1,464 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD RRRR AAA W W % +% D D R R A A W W % +% D D RRRR AAAAA W W % +% D D R R A A W W W % +% DDDD R R A A W W % +% % +% TTTTT EEEEE SSSSS TTTTT % +% T E SS T % +% T EEE SSS T % +% T E SS T % +% T EEEEE SSSSS T % +% % +% % +% MagickWand Drawing Tests % +% % +% Software Design % +% Cristy % +% Bob Friesenhahn % +% March 2002 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +#include +#include +#include + +#define ThrowWandException(wand) \ +{ \ + char \ + *description; \ + \ + ExceptionType \ + severity; \ + \ + description=MagickGetException(wand,&severity); \ + (void) FormatLocaleFile(stderr,"%s %s %lu %s\n",GetMagickModule(), \ + description); \ + description=(char *) MagickRelinquishMemory(description); \ + exit(-1); \ +} + +static MagickBooleanType ScribbleImage(MagickWand *canvas) +{ + DrawingWand + *picasso; + + PixelWand + *color; + + picasso=NewDrawingWand(); + color=NewPixelWand(); + (void) PushDrawingWand(picasso); + { + DrawSetViewbox(picasso,0,0,(ssize_t) MagickGetImageWidth(canvas), + (ssize_t) MagickGetImageHeight(canvas)); + DrawScale(picasso,1.101,1.08); + DrawTranslate(picasso,-23.69,-22.97); + DrawRotate(picasso,0); + (void) PixelSetColor(color,"#ffffff"); + DrawSetFillColor(picasso,color); + DrawRectangle(picasso,23.69,22.97,564.6,802.2); + DrawSetFillOpacity(picasso,1.0); + (void) PixelSetColor(color,"none"); + DrawSetFillColor(picasso,color); + DrawSetStrokeColor(picasso,color); + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + DrawPushDefs(picasso); + { + DrawPushClipPath(picasso,"clip_1"); + { + (void) PushDrawingWand(picasso); + { + DrawRectangle(picasso,0,0,595.3,841.9); + } + (void) PopDrawingWand(picasso); + } + DrawPopClipPath(picasso); + } + DrawPopDefs(picasso); + (void) PushDrawingWand(picasso); + { + (void) DrawSetClipPath(picasso, "url(#clip_1)"); + + (void) PushDrawingWand(picasso); + { + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,4.032); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#ff0000"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#ff00ff"); + DrawSetFillColor(picasso,color); + DrawRectangle(picasso,72,72,144,144); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,9); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#00ff00"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#0080ff"); + DrawSetFillColor(picasso,color); + DrawRoundRectangle(picasso,72,216,360,432,9,9); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + const PointInfo points[37] = + { + { 378.1,81.72 }, { 381.1,79.56 }, { 384.3,78.12 }, { 387.6,77.33 }, + { 391.1,77.11 }, { 394.6,77.62 }, { 397.8,78.77 }, { 400.9,80.57 }, + { 403.6,83.02 }, { 523.9,216.8 }, { 526.2,219.7 }, { 527.6,223 }, + { 528.4,226.4 }, { 528.6,229.8 }, { 528,233.3 }, { 526.9,236.5 }, + { 525.1,239.5 }, { 522.6,242.2 }, { 495.9,266.3 }, { 493,268.5 }, + { 489.7,269.9 }, { 486.4,270.8 }, { 482.9,270.9 }, { 479.5,270.4 }, + { 476.2,269.3 }, { 473.2,267.5 }, { 470.4,265 }, { 350,131.2 }, + { 347.8,128.3 }, { 346.4,125.1 }, { 345.6,121.7 }, {345.4,118.2 }, + { 346,114.8 }, { 347.1,111.5 }, { 348.9,108.5 }, { 351.4,105.8 }, + { 378.1,81.72 } + }; + + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,2.016); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#000080"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#c2c280"); + DrawSetFillColor(picasso,color); + DrawPolygon(picasso,37,points); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,3.024); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#000080"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#000080"); + DrawSetFillColor(picasso,color); + DrawEllipse(picasso,489.6,424.8,72,129.6,0,360); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + const PointInfo points[48] = + { + { 213.8,25.13}, { 216.7,24.48 }, {219.8,24.55 }, { 223.1,25.42 }, + { 226.7,27 }, { 230.3,29.3 }, { 234.1,32.26 }, { 237.9,35.86 }, + { 241.8,40.03 }, { 249.7,50.11 }, { 257.4,62.14 }, { 264.8,75.89 }, + { 271.6,91.15 }, { 277.3,106.8 }, { 281.6,121.8 }, { 284.4,135.9 }, + { 285.7,148.5 }, { 285.6,159.6 }, { 284.9,164.3 }, { 283.8,168.5 }, + { 282.5,172.1 }, { 280.7,175 }, { 278.5,177.3 }, { 275.9,178.7 }, + { 273,179.4 }, { 269.9,179.3 }, { 266.6,178.4 }, { 263.1,176.8 }, + { 259.5,174.5}, { 255.7,171.6 }, { 251.9,168 }, { 248,163.8 }, + { 244.1,159 }, { 240.1,153.7 }, { 232.3,141.7 }, { 225,127.9 }, + { 218.2,112.7 }, { 212.5,97.06 }, { 208.2,82.01 }, { 205.4,67.97 }, + { 204,55.3 }, { 204.3,44.35 }, { 204.9,39.6 }, { 205.9,35.42 }, + { 207.4,31.82 }, { 209.2,28.87 }, { 211.3,26.64}, { 213.8,25.13 } + }; + + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,3.024); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#ff8000"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#00ffff"); + DrawSetFillColor(picasso,color); + DrawPolygon(picasso,48,points); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,12.02); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#4000c2"); + DrawSetStrokeColor(picasso,color); + (void) PixelSetColor(color,"none"); + DrawSetFillColor(picasso,color); + DrawArc(picasso,360,554.4,187.2,237.6,0,90); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,9); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#4000c2"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#4000c2"); + DrawSetFillColor(picasso,color); + DrawEllipse(picasso,388.8,626.4,100.8,122.4,0,90); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + const PointInfo points[6] = + { + { 180,504 }, { 282.7,578.6 }, { 243.5,699.4 }, { 116.5,699.4 }, + { 77.26,578.6 }, { 180,504 } + }; + + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,9); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#4000c2"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#800000"); + DrawSetFillColor(picasso,color); + DrawPolygon(picasso,6,points); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + const PointInfo points[11] = + { + { 180,504 }, { 211.8,568.3 }, { 282.7,578.6 }, { 231.3,628.7 }, + { 243.5,699.4 }, { 180,666 }, { 116.5,699.4 }, { 128.7,628.7 }, + { 77.26,578.6 }, { 148.2,568.3 }, { 180,504 } + }; + + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,9); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#4000c2"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#800000"); + DrawSetFillColor(picasso,color); + DrawPolygon(picasso,11,points); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + const PointInfo points[15] = + { + { 540,288 }, { 561.6,216 }, { 547.2,43.2 }, { 280.8,36 }, + { 302.4,194.4 }, { 331.2,64.8 }, { 504,64.8 }, { 475.2,115.2 }, + { 525.6,93.6 }, { 496.8,158.4 }, { 532.8,136.8 }, { 518.4,180 }, + { 540,172.8 }, { 540,223.2 }, { 540,288 } + }; + + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,5.976); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#4000c2"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#ffff00"); + DrawSetFillColor(picasso,color); + DrawPolygon(picasso,15,points); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + const PointInfo points[7] = + { + { 57.6,640.8 }, { 57.6,784.8 }, { 194.4,799.2 }, { 259.2,777.6 }, + { 151.2,756 }, { 86.4,748.8 }, { 57.6,640.8 } + }; + + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,5.976); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#4000c2"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#ffff00"); + DrawSetFillColor(picasso,color); + DrawPolygon(picasso,7,points); + } + (void) PopDrawingWand(picasso); + (void) PushDrawingWand(picasso); + { + const PointInfo points[193] = + { + { 27.86,565.3 }, { 29.66,550.8 }, { 31.97,538.1 }, { 34.85,527.1 }, + { 38.09,517.7 }, { 41.83,509.8 }, { 45.86,503.1 }, { 50.33,497.6 }, + { 55.08,493.2 }, { 60.19,489.8 }, { 65.45,487.3 }, { 70.92,485.4 }, + { 76.61,484.2 }, { 88.42,483 }, { 100.4,482.9 }, { 108.4,482.2 }, + { 119.8,480.3 }, { 150.8,474.1 }, { 189.4,466.6 }, { 210.3,463 }, + { 231.5,459.9 }, { 252.4,457.8 }, { 272.7,456.6 }, { 291.8,456.9 }, + { 300.7,457.7 }, { 309.1,458.9 }, { 316.9,460.6 }, { 324.1,462.8 }, + { 330.7,465.6 }, { 336.4,469 }, { 341.3,473 }, { 345.3,477.7 }, + { 348.4,483.1 }, { 350.4,489.2}, { 352.4,495.4 }, { 355.2,500.9 }, + { 358.8,505.8 }, { 363,510 }, { 367.8,513.6 }, { 373,516.8 }, + { 378.6,519.6 }, { 384.3,521.8 }, { 396.4,525.4 }, { 408.2,527.9 }, + { 428,531.2 }, { 434.6,532.9 }, { 436.7,533.8 }, { 437.8,534.9 }, + { 437.8,536.2 }, { 436.8,537.8 }, { 434.5,539.6 }, { 430.9,541.8 }, + { 419.3,547.6 }, { 401.3,555.2 }, { 342.4,577.9 }, {325.2,584.9 }, + { 311,591.3 }, { 300,597.3 }, { 291.6,602.8 }, { 285.8,607.8 }, + { 282.3,612.3 }, { 281.4,614.4 }, { 280.9,616.2 }, { 281.2,619.6 }, + { 282.1,621.2 }, { 283.3,622.6 }, { 286.8,624.9 }, { 291.5,626.6 }, + { 297.1,627.8 }, { 303.6,628.3 }, { 310.5,628.3 }, { 317.9,627.6 }, + { 325.2,626.3 }, { 332.6,624.3 }, { 339.5,621.7 }, { 345.9,618.4 }, + { 351.4,614.4 }, { 353.9,612.2 }, { 356,609.8 }, { 357.9,607.1 }, + { 359.4,604.3 }, { 360.6,601.3 }, { 361.4,598.2 }, { 361.7,594.9 }, + { 361.7,591.3 }, { 361.2,587.7 }, { 360.1,583.7 }, { 358.6,579.7 }, + { 356.4,575.4 }, { 353.7,570.9 }, { 350.4,566.2 }, { 346.4,561.3 }, + { 341.8,556.2 }, { 336.5,550.9 }, { 330.6,545.5 }, { 323.8,539.8 }, + { 316.2,533.9 }, { 298.7,521.5 }, { 277.8,508.2 }, { 256.1,495.5 }, + { 236,484.5 }, { 217.7,475.1 }, { 200.8,467.1 }, { 185.6,460.7 }, + { 171.9,455.5 }, { 159.6,451.6 }, { 148.6,448.8 }, { 139,447 }, + { 130.5,446.2 }, { 123.3,446.2 }, { 117.1,446.9 }, { 112,448.3 }, + { 107.9,450.2 }, { 104.8,452.5 }, { 102.5,455.2 }, { 101,458.1 }, + { 100.2,461.2 }, { 100.2,464.3 }, { 100.7,467.4 }, { 101.8,470.3 }, + { 103.4,473 }, { 105.4,475.3 }, { 107.8,477.1 }, { 110.5,478.4 }, + { 113.4,479.1 }, { 116.5,478.9 }, { 119.7,478 }, { 123,476.2 }, + { 126.4,473.3 }, { 129.6,469.2 }, { 132.7,463.9 }, { 135.2,458.4 }, + { 136.6,453.7 }, { 137,449.9 }, { 136.6,446.8 }, { 135.4,444.5 }, + { 133.3,442.9 }, { 130.8,441.9 }, { 127.5,441.4 }, { 123.9,441.6 }, + { 119.8,442.3 }, { 110.7,445.1 }, { 101.1,449.5 }, { 91.37,455.2 }, + { 82.37,461.9 }, { 74.66,469.2 }, { 71.57,473 }, { 68.98,476.8 }, + { 67.03,480.7 }, { 65.81,484.4 }, { 65.45,488.2 }, { 65.95,491.7 }, + { 67.46,495.1 }, { 69.98,498.3 }, { 73.66,501.3 }, { 78.55,503.9 }, + { 84.82,506.3 }, { 92.38,508.2 }, { 107.1,511.6 }, { 118.2,514.8 }, + { 125.9,517.8 }, { 130.7,520.4 }, { 132.1,521.7 }, { 132.8,522.9 }, + { 133,524.2 }, { 132.6,525.3 }, { 131.8,526.5 }, { 130.5,527.5 }, + { 126.6,529.6 }, { 121.5,531.7 }, { 115.3,533.7 }, { 101.4,537.6 }, + { 87.55,541.8 }, { 81.36,544 }, { 76.25,546.3 }, { 71.64,549.5 }, + { 66.89,554.1 }, { 62.14,559.8 }, { 57.38,566.1 }, { 48.17,579.6 }, + { 39.96,591.4 }, { 36.43,595.9 }, { 34.78,597.6 }, { 33.26,598.8 }, + { 31.9,599.6 }, { 30.67,599.9 }, { 29.59,599.7 }, { 28.66,598.8 }, + { 27.86,597.4 }, { 27.29,595.2 }, { 26.64,588.7 }, { 26.86,578.8 }, + { 27.86,565.3 } + }; + + DrawSetStrokeAntialias(picasso,MagickTrue); + DrawSetStrokeWidth(picasso,5.904); + DrawSetStrokeLineCap(picasso,RoundCap); + DrawSetStrokeLineJoin(picasso,RoundJoin); + (void) DrawSetStrokeDashArray(picasso,0,(const double *) NULL); + (void) PixelSetColor(color,"#4000c2"); + DrawSetStrokeColor(picasso,color); + DrawSetFillRule(picasso,EvenOddRule); + (void) PixelSetColor(color,"#ffff00"); + DrawSetFillColor(picasso,color); + DrawPolygon(picasso,193,points); + } + (void) PopDrawingWand(picasso); + } + (void) PopDrawingWand(picasso); + } + (void) PopDrawingWand(picasso); + (void) MagickDrawImage(canvas,picasso); + color=DestroyPixelWand(color); + picasso=DestroyDrawingWand(picasso); + return(MagickTrue); +} + +int main(int argc,char **argv) +{ + char + filename[MaxTextExtent]; + + MagickBooleanType + status; + + MagickWand + *canvas; + + if (argc != 2) + { + (void) printf ("Usage: %s filename\n",argv[0]); + exit(1); + } + (void) CopyMagickString(filename,argv[1],MaxTextExtent); + /* + Create canvas image. + */ + MagickWandGenesis(); + canvas=NewMagickWand(); + status=MagickSetSize(canvas,596,842); + if (status == MagickFalse) + ThrowWandException(canvas); + status=MagickReadImage(canvas,"xc:white"); + if (status == MagickFalse) + ThrowWandException(canvas); + /* + Scribble on image. + */ + status=ScribbleImage(canvas); + if (status == MagickFalse) + ThrowWandException(canvas); + /* + Set pixel depth to 8. + */ + status=MagickSetImageDepth(canvas,8); + if (status == MagickFalse) + ThrowWandException(canvas); + /* + Set RLE compression. + */ + status=MagickSetImageCompression(canvas,RLECompression); + if (status == MagickFalse) + ThrowWandException(canvas); + /* + Save image to file. + */ + status=MagickWriteImage(canvas,filename); + if (status == MagickFalse) + ThrowWandException(canvas); + canvas=DestroyMagickWand(canvas); + MagickWandTerminus(); + return(0); +} diff --git a/ImageMagick-6.9.12-44/tests/drawtest.tap b/ImageMagick-6.9.12-44/tests/drawtest.tap new file mode 100755 index 0000000..44f4ab4 --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/drawtest.tap @@ -0,0 +1,13 @@ +#!/bin/sh +# Copyright (C) 1999-2016 ImageMagick Studio LLC +# +# This program is covered by multiple licenses, which are described in +# LICENSE. You should have received a copy of LICENSE with this +# package; otherwise see https://imagemagick.org/script/license.php. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${DRAWTEST} drawtest_out.miff && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/input_256c.miff b/ImageMagick-6.9.12-44/tests/input_256c.miff new file mode 100644 index 0000000000000000000000000000000000000000..ea84fd14bb86c55d47243deba10cd4ab1362896d GIT binary patch literal 4120 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 G*zVs)8NFZt literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/tests/input_bilevel.miff b/ImageMagick-6.9.12-44/tests/input_bilevel.miff new file mode 100644 index 0000000000000000000000000000000000000000..8f4ba292caf6950d23ad731b6a9d2419347e4c83 GIT binary patch literal 3328 zcmbtU+iKfD5Vc=TzaUTh1tkq3Ed@Ol3VkT_7lbWRQ#%Tl(|*3YGiT4vthAC%D@B_7 zIcHWl`(5+x*gkjP+volER|vnm)3EPfnh)>qH`_xy49$^Uvnf=H2G=-D;#Giz+l5wm1vEX_VgB{7He0wZ|qZ(9g*M2S8cdUn+P zJ5xF_|E|V^BrVZ!=aSb)?1gGYkqt!LjbEgGGMX)ja2n$?sbxW)>7j(nJ{_SWrsfw3ynYKk0})Gke~m%+DrFO{L$Fe13^>)vV8@ z-dlL5JwjpG%!m|w?v2o~cnjyy+FIoM+OBI5WeA@g4J-Y#N(lYwLTwvmW!nx9{o6eAEYDIy6R7t5K zjk&XuNezWc`Bg*qI5Ddv7n~MM8(cmcp;E^5&co`U!kkI)9;?fCq{S;Cm@X~b)gD1l On`@avQ@gA~s(%6F!YD5Q literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/tests/input_gray.miff b/ImageMagick-6.9.12-44/tests/input_gray.miff new file mode 100644 index 0000000000000000000000000000000000000000..5ca323f7686e3634cfac1596a63d9b9b7af1dbc5 GIT binary patch literal 4092 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.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT!SD`ohgFgcc;OBCp1KtNX zO8K*!oe^&adqGYKw06@1{|siwa5*!*20Q{-6Hvel4+mF)a%MW+qkIhTTd#n0d3E_< z@P07ewu_tH*TAEIm-K=wodo!4U)-#xuV?OoY+od^jem+x1s8#j0Pd;&0Q?C2C-^Jy z+kiRpABFo}+DG#LuX``>G5jD9gFAr#D6IM4;6=b^MAqSc@2F$VTK#*#lYrapL%_R1 zUY7m-msNB;lhyx~z-^E3mon$&vtP|Uw!DMUjkJ{ z7|ysng6($oB~Vq&w*Ys9XMw6B3}@WO1Gg(4_p2)AZvc0Mygsn12*VlI=hxg_psJX^ z58T;&B&aIFaK`nycI(HWs+f7*f;*c$0$){x;f(8Z1=mkORWaWS+}S)4R25-3e|FXWTu&?W)>4@_dd3 z@h-w}tX35X&t1B+`H!Hg2tNzl5$*?7MHtSwyero2>cgO_m_G#E5%Nq>RS||W?lItY zbp@y@W}oxvJWE?ugyD?)cHqwD7N{!bK5$3Kj8_$5IOBc-xLutKs*3p>;EwQn#i^*g}r?H!=Zxp42x z9To5DEi5hgP`cxd?I0;q9d8y{<)rjJDYsKCSO0lcTk|cz$13aa6OZc)jT-q^fzRHK8PB`GsAJ7$eg4ls4VVty z+q{;8t0HhU44%p2xn}-l3159N@VUm!9Cr?IZG_p(&dz3i9dI8bGCdc)&3j0{0(Led zwYn4(ohf(!ybi6}vvSk)pTKWYpR4=ac^UQ9lfl(sntX;Zm%j&32cza?)cRbFgsW1A zF!yPVf%`~r1NmmQ3El~`pHtQU&yC=9;C%2b!2K3}K68)vv4F3>1n_&goE4?2@}qHO zKn7$$24p}6WIzUFKn7$$24p}6WIzUFKn7$$24p}6WIzUb-RR(YyqcaDulAC|_4?7Y zKj>|4M9n>oTCx@o2GRarKTU@F9@wte*W=+ZjSj?XgS3`xu5GPv45D_sUhi)n8$_K( zz1~fa3=c)kR;@Qo`|)tQt3ia~wfK0{s116n8}V?fpGKXfxy5v))tp~!&n4}J#`fPv zXMSa+Ik((s%`G)L%k%ApmDb!sG8Z@E<#@TXwA5Zsx2wks-IbO3+OFE(-O8T~$bbyU zfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih4D8In&A@i|xLzushoo$lX+GbvxI!H7M0MwpujV_tddtheP2h3BCy&Zz zUgq=d=LYa-;GaijGv6$X-`fWOS3(&zkILrw{>SfuPrQ2#7=Nv+@#9esJ2SvF{+7Vb z-ig^(JBviEc4mOjg}n^y0@;j=Q?j$D)M``%9|wH){HXbQ2JmS$YE-K4Z{S)G0iRrC z>zoa~1G2AXOZ;O~%~1_xZTpmPb$hO1Z9Wy)r|qZ_s=mJgAOB_@exhCvvZI(aZQI#a zD#^=$&AD05Cp}*R?g6&Z%~rN;TU(WnZ@}i9pQSPIe*%ZCH?w^FnAL;Lfa&=mfY0gV zisZIdwsNyK+qSK(%Evcw8sHNj`Ao8L`m|-xEFY(TwRIbCe-FCbW?wb4X4}rTQc0Kw zY#B7m!;D-}Weu2Fvu$TvsU%DTwhWr(VMeZ~vIfko*|xK-R1&5ETL#VYFe6t~Sp#O) zY}?sZDhbnoErVuxn2{^0tN}A?w(V>ym4s=)mO-;T%*Yj0)_|Ec+jh2y?BUe;e z17_B2+u2qs3DbZrgJyY{kt?dK0W)j1?QAQRglWK*L9;x}$Q4!AfSEPhcD9vD!ZcvZ zpjjSfoo%I(Fb&u;XqJZ=xuVJ%FtcXc z&bCsC49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49Gw@272A-;Cj58 zo)@q7lEd}-(X>D4ZEi%(J&jtj77qr|{$4*#hWj4auGiP&;V_L3#A}1JmTazVt#1sX zcDr8hZyp;&okqRhO^*x@Ma@>NH%$BSaJ#EPgyOaMc+{v3daE1paI2q2$wI3WHy7LU zt#+r`=`1aG8=dCz(&FO6e6tfTHoNn4jfG~TG2cn&y3P4!voW`rEVk3diz12P~3G9UvoAOkWW12P~3G9UvoAOkWW12P~3G9UvoP`&{^>+VzFQg8ui zfG2@d0H0EMGB^|bGB^yb0(XM)XEDnoejOYKrvuwvYNM8)2rdMl2ea(CxVhg8E(Rxn zQ8P7a{Re>r+y#o8-R$(tC%?{tQ8SWP{ilMjfY~vh?@Vt4PXT%5Wt@H<1HKIMo#}M< z#!t3qf^qy8(e}yUyI{Jrkk{;90Y=TmS>X4<#{u`3_`kuuU%ub32d@K7FzQ$@0eQ`L zTKoAT@ZZnj=kV2F948+IPXPXz{TndOxYOPCWx&Vhx!`V)my_E8e~0?SuovVt`ZV?P zL$C|DP15#{K@kRc4B^?p9SL9k5-1{)$?fxfz-^D8z_);+XZkt7U!Cr#UJr_nXR`WV z18#3G1!c~Qdpqu^eif7%Rrq6_4cy-T0+cxyj_8hx#}>+rD*Um0j<}Y8H0Eo-olSn% zhi|yd2)_-k1#bl}2hRhifqeI1eP;I~;Law`&iM4EI@KEZ9&l%qXW6QaQ=|JB;Qq5a zn>>r^)0^s4Yv4-Y&gMQ)ZJZk2#{hp5xwH97;M1GxRAqpBWe)@HZ1Mj9<18)QFJo42epv>4b zmcN1P0I$GwXY+ADSKj)&Ewkpof=2;&9{K8rK$#J0EFS|rqV9k7$SUyZS#`=Z@L!+~ zeBO^OP~6oHWzKz?#^SZs{&{>N_$HVp50gF@9zTCP@OeM-TIhcRlRo!pil0~b_?!)A zmU)DS*Md%yhe@ByHNfXOK<1Gd{{oowxldF4?*Tr)ADKsf0+(|&;52zIdM=j$pKnIi z;Wb+PwNi9!>fgrzudL=>wElTq1U&QQGm7dIZQxcg>YYL7fFFROBUJxB2Dqns2JnAB z9s)We>0`K@Iv)W(=O3A6ULpC%pqvObijRSJ1ONL0xf+S?%kyztW*we+^ts1}??>JN z&GRE=#;LK~2Ce}9d0Yb8Q*~P{|J4rw|2+OW(3y_%Gvyxf2Jmp;v%k6t?g#Fk^=g?0 zz7PCYl{pH^j8J3w8|VU`_apD#_3v3V%QSE!@cEW}KF|?>GP5)4SOhnC5&$}|@JTkWF%g(4X;+k6FXUZqSQRhB=^&{ZpD*QUrmz_~(H0pVfkaIff+^4U; z&pnbMXV8po`m&=L$$$*VfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$Uv9| zdfn*Ydc2yR7q9k`!}a>nv_I%=ZbZ#Jjasr64+hcxUO!ES`ySY?*Vp6WFpUnxYlF0w zY_4ssZw#V#yI${a9veiRM!numj|>k*%~q{9O#AV0yQ@Kj;8 z-T634T8((I*=@%wi`|8Eshz}))?A!67Mp3ewX)b)=(OgS)1`&DyV7kgtt`b!tKDcP z^Nr?WZC7pY?l7GyDjARg8IS=PkO3Kx0U3}18IS=PkO3Kx0U3}18IS=PkbyD{+z$AJ zY(5W|PX*xW^N#>rX_u>7KMU~r=$8Vma#d!&vSZy0mcdEDywhxF+gu6sUEpURJFZId zGH@?=HQ-8)JIk6+tLK1EgS_HbKQzE~;ue5UF7m3w{~3N7D;MJ%xC8K=l2?v)*3YZJ z_%oW#9{A1G0Xy?wM5{jqvzd``X8lLNKObcO-loWzmsLZvQ^d^}G@kJx3m|aA%Wia~B=Swv4_q-m;LhfmV0N5L?o6)&?rfe9CU=gr6FFB)cW0AN z44NG$lQ>i6$el<2BK{tj#5vAF%x?xh#|?N4c@~^Z)*L?td_GtCZsj`NMI3{gEN@js zdms2;@VDT#;4I+&L^WUiMer?9)m&zCTt3-u7a0Fp6fXjIg4y(0?W}p6!F*?py3I2w zJZ@a=TxNN6K2Lqr+?niwR1N^!)-K{D@jq7iK_a0_5XqKD`{QFeRstnu%%-m(SdG~Hr5o%n21H6YQ zn?bXL*9-agIjuE$T{Q0(xE%1h=(EA;pxWc2p8;m>vfEDs)0!jyc|8_n{g@?h0{(sG zTk{fN#*^JX2jn~MB=&XyWc`>WylcLy+06qpp6vD?f~q16XWU~T>nB_CSx{!=yz@F6 zNw(w$P-bjlj>Rh>vwpHAWuCLR8}JxxHWIVs=^#wERYmnoU|OsN3^i}7>h(?c8F2(t00BrgNk0bWx#{#{_qEc@Zr z>>mdDX3Q&J{{8UY%=ZJHdEp&@{3Xb>+-GNTu|d>n)a%{! z$na3qY}Iy+*yBb6&UW<=MjoP5Mx)Bez`e_umR@%v8BbnGH0DD{VGft)=De%1V22p*c6dv|ZY1w9}-vtG0LdWVu$fG9UvoAOkWW z12P~3G9UvoAOkWW12P~3G9UvoAOkWW12P~3%ZWszjAMW+=koqHWpf;p z)wbnoIR2}sR2!{EcN=&qaK9hTSKYno)v65aY{izUqSd%I1OEh00_OY9XWQ1N%F8#v zwX692NT1wg>y#g}Mzk65U&Aq*N0!)nR(Y8Q_|!>Tj{M8Zj9Fu44RAI26M=u$Y&Em} ztE3zQTmLK$Yji4`dF5r)ewY{L z$ejh|nt6AR;_ip9x_i*8qZ;7nTZ@~X~Y1}X3K9W!W%BGK{ zyz1~bh0m(x{GGzzEdHY_oBpoGsmb5?{JrmX&f^9=hA`@g?wK-B zHjn9}=Gh$w2%|bt`z{l!~LB39W z#?5!cY3=PQ;N$bj;7*XQ4WH5T9dY`4;}ctV0k=vzg7%W^K!kSsq%h@A8L(y0EDtSa#bYyIX3e&3 zYpe3m4A?SgmWLLz;;|Vpvu4}2wN-g&25cEL%R`G<@z@NQS+i~1+NwM>1GWsB<)Ou_ zcx(pDtl740ZB-tc0b2&m^3Y;dJT?Pn)@<9hwknqa8IS=PkO3Kx0U3}18IS=PkO3Kx Z0U3}18IS=PkO3Kx0U3}187R}h{{x_Tist|T literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/tests/validate-colorspace.tap b/ImageMagick-6.9.12-44/tests/validate-colorspace.tap new file mode 100755 index 0000000..bc4bc0c --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-colorspace.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate colorspace && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate-compare.tap b/ImageMagick-6.9.12-44/tests/validate-compare.tap new file mode 100755 index 0000000..799673c --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-compare.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate compare && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate-composite.tap b/ImageMagick-6.9.12-44/tests/validate-composite.tap new file mode 100755 index 0000000..b8c9d46 --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-composite.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate composite && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate-convert.tap b/ImageMagick-6.9.12-44/tests/validate-convert.tap new file mode 100755 index 0000000..ae900a0 --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-convert.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate convert && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate-formats-disk.tap b/ImageMagick-6.9.12-44/tests/validate-formats-disk.tap new file mode 100755 index 0000000..3ab15ef --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-formats-disk.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate formats-disk && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate-formats-map.tap b/ImageMagick-6.9.12-44/tests/validate-formats-map.tap new file mode 100755 index 0000000..c1f9f60 --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-formats-map.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate formats-map && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate-formats-memory.tap b/ImageMagick-6.9.12-44/tests/validate-formats-memory.tap new file mode 100755 index 0000000..da0317e --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-formats-memory.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate formats-memory && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate-identify.tap b/ImageMagick-6.9.12-44/tests/validate-identify.tap new file mode 100755 index 0000000..6199e26 --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-identify.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate identify && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate-import.tap b/ImageMagick-6.9.12-44/tests/validate-import.tap new file mode 100755 index 0000000..05da56e --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-import.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate import-export && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate-montage.tap b/ImageMagick-6.9.12-44/tests/validate-montage.tap new file mode 100755 index 0000000..17639be --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-montage.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate montage && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate-stream.tap b/ImageMagick-6.9.12-44/tests/validate-stream.tap new file mode 100755 index 0000000..0f27aca --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate-stream.tap @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test for 'validate' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${VALIDATE} -validate stream && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/tests/validate.c b/ImageMagick-6.9.12-44/tests/validate.c new file mode 100644 index 0000000..80a2f2a --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate.c @@ -0,0 +1,2531 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% % +% V V AAA L IIIII DDDD AAA TTTTT EEEEE % +% V V A A L I D D A A T E % +% V V AAAAA L I D D AAAAA T EEE % +% V V A A L I D D A A T E % +% V A A LLLLL IIIII DDDD A A T EEEEE % +% % +% % +% ImageMagick Validation Suite % +% % +% Software Design % +% Cristy % +% March 2001 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% see the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "magick/colorspace-private.h" +#include "magick/log.h" +#include "magick/resource_.h" +#include "magick/string-private.h" +#include "validate.h" + +/* + Define declarations. +*/ +#if defined(__APPLE__) + #include "TargetConditionals.h" + #if TARGET_OS_IOS || TARGET_OS_WATCH || TARGET_OS_TV + #define system(s) ((s)==NULL ? 0 : -1) + #endif // end iOS +#elif defined(__ANDROID__) + #define system(s) ((s)==NULL ? 0 : -1) +#endif +#define CIEEpsilon (216.0/24389.0) +#define CIEK (24389.0/27.0) +#define D65X 0.95047 +#define D65Y 1.0 +#define D65Z 1.08883 +#define ReferenceEpsilon (QuantumRange*1.0e-2) + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V a l i d a t e C o l o r s p a c e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ValidateColorspaces() validates the ImageMagick colorspaces and returns the +% number of validation tests that passed and failed. +% +% The format of the ValidateColorspaces method is: +% +% size_t ValidateColorspaces(ImageInfo *image_info,size_t *fails, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o reference_filename: the reference image filename. +% +% o output_filename: the output image filename. +% +% o fail: return the number of validation tests that pass. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline void ConvertRGBToXYZ(const double red,const double green, + const double blue,double *X,double *Y,double *Z) +{ + double + b, + g, + r; + + r=QuantumScale*DecodePixelGamma(red); + g=QuantumScale*DecodePixelGamma(green); + b=QuantumScale*DecodePixelGamma(blue); + *X=0.41239558896741421610*r+0.35758343076371481710*g+0.18049264738170157350*b; + *Y=0.21258623078559555160*r+0.71517030370341084990*g+0.07220049864333622685*b; + *Z=0.01929721549174694484*r+0.11918386458084853180*g+0.95049712513157976600*b; +} + +static inline void ConvertXYZToLab(const double X,const double Y,const double Z, + double *L,double *a,double *b) +{ + double + x, + y, + z; + + if ((X/D65X) > CIEEpsilon) + x=pow(X/D65X,1.0/3.0); + else + x=(CIEK*X/D65X+16.0)/116.0; + if ((Y/D65Y) > CIEEpsilon) + y=pow(Y/D65Y,1.0/3.0); + else + y=(CIEK*Y/D65Y+16.0)/116.0; + if ((Z/D65Z) > CIEEpsilon) + z=pow(Z/D65Z,1.0/3.0); + else + z=(CIEK*Z/D65Z+16.0)/116.0; + *L=((116.0*y)-16.0)/100.0; + *a=(500.0*(x-y))/255.0+0.5; + *b=(200.0*(y-z))/255.0+0.5; +} + +static void ConvertRGBToLab(const double red,const double green, + const double blue,double *L,double *a,double *b) +{ + double + X, + Y, + Z; + + ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); + ConvertXYZToLab(X,Y,Z,L,a,b); +} + +static inline void ConvertLabToXYZ(const double L,const double a,const double b, + double *X,double *Y,double *Z) +{ + double + x, + y, + z; + + y=(L+16.0)/116.0; + x=y+a/500.0; + z=y-b/200.0; + if ((x*x*x) > CIEEpsilon) + x=(x*x*x); + else + x=(116.0*x-16.0)/CIEK; + if ((y*y*y) > CIEEpsilon) + y=(y*y*y); + else + y=L/CIEK; + if ((z*z*z) > CIEEpsilon) + z=(z*z*z); + else + z=(116.0*z-16.0)/CIEK; + *X=D65X*x; + *Y=D65Y*y; + *Z=D65Z*z; +} + +static inline void ConvertXYZToRGB(const double x,const double y,const double z, + Quantum *red,Quantum *green,Quantum *blue) +{ + double + b, + g, + r; + + r=3.2406*x-1.5372*y-0.4986*z; + g=(-0.9689*x+1.8758*y+0.0415*z); + b=0.0557*x-0.2040*y+1.0570*z; + *red=ClampToQuantum(EncodePixelGamma(QuantumRange*r)); + *green=ClampToQuantum(EncodePixelGamma(QuantumRange*g)); + *blue=ClampToQuantum(EncodePixelGamma(QuantumRange*b)); +} + +static inline void ConvertLabToRGB(const double L,const double a, + const double b,Quantum *red,Quantum *green,Quantum *blue) +{ + double + X, + Y, + Z; + + ConvertLabToXYZ(L*100.0,255.0*(a-0.5),255.0*(b-0.5),&X,&Y,&Z); + ConvertXYZToRGB(X,Y,Z,red,green,blue); +} + +static void ConvertRGBToYPbPr(const double red,const double green, + const double blue,double *Y,double *Pb,double *Pr) +{ + *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue); + *Pb=QuantumScale*((-0.1687367)*red-0.331264*green+0.5*blue)+0.5; + *Pr=QuantumScale*(0.5*red-0.418688*green-0.081312*blue)+0.5; +} + +static void ConvertRGBToYCbCr(const double red,const double green, + const double blue,double *Y,double *Cb,double *Cr) +{ + ConvertRGBToYPbPr(red,green,blue,Y,Cb,Cr); +} + +static void ConvertYPbPrToRGB(const double Y,const double Pb,const double Pr, + Quantum *red,Quantum *green,Quantum *blue) +{ + *red=ClampToQuantum(QuantumRange*(0.99999999999914679361*Y- + 1.2188941887145875e-06*(Pb-0.5)+1.4019995886561440468*(Pr-0.5))); + *green=ClampToQuantum(QuantumRange*(0.99999975910502514331*Y- + 0.34413567816504303521*(Pb-0.5)-0.71413649331646789076*(Pr-0.5))); + *blue=ClampToQuantum(QuantumRange*(1.00000124040004623180*Y+ + 1.77200006607230409200*(Pb-0.5)+2.1453384174593273e-06*(Pr-0.5))); +} + +static void ConvertYCbCrToRGB(const double Y,const double Cb, + const double Cr,Quantum *red,Quantum *green,Quantum *blue) +{ + ConvertYPbPrToRGB(Y,Cb,Cr,red,green,blue); +} + +static inline void ConvertLMSToXYZ(const double L,const double M,const double S, + double *X,double *Y,double *Z) +{ + *X=1.096123820835514*L-0.278869000218287*M+0.182745179382773*S; + *Y=0.454369041975359*L+0.473533154307412*M+0.072097803717229*S; + *Z=(-0.009627608738429)*L-0.005698031216113*M+1.015325639954543*S; +} + +static inline void ConvertLMSToRGB(const double L,const double M, + const double S,Quantum *red,Quantum *green,Quantum *blue) +{ + double + X, + Y, + Z; + + ConvertLMSToXYZ(L,M,S,&X,&Y,&Z); + ConvertXYZToRGB(X,Y,Z,red,green,blue); +} + +static inline void ConvertXYZToLMS(const double x,const double y, + const double z,double *L,double *M,double *S) +{ + *L=0.7328*x+0.4296*y-0.1624*z; + *M=(-0.7036*x+1.6975*y+0.0061*z); + *S=0.0030*x+0.0136*y+0.9834*z; +} + +static void ConvertRGBToLMS(const double red,const double green, + const double blue,double *L,double *M,double *S) +{ + double + X, + Y, + Z; + + ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); + ConvertXYZToLMS(X,Y,Z,L,M,S); +} + +static inline void ConvertXYZToLuv(const double X,const double Y,const double Z, + double *L,double *u,double *v) +{ + double + alpha; + + if ((Y/D65Y) > CIEEpsilon) + *L=(double) (116.0*pow(Y/D65Y,1.0/3.0)-16.0); + else + *L=CIEK*(Y/D65Y); + alpha=PerceptibleReciprocal(X+15.0*Y+3.0*Z); + *u=13.0*(*L)*((4.0*alpha*X)-(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))); + *v=13.0*(*L)*((9.0*alpha*Y)-(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z))); + *L/=100.0; + *u=(*u+134.0)/354.0; + *v=(*v+140.0)/262.0; +} + +static void ConvertRGBToLuv(const double red,const double green, + const double blue,double *L,double *u,double *v) +{ + double + X, + Y, + Z; + + ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); + ConvertXYZToLuv(X,Y,Z,L,u,v); +} + +static inline void ConvertLuvToXYZ(const double L,const double u,const double v, + double *X,double *Y,double *Z) +{ + if (L > (CIEK*CIEEpsilon)) + *Y=(double) pow((L+16.0)/116.0,3.0); + else + *Y=L/CIEK; + *X=((*Y*((39.0*L/(v+13.0*L*(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z))))-5.0))+ + 5.0*(*Y))/((((52.0f*L/(u+13.0*L*(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))))-1.0)/ + 3.0)-(-1.0/3.0)); + *Z=(*X*(((52.0f*L/(u+13.0*L*(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))))-1.0)/3.0))- + 5.0*(*Y); +} + +static inline void ConvertLuvToRGB(const double L,const double u, + const double v,Quantum *red,Quantum *green,Quantum *blue) +{ + double + X, + Y, + Z; + + ConvertLuvToXYZ(100.0*L,354.0*u-134.0,262.0*v-140.0,&X,&Y,&Z); + ConvertXYZToRGB(X,Y,Z,red,green,blue); +} + +static void ConvertRGBToYDbDr(const double red,const double green, + const double blue,double *Y,double *Db,double *Dr) +{ + *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue); + *Db=QuantumScale*(-0.450*red-0.883*green+1.333*blue)+0.5; + *Dr=QuantumScale*(-1.333*red+1.116*green+0.217*blue)+0.5; +} + +static void ConvertYDbDrToRGB(const double Y,const double Db,const double Dr, + Quantum *red,Quantum *green,Quantum *blue) +{ + *red=ClampToQuantum(QuantumRange*(Y+9.2303716147657e-05*(Db-0.5)- + 0.52591263066186533*(Dr-0.5))); + *green=ClampToQuantum(QuantumRange*(Y-0.12913289889050927*(Db-0.5)+ + 0.26789932820759876*(Dr-0.5))); + *blue=ClampToQuantum(QuantumRange*(Y+0.66467905997895482*(Db-0.5)- + 7.9202543533108e-05*(Dr-0.5))); +} + +static void ConvertRGBToYIQ(const double red,const double green, + const double blue,double *Y,double *I,double *Q) +{ + *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue); + *I=QuantumScale*(0.595716*red-0.274453*green-0.321263*blue)+0.5; + *Q=QuantumScale*(0.211456*red-0.522591*green+0.311135*blue)+0.5; +} + +static void ConvertYIQToRGB(const double Y,const double I,const double Q, + Quantum *red,Quantum *green,Quantum *blue) +{ + *red=ClampToQuantum(QuantumRange*(Y+0.9562957197589482261*(I-0.5)+ + 0.6210244164652610754*(Q-0.5))); + *green=ClampToQuantum(QuantumRange*(Y-0.2721220993185104464*(I-0.5)- + 0.6473805968256950427*(Q-0.5))); + *blue=ClampToQuantum(QuantumRange*(Y-1.1069890167364901945*(I-0.5)+ + 1.7046149983646481374*(Q-0.5))); +} + +static void ConvertRGBToYUV(const double red,const double green, + const double blue,double *Y,double *U,double *V) +{ + *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue); + *U=QuantumScale*((-0.147)*red-0.289*green+0.436*blue)+0.5; + *V=QuantumScale*(0.615*red-0.515*green-0.100*blue)+0.5; +} + +static void ConvertYUVToRGB(const double Y,const double U,const double V, + Quantum *red,Quantum *green,Quantum *blue) +{ + *red=ClampToQuantum(QuantumRange*(Y-3.945707070708279e-05*(U-0.5)+ + 1.1398279671717170825*(V-0.5))); + *green=ClampToQuantum(QuantumRange*(Y-0.3946101641414141437*(U-0.5)- + 0.5805003156565656797*(V-0.5))); + *blue=ClampToQuantum(QuantumRange*(Y+2.0319996843434342537*(U-0.5)- + 4.813762626262513e-04*(V-0.5))); +} + +static MagickBooleanType ValidateHSIToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," HSIToRGB"); + ConvertHSIToRGB(111.244375/360.0,0.295985,0.658734,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToHSI() +{ + double + h, + i, + s; + + (void) FormatLocaleFile(stdout," RGBToHSI"); + ConvertRGBToHSI(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&h,&s,&i); + if ((fabs(h-111.244374/360.0) >= ReferenceEpsilon) || + (fabs(s-0.295985) >= ReferenceEpsilon) || + (fabs(i-0.658734) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateHSLToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," HSLToRGB"); + ConvertHSLToRGB(110.200859/360.0,0.882623,0.715163,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToHSL() +{ + double + h, + l, + s; + + (void) FormatLocaleFile(stdout," RGBToHSL"); + ConvertRGBToHSL(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&h,&s,&l); + if ((fabs(h-110.200859/360.0) >= ReferenceEpsilon) || + (fabs(s-0.882623) >= ReferenceEpsilon) || + (fabs(l-0.715163) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateHSVToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," HSVToRGB"); + ConvertHSVToRGB(110.200859/360.0,0.520200,0.966567,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToHSV() +{ + double + h, + s, + v; + + (void) FormatLocaleFile(stdout," RGBToHSV"); + ConvertRGBToHSV(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&h,&s,&v); + if ((fabs(h-110.200859/360.0) >= ReferenceEpsilon) || + (fabs(s-0.520200) >= ReferenceEpsilon) || + (fabs(v-0.966567) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToJPEGYCbCr() +{ + double + Cb, + Cr, + Y; + + (void) FormatLocaleFile(stdout," RGBToJPEGYCbCr"); + ConvertRGBToYCbCr(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&Y,&Cb,&Cr); + if ((fabs(Y-0.783460) >= ReferenceEpsilon) || + (fabs(Cb-0.319581) >= ReferenceEpsilon) || + (fabs(Cr-0.330539) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateJPEGYCbCrToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," JPEGYCbCrToRGB"); + ConvertYCbCrToRGB(0.783460,0.319581,0.330539,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateLabToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," LabToRGB"); + ConvertLabToRGB(88.456154/100.0,-54.671483/255+0.5,51.662818/255.0+0.5, + &r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToLab() +{ + double + a, + b, + L; + + (void) FormatLocaleFile(stdout," RGBToLab"); + ConvertRGBToLab(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&L,&a,&b); + if ((fabs(L-(88.456154/100.0)) >= ReferenceEpsilon) || + (fabs(a-(-54.671483/255.0+0.5)) >= ReferenceEpsilon) || + (fabs(b-(51.662818/255.0+0.5)) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateLchToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," LchToRGB"); + ConvertLCHabToRGB(88.456154/100.0,75.219797/255.0+0.5,136.620717/360.0, + &r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToLch() +{ + double + c, + h, + L; + + (void) FormatLocaleFile(stdout," RGBToLch"); + ConvertRGBToLCHab(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&L,&c,&h); + if ((fabs(L-88.456154/100.0) >= ReferenceEpsilon) || + (fabs(c-(75.219797/255.0+0.5)) >= ReferenceEpsilon) || + (fabs(h-(136.620717/255.0+0.5)) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToLMS() +{ + double + L, + M, + S; + + (void) FormatLocaleFile(stdout," RGBToLMS"); + ConvertRGBToLMS(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&L,&M,&S); + if ((fabs(L-0.611749) >= ReferenceEpsilon) || + (fabs(M-0.910088) >= ReferenceEpsilon) || + (fabs(S-0.294880) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateLMSToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," LMSToRGB"); + ConvertLMSToRGB(0.611749,0.910088,0.294880,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToLuv() +{ + double + L, + u, + v; + + (void) FormatLocaleFile(stdout," RGBToLuv"); + ConvertRGBToLuv(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&L,&u,&v); + if ((fabs(L-88.456154/262.0) >= ReferenceEpsilon) || + (fabs(u-(-51.330414+134.0)/354.0) >= ReferenceEpsilon) || + (fabs(v-(76.405526+140.0)/262.0) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateLuvToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," LuvToRGB"); + ConvertLuvToRGB(88.456154/100.0,(-51.330414+134.0)/354.0, + (76.405526+140.0)/262.0,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToXYZ() +{ + double + x, + y, + z; + + (void) FormatLocaleFile(stdout," RGBToXYZ"); + ConvertRGBToXYZ(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&x,&y,&z); + if ((fabs(x-0.470646) >= ReferenceEpsilon) || + (fabs(y-0.730178) >= ReferenceEpsilon) || + (fabs(z-0.288324) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateXYZToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," XYZToRGB"); + ConvertXYZToRGB(0.470646,0.730178,0.288324,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateYDbDrToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," YDbDrToRGB"); + ConvertYDbDrToRGB(0.783460,-0.480932+0.5,0.451670+0.5,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToYDbDr() +{ + double + Db, + Dr, + Y; + + (void) FormatLocaleFile(stdout," RGBToYDbDr"); + ConvertRGBToYDbDr(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&Y,&Db,&Dr); + if ((fabs(Y-0.783460) >= ReferenceEpsilon) || + (fabs(Db-(-0.480932)) >= ReferenceEpsilon) || + (fabs(Dr-0.451670) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToYIQ() +{ + double + i, + q, + y; + + (void) FormatLocaleFile(stdout," RGBToYIQ"); + ConvertRGBToYIQ(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&y,&i,&q); + if ((fabs(y-0.783460) >= ReferenceEpsilon) || + (fabs(i-(-0.089078)) >= ReferenceEpsilon) || + (fabs(q-(-0.245399)) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateYIQToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," YIQToRGB"); + ConvertYIQToRGB(0.783460,-0.089078+0.5,-0.245399+0.5,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToYPbPr() +{ + double + Pb, + Pr, + Y; + + (void) FormatLocaleFile(stdout," RGBToYPbPr"); + ConvertRGBToYPbPr(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&Y,&Pb,&Pr); + if ((fabs(Y-0.783460) >= ReferenceEpsilon) || + (fabs(Pb-(-0.180419)) >= ReferenceEpsilon) || + (fabs(Pr-(-0.169461)) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateYPbPrToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," YPbPrToRGB"); + ConvertYPbPrToRGB(0.783460,-0.180419+0.5,-0.169461+0.5,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateRGBToYUV() +{ + double + U, + V, + Y; + + (void) FormatLocaleFile(stdout," RGBToYUV"); + ConvertRGBToYUV(0.545877*QuantumRange,0.966567*QuantumRange, + 0.463759*QuantumRange,&Y,&U,&V); + if ((fabs(Y-0.783460) >= ReferenceEpsilon) || + (fabs(U-(-0.157383)) >= ReferenceEpsilon) || + (fabs(V-(-0.208443)) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType ValidateYUVToRGB() +{ + Quantum + b, + g, + r; + + (void) FormatLocaleFile(stdout," YUVToRGB"); + ConvertYUVToRGB(0.783460,-0.157383+0.5,-0.208443+0.5,&r,&g,&b); + if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || + (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || + (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) + return(MagickFalse); + return(MagickTrue); +} + +static size_t ValidateColorspaces(ImageInfo *image_info,size_t *fails, + ExceptionInfo *exception) +{ + MagickBooleanType + status; + + size_t + fail, + test; + + /* + Reference: https://code.google.com/p/chroma. + + Illuminant = D65 + Observer = 2° (1931) + + XYZ 0.470645, 0.730177, 0.288323 + sRGB 0.545877, 0.966567, 0.463759 + CAT02 LMS 0.611749, 0.910088, 0.294880 + Y'DbDr 0.783460, -0.480932, 0.451670 + Y'IQ 0.783460, -0.089078, -0.245399 + Y'PbPr 0.783460, -0.180419, -0.169461 + Y'UV 0.783460, -0.157383, -0.208443 + JPEG-Y'CbCr 0.783460, 0.319581, 0.330539 + L*u*v* 88.456154, -51.330414, 76.405526 + L*a*b* 88.456154, -54.671483, 51.662818 + L*C*H* 88.456154, 75.219797, 136.620717 + HSV 110.200859, 0.520200, 0.966567 + HSL 110.200859, 0.882623, 0.715163 + HSI 111.244375, 0.295985, 0.658734 + Y'CbCr 187.577791, 87.586330, 90.040886 + */ + (void) FormatLocaleFile(stdout,"validate colorspaces:\n"); + fail=0; + for (test=0; test < 26; test++) + { + CatchException(exception); + (void) FormatLocaleFile(stdout," test %.20g: ",(double) test); + switch (test) + { + case 0: status=ValidateHSIToRGB(); break; + case 1: status=ValidateRGBToHSI(); break; + case 2: status=ValidateHSLToRGB(); break; + case 3: status=ValidateRGBToHSL(); break; + case 4: status=ValidateHSVToRGB(); break; + case 5: status=ValidateRGBToHSV(); break; + case 6: status=ValidateJPEGYCbCrToRGB(); break; + case 7: status=ValidateRGBToJPEGYCbCr(); break; + case 8: status=ValidateLabToRGB(); break; + case 9: status=ValidateRGBToLab(); break; + case 10: status=ValidateLchToRGB(); break; + case 11: status=ValidateRGBToLch(); break; + case 12: status=ValidateLMSToRGB(); break; + case 13: status=ValidateRGBToLMS(); break; + case 14: status=ValidateLuvToRGB(); break; + case 15: status=ValidateRGBToLuv(); break; + case 16: status=ValidateXYZToRGB(); break; + case 17: status=ValidateRGBToXYZ(); break; + case 18: status=ValidateYDbDrToRGB(); break; + case 19: status=ValidateRGBToYDbDr(); break; + case 20: status=ValidateYIQToRGB(); break; + case 21: status=ValidateRGBToYIQ(); break; + case 22: status=ValidateYPbPrToRGB(); break; + case 23: status=ValidateRGBToYPbPr(); break; + case 24: status=ValidateYUVToRGB(); break; + case 25: status=ValidateRGBToYUV(); break; + default: status=MagickFalse; + } + if (status == MagickFalse) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + (void) FormatLocaleFile(stdout,"... pass.\n"); + } + (void) FormatLocaleFile(stdout, + " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, + (double) (test-fail),(double) fail); + fails+=fail; + return(test); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V a l i d a t e C o m p a r e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ValidateCompareCommand() validates the ImageMagick compare command line +% program and returns the number of validation tests that passed and failed. +% +% The format of the ValidateCompareCommand method is: +% +% size_t ValidateCompareCommand(ImageInfo *image_info, +% const char *reference_filename,const char *output_filename, +% size_t *fails,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o reference_filename: the reference image filename. +% +% o output_filename: the output image filename. +% +% o fail: return the number of validation tests that pass. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static size_t ValidateCompareCommand(ImageInfo *image_info, + const char *reference_filename,const char *output_filename,size_t *fails, + ExceptionInfo *exception) +{ + char + **arguments, + command[MaxTextExtent]; + + int + number_arguments; + + MagickBooleanType + status; + + ssize_t + i, + j; + + size_t + fail, + test; + + fail=0; + test=0; + (void) FormatLocaleFile(stdout,"validate compare command line program:\n"); + for (i=0; compare_options[i] != (char *) NULL; i++) + { + CatchException(exception); + (void) FormatLocaleFile(stdout," test %.20g: %s",(double) (test++), + compare_options[i]); + (void) FormatLocaleString(command,MaxTextExtent,"%s %s %s %s", + compare_options[i],reference_filename,reference_filename,output_filename); + arguments=StringToArgv(command,&number_arguments); + if (arguments == (char **) NULL) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + status=CompareImageCommand(image_info,number_arguments,arguments, + (char **) NULL,exception); + for (j=0; j < (ssize_t) number_arguments; j++) + arguments[j]=DestroyString(arguments[j]); + arguments=(char **) RelinquishMagickMemory(arguments); + if (status == MagickFalse) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + (void) FormatLocaleFile(stdout,"... pass.\n"); + } + (void) FormatLocaleFile(stdout, + " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, + (double) (test-fail),(double) fail); + fails+=fail; + return(test); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V a l i d a t e C o m p o s i t e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ValidateCompositeCommand() validates the ImageMagick composite command line +% program and returns the number of validation tests that passed and failed. +% +% The format of the ValidateCompositeCommand method is: +% +% size_t ValidateCompositeCommand(ImageInfo *image_info, +% const char *reference_filename,const char *output_filename, +% size_t *fails,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o reference_filename: the reference image filename. +% +% o output_filename: the output image filename. +% +% o fail: return the number of validation tests that pass. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static size_t ValidateCompositeCommand(ImageInfo *image_info, + const char *reference_filename,const char *output_filename,size_t *fails, + ExceptionInfo *exception) +{ + char + **arguments, + command[MaxTextExtent]; + + int + number_arguments; + + MagickBooleanType + status; + + ssize_t + i, + j; + + size_t + fail, + test; + + fail=0; + test=0; + (void) FormatLocaleFile(stdout,"validate composite command line program:\n"); + for (i=0; composite_options[i] != (char *) NULL; i++) + { + CatchException(exception); + (void) FormatLocaleFile(stdout," test %.20g: %s",(double) (test++), + composite_options[i]); + (void) FormatLocaleString(command,MaxTextExtent,"%s %s %s %s", + reference_filename,composite_options[i],reference_filename, + output_filename); + arguments=StringToArgv(command,&number_arguments); + if (arguments == (char **) NULL) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + status=CompositeImageCommand(image_info,number_arguments,arguments, + (char **) NULL,exception); + for (j=0; j < (ssize_t) number_arguments; j++) + arguments[j]=DestroyString(arguments[j]); + arguments=(char **) RelinquishMagickMemory(arguments); + if (status == MagickFalse) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + (void) FormatLocaleFile(stdout,"... pass.\n"); + } + (void) FormatLocaleFile(stdout, + " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, + (double) (test-fail),(double) fail); + fails+=fail; + return(test); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V a l i d a t e C o n v e r t C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ValidateConvertCommand() validates the ImageMagick convert command line +% program and returns the number of validation tests that passed and failed. +% +% The format of the ValidateConvertCommand method is: +% +% size_t ValidateConvertCommand(ImageInfo *image_info, +% const char *reference_filename,const char *output_filename, +% size_t *fails,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o reference_filename: the reference image filename. +% +% o output_filename: the output image filename. +% +% o fail: return the number of validation tests that pass. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static size_t ValidateConvertCommand(ImageInfo *image_info, + const char *reference_filename,const char *output_filename,size_t *fails, + ExceptionInfo *exception) +{ + char + **arguments, + command[MaxTextExtent]; + + int + number_arguments; + + MagickBooleanType + status; + + ssize_t + i, + j; + + size_t + fail, + test; + + fail=0; + test=0; + (void) FormatLocaleFile(stdout,"validate convert command line program:\n"); + for (i=0; convert_options[i] != (char *) NULL; i++) + { + CatchException(exception); + (void) FormatLocaleFile(stdout," test %.20g: %s",(double) test++, + convert_options[i]); + (void) FormatLocaleString(command,MaxTextExtent,"%s %s %s %s", + reference_filename,convert_options[i],reference_filename,output_filename); + arguments=StringToArgv(command,&number_arguments); + if (arguments == (char **) NULL) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + status=ConvertImageCommand(image_info,number_arguments,arguments, + (char **) NULL,exception); + for (j=0; j < (ssize_t) number_arguments; j++) + arguments[j]=DestroyString(arguments[j]); + arguments=(char **) RelinquishMagickMemory(arguments); + if (status == MagickFalse) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + (void) LogMagickEvent(ExceptionEvent,GetMagickModule(), + "%s",exception->reason); + fail++; + continue; + } + (void) FormatLocaleFile(stdout,"... pass.\n"); + } + (void) FormatLocaleFile(stdout, + " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, + (double) (test-fail),(double) fail); + fails+=fail; + return(test); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V a l i d a t e I d e n t i f y C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ValidateIdentifyCommand() validates the ImageMagick identify command line +% program and returns the number of validation tests that passed and failed. +% +% The format of the ValidateIdentifyCommand method is: +% +% size_t ValidateIdentifyCommand(ImageInfo *image_info, +% const char *reference_filename,const char *output_filename, +% size_t *fails,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o reference_filename: the reference image filename. +% +% o output_filename: the output image filename. +% +% o fail: return the number of validation tests that pass. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static size_t ValidateIdentifyCommand(ImageInfo *image_info, + const char *reference_filename,const char *output_filename,size_t *fails, + ExceptionInfo *exception) +{ + char + **arguments, + command[MaxTextExtent]; + + int + number_arguments; + + MagickBooleanType + status; + + ssize_t + i, + j; + + size_t + fail, + test; + + (void) output_filename; + fail=0; + test=0; + (void) FormatLocaleFile(stdout,"validate identify command line program:\n"); + for (i=0; identify_options[i] != (char *) NULL; i++) + { + CatchException(exception); + (void) FormatLocaleFile(stdout," test %.20g: %s",(double) test++, + identify_options[i]); + (void) FormatLocaleString(command,MaxTextExtent,"%s %s", + identify_options[i],reference_filename); + arguments=StringToArgv(command,&number_arguments); + if (arguments == (char **) NULL) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + status=IdentifyImageCommand(image_info,number_arguments,arguments, + (char **) NULL,exception); + for (j=0; j < (ssize_t) number_arguments; j++) + arguments[j]=DestroyString(arguments[j]); + arguments=(char **) RelinquishMagickMemory(arguments); + if (status == MagickFalse) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + (void) FormatLocaleFile(stdout,"... pass.\n"); + } + (void) FormatLocaleFile(stdout, + " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, + (double) (test-fail),(double) fail); + fails+=fail; + return(test); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% 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 % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ValidateImageFormatsInMemory() validates the ImageMagick image formats in +% memory and returns the number of validation tests that passed and failed. +% +% The format of the ValidateImageFormatsInMemory method is: +% +% size_t ValidateImageFormatsInMemory(ImageInfo *image_info, +% const char *reference_filename,const char *output_filename, +% size_t *fails,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o reference_filename: the reference image filename. +% +% o output_filename: the output image filename. +% +% o fail: return the number of validation tests that pass. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +/* + Enable this to count remaining $TMPDIR/magick-* files. Note that the count + includes any files left over from other runs. +*/ +#undef MagickCountTempFiles + +static size_t ValidateImageFormatsInMemory(ImageInfo *image_info, + const char *reference_filename,const char *output_filename,size_t *fails, + ExceptionInfo *exception) +{ + char +#ifdef MagickCountTempFiles + path[MaxTextExtent], + SystemCommand[MaxTextExtent], +#endif + size[MaxTextExtent]; + + const MagickInfo + *magick_info; + + double + distortion, + fuzz; + + Image + *difference_image, + *ping_image, + *reference_image, + *reconstruct_image; + + MagickBooleanType + status; + + ssize_t + i, + j; + + size_t + length; + + unsigned char + *blob; + + size_t + fail, + test; + + fail=0; + test=0; + (void) FormatLocaleFile(stdout,"validate image formats in memory:\n"); +#ifdef MagickCountTempFiles + (void) GetPathTemplate(path); + /* Remove file template except for the leading "/path/to/magick-" */ + path[strlen(path)-17]='\0'; + (void) FormatLocaleFile(stdout," tmp path is '%s*'\n",path); +#endif + for (i=0; reference_formats[i].magick != (char *) NULL; i++) + { + magick_info=GetMagickInfo(reference_formats[i].magick,exception); + if ((magick_info == (const MagickInfo *) NULL) || + (magick_info->decoder == (DecodeImageHandler *) NULL) || + (magick_info->encoder == (EncodeImageHandler *) NULL)) + continue; + for (j=0; reference_types[j].type != UndefinedType; j++) + { + /* + Generate reference image. + */ + CatchException(exception); + (void) FormatLocaleFile(stdout," test %.20g: %s/%s/%s/%.20g-bits", + (double) (test++),reference_formats[i].magick,CommandOptionToMnemonic( + MagickCompressOptions,reference_formats[i].compression), + CommandOptionToMnemonic(MagickTypeOptions,reference_types[j].type), + (double) reference_types[j].depth); + (void) CopyMagickString(image_info->filename,reference_filename, + MaxTextExtent); + reference_image=ReadImage(image_info,exception); + if ((reference_image == (Image *) NULL) || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + continue; + } + /* + Write reference image. + */ + (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g", + (double) reference_image->columns,(double) reference_image->rows); + (void) CloneString(&image_info->size,size); + image_info->depth=reference_types[j].depth; + (void) FormatLocaleString(reference_image->filename,MaxTextExtent,"%s:%s", + reference_formats[i].magick,output_filename); + status=SetImageType(reference_image,reference_types[j].type); + InheritException(exception,&reference_image->exception); + if (status == MagickFalse || (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + reference_image=DestroyImage(reference_image); + continue; + } + status=SetImageDepth(reference_image,reference_types[j].depth); + InheritException(exception,&reference_image->exception); + if (status == MagickFalse || (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + reference_image=DestroyImage(reference_image); + continue; + } + reference_image->compression=reference_formats[i].compression; + status=WriteImage(image_info,reference_image); + InheritException(exception,&reference_image->exception); + reference_image=DestroyImage(reference_image); + if (status == MagickFalse || (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + if (exception->reason != (char *) NULL) + (void) FormatLocaleFile(stdout," reason:%s\n",exception->reason); + CatchException(exception); + fail++; + continue; + } + /* + Ping reference image. + */ + (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s:%s", + reference_formats[i].magick,output_filename); + ping_image=PingImage(image_info,exception); + if (ping_image == (Image *) NULL || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + if (exception->reason != (char *) NULL) + (void) FormatLocaleFile(stdout," reason:%s\n",exception->reason); + CatchException(exception); + fail++; + continue; + } + ping_image=DestroyImage(ping_image); + /* + Read reference image. + */ + (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s:%s", + reference_formats[i].magick,output_filename); + reference_image=ReadImage(image_info,exception); + if ((reference_image == (Image *) NULL) || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + if (exception->reason != (char *) NULL) + (void) FormatLocaleFile(stdout," reason:%s\n",exception->reason); + CatchException(exception); + fail++; + continue; + } + /* + Write reference image. + */ + (void) FormatLocaleString(reference_image->filename,MaxTextExtent,"%s:%s", + reference_formats[i].magick,output_filename); + (void) CopyMagickString(image_info->magick,reference_formats[i].magick, + MaxTextExtent); + reference_image->depth=reference_types[j].depth; + reference_image->compression=reference_formats[i].compression; + length=8192; + blob=(unsigned char *) ImageToBlob(image_info,reference_image,&length, + exception); + if ((blob == (unsigned char *) NULL) || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + if (exception->reason != (char *) NULL) + (void) FormatLocaleFile(stdout," reason:%s\n",exception->reason); + CatchException(exception); + fail++; + reference_image=DestroyImage(reference_image); + continue; + } + /* + Ping reference blob. + */ + ping_image=PingBlob(image_info,blob,length,exception); + if (ping_image == (Image *) NULL || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + if (exception->reason != (char *) NULL) + (void) FormatLocaleFile(stdout," reason:%s\n",exception->reason); + CatchException(exception); + fail++; + blob=(unsigned char *) RelinquishMagickMemory(blob); + continue; + } + ping_image=DestroyImage(ping_image); + /* + Read reconstruct image. + */ + (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s:%s", + reference_formats[i].magick,output_filename); + reconstruct_image=BlobToImage(image_info,blob,length,exception); + blob=(unsigned char *) RelinquishMagickMemory(blob); + if (reconstruct_image == (Image *) NULL || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + if (exception->reason != (char *) NULL) + (void) FormatLocaleFile(stdout," reason:%s\n",exception->reason); + CatchException(exception); + fail++; + reference_image=DestroyImage(reference_image); + continue; + } + /* + Compare reference to reconstruct image. + */ + fuzz=0.003; /* grayscale */ + if (reference_formats[i].fuzz != 0.0) + fuzz=reference_formats[i].fuzz; + difference_image=CompareImageChannels(reference_image,reconstruct_image, + CompositeChannels,RootMeanSquaredErrorMetric,&distortion,exception); + reconstruct_image=DestroyImage(reconstruct_image); + reference_image=DestroyImage(reference_image); + if (difference_image == (Image *) NULL || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + if (exception->reason != (char *) NULL) + (void) FormatLocaleFile(stdout," reason:%s\n",exception->reason); + CatchException(exception); + fail++; + continue; + } + difference_image=DestroyImage(difference_image); + if ((QuantumScale*distortion) > fuzz) + { + (void) FormatLocaleFile(stdout,"... fail (with distortion %g).\n", + QuantumScale*distortion); + fail++; + continue; + } + +#ifdef MagickCountTempFiles + (void) FormatLocaleFile(stdout,"... pass, "); + (void) fflush(stdout); + SystemCommand[0]='\0'; + (void) strncat(SystemCommand,"echo `ls ",9); + (void) strncat(SystemCommand,path,MaxTextExtent-31); + (void) strncat(SystemCommand,"* | wc -w` tmp files.",20); + (void) system(SystemCommand); + (void) fflush(stdout); +#else + (void) FormatLocaleFile(stdout,"... pass\n"); +#endif + } + } + (void) FormatLocaleFile(stdout, + " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, + (double) (test-fail),(double) fail); + fails+=fail; + return(test); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% 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 % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ValidateImageFormatsOnDisk() validates the ImageMagick image formats on disk +% and returns the number of validation tests that passed and failed. +% +% The format of the ValidateImageFormatsOnDisk method is: +% +% size_t ValidateImageFormatsOnDisk(ImageInfo *image_info, +% const char *reference_filename,const char *output_filename, +% size_t *fails,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o reference_filename: the reference image filename. +% +% o output_filename: the output image filename. +% +% o fail: return the number of validation tests that pass. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static size_t ValidateImageFormatsOnDisk(ImageInfo *image_info, + const char *reference_filename,const char *output_filename,size_t *fails, + ExceptionInfo *exception) +{ + char + size[MaxTextExtent]; + + const MagickInfo + *magick_info; + + double + distortion, + fuzz; + + Image + *difference_image, + *reference_image, + *reconstruct_image; + + MagickBooleanType + status; + + ssize_t + i, + j; + + size_t + fail, + test; + + fail=0; + test=0; + (void) FormatLocaleFile(stdout,"validate image formats on disk:\n"); + for (i=0; reference_formats[i].magick != (char *) NULL; i++) + { + magick_info=GetMagickInfo(reference_formats[i].magick,exception); + if ((magick_info == (const MagickInfo *) NULL) || + (magick_info->decoder == (DecodeImageHandler *) NULL) || + (magick_info->encoder == (EncodeImageHandler *) NULL)) + continue; + for (j=0; reference_types[j].type != UndefinedType; j++) + { + /* + Generate reference image. + */ + CatchException(exception); + (void) FormatLocaleFile(stdout," test %.20g: %s/%s/%s/%.20g-bits", + (double) (test++),reference_formats[i].magick,CommandOptionToMnemonic( + MagickCompressOptions,reference_formats[i].compression), + CommandOptionToMnemonic(MagickTypeOptions,reference_types[j].type), + (double) reference_types[j].depth); + (void) CopyMagickString(image_info->filename,reference_filename, + MaxTextExtent); + reference_image=ReadImage(image_info,exception); + if ((reference_image == (Image *) NULL) || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + continue; + } + /* + Write reference image. + */ + (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g", + (double) reference_image->columns,(double) reference_image->rows); + (void) CloneString(&image_info->size,size); + image_info->depth=reference_types[j].depth; + (void) FormatLocaleString(reference_image->filename,MaxTextExtent,"%s:%s", + reference_formats[i].magick,output_filename); + status=SetImageType(reference_image,reference_types[j].type); + InheritException(exception,&reference_image->exception); + if (status == MagickFalse || (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + reference_image=DestroyImage(reference_image); + continue; + } + status=SetImageDepth(reference_image,reference_types[j].depth); + InheritException(exception,&reference_image->exception); + if (status == MagickFalse || (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + reference_image=DestroyImage(reference_image); + continue; + } + reference_image->compression=reference_formats[i].compression; + status=WriteImage(image_info,reference_image); + InheritException(exception,&reference_image->exception); + reference_image=DestroyImage(reference_image); + if (status == MagickFalse || (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + continue; + } + /* + Read reference image. + */ + (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s:%s", + reference_formats[i].magick,output_filename); + reference_image=ReadImage(image_info,exception); + if ((reference_image == (Image *) NULL) || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + continue; + } + /* + Write reference image. + */ + (void) FormatLocaleString(reference_image->filename,MaxTextExtent,"%s:%s", + reference_formats[i].magick,output_filename); + reference_image->depth=reference_types[j].depth; + reference_image->compression=reference_formats[i].compression; + status=WriteImage(image_info,reference_image); + InheritException(exception,&reference_image->exception); + if (status == MagickFalse || (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + reference_image=DestroyImage(reference_image); + continue; + } + /* + Read reconstruct image. + */ + (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s:%s", + reference_formats[i].magick,output_filename); + reconstruct_image=ReadImage(image_info,exception); + if (reconstruct_image == (Image *) NULL || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + reference_image=DestroyImage(reference_image); + continue; + } + /* + Compare reference to reconstruct image. + */ + fuzz=0.003; /* grayscale */ + if (reference_formats[i].fuzz != 0.0) + fuzz=reference_formats[i].fuzz; + difference_image=CompareImageChannels(reference_image,reconstruct_image, + CompositeChannels,RootMeanSquaredErrorMetric,&distortion,exception); + reconstruct_image=DestroyImage(reconstruct_image); + reference_image=DestroyImage(reference_image); + if (difference_image == (Image *) NULL || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + continue; + } + difference_image=DestroyImage(difference_image); + if ((QuantumScale*distortion) > fuzz) + { + (void) FormatLocaleFile(stdout,"... fail (with distortion %g).\n", + QuantumScale*distortion); + fail++; + continue; + } + (void) FormatLocaleFile(stdout,"... pass.\n"); + } + } + (void) FormatLocaleFile(stdout, + " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, + (double) (test-fail),(double) fail); + fails+=fail; + return(test); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% 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 % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ValidateImportExportPixels() validates the pixel import and export methods. +% It returns the number of validation tests that passed and failed. +% +% The format of the ValidateImportExportPixels method is: +% +% size_t ValidateImportExportPixels(ImageInfo *image_info, +% const char *reference_filename,const char *output_filename, +% size_t *fails,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o reference_filename: the reference image filename. +% +% o output_filename: the output image filename. +% +% o fail: return the number of validation tests that pass. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static size_t ValidateImportExportPixels(ImageInfo *image_info, + const char *reference_filename,const char *output_filename,size_t *fails, + ExceptionInfo *exception) +{ + double + distortion; + + Image + *difference_image, + *reference_image, + *reconstruct_image; + + MagickBooleanType + status; + + ssize_t + i, + j; + + size_t + length; + + unsigned char + *pixels; + + size_t + fail, + test; + + (void) output_filename; + fail=0; + test=0; + (void) FormatLocaleFile(stdout, + "validate the import and export of image pixels:\n"); + for (i=0; reference_map[i] != (char *) NULL; i++) + { + for (j=0; reference_storage[j].type != UndefinedPixel; j++) + { + /* + Generate reference image. + */ + CatchException(exception); + (void) FormatLocaleFile(stdout," test %.20g: %s/%s",(double) (test++), + reference_map[i],CommandOptionToMnemonic(MagickStorageOptions, + reference_storage[j].type)); + (void) CopyMagickString(image_info->filename,reference_filename, + MaxTextExtent); + reference_image=ReadImage(image_info,exception); + if ((reference_image == (Image *) NULL) || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + continue; + } + if (LocaleNCompare(reference_map[i],"cmy",3) == 0) + { + (void) TransformImageColorspace(reference_image,CMYKColorspace); + InheritException(exception,&reference_image->exception); + } + length=strlen(reference_map[i])*reference_image->columns* + reference_image->rows*reference_storage[j].quantum; + pixels=(unsigned char *) AcquireQuantumMemory(length,sizeof(*pixels)); + if ((pixels == (unsigned char *) NULL) || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + reference_image=DestroyImage(reference_image); + continue; + } + (void) memset(pixels,0,length*sizeof(*pixels)); + status=ExportImagePixels(reference_image,0,0,reference_image->columns, + reference_image->rows,reference_map[i],reference_storage[j].type,pixels, + exception); + if (status == MagickFalse || (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + reference_image=DestroyImage(reference_image); + continue; + } + (void) SetImageBackgroundColor(reference_image); + status=ImportImagePixels(reference_image,0,0,reference_image->columns, + reference_image->rows,reference_map[i],reference_storage[j].type, + pixels); + InheritException(exception,&reference_image->exception); + if (status == MagickFalse || (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + reference_image=DestroyImage(reference_image); + continue; + } + /* + Read reconstruct image. + */ + reconstruct_image=AcquireImage(image_info); + (void) SetImageExtent(reconstruct_image,reference_image->columns, + reference_image->rows); + (void) SetImageColorspace(reconstruct_image,reference_image->colorspace); + (void) SetImageBackgroundColor(reconstruct_image); + status=ImportImagePixels(reconstruct_image,0,0,reconstruct_image->columns, + reconstruct_image->rows,reference_map[i],reference_storage[j].type, + pixels); + InheritException(exception,&reconstruct_image->exception); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (status == MagickFalse || (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + reference_image=DestroyImage(reference_image); + continue; + } + /* + Compare reference to reconstruct image. + */ + difference_image=CompareImageChannels(reference_image,reconstruct_image, + CompositeChannels,RootMeanSquaredErrorMetric,&distortion,exception); + reconstruct_image=DestroyImage(reconstruct_image); + reference_image=DestroyImage(reference_image); + if (difference_image == (Image *) NULL || + (exception->severity >= ErrorException)) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + CatchException(exception); + fail++; + continue; + } + difference_image=DestroyImage(difference_image); + if ((QuantumScale*distortion) > 0.0) + { + (void) FormatLocaleFile(stdout,"... fail (with distortion %g).\n", + QuantumScale*distortion); + fail++; + continue; + } + (void) FormatLocaleFile(stdout,"... pass.\n"); + } + } + (void) FormatLocaleFile(stdout, + " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, + (double) (test-fail),(double) fail); + fails+=fail; + return(test); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V a l i d a t e M o n t a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ValidateMontageCommand() validates the ImageMagick montage command line +% program and returns the number of validation tests that passed and failed. +% +% The format of the ValidateMontageCommand method is: +% +% size_t ValidateMontageCommand(ImageInfo *image_info, +% const char *reference_filename,const char *output_filename, +% size_t *fails,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o reference_filename: the reference image filename. +% +% o output_filename: the output image filename. +% +% o fail: return the number of validation tests that pass. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static size_t ValidateMontageCommand(ImageInfo *image_info, + const char *reference_filename,const char *output_filename,size_t *fails, + ExceptionInfo *exception) +{ + char + **arguments, + command[MaxTextExtent]; + + int + number_arguments; + + MagickBooleanType + status; + + ssize_t + i, + j; + + size_t + fail, + test; + + fail=0; + test=0; + (void) FormatLocaleFile(stdout,"validate montage command line program:\n"); + for (i=0; montage_options[i] != (char *) NULL; i++) + { + CatchException(exception); + (void) FormatLocaleFile(stdout," test %.20g: %s",(double) (test++), + montage_options[i]); + (void) FormatLocaleString(command,MaxTextExtent,"%s %s %s %s", + reference_filename,montage_options[i],reference_filename, + output_filename); + arguments=StringToArgv(command,&number_arguments); + if (arguments == (char **) NULL) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + status=MontageImageCommand(image_info,number_arguments,arguments, + (char **) NULL,exception); + for (j=0; j < (ssize_t) number_arguments; j++) + arguments[j]=DestroyString(arguments[j]); + arguments=(char **) RelinquishMagickMemory(arguments); + if (status == MagickFalse) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + (void) FormatLocaleFile(stdout,"... pass.\n"); + } + (void) FormatLocaleFile(stdout, + " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, + (double) (test-fail),(double) fail); + fails+=fail; + return(test); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% V a l i d a t e S t r e a m C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ValidateStreamCommand() validates the ImageMagick stream command line +% program and returns the number of validation tests that passed and failed. +% +% The format of the ValidateStreamCommand method is: +% +% size_t ValidateStreamCommand(ImageInfo *image_info, +% const char *reference_filename,const char *output_filename, +% size_t *fails,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o reference_filename: the reference image filename. +% +% o output_filename: the output image filename. +% +% o fail: return the number of validation tests that pass. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static size_t ValidateStreamCommand(ImageInfo *image_info, + const char *reference_filename,const char *output_filename,size_t *fails, + ExceptionInfo *exception) +{ + char + **arguments, + command[MaxTextExtent]; + + int + number_arguments; + + MagickBooleanType + status; + + ssize_t + i, + j; + + size_t + fail, + test; + + fail=0; + test=0; + (void) FormatLocaleFile(stdout,"validate stream command line program:\n"); + for (i=0; stream_options[i] != (char *) NULL; i++) + { + CatchException(exception); + (void) FormatLocaleFile(stdout," test %.20g: %s",(double) (test++), + stream_options[i]); + (void) FormatLocaleString(command,MaxTextExtent,"%s %s %s", + stream_options[i],reference_filename,output_filename); + arguments=StringToArgv(command,&number_arguments); + if (arguments == (char **) NULL) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + status=StreamImageCommand(image_info,number_arguments,arguments, + (char **) NULL,exception); + for (j=0; j < (ssize_t) number_arguments; j++) + arguments[j]=DestroyString(arguments[j]); + arguments=(char **) RelinquishMagickMemory(arguments); + if (status == MagickFalse) + { + (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", + GetMagickModule()); + fail++; + continue; + } + (void) FormatLocaleFile(stdout,"... pass.\n"); + } + (void) FormatLocaleFile(stdout, + " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, + (double) (test-fail),(double) fail); + fails+=fail; + return(test); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static MagickBooleanType ValidateUsage(void) +{ + const char + **p; + + static const char + *miscellaneous[]= + { + "-debug events display copious debugging information", + "-help print program options", + "-log format format of debugging information", + "-validate type validation type", + "-version print version information", + (char *) NULL + }, + *settings[]= + { + "-regard-warnings pay attention to warning messages", + "-verbose print detailed information about the image", + (char *) NULL + }; + + (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL)); + (void) printf("Copyright: %s\n\n",GetMagickCopyright()); + (void) printf("Features: %s\n",GetMagickFeatures()); + (void) printf("Usage: %s [options ...] reference-file\n",GetClientName()); + (void) printf("\nValidate Settings:\n"); + for (p=settings; *p != (char *) NULL; p++) + (void) printf(" %s\n",*p); + (void) printf("\nMiscellaneous Options:\n"); + for (p=miscellaneous; *p != (char *) NULL; p++) + (void) printf(" %s\n",*p); + return(MagickTrue); +} + +int main(int argc,char **argv) +{ +#define DestroyValidate() \ +{ \ + image_info=DestroyImageInfo(image_info); \ + exception=DestroyExceptionInfo(exception); \ +} +#define ThrowValidateException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option); \ + CatchException(exception); \ + DestroyValidate(); \ + return(MagickFalse); \ +} + + char + output_filename[MaxTextExtent], + reference_filename[MaxTextExtent], + *option; + + double + elapsed_time, + user_time; + + ExceptionInfo + *exception; + + Image + *reference_image; + + ImageInfo + *image_info; + + MagickBooleanType + regard_warnings, + status; + + MagickSizeType + memory_resource, + map_resource; + + ssize_t + i; + + TimerInfo + *timer; + + size_t + fail, + iterations, + tests; + + ValidateType + type; + + /* + Validate the ImageMagick image processing suite. + */ + MagickCoreGenesis(*argv,MagickTrue); + (void) setlocale(LC_ALL,""); + (void) setlocale(LC_NUMERIC,"C"); + iterations=1; + status=MagickFalse; + type=AllValidate; + regard_warnings=MagickFalse; + (void) regard_warnings; + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + (void) CopyMagickString(image_info->filename,ReferenceFilename,MaxTextExtent); + for (i=1; i < (ssize_t) argc; i++) + { + option=argv[i]; + if (IsCommandOption(option) == MagickFalse) + { + (void) CopyMagickString(image_info->filename,option,MaxTextExtent); + continue; + } + switch (*(option+1)) + { + case 'b': + { + if (LocaleCompare("bench",option+1) == 0) + { + iterations=StringToUnsignedLong(argv[++i]); + break; + } + ThrowValidateException(OptionError,"UnrecognizedOption",option) + } + case 'd': + { + if (LocaleCompare("debug",option+1) == 0) + { + (void) SetLogEventMask(argv[++i]); + break; + } + ThrowValidateException(OptionError,"UnrecognizedOption",option) + } + case 'h': + { + if (LocaleCompare("help",option+1) == 0) + { + (void) ValidateUsage(); + return(0); + } + ThrowValidateException(OptionError,"UnrecognizedOption",option) + } + case 'l': + { + if (LocaleCompare("log",option+1) == 0) + { + if (*option != '+') + (void) SetLogFormat(argv[i+1]); + break; + } + ThrowValidateException(OptionError,"UnrecognizedOption",option) + } + case 'r': + { + if (LocaleCompare("regard-warnings",option+1) == 0) + { + regard_warnings=MagickTrue; + break; + } + ThrowValidateException(OptionError,"UnrecognizedOption",option) + } + case 'v': + { + if (LocaleCompare("validate",option+1) == 0) + { + ssize_t + validate; + + if (*option == '+') + break; + i++; + if (i >= (ssize_t) argc) + ThrowValidateException(OptionError,"MissingArgument",option); + validate=ParseCommandOption(MagickValidateOptions,MagickFalse, + argv[i]); + if (validate < 0) + ThrowValidateException(OptionError,"UnrecognizedValidateType", + argv[i]); + type=(ValidateType) validate; + break; + } + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + (void) FormatLocaleFile(stdout,"Version: %s\n", + GetMagickVersion((size_t *) NULL)); + (void) FormatLocaleFile(stdout,"Copyright: %s\n\n", + GetMagickCopyright()); + (void) FormatLocaleFile(stdout,"Features: %s\n\n", + GetMagickFeatures()); + return(0); + } + ThrowValidateException(OptionError,"UnrecognizedOption",option) + } + default: + ThrowValidateException(OptionError,"UnrecognizedOption",option) + } + } + timer=(TimerInfo *) NULL; + if (iterations > 1) + timer=AcquireTimerInfo(); + reference_image=ReadImage(image_info,exception); + tests=0; + fail=0; + if (reference_image == (Image *) NULL) + fail++; + else + { + if (LocaleCompare(image_info->filename,ReferenceFilename) == 0) + (void) CopyMagickString(reference_image->magick,ReferenceImageFormat, + MaxTextExtent); + (void) AcquireUniqueFilename(reference_filename); + (void) AcquireUniqueFilename(output_filename); + (void) CopyMagickString(reference_image->filename,reference_filename, + MaxTextExtent); + status=WriteImage(image_info,reference_image); + InheritException(exception,&reference_image->exception); + reference_image=DestroyImage(reference_image); + if (status == MagickFalse) + fail++; + else + { + (void) FormatLocaleFile(stdout,"Version: %s\n", + GetMagickVersion((size_t *) NULL)); + (void) FormatLocaleFile(stdout,"Copyright: %s\n\n", + GetMagickCopyright()); + (void) FormatLocaleFile(stdout, + "ImageMagick Validation Suite (%s)\n\n",CommandOptionToMnemonic( + MagickValidateOptions,(ssize_t) type)); + if ((type & ColorspaceValidate) != 0) + tests+=ValidateColorspaces(image_info,&fail,exception); + if ((type & CompareValidate) != 0) + tests+=ValidateCompareCommand(image_info,reference_filename, + output_filename,&fail,exception); + if ((type & CompositeValidate) != 0) + tests+=ValidateCompositeCommand(image_info,reference_filename, + output_filename,&fail,exception); + if ((type & ConvertValidate) != 0) + tests+=ValidateConvertCommand(image_info,reference_filename, + output_filename,&fail,exception); + if ((type & FormatsDiskValidate) != 0) + { + memory_resource=SetMagickResourceLimit(MemoryResource,0); + map_resource=SetMagickResourceLimit(MapResource,0); + (void) FormatLocaleFile(stdout,"[pixel-cache: disk] "); + tests+=ValidateImageFormatsInMemory(image_info,reference_filename, + output_filename,&fail,exception); + (void) FormatLocaleFile(stdout,"[pixel-cache: disk] "); + tests+=ValidateImageFormatsOnDisk(image_info,reference_filename, + output_filename,&fail,exception); + (void) SetMagickResourceLimit(MemoryResource,memory_resource); + (void) SetMagickResourceLimit(MapResource,map_resource); + } + if ((type & FormatsMapValidate) != 0) + { + memory_resource=SetMagickResourceLimit(MemoryResource,0); + (void) FormatLocaleFile(stdout,"[pixel-cache: memory-mapped] "); + tests+=ValidateImageFormatsInMemory(image_info,reference_filename, + output_filename,&fail,exception); + (void) FormatLocaleFile(stdout,"[pixel-cache: memory-mapped] "); + tests+=ValidateImageFormatsOnDisk(image_info,reference_filename, + output_filename,&fail,exception); + (void) SetMagickResourceLimit(MemoryResource,memory_resource); + } + if ((type & FormatsMemoryValidate) != 0) + { + (void) FormatLocaleFile(stdout,"[pixel-cache: memory] "); + tests+=ValidateImageFormatsInMemory(image_info,reference_filename, + output_filename,&fail,exception); + (void) FormatLocaleFile(stdout,"[pixel-cache: memory] "); + tests+=ValidateImageFormatsOnDisk(image_info,reference_filename, + output_filename,&fail,exception); + } + if ((type & IdentifyValidate) != 0) + tests+=ValidateIdentifyCommand(image_info,reference_filename, + output_filename,&fail,exception); + if ((type & ImportExportValidate) != 0) + tests+=ValidateImportExportPixels(image_info,reference_filename, + output_filename,&fail,exception); + if ((type & MontageValidate) != 0) + tests+=ValidateMontageCommand(image_info,reference_filename, + output_filename,&fail,exception); + if ((type & StreamValidate) != 0) + tests+=ValidateStreamCommand(image_info,reference_filename, + output_filename,&fail,exception); + (void) FormatLocaleFile(stdout, + "validation suite: %.20g tests; %.20g passed; %.20g failed.\n", + (double) tests,(double) (tests-fail),(double) fail); + } + (void) RelinquishUniqueFileResource(output_filename); + (void) RelinquishUniqueFileResource(reference_filename); + } + if (exception->severity != UndefinedException) + CatchException(exception); + if (iterations > 1) + { + elapsed_time=GetElapsedTime(timer); + user_time=GetUserTime(timer); + (void) FormatLocaleFile(stderr, + "Performance: %.20gi %0.3fips %0.6fu %ld:%02ld.%03ld\n",(double) + iterations,1.0*iterations/elapsed_time,user_time,(long) + (elapsed_time/60.0),(long) ceil(fmod(elapsed_time,60.0)), + (long) (1000.0*(elapsed_time-floor(elapsed_time)))); + timer=DestroyTimerInfo(timer); + } + DestroyValidate(); + MagickCoreTerminus(); + return(fail == 0 ? 0 : 1); +} diff --git a/ImageMagick-6.9.12-44/tests/validate.h b/ImageMagick-6.9.12-44/tests/validate.h new file mode 100644 index 0000000..105247b --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/validate.h @@ -0,0 +1,516 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + Wizard the License for the specific language governing permissions and + limitations under the License. + + ImageMagick test vectors. +*/ +#ifndef _IMAGEMAGICK_VALIDATE_H +#define _IMAGEMAGICK_VALIDATE_H + +#define ReferenceFilename "rose:" +#define ReferenceImageFormat "MIFF" + +static const char + *compare_options[] = + { + "-metric RMSE -fuzz 5%", + "-metric AE -fuzz 5%", + (const char *) NULL + }; + +static const char + *composite_options[] = + { + "", + "-compose Add", + "-compose Atop", + "-compose Blend", + "-compose Bumpmap", + "-compose ChangeMask", + "-compose Clear", + "-compose ColorBurn", + "-compose ColorDodge", + "-compose Colorize", + "-compose CopyBlack", + "-compose CopyBlue", + "-compose CopyCyan", + "-compose CopyGreen", + "-compose Copy", + "-compose CopyMagenta", + "-compose CopyOpacity", + "-compose CopyRed", + "-compose CopyYellow", + "-compose Darken", + "-compose Divide", + "-compose Dst", + "-compose Difference", + "-compose Displace", + "-compose Dissolve", + "-compose DstAtop", + "-compose DstIn", + "-compose DstOut", + "-compose DstOver", + "-compose Dst", + "-compose Exclusion", + "-compose HardLight", + "-compose Hue", + "-compose In", + "-compose Lighten", + "-compose LinearLight", + "-compose Luminize", + "-compose Minus", + "-compose Modulate", + "-compose Multiply", + "-compose None", + "-compose Out", + "-compose Overlay", + "-compose Over", + "-compose Plus", + "-compose Replace", + "-compose Saturate", + "-compose Screen", + "-compose SoftLight", + "-compose Src", + "-compose SrcAtop", + "-compose SrcIn", + "-compose SrcOut", + "-compose SrcOver", + "-compose Src", + "-compose Subtract", + "-compose Threshold", + "-compose Xor", + "-geometry +35+65 -label Magick", + (const char *) NULL + }; + +static const char + *convert_options[] = + { + "", + "-affine 1,0,0.785,1,0,0 -transform", + "-black-threshold 20%", + "-blur 0x0.5", + "-blur 0x1.0", + "-blur 0x2.0", + "-border 6x6", + "-canny 0x1+10%+80%", + "-channel red", + "-charcoal 0x1", + "-chop 80x60+10+20", + "-chop 8x6+20+30", + "-colorize 30%/20%/50%", + "-color-matrix '0,0,1,0,1,0,1,0,0'", + "-color-matrix '0.9 0 0, 0 0.9 0, 0 0 1.2'", + "-color-matrix '0.9,0,0,0,0.9,0,0,0,1.2'", + "-color-matrix '1,0,0,0,1,0,0,0,1'", + "-color-matrix '.22,.72,.07,.22,.72,.07,.22,.72,.07'", + "-colors 16", + "-colorspace CMYK", + "-colorspace GRAY", + "-colorspace HSL", + "-colorspace HWB", + "-colorspace OHTA", + "-colorspace YCbCr", + "-colorspace YIQ", + "-colorspace YUV", + "+contrast +contrast +contrast", + "-contrast -contrast -contrast", + "+contrast", + "-contrast", + "-convolve 1,1,1,1,4,1,1,1,1", + "-crop 17x9+10+10", + "-crop 60x70+10+10", + "-cycle 200", + "-density 75x75 -resample 50x50", + "-despeckle", + "-draw \"rectangle 20,10 80,50\"", + "-edge 0x1", + "-emboss 0x1", + "-enhance", + "-equalize", + "-evaluate Abs 2%", + "-evaluate Add 233", + "-evaluate AddModulus 50%", + "-evaluate And 6", + "-evaluate Cosine 2", + "-evaluate Divide 0.7", + "-evaluate Exponential 1.0", + "-evaluate InverseLog 2", + "-evaluate Xor 233", + "-extent 1200x1200-100-100", + "-fill blue -fuzz 35% -opaque red", + "-fill blue -stroke gold -draw 'Bezier 400,200 1100,800 100,300'", + "-fill blue -stroke gold -draw 'polygon 400,200 1100,800 100,300'", + "-fill blue -stroke gold -draw 'rectangle 400,200 1100,800'", + "-fill blue -stroke gold -draw 'roundRectangle 400,200 1100,800 20,20'", + "-fill green -stroke gold -draw 'circle 800,500 1100,800'", + "-fill none -stroke gold -draw 'Bezier 400,200 1100,800 100,300'", + "-fill none -stroke gold -draw 'circle 800,500 1100,800'", + "-fill none -stroke gold -draw 'polygon 400,200 1100,800 100,300'", + "-fill none -stroke gold -draw 'rectangle 400,200 1100,800'", + "-fill none -stroke gold -draw 'roundRectangle 400,200 1100,800 20,20'", + "-flip", + "-flop", + "-frame 15x15+3+3", + "-fuzz 35% -transparent red", + "-fuzz 5% -trim", + "-fx \"(1.0/(1.0+exp(10.0*(0.5-u)))-0.006693)*1.0092503\"", + "-gamma 1.6", + "-gaussian 0x0.5", + "-gaussian 0x1.0", + "-gaussian 0x2.0", + "-implode 0.5", + "-implode -1", + "-label Magick", + "-lat 10x10-5%", + "-level 10%,1.2,90%", + "-magnify", + "-map netscape:", + "-median 1", + "-median 2", + "-modulate 110/100/95", + "-monochrome", + "-motion-blur 0x3+30", + "-negate", + "-noise 1", + "-noise 2", + "+noise Gaussian", + "+noise Impulse", + "+noise Laplacian", + "+noise Multiplicative", + "+noise Poisson", + "+noise Random", + "+noise Uniform", + "-noop", + "-normalize", + "-paint 0x1", + "-raise 10x10", + "-random-threshold 10%", + "-random-threshold 20x80", + "-resize 100%", + "-resize 10%", + "-resize 150%", + "-resize 150x75%", + "-resize 50%", + "-resize 50x150%", + "-roll +20+10", + "-rotate 0", + "-rotate 15", + "-rotate 180", + "-rotate 270", + "-rotate 45", + "-rotate 90", + "-sample 100%", + "-sample 150%", + "-sample 150x50%", + "-sample 50%", + "-sample 50x150%", + "-sample 5%", + "-scale 100%", + "-scale 150%", + "-scale 150x50%", + "-scale 50%", + "-scale 50x150%", + "-scale 5%", + "-segment 0.5x0.25", + "-segment 1x1.5", + "-shade 30x30", + "-sharpen 0x0.5", + "-sharpen 0x1.0", + "-sharpen 0x2.0", + "-shave 10x10", + "-shear 25x20", + "-shear 45x45", + "-size 130x194", + "-solarize 50%", + "-spread 1", + "-spread 3", + "-swirl 90", + "-threshold 35%", + "-trim", + "-unsharp 0x0.5+20+1", + "-unsharp 0x1.0+20+1", + "-wave 25x150", + "-white-threshold 80%", + (const char *) NULL + }; + +static const char + *identify_options[] = + { + "", + "-verbose", + "-features 1 -verbose", + "-unique -verbose", + (const char *) NULL + }; + +static const char + *montage_options[] = + { + "", + "-frame 5", + "-geometry 13x19+10+5 -gravity Center", + "-label %f", + "-pointsize 10", + "-shadow", + "-tile 3x3", + (const char *) NULL + }; + +static const char + *stream_options[] = + { + "", + (const char *) NULL + }; + +struct ReferenceFormats +{ + const char + *magick; + + CompressionType + compression; + + double + fuzz; +}; + +static const struct ReferenceFormats + reference_formats[] = + { + { "ART", UndefinedCompression, 0.0 }, + { "AVS", UndefinedCompression, 0.0 }, + { "BMP", UndefinedCompression, 0.0 }, + { "BMP2", UndefinedCompression, 0.0 }, + { "BMP3", UndefinedCompression, 0.0 }, + { "CIN", UndefinedCompression, 0.0 }, + { "CMYK", UndefinedCompression, 0.0 }, + { "CMYKA", UndefinedCompression, 0.0 }, + { "CUT", UndefinedCompression, 0.0 }, + { "DCM", UndefinedCompression, 0.0 }, + { "DCR", UndefinedCompression, 0.0 }, + { "DCX", UndefinedCompression, 0.0 }, + { "DDS", UndefinedCompression, 0.0 }, + { "DFONT", UndefinedCompression, 0.0 }, + { "DJVU", UndefinedCompression, 0.0 }, + { "DNG", UndefinedCompression, 0.0 }, + { "DOT", UndefinedCompression, 0.0 }, + { "DPS", UndefinedCompression, 0.0 }, + { "DPX", UndefinedCompression, 0.004 }, + { "ERF", UndefinedCompression, 0.0 }, + { "EXR", UndefinedCompression, 0.0 }, + { "FPX", UndefinedCompression, 0.0 }, + { "FRACTAL", UndefinedCompression, 0.0 }, + { "GIF", UndefinedCompression, 0.0 }, + { "GIF87", UndefinedCompression, 0.0 }, + { "GRAY", UndefinedCompression, 0.004 }, + { "HRZ", UndefinedCompression, 0.0 }, + { "HTM", UndefinedCompression, 0.0 }, + { "HTML", UndefinedCompression, 0.0 }, + { "ICB", UndefinedCompression, 0.0 }, + { "ICO", UndefinedCompression, 0.0 }, + { "ICON", UndefinedCompression, 0.0 }, + { "INFO", UndefinedCompression, 0.0 }, + { "JBG", UndefinedCompression, 0.0 }, + { "JNG", UndefinedCompression, 0.004 }, + { "JNG", JPEGCompression, 0.004 }, + { "JP2", UndefinedCompression, 0.004 }, + { "J2K", UndefinedCompression, 0.004 }, + { "JPEG", UndefinedCompression, 0.004 }, + { "JPG", UndefinedCompression, 0.004 }, + { "K25", UndefinedCompression, 0.0 }, + { "KDC", UndefinedCompression, 0.0 }, + { "MATTE", UndefinedCompression, 0.0 }, + { "MIFF", UndefinedCompression, 0.0 }, + { "MIFF", RLECompression, 0.0 }, + { "MIFF", ZipCompression, 0.0 }, + { "MNG", UndefinedCompression, 0.0 }, + { "MONO", UndefinedCompression, 0.0 }, + { "MRW", UndefinedCompression, 0.0 }, + { "MTV", UndefinedCompression, 0.0 }, + { "NEF", UndefinedCompression, 0.0 }, + { "ORF", UndefinedCompression, 0.0 }, + { "OTB", UndefinedCompression, 0.0 }, + { "OTF", UndefinedCompression, 0.0 }, + { "PAL", UndefinedCompression, 0.0 }, + { "PAM", UndefinedCompression, 0.0 }, + { "PBM", UndefinedCompression, 0.0 }, + { "PCT", UndefinedCompression, 0.004 }, + { "PCX", UndefinedCompression, 0.0 }, + { "PEF", UndefinedCompression, 0.0 }, + { "PFA", UndefinedCompression, 0.0 }, + { "PFB", UndefinedCompression, 0.0 }, + { "PFM", UndefinedCompression, 0.004 }, + { "PGM", UndefinedCompression, 0.0 }, + { "PGX", UndefinedCompression, 0.0 }, +#if !defined(MAGICKCORE_HDRI_SUPPORT) + { "PICT", UndefinedCompression, 0.004 }, +#endif + { "PIX", UndefinedCompression, 0.0 }, + { "PJPEG", UndefinedCompression, 0.004 }, + { "PLASMA", UndefinedCompression, 0.0 }, + { "PNG", UndefinedCompression, 0.0 }, + { "PNG8", UndefinedCompression, 0.0 }, + { "PNG24", UndefinedCompression, 0.0 }, + { "PNG32", UndefinedCompression, 0.0 }, + { "PNG48", UndefinedCompression, 0.0 }, + { "PNG64", UndefinedCompression, 0.0 }, + { "PNG00", UndefinedCompression, 0.0 }, + { "PNM", UndefinedCompression, 0.0 }, + { "PPM", UndefinedCompression, 0.0 }, + { "PREVIEW", UndefinedCompression, 0.0 }, + { "PTIF", UndefinedCompression, 0.0 }, + { "PWP", UndefinedCompression, 0.0 }, + { "RADIAL-GR", UndefinedCompression, 0.0 }, + { "RAF", UndefinedCompression, 0.0 }, + { "RAS", UndefinedCompression, 0.0 }, + { "RGB", UndefinedCompression, 0.0 }, + { "RGBA", UndefinedCompression, 0.004 }, + { "RGBO", UndefinedCompression, 0.004 }, + { "RLA", UndefinedCompression, 0.0 }, + { "RLE", UndefinedCompression, 0.0 }, + { "SCR", UndefinedCompression, 0.0 }, + { "SCT", UndefinedCompression, 0.0 }, + { "SFW", UndefinedCompression, 0.0 }, + { "SGI", UndefinedCompression, 0.0 }, + { "SHTML", UndefinedCompression, 0.0 }, + { "SR2", UndefinedCompression, 0.0 }, + { "SRF", UndefinedCompression, 0.0 }, + { "STEGANO", UndefinedCompression, 0.0 }, + { "SUN", UndefinedCompression, 0.0 }, + { "TGA", UndefinedCompression, 0.0 }, + { "TIFF", UndefinedCompression, 0.0 }, + { "TIFF64", UndefinedCompression, 0.0 }, + { "TILE", UndefinedCompression, 0.0 }, + { "TIM", UndefinedCompression, 0.0 }, + { "TTC", UndefinedCompression, 0.0 }, + { "TTF", UndefinedCompression, 0.0 }, + { "TXT", UndefinedCompression, 0.0 }, + { "UIL", UndefinedCompression, 0.0 }, + { "UYVY", UndefinedCompression, 0.0 }, + { "VDA", UndefinedCompression, 0.0 }, + { "VICAR", UndefinedCompression, 0.0 }, + { "VIFF", UndefinedCompression, 0.004 }, + { "VST", UndefinedCompression, 0.0 }, + { "WBMP", UndefinedCompression, 0.0 }, + { "WPG", UndefinedCompression, 0.0 }, + { "X3F", UndefinedCompression, 0.0 }, + { "XBM", UndefinedCompression, 0.0 }, + { "XCF", UndefinedCompression, 0.0 }, + { "XPM", UndefinedCompression, 0.004 }, + { "XPS", UndefinedCompression, 0.0 }, + { "XV", UndefinedCompression, 0.004 }, +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) + { "XWD", UndefinedCompression, 0.0 }, +#endif + { "YUV", UndefinedCompression, 0.0 }, + { "YCbCr", UndefinedCompression, 0.0 }, + { "YCbCrA", UndefinedCompression, 0.0 }, +#if defined(MAGICKCORE_GS_DELEGATE) + { "AI", UndefinedCompression, 0.0 }, + { "EPDF", UndefinedCompression, 0.0 }, + { "EPI", UndefinedCompression, 0.0 }, + { "EPS", UndefinedCompression, 0.0 }, + { "EPS2", UndefinedCompression, 0.0 }, + { "EPS3", UndefinedCompression, 0.0 }, + { "EPSF", UndefinedCompression, 0.0 }, + { "EPSI", UndefinedCompression, 0.0 }, + { "EPT", UndefinedCompression, 0.0 }, + { "PDF", UndefinedCompression, 0.0 }, + { "PDF", ZipCompression, 0.0 }, + { "PDF", FaxCompression, 0.0 }, + { "PDF", JPEGCompression, 0.004 }, + { "PDF", RLECompression, 0.0 }, + { "PDF", LZWCompression, 0.0 }, + { "PDFA", UndefinedCompression, 0.0 }, + { "PS", UndefinedCompression, 0.0 }, + { "PS2", UndefinedCompression, 0.0 }, + { "PS3", UndefinedCompression, 0.0 }, + { "PS3", ZipCompression, 0.0 }, + { "PS3", FaxCompression, 0.0 }, + { "PS3", JPEGCompression, 0.004 }, + { "PS3", RLECompression, 0.0 }, + { "PS3", LZWCompression, 0.0 }, +#endif + { (const char *) NULL, UndefinedCompression, 0.0 } + }; + +static const char + *reference_map[] = + { + "bgro", + "bgrp", + "bgr", + "cmyk", + "cmy", + "i", + "prgb", + "rgba", + "rgbo", + "rgb", + (char *) NULL + }; + +struct ReferenceStorage +{ + StorageType + type; + + size_t + quantum; +}; + +static const struct ReferenceStorage + reference_storage[] = + { + { CharPixel, sizeof(unsigned char) }, + { DoublePixel, sizeof(double) }, + { FloatPixel, sizeof(float) }, + { IntegerPixel, sizeof(unsigned int) }, + { LongPixel, sizeof(size_t) }, + { ShortPixel, sizeof(unsigned short) }, + { UndefinedPixel, 0 } + }; + +struct ReferenceTypes +{ + ImageType + type; + + size_t + depth; +}; + +static const struct ReferenceTypes + reference_types[] = + { + { TrueColorType, 8 }, + { TrueColorMatteType, 8 }, + { GrayscaleType, 8 }, + { GrayscaleMatteType, 8 }, + { PaletteType, 8 }, + { PaletteMatteType, 8 }, + { PaletteBilevelMatteType, 8 }, + { BilevelType, 1 }, + { ColorSeparationType, 8 }, + { ColorSeparationMatteType, 8 }, + { TrueColorType, 10 }, + { TrueColorType, 12 }, + { TrueColorType, 16 }, + { UndefinedType, 0 } + }; + +#endif diff --git a/ImageMagick-6.9.12-44/tests/wandtest.c b/ImageMagick-6.9.12-44/tests/wandtest.c new file mode 100644 index 0000000..22fd2bd --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/wandtest.c @@ -0,0 +1,5500 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M AAA GGGG IIIII CCCC K K % +% MM MM A A G I C K K % +% M M M AAAAA G GGG I C KKK % +% M M A A G G I C K K % +% M M A A GGGG IIIII CCCC K K % +% % +% W W AAA N N DDDD % +% W W A A NN N D D % +% W W W AAAAA N N N D D % +% WW WW A A N NN D D % +% W W A A N N DDDD % +% % +% MagickWand Validation Tests % +% % +% % +% Software Design % +% Cristy % +% March 2003 % +% % +% % +% Copyright 1999-2007 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#if !defined(_VISUALC_) +#include +#endif +#include +#include +#include +#include +#if defined(_VISUALC_) +#include +#include +#endif +#include +#include + +#define WandDelay 3 + +int main(int argc,char **argv) +{ +#define ThrowAPIException(wand) \ +{ \ + description=MagickGetException(wand,&severity); \ + (void) FormatLocaleFile(stderr,"%s %s %lu %s\n",GetMagickModule(), \ + description); \ + description=(char *) MagickRelinquishMemory(description); \ + exit(-1); \ +} + + static char + CustomOption[] = "custom option", + CustomProperty[] = "custom profile"; + + static unsigned char + sRGBProfile[] = + { + 0x00, 0x00, 0xee, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, + 0x73, 0x70, 0x61, 0x63, 0x52, 0x47, 0x42, 0x20, 0x4c, 0x61, 0x62, 0x20, + 0x07, 0xd7, 0x00, 0x07, 0x00, 0x19, 0x00, 0x00, 0x00, 0x05, 0x00, 0x25, + 0x61, 0x63, 0x73, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xd6, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d, 0x00, 0x00, 0x00, 0x00, + 0x34, 0x56, 0x2a, 0xbf, 0x99, 0x4c, 0xcd, 0x06, 0x6d, 0x2c, 0x57, 0x21, + 0xd0, 0xd6, 0x8c, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x76, + 0x41, 0x32, 0x42, 0x30, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x74, 0x10, + 0x41, 0x32, 0x42, 0x31, 0x00, 0x00, 0x75, 0x78, 0x00, 0x00, 0x01, 0xb4, + 0x42, 0x32, 0x41, 0x30, 0x00, 0x00, 0x77, 0x2c, 0x00, 0x00, 0x74, 0x34, + 0x42, 0x32, 0x41, 0x31, 0x00, 0x00, 0xeb, 0x60, 0x00, 0x00, 0x01, 0xfc, + 0x72, 0x69, 0x67, 0x30, 0x00, 0x00, 0xed, 0x5c, 0x00, 0x00, 0x00, 0x0c, + 0x77, 0x74, 0x70, 0x74, 0x00, 0x00, 0xed, 0x68, 0x00, 0x00, 0x00, 0x14, + 0x63, 0x70, 0x72, 0x74, 0x00, 0x00, 0xed, 0x7c, 0x00, 0x00, 0x00, 0x76, + 0x63, 0x68, 0x61, 0x64, 0x00, 0x00, 0xed, 0xf4, 0x00, 0x00, 0x00, 0x2c, + 0x6d, 0x6c, 0x75, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x0c, 0x65, 0x6e, 0x55, 0x53, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x73, 0x00, 0x52, 0x00, 0x47, 0x00, 0x42, + 0x00, 0x20, 0x00, 0x76, 0x00, 0x34, 0x00, 0x20, 0x00, 0x49, 0x00, 0x43, + 0x00, 0x43, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x65, 0x00, 0x66, + 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x65, + 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, + 0x00, 0x70, 0x00, 0x74, 0x00, 0x75, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, + 0x00, 0x69, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, + 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x74, 0x00, 0x61, 0x00, 0x00, + 0x6d, 0x41, 0x42, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x73, 0xec, 0x70, 0x61, 0x72, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x11, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x07, 0xf7, 0x80, 0x80, 0x80, 0x80, 0x07, 0xb9, + 0x84, 0x8b, 0x77, 0x79, 0x08, 0x42, 0x88, 0x52, 0x6e, 0xa3, 0x09, 0x61, + 0x8c, 0x4a, 0x65, 0xcf, 0x0c, 0x7a, 0x90, 0x54, 0x5d, 0xda, 0x0e, 0x9b, + 0x94, 0x6f, 0x56, 0x76, 0x11, 0x50, 0x98, 0x8f, 0x4f, 0x12, 0x15, 0x38, + 0x9c, 0x52, 0x48, 0xda, 0x19, 0x01, 0x9f, 0xe2, 0x42, 0x8a, 0x1b, 0xc9, + 0xa2, 0xab, 0x3d, 0xed, 0x1e, 0x44, 0xa4, 0xf7, 0x3a, 0x07, 0x20, 0xea, + 0xa6, 0xf5, 0x36, 0x4e, 0x23, 0xb9, 0xa8, 0xc8, 0x32, 0x8e, 0x26, 0x3f, + 0xaa, 0x95, 0x2e, 0xb6, 0x28, 0x93, 0xac, 0x8a, 0x2a, 0x00, 0x2c, 0x1a, + 0xae, 0x50, 0x25, 0xb4, 0x2f, 0xd0, 0xb0, 0x03, 0x1f, 0xae, 0x09, 0x99, + 0x78, 0x06, 0x86, 0x58, 0x0e, 0x30, 0x7a, 0x97, 0x7c, 0x67, 0x0f, 0xe9, + 0x7e, 0xdc, 0x73, 0x23, 0x11, 0xc0, 0x83, 0x38, 0x6a, 0x65, 0x13, 0xf7, + 0x87, 0x57, 0x61, 0xb0, 0x16, 0xab, 0x8c, 0x2a, 0x59, 0x90, 0x19, 0x4c, + 0x90, 0xb3, 0x51, 0x93, 0x1c, 0x1d, 0x94, 0xdc, 0x4a, 0xc6, 0x1f, 0x61, + 0x98, 0xb2, 0x44, 0x5d, 0x22, 0xf0, 0x9c, 0x26, 0x3e, 0xe5, 0x26, 0x09, + 0x9e, 0xf0, 0x3a, 0xf2, 0x28, 0x93, 0xa1, 0x42, 0x37, 0x50, 0x2a, 0xfa, + 0xa3, 0x41, 0x33, 0xc2, 0x2d, 0x94, 0xa5, 0x12, 0x30, 0x4e, 0x30, 0x7a, + 0xa6, 0xe2, 0x2c, 0x40, 0x33, 0x7c, 0xa8, 0x97, 0x28, 0x53, 0x36, 0x46, + 0xaa, 0x11, 0x24, 0xb9, 0x14, 0xa0, 0x6f, 0xfd, 0x8b, 0x7e, 0x16, 0x12, + 0x72, 0x51, 0x82, 0x38, 0x17, 0x8e, 0x75, 0x89, 0x78, 0xb8, 0x19, 0x41, + 0x79, 0x8d, 0x6f, 0x58, 0x1b, 0x5b, 0x7e, 0x44, 0x66, 0x03, 0x1d, 0x91, + 0x83, 0x28, 0x5d, 0x2e, 0x20, 0x02, 0x88, 0x51, 0x54, 0xe0, 0x22, 0xee, + 0x8c, 0xf9, 0x4d, 0x69, 0x25, 0xb5, 0x90, 0xfb, 0x46, 0xfd, 0x28, 0xd7, + 0x94, 0xde, 0x40, 0xde, 0x2b, 0xed, 0x98, 0x02, 0x3c, 0x7c, 0x2e, 0xeb, + 0x9a, 0xef, 0x38, 0xa2, 0x31, 0x2d, 0x9d, 0x34, 0x34, 0xc0, 0x34, 0x81, + 0xa0, 0x1c, 0x31, 0x6d, 0x37, 0x3c, 0xa2, 0x00, 0x2d, 0xdc, 0x3a, 0x18, + 0xa3, 0xaa, 0x2a, 0x60, 0x3c, 0xea, 0xa5, 0x39, 0x26, 0xf8, 0x1e, 0x94, + 0x67, 0x75, 0x91, 0x82, 0x1e, 0xa4, 0x69, 0x88, 0x88, 0x21, 0x1e, 0xe3, + 0x6b, 0xe5, 0x7e, 0xb3, 0x20, 0x35, 0x70, 0x06, 0x74, 0xad, 0x21, 0xdf, + 0x74, 0x1d, 0x6b, 0x22, 0x24, 0x66, 0x79, 0x12, 0x61, 0xdc, 0x27, 0x4c, + 0x7f, 0x05, 0x59, 0x16, 0x29, 0x82, 0x84, 0x14, 0x50, 0xb9, 0x2c, 0x47, + 0x88, 0x95, 0x49, 0xf7, 0x2e, 0xe9, 0x8c, 0xb6, 0x43, 0xd3, 0x31, 0xca, + 0x90, 0x89, 0x3e, 0x96, 0x34, 0xa8, 0x93, 0xc3, 0x3a, 0x2d, 0x36, 0x9e, + 0x96, 0x42, 0x35, 0xdd, 0x3a, 0x21, 0x99, 0xb5, 0x32, 0x62, 0x3d, 0xa8, + 0x9d, 0x00, 0x2f, 0x16, 0x40, 0xa8, 0x9f, 0x35, 0x2b, 0xbe, 0x43, 0x60, + 0xa0, 0xb3, 0x28, 0x71, 0x29, 0xe2, 0x5f, 0x52, 0x97, 0xba, 0x2a, 0x28, + 0x60, 0x90, 0x8e, 0xff, 0x27, 0x5c, 0x61, 0x56, 0x84, 0xf9, 0x28, 0x0f, + 0x65, 0x30, 0x7b, 0x76, 0x28, 0x8d, 0x69, 0x34, 0x70, 0xfd, 0x2b, 0xb8, + 0x6e, 0xb3, 0x67, 0x7e, 0x2e, 0x03, 0x73, 0xfe, 0x5e, 0x2c, 0x30, 0xba, + 0x7a, 0x2d, 0x55, 0x63, 0x33, 0x3e, 0x7f, 0xb7, 0x4d, 0x5a, 0x35, 0xcd, + 0x84, 0x17, 0x46, 0xe6, 0x37, 0x97, 0x87, 0xee, 0x40, 0x51, 0x39, 0x92, + 0x8b, 0x6d, 0x3b, 0x98, 0x3c, 0x0f, 0x8e, 0xd5, 0x37, 0x44, 0x40, 0x6e, + 0x93, 0x15, 0x34, 0x12, 0x43, 0x82, 0x96, 0x65, 0x30, 0x77, 0x46, 0x54, + 0x99, 0x05, 0x2d, 0x13, 0x49, 0x16, 0x9b, 0x48, 0x29, 0xb2, 0x36, 0x51, + 0x56, 0x9d, 0x9f, 0x6b, 0x35, 0x31, 0x57, 0x96, 0x96, 0xa7, 0x33, 0xe1, + 0x58, 0xbd, 0x8d, 0xba, 0x31, 0xa5, 0x5a, 0xed, 0x83, 0x91, 0x30, 0xc1, + 0x5e, 0x2a, 0x78, 0xa8, 0x32, 0x72, 0x63, 0x12, 0x6d, 0xf8, 0x35, 0x37, + 0x68, 0xbf, 0x64, 0x17, 0x38, 0x47, 0x6e, 0xfc, 0x5b, 0x0c, 0x3a, 0x54, + 0x74, 0xd4, 0x52, 0x29, 0x3c, 0xd9, 0x7a, 0x56, 0x4a, 0xfa, 0x3e, 0x76, + 0x7e, 0xd2, 0x44, 0x73, 0x41, 0xe3, 0x83, 0xf0, 0x3f, 0x20, 0x44, 0x04, + 0x87, 0xff, 0x3a, 0x4a, 0x47, 0x70, 0x8c, 0x34, 0x36, 0x59, 0x49, 0xfc, + 0x8f, 0xc0, 0x32, 0x50, 0x4c, 0x75, 0x92, 0xd1, 0x2e, 0x96, 0x4f, 0x1c, + 0x95, 0x83, 0x2b, 0x0e, 0x41, 0xa7, 0x4e, 0x2e, 0xa6, 0xe8, 0x41, 0x83, + 0x4f, 0x0e, 0x9e, 0xac, 0x3f, 0xbb, 0x4f, 0xb4, 0x95, 0xf3, 0x3d, 0x72, + 0x50, 0xa2, 0x8c, 0x7f, 0x39, 0xf4, 0x52, 0x60, 0x81, 0x9d, 0x3a, 0x93, + 0x57, 0x0f, 0x76, 0x2f, 0x3c, 0xb3, 0x5d, 0x0e, 0x6a, 0xba, 0x3f, 0x2d, + 0x63, 0x34, 0x60, 0xbf, 0x41, 0x19, 0x69, 0x5e, 0x57, 0x0f, 0x43, 0xdd, + 0x6f, 0xc6, 0x4f, 0x24, 0x46, 0x36, 0x75, 0x5f, 0x48, 0x32, 0x49, 0x01, + 0x7a, 0xd3, 0x42, 0x17, 0x4b, 0xe5, 0x80, 0x21, 0x3d, 0x3b, 0x4e, 0x64, + 0x84, 0x86, 0x38, 0xab, 0x50, 0xd7, 0x88, 0x76, 0x34, 0x6a, 0x53, 0x26, + 0x8b, 0xf6, 0x30, 0x4d, 0x55, 0xea, 0x8f, 0x33, 0x2c, 0x73, 0x4d, 0xf6, + 0x46, 0x11, 0xaf, 0x9c, 0x4c, 0xfd, 0x46, 0x5d, 0xa7, 0x32, 0x4c, 0x05, + 0x46, 0xc8, 0x9e, 0xd0, 0x49, 0xa4, 0x47, 0x4d, 0x95, 0xb6, 0x45, 0x8c, + 0x47, 0x08, 0x8b, 0xd4, 0x45, 0x18, 0x4b, 0x30, 0x80, 0x86, 0x44, 0xb0, + 0x50, 0x4e, 0x73, 0x74, 0x46, 0xb3, 0x56, 0xf7, 0x67, 0x96, 0x48, 0xcf, + 0x5d, 0xbd, 0x5c, 0xef, 0x4b, 0x59, 0x64, 0x53, 0x54, 0x0b, 0x4d, 0xd4, + 0x6a, 0xb8, 0x4c, 0x81, 0x50, 0x4b, 0x70, 0xf5, 0x45, 0xfc, 0x53, 0x2b, + 0x76, 0x96, 0x3f, 0xd8, 0x56, 0x1c, 0x7b, 0xd3, 0x3b, 0x5e, 0x58, 0x72, + 0x80, 0x77, 0x36, 0xe7, 0x5a, 0x86, 0x84, 0x38, 0x32, 0x8c, 0x5c, 0xd7, + 0x87, 0xc1, 0x2e, 0x56, 0x5b, 0xdb, 0x3e, 0xa8, 0xb6, 0xa9, 0x5c, 0x3f, + 0x3f, 0xc7, 0xae, 0xc5, 0x59, 0xbd, 0x3f, 0x54, 0xa7, 0x01, 0x56, 0xf5, + 0x3e, 0xa9, 0x9f, 0x11, 0x52, 0x65, 0x3d, 0x76, 0x95, 0x7f, 0x50, 0x92, + 0x3f, 0xfc, 0x8a, 0x5d, 0x4e, 0xec, 0x43, 0x42, 0x7d, 0xfe, 0x4f, 0x22, + 0x48, 0xdf, 0x70, 0xe6, 0x50, 0x52, 0x51, 0x18, 0x63, 0xbb, 0x53, 0x2a, + 0x58, 0x87, 0x59, 0xe2, 0x55, 0xb7, 0x5f, 0x4a, 0x51, 0x37, 0x58, 0x53, + 0x65, 0xdb, 0x4a, 0x4b, 0x5a, 0xc6, 0x6c, 0x22, 0x43, 0xc0, 0x5d, 0xfa, + 0x72, 0x39, 0x3e, 0x52, 0x60, 0x4f, 0x77, 0x45, 0x39, 0x9d, 0x62, 0x64, + 0x7b, 0xf7, 0x35, 0x07, 0x64, 0x4f, 0x80, 0x50, 0x30, 0x6f, 0x69, 0x29, + 0x39, 0x52, 0xbc, 0x17, 0x68, 0x89, 0x39, 0x1d, 0xb5, 0x2f, 0x67, 0xa8, + 0x38, 0xcc, 0xae, 0x48, 0x65, 0x09, 0x37, 0x42, 0xa7, 0x28, 0x61, 0x6e, + 0x35, 0x0f, 0x9f, 0xc8, 0x5d, 0xc2, 0x35, 0x36, 0x95, 0x38, 0x5b, 0x74, + 0x36, 0xf2, 0x89, 0xd0, 0x5a, 0x24, 0x3a, 0xa1, 0x7c, 0x7b, 0x5a, 0x18, + 0x42, 0xc8, 0x6e, 0x14, 0x5c, 0x08, 0x4c, 0x7e, 0x60, 0xba, 0x5e, 0x2a, + 0x53, 0xe5, 0x57, 0x4b, 0x61, 0x04, 0x5a, 0x9a, 0x4f, 0x60, 0x62, 0xa5, + 0x61, 0x02, 0x48, 0x4e, 0x65, 0xb2, 0x67, 0x84, 0x42, 0x4a, 0x68, 0x73, + 0x6d, 0xaf, 0x3c, 0xd7, 0x6a, 0x8c, 0x72, 0xe6, 0x37, 0xd2, 0x6c, 0x5c, + 0x77, 0x8c, 0x32, 0xdf, 0x76, 0x98, 0x35, 0xc7, 0xc0, 0x60, 0x75, 0xb6, + 0x35, 0x08, 0xb9, 0x92, 0x74, 0xa1, 0x34, 0x23, 0xb3, 0x81, 0x72, 0x89, + 0x32, 0x62, 0xad, 0x41, 0x6f, 0x12, 0x2e, 0xab, 0xa6, 0xfb, 0x6d, 0x9e, + 0x2c, 0xd6, 0xa0, 0x87, 0x68, 0x70, 0x27, 0xbd, 0x96, 0xf7, 0x66, 0x36, + 0x2e, 0x4e, 0x88, 0xb0, 0x64, 0x9f, 0x33, 0x3a, 0x7a, 0x39, 0x65, 0xee, + 0x3d, 0x4e, 0x6b, 0x73, 0x67, 0x3d, 0x46, 0xc9, 0x5e, 0xaa, 0x69, 0x7e, + 0x4e, 0xf6, 0x55, 0x1c, 0x6a, 0xdb, 0x55, 0x5c, 0x4d, 0x23, 0x6d, 0x41, + 0x5c, 0x55, 0x46, 0xd5, 0x6f, 0xd8, 0x62, 0xda, 0x40, 0xc7, 0x72, 0xa3, + 0x69, 0x2e, 0x3b, 0x63, 0x74, 0xc8, 0x6e, 0xc5, 0x35, 0xe2, 0x82, 0x4d, + 0x33, 0x40, 0xc2, 0x49, 0x82, 0x11, 0x32, 0xad, 0xbc, 0x78, 0x81, 0x6d, + 0x31, 0x69, 0xb7, 0x34, 0x80, 0x6a, 0x2f, 0xaa, 0xb2, 0x18, 0x7d, 0xd6, + 0x2d, 0x34, 0xac, 0x2c, 0x7a, 0xcf, 0x2a, 0xdd, 0xa5, 0x6a, 0x77, 0xd9, + 0x28, 0x05, 0x9e, 0x7f, 0x74, 0x2b, 0x25, 0x74, 0x94, 0x3c, 0x71, 0xa5, + 0x27, 0x0a, 0x87, 0x7e, 0x70, 0xdb, 0x2f, 0x37, 0x78, 0x00, 0x71, 0x2b, + 0x38, 0x14, 0x68, 0xb5, 0x72, 0x5c, 0x42, 0x16, 0x5c, 0x86, 0x73, 0xe1, + 0x49, 0xfb, 0x52, 0xd4, 0x76, 0x24, 0x51, 0xba, 0x4b, 0xcd, 0x78, 0x6b, + 0x58, 0xc3, 0x45, 0xb3, 0x7a, 0xcc, 0x5f, 0x68, 0x3f, 0xce, 0x7c, 0xbe, + 0x65, 0x5c, 0x39, 0xcb, 0x8c, 0x5f, 0x31, 0xaa, 0xc3, 0xa1, 0x8c, 0x4f, + 0x31, 0x69, 0xbe, 0x08, 0x8b, 0xc6, 0x30, 0x09, 0xb9, 0x36, 0x89, 0x9e, + 0x2c, 0x91, 0xb4, 0xbb, 0x89, 0x65, 0x2b, 0xf4, 0xaf, 0xe0, 0x86, 0x7a, + 0x29, 0x70, 0xa9, 0x9b, 0x82, 0xa8, 0x25, 0x8f, 0xa3, 0x61, 0x80, 0x8d, + 0x24, 0xe3, 0x9b, 0x42, 0x7d, 0x4b, 0x23, 0x46, 0x91, 0x15, 0x7b, 0x7f, + 0x25, 0x1b, 0x84, 0x29, 0x78, 0xfa, 0x26, 0xbc, 0x74, 0xd7, 0x7a, 0x0d, + 0x32, 0x6c, 0x65, 0x6c, 0x79, 0x72, 0x3b, 0xc2, 0x58, 0x72, 0x7c, 0xbd, + 0x45, 0xc7, 0x50, 0x81, 0x7e, 0xe0, 0x4d, 0x48, 0x49, 0xab, 0x82, 0xc7, + 0x55, 0x66, 0x44, 0x65, 0x84, 0xde, 0x5c, 0x08, 0x3d, 0xeb, 0x94, 0xfd, + 0x30, 0x41, 0xc4, 0xc4, 0x95, 0x28, 0x30, 0x45, 0xbf, 0x49, 0x94, 0xeb, + 0x2f, 0x4e, 0xba, 0xba, 0x94, 0x83, 0x2e, 0x1b, 0xb6, 0x43, 0x93, 0xeb, + 0x2c, 0xad, 0xb1, 0xcb, 0x92, 0x90, 0x2b, 0x21, 0xac, 0x81, 0x90, 0x64, + 0x29, 0x1f, 0xa6, 0x8f, 0x8e, 0x89, 0x27, 0xe7, 0xa0, 0x73, 0x8b, 0x2a, + 0x25, 0xcb, 0x97, 0x97, 0x87, 0x3b, 0x23, 0x09, 0x8d, 0xa5, 0x86, 0xde, + 0x26, 0x61, 0x81, 0x16, 0x85, 0xb1, 0x28, 0x7c, 0x72, 0xa5, 0x84, 0xc3, + 0x31, 0xfd, 0x63, 0xe5, 0x87, 0x22, 0x3d, 0x36, 0x59, 0x39, 0x89, 0x4b, + 0x45, 0xcf, 0x51, 0x22, 0x8b, 0x83, 0x4c, 0xd7, 0x4a, 0x3f, 0x8d, 0x55, + 0x53, 0x38, 0x43, 0x82, 0x9c, 0xec, 0x2e, 0x8f, 0xc6, 0x17, 0x9d, 0x65, + 0x2e, 0xf3, 0xc0, 0x8e, 0x9d, 0x5c, 0x2e, 0x63, 0xbc, 0x0d, 0x9d, 0x1f, + 0x2d, 0x95, 0xb7, 0xaf, 0x9c, 0xcf, 0x2c, 0xaa, 0xb3, 0x4f, 0x9c, 0x29, + 0x2b, 0x97, 0xae, 0xad, 0x9a, 0x6a, 0x2a, 0x22, 0xa8, 0xef, 0x98, 0x9c, + 0x28, 0x95, 0xa3, 0x35, 0x96, 0xae, 0x27, 0x3d, 0x9c, 0x92, 0x94, 0xbe, + 0x26, 0x82, 0x94, 0x0d, 0x93, 0x20, 0x26, 0xd8, 0x89, 0xfa, 0x92, 0x49, + 0x28, 0xed, 0x7e, 0x0f, 0x91, 0x2b, 0x2b, 0xc1, 0x70, 0x7d, 0x91, 0x66, + 0x35, 0x27, 0x63, 0xeb, 0x92, 0xcc, 0x3e, 0x0c, 0x59, 0x67, 0x93, 0xa1, + 0x45, 0x06, 0x50, 0xca, 0x95, 0x88, 0x4b, 0x97, 0x49, 0x27, 0xa4, 0xaa, + 0x2c, 0x45, 0xc7, 0x7c, 0xa5, 0x3c, 0x2c, 0xde, 0xc1, 0xe9, 0xa5, 0x4a, + 0x2c, 0x51, 0xbd, 0x54, 0xa5, 0x21, 0x2b, 0x86, 0xb8, 0xfc, 0xa4, 0xe4, + 0x2a, 0x94, 0xb4, 0xb2, 0xa4, 0x9c, 0x29, 0xa0, 0xb0, 0x62, 0xa3, 0xa7, + 0x28, 0xd5, 0xab, 0x19, 0xa2, 0x6b, 0x27, 0xf4, 0xa5, 0xaf, 0xa0, 0xdf, + 0x26, 0xfc, 0xa0, 0x39, 0x9f, 0x3a, 0x26, 0xcf, 0x98, 0xa1, 0x9d, 0x86, + 0x26, 0x2e, 0x90, 0xc1, 0x9c, 0x76, 0x27, 0xb9, 0x86, 0x76, 0x9b, 0xe6, + 0x2a, 0x97, 0x7b, 0x2d, 0x9b, 0x77, 0x2f, 0x5d, 0x6f, 0x0d, 0x9b, 0xb5, + 0x36, 0xb3, 0x63, 0x1a, 0x9c, 0x83, 0x3e, 0x53, 0x58, 0xdd, 0x9d, 0x4f, + 0x44, 0x68, 0x50, 0x24, 0xad, 0x53, 0x29, 0xae, 0xc8, 0xbb, 0xad, 0xaa, + 0x2a, 0x17, 0xc3, 0x3e, 0xad, 0x8c, 0x29, 0x8a, 0xbe, 0x8b, 0xad, 0x85, + 0x28, 0x3f, 0xba, 0x5a, 0xad, 0x69, 0x27, 0x20, 0xb6, 0x02, 0xad, 0x69, + 0x25, 0xb6, 0xb1, 0xcf, 0xad, 0x3f, 0x24, 0xbd, 0xad, 0x01, 0xad, 0x2e, + 0x23, 0xa6, 0xa7, 0xd1, 0xad, 0x0a, 0x22, 0x8a, 0xa2, 0xba, 0xac, 0x5d, + 0x22, 0x20, 0x9c, 0xac, 0xaa, 0xe1, 0x22, 0x87, 0x95, 0x1b, 0xa8, 0x9e, + 0x23, 0x62, 0x8d, 0x14, 0xa6, 0x68, 0x25, 0xe6, 0x83, 0x24, 0xa5, 0x34, + 0x2a, 0x3e, 0x78, 0xb7, 0xa5, 0x30, 0x2f, 0x4f, 0x6e, 0x51, 0xa5, 0x2b, + 0x36, 0x11, 0x62, 0xcc, 0xa5, 0x35, 0x3d, 0x7b, 0x57, 0xfb, 0x08, 0x6b, + 0x87, 0x9b, 0x85, 0x31, 0x0b, 0xb6, 0x8a, 0xea, 0x7b, 0x53, 0x0d, 0x77, + 0x8d, 0xea, 0x72, 0xc3, 0x0f, 0xc9, 0x91, 0x52, 0x6a, 0x49, 0x11, 0xce, + 0x94, 0xba, 0x61, 0xe9, 0x14, 0x20, 0x98, 0xae, 0x5a, 0x3f, 0x16, 0xe0, + 0x9c, 0x78, 0x52, 0x6c, 0x1a, 0x29, 0xa0, 0x27, 0x4b, 0xac, 0x1c, 0xfe, + 0xa3, 0x54, 0x45, 0xd4, 0x1f, 0xae, 0xa6, 0x0c, 0x40, 0x50, 0x22, 0x31, + 0xa8, 0x42, 0x3c, 0x4e, 0x24, 0xfa, 0xaa, 0x15, 0x38, 0x6f, 0x27, 0xc8, + 0xab, 0xca, 0x34, 0xac, 0x2a, 0xc8, 0xad, 0x4c, 0x31, 0x11, 0x2d, 0xd2, + 0xaf, 0x01, 0x2c, 0xc5, 0x30, 0xf0, 0xb0, 0xa7, 0x28, 0x25, 0x33, 0xbf, + 0xb1, 0xee, 0x24, 0xa8, 0x12, 0xcb, 0x7e, 0xef, 0x89, 0xc4, 0x16, 0x0d, + 0x80, 0x80, 0x80, 0x80, 0x16, 0xc7, 0x84, 0x95, 0x77, 0x6f, 0x18, 0x23, + 0x88, 0x43, 0x6e, 0x78, 0x1a, 0x45, 0x8c, 0x52, 0x65, 0x8d, 0x1c, 0xab, + 0x90, 0x90, 0x5c, 0xfe, 0x1e, 0x84, 0x94, 0xac, 0x55, 0x04, 0x21, 0x1b, + 0x98, 0x92, 0x4d, 0x9e, 0x24, 0x72, 0x9c, 0x49, 0x47, 0x4f, 0x28, 0x02, + 0x9f, 0xe1, 0x40, 0xca, 0x2a, 0x4f, 0xa2, 0x45, 0x3c, 0xdf, 0x2c, 0xb1, + 0xa4, 0x5d, 0x39, 0x3e, 0x2f, 0x36, 0xa6, 0x3e, 0x35, 0xb9, 0x31, 0xf4, + 0xa7, 0xf3, 0x32, 0x47, 0x34, 0xe0, 0xa9, 0x8f, 0x2e, 0xa6, 0x37, 0xcb, + 0xab, 0x0d, 0x2a, 0xea, 0x3a, 0xa5, 0xac, 0x5e, 0x27, 0x75, 0x1b, 0x59, + 0x77, 0x11, 0x8e, 0x94, 0x1d, 0x20, 0x78, 0xe1, 0x85, 0xa4, 0x1e, 0xf2, + 0x7b, 0x36, 0x7c, 0xb7, 0x20, 0xc7, 0x7f, 0x0a, 0x73, 0x5f, 0x22, 0x53, + 0x83, 0x4e, 0x6a, 0x1f, 0x24, 0x10, 0x87, 0x8b, 0x60, 0xf1, 0x26, 0x4b, + 0x8c, 0x52, 0x58, 0x95, 0x28, 0x8e, 0x90, 0x97, 0x50, 0x66, 0x2b, 0x30, + 0x94, 0x8e, 0x4a, 0x1c, 0x2e, 0x22, 0x98, 0x68, 0x43, 0x98, 0x31, 0x30, + 0x9b, 0xbe, 0x3e, 0x41, 0x34, 0x0c, 0x9e, 0x87, 0x3a, 0x63, 0x36, 0x99, + 0xa0, 0xf2, 0x36, 0xcd, 0x39, 0x1a, 0xa2, 0xfa, 0x33, 0x59, 0x3b, 0xc6, + 0xa4, 0xcf, 0x2f, 0xe8, 0x3e, 0x94, 0xa6, 0x48, 0x2c, 0x91, 0x41, 0x41, + 0xa7, 0x95, 0x29, 0x49, 0x25, 0x6d, 0x6f, 0x0e, 0x94, 0x00, 0x26, 0xc3, + 0x70, 0xbf, 0x8b, 0x1e, 0x27, 0xc4, 0x72, 0xae, 0x82, 0x5b, 0x28, 0xd2, + 0x75, 0xc0, 0x78, 0xfc, 0x2a, 0x2d, 0x79, 0x6a, 0x6f, 0x84, 0x2c, 0x48, + 0x7e, 0x54, 0x66, 0x0b, 0x2e, 0x10, 0x83, 0x32, 0x5c, 0xec, 0x2f, 0xd7, + 0x87, 0xe9, 0x54, 0x72, 0x32, 0x5d, 0x8c, 0x38, 0x4d, 0x36, 0x35, 0x3b, + 0x90, 0x79, 0x47, 0x1c, 0x37, 0xe1, 0x94, 0x68, 0x40, 0x8c, 0x3a, 0x8b, + 0x97, 0x9c, 0x3c, 0x38, 0x3d, 0x33, 0x9a, 0xa8, 0x38, 0x46, 0x3f, 0xf0, + 0x9d, 0xb9, 0x34, 0x88, 0x42, 0xa6, 0xa0, 0x36, 0x31, 0x00, 0x45, 0x2f, + 0xa1, 0xac, 0x2d, 0xba, 0x47, 0xbd, 0xa3, 0x0b, 0x2a, 0x6d, 0x2f, 0xb6, + 0x66, 0xef, 0x9a, 0x3a, 0x31, 0x11, 0x67, 0xf0, 0x91, 0xa9, 0x31, 0x74, + 0x69, 0xde, 0x88, 0xb3, 0x32, 0x40, 0x6c, 0x12, 0x7f, 0xba, 0x33, 0x73, + 0x70, 0x0a, 0x75, 0x59, 0x34, 0x65, 0x74, 0x0d, 0x6b, 0xd4, 0x36, 0x1b, + 0x78, 0xd3, 0x62, 0x72, 0x38, 0x58, 0x7e, 0x58, 0x59, 0x92, 0x3a, 0x34, + 0x83, 0x33, 0x51, 0x32, 0x3c, 0x84, 0x87, 0xb8, 0x4a, 0x9a, 0x3f, 0x36, + 0x8c, 0x52, 0x44, 0x0a, 0x41, 0xee, 0x90, 0x63, 0x3e, 0x79, 0x44, 0x21, + 0x93, 0x89, 0x3a, 0x64, 0x46, 0x77, 0x96, 0x8b, 0x36, 0x7a, 0x48, 0xe7, + 0x99, 0x66, 0x32, 0xae, 0x4b, 0x71, 0x9b, 0xf4, 0x2f, 0x10, 0x4e, 0x27, + 0x9e, 0x12, 0x2b, 0xb8, 0x3c, 0xb2, 0x5e, 0x60, 0xa1, 0x0c, 0x3d, 0x96, + 0x5f, 0x9b, 0x98, 0xc8, 0x3e, 0x74, 0x60, 0xd3, 0x90, 0xc3, 0x3d, 0x4d, + 0x62, 0xb8, 0x87, 0x2e, 0x3c, 0xca, 0x65, 0x41, 0x7d, 0x52, 0x3d, 0x67, + 0x69, 0x8b, 0x72, 0x65, 0x3f, 0x35, 0x6e, 0x91, 0x68, 0xa8, 0x40, 0x8a, + 0x73, 0x65, 0x5f, 0x4a, 0x42, 0x59, 0x79, 0x03, 0x56, 0x9a, 0x44, 0xba, + 0x7e, 0x3c, 0x4e, 0xc2, 0x46, 0xc6, 0x83, 0x1c, 0x48, 0x75, 0x48, 0xe9, + 0x87, 0xae, 0x41, 0xde, 0x4b, 0x43, 0x8b, 0xc7, 0x3c, 0xf7, 0x4d, 0x97, + 0x8f, 0x80, 0x38, 0xbe, 0x4f, 0xac, 0x92, 0xb3, 0x34, 0xae, 0x51, 0xeb, + 0x95, 0x7e, 0x30, 0xbb, 0x54, 0x7c, 0x97, 0xdd, 0x2d, 0x2d, 0x47, 0xa3, + 0x55, 0xf3, 0xa8, 0x3b, 0x49, 0x26, 0x57, 0x0d, 0x9f, 0xf1, 0x48, 0xd0, + 0x58, 0x0c, 0x97, 0xb4, 0x48, 0xd5, 0x59, 0x29, 0x8f, 0x77, 0x47, 0xdf, + 0x5b, 0x8c, 0x85, 0x43, 0x48, 0x10, 0x5f, 0x49, 0x7a, 0x65, 0x48, 0x39, + 0x63, 0xea, 0x6f, 0x37, 0x49, 0x40, 0x69, 0x00, 0x65, 0x80, 0x4b, 0x4c, + 0x6e, 0x94, 0x5c, 0xac, 0x4c, 0xce, 0x74, 0x17, 0x54, 0x0c, 0x4e, 0xc0, + 0x79, 0x5f, 0x4c, 0x82, 0x51, 0x09, 0x7e, 0xbe, 0x46, 0x17, 0x52, 0xef, + 0x83, 0x6b, 0x3f, 0xce, 0x54, 0xfd, 0x87, 0x6b, 0x3b, 0x44, 0x57, 0x20, + 0x8b, 0x13, 0x36, 0xf2, 0x59, 0x51, 0x8e, 0x6f, 0x32, 0xc9, 0x5b, 0x8f, + 0x91, 0x67, 0x2e, 0xc2, 0x53, 0xe9, 0x4d, 0xcf, 0xaf, 0x9b, 0x55, 0x00, + 0x4e, 0xf5, 0xa7, 0x28, 0x56, 0x47, 0x50, 0x4b, 0x9e, 0xd9, 0x54, 0xeb, + 0x51, 0x3e, 0x96, 0x81, 0x53, 0xc8, 0x52, 0x5e, 0x8d, 0xe7, 0x52, 0x71, + 0x54, 0xcc, 0x83, 0x41, 0x52, 0x32, 0x58, 0xfd, 0x77, 0x9b, 0x53, 0x48, + 0x5e, 0xe2, 0x6c, 0x04, 0x53, 0x9d, 0x63, 0xe2, 0x62, 0x10, 0x55, 0x50, + 0x69, 0x88, 0x59, 0x96, 0x57, 0x73, 0x6f, 0x6f, 0x51, 0xb0, 0x59, 0x28, + 0x74, 0xcb, 0x4a, 0x80, 0x5b, 0x1e, 0x7a, 0x05, 0x43, 0xd3, 0x5d, 0x55, + 0x7f, 0x0b, 0x3e, 0x36, 0x5f, 0x21, 0x83, 0x20, 0x39, 0x9d, 0x60, 0xf1, + 0x86, 0xbd, 0x35, 0x22, 0x62, 0xe1, 0x8a, 0x24, 0x30, 0x9f, 0x60, 0xa9, + 0x46, 0x1b, 0xb6, 0xcb, 0x61, 0xf9, 0x47, 0x64, 0xae, 0xaa, 0x61, 0x99, + 0x47, 0xef, 0xa6, 0xd9, 0x61, 0x77, 0x48, 0xb7, 0x9e, 0xd4, 0x60, 0x48, + 0x4a, 0x10, 0x95, 0xc2, 0x5f, 0x7e, 0x4b, 0xfc, 0x8c, 0x42, 0x5f, 0x45, + 0x4f, 0x3b, 0x81, 0x88, 0x5d, 0x55, 0x53, 0xa6, 0x74, 0xf3, 0x5d, 0x47, + 0x59, 0x6f, 0x69, 0x08, 0x5e, 0xec, 0x5f, 0xd7, 0x5e, 0xf4, 0x60, 0x02, + 0x64, 0xe2, 0x56, 0xc1, 0x61, 0xaa, 0x6a, 0x52, 0x4f, 0x1d, 0x63, 0xcb, + 0x70, 0x52, 0x48, 0x8e, 0x65, 0x68, 0x75, 0x63, 0x41, 0xbd, 0x67, 0x49, + 0x7a, 0x40, 0x3c, 0x75, 0x69, 0x1e, 0x7e, 0xd4, 0x37, 0xaa, 0x6a, 0xc5, + 0x82, 0xb0, 0x32, 0xd2, 0x6d, 0xf2, 0x40, 0x9d, 0xbc, 0x14, 0x6f, 0x09, + 0x41, 0x75, 0xb4, 0xc1, 0x6f, 0x94, 0x42, 0x05, 0xad, 0x89, 0x6e, 0xf8, + 0x42, 0x1f, 0xa6, 0x63, 0x6e, 0x37, 0x42, 0x50, 0x9f, 0x02, 0x6c, 0x02, + 0x43, 0x37, 0x95, 0x8a, 0x6a, 0x04, 0x44, 0xbe, 0x8b, 0x3d, 0x68, 0x81, + 0x47, 0x5e, 0x7f, 0xaf, 0x68, 0x32, 0x4e, 0x12, 0x72, 0x7e, 0x67, 0xf8, + 0x54, 0x37, 0x66, 0x40, 0x68, 0xfa, 0x5a, 0x16, 0x5c, 0x7c, 0x6a, 0xc2, + 0x60, 0x06, 0x54, 0x73, 0x6c, 0x3e, 0x65, 0x8b, 0x4d, 0x3b, 0x6e, 0x12, + 0x6b, 0x73, 0x46, 0xaa, 0x70, 0x06, 0x70, 0xfd, 0x40, 0x00, 0x71, 0x83, + 0x75, 0xc6, 0x3a, 0xc0, 0x73, 0x14, 0x7a, 0x56, 0x35, 0x7a, 0x7b, 0x0c, + 0x3c, 0x47, 0xc0, 0x26, 0x7b, 0x68, 0x3c, 0x88, 0xb9, 0x73, 0x7b, 0xe4, + 0x3c, 0xe8, 0xb2, 0xf5, 0x7b, 0xa7, 0x3d, 0x0b, 0xac, 0x37, 0x7a, 0x9e, + 0x3c, 0xb9, 0xa5, 0x64, 0x79, 0x4b, 0x3c, 0x78, 0x9e, 0x18, 0x77, 0x1d, + 0x3d, 0x0a, 0x94, 0xba, 0x75, 0x61, 0x3e, 0xf6, 0x89, 0xe3, 0x73, 0x91, + 0x42, 0x24, 0x7d, 0x45, 0x72, 0x8f, 0x48, 0x1f, 0x6f, 0xd2, 0x73, 0x7b, + 0x4f, 0x67, 0x63, 0xab, 0x73, 0xcc, 0x55, 0x0f, 0x5a, 0x35, 0x74, 0xe8, + 0x5a, 0xce, 0x52, 0x22, 0x76, 0xc0, 0x61, 0x2f, 0x4b, 0x82, 0x78, 0x38, + 0x66, 0xef, 0x45, 0x08, 0x79, 0xea, 0x6c, 0x5e, 0x3e, 0xae, 0x7b, 0xa5, + 0x71, 0x8f, 0x38, 0xdb, 0x86, 0x2b, 0x39, 0x21, 0xc2, 0xa4, 0x86, 0x76, + 0x39, 0x38, 0xbc, 0x70, 0x86, 0x73, 0x38, 0xe6, 0xb6, 0xbe, 0x86, 0x5c, + 0x38, 0x75, 0xb1, 0x20, 0x85, 0x46, 0x37, 0xdd, 0xaa, 0xbc, 0x83, 0xe3, + 0x37, 0x23, 0xa4, 0x1d, 0x82, 0x5b, 0x36, 0xaf, 0x9c, 0x8f, 0x80, 0xb2, + 0x37, 0x11, 0x93, 0x37, 0x7f, 0x72, 0x39, 0x2c, 0x87, 0xf2, 0x7e, 0xaf, + 0x3d, 0x67, 0x7b, 0x27, 0x7d, 0x63, 0x43, 0x34, 0x6d, 0x46, 0x7d, 0xcb, + 0x4a, 0x68, 0x60, 0xa0, 0x7e, 0x7a, 0x50, 0xf7, 0x57, 0xde, 0x7e, 0xd8, + 0x56, 0x57, 0x4f, 0xdc, 0x80, 0xd8, 0x5d, 0x22, 0x49, 0xc3, 0x82, 0x78, + 0x63, 0x11, 0x43, 0x79, 0x84, 0x08, 0x68, 0x8a, 0x3c, 0xf4, 0x90, 0x19, + 0x36, 0xf1, 0xc4, 0x54, 0x90, 0x87, 0x37, 0x1d, 0xbe, 0x4f, 0x90, 0x85, + 0x36, 0x8f, 0xb9, 0x2a, 0x90, 0x70, 0x35, 0xde, 0xb4, 0x1e, 0x90, 0x16, + 0x35, 0x0c, 0xae, 0xfb, 0x8e, 0x85, 0x34, 0x55, 0xa8, 0x99, 0x8c, 0xc9, + 0x33, 0x83, 0xa2, 0x27, 0x8b, 0x03, 0x33, 0x46, 0x9a, 0x1b, 0x89, 0x41, + 0x33, 0x7a, 0x91, 0x0c, 0x88, 0x6c, 0x35, 0xdf, 0x85, 0x1b, 0x87, 0xd1, + 0x39, 0xea, 0x78, 0x1d, 0x87, 0x95, 0x40, 0x6a, 0x6a, 0xd2, 0x87, 0x94, + 0x47, 0x21, 0x5e, 0xb7, 0x88, 0x9b, 0x4e, 0x1e, 0x56, 0x4b, 0x89, 0x4f, + 0x53, 0xc5, 0x4e, 0xe2, 0x8a, 0xe9, 0x59, 0xe2, 0x48, 0x5c, 0x8c, 0x81, + 0x5f, 0xb4, 0x41, 0x94, 0x98, 0x52, 0x35, 0x14, 0xc5, 0xaa, 0x98, 0xe9, + 0x35, 0x6c, 0xbf, 0xae, 0x98, 0xef, 0x34, 0xfb, 0xba, 0xd7, 0x98, 0xea, + 0x34, 0x83, 0xb6, 0x09, 0x98, 0xd7, 0x33, 0xed, 0xb1, 0x53, 0x97, 0xe9, + 0x33, 0x45, 0xab, 0xb0, 0x96, 0x83, 0x32, 0x7a, 0xa5, 0x9e, 0x94, 0xf8, + 0x31, 0x96, 0x9f, 0x65, 0x93, 0x7a, 0x31, 0x82, 0x97, 0x14, 0x92, 0x0b, + 0x31, 0xbb, 0x8e, 0x2c, 0x91, 0xc4, 0x34, 0x57, 0x82, 0x27, 0x91, 0x61, + 0x38, 0x70, 0x75, 0x5f, 0x91, 0x7b, 0x3e, 0xe3, 0x68, 0xe7, 0x91, 0xa2, + 0x45, 0x6e, 0x5d, 0x9e, 0x92, 0x7d, 0x4c, 0x17, 0x55, 0x45, 0x93, 0x7b, + 0x51, 0xc4, 0x4d, 0xf8, 0x94, 0xd7, 0x57, 0x52, 0x46, 0xd6, 0xa0, 0x73, + 0x33, 0x63, 0xc6, 0xe4, 0xa1, 0x08, 0x33, 0xc5, 0xc0, 0xff, 0xa1, 0x29, + 0x33, 0x86, 0xbc, 0x3d, 0xa1, 0x31, 0x33, 0x33, 0xb7, 0xa5, 0xa1, 0x31, + 0x32, 0xd3, 0xb3, 0x1a, 0xa0, 0xe5, 0x32, 0x71, 0xae, 0x3d, 0x9f, 0xd6, + 0x31, 0xf7, 0xa8, 0x74, 0x9e, 0x76, 0x31, 0x36, 0xa2, 0x98, 0x9d, 0x0b, + 0x30, 0xc2, 0x9b, 0xb6, 0x9b, 0xaf, 0x30, 0xb7, 0x93, 0xbc, 0x9a, 0xba, + 0x31, 0xb2, 0x8a, 0x4f, 0x9a, 0x69, 0x34, 0x15, 0x7f, 0x42, 0x9a, 0x6a, + 0x38, 0x1b, 0x73, 0x1b, 0x9a, 0xad, 0x3e, 0x7c, 0x67, 0x2f, 0x9a, 0xe3, + 0x44, 0xcb, 0x5c, 0x85, 0x9b, 0xad, 0x4a, 0x99, 0x54, 0x40, 0x9c, 0xe4, + 0x50, 0x0a, 0x4c, 0xbc, 0xa8, 0x03, 0x31, 0xa6, 0xc7, 0xc7, 0xa8, 0x86, + 0x32, 0x08, 0xc2, 0x29, 0xa8, 0xa8, 0x31, 0xe4, 0xbd, 0x4c, 0xa8, 0x92, + 0x31, 0x72, 0xb8, 0xcf, 0xa8, 0x71, 0x30, 0xf6, 0xb4, 0x5c, 0xa8, 0x46, + 0x30, 0x6f, 0xaf, 0xf8, 0xa7, 0x81, 0x30, 0x01, 0xaa, 0x9d, 0xa6, 0xb0, + 0x2f, 0x62, 0xa5, 0x36, 0xa5, 0xca, 0x2e, 0xb9, 0x9f, 0xba, 0xa4, 0xcc, + 0x2e, 0xef, 0x98, 0x32, 0xa3, 0xb8, 0x2f, 0x30, 0x90, 0x98, 0xa3, 0x1b, + 0x31, 0x0e, 0x87, 0x01, 0xa2, 0xd1, 0x33, 0x86, 0x7c, 0x99, 0xa2, 0xfe, + 0x37, 0x61, 0x71, 0x32, 0xa3, 0x24, 0x3d, 0x98, 0x65, 0xc4, 0xa3, 0x78, + 0x43, 0xa8, 0x5b, 0x70, 0xa4, 0x44, 0x49, 0x14, 0x52, 0xd8, 0xaf, 0xb1, + 0x2f, 0xef, 0xc8, 0xb5, 0xb0, 0x3c, 0x30, 0x76, 0xc3, 0x16, 0xb0, 0x6a, + 0x30, 0x65, 0xbe, 0x36, 0xb0, 0x35, 0x2f, 0xc4, 0xb9, 0xcb, 0xb0, 0x00, + 0x2e, 0xd6, 0xb5, 0x80, 0xaf, 0xd8, 0x2d, 0xd7, 0xb1, 0x39, 0xaf, 0x97, + 0x2d, 0x19, 0xac, 0x6e, 0xaf, 0x58, 0x2c, 0x64, 0xa7, 0x6b, 0xaf, 0x23, + 0x2b, 0x96, 0xa2, 0x5f, 0xae, 0x92, 0x2b, 0x5a, 0x9c, 0x51, 0xad, 0xb6, + 0x2b, 0xbd, 0x94, 0xee, 0xac, 0x6d, 0x2c, 0xa4, 0x8d, 0x44, 0xab, 0x1d, + 0x2f, 0x4e, 0x84, 0x31, 0xaa, 0xbc, 0x32, 0x18, 0x7a, 0x63, 0xaa, 0xf3, + 0x36, 0x01, 0x6f, 0xa8, 0xab, 0x03, 0x3c, 0x03, 0x64, 0xa6, 0xab, 0x8e, + 0x42, 0x18, 0x5a, 0x35, 0x0e, 0xed, 0x8d, 0xe7, 0x88, 0x64, 0x11, 0x77, + 0x90, 0x3a, 0x7f, 0xa1, 0x13, 0x65, 0x93, 0x22, 0x77, 0x12, 0x15, 0x32, + 0x95, 0xfb, 0x6e, 0xc0, 0x17, 0x0b, 0x99, 0x55, 0x66, 0x24, 0x18, 0xee, + 0x9c, 0xb7, 0x5d, 0xa2, 0x1b, 0x9c, 0xa0, 0x6d, 0x55, 0xb2, 0x1e, 0x0f, + 0xa3, 0xd3, 0x4e, 0xb8, 0x20, 0x82, 0xa7, 0x08, 0x49, 0x21, 0x23, 0x42, + 0xa9, 0x96, 0x43, 0x20, 0x25, 0xfb, 0xab, 0xab, 0x3e, 0x3c, 0x28, 0xe8, + 0xad, 0x57, 0x3a, 0x52, 0x2b, 0xd1, 0xae, 0xf4, 0x36, 0x93, 0x2e, 0xfb, + 0xb0, 0x43, 0x33, 0x12, 0x31, 0xcc, 0xb1, 0x80, 0x2f, 0x72, 0x34, 0x8e, + 0xb2, 0xe4, 0x2b, 0x58, 0x37, 0x47, 0xb4, 0x17, 0x27, 0x9f, 0x18, 0x2d, + 0x85, 0xc9, 0x8c, 0xc9, 0x1a, 0xb9, 0x87, 0x8a, 0x84, 0x15, 0x1c, 0x91, + 0x8a, 0x3f, 0x7b, 0x3f, 0x1e, 0x2a, 0x8d, 0x72, 0x72, 0x43, 0x20, 0x27, + 0x91, 0x24, 0x69, 0x6c, 0x21, 0xbc, 0x94, 0x8e, 0x60, 0xa4, 0x23, 0xa1, + 0x98, 0x7b, 0x58, 0x93, 0x25, 0xfa, 0x9c, 0x2f, 0x50, 0x65, 0x29, 0x4e, + 0x9f, 0xe5, 0x49, 0xe2, 0x2b, 0xdc, 0xa3, 0x13, 0x43, 0xb9, 0x2e, 0x45, + 0xa5, 0x9d, 0x3e, 0x9d, 0x30, 0xc6, 0xa7, 0x8c, 0x3b, 0x05, 0x33, 0x7e, + 0xa9, 0x43, 0x37, 0x8f, 0x36, 0x5c, 0xaa, 0xc8, 0x34, 0x2c, 0x39, 0x53, + 0xac, 0x1d, 0x30, 0xcc, 0x3c, 0x3c, 0xad, 0x65, 0x2d, 0x50, 0x3f, 0x11, + 0xae, 0x92, 0x2a, 0x01, 0x20, 0x9f, 0x7e, 0x62, 0x91, 0x63, 0x23, 0x1c, + 0x7f, 0x9e, 0x88, 0xc8, 0x25, 0xd0, 0x80, 0x80, 0x80, 0x80, 0x27, 0x01, + 0x84, 0x7d, 0x77, 0x3d, 0x28, 0x5b, 0x88, 0x22, 0x6e, 0x10, 0x2a, 0x20, + 0x8c, 0x4b, 0x64, 0xca, 0x2c, 0x23, 0x90, 0x6e, 0x5c, 0x0d, 0x2d, 0xe7, + 0x94, 0x44, 0x53, 0xe8, 0x30, 0x43, 0x98, 0x16, 0x4c, 0xb8, 0x33, 0x37, + 0x9b, 0xde, 0x46, 0x31, 0x36, 0x3c, 0x9f, 0x5a, 0x3f, 0xba, 0x38, 0x8d, + 0xa1, 0xbb, 0x3c, 0x23, 0x3a, 0xfb, 0xa3, 0xd4, 0x38, 0xa3, 0x3d, 0x97, + 0xa5, 0xb4, 0x35, 0x3b, 0x40, 0x51, 0xa7, 0x56, 0x31, 0xdc, 0x42, 0xee, + 0xa8, 0xb1, 0x2e, 0x84, 0x45, 0x79, 0xa9, 0xe9, 0x2b, 0x34, 0x2a, 0x39, + 0x76, 0x83, 0x96, 0xde, 0x2c, 0x65, 0x77, 0xa4, 0x8e, 0x2a, 0x2e, 0x41, + 0x79, 0x1e, 0x85, 0xa8, 0x30, 0x15, 0x7b, 0x23, 0x7c, 0xdf, 0x31, 0x72, + 0x7e, 0xce, 0x73, 0x63, 0x32, 0xd2, 0x83, 0x18, 0x6a, 0x01, 0x34, 0x5c, + 0x87, 0x3f, 0x60, 0xad, 0x36, 0x25, 0x8b, 0xb5, 0x58, 0x48, 0x38, 0x45, + 0x8f, 0xc1, 0x50, 0x1d, 0x3a, 0x9b, 0x93, 0xe1, 0x49, 0xbb, 0x3d, 0x16, + 0x97, 0xc3, 0x42, 0xe2, 0x3f, 0x92, 0x9b, 0x0d, 0x3d, 0xd6, 0x42, 0x35, + 0x9d, 0xf2, 0x3a, 0x10, 0x44, 0xcf, 0xa0, 0x75, 0x36, 0x7f, 0x47, 0x33, + 0xa2, 0x54, 0x33, 0x15, 0x49, 0x94, 0xa3, 0xf9, 0x2f, 0xa3, 0x4c, 0x0f, + 0xa5, 0x56, 0x2c, 0x57, 0x34, 0xb9, 0x6e, 0x4e, 0x9c, 0xa9, 0x36, 0xf7, + 0x6f, 0x38, 0x94, 0x18, 0x38, 0xaf, 0x70, 0xc0, 0x8b, 0x77, 0x3a, 0x12, + 0x72, 0xa6, 0x82, 0xdf, 0x3a, 0xf7, 0x75, 0x88, 0x79, 0x76, 0x3b, 0xe2, + 0x79, 0x0b, 0x6f, 0xcb, 0x3d, 0x76, 0x7d, 0xb1, 0x66, 0x68, 0x3f, 0x1f, + 0x82, 0x47, 0x5d, 0x67, 0x40, 0xa1, 0x86, 0xd1, 0x55, 0x11, 0x42, 0x8e, + 0x8b, 0x21, 0x4d, 0x97, 0x45, 0x0e, 0x8f, 0x94, 0x47, 0x23, 0x47, 0x3c, + 0x93, 0x5f, 0x40, 0xac, 0x49, 0x66, 0x96, 0x86, 0x3c, 0x71, 0x4b, 0xb0, + 0x99, 0x75, 0x38, 0x88, 0x4e, 0x0d, 0x9c, 0x2d, 0x34, 0xc3, 0x50, 0x75, + 0x9e, 0xae, 0x31, 0x0c, 0x53, 0x07, 0xa0, 0x8a, 0x2d, 0x9b, 0x40, 0xfe, + 0x65, 0xd6, 0xa3, 0x0d, 0x42, 0x8e, 0x66, 0xda, 0x9a, 0xd2, 0x43, 0xf1, + 0x67, 0xf1, 0x92, 0xaa, 0x44, 0x94, 0x69, 0xbf, 0x89, 0xb1, 0x45, 0x67, + 0x6b, 0xf4, 0x80, 0x8b, 0x46, 0x43, 0x6f, 0xd8, 0x76, 0x43, 0x46, 0xdf, + 0x73, 0xae, 0x6c, 0xa5, 0x48, 0x0e, 0x78, 0x1e, 0x63, 0x73, 0x49, 0xb5, + 0x7c, 0xf6, 0x5a, 0xb7, 0x4b, 0x7f, 0x81, 0xbb, 0x52, 0x6e, 0x4d, 0x06, + 0x86, 0x5c, 0x4b, 0x79, 0x4e, 0xf4, 0x8a, 0xd1, 0x45, 0x05, 0x51, 0x30, + 0x8e, 0xd6, 0x3f, 0x32, 0x53, 0x39, 0x92, 0x38, 0x3a, 0xf5, 0x55, 0x4a, + 0x95, 0x2c, 0x36, 0xe2, 0x57, 0x6f, 0x97, 0xd5, 0x32, 0xf3, 0x59, 0xc2, + 0x9a, 0x44, 0x2f, 0x18, 0x4c, 0x7c, 0x5d, 0x48, 0xa9, 0x9e, 0x4f, 0x5d, + 0x5e, 0x88, 0xa1, 0x2c, 0x50, 0x6c, 0x5f, 0xb6, 0x99, 0x25, 0x51, 0x29, + 0x60, 0xe6, 0x91, 0x35, 0x50, 0xbf, 0x63, 0x1d, 0x87, 0xab, 0x50, 0xae, + 0x65, 0xe0, 0x7d, 0xd0, 0x50, 0xf1, 0x69, 0xe2, 0x73, 0x44, 0x51, 0xe5, + 0x6e, 0x69, 0x69, 0xc8, 0x53, 0x0b, 0x72, 0xe7, 0x60, 0xde, 0x54, 0x34, + 0x77, 0xf2, 0x58, 0x39, 0x55, 0xf6, 0x7c, 0xb4, 0x50, 0x03, 0x57, 0xbb, + 0x81, 0xcb, 0x49, 0x7c, 0x59, 0x5e, 0x86, 0x49, 0x42, 0xdf, 0x5b, 0x42, + 0x8a, 0x37, 0x3d, 0xab, 0x5d, 0x3e, 0x8d, 0xbd, 0x39, 0x57, 0x5f, 0x36, + 0x90, 0xe4, 0x35, 0x18, 0x61, 0x27, 0x93, 0xb5, 0x30, 0xc0, 0x58, 0x38, + 0x54, 0xf1, 0xb0, 0x83, 0x5a, 0x05, 0x56, 0x2d, 0xa8, 0x55, 0x5c, 0x2e, + 0x57, 0x6d, 0xa0, 0x52, 0x5c, 0x11, 0x58, 0xc8, 0x97, 0xf4, 0x5c, 0x2d, + 0x5a, 0x39, 0x8f, 0x92, 0x5b, 0xd2, 0x5d, 0x03, 0x85, 0x34, 0x5b, 0xc2, + 0x60, 0xbc, 0x7a, 0x65, 0x5b, 0xa9, 0x64, 0xa2, 0x70, 0x01, 0x5c, 0x4d, + 0x69, 0x4f, 0x66, 0xab, 0x5d, 0x93, 0x6d, 0xe9, 0x5e, 0x1b, 0x5e, 0xeb, + 0x73, 0x31, 0x55, 0xec, 0x60, 0x6e, 0x78, 0x14, 0x4e, 0x22, 0x62, 0x27, + 0x7d, 0x27, 0x47, 0x78, 0x63, 0xdc, 0x81, 0xdd, 0x40, 0xe2, 0x65, 0x68, + 0x85, 0xbf, 0x3c, 0x05, 0x67, 0x1e, 0x89, 0x4f, 0x37, 0x63, 0x68, 0xf7, + 0x8c, 0xa6, 0x32, 0xb6, 0x64, 0xeb, 0x4d, 0x30, 0xb6, 0xf1, 0x67, 0x5b, + 0x4e, 0xbb, 0xae, 0x4a, 0x68, 0xb1, 0x50, 0x02, 0xa6, 0x7e, 0x69, 0xc4, + 0x51, 0x47, 0x9e, 0xdd, 0x68, 0xa8, 0x52, 0xa4, 0x96, 0x6b, 0x67, 0xd9, + 0x54, 0x42, 0x8d, 0xa2, 0x66, 0xfe, 0x56, 0xcf, 0x83, 0x4d, 0x66, 0x38, + 0x5a, 0xee, 0x77, 0xdb, 0x66, 0x65, 0x5f, 0xec, 0x6c, 0xc4, 0x66, 0xea, + 0x64, 0x70, 0x63, 0x88, 0x67, 0xf7, 0x69, 0x2f, 0x5b, 0x3c, 0x69, 0x7c, + 0x6e, 0x6b, 0x53, 0x7f, 0x6a, 0xee, 0x73, 0x84, 0x4c, 0x3b, 0x6c, 0x68, + 0x78, 0x71, 0x45, 0x7d, 0x6e, 0x01, 0x7d, 0x2b, 0x3f, 0x2c, 0x6f, 0x8a, + 0x81, 0x6f, 0x3a, 0x30, 0x71, 0x0d, 0x85, 0x1f, 0x35, 0x24, 0x71, 0x59, + 0x47, 0x16, 0xbc, 0xe0, 0x73, 0x34, 0x48, 0x3c, 0xb4, 0xda, 0x74, 0x67, + 0x49, 0x28, 0xad, 0x2b, 0x74, 0xbf, 0x49, 0xe3, 0xa5, 0xdf, 0x74, 0xf8, + 0x4a, 0xce, 0x9e, 0x48, 0x74, 0x03, 0x4c, 0x3b, 0x95, 0x72, 0x73, 0x31, + 0x4e, 0x0e, 0x8c, 0x19, 0x72, 0x54, 0x50, 0x6f, 0x81, 0xb9, 0x71, 0x12, + 0x55, 0x51, 0x75, 0x9c, 0x70, 0xe3, 0x5a, 0x64, 0x6a, 0x5c, 0x71, 0x89, + 0x5f, 0x4f, 0x60, 0xa0, 0x72, 0x98, 0x64, 0x66, 0x58, 0xc2, 0x73, 0xdd, + 0x69, 0x68, 0x51, 0x18, 0x75, 0x65, 0x6e, 0xff, 0x4a, 0x66, 0x76, 0xb8, + 0x73, 0xde, 0x43, 0xb9, 0x78, 0x16, 0x78, 0x78, 0x3d, 0x92, 0x79, 0x93, + 0x7c, 0xf9, 0x37, 0xfd, 0x7f, 0x0c, 0x42, 0x1f, 0xc0, 0xc3, 0x7f, 0xd6, + 0x42, 0xf4, 0xb9, 0xd0, 0x80, 0xa2, 0x43, 0xd2, 0xb2, 0xd5, 0x80, 0xc9, + 0x44, 0x5d, 0xab, 0xcf, 0x80, 0x84, 0x44, 0xb2, 0xa4, 0xdc, 0x7f, 0xfb, + 0x45, 0x3d, 0x9d, 0x59, 0x7e, 0x91, 0x46, 0x32, 0x94, 0x87, 0x7d, 0x56, + 0x47, 0xdd, 0x8a, 0xaf, 0x7c, 0x51, 0x4a, 0x1d, 0x7f, 0xf8, 0x7b, 0xf2, + 0x50, 0x13, 0x73, 0x55, 0x7b, 0xc8, 0x55, 0x73, 0x67, 0xcb, 0x7c, 0x3a, + 0x5a, 0x5e, 0x5e, 0x37, 0x7d, 0x14, 0x5f, 0xc7, 0x56, 0x59, 0x7e, 0x1e, + 0x64, 0xd9, 0x4e, 0xfe, 0x7f, 0x82, 0x6a, 0x64, 0x48, 0xa6, 0x80, 0xfb, + 0x6f, 0x75, 0x42, 0x21, 0x82, 0x45, 0x74, 0x42, 0x3b, 0xc1, 0x8a, 0x0f, + 0x3e, 0x66, 0xc3, 0x42, 0x8a, 0xfe, 0x3e, 0xf3, 0xbc, 0xa8, 0x8b, 0x91, + 0x3f, 0x62, 0xb6, 0x98, 0x8c, 0x4a, 0x40, 0x07, 0xb0, 0x65, 0x8b, 0x98, + 0x40, 0x0f, 0xa9, 0xd0, 0x8a, 0xd2, 0x40, 0x10, 0xa3, 0x32, 0x89, 0xb5, + 0x40, 0x6b, 0x9b, 0x9d, 0x88, 0x43, 0x41, 0x23, 0x93, 0x0b, 0x87, 0x50, + 0x43, 0x06, 0x88, 0xa8, 0x86, 0x85, 0x45, 0xe3, 0x7d, 0x3d, 0x85, 0xfb, + 0x4b, 0x21, 0x70, 0xb3, 0x86, 0x85, 0x51, 0x5b, 0x64, 0x99, 0x86, 0xa7, + 0x56, 0x7f, 0x5b, 0xd2, 0x87, 0x2a, 0x5b, 0xa7, 0x54, 0x50, 0x88, 0x62, + 0x61, 0x05, 0x4d, 0x4e, 0x89, 0xb0, 0x66, 0x74, 0x46, 0xc2, 0x8b, 0x01, + 0x6b, 0x94, 0x3f, 0xe7, 0x93, 0x45, 0x3b, 0xb3, 0xc5, 0x53, 0x94, 0x37, + 0x3c, 0x35, 0xbe, 0xb3, 0x94, 0x82, 0x3c, 0x35, 0xb9, 0x42, 0x94, 0xd0, + 0x3c, 0x3e, 0xb3, 0xcb, 0x94, 0xc9, 0x3c, 0x36, 0xae, 0x1c, 0x93, 0xf0, + 0x3c, 0x08, 0xa7, 0xbf, 0x93, 0x0c, 0x3b, 0xce, 0xa1, 0x5f, 0x91, 0xfe, + 0x3c, 0x26, 0x99, 0x86, 0x90, 0xdc, 0x3c, 0xb6, 0x91, 0x32, 0x90, 0xd9, + 0x3f, 0x28, 0x86, 0x1e, 0x90, 0x79, 0x42, 0xb3, 0x7a, 0x3b, 0x8f, 0xee, + 0x47, 0xc5, 0x6e, 0x13, 0x90, 0x75, 0x4d, 0xc7, 0x61, 0x50, 0x90, 0xd1, + 0x53, 0x79, 0x59, 0xca, 0x91, 0x47, 0x58, 0x82, 0x52, 0xc1, 0x92, 0x64, + 0x5d, 0xb4, 0x4b, 0xa9, 0x93, 0xc0, 0x63, 0x06, 0x44, 0x74, 0x9b, 0x72, + 0x39, 0x82, 0xc6, 0xcb, 0x9c, 0x99, 0x3a, 0x16, 0xc0, 0x36, 0x9c, 0xd7, + 0x39, 0xfb, 0xbb, 0x29, 0x9d, 0x0f, 0x39, 0xe3, 0xb6, 0x21, 0x9d, 0x42, + 0x39, 0xc5, 0xb1, 0x23, 0x9c, 0xb1, 0x39, 0x8e, 0xab, 0x55, 0x9b, 0xd0, + 0x39, 0x4a, 0xa5, 0x38, 0x9a, 0xe0, 0x39, 0x0f, 0x9e, 0xdf, 0x99, 0xe1, + 0x39, 0x66, 0x96, 0xf0, 0x98, 0xf1, 0x3a, 0x06, 0x8e, 0xa2, 0x99, 0x01, + 0x3c, 0xec, 0x83, 0x4c, 0x99, 0x38, 0x40, 0xec, 0x77, 0x59, 0x98, 0xef, + 0x45, 0xeb, 0x6b, 0xb4, 0x99, 0x3d, 0x4b, 0xb4, 0x5f, 0xb7, 0x99, 0xf6, + 0x51, 0x3e, 0x58, 0x0d, 0x9a, 0x9d, 0x56, 0x0a, 0x51, 0x21, 0x9c, 0x03, + 0x5b, 0x03, 0x49, 0x9f, 0xa3, 0x4c, 0x37, 0x76, 0xc8, 0x1d, 0xa4, 0x37, + 0x37, 0xfb, 0xc1, 0xd3, 0xa4, 0x88, 0x37, 0xee, 0xbc, 0xb9, 0xa4, 0xad, + 0x37, 0xc3, 0xb7, 0xea, 0xa4, 0xcb, 0x37, 0x8f, 0xb3, 0x26, 0xa4, 0xa8, + 0x37, 0x5a, 0xae, 0x15, 0xa3, 0xfc, 0x37, 0x23, 0xa8, 0x4a, 0xa3, 0x43, + 0x36, 0xea, 0xa2, 0x78, 0xa2, 0x84, 0x36, 0xfc, 0x9b, 0xb3, 0xa1, 0xc3, + 0x37, 0x58, 0x94, 0x1e, 0xa1, 0x3d, 0x38, 0x99, 0x8b, 0x48, 0xa1, 0x2b, + 0x3b, 0x51, 0x80, 0x8a, 0xa1, 0xb6, 0x3f, 0x3b, 0x74, 0xe8, 0xa1, 0xa7, + 0x44, 0x74, 0x69, 0xb4, 0xa1, 0xe2, 0x4a, 0x0e, 0x5e, 0x8b, 0xa2, 0x9d, + 0x4f, 0x26, 0x56, 0x89, 0xa3, 0x87, 0x53, 0xe4, 0x4f, 0x22, 0xaa, 0xdd, + 0x35, 0x8b, 0xc9, 0x11, 0xab, 0x91, 0x36, 0x06, 0xc3, 0x33, 0xab, 0xef, + 0x36, 0x12, 0xbd, 0xff, 0xab, 0xfc, 0x35, 0xcd, 0xb9, 0x50, 0xab, 0xfe, + 0x35, 0x79, 0xb4, 0xb1, 0xab, 0xfa, 0x35, 0x20, 0xb0, 0x19, 0xab, 0x77, + 0x34, 0xef, 0xaa, 0xab, 0xaa, 0xe6, 0x34, 0xb9, 0xa5, 0x35, 0xaa, 0x48, + 0x34, 0x7d, 0x9f, 0xaf, 0xa9, 0xb1, 0x34, 0xd6, 0x98, 0x5d, 0xa9, 0x16, + 0x35, 0x33, 0x91, 0x0b, 0xa8, 0xc0, 0x36, 0xda, 0x87, 0xf9, 0xa8, 0xa1, + 0x39, 0x25, 0x7e, 0x25, 0xa8, 0xeb, 0x3d, 0x4b, 0x73, 0x1a, 0xa9, 0x15, + 0x42, 0x8c, 0x68, 0x1d, 0xa9, 0x84, 0x47, 0xf7, 0x5d, 0x83, 0xaa, 0x71, + 0x4c, 0xfe, 0x54, 0xc6, 0xb3, 0x22, 0x33, 0x68, 0xca, 0x2b, 0xb3, 0x47, + 0x34, 0x19, 0xc4, 0x82, 0xb3, 0xad, 0x34, 0x5f, 0xbf, 0x3d, 0xb3, 0xa4, + 0x34, 0x02, 0xba, 0xaa, 0xb3, 0x89, 0x33, 0x97, 0xb6, 0x26, 0xb3, 0x71, + 0x33, 0x1d, 0xb1, 0xad, 0xb3, 0x21, 0x32, 0xce, 0xac, 0xc8, 0xb2, 0xc5, + 0x32, 0x93, 0xa7, 0xa6, 0xb2, 0x5b, 0x32, 0x58, 0xa2, 0x80, 0xb1, 0xd1, + 0x32, 0x66, 0x9c, 0x6e, 0xb1, 0x73, 0x32, 0xba, 0x95, 0x55, 0xb0, 0xe9, + 0x33, 0x59, 0x8d, 0xfc, 0xb0, 0x93, 0x35, 0x03, 0x85, 0x4f, 0xb0, 0x5d, + 0x37, 0x70, 0x7b, 0xfb, 0xb0, 0x90, 0x3b, 0x8e, 0x71, 0x7f, 0xb0, 0xa9, + 0x40, 0xb5, 0x66, 0xc4, 0xb1, 0x41, 0x45, 0xf7, 0x5c, 0x48, 0x15, 0x13, + 0x94, 0x44, 0x8c, 0x12, 0x17, 0x79, 0x96, 0x25, 0x83, 0xc9, 0x19, 0x58, + 0x98, 0x89, 0x7b, 0x84, 0x1a, 0xdf, 0x9b, 0x20, 0x73, 0x51, 0x1c, 0x5a, + 0x9e, 0x00, 0x6a, 0xa6, 0x1d, 0x9c, 0xa0, 0xde, 0x61, 0x3c, 0x20, 0x01, + 0xa4, 0x77, 0x59, 0xe3, 0x22, 0x07, 0xa7, 0xde, 0x52, 0x5a, 0x24, 0x76, + 0xaa, 0xc9, 0x4c, 0x22, 0x27, 0x02, 0xad, 0x41, 0x46, 0x03, 0x29, 0xbe, + 0xaf, 0x35, 0x3f, 0xf6, 0x2c, 0xbd, 0xb0, 0xb8, 0x3c, 0x17, 0x2f, 0x24, + 0xb2, 0x61, 0x38, 0x75, 0x32, 0x19, 0xb3, 0x7d, 0x34, 0xff, 0x35, 0x5a, + 0xb4, 0x3d, 0x31, 0x8f, 0x38, 0x33, 0xb5, 0x49, 0x2d, 0xeb, 0x3b, 0x0c, + 0xb6, 0x61, 0x2a, 0x6a, 0x1d, 0x9e, 0x8c, 0x70, 0x90, 0x49, 0x20, 0x0b, + 0x8e, 0x49, 0x87, 0x7f, 0x22, 0x35, 0x90, 0x53, 0x7e, 0xdc, 0x23, 0xd9, + 0x93, 0x03, 0x76, 0x77, 0x25, 0x5a, 0x95, 0xcd, 0x6e, 0x07, 0x26, 0xe1, + 0x99, 0x09, 0x64, 0xf2, 0x28, 0xa1, 0x9c, 0x68, 0x5c, 0x27, 0x2b, 0x01, + 0xa0, 0x02, 0x53, 0xc0, 0x2d, 0x4d, 0xa3, 0x6c, 0x4c, 0xe8, 0x2f, 0xc4, + 0xa6, 0x78, 0x46, 0xa7, 0x32, 0x31, 0xa8, 0xfa, 0x40, 0x78, 0x34, 0xe3, + 0xaa, 0xbe, 0x3c, 0xd4, 0x37, 0xc3, 0xac, 0x46, 0x39, 0x5e, 0x3a, 0xbf, + 0xad, 0x96, 0x36, 0x06, 0x3d, 0xca, 0xae, 0xb3, 0x32, 0xbb, 0x40, 0xb8, + 0xaf, 0xb4, 0x2f, 0x70, 0x43, 0x1c, 0xb0, 0xf8, 0x2c, 0x02, 0x25, 0xd7, + 0x85, 0x55, 0x94, 0xea, 0x28, 0x87, 0x86, 0x72, 0x8c, 0x39, 0x2a, 0xf0, + 0x87, 0xd1, 0x83, 0xcd, 0x2c, 0xa5, 0x8a, 0x62, 0x7a, 0xee, 0x2d, 0xf2, + 0x8d, 0x7b, 0x71, 0xc7, 0x2f, 0xa5, 0x91, 0x21, 0x68, 0xa5, 0x31, 0x4f, + 0x94, 0x62, 0x5f, 0xb5, 0x33, 0x2e, 0x98, 0x1e, 0x57, 0x97, 0x35, 0x4b, + 0x9b, 0xa9, 0x4f, 0x73, 0x38, 0x1e, 0x9f, 0x5f, 0x48, 0xd8, 0x3a, 0x72, + 0xa2, 0x6d, 0x42, 0x5b, 0x3c, 0xc9, 0xa4, 0xc1, 0x3d, 0xf0, 0x3f, 0x59, + 0xa6, 0xb6, 0x3a, 0x73, 0x42, 0x04, 0xa8, 0x5e, 0x37, 0x1d, 0x44, 0xa8, + 0xa9, 0xcf, 0x33, 0xca, 0x47, 0x33, 0xab, 0x17, 0x30, 0x61, 0x49, 0xb1, + 0xac, 0x4b, 0x2d, 0x10, 0x2e, 0x6b, 0x7e, 0x09, 0x99, 0xd8, 0x30, 0xf1, + 0x7e, 0xf5, 0x90, 0xf9, 0x33, 0xa6, 0x7f, 0xd0, 0x88, 0xae, 0x36, 0x71, + 0x80, 0x80, 0x80, 0x80, 0x37, 0x81, 0x84, 0x63, 0x77, 0x1d, 0x38, 0xb7, + 0x87, 0xee, 0x6d, 0xd9, 0x3a, 0x4a, 0x8b, 0xd8, 0x64, 0x9c, 0x3c, 0x12, + 0x8f, 0xbe, 0x5b, 0xe4, 0x3d, 0xb7, 0x93, 0x84, 0x53, 0xb8, 0x3f, 0xc0, + 0x97, 0x5a, 0x4c, 0x68, 0x42, 0x23, 0x9b, 0x00, 0x45, 0xda, 0x44, 0x9c, + 0x9e, 0x2c, 0x3f, 0xab, 0x47, 0x16, 0xa0, 0xc9, 0x3c, 0x05, 0x49, 0x6b, + 0xa2, 0xdd, 0x38, 0x8b, 0x4b, 0xbe, 0xa4, 0xac, 0x35, 0x16, 0x4e, 0x05, + 0xa6, 0x44, 0x31, 0x9b, 0x50, 0x68, 0xa7, 0xae, 0x2e, 0x22, 0x38, 0xda, + 0x75, 0xbb, 0x9f, 0x72, 0x3b, 0x57, 0x76, 0x8a, 0x96, 0xe4, 0x3d, 0xc2, + 0x77, 0x6e, 0x8e, 0x86, 0x3f, 0xbc, 0x78, 0xf8, 0x86, 0x02, 0x41, 0x83, + 0x7b, 0x00, 0x7d, 0x22, 0x42, 0x8f, 0x7e, 0x79, 0x73, 0x86, 0x43, 0xd3, + 0x82, 0x77, 0x6a, 0x44, 0x45, 0x2c, 0x86, 0x54, 0x61, 0x38, 0x46, 0xa4, + 0x8a, 0x9d, 0x58, 0xda, 0x48, 0x60, 0x8e, 0x86, 0x50, 0xb9, 0x4a, 0x66, + 0x92, 0xac, 0x4a, 0x3e, 0x4c, 0x7c, 0x96, 0x53, 0x43, 0xc0, 0x4e, 0xa4, + 0x99, 0x79, 0x3e, 0x76, 0x50, 0xe4, 0x9c, 0x51, 0x3a, 0x8a, 0x53, 0x3f, + 0x9e, 0xdf, 0x36, 0xc5, 0x55, 0x6f, 0xa0, 0xf9, 0x33, 0x20, 0x57, 0xa1, + 0xa2, 0xb9, 0x2f, 0x6c, 0x44, 0x29, 0x6d, 0x4a, 0xa5, 0x3b, 0x46, 0xb5, + 0x6d, 0xf9, 0x9c, 0xe0, 0x48, 0xc0, 0x6e, 0xff, 0x94, 0x85, 0x4a, 0x7f, + 0x70, 0x93, 0x8b, 0xde, 0x4b, 0xe1, 0x72, 0x9f, 0x83, 0x32, 0x4c, 0xc5, + 0x75, 0x69, 0x79, 0xe1, 0x4d, 0x88, 0x78, 0xb6, 0x70, 0x4a, 0x4e, 0xd1, + 0x7c, 0xdc, 0x67, 0x4a, 0x50, 0x5f, 0x80, 0xd3, 0x5e, 0x8b, 0x51, 0x8f, + 0x85, 0x65, 0x56, 0x3f, 0x53, 0x15, 0x89, 0x96, 0x4e, 0x95, 0x54, 0xf1, + 0x8d, 0xea, 0x48, 0x3a, 0x56, 0xf6, 0x91, 0xc0, 0x41, 0xb8, 0x58, 0xd5, + 0x94, 0xfa, 0x3d, 0x10, 0x5a, 0xcd, 0x97, 0xd0, 0x39, 0x02, 0x5c, 0xd3, + 0x9a, 0x5b, 0x35, 0x11, 0x5e, 0xf4, 0x9c, 0xb3, 0x31, 0x16, 0x4f, 0xce, + 0x64, 0xbb, 0xab, 0x81, 0x52, 0xcf, 0x65, 0xb0, 0xa3, 0x3d, 0x54, 0xa0, + 0x66, 0xc4, 0x9b, 0x19, 0x55, 0xd8, 0x67, 0xfc, 0x92, 0xd6, 0x56, 0x92, + 0x6a, 0x01, 0x89, 0xc3, 0x57, 0x78, 0x6c, 0x63, 0x80, 0x90, 0x58, 0x16, + 0x6f, 0xec, 0x76, 0xbc, 0x58, 0xab, 0x73, 0x77, 0x6d, 0x72, 0x59, 0xa0, + 0x77, 0x8a, 0x64, 0x9d, 0x5a, 0xeb, 0x7b, 0xe0, 0x5c, 0x14, 0x5c, 0xa2, + 0x80, 0x6d, 0x53, 0xfd, 0x5d, 0xfc, 0x84, 0xde, 0x4c, 0xb7, 0x5f, 0x8d, + 0x89, 0x3b, 0x46, 0x3c, 0x61, 0x60, 0x8d, 0x1b, 0x3f, 0xf7, 0x63, 0x30, + 0x90, 0x7c, 0x3b, 0x8e, 0x64, 0xda, 0x93, 0x70, 0x37, 0x29, 0x66, 0xb6, + 0x96, 0x30, 0x32, 0xa9, 0x5b, 0x61, 0x5b, 0xe5, 0xb1, 0xf8, 0x5e, 0x05, + 0x5d, 0x0c, 0xa9, 0xc4, 0x60, 0xeb, 0x5e, 0x40, 0xa1, 0xc0, 0x61, 0xe6, + 0x5f, 0xc5, 0x99, 0x57, 0x62, 0x65, 0x61, 0x64, 0x90, 0xf0, 0x62, 0x58, + 0x63, 0xf8, 0x87, 0x41, 0x62, 0x95, 0x66, 0xcd, 0x7d, 0x96, 0x62, 0xd2, + 0x6a, 0x6f, 0x73, 0xb1, 0x63, 0xa1, 0x6e, 0x65, 0x6a, 0x98, 0x64, 0x95, + 0x72, 0x52, 0x62, 0x01, 0x65, 0xab, 0x77, 0x01, 0x59, 0xb6, 0x67, 0x2e, + 0x7b, 0x72, 0x51, 0xc9, 0x68, 0xcb, 0x80, 0x2f, 0x4a, 0xe7, 0x6a, 0x0e, + 0x84, 0x95, 0x44, 0x47, 0x6b, 0x92, 0x88, 0x75, 0x3e, 0x6e, 0x6d, 0x31, + 0x8b, 0xf5, 0x39, 0xac, 0x6e, 0xfb, 0x8f, 0x49, 0x34, 0xba, 0x68, 0x34, + 0x54, 0x33, 0xb8, 0x06, 0x6b, 0x14, 0x55, 0xbc, 0xaf, 0x5a, 0x6c, 0xa7, + 0x56, 0xdd, 0xa7, 0xb9, 0x6e, 0x6f, 0x57, 0xf6, 0xa0, 0x12, 0x6e, 0x11, + 0x59, 0x7d, 0x97, 0x97, 0x6d, 0xf0, 0x5b, 0x2c, 0x8e, 0xef, 0x6d, 0x91, + 0x5d, 0xec, 0x84, 0xd3, 0x6d, 0x6b, 0x61, 0x76, 0x7a, 0x71, 0x6d, 0x7f, + 0x65, 0x33, 0x70, 0x6b, 0x6e, 0x30, 0x69, 0x58, 0x67, 0x90, 0x6f, 0x46, + 0x6d, 0x5e, 0x5f, 0x2d, 0x70, 0x7e, 0x72, 0x4f, 0x57, 0x61, 0x71, 0xc1, + 0x76, 0xa6, 0x4f, 0xb1, 0x73, 0x15, 0x7b, 0x6c, 0x49, 0x01, 0x74, 0x83, + 0x7f, 0xf5, 0x42, 0x5f, 0x75, 0xc9, 0x83, 0xf1, 0x3c, 0xab, 0x77, 0x44, + 0x87, 0x9e, 0x37, 0x50, 0x74, 0x76, 0x4d, 0x3b, 0xbd, 0xdd, 0x77, 0x17, + 0x4e, 0x95, 0xb5, 0x1c, 0x78, 0xf1, 0x4f, 0xd6, 0xac, 0xec, 0x79, 0xbb, + 0x50, 0xf9, 0xa5, 0xba, 0x7a, 0x50, 0x52, 0x26, 0x9e, 0x4c, 0x79, 0xae, + 0x53, 0xa1, 0x95, 0xf5, 0x79, 0x25, 0x55, 0x50, 0x8d, 0x31, 0x78, 0x80, + 0x57, 0xaa, 0x83, 0x36, 0x78, 0x12, 0x5b, 0xd4, 0x78, 0x0f, 0x78, 0x32, + 0x60, 0x4f, 0x6d, 0x56, 0x78, 0xd9, 0x64, 0x5a, 0x64, 0xb0, 0x79, 0xc6, + 0x68, 0xbc, 0x5c, 0x9f, 0x7a, 0xf7, 0x6d, 0x95, 0x55, 0x12, 0x7c, 0x39, + 0x72, 0x32, 0x4d, 0xdb, 0x7d, 0x5b, 0x76, 0xc8, 0x47, 0x3a, 0x7e, 0x93, + 0x7b, 0x1c, 0x40, 0x98, 0x7f, 0xff, 0x7f, 0x95, 0x3a, 0x8f, 0x81, 0x7f, + 0x47, 0xd0, 0xc2, 0x1a, 0x82, 0xb1, 0x48, 0xd3, 0xba, 0x86, 0x83, 0xfa, + 0x49, 0xd8, 0xb2, 0xfc, 0x84, 0x9b, 0x4a, 0xac, 0xab, 0xb1, 0x84, 0xde, + 0x4b, 0x6d, 0xa4, 0x98, 0x84, 0xde, 0x4c, 0x71, 0x9c, 0xf8, 0x84, 0x45, + 0x4d, 0xd8, 0x94, 0x73, 0x83, 0xc2, 0x4f, 0x8d, 0x8b, 0x3e, 0x83, 0x1f, + 0x51, 0x6e, 0x81, 0x74, 0x82, 0xbb, 0x56, 0x63, 0x75, 0xd2, 0x82, 0xe1, + 0x5b, 0x38, 0x6b, 0x00, 0x83, 0xa6, 0x5f, 0x84, 0x61, 0xd9, 0x84, 0x56, + 0x64, 0x3d, 0x5a, 0x2d, 0x85, 0x62, 0x68, 0xd7, 0x52, 0xce, 0x86, 0xbf, + 0x6d, 0xc0, 0x4b, 0xf9, 0x87, 0xd0, 0x72, 0x9b, 0x45, 0x37, 0x88, 0xdc, + 0x77, 0x6f, 0x3e, 0x30, 0x8c, 0xfb, 0x43, 0x7b, 0xc4, 0xd2, 0x8e, 0x1a, + 0x44, 0x60, 0xbd, 0x8e, 0x8e, 0xd7, 0x45, 0x08, 0xb7, 0x28, 0x8f, 0xa6, + 0x45, 0xc1, 0xb0, 0xab, 0x8f, 0x74, 0x46, 0x29, 0xa9, 0xed, 0x8f, 0x3a, + 0x46, 0x97, 0xa3, 0x21, 0x8e, 0xaf, 0x47, 0x61, 0x9b, 0x80, 0x8d, 0xea, + 0x48, 0x88, 0x93, 0x20, 0x8d, 0x71, 0x4a, 0x4f, 0x89, 0x64, 0x8d, 0x0c, + 0x4c, 0x87, 0x7e, 0xf7, 0x8d, 0x39, 0x51, 0xa1, 0x73, 0x3c, 0x8d, 0x62, + 0x56, 0xd2, 0x68, 0x42, 0x8e, 0x24, 0x5b, 0x67, 0x5f, 0x1e, 0x8e, 0xc3, + 0x60, 0x3d, 0x57, 0xf4, 0x8f, 0xbb, 0x64, 0x92, 0x50, 0xdd, 0x90, 0xf9, + 0x69, 0xb0, 0x49, 0xff, 0x92, 0x50, 0x6e, 0xfe, 0x42, 0x51, 0x95, 0xfc, + 0x3f, 0xfa, 0xc8, 0x09, 0x97, 0xb8, 0x40, 0xf7, 0xbf, 0x62, 0x98, 0x30, + 0x41, 0x53, 0xb9, 0xb2, 0x98, 0xae, 0x41, 0xbb, 0xb3, 0xfa, 0x98, 0xee, + 0x42, 0x10, 0xae, 0x0f, 0x98, 0x8e, 0x42, 0x38, 0xa7, 0xa8, 0x98, 0x33, + 0x42, 0x64, 0xa1, 0x3f, 0x97, 0x86, 0x43, 0x0c, 0x99, 0x96, 0x96, 0xce, + 0x43, 0xe5, 0x91, 0x8f, 0x96, 0x86, 0x46, 0x52, 0x87, 0x18, 0x96, 0x5d, + 0x49, 0x77, 0x7c, 0x14, 0x96, 0xb4, 0x4e, 0x01, 0x70, 0xba, 0x97, 0x15, + 0x53, 0x6a, 0x65, 0x2b, 0x97, 0xa1, 0x58, 0x3e, 0x5c, 0xe9, 0x98, 0x5c, + 0x5c, 0xe5, 0x55, 0xcb, 0x99, 0x81, 0x61, 0x35, 0x4e, 0x6a, 0x9b, 0x29, + 0x66, 0xc5, 0x46, 0x50, 0x9e, 0x5b, 0x3d, 0xa8, 0xc8, 0x5d, 0xa0, 0x13, + 0x3e, 0x55, 0xc1, 0x1d, 0xa0, 0x93, 0x3e, 0x7a, 0xbb, 0xa6, 0xa0, 0xec, + 0x3e, 0x95, 0xb6, 0x6e, 0xa1, 0x47, 0x3e, 0xb1, 0xb1, 0x3a, 0xa1, 0x16, + 0x3e, 0xc1, 0xab, 0x5c, 0xa0, 0xb9, 0x3e, 0xc9, 0xa5, 0x49, 0xa0, 0x58, + 0x3e, 0xdb, 0x9f, 0x09, 0x9f, 0xd5, 0x3f, 0x50, 0x97, 0x87, 0x9f, 0x41, + 0x3f, 0xd0, 0x8f, 0xfc, 0x9f, 0x31, 0x43, 0x6e, 0x84, 0x88, 0x9f, 0x59, + 0x47, 0x30, 0x79, 0x53, 0x9f, 0xc8, 0x4b, 0x89, 0x6e, 0x37, 0xa0, 0x47, + 0x50, 0xcf, 0x61, 0xe8, 0xa0, 0xc2, 0x55, 0xa6, 0x5a, 0xf0, 0xa1, 0x93, + 0x5a, 0x1c, 0x53, 0xd1, 0xa3, 0x11, 0x5e, 0x9a, 0x4b, 0x9e, 0xa5, 0xf4, + 0x3b, 0x52, 0xc9, 0xb3, 0xa7, 0x1c, 0x3b, 0xd5, 0xc3, 0x25, 0xa7, 0xc9, + 0x3c, 0x0c, 0xbd, 0x7b, 0xa8, 0x16, 0x3c, 0x08, 0xb8, 0x7d, 0xa8, 0x5f, + 0x3c, 0x04, 0xb3, 0x86, 0xa8, 0x7a, 0x3c, 0x03, 0xae, 0x52, 0xa8, 0x14, + 0x3c, 0x0d, 0xa8, 0x71, 0xa7, 0xae, 0x3c, 0x14, 0xa2, 0x8f, 0xa7, 0x47, + 0x3c, 0x58, 0x9b, 0xe5, 0xa6, 0xe5, 0x3c, 0xd9, 0x94, 0x92, 0xa6, 0xa1, + 0x3e, 0x05, 0x8c, 0x46, 0xa6, 0xab, 0x40, 0x88, 0x81, 0xf8, 0xa6, 0xfa, + 0x44, 0x93, 0x77, 0x0f, 0xa7, 0x59, 0x49, 0x19, 0x6c, 0x29, 0xa7, 0xc1, + 0x4e, 0x58, 0x60, 0x69, 0xa8, 0xac, 0x53, 0x15, 0x58, 0xdd, 0xaa, 0x05, + 0x58, 0x30, 0x50, 0x15, 0xad, 0x8d, 0x39, 0x3c, 0xca, 0xa6, 0xae, 0x6a, + 0x39, 0xb0, 0xc4, 0x96, 0xaf, 0x19, 0x39, 0xf4, 0xbe, 0xf0, 0xaf, 0x53, + 0x39, 0xd8, 0xba, 0x1b, 0xaf, 0x87, 0x39, 0xb5, 0xb5, 0x51, 0xaf, 0xb5, + 0x39, 0x90, 0xb0, 0x8a, 0xaf, 0x6f, 0x39, 0x8f, 0xab, 0x13, 0xaf, 0x17, + 0x39, 0x95, 0xa5, 0x7b, 0xae, 0xba, 0x39, 0x9b, 0x9f, 0xdd, 0xae, 0x74, + 0x3a, 0x18, 0x98, 0xc0, 0xae, 0x31, 0x3a, 0x9e, 0x91, 0xa7, 0xae, 0x08, + 0x3c, 0x15, 0x89, 0x0b, 0xad, 0xff, 0x3d, 0xf1, 0x7f, 0xb4, 0xae, 0x5e, + 0x42, 0x5c, 0x75, 0x13, 0xae, 0xd7, 0x46, 0xfd, 0x6a, 0x6d, 0xaf, 0x4f, + 0x4c, 0x16, 0x5f, 0x77, 0xb0, 0x83, 0x50, 0xc8, 0x56, 0x51, 0xb5, 0xb4, + 0x36, 0xe1, 0xcb, 0xef, 0xb6, 0x47, 0x37, 0x76, 0xc6, 0x48, 0xb6, 0xf8, + 0x38, 0x16, 0xc0, 0xac, 0xb7, 0x27, 0x37, 0xf3, 0xbb, 0xe5, 0xb7, 0x4a, + 0x37, 0xba, 0xb7, 0x39, 0xb7, 0x68, 0x37, 0x78, 0xb2, 0x93, 0xb7, 0x4f, + 0x37, 0x50, 0xad, 0xa2, 0xb7, 0x05, 0x37, 0x48, 0xa8, 0x49, 0xb6, 0xb5, + 0x37, 0x3e, 0xa2, 0xed, 0xb6, 0x64, 0x37, 0x64, 0x9c, 0xf2, 0xb6, 0x30, + 0x37, 0xc5, 0x96, 0x0c, 0xb5, 0xef, 0x38, 0x45, 0x8f, 0x19, 0xb5, 0xdd, + 0x39, 0xfe, 0x86, 0x76, 0xb5, 0xe8, 0x3c, 0x1f, 0x7d, 0x6e, 0xb6, 0x03, + 0x3f, 0xd9, 0x73, 0x3d, 0xb6, 0x59, 0x44, 0x7a, 0x68, 0xa6, 0xb7, 0x1b, + 0x49, 0x8a, 0x5d, 0xc8, 0x1b, 0xc4, 0x9a, 0x3f, 0x90, 0x63, 0x1d, 0xe5, + 0x9c, 0x39, 0x88, 0x2b, 0x1f, 0xaf, 0x9e, 0x45, 0x80, 0x1e, 0x20, 0xef, + 0xa0, 0xa2, 0x77, 0xf1, 0x22, 0x0e, 0xa2, 0xf9, 0x6f, 0xdf, 0x23, 0x3f, + 0xa5, 0xfa, 0x66, 0xb9, 0x24, 0x65, 0xa9, 0x3f, 0x5e, 0x35, 0x26, 0x52, + 0xac, 0x63, 0x56, 0x80, 0x28, 0x58, 0xae, 0xeb, 0x4e, 0xf0, 0x2b, 0x00, + 0xb0, 0xf5, 0x48, 0xd6, 0x2d, 0x2f, 0xb2, 0xe5, 0x42, 0x86, 0x30, 0x11, + 0xb4, 0x34, 0x3e, 0x20, 0x31, 0x77, 0xb6, 0x66, 0x3a, 0x75, 0x34, 0xba, + 0xb7, 0x29, 0x36, 0xe6, 0x38, 0xf8, 0xb7, 0x21, 0x33, 0x85, 0x3b, 0xeb, + 0xb7, 0xca, 0x30, 0x15, 0x3e, 0xdf, 0xb8, 0xc5, 0x2c, 0xb3, 0x23, 0x72, + 0x93, 0x30, 0x94, 0x5b, 0x26, 0x17, 0x94, 0x90, 0x8b, 0xc0, 0x28, 0x2a, + 0x96, 0x49, 0x83, 0x80, 0x29, 0xce, 0x98, 0x7d, 0x7b, 0x27, 0x2b, 0x07, + 0x9b, 0x12, 0x72, 0xc0, 0x2c, 0x4f, 0x9d, 0xe0, 0x69, 0x96, 0x2d, 0x90, + 0xa0, 0x84, 0x5f, 0xd7, 0x2f, 0xaa, 0xa4, 0x19, 0x58, 0x0b, 0x31, 0x66, + 0xa7, 0x39, 0x4f, 0xec, 0x33, 0xe9, 0xa9, 0xfc, 0x49, 0xd0, 0x36, 0x50, + 0xac, 0x48, 0x43, 0x5d, 0x39, 0x00, 0xae, 0x03, 0x3e, 0x8c, 0x3c, 0x0b, + 0xaf, 0x53, 0x3b, 0x1f, 0x3f, 0x0b, 0xb0, 0x72, 0x37, 0xd1, 0x41, 0xbb, + 0xb1, 0x85, 0x34, 0x8f, 0x44, 0x3c, 0xb2, 0x7e, 0x31, 0x35, 0x46, 0xa3, + 0xb3, 0x93, 0x2d, 0xc8, 0x2b, 0x25, 0x8c, 0x3c, 0x98, 0xe3, 0x2e, 0x18, + 0x8d, 0x16, 0x8f, 0xb5, 0x30, 0x2f, 0x8e, 0xbf, 0x87, 0x2c, 0x32, 0x1d, + 0x90, 0x9f, 0x7e, 0x99, 0x33, 0xb6, 0x93, 0x26, 0x76, 0x04, 0x35, 0x31, + 0x95, 0xed, 0x6d, 0x5e, 0x36, 0xb3, 0x98, 0xf7, 0x64, 0x2a, 0x38, 0x5c, + 0x9c, 0x3e, 0x5b, 0x61, 0x3a, 0x57, 0x9f, 0x95, 0x52, 0xcf, 0x3c, 0x85, + 0xa2, 0xce, 0x4b, 0xf3, 0x3e, 0xc3, 0xa5, 0x98, 0x45, 0xa1, 0x41, 0x0c, + 0xa7, 0xe2, 0x3f, 0xb2, 0x43, 0xbd, 0xa9, 0xa6, 0x3c, 0x58, 0x46, 0x64, + 0xab, 0x2d, 0x38, 0xfd, 0x48, 0xfb, 0xac, 0x82, 0x35, 0xa2, 0x4b, 0x7a, + 0xad, 0xad, 0x32, 0x3e, 0x4d, 0xf7, 0xae, 0xcd, 0x2e, 0xba, 0x33, 0x6c, + 0x85, 0x0f, 0x9d, 0xa4, 0x36, 0x57, 0x85, 0xb6, 0x94, 0xb2, 0x39, 0x16, + 0x86, 0x8b, 0x8c, 0x28, 0x3b, 0x6d, 0x87, 0xe9, 0x83, 0xa6, 0x3d, 0x01, + 0x8a, 0x70, 0x7a, 0xa6, 0x3e, 0x47, 0x8d, 0x53, 0x71, 0x77, 0x3f, 0xde, + 0x90, 0xbd, 0x68, 0x6d, 0x41, 0x6c, 0x93, 0xe0, 0x5f, 0xad, 0x43, 0x0f, + 0x97, 0x88, 0x57, 0x85, 0x44, 0xe1, 0x9a, 0xdf, 0x4f, 0x6d, 0x47, 0x3b, + 0x9e, 0x58, 0x48, 0xf5, 0x49, 0x89, 0xa1, 0x39, 0x42, 0x81, 0x4b, 0xbd, + 0xa3, 0x8e, 0x3e, 0x0c, 0x4e, 0x04, 0xa5, 0x8c, 0x3a, 0x84, 0x50, 0x48, + 0xa7, 0x43, 0x37, 0x05, 0x52, 0x88, 0xa8, 0xc5, 0x33, 0x89, 0x54, 0xdb, + 0xaa, 0x2f, 0x2f, 0xda, 0x3c, 0x15, 0x7d, 0x97, 0xa2, 0x3c, 0x3f, 0x19, + 0x7e, 0x0d, 0x99, 0xad, 0x42, 0x10, 0x7e, 0x80, 0x91, 0x62, 0x44, 0xa7, + 0x7f, 0x90, 0x88, 0xec, 0x47, 0x47, 0x80, 0x80, 0x80, 0x80, 0x48, 0x5c, + 0x84, 0x2b, 0x77, 0x28, 0x49, 0x8d, 0x87, 0x72, 0x6d, 0xfe, 0x4a, 0xe0, + 0x8b, 0x0c, 0x65, 0x00, 0x4c, 0x4e, 0x8e, 0xb7, 0x5c, 0x5c, 0x4d, 0xe9, + 0x92, 0x6a, 0x54, 0x6b, 0x4f, 0xaf, 0x96, 0x0c, 0x4d, 0x3b, 0x51, 0xc0, + 0x99, 0x8b, 0x46, 0xe2, 0x53, 0xf2, 0x9c, 0x90, 0x40, 0x77, 0x56, 0x29, + 0x9f, 0x47, 0x3c, 0x78, 0x58, 0x36, 0xa1, 0x80, 0x38, 0xc7, 0x5a, 0x2d, + 0xa3, 0x5f, 0x35, 0x27, 0x5c, 0x54, 0xa5, 0x2e, 0x31, 0x28, 0x47, 0x10, + 0x75, 0x2b, 0xa7, 0xe4, 0x4a, 0x6a, 0x75, 0x77, 0x9f, 0x78, 0x4c, 0xdf, + 0x76, 0x52, 0x97, 0x25, 0x4f, 0x47, 0x77, 0x43, 0x8e, 0xc3, 0x51, 0x16, + 0x78, 0xf2, 0x86, 0x20, 0x52, 0xaf, 0x7a, 0xfa, 0x7d, 0x44, 0x53, 0x99, + 0x7e, 0x3d, 0x73, 0xd9, 0x54, 0xca, 0x81, 0xd4, 0x6a, 0xe3, 0x55, 0xfd, + 0x85, 0x5b, 0x62, 0x2a, 0x57, 0x52, 0x89, 0x60, 0x59, 0xe6, 0x58, 0xf5, + 0x8d, 0x29, 0x51, 0xf3, 0x5a, 0xb6, 0x91, 0x2c, 0x4b, 0x48, 0x5c, 0x78, + 0x94, 0xd6, 0x44, 0xe2, 0x5e, 0x51, 0x97, 0xfc, 0x3f, 0x12, 0x60, 0x32, + 0x9a, 0xae, 0x3b, 0x08, 0x62, 0x25, 0x9d, 0x1c, 0x37, 0x06, 0x64, 0x42, + 0x9f, 0x69, 0x32, 0xd8, 0x52, 0x72, 0x6c, 0x79, 0xad, 0xce, 0x55, 0xb0, + 0x6d, 0x06, 0xa5, 0x70, 0x58, 0x70, 0x6d, 0xc7, 0x9d, 0x25, 0x5a, 0x40, + 0x6e, 0xfd, 0x94, 0x8e, 0x5b, 0xd8, 0x70, 0xb5, 0x8b, 0xcb, 0x5d, 0x2b, + 0x72, 0xc7, 0x83, 0x31, 0x5e, 0x05, 0x75, 0x83, 0x7a, 0x22, 0x5e, 0xcb, + 0x78, 0xad, 0x70, 0xec, 0x5f, 0xd6, 0x7c, 0x67, 0x68, 0x32, 0x61, 0x29, + 0x80, 0x05, 0x5f, 0xa6, 0x62, 0x76, 0x84, 0x45, 0x57, 0xa2, 0x64, 0x00, + 0x88, 0x1c, 0x4f, 0xcf, 0x65, 0x7e, 0x8c, 0x53, 0x49, 0x5b, 0x67, 0x46, + 0x90, 0x0e, 0x43, 0x04, 0x68, 0xc8, 0x93, 0x4b, 0x3d, 0xb3, 0x6a, 0x61, + 0x96, 0x2a, 0x39, 0x33, 0x6c, 0x42, 0x98, 0xf2, 0x34, 0x5d, 0x5e, 0x11, + 0x63, 0x3f, 0xb3, 0xce, 0x61, 0x34, 0x64, 0x5a, 0xab, 0x80, 0x64, 0x4f, + 0x65, 0x74, 0xa3, 0x69, 0x66, 0x07, 0x66, 0xc6, 0x9b, 0x14, 0x67, 0x0d, + 0x68, 0x47, 0x92, 0x90, 0x67, 0xc8, 0x6a, 0x6f, 0x89, 0x83, 0x68, 0xaa, + 0x6c, 0xba, 0x80, 0x84, 0x69, 0x45, 0x70, 0x2f, 0x77, 0x01, 0x69, 0xe8, + 0x73, 0x86, 0x6e, 0x00, 0x6a, 0xe0, 0x77, 0x2d, 0x65, 0x84, 0x6c, 0x28, + 0x7b, 0x0d, 0x5d, 0x47, 0x6d, 0xa9, 0x7f, 0x3a, 0x55, 0x8a, 0x6e, 0xee, + 0x83, 0x42, 0x4e, 0x14, 0x70, 0x21, 0x87, 0x8a, 0x47, 0x79, 0x71, 0xa0, + 0x8b, 0x4a, 0x41, 0x13, 0x73, 0x38, 0x8e, 0xb6, 0x3b, 0xf1, 0x74, 0xd1, + 0x91, 0xec, 0x36, 0xa2, 0x6a, 0x6d, 0x5b, 0x38, 0xba, 0x78, 0x6e, 0x23, + 0x5c, 0x9e, 0xb0, 0xd7, 0x70, 0x4a, 0x5d, 0x9b, 0xa8, 0xf3, 0x72, 0x50, + 0x5e, 0x8b, 0xa1, 0x18, 0x72, 0xc5, 0x60, 0x1d, 0x98, 0xa9, 0x73, 0x33, + 0x61, 0xd9, 0x90, 0x54, 0x73, 0x49, 0x64, 0x71, 0x86, 0xfe, 0x73, 0x9f, + 0x67, 0x31, 0x7d, 0xaa, 0x74, 0x08, 0x6a, 0xd3, 0x73, 0xf0, 0x74, 0xe6, + 0x6e, 0x91, 0x6b, 0x23, 0x75, 0xdb, 0x72, 0x30, 0x62, 0xdf, 0x76, 0xe6, + 0x76, 0x4c, 0x5a, 0xed, 0x78, 0x36, 0x7a, 0x49, 0x53, 0x55, 0x79, 0x97, + 0x7e, 0x69, 0x4c, 0x58, 0x7a, 0xab, 0x82, 0xbb, 0x45, 0xa6, 0x7b, 0xeb, + 0x86, 0x94, 0x3f, 0x48, 0x7d, 0x72, 0x8a, 0x59, 0x39, 0x6e, 0x77, 0x08, + 0x53, 0x9d, 0xbf, 0x75, 0x79, 0xd3, 0x55, 0x2a, 0xb6, 0xb0, 0x7c, 0x23, + 0x56, 0x80, 0xae, 0x6d, 0x7d, 0x53, 0x57, 0x92, 0xa7, 0x01, 0x7e, 0x89, + 0x58, 0xa6, 0x9f, 0x76, 0x7e, 0x71, 0x5a, 0x41, 0x97, 0x1b, 0x7e, 0x88, + 0x5c, 0x07, 0x8e, 0x87, 0x7e, 0x6d, 0x5e, 0xb8, 0x84, 0xae, 0x7e, 0x79, + 0x62, 0x0e, 0x7a, 0xa3, 0x7e, 0xbe, 0x65, 0xa7, 0x70, 0xbe, 0x7f, 0x96, + 0x69, 0x7e, 0x68, 0x5d, 0x80, 0xa0, 0x6d, 0x3b, 0x60, 0x4d, 0x81, 0xaf, + 0x71, 0xaf, 0x58, 0xbb, 0x82, 0xe7, 0x75, 0x86, 0x51, 0x3b, 0x83, 0xf9, + 0x79, 0xed, 0x4a, 0x6d, 0x85, 0x0d, 0x7e, 0x47, 0x43, 0xb6, 0x86, 0x4c, + 0x82, 0xca, 0x3c, 0xc1, 0x83, 0x8d, 0x4d, 0x13, 0xc4, 0x8b, 0x85, 0x6e, + 0x4e, 0x66, 0xbb, 0x79, 0x87, 0x33, 0x4f, 0x88, 0xb3, 0x6b, 0x88, 0x54, + 0x50, 0xb0, 0xab, 0xf4, 0x89, 0x05, 0x51, 0xd5, 0xa4, 0xe3, 0x89, 0x79, + 0x53, 0x18, 0x9d, 0x69, 0x89, 0x4a, 0x54, 0xa1, 0x95, 0x40, 0x89, 0x29, + 0x56, 0x63, 0x8c, 0x88, 0x88, 0xf5, 0x58, 0xb8, 0x82, 0xc8, 0x88, 0xf8, + 0x5c, 0xc4, 0x78, 0x00, 0x89, 0x44, 0x60, 0xe0, 0x6d, 0xba, 0x8a, 0x36, + 0x64, 0xbe, 0x65, 0x74, 0x8b, 0x3c, 0x68, 0xc1, 0x5d, 0xa7, 0x8c, 0x77, + 0x6c, 0xf8, 0x56, 0x75, 0x8e, 0x07, 0x70, 0xd8, 0x4f, 0x51, 0x8e, 0x8c, + 0x75, 0xc2, 0x48, 0x5c, 0x8f, 0x63, 0x7b, 0x01, 0x40, 0x4e, 0x8e, 0xde, + 0x48, 0x93, 0xc7, 0xe9, 0x90, 0xaa, 0x49, 0x9b, 0xbe, 0xc1, 0x91, 0x9a, + 0x4a, 0x61, 0xb8, 0x02, 0x92, 0xa8, 0x4b, 0x40, 0xb1, 0x27, 0x93, 0x09, + 0x4b, 0xfd, 0xaa, 0x3c, 0x93, 0x67, 0x4c, 0xca, 0xa3, 0x45, 0x93, 0x80, + 0x4d, 0xe2, 0x9b, 0xa0, 0x93, 0x60, 0x4f, 0x48, 0x93, 0x64, 0x93, 0x31, + 0x51, 0x08, 0x8a, 0x3e, 0x92, 0xf2, 0x53, 0x1c, 0x80, 0x81, 0x93, 0x2c, + 0x57, 0xd4, 0x75, 0x97, 0x93, 0x9e, 0x5c, 0x4c, 0x6b, 0x58, 0x94, 0xa5, + 0x60, 0x5f, 0x62, 0x90, 0x95, 0x79, 0x64, 0x96, 0x5b, 0x35, 0x96, 0xb4, + 0x68, 0x9b, 0x54, 0x12, 0x98, 0x42, 0x6c, 0xc7, 0x4c, 0xe0, 0x99, 0x80, + 0x72, 0x1d, 0x44, 0xbd, 0x97, 0xcc, 0x44, 0x79, 0xcb, 0xb3, 0x9a, 0x37, + 0x45, 0xde, 0xc1, 0x0d, 0x9b, 0x0c, 0x46, 0x68, 0xba, 0xe6, 0x9b, 0xd2, + 0x46, 0xf8, 0xb4, 0xdd, 0x9c, 0x7d, 0x47, 0x86, 0xae, 0xb7, 0x9c, 0x8d, + 0x47, 0xfc, 0xa8, 0x1c, 0x9c, 0xb5, 0x48, 0x7f, 0xa1, 0x7b, 0x9c, 0x89, + 0x49, 0x64, 0x99, 0xd6, 0x9c, 0x58, 0x4a, 0x75, 0x91, 0xdf, 0x9c, 0x48, + 0x4c, 0xa1, 0x88, 0x02, 0x9c, 0x5b, 0x4f, 0x33, 0x7d, 0xb7, 0x9c, 0xd1, + 0x53, 0xbc, 0x73, 0x0a, 0x9d, 0x53, 0x58, 0x87, 0x68, 0xd0, 0x9e, 0x4a, + 0x5c, 0xa7, 0x5f, 0xe6, 0x9f, 0x43, 0x60, 0xed, 0x58, 0xb3, 0xa0, 0x92, + 0x64, 0xd1, 0x51, 0x87, 0xa2, 0x91, 0x6a, 0x2f, 0x48, 0x85, 0xa0, 0x6f, + 0x41, 0x6a, 0xcc, 0x1b, 0xa2, 0x96, 0x42, 0x82, 0xc3, 0x03, 0xa3, 0x8b, + 0x42, 0xfd, 0xbc, 0xdd, 0xa4, 0x16, 0x43, 0x50, 0xb7, 0x62, 0xa4, 0xa7, + 0x43, 0xa8, 0xb1, 0xe4, 0xa4, 0xcb, 0x44, 0x00, 0xab, 0xdf, 0xa4, 0xbb, + 0x44, 0x57, 0xa5, 0x94, 0xa4, 0xb2, 0x44, 0xc1, 0x9f, 0x20, 0xa4, 0x87, + 0x45, 0x95, 0x97, 0x98, 0xa4, 0x68, 0x46, 0x7b, 0x90, 0x02, 0xa4, 0x7a, + 0x49, 0x28, 0x85, 0xa2, 0xa4, 0xc0, 0x4c, 0x3f, 0x7b, 0x30, 0xa5, 0x5d, + 0x4f, 0xef, 0x70, 0x89, 0xa5, 0xda, 0x55, 0x41, 0x66, 0x31, 0xa6, 0xc9, + 0x59, 0xae, 0x5d, 0xbb, 0xa7, 0xf1, 0x5d, 0xfa, 0x56, 0x20, 0xa9, 0xeb, + 0x62, 0x8f, 0x4d, 0x34, 0xa8, 0x7d, 0x3e, 0xff, 0xcb, 0x7e, 0xa9, 0xdb, + 0x3f, 0x7d, 0xc4, 0xb2, 0xaa, 0xea, 0x3f, 0xd8, 0xbe, 0x80, 0xab, 0x67, + 0x3f, 0xff, 0xb9, 0x5c, 0xab, 0xe9, 0x40, 0x2c, 0xb4, 0x3e, 0xac, 0x53, + 0x40, 0x64, 0xae, 0xfa, 0xac, 0x21, 0x40, 0xb1, 0xa8, 0xef, 0xab, 0xf7, + 0x41, 0x05, 0xa2, 0xde, 0xab, 0xdc, 0x41, 0x93, 0x9c, 0x39, 0xab, 0xd0, + 0x42, 0x5f, 0x95, 0x03, 0xab, 0xda, 0x43, 0xa6, 0x8d, 0x0d, 0xac, 0x06, + 0x45, 0xf3, 0x83, 0x3f, 0xac, 0x73, 0x49, 0x6a, 0x78, 0xf0, 0xad, 0x09, + 0x4d, 0x3e, 0x6e, 0x61, 0xad, 0x99, 0x52, 0x73, 0x63, 0xb7, 0xae, 0xd3, + 0x56, 0xf9, 0x5b, 0x9b, 0xb0, 0xc5, 0x5c, 0x89, 0x50, 0xf6, 0xb0, 0x31, + 0x3c, 0xcd, 0xcc, 0x6e, 0xb1, 0x39, 0x3d, 0x2f, 0xc6, 0x51, 0xb2, 0x52, + 0x3d, 0xa1, 0xc0, 0x59, 0xb2, 0xcb, 0x3d, 0xb3, 0xbb, 0x5f, 0xb3, 0x40, + 0x3d, 0xc4, 0xb6, 0x70, 0xb3, 0xb4, 0x3d, 0xd4, 0xb1, 0x7f, 0xb3, 0xb5, + 0x3d, 0xfc, 0xab, 0xf5, 0xb3, 0x86, 0x3e, 0x30, 0xa6, 0x22, 0xb3, 0x53, + 0x3e, 0x69, 0xa0, 0x47, 0xb3, 0x42, 0x3e, 0xf4, 0x99, 0x68, 0xb3, 0x39, + 0x3f, 0x8a, 0x92, 0x7e, 0xb3, 0x48, 0x40, 0xed, 0x8a, 0x3a, 0xb3, 0x81, + 0x42, 0xf0, 0x81, 0x04, 0xb4, 0x03, 0x46, 0xd4, 0x76, 0xdf, 0xb4, 0x8f, + 0x4a, 0xd4, 0x6c, 0x77, 0xb5, 0x0e, 0x4f, 0xd3, 0x61, 0x61, 0xb6, 0xc7, + 0x54, 0x81, 0x58, 0x1e, 0xb8, 0x62, 0x3a, 0x23, 0xcd, 0xc5, 0xb9, 0x2f, + 0x3a, 0xc4, 0xc8, 0x1f, 0xba, 0x32, 0x3b, 0x81, 0xc2, 0x90, 0xba, 0xc4, + 0x3b, 0xc3, 0xbd, 0x75, 0xbb, 0x18, 0x3b, 0xba, 0xb8, 0x99, 0xbb, 0x6b, + 0x3b, 0xac, 0xb3, 0xbf, 0xbb, 0xa2, 0x3b, 0xa4, 0xae, 0xc2, 0xbb, 0x82, + 0x3b, 0xc5, 0xa9, 0x2c, 0xbb, 0x6d, 0x3b, 0xe4, 0xa3, 0x97, 0xbb, 0x49, + 0x3c, 0x20, 0x9d, 0xa1, 0xbb, 0x3c, 0x3c, 0x85, 0x96, 0xea, 0xbb, 0x2a, + 0x3c, 0xf4, 0x90, 0x3c, 0xbb, 0x4a, 0x3e, 0x95, 0x87, 0xbc, 0xbb, 0x84, + 0x40, 0x70, 0x7e, 0xe5, 0xbc, 0x0d, 0x43, 0xcf, 0x75, 0x60, 0xbc, 0x1c, + 0x48, 0x3d, 0x6a, 0xa8, 0xbc, 0xe8, 0x4d, 0x55, 0x5f, 0x36, 0x22, 0xb7, + 0xa0, 0xa5, 0x95, 0x0b, 0x24, 0xed, 0xa2, 0x10, 0x8c, 0xce, 0x26, 0x6d, + 0xa3, 0xdb, 0x84, 0xe2, 0x27, 0x9d, 0xa5, 0xe4, 0x7c, 0xd7, 0x28, 0x7b, + 0xa8, 0x61, 0x74, 0x9a, 0x29, 0x5c, 0xab, 0x07, 0x6c, 0x08, 0x2a, 0x3e, + 0xad, 0xe7, 0x63, 0x23, 0x2b, 0xb5, 0xb0, 0x88, 0x5a, 0xd4, 0x2c, 0x8b, + 0xb3, 0x0f, 0x52, 0x73, 0x2e, 0x72, 0xb5, 0x1b, 0x4c, 0x0e, 0x30, 0x2d, + 0xb7, 0x24, 0x46, 0x2a, 0x33, 0x95, 0xb7, 0xd4, 0x40, 0x72, 0x34, 0x9e, + 0xba, 0x19, 0x3c, 0x91, 0x39, 0x44, 0xb9, 0xc9, 0x38, 0xf3, 0x3c, 0xa9, + 0xba, 0x29, 0x35, 0x72, 0x3f, 0xa6, 0xba, 0xa7, 0x32, 0x09, 0x42, 0x58, + 0xbb, 0x5f, 0x2e, 0x84, 0x2a, 0x24, 0x99, 0xc0, 0x99, 0x27, 0x2c, 0xdc, + 0x9a, 0xb0, 0x90, 0x45, 0x2e, 0xa8, 0x9c, 0x45, 0x88, 0x0d, 0x30, 0x4e, + 0x9d, 0xcb, 0x7f, 0xd3, 0x31, 0x4d, 0xa0, 0x84, 0x77, 0x59, 0x32, 0x3a, + 0xa3, 0x2c, 0x6e, 0xf2, 0x33, 0x74, 0xa5, 0xc3, 0x65, 0x8e, 0x34, 0xda, + 0xa8, 0x98, 0x5c, 0xc7, 0x36, 0x57, 0xab, 0x67, 0x54, 0x3f, 0x38, 0x49, + 0xad, 0xd3, 0x4c, 0xe5, 0x3a, 0xbf, 0xaf, 0xd2, 0x46, 0x93, 0x3c, 0xfc, + 0xb1, 0x72, 0x40, 0x76, 0x3f, 0xdb, 0xb2, 0x9f, 0x3c, 0xf5, 0x42, 0x99, + 0xb3, 0xb0, 0x39, 0xb4, 0x45, 0x3c, 0xb4, 0x9e, 0x36, 0x67, 0x47, 0xb9, + 0xb5, 0x73, 0x33, 0x04, 0x4a, 0x1e, 0xb6, 0x39, 0x2f, 0x86, 0x30, 0xe9, + 0x93, 0x0b, 0x9d, 0xfb, 0x34, 0x1b, 0x93, 0xbd, 0x94, 0x22, 0x36, 0x90, + 0x94, 0xe6, 0x8b, 0x86, 0x38, 0x7a, 0x96, 0x93, 0x83, 0x21, 0x39, 0xfc, + 0x98, 0xd5, 0x7a, 0xa4, 0x3b, 0x14, 0x9b, 0x73, 0x72, 0x30, 0x3c, 0x43, + 0x9e, 0x2d, 0x68, 0xed, 0x3d, 0x7b, 0xa0, 0xc1, 0x5f, 0x58, 0x3f, 0x64, + 0xa3, 0xda, 0x57, 0x3b, 0x41, 0x17, 0xa6, 0x8c, 0x4f, 0x2d, 0x43, 0x65, + 0xa9, 0x19, 0x49, 0x07, 0x45, 0xa0, 0xab, 0x38, 0x42, 0xa4, 0x48, 0x26, + 0xac, 0xe5, 0x3e, 0x2d, 0x4a, 0xc8, 0xae, 0x47, 0x3a, 0xca, 0x4d, 0x54, + 0xaf, 0x78, 0x37, 0x69, 0x4f, 0xa8, 0xb0, 0x81, 0x34, 0x05, 0x51, 0xde, + 0xb1, 0x85, 0x30, 0x84, 0x38, 0x5b, 0x8c, 0x48, 0xa1, 0x69, 0x3b, 0x93, + 0x8c, 0xb3, 0x98, 0x6e, 0x3e, 0xc1, 0x8d, 0x16, 0x8f, 0xbc, 0x40, 0xa7, + 0x8e, 0xd6, 0x86, 0xef, 0x42, 0x75, 0x90, 0xcf, 0x7e, 0x2d, 0x44, 0x19, + 0x93, 0x36, 0x75, 0xa8, 0x45, 0x87, 0x95, 0xdf, 0x6d, 0x1c, 0x46, 0xd7, + 0x98, 0xc4, 0x64, 0x0d, 0x48, 0x4f, 0x9b, 0xdd, 0x5b, 0x5f, 0x4a, 0x19, + 0x9e, 0xf4, 0x53, 0x0b, 0x4c, 0x29, 0xa1, 0xee, 0x4c, 0x33, 0x4e, 0x4a, + 0xa4, 0x85, 0x46, 0x0f, 0x50, 0x66, 0xa6, 0xb0, 0x3f, 0xf6, 0x52, 0xa3, + 0xa8, 0x91, 0x3c, 0x70, 0x54, 0xdd, 0xaa, 0x2c, 0x38, 0xef, 0x57, 0x0b, + 0xab, 0x99, 0x35, 0x70, 0x59, 0x51, 0xac, 0xf6, 0x31, 0xab, 0x40, 0x47, + 0x85, 0x27, 0xa5, 0xc6, 0x44, 0x09, 0x85, 0x4e, 0x9d, 0x1c, 0x47, 0x4b, + 0x85, 0xa7, 0x94, 0xb7, 0x4a, 0x25, 0x86, 0x75, 0x8c, 0x3d, 0x4c, 0x63, + 0x87, 0xea, 0x83, 0xa7, 0x4d, 0xf1, 0x8a, 0x4b, 0x7a, 0xb6, 0x4f, 0x33, + 0x8c, 0xe4, 0x71, 0x9f, 0x50, 0x72, 0x90, 0x0f, 0x68, 0xa0, 0x51, 0xa4, + 0x93, 0x19, 0x5f, 0xf3, 0x53, 0x49, 0x96, 0xa0, 0x58, 0x29, 0x55, 0x02, + 0x99, 0xce, 0x50, 0x3e, 0x57, 0x09, 0x9d, 0x20, 0x49, 0xdd, 0x59, 0x2f, + 0x9f, 0xfe, 0x43, 0x5d, 0x5b, 0x11, 0xa2, 0x54, 0x3e, 0x6f, 0x5c, 0xf8, + 0xa4, 0x59, 0x3a, 0xc6, 0x5e, 0xdb, 0xa6, 0x21, 0x37, 0x1f, 0x60, 0xf5, + 0xa7, 0xe1, 0x33, 0x01, 0x49, 0xd9, 0x7d, 0x6b, 0xaa, 0xda, 0x4d, 0xa2, + 0x7d, 0x85, 0xa2, 0x48, 0x50, 0xac, 0x7d, 0xf3, 0x99, 0xe8, 0x53, 0x9a, + 0x7e, 0x68, 0x91, 0x79, 0x55, 0xf0, 0x7f, 0x82, 0x88, 0xf2, 0x58, 0x17, + 0x80, 0x80, 0x80, 0x80, 0x59, 0x3b, 0x83, 0xfa, 0x77, 0x65, 0x5a, 0x59, + 0x87, 0x0a, 0x6e, 0x74, 0x5b, 0x87, 0x8a, 0x47, 0x65, 0xc9, 0x5c, 0xdf, + 0x8d, 0x86, 0x5d, 0x60, 0x5e, 0x8f, 0x91, 0x2d, 0x55, 0x92, 0x60, 0x31, + 0x94, 0xbb, 0x4e, 0x3f, 0x61, 0xda, 0x98, 0x39, 0x47, 0xe1, 0x63, 0xa8, + 0x9b, 0x34, 0x41, 0x63, 0x65, 0x7f, 0x9d, 0xc3, 0x3c, 0xf0, 0x67, 0x66, + 0xa0, 0x14, 0x38, 0xd7, 0x69, 0x2a, 0xa2, 0x13, 0x34, 0xb0, 0x55, 0x4a, + 0x74, 0x96, 0xb0, 0x6d, 0x58, 0xc4, 0x74, 0xef, 0xa7, 0xf5, 0x5c, 0x36, + 0x75, 0x4d, 0x9f, 0xbf, 0x5e, 0x8b, 0x76, 0x46, 0x97, 0x2f, 0x60, 0xc7, + 0x77, 0x4e, 0x8e, 0x99, 0x62, 0x35, 0x79, 0x03, 0x86, 0x12, 0x63, 0x76, + 0x7b, 0x04, 0x7d, 0x64, 0x64, 0x76, 0x7e, 0x1d, 0x74, 0x5b, 0x65, 0xa5, + 0x81, 0x6f, 0x6b, 0xa7, 0x66, 0xc8, 0x84, 0xc1, 0x63, 0x2b, 0x68, 0x12, + 0x88, 0x5b, 0x5b, 0x0f, 0x69, 0xaa, 0x8b, 0xf4, 0x53, 0x3c, 0x6b, 0x51, + 0x8f, 0xa7, 0x4c, 0x4c, 0x6c, 0xb6, 0x93, 0x3e, 0x46, 0x05, 0x6e, 0x3a, + 0x96, 0x4d, 0x3f, 0xe5, 0x6f, 0xc7, 0x99, 0x13, 0x3b, 0x4a, 0x71, 0x8d, + 0x9b, 0x9f, 0x36, 0x7f, 0x60, 0x91, 0x6b, 0x72, 0xb6, 0x0f, 0x64, 0x1e, + 0x6c, 0x36, 0xad, 0x7c, 0x67, 0x5a, 0x6c, 0xe4, 0xa5, 0x4e, 0x69, 0xdf, + 0x6d, 0xcb, 0x9c, 0xf5, 0x6b, 0x82, 0x6f, 0x23, 0x94, 0x5e, 0x6c, 0xf1, + 0x70, 0xde, 0x8b, 0xbf, 0x6d, 0xfc, 0x72, 0xdd, 0x83, 0x35, 0x6e, 0xbc, + 0x75, 0x98, 0x7a, 0x51, 0x6f, 0x9f, 0x78, 0xb3, 0x71, 0x61, 0x70, 0xd1, + 0x7c, 0x1b, 0x68, 0xf6, 0x72, 0x56, 0x7f, 0x7a, 0x60, 0xb1, 0x73, 0x6a, + 0x83, 0x47, 0x58, 0xe4, 0x74, 0xb9, 0x86, 0xc8, 0x51, 0x23, 0x75, 0xf5, + 0x8a, 0xc4, 0x4a, 0x65, 0x77, 0x77, 0x8e, 0x5f, 0x44, 0x18, 0x78, 0xf8, + 0x91, 0x95, 0x3e, 0x47, 0x7a, 0x5f, 0x94, 0x96, 0x38, 0xd8, 0x6d, 0x12, + 0x62, 0xbe, 0xbb, 0xec, 0x70, 0xaf, 0x63, 0xe3, 0xb2, 0xff, 0x73, 0x4f, + 0x64, 0xce, 0xaa, 0xce, 0x75, 0x9d, 0x65, 0xaf, 0xa2, 0xd4, 0x76, 0xe9, + 0x67, 0x0a, 0x9a, 0x96, 0x77, 0xe9, 0x68, 0x96, 0x92, 0x31, 0x78, 0x9b, + 0x6a, 0xc0, 0x89, 0x56, 0x79, 0x66, 0x6d, 0x04, 0x80, 0x8f, 0x7a, 0x1b, + 0x70, 0x6c, 0x77, 0x3f, 0x7a, 0xcf, 0x73, 0xaa, 0x6e, 0x6f, 0x7b, 0xc4, + 0x77, 0x1b, 0x66, 0x43, 0x7d, 0x00, 0x7a, 0x99, 0x5e, 0x40, 0x7e, 0x65, + 0x7e, 0x40, 0x56, 0xcd, 0x7f, 0xcd, 0x81, 0x99, 0x4f, 0x70, 0x80, 0x9d, + 0x85, 0xde, 0x48, 0xa3, 0x81, 0xdc, 0x89, 0x9e, 0x42, 0x2c, 0x83, 0x61, + 0x8d, 0x3a, 0x3c, 0x04, 0x79, 0x4b, 0x5a, 0x87, 0xc1, 0x69, 0x7c, 0x3a, + 0x5b, 0xd8, 0xb8, 0xa4, 0x7f, 0x23, 0x5d, 0x1a, 0xb0, 0x33, 0x80, 0xc7, + 0x5e, 0x1d, 0xa8, 0x71, 0x82, 0x7b, 0x5f, 0x24, 0xa0, 0x8e, 0x82, 0xff, + 0x60, 0xd0, 0x98, 0x52, 0x83, 0xa3, 0x62, 0x7e, 0x90, 0x22, 0x83, 0xe1, + 0x65, 0x06, 0x86, 0xe9, 0x84, 0x53, 0x67, 0xb2, 0x7d, 0xc3, 0x84, 0xe3, + 0x6b, 0x28, 0x74, 0x43, 0x85, 0xda, 0x6e, 0xb8, 0x6b, 0xb8, 0x86, 0xd1, + 0x72, 0x36, 0x63, 0xb8, 0x87, 0xe7, 0x75, 0xd4, 0x5c, 0x01, 0x89, 0x3f, + 0x79, 0x79, 0x54, 0xa5, 0x8a, 0x8c, 0x7d, 0x52, 0x4d, 0x8a, 0x8b, 0x4f, + 0x81, 0xa2, 0x46, 0xb3, 0x8c, 0x31, 0x85, 0xb8, 0x3f, 0xa7, 0x85, 0xa1, + 0x52, 0xfb, 0xc6, 0x4a, 0x87, 0xfd, 0x54, 0xaa, 0xbd, 0x14, 0x8a, 0x06, + 0x56, 0x03, 0xb5, 0x32, 0x8b, 0xb7, 0x57, 0x42, 0xad, 0x96, 0x8c, 0xc3, + 0x58, 0x5e, 0xa6, 0x25, 0x8d, 0xba, 0x59, 0x90, 0x9e, 0x76, 0x8e, 0x16, + 0x5b, 0x20, 0x96, 0x62, 0x8e, 0x90, 0x5c, 0xe0, 0x8e, 0x02, 0x8e, 0xcb, + 0x5f, 0x94, 0x84, 0x50, 0x8f, 0x00, 0x62, 0xb5, 0x7a, 0xac, 0x8f, 0x65, + 0x66, 0x1c, 0x71, 0x15, 0x90, 0x71, 0x69, 0xd3, 0x68, 0xe4, 0x91, 0xa9, + 0x6d, 0x6a, 0x61, 0x04, 0x92, 0xff, 0x71, 0x21, 0x59, 0xc2, 0x94, 0x5b, + 0x74, 0xa7, 0x52, 0x72, 0x95, 0x3d, 0x79, 0x07, 0x4b, 0x3c, 0x96, 0x1f, + 0x7d, 0xbe, 0x43, 0x99, 0x90, 0xf7, 0x4d, 0x98, 0xc9, 0xc4, 0x93, 0x0d, + 0x4e, 0x8e, 0xc0, 0x61, 0x94, 0x5d, 0x4f, 0x79, 0xb9, 0x3c, 0x95, 0xd6, + 0x50, 0x9d, 0xb2, 0x0f, 0x96, 0xcc, 0x51, 0xce, 0xab, 0x0c, 0x97, 0x98, + 0x52, 0xef, 0xa3, 0xf4, 0x98, 0x1c, 0x54, 0x35, 0x9c, 0x67, 0x98, 0x4f, + 0x55, 0xae, 0x94, 0x6e, 0x98, 0x84, 0x57, 0x88, 0x8b, 0xc2, 0x98, 0xae, + 0x5a, 0x01, 0x82, 0x32, 0x99, 0x12, 0x5d, 0xca, 0x77, 0xea, 0x99, 0x9c, + 0x61, 0x85, 0x6e, 0x2b, 0x9a, 0xa1, 0x65, 0x40, 0x66, 0x23, 0x9b, 0xdb, + 0x68, 0xdb, 0x5e, 0x7c, 0x9d, 0x6e, 0x6c, 0x82, 0x57, 0x4d, 0x9f, 0x8e, + 0x6f, 0xa2, 0x50, 0x02, 0xa0, 0x3c, 0x74, 0xfc, 0x47, 0xf5, 0x9a, 0x39, + 0x49, 0x1d, 0xcd, 0x4e, 0x9c, 0x9f, 0x4a, 0x59, 0xc3, 0x75, 0x9e, 0x0c, + 0x4b, 0x2d, 0xbc, 0x79, 0x9f, 0x21, 0x4b, 0xeb, 0xb6, 0x1d, 0xa0, 0x3e, + 0x4c, 0xb8, 0xaf, 0xac, 0xa0, 0xb6, 0x4d, 0x71, 0xa8, 0xd3, 0xa1, 0x4e, + 0x4e, 0x3c, 0xa1, 0xe7, 0xa1, 0x9a, 0x4f, 0x50, 0x9a, 0x3a, 0xa1, 0xd0, + 0x50, 0x92, 0x92, 0x4c, 0xa1, 0xdc, 0x52, 0xa2, 0x89, 0x37, 0xa1, 0xfe, + 0x55, 0x15, 0x7f, 0xb8, 0xa2, 0x7e, 0x59, 0x4f, 0x75, 0x79, 0xa3, 0x3c, + 0x5d, 0x5e, 0x6b, 0xbc, 0xa4, 0x52, 0x61, 0x24, 0x63, 0x52, 0xa5, 0x72, + 0x65, 0x13, 0x5b, 0xcd, 0xa7, 0x22, 0x68, 0xec, 0x54, 0x5c, 0xa9, 0x9c, + 0x6d, 0x0e, 0x4c, 0x13, 0xa3, 0x09, 0x45, 0xdf, 0xcd, 0xa8, 0xa4, 0xfb, + 0x46, 0xd3, 0xc5, 0x8c, 0xa6, 0x7b, 0x47, 0x90, 0xbe, 0xa4, 0xa7, 0x45, + 0x48, 0x11, 0xb8, 0xd0, 0xa8, 0x1f, 0x48, 0x9f, 0xb2, 0xf1, 0xa8, 0xac, + 0x49, 0x32, 0xac, 0xb6, 0xa8, 0xf0, 0x49, 0xc8, 0xa6, 0x28, 0xa9, 0x47, + 0x4a, 0x6f, 0x9f, 0x7a, 0xa9, 0x77, 0x4b, 0x72, 0x97, 0xf5, 0xa9, 0xbf, + 0x4c, 0x86, 0x90, 0x65, 0xa9, 0xf7, 0x4e, 0x8e, 0x86, 0xc1, 0xaa, 0x4a, + 0x51, 0x1b, 0x7c, 0xef, 0xaa, 0xdb, 0x55, 0x25, 0x72, 0xf3, 0xab, 0xb4, + 0x59, 0xb6, 0x69, 0x6b, 0xad, 0x0c, 0x5d, 0x9d, 0x60, 0xc6, 0xae, 0x71, + 0x61, 0xd5, 0x58, 0xde, 0xb0, 0x7f, 0x66, 0x39, 0x50, 0x69, 0xab, 0x0f, + 0x43, 0x04, 0xce, 0x0a, 0xac, 0x9f, 0x43, 0xb1, 0xc6, 0xff, 0xae, 0x16, + 0x44, 0x46, 0xc0, 0x5b, 0xae, 0xcf, 0x44, 0xa0, 0xba, 0xe5, 0xaf, 0x8b, + 0x44, 0xff, 0xb5, 0x77, 0xb0, 0x54, 0x45, 0x6a, 0xb0, 0x01, 0xb0, 0x6b, + 0x45, 0xeb, 0xa9, 0xc0, 0xb0, 0x90, 0x46, 0x72, 0xa3, 0x72, 0xb0, 0xc6, + 0x47, 0x26, 0x9c, 0xbe, 0xb1, 0x0b, 0x48, 0x11, 0x95, 0x90, 0xb1, 0x5a, + 0x49, 0x3f, 0x8d, 0xe8, 0xb1, 0x9e, 0x4b, 0x37, 0x84, 0x7d, 0xb2, 0x16, + 0x4d, 0xfe, 0x7a, 0xa2, 0xb2, 0xc1, 0x51, 0x31, 0x70, 0x84, 0xb3, 0x9f, + 0x56, 0x84, 0x67, 0x08, 0xb5, 0x07, 0x5a, 0xb2, 0x5e, 0x3e, 0xb7, 0x07, + 0x5f, 0x4a, 0x54, 0xaf, 0xb2, 0xc1, 0x40, 0x1a, 0xce, 0x71, 0xb4, 0x0c, + 0x40, 0xa1, 0xc8, 0x5a, 0xb5, 0x7d, 0x41, 0x54, 0xc2, 0x7c, 0xb6, 0x74, + 0x41, 0xc5, 0xbd, 0x1a, 0xb7, 0x1b, 0x42, 0x0b, 0xb7, 0xf2, 0xb7, 0xc4, + 0x42, 0x56, 0xb2, 0xbf, 0xb8, 0x26, 0x42, 0xad, 0xad, 0x25, 0xb8, 0x3e, + 0x43, 0x15, 0xa7, 0x19, 0xb8, 0x5f, 0x43, 0x82, 0xa1, 0x06, 0xb8, 0x85, + 0x44, 0x27, 0x9a, 0x47, 0xb8, 0xb5, 0x44, 0xde, 0x93, 0x5b, 0xb8, 0xed, + 0x46, 0x43, 0x8b, 0x5f, 0xb9, 0x29, 0x48, 0x45, 0x82, 0x50, 0xb9, 0xa0, + 0x4b, 0x4a, 0x78, 0x98, 0xba, 0x4b, 0x4e, 0xa0, 0x6e, 0x7a, 0xbb, 0x33, + 0x53, 0x9b, 0x64, 0x9c, 0xbc, 0xf4, 0x58, 0x04, 0x5a, 0xf5, 0xba, 0xe1, + 0x3d, 0x58, 0xcf, 0x7d, 0xbb, 0xe7, 0x3e, 0x07, 0xc9, 0xeb, 0xbd, 0x2b, + 0x3e, 0xb8, 0xc4, 0x90, 0xbe, 0x5f, 0x3f, 0x5c, 0xbf, 0x68, 0xbe, 0xe6, + 0x3f, 0x7c, 0xba, 0x5b, 0xbf, 0x6e, 0x3f, 0xa1, 0xb5, 0x47, 0xbf, 0xf4, + 0x3f, 0xc7, 0xb0, 0x31, 0xc0, 0x25, 0x40, 0x01, 0xaa, 0x68, 0xc0, 0x5c, + 0x40, 0x3e, 0xa4, 0x97, 0xc0, 0x6f, 0x40, 0x9e, 0x9e, 0x8c, 0xc0, 0x83, + 0x41, 0x16, 0x97, 0xf1, 0xc0, 0x8b, 0x41, 0xa4, 0x91, 0x45, 0xc0, 0xe1, + 0x43, 0x41, 0x89, 0x1b, 0xc1, 0x25, 0x45, 0x36, 0x80, 0x6e, 0xc2, 0x2d, + 0x47, 0xb3, 0x77, 0x9e, 0xc2, 0x00, 0x4b, 0xf9, 0x6c, 0xae, 0xc2, 0xc0, + 0x50, 0xc9, 0x61, 0xd7, 0x2a, 0x65, 0xa6, 0xe7, 0x9a, 0x77, 0x2c, 0x7c, + 0xa8, 0x07, 0x91, 0xee, 0x2d, 0xbe, 0xa9, 0xac, 0x89, 0xc5, 0x2e, 0xb0, + 0xab, 0x74, 0x81, 0xab, 0x2f, 0x5e, 0xad, 0xd1, 0x79, 0x67, 0x2f, 0xd9, + 0xb0, 0x3d, 0x71, 0x27, 0x30, 0x87, 0xb2, 0x9d, 0x68, 0x85, 0x30, 0x64, + 0xb5, 0x72, 0x5f, 0xd8, 0x31, 0x30, 0xb7, 0xab, 0x57, 0x84, 0x32, 0x2b, + 0xb9, 0x88, 0x4f, 0x88, 0x34, 0x0a, 0xbb, 0x4b, 0x49, 0xcf, 0x37, 0x88, + 0xbb, 0x9d, 0x43, 0x9e, 0x38, 0xc9, 0xbd, 0x5b, 0x3e, 0x9a, 0x3d, 0x28, + 0xbd, 0x06, 0x3a, 0xdd, 0x40, 0x56, 0xbd, 0x5d, 0x37, 0x50, 0x43, 0x1b, + 0xbd, 0xc2, 0x33, 0xe0, 0x45, 0xc7, 0xbe, 0x16, 0x30, 0x52, 0x31, 0x2e, + 0xa0, 0x4c, 0x9e, 0x03, 0x33, 0x9f, 0xa1, 0x3a, 0x95, 0x24, 0x35, 0xae, + 0xa2, 0x6a, 0x8c, 0xae, 0x37, 0x22, 0xa4, 0x11, 0x84, 0x77, 0x38, 0x3c, + 0xa6, 0x2c, 0x7c, 0x3a, 0x39, 0x06, 0xa8, 0xb2, 0x74, 0x01, 0x39, 0xea, + 0xab, 0x33, 0x6b, 0x3b, 0x3a, 0xd3, 0xad, 0xb0, 0x61, 0xf0, 0x3b, 0xf4, + 0xb0, 0x0b, 0x59, 0x00, 0x3c, 0xc6, 0xb1, 0xf7, 0x50, 0x53, 0x3e, 0xfa, + 0xb3, 0xaa, 0x4a, 0x39, 0x41, 0x1b, 0xb5, 0x19, 0x44, 0x06, 0x43, 0x82, + 0xb6, 0x34, 0x3f, 0x04, 0x46, 0x45, 0xb7, 0x12, 0x3b, 0xb7, 0x48, 0xe4, + 0xb7, 0xd5, 0x38, 0x54, 0x4b, 0x5c, 0xb8, 0x7e, 0x34, 0xe4, 0x4d, 0xb8, + 0xb9, 0x11, 0x31, 0x55, 0x37, 0x35, 0x99, 0xce, 0xa2, 0xb5, 0x3a, 0x86, + 0x9a, 0x6f, 0x98, 0xba, 0x3d, 0x68, 0x9b, 0x0f, 0x90, 0x09, 0x3f, 0x17, + 0x9c, 0xdf, 0x87, 0x8c, 0x40, 0x96, 0x9e, 0xda, 0x7f, 0x0c, 0x41, 0x87, + 0xa1, 0x53, 0x76, 0xcb, 0x42, 0x7a, 0xa3, 0xb8, 0x6e, 0x75, 0x43, 0xa0, + 0xa6, 0x11, 0x64, 0xfd, 0x44, 0xee, 0xa8, 0x91, 0x5c, 0x24, 0x46, 0x45, + 0xaa, 0xee, 0x53, 0x89, 0x48, 0x21, 0xad, 0x1f, 0x4c, 0x6a, 0x4a, 0x5d, + 0xae, 0xfa, 0x46, 0x22, 0x4c, 0x88, 0xb0, 0x76, 0x3f, 0xf8, 0x4e, 0xf9, + 0xb1, 0x98, 0x3c, 0xb5, 0x51, 0x47, 0xb2, 0x9f, 0x39, 0x5f, 0x53, 0x77, + 0xb3, 0x99, 0x35, 0xfd, 0x55, 0xaf, 0xb4, 0x85, 0x32, 0x5b, 0x3d, 0xef, + 0x93, 0x72, 0xa5, 0x90, 0x41, 0x5b, 0x93, 0xb0, 0x9c, 0x79, 0x44, 0xbc, + 0x94, 0x05, 0x93, 0xd1, 0x47, 0x45, 0x95, 0x29, 0x8b, 0x3b, 0x49, 0x0c, + 0x96, 0xfa, 0x82, 0xae, 0x4a, 0x66, 0x99, 0x3c, 0x7a, 0x33, 0x4b, 0x68, + 0x9b, 0xad, 0x71, 0xe2, 0x4c, 0x6a, 0x9e, 0x38, 0x68, 0xb5, 0x4d, 0x78, + 0xa0, 0x97, 0x5f, 0x3b, 0x4f, 0x5a, 0xa3, 0x77, 0x57, 0x71, 0x50, 0xfe, + 0xa5, 0xf8, 0x4f, 0x94, 0x53, 0x14, 0xa8, 0x52, 0x49, 0x73, 0x55, 0x1f, + 0xaa, 0x48, 0x43, 0x1c, 0x57, 0x38, 0xab, 0xf5, 0x3e, 0x53, 0x59, 0x62, + 0xad, 0x6c, 0x3a, 0xcf, 0x5b, 0x7f, 0xae, 0xbe, 0x37, 0x4b, 0x5d, 0xcd, + 0xb0, 0x16, 0x33, 0x41, 0x45, 0x66, 0x8c, 0x8f, 0xa9, 0xe1, 0x49, 0x48, + 0x8c, 0x9b, 0xa0, 0xc6, 0x4c, 0xaf, 0x8c, 0xe5, 0x98, 0x2f, 0x4f, 0xf7, + 0x8d, 0x45, 0x8f, 0xa0, 0x51, 0xd9, 0x8e, 0xe4, 0x86, 0xf1, 0x53, 0x7f, + 0x90, 0xb3, 0x7e, 0x3c, 0x54, 0xd9, 0x92, 0xf8, 0x75, 0xab, 0x56, 0x08, + 0x95, 0x7b, 0x6d, 0x32, 0x57, 0x30, 0x98, 0x33, 0x64, 0x5b, 0x58, 0x9c, + 0x9b, 0x1f, 0x5b, 0xef, 0x5a, 0x54, 0x9e, 0x26, 0x53, 0xf2, 0x5c, 0x29, + 0xa1, 0x04, 0x4c, 0xe3, 0x5e, 0x01, 0xa3, 0x8d, 0x46, 0xc5, 0x5f, 0xd6, + 0xa5, 0xb1, 0x40, 0x8c, 0x61, 0xa8, 0xa7, 0x87, 0x3c, 0xbc, 0x63, 0x84, + 0xa9, 0x30, 0x38, 0xfc, 0x65, 0x96, 0xaa, 0xd7, 0x34, 0xaf, 0x4e, 0x5f, + 0x85, 0x1a, 0xae, 0x5d, 0x52, 0x2f, 0x85, 0x28, 0xa5, 0xad, 0x55, 0xbe, + 0x85, 0x46, 0x9d, 0x32, 0x58, 0xf1, 0x85, 0x8a, 0x94, 0xb3, 0x5b, 0x93, + 0x86, 0x4c, 0x8c, 0x2d, 0x5d, 0x5f, 0x87, 0xbe, 0x83, 0x99, 0x5e, 0xb3, + 0x8a, 0x11, 0x7a, 0xc9, 0x5f, 0xc6, 0x8c, 0xaa, 0x71, 0xe8, 0x60, 0xf4, + 0x8f, 0x6b, 0x69, 0x4a, 0x62, 0x39, 0x92, 0x11, 0x60, 0xed, 0x63, 0xce, + 0x95, 0x8e, 0x59, 0x25, 0x65, 0x6e, 0x98, 0xc0, 0x51, 0x48, 0x67, 0x0e, + 0x9b, 0xee, 0x4a, 0xc3, 0x68, 0xd1, 0x9e, 0xaa, 0x44, 0x78, 0x6a, 0x8c, + 0xa0, 0xf4, 0x3e, 0xfe, 0x6c, 0x2c, 0xa3, 0x09, 0x3a, 0xe8, 0x6d, 0xf1, + 0xa5, 0x03, 0x36, 0x71, 0x58, 0x3f, 0x7d, 0x1d, 0xb3, 0x80, 0x5c, 0x01, + 0x7d, 0x50, 0xaa, 0xbe, 0x5f, 0x96, 0x7d, 0x81, 0xa2, 0x85, 0x62, 0xac, + 0x7d, 0xcf, 0x99, 0xfb, 0x65, 0x79, 0x7e, 0x3c, 0x91, 0x62, 0x67, 0x18, + 0x7f, 0x6e, 0x88, 0xe8, 0x68, 0x85, 0x80, 0x80, 0x80, 0x80, 0x69, 0xc0, + 0x83, 0xd1, 0x77, 0xb6, 0x6a, 0xf0, 0x86, 0xb1, 0x6f, 0x11, 0x6c, 0x20, + 0x89, 0xbf, 0x66, 0xa0, 0x6d, 0x60, 0x8c, 0xad, 0x5e, 0x50, 0x6f, 0x11, + 0x90, 0x11, 0x56, 0x89, 0x70, 0xa7, 0x93, 0x69, 0x4f, 0x13, 0x71, 0xf6, + 0x96, 0xc7, 0x48, 0xe2, 0x73, 0x7b, 0x99, 0x98, 0x42, 0xbb, 0x75, 0x17, + 0x9c, 0x20, 0x3d, 0x6c, 0x76, 0xd7, 0x9e, 0x85, 0x38, 0x78, 0x63, 0x7c, + 0x73, 0xe4, 0xb8, 0xb1, 0x67, 0x57, 0x74, 0x54, 0xaf, 0xf4, 0x6a, 0xbd, + 0x74, 0xb4, 0xa7, 0xb4, 0x6d, 0xe4, 0x75, 0x25, 0x9f, 0x64, 0x70, 0x07, + 0x76, 0x39, 0x96, 0xf6, 0x71, 0xf6, 0x77, 0x5d, 0x8e, 0x8a, 0x72, 0xe9, + 0x79, 0x0d, 0x86, 0x0f, 0x73, 0xd7, 0x7b, 0x0a, 0x7d, 0x7c, 0x74, 0xee, + 0x7e, 0x07, 0x74, 0xb8, 0x76, 0x3f, 0x81, 0x26, 0x6c, 0x43, 0x77, 0x82, + 0x84, 0x5c, 0x63, 0xfd, 0x78, 0xbd, 0x87, 0x97, 0x5c, 0x01, 0x7a, 0x1d, + 0x8a, 0xe2, 0x54, 0x3b, 0x7b, 0x87, 0x8e, 0x4f, 0x4d, 0x0c, 0x7c, 0xe9, + 0x91, 0xbb, 0x46, 0xe2, 0x7e, 0x56, 0x94, 0xa4, 0x40, 0xe1, 0x7f, 0xc3, + 0x97, 0x76, 0x3b, 0x2d, 0x6f, 0x9b, 0x6a, 0xfd, 0xbe, 0x7a, 0x73, 0x24, + 0x6b, 0xae, 0xb5, 0x7f, 0x76, 0x38, 0x6c, 0x4e, 0xad, 0x0d, 0x78, 0xd4, + 0x6c, 0xf8, 0xa4, 0xdb, 0x7a, 0xee, 0x6d, 0xeb, 0x9c, 0x87, 0x7c, 0x79, + 0x6f, 0x3c, 0x94, 0x09, 0x7d, 0xbd, 0x71, 0x02, 0x8b, 0x8c, 0x7e, 0x95, + 0x73, 0x13, 0x83, 0x36, 0x7f, 0x4c, 0x75, 0xc6, 0x7a, 0x7d, 0x80, 0x36, + 0x78, 0xcf, 0x71, 0xb2, 0x81, 0x55, 0x7c, 0x0e, 0x69, 0x80, 0x82, 0xc1, + 0x7f, 0x39, 0x61, 0x7a, 0x84, 0x04, 0x82, 0x8a, 0x59, 0xe8, 0x85, 0x57, + 0x85, 0xbf, 0x52, 0x4b, 0x86, 0x65, 0x89, 0x74, 0x4b, 0x53, 0x87, 0x93, + 0x8d, 0x0d, 0x44, 0xf4, 0x89, 0x0b, 0x90, 0x7b, 0x3e, 0x99, 0x7b, 0x50, + 0x61, 0xa0, 0xc3, 0x98, 0x7e, 0xab, 0x62, 0xf7, 0xba, 0xc6, 0x81, 0xc7, + 0x64, 0x2a, 0xb2, 0x71, 0x84, 0x12, 0x65, 0x34, 0xaa, 0x5e, 0x86, 0x0f, + 0x66, 0x27, 0xa2, 0x4e, 0x87, 0x44, 0x67, 0x83, 0x9a, 0x21, 0x88, 0x58, + 0x68, 0xf4, 0x91, 0xe7, 0x89, 0x13, 0x6b, 0x1c, 0x89, 0x2f, 0x89, 0xe2, + 0x6d, 0x61, 0x80, 0x93, 0x8a, 0xaa, 0x70, 0x99, 0x77, 0x83, 0x8b, 0x66, + 0x73, 0xb7, 0x6e, 0xda, 0x8c, 0x70, 0x76, 0xff, 0x66, 0xf0, 0x8d, 0xc6, + 0x7a, 0x20, 0x5f, 0x2c, 0x8f, 0x3a, 0x7d, 0xa4, 0x57, 0xe8, 0x90, 0xc9, + 0x81, 0x05, 0x50, 0x8c, 0x91, 0x4c, 0x85, 0x08, 0x49, 0x80, 0x92, 0x2c, + 0x88, 0xe0, 0x42, 0x86, 0x87, 0x97, 0x59, 0xf9, 0xc8, 0xbb, 0x8a, 0x93, + 0x5b, 0x53, 0xbe, 0xfb, 0x8c, 0xeb, 0x5c, 0x93, 0xb7, 0x25, 0x8f, 0x30, + 0x5d, 0xcb, 0xaf, 0x77, 0x90, 0x95, 0x5e, 0xdc, 0xa7, 0x8e, 0x91, 0xff, + 0x5f, 0xf1, 0x9f, 0x7c, 0x92, 0xc0, 0x61, 0x85, 0x97, 0xac, 0x93, 0x9d, + 0x63, 0x0a, 0x8f, 0xc9, 0x93, 0xf6, 0x65, 0x91, 0x86, 0xb3, 0x94, 0x7e, + 0x68, 0x30, 0x7d, 0xbe, 0x95, 0x2f, 0x6b, 0x77, 0x74, 0x86, 0x96, 0x49, + 0x6e, 0xce, 0x6c, 0x2c, 0x97, 0x6f, 0x72, 0x15, 0x64, 0x6c, 0x98, 0xb7, + 0x75, 0x5a, 0x5c, 0xdc, 0x9a, 0x39, 0x78, 0xd4, 0x55, 0x7c, 0x9b, 0xad, + 0x7c, 0x8d, 0x4e, 0x23, 0x9c, 0x9d, 0x80, 0xea, 0x46, 0x8f, 0x93, 0x00, + 0x53, 0x1f, 0xcc, 0x91, 0x95, 0x86, 0x54, 0x7e, 0xc2, 0xea, 0x97, 0x6c, + 0x55, 0xc0, 0xbb, 0x48, 0x99, 0x3a, 0x57, 0x02, 0xb4, 0x01, 0x9a, 0xb1, + 0x58, 0x2a, 0xac, 0xac, 0x9b, 0xbd, 0x59, 0x3e, 0xa5, 0x35, 0x9c, 0xa9, + 0x5a, 0x70, 0x9d, 0x88, 0x9d, 0x42, 0x5b, 0xe4, 0x95, 0xa9, 0x9d, 0xec, + 0x5d, 0xa3, 0x8d, 0x6a, 0x9e, 0x6b, 0x60, 0x3f, 0x84, 0x1a, 0x9e, 0xc7, + 0x63, 0x4a, 0x7a, 0xc9, 0x9f, 0x70, 0x66, 0x98, 0x71, 0x77, 0xa0, 0x86, + 0x6a, 0x0d, 0x69, 0x7e, 0xa1, 0xe3, 0x6d, 0x4d, 0x61, 0xe4, 0xa3, 0xac, + 0x70, 0xac, 0x5a, 0x72, 0xa5, 0x44, 0x74, 0x3c, 0x52, 0xc7, 0xa6, 0x75, + 0x78, 0xa2, 0x4a, 0xc6, 0x9c, 0xb5, 0x4d, 0x48, 0xcf, 0xb6, 0x9f, 0x1d, + 0x4e, 0x79, 0xc6, 0x53, 0xa1, 0x04, 0x4f, 0x9f, 0xbe, 0x77, 0xa2, 0x62, + 0x50, 0xbf, 0xb7, 0xbc, 0xa3, 0xd9, 0x52, 0x10, 0xb0, 0xe9, 0xa4, 0xb5, + 0x53, 0x23, 0xa9, 0xe5, 0xa5, 0x88, 0x54, 0x2d, 0xa2, 0xc3, 0xa6, 0x15, + 0x55, 0x6b, 0x9b, 0x3d, 0xa6, 0x89, 0x56, 0xcc, 0x93, 0x83, 0xa6, 0xf1, + 0x58, 0xb8, 0x8a, 0xe8, 0xa7, 0x63, 0x5b, 0x1d, 0x81, 0xad, 0xa8, 0x1a, + 0x5e, 0x9f, 0x77, 0xd6, 0xa8, 0xe5, 0x62, 0x2c, 0x6e, 0x8e, 0xaa, 0x03, + 0x65, 0xc8, 0x66, 0xb6, 0xab, 0x74, 0x69, 0x3b, 0x5f, 0x0c, 0xad, 0xad, + 0x6c, 0xf9, 0x57, 0x62, 0xb0, 0x9a, 0x70, 0x89, 0x4f, 0x43, 0xa5, 0x67, + 0x49, 0xef, 0xd0, 0xc3, 0xa7, 0x9c, 0x4b, 0x06, 0xc8, 0x35, 0xa9, 0x89, + 0x4b, 0xdc, 0xc0, 0xe2, 0xaa, 0xb3, 0x4c, 0x8f, 0xba, 0x96, 0xab, 0xda, + 0x4d, 0x51, 0xb4, 0x52, 0xac, 0xdd, 0x4e, 0x19, 0xad, 0xd2, 0xad, 0x7a, + 0x4e, 0xd6, 0xa7, 0x05, 0xae, 0x32, 0x4f, 0x9e, 0xa0, 0x25, 0xae, 0xa4, + 0x50, 0xd4, 0x98, 0xbc, 0xaf, 0x19, 0x52, 0x2a, 0x91, 0x53, 0xaf, 0x65, + 0x54, 0x3e, 0x88, 0x55, 0xaf, 0xd4, 0x56, 0x9a, 0x7f, 0x22, 0xb0, 0x96, + 0x5a, 0x58, 0x75, 0x5e, 0xb1, 0xb5, 0x5e, 0x35, 0x6c, 0x11, 0xb3, 0x0e, + 0x61, 0xdd, 0x63, 0xd2, 0xb4, 0x7b, 0x65, 0xc7, 0x5b, 0xe9, 0xb6, 0x8f, + 0x69, 0xf8, 0x53, 0x58, 0xad, 0xa8, 0x47, 0x1f, 0xd1, 0x2a, 0xaf, 0x99, + 0x47, 0xee, 0xc9, 0x83, 0xb1, 0x46, 0x48, 0x89, 0xc2, 0xe9, 0xb2, 0x89, + 0x49, 0x21, 0xbc, 0xdf, 0xb3, 0x7b, 0x49, 0xb4, 0xb7, 0x20, 0xb4, 0x73, + 0x4a, 0x4e, 0xb1, 0x4d, 0xb4, 0xfb, 0x4a, 0xec, 0xaa, 0xfd, 0xb5, 0x71, + 0x4b, 0x90, 0xa4, 0x83, 0xb5, 0xee, 0x4c, 0x4d, 0x9d, 0xcb, 0xb6, 0x5f, + 0x4d, 0x3d, 0x96, 0x95, 0xb6, 0xdc, 0x4e, 0x4d, 0x8f, 0x2a, 0xb7, 0x1f, + 0x50, 0x4a, 0x85, 0xed, 0xb7, 0x84, 0x52, 0xff, 0x7c, 0xad, 0xb8, 0x63, + 0x56, 0x8c, 0x73, 0x14, 0xb9, 0x93, 0x5a, 0xbf, 0x69, 0xc9, 0xbb, 0x36, + 0x5e, 0x7b, 0x60, 0xf0, 0xbd, 0x43, 0x62, 0xfe, 0x57, 0x88, 0xb5, 0xb8, + 0x44, 0x17, 0xd0, 0xe6, 0xb7, 0x50, 0x44, 0xd3, 0xca, 0xc1, 0xb8, 0xe2, + 0x45, 0x8a, 0xc4, 0xe0, 0xba, 0x5a, 0x46, 0x40, 0xbf, 0x2c, 0xbb, 0x1b, + 0x46, 0xa6, 0xb9, 0xb4, 0xbb, 0xe2, 0x47, 0x12, 0xb4, 0x32, 0xbc, 0x90, + 0x47, 0x83, 0xae, 0x82, 0xbc, 0xec, 0x48, 0x07, 0xa8, 0x50, 0xbd, 0x54, + 0x48, 0x90, 0xa2, 0x19, 0xbd, 0xb0, 0x49, 0x39, 0x9b, 0x64, 0xbe, 0x0d, + 0x49, 0xf8, 0x94, 0x68, 0xbe, 0x64, 0x4b, 0x32, 0x8c, 0xb5, 0xbe, 0x9c, + 0x4d, 0x36, 0x83, 0xc9, 0xbf, 0x1b, 0x4f, 0xc5, 0x7a, 0x5a, 0xc0, 0x09, + 0x52, 0xfa, 0x70, 0xcc, 0xc1, 0x45, 0x57, 0x9c, 0x67, 0x5c, 0xc3, 0x10, + 0x5b, 0xcc, 0x5d, 0x8b, 0xbc, 0xfd, 0x40, 0x8b, 0xd1, 0x59, 0xbe, 0xb4, + 0x41, 0x88, 0xcb, 0xc6, 0xc0, 0x53, 0x42, 0x6b, 0xc6, 0x90, 0xc2, 0x0d, + 0x42, 0xfe, 0xc1, 0x99, 0xc3, 0x04, 0x43, 0x28, 0xbc, 0x7a, 0xc3, 0xaf, + 0x43, 0x53, 0xb7, 0x36, 0xc4, 0x5a, 0x43, 0x84, 0xb1, 0xe8, 0xc4, 0xd7, + 0x43, 0xd0, 0xac, 0x2f, 0xc5, 0x7c, 0x44, 0x07, 0xa6, 0x59, 0xc5, 0x97, + 0x44, 0xa2, 0xa0, 0x30, 0xc5, 0xe9, 0x45, 0x39, 0x99, 0x6d, 0xc6, 0x3c, + 0x45, 0xe2, 0x92, 0x91, 0xc6, 0xef, 0x47, 0x07, 0x8b, 0x00, 0xc7, 0x3d, + 0x48, 0xf4, 0x82, 0x7c, 0xc8, 0x04, 0x4b, 0xad, 0x79, 0x82, 0xc8, 0x04, + 0x4f, 0x9a, 0x6e, 0x9a, 0xc8, 0xe0, 0x54, 0xa2, 0x64, 0x07, 0x33, 0x1d, + 0xac, 0xac, 0x9f, 0x79, 0x34, 0x89, 0xae, 0x09, 0x96, 0xf6, 0x35, 0xa3, + 0xaf, 0x88, 0x8e, 0xa2, 0x36, 0x4b, 0xb1, 0x53, 0x86, 0x87, 0x36, 0x99, + 0xb3, 0x3d, 0x7e, 0x6b, 0x36, 0xed, 0xb5, 0x62, 0x76, 0x58, 0x37, 0x2e, + 0xb7, 0x79, 0x6e, 0x24, 0x37, 0x69, 0xb9, 0xd6, 0x65, 0x8b, 0x37, 0x24, + 0xbc, 0x5c, 0x5d, 0x06, 0x37, 0xfe, 0xbd, 0xb2, 0x54, 0x84, 0x39, 0x42, + 0xbf, 0x04, 0x4d, 0x46, 0x3b, 0xc6, 0xbf, 0xa8, 0x47, 0x13, 0x3d, 0xd8, + 0xc0, 0x46, 0x40, 0x91, 0x40, 0x67, 0xc0, 0xd7, 0x3c, 0xbc, 0x43, 0xcf, + 0xc0, 0xce, 0x39, 0x54, 0x46, 0x95, 0xc1, 0x01, 0x35, 0xd3, 0x49, 0x26, + 0xc1, 0x38, 0x32, 0x2b, 0x38, 0xe6, 0xa6, 0x9b, 0xa2, 0xde, 0x3b, 0x4f, + 0xa7, 0x66, 0x9a, 0x0b, 0x3d, 0x52, 0xa8, 0x66, 0x91, 0x9d, 0x3e, 0x9e, + 0xaa, 0x0c, 0x89, 0x51, 0x3f, 0x8b, 0xab, 0xdc, 0x81, 0x08, 0x40, 0x46, + 0xae, 0x42, 0x78, 0xda, 0x40, 0xcf, 0xb0, 0xac, 0x70, 0xb9, 0x41, 0x51, + 0xb2, 0xd3, 0x67, 0xaa, 0x41, 0xc2, 0xb4, 0xf2, 0x5e, 0xd5, 0x42, 0x5a, + 0xb6, 0x96, 0x56, 0x1b, 0x43, 0x65, 0xb8, 0x09, 0x4e, 0x44, 0x45, 0x8c, + 0xb9, 0x20, 0x48, 0x47, 0x47, 0x94, 0xb9, 0xf3, 0x41, 0xf4, 0x4a, 0x21, + 0xba, 0x99, 0x3d, 0xe3, 0x4c, 0xba, 0xbb, 0x21, 0x3a, 0x6b, 0x4f, 0x2a, + 0xbb, 0x9d, 0x36, 0xe3, 0x51, 0x71, 0xbc, 0x24, 0x33, 0x40, 0x3e, 0x1b, + 0xa0, 0xd1, 0xa6, 0x63, 0x41, 0x38, 0xa1, 0x1b, 0x9d, 0x0b, 0x44, 0x05, + 0xa1, 0xb6, 0x94, 0x7d, 0x46, 0x2a, 0xa2, 0xea, 0x8c, 0x0a, 0x47, 0x7d, + 0xa4, 0xc5, 0x83, 0xa6, 0x48, 0x74, 0xa6, 0xec, 0x7b, 0x64, 0x49, 0x28, + 0xa9, 0x5d, 0x73, 0x47, 0x49, 0xf8, 0xab, 0xbc, 0x6a, 0x73, 0x4a, 0xda, + 0xad, 0xf9, 0x61, 0x3c, 0x4b, 0xee, 0xaf, 0xfc, 0x58, 0x86, 0x4c, 0xdf, + 0xb1, 0x9b, 0x50, 0x23, 0x4e, 0xf9, 0xb3, 0x00, 0x4a, 0x27, 0x50, 0xf6, + 0xb4, 0x1c, 0x43, 0xfe, 0x52, 0xf6, 0xb5, 0x14, 0x3e, 0xff, 0x55, 0x30, + 0xb6, 0x00, 0x3b, 0x9a, 0x57, 0x54, 0xb6, 0xe0, 0x38, 0x1a, 0x59, 0x83, + 0xb7, 0xa7, 0x34, 0x63, 0x44, 0x7d, 0x9a, 0x6d, 0xaa, 0x39, 0x48, 0x13, + 0x9a, 0x67, 0xa0, 0x9c, 0x4b, 0x2d, 0x9a, 0xd2, 0x97, 0xfa, 0x4e, 0x26, + 0x9b, 0x59, 0x8f, 0x6e, 0x4f, 0x97, 0x9d, 0x5b, 0x86, 0xd4, 0x50, 0xbc, + 0x9f, 0x82, 0x7e, 0x4a, 0x51, 0xa5, 0xa1, 0xb6, 0x76, 0x3c, 0x52, 0x83, + 0xa3, 0xf6, 0x6d, 0xf6, 0x53, 0x99, 0xa6, 0x11, 0x64, 0xb2, 0x54, 0xe5, + 0xa8, 0x5d, 0x5c, 0x2e, 0x56, 0x37, 0xaa, 0xa1, 0x54, 0x02, 0x57, 0xd4, + 0xac, 0x9d, 0x4c, 0xd7, 0x59, 0xd0, 0xae, 0x4b, 0x46, 0x95, 0x5b, 0xc3, + 0xaf, 0xaf, 0x40, 0x4b, 0x5d, 0xc2, 0xb0, 0xe7, 0x3c, 0xcf, 0x5f, 0xa9, + 0xb2, 0x01, 0x39, 0x59, 0x61, 0xb9, 0xb3, 0x11, 0x35, 0x61, 0x4b, 0x40, + 0x93, 0xd1, 0xae, 0x07, 0x4f, 0x0f, 0x93, 0xce, 0xa4, 0xbb, 0x52, 0xac, + 0x93, 0xd3, 0x9b, 0xf8, 0x55, 0xfc, 0x94, 0x0a, 0x93, 0x72, 0x58, 0x3f, + 0x95, 0x26, 0x8a, 0xe8, 0x59, 0xaa, 0x96, 0xe6, 0x82, 0x55, 0x5a, 0xc4, + 0x99, 0x13, 0x79, 0xef, 0x5b, 0xa4, 0x9b, 0x6a, 0x71, 0xc3, 0x5c, 0xb8, + 0x9d, 0xc4, 0x68, 0xe6, 0x5d, 0xe2, 0x9f, 0xf0, 0x5f, 0xaf, 0x5f, 0x9b, + 0xa2, 0xc8, 0x58, 0x1a, 0x61, 0x03, 0xa5, 0x42, 0x50, 0x4d, 0x62, 0xbf, + 0xa7, 0x7f, 0x4a, 0x2b, 0x64, 0x7b, 0xa9, 0x58, 0x44, 0x0a, 0x66, 0x3a, + 0xaa, 0xf1, 0x3e, 0xd2, 0x68, 0x0e, 0xac, 0x7a, 0x3a, 0xf4, 0x6a, 0x10, + 0xad, 0xfb, 0x36, 0x96, 0x53, 0x37, 0x8c, 0xcf, 0xb2, 0x20, 0x57, 0x44, + 0x8c, 0x94, 0xa9, 0x33, 0x5b, 0x16, 0x8c, 0x65, 0xa0, 0x9d, 0x5e, 0x67, + 0x8c, 0x92, 0x98, 0x12, 0x61, 0x75, 0x8c, 0xe1, 0x8f, 0x83, 0x62, 0xd3, + 0x8e, 0x8d, 0x86, 0xc9, 0x64, 0x10, 0x90, 0x71, 0x7e, 0x0c, 0x65, 0x39, + 0x92, 0xaf, 0x75, 0xbd, 0x66, 0x52, 0x95, 0x08, 0x6d, 0x83, 0x67, 0x87, + 0x97, 0x85, 0x64, 0xff, 0x68, 0xdc, 0x9a, 0x41, 0x5c, 0xa9, 0x6a, 0x75, + 0x9d, 0x43, 0x54, 0xc1, 0x6c, 0x11, 0xa0, 0x0a, 0x4d, 0x85, 0x6d, 0xa5, + 0xa2, 0x61, 0x47, 0xb5, 0x6f, 0x37, 0xa4, 0x5a, 0x41, 0xc9, 0x70, 0xcc, + 0xa6, 0x40, 0x3d, 0x27, 0x72, 0x91, 0xa8, 0x2e, 0x38, 0x74, 0x5c, 0xaf, + 0x85, 0x0d, 0xb6, 0xf5, 0x60, 0xa3, 0x85, 0x01, 0xad, 0xf7, 0x64, 0x59, + 0x84, 0xdd, 0xa5, 0x92, 0x67, 0xbf, 0x84, 0xe0, 0x9d, 0x17, 0x6a, 0x94, + 0x85, 0x41, 0x94, 0x8f, 0x6c, 0x99, 0x86, 0x30, 0x8c, 0x11, 0x6d, 0xcd, + 0x87, 0xb7, 0x83, 0x86, 0x6e, 0xfb, 0x89, 0xfc, 0x7a, 0xf1, 0x70, 0x20, + 0x8c, 0x62, 0x72, 0x74, 0x71, 0x49, 0x8e, 0xf4, 0x6a, 0x03, 0x72, 0x78, + 0x91, 0x7c, 0x61, 0xa9, 0x73, 0xfb, 0x94, 0xa9, 0x59, 0xe6, 0x75, 0x81, + 0x97, 0xb6, 0x52, 0x24, 0x76, 0xf1, 0x9a, 0xaa, 0x4b, 0xa9, 0x78, 0x85, + 0x9d, 0x32, 0x45, 0xa5, 0x7a, 0x3c, 0x9f, 0x5a, 0x3f, 0xc0, 0x7b, 0xcf, + 0xa1, 0xaa, 0x3a, 0xa3, 0x66, 0xe1, 0x7c, 0xb4, 0xbb, 0xde, 0x6a, 0xdc, + 0x7c, 0xc0, 0xb2, 0xf9, 0x6e, 0x7d, 0x7c, 0xc7, 0xaa, 0x84, 0x71, 0xce, + 0x7c, 0xe7, 0xa2, 0x12, 0x74, 0x68, 0x7d, 0x7c, 0x99, 0xa9, 0x76, 0xc3, + 0x7e, 0x2c, 0x91, 0x45, 0x77, 0xd4, 0x7f, 0x6a, 0x88, 0xdd, 0x78, 0xb9, + 0x80, 0x80, 0x80, 0x80, 0x7a, 0x0e, 0x83, 0xb4, 0x77, 0xeb, 0x7b, 0x55, + 0x86, 0x74, 0x6f, 0x76, 0x7c, 0x9f, 0x89, 0x63, 0x67, 0x3c, 0x7d, 0xef, + 0x8c, 0x15, 0x5f, 0x0e, 0x7f, 0x57, 0x8f, 0x2f, 0x57, 0x39, 0x80, 0xab, + 0x92, 0x35, 0x4f, 0xa1, 0x81, 0xec, 0x95, 0x6c, 0x49, 0xb3, 0x83, 0x4e, + 0x98, 0x33, 0x43, 0xc8, 0x84, 0xda, 0x9a, 0xe1, 0x3d, 0xb0, 0x72, 0x72, + 0x73, 0x7e, 0xc0, 0xf9, 0x76, 0x23, 0x73, 0xd4, 0xb8, 0x33, 0x79, 0x9a, + 0x74, 0x0e, 0xaf, 0xba, 0x7c, 0x87, 0x74, 0x89, 0xa7, 0x65, 0x7f, 0x45, + 0x75, 0x13, 0x9f, 0x07, 0x81, 0x14, 0x76, 0x31, 0x96, 0xab, 0x82, 0xaa, + 0x77, 0x68, 0x8e, 0x52, 0x83, 0x64, 0x79, 0x27, 0x86, 0x00, 0x84, 0x25, + 0x7b, 0x21, 0x7d, 0x90, 0x85, 0x3c, 0x7e, 0x0e, 0x74, 0xee, 0x86, 0x88, + 0x81, 0x06, 0x6c, 0xab, 0x87, 0xdb, 0x83, 0xfa, 0x64, 0xb3, 0x89, 0x2a, + 0x86, 0xe5, 0x5c, 0xe0, 0x8a, 0xa2, 0x89, 0xf5, 0x55, 0x37, 0x8c, 0x16, + 0x8d, 0x17, 0x4d, 0xe4, 0x8d, 0x23, 0x90, 0x8c, 0x47, 0xa7, 0x8e, 0x19, + 0x93, 0xf7, 0x41, 0x3f, 0x7d, 0xfc, 0x6a, 0x6b, 0xc6, 0x07, 0x81, 0x80, + 0x6b, 0x45, 0xbd, 0x3d, 0x84, 0xab, 0x6b, 0xde, 0xb4, 0xe5, 0x87, 0x6b, + 0x6c, 0x7f, 0xac, 0xa0, 0x89, 0xb1, 0x6d, 0x33, 0xa4, 0x5a, 0x8b, 0x81, + 0x6e, 0x2c, 0x9c, 0x0c, 0x8c, 0xf5, 0x6f, 0x62, 0x93, 0xc0, 0x8e, 0x1c, + 0x71, 0x27, 0x8b, 0x6c, 0x8e, 0xe6, 0x73, 0x3f, 0x83, 0x34, 0x8f, 0x9c, + 0x75, 0xde, 0x7a, 0xa8, 0x90, 0x83, 0x78, 0xcf, 0x72, 0x0d, 0x91, 0xb9, + 0x7b, 0xd4, 0x6a, 0x19, 0x93, 0x3c, 0x7e, 0xb2, 0x62, 0x64, 0x94, 0x9b, + 0x81, 0xed, 0x5a, 0xdc, 0x95, 0xfe, 0x85, 0x24, 0x53, 0x4e, 0x97, 0x17, + 0x88, 0x91, 0x4c, 0x20, 0x98, 0x22, 0x8c, 0x2a, 0x45, 0x2d, 0x89, 0xd2, + 0x61, 0x28, 0xca, 0xd1, 0x8d, 0x5a, 0x62, 0x6d, 0xc1, 0x4d, 0x90, 0x0e, + 0x63, 0xad, 0xb9, 0x68, 0x92, 0x88, 0x64, 0xbe, 0xb1, 0xa7, 0x94, 0x58, + 0x65, 0xb9, 0xa9, 0x9e, 0x95, 0xff, 0x66, 0xac, 0xa1, 0x85, 0x97, 0x1c, + 0x68, 0x03, 0x99, 0x8a, 0x98, 0x2f, 0x69, 0x65, 0x91, 0x87, 0x98, 0xe3, + 0x6b, 0x8c, 0x88, 0xf2, 0x99, 0xa8, 0x6d, 0xc1, 0x80, 0x7c, 0x9a, 0x93, + 0x70, 0xce, 0x77, 0xa9, 0x9b, 0x81, 0x73, 0xbb, 0x6f, 0x38, 0x9c, 0xb4, + 0x76, 0xcb, 0x67, 0x90, 0x9e, 0x30, 0x79, 0xaf, 0x5f, 0xed, 0x9f, 0xd3, + 0x7d, 0x24, 0x58, 0x81, 0xa1, 0x6a, 0x80, 0x9a, 0x51, 0x07, 0xa2, 0x4b, + 0x84, 0x6d, 0x49, 0x5c, 0x95, 0x72, 0x59, 0xf1, 0xcf, 0x09, 0x98, 0x39, + 0x5b, 0x09, 0xc5, 0xd6, 0x9a, 0xb5, 0x5c, 0x17, 0xbd, 0xb6, 0x9c, 0xd5, + 0x5d, 0x35, 0xb6, 0x2c, 0x9e, 0xd6, 0x5e, 0x47, 0xae, 0x78, 0xa0, 0x1a, + 0x5f, 0x55, 0xa6, 0xa6, 0xa1, 0x3e, 0x60, 0x80, 0x9e, 0xc5, 0xa1, 0xff, + 0x62, 0x0e, 0x97, 0x15, 0xa2, 0xc5, 0x63, 0xa4, 0x8f, 0x3a, 0xa3, 0x34, + 0x66, 0x1b, 0x86, 0x69, 0xa3, 0xcf, 0x68, 0xa9, 0x7d, 0xac, 0xa4, 0xbc, + 0x6b, 0xd3, 0x74, 0xbb, 0xa6, 0x08, 0x6e, 0xf0, 0x6c, 0x98, 0xa7, 0x54, + 0x72, 0x09, 0x65, 0x04, 0xa8, 0xc9, 0x75, 0x36, 0x5d, 0x5a, 0xaa, 0x65, + 0x78, 0xc5, 0x55, 0x9f, 0xab, 0xed, 0x7c, 0x94, 0x4d, 0xa7, 0x9f, 0x73, + 0x51, 0xe8, 0xd2, 0x24, 0xa1, 0xe6, 0x54, 0x17, 0xc9, 0x42, 0xa4, 0x45, + 0x55, 0xb5, 0xc1, 0x10, 0xa5, 0xfb, 0x56, 0xf3, 0xb9, 0xe1, 0xa7, 0x9a, + 0x58, 0x19, 0xb2, 0xbe, 0xa8, 0xd4, 0x59, 0x23, 0xab, 0x77, 0xa9, 0xdf, + 0x5a, 0x25, 0xa4, 0x0e, 0xaa, 0xc2, 0x5b, 0x51, 0x9c, 0x7b, 0xab, 0x7a, + 0x5c, 0xb2, 0x94, 0xc6, 0xac, 0x35, 0x5e, 0x6f, 0x8c, 0x86, 0xac, 0xe4, + 0x60, 0xc3, 0x83, 0x9b, 0xad, 0x6f, 0x63, 0xd0, 0x7a, 0xa6, 0xae, 0x53, + 0x67, 0x1f, 0x71, 0xbd, 0xaf, 0xa8, 0x6a, 0x7a, 0x69, 0xe5, 0xb1, 0x43, + 0x6d, 0xa8, 0x62, 0x48, 0xb3, 0x4e, 0x71, 0x1e, 0x5a, 0x6a, 0xb4, 0xe3, + 0x74, 0xf9, 0x51, 0xf8, 0xa8, 0x15, 0x4e, 0x25, 0xd3, 0x3b, 0xaa, 0x6d, + 0x4f, 0x26, 0xcb, 0x08, 0xac, 0x96, 0x4f, 0xf8, 0xc3, 0xaa, 0xae, 0x6f, + 0x51, 0x0f, 0xbc, 0xc5, 0xaf, 0xd8, 0x52, 0x4b, 0xb6, 0x23, 0xb1, 0x25, + 0x53, 0x7a, 0xaf, 0x6e, 0xb1, 0xeb, 0x54, 0x7b, 0xa8, 0x7e, 0xb2, 0xc3, + 0x55, 0x79, 0xa1, 0x7c, 0xb3, 0x64, 0x56, 0xb7, 0x9a, 0x24, 0xb3, 0xfe, + 0x58, 0x09, 0x92, 0xae, 0xb4, 0x84, 0x59, 0xf5, 0x8a, 0x31, 0xb5, 0x1c, + 0x5c, 0x2f, 0x81, 0x46, 0xb6, 0x22, 0x5f, 0x74, 0x77, 0xca, 0xb7, 0x29, + 0x62, 0xd8, 0x6e, 0xf3, 0xb8, 0x86, 0x66, 0x64, 0x67, 0x02, 0xba, 0x3f, + 0x69, 0xb9, 0x5f, 0x26, 0xbc, 0x4f, 0x6d, 0xd6, 0x56, 0x6e, 0xb0, 0x77, + 0x4b, 0x36, 0xd3, 0xcc, 0xb2, 0xbc, 0x4c, 0x17, 0xcc, 0x29, 0xb4, 0x9a, + 0x4c, 0xc1, 0xc5, 0x88, 0xb6, 0x58, 0x4d, 0x72, 0xbf, 0x1b, 0xb7, 0x6b, + 0x4e, 0x27, 0xb9, 0x07, 0xb8, 0x89, 0x4e, 0xe4, 0xb2, 0xde, 0xb9, 0x6a, + 0x4f, 0xa0, 0xac, 0x76, 0xba, 0x22, 0x50, 0x68, 0xa5, 0xdd, 0xba, 0xe2, + 0x51, 0x5a, 0x9f, 0x2a, 0xbb, 0x6e, 0x52, 0x83, 0x97, 0xeb, 0xbc, 0x03, + 0x53, 0xb3, 0x90, 0xa3, 0xbc, 0x58, 0x55, 0xe5, 0x87, 0xe2, 0xbc, 0xd9, + 0x58, 0x42, 0x7e, 0xf8, 0xbe, 0x06, 0x5b, 0x8e, 0x75, 0x8a, 0xbf, 0x87, + 0x5f, 0x0a, 0x6c, 0x51, 0xc1, 0x0e, 0x62, 0xae, 0x63, 0xe1, 0xc3, 0x07, + 0x67, 0x3f, 0x5a, 0x11, 0xb8, 0xb3, 0x47, 0xf9, 0xd3, 0xba, 0xba, 0xae, + 0x48, 0xef, 0xcd, 0x1a, 0xbc, 0x5f, 0x49, 0xae, 0xc7, 0x27, 0xbe, 0x12, + 0x4a, 0x73, 0xc1, 0x52, 0xbf, 0x1b, 0x4b, 0x02, 0xbb, 0x96, 0xbf, 0xfd, + 0x4b, 0x88, 0xb5, 0xd5, 0xc0, 0xef, 0x4b, 0xf6, 0xb0, 0x1e, 0xc1, 0x8d, + 0x4c, 0x7f, 0xa9, 0xdf, 0xc2, 0x34, 0x4d, 0x10, 0xa3, 0x93, 0xc2, 0xcf, + 0x4d, 0xbf, 0x9c, 0xe7, 0xc3, 0x58, 0x4e, 0x95, 0x95, 0xbd, 0xc3, 0xe0, + 0x4f, 0xb7, 0x8e, 0x31, 0xc4, 0x26, 0x51, 0xf9, 0x85, 0x8d, 0xc4, 0xbb, + 0x54, 0x9f, 0x7c, 0xa3, 0xc5, 0xd5, 0x57, 0xea, 0x73, 0x2e, 0xc7, 0x2e, + 0x5b, 0xd9, 0x69, 0xaf, 0xc9, 0x07, 0x5f, 0xeb, 0x5f, 0xcc, 0xc0, 0x6e, + 0x44, 0x88, 0xd4, 0x0f, 0xc2, 0x74, 0x45, 0x90, 0xce, 0x0a, 0xc4, 0x36, + 0x46, 0x1d, 0xc8, 0xe6, 0xc5, 0xe6, 0x46, 0x77, 0xc3, 0xe6, 0xc7, 0x58, + 0x46, 0xad, 0xbe, 0xdf, 0xc8, 0x18, 0x46, 0xfc, 0xb9, 0x60, 0xc8, 0xdb, + 0x47, 0x50, 0xb3, 0xd7, 0xc9, 0x8c, 0x47, 0xb7, 0xae, 0x1a, 0xca, 0x1c, + 0x48, 0x3a, 0xa7, 0xfc, 0xca, 0xab, 0x48, 0xcd, 0xa1, 0xd1, 0xcb, 0x28, + 0x49, 0x8c, 0x9b, 0x04, 0xcb, 0x8a, 0x4a, 0x78, 0x93, 0xd6, 0xcc, 0x09, + 0x4b, 0xd7, 0x8c, 0x23, 0xcc, 0x7a, 0x4d, 0xd4, 0x83, 0xc5, 0xcd, 0x03, + 0x50, 0xb0, 0x7a, 0x8a, 0xcd, 0xd1, 0x54, 0x2b, 0x70, 0xef, 0xce, 0xff, + 0x58, 0xd2, 0x66, 0x43, 0x3b, 0x3b, 0xb3, 0x06, 0xa4, 0xd7, 0x3d, 0x01, + 0xb3, 0xed, 0x9c, 0x2b, 0x3d, 0xba, 0xb5, 0x5a, 0x93, 0xf2, 0x3e, 0x22, + 0xb6, 0xf8, 0x8b, 0xb9, 0x3e, 0x36, 0xb8, 0xb5, 0x83, 0x76, 0x3e, 0x41, + 0xba, 0x98, 0x7b, 0x4a, 0x3e, 0x35, 0xbc, 0x85, 0x73, 0x29, 0x3e, 0x0c, + 0xbe, 0xc3, 0x6a, 0xcc, 0x3e, 0x1c, 0xc0, 0xe9, 0x62, 0xac, 0x3d, 0xff, + 0xc2, 0x46, 0x5a, 0x04, 0x3d, 0x80, 0xc3, 0x64, 0x50, 0xd9, 0x3f, 0xa6, + 0xc3, 0xbd, 0x4a, 0x88, 0x41, 0x08, 0xc4, 0x73, 0x44, 0x54, 0x44, 0x39, + 0xc4, 0x24, 0x3f, 0x3d, 0x47, 0x23, 0xc4, 0x47, 0x3b, 0xb3, 0x49, 0xdd, + 0xc4, 0x63, 0x38, 0x09, 0x4c, 0x8d, 0xc4, 0x63, 0x34, 0x38, 0x41, 0x00, + 0xad, 0x10, 0xa7, 0xea, 0x43, 0xa4, 0xad, 0x64, 0x9e, 0xb4, 0x45, 0x10, + 0xae, 0x8b, 0x96, 0x4b, 0x46, 0x34, 0xaf, 0xec, 0x8d, 0xe4, 0x46, 0xbc, + 0xb1, 0xb2, 0x85, 0x95, 0x47, 0x21, 0xb3, 0x9c, 0x7d, 0x5c, 0x47, 0x64, + 0xb5, 0xca, 0x75, 0x56, 0x47, 0xa8, 0xb7, 0xd7, 0x6d, 0x13, 0x48, 0x11, + 0xb9, 0xec, 0x64, 0x95, 0x48, 0x7a, 0xbb, 0xaa, 0x5c, 0x2b, 0x48, 0xe5, + 0xbc, 0xe7, 0x53, 0x8b, 0x4a, 0x53, 0xbd, 0xa9, 0x4c, 0x8f, 0x4c, 0x56, + 0xbe, 0x0a, 0x46, 0x52, 0x4e, 0x47, 0xbe, 0x40, 0x40, 0x51, 0x50, 0xbc, + 0xbe, 0xa1, 0x3c, 0xb6, 0x52, 0xfc, 0xbf, 0x18, 0x39, 0x18, 0x55, 0x3f, + 0xbf, 0x7e, 0x35, 0x57, 0x46, 0x01, 0xa7, 0x35, 0xab, 0x64, 0x49, 0x2b, + 0xa7, 0x41, 0xa1, 0xb9, 0x4b, 0x77, 0xa7, 0xf7, 0x99, 0x1d, 0x4d, 0x87, + 0xa8, 0xd7, 0x90, 0xa4, 0x4e, 0x9b, 0xaa, 0xa9, 0x88, 0x23, 0x4f, 0x74, + 0xac, 0x8b, 0x7f, 0x97, 0x4f, 0xea, 0xaf, 0x1f, 0x77, 0x7f, 0x50, 0x3e, + 0xb1, 0x7c, 0x6f, 0x7d, 0x51, 0x0e, 0xb3, 0x45, 0x66, 0xca, 0x51, 0xc9, + 0xb5, 0x05, 0x5e, 0x62, 0x52, 0x9b, 0xb6, 0x64, 0x56, 0x18, 0x53, 0xac, + 0xb7, 0x88, 0x4e, 0x81, 0x55, 0x79, 0xb8, 0x51, 0x48, 0x8f, 0x57, 0x1d, + 0xb8, 0xf6, 0x42, 0x5a, 0x59, 0x16, 0xb9, 0x9f, 0x3e, 0x15, 0x5b, 0x32, + 0xba, 0x59, 0x3a, 0x72, 0x5d, 0x87, 0xbb, 0x01, 0x36, 0x49, 0x4b, 0x0a, + 0xa1, 0x5e, 0xae, 0xe7, 0x4e, 0x9d, 0xa1, 0x4b, 0xa4, 0xe9, 0x51, 0xc9, + 0xa1, 0x6b, 0x9b, 0xf8, 0x54, 0x95, 0xa1, 0xdf, 0x93, 0x8e, 0x56, 0x67, + 0xa3, 0x2e, 0x8b, 0x22, 0x57, 0x78, 0xa5, 0x02, 0x82, 0xa6, 0x58, 0x4c, + 0xa7, 0x2a, 0x7a, 0x7e, 0x58, 0xe8, 0xa9, 0x95, 0x72, 0x7e, 0x59, 0xc2, + 0xab, 0xcb, 0x69, 0xde, 0x5a, 0xb3, 0xad, 0xd7, 0x61, 0x20, 0x5b, 0xb3, + 0xaf, 0xc9, 0x58, 0xc7, 0x5c, 0x97, 0xb1, 0x52, 0x50, 0xa5, 0x5e, 0x64, + 0xb2, 0x8a, 0x4a, 0x9a, 0x60, 0x1e, 0xb3, 0x8b, 0x44, 0xa5, 0x61, 0xc1, + 0xb4, 0x5d, 0x3f, 0x56, 0x63, 0x9a, 0xb5, 0x49, 0x3b, 0xb4, 0x65, 0xa1, + 0xb6, 0x2b, 0x37, 0x7f, 0x51, 0x81, 0x9b, 0x08, 0xb2, 0x44, 0x55, 0x7c, + 0x9a, 0x9f, 0xa8, 0xd3, 0x59, 0x14, 0x9a, 0x54, 0x9f, 0xca, 0x5c, 0x25, + 0x9a, 0xad, 0x97, 0x53, 0x5e, 0xe9, 0x9b, 0x43, 0x8e, 0xdf, 0x5f, 0xea, + 0x9d, 0x19, 0x86, 0x4d, 0x60, 0xbe, 0x9f, 0x19, 0x7d, 0xdf, 0x61, 0x94, + 0xa1, 0x56, 0x75, 0xe6, 0x62, 0x7b, 0xa3, 0x8a, 0x6d, 0xbd, 0x63, 0xa6, + 0xa5, 0x93, 0x64, 0xe1, 0x64, 0xd8, 0xa7, 0xcd, 0x5c, 0x9e, 0x66, 0x0a, + 0xaa, 0x01, 0x54, 0xbd, 0x67, 0x5e, 0xab, 0xe4, 0x4d, 0x99, 0x69, 0x0c, + 0xad, 0x6e, 0x47, 0x99, 0x6a, 0xb0, 0xae, 0xb5, 0x41, 0x82, 0x6c, 0x72, + 0xb0, 0x05, 0x3d, 0x1c, 0x6e, 0x4c, 0xb1, 0x3f, 0x38, 0x9e, 0x59, 0x38, + 0x94, 0x20, 0xb6, 0x45, 0x5d, 0x39, 0x93, 0xa8, 0xac, 0xf4, 0x60, 0xd1, + 0x93, 0x5a, 0xa4, 0x33, 0x64, 0x25, 0x93, 0x4e, 0x9b, 0x9d, 0x67, 0x03, + 0x93, 0xaa, 0x93, 0x1c, 0x68, 0xc8, 0x94, 0xf0, 0x8a, 0x91, 0x69, 0xf7, + 0x96, 0xb1, 0x82, 0x05, 0x6a, 0xfb, 0x98, 0xc4, 0x79, 0xd5, 0x6b, 0xd7, + 0x9a, 0xef, 0x71, 0xe0, 0x6c, 0xd7, 0x9d, 0x27, 0x69, 0x3e, 0x6d, 0xce, + 0x9f, 0x39, 0x60, 0x26, 0x6f, 0x64, 0xa2, 0x02, 0x58, 0x95, 0x70, 0xc2, + 0xa4, 0x6a, 0x51, 0x05, 0x72, 0x3e, 0xa6, 0x74, 0x4b, 0x1b, 0x73, 0xc2, + 0xa8, 0x31, 0x45, 0x54, 0x75, 0x46, 0xa9, 0xc1, 0x3f, 0xaf, 0x77, 0x16, + 0xab, 0xb7, 0x3a, 0x9d, 0x61, 0xa6, 0x8c, 0xc4, 0xba, 0xc3, 0x65, 0xf7, + 0x8c, 0x3d, 0xb1, 0x74, 0x69, 0xb6, 0x8b, 0xe5, 0xa8, 0xdf, 0x6d, 0x4f, + 0x8b, 0x9d, 0xa0, 0x64, 0x6f, 0xe8, 0x8c, 0x17, 0x97, 0xdc, 0x72, 0x1e, + 0x8c, 0xc8, 0x8f, 0x4d, 0x73, 0x2f, 0x8e, 0x7e, 0x86, 0xa6, 0x74, 0x47, + 0x90, 0x5b, 0x7e, 0x0f, 0x75, 0x77, 0x92, 0x5e, 0x75, 0xf8, 0x76, 0x8d, + 0x94, 0x89, 0x6d, 0xec, 0x77, 0xa3, 0x96, 0xee, 0x65, 0x91, 0x78, 0xc2, + 0x99, 0x74, 0x5d, 0x5b, 0x7a, 0x34, 0x9c, 0x51, 0x55, 0xa3, 0x7b, 0xb2, + 0x9e, 0xee, 0x4e, 0x6d, 0x7d, 0x45, 0xa1, 0x1e, 0x48, 0xae, 0x7e, 0xcb, + 0xa2, 0xff, 0x43, 0x0d, 0x80, 0x72, 0xa5, 0x43, 0x3c, 0xeb, 0x6b, 0x5f, + 0x84, 0xbe, 0xbf, 0x41, 0x6f, 0x76, 0x84, 0x77, 0xb6, 0x4d, 0x73, 0x4b, + 0x84, 0x2f, 0xad, 0xb8, 0x76, 0x9f, 0x84, 0x21, 0xa5, 0x34, 0x79, 0x83, + 0x84, 0x5b, 0x9c, 0xb8, 0x7b, 0xc7, 0x84, 0xfe, 0x94, 0x53, 0x7d, 0x4d, + 0x86, 0x09, 0x8b, 0xed, 0x7e, 0x28, 0x87, 0x83, 0x83, 0x7e, 0x7f, 0x42, + 0x89, 0xb3, 0x7b, 0x0d, 0x80, 0x71, 0x8c, 0x15, 0x72, 0xb0, 0x81, 0xaa, + 0x8e, 0x8a, 0x6a, 0x75, 0x82, 0xe7, 0x90, 0xea, 0x62, 0x4f, 0x84, 0x1a, + 0x93, 0xc6, 0x5a, 0xa3, 0x85, 0x71, 0x96, 0x9f, 0x53, 0x1e, 0x86, 0xb7, + 0x99, 0x76, 0x4c, 0xa1, 0x88, 0x0c, 0x9c, 0x19, 0x46, 0xbc, 0x89, 0xc2, + 0x9e, 0xbb, 0x3f, 0xfa, 0x75, 0xcb, 0x7c, 0x75, 0xc3, 0xf1, 0x79, 0xc8, + 0x7c, 0x58, 0xbb, 0x47, 0x7d, 0x68, 0x7c, 0x42, 0xb2, 0xd8, 0x80, 0x9c, + 0x7c, 0x62, 0xaa, 0x61, 0x83, 0x83, 0x7c, 0x9a, 0xa1, 0xd4, 0x85, 0x97, + 0x7d, 0x4e, 0x99, 0x6c, 0x87, 0x6c, 0x7e, 0x1c, 0x91, 0x0c, 0x88, 0x32, + 0x7f, 0x68, 0x88, 0xc0, 0x88, 0xdc, 0x80, 0x80, 0x80, 0x80, 0x8a, 0x2f, + 0x83, 0x99, 0x78, 0x19, 0x8b, 0x62, 0x86, 0x42, 0x6f, 0xcc, 0x8c, 0xb0, + 0x88, 0xee, 0x67, 0xd6, 0x8d, 0xfd, 0x8b, 0x54, 0x5f, 0xd2, 0x8f, 0xa7, + 0x8e, 0x35, 0x58, 0x20, 0x91, 0x75, 0x90, 0xe9, 0x50, 0x89, 0x92, 0x13, + 0x94, 0x51, 0x4a, 0x93, 0x93, 0x43, 0x97, 0xed, 0x43, 0x30, 0x81, 0x24, + 0x73, 0x4f, 0xc8, 0xca, 0x84, 0xf2, 0x73, 0xb4, 0xc0, 0x1f, 0x88, 0x37, + 0x73, 0xd1, 0xb7, 0xba, 0x8b, 0x51, 0x73, 0xf6, 0xaf, 0x54, 0x8d, 0xcf, + 0x74, 0x7c, 0xa6, 0xf3, 0x90, 0x0c, 0x75, 0x1d, 0x9e, 0x91, 0x91, 0x88, + 0x76, 0x3c, 0x96, 0x53, 0x92, 0xcc, 0x77, 0x81, 0x8e, 0x16, 0x93, 0x75, + 0x79, 0x3e, 0x85, 0xe7, 0x94, 0x2e, 0x7b, 0x2f, 0x7d, 0xa4, 0x95, 0x4b, + 0x7d, 0xff, 0x75, 0x39, 0x96, 0xa4, 0x80, 0xca, 0x6d, 0x2b, 0x98, 0x01, + 0x83, 0x94, 0x65, 0x69, 0x99, 0x53, 0x86, 0x63, 0x5d, 0xad, 0x9a, 0xda, + 0x89, 0x6e, 0x56, 0x31, 0x9c, 0x7e, 0x8c, 0x50, 0x4e, 0xdb, 0x9d, 0xbd, + 0x8f, 0xba, 0x47, 0xd2, 0x8d, 0x0c, 0x6a, 0x32, 0xcd, 0x92, 0x90, 0x74, + 0x6a, 0xf6, 0xc4, 0xa4, 0x93, 0x53, 0x6b, 0x89, 0xbc, 0x53, 0x95, 0xf1, + 0x6c, 0x13, 0xb4, 0x1f, 0x98, 0x27, 0x6c, 0xb4, 0xab, 0xe0, 0x99, 0xfd, + 0x6d, 0x75, 0xa3, 0xaa, 0x9b, 0x77, 0x6e, 0x84, 0x9b, 0x81, 0x9c, 0xb6, + 0x6f, 0xcc, 0x93, 0x54, 0x9d, 0xab, 0x71, 0x99, 0x8b, 0x2a, 0x9e, 0x5d, + 0x73, 0x8f, 0x83, 0x12, 0x9f, 0x37, 0x76, 0x08, 0x7a, 0xbb, 0xa0, 0x57, + 0x78, 0xcb, 0x72, 0x65, 0xa1, 0xa9, 0x7b, 0xa5, 0x6a, 0x97, 0xa3, 0x41, + 0x7e, 0x6f, 0x62, 0xef, 0xa4, 0xac, 0x81, 0x9c, 0x5b, 0x56, 0xa5, 0xde, + 0x84, 0xdf, 0x53, 0xcc, 0xa7, 0x3a, 0x88, 0x4f, 0x4c, 0x15, 0x98, 0x1d, + 0x61, 0x06, 0xd1, 0xd6, 0x9b, 0x36, 0x62, 0x01, 0xc8, 0xfb, 0x9e, 0x2a, + 0x62, 0xe0, 0xc0, 0xb7, 0xa0, 0x86, 0x63, 0xfc, 0xb8, 0xb8, 0xa2, 0xa5, + 0x64, 0xff, 0xb0, 0xa1, 0xa4, 0x03, 0x66, 0x0c, 0xa8, 0xb9, 0xa5, 0x5f, + 0x67, 0x0a, 0xa0, 0xd0, 0xa6, 0x4a, 0x68, 0x74, 0x98, 0xef, 0xa7, 0x32, + 0x69, 0xdf, 0x90, 0xf8, 0xa7, 0xe4, 0x6c, 0x01, 0x88, 0x8e, 0xa8, 0xaa, + 0x6e, 0x16, 0x80, 0x47, 0xa9, 0xca, 0x71, 0x0a, 0x77, 0xc0, 0xaa, 0xe0, + 0x73, 0xdc, 0x6f, 0x8c, 0xac, 0x33, 0x76, 0xd7, 0x67, 0xf2, 0xad, 0xca, + 0x79, 0xac, 0x60, 0x50, 0xaf, 0x54, 0x7d, 0x2b, 0x58, 0x89, 0xb0, 0xad, + 0x80, 0xc9, 0x50, 0x6d, 0xa2, 0x22, 0x59, 0x6e, 0xd5, 0xba, 0xa5, 0x25, + 0x5b, 0x27, 0xcc, 0x00, 0xa7, 0xb4, 0x5c, 0x27, 0xc3, 0xfa, 0xa9, 0xdf, + 0x5d, 0x06, 0xbc, 0x5c, 0xab, 0x9f, 0x5d, 0xfa, 0xb4, 0xe6, 0xad, 0x2b, + 0x5e, 0xe3, 0xad, 0x5a, 0xae, 0x7b, 0x5f, 0xdb, 0xa5, 0xaf, 0xaf, 0xa4, + 0x61, 0x10, 0x9e, 0x02, 0xb0, 0x55, 0x62, 0x9b, 0x96, 0x53, 0xb0, 0xfe, + 0x64, 0x49, 0x8e, 0x6e, 0xb1, 0x91, 0x66, 0x99, 0x85, 0xf2, 0xb2, 0x4c, + 0x69, 0x16, 0x7d, 0x7f, 0xb3, 0x79, 0x6c, 0x2f, 0x74, 0xf1, 0xb5, 0x04, + 0x6f, 0x2e, 0x6c, 0xf2, 0xb6, 0x79, 0x72, 0x3c, 0x65, 0x43, 0xb7, 0xfc, + 0x75, 0x6c, 0x5d, 0x60, 0xb9, 0x9b, 0x79, 0x48, 0x54, 0xcc, 0xaa, 0xf9, + 0x53, 0xf3, 0xd6, 0xf7, 0xad, 0xfa, 0x55, 0x91, 0xcd, 0xaa, 0xb0, 0x5a, + 0x56, 0x7d, 0xc6, 0x52, 0xb2, 0x80, 0x57, 0x49, 0xbf, 0x3a, 0xb3, 0xe8, + 0x58, 0x56, 0xb8, 0x5c, 0xb5, 0x4d, 0x59, 0x46, 0xb1, 0x72, 0xb6, 0x63, + 0x5a, 0x38, 0xaa, 0x5a, 0xb7, 0x74, 0x5b, 0x2e, 0xa3, 0x28, 0xb8, 0x4e, + 0x5c, 0x56, 0x9b, 0xc7, 0xb8, 0xfe, 0x5d, 0xab, 0x94, 0x44, 0xb9, 0xad, + 0x5f, 0x63, 0x8c, 0x26, 0xba, 0x47, 0x61, 0xab, 0x83, 0x72, 0xbb, 0x1e, + 0x64, 0x8e, 0x7a, 0xc1, 0xbc, 0x62, 0x67, 0xa8, 0x72, 0x31, 0xbe, 0x05, + 0x6a, 0xe0, 0x6a, 0x31, 0xc0, 0x06, 0x6d, 0xf3, 0x62, 0x60, 0xc1, 0xc0, + 0x71, 0xfa, 0x59, 0x44, 0xb3, 0x50, 0x4f, 0x65, 0xd7, 0x82, 0xb6, 0x0f, + 0x50, 0x53, 0xce, 0xd5, 0xb8, 0x2d, 0x51, 0x58, 0xc8, 0x1d, 0xba, 0x32, + 0x52, 0x52, 0xc1, 0x8a, 0xbb, 0x9a, 0x53, 0x4c, 0xbb, 0x2b, 0xbc, 0xd4, + 0x54, 0x3c, 0xb4, 0xcd, 0xbd, 0xf4, 0x55, 0x1d, 0xae, 0x53, 0xbe, 0xdc, + 0x56, 0x06, 0xa7, 0x97, 0xbf, 0xce, 0x56, 0xee, 0xa0, 0xcd, 0xc0, 0x79, + 0x58, 0x0e, 0x99, 0x91, 0xc1, 0x1b, 0x59, 0x45, 0x92, 0x3a, 0xc1, 0xa6, + 0x5b, 0x33, 0x89, 0xe0, 0xc2, 0x46, 0x5d, 0x59, 0x81, 0x21, 0xc3, 0x92, + 0x60, 0x65, 0x77, 0xea, 0xc4, 0xdb, 0x63, 0xaa, 0x6f, 0x3e, 0xc6, 0x5e, + 0x67, 0x4a, 0x66, 0xde, 0xc8, 0xd1, 0x6b, 0xf9, 0x5b, 0xc6, 0xbc, 0x05, + 0x4c, 0x35, 0xd6, 0xb6, 0xbe, 0x4c, 0x4d, 0x1b, 0xcf, 0x7f, 0xc0, 0x11, + 0x4d, 0xd3, 0xc9, 0x72, 0xc1, 0xec, 0x4e, 0x5d, 0xc3, 0xb4, 0xc3, 0x6e, + 0x4e, 0xd4, 0xbd, 0xf2, 0xc4, 0x78, 0x4f, 0x5a, 0xb8, 0x10, 0xc5, 0x83, + 0x4f, 0xe5, 0xb2, 0x21, 0xc6, 0x66, 0x50, 0xa0, 0xab, 0xe0, 0xc7, 0x38, + 0x51, 0x84, 0xa5, 0x68, 0xc8, 0x02, 0x52, 0x76, 0x9e, 0xbb, 0xc8, 0x96, + 0x53, 0xa8, 0x97, 0x61, 0xc9, 0x2d, 0x54, 0xe8, 0x8f, 0xfd, 0xc9, 0xa4, + 0x57, 0x20, 0x87, 0x8a, 0xca, 0x42, 0x59, 0x69, 0x7e, 0xfa, 0xcb, 0x76, + 0x5c, 0xb4, 0x75, 0x86, 0xcc, 0xee, 0x60, 0x47, 0x6c, 0x22, 0xce, 0x95, + 0x64, 0xa4, 0x62, 0x1b, 0xc4, 0x94, 0x48, 0xa8, 0xd7, 0x83, 0xc6, 0xc3, + 0x49, 0xbe, 0xd0, 0xe5, 0xc8, 0x87, 0x4a, 0x2e, 0xcb, 0x87, 0xca, 0x27, + 0x4a, 0x6f, 0xc6, 0x56, 0xcb, 0xc0, 0x4a, 0x86, 0xc1, 0x3d, 0xcc, 0xb4, + 0x4a, 0xdf, 0xbb, 0xaa, 0xcd, 0x8e, 0x4b, 0x4c, 0xb5, 0xf0, 0xce, 0x5d, + 0x4b, 0xc3, 0xb0, 0x28, 0xcf, 0x13, 0x4c, 0x6c, 0xa9, 0xe8, 0xcf, 0xc8, + 0x4d, 0x26, 0xa3, 0x95, 0xd0, 0x6f, 0x4e, 0x0b, 0x9c, 0xcb, 0xd0, 0xd6, + 0x4f, 0x3e, 0x95, 0x4c, 0xd1, 0x59, 0x50, 0xc5, 0x8d, 0x9b, 0xd1, 0xf5, + 0x52, 0xd3, 0x85, 0x8c, 0xd2, 0x9e, 0x55, 0x5f, 0x7c, 0xe9, 0xd3, 0xa7, + 0x58, 0xc4, 0x73, 0x45, 0xd5, 0x80, 0x5c, 0xd9, 0x68, 0x96, 0x43, 0x5d, + 0xb9, 0x17, 0xaa, 0x49, 0x44, 0xdb, 0xb9, 0xd8, 0xa1, 0x82, 0x45, 0x72, + 0xbb, 0x3a, 0x99, 0x17, 0x45, 0xa4, 0xbc, 0xd6, 0x90, 0xb8, 0x45, 0xab, + 0xbe, 0x6c, 0x88, 0x4e, 0x45, 0x88, 0xbf, 0xfe, 0x7f, 0xd8, 0x45, 0x5b, + 0xc1, 0xae, 0x77, 0xea, 0x45, 0x01, 0xc3, 0x36, 0x70, 0x11, 0x44, 0xef, + 0xc5, 0x09, 0x68, 0x2a, 0x45, 0x16, 0xc6, 0x87, 0x60, 0x5e, 0x44, 0x8b, + 0xc7, 0x5e, 0x57, 0x98, 0x44, 0x73, 0xc7, 0xee, 0x4f, 0x23, 0x44, 0x8c, + 0xc8, 0xf9, 0x48, 0xed, 0x48, 0x29, 0xc7, 0xf4, 0x43, 0x4e, 0x4a, 0xb2, + 0xc7, 0xc1, 0x3e, 0x6d, 0x4d, 0x70, 0xc7, 0xb2, 0x3a, 0xa4, 0x4f, 0xf1, + 0xc7, 0xb3, 0x36, 0xa0, 0x48, 0xb8, 0xb3, 0x42, 0xac, 0xd9, 0x4b, 0x01, + 0xb3, 0xa1, 0xa3, 0xdb, 0x4c, 0x7d, 0xb4, 0x88, 0x9b, 0x4d, 0x4d, 0x4f, + 0xb5, 0xe2, 0x92, 0xe2, 0x4d, 0xd1, 0xb7, 0x72, 0x8a, 0x6d, 0x4e, 0x2d, + 0xb9, 0x06, 0x81, 0xe9, 0x4e, 0x58, 0xba, 0xfc, 0x79, 0xd1, 0x4e, 0x60, + 0xbc, 0xef, 0x71, 0xcd, 0x4e, 0xb5, 0xbe, 0xe5, 0x69, 0xac, 0x4f, 0x03, + 0xc0, 0xae, 0x61, 0xd2, 0x4f, 0x6d, 0xc1, 0x8e, 0x59, 0xcc, 0x4f, 0xdc, + 0xc2, 0x36, 0x51, 0xcc, 0x51, 0x3c, 0xc2, 0x59, 0x4b, 0x54, 0x52, 0xb6, + 0xc2, 0x5f, 0x45, 0x04, 0x54, 0x51, 0xc2, 0x6d, 0x3f, 0x8c, 0x56, 0x85, + 0xc2, 0xbe, 0x3b, 0xca, 0x58, 0xb8, 0xc3, 0x05, 0x37, 0xd1, 0x4d, 0xb9, + 0xad, 0xa4, 0xaf, 0xb7, 0x50, 0x8e, 0xad, 0xbc, 0xa6, 0x80, 0x52, 0xf1, + 0xae, 0x0a, 0x9d, 0x9f, 0x54, 0x76, 0xaf, 0x1b, 0x95, 0x12, 0x55, 0x97, + 0xb0, 0x75, 0x8c, 0x87, 0x56, 0x3f, 0xb2, 0x19, 0x84, 0x08, 0x56, 0xb0, + 0xb4, 0x16, 0x7b, 0xe0, 0x56, 0xe2, 0xb6, 0x53, 0x73, 0xfe, 0x57, 0x43, + 0xb8, 0x58, 0x6b, 0xec, 0x57, 0xd1, 0xba, 0x40, 0x63, 0xeb, 0x58, 0x66, + 0xbb, 0xb6, 0x5b, 0xe9, 0x59, 0x04, 0xbc, 0xa3, 0x53, 0xa9, 0x5a, 0x2e, + 0xbd, 0x29, 0x4c, 0xdf, 0x5b, 0xa7, 0xbd, 0x73, 0x46, 0xff, 0x5d, 0x03, + 0xbd, 0xa3, 0x41, 0x1c, 0x5f, 0x06, 0xbe, 0x27, 0x3d, 0x09, 0x61, 0x2e, + 0xbe, 0x76, 0x38, 0xde, 0x52, 0xf1, 0xa7, 0xca, 0xb3, 0x1b, 0x56, 0x1d, + 0xa7, 0x96, 0xa9, 0x94, 0x59, 0x06, 0xa7, 0x77, 0xa0, 0x86, 0x5b, 0x49, + 0xa8, 0x29, 0x97, 0xfe, 0x5d, 0x5f, 0xa8, 0xfd, 0x8f, 0x78, 0x5e, 0x34, + 0xaa, 0xc1, 0x86, 0xe9, 0x5e, 0xf4, 0xac, 0xa4, 0x7e, 0x6f, 0x5f, 0x70, + 0xaf, 0x26, 0x76, 0x7a, 0x5f, 0xdd, 0xb1, 0x72, 0x6e, 0x8d, 0x60, 0xa6, + 0xb3, 0x44, 0x66, 0x5c, 0x61, 0x59, 0xb5, 0x04, 0x5e, 0x6d, 0x62, 0x24, + 0xb6, 0x33, 0x56, 0x70, 0x63, 0x0e, 0xb7, 0x2e, 0x4e, 0xec, 0x64, 0x7f, + 0xb7, 0xca, 0x49, 0x1e, 0x65, 0xd3, 0xb8, 0x3c, 0x43, 0x37, 0x67, 0x5f, + 0xb8, 0xc1, 0x3e, 0x52, 0x69, 0x52, 0xb9, 0x6a, 0x3a, 0x03, 0x58, 0xa4, + 0xa1, 0xc9, 0xb6, 0xa8, 0x5c, 0x3a, 0xa1, 0x47, 0xac, 0xd8, 0x5f, 0x5d, + 0xa1, 0x04, 0xa3, 0xb9, 0x62, 0x47, 0xa1, 0x28, 0x9b, 0x18, 0x64, 0xe8, + 0xa1, 0xae, 0x92, 0xbb, 0x66, 0x58, 0xa3, 0x0e, 0x8a, 0x59, 0x67, 0x46, + 0xa4, 0xc6, 0x81, 0xec, 0x68, 0x04, 0xa6, 0xe1, 0x79, 0xec, 0x68, 0x8e, + 0xa9, 0x30, 0x72, 0x09, 0x69, 0x61, 0xab, 0x4d, 0x69, 0xaa, 0x6a, 0x43, + 0xad, 0x50, 0x61, 0x56, 0x6b, 0x38, 0xaf, 0x2b, 0x59, 0x61, 0x6c, 0x0c, + 0xb0, 0xb5, 0x51, 0x6c, 0x6d, 0x84, 0xb1, 0xce, 0x4b, 0x69, 0x6e, 0xf2, + 0xb2, 0xa7, 0x45, 0xa5, 0x70, 0x48, 0xb3, 0x5b, 0x3f, 0xf4, 0x72, 0x30, + 0xb4, 0x7f, 0x3b, 0x3b, 0x60, 0x1b, 0x9b, 0x0b, 0xba, 0x9c, 0x63, 0xd3, + 0x9a, 0x5c, 0xb0, 0xda, 0x67, 0x24, 0x99, 0xf7, 0xa7, 0xf8, 0x6a, 0x58, + 0x99, 0xab, 0x9f, 0x3b, 0x6c, 0xd1, 0x9a, 0x39, 0x96, 0xc5, 0x6e, 0xda, + 0x9b, 0x1a, 0x8e, 0x4f, 0x6f, 0xee, 0x9c, 0xe5, 0x85, 0xd4, 0x70, 0xe5, + 0x9e, 0xc7, 0x7d, 0x92, 0x71, 0xa4, 0xa0, 0xd9, 0x75, 0xcc, 0x72, 0x5d, + 0xa2, 0xea, 0x6d, 0xcf, 0x73, 0x3f, 0xa4, 0xe6, 0x65, 0x22, 0x74, 0x46, + 0xa7, 0x08, 0x5d, 0x23, 0x75, 0x7c, 0xa9, 0x27, 0x55, 0xab, 0x76, 0xb1, + 0xaa, 0xf4, 0x4e, 0xa8, 0x78, 0x2b, 0xac, 0x74, 0x48, 0xec, 0x79, 0xa2, + 0xad, 0xc6, 0x43, 0x25, 0x7b, 0x5d, 0xaf, 0x72, 0x3d, 0x48, 0x67, 0xb7, + 0x93, 0xfd, 0xbe, 0x98, 0x6b, 0xc4, 0x93, 0x4d, 0xb5, 0x35, 0x6f, 0x86, + 0x92, 0xc2, 0xac, 0x5c, 0x72, 0xe4, 0x92, 0x62, 0xa3, 0xc3, 0x75, 0x8c, + 0x92, 0x97, 0x9b, 0x2f, 0x77, 0xa8, 0x93, 0x47, 0x92, 0xaf, 0x79, 0x10, + 0x94, 0xa4, 0x8a, 0x3b, 0x7a, 0x28, 0x96, 0x4a, 0x81, 0xd1, 0x7b, 0x27, + 0x98, 0x44, 0x79, 0xcc, 0x7b, 0xf7, 0x9a, 0x61, 0x71, 0xfb, 0x7c, 0xc3, + 0x9c, 0x86, 0x69, 0xa4, 0x7d, 0x66, 0x9e, 0x7d, 0x60, 0xf0, 0x7e, 0xc6, + 0xa1, 0x18, 0x59, 0x6a, 0x80, 0x2b, 0xa3, 0x6e, 0x52, 0x30, 0x81, 0x94, + 0xa5, 0x63, 0x4c, 0x36, 0x83, 0x03, 0xa7, 0x2b, 0x46, 0x86, 0x84, 0x97, + 0xa8, 0xf8, 0x40, 0x29, 0x70, 0x99, 0x8c, 0x67, 0xc2, 0xd0, 0x74, 0xde, + 0x8b, 0xab, 0xb9, 0xc4, 0x78, 0xbc, 0x8b, 0x24, 0xb1, 0x14, 0x7c, 0x0e, + 0x8a, 0xe5, 0xa8, 0x7a, 0x7f, 0x29, 0x8a, 0xc0, 0x9f, 0xd7, 0x81, 0x18, + 0x8b, 0x89, 0x97, 0x6b, 0x82, 0xc4, 0x8c, 0x76, 0x8f, 0x00, 0x83, 0x8e, + 0x8e, 0x13, 0x86, 0x89, 0x84, 0x6a, 0x8f, 0xe2, 0x7e, 0x18, 0x85, 0x80, + 0x91, 0xf0, 0x76, 0x17, 0x86, 0x77, 0x94, 0x18, 0x6e, 0x2f, 0x87, 0x7f, + 0x96, 0x5a, 0x66, 0x1d, 0x88, 0x83, 0x98, 0x9f, 0x5e, 0x26, 0x89, 0xda, + 0x9b, 0x4d, 0x56, 0xcf, 0x8b, 0x2d, 0x9d, 0xce, 0x4f, 0xac, 0x8c, 0x86, + 0xa0, 0x41, 0x49, 0xcf, 0x8e, 0x0c, 0xa2, 0xa3, 0x43, 0x52, 0x7a, 0x9e, + 0x84, 0x7b, 0xc7, 0x76, 0x7e, 0xc7, 0x83, 0xfc, 0xbe, 0x89, 0x82, 0x40, + 0x83, 0xb0, 0xb6, 0x09, 0x85, 0x81, 0x83, 0x7a, 0xad, 0x75, 0x88, 0x56, + 0x83, 0x90, 0xa4, 0xd4, 0x8a, 0xa4, 0x83, 0xf9, 0x9c, 0x55, 0x8c, 0x5d, + 0x84, 0xbe, 0x93, 0xfb, 0x8d, 0x85, 0x85, 0xdd, 0x8b, 0xb3, 0x8e, 0x3e, + 0x87, 0x52, 0x83, 0x75, 0x8f, 0x36, 0x89, 0x78, 0x7b, 0x32, 0x90, 0x36, + 0x8b, 0xcf, 0x72, 0xff, 0x91, 0x57, 0x8e, 0x1a, 0x6a, 0xf3, 0x92, 0x91, + 0x90, 0x4b, 0x62, 0xe5, 0x93, 0xf3, 0x92, 0xf3, 0x5b, 0x71, 0x95, 0x69, + 0x95, 0xaa, 0x54, 0x44, 0x96, 0x95, 0x98, 0x70, 0x4d, 0x8c, 0x97, 0xd9, + 0x9b, 0x89, 0x46, 0x7b, 0x84, 0xf9, 0x7c, 0x39, 0xcc, 0x23, 0x88, 0xe1, + 0x7c, 0x03, 0xc3, 0x6d, 0x8c, 0x65, 0x7b, 0xcf, 0xba, 0xf3, 0x8f, 0xb5, + 0x7b, 0x9e, 0xb2, 0x6b, 0x92, 0x52, 0x7b, 0xd4, 0xa9, 0xd4, 0x94, 0x8e, + 0x7c, 0x42, 0xa1, 0x4f, 0x96, 0x10, 0x7d, 0x26, 0x98, 0xfa, 0x97, 0x67, + 0x7e, 0x14, 0x90, 0xaa, 0x98, 0x09, 0x7f, 0x66, 0x88, 0x8d, 0x98, 0xa1, + 0x80, 0x80, 0x80, 0x80, 0x99, 0xfc, 0x83, 0x74, 0x78, 0x57, 0x9b, 0x32, + 0x86, 0x06, 0x70, 0x44, 0x9c, 0x80, 0x88, 0xa6, 0x68, 0x73, 0x9d, 0xbb, + 0x8b, 0x17, 0x60, 0x8a, 0x9f, 0x60, 0x8d, 0xe9, 0x59, 0x1f, 0xa1, 0x20, + 0x90, 0x88, 0x51, 0xcf, 0xa2, 0x33, 0x93, 0xc7, 0x4a, 0xa9, 0x90, 0xa9, + 0x73, 0x31, 0xd0, 0x7a, 0x94, 0x00, 0x73, 0x5b, 0xc7, 0xe3, 0x97, 0x23, + 0x73, 0x77, 0xbf, 0x87, 0x99, 0xee, 0x73, 0x93, 0xb6, 0xf2, 0x9c, 0x7c, + 0x73, 0xca, 0xae, 0x63, 0x9e, 0x67, 0x74, 0x73, 0xa6, 0x29, 0xa0, 0x13, + 0x75, 0x46, 0x9d, 0xfa, 0xa1, 0x38, 0x76, 0x78, 0x95, 0xdb, 0xa2, 0x31, + 0x77, 0xca, 0x8d, 0xc0, 0xa2, 0xd3, 0x79, 0x6c, 0x85, 0xbc, 0xa3, 0x98, + 0x7b, 0x45, 0x7d, 0xa8, 0xa4, 0xd5, 0x7d, 0xf4, 0x75, 0x7c, 0xa6, 0x3a, + 0x80, 0xa1, 0x6d, 0x8f, 0xa7, 0xa3, 0x83, 0x5e, 0x65, 0xe3, 0xa8, 0xeb, + 0x86, 0x18, 0x5e, 0x33, 0xaa, 0x24, 0x89, 0x41, 0x56, 0xb0, 0xab, 0xa5, + 0x8c, 0x6e, 0x4e, 0xdc, 0x9b, 0xd1, 0x69, 0xfe, 0xd4, 0xb5, 0x9e, 0xee, + 0x6a, 0x7a, 0xcc, 0x0e, 0xa1, 0xc1, 0x6b, 0x0c, 0xc3, 0xc3, 0xa4, 0x38, + 0x6b, 0xa2, 0xbb, 0x71, 0xa6, 0x65, 0x6c, 0x2c, 0xb3, 0x19, 0xa8, 0x1e, + 0x6c, 0xdd, 0xaa, 0xff, 0xa9, 0x9a, 0x6d, 0xa4, 0xa3, 0x05, 0xaa, 0xbf, + 0x6e, 0xc7, 0x9a, 0xf8, 0xab, 0xb4, 0x70, 0x20, 0x92, 0xce, 0xac, 0x86, + 0x71, 0xee, 0x8a, 0xc9, 0xad, 0x45, 0x73, 0xc4, 0x82, 0xd9, 0xae, 0x42, + 0x76, 0x31, 0x7a, 0xbd, 0xaf, 0x6f, 0x78, 0xea, 0x72, 0xa1, 0xb0, 0xda, + 0x7b, 0xb1, 0x6a, 0xde, 0xb2, 0x94, 0x7e, 0x62, 0x63, 0x31, 0xb4, 0x08, + 0x81, 0x80, 0x5b, 0x6c, 0xb5, 0x39, 0x84, 0xf8, 0x53, 0x43, 0xa5, 0xa1, + 0x61, 0x30, 0xd8, 0x9c, 0xa8, 0xf2, 0x62, 0xc9, 0xce, 0xd0, 0xab, 0x97, + 0x63, 0x67, 0xc6, 0xe1, 0xae, 0x13, 0x63, 0xd4, 0xbf, 0x26, 0xaf, 0xd7, + 0x64, 0xb7, 0xb7, 0x61, 0xb1, 0x7a, 0x65, 0x7d, 0xaf, 0x9b, 0xb2, 0xc1, + 0x66, 0x82, 0xa7, 0xe9, 0xb3, 0xff, 0x67, 0x79, 0xa0, 0x37, 0xb4, 0xb9, + 0x68, 0xee, 0x98, 0x67, 0xb5, 0x78, 0x6a, 0x5a, 0x90, 0x87, 0xb6, 0x37, + 0x6c, 0x6b, 0x88, 0x46, 0xb7, 0x0b, 0x6e, 0x65, 0x80, 0x2c, 0xb8, 0x60, + 0x71, 0x3f, 0x77, 0xf3, 0xb9, 0x8f, 0x73, 0xf7, 0x6f, 0xe6, 0xbb, 0x10, + 0x76, 0xe9, 0x68, 0x24, 0xbc, 0xcd, 0x79, 0xbb, 0x60, 0x5a, 0xbe, 0x9c, + 0x7d, 0x67, 0x57, 0xd8, 0xae, 0xf5, 0x5b, 0x70, 0xd9, 0xd8, 0xb2, 0x2c, + 0x5c, 0xa2, 0xd0, 0x86, 0xb4, 0x7d, 0x5d, 0x19, 0xc9, 0x39, 0xb6, 0xb1, + 0x5d, 0x7b, 0xc2, 0x06, 0xb8, 0x5a, 0x5e, 0x23, 0xba, 0xe0, 0xb9, 0xcc, + 0x5e, 0xd6, 0xb3, 0xaf, 0xbb, 0x1f, 0x5f, 0xa0, 0xac, 0x69, 0xbc, 0x56, + 0x60, 0xaa, 0xa5, 0x0f, 0xbd, 0x4d, 0x61, 0xef, 0x9d, 0xa8, 0xbd, 0xdf, + 0x63, 0x7b, 0x96, 0x21, 0xbe, 0x78, 0x65, 0x1e, 0x8e, 0x5d, 0xbf, 0x20, + 0x67, 0x52, 0x85, 0xea, 0xc0, 0x0d, 0x69, 0xaa, 0x7d, 0x96, 0xc1, 0x94, + 0x6c, 0x95, 0x75, 0x40, 0xc3, 0x59, 0x6f, 0x89, 0x6d, 0x1c, 0xc4, 0xc4, + 0x72, 0xbc, 0x64, 0xfd, 0xc6, 0x66, 0x76, 0x6d, 0x5b, 0xeb, 0xb7, 0x82, + 0x56, 0x1f, 0xda, 0xc2, 0xba, 0x73, 0x57, 0x22, 0xd1, 0xf1, 0xbc, 0x9d, + 0x57, 0xd5, 0xca, 0xfa, 0xbe, 0x9a, 0x58, 0x73, 0xc4, 0x45, 0xc0, 0x4c, + 0x59, 0x0f, 0xbd, 0xad, 0xc1, 0x9a, 0x59, 0xb3, 0xb7, 0x24, 0xc2, 0xda, + 0x5a, 0x4e, 0xb0, 0x88, 0xc3, 0xe4, 0x5b, 0x2f, 0xa9, 0xa8, 0xc4, 0xeb, + 0x5c, 0x1c, 0xa2, 0xae, 0xc5, 0xb1, 0x5d, 0x48, 0x9b, 0x63, 0xc6, 0x55, + 0x5e, 0xa3, 0x93, 0xe8, 0xc6, 0xfb, 0x60, 0x67, 0x8b, 0xe0, 0xc7, 0x92, + 0x62, 0xa0, 0x83, 0x73, 0xc8, 0x9d, 0x65, 0x64, 0x7a, 0xdd, 0xca, 0x19, + 0x68, 0x76, 0x72, 0x3f, 0xcb, 0xba, 0x6b, 0xe0, 0x69, 0xb3, 0xcd, 0xdf, + 0x70, 0x14, 0x5f, 0x31, 0xbf, 0xdc, 0x51, 0x0f, 0xd9, 0xe6, 0xc2, 0x9f, + 0x51, 0xfd, 0xd2, 0xf3, 0xc4, 0xd3, 0x52, 0xc5, 0xcc, 0xc1, 0xc6, 0xa9, + 0x53, 0x53, 0xc6, 0xc5, 0xc8, 0x5c, 0x53, 0xbc, 0xc0, 0xc3, 0xc9, 0x83, + 0x54, 0x5b, 0xba, 0xa2, 0xca, 0x91, 0x54, 0xfd, 0xb4, 0x6f, 0xcb, 0x88, + 0x55, 0xb2, 0xae, 0x10, 0xcc, 0x60, 0x56, 0xa7, 0xa7, 0x60, 0xcd, 0x36, + 0x57, 0xa2, 0xa0, 0x9b, 0xcd, 0xd2, 0x58, 0xee, 0x99, 0x2e, 0xce, 0x6d, + 0x5a, 0x4e, 0x91, 0xaa, 0xcf, 0x08, 0x5c, 0x43, 0x89, 0x84, 0xcf, 0xb1, + 0x5e, 0x53, 0x81, 0x33, 0xd0, 0xf0, 0x61, 0x75, 0x78, 0x0a, 0xd2, 0x69, + 0x64, 0xb2, 0x6f, 0x18, 0xd4, 0x43, 0x68, 0xab, 0x65, 0x53, 0xc9, 0xa1, + 0x4c, 0xea, 0xdb, 0x1a, 0xcb, 0xc5, 0x4d, 0xdb, 0xd4, 0xb6, 0xcd, 0xaf, + 0x4e, 0x8f, 0xce, 0xd4, 0xcf, 0x24, 0x4e, 0xc8, 0xc9, 0x44, 0xd0, 0xac, + 0x4e, 0xd2, 0xc3, 0xc5, 0xd1, 0xd8, 0x4f, 0x1b, 0xbe, 0x1c, 0xd2, 0xcc, + 0x4f, 0xa4, 0xb8, 0x34, 0xd3, 0xb3, 0x50, 0x3d, 0xb2, 0x39, 0xd4, 0x84, + 0x51, 0x14, 0xab, 0xeb, 0xd5, 0x3f, 0x52, 0x04, 0xa5, 0x65, 0xd5, 0xf7, + 0x52, 0xfc, 0x9e, 0xb0, 0xd6, 0x79, 0x54, 0x52, 0x97, 0x45, 0xd7, 0x09, + 0x55, 0xb2, 0x8f, 0xd4, 0xd7, 0xaa, 0x57, 0xb9, 0x87, 0xa9, 0xd8, 0x5e, + 0x59, 0xff, 0x7f, 0x3a, 0xd9, 0x8d, 0x5d, 0x5d, 0x75, 0x75, 0xdb, 0x4b, + 0x60, 0xf9, 0x6b, 0x4c, 0x4b, 0xdf, 0xbe, 0x93, 0xaf, 0x32, 0x4c, 0xd1, + 0xbf, 0x93, 0xa6, 0xb4, 0x4d, 0x59, 0xc0, 0xcb, 0x9e, 0x6c, 0x4d, 0x1d, + 0xc2, 0x7a, 0x95, 0xd1, 0x4c, 0xc1, 0xc4, 0x1a, 0x8d, 0x3f, 0x4c, 0xca, + 0xc5, 0x52, 0x84, 0xcc, 0x4c, 0x9e, 0xc6, 0xa8, 0x7c, 0xa5, 0x4c, 0x67, + 0xc7, 0xec, 0x74, 0xef, 0x4c, 0x3b, 0xc9, 0x26, 0x6d, 0x4c, 0x4c, 0x2a, + 0xca, 0x71, 0x65, 0xc7, 0x4b, 0xfa, 0xcb, 0x80, 0x5e, 0x46, 0x4b, 0x9a, + 0xcc, 0x09, 0x56, 0x6c, 0x4a, 0x65, 0xcc, 0xfb, 0x4e, 0x91, 0x4a, 0xfb, + 0xcd, 0x2c, 0x48, 0x59, 0x4d, 0x79, 0xcc, 0x3d, 0x42, 0x4e, 0x51, 0x14, + 0xcb, 0x3e, 0x3d, 0xac, 0x53, 0x64, 0xcb, 0x4f, 0x39, 0x81, 0x50, 0xdc, + 0xb8, 0xf7, 0xb1, 0xb7, 0x52, 0x92, 0xb9, 0x7b, 0xa8, 0xee, 0x53, 0xf6, + 0xba, 0x31, 0xa0, 0x6f, 0x54, 0x8c, 0xbb, 0x94, 0x97, 0xd0, 0x54, 0xe3, + 0xbd, 0x18, 0x8f, 0x2c, 0x55, 0x2d, 0xbe, 0x98, 0x86, 0x92, 0x55, 0x51, + 0xc0, 0x30, 0x7e, 0x1d, 0x55, 0x35, 0xc1, 0xec, 0x76, 0x4d, 0x55, 0x2e, + 0xc3, 0x7a, 0x6e, 0x96, 0x55, 0x6b, 0xc4, 0xee, 0x67, 0x2d, 0x55, 0x90, + 0xc6, 0x48, 0x5f, 0xf0, 0x55, 0xed, 0xc6, 0x9e, 0x58, 0x44, 0x56, 0x44, + 0xc6, 0xfc, 0x50, 0xa6, 0x57, 0x6f, 0xc6, 0xcc, 0x4a, 0x7c, 0x58, 0x9f, + 0xc6, 0x89, 0x44, 0x58, 0x5a, 0x21, 0xc6, 0x72, 0x3e, 0xf8, 0x5c, 0x3c, + 0xc6, 0x9d, 0x3a, 0xc0, 0x55, 0x91, 0xb3, 0xa3, 0xb4, 0x4e, 0x57, 0xe3, + 0xb3, 0xba, 0xab, 0x1e, 0x59, 0xe4, 0xb4, 0x10, 0xa2, 0x78, 0x5b, 0x50, + 0xb4, 0xf3, 0x99, 0xde, 0x5c, 0x70, 0xb6, 0x10, 0x91, 0x3a, 0x5d, 0x10, + 0xb7, 0x94, 0x88, 0xaa, 0x5d, 0x8f, 0xb9, 0x24, 0x80, 0x0e, 0x5d, 0x9a, + 0xbb, 0x6a, 0x78, 0x32, 0x5d, 0x73, 0xbd, 0xad, 0x70, 0x43, 0x5d, 0xe1, + 0xbf, 0xa0, 0x68, 0xaa, 0x5e, 0x4d, 0xc1, 0x34, 0x61, 0x7b, 0x5e, 0xd5, + 0xc1, 0xc4, 0x59, 0xb8, 0x5f, 0x61, 0xc2, 0x1b, 0x51, 0xc1, 0x60, 0x70, + 0xc2, 0x1b, 0x4b, 0xa4, 0x61, 0x89, 0xc1, 0xfb, 0x45, 0xd1, 0x62, 0xa0, + 0xc1, 0xd5, 0x40, 0x0c, 0x64, 0xb4, 0xc1, 0xfc, 0x3b, 0x81, 0x5a, 0x82, + 0xae, 0x4b, 0xb7, 0x64, 0x5d, 0x52, 0xad, 0xf7, 0xad, 0xa2, 0x5f, 0xb9, + 0xae, 0x07, 0xa4, 0xee, 0x61, 0xe8, 0xae, 0x5b, 0x9c, 0x4d, 0x63, 0xb1, + 0xaf, 0x32, 0x93, 0xa4, 0x64, 0xd6, 0xb0, 0x82, 0x8b, 0x15, 0x65, 0x8f, + 0xb2, 0x0b, 0x82, 0xa2, 0x65, 0xf8, 0xb4, 0x17, 0x7a, 0xb0, 0x66, 0x22, + 0xb6, 0x5a, 0x72, 0xf3, 0x66, 0x89, 0xb8, 0x60, 0x6b, 0x38, 0x67, 0x06, + 0xba, 0x4f, 0x63, 0xba, 0x67, 0x8f, 0xbb, 0xac, 0x5c, 0x1d, 0x68, 0x35, + 0xbc, 0x62, 0x54, 0x25, 0x69, 0x14, 0xbc, 0xb6, 0x4d, 0x53, 0x6a, 0x27, + 0xbc, 0xac, 0x47, 0x82, 0x6b, 0x23, 0xbc, 0x9c, 0x41, 0x8d, 0x6c, 0xe5, + 0xbc, 0xe7, 0x3c, 0xaa, 0x60, 0x70, 0xa8, 0x40, 0xbb, 0x24, 0x63, 0x9a, + 0xa7, 0x86, 0xb1, 0x08, 0x66, 0x51, 0xa7, 0x51, 0xa8, 0x2a, 0x68, 0xfa, + 0xa7, 0x29, 0x9f, 0x6c, 0x6b, 0x1b, 0xa7, 0xe1, 0x96, 0xe8, 0x6c, 0xe6, + 0xa8, 0xd6, 0x8e, 0x65, 0x6d, 0xc1, 0xaa, 0x82, 0x86, 0x00, 0x6e, 0x6d, + 0xac, 0x5a, 0x7d, 0xc1, 0x6e, 0xb9, 0xae, 0xb6, 0x75, 0xdf, 0x6f, 0x14, + 0xb0, 0xef, 0x6e, 0x02, 0x6f, 0xe0, 0xb2, 0xc1, 0x66, 0x43, 0x70, 0x85, + 0xb4, 0x84, 0x5e, 0xc5, 0x71, 0x47, 0xb5, 0xa9, 0x57, 0x1c, 0x72, 0x0a, + 0xb6, 0x9f, 0x4f, 0xa2, 0x73, 0x40, 0xb7, 0x13, 0x49, 0xe6, 0x74, 0x73, + 0xb7, 0x7e, 0x44, 0x20, 0x76, 0x1d, 0xb8, 0x21, 0x3e, 0x10, 0x66, 0xd7, + 0xa1, 0xe9, 0xbe, 0xaf, 0x6a, 0x2e, 0xa1, 0x29, 0xb4, 0xeb, 0x6d, 0x60, + 0xa0, 0x95, 0xab, 0xb7, 0x70, 0x4d, 0xa0, 0x37, 0xa2, 0xcb, 0x72, 0xae, + 0xa0, 0x8f, 0x9a, 0x45, 0x74, 0xc1, 0xa1, 0x3f, 0x91, 0xeb, 0x76, 0x17, + 0xa2, 0xaf, 0x89, 0xa4, 0x77, 0x23, 0xa4, 0x4c, 0x81, 0x61, 0x77, 0xbe, + 0xa6, 0x55, 0x79, 0x9b, 0x78, 0x1a, 0xa8, 0x86, 0x71, 0xeb, 0x78, 0xad, + 0xaa, 0x91, 0x69, 0xd8, 0x79, 0x4c, 0xac, 0x8d, 0x61, 0xe1, 0x7a, 0x40, + 0xae, 0x56, 0x5a, 0x65, 0x7b, 0x36, 0xaf, 0xd9, 0x52, 0xe5, 0x7c, 0x77, + 0xb1, 0x09, 0x4c, 0xb4, 0x7d, 0xda, 0xb2, 0x0a, 0x47, 0x0c, 0x7f, 0x5f, + 0xb3, 0x03, 0x40, 0xbb, 0x6d, 0xfa, 0x9b, 0x3e, 0xc2, 0x88, 0x71, 0xfa, + 0x9a, 0x33, 0xb9, 0x07, 0x75, 0xc5, 0x99, 0x53, 0xaf, 0xfb, 0x78, 0xc8, + 0x98, 0xf7, 0xa7, 0x36, 0x7b, 0x7d, 0x98, 0xd8, 0x9e, 0x81, 0x7d, 0x63, + 0x99, 0x9b, 0x96, 0x1b, 0x7e, 0xfe, 0x9a, 0x9f, 0x8d, 0xc0, 0x80, 0x0d, + 0x9c, 0x3a, 0x85, 0x76, 0x80, 0xf2, 0x9e, 0x0a, 0x7d, 0x61, 0x81, 0x7e, + 0xa0, 0x39, 0x75, 0xb8, 0x81, 0xfb, 0xa2, 0x4c, 0x6d, 0xf6, 0x82, 0x8d, + 0xa4, 0x2e, 0x65, 0xac, 0x83, 0x51, 0xa6, 0x31, 0x5d, 0xec, 0x84, 0x8d, + 0xa8, 0x3d, 0x56, 0xd1, 0x85, 0xae, 0xa9, 0xfd, 0x4f, 0xc5, 0x87, 0x19, + 0xab, 0x9d, 0x49, 0xf7, 0x88, 0x9e, 0xad, 0x30, 0x43, 0xbf, 0x76, 0xbe, + 0x93, 0xaa, 0xc6, 0xaf, 0x7a, 0xed, 0x92, 0x91, 0xbd, 0x3b, 0x7e, 0x81, + 0x91, 0xf0, 0xb4, 0x77, 0x81, 0xa7, 0x91, 0x84, 0xab, 0xbf, 0x84, 0x71, + 0x91, 0x57, 0xa2, 0xff, 0x86, 0x7a, 0x91, 0xeb, 0x9a, 0x88, 0x88, 0x1c, + 0x92, 0xcb, 0x92, 0x37, 0x89, 0x29, 0x94, 0x3d, 0x89, 0xec, 0x8a, 0x04, + 0x95, 0xe1, 0x81, 0xaa, 0x8a, 0xcb, 0x97, 0xe6, 0x79, 0xc5, 0x8b, 0x63, + 0x9a, 0x0f, 0x72, 0x12, 0x8c, 0x24, 0x9c, 0x13, 0x6a, 0x07, 0x8c, 0xe1, + 0x9d, 0xd6, 0x61, 0xc2, 0x8e, 0x13, 0xa0, 0x32, 0x5a, 0x6d, 0x8f, 0x54, + 0xa2, 0x71, 0x53, 0x95, 0x90, 0x96, 0xa4, 0x85, 0x4d, 0x3f, 0x92, 0x1d, + 0xa6, 0xb0, 0x46, 0xaa, 0x80, 0x4d, 0x8b, 0xec, 0xcb, 0x19, 0x84, 0x4e, + 0x8b, 0x02, 0xc1, 0xeb, 0x87, 0xba, 0x8a, 0x75, 0xb9, 0x38, 0x8a, 0xfb, + 0x89, 0xfc, 0xb0, 0x83, 0x8d, 0xa3, 0x8a, 0x0d, 0xa7, 0xde, 0x90, 0x08, + 0x8a, 0x4f, 0x9f, 0x48, 0x91, 0x7f, 0x8b, 0x2b, 0x96, 0xf9, 0x92, 0xc2, + 0x8c, 0x25, 0x8e, 0xb1, 0x93, 0x73, 0x8d, 0xbf, 0x86, 0x75, 0x94, 0x30, + 0x8f, 0x87, 0x7e, 0x3d, 0x95, 0x0d, 0x91, 0x9b, 0x76, 0x55, 0x95, 0xd7, + 0x93, 0xbe, 0x6e, 0x97, 0x96, 0xe5, 0x95, 0xe7, 0x66, 0xbc, 0x97, 0xef, + 0x97, 0xfc, 0x5e, 0xee, 0x99, 0x56, 0x9a, 0x83, 0x57, 0xd1, 0x9a, 0xab, + 0x9c, 0xe0, 0x50, 0xae, 0x9c, 0x14, 0x9f, 0x89, 0x49, 0xa8, 0x89, 0xb9, + 0x84, 0x52, 0xcf, 0x98, 0x8d, 0x98, 0x83, 0xb8, 0xc6, 0xc5, 0x91, 0x3d, + 0x83, 0x2f, 0xbe, 0x39, 0x94, 0x7a, 0x82, 0xd8, 0xb5, 0x67, 0x97, 0x43, + 0x82, 0xc1, 0xac, 0xad, 0x99, 0x69, 0x83, 0x1d, 0xa4, 0x2d, 0x9b, 0x11, + 0x83, 0xbd, 0x9b, 0xd1, 0x9c, 0x49, 0x84, 0x93, 0x93, 0x8f, 0x9d, 0x29, + 0x85, 0xbb, 0x8b, 0x74, 0x9d, 0xcc, 0x87, 0x2a, 0x83, 0x72, 0x9e, 0xc2, + 0x89, 0x3b, 0x7b, 0x6d, 0x9f, 0xd6, 0x8b, 0x87, 0x73, 0x77, 0xa0, 0xe8, + 0x8d, 0xdb, 0x6b, 0x90, 0xa2, 0x01, 0x90, 0x2a, 0x63, 0x9c, 0xa3, 0x47, + 0x92, 0xa9, 0x5c, 0x40, 0xa4, 0xb2, 0x95, 0x4a, 0x55, 0x1e, 0xa6, 0x19, + 0x98, 0x14, 0x4d, 0x9f, 0x94, 0x46, 0x7c, 0x4b, 0xd3, 0xe0, 0x98, 0x10, + 0x7b, 0xdc, 0xcb, 0x10, 0x9b, 0x76, 0x7b, 0x77, 0xc2, 0xb4, 0x9e, 0x82, + 0x7b, 0x30, 0xba, 0x06, 0xa1, 0x46, 0x7b, 0x03, 0xb1, 0x26, 0xa3, 0x1b, + 0x7b, 0x8a, 0xa8, 0xe0, 0xa4, 0xbc, 0x7c, 0x1f, 0xa0, 0xa9, 0xa5, 0xc3, + 0x7d, 0x26, 0x98, 0x7f, 0xa6, 0xb0, 0x7e, 0x2d, 0x90, 0x53, 0xa7, 0x56, + 0x7f, 0x74, 0x88, 0x62, 0xa8, 0x05, 0x80, 0x80, 0x80, 0x80, 0xa9, 0x47, + 0x83, 0x66, 0x78, 0x86, 0xaa, 0x65, 0x85, 0xf3, 0x70, 0x9d, 0xab, 0xba, + 0x88, 0x78, 0x68, 0xe8, 0xac, 0xfe, 0x8a, 0xc7, 0x61, 0x2b, 0xae, 0x41, + 0x8d, 0xb5, 0x59, 0xa9, 0xaf, 0xba, 0x90, 0xd6, 0x51, 0xaa, 0x9f, 0xf5, + 0x72, 0xfe, 0xd7, 0xfc, 0xa3, 0x12, 0x73, 0x37, 0xcf, 0x12, 0xa5, 0xe0, + 0x73, 0x5a, 0xc6, 0xcc, 0xa8, 0x8d, 0x73, 0x71, 0xbe, 0x7b, 0xaa, 0xd5, + 0x73, 0x8f, 0xb5, 0xf0, 0xac, 0xd1, 0x73, 0xd1, 0xad, 0x98, 0xae, 0x43, + 0x74, 0x78, 0xa5, 0x97, 0xaf, 0x7a, 0x75, 0x51, 0x9d, 0x8d, 0xb0, 0x45, + 0x76, 0xa5, 0x95, 0x74, 0xb1, 0x04, 0x78, 0x0d, 0x8d, 0x6e, 0xb1, 0xc4, + 0x79, 0x92, 0x85, 0x90, 0xb2, 0xa5, 0x7b, 0x59, 0x7d, 0xa7, 0xb3, 0xd7, + 0x7d, 0xf8, 0x75, 0xa2, 0xb5, 0x2f, 0x80, 0x90, 0x6d, 0xc3, 0xb6, 0xc3, + 0x83, 0x3c, 0x66, 0x19, 0xb8, 0x3c, 0x85, 0xe6, 0x5e, 0x5d, 0xb9, 0x9d, + 0x89, 0x2b, 0x56, 0x38, 0xa9, 0xe1, 0x6a, 0xa5, 0xdb, 0xd4, 0xad, 0x30, + 0x6b, 0x67, 0xd2, 0x54, 0xaf, 0xdd, 0x6b, 0xbf, 0xca, 0x2b, 0xb2, 0x48, + 0x6b, 0xdb, 0xc2, 0x2f, 0xb4, 0x3b, 0x6c, 0x26, 0xba, 0x22, 0xb5, 0xf6, + 0x6c, 0x7e, 0xb2, 0x16, 0xb7, 0x51, 0x6d, 0x2c, 0xaa, 0x3d, 0xb8, 0x83, + 0x6d, 0xf0, 0xa2, 0x72, 0xb9, 0x6b, 0x6f, 0x17, 0x9a, 0x89, 0xba, 0x36, + 0x70, 0x65, 0x92, 0x8f, 0xba, 0xf5, 0x72, 0x30, 0x8a, 0xac, 0xbb, 0xb4, + 0x73, 0xfb, 0x82, 0xd7, 0xbc, 0xc4, 0x76, 0x50, 0x7a, 0xe1, 0xbd, 0xfb, + 0x78, 0xe8, 0x72, 0xe3, 0xbf, 0x86, 0x7b, 0x9f, 0x6b, 0x03, 0xc1, 0x55, + 0x7e, 0x6c, 0x63, 0x21, 0xc3, 0x1a, 0x81, 0xb4, 0x5a, 0xd1, 0xb3, 0xa1, + 0x63, 0x5a, 0xdd, 0x0b, 0xb6, 0x8e, 0x64, 0x1e, 0xd4, 0x6c, 0xb9, 0x01, + 0x64, 0x72, 0xcc, 0x99, 0xbb, 0x30, 0x64, 0xa0, 0xc5, 0x16, 0xbd, 0x1b, + 0x64, 0xef, 0xbd, 0x9e, 0xbe, 0x91, 0x65, 0x88, 0xb6, 0x27, 0xbf, 0xf0, + 0x66, 0x27, 0xae, 0xb4, 0xc1, 0x06, 0x67, 0x26, 0xa7, 0x46, 0xc2, 0x0b, + 0x68, 0x1e, 0x9f, 0xc9, 0xc2, 0xac, 0x69, 0x8d, 0x98, 0x20, 0xc3, 0x56, + 0x6a, 0xea, 0x90, 0x67, 0xc4, 0x23, 0x6c, 0xe2, 0x88, 0x3d, 0xc5, 0x04, + 0x6e, 0xc1, 0x80, 0x35, 0xc6, 0x7e, 0x71, 0x8e, 0x78, 0x05, 0xc7, 0xc1, + 0x74, 0x3f, 0x6f, 0xf6, 0xc9, 0x1c, 0x77, 0x71, 0x67, 0xc9, 0xca, 0xdc, + 0x7a, 0xf5, 0x5e, 0xb9, 0xbc, 0xc4, 0x5d, 0x86, 0xdd, 0xf0, 0xbf, 0x52, + 0x5d, 0xec, 0xd5, 0xe0, 0xc1, 0x95, 0x5e, 0x16, 0xce, 0x93, 0xc3, 0x93, + 0x5e, 0x4f, 0xc7, 0xb3, 0xc5, 0x6f, 0x5e, 0x79, 0xc0, 0xd9, 0xc6, 0xc0, + 0x5e, 0xf8, 0xb9, 0xf0, 0xc7, 0xf3, 0x5f, 0x80, 0xb2, 0xf4, 0xc9, 0x07, + 0x60, 0x59, 0xab, 0xdd, 0xc9, 0xfb, 0x61, 0x8a, 0xa4, 0xb2, 0xca, 0xc5, + 0x62, 0xd9, 0x9d, 0x5f, 0xcb, 0x5a, 0x64, 0x65, 0x95, 0xce, 0xcb, 0xf8, + 0x66, 0x07, 0x8e, 0x0c, 0xcc, 0xb1, 0x68, 0x0f, 0x85, 0xdc, 0xcd, 0xb4, + 0x6a, 0x4a, 0x7d, 0x9d, 0xcf, 0x6a, 0x6d, 0x41, 0x75, 0x11, 0xd1, 0x2f, + 0x70, 0x60, 0x6c, 0x7c, 0xd2, 0xa9, 0x74, 0x82, 0x62, 0x0c, 0xc5, 0xbc, + 0x57, 0xbc, 0xde, 0x0c, 0xc8, 0x1e, 0x58, 0x4f, 0xd7, 0x30, 0xca, 0x48, + 0x58, 0xe7, 0xd0, 0x9a, 0xcb, 0xfb, 0x59, 0x31, 0xca, 0x32, 0xcd, 0x8b, + 0x59, 0x5f, 0xc3, 0xd1, 0xce, 0xd7, 0x59, 0xaf, 0xbd, 0x68, 0xcf, 0xd4, + 0x5a, 0x3d, 0xb6, 0xe0, 0xd0, 0xd0, 0x5a, 0xcc, 0xb0, 0x4a, 0xd1, 0xac, + 0x5b, 0xcb, 0xa9, 0x69, 0xd2, 0x81, 0x5c, 0xd0, 0xa2, 0x71, 0xd3, 0x37, + 0x5e, 0x10, 0x9b, 0x17, 0xd3, 0xe7, 0x5f, 0x71, 0x93, 0x91, 0xd4, 0x8f, + 0x61, 0x4e, 0x8b, 0xa4, 0xd5, 0x3b, 0x63, 0x7d, 0x83, 0x6d, 0xd6, 0x57, + 0x66, 0x2b, 0x7a, 0xc3, 0xd7, 0xf1, 0x69, 0x3f, 0x71, 0xdc, 0xd9, 0xec, + 0x6c, 0xe4, 0x68, 0x4f, 0xcf, 0x76, 0x51, 0xcf, 0xde, 0x40, 0xd1, 0x92, + 0x52, 0x95, 0xd8, 0x6a, 0xd3, 0xae, 0x53, 0x06, 0xd2, 0xbe, 0xd5, 0x44, + 0x53, 0x64, 0xcc, 0xe8, 0xd6, 0xa2, 0x53, 0xaf, 0xc7, 0x02, 0xd7, 0xae, + 0x54, 0x40, 0xc0, 0xf8, 0xd8, 0xae, 0x54, 0xd7, 0xba, 0xd1, 0xd9, 0x6a, + 0x55, 0x91, 0xb4, 0x7b, 0xda, 0x19, 0x56, 0x56, 0xad, 0xfd, 0xda, 0xd5, + 0x57, 0x2b, 0xa7, 0x55, 0xdb, 0x86, 0x58, 0x06, 0xa0, 0x98, 0xdc, 0x2f, + 0x59, 0x41, 0x99, 0x4d, 0xdc, 0xe6, 0x5a, 0x82, 0x91, 0xf7, 0xdd, 0x71, + 0x5c, 0xa1, 0x89, 0xb6, 0xde, 0x54, 0x5e, 0xfe, 0x81, 0x3d, 0xdf, 0x47, + 0x62, 0x12, 0x77, 0xdb, 0xe0, 0xd7, 0x65, 0x62, 0x6e, 0x2b, 0x53, 0x47, + 0xc3, 0xc7, 0xb3, 0xac, 0x54, 0x42, 0xc4, 0xcc, 0xab, 0x4e, 0x54, 0x8a, + 0xc6, 0x40, 0xa3, 0x25, 0x54, 0x73, 0xc7, 0xc3, 0x9a, 0xb0, 0x54, 0x14, + 0xc9, 0x3b, 0x92, 0x09, 0x53, 0xe4, 0xca, 0x81, 0x89, 0x8e, 0x53, 0xae, + 0xcb, 0xb9, 0x81, 0x19, 0x53, 0x8a, 0xcc, 0xd4, 0x79, 0x6b, 0x53, 0x61, + 0xcd, 0xcd, 0x71, 0xd7, 0x53, 0x21, 0xce, 0xed, 0x6a, 0xa8, 0x52, 0xfb, + 0xcf, 0xe4, 0x63, 0xa7, 0x52, 0xcc, 0xd0, 0x6b, 0x5c, 0xae, 0x52, 0x1a, + 0xd0, 0xdd, 0x55, 0x92, 0x52, 0xab, 0xd0, 0xbb, 0x4e, 0xb7, 0x54, 0x3e, + 0xcf, 0xd4, 0x48, 0x55, 0x54, 0xb8, 0xcf, 0x6c, 0x41, 0xcb, 0x56, 0xf8, + 0xce, 0xfe, 0x3c, 0xc2, 0x58, 0x9d, 0xbe, 0x5e, 0xb6, 0x1c, 0x5a, 0x7e, + 0xbe, 0xb3, 0xad, 0x54, 0x5b, 0x63, 0xbf, 0xc4, 0xa5, 0x05, 0x5b, 0xde, + 0xc1, 0x07, 0x9c, 0x94, 0x5c, 0x00, 0xc2, 0x6b, 0x93, 0xd5, 0x5c, 0x1d, + 0xc3, 0xc8, 0x8b, 0x37, 0x5c, 0x36, 0xc5, 0x1a, 0x82, 0xac, 0x5c, 0x1e, + 0xc6, 0xa6, 0x7a, 0xc3, 0x5b, 0xf8, 0xc8, 0x25, 0x73, 0x1e, 0x5c, 0x05, + 0xc9, 0x7f, 0x6b, 0xe8, 0x5c, 0x1d, 0xca, 0xc7, 0x65, 0x0d, 0x5c, 0x2e, + 0xcb, 0xc5, 0x5e, 0x2f, 0x5c, 0x64, 0xcb, 0xc2, 0x56, 0xb4, 0x5c, 0xa5, + 0xcb, 0xb5, 0x4f, 0x77, 0x5d, 0xa3, 0xcb, 0x1c, 0x49, 0x89, 0x5e, 0xa5, + 0xca, 0x8b, 0x43, 0x92, 0x60, 0x13, 0xca, 0x40, 0x3e, 0x2a, 0x5d, 0x53, + 0xb9, 0x16, 0xb8, 0xd8, 0x5f, 0xb4, 0xb9, 0x0e, 0xaf, 0x86, 0x61, 0x24, + 0xb9, 0xbe, 0xa7, 0x18, 0x62, 0x72, 0xba, 0x85, 0x9e, 0xa2, 0x63, 0x52, + 0xbb, 0xa8, 0x95, 0xdd, 0x63, 0xf3, 0xbc, 0xf5, 0x8d, 0x28, 0x64, 0x4c, + 0xbe, 0x7c, 0x84, 0x7a, 0x64, 0x60, 0xc0, 0x57, 0x7c, 0x4c, 0x64, 0x40, + 0xc2, 0x3a, 0x74, 0xbe, 0x64, 0x4d, 0xc3, 0xe2, 0x6d, 0x6b, 0x64, 0x94, + 0xc5, 0x5a, 0x66, 0x8f, 0x64, 0xbb, 0xc6, 0xcb, 0x5f, 0xe4, 0x65, 0x0e, + 0xc6, 0xd1, 0x58, 0x32, 0x65, 0x5b, 0xc6, 0xf3, 0x50, 0x81, 0x66, 0x3f, + 0xc6, 0x72, 0x4a, 0x9f, 0x67, 0x27, 0xc5, 0xf6, 0x44, 0xad, 0x68, 0x51, + 0xc5, 0x95, 0x3e, 0xe1, 0x62, 0x1b, 0xb4, 0x0b, 0xbc, 0x2b, 0x64, 0xc3, + 0xb3, 0xa5, 0xb2, 0x22, 0x66, 0xde, 0xb3, 0xc3, 0xa9, 0x5e, 0x68, 0xd9, + 0xb3, 0xff, 0xa0, 0xe2, 0x6a, 0x5c, 0xb4, 0xd9, 0x98, 0x38, 0x6b, 0xac, + 0xb5, 0xd6, 0x8f, 0x8e, 0x6c, 0x36, 0xb7, 0x5c, 0x87, 0x15, 0x6c, 0x9a, + 0xb9, 0x03, 0x7e, 0xb3, 0x6c, 0xa3, 0xbb, 0x43, 0x77, 0x11, 0x6c, 0x93, + 0xbd, 0x80, 0x6f, 0x7d, 0x6c, 0xe7, 0xbf, 0x77, 0x68, 0x5d, 0x6d, 0x32, + 0xc1, 0x19, 0x61, 0x98, 0x6d, 0xa1, 0xc1, 0xa9, 0x5a, 0x13, 0x6e, 0x17, + 0xc1, 0xfb, 0x52, 0x32, 0x6e, 0xcb, 0xc1, 0xa1, 0x4b, 0xde, 0x6f, 0x8c, + 0xc1, 0x1c, 0x45, 0xe0, 0x70, 0x55, 0xc0, 0xa4, 0x3f, 0xd9, 0x66, 0xe1, + 0xaf, 0x17, 0xc0, 0xc3, 0x6a, 0x41, 0xae, 0x17, 0xb5, 0x7d, 0x6c, 0xf9, + 0xad, 0x93, 0xac, 0x2b, 0x6f, 0x67, 0xad, 0x7a, 0xa3, 0xa2, 0x71, 0x7c, + 0xad, 0xea, 0x9b, 0x09, 0x73, 0x41, 0xae, 0xc7, 0x92, 0x56, 0x74, 0x35, + 0xb0, 0x2b, 0x89, 0xf1, 0x74, 0xdc, 0xb1, 0xa4, 0x81, 0xb5, 0x75, 0x20, + 0xb3, 0xab, 0x79, 0xf8, 0x75, 0x36, 0xb5, 0xd4, 0x72, 0x6d, 0x75, 0x8e, + 0xb7, 0xca, 0x6b, 0x07, 0x75, 0xe6, 0xb9, 0xb7, 0x63, 0xe3, 0x76, 0x4c, + 0xbb, 0x1f, 0x5c, 0xa2, 0x76, 0xe0, 0xbb, 0xcd, 0x54, 0xf8, 0x77, 0x9f, + 0xbc, 0x29, 0x4e, 0x12, 0x78, 0xbd, 0xbc, 0x3b, 0x48, 0x44, 0x7a, 0x14, + 0xbc, 0x5a, 0x41, 0x9e, 0x6d, 0x76, 0xa8, 0xd5, 0xc3, 0x8c, 0x70, 0xec, + 0xa7, 0xb7, 0xb9, 0x44, 0x74, 0x42, 0xa6, 0xc6, 0xaf, 0xba, 0x76, 0xd9, + 0xa6, 0x8e, 0xa7, 0x02, 0x79, 0x31, 0xa6, 0x89, 0x9e, 0x5a, 0x7b, 0x03, + 0xa7, 0x4f, 0x95, 0xdf, 0x7c, 0x80, 0xa8, 0x58, 0x8d, 0x78, 0x7d, 0x59, + 0xa9, 0xe8, 0x85, 0x4a, 0x7d, 0xea, 0xab, 0xb0, 0x7d, 0x53, 0x7e, 0x04, + 0xad, 0xee, 0x75, 0xb9, 0x7e, 0x1a, 0xb0, 0x22, 0x6e, 0x18, 0x7e, 0xa5, + 0xb1, 0xf3, 0x66, 0xa3, 0x7f, 0x0e, 0xb3, 0xc6, 0x5f, 0x68, 0x7f, 0xec, + 0xb4, 0xda, 0x58, 0x2f, 0x80, 0xae, 0xb5, 0xce, 0x50, 0xde, 0x81, 0xef, + 0xb6, 0x92, 0x4a, 0xf3, 0x83, 0x61, 0xb7, 0x62, 0x44, 0x73, 0x74, 0xb0, + 0xa2, 0x23, 0xc6, 0xe8, 0x78, 0xbd, 0xa0, 0xca, 0xbc, 0xa9, 0x7b, 0xfc, + 0xa0, 0x02, 0xb3, 0x91, 0x7e, 0xc3, 0x9f, 0x8f, 0xaa, 0xaa, 0x81, 0x38, + 0x9f, 0x50, 0xa1, 0xd7, 0x83, 0x0d, 0x9f, 0xe9, 0x99, 0x71, 0x84, 0xb4, + 0xa0, 0xb2, 0x91, 0x31, 0x85, 0xd1, 0xa2, 0x30, 0x89, 0x13, 0x86, 0xb5, + 0xa3, 0xc5, 0x80, 0xf4, 0x87, 0x1b, 0xa5, 0xda, 0x79, 0x64, 0x87, 0x4e, + 0xa8, 0x05, 0x71, 0xea, 0x87, 0xb1, 0xa9, 0xf8, 0x6a, 0x26, 0x88, 0x16, + 0xab, 0xda, 0x62, 0x74, 0x88, 0xe9, 0xad, 0x90, 0x5b, 0x37, 0x89, 0xdc, + 0xae, 0xf9, 0x54, 0x08, 0x8b, 0x03, 0xb0, 0x48, 0x4d, 0x71, 0x8c, 0x89, + 0xb1, 0x9e, 0x47, 0x36, 0x7d, 0x4d, 0x9a, 0xb7, 0xca, 0xcc, 0x81, 0xba, + 0x99, 0x36, 0xc0, 0xd0, 0x84, 0xca, 0x98, 0x97, 0xb7, 0xff, 0x87, 0xb4, + 0x98, 0x11, 0xaf, 0x33, 0x8a, 0x2c, 0x97, 0xfe, 0xa6, 0x7f, 0x8c, 0x51, + 0x98, 0x38, 0x9d, 0xeb, 0x8d, 0xba, 0x99, 0x1b, 0x95, 0x9c, 0x8e, 0xdb, + 0x9a, 0x46, 0x8d, 0x55, 0x8f, 0x94, 0x9b, 0xf9, 0x85, 0x25, 0x90, 0x28, + 0x9d, 0xdb, 0x7d, 0x2d, 0x90, 0x79, 0xa0, 0x0d, 0x75, 0xa5, 0x90, 0xe3, + 0xa2, 0x0f, 0x6e, 0x20, 0x91, 0x98, 0xa3, 0xad, 0x66, 0x27, 0x92, 0x54, + 0xa5, 0x73, 0x5e, 0x96, 0x93, 0x82, 0xa7, 0x68, 0x57, 0xbc, 0x94, 0xa4, + 0xa9, 0x1f, 0x50, 0xcd, 0x96, 0x1b, 0xaa, 0xf8, 0x4a, 0x2d, 0x85, 0xd4, + 0x93, 0x5f, 0xcf, 0x44, 0x89, 0xe5, 0x92, 0x1c, 0xc5, 0x81, 0x8d, 0x5d, + 0x91, 0x28, 0xbc, 0x82, 0x90, 0x5f, 0x90, 0x90, 0xb3, 0x98, 0x93, 0x04, + 0x90, 0x8b, 0xaa, 0xee, 0x95, 0x4c, 0x90, 0xd1, 0xa2, 0x66, 0x96, 0xd5, + 0x91, 0x89, 0x9a, 0x16, 0x98, 0x07, 0x92, 0x66, 0x91, 0xd2, 0x98, 0xd7, + 0x93, 0xe2, 0x89, 0xb4, 0x99, 0x83, 0x95, 0x85, 0x81, 0xaa, 0x9a, 0x1e, + 0x97, 0x8c, 0x79, 0xf5, 0x9a, 0x80, 0x99, 0xb9, 0x72, 0x79, 0x9b, 0x30, + 0x9b, 0xb0, 0x6a, 0xb2, 0x9c, 0x0e, 0x9d, 0x57, 0x62, 0xa3, 0x9d, 0x3d, + 0x9f, 0x70, 0x5b, 0x42, 0x9e, 0x99, 0xa1, 0xa2, 0x54, 0x5d, 0xa0, 0x19, + 0xa3, 0xda, 0x4d, 0x2d, 0x8f, 0x02, 0x8b, 0xe9, 0xd3, 0x3f, 0x93, 0x25, + 0x8a, 0xea, 0xca, 0x0e, 0x96, 0xd2, 0x8a, 0x17, 0xc1, 0x4c, 0x99, 0xed, + 0x89, 0xa6, 0xb8, 0x82, 0x9c, 0xd4, 0x89, 0x49, 0xaf, 0xbb, 0x9e, 0xce, + 0x89, 0xa4, 0xa7, 0x48, 0xa0, 0x87, 0x8a, 0x15, 0x9e, 0xe0, 0xa1, 0x7e, + 0x8a, 0xf3, 0x96, 0x9f, 0xa2, 0x53, 0x8b, 0xf5, 0x8e, 0x6b, 0xa2, 0xe2, + 0x8d, 0x81, 0x86, 0x6f, 0xa3, 0x7e, 0x8f, 0x39, 0x7e, 0x73, 0xa4, 0x59, + 0x91, 0x53, 0x76, 0xad, 0xa5, 0x08, 0x93, 0x70, 0x6f, 0x1a, 0xa6, 0x08, + 0x95, 0x97, 0x67, 0x64, 0xa7, 0x01, 0x97, 0x92, 0x5f, 0xa9, 0xa8, 0x60, + 0x9a, 0x17, 0x58, 0x75, 0xa9, 0xca, 0x9c, 0x8c, 0x50, 0xbd, 0x99, 0xa7, + 0x84, 0x3d, 0xd7, 0x5a, 0x9d, 0x5e, 0x83, 0xb9, 0xce, 0x20, 0xa0, 0x9a, + 0x83, 0x20, 0xc5, 0xbe, 0xa3, 0x94, 0x82, 0xa8, 0xbd, 0x3f, 0xa6, 0x43, + 0x82, 0x57, 0xb4, 0x6e, 0xa8, 0x50, 0x82, 0x69, 0xab, 0xed, 0xa9, 0xc2, + 0x82, 0xdd, 0xa3, 0xa1, 0xaa, 0xd3, 0x83, 0x9e, 0x9b, 0x6a, 0xab, 0x9e, + 0x84, 0x9e, 0x93, 0x42, 0xac, 0x50, 0x85, 0xcf, 0x8b, 0x4a, 0xac, 0xed, + 0x87, 0x2a, 0x83, 0x71, 0xad, 0xc5, 0x89, 0x32, 0x7b, 0x93, 0xae, 0xb8, + 0x8b, 0x82, 0x73, 0xbc, 0xaf, 0xc9, 0x8d, 0xb8, 0x6b, 0xfc, 0xb1, 0x04, + 0x8f, 0xce, 0x64, 0x3c, 0xb2, 0x3f, 0x92, 0x47, 0x5c, 0xc0, 0xb3, 0xaf, + 0x95, 0x45, 0x54, 0xae, 0xa4, 0x8c, 0x7c, 0x2b, 0xdb, 0x77, 0xa7, 0xa3, + 0x7c, 0x1b, 0xd2, 0x75, 0xaa, 0x9e, 0x7b, 0xc9, 0xca, 0x00, 0xad, 0x79, + 0x7b, 0x6f, 0xc1, 0xa5, 0xaf, 0xe9, 0x7b, 0x31, 0xb9, 0x1d, 0xb2, 0x0e, + 0x7a, 0xfb, 0xb0, 0x96, 0xb3, 0x43, 0x7b, 0x7d, 0xa8, 0x72, 0xb4, 0x59, + 0x7c, 0x06, 0xa0, 0x56, 0xb4, 0xfd, 0x7d, 0x35, 0x98, 0x38, 0xb5, 0x8b, + 0x7e, 0x5f, 0x90, 0x15, 0xb6, 0x52, 0x7f, 0x8d, 0x88, 0x44, 0xb7, 0x16, + 0x80, 0x80, 0x80, 0x80, 0xb8, 0x39, 0x83, 0x4d, 0x78, 0xa3, 0xb9, 0x45, + 0x85, 0xc0, 0x70, 0xd1, 0xba, 0xd0, 0x88, 0x3c, 0x69, 0x1c, 0xbc, 0x65, + 0x8a, 0x8f, 0x61, 0x59, 0xbd, 0xf0, 0x8d, 0x76, 0x59, 0x37, 0xae, 0xd4, + 0x73, 0xe1, 0xdf, 0x32, 0xb1, 0xe2, 0x73, 0xf4, 0xd6, 0x29, 0xb4, 0x99, + 0x73, 0xe9, 0xcd, 0xb6, 0xb7, 0x0f, 0x73, 0xbe, 0xc5, 0x69, 0xb9, 0x40, + 0x73, 0x9f, 0xbd, 0x26, 0xba, 0xfd, 0x73, 0xb3, 0xb4, 0xf0, 0xbc, 0x6d, + 0x74, 0x07, 0xac, 0xe8, 0xbd, 0x79, 0x74, 0xb1, 0xa5, 0x0e, 0xbe, 0x59, + 0x75, 0x93, 0x9d, 0x2e, 0xbe, 0xf4, 0x76, 0xdb, 0x95, 0x3e, 0xbf, 0x91, + 0x78, 0x3b, 0x8d, 0x53, 0xc0, 0x58, 0x79, 0xb5, 0x85, 0x8b, 0xc1, 0x3e, + 0x7b, 0x65, 0x7d, 0xb7, 0xc2, 0x6e, 0x7d, 0xdf, 0x75, 0xc3, 0xc3, 0xc1, + 0x80, 0x60, 0x6d, 0xde, 0xc5, 0x5a, 0x83, 0x4d, 0x66, 0x0f, 0xc7, 0x01, + 0x86, 0x5d, 0x5d, 0xa0, 0xb8, 0x7b, 0x6c, 0x2e, 0xe1, 0x80, 0xbb, 0x5d, + 0x6c, 0x5d, 0xd8, 0xa5, 0xbd, 0xe7, 0x6c, 0x70, 0xd0, 0x79, 0xc0, 0x24, + 0x6c, 0x61, 0xc8, 0x80, 0xc2, 0x3b, 0x6c, 0x4c, 0xc0, 0xae, 0xc3, 0xaa, + 0x6c, 0x94, 0xb8, 0xfb, 0xc4, 0xf4, 0x6c, 0xde, 0xb1, 0x49, 0xc5, 0xf8, + 0x6d, 0x95, 0xa9, 0xa7, 0xc6, 0xe7, 0x6e, 0x56, 0xa2, 0x02, 0xc7, 0xa7, + 0x6f, 0x7d, 0x9a, 0x3d, 0xc8, 0x52, 0x70, 0xcc, 0x92, 0x74, 0xc9, 0x08, + 0x72, 0x86, 0x8a, 0xa6, 0xc9, 0xc5, 0x74, 0x3a, 0x82, 0xd9, 0xca, 0xe1, + 0x76, 0x85, 0x7a, 0xe2, 0xcc, 0x2c, 0x79, 0x0c, 0x72, 0xe8, 0xcd, 0x90, + 0x7b, 0xf4, 0x6a, 0xcd, 0xcf, 0x50, 0x7f, 0x62, 0x61, 0xfb, 0xc2, 0x1c, + 0x65, 0x4d, 0xe2, 0x81, 0xc4, 0xa3, 0x65, 0x5d, 0xda, 0x34, 0xc6, 0xde, + 0x65, 0x5b, 0xd2, 0xb0, 0xc8, 0xda, 0x65, 0x66, 0xcb, 0x56, 0xca, 0xa3, + 0x65, 0x6e, 0xc4, 0x0f, 0xcc, 0x15, 0x65, 0xad, 0xbc, 0xd0, 0xcd, 0x27, + 0x66, 0x2f, 0xb5, 0x8a, 0xce, 0x23, 0x66, 0xce, 0xae, 0x3f, 0xcf, 0x00, + 0x67, 0xd0, 0xa6, 0xee, 0xcf, 0xd4, 0x68, 0xc9, 0x9f, 0x8d, 0xd0, 0x73, + 0x6a, 0x34, 0x97, 0xe4, 0xd1, 0x14, 0x6b, 0x8d, 0x90, 0x34, 0xd1, 0xe9, + 0x6d, 0x5c, 0x88, 0x2c, 0xd2, 0xc8, 0x6f, 0x0b, 0x80, 0x30, 0xd4, 0x5c, + 0x71, 0xf6, 0x77, 0xcc, 0xd5, 0xcb, 0x74, 0xc9, 0x6f, 0x93, 0xd7, 0x64, + 0x78, 0x69, 0x66, 0x03, 0xcb, 0xbc, 0x5e, 0x32, 0xe2, 0x77, 0xcd, 0xcb, + 0x5e, 0x7a, 0xdb, 0x5e, 0xcf, 0xc5, 0x5e, 0xc1, 0xd4, 0x9b, 0xd1, 0xb8, + 0x5e, 0xd5, 0xcd, 0xfc, 0xd3, 0x35, 0x5e, 0xde, 0xc7, 0x3c, 0xd4, 0x87, + 0x5e, 0xf9, 0xc0, 0x73, 0xd5, 0x7d, 0x5f, 0x79, 0xb9, 0x97, 0xd6, 0x63, + 0x5f, 0xff, 0xb2, 0xa8, 0xd7, 0x2b, 0x61, 0x06, 0xab, 0x9e, 0xd7, 0xe3, + 0x62, 0x35, 0xa4, 0x7a, 0xd8, 0x8f, 0x63, 0x7b, 0x9d, 0x2e, 0xd9, 0x2f, + 0x64, 0xf2, 0x95, 0xae, 0xd9, 0xcf, 0x66, 0x8a, 0x8d, 0xfd, 0xda, 0x80, + 0x68, 0x8e, 0x85, 0xd0, 0xdb, 0x76, 0x6a, 0xbc, 0x7d, 0x71, 0xdd, 0x45, + 0x6d, 0xda, 0x74, 0x89, 0xdf, 0x3e, 0x71, 0x46, 0x6b, 0x45, 0xd5, 0xe3, + 0x57, 0x51, 0xe2, 0xf8, 0xd8, 0x09, 0x57, 0x81, 0xdc, 0xbb, 0xd9, 0xfc, + 0x57, 0xd1, 0xd6, 0xc2, 0xdb, 0xcf, 0x58, 0x1f, 0xd0, 0xca, 0xdd, 0x03, + 0x58, 0x98, 0xca, 0x90, 0xdd, 0xc9, 0x59, 0x4f, 0xc4, 0x21, 0xde, 0x7a, + 0x5a, 0x01, 0xbd, 0x97, 0xdf, 0x3c, 0x5a, 0x9c, 0xb7, 0x04, 0xdf, 0xd4, + 0x5b, 0x47, 0xb0, 0x53, 0xe0, 0x66, 0x5c, 0x2b, 0xa9, 0x6f, 0xe0, 0xfa, + 0x5d, 0x17, 0xa2, 0x77, 0xe1, 0x9c, 0x5e, 0x49, 0x9b, 0x2d, 0xe2, 0x54, + 0x5f, 0x92, 0x93, 0xbe, 0xe2, 0xfc, 0x61, 0x7a, 0x8b, 0xd0, 0xe3, 0xb9, + 0x63, 0xa0, 0x83, 0x88, 0xe4, 0xb7, 0x66, 0x5a, 0x7a, 0xab, 0xe6, 0x54, + 0x69, 0xb7, 0x71, 0x21, 0x5a, 0x8c, 0xc8, 0x37, 0xb7, 0x9b, 0x5b, 0xc2, + 0xc9, 0x3e, 0xaf, 0x71, 0x5b, 0x8d, 0xcb, 0x52, 0xa7, 0x4b, 0x5b, 0x7c, + 0xcd, 0x40, 0x9f, 0x57, 0x5a, 0x9b, 0xcf, 0x13, 0x96, 0x82, 0x5a, 0x83, + 0xd0, 0x12, 0x8d, 0xfe, 0x59, 0xdc, 0xd1, 0x45, 0x85, 0x9d, 0x59, 0xd3, + 0xd1, 0xf6, 0x7d, 0x9f, 0x59, 0xec, 0xd2, 0x8d, 0x76, 0x3b, 0x59, 0xf0, + 0xd3, 0x24, 0x6e, 0xfc, 0x59, 0x9c, 0xd3, 0xf2, 0x68, 0x6a, 0x59, 0x3e, + 0xd4, 0xb1, 0x61, 0xdc, 0x58, 0x6b, 0xd5, 0x16, 0x5a, 0xfc, 0x58, 0xe6, + 0xd4, 0xbc, 0x54, 0x22, 0x58, 0x41, 0xd4, 0xd0, 0x4d, 0x58, 0x5a, 0xa6, + 0xd3, 0x64, 0x47, 0x4b, 0x5b, 0x13, 0xd2, 0xe1, 0x40, 0xcf, 0x60, 0x0f, + 0xc3, 0x00, 0xba, 0x1d, 0x61, 0xd5, 0xc3, 0x80, 0xb1, 0x89, 0x62, 0x8f, + 0xc4, 0xae, 0xa9, 0x4b, 0x62, 0xee, 0xc6, 0x2c, 0xa1, 0x29, 0x63, 0x27, + 0xc7, 0x6d, 0x98, 0x86, 0x63, 0x4d, 0xc8, 0x9c, 0x8f, 0xcd, 0x63, 0x56, + 0xc9, 0xe4, 0x87, 0x5a, 0x63, 0x49, 0xcb, 0x31, 0x7f, 0x0b, 0x63, 0x12, + 0xcc, 0xa8, 0x77, 0x8e, 0x62, 0xdd, 0xcd, 0xfc, 0x70, 0x0d, 0x62, 0xd5, + 0xcf, 0x4e, 0x69, 0x96, 0x62, 0xb4, 0xd0, 0x5c, 0x63, 0x3c, 0x62, 0x9b, + 0xd0, 0xbc, 0x5c, 0x83, 0x62, 0x8f, 0xd0, 0x93, 0x55, 0x33, 0x62, 0xc0, + 0xd0, 0x42, 0x4e, 0x50, 0x63, 0x88, 0xcf, 0x58, 0x48, 0x6b, 0x64, 0x5b, + 0xce, 0x70, 0x42, 0x50, 0x64, 0xa7, 0xbe, 0x7f, 0xbd, 0xa8, 0x67, 0x12, + 0xbe, 0x7b, 0xb3, 0xd6, 0x68, 0x9f, 0xbe, 0xf8, 0xab, 0x47, 0x69, 0xa2, + 0xbf, 0xf6, 0xa2, 0xe0, 0x6a, 0x5e, 0xc0, 0xfb, 0x9a, 0x54, 0x6a, 0xf6, + 0xc2, 0x08, 0x91, 0xab, 0x6b, 0x46, 0xc3, 0x4c, 0x89, 0x1d, 0x6b, 0x77, + 0xc4, 0x9b, 0x80, 0x97, 0x6b, 0x5d, 0xc6, 0x50, 0x79, 0x38, 0x6b, 0x26, + 0xc7, 0xec, 0x71, 0xe3, 0x6b, 0x1f, 0xc9, 0x73, 0x6b, 0x28, 0x6b, 0x0b, + 0xca, 0xfc, 0x64, 0xb8, 0x6a, 0xe1, 0xcc, 0x3c, 0x5e, 0x2b, 0x6a, 0xf2, + 0xcb, 0xf5, 0x56, 0x9b, 0x6b, 0x15, 0xcb, 0xc0, 0x4f, 0x4c, 0x6b, 0xeb, + 0xca, 0xce, 0x49, 0x6e, 0x6c, 0xbd, 0xc9, 0xea, 0x43, 0x44, 0x69, 0x63, + 0xb9, 0x9f, 0xc1, 0x49, 0x6c, 0x1f, 0xb9, 0x3f, 0xb6, 0x9d, 0x6e, 0x3f, + 0xb9, 0x15, 0xad, 0xa2, 0x6f, 0xd1, 0xb9, 0xa2, 0xa5, 0x24, 0x71, 0x3d, + 0xba, 0x59, 0x9c, 0x9f, 0x72, 0x50, 0xbb, 0x60, 0x93, 0xf7, 0x72, 0xf0, + 0xbc, 0xac, 0x8b, 0x64, 0x73, 0x32, 0xbe, 0x2b, 0x82, 0xbf, 0x73, 0x3a, + 0xc0, 0x1f, 0x7a, 0xfd, 0x73, 0x40, 0xc1, 0xdd, 0x73, 0xd6, 0x73, 0x4d, + 0xc3, 0x7c, 0x6c, 0xee, 0x73, 0x62, 0xc5, 0x0c, 0x66, 0x62, 0x73, 0x50, + 0xc6, 0xa9, 0x60, 0x01, 0x73, 0x83, 0xc6, 0xa1, 0x58, 0x6b, 0x73, 0xad, + 0xc6, 0xaf, 0x50, 0xc6, 0x74, 0x72, 0xc6, 0x04, 0x4a, 0xc6, 0x75, 0x55, + 0xc5, 0x63, 0x44, 0x63, 0x6e, 0x49, 0xb4, 0xd5, 0xc5, 0x7a, 0x71, 0x95, + 0xb3, 0xec, 0xb9, 0xd7, 0x74, 0x3c, 0xb3, 0x36, 0xb0, 0x4b, 0x76, 0x55, + 0xb3, 0x56, 0xa7, 0xd3, 0x78, 0x48, 0xb3, 0x87, 0x9f, 0x64, 0x79, 0xc0, + 0xb4, 0x68, 0x96, 0xb8, 0x7a, 0xeb, 0xb5, 0x6e, 0x8e, 0x2c, 0x7b, 0x68, + 0xb6, 0xe1, 0x85, 0xed, 0x7b, 0xb4, 0xb8, 0x87, 0x7d, 0xe3, 0x7b, 0xa9, + 0xba, 0x9e, 0x76, 0x8e, 0x7b, 0x90, 0xbc, 0xb0, 0x6f, 0x4e, 0x7b, 0xa2, + 0xbe, 0xb4, 0x68, 0x63, 0x7b, 0xa2, 0xc0, 0x88, 0x61, 0xbd, 0x7b, 0xeb, + 0xc1, 0x13, 0x5a, 0x81, 0x7c, 0x43, 0xc1, 0x43, 0x52, 0xf7, 0x7d, 0x10, + 0xc1, 0x39, 0x4c, 0x83, 0x7e, 0x68, 0xc1, 0x1b, 0x45, 0x8d, 0x74, 0x68, + 0xaf, 0x72, 0xc8, 0xa6, 0x78, 0x54, 0xad, 0xd5, 0xbc, 0xf3, 0x7b, 0x14, + 0xad, 0x21, 0xb3, 0xac, 0x7d, 0x70, 0xac, 0xd9, 0xaa, 0xf7, 0x7f, 0x90, + 0xac, 0xc0, 0xa2, 0x72, 0x81, 0x52, 0xad, 0x55, 0x99, 0xe0, 0x82, 0xda, + 0xae, 0x2e, 0x91, 0x40, 0x83, 0x87, 0xaf, 0xa5, 0x89, 0x11, 0x84, 0x0c, + 0xb1, 0x1a, 0x80, 0xfa, 0x84, 0x2d, 0xb3, 0x18, 0x79, 0x94, 0x84, 0x2c, + 0xb5, 0x20, 0x72, 0x54, 0x84, 0x52, 0xb7, 0x07, 0x6b, 0x27, 0x84, 0x6c, + 0xb8, 0xea, 0x64, 0x26, 0x84, 0xa7, 0xba, 0x5c, 0x5d, 0x1e, 0x85, 0x38, + 0xba, 0xf7, 0x55, 0xc8, 0x85, 0xe9, 0xbb, 0x88, 0x4e, 0xc1, 0x87, 0x44, + 0xbc, 0x2f, 0x48, 0x25, 0x7c, 0x20, 0xa8, 0x52, 0xcb, 0xf3, 0x80, 0x8b, + 0xa6, 0xa7, 0xc0, 0x1b, 0x83, 0x1a, 0xa6, 0x36, 0xb7, 0x68, 0x85, 0x96, + 0xa5, 0xd4, 0xae, 0xb8, 0x87, 0xbf, 0xa5, 0xbd, 0xa6, 0x18, 0x89, 0xa5, + 0xa5, 0xf4, 0x9d, 0x8e, 0x8b, 0x00, 0xa6, 0xce, 0x95, 0x28, 0x8c, 0x04, + 0xa7, 0xf7, 0x8c, 0xdb, 0x8c, 0x95, 0xa9, 0x92, 0x84, 0xbc, 0x8c, 0xe2, + 0xab, 0x6b, 0x7c, 0xea, 0x8c, 0xdf, 0xad, 0x9f, 0x75, 0x8b, 0x8c, 0xd5, + 0xaf, 0xc5, 0x6e, 0x2a, 0x8d, 0x36, 0xb1, 0x74, 0x66, 0xe5, 0x8d, 0x76, + 0xb3, 0x24, 0x5f, 0xce, 0x8e, 0x4b, 0xb4, 0x1c, 0x58, 0xb6, 0x8f, 0x09, + 0xb4, 0xfd, 0x51, 0x8f, 0x90, 0x5f, 0xb6, 0x34, 0x4a, 0xe6, 0x83, 0xc7, + 0xa1, 0xa3, 0xcf, 0x20, 0x87, 0xea, 0xa0, 0x37, 0xc4, 0xbe, 0x8b, 0x3f, + 0x9f, 0x44, 0xbb, 0x9f, 0x8d, 0xef, 0x9e, 0xb8, 0xb2, 0xc4, 0x90, 0x40, + 0x9e, 0x8b, 0xaa, 0x0f, 0x92, 0x4b, 0x9e, 0x9d, 0xa1, 0x70, 0x93, 0x81, + 0x9f, 0x6b, 0x99, 0x07, 0x94, 0x83, 0xa0, 0x55, 0x90, 0xa1, 0x95, 0x40, + 0xa1, 0xe8, 0x88, 0xa5, 0x95, 0xde, 0xa3, 0x7f, 0x80, 0xa8, 0x96, 0x12, + 0xa5, 0x98, 0x79, 0x4d, 0x96, 0x1d, 0xa7, 0xc2, 0x72, 0x04, 0x96, 0x7b, + 0xa9, 0x8a, 0x6a, 0x78, 0x96, 0xe5, 0xab, 0x2f, 0x62, 0xf3, 0x97, 0xba, + 0xac, 0xcd, 0x5b, 0xe1, 0x98, 0xdf, 0xae, 0x3c, 0x55, 0x00, 0x9a, 0x29, + 0xaf, 0xaf, 0x4d, 0xc7, 0x8b, 0xe7, 0x9a, 0xa0, 0xd3, 0x21, 0x90, 0x32, + 0x99, 0x1f, 0xc9, 0x33, 0x94, 0x0b, 0x97, 0xfa, 0xc0, 0x1f, 0x96, 0xc1, + 0x97, 0x8b, 0xb7, 0x4b, 0x99, 0x40, 0x97, 0x3e, 0xae, 0x9d, 0x9b, 0x33, + 0x97, 0x7a, 0xa6, 0x13, 0x9c, 0xc6, 0x97, 0xe8, 0x9d, 0x95, 0x9d, 0xab, + 0x98, 0xc3, 0x95, 0x2c, 0x9e, 0x6a, 0x99, 0xec, 0x8c, 0xee, 0x9e, 0xfb, + 0x9b, 0x8d, 0x85, 0x06, 0x9f, 0x64, 0x9d, 0x63, 0x7d, 0x55, 0x9f, 0x6b, + 0x9f, 0x9f, 0x76, 0x13, 0x9f, 0x91, 0xa1, 0xb6, 0x6e, 0xce, 0xa0, 0x74, + 0xa3, 0x25, 0x66, 0xe1, 0xa1, 0x44, 0xa4, 0xb0, 0x5f, 0x40, 0xa2, 0x98, + 0xa6, 0xb0, 0x58, 0x6c, 0xa3, 0xf8, 0xa8, 0xa4, 0x50, 0xe7, 0x95, 0x87, + 0x93, 0x1a, 0xd6, 0xdc, 0x99, 0x94, 0x91, 0xf3, 0xcd, 0x1b, 0x9c, 0xc7, + 0x91, 0x18, 0xc4, 0x58, 0x9f, 0x9e, 0x90, 0x89, 0xbb, 0xb7, 0xa2, 0x5b, + 0x90, 0x24, 0xb3, 0x23, 0xa4, 0x60, 0x90, 0x35, 0xaa, 0x9c, 0xa5, 0xf5, + 0x90, 0x87, 0xa2, 0x14, 0xa6, 0xe3, 0x91, 0x55, 0x99, 0xc6, 0xa7, 0x9a, + 0x92, 0x45, 0x91, 0x85, 0xa8, 0x25, 0x93, 0xbf, 0x89, 0x99, 0xa8, 0x96, + 0x95, 0x50, 0x81, 0xbe, 0xa9, 0x19, 0x97, 0x43, 0x7a, 0x26, 0xa9, 0x6e, + 0x99, 0x53, 0x72, 0xc6, 0xaa, 0x12, 0x9b, 0x3f, 0x6b, 0x31, 0xaa, 0xf2, + 0x9c, 0xf8, 0x63, 0x64, 0xac, 0x15, 0x9f, 0x00, 0x5b, 0xe1, 0xad, 0x8f, + 0xa1, 0x52, 0x54, 0x11, 0xa0, 0x40, 0x8b, 0x60, 0xda, 0xd5, 0xa3, 0xc5, + 0x8a, 0xbb, 0xd1, 0x3a, 0xa6, 0xbd, 0x8a, 0x1e, 0xc8, 0xc9, 0xa9, 0x9b, + 0x89, 0x88, 0xc0, 0x70, 0xac, 0x0b, 0x89, 0x33, 0xb7, 0xd7, 0xae, 0x33, + 0x88, 0xf5, 0xaf, 0x4b, 0xaf, 0x61, 0x89, 0x5c, 0xa6, 0xdd, 0xb0, 0x5e, + 0x89, 0xe6, 0x9e, 0x78, 0xb0, 0xec, 0x8a, 0xf6, 0x96, 0x4e, 0xb1, 0x6d, + 0x8c, 0x18, 0x8e, 0x35, 0xb1, 0xdb, 0x8d, 0x8a, 0x86, 0x65, 0xb2, 0x4a, + 0x8f, 0x29, 0x7e, 0x94, 0xb3, 0x28, 0x91, 0x33, 0x76, 0xe4, 0xb3, 0xe0, + 0x93, 0x2e, 0x6f, 0x61, 0xb5, 0x07, 0x95, 0x3a, 0x67, 0xcb, 0xb6, 0x1a, + 0x97, 0x27, 0x60, 0x21, 0xb7, 0x92, 0x9a, 0x03, 0x57, 0x84, 0xaa, 0x64, + 0x84, 0x42, 0xdf, 0x1c, 0xad, 0x81, 0x83, 0xda, 0xd5, 0xed, 0xb0, 0x67, + 0x83, 0x62, 0xcd, 0x3f, 0xb3, 0x13, 0x82, 0xeb, 0xc4, 0xd2, 0xb5, 0x71, + 0x82, 0x82, 0xbc, 0x55, 0xb7, 0x67, 0x82, 0x45, 0xb3, 0xcf, 0xb8, 0xc1, + 0x82, 0x6b, 0xab, 0x81, 0xb9, 0xae, 0x82, 0xd6, 0xa3, 0x57, 0xba, 0x52, + 0x83, 0xa7, 0x9b, 0x33, 0xba, 0xc2, 0x84, 0xbb, 0x93, 0x10, 0xbb, 0x52, + 0x85, 0xe2, 0x8b, 0x2c, 0xbb, 0xdf, 0x87, 0x1c, 0x83, 0x6e, 0xbc, 0xab, + 0x88, 0xfc, 0x7b, 0xa9, 0xbd, 0xac, 0x8b, 0x29, 0x73, 0xea, 0xbe, 0xfa, + 0x8d, 0x51, 0x6c, 0x2f, 0xc0, 0x94, 0x8f, 0x84, 0x64, 0x67, 0xc1, 0xea, + 0x92, 0x23, 0x5c, 0x4a, 0xb4, 0x00, 0x7d, 0x0f, 0xe3, 0x23, 0xb7, 0x12, + 0x7c, 0xa4, 0xd9, 0xe0, 0xb9, 0xda, 0x7c, 0x49, 0xd1, 0x49, 0xbc, 0x6c, + 0x7b, 0xc2, 0xc8, 0xca, 0xbe, 0xda, 0x7b, 0x2b, 0xc0, 0x52, 0xc0, 0x7e, + 0x7b, 0x22, 0xb8, 0x0c, 0xc1, 0xf1, 0x7b, 0x28, 0xaf, 0xdc, 0xc2, 0xc0, + 0x7b, 0xae, 0xa7, 0xf8, 0xc3, 0x83, 0x7c, 0x2e, 0xa0, 0x12, 0xc3, 0xe5, + 0x7d, 0x5c, 0x98, 0x05, 0xc4, 0x35, 0x7e, 0x7f, 0x8f, 0xeb, 0xc4, 0xfd, + 0x7f, 0x9c, 0x88, 0x32, 0xc5, 0xbc, 0x80, 0x80, 0x80, 0x80, 0xc6, 0xd5, + 0x83, 0x22, 0x78, 0xc5, 0xc7, 0xdd, 0x85, 0x74, 0x71, 0x14, 0xc9, 0x55, + 0x88, 0x39, 0x69, 0x40, 0xcb, 0x01, 0x8b, 0x3e, 0x60, 0x6a, 0xbd, 0xd6, + 0x74, 0xed, 0xe5, 0xe7, 0xc0, 0xc3, 0x74, 0xa8, 0xdc, 0xbb, 0xc3, 0x3f, + 0x74, 0x76, 0xd4, 0x6e, 0xc5, 0x87, 0x74, 0x35, 0xcc, 0x3b, 0xc7, 0x91, + 0x73, 0xee, 0xc4, 0x18, 0xc9, 0x29, 0x73, 0xdd, 0xbc, 0x19, 0xca, 0x52, + 0x73, 0xf8, 0xb4, 0x34, 0xcb, 0x4b, 0x74, 0x58, 0xac, 0x69, 0xcc, 0x15, + 0x75, 0x02, 0xa4, 0xb7, 0xcc, 0xbd, 0x75, 0xeb, 0x9c, 0xf9, 0xcd, 0x36, + 0x77, 0x30, 0x95, 0x23, 0xcd, 0xc1, 0x78, 0x82, 0x8d, 0x4c, 0xce, 0x7d, + 0x79, 0xe1, 0x85, 0x89, 0xcf, 0x60, 0x7b, 0x7d, 0x7d, 0xba, 0xd0, 0xb5, + 0x7d, 0xd6, 0x75, 0xd8, 0xd2, 0x1d, 0x80, 0x4f, 0x6d, 0xeb, 0xd3, 0xa5, + 0x83, 0xda, 0x65, 0x27, 0xc7, 0x4d, 0x6d, 0x43, 0xe7, 0xa8, 0xca, 0x15, + 0x6d, 0x18, 0xde, 0x86, 0xcc, 0x4a, 0x6d, 0x07, 0xd6, 0xc1, 0xce, 0x5e, + 0x6c, 0xfa, 0xcf, 0x22, 0xd0, 0x21, 0x6c, 0xe4, 0xc7, 0x74, 0xd1, 0xb9, + 0x6c, 0xcc, 0xbf, 0xdb, 0xd2, 0x9a, 0x6d, 0x0f, 0xb8, 0x54, 0xd3, 0x74, + 0x6d, 0x4e, 0xb0, 0xc9, 0xd4, 0x43, 0x6e, 0x07, 0xa9, 0x4c, 0xd5, 0x0b, + 0x6e, 0xc0, 0xa1, 0xc7, 0xd5, 0xb0, 0x6f, 0xe5, 0x9a, 0x21, 0xd6, 0x3e, + 0x71, 0x3b, 0x92, 0x83, 0xd6, 0xe9, 0x72, 0xce, 0x8a, 0xba, 0xd7, 0xa8, + 0x74, 0x59, 0x82, 0xdc, 0xd8, 0xee, 0x76, 0xb7, 0x7a, 0xb9, 0xda, 0x7a, + 0x79, 0x61, 0x72, 0x91, 0xdc, 0x22, 0x7c, 0x62, 0x69, 0xe2, 0xd1, 0x1f, + 0x65, 0xb4, 0xe7, 0xe7, 0xd3, 0x92, 0x65, 0xb1, 0xdf, 0xb9, 0xd5, 0x9a, + 0x65, 0xaf, 0xd8, 0xc5, 0xd7, 0x98, 0x65, 0xa1, 0xd1, 0xe4, 0xd9, 0x05, + 0x65, 0xac, 0xca, 0xcb, 0xda, 0x25, 0x65, 0xcc, 0xc3, 0x96, 0xdb, 0x0e, + 0x66, 0x23, 0xbc, 0x68, 0xdb, 0xcf, 0x66, 0xa4, 0xb5, 0x3e, 0xdc, 0x84, + 0x67, 0x46, 0xae, 0x0a, 0xdd, 0x2a, 0x68, 0x46, 0xa6, 0xbe, 0xdd, 0xcd, + 0x69, 0x3f, 0x9f, 0x63, 0xde, 0x64, 0x6a, 0x97, 0x97, 0xdf, 0xde, 0xf5, + 0x6b, 0xe2, 0x90, 0x58, 0xdf, 0x9f, 0x6d, 0x93, 0x88, 0x3d, 0xe0, 0x54, + 0x6f, 0x11, 0x80, 0x22, 0xe2, 0x53, 0x72, 0x59, 0x77, 0x77, 0xe4, 0x5b, + 0x75, 0x52, 0x6e, 0xe1, 0xdb, 0xc8, 0x5d, 0xd2, 0xe8, 0x56, 0xde, 0x47, + 0x5d, 0xbb, 0xe1, 0x52, 0xe0, 0xe2, 0x5d, 0x46, 0xdb, 0x08, 0xe2, 0x6d, + 0x5d, 0x7d, 0xd4, 0xbd, 0xe4, 0x13, 0x5d, 0x8f, 0xce, 0x75, 0xe4, 0x30, + 0x5e, 0x6f, 0xc7, 0x8b, 0xe4, 0x51, 0x5f, 0x34, 0xc0, 0x89, 0xe4, 0xef, + 0x5f, 0xd2, 0xb9, 0xba, 0xe5, 0x8a, 0x60, 0x7b, 0xb2, 0xe2, 0xe6, 0x13, + 0x61, 0x84, 0xab, 0xe5, 0xe6, 0x96, 0x62, 0xaf, 0xa4, 0xc8, 0xe7, 0x17, + 0x63, 0xe9, 0x9d, 0x7b, 0xe7, 0xa5, 0x65, 0x44, 0x95, 0xf7, 0xe8, 0x48, + 0x66, 0xb2, 0x8e, 0x45, 0xe9, 0x31, 0x68, 0x84, 0x86, 0x07, 0xea, 0x42, + 0x6a, 0xc9, 0x7d, 0x7a, 0xec, 0x06, 0x6e, 0x1a, 0x74, 0x28, 0x62, 0xa2, + 0xcb, 0xfc, 0xba, 0xff, 0x63, 0x5f, 0xcd, 0x42, 0xb3, 0x2f, 0x62, 0x7d, + 0xd0, 0x0b, 0xab, 0x16, 0x62, 0x69, 0xd1, 0xe7, 0xa3, 0x56, 0x62, 0x6a, + 0xd3, 0x23, 0x9b, 0x40, 0x62, 0x37, 0xd4, 0x14, 0x92, 0xb4, 0x61, 0xee, + 0xd4, 0xed, 0x8a, 0x73, 0x61, 0xcb, 0xd5, 0x85, 0x82, 0x59, 0x61, 0xc2, + 0xd6, 0x11, 0x7a, 0xe5, 0x61, 0x74, 0xd6, 0xbc, 0x73, 0xa2, 0x61, 0x2e, + 0xd7, 0x5c, 0x6c, 0xea, 0x60, 0xcc, 0xd7, 0xfc, 0x66, 0xa8, 0x5f, 0xe3, + 0xd8, 0xce, 0x60, 0x50, 0x5f, 0x75, 0xd8, 0xa7, 0x59, 0x92, 0x5f, 0xed, + 0xd8, 0x1c, 0x52, 0xda, 0x60, 0x29, 0xd7, 0xa2, 0x4c, 0x61, 0x60, 0xdc, + 0xd6, 0xd2, 0x46, 0x44, 0x67, 0xc3, 0xc7, 0x48, 0xbd, 0x6b, 0x69, 0x29, + 0xc7, 0xee, 0xb5, 0x5f, 0x6a, 0x36, 0xc8, 0xd2, 0xad, 0x7c, 0x6a, 0xa4, + 0xca, 0x3a, 0xa5, 0x63, 0x6a, 0xed, 0xcb, 0xa3, 0x9d, 0x2a, 0x6b, 0x1a, + 0xcc, 0xc9, 0x94, 0x6c, 0x6b, 0x1c, 0xce, 0x0c, 0x8b, 0xe0, 0x6a, 0xf9, + 0xcf, 0x63, 0x83, 0x8a, 0x6a, 0x9b, 0xd0, 0xa1, 0x7b, 0xed, 0x6a, 0x1f, + 0xd1, 0xa9, 0x74, 0xcf, 0x69, 0xb5, 0xd2, 0xa0, 0x6e, 0x09, 0x69, 0x63, + 0xd3, 0x8f, 0x67, 0xe7, 0x69, 0x08, 0xd4, 0x67, 0x61, 0xc5, 0x68, 0xc2, + 0xd4, 0x7a, 0x5b, 0x04, 0x68, 0x89, 0xd4, 0x42, 0x53, 0xef, 0x68, 0xab, + 0xd3, 0xd1, 0x4d, 0x46, 0x69, 0x45, 0xd3, 0x03, 0x47, 0x21, 0x6c, 0x7a, + 0xc3, 0x33, 0xbf, 0xf6, 0x6e, 0x49, 0xc3, 0x5f, 0xb7, 0x9d, 0x70, 0x04, + 0xc3, 0x83, 0xaf, 0x79, 0x70, 0xfd, 0xc4, 0x6f, 0xa7, 0x2e, 0x71, 0xd2, + 0xc5, 0x6c, 0x9e, 0xef, 0x72, 0x63, 0xc6, 0x72, 0x96, 0x4f, 0x72, 0xc6, + 0xc7, 0x97, 0x8d, 0xbd, 0x72, 0xd8, 0xc8, 0xeb, 0x85, 0x55, 0x72, 0xbf, + 0xca, 0x5e, 0x7d, 0x6f, 0x72, 0x65, 0xcb, 0xe9, 0x76, 0x51, 0x71, 0xf8, + 0xcd, 0x6d, 0x6f, 0x45, 0x71, 0xa7, 0xcf, 0x12, 0x69, 0x10, 0x71, 0x41, + 0xd0, 0x6c, 0x63, 0x03, 0x70, 0xec, 0xd0, 0xe0, 0x5c, 0x67, 0x70, 0xad, + 0xd0, 0xa5, 0x55, 0x08, 0x70, 0xaf, 0xd0, 0x61, 0x4d, 0xf5, 0x71, 0x7f, + 0xcf, 0x06, 0x48, 0x05, 0x71, 0x1a, 0xbf, 0x41, 0xc3, 0x05, 0x73, 0x7d, + 0xbe, 0xcc, 0xba, 0x0c, 0x75, 0xc1, 0xbe, 0x52, 0xb1, 0x9f, 0x77, 0x35, + 0xbe, 0xe3, 0xa9, 0x35, 0x78, 0x69, 0xbf, 0xbc, 0xa0, 0xda, 0x79, 0x44, + 0xc0, 0xa5, 0x98, 0x56, 0x7a, 0x03, 0xc1, 0x92, 0x8f, 0xd5, 0x7a, 0x46, + 0xc2, 0xd1, 0x87, 0x72, 0x7a, 0x6f, 0xc4, 0x24, 0x7f, 0x3b, 0x7a, 0x4c, + 0xc5, 0xc4, 0x78, 0x3f, 0x7a, 0x07, 0xc7, 0x57, 0x71, 0x3f, 0x79, 0xd4, + 0xc8, 0xe7, 0x6a, 0xc9, 0x79, 0x8c, 0xca, 0x79, 0x64, 0x85, 0x79, 0x37, + 0xcb, 0xa9, 0x5e, 0x1b, 0x79, 0x2e, 0xcb, 0x41, 0x56, 0xc0, 0x79, 0x34, + 0xca, 0xf4, 0x4f, 0x86, 0x79, 0xfe, 0xca, 0x2d, 0x49, 0x5a, 0x76, 0xce, + 0xb9, 0xa7, 0xc7, 0xc2, 0x79, 0xa9, 0xb8, 0xf6, 0xbc, 0xec, 0x7b, 0xe4, + 0xb8, 0x97, 0xb4, 0x58, 0x7d, 0xc2, 0xb8, 0xa7, 0xab, 0xeb, 0x7f, 0x4e, + 0xb9, 0x20, 0xa3, 0x8b, 0x80, 0x96, 0xb9, 0xe6, 0x9b, 0x0b, 0x81, 0x98, + 0xba, 0xe1, 0x92, 0x75, 0x82, 0x0d, 0xbc, 0x32, 0x8a, 0x1c, 0x82, 0x44, + 0xbd, 0xa0, 0x81, 0xbc, 0x82, 0x26, 0xbf, 0x87, 0x7a, 0x62, 0x82, 0x0d, + 0xc1, 0x37, 0x73, 0x75, 0x81, 0xf5, 0xc2, 0xce, 0x6c, 0xc3, 0x81, 0xd3, + 0xc4, 0x5d, 0x66, 0x52, 0x81, 0x94, 0xc5, 0xed, 0x60, 0x05, 0x81, 0xb7, + 0xc5, 0xcf, 0x58, 0xbf, 0x81, 0xda, 0xc5, 0xc4, 0x51, 0x77, 0x82, 0xcd, + 0xc5, 0x88, 0x4a, 0x44, 0x7d, 0x22, 0xb4, 0x06, 0xcc, 0x02, 0x80, 0x71, + 0xb3, 0x04, 0xbf, 0xc2, 0x82, 0xa2, 0xb2, 0xcd, 0xb7, 0x62, 0x84, 0xc0, + 0xb2, 0xa4, 0xaf, 0x05, 0x86, 0x92, 0xb2, 0xce, 0xa6, 0xa3, 0x88, 0x33, + 0xb3, 0x24, 0x9e, 0x38, 0x89, 0x5a, 0xb4, 0x00, 0x95, 0xa1, 0x8a, 0x23, + 0xb5, 0x13, 0x8d, 0x39, 0x8a, 0x74, 0xb6, 0x79, 0x85, 0x17, 0x8a, 0x94, + 0xb8, 0x18, 0x7d, 0x55, 0x8a, 0x6e, 0xba, 0x1c, 0x76, 0x3f, 0x8a, 0x38, + 0xbc, 0x16, 0x6f, 0x3d, 0x8a, 0x1b, 0xbd, 0xee, 0x68, 0x71, 0x89, 0xdd, + 0xbf, 0xce, 0x61, 0xd3, 0x8a, 0x15, 0xc0, 0x69, 0x5a, 0xbc, 0x8a, 0x70, + 0xc0, 0xa4, 0x53, 0x68, 0x8b, 0x45, 0xc1, 0x01, 0x4c, 0x6a, 0x84, 0x2e, + 0xae, 0x5b, 0xcf, 0x1c, 0x87, 0xa1, 0xad, 0x17, 0xc4, 0x11, 0x8a, 0x43, + 0xac, 0x6e, 0xbb, 0x1c, 0x8c, 0x87, 0xac, 0x24, 0xb2, 0xab, 0x8e, 0x84, + 0xac, 0x16, 0xaa, 0x36, 0x90, 0x51, 0xac, 0x2c, 0xa1, 0xba, 0x91, 0x76, + 0xac, 0xec, 0x99, 0x39, 0x92, 0x5b, 0xad, 0xd0, 0x90, 0xa7, 0x92, 0xad, + 0xaf, 0x5d, 0x88, 0x7d, 0x92, 0xf0, 0xb0, 0xdb, 0x80, 0x63, 0x92, 0xee, + 0xb2, 0xd9, 0x79, 0x43, 0x92, 0xcf, 0xb4, 0xd7, 0x72, 0x3a, 0x92, 0xdb, + 0xb6, 0x91, 0x6b, 0x3d, 0x92, 0xe2, 0xb8, 0x35, 0x64, 0x60, 0x93, 0x11, + 0xb9, 0x8b, 0x5d, 0x7c, 0x93, 0xb8, 0xba, 0x34, 0x56, 0x5a, 0x94, 0x77, + 0xba, 0xf1, 0x4f, 0x05, 0x8b, 0x8c, 0xa8, 0x19, 0xd2, 0x4c, 0x8f, 0x26, + 0xa6, 0xa6, 0xc8, 0x58, 0x92, 0x88, 0xa5, 0x8d, 0xbf, 0x41, 0x94, 0xda, + 0xa5, 0x45, 0xb6, 0xaa, 0x96, 0xf4, 0xa5, 0x14, 0xae, 0x22, 0x98, 0xb0, + 0xa5, 0x3e, 0xa5, 0x97, 0x9a, 0x0b, 0xa5, 0xac, 0x9d, 0x12, 0x9a, 0xc7, + 0xa6, 0x89, 0x94, 0x8c, 0x9b, 0x5d, 0xa7, 0xbc, 0x8c, 0x4c, 0x9b, 0xcc, + 0xa9, 0x47, 0x84, 0x57, 0x9b, 0xf0, 0xab, 0x1c, 0x7c, 0xb6, 0x9b, 0xbc, + 0xad, 0x53, 0x75, 0x83, 0x9b, 0x90, 0xaf, 0x68, 0x6e, 0x4b, 0x9b, 0xe2, + 0xb0, 0xdc, 0x67, 0x28, 0x9c, 0x1e, 0xb2, 0x4e, 0x60, 0x2f, 0x9d, 0x40, + 0xb3, 0x6a, 0x59, 0x6e, 0x9e, 0x6e, 0xb4, 0x89, 0x52, 0x24, 0x93, 0x63, + 0xa1, 0x69, 0xd6, 0x3a, 0x97, 0x7f, 0x9f, 0xdd, 0xcc, 0x4e, 0x9a, 0xec, + 0x9e, 0xe6, 0xc3, 0x7f, 0x9d, 0x72, 0x9e, 0x5c, 0xba, 0xdc, 0x9f, 0x85, + 0x9e, 0x04, 0xb2, 0x47, 0xa1, 0x3f, 0x9e, 0x25, 0xa9, 0xbb, 0xa2, 0xbb, + 0x9e, 0x6b, 0xa1, 0x24, 0xa3, 0x79, 0x9f, 0x33, 0x98, 0xa0, 0xa4, 0x17, + 0xa0, 0x0c, 0x90, 0x20, 0xa4, 0x92, 0xa1, 0xa1, 0x88, 0x67, 0xa4, 0xf5, + 0xa3, 0x27, 0x80, 0x99, 0xa5, 0x02, 0xa5, 0x36, 0x79, 0x6c, 0xa4, 0xee, + 0xa7, 0x57, 0x72, 0x54, 0xa5, 0x46, 0xa9, 0x09, 0x6a, 0xf0, 0xa5, 0xbd, + 0xaa, 0x81, 0x63, 0x80, 0xa6, 0x91, 0xac, 0x19, 0x5c, 0x69, 0xa7, 0xc9, + 0xad, 0xcb, 0x55, 0x04, 0x9d, 0xbc, 0x99, 0xc7, 0xda, 0x46, 0xa1, 0x72, + 0x98, 0x85, 0xcf, 0xfe, 0xa4, 0x3e, 0x97, 0xe9, 0xc7, 0xa3, 0xa6, 0xdb, + 0x97, 0x56, 0xbf, 0x4b, 0xa8, 0xf1, 0x97, 0x10, 0xb6, 0xcb, 0xaa, 0xbf, + 0x96, 0xef, 0xae, 0x4b, 0xab, 0xec, 0x97, 0x3e, 0xa5, 0xa8, 0xac, 0xd2, + 0x97, 0xc9, 0x9d, 0x28, 0xad, 0x63, 0x98, 0xbc, 0x94, 0xf0, 0xad, 0xd1, + 0x99, 0xec, 0x8c, 0xe3, 0xad, 0xff, 0x9b, 0x74, 0x85, 0x0f, 0xae, 0x23, + 0x9d, 0x26, 0x7d, 0x68, 0xae, 0x33, 0x9f, 0x1d, 0x76, 0x2c, 0xae, 0x50, + 0xa1, 0x09, 0x6f, 0x00, 0xaf, 0x3a, 0xa2, 0xa8, 0x67, 0x5e, 0xaf, 0xf8, + 0xa4, 0x42, 0x5f, 0xe1, 0xb1, 0x5a, 0xa6, 0x6a, 0x58, 0x30, 0xa7, 0xbd, + 0x92, 0x7a, 0xde, 0x0b, 0xaa, 0xd1, 0x91, 0x9f, 0xd4, 0xb0, 0xad, 0x90, + 0x90, 0xe3, 0xcb, 0xf3, 0xb0, 0x2a, 0x90, 0x41, 0xc3, 0x9e, 0xb2, 0x50, + 0x8f, 0xf2, 0xbb, 0x35, 0xb4, 0x1b, 0x8f, 0xc8, 0xb2, 0xbf, 0xb5, 0x46, + 0x90, 0x04, 0xaa, 0x3e, 0xb6, 0x29, 0x90, 0x71, 0xa1, 0xb6, 0xb6, 0xa6, + 0x91, 0x63, 0x99, 0x81, 0xb7, 0x08, 0x92, 0x6a, 0x91, 0x58, 0xb7, 0x4d, + 0x93, 0xcd, 0x89, 0x8d, 0xb7, 0x7a, 0x95, 0x42, 0x81, 0xd2, 0xb7, 0xf4, + 0x97, 0x15, 0x7a, 0x4f, 0xb8, 0x48, 0x98, 0xf7, 0x72, 0xf8, 0xb8, 0xf8, + 0x9a, 0xd4, 0x6b, 0x74, 0xb9, 0xf8, 0x9c, 0x99, 0x63, 0xba, 0xbb, 0x25, + 0x9e, 0xab, 0x5b, 0xa4, 0xb1, 0x9e, 0x8b, 0x65, 0xe2, 0x8a, 0xb4, 0x98, + 0x8a, 0xcb, 0xd9, 0x3f, 0xb7, 0x46, 0x8a, 0x40, 0xd0, 0x77, 0xb9, 0xb3, + 0x89, 0xc9, 0xc8, 0x0b, 0xbb, 0xf3, 0x89, 0x56, 0xbf, 0x9f, 0xbd, 0x89, + 0x89, 0x2c, 0xb7, 0x37, 0xbe, 0xeb, 0x89, 0x1c, 0xae, 0xdb, 0xbf, 0x9e, + 0x89, 0x86, 0xa6, 0x98, 0xc0, 0x31, 0x8a, 0x12, 0x9e, 0x5b, 0xc0, 0x71, + 0x8b, 0x1c, 0x96, 0x35, 0xc0, 0xb1, 0x8c, 0x2f, 0x8e, 0x28, 0xc0, 0xea, + 0x8d, 0x71, 0x86, 0x68, 0xc1, 0x2c, 0x8e, 0xda, 0x7e, 0xa7, 0xc2, 0x21, + 0x90, 0xcc, 0x77, 0x12, 0xc2, 0xe0, 0x92, 0xb9, 0x6f, 0xa4, 0xc4, 0x29, + 0x95, 0x03, 0x68, 0x08, 0xc5, 0x67, 0x97, 0x3b, 0x60, 0x1d, 0xba, 0xef, + 0x84, 0x83, 0xe6, 0xa9, 0xbd, 0xe3, 0x84, 0x21, 0xdd, 0x4c, 0xc0, 0x69, + 0x83, 0xba, 0xd4, 0xc8, 0xc2, 0xaa, 0x83, 0x42, 0xcc, 0x50, 0xc4, 0xbb, + 0x82, 0xb4, 0xc3, 0xd5, 0xc6, 0x5d, 0x82, 0x6c, 0xbb, 0x78, 0xc7, 0xa7, + 0x82, 0x54, 0xb3, 0x39, 0xc8, 0x77, 0x82, 0x92, 0xab, 0x25, 0xc8, 0xff, + 0x83, 0x05, 0xa3, 0x25, 0xc9, 0x5e, 0x83, 0xd8, 0x9b, 0x19, 0xc9, 0x9e, + 0x84, 0xe1, 0x93, 0x03, 0xca, 0x10, 0x85, 0xf3, 0x8b, 0x32, 0xca, 0x8b, + 0x87, 0x10, 0x83, 0x88, 0xcb, 0x4b, 0x88, 0xca, 0x7b, 0xe2, 0xcc, 0x42, + 0x8a, 0xdf, 0x74, 0x4a, 0xcd, 0x6a, 0x8d, 0x29, 0x6c, 0x99, 0xcf, 0x00, + 0x8f, 0xe1, 0x64, 0x62, 0xc3, 0xd8, 0x7d, 0x69, 0xe9, 0xc4, 0xc6, 0x8f, + 0x7d, 0x17, 0xe0, 0xdb, 0xc8, 0xfe, 0x7c, 0xa2, 0xd8, 0x67, 0xcb, 0x59, + 0x7c, 0x24, 0xd0, 0x02, 0xcd, 0x51, 0x7b, 0xb1, 0xc7, 0xa9, 0xcf, 0x1d, + 0x7b, 0x55, 0xbf, 0x64, 0xd0, 0x2a, 0x7b, 0x47, 0xb7, 0x6b, 0xd1, 0x15, + 0x7b, 0x4a, 0xaf, 0x7a, 0xd1, 0x95, 0x7b, 0xe3, 0xa7, 0xae, 0xd2, 0x0c, + 0x7c, 0x77, 0x9f, 0xde, 0xd2, 0x62, 0x7d, 0x92, 0x97, 0xf6, 0xd2, 0xaf, + 0x7e, 0x9a, 0x90, 0x05, 0xd3, 0x6b, 0x7f, 0xa7, 0x88, 0x44, 0xd4, 0x2e, + 0x80, 0x80, 0x80, 0x80, 0xd5, 0x5b, 0x83, 0x24, 0x78, 0xce, 0xd6, 0x6d, + 0x85, 0x7e, 0x71, 0x17, 0xd7, 0xcb, 0x88, 0x7d, 0x68, 0xca, 0xcd, 0x2a, + 0x75, 0x9e, 0xec, 0x1c, 0xcf, 0xe7, 0x75, 0x3f, 0xe2, 0xe6, 0xd1, 0xfd, + 0x74, 0xf8, 0xda, 0xe1, 0xd3, 0xf3, 0x74, 0xb4, 0xd3, 0x00, 0xd5, 0xa6, + 0x74, 0x77, 0xcb, 0x1b, 0xd7, 0x20, 0x74, 0x40, 0xc3, 0x30, 0xd8, 0x30, + 0x74, 0x38, 0xbb, 0x6a, 0xd8, 0xfe, 0x74, 0x52, 0xb3, 0xb8, 0xd9, 0xb8, + 0x74, 0xbd, 0xac, 0x18, 0xda, 0x59, 0x75, 0x6c, 0xa4, 0x84, 0xda, 0xe7, + 0x76, 0x50, 0x9c, 0xec, 0xdb, 0x60, 0x77, 0x78, 0x95, 0x50, 0xdb, 0xee, + 0x78, 0xa3, 0x8d, 0x9a, 0xdc, 0xb9, 0x79, 0xea, 0x85, 0xab, 0xdd, 0xc9, + 0x7b, 0x8b, 0x7d, 0xa2, 0xdf, 0x68, 0x7e, 0x0c, 0x75, 0x8b, 0xe1, 0x26, + 0x80, 0xac, 0x6d, 0x44, 0xd6, 0x6b, 0x6d, 0xf7, 0xec, 0xf3, 0xd8, 0xc4, + 0x6d, 0xb5, 0xe4, 0xa5, 0xda, 0xd4, 0x6d, 0x84, 0xdd, 0x12, 0xdc, 0xb3, + 0x6d, 0x5c, 0xd5, 0xbb, 0xde, 0x66, 0x6d, 0x33, 0xce, 0x69, 0xdf, 0x80, + 0x6d, 0x1f, 0xc6, 0xd0, 0xe0, 0x7f, 0x6d, 0x1d, 0xbf, 0x47, 0xe1, 0x33, + 0x6d, 0x69, 0xb7, 0xf3, 0xe1, 0xe7, 0x6d, 0xb0, 0xb0, 0xa0, 0xe2, 0x8b, + 0x6e, 0x77, 0xa9, 0x3a, 0xe3, 0x2f, 0x6f, 0x38, 0xa1, 0xc7, 0xe3, 0xc4, + 0x70, 0x5d, 0x9a, 0x40, 0xe4, 0x4e, 0x71, 0xa9, 0x92, 0xbe, 0xe5, 0x0a, + 0x73, 0x25, 0x8a, 0xe5, 0xe5, 0xee, 0x74, 0xaa, 0x82, 0xdd, 0xe7, 0x6d, + 0x77, 0x0e, 0x7a, 0x90, 0xe9, 0x32, 0x79, 0xcb, 0x72, 0x14, 0xe0, 0x96, + 0x66, 0x0f, 0xed, 0x63, 0xe2, 0xf2, 0x65, 0xd9, 0xe6, 0x00, 0xe5, 0x3b, + 0x65, 0x8a, 0xdf, 0x02, 0xe6, 0xc5, 0x65, 0x96, 0xd8, 0x48, 0xe8, 0x3f, + 0x65, 0xa9, 0xd1, 0x9a, 0xe8, 0xfc, 0x66, 0x0c, 0xca, 0x9a, 0xe9, 0x9d, + 0x66, 0x6b, 0xc3, 0x89, 0xea, 0x51, 0x66, 0xce, 0xbc, 0x8f, 0xea, 0xfc, + 0x67, 0x46, 0xb5, 0x9d, 0xeb, 0x7c, 0x67, 0xee, 0xae, 0x88, 0xec, 0x10, + 0x68, 0xd4, 0xa7, 0x51, 0xec, 0x81, 0x69, 0xc6, 0x9f, 0xf4, 0xed, 0x0b, + 0x6a, 0xfe, 0x98, 0x58, 0xed, 0x9a, 0x6c, 0x33, 0x90, 0xb2, 0xee, 0xa1, + 0x6e, 0x04, 0x88, 0x70, 0xef, 0xe6, 0x6f, 0xee, 0x80, 0x23, 0xf2, 0x7e, + 0x72, 0xa0, 0x77, 0x09, 0x6a, 0xd0, 0xcf, 0x73, 0xbd, 0xff, 0x6b, 0x8f, + 0xd0, 0xba, 0xb6, 0xae, 0x6b, 0xb0, 0xd2, 0x7c, 0xaf, 0x76, 0x6a, 0x9b, + 0xd5, 0x09, 0xa7, 0x53, 0x6a, 0xc9, 0xd6, 0x5f, 0x9f, 0xd0, 0x6a, 0x74, + 0xd7, 0x6c, 0x97, 0x5e, 0x6a, 0x14, 0xd8, 0x64, 0x8f, 0x10, 0x69, 0xab, + 0xd9, 0x15, 0x87, 0x3a, 0x69, 0x6d, 0xd9, 0x93, 0x7f, 0x80, 0x68, 0xb9, + 0xda, 0x51, 0x78, 0x88, 0x68, 0x5d, 0xda, 0xc4, 0x71, 0x81, 0x67, 0xc3, + 0xdb, 0x5d, 0x6b, 0x42, 0x66, 0xaa, 0xdc, 0x26, 0x65, 0x0e, 0x66, 0x93, + 0xdc, 0x46, 0x5e, 0xf2, 0x65, 0xed, 0xdc, 0x1e, 0x58, 0x55, 0x66, 0x16, + 0xdb, 0xa1, 0x51, 0xc1, 0x66, 0x05, 0xdb, 0x39, 0x4b, 0x29, 0x6f, 0xd1, + 0xcb, 0x08, 0xc0, 0x55, 0x71, 0x23, 0xcb, 0xbe, 0xb8, 0xbb, 0x72, 0x4c, + 0xcc, 0x98, 0xb1, 0x6e, 0x72, 0xd9, 0xcd, 0xd2, 0xa9, 0x8e, 0x73, 0x1a, + 0xcf, 0x3c, 0xa1, 0x98, 0x73, 0x2b, 0xd0, 0x87, 0x99, 0x10, 0x73, 0x0e, + 0xd1, 0xbc, 0x90, 0x75, 0x72, 0xb5, 0xd2, 0xe6, 0x88, 0x68, 0x72, 0x44, + 0xd3, 0xfa, 0x80, 0x74, 0x71, 0xa1, 0xd4, 0xf5, 0x79, 0x93, 0x70, 0xfa, + 0xd5, 0xd6, 0x72, 0xaf, 0x70, 0x70, 0xd6, 0xb2, 0x6c, 0x66, 0x6f, 0xf0, + 0xd7, 0x7d, 0x66, 0x68, 0x6f, 0x6a, 0xd8, 0x37, 0x60, 0x6a, 0x6f, 0x07, + 0xd8, 0x07, 0x59, 0xa9, 0x6e, 0xa8, 0xd7, 0xca, 0x52, 0xc8, 0x6e, 0xad, + 0xd7, 0x4f, 0x4c, 0x1e, 0x74, 0xd1, 0xc6, 0xf0, 0xc2, 0xe9, 0x76, 0x96, + 0xc7, 0x22, 0xba, 0xd2, 0x78, 0x18, 0xc7, 0x8a, 0xb3, 0x34, 0x79, 0x1c, + 0xc8, 0x52, 0xab, 0x53, 0x79, 0xac, 0xc9, 0x68, 0xa3, 0x3f, 0x7a, 0x11, + 0xca, 0x8d, 0x9a, 0xe9, 0x7a, 0x5a, 0xcb, 0xc4, 0x92, 0x5a, 0x7a, 0x59, + 0xcd, 0x20, 0x89, 0xf7, 0x7a, 0x33, 0xce, 0x8f, 0x81, 0x92, 0x79, 0xb5, + 0xd0, 0x03, 0x7a, 0x7a, 0x79, 0x16, 0xd1, 0x26, 0x73, 0xbf, 0x78, 0x89, + 0xd2, 0x3b, 0x6d, 0x67, 0x78, 0x10, 0xd3, 0x42, 0x67, 0x7b, 0x77, 0x90, + 0xd4, 0x35, 0x61, 0x8f, 0x77, 0x20, 0xd4, 0x31, 0x5a, 0xe3, 0x76, 0xc0, + 0xd3, 0xec, 0x53, 0xd0, 0x76, 0xb6, 0xd3, 0x5e, 0x4c, 0xf8, 0x79, 0xe6, + 0xc2, 0xd5, 0xc5, 0xec, 0x7b, 0xd7, 0xc2, 0xbd, 0xbd, 0x19, 0x7d, 0x9c, + 0xc2, 0xcd, 0xb5, 0x3c, 0x7f, 0x1c, 0xc3, 0x1f, 0xad, 0x52, 0x80, 0x18, + 0xc3, 0xf3, 0xa5, 0x27, 0x80, 0xe7, 0xc4, 0xe4, 0x9c, 0xf2, 0x81, 0x78, + 0xc5, 0xef, 0x94, 0x7f, 0x81, 0xc1, 0xc7, 0x20, 0x8c, 0x26, 0x81, 0xc8, + 0xc8, 0x71, 0x83, 0xd6, 0x81, 0x90, 0xc9, 0xe4, 0x7c, 0x5e, 0x81, 0x1f, + 0xcb, 0x65, 0x75, 0x89, 0x80, 0x99, 0xcc, 0xe2, 0x6e, 0xd5, 0x80, 0x1b, + 0xce, 0x67, 0x68, 0xb4, 0x7f, 0x89, 0xcf, 0xd7, 0x62, 0xb5, 0x7f, 0x18, + 0xd0, 0x1c, 0x5c, 0x37, 0x7e, 0xc7, 0xcf, 0x98, 0x55, 0x13, 0x7e, 0xc6, + 0xce, 0xf4, 0x4d, 0xf2, 0x7f, 0x30, 0xbe, 0x6c, 0xca, 0x3f, 0x81, 0x8f, + 0xbe, 0x00, 0xbf, 0xaa, 0x83, 0xaa, 0xbd, 0xdf, 0xb7, 0xc1, 0x85, 0x9e, + 0xbd, 0xd0, 0xaf, 0xda, 0x86, 0xd8, 0xbe, 0xa3, 0xa7, 0x92, 0x87, 0xe8, + 0xbf, 0x8d, 0x9f, 0x52, 0x88, 0x8a, 0xc0, 0x79, 0x96, 0xd2, 0x89, 0x11, + 0xc1, 0x64, 0x8e, 0x76, 0x89, 0x40, 0xc2, 0x84, 0x86, 0x58, 0x89, 0x49, + 0xc3, 0xca, 0x7e, 0x8d, 0x89, 0x09, 0xc5, 0x63, 0x77, 0xd0, 0x88, 0xac, + 0xc6, 0xed, 0x71, 0x11, 0x88, 0x54, 0xc8, 0x66, 0x6a, 0xb5, 0x87, 0xe7, + 0xc9, 0xdb, 0x64, 0x7c, 0x87, 0x89, 0xca, 0xeb, 0x5e, 0x21, 0x87, 0x9b, + 0xca, 0xaa, 0x57, 0x11, 0x87, 0xb8, 0xca, 0x76, 0x4f, 0x6f, 0x86, 0x1e, + 0xb8, 0xef, 0xce, 0xa8, 0x88, 0xda, 0xb8, 0x42, 0xc3, 0x78, 0x8a, 0xe8, + 0xb8, 0x02, 0xba, 0xfe, 0x8c, 0xc4, 0xb7, 0xfb, 0xb2, 0xee, 0x8e, 0x49, + 0xb8, 0x51, 0xaa, 0xb6, 0x8f, 0x88, 0xb8, 0xe6, 0xa2, 0x66, 0x90, 0x58, + 0xb9, 0xbf, 0x99, 0xed, 0x90, 0xef, 0xba, 0xb2, 0x91, 0x63, 0x91, 0x1d, + 0xbb, 0xee, 0x89, 0x3a, 0x91, 0x31, 0xbd, 0x25, 0x81, 0x12, 0x90, 0xe2, + 0xbf, 0x11, 0x7a, 0x00, 0x90, 0x97, 0xc0, 0xe0, 0x73, 0x3d, 0x90, 0x61, + 0xc2, 0x64, 0x6c, 0xb8, 0x90, 0x20, 0xc3, 0xce, 0x66, 0x5b, 0x8f, 0xc5, + 0xc5, 0x3c, 0x60, 0x13, 0x90, 0x13, 0xc5, 0x60, 0x58, 0xfd, 0x90, 0x61, + 0xc5, 0x8e, 0x51, 0xb2, 0x8c, 0xe3, 0xb3, 0xef, 0xd1, 0xa7, 0x8f, 0xaf, + 0xb2, 0xeb, 0xc7, 0x6d, 0x92, 0x2b, 0xb2, 0x3e, 0xbe, 0x95, 0x94, 0x28, + 0xb2, 0x40, 0xb6, 0x79, 0x95, 0xfb, 0xb2, 0x4e, 0xae, 0x59, 0x97, 0x6e, + 0xb2, 0x9f, 0xa5, 0xf3, 0x98, 0x8f, 0xb3, 0x1d, 0x9d, 0x83, 0x99, 0x12, + 0xb3, 0xf4, 0x94, 0xf2, 0x99, 0x6d, 0xb5, 0x05, 0x8c, 0xa7, 0x99, 0x96, + 0xb6, 0x55, 0x84, 0xaf, 0x99, 0x84, 0xb7, 0xe8, 0x7d, 0x27, 0x99, 0x2a, + 0xb9, 0xdb, 0x76, 0x3f, 0x98, 0xc1, 0xbb, 0xc1, 0x6f, 0x5d, 0x98, 0x9c, + 0xbd, 0x50, 0x68, 0xae, 0x98, 0x5a, 0xbe, 0xe9, 0x62, 0x1d, 0x98, 0x93, + 0xbf, 0xbc, 0x5b, 0x29, 0x99, 0x11, 0xc0, 0x2c, 0x53, 0xe5, 0x94, 0x00, + 0xae, 0xb7, 0xd5, 0x1b, 0x97, 0x5f, 0xad, 0x24, 0xcb, 0x6e, 0x9a, 0x23, + 0xac, 0x38, 0xc2, 0xbd, 0x9c, 0x48, 0xab, 0xde, 0xba, 0x67, 0x9e, 0x1c, + 0xab, 0xb3, 0xb2, 0x2d, 0x9f, 0xa2, 0xab, 0xd9, 0xa9, 0xbe, 0xa1, 0x04, + 0xac, 0x29, 0xa1, 0x3f, 0xa1, 0x6e, 0xac, 0xf3, 0x98, 0xa1, 0xa1, 0xa4, + 0xad, 0xd1, 0x8f, 0xf9, 0xa1, 0xde, 0xaf, 0x44, 0x87, 0xfe, 0xa2, 0x0f, + 0xb0, 0xa1, 0x80, 0x09, 0xa1, 0xe4, 0xb2, 0xa2, 0x79, 0x3a, 0xa1, 0x95, + 0xb4, 0x97, 0x72, 0x66, 0xa1, 0x8c, 0xb6, 0x23, 0x6b, 0x8d, 0xa1, 0x9c, + 0xb7, 0x82, 0x64, 0xc4, 0xa1, 0xdc, 0xb8, 0xc6, 0x5e, 0x05, 0xa2, 0xb8, + 0xb9, 0xb9, 0x56, 0xed, 0x9c, 0xfa, 0xa7, 0x89, 0xd9, 0xb3, 0xa0, 0x5d, + 0xa6, 0x11, 0xcf, 0x03, 0xa3, 0x02, 0xa5, 0x91, 0xc6, 0xc8, 0xa5, 0x54, + 0xa5, 0x25, 0xbe, 0x94, 0xa6, 0xfb, 0xa5, 0x02, 0xb6, 0x40, 0xa8, 0x6d, + 0xa4, 0xfb, 0xad, 0xdf, 0xa9, 0x83, 0xa5, 0x43, 0xa5, 0x3d, 0xaa, 0x4d, + 0xa5, 0xc7, 0x9c, 0xb5, 0xaa, 0xb8, 0xa6, 0xa5, 0x94, 0x51, 0xaa, 0xe9, + 0xa7, 0xcc, 0x8c, 0x2a, 0xaa, 0xe4, 0xa9, 0x32, 0x84, 0x3a, 0xaa, 0xcd, + 0xaa, 0xe3, 0x7c, 0xb6, 0xaa, 0x9f, 0xac, 0xfa, 0x75, 0xba, 0xaa, 0x6d, + 0xae, 0xff, 0x6e, 0xbc, 0xaa, 0xb5, 0xb0, 0x5c, 0x67, 0x9a, 0xaa, 0xf5, + 0xb1, 0xa8, 0x60, 0xaa, 0xab, 0xf1, 0xb3, 0x04, 0x59, 0x9d, 0xa6, 0xdc, + 0xa0, 0x60, 0xdd, 0x82, 0xa9, 0xed, 0x9f, 0x63, 0xd3, 0x82, 0xac, 0x69, + 0x9e, 0xc7, 0xca, 0xf4, 0xae, 0x9a, 0x9e, 0x49, 0xc2, 0xc2, 0xb0, 0x3c, + 0x9e, 0x0b, 0xba, 0x76, 0xb1, 0x8d, 0x9d, 0xf4, 0xb2, 0x1c, 0xb2, 0x67, + 0x9e, 0x28, 0xa9, 0x71, 0xb3, 0x0d, 0x9e, 0x76, 0xa0, 0xa9, 0xb3, 0x7b, + 0x9f, 0x5a, 0x98, 0x71, 0xb3, 0xde, 0xa0, 0x41, 0x90, 0x3d, 0xb3, 0xe9, + 0xa1, 0xc1, 0x88, 0x83, 0xb3, 0xd5, 0xa3, 0x30, 0x80, 0xb9, 0xb3, 0xde, + 0xa5, 0x08, 0x79, 0x9d, 0xb3, 0xcf, 0xa6, 0xf0, 0x72, 0xa1, 0xb4, 0x28, + 0xa8, 0xa3, 0x6b, 0x67, 0xb4, 0xac, 0xaa, 0x22, 0x64, 0x0f, 0xb5, 0x60, + 0xab, 0xc9, 0x5c, 0x93, 0xb0, 0xfd, 0x99, 0x17, 0xe1, 0x79, 0xb3, 0xac, + 0x98, 0x7a, 0xd8, 0x26, 0xb6, 0x0b, 0x97, 0xed, 0xcf, 0x78, 0xb8, 0x08, + 0x97, 0x8a, 0xc7, 0x3d, 0xb9, 0xd2, 0x97, 0x3a, 0xbe, 0xf7, 0xbb, 0x1a, + 0x97, 0x0f, 0xb6, 0x91, 0xbc, 0x2e, 0x97, 0x08, 0xae, 0x23, 0xbc, 0xb3, + 0x97, 0x83, 0xa5, 0x91, 0xbd, 0x0f, 0x98, 0x2b, 0x9d, 0x1e, 0xbd, 0x2e, + 0x99, 0x1c, 0x94, 0xdd, 0xbd, 0x39, 0x9a, 0x3f, 0x8c, 0xd7, 0xbd, 0x2c, + 0x9b, 0xad, 0x85, 0x2b, 0xbd, 0x23, 0x9d, 0x3c, 0x7d, 0xa2, 0xbd, 0x11, + 0x9e, 0xf7, 0x76, 0x69, 0xbd, 0x03, 0xa0, 0xad, 0x6f, 0x3e, 0xbe, 0x26, + 0xa2, 0x57, 0x67, 0xa2, 0xbf, 0x19, 0xa3, 0xfd, 0x5f, 0xf3, 0xba, 0x14, + 0x92, 0x46, 0xe6, 0x2e, 0xbc, 0xeb, 0x91, 0x9d, 0xdc, 0x96, 0xbf, 0x28, + 0x91, 0x1a, 0xd3, 0xf5, 0xc1, 0x1f, 0x90, 0xba, 0xcb, 0x83, 0xc2, 0xdd, + 0x90, 0x70, 0xc3, 0x30, 0xc4, 0x31, 0x90, 0x3f, 0xba, 0xe0, 0xc5, 0x3d, + 0x90, 0x25, 0xb2, 0x8b, 0xc5, 0xcf, 0x90, 0x6c, 0xaa, 0x2d, 0xc6, 0x2a, + 0x90, 0xda, 0xa1, 0xc9, 0xc6, 0x5f, 0x91, 0xbf, 0x99, 0xa0, 0xc6, 0x7f, + 0x92, 0xb7, 0x91, 0x78, 0xc6, 0x94, 0x93, 0xf7, 0x89, 0xbc, 0xc6, 0x94, + 0x95, 0x4a, 0x82, 0x13, 0xc6, 0xf7, 0x97, 0x06, 0x7a, 0xa2, 0xc7, 0x40, + 0x98, 0xd3, 0x73, 0x53, 0xc7, 0xf9, 0x9a, 0xc8, 0x6b, 0xd2, 0xc9, 0x35, + 0x9c, 0xd2, 0x64, 0x06, 0xc2, 0xfd, 0x8b, 0x85, 0xea, 0x48, 0xc5, 0xc9, + 0x8a, 0xfe, 0xe0, 0xa8, 0xc7, 0xe5, 0x8a, 0x95, 0xd8, 0x37, 0xc9, 0xef, + 0x8a, 0x2d, 0xcf, 0xdd, 0xcb, 0xaa, 0x89, 0xd0, 0xc7, 0x87, 0xcd, 0x41, + 0x89, 0x80, 0xbf, 0x35, 0xce, 0x2b, 0x89, 0x75, 0xb6, 0xf3, 0xce, 0xee, + 0x89, 0x81, 0xae, 0xb7, 0xcf, 0x28, 0x89, 0xf2, 0xa6, 0x95, 0xcf, 0x57, + 0x8a, 0x7b, 0x9e, 0x70, 0xcf, 0x6f, 0x8b, 0x6a, 0x96, 0x4f, 0xcf, 0x8b, + 0x8c, 0x5d, 0x8e, 0x46, 0xcf, 0xc5, 0x8d, 0x6f, 0x86, 0xa3, 0xd0, 0x05, + 0x8e, 0x9f, 0x7f, 0x02, 0xd0, 0xdf, 0x90, 0x91, 0x77, 0x83, 0xd1, 0x86, + 0x92, 0x8a, 0x70, 0x20, 0xd2, 0xeb, 0x95, 0x44, 0x68, 0x44, 0xcb, 0x68, + 0x84, 0xdd, 0xed, 0x8b, 0xcd, 0xf0, 0x84, 0x77, 0xe4, 0x7d, 0xd0, 0x17, + 0x84, 0x0e, 0xdc, 0x39, 0xd1, 0xf5, 0x83, 0x9b, 0xd3, 0xc6, 0xd3, 0x9b, + 0x83, 0x38, 0xcb, 0x61, 0xd5, 0x0d, 0x82, 0xe4, 0xc3, 0x0c, 0xd6, 0x1a, + 0x82, 0xbd, 0xba, 0xe3, 0xd6, 0xef, 0x82, 0xae, 0xb2, 0xd0, 0xd7, 0x74, + 0x82, 0xfe, 0xaa, 0xe4, 0xd7, 0xcb, 0x83, 0x78, 0xa3, 0x08, 0xd8, 0x21, + 0x84, 0x39, 0x9b, 0x32, 0xd8, 0x6e, 0x85, 0x21, 0x93, 0x5b, 0xd8, 0xdd, + 0x86, 0x29, 0x8b, 0x87, 0xd9, 0x50, 0x87, 0x50, 0x83, 0xb3, 0xda, 0x07, + 0x89, 0x18, 0x7b, 0xea, 0xda, 0xee, 0x8b, 0x40, 0x74, 0x2d, 0xdb, 0xff, + 0x8d, 0x8b, 0x6c, 0x3d, 0xd2, 0xc2, 0x7e, 0x26, 0xf0, 0xf0, 0xd5, 0x63, + 0x7d, 0xce, 0xe7, 0xb3, 0xd7, 0x7b, 0x7d, 0x62, 0xdf, 0x96, 0xd9, 0x7a, + 0x7c, 0xd4, 0xd7, 0x1d, 0xdb, 0x5c, 0x7c, 0x50, 0xce, 0xcc, 0xdc, 0xbb, + 0x7c, 0x00, 0xc6, 0xb8, 0xdd, 0xf5, 0x7b, 0xbf, 0xbe, 0xb8, 0xde, 0xbc, + 0x7b, 0xc1, 0xb6, 0xe3, 0xdf, 0x75, 0x7b, 0xd6, 0xaf, 0x15, 0xdf, 0xe8, + 0x7c, 0x64, 0xa7, 0x6a, 0xe0, 0x56, 0x7c, 0xf0, 0x9f, 0xbe, 0xe0, 0xc7, + 0x7d, 0xd8, 0x98, 0x27, 0xe1, 0x31, 0x7e, 0xab, 0x90, 0x89, 0xe2, 0x0c, + 0x7f, 0xb1, 0x88, 0x86, 0xe2, 0xe1, 0x80, 0x80, 0x80, 0x80, 0xe4, 0x46, + 0x83, 0x7c, 0x78, 0xa4, 0xe5, 0x91, 0x86, 0x11, 0x70, 0xa6, 0xdb, 0xb6, + 0x76, 0xaa, 0xf1, 0xf2, 0xde, 0x0e, 0x76, 0x4b, 0xe9, 0x87, 0xe0, 0x1d, + 0x75, 0xde, 0xe1, 0x9e, 0xe1, 0xf0, 0x75, 0x94, 0xd9, 0xc7, 0xe3, 0x9d, + 0x75, 0x5a, 0xd2, 0x09, 0xe4, 0xde, 0x75, 0x28, 0xca, 0x57, 0xe5, 0xfb, + 0x74, 0xf3, 0xc2, 0xb3, 0xe6, 0xd9, 0x74, 0xf9, 0xbb, 0x31, 0xe7, 0x97, + 0x75, 0x1e, 0xb3, 0xbd, 0xe8, 0x3c, 0x75, 0x8a, 0xac, 0x3f, 0xe8, 0xc4, + 0x76, 0x32, 0xa4, 0xb0, 0xe9, 0x43, 0x77, 0x04, 0x9d, 0x15, 0xe9, 0xba, + 0x78, 0x0f, 0x95, 0x70, 0xea, 0x51, 0x79, 0x21, 0x8d, 0xa9, 0xeb, 0x47, + 0x7a, 0x51, 0x85, 0xa7, 0xec, 0x7e, 0x7b, 0xd5, 0x7d, 0x8f, 0xee, 0x51, + 0x7e, 0x7a, 0x75, 0x06, 0xe5, 0x58, 0x6e, 0xca, 0xf2, 0xfa, 0xe7, 0x7d, + 0x6e, 0x7e, 0xeb, 0x12, 0xe9, 0x85, 0x6e, 0x2c, 0xe3, 0x82, 0xeb, 0x28, + 0x6e, 0x14, 0xdc, 0x2c, 0xec, 0x86, 0x6e, 0x1f, 0xd5, 0x09, 0xed, 0xb7, + 0x6e, 0x25, 0xcd, 0xe5, 0xee, 0xad, 0x6e, 0x07, 0xc6, 0xb4, 0xef, 0x97, + 0x6d, 0xf3, 0xbf, 0x94, 0xf0, 0x49, 0x6e, 0x35, 0xb8, 0x81, 0xf0, 0xf0, + 0x6e, 0x7c, 0xb1, 0x66, 0xf1, 0x7f, 0x6f, 0x20, 0xaa, 0x01, 0xf1, 0xff, + 0x6f, 0xdc, 0xa2, 0x79, 0xf2, 0x85, 0x71, 0x03, 0x9a, 0xcf, 0xf3, 0x11, + 0x72, 0x36, 0x93, 0x1a, 0xf3, 0xf7, 0x73, 0xaf, 0x8b, 0x19, 0xf5, 0x2a, + 0x75, 0x07, 0x82, 0xf4, 0xf9, 0x73, 0x77, 0x19, 0x79, 0x69, 0x73, 0x33, + 0xd2, 0xf4, 0xc1, 0x26, 0x74, 0x02, 0xd4, 0x02, 0xb9, 0xe6, 0x74, 0x94, + 0xd5, 0x4f, 0xb2, 0xe6, 0x74, 0x6f, 0xd6, 0xfe, 0xab, 0x77, 0x74, 0x32, + 0xd8, 0x88, 0xa3, 0xe1, 0x73, 0xab, 0xda, 0x0a, 0x9c, 0x0b, 0x73, 0x08, + 0xdb, 0x44, 0x93, 0xd6, 0x72, 0x48, 0xdc, 0x44, 0x8b, 0xfc, 0x71, 0x76, + 0xdd, 0x0c, 0x84, 0x61, 0x70, 0xad, 0xdd, 0xac, 0x7d, 0x38, 0x6f, 0xf2, + 0xde, 0x30, 0x76, 0x79, 0x6f, 0x3e, 0xde, 0xa7, 0x6f, 0xc3, 0x6e, 0x8e, + 0xdf, 0x12, 0x69, 0xc5, 0x6d, 0xdf, 0xdf, 0x6e, 0x63, 0xc3, 0x6d, 0x44, + 0xdf, 0x87, 0x5d, 0x9b, 0x6c, 0xc9, 0xdf, 0x43, 0x57, 0x3c, 0x6c, 0x4c, + 0xde, 0xff, 0x50, 0xb8, 0x78, 0x99, 0xce, 0x7c, 0xc3, 0x0f, 0x79, 0xf8, + 0xcf, 0x01, 0xbb, 0x84, 0x7a, 0xed, 0xd0, 0x00, 0xb4, 0x7c, 0x7b, 0x70, + 0xd1, 0x2f, 0xad, 0x47, 0x7b, 0x4b, 0xd2, 0x98, 0xa5, 0x78, 0x7b, 0x13, + 0xd4, 0x09, 0x9d, 0x99, 0x7a, 0xdf, 0xd5, 0x54, 0x95, 0x4f, 0x7a, 0x73, + 0xd6, 0x90, 0x8d, 0x3b, 0x79, 0xd4, 0xd7, 0xa3, 0x85, 0x76, 0x79, 0x1d, + 0xd8, 0x9a, 0x7e, 0x1c, 0x78, 0x60, 0xd9, 0x6f, 0x77, 0x75, 0x77, 0xa0, + 0xda, 0x2e, 0x70, 0xc2, 0x77, 0x01, 0xda, 0xd8, 0x6a, 0xcd, 0x76, 0x62, + 0xdb, 0x6f, 0x64, 0xe4, 0x75, 0xc4, 0xdb, 0xd4, 0x5e, 0xdf, 0x75, 0x3e, + 0xdb, 0x81, 0x58, 0x52, 0x74, 0xb5, 0xdb, 0x2e, 0x51, 0xa3, 0x7d, 0xb3, + 0xca, 0x69, 0xc5, 0xb2, 0x7f, 0x5c, 0xca, 0x76, 0xbd, 0x99, 0x80, 0xa2, + 0xcb, 0x25, 0xb6, 0x5c, 0x81, 0xc1, 0xcb, 0xfd, 0xaf, 0x33, 0x81, 0xfe, + 0xcd, 0x2f, 0xa7, 0x42, 0x82, 0x0b, 0xce, 0x77, 0x9f, 0x5e, 0x82, 0x29, + 0xcf, 0xd7, 0x96, 0xf3, 0x82, 0x18, 0xd1, 0x2d, 0x8e, 0xb3, 0x81, 0xb8, + 0xd2, 0x66, 0x86, 0xa9, 0x81, 0x32, 0xd3, 0x8d, 0x7e, 0xf8, 0x80, 0x7d, + 0xd4, 0x99, 0x78, 0x69, 0x7f, 0xc0, 0xd5, 0x93, 0x71, 0xcd, 0x7f, 0x23, + 0xd6, 0x7e, 0x6b, 0xce, 0x7e, 0x8c, 0xd7, 0x52, 0x65, 0xf5, 0x7d, 0xf0, + 0xd8, 0x13, 0x60, 0x1c, 0x7d, 0x5e, 0xd7, 0xb0, 0x59, 0x73, 0x7c, 0xd2, + 0xd7, 0x46, 0x52, 0x9f, 0x83, 0x3e, 0xc6, 0x73, 0xc8, 0xb6, 0x85, 0x2e, + 0xc6, 0x4f, 0xc0, 0x24, 0x86, 0xa7, 0xc6, 0xc5, 0xb8, 0xb0, 0x87, 0xff, + 0xc7, 0x49, 0xb1, 0x51, 0x88, 0xc1, 0xc8, 0x3e, 0xa9, 0x7c, 0x89, 0x43, + 0xc9, 0x59, 0xa1, 0xa6, 0x89, 0x84, 0xca, 0x80, 0x99, 0x5f, 0x89, 0x9d, + 0xcb, 0xb9, 0x90, 0xfd, 0x89, 0x68, 0xcd, 0x07, 0x88, 0xdb, 0x89, 0x15, + 0xce, 0x66, 0x80, 0xb0, 0x88, 0x76, 0xcf, 0xd0, 0x79, 0xec, 0x87, 0xc6, + 0xd0, 0xf9, 0x73, 0x5d, 0x87, 0x22, 0xd2, 0x0e, 0x6d, 0x28, 0x86, 0x8f, + 0xd3, 0x16, 0x67, 0x42, 0x85, 0xfa, 0xd4, 0x0d, 0x61, 0x5e, 0x85, 0x8e, + 0xd3, 0xfd, 0x5a, 0xd4, 0x85, 0x2f, 0xd3, 0x90, 0x53, 0xe8, 0x89, 0x5b, + 0xc2, 0x6e, 0xcb, 0xd2, 0x8b, 0x27, 0xc2, 0x3d, 0xc3, 0x24, 0x8c, 0xc0, + 0xc2, 0x54, 0xbb, 0x30, 0x8e, 0x2e, 0xc2, 0x9a, 0xb3, 0x8a, 0x8f, 0x4a, + 0xc3, 0x38, 0xab, 0xb8, 0x90, 0x19, 0xc4, 0x25, 0xa3, 0xcb, 0x90, 0xa0, + 0xc5, 0x20, 0x9b, 0xb1, 0x90, 0xdf, 0xc6, 0x1e, 0x93, 0x56, 0x90, 0xe0, + 0xc7, 0x34, 0x8b, 0x40, 0x90, 0xb6, 0xc8, 0x5a, 0x83, 0x3f, 0x90, 0x56, + 0xc9, 0xc3, 0x7c, 0x1e, 0x8f, 0xcb, 0xcb, 0x3b, 0x75, 0x7f, 0x8f, 0x2d, + 0xcc, 0xa2, 0x6e, 0xf6, 0x8e, 0x8b, 0xce, 0x07, 0x68, 0xd0, 0x8d, 0xd3, + 0xcf, 0x63, 0x62, 0xbc, 0x8d, 0x87, 0xcf, 0xec, 0x5c, 0x54, 0x8d, 0xa3, + 0xcf, 0xbb, 0x55, 0x2b, 0x8f, 0xf0, 0xbd, 0xde, 0xcf, 0x18, 0x91, 0xeb, + 0xbd, 0x92, 0xc6, 0x70, 0x93, 0xce, 0xbd, 0x79, 0xbe, 0x44, 0x95, 0x5c, + 0xbd, 0xcb, 0xb6, 0x7e, 0x96, 0xbc, 0xbe, 0x35, 0xae, 0xb8, 0x97, 0x81, + 0xbf, 0x17, 0xa6, 0x8e, 0x98, 0x12, 0xbf, 0xff, 0x9e, 0x63, 0x98, 0x5e, + 0xc0, 0xb7, 0x96, 0x11, 0x98, 0x84, 0xc1, 0x85, 0x8d, 0xec, 0x98, 0x69, + 0xc2, 0x80, 0x86, 0x1c, 0x98, 0x33, 0xc3, 0xa4, 0x7e, 0x99, 0x97, 0xcd, + 0xc5, 0x2c, 0x78, 0x04, 0x97, 0x53, 0xc6, 0xa5, 0x71, 0x69, 0x96, 0xf4, + 0xc7, 0xfa, 0x6b, 0x13, 0x96, 0x87, 0xc9, 0x4c, 0x64, 0xd3, 0x96, 0x21, + 0xca, 0x79, 0x5e, 0x7d, 0x96, 0x3d, 0xca, 0xe5, 0x57, 0x63, 0x96, 0xfd, + 0xb9, 0x26, 0xd2, 0xc3, 0x99, 0x60, 0xb8, 0x88, 0xca, 0x22, 0x9b, 0x75, + 0xb8, 0x31, 0xc2, 0x00, 0x9d, 0x21, 0xb8, 0x40, 0xba, 0x1a, 0x9e, 0x9a, + 0xb8, 0x6e, 0xb2, 0x4a, 0x9f, 0xa4, 0xb8, 0xe7, 0xaa, 0x26, 0xa0, 0x71, + 0xb9, 0x80, 0xa1, 0xee, 0xa0, 0xac, 0xba, 0x3c, 0x99, 0x8a, 0xa0, 0xbb, + 0xba, 0xfe, 0x91, 0x18, 0xa0, 0x97, 0xbc, 0x21, 0x89, 0x2d, 0xa0, 0x57, + 0xbd, 0x3b, 0x81, 0x3b, 0x9f, 0xc2, 0xbf, 0x03, 0x7a, 0x43, 0x9f, 0x34, + 0xc0, 0xb2, 0x73, 0x94, 0x9e, 0xee, 0xc2, 0x0d, 0x6d, 0x25, 0x9e, 0xce, + 0xc3, 0x43, 0x66, 0xd7, 0x9e, 0x9a, 0xc4, 0x84, 0x60, 0x96, 0x9e, 0xd5, + 0xc5, 0x50, 0x59, 0x82, 0x9e, 0x95, 0xb3, 0xc6, 0xd6, 0x8a, 0xa0, 0xe2, + 0xb3, 0x00, 0xcd, 0xe6, 0xa3, 0x16, 0xb2, 0xb4, 0xc5, 0xfa, 0xa5, 0x09, + 0xb2, 0x7c, 0xbe, 0x1c, 0xa6, 0x88, 0xb2, 0x8b, 0xb6, 0x2d, 0xa7, 0xd1, + 0xb2, 0xab, 0xae, 0x28, 0xa8, 0xb3, 0xb3, 0x0a, 0xa5, 0xc4, 0xa9, 0x3f, + 0xb3, 0x8c, 0x9d, 0x5c, 0xa9, 0x3c, 0xb4, 0x5a, 0x94, 0xe6, 0xa9, 0x25, + 0xb5, 0x54, 0x8c, 0xc1, 0xa8, 0xf0, 0xb6, 0x82, 0x84, 0xf9, 0xa8, 0xac, + 0xb7, 0xf5, 0x7d, 0x9e, 0xa8, 0x42, 0xb9, 0xd5, 0x76, 0xdd, 0xa7, 0xb1, + 0xbb, 0xad, 0x70, 0x0c, 0xa7, 0x98, 0xbc, 0xf8, 0x69, 0x5c, 0xa7, 0x6a, + 0xbe, 0x4a, 0x62, 0xc2, 0xa7, 0x86, 0xbf, 0x4a, 0x5b, 0xc5, 0xa7, 0xd2, + 0xad, 0xce, 0xdb, 0x1e, 0xaa, 0x4c, 0xad, 0x2a, 0xd2, 0x1c, 0xac, 0x52, + 0xac, 0xbe, 0xca, 0x15, 0xae, 0x25, 0xac, 0x59, 0xc2, 0x3e, 0xaf, 0x77, + 0xac, 0x3b, 0xba, 0x3e, 0xb0, 0x8a, 0xac, 0x3e, 0xb2, 0x30, 0xb1, 0x47, + 0xac, 0x7d, 0xa9, 0xbc, 0xb1, 0xda, 0xac, 0xd1, 0xa1, 0x25, 0xb1, 0xed, + 0xad, 0x94, 0x98, 0xa2, 0xb1, 0xdb, 0xae, 0x63, 0x90, 0x13, 0xb1, 0x5c, + 0xaf, 0x8d, 0x88, 0x05, 0xb0, 0xe8, 0xb0, 0xa9, 0x80, 0x13, 0xb0, 0xe1, + 0xb2, 0x92, 0x79, 0xa1, 0xb0, 0xb0, 0xb4, 0x71, 0x73, 0x16, 0xb0, 0xa4, + 0xb5, 0xf3, 0x6c, 0x54, 0xb0, 0xc2, 0xb7, 0x2c, 0x65, 0x84, 0xb0, 0xe6, + 0xb8, 0x65, 0x5e, 0x8f, 0xb1, 0xc4, 0xa6, 0xb7, 0xdf, 0xa8, 0xb4, 0x14, + 0xa6, 0x53, 0xd6, 0xaf, 0xb6, 0x03, 0xa5, 0xf3, 0xce, 0x79, 0xb7, 0x87, + 0xa5, 0xaa, 0xc6, 0x8a, 0xb8, 0xd7, 0xa5, 0x76, 0xbe, 0x89, 0xb9, 0xbb, + 0xa5, 0x72, 0xb6, 0x4a, 0xba, 0x75, 0xa5, 0x8c, 0xad, 0xf2, 0xba, 0xc8, + 0xa6, 0x08, 0xa5, 0x4f, 0xba, 0xf3, 0xa6, 0xa7, 0x9c, 0xca, 0xba, 0xe7, + 0xa7, 0x77, 0x94, 0x6c, 0xba, 0xc2, 0xa8, 0x8a, 0x8c, 0x61, 0xba, 0x78, + 0xa9, 0xda, 0x84, 0xa8, 0xba, 0x2d, 0xab, 0x55, 0x7d, 0x3a, 0xb9, 0xe7, + 0xad, 0x21, 0x76, 0x50, 0xb9, 0x95, 0xae, 0xf1, 0x6f, 0x6d, 0xb9, 0xd2, + 0xb0, 0x4b, 0x68, 0x41, 0xba, 0x00, 0xb1, 0x94, 0x61, 0x25, 0xbb, 0x8b, + 0x9f, 0xf7, 0xe4, 0x7b, 0xbd, 0xba, 0x9f, 0x71, 0xdb, 0xaa, 0xbf, 0x88, + 0x9f, 0x00, 0xd3, 0x7a, 0xc0, 0xe4, 0x9e, 0xc2, 0xcb, 0x47, 0xc1, 0xfd, + 0x9e, 0xa2, 0xc3, 0x09, 0xc2, 0xdd, 0x9e, 0x84, 0xba, 0xb1, 0xc3, 0x96, + 0x9e, 0x68, 0xb2, 0x47, 0xc3, 0xdc, 0x9e, 0xcc, 0xa9, 0xbd, 0xc3, 0xf7, + 0x9f, 0x5b, 0xa1, 0x21, 0xc3, 0xcc, 0xa0, 0x25, 0x98, 0xb8, 0xc3, 0xa2, + 0xa0, 0xfb, 0x90, 0x5a, 0xc3, 0x88, 0xa2, 0x6d, 0x88, 0xd6, 0xc3, 0x58, + 0xa3, 0xd5, 0x81, 0x47, 0xc3, 0x32, 0xa5, 0x6b, 0x7a, 0x28, 0xc2, 0xfd, + 0xa7, 0x0b, 0x73, 0x26, 0xc3, 0x45, 0xa8, 0xa5, 0x6b, 0xea, 0xc3, 0xd2, + 0xaa, 0x29, 0x64, 0x58, 0xc4, 0x88, 0x99, 0x4e, 0xe8, 0xc6, 0xc6, 0xc7, + 0x98, 0xc7, 0xdf, 0xe6, 0xc8, 0x59, 0x98, 0x7a, 0xd7, 0xc0, 0xc9, 0xda, + 0x98, 0x33, 0xcf, 0xa8, 0xcb, 0x1c, 0x98, 0x04, 0xc7, 0x75, 0xcc, 0x47, + 0x97, 0xd9, 0xbf, 0x44, 0xcc, 0xd5, 0x97, 0xdf, 0xb6, 0xdc, 0xcd, 0x44, + 0x97, 0xfa, 0xae, 0x75, 0xcd, 0x45, 0x98, 0x66, 0xa6, 0x0a, 0xcd, 0x3d, + 0x98, 0xf4, 0x9d, 0xac, 0xcd, 0x22, 0x99, 0xd1, 0x95, 0x71, 0xcc, 0xfe, + 0x9a, 0xd7, 0x8d, 0x67, 0xcc, 0xc2, 0x9c, 0x31, 0x85, 0xb9, 0xcc, 0x83, + 0x9d, 0xa8, 0x7e, 0x21, 0xcc, 0x54, 0x9f, 0x4a, 0x76, 0xe1, 0xcc, 0x1c, + 0xa0, 0xdf, 0x6f, 0xb5, 0xcd, 0x81, 0xa2, 0xc0, 0x68, 0x02, 0xcc, 0x9f, + 0x92, 0xad, 0xec, 0xb7, 0xce, 0xbb, 0x92, 0x15, 0xe3, 0xe7, 0xd0, 0x75, + 0x91, 0xa5, 0xdb, 0xb5, 0xd1, 0xf2, 0x91, 0x5e, 0xd3, 0x96, 0xd3, 0x41, + 0x91, 0x21, 0xcb, 0x68, 0xd4, 0x68, 0x90, 0xf0, 0xc3, 0x2a, 0xd5, 0x1f, + 0x90, 0xf2, 0xba, 0xdc, 0xd5, 0x96, 0x91, 0x14, 0xb2, 0x84, 0xd5, 0xcc, + 0x91, 0x62, 0xaa, 0x52, 0xd5, 0xe1, 0x91, 0xc1, 0xa2, 0x2c, 0xd5, 0xec, + 0x92, 0x7d, 0x9a, 0x16, 0xd5, 0xeb, 0x93, 0x51, 0x92, 0x00, 0xd5, 0xed, + 0x94, 0x7b, 0x8a, 0x3a, 0xd5, 0xdf, 0x95, 0xc2, 0x82, 0x87, 0xd6, 0x35, + 0x97, 0x70, 0x7b, 0x08, 0xd6, 0x88, 0x99, 0x34, 0x73, 0xa9, 0xd7, 0x3d, + 0x9b, 0x33, 0x6c, 0x01, 0xd4, 0x3e, 0x8c, 0x2f, 0xf0, 0x64, 0xd6, 0x46, + 0x8b, 0xb9, 0xe7, 0x98, 0xd7, 0xfb, 0x8b, 0x52, 0xdf, 0x77, 0xd9, 0x85, + 0x8a, 0xf5, 0xd7, 0x40, 0xda, 0xfe, 0x8a, 0x99, 0xcf, 0x10, 0xdc, 0x1a, + 0x8a, 0x63, 0xc6, 0xdf, 0xdd, 0x16, 0x8a, 0x3a, 0xbe, 0xb4, 0xdd, 0x9a, + 0x8a, 0x51, 0xb6, 0x8b, 0xde, 0x0f, 0x8a, 0x78, 0xae, 0x74, 0xde, 0x50, + 0x8a, 0xdd, 0xa6, 0x98, 0xde, 0x8e, 0x8b, 0x51, 0x9e, 0xbe, 0xde, 0xc0, + 0x8c, 0x19, 0x96, 0xe7, 0xde, 0xe8, 0x8c, 0xeb, 0x8f, 0x05, 0xde, 0xed, + 0x8e, 0x29, 0x87, 0x07, 0xde, 0xe5, 0x8f, 0x82, 0x7f, 0x0e, 0xdf, 0xbb, + 0x91, 0x7d, 0x77, 0x6c, 0xe0, 0x82, 0x93, 0x6e, 0x6f, 0xb6, 0xda, 0xf7, + 0x85, 0xe1, 0xf3, 0xba, 0xdd, 0x16, 0x85, 0x8a, 0xeb, 0x45, 0xde, 0xc9, + 0x85, 0x10, 0xe3, 0x33, 0xe0, 0x66, 0x84, 0x93, 0xda, 0xf2, 0xe1, 0xe7, + 0x84, 0x29, 0xd2, 0x92, 0xe3, 0x18, 0x83, 0xe8, 0xca, 0x6c, 0xe4, 0x25, + 0x83, 0xb8, 0xc2, 0x68, 0xe4, 0xec, 0x83, 0xb1, 0xba, 0x75, 0xe5, 0x99, + 0x83, 0xb8, 0xb2, 0x8b, 0xe6, 0x13, 0x84, 0x03, 0xaa, 0xc3, 0xe6, 0x74, + 0x84, 0x69, 0xa3, 0x04, 0xe6, 0xd8, 0x85, 0x0e, 0x9b, 0x4e, 0xe7, 0x3d, + 0x85, 0xd8, 0x93, 0x99, 0xe7, 0xc8, 0x86, 0xcd, 0x8b, 0xc5, 0xe8, 0x66, + 0x87, 0xef, 0x83, 0xd9, 0xe9, 0x6d, 0x89, 0xcd, 0x7b, 0xea, 0xea, 0xe9, + 0x8c, 0x20, 0x73, 0xce, 0xe1, 0xf4, 0x7f, 0xb4, 0xf7, 0x2c, 0xe3, 0x4d, + 0x7f, 0x93, 0xee, 0xeb, 0xe5, 0x3f, 0x7e, 0xf2, 0xe6, 0xae, 0xe6, 0xf8, + 0x7e, 0x71, 0xde, 0x80, 0xe8, 0xaf, 0x7d, 0xf5, 0xd6, 0x0c, 0xea, 0x2c, + 0x7d, 0x93, 0xcd, 0xde, 0xeb, 0x4c, 0x7d, 0x56, 0xc6, 0x1b, 0xec, 0x5a, + 0x7d, 0x25, 0xbe, 0x69, 0xed, 0x2a, 0x7d, 0x24, 0xb6, 0xc9, 0xed, 0xef, + 0x7d, 0x2d, 0xaf, 0x2d, 0xee, 0x57, 0x7d, 0x99, 0xa7, 0x7c, 0xee, 0xbd, + 0x7d, 0xff, 0x9f, 0xc7, 0xef, 0x21, 0x7e, 0xbd, 0x98, 0x02, 0xef, 0x7f, + 0x7f, 0x68, 0x90, 0x39, 0xf0, 0x7d, 0x80, 0x1a, 0x88, 0x5d, 0xf1, 0x70, + 0x80, 0x80, 0x80, 0x80, 0xf5, 0xd4, 0x83, 0xf5, 0x77, 0xa1, 0xeb, 0x5e, + 0x77, 0xab, 0xf8, 0x75, 0xec, 0xd8, 0x77, 0xad, 0xf0, 0x4e, 0xee, 0x7d, + 0x77, 0x4b, 0xe8, 0x6c, 0xf0, 0x07, 0x76, 0xee, 0xe0, 0x96, 0xf1, 0x64, + 0x76, 0xbf, 0xd8, 0xe5, 0xf2, 0xaa, 0x76, 0x99, 0xd1, 0x47, 0xf3, 0xbf, + 0x76, 0x67, 0xc9, 0xf1, 0xf4, 0xce, 0x76, 0x3d, 0xc2, 0xb9, 0xf5, 0xae, + 0x76, 0x44, 0xbb, 0x77, 0xf6, 0x6e, 0x76, 0x64, 0xb4, 0x26, 0xf7, 0x13, + 0x76, 0xc8, 0xac, 0xb6, 0xf7, 0xa2, 0x77, 0x72, 0xa5, 0x21, 0xf8, 0x32, + 0x78, 0x2c, 0x9d, 0x7b, 0xf8, 0xc1, 0x78, 0xfb, 0x95, 0xc0, 0xf9, 0x69, + 0x79, 0xbe, 0x8d, 0xe4, 0xfa, 0x6b, 0x7a, 0x5e, 0x85, 0xc8, 0xfe, 0x21, + 0x7b, 0xb4, 0x7c, 0x51, 0x7b, 0xa9, 0xd7, 0x96, 0xc5, 0x82, 0x7c, 0xcd, + 0xd7, 0x4a, 0xbc, 0xf6, 0x7d, 0x5a, 0xd8, 0x5c, 0xb6, 0x02, 0x7d, 0xb7, + 0xd9, 0xb2, 0xaf, 0x33, 0x7d, 0x3f, 0xdb, 0x77, 0xa7, 0xb4, 0x7c, 0x73, + 0xdd, 0x49, 0xa0, 0x55, 0x7b, 0xc6, 0xde, 0xb2, 0x98, 0x68, 0x7a, 0xe1, + 0xdf, 0xfd, 0x90, 0x85, 0x79, 0xe2, 0xe1, 0x3c, 0x89, 0x2d, 0x78, 0xc5, + 0xe2, 0x28, 0x81, 0xb5, 0x77, 0xea, 0xe2, 0xad, 0x7b, 0x0b, 0x77, 0x15, + 0xe2, 0xf2, 0x74, 0x7a, 0x76, 0x4c, 0xe3, 0x32, 0x6e, 0x32, 0x75, 0xa4, + 0xe3, 0x80, 0x68, 0x64, 0x75, 0x02, 0xe3, 0xd6, 0x62, 0x92, 0x74, 0x45, + 0xe3, 0xb4, 0x5c, 0x76, 0x73, 0x92, 0xe3, 0x3c, 0x56, 0x0f, 0x81, 0xaf, + 0xd2, 0xb2, 0xc6, 0x8c, 0x83, 0x36, 0xd2, 0x9d, 0xbe, 0x8a, 0x83, 0xed, + 0xd3, 0xb7, 0xb7, 0xaf, 0x84, 0x6f, 0xd4, 0xd5, 0xb0, 0xeb, 0x84, 0x43, + 0xd6, 0x3c, 0xa9, 0x7d, 0x83, 0xdd, 0xd7, 0xce, 0xa2, 0x0e, 0x83, 0x76, + 0xd9, 0x33, 0x9a, 0x29, 0x82, 0xee, 0xda, 0x78, 0x92, 0x1a, 0x82, 0x1e, + 0xdb, 0x8a, 0x8a, 0x6f, 0x81, 0x2e, 0xdc, 0x82, 0x82, 0xec, 0x80, 0x3f, + 0xdd, 0x4a, 0x7c, 0x12, 0x7f, 0x54, 0xdd, 0xfe, 0x75, 0x80, 0x7e, 0x76, + 0xde, 0xa2, 0x6f, 0x14, 0x7d, 0xc4, 0xdf, 0x1f, 0x69, 0x49, 0x7d, 0x25, + 0xdf, 0x9b, 0x63, 0x84, 0x7c, 0x66, 0xdf, 0xae, 0x5d, 0x7f, 0x7b, 0xe7, + 0xdf, 0x65, 0x57, 0x45, 0x87, 0x61, 0xce, 0x95, 0xc8, 0x8d, 0x89, 0x4e, + 0xce, 0x81, 0xc0, 0xc6, 0x8a, 0x4a, 0xcf, 0x61, 0xb9, 0xb3, 0x8b, 0x0e, + 0xd0, 0x65, 0xb2, 0xc4, 0x8b, 0x55, 0xd1, 0x96, 0xab, 0x80, 0x8b, 0x33, + 0xd2, 0xf0, 0xa4, 0x04, 0x8a, 0xf8, 0xd4, 0x4e, 0x9c, 0x42, 0x8a, 0x9e, + 0xd5, 0x8f, 0x94, 0x0d, 0x8a, 0x0e, 0xd6, 0xbc, 0x8c, 0x24, 0x89, 0x44, + 0xd7, 0xcc, 0x84, 0x6f, 0x88, 0x67, 0xd8, 0xc7, 0x7d, 0x55, 0x87, 0x82, + 0xd9, 0xa9, 0x76, 0xd8, 0x86, 0x9c, 0xda, 0x7c, 0x70, 0x57, 0x85, 0xf2, + 0xdb, 0x40, 0x6a, 0x7d, 0x85, 0x53, 0xdb, 0xf8, 0x64, 0xac, 0x84, 0xbd, + 0xdc, 0x74, 0x5e, 0xcd, 0x84, 0x90, 0xdc, 0x56, 0x58, 0xb2, 0x8d, 0x56, + 0xca, 0xaa, 0xcb, 0x53, 0x8f, 0x25, 0xca, 0x94, 0xc3, 0x7d, 0x90, 0x96, + 0xcb, 0x20, 0xbc, 0x1c, 0x91, 0x83, 0xcc, 0x00, 0xb4, 0xf3, 0x92, 0x53, + 0xcd, 0x0a, 0xad, 0xca, 0x92, 0x70, 0xce, 0x22, 0xa6, 0x29, 0x92, 0x78, + 0xcf, 0x51, 0x9e, 0x88, 0x92, 0x31, 0xd0, 0x8d, 0x96, 0x46, 0x91, 0xc1, + 0xd1, 0xbb, 0x8e, 0x26, 0x91, 0x20, 0xd2, 0xd8, 0x86, 0x56, 0x90, 0x6b, + 0xd3, 0xf5, 0x7e, 0xd4, 0x8f, 0x8f, 0xd4, 0xfd, 0x78, 0x5d, 0x8e, 0xae, + 0xd5, 0xf8, 0x71, 0xe4, 0x8d, 0xfe, 0xd6, 0xfe, 0x6b, 0xe0, 0x8d, 0x67, + 0xd7, 0xfe, 0x66, 0x03, 0x8c, 0xc4, 0xd8, 0xec, 0x60, 0x29, 0x8c, 0xe9, + 0xd8, 0xfb, 0x5a, 0x08, 0x93, 0xc0, 0xc7, 0x0c, 0xce, 0x33, 0x95, 0x9a, + 0xc7, 0x34, 0xc6, 0x55, 0x97, 0x43, 0xc7, 0x7f, 0xbe, 0xbf, 0x98, 0x5e, + 0xc8, 0x25, 0xb7, 0x7b, 0x99, 0x7e, 0xc8, 0xd3, 0xb0, 0x60, 0x99, 0xc6, + 0xc9, 0x94, 0xa8, 0xb0, 0x99, 0xe5, 0xca, 0x4e, 0xa1, 0x0c, 0x99, 0xcd, + 0xcb, 0x47, 0x99, 0x0c, 0x99, 0xba, 0xcc, 0x6f, 0x91, 0x19, 0x99, 0x1c, + 0xcd, 0x7d, 0x89, 0x58, 0x98, 0x8b, 0xce, 0xaa, 0x81, 0xa2, 0x97, 0xc6, + 0xcf, 0xe8, 0x7a, 0xce, 0x96, 0xec, 0xd0, 0xf8, 0x74, 0x25, 0x96, 0x44, + 0xd2, 0x1c, 0x6d, 0xd6, 0x95, 0xbe, 0xd3, 0x4a, 0x67, 0xda, 0x95, 0x28, + 0xd4, 0x6d, 0x61, 0xe1, 0x95, 0x90, 0xd5, 0x3c, 0x5b, 0xad, 0x9a, 0x7a, + 0xc3, 0x88, 0xd1, 0x3b, 0x9c, 0x67, 0xc3, 0x77, 0xc9, 0x3a, 0x9e, 0x33, + 0xc3, 0x92, 0xc1, 0xa7, 0x9f, 0x82, 0xc3, 0xf3, 0xba, 0x41, 0xa0, 0xb9, + 0xc4, 0x66, 0xb3, 0x05, 0xa1, 0x5a, 0xc4, 0xe7, 0xab, 0x77, 0xa1, 0x89, + 0xc5, 0x72, 0xa3, 0xac, 0xa1, 0x82, 0xc6, 0x17, 0x9b, 0xc2, 0xa1, 0x6b, + 0xc6, 0xf0, 0x93, 0xc8, 0xa0, 0xee, 0xc7, 0xc7, 0x8b, 0xfd, 0xa0, 0x5a, + 0xc8, 0xb6, 0x84, 0x65, 0x9f, 0xc9, 0xc9, 0xdf, 0x7d, 0x53, 0x9f, 0x1b, + 0xcb, 0x28, 0x76, 0xb9, 0x9e, 0x7d, 0xcc, 0x74, 0x70, 0x30, 0x9e, 0x19, + 0xcd, 0xc2, 0x6a, 0x03, 0x9d, 0xa3, 0xcf, 0x1a, 0x63, 0xe2, 0x9d, 0x86, + 0xd0, 0x86, 0x5d, 0xac, 0xa1, 0xa9, 0xbf, 0x34, 0xd4, 0x5f, 0xa3, 0xe8, + 0xbe, 0xe2, 0xcc, 0x8a, 0xa5, 0xcf, 0xbe, 0xce, 0xc5, 0x2e, 0xa7, 0x72, + 0xbe, 0xde, 0xbd, 0xd8, 0xa8, 0x89, 0xbf, 0x36, 0xb6, 0x5b, 0xa9, 0x6f, + 0xbf, 0x9c, 0xae, 0xd5, 0xa9, 0xa7, 0xc0, 0x3c, 0xa6, 0xe8, 0xa9, 0xb1, + 0xc0, 0xcc, 0x9e, 0xfd, 0xa9, 0x5f, 0xc1, 0x7f, 0x96, 0xe0, 0xa9, 0x09, + 0xc2, 0x46, 0x8e, 0xe5, 0xa8, 0x72, 0xc3, 0x31, 0x87, 0x45, 0xa7, 0xf1, + 0xc4, 0x3c, 0x7f, 0xcd, 0xa7, 0x42, 0xc5, 0x9e, 0x79, 0x1c, 0xa6, 0x94, + 0xc6, 0xfc, 0x72, 0x7b, 0xa6, 0x3b, 0xc8, 0x48, 0x6c, 0x1f, 0xa5, 0xfe, + 0xc9, 0x8b, 0x65, 0xed, 0xa6, 0x1e, 0xcb, 0x28, 0x60, 0x00, 0xaa, 0x60, + 0xba, 0x02, 0xd8, 0x8e, 0xac, 0x99, 0xb9, 0x7f, 0xd0, 0xa2, 0xae, 0x79, + 0xb9, 0x6d, 0xc9, 0x3e, 0xb0, 0x0d, 0xb9, 0x4c, 0xc1, 0xec, 0xb1, 0x18, + 0xb9, 0x79, 0xba, 0x58, 0xb1, 0xd2, 0xb9, 0xaf, 0xb2, 0xa9, 0xb2, 0x33, + 0xba, 0x19, 0xaa, 0xb4, 0xb2, 0x4a, 0xba, 0x8f, 0xa2, 0x96, 0xb2, 0x02, + 0xbb, 0x44, 0x9a, 0x71, 0xb1, 0x8f, 0xbc, 0x10, 0x92, 0x49, 0xb0, 0xfd, + 0xbd, 0x13, 0x8a, 0xa1, 0xb0, 0x64, 0xbe, 0x2c, 0x83, 0x1f, 0xaf, 0xba, + 0xbf, 0xa9, 0x7c, 0x05, 0xae, 0xfe, 0xc1, 0x2b, 0x75, 0x1a, 0xae, 0x73, + 0xc2, 0x8b, 0x6e, 0x65, 0xae, 0x4b, 0xc3, 0xa2, 0x67, 0xf3, 0xae, 0x4e, + 0xc4, 0xf1, 0x61, 0xa5, 0xb3, 0xd2, 0xb4, 0x4f, 0xdc, 0xdb, 0xb5, 0xc1, + 0xb4, 0x0d, 0xd5, 0x02, 0xb7, 0xc0, 0xb4, 0x11, 0xcd, 0x7b, 0xb8, 0xd8, + 0xb3, 0xe3, 0xc5, 0xf7, 0xb9, 0xd6, 0xb3, 0xd8, 0xbe, 0x69, 0xba, 0x60, + 0xb4, 0x08, 0xb6, 0x89, 0xba, 0xcf, 0xb4, 0x47, 0xae, 0x9c, 0xba, 0xc9, + 0xb4, 0xb7, 0xa6, 0x34, 0xba, 0xae, 0xb5, 0x41, 0x9d, 0xdc, 0xba, 0x2b, + 0xb5, 0xe2, 0x95, 0x7a, 0xb9, 0xa3, 0xb6, 0xb3, 0x8d, 0x6f, 0xb9, 0x06, + 0xb7, 0xbf, 0x85, 0xeb, 0xb8, 0x72, 0xb8, 0xf3, 0x7e, 0xa1, 0xb7, 0xdd, + 0xba, 0x7d, 0x77, 0xe7, 0xb7, 0x3a, 0xbc, 0x0a, 0x71, 0x1f, 0xb6, 0xfb, + 0xbd, 0x55, 0x6a, 0x4f, 0xb6, 0xd0, 0xbe, 0xab, 0x63, 0x83, 0xbd, 0xb6, + 0xae, 0x1c, 0xe1, 0xc1, 0xbf, 0x67, 0xad, 0xcd, 0xd9, 0xbe, 0xc1, 0x06, + 0xad, 0xa9, 0xd2, 0x17, 0xc2, 0x03, 0xad, 0x97, 0xca, 0x63, 0xc2, 0xd4, + 0xad, 0x93, 0xc2, 0xb0, 0xc3, 0x53, 0xad, 0xb8, 0xba, 0xbf, 0xc3, 0x9c, + 0xad, 0xed, 0xb2, 0xaa, 0xc3, 0x89, 0xae, 0x4c, 0xaa, 0x3b, 0xc3, 0x55, + 0xae, 0xc7, 0xa1, 0xa1, 0xc2, 0xe5, 0xaf, 0x66, 0x99, 0x2e, 0xc2, 0x6c, + 0xb0, 0x0a, 0x90, 0xbb, 0xc1, 0xec, 0xb1, 0x1c, 0x89, 0x1a, 0xc1, 0x5c, + 0xb2, 0x2e, 0x81, 0x86, 0xc0, 0xe6, 0xb3, 0x98, 0x7a, 0xb6, 0xc0, 0x61, + 0xb5, 0x07, 0x73, 0xff, 0xc0, 0x07, 0xb6, 0x64, 0x6d, 0x29, 0xbf, 0xf1, + 0xb7, 0xbe, 0x66, 0x12, 0xc7, 0x92, 0xa7, 0xb4, 0xe6, 0xf8, 0xc9, 0x13, + 0xa7, 0x41, 0xde, 0xae, 0xca, 0x82, 0xa7, 0x54, 0xd7, 0x10, 0xcb, 0x57, + 0xa7, 0x1b, 0xcf, 0x54, 0xcc, 0x17, 0xa7, 0x13, 0xc7, 0x6f, 0xcc, 0xab, + 0xa6, 0xf6, 0xbf, 0x7d, 0xcc, 0xc8, 0xa7, 0x1b, 0xb7, 0x26, 0xcc, 0xb9, + 0xa7, 0x2f, 0xae, 0xbb, 0xcc, 0x61, 0xa7, 0x90, 0xa6, 0x26, 0xcc, 0x0d, + 0xa8, 0x1c, 0x9d, 0xae, 0xcb, 0x97, 0xa8, 0xdd, 0x95, 0x66, 0xcb, 0x18, + 0xa9, 0xcd, 0x8d, 0x57, 0xca, 0x8a, 0xab, 0x0a, 0x85, 0xa6, 0xca, 0x09, + 0xac, 0x56, 0x7e, 0x25, 0xc9, 0xa1, 0xad, 0xd7, 0x77, 0x23, 0xc9, 0x28, + 0xaf, 0x58, 0x70, 0x2e, 0xc9, 0x53, 0xb0, 0xa2, 0x68, 0xa1, 0xd0, 0x69, + 0xa0, 0xbd, 0xeb, 0x79, 0xd1, 0x9d, 0xa0, 0x5f, 0xe3, 0x59, 0xd2, 0xa3, + 0xa0, 0x41, 0xdb, 0x7d, 0xd3, 0x7d, 0xa0, 0x30, 0xd3, 0xb3, 0xd4, 0x3b, + 0xa0, 0x1d, 0xcb, 0xc3, 0xd4, 0xc2, 0x9f, 0xfc, 0xc3, 0xa1, 0xd5, 0x17, + 0xa0, 0x03, 0xbb, 0x5d, 0xd5, 0x36, 0xa0, 0x1f, 0xb2, 0xf5, 0xd5, 0x17, + 0xa0, 0x6e, 0xaa, 0x8e, 0xd4, 0xd3, 0xa0, 0xd9, 0xa2, 0x21, 0xd4, 0x93, + 0xa1, 0x88, 0x99, 0xde, 0xd4, 0x51, 0xa2, 0x4e, 0x91, 0xac, 0xd3, 0xfc, + 0xa3, 0x95, 0x89, 0xeb, 0xd3, 0x77, 0xa4, 0xda, 0x82, 0x31, 0xd3, 0x38, + 0xa6, 0x56, 0x7a, 0xee, 0xd2, 0xf4, 0xa7, 0xd5, 0x73, 0xdb, 0xd2, 0xed, + 0xa9, 0x2c, 0x6c, 0x5c, 0xd7, 0xfc, 0x9a, 0x0a, 0xef, 0x25, 0xd9, 0x02, + 0x99, 0xc3, 0xe7, 0x0c, 0xda, 0x04, 0x99, 0x95, 0xdf, 0x25, 0xdb, 0x16, + 0x99, 0x64, 0xd7, 0x47, 0xdc, 0x1d, 0x99, 0x34, 0xcf, 0x6c, 0xdc, 0xae, + 0x99, 0x21, 0xc7, 0x47, 0xdd, 0x34, 0x99, 0x17, 0xbf, 0x22, 0xdd, 0x64, + 0x99, 0x4b, 0xb6, 0xe0, 0xdd, 0x8b, 0x99, 0x89, 0xae, 0xa5, 0xdd, 0x60, + 0x99, 0xe5, 0xa6, 0x82, 0xdd, 0x35, 0x9a, 0x5a, 0x9e, 0x5f, 0xdd, 0x13, + 0x9b, 0x13, 0x96, 0x4d, 0xdc, 0xef, 0x9b, 0xf0, 0x8e, 0x4d, 0xdc, 0xc2, + 0x9d, 0x47, 0x86, 0x90, 0xdc, 0x96, 0x9e, 0xa6, 0x7e, 0xe1, 0xdc, 0x9e, + 0xa0, 0x34, 0x77, 0x7d, 0xdc, 0xbe, 0xa2, 0x0b, 0x70, 0x14, 0xdf, 0x1b, + 0x93, 0x6e, 0xf2, 0xd0, 0xe0, 0x60, 0x93, 0x2d, 0xea, 0x9e, 0xe1, 0x59, + 0x93, 0x04, 0xe2, 0xb5, 0xe2, 0x55, 0x92, 0xcf, 0xda, 0xc7, 0xe3, 0x4a, + 0x92, 0x91, 0xd2, 0xdd, 0xe4, 0x02, 0x92, 0x6f, 0xca, 0xd5, 0xe4, 0xa1, + 0x92, 0x5b, 0xc2, 0xc0, 0xe5, 0x0e, 0x92, 0x7f, 0xba, 0xa8, 0xe5, 0x63, + 0x92, 0xbf, 0xb2, 0x8c, 0xe5, 0x8f, 0x93, 0x03, 0xaa, 0x8e, 0xe5, 0xb6, + 0x93, 0x56, 0xa2, 0xa1, 0xe5, 0xd4, 0x93, 0xf3, 0x9a, 0xb8, 0xe5, 0xf7, + 0x94, 0xb4, 0x92, 0xd2, 0xe6, 0x2b, 0x95, 0xdd, 0x8a, 0xf9, 0xe6, 0x44, + 0x97, 0x27, 0x83, 0x27, 0xe6, 0xdf, 0x98, 0xe5, 0x7b, 0x86, 0xe7, 0xaf, + 0x9a, 0xfd, 0x73, 0x3d, 0xe5, 0x13, 0x8d, 0x6d, 0xf6, 0xbe, 0xe6, 0x5d, + 0x8d, 0x27, 0xee, 0x63, 0xe7, 0x74, 0x8c, 0xe8, 0xe6, 0x67, 0xe8, 0x7e, + 0x8c, 0xa9, 0xde, 0x69, 0xe9, 0x89, 0x8c, 0x5f, 0xd6, 0x56, 0xea, 0x84, + 0x8c, 0x1d, 0xce, 0x4a, 0xeb, 0x50, 0x8b, 0xfe, 0xc6, 0x54, 0xec, 0x09, + 0x8b, 0xec, 0xbe, 0x66, 0xec, 0x83, 0x8c, 0x10, 0xb6, 0x7f, 0xec, 0xf3, + 0x8c, 0x3a, 0xae, 0x9c, 0xed, 0x4d, 0x8c, 0x86, 0xa6, 0xc6, 0xed, 0xaa, + 0x8c, 0xe1, 0x9e, 0xef, 0xee, 0x04, 0x8d, 0xa8, 0x97, 0x1e, 0xee, 0x63, + 0x8e, 0x7a, 0x8f, 0x46, 0xee, 0xd8, 0x8f, 0xb1, 0x87, 0x5e, 0xef, 0x6d, + 0x90, 0xf8, 0x7f, 0x72, 0xf2, 0x5a, 0x93, 0x2d, 0x76, 0xfc, 0xeb, 0x7b, + 0x87, 0x50, 0xfa, 0x32, 0xec, 0xa7, 0x87, 0x21, 0xf2, 0x05, 0xed, 0xc6, + 0x86, 0xe6, 0xea, 0x07, 0xee, 0xc9, 0x86, 0xa6, 0xe2, 0x13, 0xef, 0xe7, + 0x86, 0x4f, 0xd9, 0xeb, 0xf1, 0x24, 0x85, 0xf2, 0xd1, 0xae, 0xf2, 0x29, + 0x85, 0xc0, 0xc9, 0xd8, 0xf3, 0x28, 0x85, 0xaf, 0xc2, 0x2b, 0xf3, 0xfd, + 0x85, 0xbb, 0xba, 0x7f, 0xf4, 0xb8, 0x85, 0xc6, 0xb2, 0xd1, 0xf5, 0x54, + 0x86, 0x0e, 0xab, 0x21, 0xf5, 0xe0, 0x86, 0x6e, 0xa3, 0x6c, 0xf6, 0x7b, + 0x87, 0x06, 0x9b, 0xb8, 0xf7, 0x14, 0x87, 0xbd, 0x94, 0x03, 0xf8, 0x23, + 0x88, 0xb6, 0x8c, 0x4a, 0xf9, 0xf3, 0x8a, 0x1c, 0x84, 0x83, 0xfe, 0x8c, + 0x8b, 0x51, 0x7a, 0xfc, 0xf2, 0x9e, 0x80, 0xad, 0xfd, 0x9a, 0xf3, 0x8b, + 0x80, 0xcb, 0xf5, 0x8c, 0xf4, 0x8e, 0x80, 0xbd, 0xed, 0xa7, 0xf5, 0x8d, + 0x80, 0x79, 0xe5, 0xa6, 0xf6, 0x8c, 0x80, 0x27, 0xdd, 0x99, 0xf7, 0xd1, + 0x7f, 0xa2, 0xd5, 0x52, 0xf9, 0x24, 0x7f, 0x33, 0xcd, 0x70, 0xfa, 0x24, + 0x7f, 0x13, 0xc5, 0xf8, 0xfb, 0x21, 0x7e, 0xfb, 0xbe, 0x85, 0xfb, 0xf9, + 0x7e, 0xf7, 0xb7, 0x03, 0xfc, 0xca, 0x7f, 0x04, 0xaf, 0x7d, 0xfd, 0x74, + 0x7f, 0x67, 0xa7, 0xdd, 0xfe, 0x1c, 0x7f, 0xd0, 0xa0, 0x37, 0xfe, 0xbf, + 0x80, 0x47, 0x98, 0x8d, 0xff, 0x9f, 0x80, 0x93, 0x90, 0xd3, 0xff, 0xff, + 0x80, 0xf1, 0x88, 0xd7, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x63, 0x75, 0x72, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x75, 0x72, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x75, 0x72, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x41, 0x42, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x01, 0x3c, 0x63, 0x75, 0x72, 0x76, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0xff, + 0x63, 0x75, 0x72, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x63, 0x75, 0x72, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb0, 0xba, + 0xff, 0xfe, 0x4f, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xad, 0x17, 0xff, 0xff, 0x52, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x81, 0x00, 0x00, 0x80, 0x81, 0x70, 0x61, 0x72, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, + 0x00, 0x01, 0x9e, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x5e, 0x4c, + 0x00, 0x00, 0x02, 0x30, 0xff, 0xff, 0xd7, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x55, 0x00, 0x01, 0x8f, 0x97, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x08, 0x70, 0x00, 0x00, 0x02, 0x44, 0xff, 0xff, 0xd7, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x01, 0xe4, 0x69, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xf3, 0x4d, 0x00, 0x00, 0x01, 0xdf, + 0xff, 0xff, 0xd7, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x9f, + 0x0f, 0x84, 0xb6, 0xc2, 0x62, 0x96, 0xb7, 0x86, 0x18, 0xd9, 0x87, 0x35, + 0xc7, 0x0a, 0xcf, 0x9c, 0x6f, 0xa0, 0x38, 0xf5, 0x03, 0x90, 0x94, 0x3e, + 0x48, 0x79, 0xba, 0x53, 0xd2, 0x36, 0xf0, 0x7b, 0x1c, 0x6a, 0xf6, 0xd5, + 0xff, 0xff, 0xd3, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x66, 0x66, 0x00, 0x00, 0xf1, 0x63, + 0x00, 0x00, 0x0d, 0x47, 0x00, 0x00, 0x13, 0x90, 0x00, 0x00, 0x0a, 0x0f, + 0x00, 0x00, 0x03, 0x33, 0x00, 0x00, 0x03, 0x33, 0x70, 0x61, 0x72, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x66, 0x66, + 0x00, 0x00, 0xf1, 0x63, 0x00, 0x00, 0x0d, 0x47, 0x00, 0x00, 0x13, 0x90, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x00, 0x03, 0x33, 0x00, 0x00, 0x03, 0x33, + 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x02, 0x66, 0x66, 0x00, 0x00, 0xf1, 0x63, 0x00, 0x00, 0x0d, 0x47, + 0x00, 0x00, 0x13, 0x90, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x00, 0x03, 0x33, + 0x00, 0x00, 0x03, 0x33, 0x6d, 0x42, 0x41, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x50, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x73, 0xec, + 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1b, 0x3f, 0xa2, 0xc4, + 0xaa, 0x74, 0x1f, 0x99, 0xa0, 0x5a, 0xa3, 0xd1, 0x20, 0x6b, 0x9f, 0x0e, + 0xa1, 0x1a, 0x22, 0x7a, 0x9d, 0xa0, 0x9b, 0xa8, 0x25, 0x65, 0x9a, 0xdb, + 0x94, 0xc2, 0x24, 0x38, 0x9c, 0x4c, 0x8f, 0x4e, 0x26, 0xf4, 0x9a, 0xb1, + 0x8a, 0x8a, 0x26, 0xbd, 0x99, 0x7f, 0x88, 0x14, 0x28, 0x73, 0x8e, 0x71, + 0x74, 0x7a, 0x28, 0xe8, 0x8c, 0xaa, 0x66, 0xa3, 0x28, 0xb5, 0x8c, 0x5d, + 0x64, 0x91, 0x28, 0x80, 0x8c, 0x11, 0x62, 0x79, 0x20, 0xee, 0x87, 0xb3, + 0x4a, 0xc5, 0x21, 0x0d, 0x88, 0xc9, 0x27, 0x85, 0x21, 0x95, 0x89, 0x20, + 0x24, 0xad, 0x22, 0x1f, 0x89, 0x6e, 0x22, 0x33, 0x20, 0x61, 0x87, 0x83, + 0x1c, 0xd3, 0x17, 0xca, 0xa1, 0x46, 0xb7, 0xba, 0x1a, 0x79, 0x9f, 0x8e, + 0xa8, 0xfb, 0x20, 0x13, 0x9d, 0x11, 0xa0, 0x5a, 0x21, 0x12, 0x9b, 0x51, + 0x9c, 0xeb, 0x23, 0xf6, 0x99, 0x9e, 0x95, 0x6b, 0x25, 0x92, 0x97, 0x1c, + 0x8f, 0xa2, 0x24, 0x29, 0x98, 0xc6, 0x89, 0x8a, 0x29, 0xe5, 0x86, 0x64, + 0x75, 0x1a, 0x29, 0x99, 0x8a, 0xb9, 0x72, 0xac, 0x27, 0xcf, 0x8b, 0xdc, + 0x64, 0x36, 0x28, 0xd3, 0x8a, 0xd8, 0x62, 0xd8, 0x28, 0x31, 0x89, 0x8c, + 0x5c, 0xf8, 0x21, 0xc5, 0x7f, 0x65, 0x28, 0xea, 0x22, 0xb0, 0x80, 0xd6, + 0x26, 0x1d, 0x22, 0x0f, 0x86, 0xf7, 0x22, 0x4c, 0x22, 0xdf, 0x87, 0x95, + 0x1f, 0xe4, 0x23, 0x9d, 0x88, 0x1c, 0x1d, 0xd9, 0x16, 0xb0, 0x9f, 0x0d, + 0xb7, 0x7a, 0x15, 0xfd, 0x9c, 0xc5, 0xb3, 0x12, 0x1a, 0x31, 0x9a, 0xec, + 0xa5, 0xbb, 0x20, 0xb7, 0x98, 0x65, 0x9b, 0x64, 0x21, 0xfa, 0x95, 0xe7, + 0x96, 0xcd, 0x25, 0x15, 0x93, 0xfc, 0x8d, 0xdb, 0x23, 0x4e, 0x83, 0xc5, + 0x78, 0x74, 0x27, 0xc7, 0x88, 0x45, 0x78, 0x0b, 0x29, 0x16, 0x84, 0x63, + 0x6b, 0xa0, 0x29, 0xe3, 0x84, 0xe1, 0x63, 0x30, 0x29, 0x1d, 0x86, 0x55, + 0x5e, 0x11, 0x23, 0xae, 0x7d, 0xd6, 0x49, 0x0c, 0x23, 0x9f, 0x78, 0x66, + 0x27, 0xb8, 0x23, 0xca, 0x7e, 0x1e, 0x24, 0x44, 0x24, 0x98, 0x80, 0xdf, + 0x21, 0x7d, 0x24, 0x64, 0x85, 0xbd, 0x1d, 0xc8, 0x25, 0x21, 0x86, 0x75, + 0x1b, 0xca, 0x0f, 0xe2, 0x9d, 0xc8, 0xc8, 0x38, 0x12, 0x22, 0x98, 0xc5, + 0xb5, 0x60, 0x16, 0x01, 0x96, 0x94, 0xac, 0x3a, 0x1a, 0x61, 0x90, 0xa4, + 0x9c, 0xa3, 0x1d, 0x7f, 0x8f, 0xca, 0x94, 0x8e, 0x1f, 0x46, 0x81, 0x4c, + 0x7d, 0xeb, 0x23, 0xf4, 0x7e, 0x04, 0x75, 0x79, 0x27, 0x59, 0x7c, 0x13, + 0x6d, 0x1c, 0x29, 0x2b, 0x79, 0x72, 0x63, 0x0b, 0x29, 0x62, 0x73, 0x7b, + 0x51, 0x6f, 0x28, 0xff, 0x76, 0x79, 0x4d, 0x31, 0x25, 0x35, 0x6d, 0xa1, + 0x2a, 0x66, 0x26, 0xec, 0x74, 0x5c, 0x26, 0xcc, 0x25, 0xf6, 0x77, 0x40, + 0x22, 0xe2, 0x26, 0x41, 0x7c, 0xfa, 0x1f, 0xcf, 0x27, 0x09, 0x80, 0xe9, + 0x1c, 0xc1, 0x26, 0xfa, 0x84, 0x87, 0x19, 0x6f, 0x0c, 0x33, 0x94, 0xcb, + 0xc8, 0x74, 0x10, 0x4e, 0x8b, 0x2f, 0xb2, 0xb9, 0x11, 0x81, 0x88, 0x5b, + 0xa5, 0x66, 0x15, 0x19, 0x84, 0xbd, 0x98, 0x3a, 0x1b, 0x8f, 0x7b, 0x05, + 0x85, 0x38, 0x1d, 0x38, 0x73, 0x90, 0x75, 0x64, 0x22, 0x92, 0x73, 0x11, + 0x6e, 0x0c, 0x27, 0x99, 0x6e, 0xd5, 0x63, 0x78, 0x29, 0x4b, 0x68, 0xff, + 0x52, 0xc3, 0x29, 0x25, 0x6d, 0x11, 0x4e, 0xcd, 0x26, 0xf0, 0x66, 0xdb, + 0x36, 0xb3, 0x25, 0x5c, 0x66, 0x0f, 0x25, 0xab, 0x27, 0x4e, 0x6a, 0x99, + 0x22, 0xbe, 0x28, 0xca, 0x72, 0x46, 0x21, 0x75, 0x28, 0xb5, 0x76, 0x30, + 0x1e, 0x4d, 0x29, 0x01, 0x7b, 0xe0, 0x1b, 0x97, 0x57, 0xc9, 0x8b, 0x8e, + 0x15, 0x45, 0x09, 0x38, 0x89, 0x7a, 0xca, 0x5d, 0x0a, 0x15, 0x88, 0xbd, + 0xc0, 0x75, 0x0f, 0xa7, 0x7c, 0x8b, 0xa1, 0xae, 0x14, 0x84, 0x74, 0xf7, + 0x8e, 0x4d, 0x19, 0x90, 0x6f, 0x45, 0x81, 0x83, 0x1a, 0xaf, 0x67, 0xeb, + 0x71, 0x1d, 0x20, 0xe4, 0x64, 0x05, 0x63, 0xdd, 0x27, 0x13, 0x61, 0xd9, + 0x59, 0x7e, 0x28, 0x0f, 0x5e, 0xec, 0x4b, 0xb5, 0x28, 0xa6, 0x58, 0x98, + 0x38, 0xf9, 0x28, 0x4e, 0x58, 0x00, 0x28, 0xab, 0x28, 0x65, 0x5d, 0x09, + 0x23, 0xc8, 0x27, 0x8d, 0x62, 0xe7, 0x1c, 0xfd, 0x29, 0x4f, 0x68, 0x68, + 0x1b, 0xf4, 0x45, 0x94, 0x72, 0x05, 0x19, 0xb9, 0x58, 0xcb, 0x7f, 0xca, + 0x18, 0x4e, 0x69, 0x41, 0x8e, 0x5b, 0x19, 0xba, 0x07, 0x04, 0x7d, 0xae, + 0xcb, 0xa1, 0x06, 0x55, 0x7d, 0xf8, 0xc2, 0xa2, 0x0d, 0xc4, 0x6e, 0xfb, + 0x9e, 0x00, 0x12, 0x22, 0x69, 0xae, 0x8d, 0x76, 0x16, 0xa1, 0x60, 0xd8, + 0x7a, 0xdd, 0x16, 0x7b, 0x59, 0xac, 0x6a, 0x90, 0x1f, 0x2f, 0x54, 0xb7, + 0x5b, 0x33, 0x25, 0x15, 0x51, 0xac, 0x4f, 0x1a, 0x28, 0xc4, 0x4d, 0xe7, + 0x3e, 0x80, 0x2b, 0x08, 0x49, 0xce, 0x2c, 0xe0, 0x2a, 0x85, 0x4e, 0xc6, + 0x27, 0xcd, 0x2c, 0x55, 0x53, 0x00, 0x1d, 0x61, 0x39, 0xff, 0x5a, 0xe6, + 0x17, 0x62, 0x49, 0xdc, 0x67, 0x5a, 0x17, 0xa1, 0x59, 0x3e, 0x72, 0x34, + 0x18, 0xa8, 0x64, 0x29, 0x7c, 0x19, 0x19, 0x03, 0x70, 0x11, 0x87, 0xdf, + 0x19, 0x0f, 0x02, 0x2c, 0x6c, 0x56, 0xce, 0x38, 0x01, 0x6a, 0x6a, 0x88, + 0xc4, 0x64, 0x09, 0xeb, 0x5d, 0x3a, 0x9e, 0x92, 0x0a, 0xa3, 0x57, 0x7f, + 0x88, 0x18, 0x0f, 0x2e, 0x51, 0x79, 0x74, 0x3f, 0x13, 0x34, 0x48, 0x2e, + 0x60, 0x8c, 0x1e, 0x0c, 0x43, 0xe1, 0x53, 0xa3, 0x24, 0x7b, 0x40, 0x79, + 0x44, 0x6e, 0x29, 0x88, 0x3d, 0x2c, 0x35, 0x06, 0x2c, 0xde, 0x3e, 0xee, + 0x2b, 0x51, 0x34, 0x48, 0x45, 0x33, 0x23, 0x54, 0x3e, 0xca, 0x4d, 0xc2, + 0x1c, 0xf9, 0x4b, 0xbd, 0x58, 0x78, 0x19, 0x0a, 0x56, 0x7f, 0x61, 0xdf, + 0x16, 0xc7, 0x63, 0x74, 0x6e, 0x43, 0x18, 0xfc, 0x71, 0x61, 0x79, 0x48, + 0x19, 0xd6, 0x7e, 0xe0, 0x84, 0xe5, 0x1a, 0x09, 0x0c, 0x5d, 0x5b, 0x46, + 0xce, 0x93, 0x03, 0xd4, 0x59, 0xc8, 0xc5, 0x69, 0x04, 0x89, 0x4d, 0x3a, + 0xa0, 0xe7, 0x06, 0xc3, 0x48, 0x98, 0x89, 0x80, 0x0c, 0x83, 0x40, 0xb8, + 0x6f, 0x73, 0x16, 0x3e, 0x39, 0x2b, 0x5d, 0xfe, 0x1b, 0xee, 0x30, 0xe6, + 0x4a, 0x6c, 0x23, 0x93, 0x2e, 0x1c, 0x3a, 0xdc, 0x28, 0xf6, 0x28, 0xf6, + 0x28, 0xf6, 0x37, 0x64, 0x35, 0x31, 0x29, 0x14, 0x42, 0x82, 0x3e, 0xb7, + 0x23, 0xd5, 0x4e, 0x2a, 0x49, 0x49, 0x1f, 0x55, 0x58, 0x96, 0x54, 0x28, + 0x1c, 0x0f, 0x62, 0x73, 0x5d, 0xd3, 0x18, 0x86, 0x6e, 0xa8, 0x69, 0x78, + 0x19, 0xd2, 0x7a, 0xcc, 0x75, 0xa7, 0x1b, 0x53, 0x87, 0x9e, 0x80, 0x01, + 0x1c, 0x37, 0x2b, 0x67, 0x30, 0x11, 0xd1, 0x03, 0x1a, 0x21, 0x33, 0x49, + 0xc8, 0x70, 0x04, 0x3e, 0x3d, 0x75, 0xa6, 0x64, 0x08, 0x4d, 0x36, 0xfa, + 0x89, 0xb6, 0x16, 0xd4, 0x30, 0xd9, 0x73, 0x41, 0x20, 0xf9, 0x2c, 0x2b, + 0x5e, 0x4c, 0x28, 0xc6, 0x27, 0xa3, 0x4c, 0xa4, 0x31, 0x23, 0x25, 0xe0, + 0x3d, 0x9b, 0x38, 0x57, 0x24, 0x9c, 0x2e, 0x71, 0x44, 0x92, 0x2c, 0x59, + 0x29, 0xb6, 0x4f, 0x6a, 0x35, 0xd1, 0x24, 0xdc, 0x5a, 0x9f, 0x3f, 0x36, + 0x21, 0x6e, 0x64, 0xe1, 0x4b, 0x34, 0x1e, 0x2d, 0x6d, 0x8e, 0x56, 0x63, + 0x1a, 0x2b, 0x79, 0x63, 0x62, 0x66, 0x1b, 0x4f, 0x8a, 0xa4, 0x72, 0x7e, + 0x1e, 0x21, 0x91, 0xfd, 0x78, 0xb0, 0x1e, 0x9b, 0x2b, 0x7e, 0x30, 0x00, + 0xd1, 0x09, 0x2b, 0x43, 0x2f, 0xf1, 0xd0, 0xe0, 0x17, 0x13, 0x29, 0xef, + 0xb2, 0x35, 0x18, 0x75, 0x27, 0x84, 0x8f, 0xf3, 0x23, 0xee, 0x25, 0xfb, + 0x77, 0x2e, 0x2d, 0x1c, 0x23, 0x06, 0x61, 0xd7, 0x36, 0xbf, 0x1d, 0xf9, + 0x4f, 0x5c, 0x3e, 0x34, 0x1d, 0x46, 0x3f, 0xb9, 0x45, 0xf9, 0x1c, 0x00, + 0x31, 0x52, 0x51, 0xb5, 0x26, 0x5e, 0x28, 0xaf, 0x5b, 0xa1, 0x2a, 0x1a, + 0x25, 0x98, 0x64, 0xa2, 0x34, 0xde, 0x21, 0x94, 0x6f, 0xa8, 0x40, 0x24, + 0x1e, 0xb0, 0x76, 0xea, 0x4a, 0x6a, 0x1b, 0x17, 0x85, 0xf6, 0x57, 0xfa, + 0x1c, 0x77, 0x92, 0xfe, 0x65, 0x14, 0x1f, 0xd7, 0x96, 0xde, 0x70, 0x60, + 0x1f, 0x5d, 0x2b, 0x95, 0x2f, 0xf1, 0xd1, 0x0f, 0x2b, 0x70, 0x2f, 0xd3, + 0xd0, 0xec, 0x1f, 0x92, 0x24, 0xed, 0xbe, 0x3c, 0x22, 0xe0, 0x1e, 0xb2, + 0x9b, 0x30, 0x34, 0x86, 0x1e, 0xa5, 0x7e, 0x4c, 0x42, 0x0b, 0x1f, 0x72, + 0x6c, 0xf6, 0x4c, 0x54, 0x1f, 0x35, 0x5d, 0x09, 0x52, 0x9b, 0x1c, 0xcb, + 0x4e, 0x21, 0x57, 0x95, 0x1a, 0x8d, 0x3c, 0x9b, 0x5e, 0x45, 0x1d, 0x19, + 0x2d, 0xf9, 0x65, 0x55, 0x23, 0x0e, 0x24, 0xfb, 0x6f, 0xdd, 0x25, 0xad, + 0x21, 0xa2, 0x77, 0x8c, 0x2f, 0x75, 0x1d, 0xf6, 0x86, 0x31, 0x43, 0x06, + 0x1b, 0x84, 0x90, 0x18, 0x48, 0xab, 0x1d, 0x1d, 0x96, 0xe9, 0x54, 0xf8, + 0x1e, 0xa3, 0xa0, 0x4b, 0x61, 0x89, 0x1f, 0xeb, 0x2b, 0xab, 0x2f, 0xe2, + 0xd1, 0x16, 0x2b, 0x9d, 0x2f, 0xb4, 0xd0, 0xfa, 0x27, 0x15, 0x20, 0xa8, + 0xc6, 0xa2, 0x42, 0xec, 0x1b, 0xe3, 0xa5, 0x15, 0x50, 0x81, 0x1e, 0xd8, + 0x8b, 0xfd, 0x5b, 0x78, 0x20, 0x37, 0x7b, 0x94, 0x60, 0x5b, 0x1f, 0xc6, + 0x69, 0x04, 0x66, 0x19, 0x1c, 0x22, 0x5a, 0x6b, 0x68, 0xc5, 0x18, 0x9e, + 0x48, 0xed, 0x6e, 0xef, 0x1a, 0xe1, 0x39, 0x04, 0x73, 0xad, 0x1e, 0xfa, + 0x28, 0xc4, 0x7b, 0xd4, 0x20, 0x7e, 0x22, 0xfe, 0x83, 0xfd, 0x21, 0xf7, + 0x20, 0x01, 0x8b, 0x4a, 0x2a, 0xb6, 0x18, 0x91, 0x95, 0x53, 0x3f, 0xb4, + 0x1a, 0x67, 0x9b, 0x44, 0x4c, 0x52, 0x1d, 0xf7, 0xa5, 0xe9, 0x55, 0x2a, + 0x1e, 0x60, 0x2b, 0xc2, 0x2f, 0xd2, 0xd1, 0x1c, 0x2b, 0xca, 0x2f, 0x95, + 0xd1, 0x06, 0x4d, 0x51, 0x14, 0x5d, 0xc6, 0xae, 0x5f, 0x75, 0x1b, 0x52, + 0xaa, 0xd5, 0x6e, 0x81, 0x1e, 0x42, 0x9a, 0x52, 0x72, 0x67, 0x1f, 0xd4, + 0x86, 0xfc, 0x75, 0x0c, 0x1e, 0x71, 0x78, 0xa7, 0x79, 0x2a, 0x1a, 0xd3, + 0x67, 0xa0, 0x7c, 0x34, 0x18, 0xe8, 0x56, 0x5e, 0x80, 0x62, 0x19, 0x3e, + 0x46, 0x03, 0x84, 0x6e, 0x1a, 0xe4, 0x37, 0x9f, 0x87, 0xee, 0x1e, 0x80, + 0x25, 0xdd, 0x91, 0x74, 0x20, 0x80, 0x22, 0xfb, 0x97, 0xc4, 0x21, 0x10, + 0x1f, 0xd4, 0xa1, 0x04, 0x22, 0xc4, 0x1e, 0x71, 0xa8, 0x99, 0x40, 0xe8, + 0x1b, 0x1f, 0xac, 0x4f, 0x4a, 0xce, 0x1c, 0x74, 0x2c, 0x77, 0x2e, 0xe3, + 0xd0, 0x78, 0x2c, 0x9a, 0x2e, 0x99, 0xd0, 0x69, 0x77, 0xca, 0x16, 0x54, + 0xca, 0x59, 0x83, 0xd5, 0x17, 0x67, 0xc0, 0x4c, 0x85, 0xec, 0x1b, 0x71, + 0xa7, 0x04, 0x88, 0xa3, 0x1c, 0xd5, 0x99, 0x0f, 0x8b, 0xe3, 0x1c, 0x1c, + 0x88, 0x20, 0x90, 0x70, 0x1a, 0x9c, 0x76, 0xef, 0x92, 0x97, 0x1b, 0xd5, + 0x63, 0xd8, 0x95, 0x62, 0x1b, 0x7c, 0x54, 0x65, 0x97, 0x95, 0x1b, 0x75, + 0x44, 0xd0, 0x9b, 0xf8, 0x1c, 0xa9, 0x35, 0xfb, 0x9a, 0xc4, 0x1f, 0x40, + 0x25, 0x2a, 0xa2, 0x7a, 0x1e, 0xc1, 0x21, 0x98, 0xae, 0x38, 0x1f, 0xdc, + 0x1f, 0x5b, 0xc1, 0xb4, 0x24, 0xf1, 0x21, 0xe0, 0xc3, 0xb7, 0x27, 0x6a, + 0x23, 0x1d, 0x2d, 0xc2, 0x36, 0xec, 0xca, 0x1f, 0x81, 0x40, 0x1c, 0xbf, + 0xd2, 0x0a, 0x90, 0x23, 0x1b, 0x9a, 0xcc, 0xfa, 0x9a, 0xcf, 0x1a, 0x87, + 0xc5, 0x30, 0x9a, 0x2c, 0x1c, 0x8c, 0xb4, 0x0b, 0x9f, 0xd9, 0x1d, 0x84, + 0xab, 0x6f, 0xa1, 0xec, 0x1d, 0x08, 0x9a, 0x58, 0x9f, 0xc6, 0x1c, 0x03, + 0x82, 0x9d, 0x9e, 0x80, 0x1c, 0x79, 0x6b, 0x94, 0xa0, 0xd8, 0x1d, 0x54, + 0x5b, 0x92, 0xa2, 0xf6, 0x1c, 0x2f, 0x4a, 0xeb, 0xa2, 0xfd, 0x1b, 0x8e, + 0x3b, 0x96, 0xa6, 0xed, 0x1b, 0x2d, 0x25, 0xd0, 0xbc, 0xc3, 0x1b, 0x27, + 0x21, 0xc1, 0xc3, 0x25, 0x22, 0x1e, 0x23, 0xf9, 0xc4, 0xd6, 0x25, 0x35, + 0x24, 0xb6, 0xc5, 0xe4, 0x27, 0x2a, 0x25, 0x2e, 0x88, 0x14, 0x1f, 0xb6, + 0xd4, 0xe7, 0x97, 0x5f, 0x1f, 0xa7, 0xd1, 0xd6, 0x9f, 0x85, 0x1d, 0x54, + 0xcd, 0xaf, 0xa2, 0xcd, 0x1b, 0x5a, 0xc8, 0xe9, 0xb2, 0xaf, 0x1c, 0xbe, + 0xc6, 0x7a, 0xbd, 0x1e, 0x1d, 0x23, 0xc2, 0x40, 0xb2, 0x50, 0x1e, 0x12, + 0xa5, 0xd8, 0xb5, 0x4d, 0x1d, 0x0d, 0x96, 0x09, 0xbe, 0xbc, 0x1c, 0x02, + 0x81, 0xf2, 0xaf, 0xe4, 0x1d, 0x1b, 0x64, 0x53, 0xaf, 0x13, 0x1c, 0x3d, + 0x53, 0x5d, 0xae, 0x2b, 0x1a, 0xbe, 0x41, 0x99, 0xb3, 0xf2, 0x14, 0xf1, + 0x2f, 0x22, 0xc4, 0x8c, 0x1f, 0x68, 0x26, 0x2f, 0xc5, 0xf1, 0x23, 0x0e, + 0x26, 0x63, 0xc6, 0xcd, 0x25, 0x63, 0x26, 0x86, 0xc7, 0x62, 0x26, 0xff, + 0x26, 0xa0, 0x1b, 0xb9, 0xa4, 0x53, 0xac, 0x88, 0x1f, 0x4f, 0xa1, 0xee, + 0xa5, 0x97, 0x20, 0x28, 0xa0, 0xa5, 0xa2, 0xd2, 0x22, 0x41, 0x9f, 0x2c, + 0x9d, 0x3e, 0x25, 0x46, 0x9c, 0x37, 0x96, 0x17, 0x24, 0x24, 0x9d, 0x80, + 0x90, 0x7b, 0x26, 0xd7, 0x9b, 0xcd, 0x8b, 0x9b, 0x26, 0x9d, 0x9a, 0x97, + 0x89, 0x04, 0x28, 0x2e, 0x8f, 0x59, 0x75, 0x4f, 0x28, 0xdd, 0x8d, 0x45, + 0x67, 0x5e, 0x28, 0xa5, 0x8c, 0xf0, 0x65, 0x0d, 0x28, 0x67, 0x8c, 0x9a, + 0x62, 0xb2, 0x20, 0xea, 0x88, 0xde, 0x4b, 0x41, 0x20, 0xfa, 0x89, 0xd5, + 0x28, 0x02, 0x21, 0x8a, 0x8a, 0x1f, 0x24, 0xef, 0x1f, 0x8d, 0x88, 0xfa, + 0x1f, 0x37, 0x1e, 0x1f, 0x8f, 0xd5, 0x1a, 0xc4, 0x18, 0x89, 0xa3, 0x1a, + 0xb9, 0xc7, 0x1a, 0x78, 0xa1, 0x57, 0xab, 0x73, 0x1f, 0xc5, 0x9e, 0xb8, + 0xa2, 0x3d, 0x20, 0xd2, 0x9c, 0xf7, 0x9e, 0xb0, 0x23, 0xd0, 0x9b, 0x21, + 0x96, 0xed, 0x25, 0x74, 0x98, 0x6c, 0x90, 0xeb, 0x24, 0x1a, 0x99, 0xdb, + 0x8a, 0x9b, 0x27, 0x15, 0x96, 0xfc, 0x86, 0x2d, 0x29, 0x30, 0x8c, 0x23, + 0x73, 0x4e, 0x27, 0xc5, 0x8c, 0x65, 0x64, 0xa0, 0x28, 0xc4, 0x8b, 0x46, + 0x63, 0x26, 0x27, 0xef, 0x89, 0xa7, 0x5b, 0xa7, 0x20, 0xea, 0x86, 0x0f, + 0x47, 0xf4, 0x21, 0xac, 0x85, 0x99, 0x25, 0xad, 0x22, 0x0d, 0x87, 0xf2, + 0x22, 0x6a, 0x22, 0xbc, 0x88, 0x69, 0x1f, 0x9d, 0x23, 0x8b, 0x88, 0xeb, + 0x1d, 0x70, 0x17, 0x8e, 0xa1, 0x1c, 0xb9, 0xcd, 0x16, 0xdf, 0x9f, 0x1b, + 0xb5, 0xb7, 0x19, 0xbc, 0x9c, 0xb3, 0xa8, 0x54, 0x20, 0x69, 0x9a, 0x0d, + 0x9d, 0x55, 0x21, 0xc3, 0x97, 0x78, 0x98, 0x7f, 0x24, 0xfb, 0x95, 0x4b, + 0x8f, 0x2e, 0x23, 0x1b, 0x85, 0x10, 0x79, 0xf1, 0x27, 0xb6, 0x88, 0xed, + 0x78, 0xe9, 0x28, 0xb5, 0x87, 0xdf, 0x6f, 0x9e, 0x28, 0x65, 0x87, 0x10, + 0x63, 0x6c, 0x28, 0xfd, 0x87, 0xf4, 0x5f, 0x80, 0x22, 0x76, 0x7f, 0xd6, + 0x48, 0x8d, 0x22, 0xeb, 0x7b, 0xe2, 0x27, 0xd1, 0x23, 0xa2, 0x7e, 0xcf, + 0x24, 0x40, 0x23, 0xf2, 0x85, 0x3f, 0x20, 0x02, 0x24, 0x64, 0x86, 0x79, + 0x1d, 0x4a, 0x25, 0x33, 0x87, 0x30, 0x1b, 0x2b, 0x10, 0x36, 0xa0, 0x60, + 0xca, 0xad, 0x12, 0x39, 0x9b, 0x40, 0xb8, 0x08, 0x15, 0xdb, 0x98, 0xc3, + 0xae, 0xf5, 0x1a, 0x00, 0x92, 0x9c, 0x9e, 0xe3, 0x1d, 0x7a, 0x92, 0x05, + 0x96, 0xa3, 0x1f, 0x68, 0x86, 0x3f, 0x83, 0x7f, 0x25, 0xdd, 0x7e, 0xec, + 0x78, 0x77, 0x27, 0x55, 0x7d, 0x6f, 0x6e, 0x13, 0x29, 0x25, 0x7b, 0x94, + 0x64, 0xf4, 0x29, 0xc1, 0x77, 0xed, 0x56, 0xac, 0x28, 0x89, 0x77, 0xec, + 0x4c, 0xb2, 0x24, 0x6f, 0x70, 0xc7, 0x2d, 0x33, 0x26, 0xe3, 0x75, 0xe5, + 0x27, 0x00, 0x25, 0xa9, 0x7a, 0x82, 0x22, 0x24, 0x26, 0x66, 0x7d, 0x86, + 0x1f, 0x48, 0x26, 0x7e, 0x84, 0x28, 0x1a, 0x93, 0x27, 0x3f, 0x85, 0x27, + 0x18, 0x8d, 0x0c, 0xb6, 0x97, 0xe1, 0xcb, 0x17, 0x0f, 0xbc, 0x96, 0x3c, + 0xc4, 0x46, 0x11, 0x40, 0x8a, 0x9f, 0xa8, 0xe5, 0x14, 0xdc, 0x87, 0x88, + 0x9a, 0xdd, 0x1b, 0x03, 0x7d, 0xfe, 0x88, 0x08, 0x1e, 0x38, 0x78, 0x3e, + 0x79, 0x82, 0x22, 0x2b, 0x74, 0x5f, 0x6f, 0x80, 0x27, 0x9c, 0x70, 0x55, + 0x64, 0x7c, 0x28, 0xd3, 0x6c, 0x8d, 0x56, 0xb7, 0x29, 0x0e, 0x6d, 0xd6, + 0x4e, 0xe7, 0x26, 0xb4, 0x67, 0xef, 0x36, 0x7a, 0x24, 0xe5, 0x67, 0x9d, + 0x25, 0x76, 0x27, 0xa1, 0x6c, 0xfe, 0x22, 0xb2, 0x29, 0x18, 0x73, 0xf3, + 0x20, 0xe6, 0x28, 0xf0, 0x79, 0x3b, 0x1c, 0xcf, 0x29, 0xc7, 0x7c, 0xbc, + 0x1a, 0x8c, 0x58, 0x35, 0x8e, 0x8a, 0x15, 0x3d, 0x0a, 0xc0, 0x8d, 0x3d, + 0xcd, 0x5f, 0x0a, 0xee, 0x8c, 0xa4, 0xc4, 0xc9, 0x0b, 0x10, 0x86, 0x6c, + 0xaf, 0xe4, 0x12, 0x56, 0x7c, 0x6e, 0x98, 0xa4, 0x19, 0x79, 0x72, 0xce, + 0x85, 0x55, 0x1a, 0x6d, 0x6b, 0xe4, 0x75, 0x53, 0x20, 0x2e, 0x67, 0x43, + 0x67, 0x6d, 0x26, 0xe5, 0x63, 0x89, 0x5a, 0xa7, 0x27, 0xcf, 0x61, 0x3a, + 0x4d, 0xc9, 0x28, 0x89, 0x5c, 0x36, 0x3b, 0xf6, 0x27, 0xe4, 0x59, 0xd2, + 0x28, 0xb8, 0x28, 0x35, 0x5e, 0x1c, 0x22, 0x54, 0x28, 0xa7, 0x64, 0xa6, + 0x1c, 0x39, 0x32, 0x44, 0x6c, 0xfd, 0x1a, 0x4a, 0x47, 0xbb, 0x75, 0x11, + 0x19, 0x35, 0x5a, 0x4d, 0x80, 0xc1, 0x18, 0x3a, 0x6d, 0xcf, 0x93, 0x36, + 0x1a, 0x83, 0x09, 0x8c, 0x81, 0xd7, 0xce, 0xa6, 0x07, 0x1c, 0x81, 0x8e, + 0xc6, 0x20, 0x0d, 0x17, 0x77, 0x3a, 0xab, 0xb8, 0x0f, 0x78, 0x70, 0x11, + 0x95, 0x09, 0x16, 0xa7, 0x65, 0x61, 0x80, 0x51, 0x17, 0x85, 0x5d, 0x42, + 0x6e, 0x55, 0x1e, 0x65, 0x57, 0xdf, 0x5e, 0x98, 0x25, 0x1f, 0x54, 0x4e, + 0x50, 0xf5, 0x27, 0x75, 0x50, 0x94, 0x40, 0xcd, 0x29, 0xaa, 0x4c, 0xce, + 0x2f, 0x42, 0x2a, 0x79, 0x50, 0x2d, 0x25, 0xa2, 0x32, 0x20, 0x55, 0x59, + 0x1b, 0xc2, 0x3f, 0x4d, 0x5e, 0xf8, 0x16, 0x79, 0x4b, 0x91, 0x69, 0xac, + 0x17, 0xa5, 0x5b, 0x0b, 0x75, 0x30, 0x18, 0xdd, 0x67, 0x53, 0x80, 0x94, + 0x18, 0xcc, 0x73, 0xee, 0x8b, 0xe0, 0x19, 0x98, 0x05, 0x1d, 0x6f, 0xf8, + 0xd1, 0xc7, 0x01, 0x36, 0x6e, 0xee, 0xc8, 0x58, 0x07, 0x4c, 0x6b, 0xd1, + 0xb2, 0xdc, 0x0b, 0x86, 0x5e, 0xaf, 0x91, 0x6b, 0x0e, 0xa8, 0x57, 0x07, + 0x7a, 0x3d, 0x12, 0x76, 0x4a, 0xb4, 0x65, 0x21, 0x1c, 0x5e, 0x47, 0x3c, + 0x55, 0xc4, 0x23, 0x69, 0x42, 0xda, 0x46, 0xd0, 0x29, 0x88, 0x40, 0xd3, + 0x38, 0x0a, 0x2d, 0xaf, 0x3f, 0x8e, 0x28, 0x17, 0x36, 0xd8, 0x47, 0x77, + 0x21, 0xd2, 0x41, 0xb9, 0x50, 0x85, 0x1c, 0x61, 0x4d, 0xac, 0x5a, 0xc9, + 0x17, 0xf0, 0x5a, 0x6a, 0x66, 0x7f, 0x18, 0x62, 0x67, 0x36, 0x71, 0xe3, + 0x19, 0x33, 0x74, 0x82, 0x7c, 0xd4, 0x19, 0xe7, 0x7f, 0x75, 0x86, 0x19, + 0x19, 0xeb, 0x0e, 0x95, 0x60, 0x24, 0xd2, 0x11, 0x03, 0x6c, 0x5e, 0x9a, + 0xca, 0x2f, 0x04, 0x57, 0x51, 0x3d, 0xa6, 0xa9, 0x06, 0x64, 0x4c, 0xa1, + 0x8e, 0xc2, 0x09, 0x79, 0x45, 0x3c, 0x73, 0xf3, 0x1c, 0x68, 0x3f, 0xd8, + 0x64, 0xae, 0x26, 0x0c, 0x3b, 0xa6, 0x54, 0xfd, 0x2e, 0x1b, 0x38, 0xf2, + 0x45, 0xbc, 0x34, 0x77, 0x35, 0x6a, 0x35, 0x89, 0x3a, 0x77, 0x37, 0x42, + 0x27, 0x86, 0x45, 0x1c, 0x41, 0x36, 0x22, 0xd5, 0x50, 0x35, 0x4b, 0xf3, + 0x1e, 0x9b, 0x5a, 0xdf, 0x56, 0xd4, 0x1a, 0xf5, 0x65, 0xa3, 0x61, 0x20, + 0x18, 0x8f, 0x72, 0x97, 0x6d, 0xb8, 0x1a, 0x3b, 0x7f, 0xc6, 0x7a, 0xb6, + 0x1b, 0xa2, 0x89, 0xd3, 0x81, 0xd7, 0x1b, 0xae, 0x2b, 0x74, 0x30, 0x1b, + 0xd1, 0x0e, 0x0d, 0xbf, 0x4a, 0x53, 0xcb, 0x10, 0x04, 0x85, 0x43, 0x6a, + 0xaf, 0xd5, 0x02, 0x0a, 0x37, 0x6c, 0x8d, 0xcc, 0x15, 0x9c, 0x36, 0xf9, + 0x75, 0xb8, 0x26, 0x71, 0x33, 0xb3, 0x65, 0xe6, 0x32, 0x85, 0x31, 0x14, + 0x55, 0x98, 0x3a, 0xfe, 0x2f, 0x7f, 0x46, 0xcc, 0x41, 0xb7, 0x2e, 0x7e, + 0x37, 0xd6, 0x47, 0x88, 0x2e, 0x95, 0x28, 0x36, 0x52, 0xa8, 0x39, 0x21, + 0x23, 0xce, 0x5c, 0xf0, 0x43, 0x47, 0x20, 0x47, 0x66, 0xa8, 0x4e, 0x3f, + 0x1d, 0x0a, 0x6f, 0xb2, 0x5a, 0x12, 0x1a, 0x48, 0x7c, 0xff, 0x65, 0x90, + 0x1b, 0x97, 0x8b, 0xa3, 0x73, 0x7d, 0x1e, 0x2f, 0x94, 0xa1, 0x7b, 0xac, + 0x1e, 0xa3, 0x2b, 0x8b, 0x30, 0x0b, 0xd1, 0x14, 0x2b, 0x5c, 0x30, 0x06, + 0xd0, 0xf7, 0x10, 0xbb, 0x30, 0x13, 0xba, 0x2a, 0x12, 0x22, 0x29, 0xf8, + 0x94, 0x08, 0x25, 0x7c, 0x29, 0x73, 0x7b, 0x1c, 0x35, 0x04, 0x28, 0xa7, + 0x69, 0x12, 0x40, 0xe1, 0x27, 0xb2, 0x59, 0x65, 0x48, 0x50, 0x26, 0x2e, + 0x4a, 0x7d, 0x4e, 0xfb, 0x25, 0x21, 0x3a, 0x31, 0x53, 0xb1, 0x24, 0x40, + 0x29, 0x0a, 0x5d, 0x9d, 0x2c, 0x2d, 0x24, 0xbf, 0x67, 0x49, 0x36, 0xe5, + 0x20, 0xa0, 0x70, 0xbc, 0x42, 0x59, 0x1e, 0x1b, 0x7a, 0x01, 0x4e, 0x4c, + 0x1a, 0xf5, 0x89, 0x03, 0x5b, 0xbc, 0x1d, 0x33, 0x95, 0x76, 0x68, 0x7f, + 0x1f, 0xb6, 0x9b, 0x9f, 0x74, 0x30, 0x1f, 0x2a, 0x2b, 0xa0, 0x2f, 0xfb, + 0xd1, 0x1b, 0x2b, 0x89, 0x2f, 0xe7, 0xd1, 0x03, 0x1f, 0x90, 0x25, 0x61, + 0xc1, 0xfe, 0x25, 0x83, 0x1c, 0xe8, 0x9a, 0x4b, 0x37, 0x8e, 0x1d, 0xa6, + 0x81, 0x39, 0x46, 0xd3, 0x1e, 0xcb, 0x6b, 0x65, 0x4f, 0x5c, 0x1e, 0x9b, + 0x5e, 0x26, 0x56, 0xe8, 0x1c, 0xe9, 0x4f, 0x35, 0x5a, 0xd6, 0x1a, 0x6c, + 0x3d, 0xe9, 0x61, 0x38, 0x1c, 0x77, 0x2f, 0x95, 0x68, 0x16, 0x22, 0x39, + 0x24, 0x7d, 0x71, 0x36, 0x27, 0x25, 0x20, 0xe8, 0x7a, 0x3d, 0x31, 0xdc, + 0x1c, 0x97, 0x88, 0x7d, 0x44, 0x7c, 0x1b, 0xdf, 0x94, 0x9f, 0x50, 0xb0, + 0x1e, 0x75, 0x97, 0xe6, 0x57, 0xe0, 0x1e, 0xaa, 0xa1, 0x6e, 0x64, 0xd8, + 0x1f, 0xc4, 0x2b, 0xb7, 0x2f, 0xeb, 0xd1, 0x21, 0x2b, 0xb5, 0x2f, 0xc7, + 0xd1, 0x10, 0x2c, 0x68, 0x1d, 0x58, 0xc7, 0x3d, 0x45, 0x42, 0x1b, 0x7c, + 0xa8, 0xce, 0x53, 0xe4, 0x1e, 0x82, 0x90, 0x96, 0x60, 0x39, 0x21, 0xf4, + 0x7a, 0x10, 0x66, 0x28, 0x1f, 0xdc, 0x6b, 0xde, 0x69, 0x9a, 0x1b, 0x43, + 0x5c, 0x78, 0x6c, 0x43, 0x18, 0x54, 0x4a, 0x75, 0x72, 0x12, 0x1a, 0xa4, + 0x3b, 0x3f, 0x76, 0x87, 0x1c, 0xf7, 0x2b, 0x5e, 0x7c, 0xcd, 0x20, 0x43, + 0x23, 0x1d, 0x86, 0x39, 0x22, 0x43, 0x1f, 0x61, 0x8f, 0x50, 0x2e, 0x7a, + 0x18, 0xe8, 0x96, 0xcf, 0x42, 0xc5, 0x1a, 0xa0, 0x9f, 0xe0, 0x50, 0xbe, + 0x1d, 0xf2, 0xaa, 0x86, 0x55, 0x77, 0x1d, 0x8b, 0x2b, 0xce, 0x2f, 0xdc, + 0xd1, 0x27, 0x2c, 0x83, 0x2e, 0xca, 0xd0, 0x74, 0x53, 0xba, 0x13, 0x51, + 0xcc, 0xa7, 0x69, 0x93, 0x15, 0xf3, 0xb7, 0xe4, 0x71, 0xde, 0x1e, 0x1b, + 0x9b, 0xf1, 0x77, 0x43, 0x20, 0xc4, 0x88, 0x18, 0x7b, 0xf7, 0x1f, 0x99, + 0x78, 0x90, 0x7b, 0xec, 0x19, 0xa4, 0x68, 0x98, 0x80, 0x6c, 0x19, 0x1e, + 0x57, 0xa8, 0x82, 0xb9, 0x19, 0xe1, 0x47, 0xfe, 0x88, 0x2b, 0x1a, 0xa7, + 0x38, 0xd5, 0x8b, 0xc5, 0x1d, 0xa8, 0x27, 0x90, 0x95, 0x00, 0x20, 0x3a, + 0x22, 0xb7, 0x9b, 0x49, 0x21, 0x18, 0x1f, 0x2f, 0xa5, 0x98, 0x25, 0xf5, + 0x1e, 0x62, 0xaa, 0xf4, 0x42, 0xbc, 0x1b, 0x26, 0xad, 0x5f, 0x4e, 0x1f, + 0x1c, 0x50, 0x2a, 0xf7, 0x33, 0x32, 0xd0, 0x1f, 0x6d, 0xeb, 0x1c, 0xc5, + 0xd6, 0x41, 0x7d, 0x7d, 0x19, 0x9a, 0xce, 0x12, 0x89, 0x37, 0x17, 0xe6, + 0xc3, 0x9a, 0x88, 0x21, 0x1b, 0x99, 0xaa, 0x4c, 0x8c, 0x55, 0x1d, 0x39, + 0x9a, 0xd8, 0x93, 0x82, 0x1d, 0x37, 0x8e, 0x70, 0x92, 0xe1, 0x1a, 0xee, + 0x77, 0x7e, 0x96, 0x4b, 0x1c, 0x8c, 0x65, 0xeb, 0x96, 0xba, 0x1b, 0x91, + 0x54, 0xd7, 0x9a, 0xcc, 0x1b, 0x95, 0x45, 0x92, 0x9f, 0x65, 0x1b, 0xf0, + 0x36, 0x1f, 0x9f, 0xe2, 0x1e, 0x3a, 0x25, 0x13, 0xa8, 0xf0, 0x1e, 0x21, + 0x20, 0xf4, 0xbf, 0xcd, 0x22, 0x11, 0x20, 0xd7, 0xc2, 0xf7, 0x26, 0x1c, + 0x22, 0xbe, 0xc4, 0xaf, 0x28, 0x52, 0x23, 0xc8, 0x7b, 0x3b, 0x1f, 0xd5, + 0xd8, 0x7d, 0x85, 0xa3, 0x1e, 0xc6, 0xd4, 0x11, 0x95, 0x6d, 0x1d, 0xd3, + 0xcf, 0x68, 0x9f, 0x3d, 0x1a, 0xdb, 0xc8, 0x3d, 0xaa, 0x73, 0x1c, 0x00, + 0xc2, 0x87, 0xa2, 0xaf, 0x1d, 0xdb, 0xac, 0x3e, 0xa6, 0x4a, 0x1d, 0x50, + 0x9b, 0x8c, 0xa8, 0xde, 0x1b, 0xf6, 0x88, 0x99, 0xa5, 0xbb, 0x1c, 0x9f, + 0x6f, 0x84, 0xa5, 0x82, 0x1d, 0x54, 0x5e, 0x37, 0xa4, 0x9c, 0x1c, 0xb2, + 0x4c, 0x71, 0xab, 0x1c, 0x1a, 0x80, 0x3f, 0x5c, 0xae, 0x01, 0x18, 0x7c, + 0x27, 0xb3, 0xc1, 0xcd, 0x1e, 0x29, 0x23, 0xdf, 0xc4, 0x68, 0x23, 0x47, + 0x24, 0xd8, 0xc5, 0xcf, 0x26, 0x1b, 0x25, 0x61, 0xc6, 0xae, 0x27, 0xe5, + 0x25, 0xba, 0x8d, 0x04, 0x21, 0x40, 0xd6, 0x05, 0x99, 0x3d, 0x21, 0x05, + 0xd3, 0x91, 0xa3, 0xd0, 0x1e, 0xd0, 0xcf, 0xe0, 0xa7, 0xa5, 0x1a, 0xd3, + 0xcc, 0xaa, 0xb4, 0xb5, 0x1c, 0xd7, 0xc8, 0x7a, 0xc1, 0x8a, 0x1d, 0x7a, + 0xc3, 0xef, 0xc3, 0x6d, 0x1e, 0x7d, 0xb2, 0xfb, 0xc3, 0x1d, 0x1d, 0xbc, + 0x9d, 0xfc, 0xc1, 0xe2, 0x1c, 0x2f, 0x83, 0x92, 0xc0, 0x03, 0x1c, 0x2b, + 0x70, 0x40, 0xb0, 0xc5, 0x1c, 0x57, 0x54, 0x10, 0xaf, 0xf4, 0x1a, 0xc4, + 0x42, 0x53, 0xbd, 0x1f, 0x11, 0x99, 0x27, 0x36, 0xc5, 0xd3, 0x20, 0x8f, + 0x27, 0x10, 0xc6, 0xeb, 0x23, 0xf4, 0x27, 0x0f, 0xc7, 0x98, 0x26, 0x1e, + 0x27, 0x12, 0xc8, 0x0d, 0x27, 0x9d, 0x27, 0x16, 0x1c, 0x37, 0xa5, 0xe4, + 0xae, 0x9d, 0x1f, 0x13, 0xa3, 0xb0, 0xa7, 0x8d, 0x1f, 0xdc, 0xa2, 0x6d, + 0xa4, 0xbe, 0x21, 0xfe, 0xa0, 0xee, 0x9f, 0x09, 0x25, 0x21, 0x9d, 0xc6, + 0x97, 0x9a, 0x24, 0x0d, 0x9e, 0xe5, 0x91, 0xd7, 0x26, 0xb3, 0x9d, 0x1a, + 0x8c, 0xdc, 0x26, 0x76, 0x9b, 0xe4, 0x8a, 0x21, 0x28, 0x58, 0x91, 0xb6, + 0x77, 0x12, 0x2a, 0xe6, 0x8a, 0xfd, 0x67, 0x60, 0x28, 0x8f, 0x8d, 0xaa, + 0x65, 0xab, 0x22, 0xcf, 0x8d, 0x2f, 0x5f, 0xe1, 0x23, 0x2e, 0x9a, 0x63, + 0x5c, 0x55, 0x20, 0xe3, 0x8b, 0x09, 0x28, 0x92, 0x1e, 0x9e, 0x8a, 0xa8, + 0x22, 0x79, 0x1d, 0x4e, 0x90, 0xcb, 0x1d, 0xcc, 0x1d, 0xc0, 0x91, 0x3f, + 0x1a, 0x4a, 0x19, 0x4a, 0xa4, 0xef, 0xbb, 0xd0, 0x1b, 0x1d, 0xa3, 0x59, + 0xae, 0x01, 0x1f, 0x6a, 0xa0, 0x9b, 0xa4, 0x63, 0x20, 0x85, 0x9e, 0xda, + 0xa0, 0xbb, 0x23, 0x9a, 0x9c, 0xe4, 0x98, 0xb4, 0x25, 0x50, 0x99, 0xf9, + 0x92, 0x6d, 0x24, 0x05, 0x9b, 0x27, 0x8b, 0xe2, 0x26, 0xf6, 0x98, 0x23, + 0x87, 0x34, 0x28, 0xc2, 0x8d, 0x8b, 0x74, 0x2a, 0x28, 0xfd, 0x8c, 0x4a, + 0x66, 0xa8, 0x28, 0xb1, 0x8b, 0xd8, 0x63, 0x90, 0x27, 0xa5, 0x89, 0xfb, + 0x5a, 0x79, 0x20, 0xab, 0x88, 0x32, 0x46, 0xdf, 0x21, 0x49, 0x88, 0xa1, + 0x26, 0x30, 0x22, 0x09, 0x89, 0x19, 0x22, 0x8d, 0x20, 0xb7, 0x86, 0x9f, + 0x1c, 0x74, 0x1f, 0x78, 0x8d, 0xdd, 0x17, 0x37, 0x18, 0x6b, 0xa3, 0x2e, + 0xbc, 0x1e, 0x17, 0xd9, 0xa1, 0x7d, 0xb8, 0x67, 0x19, 0x4f, 0x9e, 0xd3, + 0xab, 0x51, 0x20, 0x0a, 0x9b, 0xfe, 0x9f, 0x9a, 0x21, 0x80, 0x99, 0x59, + 0x9a, 0x83, 0x24, 0xd8, 0x96, 0xe2, 0x90, 0xc9, 0x27, 0x78, 0x8e, 0xa3, + 0x84, 0xe5, 0x27, 0xa1, 0x89, 0xd5, 0x7a, 0x18, 0x28, 0x97, 0x89, 0x4e, + 0x71, 0x28, 0x28, 0x49, 0x88, 0xbc, 0x65, 0x09, 0x28, 0xdf, 0x89, 0x52, + 0x60, 0x9f, 0x21, 0x1d, 0x81, 0xe4, 0x48, 0x18, 0x22, 0x2c, 0x7e, 0xd3, + 0x28, 0x15, 0x23, 0x52, 0x81, 0x74, 0x24, 0x03, 0x23, 0x60, 0x86, 0x7f, + 0x1f, 0x7f, 0x24, 0x66, 0x87, 0x5b, 0x1c, 0xb1, 0x25, 0x48, 0x88, 0x10, + 0x1a, 0x6e, 0x10, 0x6d, 0xa2, 0x97, 0xcd, 0x67, 0x12, 0x50, 0x9d, 0xf4, + 0xba, 0xf9, 0x15, 0xf9, 0x9b, 0x62, 0xb2, 0x28, 0x17, 0x69, 0x97, 0xec, + 0xa6, 0x96, 0x1d, 0x22, 0x94, 0xfd, 0x99, 0xd7, 0x23, 0x36, 0x8f, 0x75, + 0x8e, 0xae, 0x22, 0xee, 0x85, 0x47, 0x7b, 0x8e, 0x27, 0x6c, 0x81, 0xb2, + 0x73, 0x9e, 0x29, 0x08, 0x7e, 0x37, 0x67, 0xe1, 0x29, 0xa9, 0x7a, 0xa0, + 0x59, 0x67, 0x28, 0x2a, 0x79, 0x6d, 0x4c, 0x71, 0x24, 0x2f, 0x72, 0xa4, + 0x2d, 0xa0, 0x24, 0xcd, 0x75, 0x8a, 0x25, 0xff, 0x25, 0x68, 0x7d, 0x0d, + 0x21, 0x66, 0x26, 0x8d, 0x80, 0xf3, 0x1d, 0x9a, 0x26, 0xc3, 0x84, 0xe1, + 0x19, 0x9d, 0x27, 0xbd, 0x86, 0x1e, 0x17, 0xf3, 0x0e, 0x2e, 0x9a, 0x10, + 0xcd, 0xe2, 0x0f, 0xff, 0x99, 0xe2, 0xc7, 0x72, 0x12, 0x21, 0x94, 0x63, + 0xb5, 0x47, 0x14, 0x12, 0x89, 0xe0, 0x9e, 0x33, 0x1c, 0x09, 0x84, 0xb8, + 0x92, 0x0e, 0x1e, 0x2c, 0x7d, 0x67, 0x7f, 0x5d, 0x21, 0xdd, 0x77, 0xb5, + 0x74, 0x02, 0x27, 0x0b, 0x75, 0x09, 0x69, 0xff, 0x28, 0xb3, 0x71, 0xb7, + 0x5d, 0x16, 0x29, 0xc1, 0x6e, 0xdc, 0x4f, 0xdd, 0x26, 0x58, 0x6a, 0x6b, + 0x38, 0xa4, 0x25, 0x31, 0x69, 0x87, 0x25, 0xff, 0x28, 0x04, 0x6f, 0x56, + 0x22, 0x7b, 0x28, 0xca, 0x73, 0xd8, 0x1e, 0xec, 0x29, 0x62, 0x7b, 0x6e, + 0x1b, 0x2e, 0x2d, 0xe8, 0x81, 0x9a, 0x1a, 0x96, 0x5a, 0xf9, 0x90, 0x3c, + 0x15, 0x50, 0x0e, 0xc3, 0x90, 0x16, 0xce, 0xf4, 0x0b, 0x9e, 0x90, 0x4d, + 0xc8, 0x22, 0x0a, 0xe0, 0x89, 0x6c, 0xb3, 0x65, 0x13, 0xeb, 0x7f, 0x03, + 0x9c, 0x11, 0x19, 0x93, 0x76, 0xa1, 0x88, 0xf9, 0x1a, 0x50, 0x70, 0x4f, + 0x7a, 0x58, 0x1f, 0x0f, 0x6a, 0x92, 0x6a, 0xe0, 0x26, 0x86, 0x65, 0x90, + 0x5d, 0x09, 0x27, 0x96, 0x63, 0x62, 0x4f, 0xa4, 0x27, 0xbc, 0x5e, 0xaf, + 0x3d, 0x7f, 0x28, 0x30, 0x5c, 0xb7, 0x2a, 0xfc, 0x27, 0xc9, 0x5f, 0x52, + 0x1f, 0xbc, 0x2c, 0x27, 0x66, 0x7c, 0x1a, 0x61, 0x36, 0xc8, 0x6f, 0xae, + 0x19, 0x1a, 0x4d, 0xbc, 0x7a, 0x2b, 0x18, 0x9a, 0x5d, 0xcb, 0x80, 0xc9, + 0x16, 0xfe, 0x6e, 0xab, 0x94, 0x34, 0x1a, 0xa8, 0x0c, 0x7a, 0x86, 0x01, + 0xd1, 0xa3, 0x08, 0xbd, 0x84, 0x37, 0xc9, 0xc9, 0x09, 0x5b, 0x7f, 0x6d, + 0xb7, 0x89, 0x0e, 0xa2, 0x74, 0xb5, 0x9a, 0xa6, 0x14, 0x7b, 0x6a, 0x6d, + 0x83, 0xf9, 0x17, 0xd8, 0x61, 0x1b, 0x72, 0x49, 0x1e, 0x55, 0x5b, 0x92, + 0x62, 0xa8, 0x25, 0x2a, 0x58, 0x4e, 0x53, 0xec, 0x28, 0x25, 0x53, 0xa0, + 0x44, 0x10, 0x29, 0x8f, 0x50, 0x8a, 0x32, 0x3c, 0x2b, 0x8d, 0x4f, 0xdb, + 0x1f, 0xeb, 0x35, 0x11, 0x57, 0x7c, 0x1a, 0x0c, 0x41, 0xed, 0x61, 0xb9, + 0x16, 0x8c, 0x4d, 0x0d, 0x6b, 0xdd, 0x17, 0xab, 0x5e, 0x1d, 0x78, 0x53, + 0x18, 0xfc, 0x69, 0x69, 0x82, 0x56, 0x18, 0xdf, 0x79, 0x54, 0x91, 0xb5, + 0x1a, 0x69, 0x08, 0x84, 0x73, 0x1a, 0xd5, 0x42, 0x01, 0x90, 0x73, 0xcf, + 0xcd, 0x24, 0x07, 0x35, 0x6f, 0xed, 0xb7, 0x5d, 0x0a, 0x6a, 0x65, 0xce, + 0x9b, 0x73, 0x0e, 0x4d, 0x5c, 0x0a, 0x80, 0x4b, 0x1b, 0xe3, 0x54, 0x29, + 0x6e, 0x67, 0x26, 0x4f, 0x50, 0x76, 0x5f, 0xbd, 0x2c, 0xfa, 0x4d, 0x0f, + 0x50, 0xc6, 0x32, 0x61, 0x4a, 0x0b, 0x41, 0x03, 0x35, 0xd9, 0x48, 0x89, + 0x30, 0x32, 0x39, 0x6f, 0x49, 0x69, 0x1f, 0xa7, 0x44, 0xc5, 0x53, 0x74, + 0x1b, 0x10, 0x50, 0x56, 0x5d, 0x8a, 0x16, 0xa8, 0x5d, 0xa5, 0x69, 0xf5, + 0x18, 0x89, 0x6a, 0x40, 0x75, 0x4b, 0x19, 0x64, 0x76, 0x0f, 0x7f, 0x17, + 0x19, 0xeb, 0x83, 0x0e, 0x8b, 0x2b, 0x1a, 0xbc, 0x10, 0xf2, 0x65, 0x16, + 0xd5, 0xab, 0x08, 0x30, 0x65, 0x88, 0xce, 0x97, 0x01, 0xcd, 0x60, 0x06, + 0xba, 0x83, 0x07, 0x00, 0x54, 0x38, 0x98, 0xc5, 0x17, 0x16, 0x4e, 0x30, + 0x7f, 0x0a, 0x24, 0xc2, 0x49, 0xe9, 0x6d, 0xda, 0x30, 0x13, 0x45, 0x79, + 0x5e, 0x15, 0x37, 0xb8, 0x42, 0x0b, 0x4e, 0xe7, 0x3e, 0x87, 0x3f, 0x88, + 0x3f, 0xa5, 0x43, 0x3b, 0x41, 0x4f, 0x30, 0x22, 0x47, 0x98, 0x43, 0x78, + 0x20, 0xd6, 0x52, 0x68, 0x4e, 0x9c, 0x1d, 0x89, 0x5d, 0x1a, 0x59, 0x99, + 0x19, 0xc0, 0x68, 0xc2, 0x65, 0x44, 0x19, 0x4f, 0x75, 0xd0, 0x71, 0x1d, + 0x1a, 0x72, 0x82, 0x02, 0x7c, 0x3f, 0x1b, 0xd0, 0x8c, 0x76, 0x85, 0x99, + 0x1c, 0x18, 0x2b, 0x80, 0x30, 0x25, 0xd1, 0x1a, 0x11, 0x61, 0x51, 0xeb, + 0xd0, 0x5d, 0x03, 0x60, 0x4c, 0x23, 0xbd, 0xb9, 0x0e, 0x42, 0x41, 0xfd, + 0x97, 0xf2, 0x23, 0x05, 0x41, 0x2c, 0x80, 0x98, 0x32, 0x28, 0x3e, 0x19, + 0x6e, 0x37, 0x3c, 0x88, 0x3a, 0xb1, 0x5e, 0x33, 0x44, 0xed, 0x38, 0xb1, + 0x4f, 0x86, 0x4b, 0x1e, 0x37, 0xb6, 0x40, 0x26, 0x50, 0x6e, 0x38, 0x69, + 0x30, 0xe4, 0x54, 0xdf, 0x3a, 0xc2, 0x22, 0x6b, 0x5e, 0xf8, 0x46, 0x26, + 0x1f, 0x67, 0x68, 0x98, 0x51, 0x95, 0x1b, 0xf8, 0x73, 0x0d, 0x5d, 0x49, + 0x1a, 0xa9, 0x80, 0xd8, 0x69, 0xe8, 0x1c, 0x89, 0x8e, 0x33, 0x76, 0x5d, + 0x1e, 0x60, 0x96, 0xba, 0x7e, 0x81, 0x1e, 0x9b, 0x31, 0xb1, 0x2e, 0x91, + 0xd0, 0x71, 0x2b, 0x75, 0x30, 0x19, 0xd1, 0x0e, 0x09, 0x40, 0x35, 0x83, + 0xbe, 0xc1, 0x1d, 0x50, 0x34, 0xeb, 0xa0, 0xff, 0x31, 0xfc, 0x33, 0xc8, + 0x82, 0xfb, 0x41, 0xa1, 0x32, 0xb0, 0x70, 0x87, 0x4c, 0xb2, 0x31, 0x36, + 0x61, 0x96, 0x52, 0x59, 0x2f, 0xb2, 0x53, 0xd3, 0x57, 0x56, 0x2e, 0x62, + 0x43, 0x38, 0x5c, 0x52, 0x2d, 0xb4, 0x32, 0x77, 0x60, 0xa1, 0x2f, 0x10, + 0x23, 0x05, 0x69, 0x96, 0x39, 0x56, 0x1f, 0xde, 0x73, 0x9d, 0x45, 0xcb, + 0x1c, 0x8e, 0x7e, 0x17, 0x52, 0x90, 0x1b, 0x7a, 0x8d, 0x08, 0x62, 0x4b, + 0x1f, 0x51, 0x96, 0xcd, 0x6d, 0xc5, 0x20, 0x4e, 0x9e, 0x94, 0x74, 0xea, + 0x1f, 0x1e, 0x2b, 0xae, 0x30, 0x04, 0xd1, 0x25, 0x2b, 0xa2, 0x2f, 0xfb, + 0xd1, 0x1b, 0x21, 0x99, 0x25, 0x6d, 0xc4, 0x22, 0x33, 0x3c, 0x26, 0x14, + 0xa8, 0xc3, 0x44, 0x65, 0x28, 0x1e, 0x8c, 0xb7, 0x50, 0xf3, 0x29, 0x07, + 0x78, 0x2f, 0x59, 0x56, 0x28, 0x38, 0x67, 0xcb, 0x5f, 0x2d, 0x26, 0x01, + 0x58, 0x27, 0x63, 0xd9, 0x23, 0xbb, 0x47, 0x92, 0x67, 0x5e, 0x21, 0x62, + 0x35, 0x11, 0x6a, 0xa6, 0x20, 0x43, 0x23, 0xf9, 0x73, 0x4d, 0x29, 0x7b, + 0x1f, 0x98, 0x7c, 0xec, 0x35, 0x1a, 0x1b, 0x78, 0x89, 0xa1, 0x45, 0xc3, + 0x1c, 0x10, 0x95, 0xc2, 0x53, 0xe8, 0x1e, 0x97, 0x9d, 0xd3, 0x5f, 0x2c, + 0x20, 0x56, 0xa8, 0xa2, 0x6c, 0x75, 0x1d, 0xa5, 0x2b, 0xc4, 0x2f, 0xf6, + 0xd1, 0x2d, 0x2b, 0xce, 0x2f, 0xdc, 0xd1, 0x27, 0x39, 0x29, 0x16, 0x34, + 0xcb, 0x7c, 0x49, 0x60, 0x1a, 0x18, 0xaf, 0xea, 0x5a, 0x12, 0x1d, 0xd5, + 0x91, 0xfb, 0x62, 0xdf, 0x20, 0xbb, 0x7e, 0xcd, 0x69, 0x6b, 0x1f, 0xa7, + 0x6d, 0xfc, 0x6c, 0x06, 0x1c, 0x84, 0x5d, 0x2d, 0x70, 0xb4, 0x1a, 0x3f, + 0x4c, 0xf8, 0x75, 0x2d, 0x1a, 0x6c, 0x3c, 0xa4, 0x7a, 0xb6, 0x1d, 0x54, + 0x2e, 0xa8, 0x7f, 0xd7, 0x20, 0x54, 0x23, 0x27, 0x88, 0x12, 0x24, 0x3a, + 0x1e, 0x46, 0x92, 0x5e, 0x33, 0x50, 0x19, 0x75, 0x99, 0xf0, 0x44, 0xdd, + 0x1a, 0xcf, 0xa6, 0x5b, 0x53, 0xd1, 0x1e, 0x2a, 0xac, 0x02, 0x59, 0x97, + 0x1d, 0x9e, 0x2b, 0x83, 0x31, 0xa4, 0xcf, 0xe7, 0x2c, 0x9b, 0x2e, 0xdd, + 0xd0, 0x8b, 0x63, 0x98, 0x19, 0x07, 0xd2, 0x77, 0x71, 0x09, 0x14, 0x64, + 0xbe, 0x3a, 0x76, 0x7b, 0x1a, 0xea, 0xa1, 0xff, 0x7d, 0x62, 0x1c, 0xd2, + 0x8f, 0x7c, 0x7f, 0x60, 0x1b, 0xbb, 0x7c, 0x74, 0x80, 0x70, 0x19, 0x0e, + 0x6a, 0x95, 0x83, 0xed, 0x19, 0x45, 0x59, 0xdf, 0x86, 0xc0, 0x1a, 0x3b, + 0x49, 0xc4, 0x8b, 0x9a, 0x1a, 0x68, 0x3a, 0x39, 0x8f, 0x2c, 0x1c, 0xe2, + 0x29, 0x19, 0x97, 0xf0, 0x20, 0x0d, 0x22, 0x76, 0xa0, 0x71, 0x21, 0xa7, + 0x1e, 0xdb, 0xaa, 0xd4, 0x2a, 0x89, 0x1e, 0x0e, 0xad, 0x5c, 0x47, 0x44, + 0x1c, 0xb1, 0xae, 0xb8, 0x51, 0x99, 0x1c, 0x68, 0x2c, 0x90, 0x2e, 0xf6, + 0xd0, 0x91, 0x75, 0xb2, 0x1f, 0x88, 0xd8, 0xf3, 0x82, 0x1c, 0x1c, 0xbd, + 0xd1, 0xcc, 0x8f, 0x17, 0x18, 0x5b, 0xc7, 0xee, 0x92, 0x54, 0x1b, 0x3c, + 0xb6, 0x12, 0x99, 0x12, 0x1e, 0x8f, 0xa5, 0xc5, 0x98, 0xec, 0x1e, 0x08, + 0x92, 0x38, 0x98, 0xec, 0x1b, 0xf8, 0x7c, 0x19, 0x98, 0x4f, 0x1c, 0xed, + 0x67, 0x0c, 0x9a, 0x19, 0x1c, 0x23, 0x56, 0x6c, 0x9d, 0x0e, 0x1b, 0xa8, + 0x45, 0x94, 0xa0, 0xe5, 0x1b, 0x8f, 0x36, 0x7a, 0xa3, 0xc8, 0x1d, 0x5c, + 0x25, 0x39, 0xae, 0x88, 0x1d, 0x39, 0x20, 0x2a, 0xc1, 0x98, 0x23, 0xb9, + 0x22, 0x13, 0xc4, 0x3a, 0x27, 0x46, 0x23, 0x9d, 0xc5, 0xa7, 0x29, 0x38, + 0x24, 0x73, 0x80, 0xbf, 0x21, 0xb0, 0xd9, 0xe7, 0x8b, 0x1f, 0x20, 0xd4, + 0xd5, 0xd9, 0x98, 0x41, 0x1f, 0xe2, 0xd2, 0x08, 0xa2, 0x91, 0x1b, 0xb7, + 0xcb, 0xe1, 0xae, 0xd8, 0x1c, 0x87, 0xc5, 0x44, 0xaf, 0x67, 0x1d, 0xe2, + 0xb7, 0x5f, 0xaf, 0x2f, 0x1d, 0xd9, 0xa2, 0xdf, 0xaf, 0x54, 0x1c, 0x63, + 0x8d, 0x49, 0xae, 0x64, 0x1c, 0x9f, 0x75, 0xa8, 0xae, 0x47, 0x1c, 0xe8, + 0x61, 0x50, 0xad, 0xd0, 0x1b, 0xbf, 0x50, 0x09, 0xad, 0x38, 0x1a, 0x81, + 0x40, 0x13, 0xb8, 0x98, 0x13, 0x68, 0x27, 0x6e, 0xc3, 0x9b, 0x1f, 0xcd, + 0x25, 0x1f, 0xc5, 0xac, 0x24, 0x71, 0x25, 0xb8, 0xc6, 0xc7, 0x27, 0x01, + 0x26, 0x0e, 0xc7, 0x78, 0x28, 0xa0, 0x26, 0x45, 0x91, 0x11, 0x23, 0x37, + 0xd8, 0x2f, 0x9b, 0x1a, 0x22, 0x66, 0xd5, 0x48, 0xa6, 0x62, 0x20, 0x65, + 0xd2, 0x22, 0xb5, 0x06, 0x1c, 0xce, 0xcf, 0x3b, 0xb7, 0xfb, 0x1d, 0x33, + 0xcb, 0x39, 0xc6, 0x1f, 0x1d, 0xd9, 0xc5, 0xe1, 0xc5, 0x08, 0x1e, 0xa5, + 0xb3, 0xdb, 0xc4, 0xd3, 0x1d, 0xd5, 0x9e, 0xd8, 0xc3, 0x8f, 0x1c, 0x46, + 0x84, 0x2a, 0xc2, 0x39, 0x1c, 0x2a, 0x71, 0x19, 0xc1, 0xe5, 0x1a, 0x48, + 0x5d, 0x63, 0xc2, 0x51, 0x18, 0xf9, 0x4d, 0x29, 0xc3, 0x2b, 0x14, 0xda, + 0x30, 0x50, 0xc7, 0x18, 0x21, 0xb8, 0x27, 0xef, 0xc7, 0xe4, 0x24, 0xd8, + 0x27, 0xba, 0xc8, 0x62, 0x26, 0xd9, 0x27, 0x9e, 0xc8, 0xb7, 0x28, 0x3b, + 0x27, 0x8c, 0x1c, 0xb8, 0xa7, 0x78, 0xb0, 0xb4, 0x1f, 0x73, 0xa5, 0x93, + 0xa9, 0x85, 0x1f, 0x85, 0xa4, 0x70, 0xa6, 0xeb, 0x21, 0xb0, 0xa2, 0xee, + 0xa1, 0x14, 0x24, 0xf7, 0x9f, 0x91, 0x99, 0x59, 0x23, 0xf0, 0xa0, 0x84, + 0x93, 0x6c, 0x26, 0x86, 0x9e, 0xa7, 0x8e, 0x59, 0x26, 0x76, 0x9d, 0xcc, + 0x8b, 0xbb, 0x28, 0x7e, 0x94, 0x19, 0x78, 0xd8, 0x28, 0xc8, 0x94, 0xe4, + 0x70, 0x8e, 0x28, 0x74, 0x8e, 0xa3, 0x66, 0x7e, 0x26, 0xa8, 0x9b, 0x16, + 0x64, 0x05, 0x23, 0xa2, 0x9c, 0x6b, 0x5d, 0x7b, 0x1d, 0x9e, 0x8c, 0x9e, + 0x27, 0x07, 0x1c, 0x62, 0x92, 0x06, 0x21, 0xd2, 0x1c, 0xd2, 0x92, 0x7a, + 0x1d, 0x78, 0x1d, 0x4b, 0x97, 0xe1, 0x1a, 0x37, 0x1a, 0x0c, 0xa6, 0xc3, + 0xbd, 0xd9, 0x1b, 0xc9, 0xa5, 0x5d, 0xb0, 0x8f, 0x1f, 0x03, 0xa2, 0xc4, + 0xa6, 0xd8, 0x20, 0x2a, 0xa1, 0x0d, 0xa3, 0x16, 0x23, 0x4c, 0x9e, 0xfe, + 0x9a, 0xd8, 0x25, 0x26, 0x9b, 0xd4, 0x94, 0x3d, 0x23, 0xec, 0x9c, 0xc0, + 0x8d, 0x71, 0x26, 0xd0, 0x99, 0x96, 0x88, 0x7f, 0x28, 0x67, 0x8e, 0xb6, + 0x75, 0x5c, 0x28, 0xf0, 0x8d, 0x2d, 0x67, 0xd4, 0x28, 0x97, 0x8c, 0xa6, + 0x64, 0x21, 0x21, 0x22, 0x8c, 0xb7, 0x57, 0xd2, 0x20, 0x67, 0x8b, 0x77, + 0x45, 0x00, 0x21, 0x33, 0x8a, 0x12, 0x26, 0xbb, 0x1f, 0xa7, 0x88, 0x56, + 0x1f, 0xd5, 0x1e, 0x5a, 0x8f, 0x86, 0x1a, 0x0f, 0x1f, 0xb3, 0x90, 0x9f, + 0x17, 0x4a, 0x19, 0x4a, 0xa5, 0x3f, 0xbe, 0x6f, 0x18, 0xd5, 0xa3, 0xe3, + 0xbb, 0x15, 0x1a, 0x40, 0xa1, 0x9c, 0xae, 0xb2, 0x1f, 0x9a, 0x9e, 0x4f, + 0xa2, 0x4b, 0x21, 0x2b, 0x9b, 0x9f, 0x9c, 0xf2, 0x24, 0xaa, 0x98, 0xdb, + 0x92, 0xc6, 0x25, 0x06, 0x96, 0x1c, 0x8c, 0x65, 0x27, 0x7f, 0x8b, 0x23, + 0x7b, 0xcb, 0x2a, 0x59, 0x87, 0xa6, 0x72, 0x49, 0x28, 0x37, 0x89, 0xde, + 0x65, 0xc3, 0x28, 0xc8, 0x89, 0xb1, 0x60, 0x9b, 0x20, 0xe5, 0x83, 0xa1, + 0x48, 0xa9, 0x21, 0xac, 0x80, 0x0a, 0x28, 0xc8, 0x22, 0x59, 0x86, 0x0d, + 0x23, 0x27, 0x23, 0x3c, 0x87, 0x9e, 0x1f, 0x07, 0x24, 0x64, 0x88, 0x71, + 0x1b, 0xf4, 0x21, 0xa9, 0x8a, 0xc8, 0x12, 0x3f, 0x11, 0x93, 0xa4, 0xf3, + 0xd0, 0x2a, 0x12, 0xb8, 0xa0, 0xef, 0xbe, 0x2c, 0x16, 0x86, 0x9e, 0x74, + 0xb5, 0xca, 0x16, 0xdd, 0x9a, 0xb1, 0xaa, 0x39, 0x1c, 0xe0, 0x97, 0x61, + 0x9c, 0x83, 0x23, 0x0a, 0x91, 0xb6, 0x91, 0x17, 0x23, 0x47, 0x88, 0x25, + 0x7e, 0x7f, 0x26, 0x2a, 0x80, 0x5f, 0x72, 0xe0, 0x28, 0xee, 0x81, 0x2e, + 0x6b, 0x1e, 0x2a, 0x1e, 0x7f, 0x14, 0x5e, 0xcf, 0x27, 0xcd, 0x7b, 0x17, + 0x4c, 0x7b, 0x21, 0x40, 0x75, 0xe3, 0x34, 0x25, 0x24, 0x3c, 0x78, 0xed, + 0x25, 0xec, 0x25, 0x76, 0x7d, 0xeb, 0x20, 0xd9, 0x26, 0x05, 0x84, 0x70, + 0x1b, 0x52, 0x27, 0x1a, 0x85, 0xc9, 0x18, 0x6b, 0x44, 0x49, 0x90, 0xe9, + 0x11, 0x90, 0x13, 0x56, 0x9c, 0x22, 0xcf, 0xcb, 0x10, 0x41, 0x9d, 0xd0, + 0xca, 0xfd, 0x12, 0x57, 0x97, 0xca, 0xb9, 0x2f, 0x12, 0x3d, 0x94, 0x72, + 0xad, 0x0f, 0x1b, 0xb7, 0x89, 0x96, 0x97, 0x93, 0x1d, 0xad, 0x82, 0x64, + 0x85, 0x4d, 0x21, 0x62, 0x7b, 0x2f, 0x75, 0x3c, 0x26, 0xc1, 0x77, 0x80, + 0x6c, 0xd7, 0x28, 0xac, 0x74, 0x35, 0x5f, 0x90, 0x29, 0xae, 0x70, 0x8a, + 0x50, 0x87, 0x26, 0x0a, 0x6c, 0xd4, 0x3a, 0xf5, 0x24, 0xc7, 0x6b, 0x5f, + 0x26, 0xbf, 0x28, 0x83, 0x71, 0x96, 0x21, 0xf2, 0x29, 0x60, 0x76, 0xc0, + 0x1d, 0x04, 0x2d, 0xe2, 0x7c, 0xbe, 0x1c, 0x0d, 0x51, 0xce, 0x8c, 0xad, + 0x14, 0xbd, 0x5d, 0xd1, 0x92, 0x16, 0x15, 0x67, 0x11, 0x0b, 0x92, 0xc6, + 0xd1, 0xd6, 0x0c, 0xa5, 0x94, 0x42, 0xcb, 0xec, 0x0a, 0xff, 0x8d, 0x75, + 0xb8, 0x89, 0x11, 0x40, 0x87, 0x2a, 0xa7, 0x4e, 0x15, 0x7c, 0x7e, 0xc3, + 0x93, 0x01, 0x1c, 0x40, 0x74, 0x81, 0x7d, 0x8a, 0x1e, 0x42, 0x6d, 0xa9, + 0x6e, 0x35, 0x26, 0x09, 0x6a, 0x75, 0x62, 0xba, 0x28, 0xe0, 0x66, 0x9a, + 0x53, 0x22, 0x27, 0xe8, 0x62, 0x01, 0x40, 0x98, 0x25, 0x74, 0x5e, 0x50, + 0x2b, 0x1d, 0x27, 0xa7, 0x5d, 0xf9, 0x17, 0xf9, 0x32, 0xad, 0x68, 0xe2, + 0x19, 0xca, 0x43, 0xfb, 0x72, 0xa5, 0x19, 0xcf, 0x53, 0xd1, 0x7f, 0x51, + 0x18, 0x52, 0x67, 0x2d, 0x89, 0x5d, 0x17, 0x05, 0x6f, 0xa8, 0x95, 0x56, + 0x1a, 0xd1, 0x0f, 0x48, 0x89, 0x8b, 0xd4, 0xa8, 0x0b, 0x54, 0x88, 0xc9, + 0xce, 0x2e, 0x08, 0x2c, 0x86, 0xc9, 0xc2, 0xb2, 0x0f, 0x0d, 0x7a, 0x15, + 0xa2, 0xab, 0x14, 0x85, 0x70, 0xaf, 0x8a, 0xc6, 0x1c, 0xd2, 0x68, 0x5d, + 0x7a, 0x90, 0x26, 0x1a, 0x63, 0xb0, 0x6b, 0x7f, 0x2c, 0xde, 0x5f, 0xfa, + 0x5d, 0x3d, 0x30, 0x74, 0x5c, 0x55, 0x4d, 0xc3, 0x31, 0xe5, 0x59, 0x22, + 0x3b, 0x2c, 0x33, 0xcc, 0x58, 0x7f, 0x29, 0x23, 0x36, 0x69, 0x58, 0x9b, + 0x16, 0xfa, 0x45, 0xf1, 0x64, 0x00, 0x17, 0x3c, 0x54, 0x1c, 0x70, 0x35, + 0x18, 0xb0, 0x61, 0x5e, 0x7b, 0x71, 0x18, 0xdf, 0x6d, 0xe2, 0x87, 0xc4, + 0x18, 0xe4, 0x7c, 0xb9, 0x95, 0x7e, 0x1a, 0xcf, 0x0b, 0xcd, 0x77, 0xc0, + 0xd8, 0xca, 0x06, 0x30, 0x79, 0x43, 0xd2, 0x15, 0x06, 0x14, 0x79, 0x0e, + 0xc2, 0xb4, 0x0a, 0x21, 0x6b, 0x8c, 0xa3, 0x48, 0x14, 0x96, 0x64, 0x37, + 0x8b, 0x59, 0x24, 0x77, 0x5d, 0xd3, 0x78, 0x90, 0x2e, 0x67, 0x59, 0x19, + 0x69, 0x0d, 0x35, 0xbe, 0x55, 0x3a, 0x59, 0x5d, 0x3a, 0x55, 0x52, 0x4b, + 0x49, 0xc7, 0x3e, 0x70, 0x51, 0x63, 0x38, 0xec, 0x42, 0x46, 0x53, 0x26, + 0x29, 0x3f, 0x46, 0x50, 0x56, 0x04, 0x19, 0x2d, 0x53, 0x22, 0x60, 0x8e, + 0x16, 0x3f, 0x60, 0x4d, 0x6c, 0xf4, 0x18, 0xc6, 0x6d, 0xd8, 0x79, 0x24, + 0x19, 0xa7, 0x7b, 0xb8, 0x84, 0x6e, 0x19, 0xf7, 0x88, 0x07, 0x91, 0xe2, + 0x1c, 0x31, 0x13, 0xe9, 0x68, 0xd5, 0xd8, 0xf8, 0x0c, 0x79, 0x6a, 0xef, + 0xd3, 0xce, 0x01, 0x63, 0x66, 0xfd, 0xc4, 0x40, 0x10, 0x2d, 0x5d, 0xaf, + 0xa3, 0x4b, 0x21, 0xf0, 0x57, 0x94, 0x89, 0x2e, 0x2f, 0x77, 0x53, 0x44, + 0x77, 0x56, 0x39, 0x3d, 0x4e, 0x86, 0x67, 0x25, 0x41, 0x3f, 0x4b, 0x35, + 0x58, 0x31, 0x47, 0xd8, 0x48, 0xd3, 0x48, 0xf7, 0x4c, 0x5c, 0x4b, 0x31, + 0x39, 0x4f, 0x50, 0x68, 0x4d, 0x3b, 0x2a, 0x9d, 0x54, 0xe9, 0x51, 0x5a, + 0x1c, 0x51, 0x5f, 0x50, 0x5c, 0x99, 0x19, 0x3a, 0x6c, 0x1d, 0x68, 0xb8, + 0x19, 0x92, 0x78, 0x42, 0x74, 0xb9, 0x1b, 0x15, 0x85, 0x8b, 0x80, 0x40, + 0x1b, 0xf4, 0x8f, 0x4d, 0x89, 0x9d, 0x1c, 0xf3, 0x2b, 0x8d, 0x30, 0x2f, + 0xd1, 0x25, 0x15, 0x78, 0x57, 0xdb, 0xd5, 0x37, 0x03, 0x10, 0x52, 0xe2, + 0xc7, 0xc7, 0x1a, 0x6e, 0x4e, 0xf2, 0xa7, 0x4e, 0x2e, 0x49, 0x4b, 0x56, + 0x8c, 0x81, 0x3d, 0x4c, 0x47, 0x7b, 0x77, 0x8e, 0x47, 0x3e, 0x44, 0x73, + 0x67, 0x5a, 0x4f, 0x09, 0x42, 0xa7, 0x58, 0xe4, 0x54, 0xa6, 0x41, 0xa4, + 0x49, 0x99, 0x59, 0x71, 0x42, 0x22, 0x39, 0xd7, 0x5d, 0x4a, 0x44, 0x8b, + 0x2c, 0x22, 0x61, 0xf7, 0x49, 0xb0, 0x1e, 0xed, 0x6b, 0x11, 0x54, 0xaa, + 0x1a, 0xfb, 0x77, 0x8f, 0x61, 0x94, 0x1b, 0x8f, 0x86, 0x2f, 0x6f, 0xce, + 0x1d, 0xaf, 0x90, 0xcf, 0x79, 0x50, 0x1e, 0x67, 0x97, 0xe3, 0x80, 0x1d, + 0x1d, 0x94, 0x2b, 0xa2, 0x30, 0x1f, 0xd1, 0x2b, 0x2b, 0x8d, 0x30, 0x2e, + 0xd1, 0x25, 0x15, 0x1b, 0x3f, 0x32, 0xca, 0xc0, 0x2a, 0x17, 0x3f, 0xb0, + 0xad, 0x0c, 0x3e, 0xa8, 0x3e, 0x1d, 0x8b, 0x31, 0x4d, 0x88, 0x3c, 0x60, + 0x79, 0x0b, 0x57, 0x2c, 0x3a, 0xb2, 0x6a, 0x2f, 0x5c, 0x17, 0x39, 0x6f, + 0x5c, 0x8c, 0x61, 0x28, 0x37, 0x4f, 0x4c, 0x49, 0x65, 0x1c, 0x37, 0x35, + 0x3b, 0x96, 0x68, 0xc4, 0x38, 0x94, 0x2c, 0xaa, 0x6c, 0xa0, 0x3c, 0x2e, + 0x1f, 0x63, 0x75, 0x37, 0x48, 0xe1, 0x1b, 0xb6, 0x83, 0x1c, 0x57, 0x10, + 0x1c, 0x27, 0x90, 0x6d, 0x65, 0x59, 0x1f, 0xbf, 0x97, 0xd7, 0x70, 0x33, + 0x1f, 0x5d, 0xa2, 0x37, 0x77, 0x5c, 0x1e, 0xd8, 0x2b, 0xb9, 0x30, 0x0f, + 0xd1, 0x32, 0x2b, 0xb9, 0x30, 0x0f, 0xd1, 0x32, 0x2f, 0x4e, 0x2f, 0x4e, + 0xc9, 0xae, 0x3f, 0x3a, 0x2f, 0x72, 0xb3, 0x8f, 0x53, 0x0c, 0x32, 0xa0, + 0x92, 0x2e, 0x5e, 0x1d, 0x32, 0xfb, 0x7e, 0xb1, 0x64, 0x0e, 0x31, 0x8f, + 0x6f, 0xc3, 0x68, 0xcb, 0x2f, 0x9c, 0x60, 0xc5, 0x6c, 0xeb, 0x2d, 0x1f, + 0x4f, 0xb5, 0x70, 0x51, 0x2b, 0x74, 0x3e, 0x2b, 0x73, 0x6a, 0x2a, 0x44, + 0x2d, 0x07, 0x76, 0xc0, 0x2c, 0xc5, 0x1e, 0x6b, 0x7e, 0xa3, 0x38, 0xee, + 0x1b, 0x3a, 0x8c, 0x80, 0x47, 0xb8, 0x1c, 0x9e, 0x97, 0x2e, 0x55, 0x12, + 0x1e, 0x99, 0xa1, 0x2b, 0x62, 0x3a, 0x1f, 0xd5, 0xab, 0xe0, 0x6f, 0xca, + 0x1d, 0x4c, 0x2b, 0xd0, 0x30, 0x00, 0xd1, 0x38, 0x2c, 0x85, 0x2f, 0x0f, + 0xd0, 0x96, 0x45, 0x7a, 0x1e, 0x75, 0xd9, 0x88, 0x58, 0x83, 0x22, 0x81, + 0xbc, 0xaf, 0x65, 0xf9, 0x27, 0x09, 0x9e, 0xdc, 0x6e, 0xab, 0x29, 0x44, + 0x88, 0x4d, 0x72, 0xac, 0x27, 0xa9, 0x77, 0xc0, 0x76, 0x9a, 0x25, 0x5c, + 0x67, 0x02, 0x79, 0xcf, 0x23, 0x34, 0x54, 0xfe, 0x7b, 0x89, 0x1f, 0x86, + 0x42, 0xac, 0x7d, 0x01, 0x1b, 0xc4, 0x2f, 0xde, 0x82, 0xea, 0x20, 0x62, + 0x23, 0x40, 0x89, 0x8d, 0x26, 0x71, 0x1b, 0x4b, 0x94, 0x80, 0x36, 0x8d, + 0x19, 0xae, 0x9f, 0x34, 0x48, 0xd5, 0x1d, 0x1d, 0xaa, 0xea, 0x54, 0x32, + 0x1d, 0x54, 0xad, 0x3e, 0x5d, 0xaa, 0x1d, 0xb6, 0x2c, 0x85, 0x2f, 0x10, + 0xd0, 0x96, 0x2c, 0xb2, 0x2e, 0xf2, 0xd0, 0xa4, 0x6c, 0x87, 0x1d, 0xfd, + 0xd8, 0x57, 0x73, 0xdb, 0x17, 0x07, 0xc4, 0xf3, 0x7f, 0x58, 0x1d, 0x3f, + 0xa4, 0xb8, 0x85, 0x0d, 0x21, 0x0b, 0x8d, 0xd0, 0x82, 0xd6, 0x1d, 0x4c, + 0x80, 0x5e, 0x85, 0xa6, 0x1a, 0xc8, 0x6f, 0x86, 0x88, 0x20, 0x19, 0xa3, + 0x5c, 0x05, 0x8a, 0xf0, 0x1a, 0x83, 0x4b, 0xcf, 0x8d, 0xf4, 0x1c, 0x3c, + 0x3d, 0x4a, 0x93, 0x42, 0x1d, 0xb1, 0x2c, 0x27, 0x99, 0xc9, 0x20, 0x3d, + 0x22, 0x9a, 0xa4, 0xf2, 0x23, 0x12, 0x1e, 0xe7, 0xb0, 0x2c, 0x30, 0x84, + 0x1c, 0x22, 0xb0, 0x4d, 0x46, 0xc0, 0x1c, 0x88, 0xb0, 0x36, 0x53, 0x1e, + 0x1c, 0x49, 0x2c, 0x9b, 0x2f, 0x01, 0xd0, 0x9c, 0x7b, 0xed, 0x21, 0xb8, + 0xdb, 0x3a, 0x88, 0xd0, 0x1f, 0xfe, 0xd5, 0x26, 0x95, 0x2a, 0x1c, 0x64, + 0xcd, 0x3f, 0x9d, 0xaa, 0x1a, 0x5b, 0xbf, 0x69, 0x9d, 0xd4, 0x1d, 0x45, + 0xaa, 0x8b, 0x9b, 0xf6, 0x1e, 0x7c, 0x94, 0x28, 0x9d, 0x36, 0x1b, 0x6f, + 0x7e, 0x6e, 0x9c, 0x0f, 0x1d, 0x8b, 0x69, 0x21, 0x9e, 0xf1, 0x1d, 0x11, + 0x58, 0x87, 0xa1, 0xdb, 0x1b, 0xca, 0x47, 0xa1, 0xa3, 0x1a, 0x1a, 0xff, + 0x36, 0xff, 0xa9, 0x94, 0x1a, 0xe2, 0x24, 0x90, 0xbb, 0xec, 0x1e, 0x34, + 0x20, 0xb1, 0xc3, 0x61, 0x25, 0x5f, 0x23, 0x4f, 0xc5, 0x7a, 0x28, 0x72, + 0x24, 0x7b, 0xc6, 0x9f, 0x2a, 0x1e, 0x25, 0x1d, 0x86, 0x29, 0x23, 0x7e, + 0xdb, 0x3b, 0x90, 0x79, 0x22, 0xd8, 0xd7, 0x95, 0x9b, 0x12, 0x21, 0xf6, + 0xd4, 0xa3, 0xa6, 0x13, 0x1e, 0x75, 0xcf, 0xa5, 0xb3, 0xc8, 0x1c, 0x99, + 0xc9, 0xf2, 0xba, 0x0f, 0x1c, 0xe6, 0xc1, 0xc5, 0xb3, 0x34, 0x1e, 0x0c, + 0xa5, 0xf0, 0xb6, 0x58, 0x1c, 0xde, 0x92, 0xe6, 0xb4, 0x66, 0x1c, 0xe8, + 0x79, 0x42, 0xb1, 0x1c, 0x1d, 0x20, 0x63, 0x2f, 0xb0, 0x4e, 0x1b, 0xeb, + 0x51, 0x23, 0xaf, 0xde, 0x1a, 0x83, 0x40, 0xff, 0xbb, 0xf2, 0x12, 0x2d, + 0x26, 0xdd, 0xc5, 0x67, 0x21, 0x71, 0x26, 0x5c, 0xc6, 0xee, 0x25, 0x9a, + 0x26, 0x95, 0xc7, 0xbf, 0x27, 0xe7, 0x26, 0xb9, 0xc8, 0x41, 0x29, 0x5c, + 0x26, 0xd0, 0x94, 0x35, 0x24, 0x87, 0xd9, 0xb8, 0x9c, 0xf5, 0x23, 0xca, + 0xd6, 0xfe, 0xa8, 0x7a, 0x22, 0x13, 0xd4, 0x51, 0xba, 0x17, 0x1d, 0x65, + 0xd2, 0xcf, 0xbd, 0x13, 0x1d, 0x87, 0xce, 0x1c, 0xc5, 0xce, 0x1f, 0x81, + 0xc4, 0x8c, 0xc7, 0x07, 0x1e, 0xd9, 0xb5, 0x11, 0xc6, 0xf8, 0x1d, 0xf6, + 0xa0, 0x07, 0xc5, 0xa4, 0x1c, 0x61, 0x85, 0x03, 0xc4, 0x50, 0x1c, 0x27, + 0x71, 0xd7, 0xc4, 0x13, 0x1a, 0x34, 0x5e, 0x30, 0xc5, 0x1b, 0x1b, 0x08, + 0x4e, 0xca, 0xc5, 0xde, 0x17, 0x28, 0x32, 0x6c, 0xc8, 0x5b, 0x22, 0xe0, + 0x28, 0xd0, 0xc8, 0xdd, 0x25, 0xbe, 0x28, 0x67, 0xc9, 0x97, 0x2a, 0x17, + 0x29, 0x3f, 0xc9, 0xd4, 0x29, 0xb0, 0x28, 0x00, 0x1d, 0x3d, 0xa9, 0x0d, + 0xb2, 0xce, 0x1f, 0xd3, 0xa7, 0x79, 0xab, 0x7d, 0x1f, 0xe7, 0xa6, 0x9a, + 0xa9, 0x29, 0x21, 0x53, 0xa5, 0x3b, 0xa3, 0x6e, 0x24, 0xc3, 0xa1, 0xa9, + 0x9b, 0x60, 0x23, 0xce, 0xa2, 0x71, 0x95, 0x49, 0x26, 0x82, 0xa0, 0xbd, + 0x90, 0x38, 0x26, 0xb6, 0xa0, 0x4d, 0x8d, 0xc8, 0x28, 0xa0, 0x96, 0x83, + 0x7a, 0xa1, 0x29, 0x58, 0x9a, 0xae, 0x75, 0x11, 0x2a, 0xff, 0x91, 0x39, + 0x6a, 0x56, 0x24, 0xa9, 0x9f, 0x00, 0x62, 0x40, 0x24, 0x12, 0x9e, 0x77, + 0x5e, 0xa3, 0x1b, 0x73, 0x93, 0xb2, 0x27, 0x57, 0x1b, 0xbb, 0x94, 0x13, + 0x21, 0xc8, 0x1c, 0xb2, 0x9c, 0x41, 0x1d, 0x7a, 0x20, 0x23, 0xa0, 0xd7, + 0x1d, 0x0f, 0x1a, 0xcf, 0xa8, 0x99, 0xbf, 0xe0, 0x1c, 0x77, 0xa7, 0x65, + 0xb3, 0x21, 0x1f, 0x53, 0xa5, 0x3b, 0xa9, 0x75, 0x1f, 0xbe, 0xa3, 0x9f, + 0xa5, 0xdb, 0x22, 0xea, 0xa1, 0x7f, 0x9d, 0x66, 0x24, 0xf1, 0x9e, 0x18, + 0x96, 0x6f, 0x23, 0xca, 0x9e, 0xbf, 0x8f, 0x63, 0x26, 0x9c, 0x9b, 0x79, + 0x8a, 0x2b, 0x28, 0x4e, 0x91, 0x7e, 0x77, 0xa4, 0x28, 0x83, 0x91, 0xeb, + 0x6f, 0x5a, 0x28, 0x6f, 0x8d, 0xd8, 0x64, 0xfc, 0x22, 0xa5, 0x95, 0xb7, + 0x5c, 0x19, 0x20, 0x04, 0x90, 0x2b, 0x44, 0x9b, 0x1e, 0x6c, 0x8a, 0x75, + 0x25, 0x06, 0x1d, 0x31, 0x90, 0xe1, 0x1e, 0x62, 0x1e, 0x51, 0x91, 0xc0, + 0x19, 0xe5, 0x20, 0x84, 0x99, 0x75, 0x18, 0xbe, 0x1a, 0x2c, 0xa7, 0x50, + 0xc0, 0xbf, 0x19, 0xd3, 0xa6, 0x49, 0xbd, 0xc0, 0x19, 0xe4, 0xa4, 0xfc, + 0xb4, 0xc9, 0x1c, 0x26, 0xa2, 0x7c, 0xa7, 0x68, 0x20, 0xbe, 0x9e, 0x6d, + 0x9f, 0xf0, 0x24, 0x68, 0x9b, 0x5f, 0x95, 0x4d, 0x24, 0xe7, 0x98, 0x21, + 0x8e, 0x62, 0x27, 0x87, 0x92, 0xea, 0x82, 0xa4, 0x29, 0xf8, 0x89, 0x5d, + 0x73, 0x6c, 0x28, 0x1e, 0x8b, 0x8a, 0x67, 0xac, 0x28, 0x94, 0x8a, 0x2d, + 0x60, 0x15, 0x20, 0xec, 0x85, 0xac, 0x49, 0x95, 0x20, 0xe2, 0x83, 0x34, + 0x29, 0xf1, 0x21, 0xd6, 0x88, 0x4d, 0x23, 0x67, 0x23, 0x0c, 0x89, 0x0f, + 0x1e, 0x6c, 0x20, 0x91, 0x8c, 0x52, 0x14, 0x9e, 0x22, 0xa5, 0x8f, 0xc6, + 0x13, 0x5a, 0x13, 0x25, 0xa7, 0x50, 0xd2, 0xe0, 0x14, 0x48, 0xa4, 0x11, + 0xc1, 0x45, 0x17, 0xf5, 0xa1, 0xe8, 0xb9, 0xae, 0x17, 0x48, 0x9e, 0x79, + 0xae, 0xda, 0x1c, 0x55, 0x9a, 0xd5, 0xa0, 0xb2, 0x22, 0xcb, 0x94, 0x18, + 0x93, 0x9f, 0x23, 0x0e, 0x8d, 0x8c, 0x86, 0x0b, 0x25, 0x91, 0x82, 0x69, + 0x74, 0xf0, 0x28, 0xd9, 0x83, 0x1a, 0x6d, 0x23, 0x2a, 0x1b, 0x80, 0x9f, + 0x60, 0x3c, 0x27, 0xd1, 0x7d, 0x5a, 0x4e, 0x02, 0x20, 0xa2, 0x79, 0xa9, + 0x38, 0x2f, 0x23, 0x77, 0x7c, 0x67, 0x25, 0xf7, 0x25, 0x78, 0x81, 0x4a, + 0x1f, 0x70, 0x26, 0x55, 0x85, 0x94, 0x19, 0xfe, 0x27, 0xcb, 0x87, 0x3c, + 0x17, 0x8c, 0x45, 0x19, 0x93, 0x3c, 0x11, 0x38, 0x14, 0xe7, 0x9f, 0xc8, + 0xd2, 0xb8, 0x11, 0x14, 0xa2, 0x0d, 0xce, 0xdf, 0x12, 0x90, 0x9b, 0xaa, + 0xbd, 0xb1, 0x11, 0xed, 0x98, 0x71, 0xb1, 0xc7, 0x1b, 0x79, 0x8d, 0x91, + 0x9b, 0xbb, 0x1c, 0xcb, 0x86, 0xc9, 0x8b, 0xc7, 0x21, 0xe7, 0x7d, 0x12, + 0x79, 0x61, 0x26, 0xc3, 0x79, 0x7d, 0x6e, 0x41, 0x28, 0xa7, 0x76, 0xff, + 0x62, 0x7d, 0x28, 0x70, 0x73, 0x4d, 0x52, 0x4f, 0x25, 0x7c, 0x70, 0x38, + 0x3d, 0xf2, 0x24, 0xf1, 0x6e, 0x7a, 0x2a, 0x29, 0x29, 0x49, 0x73, 0x9b, + 0x20, 0xa7, 0x2d, 0xdb, 0x7a, 0x0a, 0x1b, 0xbd, 0x31, 0xaa, 0x80, 0xe3, + 0x19, 0xaa, 0x54, 0x51, 0x8e, 0xdc, 0x14, 0xb8, 0x60, 0xc0, 0x94, 0x1d, + 0x15, 0x7e, 0x13, 0x44, 0x96, 0x4f, 0xd4, 0x94, 0x0f, 0x8e, 0x98, 0x68, + 0xcf, 0xcb, 0x0f, 0xf9, 0x95, 0xa0, 0xc6, 0x1b, 0x10, 0xd8, 0x8b, 0x6d, + 0xad, 0x3e, 0x14, 0xe2, 0x83, 0x8b, 0x98, 0xd2, 0x1d, 0xbd, 0x7a, 0xd4, + 0x85, 0x05, 0x27, 0x44, 0x76, 0x02, 0x77, 0xb5, 0x2c, 0x46, 0x71, 0xc0, + 0x6a, 0x1c, 0x2f, 0x86, 0x6d, 0xe2, 0x5b, 0xd8, 0x2f, 0xad, 0x6a, 0x01, + 0x4a, 0x15, 0x2f, 0x25, 0x67, 0xce, 0x36, 0x28, 0x30, 0x89, 0x67, 0x2e, + 0x22, 0x3b, 0x38, 0xb3, 0x6c, 0x50, 0x18, 0xb3, 0x46, 0x63, 0x75, 0xe0, + 0x19, 0x35, 0x55, 0xcd, 0x81, 0x15, 0x18, 0x29, 0x6b, 0x35, 0x8e, 0xdc, + 0x17, 0x4c, 0x6f, 0x61, 0x97, 0xaa, 0x18, 0xc2, 0x12, 0xc0, 0x8b, 0x98, + 0xd7, 0x1c, 0x0e, 0xf0, 0x8d, 0x6d, 0xd2, 0x88, 0x09, 0x33, 0x8b, 0xfe, + 0xc8, 0x74, 0x0b, 0x82, 0x82, 0x53, 0xaf, 0x0a, 0x1a, 0x5b, 0x77, 0x5c, + 0x94, 0x94, 0x25, 0x3d, 0x71, 0x06, 0x82, 0xd8, 0x2d, 0x13, 0x6c, 0x00, + 0x74, 0x8b, 0x33, 0x71, 0x67, 0x5e, 0x64, 0xe8, 0x37, 0x8e, 0x63, 0x76, + 0x56, 0x46, 0x38, 0xc6, 0x60, 0xa5, 0x44, 0x81, 0x3b, 0xac, 0x60, 0x77, + 0x31, 0xc3, 0x3f, 0x5d, 0x61, 0x85, 0x20, 0x67, 0x48, 0x6d, 0x67, 0xff, + 0x17, 0xb5, 0x57, 0xcf, 0x74, 0x2a, 0x18, 0xf4, 0x64, 0x9f, 0x7f, 0xf0, + 0x18, 0x9b, 0x71, 0xf3, 0x8c, 0x0e, 0x19, 0x6d, 0x7e, 0x92, 0x96, 0xb2, + 0x1b, 0x0a, 0x0f, 0x7b, 0x7c, 0x5f, 0xdc, 0x25, 0x0e, 0xe1, 0x80, 0xef, + 0xd6, 0x06, 0x07, 0x11, 0x7f, 0x2a, 0xc9, 0xba, 0x0c, 0xef, 0x73, 0x39, + 0xad, 0xe9, 0x23, 0x64, 0x6c, 0xbb, 0x94, 0x85, 0x2d, 0x69, 0x66, 0xb1, + 0x82, 0xb7, 0x36, 0x99, 0x61, 0x34, 0x72, 0x16, 0x3d, 0x7b, 0x5d, 0x31, + 0x62, 0x12, 0x42, 0x76, 0x5a, 0x69, 0x52, 0x99, 0x47, 0x2b, 0x59, 0xfb, + 0x42, 0x13, 0x4b, 0x47, 0x5b, 0xa6, 0x32, 0x0d, 0x4f, 0x2e, 0x5e, 0x84, + 0x22, 0x6a, 0x56, 0x08, 0x63, 0xc4, 0x16, 0xe9, 0x65, 0x37, 0x70, 0xcb, + 0x19, 0x60, 0x71, 0xa2, 0x7c, 0x5e, 0x19, 0xda, 0x7d, 0xe3, 0x86, 0xfc, + 0x19, 0xe3, 0x8a, 0x25, 0x94, 0xb4, 0x1c, 0x85, 0x17, 0x41, 0x6d, 0xb8, + 0xdb, 0x8d, 0x10, 0xfa, 0x70, 0x73, 0xd9, 0x2a, 0x00, 0x00, 0x6f, 0x82, + 0xd1, 0x73, 0x16, 0x5e, 0x69, 0x45, 0xb1, 0xe2, 0x2a, 0xa2, 0x61, 0x27, + 0x97, 0x49, 0x38, 0x85, 0x5b, 0x6b, 0x81, 0x47, 0x42, 0xa1, 0x57, 0x09, + 0x70, 0x9c, 0x4a, 0xa9, 0x54, 0x14, 0x61, 0x54, 0x51, 0x08, 0x52, 0x03, + 0x52, 0x2d, 0x55, 0xc5, 0x53, 0xf0, 0x42, 0xd3, 0x59, 0xc6, 0x56, 0xf2, + 0x33, 0x9b, 0x5e, 0x00, 0x5b, 0x26, 0x25, 0xad, 0x61, 0xc2, 0x5f, 0xec, + 0x18, 0x8d, 0x6f, 0x6d, 0x6c, 0x47, 0x19, 0xd8, 0x7c, 0x6d, 0x79, 0x0e, + 0x1b, 0x54, 0x88, 0x10, 0x82, 0x47, 0x1b, 0x6d, 0x96, 0x48, 0x90, 0x7d, + 0x1e, 0x71, 0x1d, 0x61, 0x5b, 0x89, 0xdb, 0x6b, 0x19, 0xc1, 0x5d, 0xde, + 0xda, 0x2c, 0x0e, 0xbe, 0x60, 0x86, 0xd4, 0x2b, 0x25, 0x87, 0x59, 0x8d, + 0xb3, 0xde, 0x39, 0x12, 0x54, 0xa6, 0x95, 0x04, 0x47, 0xde, 0x50, 0x76, + 0x81, 0x65, 0x51, 0x7e, 0x4d, 0x94, 0x71, 0x09, 0x58, 0xc6, 0x4b, 0xfd, + 0x62, 0x0e, 0x5e, 0x2a, 0x4b, 0x47, 0x52, 0xa3, 0x62, 0xb2, 0x4b, 0x6d, + 0x43, 0x23, 0x66, 0xad, 0x4e, 0xd4, 0x34, 0xeb, 0x6a, 0x49, 0x52, 0x4f, + 0x27, 0x40, 0x6d, 0x9f, 0x58, 0x6e, 0x1b, 0x0a, 0x7a, 0x25, 0x64, 0x28, + 0x1b, 0x4f, 0x89, 0x3b, 0x72, 0xde, 0x1d, 0xe4, 0x93, 0x8a, 0x7c, 0x6b, + 0x1e, 0x79, 0x9d, 0x13, 0x85, 0x29, 0x1e, 0xc7, 0x2b, 0xb0, 0x30, 0x28, + 0xd1, 0x36, 0x2a, 0xef, 0x31, 0xd4, 0xd1, 0xc5, 0x20, 0xba, 0x4a, 0xbc, + 0xd9, 0x54, 0x34, 0xfc, 0x4b, 0x22, 0xb6, 0x6c, 0x4b, 0x9a, 0x48, 0x2c, + 0x95, 0x61, 0x58, 0xad, 0x46, 0x06, 0x82, 0x9c, 0x60, 0xc9, 0x44, 0x8c, + 0x73, 0x79, 0x65, 0x53, 0x43, 0x59, 0x65, 0x86, 0x69, 0xff, 0x41, 0x6b, + 0x54, 0xbd, 0x6e, 0x40, 0x40, 0xe4, 0x44, 0x88, 0x72, 0x25, 0x43, 0x54, + 0x35, 0x85, 0x75, 0x45, 0x46, 0x91, 0x28, 0x0d, 0x78, 0xa7, 0x4c, 0xae, + 0x1a, 0xaf, 0x85, 0x9b, 0x5a, 0x3a, 0x1c, 0xd7, 0x93, 0x66, 0x68, 0x87, + 0x1f, 0xa9, 0x9c, 0x67, 0x74, 0x23, 0x1f, 0x29, 0xa6, 0xb0, 0x7b, 0x9a, + 0x1f, 0x83, 0x2b, 0xc6, 0x30, 0x19, 0xd1, 0x3c, 0x2b, 0xd3, 0x30, 0x23, + 0xd1, 0x49, 0x39, 0x52, 0x37, 0x10, 0xe0, 0xc4, 0x4c, 0xb3, 0x38, 0x23, + 0xbe, 0x99, 0x5f, 0xdd, 0x3b, 0xa8, 0x9a, 0xb7, 0x69, 0x52, 0x3b, 0xf8, + 0x87, 0x10, 0x6d, 0x9f, 0x3a, 0xc4, 0x77, 0xfe, 0x71, 0x90, 0x38, 0xff, + 0x69, 0x4e, 0x75, 0xf6, 0x36, 0x82, 0x58, 0x20, 0x79, 0x37, 0x34, 0xa7, + 0x46, 0xb7, 0x7c, 0x33, 0x34, 0x0f, 0x35, 0x9e, 0x7f, 0x4c, 0x36, 0xce, + 0x27, 0x75, 0x81, 0xca, 0x3a, 0x48, 0x19, 0x2d, 0x90, 0x2b, 0x4b, 0xe8, + 0x1d, 0x4a, 0x99, 0xd5, 0x5b, 0x39, 0x20, 0x58, 0xa2, 0xee, 0x65, 0xad, + 0x1f, 0x8c, 0xad, 0x2a, 0x72, 0xc1, 0x1d, 0x84, 0x2b, 0x8b, 0x30, 0x72, + 0xcd, 0xab, 0x2c, 0x9d, 0x2f, 0x23, 0xd0, 0xae, 0x53, 0x42, 0x25, 0xe6, + 0xe9, 0x5a, 0x66, 0x89, 0x29, 0xee, 0xc7, 0xe4, 0x74, 0x1d, 0x30, 0x7c, + 0xa4, 0x87, 0x79, 0xc2, 0x32, 0x7f, 0x8f, 0xe0, 0x7c, 0x00, 0x31, 0x2b, + 0x7f, 0xb0, 0x80, 0x16, 0x2e, 0x3f, 0x6e, 0xcc, 0x82, 0xc7, 0x2b, 0xd6, + 0x5c, 0xbf, 0x84, 0xd1, 0x29, 0x4d, 0x4a, 0xd3, 0x87, 0x19, 0x26, 0xdb, + 0x39, 0x04, 0x89, 0x2e, 0x25, 0xb9, 0x27, 0xcb, 0x8b, 0xd1, 0x28, 0x3f, + 0x18, 0x71, 0x98, 0x86, 0x3b, 0x11, 0x1a, 0x13, 0xa5, 0x32, 0x4d, 0x46, + 0x1d, 0x76, 0xac, 0x78, 0x55, 0x8e, 0x1d, 0x34, 0xae, 0xd8, 0x63, 0x08, + 0x1d, 0x85, 0x2c, 0x91, 0x2f, 0x18, 0xd0, 0xa2, 0x2c, 0xcb, 0x2f, 0x05, + 0xd0, 0xbc, 0x76, 0x57, 0x22, 0xe8, 0xdd, 0xdf, 0x81, 0x11, 0x1e, 0xbb, + 0xd0, 0x5f, 0x8a, 0x80, 0x24, 0xe7, 0xb1, 0xfe, 0x8e, 0x1e, 0x28, 0x41, + 0x99, 0xfa, 0x8c, 0xdf, 0x25, 0xa8, 0x89, 0x85, 0x8f, 0x5e, 0x23, 0x9a, + 0x77, 0x86, 0x8f, 0xd1, 0x20, 0xd7, 0x62, 0x16, 0x91, 0x19, 0x1e, 0x55, + 0x50, 0x03, 0x91, 0x64, 0x1c, 0x09, 0x3e, 0x7a, 0x97, 0xa0, 0x1d, 0xaf, + 0x2f, 0x4d, 0x9e, 0x8e, 0x1f, 0x83, 0x21, 0xd2, 0xab, 0x19, 0x26, 0xfd, + 0x1e, 0xf8, 0xb7, 0x22, 0x36, 0xf8, 0x1b, 0x7e, 0xbf, 0x74, 0x44, 0x0b, + 0x1b, 0xd8, 0xc3, 0x8f, 0x55, 0x6a, 0x1e, 0x0c, 0x2c, 0xa8, 0x2f, 0x09, + 0xd0, 0xa9, 0x82, 0x30, 0x24, 0x4f, 0xdd, 0x8d, 0x8f, 0x5d, 0x23, 0x36, + 0xd8, 0x69, 0x9d, 0x19, 0x20, 0xc4, 0xd2, 0x62, 0xa4, 0x96, 0x1a, 0xe4, + 0xc5, 0xa2, 0xa3, 0x08, 0x1d, 0xe3, 0xad, 0xd9, 0xa4, 0x56, 0x1d, 0x25, + 0x99, 0xf7, 0xa3, 0x99, 0x1c, 0x23, 0x82, 0x3d, 0xa4, 0x94, 0x1d, 0x59, + 0x6d, 0xe4, 0xa4, 0xcf, 0x1d, 0x4e, 0x5b, 0xa7, 0xa5, 0x7c, 0x1c, 0xc9, + 0x4a, 0x6a, 0xaa, 0x9a, 0x19, 0xe7, 0x39, 0xe3, 0xaf, 0x96, 0x18, 0xc8, + 0x25, 0x2c, 0xc1, 0x4d, 0x20, 0xcc, 0x22, 0x98, 0xc5, 0x2a, 0x27, 0x07, + 0x24, 0x8a, 0xc6, 0xbb, 0x29, 0x9b, 0x25, 0x57, 0xc6, 0xc3, 0x43, 0x89, + 0x21, 0xa8, 0x88, 0xa4, 0x25, 0x13, 0xdc, 0xf9, 0x94, 0x2d, 0x25, 0x30, + 0xda, 0xb1, 0x9f, 0x80, 0x24, 0x4f, 0xd6, 0xf0, 0xa9, 0x94, 0x21, 0x42, + 0xd3, 0x5c, 0xb8, 0x06, 0x1c, 0xc7, 0xce, 0x9f, 0xbf, 0x75, 0x1d, 0x4c, + 0xc4, 0xda, 0xbe, 0xa1, 0x1e, 0x60, 0xad, 0x89, 0xc0, 0x27, 0x1c, 0xac, + 0x97, 0x9a, 0xc0, 0x36, 0x1b, 0xfe, 0x7f, 0x5f, 0xbe, 0x21, 0x1b, 0xfe, + 0x6b, 0x46, 0xbe, 0x3c, 0x1a, 0x26, 0x58, 0x11, 0xbc, 0x8e, 0x17, 0x31, + 0x43, 0x65, 0xc2, 0x5a, 0x13, 0xdb, 0x29, 0x32, 0xc7, 0x31, 0x23, 0x14, + 0x27, 0x9a, 0xc8, 0x30, 0x26, 0xc3, 0x27, 0x74, 0xc8, 0xb7, 0x28, 0xcd, + 0x27, 0x64, 0xc8, 0x30, 0x2d, 0xd3, 0x29, 0xef, 0x98, 0xc1, 0x25, 0xdf, + 0xda, 0xcb, 0x9e, 0xd1, 0x25, 0x2f, 0xd8, 0xb1, 0xaa, 0x96, 0x23, 0xc6, + 0xd6, 0x7a, 0xbd, 0xc8, 0x1e, 0xcb, 0xd7, 0x64, 0xc2, 0xc6, 0x1d, 0xe3, + 0xd1, 0xcf, 0xc8, 0x75, 0x1f, 0xd8, 0xc7, 0x20, 0xc9, 0x99, 0x1f, 0x1c, + 0xb6, 0xc3, 0xc9, 0xbe, 0x1e, 0x21, 0xa1, 0xa9, 0xc8, 0x49, 0x1c, 0x84, + 0x86, 0x37, 0xc6, 0xf4, 0x1c, 0x24, 0x72, 0xe0, 0xc7, 0x1c, 0x1c, 0x66, + 0x60, 0x22, 0xc7, 0xe2, 0x1d, 0x19, 0x50, 0x6e, 0xc9, 0x92, 0x19, 0xc5, + 0x34, 0x4d, 0xca, 0x29, 0x24, 0xf6, 0x29, 0xb7, 0xca, 0x50, 0x27, 0x84, + 0x29, 0x16, 0xca, 0x66, 0x29, 0x27, 0x28, 0xb5, 0xca, 0x74, 0x2a, 0x48, + 0x28, 0x73, 0x1d, 0xc6, 0xaa, 0xa5, 0xb4, 0xea, 0x20, 0x32, 0xa9, 0x5f, + 0xad, 0x74, 0x20, 0x4f, 0xa8, 0xc4, 0xab, 0x67, 0x21, 0x2e, 0xa8, 0xc7, + 0xa8, 0x57, 0x24, 0x86, 0xa4, 0x20, 0x9d, 0xc6, 0x23, 0xa4, 0xa4, 0xc0, + 0x97, 0x87, 0x26, 0xc4, 0xa3, 0x41, 0x92, 0x4e, 0x26, 0xf4, 0xa2, 0xd4, + 0x8f, 0xdb, 0x28, 0x30, 0xa3, 0x71, 0x85, 0xc8, 0x29, 0xac, 0xa3, 0x23, + 0x7d, 0x2c, 0x28, 0x81, 0x9a, 0xfd, 0x6f, 0xb5, 0x25, 0x15, 0xa1, 0x0d, + 0x63, 0x6e, 0x24, 0x7f, 0xa0, 0x84, 0x5f, 0xcc, 0x15, 0x21, 0x97, 0x73, + 0x23, 0xb4, 0x1a, 0xe8, 0x9f, 0x47, 0x20, 0xe5, 0x20, 0x26, 0xa6, 0xdc, + 0x20, 0xa2, 0x23, 0xad, 0xb3, 0x71, 0x21, 0x25, 0x1b, 0x95, 0xaa, 0x6e, + 0xc1, 0xe6, 0x1d, 0x2c, 0xa9, 0x6f, 0xb5, 0xb5, 0x1f, 0xd3, 0xa7, 0xb9, + 0xac, 0x0b, 0x1f, 0xee, 0xa6, 0x93, 0xa8, 0xf2, 0x22, 0x6e, 0xa4, 0x8d, + 0xa0, 0x7f, 0x24, 0xad, 0xa0, 0xeb, 0x99, 0x29, 0x23, 0xa0, 0xa1, 0x51, + 0x91, 0xe2, 0x26, 0x79, 0x9e, 0x4b, 0x8c, 0x9c, 0x28, 0x8d, 0x95, 0x89, + 0x7a, 0xa6, 0x28, 0xcf, 0x95, 0xa3, 0x71, 0xb9, 0x24, 0xf6, 0x8e, 0xae, + 0x65, 0x79, 0x23, 0xc3, 0x9b, 0xf4, 0x5e, 0xc4, 0x16, 0x79, 0x98, 0x30, + 0x3d, 0x92, 0x1b, 0xda, 0x92, 0xd8, 0x24, 0xf6, 0x19, 0x0f, 0x93, 0x84, + 0x1a, 0xfd, 0x1f, 0xbc, 0x9d, 0x8b, 0x1b, 0xb2, 0x23, 0x69, 0xa3, 0x01, + 0x1b, 0xfc, 0x1b, 0x10, 0xa9, 0x63, 0xc3, 0x0a, 0x1a, 0xd5, 0xa8, 0xaf, + 0xc0, 0x67, 0x1a, 0xf5, 0xa7, 0xcd, 0xb8, 0x26, 0x1c, 0x79, 0xa5, 0xb0, + 0xab, 0x54, 0x20, 0x30, 0xa1, 0xfa, 0xa3, 0xb6, 0x24, 0x09, 0x9e, 0xae, + 0x98, 0x9b, 0x24, 0xb8, 0x9a, 0xee, 0x91, 0x20, 0x27, 0x53, 0x96, 0x4f, + 0x85, 0xd2, 0x29, 0x57, 0x8b, 0xcb, 0x75, 0x90, 0x28, 0x02, 0x8d, 0x6d, + 0x69, 0xe2, 0x23, 0xc1, 0x8a, 0xbd, 0x5e, 0x65, 0x20, 0xe9, 0x88, 0xb8, + 0x4a, 0xd7, 0x20, 0x1d, 0x89, 0xbc, 0x2f, 0x42, 0x1f, 0x9a, 0x87, 0xe1, + 0x21, 0x3a, 0x1f, 0x0b, 0x8e, 0x4c, 0x18, 0x93, 0x21, 0x81, 0x90, 0xf8, + 0x15, 0x7a, 0x24, 0xbe, 0x9a, 0xd5, 0x16, 0xae, 0x14, 0xba, 0xa9, 0xae, + 0xd5, 0x96, 0x11, 0x8a, 0xac, 0x22, 0xd2, 0xcb, 0x19, 0x66, 0xa5, 0x60, + 0xbd, 0x8f, 0x18, 0xf8, 0xa2, 0xee, 0xb4, 0x03, 0x1b, 0x95, 0x9e, 0x8a, + 0xa5, 0x80, 0x22, 0x61, 0x97, 0x86, 0x97, 0x3f, 0x26, 0x95, 0x8d, 0x14, + 0x88, 0x75, 0x27, 0xcd, 0x85, 0xd8, 0x78, 0xf9, 0x29, 0xe9, 0x83, 0x1a, + 0x6d, 0xd1, 0x28, 0xaa, 0x83, 0x2a, 0x62, 0xdf, 0x27, 0x59, 0x7e, 0xf7, + 0x50, 0x3c, 0x20, 0xf2, 0x7d, 0x5e, 0x3a, 0xa5, 0x22, 0xa3, 0x7f, 0x56, + 0x26, 0x75, 0x24, 0xd3, 0x85, 0x2a, 0x1d, 0x42, 0x26, 0xc9, 0x87, 0x33, + 0x18, 0x1d, 0x26, 0x60, 0x8a, 0x0c, 0x10, 0x03, 0x46, 0x08, 0x95, 0xef, + 0x10, 0xca, 0x16, 0x77, 0xa3, 0x7c, 0xd5, 0xb1, 0x13, 0x52, 0xa5, 0xfb, + 0xd2, 0x98, 0x10, 0x08, 0xa3, 0x97, 0xcb, 0x50, 0x12, 0x1a, 0x9d, 0x8f, + 0xb7, 0xcc, 0x17, 0x51, 0x95, 0x1f, 0xa5, 0x67, 0x1d, 0x50, 0x89, 0xa7, + 0x8f, 0x10, 0x25, 0xf6, 0x85, 0x23, 0x81, 0xf9, 0x2b, 0xb3, 0x82, 0x3b, + 0x76, 0xd5, 0x2e, 0x18, 0x7e, 0x5f, 0x69, 0x19, 0x2e, 0xdd, 0x7b, 0x0b, + 0x59, 0xd6, 0x2d, 0x11, 0x78, 0x3e, 0x46, 0xf4, 0x2a, 0x5f, 0x76, 0x1e, + 0x31, 0xc7, 0x2c, 0x5a, 0x74, 0x22, 0x1d, 0x52, 0x32, 0xfa, 0x7c, 0xc8, + 0x1a, 0x7e, 0x44, 0x7e, 0x85, 0xd0, 0x13, 0x40, 0x56, 0xec, 0x91, 0x5f, + 0x14, 0xaf, 0x6b, 0x3c, 0x9d, 0xca, 0x16, 0x23, 0x15, 0x7a, 0x99, 0xdb, + 0xd7, 0x60, 0x12, 0x74, 0x9c, 0x96, 0xd3, 0xad, 0x10, 0x87, 0x9a, 0xf0, + 0xcb, 0xc7, 0x12, 0x28, 0x92, 0xec, 0xb8, 0x6d, 0x15, 0x63, 0x8a, 0x0a, + 0xa1, 0x5e, 0x23, 0xf9, 0x83, 0x68, 0x8e, 0xf3, 0x2c, 0x46, 0x7e, 0x37, + 0x7f, 0xd2, 0x32, 0x1e, 0x79, 0x0e, 0x71, 0xe6, 0x35, 0x1c, 0x75, 0x2b, + 0x63, 0x5d, 0x36, 0x2a, 0x71, 0xe3, 0x52, 0xa5, 0x36, 0x27, 0x6f, 0xc2, + 0x3e, 0x30, 0x39, 0x2a, 0x70, 0x07, 0x2c, 0x45, 0x40, 0x06, 0x6f, 0x68, + 0x1b, 0x2e, 0x4a, 0xb8, 0x7a, 0x42, 0x18, 0xa2, 0x5a, 0x97, 0x81, 0xcd, + 0x16, 0x73, 0x6d, 0xda, 0x91, 0xc6, 0x17, 0x75, 0x71, 0x8d, 0x99, 0x48, + 0x19, 0x01, 0x15, 0x6e, 0x8f, 0x96, 0xda, 0x37, 0x12, 0x85, 0x92, 0x16, + 0xd6, 0xda, 0x0d, 0xe1, 0x91, 0x05, 0xcd, 0xc4, 0x0a, 0x33, 0x88, 0xda, + 0xb8, 0x05, 0x21, 0x3a, 0x7f, 0xf2, 0x9f, 0x35, 0x2c, 0x03, 0x79, 0x7b, + 0x8d, 0x89, 0x34, 0x8a, 0x74, 0x08, 0x7c, 0xd7, 0x39, 0x6b, 0x6f, 0x30, + 0x6c, 0xe5, 0x3e, 0x3b, 0x6b, 0x6a, 0x5e, 0x19, 0x40, 0xea, 0x68, 0xe2, + 0x4d, 0x2d, 0x43, 0xd3, 0x68, 0xbf, 0x3a, 0x25, 0x49, 0x58, 0x6b, 0x24, + 0x2a, 0x75, 0x4e, 0x34, 0x6d, 0xef, 0x1b, 0xe8, 0x5b, 0x0f, 0x77, 0xdd, + 0x19, 0x1f, 0x67, 0x4b, 0x82, 0x97, 0x18, 0xb5, 0x77, 0xf0, 0x91, 0x46, + 0x1a, 0x4c, 0x80, 0x88, 0x98, 0x17, 0x1b, 0x47, 0x13, 0x1d, 0x80, 0xfa, + 0xdf, 0x7b, 0x13, 0x6f, 0x86, 0x20, 0xda, 0xa3, 0x0c, 0xe0, 0x86, 0x44, + 0xd2, 0x1d, 0x15, 0xa0, 0x7e, 0x0d, 0xb9, 0xab, 0x28, 0x25, 0x75, 0xe7, + 0xa0, 0xbd, 0x34, 0xc5, 0x6f, 0x1f, 0x8c, 0xc4, 0x3d, 0xea, 0x69, 0x97, + 0x7b, 0xa3, 0x45, 0xcb, 0x65, 0x9d, 0x6b, 0x27, 0x4b, 0x09, 0x63, 0x26, + 0x5b, 0x76, 0x50, 0x03, 0x62, 0xaa, 0x4b, 0x22, 0x54, 0x47, 0x64, 0x36, + 0x3b, 0x15, 0x58, 0x74, 0x67, 0x79, 0x2c, 0x1f, 0x5d, 0x1a, 0x6a, 0xce, + 0x1d, 0xb3, 0x67, 0x71, 0x74, 0x69, 0x19, 0x40, 0x74, 0x30, 0x7f, 0x73, + 0x19, 0xe4, 0x81, 0xbe, 0x8b, 0x51, 0x1a, 0x7d, 0x8e, 0xeb, 0x99, 0x08, + 0x1d, 0x25, 0x19, 0xe0, 0x72, 0x45, 0xdf, 0x46, 0x15, 0xb1, 0x76, 0x13, + 0xde, 0xa8, 0x0a, 0xcb, 0x78, 0xc9, 0xdc, 0xa2, 0x21, 0x8c, 0x72, 0x23, + 0xbc, 0x64, 0x34, 0x0a, 0x6a, 0x43, 0xa0, 0xcc, 0x42, 0x01, 0x63, 0xa9, + 0x8b, 0x90, 0x4c, 0x29, 0x5f, 0x6c, 0x7a, 0xb2, 0x53, 0xf3, 0x5d, 0x03, + 0x6a, 0xb4, 0x5a, 0x2b, 0x5b, 0x22, 0x5b, 0x4e, 0x5e, 0xaa, 0x5c, 0xc5, + 0x4b, 0xcb, 0x62, 0x7c, 0x5f, 0x97, 0x3c, 0x97, 0x66, 0x5a, 0x63, 0x18, + 0x2e, 0x13, 0x6a, 0x4f, 0x67, 0x28, 0x20, 0x6b, 0x72, 0xa8, 0x6f, 0xe9, + 0x1a, 0x24, 0x7f, 0xca, 0x7c, 0x5a, 0x1b, 0xb7, 0x8b, 0xb8, 0x86, 0x98, + 0x1b, 0xf0, 0x98, 0x8d, 0x94, 0x26, 0x1f, 0x06, 0x1f, 0xcf, 0x60, 0xa5, + 0xde, 0xd7, 0x1f, 0xc2, 0x64, 0x5e, 0xde, 0x6b, 0x1a, 0x7c, 0x69, 0xc4, + 0xdf, 0xae, 0x30, 0x56, 0x64, 0x26, 0xbf, 0x17, 0x43, 0xfb, 0x5d, 0xaa, + 0xa0, 0xb5, 0x52, 0x20, 0x59, 0x3b, 0x8c, 0x0b, 0x5b, 0xab, 0x56, 0xa7, + 0x7a, 0xf6, 0x62, 0x3e, 0x54, 0xdd, 0x6b, 0x64, 0x67, 0x1c, 0x54, 0x42, + 0x5b, 0xbe, 0x6b, 0x83, 0x54, 0x82, 0x4b, 0xf1, 0x6f, 0x6d, 0x57, 0xd6, + 0x3d, 0x66, 0x73, 0x3e, 0x5b, 0xe1, 0x2f, 0xb2, 0x76, 0x3e, 0x60, 0x40, + 0x22, 0x74, 0x7e, 0x3f, 0x69, 0x00, 0x1c, 0x4e, 0x8b, 0xd5, 0x75, 0x43, + 0x1d, 0x9e, 0x96, 0xe9, 0x7e, 0x98, 0x1d, 0x8b, 0xa2, 0xfd, 0x8c, 0x1c, + 0x1f, 0xf3, 0x2b, 0xbc, 0x30, 0x33, 0xd1, 0x42, 0x2b, 0x03, 0x36, 0x32, + 0xd3, 0xc6, 0x2d, 0x02, 0x56, 0x2e, 0xe5, 0x2d, 0x42, 0x5e, 0x54, 0x9b, + 0xc2, 0x30, 0x56, 0xe7, 0x51, 0x16, 0xa1, 0x22, 0x62, 0xca, 0x4f, 0x48, + 0x8d, 0x1f, 0x6a, 0xa1, 0x4e, 0x0a, 0x7d, 0x1b, 0x6e, 0xbe, 0x4c, 0xf8, + 0x6e, 0xb2, 0x73, 0x3c, 0x4b, 0x61, 0x5d, 0x55, 0x77, 0x8f, 0x4a, 0x5d, + 0x4c, 0xf6, 0x7b, 0x6c, 0x4d, 0x13, 0x3d, 0xb2, 0x7e, 0xcb, 0x51, 0x0e, + 0x30, 0x86, 0x81, 0xe8, 0x55, 0xdc, 0x22, 0xca, 0x89, 0x28, 0x5e, 0x43, + 0x1d, 0x65, 0x96, 0x83, 0x6d, 0x3a, 0x20, 0x54, 0xa1, 0x61, 0x75, 0xa8, + 0x1f, 0x20, 0xab, 0x82, 0x7f, 0xbe, 0x1f, 0xbe, 0x2b, 0xd3, 0x30, 0x24, + 0xd1, 0x49, 0x2b, 0xd0, 0x30, 0x30, 0xd1, 0x80, 0x48, 0xf7, 0x40, 0xe8, + 0xed, 0xe8, 0x5b, 0x09, 0x42, 0xb0, 0xc9, 0x0b, 0x6b, 0x14, 0x44, 0xfc, + 0xa4, 0xe2, 0x73, 0x16, 0x45, 0x89, 0x91, 0x08, 0x77, 0x49, 0x44, 0xaa, + 0x81, 0x2e, 0x7b, 0x24, 0x43, 0x76, 0x71, 0xbe, 0x7f, 0x9b, 0x40, 0x87, + 0x5f, 0xf1, 0x82, 0xe5, 0x3f, 0x0d, 0x4f, 0x35, 0x86, 0x04, 0x3e, 0xed, + 0x3e, 0xa6, 0x89, 0x19, 0x42, 0x09, 0x30, 0x15, 0x8b, 0xd0, 0x45, 0x20, + 0x21, 0xd0, 0x94, 0x00, 0x52, 0x1f, 0x1e, 0x80, 0x9f, 0x8e, 0x5f, 0xa8, + 0x20, 0x32, 0xab, 0x58, 0x6c, 0x12, 0x1d, 0x5f, 0xae, 0x8e, 0x74, 0x7c, + 0x1d, 0xa9, 0x2c, 0x86, 0x2f, 0x31, 0xd0, 0xa7, 0x2c, 0xb4, 0x2f, 0x37, + 0xd0, 0xc6, 0x63, 0xe0, 0x2f, 0xa7, 0xf6, 0x39, 0x75, 0xd6, 0x33, 0x69, + 0xd2, 0x11, 0x7f, 0xf7, 0x38, 0x63, 0xaf, 0x92, 0x83, 0x51, 0x3a, 0xe0, + 0x99, 0x7d, 0x85, 0x86, 0x3a, 0x52, 0x88, 0x2d, 0x89, 0x72, 0x38, 0x15, + 0x76, 0xa1, 0x8c, 0x90, 0x35, 0x77, 0x64, 0x6f, 0x8e, 0xda, 0x33, 0xc4, + 0x53, 0x5c, 0x91, 0x0f, 0x31, 0x43, 0x42, 0x31, 0x93, 0x7f, 0x30, 0x30, + 0x30, 0x86, 0x96, 0x31, 0x33, 0x38, 0x21, 0x2e, 0x9e, 0x3c, 0x3e, 0x7c, + 0x1a, 0x7a, 0xaa, 0xc8, 0x50, 0x78, 0x1c, 0xfe, 0xae, 0x69, 0x59, 0xbe, + 0x1d, 0x33, 0xb5, 0xac, 0x66, 0xa3, 0x1b, 0x71, 0x2c, 0x9d, 0x2f, 0x23, + 0xd0, 0xae, 0x6f, 0xbb, 0x28, 0xf8, 0xe7, 0x4c, 0x7e, 0x9d, 0x27, 0xdc, + 0xe3, 0x1d, 0x90, 0xb0, 0x26, 0x12, 0xdc, 0x53, 0x96, 0xeb, 0x2b, 0x7e, + 0xbf, 0x85, 0x96, 0xb0, 0x2d, 0x8d, 0xa8, 0xb3, 0x97, 0x82, 0x2d, 0x85, + 0x93, 0x09, 0x99, 0x5d, 0x2b, 0x7e, 0x7e, 0x46, 0x9a, 0xa4, 0x2a, 0x15, + 0x6a, 0x45, 0x9c, 0x07, 0x28, 0x06, 0x58, 0x33, 0x9d, 0x21, 0x25, 0x35, + 0x46, 0x3d, 0x9f, 0xc0, 0x21, 0xe3, 0x33, 0xc8, 0xa4, 0x74, 0x1e, 0x49, + 0x20, 0x4f, 0xb1, 0x0d, 0x29, 0x2d, 0x1d, 0x5a, 0xbb, 0xe5, 0x3a, 0x8b, + 0x1b, 0xd6, 0xc2, 0xee, 0x4c, 0x25, 0x1e, 0x10, 0xc5, 0x56, 0x5a, 0x7f, + 0x1e, 0xd4, 0x2c, 0xb4, 0x2f, 0x14, 0xd0, 0xb5, 0x88, 0x4d, 0x26, 0xda, + 0xdf, 0xbe, 0x95, 0x18, 0x26, 0xd0, 0xdc, 0xda, 0xa4, 0x11, 0x25, 0x06, + 0xd7, 0xd1, 0xaf, 0x2b, 0x1b, 0xd6, 0xcf, 0xcb, 0xad, 0x58, 0x1d, 0x2e, + 0xb8, 0x40, 0xab, 0xa4, 0x1d, 0xad, 0x9f, 0x6b, 0xab, 0xd9, 0x1b, 0xec, + 0x87, 0x1d, 0xab, 0xec, 0x1d, 0x1f, 0x71, 0xc2, 0xac, 0x24, 0x1d, 0xf3, + 0x5f, 0x6b, 0xae, 0x53, 0x1b, 0x5e, 0x4d, 0x70, 0xaf, 0x7e, 0x19, 0x53, + 0x3a, 0xf9, 0xb8, 0xfc, 0x13, 0xc5, 0x25, 0x83, 0xc4, 0x60, 0x23, 0x9f, + 0x24, 0xb6, 0xc6, 0xf0, 0x28, 0xad, 0x25, 0xc4, 0xc7, 0xfb, 0x2a, 0xc6, + 0x26, 0x34, 0xc8, 0x2c, 0x49, 0x82, 0x22, 0xb2, 0x8a, 0xbb, 0x26, 0xa2, + 0xde, 0xc5, 0x99, 0x39, 0x27, 0x07, 0xdc, 0x60, 0xa4, 0x4c, 0x26, 0x62, + 0xd9, 0x84, 0xaf, 0x52, 0x23, 0xec, 0xd7, 0xe3, 0xbe, 0x5b, 0x1d, 0x11, + 0xd5, 0x98, 0xc5, 0xbd, 0x1d, 0xc8, 0xc9, 0x48, 0xc5, 0x23, 0x1e, 0xa0, + 0xb3, 0x47, 0xc4, 0xce, 0x1c, 0xd0, 0x9a, 0x17, 0xc3, 0xfb, 0x1c, 0x31, + 0x81, 0x48, 0xc2, 0xf0, 0x1b, 0xf8, 0x6d, 0x72, 0xc3, 0x21, 0x19, 0xf2, + 0x5a, 0x1d, 0xc4, 0x7b, 0x19, 0x80, 0x47, 0xd8, 0xc6, 0xe1, 0x17, 0xca, + 0x2c, 0x9d, 0xc9, 0x75, 0x27, 0xbe, 0x29, 0xae, 0xc9, 0xe7, 0x28, 0xc8, + 0x28, 0x54, 0xca, 0x1a, 0x2a, 0x85, 0x28, 0x0b, 0xca, 0x39, 0x2b, 0xa0, + 0x27, 0xde, 0x9d, 0x3c, 0x27, 0x31, 0xdb, 0xdd, 0xa3, 0xae, 0x26, 0xd6, + 0xda, 0x17, 0xac, 0xb5, 0x25, 0x7f, 0xd8, 0x9c, 0xc0, 0xc1, 0x21, 0x56, + 0xda, 0x42, 0xcb, 0xd4, 0x1e, 0x1e, 0xd6, 0xe7, 0xcc, 0x01, 0x20, 0x52, + 0xca, 0x94, 0xcc, 0xef, 0x1f, 0x86, 0xb9, 0x23, 0xcc, 0xc9, 0x1d, 0x2a, + 0xa1, 0x84, 0xcb, 0xb5, 0x1c, 0xb2, 0x87, 0xe5, 0xca, 0x51, 0x1d, 0x63, + 0x74, 0xb5, 0xca, 0x26, 0x1e, 0xb5, 0x62, 0x16, 0xca, 0xa6, 0x1f, 0x2e, + 0x52, 0x0d, 0xcc, 0x1e, 0x1c, 0x10, 0x36, 0x60, 0xcb, 0x58, 0x26, 0x12, + 0x2a, 0x90, 0xcb, 0x39, 0x28, 0x61, 0x29, 0xbd, 0xcb, 0x24, 0x29, 0xdb, + 0x29, 0x3c, 0xcb, 0x14, 0x2a, 0xe2, 0x28, 0xe5, 0x1e, 0x52, 0xac, 0x3f, + 0xb7, 0x07, 0x20, 0x91, 0xab, 0x46, 0xaf, 0x6b, 0x20, 0xb7, 0xaa, 0xf0, + 0xad, 0xa4, 0x21, 0xa5, 0xac, 0x75, 0xaa, 0xd3, 0x22, 0x09, 0xaf, 0xc5, + 0xa7, 0xa1, 0x23, 0x71, 0xa7, 0x95, 0x9a, 0x43, 0x27, 0x03, 0xa5, 0xca, + 0x94, 0x68, 0x27, 0x31, 0xa5, 0x61, 0x91, 0xf2, 0x28, 0x78, 0xa5, 0x39, + 0x87, 0x27, 0x29, 0xd0, 0xa4, 0x7e, 0x7e, 0x08, 0x29, 0x68, 0xa3, 0x93, + 0x74, 0xc1, 0x25, 0x7f, 0xa3, 0x1d, 0x64, 0x9f, 0x24, 0xae, 0xa2, 0x70, + 0x5f, 0xb4, 0x18, 0x77, 0xa4, 0x19, 0x26, 0x2c, 0x1f, 0xa0, 0xb0, 0x47, + 0x24, 0x88, 0x24, 0x03, 0xbb, 0xf2, 0x24, 0xfb, 0x26, 0x29, 0xbf, 0x24, + 0x24, 0x6a, 0x1c, 0x5e, 0xac, 0x43, 0xc3, 0xea, 0x1d, 0xe5, 0xab, 0x7c, + 0xb8, 0x4b, 0x20, 0x50, 0xaa, 0x39, 0xae, 0xa3, 0x20, 0x7c, 0xa9, 0x8e, + 0xac, 0x09, 0x21, 0xca, 0xaa, 0x76, 0xa7, 0x7a, 0x24, 0x55, 0xa4, 0x88, + 0x9c, 0xa3, 0x23, 0x64, 0xa4, 0xc2, 0x95, 0x34, 0x26, 0xe1, 0xa2, 0x86, + 0x90, 0x14, 0x27, 0x75, 0xa2, 0xbc, 0x86, 0x25, 0x29, 0xe7, 0xa1, 0x76, + 0x7a, 0xb3, 0x28, 0x69, 0x9b, 0x8a, 0x6d, 0x72, 0x24, 0x83, 0x9f, 0x78, + 0x60, 0xc8, 0x15, 0x7a, 0x9c, 0x11, 0x3e, 0x5d, 0x16, 0x2b, 0x98, 0xc1, + 0x21, 0x8f, 0x1d, 0x37, 0x9f, 0xa9, 0x1e, 0xaa, 0x22, 0xad, 0xaa, 0x50, + 0x1e, 0xb5, 0x25, 0xb1, 0xb2, 0x61, 0x1f, 0x51, 0x16, 0x36, 0xb4, 0xe6, + 0xd7, 0x1e, 0x1b, 0xd9, 0xab, 0x14, 0xc3, 0x0e, 0x1c, 0x0b, 0xaa, 0xa0, + 0xbb, 0x7e, 0x1d, 0x91, 0xa9, 0x07, 0xaf, 0x35, 0x1f, 0xfd, 0xa6, 0x83, + 0xa8, 0x7a, 0x23, 0x75, 0xa3, 0x3c, 0x9d, 0x1f, 0x24, 0x6f, 0x9f, 0x17, + 0x95, 0x2e, 0x24, 0xa3, 0x9a, 0x76, 0x89, 0x22, 0x29, 0xf4, 0x8f, 0xcf, + 0x7a, 0x56, 0x2b, 0x1d, 0x8c, 0xa0, 0x6e, 0xea, 0x28, 0x9c, 0x88, 0xf1, + 0x60, 0xd2, 0x20, 0x76, 0x8f, 0x36, 0x4c, 0xcb, 0x1d, 0x3d, 0x8c, 0x83, + 0x30, 0x52, 0x1c, 0xe3, 0x91, 0x1b, 0x20, 0x0d, 0x1d, 0xec, 0x94, 0x8b, + 0x17, 0x98, 0x23, 0xb9, 0x9d, 0x25, 0x18, 0x9d, 0x27, 0xa3, 0xa5, 0x01, + 0x1a, 0x68, 0x16, 0x4f, 0xac, 0x0b, 0xd8, 0x49, 0x13, 0xe3, 0xb0, 0x36, + 0xd5, 0xdf, 0x1a, 0xde, 0xa8, 0xd9, 0xc1, 0x6a, 0x1a, 0xb1, 0xa7, 0x67, + 0xb9, 0x26, 0x1b, 0x99, 0xa3, 0xe9, 0xab, 0xfa, 0x21, 0xa7, 0x9c, 0xdd, + 0x9c, 0xda, 0x25, 0xaf, 0x93, 0x4f, 0x8b, 0x29, 0x29, 0xd2, 0x90, 0x10, + 0x82, 0x34, 0x2d, 0x59, 0x8d, 0xdb, 0x77, 0x15, 0x2d, 0xba, 0x8a, 0xe9, + 0x68, 0x62, 0x2c, 0xd6, 0x87, 0xbd, 0x57, 0xa3, 0x26, 0xe7, 0x85, 0xd2, + 0x42, 0x23, 0x21, 0x31, 0x83, 0xe0, 0x28, 0x12, 0x24, 0xfe, 0x87, 0xc6, + 0x1b, 0x2f, 0x25, 0x34, 0x8a, 0xc0, 0x0f, 0xfd, 0x42, 0x07, 0x95, 0xc8, + 0x10, 0x67, 0x55, 0xa1, 0xa0, 0x6d, 0x12, 0x72, 0x18, 0x04, 0xa7, 0x3d, + 0xd8, 0xb6, 0x15, 0x87, 0xa9, 0x3c, 0xd6, 0x55, 0x10, 0x54, 0xa9, 0xd8, + 0xd2, 0x53, 0x14, 0x49, 0xa3, 0xd4, 0xbe, 0xbf, 0x1d, 0x4a, 0x97, 0x1c, + 0xa8, 0xda, 0x24, 0xeb, 0x93, 0x42, 0x99, 0x3f, 0x29, 0xa3, 0x8f, 0x63, + 0x8c, 0x57, 0x30, 0x41, 0x8a, 0x07, 0x7e, 0xc8, 0x33, 0x45, 0x85, 0xbb, + 0x71, 0x21, 0x33, 0x97, 0x82, 0xe3, 0x61, 0x8b, 0x32, 0xf3, 0x80, 0x4b, + 0x4e, 0xd5, 0x30, 0x87, 0x7e, 0x14, 0x38, 0xce, 0x34, 0x0f, 0x7e, 0x3d, + 0x24, 0xbf, 0x38, 0x97, 0x81, 0x7c, 0x17, 0x40, 0x46, 0xec, 0x8d, 0x2f, + 0x13, 0xbf, 0x58, 0xdb, 0x94, 0x52, 0x14, 0x74, 0x6c, 0x03, 0xa1, 0x59, + 0x15, 0x85, 0x17, 0xb3, 0x9d, 0x68, 0xda, 0x3e, 0x15, 0x5e, 0xa0, 0x41, + 0xd7, 0x90, 0x13, 0xdc, 0xa0, 0xd2, 0xd1, 0xd2, 0x0f, 0xa2, 0x9c, 0x78, + 0xc4, 0x5c, 0x1f, 0x86, 0x92, 0x3d, 0xab, 0xe2, 0x29, 0x42, 0x8c, 0x20, + 0x99, 0x48, 0x31, 0xca, 0x86, 0x8a, 0x87, 0xfc, 0x36, 0x6b, 0x81, 0x6c, + 0x79, 0xd3, 0x39, 0x3a, 0x7c, 0xb3, 0x6a, 0xdf, 0x3b, 0xb3, 0x79, 0xd5, + 0x5a, 0x0c, 0x3d, 0x09, 0x77, 0xbf, 0x46, 0x17, 0x41, 0x08, 0x78, 0x26, + 0x33, 0x91, 0x46, 0x8d, 0x79, 0xbc, 0x22, 0xc7, 0x4e, 0x63, 0x7e, 0x7b, + 0x18, 0x41, 0x5e, 0x28, 0x86, 0xb6, 0x16, 0x16, 0x6f, 0x32, 0x96, 0x66, + 0x1a, 0xda, 0x77, 0xdb, 0x9d, 0x50, 0x1a, 0xed, 0x18, 0x1d, 0x93, 0x8a, + 0xdd, 0x57, 0x16, 0x16, 0x96, 0xc0, 0xdb, 0x24, 0x13, 0x31, 0x97, 0x10, + 0xd4, 0x7b, 0x12, 0x1e, 0x91, 0xf7, 0xc3, 0x93, 0x25, 0x85, 0x89, 0x07, + 0xab, 0xfa, 0x32, 0x4e, 0x81, 0xe4, 0x97, 0x4e, 0x39, 0xe7, 0x7c, 0xa0, + 0x85, 0x86, 0x40, 0xcc, 0x77, 0xec, 0x75, 0x98, 0x45, 0x9a, 0x74, 0x5d, + 0x66, 0x0a, 0x49, 0x5e, 0x72, 0x01, 0x55, 0xe0, 0x4c, 0xd8, 0x71, 0x61, + 0x43, 0xa2, 0x52, 0xc5, 0x73, 0xfe, 0x33, 0xa2, 0x57, 0xc8, 0x76, 0x9a, + 0x24, 0x4c, 0x5e, 0xaf, 0x7b, 0xb2, 0x19, 0x39, 0x6c, 0x80, 0x88, 0x14, + 0x18, 0xbc, 0x7a, 0x6a, 0x95, 0x7b, 0x1a, 0x7c, 0x82, 0xa1, 0x99, 0xb6, + 0x1b, 0x87, 0x19, 0x5d, 0x87, 0x9e, 0xe1, 0x8f, 0x17, 0xf3, 0x8b, 0x4f, + 0xdf, 0x27, 0x14, 0x3b, 0x8d, 0x43, 0xda, 0x59, 0x1e, 0x2a, 0x86, 0xd5, + 0xc5, 0x76, 0x30, 0x37, 0x7e, 0x4c, 0xab, 0x4d, 0x3c, 0x6e, 0x77, 0x8e, + 0x97, 0x22, 0x46, 0xac, 0x72, 0x25, 0x85, 0x86, 0x4e, 0x2e, 0x6e, 0xa5, + 0x74, 0x89, 0x53, 0xc2, 0x6c, 0x39, 0x64, 0x6b, 0x58, 0xd8, 0x6b, 0xba, + 0x53, 0xd0, 0x5d, 0x0e, 0x6c, 0xe1, 0x43, 0xfb, 0x61, 0xae, 0x70, 0x4d, + 0x34, 0xcd, 0x66, 0x6a, 0x73, 0xad, 0x26, 0x58, 0x6a, 0xe5, 0x78, 0x2f, + 0x19, 0x79, 0x78, 0x34, 0x83, 0x46, 0x19, 0xc1, 0x85, 0xca, 0x91, 0xd3, + 0x1c, 0x07, 0x91, 0x24, 0x9a, 0x9c, 0x1d, 0x4c, 0x1c, 0xac, 0x76, 0xeb, + 0xe3, 0x1f, 0x1a, 0xc8, 0x7b, 0x39, 0xe4, 0x16, 0x15, 0xb7, 0x82, 0x21, + 0xe7, 0x7b, 0x2b, 0x65, 0x7a, 0xc7, 0xc7, 0xe9, 0x3d, 0x52, 0x72, 0xa2, + 0xab, 0x4f, 0x4b, 0x36, 0x6c, 0x41, 0x96, 0x61, 0x55, 0x75, 0x68, 0x79, + 0x85, 0x05, 0x5c, 0xff, 0x66, 0x13, 0x74, 0x70, 0x63, 0x6c, 0x64, 0x67, + 0x64, 0x98, 0x67, 0x71, 0x65, 0x42, 0x54, 0x49, 0x6a, 0xf8, 0x68, 0x11, + 0x45, 0x62, 0x6e, 0xf0, 0x6b, 0xc1, 0x36, 0x6f, 0x72, 0xd0, 0x6f, 0x2a, + 0x28, 0x50, 0x75, 0xf8, 0x73, 0x7d, 0x1a, 0x52, 0x82, 0xe8, 0x80, 0x03, + 0x1b, 0xaa, 0x8e, 0xe5, 0x8a, 0xdd, 0x1c, 0xfb, 0x9c, 0xff, 0x98, 0xbf, + 0x1f, 0x8a, 0x23, 0xe9, 0x65, 0xe5, 0xe1, 0x73, 0x24, 0x62, 0x6a, 0x7d, + 0xe3, 0x8d, 0x26, 0x86, 0x73, 0x11, 0xea, 0xac, 0x3c, 0x3a, 0x6c, 0x5b, + 0xca, 0x31, 0x4e, 0x80, 0x66, 0x34, 0xab, 0xca, 0x5b, 0xd8, 0x61, 0xdf, + 0x96, 0xb1, 0x65, 0x8e, 0x5f, 0x71, 0x85, 0x68, 0x6b, 0xc9, 0x5e, 0x28, + 0x75, 0x0d, 0x70, 0xa7, 0x5d, 0x44, 0x64, 0xc2, 0x74, 0xb1, 0x5d, 0x22, + 0x54, 0xac, 0x78, 0x7d, 0x60, 0x3a, 0x45, 0xe2, 0x7b, 0xe4, 0x64, 0x1d, + 0x37, 0x7f, 0x7f, 0x30, 0x68, 0x4d, 0x29, 0xf6, 0x81, 0x9a, 0x6d, 0x18, + 0x1d, 0x06, 0x8f, 0x2c, 0x79, 0x8d, 0x1e, 0x3e, 0x99, 0xb4, 0x82, 0xb0, + 0x1e, 0x60, 0xa7, 0xcc, 0x91, 0x5f, 0x20, 0x32, 0x2b, 0xc8, 0x30, 0x3d, + 0xd1, 0x4d, 0x2e, 0x91, 0x54, 0x36, 0xe2, 0x18, 0x3a, 0x40, 0x5f, 0xdb, + 0xef, 0x9f, 0x4f, 0xf5, 0x5d, 0x40, 0xcd, 0xf9, 0x61, 0xbd, 0x5a, 0x29, + 0xac, 0x3b, 0x6c, 0xa8, 0x58, 0x56, 0x97, 0xc4, 0x74, 0x56, 0x57, 0x0c, + 0x87, 0x29, 0x78, 0xc0, 0x56, 0x59, 0x78, 0x3b, 0x7d, 0x5b, 0x54, 0xc7, + 0x66, 0x85, 0x81, 0x15, 0x53, 0xa7, 0x55, 0x98, 0x85, 0x1c, 0x56, 0x3f, + 0x46, 0x2e, 0x88, 0x05, 0x59, 0xb3, 0x37, 0xe8, 0x8a, 0x7a, 0x5d, 0x68, + 0x2a, 0xb3, 0x8c, 0x87, 0x64, 0xd3, 0x1f, 0x37, 0x98, 0xd0, 0x70, 0x07, + 0x1f, 0x5f, 0xa4, 0xb0, 0x79, 0x35, 0x1e, 0xfa, 0xad, 0xf7, 0x83, 0x4f, + 0x1f, 0xfb, 0x2b, 0xc3, 0x30, 0x26, 0xd1, 0x75, 0x2c, 0xfe, 0x2e, 0x97, + 0xd2, 0x7b, 0x57, 0x0d, 0x4b, 0x13, 0xf7, 0xb0, 0x67, 0xe1, 0x4d, 0x9e, + 0xd3, 0xb5, 0x76, 0x03, 0x4e, 0x8b, 0xb0, 0x32, 0x7d, 0x14, 0x4f, 0x34, + 0x9b, 0xbf, 0x81, 0x39, 0x4e, 0x54, 0x8b, 0x16, 0x85, 0x57, 0x4d, 0x2a, + 0x7a, 0xaf, 0x89, 0xe2, 0x4a, 0x80, 0x68, 0x61, 0x8d, 0x38, 0x49, 0x49, + 0x57, 0xa6, 0x90, 0x77, 0x4a, 0x0e, 0x47, 0xb4, 0x93, 0x62, 0x4c, 0xc9, + 0x38, 0x0c, 0x95, 0x9c, 0x50, 0x83, 0x2b, 0x1f, 0x97, 0xb8, 0x55, 0xa3, + 0x1e, 0x9b, 0xa2, 0xca, 0x63, 0x1b, 0x1f, 0x9d, 0xad, 0x3f, 0x6f, 0x1d, + 0x1d, 0x45, 0xb2, 0xb3, 0x77, 0x4f, 0x1d, 0xff, 0x2c, 0xef, 0x2e, 0x69, + 0xd2, 0x5f, 0x2d, 0x30, 0x2e, 0x74, 0xd2, 0x8a, 0x71, 0x63, 0x3a, 0x03, + 0xff, 0xff, 0x82, 0xdf, 0x3d, 0xf9, 0xdb, 0xfe, 0x8a, 0xf2, 0x42, 0x90, + 0xbc, 0x4d, 0x8d, 0x7c, 0x44, 0xa8, 0xa3, 0xc3, 0x8f, 0x26, 0x44, 0xe2, + 0x91, 0xc8, 0x93, 0x59, 0x42, 0xcd, 0x7e, 0xb7, 0x96, 0xfc, 0x3f, 0x57, + 0x6c, 0x13, 0x99, 0x96, 0x3d, 0xab, 0x5b, 0x35, 0x9b, 0xe9, 0x3c, 0x38, + 0x4a, 0x8c, 0x9e, 0x92, 0x3b, 0x3a, 0x39, 0x12, 0xa1, 0x9b, 0x3d, 0x89, + 0x29, 0x69, 0xa3, 0xf8, 0x42, 0x10, 0x1a, 0x81, 0xad, 0xb7, 0x53, 0x55, + 0x1c, 0xbf, 0xb4, 0x1e, 0x5e, 0x85, 0x19, 0xe0, 0xbc, 0x9a, 0x6d, 0xe2, + 0x1a, 0x35, 0x2c, 0xa9, 0x2f, 0x2d, 0xd0, 0xba, 0x76, 0xd1, 0x2c, 0x60, + 0xea, 0xbe, 0x88, 0xe7, 0x2c, 0x93, 0xe7, 0xdc, 0x9f, 0x1f, 0x30, 0xf4, + 0xe7, 0x16, 0xa2, 0x50, 0x34, 0x23, 0xcc, 0x66, 0xa0, 0xb7, 0x37, 0xac, + 0xb1, 0x90, 0xa0, 0x34, 0x38, 0x0d, 0x9b, 0xf3, 0xa3, 0x1c, 0x35, 0x9a, + 0x85, 0x73, 0xa5, 0x50, 0x33, 0x78, 0x71, 0xc6, 0xa6, 0xf5, 0x31, 0xae, + 0x5f, 0xee, 0xa8, 0x8b, 0x2f, 0xd0, 0x4e, 0x8b, 0xab, 0xf1, 0x2a, 0xb6, + 0x3b, 0x70, 0xaf, 0x61, 0x27, 0x37, 0x27, 0x90, 0xb9, 0x77, 0x2d, 0x2d, + 0x1d, 0x24, 0xc2, 0x37, 0x40, 0xa9, 0x1e, 0x32, 0xc5, 0x9c, 0x52, 0x36, + 0x1f, 0x92, 0xc6, 0xb6, 0x61, 0xb5, 0x1f, 0x60, 0x7f, 0x38, 0x29, 0x91, + 0xe5, 0x5d, 0x8c, 0xad, 0x29, 0x43, 0xe2, 0x2b, 0x9b, 0x4b, 0x29, 0xd8, + 0xdf, 0xf8, 0xab, 0x06, 0x29, 0x6f, 0xdd, 0x32, 0xba, 0xb1, 0x24, 0xeb, + 0xdc, 0x71, 0xb8, 0xee, 0x26, 0xc9, 0xc3, 0x80, 0xb7, 0x15, 0x26, 0xe1, + 0xa9, 0xe9, 0xb6, 0xdc, 0x25, 0x54, 0x90, 0x4d, 0xb6, 0xcc, 0x24, 0x25, + 0x7a, 0x34, 0xb6, 0x5b, 0x23, 0x1f, 0x66, 0x11, 0xb6, 0xf1, 0x1f, 0xf1, + 0x53, 0x40, 0xb9, 0xa8, 0x19, 0x75, 0x3e, 0x01, 0xbd, 0x7c, 0x12, 0xb9, + 0x28, 0xf4, 0xc7, 0x6e, 0x26, 0x71, 0x26, 0xd2, 0xc8, 0xb5, 0x2a, 0x53, + 0x26, 0xfc, 0xc9, 0x4a, 0x3f, 0x7b, 0x23, 0xc8, 0xc9, 0xbe, 0x52, 0x16, + 0x22, 0xe8, 0x8d, 0x88, 0x28, 0x45, 0xe0, 0x7a, 0x9e, 0x2b, 0x28, 0xd7, + 0xde, 0x07, 0xa9, 0x1e, 0x28, 0x81, 0xdc, 0x16, 0xb5, 0x30, 0x27, 0x14, + 0xdb, 0xae, 0xc5, 0x2c, 0x21, 0xe7, 0xdb, 0xf2, 0xcd, 0xde, 0x1e, 0x6d, + 0xd0, 0x83, 0xca, 0x96, 0x1f, 0x38, 0xb7, 0x72, 0xca, 0x9e, 0x1d, 0x06, + 0x9d, 0xb5, 0xc9, 0x34, 0x1d, 0x50, 0x84, 0x3d, 0xc8, 0x01, 0x1e, 0x2d, + 0x70, 0x53, 0xc8, 0xf2, 0x1e, 0x58, 0x5d, 0x0d, 0xc9, 0x88, 0x1c, 0xd5, + 0x4b, 0x0e, 0xcb, 0x13, 0x1b, 0x74, 0x2f, 0xcf, 0xcb, 0x36, 0x27, 0x3a, + 0x2a, 0x11, 0xcb, 0x16, 0x29, 0xe7, 0x29, 0x2b, 0xcb, 0x02, 0x2b, 0x63, + 0x28, 0xb1, 0xca, 0xf5, 0x2c, 0x53, 0x28, 0x65, 0xa0, 0x31, 0x28, 0x72, + 0xdd, 0x1c, 0xa7, 0xd0, 0x28, 0x38, 0xdb, 0xc0, 0xae, 0xd8, 0x27, 0x3e, + 0xda, 0xb8, 0xc3, 0xb6, 0x23, 0xe6, 0xdd, 0x1f, 0xd3, 0x70, 0x1f, 0x48, + 0xdd, 0x5d, 0xd0, 0xfd, 0x21, 0x03, 0xcf, 0x6e, 0xd1, 0xbb, 0x20, 0x11, + 0xbc, 0xc1, 0xd1, 0xd2, 0x1d, 0x76, 0xa4, 0x9c, 0xd0, 0x10, 0x1e, 0x05, + 0x8a, 0x84, 0xcd, 0xd7, 0x20, 0x20, 0x77, 0x1b, 0xcd, 0x26, 0x21, 0x09, + 0x64, 0x14, 0xcd, 0x6b, 0x21, 0x4a, 0x53, 0xb1, 0xce, 0xa6, 0x1e, 0x5a, + 0x38, 0x71, 0xcc, 0x88, 0x27, 0x31, 0x2b, 0x69, 0xcc, 0x22, 0x29, 0x3f, + 0x2a, 0x64, 0xcb, 0xe1, 0x2a, 0x90, 0x29, 0xc3, 0xcb, 0xb4, 0x2b, 0x7a, + 0x29, 0x57, 0x1e, 0xe1, 0xad, 0xdb, 0xb9, 0x26, 0x20, 0xf0, 0xad, 0x2c, + 0xb1, 0x62, 0x21, 0x1e, 0xad, 0x1d, 0xaf, 0xe1, 0x22, 0x48, 0xaf, 0xea, + 0xad, 0x45, 0x22, 0x63, 0xb3, 0x4b, 0xaa, 0xe7, 0x23, 0x2c, 0xab, 0x21, + 0x9d, 0xae, 0x27, 0x3b, 0xa8, 0x5e, 0x96, 0x8b, 0x27, 0x99, 0xa7, 0x76, + 0x93, 0xdc, 0x28, 0xc0, 0xa7, 0x02, 0x88, 0x79, 0x29, 0xf3, 0xa5, 0xd8, + 0x7e, 0xe6, 0x29, 0x80, 0xa5, 0x47, 0x75, 0x2d, 0x25, 0xe6, 0xa5, 0x2e, + 0x65, 0xd0, 0x18, 0x93, 0xa5, 0x97, 0x45, 0x55, 0x1e, 0x0c, 0xbc, 0xd5, + 0x28, 0xdf, 0x23, 0x85, 0xc3, 0x5c, 0x28, 0x32, 0x26, 0x8a, 0xc6, 0xbf, + 0x27, 0xcf, 0x28, 0x26, 0xc7, 0x2e, 0x27, 0x0d, 0x1d, 0x26, 0xae, 0x18, + 0xc5, 0xea, 0x1d, 0x81, 0xae, 0x2d, 0xbe, 0x86, 0x20, 0xcf, 0xac, 0xba, + 0xb1, 0x3a, 0x21, 0x0a, 0xac, 0x8f, 0xaf, 0x1e, 0x22, 0x7b, 0xaf, 0x2b, + 0xab, 0x3c, 0x21, 0xb5, 0xb0, 0xb4, 0xa7, 0x3d, 0x23, 0x7c, 0xa9, 0x6c, + 0x99, 0x83, 0x27, 0x46, 0xa6, 0xd1, 0x93, 0x9d, 0x27, 0xe8, 0xa6, 0x2b, + 0x88, 0xba, 0x29, 0xda, 0xa4, 0xdb, 0x7e, 0x6e, 0x29, 0x06, 0xa3, 0x14, + 0x71, 0x02, 0x25, 0x39, 0xa3, 0x05, 0x62, 0xcd, 0x16, 0x95, 0xa1, 0xcb, + 0x40, 0x7a, 0x1a, 0xf0, 0xa6, 0x53, 0x25, 0x0d, 0x22, 0x0b, 0xb1, 0x3e, + 0x23, 0x01, 0x25, 0xe8, 0xbb, 0x2f, 0x23, 0x4f, 0x27, 0xfa, 0xbd, 0xea, + 0x22, 0xc0, 0x17, 0xbe, 0xb7, 0xad, 0xd9, 0x4b, 0x1c, 0xe0, 0xad, 0x7c, + 0xc5, 0xaf, 0x1d, 0x28, 0xad, 0x73, 0xbe, 0xd4, 0x1e, 0xb1, 0xac, 0x62, + 0xb3, 0x17, 0x20, 0xdf, 0xab, 0x53, 0xad, 0x70, 0x22, 0x66, 0xab, 0xa7, + 0xa6, 0x4c, 0x23, 0xec, 0xa5, 0xe3, 0x9b, 0xc3, 0x23, 0xed, 0xa1, 0xc2, + 0x90, 0x14, 0x29, 0x97, 0x9c, 0xd1, 0x84, 0x69, 0x2d, 0x55, 0x98, 0x71, + 0x76, 0xcf, 0x2b, 0x5c, 0x95, 0xc2, 0x66, 0xcf, 0x1f, 0xc2, 0x96, 0x78, + 0x4f, 0xd8, 0x16, 0xb0, 0x99, 0x28, 0x36, 0x67, 0x1a, 0x2c, 0x99, 0xcd, + 0x1e, 0x2b, 0x22, 0x2a, 0xa1, 0x77, 0x1b, 0xf2, 0x26, 0xb8, 0xab, 0x1a, + 0x1c, 0x68, 0x29, 0xd2, 0xb1, 0xd1, 0x1e, 0x04, 0x17, 0xe9, 0xae, 0x66, + 0xda, 0xfa, 0x16, 0x2b, 0xb4, 0x3f, 0xd8, 0xde, 0x1c, 0x5c, 0xac, 0x52, + 0xc5, 0x3f, 0x1c, 0x77, 0xab, 0xe2, 0xbe, 0x40, 0x1d, 0xbd, 0xaa, 0x2e, + 0xb2, 0xde, 0x25, 0x4a, 0xa3, 0x09, 0xa3, 0x6f, 0x28, 0xfb, 0x9e, 0x16, + 0x96, 0xb4, 0x2d, 0x76, 0x9a, 0xf7, 0x8b, 0xe9, 0x31, 0x14, 0x96, 0x33, + 0x7e, 0xe6, 0x32, 0x70, 0x93, 0x16, 0x70, 0xd0, 0x31, 0x1d, 0x8f, 0xfd, + 0x60, 0x40, 0x2b, 0xb5, 0x8f, 0x72, 0x48, 0x20, 0x25, 0x3b, 0x8d, 0x8d, + 0x2d, 0xd5, 0x25, 0xd7, 0x8c, 0x9c, 0x15, 0xee, 0x27, 0x4c, 0x94, 0xb8, + 0x11, 0x51, 0x41, 0xce, 0x9d, 0x77, 0x0f, 0x40, 0x62, 0xd0, 0xaa, 0x32, + 0x11, 0x45, 0x19, 0x92, 0xab, 0x0d, 0xdb, 0xc8, 0x17, 0xc1, 0xac, 0x7c, + 0xda, 0x0d, 0x13, 0xaa, 0xaf, 0x57, 0xd7, 0x51, 0x17, 0x68, 0xaa, 0x69, + 0xc6, 0x0b, 0x1d, 0x1d, 0xa3, 0xa4, 0xb7, 0x00, 0x28, 0xa8, 0x9d, 0xd8, + 0xa4, 0x53, 0x2e, 0xbb, 0x97, 0xdf, 0x95, 0x5c, 0x33, 0xc2, 0x92, 0xaa, + 0x86, 0xa5, 0x37, 0x2b, 0x8e, 0x24, 0x78, 0xdc, 0x38, 0x1a, 0x8a, 0xb1, + 0x69, 0xb3, 0x37, 0xaa, 0x87, 0xff, 0x56, 0xd5, 0x36, 0xe1, 0x87, 0x04, + 0x40, 0x1c, 0x39, 0x93, 0x87, 0xb7, 0x2a, 0xba, 0x3c, 0xe3, 0x86, 0xf3, + 0x16, 0x6a, 0x4a, 0x35, 0x91, 0x8b, 0x13, 0x7a, 0x5d, 0x25, 0x9c, 0x5d, + 0x14, 0x3b, 0x6b, 0xf5, 0xa7, 0xaf, 0x14, 0x53, 0x19, 0xe9, 0xa0, 0xfd, + 0xdd, 0x22, 0x1a, 0xc9, 0xa3, 0x6a, 0xda, 0x68, 0x17, 0x6a, 0xa6, 0xc5, + 0xd7, 0xe0, 0x0f, 0x2d, 0xa6, 0x8c, 0xcf, 0xcb, 0x21, 0xac, 0x9d, 0x17, + 0xb8, 0x38, 0x2f, 0x83, 0x94, 0x72, 0xa2, 0xbb, 0x36, 0xae, 0x8e, 0x8b, + 0x91, 0x1b, 0x3c, 0x38, 0x8a, 0x13, 0x82, 0x82, 0x40, 0xcf, 0x85, 0x49, + 0x73, 0x7d, 0x42, 0xa5, 0x82, 0x89, 0x62, 0x4f, 0x44, 0x52, 0x80, 0x4b, + 0x4e, 0x56, 0x48, 0x42, 0x80, 0xb2, 0x3a, 0x15, 0x4e, 0x5e, 0x83, 0x05, + 0x2b, 0x3e, 0x55, 0x1e, 0x83, 0x55, 0x19, 0x8a, 0x63, 0xfe, 0x8d, 0xe5, + 0x16, 0x82, 0x70, 0x6e, 0x98, 0x34, 0x17, 0x6a, 0x7c, 0x65, 0xa1, 0x9a, + 0x1b, 0xb1, 0x1a, 0xc5, 0x97, 0x83, 0xe0, 0x74, 0x1b, 0x38, 0x99, 0xb0, + 0xdd, 0xdb, 0x18, 0x89, 0x9d, 0x1d, 0xdb, 0x36, 0x1b, 0x04, 0x9b, 0x57, + 0xcf, 0x31, 0x2b, 0xa9, 0x92, 0x54, 0xb7, 0xe9, 0x38, 0x89, 0x8a, 0x76, + 0xa2, 0x06, 0x42, 0x12, 0x85, 0x0a, 0x8f, 0x6c, 0x48, 0xd9, 0x80, 0xf4, + 0x7e, 0xa2, 0x4e, 0x14, 0x7d, 0x93, 0x6e, 0xfd, 0x52, 0x42, 0x7b, 0x55, + 0x5e, 0x47, 0x55, 0xdc, 0x7a, 0x6f, 0x4b, 0xee, 0x5a, 0x62, 0x7c, 0x76, + 0x3a, 0xbc, 0x5f, 0xca, 0x7f, 0x84, 0x2c, 0xe5, 0x66, 0xcf, 0x82, 0x3c, + 0x1f, 0x22, 0x6f, 0xf6, 0x8c, 0x3d, 0x19, 0x42, 0x7c, 0xd3, 0x97, 0xa0, + 0x1a, 0xc5, 0x8d, 0x80, 0xa1, 0xeb, 0x1d, 0x69, 0x1d, 0xee, 0x8b, 0x1c, + 0xe2, 0xc7, 0x1d, 0x6e, 0x8f, 0xd3, 0xe2, 0x39, 0x1c, 0xb2, 0x93, 0x60, + 0xe1, 0x42, 0x27, 0x20, 0x8f, 0x74, 0xd0, 0x3d, 0x37, 0xfb, 0x86, 0xdc, + 0xb6, 0x5e, 0x44, 0xf8, 0x80, 0x1d, 0xa1, 0xac, 0x4f, 0x58, 0x7a, 0xfc, + 0x8f, 0x3f, 0x56, 0xc8, 0x77, 0xdb, 0x7d, 0xd6, 0x5c, 0xe6, 0x75, 0x7f, + 0x6d, 0xb4, 0x61, 0xbc, 0x74, 0xca, 0x5c, 0xc0, 0x66, 0x00, 0x75, 0xc8, + 0x4c, 0x6a, 0x6a, 0x2f, 0x78, 0xa7, 0x3c, 0xcd, 0x6e, 0x67, 0x7b, 0xde, + 0x2e, 0x64, 0x73, 0x88, 0x7f, 0xff, 0x20, 0x36, 0x7c, 0x19, 0x87, 0xea, + 0x19, 0xf4, 0x89, 0x03, 0x95, 0xb5, 0x1c, 0x7f, 0x97, 0x78, 0xa2, 0x5c, + 0x1e, 0x41, 0x20, 0x54, 0x7b, 0x2f, 0xe5, 0xd1, 0x22, 0x09, 0x7f, 0x0a, + 0xe5, 0x9b, 0x26, 0x1f, 0x84, 0xe2, 0xe5, 0x75, 0x36, 0x87, 0x82, 0xee, + 0xd1, 0x8c, 0x47, 0x70, 0x7b, 0x09, 0xb6, 0x60, 0x54, 0xa1, 0x74, 0xd5, + 0xa1, 0x48, 0x5e, 0x5b, 0x71, 0x3f, 0x8f, 0x02, 0x66, 0x48, 0x6f, 0x53, + 0x7e, 0x57, 0x6c, 0xf9, 0x6d, 0xf4, 0x6e, 0x28, 0x70, 0x5b, 0x6e, 0x13, + 0x5d, 0x0d, 0x74, 0x16, 0x70, 0x61, 0x4d, 0x72, 0x77, 0xad, 0x73, 0xb6, + 0x3e, 0x8f, 0x7b, 0x6a, 0x77, 0xb1, 0x30, 0x57, 0x7e, 0xe2, 0x7b, 0x7b, + 0x21, 0xfc, 0x86, 0x4c, 0x82, 0xb6, 0x1b, 0x2d, 0x94, 0x53, 0x90, 0x60, + 0x1e, 0x23, 0xa0, 0x5c, 0x9b, 0x11, 0x20, 0x28, 0x26, 0xa0, 0x6b, 0x2a, + 0xe5, 0x16, 0x29, 0x6b, 0x70, 0x63, 0xe8, 0x6a, 0x33, 0x72, 0x74, 0x3f, + 0xe6, 0xdb, 0x49, 0x1b, 0x74, 0x78, 0xd2, 0xfb, 0x59, 0x21, 0x6e, 0xb2, + 0xb6, 0xfc, 0x65, 0xd0, 0x6a, 0x86, 0xa1, 0x22, 0x6f, 0x4d, 0x68, 0xa9, + 0x8f, 0xc8, 0x75, 0x5d, 0x67, 0x7a, 0x7f, 0x30, 0x7a, 0x28, 0x66, 0xd7, + 0x6e, 0x34, 0x7e, 0x2b, 0x66, 0x70, 0x5d, 0xcb, 0x81, 0xad, 0x68, 0x3f, + 0x4e, 0x33, 0x84, 0xf4, 0x6b, 0xea, 0x3f, 0x5f, 0x88, 0x29, 0x70, 0x20, + 0x31, 0x99, 0x8a, 0xd5, 0x74, 0x91, 0x24, 0x09, 0x92, 0x6d, 0x7d, 0x1e, + 0x1e, 0x49, 0x9e, 0x8e, 0x87, 0x3f, 0x1f, 0x0b, 0xab, 0xf3, 0x94, 0x15, + 0x21, 0x1c, 0x2b, 0xd5, 0x30, 0x47, 0xd1, 0x59, 0x33, 0x21, 0x5a, 0x64, + 0xe6, 0x71, 0x47, 0x68, 0x65, 0x71, 0xed, 0x39, 0x5d, 0xbe, 0x65, 0xdc, + 0xd5, 0xcf, 0x6c, 0xc0, 0x63, 0x16, 0xb8, 0x37, 0x76, 0xf5, 0x61, 0x9c, + 0xa2, 0x52, 0x7e, 0x92, 0x60, 0x74, 0x91, 0x72, 0x82, 0xc5, 0x5f, 0x9b, + 0x82, 0x08, 0x87, 0x41, 0x5e, 0x2a, 0x6f, 0xaa, 0x8b, 0x4f, 0x5d, 0x64, + 0x5e, 0xb7, 0x8e, 0xf5, 0x5e, 0xfb, 0x4e, 0xaa, 0x91, 0xa7, 0x62, 0x48, + 0x3f, 0xfa, 0x94, 0x3b, 0x66, 0xd5, 0x32, 0x74, 0x96, 0x50, 0x6b, 0x3c, + 0x25, 0xba, 0x9d, 0x28, 0x74, 0x02, 0x1f, 0x29, 0xa9, 0xbc, 0x7d, 0xc8, + 0x1f, 0xbc, 0xb2, 0xbb, 0x89, 0x11, 0x1f, 0xc7, 0x2b, 0xd0, 0x30, 0x30, + 0xd1, 0x80, 0x2d, 0x18, 0x2e, 0xaa, 0xd2, 0x92, 0x63, 0x62, 0x53, 0xba, + 0xf1, 0xeb, 0x75, 0xa8, 0x57, 0xbd, 0xda, 0xe2, 0x81, 0x22, 0x58, 0x26, + 0xbd, 0x58, 0x87, 0x93, 0x58, 0xbc, 0xa7, 0x31, 0x8b, 0xc5, 0x58, 0x0f, + 0x95, 0xb2, 0x90, 0x20, 0x56, 0xe8, 0x84, 0x48, 0x94, 0x6d, 0x54, 0x43, + 0x71, 0x94, 0x97, 0xbe, 0x53, 0x0e, 0x60, 0x39, 0x9b, 0x1a, 0x53, 0xde, + 0x50, 0x6a, 0x9d, 0xf4, 0x56, 0x9e, 0x40, 0x87, 0x9f, 0xcb, 0x5a, 0x7f, + 0x33, 0xa2, 0xa1, 0x77, 0x5f, 0x66, 0x26, 0x34, 0xa8, 0x43, 0x67, 0xe3, + 0x1e, 0xd4, 0xaf, 0xb5, 0x72, 0x71, 0x1d, 0x80, 0xb7, 0xd3, 0x7c, 0x17, + 0x1e, 0x1e, 0x2c, 0xfc, 0x2e, 0x73, 0xd2, 0x6a, 0x2d, 0x4a, 0x2e, 0x87, + 0xd2, 0xa2, 0x7d, 0x88, 0x40, 0xea, 0xf9, 0x73, 0x92, 0x22, 0x49, 0x0a, + 0xe5, 0x5b, 0x98, 0x73, 0x4c, 0x9d, 0xc8, 0xbd, 0x98, 0x2c, 0x4e, 0xea, + 0xaf, 0x48, 0x99, 0xb5, 0x4f, 0x23, 0x9c, 0xb1, 0x9e, 0x0d, 0x4c, 0xae, + 0x88, 0x25, 0xa1, 0xfa, 0x49, 0x58, 0x74, 0x58, 0xa4, 0x8c, 0x47, 0x97, + 0x63, 0x4f, 0xa7, 0x13, 0x46, 0xe3, 0x52, 0x84, 0xa9, 0xd7, 0x46, 0xbb, + 0x41, 0x7e, 0xac, 0x1c, 0x4a, 0x59, 0x31, 0x5e, 0xae, 0x95, 0x4d, 0x00, + 0x22, 0x22, 0xb3, 0xc3, 0x54, 0x4b, 0x19, 0xe0, 0xbc, 0xf1, 0x63, 0x8d, + 0x17, 0xa1, 0xc3, 0x84, 0x70, 0xad, 0x1a, 0xe2, 0x2c, 0xb4, 0x2f, 0x37, + 0xd0, 0xc6, 0x7e, 0x2e, 0x2f, 0xb4, 0xed, 0xd9, 0x8a, 0x9f, 0x34, 0x4f, + 0xea, 0x83, 0xab, 0xb4, 0x3b, 0xa9, 0xf1, 0x72, 0xae, 0x24, 0x3e, 0xca, + 0xd7, 0x1a, 0xab, 0x78, 0x42, 0xea, 0xbb, 0xf1, 0xaa, 0x80, 0x43, 0x17, + 0xa6, 0x4f, 0xae, 0x1d, 0x3e, 0xfe, 0x8e, 0x90, 0xb0, 0x4b, 0x3b, 0x8b, + 0x79, 0x6f, 0xb2, 0x76, 0x38, 0xe4, 0x67, 0x69, 0xb4, 0x78, 0x36, 0xd0, + 0x56, 0x78, 0xb7, 0x5f, 0x33, 0xcc, 0x43, 0xe2, 0xbb, 0x18, 0x31, 0x3c, + 0x2e, 0xdc, 0xbd, 0xf4, 0x33, 0xc6, 0x1c, 0xb8, 0xc5, 0xdb, 0x47, 0x12, + 0x20, 0x8d, 0xc7, 0xba, 0x57, 0x9f, 0x21, 0x0e, 0xc8, 0x63, 0x66, 0x37, + 0x20, 0x3a, 0x82, 0x07, 0x2b, 0x91, 0xe7, 0x88, 0x8f, 0xd9, 0x2b, 0xa0, + 0xe4, 0xcd, 0xa1, 0x62, 0x2c, 0xd8, 0xe3, 0x02, 0xb2, 0x13, 0x2e, 0x04, + 0xe2, 0x74, 0xc5, 0xff, 0x2f, 0xcf, 0xe6, 0xd3, 0xc4, 0x3e, 0x30, 0x3f, + 0xce, 0xa5, 0xc2, 0x5f, 0x30, 0x34, 0xb4, 0xd9, 0xc2, 0x4a, 0x2e, 0x2c, + 0x9a, 0x8d, 0xc2, 0x44, 0x2c, 0x29, 0x83, 0x36, 0xc2, 0x50, 0x29, 0xe5, + 0x6e, 0x2e, 0xc3, 0x3a, 0x26, 0xaf, 0x5a, 0xdf, 0xc5, 0xaf, 0x20, 0xea, + 0x45, 0x90, 0xc9, 0x49, 0x1b, 0x5a, 0x30, 0x5a, 0xca, 0xde, 0x2a, 0x13, + 0x28, 0xe8, 0xca, 0xd1, 0x2c, 0xbe, 0x28, 0x27, 0xca, 0xaf, 0x45, 0xab, + 0x24, 0xbe, 0xcb, 0x6f, 0x57, 0x4b, 0x23, 0xc4, 0x92, 0xa4, 0x29, 0xeb, + 0xe1, 0x9d, 0xa2, 0x41, 0x2a, 0x9a, 0xdf, 0xc3, 0xad, 0xf7, 0x2a, 0xad, + 0xde, 0xa6, 0xc0, 0x34, 0x2a, 0x26, 0xe0, 0x49, 0xcc, 0xa9, 0x26, 0xf4, + 0xe1, 0xee, 0xda, 0x59, 0x1e, 0x21, 0xdf, 0x55, 0xd7, 0xf1, 0x1d, 0xf2, + 0xc3, 0x7e, 0xd7, 0x2a, 0x1c, 0x9b, 0xa7, 0x91, 0xd1, 0x97, 0x1f, 0xb5, + 0x89, 0xb5, 0xce, 0xf2, 0x21, 0x53, 0x74, 0xc8, 0xce, 0x23, 0x21, 0xe3, + 0x61, 0x7a, 0xce, 0x82, 0x20, 0x3a, 0x4e, 0x3b, 0xcf, 0xe9, 0x1f, 0xac, + 0x32, 0xcb, 0xcc, 0xe2, 0x28, 0xd0, 0x2b, 0x43, 0xcc, 0x42, 0x2b, 0x06, + 0x2a, 0x02, 0xcb, 0xe9, 0x2c, 0x40, 0x29, 0x56, 0xcb, 0xb1, 0x2d, 0x09, + 0x28, 0xea, 0xa1, 0xc9, 0x29, 0xaa, 0xde, 0x8b, 0xab, 0xf5, 0x29, 0xa1, + 0xdd, 0x6c, 0xb3, 0x88, 0x29, 0x42, 0xdd, 0x9a, 0xc6, 0xa8, 0x26, 0x7c, + 0xdf, 0xf7, 0xd9, 0xb6, 0x23, 0x21, 0xe1, 0xd2, 0xd6, 0x89, 0x23, 0xd3, + 0xd4, 0xf2, 0xd6, 0x5e, 0x23, 0x74, 0xc0, 0xd2, 0xd6, 0x4d, 0x21, 0x53, + 0xa8, 0x69, 0xd3, 0xb9, 0x22, 0x24, 0x8d, 0xa1, 0xd1, 0x1a, 0x23, 0x2c, + 0x79, 0x72, 0xd0, 0x1e, 0x23, 0x63, 0x66, 0x11, 0xd0, 0x2c, 0x23, 0x6b, + 0x55, 0x59, 0xd1, 0x2c, 0x20, 0xa4, 0x3a, 0x7f, 0xcd, 0xb6, 0x28, 0x50, + 0x2c, 0x40, 0xcd, 0x0b, 0x2a, 0x1d, 0x2b, 0x0a, 0xcc, 0x9d, 0x2b, 0x45, + 0x2a, 0x4a, 0xcc, 0x53, 0x2c, 0x13, 0x29, 0xc8, 0x1e, 0x58, 0xc1, 0x4b, + 0xd5, 0xe6, 0x21, 0x4f, 0xaf, 0x15, 0xb3, 0x58, 0x21, 0x84, 0xaf, 0x4c, + 0xb2, 0x1d, 0x22, 0xde, 0xb3, 0x78, 0xaf, 0xc5, 0x22, 0xbc, 0xb6, 0xda, + 0xae, 0x2d, 0x23, 0x05, 0xb6, 0xe9, 0xa8, 0x2e, 0x27, 0x70, 0xaa, 0xfa, + 0x98, 0xb3, 0x27, 0xda, 0xaa, 0x57, 0x95, 0xb5, 0x2a, 0x54, 0xad, 0x50, + 0x8d, 0x05, 0x2a, 0xd1, 0xa7, 0xdc, 0x7f, 0x38, 0x29, 0x94, 0xa7, 0x11, + 0x75, 0xa8, 0x26, 0x4b, 0xa7, 0x43, 0x67, 0x02, 0x19, 0xe9, 0xa9, 0xa9, + 0x47, 0x0c, 0x21, 0x9b, 0xc7, 0x81, 0x2b, 0x7e, 0x24, 0xe8, 0xc7, 0xfa, + 0x29, 0x75, 0x27, 0x14, 0xc8, 0x43, 0x28, 0x3b, 0x28, 0x9c, 0xc8, 0x76, + 0x27, 0x6a, 0x1e, 0x38, 0xc0, 0xb0, 0xd7, 0x22, 0x1e, 0x2c, 0xc0, 0x98, + 0xd5, 0x24, 0x1f, 0xe2, 0xaf, 0x63, 0xb4, 0x96, 0x21, 0x97, 0xaf, 0x91, + 0xb2, 0x33, 0x23, 0x1b, 0xb4, 0x00, 0xaf, 0x0f, 0x22, 0x46, 0xb6, 0x6b, + 0xac, 0x6a, 0x24, 0x3a, 0xb5, 0x1b, 0xa3, 0x5c, 0x27, 0xa9, 0xab, 0x2b, + 0x97, 0x31, 0x2a, 0x40, 0xac, 0x09, 0x8d, 0xc6, 0x2a, 0xd6, 0xa8, 0x91, + 0x7f, 0xff, 0x29, 0x3a, 0xa6, 0xcf, 0x72, 0xb4, 0x25, 0xea, 0xa6, 0x9a, + 0x64, 0xd3, 0x18, 0xb3, 0xa8, 0x12, 0x43, 0x1b, 0x1f, 0xc3, 0xbb, 0xcc, + 0x28, 0x3f, 0x25, 0x19, 0xc2, 0x20, 0x26, 0x8b, 0x28, 0x74, 0xc6, 0xae, + 0x26, 0xa0, 0x2a, 0x08, 0xc7, 0x33, 0x25, 0xfb, 0x18, 0xff, 0xb9, 0xc9, + 0xdb, 0x9c, 0x1b, 0x5a, 0xbf, 0x01, 0xd8, 0xbd, 0x1d, 0xe0, 0xbf, 0x61, + 0xd3, 0xd1, 0x1f, 0xdc, 0xaf, 0xc0, 0xb6, 0xf8, 0x21, 0x73, 0xb0, 0x05, + 0xb2, 0xd1, 0x23, 0x21, 0xb3, 0xe3, 0xad, 0xc6, 0x25, 0x81, 0xb0, 0x87, + 0xa6, 0x44, 0x29, 0x1d, 0xab, 0xe7, 0x99, 0xb0, 0x2a, 0x90, 0xaa, 0xb3, + 0x8e, 0xda, 0x2b, 0x34, 0xa7, 0xef, 0x80, 0xde, 0x28, 0xb1, 0xa4, 0xd8, + 0x6f, 0xd0, 0x20, 0x95, 0xa1, 0xad, 0x57, 0x64, 0x17, 0xb8, 0xa1, 0xfa, + 0x37, 0xf6, 0x1f, 0x07, 0xa8, 0x2a, 0x22, 0x56, 0x26, 0x15, 0xb1, 0xf6, + 0x20, 0x67, 0x29, 0x09, 0xba, 0x0c, 0x20, 0xcf, 0x49, 0x77, 0xc4, 0x2b, + 0x1c, 0xbb, 0x17, 0x5d, 0xb2, 0xec, 0xdf, 0x13, 0x18, 0x5e, 0xb8, 0x3d, + 0xdb, 0xc8, 0x1a, 0x53, 0xbb, 0x89, 0xd7, 0xf7, 0x1e, 0x4b, 0xb0, 0x5e, + 0xc3, 0x53, 0x1f, 0xfb, 0xb0, 0x76, 0xb9, 0xb8, 0x21, 0x7b, 0xb2, 0xaf, + 0xb3, 0x80, 0x2b, 0xd5, 0xab, 0x0d, 0xa3, 0x2d, 0x31, 0xe9, 0xa4, 0x46, + 0x94, 0xad, 0x34, 0x05, 0xa0, 0x75, 0x87, 0xa4, 0x34, 0xf6, 0x9d, 0x41, + 0x79, 0x36, 0x34, 0x5e, 0x9a, 0x9a, 0x67, 0x9f, 0x30, 0x37, 0x98, 0xd2, + 0x4f, 0xcf, 0x29, 0xf8, 0x99, 0x01, 0x32, 0x78, 0x2b, 0x39, 0x98, 0x75, + 0x1a, 0x80, 0x2d, 0x58, 0xa2, 0x3a, 0x13, 0xe5, 0x45, 0xde, 0xa6, 0x82, + 0x12, 0x52, 0x66, 0x0d, 0xae, 0x66, 0x13, 0x12, 0x1b, 0x54, 0xae, 0xbd, + 0xde, 0xc4, 0x19, 0xfe, 0xaf, 0xbb, 0xdd, 0xc2, 0x16, 0xeb, 0xb4, 0xc8, + 0xdc, 0x35, 0x18, 0x91, 0xb6, 0xd6, 0xd5, 0x8f, 0x1b, 0xa2, 0xb2, 0xb5, + 0xc6, 0x99, 0x29, 0xd6, 0xa9, 0xd5, 0xb1, 0x09, 0x34, 0x03, 0xa1, 0x68, + 0x9d, 0xd2, 0x38, 0x76, 0x9b, 0xcd, 0x8f, 0xa2, 0x3b, 0xa5, 0x97, 0x86, + 0x81, 0xb9, 0x3d, 0xf7, 0x94, 0x7e, 0x72, 0x3f, 0x3d, 0x70, 0x91, 0xd1, + 0x5e, 0xab, 0x3c, 0xd2, 0x90, 0xbd, 0x47, 0x47, 0x3f, 0xce, 0x90, 0xeb, + 0x30, 0x44, 0x43, 0xd1, 0x91, 0xba, 0x1c, 0x3a, 0x4e, 0x27, 0x97, 0xa6, + 0x12, 0xf9, 0x65, 0x5f, 0xa5, 0xd6, 0x13, 0xc9, 0x70, 0xaf, 0xac, 0x2a, + 0x17, 0x15, 0x1c, 0x1a, 0xa4, 0x9a, 0xe0, 0x0c, 0x1d, 0x3f, 0xa7, 0xf1, + 0xde, 0x85, 0x1b, 0x02, 0xac, 0xc7, 0xdd, 0xf7, 0x14, 0xfd, 0xb0, 0xd3, + 0xdb, 0x91, 0x26, 0x97, 0xa7, 0x66, 0xc4, 0x84, 0x35, 0x19, 0x9e, 0x4a, + 0xad, 0xbd, 0x3c, 0xae, 0x97, 0x73, 0x9a, 0x0d, 0x43, 0x08, 0x93, 0x05, + 0x8b, 0x9c, 0x49, 0x28, 0x8e, 0xb6, 0x7c, 0xaf, 0x4b, 0x28, 0x8c, 0x5f, + 0x6b, 0x52, 0x4d, 0x54, 0x8a, 0x5a, 0x57, 0x51, 0x51, 0x06, 0x8a, 0x67, + 0x42, 0x26, 0x56, 0x81, 0x8c, 0x1f, 0x32, 0x13, 0x5c, 0xd2, 0x8d, 0x71, + 0x21, 0x01, 0x67, 0x5c, 0x92, 0x9b, 0x16, 0x90, 0x74, 0x9d, 0xa0, 0x7d, + 0x19, 0xe3, 0x7f, 0xc2, 0xab, 0x56, 0x18, 0x01, 0x1e, 0x8a, 0x9a, 0xb1, + 0xe1, 0xf4, 0x1f, 0x96, 0x9d, 0x28, 0xe0, 0xd1, 0x1e, 0x5e, 0xa2, 0xd9, + 0xe1, 0x47, 0x22, 0x00, 0xa5, 0x05, 0xda, 0x99, 0x31, 0xc3, 0x9c, 0x1a, + 0xc3, 0x7b, 0x40, 0x57, 0x93, 0x9b, 0xac, 0xab, 0x4a, 0x01, 0x8d, 0xc4, + 0x99, 0x33, 0x51, 0x3e, 0x8a, 0x30, 0x87, 0xd3, 0x56, 0x97, 0x87, 0x14, + 0x78, 0x4d, 0x5a, 0xfa, 0x84, 0xff, 0x67, 0x8b, 0x5e, 0xec, 0x84, 0x2a, + 0x55, 0x04, 0x63, 0x46, 0x85, 0xc6, 0x43, 0x7f, 0x69, 0x44, 0x88, 0x84, + 0x34, 0x51, 0x6e, 0x6e, 0x8b, 0x51, 0x26, 0x43, 0x74, 0x86, 0x90, 0x59, + 0x19, 0xd0, 0x7f, 0x9f, 0x9a, 0x6d, 0x1b, 0x16, 0x92, 0x76, 0xa9, 0xe5, + 0x1a, 0xf5, 0x22, 0x51, 0x8e, 0x0d, 0xe2, 0xfd, 0x23, 0x73, 0x92, 0x74, + 0xe2, 0xbc, 0x26, 0x5e, 0x96, 0xda, 0xe2, 0x8a, 0x31, 0x4b, 0x97, 0xd3, + 0xd9, 0xa6, 0x40, 0xc8, 0x8f, 0xc8, 0xc2, 0x54, 0x4d, 0xd8, 0x88, 0xdf, + 0xac, 0x6c, 0x57, 0xd4, 0x84, 0x2c, 0x99, 0x66, 0x5f, 0x84, 0x81, 0x2a, + 0x87, 0x60, 0x65, 0xdf, 0x7e, 0xf0, 0x77, 0x15, 0x6a, 0xee, 0x7e, 0x00, + 0x65, 0x9b, 0x6f, 0x0c, 0x7e, 0xdd, 0x55, 0x04, 0x73, 0x01, 0x81, 0x65, + 0x45, 0x4e, 0x76, 0xda, 0x84, 0xc0, 0x36, 0x2c, 0x7b, 0x77, 0x88, 0x12, + 0x27, 0xc6, 0x7f, 0xd6, 0x8b, 0xeb, 0x1a, 0x83, 0x8c, 0x9c, 0x99, 0x90, + 0x1c, 0xf7, 0x98, 0xe3, 0xa4, 0x63, 0x1e, 0x9e, 0x24, 0xce, 0x7d, 0x5a, + 0xe6, 0x0c, 0x28, 0x00, 0x82, 0x7c, 0xe5, 0xde, 0x2e, 0xbd, 0x88, 0xac, + 0xe5, 0xfb, 0x42, 0xc5, 0x8a, 0x8f, 0xd9, 0x84, 0x51, 0xd7, 0x83, 0x57, + 0xc1, 0xbc, 0x5e, 0x50, 0x7d, 0x66, 0xac, 0x2b, 0x67, 0x99, 0x7a, 0xa2, + 0x99, 0x3f, 0x6f, 0x97, 0x78, 0xc5, 0x88, 0x0c, 0x76, 0x7e, 0x77, 0x7e, + 0x77, 0xb4, 0x79, 0x8f, 0x77, 0x34, 0x66, 0x15, 0x7d, 0x07, 0x78, 0xef, + 0x55, 0xf1, 0x80, 0x73, 0x7b, 0xe7, 0x46, 0xfd, 0x83, 0xc5, 0x7f, 0x70, + 0x38, 0x08, 0x87, 0x36, 0x83, 0x6a, 0x29, 0xc5, 0x8a, 0x0e, 0x88, 0x4f, + 0x1c, 0x9e, 0x98, 0x45, 0x94, 0xbc, 0x1e, 0xfe, 0xa4, 0x1c, 0x9f, 0xa4, + 0x20, 0xdd, 0x29, 0xb2, 0x70, 0x2d, 0xe8, 0x78, 0x2e, 0xcc, 0x73, 0x70, + 0xe8, 0x5a, 0x3c, 0xc1, 0x7a, 0x40, 0xe8, 0x39, 0x56, 0x80, 0x7b, 0xe4, + 0xd9, 0xda, 0x63, 0xd9, 0x77, 0x34, 0xc1, 0xdc, 0x70, 0x53, 0x73, 0x98, + 0xab, 0x7b, 0x78, 0xcf, 0x71, 0xb9, 0x99, 0xcf, 0x7f, 0x1b, 0x70, 0xc5, + 0x88, 0xf2, 0x84, 0x0a, 0x70, 0x11, 0x77, 0xbb, 0x87, 0xcc, 0x6f, 0x80, + 0x66, 0xab, 0x8b, 0x60, 0x70, 0x90, 0x56, 0x4c, 0x8e, 0x4c, 0x73, 0xac, + 0x47, 0x66, 0x91, 0x26, 0x77, 0x56, 0x38, 0xa3, 0x93, 0x94, 0x7b, 0xae, + 0x2b, 0x3e, 0x96, 0xa1, 0x81, 0x15, 0x1e, 0xba, 0xa3, 0x70, 0x8c, 0x61, + 0x20, 0x02, 0xae, 0xa7, 0x97, 0xbd, 0x21, 0x8a, 0x2b, 0xc6, 0x30, 0x4a, + 0xd1, 0x86, 0x3a, 0x20, 0x60, 0xcb, 0xec, 0xae, 0x53, 0x24, 0x6b, 0x06, + 0xec, 0x32, 0x6c, 0x04, 0x6d, 0xfe, 0xdc, 0x2b, 0x77, 0xdf, 0x6b, 0xde, + 0xc3, 0xf0, 0x81, 0x74, 0x6b, 0x08, 0xad, 0xc5, 0x89, 0x0f, 0x6a, 0x1a, + 0x9c, 0x70, 0x8c, 0xfd, 0x68, 0xfd, 0x8b, 0xe6, 0x91, 0x98, 0x67, 0x47, + 0x79, 0x06, 0x95, 0xa1, 0x66, 0xc4, 0x67, 0xac, 0x99, 0x01, 0x67, 0xde, + 0x57, 0x08, 0x9b, 0x57, 0x6a, 0x77, 0x47, 0xd1, 0x9d, 0x93, 0x6d, 0xac, + 0x38, 0xd9, 0x9f, 0xbe, 0x72, 0x95, 0x2c, 0x91, 0xa2, 0x22, 0x79, 0x3f, + 0x20, 0xf8, 0xad, 0xc6, 0x81, 0xaf, 0x1f, 0xe8, 0xb7, 0x9a, 0x8d, 0x14, + 0x20, 0x17, 0x2b, 0xdb, 0x30, 0x39, 0xd1, 0x8c, 0x2d, 0x31, 0x2e, 0xbd, + 0xd2, 0xa9, 0x6e, 0xfb, 0x5a, 0x90, 0xf1, 0x12, 0x81, 0x1e, 0x62, 0xb7, + 0xdf, 0xe4, 0x8b, 0xc7, 0x61, 0xf6, 0xca, 0x94, 0x92, 0x47, 0x62, 0x6f, + 0xb4, 0x09, 0x96, 0xda, 0x62, 0x34, 0xa1, 0x7b, 0x9b, 0x1e, 0x60, 0x9a, + 0x8e, 0xc7, 0x9f, 0x37, 0x5d, 0xd3, 0x7b, 0x01, 0xa2, 0x72, 0x5c, 0xa2, + 0x68, 0xfa, 0xa5, 0x8d, 0x5d, 0x4a, 0x58, 0xfb, 0xa7, 0xea, 0x5f, 0x8e, + 0x48, 0xaf, 0xaa, 0x04, 0x62, 0x38, 0x38, 0xa9, 0xab, 0xa4, 0x65, 0xcf, + 0x2b, 0xe5, 0xac, 0xe0, 0x6b, 0xdc, 0x1f, 0xa3, 0xb6, 0x47, 0x75, 0x97, + 0x1d, 0x3f, 0xbf, 0x0b, 0x81, 0xc0, 0x1b, 0xf4, 0x2d, 0x0a, 0x2e, 0x7c, + 0xd2, 0x77, 0x2d, 0x63, 0x2e, 0x9a, 0xd2, 0xb8, 0x86, 0x0d, 0x4a, 0x77, + 0xf5, 0x27, 0x9e, 0x31, 0x52, 0x09, 0xee, 0x75, 0xa1, 0xb3, 0x57, 0x08, + 0xd3, 0xea, 0xa4, 0x17, 0x59, 0x45, 0xbc, 0x2c, 0xa5, 0x38, 0x59, 0x73, + 0xa8, 0x38, 0xa9, 0x53, 0x56, 0x54, 0x92, 0x99, 0xac, 0xef, 0x53, 0x13, + 0x7d, 0x77, 0xaf, 0x72, 0x51, 0x5c, 0x6b, 0xcb, 0xb1, 0xeb, 0x50, 0xb5, + 0x5a, 0xc3, 0xb4, 0xcb, 0x50, 0xab, 0x49, 0x78, 0xb7, 0x2c, 0x53, 0x37, + 0x37, 0xcb, 0xb8, 0xe3, 0x55, 0x5f, 0x28, 0xc4, 0xb9, 0x7f, 0x5d, 0x2d, + 0x1c, 0xe8, 0xc3, 0x58, 0x6a, 0x60, 0x1b, 0xd2, 0xc6, 0x20, 0x76, 0x30, + 0x1b, 0x8c, 0x2c, 0xc1, 0x2f, 0x40, 0xd0, 0xd2, 0x81, 0x76, 0x35, 0xf2, + 0xed, 0x9c, 0x99, 0x20, 0x36, 0x2e, 0xf1, 0x03, 0xb2, 0x70, 0x42, 0xb1, + 0xec, 0x75, 0xba, 0x7c, 0x4a, 0x10, 0xe1, 0xae, 0xb8, 0x89, 0x4c, 0x6d, + 0xc8, 0xa7, 0xb6, 0x70, 0x4d, 0x1c, 0xb1, 0x60, 0xb9, 0x59, 0x48, 0xf7, + 0x98, 0x69, 0xbb, 0x97, 0x45, 0x14, 0x81, 0xc9, 0xbd, 0xd3, 0x42, 0x35, + 0x6f, 0xbf, 0xc0, 0x56, 0x3f, 0x8e, 0x5e, 0x24, 0xc2, 0x8b, 0x3c, 0x41, + 0x4a, 0xc5, 0xc6, 0x1d, 0x3a, 0x42, 0x35, 0x57, 0xc8, 0x3a, 0x3d, 0x16, + 0x23, 0x3d, 0xc9, 0x5b, 0x4f, 0x48, 0x22, 0xe0, 0xca, 0x26, 0x5d, 0x20, + 0x22, 0x61, 0xca, 0x5d, 0x6a, 0x14, 0x20, 0x29, 0x87, 0x72, 0x2d, 0x66, + 0xe9, 0x50, 0x95, 0x28, 0x2e, 0x0e, 0xe6, 0xf9, 0xa7, 0x2a, 0x2f, 0xcf, + 0xe6, 0x05, 0xb2, 0x7f, 0x34, 0x85, 0xe3, 0xdd, 0xd1, 0x25, 0x3a, 0xed, + 0xf1, 0x25, 0xcf, 0x13, 0x3b, 0x24, 0xd9, 0x0e, 0xcc, 0x39, 0x3a, 0xfc, + 0xbe, 0x49, 0xcc, 0x68, 0x38, 0x5d, 0xa3, 0x55, 0xcc, 0xcc, 0x35, 0x53, + 0x8b, 0x7f, 0xcd, 0x3b, 0x31, 0xd8, 0x75, 0xfa, 0xce, 0xb7, 0x2e, 0x01, + 0x62, 0x5c, 0xd1, 0x69, 0x28, 0x28, 0x4d, 0x2b, 0xd5, 0x00, 0x23, 0xea, + 0x36, 0xcc, 0xcd, 0xb4, 0x2a, 0xf0, 0x2a, 0xf0, 0xcc, 0x8c, 0x2f, 0x2f, + 0x29, 0x1b, 0xcc, 0x99, 0x4b, 0x9e, 0x25, 0xaf, 0xcc, 0x5f, 0x5a, 0x73, + 0x24, 0x8e, 0x97, 0xa2, 0x2b, 0x86, 0xe2, 0xb8, 0xa4, 0x7f, 0x2c, 0x55, + 0xe1, 0xc4, 0xb1, 0xd8, 0x2c, 0xe6, 0xe1, 0x40, 0xc5, 0xd9, 0x2d, 0x8d, + 0xe4, 0x27, 0xd4, 0x33, 0x2c, 0x55, 0xe8, 0x08, 0xd7, 0xbb, 0x2e, 0x5a, + 0xda, 0x3c, 0xd8, 0x8b, 0x2c, 0xce, 0xc4, 0xe4, 0xd8, 0xa5, 0x2a, 0x26, + 0xa9, 0xac, 0xd7, 0x6f, 0x28, 0x73, 0x8f, 0x9b, 0xd4, 0x2d, 0x27, 0xba, + 0x79, 0x4a, 0xd2, 0xb4, 0x26, 0xf0, 0x65, 0x21, 0xd2, 0x98, 0x25, 0x54, + 0x50, 0x1b, 0xd3, 0xd9, 0x23, 0x52, 0x35, 0xee, 0xce, 0x8b, 0x2a, 0x66, + 0x2c, 0x75, 0xcd, 0x6d, 0x2c, 0x25, 0x2a, 0xd8, 0xcc, 0xd0, 0x2d, 0x1f, + 0x29, 0xfa, 0xcd, 0x48, 0x48, 0x67, 0x26, 0xae, 0xa3, 0x60, 0x2a, 0xe4, + 0xdf, 0xf8, 0xaf, 0xe2, 0x2b, 0x0c, 0xdf, 0x24, 0xb8, 0x6b, 0x2b, 0x43, + 0xe0, 0x0f, 0xca, 0xf1, 0x29, 0x43, 0xe3, 0x6d, 0xd5, 0xde, 0x2b, 0x35, + 0xdc, 0x66, 0xd7, 0xea, 0x29, 0xd2, 0xd6, 0x93, 0xd7, 0xb2, 0x29, 0x18, + 0xc2, 0x92, 0xd7, 0xd2, 0x27, 0x23, 0xaa, 0xd1, 0xd6, 0x68, 0x26, 0x7b, + 0x90, 0x34, 0xd3, 0x95, 0x26, 0xa8, 0x7b, 0x8c, 0xd2, 0x57, 0x26, 0x80, + 0x67, 0xf4, 0xd2, 0x7f, 0x26, 0x0e, 0x57, 0x03, 0xd3, 0xae, 0x22, 0xf0, + 0x3c, 0x8a, 0xce, 0xe3, 0x29, 0x6f, 0x2d, 0x19, 0xcd, 0xf2, 0x2a, 0xfb, + 0x2b, 0xb0, 0xcd, 0x5a, 0x2b, 0xfa, 0x2a, 0xd1, 0xcc, 0xf1, 0x2c, 0xac, + 0x2a, 0x3a, 0x1c, 0x9f, 0xc4, 0x6f, 0xd9, 0x49, 0x21, 0xac, 0xb1, 0x00, + 0xb5, 0x4f, 0x21, 0xe9, 0xb1, 0x7b, 0xb4, 0x59, 0x23, 0x62, 0xb7, 0x1e, + 0xb2, 0x52, 0x23, 0x18, 0xba, 0x6d, 0xb1, 0x75, 0x23, 0x9d, 0xba, 0xcb, + 0xab, 0x7e, 0x27, 0x2d, 0xb5, 0x06, 0xa1, 0xc4, 0x28, 0x2e, 0xad, 0x32, + 0x97, 0x43, 0x2a, 0x52, 0xaf, 0xbc, 0x8d, 0xf1, 0x2b, 0x1d, 0xb1, 0x55, + 0x88, 0x14, 0x29, 0xa3, 0xa8, 0xf0, 0x76, 0x30, 0x26, 0xaf, 0xa9, 0x59, + 0x68, 0x33, 0x26, 0x06, 0xcb, 0x0c, 0x5b, 0x53, 0x22, 0x67, 0xc9, 0xe7, + 0x2c, 0x29, 0x25, 0x8e, 0xc9, 0xd4, 0x29, 0xfc, 0x27, 0x9f, 0xc9, 0xc7, + 0x28, 0xaa, 0x29, 0x12, 0xc9, 0xbd, 0x27, 0xc7, 0x1e, 0xc7, 0xc2, 0xc2, + 0xd9, 0x32, 0x1c, 0x8c, 0xc4, 0x50, 0xd9, 0x08, 0x20, 0xac, 0xb1, 0xb0, + 0xb7, 0x61, 0x21, 0xdd, 0xb2, 0xa9, 0xb5, 0xb1, 0x1f, 0x3b, 0xbc, 0x13, + 0xb5, 0xd6, 0x22, 0xdc, 0xbc, 0x35, 0xb1, 0x9a, 0x25, 0x19, 0xba, 0x59, + 0xa7, 0xcd, 0x27, 0xa1, 0xb2, 0x11, 0x9c, 0x91, 0x2a, 0x4c, 0xb0, 0x54, + 0x90, 0x44, 0x2b, 0x24, 0xb1, 0xcf, 0x88, 0x4f, 0x29, 0x5b, 0xaa, 0x5b, + 0x74, 0x41, 0x26, 0x77, 0xab, 0x62, 0x67, 0xbd, 0x1d, 0x8d, 0xc7, 0x09, + 0x50, 0x65, 0x22, 0xe8, 0xc7, 0xb3, 0x2a, 0xa9, 0x26, 0xdd, 0xc8, 0x3d, + 0x28, 0x5b, 0x29, 0x21, 0xc8, 0x87, 0x27, 0x27, 0x2a, 0x96, 0xc8, 0xb5, + 0x26, 0x6a, 0x1b, 0x2b, 0xbc, 0x9e, 0xde, 0x11, 0x1c, 0xa5, 0xc2, 0xed, + 0xdb, 0x4c, 0x1c, 0x68, 0xc4, 0x09, 0xd8, 0x98, 0x1b, 0x5e, 0xca, 0xb7, + 0xd6, 0x54, 0x22, 0x90, 0xb5, 0xab, 0xb7, 0x9d, 0x1f, 0x63, 0xbf, 0x8f, + 0xb8, 0x56, 0x22, 0x48, 0xc1, 0x33, 0xb5, 0x6d, 0x26, 0x1a, 0xbc, 0x14, + 0xa7, 0x2a, 0x29, 0x0f, 0xb9, 0xbe, 0x9a, 0x3c, 0x2a, 0x1c, 0xb6, 0xa5, + 0x8a, 0xd6, 0x27, 0xf5, 0xb3, 0xa1, 0x78, 0x6f, 0x20, 0xee, 0xb1, 0x7b, + 0x5d, 0x3b, 0x18, 0xa0, 0xb1, 0xcb, 0x3c, 0xc5, 0x22, 0x7c, 0xba, 0xab, + 0x25, 0x7f, 0x28, 0x69, 0xc0, 0xe5, 0x23, 0xf0, 0x2b, 0x88, 0xc6, 0x90, + 0x24, 0xda, 0x4b, 0xcd, 0xc6, 0xe3, 0x1d, 0x89, 0x18, 0xe1, 0xb6, 0xdb, + 0xe1, 0xf8, 0x1a, 0x5b, 0xbb, 0xce, 0xde, 0xbd, 0x1c, 0x15, 0xc0, 0x74, + 0xdb, 0xd3, 0x1c, 0x15, 0xc3, 0x56, 0xd7, 0xab, 0x1a, 0x11, 0xc7, 0xf9, + 0xd2, 0xf1, 0x1c, 0x6e, 0xc3, 0xb7, 0xc4, 0xbc, 0x28, 0xce, 0xba, 0xfb, + 0xb1, 0xda, 0x31, 0x92, 0xb2, 0xad, 0xa0, 0xa6, 0x34, 0xe1, 0xae, 0x88, + 0x92, 0x79, 0x37, 0x9d, 0xab, 0x79, 0x83, 0xed, 0x37, 0x02, 0xa8, 0x86, + 0x70, 0x57, 0x33, 0x91, 0xa5, 0xea, 0x56, 0xe2, 0x2d, 0x0a, 0xa7, 0x98, + 0x36, 0x0a, 0x2d, 0xda, 0xa7, 0xa5, 0x1a, 0x9a, 0x42, 0x3d, 0xbb, 0xd5, + 0x1a, 0xa4, 0x51, 0x50, 0xc0, 0xb3, 0x19, 0xb9, 0x72, 0xfa, 0xc5, 0x1d, + 0x18, 0x43, 0x1d, 0x1e, 0xb1, 0x3c, 0xe1, 0x9f, 0x1c, 0x40, 0xb2, 0xf8, + 0xe1, 0x75, 0x1a, 0x17, 0xba, 0x2a, 0xe0, 0xfd, 0x1b, 0x97, 0xbe, 0x42, + 0xdc, 0xb6, 0x1a, 0x1c, 0xc1, 0x1f, 0xd5, 0xe1, 0x29, 0x90, 0xb7, 0xd9, + 0xbf, 0x43, 0x35, 0xc8, 0xae, 0x0b, 0xaa, 0x94, 0x3c, 0x9f, 0xa7, 0xad, + 0x9a, 0x1f, 0x41, 0xaf, 0xa2, 0xa8, 0x8a, 0xe5, 0x44, 0xf5, 0xa0, 0x40, + 0x7b, 0xcb, 0x45, 0x2e, 0x9d, 0x9c, 0x67, 0x32, 0x44, 0x34, 0x9c, 0x1c, + 0x4e, 0x96, 0x46, 0xd8, 0x9c, 0x8e, 0x35, 0x39, 0x4b, 0x4c, 0x9e, 0x31, + 0x20, 0xff, 0x52, 0x62, 0xa1, 0x5f, 0x0e, 0xa2, 0x68, 0x09, 0xab, 0x6f, + 0x13, 0x1c, 0x74, 0xac, 0xb0, 0x6f, 0x16, 0xd9, 0x1f, 0x03, 0xa7, 0x1e, + 0xe1, 0xf6, 0x20, 0x24, 0xac, 0x22, 0xe2, 0x06, 0x1f, 0x12, 0xb2, 0x6a, + 0xe3, 0x9c, 0x1b, 0x2b, 0xba, 0xf1, 0xe6, 0xfe, 0x29, 0x9b, 0xb3, 0x31, + 0xd1, 0x62, 0x37, 0xe7, 0xaa, 0x57, 0xba, 0xad, 0x43, 0xa6, 0xa1, 0x7b, + 0xa3, 0x49, 0x4a, 0xa3, 0x9c, 0xf7, 0x94, 0xf2, 0x51, 0x8d, 0x99, 0x05, + 0x85, 0xac, 0x54, 0x08, 0x96, 0xfc, 0x74, 0xbc, 0x56, 0xde, 0x95, 0x45, + 0x60, 0xba, 0x5a, 0xbc, 0x95, 0x3c, 0x4b, 0x43, 0x5f, 0xd9, 0x96, 0x9a, + 0x38, 0x23, 0x64, 0x91, 0x98, 0xb2, 0x28, 0x3d, 0x6a, 0xd8, 0x9a, 0x26, + 0x16, 0x93, 0x7a, 0x7e, 0xa7, 0x33, 0x1a, 0x00, 0x8d, 0x19, 0xb8, 0xe1, + 0x16, 0x43, 0x23, 0xd0, 0x9b, 0xbb, 0xe1, 0x38, 0x24, 0x53, 0x9f, 0xcf, + 0xe1, 0xca, 0x25, 0xab, 0xa5, 0xf4, 0xe2, 0xc5, 0x29, 0xa6, 0xae, 0x88, + 0xe5, 0x96, 0x39, 0x7b, 0xa5, 0xc8, 0xce, 0x5e, 0x47, 0x6a, 0x9d, 0x71, + 0xb8, 0x1d, 0x51, 0xd1, 0x97, 0x39, 0xa2, 0xdb, 0x59, 0xc6, 0x93, 0xda, + 0x91, 0x5d, 0x5f, 0x56, 0x90, 0xd8, 0x81, 0x9c, 0x64, 0x02, 0x8e, 0xda, + 0x70, 0xd0, 0x68, 0x31, 0x8e, 0x74, 0x5d, 0xc9, 0x6c, 0x35, 0x8f, 0x87, + 0x4c, 0x36, 0x71, 0xce, 0x91, 0xc8, 0x3a, 0xdc, 0x76, 0x90, 0x94, 0x85, + 0x2c, 0xb7, 0x79, 0x87, 0x97, 0x91, 0x1c, 0x2d, 0x89, 0x92, 0xa1, 0xa0, + 0x1d, 0x5f, 0x96, 0x0d, 0xaf, 0x5a, 0x19, 0xfc, 0x25, 0xe6, 0x90, 0xe1, + 0xe3, 0x22, 0x28, 0x86, 0x94, 0x63, 0xe2, 0xa5, 0x2c, 0xb0, 0x99, 0xea, + 0xe3, 0x5f, 0x3a, 0xac, 0xa0, 0x6f, 0xe3, 0x91, 0x4a, 0x05, 0x98, 0x95, + 0xcc, 0x3a, 0x56, 0xab, 0x91, 0x11, 0xb6, 0xc1, 0x60, 0x78, 0x8d, 0x64, + 0xa3, 0x33, 0x68, 0x9b, 0x8a, 0xa0, 0x91, 0x20, 0x6f, 0x13, 0x88, 0x7e, + 0x80, 0x91, 0x74, 0x4e, 0x87, 0x82, 0x6e, 0xe2, 0x78, 0x3c, 0x88, 0x46, + 0x5d, 0xc7, 0x7b, 0xcf, 0x8a, 0x61, 0x4d, 0xb1, 0x7f, 0x47, 0x8d, 0x41, + 0x3e, 0x10, 0x83, 0x2d, 0x90, 0x43, 0x2e, 0xd2, 0x86, 0x7f, 0x94, 0x50, + 0x1f, 0xfc, 0x91, 0xc2, 0x9f, 0x5f, 0x1d, 0x87, 0x9f, 0xe2, 0xab, 0xfa, + 0x1d, 0xd9, 0x28, 0x9b, 0x7f, 0xdf, 0xe6, 0x2c, 0x2c, 0x94, 0x85, 0xb3, + 0xe6, 0x04, 0x35, 0x66, 0x8c, 0xad, 0xe4, 0xfc, 0x4d, 0x9a, 0x92, 0xbb, + 0xe2, 0x8d, 0x5b, 0x78, 0x8c, 0x7d, 0xcc, 0x0b, 0x67, 0x34, 0x86, 0x70, + 0xb6, 0x97, 0x71, 0x11, 0x83, 0xad, 0xa3, 0xb4, 0x79, 0x11, 0x82, 0x49, + 0x91, 0xf9, 0x80, 0x14, 0x81, 0x1a, 0x81, 0x50, 0x83, 0x2f, 0x80, 0xad, + 0x6f, 0x38, 0x86, 0x75, 0x81, 0xc0, 0x5e, 0x87, 0x89, 0xa2, 0x84, 0x0c, + 0x4f, 0x06, 0x8c, 0xa3, 0x87, 0x88, 0x40, 0x43, 0x8f, 0xcd, 0x8b, 0x8e, + 0x31, 0x4d, 0x92, 0x84, 0x8f, 0xbd, 0x23, 0x47, 0x9c, 0x51, 0x98, 0xc5, + 0x1f, 0x6c, 0xa9, 0xbc, 0xa6, 0x23, 0x21, 0x0c, 0x2d, 0x44, 0x72, 0xdd, + 0xe8, 0x4e, 0x32, 0xec, 0x74, 0xad, 0xe6, 0xd2, 0x49, 0xc8, 0x7d, 0xf1, + 0xe7, 0x01, 0x61, 0x49, 0x84, 0x36, 0xe3, 0x46, 0x6e, 0x46, 0x80, 0x8a, + 0xcc, 0xf1, 0x7a, 0x4f, 0x7c, 0x1f, 0xb5, 0xbf, 0x83, 0x22, 0x7b, 0x2c, + 0xa4, 0x6c, 0x89, 0x33, 0x7a, 0x80, 0x93, 0x40, 0x8e, 0x0d, 0x79, 0x97, + 0x81, 0x83, 0x91, 0xdd, 0x78, 0xe6, 0x6f, 0xeb, 0x95, 0x1f, 0x79, 0x9c, + 0x5e, 0xe8, 0x98, 0x38, 0x7b, 0xe2, 0x4f, 0x5a, 0x9a, 0x99, 0x7f, 0x3e, + 0x40, 0xb9, 0x9c, 0xd1, 0x83, 0xc7, 0x32, 0xde, 0x9f, 0x3d, 0x88, 0x1b, + 0x24, 0xfe, 0xa8, 0x23, 0x90, 0xa8, 0x20, 0x2a, 0xb0, 0x8a, 0x9a, 0xf0, + 0x22, 0x59, 0x33, 0x20, 0x5f, 0xe7, 0xe9, 0x43, 0x46, 0xc8, 0x67, 0xbf, + 0xec, 0xac, 0x5c, 0xf6, 0x6f, 0xc3, 0xea, 0x9c, 0x77, 0x82, 0x76, 0xe2, + 0xe6, 0x58, 0x82, 0x0c, 0x75, 0xe4, 0xcf, 0xde, 0x8b, 0xe3, 0x74, 0x9d, + 0xba, 0x3b, 0x93, 0x82, 0x73, 0xd7, 0xa7, 0x92, 0x97, 0x7e, 0x73, 0x3e, + 0x96, 0x57, 0x9c, 0x00, 0x71, 0x52, 0x82, 0xd2, 0x9f, 0xc8, 0x70, 0x4c, + 0x70, 0xe2, 0xa2, 0xad, 0x70, 0x90, 0x5f, 0xc1, 0xa4, 0xfe, 0x72, 0xa7, + 0x4f, 0xf7, 0xa7, 0x13, 0x75, 0x94, 0x40, 0xdd, 0xa9, 0x49, 0x7a, 0x50, + 0x33, 0x28, 0xaa, 0xf4, 0x7f, 0x6b, 0x26, 0x10, 0xb1, 0x57, 0x85, 0x25, + 0x1f, 0x9d, 0xb9, 0xf8, 0x90, 0x7b, 0x20, 0x6d, 0x2c, 0xfe, 0x2e, 0x97, + 0xd2, 0x7c, 0x60, 0x2d, 0x57, 0x80, 0xf0, 0xd1, 0x76, 0xc4, 0x60, 0xe0, + 0xef, 0xa7, 0x8c, 0x71, 0x6b, 0xdd, 0xea, 0x7d, 0x96, 0x9f, 0x6c, 0x15, + 0xd5, 0x20, 0x9d, 0xdd, 0x6c, 0x9f, 0xc0, 0x47, 0xa1, 0xf7, 0x6c, 0x8f, + 0xac, 0xfc, 0xa5, 0xdf, 0x6a, 0xf1, 0x99, 0x53, 0xa9, 0xfb, 0x67, 0xfe, + 0x84, 0xaa, 0xac, 0xec, 0x66, 0x5d, 0x72, 0x5e, 0xaf, 0x58, 0x66, 0x67, + 0x61, 0x94, 0xb1, 0x77, 0x68, 0x05, 0x51, 0x01, 0xb3, 0xa3, 0x6a, 0x67, + 0x40, 0x4c, 0xb4, 0xdb, 0x6e, 0x98, 0x32, 0x03, 0xb5, 0xd6, 0x73, 0x96, + 0x24, 0x6f, 0xbb, 0x97, 0x7a, 0x0a, 0x1c, 0x4d, 0xc3, 0x8f, 0x85, 0x6d, + 0x1b, 0xca, 0x2d, 0x17, 0x2e, 0x86, 0xd2, 0x83, 0x78, 0x96, 0x4a, 0x1e, + 0xf6, 0xff, 0x8b, 0x3c, 0x51, 0xaa, 0xf3, 0x23, 0xa1, 0x5f, 0x5b, 0xfb, + 0xec, 0x12, 0xab, 0x3a, 0x63, 0x33, 0xdb, 0xfd, 0xaf, 0xcd, 0x63, 0x9e, + 0xc8, 0x04, 0xb1, 0x0d, 0x63, 0xb8, 0xb3, 0xbf, 0xb4, 0x7a, 0x60, 0xa1, + 0x9d, 0x2d, 0xb7, 0xfd, 0x5c, 0xf2, 0x87, 0x17, 0xb9, 0xf7, 0x5b, 0x63, + 0x74, 0x89, 0xbb, 0xe7, 0x5a, 0x79, 0x63, 0x08, 0xbe, 0x71, 0x59, 0xe8, + 0x51, 0x1d, 0xc0, 0x8f, 0x5b, 0x22, 0x3e, 0xa4, 0xc1, 0xe7, 0x5d, 0x4e, + 0x2d, 0x90, 0xc2, 0x8d, 0x64, 0x5a, 0x20, 0xc3, 0xc6, 0xe3, 0x6f, 0x52, + 0x1e, 0x2f, 0xc8, 0x38, 0x7a, 0x69, 0x1d, 0x35, 0x2d, 0x30, 0x2e, 0x74, + 0xd2, 0x8b, 0x8d, 0x54, 0x36, 0x17, 0xf3, 0x7d, 0xa0, 0xf4, 0x3f, 0x2d, + 0xf0, 0xf2, 0xb0, 0x5a, 0x4b, 0xc2, 0xec, 0xe9, 0xc6, 0x7e, 0x54, 0xa2, + 0xeb, 0xf0, 0xc1, 0xd1, 0x57, 0x1a, 0xd3, 0x5a, 0xc1, 0xdc, 0x57, 0x79, + 0xbc, 0x90, 0xc3, 0xfe, 0x53, 0x69, 0xa3, 0x5d, 0xc5, 0xc2, 0x4f, 0x84, + 0x8b, 0xc7, 0xc7, 0x68, 0x4c, 0x80, 0x78, 0x7f, 0xc9, 0x34, 0x49, 0xa8, + 0x66, 0x4c, 0xcb, 0xbe, 0x46, 0xa6, 0x52, 0x3e, 0xce, 0x8c, 0x44, 0xb5, + 0x3c, 0xc3, 0xd0, 0xca, 0x47, 0x14, 0x29, 0x5b, 0xcd, 0x39, 0x56, 0x0d, + 0x25, 0x65, 0xcb, 0xff, 0x63, 0xb5, 0x22, 0xbc, 0xcb, 0x7e, 0x6e, 0x0c, + 0x21, 0x86, 0x8d, 0x2a, 0x2f, 0x44, 0xea, 0x72, 0x9a, 0x72, 0x31, 0x1d, + 0xe8, 0xa7, 0xa9, 0xae, 0x32, 0xde, 0xe7, 0x3e, 0xc1, 0x58, 0x3a, 0x2f, + 0xee, 0x0d, 0xd3, 0x34, 0x42, 0x1c, 0xef, 0x37, 0xd6, 0x66, 0x47, 0xbe, + 0xe1, 0xbd, 0xd3, 0x88, 0x47, 0xa1, 0xc6, 0xb3, 0xd5, 0x39, 0x43, 0xe0, + 0xac, 0x90, 0xd5, 0xb4, 0x40, 0x0b, 0x93, 0x8e, 0xd5, 0xd5, 0x3c, 0x44, + 0x7d, 0xed, 0xd7, 0x42, 0x38, 0xe1, 0x6a, 0xba, 0xda, 0xcf, 0x33, 0x13, + 0x53, 0xed, 0xd9, 0x08, 0x2e, 0xda, 0x3a, 0xa7, 0xd0, 0x7c, 0x2f, 0x8e, + 0x2c, 0xfa, 0xcf, 0x60, 0x41, 0xd6, 0x28, 0xc2, 0xce, 0x73, 0x54, 0xb2, + 0x26, 0x99, 0xcd, 0xea, 0x5f, 0xa5, 0x25, 0x43, 0x9b, 0x37, 0x2d, 0x9f, + 0xe4, 0xfe, 0xa6, 0xbc, 0x2e, 0x14, 0xe3, 0xc2, 0xb4, 0x9a, 0x2f, 0x2f, + 0xe3, 0xcc, 0xc7, 0x51, 0x32, 0xa1, 0xe5, 0x59, 0xd4, 0x23, 0x33, 0x17, + 0xe2, 0x1c, 0xd8, 0x83, 0x34, 0x43, 0xda, 0x55, 0xd9, 0xf3, 0x32, 0xfe, + 0xc6, 0xd8, 0xda, 0x48, 0x30, 0xc2, 0xac, 0x4a, 0xd9, 0xf1, 0x2f, 0x04, + 0x92, 0xc6, 0xd7, 0xc0, 0x2d, 0x05, 0x7c, 0x8f, 0xd5, 0xe4, 0x2b, 0x80, + 0x67, 0xf8, 0xd5, 0x67, 0x2a, 0x01, 0x53, 0x0c, 0xd6, 0xae, 0x27, 0xcf, + 0x3b, 0xaa, 0xd0, 0x31, 0x2b, 0xfe, 0x2d, 0xa6, 0xce, 0x95, 0x2d, 0x45, + 0x2b, 0xad, 0xcd, 0xb4, 0x2d, 0xff, 0x2a, 0xa1, 0xce, 0xaa, 0x52, 0xd6, + 0x27, 0x00, 0xa4, 0xf7, 0x2c, 0x1e, 0xe1, 0x64, 0xb1, 0xb2, 0x2c, 0x8a, + 0xe0, 0xd9, 0xc7, 0x1b, 0x2d, 0x04, 0xe3, 0xcf, 0xd0, 0x7a, 0x2b, 0xfc, + 0xe6, 0xe6, 0xd6, 0x95, 0x2e, 0xfb, 0xdc, 0x27, 0xd8, 0xe5, 0x2e, 0x30, + 0xd7, 0xbb, 0xd8, 0xa2, 0x2d, 0x21, 0xc3, 0xac, 0xd8, 0xe3, 0x2b, 0x58, + 0xab, 0x92, 0xd8, 0x63, 0x2a, 0x40, 0x92, 0x2b, 0xd5, 0xa7, 0x29, 0xae, + 0x7d, 0x46, 0xd4, 0x3c, 0x29, 0x35, 0x69, 0x8b, 0xd4, 0x5e, 0x28, 0xac, + 0x58, 0x7b, 0xd5, 0x89, 0x25, 0xc9, 0x3e, 0x9f, 0xd0, 0x0e, 0x2a, 0x8f, + 0x2d, 0xf1, 0xce, 0xd9, 0x2b, 0xd9, 0x2c, 0x55, 0xce, 0x15, 0x2c, 0xae, + 0x2b, 0x58, 0xcd, 0x8f, 0x2d, 0x44, 0x2a, 0xab, 0x1c, 0x4f, 0xc7, 0xf3, + 0xdb, 0xd1, 0x1c, 0xef, 0xce, 0x5e, 0xda, 0x46, 0x22, 0x0d, 0xb3, 0xd9, + 0xb6, 0xfe, 0x1f, 0x68, 0xbe, 0x05, 0xb7, 0xd8, 0x23, 0x73, 0xbe, 0x06, + 0xb4, 0xba, 0x24, 0x35, 0xbe, 0xa9, 0xae, 0xc7, 0x27, 0x3f, 0xb9, 0x64, + 0xa5, 0xa4, 0x28, 0x52, 0xb6, 0x8c, 0x9e, 0xfe, 0x2a, 0x6a, 0xb1, 0xf9, + 0x8e, 0xb6, 0x2b, 0x2c, 0xb2, 0xcf, 0x89, 0x1d, 0x2e, 0x84, 0xcb, 0x34, + 0x85, 0x9f, 0x2d, 0xbc, 0xcb, 0x69, 0x76, 0xc0, 0x28, 0x8b, 0xcc, 0x55, + 0x5c, 0xaa, 0x23, 0x36, 0xcc, 0x4e, 0x2c, 0xd4, 0x26, 0x34, 0xcb, 0xb1, + 0x2a, 0x81, 0x28, 0x2a, 0xcb, 0x4b, 0x29, 0x18, 0x29, 0x8a, 0xcb, 0x04, + 0x28, 0x25, 0x1f, 0x57, 0xc4, 0xd8, 0xdb, 0x43, 0x1c, 0x77, 0xc8, 0x41, + 0xdc, 0x0c, 0x1c, 0xef, 0xce, 0x82, 0xda, 0x44, 0x1a, 0x5b, 0xd7, 0xd7, + 0xd9, 0xfe, 0x1f, 0x90, 0xc1, 0x62, 0xba, 0x35, 0x23, 0x73, 0xc2, 0x0f, + 0xb6, 0xcc, 0x25, 0xf9, 0xbf, 0x92, 0xac, 0x35, 0x27, 0xf1, 0xbc, 0x52, + 0xa5, 0xb2, 0x2a, 0x6e, 0xb7, 0x54, 0x95, 0x0a, 0x2b, 0x3f, 0xb4, 0x7d, + 0x8a, 0x2e, 0x2e, 0x75, 0xcb, 0x25, 0x84, 0xe2, 0x2b, 0xa2, 0xcb, 0xb9, + 0x6d, 0x09, 0x26, 0x49, 0xcb, 0x77, 0x55, 0xaa, 0x24, 0x0e, 0xcb, 0x0e, + 0x2b, 0x9a, 0x27, 0xb6, 0xca, 0x9f, 0x29, 0x08, 0x29, 0xce, 0xca, 0x5f, + 0x27, 0xad, 0x2b, 0x27, 0xca, 0x37, 0x26, 0xd8, 0x1c, 0x86, 0xc0, 0x19, + 0xe0, 0x19, 0x1f, 0x75, 0xc5, 0x26, 0xdc, 0x11, 0x1d, 0xb6, 0xc8, 0x63, + 0xdb, 0xb9, 0x1c, 0xef, 0xce, 0xc7, 0xda, 0x40, 0x1b, 0x3d, 0xd7, 0x38, + 0xd8, 0x1c, 0x20, 0x20, 0xc8, 0x6b, 0xc0, 0x72, 0x1c, 0xc9, 0xd2, 0x94, + 0xc5, 0x34, 0x22, 0x63, 0xcd, 0x7b, 0xb5, 0x5e, 0x27, 0x94, 0xca, 0x98, + 0xa6, 0x97, 0x29, 0x75, 0xc7, 0x06, 0x95, 0x1d, 0x27, 0xc7, 0xc4, 0x61, + 0x7f, 0xca, 0x21, 0x4d, 0xc2, 0xb9, 0x62, 0x6d, 0x19, 0xb6, 0xc4, 0x0e, + 0x3e, 0xcc, 0x26, 0x10, 0xc8, 0x24, 0x28, 0xcd, 0x2a, 0x7d, 0xc8, 0xb3, + 0x26, 0x77, 0x40, 0x7f, 0xc9, 0x6d, 0x20, 0xfa, 0x4d, 0x64, 0xc9, 0xe9, + 0x20, 0xb9, 0x1a, 0xdf, 0xba, 0x6c, 0xe4, 0x54, 0x1c, 0x14, 0xbe, 0xac, + 0xe1, 0xe3, 0x1d, 0xd1, 0xc5, 0x57, 0xdf, 0x9a, 0x1e, 0x1c, 0xc9, 0x5c, + 0xdc, 0xbe, 0x1b, 0x2f, 0xd1, 0xe3, 0xdb, 0x70, 0x17, 0xd7, 0xd6, 0x0c, + 0xd6, 0xb7, 0x26, 0x14, 0xcb, 0xdf, 0xc1, 0x9d, 0x2f, 0xc9, 0xc4, 0x28, + 0xaf, 0xbc, 0x35, 0x46, 0xbf, 0x79, 0x9f, 0x46, 0x38, 0x6f, 0xbc, 0x20, + 0x8e, 0x27, 0x38, 0x13, 0xb9, 0x6d, 0x78, 0xaf, 0x34, 0x51, 0xb7, 0x1e, + 0x5d, 0x28, 0x31, 0x62, 0xb8, 0x45, 0x3a, 0x53, 0x32, 0xdc, 0xb8, 0xb1, + 0x1d, 0xa0, 0x48, 0x0f, 0xc3, 0x08, 0x1c, 0x88, 0x56, 0x34, 0xc5, 0x8d, + 0x1a, 0xed, 0x74, 0x76, 0xc7, 0x9a, 0x19, 0xce, 0x1f, 0x42, 0xb3, 0x64, + 0xe3, 0xf0, 0x1c, 0xfd, 0xb7, 0xee, 0xe6, 0x05, 0x1d, 0x83, 0xbf, 0x20, + 0xe5, 0x27, 0x1e, 0xe3, 0xc5, 0x63, 0xe3, 0x61, 0x1d, 0xd9, 0xce, 0x5c, + 0xe3, 0x2e, 0x2a, 0x69, 0xc6, 0xdc, 0xce, 0x14, 0x36, 0xc8, 0xbd, 0xe0, + 0xb8, 0xf6, 0x40, 0x9c, 0xb5, 0x7c, 0xa5, 0xfc, 0x47, 0x05, 0xb1, 0x3e, + 0x96, 0x78, 0x4c, 0xe1, 0xad, 0x22, 0x86, 0x8d, 0x4d, 0xa1, 0xab, 0x3e, + 0x70, 0xc5, 0x4d, 0x63, 0xaa, 0x54, 0x56, 0xea, 0x4e, 0xfa, 0xab, 0x1a, + 0x3a, 0x59, 0x54, 0x5e, 0xad, 0xdd, 0x27, 0x8b, 0x5f, 0x7a, 0xb0, 0xfb, + 0x16, 0xc9, 0x6b, 0xd6, 0xb2, 0x9e, 0x14, 0x17, 0x80, 0x8e, 0xc4, 0x63, + 0x15, 0x82, 0x24, 0x20, 0xa8, 0x52, 0xe1, 0x7a, 0x23, 0xd8, 0xaf, 0x09, + 0xe3, 0x63, 0x24, 0xa3, 0xb4, 0xb2, 0xe5, 0x1c, 0x25, 0xb8, 0xbd, 0xbe, + 0xe8, 0x2d, 0x2e, 0xef, 0xbf, 0x92, 0xde, 0x40, 0x3c, 0xa2, 0xb7, 0x37, + 0xc7, 0xc2, 0x4a, 0x29, 0xad, 0xdd, 0xae, 0xcd, 0x52, 0x3e, 0xa8, 0xa8, + 0x9f, 0xa7, 0x59, 0xb1, 0xa4, 0x88, 0x8f, 0x5e, 0x5d, 0x66, 0xa2, 0x28, + 0x7e, 0x51, 0x60, 0x63, 0xa0, 0xdf, 0x6a, 0x4d, 0x64, 0x21, 0xa0, 0xf1, + 0x54, 0xde, 0x69, 0xba, 0xa2, 0x2a, 0x40, 0x33, 0x70, 0x77, 0xa3, 0xde, + 0x30, 0xd7, 0x76, 0x61, 0xa6, 0x86, 0x1f, 0xf3, 0x7d, 0x6b, 0xaf, 0x26, + 0x16, 0xb2, 0x91, 0x57, 0xbe, 0xb2, 0x15, 0xc8, 0x26, 0xe7, 0x9c, 0xa9, + 0xe1, 0xbf, 0x28, 0x14, 0xa2, 0x54, 0xe2, 0x9d, 0x2a, 0xd9, 0xa8, 0xb9, + 0xe3, 0xec, 0x33, 0x38, 0xaf, 0x7a, 0xe4, 0x90, 0x42, 0xf8, 0xae, 0x7b, + 0xd6, 0xbb, 0x4f, 0x82, 0xa7, 0x7e, 0xc2, 0x37, 0x5a, 0x39, 0xa1, 0xa0, + 0xad, 0x72, 0x62, 0x90, 0x9d, 0xf6, 0x9b, 0x7b, 0x68, 0x9e, 0x9b, 0x0f, + 0x8b, 0x82, 0x6d, 0x99, 0x99, 0x27, 0x7a, 0x60, 0x71, 0xdf, 0x98, 0xbf, + 0x66, 0xf9, 0x75, 0xd4, 0x99, 0x6e, 0x54, 0xc1, 0x7a, 0xdd, 0x9b, 0x62, + 0x43, 0xd3, 0x7f, 0xa6, 0x9e, 0x36, 0x34, 0x4a, 0x84, 0xf9, 0xa0, 0x97, + 0x24, 0xb4, 0x8c, 0x98, 0xa9, 0x8c, 0x1a, 0x7d, 0x98, 0xac, 0xb5, 0xdd, + 0x1a, 0x20, 0x28, 0xe5, 0x93, 0x0a, 0xe3, 0x4b, 0x2c, 0x0f, 0x97, 0x15, + 0xe3, 0x27, 0x31, 0x25, 0x9c, 0xb1, 0xe4, 0x0e, 0x43, 0x2e, 0xa2, 0xf4, + 0xe3, 0xbd, 0x54, 0x0e, 0xa0, 0x27, 0xd3, 0x8f, 0x60, 0x31, 0x99, 0x55, + 0xc0, 0x47, 0x69, 0xb5, 0x96, 0xad, 0xad, 0xb1, 0x71, 0xfd, 0x94, 0x66, + 0x9b, 0x20, 0x78, 0xc1, 0x92, 0xb3, 0x8a, 0x76, 0x7d, 0xd2, 0x91, 0xb4, + 0x78, 0x6c, 0x81, 0xcc, 0x92, 0x14, 0x66, 0xc7, 0x85, 0x3f, 0x93, 0x94, + 0x55, 0xc9, 0x88, 0x71, 0x96, 0x05, 0x46, 0x3b, 0x8b, 0xf6, 0x98, 0xf4, + 0x36, 0x45, 0x8f, 0x43, 0x9c, 0x0d, 0x27, 0x42, 0x95, 0x71, 0xa3, 0xd2, + 0x1e, 0x12, 0xa3, 0x31, 0xae, 0xb9, 0x1e, 0x5e, 0x2b, 0xbe, 0x82, 0xe5, + 0xe6, 0x30, 0x30, 0x2a, 0x88, 0xbf, 0xe6, 0x1b, 0x40, 0x20, 0x8f, 0x72, + 0xe4, 0x84, 0x56, 0xca, 0x95, 0x47, 0xe2, 0xa3, 0x65, 0xd2, 0x94, 0x05, + 0xd4, 0x14, 0x70, 0x95, 0x8f, 0x65, 0xc0, 0x51, 0x7a, 0xa1, 0x8d, 0x0a, + 0xad, 0xe7, 0x82, 0xcc, 0x8b, 0xf9, 0x9c, 0x3f, 0x8a, 0x01, 0x8b, 0x0b, + 0x8b, 0x40, 0x8d, 0x3d, 0x8a, 0x9c, 0x78, 0xb6, 0x90, 0x32, 0x8b, 0x27, + 0x67, 0x3c, 0x93, 0x34, 0x8c, 0xaf, 0x56, 0x91, 0x95, 0x93, 0x8f, 0xca, + 0x47, 0xe4, 0x97, 0xf9, 0x93, 0x84, 0x38, 0x24, 0x9a, 0xbf, 0x96, 0x6a, + 0x29, 0x43, 0xa0, 0x93, 0x9d, 0x1f, 0x20, 0x39, 0xad, 0xd9, 0xaa, 0xf1, + 0x21, 0xc1, 0x30, 0x3d, 0x74, 0x20, 0xe8, 0x5f, 0x38, 0xde, 0x7a, 0x23, + 0xe7, 0xfa, 0x54, 0xc7, 0x80, 0xcc, 0xe5, 0xba, 0x69, 0x47, 0x87, 0xfd, + 0xe3, 0xcc, 0x78, 0xfe, 0x88, 0xaa, 0xd5, 0x7c, 0x83, 0xc3, 0x85, 0xbb, + 0xc1, 0x2b, 0x8c, 0xde, 0x85, 0x1d, 0xaf, 0x41, 0x93, 0x40, 0x84, 0x4b, + 0x9d, 0xd5, 0x98, 0x5e, 0x83, 0x6f, 0x8b, 0xc3, 0x9c, 0x0d, 0x82, 0x8f, + 0x79, 0x67, 0x9e, 0xa9, 0x82, 0xbd, 0x67, 0xea, 0xa1, 0x2f, 0x84, 0x63, + 0x57, 0xb2, 0xa3, 0x7b, 0x87, 0x7e, 0x48, 0x4e, 0xa5, 0x5c, 0x8a, 0xe1, + 0x38, 0x83, 0xa7, 0x44, 0x8e, 0x7a, 0x2a, 0x81, 0xac, 0x9c, 0x94, 0x4c, + 0x21, 0x27, 0xb5, 0x2e, 0x9e, 0x61, 0x20, 0xbf, 0x36, 0x7c, 0x63, 0x87, + 0xea, 0x53, 0x53, 0x98, 0x6d, 0x53, 0xea, 0xd1, 0x69, 0xbe, 0x73, 0xba, + 0xe8, 0xdd, 0x7f, 0x93, 0x7b, 0xcf, 0xe6, 0x6f, 0x8d, 0x9e, 0x7f, 0x08, + 0xd8, 0xb9, 0x96, 0x9d, 0x7e, 0x46, 0xc5, 0x5e, 0x9e, 0x16, 0x7d, 0xd2, + 0xb3, 0x0e, 0xa2, 0x25, 0x7d, 0x9d, 0xa1, 0xc9, 0xa6, 0x8e, 0x7b, 0x2a, + 0x8d, 0x01, 0xaa, 0x2c, 0x7a, 0x03, 0x7a, 0x21, 0xac, 0x4a, 0x79, 0xe8, + 0x68, 0xf1, 0xae, 0x64, 0x7b, 0x48, 0x58, 0x8f, 0xb0, 0x01, 0x7d, 0x88, + 0x48, 0x4c, 0xb1, 0xd8, 0x80, 0xc9, 0x38, 0x34, 0xb2, 0xec, 0x84, 0x44, + 0x29, 0xeb, 0xb7, 0x4a, 0x89, 0xdc, 0x1f, 0xc7, 0xbe, 0x6b, 0x91, 0xf3, + 0x1e, 0xaa, 0x2d, 0x0b, 0x2e, 0xa1, 0xd2, 0x87, 0x6b, 0xe2, 0x5e, 0xc4, + 0xef, 0xc3, 0x7e, 0x4f, 0x65, 0xae, 0xef, 0x29, 0x93, 0xc3, 0x71, 0x13, + 0xeb, 0x91, 0xa2, 0xd1, 0x76, 0x4c, 0xdf, 0x9d, 0xa7, 0xef, 0x76, 0x2b, + 0xcc, 0x03, 0xad, 0x41, 0x76, 0x8c, 0xb8, 0x6b, 0xb0, 0xa2, 0x75, 0x3c, + 0xa3, 0xfe, 0xb4, 0x86, 0x71, 0xf1, 0x8e, 0x5e, 0xb7, 0x35, 0x70, 0x86, + 0x7b, 0xb0, 0xb8, 0xa8, 0x6f, 0xbb, 0x6a, 0x47, 0xba, 0x7c, 0x70, 0xc1, + 0x59, 0x75, 0xbc, 0x2b, 0x72, 0xb7, 0x48, 0x13, 0xbd, 0xab, 0x75, 0x95, + 0x37, 0x21, 0xbe, 0x6c, 0x78, 0xe2, 0x27, 0x2a, 0xc1, 0xae, 0x7d, 0x7f, + 0x1a, 0x9c, 0xc5, 0x7c, 0x87, 0x2c, 0x1b, 0x65, 0x2d, 0x24, 0x2e, 0x8f, + 0xd2, 0x8f, 0x82, 0xa6, 0x52, 0x7e, 0xf5, 0x03, 0x90, 0xa6, 0x58, 0x96, + 0xf0, 0x98, 0xa5, 0xb1, 0x62, 0xc5, 0xe9, 0x7e, 0xb6, 0x99, 0x6d, 0x86, + 0xe7, 0x36, 0xba, 0x57, 0x6d, 0xa6, 0xd3, 0xb1, 0xbc, 0x7f, 0x6d, 0xbb, + 0xbf, 0x69, 0xbf, 0x54, 0x6b, 0x2a, 0xa8, 0x6b, 0xc2, 0x00, 0x67, 0x53, + 0x91, 0xaf, 0xc3, 0x54, 0x65, 0x4f, 0x7e, 0x02, 0xc4, 0x57, 0x64, 0x4c, + 0x6b, 0xa9, 0xc5, 0xd3, 0x63, 0x9a, 0x59, 0x06, 0xc7, 0x99, 0x64, 0x56, + 0x45, 0xb6, 0xc9, 0x60, 0x66, 0xc8, 0x32, 0xe4, 0xca, 0xb3, 0x6a, 0x0d, + 0x22, 0x20, 0xca, 0xa5, 0x73, 0xd9, 0x1f, 0xc9, 0xca, 0x58, 0x7e, 0xa4, + 0x1e, 0xd2, 0x83, 0xae, 0x36, 0x71, 0xf6, 0x24, 0x93, 0x14, 0x3c, 0x43, + 0xf4, 0xbd, 0xa7, 0xa9, 0x48, 0xde, 0xed, 0x7c, 0xb4, 0xa3, 0x52, 0x97, + 0xec, 0x0e, 0xc4, 0xf5, 0x5d, 0x2b, 0xe9, 0xb9, 0xc9, 0xc5, 0x64, 0x56, + 0xdd, 0x2d, 0xcc, 0x24, 0x61, 0x1b, 0xc8, 0x2e, 0xce, 0x58, 0x5d, 0x89, + 0xaf, 0xce, 0xcf, 0xbc, 0x59, 0xf2, 0x98, 0x29, 0xd0, 0x9a, 0x56, 0xde, + 0x82, 0xed, 0xd1, 0xa1, 0x54, 0x2b, 0x6e, 0xf5, 0xd2, 0x0f, 0x52, 0xfc, + 0x59, 0xfd, 0xd3, 0xe6, 0x53, 0x24, 0x44, 0x12, 0xd6, 0x05, 0x54, 0x36, + 0x2f, 0xf1, 0xd0, 0x67, 0x5c, 0x25, 0x27, 0xd7, 0xcd, 0xfd, 0x68, 0xcb, + 0x24, 0x5a, 0xcd, 0x19, 0x72, 0x77, 0x22, 0xc2, 0x8b, 0xfc, 0x33, 0xe8, + 0xe9, 0xc4, 0xa2, 0x91, 0x33, 0x8a, 0xe9, 0x2b, 0xb0, 0x30, 0x36, 0x8d, + 0xec, 0x12, 0xc6, 0x67, 0x40, 0x7a, 0xef, 0x36, 0xd0, 0x5b, 0x4b, 0x61, + 0xeb, 0x89, 0xd8, 0x00, 0x4f, 0x42, 0xdf, 0x4f, 0xdc, 0xc5, 0x52, 0xf4, + 0xd1, 0x25, 0xde, 0xd4, 0x4f, 0x0d, 0xb7, 0x54, 0xdf, 0x44, 0x4a, 0xd3, + 0x9d, 0x32, 0xde, 0x8f, 0x47, 0x0a, 0x86, 0xa9, 0xdf, 0xc9, 0x43, 0x89, + 0x73, 0x1a, 0xdd, 0xb1, 0x3a, 0x3c, 0x58, 0x05, 0xdb, 0x33, 0x34, 0xcd, + 0x3d, 0xf5, 0xd3, 0xd1, 0x34, 0x16, 0x2f, 0x0f, 0xd1, 0x6b, 0x49, 0x86, + 0x2a, 0x4e, 0xd0, 0x71, 0x59, 0xe2, 0x27, 0xbe, 0xce, 0x77, 0x66, 0x50, + 0x25, 0x2a, 0x9e, 0x7b, 0x2f, 0x20, 0xe6, 0xa0, 0xa8, 0xf8, 0x2f, 0xd4, + 0xe5, 0xbe, 0xb1, 0x94, 0x33, 0x39, 0xe2, 0x26, 0xcf, 0xa3, 0x35, 0x0b, + 0xeb, 0xa7, 0xd9, 0x6a, 0x34, 0xfc, 0xe4, 0x1d, 0xd9, 0x0c, 0x38, 0x46, + 0xda, 0x78, 0xdb, 0x02, 0x37, 0xbd, 0xc8, 0x38, 0xdb, 0x45, 0x34, 0xd1, + 0xad, 0xb5, 0xdb, 0x35, 0x33, 0x37, 0x94, 0x72, 0xda, 0x68, 0x31, 0x2c, + 0x7e, 0xfb, 0xd8, 0x5b, 0x2f, 0x21, 0x6a, 0x2c, 0xd7, 0xa7, 0x2d, 0xcf, + 0x55, 0x66, 0xd8, 0x4e, 0x2b, 0xe7, 0x3e, 0x2e, 0xce, 0xd2, 0x32, 0x83, + 0x31, 0xd9, 0xcf, 0xbc, 0x2e, 0x67, 0x2c, 0x84, 0xce, 0x95, 0x2e, 0xe1, + 0x2b, 0x47, 0xd0, 0x35, 0x58, 0x85, 0x27, 0xb1, 0xa6, 0x8e, 0x2d, 0x5a, + 0xe2, 0xcd, 0xb3, 0x84, 0x2e, 0x0c, 0xe2, 0x8a, 0xca, 0xc6, 0x2e, 0x41, + 0xe7, 0x60, 0xd7, 0xb2, 0x2f, 0x53, 0xe6, 0x80, 0xd7, 0x1e, 0x31, 0xcb, + 0xdb, 0xf6, 0xd9, 0x5c, 0x31, 0x7e, 0xd8, 0x58, 0xd9, 0x55, 0x30, 0x26, + 0xc4, 0x5d, 0xd9, 0xb1, 0x2e, 0x8a, 0xac, 0x98, 0xd9, 0x60, 0x2d, 0x76, + 0x93, 0x5a, 0xd7, 0x68, 0x2c, 0x53, 0x7e, 0xb7, 0xd5, 0xde, 0x2b, 0x91, + 0x6a, 0xe7, 0xd6, 0x01, 0x2a, 0xfd, 0x59, 0xbc, 0xd7, 0x0e, 0x28, 0x78, + 0x40, 0x83, 0xd1, 0x36, 0x2b, 0xaf, 0x2e, 0xc8, 0xcf, 0xbe, 0x2c, 0xb7, + 0x2c, 0xfc, 0xce, 0xd0, 0x2d, 0x63, 0x2b, 0xdf, 0xce, 0x2c, 0x2d, 0xde, + 0x2b, 0x1d, 0x1e, 0x1f, 0xca, 0xd8, 0xdc, 0xe5, 0x1d, 0xc4, 0xd0, 0x7c, + 0xdc, 0x4f, 0x1b, 0x2b, 0xdb, 0x10, 0xdd, 0x35, 0x1f, 0xa1, 0xc2, 0x0d, + 0xba, 0xe8, 0x23, 0xd0, 0xc1, 0xa4, 0xb8, 0x02, 0x24, 0xce, 0xc2, 0x81, + 0xb2, 0x0b, 0x27, 0x59, 0xbc, 0xb4, 0xa8, 0x6d, 0x28, 0x78, 0xbb, 0x71, + 0xa2, 0xdf, 0x2c, 0xf2, 0xcd, 0x85, 0x9f, 0xcb, 0x2e, 0xbb, 0xcb, 0x91, + 0x94, 0x55, 0x2e, 0x97, 0xcb, 0x47, 0x85, 0xa8, 0x2e, 0x05, 0xcb, 0xa6, + 0x76, 0x43, 0x2a, 0x20, 0xcd, 0x21, 0x5d, 0x82, 0x25, 0xc6, 0xcd, 0xf9, + 0x2e, 0x12, 0x26, 0xde, 0xcd, 0x8b, 0x2b, 0x08, 0x28, 0xb7, 0xcc, 0xcf, + 0x29, 0x86, 0x2a, 0x03, 0xcc, 0x4c, 0x28, 0x83, 0x1f, 0xe9, 0xc6, 0xed, + 0xdd, 0x53, 0x1e, 0x6d, 0xcb, 0x9b, 0xdd, 0xa9, 0x1e, 0x09, 0xd1, 0x49, + 0xdc, 0xef, 0x1c, 0x25, 0xdb, 0xd6, 0xdc, 0xe7, 0x1a, 0x3f, 0xde, 0x1d, + 0xd9, 0x0e, 0x1e, 0xa5, 0xcb, 0xca, 0xc1, 0xb4, 0x22, 0x41, 0xce, 0x93, + 0xbb, 0x1b, 0x27, 0x13, 0xc3, 0xdd, 0xab, 0x5b, 0x2c, 0x68, 0xce, 0xbb, + 0xa4, 0x85, 0x2e, 0x7d, 0xcb, 0xe6, 0x96, 0x09, 0x2e, 0x91, 0xcb, 0x45, + 0x84, 0x58, 0x2c, 0xe4, 0xcc, 0x7f, 0x6d, 0x3c, 0x29, 0xeb, 0xcd, 0x7e, + 0x51, 0x19, 0x26, 0x25, 0xce, 0x04, 0x2c, 0xf5, 0x28, 0x94, 0xcd, 0x02, + 0x29, 0xb5, 0x2a, 0x7d, 0xcc, 0x39, 0x28, 0x34, 0x2b, 0xb7, 0xcb, 0xb9, + 0x27, 0x46, 0x1d, 0xc6, 0xc3, 0xa8, 0xe2, 0x31, 0x20, 0x39, 0xc7, 0xe0, + 0xde, 0xc6, 0x1e, 0xf8, 0xcc, 0xdc, 0xde, 0xfb, 0x1c, 0x68, 0xd6, 0x18, + 0xdf, 0xce, 0x1c, 0x48, 0xdd, 0x8f, 0xdd, 0xd1, 0x1c, 0xb8, 0xdf, 0xe5, + 0xd7, 0x44, 0x22, 0x93, 0xdc, 0x1c, 0xca, 0xfb, 0x27, 0xbf, 0xd7, 0x55, + 0xbc, 0x61, 0x2d, 0x53, 0xd1, 0x96, 0xaa, 0x65, 0x2e, 0xb5, 0xcc, 0xb6, + 0x98, 0x0e, 0x2e, 0x93, 0xcb, 0x51, 0x82, 0x49, 0x2b, 0x4c, 0xcd, 0x4a, + 0x65, 0x27, 0x26, 0x60, 0xce, 0xce, 0x42, 0xfb, 0x1e, 0xb8, 0xcf, 0x5b, + 0x21, 0x48, 0x2b, 0xbb, 0xcc, 0x07, 0x27, 0x6a, 0x42, 0xe5, 0xcc, 0xd4, + 0x20, 0xc4, 0x4e, 0xff, 0xcc, 0x81, 0x21, 0xe5, 0x1d, 0x3b, 0xbd, 0x76, + 0xe5, 0xf0, 0x1e, 0x92, 0xc2, 0x8f, 0xe4, 0x84, 0x21, 0x69, 0xc8, 0xff, + 0xe0, 0xaf, 0x20, 0xb9, 0xce, 0xc2, 0xe1, 0x09, 0x1d, 0xfb, 0xda, 0x42, + 0xe2, 0x92, 0x19, 0xce, 0xe6, 0x66, 0xe5, 0xe2, 0x26, 0x3b, 0xdc, 0x9b, + 0xd1, 0x94, 0x33, 0x28, 0xd4, 0x38, 0xbd, 0xdd, 0x3a, 0x1c, 0xcf, 0x3c, + 0xab, 0xf4, 0x3d, 0xd5, 0xcb, 0xce, 0x97, 0xa8, 0x3e, 0x2c, 0xc9, 0xf3, + 0x80, 0xfa, 0x3b, 0xbf, 0xc9, 0x27, 0x61, 0xe5, 0x37, 0x24, 0xca, 0x07, + 0x3e, 0x3a, 0x3a, 0x90, 0xca, 0x4a, 0x21, 0xca, 0x4d, 0x81, 0xca, 0x7f, + 0x21, 0x11, 0x5f, 0xb3, 0xcb, 0x54, 0x1e, 0x5e, 0x78, 0x36, 0xcb, 0x1b, + 0x1b, 0x9f, 0x22, 0x16, 0xb4, 0x7f, 0xe4, 0xb0, 0x20, 0x65, 0xba, 0xde, + 0xe7, 0x79, 0x22, 0x5f, 0xc1, 0x24, 0xe5, 0xa1, 0x24, 0x5f, 0xc8, 0x5e, + 0xe4, 0x7e, 0x28, 0x1b, 0xd0, 0xe8, 0xe3, 0x61, 0x2e, 0x1f, 0xd6, 0xad, + 0xdd, 0x06, 0x3d, 0x04, 0xcc, 0xeb, 0xc7, 0xc4, 0x46, 0xff, 0xc5, 0xe4, + 0xb5, 0x3f, 0x50, 0x62, 0xbf, 0xc6, 0xa3, 0x40, 0x54, 0x8d, 0xbd, 0x00, + 0x91, 0x0b, 0x56, 0xb5, 0xbb, 0x8a, 0x7a, 0x53, 0x57, 0xb8, 0xba, 0x50, + 0x60, 0x03, 0x59, 0xcc, 0xbb, 0x9b, 0x42, 0x65, 0x5d, 0xb6, 0xbd, 0xbb, + 0x2b, 0xe9, 0x68, 0xb2, 0xbf, 0xdc, 0x1a, 0x6a, 0x7b, 0x26, 0xc6, 0xec, + 0x17, 0xe4, 0x89, 0x3f, 0xc8, 0xd9, 0x13, 0xea, 0x26, 0x7c, 0xaa, 0xdb, + 0xe2, 0x83, 0x26, 0xdb, 0xb1, 0xd0, 0xe4, 0xa1, 0x28, 0xe7, 0xb6, 0x6a, + 0xe6, 0x3c, 0x2b, 0xdb, 0xc0, 0x17, 0xe8, 0xb1, 0x35, 0x35, 0xc9, 0x5e, + 0xe9, 0x38, 0x46, 0x4c, 0xc3, 0x2c, 0xd2, 0x35, 0x52, 0x32, 0xbc, 0x5c, + 0xbd, 0x7c, 0x5c, 0x58, 0xb5, 0x48, 0xab, 0x93, 0x63, 0x1c, 0xb1, 0x57, + 0x9a, 0x93, 0x67, 0x2c, 0xae, 0xfa, 0x89, 0x28, 0x6a, 0xd2, 0xad, 0xe1, + 0x74, 0x01, 0x6e, 0x53, 0xad, 0xd3, 0x5e, 0x11, 0x73, 0xbf, 0xae, 0xcd, + 0x48, 0x90, 0x79, 0x2a, 0xb1, 0xb8, 0x35, 0x96, 0x7e, 0x4e, 0xb4, 0xcb, + 0x24, 0x23, 0x83, 0xd4, 0xba, 0x0a, 0x14, 0x0d, 0x93, 0x66, 0xc2, 0x5d, + 0x15, 0x61, 0x29, 0x71, 0x9e, 0x74, 0xe2, 0x59, 0x2b, 0x19, 0xa4, 0xc2, + 0xe3, 0x58, 0x2f, 0xc4, 0xaa, 0xc2, 0xe3, 0xa0, 0x38, 0x46, 0xb3, 0x49, + 0xe7, 0x5c, 0x4d, 0xe2, 0xb5, 0x3f, 0xda, 0xc7, 0x58, 0xc0, 0xb2, 0xaf, + 0xcb, 0xd9, 0x63, 0x58, 0xac, 0xc3, 0xb8, 0xbd, 0x6c, 0x1f, 0xa9, 0x0b, + 0xa6, 0x6f, 0x72, 0xf1, 0xa6, 0x14, 0x95, 0xd7, 0x78, 0x05, 0xa4, 0x5d, + 0x84, 0x36, 0x7c, 0x35, 0xa3, 0xc5, 0x70, 0xb2, 0x80, 0x3e, 0xa4, 0x8c, + 0x5e, 0x15, 0x84, 0x46, 0xa6, 0x05, 0x4b, 0xab, 0x87, 0xe1, 0xa9, 0x4e, + 0x39, 0x64, 0x8c, 0xa9, 0xac, 0x39, 0x29, 0xf8, 0x91, 0x46, 0xb0, 0x2e, + 0x19, 0xeb, 0x9d, 0x82, 0xbc, 0xef, 0x19, 0x86, 0x2b, 0xdf, 0x94, 0x50, + 0xe2, 0xff, 0x2e, 0xe1, 0x99, 0xb3, 0xe3, 0x93, 0x34, 0x6b, 0x9e, 0xdc, + 0xe4, 0xa5, 0x4b, 0xff, 0xa5, 0xfd, 0xe4, 0x8e, 0x5e, 0x1f, 0xa7, 0x53, + 0xd9, 0xe5, 0x68, 0xb1, 0xa2, 0xc1, 0xc8, 0xae, 0x73, 0x20, 0xa0, 0xcc, + 0xb8, 0x0e, 0x7b, 0xc9, 0x9e, 0xc3, 0xa5, 0xb7, 0x83, 0x07, 0x9d, 0x41, + 0x94, 0x9e, 0x88, 0x18, 0x9c, 0x5b, 0x82, 0x49, 0x8b, 0xda, 0x9c, 0x37, + 0x70, 0x42, 0x8e, 0xea, 0x9d, 0x5a, 0x5e, 0x76, 0x91, 0x72, 0x9f, 0x8f, + 0x4e, 0x0f, 0x94, 0x44, 0xa2, 0x6d, 0x3d, 0x9c, 0x97, 0x71, 0xa5, 0x7c, + 0x2d, 0xd9, 0x99, 0xa5, 0xa9, 0x90, 0x1f, 0x09, 0xa8, 0x7b, 0xb5, 0xc3, + 0x1e, 0xb9, 0x2e, 0x65, 0x85, 0xd4, 0xe6, 0x2e, 0x33, 0x7e, 0x8c, 0x65, + 0xe4, 0xe3, 0x49, 0x7e, 0x91, 0xc8, 0xe4, 0x16, 0x5d, 0xb2, 0x98, 0xaa, + 0xe3, 0xb7, 0x6f, 0x5a, 0x9b, 0x79, 0xda, 0x88, 0x7a, 0xea, 0x99, 0x92, + 0xca, 0x2f, 0x84, 0x8d, 0x96, 0xf1, 0xb8, 0x3a, 0x8c, 0xe1, 0x96, 0x3b, + 0xa6, 0xc3, 0x94, 0x1b, 0x95, 0x27, 0x95, 0x5c, 0x97, 0x67, 0x95, 0x07, + 0x82, 0xbd, 0x9a, 0x3d, 0x94, 0xd1, 0x70, 0xa9, 0x9c, 0x5d, 0x95, 0xac, + 0x5f, 0x3f, 0x9e, 0x3e, 0x98, 0x79, 0x4f, 0x84, 0xa0, 0x64, 0x9b, 0xcf, + 0x3f, 0xad, 0xa2, 0xa6, 0x9f, 0x19, 0x30, 0x9c, 0xa4, 0xe4, 0xa2, 0x0b, + 0x21, 0x79, 0xb0, 0xd7, 0xaf, 0x30, 0x20, 0xee, 0x32, 0xbc, 0x75, 0x25, + 0xe6, 0xc1, 0x48, 0xd7, 0x7e, 0xc8, 0xe6, 0xd3, 0x5b, 0x87, 0x84, 0x65, + 0xe6, 0x14, 0x70, 0xad, 0x8b, 0x86, 0xe4, 0xae, 0x82, 0xb7, 0x91, 0x85, + 0xdf, 0x8c, 0x8d, 0xf0, 0x90, 0x88, 0xcc, 0x5e, 0x97, 0x54, 0x8f, 0x32, + 0xba, 0x74, 0x9d, 0x9b, 0x8e, 0xba, 0xa8, 0xb3, 0xa2, 0xcc, 0x8d, 0xdb, + 0x96, 0x59, 0xa6, 0x27, 0x8c, 0xc2, 0x83, 0x40, 0xa8, 0x91, 0x8c, 0x43, + 0x71, 0x0b, 0xaa, 0x5d, 0x8c, 0xff, 0x60, 0x2b, 0xac, 0x11, 0x8f, 0x2c, + 0x4f, 0xd6, 0xad, 0xc4, 0x92, 0x4c, 0x3f, 0xa3, 0xaf, 0x37, 0x95, 0x66, + 0x30, 0xc0, 0xb1, 0x1a, 0x98, 0x84, 0x22, 0x11, 0xb9, 0x8e, 0xa3, 0x12, + 0x21, 0x43, 0x46, 0x41, 0x6a, 0x10, 0xec, 0x29, 0x5a, 0x3a, 0x72, 0x0c, + 0xea, 0x5c, 0x70, 0x83, 0x77, 0x72, 0xe8, 0xf6, 0x87, 0x35, 0x80, 0xbd, + 0xe7, 0xc3, 0x98, 0x32, 0x88, 0x5b, 0xe3, 0xb5, 0xa1, 0x76, 0x88, 0x62, + 0xcf, 0xe9, 0xa8, 0xac, 0x88, 0x21, 0xbe, 0x8f, 0xad, 0x48, 0x87, 0xb7, + 0xac, 0x8c, 0xb1, 0x37, 0x85, 0x8f, 0x97, 0x91, 0xb3, 0xe1, 0x83, 0xd5, + 0x84, 0x08, 0xb5, 0xfb, 0x83, 0x71, 0x71, 0xd7, 0xb7, 0x0b, 0x83, 0xef, + 0x61, 0x15, 0xb8, 0x2b, 0x85, 0x57, 0x4f, 0xda, 0xb9, 0x74, 0x87, 0xbc, + 0x3e, 0xa6, 0xba, 0xd1, 0x8a, 0x60, 0x2f, 0x63, 0xbb, 0xe3, 0x8c, 0x8b, + 0x1f, 0x59, 0xc2, 0xf5, 0x96, 0x2f, 0x1e, 0x97, 0x2d, 0x17, 0x2e, 0xaa, + 0xd2, 0x92, 0x72, 0x9d, 0x61, 0xa0, 0xef, 0x5a, 0x88, 0x8a, 0x6b, 0xa5, + 0xec, 0xb0, 0x97, 0x91, 0x74, 0xd7, 0xeb, 0x74, 0xad, 0xa0, 0x80, 0x3a, + 0xea, 0xef, 0xb3, 0x4b, 0x80, 0xf8, 0xd6, 0x91, 0xb8, 0x2b, 0x80, 0xb2, + 0xc3, 0xc1, 0xbb, 0x43, 0x7f, 0x62, 0xaf, 0x2b, 0xbf, 0x13, 0x7c, 0x5b, + 0x98, 0xb4, 0xc0, 0x54, 0x7a, 0x5c, 0x85, 0x38, 0xc1, 0x51, 0x79, 0x54, + 0x73, 0x50, 0xc2, 0x48, 0x79, 0x9e, 0x61, 0xea, 0xc3, 0x43, 0x7a, 0xaa, + 0x4f, 0x9b, 0xc4, 0x2b, 0x7c, 0xc2, 0x3c, 0xf8, 0xc5, 0x7d, 0x7e, 0xb4, + 0x2b, 0x76, 0xc6, 0x10, 0x80, 0xc9, 0x1a, 0xd1, 0xc8, 0x3c, 0x8a, 0x99, + 0x1b, 0x9e, 0x2d, 0x31, 0x2e, 0x99, 0xd2, 0x9b, 0x86, 0x19, 0x56, 0x95, + 0xf3, 0xe1, 0x98, 0x97, 0x5f, 0xfc, 0xec, 0x34, 0xa9, 0x42, 0x66, 0x69, + 0xe9, 0x79, 0xba, 0x4e, 0x70, 0xe4, 0xea, 0x9b, 0xc4, 0xa3, 0x78, 0xcb, + 0xdf, 0xbf, 0xc6, 0xa4, 0x77, 0x64, 0xca, 0xc5, 0xc8, 0xaa, 0x75, 0x94, + 0xb4, 0x33, 0xca, 0xcc, 0x71, 0xd7, 0x9d, 0xdd, 0xcb, 0xd7, 0x6f, 0x52, + 0x88, 0xeb, 0xcc, 0xaf, 0x6d, 0x60, 0x75, 0x51, 0xcd, 0x69, 0x6c, 0x72, + 0x61, 0xb3, 0xce, 0xa2, 0x6c, 0xc0, 0x4d, 0xd5, 0xcf, 0xe0, 0x6e, 0x98, + 0x39, 0xaa, 0xd0, 0xc0, 0x71, 0xea, 0x26, 0xcb, 0xcd, 0x6a, 0x79, 0xf4, + 0x22, 0xba, 0xcc, 0x83, 0x83, 0x18, 0x20, 0xad, 0x8c, 0xa1, 0x3c, 0x5e, + 0xf6, 0x48, 0x9a, 0x3f, 0x45, 0x2d, 0xf1, 0x4f, 0xa7, 0x19, 0x4d, 0xdc, + 0xec, 0x6f, 0xb7, 0x9a, 0x5b, 0x47, 0xe9, 0x60, 0xc8, 0x06, 0x62, 0xb8, + 0xe9, 0x84, 0xd3, 0x35, 0x6e, 0xfb, 0xe8, 0xa4, 0xd4, 0xc9, 0x6d, 0x0a, + 0xd3, 0x43, 0xd7, 0x16, 0x69, 0x9c, 0xba, 0xa6, 0xd8, 0x44, 0x65, 0x9f, + 0xa2, 0x19, 0xd8, 0xb1, 0x62, 0x4b, 0x8c, 0x07, 0xd8, 0x89, 0x5f, 0xe1, + 0x77, 0x53, 0xd8, 0xf8, 0x5d, 0x7d, 0x62, 0x45, 0xda, 0x4c, 0x5d, 0xc5, + 0x4b, 0x84, 0xdc, 0x8c, 0x5d, 0x6f, 0x36, 0xbd, 0xd4, 0x0b, 0x62, 0x83, + 0x2a, 0x59, 0xd0, 0x0a, 0x6d, 0xef, 0x26, 0x0e, 0xce, 0xc4, 0x76, 0xef, + 0x24, 0x16, 0x96, 0x13, 0x32, 0xf3, 0xed, 0x62, 0xa6, 0x35, 0x36, 0x76, + 0xec, 0xff, 0xb6, 0x4d, 0x3b, 0x7a, 0xf0, 0x05, 0xc5, 0x34, 0x4a, 0xf6, + 0xec, 0xc3, 0xd0, 0x52, 0x53, 0xab, 0xe8, 0x5a, 0xd5, 0xfd, 0x57, 0x7a, + 0xdd, 0x5b, 0xdb, 0xb7, 0x59, 0xd5, 0xd3, 0x5e, 0xe0, 0x0b, 0x54, 0x62, + 0xb9, 0x68, 0xde, 0xd2, 0x51, 0x2e, 0x9f, 0xa8, 0xe0, 0xf7, 0x4b, 0xcf, + 0x88, 0xeb, 0xe2, 0x46, 0x47, 0x14, 0x74, 0x34, 0xe0, 0x52, 0x41, 0x36, + 0x5b, 0xcf, 0xdd, 0x46, 0x3a, 0xbc, 0x41, 0x34, 0xd8, 0xa5, 0x41, 0x17, + 0x31, 0x80, 0xd3, 0xfd, 0x4f, 0xe2, 0x2b, 0xd3, 0xd1, 0xaa, 0x5d, 0x8e, + 0x28, 0xcc, 0xcf, 0xb8, 0x6a, 0xef, 0x26, 0x0a, 0xa2, 0x65, 0x30, 0xad, + 0xe6, 0xa2, 0xa7, 0xa1, 0x34, 0x03, 0xdf, 0xe9, 0xb5, 0x56, 0x35, 0xb6, + 0xe4, 0xfe, 0xd2, 0xc8, 0x38, 0x65, 0xee, 0x50, 0xd9, 0xf3, 0x37, 0xc1, + 0xe2, 0x05, 0xd9, 0xf6, 0x42, 0xc1, 0xda, 0xdc, 0xdd, 0x7b, 0x44, 0x36, + 0xce, 0xdd, 0xdc, 0xae, 0x3a, 0xcd, 0xb0, 0x56, 0xdc, 0x11, 0x36, 0x11, + 0x95, 0x74, 0xdc, 0x77, 0x34, 0x84, 0x80, 0xd4, 0xda, 0x51, 0x32, 0x15, + 0x6b, 0xe8, 0xd9, 0x7f, 0x30, 0xfb, 0x57, 0x52, 0xd9, 0x93, 0x2f, 0x29, + 0x40, 0x3b, 0xd3, 0x72, 0x2f, 0x31, 0x30, 0x04, 0xd0, 0xdf, 0x2f, 0x8c, + 0x2d, 0x5d, 0xd1, 0xb0, 0x4b, 0x17, 0x2a, 0x57, 0xd1, 0x62, 0x5a, 0xb0, + 0x28, 0x78, 0xa9, 0x7f, 0x2f, 0x1c, 0xe3, 0xe2, 0xb5, 0x58, 0x2f, 0x92, + 0xe4, 0x36, 0xc8, 0x21, 0x32, 0xed, 0xe3, 0x2c, 0xd5, 0x76, 0x32, 0xd7, + 0xdf, 0x44, 0xd7, 0x87, 0x33, 0xf9, 0xdb, 0xd0, 0xd9, 0x88, 0x33, 0xfd, + 0xd8, 0xa3, 0xd9, 0xe0, 0x32, 0x7d, 0xc4, 0xc9, 0xda, 0x51, 0x31, 0x0b, + 0xad, 0x4c, 0xda, 0x29, 0x2f, 0xfc, 0x94, 0x2d, 0xd8, 0xea, 0x2e, 0xa8, + 0x7f, 0xec, 0xd7, 0x4a, 0x2d, 0xa7, 0x6c, 0x13, 0xd7, 0x73, 0x2d, 0x0f, + 0x5a, 0xd1, 0xd8, 0x3b, 0x2a, 0xf3, 0x42, 0x39, 0xd2, 0x5f, 0x2c, 0xcf, + 0x2f, 0x9e, 0xd0, 0xa2, 0x2d, 0x96, 0x2d, 0xa1, 0xcf, 0x8a, 0x2e, 0x1a, + 0x2c, 0x64, 0xce, 0xc8, 0x2e, 0x7a, 0x2b, 0x8f, 0x1e, 0xd6, 0xce, 0x23, + 0xde, 0xc8, 0x1e, 0x9e, 0xd2, 0x98, 0xde, 0x54, 0x1c, 0x9c, 0xdd, 0xf2, + 0xdf, 0x18, 0x1c, 0x07, 0xdf, 0x57, 0xdd, 0x0d, 0x24, 0x2d, 0xc5, 0x47, + 0xbb, 0x49, 0x20, 0x01, 0xcf, 0x01, 0xbe, 0x19, 0x23, 0xbb, 0xc5, 0x97, + 0xb0, 0x40, 0x2b, 0x06, 0xd2, 0x2e, 0xae, 0x0b, 0x2d, 0xab, 0xcd, 0xf9, + 0x9f, 0xcd, 0x2f, 0x07, 0xcb, 0xb7, 0x94, 0x00, 0x2e, 0xa3, 0xcb, 0x54, + 0x85, 0xac, 0x2e, 0x3c, 0xcb, 0xd6, 0x75, 0xbb, 0x2b, 0x36, 0xcd, 0xad, + 0x5e, 0x17, 0x28, 0x04, 0xcf, 0x16, 0x2f, 0x1c, 0x28, 0x5c, 0xce, 0xdf, + 0x2c, 0x18, 0x29, 0x45, 0xce, 0x52, 0x29, 0xf5, 0x2a, 0x7c, 0xcd, 0x93, + 0x28, 0xe0, 0x20, 0x7c, 0xc9, 0x05, 0xdf, 0x6a, 0x1f, 0x5b, 0xcf, 0x57, + 0xe0, 0x08, 0x1c, 0xe0, 0xd7, 0xc0, 0xe1, 0x6d, 0x1c, 0xe0, 0xdf, 0xd0, + 0xe0, 0x78, 0x1d, 0x37, 0xe1, 0x62, 0xdb, 0xc8, 0x22, 0xf0, 0xdd, 0x9a, + 0xd0, 0xff, 0x24, 0x8c, 0xdb, 0x7a, 0xc6, 0x80, 0x2a, 0x7f, 0xd5, 0x35, + 0xb5, 0x5c, 0x2d, 0xad, 0xcf, 0x9b, 0xa4, 0xd3, 0x2e, 0xeb, 0xcc, 0x2f, + 0x95, 0xcc, 0x2e, 0x9e, 0xcb, 0x54, 0x83, 0xc4, 0x2d, 0x94, 0xcc, 0xed, + 0x6d, 0x25, 0x2c, 0x6a, 0xce, 0xd2, 0x52, 0x36, 0x29, 0x36, 0xcf, 0x8d, + 0x2e, 0xa2, 0x29, 0xa6, 0xcf, 0x3b, 0x2a, 0x94, 0x2b, 0x2c, 0xce, 0x12, + 0x28, 0xbc, 0x2c, 0x48, 0xcd, 0x3b, 0x27, 0xb4, 0x1f, 0xa1, 0xc6, 0x78, + 0xe3, 0x43, 0x21, 0xa2, 0xc9, 0xcb, 0xe0, 0x87, 0x20, 0xfb, 0xd0, 0x65, + 0xe1, 0x1c, 0x1e, 0x8f, 0xda, 0x96, 0xe2, 0xc4, 0x1e, 0x82, 0xe2, 0x5e, + 0xe2, 0x09, 0x22, 0x4a, 0xe1, 0x92, 0xd8, 0x4e, 0x27, 0xb3, 0xde, 0x5c, + 0xcc, 0x79, 0x2b, 0xa4, 0xd9, 0xe7, 0xbe, 0x53, 0x2f, 0xa5, 0xd2, 0xe6, + 0xab, 0x36, 0x2f, 0x42, 0xcc, 0xdc, 0x97, 0xb5, 0x2e, 0xb3, 0xcb, 0x45, + 0x81, 0xa2, 0x2d, 0x5b, 0xce, 0x5c, 0x65, 0x9f, 0x2b, 0xb7, 0xd2, 0x11, + 0x41, 0xa8, 0x2c, 0x0b, 0xd0, 0x9c, 0x2d, 0x96, 0x2c, 0xfc, 0xcf, 0x5b, + 0x28, 0x5f, 0x49, 0xd0, 0xd0, 0x5b, 0x22, 0x0b, 0x53, 0x44, 0xcf, 0x5d, + 0x20, 0x25, 0x20, 0x3f, 0xbf, 0x52, 0xe5, 0xe4, 0x21, 0x84, 0xc4, 0xbe, + 0xe4, 0xbc, 0x23, 0xfe, 0xca, 0x83, 0xe1, 0xb9, 0x24, 0x85, 0xd1, 0x86, + 0xe2, 0x42, 0x23, 0x36, 0xdd, 0x98, 0xe4, 0x48, 0x28, 0x4c, 0xe3, 0x48, + 0xe1, 0x21, 0x2e, 0xa4, 0xe1, 0xa4, 0xd4, 0xc5, 0x37, 0xf1, 0xe3, 0x65, + 0xcb, 0x4d, 0x3f, 0xbe, 0xdf, 0x22, 0xb8, 0xa6, 0x44, 0xf2, 0xdb, 0x50, + 0xa2, 0xa0, 0x45, 0x2f, 0xda, 0x5b, 0x8a, 0x2b, 0x43, 0x84, 0xd9, 0x99, + 0x69, 0x3b, 0x3f, 0x18, 0xdb, 0x12, 0x43, 0xd5, 0x44, 0x21, 0xd7, 0x4a, + 0x29, 0x6a, 0x53, 0x19, 0xd1, 0xa7, 0x21, 0x42, 0x70, 0x95, 0xd1, 0x0b, + 0x1e, 0x80, 0x7a, 0xb1, 0xce, 0x6f, 0x1d, 0x97, 0x24, 0x8c, 0xb5, 0x74, + 0xe5, 0x57, 0x23, 0xab, 0xbd, 0x17, 0xe7, 0xf1, 0x25, 0x70, 0xc3, 0x6f, + 0xe6, 0xbe, 0x28, 0x39, 0xca, 0xea, 0xe5, 0x16, 0x2f, 0x96, 0xd3, 0x10, + 0xe3, 0x4d, 0x3a, 0xe8, 0xdf, 0xe9, 0xe5, 0x24, 0x47, 0x3a, 0xda, 0x4e, + 0xd4, 0x2f, 0x50, 0xe4, 0xd3, 0x24, 0xc1, 0xfc, 0x57, 0xdf, 0xce, 0x1f, + 0xaf, 0x00, 0x5c, 0xeb, 0xcb, 0x00, 0x9b, 0xb2, 0x5e, 0x7a, 0xca, 0x0b, + 0x83, 0xda, 0x5f, 0xe3, 0xc9, 0xa4, 0x69, 0x89, 0x61, 0xb3, 0xca, 0xc3, + 0x4c, 0x7e, 0x69, 0xb1, 0xcc, 0xe0, 0x31, 0xa3, 0x72, 0xf6, 0xce, 0x6f, + 0x1d, 0xdb, 0x7b, 0x2d, 0xcb, 0xfa, 0x1b, 0xa4, 0x90, 0x6a, 0xcb, 0xc6, + 0x17, 0x52, 0x28, 0x83, 0xad, 0x5d, 0xe3, 0x82, 0x29, 0x58, 0xb4, 0x7f, + 0xe5, 0xc8, 0x2b, 0x19, 0xb9, 0x7b, 0xe8, 0x0d, 0x2f, 0xd8, 0xc2, 0x24, + 0xe8, 0xd7, 0x3f, 0x5a, 0xcb, 0xee, 0xe6, 0xd9, 0x52, 0xfc, 0xcd, 0x42, + 0xd9, 0xb9, 0x5b, 0x91, 0xc9, 0x4f, 0xca, 0x7a, 0x65, 0x94, 0xc2, 0xca, + 0xb8, 0x6f, 0x6c, 0x71, 0xbf, 0x5d, 0xa7, 0x39, 0x71, 0x43, 0xbc, 0x66, + 0x94, 0x8b, 0x74, 0xa8, 0xbb, 0xca, 0x7f, 0x5a, 0x78, 0x49, 0xbb, 0xdd, + 0x68, 0x6e, 0x7c, 0xd1, 0xbc, 0xb2, 0x50, 0xc0, 0x82, 0x1d, 0xbf, 0x14, + 0x3a, 0x4a, 0x87, 0x35, 0xc2, 0x07, 0x27, 0x90, 0x89, 0x61, 0xc2, 0x81, + 0x15, 0xa5, 0x96, 0x9c, 0xc7, 0x67, 0x12, 0x8b, 0x2b, 0x8d, 0xa0, 0xb9, + 0xe2, 0xe6, 0x2d, 0x96, 0xa7, 0x1d, 0xe4, 0x03, 0x31, 0xd4, 0xac, 0xba, + 0xe4, 0xdc, 0x40, 0x47, 0xb6, 0xbc, 0xe8, 0x83, 0x57, 0x49, 0xbf, 0x40, + 0xe3, 0x9c, 0x63, 0x0b, 0xbc, 0xef, 0xd4, 0x0a, 0x6d, 0x58, 0xb8, 0x9d, + 0xc3, 0xc5, 0x76, 0x37, 0xb5, 0x12, 0xb2, 0x5f, 0x7d, 0x81, 0xb2, 0xa8, + 0xa1, 0xbc, 0x82, 0x7d, 0xb0, 0xc2, 0x8f, 0xfd, 0x86, 0x9c, 0xaf, 0xa9, + 0x7b, 0x8e, 0x8a, 0xa8, 0xb0, 0x1d, 0x67, 0xc1, 0x8d, 0xf3, 0xb1, 0x75, + 0x54, 0x05, 0x90, 0xfe, 0xb4, 0x53, 0x40, 0xce, 0x93, 0x98, 0xb7, 0x77, + 0x2e, 0x91, 0x97, 0xc2, 0xb9, 0xa1, 0x1c, 0x77, 0xa1, 0x3d, 0xc2, 0x1e, + 0x19, 0x80, 0x2d, 0xf3, 0x96, 0xd6, 0xe3, 0x54, 0x31, 0x34, 0x9c, 0x39, + 0xe4, 0x01, 0x3c, 0xbd, 0xa0, 0x4f, 0xe4, 0x81, 0x54, 0x5c, 0xa9, 0x27, + 0xe5, 0x05, 0x67, 0x34, 0xaf, 0x61, 0xe1, 0xee, 0x73, 0x9e, 0xaf, 0x02, + 0xd2, 0xc6, 0x7d, 0x32, 0xab, 0x49, 0xc2, 0x67, 0x86, 0x07, 0xa9, 0xa3, + 0xb0, 0xfe, 0x8d, 0x93, 0xa8, 0x5a, 0x9f, 0xa5, 0x92, 0x9d, 0xa7, 0x4c, + 0x8c, 0xfb, 0x96, 0x2b, 0xa6, 0xed, 0x7a, 0x2a, 0x98, 0xd6, 0xa7, 0x8d, + 0x67, 0x8f, 0x9b, 0x03, 0xa9, 0x4a, 0x55, 0xd6, 0x9d, 0x45, 0xac, 0x22, + 0x44, 0xfa, 0x9f, 0xef, 0xaf, 0x26, 0x34, 0x7e, 0xa2, 0x4d, 0xb2, 0x81, + 0x24, 0xed, 0xac, 0x37, 0xbb, 0x0a, 0x1e, 0xbd, 0x30, 0xa4, 0x88, 0xac, + 0xe6, 0x29, 0x3c, 0x77, 0x8f, 0x61, 0xe5, 0x44, 0x54, 0xa0, 0x93, 0x91, + 0xe2, 0x68, 0x63, 0xc3, 0x9b, 0xc5, 0xe4, 0x7e, 0x78, 0xde, 0xa4, 0x7d, + 0xe3, 0x1d, 0x85, 0x04, 0xa3, 0x18, 0xd3, 0x17, 0x8e, 0xf1, 0xa1, 0x3f, + 0xc2, 0x7f, 0x97, 0xa0, 0xa0, 0xaa, 0xb1, 0x83, 0x9e, 0x7d, 0x9f, 0x8b, + 0x9f, 0xc4, 0xa1, 0xc3, 0x9f, 0x85, 0x8c, 0xe3, 0xa4, 0x26, 0x9e, 0xc9, + 0x7a, 0x5a, 0xa5, 0xd6, 0x9f, 0x5a, 0x68, 0x05, 0xa7, 0x7e, 0xa1, 0x3d, + 0x57, 0x2f, 0xa8, 0xfc, 0xa4, 0x67, 0x47, 0x40, 0xab, 0x08, 0xa7, 0x7a, + 0x37, 0x3b, 0xad, 0x69, 0xaa, 0x6a, 0x27, 0xe0, 0xb6, 0x05, 0xb4, 0x55, + 0x21, 0xd2, 0x37, 0x73, 0x77, 0x9b, 0xe3, 0xad, 0x53, 0xd3, 0x80, 0x60, + 0xe5, 0xb4, 0x63, 0x51, 0x86, 0x65, 0xe3, 0x24, 0x76, 0xe8, 0x8f, 0x33, + 0xe5, 0x6c, 0x8d, 0x0e, 0x99, 0x5b, 0xe5, 0xa0, 0x99, 0x00, 0x99, 0xee, + 0xd5, 0x3d, 0xa1, 0x61, 0x98, 0xd6, 0xc4, 0x64, 0xa8, 0x47, 0x98, 0xb0, + 0xb3, 0x47, 0xad, 0x78, 0x98, 0x17, 0xa0, 0xce, 0xb0, 0x02, 0x96, 0xcf, + 0x8d, 0x2a, 0xb1, 0xf3, 0x95, 0xfc, 0x7a, 0x86, 0xb3, 0x3a, 0x96, 0x1e, + 0x68, 0xe0, 0xb4, 0x46, 0x97, 0xb1, 0x57, 0xac, 0xb5, 0xb1, 0x99, 0xf9, + 0x47, 0x05, 0xb7, 0x1e, 0x9c, 0x91, 0x36, 0xf2, 0xb8, 0xc0, 0x9f, 0xa8, + 0x27, 0xed, 0xbf, 0x2e, 0xa9, 0x37, 0x21, 0x88, 0x54, 0x03, 0x70, 0x02, + 0xea, 0x75, 0x63, 0xe0, 0x74, 0xb1, 0xe8, 0x55, 0x78, 0x64, 0x7a, 0x34, + 0xe9, 0x2c, 0x8a, 0x2c, 0x83, 0xf8, 0xe7, 0x1d, 0x9e, 0xe0, 0x8e, 0xe9, + 0xe6, 0xd3, 0xac, 0xe9, 0x92, 0x6d, 0xd9, 0x5a, 0xb3, 0x4b, 0x92, 0x2e, + 0xc9, 0x09, 0xb8, 0x17, 0x92, 0x14, 0xb7, 0x78, 0xbb, 0x0e, 0x8f, 0xf8, + 0xa2, 0x20, 0xbd, 0x61, 0x8e, 0x1c, 0x8d, 0xbf, 0xbe, 0x73, 0x8d, 0x04, + 0x7b, 0x46, 0xbf, 0x75, 0x8c, 0x9a, 0x69, 0xb1, 0xbf, 0xfc, 0x8d, 0x99, + 0x58, 0x33, 0xc0, 0xbb, 0x8e, 0xde, 0x46, 0x8d, 0xc1, 0xa8, 0x90, 0xe9, + 0x35, 0x0d, 0xc2, 0xcd, 0x93, 0x77, 0x24, 0xc9, 0xc5, 0xd3, 0x99, 0xea, + 0x1e, 0xba, 0x6a, 0x58, 0x61, 0x5c, 0xef, 0x43, 0x7b, 0x6a, 0x67, 0x6a, + 0xee, 0xb7, 0x8a, 0xf4, 0x70, 0x18, 0xed, 0xd6, 0x9c, 0x94, 0x78, 0x7b, + 0xeb, 0x8d, 0xb1, 0xf1, 0x85, 0x1c, 0xea, 0xe0, 0xbe, 0x7e, 0x8b, 0xb0, + 0xdf, 0x3e, 0xc2, 0x24, 0x8a, 0xe1, 0xce, 0xb6, 0xc4, 0xe0, 0x89, 0x9f, + 0xba, 0x43, 0xc7, 0x38, 0x86, 0xd3, 0xa3, 0x99, 0xc8, 0x73, 0x84, 0xaa, + 0x8f, 0x02, 0xc8, 0xdb, 0x83, 0x64, 0x7c, 0x63, 0xc9, 0x53, 0x82, 0xb0, + 0x6a, 0x56, 0xca, 0x28, 0x82, 0xc5, 0x57, 0x62, 0xcb, 0x10, 0x83, 0xbd, + 0x44, 0x20, 0xcb, 0xda, 0x85, 0x8d, 0x31, 0x75, 0xcc, 0xb2, 0x87, 0x8b, + 0x20, 0xc6, 0xcc, 0x0d, 0x8e, 0xd6, 0x1d, 0xec, 0x76, 0xb3, 0x56, 0xe0, + 0xf3, 0x17, 0x8a, 0xb2, 0x5d, 0xf3, 0xf1, 0x2e, 0x9c, 0xe6, 0x62, 0xd6, + 0xeb, 0xb5, 0xad, 0x3d, 0x6b, 0x98, 0xe9, 0xb0, 0xbc, 0xcd, 0x77, 0x3d, + 0xe8, 0x92, 0xcf, 0x3e, 0x83, 0x1e, 0xea, 0xd4, 0xd0, 0x13, 0x82, 0xa6, + 0xd5, 0x28, 0xd2, 0x37, 0x80, 0x18, 0xbf, 0x56, 0xd3, 0xac, 0x7d, 0x0e, + 0xa8, 0x02, 0xd3, 0xfa, 0x7a, 0x5e, 0x91, 0xe0, 0xd4, 0x2b, 0x78, 0x4f, + 0x7e, 0x20, 0xd4, 0x13, 0x76, 0xb7, 0x6a, 0x67, 0xd4, 0xc1, 0x76, 0x70, + 0x55, 0xcb, 0xd5, 0x8e, 0x77, 0x26, 0x40, 0x6e, 0xd6, 0xe7, 0x79, 0x4c, + 0x2c, 0xe0, 0xd0, 0x9b, 0x7e, 0xf9, 0x25, 0xa5, 0xce, 0xc6, 0x87, 0x3d, + 0x22, 0x92, 0x8e, 0x2c, 0x44, 0x64, 0xf4, 0xc5, 0x9f, 0x0b, 0x4a, 0xfc, + 0xef, 0x82, 0xab, 0xbb, 0x54, 0x1b, 0xeb, 0x26, 0xba, 0x53, 0x61, 0x46, + 0xe8, 0xd7, 0xc9, 0xda, 0x68, 0x23, 0xe8, 0xf1, 0xd6, 0xa8, 0x70, 0xeb, + 0xe6, 0xfe, 0xd9, 0x46, 0x72, 0x47, 0xd7, 0xdc, 0xdc, 0xe5, 0x70, 0xe8, + 0xc1, 0xae, 0xde, 0x0e, 0x6c, 0xb7, 0xa9, 0x5d, 0xdd, 0xd8, 0x69, 0x80, + 0x91, 0xe4, 0xdd, 0x2a, 0x66, 0xb6, 0x7d, 0x1d, 0xda, 0xb6, 0x64, 0x9c, + 0x66, 0xba, 0xde, 0xb1, 0x60, 0x42, 0x4f, 0x4b, 0xdf, 0x07, 0x63, 0x92, + 0x39, 0xe7, 0xd5, 0x7d, 0x69, 0xf0, 0x2c, 0xa1, 0xd1, 0xba, 0x72, 0xa7, + 0x28, 0x0d, 0xd0, 0x06, 0x7c, 0x45, 0x25, 0x5b, 0x98, 0xa5, 0x34, 0xe0, + 0xef, 0x62, 0xac, 0x87, 0x39, 0xb6, 0xef, 0xd2, 0xbc, 0xba, 0x45, 0xf3, + 0xee, 0x22, 0xc8, 0x17, 0x4e, 0x5f, 0xec, 0x6f, 0xd2, 0xcb, 0x5a, 0x5e, + 0xe6, 0xb9, 0xd7, 0xab, 0x5d, 0xf5, 0xdd, 0xe2, 0xda, 0xd3, 0x5e, 0xd7, + 0xd4, 0xf3, 0xdd, 0xba, 0x5b, 0xf3, 0xbb, 0xe3, 0xde, 0x99, 0x56, 0xab, + 0xa1, 0x63, 0xde, 0x4b, 0x53, 0x52, 0x8b, 0x80, 0xde, 0xa4, 0x4f, 0xfc, + 0x77, 0x00, 0xe0, 0xbe, 0x4a, 0x02, 0x5f, 0xf2, 0xdf, 0x6a, 0x45, 0x68, + 0x46, 0x70, 0xdc, 0x34, 0x48, 0xf7, 0x34, 0x2b, 0xd6, 0x69, 0x59, 0x3c, + 0x2d, 0x46, 0xd3, 0x99, 0x63, 0x05, 0x29, 0xe0, 0xd1, 0x03, 0x6f, 0x6d, + 0x26, 0xfa, 0xa6, 0x9f, 0x32, 0x19, 0xe7, 0x51, 0xb1, 0xf5, 0x34, 0x07, + 0xe9, 0x36, 0xc3, 0x03, 0x39, 0x2b, 0xed, 0xb5, 0xd3, 0xd4, 0x3e, 0x00, + 0xee, 0x7e, 0xd8, 0x1b, 0x44, 0xa2, 0xde, 0x3b, 0xda, 0x7d, 0x48, 0x9c, + 0xdb, 0x00, 0xde, 0xaa, 0x4a, 0x8a, 0xd1, 0x06, 0xde, 0xa2, 0x44, 0x3c, + 0xb4, 0x44, 0xdd, 0xd9, 0x3c, 0x21, 0x98, 0x09, 0xdd, 0x66, 0x37, 0x35, + 0x81, 0xdd, 0xdb, 0xea, 0x34, 0x86, 0x6d, 0x4d, 0xdb, 0x06, 0x33, 0xad, + 0x58, 0xea, 0xda, 0x99, 0x31, 0xd2, 0x41, 0xf4, 0xd5, 0x09, 0x30, 0xd3, + 0x31, 0x36, 0xd2, 0x00, 0x30, 0xb1, 0x2e, 0x34, 0xd3, 0x63, 0x55, 0x9e, + 0x2a, 0xe8, 0xd2, 0x1a, 0x5e, 0x89, 0x29, 0x10, 0xad, 0x7c, 0x30, 0x63, + 0xe5, 0x3b, 0xb7, 0x2e, 0x31, 0x19, 0xe5, 0xe2, 0xcf, 0x42, 0x33, 0xdb, + 0xea, 0x8e, 0xd6, 0x5a, 0x35, 0x83, 0xdd, 0xf5, 0xd7, 0xda, 0x35, 0xb6, + 0xdb, 0xb1, 0xd9, 0xaa, 0x35, 0xeb, 0xd8, 0xdd, 0xda, 0x50, 0x34, 0x5b, + 0xc5, 0x04, 0xda, 0xd1, 0x33, 0x0f, 0xad, 0xc4, 0xda, 0xc9, 0x32, 0x05, + 0x94, 0xc4, 0xda, 0x3a, 0x30, 0xb9, 0x80, 0xef, 0xd8, 0x89, 0x2f, 0x81, + 0x6d, 0x14, 0xd7, 0xe8, 0x2e, 0x87, 0x59, 0xa6, 0xd9, 0x20, 0x2d, 0x2c, + 0x43, 0xbb, 0xd3, 0x85, 0x2d, 0xf1, 0x30, 0x74, 0xd1, 0x86, 0x2e, 0x75, + 0x2e, 0x45, 0xd0, 0x41, 0x2e, 0xd2, 0x2c, 0xed, 0xcf, 0x63, 0x2f, 0x15, + 0x2c, 0x03, 0x1f, 0x9a, 0xd1, 0x6e, 0xe0, 0x9e, 0x1d, 0x1e, 0xd8, 0xaf, + 0xe2, 0x46, 0x1d, 0x4a, 0xe0, 0xb1, 0xe1, 0x8b, 0x1d, 0x52, 0xe2, 0x6c, + 0xdf, 0xc3, 0x22, 0xe4, 0xde, 0x41, 0xd3, 0xe1, 0x24, 0xe4, 0xdc, 0xde, + 0xca, 0x44, 0x24, 0x37, 0xcf, 0xde, 0xba, 0x1a, 0x2c, 0x31, 0xd2, 0xd9, + 0xae, 0x68, 0x2e, 0x32, 0xce, 0x45, 0x9f, 0xb3, 0x2f, 0x40, 0xcb, 0xc6, + 0x93, 0x9f, 0x2e, 0xa8, 0xcb, 0x5a, 0x85, 0x3a, 0x2e, 0x69, 0xcb, 0xfe, + 0x75, 0x2b, 0x2c, 0x00, 0xce, 0x12, 0x5e, 0x83, 0x29, 0xb7, 0xcf, 0xeb, + 0x2f, 0xe5, 0x29, 0xf6, 0xcf, 0xb2, 0x2d, 0x37, 0x2a, 0x35, 0xcf, 0x7d, + 0x2a, 0xc8, 0x2a, 0xf5, 0xce, 0xda, 0x29, 0x3e, 0x21, 0xbf, 0xca, 0x35, + 0xe0, 0x74, 0x21, 0x1f, 0xd1, 0xfc, 0xe1, 0x21, 0x1e, 0xc5, 0xda, 0xcb, + 0xe2, 0xd6, 0x1e, 0xf8, 0xe1, 0xe9, 0xe2, 0x33, 0x21, 0x32, 0xe2, 0x33, + 0xdc, 0x30, 0x25, 0xc0, 0xde, 0xca, 0xd1, 0xd4, 0x26, 0xd2, 0xdc, 0xf6, + 0xc7, 0x9a, 0x2c, 0x31, 0xd6, 0x3a, 0xb5, 0xfd, 0x2e, 0x7e, 0xd0, 0x1b, + 0xa4, 0xe2, 0x2f, 0x31, 0xcc, 0x4c, 0x95, 0x74, 0x2e, 0xa4, 0xcb, 0x5e, + 0x83, 0x2b, 0x2e, 0x07, 0xcd, 0x39, 0x6c, 0xec, 0x2e, 0x0e, 0xcf, 0xb2, + 0x52, 0xda, 0x2b, 0x4b, 0xd0, 0x94, 0x2f, 0xc4, 0x2b, 0x91, 0xd0, 0x3f, + 0x2c, 0x4b, 0x2b, 0xdd, 0xcf, 0xea, 0x29, 0x43, 0x2c, 0xda, 0xce, 0xbd, + 0x28, 0x24, 0x21, 0xc8, 0xc8, 0x8f, 0xe3, 0x5d, 0x23, 0x6d, 0xca, 0xcf, + 0xe1, 0x47, 0x24, 0x8c, 0xd2, 0x61, 0xe1, 0x2c, 0x21, 0x84, 0xdd, 0x40, + 0xe3, 0xc4, 0x22, 0x0d, 0xe4, 0x0f, 0xe3, 0x5e, 0x26, 0x03, 0xe2, 0x90, + 0xd8, 0xd3, 0x2a, 0xcb, 0xdf, 0x9d, 0xcd, 0x44, 0x2d, 0xdf, 0xdb, 0x4f, + 0xbf, 0x6c, 0x30, 0xba, 0xd3, 0x75, 0xab, 0x7e, 0x30, 0x15, 0xcc, 0x55, + 0x96, 0x8a, 0x2e, 0xa8, 0xc9, 0xc5, 0x80, 0x5b, 0x2e, 0xd2, 0xcd, 0xf4, + 0x65, 0x93, 0x2e, 0xa2, 0xd3, 0x91, 0x42, 0x44, 0x2e, 0x7b, 0xd1, 0xdf, + 0x2f, 0x8b, 0x2e, 0xb2, 0xd1, 0x49, 0x2a, 0x98, 0x4e, 0x9a, 0xd4, 0x1d, + 0x22, 0xa7, 0x57, 0xbf, 0xd2, 0x79, 0x20, 0xb0, 0x22, 0xcd, 0xc1, 0x1a, + 0xe5, 0xc7, 0x23, 0xf4, 0xc6, 0xde, 0xe4, 0xe0, 0x26, 0x21, 0xcb, 0xbb, + 0xe2, 0x8a, 0x29, 0x54, 0xd3, 0x64, 0xe2, 0x04, 0x27, 0x0b, 0xe0, 0x63, + 0xe5, 0x75, 0x2d, 0x8d, 0xe3, 0x63, 0xe0, 0xd5, 0x31, 0x82, 0xe2, 0x62, + 0xd5, 0x2f, 0x3b, 0x5c, 0xe4, 0x4d, 0xcc, 0x1a, 0x44, 0x45, 0xe0, 0xe1, + 0xba, 0x2d, 0x4a, 0xba, 0xdc, 0x16, 0xa3, 0xef, 0x49, 0x9f, 0xdc, 0x88, + 0x8b, 0x46, 0x48, 0x7d, 0xdb, 0xc8, 0x6a, 0xa9, 0x45, 0x0f, 0xdd, 0x53, + 0x45, 0xe0, 0x4b, 0x26, 0xda, 0x7b, 0x2e, 0x8c, 0x59, 0x69, 0xd9, 0x3c, + 0x23, 0x95, 0x75, 0x03, 0xd3, 0x6d, 0x22, 0x64, 0x7d, 0x2f, 0xd1, 0xbf, + 0x1f, 0x90, 0x26, 0xb9, 0xb6, 0x4b, 0xe5, 0xe6, 0x26, 0x86, 0xbe, 0xeb, + 0xe7, 0xda, 0x28, 0x2c, 0xc5, 0x8f, 0xe6, 0xdd, 0x2b, 0x38, 0xcd, 0x49, + 0xe4, 0xac, 0x33, 0x70, 0xd5, 0x59, 0xe3, 0xb3, 0x40, 0x70, 0xe0, 0x0d, + 0xe3, 0x54, 0x4d, 0xcd, 0xe3, 0x5a, 0xdc, 0xb9, 0x5a, 0x77, 0xe0, 0xca, + 0xce, 0xf2, 0x64, 0xbf, 0xd7, 0xc4, 0xb9, 0xc0, 0x68, 0xba, 0xd5, 0xda, + 0xa5, 0x87, 0x6b, 0x57, 0xd4, 0xce, 0x8e, 0xde, 0x6e, 0x00, 0xd4, 0xb4, + 0x75, 0x4a, 0x71, 0x39, 0xd5, 0x2f, 0x5a, 0x68, 0x74, 0x41, 0xda, 0xed, + 0x37, 0x8c, 0x79, 0x21, 0xd8, 0xdd, 0x25, 0xa6, 0x83, 0x42, 0xd2, 0x16, + 0x1f, 0x87, 0x95, 0x15, 0xcf, 0x3e, 0x1a, 0x5a, 0x2a, 0x43, 0xaf, 0xd5, + 0xe4, 0x79, 0x2b, 0xd5, 0xb5, 0xad, 0xe6, 0x61, 0x2d, 0xcc, 0xbc, 0x4f, + 0xe9, 0x5a, 0x32, 0x90, 0xc3, 0xe8, 0xe8, 0xd7, 0x4b, 0xab, 0xcf, 0x55, + 0xe6, 0xa0, 0x5d, 0xd2, 0xd8, 0xa0, 0xe3, 0xf3, 0x67, 0x3f, 0xd4, 0xd1, + 0xd4, 0x30, 0x6f, 0x5c, 0xcf, 0x79, 0xc4, 0x2b, 0x76, 0x3f, 0xcb, 0xa8, + 0xb2, 0xf0, 0x7b, 0xa5, 0xc9, 0x01, 0x9f, 0x6c, 0x7f, 0x69, 0xc7, 0xcb, + 0x8a, 0xd2, 0x83, 0x53, 0xc7, 0x74, 0x73, 0xe8, 0x86, 0xb5, 0xc7, 0xfe, + 0x5b, 0x7c, 0x89, 0x4c, 0xca, 0x41, 0x43, 0x02, 0x8f, 0x1b, 0xcb, 0x89, + 0x2b, 0xc8, 0x92, 0xf0, 0xcc, 0xbe, 0x17, 0xab, 0x9b, 0xd2, 0xcc, 0x37, + 0x16, 0xe7, 0x2d, 0x5f, 0xa2, 0xf7, 0xe3, 0x6b, 0x30, 0x32, 0xa9, 0x1a, + 0xe3, 0xff, 0x34, 0xcb, 0xae, 0xc5, 0xe4, 0x0d, 0x4c, 0xe1, 0xb8, 0xca, + 0xe7, 0x77, 0x5d, 0x90, 0xc3, 0x56, 0xe5, 0x1d, 0x6e, 0x35, 0xc8, 0xe9, + 0xde, 0x1a, 0x77, 0x78, 0xc5, 0x8d, 0xce, 0xf6, 0x80, 0x4b, 0xc1, 0xc5, + 0xbe, 0x55, 0x87, 0xca, 0xbf, 0x1c, 0xad, 0xd1, 0x8c, 0xe3, 0xbd, 0x2a, + 0x9b, 0x1a, 0x91, 0x1d, 0xbb, 0xf1, 0x86, 0xea, 0x95, 0x00, 0xbb, 0x95, + 0x72, 0x20, 0x97, 0xba, 0xbc, 0x57, 0x5d, 0x79, 0x99, 0xee, 0xbe, 0x94, + 0x49, 0x17, 0x9c, 0xf5, 0xc1, 0x22, 0x34, 0xcc, 0x9f, 0xce, 0xc3, 0x82, + 0x21, 0x36, 0xa5, 0x06, 0xc7, 0x88, 0x19, 0x92, 0x2f, 0xb8, 0x99, 0x52, + 0xe3, 0xa2, 0x33, 0x23, 0x9e, 0x7b, 0xe4, 0x7c, 0x45, 0x81, 0xa3, 0x35, + 0xe3, 0xee, 0x5b, 0x41, 0xac, 0x2e, 0xe4, 0xa8, 0x6c, 0xf0, 0xb3, 0x80, + 0xe2, 0xe9, 0x7e, 0x2c, 0xb8, 0xee, 0xda, 0x73, 0x87, 0xff, 0xb8, 0x10, + 0xcc, 0x25, 0x90, 0x79, 0xb5, 0x2e, 0xbb, 0xaa, 0x98, 0x62, 0xb3, 0xbf, + 0xaa, 0xcf, 0x9d, 0x38, 0xb2, 0xb8, 0x98, 0x14, 0xa0, 0xb0, 0xb2, 0x09, + 0x84, 0xb5, 0xa3, 0x22, 0xb2, 0x6d, 0x71, 0x6e, 0xa4, 0x98, 0xb3, 0x7d, + 0x5e, 0x90, 0xa6, 0x83, 0xb5, 0xe2, 0x4c, 0xc1, 0xa8, 0xc4, 0xb8, 0xa4, + 0x3a, 0xb1, 0xaa, 0xf0, 0xbb, 0xc8, 0x29, 0xbd, 0xb1, 0x33, 0xc1, 0x84, + 0x1e, 0x47, 0x33, 0x06, 0x8c, 0x4a, 0xe4, 0xdc, 0x44, 0xdf, 0x91, 0x92, + 0xe4, 0xca, 0x5c, 0x03, 0x97, 0x13, 0xe3, 0x56, 0x6b, 0x1c, 0x9f, 0x50, + 0xe5, 0x13, 0x7e, 0x7b, 0xa7, 0x22, 0xe4, 0x1b, 0x90, 0x29, 0xad, 0x71, + 0xdc, 0x84, 0x99, 0x6a, 0xad, 0x06, 0xcc, 0xeb, 0xa2, 0x8b, 0xab, 0x49, + 0xbc, 0x8e, 0xa9, 0x48, 0xaa, 0x58, 0xaa, 0x95, 0xac, 0x48, 0xaa, 0x30, + 0x97, 0x82, 0xae, 0x75, 0xa9, 0x65, 0x84, 0x97, 0xaf, 0xd3, 0xa9, 0x4e, + 0x71, 0x97, 0xb0, 0xe6, 0xaa, 0xc4, 0x5f, 0xa8, 0xb2, 0x45, 0xad, 0x4b, + 0x4f, 0x16, 0xb3, 0xda, 0xb0, 0x50, 0x3e, 0xeb, 0xb5, 0xdd, 0xb3, 0x32, + 0x2d, 0xed, 0xbb, 0x07, 0xb9, 0xed, 0x23, 0x7e, 0x47, 0xc9, 0x7f, 0x3c, + 0xe6, 0xbb, 0x5a, 0xa5, 0x83, 0xf9, 0xe6, 0x05, 0x6a, 0x14, 0x8a, 0x0c, + 0xe3, 0xf0, 0x7f, 0xb1, 0x92, 0xf0, 0xe6, 0x38, 0x93, 0x14, 0x9c, 0xd3, + 0xe5, 0x15, 0xa3, 0xba, 0xa3, 0xe2, 0xde, 0xd7, 0xab, 0x62, 0xa3, 0xe7, + 0xcf, 0x46, 0xb3, 0x17, 0xa3, 0x2e, 0xbe, 0xb9, 0xb7, 0xf5, 0xa2, 0x5a, + 0xab, 0xa5, 0xba, 0x13, 0xa1, 0x44, 0x97, 0xa9, 0xbb, 0x6f, 0xa0, 0x47, + 0x84, 0xca, 0xbc, 0x16, 0x9f, 0xf0, 0x72, 0x44, 0xbc, 0xcd, 0xa0, 0x95, + 0x60, 0x86, 0xbd, 0xe6, 0xa2, 0x65, 0x4f, 0x38, 0xbf, 0x27, 0xa4, 0xa9, + 0x3d, 0xe0, 0xc0, 0x41, 0xa7, 0x6f, 0x2c, 0xed, 0xc4, 0x1c, 0xad, 0xcc, + 0x22, 0x2a, 0x59, 0x5e, 0x74, 0x98, 0xe9, 0xfd, 0x6e, 0x94, 0x78, 0x22, + 0xe8, 0xa0, 0x7f, 0xcc, 0x7e, 0x53, 0xe6, 0xa2, 0x8d, 0x92, 0x87, 0x52, + 0xe6, 0xd4, 0xa3, 0x4b, 0x92, 0xa6, 0xe7, 0x25, 0xb7, 0xcb, 0x9c, 0x83, + 0xe3, 0xff, 0xbc, 0x31, 0x9c, 0x6b, 0xd3, 0x58, 0xc1, 0xc3, 0x9c, 0x5d, + 0xc2, 0x1f, 0xc4, 0x2f, 0x9a, 0x43, 0xac, 0xc7, 0xc5, 0xc0, 0x98, 0x16, + 0x98, 0x5e, 0xc6, 0x95, 0x96, 0xde, 0x85, 0x75, 0xc6, 0xdf, 0x96, 0x1e, + 0x73, 0x1b, 0xc7, 0x29, 0x96, 0x3c, 0x61, 0x14, 0xc7, 0xc2, 0x97, 0x4b, + 0x4e, 0xd9, 0xc8, 0x8d, 0x98, 0x68, 0x3c, 0x03, 0xc9, 0x98, 0x9a, 0x5c, + 0x2a, 0x24, 0xcb, 0x40, 0x9f, 0xd7, 0x1f, 0xfc, 0x71, 0x7a, 0x64, 0x01, + 0xee, 0xca, 0x82, 0x77, 0x6b, 0xf7, 0xeb, 0xaf, 0x8f, 0xff, 0x74, 0xd4, + 0xea, 0xed, 0xa0, 0x1f, 0x7d, 0x82, 0xe9, 0xb9, 0xb6, 0x0d, 0x89, 0x48, + 0xeb, 0x35, 0xc9, 0x3c, 0x95, 0xfe, 0xe9, 0xd0, 0xcc, 0x77, 0x95, 0x45, + 0xd8, 0x65, 0xce, 0x52, 0x93, 0xc9, 0xc4, 0xe0, 0xd0, 0x0f, 0x91, 0x59, + 0xae, 0xaa, 0xd0, 0xe5, 0x8f, 0x0a, 0x99, 0xe7, 0xd1, 0x12, 0x8d, 0x55, + 0x86, 0x39, 0xd1, 0x31, 0x8c, 0x41, 0x73, 0x8e, 0xd1, 0x27, 0x8b, 0xa7, + 0x60, 0x83, 0xd1, 0x97, 0x8c, 0x00, 0x4c, 0xc3, 0xd2, 0x1b, 0x8c, 0xa7, + 0x38, 0x92, 0xd3, 0x1d, 0x8e, 0x40, 0x26, 0xa0, 0xd0, 0x08, 0x94, 0x24, + 0x21, 0x56, 0x83, 0x42, 0x5b, 0xe6, 0xf2, 0xb6, 0x8e, 0xb3, 0x61, 0xc4, + 0xed, 0x7a, 0x9e, 0x51, 0x67, 0x29, 0xe9, 0xc7, 0xb0, 0x08, 0x6f, 0x56, + 0xea, 0xe8, 0xc0, 0x32, 0x7b, 0x7f, 0xe9, 0x30, 0xd0, 0x89, 0x85, 0xc3, + 0xe7, 0xb2, 0xd7, 0x46, 0x89, 0xb0, 0xdc, 0x55, 0xdc, 0x07, 0x8a, 0xc2, + 0xc9, 0xe1, 0xdd, 0x33, 0x87, 0x30, 0xb2, 0xe3, 0xdd, 0x18, 0x83, 0xd1, + 0x9b, 0x72, 0xdb, 0x6d, 0x80, 0xe1, 0x86, 0x75, 0xda, 0x54, 0x7d, 0xbf, + 0x71, 0x85, 0xd8, 0x63, 0x7c, 0xdd, 0x5b, 0x64, 0xd7, 0x50, 0x7c, 0xe2, + 0x45, 0xd3, 0xd6, 0x5c, 0x7e, 0xf1, 0x32, 0x7c, 0xd3, 0xdb, 0x84, 0x06, + 0x28, 0xa7, 0xd1, 0x1c, 0x8b, 0x6a, 0x24, 0x8e, 0x91, 0xff, 0x4b, 0x00, + 0xf1, 0xd8, 0xa2, 0x88, 0x51, 0x25, 0xec, 0x97, 0xb0, 0x62, 0x5e, 0x8d, + 0xe9, 0x18, 0xbd, 0x28, 0x63, 0x63, 0xe8, 0xc7, 0xcd, 0x72, 0x6d, 0xc3, + 0xe9, 0x3b, 0xd7, 0xef, 0x74, 0x41, 0xe3, 0x19, 0xd8, 0xf9, 0x76, 0x7d, + 0xd8, 0x5f, 0xdc, 0xa2, 0x75, 0xfe, 0xc4, 0x16, 0xdd, 0xda, 0x71, 0xf4, + 0xab, 0x49, 0xdd, 0x7a, 0x6f, 0x08, 0x94, 0x11, 0xdb, 0xcc, 0x6c, 0xf4, + 0x7e, 0xc1, 0xda, 0x5b, 0x69, 0xea, 0x69, 0x2c, 0xda, 0x55, 0x6a, 0x01, + 0x53, 0x57, 0xdd, 0x51, 0x69, 0x59, 0x3c, 0x8c, 0xd8, 0x96, 0x6f, 0xfb, + 0x2f, 0x75, 0xd3, 0xf2, 0x77, 0x8f, 0x29, 0xfc, 0xd1, 0xb5, 0x80, 0x4c, + 0x26, 0xb7, 0x9d, 0x01, 0x37, 0x83, 0xf2, 0x09, 0xb1, 0x9b, 0x44, 0x4b, + 0xec, 0x3f, 0xc0, 0x69, 0x4d, 0x52, 0xec, 0xd2, 0xcb, 0xe3, 0x57, 0x06, + 0xeb, 0x06, 0xd5, 0x37, 0x60, 0x0f, 0xe5, 0xc5, 0xd8, 0x44, 0x60, 0x2f, + 0xdd, 0xc2, 0xd9, 0xa5, 0x65, 0x5d, 0xd7, 0x23, 0xdd, 0x8d, 0x60, 0x15, + 0xbd, 0x72, 0xde, 0xc3, 0x5c, 0x58, 0xa4, 0xed, 0xde, 0x1f, 0x58, 0xde, + 0x8d, 0x99, 0xde, 0xc1, 0x56, 0x15, 0x79, 0x7d, 0xe0, 0x3b, 0x50, 0xab, + 0x62, 0x75, 0xe1, 0x3a, 0x4d, 0xd1, 0x4a, 0xcb, 0xde, 0xf9, 0x52, 0x51, + 0x36, 0xd0, 0xd8, 0xec, 0x5e, 0xa3, 0x2e, 0xf4, 0xd3, 0xa6, 0x69, 0xa2, + 0x2a, 0x91, 0xd1, 0xeb, 0x73, 0x13, 0x28, 0x38, 0xac, 0x5d, 0x34, 0x22, + 0xe9, 0x8b, 0xb6, 0x79, 0x35, 0xe6, 0xeb, 0x24, 0xcc, 0x34, 0x40, 0xa1, + 0xef, 0xb8, 0xd1, 0x22, 0x46, 0xe3, 0xe9, 0x34, 0xd8, 0xb3, 0x4a, 0x49, + 0xdd, 0xdd, 0xdb, 0x14, 0x50, 0x67, 0xdb, 0x7c, 0xdc, 0x64, 0x55, 0x17, + 0xd2, 0x17, 0xe0, 0x33, 0x4b, 0xd7, 0xb8, 0x7c, 0xe0, 0xa4, 0x46, 0x39, + 0x9c, 0xd1, 0xdf, 0x51, 0x3d, 0xbc, 0x84, 0xc0, 0xdd, 0x3e, 0x36, 0x97, + 0x6e, 0x6e, 0xdc, 0x4d, 0x35, 0xfe, 0x5a, 0x3e, 0xdb, 0x6f, 0x34, 0x07, + 0x43, 0x70, 0xd6, 0x9b, 0x32, 0x76, 0x32, 0x68, 0xd6, 0x8b, 0x45, 0x7f, + 0x2e, 0xf0, 0xd5, 0x26, 0x5b, 0x74, 0x2b, 0xcc, 0xd3, 0x80, 0x63, 0xb8, + 0x29, 0xb4, 0xab, 0xe9, 0x33, 0x81, 0xe2, 0x8d, 0xb4, 0x2b, 0x34, 0x7f, + 0xe3, 0xdd, 0xd1, 0xaa, 0x36, 0x0a, 0xec, 0xd0, 0xd6, 0xb9, 0x36, 0xd5, + 0xdd, 0xaf, 0xd8, 0x1e, 0x37, 0x21, 0xdb, 0x9a, 0xda, 0x0b, 0x39, 0xff, + 0xd9, 0x3a, 0xda, 0xaf, 0x35, 0xf3, 0xc5, 0x36, 0xdb, 0x3b, 0x34, 0xb8, + 0xae, 0x10, 0xdb, 0x4f, 0x33, 0xb1, 0x95, 0x2e, 0xdb, 0x5f, 0x32, 0x92, + 0x81, 0xcb, 0xd9, 0xa4, 0x31, 0x27, 0x6d, 0xf3, 0xd8, 0xf2, 0x30, 0x50, + 0x5a, 0xcd, 0xd9, 0xe5, 0x2f, 0x1c, 0x45, 0x15, 0xd4, 0xa9, 0x2f, 0x13, + 0x31, 0x49, 0xd2, 0x66, 0x2f, 0x59, 0x2e, 0xee, 0xd0, 0xf9, 0x2f, 0x8b, + 0x2d, 0x76, 0xd3, 0x6d, 0x58, 0x90, 0x2a, 0x92, 0x22, 0x02, 0xd3, 0x39, + 0xe0, 0x7e, 0x1e, 0xe1, 0xda, 0xfa, 0xe2, 0xe0, 0x1f, 0x2f, 0xe1, 0xb3, + 0xe2, 0x48, 0x20, 0x43, 0xe2, 0xfb, 0xe0, 0x02, 0x24, 0xdc, 0xdf, 0x0e, + 0xd4, 0x66, 0x26, 0xb7, 0xdd, 0xa9, 0xca, 0xc3, 0x28, 0x47, 0xda, 0x8d, + 0xc2, 0x0d, 0x2d, 0x1a, 0xd3, 0x58, 0xae, 0xa5, 0x2e, 0x95, 0xce, 0x75, + 0x9f, 0x89, 0x2f, 0x6c, 0xcb, 0xc8, 0x93, 0x34, 0x2e, 0xaa, 0xcb, 0x60, + 0x84, 0xa0, 0x2e, 0x8f, 0xcc, 0x22, 0x74, 0x99, 0x2c, 0x99, 0xce, 0x5e, + 0x5e, 0xd5, 0x2b, 0x0c, 0xd0, 0x91, 0x30, 0x83, 0x2b, 0x3b, 0xd0, 0x56, + 0x2e, 0x1a, 0x2b, 0x69, 0xd0, 0x22, 0x2b, 0xe3, 0x2b, 0x9a, 0xcf, 0xef, + 0x29, 0xd6, 0x23, 0x1d, 0xca, 0xf9, 0xe1, 0x0b, 0x24, 0x18, 0xd3, 0xbb, + 0xe0, 0xde, 0x20, 0xd6, 0xdd, 0x30, 0xe3, 0x8d, 0x21, 0x43, 0xe3, 0x0c, + 0xe3, 0x0f, 0x24, 0x49, 0xe2, 0xd2, 0xdc, 0x79, 0x27, 0xe9, 0xdf, 0xa8, + 0xd2, 0x6a, 0x28, 0x8f, 0xde, 0x0c, 0xc8, 0x67, 0x2d, 0x70, 0xd6, 0xee, + 0xb6, 0x62, 0x2f, 0x0d, 0xd0, 0x69, 0xa4, 0xcf, 0x2f, 0x63, 0xcc, 0x53, + 0x95, 0x0c, 0x2e, 0xa6, 0xcb, 0x63, 0x82, 0x90, 0x2e, 0x5a, 0xcd, 0x70, + 0x6c, 0xa2, 0x2f, 0x3c, 0xd0, 0x52, 0x53, 0x3b, 0x2c, 0xcb, 0xd1, 0x4f, + 0x30, 0x94, 0x2c, 0xf8, 0xd0, 0xfd, 0x2d, 0x8b, 0x2d, 0x26, 0xd0, 0xb3, + 0x2a, 0xcd, 0x44, 0xb6, 0xd4, 0x35, 0x23, 0xbb, 0x24, 0x79, 0xca, 0x41, + 0xe2, 0x1e, 0x24, 0xfe, 0xcb, 0xaf, 0xe1, 0xea, 0x27, 0x31, 0xd4, 0x70, + 0xe1, 0x6b, 0x24, 0x07, 0xdf, 0xb4, 0xe4, 0x9d, 0x25, 0x52, 0xe4, 0x51, + 0xe3, 0x69, 0x28, 0xa9, 0xe3, 0x36, 0xd9, 0x1f, 0x2c, 0xdc, 0xe0, 0x69, + 0xcd, 0xbe, 0x2f, 0x51, 0xdc, 0x35, 0xc0, 0x2a, 0x30, 0xb6, 0xd3, 0x54, + 0xaa, 0x91, 0x30, 0x1f, 0xcc, 0x20, 0x95, 0xdb, 0x2e, 0xdf, 0xc8, 0xff, + 0x7f, 0x93, 0x2f, 0x31, 0xcd, 0xff, 0x65, 0x2b, 0x30, 0x6b, 0xd4, 0x79, + 0x42, 0x5f, 0x2f, 0xf7, 0xd2, 0xa1, 0x30, 0xbc, 0x40, 0x96, 0xd6, 0x8f, + 0x2a, 0x63, 0x52, 0x60, 0xd6, 0xd6, 0x27, 0x81, 0x77, 0x69, 0xd5, 0x0a, + 0x23, 0x1f, 0x24, 0xce, 0xc1, 0xb6, 0xe6, 0x15, 0x26, 0x01, 0xc8, 0xee, + 0xe4, 0xee, 0x27, 0xef, 0xcc, 0xbb, 0xe3, 0x30, 0x2c, 0x42, 0xd5, 0x85, + 0xe2, 0x50, 0x29, 0xf1, 0xe2, 0xea, 0xe6, 0x54, 0x30, 0xab, 0xe3, 0x81, + 0xe0, 0xbe, 0x33, 0x7e, 0xe3, 0x2e, 0xd5, 0xc7, 0x42, 0x9e, 0xe4, 0xb0, + 0xcc, 0xa1, 0x4d, 0x60, 0xe0, 0x78, 0xba, 0x3b, 0x4f, 0x88, 0xdd, 0xd1, + 0xa5, 0x83, 0x4e, 0x13, 0xde, 0x89, 0x8c, 0x70, 0x4d, 0xb0, 0xdd, 0xfe, + 0x6c, 0x5b, 0x4e, 0x52, 0xdc, 0x81, 0x4c, 0x36, 0x52, 0xc9, 0xdc, 0x4b, + 0x31, 0x8c, 0x5f, 0x25, 0xdc, 0x96, 0x27, 0xf9, 0x7a, 0x4b, 0xd8, 0x06, + 0x24, 0xcf, 0x7f, 0xb0, 0xd5, 0x0b, 0x21, 0x8c, 0x27, 0x5f, 0xb8, 0x75, + 0xe7, 0x4f, 0x28, 0xdf, 0xc0, 0xaf, 0xe7, 0xae, 0x2a, 0x56, 0xc7, 0x9c, + 0xe6, 0xe8, 0x2d, 0x2d, 0xce, 0x69, 0xe5, 0x37, 0x36, 0x84, 0xd7, 0x83, + 0xe3, 0xfa, 0x43, 0x1f, 0xe3, 0x4c, 0xe5, 0x75, 0x56, 0xc2, 0xe2, 0x07, + 0xdb, 0x3f, 0x63, 0x1e, 0xe2, 0xea, 0xd0, 0x89, 0x6f, 0xc1, 0xe3, 0x0b, + 0xc4, 0xba, 0x74, 0x43, 0xe1, 0x1c, 0xb0, 0x39, 0x76, 0x7c, 0xdf, 0xed, + 0x9a, 0x30, 0x79, 0xd7, 0xdf, 0x9f, 0x80, 0x95, 0x7c, 0x9e, 0xdf, 0x96, + 0x66, 0x35, 0x7d, 0x99, 0xe4, 0x4b, 0x3d, 0x2a, 0x81, 0xc4, 0xde, 0x8d, + 0x2d, 0xca, 0x89, 0xa1, 0xd7, 0xef, 0x24, 0x1c, 0x98, 0xff, 0xd4, 0xb2, + 0x20, 0xa0, 0x2b, 0xc8, 0xb2, 0x49, 0xe5, 0x69, 0x2d, 0xd7, 0xb6, 0x97, + 0xe6, 0xed, 0x30, 0x0c, 0xbe, 0xc6, 0xea, 0x29, 0x36, 0x49, 0xc7, 0x18, + 0xe9, 0xf8, 0x53, 0xfb, 0xd1, 0xcf, 0xe7, 0x14, 0x5f, 0x40, 0xdb, 0x1b, + 0xe5, 0x9b, 0x6e, 0xe4, 0xdd, 0x35, 0xdd, 0x74, 0x79, 0xc4, 0xdb, 0x72, + 0xcf, 0x7d, 0x81, 0x54, 0xd6, 0xda, 0xbe, 0xde, 0x85, 0x66, 0xd4, 0xfe, + 0xab, 0x03, 0x89, 0x5b, 0xd3, 0x91, 0x95, 0x80, 0x8c, 0x2d, 0xd2, 0xe6, + 0x7e, 0x06, 0x8f, 0x8f, 0xd2, 0xb4, 0x65, 0xfe, 0x94, 0x87, 0xd0, 0xc2, + 0x4d, 0xa7, 0x99, 0x0d, 0xd0, 0xd0, 0x35, 0x5b, 0x9b, 0xe3, 0xd4, 0x75, + 0x1f, 0xe2, 0xa1, 0x70, 0xd1, 0x57, 0x1a, 0xff, 0x2e, 0xf0, 0xa5, 0x2e, + 0xe3, 0xea, 0x31, 0xa7, 0xaa, 0x3f, 0xe4, 0x77, 0x38, 0xdf, 0xb2, 0x69, + 0xe7, 0x29, 0x55, 0x33, 0xbb, 0x6d, 0xe6, 0xdb, 0x61, 0x97, 0xc4, 0xd4, + 0xe3, 0x59, 0x72, 0x93, 0xc9, 0x44, 0xdd, 0x6c, 0x82, 0x30, 0xcf, 0x75, + 0xd7, 0xeb, 0x8a, 0xcc, 0xcd, 0x37, 0xc8, 0xdf, 0x91, 0x4e, 0xca, 0xca, + 0xb8, 0x8c, 0x97, 0x7f, 0xc8, 0x47, 0xa6, 0x1c, 0x9b, 0xa7, 0xc7, 0x44, + 0x91, 0xc2, 0x9f, 0x11, 0xc6, 0x7c, 0x7c, 0xa4, 0xa1, 0x75, 0xc6, 0x93, + 0x67, 0x45, 0xa3, 0x1e, 0xc6, 0xb7, 0x52, 0x21, 0xa5, 0x93, 0xc9, 0x62, + 0x3c, 0x7c, 0xa8, 0x71, 0xcc, 0xbb, 0x28, 0x8d, 0xab, 0x73, 0xcf, 0xbc, + 0x17, 0x4e, 0x31, 0x3e, 0x9b, 0xc3, 0xe3, 0xf5, 0x36, 0x05, 0x9f, 0x37, + 0xe4, 0xb4, 0x53, 0x53, 0xa6, 0xa6, 0xe5, 0x8c, 0x5f, 0xda, 0xae, 0x55, + 0xe3, 0x94, 0x72, 0x42, 0xb4, 0xb2, 0xe0, 0x93, 0x82, 0xec, 0xbc, 0x53, + 0xda, 0x48, 0x92, 0xa4, 0xc2, 0xf5, 0xd5, 0xd3, 0x9b, 0x08, 0xc0, 0xd5, + 0xc5, 0xea, 0xa3, 0xed, 0xbf, 0x28, 0xb6, 0x34, 0xa7, 0xef, 0xbe, 0x31, + 0xa3, 0x9b, 0xab, 0x48, 0xbd, 0x5e, 0x8f, 0x9e, 0xad, 0xa4, 0xbd, 0x65, + 0x7b, 0xd2, 0xae, 0xef, 0xbe, 0x3a, 0x68, 0x24, 0xb0, 0x18, 0xbf, 0xff, + 0x55, 0x79, 0xb2, 0x00, 0xc2, 0x94, 0x42, 0xa3, 0xb4, 0x05, 0xc5, 0x72, + 0x30, 0x61, 0xb6, 0x05, 0xc8, 0x93, 0x1f, 0xa5, 0x39, 0x90, 0x8e, 0xc7, + 0xe5, 0x20, 0x53, 0x2a, 0x92, 0x51, 0xe2, 0x16, 0x5e, 0x3d, 0x99, 0xe4, + 0xe3, 0xf0, 0x73, 0x85, 0xa2, 0x21, 0xe5, 0x1e, 0x84, 0xb5, 0xa9, 0xb0, + 0xe2, 0xc1, 0x93, 0x92, 0xb0, 0x62, 0xdc, 0xe1, 0xa4, 0xad, 0xb7, 0x7b, + 0xd6, 0x8a, 0xac, 0xd1, 0xb5, 0xc8, 0xc6, 0x5c, 0xb3, 0xc1, 0xb4, 0xd5, + 0xb5, 0x10, 0xb6, 0xd2, 0xb4, 0xcf, 0xa2, 0xea, 0xb8, 0xd3, 0xb4, 0x70, + 0x8f, 0x2c, 0xba, 0x15, 0xb4, 0x73, 0x7b, 0xb4, 0xba, 0xfb, 0xb5, 0x8b, + 0x69, 0x34, 0xbc, 0x14, 0xb7, 0x94, 0x57, 0x88, 0xbd, 0x56, 0xba, 0x9a, + 0x47, 0x4d, 0xbe, 0xae, 0xbd, 0xf5, 0x36, 0x53, 0xbf, 0xe6, 0xbf, 0x81, + 0x24, 0x37, 0x52, 0xe1, 0x80, 0x07, 0xe5, 0xbc, 0x5f, 0x04, 0x87, 0x3b, + 0xe6, 0x43, 0x71, 0x0c, 0x8d, 0x31, 0xe5, 0xab, 0x84, 0xea, 0x95, 0x76, + 0xe5, 0xdc, 0x97, 0x31, 0x9f, 0xa6, 0xe4, 0x59, 0xa7, 0x5c, 0xa6, 0x70, + 0xde, 0xf6, 0xb6, 0xda, 0xae, 0xa9, 0xda, 0x09, 0xbd, 0x06, 0xae, 0x25, + 0xc8, 0x9e, 0xc1, 0x60, 0xad, 0x32, 0xb6, 0x0f, 0xc3, 0x2c, 0xab, 0x99, + 0xa2, 0x9c, 0xc4, 0x59, 0xaa, 0xdb, 0x8f, 0x37, 0xc5, 0x02, 0xaa, 0xa7, + 0x7b, 0xe0, 0xc5, 0x98, 0xaa, 0xce, 0x69, 0x7c, 0xc6, 0x50, 0xac, 0x00, + 0x57, 0x6c, 0xc7, 0x28, 0xad, 0xdb, 0x45, 0x42, 0xc8, 0x1d, 0xaf, 0xc2, + 0x33, 0x3f, 0xc9, 0x53, 0xb2, 0x13, 0x22, 0x55, 0x5f, 0x25, 0x74, 0xa0, + 0xe7, 0xe9, 0x71, 0x59, 0x7a, 0x67, 0xe8, 0xc2, 0x87, 0x63, 0x82, 0xf2, + 0xe7, 0x16, 0x93, 0x1a, 0x8b, 0x16, 0xe6, 0x7e, 0xa7, 0xca, 0x96, 0x6a, + 0xe7, 0x75, 0xb8, 0xb2, 0x9f, 0x0e, 0xe3, 0x92, 0xc6, 0x27, 0xa6, 0xf5, + 0xdd, 0xc2, 0xca, 0x31, 0xa5, 0xed, 0xcb, 0x6b, 0xcc, 0xb6, 0xa4, 0x54, + 0xb7, 0x30, 0xce, 0x93, 0xa2, 0x96, 0xa3, 0x1e, 0xcf, 0x3e, 0xa1, 0x85, + 0x8f, 0xd5, 0xcf, 0x66, 0xa0, 0x8e, 0x7c, 0xa7, 0xcf, 0xbe, 0xa0, 0x5e, + 0x69, 0xf9, 0xcf, 0xf8, 0xa0, 0x86, 0x57, 0x19, 0xd0, 0xcc, 0xa1, 0xda, + 0x44, 0x03, 0xd0, 0xe3, 0xa1, 0xf5, 0x2f, 0xdc, 0xd1, 0xfc, 0xa3, 0x60, + 0x1e, 0x1b, 0x75, 0x4a, 0x69, 0x28, 0xed, 0xfc, 0x88, 0x97, 0x71, 0x02, + 0xed, 0x0f, 0x90, 0xa4, 0x76, 0xe8, 0xea, 0xbf, 0xa5, 0x01, 0x81, 0xea, + 0xe9, 0x99, 0xb8, 0xee, 0x8d, 0x1e, 0xeb, 0x56, 0xca, 0xfb, 0x98, 0xe9, + 0xea, 0xcd, 0xd3, 0x27, 0x9d, 0x0c, 0xe0, 0x33, 0xd8, 0x0d, 0x9e, 0x64, + 0xcf, 0xf1, 0xd9, 0x93, 0x9b, 0xc3, 0xb9, 0x23, 0xd9, 0xa5, 0x99, 0x33, + 0xa4, 0x04, 0xd9, 0x49, 0x97, 0x4c, 0x8f, 0xf3, 0xd8, 0xff, 0x95, 0x6f, + 0x7c, 0xca, 0xd6, 0x51, 0x92, 0x61, 0x66, 0xf6, 0xd4, 0xe6, 0x91, 0x75, + 0x51, 0x54, 0xd3, 0xb5, 0x91, 0x51, 0x3b, 0xb1, 0xd3, 0xc6, 0x94, 0x9f, + 0x2e, 0xd0, 0xd3, 0x0a, 0x99, 0x52, 0x26, 0x1e, 0x89, 0x3b, 0x60, 0xf3, + 0xf1, 0x16, 0x93, 0x7d, 0x63, 0xe4, 0xec, 0x5c, 0xa0, 0x8b, 0x6a, 0xcd, + 0xea, 0x13, 0xb4, 0x28, 0x74, 0x4a, 0xeb, 0x06, 0xc4, 0x03, 0x7f, 0xff, + 0xe9, 0xfc, 0xd1, 0xb4, 0x89, 0x33, 0xe5, 0x6a, 0xd7, 0xbc, 0x8c, 0xb9, + 0xdb, 0x91, 0xdb, 0xc0, 0x8e, 0x9b, 0xcc, 0x03, 0xdd, 0x13, 0x8b, 0xc2, + 0xb5, 0x06, 0xdd, 0x0d, 0x88, 0x4b, 0x9d, 0x69, 0xdb, 0x49, 0x85, 0x97, + 0x88, 0x99, 0xda, 0x22, 0x82, 0x97, 0x73, 0xfb, 0xd7, 0xd4, 0x81, 0xa7, + 0x5e, 0x1d, 0xd6, 0xae, 0x81, 0xd9, 0x48, 0xec, 0xd5, 0x4c, 0x82, 0x9f, + 0x34, 0xb2, 0xd4, 0x16, 0x88, 0xb4, 0x2c, 0xae, 0xd3, 0x26, 0x8e, 0x8a, + 0x27, 0x1a, 0x96, 0xa5, 0x4c, 0x41, 0xf0, 0xad, 0xa2, 0x59, 0x5a, 0x4b, + 0xeb, 0xe7, 0xb3, 0xd2, 0x62, 0x56, 0xe8, 0xd9, 0xc0, 0x19, 0x68, 0x76, + 0xe8, 0xee, 0xd0, 0x7a, 0x72, 0xc1, 0xe9, 0x69, 0xd7, 0x0e, 0x77, 0x3e, + 0xdf, 0x00, 0xd8, 0xb6, 0x7a, 0xaa, 0xd8, 0xb5, 0xdc, 0x55, 0x7b, 0x31, + 0xc6, 0x38, 0xdc, 0xde, 0x77, 0xf6, 0xad, 0xf0, 0xdd, 0x4e, 0x74, 0x4d, + 0x95, 0xfb, 0xdb, 0xa4, 0x72, 0x14, 0x80, 0xf4, 0xda, 0x05, 0x6f, 0x5e, + 0x6b, 0xef, 0xd9, 0xf3, 0x6f, 0x2b, 0x56, 0x06, 0xdc, 0x53, 0x6e, 0xde, + 0x3f, 0x1e, 0xd8, 0x59, 0x75, 0x30, 0x31, 0xe5, 0xd6, 0x3e, 0x7c, 0x86, + 0x2c, 0x05, 0xd3, 0x72, 0x84, 0x56, 0x28, 0x1f, 0xa8, 0x09, 0x45, 0x01, + 0xed, 0xa1, 0xaf, 0x39, 0x4b, 0xc9, 0xeb, 0xd7, 0xc3, 0x12, 0x50, 0xcd, + 0xec, 0x34, 0xcc, 0x77, 0x5c, 0x00, 0xea, 0xa7, 0xd6, 0xce, 0x61, 0x17, + 0xe3, 0xf8, 0xd8, 0x3b, 0x64, 0xe4, 0xdc, 0xfe, 0xd9, 0x32, 0x69, 0xb8, + 0xd7, 0x7d, 0xdd, 0x4c, 0x65, 0x64, 0xc0, 0x30, 0xde, 0x9e, 0x60, 0xed, + 0xa7, 0x21, 0xde, 0x95, 0x5e, 0x4c, 0x8f, 0xff, 0xde, 0x7e, 0x5b, 0x85, + 0x7b, 0x88, 0xdf, 0x79, 0x58, 0xfe, 0x65, 0x83, 0xe0, 0x26, 0x58, 0x76, + 0x50, 0xd5, 0xe0, 0x5f, 0x5a, 0xdc, 0x39, 0xc8, 0xda, 0x9d, 0x63, 0x17, + 0x30, 0x98, 0xd5, 0x43, 0x6e, 0x9c, 0x2b, 0xd8, 0xd3, 0x60, 0x77, 0x6d, + 0x29, 0x55, 0xae, 0x34, 0x35, 0xa9, 0xeb, 0x2a, 0xbb, 0x03, 0x37, 0xcd, + 0xed, 0x13, 0xca, 0xee, 0x48, 0x80, 0xed, 0x0d, 0xd5, 0x41, 0x4c, 0x02, + 0xe4, 0x71, 0xd9, 0xa8, 0x51, 0xfc, 0xde, 0x25, 0xd8, 0x08, 0x57, 0x48, + 0xda, 0x5d, 0xdb, 0x38, 0x59, 0xc0, 0xd5, 0x46, 0xe0, 0x08, 0x52, 0x7e, + 0xbb, 0xd8, 0xe1, 0x50, 0x4b, 0x46, 0x9f, 0x37, 0xe1, 0x3c, 0x47, 0x60, + 0x88, 0xaa, 0xe2, 0x70, 0x3f, 0x0e, 0x74, 0x36, 0xdd, 0x85, 0x39, 0x05, + 0x5b, 0xde, 0xdc, 0x23, 0x35, 0xe4, 0x44, 0xbb, 0xd8, 0x2a, 0x34, 0x18, + 0x33, 0x9a, 0xd8, 0x5f, 0x4f, 0x4b, 0x30, 0x28, 0xd6, 0x80, 0x5d, 0x97, + 0x2c, 0xc9, 0xd3, 0x1b, 0x6a, 0x3a, 0x29, 0xe5, 0xb0, 0x12, 0x34, 0xd4, + 0xe4, 0x3e, 0xbf, 0xec, 0x35, 0xa5, 0xea, 0x4c, 0xd3, 0xce, 0x36, 0xc1, + 0xee, 0x24, 0xd7, 0x09, 0x37, 0xf1, 0xdd, 0x74, 0xd8, 0x9e, 0x3a, 0xee, + 0xdb, 0xb7, 0xdb, 0x06, 0x47, 0x77, 0xd9, 0xd6, 0xde, 0x21, 0x47, 0x5c, + 0xd0, 0x6f, 0xdb, 0x94, 0x36, 0x1b, 0xae, 0x3c, 0xdb, 0xc0, 0x35, 0x1a, + 0x95, 0x74, 0xdc, 0x34, 0x34, 0x2f, 0x82, 0x69, 0xda, 0x9f, 0x32, 0xa3, + 0x6e, 0xb5, 0xd9, 0xe1, 0x31, 0xec, 0x5b, 0xd5, 0xda, 0x94, 0x30, 0xd1, + 0x46, 0x4e, 0xd5, 0xc9, 0x30, 0x39, 0x32, 0x22, 0xd3, 0x45, 0x30, 0x3b, + 0x2f, 0x95, 0xd1, 0xae, 0x30, 0x44, 0x2d, 0xfd, 0xd4, 0x9b, 0x5c, 0x25, + 0x2b, 0x36, 0x22, 0xb1, 0xd4, 0xc0, 0xe1, 0x8a, 0x20, 0x76, 0xdd, 0x37, + 0xe3, 0x71, 0x20, 0xdf, 0xe2, 0x8e, 0xe2, 0xea, 0x22, 0xc7, 0xe3, 0x58, + 0xe0, 0x1d, 0x26, 0x82, 0xdf, 0xb0, 0xd4, 0xcf, 0x28, 0x35, 0xde, 0x49, + 0xcb, 0x24, 0x29, 0x6d, 0xdb, 0x5e, 0xc2, 0xc2, 0x2d, 0xd5, 0xd3, 0xb7, + 0xae, 0xcb, 0x2e, 0xdf, 0xce, 0x92, 0x9f, 0x52, 0x2f, 0x90, 0xcb, 0xc2, + 0x92, 0xc4, 0x2e, 0xaa, 0xcb, 0x63, 0x84, 0x06, 0x2e, 0x09, 0xcc, 0xe9, + 0x71, 0xd1, 0x2d, 0x11, 0xce, 0x9b, 0x5f, 0x17, 0x2c, 0x1f, 0xd1, 0x14, + 0x31, 0x01, 0x2c, 0x42, 0xd0, 0xdd, 0x2e, 0xd0, 0x2c, 0x64, 0xd0, 0xa8, + 0x2c, 0xc9, 0x2c, 0x88, 0xd0, 0x76, 0x2a, 0xe4, 0x24, 0x03, 0xcc, 0x5f, + 0xe2, 0x7f, 0x24, 0x9d, 0xd5, 0x5a, 0xe2, 0x1e, 0x22, 0xb2, 0xdf, 0x75, + 0xe4, 0x38, 0x23, 0x3f, 0xe3, 0xfd, 0xe3, 0xc1, 0x26, 0xc1, 0xe3, 0x4d, + 0xdc, 0xae, 0x29, 0x9d, 0xe0, 0x4e, 0xd2, 0xd9, 0x29, 0xf0, 0xde, 0xdf, + 0xc9, 0x03, 0x2e, 0x63, 0xd7, 0x6f, 0xb6, 0xa2, 0x2f, 0x74, 0xd0, 0x98, + 0xa4, 0xa5, 0x2f, 0x88, 0xcc, 0x4f, 0x94, 0x9e, 0x2e, 0x86, 0xca, 0xe8, + 0x81, 0xcf, 0x2e, 0x9c, 0xcd, 0x9e, 0x6c, 0x50, 0x30, 0x21, 0xd0, 0xca, + 0x53, 0x74, 0x2d, 0xed, 0xd1, 0xdc, 0x31, 0x32, 0x2e, 0x0a, 0xd1, 0x8e, + 0x2e, 0x7e, 0x2e, 0x29, 0xd1, 0x46, 0x2c, 0x09, 0x4c, 0x88, 0xd6, 0xc8, + 0x24, 0x62, 0x25, 0xbe, 0xca, 0xff, 0xe2, 0x96, 0x26, 0x67, 0xcd, 0x19, + 0xe3, 0x43, 0x27, 0x6a, 0xd6, 0x32, 0xe2, 0xee, 0x26, 0x25, 0xe2, 0x09, + 0xe5, 0x54, 0x27, 0xdc, 0xe4, 0x5c, 0xe3, 0x47, 0x2a, 0xa4, 0xe3, 0xaa, + 0xd9, 0x4b, 0x2e, 0x7b, 0xe0, 0xbb, 0xcd, 0xbd, 0x30, 0x57, 0xdc, 0xd6, + 0xc0, 0xb5, 0x31, 0xe3, 0xd2, 0xe8, 0xaa, 0x74, 0x2f, 0x23, 0xc9, 0x77, + 0x94, 0x00, 0x2e, 0xd9, 0xc8, 0xe6, 0x7e, 0xd9, 0x31, 0x19, 0xcc, 0x57, + 0x65, 0x66, 0x31, 0xa5, 0xd5, 0x1a, 0x42, 0x3c, 0x30, 0xf6, 0xd3, 0x23, + 0x31, 0x88, 0x44, 0xd9, 0xd8, 0x00, 0x2b, 0xe1, 0x54, 0x7d, 0xd8, 0xd1, + 0x29, 0xb0, 0x7b, 0xdc, 0xd7, 0xfb, 0x24, 0x7d, 0x25, 0xff, 0xc3, 0xae, + 0xe6, 0xd3, 0x28, 0x41, 0xcb, 0xab, 0xe3, 0xbd, 0x29, 0xfa, 0xce, 0x19, + 0xe4, 0x5a, 0x2b, 0xe4, 0xd7, 0x7d, 0xe4, 0x23, 0x2c, 0x4a, 0xe3, 0xe8, + 0xe5, 0x44, 0x32, 0xcb, 0xe3, 0x88, 0xe0, 0x95, 0x39, 0x18, 0xe5, 0x33, + 0xd8, 0xa5, 0x47, 0x0e, 0xe5, 0x65, 0xcd, 0x76, 0x51, 0x7c, 0xe1, 0xc1, + 0xbb, 0xb1, 0x57, 0xe3, 0xde, 0xb9, 0xa8, 0x79, 0x57, 0x08, 0xdd, 0xe0, + 0x8e, 0x35, 0x55, 0x3e, 0xde, 0x80, 0x70, 0x3e, 0x53, 0xa4, 0xde, 0x32, + 0x4e, 0x93, 0x57, 0xc1, 0xdd, 0xe2, 0x32, 0xc0, 0x67, 0xe1, 0xdd, 0x77, + 0x2c, 0x48, 0x7f, 0x99, 0xdc, 0x90, 0x27, 0x46, 0x85, 0x82, 0xd7, 0x6c, + 0x24, 0x90, 0x28, 0xf0, 0xbb, 0x25, 0xe8, 0x76, 0x2a, 0xcb, 0xc2, 0x69, + 0xe7, 0x77, 0x2c, 0x11, 0xc9, 0x99, 0xe6, 0xdb, 0x2f, 0xf1, 0xcf, 0x98, + 0xe6, 0x03, 0x3b, 0xe1, 0xda, 0x89, 0xe5, 0xbc, 0x4f, 0xb2, 0xe1, 0x52, + 0xe2, 0x8a, 0x5c, 0x6f, 0xe1, 0x8e, 0xdb, 0x33, 0x68, 0x94, 0xe2, 0xbf, + 0xd0, 0x84, 0x72, 0xeb, 0xe6, 0x14, 0xc6, 0x0c, 0x75, 0xb4, 0xe4, 0x51, + 0xb2, 0x45, 0x78, 0x75, 0xe3, 0x78, 0x9a, 0x9e, 0x7d, 0xd0, 0xde, 0xf6, + 0x81, 0x1d, 0x7c, 0x31, 0xe3, 0xf3, 0x62, 0x3a, 0x81, 0xea, 0xe1, 0x8e, + 0x46, 0x26, 0x88, 0x14, 0xe0, 0x3d, 0x32, 0xed, 0x95, 0x45, 0xda, 0x81, + 0x25, 0x45, 0x9d, 0xfd, 0xd8, 0xf4, 0x23, 0x30, 0x2d, 0x1b, 0xb4, 0xb8, + 0xe6, 0x54, 0x2f, 0x97, 0xb7, 0x64, 0xe7, 0x66, 0x31, 0xd2, 0xc0, 0x78, + 0xe9, 0xe5, 0x52, 0x14, 0xca, 0xba, 0xe5, 0x52, 0x58, 0xd7, 0xd3, 0x73, + 0xe7, 0x8c, 0x64, 0x7e, 0xdb, 0x03, 0xe3, 0xce, 0x75, 0x40, 0xdb, 0x69, + 0xdb, 0x1d, 0x80, 0x77, 0xde, 0xea, 0xd2, 0xc2, 0x8c, 0x08, 0xe3, 0x3a, + 0xca, 0x20, 0x91, 0x6e, 0xdd, 0xf9, 0xb4, 0xab, 0x95, 0x45, 0xdc, 0xf7, + 0x9f, 0x9c, 0x98, 0xce, 0xdb, 0x87, 0x88, 0x71, 0x9b, 0xbc, 0xd9, 0xe3, + 0x6f, 0xf2, 0x9e, 0x59, 0xd8, 0x34, 0x57, 0x7a, 0xa3, 0x27, 0xd6, 0x66, + 0x3e, 0xbf, 0xa4, 0xf3, 0xdb, 0xf8, 0x27, 0xda, 0xa7, 0x1f, 0xd6, 0x8a, + 0x1f, 0x1b, 0x30, 0xc0, 0xa7, 0x1e, 0xe3, 0xc2, 0x32, 0xab, 0xac, 0x53, + 0xe4, 0x10, 0x4e, 0x85, 0xb7, 0x22, 0xe6, 0xee, 0x5c, 0x7e, 0xbd, 0xdf, + 0xe6, 0x2e, 0x64, 0xf8, 0xc5, 0xcb, 0xe2, 0x11, 0x77, 0x56, 0xca, 0x1a, + 0xdb, 0xe4, 0x85, 0xef, 0xd1, 0x91, 0xd7, 0xd7, 0x95, 0x32, 0xd8, 0x7e, + 0xd3, 0x16, 0x9d, 0xe8, 0xd3, 0xa0, 0xc3, 0x19, 0xa1, 0xb3, 0xd3, 0x6b, + 0xb1, 0x29, 0xa4, 0xf7, 0xd2, 0xc0, 0x9d, 0x1f, 0xa8, 0x27, 0xd1, 0xe0, + 0x87, 0x8f, 0xaa, 0x61, 0xd1, 0xd8, 0x71, 0x5b, 0xac, 0x81, 0xd1, 0x3c, + 0x5b, 0x4a, 0xae, 0xcc, 0xd1, 0xda, 0x44, 0xc7, 0xb1, 0x57, 0xd5, 0xb1, + 0x2f, 0x8c, 0xb3, 0x0c, 0xd5, 0x3e, 0x25, 0x04, 0x34, 0x2e, 0x9b, 0x84, + 0xe2, 0x14, 0x40, 0x57, 0xa0, 0x6b, 0xe3, 0x1b, 0x5a, 0x6b, 0xaa, 0x35, + 0xe5, 0x98, 0x66, 0x0e, 0xb2, 0x5f, 0xe5, 0x44, 0x75, 0xa6, 0xb5, 0xc6, + 0xde, 0x52, 0x86, 0xeb, 0xbe, 0x9b, 0xd8, 0x97, 0x96, 0x49, 0xc4, 0xae, + 0xd5, 0xc4, 0xa5, 0xd0, 0xcb, 0x4c, 0xd0, 0x6c, 0xac, 0xc4, 0xc9, 0xf8, + 0xc0, 0x37, 0xb1, 0xf8, 0xc9, 0x1a, 0xae, 0xaa, 0xb5, 0x21, 0xc8, 0x5c, + 0x9b, 0x1a, 0xb7, 0x2a, 0xc8, 0x4e, 0x87, 0x43, 0xb8, 0x82, 0xc9, 0x16, + 0x72, 0xc3, 0xb9, 0x5a, 0xca, 0xf9, 0x5e, 0x8d, 0xbb, 0x12, 0xcc, 0x92, + 0x4a, 0x96, 0xbc, 0xad, 0xcf, 0x51, 0x38, 0x1e, 0xbe, 0x81, 0xd2, 0x2a, + 0x26, 0xb9, 0x41, 0x97, 0x90, 0xce, 0xe4, 0x92, 0x5a, 0xf6, 0x95, 0x93, + 0xe3, 0x0a, 0x62, 0x9b, 0x9c, 0xc6, 0xe4, 0x8e, 0x77, 0xb5, 0xa5, 0x95, + 0xe6, 0x13, 0x87, 0xc2, 0xaa, 0xc2, 0xdf, 0xed, 0x98, 0x67, 0xb2, 0x69, + 0xda, 0x09, 0xa7, 0x79, 0xb9, 0xa9, 0xd5, 0xd1, 0xb6, 0xa9, 0xc0, 0x88, + 0xd0, 0x34, 0xbe, 0x5c, 0xbf, 0x7f, 0xbf, 0xb0, 0xc0, 0xe4, 0xc0, 0x0c, + 0xad, 0x47, 0xc2, 0x74, 0xbf, 0xd4, 0x99, 0xd9, 0xc3, 0x71, 0xc0, 0x0a, + 0x86, 0x59, 0xc4, 0x60, 0xc1, 0x66, 0x73, 0x63, 0xc5, 0x59, 0xc3, 0x52, + 0x60, 0xc9, 0xc6, 0x49, 0xc5, 0xe5, 0x4f, 0xfa, 0xc7, 0x15, 0xc7, 0xb5, + 0x3d, 0xb6, 0xc8, 0x3f, 0xc8, 0xfc, 0x2b, 0x11, 0x5a, 0x44, 0x83, 0x9d, + 0xe5, 0xfe, 0x64, 0xeb, 0x88, 0x97, 0xe3, 0x69, 0x77, 0x14, 0x8f, 0xf0, + 0xe5, 0x74, 0x8a, 0x7e, 0x99, 0x44, 0xe5, 0xa5, 0x9a, 0x9c, 0xa1, 0x99, + 0xe2, 0x90, 0xaa, 0x89, 0xa8, 0xd8, 0xdc, 0x8f, 0xb8, 0xd5, 0xb0, 0x55, + 0xd8, 0x4e, 0xc4, 0xb4, 0xb7, 0x3d, 0xd0, 0xec, 0xc9, 0x83, 0xb7, 0x33, + 0xbf, 0xa5, 0xcb, 0xc3, 0xb6, 0x70, 0xac, 0xc0, 0xcd, 0x54, 0xb6, 0x07, + 0x99, 0x89, 0xce, 0x1b, 0xb6, 0x40, 0x86, 0x7a, 0xce, 0xc8, 0xb6, 0x9b, + 0x73, 0x66, 0xcf, 0x74, 0xb7, 0xc3, 0x60, 0xc6, 0xd0, 0x1d, 0xb9, 0x51, + 0x4e, 0x52, 0xd0, 0xce, 0xba, 0xcc, 0x3b, 0xe1, 0xd2, 0x05, 0xbd, 0x15, + 0x2a, 0x88, 0x6c, 0x08, 0x78, 0xa3, 0xe9, 0x1f, 0x75, 0xd2, 0x7d, 0xfc, + 0xe8, 0xca, 0x89, 0x28, 0x86, 0x0b, 0xe6, 0xb9, 0x98, 0x5e, 0x8e, 0xb8, + 0xe6, 0x5a, 0xae, 0x99, 0x9a, 0x74, 0xe6, 0xa2, 0xba, 0x37, 0xa1, 0x18, + 0xe1, 0xee, 0xc8, 0xaa, 0xa9, 0x0b, 0xdb, 0xab, 0xd3, 0x5a, 0xaf, 0xd7, + 0xd4, 0xed, 0xd4, 0xe2, 0xad, 0xf6, 0xc0, 0xa0, 0xd7, 0xa1, 0xac, 0xfa, + 0xad, 0xb1, 0xd8, 0x28, 0xab, 0xd6, 0x9a, 0x01, 0xd7, 0xea, 0xaa, 0xc8, + 0x86, 0x20, 0xd8, 0x43, 0xaa, 0x2a, 0x72, 0xfe, 0xd6, 0x2e, 0xa8, 0x61, + 0x5d, 0xeb, 0xd4, 0xe3, 0xa8, 0x32, 0x48, 0xfb, 0xd3, 0x4a, 0xa7, 0xde, + 0x34, 0xda, 0xd3, 0x47, 0xad, 0x56, 0x2b, 0xfd, 0x7d, 0x27, 0x6c, 0x75, + 0xec, 0x2b, 0x89, 0xf7, 0x75, 0x1e, 0xec, 0x66, 0x94, 0xf7, 0x7a, 0x73, + 0xea, 0x75, 0xa9, 0x4b, 0x85, 0xd0, 0xe9, 0xa6, 0xbc, 0xef, 0x91, 0x01, + 0xeb, 0x33, 0xcb, 0xcc, 0x9b, 0x01, 0xe8, 0x7a, 0xd4, 0xd1, 0x9f, 0x43, + 0xdc, 0xf6, 0xda, 0xa7, 0xa4, 0x06, 0xd4, 0xb7, 0xde, 0xb5, 0xa3, 0x14, + 0xc0, 0x52, 0xdd, 0xdd, 0x9f, 0xd9, 0xa9, 0xf8, 0xdb, 0x62, 0x9c, 0x63, + 0x93, 0xdc, 0xd8, 0xec, 0x98, 0xe5, 0x7e, 0x9b, 0xd6, 0x2a, 0x96, 0x27, + 0x69, 0x27, 0xd4, 0x9b, 0x95, 0x53, 0x53, 0xd7, 0xd3, 0x80, 0x94, 0xdd, + 0x3e, 0x1f, 0xd3, 0xaa, 0x98, 0x94, 0x31, 0xc7, 0xd3, 0x50, 0x9d, 0x68, + 0x2b, 0x7a, 0x8a, 0xd8, 0x62, 0x1e, 0xf0, 0x9a, 0x98, 0x6a, 0x6a, 0x23, + 0xeb, 0x04, 0xa4, 0xbe, 0x6e, 0x9c, 0xea, 0x44, 0xb6, 0x2d, 0x7a, 0x25, + 0xe8, 0xff, 0xc7, 0x6c, 0x84, 0x3f, 0xea, 0xa5, 0xd3, 0x8f, 0x8b, 0xba, + 0xe2, 0x84, 0xd7, 0xd8, 0x8f, 0xd0, 0xdb, 0x24, 0xdb, 0x56, 0x92, 0xfc, + 0xcd, 0x81, 0xdd, 0x3b, 0x90, 0x0d, 0xb7, 0x69, 0xdc, 0xc7, 0x8c, 0xfd, + 0x9f, 0xfd, 0xda, 0xe2, 0x89, 0xee, 0x8a, 0x5e, 0xd9, 0x79, 0x87, 0x2e, + 0x75, 0xce, 0xd7, 0x7b, 0x85, 0x1d, 0x5f, 0xfc, 0xd5, 0xf9, 0x84, 0xe6, + 0x4a, 0xe2, 0xd4, 0xcd, 0x86, 0x14, 0x35, 0xb9, 0xd3, 0x9e, 0x8c, 0x92, + 0x2f, 0x3b, 0xd3, 0xdd, 0x91, 0x2c, 0x2b, 0x82, 0x9a, 0xe5, 0x52, 0xb2, + 0xee, 0xc8, 0xa6, 0x74, 0x61, 0xf6, 0xe9, 0x4f, 0xb6, 0x97, 0x63, 0x8d, + 0xe8, 0xc4, 0xc2, 0x6a, 0x6d, 0xd1, 0xe9, 0x4e, 0xd3, 0x80, 0x78, 0x18, + 0xe9, 0xaa, 0xd7, 0x3c, 0x7a, 0xf2, 0xdd, 0xbc, 0xd8, 0x13, 0x7f, 0x06, + 0xd8, 0x5e, 0xdb, 0xe2, 0x80, 0x03, 0xc8, 0xa0, 0xdc, 0xe5, 0x7d, 0x16, + 0xb0, 0xe1, 0xdd, 0x70, 0x78, 0x9f, 0x99, 0x35, 0xdb, 0x86, 0x75, 0x96, + 0x82, 0x5c, 0xda, 0xd1, 0x73, 0x88, 0x6d, 0xcd, 0xd9, 0xbd, 0x74, 0x01, + 0x59, 0x2e, 0xd8, 0xb6, 0x75, 0x1b, 0x43, 0xe6, 0xd7, 0x50, 0x79, 0x52, + 0x33, 0xe3, 0xd5, 0x74, 0x80, 0x87, 0x2e, 0x68, 0xd4, 0x13, 0x88, 0x4b, + 0x2a, 0x35, 0xa7, 0x9e, 0x4b, 0x1c, 0xed, 0x59, 0xaf, 0x4a, 0x4e, 0xac, + 0xec, 0xbb, 0xc0, 0x56, 0x5c, 0xf8, 0xe9, 0x54, 0xce, 0xf4, 0x62, 0x57, + 0xe9, 0x91, 0xd8, 0x43, 0x63, 0x90, 0xe2, 0x6c, 0xd8, 0x33, 0x68, 0xd2, + 0xdc, 0x43, 0xd8, 0xe6, 0x6e, 0x72, 0xd7, 0x9b, 0xdc, 0xf2, 0x6b, 0x79, + 0xc3, 0x45, 0xde, 0x11, 0x64, 0x7c, 0xa6, 0x5c, 0xde, 0x80, 0x61, 0xe2, + 0x91, 0x44, 0xde, 0x43, 0x60, 0x6e, 0x7d, 0x22, 0xdb, 0x17, 0x60, 0x8d, + 0x67, 0x6d, 0xde, 0xbb, 0x5e, 0x5c, 0x52, 0x8e, 0xdf, 0x09, 0x63, 0x9e, + 0x3c, 0xbd, 0xdd, 0x2e, 0x69, 0x06, 0x32, 0x60, 0xd6, 0xef, 0x73, 0x9c, + 0x2d, 0x31, 0xd4, 0xe3, 0x7b, 0xd1, 0x2a, 0x85, 0xb0, 0x0a, 0x37, 0x31, + 0xec, 0xc9, 0xb9, 0xb6, 0x3f, 0xc3, 0xeb, 0x26, 0xcd, 0xdd, 0x4d, 0x2d, + 0xec, 0x60, 0xd7, 0x4b, 0x53, 0xf5, 0xe1, 0xf2, 0xd6, 0x5e, 0x57, 0x10, + 0xdc, 0x9f, 0xd8, 0xfd, 0x5d, 0x83, 0xdb, 0x50, 0xda, 0x44, 0x5d, 0x48, + 0xd7, 0xc2, 0xdd, 0xad, 0x58, 0xd7, 0xbd, 0x7c, 0xde, 0xb7, 0x52, 0xed, + 0xa2, 0x06, 0xe0, 0xce, 0x4c, 0x1f, 0x8b, 0x2b, 0xe2, 0x26, 0x48, 0x4a, + 0x77, 0x56, 0xdf, 0xb8, 0x3e, 0xbb, 0x5e, 0x96, 0xdd, 0x94, 0x3d, 0xd1, + 0x4a, 0x29, 0xdb, 0x00, 0x38, 0x41, 0x35, 0x5d, 0xda, 0x81, 0x59, 0xf5, + 0x31, 0x27, 0xd7, 0x6c, 0x61, 0xf0, 0x2d, 0x9c, 0xd4, 0x40, 0x6e, 0xdc, + 0x2a, 0xaf, 0xba, 0x26, 0x35, 0x7b, 0xe9, 0x58, 0xd1, 0x0d, 0x3a, 0x4f, + 0xf0, 0x53, 0xd8, 0x69, 0x38, 0x94, 0xe6, 0x34, 0xd7, 0x99, 0x3b, 0x91, + 0xdd, 0x74, 0xd9, 0xce, 0x48, 0x77, 0xdc, 0x0d, 0xdb, 0x2c, 0x4b, 0x3d, + 0xda, 0x19, 0xde, 0xe9, 0x4b, 0xb7, 0xd1, 0x6f, 0xde, 0x2e, 0x42, 0xe2, + 0xb5, 0x11, 0xdc, 0x21, 0x36, 0x4c, 0x95, 0x9f, 0xdc, 0xaa, 0x35, 0x85, + 0x82, 0xbb, 0xdb, 0x81, 0x33, 0xfc, 0x6f, 0x5e, 0xda, 0xb8, 0x33, 0x62, + 0x5c, 0xc6, 0xdb, 0x2e, 0x32, 0x55, 0x47, 0x6d, 0xd6, 0xe5, 0x31, 0x62, + 0x32, 0xfb, 0xd4, 0x23, 0x31, 0x20, 0x30, 0x3b, 0xd6, 0x4b, 0x4f, 0x75, + 0x2e, 0x17, 0xd5, 0x82, 0x5d, 0x2d, 0x2b, 0xe9, 0x24, 0x01, 0xd5, 0x53, + 0xe1, 0xed, 0x21, 0xf1, 0xdf, 0x60, 0xe3, 0xff, 0x22, 0x65, 0xe3, 0x4d, + 0xe3, 0x74, 0x25, 0x00, 0xe3, 0x6d, 0xdf, 0xfd, 0x27, 0xe8, 0xe0, 0x37, + 0xd5, 0x24, 0x29, 0x73, 0xde, 0xcc, 0xcb, 0x6f, 0x2a, 0x64, 0xdc, 0x0c, + 0xc3, 0x5c, 0x2e, 0x6d, 0xd4, 0x01, 0xae, 0xe2, 0x2f, 0x1a, 0xce, 0xa2, + 0x9f, 0x13, 0x2f, 0x28, 0xcc, 0x20, 0x91, 0x08, 0x2e, 0xaa, 0xcb, 0x65, + 0x83, 0x6a, 0x2e, 0x26, 0xcc, 0xfb, 0x71, 0xde, 0x2d, 0x74, 0xce, 0xcb, + 0x5f, 0x4b, 0x2d, 0x00, 0xd1, 0x81, 0x31, 0x6a, 0x2d, 0x1b, 0xd1, 0x49, + 0x2f, 0x68, 0x2d, 0x35, 0xd1, 0x16, 0x2d, 0x87, 0x2d, 0x52, 0xd0, 0xe6, + 0x2b, 0xc6, 0x25, 0x44, 0xce, 0x53, 0xe2, 0x2d, 0x26, 0x0e, 0xd5, 0xfb, + 0xe2, 0x87, 0x24, 0x57, 0xe1, 0xaa, 0xe4, 0xd0, 0x25, 0x32, 0xe4, 0x41, + 0xe3, 0xd4, 0x28, 0xc6, 0xe3, 0xae, 0xdc, 0xd6, 0x2b, 0x01, 0xe0, 0xd0, + 0xd3, 0x2c, 0x2b, 0x0e, 0xdf, 0x86, 0xc9, 0x7f, 0x2f, 0x22, 0xd7, 0xcd, + 0xb6, 0xc9, 0x2f, 0xf3, 0xd0, 0xd9, 0xa4, 0x54, 0x2f, 0x9b, 0xcc, 0x3e, + 0x94, 0x28, 0x2e, 0xb1, 0xcb, 0x45, 0x81, 0x3b, 0x2d, 0x91, 0xcd, 0xa2, + 0x6b, 0xb1, 0x30, 0xd5, 0xd1, 0x2b, 0x53, 0x93, 0x2e, 0xd0, 0xd2, 0x48, + 0x31, 0xac, 0x2e, 0xe3, 0xd1, 0xfe, 0x2f, 0x3e, 0x2e, 0xf6, 0xd1, 0xba, + 0x2d, 0x02, 0x51, 0x0e, 0xd9, 0x16, 0x24, 0xf7, 0x26, 0xe1, 0xcb, 0xa8, + 0xe2, 0xfe, 0x27, 0xfd, 0xce, 0xfc, 0xe3, 0x60, 0x28, 0xfd, 0xd6, 0xe3, + 0xe3, 0x58, 0x28, 0x06, 0xe3, 0xc4, 0xe5, 0x29, 0x29, 0xd8, 0xe4, 0x60, + 0xe3, 0x28, 0x2c, 0x2b, 0xe3, 0xff, 0xd9, 0x65, 0x2f, 0x97, 0xe1, 0x1d, + 0xcd, 0xef, 0x31, 0x19, 0xdd, 0x52, 0xc1, 0x26, 0x32, 0x8e, 0xd3, 0x96, + 0xab, 0x52, 0x31, 0xba, 0xcf, 0x73, 0x96, 0x1a, 0x2e, 0xd2, 0xc8, 0xd6, + 0x7e, 0x22, 0x31, 0x69, 0xcc, 0x62, 0x64, 0xfb, 0x32, 0x8d, 0xd5, 0x92, + 0x41, 0xf4, 0x31, 0xe7, 0xd2, 0x26, 0x32, 0x7d, 0x49, 0x28, 0xd9, 0x84, + 0x2c, 0xc3, 0x57, 0x59, 0xda, 0xa3, 0x28, 0x3b, 0x80, 0x07, 0xda, 0xde, + 0x25, 0xea, 0x27, 0x8a, 0xc5, 0x8d, 0xe6, 0xa8, 0x29, 0x7f, 0xcc, 0x66, + 0xe4, 0x1f, 0x2b, 0xa6, 0xcf, 0xfe, 0xe4, 0x6f, 0x2b, 0x87, 0xdb, 0x50, + 0xe6, 0x73, 0x2e, 0x04, 0xe3, 0xf3, 0xe4, 0xd2, 0x34, 0x53, 0xe3, 0x8b, + 0xe0, 0x72, 0x3d, 0x1c, 0xe5, 0xa5, 0xd8, 0xdb, 0x53, 0x3b, 0xe4, 0x35, + 0xcd, 0x4e, 0x5b, 0x40, 0xe2, 0xd3, 0xbd, 0xf7, 0x5d, 0x3e, 0xe0, 0x39, + 0xaa, 0x26, 0x5f, 0x78, 0xdf, 0x82, 0x90, 0xd0, 0x5a, 0x70, 0xe0, 0x09, + 0x72, 0xd0, 0x5c, 0xe3, 0xdf, 0x57, 0x53, 0x9c, 0x5b, 0xc7, 0xdc, 0xcd, + 0x38, 0x0b, 0x72, 0xac, 0xe0, 0x3f, 0x2e, 0x69, 0x83, 0xba, 0xde, 0x8b, + 0x2a, 0x8f, 0x8a, 0x73, 0xda, 0xcd, 0x26, 0xf4, 0x2a, 0x6a, 0xbd, 0xa9, + 0xe9, 0x5e, 0x2b, 0x71, 0xc4, 0x03, 0xe8, 0x70, 0x2d, 0x79, 0xcb, 0x8a, + 0xe6, 0xbf, 0x34, 0x75, 0xd0, 0xae, 0xe4, 0x88, 0x4b, 0xb3, 0xdd, 0x93, + 0xe6, 0x8f, 0x58, 0x35, 0xdf, 0xc2, 0xe0, 0x5b, 0x63, 0x09, 0xdf, 0x6f, + 0xd9, 0xb2, 0x71, 0x1c, 0xe0, 0xc2, 0xcf, 0x7f, 0x77, 0x6f, 0xe3, 0xd9, + 0xc5, 0x0f, 0x79, 0xf3, 0xe3, 0xfc, 0xb2, 0x7f, 0x7f, 0xa6, 0xdf, 0x81, + 0x9b, 0xac, 0x82, 0x9a, 0xde, 0xb9, 0x82, 0xc8, 0x82, 0x67, 0xe3, 0x21, + 0x65, 0x05, 0x8a, 0x9e, 0xe0, 0x26, 0x4d, 0x94, 0x8e, 0x16, 0xdf, 0x14, + 0x38, 0xc0, 0x9a, 0x8f, 0xdb, 0xc3, 0x2a, 0xcd, 0xa3, 0x06, 0xdd, 0x22, + 0x25, 0xd3, 0x2e, 0x9c, 0xb6, 0x07, 0xe6, 0xd7, 0x30, 0x37, 0xb9, 0x2d, + 0xe8, 0x63, 0x33, 0x22, 0xc2, 0x2e, 0xe9, 0x9b, 0x59, 0x93, 0xcc, 0x5c, + 0xe5, 0xa2, 0x5c, 0xce, 0xd3, 0x84, 0xe6, 0x2b, 0x6c, 0x54, 0xda, 0x51, + 0xe1, 0x73, 0x7a, 0x58, 0xdb, 0x82, 0xdb, 0x17, 0x84, 0xfb, 0xde, 0xcc, + 0xd3, 0x3a, 0x8f, 0x43, 0xe2, 0x94, 0xc8, 0xe3, 0x94, 0x6e, 0xe0, 0x08, + 0xb6, 0x6e, 0x98, 0x67, 0xde, 0x49, 0xa1, 0xcf, 0x9a, 0x8a, 0xdd, 0x9f, + 0x89, 0xf4, 0x9e, 0x5c, 0xdc, 0x6f, 0x72, 0x47, 0xa2, 0x01, 0xdb, 0xb3, + 0x5a, 0x40, 0xa5, 0xbf, 0xd9, 0x21, 0x41, 0xc5, 0xa9, 0xe9, 0xda, 0xeb, + 0x2f, 0x77, 0xab, 0xef, 0xd8, 0xfb, 0x25, 0x21, 0x31, 0x94, 0xa9, 0x22, + 0xe4, 0x56, 0x35, 0xf5, 0xaf, 0xa7, 0xe6, 0x0e, 0x53, 0x58, 0xb7, 0xdf, + 0xe6, 0xed, 0x5e, 0x71, 0xbf, 0x59, 0xe5, 0x27, 0x6b, 0xf5, 0xc6, 0x23, + 0xdf, 0xb4, 0x7d, 0xaa, 0xca, 0x78, 0xda, 0x20, 0x8b, 0x0d, 0xd2, 0xc1, + 0xd6, 0x78, 0x99, 0x04, 0xd6, 0x42, 0xd3, 0x4b, 0xa7, 0xf3, 0xde, 0x1f, + 0xcd, 0xb6, 0xac, 0x92, 0xdd, 0x33, 0xbb, 0x25, 0xb0, 0x0e, 0xdc, 0x44, + 0xa7, 0xf7, 0xb2, 0x54, 0xdb, 0xd4, 0x93, 0x0d, 0xb4, 0x63, 0xdc, 0x16, + 0x7d, 0xc7, 0xb4, 0x68, 0xd7, 0xf7, 0x62, 0xd8, 0xb5, 0x27, 0xd5, 0xb6, + 0x4a, 0xa1, 0xb6, 0x67, 0xd8, 0xf5, 0x35, 0x1b, 0xb8, 0x30, 0xd7, 0xed, + 0x2b, 0xca, 0x33, 0xe2, 0x9e, 0xd4, 0xe4, 0x99, 0x4e, 0x06, 0xa4, 0x8b, + 0xe4, 0x57, 0x5c, 0x6b, 0xac, 0xfd, 0xe4, 0xd2, 0x6d, 0x0a, 0xb3, 0xc3, + 0xe2, 0xcb, 0x79, 0x5d, 0xb7, 0xad, 0xdd, 0x08, 0x89, 0xd5, 0xc0, 0x8f, + 0xd7, 0x57, 0x9a, 0x3b, 0xc5, 0xea, 0xd4, 0x8c, 0xa9, 0xf1, 0xcd, 0x26, + 0xce, 0xc1, 0xb6, 0x99, 0xd3, 0xae, 0xca, 0x0f, 0xbb, 0xb2, 0xd3, 0xdd, + 0xb9, 0x5f, 0xbd, 0xee, 0xd3, 0xce, 0xa6, 0x34, 0xc0, 0x54, 0xd3, 0x6b, + 0x92, 0x5c, 0xc1, 0x7b, 0xd4, 0x60, 0x7d, 0xa7, 0xc3, 0x3f, 0xd5, 0x9c, + 0x68, 0x05, 0xc4, 0xde, 0xd7, 0x24, 0x53, 0xdb, 0xc4, 0x40, 0xd7, 0x79, + 0x3f, 0x1e, 0xc4, 0x8e, 0xd5, 0xc0, 0x2f, 0x12, 0x4c, 0x3d, 0x93, 0x7b, + 0xe4, 0x75, 0x5d, 0x03, 0x98, 0x5c, 0xe3, 0x9c, 0x6b, 0x7d, 0xa0, 0x60, + 0xe5, 0x37, 0x7d, 0xb8, 0xa7, 0x50, 0xe4, 0x31, 0x8b, 0x64, 0xac, 0xa9, + 0xde, 0x54, 0x9b, 0x2d, 0xb4, 0x96, 0xd9, 0x53, 0xa9, 0xd8, 0xbb, 0xc2, + 0xd4, 0xcb, 0xbb, 0x0e, 0xc2, 0xcf, 0xce, 0x4d, 0xc9, 0xae, 0xc9, 0xae, + 0xca, 0x3d, 0xc9, 0x6c, 0xca, 0x9c, 0xb7, 0xbe, 0xca, 0xe8, 0xca, 0xf5, + 0xa4, 0x9d, 0xcc, 0x61, 0xcb, 0xa2, 0x91, 0x50, 0xcd, 0x59, 0xcc, 0xe2, + 0x7d, 0xf4, 0xce, 0x7c, 0xce, 0xb4, 0x6a, 0x57, 0xce, 0xe3, 0xd0, 0x78, + 0x58, 0x0d, 0xcf, 0xb1, 0xd2, 0x35, 0x45, 0xf1, 0xd0, 0xa4, 0xd3, 0x7a, + 0x33, 0x80, 0x5b, 0x98, 0x86, 0x8f, 0xe6, 0x24, 0x6a, 0x92, 0x8a, 0xe6, + 0xe4, 0x05, 0x7f, 0xe1, 0x93, 0x5f, 0xe6, 0x2e, 0x8d, 0xd8, 0x9c, 0x6d, + 0xe5, 0xe4, 0x9e, 0x3b, 0xa3, 0xe7, 0xe1, 0x1e, 0xad, 0xb3, 0xab, 0x34, + 0xdb, 0x25, 0xba, 0xb5, 0xb2, 0xce, 0xd6, 0x47, 0xc8, 0x2e, 0xb9, 0xa5, + 0xce, 0x64, 0xd0, 0x5e, 0xbf, 0xb5, 0xc7, 0x72, 0xd5, 0xab, 0xc1, 0x31, + 0xb7, 0x20, 0xd7, 0x44, 0xc1, 0x80, 0xa4, 0x18, 0xd7, 0x82, 0xc1, 0xa1, + 0x90, 0xc5, 0xd7, 0xfe, 0xc2, 0x42, 0x7d, 0x36, 0xd6, 0x4e, 0xc1, 0x0d, + 0x68, 0x20, 0xd4, 0x81, 0xc0, 0xc3, 0x53, 0xc7, 0xd2, 0xd7, 0xbf, 0xfc, + 0x3f, 0x1f, 0xd1, 0xe5, 0xc2, 0x6a, 0x30, 0xd1, 0x6d, 0xdc, 0x7a, 0x75, + 0xe8, 0x41, 0x82, 0x73, 0x81, 0x8d, 0xe7, 0x22, 0x8a, 0x88, 0x89, 0x3b, + 0xe6, 0xa4, 0x9d, 0xad, 0x92, 0xb5, 0xe6, 0xb5, 0xb1, 0x31, 0x9d, 0x17, + 0xe4, 0xb9, 0xbc, 0x79, 0xa3, 0x6e, 0xdf, 0x64, 0xcb, 0x6f, 0xab, 0x6d, + 0xd9, 0xd0, 0xd2, 0x76, 0xb2, 0x15, 0xd3, 0x73, 0xdc, 0x44, 0xb7, 0x05, + 0xc8, 0xc4, 0xde, 0xda, 0xb5, 0xe8, 0xb5, 0x93, 0xdd, 0x2e, 0xb3, 0x84, + 0xa0, 0x21, 0xd9, 0xf0, 0xaf, 0xdd, 0x89, 0x94, 0xd8, 0x17, 0xad, 0x65, + 0x74, 0x78, 0xd6, 0x15, 0xab, 0xb3, 0x5f, 0x82, 0xd4, 0xeb, 0xab, 0xed, + 0x4a, 0xd5, 0xd3, 0xdf, 0xab, 0xd2, 0x36, 0x9a, 0xd3, 0x0a, 0xb2, 0x5d, + 0x30, 0x06, 0x81, 0xc0, 0x71, 0x59, 0xeb, 0x69, 0x8b, 0x07, 0x77, 0xe6, + 0xeb, 0x84, 0x98, 0x1e, 0x7e, 0x4c, 0xea, 0x1c, 0xae, 0x51, 0x8a, 0x80, + 0xe9, 0xa1, 0xc0, 0x8f, 0x95, 0x2f, 0xeb, 0x6d, 0xce, 0x25, 0x9d, 0xad, + 0xe5, 0xff, 0xd5, 0xa0, 0xa1, 0xcd, 0xdc, 0x36, 0xd9, 0x64, 0xa7, 0x39, + 0xd6, 0x0e, 0xde, 0xd0, 0xa7, 0x02, 0xc3, 0x0a, 0xde, 0x1b, 0xa3, 0x88, + 0xac, 0x31, 0xdc, 0x40, 0xa0, 0x3f, 0x96, 0x51, 0xd9, 0x5a, 0x9c, 0x6b, + 0x80, 0x51, 0xd7, 0xcb, 0x9a, 0xa0, 0x6b, 0x92, 0xd5, 0x50, 0x98, 0xa4, + 0x56, 0x5a, 0xd4, 0x68, 0x99, 0x5d, 0x42, 0x57, 0xd3, 0x91, 0x9b, 0xef, + 0x33, 0x50, 0xd3, 0x5a, 0xa1, 0x2f, 0x2e, 0x61, 0x8d, 0xfc, 0x63, 0xf7, + 0xed, 0x65, 0x99, 0x7b, 0x6d, 0x10, 0xeb, 0x3f, 0xa8, 0x5c, 0x71, 0x5e, + 0xea, 0x35, 0xb9, 0x9b, 0x7e, 0x8d, 0xe9, 0xbb, 0xcb, 0x95, 0x89, 0x06, + 0xeb, 0x13, 0xd5, 0x41, 0x8e, 0x8e, 0xdf, 0x9f, 0xd7, 0x82, 0x93, 0x85, + 0xd9, 0xfc, 0xdb, 0x08, 0x96, 0xed, 0xd0, 0x2c, 0xdc, 0xb0, 0x94, 0x9f, + 0xb9, 0x42, 0xdc, 0xfa, 0x91, 0x3b, 0xa2, 0xc8, 0xdb, 0x03, 0x8d, 0xac, + 0x8c, 0x4a, 0xd9, 0x5c, 0x8b, 0xd2, 0x78, 0x47, 0xd6, 0xd7, 0x89, 0x26, + 0x62, 0x75, 0xd5, 0x8c, 0x88, 0x99, 0x4c, 0xcd, 0xd4, 0x3e, 0x8a, 0x28, + 0x38, 0x4a, 0xd3, 0x47, 0x8f, 0xf5, 0x30, 0xc8, 0xd3, 0xb7, 0x94, 0xd3, + 0x2d, 0xcd, 0x9e, 0xbb, 0x5f, 0x2a, 0xec, 0x73, 0xa9, 0x83, 0x63, 0x02, + 0xe9, 0x21, 0xb7, 0x30, 0x65, 0x6a, 0xe9, 0x08, 0xc4, 0xcb, 0x72, 0x04, + 0xe8, 0x67, 0xd3, 0xae, 0x7b, 0xa3, 0xe8, 0x1a, 0xd6, 0xd0, 0x7e, 0x79, + 0xdc, 0x60, 0xd8, 0x1d, 0x82, 0xce, 0xd8, 0xc4, 0xdb, 0xd2, 0x84, 0xdd, + 0xcb, 0x41, 0xdc, 0xed, 0x80, 0x03, 0xb2, 0x13, 0xdd, 0x8a, 0x7d, 0xa3, + 0x9b, 0xbf, 0xdb, 0xe7, 0x7a, 0x1e, 0x84, 0xb7, 0xda, 0xa3, 0x78, 0x60, + 0x70, 0x2a, 0xd9, 0x46, 0x78, 0x1c, 0x5a, 0xed, 0xd7, 0xbe, 0x7a, 0xcc, + 0x47, 0x86, 0xd6, 0xb1, 0x7d, 0x36, 0x34, 0xd4, 0xd4, 0xed, 0x84, 0x38, + 0x30, 0x00, 0xd3, 0x9e, 0x8b, 0xf1, 0x2c, 0x49, 0xa8, 0x66, 0x4c, 0x4d, + 0xed, 0x18, 0xb6, 0xd2, 0x5c, 0xd3, 0xe9, 0x42, 0xc2, 0xf5, 0x61, 0x73, + 0xe9, 0xac, 0xd1, 0x4d, 0x63, 0xa5, 0xe9, 0xa6, 0xd7, 0x6a, 0x67, 0xdb, + 0xdf, 0x89, 0xd7, 0xff, 0x6d, 0x07, 0xdb, 0xae, 0xd8, 0xd1, 0x71, 0x63, + 0xd7, 0xbd, 0xdc, 0xb2, 0x70, 0xf1, 0xc5, 0xb6, 0xdd, 0xf7, 0x69, 0x57, + 0xa8, 0x91, 0xdd, 0xdb, 0x67, 0x21, 0x92, 0x69, 0xdd, 0x56, 0x66, 0x32, + 0x7f, 0x47, 0xda, 0xb2, 0x66, 0x6b, 0x69, 0xff, 0xde, 0x43, 0x63, 0xa9, + 0x54, 0x36, 0xdd, 0xbe, 0x67, 0x5a, 0x3e, 0xb9, 0xd9, 0x7c, 0x6e, 0xcf, + 0x33, 0x58, 0xd7, 0x76, 0x77, 0xc1, 0x2f, 0x09, 0xd5, 0x76, 0x80, 0x05, + 0x2b, 0xca, 0xb2, 0xb5, 0x39, 0xca, 0xef, 0x82, 0xc7, 0x7f, 0x4b, 0xcc, + 0xed, 0x75, 0xcd, 0x74, 0x50, 0x8b, 0xeb, 0x72, 0xd7, 0x00, 0x55, 0xab, + 0xde, 0x93, 0xd7, 0xc7, 0x5d, 0xc2, 0xdd, 0xa1, 0xd9, 0x2f, 0x5e, 0x8b, + 0xdb, 0x78, 0xd9, 0xbd, 0x61, 0x96, 0xd7, 0xc4, 0xdd, 0x72, 0x5e, 0x91, + 0xc1, 0x07, 0xde, 0xdd, 0x57, 0x2c, 0xa4, 0xa7, 0xde, 0x30, 0x53, 0xb7, + 0x8d, 0xae, 0xdf, 0x0e, 0x50, 0xa9, 0x79, 0xee, 0xe1, 0xfa, 0x4a, 0xc2, + 0x64, 0x54, 0xe0, 0x65, 0x49, 0xc3, 0x50, 0x35, 0xde, 0x52, 0x4a, 0xef, + 0x37, 0xaf, 0xdc, 0x99, 0x60, 0x09, 0x32, 0x62, 0xd9, 0x1d, 0x67, 0x51, + 0x2e, 0x8d, 0xd5, 0x63, 0x72, 0xac, 0x2b, 0x8b, 0xbb, 0xbd, 0x36, 0xe3, + 0xea, 0xb6, 0xd2, 0x11, 0x3e, 0x58, 0xf0, 0x52, 0xd8, 0x72, 0x3b, 0xd7, + 0xe5, 0x11, 0xd8, 0xea, 0x49, 0x2d, 0xdd, 0xa3, 0xda, 0x19, 0x4c, 0xa0, + 0xdc, 0x2e, 0xdb, 0xb7, 0x51, 0x5a, 0xda, 0xab, 0xdc, 0x0e, 0x56, 0x45, + 0xd3, 0x15, 0xdf, 0x8e, 0x4a, 0x1c, 0xb9, 0xfe, 0xdd, 0xf1, 0x3c, 0x7b, + 0x98, 0x44, 0xdd, 0x0f, 0x36, 0xb1, 0x82, 0xf8, 0xdc, 0x4d, 0x35, 0x33, + 0x6f, 0xf0, 0xdb, 0x7a, 0x34, 0xba, 0x5d, 0xa1, 0xda, 0xee, 0x35, 0x8a, + 0x4b, 0x5a, 0xd8, 0x00, 0x32, 0x8a, 0x33, 0xd3, 0xd4, 0xfe, 0x32, 0x03, + 0x30, 0xe3, 0xd8, 0x10, 0x5b, 0x72, 0x2e, 0x8e, 0xd6, 0x29, 0x61, 0xf6, + 0x2c, 0x64, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xa8, 0x80, + 0xff, 0xff, 0xb1, 0x8f, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xa8, 0x80, + 0xff, 0xff, 0xb1, 0x8f, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xa8, 0x80, + 0xff, 0xff, 0xb1, 0x8f, 0x6d, 0x42, 0x41, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x98, + 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x84, + 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x97, 0x73, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x85, 0x60, + 0xff, 0xff, 0xb3, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x0e, + 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xad, 0x0c, 0x00, 0x00, 0x1b, 0xb0, + 0x00, 0x00, 0x0d, 0xaa, 0x00, 0x00, 0x14, 0x7b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x2a, + 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x0e, 0x2c, 0x00, 0x00, 0x14, 0x7b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x47, 0x00, 0x00, 0x1a, 0x49, 0x00, 0x00, 0x0b, 0xb0, + 0x00, 0x00, 0x14, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x66, 0xf0, 0x55, 0x90, + 0x22, 0x59, 0x4e, 0xfa, 0x58, 0x7c, 0xf5, 0x33, 0x17, 0xf7, 0xfd, 0x13, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd2, 0xdb, 0xff, 0xff, 0x00, 0x00, + 0x2d, 0x24, 0xe8, 0x08, 0x02, 0xec, 0xff, 0xff, 0xb1, 0x05, 0xa7, 0x83, + 0x0a, 0xcb, 0x99, 0x0f, 0xaa, 0x6f, 0xdd, 0xa6, 0x70, 0x61, 0x72, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xab, + 0x00, 0x0c, 0x12, 0x9c, 0xff, 0xfb, 0x21, 0x8d, 0x00, 0x89, 0x34, 0x39, + 0x00, 0x00, 0x67, 0x52, 0xff, 0xff, 0xf1, 0xec, 0xff, 0xc8, 0xaa, 0x3d, + 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x6a, 0xab, 0x00, 0x06, 0xbe, 0x75, 0xff, 0xfd, 0xbb, 0x45, + 0x00, 0x4c, 0xa4, 0xf7, 0x00, 0x00, 0x56, 0x3e, 0xff, 0xff, 0xf1, 0xec, + 0xff, 0xe6, 0x38, 0x17, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xab, 0x00, 0x03, 0xee, 0x3c, + 0xff, 0xff, 0x75, 0x4e, 0x00, 0x2c, 0xab, 0xba, 0x00, 0x00, 0x23, 0x83, + 0xff, 0xff, 0xf1, 0xec, 0xff, 0xf9, 0xd7, 0xc3, 0x73, 0x69, 0x67, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x72, 0x6d, 0x67, 0x58, 0x59, 0x5a, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0xd3, 0x2d, 0x6d, 0x6c, 0x75, 0x63, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x65, 0x6e, 0x55, 0x53, + 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x43, 0x00, 0x6f, + 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, + 0x00, 0x74, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x37, + 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, + 0x00, 0x6e, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, + 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6c, + 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, + 0x00, 0x73, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x75, + 0x00, 0x6d, 0x00, 0x00, 0x73, 0x66, 0x33, 0x32, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x0c, 0x4b, 0x00, 0x00, 0x05, 0xe4, 0xff, 0xff, 0xf3, 0x28, + 0x00, 0x00, 0x07, 0x9c, 0x00, 0x00, 0xfd, 0x87, 0xff, 0xff, 0xfb, 0xa1, + 0xff, 0xff, 0xfd, 0xa3, 0x00, 0x00, 0x02, 0xa2, 0x00, 0x00, 0xc0, 0x8c + }; + + char + *description, + **options, + *option, + **profiles, + **properties, + *property; + + DrawingWand + *drawing_wand; + + ExceptionType + severity; + + MagickWand + *clone_wand, + *magick_wand; + + PixelIterator + *iterator; + + PixelWand + *background, + *border, + *fill, + **pixels; + + ssize_t + i; + + unsigned char + *profile; + + unsigned int + status; + + size_t + columns, + delay, + length, + number_options, + number_profiles, + number_properties, + number_wands, + rows; + + (void) argc; + (void) argv; + MagickWandGenesis(); + magick_wand=NewMagickWand(); + (void) MagickSetSize(magick_wand,640,480); + (void) MagickGetSize(magick_wand,&columns,&rows); + if ((columns != 640) || (rows != 480)) + { + (void) FormatLocaleFile(stderr,"Unexpected magick wand size\n"); + exit(1); + } + (void) FormatLocaleFile(stdout,"Reading images...\n"); + { + char + *p, + path[MaxTextExtent]; + + path[0]=0; + p=getenv("SRCDIR"); + if (p != (char *) NULL) + { + (void) strcpy(path,p); + if (path[strlen(path)-1] != '/') + (void) strcat(path,"/"); + } + (void) strcat(path,"sequence.miff"); + status=MagickReadImage(magick_wand,path); + } + if (status == MagickFalse) + ThrowAPIException(magick_wand); + if (MagickGetNumberImages(magick_wand) != 5) + (void) FormatLocaleFile(stderr,"read %.20g images; expected 5\n", + (double) MagickGetNumberImages(magick_wand)); + (void) FormatLocaleFile(stdout,"Iterate forward...\n"); + MagickResetIterator(magick_wand); + while (MagickNextImage(magick_wand) != MagickFalse) + (void) FormatLocaleFile(stdout,"index %.20g scene %.20g\n",(double) + MagickGetIteratorIndex(magick_wand),(double) + MagickGetImageScene(magick_wand)); + (void) FormatLocaleFile(stdout,"Iterate reverse...\n"); + while (MagickPreviousImage(magick_wand) != MagickFalse) + (void) FormatLocaleFile(stdout,"index %.20g scene %.20g\n",(double) + MagickGetIteratorIndex(magick_wand),(double) + MagickGetImageScene(magick_wand)); + (void) FormatLocaleFile(stdout,"Remove scene 1...\n"); + (void) MagickSetIteratorIndex(magick_wand,1); + clone_wand=MagickGetImage(magick_wand); + status=MagickRemoveImage(magick_wand); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + MagickResetIterator(magick_wand); + while (MagickNextImage(magick_wand) != MagickFalse) + (void) FormatLocaleFile(stdout,"index %.20g scene %.20g\n",(double) + MagickGetIteratorIndex(magick_wand),(double) + MagickGetImageScene(magick_wand)); + (void) FormatLocaleFile(stdout,"Insert scene 1 back in sequence...\n"); + (void) MagickSetIteratorIndex(magick_wand,0); + status=MagickAddImage(magick_wand,clone_wand); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + MagickResetIterator(magick_wand); + while (MagickNextImage(magick_wand) != MagickFalse) + (void) FormatLocaleFile(stdout,"index %.20g scene %.20g\n",(double) + MagickGetIteratorIndex(magick_wand),(double) + MagickGetImageScene(magick_wand)); + (void) FormatLocaleFile(stdout,"Set scene 2 to scene 1...\n"); + (void) MagickSetIteratorIndex(magick_wand,2); + status=MagickSetImage(magick_wand,clone_wand); + clone_wand=DestroyMagickWand(clone_wand); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + MagickResetIterator(magick_wand); + while (MagickNextImage(magick_wand) != MagickFalse) + (void) FormatLocaleFile(stdout,"index %.20g scene %.20g\n",(double) + MagickGetIteratorIndex(magick_wand),(double) + MagickGetImageScene(magick_wand)); + (void) FormatLocaleFile(stdout,"Apply image processing options...\n"); + status=MagickCropImage(magick_wand,60,60,10,10); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + MagickResetIterator(magick_wand); + background=NewPixelWand(); + status=PixelSetColor(background,"#000000"); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + status=MagickRotateImage(magick_wand,background,90.0); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + border=NewPixelWand(); + (void) PixelSetColor(background,"green"); + (void) PixelSetColor(border,"black"); + status=MagickFloodfillPaintImage(magick_wand,CompositeChannels,background, + 0.01*QuantumRange,border,0,0,MagickFalse); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + background=DestroyPixelWand(background); + border=DestroyPixelWand(border); + drawing_wand=NewDrawingWand(); + (void) PushDrawingWand(drawing_wand); + (void) DrawRotate(drawing_wand,45); + if (getenv("MAGICK_FONT") != 0) + (void) DrawSetFont(drawing_wand,getenv("MAGICK_FONT")); + (void) DrawSetFontSize(drawing_wand,18); + fill=NewPixelWand(); + (void) PixelSetColor(fill,"green"); + (void) DrawSetFillColor(drawing_wand,fill); + fill=DestroyPixelWand(fill); + (void) DrawAnnotation(drawing_wand,15,5,(const unsigned char *) "Magick"); + (void) PopDrawingWand(drawing_wand); + (void) MagickSetIteratorIndex(magick_wand,1); + status=MagickDrawImage(magick_wand,drawing_wand); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + drawing_wand=DestroyDrawingWand(drawing_wand); + { + unsigned char + pixels[27], + primary_colors[27] = + { + 0, 0, 0, + 0, 0, 255, + 0, 255, 0, + 0, 255, 255, + 255, 255, 255, + 255, 0, 0, + 255, 0, 255, + 255, 255, 0, + 128, 128, 128, + }; + + (void) MagickSetIteratorIndex(magick_wand,2); + status=MagickImportImagePixels(magick_wand,10,10,3,3,"RGB",CharPixel, + primary_colors); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + memset(pixels,0,sizeof(pixels)); + status=MagickExportImagePixels(magick_wand,10,10,3,3,"RGB",CharPixel, + pixels); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + for (i=0; i < 27; i++) + if (pixels[i] != primary_colors[i]) + { + (void) FormatLocaleFile(stderr, + "Get pixels does not match set pixels\n"); + exit(1); + } + } + (void) MagickSetIteratorIndex(magick_wand,3); + status=MagickResizeImage(magick_wand,50,50,UndefinedFilter,1.0); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + MagickResetIterator(magick_wand); + while (MagickNextImage(magick_wand) != MagickFalse) + { + (void) MagickSetImageDepth(magick_wand,8); + (void) MagickSetImageCompression(magick_wand,RLECompression); + } + MagickResetIterator(magick_wand); + (void) MagickSetIteratorIndex(magick_wand,4); + (void) FormatLocaleFile(stdout, + "Utilitize pixel iterator to draw diagonal...\n"); + iterator=NewPixelIterator(magick_wand); + if (iterator == (PixelIterator *) NULL) + ThrowAPIException(magick_wand); + pixels=PixelGetNextIteratorRow(iterator,&number_wands); + for (i=0; pixels != (PixelWand **) NULL; i++) + { + (void) PixelSetColor(pixels[i],"#224466"); + (void) PixelSyncIterator(iterator); + pixels=PixelGetNextIteratorRow(iterator,&number_wands); + } + (void) PixelSyncIterator(iterator); + iterator=DestroyPixelIterator(iterator); + (void) FormatLocaleFile(stdout,"Write to wandtest_out.miff...\n"); + status=MagickWriteImages(magick_wand,"wandtest_out.miff",MagickTrue); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + (void) FormatLocaleFile(stdout, + "Change image format from \"MIFF\" to \"GIF\"...\n"); + status=MagickSetImageFormat(magick_wand,"GIF"); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + (void) FormatLocaleFile(stdout,"Set delay between frames to %d seconds...\n", + WandDelay); + status=MagickSetImageDelay(magick_wand,100*WandDelay); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + delay=MagickGetImageDelay(magick_wand); + if (delay != (100*WandDelay)) + { + (void) FormatLocaleFile(stderr,"Get delay does not match set delay\n"); + exit(1); + } + (void) FormatLocaleFile(stdout,"Write to wandtest_out.gif...\n"); + status=MagickWriteImages(magick_wand,"wandtest_out.gif",MagickTrue); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + (void) FormatLocaleFile(stdout,"Set, list, get, and delete wand option...\n"); + status=MagickSetOption(magick_wand,"wand:custom-option",CustomOption); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + option=MagickGetOption(magick_wand,"wand:custom-option"); + if ((option == (const char *) NULL) || + (strlen(option) != strlen(CustomOption)) || + (memcmp(option,CustomOption,strlen(option)) != 0)) + { + (void) FormatLocaleFile(stderr,"Option does not match\n"); + exit(1); + } + option=(char *) MagickRelinquishMemory(option); + options=MagickGetOptions(magick_wand,"*",&number_options); + if (options != (char **) NULL) + { + for (i=0; i < (ssize_t) number_options; i++) + { + (void) FormatLocaleFile(stdout," %s\n",options[i]); + options[i]=(char *) MagickRelinquishMemory(options[i]); + } + options=(char **) MagickRelinquishMemory(options); + } + status=MagickDeleteOption(magick_wand,"wand:custom-option"); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + (void) FormatLocaleFile(stdout, + "Set, list, get, and delete wand property...\n"); + status=MagickSetImageProperty(magick_wand,"wand:custom-property", + CustomProperty); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + property=MagickGetImageProperty(magick_wand,"wand:custom-property"); + if ((property == (const char *) NULL) || + (strlen(property) != strlen(CustomProperty)) || + (memcmp(property,CustomProperty,strlen(property)) != 0)) + { + (void) FormatLocaleFile(stderr,"Property does not match\n"); + exit(1); + } + property=(char *) MagickRelinquishMemory(property); + properties=MagickGetImageProperties(magick_wand,"*",&number_properties); + if (properties != (char **) NULL) + { + for (i=0; i < (ssize_t) number_properties; i++) + { + (void) FormatLocaleFile(stdout," %s\n",properties[i]); + properties[i]=(char *) MagickRelinquishMemory(properties[i]); + } + properties=(char **) MagickRelinquishMemory(properties); + } + status=MagickDeleteImageProperty(magick_wand,"wand:custom-property"); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + (void) FormatLocaleFile(stdout, + "Set, list, get, and remove sRGB color profile...\n"); + status=MagickSetImageProfile(magick_wand,"sRGB",sRGBProfile, + sizeof(sRGBProfile)); + if (status == MagickFalse) + ThrowAPIException(magick_wand); + profile=(unsigned char *) MagickGetImageProfile(magick_wand,"sRGB",&length); + if ((profile == (unsigned char *) NULL) || (length != sizeof(sRGBProfile)) || + (memcmp(profile,sRGBProfile,length) != 0)) + { + (void) FormatLocaleFile(stderr,"Profile does not match\n"); + exit(1); + } + profile=(unsigned char *) MagickRelinquishMemory(profile); + profiles=MagickGetImageProfiles(magick_wand,"*",&number_profiles); + if (profiles != (char **) NULL) + { + for (i=0; i < (ssize_t) number_profiles; i++) + { + (void) FormatLocaleFile(stdout," %s\n",profiles[i]); + profiles[i]=(char *) MagickRelinquishMemory(profiles[i]); + } + profiles=(char **) MagickRelinquishMemory(profiles); + } + profile=(unsigned char *) MagickRemoveImageProfile(magick_wand,"sRGB", + &length); + if ((profile == (unsigned char *) NULL) || (length != sizeof(sRGBProfile)) || + (memcmp(profile,sRGBProfile,length) != 0)) + { + (void) FormatLocaleFile(stderr,"Profile does not match\n"); + exit(1); + } + profile=(unsigned char *) MagickRelinquishMemory(profile); + magick_wand=DestroyMagickWand(magick_wand); + (void) FormatLocaleFile(stdout,"Wand tests pass.\n"); + MagickWandTerminus(); + return(0); +} diff --git a/ImageMagick-6.9.12-44/tests/wandtest.tap b/ImageMagick-6.9.12-44/tests/wandtest.tap new file mode 100755 index 0000000..50e7caf --- /dev/null +++ b/ImageMagick-6.9.12-44/tests/wandtest.tap @@ -0,0 +1,15 @@ +#!/bin/sh +# Copyright (C) 1999-2016 ImageMagick Studio LLC +# +# This program is covered by multiple licenses, which are described in +# LICENSE. You should have received a copy of LICENSE with this +# package; otherwise see https://imagemagick.org/script/license.php. +# +# Test for '${CONVERT}' utility. +# +. ./common.shi +. ${srcdir}/tests/common.shi +echo "1..1" + +${WANDTEST} wandtest_out.miff && echo "ok" || echo "not ok" +: diff --git a/ImageMagick-6.9.12-44/utilities/ImageMagick.1 b/ImageMagick-6.9.12-44/utilities/ImageMagick.1 new file mode 100644 index 0000000..1465fdc --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/ImageMagick.1 @@ -0,0 +1,83 @@ +.TH ImageMagick 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +ImageMagick \- is a free software suite for the creation, modification and display of bitmap images. +.SH SYNOPSIS +\fBconvert\fP \fIinput-file\fP [\fIoptions\fP] \fIoutput-file\fP +.SH OVERVIEW + +Use ImageMagick\[rg] to create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and B\\['e]zier curves. + +The functionality of ImageMagick is typically utilized from the command-line or you can use the features from programs written in your favorite language. Choose from these interfaces: G2F (Ada), MagickCore (C), MagickWand (C), ChMagick (Ch), ImageMagickObject (COM+), Magick++ (C++), JMagick (Java), JuliaIO (Julia), L-Magick (Lisp), Lua (LuaJIT), NMagick (Neko/haXe), Magick.NET (.NET), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP (PHP), IMagick (PHP), PythonMagick (Python), magick (R), RMagick (Ruby), or TclMagick (Tcl/TK). With a language interface, use ImageMagick to modify or create images dynamically and automagically. + +ImageMagick utilizes multiple computational threads to increase performance and can read, process, or write mega-, giga-, or tera-pixel image sizes. + +ImageMagick is free software delivered as a ready-to-run binary distribution or as source code that you may use, copy, modify, and distribute in both open and proprietary applications. It is distributed under a derived Apache 2.0 license. + +The ImageMagick development process ensures a stable API and ABI. Before each ImageMagick release, we perform a comprehensive security assessment that includes memory error, thread data race detection, and continuous fuzzing to help prevent security vulnerabilities. + +The current release is ImageMagick 6.9.10-11. It runs on Linux, Windows, Mac Os X, iOS, Android OS, and others. + +The authoritative ImageMagick version 6 web site is https://legacy.imagemagick.org. The authoritative source code repository is https://github.com/ImageMagick/ImageMagick6. We maintain a source code mirror at https://gitlab.com/ImageMagick/ImageMagick6. + +The design of ImageMagick is an evolutionary process, with the design and implementation efforts serving to influence and guide further progress in the other. With ImageMagick version 7 we aim to improve the design based on lessons learned from the version 6 implementation. + +In the paragraphs below, find a short description for each command-line tool.Cl +ick on the program name to get details on the program usage and a list of comman +d-line options that alters how the program performs. If you are just getting acq +uainted with ImageMagick, start at the top of the list, the convert program, and + work your way down. Also be sure to peruse Anthony Thyssen's tutorial on how to + use ImageMagick utilities to convert, compose, or edit images from the command- +line. +.TP +.B convert + +convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. +.TP +.B identify + +describes the format and characteristics of one or more image files. +.TP +.B mogrify + +resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. Mogrify overwrites the original image file, whereas, convert writes to a different image file. +.TP +.B composite + +overlaps one image over another. +.TP +.B montage + +create a composite image by combining several separate images. The images are tiled on the composite image optionally adorned with a border, frame, image name, and more. +.TP +.B compare + +mathematically and visually annotate the difference between an image and its reconstruction.. + +.TP +.B stream + +is a lightweight tool to stream one or more pixel components of the image or portion of the image to your choice of storage formats. It writes the pixel components as they are read from the input image a row at a time making stream desirable when working with large images or when you require raw pixel components. + +.TP +.B display + +displays an image or image sequence on any X server. +.TP +.B animate + +animates an image sequence on any X server. +.TP +.B import + +saves any visible window on an X server and outputs it as an image file. You can capture a single window, the entire screen, or any rectangular portion of the screen. +.TP +.B conjure + +interprets and executes scripts written in the Magick Scripting Language (MSL). +.PP +For more information about the ImageMagick, point your browser to file:///usr/share/doc/ImageMagick-6/index.html@EXTRA_DOC_DIR@ or http://imagemagick.org/. +.SH SEE ALSO +convert(1), compare(1), composite(1), conjure(1), identify(1), import(1), montage(1), display(1), animate(1), import(1), Magick++-config(1), MagickCore-config(1), MagickWand-config(1) + +.SH COPYRIGHT +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/ImageMagick.1.in b/ImageMagick-6.9.12-44/utilities/ImageMagick.1.in new file mode 100644 index 0000000..81d4902 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/ImageMagick.1.in @@ -0,0 +1,83 @@ +.TH ImageMagick 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +ImageMagick \- is a free software suite for the creation, modification and display of bitmap images. +.SH SYNOPSIS +\fBconvert\fP \fIinput-file\fP [\fIoptions\fP] \fIoutput-file\fP +.SH OVERVIEW + +Use ImageMagick\[rg] to create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and B\\['e]zier curves. + +The functionality of ImageMagick is typically utilized from the command-line or you can use the features from programs written in your favorite language. Choose from these interfaces: G2F (Ada), MagickCore (C), MagickWand (C), ChMagick (Ch), ImageMagickObject (COM+), Magick++ (C++), JMagick (Java), JuliaIO (Julia), L-Magick (Lisp), Lua (LuaJIT), NMagick (Neko/haXe), Magick.NET (.NET), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP (PHP), IMagick (PHP), PythonMagick (Python), magick (R), RMagick (Ruby), or TclMagick (Tcl/TK). With a language interface, use ImageMagick to modify or create images dynamically and automagically. + +ImageMagick utilizes multiple computational threads to increase performance and can read, process, or write mega-, giga-, or tera-pixel image sizes. + +ImageMagick is free software delivered as a ready-to-run binary distribution or as source code that you may use, copy, modify, and distribute in both open and proprietary applications. It is distributed under a derived Apache 2.0 license. + +The ImageMagick development process ensures a stable API and ABI. Before each ImageMagick release, we perform a comprehensive security assessment that includes memory error, thread data race detection, and continuous fuzzing to help prevent security vulnerabilities. + +The current release is ImageMagick 6.9.10-11. It runs on Linux, Windows, Mac Os X, iOS, Android OS, and others. + +The authoritative ImageMagick version 6 web site is https://legacy.imagemagick.org. The authoritative source code repository is https://github.com/ImageMagick/ImageMagick6. We maintain a source code mirror at https://gitlab.com/ImageMagick/ImageMagick6. + +The design of ImageMagick is an evolutionary process, with the design and implementation efforts serving to influence and guide further progress in the other. With ImageMagick version 7 we aim to improve the design based on lessons learned from the version 6 implementation. + +In the paragraphs below, find a short description for each command-line tool.Cl +ick on the program name to get details on the program usage and a list of comman +d-line options that alters how the program performs. If you are just getting acq +uainted with ImageMagick, start at the top of the list, the convert program, and + work your way down. Also be sure to peruse Anthony Thyssen's tutorial on how to + use ImageMagick utilities to convert, compose, or edit images from the command- +line. +.TP +.B convert + +convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. +.TP +.B identify + +describes the format and characteristics of one or more image files. +.TP +.B mogrify + +resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. Mogrify overwrites the original image file, whereas, convert writes to a different image file. +.TP +.B composite + +overlaps one image over another. +.TP +.B montage + +create a composite image by combining several separate images. The images are tiled on the composite image optionally adorned with a border, frame, image name, and more. +.TP +.B compare + +mathematically and visually annotate the difference between an image and its reconstruction.. + +.TP +.B stream + +is a lightweight tool to stream one or more pixel components of the image or portion of the image to your choice of storage formats. It writes the pixel components as they are read from the input image a row at a time making stream desirable when working with large images or when you require raw pixel components. + +.TP +.B display + +displays an image or image sequence on any X server. +.TP +.B animate + +animates an image sequence on any X server. +.TP +.B import + +saves any visible window on an X server and outputs it as an image file. You can capture a single window, the entire screen, or any rectangular portion of the screen. +.TP +.B conjure + +interprets and executes scripts written in the Magick Scripting Language (MSL). +.PP +For more information about the ImageMagick, point your browser to file://@DOCUMENTATION_PATH@/index.html@EXTRA_DOC_DIR@ or http://imagemagick.org/. +.SH SEE ALSO +convert(1), compare(1), composite(1), conjure(1), identify(1), import(1), montage(1), display(1), animate(1), import(1), Magick++-config(1), MagickCore-config(1), MagickWand-config(1) + +.SH COPYRIGHT +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/Makefile.am b/ImageMagick-6.9.12-44/utilities/Makefile.am new file mode 100644 index 0000000..68ec2ab --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/Makefile.am @@ -0,0 +1,110 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# http://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building ImageMagick utilities. + +UTILITIES_PGMS = \ + utilities/animate \ + utilities/compare \ + utilities/composite \ + utilities/conjure \ + utilities/convert \ + utilities/display \ + utilities/identify \ + utilities/import \ + utilities/mogrify \ + utilities/montage \ + utilities/stream + +UTILITIES_XFAIL_TESTS = \ + $(UTILITIES_TTF_XFAIL_TESTS) \ + $(UTILITIES_XML_XFAIL_TESTS) + +utilities_animate_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_animate_LDFLAGS = $(LDFLAGS) +utilities_animate_SOURCES = utilities/animate.c + +utilities_compare_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_compare_LDFLAGS = $(LDFLAGS) +utilities_compare_SOURCES = utilities/compare.c + +utilities_composite_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_composite_LDFLAGS = $(LDFLAGS) +utilities_composite_SOURCES = utilities/composite.c + +utilities_conjure_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_conjure_LDFLAGS = $(LDFLAGS) +utilities_conjure_SOURCES = utilities/conjure.c + +utilities_convert_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_convert_LDFLAGS = $(LDFLAGS) +utilities_convert_SOURCES = utilities/convert.c + +utilities_display_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_display_LDFLAGS = $(LDFLAGS) +utilities_display_SOURCES = utilities/display.c + +utilities_identify_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_identify_LDFLAGS = $(LDFLAGS) +utilities_identify_SOURCES = utilities/identify.c + +utilities_import_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_import_LDFLAGS = $(LDFLAGS) +utilities_import_SOURCES = utilities/import.c + +utilities_mogrify_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_mogrify_LDFLAGS = $(LDFLAGS) +utilities_mogrify_SOURCES = utilities/mogrify.c + +utilities_montage_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_montage_LDFLAGS = $(LDFLAGS) +utilities_montage_SOURCES = utilities/montage.c + +utilities_stream_LDADD = $(MAGICKCORE_LIBS) $(MAGICKWAND_LIBS) +utilities_stream_LDFLAGS = $(LDFLAGS) +utilities_stream_SOURCES = utilities/stream.c + +UTILITIES_MANS = \ + utilities/ImageMagick.1 \ + utilities/animate.1 \ + utilities/compare.1 \ + utilities/composite.1 \ + utilities/conjure.1 \ + utilities/convert.1 \ + utilities/display.1 \ + utilities/identify.1 \ + utilities/import.1 \ + utilities/mogrify.1 \ + utilities/montage.1 \ + utilities/stream.1 + +UTILITIES_CONFIGURE = \ + utilities/ImageMagick.1.in \ + utilities/animate.1.in \ + utilities/compare.1.in \ + utilities/composite.1.in \ + utilities/conjure.1.in \ + utilities/convert.1.in \ + utilities/display.1.in \ + utilities/identify.1.in \ + utilities/import.1.in \ + utilities/mogrify.1.in \ + utilities/montage.1.in \ + utilities/stream.1.in + +UTILITIES_EXTRA_DIST = \ + $(UTILITIES_MANS) \ + $(UTILITIES_TESTS) + +UTILITIES_CLEANFILES = diff --git a/ImageMagick-6.9.12-44/utilities/animate.1 b/ImageMagick-6.9.12-44/utilities/animate.1 new file mode 100644 index 0000000..a7fdd85 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/animate.1 @@ -0,0 +1,101 @@ +.TH animate 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +animate \- animates an image or image sequence on any X server. +.SH SYNOPSIS +.TP +\fBanimate\fP [\fIoptions\fP] \fIinput-file\fP +.SH OVERVIEW +The \fBanimate\fP program is a member of the ImageMagick(1) suite of tools. Use it to animate an image or image sequence on any X server. + +For more information about the animate command, point your browser to file:///usr/share/doc/ImageMagick-6/www/animate.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/animate.php. +.SH DESCRIPTION +Image Settings: + \-alpha option on, activate, off, deactivate, set, opaque, copy + transparent, extract, background, or shape + \-authenticate value decrypt image with this password + \-backdrop display image centered on a backdrop + \-channel type apply option to select image channels + \-colormap type Shared or Private + \-colorspace type alternate image colorspace + \-decipher filename convert cipher pixels to plain pixels + \-define format:option + define one or more image format options + \-delay centiseconds display the next image after pausing + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-display server display image to this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-filter type use this filter when resizing an image + \-format "string" output formatted image characteristics + \-gamma value level of gamma correction + \-geometry geometry preferred size and location of the Image window + \-gravity type horizontal and vertical backdrop placement + \-identify identify the format and characteristics of the image + \-immutable displayed image cannot be modified + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-limit type value pixel cache resource limit + \-loop iterations loop images then exit + \-matte store matte channel if the image has one + \-map type display image using this Standard Colormap + \-monitor monitor progress + \-pause seconds to pause before reanimating + \-page geometry size and location of an image canvas (setting) + \-quantize colorspace reduce colors in this colorspace + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-remote command execute a command in an remote display process + \-repage geometry size and location of an image canvas (operator) + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scenes range image scene range + \-seed value seed a new sequence of pseudo-random numbers + \-set attribute value set an image attribute + \-size geometry width and height of image + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-transparent-color color + transparent color + \-treedepth value color tree depth + \-verbose print detailed information about the image + \-visual type display image using this visual type + \-virtual-pixel method + virtual pixel access method + \-window id display image to background of this window + +Image Operators: + \-colors value preferred number of colors in the image + \-crop geometry preferred size and location of the cropped image + \-extract geometry extract area from image + \-monochrome transform image to black and white + \-resample geometry change the resolution of an image + \-resize geometry resize the image + \-rotate degrees apply Paeth rotation to the image + \-strip strip image of all profiles and comments + \-thumbnail geometry create a thumbnail of the image + \-trim trim image edges + +Image Sequence Operators: + \-coalesce merge a sequence of images + \-flatten flatten a sequence of images + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +In addition to those listed above, you can specify these standard X resources as command line options: \-background, \-bordercolor, \-borderwidth, \-font, \-foreground, \-iconGeometry, \-iconic, \-name, \-mattecolor, \-shared-memory, or \-title. + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. + +Buttons: + 1 press to map or unmap the Command widget +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/animate.1.in b/ImageMagick-6.9.12-44/utilities/animate.1.in new file mode 100644 index 0000000..8c35acd --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/animate.1.in @@ -0,0 +1,101 @@ +.TH animate 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +animate \- animates an image or image sequence on any X server. +.SH SYNOPSIS +.TP +\fBanimate\fP [\fIoptions\fP] \fIinput-file\fP +.SH OVERVIEW +The \fBanimate\fP program is a member of the ImageMagick(1) suite of tools. Use it to animate an image or image sequence on any X server. + +For more information about the animate command, point your browser to file://@DOCUMENTATION_PATH@/www/animate.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/animate.php. +.SH DESCRIPTION +Image Settings: + \-alpha option on, activate, off, deactivate, set, opaque, copy + transparent, extract, background, or shape + \-authenticate value decrypt image with this password + \-backdrop display image centered on a backdrop + \-channel type apply option to select image channels + \-colormap type Shared or Private + \-colorspace type alternate image colorspace + \-decipher filename convert cipher pixels to plain pixels + \-define format:option + define one or more image format options + \-delay centiseconds display the next image after pausing + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-display server display image to this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-filter type use this filter when resizing an image + \-format "string" output formatted image characteristics + \-gamma value level of gamma correction + \-geometry geometry preferred size and location of the Image window + \-gravity type horizontal and vertical backdrop placement + \-identify identify the format and characteristics of the image + \-immutable displayed image cannot be modified + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-limit type value pixel cache resource limit + \-loop iterations loop images then exit + \-matte store matte channel if the image has one + \-map type display image using this Standard Colormap + \-monitor monitor progress + \-pause seconds to pause before reanimating + \-page geometry size and location of an image canvas (setting) + \-quantize colorspace reduce colors in this colorspace + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-remote command execute a command in an remote display process + \-repage geometry size and location of an image canvas (operator) + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scenes range image scene range + \-seed value seed a new sequence of pseudo-random numbers + \-set attribute value set an image attribute + \-size geometry width and height of image + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-transparent-color color + transparent color + \-treedepth value color tree depth + \-verbose print detailed information about the image + \-visual type display image using this visual type + \-virtual-pixel method + virtual pixel access method + \-window id display image to background of this window + +Image Operators: + \-colors value preferred number of colors in the image + \-crop geometry preferred size and location of the cropped image + \-extract geometry extract area from image + \-monochrome transform image to black and white + \-resample geometry change the resolution of an image + \-resize geometry resize the image + \-rotate degrees apply Paeth rotation to the image + \-strip strip image of all profiles and comments + \-thumbnail geometry create a thumbnail of the image + \-trim trim image edges + +Image Sequence Operators: + \-coalesce merge a sequence of images + \-flatten flatten a sequence of images + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +In addition to those listed above, you can specify these standard X resources as command line options: \-background, \-bordercolor, \-borderwidth, \-font, \-foreground, \-iconGeometry, \-iconic, \-name, \-mattecolor, \-shared-memory, or \-title. + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. + +Buttons: + 1 press to map or unmap the Command widget +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/animate.c b/ImageMagick-6.9.12-44/utilities/animate.c new file mode 100644 index 0000000..9a21b3a --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/animate.c @@ -0,0 +1,118 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% AAA N N IIIII M M AAA TTTTT EEEEE % +% A A NN N I MM MM A A T E % +% AAAAA N N N I M M M AAAAA T EEE % +% A A N NN I M M A A T E % +% A A N N IIIII M M A A T EEEEE % +% % +% % +% Interactively Animate an Image Sequence. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Animate displays a sequence of images in the MIFF format on any +% workstation display running an X server. Animate first determines the +% hardware capabilities of the workstation. If the number of unique +% colors in an image is less than or equal to the number the workstation +% can support, the image is displayed in an X window. Otherwise the +% number of colors in the image is first reduced to match the color +% resolution of the workstation before it is displayed. +% +% This means that a continuous-tone 24 bits-per-pixel image can display on a +% 8 bit pseudo-color device or monochrome device. In most instances the +% reduced color image closely resembles the original. Alternatively, a +% monochrome or pseudo-color image can display on a continuous-tone 24 +% bits-per-pixel device. +% +% +*/ + +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int AnimateMain(int argc,char **argv) +{ + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + status=MagickCommandGenesis(image_info,AnimateImageCommand,argc,argv, + (char **) NULL,exception); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + return(status != MagickFalse ? 0 : 1); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) +int main(int argc,char **argv) +{ + return(AnimateMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=AnimateMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/utilities/compare.1 b/ImageMagick-6.9.12-44/utilities/compare.1 new file mode 100644 index 0000000..f7b28c7 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/compare.1 @@ -0,0 +1,103 @@ +.TH compare 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +compare \- mathematically and visually annotate the difference between an image and its reconstruction. +.SH SYNOPSIS +.TP +\fBcompare\fP \fIinput-file\fP \fIinput-file\fP [\fIoptions\fP] \fIoutput-file\fP +.SH OVERVIEW +The \fBcompare\fP program is a member of the ImageMagick(1) suite of tools. Use it to mathematically and visually annotate the difference between an image and its reconstruction. + +For more information about the compare command, point your browser to file:///usr/share/doc/ImageMagick-6/www/compare.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/compare.php. +.SH DESCRIPTION +Image Settings: + \-alpha option on, activate, off, deactivate, set, opaque, copy + transparent, extract, background, or shape + \-authenticate value decrypt image with this password + \-background color background color + \-channel type apply option to select image channels + \-colorspace type alternate image colorspace + \-compose operator set image composite operator + \-compress type type of pixel compression when writing the image + \-decipher filename convert cipher pixels to plain pixels + \-define format:option + define one or more image format options + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-dissimilarity-threshold value + maximum distortion for (sub)image match + \-encipher filename convert plain pixels to cipher pixels + \-extract geometry extract area from image + \-format "string" output formatted image characteristics + \-fuzz distance colors within this distance are considered equal + \-gravity type horizontal and vertical text placement + \-identify identify the format and characteristics of the image + \-interlace type type of image interlacing scheme + \-highlight-color color + emphasize pixel differences with this color + \-limit type value pixel cache resource limit + \-lowlight-color color + de-emphasize pixel differences with this color + \-mask filename associate a mask with the image + \-metric type measure differences between images with this metric + \-monitor monitor progress + \-passphrase filename get the passphrase from this file + \-profile filename add, delete, or apply an image profile + \-quality value JPEG/MIFF/PNG compression level + \-quiet suppress all warning messages + \-quantize colorspace reduce colors in this colorspace + \-regard-warnings pay attention to warning messages + \-repage geometry size and location of an image canvas + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-seed value seed a new sequence of pseudo-random numbers + \-set attribute value set an image attribute + \-similarity-threshold value + minimum distortion for (sub)image match + \-size geometry width and height of image + \-subimage-search search for subimage + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-transparent-color color + transparent color + \-type type image type + \-verbose print detailed information about the image + \-virtual-pixel method + virtual pixel access method + +Image Operators: + \-brightness-contrast geometry + improve brightness / contrast of the image + \-distort method args + distort images according to given method and args + \-level value adjust the level of image contrast + \-resize geometry resize the image + \-rotate degrees apply Paeth rotation to the image + \-separate separate an image channel into a grayscale image + \-trim trim image edges + \-write filename write images to this file + +Image Sequence Operators: + \-crop geometry cut out a rectangular region of the image + +Image Stack Operators: + \-delete indexes delete the image from the image sequence + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. + +Two images are considered similar if their difference according to the specified metric and fuzz value is 0, with the exception of the normalized cross correlation metric (NCC), where two images are considered similar when their normalized cross correlation is 1. The default metric is NCC. + +The compare program returns 2 on error, 0 if the images are similar, or a value between 0 and 1 if they are not similar. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/compare.1.in b/ImageMagick-6.9.12-44/utilities/compare.1.in new file mode 100644 index 0000000..589a7b7 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/compare.1.in @@ -0,0 +1,103 @@ +.TH compare 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +compare \- mathematically and visually annotate the difference between an image and its reconstruction. +.SH SYNOPSIS +.TP +\fBcompare\fP \fIinput-file\fP \fIinput-file\fP [\fIoptions\fP] \fIoutput-file\fP +.SH OVERVIEW +The \fBcompare\fP program is a member of the ImageMagick(1) suite of tools. Use it to mathematically and visually annotate the difference between an image and its reconstruction. + +For more information about the compare command, point your browser to file://@DOCUMENTATION_PATH@/www/compare.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/compare.php. +.SH DESCRIPTION +Image Settings: + \-alpha option on, activate, off, deactivate, set, opaque, copy + transparent, extract, background, or shape + \-authenticate value decrypt image with this password + \-background color background color + \-channel type apply option to select image channels + \-colorspace type alternate image colorspace + \-compose operator set image composite operator + \-compress type type of pixel compression when writing the image + \-decipher filename convert cipher pixels to plain pixels + \-define format:option + define one or more image format options + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-dissimilarity-threshold value + maximum distortion for (sub)image match + \-encipher filename convert plain pixels to cipher pixels + \-extract geometry extract area from image + \-format "string" output formatted image characteristics + \-fuzz distance colors within this distance are considered equal + \-gravity type horizontal and vertical text placement + \-identify identify the format and characteristics of the image + \-interlace type type of image interlacing scheme + \-highlight-color color + emphasize pixel differences with this color + \-limit type value pixel cache resource limit + \-lowlight-color color + de-emphasize pixel differences with this color + \-mask filename associate a mask with the image + \-metric type measure differences between images with this metric + \-monitor monitor progress + \-passphrase filename get the passphrase from this file + \-profile filename add, delete, or apply an image profile + \-quality value JPEG/MIFF/PNG compression level + \-quiet suppress all warning messages + \-quantize colorspace reduce colors in this colorspace + \-regard-warnings pay attention to warning messages + \-repage geometry size and location of an image canvas + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-seed value seed a new sequence of pseudo-random numbers + \-set attribute value set an image attribute + \-similarity-threshold value + minimum distortion for (sub)image match + \-size geometry width and height of image + \-subimage-search search for subimage + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-transparent-color color + transparent color + \-type type image type + \-verbose print detailed information about the image + \-virtual-pixel method + virtual pixel access method + +Image Operators: + \-brightness-contrast geometry + improve brightness / contrast of the image + \-distort method args + distort images according to given method and args + \-level value adjust the level of image contrast + \-resize geometry resize the image + \-rotate degrees apply Paeth rotation to the image + \-separate separate an image channel into a grayscale image + \-trim trim image edges + \-write filename write images to this file + +Image Sequence Operators: + \-crop geometry cut out a rectangular region of the image + +Image Stack Operators: + \-delete indexes delete the image from the image sequence + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. + +Two images are considered similar if their difference according to the specified metric and fuzz value is 0, with the exception of the normalized cross correlation metric (NCC), where two images are considered similar when their normalized cross correlation is 1. The default metric is NCC. + +The compare program returns 2 on error, 0 if the images are similar, or a value between 0 and 1 if they are not similar. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/compare.c b/ImageMagick-6.9.12-44/utilities/compare.c new file mode 100644 index 0000000..c81d1fc --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/compare.c @@ -0,0 +1,124 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC OOO M M PPPP AAA RRRR EEEEE % +% C O O MM MM P P A A R R E % +% C O O M M M PPPP AAAAA RRRR EEE % +% C O O M M P A A R R E % +% CCCC OOO M M P A A R R EEEEE % +% % +% % +% Image Comparison Utility % +% % +% % +% Software Design % +% Cristy % +% December 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% The compare utility mathematically and visually annotates the difference +% between an image and its reconstruction. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int CompareMain(int argc,char **argv) +{ + char + *metadata; + + const char + *option; + + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + dissimilar, + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + metadata=(char *) NULL; + status=MagickCommandGenesis(image_info,CompareImageCommand,argc,argv, + &metadata,exception); + if (metadata != (char *) NULL) + metadata=DestroyString(metadata); + option=GetImageOption(image_info,"compare:dissimilar"); + dissimilar=IsMagickTrue(option); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + if (dissimilar != MagickFalse) + return(1); + return(status != MagickFalse ? 0 : 2); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) +int main(int argc,char **argv) +{ + return(CompareMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=CompareMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/utilities/composite.1 b/ImageMagick-6.9.12-44/utilities/composite.1 new file mode 100644 index 0000000..4b5179c --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/composite.1 @@ -0,0 +1,116 @@ +.TH composite 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +composite \- overlaps one image over another. +.SH SYNOPSIS +.TP +\fBcomposite\fP \fB[\fP \fIoptions\fP \fB... ]\fP \fIchange-file base-file\fP \fB[\fP \fImask-file\fP \fB]\fP \fIoutput-image\fP +.SH OVERVIEW +The \fBcomposite\fP program is a member of the ImageMagick(1) suite of tools. Use it to overlap one image over another. + +For more information about the composite command, point your browser to file:///usr/share/doc/ImageMagick-6/www/composite.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/composite.php. +.SH DESCRIPTION +Image Settings: + \-affine matrix affine transform matrix + \-alpha option on, activate, off, deactivate, set, opaque, copy + \ transparent, extract, background, or shape + \-authenticate value decrypt image with this password + \-blue-primary point chromaticity blue primary point + \-channel type apply option to select image channels + \-colorspace type alternate image colorspace + \-comment string annotate image with comment + \-compose operator composite operator + \-compress type type of pixel compression when writing the image + \-decipher filename convert cipher pixels to plain pixels + \-define format:option + define one or more image format options + \-depth value image depth + \-density geometry horizontal and vertical density of the image + \-display server get image or font from this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-encipher filename convert plain pixels to cipher pixels + \-encoding type text encoding type + \-endian type endianness (MSB or LSB) of the image + \-filter type use this filter when resizing an image + \-font name render text with this font + \-format "string" output formatted image characteristics + \-gravity type which direction to gravitate towards + \-green-primary point chromaticity green primary point + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-label string assign a label to an image + \-limit type value pixel cache resource limit + \-matte store matte channel if the image has one + \-monitor monitor progress + \-page geometry size and location of an image canvas (setting) + \-pointsize value font point size + \-quality value JPEG/MIFF/PNG compression level + \-quiet suppress all warning messages + \-red-primary point chromaticity red primary point + \-regard-warnings pay attention to warning messages + \-repage geometry size and location of an image canvas (operator) + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scene value image scene number + \-seed value seed a new sequence of pseudo-random numbers + \-size geometry width and height of image + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-transparent-color color + transparent color + \-treedepth value color tree depth + \-tile repeat composite operation across and down image + \-units type the units of image resolution + \-verbose print detailed information about the image + \-virtual-pixel method + virtual pixel access method + \-white-point point chromaticity white point + +Image Operators: + \-blend geometry blend images + \-border geometry surround image with a border of color + \-bordercolor color border color + \-colors value preferred number of colors in the image + \-displace geometry shift image pixels defined by a displacement map + \-dissolve value dissolve the two images a given percent + \-distort geometry shift lookup according to a absolute distortion map + \-extract geometry extract area from image + \-geometry geometry location of the composite image + \-identify identify the format and characteristics of the image + \-monochrome transform image to black and white + \-negate replace each pixel with its complementary color + \-profile filename add ICM or IPTC information profile to image + \-quantize colorspace reduce colors in this colorspace + \-rotate degrees apply Paeth rotation to the image + \-resize geometry resize the image + \-sharpen geometry sharpen the image + \-shave geometry shave pixels from the image edges + \-stegano offset hide watermark within an image + \-stereo combine two image to create a stereo anaglyph + \-strip strip image of all profiles and comments + \-thumbnail geometry create a thumbnail of the image + \-transform affine transform image + \-type type image type + \-unsharp geometry sharpen the image + \-watermark geometry percent brightness and saturation of a watermark + \-write filename write images to this file + +Image Stack Operators: + \-swap indexes swap two images in the image sequence + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/composite.1.in b/ImageMagick-6.9.12-44/utilities/composite.1.in new file mode 100644 index 0000000..e1133a2 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/composite.1.in @@ -0,0 +1,116 @@ +.TH composite 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +composite \- overlaps one image over another. +.SH SYNOPSIS +.TP +\fBcomposite\fP \fB[\fP \fIoptions\fP \fB... ]\fP \fIchange-file base-file\fP \fB[\fP \fImask-file\fP \fB]\fP \fIoutput-image\fP +.SH OVERVIEW +The \fBcomposite\fP program is a member of the ImageMagick(1) suite of tools. Use it to overlap one image over another. + +For more information about the composite command, point your browser to file://@DOCUMENTATION_PATH@/www/composite.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/composite.php. +.SH DESCRIPTION +Image Settings: + \-affine matrix affine transform matrix + \-alpha option on, activate, off, deactivate, set, opaque, copy + \ transparent, extract, background, or shape + \-authenticate value decrypt image with this password + \-blue-primary point chromaticity blue primary point + \-channel type apply option to select image channels + \-colorspace type alternate image colorspace + \-comment string annotate image with comment + \-compose operator composite operator + \-compress type type of pixel compression when writing the image + \-decipher filename convert cipher pixels to plain pixels + \-define format:option + define one or more image format options + \-depth value image depth + \-density geometry horizontal and vertical density of the image + \-display server get image or font from this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-encipher filename convert plain pixels to cipher pixels + \-encoding type text encoding type + \-endian type endianness (MSB or LSB) of the image + \-filter type use this filter when resizing an image + \-font name render text with this font + \-format "string" output formatted image characteristics + \-gravity type which direction to gravitate towards + \-green-primary point chromaticity green primary point + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-label string assign a label to an image + \-limit type value pixel cache resource limit + \-matte store matte channel if the image has one + \-monitor monitor progress + \-page geometry size and location of an image canvas (setting) + \-pointsize value font point size + \-quality value JPEG/MIFF/PNG compression level + \-quiet suppress all warning messages + \-red-primary point chromaticity red primary point + \-regard-warnings pay attention to warning messages + \-repage geometry size and location of an image canvas (operator) + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scene value image scene number + \-seed value seed a new sequence of pseudo-random numbers + \-size geometry width and height of image + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-transparent-color color + transparent color + \-treedepth value color tree depth + \-tile repeat composite operation across and down image + \-units type the units of image resolution + \-verbose print detailed information about the image + \-virtual-pixel method + virtual pixel access method + \-white-point point chromaticity white point + +Image Operators: + \-blend geometry blend images + \-border geometry surround image with a border of color + \-bordercolor color border color + \-colors value preferred number of colors in the image + \-displace geometry shift image pixels defined by a displacement map + \-dissolve value dissolve the two images a given percent + \-distort geometry shift lookup according to a absolute distortion map + \-extract geometry extract area from image + \-geometry geometry location of the composite image + \-identify identify the format and characteristics of the image + \-monochrome transform image to black and white + \-negate replace each pixel with its complementary color + \-profile filename add ICM or IPTC information profile to image + \-quantize colorspace reduce colors in this colorspace + \-rotate degrees apply Paeth rotation to the image + \-resize geometry resize the image + \-sharpen geometry sharpen the image + \-shave geometry shave pixels from the image edges + \-stegano offset hide watermark within an image + \-stereo combine two image to create a stereo anaglyph + \-strip strip image of all profiles and comments + \-thumbnail geometry create a thumbnail of the image + \-transform affine transform image + \-type type image type + \-unsharp geometry sharpen the image + \-watermark geometry percent brightness and saturation of a watermark + \-write filename write images to this file + +Image Stack Operators: + \-swap indexes swap two images in the image sequence + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html@EXTRA_DOC_DIR@ or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/composite.c b/ImageMagick-6.9.12-44/utilities/composite.c new file mode 100644 index 0000000..381f64e --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/composite.c @@ -0,0 +1,109 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC OOO M M PPPP OOO SSSSS IIIII TTTTT EEEEE % +% C O O MM MM P P O O SS I T E % +% C O O M.M M PPPP O O SSS I T EEE % +% C O O M M P O O SS I T E % +% CCCC OOO M M P OOO SSSSS IIIII T EEEEE % +% % +% % +% Digitally composite two images. % +% % +% Software Design % +% Cristy % +% January 1993 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Program Composite composites images to create new images. +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int CompositeMain(int argc,char **argv) +{ + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + status=MagickCommandGenesis(image_info,CompositeImageCommand,argc,argv, + (char **) NULL,exception); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + return(status != MagickFalse ? 0 : 1); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) +int main(int argc,char **argv) +{ + return(CompositeMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=CompositeMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/utilities/conjure.1 b/ImageMagick-6.9.12-44/utilities/conjure.1 new file mode 100644 index 0000000..119d4df --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/conjure.1 @@ -0,0 +1,34 @@ +.TH conjure 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +conjure \- interprets and executes scripts written in the Magick Scripting Language (MSL). +.SH SYNOPSIS +.TP +\fBconjure\fP [\fIoptions\fP] \fIscript.msl\fP +.SH OVERVIEW +The \fBconjure\fP program is a member of the ImageMagick(1) suite of tools. Use it to process a Magick Scripting Language (MSL) script. The Magick scripting language (MSL) will primarily benefit those that want to accomplish custom image processing tasks but do not wish to program, or those that do not have access to a Perl interpreter or a compiler. + +For more information about the conjure command, point your browser to file:///usr/share/doc/ImageMagick-6/www/conjure.html or http://imagemagick.org/script/conjure.php. +.SH DESCRIPTION +Image Settings: + \-monitor monitor progress + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-seed value seed a new sequence of pseudo-random numbers + \-verbose print detailed information about the image + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +In additiion, define any key value pairs required by your script. For example, + + conjure \-size 100x100 \-color blue \-foo bar script.msl +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/conjure.1.in b/ImageMagick-6.9.12-44/utilities/conjure.1.in new file mode 100644 index 0000000..8cd6258 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/conjure.1.in @@ -0,0 +1,34 @@ +.TH conjure 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +conjure \- interprets and executes scripts written in the Magick Scripting Language (MSL). +.SH SYNOPSIS +.TP +\fBconjure\fP [\fIoptions\fP] \fIscript.msl\fP +.SH OVERVIEW +The \fBconjure\fP program is a member of the ImageMagick(1) suite of tools. Use it to process a Magick Scripting Language (MSL) script. The Magick scripting language (MSL) will primarily benefit those that want to accomplish custom image processing tasks but do not wish to program, or those that do not have access to a Perl interpreter or a compiler. + +For more information about the conjure command, point your browser to file://@DOCUMENTATION_PATH@/www/conjure.html or http://imagemagick.org/script/conjure.php. +.SH DESCRIPTION +Image Settings: + \-monitor monitor progress + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-seed value seed a new sequence of pseudo-random numbers + \-verbose print detailed information about the image + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +In additiion, define any key value pairs required by your script. For example, + + conjure \-size 100x100 \-color blue \-foo bar script.msl +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/conjure.c b/ImageMagick-6.9.12-44/utilities/conjure.c new file mode 100644 index 0000000..d44b4ac --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/conjure.c @@ -0,0 +1,128 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC OOO N N JJJJJ U U RRRR EEEEE % +% C O O NN N J U U R R E % +% C O O N N N J U U RRRR EEE % +% C O O N NN J J U U R R E % +% CCCC OOO N N JJJ UUU R R EEEEE % +% % +% % +% Interpret Magick Scripting Language. % +% % +% Software Design % +% Cristy % +% December 2001 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Conjure interprets and executes scripts in the Magick Scripting Language +% (MSL). The Magick scripting language (MSL) will primarily benefit those +% that want to accomplish custom image processing tasks but do not wish +% to program, or those that do not have access to a Perl interpreter or a +% compiler. The interpreter is called conjure and here is an example script: +% +% +% +% +% +% +% +% +% +% +% +% +*/ + +/* + Include declarations. +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int ConjureMain(int argc,char **argv) +{ + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + status=MagickCommandGenesis(image_info,ConjureImageCommand,argc,argv, + (char **) NULL,exception); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + return(status != MagickFalse ? 0 : 1); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) +int main(int argc,char **argv) +{ + return(ConjureMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=ConjureMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/utilities/convert.1 b/ImageMagick-6.9.12-44/utilities/convert.1 new file mode 100644 index 0000000..85590c4 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/convert.1 @@ -0,0 +1,323 @@ +.TH convert 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +convert \- convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. +.SH SYNOPSIS +.TP +\fBconvert\fP [\fIinput-option\fP] \fIinput-file\fP [\fIoutput-option\fP] \fIoutput-file\fP +.SH OVERVIEW +The \fBconvert\fP program is a member of the ImageMagick(1) suite of tools. Use it to convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. + +For more information about the convert command, point your browser to file:///usr/share/doc/ImageMagick-6/www/convert.html or http://imagemagick.org/script/convert.php. +.SH DESCRIPTION +Image Settings: + \-adjoin join images into a single multi-image file + \-affine matrix affine transform matrix + \-alpha option activate, deactivate, reset, or set the alpha channel + \-antialias remove pixel-aliasing + \-authenticate value decrypt image with this password + \-attenuate value lessen (or intensify) when adding noise to an image + \-background color background color + \-bias value add bias when convolving an image + \-black-point-compensation + use black point compensation + \-blue-primary point chromaticity blue primary point + \-bordercolor color border color + \-caption string assign a caption to an image + \-cdl filename color correct with a color decision list + \-channel type apply option to select image channels + \-clip clip along the first path from the 8BIM profile + \-clip-mask filename associate a clip mask with the image + \-clip-path id clip along a named path from the 8BIM profile + \-colors value preferred number of colors in the image + \-colorspace type alternate image colorspace + \-comment string annotate image with comment + \-compose operator set image composite operator + \-compress type type of pixel compression when writing the image + \-decipher filename convert cipher pixels to plain pixels + \-define format:option + define one or more image format options + \-delay centiseconds display the next image after pausing + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-direction type render text right-to-left or left-to-right + \-display server get image or font from this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-encipher filename convert plain pixels to cipher pixels + \-encoding type text encoding type + \-endian type endianness (MSB or LSB) of the image + \-family name render text with this font family + \-features distance analyze image features (e.g. contrast, correlation) + \-fill color color to use when filling a graphic primitive + \-filter type use this filter when resizing an image + \-flatten flatten a sequence of images + \-font name render text with this font + \-format "string" output formatted image characteristics + \-fuzz distance colors within this distance are considered equal + \-gravity type horizontal and vertical text placement + \-green-primary point chromaticity green primary point + \-intensity method method to generate intensity value from pixel + \-intent type type of rendering intent when managing the image color + \-interlace type type of image interlacing scheme + \-interline-spacing value + \ set the space between two text lines + \-interpolate method pixel color interpolation method + \-interword-spacing value + \ set the space between two words + \-kerning value set the space between two letters + \-label string assign a label to an image + \-limit type value pixel cache resource limit + \-loop iterations add Netscape loop extension to your GIF animation + \-mask filename associate a mask with the image + \-matte store matte channel if the image has one + \-mattecolor color frame color + \-metric type measure differences between images with this metric + \-moments report image moments + \-monitor monitor progress + \-orient type image orientation + \-page geometry size and location of an image canvas (setting) + \-ping efficiently determine image attributes + \-pointsize value font point size + \-precision value maximum number of significant digits to print + \-preview type image preview type + \-quality value JPEG/MIFF/PNG compression level + \-quiet suppress all warning messages + \-red-primary point chromaticity red primary point + \-regard-warnings pay attention to warning messages + \-remap filename transform image colors to match this set of colors + \-repage geometry size and location of an image canvas + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scene value image scene number + \-seed value seed a new sequence of pseudo-random numbers + \-size geometry width and height of image + \-statistic type geometry + replace each pixel with corresponding statistic from the neighborhood + \-stretch type render text with this font stretch + \-stroke color graphic primitive stroke color + \-strokewidth value graphic primitive stroke width + \-style type render text with this font style + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-texture filename name of texture to tile onto the image background + \-tile-offset geometry + tile offset + \-treedepth value color tree depth + \-transparent-color color + transparent color + \-undercolor color annotation bounding box color + \-units type the units of image resolution + \-verbose print detailed information about the image + \-view FlashPix viewing transforms + \-virtual-pixel method + virtual pixel access method + \-weight type render text with this font weight + \-white-point point chromaticity white point + +Image Operators: + \-adaptive-blur geometry + adaptively blur pixels; decrease effect near edges + \-adaptive-resize geometry + adaptively resize image with data dependent triangulation + \-adaptive-sharpen geometry + adaptively sharpen pixels; increase effect near edges + \-annotate geometry text + annotate the image with text + \-auto-gamma automagically adjust gamma level of image + \-auto-level automagically adjust color levels of image + \-auto-orient automatically orient image + \-bench iterations measure performance + \-black-threshold value + force all pixels below the threshold into black + \-blue-shift factor simulate a scene at nighttime in the moonlight + \-blur geometry reduce image noise and reduce detail levels + \-border geometry surround image with a border of color + \-brightness-contrast geometry + improve brightness / contrast of the image + \-canny geometry detect edges in the image + \-charcoal radius simulate a charcoal drawing + \-chop geometry remove pixels from the image interior + \-clamp keep pixel values in range (0-QuantumRange) + \-clip clip along the first path from the 8BIM profile + \-clip-mask filename associate a clip mask with the image + \-clip-path id clip along a named path from the 8BIM profile + \-colorize value colorize the image with the fill color + \-color-matrix matrix apply color correction to the image + \-connected-component connectivity + connected-components uniquely labeled + \-contrast enhance or reduce the image contrast + \-contrast-stretch geometry + improve contrast by `stretching' the intensity range + \-convolve coefficients + apply a convolution kernel to the image + \-cycle amount cycle the image colormap + \-deskew threshold straighten an image + \-despeckle reduce the speckles within an image + \-distort method args + distort images according to given method and args + \-draw string annotate the image with a graphic primitive + \-edge radius apply a filter to detect edges in the image + \-emboss radius emboss an image + \-enhance apply a digital filter to enhance a noisy image + \-equalize perform histogram equalization to an image + \-evaluate operator value + evaluate an arithmetic, relational, or logical expression + \-extent geometry set the image size + \-extract geometry extract area from image + \-fft implements the discrete Fourier transform (DFT) + \-flip flip image vertically + \-floodfill geometry color + floodfill the image with color + \-flop flop image horizontally + \-frame geometry surround image with an ornamental border + \-function name apply a function to the image + \-gamma value level of gamma correction + \-gaussian-blur geometry + reduce image noise and reduce detail levels + \-geometry geometry preferred size or location of the image + \-grayscale method convert image to grayscale + \-hough-lines geometry + identify lines in the image + \-identify identify the format and characteristics of the image + \-ift implements the inverse discrete Fourier transform (DFT) + \-implode amount implode image pixels about the center + \-interpolative-resize geometry + resize image using 'point sampled' interpolation + \-lat geometry local adaptive thresholding + \-layers method optimize or compare image layers + \-level value adjust the level of image contrast + \-level-colors color,color + level image with the given colors + \-linear-stretch geometry + improve contrast by `stretching with saturation' the intensity range + \-liquid-rescale geometry + rescale image with seam-carving + \-magnify double the size of the image with pixel art scaling + \-mean-shift geometry delineate arbitrarily shaped clusters in the image + \-median geometry apply a median filter to the image + \-mode geometry make each pixel the 'predominant color' of the neighborhood + \-modulate value vary the brightness, saturation, and hue + \-monochrome transform image to black and white + \-morphology method kernel + apply a morphology method to the image + \-motion-blur geometry + simulate motion blur + \-negate replace each pixel with its complementary color + \-noise geometry add or reduce noise in an image + \-normalize transform image to span the full range of colors + \-opaque color change this color to the fill color + \-ordered-dither NxN + add a noise pattern to the image with specific amplitudes + \-paint radius simulate an oil painting + \-perceptible epsilon + pixel value less than |epsilon| become epsilon or -epsilon + \-polaroid angle simulate a Polaroid picture + \-posterize levels reduce the image to a limited number of color levels + \-print string interpret string and print to console + \-profile filename add, delete, or apply an image profile + \-quantize colorspace reduce colors in this colorspace + \-radial-blur angle radial blur the image + \-raise value lighten/darken image edges to create a 3-D effect + \-random-threshold low,high + random threshold the image + \-region geometry apply options to a portion of the image + \-render render vector graphics + \-resample geometry change the resolution of an image + \-resize geometry resize the image + \-roll geometry roll an image vertically or horizontally + \-rotate degrees apply Paeth rotation to the image + \-sample geometry scale image with pixel sampling + \-scale geometry scale the image + \-segment values segment an image + \-selective-blur geometry + selectively blur pixels within a contrast threshold + \-sepia-tone threshold + simulate a sepia-toned photo + \-set property value set an image property + \-shade degrees shade the image using a distant light source + \-shadow geometry simulate an image shadow + \-sharpen geometry sharpen the image + \-shave geometry shave pixels from the image edges + \-shear geometry slide one edge of the image along the X or Y axis + \-sigmoidal-contrast geometry + lightness rescaling using sigmoidal contrast enhancement + \-sketch geometry simulate a pencil sketch + \-solarize threshold negate all pixels above the threshold level + \-sparse-color method args + fill in a image based on a few color points + \-splice geometry splice the background color into the image + \-spread amount displace image pixels by a random amount + \-strip strip image of all profiles and comments + \-swirl degrees swirl image pixels about the center + \-threshold value threshold the image + \-thumbnail geometry create a thumbnail of the image + \-tile filename tile image when filling a graphic primitive + \-tint value tint the image with the fill color + \-transform affine transform image + \-transparent color make this color transparent within the image + \-transpose flip image vertically and rotate 90 degrees + \-transverse flop image horizontally and rotate 270 degrees + \-trim trim image edges + \-type type image type + \-unique-colors discard all but one of any pixel color + \-unsharp geometry sharpen the image + \-vignette geometry soften the edges of the image in vignette style + \-wave geometry alter an image along a sine wave + \-wavelet-denoise threshold + removes noise from the image using a wavelet transform + \-white-threshold value + force all pixels above the threshold into white + +Image Sequence Operators: + \-append append an image sequence top to bottom (use +append for left to right) + \-clut apply a color lookup table to the image + \-coalesce merge a sequence of images + \-combine combine a sequence of images + \-compare mathematically and visually annotate the difference between an image and its reconstruction + \-complex operator perform complex mathematics on an image sequence + \-composite composite image + \-copy geometry offset, + copy pixels from one area of an image to another + \-crop geometry cut out a rectangular region of the image + \-deconstruct break down an image sequence into constituent parts + \-evaluate-sequence operator + evaluate an arithmetic, relational, or logical expression + \-flatten flatten a sequence of images + \-fx expression apply mathematical expression to an image channel(s) + \-hald-clut apply a Hald color lookup table to the image + \-morph value morph an image sequence + \-mosaic create a mosaic from an image sequence + \-poly terms build a polynomial from the image sequence and the corresponding terms (coefficients and degree pairs) + \-process arguments process the image with a custom image filter + \-separate separate an image channel into a grayscale image + \-smush geometry smush an image sequence together + \-write filename write images to this file + +Image Stack Operators: + \-clone indexes clone an image + \-delete indexes delete the image from the image sequence + \-duplicate count,indexes + duplicate an image one or more times + \-insert index insert last image into the image sequence + \-reverse reverse image sequence + \-swap indexes swap two images in the image sequence + +Miscellaneous Options: + \-debug events display copious debugging information + \-distribute-cache port + distributed pixel cache spanning one or more servers + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +Use any setting or operator as an \fIoutput-option\fP. Only a limited number of setting are \fIinput-option\fP. They include: \-antialias, \-caption, \-density, \-define, \-encoding, \-font, \-pointsize, \-size, and \-texture as well as any of the miscellaneous options. + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/convert.1.in b/ImageMagick-6.9.12-44/utilities/convert.1.in new file mode 100644 index 0000000..9884fbb --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/convert.1.in @@ -0,0 +1,323 @@ +.TH convert 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +convert \- convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. +.SH SYNOPSIS +.TP +\fBconvert\fP [\fIinput-option\fP] \fIinput-file\fP [\fIoutput-option\fP] \fIoutput-file\fP +.SH OVERVIEW +The \fBconvert\fP program is a member of the ImageMagick(1) suite of tools. Use it to convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. + +For more information about the convert command, point your browser to file://@DOCUMENTATION_PATH@/www/convert.html or http://imagemagick.org/script/convert.php. +.SH DESCRIPTION +Image Settings: + \-adjoin join images into a single multi-image file + \-affine matrix affine transform matrix + \-alpha option activate, deactivate, reset, or set the alpha channel + \-antialias remove pixel-aliasing + \-authenticate value decrypt image with this password + \-attenuate value lessen (or intensify) when adding noise to an image + \-background color background color + \-bias value add bias when convolving an image + \-black-point-compensation + use black point compensation + \-blue-primary point chromaticity blue primary point + \-bordercolor color border color + \-caption string assign a caption to an image + \-cdl filename color correct with a color decision list + \-channel type apply option to select image channels + \-clip clip along the first path from the 8BIM profile + \-clip-mask filename associate a clip mask with the image + \-clip-path id clip along a named path from the 8BIM profile + \-colors value preferred number of colors in the image + \-colorspace type alternate image colorspace + \-comment string annotate image with comment + \-compose operator set image composite operator + \-compress type type of pixel compression when writing the image + \-decipher filename convert cipher pixels to plain pixels + \-define format:option + define one or more image format options + \-delay centiseconds display the next image after pausing + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-direction type render text right-to-left or left-to-right + \-display server get image or font from this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-encipher filename convert plain pixels to cipher pixels + \-encoding type text encoding type + \-endian type endianness (MSB or LSB) of the image + \-family name render text with this font family + \-features distance analyze image features (e.g. contrast, correlation) + \-fill color color to use when filling a graphic primitive + \-filter type use this filter when resizing an image + \-flatten flatten a sequence of images + \-font name render text with this font + \-format "string" output formatted image characteristics + \-fuzz distance colors within this distance are considered equal + \-gravity type horizontal and vertical text placement + \-green-primary point chromaticity green primary point + \-intensity method method to generate intensity value from pixel + \-intent type type of rendering intent when managing the image color + \-interlace type type of image interlacing scheme + \-interline-spacing value + \ set the space between two text lines + \-interpolate method pixel color interpolation method + \-interword-spacing value + \ set the space between two words + \-kerning value set the space between two letters + \-label string assign a label to an image + \-limit type value pixel cache resource limit + \-loop iterations add Netscape loop extension to your GIF animation + \-mask filename associate a mask with the image + \-matte store matte channel if the image has one + \-mattecolor color frame color + \-metric type measure differences between images with this metric + \-moments report image moments + \-monitor monitor progress + \-orient type image orientation + \-page geometry size and location of an image canvas (setting) + \-ping efficiently determine image attributes + \-pointsize value font point size + \-precision value maximum number of significant digits to print + \-preview type image preview type + \-quality value JPEG/MIFF/PNG compression level + \-quiet suppress all warning messages + \-red-primary point chromaticity red primary point + \-regard-warnings pay attention to warning messages + \-remap filename transform image colors to match this set of colors + \-repage geometry size and location of an image canvas + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scene value image scene number + \-seed value seed a new sequence of pseudo-random numbers + \-size geometry width and height of image + \-statistic type geometry + replace each pixel with corresponding statistic from the neighborhood + \-stretch type render text with this font stretch + \-stroke color graphic primitive stroke color + \-strokewidth value graphic primitive stroke width + \-style type render text with this font style + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-texture filename name of texture to tile onto the image background + \-tile-offset geometry + tile offset + \-treedepth value color tree depth + \-transparent-color color + transparent color + \-undercolor color annotation bounding box color + \-units type the units of image resolution + \-verbose print detailed information about the image + \-view FlashPix viewing transforms + \-virtual-pixel method + virtual pixel access method + \-weight type render text with this font weight + \-white-point point chromaticity white point + +Image Operators: + \-adaptive-blur geometry + adaptively blur pixels; decrease effect near edges + \-adaptive-resize geometry + adaptively resize image with data dependent triangulation + \-adaptive-sharpen geometry + adaptively sharpen pixels; increase effect near edges + \-annotate geometry text + annotate the image with text + \-auto-gamma automagically adjust gamma level of image + \-auto-level automagically adjust color levels of image + \-auto-orient automatically orient image + \-bench iterations measure performance + \-black-threshold value + force all pixels below the threshold into black + \-blue-shift factor simulate a scene at nighttime in the moonlight + \-blur geometry reduce image noise and reduce detail levels + \-border geometry surround image with a border of color + \-brightness-contrast geometry + improve brightness / contrast of the image + \-canny geometry detect edges in the image + \-charcoal radius simulate a charcoal drawing + \-chop geometry remove pixels from the image interior + \-clamp keep pixel values in range (0-QuantumRange) + \-clip clip along the first path from the 8BIM profile + \-clip-mask filename associate a clip mask with the image + \-clip-path id clip along a named path from the 8BIM profile + \-colorize value colorize the image with the fill color + \-color-matrix matrix apply color correction to the image + \-connected-component connectivity + connected-components uniquely labeled + \-contrast enhance or reduce the image contrast + \-contrast-stretch geometry + improve contrast by `stretching' the intensity range + \-convolve coefficients + apply a convolution kernel to the image + \-cycle amount cycle the image colormap + \-deskew threshold straighten an image + \-despeckle reduce the speckles within an image + \-distort method args + distort images according to given method and args + \-draw string annotate the image with a graphic primitive + \-edge radius apply a filter to detect edges in the image + \-emboss radius emboss an image + \-enhance apply a digital filter to enhance a noisy image + \-equalize perform histogram equalization to an image + \-evaluate operator value + evaluate an arithmetic, relational, or logical expression + \-extent geometry set the image size + \-extract geometry extract area from image + \-fft implements the discrete Fourier transform (DFT) + \-flip flip image vertically + \-floodfill geometry color + floodfill the image with color + \-flop flop image horizontally + \-frame geometry surround image with an ornamental border + \-function name apply a function to the image + \-gamma value level of gamma correction + \-gaussian-blur geometry + reduce image noise and reduce detail levels + \-geometry geometry preferred size or location of the image + \-grayscale method convert image to grayscale + \-hough-lines geometry + identify lines in the image + \-identify identify the format and characteristics of the image + \-ift implements the inverse discrete Fourier transform (DFT) + \-implode amount implode image pixels about the center + \-interpolative-resize geometry + resize image using 'point sampled' interpolation + \-lat geometry local adaptive thresholding + \-layers method optimize or compare image layers + \-level value adjust the level of image contrast + \-level-colors color,color + level image with the given colors + \-linear-stretch geometry + improve contrast by `stretching with saturation' the intensity range + \-liquid-rescale geometry + rescale image with seam-carving + \-magnify double the size of the image with pixel art scaling + \-mean-shift geometry delineate arbitrarily shaped clusters in the image + \-median geometry apply a median filter to the image + \-mode geometry make each pixel the 'predominant color' of the neighborhood + \-modulate value vary the brightness, saturation, and hue + \-monochrome transform image to black and white + \-morphology method kernel + apply a morphology method to the image + \-motion-blur geometry + simulate motion blur + \-negate replace each pixel with its complementary color + \-noise geometry add or reduce noise in an image + \-normalize transform image to span the full range of colors + \-opaque color change this color to the fill color + \-ordered-dither NxN + add a noise pattern to the image with specific amplitudes + \-paint radius simulate an oil painting + \-perceptible epsilon + pixel value less than |epsilon| become epsilon or -epsilon + \-polaroid angle simulate a Polaroid picture + \-posterize levels reduce the image to a limited number of color levels + \-print string interpret string and print to console + \-profile filename add, delete, or apply an image profile + \-quantize colorspace reduce colors in this colorspace + \-radial-blur angle radial blur the image + \-raise value lighten/darken image edges to create a 3-D effect + \-random-threshold low,high + random threshold the image + \-region geometry apply options to a portion of the image + \-render render vector graphics + \-resample geometry change the resolution of an image + \-resize geometry resize the image + \-roll geometry roll an image vertically or horizontally + \-rotate degrees apply Paeth rotation to the image + \-sample geometry scale image with pixel sampling + \-scale geometry scale the image + \-segment values segment an image + \-selective-blur geometry + selectively blur pixels within a contrast threshold + \-sepia-tone threshold + simulate a sepia-toned photo + \-set property value set an image property + \-shade degrees shade the image using a distant light source + \-shadow geometry simulate an image shadow + \-sharpen geometry sharpen the image + \-shave geometry shave pixels from the image edges + \-shear geometry slide one edge of the image along the X or Y axis + \-sigmoidal-contrast geometry + lightness rescaling using sigmoidal contrast enhancement + \-sketch geometry simulate a pencil sketch + \-solarize threshold negate all pixels above the threshold level + \-sparse-color method args + fill in a image based on a few color points + \-splice geometry splice the background color into the image + \-spread amount displace image pixels by a random amount + \-strip strip image of all profiles and comments + \-swirl degrees swirl image pixels about the center + \-threshold value threshold the image + \-thumbnail geometry create a thumbnail of the image + \-tile filename tile image when filling a graphic primitive + \-tint value tint the image with the fill color + \-transform affine transform image + \-transparent color make this color transparent within the image + \-transpose flip image vertically and rotate 90 degrees + \-transverse flop image horizontally and rotate 270 degrees + \-trim trim image edges + \-type type image type + \-unique-colors discard all but one of any pixel color + \-unsharp geometry sharpen the image + \-vignette geometry soften the edges of the image in vignette style + \-wave geometry alter an image along a sine wave + \-wavelet-denoise threshold + removes noise from the image using a wavelet transform + \-white-threshold value + force all pixels above the threshold into white + +Image Sequence Operators: + \-append append an image sequence top to bottom (use +append for left to right) + \-clut apply a color lookup table to the image + \-coalesce merge a sequence of images + \-combine combine a sequence of images + \-compare mathematically and visually annotate the difference between an image and its reconstruction + \-complex operator perform complex mathematics on an image sequence + \-composite composite image + \-copy geometry offset, + copy pixels from one area of an image to another + \-crop geometry cut out a rectangular region of the image + \-deconstruct break down an image sequence into constituent parts + \-evaluate-sequence operator + evaluate an arithmetic, relational, or logical expression + \-flatten flatten a sequence of images + \-fx expression apply mathematical expression to an image channel(s) + \-hald-clut apply a Hald color lookup table to the image + \-morph value morph an image sequence + \-mosaic create a mosaic from an image sequence + \-poly terms build a polynomial from the image sequence and the corresponding terms (coefficients and degree pairs) + \-process arguments process the image with a custom image filter + \-separate separate an image channel into a grayscale image + \-smush geometry smush an image sequence together + \-write filename write images to this file + +Image Stack Operators: + \-clone indexes clone an image + \-delete indexes delete the image from the image sequence + \-duplicate count,indexes + duplicate an image one or more times + \-insert index insert last image into the image sequence + \-reverse reverse image sequence + \-swap indexes swap two images in the image sequence + +Miscellaneous Options: + \-debug events display copious debugging information + \-distribute-cache port + distributed pixel cache spanning one or more servers + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +Use any setting or operator as an \fIoutput-option\fP. Only a limited number of setting are \fIinput-option\fP. They include: \-antialias, \-caption, \-density, \-define, \-encoding, \-font, \-pointsize, \-size, and \-texture as well as any of the miscellaneous options. + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/convert.c b/ImageMagick-6.9.12-44/utilities/convert.c new file mode 100644 index 0000000..5366619 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/convert.c @@ -0,0 +1,115 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC OOO N N V V EEEEE RRRR TTTTT % +% C O O NN N V V E R R T % +% C O O N N N V V EEE RRRR T % +% C O O N NN V V E R R T % +% CCCC OOO N N V EEEEE R R T % +% % +% % +% Convert an image from one format to another. % +% % +% Software Design % +% Cristy % +% April 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Convert converts an input file using one image format to an output file +% with a differing image format. By default, the image format is determined +% by its magic number. To specify a particular image format, precede the +% filename with an image format name and a colon (i.e. ps:image) or specify +% the image type as the filename suffix (i.e. image.ps). Specify file as - +% for standard input or output. If file has the extension .Z, the file is +% decoded with uncompress. +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int ConvertMain(int argc,char **argv) +{ + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + status=MagickCommandGenesis(image_info,ConvertImageCommand,argc,argv, + (char **) NULL,exception); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + return(status != MagickFalse ? 0 : 1); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) +int main(int argc,char **argv) +{ + return(ConvertMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=ConvertMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/utilities/display.1 b/ImageMagick-6.9.12-44/utilities/display.1 new file mode 100644 index 0000000..a062a6e --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/display.1 @@ -0,0 +1,139 @@ +.TH display 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +display \- displays an image or image sequence on any X server. +.SH SYNOPSIS +.TP +\fBdisplay\fP [\fIoptions\fP] \fIinput-file\fP +.SH OVERVIEW +The \fBdisplay\fP program is a member of the ImageMagick(1) suite of tools. Use it to display an image or image sequence on any X server. + +For more information about the display command, point your browser to file:///usr/share/doc/ImageMagick-6/www/display.html or http://imagemagick.org/script/display.php. +.SH DESCRIPTION +Image Settings: + \-alpha option on, activate, off, deactivate, set, opaque, copy + \ transparent, extract, background, or shape + \-antialias remove pixel-aliasing + \-authenticate value decrypt image with this password + \-backdrop display image centered on a backdrop + \-channel type apply option to select image channels + \-colormap type Shared or Private + \-colorspace type alternate image colorspace + \-comment string annotate image with comment + \-compress type type of pixel compression when writing the image + \-decipher filename convert cipher pixels to plain pixels + \-deskew threshold straighten an image + \-define format:option + define one or more image format options + \-delay centiseconds display the next image after pausing + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-display server display image to this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-endian type endianness (MSB or LSB) of the image + \-equalize perform histogram equalization to an image + \-filter type use this filter when resizing an image + \-format "string" output formatted image characteristics + \-fuzz distance colors within this distance are considered equal + \-geometry geometry preferred size and location of the Image window + \-gravity type horizontal and vertical backdrop placement + \-identify identify the format and characteristics of the image + \-immutable displayed image cannot be modified + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-label string assign a label to an image + \-limit type value pixel cache resource limit + \-loop iterations loop images then exit + \-map type display image using this Standard Colormap + \-matte store matte channel if the image has one + \-monitor monitor progress + \-page geometry size and location of an image canvas + \-profile filename add, delete, or apply an image profile + \-quality value JPEG/MIFF/PNG compression level + \-quantize colorspace reduce colors in this colorspace + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-remote command execute a command in an remote display process + \-repage geometry size and location of an image canvas (operator) + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scenes range image scene range + \-seed value seed a new sequence of pseudo-random numbers + \-set property value set an image property + \-size geometry width and height of image + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-texture filename name of texture to tile onto the image background + \-transparent-color color + transparent color + \-treedepth value color tree depth + \-update seconds detect when image file is modified and redisplay + \-verbose print detailed information about the image + \-visual type display image using this visual type + \-virtual-pixel method + virtual pixel access method + \-window id display image to background of this window + \-window-group id exit program when this window id is destroyed + \-write filename write image to a file + +Image Operators: + \-auto-orient automatically orient image + \-border geometry surround image with a border of color + \-clip clip along the first path from the 8BIM profile + \-clip-path id clip along a named path from the 8BIM profile + \-colors value preferred number of colors in the image + \-contrast enhance or reduce the image contrast + \-crop geometry preferred size and location of the cropped image + \-despeckle reduce the speckles within an image + \-edge factor apply a filter to detect edges in the image + \-enhance apply a digital filter to enhance a noisy image + \-extract geometry extract area from image + \-flip flip image in the vertical direction + \-flop flop image in the horizontal direction + \-frame geometry surround image with an ornamental border + \-gamma value level of gamma correction + \-monochrome transform image to black and white + \-negate replace each pixel with its complementary color + \-normalize transform image to span the full range of colors + \-raise value lighten/darken image edges to create a 3-D effect + \-resample geometry change the resolution of an image + \-resize geometry resize the image + \-roll geometry roll an image vertically or horizontally + \-rotate degrees apply Paeth rotation to the image + \-sample geometry scale image with pixel sampling + \-segment value segment an image + \-sharpen geometry sharpen the image + \-strip strip image of all profiles and comments + \-threshold value threshold the image + \-thumbnail geometry create a thumbnail of the image + \-trim trim image edges + +Image Sequence Operators: + \-coalesce merge a sequence of images + \-flatten flatten a sequence of images + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +In addition to those listed above, you can specify these standard X resources as command line options: \-background, \-bordercolor, \-borderwidth, \-font, \-foreground, \-iconGeometry, \-iconic, \-mattecolor, \-name, \-shared-memory, \-usePixmap, or \-title. + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. + +Buttons: + 1 press to map or unmap the Command widget + 2 press and drag to magnify a region of an image + 3 press to load an image from a visual image directory +.SH NOTE +The display program defaults to the X screen resolution. To display vector formats at their intended size, override the default resolution: + + display -density 72 drawing.svg +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/display.1.in b/ImageMagick-6.9.12-44/utilities/display.1.in new file mode 100644 index 0000000..ceed112 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/display.1.in @@ -0,0 +1,139 @@ +.TH display 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +display \- displays an image or image sequence on any X server. +.SH SYNOPSIS +.TP +\fBdisplay\fP [\fIoptions\fP] \fIinput-file\fP +.SH OVERVIEW +The \fBdisplay\fP program is a member of the ImageMagick(1) suite of tools. Use it to display an image or image sequence on any X server. + +For more information about the display command, point your browser to file://@DOCUMENTATION_PATH@/www/display.html or http://imagemagick.org/script/display.php. +.SH DESCRIPTION +Image Settings: + \-alpha option on, activate, off, deactivate, set, opaque, copy + \ transparent, extract, background, or shape + \-antialias remove pixel-aliasing + \-authenticate value decrypt image with this password + \-backdrop display image centered on a backdrop + \-channel type apply option to select image channels + \-colormap type Shared or Private + \-colorspace type alternate image colorspace + \-comment string annotate image with comment + \-compress type type of pixel compression when writing the image + \-decipher filename convert cipher pixels to plain pixels + \-deskew threshold straighten an image + \-define format:option + define one or more image format options + \-delay centiseconds display the next image after pausing + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-display server display image to this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-endian type endianness (MSB or LSB) of the image + \-equalize perform histogram equalization to an image + \-filter type use this filter when resizing an image + \-format "string" output formatted image characteristics + \-fuzz distance colors within this distance are considered equal + \-geometry geometry preferred size and location of the Image window + \-gravity type horizontal and vertical backdrop placement + \-identify identify the format and characteristics of the image + \-immutable displayed image cannot be modified + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-label string assign a label to an image + \-limit type value pixel cache resource limit + \-loop iterations loop images then exit + \-map type display image using this Standard Colormap + \-matte store matte channel if the image has one + \-monitor monitor progress + \-page geometry size and location of an image canvas + \-profile filename add, delete, or apply an image profile + \-quality value JPEG/MIFF/PNG compression level + \-quantize colorspace reduce colors in this colorspace + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-remote command execute a command in an remote display process + \-repage geometry size and location of an image canvas (operator) + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scenes range image scene range + \-seed value seed a new sequence of pseudo-random numbers + \-set property value set an image property + \-size geometry width and height of image + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-texture filename name of texture to tile onto the image background + \-transparent-color color + transparent color + \-treedepth value color tree depth + \-update seconds detect when image file is modified and redisplay + \-verbose print detailed information about the image + \-visual type display image using this visual type + \-virtual-pixel method + virtual pixel access method + \-window id display image to background of this window + \-window-group id exit program when this window id is destroyed + \-write filename write image to a file + +Image Operators: + \-auto-orient automatically orient image + \-border geometry surround image with a border of color + \-clip clip along the first path from the 8BIM profile + \-clip-path id clip along a named path from the 8BIM profile + \-colors value preferred number of colors in the image + \-contrast enhance or reduce the image contrast + \-crop geometry preferred size and location of the cropped image + \-despeckle reduce the speckles within an image + \-edge factor apply a filter to detect edges in the image + \-enhance apply a digital filter to enhance a noisy image + \-extract geometry extract area from image + \-flip flip image in the vertical direction + \-flop flop image in the horizontal direction + \-frame geometry surround image with an ornamental border + \-gamma value level of gamma correction + \-monochrome transform image to black and white + \-negate replace each pixel with its complementary color + \-normalize transform image to span the full range of colors + \-raise value lighten/darken image edges to create a 3-D effect + \-resample geometry change the resolution of an image + \-resize geometry resize the image + \-roll geometry roll an image vertically or horizontally + \-rotate degrees apply Paeth rotation to the image + \-sample geometry scale image with pixel sampling + \-segment value segment an image + \-sharpen geometry sharpen the image + \-strip strip image of all profiles and comments + \-threshold value threshold the image + \-thumbnail geometry create a thumbnail of the image + \-trim trim image edges + +Image Sequence Operators: + \-coalesce merge a sequence of images + \-flatten flatten a sequence of images + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +In addition to those listed above, you can specify these standard X resources as command line options: \-background, \-bordercolor, \-borderwidth, \-font, \-foreground, \-iconGeometry, \-iconic, \-mattecolor, \-name, \-shared-memory, \-usePixmap, or \-title. + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. + +Buttons: + 1 press to map or unmap the Command widget + 2 press and drag to magnify a region of an image + 3 press to load an image from a visual image directory +.SH NOTE +The display program defaults to the X screen resolution. To display vector formats at their intended size, override the default resolution: + + display -density 72 drawing.svg +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/display.c b/ImageMagick-6.9.12-44/utilities/display.c new file mode 100644 index 0000000..b6d7ec1 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/display.c @@ -0,0 +1,123 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD IIIII SSSSS PPPP L AAA Y Y % +% D D I SS P P L A A Y Y % +% D D I SSS PPPP L AAAAA Y % +% D D I SS P L A A Y % +% DDDD IIIII SSSSS P LLLLL A A Y % +% % +% % +% Interactively Display an Image. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Display is a machine architecture independent image processing +% and display program. It can display any image in the MIFF format on +% any workstation display running X. Display first determines the +% hardware capabilities of the workstation. If the number of unique +% colors in the image is less than or equal to the number the workstation +% can support, the image is displayed in an X window. Otherwise the +% number of colors in the image is first reduced to match the color +% resolution of the workstation before it is displayed. +% +% This means that a continuous-tone 24 bits-per-pixel image can display on a +% 8 bit pseudo-color device or monochrome device. In most instances the +% reduced color image closely resembles the original. Alternatively, a +% monochrome or pseudo-color image can display on a continuous-tone 24 +% bits-per-pixel device. +% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int DisplayMain(int argc,char **argv) +{ + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + status=MagickCommandGenesis(image_info,DisplayImageCommand,argc,argv, + (char **) NULL,exception); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + return(status != MagickFalse ? 0 : 1); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) +int main(int argc,char **argv) +{ + return(DisplayMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=DisplayMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/utilities/identify.1 b/ImageMagick-6.9.12-44/utilities/identify.1 new file mode 100644 index 0000000..433e5e8 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/identify.1 @@ -0,0 +1,81 @@ +.TH identify 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +identify \- describes the format and characteristics of one or more image files. +.SH SYNOPSIS +.TP +\fBidentify\fP [\fIoptions\fP] \fIinput-file\fP +.SH OVERVIEW +The \fBidentify\fP program is a member of the ImageMagick(1) suite of tools. It describes the format and characteristics of one or more image files. It also reports if an image is incomplete or corrupt. The information returned includes the image number, the file name, the width and height of the image, whether the image is colormapped or not, the number of colors in the image (by default off use \fI-define unique=true\fP option), the number of bytes in the image, the format of the image (JPEG, PNM, etc.), and finally the number of seconds it took to read and process the image. Many more attributes are available with the verbose option. + +For more information about the identify command, point your browser to file:///usr/share/doc/ImageMagick-6/www/identify.html or http://imagemagick.org/script/identify.php. +.SH DESCRIPTION +Image Settings: + \-alpha option on, activate, off, deactivate, set, opaque, copy + transparent, extract, background, or shape + \-antialias remove pixel-aliasing + \-authenticate value decrypt image with this password + \-channel type apply option to select image channels + \-clip clip along the first path from the 8BIM profile + \-clip-mask filename associate a clip mask with the image + \-clip-path id clip along a named path from the 8BIM profile + \-colorspace type alternate image colorspace + \-crop geometry cut out a rectangular region of the image + \-define format:option + define one or more image format options + \-define unique=true return the number of unique colors in the image + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-endian type endianness (MSB or LSB) of the image + \-extract geometry extract area from image + \-features distance analyze image features (e.g. contrast, correlation) + \-format "string" output formatted image characteristics + \-fuzz distance colors within this distance are considered equal + \-gamma value of gamma correction + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-limit type value pixel cache resource limit + \-list type Color, Configure, Delegate, Format, Magic, Module, + Resource, or Type + \-mask filename associate a mask with the image + \-matte store matte channel if the image has one + \-moments report image moments + \-monitor monitor progress + \-ping efficiently determine image attributes + \-precision value maximum number of significant digits to print + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-seed value seed a new sequence of pseudo-random numbers + \-set attribute value set an image attribute + \-size geometry width and height of image + \-strip strip image of all profiles and comments + \-unique display the number of unique colors in the image + \-units type the units of image resolution + \-verbose print detailed information about the image + \-virtual-pixel method + virtual pixel access method + +Image Operators: + \-auto-orient automatically orient image + \-grayscale method convert image to grayscale + \-negate replace each pixel with its complementary color + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-list type print a list of supported option arguments + \-log format format of debugging information + \-version print version information + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH NOTE +Although some options appear to modify the file to be identified, the identify command is strictly \fBread only\fP. For instance, the crop option crops the in-memory image and then describes the result. + +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/identify.1.in b/ImageMagick-6.9.12-44/utilities/identify.1.in new file mode 100644 index 0000000..8fabd63 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/identify.1.in @@ -0,0 +1,81 @@ +.TH identify 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +identify \- describes the format and characteristics of one or more image files. +.SH SYNOPSIS +.TP +\fBidentify\fP [\fIoptions\fP] \fIinput-file\fP +.SH OVERVIEW +The \fBidentify\fP program is a member of the ImageMagick(1) suite of tools. It describes the format and characteristics of one or more image files. It also reports if an image is incomplete or corrupt. The information returned includes the image number, the file name, the width and height of the image, whether the image is colormapped or not, the number of colors in the image (by default off use \fI-define unique=true\fP option), the number of bytes in the image, the format of the image (JPEG, PNM, etc.), and finally the number of seconds it took to read and process the image. Many more attributes are available with the verbose option. + +For more information about the identify command, point your browser to file://@DOCUMENTATION_PATH@/www/identify.html or http://imagemagick.org/script/identify.php. +.SH DESCRIPTION +Image Settings: + \-alpha option on, activate, off, deactivate, set, opaque, copy + transparent, extract, background, or shape + \-antialias remove pixel-aliasing + \-authenticate value decrypt image with this password + \-channel type apply option to select image channels + \-clip clip along the first path from the 8BIM profile + \-clip-mask filename associate a clip mask with the image + \-clip-path id clip along a named path from the 8BIM profile + \-colorspace type alternate image colorspace + \-crop geometry cut out a rectangular region of the image + \-define format:option + define one or more image format options + \-define unique=true return the number of unique colors in the image + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-endian type endianness (MSB or LSB) of the image + \-extract geometry extract area from image + \-features distance analyze image features (e.g. contrast, correlation) + \-format "string" output formatted image characteristics + \-fuzz distance colors within this distance are considered equal + \-gamma value of gamma correction + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-limit type value pixel cache resource limit + \-list type Color, Configure, Delegate, Format, Magic, Module, + Resource, or Type + \-mask filename associate a mask with the image + \-matte store matte channel if the image has one + \-moments report image moments + \-monitor monitor progress + \-ping efficiently determine image attributes + \-precision value maximum number of significant digits to print + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-seed value seed a new sequence of pseudo-random numbers + \-set attribute value set an image attribute + \-size geometry width and height of image + \-strip strip image of all profiles and comments + \-unique display the number of unique colors in the image + \-units type the units of image resolution + \-verbose print detailed information about the image + \-virtual-pixel method + virtual pixel access method + +Image Operators: + \-auto-orient automatically orient image + \-grayscale method convert image to grayscale + \-negate replace each pixel with its complementary color + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-list type print a list of supported option arguments + \-log format format of debugging information + \-version print version information + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH NOTE +Although some options appear to modify the file to be identified, the identify command is strictly \fBread only\fP. For instance, the crop option crops the in-memory image and then describes the result. + +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/identify.c b/ImageMagick-6.9.12-44/utilities/identify.c new file mode 100644 index 0000000..e37ef88 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/identify.c @@ -0,0 +1,116 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% IIIII DDDD EEEEE N N TTTTT IIIII FFFFF Y Y % +% I D D E NN N T I F Y Y % +% I D D EEE N N N T I FFF Y % +% I D D E N NN T I F Y % +% IIIII DDDD EEEEE N N T IIIII F Y % +% % +% % +% Identify an Image Format and Characteristics. % +% % +% Software Design % +% Cristy % +% September 1994 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Identify describes the format and characteristics of one or more image +% files. It will also report if an image is incomplete or corrupt. +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int IdentifyMain(int argc,char **argv) +{ + char + *metadata; + + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + metadata=(char *) NULL; + status=MagickCommandGenesis(image_info,IdentifyImageCommand,argc,argv, + &metadata,exception); + if (metadata != (char *) NULL) + metadata=DestroyString(metadata); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + return(status != MagickFalse ? 0 : 1); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) +int main(int argc,char **argv) +{ + return(IdentifyMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=IdentifyMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/utilities/import.1 b/ImageMagick-6.9.12-44/utilities/import.1 new file mode 100644 index 0000000..8ddb9ba --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/import.1 @@ -0,0 +1,99 @@ +.TH import 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +import \- saves any visible window on an X server and outputs it as an image file. You can capture a single window, the entire screen, or any rectangular portion of the screen. +.SH SYNOPSIS +.TP +\fBimport\fP [\fIoptions\fP] \fIoutput-file\fP +.SH OVERVIEW +The \fBimport\fP program is a member of the ImageMagick(1) suite of tools. Use it to capture some or all of an X server screen and save the image to a file. + +For more information about the import command, point your browser to file:///usr/share/doc/ImageMagick-6/www/import.html or http://imagemagick.org/script/import.php. +.SH DESCRIPTION +Image Settings: + \-adjoin join images into a single multi-image file + \-border include window border in the output image + \-channel type apply option to select image channels + \-colorspace type alternate image colorspace + \-comment string annotate image with comment + \-compress type type of pixel compression when writing the image + \-define format:option + define one or more image format options + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-descend obtain image by descending window hierarchy + \-display server X server to contact + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-delay centiseconds display the next image after pausing + \-encipher filename convert plain pixels to cipher pixels + \-endian type endianness (MSB or LSB) of the image + \-encoding type text encoding type + \-filter type use this filter when resizing an image + \-format "string" output formatted image characteristics + \-frame include window manager frame + \-gravity direction which direction to gravitate towards + \-identify identify the format and characteristics of the image + \-interlace type None, Line, Plane, or Partition + \-interpolate method pixel color interpolation method + \-label string assign a label to an image + \-limit type value Area, Disk, Map, or Memory resource limit + \-monitor monitor progress + \-page geometry size and location of an image canvas + \-pause seconds seconds delay between snapshots + \-pointsize value font point size + \-quality value JPEG/MIFF/PNG compression level + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-repage geometry size and location of an image canvas + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scene value image scene number + \-screen select image from root window + \-seed value seed a new sequence of pseudo-random numbers + \-set property value set an image property + \-silent operate silently, i.e. don't ring any bells + \-snaps value number of screen snapshots + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-transparent-color color + transparent color + \-treedepth value color tree depth + \-verbose print detailed information about the image + \-virtual-pixel method + Constant, Edge, Mirror, or Tile + \-window id select window with this id or name + +Image Operators: + \-annotate geometry text + annotate the image with text + \-colors value preferred number of colors in the image + \-crop geometry preferred size and location of the cropped image + \-geometry geometry preferred size or location of the image + \-help print program options + \-monochrome transform image to black and white + \-negate replace each pixel with its complementary color + \-quantize colorspace reduce colors in this colorspace + \-resize geometry resize the image + \-rotate degrees apply Paeth rotation to the image + \-strip strip image of all profiles and comments + \-thumbnail geometry create a thumbnail of the image + \-transparent color make this color transparent within the image + \-trim trim image edges + \-type type image type + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +By default, 'file' is written in the Postscript image format. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/import.1.in b/ImageMagick-6.9.12-44/utilities/import.1.in new file mode 100644 index 0000000..706be09 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/import.1.in @@ -0,0 +1,99 @@ +.TH import 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +import \- saves any visible window on an X server and outputs it as an image file. You can capture a single window, the entire screen, or any rectangular portion of the screen. +.SH SYNOPSIS +.TP +\fBimport\fP [\fIoptions\fP] \fIoutput-file\fP +.SH OVERVIEW +The \fBimport\fP program is a member of the ImageMagick(1) suite of tools. Use it to capture some or all of an X server screen and save the image to a file. + +For more information about the import command, point your browser to file://@DOCUMENTATION_PATH@/www/import.html or http://imagemagick.org/script/import.php. +.SH DESCRIPTION +Image Settings: + \-adjoin join images into a single multi-image file + \-border include window border in the output image + \-channel type apply option to select image channels + \-colorspace type alternate image colorspace + \-comment string annotate image with comment + \-compress type type of pixel compression when writing the image + \-define format:option + define one or more image format options + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-descend obtain image by descending window hierarchy + \-display server X server to contact + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-delay centiseconds display the next image after pausing + \-encipher filename convert plain pixels to cipher pixels + \-endian type endianness (MSB or LSB) of the image + \-encoding type text encoding type + \-filter type use this filter when resizing an image + \-format "string" output formatted image characteristics + \-frame include window manager frame + \-gravity direction which direction to gravitate towards + \-identify identify the format and characteristics of the image + \-interlace type None, Line, Plane, or Partition + \-interpolate method pixel color interpolation method + \-label string assign a label to an image + \-limit type value Area, Disk, Map, or Memory resource limit + \-monitor monitor progress + \-page geometry size and location of an image canvas + \-pause seconds seconds delay between snapshots + \-pointsize value font point size + \-quality value JPEG/MIFF/PNG compression level + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-repage geometry size and location of an image canvas + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scene value image scene number + \-screen select image from root window + \-seed value seed a new sequence of pseudo-random numbers + \-set property value set an image property + \-silent operate silently, i.e. don't ring any bells + \-snaps value number of screen snapshots + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-transparent-color color + transparent color + \-treedepth value color tree depth + \-verbose print detailed information about the image + \-virtual-pixel method + Constant, Edge, Mirror, or Tile + \-window id select window with this id or name + +Image Operators: + \-annotate geometry text + annotate the image with text + \-colors value preferred number of colors in the image + \-crop geometry preferred size and location of the cropped image + \-geometry geometry preferred size or location of the image + \-help print program options + \-monochrome transform image to black and white + \-negate replace each pixel with its complementary color + \-quantize colorspace reduce colors in this colorspace + \-resize geometry resize the image + \-rotate degrees apply Paeth rotation to the image + \-strip strip image of all profiles and comments + \-thumbnail geometry create a thumbnail of the image + \-transparent color make this color transparent within the image + \-trim trim image edges + \-type type image type + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +By default, 'file' is written in the Postscript image format. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/import.c b/ImageMagick-6.9.12-44/utilities/import.c new file mode 100644 index 0000000..03a59ae --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/import.c @@ -0,0 +1,115 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% IIIII M M PPPP OOO RRRR TTTTT % +% I MM MM P P O O R R T % +% I M M M PPPP O O RRRR T % +% I M M P O O R R T % +% IIIII M M P OOO R R T % +% % +% % +% Import image to a machine independent format. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Import is an X Window System window dumping utility. Import allows X +% users to store window images in a specially formatted dump file. This +% file can then be read by the Display utility for redisplay, printing, +% editing, formatting, archiving, image processing, etc. The target +% window can be specified by id or name or be selected by clicking the +% mouse in the desired window. The keyboard bell is rung once at the +% beginning of the dump and twice when the dump is completed. +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int ImportMain(int argc,char **argv) +{ + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + status=MagickCommandGenesis(image_info,ImportImageCommand,argc,argv, + (char **) NULL,exception); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + return(status != MagickFalse ? 0 : 1); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) +int main(int argc,char **argv) +{ + return(ImportMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=ImportMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/utilities/mogrify.1 b/ImageMagick-6.9.12-44/utilities/mogrify.1 new file mode 100644 index 0000000..9a2b057 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/mogrify.1 @@ -0,0 +1,327 @@ +.TH mogrify 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +mogrify \- resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. Mogrify overwrites the original image file, whereas, convert(1) writes to a different image file. +.SH SYNOPSIS +.TP +\fBmogrify\fP [\fIoptions\fP] \fIinput-file\fP +.SH OVERVIEW +The \fBmogrify\fP program is a member of the ImageMagick(1) suite of tools. Use it to resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. This tool is similar to convert(1) except the original image file is overwritten with any changes you request. + +For more information about the mogrify command, point your browser to file:///usr/share/doc/ImageMagick-6/www/mogrify.html or http://imagemagick.org/script/mogrify.php. +.SH DESCRIPTION +Image Settings: + \-adjoin join images into a single multi-image file + \-affine matrix affine transform matrix + \-alpha option activate, deactivate, reset, or set the alpha channel + \-antialias remove pixel-aliasing + \-authenticate value decrypt image with this password + \-attenuate value lessen (or intensify) when adding noise to an image + \-background color background color + \-bias value add bias when convolving an image + \-black-point-compensation + use black point compensation + \-blue-primary point chromaticity blue primary point + \-bordercolor color border color + \-caption string assign a caption to an image + \-cdl filename color correct with a color decision list + \-channel type apply option to select image channels + \-colors value preferred number of colors in the image + \-colorspace type alternate image colorspace + \-comment string annotate image with comment + \-compose operator set image composite operator + \-compress type type of pixel compression when writing the image + \-decipher filename convert cipher pixels to plain pixels + \-define format:option + define one or more image format options + \-delay centiseconds display the next image after pausing + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-direction type render text right-to-left or left-to-right + \-display server get image or font from this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-encipher filename convert plain pixels to cipher pixels + \-encoding type text encoding type + \-endian type endianness (MSB or LSB) of the image + \-family name render text with this font family + \-features distance analyze image features (e.g. contrast, correlation) + \-fill color color to use when filling a graphic primitive + \-filter type use this filter when resizing an image + \-flatten flatten a sequence of images + \-font name render text with this font + \-format type image format type + \-function name apply a function to the image + \-fuzz distance colors within this distance are considered equal + \-gravity type horizontal and vertical text placement + \-green-primary point chromaticity green primary point + \-intensity method method to generate intensity value from pixel + \-intent type type of rendering intent when managing the image color + \-interlace type type of image interlacing scheme + \-interline-spacing value set the space between two text lines + \-interpolate method pixel color interpolation method + \-interword-spacing value set the space between two words + \-kerning value set the space between two letters + \-label string assign a label to an image + \-limit type value pixel cache resource limit + \-loop iterations add Netscape loop extension to your GIF animation + \-mask filename associate a mask with the image + \-matte store matte channel if the image has one + \-mattecolor color frame color + \-metric type measure differences between images with this metric + \-monitor monitor progress + \-morphology method kernel + apply a morphology method to the image + \-orient type image orientation + \-page geometry size and location of an image canvas (setting) + \-path path write images to this path on disk + \-ping efficiently determine image attributes + \-pointsize value font point size + \-precision value maximum number of significant digits to print + \-preview type image preview type + \-quality value JPEG/MIFF/PNG compression level + \-quiet suppress all warning messages + \-red-primary point chromaticity red primary point + \-regard-warnings pay attention to warning messages + \-remap filename transform image colors to match this set of colors + \-repage geometry size and location of an image canvas + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scene value image scene number + \-seed value seed a new sequence of pseudo-random numbers + \-size geometry width and height of image + \-stretch type render text with this font stretch + \-stroke color graphic primitive stroke color + \-strokewidth value graphic primitive stroke width + \-style type render text with this font style + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-texture filename name of texture to tile onto the image background + \-tile-offset geometry + tile offset + \-treedepth value color tree depth + \-transparent-color color + transparent color + \-undercolor color annotation bounding box color + \-units type the units of image resolution + \-verbose print detailed information about the image + \-view FlashPix viewing transforms + \-virtual-pixel method + virtual pixel access method + \-weight type render text with this font weight + \-white-point point chromaticity white point + +Image Operators: + \-adaptive-blur geometry + adaptively blur pixels; decrease effect near edges + \-adaptive-resize geometry + adaptively resize image with data dependent triangulation + \-adaptive-sharpen geometry + adaptively sharpen pixels; increase effect near edges + \-alpha option on, activate, off, deactivate, set, opaque, copy + transparent, extract, background, or shape + \-annotate geometry text + annotate the image with text + \-auto-gamma automagically adjust gamma level of image + \-auto-level automagically adjust color levels of image + \-auto-orient automatically orient image + \-bench iterations measure performance + \-black-threshold value + force all pixels below the threshold into black + \-blue-shift simulate a scene at nighttime in the moonlight + \-blur geometry reduce image noise and reduce detail levels + \-border geometry surround image with a border of color + \-bordercolor color border color + \-brightness-contrast geometry + improve brightness / contrast of the image + \-cdl filename color correct with a color decision list + \-canny geometry detect edges in the image + \-charcoal radius simulate a charcoal drawing + \-chop geometry remove pixels from the image interior + \-clamp keep pixel values in range (0-QuantumRange) + \-clip clip along the first path from the 8BIM profile + \-clip-mask filename associate a clip mask with the image + \-clip-path id clip along a named path from the 8BIM profile + \-colorize value colorize the image with the fill color + \-color-matrix matrix apply color correction to the image + \-connected-component connectivity + connected-components uniquely labeled + \-contrast enhance or reduce the image contrast + \-contrast-stretch geometry + improve contrast by `stretching' the intensity range + \-convolve coefficients + apply a convolution kernel to the image + \-cycle amount cycle the image colormap + \-decipher filename convert cipher pixels to plain pixels + \-deskew threshold straighten an image + \-despeckle reduce the speckles within an image + \-distort method args + distort images according to given method and args + \-draw string annotate the image with a graphic primitive + \-edge radius apply a filter to detect edges in the image + \-encipher filename convert plain pixels to cipher pixels + \-emboss radius emboss an image + \-enhance apply a digital filter to enhance a noisy image + \-equalize perform histogram equalization to an image + \-evaluate operator value + evaluate an arithmetic, relational, or logical expression + \-extent geometry set the image size + \-extract geometry extract area from image + \-features distance analyze image features (e.g. contrast, correlation) + \-fft implements the discrete Fourier transform (DFT) + \-flip flip image vertically + \-floodfill geometry color + floodfill the image with color + \-flop flop image horizontally + \-frame geometry surround image with an ornamental border + \-function name parameters + apply function over image values + \-gamma value level of gamma correction + \-gaussian-blur geometry + reduce image noise and reduce detail levels + \-geometry geometry preferred size or location of the image + \-grayscale method convert image to grayscale + \-ift implements the inverse discrete Fourier transform (DFT) + \-help print program options + \-hough-lines geometry + identify lines in the image + \-identify identify the format and characteristics of the image + \-ift implements the inverse discrete Fourier transform (DFT) + \-implode amount implode image pixels about the center + \-lat geometry local adaptive thresholding + \-layers method optimize or compare image layers + \-level value adjust the level of image contrast + \-level-colors color,color + level image with the given colors + \-linear-stretch geometry + improve contrast by `stretching with saturation' the intensity range + \-liquid-rescale geometry + rescale image with seam-carving + \-magnify double the size of the image with pixel art scaling + \-mean-shift geometry delineate arbitrarily shaped clusters in the image + \-median geometry apply a median filter to the image + \-mode geometry make each pixel the 'predominant color' of the neighborhood + \-modulate value vary the brightness, saturation, and hue + \-monochrome transform image to black and white + \-morphology method kernel + apply a morphology method to the image + \-motion-blur geometry + simulate motion blur + \-negate replace each pixel with its complementary color + \-noise geometry add or reduce noise in an image + \-normalize transform image to span the full range of colors + \-opaque color change this color to the fill color + \-ordered-dither NxN + add a noise pattern to the image with specific amplitudes + \-paint radius simulate an oil painting + \-perceptible epsilon + pixel value less than |epsilon| become epsilon or -epsilon + \-polaroid angle simulate a Polaroid picture + \-posterize levels reduce the image to a limited number of color levels + \-print string interpret string and print to console + \-profile filename add, delete, or apply an image profile + \-quantize colorspace reduce colors in this colorspace + \-radial-blur angle radial blur the image + \-raise value lighten/darken image edges to create a 3-D effect + \-random-threshold low,high + random threshold the image + \-region geometry apply options to a portion of the image + \-render render vector graphics + \-resample geometry change the resolution of an image + \-resize geometry resize the image + \-roll geometry roll an image vertically or horizontally + \-rotate degrees apply Paeth rotation to the image + \-sample geometry scale image with pixel sampling + \-scale geometry scale the image + \-segment values segment an image + \-selective-blur geometry + selectively blur pixels within a contrast threshold + \-sepia-tone threshold + simulate a sepia-toned photo + \-set property value set an image property + \-shade degrees shade the image using a distant light source + \-shadow geometry simulate an image shadow + \-sharpen geometry sharpen the image + \-shave geometry shave pixels from the image edges + \-shear geometry slide one edge of the image along the X or Y axis + \-sigmoidal-contrast geometry + lightness rescaling using sigmoidal contrast enhancement + \-sketch geometry simulate a pencil sketch + \-solarize threshold negate all pixels above the threshold level + \-sparse-color method args + fill in a image based on a few color points + \-splice geometry splice the background color into the image + \-spread amount displace image pixels by a random amount + \-statistic type geometry + replace each pixel with corresponding statistic from the neighborhood + \-strip strip image of all profiles and comments + \-swirl degrees swirl image pixels about the center + \-threshold value threshold the image + \-thumbnail geometry create a thumbnail of the image + \-tile filename tile image when filling a graphic primitive + \-tint value tint the image with the fill color + \-transform affine transform image + \-transparent color make this color transparent within the image + \-transpose flip image vertically and rotate 90 degrees + \-transverse flop image horizontally and rotate 270 degrees + \-trim trim image edges + \-type type image type + \-unique-colors discard all but one of any pixel color + \-unsharp geometry sharpen the image + \-vignette geometry soften the edges of the image in vignette style + \-wave geometry alter an image along a sine wave + \-wavelet-denoise threshold + removes noise from the image using a wavelet transform + \-white-threshold value + force all pixels above the threshold into white + +Image Sequence Operators: + \-affinity filename transform image colors to match this set of colors + \-append append an image sequence top to botto (use +append for left to right) + \-clut apply a color lookup table to the image + \-coalesce merge a sequence of images + \-combine combine a sequence of images + \-compare mathematically and visually annotate the difference between an image and its reconstruction + \-complex operator perform complex mathematics on an image sequence + \-composite composite image + \-copy geometry offset, + copy pixels from one area of an image to another + \-crop geometry cut out a rectangular region of the image + \-deconstruct break down an image sequence into constituent parts + \-evaluate-sequence operator + evaluate an arithmetic, relational, or logical expression + \-flatten flatten a sequence of images + \-fx expression apply mathematical expression to an image channel(s) + \-hald-clut apply a Hald color lookup table to the image + \-morph value morph an image sequence + \-mosaic create a mosaic from an image sequence + \-poly terms build a polynomial from the image sequence and the corresponding terms (coefficients and degree pairs) + \-process arguments process the image with a custom image filter + \-separate separate an image channel into a grayscale image + \-smush geometry smush an image sequence together + \-write filename write images to this file + +Image Stack Operators: + \-delete indexes delete the image from the image sequence + \-duplicate count,indexes + duplicate an image one or more times + \-insert index insert last image into the image sequence + \-reverse reverse image sequence + \-swap indexes swap two images in the image sequence + +Miscellaneous Options: + \-debug events display copious debugging information + \-distribute-cache port + distributed pixel cache spanning one or more servers + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/mogrify.1.in b/ImageMagick-6.9.12-44/utilities/mogrify.1.in new file mode 100644 index 0000000..ccbd06d --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/mogrify.1.in @@ -0,0 +1,327 @@ +.TH mogrify 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +mogrify \- resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. Mogrify overwrites the original image file, whereas, convert(1) writes to a different image file. +.SH SYNOPSIS +.TP +\fBmogrify\fP [\fIoptions\fP] \fIinput-file\fP +.SH OVERVIEW +The \fBmogrify\fP program is a member of the ImageMagick(1) suite of tools. Use it to resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. This tool is similar to convert(1) except the original image file is overwritten with any changes you request. + +For more information about the mogrify command, point your browser to file://@DOCUMENTATION_PATH@/www/mogrify.html or http://imagemagick.org/script/mogrify.php. +.SH DESCRIPTION +Image Settings: + \-adjoin join images into a single multi-image file + \-affine matrix affine transform matrix + \-alpha option activate, deactivate, reset, or set the alpha channel + \-antialias remove pixel-aliasing + \-authenticate value decrypt image with this password + \-attenuate value lessen (or intensify) when adding noise to an image + \-background color background color + \-bias value add bias when convolving an image + \-black-point-compensation + use black point compensation + \-blue-primary point chromaticity blue primary point + \-bordercolor color border color + \-caption string assign a caption to an image + \-cdl filename color correct with a color decision list + \-channel type apply option to select image channels + \-colors value preferred number of colors in the image + \-colorspace type alternate image colorspace + \-comment string annotate image with comment + \-compose operator set image composite operator + \-compress type type of pixel compression when writing the image + \-decipher filename convert cipher pixels to plain pixels + \-define format:option + define one or more image format options + \-delay centiseconds display the next image after pausing + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-direction type render text right-to-left or left-to-right + \-display server get image or font from this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-encipher filename convert plain pixels to cipher pixels + \-encoding type text encoding type + \-endian type endianness (MSB or LSB) of the image + \-family name render text with this font family + \-features distance analyze image features (e.g. contrast, correlation) + \-fill color color to use when filling a graphic primitive + \-filter type use this filter when resizing an image + \-flatten flatten a sequence of images + \-font name render text with this font + \-format type image format type + \-function name apply a function to the image + \-fuzz distance colors within this distance are considered equal + \-gravity type horizontal and vertical text placement + \-green-primary point chromaticity green primary point + \-intensity method method to generate intensity value from pixel + \-intent type type of rendering intent when managing the image color + \-interlace type type of image interlacing scheme + \-interline-spacing value set the space between two text lines + \-interpolate method pixel color interpolation method + \-interword-spacing value set the space between two words + \-kerning value set the space between two letters + \-label string assign a label to an image + \-limit type value pixel cache resource limit + \-loop iterations add Netscape loop extension to your GIF animation + \-mask filename associate a mask with the image + \-matte store matte channel if the image has one + \-mattecolor color frame color + \-metric type measure differences between images with this metric + \-monitor monitor progress + \-morphology method kernel + apply a morphology method to the image + \-orient type image orientation + \-page geometry size and location of an image canvas (setting) + \-path path write images to this path on disk + \-ping efficiently determine image attributes + \-pointsize value font point size + \-precision value maximum number of significant digits to print + \-preview type image preview type + \-quality value JPEG/MIFF/PNG compression level + \-quiet suppress all warning messages + \-red-primary point chromaticity red primary point + \-regard-warnings pay attention to warning messages + \-remap filename transform image colors to match this set of colors + \-repage geometry size and location of an image canvas + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scene value image scene number + \-seed value seed a new sequence of pseudo-random numbers + \-size geometry width and height of image + \-stretch type render text with this font stretch + \-stroke color graphic primitive stroke color + \-strokewidth value graphic primitive stroke width + \-style type render text with this font style + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-texture filename name of texture to tile onto the image background + \-tile-offset geometry + tile offset + \-treedepth value color tree depth + \-transparent-color color + transparent color + \-undercolor color annotation bounding box color + \-units type the units of image resolution + \-verbose print detailed information about the image + \-view FlashPix viewing transforms + \-virtual-pixel method + virtual pixel access method + \-weight type render text with this font weight + \-white-point point chromaticity white point + +Image Operators: + \-adaptive-blur geometry + adaptively blur pixels; decrease effect near edges + \-adaptive-resize geometry + adaptively resize image with data dependent triangulation + \-adaptive-sharpen geometry + adaptively sharpen pixels; increase effect near edges + \-alpha option on, activate, off, deactivate, set, opaque, copy + transparent, extract, background, or shape + \-annotate geometry text + annotate the image with text + \-auto-gamma automagically adjust gamma level of image + \-auto-level automagically adjust color levels of image + \-auto-orient automatically orient image + \-bench iterations measure performance + \-black-threshold value + force all pixels below the threshold into black + \-blue-shift simulate a scene at nighttime in the moonlight + \-blur geometry reduce image noise and reduce detail levels + \-border geometry surround image with a border of color + \-bordercolor color border color + \-brightness-contrast geometry + improve brightness / contrast of the image + \-cdl filename color correct with a color decision list + \-canny geometry detect edges in the image + \-charcoal radius simulate a charcoal drawing + \-chop geometry remove pixels from the image interior + \-clamp keep pixel values in range (0-QuantumRange) + \-clip clip along the first path from the 8BIM profile + \-clip-mask filename associate a clip mask with the image + \-clip-path id clip along a named path from the 8BIM profile + \-colorize value colorize the image with the fill color + \-color-matrix matrix apply color correction to the image + \-connected-component connectivity + connected-components uniquely labeled + \-contrast enhance or reduce the image contrast + \-contrast-stretch geometry + improve contrast by `stretching' the intensity range + \-convolve coefficients + apply a convolution kernel to the image + \-cycle amount cycle the image colormap + \-decipher filename convert cipher pixels to plain pixels + \-deskew threshold straighten an image + \-despeckle reduce the speckles within an image + \-distort method args + distort images according to given method and args + \-draw string annotate the image with a graphic primitive + \-edge radius apply a filter to detect edges in the image + \-encipher filename convert plain pixels to cipher pixels + \-emboss radius emboss an image + \-enhance apply a digital filter to enhance a noisy image + \-equalize perform histogram equalization to an image + \-evaluate operator value + evaluate an arithmetic, relational, or logical expression + \-extent geometry set the image size + \-extract geometry extract area from image + \-features distance analyze image features (e.g. contrast, correlation) + \-fft implements the discrete Fourier transform (DFT) + \-flip flip image vertically + \-floodfill geometry color + floodfill the image with color + \-flop flop image horizontally + \-frame geometry surround image with an ornamental border + \-function name parameters + apply function over image values + \-gamma value level of gamma correction + \-gaussian-blur geometry + reduce image noise and reduce detail levels + \-geometry geometry preferred size or location of the image + \-grayscale method convert image to grayscale + \-ift implements the inverse discrete Fourier transform (DFT) + \-help print program options + \-hough-lines geometry + identify lines in the image + \-identify identify the format and characteristics of the image + \-ift implements the inverse discrete Fourier transform (DFT) + \-implode amount implode image pixels about the center + \-lat geometry local adaptive thresholding + \-layers method optimize or compare image layers + \-level value adjust the level of image contrast + \-level-colors color,color + level image with the given colors + \-linear-stretch geometry + improve contrast by `stretching with saturation' the intensity range + \-liquid-rescale geometry + rescale image with seam-carving + \-magnify double the size of the image with pixel art scaling + \-mean-shift geometry delineate arbitrarily shaped clusters in the image + \-median geometry apply a median filter to the image + \-mode geometry make each pixel the 'predominant color' of the neighborhood + \-modulate value vary the brightness, saturation, and hue + \-monochrome transform image to black and white + \-morphology method kernel + apply a morphology method to the image + \-motion-blur geometry + simulate motion blur + \-negate replace each pixel with its complementary color + \-noise geometry add or reduce noise in an image + \-normalize transform image to span the full range of colors + \-opaque color change this color to the fill color + \-ordered-dither NxN + add a noise pattern to the image with specific amplitudes + \-paint radius simulate an oil painting + \-perceptible epsilon + pixel value less than |epsilon| become epsilon or -epsilon + \-polaroid angle simulate a Polaroid picture + \-posterize levels reduce the image to a limited number of color levels + \-print string interpret string and print to console + \-profile filename add, delete, or apply an image profile + \-quantize colorspace reduce colors in this colorspace + \-radial-blur angle radial blur the image + \-raise value lighten/darken image edges to create a 3-D effect + \-random-threshold low,high + random threshold the image + \-region geometry apply options to a portion of the image + \-render render vector graphics + \-resample geometry change the resolution of an image + \-resize geometry resize the image + \-roll geometry roll an image vertically or horizontally + \-rotate degrees apply Paeth rotation to the image + \-sample geometry scale image with pixel sampling + \-scale geometry scale the image + \-segment values segment an image + \-selective-blur geometry + selectively blur pixels within a contrast threshold + \-sepia-tone threshold + simulate a sepia-toned photo + \-set property value set an image property + \-shade degrees shade the image using a distant light source + \-shadow geometry simulate an image shadow + \-sharpen geometry sharpen the image + \-shave geometry shave pixels from the image edges + \-shear geometry slide one edge of the image along the X or Y axis + \-sigmoidal-contrast geometry + lightness rescaling using sigmoidal contrast enhancement + \-sketch geometry simulate a pencil sketch + \-solarize threshold negate all pixels above the threshold level + \-sparse-color method args + fill in a image based on a few color points + \-splice geometry splice the background color into the image + \-spread amount displace image pixels by a random amount + \-statistic type geometry + replace each pixel with corresponding statistic from the neighborhood + \-strip strip image of all profiles and comments + \-swirl degrees swirl image pixels about the center + \-threshold value threshold the image + \-thumbnail geometry create a thumbnail of the image + \-tile filename tile image when filling a graphic primitive + \-tint value tint the image with the fill color + \-transform affine transform image + \-transparent color make this color transparent within the image + \-transpose flip image vertically and rotate 90 degrees + \-transverse flop image horizontally and rotate 270 degrees + \-trim trim image edges + \-type type image type + \-unique-colors discard all but one of any pixel color + \-unsharp geometry sharpen the image + \-vignette geometry soften the edges of the image in vignette style + \-wave geometry alter an image along a sine wave + \-wavelet-denoise threshold + removes noise from the image using a wavelet transform + \-white-threshold value + force all pixels above the threshold into white + +Image Sequence Operators: + \-affinity filename transform image colors to match this set of colors + \-append append an image sequence top to botto (use +append for left to right) + \-clut apply a color lookup table to the image + \-coalesce merge a sequence of images + \-combine combine a sequence of images + \-compare mathematically and visually annotate the difference between an image and its reconstruction + \-complex operator perform complex mathematics on an image sequence + \-composite composite image + \-copy geometry offset, + copy pixels from one area of an image to another + \-crop geometry cut out a rectangular region of the image + \-deconstruct break down an image sequence into constituent parts + \-evaluate-sequence operator + evaluate an arithmetic, relational, or logical expression + \-flatten flatten a sequence of images + \-fx expression apply mathematical expression to an image channel(s) + \-hald-clut apply a Hald color lookup table to the image + \-morph value morph an image sequence + \-mosaic create a mosaic from an image sequence + \-poly terms build a polynomial from the image sequence and the corresponding terms (coefficients and degree pairs) + \-process arguments process the image with a custom image filter + \-separate separate an image channel into a grayscale image + \-smush geometry smush an image sequence together + \-write filename write images to this file + +Image Stack Operators: + \-delete indexes delete the image from the image sequence + \-duplicate count,indexes + duplicate an image one or more times + \-insert index insert last image into the image sequence + \-reverse reverse image sequence + \-swap indexes swap two images in the image sequence + +Miscellaneous Options: + \-debug events display copious debugging information + \-distribute-cache port + distributed pixel cache spanning one or more servers + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/mogrify.c b/ImageMagick-6.9.12-44/utilities/mogrify.c new file mode 100644 index 0000000..aa9bcec --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/mogrify.c @@ -0,0 +1,111 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M OOO GGGG RRRR IIIII FFFFF Y Y % +% MM MM O O G R R I F Y Y % +% M M M O O G GG RRRRR I FFF Y % +% M M O O G G R R I F Y % +% M M OOO GGG R R IIIII F Y % +% % +% % +% Transmogrify an Image or Sequence of Images. % +% % +% Software Design % +% Cristy % +% December 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Mogrify transforms an image or a sequence of images. These transforms +% include image scaling, image rotation, color reduction, and others. The +% transmogrified image overwrites the original image. +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int MogrifyMain(int argc,char **argv) +{ + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + status=MagickCommandGenesis(image_info,MogrifyImageCommand,argc,argv, + (char **) NULL,exception); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + return(status != MagickFalse ? 0 : 1); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) +int main(int argc,char **argv) +{ + return(MogrifyMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=MogrifyMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/utilities/montage.1 b/ImageMagick-6.9.12-44/utilities/montage.1 new file mode 100644 index 0000000..1dd4a82 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/montage.1 @@ -0,0 +1,148 @@ +.TH montage 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +montage \- create a composite image by combining several separate images. The images are tiled on the composite image optionally adorned with a border, frame, image name, and more. +.SH SYNOPSIS +.TP +\fBmontage\fP \fIinput-file[s]\fP [\fIoptions\fP] \fIoutput-file\fP +.SH OVERVIEW +The \fBmontage\fP program is a member of the ImageMagick(1) suite of tools. Use it to create a composite image by combining several separate images. The images are tiled on the composite image optionally adorned with a border, frame, image name, and more. + +For more information about the montage command, point your browser to file:///usr/share/doc/ImageMagick-6/www/montage.html or http://imagemagick.org/script/montage.php. +.SH DESCRIPTION +Image Settings: + \-adjoin join images into a single multi-image file + \-affine matrix affine transform matrix + \-alpha option on, activate, off, deactivate, set, opaque, copy + \ transparent, extract, background, or shape + \-authenticate value decrypt image with this password + \-blue-primary point chromaticity blue primary point + \-bordercolor color border color + \-caption string assign a caption to an image + \-channel type apply option to select image channels + \-colors value preferred number of colors in the image + \-colorspace type alternate image colorsapce + \-comment string annotate image with comment + \-compose operator composite operator + \-compress type type of pixel compression when writing the image + \-define format:option + define one or more image format options + \-delay centiseconds display the next image after pausing + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-display server query font from this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-draw string annotate the image with a graphic primitive + \-encoding type text encoding type + \-endian type endianness (MSB or LSB) of the image + \-extract geometry extract area from image + \-fill color color to use when filling a graphic primitive + \-filter type use this filter when resizing an image + \-font name render text with this font + \-format "string" output formatted image characteristics + \-gamma value level of gamma correction + \-geometry geometry preferred tile and border sizes + \-gravity direction which direction to gravitate towards + \-green-primary point chromaticity green primary point + \-identify identify the format and characteristics of the image + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-kerning value set the space between two letters + \-label string assign a label to an image + \-limit type value pixel cache resource limit + \-matte store matte channel if the image has one + \-mattecolor color frame color + \-mode type framing style + \-monitor monitor progress + \-origin geometry image origin + \-page geometry size and location of an image canvas (setting) + \-pointsize value font point size + \-profile filename add, delete, or apply an image profile + \-quality value JPEG/MIFF/PNG compression level + \-quantize colorspace reduce colors in this colorspace + \-quiet suppress all warning messages + \-red-primary point chromaticity red primary point + \-regard-warnings pay attention to warning messages + \-repage geometry size and location of an image canvas (operator) + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scenes range image scene range + \-seed value seed a new sequence of pseudo-random numbers + \-set attribute value set an image attribute + \-shadow add a shadow beneath a tile to simulate depth + \-size geometry width and height of image + \-stroke color color to use when stroking a graphic primitive + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-texture filename name of texture to tile onto the image background + \-thumbnail geometry create a thumbnail of the image + \-tile geometry number of tiles per row and column + \-title string decorate the montage image with a title + \-transparent-color color + transparent color + \-treedepth value color tree depth + \-trim trim image edges + \-units type the units of image resolution + \-verbose print detailed information about the image + \-virtual-pixel method + virtual pixel access method + \-white-point point chromaticity white point + +Image Operators: + \-adaptive-sharpen geometry + adaptively sharpen pixels; increase effect near edges + \-annotate geometry text + annotate the image with text + \-auto-orient automagically orient image + \-blur geometry reduce image noise and reduce detail levels + \-border geometry surround image with a border of color + \-crop geometry preferred size and location of the cropped image + \-extent geometry set the image size + \-flatten flatten a sequence of images + \-flip flip image in the vertical direction + \-flop flop image in the horizontal direction + \-frame geometry surround image with an ornamental border + \-layers method optimize or compare image layers + \-monochrome transform image to black and white + \-polaroid angle simulate a Polaroid picture + \-resize geometry resize the image + \-rotate degrees apply Paeth rotation to the image + \-scale geometry scale the image + \-strip strip image of all profiles and comments + \-transform affine transform image + \-transpose flip image vertically and rotate 90 degrees + \-transparent color make this color transparent within the image + \-type type image type + \-unsharp geometry sharpen the image + +Image Sequence Operators: + \-coalesce merge a sequence of images + \-composite composite image + +Image Stack Operators: + \-clone indexes clone an image + \-delete indexes delete the image from the image sequence + \-duplicate count,indexes + duplicate an image one or more times + \-insert index insert last image into the image sequence + \-reverse reverse image sequence + \-swap indexes swap two images in the image sequence + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +In addition to those listed above, you can specify these standard X resources as command line options: \-background, \-bordercolor, \-borderwidth, \-font, \-mattecolor, or \-title. + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/montage.1.in b/ImageMagick-6.9.12-44/utilities/montage.1.in new file mode 100644 index 0000000..17023ad --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/montage.1.in @@ -0,0 +1,148 @@ +.TH montage 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +montage \- create a composite image by combining several separate images. The images are tiled on the composite image optionally adorned with a border, frame, image name, and more. +.SH SYNOPSIS +.TP +\fBmontage\fP \fIinput-file[s]\fP [\fIoptions\fP] \fIoutput-file\fP +.SH OVERVIEW +The \fBmontage\fP program is a member of the ImageMagick(1) suite of tools. Use it to create a composite image by combining several separate images. The images are tiled on the composite image optionally adorned with a border, frame, image name, and more. + +For more information about the montage command, point your browser to file://@DOCUMENTATION_PATH@/www/montage.html or http://imagemagick.org/script/montage.php. +.SH DESCRIPTION +Image Settings: + \-adjoin join images into a single multi-image file + \-affine matrix affine transform matrix + \-alpha option on, activate, off, deactivate, set, opaque, copy + \ transparent, extract, background, or shape + \-authenticate value decrypt image with this password + \-blue-primary point chromaticity blue primary point + \-bordercolor color border color + \-caption string assign a caption to an image + \-channel type apply option to select image channels + \-colors value preferred number of colors in the image + \-colorspace type alternate image colorsapce + \-comment string annotate image with comment + \-compose operator composite operator + \-compress type type of pixel compression when writing the image + \-define format:option + define one or more image format options + \-delay centiseconds display the next image after pausing + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-display server query font from this X server + \-dispose method layer disposal method + \-dither method apply error diffusion to image + \-draw string annotate the image with a graphic primitive + \-encoding type text encoding type + \-endian type endianness (MSB or LSB) of the image + \-extract geometry extract area from image + \-fill color color to use when filling a graphic primitive + \-filter type use this filter when resizing an image + \-font name render text with this font + \-format "string" output formatted image characteristics + \-gamma value level of gamma correction + \-geometry geometry preferred tile and border sizes + \-gravity direction which direction to gravitate towards + \-green-primary point chromaticity green primary point + \-identify identify the format and characteristics of the image + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-kerning value set the space between two letters + \-label string assign a label to an image + \-limit type value pixel cache resource limit + \-matte store matte channel if the image has one + \-mattecolor color frame color + \-mode type framing style + \-monitor monitor progress + \-origin geometry image origin + \-page geometry size and location of an image canvas (setting) + \-pointsize value font point size + \-profile filename add, delete, or apply an image profile + \-quality value JPEG/MIFF/PNG compression level + \-quantize colorspace reduce colors in this colorspace + \-quiet suppress all warning messages + \-red-primary point chromaticity red primary point + \-regard-warnings pay attention to warning messages + \-repage geometry size and location of an image canvas (operator) + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-scenes range image scene range + \-seed value seed a new sequence of pseudo-random numbers + \-set attribute value set an image attribute + \-shadow add a shadow beneath a tile to simulate depth + \-size geometry width and height of image + \-stroke color color to use when stroking a graphic primitive + \-support factor resize support: > 1.0 is blurry, < 1.0 is sharp + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-texture filename name of texture to tile onto the image background + \-thumbnail geometry create a thumbnail of the image + \-tile geometry number of tiles per row and column + \-title string decorate the montage image with a title + \-transparent-color color + transparent color + \-treedepth value color tree depth + \-trim trim image edges + \-units type the units of image resolution + \-verbose print detailed information about the image + \-virtual-pixel method + virtual pixel access method + \-white-point point chromaticity white point + +Image Operators: + \-adaptive-sharpen geometry + adaptively sharpen pixels; increase effect near edges + \-annotate geometry text + annotate the image with text + \-auto-orient automagically orient image + \-blur geometry reduce image noise and reduce detail levels + \-border geometry surround image with a border of color + \-crop geometry preferred size and location of the cropped image + \-extent geometry set the image size + \-flatten flatten a sequence of images + \-flip flip image in the vertical direction + \-flop flop image in the horizontal direction + \-frame geometry surround image with an ornamental border + \-layers method optimize or compare image layers + \-monochrome transform image to black and white + \-polaroid angle simulate a Polaroid picture + \-resize geometry resize the image + \-rotate degrees apply Paeth rotation to the image + \-scale geometry scale the image + \-strip strip image of all profiles and comments + \-transform affine transform image + \-transpose flip image vertically and rotate 90 degrees + \-transparent color make this color transparent within the image + \-type type image type + \-unsharp geometry sharpen the image + +Image Sequence Operators: + \-coalesce merge a sequence of images + \-composite composite image + +Image Stack Operators: + \-clone indexes clone an image + \-delete indexes delete the image from the image sequence + \-duplicate count,indexes + duplicate an image one or more times + \-insert index insert last image into the image sequence + \-reverse reverse image sequence + \-swap indexes swap two images in the image sequence + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +In addition to those listed above, you can specify these standard X resources as command line options: \-background, \-bordercolor, \-borderwidth, \-font, \-mattecolor, or \-title. + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/montage.c b/ImageMagick-6.9.12-44/utilities/montage.c new file mode 100644 index 0000000..6bf129d --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/montage.c @@ -0,0 +1,111 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M OOO N N TTTTT AAA GGGG EEEEE % +% MM MM O O NN N T A A G E % +% M M M O O N N N T AAAAA G GG EEE % +% M M O O N NN T A A G G E % +% M M OOO N N T A A GGGG EEEEE % +% % +% % +% Montage Magick Image File Format Image via X11. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Montage creates a composite by combining several separate images. The +% images are tiled on the composite image with the name of the image +% optionally appearing just below the individual tile. +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int MontageMain(int argc,char **argv) +{ + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + status=MagickCommandGenesis(image_info,MontageImageCommand,argc,argv, + (char **) NULL,exception); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + return(status != MagickFalse ? 0 : 1); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) +int main(int argc,char **argv) +{ + return(MontageMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=MontageMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/utilities/stream.1 b/ImageMagick-6.9.12-44/utilities/stream.1 new file mode 100644 index 0000000..75820f5 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/stream.1 @@ -0,0 +1,59 @@ +.TH stream 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +stream \- a lightweight tool to stream one or more pixel components of the image or portion of the image to your choice of storage formats. +.SH SYNOPSIS +.TP +\fBstream\fP [\fIoptions\fP] \fIinput-file\fP \fIoutput-file\fP +.SH OVERVIEW +\fBStream\fP is a lightweight tool to stream one or more pixel components of the image or portion of the image to your choice of storage formats. It writes the pixel components as they are read from the input image a row at a time making \fBstream\fP desirable when working with large images or when you require raw pixel components. + +For more information about the stream command, point your browser to file:///usr/share/doc/ImageMagick-6/www/stream.html or http://imagemagick.org/script/stream.php. +.SH DESCRIPTION +Image Settings: + \-authenticate value decrypt image with this password + \-channel type apply option to select image channels + \-colorspace type alternate image colorspace + \-compress type type of pixel compression when writing the image + \-define format:option + define one or more image format options + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-extract geometry extract area from image + \-identify identify the format and characteristics of the image + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-limit type value pixel cache resource limit + \-map components one or more pixel components + \-monitor monitor progress + \-quantize colorspace reduce colors in this colorspace + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-seed value seed a new sequence of pseudo-random numbers + \-set attribute value set an image attribute + \-size geometry width and height of image + \-storage-type type pixel storage type + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-transparent-color color + transparent color + \-verbose print detailed information about the image + \-virtual-pixel method + virtual pixel access method + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file:///usr/share/doc/ImageMagick-6/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/stream.1.in b/ImageMagick-6.9.12-44/utilities/stream.1.in new file mode 100644 index 0000000..b5f6971 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/stream.1.in @@ -0,0 +1,59 @@ +.TH stream 1 "Date: 2009/01/10 01:00:00" "ImageMagick" +.SH NAME +stream \- a lightweight tool to stream one or more pixel components of the image or portion of the image to your choice of storage formats. +.SH SYNOPSIS +.TP +\fBstream\fP [\fIoptions\fP] \fIinput-file\fP \fIoutput-file\fP +.SH OVERVIEW +\fBStream\fP is a lightweight tool to stream one or more pixel components of the image or portion of the image to your choice of storage formats. It writes the pixel components as they are read from the input image a row at a time making \fBstream\fP desirable when working with large images or when you require raw pixel components. + +For more information about the stream command, point your browser to file://@DOCUMENTATION_PATH@/www/stream.html or http://imagemagick.org/script/stream.php. +.SH DESCRIPTION +Image Settings: + \-authenticate value decrypt image with this password + \-channel type apply option to select image channels + \-colorspace type alternate image colorspace + \-compress type type of pixel compression when writing the image + \-define format:option + define one or more image format options + \-density geometry horizontal and vertical density of the image + \-depth value image depth + \-extract geometry extract area from image + \-identify identify the format and characteristics of the image + \-interlace type type of image interlacing scheme + \-interpolate method pixel color interpolation method + \-limit type value pixel cache resource limit + \-map components one or more pixel components + \-monitor monitor progress + \-quantize colorspace reduce colors in this colorspace + \-quiet suppress all warning messages + \-regard-warnings pay attention to warning messages + \-respect-parentheses settings remain in effect until parenthesis boundary + \-sampling-factor geometry + horizontal and vertical sampling factor + \-seed value seed a new sequence of pseudo-random numbers + \-set attribute value set an image attribute + \-size geometry width and height of image + \-storage-type type pixel storage type + \-synchronize synchronize image to storage device + \-taint declare the image as modified + \-transparent-color color + transparent color + \-verbose print detailed information about the image + \-virtual-pixel method + virtual pixel access method + +Miscellaneous Options: + \-debug events display copious debugging information + \-help print program options + \-log format format of debugging information + \-list type print a list of supported option arguments + \-version print version information + +By default, the image format of `file' is determined by its magic number. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +.SH SEE ALSO +ImageMagick(1) + +.SH COPYRIGHT + +\fBCopyright (C) 1999-2021 ImageMagick Studio LLC. Additional copyrights and licenses apply to this software, see file://@DOCUMENTATION_PATH@/www/license.html or http://imagemagick.org/script/license.php\fP diff --git a/ImageMagick-6.9.12-44/utilities/stream.c b/ImageMagick-6.9.12-44/utilities/stream.c new file mode 100644 index 0000000..a9bc651 --- /dev/null +++ b/ImageMagick-6.9.12-44/utilities/stream.c @@ -0,0 +1,111 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS TTTTT RRRR EEEEE AAA M M % +% SS T R R E A A MM MM % +% SSS T RRRR EEE AAAAA M M M % +% SS T R R E A A M M % +% SSSSS T R R EEEEE A A M M % +% % +% % +% Stream image to a raw image format. % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Stream is a lightweight utility designed to extract pixels from large image +% files to a raw format using a minimum of system resources. The entire +% image or any regular portion of the image can be extracted. +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +static int StreamMain(int argc,char **argv) +{ + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + MagickBooleanType + status; + + MagickCoreGenesis(*argv,MagickTrue); + MagickWandGenesis(); + exception=AcquireExceptionInfo(); + image_info=AcquireImageInfo(); + status=MagickCommandGenesis(image_info,StreamImageCommand,argc,argv, + (char **) NULL,exception); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickWandTerminus(); + MagickCoreTerminus(); + return(status != MagickFalse ? 0 : 1); +} + +#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) +int main(int argc,char **argv) +{ + return(StreamMain(argc,argv)); +} +#else +int wmain(int argc,wchar_t *argv[]) +{ + char + **utf8; + + int + status; + + int + i; + + utf8=NTArgvToUTF8(argc,argv); + status=StreamMain(argc,utf8); + for (i=0; i < argc; i++) + utf8[i]=DestroyString(utf8[i]); + utf8=(char **) RelinquishMagickMemory(utf8); + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/wand/ChangeLog b/ImageMagick-6.9.12-44/wand/ChangeLog new file mode 100644 index 0000000..c16d885 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/ChangeLog @@ -0,0 +1,351 @@ +2012-07-30 6.7.8-7 Cristy + * Add MagickOptimizeImageTransparency() method. + +2012-03-18 6.7.6-1 Anthony + * Add MagickCompositeLayers() to allow you to compose two magick wands + +2012-03-15 6.7.6-1 Anthony + * Rename wand iteration flags to more logical names + * Fix the MagickWand add/read insertion of new images into wands + +2010-11-21 6.6.6-0 Cristy + * Add DrawGetFontResolution() / DrawSetFontResolution(). + +2009-10-10 6.5.6-10 Cristy + * Add MagickSetImageArtifact(), etc. Wand artifacts are like properties + except they are not exported. They are needed for some method such + as setting compose:args for the composite DisplaceCompositeOp compose + operator. + +2009-08-27 6.5.5-3 Cristy + * Added MagickSetOpacity/MagickGetOpacity. + +2009-07-27 6.5.4-7 Cristy + * Added MagickSetBorderColor/MagickGetBorderColor. + +2009-04-27 6.5.1-9 Cristy + * Added MagickSetImageFuzz/MagickGetImageFuzz. + +2009-03-08 6.4.9-10 Mikko + * Added DrawGet/SetTextKerning and DrawGet/SetInterWordSpacing. + +2008-11-27 6.4.6-7 Cristy + * MagickSetVirtualPixelMethod() now properly sets and returns the + virtual pixel method. + +2008-11-03 6.4.5-4 Cristy + * Do not filter drawing commands. + +2008-10-27 6.4.5-1 Cristy + * Add MagickSparseColorImage() API method. + +2008-02-23 6.3.9-0 Cristy + * Patch MagickReadImageBlob() to support Postscript which does not have + native blob support. + +2008-01-28 6.3.8-3 Cristy + * Return wand->images->depth for MagickGetImageDepth(); + +2008-01-10 6.3.7-10 Cristy + * Inherit image exception *before* destroying the cloned image (reference + http://imagemagick.org/discourse-server/viewtopic.php?f=3&t=10415). + +2007-11-27 6.3.7-2 Cristy + * Fix memory leak in MagickSetImageProfile() (reference + https://imagemagick.org/discourse-server/viewtopic.php?f=1&t=10197). + +2007-11-06 6.3.6-10 Cristy + * New MagickSetImageAlphaChannel() method to activate, deactivate, reset, or + set the image alpha channel. + +2007-10-27 6.3.6-4 Cristy + * Added get/set font and pointsize methods to magick-property.c (reference + http://imagemagick.org/discourse-server/viewtopic.php?f=6&t=9997). + +2007-09-10 6.3.5-9 Cristy + * Added MagickGetImageProperties(), MagickGetImageOptions(), and + MagickGetImageProfiles() methods. + +2007-07-18 6.3.5-3 Cristy + * Clone profile before returning from MagickRemoveImageProfile(). + +2007-07-16 6.3.5-2 Cristy + * Add MagickGetType() method. + * Fix MagickAddImage() relative to the iterator offset (reference + http://imagemagick.org/discourse-server/viewtopic.php?f=3&t=9218). + +2007-05-23 6.3.4-5 Cristy + * * Add MagickPaintFloodfillImage() method. + +2007-04-18 6.3.3-9 Kwon + * Fixed small memory leak in RelinquishWandId(). + +2007-02-24 6.3.3-0 Cristy + * Add MagickResetImagePage() to reset the image page canvas and position. + +2007-01-16 6.3.2-0 Cristy + * Added methods MagickGetAntialias(), MagickSetAntialias(), + MagickGetInterpolateMethod(), and MagickSetInterpolateMethod(). + +2007-01-08 6.3.1-7 Cristy + * MagickOrtderedPosterizeImage() performs an ordered dither based on a number + of pre-defined dithering threshold maps, but over multiple intensity levels, + which can be different for different channels, according to the input + arguments. + * Added MagickSetImageClipMask(), MagickGetImageClipMask() methods. + * Add MagickSetImageProperty()/MagickGetImageProperty() and deprecate + MagickSetImageAttribute()/MagickGetImageAttribute(). + +2006-10-12 6.3.0-1 Cristy + * MagickSetImageColormapColor() now properly sync the image colormap. + * Add MagickGetImageInterpolateMethod() and MagickSetImageInterpolateMethod(). + +2006-06-26 6.2.8-6 Cristy + * DrawSetFillRule() no longer emits an improper MVG command. + +2006-06-26 6.2.8-0 Cristy + * Fixed small memory leak in ClearDrawingWand(). + +2006-05-10 6.2.7-6 Cristy + * Add MagickSegmentImage() method to API. + +2005-12-31 Cristy + * Opacity value not being returned by PixelGetColorAsString() / + PixelGetColorAsNormalizedString() correctly (bug report by O. Watson). + +2005-12-28 Cristy + * DrawSetGravity() actually sets the gravity when ForgetGravity is + specified (bug report by O. Watson). + * Added MagickSetIteratorIndex() and MagickGetIteratorIndex() and + deprecated MagickSetImageIndex() and MagickGetImageIndex(). + +2005-12-21 Cristy + * PixelSyncIterator() promotes PseudoClass images to DirectClass (bug + report by O. Watson). + * Fix PixelGetIteratorRow() to return the correct image row. + +2005-12-11 Cristy + * Add PixelGetIteratorRow() and PixelGetCurrentIteratorRow() methods + (suggested by O. Watson). + * Add PixelGetColorAsNormalizedString() method (suggested by O. Watson). + +2005-11-14 Cristy + * Add MagickSigmoidalContrastImage() method. + * Set the pixel depth in MagickSetPixelColor(). + +2005-10-28 Cristy + * Add MagickRandomThresholdImage(), MagickRandomThresholdImageChannel(), + and MagickShadeImage() (suggested by O. Watson). + +2005-10-18 Cristy + * PixelGetQuantumColor() automatically converts CMYK pixel wands to RGB. + * Add DrawResetVectorGraphics() method to reset the vector graphics but not + the drawing attributes. + +2005-09-20 Cristy + * Do not inherit base opacity when setting fill/stroke color. + +2005-09-10 Cristy + * Added MagickGetImageTicksPerSecond() and MagickSetImageTicksPerSecond(). + * Added MagickGetMagickResource(). + * Added MagickThumbnaiImage(). + +2005-09-01 Cristy + * DrawSetStrokeDashArray() no longer faults for an array of one element + (bug report by O. Watson). + +2005-08-24 Cristy + * Add MagickWandGenesis() and MagickWandTermnus() methods. + +2005-08-06 Cristy + * Add MagickSetImageExtent() method. + * Add MagickSetType() method. + +2005-06-15 Cristy + * Add MagickClearException() to wand/magick-wand.h. + +2005-06-15 Cristy + * DrawGetFillOpacity() and DrawSetFillOpacity() were setting alpha values + rather than opacity. Note, both of these methods are deprecated. + * Added MagickSetImageProgressMonitor() to monitor the progress of a specific + image. + +2005-06-07 Cristy + * Initialize pixel iterator ID in NewPixelRegionIterator (bug report by + O. Watson). + * Add MagickGetImagePixelColor() method (suggested by O. Watson). + +2005-06-01 Cristy + * Added methods PixelSetFirstIteratorRow(), PixelSetLastIteratorRow(), + and IsPixelWandSimilar(). + +2005-05-28 Cristy + * MagickGetImageTotalInkDensity() returns the total ink density for an image. + +2005-05-16 Cristy + * Add MagickSetPage() and MagickSetImagePage() methods. + +2005-05-10 Cristy + * CloneDrawingWand() no longer faults when the supplied drawing wand has not + been initialized. + +2005-05-08 Cristy + * MagickGetImageCompressionQuality() properly returns the image compression + quality. Previously it returned the wand compression quality. + +2005-04-29 Cristy + * PixelSetYellowQuantum() now sets the correct color component. + * Add MagickSetBackgroundColor() method to set the wand's background color + attribute. + +2005-04-14 Cristy + * Inherit exception when MagickWriteImageFile() fails. + +2005-04-11 Cristy + * Added MagickRegionOfInterestImage() to return a region of an image as a + new wand. + +2005-04-10 Cristy + * Throw exception if fdopen() fails in + MagickWriteImageFile()/MagickReadImageFile() methods. + +2005-03-22 Cristy + * Added MagickSigmoidalContrastImage() for sigmoidal non-linearity contrast + control. + +2005-03-10 Chris Madison + * Added the MagickSepiaToneImage() method to simulate a sepia-toned photo. + +2004-03-05 Chris Madison + * Add MagickGetImageAttribute() method. + +2005-02-15 Peter Seiderer + * Avoid an assert by checking the return from GetImageFromMagickWand(0. + +2005-01-19 Cristy + * Permit NULL for MagickSetFilename() & MagickSetImageFilename(). + +2005-01-10 Cristy + * Permit NULL for MagickSetFormat() & MagickSetImageFormat(). + +2004-12-15 Cristy + * Added ClearMagickWand(), ClearPixelIterator(), ClearPixelWand() and + ClearDrawingWand() methods. + +2004-12-10 Cristy + * Set the vector graphics length in DrawSetVectorGraphics() (bug report from + O. Watson). + +2004-12-09 Cristy + * Classic off-by-one patch for CloneDrawingWand() (bug report from O. Watson). + +2004-12-08 Cristy + * DrawGetStrokeOpacity() just calls DrawGetStrokeAlpha(); it is supposed to + return the stroke color's opacity, not the alpha (problem reports from O. + Watson). + +2004-12-07 Cristy + * Fixed problem reports from O. Watson: + 1) If the format of an image is not set, the BLOB returned by + MagickGetImageBlob() will be empty, but no MagickWand error condition + is ever set. + 2) If the MagickWand's image sequence's format if set (via + MagickSetFormat()), but the image formats of individual images are not + set, any attempt to retrieve the sequence's image BLOB still fails + (i.e. via MagickGetImagesBlob()). If the MagickWand's image format + has been set, the API should use that format as the exclusive format + for the returned BLOB. + 3) When the situation in #2 above occurs, no error condition is + set. If the problem mentioned in #2 is fixed, an error condition + should be set if there is nothing (no format or no filename), from + which the API can determine the image format in which it should + return the BLOB. + 4) Even though the MagickWand's image format has been set, when each + individual image's format/filename is empty, MagickWriteImagesFile() + sets the following error: + + no encode delegate for this image format 'filename.ext.0' + + where "filename.ext" was the name of the file on which the filehandle + was opened. The format of the MagickWand (if it is set). should + suffice as the desired encoding delegate. + +2004-11-18 Cristy + * Added MagickNewImage() adds a blank image canvas of the specified size and + background color to the wand. + +2004-11-15 Cristy + * Added MagickGetInterlaceScheme() to correspond to + MagickSetInterlaceScheme(). + +2004-11-06 Cristy + * GNS contributed MagickQueryMultilineFontMetrics(). Its like + MagickQueryFontMetrics() but returns the maximum text width and height for + multiple lines of text. + +2004-11-04 Cristy + * MagickReadImageBlob() and MagickReadImageFile() calls GetFirstImageInList(), + previously GetLastImageInList(). + +2004-10-28 Cristy + * MagickTrimImage() was not properly trimmming the image. + +2004-10-27 Cristy + * Added DrawSetTextAlignment() and DrawGetTextAlignment() methods (suggested + by Daniel Jackson). + +2004-10-25 Cristy + * Verify the Wand QuantumDepth matches that of the ImageMagick core API. + * Added MagickSetAdjoin() and MagickSetImageAdjoin() methods. + +2004-10-17 Cristy + * Added the MagickGetImagesBlob() method to turn an image sequence into a + blob. + +2004-10-14 Cristy + * Added methods MagickClearException(), DrawClearException(), + PixelClearException(), and PixelClearIteratorException(). + +2004-10-12 Cristy + * Add DrawGetVectorGraphics()/DrawSetVectorGraphics()/methods as a way to + persist the vector graphics state. + +2004-09-30 Cristy + * Add new MagickQueryConfigureOption() method to return a valur associated + with a particular option. + +2004-09-29 Cristy + * Return an error if MagickSetImageIndex() requests a bogus image index. + * MagickWriteImages(): default to a reasonable filename when no filename is + provided. + +2004-09-28 Cristy + * Add new CloneDrawingWand() method. + +2004-09-15 Cristy + * If the filename parameter of MagickWriteImage() is NULL, use the existing + filename. + +2004-09-13 Chris Madison + * DestroyMagickWand() was previous void, now it returns (MagickWand *) NULL + to force the wand to a known value and to detect logic errors in the program + (any reference to the wand after it is destroyed will cause a fault). + Other destroy methods will be changed in this manner as well. Note, + this change will not affect existing programs that rely on these methods. + +2004-09-11 Cristy + * Relinquish pixel iterator ID to prevent small memory leak. + +2004-09-08 Cristy + * Add MagickSetResolution(), required to render Postscript at a density + other than the default (e.g. 72dpi). + +2004-09-03 Cristy + * Add IsMagickWand(), IsDrawingWand(), IsPixelWand(), and IsPixelIterator() + methods. + * Convert several drawing wand methods from void to MagickBooleanType so + they return MagickFalse if an error occurs (e.g. DrawComposite()). + +2004-08-28 Cristy + * We now export the DrawComposite() drawing wand method as a public method. + Previously it was private. diff --git a/ImageMagick-6.9.12-44/wand/MagickWand-config.1 b/ImageMagick-6.9.12-44/wand/MagickWand-config.1 new file mode 100644 index 0000000..96ba382 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/MagickWand-config.1 @@ -0,0 +1,69 @@ +.ad l +.nh +.TH MagickWand-Config 1 "2 May 2002" "Wand" +.SH NAME +MagickWand-config \- get information about the installed version of the Magick Wand +.SH SYNOPSIS +.B MagickWand-config +.B [--cflags] +.B [--cppflags] +.B [--exec-prefix] +.B [--ldflags] +.B [--libs] +.B [--prefix] +.B [--version] +.SH DESCRIPTION +.B MagickWand-config +prints the compiler and linker flags required to compile and link programs +that use the +.BR Wand +Application Programmer Interface. +.SH EXAMPLES +To print the version of the installed distribution of +.BR Wand , +use: + +.nf + MagickWand-config \-\-version +.fi + +To compile a program that calls the +.BR Wand +Application Programmer Interface, use: + +.nf + cc `MagickWand-config \-\-cflags \-\-cppflags \-\-ldflags \-\-libs` program.c +.fi + +.SH OPTIONS +.TP +.B \-\-cflags +Print the compiler flags that were used to compile +.BR libWand . +.TP +.B \-\-cppflags +Print the preprocessor flags that are needed to find the +.B Wand +C include files and defines to ensure that the Wand data structures match between +your program and the installed libraries. +.TP +.B \-\-exec-prefix +Print the directory under which target specific binaries and executables are installed. +.TP +.B \-\-ldflags +Print the linker flags that are needed to link with the +.B Wand +library. +.TP +.B \-\-libs +Print the linker flags that are needed to link a program with +.BR libWand . +.TP +.B \-\-version +Print the version of the +.B Wand +distribution to standard output. +.SH COPYRIGHT +See http://imagemagick.org/script/license.php +.SH AUTHORS +Cristy, ImageMagick Studio LLC diff --git a/ImageMagick-6.9.12-44/wand/MagickWand-config.in b/ImageMagick-6.9.12-44/wand/MagickWand-config.in new file mode 100644 index 0000000..b2e1ca8 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/MagickWand-config.in @@ -0,0 +1,62 @@ +#!/bin/sh +# +# Configure options script for re-calling MagickWand compilation options +# required to use the MagickWand library. +# + +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +usage="\ +Usage: MagickWand-config [--cflags] [--cppflags] [--exec-prefix] [--ldflags] [--libs] [--prefix] [--version]" + +if test $# -eq 0; then + echo "${usage}" 1>&2 + echo "Example: gcc \`MagickWand-config --cflags --cppflags\` -o wand wand.c \`MagickWand-config --ldflags --libs\`" 1>&2 + exit 1 +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + case $1 in + --prefix=*) + prefix=$optarg + ;; + --prefix) + echo $prefix + ;; + --exec-prefix=*) + exec_prefix=$optarg + ;; + --exec-prefix) + echo $exec_prefix + ;; + --version) + echo '@PACKAGE_VERSION@ Q@QUANTUM_DEPTH@ @MAGICK_HDRI@' + ;; + --cflags) + @PKG_CONFIG@ --cflags MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --cxxflags) + @PKG_CONFIG@ --cflags MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --cppflags) + @PKG_CONFIG@ --cflags MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --ldflags) + @PKG_CONFIG@ --libs MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + --libs) + @PKG_CONFIG@ --libs MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + ;; + *) + echo "${usage}" 1>&2 + exit 1 + ;; + esac + shift +done + diff --git a/ImageMagick-6.9.12-44/wand/MagickWand.h b/ImageMagick-6.9.12-44/wand/MagickWand.h new file mode 100644 index 0000000..bc31b21 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/MagickWand.h @@ -0,0 +1,131 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand Application Programming Interface declarations. +*/ + +#ifndef _MAGICK_WAND_H +#define _MAGICK_WAND_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if !defined(MAGICKWAND_CONFIG_H) +# define MAGICKWAND_CONFIG_H +# if !defined(vms) && !defined(macintosh) +# include "magick/magick-config.h" +# else +# include "magick-config.h" +# endif +#if defined(_magickcore_const) && !defined(const) +# define const _magickcore_const +#endif +#if defined(_magickcore_inline) && !defined(inline) +# define inline _magickcore_inline +#endif +#if !defined(magick_restrict) +# if !defined(_magickcore_restrict) +# define magick_restrict restrict +# else +# define magick_restrict _magickcore_restrict +# endif +#endif +# if defined(__cplusplus) || defined(c_plusplus) +# undef inline +# endif +#endif + +#define MAGICKWAND_CHECK_VERSION(major,minor,micro) \ + ((MAGICKWAND_MAJOR_VERSION > (major)) || \ + ((MAGICKWAND_MAJOR_VERSION == (major)) && \ + (MAGICKWAND_MINOR_VERSION > (minor))) || \ + ((MAGICKWAND_MAJOR_VERSION == (major)) && \ + (MAGICKWAND_MINOR_VERSION == (minor)) && \ + (MAGICKWAND_MICRO_VERSION >= (micro)))) + +#include +#include +#include +#include +#include +#include +#include + +#if defined(WIN32) || defined(WIN64) +# define MAGICKWAND_WINDOWS_SUPPORT +#else +# define MAGICKWAND_POSIX_SUPPORT +#endif + +typedef struct _MagickWand + MagickWand; + +#include "wand/method-attribute.h" +#include "magick/MagickCore.h" +#include "wand/animate.h" +#include "wand/compare.h" +#include "wand/composite.h" +#include "wand/conjure.h" +#include "wand/convert.h" +#include "wand/deprecate.h" +#include "wand/display.h" +#include "wand/drawing-wand.h" +#include "wand/identify.h" +#include "wand/import.h" +#include "wand/magick-property.h" +#include "wand/magick-image.h" +#include "wand/mogrify.h" +#include "wand/montage.h" +#include "wand/pixel-iterator.h" +#include "wand/pixel-wand.h" +#include "wand/stream.h" +#include "wand/wand-view.h" + +extern WandExport char + *MagickGetException(const MagickWand *,ExceptionType *); + +extern WandExport ExceptionType + MagickGetExceptionType(const MagickWand *); + +extern WandExport MagickBooleanType + IsMagickWand(const MagickWand *), + IsMagickWandInstantiated(void), + MagickClearException(MagickWand *), + MagickSetIteratorIndex(MagickWand *,const ssize_t); + +extern WandExport MagickWand + *CloneMagickWand(const MagickWand *), + *DestroyMagickWand(MagickWand *), + *NewMagickWand(void), + *NewMagickWandFromImage(const Image *); + +extern WandExport ssize_t + MagickGetIteratorIndex(MagickWand *); + +extern WandExport void + ClearMagickWand(MagickWand *), + MagickWandGenesis(void), + MagickWandTerminus(void), + *MagickRelinquishMemory(void *), + MagickResetIterator(MagickWand *), + MagickSetFirstIterator(MagickWand *), + MagickSetLastIterator(MagickWand *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/MagickWand.pc.in b/ImageMagick-6.9.12-44/wand/MagickWand.pc.in new file mode 100644 index 0000000..78f15b0 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/MagickWand.pc.in @@ -0,0 +1,15 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/ImageMagick-@MAGICK_MAJOR_VERSION@ +includearchdir=@INCLUDEARCH_DIR@/ImageMagick-@MAGICK_MAJOR_VERSION@ +libname=MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + +Name: MagickWand +Description: MagickWand - C API for ImageMagick (ABI @MAGICK_ABI_SUFFIX@) +URL: https://github.com/ImageMagick/ImageMagick6 +Version: @PACKAGE_BASE_VERSION@ +Requires: MagickCore-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ +Cflags: -I${includearchdir} -I${includedir} @MAGICK_PCFLAGS@ +Libs: -L${libdir} -l${libname} +Libs.private: -L${libdir} -l${libname} @MAGICK_LIBS@ @MATH_LIBS@ diff --git a/ImageMagick-6.9.12-44/wand/Makefile.am b/ImageMagick-6.9.12-44/wand/Makefile.am new file mode 100644 index 0000000..765f2ae --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/Makefile.am @@ -0,0 +1,146 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# http://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Makefile for building MagickWand API. +# + +wandincdir = $(INCLUDE_PATH)/wand + +WAND_CPPFLAGS = $(AM_CPPFLAGS) + +WAND_SOURCES = \ + wand/MagickWand.h \ + wand/animate.c \ + wand/animate.h \ + wand/compare.c \ + wand/compare.h \ + wand/composite.c \ + wand/composite.h \ + wand/conjure.c \ + wand/conjure.h \ + wand/convert.c \ + wand/convert.h \ + wand/deprecate.h \ + wand/deprecate.c \ + wand/display.c \ + wand/display.h \ + wand/drawing-wand.c \ + wand/drawing-wand.h \ + wand/identify.c \ + wand/identify.h \ + wand/import.c \ + wand/import.h \ + wand/magick-image.c \ + wand/magick-image.h \ + wand/magick-property.c \ + wand/magick-property.h \ + wand/magick-wand.c \ + wand/magick-wand.h \ + wand/magick-wand-private.h \ + wand/method-attribute.h \ + wand/mogrify.c \ + wand/mogrify.h \ + wand/mogrify-private.h \ + wand/montage.c \ + wand/montage.h \ + wand/pixel-iterator.c \ + wand/pixel-iterator.h \ + wand/pixel-wand.c \ + wand/pixel-wand.h \ + wand/pixel-wand-private.h \ + wand/stream.c \ + wand/stream.h \ + wand/studio.h \ + wand/wand.c \ + wand/wand.h \ + wand/wand-view.c \ + wand/wand-view.h + +WAND_INCLUDE_HDRS = \ + wand/MagickWand.h \ + wand/animate.h \ + wand/compare.h \ + wand/composite.h \ + wand/conjure.h \ + wand/convert.h \ + wand/deprecate.h \ + wand/display.h \ + wand/drawing-wand.h \ + wand/identify.h \ + wand/import.h \ + wand/magick-image.h \ + wand/magick-property.h \ + wand/magick-wand.h \ + wand/magick_wand.h \ + wand/method-attribute.h \ + wand/mogrify.h \ + wand/montage.h \ + wand/pixel-iterator.h \ + wand/pixel-wand.h \ + wand/stream.h \ + wand/wand-view.h + +WAND_NOINST_HDRS = \ + wand/mogrify-private.h \ + wand/magick-wand-private.h \ + wand/pixel-wand-private.h \ + wand/studio.h \ + wand/wand.h + +# Headers which are installed +wandinc_HEADERS = \ + $(WAND_INCLUDE_HDRS) + +WAND_BIN_SCRPTS = \ + wand/Wand-config \ + wand/MagickWand-config + +WAND_PKGCONFIG = \ + wand/MagickWand.pc \ + wand/Wand.pc \ + wand/MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc \ + wand/Wand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.pc + +WAND_MANS = \ + wand/MagickWand-config.1 \ + wand/Wand-config.1 + +WAND_BUILT_SRCS = + +MAGICKWAND_LIBS = wand/libMagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@.la + +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_SOURCES = $(WAND_SOURCES) +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_CPPFLAGS = $(WAND_CPPFLAGS) $(LIBRARY_EXTRA_CPPFLAGS) + +if HAVE_LD_VERSION_SCRIPT +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -Wl,--version-script=$(top_srcdir)/wand/libMagickWand.map +else +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS_VERSION = -export-symbols-regex ".*" +endif + +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LDFLAGS = -no-undefined \ + $(wand_libMagickWand_la_LDFLAGS_VERSION) $(MAGICK_LT_RELEASE_OPTS) \ + -version-info \ + $(MAGICK_LIBRARY_CURRENT):$(MAGICK_LIBRARY_REVISION):$(MAGICK_LIBRARY_AGE) +wand_libMagickWand_@MAGICK_MAJOR_VERSION@_@MAGICK_ABI_SUFFIX@_la_LIBADD = $(MAGICKCORE_LIBS) $(X11_LIBS) $(GOMP_LIBS) $(MATH_LIBS) + +WAND_EXTRA_DIST = \ + wand/ChangeLog \ + wand/libMagickWand.map \ + wand/MagickWand-config.1 \ + wand/MagickWand.pc.in \ + wand/Wand-config.1 \ + wand/Wand.pc.in + +WAND_CLEANFILES = diff --git a/ImageMagick-6.9.12-44/wand/Wand-config.1 b/ImageMagick-6.9.12-44/wand/Wand-config.1 new file mode 100644 index 0000000..58810da --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/Wand-config.1 @@ -0,0 +1,69 @@ +.ad l +.nh +.TH Wand-Config 1 "2 May 2002" "Wand" +.SH NAME +Wand-config \- get information about the installed version of the Magick Wand +.SH SYNOPSIS +.B Wand-config +.B [--cflags] +.B [--cppflags] +.B [--exec-prefix] +.B [--ldflags] +.B [--libs] +.B [--prefix] +.B [--version] +.SH DESCRIPTION +.B Wand-config +prints the compiler and linker flags required to compile and link programs +that use the +.BR Wand +Application Programmer Interface. +.SH EXAMPLES +To print the version of the installed distribution of +.BR Wand , +use: + +.nf + Wand-config \-\-version +.fi + +To compile a program that calls the +.BR Wand +Application Programmer Interface, use: + +.nf + cc `Wand-config \-\-cflags \-\-cppflags \-\-ldflags \-\-libs` program.c +.fi + +.SH OPTIONS +.TP +.B \-\-cflags +Print the compiler flags that were used to compile +.BR libWand . +.TP +.B \-\-cppflags +Print the preprocessor flags that are needed to find the +.B Wand +C include files and defines to ensure that the Wand data structures match between +your program and the installed libraries. +.TP +.B \-\-exec-prefix +Print the directory under which target specific binaries and executables are installed. +.TP +.B \-\-ldflags +Print the linker flags that are needed to link with the +.B Wand +library. +.TP +.B \-\-libs +Print the linker flags that are needed to link a program with +.BR libWand . +.TP +.B \-\-version +Print the version of the +.B Wand +distribution to standard output. +.SH COPYRIGHT +See http://imagemagick.org/script/license.php +.SH AUTHORS +Cristy, ImageMagick Studio LLC diff --git a/ImageMagick-6.9.12-44/wand/Wand-config.in b/ImageMagick-6.9.12-44/wand/Wand-config.in new file mode 100644 index 0000000..024700f --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/Wand-config.in @@ -0,0 +1,62 @@ +#!/bin/sh +# +# Configure options script for re-calling MagickWand compilation options +# required to use the MagickWand library. +# + +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +usage="\ +Usage: Wand-config [--cflags] [--cppflags] [--exec-prefix] [--ldflags] [--libs] [--prefix] [--version]" + +if test $# -eq 0; then + echo "${usage}" 1>&2 + echo "Example: gcc \`Wand-config --cflags --cppflags\` -o wand wand.c \`Wand-config --ldflags --libs\`" 1>&2 + exit 1 +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + case $1 in + --prefix=*) + prefix=$optarg + ;; + --prefix) + echo $prefix + ;; + --exec-prefix=*) + exec_prefix=$optarg + ;; + --exec-prefix) + echo $exec_prefix + ;; + --version) + echo '@PACKAGE_VERSION@ Q@QUANTUM_DEPTH@ @MAGICK_HDRI@' + ;; + --cflags) + @PKG_CONFIG@ --cflags MagickWand + ;; + --cxxflags) + @PKG_CONFIG@ --cflags MagickWand + ;; + --cppflags) + @PKG_CONFIG@ --cflags MagickWand + ;; + --ldflags) + @PKG_CONFIG@ --libs MagickWand + ;; + --libs) + @PKG_CONFIG@ --libs MagickWand + ;; + *) + echo "${usage}" 1>&2 + exit 1 + ;; + esac + shift +done + diff --git a/ImageMagick-6.9.12-44/wand/Wand.pc.in b/ImageMagick-6.9.12-44/wand/Wand.pc.in new file mode 100644 index 0000000..75e8c60 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/Wand.pc.in @@ -0,0 +1,15 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/ImageMagick-@MAGICK_MAJOR_VERSION@ +includearchdir=@INCLUDEARCH_DIR@/ImageMagick-@MAGICK_MAJOR_VERSION@ +libname=MagickWand-@MAGICK_MAJOR_VERSION@.@MAGICK_ABI_SUFFIX@ + +Name: MagickWand +Description: MagickCore - C API for ImageMagick (ABI @MAGICK_ABI_SUFFIX@) +URL: https://github.com/ImageMagick/ImageMagick6 +Version: @PACKAGE_VERSION@ +Requires: MagickCore +Cflags: -I${includearchdir} -I${includedir} @MAGICK_PCFLAGS@ +Libs: -L${libdir} -l${libname} +Libs.private: -L${libdir} -l${libname} @MAGICK_LIBS@ @MATH_LIBS@ diff --git a/ImageMagick-6.9.12-44/wand/animate.c b/ImageMagick-6.9.12-44/wand/animate.c new file mode 100644 index 0000000..adc84d8 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/animate.c @@ -0,0 +1,1443 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% AAA N N IIIII M M AAA TTTTT EEEEE % +% A A NN N I MM MM A A T E % +% AAAAA N N N I M M M AAAAA T EEE % +% A A N NN I M M A A T E % +% A A N N IIIII M M A A T EEEEE % +% % +% % +% Methods to Interactively Animate an Image Sequence % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Use the animate program to animate an image sequence on any X server. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/mogrify-private.h" +#include "magick/animate-private.h" +#include "magick/string-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A n i m a t e I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AnimateImageCommand() displays a sequence of images on any workstation +% display running an X server. Animate first determines the hardware +% capabilities of the workstation. If the number of unique colors in an image +% is less than or equal to the number the workstation can support, the image +% is displayed in an X window. Otherwise the number of colors in the image is +% first reduced to match the color resolution of the workstation before it is +% displayed. +% +% This means that a continuous-tone 24 bits/pixel image can display on a 8 +% bit pseudo-color device or monochrome device. In most instances the reduced +% color image closely resembles the original. Alternatively, a monochrome or +% pseudo-color image sequence can display on a continuous-tone 24 bits/pixels +% device. +% +% The format of the AnimateImageCommand method is: +% +% MagickBooleanType AnimateImageCommand(ImageInfo *image_info,int argc, +% char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType AnimateUsage(void) +{ + static const char + buttons[] = + " Press any button to map or unmap the Command widget", + miscellaneous[] = + " -debug events display copious debugging information\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information\n" + " -version print version information", + operators[] = + " -colors value preferred number of colors in the image\n" + " -crop geometry preferred size and location of the cropped image\n" + " -extract geometry extract area from image\n" + " -monochrome transform image to black and white\n" + " -resample geometry change the resolution of an image\n" + " -resize geometry resize the image\n" + " -rotate degrees apply Paeth rotation to the image\n" + " -strip strip image of all profiles and comments\n" + " -thumbnail geometry create a thumbnail of the image\n" + " -trim trim image edges", + settings[] = + " -alpha option on, activate, off, deactivate, set, opaque, copy\n" + " transparent, extract, background, or shape\n" + " -authenticate password\n" + " decipher image with this password\n" + " -backdrop display image centered on a backdrop\n" + " -channel type apply option to select image channels\n" + " -colormap type Shared or Private\n" + " -colorspace type alternate image colorspace\n" + " -decipher filename convert cipher pixels to plain pixels\n" + " -define format:option\n" + " define one or more image format options\n" + " -delay value display the next image after pausing\n" + " -density geometry horizontal and vertical density of the image\n" + " -depth value image depth\n" + " -display server display image to this X server\n" + " -dispose method layer disposal method\n" + " -dither method apply error diffusion to image\n" + " -filter type use this filter when resizing an image\n" + " -format \"string\" output formatted image characteristics\n" + " -gamma value level of gamma correction\n" + " -geometry geometry preferred size and location of the Image window\n" + " -gravity type horizontal and vertical backdrop placement\n" + " -identify identify the format and characteristics of the image\n" + " -immutable displayed image cannot be modified\n" + " -interlace type type of image interlacing scheme\n" + " -interpolate method pixel color interpolation method\n" + " -limit type value pixel cache resource limit\n" + " -loop iterations loop images then exit\n" + " -matte store matte channel if the image has one\n" + " -map type display image using this Standard Colormap\n" + " -monitor monitor progress\n" + " -pause seconds to pause before reanimating\n" + " -page geometry size and location of an image canvas (setting)\n" + " -quantize colorspace reduce colors in this colorspace\n" + " -quiet suppress all warning messages\n" + " -regard-warnings pay attention to warning messages\n" + " -remote command execute a command in an remote display process\n" + " -repage geometry size and location of an image canvas (operator)\n" + " -respect-parentheses settings remain in effect until parenthesis boundary\n" + " -sampling-factor geometry\n" + " horizontal and vertical sampling factor\n" + " -scenes range image scene range\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -set attribute value set an image attribute\n" + " -size geometry width and height of image\n" + " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n" + " -transparent-color color\n" + " transparent color\n" + " -treedepth value color tree depth\n" + " -verbose print detailed information about the image\n" + " -visual type display image using this visual type\n" + " -virtual-pixel method\n" + " virtual pixel access method\n" + " -window id display image to background of this window", + sequence_operators[] = + " -coalesce merge a sequence of images\n" + " -flatten flatten a sequence of images"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] file [ [options ...] file ...]\n", + GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nImage Operators:\n"); + (void) puts(operators); + (void) printf("\nImage Sequence Operators:\n"); + (void) puts(sequence_operators); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf( + "\nIn addition to those listed above, you can specify these standard X\n"); + (void) printf( + "resources as command line options: -background, -bordercolor,\n"); + (void) printf( + "-borderwidth, -font, -foreground, -iconGeometry, -iconic, -name,\n"); + (void) printf("-mattecolor, -shared-memory, or -title.\n"); + (void) printf( + "\nBy default, the image format of `file' is determined by its magic\n"); + (void) printf( + "number. To specify a particular image format, precede the filename\n"); + (void) printf( + "with an image format name and a colon (i.e. ps:image) or specify the\n"); + (void) printf( + "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); + (void) printf("'-' for standard input or output.\n"); + (void) printf("\nButtons: \n"); + (void) puts(buttons); + return(MagickTrue); +} + +WandExport MagickBooleanType AnimateImageCommand(ImageInfo *image_info, + int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception) +{ +#if defined(MAGICKCORE_X11_DELEGATE) +#define DestroyAnimate() \ +{ \ + XDestroyResourceInfo(&resource_info); \ + if (display != (Display *) NULL) \ + { \ + XCloseDisplay(display); \ + display=(Display *) NULL; \ + } \ + XDestroyResourceInfo(&resource_info); \ + DestroyImageStack(); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowAnimateException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option); \ + DestroyAnimate(); \ + return(MagickFalse); \ +} +#define ThrowAnimateInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",option,argument); \ + DestroyAnimate(); \ + return(MagickFalse); \ +} + + char + *resource_value, + *server_name; + + const char + *option; + + Display + *display; + + Image + *image; + + ImageStack + image_stack[MaxImageStackDepth+1]; + + MagickBooleanType + fire, + pend, + respect_parenthesis; + + MagickStatusType + status; + + QuantizeInfo + *quantize_info; + + ssize_t + i; + + ssize_t + j, + k; + + XResourceInfo + resource_info; + + XrmDatabase + resource_database; + + wand_unreferenced(metadata); + + /* + Set defaults. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + if (argc == 2) + { + option=argv[1]; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + } + status=MagickTrue; + SetNotifyHandlers; + display=(Display *) NULL; + j=1; + k=0; + NewImageStack(); + option=(char *) NULL; + pend=MagickFalse; + respect_parenthesis=MagickFalse; + resource_database=(XrmDatabase) NULL; + (void) memset(&resource_info,0,sizeof(XResourceInfo)); + server_name=(char *) NULL; + status=MagickTrue; + /* + Check for server name specified on the command line. + */ + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowAnimateException(ResourceLimitError,"MemoryAllocationFailed", + image_info->filename); + for (i=1; i < (ssize_t) argc; i++) + { + /* + Check command line for server name. + */ + option=argv[i]; + if (IsCommandOption(option) == MagickFalse) + continue; + if (LocaleCompare("display",option+1) == 0) + { + /* + User specified server name. + */ + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + server_name=argv[i]; + } + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + DestroyAnimate(); + return(AnimateUsage()); + } + } + /* + Get user defaults from X resource database. + */ + display=XOpenDisplay(server_name); + if (display == (Display *) NULL) + ThrowAnimateException(XServerError,"UnableToOpenXServer", + XDisplayName(server_name)); + (void) XSetErrorHandler(XError); + resource_database=XGetResourceDatabase(display,GetClientName()); + XGetResourceInfo(image_info,resource_database,GetClientName(), + &resource_info); + quantize_info=resource_info.quantize_info; + image_info->density=XGetResourceInstance(resource_database,GetClientName(), + "density",(char *) NULL); + if (image_info->density == (char *) NULL) + image_info->density=XGetScreenDensity(display); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "interlace","none"); + image_info->interlace=(InterlaceType) + ParseCommandOption(MagickInterlaceOptions,MagickFalse,resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "verbose","False"); + image_info->verbose=IsMagickTrue(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "dither","True"); + quantize_info->dither=IsMagickTrue(resource_value); + /* + Parse command line. + */ + for (i=1; i <= (ssize_t) argc; i++) + { + if (i < (ssize_t) argc) + option=argv[i]; + else + if (image != (Image *) NULL) + break; + else + if (isatty(STDIN_FILENO) != MagickFalse) + option="logo:"; + else + option="-"; + if (LocaleCompare(option,"(") == 0) + { + FireImageStack(MagickFalse,MagickTrue,pend); + if (k == MaxImageStackDepth) + ThrowAnimateException(OptionError,"ParenthesisNestedTooDeeply", + option); + PushImageStack(); + continue; + } + if (LocaleCompare(option,")") == 0) + { + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + if (k == 0) + ThrowAnimateException(OptionError,"UnableToParseExpression",option); + PopImageStack(); + continue; + } + if (IsCommandOption(option) == MagickFalse) + { + const char + *filename; + + Image + *images; + + /* + Read input image. + */ + FireImageStack(MagickFalse,MagickFalse,pend); + filename=option; + if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1))) + { + option=argv[++i]; + filename=option; + } + (void) SetImageOption(image_info,"filename",filename); + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + if (image_info->ping != MagickFalse) + images=PingImages(image_info,exception); + else + images=ReadImages(image_info,exception); + status&=(images != (Image *) NULL) && + (exception->severity < ErrorException); + if (images == (Image *) NULL) + continue; + AppendImageStack(images); + continue; + } + pend=image != (Image *) NULL ? MagickTrue : MagickFalse; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("alpha",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowAnimateException(OptionError,"UnrecognizedAlphaChannelType", + argv[i]); + break; + } + if (LocaleCompare("authenticate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'b': + { + if (LocaleCompare("backdrop",option+1) == 0) + { + resource_info.backdrop=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("background",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.background_color=argv[i]; + break; + } + if (LocaleCompare("bordercolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.border_color=argv[i]; + break; + } + if (LocaleCompare("borderwidth",option+1) == 0) + { + resource_info.border_width=0; + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || (IsGeometry(argv[i]) == MagickFalse)) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.border_width=(unsigned int) + StringToUnsignedLong(argv[i]); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + ssize_t + channel; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + channel=ParseChannelOption(argv[i]); + if (channel < 0) + ThrowAnimateException(OptionError,"UnrecognizedChannelType", + argv[i]); + break; + } + if (LocaleCompare("clone",option+1) == 0) + { + Image + *clone_images; + + clone_images=image; + if (k != 0) + clone_images=image_stack[k-1].image; + if (clone_images == (Image *) NULL) + ThrowAnimateException(ImageError,"ImageSequenceRequired",option); + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + if (*option == '+') + clone_images=CloneImages(clone_images,"-1",exception); + else + { + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + clone_images=CloneImages(clone_images,argv[i],exception); + } + if (clone_images == (Image *) NULL) + ThrowAnimateException(OptionError,"NoSuchImage",option); + AppendImageStack(clone_images); + break; + } + if (LocaleCompare("coalesce",option+1) == 0) + break; + if (LocaleCompare("colormap",option+1) == 0) + { + resource_info.colormap=PrivateColormap; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.colormap=UndefinedColormap; + if (LocaleCompare("private",argv[i]) == 0) + resource_info.colormap=PrivateColormap; + if (LocaleCompare("shared",argv[i]) == 0) + resource_info.colormap=SharedColormap; + if (resource_info.colormap == UndefinedColormap) + ThrowAnimateException(OptionError,"UnrecognizedColormapType", + argv[i]); + break; + } + if (LocaleCompare("colors",option+1) == 0) + { + quantize_info->number_colors=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + quantize_info->number_colors=StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowAnimateException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("concurrent",option+1) == 0) + break; + if (LocaleCompare("crop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'd': + { + if (LocaleCompare("debug",option+1) == 0) + { + ssize_t + event; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); + if (event < 0) + ThrowAnimateException(OptionError,"UnrecognizedEventType", + argv[i]); + (void) SetLogEventMask(argv[i]); + break; + } + if (LocaleCompare("decipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (*option == '+') + { + const char + *define; + + define=GetImageOption(image_info,argv[i]); + if (define == (const char *) NULL) + ThrowAnimateException(OptionError,"NoSuchOption",argv[i]); + break; + } + break; + } + if (LocaleCompare("delay",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("density",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("display",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("dispose",option+1) == 0) + { + ssize_t + dispose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]); + if (dispose < 0) + ThrowAnimateException(OptionError,"UnrecognizedDisposeMethod", + argv[i]); + break; + } + if (LocaleCompare("dither",option+1) == 0) + { + ssize_t + method; + + quantize_info->dither=MagickFalse; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]); + if (method < 0) + ThrowAnimateException(OptionError,"UnrecognizedDitherMethod", + argv[i]); + quantize_info->dither=MagickTrue; + quantize_info->dither_method=(DitherMethod) method; + break; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'e': + { + if (LocaleCompare("extract",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'f': + { + if (LocaleCompare("filter",option+1) == 0) + { + ssize_t + filter; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]); + if (filter < 0) + ThrowAnimateException(OptionError,"UnrecognizedImageFilter", + argv[i]); + break; + } + if (LocaleCompare("flatten",option+1) == 0) + break; + if (LocaleCompare("font",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.font=XGetResourceClass(resource_database, + GetClientName(),"font",argv[i]); + break; + } + if (LocaleCompare("foreground",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.foreground_color=argv[i]; + break; + } + if (LocaleCompare("format",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'g': + { + if (LocaleCompare("gamma",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("geometry",option+1) == 0) + { + resource_info.image_geometry=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + resource_info.image_geometry=ConstantString(argv[i]); + break; + } + if (LocaleCompare("gravity",option+1) == 0) + { + ssize_t + gravity; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse, + argv[i]); + if (gravity < 0) + ThrowAnimateException(OptionError,"UnrecognizedGravityType", + argv[i]); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'h': + { + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + break; + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'i': + { + if (LocaleCompare("iconGeometry",option+1) == 0) + { + resource_info.icon_geometry=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + resource_info.icon_geometry=argv[i]; + break; + } + if (LocaleCompare("iconic",option+1) == 0) + { + resource_info.iconic=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("identify",option+1) == 0) + break; + if (LocaleCompare("immutable",option+1) == 0) + { + resource_info.immutable=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("interlace",option+1) == 0) + { + ssize_t + interlace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, + argv[i]); + if (interlace < 0) + ThrowAnimateException(OptionError,"UnrecognizedInterlaceType", + argv[i]); + break; + } + if (LocaleCompare("interpolate",option+1) == 0) + { + ssize_t + interpolate; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, + argv[i]); + if (interpolate < 0) + ThrowAnimateException(OptionError,"UnrecognizedInterpolateMethod", + argv[i]); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'l': + { + if (LocaleCompare("label",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("limit",option+1) == 0) + { + char + *p; + + double + value; + + ssize_t + resource; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource=ParseCommandOption(MagickResourceOptions,MagickFalse, + argv[i]); + if (resource < 0) + ThrowAnimateException(OptionError,"UnrecognizedResourceType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + value=StringToDouble(argv[i],&p); + (void) value; + if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); + if (list < 0) + ThrowAnimateException(OptionError,"UnrecognizedListType",argv[i]); + status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) + argv+j,exception); + DestroyAnimate(); + return(status == 0 ? MagickFalse : MagickTrue); + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || + (strchr(argv[i],'%') == (char *) NULL)) + ThrowAnimateException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("loop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'm': + { + if (LocaleCompare("map",option+1) == 0) + { + resource_info.map_type=(char *) NULL; + if (*option == '+') + break; + (void) CopyMagickString(argv[i]+1,"san",MaxTextExtent); + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.map_type=argv[i]; + break; + } + if (LocaleCompare("matte",option+1) == 0) + break; + if (LocaleCompare("mattecolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.matte_color=argv[i]; + break; + } + if (LocaleCompare("monitor",option+1) == 0) + break; + if (LocaleCompare("monochrome",option+1) == 0) + { + if (*option == '+') + break; + quantize_info->number_colors=2; + quantize_info->colorspace=GRAYColorspace; + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'n': + { + if (LocaleCompare("name",option+1) == 0) + { + resource_info.name=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.name=ConstantString(argv[i]); + break; + } + if (LocaleCompare("noop",option+1) == 0) + break; + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'p': + { + if (LocaleCompare("pause",option+1) == 0) + { + resource_info.pause=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + resource_info.pause=(unsigned int) StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("page",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("profile",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'q': + { + if (LocaleCompare("quantize",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowAnimateException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("quiet",option+1) == 0) + break; + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'r': + { + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleCompare("remote",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (XRemoteCommand(display,resource_info.window_id,argv[i]) != 0) + { + DestroyAnimate(); + return(MagickFalse); + } + i--; + break; + } + if (LocaleCompare("repage",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resample",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleNCompare("respect-parentheses",option+1,17) == 0) + { + respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("rotate",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 's': + { + if (LocaleCompare("sampling-factor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("scenes",option+1) == 0) /* deprecated */ + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("set",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("shared-memory",option+1) == 0) + { + resource_info.use_shared_memory=(*option == '-') ? MagickTrue : + MagickFalse; + break; + } + if (LocaleCompare("size",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("strip",option+1) == 0) + break; + if (LocaleCompare("support",option+1) == 0) + { + i++; /* deprecated */ + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 't': + { + if (LocaleCompare("text-font",option+1) == 0) + { + resource_info.text_font=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.text_font=XGetResourceClass(resource_database, + GetClientName(),"font",argv[i]); + break; + } + if (LocaleCompare("thumbnail",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("title",option+1) == 0) + { + resource_info.title=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.title=argv[i]; + break; + } + if (LocaleCompare("transparent-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("treedepth",option+1) == 0) + { + quantize_info->tree_depth=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowAnimateInvalidArgumentException(option,argv[i]); + quantize_info->tree_depth=StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("trim",option+1) == 0) + break; + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + break; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + break; + } + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowAnimateException(OptionError, + "UnrecognizedVirtualPixelMethod",argv[i]); + break; + } + if (LocaleCompare("visual",option+1) == 0) + { + resource_info.visual_type=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.visual_type=argv[i]; + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case 'w': + { + if (LocaleCompare("window",option+1) == 0) + { + resource_info.window_id=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowAnimateException(OptionError,"MissingArgument",option); + resource_info.window_id=argv[i]; + break; + } + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + case '?': + break; + default: + ThrowAnimateException(OptionError,"UnrecognizedOption",option); + } + fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & + FireOptionFlag) == 0 ? MagickFalse : MagickTrue; + if (fire != MagickFalse) + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + } + i--; + if (k != 0) + ThrowAnimateException(OptionError,"UnbalancedParenthesis",argv[i]); + if (image == (Image *) NULL) + ThrowAnimateException(OptionError,"MissingAnImageFilename",argv[argc-1]) + FinalizeImageSettings(image_info,image,MagickTrue); + if (image == (Image *) NULL) + ThrowAnimateException(OptionError,"MissingAnImageFilename",argv[argc-1]) + if (resource_info.window_id != (char *) NULL) + { + XAnimateBackgroundImage(display,&resource_info,image); + status&=MagickTrue; + } + else + { + Image + *animate_image; + + /* + Animate image to X server. + */ + animate_image=XAnimateImages(display,&resource_info,argv,argc,image); + while (animate_image != (Image *) NULL) + { + image=animate_image; + animate_image=XAnimateImages(display,&resource_info,argv,argc,image); + if (animate_image != image) + image=DestroyImageList(image); + } + } + DestroyAnimate(); + return(status != 0 ? MagickTrue : MagickFalse); +#else + magick_unreferenced(argc); + magick_unreferenced(argv); + magick_unreferenced(metadata); + + (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError, + "DelegateLibrarySupportNotBuiltIn","`%s' (X11)",image_info->filename); + return(AnimateUsage()); +#endif +} diff --git a/ImageMagick-6.9.12-44/wand/animate.h b/ImageMagick-6.9.12-44/wand/animate.h new file mode 100644 index 0000000..64b7efa --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/animate.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand animate command-line methods. +*/ +#ifndef MAGICKWAND_ANIMATE_H +#define MAGICKWAND_ANIMATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport MagickBooleanType + AnimateImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/compare.c b/ImageMagick-6.9.12-44/wand/compare.c new file mode 100644 index 0000000..1d876fa --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/compare.c @@ -0,0 +1,1463 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC OOO M M PPPP AAA RRRR EEEEE % +% C O O MM MM P P A A R R E % +% C O O M M M PPPP AAAAA RRRR EEE % +% C O O M M P A A R R E % +% CCCC OOO M M P A A R R EEEEE % +% % +% % +% Image Comparison Methods % +% % +% Software Design % +% Cristy % +% December 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Use the compare program to mathematically and visually annotate the +% difference between an image and its reconstruction. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/mogrify-private.h" +#include "magick/string-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o m p a r e I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CompareImageCommand() compares two images and returns the difference between +% them as a distortion metric and as a new image visually annotating their +% differences. +% +% The format of the CompareImageCommand method is: +% +% MagickBooleanType CompareImageCommand(ImageInfo *image_info,int argc, +% char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType CompareUsage(void) +{ + static const char + miscellaneous[] = + " -debug events display copious debugging information\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information", + operators[] = + " -brightness-contrast geometry\n" + " improve brightness / contrast of the image\n" + " -distort method args\n" + " distort images according to given method and args\n" + " -level value adjust the level of image contrast\n" + " -resize geometry resize the image\n" + " -rotate degrees apply Paeth rotation to the image\n" + " -sigmoidal-contrast geometry\n" + " increase the contrast without saturating highlights or\n" + " -trim trim image edges", + sequence_operators[] = + " -crop geometry cut out a rectangular region of the image\n" + " -separate separate an image channel into a grayscale image\n" + " -write filename write images to this file", + settings[] = + " -alpha option on, activate, off, deactivate, set, opaque, copy\n" + " transparent, extract, background, or shape\n" + " -authenticate password\n" + " decipher image with this password\n" + " -background color background color\n" + " -channel type apply option to select image channels\n" + " -colorspace type alternate image colorspace\n" + " -compose operator set image composite operator\n" + " -compress type type of pixel compression when writing the image\n" + " -decipher filename convert cipher pixels to plain pixels\n" + " -define format:option\n" + " define one or more image format options\n" + " -density geometry horizontal and vertical density of the image\n" + " -depth value image depth\n" + " -dissimilarity-threshold value\n" + " maximum distortion for (sub)image match\n" + " -encipher filename convert plain pixels to cipher pixels\n" + " -extract geometry extract area from image\n" + " -format \"string\" output formatted image characteristics\n" + " -fuzz distance colors within this distance are considered equal\n" + " -gravity type horizontal and vertical text placement\n" + " -highlight-color color\n" + " empasize pixel differences with this color\n" + " -identify identify the format and characteristics of the image\n" + " -interlace type type of image interlacing scheme\n" + " -limit type value pixel cache resource limit\n" + " -lowlight-color color\n" + " de-emphasize pixel differences with this color\n" + " -mask filename associate a mask with the image\n" + " -metric type measure differences between images with this metric\n" + " -monitor monitor progress\n" + " -passphrase filename get the passphrase from this file\n" + " -precision value maximum number of significant digits to print\n" + " -profile filename add, delete, or apply an image profile\n" + " -quality value JPEG/MIFF/PNG compression level\n" + " -quiet suppress all warning messages\n" + " -quantize colorspace reduce colors in this colorspace\n" + " -regard-warnings pay attention to warning messages\n" + " -repage geometry size and location of an image canvas\n" + " -respect-parentheses settings remain in effect until parenthesis boundary\n" + " -sampling-factor geometry\n" + " horizontal and vertical sampling factor\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -set attribute value set an image attribute\n" + " -quality value JPEG/MIFF/PNG compression level\n" + " -similarity-threshold value\n" + " minimum distortion for (sub)image match\n" + " -size geometry width and height of image\n" + " -subimage-search search for subimage\n" + " -synchronize synchronize image to storage device\n" + " -taint declare the image as modified\n" + " -transparent-color color\n" + " transparent color\n" + " -type type image type\n" + " -verbose print detailed information about the image\n" + " -version print version information\n" + " -virtual-pixel method\n" + " virtual pixel access method", + stack_operators[] = + " -delete indexes delete the image from the image sequence"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] image reconstruct difference\n", + GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nImage Operators:\n"); + (void) puts(operators); + (void) printf("\nImage Sequence Operators:\n"); + (void) puts(sequence_operators); + (void) printf("\nImage Stack Operators:\n"); + (void) puts(stack_operators); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf( + "\nBy default, the image format of `file' is determined by its magic\n"); + (void) printf( + "number. To specify a particular image format, precede the filename\n"); + (void) printf( + "with an image format name and a colon (i.e. ps:image) or specify the\n"); + (void) printf( + "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); + (void) printf("'-' for standard input or output.\n"); + return(MagickTrue); +} + +WandExport MagickBooleanType CompareImageCommand(ImageInfo *image_info, + int argc,char **argv,char **metadata,ExceptionInfo *exception) +{ +#define CompareEpsilon (1.0e-06) +#define DefaultDissimilarityThreshold 0.31830988618379067154 +#define DefaultSimilarityThreshold (-1.0) +#define DestroyCompare() \ +{ \ + if (similarity_image != (Image *) NULL) \ + similarity_image=DestroyImageList(similarity_image); \ + if (difference_image != (Image *) NULL) \ + difference_image=DestroyImageList(difference_image); \ + DestroyImageStack(); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowCompareException(asperity,tag,option) \ +{ \ + if (exception->severity < (asperity)) \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag, \ + "`%s'",option); \ + DestroyCompare(); \ + return(MagickFalse); \ +} +#define ThrowCompareInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",option,argument); \ + DestroyCompare(); \ + return(MagickFalse); \ +} + + char + *filename, + *option; + + const char + *format; + + ChannelType + channels; + + double + dissimilarity_threshold, + distortion, + similarity_metric, + similarity_threshold; + + Image + *difference_image, + *image, + *reconstruct_image, + *similarity_image; + + ImageInfo + *restore_info; + + ImageStack + image_stack[MaxImageStackDepth+1]; + + MagickBooleanType + fire, + pend, + respect_parenthesis, + subimage_search; + + MagickStatusType + status; + + MetricType + metric; + + RectangleInfo + offset; + + ssize_t + i; + + ssize_t + j, + k; + + /* + Set defaults. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + if (argc == 2) + { + option=argv[1]; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + } + if (argc < 3) + return(CompareUsage()); + restore_info=image_info; + channels=DefaultChannels; + difference_image=NewImageList(); + similarity_image=NewImageList(); + dissimilarity_threshold=DefaultDissimilarityThreshold; + similarity_threshold=DefaultSimilarityThreshold; + distortion=0.0; + format=(char *) NULL; + j=1; + k=0; + metric=UndefinedErrorMetric; + NewImageStack(); + option=(char *) NULL; + pend=MagickFalse; + reconstruct_image=NewImageList(); + respect_parenthesis=MagickFalse; + status=MagickTrue; + subimage_search=MagickFalse; + /* + Compare an image. + */ + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowCompareException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + for (i=1; i < (ssize_t) (argc-1); i++) + { + option=argv[i]; + if (LocaleCompare(option,"(") == 0) + { + FireImageStack(MagickTrue,MagickTrue,pend); + if (k == MaxImageStackDepth) + ThrowCompareException(OptionError,"ParenthesisNestedTooDeeply", + option); + PushImageStack(); + continue; + } + if (LocaleCompare(option,")") == 0) + { + FireImageStack(MagickTrue,MagickTrue,MagickTrue); + if (k == 0) + ThrowCompareException(OptionError,"UnableToParseExpression",option); + PopImageStack(); + continue; + } + if (IsCommandOption(option) == MagickFalse) + { + Image + *images; + + /* + Read input image. + */ + FireImageStack(MagickFalse,MagickFalse,pend); + filename=argv[i]; + if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1))) + filename=argv[++i]; + (void) SetImageOption(image_info,"filename",filename); + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + images=ReadImages(image_info,exception); + status&=(images != (Image *) NULL) && + (exception->severity < ErrorException); + if (images == (Image *) NULL) + continue; + AppendImageStack(images); + continue; + } + pend=image != (Image *) NULL ? MagickTrue : MagickFalse; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("alpha",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowCompareException(OptionError,"UnrecognizedAlphaChannelType", + argv[i]); + break; + } + if (LocaleCompare("authenticate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option); + } + case 'b': + { + if (LocaleCompare("background",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("brightness-contrast",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option); + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + ssize_t + channel; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + channel=ParseChannelOption(argv[i]); + if (channel < 0) + ThrowCompareException(OptionError,"UnrecognizedChannelType", + argv[i]); + channels=(ChannelType) channel; + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse, + argv[i]); + if (colorspace < 0) + ThrowCompareException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("compose",option+1) == 0) + { + ssize_t + compose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + compose=ParseCommandOption(MagickComposeOptions,MagickFalse, + argv[i]); + if (compose < 0) + ThrowCompareException(OptionError,"UnrecognizedComposeOperator", + argv[i]); + break; + } + if (LocaleCompare("compress",option+1) == 0) + { + ssize_t + compress; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + compress=ParseCommandOption(MagickCompressOptions,MagickFalse, + argv[i]); + if (compress < 0) + ThrowCompareException(OptionError,"UnrecognizedImageCompression", + argv[i]); + break; + } + if (LocaleCompare("concurrent",option+1) == 0) + break; + if (LocaleCompare("crop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'd': + { + if (LocaleCompare("debug",option+1) == 0) + { + LogEventType + event_mask; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + event_mask=SetLogEventMask(argv[i]); + if (event_mask == UndefinedEvents) + ThrowCompareException(OptionError,"UnrecognizedEventType", + argv[i]); + break; + } + if (LocaleCompare("decipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (*option == '+') + { + const char + *define; + + define=GetImageOption(image_info,argv[i]); + if (define == (const char *) NULL) + ThrowCompareException(OptionError,"NoSuchOption",argv[i]); + break; + } + break; + } + if (LocaleCompare("delete",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("density",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("dissimilarity-threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + if (*option == '+') + dissimilarity_threshold=DefaultDissimilarityThreshold; + else + dissimilarity_threshold=StringToDouble(argv[i],(char **) NULL); + break; + } + if (LocaleCompare("distort",option+1) == 0) + { + ssize_t + op; + + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickDistortOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowCompareException(OptionError,"UnrecognizedDistortMethod", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'e': + { + if (LocaleCompare("encipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("extract",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'f': + { + if (LocaleCompare("format",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + format=argv[i]; + break; + } + if (LocaleCompare("fuzz",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'g': + { + if (LocaleCompare("gravity",option+1) == 0) + { + ssize_t + gravity; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse, + argv[i]); + if (gravity < 0) + ThrowCompareException(OptionError,"UnrecognizedGravityType", + argv[i]); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'h': + { + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + DestroyCompare(); + return(CompareUsage()); + } + if (LocaleCompare("highlight-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'i': + { + if (LocaleCompare("identify",option+1) == 0) + break; + if (LocaleCompare("interlace",option+1) == 0) + { + ssize_t + interlace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, + argv[i]); + if (interlace < 0) + ThrowCompareException(OptionError,"UnrecognizedInterlaceType", + argv[i]); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'l': + { + if (LocaleCompare("level",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("limit",option+1) == 0) + { + char + *p; + + double + value; + + ssize_t + resource; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + resource=ParseCommandOption(MagickResourceOptions,MagickFalse, + argv[i]); + if (resource < 0) + ThrowCompareException(OptionError,"UnrecognizedResourceType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + value=StringToDouble(argv[i],&p); + (void) value; + if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); + if (list < 0) + ThrowCompareException(OptionError,"UnrecognizedListType",argv[i]); + status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) + argv+j,exception); + DestroyCompare(); + return(status == 0 ? MagickFalse : MagickTrue); + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL)) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("lowlight-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'm': + { + if (LocaleCompare("mask",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("matte",option+1) == 0) + break; + if (LocaleCompare("metric",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickMetricOptions,MagickTrue,argv[i]); + if (type < 0) + ThrowCompareException(OptionError,"UnrecognizedMetricType", + argv[i]); + metric=(MetricType) type; + break; + } + if (LocaleCompare("monitor",option+1) == 0) + break; + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'p': + { + if (LocaleCompare("precision",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("passphrase",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("profile",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'q': + { + if (LocaleCompare("quality",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("quantize",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowCompareException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("quiet",option+1) == 0) + break; + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'r': + { + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleCompare("repage",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("rotate",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleNCompare("respect-parentheses",option+1,17) == 0) + { + respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 's': + { + if (LocaleCompare("sampling-factor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("separate",option+1) == 0) + break; + if (LocaleCompare("set",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("sigmoidal-contrast",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("similarity-threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + if (*option == '+') + similarity_threshold=DefaultSimilarityThreshold; + else + similarity_threshold=StringToDouble(argv[i],(char **) NULL); + break; + } + if (LocaleCompare("size",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompareInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("subimage-search",option+1) == 0) + { + if (*option == '+') + { + subimage_search=MagickFalse; + break; + } + subimage_search=MagickTrue; + break; + } + if (LocaleCompare("synchronize",option+1) == 0) + break; + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 't': + { + if (LocaleCompare("taint",option+1) == 0) + break; + if (LocaleCompare("transparent-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("trim",option+1) == 0) + break; + if (LocaleCompare("type",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowCompareException(OptionError,"UnrecognizedImageType", + argv[i]); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + break; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + break; + } + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowCompareException(OptionError, + "UnrecognizedVirtualPixelMethod",argv[i]); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case 'w': + { + if (LocaleCompare("write",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompareException(OptionError,"MissingArgument",option); + break; + } + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + case '?': + break; + default: + ThrowCompareException(OptionError,"UnrecognizedOption",option) + } + fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & + FireOptionFlag) == 0 ? MagickFalse : MagickTrue; + if (fire != MagickFalse) + FireImageStack(MagickTrue,MagickTrue,MagickTrue); + } + if (k != 0) + ThrowCompareException(OptionError,"UnbalancedParenthesis",argv[i]); + if (i-- != (ssize_t) (argc-1)) + ThrowCompareException(OptionError,"MissingAnImageFilename",argv[i]); + if ((image == (Image *) NULL) || (GetImageListLength(image) < 2)) + ThrowCompareException(OptionError,"MissingAnImageFilename",argv[i]); + FinalizeImageSettings(image_info,image,MagickTrue); + if ((image == (Image *) NULL) || (GetImageListLength(image) < 2)) + ThrowCompareException(OptionError,"MissingAnImageFilename",argv[i]); + image=GetImageFromList(image,0); + reconstruct_image=GetImageFromList(image,1); + offset.x=0; + offset.y=0; + if (subimage_search != MagickFalse) + { + char + artifact[MaxTextExtent]; + + (void) FormatLocaleString(artifact,MaxTextExtent,"%g", + similarity_threshold); + (void) SetImageArtifact(image,"compare:similarity-threshold",artifact); + similarity_image=SimilarityMetricImage(image,reconstruct_image,metric, + &offset,&similarity_metric,exception); + if (similarity_metric > dissimilarity_threshold) + ThrowCompareException(ImageError,"ImagesTooDissimilar",image->filename); + } + if ((reconstruct_image->columns == image->columns) && + (reconstruct_image->rows == image->rows)) + difference_image=CompareImageChannels(image,reconstruct_image,channels, + metric,&distortion,exception); + else + if (similarity_image == (Image *) NULL) + difference_image=CompareImageChannels(image,reconstruct_image,channels, + metric,&distortion,exception); + else + { + Image + *composite_image; + + /* + Determine if reconstructed image is a subimage of the image. + */ + composite_image=CloneImage(image,0,0,MagickTrue,exception); + if (composite_image == (Image *) NULL) + difference_image=CompareImageChannels(image,reconstruct_image, + channels,metric,&distortion,exception); + else + { + Image + *distort_image; + + RectangleInfo + page; + + (void) CompositeImage(composite_image,CopyCompositeOp, + reconstruct_image,offset.x,offset.y); + difference_image=CompareImageChannels(image,composite_image, + channels,metric,&distortion,exception); + if (difference_image != (Image *) NULL) + { + difference_image->page.x=offset.x; + difference_image->page.y=offset.y; + } + composite_image=DestroyImage(composite_image); + page.width=reconstruct_image->columns; + page.height=reconstruct_image->rows; + page.x=offset.x; + page.y=offset.y; + distort_image=CropImage(image,&page,exception); + if (distort_image != (Image *) NULL) + { + Image + *sans_image; + + sans_image=CompareImageChannels(distort_image,reconstruct_image, + channels,metric,&distortion,exception); + distort_image=DestroyImage(distort_image); + if (sans_image != (Image *) NULL) + sans_image=DestroyImage(sans_image); + } + } + if (difference_image != (Image *) NULL) + { + AppendImageToList(&difference_image,similarity_image); + similarity_image=(Image *) NULL; + } + } + if (difference_image == (Image *) NULL) + status=0; + else + { + if (image_info->verbose != MagickFalse) + (void) IsImagesEqual(image,reconstruct_image); + if (*difference_image->magick == '\0') + (void) CopyMagickString(difference_image->magick,image->magick, + MaxTextExtent); + if (image_info->verbose == MagickFalse) + { + switch (metric) + { + case FuzzErrorMetric: + case MeanAbsoluteErrorMetric: + case MeanSquaredErrorMetric: + case PeakAbsoluteErrorMetric: + case RootMeanSquaredErrorMetric: + { + (void) FormatLocaleFile(stderr,"%.*g (%.*g)",GetMagickPrecision(), + QuantumRange*distortion,GetMagickPrecision(),distortion); + break; + } + case AbsoluteErrorMetric: + case NormalizedCrossCorrelationErrorMetric: + case PeakSignalToNoiseRatioMetric: + case PerceptualHashErrorMetric: + { + (void) FormatLocaleFile(stderr,"%.*g",GetMagickPrecision(), + distortion); + break; + } + case MeanErrorPerPixelMetric: + { + (void) FormatLocaleFile(stderr,"%.*g (%.*g, %.*g)", + GetMagickPrecision(),distortion, + GetMagickPrecision(),image->error.normalized_mean_error, + GetMagickPrecision(),image->error.normalized_maximum_error); + break; + } + case UndefinedErrorMetric: + break; + } + if (subimage_search != MagickFalse) + (void) FormatLocaleFile(stderr," @ %.20g,%.20g",(double) + difference_image->page.x,(double) difference_image->page.y); + } + else + { + double + *channel_distortion; + + channel_distortion=GetImageChannelDistortions(image,reconstruct_image, + metric,&image->exception); + (void) FormatLocaleFile(stderr,"Image: %s\n",image->filename); + if ((reconstruct_image->columns != image->columns) || + (reconstruct_image->rows != image->rows)) + (void) FormatLocaleFile(stderr,"Offset: %.20g,%.20g\n",(double) + difference_image->page.x,(double) difference_image->page.y); + (void) FormatLocaleFile(stderr," Channel distortion: %s\n", + CommandOptionToMnemonic(MagickMetricOptions,(ssize_t) metric)); + switch (metric) + { + case FuzzErrorMetric: + case MeanAbsoluteErrorMetric: + case MeanSquaredErrorMetric: + case PeakAbsoluteErrorMetric: + case RootMeanSquaredErrorMetric: + { + switch (image->colorspace) + { + case RGBColorspace: + default: + { + (void) FormatLocaleFile(stderr," red: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[RedChannel],GetMagickPrecision(), + channel_distortion[RedChannel]); + (void) FormatLocaleFile(stderr," green: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[GreenChannel],GetMagickPrecision(), + channel_distortion[GreenChannel]); + (void) FormatLocaleFile(stderr," blue: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[BlueChannel],GetMagickPrecision(), + channel_distortion[BlueChannel]); + if (image->matte != MagickFalse) + (void) FormatLocaleFile(stderr," alpha: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[OpacityChannel],GetMagickPrecision(), + channel_distortion[OpacityChannel]); + break; + } + case CMYKColorspace: + { + (void) FormatLocaleFile(stderr," cyan: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[CyanChannel],GetMagickPrecision(), + channel_distortion[CyanChannel]); + (void) FormatLocaleFile(stderr," magenta: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[MagentaChannel],GetMagickPrecision(), + channel_distortion[MagentaChannel]); + (void) FormatLocaleFile(stderr," yellow: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[YellowChannel],GetMagickPrecision(), + channel_distortion[YellowChannel]); + (void) FormatLocaleFile(stderr," black: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[BlackChannel],GetMagickPrecision(), + channel_distortion[BlackChannel]); + if (image->matte != MagickFalse) + (void) FormatLocaleFile(stderr," alpha: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[OpacityChannel],GetMagickPrecision(), + channel_distortion[OpacityChannel]); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) FormatLocaleFile(stderr," gray: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[GrayChannel],GetMagickPrecision(), + channel_distortion[GrayChannel]); + if (image->matte != MagickFalse) + (void) FormatLocaleFile(stderr," alpha: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[OpacityChannel],GetMagickPrecision(), + channel_distortion[OpacityChannel]); + break; + } + } + (void) FormatLocaleFile(stderr," all: %.*g (%.*g)\n", + GetMagickPrecision(),QuantumRange* + channel_distortion[CompositeChannels],GetMagickPrecision(), + channel_distortion[CompositeChannels]); + break; + } + case AbsoluteErrorMetric: + case NormalizedCrossCorrelationErrorMetric: + case PeakSignalToNoiseRatioMetric: + case PerceptualHashErrorMetric: + { + switch (image->colorspace) + { + case RGBColorspace: + default: + { + (void) FormatLocaleFile(stderr," red: %.*g\n", + GetMagickPrecision(),channel_distortion[RedChannel]); + (void) FormatLocaleFile(stderr," green: %.*g\n", + GetMagickPrecision(),channel_distortion[GreenChannel]); + (void) FormatLocaleFile(stderr," blue: %.*g\n", + GetMagickPrecision(),channel_distortion[BlueChannel]); + if (image->matte != MagickFalse) + (void) FormatLocaleFile(stderr," alpha: %.*g\n", + GetMagickPrecision(),channel_distortion[OpacityChannel]); + break; + } + case CMYKColorspace: + { + (void) FormatLocaleFile(stderr," cyan: %.*g\n", + GetMagickPrecision(),channel_distortion[CyanChannel]); + (void) FormatLocaleFile(stderr," magenta: %.*g\n", + GetMagickPrecision(),channel_distortion[MagentaChannel]); + (void) FormatLocaleFile(stderr," yellow: %.*g\n", + GetMagickPrecision(),channel_distortion[YellowChannel]); + (void) FormatLocaleFile(stderr," black: %.*g\n", + GetMagickPrecision(),channel_distortion[BlackChannel]); + if (image->matte != MagickFalse) + (void) FormatLocaleFile(stderr," alpha: %.*g\n", + GetMagickPrecision(),channel_distortion[OpacityChannel]); + break; + } + case LinearGRAYColorspace: + case GRAYColorspace: + { + (void) FormatLocaleFile(stderr," gray: %.*g\n", + GetMagickPrecision(),channel_distortion[GrayChannel]); + if (image->matte != MagickFalse) + (void) FormatLocaleFile(stderr," alpha: %.*g\n", + GetMagickPrecision(),channel_distortion[OpacityChannel]); + break; + } + } + (void) FormatLocaleFile(stderr," all: %.*g\n", + GetMagickPrecision(),channel_distortion[CompositeChannels]); + break; + } + case MeanErrorPerPixelMetric: + { + (void) FormatLocaleFile(stderr," %.*g (%.*g, %.*g)\n", + GetMagickPrecision(),channel_distortion[CompositeChannels], + GetMagickPrecision(),image->error.normalized_mean_error, + GetMagickPrecision(),image->error.normalized_maximum_error); + break; + } + case UndefinedErrorMetric: + break; + } + channel_distortion=(double *) RelinquishMagickMemory( + channel_distortion); + if (subimage_search != MagickFalse) + (void) FormatLocaleFile(stderr," Offset: %.20g,%.20g\n",(double) + difference_image->page.x,(double) difference_image->page.y); + } + (void) ResetImagePage(difference_image,"0x0+0+0"); + if (difference_image->next != (Image *) NULL) + (void) ResetImagePage(difference_image->next,"0x0+0+0"); + status&=WriteImages(image_info,difference_image,argv[argc-1],exception); + if ((metadata != (char **) NULL) && (format != (char *) NULL)) + { + char + *text; + + text=InterpretImageProperties(image_info,difference_image,format); + InheritException(exception,&image->exception); + if (text == (char *) NULL) + ThrowCompareException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + (void) ConcatenateString(&(*metadata),text); + text=DestroyString(text); + } + difference_image=DestroyImageList(difference_image); + } + DestroyCompare(); + image_info=restore_info; + if ((metric == NormalizedCrossCorrelationErrorMetric) || + (metric == UndefinedErrorMetric)) + { + if (fabs(distortion-1.0) > CompareEpsilon) + (void) SetImageOption(image_info,"compare:dissimilar","true"); + } + else + if (fabs(distortion) > CompareEpsilon) + (void) SetImageOption(image_info,"compare:dissimilar","true"); + return(status != 0 ? MagickTrue : MagickFalse); +} diff --git a/ImageMagick-6.9.12-44/wand/compare.h b/ImageMagick-6.9.12-44/wand/compare.h new file mode 100644 index 0000000..ef6b061 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/compare.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand compare command-line method. +*/ +#ifndef MAGICKWAND_COMPARE_H +#define MAGICKWAND_COMPARE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport MagickBooleanType + CompareImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/composite.c b/ImageMagick-6.9.12-44/wand/composite.c new file mode 100644 index 0000000..c90af67 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/composite.c @@ -0,0 +1,1657 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC OOO M M PPPP OOO SSSSS IIIII TTTTT EEEEE % +% C O O MM MM P P O O SS I T E % +% C O O M M M PPPP O O SSS I T EEE % +% C O O M M P O O SS I T E % +% CCCC OOO M M P OOO SSSSS IIIII T EEEEE % +% % +% % +% MagickWand Image Composite Methods % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Use the composite program to overlap one image over another. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/mogrify-private.h" +#include "magick/string-private.h" + +/* + Typedef declarations. +*/ +typedef struct _CompositeOptions +{ + ChannelType + channel; + + char + *compose_args, + *geometry; + + CompositeOperator + compose; + + GravityType + gravity; + + ssize_t + stegano; + + RectangleInfo + offset; + + MagickBooleanType + stereo, + tile; +} CompositeOptions; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C o m p o s i t e I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CompositeImageCommand() reads one or more images and an optional mask and +% composites them into a new image. +% +% The format of the CompositeImageCommand method is: +% +% MagickBooleanType CompositeImageCommand(ImageInfo *image_info,int argc, +% char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType CompositeImageList(ImageInfo *image_info,Image **image, + Image *composite_image,CompositeOptions *composite_options, + ExceptionInfo *exception) +{ + MagickStatusType + status; + + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image **) NULL); + assert((*image)->signature == MagickCoreSignature); + if ((*image)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename); + assert(exception != (ExceptionInfo *) NULL); + (void) image_info; + status=MagickTrue; + if (composite_image != (Image *) NULL) + { + assert(composite_image->signature == MagickCoreSignature); + switch( composite_options->compose ) + { + case BlendCompositeOp: + case BlurCompositeOp: + case DisplaceCompositeOp: + case DistortCompositeOp: + case DissolveCompositeOp: + case ModulateCompositeOp: + case ThresholdCompositeOp: + { + (void) SetImageArtifact(*image,"compose:args", + composite_options->compose_args); + break; + } + default: + break; + } + /* + Composite image. + */ + if (composite_options->stegano != 0) + { + Image + *stegano_image; + + (*image)->offset=composite_options->stegano-1; + stegano_image=SteganoImage(*image,composite_image,exception); + if (stegano_image != (Image *) NULL) + { + *image=DestroyImageList(*image); + *image=stegano_image; + } + } + else + if (composite_options->stereo != MagickFalse) + { + Image + *stereo_image; + + stereo_image=StereoAnaglyphImage(*image,composite_image, + composite_options->offset.x,composite_options->offset.y, + exception); + if (stereo_image != (Image *) NULL) + { + *image=DestroyImageList(*image); + *image=stereo_image; + } + } + else + if (composite_options->tile != MagickFalse) + { + size_t + columns; + + ssize_t + x, + y; + + /* + Tile the composite image. + */ + (void) SetImageArtifact(composite_image,"compose:outside-overlay", + "false"); + columns=composite_image->columns; + for (y=0; y < (ssize_t) (*image)->rows; y+=(ssize_t) composite_image->rows) + for (x=0; x < (ssize_t) (*image)->columns; x+=(ssize_t) columns) + status&=CompositeImageChannel(*image, + composite_options->channel,composite_options->compose, + composite_image,x,y); + GetImageException(*image,exception); + } + else + { + RectangleInfo + geometry; + + /* + Work out gravity Adjustment of Offset + */ + SetGeometry(*image,&geometry); + (void) ParseAbsoluteGeometry(composite_options->geometry, + &geometry); + geometry.width=composite_image->columns; + geometry.height=composite_image->rows; + GravityAdjustGeometry((*image)->columns,(*image)->rows, + composite_options->gravity, &geometry); + (*image)->gravity=(GravityType) composite_options->gravity; + /* + Digitally composite image. + */ + status&=CompositeImageChannel(*image,composite_options->channel, + composite_options->compose,composite_image,geometry.x, + geometry.y); + GetImageException(*image,exception); + } + } + return(status != 0 ? MagickTrue : MagickFalse); +} + +static MagickBooleanType CompositeUsage(void) +{ + static const char + miscellaneous[] = + " -debug events display copious debugging information\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information\n" + " -version print version information", + operators[] = + " -blend geometry blend images\n" + " -border geometry surround image with a border of color\n" + " -bordercolor color border color\n" + " -colors value preferred number of colors in the image\n" + " -decipher filename convert cipher pixels to plain pixels\n" + " -displace geometry shift lookup according to a relative displacement map\n" + " -dissolve value dissolve the two images a given percent\n" + " -distort geometry shift lookup according to a absolute distortion map\n" + " -encipher filename convert plain pixels to cipher pixels\n" + " -extract geometry extract area from image\n" + " -geometry geometry location of the composite image\n" + " -identify identify the format and characteristics of the image\n" + " -monochrome transform image to black and white\n" + " -negate replace every pixel with its complementary color \n" + " -profile filename add ICM or IPTC information profile to image\n" + " -quantize colorspace reduce colors in this colorspace\n" + " -rotate degrees apply Paeth rotation to the image\n" + " -resize geometry resize the image\n" + " -sharpen geometry sharpen the image\n" + " -shave geometry shave pixels from the image edges\n" + " -stegano offset hide watermark within an image\n" + " -stereo geometry combine two image to create a stereo anaglyph\n" + " -strip strip image of all profiles and comments\n" + " -thumbnail geometry create a thumbnail of the image\n" + " -transform affine transform image\n" + " -type type image type\n" + " -unsharp geometry sharpen the image\n" + " -watermark geometry percent brightness and saturation of a watermark\n" + " -write filename write images to this file", + settings[] = + " -affine matrix affine transform matrix\n" + " -alpha option on, activate, off, deactivate, set, opaque, copy\n" + " transparent, extract, background, or shape\n" + " -authenticate password\n" + " decipher image with this password\n" + " -blue-primary point chromaticity blue primary point\n" + " -channel type apply option to select image channels\n" + " -colorspace type alternate image colorspace\n" + " -comment string annotate image with comment\n" + " -compose operator composite operator\n" + " -compress type type of pixel compression when writing the image\n" + " -define format:option\n" + " define one or more image format options\n" + " -depth value image depth\n" + " -density geometry horizontal and vertical density of the image\n" + " -display server get image or font from this X server\n" + " -dispose method layer disposal method\n" + " -dither method apply error diffusion to image\n" + " -encoding type text encoding type\n" + " -endian type endianness (MSB or LSB) of the image\n" + " -filter type use this filter when resizing an image\n" + " -font name render text with this font\n" + " -format \"string\" output formatted image characteristics\n" + " -gravity type which direction to gravitate towards\n" + " -green-primary point chromaticity green primary point\n" + " -interlace type type of image interlacing scheme\n" + " -interpolate method pixel color interpolation method\n" + " -label string assign a label to an image\n" + " -limit type value pixel cache resource limit\n" + " -matte store matte channel if the image has one\n" + " -monitor monitor progress\n" + " -page geometry size and location of an image canvas (setting)\n" + " -pointsize value font point size\n" + " -quality value JPEG/MIFF/PNG compression level\n" + " -quiet suppress all warning messages\n" + " -red-primary point chromaticity red primary point\n" + " -regard-warnings pay attention to warning messages\n" + " -repage geometry size and location of an image canvas (operator)\n" + " -respect-parentheses settings remain in effect until parenthesis boundary\n" + " -sampling-factor geometry\n" + " horizontal and vertical sampling factor\n" + " -scene value image scene number\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -size geometry width and height of image\n" + " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n" + " -synchronize synchronize image to storage device\n" + " -taint declare the image as modified\n" + " -transparent-color color\n" + " transparent color\n" + " -treedepth value color tree depth\n" + " -tile repeat composite operation across and down image\n" + " -units type the units of image resolution\n" + " -verbose print detailed information about the image\n" + " -virtual-pixel method\n" + " virtual pixel access method\n" + " -white-point point chromaticity white point", + stack_operators[] = + " -swap indexes swap two images in the image sequence"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] image [options ...] composite\n" + " [ [options ...] mask ] [options ...] composite\n", + GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nImage Operators:\n"); + (void) puts(operators); + (void) printf("\nImage Stack Operators:\n"); + (void) puts(stack_operators); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf( + "\nBy default, the image format of `file' is determined by its magic\n"); + (void) printf( + "number. To specify a particular image format, precede the filename\n"); + (void) printf( + "with an image format name and a colon (i.e. ps:image) or specify the\n"); + (void) printf( + "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); + (void) printf("'-' for standard input or output.\n"); + return(MagickTrue); +} + +static void GetCompositeOptions(CompositeOptions *composite_options) +{ + (void) memset(composite_options,0,sizeof(*composite_options)); + composite_options->channel=DefaultChannels; + composite_options->compose=OverCompositeOp; +} + +static void RelinquishCompositeOptions(CompositeOptions *composite_options) +{ + if (composite_options->compose_args != (char *) NULL) + composite_options->compose_args=(char *) + RelinquishMagickMemory(composite_options->compose_args); + if (composite_options->geometry != (char *) NULL) + composite_options->geometry=(char *) + RelinquishMagickMemory(composite_options->geometry); +} + +WandExport MagickBooleanType CompositeImageCommand(ImageInfo *image_info, + int argc,char **argv,char **metadata,ExceptionInfo *exception) +{ +#define NotInitialized (unsigned int) (~0) +#define DestroyComposite() \ +{ \ + RelinquishCompositeOptions(&composite_options); \ + DestroyImageStack(); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowCompositeException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option == (char *) NULL ? GetExceptionMessage(errno) : option); \ + DestroyComposite(); \ + return(MagickFalse); \ +} +#define ThrowCompositeInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",option,argument); \ + DestroyComposite(); \ + return(MagickFalse); \ +} + + char + *filename, + *option; + + CompositeOptions + composite_options; + + const char + *format; + + Image + *composite_image, + *image, + *images, + *mask_image; + + ImageStack + image_stack[MaxImageStackDepth+1]; + + MagickBooleanType + fire, + pend, + respect_parenthesis; + + MagickStatusType + status; + + ssize_t + i; + + ssize_t + j, + k; + + /* + Set default. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + if (argc == 2) + { + option=argv[1]; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + } + if (argc < 4) + return(CompositeUsage()); + GetCompositeOptions(&composite_options); + filename=(char *) NULL; + format="%w,%h,%m"; + j=1; + k=0; + NewImageStack(); + option=(char *) NULL; + pend=MagickFalse; + respect_parenthesis=MagickFalse; + status=MagickTrue; + /* + Check command syntax. + */ + composite_image=NewImageList(); + image=NewImageList(); + mask_image=NewImageList(); + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowCompositeException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + for (i=1; i < (ssize_t) (argc-1); i++) + { + option=argv[i]; + if (LocaleCompare(option,"(") == 0) + { + FireImageStack(MagickFalse,MagickTrue,pend); + if (k == MaxImageStackDepth) + ThrowCompositeException(OptionError,"ParenthesisNestedTooDeeply", + option); + PushImageStack(); + continue; + } + if (LocaleCompare(option,")") == 0) + { + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + if (k == 0) + ThrowCompositeException(OptionError,"UnableToParseExpression",option); + PopImageStack(); + continue; + } + if (IsCommandOption(option) == MagickFalse) + { + Image + *images; + + /* + Read input image. + */ + FireImageStack(MagickFalse,MagickFalse,pend); + filename=argv[i]; + if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1))) + filename=argv[++i]; + (void) SetImageOption(image_info,"filename",filename); + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + images=ReadImages(image_info,exception); + status&=(images != (Image *) NULL) && + (exception->severity < ErrorException); + if (images == (Image *) NULL) + continue; + AppendImageStack(images); + continue; + } + pend=image != (Image *) NULL ? MagickTrue : MagickFalse; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("affine",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("alpha",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowCompositeException(OptionError, + "UnrecognizedAlphaChannelType",argv[i]); + break; + } + if (LocaleCompare("authenticate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'b': + { + if (LocaleCompare("background",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("blend",option+1) == 0) + { + (void) CloneString(&composite_options.compose_args,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + (void) CloneString(&composite_options.compose_args,argv[i]); + composite_options.compose=BlendCompositeOp; + break; + } + if (LocaleCompare("blur",option+1) == 0) + { + (void) CloneString(&composite_options.compose_args,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + (void) CloneString(&composite_options.compose_args,argv[i]); + composite_options.compose=BlurCompositeOp; + break; + } + if (LocaleCompare("blue-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("border",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("bordercolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + ssize_t + channel; + + if (*option == '+') + { + composite_options.channel=DefaultChannels; + break; + } + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + channel=ParseChannelOption(argv[i]); + if (channel < 0) + ThrowCompositeException(OptionError,"UnrecognizedChannelType", + argv[i]); + composite_options.channel=(ChannelType) channel; + break; + } + if (LocaleCompare("colors",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowCompositeException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("comment",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("compose",option+1) == 0) + { + ssize_t + compose; + + composite_options.compose=UndefinedCompositeOp; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + compose=ParseCommandOption(MagickComposeOptions,MagickFalse, + argv[i]); + if (compose < 0) + ThrowCompositeException(OptionError,"UnrecognizedComposeOperator", + argv[i]); + composite_options.compose=(CompositeOperator) compose; + break; + } + if (LocaleCompare("compress",option+1) == 0) + { + ssize_t + compress; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + compress=ParseCommandOption(MagickCompressOptions,MagickFalse, + argv[i]); + if (compress < 0) + ThrowCompositeException(OptionError, + "UnrecognizedImageCompression",argv[i]); + break; + } + if (LocaleCompare("concurrent",option+1) == 0) + break; + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'd': + { + if (LocaleCompare("debug",option+1) == 0) + { + ssize_t + event; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); + if (event < 0) + ThrowCompositeException(OptionError,"UnrecognizedEventType", + argv[i]); + (void) SetLogEventMask(argv[i]); + break; + } + if (LocaleCompare("decipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (*option == '+') + { + const char + *define; + + define=GetImageOption(image_info,argv[i]); + if (define == (const char *) NULL) + ThrowCompositeException(OptionError,"NoSuchOption",argv[i]); + break; + } + break; + } + if (LocaleCompare("density",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("displace",option+1) == 0) + { + (void) CloneString(&composite_options.compose_args,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + (void) CloneString(&composite_options.compose_args,argv[i]); + composite_options.compose=DisplaceCompositeOp; + break; + } + if (LocaleCompare("display",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("dispose",option+1) == 0) + { + ssize_t + dispose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]); + if (dispose < 0) + ThrowCompositeException(OptionError,"UnrecognizedDisposeMethod", + argv[i]); + break; + } + if (LocaleCompare("dissolve",option+1) == 0) + { + (void) CloneString(&composite_options.compose_args,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + (void) CloneString(&composite_options.compose_args,argv[i]); + composite_options.compose=DissolveCompositeOp; + break; + } + if (LocaleCompare("distort",option+1) == 0) + { + (void) CloneString(&composite_options.compose_args,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + (void) CloneString(&composite_options.compose_args,argv[i]); + composite_options.compose=DistortCompositeOp; + break; + } + if (LocaleCompare("dither",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]); + if (method < 0) + ThrowCompositeException(OptionError,"UnrecognizedDitherMethod", + argv[i]); + break; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'e': + { + if (LocaleCompare("encipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("encoding",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("endian",option+1) == 0) + { + ssize_t + endian; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + endian=ParseCommandOption(MagickEndianOptions,MagickFalse, + argv[i]); + if (endian < 0) + ThrowCompositeException(OptionError,"UnrecognizedEndianType", + argv[i]); + break; + } + if (LocaleCompare("extract",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'f': + { + if (LocaleCompare("filter",option+1) == 0) + { + ssize_t + filter; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]); + if (filter < 0) + ThrowCompositeException(OptionError,"UnrecognizedImageFilter", + argv[i]); + break; + } + if (LocaleCompare("font",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("format",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + format=argv[i]; + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'g': + { + if (LocaleCompare("geometry",option+1) == 0) + { + (void) CloneString(&composite_options.geometry,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + (void) CloneString(&composite_options.geometry,argv[i]); + break; + } + if (LocaleCompare("gravity",option+1) == 0) + { + ssize_t + gravity; + + composite_options.gravity=UndefinedGravity; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse, + argv[i]); + if (gravity < 0) + ThrowCompositeException(OptionError,"UnrecognizedGravityType", + argv[i]); + composite_options.gravity=(GravityType) gravity; + break; + } + if (LocaleCompare("green-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'h': + { + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + DestroyComposite(); + return(CompositeUsage()); + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'i': + { + if (LocaleCompare("identify",option+1) == 0) + break; + if (LocaleCompare("interlace",option+1) == 0) + { + ssize_t + interlace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, + argv[i]); + if (interlace < 0) + ThrowCompositeException(OptionError, + "UnrecognizedInterlaceType",argv[i]); + break; + } + if (LocaleCompare("interpolate",option+1) == 0) + { + ssize_t + interpolate; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, + argv[i]); + if (interpolate < 0) + ThrowCompositeException(OptionError, + "UnrecognizedInterpolateMethod",argv[i]); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'l': + { + if (LocaleCompare("label",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("limit",option+1) == 0) + { + char + *p; + + double + value; + + ssize_t + resource; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + resource=ParseCommandOption(MagickResourceOptions,MagickFalse, + argv[i]); + if (resource < 0) + ThrowCompositeException(OptionError,"UnrecognizedResourceType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + value=StringToDouble(argv[i],&p); + (void) value; + if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); + if (list < 0) + ThrowCompositeException(OptionError,"UnrecognizedListType", + argv[i]); + status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) + argv+j,exception); + DestroyComposite(); + return(status == 0 ? MagickFalse : MagickTrue); + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL)) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'm': + { + if (LocaleCompare("matte",option+1) == 0) + break; + if (LocaleCompare("monitor",option+1) == 0) + break; + if (LocaleCompare("monochrome",option+1) == 0) + break; + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'n': + { + if (LocaleCompare("negate",option+1) == 0) + break; + if (LocaleCompare("noop",option+1) == 0) + break; + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'p': + { + if (LocaleCompare("page",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("pointsize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("process",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("profile",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'q': + { + if (LocaleCompare("quality",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("quantize",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowCompositeException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("quiet",option+1) == 0) + break; + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'r': + { + if (LocaleCompare("red-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleCompare("render",option+1) == 0) + break; + if (LocaleCompare("repage",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleNCompare("respect-parentheses",option+1,17) == 0) + { + respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("resize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("rotate",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 's': + { + if (LocaleCompare("sampling-factor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("scene",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sharpen",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("shave",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("size",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("stegano",option+1) == 0) + { + composite_options.stegano=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + composite_options.stegano=(ssize_t) StringToLong(argv[i])+1; + break; + } + if (LocaleCompare("stereo",option+1) == 0) + { + MagickStatusType + flags; + + composite_options.stereo=MagickFalse; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + flags=ParseAbsoluteGeometry(argv[i],&composite_options.offset); + if ((flags & YValue) == 0) + composite_options.offset.y=composite_options.offset.x; + composite_options.stereo=MagickTrue; + break; + } + if (LocaleCompare("strip",option+1) == 0) + break; + if (LocaleCompare("support",option+1) == 0) + { + i++; /* deprecated */ + break; + } + if (LocaleCompare("swap",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("synchronize",option+1) == 0) + break; + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 't': + { + if (LocaleCompare("taint",option+1) == 0) + break; + if (LocaleCompare("thumbnail",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("tile",option+1) == 0) + { + composite_options.tile=(*option == '-') ? MagickTrue : MagickFalse; + (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); + break; + } + if (LocaleCompare("transform",option+1) == 0) + break; + if (LocaleCompare("transparent-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("treedepth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("type",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowCompositeException(OptionError,"UnrecognizedImageType", + argv[i]); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'u': + { + if (LocaleCompare("units",option+1) == 0) + { + ssize_t + units; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + units=ParseCommandOption(MagickResolutionOptions,MagickFalse, + argv[i]); + if (units < 0) + ThrowCompositeException(OptionError,"UnrecognizedUnitsType", + argv[i]); + break; + } + if (LocaleCompare("unsharp",option+1) == 0) + { + (void) CloneString(&composite_options.compose_args,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + (void) CloneString(&composite_options.compose_args,argv[i]); + composite_options.compose=ThresholdCompositeOp; + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + break; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + break; + } + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowCompositeException(OptionError, + "UnrecognizedVirtualPixelMethod",argv[i]); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case 'w': + { + if (LocaleCompare("watermark",option+1) == 0) + { + (void) CloneString(&composite_options.compose_args,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + (void) CloneString(&composite_options.compose_args,argv[i]); + composite_options.compose=ModulateCompositeOp; + break; + } + if (LocaleCompare("white-point",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowCompositeInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("write",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowCompositeException(OptionError,"MissingArgument",option); + break; + } + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + case '?': + break; + default: + ThrowCompositeException(OptionError,"UnrecognizedOption",option) + } + fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & + FireOptionFlag) == 0 ? MagickFalse : MagickTrue; + if (fire != MagickFalse) + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + } + if (k != 0) + ThrowCompositeException(OptionError,"UnbalancedParenthesis",argv[i]); + if (i-- != (ssize_t) (argc-1)) + ThrowCompositeException(OptionError,"MissingAnImageFilename",argv[i]); + if ((image == (Image *) NULL) || (GetImageListLength(image) < 2)) + ThrowCompositeException(OptionError,"MissingAnImageFilename",argv[argc-1]); + FinalizeImageSettings(image_info,image,MagickTrue); + if ((image == (Image *) NULL) || (GetImageListLength(image) < 2)) + ThrowCompositeException(OptionError,"MissingAnImageFilename",argv[argc-1]); + /* + Composite images. + */ + RemoveImageStack(composite_image); + RemoveImageStack(images); + (void) TransformImage(&composite_image,(char *) NULL, + composite_image->geometry); + RemoveImageStack(mask_image); + if (mask_image != (Image *) NULL) + { + if ((composite_options.compose == DisplaceCompositeOp) || + (composite_options.compose == DistortCompositeOp)) + { + /* + Merge Y displacement into X displacement image. + */ + (void) CompositeImage(composite_image,CopyGreenCompositeOp,mask_image, + 0,0); + mask_image=DestroyImage(mask_image); + } + else + { + /* + Set a blending mask for the composition. + */ + images->mask=mask_image; + (void) NegateImage(images->mask,MagickFalse); + } + } + status&=CompositeImageList(image_info,&images,composite_image, + &composite_options,exception); + composite_image=DestroyImage(composite_image); + /* + Write composite images. + */ + status&=WriteImages(image_info,images,argv[argc-1],exception); + if (metadata != (char **) NULL) + { + char + *text; + + text=InterpretImageProperties(image_info,images,format); + InheritException(exception,&image->exception); + if (text == (char *) NULL) + ThrowCompositeException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + (void) ConcatenateString(&(*metadata),text); + text=DestroyString(text); + } + images=DestroyImageList(images); + RelinquishCompositeOptions(&composite_options); + DestroyComposite(); + return(status != 0 ? MagickTrue : MagickFalse); +} diff --git a/ImageMagick-6.9.12-44/wand/composite.h b/ImageMagick-6.9.12-44/wand/composite.h new file mode 100644 index 0000000..874a0b8 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/composite.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand composite command-line method. +*/ +#ifndef MAGICKWAND_COMPOSITE_H +#define MAGICKWAND_COMPOSITE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport MagickBooleanType + CompositeImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/conjure.c b/ImageMagick-6.9.12-44/wand/conjure.c new file mode 100644 index 0000000..bb1bb5c --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/conjure.c @@ -0,0 +1,302 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC OOO N N JJJJJ U U RRRR EEEEE % +% C O O NN N J U U R R E % +% C O O N N N J U U RRRR EEE % +% C O O N NN J J U U R R E % +% CCCC OOO N N JJJ UUU R R EEEEE % +% % +% % +% Interpret Magick Scripting Language. % +% % +% Software Design % +% Cristy % +% December 2001 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% The conjure program gives you the ability to perform custom image processing +% tasks from a script written in the Magick Scripting Language (MSL). MSL is +% XML-based and consists of action statements with attributes. Actions include +% reading an image, processing an image, getting attributes from an image, +% writing an image, and more. An attribute is a key/value pair that modifies +% the behavior of an action. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/mogrify-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C o n j u r e I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConjureImageCommand() describes the format and characteristics of one or +% more image files. It will also report if an image is incomplete or corrupt. +% The information displayed includes the scene number, the file name, the +% width and height of the image, whether the image is colormapped or not, +% the number of colors in the image, the number of bytes in the image, the +% format of the image (JPEG, PNM, etc.), and finally the number of seconds +% it took to read and process the image. +% +% The format of the ConjureImageCommand method is: +% +% MagickBooleanType ConjureImageCommand(ImageInfo *image_info,int argc, +% char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType ConjureUsage(void) +{ + static const char + miscellaneous[] = + " -debug events display copious debugging information\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information\n" + " -version print version information", + settings[] = + " -monitor monitor progress\n" + " -quiet suppress all warning messages\n" + " -regard-warnings pay attention to warning messages\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -verbose print detailed information about the image"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] file [ [options ...] file ...]\n", + GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf("\nIn addition, define any key value pairs required by " + "your script. For\nexample,\n\n"); + (void) printf(" conjure -size 100x100 -color blue -foo bar script.msl\n"); + return(MagickTrue); +} + +WandExport MagickBooleanType ConjureImageCommand(ImageInfo *image_info, + int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception) +{ +#define DestroyConjure() \ +{ \ + image=DestroyImageList(image); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowConjureException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option); \ + DestroyConjure(); \ + return(MagickFalse); \ +} +#define ThrowConjureInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",option,argument); \ + DestroyConjure(); \ + return(MagickFalse); \ +} + + char + *option; + + Image + *image; + + MagickStatusType + status; + + ssize_t + i; + + ssize_t + number_images; + + wand_unreferenced(metadata); + + /* + Set defaults. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + if (argc < 2) + return(ConjureUsage()); + image=NewImageList(); + number_images=0; + option=(char *) NULL; + /* + Conjure an image. + */ + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowConjureException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + for (i=1; i < (ssize_t) argc; i++) + { + option=argv[i]; + if (IsCommandOption(option) != MagickFalse) + { + if (LocaleCompare("concurrent",option+1) == 0) + break; + if (LocaleCompare("debug",option+1) == 0) + { + ssize_t + event; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConjureException(OptionError,"MissingArgument",option); + event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); + if (event < 0) + ThrowConjureException(OptionError,"UnrecognizedEventType", + argv[i]); + (void) SetLogEventMask(argv[i]); + continue; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConjureException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConjureInvalidArgumentException(option,argv[i]); + continue; + } + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + if (*option == '-') + { + DestroyConjure(); + return(ConjureUsage()); + } + continue; + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '-') + { + i++; + if (i == (ssize_t) argc) + ThrowConjureException(OptionError,"MissingLogFormat",option); + (void) SetLogFormat(argv[i]); + } + continue; + } + if (LocaleCompare("monitor",option+1) == 0) + continue; + if (LocaleCompare("quiet",option+1) == 0) + continue; + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConjureException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConjureInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("verbose",option+1) == 0) + { + image_info->verbose=(*option == '-') ? MagickTrue : MagickFalse; + continue; + } + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + /* + Persist key/value pair. + */ + (void) DeleteImageOption(image_info,option+1); + status=SetImageOption(image_info,option+1,argv[i+1]); + if (status == MagickFalse) + ThrowConjureException(ImageError,"UnableToPersistKey",option); + i++; + continue; + } + /* + Interpret MSL script. + */ + (void) DeleteImageOption(image_info,"filename"); + status=SetImageOption(image_info,"filename",argv[i]); + if (status == MagickFalse) + ThrowConjureException(ImageError,"UnableToPersistKey",argv[i]); + (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s",argv[i]); + (void) SetImageOption(image_info,"filename",argv[i]); + image=ReadImages(image_info,exception); + CatchException(exception); + if (image != (Image *) NULL) + image=DestroyImageList(image); + status=image != (Image *) NULL ? MagickTrue : MagickFalse; + number_images++; + } + if (i != (ssize_t) argc) + ThrowConjureException(OptionError,"MissingAnImageFilename",argv[i]); + if (number_images == 0) + ThrowConjureException(OptionError,"MissingAnImageFilename",argv[argc-1]); + if (image != (Image *) NULL) + image=DestroyImageList(image); + for (i=0; i < (ssize_t) argc; i++) + argv[i]=DestroyString(argv[i]); + argv=(char **) RelinquishMagickMemory(argv); + return(status != 0 ? MagickTrue : MagickFalse); +} diff --git a/ImageMagick-6.9.12-44/wand/conjure.h b/ImageMagick-6.9.12-44/wand/conjure.h new file mode 100644 index 0000000..6692865 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/conjure.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand conjure command-line method. +*/ +#ifndef MAGICKWAND_CONJURE_H +#define MAGICKWAND_CONJURE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport MagickBooleanType + ConjureImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/convert.c b/ImageMagick-6.9.12-44/wand/convert.c new file mode 100644 index 0000000..48df97e --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/convert.c @@ -0,0 +1,3250 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC OOO N N V V EEEEE RRRR TTTTT % +% C O O NN N V V E R R T % +% C O O N N N V V EEE RRRR T % +% C O O N NN V V E R R T % +% CCCC OOO N N V EEEEE R R T % +% % +% % +% Convert an image from one format to another. % +% % +% Software Design % +% Cristy % +% April 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Use the convert program to convert between image formats as well as resize +% an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, +% and much more. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/mogrify-private.h" +#include "magick/exception-private.h" +#include "magick/string-private.h" +#include "magick/utility-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C o n v e r t I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ConvertImageCommand() reads one or more images, applies one or more image +% processing operations, and writes out the image in the same or differing +% format. +% +% The format of the ConvertImageCommand method is: +% +% MagickBooleanType ConvertImageCommand(ImageInfo *image_info,int argc, +% char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType ConcatenateImages(int argc,char **argv, + ExceptionInfo *exception) +{ + FILE + *input, + *output; + + int + c; + + MagickBooleanType + status; + + ssize_t + i; + + /* + Open output file. + */ + output=fopen_utf8(argv[argc-1],"wb"); + if (output == (FILE *) NULL) + { + ThrowFileException(exception,FileOpenError,"UnableToOpenFile", + argv[argc-1]); + return(MagickFalse); + } + status=MagickTrue; + for (i=2; i < (ssize_t) (argc-1); i++) + { + input=fopen_utf8(argv[i],"rb"); + if (input == (FILE *) NULL) + { + ThrowFileException(exception,FileOpenError,"UnableToOpenFile",argv[i]); + continue; + } + for (c=fgetc(input); c != EOF; c=fgetc(input)) + if (fputc((char) c,output) != c) + status=MagickFalse; + (void) fclose(input); + (void) remove_utf8(argv[i]); + } + (void) fclose(output); + return(status); +} + +static MagickBooleanType ConvertUsage(void) +{ + static const char + miscellaneous[] = + " -debug events display copious debugging information\n" + " -distribute-cache port\n" + " distributed pixel cache spanning one or more servers\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information\n" + " -version print version information", + operators[] = + " -adaptive-blur geometry\n" + " adaptively blur pixels; decrease effect near edges\n" + " -adaptive-resize geometry\n" + " adaptively resize image using 'mesh' interpolation\n" + " -adaptive-sharpen geometry\n" + " adaptively sharpen pixels; increase effect near edges\n" + " -alpha option on, activate, off, deactivate, set, opaque, copy\n" + " transparent, extract, background, or shape\n" + " -annotate geometry text\n" + " annotate the image with text\n" + " -auto-gamma automagically adjust gamma level of image\n" + " -auto-level automagically adjust color levels of image\n" + " -auto-orient automagically orient (rotate) image\n" + " -bench iterations measure performance\n" + " -black-threshold value\n" + " force all pixels below the threshold into black\n" + " -blue-shift factor simulate a scene at nighttime in the moonlight\n" + " -blur geometry reduce image noise and reduce detail levels\n" + " -border geometry surround image with a border of color\n" + " -bordercolor color border color\n" + " -brightness-contrast geometry\n" + " improve brightness / contrast of the image\n" + " -canny geometry detect edges in the image\n" + " -cdl filename color correct with a color decision list\n" + " -charcoal radius simulate a charcoal drawing\n" + " -chop geometry remove pixels from the image interior\n" + " -clamp keep pixel values in range (0-QuantumRange)\n" + " -clip clip along the first path from the 8BIM profile\n" + " -clip-path id clip along a named path from the 8BIM profile\n" + " -colorize value colorize the image with the fill color\n" + " -color-matrix matrix apply color correction to the image\n" + " -connected-components connectivity\n" + " connected-components uniquely labeled\n" + " -contrast enhance or reduce the image contrast\n" + " -contrast-stretch geometry\n" + " improve contrast by `stretching' the intensity range\n" + " -convolve coefficients\n" + " apply a convolution kernel to the image\n" + " -cycle amount cycle the image colormap\n" + " -decipher filename convert cipher pixels to plain pixels\n" + " -deskew threshold straighten an image\n" + " -despeckle reduce the speckles within an image\n" + " -distort method args\n" + " distort images according to given method ad args\n" + " -draw string annotate the image with a graphic primitive\n" + " -edge radius apply a filter to detect edges in the image\n" + " -encipher filename convert plain pixels to cipher pixels\n" + " -emboss radius emboss an image\n" + " -enhance apply a digital filter to enhance a noisy image\n" + " -equalize perform histogram equalization to an image\n" + " -evaluate operator value\n" + " evaluate an arithmetic, relational, or logical expression\n" + " -extent geometry set the image size\n" + " -extract geometry extract area from image\n" + " -features distance analyze image features (e.g. contrast, correlation)\n" + " -fft implements the discrete Fourier transform (DFT)\n" + " -flip flip image vertically\n" + " -floodfill geometry color\n" + " floodfill the image with color\n" + " -flop flop image horizontally\n" + " -frame geometry surround image with an ornamental border\n" + " -function name parameters\n" + " apply function over image values\n" + " -gamma value level of gamma correction\n" + " -gaussian-blur geometry\n" + " reduce image noise and reduce detail levels\n" + " -geometry geometry preferred size or location of the image\n" + " -grayscale method convert image to grayscale\n" + " -hough-lines geometry\n" + " identify lines in the image\n" + " -identify identify the format and characteristics of the image\n" + " -ift implements the inverse discrete Fourier transform (DFT)\n" + " -implode amount implode image pixels about the center\n" + " -interpolative-resize geometry\n" + " resize image using 'point sampled' interpolation\n" + " -kuwahara geometry edge preserving noise reduction filter\n" + " -lat geometry local adaptive thresholding\n" + " -level value adjust the level of image contrast\n" + " -level-colors color,color\n" + " level image with the given colors\n" + " -linear-stretch geometry\n" + " improve contrast by `stretching with saturation'\n" + " -liquid-rescale geometry\n" + " rescale image with seam-carving\n" + " -local-contrast geometry\n" + " enhance local contrast\n" + " -magnify double the size of the image with pixel art scaling\n" + " -mean-shift geometry delineate arbitrarily shaped clusters in the image\n" + " -median geometry apply a median filter to the image\n" + " -mode geometry make each pixel the 'predominant color' of the\n" + " neighborhood\n" + " -modulate value vary the brightness, saturation, and hue\n" + " -monochrome transform image to black and white\n" + " -morphology method kernel\n" + " apply a morphology method to the image\n" + " -motion-blur geometry\n" + " simulate motion blur\n" + " -negate replace every pixel with its complementary color \n" + " -noise geometry add or reduce noise in an image\n" + " -normalize transform image to span the full range of colors\n" + " -opaque color change this color to the fill color\n" + " -ordered-dither NxN\n" + " add a noise pattern to the image with specific\n" + " amplitudes\n" + " -paint radius simulate an oil painting\n" + " -perceptible epsilon\n" + " pixel value less than |epsilon| become epsilon or\n" + " -epsilon\n" + " -polaroid angle simulate a Polaroid picture\n" + " -posterize levels reduce the image to a limited number of color levels\n" + " -profile filename add, delete, or apply an image profile\n" + " -quantize colorspace reduce colors in this colorspace\n" + " -radial-blur angle radial blur the image (deprecated use -rotational-blur\n" + " -raise value lighten/darken image edges to create a 3-D effect\n" + " -random-threshold low,high\n" + " random threshold the image\n" + " -region geometry apply options to a portion of the image\n" + " -render render vector graphics\n" + " -resample geometry change the resolution of an image\n" + " -resize geometry resize the image\n" + " -roll geometry roll an image vertically or horizontally\n" + " -rotate degrees apply Paeth rotation to the image\n" + " -rotational-blur angle\n" + " rotational blur the image\n" + " -sample geometry scale image with pixel sampling\n" + " -scale geometry scale the image\n" + " -segment values segment an image\n" + " -selective-blur geometry\n" + " selectively blur pixels within a contrast threshold\n" + " -sepia-tone threshold\n" + " simulate a sepia-toned photo\n" + " -set property value set an image property\n" + " -shade degrees shade the image using a distant light source\n" + " -shadow geometry simulate an image shadow\n" + " -sharpen geometry sharpen the image\n" + " -shave geometry shave pixels from the image edges\n" + " -shear geometry slide one edge of the image along the X or Y axis\n" + " -sigmoidal-contrast geometry\n" + " increase the contrast without saturating highlights or\n" + " shadows\n" + " -sketch geometry simulate a pencil sketch\n" + " -solarize threshold negate all pixels above the threshold level\n" + " -sparse-color method args\n" + " fill in a image based on a few color points\n" + " -splice geometry splice the background color into the image\n" + " -spread radius displace image pixels by a random amount\n" + " -statistic type geometry\n" + " replace each pixel with corresponding statistic from the\n" + " neighborhood\n" + " -strip strip image of all profiles and comments\n" + " -swirl degrees swirl image pixels about the center\n" + " -threshold value threshold the image\n" + " -thumbnail geometry create a thumbnail of the image\n" + " -tile filename tile image when filling a graphic primitive\n" + " -tint value tint the image with the fill color\n" + " -transform affine transform image\n" + " -transparent color make this color transparent within the image\n" + " -transpose flip image vertically and rotate 90 degrees\n" + " -transverse flop image horizontally and rotate 270 degrees\n" + " -trim trim image edges\n" + " -type type image type\n" + " -unique-colors discard all but one of any pixel color\n" + " -unsharp geometry sharpen the image\n" + " -vignette geometry soften the edges of the image in vignette style\n" + " -wave geometry alter an image along a sine wave\n" + " -wavelet-denoise threshold\n" + " removes noise from the image using a wavelet transform\n" + " -white-threshold value\n" + " force all pixels above the threshold into white", + sequence_operators[] = + " -append append an image sequence\n" + " -clut apply a color lookup table to the image\n" + " -coalesce merge a sequence of images\n" + " -combine combine a sequence of images\n" + " -compare mathematically and visually annotate the difference between an image and its reconstruction\n" + " -complex operator perform complex mathematics on an image sequence\n" + " -composite composite image\n" + " -copy geometry offset\n" + " copy pixels from one area of an image to another\n" + " -crop geometry cut out a rectangular region of the image\n" + " -deconstruct break down an image sequence into constituent parts\n" + " -evaluate-sequence operator\n" + " evaluate an arithmetic, relational, or logical expression\n" + " -flatten flatten a sequence of images\n" + " -fx expression apply mathematical expression to an image channel(s)\n" + " -hald-clut apply a Hald color lookup table to the image\n" + " -layers method optimize, merge, or compare image layers\n" + " -morph value morph an image sequence\n" + " -mosaic create a mosaic from an image sequence\n" + " -poly terms build a polynomial from the image sequence and the corresponding\n" + " terms (coefficients and degree pairs).\n" + + " -print string interpret string and print to console\n" + " -process arguments process the image with a custom image filter\n" + " -separate separate an image channel into a grayscale image\n" + " -smush geometry smush an image sequence together\n" + " -write filename write images to this file", + settings[] = + " -adjoin join images into a single multi-image file\n" + " -affine matrix affine transform matrix\n" + " -alpha option activate, deactivate, reset, or set the alpha channel\n" + " -antialias remove pixel-aliasing\n" + " -authenticate password\n" + " decipher image with this password\n" + " -attenuate value lessen (or intensify) when adding noise to an image\n" + " -background color background color\n" + " -bias value add bias when convolving an image\n" + " -black-point-compensation\n" + " use black point compensation\n" + " -blue-primary point chromaticity blue primary point\n" + " -bordercolor color border color\n" + " -caption string assign a caption to an image\n" + " -channel type apply option to select image channels\n" + " -clip-mask filename associate a clip mask with the image\n" + " -colors value preferred number of colors in the image\n" + " -colorspace type alternate image colorspace\n" + " -comment string annotate image with comment\n" + " -compose operator set image composite operator\n" + " -compress type type of pixel compression when writing the image\n" + " -define format:option\n" + " define one or more image format options\n" + " -delay value display the next image after pausing\n" + " -density geometry horizontal and vertical density of the image\n" + " -depth value image depth\n" + " -direction type render text right-to-left or left-to-right\n" + " -display server get image or font from this X server\n" + " -dispose method layer disposal method\n" + " -dither method apply error diffusion to image\n" + " -encoding type text encoding type\n" + " -endian type endianness (MSB or LSB) of the image\n" + " -family name render text with this font family\n" + " -fill color color to use when filling a graphic primitive\n" + " -filter type use this filter when resizing an image\n" + " -font name render text with this font\n" + " -format \"string\" output formatted image characteristics\n" + " -fuzz distance colors within this distance are considered equal\n" + " -gravity type horizontal and vertical text placement\n" + " -green-primary point chromaticity green primary point\n" + " -intensity method method to generate intensity value from pixel\n" + " -intent type type of rendering intent when managing the image color\n" + " -interlace type type of image interlacing scheme\n" + " -interline-spacing value\n" + " set the space between two text lines\n" + " -interpolate method pixel color interpolation method\n" + " -interword-spacing value\n" + " set the space between two words\n" + " -kerning value set the space between two letters\n" + " -label string assign a label to an image\n" + " -limit type value pixel cache resource limit\n" + " -loop iterations add Netscape loop extension to your GIF animation\n" + " -mask filename associate a mask with the image\n" + " -matte store matte channel if the image has one\n" + " -mattecolor color frame color\n" + " -moments report image moments\n" + " -monitor monitor progress\n" + " -orient type image orientation\n" + " -page geometry size and location of an image canvas (setting)\n" + " -ping efficiently determine image attributes\n" + " -pointsize value font point size\n" + " -precision value maximum number of significant digits to print\n" + " -preview type image preview type\n" + " -quality value JPEG/MIFF/PNG compression level\n" + " -quiet suppress all warning messages\n" + " -red-primary point chromaticity red primary point\n" + " -regard-warnings pay attention to warning messages\n" + " -remap filename transform image colors to match this set of colors\n" + " -repage geometry size and location of an image canvas\n" + " -respect-parentheses settings remain in effect until parenthesis boundary\n" + " -sampling-factor geometry\n" + " horizontal and vertical sampling factor\n" + " -scene value image scene number\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -size geometry width and height of image\n" + " -stretch type render text with this font stretch\n" + " -stroke color graphic primitive stroke color\n" + " -strokewidth value graphic primitive stroke width\n" + " -style type render text with this font style\n" + " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n" + " -synchronize synchronize image to storage device\n" + " -taint declare the image as modified\n" + " -texture filename name of texture to tile onto the image background\n" + " -tile-offset geometry\n" + " tile offset\n" + " -treedepth value color tree depth\n" + " -transparent-color color\n" + " transparent color\n" + " -undercolor color annotation bounding box color\n" + " -units type the units of image resolution\n" + " -verbose print detailed information about the image\n" + " -view FlashPix viewing transforms\n" + " -virtual-pixel method\n" + " virtual pixel access method\n" + " -weight type render text with this font weight\n" + " -white-point point chromaticity white point", + stack_operators[] = + " -clone indexes clone an image\n" + " -delete indexes delete the image from the image sequence\n" + " -duplicate count,indexes\n" + " duplicate an image one or more times\n" + " -insert index insert last image into the image sequence\n" + " -reverse reverse image sequence\n" + " -swap indexes swap two images in the image sequence"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] file [ [options ...] " + "file ...] [options ...] file\n",GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nImage Operators:\n"); + (void) puts(operators); + (void) printf("\nImage Sequence Operators:\n"); + (void) puts(sequence_operators); + (void) printf("\nImage Stack Operators:\n"); + (void) puts(stack_operators); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf( + "\nBy default, the image format of `file' is determined by its magic\n"); + (void) printf( + "number. To specify a particular image format, precede the filename\n"); + (void) printf( + "with an image format name and a colon (i.e. ps:image) or specify the\n"); + (void) printf( + "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); + (void) printf("'-' for standard input or output.\n"); + return(MagickTrue); +} + +WandExport MagickBooleanType ConvertImageCommand(ImageInfo *image_info, + int argc,char **argv,char **metadata,ExceptionInfo *exception) +{ +#define NotInitialized (unsigned int) (~0) +#define DestroyConvert() \ +{ \ + DestroyImageStack(); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowConvertException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option); \ + DestroyConvert(); \ + return(MagickFalse); \ +} +#define ThrowConvertInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",option,argument); \ + DestroyConvert(); \ + return(MagickFalse); \ +} + + char + *filename, + *option; + + const char + *format; + + Image + *image; + + ImageStack + image_stack[MaxImageStackDepth+1]; + + MagickBooleanType + fire, + pend, + respect_parenthesis; + + MagickStatusType + status; + + ssize_t + i; + + ssize_t + j, + k; + + /* + Set defaults. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + if (argc == 2) + { + option=argv[1]; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + } + if (argc < 3) + return(ConvertUsage()); + filename=(char *) NULL; + format="%w,%h,%m"; + j=1; + k=0; + NewImageStack(); + option=(char *) NULL; + pend=MagickFalse; + respect_parenthesis=MagickFalse; + status=MagickTrue; + /* + Parse command-line arguments. + */ + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowConvertException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + if ((argc > 2) && (LocaleCompare("-concatenate",argv[1]) == 0)) + return(ConcatenateImages(argc,argv,exception)); + for (i=1; i < (ssize_t) (argc-1); i++) + { + option=argv[i]; + if (LocaleCompare(option,"(") == 0) + { + FireImageStack(MagickTrue,MagickTrue,pend); + if (k == MaxImageStackDepth) + ThrowConvertException(OptionError,"ParenthesisNestedTooDeeply", + option); + PushImageStack(); + continue; + } + if (LocaleCompare(option,")") == 0) + { + FireImageStack(MagickTrue,MagickTrue,MagickTrue); + if (k == 0) + ThrowConvertException(OptionError,"UnableToParseExpression",option); + PopImageStack(); + continue; + } + if (IsCommandOption(option) == MagickFalse) + { + Image + *images; + + /* + Read input image. + */ + FireImageStack(MagickTrue,MagickTrue,pend); + filename=argv[i]; + if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1))) + filename=argv[++i]; + (void) SetImageOption(image_info,"filename",filename); + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + if (image_info->ping != MagickFalse) + images=PingImages(image_info,exception); + else + images=ReadImages(image_info,exception); + status&=(images != (Image *) NULL) && + (exception->severity < ErrorException); + if (images == (Image *) NULL) + continue; + AppendImageStack(images); + continue; + } + pend=image != (Image *) NULL ? MagickTrue : MagickFalse; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("adaptive-blur",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("adaptive-resize",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("adaptive-sharpen",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("adjoin",option+1) == 0) + break; + if (LocaleCompare("affine",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("alpha",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowConvertException(OptionError,"UnrecognizedAlphaChannelType", + argv[i]); + break; + } + if (LocaleCompare("annotate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("antialias",option+1) == 0) + break; + if (LocaleCompare("append",option+1) == 0) + break; + if (LocaleCompare("attenuate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("authenticate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("auto-gamma",option+1) == 0) + break; + if (LocaleCompare("auto-level",option+1) == 0) + break; + if (LocaleCompare("auto-orient",option+1) == 0) + break; + if (LocaleCompare("average",option+1) == 0) + break; + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'b': + { + if (LocaleCompare("background",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("bench",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("bias",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("black-point-compensation",option+1) == 0) + break; + if (LocaleCompare("black-threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("blue-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("blue-shift",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("blur",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("border",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("bordercolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("box",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("brightness-contrast",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("canny",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("caption",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("cdl",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + ssize_t + channel; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + channel=ParseChannelOption(argv[i]); + if (channel < 0) + ThrowConvertException(OptionError,"UnrecognizedChannelType", + argv[i]); + break; + } + if (LocaleCompare("charcoal",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("chop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("clamp",option+1) == 0) + break; + if (LocaleCompare("clip",option+1) == 0) + break; + if (LocaleCompare("clip-mask",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("clip-path",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("clone",option+1) == 0) + { + Image + *clone_images, + *clone_list; + + if (k == 0) + clone_list=CloneImageList(image,exception); + else + clone_list=CloneImageList(image_stack[k-1].image,exception); + if (clone_list == (Image *) NULL) + ThrowConvertException(ImageError,"ImageSequenceRequired",option); + FireImageStack(MagickTrue,MagickTrue,MagickTrue); + if (*option == '+') + clone_images=CloneImages(clone_list,"-1",exception); + else + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + clone_images=CloneImages(clone_list,argv[i],exception); + } + if (clone_images == (Image *) NULL) + ThrowConvertException(OptionError,"NoSuchImage",option); + AppendImageStack(clone_images); + clone_list=DestroyImageList(clone_list); + break; + } + if (LocaleCompare("clut",option+1) == 0) + break; + if (LocaleCompare("coalesce",option+1) == 0) + break; + if (LocaleCompare("colorize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("color-matrix",option+1) == 0) + { + KernelInfo + *kernel_info; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + kernel_info=AcquireKernelInfo(argv[i]); + if (kernel_info == (KernelInfo *) NULL) + ThrowConvertInvalidArgumentException(option,argv[i]); + kernel_info=DestroyKernelInfo(kernel_info); + break; + } + if (LocaleCompare("colors",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || + (IsGeometry(argv[i]) == MagickFalse)) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowConvertException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("combine",option+1) == 0) + break; + if (LocaleCompare("comment",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("compare",option+1) == 0) + break; + if (LocaleCompare("complex",option+1) == 0) + { + ssize_t + op; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickComplexOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowConvertException(OptionError,"UnrecognizedComplexOperator", + argv[i]); + break; + } + if (LocaleCompare("compose",option+1) == 0) + { + ssize_t + compose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + compose=ParseCommandOption(MagickComposeOptions,MagickFalse, + argv[i]); + if (compose < 0) + ThrowConvertException(OptionError,"UnrecognizedComposeOperator", + argv[i]); + break; + } + if (LocaleCompare("composite",option+1) == 0) + break; + if (LocaleCompare("compress",option+1) == 0) + { + ssize_t + compress; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + compress=ParseCommandOption(MagickCompressOptions,MagickFalse, + argv[i]); + if (compress < 0) + ThrowConvertException(OptionError,"UnrecognizedImageCompression", + argv[i]); + break; + } + if (LocaleCompare("concurrent",option+1) == 0) + break; + if (LocaleCompare("connected-components",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("contrast",option+1) == 0) + break; + if (LocaleCompare("contrast-stretch",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("convolve",option+1) == 0) + { + KernelInfo + *kernel_info; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + kernel_info=AcquireKernelInfo(argv[i]); + if (kernel_info == (KernelInfo *) NULL) + ThrowConvertInvalidArgumentException(option,argv[i]); + kernel_info=DestroyKernelInfo(kernel_info); + break; + } + if (LocaleCompare("copy",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("crop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("cycle",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'd': + { + if (LocaleCompare("decipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("deconstruct",option+1) == 0) + break; + if (LocaleCompare("debug",option+1) == 0) + { + ssize_t + event; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); + if (event < 0) + ThrowConvertException(OptionError,"UnrecognizedEventType", + argv[i]); + (void) SetLogEventMask(argv[i]); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (*option == '+') + { + const char + *define; + + define=GetImageOption(image_info,argv[i]); + if (define == (const char *) NULL) + ThrowConvertException(OptionError,"NoSuchOption",argv[i]); + break; + } + break; + } + if (LocaleCompare("delay",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("delete",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("density",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("deskew",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("despeckle",option+1) == 0) + break; + if (LocaleCompare("direction",option+1) == 0) + { + ssize_t + direction; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + direction=ParseCommandOption(MagickDirectionOptions,MagickFalse, + argv[i]); + if (direction < 0) + ThrowConvertException(OptionError,"UnrecognizedDirectionType", + argv[i]); + break; + } + if (LocaleCompare("display",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("dispose",option+1) == 0) + { + ssize_t + dispose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]); + if (dispose < 0) + ThrowConvertException(OptionError,"UnrecognizedDisposeMethod", + argv[i]); + break; + } + if (LocaleCompare("distort",option+1) == 0) + { + ssize_t + op; + + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickDistortOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowConvertException(OptionError,"UnrecognizedDistortMethod", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("dither",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]); + if (method < 0) + ThrowConvertException(OptionError,"UnrecognizedDitherMethod", + argv[i]); + break; + } + if (LocaleCompare("draw",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("duplicate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'e': + { + if (LocaleCompare("edge",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("emboss",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("encipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("encoding",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("endian",option+1) == 0) + { + ssize_t + endian; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + endian=ParseCommandOption(MagickEndianOptions,MagickFalse, + argv[i]); + if (endian < 0) + ThrowConvertException(OptionError,"UnrecognizedEndianType", + argv[i]); + break; + } + if (LocaleCompare("enhance",option+1) == 0) + break; + if (LocaleCompare("equalize",option+1) == 0) + break; + if (LocaleCompare("evaluate",option+1) == 0) + { + ssize_t + op; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickEvaluateOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowConvertException(OptionError,"UnrecognizedEvaluateOperator", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("evaluate-sequence",option+1) == 0) + { + ssize_t + op; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickEvaluateOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowConvertException(OptionError,"UnrecognizedEvaluateOperator", + argv[i]); + break; + } + if (LocaleCompare("extent",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("extract",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'f': + { + if (LocaleCompare("family",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("features",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("fft",option+1) == 0) + break; + if (LocaleCompare("fill",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("filter",option+1) == 0) + { + ssize_t + filter; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]); + if (filter < 0) + ThrowConvertException(OptionError,"UnrecognizedImageFilter", + argv[i]); + break; + } + if (LocaleCompare("flatten",option+1) == 0) + break; + if (LocaleCompare("flip",option+1) == 0) + break; + if (LocaleCompare("flop",option+1) == 0) + break; + if (LocaleCompare("floodfill",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("font",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("format",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + format=argv[i]; + break; + } + if (LocaleCompare("frame",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("function",option+1) == 0) + { + ssize_t + op; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickFunctionOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowConvertException(OptionError,"UnrecognizedFunction",argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("fuzz",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("fx",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'g': + { + if (LocaleCompare("gamma",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if ((LocaleCompare("gaussian-blur",option+1) == 0) || + (LocaleCompare("gaussian",option+1) == 0)) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("geometry",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("gravity",option+1) == 0) + { + ssize_t + gravity; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse, + argv[i]); + if (gravity < 0) + ThrowConvertException(OptionError,"UnrecognizedGravityType", + argv[i]); + break; + } + if (LocaleCompare("grayscale",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickPixelIntensityOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowConvertException(OptionError,"UnrecognizedIntensityMethod", + argv[i]); + break; + } + if (LocaleCompare("green-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'h': + { + if (LocaleCompare("hald-clut",option+1) == 0) + break; + if (LocaleCompare("hough-lines",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + DestroyConvert(); + return(ConvertUsage()); + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'i': + { + if (LocaleCompare("identify",option+1) == 0) + break; + if (LocaleCompare("ift",option+1) == 0) + break; + if (LocaleCompare("implode",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("interpolative-resize",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("insert",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("intensity",option+1) == 0) + { + ssize_t + intensity; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + intensity=ParseCommandOption(MagickPixelIntensityOptions, + MagickFalse,argv[i]); + if (intensity < 0) + ThrowConvertException(OptionError, + "UnrecognizedPixelIntensityMethod",argv[i]); + break; + } + if (LocaleCompare("intent",option+1) == 0) + { + ssize_t + intent; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + intent=ParseCommandOption(MagickIntentOptions,MagickFalse,argv[i]); + if (intent < 0) + ThrowConvertException(OptionError,"UnrecognizedIntentType", + argv[i]); + break; + } + if (LocaleCompare("interlace",option+1) == 0) + { + ssize_t + interlace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, + argv[i]); + if (interlace < 0) + ThrowConvertException(OptionError,"UnrecognizedInterlaceType", + argv[i]); + break; + } + if (LocaleCompare("interline-spacing",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("interpolate",option+1) == 0) + { + ssize_t + interpolate; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, + argv[i]); + if (interpolate < 0) + ThrowConvertException(OptionError,"UnrecognizedInterpolateMethod", + argv[i]); + break; + } + if (LocaleCompare("interword-spacing",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'k': + { + if (LocaleCompare("kerning",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("kuwahara",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'l': + { + if (LocaleCompare("label",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("lat",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("layers",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickLayerOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowConvertException(OptionError,"UnrecognizedLayerMethod", + argv[i]); + break; + } + if (LocaleCompare("level",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("level-colors",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("linewidth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("liquid-rescale",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("limit",option+1) == 0) + { + char + *p; + + double + value; + + ssize_t + resource; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + resource=ParseCommandOption(MagickResourceOptions,MagickFalse, + argv[i]); + if (resource < 0) + ThrowConvertException(OptionError,"UnrecognizedResourceType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + value=StringToDouble(argv[i],&p); + (void) value; + if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("linear-stretch",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); + if (list < 0) + ThrowConvertException(OptionError,"UnrecognizedListType",argv[i]); + status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) + argv+j,exception); + DestroyConvert(); + return(status == 0 ? MagickFalse : MagickTrue); + } + if (LocaleCompare("local-contrast",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || + (strchr(argv[i],'%') == (char *) NULL)) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("loop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'm': + { + if (LocaleCompare("magnify",option+1) == 0) + break; + if (LocaleCompare("map",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("mask",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("matte",option+1) == 0) + break; + if (LocaleCompare("mattecolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("maximum",option+1) == 0) + break; + if (LocaleCompare("mean-shift",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("median",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("metric",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickMetricOptions,MagickTrue,argv[i]); + if (type < 0) + ThrowConvertException(OptionError,"UnrecognizedMetricType", + argv[i]); + break; + } + if (LocaleCompare("minimum",option+1) == 0) + break; + if (LocaleCompare("mode",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("modulate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("moments",option+1) == 0) + break; + if (LocaleCompare("monitor",option+1) == 0) + break; + if (LocaleCompare("monochrome",option+1) == 0) + break; + if (LocaleCompare("morph",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("morphology",option+1) == 0) + { + char + token[MaxTextExtent]; + + KernelInfo + *kernel_info; + + ssize_t + op; + + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + (void) GetNextToken(argv[i],(const char **) NULL,MaxTextExtent,token); + op=ParseCommandOption(MagickMorphologyOptions,MagickFalse,token); + if (op < 0) + ThrowConvertException(OptionError,"UnrecognizedMorphologyMethod", + token); + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + kernel_info=AcquireKernelInfo(argv[i]); + if (kernel_info == (KernelInfo *) NULL) + ThrowConvertInvalidArgumentException(option,argv[i]); + kernel_info=DestroyKernelInfo(kernel_info); + break; + } + if (LocaleCompare("mosaic",option+1) == 0) + break; + if (LocaleCompare("motion-blur",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'n': + { + if (LocaleCompare("negate",option+1) == 0) + break; + if (LocaleCompare("noise",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (*option == '+') + { + ssize_t + noise; + + noise=ParseCommandOption(MagickNoiseOptions,MagickFalse, + argv[i]); + if (noise < 0) + ThrowConvertException(OptionError,"UnrecognizedNoiseType", + argv[i]); + break; + } + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("noop",option+1) == 0) + break; + if (LocaleCompare("normalize",option+1) == 0) + break; + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'o': + { + if (LocaleCompare("opaque",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("ordered-dither",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("orient",option+1) == 0) + { + ssize_t + orientation; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + orientation=ParseCommandOption(MagickOrientationOptions, + MagickFalse,argv[i]); + if (orientation < 0) + ThrowConvertException(OptionError,"UnrecognizedImageOrientation", + argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",argv[i]) + } + case 'p': + { + if (LocaleCompare("page",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("paint",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("perceptible",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("ping",option+1) == 0) + break; + if (LocaleCompare("pointsize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("polaroid",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("poly",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("posterize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("precision",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("preview",option+1) == 0) + { + ssize_t + preview; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + preview=ParseCommandOption(MagickPreviewOptions,MagickFalse, + argv[i]); + if (preview < 0) + ThrowConvertException(OptionError,"UnrecognizedPreviewType", + argv[i]); + break; + } + if (LocaleCompare("print",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("process",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("profile",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'q': + { + if (LocaleCompare("quality",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("quantize",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowConvertException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("quiet",option+1) == 0) + break; + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'r': + { + if (LocaleCompare("radial-blur",option+1) == 0 || + LocaleCompare("rotational-blur",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("raise",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("random-threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("recolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("red-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleCompare("region",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("remap",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("render",option+1) == 0) + break; + if (LocaleCompare("repage",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resample",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleNCompare("respect-parentheses",option+1,17) == 0) + { + respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("reverse",option+1) == 0) + break; + if (LocaleCompare("roll",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("rotate",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 's': + { + if (LocaleCompare("sample",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sampling-factor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("scale",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("scene",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("segment",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("selective-blur",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("separate",option+1) == 0) + break; + if (LocaleCompare("sepia-tone",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("set",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("shade",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("shadow",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sharpen",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("shave",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("shear",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sigmoidal-contrast",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("size",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sketch",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("smush",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("solarize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sparse-color",option+1) == 0) + { + ssize_t + op; + + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickSparseColorOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowConvertException(OptionError,"UnrecognizedSparseColorMethod", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("splice",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("spread",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || + (IsGeometry(argv[i]) == MagickFalse)) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("statistic",option+1) == 0) + { + ssize_t + op; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickStatisticOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowConvertException(OptionError,"UnrecognizedStatisticType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("stretch",option+1) == 0) + { + ssize_t + stretch; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + stretch=ParseCommandOption(MagickStretchOptions,MagickFalse, + argv[i]); + if (stretch < 0) + ThrowConvertException(OptionError,"UnrecognizedStyleType", + argv[i]); + break; + } + if (LocaleCompare("strip",option+1) == 0) + break; + if (LocaleCompare("stroke",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("strokewidth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("style",option+1) == 0) + { + ssize_t + style; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + style=ParseCommandOption(MagickStyleOptions,MagickFalse,argv[i]); + if (style < 0) + ThrowConvertException(OptionError,"UnrecognizedStyleType", + argv[i]); + break; + } + if (LocaleCompare("support",option+1) == 0) + { + i++; /* deprecated */ + break; + } + if (LocaleCompare("swap",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("swirl",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("synchronize",option+1) == 0) + break; + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 't': + { + if (LocaleCompare("taint",option+1) == 0) + break; + if (LocaleCompare("texture",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("thumbnail",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("tile",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("tile-offset",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("tint",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("transform",option+1) == 0) + break; + if (LocaleCompare("transparent",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("transparent-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("transpose",option+1) == 0) + break; + if (LocaleCompare("transverse",option+1) == 0) + break; + if (LocaleCompare("treedepth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("trim",option+1) == 0) + break; + if (LocaleCompare("type",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowConvertException(OptionError,"UnrecognizedImageType", + argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'u': + { + if (LocaleCompare("undercolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("unique-colors",option+1) == 0) + break; + if (LocaleCompare("units",option+1) == 0) + { + ssize_t + units; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + units=ParseCommandOption(MagickResolutionOptions,MagickFalse, + argv[i]); + if (units < 0) + ThrowConvertException(OptionError,"UnrecognizedUnitsType", + argv[i]); + break; + } + if (LocaleCompare("unsharp",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + break; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + break; + } + if (LocaleCompare("view",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("vignette",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowConvertException(OptionError, + "UnrecognizedVirtualPixelMethod",argv[i]); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case 'w': + { + if (LocaleCompare("wave",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("wavelet-denoise",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("weight",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("white-point",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("white-threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowConvertInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("write",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowConvertException(OptionError,"MissingArgument",option); + break; + } + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + case '?': + break; + default: + ThrowConvertException(OptionError,"UnrecognizedOption",option) + } + fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & + FireOptionFlag) == 0 ? MagickFalse : MagickTrue; + if (fire != MagickFalse) + FireImageStack(MagickTrue,MagickTrue,MagickTrue); + } + if (k != 0) + ThrowConvertException(OptionError,"UnbalancedParenthesis",argv[i]); + if (i-- != (ssize_t) (argc-1)) + ThrowConvertException(OptionError,"MissingAnImageFilename",argv[argc-1]); + FinalizeImageSettings(image_info,image,MagickTrue); + if (image == (Image *) NULL) + ThrowConvertException(OptionError,"NoImagesDefined",argv[argc-1]); + if (IsCommandOption(argv[argc-1])) + ThrowConvertException(OptionError,"MissingAnImageFilename",argv[argc-1]); + if (LocaleCompare(" ",argv[argc-1]) == 0) /* common line continuation error */ + ThrowConvertException(OptionError,"MissingAnImageFilename",argv[argc-1]); + status&=WriteImages(image_info,image,argv[argc-1],exception); + if (metadata != (char **) NULL) + { + char + *text; + + text=InterpretImageProperties(image_info,image,format); + InheritException(exception,&image->exception); + if (text == (char *) NULL) + ThrowConvertException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + (void) ConcatenateString(&(*metadata),text); + text=DestroyString(text); + } + DestroyConvert(); + return(status != 0 ? MagickTrue : MagickFalse); +} diff --git a/ImageMagick-6.9.12-44/wand/convert.h b/ImageMagick-6.9.12-44/wand/convert.h new file mode 100644 index 0000000..25295cc --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/convert.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand convert command-line method. +*/ +#ifndef MAGICKWAND_CONVERT_H +#define MAGICKWAND_CONVERT_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport MagickBooleanType + ConvertImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/deprecate.c b/ImageMagick-6.9.12-44/wand/deprecate.c new file mode 100644 index 0000000..a75d857 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/deprecate.c @@ -0,0 +1,3161 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD EEEEE PPPP RRRR EEEEE CCCC AAA TTTTT EEEEE % +% D D E P P R R E C A A T E % +% D D EEE PPPPP RRRR EEE C AAAAA T EEE % +% D D E P R R E C A A T E % +% DDDD EEEEE P R R EEEEE CCCC A A T EEEEE % +% % +% % +% MagickWand Deprecated Methods % +% % +% Software Design % +% Cristy % +% October 2002 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/magick-wand-private.h" +#include "wand/wand.h" +#include "magick/monitor-private.h" +#include "magick/thread-private.h" + +/* + Define declarations. +*/ +#define PixelViewId "PixelView" + +/* + Typedef declarations. +*/ +struct _PixelView +{ + size_t + id; + + char + name[MaxTextExtent]; + + ExceptionInfo + *exception; + + MagickWand + *wand; + + CacheView + *view; + + RectangleInfo + region; + + size_t + number_threads; + + PixelWand + ***pixel_wands; + + MagickBooleanType + debug; + + size_t + signature; +}; + +#if !defined(MAGICKCORE_EXCLUDE_DEPRECATED) +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D r a w A l l o c a t e W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawAllocateWand() allocates an initial drawing wand which is an opaque +% handle required by the remaining drawing methods. +% +% The format of the DrawAllocateWand method is: +% +% DrawingWand DrawAllocateWand(const DrawInfo *draw_info,Image *image) +% +% A description of each parameter follows: +% +% o draw_info: Initial drawing defaults. Set to NULL to use defaults. +% +% o image: the image to draw on. +% +*/ +WandExport DrawingWand *DrawAllocateWand(const DrawInfo *draw_info,Image *image) +{ + return(AcquireDrawingWand(draw_info,image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A v e r a g e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAverageImages() average a set of images. +% +% The format of the MagickAverageImages method is: +% +% MagickWand *MagickAverageImages(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ + +static MagickWand *CloneMagickWandFromImages(const MagickWand *wand, + Image *images) +{ + MagickWand + *clone_wand; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + clone_wand=(MagickWand *) AcquireMagickMemory(sizeof(*clone_wand)); + if (clone_wand == (MagickWand *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + images->filename); + (void) memset(clone_wand,0,sizeof(*clone_wand)); + clone_wand->id=AcquireWandId(); + (void) FormatLocaleString(clone_wand->name,MaxTextExtent,"%s-%.20g", + MagickWandId,(double) clone_wand->id); + clone_wand->exception=AcquireExceptionInfo(); + InheritException(clone_wand->exception,wand->exception); + clone_wand->image_info=CloneImageInfo(wand->image_info); + clone_wand->quantize_info=CloneQuantizeInfo(wand->quantize_info); + clone_wand->images=images; + clone_wand->debug=IsEventLogging(); + if (clone_wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_wand->name); + clone_wand->signature=WandSignature; + return(clone_wand); +} + +WandExport MagickWand *MagickAverageImages(MagickWand *wand) +{ + Image + *average_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + average_image=EvaluateImages(wand->images,MeanEvaluateOperator, + wand->exception); + if (average_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,average_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e P i x e l V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClonePixelView() makes a copy of the specified pixel view. +% +% The format of the ClonePixelView method is: +% +% PixelView *ClonePixelView(const PixelView *pixel_view) +% +% A description of each parameter follows: +% +% o pixel_view: the pixel view. +% +*/ +WandExport PixelView *ClonePixelView(const PixelView *pixel_view) +{ + PixelView + *clone_view; + + ssize_t + i; + + assert(pixel_view != (PixelView *) NULL); + assert(pixel_view->signature == WandSignature); + if (pixel_view->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",pixel_view->name); + clone_view=(PixelView *) AcquireMagickMemory(sizeof(*clone_view)); + if (clone_view == (PixelView *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + pixel_view->name); + (void) memset(clone_view,0,sizeof(*clone_view)); + clone_view->id=AcquireWandId(); + (void) FormatLocaleString(clone_view->name,MaxTextExtent,"%s-%.20g", + PixelViewId,(double) clone_view->id); + clone_view->exception=AcquireExceptionInfo(); + InheritException(clone_view->exception,pixel_view->exception); + clone_view->view=CloneCacheView(pixel_view->view); + clone_view->region=pixel_view->region; + clone_view->number_threads=pixel_view->number_threads; + for (i=0; i < (ssize_t) pixel_view->number_threads; i++) + clone_view->pixel_wands[i]=ClonePixelWands((const PixelWand **) + pixel_view->pixel_wands[i],pixel_view->region.width); + clone_view->debug=pixel_view->debug; + if (clone_view->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_view->name); + clone_view->signature=WandSignature; + return(clone_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y P i x e l V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyPixelView() deallocates memory associated with a pixel view. +% +% The format of the DestroyPixelView method is: +% +% PixelView *DestroyPixelView(PixelView *pixel_view, +% const size_t number_wands,const size_t number_threads) +% +% A description of each parameter follows: +% +% o pixel_view: the pixel view. +% +% o number_wand: the number of pixel wands. +% +% o number_threads: number of threads. +% +*/ + +static PixelWand ***DestroyPixelsTLS(PixelWand ***pixel_wands, + const size_t number_wands,const size_t number_threads) +{ + ssize_t + i; + + assert(pixel_wands != (PixelWand ***) NULL); + for (i=0; i < (ssize_t) number_threads; i++) + if (pixel_wands[i] != (PixelWand **) NULL) + pixel_wands[i]=DestroyPixelWands(pixel_wands[i],number_wands); + pixel_wands=(PixelWand ***) RelinquishMagickMemory(pixel_wands); + return(pixel_wands); +} + +WandExport PixelView *DestroyPixelView(PixelView *pixel_view) +{ + assert(pixel_view != (PixelView *) NULL); + assert(pixel_view->signature == WandSignature); + pixel_view->pixel_wands=DestroyPixelsTLS(pixel_view->pixel_wands, + pixel_view->region.width,pixel_view->number_threads); + pixel_view->view=DestroyCacheView(pixel_view->view); + pixel_view->exception=DestroyExceptionInfo(pixel_view->exception); + pixel_view->signature=(~WandSignature); + RelinquishWandId(pixel_view->id); + pixel_view=(PixelView *) RelinquishMagickMemory(pixel_view); + return(pixel_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D u p l e x T r a n s f e r P i x e l V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DuplexTransferPixelViewIterator() iterates over three pixel views in +% parallel and calls your transfer method for each scanline of the view. The +% source and duplex pixel region is not confined to the image canvas-- that is +% you can include negative offsets or widths or heights that exceed the image +% dimension. However, the destination pixel view is confined to the image +% canvas-- that is no negative offsets or widths or heights that exceed the +% image dimension are permitted. +% +% Use this pragma: +% +% #pragma omp critical +% +% to define a section of code in your callback transfer method that must be +% executed by a single thread at a time. +% +% The format of the DuplexTransferPixelViewIterator method is: +% +% MagickBooleanType DuplexTransferPixelViewIterator(PixelView *source, +% PixelView *duplex,PixelView *destination, +% DuplexTransferPixelViewMethod transfer,void *context) +% +% A description of each parameter follows: +% +% o source: the source pixel view. +% +% o duplex: the duplex pixel view. +% +% o destination: the destination pixel view. +% +% o transfer: the transfer callback method. +% +% o context: the user defined context. +% +*/ +WandExport MagickBooleanType DuplexTransferPixelViewIterator( + PixelView *source,PixelView *duplex,PixelView *destination, + DuplexTransferPixelViewMethod transfer,void *context) +{ +#define DuplexTransferPixelViewTag "PixelView/DuplexTransfer" + + ExceptionInfo + *exception; + + Image + *destination_image, + *duplex_image, + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + assert(source != (PixelView *) NULL); + assert(source->signature == WandSignature); + if (transfer == (DuplexTransferPixelViewMethod) NULL) + return(MagickFalse); + source_image=source->wand->images; + duplex_image=duplex->wand->images; + destination_image=destination->wand->images; + if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=destination->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) +#endif + for (y=source->region.y; y < (ssize_t) source->region.height; y++) + { + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + sync; + + const IndexPacket + *magick_restrict duplex_indexes, + *magick_restrict indexes; + + const PixelPacket + *magick_restrict duplex_pixels, + *magick_restrict pixels; + + IndexPacket + *magick_restrict destination_indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict destination_pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewVirtualPixels(source->view,source->region.x,y, + source->region.width,1,source->exception); + if (pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(source->view); + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x); + if (source_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetBlackQuantum(source->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + if (source_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetIndex(source->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + duplex_pixels=GetCacheViewVirtualPixels(duplex->view,duplex->region.x,y, + duplex->region.width,1,duplex->exception); + if (duplex_pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + duplex_indexes=GetCacheViewVirtualIndexQueue(duplex->view); + for (x=0; x < (ssize_t) duplex->region.width; x++) + PixelSetQuantumColor(duplex->pixel_wands[id][x],duplex_pixels+x); + if (duplex_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) duplex->region.width; x++) + PixelSetBlackQuantum(duplex->pixel_wands[id][x], + GetPixelIndex(duplex_indexes+x)); + if (duplex_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) duplex->region.width; x++) + PixelSetIndex(duplex->pixel_wands[id][x], + GetPixelIndex(duplex_indexes+x)); + destination_pixels=GetCacheViewAuthenticPixels(destination->view, + destination->region.x,y,destination->region.width,1,exception); + if (destination_pixels == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + destination_indexes=GetCacheViewAuthenticIndexQueue(destination->view); + for (x=0; x < (ssize_t) destination->region.width; x++) + PixelSetQuantumColor(destination->pixel_wands[id][x], + destination_pixels+x); + if (destination_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) destination->region.width; x++) + PixelSetBlackQuantum(destination->pixel_wands[id][x], + GetPixelIndex(destination_indexes+x)); + if (destination_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) destination->region.width; x++) + PixelSetIndex(destination->pixel_wands[id][x], + GetPixelIndex(destination_indexes+x)); + if (transfer(source,duplex,destination,context) == MagickFalse) + status=MagickFalse; + for (x=0; x < (ssize_t) destination->region.width; x++) + PixelGetQuantumColor(destination->pixel_wands[id][x], + destination_pixels+x); + if (destination_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) destination->region.width; x++) + SetPixelIndex(destination_indexes+x,PixelGetBlackQuantum( + destination->pixel_wands[id][x])); + sync=SyncCacheViewAuthenticPixels(destination->view,exception); + if (sync == MagickFalse) + { + InheritException(destination->exception,GetCacheViewException( + source->view)); + status=MagickFalse; + } + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,DuplexTransferPixelViewTag, + progress,source->region.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P i x e l V i e w E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelViewException() returns the severity, reason, and description of any +% error that occurs when utilizing a pixel view. +% +% The format of the GetPixelViewException method is: +% +% char *GetPixelViewException(const PixelWand *pixel_view, +% ExceptionType *severity) +% +% A description of each parameter follows: +% +% o pixel_view: the pixel pixel_view. +% +% o severity: the severity of the error is returned here. +% +*/ +WandExport char *GetPixelViewException(const PixelView *pixel_view, + ExceptionType *severity) +{ + char + *description; + + assert(pixel_view != (const PixelView *) NULL); + assert(pixel_view->signature == WandSignature); + if (pixel_view->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",pixel_view->name); + assert(severity != (ExceptionType *) NULL); + *severity=pixel_view->exception->severity; + description=(char *) AcquireQuantumMemory(2UL*MaxTextExtent, + sizeof(*description)); + if (description == (char *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + pixel_view->name); + *description='\0'; + if (pixel_view->exception->reason != (char *) NULL) + (void) CopyMagickString(description,GetLocaleExceptionMessage( + pixel_view->exception->severity,pixel_view->exception->reason), + MaxTextExtent); + if (pixel_view->exception->description != (char *) NULL) + { + (void) ConcatenateMagickString(description," (",MaxTextExtent); + (void) ConcatenateMagickString(description,GetLocaleExceptionMessage( + pixel_view->exception->severity,pixel_view->exception->description), + MaxTextExtent); + (void) ConcatenateMagickString(description,")",MaxTextExtent); + } + return(description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P i x e l V i e w H e i g h t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelViewHeight() returns the pixel view height. +% +% The format of the GetPixelViewHeight method is: +% +% size_t GetPixelViewHeight(const PixelView *pixel_view) +% +% A description of each parameter follows: +% +% o pixel_view: the pixel view. +% +*/ +WandExport size_t GetPixelViewHeight(const PixelView *pixel_view) +{ + assert(pixel_view != (PixelView *) NULL); + assert(pixel_view->signature == WandSignature); + return(pixel_view->region.height); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P i x e l V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelViewIterator() iterates over the pixel view in parallel and calls +% your get method for each scanline of the view. The pixel region is +% not confined to the image canvas-- that is you can include negative offsets +% or widths or heights that exceed the image dimension. Any updates to +% the pixels in your callback are ignored. +% +% Use this pragma: +% +% #pragma omp critical +% +% to define a section of code in your callback get method that must be +% executed by a single thread at a time. +% +% The format of the GetPixelViewIterator method is: +% +% MagickBooleanType GetPixelViewIterator(PixelView *source, +% GetPixelViewMethod get,void *context) +% +% A description of each parameter follows: +% +% o source: the source pixel view. +% +% o get: the get callback method. +% +% o context: the user defined context. +% +*/ +WandExport MagickBooleanType GetPixelViewIterator(PixelView *source, + GetPixelViewMethod get,void *context) +{ +#define GetPixelViewTag "PixelView/Get" + + Image + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + assert(source != (PixelView *) NULL); + assert(source->signature == WandSignature); + if (get == (GetPixelViewMethod) NULL) + return(MagickFalse); + source_image=source->wand->images; + status=MagickTrue; + progress=0; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) +#endif + for (y=source->region.y; y < (ssize_t) source->region.height; y++) + { + const int + id = GetOpenMPThreadId(); + + const IndexPacket + *indexes; + + const PixelPacket + *pixels; + + ssize_t + x; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewVirtualPixels(source->view,source->region.x,y, + source->region.width,1,source->exception); + if (pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(source->view); + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x); + if (source_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetBlackQuantum(source->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + if (source_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetIndex(source->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + if (get(source,context) == MagickFalse) + status=MagickFalse; + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,GetPixelViewTag,progress, + source->region.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P i x e l V i e w P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelViewPixels() returns the pixel view pixel_wands. +% +% The format of the GetPixelViewPixels method is: +% +% PixelWand *GetPixelViewPixels(const PixelView *pixel_view) +% +% A description of each parameter follows: +% +% o pixel_view: the pixel view. +% +*/ +WandExport PixelWand **GetPixelViewPixels(const PixelView *pixel_view) +{ + const int + id = GetOpenMPThreadId(); + + assert(pixel_view != (PixelView *) NULL); + assert(pixel_view->signature == WandSignature); + return(pixel_view->pixel_wands[id]); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P i x e l V i e w W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelViewWand() returns the magick wand associated with the pixel view. +% +% The format of the GetPixelViewWand method is: +% +% MagickWand *GetPixelViewWand(const PixelView *pixel_view) +% +% A description of each parameter follows: +% +% o pixel_view: the pixel view. +% +*/ +WandExport MagickWand *GetPixelViewWand(const PixelView *pixel_view) +{ + assert(pixel_view != (PixelView *) NULL); + assert(pixel_view->signature == WandSignature); + return(pixel_view->wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P i x e l V i e w W i d t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelViewWidth() returns the pixel view width. +% +% The format of the GetPixelViewWidth method is: +% +% size_t GetPixelViewWidth(const PixelView *pixel_view) +% +% A description of each parameter follows: +% +% o pixel_view: the pixel view. +% +*/ +WandExport size_t GetPixelViewWidth(const PixelView *pixel_view) +{ + assert(pixel_view != (PixelView *) NULL); + assert(pixel_view->signature == WandSignature); + return(pixel_view->region.width); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P i x e l V i e w X % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelViewX() returns the pixel view x offset. +% +% The format of the GetPixelViewX method is: +% +% ssize_t GetPixelViewX(const PixelView *pixel_view) +% +% A description of each parameter follows: +% +% o pixel_view: the pixel view. +% +*/ +WandExport ssize_t GetPixelViewX(const PixelView *pixel_view) +{ + assert(pixel_view != (PixelView *) NULL); + assert(pixel_view->signature == WandSignature); + return(pixel_view->region.x); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t P i x e l V i e w Y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetPixelViewY() returns the pixel view y offset. +% +% The format of the GetPixelViewY method is: +% +% ssize_t GetPixelViewY(const PixelView *pixel_view) +% +% A description of each parameter follows: +% +% o pixel_view: the pixel view. +% +*/ +WandExport ssize_t GetPixelViewY(const PixelView *pixel_view) +{ + assert(pixel_view != (PixelView *) NULL); + assert(pixel_view->signature == WandSignature); + return(pixel_view->region.y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P i x e l V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPixelView() returns MagickTrue if the parameter is verified as a pixel +% view container. +% +% The format of the IsPixelView method is: +% +% MagickBooleanType IsPixelView(const PixelView *pixel_view) +% +% A description of each parameter follows: +% +% o pixel_view: the pixel view. +% +*/ +WandExport MagickBooleanType IsPixelView(const PixelView *pixel_view) +{ + size_t + length; + + if (pixel_view == (const PixelView *) NULL) + return(MagickFalse); + if (pixel_view->signature != WandSignature) + return(MagickFalse); + length=strlen(PixelViewId); + if (LocaleNCompare(pixel_view->name,PixelViewId,length) != 0) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C l i p P a t h I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickClipPathImage() clips along the named paths from the 8BIM profile, if +% present. Later operations take effect inside the path. Id may be a number +% if preceded with #, to work on a numbered path, e.g., "#1" to use the first +% path. +% +% The format of the MagickClipPathImage method is: +% +% MagickBooleanType MagickClipPathImage(MagickWand *wand, +% const char *pathname,const MagickBooleanType inside) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o pathname: name of clipping path resource. If name is preceded by #, use +% clipping path numbered by name. +% +% o inside: if non-zero, later operations take effect inside clipping path. +% Otherwise later operations take effect outside clipping path. +% +*/ +WandExport MagickBooleanType MagickClipPathImage(MagickWand *wand, + const char *pathname,const MagickBooleanType inside) +{ + return(MagickClipImagePath(wand,pathname,inside)); +} +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F i l l A l p h a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFillAlpha() returns the alpha used when drawing using the fill +% color or fill texture. Fully opaque is 1.0. +% +% The format of the DrawGetFillAlpha method is: +% +% double DrawGetFillAlpha(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport double DrawGetFillAlpha(const DrawingWand *wand) +{ + return(DrawGetFillOpacity(wand)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t S t r o k e A l p h a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetStrokeAlpha() returns the alpha of stroked object outlines. +% +% The format of the DrawGetStrokeAlpha method is: +% +% double DrawGetStrokeAlpha(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +*/ +WandExport double DrawGetStrokeAlpha(const DrawingWand *wand) +{ + return(DrawGetStrokeOpacity(wand)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P e e k G r a p h i c W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPeekGraphicWand() returns the current drawing wand. +% +% The format of the PeekDrawingWand method is: +% +% DrawInfo *DrawPeekGraphicWand(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport DrawInfo *DrawPeekGraphicWand(const DrawingWand *wand) +{ + return(PeekDrawingWand(wand)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P o p G r a p h i c C o n t e x t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPopGraphicContext() destroys the current drawing wand and returns to the +% previously pushed drawing wand. Multiple drawing wands may exist. It is an +% error to attempt to pop more drawing wands than have been pushed, and it is +% proper form to pop all drawing wands which have been pushed. +% +% The format of the DrawPopGraphicContext method is: +% +% MagickBooleanType DrawPopGraphicContext(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport void DrawPopGraphicContext(DrawingWand *wand) +{ + (void) PopDrawingWand(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P u s h G r a p h i c C o n t e x t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPushGraphicContext() clones the current drawing wand to create a new +% drawing wand. The original drawing wand(s) may be returned to by +% invoking PopDrawingWand(). The drawing wands are stored on a drawing wand +% stack. For every Pop there must have already been an equivalent Push. +% +% The format of the DrawPushGraphicContext method is: +% +% MagickBooleanType DrawPushGraphicContext(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport void DrawPushGraphicContext(DrawingWand *wand) +{ + (void) PushDrawingWand(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F i l l A l p h a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFillAlpha() sets the alpha to use when drawing using the fill +% color or fill texture. Fully opaque is 1.0. +% +% The format of the DrawSetFillAlpha method is: +% +% void DrawSetFillAlpha(DrawingWand *wand,const double fill_alpha) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o fill_alpha: fill alpha +% +*/ +WandExport void DrawSetFillAlpha(DrawingWand *wand,const double fill_alpha) +{ + DrawSetFillOpacity(wand,fill_alpha); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e A l p h a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokeAlpha() specifies the alpha of stroked object outlines. +% +% The format of the DrawSetStrokeAlpha method is: +% +% void DrawSetStrokeAlpha(DrawingWand *wand,const double stroke_alpha) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o stroke_alpha: stroke alpha. The value 1.0 is opaque. +% +*/ +WandExport void DrawSetStrokeAlpha(DrawingWand *wand,const double stroke_alpha) +{ + DrawSetStrokeOpacity(wand,stroke_alpha); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o l o r F l o o d f i l l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickColorFloodfillImage() changes the color value of any pixel that matches +% target and is an immediate neighbor. If the method FillToBorderMethod is +% specified, the color value is changed for any neighbor pixel that does not +% match the bordercolor member of image. +% +% The format of the MagickColorFloodfillImage method is: +% +% MagickBooleanType MagickColorFloodfillImage(MagickWand *wand, +% const PixelWand *fill,const double fuzz,const PixelWand *bordercolor, +% const ssize_t x,const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o fill: the floodfill color pixel wand. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +% o bordercolor: the border color pixel wand. +% +% o x,y: the starting location of the operation. +% +*/ +WandExport MagickBooleanType MagickColorFloodfillImage(MagickWand *wand, + const PixelWand *fill,const double fuzz,const PixelWand *bordercolor, + const ssize_t x,const ssize_t y) +{ + DrawInfo + *draw_info; + + MagickBooleanType + status; + + PixelPacket + target; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + draw_info=CloneDrawInfo(wand->image_info,(DrawInfo *) NULL); + PixelGetQuantumColor(fill,&draw_info->fill); + (void) GetOneVirtualPixel(wand->images,x % wand->images->columns, + y % wand->images->rows,&target,wand->exception); + if (bordercolor != (PixelWand *) NULL) + PixelGetQuantumColor(bordercolor,&target); + wand->images->fuzz=fuzz; + status=ColorFloodfillImage(wand->images,draw_info,target,x,y, + bordercolor != (PixelWand *) NULL ? FillToBorderMethod : FloodfillMethod); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + draw_info=DestroyDrawInfo(draw_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D e s c r i b e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDescribeImage() identifies an image by printing its attributes to the +% file. Attributes include the image width, height, size, and others. +% +% The format of the MagickDescribeImage method is: +% +% const char *MagickDescribeImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport char *MagickDescribeImage(MagickWand *wand) +{ + return(MagickIdentifyImage(wand)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k F l a t t e n I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickFlattenImages() merges a sequence of images. This useful for +% combining Photoshop layers into a single image. +% +% The format of the MagickFlattenImages method is: +% +% MagickWand *MagickFlattenImages(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *MagickFlattenImages(MagickWand *wand) +{ + Image + *flatten_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + flatten_image=FlattenImages(wand->images,wand->exception); + if (flatten_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,flatten_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e A t t r i b u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageAttribute() returns a value associated with the specified +% property. Use MagickRelinquishMemory() to free the value when you are +% finished with it. +% +% The format of the MagickGetImageAttribute method is: +% +% char *MagickGetImageAttribute(MagickWand *wand,const char *property) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o property: the property. +% +*/ +WandExport char *MagickGetImageAttribute(MagickWand *wand,const char *property) +{ + return(MagickGetImageProperty(wand,property)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M a g i c k G e t I m a g e I n d e x % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageIndex() returns the index of the current image. +% +% The format of the MagickGetImageIndex method is: +% +% ssize_t MagickGetImageIndex(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ssize_t MagickGetImageIndex(MagickWand *wand) +{ + return(MagickGetIteratorIndex(wand)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M a g i c k G e t I m a g e C h a n n e l E x t r e m a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageChannelExtrema() gets the extrema for one or more image +% channels. +% +% The format of the MagickGetImageChannelExtrema method is: +% +% MagickBooleanType MagickGetImageChannelExtrema(MagickWand *wand, +% const ChannelType channel,size_t *minima,size_t *maxima) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o minima: The minimum pixel value for the specified channel(s). +% +% o maxima: The maximum pixel value for the specified channel(s). +% +*/ +WandExport MagickBooleanType MagickGetImageChannelExtrema(MagickWand *wand, + const ChannelType channel,size_t *minima,size_t *maxima) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=GetImageChannelExtrema(wand->images,channel,minima,maxima, + wand->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M a g i c k G e t I m a g e E x t r e m a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageExtrema() gets the extrema for the image. +% +% The format of the MagickGetImageExtrema method is: +% +% MagickBooleanType MagickGetImageExtrema(MagickWand *wand, +% size_t *minima,size_t *maxima) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o minima: The minimum pixel value for the specified channel(s). +% +% o maxima: The maximum pixel value for the specified channel(s). +% +*/ +WandExport MagickBooleanType MagickGetImageExtrema(MagickWand *wand, + size_t *minima,size_t *maxima) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=GetImageExtrema(wand->images,minima,maxima,wand->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e M a t t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageMatte() returns MagickTrue if the image has a matte channel +% otherwise MagickFalse. +% +% The format of the MagickGetImageMatte method is: +% +% size_t MagickGetImageMatte(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickGetImageMatte(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(wand->images->matte); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImagePixels() extracts pixel data from an image and returns it to +% you. The method returns MagickTrue on success otherwise MagickFalse if an +% error is encountered. The data is returned as char, short int, int, ssize_t, +% float, or double in the order specified by map. +% +% Suppose you want to extract the first scanline of a 640x480 image as +% character data in red-green-blue order: +% +% MagickGetImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels); +% +% The format of the MagickGetImagePixels method is: +% +% MagickBooleanType MagickGetImagePixels(MagickWand *wand, +% const ssize_t x,const ssize_t y,const size_t columns, +% const size_t rows,const char *map,const StorageType storage, +% void *pixels) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x, y, columns, rows: These values define the perimeter +% of a region of pixels you want to extract. +% +% o map: This string reflects the expected ordering of the pixel array. +% It can be any combination or order of R = red, G = green, B = blue, +% A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, +% Y = yellow, M = magenta, K = black, I = intensity (for grayscale), +% P = pad. +% +% o storage: Define the data type of the pixels. Float and double types are +% expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from +% these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, +% LongPixel, QuantumPixel, or ShortPixel. +% +% o pixels: This array of values contain the pixel components as defined by +% map and type. You must preallocate this array where the expected +% length varies depending on the values of width, height, map, and type. +% +*/ +WandExport MagickBooleanType MagickGetImagePixels(MagickWand *wand, + const ssize_t x,const ssize_t y,const size_t columns, + const size_t rows,const char *map,const StorageType storage, + void *pixels) +{ + return(MagickExportImagePixels(wand,x,y,columns,rows,map,storage,pixels)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e S i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageSize() returns the image length in bytes. +% +% The format of the MagickGetImageSize method is: +% +% MagickBooleanType MagickGetImageSize(MagickWand *wand, +% MagickSizeType *length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o length: the image length in bytes. +% +*/ +WandExport MagickSizeType MagickGetImageSize(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(GetBlobSize(wand->images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M a p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMapImage() replaces the colors of an image with the closest color +% from a reference image. +% +% The format of the MagickMapImage method is: +% +% MagickBooleanType MagickMapImage(MagickWand *wand, +% const MagickWand *map_wand,const MagickBooleanType dither) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o map: the map wand. +% +% o dither: Set this integer value to something other than zero to dither +% the mapped image. +% +*/ +WandExport MagickBooleanType MagickMapImage(MagickWand *wand, + const MagickWand *map_wand,const MagickBooleanType dither) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || (map_wand->images == (Image *) NULL)) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=MapImage(wand->images,map_wand->images,dither); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M a t t e F l o o d f i l l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMatteFloodfillImage() changes the transparency value of any pixel that +% matches target and is an immediate neighbor. If the method +% FillToBorderMethod is specified, the transparency value is changed for any +% neighbor pixel that does not match the bordercolor member of image. +% +% The format of the MagickMatteFloodfillImage method is: +% +% MagickBooleanType MagickMatteFloodfillImage(MagickWand *wand, +% const double alpha,const double fuzz,const PixelWand *bordercolor, +% const ssize_t x,const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully +% transparent. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +% o bordercolor: the border color pixel wand. +% +% o x,y: the starting location of the operation. +% +*/ +WandExport MagickBooleanType MagickMatteFloodfillImage(MagickWand *wand, + const double alpha,const double fuzz,const PixelWand *bordercolor, + const ssize_t x,const ssize_t y) +{ + DrawInfo + *draw_info; + + MagickBooleanType + status; + + PixelPacket + target; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + draw_info=CloneDrawInfo(wand->image_info,(DrawInfo *) NULL); + (void) GetOneVirtualPixel(wand->images,x % wand->images->columns, + y % wand->images->rows,&target,wand->exception); + if (bordercolor != (PixelWand *) NULL) + PixelGetQuantumColor(bordercolor,&target); + wand->images->fuzz=fuzz; + status=MatteFloodfillImage(wand->images,target,ClampToQuantum( + (MagickRealType) QuantumRange-QuantumRange*alpha),x,y,bordercolor != + (PixelWand *) NULL ? FillToBorderMethod : FloodfillMethod); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + draw_info=DestroyDrawInfo(draw_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M e d i a n F i l t e r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMedianFilterImage() applies a digital filter that improves the quality +% of a noisy image. Each pixel is replaced by the median in a set of +% neighboring pixels as defined by radius. +% +% The format of the MagickMedianFilterImage method is: +% +% MagickBooleanType MagickMedianFilterImage(MagickWand *wand, +% const double radius) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o radius: the radius of the pixel neighborhood. +% +*/ +WandExport MagickBooleanType MagickMedianFilterImage(MagickWand *wand, + const double radius) +{ + Image + *median_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + median_image=MedianFilterImage(wand->images,radius,wand->exception); + if (median_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,median_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M i n i m u m I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMinimumImages() returns the minimum intensity of an image sequence. +% +% The format of the MagickMinimumImages method is: +% +% MagickWand *MagickMinimumImages(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *MagickMinimumImages(MagickWand *wand) +{ + Image + *minimum_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + minimum_image=EvaluateImages(wand->images,MinEvaluateOperator, + wand->exception); + if (minimum_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,minimum_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickModeImage() makes each pixel the 'predominant color' of the +% neighborhood of the specified radius. +% +% The format of the MagickModeImage method is: +% +% MagickBooleanType MagickModeImage(MagickWand *wand, +% const double radius) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o radius: the radius of the pixel neighborhood. +% +*/ +WandExport MagickBooleanType MagickModeImage(MagickWand *wand, + const double radius) +{ + Image + *mode_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + mode_image=ModeImage(wand->images,radius,wand->exception); + if (mode_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,mode_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M o s a i c I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMosaicImages() inlays an image sequence to form a single coherent +% picture. It returns a wand with each image in the sequence composited at +% the location defined by the page offset of the image. +% +% The format of the MagickMosaicImages method is: +% +% MagickWand *MagickMosaicImages(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *MagickMosaicImages(MagickWand *wand) +{ + Image + *mosaic_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + mosaic_image=MosaicImages(wand->images,wand->exception); + if (mosaic_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,mosaic_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k O p a q u e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickOpaqueImage() changes any pixel that matches color with the color +% defined by fill. +% +% The format of the MagickOpaqueImage method is: +% +% MagickBooleanType MagickOpaqueImage(MagickWand *wand, +% const PixelWand *target,const PixelWand *fill,const double fuzz) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the channel(s). +% +% o target: Change this target color to the fill color within the image. +% +% o fill: the fill pixel wand. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +*/ +WandExport MagickBooleanType MagickOpaqueImage(MagickWand *wand, + const PixelWand *target,const PixelWand *fill,const double fuzz) +{ + return(MagickPaintOpaqueImage(wand,target,fill,fuzz)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P a i n t F l o o d f i l l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickPaintFloodfillImage() changes the color value of any pixel that matches +% target and is an immediate neighbor. If the method FillToBorderMethod is +% specified, the color value is changed for any neighbor pixel that does not +% match the bordercolor member of image. +% +% The format of the MagickPaintFloodfillImage method is: +% +% MagickBooleanType MagickPaintFloodfillImage(MagickWand *wand, +% const ChannelType channel,const PixelWand *fill,const double fuzz, +% const PixelWand *bordercolor,const ssize_t x,const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the channel(s). +% +% o fill: the floodfill color pixel wand. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +% o bordercolor: the border color pixel wand. +% +% o x,y: the starting location of the operation. +% +*/ +WandExport MagickBooleanType MagickPaintFloodfillImage(MagickWand *wand, + const ChannelType channel,const PixelWand *fill,const double fuzz, + const PixelWand *bordercolor,const ssize_t x,const ssize_t y) +{ + MagickBooleanType + status; + + status=MagickFloodfillPaintImage(wand,channel,fill,fuzz,bordercolor,x,y, + MagickFalse); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P a i n t O p a q u e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickPaintOpaqueImage() changes any pixel that matches color with the color +% defined by fill. +% +% The format of the MagickPaintOpaqueImage method is: +% +% MagickBooleanType MagickPaintOpaqueImage(MagickWand *wand, +% const PixelWand *target,const PixelWand *fill,const double fuzz) +% MagickBooleanType MagickPaintOpaqueImageChannel(MagickWand *wand, +% const ChannelType channel,const PixelWand *target, +% const PixelWand *fill,const double fuzz) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the channel(s). +% +% o target: Change this target color to the fill color within the image. +% +% o fill: the fill pixel wand. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +*/ + +WandExport MagickBooleanType MagickPaintOpaqueImage(MagickWand *wand, + const PixelWand *target,const PixelWand *fill,const double fuzz) +{ + return(MagickPaintOpaqueImageChannel(wand,DefaultChannels,target,fill,fuzz)); +} + +WandExport MagickBooleanType MagickPaintOpaqueImageChannel(MagickWand *wand, + const ChannelType channel,const PixelWand *target,const PixelWand *fill, + const double fuzz) +{ + MagickBooleanType + status; + + status=MagickOpaquePaintImageChannel(wand,channel,target,fill,fuzz, + MagickFalse); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P a i n t T r a n s p a r e n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickPaintTransparentImage() changes any pixel that matches color with the +% color defined by fill. +% +% The format of the MagickPaintTransparentImage method is: +% +% MagickBooleanType MagickPaintTransparentImage(MagickWand *wand, +% const PixelWand *target,const double alpha,const double fuzz) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o target: Change this target color to specified opacity value within +% the image. +% +% o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully +% transparent. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +*/ +WandExport MagickBooleanType MagickPaintTransparentImage(MagickWand *wand, + const PixelWand *target,const double alpha,const double fuzz) +{ + return(MagickTransparentPaintImage(wand,target,alpha,fuzz,MagickFalse)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R a d i a l B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRadialBlurImage() radial blurs an image. +% +% The format of the MagickRadialBlurImage method is: +% +% MagickBooleanType MagickRadialBlurImage(MagickWand *wand, +% const double angle) +% MagickBooleanType MagickRadialBlurImageChannel(MagickWand *wand, +% const ChannelType channel,const double angle) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o angle: the angle of the blur in degrees. +% +*/ +WandExport MagickBooleanType MagickRadialBlurImage(MagickWand *wand, + const double angle) +{ + return(MagickRotationalBlurImage(wand,angle)); +} + +WandExport MagickBooleanType MagickRadialBlurImageChannel(MagickWand *wand, + const ChannelType channel,const double angle) +{ + return(MagickRotationalBlurImageChannel(wand,channel,angle)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e c o l o r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRecolorImage() apply color transformation to an image. The method +% permits saturation changes, hue rotation, luminance to alpha, and various +% other effects. Although variable-sized transformation matrices can be used, +% typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA +% (or RGBA with offsets). The matrix is similar to those used by Adobe Flash +% except offsets are in column 6 rather than 5 (in support of CMYKA images) +% and offsets are normalized (divide Flash offset by 255). +% +% The format of the MagickRecolorImage method is: +% +% MagickBooleanType MagickRecolorImage(MagickWand *wand, +% const size_t order,const double *color_matrix) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o order: the number of columns and rows in the color matrix. +% +% o color_matrix: An array of doubles representing the color matrix. +% +*/ +WandExport MagickBooleanType MagickRecolorImage(MagickWand *wand, + const size_t order,const double *color_matrix) +{ + Image + *transform_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (color_matrix == (const double *) NULL) + return(MagickFalse); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + transform_image=RecolorImage(wand->images,order,color_matrix, + wand->exception); + if (transform_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,transform_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e d u c e N o i s e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickReduceNoiseImage() smooths the contours of an image while still +% preserving edge information. The algorithm works by replacing each pixel +% with its neighbor closest in value. A neighbor is defined by radius. Use +% a radius of 0 and ReduceNoise() selects a suitable radius for you. +% +% The format of the MagickReduceNoiseImage method is: +% +% MagickBooleanType MagickReduceNoiseImage(MagickWand *wand, +% const double radius) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o radius: the radius of the pixel neighborhood. +% +*/ +WandExport MagickBooleanType MagickReduceNoiseImage(MagickWand *wand, + const double radius) +{ + Image + *noise_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + noise_image=ReduceNoiseImage(wand->images,radius,wand->exception); + if (noise_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,noise_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M a x i m u m I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMaximumImages() returns the maximum intensity of an image sequence. +% +% The format of the MagickMaximumImages method is: +% +% MagickWand *MagickMaximumImages(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *MagickMaximumImages(MagickWand *wand) +{ + Image + *maximum_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + maximum_image=EvaluateImages(wand->images,MaxEvaluateOperator, + wand->exception); + if (maximum_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,maximum_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e A t t r i b u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageAttribute() associates a property with an image. +% +% The format of the MagickSetImageAttribute method is: +% +% MagickBooleanType MagickSetImageAttribute(MagickWand *wand, +% const char *property,const char *value) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o property: the property. +% +% o value: the value. +% +*/ +WandExport MagickBooleanType MagickSetImageAttribute(MagickWand *wand, + const char *property,const char *value) +{ + return(SetImageProperty(wand->images,property,value)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e I n d e x % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageIndex() set the current image to the position of the list +% specified with the index parameter. +% +% The format of the MagickSetImageIndex method is: +% +% MagickBooleanType MagickSetImageIndex(MagickWand *wand, +% const ssize_t index) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o index: the scene number. +% +*/ +WandExport MagickBooleanType MagickSetImageIndex(MagickWand *wand, + const ssize_t index) +{ + return(MagickSetIteratorIndex(wand,index)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M a g i c k S e t I m a g e O p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageOption() associates one or options with a particular image +% format (.e.g MagickSetImageOption(wand,"jpeg","perserve","yes"). +% +% The format of the MagickSetImageOption method is: +% +% MagickBooleanType MagickSetImageOption(MagickWand *wand, +% const char *format,const char *key,const char *value) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o format: the image format. +% +% o key: The key. +% +% o value: The value. +% +*/ +WandExport MagickBooleanType MagickSetImageOption(MagickWand *wand, + const char *format,const char *key,const char *value) +{ + char + option[MaxTextExtent]; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) FormatLocaleString(option,MaxTextExtent,"%s:%s=%s",format,key,value); + return(DefineImageOption(wand->image_info,option)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T r a n s p a r e n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickTransparentImage() changes any pixel that matches color with the +% color defined by fill. +% +% The format of the MagickTransparentImage method is: +% +% MagickBooleanType MagickTransparentImage(MagickWand *wand, +% const PixelWand *target,const double alpha,const double fuzz) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o target: Change this target color to specified opacity value within +% the image. +% +% o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully +% transparent. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +*/ +WandExport MagickBooleanType MagickTransparentImage(MagickWand *wand, + const PixelWand *target,const double alpha,const double fuzz) +{ + return(MagickPaintTransparentImage(wand,target,alpha,fuzz)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e g i o n O f I n t e r e s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRegionOfInterestImage() extracts a region of the image and returns it +% as a new wand. +% +% The format of the MagickRegionOfInterestImage method is: +% +% MagickWand *MagickRegionOfInterestImage(MagickWand *wand, +% const size_t width,const size_t height,const ssize_t x, +% const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the region width. +% +% o height: the region height. +% +% o x: the region x offset. +% +% o y: the region y offset. +% +*/ +WandExport MagickWand *MagickRegionOfInterestImage(MagickWand *wand, + const size_t width,const size_t height,const ssize_t x, + const ssize_t y) +{ + return(MagickGetImageRegion(wand,width,height,x,y)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImagePixels() accepts pixel datand stores it in the image at the +% location you specify. The method returns MagickFalse on success otherwise +% MagickTrue if an error is encountered. The pixel data can be either char, +% short int, int, ssize_t, float, or double in the order specified by map. +% +% Suppose your want to upload the first scanline of a 640x480 image from +% character data in red-green-blue order: +% +% MagickSetImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels); +% +% The format of the MagickSetImagePixels method is: +% +% MagickBooleanType MagickSetImagePixels(MagickWand *wand, +% const ssize_t x,const ssize_t y,const size_t columns, +% const size_t rows,const char *map,const StorageType storage, +% const void *pixels) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x, y, columns, rows: These values define the perimeter of a region +% of pixels you want to define. +% +% o map: This string reflects the expected ordering of the pixel array. +% It can be any combination or order of R = red, G = green, B = blue, +% A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, +% Y = yellow, M = magenta, K = black, I = intensity (for grayscale), +% P = pad. +% +% o storage: Define the data type of the pixels. Float and double types are +% expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from +% these types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel, +% or DoublePixel. +% +% o pixels: This array of values contain the pixel components as defined by +% map and type. You must preallocate this array where the expected +% length varies depending on the values of width, height, map, and type. +% +*/ +WandExport MagickBooleanType MagickSetImagePixels(MagickWand *wand, + const ssize_t x,const ssize_t y,const size_t columns, + const size_t rows,const char *map,const StorageType storage, + const void *pixels) +{ + return(MagickImportImagePixels(wand,x,y,columns,rows,map,storage,pixels)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k W r i t e I m a g e B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickWriteImageBlob() implements direct to memory image formats. It +% returns the image as a blob and its length. Use MagickSetFormat() to +% set the format of the returned blob (GIF, JPEG, PNG, etc.). +% +% Use MagickRelinquishMemory() to free the blob when you are done with it. +% +% The format of the MagickWriteImageBlob method is: +% +% unsigned char *MagickWriteImageBlob(MagickWand *wand,size_t *length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o length: the length of the blob. +% +*/ +WandExport unsigned char *MagickWriteImageBlob(MagickWand *wand,size_t *length) +{ + return(MagickGetImageBlob(wand,length)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w P i x e l V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewPixelView() returns a pixel view required for all other methods in the +% Pixel View API. +% +% The format of the NewPixelView method is: +% +% PixelView *NewPixelView(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the wand. +% +*/ + +static PixelWand ***AcquirePixelsTLS(const size_t number_wands, + const size_t number_threads) +{ + PixelWand + ***pixel_wands; + + ssize_t + i; + + pixel_wands=(PixelWand ***) AcquireQuantumMemory(number_threads, + sizeof(*pixel_wands)); + if (pixel_wands == (PixelWand ***) NULL) + return((PixelWand ***) NULL); + (void) memset(pixel_wands,0,number_threads*sizeof(*pixel_wands)); + for (i=0; i < (ssize_t) number_threads; i++) + { + pixel_wands[i]=NewPixelWands(number_wands); + if (pixel_wands[i] == (PixelWand **) NULL) + return(DestroyPixelsTLS(pixel_wands,number_wands,number_threads)); + } + return(pixel_wands); +} + +WandExport PixelView *NewPixelView(MagickWand *wand) +{ + PixelView + *pixel_view; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == MagickCoreSignature); + pixel_view=(PixelView *) AcquireMagickMemory(sizeof(*pixel_view)); + if (pixel_view == (PixelView *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + (void) memset(pixel_view,0,sizeof(*pixel_view)); + pixel_view->id=AcquireWandId(); + (void) FormatLocaleString(pixel_view->name,MaxTextExtent,"%s-%.20g", + PixelViewId,(double) pixel_view->id); + pixel_view->exception=AcquireExceptionInfo(); + pixel_view->wand=wand; + pixel_view->view=AcquireVirtualCacheView(pixel_view->wand->images, + pixel_view->exception); + pixel_view->region.width=wand->images->columns; + pixel_view->region.height=wand->images->rows; + pixel_view->number_threads=GetOpenMPMaximumThreads(); + pixel_view->pixel_wands=AcquirePixelsTLS(pixel_view->region.width, + pixel_view->number_threads); + if (pixel_view->pixel_wands == (PixelWand ***) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + pixel_view->debug=IsEventLogging(); + pixel_view->signature=WandSignature; + return(pixel_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w P i x e l V i e w R e g i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewPixelViewRegion() returns a pixel view required for all other methods +% in the Pixel View API. +% +% The format of the NewPixelViewRegion method is: +% +% PixelView *NewPixelViewRegion(MagickWand *wand,const ssize_t x, +% const ssize_t y,const size_t width,const size_t height) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixel_wands view. +% +*/ +WandExport PixelView *NewPixelViewRegion(MagickWand *wand,const ssize_t x, + const ssize_t y,const size_t width,const size_t height) +{ + PixelView + *pixel_view; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == MagickCoreSignature); + pixel_view=(PixelView *) AcquireMagickMemory(sizeof(*pixel_view)); + if (pixel_view == (PixelView *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + (void) memset(pixel_view,0,sizeof(*pixel_view)); + pixel_view->id=AcquireWandId(); + (void) FormatLocaleString(pixel_view->name,MaxTextExtent,"%s-%.20g", + PixelViewId,(double) pixel_view->id); + pixel_view->exception=AcquireExceptionInfo(); + pixel_view->view=AcquireVirtualCacheView(pixel_view->wand->images, + pixel_view->exception); + pixel_view->wand=wand; + pixel_view->region.width=width; + pixel_view->region.height=height; + pixel_view->region.x=x; + pixel_view->region.y=y; + pixel_view->number_threads=GetOpenMPMaximumThreads(); + pixel_view->pixel_wands=AcquirePixelsTLS(pixel_view->region.width, + pixel_view->number_threads); + if (pixel_view->pixel_wands == (PixelWand ***) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + pixel_view->debug=IsEventLogging(); + pixel_view->signature=WandSignature; + return(pixel_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t N e x t R o w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetNextRow() returns the next row as an array of pixel wands from the +% pixel iterator. +% +% The format of the PixelGetNextRow method is: +% +% PixelWand **PixelGetNextRow(PixelIterator *iterator, +% size_t *number_wands) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +% o number_wands: the number of pixel wands. +% +*/ +WandExport PixelWand **PixelGetNextRow(PixelIterator *iterator) +{ + size_t + number_wands; + + return(PixelGetNextIteratorRow(iterator,&number_wands)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l I t e r a t o r G e t E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelIteratorGetException() returns the severity, reason, and description of +% any error that occurs when using other methods in this API. +% +% The format of the PixelIteratorGetException method is: +% +% char *PixelIteratorGetException(const Pixeliterator *iterator, +% ExceptionType *severity) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +% o severity: the severity of the error is returned here. +% +*/ +WandExport char *PixelIteratorGetException(const PixelIterator *iterator, + ExceptionType *severity) +{ + return(PixelGetIteratorException(iterator,severity)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t P i x e l V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetPixelViewIterator() iterates over the pixel view in parallel and calls +% your set method for each scanline of the view. The pixel region is +% confined to the image canvas-- that is no negative offsets or widths or +% heights that exceed the image dimension. The pixels are initiallly +% undefined and any settings you make in the callback method are automagically +% synced back to your image. +% +% Use this pragma: +% +% #pragma omp critical +% +% to define a section of code in your callback set method that must be +% executed by a single thread at a time. +% +% The format of the SetPixelViewIterator method is: +% +% MagickBooleanType SetPixelViewIterator(PixelView *destination, +% SetPixelViewMethod set,void *context) +% +% A description of each parameter follows: +% +% o destination: the pixel view. +% +% o set: the set callback method. +% +% o context: the user defined context. +% +*/ +WandExport MagickBooleanType SetPixelViewIterator(PixelView *destination, + SetPixelViewMethod set,void *context) +{ +#define SetPixelViewTag "PixelView/Set" + + ExceptionInfo + *exception; + + Image + *destination_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + assert(destination != (PixelView *) NULL); + assert(destination->signature == WandSignature); + if (set == (SetPixelViewMethod) NULL) + return(MagickFalse); + destination_image=destination->wand->images; + if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=destination->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) +#endif + for (y=destination->region.y; y < (ssize_t) destination->region.height; y++) + { + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + sync; + + IndexPacket + *magick_restrict indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewAuthenticPixels(destination->view,destination->region.x, + y,destination->region.width,1,exception); + if (pixels == (PixelPacket *) NULL) + { + InheritException(destination->exception,GetCacheViewException( + destination->view)); + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(destination->view); + if (set(destination,context) == MagickFalse) + status=MagickFalse; + for (x=0; x < (ssize_t) destination->region.width; x++) + PixelGetQuantumColor(destination->pixel_wands[id][x],pixels+x); + if (destination_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) destination->region.width; x++) + SetPixelIndex(indexes+x,PixelGetBlackQuantum( + destination->pixel_wands[id][x])); + sync=SyncCacheViewAuthenticPixels(destination->view,exception); + if (sync == MagickFalse) + { + InheritException(destination->exception,GetCacheViewException( + destination->view)); + status=MagickFalse; + } + if (destination_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(destination_image,SetPixelViewTag,progress, + destination->region.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% T r a n s f e r P i x e l V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% TransferPixelViewIterator() iterates over two pixel views in parallel and +% calls your transfer method for each scanline of the view. The source pixel +% region is not confined to the image canvas-- that is you can include +% negative offsets or widths or heights that exceed the image dimension. +% However, the destination pixel view is confined to the image canvas-- that +% is no negative offsets or widths or heights that exceed the image dimension +% are permitted. +% +% Use this pragma: +% +% #pragma omp critical +% +% to define a section of code in your callback transfer method that must be +% executed by a single thread at a time. +% +% The format of the TransferPixelViewIterator method is: +% +% MagickBooleanType TransferPixelViewIterator(PixelView *source, +% PixelView *destination,TransferPixelViewMethod transfer,void *context) +% +% A description of each parameter follows: +% +% o source: the source pixel view. +% +% o destination: the destination pixel view. +% +% o transfer: the transfer callback method. +% +% o context: the user defined context. +% +*/ +WandExport MagickBooleanType TransferPixelViewIterator(PixelView *source, + PixelView *destination,TransferPixelViewMethod transfer,void *context) +{ +#define TransferPixelViewTag "PixelView/Transfer" + + ExceptionInfo + *exception; + + Image + *destination_image, + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + assert(source != (PixelView *) NULL); + assert(source->signature == WandSignature); + if (transfer == (TransferPixelViewMethod) NULL) + return(MagickFalse); + source_image=source->wand->images; + destination_image=destination->wand->images; + if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=destination->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) +#endif + for (y=source->region.y; y < (ssize_t) source->region.height; y++) + { + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + sync; + + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict pixels; + + IndexPacket + *magick_restrict destination_indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict destination_pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewVirtualPixels(source->view,source->region.x,y, + source->region.width,1,source->exception); + if (pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(source->view); + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x); + if (source_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetBlackQuantum(source->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + if (source_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetIndex(source->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + destination_pixels=GetCacheViewAuthenticPixels(destination->view, + destination->region.x,y,destination->region.width,1,exception); + if (destination_pixels == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + destination_indexes=GetCacheViewAuthenticIndexQueue(destination->view); + for (x=0; x < (ssize_t) destination->region.width; x++) + PixelSetQuantumColor(destination->pixel_wands[id][x],pixels+x); + if (destination_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) destination->region.width; x++) + PixelSetBlackQuantum(destination->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + if (destination_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) destination->region.width; x++) + PixelSetIndex(destination->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + if (transfer(source,destination,context) == MagickFalse) + status=MagickFalse; + for (x=0; x < (ssize_t) destination->region.width; x++) + PixelGetQuantumColor(destination->pixel_wands[id][x], + destination_pixels+x); + if (destination_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) destination->region.width; x++) + SetPixelIndex(destination_indexes+x,PixelGetBlackQuantum( + destination->pixel_wands[id][x])); + sync=SyncCacheViewAuthenticPixels(destination->view,exception); + if (sync == MagickFalse) + { + InheritException(destination->exception,GetCacheViewException( + source->view)); + status=MagickFalse; + } + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,TransferPixelViewTag,progress, + source->region.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U p d a t e P i x e l V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UpdatePixelViewIterator() iterates over the pixel view in parallel and calls +% your update method for each scanline of the view. The pixel region is +% confined to the image canvas-- that is no negative offsets or widths or +% heights that exceed the image dimension are permitted. Updates to pixels +% in your callback are automagically synced back to the image. +% +% Use this pragma: +% +% #pragma omp critical +% +% to define a section of code in your callback update method that must be +% executed by a single thread at a time. +% +% The format of the UpdatePixelViewIterator method is: +% +% MagickBooleanType UpdatePixelViewIterator(PixelView *source, +% UpdatePixelViewMethod update,void *context) +% +% A description of each parameter follows: +% +% o source: the source pixel view. +% +% o update: the update callback method. +% +% o context: the user defined context. +% +*/ +WandExport MagickBooleanType UpdatePixelViewIterator(PixelView *source, + UpdatePixelViewMethod update,void *context) +{ +#define UpdatePixelViewTag "PixelView/Update" + + ExceptionInfo + *exception; + + Image + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + + ssize_t + y; + + assert(source != (PixelView *) NULL); + assert(source->signature == WandSignature); + if (update == (UpdatePixelViewMethod) NULL) + return(MagickFalse); + source_image=source->wand->images; + if (SetImageStorageClass(source_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=source->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) +#endif + for (y=source->region.y; y < (ssize_t) source->region.height; y++) + { + const int + id = GetOpenMPThreadId(); + + IndexPacket + *magick_restrict indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewAuthenticPixels(source->view,source->region.x,y, + source->region.width,1,exception); + if (pixels == (PixelPacket *) NULL) + { + InheritException(source->exception,GetCacheViewException( + source->view)); + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(source->view); + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x); + if (source_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) source->region.width; x++) + PixelSetBlackQuantum(source->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + if (update(source,context) == MagickFalse) + status=MagickFalse; + for (x=0; x < (ssize_t) source->region.width; x++) + PixelGetQuantumColor(source->pixel_wands[id][x],pixels+x); + if (source_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) source->region.width; x++) + SetPixelIndex(indexes+x,PixelGetBlackQuantum( + source->pixel_wands[id][x])); + if (SyncCacheViewAuthenticPixels(source->view,exception) == MagickFalse) + { + InheritException(source->exception,GetCacheViewException(source->view)); + status=MagickFalse; + } + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,UpdatePixelViewTag,progress, + source->region.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} +#endif diff --git a/ImageMagick-6.9.12-44/wand/deprecate.h b/ImageMagick-6.9.12-44/wand/deprecate.h new file mode 100644 index 0000000..bb99f05 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/deprecate.h @@ -0,0 +1,183 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore deprecated methods. +*/ +#ifndef MAGICKWAND_DEPRECATE_H +#define MAGICKWAND_DEPRECATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if !defined(MAGICKCORE_EXCLUDE_DEPRECATED) + +#include "wand/drawing-wand.h" +#include "wand/magick-wand.h" +#include "wand/pixel-iterator.h" +#include "wand/pixel-wand.h" + +typedef struct _DrawingWand + *DrawContext; + +typedef struct _PixelView + PixelView; + +extern WandExport DrawingWand + *DrawAllocateWand(const DrawInfo *,Image *); + +typedef MagickBooleanType + (*DuplexTransferPixelViewMethod)(const PixelView *,const PixelView *, + PixelView *,void *), + (*GetPixelViewMethod)(const PixelView *,void *), + (*SetPixelViewMethod)(PixelView *,void *), + (*TransferPixelViewMethod)(const PixelView *,PixelView *,void *), + (*UpdatePixelViewMethod)(PixelView *,void *); + +extern WandExport char + *GetPixelViewException(const PixelView *,ExceptionType *) + magick_attribute((deprecated)); + +extern WandExport double + DrawGetFillAlpha(const DrawingWand *) magick_attribute((deprecated)), + DrawGetStrokeAlpha(const DrawingWand *) magick_attribute((deprecated)); + +extern WandExport DrawInfo + *DrawPeekGraphicWand(const DrawingWand *) magick_attribute((deprecated)); + +extern WandExport char + *MagickDescribeImage(MagickWand *) magick_attribute((deprecated)), + *MagickGetImageAttribute(MagickWand *,const char *) + magick_attribute((deprecated)), + *PixelIteratorGetException(const PixelIterator *,ExceptionType *) + magick_attribute((deprecated)); + +extern WandExport ssize_t + MagickGetImageIndex(MagickWand *) magick_attribute((deprecated)); + +extern WandExport MagickBooleanType + DuplexTransferPixelViewIterator(PixelView *,PixelView *,PixelView *, + DuplexTransferPixelViewMethod,void *) magick_attribute((deprecated)), + GetPixelViewIterator(PixelView *,GetPixelViewMethod,void *) + magick_attribute((deprecated)), + IsPixelView(const PixelView *) magick_attribute((deprecated)), + MagickClipPathImage(MagickWand *,const char *,const MagickBooleanType) + magick_attribute((deprecated)), + MagickColorFloodfillImage(MagickWand *,const PixelWand *,const double, + const PixelWand *,const ssize_t,const ssize_t) + magick_attribute((deprecated)), + MagickGetImageChannelExtrema(MagickWand *,const ChannelType,size_t *, + size_t *) magick_attribute((deprecated)), + MagickGetImageExtrema(MagickWand *,size_t *,size_t *) + magick_attribute((deprecated)), + MagickGetImageMatte(MagickWand *) magick_attribute((deprecated)), + MagickGetImagePixels(MagickWand *,const ssize_t,const ssize_t,const size_t, + const size_t,const char *,const StorageType,void *) + magick_attribute((deprecated)), + MagickMapImage(MagickWand *,const MagickWand *,const MagickBooleanType) + magick_attribute((deprecated)), + MagickMatteFloodfillImage(MagickWand *,const double,const double, + const PixelWand *,const ssize_t,const ssize_t) + magick_attribute((deprecated)), + MagickMedianFilterImage(MagickWand *,const double) + magick_attribute((deprecated)), + MagickModeImage(MagickWand *,const double) magick_attribute((deprecated)), + MagickReduceNoiseImage(MagickWand *,const double) + magick_attribute((deprecated)), + MagickRemapImage(MagickWand *,const MagickWand *,const DitherMethod), + MagickOpaqueImage(MagickWand *,const PixelWand *,const PixelWand *, + const double) magick_attribute((deprecated)), + MagickPaintFloodfillImage(MagickWand *,const ChannelType,const PixelWand *, + const double,const PixelWand *,const ssize_t,const ssize_t) + magick_attribute((deprecated)), + MagickPaintOpaqueImage(MagickWand *,const PixelWand *,const PixelWand *, + const double) magick_attribute((deprecated)), + MagickPaintOpaqueImageChannel(MagickWand *,const ChannelType, + const PixelWand *,const PixelWand *,const double) + magick_attribute((deprecated)), + MagickPaintTransparentImage(MagickWand *,const PixelWand *,const double, + const double) magick_attribute((deprecated)), + MagickRadialBlurImage(MagickWand *,const double) + magick_attribute((deprecated)), + MagickRadialBlurImageChannel(MagickWand *,const ChannelType,const double) + magick_attribute((deprecated)), + MagickRecolorImage(MagickWand *,const size_t,const double *) + magick_attribute((deprecated)), + MagickSetImageAttribute(MagickWand *,const char *,const char *) + magick_attribute((deprecated)), + MagickSetImageIndex(MagickWand *,const ssize_t) + magick_attribute((deprecated)), + MagickSetImageOption(MagickWand *,const char *,const char *,const char *) + magick_attribute((deprecated)), + MagickSetImagePixels(MagickWand *,const ssize_t,const ssize_t,const size_t, + const size_t,const char *,const StorageType,const void *) + magick_attribute((deprecated)), + MagickTransparentImage(MagickWand *,const PixelWand *,const double, + const double) magick_attribute((deprecated)), + SetPixelViewIterator(PixelView *,SetPixelViewMethod,void *) + magick_attribute((deprecated)), + TransferPixelViewIterator(PixelView *,PixelView *,TransferPixelViewMethod, + void *) magick_attribute((deprecated)), + UpdatePixelViewIterator(PixelView *,UpdatePixelViewMethod,void *) + magick_attribute((deprecated)); + +extern WandExport MagickWand + *GetPixelViewWand(const PixelView *) magick_attribute((deprecated)), + *MagickAverageImages(MagickWand *) magick_attribute((deprecated)), + *MagickFlattenImages(MagickWand *) magick_attribute((deprecated)), + *MagickMaximumImages(MagickWand *) magick_attribute((deprecated)), + *MagickMinimumImages(MagickWand *) magick_attribute((deprecated)), + *MagickMosaicImages(MagickWand *) magick_attribute((deprecated)), + *MagickRegionOfInterestImage(MagickWand *,const size_t,const size_t, + const ssize_t,const ssize_t) magick_attribute((deprecated)); + +extern WandExport MagickSizeType + MagickGetImageSize(MagickWand *) magick_attribute((deprecated)); + +extern WandExport PixelView + *ClonePixelView(const PixelView *) magick_attribute((deprecated)), + *DestroyPixelView(PixelView *) magick_attribute((deprecated)), + *NewPixelView(MagickWand *) magick_attribute((deprecated)), + *NewPixelViewRegion(MagickWand *,const ssize_t,const ssize_t,const size_t, + const size_t) magick_attribute((deprecated)); + +extern WandExport PixelWand + **GetPixelViewPixels(const PixelView *) magick_attribute((deprecated)), + **PixelGetNextRow(PixelIterator *) magick_attribute((deprecated)); + +extern WandExport size_t + GetPixelViewHeight(const PixelView *) magick_attribute((deprecated)), + GetPixelViewWidth(const PixelView *) magick_attribute((deprecated)); + +extern WandExport ssize_t + GetPixelViewX(const PixelView *) magick_attribute((deprecated)), + GetPixelViewY(const PixelView *) magick_attribute((deprecated)); + +extern WandExport unsigned char + *MagickWriteImageBlob(MagickWand *,size_t *) magick_attribute((deprecated)); + +extern WandExport void + DrawPopGraphicContext(DrawingWand *) magick_attribute((deprecated)), + DrawPushGraphicContext(DrawingWand *) magick_attribute((deprecated)), + DrawSetFillAlpha(DrawingWand *,const double) magick_attribute((deprecated)), + DrawSetStrokeAlpha(DrawingWand *,const double) magick_attribute((deprecated)); + +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/display.c b/ImageMagick-6.9.12-44/wand/display.c new file mode 100644 index 0000000..27abafa --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/display.c @@ -0,0 +1,1891 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD IIIII SSSSS PPPP L AAA Y Y % +% D D I SS P P L A A Y Y % +% D D I SSS PPPP L AAAAA Y % +% D D I SS P L A A Y % +% DDDD IIIII SSSSS P LLLLL A A Y % +% % +% % +% Methods to Interactively Display and Edit an Image % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Use the display program to display an image or image sequence on any X +% server. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/mogrify-private.h" +#include "magick/display-private.h" +#include "magick/string-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D i s p l a y I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DisplayImageCommand() displays a sequence of images on any workstation +% display running an X server. Display first determines the hardware +% capabilities of the workstation. If the number of unique colors in an image +% is less than or equal to the number the workstation can support, the image +% is displayed in an X window. Otherwise the number of colors in the image is +% first reduced to match the color resolution of the workstation before it is +% displayed. +% +% This means that a continuous-tone 24 bits/pixel image can display on a 8 +% bit pseudo-color device or monochrome device. In most instances the reduced +% color image closely resembles the original. Alternatively, a monochrome or +% pseudo-color image sequence can display on a continuous-tone 24 bits/pixels +% device. +% +% The format of the DisplayImageCommand method is: +% +% MagickBooleanType DisplayImageCommand(ImageInfo *image_info,int argc, +% char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType DisplayUsage(void) +{ + static const char + buttons[] = + " 1 press to map or unmap the Command widget\n" + " 2 press and drag to magnify a region of an image\n" + " 3 press to load an image from a visual image directory", + miscellaneous[] = + " -debug events display copious debugging information\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information\n" + " -version print version information", + operators[] = + " -auto-orient automagically orient image\n" + " -border geometry surround image with a border of color\n" + " -clip clip along the first path from the 8BIM profile\n" + " -clip-path id clip along a named path from the 8BIM profile\n" + " -colors value preferred number of colors in the image\n" + " -contrast enhance or reduce the image contrast\n" + " -crop geometry preferred size and location of the cropped image\n" + " -decipher filename convert cipher pixels to plain pixels\n" + " -deskew threshold straighten an image\n" + " -despeckle reduce the speckles within an image\n" + " -edge factor apply a filter to detect edges in the image\n" + " -enhance apply a digital filter to enhance a noisy image\n" + " -equalize perform histogram equalization to an image\n" + " -extract geometry extract area from image\n" + " -flip flip image in the vertical direction\n" + " -flop flop image in the horizontal direction\n" + " -frame geometry surround image with an ornamental border\n" + " -fuzz distance colors within this distance are considered equal\n" + " -gamma value level of gamma correction\n" + " -monochrome transform image to black and white\n" + " -negate replace every pixel with its complementary color\n" + " -normalize transform image to span the full range of colors\n" + " -raise value lighten/darken image edges to create a 3-D effect\n" + " -resample geometry change the resolution of an image\n" + " -resize geometry resize the image\n" + " -roll geometry roll an image vertically or horizontally\n" + " -rotate degrees apply Paeth rotation to the image\n" + " -sample geometry scale image with pixel sampling\n" + " -segment value segment an image\n" + " -sharpen geometry sharpen the image\n" + " -strip strip image of all profiles and comments\n" + " -threshold value threshold the image\n" + " -thumbnail geometry create a thumbnail of the image\n" + " -trim trim image edges", + settings[] = + " -alpha option on, activate, off, deactivate, set, opaque, copy\n" + " transparent, extract, background, or shape\n" + " -antialias remove pixel-aliasing\n" + " -authenticate password\n" + " decipher image with this password\n" + " -backdrop display image centered on a backdrop\n" + " -channel type apply option to select image channels\n" + " -colormap type Shared or Private\n" + " -colorspace type alternate image colorspace\n" + " -comment string annotate image with comment\n" + " -compress type type of pixel compression when writing the image\n" + " -define format:option\n" + " define one or more image format options\n" + " -delay value display the next image after pausing\n" + " -density geometry horizontal and vertical density of the image\n" + " -depth value image depth\n" + " -display server display image to this X server\n" + " -dispose method layer disposal method\n" + " -dither method apply error diffusion to image\n" + " -endian type endianness (MSB or LSB) of the image\n" + " -filter type use this filter when resizing an image\n" + " -format string output formatted image characteristics\n" + " -geometry geometry preferred size and location of the Image window\n" + " -gravity type horizontal and vertical backdrop placement\n" + " -identify identify the format and characteristics of the image\n" + " -immutable displayed image cannot be modified\n" + " -interlace type type of image interlacing scheme\n" + " -interpolate method pixel color interpolation method\n" + " -label string assign a label to an image\n" + " -limit type value pixel cache resource limit\n" + " -loop iterations loop images then exit\n" + " -map type display image using this Standard Colormap\n" + " -matte store matte channel if the image has one\n" + " -monitor monitor progress\n" + " -nostdin do not try to open stdin\n" + " -page geometry size and location of an image canvas\n" + " -profile filename add, delete, or apply an image profile\n" + " -quality value JPEG/MIFF/PNG compression level\n" + " -quantize colorspace reduce colors in this colorspace\n" + " -quiet suppress all warning messages\n" + " -regard-warnings pay attention to warning messages\n" + " -remote command execute a command in an remote display process\n" + " -repage geometry size and location of an image canvas (operator)\n" + " -respect-parentheses settings remain in effect until parenthesis boundary\n" + " -sampling-factor geometry\n" + " horizontal and vertical sampling factor\n" + " -scenes range image scene range\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -set property value set an image property\n" + " -size geometry width and height of image\n" + " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n" + " -texture filename name of texture to tile onto the image background\n" + " -transparent-color color\n" + " transparent color\n" + " -treedepth value color tree depth\n" + " -update seconds detect when image file is modified and redisplay\n" + " -verbose print detailed information about the image\n" + " -visual type display image using this visual type\n" + " -virtual-pixel method\n" + " virtual pixel access method\n" + " -window id display image to background of this window\n" + " -window-group id exit program when this window id is destroyed\n" + " -write filename write image to a file", + sequence_operators[] = + " -coalesce merge a sequence of images\n" + " -flatten flatten a sequence of images"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] file [ [options ...] file ...]\n", + GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nImage Operators:\n"); + (void) puts(operators); + (void) printf("\nImage Sequence Operators:\n"); + (void) puts(sequence_operators); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf( + "\nIn addition to those listed above, you can specify these standard X\n"); + (void) printf( + "resources as command line options: -background, -bordercolor,\n"); + (void) printf( + "-borderwidth, -font, -foreground, -iconGeometry, -iconic, -mattecolor,\n"); + (void) printf("-name, -shared-memory, -usePixmap, or -title.\n"); + (void) printf( + "\nBy default, the image format of `file' is determined by its magic\n"); + (void) printf( + "number. To specify a particular image format, precede the filename\n"); + (void) printf( + "with an image format name and a colon (i.e. ps:image) or specify the\n"); + (void) printf( + "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); + (void) printf("'-' for standard input or output.\n"); + (void) printf("\nButtons: \n"); + (void) puts(buttons); + return(MagickTrue); +} + +WandExport MagickBooleanType DisplayImageCommand(ImageInfo *image_info, + int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception) +{ +#if defined(MAGICKCORE_X11_DELEGATE) +#define DestroyDisplay() \ +{ \ + if ((state & ExitState) == 0) \ + DestroyXResources(); \ + if (display != (Display *) NULL) \ + { \ + XCloseDisplay(display); \ + display=(Display *) NULL; \ + } \ + XDestroyResourceInfo(&resource_info); \ + DestroyImageStack(); \ + if (image_marker != (size_t *) NULL) \ + image_marker=(size_t *) RelinquishMagickMemory(image_marker); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowDisplayException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option); \ + DestroyDisplay(); \ + return(MagickFalse); \ +} +#define ThrowDisplayInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",option,argument); \ + DestroyDisplay(); \ + return(MagickFalse); \ +} + + char + *resource_value, + *server_name; + + const char + *option; + + Display + *display; + + Image + *image; + + ImageStack + image_stack[MaxImageStackDepth+1]; + + MagickBooleanType + fire, + nostdin, + pend, + respect_parenthesis; + + MagickStatusType + status; + + QuantizeInfo + *quantize_info; + + ssize_t + i; + + size_t + *image_marker, + iterations, + last_image, + state; + + ssize_t + image_number, + iteration, + j, + k, + l; + + XResourceInfo + resource_info; + + XrmDatabase + resource_database; + + wand_unreferenced(metadata); + + /* + Set defaults. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + if (argc == 2) + { + option=argv[1]; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + } + SetNotifyHandlers; + display=(Display *) NULL; + j=1; + k=0; + image_marker=(size_t *) NULL; + image_number=0; + last_image=0; + NewImageStack(); + option=(char *) NULL; + pend=MagickFalse; + respect_parenthesis=MagickFalse; + nostdin=MagickFalse; + resource_database=(XrmDatabase) NULL; + (void) memset(&resource_info,0,sizeof(resource_info)); + server_name=(char *) NULL; + state=0; + status=MagickTrue; + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + image_marker=(size_t *) AcquireQuantumMemory((size_t) argc+1UL, + sizeof(*image_marker)); + if (image_marker == (size_t *) NULL) + ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + for (i=0; i <= (ssize_t) argc; i++) + image_marker[i]=(size_t) argc; + /* + Check for server name specified on the command line. + */ + for (i=1; i < (ssize_t) argc; i++) + { + /* + Check command line for server name. + */ + option=argv[i]; + if (IsCommandOption(option) == MagickFalse) + continue; + if (LocaleCompare("display",option+1) == 0) + { + /* + User specified server name. + */ + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + server_name=argv[i]; + } + if (LocaleCompare("nostdin",option+1) == 0) + nostdin=MagickTrue; + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + DestroyDisplay(); + return(DisplayUsage()); + } + } + /* + Get user defaults from X resource database. + */ + display=XOpenDisplay(server_name); + if (display == (Display *) NULL) + ThrowDisplayException(XServerError,"UnableToOpenXServer", + XDisplayName(server_name)); + (void) XSetErrorHandler(XError); + resource_database=XGetResourceDatabase(display,GetClientName()); + XGetResourceInfo(image_info,resource_database,GetClientName(), + &resource_info); + quantize_info=resource_info.quantize_info; + image_info->density=XGetResourceInstance(resource_database,GetClientName(), + "density",(char *) NULL); + if (image_info->density == (char *) NULL) + image_info->density=XGetScreenDensity(display); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "interlace","none"); + image_info->interlace=(InterlaceType) + ParseCommandOption(MagickInterlaceOptions,MagickFalse,resource_value); + image_info->page=XGetResourceInstance(resource_database,GetClientName(), + "pageGeometry",(char *) NULL); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "quality","75"); + image_info->quality=StringToUnsignedLong(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "verbose","False"); + image_info->verbose=IsMagickTrue(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "dither","True"); + quantize_info->dither=IsMagickTrue(resource_value); + /* + Parse command line. + */ + iteration=0; + for (i=1; ((i <= (ssize_t) argc) && ((state & ExitState) == 0)); i++) + { + if (i < (ssize_t) argc) + option=argv[i]; + else + if (image != (Image *) NULL) + break; + else + if (isatty(STDIN_FILENO) != MagickFalse || (nostdin != MagickFalse)) + option="logo:"; + else + option="-"; + if (LocaleCompare(option,"(") == 0) + { + FireImageStack(MagickFalse,MagickTrue,pend); + if (k == MaxImageStackDepth) + ThrowDisplayException(OptionError,"ParenthesisNestedTooDeeply", + option); + PushImageStack(); + continue; + } + if (LocaleCompare(option,")") == 0) + { + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + if (k == 0) + ThrowDisplayException(OptionError,"UnableToParseExpression",option); + PopImageStack(); + continue; + } + if (IsCommandOption(option) == MagickFalse) + { + const char + *filename; + + Image + *display_image, + *image_list, + *images; + + /* + Option is a file name. + */ + FireImageStack(MagickFalse,MagickFalse,pend); + filename=option; + if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1))) + { + option=argv[++i]; + filename=option; + } + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + images=ReadImage(image_info,exception); + CatchException(exception); + status&=(images != (Image *) NULL) && + (exception->severity < ErrorException); + if (images == (Image *) NULL) + continue; + AppendImageStack(images); + FinalizeImageSettings(image_info,image,MagickFalse); + iterations=image->iterations; + image_list=CloneImageList(image,exception); + if (image_list == (Image *) NULL) + ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + display_image=image_list; + do + { + /* + Transmogrify image as defined by the image processing options. + */ + resource_info.quantum=1; + if (resource_info.window_id != (char *) NULL) + { + /* + Display image to a specified X window. + */ + status=XDisplayBackgroundImage(display,&resource_info, + display_image); + if (status != MagickFalse) + { + state|=RetainColorsState; + status=MagickFalse; + } + if (GetNextImageInList(display_image) == (Image *) NULL) + state|=ExitState; + } + else + do + { + Image + *nexus; + + /* + Display image to X server. + */ + if (resource_info.delay != 1) + display_image->delay=resource_info.delay; + nexus=XDisplayImage(display,&resource_info,argv,argc, + &display_image,&state); + if (nexus == (Image *) NULL) + break; + while ((nexus != (Image *) NULL) && ((state & ExitState) == 0)) + { + Image + *next; + + if (nexus->montage != (char *) NULL) + { + /* + User selected a visual directory image (montage). + */ + display_image=nexus; + break; + } + next=XDisplayImage(display,&resource_info,argv,argc,&nexus, + &state); + if ((next == (Image *) NULL) && + (GetNextImageInList(nexus) != (Image *) NULL)) + { + display_image=GetNextImageInList(nexus); + nexus=NewImageList(); + } + else + { + if (nexus != display_image) + nexus=DestroyImageList(nexus); + nexus=next; + } + } + } while ((state & ExitState) == 0); + if (resource_info.write_filename != (char *) NULL) + { + /* + Write image. + */ + (void) CopyMagickString(display_image->filename, + resource_info.write_filename,MaxTextExtent); + (void) SetImageInfo(image_info,1,&display_image->exception); + status&=WriteImage(image_info,display_image); + GetImageException(display_image,exception); + } + /* + Proceed to next/previous image. + */ + if ((state & FormerImageState) != 0) + for (l=0; l < (ssize_t) resource_info.quantum; l++) + { + if (GetPreviousImageInList(display_image) == (Image *) NULL) + break; + display_image=GetPreviousImageInList(display_image); + } + else + for (l=0; l < (ssize_t) resource_info.quantum; l++) + { + if (GetNextImageInList(display_image) == (Image *) NULL) + break; + display_image=GetNextImageInList(display_image); + } + if (l < (ssize_t) resource_info.quantum) + break; + } while ((display_image != (Image *) NULL) && + ((state & ExitState) == 0)); + /* + Free image resources. + */ + display_image=DestroyImageList(display_image); + if ((state & FormerImageState) == 0) + { + last_image=(size_t) image_number; + image_marker[i]=(size_t) image_number++; + } + else + { + /* + Proceed to previous image. + */ + for (i--; i > 0; i--) + if (image_marker[i] == (size_t) (image_number-2)) + break; + image_number--; + } + if ((i == (ssize_t) argc) && ((state & ExitState) == 0)) + i=0; + if ((state & ExitState) != 0) + break; + /* + Determine if we should proceed to the first image. + */ + if (image_number < 0) + { + if ((state & FormerImageState) != 0) + { + + for (i=1; i < (ssize_t) (argc-2); i++) + if (last_image == image_marker[i]) + break; + image_number=(ssize_t) image_marker[i]+1; + } + continue; + } + if (resource_info.window_id != (char *) NULL) + state|=ExitState; + if (iterations != 0) + { + if (++iteration == (ssize_t) iterations) + state|=ExitState; + i=0; + } + if (LocaleCompare(filename,"-") == 0) + state|=ExitState; + RemoveAllImageStack(); + continue; + } + pend=image != (Image *) NULL ? MagickTrue : MagickFalse; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("alpha",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowDisplayException(OptionError,"UnrecognizedAlphaChannelType", + argv[i]); + break; + } + if (LocaleCompare("antialias",option+1) == 0) + break; + if (LocaleCompare("authenticate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("auto-orient",option+1) == 0) + break; + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'b': + { + if (LocaleCompare("backdrop",option+1) == 0) + { + resource_info.backdrop=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("background",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.background_color=argv[i]; + break; + } + if (LocaleCompare("border",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("bordercolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.border_color=argv[i]; + break; + } + if (LocaleCompare("borderwidth",option+1) == 0) + { + resource_info.border_width=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + resource_info.border_width=(unsigned int) + StringToUnsignedLong(argv[i]); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + ssize_t + channel; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + channel=ParseChannelOption(argv[i]); + if (channel < 0) + ThrowDisplayException(OptionError,"UnrecognizedChannelType", + argv[i]); + break; + } + if (LocaleCompare("clip",option+1) == 0) + break; + if (LocaleCompare("clip-path",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("coalesce",option+1) == 0) + break; + if (LocaleCompare("colormap",option+1) == 0) + { + resource_info.colormap=PrivateColormap; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.colormap=UndefinedColormap; + if (LocaleCompare("private",argv[i]) == 0) + resource_info.colormap=PrivateColormap; + if (LocaleCompare("shared",argv[i]) == 0) + resource_info.colormap=SharedColormap; + if (resource_info.colormap == UndefinedColormap) + ThrowDisplayException(OptionError,"UnrecognizedColormapType", + argv[i]); + break; + } + if (LocaleCompare("colors",option+1) == 0) + { + quantize_info->number_colors=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + quantize_info->number_colors=StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowDisplayException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("comment",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("compress",option+1) == 0) + { + ssize_t + compress; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + compress=ParseCommandOption(MagickCompressOptions,MagickFalse, + argv[i]); + if (compress < 0) + ThrowDisplayException(OptionError,"UnrecognizedImageCompression", + argv[i]); + break; + } + if (LocaleCompare("concurrent",option+1) == 0) + break; + if (LocaleCompare("contrast",option+1) == 0) + break; + if (LocaleCompare("crop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'd': + { + if (LocaleCompare("debug",option+1) == 0) + { + ssize_t + event; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); + if (event < 0) + ThrowDisplayException(OptionError,"UnrecognizedEventType", + argv[i]); + (void) SetLogEventMask(argv[i]); + break; + } + if (LocaleCompare("decipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (*option == '+') + { + const char + *define; + + define=GetImageOption(image_info,argv[i]); + if (define == (const char *) NULL) + ThrowDisplayException(OptionError,"NoSuchOption",argv[i]); + break; + } + break; + } + if (LocaleCompare("delay",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("density",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("deskew",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("despeckle",option+1) == 0) + break; + if (LocaleCompare("display",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("dispose",option+1) == 0) + { + ssize_t + dispose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]); + if (dispose < 0) + ThrowDisplayException(OptionError,"UnrecognizedDisposeMethod", + argv[i]); + break; + } + if (LocaleCompare("dither",option+1) == 0) + { + ssize_t + method; + + quantize_info->dither=MagickFalse; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]); + if (method < 0) + ThrowDisplayException(OptionError,"UnrecognizedDitherMethod", + argv[i]); + quantize_info->dither=MagickTrue; + quantize_info->dither_method=(DitherMethod) method; + break; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'e': + { + if (LocaleCompare("edge",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("endian",option+1) == 0) + { + ssize_t + endian; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + endian=ParseCommandOption(MagickEndianOptions,MagickFalse, + argv[i]); + if (endian < 0) + ThrowDisplayException(OptionError,"UnrecognizedEndianType", + argv[i]); + break; + } + if (LocaleCompare("enhance",option+1) == 0) + break; + if (LocaleCompare("equalize",option+1) == 0) + break; + if (LocaleCompare("extract",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'f': + { + if (LocaleCompare("filter",option+1) == 0) + { + ssize_t + filter; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]); + if (filter < 0) + ThrowDisplayException(OptionError,"UnrecognizedImageFilter", + argv[i]); + break; + } + if (LocaleCompare("flatten",option+1) == 0) + break; + if (LocaleCompare("flip",option+1) == 0) + break; + if (LocaleCompare("flop",option+1) == 0) + break; + if (LocaleCompare("font",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.font=XGetResourceClass(resource_database, + GetClientName(),"font",argv[i]); + break; + } + if (LocaleCompare("foreground",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.foreground_color=argv[i]; + break; + } + if (LocaleCompare("format",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("frame",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("fuzz",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'g': + { + if (LocaleCompare("gamma",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("geometry",option+1) == 0) + { + resource_info.image_geometry=(char *) NULL; + if (*option == '+') + break; + (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + resource_info.image_geometry=ConstantString(argv[i]); + break; + } + if (LocaleCompare("gravity",option+1) == 0) + { + ssize_t + gravity; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse, + argv[i]); + if (gravity < 0) + ThrowDisplayException(OptionError,"UnrecognizedGravityType", + argv[i]); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'h': + { + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + break; + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'i': + { + if (LocaleCompare("identify",option+1) == 0) + break; + if (LocaleCompare("iconGeometry",option+1) == 0) + { + resource_info.icon_geometry=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + resource_info.icon_geometry=argv[i]; + break; + } + if (LocaleCompare("iconic",option+1) == 0) + { + resource_info.iconic=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("immutable",option+1) == 0) + { + resource_info.immutable=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("interlace",option+1) == 0) + { + ssize_t + interlace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, + argv[i]); + if (interlace < 0) + ThrowDisplayException(OptionError,"UnrecognizedInterlaceType", + argv[i]); + break; + } + if (LocaleCompare("interpolate",option+1) == 0) + { + ssize_t + interpolate; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, + argv[i]); + if (interpolate < 0) + ThrowDisplayException(OptionError,"UnrecognizedInterpolateMethod", + argv[i]); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'l': + { + if (LocaleCompare("label",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("limit",option+1) == 0) + { + char + *p; + + double + value; + + ssize_t + resource; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource=ParseCommandOption(MagickResourceOptions,MagickFalse, + argv[i]); + if (resource < 0) + ThrowDisplayException(OptionError,"UnrecognizedResourceType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + value=StringToDouble(argv[i],&p); + (void) value; + if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); + if (list < 0) + ThrowDisplayException(OptionError,"UnrecognizedListType",argv[i]); + status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) + argv+j,exception); + DestroyDisplay(); + return(status == 0 ? MagickFalse : MagickTrue); + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || + (strchr(argv[i],'%') == (char *) NULL)) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("loop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + iterations=StringToUnsignedLong(argv[i]); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'm': + { + if (LocaleCompare("magnify",option+1) == 0) + { + resource_info.magnify=2; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + resource_info.magnify=(unsigned int) StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("map",option+1) == 0) + { + resource_info.map_type=(char *) NULL; + if (*option == '+') + break; + (void) strcpy(argv[i]+1,"san"); + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.map_type=argv[i]; + break; + } + if (LocaleCompare("matte",option+1) == 0) + break; + if (LocaleCompare("mattecolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.matte_color=argv[i]; + break; + } + if (LocaleCompare("monitor",option+1) == 0) + break; + if (LocaleCompare("monochrome",option+1) == 0) + { + if (*option == '+') + break; + quantize_info->number_colors=2; + quantize_info->colorspace=GRAYColorspace; + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'n': + { + if (LocaleCompare("name",option+1) == 0) + { + resource_info.name=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.name=ConstantString(argv[i]); + break; + } + if (LocaleCompare("negate",option+1) == 0) + break; + if (LocaleCompare("noop",option+1) == 0) + break; + if (LocaleCompare("normalize",option+1) == 0) + break; + if (LocaleCompare("nostdin",option+1) == 0) + break; + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'p': + { + if (LocaleCompare("page",option+1) == 0) + { + resource_info.image_geometry=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.image_geometry=ConstantString(argv[i]); + break; + } + if (LocaleCompare("profile",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'q': + { + if (LocaleCompare("quality",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("quantize",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowDisplayException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("quiet",option+1) == 0) + break; + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'r': + { + if (LocaleCompare("raise",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleCompare("remote",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (XRemoteCommand(display,resource_info.window_id,argv[i]) != 0) + { + DestroyDisplay(); + return(MagickFalse); + } + i--; + break; + } + if (LocaleCompare("repage",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resample",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleNCompare("respect-parentheses",option+1,17) == 0) + { + respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("roll",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("rotate",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 's': + { + if (LocaleCompare("sample",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sampling-factor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("scenes",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("segment",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("set",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("sharpen",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("shared-memory",option+1) == 0) + { + resource_info.use_shared_memory= (*option == '-') ? MagickTrue : + MagickFalse; + break; + } + if (LocaleCompare("size",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("strip",option+1) == 0) + break; + if (LocaleCompare("support",option+1) == 0) + { + i++; /* deprecated */ + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 't': + { + if (LocaleCompare("text-font",option+1) == 0) + { + resource_info.text_font=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.text_font=XGetResourceClass(resource_database, + GetClientName(),"font",argv[i]); + break; + } + if (LocaleCompare("texture",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("thumbnail",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("title",option+1) == 0) + { + resource_info.title=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.title=argv[i]; + break; + } + if (LocaleCompare("transparent-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("treedepth",option+1) == 0) + { + quantize_info->tree_depth=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + quantize_info->tree_depth=StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("trim",option+1) == 0) + break; + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'u': + { + if (LocaleCompare("update",option+1) == 0) + { + resource_info.update=(unsigned int) (*option == '-'); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowDisplayInvalidArgumentException(option,argv[i]); + resource_info.update=(unsigned int) StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("use-pixmap",option+1) == 0) + { + resource_info.use_pixmap=(*option == '-') ? MagickTrue : + MagickFalse; + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + break; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + break; + } + if (LocaleCompare("visual",option+1) == 0) + { + resource_info.visual_type=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.visual_type=argv[i]; + break; + } + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowDisplayException(OptionError, + "UnrecognizedVirtualPixelMethod",argv[i]); + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case 'w': + { + if (LocaleCompare("window",option+1) == 0) + { + resource_info.window_id=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.window_id=argv[i]; + break; + } + if (LocaleCompare("window-group",option+1) == 0) + { + resource_info.window_group=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + if (StringToDouble(argv[i],(char **) NULL) != 0) + resource_info.window_group=argv[i]; + break; + } + if (LocaleCompare("write",option+1) == 0) + { + resource_info.write_filename=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowDisplayException(OptionError,"MissingArgument",option); + resource_info.write_filename=argv[i]; + if (IsPathAccessible(resource_info.write_filename) != MagickFalse) + { + char + answer[2], + *p; + + (void) FormatLocaleFile(stderr,"Overwrite %s? ", + resource_info.write_filename); + p=fgets(answer,(int) sizeof(answer),stdin); + (void) p; + if (((*answer != 'y') && (*answer != 'Y'))) + return(MagickFalse); + } + break; + } + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + case '?': + break; + default: + ThrowDisplayException(OptionError,"UnrecognizedOption",option); + } + fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & + FireOptionFlag) == 0 ? MagickFalse : MagickTrue; + if (fire != MagickFalse) + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + } + if (k != 0) + ThrowDisplayException(OptionError,"UnbalancedParenthesis",argv[i]); + if (state & RetainColorsState) + { + XRetainWindowColors(display,XRootWindow(display,XDefaultScreen(display))); + (void) XSync(display,MagickFalse); + } + DestroyDisplay(); + return(status != 0 ? MagickTrue : MagickFalse); +#else + magick_unreferenced(argc); + magick_unreferenced(argv); + magick_unreferenced(metadata); + + (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError, + "DelegateLibrarySupportNotBuiltIn","`%s' (X11)",image_info->filename); + return(DisplayUsage()); +#endif +} diff --git a/ImageMagick-6.9.12-44/wand/display.h b/ImageMagick-6.9.12-44/wand/display.h new file mode 100644 index 0000000..ef76951 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/display.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand display command-line method. +*/ +#ifndef MAGICKWAND_DISPLAY_H +#define MAGICKWAND_DISPLAY_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport MagickBooleanType + DisplayImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/drawing-wand.c b/ImageMagick-6.9.12-44/wand/drawing-wand.c new file mode 100644 index 0000000..574f56c --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/drawing-wand.c @@ -0,0 +1,6899 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% DDDD RRRR AAA W W IIIII N N GGGG % +% D D R R A A W W I NN N G % +% D D RRRR AAAAA W W I N N N G GG % +% D D R R A A W W W I N NN G G % +% DDDD R R A A W W IIIII N N GGG % +% % +% W W AAA N N DDDD % +% W W A A NN N D D % +% W W W AAAAA N N N D D % +% WW WW A A N NN D D % +% W W A A N N DDDD % +% % +% % +% MagickWand Image Vector Drawing Methods % +% % +% Software Design % +% Bob Friesenhahn % +% March 2002 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/magick-wand-private.h" +#include "wand/wand.h" +#include "magick/image-private.h" +#include "magick/string-private.h" + +/* + Define declarations. +*/ +#define DRAW_BINARY_IMPLEMENTATION 0 + +#define CurrentContext (wand->graphic_context[wand->index]) +#define DrawingWandId "DrawingWand" +#define ThrowDrawException(severity,tag,reason) (void) ThrowMagickException( \ + wand->exception,GetMagickModule(),severity,tag,"`%s'",reason); + +/* + Typedef declarations. +*/ +typedef enum +{ + PathDefaultOperation, + PathCloseOperation, /* Z|z (none) */ + PathCurveToOperation, /* C|c (x1 y1 x2 y2 x y)+ */ + PathCurveToQuadraticBezierOperation, /* Q|q (x1 y1 x y)+ */ + PathCurveToQuadraticBezierSmoothOperation, /* T|t (x y)+ */ + PathCurveToSmoothOperation, /* S|s (x2 y2 x y)+ */ + PathEllipticArcOperation, /* A|a (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+ */ + PathLineToHorizontalOperation, /* H|h x+ */ + PathLineToOperation, /* L|l (x y)+ */ + PathLineToVerticalOperation, /* V|v y+ */ + PathMoveToOperation /* M|m (x y)+ */ +} PathOperation; + +typedef enum +{ + DefaultPathMode, + AbsolutePathMode, + RelativePathMode +} PathMode; + +struct _DrawingWand +{ + size_t + id; + + char + name[MaxTextExtent]; + + /* Support structures */ + Image + *image; + + ExceptionInfo + *exception; + + /* MVG output string and housekeeping */ + char + *mvg; /* MVG data */ + + size_t + mvg_alloc, /* total allocated memory */ + mvg_length; /* total MVG length */ + + size_t + mvg_width; /* current line width */ + + /* Pattern support */ + char + *pattern_id; + + RectangleInfo + pattern_bounds; + + size_t + pattern_offset; + + /* Graphic wand */ + size_t + index; /* array index */ + + DrawInfo + **graphic_context; + + MagickBooleanType + filter_off; /* true if not filtering attributes */ + + /* Pretty-printing depth */ + size_t + indent_depth; /* number of left-hand pad characters */ + + /* Path operation support */ + PathOperation + path_operation; + + PathMode + path_mode; + + MagickBooleanType + destroy, + debug; + + size_t + signature; +}; + +/* + Forward declarations. +*/ +static int + MVGPrintf(DrawingWand *,const char *,...) wand_attribute((format + (printf,2,3))), + MVGAutoWrapPrintf(DrawingWand *,const char *,...) wand_attribute((format + (printf,2,3))); + +static void + MVGAppendColor(DrawingWand *,const PixelPacket *); + +/* + "Printf" for MVG commands +*/ +static int MVGPrintf(DrawingWand *wand,const char *format,...) +{ + size_t + extent; + + assert(wand != (DrawingWand *) NULL); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",format); + assert(wand->signature == WandSignature); + extent=20UL*MaxTextExtent; + if (wand->mvg == (char *) NULL) + { + wand->mvg=(char *) AcquireQuantumMemory(extent,sizeof(*wand->mvg)); + if (wand->mvg == (char *) NULL) + { + ThrowDrawException(ResourceLimitError,"MemoryAllocationFailed", + wand->name); + return(-1); + } + wand->mvg_alloc=extent; + wand->mvg_length=0; + } + if (wand->mvg_alloc < (wand->mvg_length+10*MaxTextExtent)) + { + extent+=wand->mvg_alloc; + wand->mvg=(char *) ResizeQuantumMemory(wand->mvg,extent, + sizeof(*wand->mvg)); + if (wand->mvg == (char *) NULL) + { + ThrowDrawException(ResourceLimitError,"MemoryAllocationFailed", + wand->name); + return(-1); + } + wand->mvg_alloc=extent; + } + { + int + count; + + ssize_t + offset; + + va_list + argp; + + while (wand->mvg_width < wand->indent_depth) + { + wand->mvg[wand->mvg_length]=' '; + wand->mvg_length++; + wand->mvg_width++; + } + wand->mvg[wand->mvg_length]='\0'; + count=(-1); + offset=(ssize_t) wand->mvg_alloc-wand->mvg_length-1; + if (offset > 0) + { + va_start(argp,format); +#if defined(MAGICKCORE_HAVE_VSNPRINTF) + count=vsnprintf(wand->mvg+wand->mvg_length,(size_t) offset,format,argp); +#else + count=vsprintf(wand->mvg+wand->mvg_length,format,argp); +#endif + va_end(argp); + } + if ((count < 0) || (count > (int) offset)) + ThrowDrawException(DrawError,"UnableToPrint",format) + else + { + wand->mvg_length+=count; + wand->mvg_width+=count; + } + wand->mvg[wand->mvg_length]='\0'; + if ((wand->mvg_length > 1) && (wand->mvg[wand->mvg_length-1] == '\n')) + wand->mvg_width=0; + assert((wand->mvg_length+1) < wand->mvg_alloc); + return(count); + } +} + +static int MVGAutoWrapPrintf(DrawingWand *wand,const char *format,...) +{ + char + buffer[MaxTextExtent]; + + int + count; + + va_list + argp; + + va_start(argp,format); +#if defined(MAGICKCORE_HAVE_VSNPRINTF) + count=vsnprintf(buffer,sizeof(buffer)-1,format,argp); +#else + count=vsprintf(buffer,format,argp); +#endif + va_end(argp); + buffer[sizeof(buffer)-1]='\0'; + if (count < 0) + ThrowDrawException(DrawError,"UnableToPrint",format) + else + { + if (((wand->mvg_width + count) > 78) && (buffer[count-1] != '\n')) + (void) MVGPrintf(wand, "\n"); + (void) MVGPrintf(wand,"%s",buffer); + } + return(count); +} + +static void MVGAppendColor(DrawingWand *wand,const PixelPacket *color) +{ + if ((GetPixelRed(color) == 0) && + (GetPixelGreen(color) == 0) && + (GetPixelBlue(color) == 0) && + (GetPixelOpacity(color) == (Quantum) TransparentOpacity)) + (void) MVGPrintf(wand,"none"); + else + { + char + tuple[MaxTextExtent]; + + MagickPixelPacket + pixel; + + GetMagickPixelPacket(wand->image,&pixel); + pixel.colorspace=sRGBColorspace; + pixel.matte=color->opacity != OpaqueOpacity ? MagickTrue : MagickFalse; + pixel.red=(MagickRealType) GetPixelRed(color); + pixel.green=(MagickRealType) GetPixelGreen(color); + pixel.blue=(MagickRealType) GetPixelBlue(color); + pixel.opacity=(MagickRealType) GetPixelOpacity(color); + GetColorTuple(&pixel,MagickTrue,tuple); + (void) MVGPrintf(wand,"%s",tuple); + } +} + +static void MVGAppendPointsCommand(DrawingWand *wand,const char *command, + const size_t number_coordinates,const PointInfo *coordinates) +{ + const PointInfo + *coordinate; + + size_t + i; + + (void) MVGPrintf(wand,"%s",command); + for (i=number_coordinates, coordinate=coordinates; i != 0; i--) + { + (void) MVGAutoWrapPrintf(wand," %.20g %.20g",coordinate->x,coordinate->y); + coordinate++; + } + (void) MVGPrintf(wand, "\n"); +} + +static void AdjustAffine(DrawingWand *wand,const AffineMatrix *affine) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((affine->sx != 1.0) || (affine->rx != 0.0) || (affine->ry != 0.0) || + (affine->sy != 1.0) || (affine->tx != 0.0) || (affine->ty != 0.0)) + { + AffineMatrix + current; + + current=CurrentContext->affine; + CurrentContext->affine.sx=affine->sx*current.sx+affine->ry*current.rx; + CurrentContext->affine.rx=affine->rx*current.sx+affine->sy*current.rx; + CurrentContext->affine.ry=affine->sx*current.ry+affine->ry*current.sy; + CurrentContext->affine.sy=affine->rx*current.ry+affine->sy*current.sy; + CurrentContext->affine.tx=affine->sx*current.tx+affine->ry*current.ty+ + affine->tx; + CurrentContext->affine.ty=affine->rx*current.tx+affine->sy*current.ty+ + affine->ty; + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ A c q u i r e D r a w i n g W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireDrawingWand() allocates an initial drawing wand which is an opaque +% handle required by the remaining drawing methods. +% +% The format of the AcquireDrawingWand method is: +% +% DrawingWand AcquireDrawingWand(const DrawInfo *draw_info,Image *image) +% +% A description of each parameter follows: +% +% o draw_info: Initial drawing defaults. Set to NULL to use defaults. +% +% o image: the image to draw on. +% +*/ +WandExport DrawingWand *AcquireDrawingWand(const DrawInfo *draw_info, + Image *image) +{ + DrawingWand + *wand; + + wand=NewDrawingWand(); + if (draw_info != (const DrawInfo *) NULL) + { + CurrentContext=DestroyDrawInfo(CurrentContext); + CurrentContext=CloneDrawInfo((ImageInfo *) NULL,draw_info); + } + if (image != (Image *) NULL) + { + wand->image=DestroyImage(wand->image); + wand->destroy=MagickFalse; + } + wand->image=image; + return(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l e a r D r a w i n g W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClearDrawingWand() clears resources associated with the drawing wand. +% +% The format of the ClearDrawingWand method is: +% +% void ClearDrawingWand(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand to clear. +% +*/ +WandExport void ClearDrawingWand(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + for ( ; wand->index > 0; wand->index--) + CurrentContext=DestroyDrawInfo(CurrentContext); + CurrentContext=DestroyDrawInfo(CurrentContext); + wand->graphic_context=(DrawInfo **) RelinquishMagickMemory( + wand->graphic_context); + if (wand->pattern_id != (char *) NULL) + wand->pattern_id=DestroyString(wand->pattern_id); + wand->mvg=DestroyString(wand->mvg); + if ((wand->destroy != MagickFalse) && (wand->image != (Image *) NULL)) + wand->image=DestroyImage(wand->image); + else + wand->image=(Image *) NULL; + wand->mvg=(char *) NULL; + wand->mvg_alloc=0; + wand->mvg_length=0; + wand->mvg_width=0; + wand->pattern_id=(char *) NULL; + wand->pattern_offset=0; + wand->pattern_bounds.x=0; + wand->pattern_bounds.y=0; + wand->pattern_bounds.width=0; + wand->pattern_bounds.height=0; + wand->index=0; + wand->graphic_context=(DrawInfo **) AcquireQuantumMemory(1, + sizeof(*wand->graphic_context)); + if (wand->graphic_context == (DrawInfo **) NULL) + { + ThrowDrawException(ResourceLimitError,"MemoryAllocationFailed", + wand->name); + return; + } + CurrentContext=CloneDrawInfo((ImageInfo *) NULL,(DrawInfo *) NULL); + wand->filter_off=MagickTrue; + wand->indent_depth=0; + wand->path_operation=PathDefaultOperation; + wand->path_mode=DefaultPathMode; + wand->image=AcquireImage((const ImageInfo *) NULL); + ClearMagickException(wand->exception); + wand->destroy=MagickTrue; + wand->debug=IsEventLogging(); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e D r a w i n g W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneDrawingWand() makes an exact copy of the specified wand. +% +% The format of the CloneDrawingWand method is: +% +% DrawingWand *CloneDrawingWand(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport DrawingWand *CloneDrawingWand(const DrawingWand *wand) +{ + DrawingWand + *clone_wand; + + ssize_t + i; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + clone_wand=(DrawingWand *) AcquireMagickMemory(sizeof(*clone_wand)); + if (clone_wand == (DrawingWand *) NULL) + ThrowWandFatalException(ResourceLimitFatalError, + "MemoryAllocationFailed",GetExceptionMessage(errno)); + (void) memset(clone_wand,0,sizeof(*clone_wand)); + clone_wand->id=AcquireWandId(); + (void) FormatLocaleString(clone_wand->name,MaxTextExtent,"DrawingWand-%.20g", + (double) clone_wand->id); + clone_wand->exception=AcquireExceptionInfo(); + InheritException(clone_wand->exception,wand->exception); + clone_wand->mvg=AcquireString(wand->mvg); + clone_wand->mvg_length=strlen(clone_wand->mvg); + clone_wand->mvg_alloc=wand->mvg_length+1; + clone_wand->mvg_width=wand->mvg_width; + clone_wand->pattern_id=AcquireString(wand->pattern_id); + clone_wand->pattern_offset=wand->pattern_offset; + clone_wand->pattern_bounds=wand->pattern_bounds; + clone_wand->index=wand->index; + clone_wand->graphic_context=(DrawInfo **) AcquireQuantumMemory((size_t) + wand->index+1UL,sizeof(*wand->graphic_context)); + if (clone_wand->graphic_context == (DrawInfo **) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + for (i=0; i <= (ssize_t) wand->index; i++) + clone_wand->graphic_context[i]= + CloneDrawInfo((ImageInfo *) NULL,wand->graphic_context[i]); + clone_wand->filter_off=wand->filter_off; + clone_wand->indent_depth=wand->indent_depth; + clone_wand->path_operation=wand->path_operation; + clone_wand->path_mode=wand->path_mode; + clone_wand->image=wand->image; + if (wand->image != (Image *) NULL) + clone_wand->image=CloneImage(wand->image,0,0,MagickTrue, + clone_wand->exception); + clone_wand->destroy=MagickTrue; + clone_wand->debug=IsEventLogging(); + if (clone_wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_wand->name); + clone_wand->signature=WandSignature; + return(clone_wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y D r a w i n g W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyDrawingWand() frees all resources associated with the drawing wand. +% Once the drawing wand has been freed, it should not be used and further +% unless it re-allocated. +% +% The format of the DestroyDrawingWand method is: +% +% DrawingWand *DestroyDrawingWand(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand to destroy. +% +*/ +WandExport DrawingWand *DestroyDrawingWand(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + for ( ; wand->index > 0; wand->index--) + CurrentContext=DestroyDrawInfo(CurrentContext); + CurrentContext=DestroyDrawInfo(CurrentContext); + wand->graphic_context=(DrawInfo **) RelinquishMagickMemory( + wand->graphic_context); + if (wand->pattern_id != (char *) NULL) + wand->pattern_id=DestroyString(wand->pattern_id); + wand->mvg=DestroyString(wand->mvg); + if ((wand->destroy != MagickFalse) && (wand->image != (Image *) NULL)) + wand->image=DestroyImage(wand->image); + wand->image=(Image *) NULL; + wand->exception=DestroyExceptionInfo(wand->exception); + wand->signature=(~WandSignature); + RelinquishWandId(wand->id); + wand=(DrawingWand *) RelinquishMagickMemory(wand); + return(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w A f f i n e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawAffine() adjusts the current affine transformation matrix with +% the specified affine transformation matrix. Note that the current affine +% transform is adjusted rather than replaced. +% +% The format of the DrawAffine method is: +% +% void DrawAffine(DrawingWand *wand,const AffineMatrix *affine) +% +% A description of each parameter follows: +% +% o wand: Drawing wand +% +% o affine: Affine matrix parameters +% +*/ +WandExport void DrawAffine(DrawingWand *wand,const AffineMatrix *affine) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(affine != (const AffineMatrix *) NULL); + AdjustAffine(wand,affine); + (void) MVGPrintf(wand,"affine %.20g %.20g %.20g %.20g %.20g %.20g\n", + affine->sx,affine->rx,affine->ry,affine->sy,affine->tx,affine->ty); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w A n n o t a t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawAnnotation() draws text on the image. +% +% The format of the DrawAnnotation method is: +% +% void DrawAnnotation(DrawingWand *wand,const double x, +% const double y,const unsigned char *text) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: x ordinate to left of text +% +% o y: y ordinate to text baseline +% +% o text: text to draw +% +*/ +WandExport void DrawAnnotation(DrawingWand *wand,const double x,const double y, + const unsigned char *text) +{ + char + *escaped_text; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(text != (const unsigned char *) NULL); + escaped_text=EscapeString((const char *) text,'\''); + if (escaped_text != (char *) NULL) + { + (void) MVGPrintf(wand,"text %.20g %.20g '%s'\n",x,y,escaped_text); + escaped_text=DestroyString(escaped_text); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w A r c % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawArc() draws an arc falling within a specified bounding rectangle on the +% image. +% +% The format of the DrawArc method is: +% +% void DrawArc(DrawingWand *wand,const double sx,const double sy, +% const double ex,const double ey,const double sd,const double ed) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o sx: starting x ordinate of bounding rectangle +% +% o sy: starting y ordinate of bounding rectangle +% +% o ex: ending x ordinate of bounding rectangle +% +% o ey: ending y ordinate of bounding rectangle +% +% o sd: starting degrees of rotation +% +% o ed: ending degrees of rotation +% +*/ +WandExport void DrawArc(DrawingWand *wand,const double sx,const double sy, + const double ex,const double ey,const double sd,const double ed) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"arc %.20g %.20g %.20g %.20g %.20g %.20g\n",sx,sy,ex, + ey,sd,ed); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w B e z i e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawBezier() draws a bezier curve through a set of points on the image. +% +% The format of the DrawBezier method is: +% +% void DrawBezier(DrawingWand *wand, +% const size_t number_coordinates,const PointInfo *coordinates) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o number_coordinates: number of coordinates +% +% o coordinates: coordinates +% +*/ +WandExport void DrawBezier(DrawingWand *wand, + const size_t number_coordinates,const PointInfo *coordinates) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(coordinates != (const PointInfo *) NULL); + MVGAppendPointsCommand(wand,"bezier",number_coordinates,coordinates); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w C i r c l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawCircle() draws a circle on the image. +% +% The format of the DrawCircle method is: +% +% void DrawCircle(DrawingWand *wand,const double ox, +% const double oy,const double px, const double py) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o ox: origin x ordinate +% +% o oy: origin y ordinate +% +% o px: perimeter x ordinate +% +% o py: perimeter y ordinate +% +*/ +WandExport void DrawCircle(DrawingWand *wand,const double ox,const double oy, + const double px,const double py) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"circle %.20g %.20g %.20g %.20g\n",ox,oy,px,py); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w C l e a r E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawClearException() clear any exceptions associated with the wand. +% +% The format of the DrawClearException method is: +% +% MagickBooleanType DrawClearException(DrawWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport MagickBooleanType DrawClearException(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + ClearMagickException(wand->exception); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w C o m p o s i t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawComposite() composites an image onto the current image, using the +% specified composition operator, specified position, and at the specified +% size. +% +% The format of the DrawComposite method is: +% +% MagickBooleanType DrawComposite(DrawingWand *wand, +% const CompositeOperator compose,const double x, +% const double y,const double width,const double height, +% MagickWand *magick_wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o compose: composition operator +% +% o x: x ordinate of top left corner +% +% o y: y ordinate of top left corner +% +% o width: Width to resize image to prior to compositing. Specify zero to +% use existing width. +% +% o height: Height to resize image to prior to compositing. Specify zero +% to use existing height. +% +% o magick_wand: Image to composite is obtained from this wand. +% +*/ +WandExport MagickBooleanType DrawComposite(DrawingWand *wand, + const CompositeOperator compose,const double x,const double y, + const double width,const double height,MagickWand *magick_wand) + +{ + char + *base64, + *media_type; + + const char + *mode; + + ImageInfo + *image_info; + + Image + *clone_image, + *image; + + char + *p; + + ssize_t + i; + + size_t + blob_length, + encoded_length; + + unsigned char + *blob; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(magick_wand != (MagickWand *) NULL); + image=GetImageFromMagickWand(magick_wand); + if (image == (Image *) NULL) + return(MagickFalse); + clone_image=CloneImage(image,0,0,MagickTrue,wand->exception); + if (clone_image == (Image *) NULL) + return(MagickFalse); + image_info=AcquireImageInfo(); + (void) CopyMagickString(image_info->magick,"MIFF",MaxTextExtent); + blob_length=2048; + blob=(unsigned char *) ImageToBlob(image_info,clone_image,&blob_length, + wand->exception); + image_info=DestroyImageInfo(image_info); + clone_image=DestroyImageList(clone_image); + if (blob == (void *) NULL) + return(MagickFalse); + encoded_length=0; + base64=Base64Encode(blob,blob_length,&encoded_length); + blob=(unsigned char *) RelinquishMagickMemory(blob); + if (base64 == (char *) NULL) + { + char + buffer[MaxTextExtent]; + + (void) FormatLocaleString(buffer,MaxTextExtent,"%.20g bytes",(double) + (4L*blob_length/3L+4L)); + ThrowDrawException(ResourceLimitWarning,"MemoryAllocationFailed", + wand->name); + return(MagickFalse); + } + mode=CommandOptionToMnemonic(MagickComposeOptions,(ssize_t) compose); + media_type=MagickToMime(image->magick); + (void) MVGPrintf(wand,"image %s %.20g %.20g %.20g %.20g 'data:%s;base64,\n", + mode,x,y,width,height,media_type); + p=base64; + for (i=(ssize_t) encoded_length; i > 0; i-=76) + { + (void) MVGPrintf(wand,"%.76s",p); + p+=76; + if (i > 76) + (void) MVGPrintf(wand,"\n"); + } + (void) MVGPrintf(wand,"'\n"); + media_type=DestroyString(media_type); + base64=DestroyString(base64); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawColor() draws color on image using the current fill color, starting at +% specified position, and using specified paint method. The available paint +% methods are: +% +% PointMethod: Recolors the target pixel +% ReplaceMethod: Recolor any pixel that matches the target pixel. +% FloodfillMethod: Recolors target pixels and matching neighbors. +% ResetMethod: Recolor all pixels. +% +% The format of the DrawColor method is: +% +% void DrawColor(DrawingWand *wand,const double x,const double y, +% const PaintMethod paint_method) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: x ordinate. +% +% o y: y ordinate. +% +% o paint_method: paint method. +% +*/ +WandExport void DrawColor(DrawingWand *wand,const double x,const double y, + const PaintMethod paint_method) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"color %.20g %.20g '%s'\n",x,y,CommandOptionToMnemonic( + MagickMethodOptions,(ssize_t) paint_method)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w C o m m e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawComment() adds a comment to a vector output stream. +% +% The format of the DrawComment method is: +% +% void DrawComment(DrawingWand *wand,const char *comment) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o comment: comment text +% +*/ +WandExport void DrawComment(DrawingWand *wand,const char *comment) +{ + (void) MVGPrintf(wand,"#%s\n",comment); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w E l l i p s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawEllipse() draws an ellipse on the image. +% +% The format of the DrawEllipse method is: +% +% void DrawEllipse(DrawingWand *wand,const double ox,const double oy, +% const double rx,const double ry,const double start,const double end) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o ox: origin x ordinate +% +% o oy: origin y ordinate +% +% o rx: radius in x +% +% o ry: radius in y +% +% o start: starting rotation in degrees +% +% o end: ending rotation in degrees +% +*/ +WandExport void DrawEllipse(DrawingWand *wand,const double ox,const double oy, + const double rx,const double ry,const double start,const double end) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"ellipse %.20g %.20g %.20g %.20g %.20g %.20g\n",ox,oy, + rx,ry,start,end); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t B o r d e r C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetBorderColor() returns the border color used for drawing bordered +% objects. +% +% The format of the DrawGetBorderColor method is: +% +% void DrawGetBorderColor(const DrawingWand *wand, +% PixelWand *border_color) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o border_color: Return the border color. +% +*/ +WandExport void DrawGetBorderColor(const DrawingWand *wand, + PixelWand *border_color) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + assert(border_color != (PixelWand *) NULL); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + PixelSetQuantumColor(border_color,&CurrentContext->border_color); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t C l i p P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetClipPath() obtains the current clipping path ID. The value returned +% must be deallocated by the user when it is no longer needed. +% +% The format of the DrawGetClipPath method is: +% +% char *DrawGetClipPath(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport char *DrawGetClipPath(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (CurrentContext->clip_mask != (char *) NULL) + return((char *) AcquireString(CurrentContext->clip_mask)); + return((char *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t C l i p R u l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetClipRule() returns the current polygon fill rule to be used by the +% clipping path. +% +% The format of the DrawGetClipRule method is: +% +% FillRule DrawGetClipRule(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport FillRule DrawGetClipRule(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->fill_rule); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t C l i p U n i t s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetClipUnits() returns the interpretation of clip path units. +% +% The format of the DrawGetClipUnits method is: +% +% ClipPathUnits DrawGetClipUnits(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport ClipPathUnits DrawGetClipUnits(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->clip_units); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t D e n s i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetDensity() obtains the vertical and horizontal resolution. The value +% returned must be deallocated by the user when it is no longer needed. +% +% The format of the DrawGetDensity method is: +% +% char *DrawGetDensity(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport char *DrawGetDensity(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == MagickCoreSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (CurrentContext->density != (char *) NULL) + return((char *) AcquireString(CurrentContext->density)); + return((char *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetException() returns the severity, reason, and description of any +% error that occurs when using other methods in this API. +% +% The format of the DrawGetException method is: +% +% char *DrawGetException(const DrawWand *wand, +% ExceptionType *severity) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o severity: the severity of the error is returned here. +% +*/ +WandExport char *DrawGetException(const DrawingWand *wand, + ExceptionType *severity) +{ + char + *description; + + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(severity != (ExceptionType *) NULL); + *severity=wand->exception->severity; + description=(char *) AcquireQuantumMemory(2UL*MaxTextExtent, + sizeof(*description)); + if (description == (char *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + wand->name); + *description='\0'; + if (wand->exception->reason != (char *) NULL) + (void) CopyMagickString(description,GetLocaleExceptionMessage( + wand->exception->severity,wand->exception->reason), + MaxTextExtent); + if (wand->exception->description != (char *) NULL) + { + (void) ConcatenateMagickString(description," (",MaxTextExtent); + (void) ConcatenateMagickString(description,GetLocaleExceptionMessage( + wand->exception->severity,wand->exception->description), + MaxTextExtent); + (void) ConcatenateMagickString(description,")",MaxTextExtent); + } + return(description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t E x c e p t i o n T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetExceptionType() the exception type associated with the wand. If +% no exception has occurred, UndefinedExceptionType is returned. +% +% The format of the DrawGetExceptionType method is: +% +% ExceptionType DrawGetExceptionType(const DrawWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ExceptionType DrawGetExceptionType(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->exception->severity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F i l l C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFillColor() returns the fill color used for drawing filled objects. +% +% The format of the DrawGetFillColor method is: +% +% void DrawGetFillColor(const DrawingWand *wand, +% PixelWand *fill_color) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o fill_color: Return the fill color. +% +*/ +WandExport void DrawGetFillColor(const DrawingWand *wand,PixelWand *fill_color) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + assert(fill_color != (PixelWand *) NULL); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + PixelSetQuantumColor(fill_color,&CurrentContext->fill); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F i l l O p a c i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFillOpacity() returns the opacity used when drawing using the fill +% color or fill texture. Fully opaque is 1.0. +% +% The format of the DrawGetFillOpacity method is: +% +% double DrawGetFillOpacity(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport double DrawGetFillOpacity(const DrawingWand *wand) +{ + double + alpha; + + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + alpha=(double) QuantumScale*(QuantumRange-CurrentContext->fill.opacity); + return(alpha); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F i l l R u l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFillRule() returns the fill rule used while drawing polygons. +% +% The format of the DrawGetFillRule method is: +% +% FillRule DrawGetFillRule(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport FillRule DrawGetFillRule(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->fill_rule); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F o n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFont() returns a null-terminaged string specifying the font used +% when annotating with text. The value returned must be freed by the user +% when no longer needed. +% +% The format of the DrawGetFont method is: +% +% char *DrawGetFont(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport char *DrawGetFont(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (CurrentContext->font != (char *) NULL) + return(AcquireString(CurrentContext->font)); + return((char *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F o n t F a m i l y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFontFamily() returns the font family to use when annotating with text. +% The value returned must be freed by the user when it is no longer needed. +% +% The format of the DrawGetFontFamily method is: +% +% char *DrawGetFontFamily(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport char *DrawGetFontFamily(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (CurrentContext->family != NULL) + return(AcquireString(CurrentContext->family)); + return((char *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F o n t R e s o l u t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFontResolution() gets the image X and Y resolution. +% +% The format of the DrawGetFontResolution method is: +% +% DrawBooleanType DrawGetFontResolution(const DrawingWand *wand, +% double *x,double *y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the x-resolution. +% +% o y: the y-resolution. +% +*/ +WandExport MagickBooleanType DrawGetFontResolution(const DrawingWand *wand, + double *x,double *y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + *x=DefaultResolution; + *y=DefaultResolution; + if (CurrentContext->density != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(CurrentContext->density,&geometry_info); + *x=geometry_info.rho; + *y=geometry_info.sigma; + if ((flags & SigmaValue) == MagickFalse) + *y=(*x); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F o n t S i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFontSize() returns the font pointsize used when annotating with text. +% +% The format of the DrawGetFontSize method is: +% +% double DrawGetFontSize(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport double DrawGetFontSize(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->pointsize); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F o n t S t r e t c h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFontStretch() returns the font stretch used when annotating with text. +% +% The format of the DrawGetFontStretch method is: +% +% StretchType DrawGetFontStretch(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport StretchType DrawGetFontStretch(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->stretch); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F o n t S t y l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFontStyle() returns the font style used when annotating with text. +% +% The format of the DrawGetFontStyle method is: +% +% StyleType DrawGetFontStyle(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport StyleType DrawGetFontStyle(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->style); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t F o n t W e i g h t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetFontWeight() returns the font weight used when annotating with text. +% +% The format of the DrawGetFontWeight method is: +% +% size_t DrawGetFontWeight(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport size_t DrawGetFontWeight(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->weight); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t G r a v i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetGravity() returns the text placement gravity used when annotating +% with text. +% +% The format of the DrawGetGravity method is: +% +% GravityType DrawGetGravity(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport GravityType DrawGetGravity(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->gravity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t O p a c i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetOpacity() returns the opacity used when drawing with the fill +% or stroke color or texture. Fully opaque is 1.0. +% +% The format of the DrawGetOpacity method is: +% +% double DrawGetOpacity(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport double DrawGetOpacity(const DrawingWand *wand) +{ + double + alpha; + + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + alpha=(double) QuantumScale*(QuantumRange-CurrentContext->opacity); + return(alpha); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t S t r o k e A n t i a l i a s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetStrokeAntialias() returns the current stroke antialias setting. +% Stroked outlines are antialiased by default. When antialiasing is disabled +% stroked pixels are thresholded to determine if the stroke color or +% underlying canvas color should be used. +% +% The format of the DrawGetStrokeAntialias method is: +% +% MagickBooleanType DrawGetStrokeAntialias(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport MagickBooleanType DrawGetStrokeAntialias(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->stroke_antialias); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t S t r o k e C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetStrokeColor() returns the color used for stroking object outlines. +% +% The format of the DrawGetStrokeColor method is: +% +% void DrawGetStrokeColor(const DrawingWand *wand, +% PixelWand *stroke_color) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o stroke_color: Return the stroke color. +% +*/ +WandExport void DrawGetStrokeColor(const DrawingWand *wand, + PixelWand *stroke_color) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + assert(stroke_color != (PixelWand *) NULL); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + PixelSetQuantumColor(stroke_color,&CurrentContext->stroke); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t S t r o k e D a s h A r r a y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetStrokeDashArray() returns an array representing the pattern of +% dashes and gaps used to stroke paths (see DrawSetStrokeDashArray). The +% array must be freed once it is no longer required by the user. +% +% The format of the DrawGetStrokeDashArray method is: +% +% double *DrawGetStrokeDashArray(const DrawingWand *wand, +% size_t *number_elements) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o number_elements: address to place number of elements in dash array +% +*/ +WandExport double *DrawGetStrokeDashArray(const DrawingWand *wand, + size_t *number_elements) +{ + double + *dasharray; + + const double + *p; + + double + *q; + + ssize_t + i; + + size_t + n; + + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(number_elements != (size_t *) NULL); + n=0; + p=CurrentContext->dash_pattern; + if (p != (const double *) NULL) + while (fabs(*p++) >= MagickEpsilon) + n++; + *number_elements=n; + dasharray=(double *) NULL; + if (n != 0) + { + dasharray=(double *) AcquireQuantumMemory((size_t) n+1UL, + sizeof(*dasharray)); + if (dasharray != (double *) NULL) + { + p=CurrentContext->dash_pattern; + q=dasharray; + for (i=0; i < (ssize_t) n; i++) + *q++=(*p++); + *q=0.0; + } + } + return(dasharray); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t S t r o k e D a s h O f f s e t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetStrokeDashOffset() returns the offset into the dash pattern to +% start the dash. +% +% The format of the DrawGetStrokeDashOffset method is: +% +% double DrawGetStrokeDashOffset(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport double DrawGetStrokeDashOffset(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->dash_offset); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t S t r o k e L i n e C a p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetStrokeLineCap() returns the shape to be used at the end of +% open subpaths when they are stroked. Values of LineCap are +% UndefinedCap, ButtCap, RoundCap, and SquareCap. +% +% The format of the DrawGetStrokeLineCap method is: +% +% LineCap DrawGetStrokeLineCap(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport LineCap DrawGetStrokeLineCap(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->linecap); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t S t r o k e L i n e J o i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetStrokeLineJoin() returns the shape to be used at the +% corners of paths (or other vector shapes) when they are +% stroked. Values of LineJoin are UndefinedJoin, MiterJoin, RoundJoin, +% and BevelJoin. +% +% The format of the DrawGetStrokeLineJoin method is: +% +% LineJoin DrawGetStrokeLineJoin(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport LineJoin DrawGetStrokeLineJoin(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->linejoin); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t S t r o k e M i t e r L i m i t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetStrokeMiterLimit() returns the miter limit. When two line +% segments meet at a sharp angle and miter joins have been specified for +% 'lineJoin', it is possible for the miter to extend far beyond the +% thickness of the line stroking the path. The miterLimit' imposes a +% limit on the ratio of the miter length to the 'lineWidth'. +% +% The format of the DrawGetStrokeMiterLimit method is: +% +% size_t DrawGetStrokeMiterLimit(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport size_t DrawGetStrokeMiterLimit(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return CurrentContext->miterlimit; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t S t r o k e O p a c i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetStrokeOpacity() returns the opacity of stroked object outlines. +% +% The format of the DrawGetStrokeOpacity method is: +% +% double DrawGetStrokeOpacity(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport double DrawGetStrokeOpacity(const DrawingWand *wand) +{ + double + alpha; + + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + alpha=(double) QuantumScale*(QuantumRange-CurrentContext->stroke.opacity); + return(alpha); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t S t r o k e W i d t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetStrokeWidth() returns the width of the stroke used to draw object +% outlines. +% +% The format of the DrawGetStrokeWidth method is: +% +% double DrawGetStrokeWidth(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport double DrawGetStrokeWidth(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->stroke_width); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t T e x t A l i g n m e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetTextAlignment() returns the alignment applied when annotating with +% text. +% +% The format of the DrawGetTextAlignment method is: +% +% AlignType DrawGetTextAlignment(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport AlignType DrawGetTextAlignment(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->align); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t T e x t A n t i a l i a s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetTextAntialias() returns the current text antialias setting, which +% determines whether text is antialiased. Text is antialiased by default. +% +% The format of the DrawGetTextAntialias method is: +% +% MagickBooleanType DrawGetTextAntialias(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport MagickBooleanType DrawGetTextAntialias(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->text_antialias); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t T e x t D e c o r a t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetTextDecoration() returns the decoration applied when annotating with +% text. +% +% The format of the DrawGetTextDecoration method is: +% +% DecorationType DrawGetTextDecoration(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport DecorationType DrawGetTextDecoration(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->decorate); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t T e x t D i r e c t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetTextDirection() returns the direction that will be used when +% annotating with text. +% +% The format of the DrawGetTextDirection method is: +% +% DirectionType DrawGetTextDirection(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport DirectionType DrawGetTextDirection(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->direction); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t T e x t E n c o d i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetTextEncoding() returns a null-terminated string which specifies the +% code set used for text annotations. The string must be freed by the user +% once it is no longer required. +% +% The format of the DrawGetTextEncoding method is: +% +% char *DrawGetTextEncoding(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport char *DrawGetTextEncoding(const DrawingWand *wand) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (CurrentContext->encoding != (char *) NULL) + return((char *) AcquireString(CurrentContext->encoding)); + return((char *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t T e x t K e r n i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetTextKerning() gets the spacing between characters in text. +% +% The format of the DrawSetFontKerning method is: +% +% double DrawGetTextKerning(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport double DrawGetTextKerning(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->kerning); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t T e x t I n t e r l i n e S p a c i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetTextInterlineSpacing() gets the spacing between lines in text. +% +% The format of the DrawGetTextInterwordSpacing method is: +% +% double DrawGetTextInterwordSpacing(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport double DrawGetTextInterlineSpacing(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->interline_spacing); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t T e x t I n t e r w o r d S p a c i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetTextInterwordSpacing() gets the spacing between words in text. +% +% The format of the DrawSetFontKerning method is: +% +% double DrawGetTextInterwordSpacing(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport double DrawGetTextInterwordSpacing(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(CurrentContext->interword_spacing); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t V e c t o r G r a p h i c s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetVectorGraphics() returns a null-terminated string which specifies the +% vector graphics generated by any graphics calls made since the wand was +% instantiated. The string must be freed by the user once it is no longer +% required. +% +% The format of the DrawGetVectorGraphics method is: +% +% char *DrawGetVectorGraphics(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ + +static inline void SetMagickPixelPacket(const Image *image, + const PixelPacket *color,const IndexPacket *index,MagickPixelPacket *pixel) +{ + pixel->red=(MagickRealType) GetPixelRed(color); + pixel->green=(MagickRealType) GetPixelGreen(color); + pixel->blue=(MagickRealType) GetPixelBlue(color); + if (image->matte != MagickFalse) + pixel->opacity=(MagickRealType) GetPixelOpacity(color); + if (((image->colorspace == CMYKColorspace) || + (image->storage_class == PseudoClass)) && + (index != (const IndexPacket *) NULL)) + pixel->index=(MagickRealType) GetPixelIndex(index); +} + +WandExport char *DrawGetVectorGraphics(DrawingWand *wand) +{ + char + value[MaxTextExtent], + *xml; + + MagickPixelPacket + pixel; + + ssize_t + i; + + XMLTreeInfo + *child, + *xml_info; + + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + xml_info=NewXMLTreeTag("drawing-wand"); + if (xml_info == (XMLTreeInfo *) NULL) + return((char *) NULL); + (void) SetXMLTreeContent(xml_info," "); + GetMagickPixelPacket(wand->image,&pixel); + child=AddChildToXMLTree(xml_info,"clip-path",0); + if (child != (XMLTreeInfo *) NULL) + (void) SetXMLTreeContent(child,CurrentContext->clip_mask); + child=AddChildToXMLTree(xml_info,"clip-units",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) CopyMagickString(value,CommandOptionToMnemonic( + MagickClipPathOptions,(ssize_t) CurrentContext->clip_units), + MaxTextExtent); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"decorate",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) CopyMagickString(value,CommandOptionToMnemonic( + MagickDecorateOptions,(ssize_t) CurrentContext->decorate), + MaxTextExtent); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"encoding",0); + if (child != (XMLTreeInfo *) NULL) + (void) SetXMLTreeContent(child,CurrentContext->encoding); + child=AddChildToXMLTree(xml_info,"fill",0); + if (child != (XMLTreeInfo *) NULL) + { + if (CurrentContext->fill.opacity != OpaqueOpacity) + pixel.matte=CurrentContext->fill.opacity != OpaqueOpacity ? + MagickTrue : MagickFalse; + SetMagickPixelPacket(wand->image,&CurrentContext->fill, + (const IndexPacket *) NULL,&pixel); + GetColorTuple(&pixel,MagickTrue,value); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"fill-opacity",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) FormatLocaleString(value,MaxTextExtent,"%.20g", + (double) (QuantumScale*(QuantumRange-CurrentContext->fill.opacity))); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"fill-rule",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) CopyMagickString(value,CommandOptionToMnemonic( + MagickFillRuleOptions,(ssize_t) CurrentContext->fill_rule), + MaxTextExtent); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"font",0); + if (child != (XMLTreeInfo *) NULL) + (void) SetXMLTreeContent(child,CurrentContext->font); + child=AddChildToXMLTree(xml_info,"font-family",0); + if (child != (XMLTreeInfo *) NULL) + (void) SetXMLTreeContent(child,CurrentContext->family); + child=AddChildToXMLTree(xml_info,"font-size",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) FormatLocaleString(value,MaxTextExtent,"%.20g", + CurrentContext->pointsize); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"font-stretch",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) CopyMagickString(value,CommandOptionToMnemonic( + MagickStretchOptions,(ssize_t) CurrentContext->stretch),MaxTextExtent); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"font-style",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) CopyMagickString(value,CommandOptionToMnemonic( + MagickStyleOptions,(ssize_t) CurrentContext->style),MaxTextExtent); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"font-weight",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double) + CurrentContext->weight); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"gravity",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) CopyMagickString(value,CommandOptionToMnemonic( + MagickGravityOptions,(ssize_t) CurrentContext->gravity),MaxTextExtent); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"stroke",0); + if (child != (XMLTreeInfo *) NULL) + { + if (CurrentContext->stroke.opacity != OpaqueOpacity) + pixel.matte=CurrentContext->stroke.opacity != OpaqueOpacity ? + MagickTrue : MagickFalse; + SetMagickPixelPacket(wand->image,&CurrentContext->stroke, + (const IndexPacket *) NULL,&pixel); + GetColorTuple(&pixel,MagickTrue,value); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"stroke-antialias",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) FormatLocaleString(value,MaxTextExtent,"%d", + CurrentContext->stroke_antialias != MagickFalse ? 1 : 0); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"stroke-dasharray",0); + if ((child != (XMLTreeInfo *) NULL) && + (CurrentContext->dash_pattern != (double *) NULL)) + { + char + *dash_pattern; + + dash_pattern=AcquireString((char *) NULL); + for (i=0; fabs(CurrentContext->dash_pattern[i]) >= MagickEpsilon; i++) + { + if (i != 0) + (void) ConcatenateString(&dash_pattern,","); + (void) FormatLocaleString(value,MaxTextExtent,"%.20g", + CurrentContext->dash_pattern[i]); + (void) ConcatenateString(&dash_pattern,value); + } + (void) SetXMLTreeContent(child,dash_pattern); + dash_pattern=DestroyString(dash_pattern); + } + child=AddChildToXMLTree(xml_info,"stroke-dashoffset",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) FormatLocaleString(value,MaxTextExtent,"%.20g", + CurrentContext->dash_offset); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"stroke-linecap",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) CopyMagickString(value,CommandOptionToMnemonic( + MagickLineCapOptions,(ssize_t) CurrentContext->linecap),MaxTextExtent); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"stroke-linejoin",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) CopyMagickString(value,CommandOptionToMnemonic( + MagickLineJoinOptions,(ssize_t) CurrentContext->linejoin), + MaxTextExtent); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"stroke-miterlimit",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double) + CurrentContext->miterlimit); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"stroke-opacity",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) FormatLocaleString(value,MaxTextExtent,"%.20g", + (double) (QuantumScale*(QuantumRange-CurrentContext->stroke.opacity))); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"stroke-width",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) FormatLocaleString(value,MaxTextExtent,"%.20g", + CurrentContext->stroke_width); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"text-align",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) CopyMagickString(value,CommandOptionToMnemonic(MagickAlignOptions, + (ssize_t) CurrentContext->align),MaxTextExtent); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"text-antialias",0); + if (child != (XMLTreeInfo *) NULL) + { + (void) FormatLocaleString(value,MaxTextExtent,"%d", + CurrentContext->text_antialias != MagickFalse ? 1 : 0); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"text-undercolor",0); + if (child != (XMLTreeInfo *) NULL) + { + if (CurrentContext->undercolor.opacity != OpaqueOpacity) + pixel.matte=CurrentContext->undercolor.opacity != OpaqueOpacity ? + MagickTrue : MagickFalse; + SetMagickPixelPacket(wand->image,&CurrentContext->undercolor, + (const IndexPacket *) NULL,&pixel); + GetColorTuple(&pixel,MagickTrue,value); + (void) SetXMLTreeContent(child,value); + } + child=AddChildToXMLTree(xml_info,"vector-graphics",0); + if (child != (XMLTreeInfo *) NULL) + (void) SetXMLTreeContent(child,wand->mvg); + xml=XMLTreeInfoToXML(xml_info); + xml_info=DestroyXMLTree(xml_info); + return(xml); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w G e t T e x t U n d e r C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawGetTextUnderColor() returns the color of a background rectangle +% to place under text annotations. +% +% The format of the DrawGetTextUnderColor method is: +% +% void DrawGetTextUnderColor(const DrawingWand *wand, +% PixelWand *under_color) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o under_color: Return the under color. +% +*/ +WandExport void DrawGetTextUnderColor(const DrawingWand *wand, + PixelWand *under_color) +{ + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + assert(under_color != (PixelWand *) NULL); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + PixelSetQuantumColor(under_color,&CurrentContext->undercolor); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w L i n e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawLine() draws a line on the image using the current stroke color, +% stroke opacity, and stroke width. +% +% The format of the DrawLine method is: +% +% void DrawLine(DrawingWand *wand,const double sx,const double sy, +% const double ex,const double ey) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o sx: starting x ordinate +% +% o sy: starting y ordinate +% +% o ex: ending x ordinate +% +% o ey: ending y ordinate +% +*/ +WandExport void DrawLine(DrawingWand *wand,const double sx,const double sy, + const double ex,const double ey) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"line %.20g %.20g %.20g %.20g\n",sx,sy,ex,ey); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w M a t t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawMatte() paints on the image's opacity channel in order to set effected +% pixels to transparent. +% to influence the opacity of pixels. The available paint +% methods are: +% +% PointMethod: Select the target pixel +% ReplaceMethod: Select any pixel that matches the target pixel. +% FloodfillMethod: Select the target pixel and matching neighbors. +% FillToBorderMethod: Select the target pixel and neighbors not matching +% border color. +% ResetMethod: Select all pixels. +% +% The format of the DrawMatte method is: +% +% void DrawMatte(DrawingWand *wand,const double x,const double y, +% const PaintMethod paint_method) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: x ordinate +% +% o y: y ordinate +% +% o paint_method: paint method. +% +*/ +WandExport void DrawMatte(DrawingWand *wand,const double x,const double y, + const PaintMethod paint_method) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"matte %.20g %.20g '%s'\n",x,y,CommandOptionToMnemonic( + MagickMethodOptions,(ssize_t) paint_method)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h C l o s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathClose() adds a path element to the current path which closes the +% current subpath by drawing a straight line from the current point to the +% current subpath's most recent starting point (usually, the most recent +% moveto point). +% +% The format of the DrawPathClose method is: +% +% void DrawPathClose(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport void DrawPathClose(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGAutoWrapPrintf(wand,"%s",wand->path_mode == AbsolutePathMode ? + "Z" : "z"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h C u r v e T o A b s o l u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathCurveToAbsolute() draws a cubic Bezier curve from the current +% point to (x,y) using (x1,y1) as the control point at the beginning of +% the curve and (x2,y2) as the control point at the end of the curve using +% absolute coordinates. At the end of the command, the new current point +% becomes the final (x,y) coordinate pair used in the polybezier. +% +% The format of the DrawPathCurveToAbsolute method is: +% +% void DrawPathCurveToAbsolute(DrawingWand *wand,const double x1, +% const double y1,const double x2,const double y2,const double x, +% const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x1: x ordinate of control point for curve beginning +% +% o y1: y ordinate of control point for curve beginning +% +% o x2: x ordinate of control point for curve ending +% +% o y2: y ordinate of control point for curve ending +% +% o x: x ordinate of the end of the curve +% +% o y: y ordinate of the end of the curve +% +*/ + +static void DrawPathCurveTo(DrawingWand *wand,const PathMode mode, + const double x1,const double y1,const double x2,const double y2, + const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->path_operation != PathCurveToOperation) || + (wand->path_mode != mode)) + { + wand->path_operation=PathCurveToOperation; + wand->path_mode=mode; + (void) MVGAutoWrapPrintf(wand, "%c%.20g %.20g %.20g %.20g %.20g %.20g", + mode == AbsolutePathMode ? 'C' : 'c',x1,y1,x2,y2,x,y); + } + else + (void) MVGAutoWrapPrintf(wand," %.20g %.20g %.20g %.20g %.20g %.20g",x1,y1, + x2,y2,x,y); +} + +WandExport void DrawPathCurveToAbsolute(DrawingWand *wand,const double x1, + const double y1,const double x2,const double y2,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathCurveTo(wand,AbsolutePathMode,x1,y1,x2,y2,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h C u r v e T o R e l a t i v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathCurveToRelative() draws a cubic Bezier curve from the current +% point to (x,y) using (x1,y1) as the control point at the beginning of +% the curve and (x2,y2) as the control point at the end of the curve using +% relative coordinates. At the end of the command, the new current point +% becomes the final (x,y) coordinate pair used in the polybezier. +% +% The format of the DrawPathCurveToRelative method is: +% +% void DrawPathCurveToRelative(DrawingWand *wand,const double x1, +% const double y1,const double x2,const double y2,const double x, +% const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x1: x ordinate of control point for curve beginning +% +% o y1: y ordinate of control point for curve beginning +% +% o x2: x ordinate of control point for curve ending +% +% o y2: y ordinate of control point for curve ending +% +% o x: x ordinate of the end of the curve +% +% o y: y ordinate of the end of the curve +% +*/ +WandExport void DrawPathCurveToRelative(DrawingWand *wand,const double x1, + const double y1,const double x2,const double y2,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathCurveTo(wand,RelativePathMode,x1,y1,x2,y2,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h C u r v e T o Q u a d r a t i c B e z i e r A b s o l u t e% +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathCurveToQuadraticBezierAbsolute() draws a quadratic Bezier curve +% from the current point to (x,y) using (x1,y1) as the control point using +% absolute coordinates. At the end of the command, the new current point +% becomes the final (x,y) coordinate pair used in the polybezier. +% +% The format of the DrawPathCurveToQuadraticBezierAbsolute method is: +% +% void DrawPathCurveToQuadraticBezierAbsolute(DrawingWand *wand, +% const double x1,const double y1,const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x1: x ordinate of the control point +% +% o y1: y ordinate of the control point +% +% o x: x ordinate of final point +% +% o y: y ordinate of final point +% +*/ + +static void DrawPathCurveToQuadraticBezier(DrawingWand *wand, + const PathMode mode,const double x1,double y1,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->path_operation != PathCurveToQuadraticBezierOperation) || + (wand->path_mode != mode)) + { + wand->path_operation=PathCurveToQuadraticBezierOperation; + wand->path_mode=mode; + (void) MVGAutoWrapPrintf(wand, "%c%.20g %.20g %.20g %.20g", + mode == AbsolutePathMode ? 'Q' : 'q',x1,y1,x,y); + } + else + (void) MVGAutoWrapPrintf(wand," %.20g %.20g %.20g %.20g",x1,y1,x,y); +} + +WandExport void DrawPathCurveToQuadraticBezierAbsolute(DrawingWand *wand, + const double x1,const double y1,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathCurveToQuadraticBezier(wand,AbsolutePathMode,x1,y1,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h C u r v e T o Q u a d r a t i c B e z i e r R e l a t i v e +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathCurveToQuadraticBezierRelative() draws a quadratic Bezier curve +% from the current point to (x,y) using (x1,y1) as the control point using +% relative coordinates. At the end of the command, the new current point +% becomes the final (x,y) coordinate pair used in the polybezier. +% +% The format of the DrawPathCurveToQuadraticBezierRelative method is: +% +% void DrawPathCurveToQuadraticBezierRelative(DrawingWand *wand, +% const double x1,const double y1,const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x1: x ordinate of the control point +% +% o y1: y ordinate of the control point +% +% o x: x ordinate of final point +% +% o y: y ordinate of final point +% +*/ +WandExport void DrawPathCurveToQuadraticBezierRelative(DrawingWand *wand, + const double x1,const double y1,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathCurveToQuadraticBezier(wand,RelativePathMode,x1,y1,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h C u r v e T o Q u a d r a t i c B e z i e r S m o o t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathCurveToQuadraticBezierSmoothAbsolute() draws a quadratic +% Bezier curve (using absolute coordinates) from the current point to +% (x,y). The control point is assumed to be the reflection of the +% control point on the previous command relative to the current +% point. (If there is no previous command or if the previous command was +% not a DrawPathCurveToQuadraticBezierAbsolute, +% DrawPathCurveToQuadraticBezierRelative, +% DrawPathCurveToQuadraticBezierSmoothAbsolute or +% DrawPathCurveToQuadraticBezierSmoothRelative, assume the control point +% is coincident with the current point.). At the end of the command, the +% new current point becomes the final (x,y) coordinate pair used in the +% polybezier. +% +% The format of the DrawPathCurveToQuadraticBezierSmoothAbsolute method is: +% +% void DrawPathCurveToQuadraticBezierSmoothAbsolute( +% DrawingWand *wand,const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: x ordinate of final point +% +% o y: y ordinate of final point +% +*/ + +static void DrawPathCurveToQuadraticBezierSmooth(DrawingWand *wand, + const PathMode mode,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->path_operation != PathCurveToQuadraticBezierSmoothOperation) || + (wand->path_mode != mode)) + { + wand->path_operation=PathCurveToQuadraticBezierSmoothOperation; + wand->path_mode=mode; + (void) MVGAutoWrapPrintf(wand,"%c%.20g %.20g",mode == AbsolutePathMode ? + 'T' : 't',x,y); + } + else + (void) MVGAutoWrapPrintf(wand," %.20g %.20g",x,y); +} + +WandExport void DrawPathCurveToQuadraticBezierSmoothAbsolute(DrawingWand *wand, + const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathCurveToQuadraticBezierSmooth(wand,AbsolutePathMode,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h C u r v e T o Q u a d r a t i c B e z i e r S m o o t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathCurveToQuadraticBezierSmoothRelative() draws a quadratic Bezier +% curve (using relative coordinates) from the current point to (x,y). The +% control point is assumed to be the reflection of the control point on the +% previous command relative to the current point. (If there is no previous +% command or if the previous command was not a +% DrawPathCurveToQuadraticBezierAbsolute, +% DrawPathCurveToQuadraticBezierRelative, +% DrawPathCurveToQuadraticBezierSmoothAbsolute or +% DrawPathCurveToQuadraticBezierSmoothRelative, assume the control point is +% coincident with the current point.). At the end of the command, the new +% current point becomes the final (x,y) coordinate pair used in the polybezier. +% +% The format of the DrawPathCurveToQuadraticBezierSmoothRelative method is: +% +% void DrawPathCurveToQuadraticBezierSmoothRelative(DrawingWand *wand, +% const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: x ordinate of final point +% +% o y: y ordinate of final point +% +*/ +WandExport void DrawPathCurveToQuadraticBezierSmoothRelative(DrawingWand *wand, + const double x,const double y) +{ + DrawPathCurveToQuadraticBezierSmooth(wand,RelativePathMode,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h C u r v e T o S m o o t h A b s o l u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathCurveToSmoothAbsolute() draws a cubic Bezier curve from the +% current point to (x,y) using absolute coordinates. The first control +% point is assumed to be the reflection of the second control point on +% the previous command relative to the current point. (If there is no +% previous command or if the previous command was not an +% DrawPathCurveToAbsolute, DrawPathCurveToRelative, +% DrawPathCurveToSmoothAbsolute or DrawPathCurveToSmoothRelative, assume +% the first control point is coincident with the current point.) (x2,y2) +% is the second control point (i.e., the control point at the end of the +% curve). At the end of the command, the new current point becomes the +% final (x,y) coordinate pair used in the polybezier. +% +% The format of the DrawPathCurveToSmoothAbsolute method is: +% +% void DrawPathCurveToSmoothAbsolute(DrawingWand *wand, +% const double x2,const double y2,const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x2: x ordinate of second control point +% +% o y2: y ordinate of second control point +% +% o x: x ordinate of termination point +% +% o y: y ordinate of termination point +% +*/ + +static void DrawPathCurveToSmooth(DrawingWand *wand,const PathMode mode, + const double x2,const double y2,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->path_operation != PathCurveToSmoothOperation) || + (wand->path_mode != mode)) + { + wand->path_operation=PathCurveToSmoothOperation; + wand->path_mode=mode; + (void) MVGAutoWrapPrintf(wand,"%c%.20g %.20g %.20g %.20g", + mode == AbsolutePathMode ? 'S' : 's',x2,y2,x,y); + } + else + (void) MVGAutoWrapPrintf(wand," %.20g %.20g %.20g %.20g",x2,y2,x,y); +} + +WandExport void DrawPathCurveToSmoothAbsolute(DrawingWand *wand,const double x2, + const double y2,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathCurveToSmooth(wand,AbsolutePathMode,x2,y2,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h C u r v e T o S m o o t h R e l a t i v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathCurveToSmoothRelative() draws a cubic Bezier curve from the current +% point to (x,y) using relative coordinates. The first control point is +% assumed to be the reflection of the second control point on the previous +% command relative to the current point. (If there is no previous command or +% if the previous command was not an DrawPathCurveToAbsolute, +% DrawPathCurveToRelative, DrawPathCurveToSmoothAbsolute or +% DrawPathCurveToSmoothRelative, assume the first control point is coincident +% with the current point.) (x2,y2) is the second control point (i.e., the +% control point at the end of the curve). At the end of the command, the new +% current point becomes the final (x,y) coordinate pair used in the polybezier. +% +% The format of the DrawPathCurveToSmoothRelative method is: +% +% void DrawPathCurveToSmoothRelative(DrawingWand *wand, +% const double x2,const double y2,const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x2: x ordinate of second control point +% +% o y2: y ordinate of second control point +% +% o x: x ordinate of termination point +% +% o y: y ordinate of termination point +% +*/ +WandExport void DrawPathCurveToSmoothRelative(DrawingWand *wand,const double x2, + const double y2,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathCurveToSmooth(wand,RelativePathMode,x2,y2,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h E l l i p t i c A r c A b s o l u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathEllipticArcAbsolute() draws an elliptical arc from the current point +% to (x, y) using absolute coordinates. The size and orientation of the +% ellipse are defined by two radii (rx, ry) and an xAxisRotation, which +% indicates how the ellipse as a whole is rotated relative to the current +% coordinate system. The center (cx, cy) of the ellipse is calculated +% automagically to satisfy the constraints imposed by the other parameters. +% largeArcFlag and sweepFlag contribute to the automatic calculations and help +% determine how the arc is drawn. If largeArcFlag is true then draw the larger +% of the available arcs. If sweepFlag is true, then draw the arc matching a +% clock-wise rotation. +% +% The format of the DrawPathEllipticArcAbsolute method is: +% +% void DrawPathEllipticArcAbsolute(DrawingWand *wand, +% const double rx,const double ry,const double x_axis_rotation, +% const MagickBooleanType large_arc_flag, +% const MagickBooleanType sweep_flag,const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o rx: x radius +% +% o ry: y radius +% +% o x_axis_rotation: indicates how the ellipse as a whole is rotated +% relative to the current coordinate system +% +% o large_arc_flag: If non-zero (true) then draw the larger of the +% available arcs +% +% o sweep_flag: If non-zero (true) then draw the arc matching a +% clock-wise rotation +% +% +*/ + +static void DrawPathEllipticArc(DrawingWand *wand, const PathMode mode, + const double rx,const double ry,const double x_axis_rotation, + const MagickBooleanType large_arc_flag,const MagickBooleanType sweep_flag, + const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->path_operation != PathEllipticArcOperation) || + (wand->path_mode != mode)) + { + wand->path_operation=PathEllipticArcOperation; + wand->path_mode=mode; + (void) MVGAutoWrapPrintf(wand, "%c%.20g %.20g %.20g %u %u %.20g %.20g", + mode == AbsolutePathMode ? 'A' : 'a',rx,ry,x_axis_rotation, + large_arc_flag,sweep_flag,x,y); + } + else + (void) MVGAutoWrapPrintf(wand," %.20g %.20g %.20g %u %u %.20g %.20g",rx,ry, + x_axis_rotation,large_arc_flag,sweep_flag,x,y); +} + +WandExport void DrawPathEllipticArcAbsolute(DrawingWand *wand,const double rx, + const double ry,const double x_axis_rotation, + const MagickBooleanType large_arc_flag,const MagickBooleanType sweep_flag, + const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathEllipticArc(wand,AbsolutePathMode,rx,ry,x_axis_rotation, + large_arc_flag,sweep_flag,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h E l l i p t i c A r c R e l a t i v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathEllipticArcRelative() draws an elliptical arc from the current point +% to (x, y) using relative coordinates. The size and orientation of the +% ellipse are defined by two radii (rx, ry) and an xAxisRotation, which +% indicates how the ellipse as a whole is rotated relative to the current +% coordinate system. The center (cx, cy) of the ellipse is calculated +% automagically to satisfy the constraints imposed by the other parameters. +% largeArcFlag and sweepFlag contribute to the automatic calculations and help +% determine how the arc is drawn. If largeArcFlag is true then draw the larger +% of the available arcs. If sweepFlag is true, then draw the arc matching a +% clock-wise rotation. +% +% The format of the DrawPathEllipticArcRelative method is: +% +% void DrawPathEllipticArcRelative(DrawingWand *wand, +% const double rx,const double ry,const double x_axis_rotation, +% const MagickBooleanType large_arc_flag, +% const MagickBooleanType sweep_flag,const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o rx: x radius +% +% o ry: y radius +% +% o x_axis_rotation: indicates how the ellipse as a whole is rotated +% relative to the current coordinate system +% +% o large_arc_flag: If non-zero (true) then draw the larger of the +% available arcs +% +% o sweep_flag: If non-zero (true) then draw the arc matching a +% clock-wise rotation +% +*/ +WandExport void DrawPathEllipticArcRelative(DrawingWand *wand,const double rx, + const double ry,const double x_axis_rotation, + const MagickBooleanType large_arc_flag,const MagickBooleanType sweep_flag, + const double x,const double y) +{ + DrawPathEllipticArc(wand,RelativePathMode,rx,ry,x_axis_rotation, + large_arc_flag,sweep_flag,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h F i n i s h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathFinish() terminates the current path. +% +% The format of the DrawPathFinish method is: +% +% void DrawPathFinish(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport void DrawPathFinish(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"'\n"); + wand->path_operation=PathDefaultOperation; + wand->path_mode=DefaultPathMode; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h L i n e T o A b s o l u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathLineToAbsolute() draws a line path from the current point to the +% given coordinate using absolute coordinates. The coordinate then becomes +% the new current point. +% +% The format of the DrawPathLineToAbsolute method is: +% +% void DrawPathLineToAbsolute(DrawingWand *wand,const double x, +% const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: target x ordinate +% +% o y: target y ordinate +% +*/ +static void DrawPathLineTo(DrawingWand *wand,const PathMode mode, + const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->path_operation != PathLineToOperation) || + (wand->path_mode != mode)) + { + wand->path_operation=PathLineToOperation; + wand->path_mode=mode; + (void) MVGAutoWrapPrintf(wand,"%c%.20g %.20g",mode == AbsolutePathMode ? + 'L' : 'l',x,y); + } + else + (void) MVGAutoWrapPrintf(wand," %.20g %.20g",x,y); +} + +WandExport void DrawPathLineToAbsolute(DrawingWand *wand,const double x, + const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathLineTo(wand,AbsolutePathMode,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h L i n e T o R e l a t i v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathLineToRelative() draws a line path from the current point to the +% given coordinate using relative coordinates. The coordinate then becomes +% the new current point. +% +% The format of the DrawPathLineToRelative method is: +% +% void DrawPathLineToRelative(DrawingWand *wand,const double x, +% const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: target x ordinate +% +% o y: target y ordinate +% +*/ +WandExport void DrawPathLineToRelative(DrawingWand *wand,const double x, + const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathLineTo(wand,RelativePathMode,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h L i n e T o H o r i z o n t a l A b s o l u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathLineToHorizontalAbsolute() draws a horizontal line path from the +% current point to the target point using absolute coordinates. The target +% point then becomes the new current point. +% +% The format of the DrawPathLineToHorizontalAbsolute method is: +% +% void DrawPathLineToHorizontalAbsolute(DrawingWand *wand, +% const double x) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: target x ordinate +% +*/ + +static void DrawPathLineToHorizontal(DrawingWand *wand,const PathMode mode, + const double x) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->path_operation != PathLineToHorizontalOperation) || + (wand->path_mode != mode)) + { + wand->path_operation=PathLineToHorizontalOperation; + wand->path_mode=mode; + (void) MVGAutoWrapPrintf(wand,"%c%.20g",mode == AbsolutePathMode ? + 'H' : 'h',x); + } + else + (void) MVGAutoWrapPrintf(wand," %.20g",x); +} + +WandExport void DrawPathLineToHorizontalAbsolute(DrawingWand *wand, + const double x) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathLineToHorizontal(wand,AbsolutePathMode,x); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h L i n e T o H o r i z o n t a l R e l a t i v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathLineToHorizontalRelative() draws a horizontal line path from the +% current point to the target point using relative coordinates. The target +% point then becomes the new current point. +% +% The format of the DrawPathLineToHorizontalRelative method is: +% +% void DrawPathLineToHorizontalRelative(DrawingWand *wand, +% const double x) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: target x ordinate +% +*/ +WandExport void DrawPathLineToHorizontalRelative(DrawingWand *wand, + const double x) +{ + DrawPathLineToHorizontal(wand,RelativePathMode,x); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h L i n e T o V e r t i c a l A b s o l u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathLineToVerticalAbsolute() draws a vertical line path from the +% current point to the target point using absolute coordinates. The target +% point then becomes the new current point. +% +% The format of the DrawPathLineToVerticalAbsolute method is: +% +% void DrawPathLineToVerticalAbsolute(DrawingWand *wand, +% const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o y: target y ordinate +% +*/ + +static void DrawPathLineToVertical(DrawingWand *wand,const PathMode mode, + const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->path_operation != PathLineToVerticalOperation) || + (wand->path_mode != mode)) + { + wand->path_operation=PathLineToVerticalOperation; + wand->path_mode=mode; + (void) MVGAutoWrapPrintf(wand,"%c%.20g",mode == AbsolutePathMode ? + 'V' : 'v',y); + } + else + (void) MVGAutoWrapPrintf(wand," %.20g",y); +} + +WandExport void DrawPathLineToVerticalAbsolute(DrawingWand *wand,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathLineToVertical(wand,AbsolutePathMode,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h L i n e T o V e r t i c a l R e l a t i v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathLineToVerticalRelative() draws a vertical line path from the +% current point to the target point using relative coordinates. The target +% point then becomes the new current point. +% +% The format of the DrawPathLineToVerticalRelative method is: +% +% void DrawPathLineToVerticalRelative(DrawingWand *wand, +% const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o y: target y ordinate +% +*/ +WandExport void DrawPathLineToVerticalRelative(DrawingWand *wand,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathLineToVertical(wand,RelativePathMode,y); +} +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h M o v e T o A b s o l u t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathMoveToAbsolute() starts a new sub-path at the given coordinate +% using absolute coordinates. The current point then becomes the +% specified coordinate. +% +% The format of the DrawPathMoveToAbsolute method is: +% +% void DrawPathMoveToAbsolute(DrawingWand *wand,const double x, +% const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: target x ordinate +% +% o y: target y ordinate +% +*/ + +static void DrawPathMoveTo(DrawingWand *wand,const PathMode mode,const double x, + const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->path_operation != PathMoveToOperation) || + (wand->path_mode != mode)) + { + wand->path_operation=PathMoveToOperation; + wand->path_mode=mode; + (void) MVGAutoWrapPrintf(wand,"%c%.20g %.20g",mode == AbsolutePathMode ? + 'M' : 'm',x,y); + } + else + (void) MVGAutoWrapPrintf(wand," %.20g %.20g",x,y); +} + +WandExport void DrawPathMoveToAbsolute(DrawingWand *wand,const double x, + const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathMoveTo(wand,AbsolutePathMode,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h M o v e T o R e l a t i v e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathMoveToRelative() starts a new sub-path at the given coordinate using +% relative coordinates. The current point then becomes the specified +% coordinate. +% +% The format of the DrawPathMoveToRelative method is: +% +% void DrawPathMoveToRelative(DrawingWand *wand,const double x, +% const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: target x ordinate +% +% o y: target y ordinate +% +*/ +WandExport void DrawPathMoveToRelative(DrawingWand *wand,const double x, + const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + DrawPathMoveTo(wand,RelativePathMode,x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P a t h S t a r t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPathStart() declares the start of a path drawing list which is terminated +% by a matching DrawPathFinish() command. All other DrawPath commands must +% be enclosed between a DrawPathStart() and a DrawPathFinish() command. This +% is because path drawing commands are subordinate commands and they do not +% function by themselves. +% +% The format of the DrawPathStart method is: +% +% void DrawPathStart(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport void DrawPathStart(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"path '"); + wand->path_operation=PathDefaultOperation; + wand->path_mode=DefaultPathMode; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P o i n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPoint() draws a point using the current fill color. +% +% The format of the DrawPoint method is: +% +% void DrawPoint(DrawingWand *wand,const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: target x coordinate +% +% o y: target y coordinate +% +*/ +WandExport void DrawPoint(DrawingWand *wand,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"point %.20g %.20g\n",x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P o l y g o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPolygon() draws a polygon using the current stroke, stroke width, and +% fill color or texture, using the specified array of coordinates. +% +% The format of the DrawPolygon method is: +% +% void DrawPolygon(DrawingWand *wand, +% const size_t number_coordinates,const PointInfo *coordinates) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o number_coordinates: number of coordinates +% +% o coordinates: coordinate array +% +*/ +WandExport void DrawPolygon(DrawingWand *wand, + const size_t number_coordinates,const PointInfo *coordinates) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + MVGAppendPointsCommand(wand,"polygon",number_coordinates,coordinates); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P o l y l i n e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPolyline() draws a polyline using the current stroke, stroke width, and +% fill color or texture, using the specified array of coordinates. +% +% The format of the DrawPolyline method is: +% +% void DrawPolyline(DrawingWand *wand, +% const size_t number_coordinates,const PointInfo *coordinates) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o number_coordinates: number of coordinates +% +% o coordinates: coordinate array +% +*/ +WandExport void DrawPolyline(DrawingWand *wand, + const size_t number_coordinates,const PointInfo *coordinates) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + MVGAppendPointsCommand(wand,"polyline",number_coordinates,coordinates); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P o p C l i p P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPopClipPath() terminates a clip path definition. +% +% The format of the DrawPopClipPath method is: +% +% void DrawPopClipPath(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport void DrawPopClipPath(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->indent_depth > 0) + wand->indent_depth--; + (void) MVGPrintf(wand,"pop clip-path\n"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P o p D e f s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPopDefs() terminates a definition list. +% +% The format of the DrawPopDefs method is: +% +% void DrawPopDefs(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport void DrawPopDefs(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->indent_depth > 0) + wand->indent_depth--; + (void) MVGPrintf(wand,"pop defs\n"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P o p P a t t e r n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPopPattern() terminates a pattern definition. +% +% The format of the DrawPopPattern method is: +% +% MagickBooleanType DrawPopPattern(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport MagickBooleanType DrawPopPattern(DrawingWand *wand) +{ + char + geometry[MaxTextExtent], + key[MaxTextExtent]; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->image == (Image *) NULL) + ThrowDrawException(WandError,"ContainsNoImages",wand->name); + if (wand->pattern_id == (const char *) NULL) + { + ThrowDrawException(DrawWarning,"NotCurrentlyPushingPatternDefinition", + wand->name); + return(MagickFalse); + } + (void) FormatLocaleString(key,MaxTextExtent,"%s",wand->pattern_id); + (void) SetImageArtifact(wand->image,key,wand->mvg+wand->pattern_offset); + (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.20g%+.20g%+.20g", + (double) wand->pattern_bounds.width,(double) wand->pattern_bounds.height, + (double) wand->pattern_bounds.x,(double) wand->pattern_bounds.y); + (void) SetImageArtifact(wand->image,key,geometry); + wand->pattern_id=DestroyString(wand->pattern_id); + wand->pattern_offset=0; + wand->pattern_bounds.x=0; + wand->pattern_bounds.y=0; + wand->pattern_bounds.width=0; + wand->pattern_bounds.height=0; + wand->filter_off=MagickTrue; + if (wand->indent_depth > 0) + wand->indent_depth--; + (void) MVGPrintf(wand,"pop pattern\n"); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P u s h C l i p P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPushClipPath() starts a clip path definition which is comprized of any +% number of drawing commands and terminated by a DrawPopClipPath() command. +% +% The format of the DrawPushClipPath method is: +% +% void DrawPushClipPath(DrawingWand *wand,const char *clip_mask_id) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o clip_mask_id: string identifier to associate with the clip path for +% later use. +% +*/ +WandExport void DrawPushClipPath(DrawingWand *wand,const char *clip_mask_id) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(clip_mask_id != (const char *) NULL); + (void) MVGPrintf(wand,"push clip-path \"%s\"\n",clip_mask_id); + wand->indent_depth++; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P u s h D e f s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPushDefs() indicates that commands up to a terminating DrawPopDefs() +% command create named elements (e.g. clip-paths, textures, etc.) which +% may safely be processed earlier for the sake of efficiency. +% +% The format of the DrawPushDefs method is: +% +% void DrawPushDefs(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport void DrawPushDefs(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"push defs\n"); + wand->indent_depth++; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w P u s h P a t t e r n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawPushPattern() indicates that subsequent commands up to a +% DrawPopPattern() command comprise the definition of a named pattern. +% The pattern space is assigned top left corner coordinates, a width +% and height, and becomes its own drawing space. Anything which can +% be drawn may be used in a pattern definition. +% Named patterns may be used as stroke or brush definitions. +% +% The format of the DrawPushPattern method is: +% +% MagickBooleanType DrawPushPattern(DrawingWand *wand, +% const char *pattern_id,const double x,const double y, +% const double width,const double height) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o pattern_id: pattern identification for later reference +% +% o x: x ordinate of top left corner +% +% o y: y ordinate of top left corner +% +% o width: width of pattern space +% +% o height: height of pattern space +% +*/ +WandExport MagickBooleanType DrawPushPattern(DrawingWand *wand, + const char *pattern_id,const double x,const double y,const double width, + const double height) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(pattern_id != (const char *) NULL); + if (wand->pattern_id != NULL) + { + ThrowDrawException(DrawError,"AlreadyPushingPatternDefinition", + wand->pattern_id); + return(MagickFalse); + } + wand->filter_off=MagickTrue; + (void) MVGPrintf(wand,"push pattern %s %.20g %.20g %.20g %.20g\n",pattern_id, + x,y,width,height); + wand->indent_depth++; + wand->pattern_id=AcquireString(pattern_id); + wand->pattern_bounds.x=CastDoubleToLong(ceil(x-0.5)); + wand->pattern_bounds.y=CastDoubleToLong(ceil(y-0.5)); + wand->pattern_bounds.width=(size_t) CastDoubleToLong(floor(width+0.5)); + wand->pattern_bounds.height=(size_t) CastDoubleToLong(floor(height+0.5)); + wand->pattern_offset=wand->mvg_length; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w R e c t a n g l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawRectangle() draws a rectangle given two coordinates and using the +% current stroke, stroke width, and fill settings. +% +% The format of the DrawRectangle method is: +% +% void DrawRectangle(DrawingWand *wand,const double x1, +% const double y1,const double x2,const double y2) +% +% A description of each parameter follows: +% +% o x1: x ordinate of first coordinate +% +% o y1: y ordinate of first coordinate +% +% o x2: x ordinate of second coordinate +% +% o y2: y ordinate of second coordinate +% +*/ +WandExport void DrawRectangle(DrawingWand *wand,const double x1,const double y1, + const double x2,const double y2) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((fabs(x2-x1) < MagickEpsilon) && (fabs(y2-y1) < MagickEpsilon)) + (void) MVGPrintf(wand,"point %.20g %.20g\n",x1,y1); + else + (void) MVGPrintf(wand,"rectangle %.20g %.20g %.20g %.20g\n",x1,y1,x2,y2); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ D r a w R e n d e r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawRender() renders all preceding drawing commands onto the image. +% +% The format of the DrawRender method is: +% +% MagickBooleanType DrawRender(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport MagickBooleanType DrawRender(DrawingWand *wand) +{ + MagickBooleanType + status; + + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + CurrentContext->primitive=wand->mvg; + if (wand->debug != MagickFalse) + (void) LogMagickEvent(DrawEvent,GetMagickModule(),"MVG:\n'%s'\n",wand->mvg); + if (wand->image == (Image *) NULL) + ThrowDrawException(WandError,"ContainsNoImages",wand->name); + status=DrawImage(wand->image,CurrentContext); + InheritException(wand->exception,&wand->image->exception); + CurrentContext->primitive=(char *) NULL; + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w R e s e t V e c t o r G r a p h i c s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawResetVectorGraphics() resets the vector graphics associated with the +% specified wand. +% +% The format of the DrawResetVectorGraphics method is: +% +% void DrawResetVectorGraphics(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport void DrawResetVectorGraphics(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->mvg != (char *) NULL) + wand->mvg=DestroyString(wand->mvg); + wand->mvg_alloc=0; + wand->mvg_length=0; + wand->mvg_width=0; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w R o t a t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawRotate() applies the specified rotation to the current coordinate space. +% +% The format of the DrawRotate method is: +% +% void DrawRotate(DrawingWand *wand,const double degrees) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o degrees: degrees of rotation +% +*/ +WandExport void DrawRotate(DrawingWand *wand,const double degrees) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"rotate %.20g\n",degrees); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w R o u n d R e c t a n g l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawRoundRectangle() draws a rounted rectangle given two coordinates, +% x & y corner radiuses and using the current stroke, stroke width, +% and fill settings. +% +% The format of the DrawRoundRectangle method is: +% +% void DrawRoundRectangle(DrawingWand *wand,double x1,double y1, +% double x2,double y2,double rx,double ry) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x1: x ordinate of first coordinate +% +% o y1: y ordinate of first coordinate +% +% o x2: x ordinate of second coordinate +% +% o y2: y ordinate of second coordinate +% +% o rx: radius of corner in horizontal direction +% +% o ry: radius of corner in vertical direction +% +*/ +WandExport void DrawRoundRectangle(DrawingWand *wand,double x1,double y1, + double x2,double y2,double rx,double ry) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"roundrectangle %.20g %.20g %.20g %.20g %.20g %.20g\n", + x1,y1,x2,y2,rx,ry); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S c a l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawScale() adjusts the scaling factor to apply in the horizontal and +% vertical directions to the current coordinate space. +% +% The format of the DrawScale method is: +% +% void DrawScale(DrawingWand *wand,const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: horizontal scale factor +% +% o y: vertical scale factor +% +*/ +WandExport void DrawScale(DrawingWand *wand,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"scale %.20g %.20g\n",x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t B o r d e r C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetBorderColor() sets the border color to be used for drawing bordered +% objects. +% +% The format of the DrawSetBorderColor method is: +% +% void DrawSetBorderColor(DrawingWand *wand,const PixelWand *border_wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o border_wand: border wand. +% +*/ + +static inline MagickBooleanType IsColorEqual(const PixelPacket *p, + const PixelPacket *q) +{ + if (GetPixelRed(p) != GetPixelRed(q)) + return(MagickFalse); + if (GetPixelGreen(p) != GetPixelGreen(q)) + return(MagickFalse); + if (GetPixelBlue(p) != GetPixelBlue(q)) + return(MagickFalse); + if (GetPixelOpacity(p) != GetPixelOpacity(q)) + return(MagickFalse); + return(MagickTrue); +} + +WandExport void DrawSetBorderColor(DrawingWand *wand, + const PixelWand *border_wand) +{ + PixelPacket + *current_border, + border_color, + new_border; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(border_wand != (const PixelWand *) NULL); + PixelGetQuantumColor(border_wand,&border_color); + new_border=border_color; + current_border=(&CurrentContext->border_color); + if ((wand->filter_off != MagickFalse) || + (IsColorEqual(current_border,&new_border) == MagickFalse)) + { + CurrentContext->border_color=new_border; + (void) MVGPrintf(wand,"border-color '"); + MVGAppendColor(wand,&border_color); + (void) MVGPrintf(wand,"'\n"); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t C l i p P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetClipPath() associates a named clipping path with the image. Only +% the areas drawn on by the clipping path will be modified as ssize_t as it +% remains in effect. +% +% The format of the DrawSetClipPath method is: +% +% MagickBooleanType DrawSetClipPath(DrawingWand *wand, +% const char *clip_mask) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o clip_mask: name of clipping path to associate with image +% +*/ +WandExport MagickBooleanType DrawSetClipPath(DrawingWand *wand, + const char *clip_mask) +{ + assert(wand != (DrawingWand *) NULL); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clip_mask); + assert(wand->signature == WandSignature); + assert(clip_mask != (const char *) NULL); + if ((CurrentContext->clip_mask == (const char *) NULL) || + (wand->filter_off != MagickFalse) || + (LocaleCompare(CurrentContext->clip_mask,clip_mask) != 0)) + { + (void) CloneString(&CurrentContext->clip_mask,clip_mask); +#if DRAW_BINARY_IMPLEMENTATION + if (wand->image == (Image *) NULL) + ThrowDrawException(WandError,"ContainsNoImages",wand->name); + (void) DrawClipPath(wand->image,CurrentContext,CurrentContext->clip_mask); +#endif + (void) MVGPrintf(wand,"clip-path url(#%s)\n",clip_mask); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t C l i p R u l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetClipRule() set the polygon fill rule to be used by the clipping path. +% +% The format of the DrawSetClipRule method is: +% +% void DrawSetClipRule(DrawingWand *wand,const FillRule fill_rule) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o fill_rule: fill rule (EvenOddRule or NonZeroRule) +% +*/ +WandExport void DrawSetClipRule(DrawingWand *wand,const FillRule fill_rule) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->fill_rule != fill_rule)) + { + CurrentContext->fill_rule=fill_rule; + (void) MVGPrintf(wand, "clip-rule '%s'\n",CommandOptionToMnemonic( + MagickFillRuleOptions,(ssize_t) fill_rule)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t C l i p U n i t s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetClipUnits() sets the interpretation of clip path units. +% +% The format of the DrawSetClipUnits method is: +% +% void DrawSetClipUnits(DrawingWand *wand, +% const ClipPathUnits clip_units) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o clip_units: units to use (UserSpace, UserSpaceOnUse, or +% ObjectBoundingBox) +% +*/ +WandExport void DrawSetClipUnits(DrawingWand *wand, + const ClipPathUnits clip_units) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->clip_units != clip_units)) + { + CurrentContext->clip_units=clip_units; + if (clip_units == ObjectBoundingBox) + { + AffineMatrix + affine; + + GetAffineMatrix(&affine); + affine.sx=CurrentContext->bounds.x2; + affine.sy=CurrentContext->bounds.y2; + affine.tx=CurrentContext->bounds.x1; + affine.ty=CurrentContext->bounds.y1; + AdjustAffine(wand,&affine); + } + (void) MVGPrintf(wand, "clip-units '%s'\n",CommandOptionToMnemonic( + MagickClipPathOptions,(ssize_t) clip_units)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t D e n s i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetDensity() sets the vertical and horizontal resolution. +% +% The format of the DrawSetDensity method is: +% +% MagickBooleanType DrawSetDensity(DrawingWand *wand, +% const char *density) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o density: the vertical and horizontal resolution. +% +*/ +WandExport MagickBooleanType DrawSetDensity(DrawingWand *wand, + const char *density) +{ + assert(wand != (DrawingWand *) NULL); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",density); + assert(wand->signature == MagickCoreSignature); + assert(density != (const char *) NULL); + if ((CurrentContext->density == (const char *) NULL) || + (wand->filter_off != MagickFalse) || + (LocaleCompare(CurrentContext->density,density) != 0)) + { + (void) CloneString(&CurrentContext->density,density); + (void) MVGPrintf(wand,"density '%s'\n",density); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F i l l C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFillColor() sets the fill color to be used for drawing filled objects. +% +% The format of the DrawSetFillColor method is: +% +% void DrawSetFillColor(DrawingWand *wand,const PixelWand *fill_wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o fill_wand: fill wand. +% +*/ +WandExport void DrawSetFillColor(DrawingWand *wand,const PixelWand *fill_wand) +{ + PixelPacket + *current_fill, + fill_color, + new_fill; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(fill_wand != (const PixelWand *) NULL); + PixelGetQuantumColor(fill_wand,&fill_color); + new_fill=fill_color; + current_fill=(&CurrentContext->fill); + if ((wand->filter_off != MagickFalse) || + (IsColorEqual(current_fill,&new_fill) == MagickFalse)) + { + CurrentContext->fill=new_fill; + (void) MVGPrintf(wand,"fill '"); + MVGAppendColor(wand,&fill_color); + (void) MVGPrintf(wand,"'\n"); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F i l l O p a c i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFillOpacity() sets the opacity to use when drawing using the fill +% color or fill texture. Fully opaque is 1.0. +% +% The format of the DrawSetFillOpacity method is: +% +% void DrawSetFillOpacity(DrawingWand *wand,const double fill_opacity) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o fill_opacity: fill opacity +% +*/ +WandExport void DrawSetFillOpacity(DrawingWand *wand,const double fill_opacity) +{ + Quantum + opacity; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + opacity=ClampToQuantum((double) QuantumRange*(1.0-fill_opacity)); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->fill.opacity != opacity)) + { + CurrentContext->fill.opacity=opacity; + (void) MVGPrintf(wand,"fill-opacity %.20g\n",fill_opacity); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F o n t R e s o l u t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFontResolution() sets the image resolution. +% +% The format of the DrawSetFontResolution method is: +% +% MagickBooleanType DrawSetFontResolution(DrawingWand *wand, +% const double x_resolution,const double y_resolution) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x_resolution: the image x resolution. +% +% o y_resolution: the image y resolution. +% +*/ +WandExport MagickBooleanType DrawSetFontResolution(DrawingWand *wand, + const double x_resolution,const double y_resolution) +{ + char + density[MaxTextExtent]; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) FormatLocaleString(density,MaxTextExtent,"%.20gx%.20g",x_resolution, + y_resolution); + (void) CloneString(&CurrentContext->density,density); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t O p a c i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetOpacity() sets the opacity to use when drawing using the fill or +% stroke color or texture. Fully opaque is 1.0. +% +% The format of the DrawSetOpacity method is: +% +% void DrawSetOpacity(DrawingWand *wand,const double opacity) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o opacity: fill opacity +% +*/ +WandExport void DrawSetOpacity(DrawingWand *wand,const double opacity) +{ + Quantum + quantum_opacity; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + quantum_opacity=ClampToQuantum((double) QuantumRange*(1.0-opacity)); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->opacity != quantum_opacity)) + { + CurrentContext->opacity=quantum_opacity; + (void) MVGPrintf(wand,"opacity %.20g\n",opacity); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F i l l P a t t e r n U R L % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFillPatternURL() sets the URL to use as a fill pattern for filling +% objects. Only local URLs ("#identifier") are supported at this time. These +% local URLs are normally created by defining a named fill pattern with +% DrawPushPattern/DrawPopPattern. +% +% The format of the DrawSetFillPatternURL method is: +% +% MagickBooleanType DrawSetFillPatternURL(DrawingWand *wand, +% const char *fill_url) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o fill_url: URL to use to obtain fill pattern. +% +*/ +WandExport MagickBooleanType DrawSetFillPatternURL(DrawingWand *wand, + const char *fill_url) +{ + char + pattern[MaxTextExtent], + pattern_spec[MaxTextExtent]; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",fill_url); + if (wand->image == (Image *) NULL) + ThrowDrawException(WandError,"ContainsNoImages",wand->name); + assert(fill_url != (const char *) NULL); + if (*fill_url != '#') + { + ThrowDrawException(DrawError,"NotARelativeURL",fill_url); + return(MagickFalse); + } + (void) FormatLocaleString(pattern,MaxTextExtent,"%s",fill_url+1); + if (GetImageArtifact(wand->image,pattern) == (const char *) NULL) + { + ThrowDrawException(DrawError,"URLNotFound",fill_url) + return(MagickFalse); + } + (void) FormatLocaleString(pattern_spec,MaxTextExtent,"url(%s)",fill_url); +#if DRAW_BINARY_IMPLEMENTATION + DrawPatternPath(wand->image,CurrentContext,pattern_spec, + &CurrentContext->fill_pattern); +#endif + if (CurrentContext->fill.opacity != (Quantum) TransparentOpacity) + CurrentContext->fill.opacity=CurrentContext->opacity; + (void) MVGPrintf(wand,"fill %s\n",pattern_spec); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F i l l R u l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFillRule() sets the fill rule to use while drawing polygons. +% +% The format of the DrawSetFillRule method is: +% +% void DrawSetFillRule(DrawingWand *wand,const FillRule fill_rule) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o fill_rule: fill rule (EvenOddRule or NonZeroRule) +% +*/ +WandExport void DrawSetFillRule(DrawingWand *wand,const FillRule fill_rule) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->fill_rule != fill_rule)) + { + CurrentContext->fill_rule=fill_rule; + (void) MVGPrintf(wand, "fill-rule '%s'\n",CommandOptionToMnemonic( + MagickFillRuleOptions,(ssize_t) fill_rule)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F o n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFont() sets the fully-sepecified font to use when annotating with +% text. +% +% The format of the DrawSetFont method is: +% +% MagickBooleanType DrawSetFont(DrawingWand *wand,const char *font_name) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o font_name: font name +% +*/ +WandExport MagickBooleanType DrawSetFont(DrawingWand *wand, + const char *font_name) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(font_name != (const char *) NULL); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->font == (char *) NULL) || + (LocaleCompare(CurrentContext->font,font_name) != 0)) + { + (void) CloneString(&CurrentContext->font,font_name); + (void) MVGPrintf(wand,"font '%s'\n",font_name); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F o n t F a m i l y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFontFamily() sets the font family to use when annotating with text. +% +% The format of the DrawSetFontFamily method is: +% +% MagickBooleanType DrawSetFontFamily(DrawingWand *wand, +% const char *font_family) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o font_family: font family +% +*/ +WandExport MagickBooleanType DrawSetFontFamily(DrawingWand *wand, + const char *font_family) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(font_family != (const char *) NULL); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->family == (const char *) NULL) || + (LocaleCompare(CurrentContext->family,font_family) != 0)) + { + (void) CloneString(&CurrentContext->family,font_family); + (void) MVGPrintf(wand,"font-family '%s'\n",font_family); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F o n t S i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFontSize() sets the font pointsize to use when annotating with text. +% +% The format of the DrawSetFontSize method is: +% +% void DrawSetFontSize(DrawingWand *wand,const double pointsize) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o pointsize: text pointsize +% +*/ +WandExport void DrawSetFontSize(DrawingWand *wand,const double pointsize) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (fabs(CurrentContext->pointsize-pointsize) >= MagickEpsilon)) + { + CurrentContext->pointsize=pointsize; + (void) MVGPrintf(wand,"font-size %.20g\n",pointsize); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F o n t S t r e t c h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFontStretch() sets the font stretch to use when annotating with text. +% The AnyStretch enumeration acts as a wild-card "don't care" option. +% +% The format of the DrawSetFontStretch method is: +% +% void DrawSetFontStretch(DrawingWand *wand, +% const StretchType font_stretch) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o font_stretch: font stretch (NormalStretch, UltraCondensedStretch, +% CondensedStretch, SemiCondensedStretch, +% SemiExpandedStretch, ExpandedStretch, +% ExtraExpandedStretch, UltraExpandedStretch, AnyStretch) +% +*/ +WandExport void DrawSetFontStretch(DrawingWand *wand, + const StretchType font_stretch) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->stretch != font_stretch)) + { + CurrentContext->stretch=font_stretch; + (void) MVGPrintf(wand, "font-stretch '%s'\n",CommandOptionToMnemonic( + MagickStretchOptions,(ssize_t) font_stretch)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F o n t S t y l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFontStyle() sets the font style to use when annotating with text. +% The AnyStyle enumeration acts as a wild-card "don't care" option. +% +% The format of the DrawSetFontStyle method is: +% +% void DrawSetFontStyle(DrawingWand *wand,const StyleType style) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o style: font style (NormalStyle, ItalicStyle, ObliqueStyle, AnyStyle) +% +*/ +WandExport void DrawSetFontStyle(DrawingWand *wand,const StyleType style) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->style != style)) + { + CurrentContext->style=style; + (void) MVGPrintf(wand, "font-style '%s'\n",CommandOptionToMnemonic( + MagickStyleOptions,(ssize_t) style)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t F o n t W e i g h t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetFontWeight() sets the font weight to use when annotating with text. +% +% The format of the DrawSetFontWeight method is: +% +% void DrawSetFontWeight(DrawingWand *wand, +% const size_t font_weight) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o font_weight: font weight (valid range 100-900) +% +*/ +WandExport void DrawSetFontWeight(DrawingWand *wand, + const size_t font_weight) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->weight != font_weight)) + { + CurrentContext->weight=font_weight; + (void) MVGPrintf(wand,"font-weight %.20g\n",(double) font_weight); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t G r a v i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetGravity() sets the text placement gravity to use when annotating +% with text. +% +% The format of the DrawSetGravity method is: +% +% void DrawSetGravity(DrawingWand *wand,const GravityType gravity) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o gravity: positioning gravity (NorthWestGravity, NorthGravity, +% NorthEastGravity, WestGravity, CenterGravity, +% EastGravity, SouthWestGravity, SouthGravity, +% SouthEastGravity) +% +*/ +WandExport void DrawSetGravity(DrawingWand *wand,const GravityType gravity) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->gravity != gravity) || (gravity != ForgetGravity)) + { + CurrentContext->gravity=gravity; + (void) MVGPrintf(wand,"gravity '%s'\n",CommandOptionToMnemonic( + MagickGravityOptions,(ssize_t) gravity)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokeColor() sets the color used for stroking object outlines. +% +% The format of the DrawSetStrokeColor method is: +% +% void DrawSetStrokeColor(DrawingWand *wand, +% const PixelWand *stroke_wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o stroke_wand: stroke wand. +% +*/ +WandExport void DrawSetStrokeColor(DrawingWand *wand, + const PixelWand *stroke_wand) +{ + PixelPacket + *current_stroke, + new_stroke, + stroke_color; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(stroke_wand != (const PixelWand *) NULL); + PixelGetQuantumColor(stroke_wand,&stroke_color); + new_stroke=stroke_color; + current_stroke=(&CurrentContext->stroke); + if ((wand->filter_off != MagickFalse) || + (IsColorEqual(current_stroke,&new_stroke) == MagickFalse)) + { + CurrentContext->stroke=new_stroke; + (void) MVGPrintf(wand,"stroke '"); + MVGAppendColor(wand,&stroke_color); + (void) MVGPrintf(wand,"'\n"); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e P a t t e r n U R L % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokePatternURL() sets the pattern used for stroking object outlines. +% +% The format of the DrawSetStrokePatternURL method is: +% +% MagickBooleanType DrawSetStrokePatternURL(DrawingWand *wand, +% const char *stroke_url) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o stroke_url: URL specifying pattern ID (e.g. "#pattern_id") +% +*/ +WandExport MagickBooleanType DrawSetStrokePatternURL(DrawingWand *wand, + const char *stroke_url) +{ + char + pattern[MaxTextExtent], + pattern_spec[MaxTextExtent]; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->image == (Image *) NULL) + ThrowDrawException(WandError,"ContainsNoImages",wand->name); + assert(stroke_url != NULL); + if (stroke_url[0] != '#') + ThrowDrawException(DrawError,"NotARelativeURL",stroke_url); + (void) FormatLocaleString(pattern,MaxTextExtent,"%s",stroke_url+1); + if (GetImageArtifact(wand->image,pattern) == (const char *) NULL) + { + ThrowDrawException(DrawError,"URLNotFound",stroke_url) + return(MagickFalse); + } + (void) FormatLocaleString(pattern_spec,MaxTextExtent,"url(%s)",stroke_url); +#if DRAW_BINARY_IMPLEMENTATION + DrawPatternPath(wand->image,CurrentContext,pattern_spec, + &CurrentContext->stroke_pattern); +#endif + if (CurrentContext->stroke.opacity != (Quantum) TransparentOpacity) + CurrentContext->stroke.opacity=CurrentContext->opacity; + (void) MVGPrintf(wand,"stroke %s\n",pattern_spec); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e A n t i a l i a s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokeAntialias() controls whether stroked outlines are antialiased. +% Stroked outlines are antialiased by default. When antialiasing is disabled +% stroked pixels are thresholded to determine if the stroke color or +% underlying canvas color should be used. +% +% The format of the DrawSetStrokeAntialias method is: +% +% void DrawSetStrokeAntialias(DrawingWand *wand, +% const MagickBooleanType stroke_antialias) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o stroke_antialias: set to false (zero) to disable antialiasing +% +*/ +WandExport void DrawSetStrokeAntialias(DrawingWand *wand, + const MagickBooleanType stroke_antialias) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->stroke_antialias != stroke_antialias)) + { + CurrentContext->stroke_antialias=stroke_antialias; + (void) MVGPrintf(wand,"stroke-antialias %i\n",stroke_antialias != 0 ? + 1 : 0); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e D a s h A r r a y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokeDashArray() specifies the pattern of dashes and gaps used to +% stroke paths. The stroke dash array represents an array of numbers that +% specify the lengths of alternating dashes and gaps in pixels. If an odd +% number of values is provided, then the list of values is repeated to yield +% an even number of values. To remove an existing dash array, pass a zero +% number_elements argument and null dasharray. A typical stroke dash array +% might contain the members 5 3 2. +% +% The format of the DrawSetStrokeDashArray method is: +% +% MagickBooleanType DrawSetStrokeDashArray(DrawingWand *wand, +% const size_t number_elements,const double *dasharray) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o number_elements: number of elements in dash array +% +% o dasharray: dash array values +% +*/ +WandExport MagickBooleanType DrawSetStrokeDashArray(DrawingWand *wand, + const size_t number_elements,const double *dasharray) +{ + MagickBooleanType + update; + + const double + *p; + + double + *q; + + ssize_t + i; + + size_t + n_new, + n_old; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + n_new=number_elements; + if (dasharray == (const double *) NULL) + n_new=0; + n_old=0; + update=MagickFalse; + q=CurrentContext->dash_pattern; + if (q != (const double *) NULL) + while (fabs(*q++) < MagickEpsilon) + n_old++; + if ((n_old == 0) && (n_new == 0)) + update=MagickFalse; + else + if (n_old != n_new) + update=MagickTrue; + else + if ((CurrentContext->dash_pattern != (double *) NULL) && + (dasharray != (double *) NULL)) + { + p=dasharray; + q=CurrentContext->dash_pattern; + for (i=0; i < (ssize_t) n_new; i++) + { + if (fabs((*p)-(*q)) >= MagickEpsilon) + { + update=MagickTrue; + break; + } + p++; + q++; + } + } + if ((wand->filter_off != MagickFalse) || (update != MagickFalse)) + { + if (CurrentContext->dash_pattern != (double *) NULL) + CurrentContext->dash_pattern=(double *) + RelinquishMagickMemory(CurrentContext->dash_pattern); + if (n_new != 0) + { + CurrentContext->dash_pattern=(double *) AcquireQuantumMemory((size_t) + n_new+1UL,sizeof(*CurrentContext->dash_pattern)); + if (CurrentContext->dash_pattern == (double *) NULL) + { + ThrowDrawException(ResourceLimitError,"MemoryAllocationFailed", + wand->name); + return(MagickFalse); + } + for (i=0; i < (ssize_t) n_new; i++) + { + CurrentContext->dash_pattern[i]=0.0; + if (dasharray != (double *) NULL) + CurrentContext->dash_pattern[i]=dasharray[i]; + } + CurrentContext->dash_pattern[n_new]=0.0; + } + (void) MVGPrintf(wand,"stroke-dasharray "); + if (n_new == 0) + (void) MVGPrintf(wand,"none\n"); + else + if (dasharray != (double *) NULL) + { + for (i=0; i < (ssize_t) n_new; i++) + { + if (i != 0) + (void) MVGPrintf(wand,","); + (void) MVGPrintf(wand,"%.20g",dasharray[i]); + } + (void) MVGPrintf(wand,"\n"); + } + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e D a s h O f f s e t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokeDashOffset() specifies the offset into the dash pattern to +% start the dash. +% +% The format of the DrawSetStrokeDashOffset method is: +% +% void DrawSetStrokeDashOffset(DrawingWand *wand, +% const double dash_offset) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o dash_offset: dash offset +% +*/ +WandExport void DrawSetStrokeDashOffset(DrawingWand *wand, + const double dash_offset) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (fabs(CurrentContext->dash_offset-dash_offset) >= MagickEpsilon)) + { + CurrentContext->dash_offset=dash_offset; + (void) MVGPrintf(wand,"stroke-dashoffset %.20g\n",dash_offset); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e L i n e C a p % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokeLineCap() specifies the shape to be used at the end of +% open subpaths when they are stroked. Values of LineCap are +% UndefinedCap, ButtCap, RoundCap, and SquareCap. +% +% The format of the DrawSetStrokeLineCap method is: +% +% void DrawSetStrokeLineCap(DrawingWand *wand, +% const LineCap linecap) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o linecap: linecap style +% +*/ +WandExport void DrawSetStrokeLineCap(DrawingWand *wand,const LineCap linecap) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || (CurrentContext->linecap != linecap)) + { + CurrentContext->linecap=linecap; + (void) MVGPrintf(wand,"stroke-linecap '%s'\n",CommandOptionToMnemonic( + MagickLineCapOptions,(ssize_t) linecap)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e L i n e J o i n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokeLineJoin() specifies the shape to be used at the corners of +% paths (or other vector shapes) when they are stroked. Values of LineJoin are +% UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin. +% +% The format of the DrawSetStrokeLineJoin method is: +% +% void DrawSetStrokeLineJoin(DrawingWand *wand, +% const LineJoin linejoin) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o linejoin: line join style +% +*/ +WandExport void DrawSetStrokeLineJoin(DrawingWand *wand,const LineJoin linejoin) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->linejoin != linejoin)) + { + CurrentContext->linejoin=linejoin; + (void) MVGPrintf(wand, "stroke-linejoin '%s'\n",CommandOptionToMnemonic( + MagickLineJoinOptions,(ssize_t) linejoin)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e M i t e r L i m i t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokeMiterLimit() specifies the miter limit. When two line +% segments meet at a sharp angle and miter joins have been specified for +% 'lineJoin', it is possible for the miter to extend far beyond the +% thickness of the line stroking the path. The miterLimit' imposes a +% limit on the ratio of the miter length to the 'lineWidth'. +% +% The format of the DrawSetStrokeMiterLimit method is: +% +% void DrawSetStrokeMiterLimit(DrawingWand *wand, +% const size_t miterlimit) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o miterlimit: miter limit +% +*/ +WandExport void DrawSetStrokeMiterLimit(DrawingWand *wand, + const size_t miterlimit) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (CurrentContext->miterlimit != miterlimit) + { + CurrentContext->miterlimit=miterlimit; + (void) MVGPrintf(wand,"stroke-miterlimit %.20g\n",(double) miterlimit); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e O p a c i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokeOpacity() specifies the opacity of stroked object outlines. +% +% The format of the DrawSetStrokeOpacity method is: +% +% void DrawSetStrokeOpacity(DrawingWand *wand, +% const double stroke_opacity) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o stroke_opacity: stroke opacity. The value 1.0 is opaque. +% +*/ +WandExport void DrawSetStrokeOpacity(DrawingWand *wand, + const double stroke_opacity) +{ + Quantum + opacity; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + opacity=ClampToQuantum((double) QuantumRange*(1.0-stroke_opacity)); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->stroke.opacity != opacity)) + { + CurrentContext->stroke.opacity=opacity; + (void) MVGPrintf(wand,"stroke-opacity %.20g\n",stroke_opacity); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t S t r o k e W i d t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetStrokeWidth() sets the width of the stroke used to draw object +% outlines. +% +% The format of the DrawSetStrokeWidth method is: +% +% void DrawSetStrokeWidth(DrawingWand *wand, +% const double stroke_width) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o stroke_width: stroke width +% +*/ +WandExport void DrawSetStrokeWidth(DrawingWand *wand,const double stroke_width) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (fabs(CurrentContext->stroke_width-stroke_width) >= MagickEpsilon)) + { + CurrentContext->stroke_width=stroke_width; + (void) MVGPrintf(wand,"stroke-width %.20g\n",stroke_width); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t T e x t A l i g n m e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetTextAlignment() specifies a text alignment to be applied when +% annotating with text. +% +% The format of the DrawSetTextAlignment method is: +% +% void DrawSetTextAlignment(DrawingWand *wand,const AlignType alignment) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o alignment: text alignment. One of UndefinedAlign, LeftAlign, +% CenterAlign, or RightAlign. +% +*/ +WandExport void DrawSetTextAlignment(DrawingWand *wand, + const AlignType alignment) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->align != alignment)) + { + CurrentContext->align=alignment; + (void) MVGPrintf(wand,"text-align '%s'\n",CommandOptionToMnemonic( + MagickAlignOptions,(ssize_t) alignment)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t T e x t A n t i a l i a s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetTextAntialias() controls whether text is antialiased. Text is +% antialiased by default. +% +% The format of the DrawSetTextAntialias method is: +% +% void DrawSetTextAntialias(DrawingWand *wand, +% const MagickBooleanType text_antialias) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o text_antialias: antialias boolean. Set to false (0) to disable +% antialiasing. +% +*/ +WandExport void DrawSetTextAntialias(DrawingWand *wand, + const MagickBooleanType text_antialias) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->text_antialias != text_antialias)) + { + CurrentContext->text_antialias=text_antialias; + (void) MVGPrintf(wand,"text-antialias %i\n",text_antialias != 0 ? 1 : 0); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t T e x t D e c o r a t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetTextDecoration() specifies a decoration to be applied when +% annotating with text. +% +% The format of the DrawSetTextDecoration method is: +% +% void DrawSetTextDecoration(DrawingWand *wand, +% const DecorationType decoration) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o decoration: text decoration. One of NoDecoration, UnderlineDecoration, +% OverlineDecoration, or LineThroughDecoration +% +*/ +WandExport void DrawSetTextDecoration(DrawingWand *wand, + const DecorationType decoration) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->decorate != decoration)) + { + CurrentContext->decorate=decoration; + (void) MVGPrintf(wand,"decorate '%s'\n",CommandOptionToMnemonic( + MagickDecorateOptions,(ssize_t) decoration)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t T e x t D i r e c t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetTextDirection() specifies the direction to be used when +% annotating with text. +% +% The format of the DrawSetTextDirection method is: +% +% void DrawSetTextDirection(DrawingWand *wand, +% const DirectionType direction) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o direction: text direction. One of RightToLeftDirection, +% LeftToRightDirection +% +*/ +WandExport void DrawSetTextDirection(DrawingWand *wand, + const DirectionType direction) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->direction != direction)) + { + CurrentContext->direction=direction; + (void) MVGPrintf(wand,"direction '%s'\n",CommandOptionToMnemonic( + MagickDirectionOptions,(ssize_t) direction)); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t T e x t E n c o d i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetTextEncoding() specifies the code set to use for text +% annotations. The only character encoding which may be specified +% at this time is "UTF-8" for representing Unicode as a sequence of +% bytes. Specify an empty string to set text encoding to the system's +% default. Successful text annotation using Unicode may require fonts +% designed to support Unicode. +% +% The format of the DrawSetTextEncoding method is: +% +% void DrawSetTextEncoding(DrawingWand *wand,const char *encoding) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o encoding: character string specifying text encoding +% +*/ +WandExport void DrawSetTextEncoding(DrawingWand *wand,const char *encoding) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(encoding != (char *) NULL); + if ((wand->filter_off != MagickFalse) || + (CurrentContext->encoding == (char *) NULL) || + (LocaleCompare(CurrentContext->encoding,encoding) != 0)) + { + (void) CloneString(&CurrentContext->encoding,encoding); + (void) MVGPrintf(wand,"encoding '%s'\n",encoding); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t T e x t K e r n i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetTextKerning() sets the spacing between characters in text. +% +% The format of the DrawSetTextKerning method is: +% +% void DrawSetTextKerning(DrawingWand *wand,const double kerning) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o kerning: text kerning +% +*/ +WandExport void DrawSetTextKerning(DrawingWand *wand,const double kerning) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) && + (fabs((CurrentContext->kerning-kerning)) >= MagickEpsilon)) + { + CurrentContext->kerning=kerning; + (void) MVGPrintf(wand,"kerning %lf\n",kerning); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t T e x t I n t e r l i n e S p a c i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetTextInterlineSpacing() sets the spacing between line in text. +% +% The format of the DrawSetInterlineSpacing method is: +% +% void DrawSetTextInterlineSpacing(DrawingWand *wand, +% const double interline_spacing) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o interline_spacing: text line spacing +% +*/ +WandExport void DrawSetTextInterlineSpacing(DrawingWand *wand, + const double interline_spacing) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) && + (fabs((CurrentContext->interline_spacing- + interline_spacing)) >= MagickEpsilon)) + { + CurrentContext->interline_spacing=interline_spacing; + (void) MVGPrintf(wand,"interline-spacing %lf\n",interline_spacing); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t T e x t I n t e r w o r d S p a c i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetTextInterwordSpacing() sets the spacing between words in text. +% +% The format of the DrawSetInterwordSpacing method is: +% +% void DrawSetTextInterwordSpacing(DrawingWand *wand, +% const double interword_spacing) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o interword_spacing: text word spacing +% +*/ +WandExport void DrawSetTextInterwordSpacing(DrawingWand *wand, + const double interword_spacing) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->filter_off != MagickFalse) && + (fabs((CurrentContext->interword_spacing- + interword_spacing)) >= MagickEpsilon)) + { + CurrentContext->interword_spacing=interword_spacing; + (void) MVGPrintf(wand,"interword-spacing %lf\n",interword_spacing); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t T e x t U n d e r C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetTextUnderColor() specifies the color of a background rectangle +% to place under text annotations. +% +% The format of the DrawSetTextUnderColor method is: +% +% void DrawSetTextUnderColor(DrawingWand *wand, +% const PixelWand *under_wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o under_wand: text under wand. +% +*/ +WandExport void DrawSetTextUnderColor(DrawingWand *wand, + const PixelWand *under_wand) +{ + PixelPacket + under_color; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(under_wand != (const PixelWand *) NULL); + PixelGetQuantumColor(under_wand,&under_color); + if ((wand->filter_off != MagickFalse) || + (IsColorEqual(&CurrentContext->undercolor,&under_color) == MagickFalse)) + { + CurrentContext->undercolor=under_color; + (void) MVGPrintf(wand,"text-undercolor '"); + MVGAppendColor(wand,&under_color); + (void) MVGPrintf(wand,"'\n"); + } +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t V e c t o r G r a p h i c s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetVectorGraphics() sets the vector graphics associated with the +% specified wand. Use this method with DrawGetVectorGraphics() as a method +% to persist the vector graphics state. +% +% The format of the DrawSetVectorGraphics method is: +% +% MagickBooleanType DrawSetVectorGraphics(DrawingWand *wand, +% const char *xml) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o xml: the drawing wand XML. +% +*/ + +static inline MagickBooleanType IsPoint(const char *point) +{ + char + *p; + + long + value; + + value=strtol(point,&p,10); + (void) value; + return(p != point ? MagickTrue : MagickFalse); +} + +WandExport MagickBooleanType DrawSetVectorGraphics(DrawingWand *wand, + const char *xml) +{ + const char + *value; + + XMLTreeInfo + *child, + *xml_info; + + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + CurrentContext=DestroyDrawInfo(CurrentContext); + CurrentContext=CloneDrawInfo((ImageInfo *) NULL,(DrawInfo *) NULL); + if (xml == (const char *) NULL) + return(MagickFalse); + xml_info=NewXMLTree(xml,wand->exception); + if (xml_info == (XMLTreeInfo *) NULL) + return(MagickFalse); + child=GetXMLTreeChild(xml_info,"clip-path"); + if (child != (XMLTreeInfo *) NULL) + (void) CloneString(&CurrentContext->clip_mask,GetXMLTreeContent(child)); + child=GetXMLTreeChild(xml_info,"clip-units"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->clip_units=(ClipPathUnits) ParseCommandOption( + MagickClipPathOptions,MagickFalse,value); + } + child=GetXMLTreeChild(xml_info,"decorate"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->decorate=(DecorationType) ParseCommandOption( + MagickDecorateOptions,MagickFalse,value); + } + child=GetXMLTreeChild(xml_info,"encoding"); + if (child != (XMLTreeInfo *) NULL) + (void) CloneString(&CurrentContext->encoding,GetXMLTreeContent(child)); + child=GetXMLTreeChild(xml_info,"fill"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + (void) QueryColorDatabase(value,&CurrentContext->fill,wand->exception); + } + child=GetXMLTreeChild(xml_info,"fill-opacity"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->fill.opacity=ClampToQuantum((MagickRealType) + QuantumRange*(1.0-StringToDouble(value,(char **) NULL))); + } + child=GetXMLTreeChild(xml_info,"fill-rule"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->fill_rule=(FillRule) ParseCommandOption( + MagickFillRuleOptions,MagickFalse,value); + } + child=GetXMLTreeChild(xml_info,"font"); + if (child != (XMLTreeInfo *) NULL) + (void) CloneString(&CurrentContext->font,GetXMLTreeContent(child)); + child=GetXMLTreeChild(xml_info,"font-family"); + if (child != (XMLTreeInfo *) NULL) + (void) CloneString(&CurrentContext->family,GetXMLTreeContent(child)); + child=GetXMLTreeChild(xml_info,"font-size"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->pointsize=StringToDouble(value,(char **) NULL); + } + child=GetXMLTreeChild(xml_info,"font-stretch"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->stretch=(StretchType) ParseCommandOption( + MagickStretchOptions,MagickFalse,value); + } + child=GetXMLTreeChild(xml_info,"font-style"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->style=(StyleType) ParseCommandOption(MagickStyleOptions, + MagickFalse,value); + } + child=GetXMLTreeChild(xml_info,"font-weight"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->weight=StringToUnsignedLong(value); + } + child=GetXMLTreeChild(xml_info,"gravity"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->gravity=(GravityType) ParseCommandOption( + MagickGravityOptions,MagickFalse,value); + } + child=GetXMLTreeChild(xml_info,"stroke"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + (void) QueryColorDatabase(value,&CurrentContext->stroke, + wand->exception); + } + child=GetXMLTreeChild(xml_info,"stroke-antialias"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->stroke_antialias=StringToLong(value) != 0 ? MagickTrue : + MagickFalse; + } + child=GetXMLTreeChild(xml_info,"stroke-dasharray"); + if (child != (XMLTreeInfo *) NULL) + { + char + token[MaxTextExtent]; + + const char + *q; + + ssize_t + x; + + ssize_t + j; + + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + { + if (CurrentContext->dash_pattern != (double *) NULL) + CurrentContext->dash_pattern=(double *) RelinquishMagickMemory( + CurrentContext->dash_pattern); + q=(char *) value; + if (IsPoint(q) != MagickFalse) + { + const char + *p; + + p=q; + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + for (x=0; IsPoint(token) != MagickFalse; x++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + } + CurrentContext->dash_pattern=(double *) AcquireQuantumMemory( + (size_t) (2UL*x)+1UL,sizeof(*CurrentContext->dash_pattern)); + if (CurrentContext->dash_pattern == (double *) NULL) + ThrowWandFatalException(ResourceLimitFatalError, + "MemoryAllocationFailed",wand->name); + for (j=0; j < x; j++) + { + (void) GetNextToken(q,&q,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(q,&q,MaxTextExtent,token); + CurrentContext->dash_pattern[j]=StringToDouble(token, + (char **) NULL); + } + if ((x & 0x01) != 0) + for ( ; j < (2*x); j++) + CurrentContext->dash_pattern[j]= + CurrentContext->dash_pattern[j-x]; + CurrentContext->dash_pattern[j]=0.0; + } + } + } + child=GetXMLTreeChild(xml_info,"stroke-dashoffset"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->dash_offset=StringToDouble(value,(char **) NULL); + } + child=GetXMLTreeChild(xml_info,"stroke-linecap"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->linecap=(LineCap) ParseCommandOption( + MagickLineCapOptions,MagickFalse,value); + } + child=GetXMLTreeChild(xml_info,"stroke-linejoin"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->linejoin=(LineJoin) ParseCommandOption( + MagickLineJoinOptions,MagickFalse,value); + } + child=GetXMLTreeChild(xml_info,"stroke-miterlimit"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->miterlimit=StringToUnsignedLong(value); + } + child=GetXMLTreeChild(xml_info,"stroke-opacity"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->stroke.opacity=ClampToQuantum((MagickRealType) + QuantumRange*(1.0-StringToDouble(value,(char **) NULL))); + } + child=GetXMLTreeChild(xml_info,"stroke-width"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + { + ssize_t + weight; + + weight=ParseCommandOption(MagickWeightOptions,MagickFalse,value); + if (weight == -1) + weight=(ssize_t) StringToUnsignedLong(value); + CurrentContext->stroke_width=(double) weight; + } + } + child=GetXMLTreeChild(xml_info,"text-align"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->align=(AlignType) ParseCommandOption(MagickAlignOptions, + MagickFalse,value); + } + child=GetXMLTreeChild(xml_info,"text-antialias"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + CurrentContext->text_antialias=StringToLong(value) != 0 ? MagickTrue : + MagickFalse; + } + child=GetXMLTreeChild(xml_info,"text-undercolor"); + if (child != (XMLTreeInfo *) NULL) + { + value=GetXMLTreeContent(child); + if (value != (const char *) NULL) + (void) QueryColorDatabase(value,&CurrentContext->undercolor, + wand->exception); + } + child=GetXMLTreeChild(xml_info,"vector-graphics"); + if (child != (XMLTreeInfo *) NULL) + { + (void) CloneString(&wand->mvg,GetXMLTreeContent(child)); + wand->mvg_length=strlen(wand->mvg); + wand->mvg_alloc=wand->mvg_length+1; + } + xml_info=DestroyXMLTree(xml_info); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S k e w X % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSkewX() skews the current coordinate system in the horizontal +% direction. +% +% The format of the DrawSkewX method is: +% +% void DrawSkewX(DrawingWand *wand,const double degrees) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o degrees: number of degrees to skew the coordinates +% +*/ +WandExport void DrawSkewX(DrawingWand *wand,const double degrees) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"skewX %.20g\n",degrees); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S k e w Y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSkewY() skews the current coordinate system in the vertical +% direction. +% +% The format of the DrawSkewY method is: +% +% void DrawSkewY(DrawingWand *wand,const double degrees) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o degrees: number of degrees to skew the coordinates +% +*/ +WandExport void DrawSkewY(DrawingWand *wand,const double degrees) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"skewY %.20g\n",degrees); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w T r a n s l a t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawTranslate() applies a translation to the current coordinate +% system which moves the coordinate system origin to the specified +% coordinate. +% +% The format of the DrawTranslate method is: +% +% void DrawTranslate(DrawingWand *wand,const double x, +% const double y) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x: new x ordinate for coordinate system origin +% +% o y: new y ordinate for coordinate system origin +% +*/ +WandExport void DrawTranslate(DrawingWand *wand,const double x,const double y) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"translate %.20g %.20g\n",x,y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D r a w S e t V i e w b o x % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DrawSetViewbox() sets the overall canvas size to be recorded with the +% drawing vector data. Usually this will be specified using the same +% size as the canvas image. When the vector data is saved to SVG or MVG +% formats, the viewbox is use to specify the size of the canvas image that +% a viewer will render the vector data on. +% +% The format of the DrawSetViewbox method is: +% +% void DrawSetViewbox(DrawingWand *wand,ssize_t x1,ssize_t y1, +% ssize_t x2,ssize_t y2) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +% o x1: left x ordinate +% +% o y1: top y ordinate +% +% o x2: right x ordinate +% +% o y2: bottom y ordinate +% +*/ +WandExport void DrawSetViewbox(DrawingWand *wand,ssize_t x1,ssize_t y1, + ssize_t x2,ssize_t y2) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) MVGPrintf(wand,"viewbox %.20g %.20g %.20g %.20g\n",(double) x1, + (double) y1,(double) x2,(double) y2); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s D r a w i n g W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsDrawingWand() returns MagickTrue if the wand is verified as a drawing wand. +% +% The format of the IsDrawingWand method is: +% +% MagickBooleanType IsDrawingWand(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport MagickBooleanType IsDrawingWand(const DrawingWand *wand) +{ + if (wand == (const DrawingWand *) NULL) + return(MagickFalse); + if (wand->signature != WandSignature) + return(MagickFalse); + if (LocaleNCompare(wand->name,DrawingWandId,strlen(DrawingWandId)) != 0) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w D r a w i n g W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewDrawingWand() returns a drawing wand required for all other methods in +% the API. +% +% The format of the NewDrawingWand method is: +% +% DrawingWand *NewDrawingWand(void) +% +*/ +WandExport DrawingWand *NewDrawingWand(void) +{ + const char + *quantum; + + DrawingWand + *wand; + + size_t + depth; + + quantum=GetMagickQuantumDepth(&depth); + if (depth != MAGICKCORE_QUANTUM_DEPTH) + ThrowWandFatalException(WandError,"QuantumDepthMismatch",quantum); + wand=(DrawingWand *) AcquireMagickMemory(sizeof(*wand)); + if (wand == (DrawingWand *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + (void) memset(wand,0,sizeof(*wand)); + wand->id=AcquireWandId(); + (void) FormatLocaleString(wand->name,MaxTextExtent,"%s-%.20g",DrawingWandId, + (double) wand->id); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->mvg=(char *) NULL; + wand->mvg_alloc=0; + wand->mvg_length=0; + wand->mvg_width=0; + wand->pattern_id=(char *) NULL; + wand->pattern_offset=0; + wand->pattern_bounds.x=0; + wand->pattern_bounds.y=0; + wand->pattern_bounds.width=0; + wand->pattern_bounds.height=0; + wand->index=0; + wand->graphic_context=(DrawInfo **) AcquireMagickMemory(sizeof( + *wand->graphic_context)); + if (wand->graphic_context == (DrawInfo **) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + wand->filter_off=MagickTrue; + wand->indent_depth=0; + wand->path_operation=PathDefaultOperation; + wand->path_mode=DefaultPathMode; + wand->image=AcquireImage((const ImageInfo *) NULL); + wand->exception=AcquireExceptionInfo(); + wand->destroy=MagickTrue; + wand->debug=IsEventLogging(); + wand->signature=WandSignature; + CurrentContext=CloneDrawInfo((ImageInfo *) NULL,(DrawInfo *) NULL); + return(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P e e k D r a w i n g W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PeekDrawingWand() returns the current drawing wand. +% +% The format of the PeekDrawingWand method is: +% +% DrawInfo *PeekDrawingWand(const DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport DrawInfo *PeekDrawingWand(const DrawingWand *wand) +{ + DrawInfo + *draw_info; + + assert(wand != (const DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + draw_info=CloneDrawInfo((ImageInfo *) NULL,CurrentContext); + (void) CloneString(&draw_info->primitive,wand->mvg); + return(draw_info); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P o p D r a w i n g W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PopDrawingWand() destroys the current drawing wand and returns to the +% previously pushed drawing wand. Multiple drawing wands may exist. It is an +% error to attempt to pop more drawing wands than have been pushed, and it is +% proper form to pop all drawing wands which have been pushed. +% +% The format of the PopDrawingWand method is: +% +% MagickBooleanType PopDrawingWand(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport MagickBooleanType PopDrawingWand(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->index == 0) + { + ThrowDrawException(DrawError,"UnbalancedGraphicContextPushPop",wand->name) + return(MagickFalse); + } + /* + Destroy clip path if not same in preceding wand. + */ +#if DRAW_BINARY_IMPLEMENTATION + if (wand->image == (Image *) NULL) + ThrowDrawException(WandError,"ContainsNoImages",wand->name); + if (CurrentContext->clip_mask != (char *) NULL) + if (LocaleCompare(CurrentContext->clip_mask, + wand->graphic_context[wand->index-1]->clip_mask) != 0) + (void) SetImageClippingMask(wand->image,(Image *) NULL); +#endif + CurrentContext=DestroyDrawInfo(CurrentContext); + wand->index--; + if (wand->indent_depth > 0) + wand->indent_depth--; + (void) MVGPrintf(wand,"pop graphic-context\n"); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P u s h D r a w i n g W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PushDrawingWand() clones the current drawing wand to create a new drawing +% wand. The original drawing wand(s) may be returned to by invoking +% PopDrawingWand(). The drawing wands are stored on a drawing wand stack. +% For every Pop there must have already been an equivalent Push. +% +% The format of the PushDrawingWand method is: +% +% MagickBooleanType PushDrawingWand(DrawingWand *wand) +% +% A description of each parameter follows: +% +% o wand: the drawing wand. +% +*/ +WandExport MagickBooleanType PushDrawingWand(DrawingWand *wand) +{ + assert(wand != (DrawingWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->index++; + wand->graphic_context=(DrawInfo **) ResizeQuantumMemory(wand->graphic_context, + (size_t) wand->index+1UL,sizeof(*wand->graphic_context)); + if (wand->graphic_context == (DrawInfo **) NULL) + { + wand->index--; + ThrowDrawException(ResourceLimitError,"MemoryAllocationFailed", + wand->name); + return(MagickFalse); + } + CurrentContext=CloneDrawInfo((ImageInfo *) NULL, + wand->graphic_context[wand->index-1]); + (void) MVGPrintf(wand,"push graphic-context\n"); + wand->indent_depth++; + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/wand/drawing-wand.h b/ImageMagick-6.9.12-44/wand/drawing-wand.h new file mode 100644 index 0000000..4a86191 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/drawing-wand.h @@ -0,0 +1,224 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand drawing wand methods. +*/ +#ifndef MAGICKWAND_DRAWING_WAND_H +#define MAGICKWAND_DRAWING_WAND_H + +#include "wand/pixel-wand.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct _DrawingWand + DrawingWand; + +extern WandExport AlignType + DrawGetTextAlignment(const DrawingWand *); + +extern WandExport char + *DrawGetClipPath(const DrawingWand *), + *DrawGetDensity(const DrawingWand *), + *DrawGetException(const DrawingWand *,ExceptionType *), + *DrawGetFont(const DrawingWand *), + *DrawGetFontFamily(const DrawingWand *), + *DrawGetTextEncoding(const DrawingWand *), + *DrawGetVectorGraphics(DrawingWand *); + +extern WandExport ClipPathUnits + DrawGetClipUnits(const DrawingWand *) magick_attribute((__pure__)); + +extern WandExport DecorationType + DrawGetTextDecoration(const DrawingWand *) magick_attribute((__pure__)); + +extern WandExport DirectionType + DrawGetTextDirection(const DrawingWand *); + +extern WandExport double + DrawGetFillOpacity(const DrawingWand *) magick_attribute((__pure__)), + DrawGetFontSize(const DrawingWand *) magick_attribute((__pure__)), + DrawGetOpacity(const DrawingWand *) magick_attribute((__pure__)), + *DrawGetStrokeDashArray(const DrawingWand *,size_t *), + DrawGetStrokeDashOffset(const DrawingWand *) magick_attribute((__pure__)), + DrawGetStrokeOpacity(const DrawingWand *) magick_attribute((__pure__)), + DrawGetStrokeWidth(const DrawingWand *) magick_attribute((__pure__)), + DrawGetTextKerning(DrawingWand *) magick_attribute((__pure__)), + DrawGetTextInterlineSpacing(DrawingWand *) magick_attribute((__pure__)), + DrawGetTextInterwordSpacing(DrawingWand *) magick_attribute((__pure__)); + +extern WandExport DrawInfo + *PeekDrawingWand(const DrawingWand *); + +extern WandExport DrawingWand + *AcquireDrawingWand(const DrawInfo *,Image *), + *CloneDrawingWand(const DrawingWand *), + *DestroyDrawingWand(DrawingWand *), + *NewDrawingWand(void); + +extern WandExport ExceptionType + DrawGetExceptionType(const DrawingWand *); + +extern WandExport FillRule + DrawGetClipRule(const DrawingWand *) magick_attribute((__pure__)), + DrawGetFillRule(const DrawingWand *) magick_attribute((__pure__)); + +extern WandExport GravityType + DrawGetGravity(const DrawingWand *) magick_attribute((__pure__)); + +extern WandExport LineCap + DrawGetStrokeLineCap(const DrawingWand *) magick_attribute((__pure__)); + +extern WandExport LineJoin + DrawGetStrokeLineJoin(const DrawingWand *) magick_attribute((__pure__)); + +extern WandExport MagickBooleanType + DrawClearException(DrawingWand *), + DrawComposite(DrawingWand *,const CompositeOperator,const double,const double, + const double,const double,MagickWand *), + DrawGetFontResolution(const DrawingWand *,double *,double *), + DrawGetStrokeAntialias(const DrawingWand *) magick_attribute((__pure__)), + DrawGetTextAntialias(const DrawingWand *) magick_attribute((__pure__)), + DrawPopPattern(DrawingWand *), + DrawPushPattern(DrawingWand *,const char *,const double,const double, + const double,const double), + DrawRender(DrawingWand *), + DrawSetClipPath(DrawingWand *,const char *), + DrawSetDensity(DrawingWand *,const char *), + DrawSetFillPatternURL(DrawingWand *,const char *), + DrawSetFont(DrawingWand *,const char *), + DrawSetFontFamily(DrawingWand *,const char *), + DrawSetFontResolution(DrawingWand *,const double,const double), + DrawSetStrokeDashArray(DrawingWand *,const size_t,const double *), + DrawSetStrokePatternURL(DrawingWand *,const char *), + DrawSetVectorGraphics(DrawingWand *,const char *), + IsDrawingWand(const DrawingWand *), + PopDrawingWand(DrawingWand *), + PushDrawingWand(DrawingWand *); + +extern WandExport StretchType + DrawGetFontStretch(const DrawingWand *); + +extern WandExport StyleType + DrawGetFontStyle(const DrawingWand *); + +extern WandExport size_t + DrawGetFontWeight(const DrawingWand *) magick_attribute((__pure__)), + DrawGetStrokeMiterLimit(const DrawingWand *) magick_attribute((__pure__)); + +extern WandExport void + ClearDrawingWand(DrawingWand *), + DrawAffine(DrawingWand *,const AffineMatrix *), + DrawAnnotation(DrawingWand *,const double,const double,const unsigned char *), + DrawArc(DrawingWand *,const double,const double,const double,const double, + const double,const double), + DrawBezier(DrawingWand *,const size_t,const PointInfo *), + DrawGetBorderColor(const DrawingWand *,PixelWand *), + DrawCircle(DrawingWand *,const double,const double,const double,const double), + DrawColor(DrawingWand *,const double,const double,const PaintMethod), + DrawComment(DrawingWand *,const char *), + DrawEllipse(DrawingWand *,const double,const double,const double,const double, + const double,const double), + DrawGetFillColor(const DrawingWand *,PixelWand *), + DrawGetStrokeColor(const DrawingWand *,PixelWand *), + DrawSetTextKerning(DrawingWand *,const double), + DrawSetTextInterlineSpacing(DrawingWand *,const double), + DrawSetTextInterwordSpacing(DrawingWand *,const double), + DrawGetTextUnderColor(const DrawingWand *,PixelWand *), + DrawLine(DrawingWand *,const double, const double,const double,const double), + DrawMatte(DrawingWand *,const double,const double,const PaintMethod), + DrawPathClose(DrawingWand *), + DrawPathCurveToAbsolute(DrawingWand *,const double,const double,const double, + const double,const double,const double), + DrawPathCurveToRelative(DrawingWand *,const double,const double,const double, + const double,const double, const double), + DrawPathCurveToQuadraticBezierAbsolute(DrawingWand *,const double, + const double,const double,const double), + DrawPathCurveToQuadraticBezierRelative(DrawingWand *,const double, + const double,const double,const double), + DrawPathCurveToQuadraticBezierSmoothAbsolute(DrawingWand *,const double, + const double), + DrawPathCurveToQuadraticBezierSmoothRelative(DrawingWand *,const double, + const double), + DrawPathCurveToSmoothAbsolute(DrawingWand *,const double,const double, + const double,const double), + DrawPathCurveToSmoothRelative(DrawingWand *,const double,const double, + const double,const double), + DrawPathEllipticArcAbsolute(DrawingWand *,const double,const double, + const double,const MagickBooleanType,const MagickBooleanType,const double, + const double), + DrawPathEllipticArcRelative(DrawingWand *,const double,const double, + const double,const MagickBooleanType,const MagickBooleanType,const double, + const double), + DrawPathFinish(DrawingWand *), + DrawPathLineToAbsolute(DrawingWand *,const double,const double), + DrawPathLineToRelative(DrawingWand *,const double,const double), + DrawPathLineToHorizontalAbsolute(DrawingWand *,const double), + DrawPathLineToHorizontalRelative(DrawingWand *,const double), + DrawPathLineToVerticalAbsolute(DrawingWand *,const double), + DrawPathLineToVerticalRelative(DrawingWand *,const double), + DrawPathMoveToAbsolute(DrawingWand *,const double,const double), + DrawPathMoveToRelative(DrawingWand *,const double,const double), + DrawPathStart(DrawingWand *), + DrawPoint(DrawingWand *,const double,const double), + DrawPolygon(DrawingWand *,const size_t,const PointInfo *), + DrawPolyline(DrawingWand *,const size_t,const PointInfo *), + DrawPopClipPath(DrawingWand *), + DrawPopDefs(DrawingWand *), + DrawPushClipPath(DrawingWand *,const char *), + DrawPushDefs(DrawingWand *), + DrawRectangle(DrawingWand *,const double,const double,const double, + const double), + DrawResetVectorGraphics(DrawingWand *), + DrawRotate(DrawingWand *,const double), + DrawRoundRectangle(DrawingWand *,double,double,double,double,double,double), + DrawScale(DrawingWand *,const double,const double), + DrawSetBorderColor(DrawingWand *,const PixelWand *), + DrawSetClipRule(DrawingWand *,const FillRule), + DrawSetClipUnits(DrawingWand *,const ClipPathUnits), + DrawSetFillColor(DrawingWand *,const PixelWand *), + DrawSetFillOpacity(DrawingWand *,const double), + DrawSetFillRule(DrawingWand *,const FillRule), + DrawSetFontSize(DrawingWand *,const double), + DrawSetFontStretch(DrawingWand *,const StretchType), + DrawSetFontStyle(DrawingWand *,const StyleType), + DrawSetFontWeight(DrawingWand *,const size_t), + DrawSetGravity(DrawingWand *,const GravityType), + DrawSetOpacity(DrawingWand *,const double), + DrawSetStrokeAntialias(DrawingWand *,const MagickBooleanType), + DrawSetStrokeColor(DrawingWand *,const PixelWand *), + DrawSetStrokeDashOffset(DrawingWand *,const double dashoffset), + DrawSetStrokeLineCap(DrawingWand *,const LineCap), + DrawSetStrokeLineJoin(DrawingWand *,const LineJoin), + DrawSetStrokeMiterLimit(DrawingWand *,const size_t), + DrawSetStrokeOpacity(DrawingWand *, const double), + DrawSetStrokeWidth(DrawingWand *,const double), + DrawSetTextAlignment(DrawingWand *,const AlignType), + DrawSetTextAntialias(DrawingWand *,const MagickBooleanType), + DrawSetTextDecoration(DrawingWand *,const DecorationType), + DrawSetTextDirection(DrawingWand *,const DirectionType), + DrawSetTextEncoding(DrawingWand *,const char *), + DrawSetTextUnderColor(DrawingWand *,const PixelWand *), + DrawSetViewbox(DrawingWand *,ssize_t,ssize_t,ssize_t,ssize_t), + DrawSkewX(DrawingWand *,const double), + DrawSkewY(DrawingWand *,const double), + DrawTranslate(DrawingWand *,const double,const double); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/identify.c b/ImageMagick-6.9.12-44/wand/identify.c new file mode 100644 index 0000000..240dfa2 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/identify.c @@ -0,0 +1,919 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% IIIII DDDD EEEEE N N TTTTT IIIII FFFFF Y Y % +% I D D E NN N T I F Y Y % +% I D D EEE N N N T I FFF Y % +% I D D E N NN T I F Y % +% IIIII DDDD EEEEE N N T IIIII F Y % +% % +% % +% Identify an Image Format and Characteristics. % +% % +% Software Design % +% Cristy % +% September 1994 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% The identify program describes the format and characteristics of one or more +% image files. It also reports if an image is incomplete or corrupt. The +% information returned includes the image number, the file name, the width and +% height of the image, whether the image is colormapped or not, the number of +% colors in the image, the number of bytes in the image, the format of the +% image (JPEG, PNM, etc.), and finally the number of seconds it took to read +% and process the image. Many more attributes are available with the verbose +% option. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/mogrify-private.h" +#include "magick/string-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ I d e n t i f y I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IdentifyImageCommand() describes the format and characteristics of one or +% more image files. It will also report if an image is incomplete or corrupt. +% The information displayed includes the scene number, the file name, the +% width and height of the image, whether the image is colormapped or not, +% the number of colors in the image, the number of bytes in the image, the +% format of the image (JPEG, PNM, etc.), and finally the number of seconds +% it took to read and process the image. +% +% The format of the IdentifyImageCommand method is: +% +% MagickBooleanType IdentifyImageCommand(ImageInfo *image_info,int argc, +% char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType IdentifyUsage(void) +{ + static const char + miscellaneous[] = + " -debug events display copious debugging information\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information\n" + " -version print version information", + operators[] = + " -auto-orient automagically orient (rotate) image\n" + " -grayscale method convert image to grayscale\n" + " -negate replace every pixel with its complementary color", + settings[] = + " -alpha option on, activate, off, deactivate, set, opaque, copy\n" + " transparent, extract, background, or shape\n" + " -antialias remove pixel-aliasing\n" + " -authenticate password\n" + " decipher image with this password\n" + " -channel type apply option to select image channels\n" + " -clip clip along the first path from the 8BIM profile\n" + " -clip-mask filename associate a clip mask with the image\n" + " -clip-path id clip along a named path from the 8BIM profile\n" + " -colorspace type alternate image colorspace\n" + " -crop geometry cut out a rectangular region of the image\n" + " -define format:option\n" + " define one or more image format options\n" + " -density geometry horizontal and vertical density of the image\n" + " -depth value image depth\n" + " -endian type endianness (MSB or LSB) of the image\n" + " -extract geometry extract area from image\n" + " -features distance analyze image features (e.g. contrast, correlation)\n" + " -format \"string\" output formatted image characteristics\n" + " -fuzz distance colors within this distance are considered equal\n" + " -gamma value of gamma correction\n" + " -interlace type type of image interlacing scheme\n" + " -interpolate method pixel color interpolation method\n" + " -limit type value pixel cache resource limit\n" + " -list type Color, Configure, Delegate, Format, Magic, Module,\n" + " Resource, or Type\n" + " -mask filename associate a mask with the image\n" + " -matte store matte channel if the image has one\n" + " -moments report image moments\n" + " -format \"string\" output formatted image characteristics\n" + " -monitor monitor progress\n" + " -ping efficiently determine image attributes\n" + " -precision value maximum number of significant digits to print\n" + " -quiet suppress all warning messages\n" + " -regard-warnings pay attention to warning messages\n" + " -respect-parentheses settings remain in effect until parenthesis boundary\n" + " -sampling-factor geometry\n" + " horizontal and vertical sampling factor\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -set attribute value set an image attribute\n" + " -size geometry width and height of image\n" + " -strip strip image of all profiles and comments\n" + " -unique display the number of unique colors in the image\n" + " -units type the units of image resolution\n" + " -verbose print detailed information about the image\n" + " -virtual-pixel method\n" + " virtual pixel access method"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] file [ [options ...] " + "file ... ]\n",GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nImage Operators:\n"); + (void) puts(operators); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf( + "\nBy default, the image format of `file' is determined by its magic\n"); + (void) printf( + "number. To specify a particular image format, precede the filename\n"); + (void) printf( + "with an image format name and a colon (i.e. ps:image) or specify the\n"); + (void) printf( + "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); + (void) printf("'-' for standard input or output.\n"); + return(MagickTrue); +} + +WandExport MagickBooleanType IdentifyImageCommand(ImageInfo *image_info, + int argc,char **argv,char **metadata,ExceptionInfo *exception) +{ +#define DestroyIdentify() \ +{ \ + DestroyImageStack(); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowIdentifyException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option); \ + DestroyIdentify(); \ + return(MagickFalse); \ +} +#define ThrowIdentifyInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",option,argument); \ + DestroyIdentify(); \ + return(MagickFalse); \ +} + + const char + *format, + *option; + + Image + *image; + + ImageStack + image_stack[MaxImageStackDepth+1]; + + MagickBooleanType + fire, + pend, + respect_parenthesis; + + MagickStatusType + status; + + ssize_t + i; + + size_t + count; + + ssize_t + j, + k; + + /* + Set defaults. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + if (argc == 2) + { + option=argv[1]; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + } + if (argc < 2) + return(IdentifyUsage()); + count=0; + format=NULL; + j=1; + k=0; + NewImageStack(); + option=(char *) NULL; + pend=MagickFalse; + respect_parenthesis=MagickFalse; + status=MagickTrue; + /* + Identify an image. + */ + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowIdentifyException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + image_info->ping=MagickTrue; + for (i=1; i < (ssize_t) argc; i++) + { + option=argv[i]; + if (LocaleCompare(option,"(") == 0) + { + FireImageStack(MagickFalse,MagickTrue,pend); + if (k == MaxImageStackDepth) + ThrowIdentifyException(OptionError,"ParenthesisNestedTooDeeply", + option); + PushImageStack(); + continue; + } + if (LocaleCompare(option,")") == 0) + { + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + if (k == 0) + ThrowIdentifyException(OptionError,"UnableToParseExpression",option); + PopImageStack(); + continue; + } + if (IsCommandOption(option) == MagickFalse) + { + char + *filename; + + Image + *images; + + ImageInfo + *identify_info; + + /* + Read input image. + */ + FireImageStack(MagickFalse,MagickFalse,pend); + identify_info=CloneImageInfo(image_info); + identify_info->verbose=MagickFalse; + filename=argv[i]; + if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1))) + filename=argv[++i]; + (void) SetImageOption(image_info,"filename",filename); + (void) CopyMagickString(identify_info->filename,filename,MaxTextExtent); + if (identify_info->ping != MagickFalse) + images=PingImages(identify_info,exception); + else + images=ReadImages(identify_info,exception); + identify_info=DestroyImageInfo(identify_info); + status&=(images != (Image *) NULL) && + (exception->severity < ErrorException); + if (images == (Image *) NULL) + continue; + AppendImageStack(images); + FinalizeImageSettings(image_info,image,MagickFalse); + count=0; + for ( ; image != (Image *) NULL; image=GetNextImageInList(image)) + { + if (image->scene == 0) + image->scene=count++; + if (format == (char *) NULL) + { + (void) IdentifyImage(image,stdout,image_info->verbose); + continue; + } + if (metadata != (char **) NULL) + { + char + *text; + + text=InterpretImageProperties(image_info,image,format); + InheritException(exception,&image->exception); + if (text == (char *) NULL) + ThrowIdentifyException(ResourceLimitError, + "MemoryAllocationFailed",GetExceptionMessage(errno)); + (void) ConcatenateString(&(*metadata),text); + text=DestroyString(text); + } + } + RemoveAllImageStack(); + continue; + } + pend=image != (Image *) NULL ? MagickTrue : MagickFalse; + image_info->ping=MagickFalse; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("alpha",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowIdentifyException(OptionError,"UnrecognizedAlphaChannelType", + argv[i]); + break; + } + if (LocaleCompare("antialias",option+1) == 0) + break; + if (LocaleCompare("authenticate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("auto-orient",option+1) == 0) + break; + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + ssize_t + channel; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + channel=ParseChannelOption(argv[i]); + if (channel < 0) + ThrowIdentifyException(OptionError,"UnrecognizedChannelType", + argv[i]); + break; + } + if (LocaleCompare("clip",option+1) == 0) + break; + if (LocaleCompare("clip-mask",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("clip-path",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowIdentifyException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("crop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("concurrent",option+1) == 0) + break; + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'd': + { + if (LocaleCompare("debug",option+1) == 0) + { + ssize_t + event; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); + if (event < 0) + ThrowIdentifyException(OptionError,"UnrecognizedEventType", + argv[i]); + (void) SetLogEventMask(argv[i]); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (*option == '+') + { + const char + *define; + + define=GetImageOption(image_info,argv[i]); + if (define == (const char *) NULL) + ThrowIdentifyException(OptionError,"NoSuchOption",argv[i]); + break; + } + break; + } + if (LocaleCompare("density",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'e': + { + if (LocaleCompare("endian",option+1) == 0) + { + ssize_t + endian; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + endian=ParseCommandOption(MagickEndianOptions,MagickFalse, + argv[i]); + if (endian < 0) + ThrowIdentifyException(OptionError,"UnrecognizedEndianType", + argv[i]); + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'f': + { + if (LocaleCompare("features",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("format",option+1) == 0) + { + format=(char *) NULL; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + format=argv[i]; + break; + } + if (LocaleCompare("fuzz",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'g': + { + if (LocaleCompare("gamma",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("grayscale",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickPixelIntensityOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowIdentifyException(OptionError,"UnrecognizedIntensityMethod", + argv[i]); + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'h': + { + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + DestroyIdentify(); + return(IdentifyUsage()); + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'i': + { + if (LocaleCompare("interlace",option+1) == 0) + { + ssize_t + interlace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, + argv[i]); + if (interlace < 0) + ThrowIdentifyException(OptionError,"UnrecognizedInterlaceType", + argv[i]); + break; + } + if (LocaleCompare("interpolate",option+1) == 0) + { + ssize_t + interpolate; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, + argv[i]); + if (interpolate < 0) + ThrowIdentifyException(OptionError, + "UnrecognizedInterpolateMethod",argv[i]); + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'l': + { + if (LocaleCompare("limit",option+1) == 0) + { + char + *p; + + double + value; + + ssize_t + resource; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + resource=ParseCommandOption(MagickResourceOptions,MagickFalse, + argv[i]); + if (resource < 0) + ThrowIdentifyException(OptionError,"UnrecognizedResourceType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + value=StringToDouble(argv[i],&p); + (void) value; + if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); + if (list < 0) + ThrowIdentifyException(OptionError,"UnrecognizedListType", + argv[i]); + status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) + argv+j,exception); + DestroyIdentify(); + return(status == 0 ? MagickFalse : MagickTrue); + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || + (strchr(argv[i],'%') == (char *) NULL)) + ThrowIdentifyException(OptionError,"MissingArgument",option); + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'm': + { + if (LocaleCompare("mask",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("matte",option+1) == 0) + break; + if (LocaleCompare("moments",option+1) == 0) + break; + if (LocaleCompare("monitor",option+1) == 0) + break; + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'n': + { + if (LocaleCompare("negate",option+1) == 0) + break; + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'p': + { + if (LocaleCompare("ping",option+1) == 0) + { + image_info->ping=MagickTrue; + break; + } + if (LocaleCompare("precision",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'q': + { + if (LocaleCompare("quiet",option+1) == 0) + break; + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'r': + { + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleNCompare("respect-parentheses",option+1,17) == 0) + { + respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 's': + { + if (LocaleCompare("sampling-factor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("set",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("size",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("strip",option+1) == 0) + break; + if (LocaleCompare("support",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowIdentifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'u': + { + if (LocaleCompare("unique",option+1) == 0) + break; + if (LocaleCompare("units",option+1) == 0) + { + ssize_t + units; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + units=ParseCommandOption(MagickResolutionOptions,MagickFalse, + argv[i]); + if (units < 0) + ThrowIdentifyException(OptionError,"UnrecognizedUnitsType", + argv[i]); + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + break; + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowIdentifyException(OptionError, + "UnrecognizedVirtualPixelMethod",argv[i]); + break; + } + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + case '?': + break; + default: + ThrowIdentifyException(OptionError,"UnrecognizedOption",option) + } + fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & + FireOptionFlag) == 0 ? MagickFalse : MagickTrue; + if (fire != MagickFalse) + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + } + if (k != 0) + ThrowIdentifyException(OptionError,"UnbalancedParenthesis",argv[i]); + if (i != (ssize_t) argc) + ThrowIdentifyException(OptionError,"MissingAnImageFilename",argv[i]); + DestroyIdentify(); + return(status != 0 ? MagickTrue : MagickFalse); +} diff --git a/ImageMagick-6.9.12-44/wand/identify.h b/ImageMagick-6.9.12-44/wand/identify.h new file mode 100644 index 0000000..6ac6c6e --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/identify.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand identify command-line method. +*/ +#ifndef MAGICKWAND_IDENTIFY_H +#define MAGICKWAND_IDENTIFY_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport MagickBooleanType + IdentifyImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/import.c b/ImageMagick-6.9.12-44/wand/import.c new file mode 100644 index 0000000..aa6370d --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/import.c @@ -0,0 +1,1290 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% IIIII M M PPPP OOO RRRR TTTTT % +% I MM MM P P O O R R T % +% I M M M PPPP O O RRRR T % +% I M M P O O R R T % +% IIIII M M P OOO R R T % +% % +% % +% Import Image from X11 Screen % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Use the import program to capture some or all of an X server screen and +% save the image to a file. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/mogrify-private.h" +#include "magick/string-private.h" +#include "magick/image-private.h" +#include "magick/xwindow-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ I m p o r t I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ImportImageCommand() reads an image from any visible window on an X server +% and outputs it as an image file. You can capture a single window, the +% entire screen, or any rectangular portion of the screen. You can use the +% display utility for redisplay, printing, editing, formatting, archiving, +% image processing, etc. of the captured image. +% +% The target window can be specified by id, name, or may be selected by +% clicking the mouse in the desired window. If you press a button and then +% drag, a rectangle will form which expands and contracts as the mouse moves. +% To save the portion of the screen defined by the rectangle, just release +% the button. The keyboard bell is rung once at the beginning of the screen +% capture and twice when it completes. +% +% The format of the ImportImageCommand method is: +% +% MagickBooleanType ImportImageCommand(ImageInfo *image_info,int argc, +% char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType ImportUsage(void) +{ + static const char + miscellaneous[] = + " -debug events display copious debugging information\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information\n" + " -version print version information", + operators[] = + " -annotate geometry text\n" + " annotate the image with text\n" + " -colors value preferred number of colors in the image\n" + " -crop geometry preferred size and location of the cropped image\n" + " -encipher filename convert plain pixels to cipher pixels\n" + " -geometry geometry preferred size or location of the image\n" + " -help print program options\n" + " -monochrome transform image to black and white\n" + " -negate replace every pixel with its complementary color \n" + " -quantize colorspace reduce colors in this colorspace\n" + " -resize geometry resize the image\n" + " -rotate degrees apply Paeth rotation to the image\n" + " -strip strip image of all profiles and comments\n" + " -thumbnail geometry create a thumbnail of the image\n" + " -transparent color make this color transparent within the image\n" + " -trim trim image edges\n" + " -type type image type", + settings[] = + " -adjoin join images into a single multi-image file\n" + " -border include window border in the output image\n" + " -channel type apply option to select image channels\n" + " -colorspace type alternate image colorspace\n" + " -comment string annotate image with comment\n" + " -compress type type of pixel compression when writing the image\n" + " -define format:option\n" + " define one or more image format options\n" + " -density geometry horizontal and vertical density of the image\n" + " -depth value image depth\n" + " -descend obtain image by descending window hierarchy\n" + " -display server X server to contact\n" + " -dispose method layer disposal method\n" + " -dither method apply error diffusion to image\n" + " -delay value display the next image after pausing\n" + " -encipher filename convert plain pixels to cipher pixels\n" + " -endian type endianness (MSB or LSB) of the image\n" + " -encoding type text encoding type\n" + " -filter type use this filter when resizing an image\n" + " -format \"string\" output formatted image characteristics\n" + " -frame include window manager frame\n" + " -gravity direction which direction to gravitate towards\n" + " -identify identify the format and characteristics of the image\n" + " -interlace type None, Line, Plane, or Partition\n" + " -interpolate method pixel color interpolation method\n" + " -label string assign a label to an image\n" + " -limit type value Area, Disk, Map, or Memory resource limit\n" + " -monitor monitor progress\n" + " -page geometry size and location of an image canvas\n" + " -pause seconds seconds delay between snapshots\n" + " -pointsize value font point size\n" + " -quality value JPEG/MIFF/PNG compression level\n" + " -quiet suppress all warning messages\n" + " -regard-warnings pay attention to warning messages\n" + " -repage geometry size and location of an image canvas\n" + " -respect-parentheses settings remain in effect until parenthesis boundary\n" + " -sampling-factor geometry\n" + " horizontal and vertical sampling factor\n" + " -scene value image scene number\n" + " -screen select image from root window\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -set property value set an image property\n" + " -silent operate silently, i.e. don't ring any bells \n" + " -snaps value number of screen snapshots\n" + " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n" + " -synchronize synchronize image to storage device\n" + " -taint declare the image as modified\n" + " -transparent-color color\n" + " transparent color\n" + " -treedepth value color tree depth\n" + " -verbose print detailed information about the image\n" + " -virtual-pixel method\n" + " Constant, Edge, Mirror, or Tile\n" + " -window id select window with this id or name"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] [ file ]\n",GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nImage Operators:\n"); + (void) puts(operators); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf( + "\nBy default, 'file' is written in the MIFF image format. To\n"); + (void) printf( + "specify a particular image format, precede the filename with an image\n"); + (void) printf( + "format name and a colon (i.e. ps:image) or specify the image type as\n"); + (void) printf( + "the filename suffix (i.e. image.ps). Specify 'file' as '-' for\n"); + (void) printf("standard input or output.\n"); + return(MagickTrue); +} + +WandExport MagickBooleanType ImportImageCommand(ImageInfo *image_info, + int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception) +{ +#if defined(MAGICKCORE_X11_DELEGATE) +#define DestroyImport() \ +{ \ + XDestroyResourceInfo(&resource_info); \ + if (display != (Display *) NULL) \ + { \ + XCloseDisplay(display); \ + display=(Display *) NULL; \ + } \ + DestroyImageStack(); \ + if (target_window != (char *) NULL) \ + target_window=DestroyString(target_window); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowImportException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option); \ + DestroyImport(); \ + return(MagickFalse); \ +} +#define ThrowImportInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",option,argument); \ + DestroyImport(); \ + return(MagickFalse); \ +} + + char + *filename, + *option, + *resource_value, + *server_name, + *target_window; + + Display + *display; + + Image + *image; + + ImageStack + image_stack[MaxImageStackDepth+1]; + + MagickBooleanType + fire, + pend, + respect_parenthesis; + + MagickStatusType + status; + + QuantizeInfo + *quantize_info; + + ssize_t + i; + + ssize_t + j, + k, + snapshots; + + XImportInfo + ximage_info; + + XResourceInfo + resource_info; + + XrmDatabase + resource_database; + + wand_unreferenced(metadata); + + /* + Set defaults. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + if (argc == 2) + { + option=argv[1]; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + } + display=(Display *) NULL; + j=1; + k=0; + NewImageStack(); + option=(char *) NULL; + pend=MagickFalse; + resource_database=(XrmDatabase) NULL; + respect_parenthesis=MagickFalse; + (void) memset(&resource_info,0,sizeof(resource_info)); + server_name=(char *) NULL; + status=MagickTrue; + SetNotifyHandlers; + target_window=(char *) NULL; + /* + Check for server name specified on the command line. + */ + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowImportException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + for (i=1; i < (ssize_t) argc; i++) + { + /* + Check command line for server name. + */ + option=argv[i]; + if (IsCommandOption(option) == MagickFalse) + continue; + if (LocaleCompare("display",option+1) == 0) + { + /* + User specified server name. + */ + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + server_name=argv[i]; + } + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + DestroyImport(); + return(ImportUsage()); + } + } + /* + Get user defaults from X resource database. + */ + display=XOpenDisplay(server_name); + if (display == (Display *) NULL) + ThrowImportException(XServerError,"UnableToOpenXServer", + XDisplayName(server_name)); + (void) XSetErrorHandler(XError); + resource_database=XGetResourceDatabase(display,GetClientName()); + XGetImportInfo(&ximage_info); + XGetResourceInfo(image_info,resource_database,GetClientName(), + &resource_info); + quantize_info=resource_info.quantize_info; + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "border","False"); + ximage_info.borders=IsMagickTrue(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "delay","0"); + resource_info.delay=(unsigned int) StringToUnsignedLong(resource_value); + image_info->density=XGetResourceInstance(resource_database,GetClientName(), + "density",(char *) NULL); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "descend","False"); + ximage_info.descend=IsMagickTrue(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "frame","False"); + ximage_info.frame=IsMagickTrue(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "interlace","none"); + image_info->interlace=UndefinedInterlace; + if (LocaleCompare("None",resource_value) == 0) + image_info->interlace=NoInterlace; + if (LocaleCompare("Line",resource_value) == 0) + image_info->interlace=LineInterlace; + if (LocaleCompare("Plane",resource_value) == 0) + image_info->interlace=PlaneInterlace; + if (LocaleCompare("Partition",resource_value) == 0) + image_info->interlace=PartitionInterlace; + if (image_info->interlace == UndefinedInterlace) + ThrowImportException(OptionError,"Unrecognized interlace type", + resource_value); + image_info->page=XGetResourceInstance(resource_database,GetClientName(), + "pageGeometry",(char *) NULL); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "pause","0"); + resource_info.pause=(unsigned int) StringToUnsignedLong(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "quality","85"); + image_info->quality=StringToUnsignedLong(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "screen","False"); + ximage_info.screen=IsMagickTrue(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "silent","False"); + ximage_info.silent=IsMagickTrue(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "verbose","False"); + image_info->verbose=IsMagickTrue(resource_value); + resource_value=XGetResourceInstance(resource_database,GetClientName(), + "dither","True"); + quantize_info->dither=IsMagickTrue(resource_value); + snapshots=1; + status=MagickTrue; + filename=(char *) NULL; + /* + Check command syntax. + */ + for (i=1; i < (ssize_t) argc; i++) + { + option=argv[i]; + if (LocaleCompare(option,"(") == 0) + { + FireImageStack(MagickFalse,MagickTrue,pend); + if (k == MaxImageStackDepth) + ThrowImportException(OptionError,"ParenthesisNestedTooDeeply", + option); + PushImageStack(); + continue; + } + if (LocaleCompare(option,")") == 0) + { + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + if (k == 0) + ThrowImportException(OptionError,"UnableToParseExpression",option); + PopImageStack(); + continue; + } + if (IsCommandOption(option) == MagickFalse) + { + Image + *images; + + size_t + scene; + + /* + Read image from X server. + */ + FireImageStack(MagickFalse,MagickFalse,pend); + filename=argv[i]; + if (target_window != (char *) NULL) + (void) CopyMagickString(image_info->filename,target_window, + MaxTextExtent); + for (scene=0; scene < (size_t) MagickMax(snapshots,1); scene++) + { + MagickDelay(1000*resource_info.pause); + images=XImportImage(image_info,&ximage_info); + status&=(images != (Image *) NULL) && + (exception->severity < ErrorException); + if (images == (Image *) NULL) + continue; + (void) CopyMagickString(images->filename,filename,MaxTextExtent); + (void) CopyMagickString(images->magick,"PS",MaxTextExtent); + images->scene=scene; + AppendImageStack(images); + } + continue; + } + pend=image != (Image *) NULL ? MagickTrue : MagickFalse; + switch(*(option+1)) + { + case 'a': + { + if (LocaleCompare("adjoin",option+1) == 0) + break; + if (LocaleCompare("annotate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + i++; + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'b': + { + if (LocaleCompare("border",option+1) == 0) + { + (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); + ximage_info.borders=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("bordercolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + ssize_t + channel; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + channel=ParseChannelOption(argv[i]); + if (channel < 0) + ThrowImportException(OptionError,"UnrecognizedChannelType", + argv[i]); + break; + } + if (LocaleCompare("colors",option+1) == 0) + { + quantize_info->number_colors=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + quantize_info->number_colors=StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse, + argv[i]); + if (colorspace < 0) + ThrowImportException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("comment",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + status=SetImageOption(image_info,"comment",argv[i]); + if (status == MagickFalse) + ThrowImportException(OptionError,"UnrecognizedOption",argv[i]); + break; + } + if (LocaleCompare("compress",option+1) == 0) + { + ssize_t + compress; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + compress=ParseCommandOption(MagickCompressOptions,MagickFalse, + argv[i]); + if (compress < 0) + ThrowImportException(OptionError,"UnrecognizedImageCompression", + argv[i]); + break; + } + if (LocaleCompare("concurrent",option+1) == 0) + break; + if (LocaleCompare("crop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'd': + { + if (LocaleCompare("debug",option+1) == 0) + { + ssize_t + event; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); + if (event < 0) + ThrowImportException(OptionError,"UnrecognizedEventType",argv[i]); + (void) SetLogEventMask(argv[i]); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (*option == '+') + { + const char + *define; + + define=GetImageOption(image_info,argv[i]); + if (define == (char *) NULL) + ThrowImportException(OptionError,"NoSuchOption",argv[i]); + break; + } + break; + } + if (LocaleCompare("delay",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + status=SetImageOption(image_info,"delay",argv[i]); + if (status == MagickFalse) + ThrowImportException(OptionError,"UnrecognizedOption",argv[i]); + break; + } + if (LocaleCompare("density",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("descend",option+1) == 0) + { + ximage_info.descend=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("display",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("dispose",option+1) == 0) + { + ssize_t + dispose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]); + if (dispose < 0) + ThrowImportException(OptionError,"UnrecognizedDisposeMethod", + argv[i]); + break; + } + if (LocaleCompare("dither",option+1) == 0) + { + ssize_t + method; + + quantize_info->dither=MagickFalse; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]); + if (method < 0) + ThrowImportException(OptionError,"UnrecognizedDitherMethod", + argv[i]); + quantize_info->dither=MagickTrue; + quantize_info->dither_method=(DitherMethod) method; + break; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'e': + { + if (LocaleCompare("encipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("encoding",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("endian",option+1) == 0) + { + ssize_t + endian; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + endian=ParseCommandOption(MagickEndianOptions,MagickFalse, + argv[i]); + if (endian < 0) + ThrowImportException(OptionError,"UnrecognizedEndianType", + argv[i]); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'f': + { + if (LocaleCompare("filter",option+1) == 0) + { + ssize_t + filter; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]); + if (filter < 0) + ThrowImportException(OptionError,"UnrecognizedImageFilter", + argv[i]); + break; + } + if (LocaleCompare("frame",option+1) == 0) + { + (void) CopyMagickString(argv[i]+1,"sans0",MaxTextExtent); + ximage_info.frame=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("format",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'g': + { + if (LocaleCompare("geometry",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("gravity",option+1) == 0) + { + ssize_t + gravity; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,argv[i]); + if (gravity < 0) + ThrowImportException(OptionError,"UnrecognizedGravityType", + argv[i]); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'h': + { + if (LocaleCompare("help",option+1) == 0) + break; + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'i': + { + if (LocaleCompare("identify",option+1) == 0) + break; + if (LocaleCompare("interlace",option+1) == 0) + { + ssize_t + interlace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, + argv[i]); + if (interlace < 0) + ThrowImportException(OptionError,"UnrecognizedInterlaceType", + argv[i]); + break; + } + if (LocaleCompare("interpolate",option+1) == 0) + { + ssize_t + interpolate; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, + argv[i]); + if (interpolate < 0) + ThrowImportException(OptionError,"UnrecognizedInterpolateMethod", + argv[i]); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'l': + { + if (LocaleCompare("label",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + status=SetImageOption(image_info,"label",argv[i]); + if (status == MagickFalse) + ThrowImportException(OptionError,"UnrecognizedOption",argv[i]); + break; + } + if (LocaleCompare("limit",option+1) == 0) + { + char + *p; + + double + value; + + ssize_t + resource; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + resource=ParseCommandOption(MagickResourceOptions,MagickFalse, + argv[i]); + if (resource < 0) + ThrowImportException(OptionError,"UnrecognizedResourceType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + value=StringToDouble(argv[i],&p); + (void) value; + if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); + if (list < 0) + ThrowImportException(OptionError,"UnrecognizedListType",argv[i]); + status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) + argv+j,exception); + DestroyImport(); + return(status == 0 ? MagickFalse : MagickTrue); + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL)) + ThrowImportException(OptionError,"MissingArgument",option); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'm': + { + if (LocaleCompare("monitor",option+1) == 0) + break; + if (LocaleCompare("monochrome",option+1) == 0) + { + if (*option == '+') + break; + quantize_info->number_colors=2; + quantize_info->colorspace=GRAYColorspace; + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'n': + { + if (LocaleCompare("negate",option+1) == 0) + break; + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'p': + { + if (LocaleCompare("page",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + status=SetImageOption(image_info,"page",argv[i]); + if (status == MagickFalse) + ThrowImportException(OptionError,"UnrecognizedOption",argv[i]); + break; + } + if (LocaleCompare("pause",option+1) == 0) + { + resource_info.pause=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + resource_info.pause=(unsigned int) StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("ping",option+1) == 0) + break; /* deprecated option */ + if (LocaleCompare("pointsize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'q': + { + if (LocaleCompare("quality",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("quantize",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowImportException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("quiet",option+1) == 0) + break; + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'r': + { + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleCompare("repage",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleNCompare("respect-parentheses",option+1,17) == 0) + { + respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("rotate",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 's': + { + if (LocaleCompare("sampling-factor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("scene",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("set",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("screen",option+1) == 0) + { + ximage_info.screen=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("silent",option+1) == 0) + { + ximage_info.silent=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("snaps",option+1) == 0) + { + (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + snapshots=(ssize_t) StringToLong(argv[i]); + break; + } + if (LocaleCompare("strip",option+1) == 0) + break; + if (LocaleCompare("support",option+1) == 0) + { + i++; /* deprecated */ + break; + } + if (LocaleCompare("synchronize",option+1) == 0) + break; + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 't': + { + if (LocaleCompare("taint",option+1) == 0) + break; + if (LocaleCompare("thumbnail",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("transparent",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("transparent-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("treedepth",option+1) == 0) + { + quantize_info->tree_depth=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowImportInvalidArgumentException(option,argv[i]); + quantize_info->tree_depth=StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("trim",option+1) == 0) + break; + if (LocaleCompare("type",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowImportException(OptionError,"UnrecognizedImageType",argv[i]); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case 'w': + { + i++; + if (i == (ssize_t) argc) + ThrowImportException(OptionError,"MissingArgument",option); + (void) CloneString(&target_window,argv[i]); + break; + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + break; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + break; + } + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + case '?': + break; + default: + ThrowImportException(OptionError,"UnrecognizedOption",option); + } + fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & + FireOptionFlag) == 0 ? MagickFalse : MagickTrue; + if (fire != MagickFalse) + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + } + if (k != 0) + ThrowImportException(OptionError,"UnbalancedParenthesis",argv[i]); + if (i-- != (ssize_t) argc) + ThrowImportException(OptionError,"MissingAnImageFilename",argv[i]); + if (image == (Image *) NULL) + ThrowImportException(OptionError,"MissingAnImageFilename",argv[argc-1]); + FinalizeImageSettings(image_info,image,MagickTrue); + status&=WriteImages(image_info,image,filename,exception); + DestroyImport(); + return(status != 0 ? MagickTrue : MagickFalse); +#else + magick_unreferenced(argc); + magick_unreferenced(argv); + magick_unreferenced(metadata); + + (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError, + "DelegateLibrarySupportNotBuiltIn","`%s' (X11)",image_info->filename); + return(ImportUsage()); +#endif +} diff --git a/ImageMagick-6.9.12-44/wand/import.h b/ImageMagick-6.9.12-44/wand/import.h new file mode 100644 index 0000000..659af40 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/import.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand import command-line method. +*/ +#ifndef MAGICKWAND_IMPORT_H +#define MAGICKWAND_IMPORT_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport MagickBooleanType + ImportImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/libMagickWand.map b/ImageMagick-6.9.12-44/wand/libMagickWand.map new file mode 100644 index 0000000..85297c9 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/libMagickWand.map @@ -0,0 +1,4 @@ + VERS_7.0 { + global: + *; + }; diff --git a/ImageMagick-6.9.12-44/wand/magick-image.c b/ImageMagick-6.9.12-44/wand/magick-image.c new file mode 100644 index 0000000..77b85e3 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/magick-image.c @@ -0,0 +1,13539 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M AAA GGGG IIIII CCCC K K % +% MM MM A A G I C K K % +% M M M AAAAA G GGG I C KKK % +% M M A A G G I C K K % +% M M A A GGGG IIIII CCCC K K % +% % +% IIIII M M AAA GGGG EEEEE % +% I MM MM A A G E % +% I M M M AAAAA G GG EEE % +% I M M A A G G E % +% IIIII M M A A GGGG EEEEE % +% % +% % +% MagickWand Image Methods % +% % +% Software Design % +% Cristy % +% August 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/magick-wand-private.h" +#include "wand/wand.h" +#include "wand/pixel-wand-private.h" +#include "magick/image-private.h" + +/* + Define declarations. +*/ +#define MagickWandId "MagickWand" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ C l o n e M a g i c k W a n d F r o m I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneMagickWandFromImages() clones the magick wand and inserts a new image +% list. +% +% The format of the CloneMagickWandFromImages method is: +% +% MagickWand *CloneMagickWandFromImages(const MagickWand *wand, +% Image *images) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o images: replace the image list with these image(s). +% +*/ +static MagickWand *CloneMagickWandFromImages(const MagickWand *wand, + Image *images) +{ + MagickWand + *clone_wand; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + clone_wand=(MagickWand *) AcquireCriticalMemory(sizeof(*clone_wand)); + (void) memset(clone_wand,0,sizeof(*clone_wand)); + clone_wand->id=AcquireWandId(); + (void) FormatLocaleString(clone_wand->name,MaxTextExtent,"%s-%.20g", + MagickWandId,(double) clone_wand->id); + clone_wand->exception=AcquireExceptionInfo(); + InheritException(clone_wand->exception,wand->exception); + clone_wand->image_info=CloneImageInfo(wand->image_info); + clone_wand->quantize_info=CloneQuantizeInfo(wand->quantize_info); + clone_wand->images=images; + clone_wand->debug=IsEventLogging(); + if (clone_wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_wand->name); + clone_wand->signature=WandSignature; + return(clone_wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t I m a g e F r o m M a g i c k W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetImageFromMagickWand() returns the current image from the magick wand. +% +% The format of the GetImageFromMagickWand method is: +% +% Image *GetImageFromMagickWand(const MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport Image *GetImageFromMagickWand(const MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((Image *) NULL); + } + return(wand->images); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A d a p t i v e S h a r p e n I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAdaptiveBlurImage() adaptively blurs the image by blurring +% less intensely near image edges and more intensely far from edges. We +% blur the image with a Gaussian operator of the given radius and standard +% deviation (sigma). For reasonable results, radius should be larger than +% sigma. Use a radius of 0 and MagickAdaptiveBlurImage() selects a +% suitable radius for you. +% +% The format of the MagickAdaptiveBlurImage method is: +% +% MagickBooleanType MagickAdaptiveBlurImage(MagickWand *wand, +% const double radius,const double sigma) +% MagickBooleanType MagickAdaptiveBlurImageChannel(MagickWand *wand, +% const ChannelType channel,const double radius,const double sigma) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +*/ + +WandExport MagickBooleanType MagickAdaptiveBlurImage(MagickWand *wand, + const double radius,const double sigma) +{ + MagickBooleanType + status; + + status=MagickAdaptiveBlurImageChannel(wand,DefaultChannels,radius,sigma); + return(status); +} + +WandExport MagickBooleanType MagickAdaptiveBlurImageChannel(MagickWand *wand, + const ChannelType channel,const double radius,const double sigma) +{ + Image + *sharp_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + sharp_image=AdaptiveBlurImageChannel(wand->images,channel,radius,sigma, + wand->exception); + if (sharp_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,sharp_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A d a p t i v e R e s i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAdaptiveResizeImage() adaptively resize image with data dependent +% triangulation. +% +% MagickBooleanType MagickAdaptiveResizeImage(MagickWand *wand, +% const size_t columns,const size_t rows) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: the number of columns in the scaled image. +% +% o rows: the number of rows in the scaled image. +% +*/ +WandExport MagickBooleanType MagickAdaptiveResizeImage(MagickWand *wand, + const size_t columns,const size_t rows) +{ + Image + *resize_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + resize_image=AdaptiveResizeImage(wand->images,columns,rows,wand->exception); + if (resize_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,resize_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A d a p t i v e S h a r p e n I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAdaptiveSharpenImage() adaptively sharpens the image by sharpening +% more intensely near image edges and less intensely far from edges. We +% sharpen the image with a Gaussian operator of the given radius and standard +% deviation (sigma). For reasonable results, radius should be larger than +% sigma. Use a radius of 0 and MagickAdaptiveSharpenImage() selects a +% suitable radius for you. +% +% The format of the MagickAdaptiveSharpenImage method is: +% +% MagickBooleanType MagickAdaptiveSharpenImage(MagickWand *wand, +% const double radius,const double sigma) +% MagickBooleanType MagickAdaptiveSharpenImageChannel(MagickWand *wand, +% const ChannelType channel,const double radius,const double sigma) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +*/ + +WandExport MagickBooleanType MagickAdaptiveSharpenImage(MagickWand *wand, + const double radius,const double sigma) +{ + MagickBooleanType + status; + + status=MagickAdaptiveSharpenImageChannel(wand,DefaultChannels,radius,sigma); + return(status); +} + +WandExport MagickBooleanType MagickAdaptiveSharpenImageChannel(MagickWand *wand, + const ChannelType channel,const double radius,const double sigma) +{ + Image + *sharp_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + sharp_image=AdaptiveSharpenImageChannel(wand->images,channel,radius,sigma, + wand->exception); + if (sharp_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,sharp_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A d a p t i v e T h r e s h o l d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAdaptiveThresholdImage() selects an individual threshold for each pixel +% based on the range of intensity values in its local neighborhood. This +% allows for thresholding of an image whose global intensity histogram +% doesn't contain distinctive peaks. +% +% The format of the AdaptiveThresholdImage method is: +% +% MagickBooleanType MagickAdaptiveThresholdImage(MagickWand *wand, +% const size_t width,const size_t height,const ssize_t offset) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the width of the local neighborhood. +% +% o height: the height of the local neighborhood. +% +% o offset: the mean offset. +% +*/ +WandExport MagickBooleanType MagickAdaptiveThresholdImage(MagickWand *wand, + const size_t width,const size_t height,const ssize_t offset) +{ + Image + *threshold_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + threshold_image=AdaptiveThresholdImage(wand->images,width,height,offset, + wand->exception); + if (threshold_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,threshold_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A d d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAddImage() adds a clone of the images from the second wand and +% inserts them into the first wand. +% +% Use MagickSetLastIterator(), to append new images into an existing wand, +% current image will be set to last image so later adds with also be +% appened to end of wand. +% +% Use MagickSetFirstIterator() to prepend new images into wand, any more +% images added will also be prepended before other images in the wand. +% However the order of a list of new images will not change. +% +% Otherwise the new images will be inserted just after the current image, +% and any later image will also be added after this current image but +% before the previously added images. Caution is advised when multiple +% image adds are inserted into the middle of the wand image list. +% +% The format of the MagickAddImage method is: +% +% MagickBooleanType MagickAddImage(MagickWand *wand, +% const MagickWand *add_wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o add_wand: A wand that contains the image list to be added +% +*/ +static inline MagickBooleanType InsertImageInWand(MagickWand *wand, + Image *images) +{ + if (wand->images == (Image *) NULL) + { + /* + No images in wand, just add them, set current as appropriate. + */ + if (wand->insert_before != MagickFalse) + wand->images=GetFirstImageInList(images); + else + wand->images=GetLastImageInList(images); + return(MagickTrue); + } + if ((wand->insert_before != MagickFalse) && + (wand->images->previous == (Image *) NULL) ) + { + /* + Jumped to first image, so prepend new images - remain active. + */ + PrependImageToList(&wand->images,images); + wand->images=GetFirstImageInList(images); + return(MagickTrue); + } + /* + Note you should never have 'insert_before' true when current image is not + the first image in the wand! That is no insert before current image, only + after current image. + */ + if (wand->images->next == (Image *) NULL) + { + /* + At last image, append new images. + */ + InsertImageInList(&wand->images,images); + wand->images=GetLastImageInList(images); + return(MagickTrue); + } + /* + Insert new images, just after the current image. + */ + InsertImageInList(&wand->images,images); + return(MagickTrue); +} + +WandExport MagickBooleanType MagickAddImage(MagickWand *wand, + const MagickWand *add_wand) +{ + Image + *images; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(add_wand != (MagickWand *) NULL); + assert(add_wand->signature == WandSignature); + if (add_wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",add_wand->name); + /* + Clone images in second wand, and insert into first. + */ + images=CloneImageList(add_wand->images,wand->exception); + if (images == (Image *) NULL) + return(MagickFalse); + return(InsertImageInWand(wand,images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A d d N o i s e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAddNoiseImage() adds random noise to the image. +% +% The format of the MagickAddNoiseImage method is: +% +% MagickBooleanType MagickAddNoiseImage(MagickWand *wand, +% const NoiseType noise_type) +% MagickBooleanType MagickAddNoiseImageChannel(MagickWand *wand, +% const ChannelType channel,const NoiseType noise_type) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o noise_type: The type of noise: Uniform, Gaussian, Multiplicative, +% Impulse, Laplacian, or Poisson. +% +*/ + +WandExport MagickBooleanType MagickAddNoiseImage(MagickWand *wand, + const NoiseType noise_type) +{ + MagickBooleanType + status; + + status=MagickAddNoiseImageChannel(wand,DefaultChannels,noise_type); + return(status); +} + +WandExport MagickBooleanType MagickAddNoiseImageChannel(MagickWand *wand, + const ChannelType channel,const NoiseType noise_type) +{ + Image + *noise_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + noise_image=AddNoiseImageChannel(wand->images,channel,noise_type, + wand->exception); + if (noise_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,noise_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A f f i n e T r a n s f o r m I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAffineTransformImage() transforms an image as dictated by the affine +% matrix of the drawing wand. +% +% The format of the MagickAffineTransformImage method is: +% +% MagickBooleanType MagickAffineTransformImage(MagickWand *wand, +% const DrawingWand *drawing_wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o drawing_wand: the draw wand. +% +*/ +WandExport MagickBooleanType MagickAffineTransformImage(MagickWand *wand, + const DrawingWand *drawing_wand) +{ + DrawInfo + *draw_info; + + Image + *affine_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + draw_info=PeekDrawingWand(drawing_wand); + if (draw_info == (DrawInfo *) NULL) + return(MagickFalse); + affine_image=AffineTransformImage(wand->images,&draw_info->affine, + wand->exception); + draw_info=DestroyDrawInfo(draw_info); + if (affine_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,affine_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A n n o t a t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAnnotateImage() annotates an image with text. +% +% The format of the MagickAnnotateImage method is: +% +% MagickBooleanType MagickAnnotateImage(MagickWand *wand, +% const DrawingWand *drawing_wand,const double x,const double y, +% const double angle,const char *text) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o drawing_wand: the draw wand. +% +% o x: x ordinate to left of text +% +% o y: y ordinate to text baseline +% +% o angle: rotate text relative to this angle. +% +% o text: text to draw +% +*/ +WandExport MagickBooleanType MagickAnnotateImage(MagickWand *wand, + const DrawingWand *drawing_wand,const double x,const double y, + const double angle,const char *text) +{ + char + geometry[MaxTextExtent]; + + DrawInfo + *draw_info; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + draw_info=PeekDrawingWand(drawing_wand); + if (draw_info == (DrawInfo *) NULL) + return(MagickFalse); + (void) CloneString(&draw_info->text,text); + (void) FormatLocaleString(geometry,MaxTextExtent,"%+g%+g",x,y); + draw_info->affine.sx=cos(DegreesToRadians(fmod(angle,360.0))); + draw_info->affine.rx=sin(DegreesToRadians(fmod(angle,360.0))); + draw_info->affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0)))); + draw_info->affine.sy=cos(DegreesToRadians(fmod(angle,360.0))); + (void) CloneString(&draw_info->geometry,geometry); + status=AnnotateImage(wand->images,draw_info); + draw_info=DestroyDrawInfo(draw_info); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A n i m a t e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAnimateImages() animates an image or image sequence. +% +% The format of the MagickAnimateImages method is: +% +% MagickBooleanType MagickAnimateImages(MagickWand *wand, +% const char *server_name) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o server_name: the X server name. +% +*/ +WandExport MagickBooleanType MagickAnimateImages(MagickWand *wand, + const char *server_name) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) CloneString(&wand->image_info->server_name,server_name); + status=AnimateImages(wand->image_info,wand->images); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A p p e n d I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAppendImages() append the images in a wand from the current image +% onwards, creating a new wand with the single image result. This is +% affected by the gravity and background settings of the first image. +% +% Typically you would call either MagickResetIterator() or +% MagickSetFirstImage() before calling this function to ensure that all +% the images in the wand's image list will be appended together. +% +% The format of the MagickAppendImages method is: +% +% MagickWand *MagickAppendImages(MagickWand *wand, +% const MagickBooleanType stack) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o stack: By default, images are stacked left-to-right. Set stack to +% MagickTrue to stack them top-to-bottom. +% +*/ +WandExport MagickWand *MagickAppendImages(MagickWand *wand, + const MagickBooleanType stack) +{ + Image + *append_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + append_image=AppendImages(wand->images,stack,wand->exception); + if (append_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,append_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A u t o G a m m a I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAutoGammaImage() extracts the 'mean' from the image and adjust the +% image to try make set its gamma appropriatally. +% +% The format of the MagickAutoGammaImage method is: +% +% MagickBooleanType MagickAutoGammaImage(MagickWand *wand) +% MagickBooleanType MagickAutoGammaImageChannel(MagickWand *wand, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +*/ +WandExport MagickBooleanType MagickAutoGammaImage(MagickWand *wand) +{ + MagickBooleanType + status; + + status=MagickAutoGammaImageChannel(wand,DefaultChannels); + return(status); +} + +WandExport MagickBooleanType MagickAutoGammaImageChannel(MagickWand *wand, + const ChannelType channel) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=AutoGammaImageChannel(wand->images,channel); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A u t o L e v e l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAutoLevelImage() adjusts the levels of a particular image channel by +% scaling the minimum and maximum values to the full quantum range. +% +% The format of the MagickAutoLevelImage method is: +% +% MagickBooleanType MagickAutoLevelImage(MagickWand *wand) +% MagickBooleanType MagickAutoLevelImageChannel(MagickWand *wand, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +*/ +WandExport MagickBooleanType MagickAutoLevelImage(MagickWand *wand) +{ + MagickBooleanType + status; + + status=MagickAutoLevelImageChannel(wand,DefaultChannels); + return(status); +} + +WandExport MagickBooleanType MagickAutoLevelImageChannel(MagickWand *wand, + const ChannelType channel) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=AutoLevelImageChannel(wand->images,channel); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k A u t o O r i e n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickAutoOrientImage() adjusts an image so that its orientation is suitable +$ for viewing (i.e. top-left orientation). +% +% The format of the MagickAutoOrientImage method is: +% +% MagickBooleanType MagickAutoOrientImage(MagickWand *image) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickAutoOrientImage(MagickWand *wand) +{ + + Image + *orient_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + orient_image=AutoOrientImage(wand->images,wand->images->orientation, + wand->exception); + if (orient_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,orient_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k B l a c k T h r e s h o l d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickBlackThresholdImage() is like MagickThresholdImage() but forces all +% pixels below the threshold into black while leaving all pixels above the +% threshold unchanged. +% +% The format of the MagickBlackThresholdImage method is: +% +% MagickBooleanType MagickBlackThresholdImage(MagickWand *wand, +% const PixelWand *threshold) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o threshold: the pixel wand. +% +*/ +WandExport MagickBooleanType MagickBlackThresholdImage(MagickWand *wand, + const PixelWand *threshold) +{ + char + thresholds[MaxTextExtent]; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + (void) FormatLocaleString(thresholds,MaxTextExtent,QuantumFormat "," + QuantumFormat "," QuantumFormat "," QuantumFormat,PixelGetRedQuantum( + threshold),PixelGetGreenQuantum(threshold),PixelGetBlueQuantum(threshold), + PixelGetOpacityQuantum(threshold)); + status=BlackThresholdImage(wand->images,thresholds); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k B l u e S h i f t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickBlueShiftImage() mutes the colors of the image to simulate a scene at +% nighttime in the moonlight. +% +% The format of the MagickBlueShiftImage method is: +% +% MagickBooleanType MagickBlueShiftImage(MagickWand *wand, +% const double factor) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o factor: the blue shift factor (default 1.5) +% +*/ +WandExport MagickBooleanType MagickBlueShiftImage(MagickWand *wand, + const double factor) +{ + Image + *shift_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + shift_image=BlueShiftImage(wand->images,factor,wand->exception); + if (shift_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,shift_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickBlurImage() blurs an image. We convolve the image with a gaussian +% operator of the given radius and standard deviation (sigma). For reasonable +% results, the radius should be larger than sigma. Use a radius of 0 and +% BlurImage() selects a suitable radius for you. +% +% The format of the MagickBlurImage method is: +% +% MagickBooleanType MagickBlurImage(MagickWand *wand,const double radius, +% const double sigma) +% MagickBooleanType MagickBlurImageChannel(MagickWand *wand, +% const ChannelType channel,const double radius,const double sigma) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o radius: the radius of the , in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the , in pixels. +% +*/ + +WandExport MagickBooleanType MagickBlurImage(MagickWand *wand, + const double radius,const double sigma) +{ + MagickBooleanType + status; + + status=MagickBlurImageChannel(wand,DefaultChannels,radius,sigma); + return(status); +} + +WandExport MagickBooleanType MagickBlurImageChannel(MagickWand *wand, + const ChannelType channel,const double radius,const double sigma) +{ + Image + *blur_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + blur_image=BlurImageChannel(wand->images,channel,radius,sigma, + wand->exception); + if (blur_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,blur_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k B o r d e r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickBorderImage() surrounds the image with a border of the color defined +% by the bordercolor pixel wand. +% +% The format of the MagickBorderImage method is: +% +% MagickBooleanType MagickBorderImage(MagickWand *wand, +% const PixelWand *bordercolor,const size_t width, +% const size_t height) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o bordercolor: the border color pixel wand. +% +% o width: the border width. +% +% o height: the border height. +% +*/ +WandExport MagickBooleanType MagickBorderImage(MagickWand *wand, + const PixelWand *bordercolor,const size_t width,const size_t height) +{ + Image + *border_image; + + RectangleInfo + border_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + border_info.width=width; + border_info.height=height; + border_info.x=0; + border_info.y=0; + PixelGetQuantumColor(bordercolor,&wand->images->border_color); + border_image=BorderImage(wand->images,&border_info,wand->exception); + if (border_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,border_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k B r i g h t n e s s C o n t r a s t S t r e t c h I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Use MagickBrightnessContrastImage() to change the brightness and/or contrast +% of an image. It converts the brightness and contrast parameters into slope +% and intercept and calls a polynomical function to apply to the image. +% +% The format of the MagickBrightnessContrastImage method is: +% +% MagickBooleanType MagickBrightnessContrastImage(MagickWand *wand, +% const double brightness,const double contrast) +% MagickBooleanType MagickBrightnessContrastImageChannel(MagickWand *wand, +% const ChannelType channel,const double brightness, +% const double contrast) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o brightness: the brightness percent (-100 .. 100). +% +% o contrast: the contrast percent (-100 .. 100). +% +*/ + +WandExport MagickBooleanType MagickBrightnessContrastImage(MagickWand *wand, + const double brightness,const double contrast) +{ + MagickBooleanType + status; + + status=MagickBrightnessContrastImageChannel(wand,DefaultChannels,brightness, + contrast); + return(status); +} + +WandExport MagickBooleanType MagickBrightnessContrastImageChannel( + MagickWand *wand,const ChannelType channel,const double brightness, + const double contrast) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=BrightnessContrastImageChannel(wand->images,channel,brightness, + contrast); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C h a r c o a l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCharcoalImage() simulates a charcoal drawing. +% +% The format of the MagickCharcoalImage method is: +% +% MagickBooleanType MagickCharcoalImage(MagickWand *wand, +% const double radius,const double sigma) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +*/ +WandExport MagickBooleanType MagickCharcoalImage(MagickWand *wand, + const double radius,const double sigma) +{ + Image + *charcoal_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + charcoal_image=CharcoalImage(wand->images,radius,sigma,wand->exception); + if (charcoal_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,charcoal_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C h o p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickChopImage() removes a region of an image and collapses the image to +% occupy the removed portion +% +% The format of the MagickChopImage method is: +% +% MagickBooleanType MagickChopImage(MagickWand *wand,const size_t width, +% const size_t height,const ssize_t x,const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the region width. +% +% o height: the region height. +% +% o x: the region x offset. +% +% o y: the region y offset. +% +*/ +WandExport MagickBooleanType MagickChopImage(MagickWand *wand, + const size_t width,const size_t height,const ssize_t x,const ssize_t y) +{ + Image + *chop_image; + + RectangleInfo + chop; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + chop.width=width; + chop.height=height; + chop.x=x; + chop.y=y; + chop_image=ChopImage(wand->images,&chop,wand->exception); + if (chop_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,chop_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C l a m p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickClampImage() restricts the color range from 0 to the quantum depth. +% +% The format of the MagickClampImage method is: +% +% MagickBooleanType MagickClampImage(MagickWand *wand) +% MagickBooleanType MagickClampImageChannel(MagickWand *wand, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the channel. +% +*/ + +WandExport MagickBooleanType MagickClampImage(MagickWand *wand) +{ + MagickBooleanType + status; + + status=MagickClampImageChannel(wand,DefaultChannels); + return(status); +} + +WandExport MagickBooleanType MagickClampImageChannel(MagickWand *wand, + const ChannelType channel) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=ClampImageChannel(wand->images,channel); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C l i p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickClipImage() clips along the first path from the 8BIM profile, if +% present. +% +% The format of the MagickClipImage method is: +% +% MagickBooleanType MagickClipImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickClipImage(MagickWand *wand) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=ClipImage(wand->images); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C l i p I m a g e P a t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickClipImagePath() clips along the named paths from the 8BIM profile, if +% present. Later operations take effect inside the path. Id may be a number +% if preceded with #, to work on a numbered path, e.g., "#1" to use the first +% path. +% +% The format of the MagickClipImagePath method is: +% +% MagickBooleanType MagickClipImagePath(MagickWand *wand, +% const char *pathname,const MagickBooleanType inside) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o pathname: name of clipping path resource. If name is preceded by #, use +% clipping path numbered by name. +% +% o inside: if non-zero, later operations take effect inside clipping path. +% Otherwise later operations take effect outside clipping path. +% +*/ +WandExport MagickBooleanType MagickClipImagePath(MagickWand *wand, + const char *pathname,const MagickBooleanType inside) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=ClipImagePath(wand->images,pathname,inside); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C l u t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickClutImage() replaces colors in the image from a color lookup table. +% +% The format of the MagickClutImage method is: +% +% MagickBooleanType MagickClutImage(MagickWand *wand, +% const MagickWand *clut_wand) +% MagickBooleanType MagickClutImageChannel(MagickWand *wand, +% const ChannelType channel,const MagickWand *clut_wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o clut_image: the clut image. +% +*/ + +WandExport MagickBooleanType MagickClutImage(MagickWand *wand, + const MagickWand *clut_wand) +{ + MagickBooleanType + status; + + status=MagickClutImageChannel(wand,DefaultChannels,clut_wand); + return(status); +} + +WandExport MagickBooleanType MagickClutImageChannel(MagickWand *wand, + const ChannelType channel,const MagickWand *clut_wand) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || (clut_wand->images == (Image *) NULL)) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=ClutImageChannel(wand->images,channel,clut_wand->images); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o a l e s c e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCoalesceImages() composites a set of images while respecting any page +% offsets and disposal methods. GIF, MIFF, and MNG animation sequences +% typically start with an image background and each subsequent image +% varies in size and offset. MagickCoalesceImages() returns a new sequence +% where each image in the sequence is the same size as the first and +% composited with the next image in the sequence. +% +% The format of the MagickCoalesceImages method is: +% +% MagickWand *MagickCoalesceImages(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *MagickCoalesceImages(MagickWand *wand) +{ + Image + *coalesce_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + coalesce_image=CoalesceImages(wand->images,wand->exception); + if (coalesce_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,coalesce_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o l o r D e c i s i o n I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickColorDecisionListImage() accepts a lightweight Color Correction +% Collection (CCC) file which solely contains one or more color corrections +% and applies the color correction to the image. Here is a sample CCC file: +% +% +% +% +% 0.9 1.2 0.5 +% 0.4 -0.5 0.6 +% 1.0 0.8 1.5 +% +% +% 0.85 +% +% +% +% +% which includes the offset, slope, and power for each of the RGB channels +% as well as the saturation. +% +% The format of the MagickColorDecisionListImage method is: +% +% MagickBooleanType MagickColorDecisionListImage(MagickWand *wand, +% const char *color_correction_collection) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o color_correction_collection: the color correction collection in XML. +% +*/ +WandExport MagickBooleanType MagickColorDecisionListImage(MagickWand *wand, + const char *color_correction_collection) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=ColorDecisionListImage(wand->images,color_correction_collection); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o l o r i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickColorizeImage() blends the fill color with each pixel in the image. +% +% The format of the MagickColorizeImage method is: +% +% MagickBooleanType MagickColorizeImage(MagickWand *wand, +% const PixelWand *colorize,const PixelWand *opacity) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o colorize: the colorize pixel wand. +% +% o opacity: the opacity pixel wand. +% +*/ +WandExport MagickBooleanType MagickColorizeImage(MagickWand *wand, + const PixelWand *colorize,const PixelWand *opacity) +{ + char + percent_opaque[MaxTextExtent]; + + Image + *colorize_image; + + PixelPacket + target; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + (void) FormatLocaleString(percent_opaque,MaxTextExtent,"%g,%g,%g,%g",(double) + (100.0*QuantumScale*PixelGetRedQuantum(opacity)),(double) (100.0* + QuantumScale*PixelGetGreenQuantum(opacity)),(double) (100.0*QuantumScale* + PixelGetBlueQuantum(opacity)),(double) (100.0*QuantumScale* + PixelGetOpacityQuantum(opacity))); + PixelGetQuantumColor(colorize,&target); + colorize_image=ColorizeImage(wand->images,percent_opaque,target, + wand->exception); + if (colorize_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,colorize_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o l o r M a t r i x I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickColorMatrixImage() apply color transformation to an image. The method +% permits saturation changes, hue rotation, luminance to alpha, and various +% other effects. Although variable-sized transformation matrices can be used, +% typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA +% (or RGBA with offsets). The matrix is similar to those used by Adobe Flash +% except offsets are in column 6 rather than 5 (in support of CMYKA images) +% and offsets are normalized (divide Flash offset by 255). +% +% The format of the MagickColorMatrixImage method is: +% +% MagickBooleanType MagickColorMatrixImage(MagickWand *wand, +% const KernelInfo *color_matrix) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o color_matrix: the color matrix. +% +*/ +WandExport MagickBooleanType MagickColorMatrixImage(MagickWand *wand, + const KernelInfo *color_matrix) +{ + Image + *color_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (color_matrix == (const KernelInfo *) NULL) + return(MagickFalse); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + color_image=ColorMatrixImage(wand->images,color_matrix,wand->exception); + if (color_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,color_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o m b i n e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCombineImages() combines one or more images into a single image. The +% grayscale value of the pixels of each image in the sequence is assigned in +% order to the specified hannels of the combined image. The typical +% ordering would be image 1 => Red, 2 => Green, 3 => Blue, etc. +% +% The format of the MagickCombineImages method is: +% +% MagickWand *MagickCombineImages(MagickWand *wand, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the channel. +% +*/ +WandExport MagickWand *MagickCombineImages(MagickWand *wand, + const ChannelType channel) +{ + Image + *combine_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + combine_image=CombineImages(wand->images,channel,wand->exception); + if (combine_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,combine_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o m m e n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCommentImage() adds a comment to your image. +% +% The format of the MagickCommentImage method is: +% +% MagickBooleanType MagickCommentImage(MagickWand *wand, +% const char *comment) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o comment: the image comment. +% +*/ +WandExport MagickBooleanType MagickCommentImage(MagickWand *wand, + const char *comment) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=SetImageProperty(wand->images,"comment",comment); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o m p a r e I m a g e C h a n n e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCompareImageChannels() compares one or more image channels of an image +% to a reconstructed image and returns the difference image. +% +% The format of the MagickCompareImageChannels method is: +% +% MagickWand *MagickCompareImageChannels(MagickWand *wand, +% const MagickWand *reference,const ChannelType channel, +% const MetricType metric,double *distortion) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o reference: the reference wand. +% +% o channel: the channel. +% +% o metric: the metric. +% +% o distortion: the computed distortion between the images. +% +*/ +WandExport MagickWand *MagickCompareImageChannels(MagickWand *wand, + const MagickWand *reference,const ChannelType channel,const MetricType metric, + double *distortion) +{ + Image + *compare_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL)) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((MagickWand *) NULL); + } + compare_image=CompareImageChannels(wand->images,reference->images,channel, + metric,distortion,&wand->images->exception); + if (compare_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,compare_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o m p a r e I m a g e L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCompareImageLayers() compares each image with the next in a sequence +% and returns the maximum bounding region of any pixel differences it +% discovers. +% +% The format of the MagickCompareImageLayers method is: +% +% MagickWand *MagickCompareImageLayers(MagickWand *wand, +% const ImageLayerMethod method) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o method: the compare method. +% +*/ +WandExport MagickWand *MagickCompareImageLayers(MagickWand *wand, + const ImageLayerMethod method) +{ + Image + *layers_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + layers_image=CompareImageLayers(wand->images,method,wand->exception); + if (layers_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,layers_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o m p a r e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCompareImages() compares an image to a reconstructed image and returns +% the specified difference image. +% +% The format of the MagickCompareImages method is: +% +% MagickWand *MagickCompareImages(MagickWand *wand, +% const MagickWand *reference,const MetricType metric,double *distortion) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o reference: the reference wand. +% +% o metric: the metric. +% +% o distortion: the computed distortion between the images. +% +*/ +WandExport MagickWand *MagickCompareImages(MagickWand *wand, + const MagickWand *reference,const MetricType metric,double *distortion) +{ + Image + *compare_image; + + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL)) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((MagickWand *) NULL); + } + compare_image=CompareImages(wand->images,reference->images,metric,distortion, + &wand->images->exception); + if (compare_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,compare_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o m p o s i t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCompositeImage() composite one image onto another at the specified +% offset. +% +% The format of the MagickCompositeImage method is: +% +% MagickBooleanType MagickCompositeImage(MagickWand *wand, +% const MagickWand *source_wand,const CompositeOperator compose, +% const ssize_t x,const ssize_t y) +% MagickBooleanType MagickCompositeImageChannel(MagickWand *wand, +% const ChannelType channel,const MagickWand *composite_wand, +% const CompositeOperator compose,const ssize_t x,const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand holding the destination images +% +% o source_image: the magick wand holding source image. +% +% o compose: This operator affects how the composite is applied to the +% image. The default is Over. These are some of the compose methods +% availble. +% +% OverCompositeOp InCompositeOp OutCompositeOp +% AtopCompositeOp XorCompositeOp PlusCompositeOp +% MinusCompositeOp AddCompositeOp SubtractCompositeOp +% DifferenceCompositeOp BumpmapCompositeOp CopyCompositeOp +% DisplaceCompositeOp +% +% o x: the column offset of the composited image. +% +% o y: the row offset of the composited image. +% +*/ +WandExport MagickBooleanType MagickCompositeImage(MagickWand *wand, + const MagickWand *source_wand,const CompositeOperator compose,const ssize_t x, + const ssize_t y) +{ + MagickBooleanType + status; + + status=MagickCompositeImageChannel(wand,DefaultChannels,source_wand, + compose,x,y); + return(status); +} + +WandExport MagickBooleanType MagickCompositeImageChannel(MagickWand *wand, + const ChannelType channel,const MagickWand *source_wand, + const CompositeOperator compose,const ssize_t x,const ssize_t y) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || + (source_wand->images == (Image *) NULL)) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=CompositeImageChannel(wand->images,channel,compose, + source_wand->images,x,y); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o m p o s i t e I m a g e G r a v i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCompositeImageGravity() composite one image onto another using the +% specified gravity. +% +% The format of the MagickCompositeImageGravity method is: +% +% MagickBooleanType MagickCompositeImageGravity(MagickWand *wand, +% const MagickWand *source_wand,const CompositeOperator compose, +% const GravityType gravity) +% +% A description of each parameter follows: +% +% o wand: the magick wand holding the destination images +% +% o source_image: the magick wand holding source image. +% +% o compose: This operator affects how the composite is applied to the +% image. The default is Over. These are some of the compose methods +% availble. +% +% OverCompositeOp InCompositeOp OutCompositeOp +% AtopCompositeOp XorCompositeOp PlusCompositeOp +% MinusCompositeOp AddCompositeOp SubtractCompositeOp +% DifferenceCompositeOp BumpmapCompositeOp CopyCompositeOp +% DisplaceCompositeOp +% +% o gravity: positioning gravity (NorthWestGravity, NorthGravity, +% NorthEastGravity, WestGravity, CenterGravity, +% EastGravity, SouthWestGravity, SouthGravity, +% SouthEastGravity) +% +*/ +WandExport MagickBooleanType MagickCompositeImageGravity(MagickWand *wand, + const MagickWand *source_wand,const CompositeOperator compose, + const GravityType gravity) +{ + MagickBooleanType + status; + + RectangleInfo + geometry; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || + (source_wand->images == (Image *) NULL)) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + SetGeometry(source_wand->images,&geometry); + GravityAdjustGeometry(wand->images->columns,wand->images->rows,gravity, + &geometry); + status=CompositeImage(wand->images,compose,source_wand->images,geometry.x, + geometry.y); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o m p o s i t e L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCompositeLayers() composite the images in the source wand over the +% images in the destination wand in sequence, starting with the current +% image in both lists. +% +% Each layer from the two image lists are composted together until the end of +% one of the image lists is reached. The offset of each composition is also +% adjusted to match the virtual canvas offsets of each layer. As such the +% given offset is relative to the virtual canvas, and not the actual image. +% +% Composition uses given x and y offsets, as the 'origin' location of the +% source images virtual canvas (not the real image) allowing you to compose a +% list of 'layer images' into the destiantioni images. This makes it well +% sutiable for directly composing 'Clears Frame Animations' or 'Coaleased +% Animations' onto a static or other 'Coaleased Animation' destination image +% list. GIF disposal handling is not looked at. +% +% Special case:- If one of the image sequences is the last image (just a +% single image remaining), that image is repeatally composed with all the +% images in the other image list. Either the source or destination lists may +% be the single image, for this situation. +% +% In the case of a single destination image (or last image given), that image +% will ve cloned to match the number of images remaining in the source image +% list. +% +% This is equivelent to the "-layer Composite" Shell API operator. +% +% The format of the MagickCompositeLayers method is: +% +% MagickBooleanType MagickCompositeLayers(MagickWand *wand, +% const MagickWand *source_wand, const CompositeOperator compose, +% const ssize_t x,const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand holding destaintion images +% +% o source_wand: the wand holding the source images +% +% o compose, x, y: composition arguments +% +*/ +WandExport MagickBooleanType MagickCompositeLayers(MagickWand *wand, + const MagickWand *source_wand,const CompositeOperator compose,const ssize_t x, + const ssize_t y) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || + (source_wand->images == (Image *) NULL)) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + CompositeLayers(wand->images,compose,source_wand->images,x,y, + &wand->images->exception); + status=MagickTrue; /* FUTURE: determine status from exceptions */ + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o n t r a s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickContrastImage() enhances the intensity differences between the lighter +% and darker elements of the image. Set sharpen to a value other than 0 to +% increase the image contrast otherwise the contrast is reduced. +% +% The format of the MagickContrastImage method is: +% +% MagickBooleanType MagickContrastImage(MagickWand *wand, +% const MagickBooleanType sharpen) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o sharpen: Increase or decrease image contrast. +% +% +*/ +WandExport MagickBooleanType MagickContrastImage(MagickWand *wand, + const MagickBooleanType sharpen) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=ContrastImage(wand->images,sharpen); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o n t r a s t S t r e t c h I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickContrastStretchImage() enhances the contrast of a color image by +% adjusting the pixels color to span the entire range of colors available. +% You can also reduce the influence of a particular channel with a gamma +% value of 0. +% +% The format of the MagickContrastStretchImage method is: +% +% MagickBooleanType MagickContrastStretchImage(MagickWand *wand, +% const double black_point,const double white_point) +% MagickBooleanType MagickContrastStretchImageChannel(MagickWand *wand, +% const ChannelType channel,const double black_point, +% const double white_point) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o black_point: the black point. +% +% o white_point: the white point. +% +*/ + +WandExport MagickBooleanType MagickContrastStretchImage(MagickWand *wand, + const double black_point,const double white_point) +{ + MagickBooleanType + status; + + status=MagickContrastStretchImageChannel(wand,DefaultChannels,black_point, + white_point); + return(status); +} + +WandExport MagickBooleanType MagickContrastStretchImageChannel(MagickWand *wand, + const ChannelType channel,const double black_point,const double white_point) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=ContrastStretchImageChannel(wand->images,channel,black_point, + white_point); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o n v o l v e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickConvolveImage() applies a custom convolution kernel to the image. +% +% The format of the MagickConvolveImage method is: +% +% MagickBooleanType MagickConvolveImage(MagickWand *wand, +% const size_t order,const double *kernel) +% MagickBooleanType MagickConvolveImageChannel(MagickWand *wand, +% const ChannelType channel,const size_t order, +% const double *kernel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o order: the number of columns and rows in the filter kernel. +% +% o kernel: An array of doubles representing the convolution kernel. +% +*/ + +WandExport MagickBooleanType MagickConvolveImage(MagickWand *wand, + const size_t order,const double *kernel) +{ + MagickBooleanType + status; + + status=MagickConvolveImageChannel(wand,DefaultChannels,order,kernel); + return(status); +} + +WandExport MagickBooleanType MagickConvolveImageChannel(MagickWand *wand, + const ChannelType channel,const size_t order,const double *kernel) +{ + Image + *convolve_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (kernel == (const double *) NULL) + return(MagickFalse); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + convolve_image=ConvolveImageChannel(wand->images,channel,order,kernel, + wand->exception); + if (convolve_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,convolve_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C r o p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCropImage() extracts a region of the image. +% +% The format of the MagickCropImage method is: +% +% MagickBooleanType MagickCropImage(MagickWand *wand, +% const size_t width,const size_t height,const ssize_t x,const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the region width. +% +% o height: the region height. +% +% o x: the region x-offset. +% +% o y: the region y-offset. +% +*/ +WandExport MagickBooleanType MagickCropImage(MagickWand *wand, + const size_t width,const size_t height,const ssize_t x,const ssize_t y) +{ + Image + *crop_image; + + RectangleInfo + crop; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + crop.width=width; + crop.height=height; + crop.x=x; + crop.y=y; + crop_image=CropImage(wand->images,&crop,wand->exception); + if (crop_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,crop_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C y c l e C o l o r m a p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCycleColormapImage() displaces an image's colormap by a given number +% of positions. If you cycle the colormap a number of times you can produce +% a psychodelic effect. +% +% The format of the MagickCycleColormapImage method is: +% +% MagickBooleanType MagickCycleColormapImage(MagickWand *wand, +% const ssize_t displace) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o pixel_wand: the pixel wand. +% +*/ +WandExport MagickBooleanType MagickCycleColormapImage(MagickWand *wand, + const ssize_t displace) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=CycleColormapImage(wand->images,displace); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o n s t i t u t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickConstituteImage() adds an image to the wand comprised of the pixel +% data you supply. The pixel data must be in scanline order top-to-bottom. +% The data can be char, short int, int, float, or double. Float and double +% require the pixels to be normalized [0..1], otherwise [0..Max], where Max +% is the maximum value the type can accomodate (e.g. 255 for char). For +% example, to create a 640x480 image from unsigned red-green-blue character +% data, use +% +% MagickConstituteImage(wand,640,480,"RGB",CharPixel,pixels); +% +% The format of the MagickConstituteImage method is: +% +% MagickBooleanType MagickConstituteImage(MagickWand *wand, +% const size_t columns,const size_t rows,const char *map, +% const StorageType storage,void *pixels) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: width in pixels of the image. +% +% o rows: height in pixels of the image. +% +% o map: This string reflects the expected ordering of the pixel array. +% It can be any combination or order of R = red, G = green, B = blue, +% A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, +% Y = yellow, M = magenta, K = black, I = intensity (for grayscale), +% P = pad. +% +% o storage: Define the data type of the pixels. Float and double types are +% expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from +% these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, +% LongPixel, QuantumPixel, or ShortPixel. +% +% o pixels: This array of values contain the pixel components as defined by +% map and type. You must preallocate this array where the expected +% length varies depending on the values of width, height, map, and type. +% +*/ +WandExport MagickBooleanType MagickConstituteImage(MagickWand *wand, + const size_t columns,const size_t rows,const char *map, + const StorageType storage,const void *pixels) +{ + Image + *images; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + images=ConstituteImage(columns,rows,map,storage,pixels,wand->exception); + if (images == (Image *) NULL) + return(MagickFalse); + return(InsertImageInWand(wand,images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D e c i p h e r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDecipherImage() converts cipher pixels to plain pixels. +% +% The format of the MagickDecipherImage method is: +% +% MagickBooleanType MagickDecipherImage(MagickWand *wand, +% const char *passphrase) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o passphrase: the passphrase. +% +*/ +WandExport MagickBooleanType MagickDecipherImage(MagickWand *wand, + const char *passphrase) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(DecipherImage(wand->images,passphrase,&wand->images->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D e c o n s t r u c t I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDeconstructImages() compares each image with the next in a sequence +% and returns the maximum bounding region of any pixel differences it +% discovers. +% +% The format of the MagickDeconstructImages method is: +% +% MagickWand *MagickDeconstructImages(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *MagickDeconstructImages(MagickWand *wand) +{ + Image + *deconstruct_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + deconstruct_image=DeconstructImages(wand->images,wand->exception); + if (deconstruct_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,deconstruct_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D e s k e w I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDeskewImage() removes skew from the image. Skew is an artifact that +% occurs in scanned images because of the camera being misaligned, +% imperfections in the scanning or surface, or simply because the paper was +% not placed completely flat when scanned. +% +% The format of the MagickDeskewImage method is: +% +% MagickBooleanType MagickDeskewImage(MagickWand *wand, +% const double threshold) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o threshold: separate background from foreground. +% +*/ +WandExport MagickBooleanType MagickDeskewImage(MagickWand *wand, + const double threshold) +{ + Image + *sepia_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + sepia_image=DeskewImage(wand->images,threshold,wand->exception); + if (sepia_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,sepia_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D e s p e c k l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDespeckleImage() reduces the speckle noise in an image while +% perserving the edges of the original image. +% +% The format of the MagickDespeckleImage method is: +% +% MagickBooleanType MagickDespeckleImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickDespeckleImage(MagickWand *wand) +{ + Image + *despeckle_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + despeckle_image=DespeckleImage(wand->images,wand->exception); + if (despeckle_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,despeckle_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D e s t r o y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDestroyImage() dereferences an image, deallocating memory associated +% with the image if the reference count becomes zero. +% +% The format of the MagickDestroyImage method is: +% +% Image *MagickDestroyImage(Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +WandExport Image *MagickDestroyImage(Image *image) +{ + return(DestroyImage(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D i s p l a y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDisplayImage() displays an image. +% +% The format of the MagickDisplayImage method is: +% +% MagickBooleanType MagickDisplayImage(MagickWand *wand, +% const char *server_name) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o server_name: the X server name. +% +*/ +WandExport MagickBooleanType MagickDisplayImage(MagickWand *wand, + const char *server_name) +{ + Image + *image; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + image=CloneImage(wand->images,0,0,MagickTrue,wand->exception); + if (image == (Image *) NULL) + return(MagickFalse); + (void) CloneString(&wand->image_info->server_name,server_name); + status=DisplayImages(wand->image_info,image); + if (status == MagickFalse) + InheritException(wand->exception,&image->exception); + image=DestroyImage(image); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D i s p l a y I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDisplayImages() displays an image or image sequence. +% +% The format of the MagickDisplayImages method is: +% +% MagickBooleanType MagickDisplayImages(MagickWand *wand, +% const char *server_name) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o server_name: the X server name. +% +*/ +WandExport MagickBooleanType MagickDisplayImages(MagickWand *wand, + const char *server_name) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) CloneString(&wand->image_info->server_name,server_name); + status=DisplayImages(wand->image_info,wand->images); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D i s t o r t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDistortImage() distorts an image using various distortion methods, by +% mapping color lookups of the source image to a new destination image +% usally of the same size as the source image, unless 'bestfit' is set to +% true. +% +% If 'bestfit' is enabled, and distortion allows it, the destination image is +% adjusted to ensure the whole source 'image' will just fit within the final +% destination image, which will be sized and offset accordingly. Also in +% many cases the virtual offset of the source image will be taken into +% account in the mapping. +% +% The format of the MagickDistortImage method is: +% +% MagickBooleanType MagickDistortImage(MagickWand *wand, +% const DistortImageMethod method,const size_t number_arguments, +% const double *arguments,const MagickBooleanType bestfit) +% +% A description of each parameter follows: +% +% o image: the image to be distorted. +% +% o method: the method of image distortion. +% +% ArcDistortion always ignores the source image offset, and always +% 'bestfit' the destination image with the top left corner offset +% relative to the polar mapping center. +% +% Bilinear has no simple inverse mapping so it does not allow 'bestfit' +% style of image distortion. +% +% Affine, Perspective, and Bilinear, do least squares fitting of the +% distortion when more than the minimum number of control point pairs +% are provided. +% +% Perspective, and Bilinear, falls back to a Affine distortion when less +% that 4 control point pairs are provided. While Affine distortions let +% you use any number of control point pairs, that is Zero pairs is a +% no-Op (viewport only) distrotion, one pair is a translation and two +% pairs of control points do a scale-rotate-translate, without any +% shearing. +% +% o number_arguments: the number of arguments given for this distortion +% method. +% +% o arguments: the arguments for this distortion method. +% +% o bestfit: Attempt to resize destination to fit distorted source. +% +*/ +WandExport MagickBooleanType MagickDistortImage(MagickWand *wand, + const DistortImageMethod method,const size_t number_arguments, + const double *arguments,const MagickBooleanType bestfit) +{ + Image + *distort_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + distort_image=DistortImage(wand->images,method,number_arguments,arguments, + bestfit,wand->exception); + if (distort_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,distort_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D r a w I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDrawImage() renders the drawing wand on the current image. +% +% The format of the MagickDrawImage method is: +% +% MagickBooleanType MagickDrawImage(MagickWand *wand, +% const DrawingWand *drawing_wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o drawing_wand: the draw wand. +% +*/ +WandExport MagickBooleanType MagickDrawImage(MagickWand *wand, + const DrawingWand *drawing_wand) +{ + char + *primitive; + + DrawInfo + *draw_info; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + draw_info=PeekDrawingWand(drawing_wand); + if ((draw_info == (DrawInfo *) NULL) || + (draw_info->primitive == (char *) NULL)) + return(MagickFalse); + primitive=AcquireString(draw_info->primitive); + draw_info=DestroyDrawInfo(draw_info); + draw_info=CloneDrawInfo(wand->image_info,(DrawInfo *) NULL); + draw_info->primitive=primitive; + status=DrawImage(wand->images,draw_info); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + draw_info=DestroyDrawInfo(draw_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k E d g e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickEdgeImage() enhance edges within the image with a convolution filter +% of the given radius. Use a radius of 0 and Edge() selects a suitable +% radius for you. +% +% The format of the MagickEdgeImage method is: +% +% MagickBooleanType MagickEdgeImage(MagickWand *wand,const double radius) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o radius: the radius of the pixel neighborhood. +% +*/ +WandExport MagickBooleanType MagickEdgeImage(MagickWand *wand, + const double radius) +{ + Image + *edge_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + edge_image=EdgeImage(wand->images,radius,wand->exception); + if (edge_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,edge_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k E m b o s s I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickEmbossImage() returns a grayscale image with a three-dimensional +% effect. We convolve the image with a Gaussian operator of the given radius +% and standard deviation (sigma). For reasonable results, radius should be +% larger than sigma. Use a radius of 0 and Emboss() selects a suitable +% radius for you. +% +% The format of the MagickEmbossImage method is: +% +% MagickBooleanType MagickEmbossImage(MagickWand *wand,const double radius, +% const double sigma) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +*/ +WandExport MagickBooleanType MagickEmbossImage(MagickWand *wand, + const double radius,const double sigma) +{ + Image + *emboss_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + emboss_image=EmbossImage(wand->images,radius,sigma,wand->exception); + if (emboss_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,emboss_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k E n c i p h e r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickEncipherImage() converts plaint pixels to cipher pixels. +% +% The format of the MagickEncipherImage method is: +% +% MagickBooleanType MagickEncipherImage(MagickWand *wand, +% const char *passphrase) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o passphrase: the passphrase. +% +*/ +WandExport MagickBooleanType MagickEncipherImage(MagickWand *wand, + const char *passphrase) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(EncipherImage(wand->images,passphrase,&wand->images->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k E n h a n c e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickEnhanceImage() applies a digital filter that improves the quality of a +% noisy image. +% +% The format of the MagickEnhanceImage method is: +% +% MagickBooleanType MagickEnhanceImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickEnhanceImage(MagickWand *wand) +{ + Image + *enhance_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + enhance_image=EnhanceImage(wand->images,wand->exception); + if (enhance_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,enhance_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k E q u a l i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickEqualizeImage() equalizes the image histogram. +% +% The format of the MagickEqualizeImage method is: +% +% MagickBooleanType MagickEqualizeImage(MagickWand *wand) +% MagickBooleanType MagickEqualizeImageChannel(MagickWand *wand, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +*/ + +WandExport MagickBooleanType MagickEqualizeImage(MagickWand *wand) +{ + MagickBooleanType + status; + + status=MagickEqualizeImageChannel(wand,DefaultChannels); + return(status); +} + +WandExport MagickBooleanType MagickEqualizeImageChannel(MagickWand *wand, + const ChannelType channel) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=EqualizeImageChannel(wand->images,channel); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k E v a l u a t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickEvaluateImage() applys an arithmetic, relational, or logical +% expression to an image. Use these operators to lighten or darken an image, +% to increase or decrease contrast in an image, or to produce the "negative" +% of an image. +% +% The format of the MagickEvaluateImage method is: +% +% MagickBooleanType MagickEvaluateImage(MagickWand *wand, +% const MagickEvaluateOperator operator,const double value) +% MagickBooleanType MagickEvaluateImages(MagickWand *wand, +% const MagickEvaluateOperator operator) +% MagickBooleanType MagickEvaluateImageChannel(MagickWand *wand, +% const ChannelType channel,const MagickEvaluateOperator op, +% const double value) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the channel(s). +% +% o op: A channel operator. +% +% o value: A value value. +% +*/ + +WandExport MagickBooleanType MagickEvaluateImage(MagickWand *wand, + const MagickEvaluateOperator op,const double value) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=EvaluateImage(wand->images,op,value,&wand->images->exception); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +WandExport MagickWand *MagickEvaluateImages(MagickWand *wand, + const MagickEvaluateOperator op) +{ + Image + *evaluate_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + evaluate_image=EvaluateImages(wand->images,op,wand->exception); + if (evaluate_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,evaluate_image)); +} + +WandExport MagickBooleanType MagickEvaluateImageChannel(MagickWand *wand, + const ChannelType channel,const MagickEvaluateOperator op,const double value) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=EvaluateImageChannel(wand->images,channel,op,value, + &wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k E x p o r t I m a g e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickExportImagePixels() extracts pixel data from an image and returns it +% to you. The method returns MagickTrue on success otherwise MagickFalse if +% an error is encountered. The data is returned as char, short int, int, +% ssize_t, float, or double in the order specified by map. +% +% Suppose you want to extract the first scanline of a 640x480 image as +% character data in red-green-blue order: +% +% MagickExportImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels); +% +% The format of the MagickExportImagePixels method is: +% +% MagickBooleanType MagickExportImagePixels(MagickWand *wand, +% const ssize_t x,const ssize_t y,const size_t columns, +% const size_t rows,const char *map,const StorageType storage, +% void *pixels) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x, y, columns, rows: These values define the perimeter +% of a region of pixels you want to extract. +% +% o map: This string reflects the expected ordering of the pixel array. +% It can be any combination or order of R = red, G = green, B = blue, +% A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, +% Y = yellow, M = magenta, K = black, I = intensity (for grayscale), +% P = pad. +% +% o storage: Define the data type of the pixels. Float and double types are +% expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from +% these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, +% LongPixel, QuantumPixel, or ShortPixel. +% +% o pixels: This array of values contain the pixel components as defined by +% map and type. You must preallocate this array where the expected +% length varies depending on the values of width, height, map, and type. +% +*/ +WandExport MagickBooleanType MagickExportImagePixels(MagickWand *wand, + const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, + const char *map,const StorageType storage,void *pixels) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=ExportImagePixels(wand->images,x,y,columns,rows,map, + storage,pixels,wand->exception); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k E x t e n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickExtentImage() extends the image as defined by the geometry, gravity, +% and wand background color. Set the (x,y) offset of the geometry to move +% the original wand relative to the extended wand. +% +% The format of the MagickExtentImage method is: +% +% MagickBooleanType MagickExtentImage(MagickWand *wand,const size_t width, +% const size_t height,const ssize_t x,const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the region width. +% +% o height: the region height. +% +% o x: the region x offset. +% +% o y: the region y offset. +% +*/ +WandExport MagickBooleanType MagickExtentImage(MagickWand *wand, + const size_t width,const size_t height,const ssize_t x,const ssize_t y) +{ + Image + *extent_image; + + RectangleInfo + extent; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + extent.width=width; + extent.height=height; + extent.x=x; + extent.y=y; + extent_image=ExtentImage(wand->images,&extent,wand->exception); + if (extent_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,extent_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k F i l t e r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickFilterImage() applies a custom convolution kernel to the image. +% +% The format of the MagickFilterImage method is: +% +% MagickBooleanType MagickFilterImage(MagickWand *wand, +% const KernelInfo *kernel) +% MagickBooleanType MagickFilterImageChannel(MagickWand *wand, +% const ChannelType channel,const KernelInfo *kernel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o kernel: An array of doubles representing the convolution kernel. +% +*/ + +WandExport MagickBooleanType MagickFilterImage(MagickWand *wand, + const KernelInfo *kernel) +{ + MagickBooleanType + status; + + status=MagickFilterImageChannel(wand,DefaultChannels,kernel); + return(status); +} + +WandExport MagickBooleanType MagickFilterImageChannel(MagickWand *wand, + const ChannelType channel,const KernelInfo *kernel) +{ + Image + *filter_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (kernel == (const KernelInfo *) NULL) + return(MagickFalse); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + filter_image=FilterImageChannel(wand->images,channel,kernel,wand->exception); + if (filter_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,filter_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k F l i p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickFlipImage() creates a vertical mirror image by reflecting the pixels +% around the central x-axis. +% +% The format of the MagickFlipImage method is: +% +% MagickBooleanType MagickFlipImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickFlipImage(MagickWand *wand) +{ + Image + *flip_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + flip_image=FlipImage(wand->images,wand->exception); + if (flip_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,flip_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k F l o o d f i l l P a i n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickFloodfillPaintImage() changes the color value of any pixel that matches +% target and is an immediate neighbor. If the method FillToBorderMethod is +% specified, the color value is changed for any neighbor pixel that does not +% match the bordercolor member of image. +% +% The format of the MagickFloodfillPaintImage method is: +% +% MagickBooleanType MagickFloodfillPaintImage(MagickWand *wand, +% const ChannelType channel,const PixelWand *fill,const double fuzz, +% const PixelWand *bordercolor,const ssize_t x,const ssize_t y, +% const MagickBooleanType invert) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the channel(s). +% +% o fill: the floodfill color pixel wand. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +% o bordercolor: the border color pixel wand. +% +% o x,y: the starting location of the operation. +% +% o invert: paint any pixel that does not match the target color. +% +*/ +WandExport MagickBooleanType MagickFloodfillPaintImage(MagickWand *wand, + const ChannelType channel,const PixelWand *fill,const double fuzz, + const PixelWand *bordercolor,const ssize_t x,const ssize_t y, + const MagickBooleanType invert) +{ + DrawInfo + *draw_info; + + MagickBooleanType + status; + + MagickPixelPacket + target; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + draw_info=CloneDrawInfo(wand->image_info,(DrawInfo *) NULL); + PixelGetQuantumColor(fill,&draw_info->fill); + (void) GetOneVirtualMagickPixel(wand->images,x % wand->images->columns, + y % wand->images->rows,&target,wand->exception); + if (bordercolor != (PixelWand *) NULL) + PixelGetMagickColor(bordercolor,&target); + wand->images->fuzz=fuzz; + status=FloodfillPaintImage(wand->images,channel,draw_info,&target,x,y,invert); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + draw_info=DestroyDrawInfo(draw_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k F l o p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickFlopImage() creates a horizontal mirror image by reflecting the pixels +% around the central y-axis. +% +% The format of the MagickFlopImage method is: +% +% MagickBooleanType MagickFlopImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickFlopImage(MagickWand *wand) +{ + Image + *flop_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + flop_image=FlopImage(wand->images,wand->exception); + if (flop_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,flop_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k F o u r i e r T r a n s f o r m I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickForwardFourierTransformImage() implements the discrete Fourier +% transform (DFT) of the image either as a magnitude / phase or real / +% imaginary image pair. +% +% The format of the MagickForwardFourierTransformImage method is: +% +% MagickBooleanType MagickForwardFourierTransformImage(MagickWand *wand, +% const MagickBooleanType magnitude) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o magnitude: if true, return as magnitude / phase pair otherwise a real / +% imaginary image pair. +% +*/ +WandExport MagickBooleanType MagickForwardFourierTransformImage( + MagickWand *wand,const MagickBooleanType magnitude) +{ + Image + *forward_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + forward_image=ForwardFourierTransformImage(wand->images,magnitude, + wand->exception); + if (forward_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,forward_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k F r a m e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickFrameImage() adds a simulated three-dimensional border around the +% image. The width and height specify the border width of the vertical and +% horizontal sides of the frame. The inner and outer bevels indicate the +% width of the inner and outer shadows of the frame. +% +% The format of the MagickFrameImage method is: +% +% MagickBooleanType MagickFrameImage(MagickWand *wand, +% const PixelWand *matte_color,const size_t width, +% const size_t height,const ssize_t inner_bevel, +% const ssize_t outer_bevel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o matte_color: the frame color pixel wand. +% +% o width: the border width. +% +% o height: the border height. +% +% o inner_bevel: the inner bevel width. +% +% o outer_bevel: the outer bevel width. +% +*/ +WandExport MagickBooleanType MagickFrameImage(MagickWand *wand, + const PixelWand *matte_color,const size_t width,const size_t height, + const ssize_t inner_bevel,const ssize_t outer_bevel) +{ + Image + *frame_image; + + FrameInfo + frame_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + (void) memset(&frame_info,0,sizeof(frame_info)); + frame_info.width=wand->images->columns+2*width; + frame_info.height=wand->images->rows+2*height; + frame_info.x=(ssize_t) width; + frame_info.y=(ssize_t) height; + frame_info.inner_bevel=inner_bevel; + frame_info.outer_bevel=outer_bevel; + PixelGetQuantumColor(matte_color,&wand->images->matte_color); + frame_image=FrameImage(wand->images,&frame_info,wand->exception); + if (frame_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,frame_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k F u n c t i o n I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickFunctionImage() applys an arithmetic, relational, or logical +% expression to an image. Use these operators to lighten or darken an image, +% to increase or decrease contrast in an image, or to produce the "negative" +% of an image. +% +% The format of the MagickFunctionImage method is: +% +% MagickBooleanType MagickFunctionImage(MagickWand *wand, +% const MagickFunction function,const size_t number_arguments, +% const double *arguments) +% MagickBooleanType MagickFunctionImageChannel(MagickWand *wand, +% const ChannelType channel,const MagickFunction function, +% const size_t number_arguments,const double *arguments) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the channel(s). +% +% o function: the image function. +% +% o number_arguments: the number of function arguments. +% +% o arguments: the function arguments. +% +*/ + +WandExport MagickBooleanType MagickFunctionImage(MagickWand *wand, + const MagickFunction function,const size_t number_arguments, + const double *arguments) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=FunctionImage(wand->images,function,number_arguments,arguments, + &wand->images->exception); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +WandExport MagickBooleanType MagickFunctionImageChannel(MagickWand *wand, + const ChannelType channel,const MagickFunction function, + const size_t number_arguments,const double *arguments) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=FunctionImageChannel(wand->images,channel,function,number_arguments, + arguments,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k F x I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickFxImage() evaluate expression for each pixel in the image. +% +% The format of the MagickFxImage method is: +% +% MagickWand *MagickFxImage(MagickWand *wand,const char *expression) +% MagickWand *MagickFxImageChannel(MagickWand *wand, +% const ChannelType channel,const char *expression) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o expression: the expression. +% +*/ + +WandExport MagickWand *MagickFxImage(MagickWand *wand,const char *expression) +{ + MagickWand + *fx_wand; + + fx_wand=MagickFxImageChannel(wand,DefaultChannels,expression); + return(fx_wand); +} + +WandExport MagickWand *MagickFxImageChannel(MagickWand *wand, + const ChannelType channel,const char *expression) +{ + Image + *fx_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + fx_image=FxImageChannel(wand->images,channel,expression,wand->exception); + if (fx_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,fx_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G a m m a I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGammaImage() gamma-corrects an image. The same image viewed on +% different devices will have perceptual differences in the way the image's +% intensities are represented on the screen. Specify individual gamma levels +% for the red, green, and blue channels, or adjust all three with the gamma +% parameter. Values typically range from 0.8 to 2.3. +% +% You can also reduce the influence of a particular channel with a gamma +% value of 0. +% +% The format of the MagickGammaImage method is: +% +% MagickBooleanType MagickGammaImage(MagickWand *wand,const double gamma) +% MagickBooleanType MagickGammaImageChannel(MagickWand *wand, +% const ChannelType channel,const double gamma) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the channel. +% +% o level: Define the level of gamma correction. +% +*/ + +WandExport MagickBooleanType MagickGammaImage(MagickWand *wand, + const double gamma) +{ + MagickBooleanType + status; + + status=MagickGammaImageChannel(wand,DefaultChannels,gamma); + return(status); +} + +WandExport MagickBooleanType MagickGammaImageChannel(MagickWand *wand, + const ChannelType channel,const double gamma) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=GammaImageChannel(wand->images,channel,gamma); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G a u s s i a n B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGaussianBlurImage() blurs an image. We convolve the image with a +% Gaussian operator of the given radius and standard deviation (sigma). +% For reasonable results, the radius should be larger than sigma. Use a +% radius of 0 and MagickGaussianBlurImage() selects a suitable radius for you. +% +% The format of the MagickGaussianBlurImage method is: +% +% MagickBooleanType MagickGaussianBlurImage(MagickWand *wand, +% const double radius,const double sigma) +% MagickBooleanType MagickGaussianBlurImageChannel(MagickWand *wand, +% const ChannelType channel,const double radius,const double sigma) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +*/ + +WandExport MagickBooleanType MagickGaussianBlurImage(MagickWand *wand, + const double radius,const double sigma) +{ + MagickBooleanType + status; + + status=MagickGaussianBlurImageChannel(wand,DefaultChannels,radius,sigma); + return(status); +} + +WandExport MagickBooleanType MagickGaussianBlurImageChannel(MagickWand *wand, + const ChannelType channel,const double radius,const double sigma) +{ + Image + *blur_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + blur_image=GaussianBlurImageChannel(wand->images,channel,radius,sigma, + wand->exception); + if (blur_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,blur_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImage() gets the image at the current image index. +% +% The format of the MagickGetImage method is: +% +% MagickWand *MagickGetImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *MagickGetImage(MagickWand *wand) +{ + Image + *image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((MagickWand *) NULL); + } + image=CloneImage(wand->images,0,0,MagickTrue,wand->exception); + if (image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e A l p h a C h a n n e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageAlphaChannel() returns MagickFalse if the image alpha channel +% is not activated. That is, the image is RGB rather than RGBA or CMYK rather +% than CMYKA. +% +% The format of the MagickGetImageAlphaChannel method is: +% +% MagickBooleanType MagickGetImageAlphaChannel(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickGetImageAlphaChannel(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(GetImageAlphaChannel(wand->images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C l i p M a s k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageClipMask() gets the image clip mask at the current image index. +% +% The format of the MagickGetImageClipMask method is: +% +% MagickWand *MagickGetImageClipMask(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *MagickGetImageClipMask(MagickWand *wand) +{ + Image + *image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((MagickWand *) NULL); + } + image=GetImageClipMask(wand->images,wand->exception); + if (image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e B a c k g r o u n d C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageBackgroundColor() returns the image background color. +% +% The format of the MagickGetImageBackgroundColor method is: +% +% MagickBooleanType MagickGetImageBackgroundColor(MagickWand *wand, +% PixelWand *background_color) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o background_color: Return the background color. +% +*/ +WandExport MagickBooleanType MagickGetImageBackgroundColor(MagickWand *wand, + PixelWand *background_color) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelSetQuantumColor(background_color,&wand->images->background_color); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageBlob() implements direct to memory image formats. It returns +% the image as a blob (a formatted "file" in memory) and its length, starting +% from the current position in the image sequence. Use MagickSetImageFormat() +% to set the format to write to the blob (GIF, JPEG, PNG, etc.). +% +% Utilize MagickResetIterator() to ensure the write is from the beginning of +% the image sequence. +% +% Use MagickRelinquishMemory() to free the blob when you are done with it. +% +% The format of the MagickGetImageBlob method is: +% +% unsigned char *MagickGetImageBlob(MagickWand *wand,size_t *length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o length: the length of the blob. +% +*/ +WandExport unsigned char *MagickGetImageBlob(MagickWand *wand,size_t *length) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((unsigned char *) NULL); + } + return(ImageToBlob(wand->image_info,wand->images,length,wand->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e s B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImagesBlob() implements direct to memory image formats. It +% returns the image sequence as a blob and its length. The format of the image +% determines the format of the returned blob (GIF, JPEG, PNG, etc.). To +% return a different image format, use MagickSetImageFormat(). +% +% Note, some image formats do not permit multiple images to the same image +% stream (e.g. JPEG). in this instance, just the first image of the +% sequence is returned as a blob. +% +% The format of the MagickGetImagesBlob method is: +% +% unsigned char *MagickGetImagesBlob(MagickWand *wand,size_t *length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o length: the length of the blob. +% +*/ +WandExport unsigned char *MagickGetImagesBlob(MagickWand *wand,size_t *length) +{ + unsigned char + *blob; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((unsigned char *) NULL); + } + blob=ImagesToBlob(wand->image_info,GetFirstImageInList(wand->images),length, + wand->exception); + return(blob); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e B l u e P r i m a r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageBluePrimary() returns the chromaticy blue primary point for the +% image. +% +% The format of the MagickGetImageBluePrimary method is: +% +% MagickBooleanType MagickGetImageBluePrimary(MagickWand *wand,double *x, +% double *y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the chromaticity blue primary x-point. +% +% o y: the chromaticity blue primary y-point. +% +*/ +WandExport MagickBooleanType MagickGetImageBluePrimary(MagickWand *wand, + double *x,double *y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + *x=wand->images->chromaticity.blue_primary.x; + *y=wand->images->chromaticity.blue_primary.y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e B o r d e r C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageBorderColor() returns the image border color. +% +% The format of the MagickGetImageBorderColor method is: +% +% MagickBooleanType MagickGetImageBorderColor(MagickWand *wand, +% PixelWand *border_color) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o border_color: Return the border color. +% +*/ +WandExport MagickBooleanType MagickGetImageBorderColor(MagickWand *wand, + PixelWand *border_color) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelSetQuantumColor(border_color,&wand->images->border_color); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C h a n n e l D e p t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageChannelDepth() gets the depth for one or more image channels. +% +% The format of the MagickGetImageChannelDepth method is: +% +% size_t MagickGetImageChannelDepth(MagickWand *wand, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +*/ +WandExport size_t MagickGetImageChannelDepth(MagickWand *wand, + const ChannelType channel) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(GetImageChannelDepth(wand->images,channel,wand->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C h a n n e l D i s t o r t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageChannelDistortion() compares one or more image channels of an +% image to a reconstructed image and returns the specified distortion metric. +% +% The format of the MagickGetImageChannelDistortion method is: +% +% MagickBooleanType MagickGetImageChannelDistortion(MagickWand *wand, +% const MagickWand *reference,const ChannelType channel, +% const MetricType metric,double *distortion) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o reference: the reference wand. +% +% o channel: the channel. +% +% o metric: the metric. +% +% o distortion: the computed distortion between the images. +% +*/ +WandExport MagickBooleanType MagickGetImageChannelDistortion(MagickWand *wand, + const MagickWand *reference,const ChannelType channel,const MetricType metric, + double *distortion) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(reference != (MagickWand *) NULL); + assert(reference->signature == WandSignature); + if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL)) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=GetImageChannelDistortion(wand->images,reference->images,channel, + metric,distortion,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C h a n n e l D i s t o r t i o n s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageChannelDistortions() compares one or more image channels of an +% image to a reconstructed image and returns the specified distortion metrics. +% +% Use MagickRelinquishMemory() to free the metrics when you are done with them. +% +% The format of the MagickGetImageChannelDistortion method is: +% +% double *MagickGetImageChannelDistortion(MagickWand *wand, +% const MagickWand *reference,const MetricType metric) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o reference: the reference wand. +% +% o metric: the metric. +% +*/ +WandExport double *MagickGetImageChannelDistortions(MagickWand *wand, + const MagickWand *reference,const MetricType metric) +{ + double + *channel_distortion; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(reference != (MagickWand *) NULL); + assert(reference->signature == WandSignature); + if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL)) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((double *) NULL); + } + channel_distortion=GetImageChannelDistortions(wand->images,reference->images, + metric,&wand->images->exception); + return(channel_distortion); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C h a n n e l F e a t u r e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageChannelFeatures() returns features for each channel in the +% image in each of four directions (horizontal, vertical, left and right +% diagonals) for the specified distance. The features include the angular +% second moment, contrast, correlation, sum of squares: variance, inverse +% difference moment, sum average, sum varience, sum entropy, entropy, +% difference variance, difference entropy, information measures of +% correlation 1, information measures of correlation 2, and maximum +% correlation coefficient. You can access the red channel contrast, for +% example, like this: +% +% channel_features=MagickGetImageChannelFeatures(wand,1); +% contrast=channel_features[RedChannel].contrast[0]; +% +% Use MagickRelinquishMemory() to free the statistics buffer. +% +% The format of the MagickGetImageChannelFeatures method is: +% +% ChannelFeatures *MagickGetImageChannelFeatures(MagickWand *wand, +% const size_t distance) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o distance: the distance. +% +*/ +WandExport ChannelFeatures *MagickGetImageChannelFeatures(MagickWand *wand, + const size_t distance) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((ChannelFeatures *) NULL); + } + return(GetImageChannelFeatures(wand->images,distance,wand->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C h a n n e l K u r t o s i s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageChannelKurtosis() gets the kurtosis and skewness of one or +% more image channels. +% +% The format of the MagickGetImageChannelKurtosis method is: +% +% MagickBooleanType MagickGetImageChannelKurtosis(MagickWand *wand, +% const ChannelType channel,double *kurtosis,double *skewness) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o kurtosis: The kurtosis for the specified channel(s). +% +% o skewness: The skewness for the specified channel(s). +% +*/ +WandExport MagickBooleanType MagickGetImageChannelKurtosis(MagickWand *wand, + const ChannelType channel,double *kurtosis,double *skewness) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=GetImageChannelKurtosis(wand->images,channel,kurtosis,skewness, + wand->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C h a n n e l M e a n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageChannelMean() gets the mean and standard deviation of one or +% more image channels. +% +% The format of the MagickGetImageChannelMean method is: +% +% MagickBooleanType MagickGetImageChannelMean(MagickWand *wand, +% const ChannelType channel,double *mean,double *standard_deviation) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o mean: The mean pixel value for the specified channel(s). +% +% o standard_deviation: The standard deviation for the specified channel(s). +% +*/ +WandExport MagickBooleanType MagickGetImageChannelMean(MagickWand *wand, + const ChannelType channel,double *mean,double *standard_deviation) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=GetImageChannelMean(wand->images,channel,mean,standard_deviation, + wand->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C h a n n e l R a n g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageChannelRange() gets the range for one or more image channels. +% +% The format of the MagickGetImageChannelRange method is: +% +% MagickBooleanType MagickGetImageChannelRange(MagickWand *wand, +% const ChannelType channel,double *minima,double *maxima) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o minima: The minimum pixel value for the specified channel(s). +% +% o maxima: The maximum pixel value for the specified channel(s). +% +*/ +WandExport MagickBooleanType MagickGetImageChannelRange(MagickWand *wand, + const ChannelType channel,double *minima,double *maxima) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=GetImageChannelRange(wand->images,channel,minima,maxima, + wand->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C h a n n e l S t a t i s t i c s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageChannelStatistics() returns statistics for each channel in the +% image. The statistics include the channel depth, its minima and +% maxima, the mean, the standard deviation, the kurtosis and the skewness. +% You can access the red channel mean, for example, like this: +% +% channel_statistics=MagickGetImageChannelStatistics(wand); +% red_mean=channel_statistics[RedChannel].mean; +% +% Use MagickRelinquishMemory() to free the statistics buffer. +% +% The format of the MagickGetImageChannelStatistics method is: +% +% ChannelStatistics *MagickGetImageChannelStatistics(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ChannelStatistics *MagickGetImageChannelStatistics(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((ChannelStatistics *) NULL); + } + return(GetImageChannelStatistics(wand->images,wand->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C o l o r m a p C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageColormapColor() returns the color of the specified colormap +% index. +% +% The format of the MagickGetImageColormapColor method is: +% +% MagickBooleanType MagickGetImageColormapColor(MagickWand *wand, +% const size_t index,PixelWand *color) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o index: the offset into the image colormap. +% +% o color: Return the colormap color in this wand. +% +*/ +WandExport MagickBooleanType MagickGetImageColormapColor(MagickWand *wand, + const size_t index,PixelWand *color) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + if ((wand->images->colormap == (PixelPacket *) NULL) || + (index >= wand->images->colors)) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "InvalidColormapIndex","`%s'",wand->name); + return(MagickFalse); + } + PixelSetQuantumColor(color,wand->images->colormap+index); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C o l o r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageColors() gets the number of unique colors in the image. +% +% The format of the MagickGetImageColors method is: +% +% size_t MagickGetImageColors(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetImageColors(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(0); + } + return(GetNumberColors(wand->images,(FILE *) NULL,wand->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C o l o r s p a c e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageColorspace() gets the image colorspace. +% +% The format of the MagickGetImageColorspace method is: +% +% ColorspaceType MagickGetImageColorspace(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ColorspaceType MagickGetImageColorspace(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedColorspace); + } + return(wand->images->colorspace); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C o m p o s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageCompose() returns the composite operator associated with the +% image. +% +% The format of the MagickGetImageCompose method is: +% +% CompositeOperator MagickGetImageCompose(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport CompositeOperator MagickGetImageCompose(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedCompositeOp); + } + return(wand->images->compose); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C o m p r e s s i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageCompression() gets the image compression. +% +% The format of the MagickGetImageCompression method is: +% +% CompressionType MagickGetImageCompression(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport CompressionType MagickGetImageCompression(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedCompression); + } + return(wand->images->compression); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e C o m p r e s s i o n Q u a l i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageCompressionQuality() gets the image compression quality. +% +% The format of the MagickGetImageCompressionQuality method is: +% +% size_t MagickGetImageCompressionQuality(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetImageCompressionQuality(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(0UL); + } + return(wand->images->quality); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e D e l a y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageDelay() gets the image delay. +% +% The format of the MagickGetImageDelay method is: +% +% size_t MagickGetImageDelay(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetImageDelay(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(wand->images->delay); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e D e p t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageDepth() gets the image depth. +% +% The format of the MagickGetImageDepth method is: +% +% size_t MagickGetImageDepth(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetImageDepth(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(wand->images->depth); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e D i s t o r t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageDistortion() compares an image to a reconstructed image and +% returns the specified distortion metric. +% +% The format of the MagickGetImageDistortion method is: +% +% MagickBooleanType MagickGetImageDistortion(MagickWand *wand, +% const MagickWand *reference,const MetricType metric, +% double *distortion) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o reference: the reference wand. +% +% o metric: the metric. +% +% o distortion: the computed distortion between the images. +% +*/ +WandExport MagickBooleanType MagickGetImageDistortion(MagickWand *wand, + const MagickWand *reference,const MetricType metric,double *distortion) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL)) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=GetImageDistortion(wand->images,reference->images,metric,distortion, + &wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e D i s p o s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageDispose() gets the image disposal method. +% +% The format of the MagickGetImageDispose method is: +% +% DisposeType MagickGetImageDispose(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport DisposeType MagickGetImageDispose(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedDispose); + } + return((DisposeType) wand->images->dispose); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e E n d i a n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageEndian() gets the image endian. +% +% The format of the MagickGetImageEndian method is: +% +% EndianType MagickGetImageEndian(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport EndianType MagickGetImageEndian(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedEndian); + } + return(wand->images->endian); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e F i l e n a m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageFilename() returns the filename of a particular image in a +% sequence. +% +% The format of the MagickGetImageFilename method is: +% +% char *MagickGetImageFilename(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport char *MagickGetImageFilename(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((char *) NULL); + } + return(AcquireString(wand->images->filename)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e F o r m a t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageFormat() returns the format of a particular image in a +% sequence. +% +% The format of the MagickGetImageFormat method is: +% +% char *MagickGetImageFormat(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport char *MagickGetImageFormat(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((char *) NULL); + } + return(AcquireString(wand->images->magick)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e F u z z % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageFuzz() gets the image fuzz. +% +% The format of the MagickGetImageFuzz method is: +% +% double MagickGetImageFuzz(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport double MagickGetImageFuzz(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(0.0); + } + return(wand->images->fuzz); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e G a m m a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageGamma() gets the image gamma. +% +% The format of the MagickGetImageGamma method is: +% +% double MagickGetImageGamma(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport double MagickGetImageGamma(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(0.0); + } + return(wand->images->gamma); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e G r a v i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageGravity() gets the image gravity. +% +% The format of the MagickGetImageGravity method is: +% +% GravityType MagickGetImageGravity(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport GravityType MagickGetImageGravity(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedGravity); + } + return(wand->images->gravity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e G r e e n P r i m a r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageGreenPrimary() returns the chromaticy green primary point. +% +% The format of the MagickGetImageGreenPrimary method is: +% +% MagickBooleanType MagickGetImageGreenPrimary(MagickWand *wand,double *x, +% double *y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the chromaticity green primary x-point. +% +% o y: the chromaticity green primary y-point. +% +*/ +WandExport MagickBooleanType MagickGetImageGreenPrimary(MagickWand *wand, + double *x,double *y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + *x=wand->images->chromaticity.green_primary.x; + *y=wand->images->chromaticity.green_primary.y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e H e i g h t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageHeight() returns the image height. +% +% The format of the MagickGetImageHeight method is: +% +% size_t MagickGetImageHeight(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetImageHeight(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(wand->images->rows); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e H i s t o g r a m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageHistogram() returns the image histogram as an array of +% PixelWand wands. +% +% The format of the MagickGetImageHistogram method is: +% +% PixelWand **MagickGetImageHistogram(MagickWand *wand, +% size_t *number_colors) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o number_colors: the number of unique colors in the image and the number +% of pixel wands returned. +% +*/ +WandExport PixelWand **MagickGetImageHistogram(MagickWand *wand, + size_t *number_colors) +{ + ColorPacket + *histogram; + + PixelWand + **pixel_wands; + + ssize_t + i; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((PixelWand **) NULL); + } + histogram=GetImageHistogram(wand->images,number_colors,wand->exception); + if (histogram == (ColorPacket *) NULL) + return((PixelWand **) NULL); + pixel_wands=NewPixelWands(*number_colors); + for (i=0; i < (ssize_t) *number_colors; i++) + { + PixelSetQuantumColor(pixel_wands[i],&histogram[i].pixel); + PixelSetIndex(pixel_wands[i],histogram[i].index); + PixelSetColorCount(pixel_wands[i],(size_t) histogram[i].count); + } + histogram=(ColorPacket *) RelinquishMagickMemory(histogram); + return(pixel_wands); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e I n t e r l a c e S c h e m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageInterlaceScheme() gets the image interlace scheme. +% +% The format of the MagickGetImageInterlaceScheme method is: +% +% InterlaceType MagickGetImageInterlaceScheme(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport InterlaceType MagickGetImageInterlaceScheme(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedInterlace); + } + return(wand->images->interlace); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e I n t e r p o l a t e M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageInterpolateMethod() returns the interpolation method for the +% sepcified image. +% +% The format of the MagickGetImageInterpolateMethod method is: +% +% InterpolatePixelMethod MagickGetImageInterpolateMethod(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport InterpolatePixelMethod MagickGetImageInterpolateMethod( + MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedInterpolatePixel); + } + return(wand->images->interpolate); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e I t e r a t i o n s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageIterations() gets the image iterations. +% +% The format of the MagickGetImageIterations method is: +% +% size_t MagickGetImageIterations(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetImageIterations(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(wand->images->iterations); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e L e n g t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageLength() returns the image length in bytes. +% +% The format of the MagickGetImageLength method is: +% +% MagickBooleanType MagickGetImageLength(MagickWand *wand, +% MagickSizeType *length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o length: the image length in bytes. +% +*/ +WandExport MagickBooleanType MagickGetImageLength(MagickWand *wand, + MagickSizeType *length) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + *length=GetBlobSize(wand->images); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e M a t t e C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageMatteColor() returns the image matte color. +% +% The format of the MagickGetImageMatteColor method is: +% +% MagickBooleanType MagickGetImagematteColor(MagickWand *wand, +% PixelWand *matte_color) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o matte_color: Return the matte color. +% +*/ +WandExport MagickBooleanType MagickGetImageMatteColor(MagickWand *wand, + PixelWand *matte_color) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelSetQuantumColor(matte_color,&wand->images->matte_color); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e O r i e n t a t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageOrientation() returns the image orientation. +% +% The format of the MagickGetImageOrientation method is: +% +% OrientationType MagickGetImageOrientation(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport OrientationType MagickGetImageOrientation(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedOrientation); + } + return(wand->images->orientation); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e P a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImagePage() returns the page geometry associated with the image. +% +% The format of the MagickGetImagePage method is: +% +% MagickBooleanType MagickGetImagePage(MagickWand *wand, +% size_t *width,size_t *height,ssize_t *x,ssize_t *y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the page width. +% +% o height: the page height. +% +% o x: the page x-offset. +% +% o y: the page y-offset. +% +*/ +WandExport MagickBooleanType MagickGetImagePage(MagickWand *wand, + size_t *width,size_t *height,ssize_t *x,ssize_t *y) +{ + assert(wand != (const MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + *width=wand->images->page.width; + *height=wand->images->page.height; + *x=wand->images->page.x; + *y=wand->images->page.y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e P i x e l C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImagePixelColor() returns the color of the specified pixel. +% +% The format of the MagickGetImagePixelColor method is: +% +% MagickBooleanType MagickGetImagePixelColor(MagickWand *wand, +% const ssize_t x,const ssize_t y,PixelWand *color) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x,y: the pixel offset into the image. +% +% o color: Return the colormap color in this wand. +% +*/ +WandExport MagickBooleanType MagickGetImagePixelColor(MagickWand *wand, + const ssize_t x,const ssize_t y,PixelWand *color) +{ + IndexPacket + *indexes; + + const PixelPacket + *p; + + CacheView + *image_view; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + image_view=AcquireVirtualCacheView(wand->images,wand->exception); + p=GetCacheViewVirtualPixels(image_view,x,y,1,1,wand->exception); + if (p == (const PixelPacket *) NULL) + { + image_view=DestroyCacheView(image_view); + return(MagickFalse); + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + PixelSetQuantumColor(color,p); + if (GetCacheViewColorspace(image_view) == CMYKColorspace) + PixelSetBlackQuantum(color,*indexes); + else + if (GetCacheViewStorageClass(image_view) == PseudoClass) + PixelSetIndex(color,*indexes); + image_view=DestroyCacheView(image_view); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M a g i c k G e t I m a g e R a n g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageRange() gets the pixel range for the image. +% +% The format of the MagickGetImageRange method is: +% +% MagickBooleanType MagickGetImageRange(MagickWand *wand,double *minima, +% double *maxima) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o minima: The minimum pixel value for the specified channel(s). +% +% o maxima: The maximum pixel value for the specified channel(s). +% +*/ +WandExport MagickBooleanType MagickGetImageRange(MagickWand *wand, + double *minima,double *maxima) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=GetImageRange(wand->images,minima,maxima,wand->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e R e d P r i m a r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageRedPrimary() returns the chromaticy red primary point. +% +% The format of the MagickGetImageRedPrimary method is: +% +% MagickBooleanType MagickGetImageRedPrimary(MagickWand *wand,double *x, +% double *y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the chromaticity red primary x-point. +% +% o y: the chromaticity red primary y-point. +% +*/ +WandExport MagickBooleanType MagickGetImageRedPrimary(MagickWand *wand, + double *x,double *y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + *x=wand->images->chromaticity.red_primary.x; + *y=wand->images->chromaticity.red_primary.y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e R e g i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageRegion() extracts a region of the image and returns it as a +% a new wand. +% +% The format of the MagickGetImageRegion method is: +% +% MagickWand *MagickGetImageRegion(MagickWand *wand, +% const size_t width,const size_t height,const ssize_t x, +% const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the region width. +% +% o height: the region height. +% +% o x: the region x offset. +% +% o y: the region y offset. +% +*/ +WandExport MagickWand *MagickGetImageRegion(MagickWand *wand,const size_t width, + const size_t height,const ssize_t x,const ssize_t y) +{ + Image + *region_image; + + RectangleInfo + region; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + region.width=width; + region.height=height; + region.x=x; + region.y=y; + region_image=CropImage(wand->images,®ion,wand->exception); + if (region_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,region_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e R e n d e r i n g I n t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageRenderingIntent() gets the image rendering intent. +% +% The format of the MagickGetImageRenderingIntent method is: +% +% RenderingIntent MagickGetImageRenderingIntent(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport RenderingIntent MagickGetImageRenderingIntent(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedIntent); + } + return((RenderingIntent) wand->images->rendering_intent); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e R e s o l u t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageResolution() gets the image X and Y resolution. +% +% The format of the MagickGetImageResolution method is: +% +% MagickBooleanType MagickGetImageResolution(MagickWand *wand,double *x, +% double *y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the image x-resolution. +% +% o y: the image y-resolution. +% +*/ +WandExport MagickBooleanType MagickGetImageResolution(MagickWand *wand, + double *x,double *y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + *x=wand->images->x_resolution; + *y=wand->images->y_resolution; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e S c e n e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageScene() gets the image scene. +% +% The format of the MagickGetImageScene method is: +% +% size_t MagickGetImageScene(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetImageScene(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(wand->images->scene); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e S i g n a t u r e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageSignature() generates an SHA-256 message digest for the image +% pixel stream. +% +% The format of the MagickGetImageSignature method is: +% +% char *MagickGetImageSignature(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport char *MagickGetImageSignature(MagickWand *wand) +{ + const char + *value; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((char *) NULL); + } + status=SignatureImage(wand->images); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + value=GetImageProperty(wand->images,"signature"); + if (value != (const char *) NULL) + return(AcquireString(value)); + InheritException(wand->exception,&wand->images->exception); + return((char *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e T i c k s P e r S e c o n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageTicksPerSecond() gets the image ticks-per-second. +% +% The format of the MagickGetImageTicksPerSecond method is: +% +% size_t MagickGetImageTicksPerSecond(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetImageTicksPerSecond(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return((size_t) wand->images->ticks_per_second); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageType() gets the potential image type: +% +% Bilevel Grayscale GrayscaleMatte +% Palette PaletteMatte TrueColor +% TrueColorMatte ColorSeparation ColorSeparationMatte +% +% To ensure the image type matches its potential, use MagickSetImageType(): +% +% (void) MagickSetImageType(wand,MagickGetImageType(wand)); +% +% The format of the MagickGetImageType method is: +% +% ImageType MagickGetImageType(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ImageType MagickGetImageType(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedType); + } + return(GetImageType(wand->images,wand->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e U n i t s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageUnits() gets the image units of resolution. +% +% The format of the MagickGetImageUnits method is: +% +% ResolutionType MagickGetImageUnits(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ResolutionType MagickGetImageUnits(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedResolution); + } + return(wand->images->units); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e V i r t u a l P i x e l M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageVirtualPixelMethod() returns the virtual pixel method for the +% sepcified image. +% +% The format of the MagickGetImageVirtualPixelMethod method is: +% +% VirtualPixelMethod MagickGetImageVirtualPixelMethod(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport VirtualPixelMethod MagickGetImageVirtualPixelMethod(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(UndefinedVirtualPixelMethod); + } + return(GetImageVirtualPixelMethod(wand->images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e W h i t e P o i n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageWhitePoint() returns the chromaticy white point. +% +% The format of the MagickGetImageWhitePoint method is: +% +% MagickBooleanType MagickGetImageWhitePoint(MagickWand *wand,double *x, +% double *y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the chromaticity white x-point. +% +% o y: the chromaticity white y-point. +% +*/ +WandExport MagickBooleanType MagickGetImageWhitePoint(MagickWand *wand, + double *x,double *y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + *x=wand->images->chromaticity.white_point.x; + *y=wand->images->chromaticity.white_point.y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e W i d t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageWidth() returns the image width. +% +% The format of the MagickGetImageWidth method is: +% +% size_t MagickGetImageWidth(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetImageWidth(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(wand->images->columns); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t N u m b e r I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetNumberImages() returns the number of images associated with a +% magick wand. +% +% The format of the MagickGetNumberImages method is: +% +% size_t MagickGetNumberImages(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetNumberImages(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(GetImageListLength(wand->images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k I m a g e G e t T o t a l I n k D e n s i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageTotalInkDensity() gets the image total ink density. +% +% The format of the MagickGetImageTotalInkDensity method is: +% +% double MagickGetImageTotalInkDensity(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport double MagickGetImageTotalInkDensity(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(0.0); + } + return(GetImageTotalInkDensity(wand->images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k H a l d C l u t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickHaldClutImage() replaces colors in the image from a Hald color lookup +% table. A Hald color lookup table is a 3-dimensional color cube mapped to 2 +% dimensions. Create it with the HALD coder. You can apply any color +% transformation to the Hald image and then use this method to apply the +% transform to the image. +% +% The format of the MagickHaldClutImage method is: +% +% MagickBooleanType MagickHaldClutImage(MagickWand *wand, +% const MagickWand *hald_wand) +% MagickBooleanType MagickHaldClutImageChannel(MagickWand *wand, +% const ChannelType channel,const MagickWand *hald_wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o hald_image: the hald CLUT image. +% +*/ + +WandExport MagickBooleanType MagickHaldClutImage(MagickWand *wand, + const MagickWand *hald_wand) +{ + MagickBooleanType + status; + + status=MagickHaldClutImageChannel(wand,DefaultChannels,hald_wand); + return(status); +} + +WandExport MagickBooleanType MagickHaldClutImageChannel(MagickWand *wand, + const ChannelType channel,const MagickWand *hald_wand) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || (hald_wand->images == (Image *) NULL)) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=HaldClutImageChannel(wand->images,channel,hald_wand->images); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k H a s N e x t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickHasNextImage() returns MagickTrue if the wand has more images when +% traversing the list in the forward direction +% +% The format of the MagickHasNextImage method is: +% +% MagickBooleanType MagickHasNextImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickHasNextImage(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + if (GetNextImageInList(wand->images) == (Image *) NULL) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k H a s P r e v i o u s I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickHasPreviousImage() returns MagickTrue if the wand has more images when +% traversing the list in the reverse direction +% +% The format of the MagickHasPreviousImage method is: +% +% MagickBooleanType MagickHasPreviousImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickHasPreviousImage(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + if (GetPreviousImageInList(wand->images) == (Image *) NULL) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k I d e n t i f y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickIdentifyImage() identifies an image by printing its attributes to the +% file. Attributes include the image width, height, size, and others. +% +% The format of the MagickIdentifyImage method is: +% +% const char *MagickIdentifyImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport char *MagickIdentifyImage(MagickWand *wand) +{ + char + *description, + filename[MaxTextExtent]; + + FILE + *file; + + int + unique_file; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((char *) NULL); + } + description=(char *) NULL; + unique_file=AcquireUniqueFileResource(filename); + file=(FILE *) NULL; + if (unique_file != -1) + file=fdopen(unique_file,"wb"); + if ((unique_file == -1) || (file == (FILE *) NULL)) + { + (void) RelinquishUniqueFileResource(filename); + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "UnableToCreateTemporaryFile","`%s'",wand->name); + return((char *) NULL); + } + (void) IdentifyImage(wand->images,file,MagickTrue); + (void) fclose(file); + description=FileToString(filename,~0UL,wand->exception); + (void) RelinquishUniqueFileResource(filename); + return(description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k I m p l o d e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickImplodeImage() creates a new image that is a copy of an existing +% one with the image pixels "implode" by the specified percentage. It +% allocates the memory necessary for the new Image structure and returns a +% pointer to the new image. +% +% The format of the MagickImplodeImage method is: +% +% MagickBooleanType MagickImplodeImage(MagickWand *wand, +% const double radius) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o amount: Define the extent of the implosion. +% +*/ +WandExport MagickBooleanType MagickImplodeImage(MagickWand *wand, + const double amount) +{ + Image + *implode_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + implode_image=ImplodeImage(wand->images,amount,wand->exception); + if (implode_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,implode_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k I m p o r t I m a g e P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickImportImagePixels() accepts pixel datand stores it in the image at the +% location you specify. The method returns MagickTrue on success otherwise +% MagickFalse if an error is encountered. The pixel data can be either char, +% short int, int, ssize_t, float, or double in the order specified by map. +% +% Suppose your want to upload the first scanline of a 640x480 image from +% character data in red-green-blue order: +% +% MagickImportImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels); +% +% The format of the MagickImportImagePixels method is: +% +% MagickBooleanType MagickImportImagePixels(MagickWand *wand, +% const ssize_t x,const ssize_t y,const size_t columns, +% const size_t rows,const char *map,const StorageType storage, +% const void *pixels) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x, y, columns, rows: These values define the perimeter of a region +% of pixels you want to define. +% +% o map: This string reflects the expected ordering of the pixel array. +% It can be any combination or order of R = red, G = green, B = blue, +% A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, +% Y = yellow, M = magenta, K = black, I = intensity (for grayscale), +% P = pad. +% +% o storage: Define the data type of the pixels. Float and double types are +% expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from +% these types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel, +% or DoublePixel. +% +% o pixels: This array of values contain the pixel components as defined by +% map and type. You must preallocate this array where the expected +% length varies depending on the values of width, height, map, and type. +% +*/ +WandExport MagickBooleanType MagickImportImagePixels(MagickWand *wand, + const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, + const char *map,const StorageType storage,const void *pixels) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=ImportImagePixels(wand->images,x,y,columns,rows,map,storage,pixels); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k I n v e r s e F o u r i e r T r a n s f o r m I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickInverseFourierTransformImage() implements the inverse discrete +% Fourier transform (DFT) of the image either as a magnitude / phase or real / +% imaginary image pair. +% +% The format of the MagickInverseFourierTransformImage method is: +% +% MagickBooleanType MagickInverseFourierTransformImage( +% MagickWand *magnitude_wand,MagickWand *phase_wand, +% const MagickBooleanType magnitude) +% +% A description of each parameter follows: +% +% o magnitude_wand: the magnitude or real wand. +% +% o phase_wand: the phase or imaginary wand. +% +% o magnitude: if true, return as magnitude / phase pair otherwise a real / +% imaginary image pair. +% +*/ +WandExport MagickBooleanType MagickInverseFourierTransformImage( + MagickWand *magnitude_wand,MagickWand *phase_wand, + const MagickBooleanType magnitude) +{ + Image + *inverse_image; + + MagickWand + *wand; + + assert(magnitude_wand != (MagickWand *) NULL); + assert(magnitude_wand->signature == WandSignature); + if (magnitude_wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s", + magnitude_wand->name); + wand=magnitude_wand; + if (magnitude_wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages", + magnitude_wand->name); + assert(phase_wand != (MagickWand *) NULL); + assert(phase_wand->signature == WandSignature); + inverse_image=InverseFourierTransformImage(magnitude_wand->images, + phase_wand->images,magnitude,wand->exception); + if (inverse_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,inverse_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k L a b e l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickLabelImage() adds a label to your image. +% +% The format of the MagickLabelImage method is: +% +% MagickBooleanType MagickLabelImage(MagickWand *wand,const char *label) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o label: the image label. +% +*/ +WandExport MagickBooleanType MagickLabelImage(MagickWand *wand, + const char *label) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=SetImageProperty(wand->images,"label",label); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k L e v e l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickLevelImage() adjusts the levels of an image by scaling the colors +% falling between specified white and black points to the full available +% quantum range. The parameters provided represent the black, mid, and white +% points. The black point specifies the darkest color in the image. Colors +% darker than the black point are set to zero. Mid point specifies a gamma +% correction to apply to the image. White point specifies the lightest color +% in the image. Colors brighter than the white point are set to the maximum +% quantum value. +% +% The format of the MagickLevelImage method is: +% +% MagickBooleanType MagickLevelImage(MagickWand *wand, +% const double black_point,const double gamma,const double white_point) +% MagickBooleanType MagickLevelImageChannel(MagickWand *wand, +% const ChannelType channel,const double black_point,const double gamma, +% const double white_point) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: Identify which channel to level: RedChannel, GreenChannel, etc. +% +% o black_point: the black point. +% +% o gamma: the gamma. +% +% o white_point: the white point. +% +*/ + +WandExport MagickBooleanType MagickLevelImage(MagickWand *wand, + const double black_point,const double gamma,const double white_point) +{ + MagickBooleanType + status; + + status=MagickLevelImageChannel(wand,DefaultChannels,black_point,gamma, + white_point); + return(status); +} + +WandExport MagickBooleanType MagickLevelImageChannel(MagickWand *wand, + const ChannelType channel,const double black_point,const double gamma, + const double white_point) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=LevelImageChannel(wand->images,channel,black_point,white_point,gamma); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k L e v e l I m a g e C o l o r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickLevelImageColors() maps the given color to "black" and "white" values, +% linearly spreading out the colors, and level values on a channel by channel +% bases, as per LevelImage(). The given colors allows you to specify +% different level ranges for each of the color channels separately. +% +% The format of the MagickLevelImageColors method is: +% +% MagickBooleanType MagickLevelImageColors(MagickWand *wand, +% const PixelWand *black_color,const PixelWand *white_color, +% const MagickBooleanType invert) +% MagickBooleanType MagickLevelImageColorsChannel(MagickWand *wand, +% const ChannelType channel,const PixelWand *black_color, +% const PixelWand *white_color,const MagickBooleanType invert) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: Identify which channel to level: RedChannel, GreenChannel, etc. +% +% o black_color: the black color. +% +% o white_color: the white color. +% +% o invert: if true map the colors (levelize), rather than from (level) +% +*/ + +WandExport MagickBooleanType MagickLevelImageColors(MagickWand *wand, + const PixelWand *black_color,const PixelWand *white_color, + const MagickBooleanType invert) +{ + MagickBooleanType + status; + + status=MagickLevelImageColorsChannel(wand,DefaultChannels,black_color, + white_color,invert); + return(status); +} + +WandExport MagickBooleanType MagickLevelImageColorsChannel(MagickWand *wand, + const ChannelType channel,const PixelWand *black_color, + const PixelWand *white_color,const MagickBooleanType invert) +{ + MagickBooleanType + status; + + MagickPixelPacket + black, + white; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelGetMagickColor(black_color,&black); + PixelGetMagickColor(white_color,&white); + status=LevelColorsImageChannel(wand->images,channel,&black,&white,invert); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k L e v e l i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickLevelizeImage() applies the reversed MagickLevelImage(). It compresses +% the full range of color values, so that they lie between the given black and +% white points. Gamma is applied before the values are mapped. It can be +% used to de-contrast a greyscale image to the exact levels specified. +% +% The format of the MagickLevelizeImage method is: +% +% MagickBooleanType MagickLevelizeImage(MagickWand *wand, +% const double black_point,const double gamma,const double white_point) +% MagickBooleanType MagickLevelizeImageChannel(MagickWand *wand, +% const ChannelType channel,const double black_point,const double gamma, +% const double white_point) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: Identify which channel to level: RedChannel, GreenChannel, etc. +% +% o black_point: The level to map zero (black) to. +% +% o gamma: adjust gamma by this factor before mapping values. +% +% o white_point: The level to map QuantumRange (white) to. +% +*/ + +WandExport MagickBooleanType MagickLevelizeImage(MagickWand *wand, + const double black_point,const double gamma,const double white_point) +{ + MagickBooleanType + status; + + status=MagickLevelizeImageChannel(wand,DefaultChannels,black_point,gamma, + white_point); + return(status); +} + +WandExport MagickBooleanType MagickLevelizeImageChannel(MagickWand *wand, + const ChannelType channel,const double black_point,const double gamma, + const double white_point) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=LevelizeImageChannel(wand->images,channel,black_point,white_point, + gamma); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k L i n e a r S t r e t c h I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickLinearStretchImage() stretches with saturation the image intensity. +% +% You can also reduce the influence of a particular channel with a gamma +% value of 0. +% +% The format of the MagickLinearStretchImage method is: +% +% MagickBooleanType MagickLinearStretchImage(MagickWand *wand, +% const double black_point,const double white_point) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o black_point: the black point. +% +% o white_point: the white point. +% +*/ +WandExport MagickBooleanType MagickLinearStretchImage(MagickWand *wand, + const double black_point,const double white_point) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=LinearStretchImage(wand->images,black_point,white_point); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k L i q u i d R e s c a l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickLiquidRescaleImage() rescales image with seam carving. +% +% MagickBooleanType MagickLiquidRescaleImage(MagickWand *wand, +% const size_t columns,const size_t rows,const double delta_x, +% const double rigidity) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: the number of columns in the scaled image. +% +% o rows: the number of rows in the scaled image. +% +% o delta_x: maximum seam transversal step (0 means straight seams). +% +% o rigidity: introduce a bias for non-straight seams (typically 0). +% +*/ +WandExport MagickBooleanType MagickLiquidRescaleImage(MagickWand *wand, + const size_t columns,const size_t rows,const double delta_x, + const double rigidity) +{ + Image + *rescale_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + rescale_image=LiquidRescaleImage(wand->images,columns,rows,delta_x, + rigidity,wand->exception); + if (rescale_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,rescale_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k L o c a l C o n t r a s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickLocalContrastImage() attempts to increase the appearance of +% large-scale light-dark transitions. Local contrast enhancement works +% similarly to sharpening with an unsharp mask, however the mask is instead +% created using an image with a greater blur distance. +% +% MagickBooleanType MagickLocalContrastImage(MagickWand *wand, +% const double radius,const double strength) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o radius: the radius of the Gaussian, in pixels, not counting +% the center pixel. +% +% o strength: the strength of the blur mask in percentage. +% +*/ +WandExport MagickBooleanType MagickLocalContrastImage(MagickWand *wand, + const double radius,const double strength) +{ + Image + *contrast_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + contrast_image=LocalContrastImage(wand->images,radius,strength, + wand->exception); + if (contrast_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,contrast_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M a g n i f y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMagnifyImage() is a convenience method that scales an image +% proportionally to twice its original size. +% +% The format of the MagickMagnifyImage method is: +% +% MagickBooleanType MagickMagnifyImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickMagnifyImage(MagickWand *wand) +{ + Image + *magnify_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + magnify_image=MagnifyImage(wand->images,wand->exception); + if (magnify_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,magnify_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M e r g e I m a g e L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMergeImageLayers() composes all the image layers from the current +% given image onward to produce a single image of the merged layers. +% +% The inital canvas's size depends on the given ImageLayerMethod, and is +% initialized using the first images background color. The images +% are then compositied onto that image in sequence using the given +% composition that has been assigned to each individual image. +% +% The format of the MagickMergeImageLayers method is: +% +% MagickWand *MagickMergeImageLayers(MagickWand *wand, +% const ImageLayerMethod method) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o method: the method of selecting the size of the initial canvas. +% +% MergeLayer: Merge all layers onto a canvas just large enough +% to hold all the actual images. The virtual canvas of the +% first image is preserved but otherwise ignored. +% +% FlattenLayer: Use the virtual canvas size of first image. +% Images which fall outside this canvas is clipped. +% This can be used to 'fill out' a given virtual canvas. +% +% MosaicLayer: Start with the virtual canvas of the first image, +% enlarging left and right edges to contain all images. +% Images with negative offsets will be clipped. +% +*/ +WandExport MagickWand *MagickMergeImageLayers(MagickWand *wand, + const ImageLayerMethod method) +{ + Image + *mosaic_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + mosaic_image=MergeImageLayers(wand->images,method,wand->exception); + if (mosaic_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,mosaic_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M i n i f y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMinifyImage() is a convenience method that scales an image +% proportionally to one-half its original size +% +% The format of the MagickMinifyImage method is: +% +% MagickBooleanType MagickMinifyImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickMinifyImage(MagickWand *wand) +{ + Image + *minify_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + minify_image=MinifyImage(wand->images,wand->exception); + if (minify_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,minify_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M o d u l a t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickModulateImage() lets you control the brightness, saturation, and hue +% of an image. Hue is the percentage of absolute rotation from the current +% position. For example 50 results in a counter-clockwise rotation of 90 +% degrees, 150 results in a clockwise rotation of 90 degrees, with 0 and 200 +% both resulting in a rotation of 180 degrees. +% +% To increase the color brightness by 20% and decrease the color saturation by +% 10% and leave the hue unchanged, use: 120,90,100. +% +% The format of the MagickModulateImage method is: +% +% MagickBooleanType MagickModulateImage(MagickWand *wand, +% const double brightness,const double saturation,const double hue) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o brightness: the percent change in brighness. +% +% o saturation: the percent change in saturation. +% +% o hue: the percent change in hue. +% +*/ +WandExport MagickBooleanType MagickModulateImage(MagickWand *wand, + const double brightness,const double saturation,const double hue) +{ + char + modulate[MaxTextExtent]; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + (void) FormatLocaleString(modulate,MaxTextExtent,"%g,%g,%g", + brightness,saturation,hue); + status=ModulateImage(wand->images,modulate); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M o n t a g e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMontageImage() creates a composite image by combining several +% separate images. The images are tiled on the composite image with the name +% of the image optionally appearing just below the individual tile. +% +% The format of the MagickMontageImage method is: +% +% MagickWand *MagickMontageImage(MagickWand *wand, +% const DrawingWand drawing_wand,const char *tile_geometry, +% const char *thumbnail_geometry,const MontageMode mode, +% const char *frame) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o drawing_wand: the drawing wand. The font name, size, and color are +% obtained from this wand. +% +% o tile_geometry: the number of tiles per row and page (e.g. 6x4+0+0). +% +% o thumbnail_geometry: Preferred image size and border size of each +% thumbnail (e.g. 120x120+4+3>). +% +% o mode: Thumbnail framing mode: Frame, Unframe, or Concatenate. +% +% o frame: Surround the image with an ornamental border (e.g. 15x15+3+3). +% The frame color is that of the thumbnail's matte color. +% +*/ +WandExport MagickWand *MagickMontageImage(MagickWand *wand, + const DrawingWand *drawing_wand,const char *tile_geometry, + const char *thumbnail_geometry,const MontageMode mode,const char *frame) +{ + char + *font; + + Image + *montage_image; + + MontageInfo + *montage_info; + + PixelWand + *pixel_wand; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + montage_info=CloneMontageInfo(wand->image_info,(MontageInfo *) NULL); + switch (mode) + { + case FrameMode: + { + (void) CloneString(&montage_info->frame,"15x15+3+3"); + montage_info->shadow=MagickTrue; + break; + } + case UnframeMode: + { + montage_info->frame=(char *) NULL; + montage_info->shadow=MagickFalse; + montage_info->border_width=0; + break; + } + case ConcatenateMode: + { + montage_info->frame=(char *) NULL; + montage_info->shadow=MagickFalse; + (void) CloneString(&montage_info->geometry,"+0+0"); + montage_info->border_width=0; + break; + } + default: + break; + } + font=DrawGetFont(drawing_wand); + if (font != (char *) NULL) + (void) CloneString(&montage_info->font,font); + if (frame != (char *) NULL) + (void) CloneString(&montage_info->frame,frame); + montage_info->pointsize=DrawGetFontSize(drawing_wand); + pixel_wand=NewPixelWand(); + DrawGetFillColor(drawing_wand,pixel_wand); + PixelGetQuantumColor(pixel_wand,&montage_info->fill); + DrawGetStrokeColor(drawing_wand,pixel_wand); + PixelGetQuantumColor(pixel_wand,&montage_info->stroke); + pixel_wand=DestroyPixelWand(pixel_wand); + if (thumbnail_geometry != (char *) NULL) + (void) CloneString(&montage_info->geometry,thumbnail_geometry); + if (tile_geometry != (char *) NULL) + (void) CloneString(&montage_info->tile,tile_geometry); + montage_image=MontageImageList(wand->image_info,montage_info,wand->images, + wand->exception); + montage_info=DestroyMontageInfo(montage_info); + if (montage_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,montage_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M o r p h I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMorphImages() method morphs a set of images. Both the image pixels +% and size are linearly interpolated to give the appearance of a +% meta-morphosis from one image to the next. +% +% The format of the MagickMorphImages method is: +% +% MagickWand *MagickMorphImages(MagickWand *wand, +% const size_t number_frames) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o number_frames: the number of in-between images to generate. +% +*/ +WandExport MagickWand *MagickMorphImages(MagickWand *wand, + const size_t number_frames) +{ + Image + *morph_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + morph_image=MorphImages(wand->images,number_frames,wand->exception); + if (morph_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,morph_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M o r p h o l o g y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMorphologyImage() applies a user supplied kernel to the image +% according to the given mophology method. +% +% The format of the MagickMorphologyImage method is: +% +% MagickBooleanType MagickMorphologyImage(MagickWand *wand, +% const MorphologyMethod method,const ssize_t iterations, +% const KernelInfo *kernel) +% MagickBooleanType MagickMorphologyImageChannel(MagickWand *wand, +% ChannelType channel,const MorphologyMethod method, +% const ssize_t iterations,const KernelInfo *kernel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o method: the morphology method to be applied. +% +% o iterations: apply the operation this many times (or no change). +% A value of -1 means loop until no change found. How this is applied +% may depend on the morphology method. Typically this is a value of 1. +% +% o kernel: An array of doubles representing the morphology kernel. +% +*/ + +WandExport MagickBooleanType MagickMorphologyImage(MagickWand *wand, + const MorphologyMethod method,const ssize_t iterations, + const KernelInfo *kernel) +{ + MagickBooleanType + status; + + status=MagickMorphologyImageChannel(wand,DefaultChannels,method,iterations, + kernel); + return(status); +} + +WandExport MagickBooleanType MagickMorphologyImageChannel(MagickWand *wand, + const ChannelType channel,const MorphologyMethod method, + const ssize_t iterations,const KernelInfo *kernel) +{ + Image + *morphology_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (kernel == (const KernelInfo *) NULL) + return(MagickFalse); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + morphology_image=MorphologyImageChannel(wand->images,channel,method, + iterations,kernel,wand->exception); + if (morphology_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,morphology_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k M o t i o n B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickMotionBlurImage() simulates motion blur. We convolve the image with a +% Gaussian operator of the given radius and standard deviation (sigma). +% For reasonable results, radius should be larger than sigma. Use a +% radius of 0 and MotionBlurImage() selects a suitable radius for you. +% Angle gives the angle of the blurring motion. +% +% The format of the MagickMotionBlurImage method is: +% +% MagickBooleanType MagickMotionBlurImage(MagickWand *wand, +% const double radius,const double sigma,const double angle) +% MagickBooleanType MagickMotionBlurImageChannel(MagickWand *wand, +% const ChannelType channel,const double radius,const double sigma, +% const double angle) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o radius: the radius of the Gaussian, in pixels, not counting +% the center pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o angle: Apply the effect along this angle. +% +*/ + +WandExport MagickBooleanType MagickMotionBlurImage(MagickWand *wand, + const double radius,const double sigma,const double angle) +{ + MagickBooleanType + status; + + status=MagickMotionBlurImageChannel(wand,DefaultChannels,radius,sigma,angle); + return(status); +} + +WandExport MagickBooleanType MagickMotionBlurImageChannel(MagickWand *wand, + const ChannelType channel,const double radius,const double sigma, + const double angle) +{ + Image + *blur_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + blur_image=MotionBlurImageChannel(wand->images,channel,radius,sigma,angle, + wand->exception); + if (blur_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,blur_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k N e g a t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickNegateImage() negates the colors in the reference image. The +% Grayscale option means that only grayscale values within the image are +% negated. +% +% You can also reduce the influence of a particular channel with a gamma +% value of 0. +% +% The format of the MagickNegateImage method is: +% +% MagickBooleanType MagickNegateImage(MagickWand *wand, +% const MagickBooleanType gray) +% MagickBooleanType MagickNegateImageChannel(MagickWand *wand, +% const ChannelType channel,const MagickBooleanType gray) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o gray: If MagickTrue, only negate grayscale pixels within the image. +% +*/ + +WandExport MagickBooleanType MagickNegateImage(MagickWand *wand, + const MagickBooleanType gray) +{ + MagickBooleanType + status; + + status=MagickNegateImageChannel(wand,DefaultChannels,gray); + return(status); +} + +WandExport MagickBooleanType MagickNegateImageChannel(MagickWand *wand, + const ChannelType channel,const MagickBooleanType gray) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=NegateImageChannel(wand->images,channel,gray); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k N e w I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickNewImage() adds a blank image canvas of the specified size and +% background color to the wand. +% +% The format of the MagickNewImage method is: +% +% MagickBooleanType MagickNewImage(MagickWand *wand, +% const size_t columns,const size_t rows, +% const PixelWand *background) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the image width. +% +% o height: the image height. +% +% o background: the image color. +% +*/ +WandExport MagickBooleanType MagickNewImage(MagickWand *wand,const size_t width, + const size_t height,const PixelWand *background) +{ + Image + *images; + + MagickPixelPacket + pixel; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + PixelGetMagickColor(background,&pixel); + images=NewMagickImage(wand->image_info,width,height,&pixel); + if (images == (Image *) NULL) + return(MagickFalse); + if (images->exception.severity != UndefinedException) + InheritException(wand->exception,&images->exception); + return(InsertImageInWand(wand,images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k N e x t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickNextImage() sets the next image in the wand as the current image. +% +% It is typically used after MagickResetIterator(), after which its first use +% will set the first image as the current image (unless the wand is empty). +% +% It will return MagickFalse when no more images are left to be returned +% which happens when the wand is empty, or the current image is the last +% image. +% +% When the above condition (end of image list) is reached, the iterator is +% automaticall set so that you can start using MagickPreviousImage() to +% again iterate over the images in the reverse direction, starting with the +% last image (again). You can jump to this condition immeditally using +% MagickSetLastIterator(). +% +% The format of the MagickNextImage method is: +% +% MagickBooleanType MagickNextImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickNextImage(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->insert_before=MagickFalse; /* Inserts is now appended */ + if (wand->image_pending != MagickFalse) + { + wand->image_pending=MagickFalse; + return(MagickTrue); + } + if (GetNextImageInList(wand->images) == (Image *) NULL) + { + wand->image_pending=MagickTrue; /* No image, PreviousImage re-gets */ + return(MagickFalse); + } + wand->images=GetNextImageInList(wand->images); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k N o r m a l i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickNormalizeImage() enhances the contrast of a color image by adjusting +% the pixels color to span the entire range of colors available +% +% You can also reduce the influence of a particular channel with a gamma +% value of 0. +% +% The format of the MagickNormalizeImage method is: +% +% MagickBooleanType MagickNormalizeImage(MagickWand *wand) +% MagickBooleanType MagickNormalizeImageChannel(MagickWand *wand, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +*/ + +WandExport MagickBooleanType MagickNormalizeImage(MagickWand *wand) +{ + MagickBooleanType + status; + + status=MagickNormalizeImageChannel(wand,DefaultChannels); + return(status); +} + +WandExport MagickBooleanType MagickNormalizeImageChannel(MagickWand *wand, + const ChannelType channel) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=NormalizeImageChannel(wand->images,channel); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k O i l P a i n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickOilPaintImage() applies a special effect filter that simulates an oil +% painting. Each pixel is replaced by the most frequent color occurring +% in a circular region defined by radius. +% +% The format of the MagickOilPaintImage method is: +% +% MagickBooleanType MagickOilPaintImage(MagickWand *wand, +% const double radius) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o radius: the radius of the circular neighborhood. +% +*/ +WandExport MagickBooleanType MagickOilPaintImage(MagickWand *wand, + const double radius) +{ + Image + *paint_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + paint_image=OilPaintImage(wand->images,radius,wand->exception); + if (paint_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,paint_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k O p a q u e P a i n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickOpaquePaintImage() changes any pixel that matches color with the color +% defined by fill. +% +% The format of the MagickOpaquePaintImage method is: +% +% MagickBooleanType MagickOpaquePaintImage(MagickWand *wand, +% const PixelWand *target,const PixelWand *fill,const double fuzz, +% const MagickBooleanType invert) +% MagickBooleanType MagickOpaquePaintImageChannel(MagickWand *wand, +% const ChannelType channel,const PixelWand *target, +% const PixelWand *fill,const double fuzz,const MagickBooleanType invert) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the channel(s). +% +% o target: Change this target color to the fill color within the image. +% +% o fill: the fill pixel wand. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +% o invert: paint any pixel that does not match the target color. +% +*/ + +WandExport MagickBooleanType MagickOpaquePaintImage(MagickWand *wand, + const PixelWand *target,const PixelWand *fill,const double fuzz, + const MagickBooleanType invert) +{ + MagickBooleanType + status; + + status=MagickOpaquePaintImageChannel(wand,DefaultChannels,target,fill,fuzz, + invert); + return(status); +} + +WandExport MagickBooleanType MagickOpaquePaintImageChannel(MagickWand *wand, + const ChannelType channel,const PixelWand *target,const PixelWand *fill, + const double fuzz,const MagickBooleanType invert) +{ + MagickBooleanType + status; + + MagickPixelPacket + fill_pixel, + target_pixel; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelGetMagickColor(target,&target_pixel); + PixelGetMagickColor(fill,&fill_pixel); + wand->images->fuzz=fuzz; + status=OpaquePaintImageChannel(wand->images,channel,&target_pixel, + &fill_pixel,invert); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k O p t i m i z e I m a g e L a y e r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickOptimizeImageLayers() compares each image the GIF disposed forms of the +% previous image in the sequence. From this it attempts to select the +% smallest cropped image to replace each frame, while preserving the results +% of the animation. +% +% The format of the MagickOptimizeImageLayers method is: +% +% MagickWand *MagickOptimizeImageLayers(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *MagickOptimizeImageLayers(MagickWand *wand) +{ + Image + *optimize_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + optimize_image=OptimizeImageLayers(wand->images,wand->exception); + if (optimize_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,optimize_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k O p t i m i z e I m a g e T r a n s p a r e n c y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickOptimizeImageTransparency() takes a frame optimized GIF animation, and +% compares the overlayed pixels against the disposal image resulting from all +% the previous frames in the animation. Any pixel that does not change the +% disposal image (and thus does not effect the outcome of an overlay) is made +% transparent. +% +% WARNING: This modifies the current images directly, rather than generate +% a new image sequence. +% The format of the MagickOptimizeImageTransparency method is: +% +% MagickBooleanType MagickOptimizeImageTransparency(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickOptimizeImageTransparency(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if(wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return(MagickFalse); + OptimizeImageTransparency(wand->images,wand->exception); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k O r d e r e d P o s t e r i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickOrderedPosterizeImage() performs an ordered dither based on a number +% of pre-defined dithering threshold maps, but over multiple intensity levels, +% which can be different for different channels, according to the input +% arguments. +% +% The format of the MagickOrderedPosterizeImage method is: +% +% MagickBooleanType MagickOrderedPosterizeImage(MagickWand *wand, +% const char *threshold_map) +% MagickBooleanType MagickOrderedPosterizeImageChannel(MagickWand *wand, +% const ChannelType channel,const char *threshold_map) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o channel: the channel or channels to be thresholded. +% +% o threshold_map: A string containing the name of the threshold dither +% map to use, followed by zero or more numbers representing the number of +% color levels tho dither between. +% +% Any level number less than 2 is equivalent to 2, and means only binary +% dithering will be applied to each color channel. +% +% No numbers also means a 2 level (bitmap) dither will be applied to all +% channels, while a single number is the number of levels applied to each +% channel in sequence. More numbers will be applied in turn to each of +% the color channels. +% +% For example: "o3x3,6" generates a 6 level posterization of the image +% with a ordered 3x3 diffused pixel dither being applied between each +% level. While checker,8,8,4 will produce a 332 colormaped image with +% only a single checkerboard hash pattern (50% grey) between each color +% level, to basically double the number of color levels with a bare +% minimim of dithering. +% +*/ + +WandExport MagickBooleanType MagickOrderedPosterizeImage(MagickWand *wand, + const char *threshold_map) +{ + MagickBooleanType + status; + + status=MagickOrderedPosterizeImageChannel(wand,DefaultChannels,threshold_map); + return(status); +} + +WandExport MagickBooleanType MagickOrderedPosterizeImageChannel( + MagickWand *wand,const ChannelType channel,const char *threshold_map) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=OrderedPosterizeImageChannel(wand->images,channel,threshold_map, + wand->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P i n g I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickPingImage() is like MagickReadImage() except the only valid +% information returned is the image width, height, size, and format. It +% is designed to efficiently obtain this information from a file without +% reading the entire image sequence into memory. +% +% The format of the MagickPingImage method is: +% +% MagickBooleanType MagickPingImage(MagickWand *wand,const char *filename) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o filename: the image filename. +% +*/ +WandExport MagickBooleanType MagickPingImage(MagickWand *wand, + const char *filename) +{ + Image + *images; + + ImageInfo + *ping_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + ping_info=CloneImageInfo(wand->image_info); + if (filename != (const char *) NULL) + (void) CopyMagickString(ping_info->filename,filename,MaxTextExtent); + images=PingImage(ping_info,wand->exception); + ping_info=DestroyImageInfo(ping_info); + if (images == (Image *) NULL) + return(MagickFalse); + return(InsertImageInWand(wand,images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P i n g I m a g e B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickPingImageBlob() pings an image or image sequence from a blob. +% +% The format of the MagickPingImageBlob method is: +% +% MagickBooleanType MagickPingImageBlob(MagickWand *wand, +% const void *blob,const size_t length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o blob: the blob. +% +% o length: the blob length. +% +*/ +WandExport MagickBooleanType MagickPingImageBlob(MagickWand *wand, + const void *blob,const size_t length) +{ + Image + *images; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + images=PingBlob(wand->image_info,blob,length,wand->exception); + if (images == (Image *) NULL) + return(MagickFalse); + return(InsertImageInWand(wand,images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P i n g I m a g e F i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickPingImageFile() pings an image or image sequence from an open file +% descriptor. +% +% The format of the MagickPingImageFile method is: +% +% MagickBooleanType MagickPingImageFile(MagickWand *wand,FILE *file) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o file: the file descriptor. +% +*/ +WandExport MagickBooleanType MagickPingImageFile(MagickWand *wand,FILE *file) +{ + Image + *images; + + ImageInfo + *read_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + assert(file != (FILE *) NULL); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + read_info=CloneImageInfo(wand->image_info); + SetImageInfoFile(read_info,file); + images=PingImage(read_info,wand->exception); + read_info=DestroyImageInfo(read_info); + if (images == (Image *) NULL) + return(MagickFalse); + return(InsertImageInWand(wand,images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P o l a r o i d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickPolaroidImage() simulates a Polaroid picture. +% +% The format of the MagickPolaroidImage method is: +% +% MagickBooleanType MagickPolaroidImage(MagickWand *wand, +% const DrawingWand *drawing_wand,const double angle) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o drawing_wand: the draw wand. +% +% o angle: Apply the effect along this angle. +% +*/ +WandExport MagickBooleanType MagickPolaroidImage(MagickWand *wand, + const DrawingWand *drawing_wand,const double angle) +{ + DrawInfo + *draw_info; + + Image + *polaroid_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + draw_info=PeekDrawingWand(drawing_wand); + if (draw_info == (DrawInfo *) NULL) + return(MagickFalse); + polaroid_image=PolaroidImage(wand->images,draw_info,angle,wand->exception); + if (polaroid_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,polaroid_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P o s t e r i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickPosterizeImage() reduces the image to a limited number of color level. +% +% The format of the MagickPosterizeImage method is: +% +% MagickBooleanType MagickPosterizeImage(MagickWand *wand, +% const size_t levels,const MagickBooleanType dither) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o levels: Number of color levels allowed in each channel. Very low values +% (2, 3, or 4) have the most visible effect. +% +% o dither: Set this integer value to something other than zero to dither +% the mapped image. +% +*/ +WandExport MagickBooleanType MagickPosterizeImage(MagickWand *wand, + const size_t levels,const MagickBooleanType dither) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=PosterizeImage(wand->images,levels,dither); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P r e v i e w I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickPreviewImages() tiles 9 thumbnails of the specified image with an +% image processing operation applied at varying strengths. This helpful +% to quickly pin-point an appropriate parameter for an image processing +% operation. +% +% The format of the MagickPreviewImages method is: +% +% MagickWand *MagickPreviewImages(MagickWand *wand, +% const PreviewType preview) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o preview: the preview type. +% +*/ +WandExport MagickWand *MagickPreviewImages(MagickWand *wand, + const PreviewType preview) +{ + Image + *preview_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + preview_image=PreviewImage(wand->images,preview,wand->exception); + if (preview_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,preview_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P r e v i o u s I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickPreviousImage() sets the previous image in the wand as the current +% image. +% +% It is typically used after MagickSetLastIterator(), after which its first +% use will set the last image as the current image (unless the wand is empty). +% +% It will return MagickFalse when no more images are left to be returned +% which happens when the wand is empty, or the current image is the first +% image. At that point the iterator is than reset to again process images in +% the forward direction, again starting with the first image in list. Images +% added at this point are prepended. +% +% Also at that point any images added to the wand using MagickAddImages() or +% MagickReadImages() will be prepended before the first image. In this sense +% the condition is not quite exactly the same as MagickResetIterator(). +% +% The format of the MagickPreviousImage method is: +% +% MagickBooleanType MagickPreviousImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickPreviousImage(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + if (wand->image_pending != MagickFalse) + { + wand->image_pending=MagickFalse; /* image returned no longer pending */ + return(MagickTrue); + } + if (GetPreviousImageInList(wand->images) == (Image *) NULL) + { + wand->image_pending=MagickTrue; /* Next now re-gets first image */ + wand->insert_before=MagickTrue; /* insert/add prepends new images */ + return(MagickFalse); + } + wand->images=GetPreviousImageInList(wand->images); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k Q u a n t i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickQuantizeImage() analyzes the colors within a reference image and +% chooses a fixed number of colors to represent the image. The goal of the +% algorithm is to minimize the color difference between the input and output +% image while minimizing the processing time. +% +% The format of the MagickQuantizeImage method is: +% +% MagickBooleanType MagickQuantizeImage(MagickWand *wand, +% const size_t number_colors,const ColorspaceType colorspace, +% const size_t treedepth,const MagickBooleanType dither, +% const MagickBooleanType measure_error) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o number_colors: the number of colors. +% +% o colorspace: Perform color reduction in this colorspace, typically +% RGBColorspace. +% +% o treedepth: Normally, this integer value is zero or one. A zero or +% one tells Quantize to choose a optimal tree depth of Log4(number_colors).% A tree of this depth generally allows the best representation of the +% reference image with the least amount of memory and the fastest +% computational speed. In some cases, such as an image with low color +% dispersion (a few number of colors), a value other than +% Log4(number_colors) is required. To expand the color tree completely, +% use a value of 8. +% +% o dither: A value other than zero distributes the difference between an +% original image and the corresponding color reduced image to +% neighboring pixels along a Hilbert curve. +% +% o measure_error: A value other than zero measures the difference between +% the original and quantized images. This difference is the total +% quantization error. The error is computed by summing over all pixels +% in an image the distance squared in RGB space between each reference +% pixel value and its quantized value. +% +*/ +WandExport MagickBooleanType MagickQuantizeImage(MagickWand *wand, + const size_t number_colors,const ColorspaceType colorspace, + const size_t treedepth,const MagickBooleanType dither, + const MagickBooleanType measure_error) +{ + MagickBooleanType + status; + + QuantizeInfo + *quantize_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL); + quantize_info->number_colors=number_colors; + quantize_info->dither=dither; + quantize_info->tree_depth=treedepth; + quantize_info->colorspace=colorspace; + quantize_info->measure_error=measure_error; + status=QuantizeImage(quantize_info,wand->images); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + quantize_info=DestroyQuantizeInfo(quantize_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k Q u a n t i z e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickQuantizeImages() analyzes the colors within a sequence of images and +% chooses a fixed number of colors to represent the image. The goal of the +% algorithm is to minimize the color difference between the input and output +% image while minimizing the processing time. +% +% The format of the MagickQuantizeImages method is: +% +% MagickBooleanType MagickQuantizeImages(MagickWand *wand, +% const size_t number_colors,const ColorspaceType colorspace, +% const size_t treedepth,const MagickBooleanType dither, +% const MagickBooleanType measure_error) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o number_colors: the number of colors. +% +% o colorspace: Perform color reduction in this colorspace, typically +% RGBColorspace. +% +% o treedepth: Normally, this integer value is zero or one. A zero or +% one tells Quantize to choose a optimal tree depth of Log4(number_colors).% A tree of this depth generally allows the best representation of the +% reference image with the least amount of memory and the fastest +% computational speed. In some cases, such as an image with low color +% dispersion (a few number of colors), a value other than +% Log4(number_colors) is required. To expand the color tree completely, +% use a value of 8. +% +% o dither: A value other than zero distributes the difference between an +% original image and the corresponding color reduced algorithm to +% neighboring pixels along a Hilbert curve. +% +% o measure_error: A value other than zero measures the difference between +% the original and quantized images. This difference is the total +% quantization error. The error is computed by summing over all pixels +% in an image the distance squared in RGB space between each reference +% pixel value and its quantized value. +% +*/ +WandExport MagickBooleanType MagickQuantizeImages(MagickWand *wand, + const size_t number_colors,const ColorspaceType colorspace, + const size_t treedepth,const MagickBooleanType dither, + const MagickBooleanType measure_error) +{ + MagickBooleanType + status; + + QuantizeInfo + *quantize_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL); + quantize_info->number_colors=number_colors; + quantize_info->dither=dither; + quantize_info->tree_depth=treedepth; + quantize_info->colorspace=colorspace; + quantize_info->measure_error=measure_error; + status=QuantizeImages(quantize_info,wand->images); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + quantize_info=DestroyQuantizeInfo(quantize_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R a i s e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRaiseImage() creates a simulated three-dimensional button-like effect +% by lightening and darkening the edges of the image. Members width and +% height of raise_info define the width of the vertical and horizontal +% edge of the effect. +% +% The format of the MagickRaiseImage method is: +% +% MagickBooleanType MagickRaiseImage(MagickWand *wand, +% const size_t width,const size_t height,const ssize_t x, +% const ssize_t y,const MagickBooleanType raise) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width,height,x,y: Define the dimensions of the area to raise. +% +% o raise: A value other than zero creates a 3-D raise effect, +% otherwise it has a lowered effect. +% +*/ +WandExport MagickBooleanType MagickRaiseImage(MagickWand *wand, + const size_t width,const size_t height,const ssize_t x,const ssize_t y, + const MagickBooleanType raise) +{ + MagickBooleanType + status; + + RectangleInfo + raise_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + raise_info.width=width; + raise_info.height=height; + raise_info.x=x; + raise_info.y=y; + status=RaiseImage(wand->images,&raise_info,raise); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R a n d o m T h r e s h o l d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRandomThresholdImage() changes the value of individual pixels based on +% the intensity of each pixel compared to threshold. The result is a +% high-contrast, two color image. +% +% The format of the MagickRandomThresholdImage method is: +% +% MagickBooleanType MagickRandomThresholdImage(MagickWand *wand, +% const double low,const double high) +% MagickBooleanType MagickRandomThresholdImageChannel(MagickWand *wand, +% const ChannelType channel,const double low,const double high) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o low,high: Specify the high and low thresholds. These values range from +% 0 to QuantumRange. +% +*/ + +WandExport MagickBooleanType MagickRandomThresholdImage(MagickWand *wand, + const double low,const double high) +{ + MagickBooleanType + status; + + status=MagickRandomThresholdImageChannel(wand,DefaultChannels,low,high); + return(status); +} + +WandExport MagickBooleanType MagickRandomThresholdImageChannel(MagickWand *wand, + const ChannelType channel,const double low,const double high) +{ + char + threshold[MaxTextExtent]; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + (void) FormatLocaleString(threshold,MaxTextExtent,"%gx%g",low,high); + status=RandomThresholdImageChannel(wand->images,channel,threshold, + wand->exception); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e a d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickReadImage() reads an image or image sequence. The images are inserted +% at the current image pointer position. Use MagickSetFirstIterator(), +% MagickSetLastIterator, or MagickSetIteratorIndex() to specify the current +% image pointer position at the beginning of the image list, the end, or +% anywhere in-between respectively. +% +% The format of the MagickReadImage method is: +% +% MagickBooleanType MagickReadImage(MagickWand *wand,const char *filename) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o filename: the image filename. +% +*/ +WandExport MagickBooleanType MagickReadImage(MagickWand *wand, + const char *filename) +{ + Image + *images; + + ImageInfo + *read_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + read_info=CloneImageInfo(wand->image_info); + if (filename != (const char *) NULL) + (void) CopyMagickString(read_info->filename,filename,MaxTextExtent); + images=ReadImage(read_info,wand->exception); + read_info=DestroyImageInfo(read_info); + if (images == (Image *) NULL) + return(MagickFalse); + return(InsertImageInWand(wand,images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e a d I m a g e B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickReadImageBlob() reads an image or image sequence from a blob. +% +% The format of the MagickReadImageBlob method is: +% +% MagickBooleanType MagickReadImageBlob(MagickWand *wand, +% const void *blob,const size_t length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o blob: the blob. +% +% o length: the blob length. +% +*/ +WandExport MagickBooleanType MagickReadImageBlob(MagickWand *wand, + const void *blob,const size_t length) +{ + Image + *images; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + images=BlobToImage(wand->image_info,blob,length,wand->exception); + if (images == (Image *) NULL) + return(MagickFalse); + return(InsertImageInWand(wand,images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e a d I m a g e F i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickReadImageFile() reads an image or image sequence from an open file +% descriptor. +% +% The format of the MagickReadImageFile method is: +% +% MagickBooleanType MagickReadImageFile(MagickWand *wand,FILE *file) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o file: the file descriptor. +% +*/ +WandExport MagickBooleanType MagickReadImageFile(MagickWand *wand,FILE *file) +{ + Image + *images; + + ImageInfo + *read_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + assert(file != (FILE *) NULL); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + read_info=CloneImageInfo(wand->image_info); + SetImageInfoFile(read_info,file); + images=ReadImage(read_info,wand->exception); + read_info=DestroyImageInfo(read_info); + if (images == (Image *) NULL) + return(MagickFalse); + return(InsertImageInWand(wand,images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e m a p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRemapImage() replaces the colors of an image with the closest color +% from a reference image. +% +% The format of the MagickRemapImage method is: +% +% MagickBooleanType MagickRemapImage(MagickWand *wand, +% const MagickWand *remap_wand,const DitherMethod method) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o affinity: the affinity wand. +% +% o method: choose from these dither methods: NoDitherMethod, +% RiemersmaDitherMethod, or FloydSteinbergDitherMethod. +% +*/ +WandExport MagickBooleanType MagickRemapImage(MagickWand *wand, + const MagickWand *remap_wand,const DitherMethod method) +{ + MagickBooleanType + status; + + QuantizeInfo + *quantize_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || + (remap_wand->images == (Image *) NULL)) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + quantize_info=AcquireQuantizeInfo(wand->image_info); + quantize_info->dither_method=method; + if (method == NoDitherMethod) + quantize_info->dither=MagickFalse; + status=RemapImage(quantize_info,wand->images,remap_wand->images); + quantize_info=DestroyQuantizeInfo(quantize_info); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e m o v e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRemoveImage() removes an image from the image list. +% +% The format of the MagickRemoveImage method is: +% +% MagickBooleanType MagickRemoveImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o insert: the splice wand. +% +*/ +WandExport MagickBooleanType MagickRemoveImage(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + DeleteImageFromList(&wand->images); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e s a m p l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickResampleImage() resample image to desired resolution. +% +% Bessel Blackman Box +% Catrom Cubic Gaussian +% Hanning Hermite Lanczos +% Mitchell Point Quandratic +% Sinc Triangle +% +% Most of the filters are FIR (finite impulse response), however, Bessel, +% Gaussian, and Sinc are IIR (infinite impulse response). Bessel and Sinc +% are windowed (brought down to zero) with the Blackman filter. +% +% The format of the MagickResampleImage method is: +% +% MagickBooleanType MagickResampleImage(MagickWand *wand, +% const double x_resolution,const double y_resolution, +% const FilterTypes filter,const double blur) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x_resolution: the new image x resolution. +% +% o y_resolution: the new image y resolution. +% +% o filter: Image filter to use. +% +% o blur: the blur factor where > 1 is blurry, < 1 is sharp. +% +*/ +WandExport MagickBooleanType MagickResampleImage(MagickWand *wand, + const double x_resolution,const double y_resolution,const FilterTypes filter, + const double blur) +{ + Image + *resample_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + resample_image=ResampleImage(wand->images,x_resolution,y_resolution,filter, + blur,wand->exception); + if (resample_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,resample_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e s e t I m a g e P a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickResetImagePage() resets the Wand page canvas and position. +% +% The format of the MagickResetImagePage method is: +% +% MagickBooleanType MagickResetImagePage(MagickWand *wand, +% const char *page) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o page: the relative page specification. +% +*/ +WandExport MagickBooleanType MagickResetImagePage(MagickWand *wand, + const char *page) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + if ((page == (char *) NULL) || (*page == '\0')) + { + (void) ParseAbsoluteGeometry("0x0+0+0",&wand->images->page); + return(MagickTrue); + } + return(ResetImagePage(wand->images,page)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e s i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickResizeImage() scales an image to the desired dimensions with one of +% these filters: +% +% Bessel Blackman Box +% Catrom Cubic Gaussian +% Hanning Hermite Lanczos +% Mitchell Point Quandratic +% Sinc Triangle +% +% Most of the filters are FIR (finite impulse response), however, Bessel, +% Gaussian, and Sinc are IIR (infinite impulse response). Bessel and Sinc +% are windowed (brought down to zero) with the Blackman filter. +% +% The format of the MagickResizeImage method is: +% +% MagickBooleanType MagickResizeImage(MagickWand *wand, +% const size_t columns,const size_t rows, +% const FilterTypes filter,const double blur) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: the number of columns in the scaled image. +% +% o rows: the number of rows in the scaled image. +% +% o filter: Image filter to use. +% +% o blur: the blur factor where > 1 is blurry, < 1 is sharp. +% +*/ +WandExport MagickBooleanType MagickResizeImage(MagickWand *wand, + const size_t columns,const size_t rows,const FilterTypes filter, + const double blur) +{ + Image + *resize_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + resize_image=ResizeImage(wand->images,columns,rows,filter,blur, + wand->exception); + if (resize_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,resize_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R o l l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRollImage() offsets an image as defined by x and y. +% +% The format of the MagickRollImage method is: +% +% MagickBooleanType MagickRollImage(MagickWand *wand,const ssize_t x, +% const size_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the x offset. +% +% o y: the y offset. +% +*/ +WandExport MagickBooleanType MagickRollImage(MagickWand *wand,const ssize_t x, + const ssize_t y) +{ + Image + *roll_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + roll_image=RollImage(wand->images,x,y,wand->exception); + if (roll_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,roll_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R o t a t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRotateImage() rotates an image the specified number of degrees. Empty +% triangles left over from rotating the image are filled with the +% background color. +% +% The format of the MagickRotateImage method is: +% +% MagickBooleanType MagickRotateImage(MagickWand *wand, +% const PixelWand *background,const double degrees) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o background: the background pixel wand. +% +% o degrees: the number of degrees to rotate the image. +% +% +*/ +WandExport MagickBooleanType MagickRotateImage(MagickWand *wand, + const PixelWand *background,const double degrees) +{ + Image + *rotate_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelGetQuantumColor(background,&wand->images->background_color); + rotate_image=RotateImage(wand->images,degrees,wand->exception); + if (rotate_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,rotate_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R o t a t i o n a l B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRotationalBlurImage() rotational blurs an image. +% +% The format of the MagickRotationalBlurImage method is: +% +% MagickBooleanType MagickRotationalBlurImage(MagickWand *wand, +% const double angle) +% MagickBooleanType MagickRotationalBlurImageChannel(MagickWand *wand, +% const ChannelType channel,const double angle) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o angle: the angle of the blur in degrees. +% +*/ +WandExport MagickBooleanType MagickRotationalBlurImage(MagickWand *wand, + const double angle) +{ + MagickBooleanType + status; + + status=MagickRotationalBlurImageChannel(wand,DefaultChannels,angle); + return(status); +} + +WandExport MagickBooleanType MagickRotationalBlurImageChannel(MagickWand *wand, + const ChannelType channel,const double angle) +{ + Image + *blur_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + blur_image=RotationalBlurImageChannel(wand->images,channel,angle, + wand->exception); + if (blur_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,blur_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S a m p l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSampleImage() scales an image to the desired dimensions with pixel +% sampling. Unlike other scaling methods, this method does not introduce +% any additional color into the scaled image. +% +% The format of the MagickSampleImage method is: +% +% MagickBooleanType MagickSampleImage(MagickWand *wand, +% const size_t columns,const size_t rows) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: the number of columns in the scaled image. +% +% o rows: the number of rows in the scaled image. +% +*/ +WandExport MagickBooleanType MagickSampleImage(MagickWand *wand, + const size_t columns,const size_t rows) +{ + Image + *sample_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + sample_image=SampleImage(wand->images,columns,rows,wand->exception); + if (sample_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,sample_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S c a l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickScaleImage() scales the size of an image to the given dimensions. +% +% The format of the MagickScaleImage method is: +% +% MagickBooleanType MagickScaleImage(MagickWand *wand, +% const size_t columns,const size_t rows) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: the number of columns in the scaled image. +% +% o rows: the number of rows in the scaled image. +% +*/ +WandExport MagickBooleanType MagickScaleImage(MagickWand *wand, + const size_t columns,const size_t rows) +{ + Image + *scale_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + scale_image=ScaleImage(wand->images,columns,rows,wand->exception); + if (scale_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,scale_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e g m e n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSegmentImage() segments an image by analyzing the histograms of the +% color components and identifying units that are homogeneous with the fuzzy +% C-means technique. +% +% The format of the SegmentImage method is: +% +% MagickBooleanType MagickSegmentImage(MagickWand *wand, +% const ColorspaceType colorspace,const MagickBooleanType verbose, +% const double cluster_threshold,const double smooth_threshold) +% +% A description of each parameter follows. +% +% o wand: the wand. +% +% o colorspace: the image colorspace. +% +% o verbose: Set to MagickTrue to print detailed information about the +% identified classes. +% +% o cluster_threshold: This represents the minimum number of pixels +% contained in a hexahedra before it can be considered valid (expressed as +% a percentage). +% +% o smooth_threshold: the smoothing threshold eliminates noise in the second +% derivative of the histogram. As the value is increased, you can expect a +% smoother second derivative. +% +*/ +MagickExport MagickBooleanType MagickSegmentImage(MagickWand *wand, + const ColorspaceType colorspace,const MagickBooleanType verbose, + const double cluster_threshold,const double smooth_threshold) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=SegmentImage(wand->images,colorspace,verbose,cluster_threshold, + smooth_threshold); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e l e c t i v e B l u r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSelectiveBlurImage() selectively blur an image within a contrast +% threshold. It is similar to the unsharpen mask that sharpens everything with +% contrast above a certain threshold. +% +% The format of the MagickSelectiveBlurImage method is: +% +% MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand, +% const double radius,const double sigma,const double threshold) +% MagickBooleanType MagickSelectiveBlurImageChannel(MagickWand *wand, +% const ChannelType channel,const double radius,const double sigma, +% const double threshold) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o radius: the radius of the gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the gaussian, in pixels. +% +% o threshold: only pixels within this contrast threshold are included +% in the blur operation. +% +*/ + +WandExport MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand, + const double radius,const double sigma,const double threshold) +{ + MagickBooleanType + status; + + status=MagickSelectiveBlurImageChannel(wand,DefaultChannels,radius,sigma, + threshold); + return(status); +} + +WandExport MagickBooleanType MagickSelectiveBlurImageChannel(MagickWand *wand, + const ChannelType channel,const double radius,const double sigma, + const double threshold) +{ + Image + *blur_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + blur_image=SelectiveBlurImageChannel(wand->images,channel,radius,sigma, + threshold,wand->exception); + if (blur_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,blur_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e p a r a t e I m a g e C h a n n e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSeparateImageChannel() separates a channel from the image and returns a +% grayscale image. A channel is a particular color component of each pixel +% in the image. +% +% The format of the MagickSeparateImageChannel method is: +% +% MagickBooleanType MagickSeparateImageChannel(MagickWand *wand, +% const ChannelType channel) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +*/ +WandExport MagickBooleanType MagickSeparateImageChannel(MagickWand *wand, + const ChannelType channel) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=SeparateImageChannel(wand->images,channel); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e p i a T o n e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSepiaToneImage() applies a special effect to the image, similar to the +% effect achieved in a photo darkroom by sepia toning. Threshold ranges from +% 0 to QuantumRange and is a measure of the extent of the sepia toning. A +% threshold of 80% is a good starting point for a reasonable tone. +% +% The format of the MagickSepiaToneImage method is: +% +% MagickBooleanType MagickSepiaToneImage(MagickWand *wand, +% const double threshold) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o threshold: Define the extent of the sepia toning. +% +*/ +WandExport MagickBooleanType MagickSepiaToneImage(MagickWand *wand, + const double threshold) +{ + Image + *sepia_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + sepia_image=SepiaToneImage(wand->images,threshold,wand->exception); + if (sepia_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,sepia_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImage() replaces the last image returned by MagickSetIteratorIndex(), +% MagickNextImage(), MagickPreviousImage() with the images from the specified +% wand. +% +% The format of the MagickSetImage method is: +% +% MagickBooleanType MagickSetImage(MagickWand *wand, +% const MagickWand *set_wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o set_wand: the set_wand wand. +% +*/ +WandExport MagickBooleanType MagickSetImage(MagickWand *wand, + const MagickWand *set_wand) +{ + Image + *images; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(set_wand != (MagickWand *) NULL); + assert(set_wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",set_wand->name); + if (set_wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + images=CloneImageList(set_wand->images,wand->exception); + if (images == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,images); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e A l p h a C h a n n e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageAlphaChannel() activates, deactivates, resets, or sets the +% alpha channel. +% +% The format of the MagickSetImageAlphaChannel method is: +% +% MagickBooleanType MagickSetImageAlphaChannel(MagickWand *wand, +% const AlphaChannelType alpha_type) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o alpha_type: the alpha channel type: ActivateAlphaChannel, +% DeactivateAlphaChannel, OpaqueAlphaChannel, or SetAlphaChannel. +% +*/ +WandExport MagickBooleanType MagickSetImageAlphaChannel(MagickWand *wand, + const AlphaChannelType alpha_type) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(SetImageAlphaChannel(wand->images,alpha_type)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e B a c k g r o u n d C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageBackgroundColor() sets the image background color. +% +% The format of the MagickSetImageBackgroundColor method is: +% +% MagickBooleanType MagickSetImageBackgroundColor(MagickWand *wand, +% const PixelWand *background) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o background: the background pixel wand. +% +*/ +WandExport MagickBooleanType MagickSetImageBackgroundColor(MagickWand *wand, + const PixelWand *background) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelGetQuantumColor(background,&wand->images->background_color); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e B i a s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageBias() sets the image bias for any method that convolves an +% image (e.g. MagickConvolveImage()). +% +% The format of the MagickSetImageBias method is: +% +% MagickBooleanType MagickSetImageBias(MagickWand *wand, +% const double bias) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o bias: the image bias. +% +*/ +WandExport MagickBooleanType MagickSetImageBias(MagickWand *wand, + const double bias) +{ + char + option[MaxTextExtent]; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + (void) FormatLocaleString(option,MaxTextExtent,"%+g",bias); + (void) SetImageOption(wand->image_info,"bias",option); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e B l u e P r i m a r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageBluePrimary() sets the image chromaticity blue primary point. +% +% The format of the MagickSetImageBluePrimary method is: +% +% MagickBooleanType MagickSetImageBluePrimary(MagickWand *wand, +% const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the blue primary x-point. +% +% o y: the blue primary y-point. +% +*/ +WandExport MagickBooleanType MagickSetImageBluePrimary(MagickWand *wand, + const double x,const double y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->chromaticity.blue_primary.x=x; + wand->images->chromaticity.blue_primary.y=y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e B o r d e r C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageBorderColor() sets the image border color. +% +% The format of the MagickSetImageBorderColor method is: +% +% MagickBooleanType MagickSetImageBorderColor(MagickWand *wand, +% const PixelWand *border) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o border: the border pixel wand. +% +*/ +WandExport MagickBooleanType MagickSetImageBorderColor(MagickWand *wand, + const PixelWand *border) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelGetQuantumColor(border,&wand->images->border_color); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e C h a n n e l D e p t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageChannelDepth() sets the depth of a particular image channel. +% +% The format of the MagickSetImageChannelDepth method is: +% +% MagickBooleanType MagickSetImageChannelDepth(MagickWand *wand, +% const ChannelType channel,const size_t depth) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o depth: the image depth in bits. +% +*/ +WandExport MagickBooleanType MagickSetImageChannelDepth(MagickWand *wand, + const ChannelType channel,const size_t depth) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(SetImageChannelDepth(wand->images,channel,depth)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e C l i p M a s k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageClipMask() sets image clip mask. +% +% The format of the MagickSetImageClipMask method is: +% +% MagickBooleanType MagickSetImageClipMask(MagickWand *wand, +% const MagickWand *clip_mask) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o clip_mask: the clip_mask wand. +% +*/ +WandExport MagickBooleanType MagickSetImageClipMask(MagickWand *wand, + const MagickWand *clip_mask) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(clip_mask != (MagickWand *) NULL); + assert(clip_mask->signature == WandSignature); + if (clip_mask->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clip_mask->name); + if (clip_mask->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",clip_mask->name); + return(SetImageClipMask(wand->images,clip_mask->images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageColor() set the entire wand canvas to the specified color. +% +% The format of the MagickSetImageColor method is: +% +% MagickBooleanType MagickSetImageColor(MagickWand *wand, +% const PixelWand *color) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o background: the image color. +% +*/ +WandExport MagickBooleanType MagickSetImageColor(MagickWand *wand, + const PixelWand *color) +{ + MagickBooleanType + status; + + MagickPixelPacket + pixel; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + PixelGetMagickColor(color,&pixel); + status=SetImageColor(wand->images,&pixel); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e C o l o r m a p C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageColormapColor() sets the color of the specified colormap +% index. +% +% The format of the MagickSetImageColormapColor method is: +% +% MagickBooleanType MagickSetImageColormapColor(MagickWand *wand, +% const size_t index,const PixelWand *color) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o index: the offset into the image colormap. +% +% o color: Return the colormap color in this wand. +% +*/ +WandExport MagickBooleanType MagickSetImageColormapColor(MagickWand *wand, + const size_t index,const PixelWand *color) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + if ((wand->images->colormap == (PixelPacket *) NULL) || + (index >= wand->images->colors)) + ThrowWandException(WandError,"InvalidColormapIndex",wand->name); + PixelGetQuantumColor(color,wand->images->colormap+index); + return(SyncImage(wand->images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e C o l o r s p a c e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageColorspace() sets the image colorspace. +% +% The format of the MagickSetImageColorspace method is: +% +% MagickBooleanType MagickSetImageColorspace(MagickWand *wand, +% const ColorspaceType colorspace) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o colorspace: the image colorspace: UndefinedColorspace, RGBColorspace, +% GRAYColorspace, TransparentColorspace, OHTAColorspace, XYZColorspace, +% YCbCrColorspace, YCCColorspace, YIQColorspace, YPbPrColorspace, +% YPbPrColorspace, YUVColorspace, CMYKColorspace, sRGBColorspace, +% HSLColorspace, or HWBColorspace. +% +*/ +WandExport MagickBooleanType MagickSetImageColorspace(MagickWand *wand, + const ColorspaceType colorspace) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(SetImageColorspace(wand->images,colorspace)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e C o m p o s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageCompose() sets the image composite operator, useful for +% specifying how to composite the image thumbnail when using the +% MagickMontageImage() method. +% +% The format of the MagickSetImageCompose method is: +% +% MagickBooleanType MagickSetImageCompose(MagickWand *wand, +% const CompositeOperator compose) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o compose: the image composite operator. +% +*/ +WandExport MagickBooleanType MagickSetImageCompose(MagickWand *wand, + const CompositeOperator compose) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->compose=compose; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e C o m p r e s s i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageCompression() sets the image compression. +% +% The format of the MagickSetImageCompression method is: +% +% MagickBooleanType MagickSetImageCompression(MagickWand *wand, +% const CompressionType compression) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o compression: the image compression type. +% +*/ +WandExport MagickBooleanType MagickSetImageCompression(MagickWand *wand, + const CompressionType compression) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->compression=compression; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e C o m p r e s s i o n Q u a l i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageCompressionQuality() sets the image compression quality. +% +% The format of the MagickSetImageCompressionQuality method is: +% +% MagickBooleanType MagickSetImageCompressionQuality(MagickWand *wand, +% const size_t quality) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o quality: the image compression tlityype. +% +*/ +WandExport MagickBooleanType MagickSetImageCompressionQuality(MagickWand *wand, + const size_t quality) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->quality=quality; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e D e l a y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageDelay() sets the image delay. +% +% The format of the MagickSetImageDelay method is: +% +% MagickBooleanType MagickSetImageDelay(MagickWand *wand, +% const size_t delay) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o delay: the image delay in ticks-per-second units. +% +*/ +WandExport MagickBooleanType MagickSetImageDelay(MagickWand *wand, + const size_t delay) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->delay=delay; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e D e p t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageDepth() sets the image depth. +% +% The format of the MagickSetImageDepth method is: +% +% MagickBooleanType MagickSetImageDepth(MagickWand *wand, +% const size_t depth) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o depth: the image depth in bits: 8, 16, or 32. +% +*/ +WandExport MagickBooleanType MagickSetImageDepth(MagickWand *wand, + const size_t depth) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->depth=depth; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e D i s p o s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageDispose() sets the image disposal method. +% +% The format of the MagickSetImageDispose method is: +% +% MagickBooleanType MagickSetImageDispose(MagickWand *wand, +% const DisposeType dispose) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o dispose: the image disposeal type. +% +*/ +WandExport MagickBooleanType MagickSetImageDispose(MagickWand *wand, + const DisposeType dispose) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->dispose=dispose; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e E n d i a n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageEndian() sets the image endian method. +% +% The format of the MagickSetImageEndian method is: +% +% MagickBooleanType MagickSetImageEndian(MagickWand *wand, +% const EndianType endian) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o endian: the image endian type. +% +*/ +WandExport MagickBooleanType MagickSetImageEndian(MagickWand *wand, + const EndianType endian) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->endian=endian; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e E x t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageExtent() sets the image size (i.e. columns & rows). +% +% The format of the MagickSetImageExtent method is: +% +% MagickBooleanType MagickSetImageExtent(MagickWand *wand, +% const size_t columns,const unsigned rows) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: The image width in pixels. +% +% o rows: The image height in pixels. +% +*/ +WandExport MagickBooleanType MagickSetImageExtent(MagickWand *wand, + const size_t columns,const size_t rows) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(SetImageExtent(wand->images,columns,rows)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e F i l e n a m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageFilename() sets the filename of a particular image in a +% sequence. +% +% The format of the MagickSetImageFilename method is: +% +% MagickBooleanType MagickSetImageFilename(MagickWand *wand, +% const char *filename) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o filename: the image filename. +% +*/ +WandExport MagickBooleanType MagickSetImageFilename(MagickWand *wand, + const char *filename) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + if (filename == (const char *) NULL) + return(MagickFalse); + (void) CopyMagickString(wand->images->filename,filename,MaxTextExtent); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e F o r m a t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageFormat() sets the format of a particular image in a +% sequence. +% +% The format of the MagickSetImageFormat method is: +% +% MagickBooleanType MagickSetImageFormat(MagickWand *wand, +% const char *format) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o format: the image format. +% +*/ +WandExport MagickBooleanType MagickSetImageFormat(MagickWand *wand, + const char *format) +{ + const MagickInfo + *magick_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + if ((format == (char *) NULL) || (*format == '\0')) + { + *wand->images->magick='\0'; + return(MagickTrue); + } + magick_info=GetMagickInfo(format,wand->exception); + if (magick_info == (const MagickInfo *) NULL) + return(MagickFalse); + ClearMagickException(wand->exception); + (void) CopyMagickString(wand->images->magick,format,MaxTextExtent); + LocaleUpper(wand->images->magick); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e F u z z % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageFuzz() sets the image fuzz. +% +% The format of the MagickSetImageFuzz method is: +% +% MagickBooleanType MagickSetImageFuzz(MagickWand *wand, +% const double fuzz) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o fuzz: the image fuzz. +% +*/ +WandExport MagickBooleanType MagickSetImageFuzz(MagickWand *wand, + const double fuzz) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->fuzz=fuzz; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e G a m m a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageGamma() sets the image gamma. +% +% The format of the MagickSetImageGamma method is: +% +% MagickBooleanType MagickSetImageGamma(MagickWand *wand, +% const double gamma) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o gamma: the image gamma. +% +*/ +WandExport MagickBooleanType MagickSetImageGamma(MagickWand *wand, + const double gamma) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->gamma=gamma; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e G r a v i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageGravity() sets the image gravity type. +% +% The format of the MagickSetImageGravity method is: +% +% MagickBooleanType MagickSetImageGravity(MagickWand *wand, +% const GravityType gravity) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o gravity: the image interlace scheme: NoInterlace, LineInterlace, +% PlaneInterlace, PartitionInterlace. +% +*/ +WandExport MagickBooleanType MagickSetImageGravity(MagickWand *wand, + const GravityType gravity) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->gravity=gravity; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e G r e e n P r i m a r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageGreenPrimary() sets the image chromaticity green primary +% point. +% +% The format of the MagickSetImageGreenPrimary method is: +% +% MagickBooleanType MagickSetImageGreenPrimary(MagickWand *wand, +% const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the green primary x-point. +% +% o y: the green primary y-point. +% +% +*/ +WandExport MagickBooleanType MagickSetImageGreenPrimary(MagickWand *wand, + const double x,const double y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->chromaticity.green_primary.x=x; + wand->images->chromaticity.green_primary.y=y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e I n t e r l a c e S c h e m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageInterlaceScheme() sets the image interlace scheme. +% +% The format of the MagickSetImageInterlaceScheme method is: +% +% MagickBooleanType MagickSetImageInterlaceScheme(MagickWand *wand, +% const InterlaceType interlace) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o interlace: the image interlace scheme: NoInterlace, LineInterlace, +% PlaneInterlace, PartitionInterlace. +% +*/ +WandExport MagickBooleanType MagickSetImageInterlaceScheme(MagickWand *wand, + const InterlaceType interlace) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->interlace=interlace; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e I n t e r p o l a t e M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageInterpolateMethod() sets the image interpolate pixel method. +% +% The format of the MagickSetImageInterpolateMethod method is: +% +% MagickBooleanType MagickSetImageInterpolateMethod(MagickWand *wand, +% const InterpolatePixelMethod method) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o method: the image interpole pixel methods: choose from Undefined, +% Average, Bicubic, Bilinear, Filter, Integer, Mesh, NearestNeighbor. +% +*/ +WandExport MagickBooleanType MagickSetImageInterpolateMethod(MagickWand *wand, + const InterpolatePixelMethod method) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->interpolate=method; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e I t e r a t i o n s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageIterations() sets the image iterations. +% +% The format of the MagickSetImageIterations method is: +% +% MagickBooleanType MagickSetImageIterations(MagickWand *wand, +% const size_t iterations) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o delay: the image delay in 1/100th of a second. +% +*/ +WandExport MagickBooleanType MagickSetImageIterations(MagickWand *wand, + const size_t iterations) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->iterations=iterations; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e M a t t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageMatte() sets the image matte channel. +% +% The format of the MagickSetImageMatteColor method is: +% +% MagickBooleanType MagickSetImageMatteColor(MagickWand *wand, +% const MagickBooleanType *matte) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o matte: Set to MagickTrue to enable the image matte channel otherwise +% MagickFalse. +% +*/ +WandExport MagickBooleanType MagickSetImageMatte(MagickWand *wand, + const MagickBooleanType matte) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + if ((wand->images->matte == MagickFalse) && (matte != MagickFalse)) + (void) SetImageOpacity(wand->images,OpaqueOpacity); + wand->images->matte=matte; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e M a t t e C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageMatteColor() sets the image matte color. +% +% The format of the MagickSetImageMatteColor method is: +% +% MagickBooleanType MagickSetImageMatteColor(MagickWand *wand, +% const PixelWand *matte) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o matte: the matte pixel wand. +% +*/ +WandExport MagickBooleanType MagickSetImageMatteColor(MagickWand *wand, + const PixelWand *matte) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelGetQuantumColor(matte,&wand->images->matte_color); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e O p a c i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageOpacity() sets the image to the specified opacity level. +% +% The format of the MagickSetImageOpacity method is: +% +% MagickBooleanType MagickSetImageOpacity(MagickWand *wand, +% const double alpha) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully +% transparent. +% +*/ +WandExport MagickBooleanType MagickSetImageOpacity(MagickWand *wand, + const double alpha) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=SetImageOpacity(wand->images,ClampToQuantum((MagickRealType) + QuantumRange-QuantumRange*alpha)); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e O r i e n t a t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageOrientation() sets the image orientation. +% +% The format of the MagickSetImageOrientation method is: +% +% MagickBooleanType MagickSetImageOrientation(MagickWand *wand, +% const OrientationType orientation) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o orientation: the image orientation type. +% +*/ +WandExport MagickBooleanType MagickSetImageOrientation(MagickWand *wand, + const OrientationType orientation) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->orientation=orientation; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e P a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImagePage() sets the page geometry of the image. +% +% The format of the MagickSetImagePage method is: +% +% MagickBooleanType MagickSetImagePage(MagickWand *wand, +% const size_t width,const size_t height,const ssize_t x, +% const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the page width. +% +% o height: the page height. +% +% o x: the page x-offset. +% +% o y: the page y-offset. +% +*/ +WandExport MagickBooleanType MagickSetImagePage(MagickWand *wand, + const size_t width,const size_t height,const ssize_t x,const ssize_t y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->page.width=width; + wand->images->page.height=height; + wand->images->page.x=x; + wand->images->page.y=y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e P i x e l C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImagePixelColor() sets the color of the specified pixel. +% +% The format of the MagickSetImagePixelColor method is: +% +% MagickBooleanType MagickSetImagePixelColor(MagickWand *wand, +% const ssize_t x,const ssize_t y,const PixelWand *color) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x,y: the pixel offset into the image. +% +% o color: Return the colormap color in this wand. +% +*/ +WandExport MagickBooleanType MagickSetImagePixelColor(MagickWand *wand, + const ssize_t x,const ssize_t y,const PixelWand *color) +{ + IndexPacket + *indexes; + + PixelPacket + *q; + + CacheView + *image_view; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + image_view=AcquireVirtualCacheView(wand->images,wand->exception); + q=GetCacheViewAuthenticPixels(image_view,x,y,1,1,wand->exception); + if (q == (PixelPacket *) NULL) + { + image_view=DestroyCacheView(image_view); + return(MagickFalse); + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + PixelGetQuantumColor(color,q); + if (GetCacheViewColorspace(image_view) == CMYKColorspace) + *indexes=PixelGetBlackQuantum(color); + else + if (GetCacheViewStorageClass(image_view) == PseudoClass) + *indexes=PixelGetIndex(color); + image_view=DestroyCacheView(image_view); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e P r o g r e s s M o n i t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageProgressMonitor() sets the wand image progress monitor to the +% specified method and returns the previous progress monitor if any. The +% progress monitor method looks like this: +% +% MagickBooleanType MagickProgressMonitor(const char *text, +% const MagickOffsetType offset,const MagickSizeType span, +% void *client_data) +% +% If the progress monitor returns MagickFalse, the current operation is +% interrupted. +% +% The format of the MagickSetImageProgressMonitor method is: +% +% MagickProgressMonitor MagickSetImageProgressMonitor(MagickWand *wand +% const MagickProgressMonitor progress_monitor,void *client_data) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o progress_monitor: Specifies a pointer to a method to monitor progress +% of an image operation. +% +% o client_data: Specifies a pointer to any client data. +% +*/ +WandExport MagickProgressMonitor MagickSetImageProgressMonitor(MagickWand *wand, + const MagickProgressMonitor progress_monitor,void *client_data) +{ + MagickProgressMonitor + previous_monitor; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((MagickProgressMonitor) NULL); + } + previous_monitor=SetImageProgressMonitor(wand->images,progress_monitor, + client_data); + return(previous_monitor); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e R e d P r i m a r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageRedPrimary() sets the image chromaticity red primary point. +% +% The format of the MagickSetImageRedPrimary method is: +% +% MagickBooleanType MagickSetImageRedPrimary(MagickWand *wand, +% const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the red primary x-point. +% +% o y: the red primary y-point. +% +*/ +WandExport MagickBooleanType MagickSetImageRedPrimary(MagickWand *wand, + const double x,const double y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->chromaticity.red_primary.x=x; + wand->images->chromaticity.red_primary.y=y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e R e n d e r i n g I n t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageRenderingIntent() sets the image rendering intent. +% +% The format of the MagickSetImageRenderingIntent method is: +% +% MagickBooleanType MagickSetImageRenderingIntent(MagickWand *wand, +% const RenderingIntent rendering_intent) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o rendering_intent: the image rendering intent: UndefinedIntent, +% SaturationIntent, PerceptualIntent, AbsoluteIntent, or RelativeIntent. +% +*/ +WandExport MagickBooleanType MagickSetImageRenderingIntent(MagickWand *wand, + const RenderingIntent rendering_intent) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->rendering_intent=rendering_intent; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e R e s o l u t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageResolution() sets the image resolution. +% +% The format of the MagickSetImageResolution method is: +% +% MagickBooleanType MagickSetImageResolution(MagickWand *wand, +% const double x_resolution,const double y_resolution) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x_resolution: the image x resolution. +% +% o y_resolution: the image y resolution. +% +*/ +WandExport MagickBooleanType MagickSetImageResolution(MagickWand *wand, + const double x_resolution,const double y_resolution) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->x_resolution=x_resolution; + wand->images->y_resolution=y_resolution; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e S c e n e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageScene() sets the image scene. +% +% The format of the MagickSetImageScene method is: +% +% MagickBooleanType MagickSetImageScene(MagickWand *wand, +% const size_t scene) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o delay: the image scene number. +% +*/ +WandExport MagickBooleanType MagickSetImageScene(MagickWand *wand, + const size_t scene) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->scene=scene; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e T i c k s P e r S e c o n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageTicksPerSecond() sets the image ticks-per-second. +% +% The format of the MagickSetImageTicksPerSecond method is: +% +% MagickBooleanType MagickSetImageTicksPerSecond(MagickWand *wand, +% const ssize_t ticks_per-second) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o ticks_per_second: the units to use for the image delay. +% +*/ +WandExport MagickBooleanType MagickSetImageTicksPerSecond(MagickWand *wand, + const ssize_t ticks_per_second) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->ticks_per_second=ticks_per_second; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageType() sets the image type. +% +% The format of the MagickSetImageType method is: +% +% MagickBooleanType MagickSetImageType(MagickWand *wand, +% const ImageType image_type) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o image_type: the image type: UndefinedType, BilevelType, GrayscaleType, +% GrayscaleMatteType, PaletteType, PaletteMatteType, TrueColorType, +% TrueColorMatteType, ColorSeparationType, ColorSeparationMatteType, +% or OptimizeType. +% +*/ +WandExport MagickBooleanType MagickSetImageType(MagickWand *wand, + const ImageType image_type) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(SetImageType(wand->images,image_type)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e U n i t s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageUnits() sets the image units of resolution. +% +% The format of the MagickSetImageUnits method is: +% +% MagickBooleanType MagickSetImageUnits(MagickWand *wand, +% const ResolutionType units) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o units: the image units of resolution : UndefinedResolution, +% PixelsPerInchResolution, or PixelsPerCentimeterResolution. +% +*/ +WandExport MagickBooleanType MagickSetImageUnits(MagickWand *wand, + const ResolutionType units) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->units=units; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e V i r t u a l P i x e l M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageVirtualPixelMethod() sets the image virtual pixel method. +% +% The format of the MagickSetImageVirtualPixelMethod method is: +% +% VirtualPixelMethod MagickSetImageVirtualPixelMethod(MagickWand *wand, +% const VirtualPixelMethod method) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o method: the image virtual pixel method : UndefinedVirtualPixelMethod, +% ConstantVirtualPixelMethod, EdgeVirtualPixelMethod, +% MirrorVirtualPixelMethod, or TileVirtualPixelMethod. +% +*/ +WandExport VirtualPixelMethod MagickSetImageVirtualPixelMethod(MagickWand *wand, + const VirtualPixelMethod method) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return(UndefinedVirtualPixelMethod); + return(SetImageVirtualPixelMethod(wand->images,method)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e W h i t e P o i n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageWhitePoint() sets the image chromaticity white point. +% +% The format of the MagickSetImageWhitePoint method is: +% +% MagickBooleanType MagickSetImageWhitePoint(MagickWand *wand, +% const double x,const double y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the white x-point. +% +% o y: the white y-point. +% +*/ +WandExport MagickBooleanType MagickSetImageWhitePoint(MagickWand *wand, + const double x,const double y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->chromaticity.white_point.x=x; + wand->images->chromaticity.white_point.y=y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S h a d e I m a g e C h a n n e l % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickShadeImage() shines a distant light on an image to create a +% three-dimensional effect. You control the positioning of the light with +% azimuth and elevation; azimuth is measured in degrees off the x axis +% and elevation is measured in pixels above the Z axis. +% +% The format of the MagickShadeImage method is: +% +% MagickBooleanType MagickShadeImage(MagickWand *wand, +% const MagickBooleanType gray,const double azimuth, +% const double elevation) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o gray: A value other than zero shades the intensity of each pixel. +% +% o azimuth, elevation: Define the light source direction. +% +*/ +WandExport MagickBooleanType MagickShadeImage(MagickWand *wand, + const MagickBooleanType gray,const double asimuth,const double elevation) +{ + Image + *shade_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + shade_image=ShadeImage(wand->images,gray,asimuth,elevation,wand->exception); + if (shade_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,shade_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S h a d o w I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickShadowImage() simulates an image shadow. +% +% The format of the MagickShadowImage method is: +% +% MagickBooleanType MagickShadowImage(MagickWand *wand, +% const double opacity,const double sigma,const ssize_t x,const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o opacity: percentage transparency. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o x: the shadow x-offset. +% +% o y: the shadow y-offset. +% +*/ +WandExport MagickBooleanType MagickShadowImage(MagickWand *wand, + const double opacity,const double sigma,const ssize_t x,const ssize_t y) +{ + Image + *shadow_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + shadow_image=ShadowImage(wand->images,opacity,sigma,x,y,wand->exception); + if (shadow_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,shadow_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S h a r p e n I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSharpenImage() sharpens an image. We convolve the image with a +% Gaussian operator of the given radius and standard deviation (sigma). +% For reasonable results, the radius should be larger than sigma. Use a +% radius of 0 and MagickSharpenImage() selects a suitable radius for you. +% +% The format of the MagickSharpenImage method is: +% +% MagickBooleanType MagickSharpenImage(MagickWand *wand, +% const double radius,const double sigma) +% MagickBooleanType MagickSharpenImageChannel(MagickWand *wand, +% const ChannelType channel,const double radius,const double sigma) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +*/ + +WandExport MagickBooleanType MagickSharpenImage(MagickWand *wand, + const double radius,const double sigma) +{ + MagickBooleanType + status; + + status=MagickSharpenImageChannel(wand,DefaultChannels,radius,sigma); + return(status); +} + +WandExport MagickBooleanType MagickSharpenImageChannel(MagickWand *wand, + const ChannelType channel,const double radius,const double sigma) +{ + Image + *sharp_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + sharp_image=SharpenImageChannel(wand->images,channel,radius,sigma, + wand->exception); + if (sharp_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,sharp_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S h a v e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickShaveImage() shaves pixels from the image edges. It allocates the +% memory necessary for the new Image structure and returns a pointer to the +% new image. +% +% The format of the MagickShaveImage method is: +% +% MagickBooleanType MagickShaveImage(MagickWand *wand, +% const size_t columns,const size_t rows) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: the number of columns in the scaled image. +% +% o rows: the number of rows in the scaled image. +% +% +*/ +WandExport MagickBooleanType MagickShaveImage(MagickWand *wand, + const size_t columns,const size_t rows) +{ + Image + *shave_image; + + RectangleInfo + shave_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + shave_info.width=columns; + shave_info.height=rows; + shave_info.x=0; + shave_info.y=0; + shave_image=ShaveImage(wand->images,&shave_info,wand->exception); + if (shave_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,shave_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S h e a r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickShearImage() slides one edge of an image along the X or Y axis, +% creating a parallelogram. An X direction shear slides an edge along the X +% axis, while a Y direction shear slides an edge along the Y axis. The amount +% of the shear is controlled by a shear angle. For X direction shears, x_shear +% is measured relative to the Y axis, and similarly, for Y direction shears +% y_shear is measured relative to the X axis. Empty triangles left over from +% shearing the image are filled with the background color. +% +% The format of the MagickShearImage method is: +% +% MagickBooleanType MagickShearImage(MagickWand *wand, +% const PixelWand *background,const double x_shear,const double y_shear) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o background: the background pixel wand. +% +% o x_shear: the number of degrees to shear the image. +% +% o y_shear: the number of degrees to shear the image. +% +*/ +WandExport MagickBooleanType MagickShearImage(MagickWand *wand, + const PixelWand *background,const double x_shear,const double y_shear) +{ + Image + *shear_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelGetQuantumColor(background,&wand->images->background_color); + shear_image=ShearImage(wand->images,x_shear,y_shear,wand->exception); + if (shear_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,shear_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S i g m o i d a l C o n t r a s t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSigmoidalContrastImage() adjusts the contrast of an image with a +% non-linear sigmoidal contrast algorithm. Increase the contrast of the +% image using a sigmoidal transfer function without saturating highlights or +% shadows. Contrast indicates how much to increase the contrast (0 is none; +% 3 is typical; 20 is pushing it); mid-point indicates where midtones fall in +% the resultant image (0 is white; 50% is middle-gray; 100% is black). Set +% sharpen to MagickTrue to increase the image contrast otherwise the contrast +% is reduced. +% +% The format of the MagickSigmoidalContrastImage method is: +% +% MagickBooleanType MagickSigmoidalContrastImage(MagickWand *wand, +% const MagickBooleanType sharpen,const double alpha,const double beta) +% MagickBooleanType MagickSigmoidalContrastImageChannel(MagickWand *wand, +% const ChannelType channel,const MagickBooleanType sharpen, +% const double alpha,const double beta) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: Identify which channel to level: RedChannel, GreenChannel, +% +% o sharpen: Increase or decrease image contrast. +% +% o alpha: strength of the contrast, the larger the number the more +% 'threshold-like' it becomes. +% +% o beta: midpoint of the function as a color value 0 to QuantumRange. +% +*/ + +WandExport MagickBooleanType MagickSigmoidalContrastImage(MagickWand *wand, + const MagickBooleanType sharpen,const double alpha,const double beta) +{ + MagickBooleanType + status; + + status=MagickSigmoidalContrastImageChannel(wand,DefaultChannels,sharpen, + alpha,beta); + return(status); +} + +WandExport MagickBooleanType MagickSigmoidalContrastImageChannel( + MagickWand *wand,const ChannelType channel,const MagickBooleanType sharpen, + const double alpha,const double beta) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=SigmoidalContrastImageChannel(wand->images,channel,sharpen,alpha,beta); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S i m i l a r i t y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSimilarityImage() compares the reference image of the image and +% returns the best match offset. In addition, it returns a similarity image +% such that an exact match location is completely white and if none of the +% pixels match, black, otherwise some gray level in-between. +% +% The format of the MagickSimilarityImage method is: +% +% MagickWand *MagickSimilarityImage(MagickWand *wand, +% const MagickWand *reference,RectangeInfo *offset,double *similarity) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o reference: the reference wand. +% +% o offset: the best match offset of the reference image within the image. +% +% o similarity: the computed similarity between the images. +% +*/ +WandExport MagickWand *MagickSimilarityImage(MagickWand *wand, + const MagickWand *reference,RectangleInfo *offset,double *similarity) +{ + Image + *similarity_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL)) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((MagickWand *) NULL); + } + similarity_image=SimilarityImage(wand->images,reference->images,offset, + similarity,&wand->images->exception); + if (similarity_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,similarity_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S k e t c h I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSketchImage() simulates a pencil sketch. We convolve the image with +% a Gaussian operator of the given radius and standard deviation (sigma). +% For reasonable results, radius should be larger than sigma. Use a +% radius of 0 and SketchImage() selects a suitable radius for you. +% Angle gives the angle of the blurring motion. +% +% The format of the MagickSketchImage method is: +% +% MagickBooleanType MagickSketchImage(MagickWand *wand, +% const double radius,const double sigma,const double angle) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o radius: the radius of the Gaussian, in pixels, not counting +% the center pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o angle: Apply the effect along this angle. +% +*/ +WandExport MagickBooleanType MagickSketchImage(MagickWand *wand, + const double radius,const double sigma,const double angle) +{ + Image + *sketch_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + sketch_image=SketchImage(wand->images,radius,sigma,angle,wand->exception); + if (sketch_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,sketch_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S m u s h I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSmushImages() takes all images from the current image pointer to the +% end of the image list and smushs them to each other top-to-bottom if the +% stack parameter is true, otherwise left-to-right. +% +% The format of the MagickSmushImages method is: +% +% MagickWand *MagickSmushImages(MagickWand *wand, +% const MagickBooleanType stack,const ssize_t offset) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o stack: By default, images are stacked left-to-right. Set stack to +% MagickTrue to stack them top-to-bottom. +% +% o offset: minimum distance in pixels between images. +% +*/ +WandExport MagickWand *MagickSmushImages(MagickWand *wand, + const MagickBooleanType stack,const ssize_t offset) +{ + Image + *smush_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + smush_image=SmushImages(wand->images,stack,offset,wand->exception); + if (smush_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,smush_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S o l a r i z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSolarizeImage() applies a special effect to the image, similar to the +% effect achieved in a photo darkroom by selectively exposing areas of photo +% sensitive paper to light. Threshold ranges from 0 to QuantumRange and is a +% measure of the extent of the solarization. +% +% The format of the MagickSolarizeImage method is: +% +% MagickBooleanType MagickSolarizeImage(MagickWand *wand, +% const double threshold) +% MagickBooleanType MagickSolarizeImageChannel(MagickWand *wand, +% const ChannelType channel,const double threshold) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o threshold: Define the extent of the solarization. +% +*/ +WandExport MagickBooleanType MagickSolarizeImage(MagickWand *wand, + const double threshold) +{ + MagickBooleanType + status; + + status=MagickSolarizeImageChannel(wand,DefaultChannels,threshold); + return(status); +} + +WandExport MagickBooleanType MagickSolarizeImageChannel(MagickWand *wand, + const ChannelType channel,const double threshold) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=SolarizeImageChannel(wand->images,channel,threshold,wand->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S p a r s e C o l o r I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSparseColorImage(), given a set of coordinates, interpolates the +% colors found at those coordinates, across the whole image, using various +% methods. +% +% The format of the MagickSparseColorImage method is: +% +% MagickBooleanType MagickSparseColorImage(MagickWand *wand, +% const ChannelType channel,const SparseColorMethod method, +% const size_t number_arguments,const double *arguments) +% +% A description of each parameter follows: +% +% o image: the image to be sparseed. +% +% o method: the method of image sparseion. +% +% ArcSparseColorion will always ignore source image offset, and always +% 'bestfit' the destination image with the top left corner offset +% relative to the polar mapping center. +% +% Bilinear has no simple inverse mapping so will not allow 'bestfit' +% style of image sparseion. +% +% Affine, Perspective, and Bilinear, will do least squares fitting of +% the distrotion when more than the minimum number of control point +% pairs are provided. +% +% Perspective, and Bilinear, will fall back to a Affine sparseion when +% less than 4 control point pairs are provided. While Affine sparseions +% will let you use any number of control point pairs, that is Zero pairs +% is a No-Op (viewport only) distrotion, one pair is a translation and +% two pairs of control points will do a scale-rotate-translate, without +% any shearing. +% +% o number_arguments: the number of arguments given for this sparseion +% method. +% +% o arguments: the arguments for this sparseion method. +% +*/ +WandExport MagickBooleanType MagickSparseColorImage(MagickWand *wand, + const ChannelType channel,const SparseColorMethod method, + const size_t number_arguments,const double *arguments) +{ + Image + *sparse_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + sparse_image=SparseColorImage(wand->images,channel,method,number_arguments, + arguments,wand->exception); + if (sparse_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,sparse_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S p l i c e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSpliceImage() splices a solid color into the image. +% +% The format of the MagickSpliceImage method is: +% +% MagickBooleanType MagickSpliceImage(MagickWand *wand, +% const size_t width,const size_t height,const ssize_t x, +% const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the region width. +% +% o height: the region height. +% +% o x: the region x offset. +% +% o y: the region y offset. +% +*/ +WandExport MagickBooleanType MagickSpliceImage(MagickWand *wand, + const size_t width,const size_t height,const ssize_t x, + const ssize_t y) +{ + Image + *splice_image; + + RectangleInfo + splice; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + splice.width=width; + splice.height=height; + splice.x=x; + splice.y=y; + splice_image=SpliceImage(wand->images,&splice,wand->exception); + if (splice_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,splice_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S p r e a d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSpreadImage() is a special effects method that randomly displaces each +% pixel in a block defined by the radius parameter. +% +% The format of the MagickSpreadImage method is: +% +% MagickBooleanType MagickSpreadImage(MagickWand *wand,const double radius) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o radius: Choose a random pixel in a neighborhood of this extent. +% +*/ +WandExport MagickBooleanType MagickSpreadImage(MagickWand *wand, + const double radius) +{ + Image + *spread_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + spread_image=SpreadImage(wand->images,radius,wand->exception); + if (spread_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,spread_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S t a t i s t i c I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickStatisticImage() replace each pixel with corresponding statistic from +% the neighborhood of the specified width and height. +% +% The format of the MagickStatisticImage method is: +% +% MagickBooleanType MagickStatisticImage(MagickWand *wand, +% const StatisticType type,const double width,const size_t height) +% MagickBooleanType MagickStatisticImageChannel(MagickWand *wand, +% const ChannelType channel,const StatisticType type,const double width, +% const size_t height) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o type: the statistic type (e.g. median, mode, etc.). +% +% o width: the width of the pixel neighborhood. +% +% o height: the height of the pixel neighborhood. +% +*/ + +WandExport MagickBooleanType MagickStatisticImage(MagickWand *wand, + const StatisticType type,const size_t width,const size_t height) +{ + MagickBooleanType + status; + + status=MagickStatisticImageChannel(wand,DefaultChannels,type,width,height); + return(status); +} + +WandExport MagickBooleanType MagickStatisticImageChannel(MagickWand *wand, + const ChannelType channel,const StatisticType type,const size_t width, + const size_t height) +{ + Image + *statistic_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + statistic_image=StatisticImageChannel(wand->images,channel,type,width,height, + wand->exception); + if (statistic_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,statistic_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S t e g a n o I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSteganoImage() hides a digital watermark within the image. +% Recover the hidden watermark later to prove that the authenticity of +% an image. Offset defines the start position within the image to hide +% the watermark. +% +% The format of the MagickSteganoImage method is: +% +% MagickWand *MagickSteganoImage(MagickWand *wand, +% const MagickWand *watermark_wand,const ssize_t offset) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o watermark_wand: the watermark wand. +% +% o offset: Start hiding at this offset into the image. +% +*/ +WandExport MagickWand *MagickSteganoImage(MagickWand *wand, + const MagickWand *watermark_wand,const ssize_t offset) +{ + Image + *stegano_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || + (watermark_wand->images == (Image *) NULL)) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((MagickWand *) NULL); + } + wand->images->offset=offset; + stegano_image=SteganoImage(wand->images,watermark_wand->images, + wand->exception); + if (stegano_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,stegano_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S t e r e o I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickStereoImage() composites two images and produces a single image that +% is the composite of a left and right image of a stereo pair +% +% The format of the MagickStereoImage method is: +% +% MagickWand *MagickStereoImage(MagickWand *wand, +% const MagickWand *offset_wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o offset_wand: Another image wand. +% +*/ +WandExport MagickWand *MagickStereoImage(MagickWand *wand, + const MagickWand *offset_wand) +{ + Image + *stereo_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || + (offset_wand->images == (Image *) NULL)) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((MagickWand *) NULL); + } + stereo_image=StereoImage(wand->images,offset_wand->images,wand->exception); + if (stereo_image == (Image *) NULL) + return((MagickWand *) NULL); + return(CloneMagickWandFromImages(wand,stereo_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S t r i p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickStripImage() strips an image of all profiles and comments. +% +% The format of the MagickStripImage method is: +% +% MagickBooleanType MagickStripImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickStripImage(MagickWand *wand) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=StripImage(wand->images); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S w i r l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSwirlImage() swirls the pixels about the center of the image, where +% degrees indicates the sweep of the arc through which each pixel is moved. +% You get a more dramatic effect as the degrees move from 1 to 360. +% +% The format of the MagickSwirlImage method is: +% +% MagickBooleanType MagickSwirlImage(MagickWand *wand,const double degrees) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o degrees: Define the tightness of the swirling effect. +% +*/ +WandExport MagickBooleanType MagickSwirlImage(MagickWand *wand, + const double degrees) +{ + Image + *swirl_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + swirl_image=SwirlImage(wand->images,degrees,wand->exception); + if (swirl_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,swirl_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T e x t u r e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickTextureImage() repeatedly tiles the texture image across and down the +% image canvas. +% +% The format of the MagickTextureImage method is: +% +% MagickWand *MagickTextureImage(MagickWand *wand, +% const MagickWand *texture_wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o texture_wand: the texture wand +% +*/ +WandExport MagickWand *MagickTextureImage(MagickWand *wand, + const MagickWand *texture_wand) +{ + Image + *texture_image; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((wand->images == (Image *) NULL) || + (texture_wand->images == (Image *) NULL)) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((MagickWand *) NULL); + } + texture_image=CloneImage(wand->images,0,0,MagickTrue,wand->exception); + if (texture_image == (Image *) NULL) + return((MagickWand *) NULL); + status=TextureImage(texture_image,texture_wand->images); + if (status == MagickFalse) + { + InheritException(wand->exception,&texture_image->exception); + texture_image=DestroyImage(texture_image); + return((MagickWand *) NULL); + } + return(CloneMagickWandFromImages(wand,texture_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T h r e s h o l d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickThresholdImage() changes the value of individual pixels based on +% the intensity of each pixel compared to threshold. The result is a +% high-contrast, two color image. +% +% The format of the MagickThresholdImage method is: +% +% MagickBooleanType MagickThresholdImage(MagickWand *wand, +% const double threshold) +% MagickBooleanType MagickThresholdImageChannel(MagickWand *wand, +% const ChannelType channel,const double threshold) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o threshold: Define the threshold value. +% +*/ +WandExport MagickBooleanType MagickThresholdImage(MagickWand *wand, + const double threshold) +{ + MagickBooleanType + status; + + status=MagickThresholdImageChannel(wand,DefaultChannels,threshold); + return(status); +} + +WandExport MagickBooleanType MagickThresholdImageChannel(MagickWand *wand, + const ChannelType channel,const double threshold) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=BilevelImageChannel(wand->images,channel,threshold); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T h u m b n a i l I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickThumbnailImage() changes the size of an image to the given dimensions +% and removes any associated profiles. The goal is to produce small low cost +% thumbnail images suited for display on the Web. +% +% The format of the MagickThumbnailImage method is: +% +% MagickBooleanType MagickThumbnailImage(MagickWand *wand, +% const size_t columns,const size_t rows) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: the number of columns in the scaled image. +% +% o rows: the number of rows in the scaled image. +% +*/ +WandExport MagickBooleanType MagickThumbnailImage(MagickWand *wand, + const size_t columns,const size_t rows) +{ + Image + *thumbnail_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + thumbnail_image=ThumbnailImage(wand->images,columns,rows,wand->exception); + if (thumbnail_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,thumbnail_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T i n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickTintImage() applies a color vector to each pixel in the image. The +% length of the vector is 0 for black and white and at its maximum for the +% midtones. The vector weighting function is +% f(x)=(1-(4.0*((x-0.5)*(x-0.5)))). +% +% The format of the MagickTintImage method is: +% +% MagickBooleanType MagickTintImage(MagickWand *wand, +% const PixelWand *tint,const PixelWand *opacity) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o tint: the tint pixel wand. +% +% o opacity: the opacity pixel wand. +% +*/ +WandExport MagickBooleanType MagickTintImage(MagickWand *wand, + const PixelWand *tint,const PixelWand *opacity) +{ + char + percent_opaque[MaxTextExtent]; + + Image + *tint_image; + + PixelPacket + target; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + (void) FormatLocaleString(percent_opaque,MaxTextExtent, + "%g,%g,%g,%g",(double) (100.0*QuantumScale* + PixelGetRedQuantum(opacity)),(double) (100.0*QuantumScale* + PixelGetGreenQuantum(opacity)),(double) (100.0*QuantumScale* + PixelGetBlueQuantum(opacity)),(double) (100.0*QuantumScale* + PixelGetOpacityQuantum(opacity))); + PixelGetQuantumColor(tint,&target); + tint_image=TintImage(wand->images,percent_opaque,target,wand->exception); + if (tint_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,tint_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T r a n s f o r m I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickTransformImage() is a convenience method that behaves like +% MagickResizeImage() or MagickCropImage() but accepts scaling and/or cropping +% information as a region geometry specification. If the operation fails, +% a NULL image handle is returned. +% +% The format of the MagickTransformImage method is: +% +% MagickWand *MagickTransformImage(MagickWand *wand,const char *crop, +% const char *geometry) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o crop: A crop geometry string. This geometry defines a subregion of the +% image to crop. +% +% o geometry: An image geometry string. This geometry defines the final +% size of the image. +% +*/ +WandExport MagickWand *MagickTransformImage(MagickWand *wand, + const char *crop,const char *geometry) +{ + Image + *transform_image; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return((MagickWand *) NULL); + transform_image=CloneImage(wand->images,0,0,MagickTrue,wand->exception); + if (transform_image == (Image *) NULL) + return((MagickWand *) NULL); + status=TransformImage(&transform_image,crop,geometry); + if (status == MagickFalse) + { + InheritException(wand->exception,&transform_image->exception); + transform_image=DestroyImage(transform_image); + return((MagickWand *) NULL); + } + return(CloneMagickWandFromImages(wand,transform_image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T r a n s f o r m I m a g e C o l o r s p a c e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickTransformImageColorspace() transform the image colorspace, setting +% the images colorspace while transforming the images data to that +% colorspace. +% +% The format of the MagickTransformImageColorspace method is: +% +% MagickBooleanType MagickTransformImageColorspace(MagickWand *wand, +% const ColorspaceType colorspace) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o colorspace: the image colorspace: UndefinedColorspace, +% sRGBColorspace, RGBColorspace, GRAYColorspace, +% OHTAColorspace, XYZColorspace, YCbCrColorspace, +% YCCColorspace, YIQColorspace, YPbPrColorspace, +% YPbPrColorspace, YUVColorspace, CMYKColorspace, +% HSLColorspace, HWBColorspace. +% +*/ +WandExport MagickBooleanType MagickTransformImageColorspace(MagickWand *wand, + const ColorspaceType colorspace) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + return(TransformImageColorspace(wand->images,colorspace)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T r a n s p a r e n t P a i n t I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickTransparentPaintImage() changes any pixel that matches color with the +% color defined by fill. +% +% The format of the MagickTransparentPaintImage method is: +% +% MagickBooleanType MagickTransparentPaintImage(MagickWand *wand, +% const PixelWand *target,const double alpha,const double fuzz, +% const MagickBooleanType invert) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o target: Change this target color to specified opacity value within +% the image. +% +% o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully +% transparent. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +% o invert: paint any pixel that does not match the target color. +% +*/ +WandExport MagickBooleanType MagickTransparentPaintImage(MagickWand *wand, + const PixelWand *target,const double alpha,const double fuzz, + const MagickBooleanType invert) +{ + MagickBooleanType + status; + + MagickPixelPacket + target_pixel; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + PixelGetMagickColor(target,&target_pixel); + wand->images->fuzz=fuzz; + status=TransparentPaintImage(wand->images,&target_pixel,ClampToQuantum( + (MagickRealType) QuantumRange-QuantumRange*alpha),invert); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T r a n s p o s e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickTransposeImage() creates a vertical mirror image by reflecting the +% pixels around the central x-axis while rotating them 90-degrees. +% +% The format of the MagickTransposeImage method is: +% +% MagickBooleanType MagickTransposeImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickTransposeImage(MagickWand *wand) +{ + Image + *transpose_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + transpose_image=TransposeImage(wand->images,wand->exception); + if (transpose_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,transpose_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T r a n s v e r s e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickTransverseImage() creates a horizontal mirror image by reflecting the +% pixels around the central y-axis while rotating them 270-degrees. +% +% The format of the MagickTransverseImage method is: +% +% MagickBooleanType MagickTransverseImage(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickTransverseImage(MagickWand *wand) +{ + Image + *transverse_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + transverse_image=TransverseImage(wand->images,wand->exception); + if (transverse_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,transverse_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k T r i m I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickTrimImage() remove edges that are the background color from the image. +% +% The format of the MagickTrimImage method is: +% +% MagickBooleanType MagickTrimImage(MagickWand *wand,const double fuzz) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o fuzz: By default target must match a particular pixel color +% exactly. However, in many cases two colors may differ by a small amount. +% The fuzz member of image defines how much tolerance is acceptable to +% consider two colors as the same. For example, set fuzz to 10 and the +% color red at intensities of 100 and 102 respectively are now interpreted +% as the same color for the purposes of the floodfill. +% +*/ +WandExport MagickBooleanType MagickTrimImage(MagickWand *wand,const double fuzz) +{ + Image + *trim_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wand->images->fuzz=fuzz; + trim_image=TrimImage(wand->images,wand->exception); + if (trim_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,trim_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k U n i q u e I m a g e C o l o r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickUniqueImageColors() discards all but one of any pixel color. +% +% The format of the MagickUniqueImageColors method is: +% +% MagickBooleanType MagickUniqueImageColors(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickUniqueImageColors(MagickWand *wand) +{ + Image + *unique_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + unique_image=UniqueImageColors(wand->images,wand->exception); + if (unique_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,unique_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k U n s h a r p M a s k I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickUnsharpMaskImage() sharpens an image. We convolve the image with a +% Gaussian operator of the given radius and standard deviation (sigma). +% For reasonable results, radius should be larger than sigma. Use a radius +% of 0 and UnsharpMaskImage() selects a suitable radius for you. +% +% The format of the MagickUnsharpMaskImage method is: +% +% MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand, +% const double radius,const double sigma,const double amount, +% const double threshold) +% MagickBooleanType MagickUnsharpMaskImageChannel(MagickWand *wand, +% const ChannelType channel,const double radius,const double sigma, +% const double amount,const double threshold) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o channel: the image channel(s). +% +% o radius: the radius of the Gaussian, in pixels, not counting the center +% pixel. +% +% o sigma: the standard deviation of the Gaussian, in pixels. +% +% o amount: the percentage of the difference between the original and the +% blur image that is added back into the original. +% +% o threshold: the threshold in pixels needed to apply the diffence amount. +% +*/ + +WandExport MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand, + const double radius,const double sigma,const double amount, + const double threshold) +{ + MagickBooleanType + status; + + status=MagickUnsharpMaskImageChannel(wand,DefaultChannels,radius,sigma, + amount,threshold); + return(status); +} + +WandExport MagickBooleanType MagickUnsharpMaskImageChannel(MagickWand *wand, + const ChannelType channel,const double radius,const double sigma, + const double amount,const double threshold) +{ + Image + *unsharp_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + unsharp_image=UnsharpMaskImageChannel(wand->images,channel,radius,sigma, + amount,threshold,wand->exception); + if (unsharp_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,unsharp_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k V i g n e t t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickVignetteImage() softens the edges of the image in vignette style. +% +% The format of the MagickVignetteImage method is: +% +% MagickBooleanType MagickVignetteImage(MagickWand *wand, +% const double black_point,const double white_point,const ssize_t x, +% const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o black_point: the black point. +% +% o white_point: the white point. +% +% o x, y: Define the x and y ellipse offset. +% +*/ +WandExport MagickBooleanType MagickVignetteImage(MagickWand *wand, + const double black_point,const double white_point,const ssize_t x, + const ssize_t y) +{ + Image + *vignette_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + vignette_image=VignetteImage(wand->images,black_point,white_point,x,y, + wand->exception); + if (vignette_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,vignette_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k W a v e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickWaveImage() creates a "ripple" effect in the image by shifting +% the pixels vertically along a sine wave whose amplitude and wavelength +% is specified by the given parameters. +% +% The format of the MagickWaveImage method is: +% +% MagickBooleanType MagickWaveImage(MagickWand *wand, +% const double amplitude,const double wave_length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o amplitude, wave_length: Define the amplitude and wave length of the +% sine wave. +% +*/ +WandExport MagickBooleanType MagickWaveImage(MagickWand *wand, + const double amplitude,const double wave_length) +{ + Image + *wave_image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + wave_image=WaveImage(wand->images,amplitude,wave_length,wand->exception); + if (wave_image == (Image *) NULL) + return(MagickFalse); + ReplaceImageInList(&wand->images,wave_image); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k W h i t e T h r e s h o l d I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickWhiteThresholdImage() is like ThresholdImage() but force all pixels +% above the threshold into white while leaving all pixels below the threshold +% unchanged. +% +% The format of the MagickWhiteThresholdImage method is: +% +% MagickBooleanType MagickWhiteThresholdImage(MagickWand *wand, +% const PixelWand *threshold) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o threshold: the pixel wand. +% +*/ +WandExport MagickBooleanType MagickWhiteThresholdImage(MagickWand *wand, + const PixelWand *threshold) +{ + char + thresholds[MaxTextExtent]; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + (void) FormatLocaleString(thresholds,MaxTextExtent, + QuantumFormat "," QuantumFormat "," QuantumFormat "," QuantumFormat, + PixelGetRedQuantum(threshold),PixelGetGreenQuantum(threshold), + PixelGetBlueQuantum(threshold),PixelGetOpacityQuantum(threshold)); + status=WhiteThresholdImage(wand->images,thresholds); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k W r i t e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickWriteImage() writes an image to the specified filename. If the +% filename parameter is NULL, the image is written to the filename set +% by MagickReadImage() or MagickSetImageFilename(). +% +% The format of the MagickWriteImage method is: +% +% MagickBooleanType MagickWriteImage(MagickWand *wand, +% const char *filename) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o filename: the image filename. +% +% +*/ +WandExport MagickBooleanType MagickWriteImage(MagickWand *wand, + const char *filename) +{ + Image + *image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + if (filename != (const char *) NULL) + (void) CopyMagickString(wand->images->filename,filename,MaxTextExtent); + image=CloneImage(wand->images,0,0,MagickTrue,wand->exception); + if (image == (Image *) NULL) + return(MagickFalse); + write_info=CloneImageInfo(wand->image_info); + write_info->adjoin=MagickTrue; + status=WriteImage(write_info,image); + if (status == MagickFalse) + InheritException(wand->exception,&image->exception); + image=DestroyImage(image); + write_info=DestroyImageInfo(write_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k W r i t e I m a g e F i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickWriteImageFile() writes an image to an open file descriptor. +% +% The format of the MagickWriteImageFile method is: +% +% MagickBooleanType MagickWriteImageFile(MagickWand *wand,FILE *file) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o file: the file descriptor. +% +*/ +WandExport MagickBooleanType MagickWriteImageFile(MagickWand *wand,FILE *file) +{ + Image + *image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + assert(file != (FILE *) NULL); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + image=CloneImage(wand->images,0,0,MagickTrue,wand->exception); + if (image == (Image *) NULL) + return(MagickFalse); + write_info=CloneImageInfo(wand->image_info); + SetImageInfoFile(write_info,file); + write_info->adjoin=MagickTrue; + status=WriteImage(write_info,image); + write_info=DestroyImageInfo(write_info); + if (status == MagickFalse) + InheritException(wand->exception,&image->exception); + image=DestroyImage(image); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k W r i t e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickWriteImages() writes an image or image sequence. +% +% The format of the MagickWriteImages method is: +% +% MagickBooleanType MagickWriteImages(MagickWand *wand, +% const char *filename,const MagickBooleanType adjoin) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o filename: the image filename. +% +% o adjoin: join images into a single multi-image file. +% +*/ +WandExport MagickBooleanType MagickWriteImages(MagickWand *wand, + const char *filename,const MagickBooleanType adjoin) +{ + ImageInfo + *write_info; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + write_info=CloneImageInfo(wand->image_info); + write_info->adjoin=adjoin; + status=WriteImages(write_info,wand->images,filename,wand->exception); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + write_info=DestroyImageInfo(write_info); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k W r i t e I m a g e s F i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickWriteImagesFile() writes an image sequence to an open file descriptor. +% +% The format of the MagickWriteImagesFile method is: +% +% MagickBooleanType MagickWriteImagesFile(MagickWand *wand,FILE *file) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o file: the file descriptor. +% +*/ +WandExport MagickBooleanType MagickWriteImagesFile(MagickWand *wand,FILE *file) +{ + ImageInfo + *write_info; + + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + write_info=CloneImageInfo(wand->image_info); + SetImageInfoFile(write_info,file); + write_info->adjoin=MagickTrue; + status=WriteImages(write_info,wand->images,(const char *) NULL, + wand->exception); + write_info=DestroyImageInfo(write_info); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} diff --git a/ImageMagick-6.9.12-44/wand/magick-image.h b/ImageMagick-6.9.12-44/wand/magick-image.h new file mode 100644 index 0000000..9929037 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/magick-image.h @@ -0,0 +1,464 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand image Methods. +*/ + +#ifndef MAGICKWAND_MAGICK_IMAGE_H +#define MAGICKWAND_MAGICK_IMAGE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport ChannelFeatures + *MagickGetImageChannelFeatures(MagickWand *,const size_t); + +extern WandExport ChannelStatistics + *MagickGetImageChannelStatistics(MagickWand *); + +extern WandExport char + *MagickGetImageFilename(MagickWand *), + *MagickGetImageFormat(MagickWand *), + *MagickGetImageSignature(MagickWand *), + *MagickIdentifyImage(MagickWand *); + +extern WandExport ColorspaceType + MagickGetImageColorspace(MagickWand *); + +extern WandExport CompositeOperator + MagickGetImageCompose(MagickWand *); + +extern WandExport CompressionType + MagickGetImageCompression(MagickWand *); + +extern WandExport DisposeType + MagickGetImageDispose(MagickWand *); + +extern WandExport double + *MagickGetImageChannelDistortions(MagickWand *,const MagickWand *, + const MetricType), + MagickGetImageFuzz(MagickWand *), + MagickGetImageGamma(MagickWand *), + MagickGetImageTotalInkDensity(MagickWand *); + +extern WandExport EndianType + MagickGetImageEndian(MagickWand *); + +extern WandExport GravityType + MagickGetImageGravity(MagickWand *); + +extern WandExport Image + *MagickDestroyImage(Image *), + *GetImageFromMagickWand(const MagickWand *); + +extern WandExport ImageType + MagickGetImageType(MagickWand *); + +extern WandExport InterlaceType + MagickGetImageInterlaceScheme(MagickWand *); + +extern WandExport InterpolatePixelMethod + MagickGetImageInterpolateMethod(MagickWand *); + +extern WandExport MagickBooleanType + MagickAdaptiveBlurImage(MagickWand *,const double,const double), + MagickAdaptiveBlurImageChannel(MagickWand *,const ChannelType,const double, + const double), + MagickAdaptiveResizeImage(MagickWand *,const size_t,const size_t), + MagickAdaptiveSharpenImage(MagickWand *,const double,const double), + MagickAdaptiveSharpenImageChannel(MagickWand *,const ChannelType,const double, + const double), + MagickAdaptiveThresholdImage(MagickWand *,const size_t,const size_t, + const ssize_t), + MagickAddImage(MagickWand *,const MagickWand *), + MagickAddNoiseImage(MagickWand *,const NoiseType), + MagickAddNoiseImageChannel(MagickWand *,const ChannelType,const NoiseType), + MagickAffineTransformImage(MagickWand *,const DrawingWand *), + MagickAnnotateImage(MagickWand *,const DrawingWand *,const double, + const double,const double,const char *), + MagickAnimateImages(MagickWand *,const char *), + MagickAutoGammaImage(MagickWand *), + MagickAutoGammaImageChannel(MagickWand *,const ChannelType), + MagickAutoLevelImage(MagickWand *), + MagickAutoLevelImageChannel(MagickWand *,const ChannelType), + MagickAutoOrientImage(MagickWand *), + MagickBlackThresholdImage(MagickWand *,const PixelWand *), + MagickBlueShiftImage(MagickWand *,const double), + MagickBlurImage(MagickWand *,const double,const double), + MagickBlurImageChannel(MagickWand *,const ChannelType,const double, + const double), + MagickBorderImage(MagickWand *,const PixelWand *,const size_t,const size_t), + MagickBrightnessContrastImage(MagickWand *,const double,const double), + MagickBrightnessContrastImageChannel(MagickWand *,const ChannelType, + const double,const double), + MagickCharcoalImage(MagickWand *,const double,const double), + MagickChopImage(MagickWand *,const size_t,const size_t,const ssize_t, + const ssize_t), + MagickClampImage(MagickWand *), + MagickClampImageChannel(MagickWand *,const ChannelType), + MagickClipImage(MagickWand *), + MagickClipImagePath(MagickWand *,const char *,const MagickBooleanType), + MagickClutImage(MagickWand *,const MagickWand *), + MagickClutImageChannel(MagickWand *,const ChannelType,const MagickWand *), + MagickColorDecisionListImage(MagickWand *,const char *), + MagickColorizeImage(MagickWand *,const PixelWand *,const PixelWand *), + MagickColorMatrixImage(MagickWand *,const KernelInfo *), + MagickCommentImage(MagickWand *,const char *), + MagickCompositeImage(MagickWand *,const MagickWand *,const CompositeOperator, + const ssize_t,const ssize_t), + MagickCompositeImageChannel(MagickWand *,const ChannelType,const MagickWand *, + const CompositeOperator,const ssize_t,const ssize_t), + MagickCompositeImageGravity(MagickWand *,const MagickWand *, + const CompositeOperator,const GravityType), + MagickCompositeLayers(MagickWand *,const MagickWand *,const CompositeOperator, + const ssize_t,const ssize_t), + MagickConstituteImage(MagickWand *,const size_t,const size_t,const char *, + const StorageType,const void *), + MagickContrastImage(MagickWand *,const MagickBooleanType), + MagickContrastStretchImage(MagickWand *,const double,const double), + MagickContrastStretchImageChannel(MagickWand *,const ChannelType,const double, + const double), + MagickConvolveImage(MagickWand *,const size_t,const double *), + MagickConvolveImageChannel(MagickWand *,const ChannelType,const size_t, + const double *), + MagickCropImage(MagickWand *,const size_t,const size_t,const ssize_t, + const ssize_t), + MagickCycleColormapImage(MagickWand *,const ssize_t), + MagickDecipherImage(MagickWand *,const char *), + MagickDeskewImage(MagickWand *,const double), + MagickDespeckleImage(MagickWand *), + MagickDisplayImage(MagickWand *,const char *), + MagickDisplayImages(MagickWand *,const char *), + MagickDistortImage(MagickWand *,const DistortImageMethod,const size_t, + const double *,const MagickBooleanType), + MagickDrawImage(MagickWand *,const DrawingWand *), + MagickEdgeImage(MagickWand *,const double), + MagickEmbossImage(MagickWand *,const double,const double), + MagickEncipherImage(MagickWand *,const char *), + MagickEnhanceImage(MagickWand *), + MagickEqualizeImage(MagickWand *), + MagickEqualizeImageChannel(MagickWand *,const ChannelType), + MagickEvaluateImage(MagickWand *,const MagickEvaluateOperator,const double), + MagickEvaluateImageChannel(MagickWand *,const ChannelType, + const MagickEvaluateOperator,const double), + MagickExportImagePixels(MagickWand *,const ssize_t,const ssize_t, + const size_t,const size_t,const char *,const StorageType,void *), + MagickExtentImage(MagickWand *,const size_t,const size_t,const ssize_t, + const ssize_t), + MagickFilterImage(MagickWand *,const KernelInfo *), + MagickFilterImageChannel(MagickWand *,const ChannelType,const KernelInfo *), + MagickFlipImage(MagickWand *), + MagickFloodfillPaintImage(MagickWand *,const ChannelType,const PixelWand *, + const double,const PixelWand *,const ssize_t,const ssize_t, + const MagickBooleanType), + MagickFlopImage(MagickWand *), + MagickForwardFourierTransformImage(MagickWand *,const MagickBooleanType), + MagickFrameImage(MagickWand *,const PixelWand *,const size_t,const size_t, + const ssize_t,const ssize_t), + MagickFunctionImage(MagickWand *,const MagickFunction,const size_t, + const double *), + MagickFunctionImageChannel(MagickWand *,const ChannelType, + const MagickFunction,const size_t,const double *), + MagickGammaImage(MagickWand *,const double), + MagickGammaImageChannel(MagickWand *,const ChannelType,const double), + MagickGaussianBlurImage(MagickWand *,const double,const double), + MagickGaussianBlurImageChannel(MagickWand *,const ChannelType,const double, + const double), + MagickGetImageAlphaChannel(MagickWand *), + MagickGetImageBackgroundColor(MagickWand *,PixelWand *), + MagickGetImageBluePrimary(MagickWand *,double *,double *), + MagickGetImageBorderColor(MagickWand *,PixelWand *), + MagickGetImageChannelDistortion(MagickWand *,const MagickWand *, + const ChannelType,const MetricType,double *), + MagickGetImageChannelKurtosis(MagickWand *,const ChannelType,double *, + double *), + MagickGetImageChannelMean(MagickWand *,const ChannelType,double *,double *), + MagickGetImageChannelRange(MagickWand *,const ChannelType,double *,double *), + MagickGetImageColormapColor(MagickWand *,const size_t,PixelWand *), + MagickGetImageDistortion(MagickWand *,const MagickWand *,const MetricType, + double *), + MagickGetImageGreenPrimary(MagickWand *,double *,double *), + MagickGetImageMatteColor(MagickWand *,PixelWand *), + MagickGetImageLength(MagickWand *,MagickSizeType *), + MagickGetImagePage(MagickWand *,size_t *,size_t *,ssize_t *, + ssize_t *), + MagickGetImagePixelColor(MagickWand *,const ssize_t,const ssize_t, + PixelWand *), + MagickGetImageRange(MagickWand *,double *,double *), + MagickGetImageRedPrimary(MagickWand *,double *,double *), + MagickGetImageResolution(MagickWand *,double *,double *), + MagickGetImageWhitePoint(MagickWand *,double *,double *), + MagickHaldClutImage(MagickWand *,const MagickWand *), + MagickHaldClutImageChannel(MagickWand *,const ChannelType,const MagickWand *), + MagickHasNextImage(MagickWand *), + MagickHasPreviousImage(MagickWand *), + MagickImplodeImage(MagickWand *,const double), + MagickImportImagePixels(MagickWand *,const ssize_t,const ssize_t,const size_t, + const size_t,const char *,const StorageType,const void *), + MagickInverseFourierTransformImage(MagickWand *,MagickWand *, + const MagickBooleanType), + MagickLabelImage(MagickWand *,const char *), + MagickLevelImage(MagickWand *,const double,const double,const double), + MagickLevelImageChannel(MagickWand *,const ChannelType,const double, + const double,const double), + MagickLevelImageColors(MagickWand *,const PixelWand *,const PixelWand *, + const MagickBooleanType), + MagickLevelImageColorsChannel(MagickWand *,const ChannelType, + const PixelWand *,const PixelWand *,const MagickBooleanType), + MagickLevelizeImage(MagickWand *,const double,const double,const double), + MagickLevelizeImageChannel(MagickWand *,const ChannelType,const double, + const double,const double), + MagickLinearStretchImage(MagickWand *,const double,const double), + MagickLiquidRescaleImage(MagickWand *,const size_t,const size_t,const double, + const double), + MagickLocalContrastImage(MagickWand *,const double,const double), + MagickMagnifyImage(MagickWand *), + MagickMedianFilterImage(MagickWand *,const double), + MagickMinifyImage(MagickWand *), + MagickModeImage(MagickWand *,const double), + MagickModulateImage(MagickWand *,const double,const double,const double), + MagickMorphologyImage(MagickWand *,const MorphologyMethod,const ssize_t, + const KernelInfo *), + MagickMorphologyImageChannel(MagickWand *,const ChannelType, + const MorphologyMethod,const ssize_t,const KernelInfo *), + MagickMotionBlurImage(MagickWand *,const double,const double,const double), + MagickMotionBlurImageChannel(MagickWand *,const ChannelType,const double, + const double,const double), + MagickNegateImage(MagickWand *,const MagickBooleanType), + MagickNegateImageChannel(MagickWand *,const ChannelType, + const MagickBooleanType), + MagickNewImage(MagickWand *,const size_t,const size_t,const PixelWand *), + MagickNextImage(MagickWand *), + MagickNormalizeImage(MagickWand *), + MagickNormalizeImageChannel(MagickWand *,const ChannelType), + MagickOilPaintImage(MagickWand *,const double), + MagickOpaquePaintImage(MagickWand *,const PixelWand *,const PixelWand *, + const double,const MagickBooleanType), + MagickOpaquePaintImageChannel(MagickWand *,const ChannelType, + const PixelWand *,const PixelWand *,const double,const MagickBooleanType), + MagickOrderedPosterizeImage(MagickWand *,const char *), + MagickOrderedPosterizeImageChannel(MagickWand *,const ChannelType, + const char *), + MagickOptimizeImageTransparency(MagickWand *), + MagickTransparentPaintImage(MagickWand *,const PixelWand *, + const double,const double,const MagickBooleanType invert), + MagickPingImage(MagickWand *,const char *), + MagickPingImageBlob(MagickWand *,const void *,const size_t), + MagickPingImageFile(MagickWand *,FILE *), + MagickPolaroidImage(MagickWand *,const DrawingWand *,const double), + MagickPosterizeImage(MagickWand *,const size_t,const MagickBooleanType), + MagickPreviousImage(MagickWand *), + MagickQuantizeImage(MagickWand *,const size_t,const ColorspaceType, + const size_t,const MagickBooleanType,const MagickBooleanType), + MagickQuantizeImages(MagickWand *,const size_t,const ColorspaceType, + const size_t,const MagickBooleanType,const MagickBooleanType), + MagickRaiseImage(MagickWand *,const size_t,const size_t,const ssize_t, + const ssize_t,const MagickBooleanType), + MagickRandomThresholdImage(MagickWand *,const double,const double), + MagickRandomThresholdImageChannel(MagickWand *,const ChannelType,const double, + const double), + MagickReadImage(MagickWand *,const char *), + MagickReadImageBlob(MagickWand *,const void *,const size_t), + MagickReadImageFile(MagickWand *,FILE *), + MagickReduceNoiseImage(MagickWand *,const double), + MagickRemapImage(MagickWand *,const MagickWand *,const DitherMethod), + MagickRemoveImage(MagickWand *), + MagickResampleImage(MagickWand *,const double,const double,const FilterTypes, + const double), + MagickResetImagePage(MagickWand *,const char *), + MagickResizeImage(MagickWand *,const size_t,const size_t,const FilterTypes, + const double), + MagickRollImage(MagickWand *,const ssize_t,const ssize_t), + MagickRotateImage(MagickWand *,const PixelWand *,const double), + MagickRotationalBlurImage(MagickWand *,const double), + MagickRotationalBlurImageChannel(MagickWand *,const ChannelType, + const double), + MagickSampleImage(MagickWand *,const size_t,const size_t), + MagickScaleImage(MagickWand *,const size_t,const size_t), + MagickSegmentImage(MagickWand *,const ColorspaceType,const MagickBooleanType, + const double,const double), + MagickSelectiveBlurImage(MagickWand *,const double,const double,const double), + MagickSelectiveBlurImageChannel(MagickWand *,const ChannelType,const double, + const double,const double), + MagickSeparateImageChannel(MagickWand *,const ChannelType), + MagickSepiaToneImage(MagickWand *,const double), + MagickSetImage(MagickWand *,const MagickWand *), + MagickSetImageAlphaChannel(MagickWand *,const AlphaChannelType), + MagickSetImageBackgroundColor(MagickWand *,const PixelWand *), + MagickSetImageBias(MagickWand *,const double), + MagickSetImageBluePrimary(MagickWand *,const double,const double), + MagickSetImageBorderColor(MagickWand *,const PixelWand *), + MagickSetImageChannelDepth(MagickWand *,const ChannelType,const size_t), + MagickSetImageClipMask(MagickWand *,const MagickWand *), + MagickSetImageColor(MagickWand *,const PixelWand *), + MagickSetImageColormapColor(MagickWand *,const size_t, + const PixelWand *), + MagickSetImageColorspace(MagickWand *,const ColorspaceType), + MagickSetImageCompose(MagickWand *,const CompositeOperator), + MagickSetImageCompression(MagickWand *,const CompressionType), + MagickSetImageDelay(MagickWand *,const size_t), + MagickSetImageDepth(MagickWand *,const size_t), + MagickSetImageDispose(MagickWand *,const DisposeType), + MagickSetImageCompressionQuality(MagickWand *,const size_t), + MagickSetImageEndian(MagickWand *,const EndianType), + MagickSetImageExtent(MagickWand *,const size_t,const size_t), + MagickSetImageFilename(MagickWand *,const char *), + MagickSetImageFormat(MagickWand *,const char *), + MagickSetImageFuzz(MagickWand *,const double), + MagickSetImageGamma(MagickWand *,const double), + MagickSetImageGravity(MagickWand *,const GravityType), + MagickSetImageGreenPrimary(MagickWand *,const double,const double), + MagickSetImageInterlaceScheme(MagickWand *,const InterlaceType), + MagickSetImageInterpolateMethod(MagickWand *,const InterpolatePixelMethod), + MagickSetImageIterations(MagickWand *,const size_t), + MagickSetImageMatte(MagickWand *,const MagickBooleanType), + MagickSetImageMatteColor(MagickWand *,const PixelWand *), + MagickSetImageOpacity(MagickWand *,const double), + MagickSetImageOrientation(MagickWand *,const OrientationType), + MagickSetImagePage(MagickWand *,const size_t,const size_t,const ssize_t, + const ssize_t), + MagickSetImageRedPrimary(MagickWand *,const double,const double), + MagickSetImageRenderingIntent(MagickWand *,const RenderingIntent), + MagickSetImageResolution(MagickWand *,const double,const double), + MagickSetImageScene(MagickWand *,const size_t), + MagickSetImagePixelColor(MagickWand *,const ssize_t,const ssize_t, + const PixelWand *), + MagickSetImageTicksPerSecond(MagickWand *,const ssize_t), + MagickSetImageType(MagickWand *,const ImageType), + MagickSetImageUnits(MagickWand *,const ResolutionType), + MagickSetImageWhitePoint(MagickWand *,const double,const double), + MagickShadeImage(MagickWand *,const MagickBooleanType,const double, + const double), + MagickShadowImage(MagickWand *,const double,const double,const ssize_t, + const ssize_t), + MagickSharpenImage(MagickWand *,const double,const double), + MagickSharpenImageChannel(MagickWand *,const ChannelType,const double, + const double), + MagickShaveImage(MagickWand *,const size_t,const size_t), + MagickShearImage(MagickWand *,const PixelWand *,const double,const double), + MagickSigmoidalContrastImage(MagickWand *,const MagickBooleanType, + const double,const double), + MagickSigmoidalContrastImageChannel(MagickWand *,const ChannelType, + const MagickBooleanType,const double,const double), + MagickSketchImage(MagickWand *,const double,const double,const double), + MagickSolarizeImage(MagickWand *,const double), + MagickSolarizeImageChannel(MagickWand *,const ChannelType,const double), + MagickSparseColorImage(MagickWand *,const ChannelType,const SparseColorMethod, + const size_t,const double *), + MagickSpliceImage(MagickWand *,const size_t,const size_t,const ssize_t, + const ssize_t), + MagickSpreadImage(MagickWand *,const double), + MagickStatisticImage(MagickWand *,const StatisticType,const size_t, + const size_t), + MagickStatisticImageChannel(MagickWand *,const ChannelType, + const StatisticType,const size_t,const size_t), + MagickStripImage(MagickWand *), + MagickSwirlImage(MagickWand *,const double), + MagickTintImage(MagickWand *,const PixelWand *,const PixelWand *), + MagickTransformImageColorspace(MagickWand *,const ColorspaceType), + MagickTransposeImage(MagickWand *), + MagickTransverseImage(MagickWand *), + MagickThresholdImage(MagickWand *,const double), + MagickThresholdImageChannel(MagickWand *,const ChannelType,const double), + MagickThumbnailImage(MagickWand *,const size_t,const size_t), + MagickTrimImage(MagickWand *,const double), + MagickUniqueImageColors(MagickWand *), + MagickUnsharpMaskImage(MagickWand *,const double,const double,const double, + const double), + MagickUnsharpMaskImageChannel(MagickWand *,const ChannelType,const double, + const double,const double,const double), + MagickVignetteImage(MagickWand *,const double,const double,const ssize_t, + const ssize_t), + MagickWaveImage(MagickWand *,const double,const double), + MagickWhiteThresholdImage(MagickWand *,const PixelWand *), + MagickWriteImage(MagickWand *,const char *), + MagickWriteImageFile(MagickWand *,FILE *), + MagickWriteImages(MagickWand *,const char *,const MagickBooleanType), + MagickWriteImagesFile(MagickWand *,FILE *); + +extern WandExport MagickProgressMonitor + MagickSetImageProgressMonitor(MagickWand *,const MagickProgressMonitor, + void *); + +extern WandExport MagickWand + *MagickAppendImages(MagickWand *,const MagickBooleanType), + *MagickCoalesceImages(MagickWand *), + *MagickCombineImages(MagickWand *,const ChannelType), + *MagickCompareImageChannels(MagickWand *,const MagickWand *,const ChannelType, + const MetricType,double *), + *MagickCompareImages(MagickWand *,const MagickWand *,const MetricType, + double *), + *MagickCompareImageLayers(MagickWand *,const ImageLayerMethod), + *MagickDeconstructImages(MagickWand *), + *MagickEvaluateImages(MagickWand *,const MagickEvaluateOperator), + *MagickFxImage(MagickWand *,const char *), + *MagickFxImageChannel(MagickWand *,const ChannelType,const char *), + *MagickGetImage(MagickWand *), + *MagickGetImageClipMask(MagickWand *), + *MagickGetImageRegion(MagickWand *,const size_t,const size_t,const ssize_t, + const ssize_t), + *MagickMergeImageLayers(MagickWand *,const ImageLayerMethod), + *MagickMorphImages(MagickWand *,const size_t), + *MagickMontageImage(MagickWand *,const DrawingWand *,const char *, + const char *,const MontageMode,const char *), + *MagickOptimizeImageLayers(MagickWand *), + *MagickPreviewImages(MagickWand *wand,const PreviewType), + *MagickSimilarityImage(MagickWand *,const MagickWand *,RectangleInfo *, + double *), + *MagickSmushImages(MagickWand *,const MagickBooleanType,const ssize_t), + *MagickSteganoImage(MagickWand *,const MagickWand *,const ssize_t), + *MagickStereoImage(MagickWand *,const MagickWand *), + *MagickTextureImage(MagickWand *,const MagickWand *), + *MagickTransformImage(MagickWand *,const char *,const char *); + +extern WandExport OrientationType + MagickGetImageOrientation(MagickWand *); + +extern WandExport PixelWand + **MagickGetImageHistogram(MagickWand *,size_t *); + +extern WandExport RenderingIntent + MagickGetImageRenderingIntent(MagickWand *); + +extern WandExport ResolutionType + MagickGetImageUnits(MagickWand *); + +extern WandExport size_t + MagickGetImageColors(MagickWand *), + MagickGetImageCompressionQuality(MagickWand *), + MagickGetImageDelay(MagickWand *), + MagickGetImageChannelDepth(MagickWand *,const ChannelType), + MagickGetImageDepth(MagickWand *), + MagickGetImageHeight(MagickWand *), + MagickGetImageIterations(MagickWand *), + MagickGetImageScene(MagickWand *), + MagickGetImageTicksPerSecond(MagickWand *), + MagickGetImageWidth(MagickWand *), + MagickGetNumberImages(MagickWand *); + +extern WandExport unsigned char + *MagickGetImageBlob(MagickWand *,size_t *), + *MagickGetImagesBlob(MagickWand *,size_t *); + +extern WandExport VirtualPixelMethod + MagickGetImageVirtualPixelMethod(MagickWand *), + MagickSetImageVirtualPixelMethod(MagickWand *,const VirtualPixelMethod); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/magick-property.c b/ImageMagick-6.9.12-44/wand/magick-property.c new file mode 100644 index 0000000..83c2fc0 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/magick-property.c @@ -0,0 +1,2986 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M AAA GGGG IIIII CCCC K K % +% MM MM A A G I C K K % +% M M M AAAAA G GGG I C KKK % +% M M A A G G I C K K % +% M M A A GGGG IIIII CCCC K K % +% % +% PPPP RRRR OOO PPPP EEEEE RRRR TTTTT Y Y % +% P P R R O O P P E R R T Y Y % +% PPPP RRRR O O PPPP EEE RRRR T Y % +% P R R O O P E R R T Y % +% P R R OOO P EEEEE R R T Y % +% % +% % +% Set or Get MagickWand Properties, Options, or Profiles % +% % +% Software Design % +% Cristy % +% August 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/magick-wand-private.h" +#include "wand/wand.h" +#include "magick/image-private.h" +#include "magick/string-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D e l e t e I m a g e A r t i f a c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDeleteImageArtifact() deletes a wand artifact. +% +% The format of the MagickDeleteImageArtifact method is: +% +% MagickBooleanType MagickDeleteImageArtifact(MagickWand *wand, +% const char *artifact) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o artifact: the image artifact. +% +*/ +WandExport MagickBooleanType MagickDeleteImageArtifact(MagickWand *wand, + const char *artifact) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(MagickFalse); + } + return(DeleteImageArtifact(wand->images,artifact)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D e l e t e I m a g e P r o p e r t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDeleteImageProperty() deletes a wand property. +% +% The format of the MagickDeleteImageProperty method is: +% +% MagickBooleanType MagickDeleteImageProperty(MagickWand *wand, +% const char *property) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o property: the image property. +% +*/ +WandExport MagickBooleanType MagickDeleteImageProperty(MagickWand *wand, + const char *property) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return(MagickFalse); + } + return(DeleteImageProperty(wand->images,property)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k D e l e t e O p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickDeleteOption() deletes a wand option. +% +% The format of the MagickDeleteOption method is: +% +% MagickBooleanType MagickDeleteOption(MagickWand *wand, +% const char *option) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o option: the image option. +% +*/ +WandExport MagickBooleanType MagickDeleteOption(MagickWand *wand, + const char *option) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(DeleteImageOption(wand->image_info,option)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t A n t i a l i a s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetAntialias() returns the antialias property associated with the +% wand. +% +% The format of the MagickGetAntialias method is: +% +% MagickBooleanType MagickGetAntialias(const MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickGetAntialias(const MagickWand *wand) +{ + assert(wand != (const MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->image_info->antialias); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t B a c k g r o u n d C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetBackgroundColor() returns the wand background color. +% +% The format of the MagickGetBackgroundColor method is: +% +% PixelWand *MagickGetBackgroundColor(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport PixelWand *MagickGetBackgroundColor(MagickWand *wand) +{ + PixelWand + *background_color; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + background_color=NewPixelWand(); + PixelSetQuantumColor(background_color,&wand->image_info->background_color); + return(background_color); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t C o l o r s p a c e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetColorspace() gets the wand colorspace type. +% +% The format of the MagickGetColorspace method is: +% +% ColorspaceType MagickGetColorspace(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ColorspaceType MagickGetColorspace(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->image_info->colorspace); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t C o m p r e s s i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetCompression() gets the wand compression type. +% +% The format of the MagickGetCompression method is: +% +% CompressionType MagickGetCompression(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport CompressionType MagickGetCompression(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->image_info->compression); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t C o m p r e s s i o n Q u a l i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetCompressionQuality() gets the wand compression quality. +% +% The format of the MagickGetCompressionQuality method is: +% +% size_t MagickGetCompressionQuality(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport size_t MagickGetCompressionQuality(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->image_info->quality); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t C o p y r i g h t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetCopyright() returns the ImageMagick API copyright as a string +% constant. +% +% The format of the MagickGetCopyright method is: +% +% const char *MagickGetCopyright(void) +% +*/ +WandExport const char *MagickGetCopyright(void) +{ + return(GetMagickCopyright()); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t F i l e n a m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetFilename() returns the filename associated with an image sequence. +% +% The format of the MagickGetFilename method is: +% +% const char *MagickGetFilename(const MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport char *MagickGetFilename(const MagickWand *wand) +{ + assert(wand != (const MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(AcquireString(wand->image_info->filename)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t F o n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetFont() returns the font associated with the MagickWand. +% +% The format of the MagickGetFont method is: +% +% char *MagickGetFont(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport char *MagickGetFont(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->image_info->font == (char *) NULL) + return((char *) NULL); + return(AcquireString(wand->image_info->font)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t F o r m a t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetFormat() returns the format of the magick wand. +% +% The format of the MagickGetFormat method is: +% +% const char MagickGetFormat(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport char *MagickGetFormat(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(AcquireString(wand->image_info->magick)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t G r a v i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetGravity() gets the wand gravity. +% +% The format of the MagickGetGravity method is: +% +% GravityType MagickGetGravity(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport GravityType MagickGetGravity(MagickWand *wand) +{ + const char + *option; + + GravityType + type; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + option=GetImageOption(wand->image_info,"gravity"); + if (option == (const char *) NULL) + return(UndefinedGravity); + type=(GravityType) ParseCommandOption(MagickGravityOptions,MagickFalse,option); + return(type); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t H o m e U R L % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetHomeURL() returns the ImageMagick home URL. +% +% The format of the MagickGetHomeURL method is: +% +% char *MagickGetHomeURL(void) +% +*/ +WandExport char *MagickGetHomeURL(void) +{ + return(GetMagickHomeURL()); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e A r t i f a c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageArtifact() returns a value associated with the specified +% artifact. Use MagickRelinquishMemory() to free the value when you are +% finished with it. +% +% The format of the MagickGetImageArtifact method is: +% +% char *MagickGetImageArtifact(MagickWand *wand,const char *artifact) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o artifact: the artifact. +% +*/ +WandExport char *MagickGetImageArtifact(MagickWand *wand,const char *artifact) +{ + const char + *value; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((char *) NULL); + } + value=GetImageArtifact(wand->images,artifact); + if (value == (const char *) NULL) + return((char *) NULL); + return(ConstantString(value)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e P r o p e r t i e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageArtifacts() returns all the artifact names that match the +% specified pattern associated with a wand. Use MagickGetImageProperty() to +% return the value of a particular artifact. Use MagickRelinquishMemory() to +% free the value when you are finished with it. +% +% The format of the MagickGetImageArtifacts method is: +% +% char *MagickGetImageArtifacts(MagickWand *wand, +% const char *pattern,size_t *number_artifacts) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_artifacts: the number artifacts associated with this wand. +% +*/ +WandExport char **MagickGetImageArtifacts(MagickWand *wand, + const char *pattern,size_t *number_artifacts) +{ + char + **artifacts; + + const char + *artifact; + + ssize_t + i; + + size_t + length; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((char **) NULL); + } + (void) GetImageProperty(wand->images,"exif:*"); + length=1024; + artifacts=(char **) AcquireQuantumMemory(length,sizeof(*artifacts)); + if (artifacts == (char **) NULL) + return((char **) NULL); + ResetImagePropertyIterator(wand->images); + artifact=GetNextImageProperty(wand->images); + for (i=0; artifact != (const char *) NULL; ) + { + if ((*artifact != '[') && + (GlobExpression(artifact,pattern,MagickFalse) != MagickFalse)) + { + if ((i+1) >= (ssize_t) length) + { + length<<=1; + artifacts=(char **) ResizeQuantumMemory(artifacts,length, + sizeof(*artifacts)); + if (artifacts == (char **) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + wand->name); + return((char **) NULL); + } + } + artifacts[i]=ConstantString(artifact); + i++; + } + artifact=GetNextImageProperty(wand->images); + } + artifacts[i]=(char *) NULL; + *number_artifacts=(size_t) i; + return(artifacts); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e P r o f i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageProfile() returns the named image profile. +% +% The format of the MagickGetImageProfile method is: +% +% unsigned char *MagickGetImageProfile(MagickWand *wand,const char *name, +% size_t *length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o name: Name of profile to return: ICC, IPTC, or generic profile. +% +% o length: the length of the profile. +% +*/ +WandExport unsigned char *MagickGetImageProfile(MagickWand *wand, + const char *name,size_t *length) +{ + const StringInfo + *profile; + + unsigned char + *datum; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((unsigned char *) NULL); + } + *length=0; + if (wand->images->profiles == (SplayTreeInfo *) NULL) + return((unsigned char *) NULL); + profile=GetImageProfile(wand->images,name); + if (profile == (StringInfo *) NULL) + return((unsigned char *) NULL); + datum=(unsigned char *) AcquireQuantumMemory(GetStringInfoLength(profile), + sizeof(*datum)); + if (datum == (unsigned char *) NULL) + return((unsigned char *) NULL); + (void) memcpy(datum,GetStringInfoDatum(profile),GetStringInfoLength(profile)); + *length=(size_t) GetStringInfoLength(profile); + return(datum); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e P r o f i l e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageProfiles() returns all the profile names that match the +% specified pattern associated with a wand. Use MagickGetImageProfile() to +% return the value of a particular property. Use MagickRelinquishMemory() to +% free the value when you are finished with it. +% +% The format of the MagickGetImageProfiles method is: +% +% char *MagickGetImageProfiles(MagickWand *wand,const char *pattern, +% size_t *number_profiles) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_profiles: the number profiles associated with this wand. +% +*/ +WandExport char **MagickGetImageProfiles(MagickWand *wand,const char *pattern, + size_t *number_profiles) +{ + char + **profiles; + + const char + *property; + + ssize_t + i; + + size_t + length; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((char **) NULL); + } + (void) GetImageProfile(wand->images,"exif:*"); + length=1024; + profiles=(char **) AcquireQuantumMemory(length,sizeof(*profiles)); + if (profiles == (char **) NULL) + return((char **) NULL); + ResetImageProfileIterator(wand->images); + property=GetNextImageProfile(wand->images); + for (i=0; property != (const char *) NULL; ) + { + if ((*property != '[') && + (GlobExpression(property,pattern,MagickFalse) != MagickFalse)) + { + if ((i+1) >= (ssize_t) length) + { + length<<=1; + profiles=(char **) ResizeQuantumMemory(profiles,length, + sizeof(*profiles)); + if (profiles == (char **) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + wand->name); + return((char **) NULL); + } + } + profiles[i]=ConstantString(property); + i++; + } + property=GetNextImageProfile(wand->images); + } + profiles[i]=(char *) NULL; + *number_profiles=(size_t) i; + return(profiles); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e P r o p e r t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageProperty() returns a value associated with the specified +% property. Use MagickRelinquishMemory() to free the value when you are +% finished with it. +% +% The format of the MagickGetImageProperty method is: +% +% char *MagickGetImageProperty(MagickWand *wand,const char *property) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o property: the property. +% +*/ +WandExport char *MagickGetImageProperty(MagickWand *wand,const char *property) +{ + const char + *value; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((char *) NULL); + } + value=GetImageProperty(wand->images,property); + if (value == (const char *) NULL) + return((char *) NULL); + return(ConstantString(value)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I m a g e P r o p e r t i e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetImageProperties() returns all the property names that match the +% specified pattern associated with a wand. Use MagickGetImageProperty() to +% return the value of a particular property. Use MagickRelinquishMemory() to +% free the value when you are finished with it. +% +% The format of the MagickGetImageProperties method is: +% +% char *MagickGetImageProperties(MagickWand *wand, +% const char *pattern,size_t *number_properties) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_properties: the number properties associated with this wand. +% +*/ +WandExport char **MagickGetImageProperties(MagickWand *wand, + const char *pattern,size_t *number_properties) +{ + char + **properties; + + const char + *property; + + ssize_t + i; + + size_t + length; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((char **) NULL); + } + (void) GetImageProperty(wand->images,"exif:*"); + length=1024; + properties=(char **) AcquireQuantumMemory(length,sizeof(*properties)); + if (properties == (char **) NULL) + return((char **) NULL); + ResetImagePropertyIterator(wand->images); + property=GetNextImageProperty(wand->images); + for (i=0; property != (const char *) NULL; ) + { + if ((*property != '[') && + (GlobExpression(property,pattern,MagickFalse) != MagickFalse)) + { + if ((i+1) >= (ssize_t) length) + { + length<<=1; + properties=(char **) ResizeQuantumMemory(properties,length, + sizeof(*properties)); + if (properties == (char **) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + wand->name); + return((char **) NULL); + } + } + properties[i]=ConstantString(property); + i++; + } + property=GetNextImageProperty(wand->images); + } + properties[i]=(char *) NULL; + *number_properties=(size_t) i; + return(properties); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I n t e r l a c e S c h e m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetInterlaceScheme() gets the wand interlace scheme. +% +% The format of the MagickGetInterlaceScheme method is: +% +% InterlaceType MagickGetInterlaceScheme(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport InterlaceType MagickGetInterlaceScheme(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->image_info->interlace); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I n t e r p o l a t e M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetInterpolateMethod() gets the wand compression. +% +% The format of the MagickGetInterpolateMethod method is: +% +% InterpolatePixelMethod MagickGetInterpolateMethod(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport InterpolatePixelMethod MagickGetInterpolateMethod(MagickWand *wand) +{ + const char + *option; + + InterpolatePixelMethod + method; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + option=GetImageOption(wand->image_info,"interpolate"); + if (option == (const char *) NULL) + return(UndefinedInterpolatePixel); + method=(InterpolatePixelMethod) ParseCommandOption(MagickInterpolateOptions, + MagickFalse,option); + return(method); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t O p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetOption() returns a value associated with a wand and the specified +% key. Use MagickRelinquishMemory() to free the value when you are finished +% with it. +% +% The format of the MagickGetOption method is: +% +% char *MagickGetOption(MagickWand *wand,const char *key) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o key: the key. +% +*/ +WandExport char *MagickGetOption(MagickWand *wand,const char *key) +{ + const char + *option; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + option=GetImageOption(wand->image_info,key); + return(ConstantString(option)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t O p t i o n s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetOptions() returns all the option names that match the specified +% pattern associated with a wand. Use MagickGetOption() to return the value +% of a particular option. Use MagickRelinquishMemory() to free the value +% when you are finished with it. +% +% The format of the MagickGetOptions method is: +% +% char *MagickGetOptions(MagickWand *wand,const char *pattern,, +% size_t *number_options) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_options: the number options associated with this wand. +% +*/ +WandExport char **MagickGetOptions(MagickWand *wand,const char *pattern, + size_t *number_options) +{ + char + **options; + + const char + *option; + + ssize_t + i; + + size_t + length; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((char **) NULL); + } + length=1024; + options=(char **) AcquireQuantumMemory(length,sizeof(*options)); + if (options == (char **) NULL) + return((char **) NULL); + ResetImageOptionIterator(wand->image_info); + option=GetNextImageOption(wand->image_info); + for (i=0; option != (const char *) NULL; ) + { + if ((*option != '[') && + (GlobExpression(option,pattern,MagickFalse) != MagickFalse)) + { + if ((i+1) >= (ssize_t) length) + { + length<<=1; + options=(char **) ResizeQuantumMemory(options,length, + sizeof(*options)); + if (options == (char **) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'", + wand->name); + return((char **) NULL); + } + } + options[i]=ConstantString(option); + i++; + } + option=GetNextImageOption(wand->image_info); + } + options[i]=(char *) NULL; + *number_options=(size_t) i; + return(options); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t O r i e n t a t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetOrientation() gets the wand orientation type. +% +% The format of the MagickGetOrientation method is: +% +% OrientationType MagickGetOrientation(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport OrientationType MagickGetOrientation(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->image_info->orientation); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t P a c k a g e N a m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetPackageName() returns the ImageMagick package name as a string +% constant. +% +% The format of the MagickGetPackageName method is: +% +% const char *MagickGetPackageName(void) +% +% +*/ +WandExport const char *MagickGetPackageName(void) +{ + return(GetMagickPackageName()); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t P a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetPage() returns the page geometry associated with the magick wand. +% +% The format of the MagickGetPage method is: +% +% MagickBooleanType MagickGetPage(const MagickWand *wand, +% size_t *width,size_t *height,ssize_t *x,ssize_t *y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the page width. +% +% o height: page height. +% +% o x: the page x-offset. +% +% o y: the page y-offset. +% +*/ +WandExport MagickBooleanType MagickGetPage(const MagickWand *wand, + size_t *width,size_t *height,ssize_t *x,ssize_t *y) +{ + RectangleInfo + geometry; + + assert(wand != (const MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) memset(&geometry,0,sizeof(geometry)); + (void) ParseAbsoluteGeometry(wand->image_info->page,&geometry); + *width=geometry.width; + *height=geometry.height; + *x=geometry.x; + *y=geometry.y; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t P o i n t s i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetPointsize() returns the font pointsize associated with the +% MagickWand. +% +% The format of the MagickGetPointsize method is: +% +% double MagickGetPointsize(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport double MagickGetPointsize(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->image_info->pointsize); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t Q u a n t u m D e p t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetQuantumDepth() returns the ImageMagick quantum depth as a string +% constant. +% +% The format of the MagickGetQuantumDepth method is: +% +% const char *MagickGetQuantumDepth(size_t *depth) +% +% A description of each parameter follows: +% +% o depth: the quantum depth is returned as a number. +% +*/ +WandExport const char *MagickGetQuantumDepth(size_t *depth) +{ + return(GetMagickQuantumDepth(depth)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t Q u a n t u m R a n g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetQuantumRange() returns the ImageMagick quantum range as a string +% constant. +% +% The format of the MagickGetQuantumRange method is: +% +% const char *MagickGetQuantumRange(size_t *range) +% +% A description of each parameter follows: +% +% o range: the quantum range is returned as a number. +% +*/ +WandExport const char *MagickGetQuantumRange(size_t *range) +{ + return(GetMagickQuantumRange(range)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t R e l e a s e D a t e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetReleaseDate() returns the ImageMagick release date as a string +% constant. +% +% The format of the MagickGetReleaseDate method is: +% +% const char *MagickGetReleaseDate(void) +% +*/ +WandExport const char *MagickGetReleaseDate(void) +{ + return(GetMagickReleaseDate()); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t R e s o l u t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetResolution() gets the image X and Y resolution. +% +% The format of the MagickGetResolution method is: +% +% MagickBooleanType MagickGetResolution(const MagickWand *wand,double *x, +% double *y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x: the x-resolution. +% +% o y: the y-resolution. +% +*/ +WandExport MagickBooleanType MagickGetResolution(const MagickWand *wand, + double *x,double *y) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + *x=DefaultResolution; + *y=DefaultResolution; + if (wand->image_info->density != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(wand->image_info->density,&geometry_info); + *x=geometry_info.rho; + *y=geometry_info.sigma; + if ((flags & SigmaValue) == MagickFalse) + *y=(*x); + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t R e s o u r c e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetResource() returns the specified resource in megabytes. +% +% The format of the MagickGetResource method is: +% +% MagickSizeType MagickGetResource(const ResourceType type) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickSizeType MagickGetResource(const ResourceType type) +{ + return(GetMagickResource(type)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t R e s o u r c e L i m i t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetResourceLimit() returns the specified resource limit in megabytes. +% +% The format of the MagickGetResourceLimit method is: +% +% MagickSizeType MagickGetResourceLimit(const ResourceType type) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickSizeType MagickGetResourceLimit(const ResourceType type) +{ + return(GetMagickResourceLimit(type)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t S a m p l i n g F a c t o r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetSamplingFactors() gets the horizontal and vertical sampling factor. +% +% The format of the MagickGetSamplingFactors method is: +% +% double *MagickGetSamplingFactor(MagickWand *wand, +% size_t *number_factors) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o number_factors: the number of factors in the returned array. +% +*/ +WandExport double *MagickGetSamplingFactors(MagickWand *wand, + size_t *number_factors) +{ + double + *sampling_factors; + + const char + *p; + + ssize_t + i; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + *number_factors=0; + sampling_factors=(double *) NULL; + if (wand->image_info->sampling_factor == (char *) NULL) + return(sampling_factors); + i=0; + for (p=wand->image_info->sampling_factor; p != (char *) NULL; p=strchr(p,':')) + { + while (((int) *p != 0) && ((isspace((int) ((unsigned char) *p)) != 0) || + (*p == ':'))) + p++; + i++; + } + sampling_factors=(double *) AcquireQuantumMemory((size_t) i+1, + sizeof(*sampling_factors)); + if (sampling_factors == (double *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + wand->image_info->filename); + i=0; + for (p=wand->image_info->sampling_factor; p != (char *) NULL; p=strchr(p,':')) + { + while (((int) *p != 0) && ((isspace((int) ((unsigned char) *p)) != 0) || + (*p == ':'))) + p++; + sampling_factors[i]=StringToDouble(p,(char **) NULL); + i++; + } + *number_factors=(size_t) i; + return(sampling_factors); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t S i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetSize() returns the size associated with the magick wand. +% +% The format of the MagickGetSize method is: +% +% MagickBooleanType MagickGetSize(const MagickWand *wand, +% size_t *columns,size_t *rows) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: the width in pixels. +% +% o height: the height in pixels. +% +*/ +WandExport MagickBooleanType MagickGetSize(const MagickWand *wand, + size_t *columns,size_t *rows) +{ + RectangleInfo + geometry; + + assert(wand != (const MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) memset(&geometry,0,sizeof(geometry)); + (void) ParseAbsoluteGeometry(wand->image_info->size,&geometry); + *columns=geometry.width; + *rows=geometry.height; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t S i z e O f f s e t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetSizeOffset() returns the size offset associated with the magick +% wand. +% +% The format of the MagickGetSizeOffset method is: +% +% MagickBooleanType MagickGetSizeOffset(const MagickWand *wand, +% ssize_t *offset) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o offset: the image offset. +% +*/ +WandExport MagickBooleanType MagickGetSizeOffset(const MagickWand *wand, + ssize_t *offset) +{ + RectangleInfo + geometry; + + assert(wand != (const MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) memset(&geometry,0,sizeof(geometry)); + (void) ParseAbsoluteGeometry(wand->image_info->size,&geometry); + *offset=geometry.x; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetType() returns the wand type. +% +% The format of the MagickGetType method is: +% +% ImageType MagickGetType(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ImageType MagickGetType(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->image_info->type); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t V e r s i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetVersion() returns the ImageMagick API version as a string constant +% and as a number. +% +% The format of the MagickGetVersion method is: +% +% const char *MagickGetVersion(size_t *version) +% +% A description of each parameter follows: +% +% o version: the ImageMagick version is returned as a number. +% +*/ +WandExport const char *MagickGetVersion(size_t *version) +{ + return(GetMagickVersion(version)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k P r o f i l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickProfileImage() adds or removes a ICC, IPTC, or generic profile +% from an image. If the profile is NULL, it is removed from the image +% otherwise added. Use a name of '*' and a profile of NULL to remove all +% profiles from the image. +% +% The format of the MagickProfileImage method is: +% +% MagickBooleanType MagickProfileImage(MagickWand *wand,const char *name, +% const void *profile,const size_t length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o name: Name of profile to add or remove: ICC, IPTC, or generic profile. +% +% o profile: the profile. +% +% o length: the length of the profile. +% +*/ +WandExport MagickBooleanType MagickProfileImage(MagickWand *wand, + const char *name,const void *profile,const size_t length) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=ProfileImage(wand->images,name,profile,length,MagickTrue); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e m o v e I m a g e P r o f i l e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRemoveImageProfile() removes the named image profile and returns it. +% +% The format of the MagickRemoveImageProfile method is: +% +% unsigned char *MagickRemoveImageProfile(MagickWand *wand, +% const char *name,size_t *length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o name: Name of profile to return: ICC, IPTC, or generic profile. +% +% o length: the length of the profile. +% +*/ +WandExport unsigned char *MagickRemoveImageProfile(MagickWand *wand, + const char *name,size_t *length) +{ + StringInfo + *profile; + + unsigned char + *datum; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((unsigned char *) NULL); + } + *length=0; + profile=RemoveImageProfile(wand->images,name); + if (profile == (StringInfo *) NULL) + return((unsigned char *) NULL); + datum=(unsigned char *) AcquireQuantumMemory(GetStringInfoLength(profile), + sizeof(*datum)); + if (datum == (unsigned char *) NULL) + return((unsigned char *) NULL); + (void) memcpy(datum,GetStringInfoDatum(profile), + GetStringInfoLength(profile)); + *length=GetStringInfoLength(profile); + profile=DestroyStringInfo(profile); + return(datum); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t A n t i a l i a s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetAntialias() sets the antialias propery of the wand. +% +% The format of the MagickSetAntialias method is: +% +% MagickBooleanType MagickSetAntialias(MagickWand *wand, +% const MagickBooleanType antialias) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o antialias: the antialias property. +% +*/ +WandExport MagickBooleanType MagickSetAntialias(MagickWand *wand, + const MagickBooleanType antialias) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->image_info->antialias=antialias; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t B a c k g r o u n d C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetBackgroundColor() sets the wand background color. +% +% The format of the MagickSetBackgroundColor method is: +% +% MagickBooleanType MagickSetBackgroundColor(MagickWand *wand, +% const PixelWand *background) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o background: the background pixel wand. +% +*/ +WandExport MagickBooleanType MagickSetBackgroundColor(MagickWand *wand, + const PixelWand *background) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + PixelGetQuantumColor(background,&wand->image_info->background_color); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t C o l o r s p a c e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetColorspace() sets the wand colorspace type. +% +% The format of the MagickSetColorspace method is: +% +% MagickBooleanType MagickSetColorspace(MagickWand *wand, +% const ColorspaceType colorspace) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o colorspace: the wand colorspace. +% +*/ +WandExport MagickBooleanType MagickSetColorspace(MagickWand *wand, + const ColorspaceType colorspace) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->image_info->colorspace=colorspace; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t C o m p r e s s i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetCompression() sets the wand compression type. +% +% The format of the MagickSetCompression method is: +% +% MagickBooleanType MagickSetCompression(MagickWand *wand, +% const CompressionType compression) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o compression: the wand compression. +% +*/ +WandExport MagickBooleanType MagickSetCompression(MagickWand *wand, + const CompressionType compression) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->image_info->compression=compression; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t C o m p r e s s i o n Q u a l i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetCompressionQuality() sets the wand compression quality. +% +% The format of the MagickSetCompressionQuality method is: +% +% MagickBooleanType MagickSetCompressionQuality(MagickWand *wand, +% const size_t quality) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o quality: the wand compression quality. +% +*/ +WandExport MagickBooleanType MagickSetCompressionQuality(MagickWand *wand, + const size_t quality) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->image_info->quality=quality; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t D e p t h % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetDepth() sets the wand pixel depth. +% +% The format of the MagickSetDepth method is: +% +% MagickBooleanType MagickSetDepth(MagickWand *wand, +% const size_t depth) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o depth: the wand pixel depth. +% +*/ +WandExport MagickBooleanType MagickSetDepth(MagickWand *wand, + const size_t depth) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->image_info->depth=depth; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t E x t r a c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetExtract() sets the extract geometry before you read or write an +% image file. Use it for inline cropping (e.g. 200x200+0+0) or resizing +% (e.g.200x200). +% +% The format of the MagickSetExtract method is: +% +% MagickBooleanType MagickSetExtract(MagickWand *wand, +% const char *geometry) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o geometry: the extract geometry. +% +*/ +WandExport MagickBooleanType MagickSetExtract(MagickWand *wand, + const char *geometry) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->image_info->extract != (char *) NULL) + wand->image_info->extract=DestroyString(wand->image_info->extract); + if (geometry != (const char *) NULL) + (void) CloneString(&wand->image_info->extract,geometry); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t F i l e n a m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetFilename() sets the filename before you read or write an image file. +% +% The format of the MagickSetFilename method is: +% +% MagickBooleanType MagickSetFilename(MagickWand *wand, +% const char *filename) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o filename: the image filename. +% +*/ +WandExport MagickBooleanType MagickSetFilename(MagickWand *wand, + const char *filename) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (filename != (const char *) NULL) + (void) CopyMagickString(wand->image_info->filename,filename,MaxTextExtent); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t F o n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetFont() sets the font associated with the MagickWand. +% +% The format of the MagickSetFont method is: +% +% MagickBooleanType MagickSetFont(MagickWand *wand, const char *font) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o font: the font +% +*/ +WandExport MagickBooleanType MagickSetFont(MagickWand *wand,const char *font) +{ + if ((font == (const char *) NULL) || (*font == '\0')) + return(MagickFalse); + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) CloneString(&wand->image_info->font,font); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t F o r m a t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetFormat() sets the format of the magick wand. +% +% The format of the MagickSetFormat method is: +% +% MagickBooleanType MagickSetFormat(MagickWand *wand,const char *format) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o format: the image format. +% +*/ +WandExport MagickBooleanType MagickSetFormat(MagickWand *wand, + const char *format) +{ + const MagickInfo + *magick_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if ((format == (char *) NULL) || (*format == '\0')) + { + *wand->image_info->magick='\0'; + return(MagickTrue); + } + magick_info=GetMagickInfo(format,wand->exception); + if (magick_info == (const MagickInfo *) NULL) + return(MagickFalse); + ClearMagickException(wand->exception); + (void) CopyMagickString(wand->image_info->magick,format,MaxTextExtent); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t G r a v i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetGravity() sets the gravity type. +% +% The format of the MagickSetGravity type is: +% +% MagickBooleanType MagickSetGravity(MagickWand *wand, +% const GravityType type) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o type: the gravity type. +% +*/ +WandExport MagickBooleanType MagickSetGravity(MagickWand *wand, + const GravityType type) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + status=SetImageOption(wand->image_info,"gravity",CommandOptionToMnemonic( + MagickGravityOptions,(ssize_t) type)); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e A r t i f r c t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageArtifact() sets a key-value pair in the image artifact +% namespace. Artifacts differ from properties. Properties are public and are +% generally exported to an external image format if the format supports it. +% Artifacts are private and are utilized by the internal ImageMagick API to +% modify the behavior of certain algorithms. +% +% The format of the MagickSetImageArtifact method is: +% +% MagickBooleanType MagickSetImageArtifact(MagickWand *wand, +% const char *artifact,const char *value) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o artifact: the artifact. +% +% o value: the value. +% +*/ +WandExport MagickBooleanType MagickSetImageArtifact(MagickWand *wand, + const char *artifact,const char *value) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=SetImageArtifact(wand->images,artifact,value); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t P r o f i l e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageProfile() adds a named profile to the magick wand. If a +% profile with the same name already exists, it is replaced. This method +% differs from the MagickProfileImage() method in that it does not apply any +% CMS color profiles. +% +% The format of the MagickSetImageProfile method is: +% +% MagickBooleanType MagickSetImageProfile(MagickWand *wand, +% const char *name,const void *profile,const size_t length) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o name: Name of profile to add or remove: ICC, IPTC, or generic profile. +% +% o profile: the profile. +% +% o length: the length of the profile. +% +*/ +WandExport MagickBooleanType MagickSetImageProfile(MagickWand *wand, + const char *name,const void *profile,const size_t length) +{ + MagickBooleanType + status; + + StringInfo + *profile_info; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + profile_info=AcquireStringInfo((size_t) length); + SetStringInfoDatum(profile_info,(unsigned char *) profile); + status=SetImageProfile(wand->images,name,profile_info); + profile_info=DestroyStringInfo(profile_info); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I m a g e P r o p e r t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetImageProperty() associates a property with an image. +% +% The format of the MagickSetImageProperty method is: +% +% MagickBooleanType MagickSetImageProperty(MagickWand *wand, +% const char *property,const char *value) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o property: the property. +% +% o value: the value. +% +*/ +WandExport MagickBooleanType MagickSetImageProperty(MagickWand *wand, + const char *property,const char *value) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + ThrowWandException(WandError,"ContainsNoImages",wand->name); + status=SetImageProperty(wand->images,property,value); + if (status == MagickFalse) + InheritException(wand->exception,&wand->images->exception); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I n t e r l a c e S c h e m e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetInterlaceScheme() sets the image compression. +% +% The format of the MagickSetInterlaceScheme method is: +% +% MagickBooleanType MagickSetInterlaceScheme(MagickWand *wand, +% const InterlaceType interlace_scheme) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o interlace_scheme: the image interlace scheme: NoInterlace, LineInterlace, +% PlaneInterlace, PartitionInterlace. +% +*/ +WandExport MagickBooleanType MagickSetInterlaceScheme(MagickWand *wand, + const InterlaceType interlace_scheme) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->image_info->interlace=interlace_scheme; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I n t e r p o l a t e M e t h o d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetInterpolateMethod() sets the interpolate pixel method. +% +% The format of the MagickSetInterpolateMethod method is: +% +% MagickBooleanType MagickSetInterpolateMethod(MagickWand *wand, +% const InterpolateMethodPixel method) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o method: the interpolate pixel method. +% +*/ +WandExport MagickBooleanType MagickSetInterpolateMethod(MagickWand *wand, + const InterpolatePixelMethod method) +{ + MagickBooleanType + status; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + status=SetImageOption(wand->image_info,"interpolate", + CommandOptionToMnemonic(MagickInterpolateOptions,(ssize_t) method)); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t O p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetOption() associates one or options with the wand (.e.g +% MagickSetOption(wand,"jpeg:perserve","yes")). +% +% The format of the MagickSetOption method is: +% +% MagickBooleanType MagickSetOption(MagickWand *wand,const char *key, +% const char *value) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o key: The key. +% +% o value: The value. +% +*/ +WandExport MagickBooleanType MagickSetOption(MagickWand *wand,const char *key, + const char *value) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(SetImageOption(wand->image_info,key,value)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t O r i e n t a t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetOrientation() sets the wand orientation type. +% +% The format of the MagickSetOrientation method is: +% +% MagickBooleanType MagickSetOrientation(MagickWand *wand, +% const OrientationType orientation) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o orientation: the wand orientation. +% +*/ +WandExport MagickBooleanType MagickSetOrientation(MagickWand *wand, + const OrientationType orientation) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->image_info->orientation=orientation; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t P a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetPage() sets the page geometry of the magick wand. +% +% The format of the MagickSetPage method is: +% +% MagickBooleanType MagickSetPage(MagickWand *wand, +% const size_t width,const size_t height,const ssize_t x, +% const ssize_t y) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o width: the page width. +% +% o height: the page height. +% +% o x: the page x-offset. +% +% o y: the page y-offset. +% +*/ +WandExport MagickBooleanType MagickSetPage(MagickWand *wand, + const size_t width,const size_t height,const ssize_t x, + const ssize_t y) +{ + char + geometry[MaxTextExtent]; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.20g%+.20g%+.20g", + (double) width,(double) height,(double) x,(double) y); + (void) CloneString(&wand->image_info->page,geometry); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t P a s s p h r a s e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetPassphrase() sets the passphrase. +% +% The format of the MagickSetPassphrase method is: +% +% MagickBooleanType MagickSetPassphrase(MagickWand *wand, +% const char *passphrase) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o passphrase: the passphrase. +% +*/ +WandExport MagickBooleanType MagickSetPassphrase(MagickWand *wand, + const char *passphrase) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) CloneString(&wand->image_info->authenticate,passphrase); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t P o i n t s i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetPointsize() sets the font pointsize associated with the MagickWand. +% +% The format of the MagickSetPointsize method is: +% +% MagickBooleanType MagickSetPointsize(MagickWand *wand, +% const double pointsize) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o pointsize: the size of the font +% +*/ +WandExport MagickBooleanType MagickSetPointsize(MagickWand *wand, + const double pointsize) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->image_info->pointsize=pointsize; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t P r o g r e s s M o n i t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetProgressMonitor() sets the wand progress monitor to the specified +% method and returns the previous progress monitor if any. The progress +% monitor method looks like this: +% +% MagickBooleanType MagickProgressMonitor(const char *text, +% const MagickOffsetType offset,const MagickSizeType span, +% void *client_data) +% +% If the progress monitor returns MagickFalse, the current operation is +% interrupted. +% +% The format of the MagickSetProgressMonitor method is: +% +% MagickProgressMonitor MagickSetProgressMonitor(MagickWand *wand +% const MagickProgressMonitor progress_monitor,void *client_data) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o progress_monitor: Specifies a pointer to a method to monitor progress +% of an image operation. +% +% o client_data: Specifies a pointer to any client data. +% +*/ +WandExport MagickProgressMonitor MagickSetProgressMonitor(MagickWand *wand, + const MagickProgressMonitor progress_monitor,void *client_data) +{ + MagickProgressMonitor + previous_monitor; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + previous_monitor=SetImageInfoProgressMonitor(wand->image_info, + progress_monitor,client_data); + return(previous_monitor); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t R e s o u r c e L i m i t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetResourceLimit() sets the limit for a particular resource in +% megabytes. +% +% The format of the MagickSetResourceLimit method is: +% +% MagickBooleanType MagickSetResourceLimit(const ResourceType type, +% const MagickSizeType limit) +% +% A description of each parameter follows: +% +% o type: the type of resource: AreaResource, MemoryResource, MapResource, +% DiskResource, FileResource. +% +% o The maximum limit for the resource. +% +*/ +WandExport MagickBooleanType MagickSetResourceLimit(const ResourceType type, + const MagickSizeType limit) +{ + return(SetMagickResourceLimit(type,limit)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t R e s o l u t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetResolution() sets the image resolution. +% +% The format of the MagickSetResolution method is: +% +% MagickBooleanType MagickSetResolution(MagickWand *wand, +% const double x_resolution,const double y_resolution) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x_resolution: the image x resolution. +% +% o y_resolution: the image y resolution. +% +*/ +WandExport MagickBooleanType MagickSetResolution(MagickWand *wand, + const double x_resolution,const double y_resolution) +{ + char + density[MaxTextExtent]; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) FormatLocaleString(density,MaxTextExtent,"%gx%g",x_resolution, + y_resolution); + (void) CloneString(&wand->image_info->density,density); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t S a m p l i n g F a c t o r s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetSamplingFactors() sets the image sampling factors. +% +% The format of the MagickSetSamplingFactors method is: +% +% MagickBooleanType MagickSetSamplingFactors(MagickWand *wand, +% const size_t number_factors,const double *sampling_factors) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o number_factoes: the number of factors. +% +% o sampling_factors: An array of doubles representing the sampling factor +% for each color component (in RGB order). +% +*/ +WandExport MagickBooleanType MagickSetSamplingFactors(MagickWand *wand, + const size_t number_factors,const double *sampling_factors) +{ + char + sampling_factor[MaxTextExtent]; + + ssize_t + i; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->image_info->sampling_factor != (char *) NULL) + wand->image_info->sampling_factor=(char *) + RelinquishMagickMemory(wand->image_info->sampling_factor); + if (number_factors == 0) + return(MagickTrue); + for (i=0; i < (ssize_t) (number_factors-1); i++) + { + (void) FormatLocaleString(sampling_factor,MaxTextExtent,"%g:", + sampling_factors[i]); + (void) ConcatenateString(&wand->image_info->sampling_factor, + sampling_factor); + } + (void) FormatLocaleString(sampling_factor,MaxTextExtent,"%g", + sampling_factors[i]); + (void) ConcatenateString(&wand->image_info->sampling_factor,sampling_factor); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t S e c u r i t y P o l i c y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetSecurityPolicy() sets the ImageMagick security policy. It returns +% MagickFalse if the policy is already set or if the policy does not parse. +% +% The format of the MagickSetAntialias method is: +% +% MagickBooleanType MagickSetAntialias(MagickWand *wand, +% const char *policy) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o policy: the security policy in the XML format. +% +*/ +WandExport MagickBooleanType MagickSetSecurityPolicy(MagickWand *wand, + const char *policy) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + + return(SetMagickSecurityPolicy(policy,wand->exception)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t S i z e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetSize() sets the size of the magick wand. Set it before you +% read a raw image format such as RGB, GRAY, or CMYK. +% +% The format of the MagickSetSize method is: +% +% MagickBooleanType MagickSetSize(MagickWand *wand, +% const size_t columns,const size_t rows) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: the width in pixels. +% +% o rows: the rows in pixels. +% +*/ +WandExport MagickBooleanType MagickSetSize(MagickWand *wand, + const size_t columns,const size_t rows) +{ + char + geometry[MaxTextExtent]; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.20g",(double) + columns,(double) rows); + (void) CloneString(&wand->image_info->size,geometry); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t S i z e O f f s e t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetSizeOffset() sets the size and offset of the magick wand. Set it +% before you read a raw image format such as RGB, GRAY, or CMYK. +% +% The format of the MagickSetSizeOffset method is: +% +% MagickBooleanType MagickSetSizeOffset(MagickWand *wand, +% const size_t columns,const size_t rows, +% const ssize_t offset) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o columns: the image width in pixels. +% +% o rows: the image rows in pixels. +% +% o offset: the image offset. +% +*/ +WandExport MagickBooleanType MagickSetSizeOffset(MagickWand *wand, + const size_t columns,const size_t rows,const ssize_t offset) +{ + char + geometry[MaxTextExtent]; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.20g%+.20g", + (double) columns,(double) rows,(double) offset); + (void) CloneString(&wand->image_info->size,geometry); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetType() sets the image type attribute. +% +% The format of the MagickSetType method is: +% +% MagickBooleanType MagickSetType(MagickWand *wand, +% const ImageType image_type) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o image_type: the image type: UndefinedType, BilevelType, GrayscaleType, +% GrayscaleMatteType, PaletteType, PaletteMatteType, TrueColorType, +% TrueColorMatteType, ColorSeparationType, ColorSeparationMatteType, +% or OptimizeType. +% +*/ +WandExport MagickBooleanType MagickSetType(MagickWand *wand, + const ImageType image_type) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->image_info->type=image_type; + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/wand/magick-property.h b/ImageMagick-6.9.12-44/wand/magick-property.h new file mode 100644 index 0000000..c7e10d7 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/magick-property.h @@ -0,0 +1,143 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand property, options, and profile methods. +*/ + +#ifndef MAGICKWAND_MAGICK_PROPERTY_H +#define MAGICKWAND_MAGICK_PROPERTY_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport char + *MagickGetFilename(const MagickWand *), + *MagickGetFormat(MagickWand *), + *MagickGetFont(MagickWand *), + *MagickGetHomeURL(void), + *MagickGetImageArtifact(MagickWand *,const char *), + **MagickGetImageArtifacts(MagickWand *,const char *,size_t *), + **MagickGetImageProfiles(MagickWand *,const char *,size_t *), + *MagickGetImageProperty(MagickWand *,const char *), + **MagickGetImageProperties(MagickWand *,const char *,size_t *), + *MagickGetOption(MagickWand *,const char *), + **MagickGetOptions(MagickWand *,const char *,size_t *), + *MagickQueryConfigureOption(const char *), + **MagickQueryConfigureOptions(const char *,size_t *), + **MagickQueryFonts(const char *,size_t *), + **MagickQueryFormats(const char *,size_t *); + +extern WandExport ColorspaceType + MagickGetColorspace(MagickWand *); + +extern WandExport CompressionType + MagickGetCompression(MagickWand *); + +extern WandExport const char + *MagickGetCopyright(void), + *MagickGetPackageName(void), + *MagickGetQuantumDepth(size_t *), + *MagickGetQuantumRange(size_t *), + *MagickGetReleaseDate(void), + *MagickGetVersion(size_t *); + +extern WandExport double + MagickGetPointsize(MagickWand *), + *MagickGetSamplingFactors(MagickWand *,size_t *), + *MagickQueryFontMetrics(MagickWand *,const DrawingWand *,const char *), + *MagickQueryMultilineFontMetrics(MagickWand *,const DrawingWand *, + const char *); + +extern WandExport GravityType + MagickGetGravity(MagickWand *); + +extern WandExport ImageType + MagickGetType(MagickWand *); + +extern WandExport InterlaceType + MagickGetInterlaceScheme(MagickWand *); + +extern WandExport InterpolatePixelMethod + MagickGetInterpolateMethod(MagickWand *); + +extern WandExport OrientationType + MagickGetOrientation(MagickWand *); + +extern WandExport MagickBooleanType + MagickDeleteImageArtifact(MagickWand *,const char *), + MagickDeleteImageProperty(MagickWand *,const char *), + MagickDeleteOption(MagickWand *,const char *), + MagickGetAntialias(const MagickWand *), + MagickGetPage(const MagickWand *,size_t *,size_t *,ssize_t *,ssize_t *), + MagickGetResolution(const MagickWand *,double *,double *), + MagickGetSize(const MagickWand *,size_t *,size_t *), + MagickGetSizeOffset(const MagickWand *,ssize_t *), + MagickProfileImage(MagickWand *,const char *,const void *,const size_t), + MagickSetAntialias(MagickWand *,const MagickBooleanType), + MagickSetBackgroundColor(MagickWand *,const PixelWand *), + MagickSetColorspace(MagickWand *,const ColorspaceType), + MagickSetCompression(MagickWand *,const CompressionType), + MagickSetCompressionQuality(MagickWand *,const size_t), + MagickSetDepth(MagickWand *,const size_t), + MagickSetExtract(MagickWand *,const char *), + MagickSetFilename(MagickWand *,const char *), + MagickSetFormat(MagickWand *,const char *), + MagickSetFont(MagickWand *,const char *), + MagickSetGravity(MagickWand *,const GravityType), + MagickSetImageArtifact(MagickWand *,const char *,const char *), + MagickSetImageProfile(MagickWand *,const char *,const void *,const size_t), + MagickSetImageProperty(MagickWand *,const char *,const char *), + MagickSetInterlaceScheme(MagickWand *,const InterlaceType), + MagickSetInterpolateMethod(MagickWand *,const InterpolatePixelMethod), + MagickSetOption(MagickWand *,const char *,const char *), + MagickSetOrientation(MagickWand *,const OrientationType), + MagickSetPage(MagickWand *,const size_t,const size_t,const ssize_t, + const ssize_t), + MagickSetPassphrase(MagickWand *,const char *), + MagickSetPointsize(MagickWand *,const double), + MagickSetResolution(MagickWand *,const double,const double), + MagickSetResourceLimit(const ResourceType type,const MagickSizeType limit), + MagickSetSamplingFactors(MagickWand *,const size_t,const double *), + MagickSetSecurityPolicy(MagickWand *,const char *), + MagickSetSize(MagickWand *,const size_t,const size_t), + MagickSetSizeOffset(MagickWand *,const size_t,const size_t,const ssize_t), + MagickSetType(MagickWand *,const ImageType); + +extern WandExport MagickProgressMonitor + MagickSetProgressMonitor(MagickWand *,const MagickProgressMonitor,void *); + +extern WandExport MagickSizeType + MagickGetResource(const ResourceType), + MagickGetResourceLimit(const ResourceType); + +extern WandExport PixelWand + *MagickGetBackgroundColor(MagickWand *); + +extern WandExport OrientationType + MagickGetOrientationType(MagickWand *); + +extern WandExport size_t + MagickGetCompressionQuality(MagickWand *); + +extern WandExport unsigned char + *MagickGetImageProfile(MagickWand *,const char *,size_t *), + *MagickRemoveImageProfile(MagickWand *,const char *,size_t *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/magick-wand-private.h b/ImageMagick-6.9.12-44/wand/magick-wand-private.h new file mode 100644 index 0000000..689bbc9 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/magick-wand-private.h @@ -0,0 +1,83 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + ImageMagick pixel wand API. +*/ +#ifndef MAGICKWAND_MAGICK_WAND_PRIVATE_H +#define MAGICKWAND_MAGICK_WAND_PRIVATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define MagickPI 3.14159265358979323846264338327950288419716939937510 +#define MagickWandId "MagickWand" +#define QuantumTick(i,span) ((MagickBooleanType) ((((i) & ((i)-1)) == 0) || \ + (((i) & 0xfff) == 0) || \ + ((MagickOffsetType) (i) == ((MagickOffsetType) (span)-1)))) +#define ThrowWandException(severity,tag,context) \ +{ \ + (void) ThrowMagickException(wand->exception,GetMagickModule(),severity, \ + tag,"`%s'",context); \ + return(MagickFalse); \ +} +#define ThrowWandFatalException(severity,tag,context) \ +{ \ + ExceptionInfo \ + *exception; \ + \ + exception=AcquireExceptionInfo(); \ + (void) ThrowMagickException(exception,GetMagickModule(),severity,tag, \ + "`%s'",context); \ + CatchException(exception); \ + (void) DestroyExceptionInfo(exception); \ + MagickWandTerminus(); \ + _exit((int) (severity-FatalErrorException)+1); \ +} + +struct _MagickWand +{ + size_t + id; + + char + name[MaxTextExtent]; + + ExceptionInfo + *exception; + + ImageInfo + *image_info; + + QuantizeInfo + *quantize_info; + + Image + *images; + + MagickBooleanType + insert_before, + image_pending, + debug; + + size_t + signature; +}; + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/magick-wand.c b/ImageMagick-6.9.12-44/wand/magick-wand.c new file mode 100644 index 0000000..d956893 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/magick-wand.c @@ -0,0 +1,1147 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M AAA GGGG IIIII CCCC K K % +% MM MM A A G I C K K % +% M M M AAAAA G GGG I C KKK % +% M M A A G G I C K K % +% M M A A GGGG IIIII CCCC K K % +% % +% W W AAA N N DDDD % +% W W A A NN N D D % +% W W W AAAAA N N N D D % +% WW WW A A N NN D D % +% W W A A N N DDDD % +% % +% % +% MagickWand Wand Methods % +% % +% Software Design % +% Cristy % +% August 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/magick-wand-private.h" +#include "wand/wand.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l e a r M a g i c k W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClearMagickWand() clears resources associated with the wand, leaving the +% wand blank, and ready to be used for a new set of images. +% +% The format of the ClearMagickWand method is: +% +% void ClearMagickWand(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport void ClearMagickWand(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->quantize_info=DestroyQuantizeInfo(wand->quantize_info); + wand->image_info=DestroyImageInfo(wand->image_info); + wand->images=DestroyImageList(wand->images); + wand->image_info=AcquireImageInfo(); + wand->quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL); + wand->insert_before=MagickFalse; + wand->image_pending=MagickFalse; + ClearMagickException(wand->exception); + wand->debug=IsEventLogging(); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e M a g i c k W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneMagickWand() makes an exact copy of the specified wand. +% +% The format of the CloneMagickWand method is: +% +% MagickWand *CloneMagickWand(const MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *CloneMagickWand(const MagickWand *wand) +{ + MagickWand + *clone_wand; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + clone_wand=(MagickWand *) AcquireCriticalMemory(sizeof(*clone_wand)); + (void) memset(clone_wand,0,sizeof(*clone_wand)); + clone_wand->id=AcquireWandId(); + (void) FormatLocaleString(clone_wand->name,MaxTextExtent,"%s-%.20g", + MagickWandId,(double) clone_wand->id); + clone_wand->exception=AcquireExceptionInfo(); + InheritException(clone_wand->exception,wand->exception); + clone_wand->image_info=CloneImageInfo(wand->image_info); + clone_wand->quantize_info=CloneQuantizeInfo(wand->quantize_info); + clone_wand->images=CloneImageList(wand->images,clone_wand->exception); + clone_wand->insert_before=MagickFalse; + clone_wand->image_pending=MagickFalse; + clone_wand->debug=IsEventLogging(); + if (clone_wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_wand->name); + clone_wand->signature=WandSignature; + return(clone_wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y M a g i c k W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyMagickWand() deallocates memory associated with an MagickWand. +% +% The format of the DestroyMagickWand method is: +% +% MagickWand *DestroyMagickWand(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickWand *DestroyMagickWand(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->images=DestroyImageList(wand->images); + if (wand->quantize_info != (QuantizeInfo *) NULL ) + wand->quantize_info=DestroyQuantizeInfo(wand->quantize_info); + if (wand->image_info != (ImageInfo *) NULL ) + wand->image_info=DestroyImageInfo(wand->image_info); + if (wand->exception != (ExceptionInfo *) NULL ) + wand->exception=DestroyExceptionInfo(wand->exception); + RelinquishWandId(wand->id); + wand->signature=(~WandSignature); + wand=(MagickWand *) RelinquishMagickMemory(wand); + return(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s M a g i c k W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsMagickWand() returns MagickTrue if the wand is verified as a magick wand. +% +% The format of the IsMagickWand method is: +% +% MagickBooleanType IsMagickWand(const MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType IsMagickWand(const MagickWand *wand) +{ + if (wand == (const MagickWand *) NULL) + return(MagickFalse); + if (wand->signature != WandSignature) + return(MagickFalse); + if (LocaleNCompare(wand->name,MagickWandId,strlen(MagickWandId)) != 0) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C l e a r E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickClearException() clears any exceptions associated with the wand. +% +% The format of the MagickClearException method is: +% +% MagickBooleanType MagickClearException(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType MagickClearException(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + ClearMagickException(wand->exception); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetException() returns the severity, reason, and description of any +% error that occurs when using other methods in this API. +% +% The format of the MagickGetException method is: +% +% char *MagickGetException(const MagickWand *wand,ExceptionType *severity) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o severity: the severity of the error is returned here. +% +*/ +WandExport char *MagickGetException(const MagickWand *wand, + ExceptionType *severity) +{ + char + *description; + + assert(wand != (const MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(severity != (ExceptionType *) NULL); + *severity=wand->exception->severity; + description=(char *) AcquireQuantumMemory(2UL*MaxTextExtent, + sizeof(*description)); + if (description == (char *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "MemoryAllocationFailed","`%s'",wand->name); + return((char *) NULL); + } + *description='\0'; + if (wand->exception->reason != (char *) NULL) + (void) CopyMagickString(description,GetLocaleExceptionMessage( + wand->exception->severity,wand->exception->reason),MaxTextExtent); + if (wand->exception->description != (char *) NULL) + { + (void) ConcatenateMagickString(description," (",MaxTextExtent); + (void) ConcatenateMagickString(description,GetLocaleExceptionMessage( + wand->exception->severity,wand->exception->description),MaxTextExtent); + (void) ConcatenateMagickString(description,")",MaxTextExtent); + } + return(description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t E x c e p t i o n T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetExceptionType() returns the exception type associated with the +% wand. If no exception has occurred, UndefinedExceptionType is returned. +% +% The format of the MagickGetExceptionType method is: +% +% ExceptionType MagickGetExceptionType(const MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ExceptionType MagickGetExceptionType(const MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->exception->severity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k G e t I t e r a t o r I n d e x % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickGetIteratorIndex() returns the position of the iterator in the image +% list. +% +% The format of the MagickGetIteratorIndex method is: +% +% ssize_t MagickGetIteratorIndex(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ssize_t MagickGetIteratorIndex(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoIterators","`%s'",wand->name); + return(-1); + } + return(GetImageIndexInList(wand->images)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k Q u e r y C o n f i g u r e O p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickQueryConfigureOption() returns the value associated with the specified +% configure option. +% +% The format of the MagickQueryConfigureOption function is: +% +% char *MagickQueryConfigureOption(const char *option) +% +% A description of each parameter follows: +% +% o option: the option name. +% +*/ +WandExport char *MagickQueryConfigureOption(const char *option) +{ + char + *value; + + const ConfigureInfo + **configure_info; + + ExceptionInfo + *exception; + + size_t + number_options; + + exception=AcquireExceptionInfo(); + configure_info=GetConfigureInfoList(option,&number_options,exception); + exception=DestroyExceptionInfo(exception); + if (configure_info == (const ConfigureInfo **) NULL) + return((char *) NULL); + value=(char *) NULL; + if (number_options != 0) + value=AcquireString(configure_info[0]->value); + configure_info=(const ConfigureInfo **) + RelinquishMagickMemory((void *) configure_info); + return(value); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k Q u e r y C o n f i g u r e O p t i o n s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickQueryConfigureOptions() returns any configure options that match the +% specified pattern (e.g. "*" for all). Options include NAME, VERSION, +% LIB_VERSION, etc. +% +% The format of the MagickQueryConfigureOptions function is: +% +% char **MagickQueryConfigureOptions(const char *pattern, +% size_t *number_options) +% +% A description of each parameter follows: +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_options: Returns the number of configure options in the list. +% +% +*/ +WandExport char **MagickQueryConfigureOptions(const char *pattern, + size_t *number_options) +{ + char + **options; + + ExceptionInfo + *exception; + + exception=AcquireExceptionInfo(); + options=GetConfigureList(pattern,number_options,exception); + exception=DestroyExceptionInfo(exception); + return(options); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k Q u e r y F o n t M e t r i c s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickQueryFontMetrics() returns a 13 element array representing the +% following font metrics: +% +% Element Description +% ------------------------------------------------- +% 0 character width +% 1 character height +% 2 ascender +% 3 descender +% 4 text width +% 5 text height +% 6 maximum horizontal advance +% 7 bounding box: x1 +% 8 bounding box: y1 +% 9 bounding box: x2 +% 10 bounding box: y2 +% 11 origin: x +% 12 origin: y +% +% The format of the MagickQueryFontMetrics method is: +% +% double *MagickQueryFontMetrics(MagickWand *wand, +% const DrawingWand *drawing_wand,const char *text) +% +% A description of each parameter follows: +% +% o wand: the Magick wand. +% +% o drawing_wand: the drawing wand. +% +% o text: the text. +% +*/ +WandExport double *MagickQueryFontMetrics(MagickWand *wand, + const DrawingWand *drawing_wand,const char *text) +{ + double + *font_metrics; + + DrawInfo + *draw_info; + + MagickBooleanType + status; + + TypeMetric + metrics; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(drawing_wand != (const DrawingWand *) NULL); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((double *) NULL); + } + font_metrics=(double *) AcquireQuantumMemory(13UL,sizeof(*font_metrics)); + if (font_metrics == (double *) NULL) + return((double *) NULL); + draw_info=PeekDrawingWand(drawing_wand); + if (draw_info == (DrawInfo *) NULL) + { + font_metrics=(double *) RelinquishMagickMemory(font_metrics); + return((double *) NULL); + } + (void) CloneString(&draw_info->text,text); + (void) memset(&metrics,0,sizeof(metrics)); + status=GetTypeMetrics(wand->images,draw_info,&metrics); + draw_info=DestroyDrawInfo(draw_info); + if (status == MagickFalse) + { + InheritException(wand->exception,&wand->images->exception); + font_metrics=(double *) RelinquishMagickMemory(font_metrics); + return((double *) NULL); + } + font_metrics[0]=metrics.pixels_per_em.x; + font_metrics[1]=metrics.pixels_per_em.y; + font_metrics[2]=metrics.ascent; + font_metrics[3]=metrics.descent; + font_metrics[4]=metrics.width; + font_metrics[5]=metrics.height; + font_metrics[6]=metrics.max_advance; + font_metrics[7]=metrics.bounds.x1; + font_metrics[8]=metrics.bounds.y1; + font_metrics[9]=metrics.bounds.x2; + font_metrics[10]=metrics.bounds.y2; + font_metrics[11]=metrics.origin.x; + font_metrics[12]=metrics.origin.y; + return(font_metrics); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k Q u e r y M u l t i l i n e F o n t M e t r i c s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickQueryMultilineFontMetrics() returns a 13 element array representing the +% following font metrics: +% +% Element Description +% ------------------------------------------------- +% 0 character width +% 1 character height +% 2 ascender +% 3 descender +% 4 text width +% 5 text height +% 6 maximum horizontal advance +% 7 bounding box: x1 +% 8 bounding box: y1 +% 9 bounding box: x2 +% 10 bounding box: y2 +% 11 origin: x +% 12 origin: y +% +% This method is like MagickQueryFontMetrics() but it returns the maximum text +% width and height for multiple lines of text. +% +% The format of the MagickQueryFontMetrics method is: +% +% double *MagickQueryMultilineFontMetrics(MagickWand *wand, +% const DrawingWand *drawing_wand,const char *text) +% +% A description of each parameter follows: +% +% o wand: the Magick wand. +% +% o drawing_wand: the drawing wand. +% +% o text: the text. +% +*/ +WandExport double *MagickQueryMultilineFontMetrics(MagickWand *wand, + const DrawingWand *drawing_wand,const char *text) +{ + double + *font_metrics; + + DrawInfo + *draw_info; + + MagickBooleanType + status; + + TypeMetric + metrics; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(drawing_wand != (const DrawingWand *) NULL); + if (wand->images == (Image *) NULL) + { + (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError, + "ContainsNoImages","`%s'",wand->name); + return((double *) NULL); + } + font_metrics=(double *) AcquireQuantumMemory(13UL,sizeof(*font_metrics)); + if (font_metrics == (double *) NULL) + return((double *) NULL); + draw_info=PeekDrawingWand(drawing_wand); + if (draw_info == (DrawInfo *) NULL) + { + font_metrics=(double *) RelinquishMagickMemory(font_metrics); + return((double *) NULL); + } + (void) CloneString(&draw_info->text,text); + (void) memset(&metrics,0,sizeof(metrics)); + status=GetMultilineTypeMetrics(wand->images,draw_info,&metrics); + draw_info=DestroyDrawInfo(draw_info); + if (status == MagickFalse) + { + InheritException(wand->exception,&wand->images->exception); + font_metrics=(double *) RelinquishMagickMemory(font_metrics); + return((double *) NULL); + } + font_metrics[0]=metrics.pixels_per_em.x; + font_metrics[1]=metrics.pixels_per_em.y; + font_metrics[2]=metrics.ascent; + font_metrics[3]=metrics.descent; + font_metrics[4]=metrics.width; + font_metrics[5]=metrics.height; + font_metrics[6]=metrics.max_advance; + font_metrics[7]=metrics.bounds.x1; + font_metrics[8]=metrics.bounds.y1; + font_metrics[9]=metrics.bounds.x2; + font_metrics[10]=metrics.bounds.y2; + font_metrics[11]=metrics.origin.x; + font_metrics[12]=metrics.origin.y; + return(font_metrics); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k Q u e r y F o n t s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickQueryFonts() returns any font that match the specified pattern (e.g. +% "*" for all). +% +% The format of the MagickQueryFonts function is: +% +% char **MagickQueryFonts(const char *pattern,size_t *number_fonts) +% +% A description of each parameter follows: +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_fonts: Returns the number of fonts in the list. +% +% +*/ +WandExport char **MagickQueryFonts(const char *pattern, + size_t *number_fonts) +{ + char + **fonts; + + ExceptionInfo + *exception; + + exception=AcquireExceptionInfo(); + fonts=GetTypeList(pattern,number_fonts,exception); + exception=DestroyExceptionInfo(exception); + return(fonts); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k Q u e r y F o r m a t s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickQueryFormats() returns any image formats that match the specified +% pattern (e.g. "*" for all). +% +% The format of the MagickQueryFormats function is: +% +% char **MagickQueryFormats(const char *pattern,size_t *number_formats) +% +% A description of each parameter follows: +% +% o pattern: Specifies a pointer to a text string containing a pattern. +% +% o number_formats: This integer returns the number of image formats in the +% list. +% +*/ +WandExport char **MagickQueryFormats(const char *pattern, + size_t *number_formats) +{ + char + **formats; + + ExceptionInfo + *exception; + + exception=AcquireExceptionInfo(); + formats=GetMagickList(pattern,number_formats,exception); + exception=DestroyExceptionInfo(exception); + return(formats); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e l i n q u i s h M e m o r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickRelinquishMemory() relinquishes memory resources returned by such +% methods as MagickIdentifyImage(), MagickGetException(), etc. +% +% The format of the MagickRelinquishMemory method is: +% +% void *MagickRelinquishMemory(void *resource) +% +% A description of each parameter follows: +% +% o resource: Relinquish the memory associated with this resource. +% +*/ +WandExport void *MagickRelinquishMemory(void *memory) +{ + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + return(RelinquishMagickMemory(memory)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k R e s e t I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickResetIterator() resets the wand iterator. +% +% It is typically used either before iterating though images, or before +% calling specific functions such as MagickAppendImages() to append all +% images together. +% +% Afterward you can use MagickNextImage() to iterate over all the images +% in a wand container, starting with the first image. +% +% Using this before MagickAddImages() or MagickReadImages() will cause +% new images to be inserted between the first and second image. +% +% The format of the MagickResetIterator method is: +% +% void MagickResetIterator(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport void MagickResetIterator(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->images=GetFirstImageInList(wand->images); + wand->insert_before=MagickFalse; /* Insert/add after current (first) image */ + wand->image_pending=MagickTrue; /* NextImage will set first image */ +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t F i r s t I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetFirstIterator() sets the wand iterator to the first image. +% +% After using any images added to the wand using MagickAddImage() or +% MagickReadImage() will be prepended before any image in the wand. +% +% Also the current image has been set to the first image (if any) in the +% Magick Wand. Using MagickNextImage() will then set teh current image +% to the second image in the list (if present). +% +% This operation is similar to MagickResetIterator() but differs in how +% MagickAddImage(), MagickReadImage(), and MagickNextImage() behaves +% afterward. +% +% The format of the MagickSetFirstIterator method is: +% +% void MagickSetFirstIterator(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport void MagickSetFirstIterator(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->images=GetFirstImageInList(wand->images); + wand->insert_before=MagickTrue; /* Insert/add before the first image */ + wand->image_pending=MagickFalse; /* NextImage will set next image */ +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t I t e r a t o r I n d e x % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetIteratorIndex() set the iterator to the given position in the +% image list specified with the index parameter. A zero index will set +% the first image as current, and so on. Negative indexes can be used +% to specify an image relative to the end of the images in the wand, with +% -1 being the last image in the wand. +% +% If the index is invalid (range too large for number of images in wand) +% the function will return MagickFalse, but no 'exception' will be raised, +% as it is not actually an error. In that case the current image will not +% change. +% +% After using any images added to the wand using MagickAddImage() or +% MagickReadImage() will be added after the image indexed, regardless +% of if a zero (first image in list) or negative index (from end) is used. +% +% Jumping to index 0 is similar to MagickResetIterator() but differs in how +% MagickNextImage() behaves afterward. +% +% The format of the MagickSetIteratorIndex method is: +% +% MagickBooleanType MagickSetIteratorIndex(MagickWand *wand, +% const ssize_t index) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o index: the scene number. +% +*/ +WandExport MagickBooleanType MagickSetIteratorIndex(MagickWand *wand, + const ssize_t index) +{ + Image + *image; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + if (wand->images == (Image *) NULL) + return(MagickFalse); + image=GetImageFromList(wand->images,index); + if (image == (Image *) NULL) + { + InheritException(wand->exception,&wand->images->exception); + return(MagickFalse); + } + wand->images=image; + wand->insert_before=MagickFalse; /* Insert/Add after (this) image */ + wand->image_pending=MagickFalse; /* NextImage will set next image */ + return(MagickTrue); +} +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k S e t L a s t I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickSetLastIterator() sets the wand iterator to the last image. +% +% The last image is actually the current image, and the next use of +% MagickPreviousImage() will not change this allowing this function to be +% used to iterate over the images in the reverse direction. In this sense it +% is more like MagickResetIterator() than MagickSetFirstIterator(). +% +% Typically this function is used before MagickAddImage(), MagickReadImage() +% functions to ensure new images are appended to the very end of wand's image +% list. +% +% The format of the MagickSetLastIterator method is: +% +% void MagickSetLastIterator(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport void MagickSetLastIterator(MagickWand *wand) +{ + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->images=GetLastImageInList(wand->images); + wand->insert_before=MagickFalse; /* Insert/add after current (last) image */ + wand->image_pending=MagickTrue; /* PreviousImage will return last image */ +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k W a n d G e n e s i s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickWandGenesis() initializes the MagickWand environment. +% +% The format of the MagickWandGenesis method is: +% +% void MagickWandGenesis(void) +% +*/ +WandExport void MagickWandGenesis(void) +{ + if (IsMagickCoreInstantiated() == MagickFalse) + MagickCoreGenesis((char *) NULL,MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k W a n d T e r m i n u s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickWandTerminus() terminates the MagickWand environment. +% +% The format of the MagickWandTerminus method is: +% +% void MagickWandTerminus(void) +% +*/ +WandExport void MagickWandTerminus(void) +{ + DestroyWandIds(); + MagickCoreTerminus(); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w M a g i c k W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewMagickWand() returns a wand required for all other methods in the API. +% A fatal exception is thrown if there is not enough memory to allocate the +% wand. Use DestroyMagickWand() to dispose of the wand when it is no longer +% needed. +% +% The format of the NewMagickWand method is: +% +% MagickWand *NewMagickWand(void) +% +*/ +WandExport MagickWand *NewMagickWand(void) +{ + const char + *quantum; + + MagickWand + *wand; + + size_t + depth; + + depth=MAGICKCORE_QUANTUM_DEPTH; + quantum=GetMagickQuantumDepth(&depth); + if (depth != MAGICKCORE_QUANTUM_DEPTH) + ThrowWandFatalException(WandError,"QuantumDepthMismatch",quantum); + wand=(MagickWand *) AcquireMagickMemory(sizeof(*wand)); + if (wand == (MagickWand *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + (void) memset(wand,0,sizeof(*wand)); + wand->id=AcquireWandId(); + (void) FormatLocaleString(wand->name,MaxTextExtent,"%s-%.20g",MagickWandId, + (double) wand->id); + wand->images=NewImageList(); + wand->image_info=AcquireImageInfo(); + wand->exception=AcquireExceptionInfo(); + wand->quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL); + wand->debug=IsEventLogging(); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->signature=WandSignature; + return(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w M a g i c k W a n d F r o m I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewMagickWandFromImage() returns a wand with an image. +% +% The format of the NewMagickWandFromImage method is: +% +% MagickWand *NewMagickWandFromImage(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +WandExport MagickWand *NewMagickWandFromImage(const Image *image) +{ + MagickWand + *wand; + + wand=NewMagickWand(); + wand->images=CloneImage(image,0,0,MagickTrue,wand->exception); + return(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s M a g i c k W a n d I n s t a n t i a t e d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsMagickWandInstantiated() returns MagickTrue if the ImageMagick environment +% is currently instantiated-- that is, MagickWandGenesis() has been called but +% MagickWandTerminus() has not. +% +% The format of the IsMagickWandInstantiated method is: +% +% MagickBooleanType IsMagickWandInstantiated(void) +% +*/ +MagickExport MagickBooleanType IsMagickWandInstantiated(void) +{ + return(IsMagickCoreInstantiated()); +} diff --git a/ImageMagick-6.9.12-44/wand/magick-wand.h b/ImageMagick-6.9.12-44/wand/magick-wand.h new file mode 100644 index 0000000..5b46837 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/magick-wand.h @@ -0,0 +1,24 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand API (deprecated, use magick-wand.h instead). +*/ + +#ifndef MAGICKWAND_MAGICK_WAND_DEPRECATED_H +#define MAGICKWAND_MAGICK_WAND_DEPRECATED_H + +#include "wand/MagickWand.h" + +#endif diff --git a/ImageMagick-6.9.12-44/wand/magick_wand.h b/ImageMagick-6.9.12-44/wand/magick_wand.h new file mode 100644 index 0000000..5b46837 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/magick_wand.h @@ -0,0 +1,24 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand API (deprecated, use magick-wand.h instead). +*/ + +#ifndef MAGICKWAND_MAGICK_WAND_DEPRECATED_H +#define MAGICKWAND_MAGICK_WAND_DEPRECATED_H + +#include "wand/MagickWand.h" + +#endif diff --git a/ImageMagick-6.9.12-44/wand/method-attribute.h b/ImageMagick-6.9.12-44/wand/method-attribute.h new file mode 100644 index 0000000..7d5c46a --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/method-attribute.h @@ -0,0 +1,118 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand method attribute. +*/ +#ifndef MAGICKWAND_METHOD_ATTRIBUTE_H +#define MAGICKWAND_METHOD_ATTRIBUTE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if defined(__BORLANDC__) && defined(_DLL) +# define _MAGICKDLL_ +# define _MAGICKLIB_ +# define MAGICKCORE_MODULES_SUPPORT +# undef MAGICKCORE_BUILD_MODULES +#endif + +#if defined(MAGICKWAND_WINDOWS_SUPPORT) && !defined(__CYGWIN__) +# define WandPrivate +# if defined(_MT) && defined(_DLL) && !defined(_MAGICKDLL_) && !defined(_LIB) +# define _MAGICKDLL_ +# endif +# if defined(_MAGICKDLL_) +# if defined(_VISUALC_) +# pragma warning( disable: 4273 ) /* Disable the dll linkage warnings */ +# endif +# if !defined(_MAGICKLIB_) +# if defined(__clang__) || defined(__GNUC__) +# define WandExport __attribute__ ((dllimport)) +# else +# define WandExport __declspec(dllimport) +# endif +# else +# if defined(__clang__) || defined(__GNUC__) +# define WandExport __attribute__ ((dllexport)) +# else +# define WandExport __declspec(dllexport) +# endif +# endif +# else +# define WandExport +# endif +# if defined(_VISUALC_) +# pragma warning(disable : 4018) +# pragma warning(disable : 4068) +# pragma warning(disable : 4244) +# pragma warning(disable : 4142) +# pragma warning(disable : 4800) +# pragma warning(disable : 4786) +# pragma warning(disable : 4996) +# endif +#else +# if defined(__clang__) || (__GNUC__ >= 4) +# define WandExport __attribute__ ((visibility ("default"))) +# define WandPrivate __attribute__ ((visibility ("hidden"))) +# else +# define WandExport +# define WandPrivate +# endif +#endif + +#define WandSignature 0xabacadabUL +#if !defined(MaxTextExtent) +# define MaxTextExtent 4096 +#endif + +#if defined(MAGICKCORE_HAVE___ATTRIBUTE__) +# define wand_aligned(x) __attribute__((aligned(x))) +# define wand_attribute __attribute__ +# define wand_unused(x) wand_unused_ ## x __attribute__((unused)) +# define wand_unreferenced(x) +#elif defined(MAGICKWAND_WINDOWS_SUPPORT) && !defined(__CYGWIN__) +# define wand_aligned(x) __declspec(align(x)) +# define wand_attribute(x) /* nothing */ +# define wand_unused(x) x +# define wand_unreferenced(x) (x) +#else +# define wand_aligned(x) /* nothing */ +# define wand_attribute(x) /* nothing */ +# define wand_unused(x) x +# define wand_unreferenced(x) /* nothing */ +#endif + +#if !defined(__clang__) && (((__GNUC__) > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) +# define wand_alloc_size(x) __attribute__((__alloc_size__(x))) +# define wand_alloc_sizes(x,y) __attribute__((__alloc_size__(x,y))) +#else +# define wand_alloc_size(x) /* nothing */ +# define wand_alloc_sizes(x,y) /* nothing */ +#endif + +#if defined(__clang__) || (((__GNUC__) > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) +# define wand_cold_spot __attribute__((__cold__)) +# define wand_hot_spot __attribute__((__hot__)) +#else +# define wand_cold_spot +# define wand_hot_spot +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/mogrify-private.h b/ImageMagick-6.9.12-44/wand/mogrify-private.h new file mode 100644 index 0000000..2bec6f9 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/mogrify-private.h @@ -0,0 +1,129 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand mogrify command-line private methods. +*/ +#ifndef MAGICKWAND_MOGRIFY_PRIVATE_H +#define MAGICKWAND_MOGRIFY_PRIVATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#define AppendImageStack(images) \ +{ \ + (void) SyncImagesSettings(image_info,images); \ + AppendImageToList(&image_stack[k].image,images); \ + image=image_stack[k].image; \ +} +#define DestroyImageStack() \ +{ \ + while (k > 0) \ + PopImageStack(); \ + image_stack[k].image=DestroyImageList(image_stack[k].image); \ + image_stack[k].image_info=DestroyImageInfo(image_stack[k].image_info); \ + image_info=image_stack[MaxImageStackDepth].image_info; \ +} +#define FinalizeImageSettings(image_info,image,advance) \ +{ \ + FireImageStack(MagickTrue,advance,MagickTrue); \ + if (image != (Image *) NULL) \ + { \ + InheritException(exception,&(image)->exception); \ + (void) SyncImagesSettings(image_info,image); \ + } \ +} +#define FireImageStack(postfix,advance,fire) \ + if ((j <= i) && (i < (ssize_t) argc)) \ + { \ +DisableMSCWarning(4127) \ + if (image_stack[k].image == (Image *) NULL) \ + status&=MogrifyImageInfo(image_stack[k].image_info,(int) (i-j+1), \ + (const char **) (argv+j),exception); \ + else \ + if ((fire) != MagickFalse) \ + { \ + status&=MogrifyImages(image_stack[k].image_info,postfix,(int) \ + (i-j+1),(const char **) (argv+j),&image_stack[k].image, \ + exception); \ + image=image_stack[k].image; \ + if ((advance) != MagickFalse) \ + j=i+1; \ + pend=MagickFalse; \ + } \ +RestoreMSCWarning \ + } +#define MaxImageStackDepth 128 +#define NewImageStack() \ +{ \ + image_stack[MaxImageStackDepth].image_info=image_info; \ + image_stack[0].image_info=CloneImageInfo(image_info); \ + image_stack[0].image=NewImageList(); \ + image_info=image_stack[0].image_info; \ + image=image_stack[0].image; \ +} +#define PushImageStack() \ +{ \ + k++; \ + image_stack[k].image_info=CloneImageInfo(image_stack[k-1].image_info); \ + image_stack[k].image=NewImageList(); \ + image_info=image_stack[k].image_info; \ + image=image_stack[k].image; \ +} +#define PopImageStack() \ +{ \ + if (respect_parenthesis == MagickFalse) \ + { \ + image_stack[k-1].image_info=DestroyImageInfo(image_stack[k-1].image_info); \ + image_stack[k-1].image_info=CloneImageInfo(image_stack[k].image_info); \ + } \ + image_stack[k].image_info=DestroyImageInfo(image_stack[k].image_info); \ + AppendImageToList(&image_stack[k-1].image,image_stack[k].image); \ + k--; \ + image_info=image_stack[k].image_info; \ + image=image_stack[k].image; \ +} +#define QuantumTick(i,span) ((MagickBooleanType) ((((i) & ((i)-1)) == 0) || \ + (((i) & 0xfff) == 0) || \ + ((MagickOffsetType) (i) == ((MagickOffsetType) (span)-1)))) +#define RemoveImageStack(images) \ +{ \ + images=RemoveFirstImageFromList(&image_stack[k].image); \ + image=image_stack[k].image; \ +} +#define RemoveAllImageStack() \ +{ \ + if (image_stack[k].image != (Image *) NULL) \ + image_stack[k].image=DestroyImageList(image_stack[k].image); \ +} +#define SetImageStack(image) \ +{ \ + image_stack[k].image=(image); \ +} + +typedef struct _ImageStack +{ + ImageInfo + *image_info; + + Image + *image; +} ImageStack; + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/mogrify.c b/ImageMagick-6.9.12-44/wand/mogrify.c new file mode 100644 index 0000000..8195c26 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/mogrify.c @@ -0,0 +1,8972 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M OOO GGGGG RRRR IIIII FFFFF Y Y % +% MM MM O O G R R I F Y Y % +% M M M O O G GGG RRRR I FFF Y % +% M M O O G G R R I F Y % +% M M OOO GGGG R R IIIII F Y % +% % +% % +% MagickWand Module Methods % +% % +% Software Design % +% Cristy % +% March 2000 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Use the mogrify program to resize an image, blur, crop, despeckle, dither, +% draw on, flip, join, re-sample, and much more. This tool is similiar to +% convert except that the original image file is overwritten (unless you +% change the file suffix with the -format option) with any changes you +% request. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/magick-wand-private.h" +#include "wand/mogrify-private.h" +#include "magick/blob-private.h" +#include "magick/color-private.h" +#include "magick/image-private.h" +#include "magick/monitor-private.h" +#include "magick/pixel-private.h" +#include "magick/thread-private.h" +#include "magick/string-private.h" +#include "magick/timer-private.h" +#include "magick/utility-private.h" +#if defined(MAGICKCORE_HAVE_UTIME_H) +#include +#endif + +/* + Define declarations. +*/ +#define UndefinedCompressionQuality 0UL + +/* + Constant declaration. +*/ +static const char + MogrifyBackgroundColor[] = "#fff", /* white */ + MogrifyBorderColor[] = "#dfdfdf", /* sRGB gray */ + MogrifyMatteColor[] = "#bdbdbd"; /* slightly darker gray */ + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M a g i c k C o m m a n d G e n e s i s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MagickCommandGenesis() applies image processing options to an image as +% prescribed by command line options. +% +% The format of the MagickCommandGenesis method is: +% +% MagickBooleanType MagickCommandGenesis(ImageInfo *image_info, +% MagickCommand command,int argc,char **argv,char **metadata, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o command: Choose from ConvertImageCommand, IdentifyImageCommand, +% MogrifyImageCommand, CompositeImageCommand, CompareImageCommand, +% ConjureImageCommand, StreamImageCommand, ImportImageCommand, +% DisplayImageCommand, or AnimateImageCommand. +% +% o argc: Specifies a pointer to an integer describing the number of +% elements in the argument vector. +% +% o argv: Specifies a pointer to a text array containing the command line +% arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ +WandExport MagickBooleanType MagickCommandGenesis(ImageInfo *image_info, + MagickCommand command,int argc,char **argv,char **metadata, + ExceptionInfo *exception) +{ + char + *option; + + double + duration, + serial; + + MagickBooleanType + concurrent, + regard_warnings, + status; + + ssize_t + i; + + size_t + iterations, + number_threads; + + ssize_t + n; + + (void) setlocale(LC_ALL,""); + (void) setlocale(LC_NUMERIC,"C"); + concurrent=MagickFalse; + duration=(-1.0); + iterations=1; + status=MagickTrue; + regard_warnings=MagickFalse; + for (i=1; i < (ssize_t) (argc-1); i++) + { + option=argv[i]; + if ((strlen(option) == 1) || ((*option != '-') && (*option != '+'))) + continue; + if (LocaleCompare("bench",option+1) == 0) + iterations=StringToUnsignedLong(argv[++i]); + if (LocaleCompare("concurrent",option+1) == 0) + concurrent=MagickTrue; + if (LocaleCompare("debug",option+1) == 0) + (void) SetLogEventMask(argv[++i]); + if (LocaleCompare("distribute-cache",option+1) == 0) + { + DistributePixelCacheServer(StringToInteger(argv[++i]),exception); + exit(0); + } + if (LocaleCompare("duration",option+1) == 0) + duration=StringToDouble(argv[++i],(char **) NULL); + if (LocaleCompare("regard-warnings",option+1) == 0) + regard_warnings=MagickTrue; + } + if (iterations == 1) + { + status=command(image_info,argc,argv,metadata,exception); + if (exception->severity != UndefinedException) + { + if ((exception->severity > ErrorException) || + (regard_warnings != MagickFalse)) + status=MagickFalse; + CatchException(exception); + } + if ((metadata != (char **) NULL) && (*metadata != (char *) NULL)) + { + (void) fputs(*metadata,stdout); + *metadata=DestroyString(*metadata); + } + return(status); + } + number_threads=GetOpenMPMaximumThreads(); + serial=0.0; + for (n=1; n <= (ssize_t) number_threads; n++) + { + double + e, + parallel, + user_time; + + TimerInfo + *timer; + + (void) SetMagickResourceLimit(ThreadResource,(MagickSizeType) n); + timer=AcquireTimerInfo(); + if (concurrent == MagickFalse) + { + for (i=0; i < (ssize_t) iterations; i++) + { + if (status == MagickFalse) + continue; + if (duration > 0) + { + if (GetElapsedTime(timer) > duration) + continue; + (void) ContinueTimer(timer); + } + status=command(image_info,argc,argv,metadata,exception); + if (exception->severity != UndefinedException) + { + if ((exception->severity > ErrorException) || + (regard_warnings != MagickFalse)) + status=MagickFalse; + CatchException(exception); + } + if ((metadata != (char **) NULL) && (*metadata != (char *) NULL)) + { + (void) fputs(*metadata,stdout); + *metadata=DestroyString(*metadata); + } + } + } + else + { + SetOpenMPNested(1); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + # pragma omp parallel for shared(status) +#endif + for (i=0; i < (ssize_t) iterations; i++) + { + if (status == MagickFalse) + continue; + if (duration > 0) + { + if (GetElapsedTime(timer) > duration) + continue; + (void) ContinueTimer(timer); + } + status=command(image_info,argc,argv,metadata,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + # pragma omp critical (MagickCore_MagickCommandGenesis) +#endif + { + if (exception->severity != UndefinedException) + { + if ((exception->severity > ErrorException) || + (regard_warnings != MagickFalse)) + status=MagickFalse; + CatchException(exception); + } + if ((metadata != (char **) NULL) && (*metadata != (char *) NULL)) + { + (void) fputs(*metadata,stdout); + *metadata=DestroyString(*metadata); + } + } + } + } + user_time=GetUserTime(timer); + parallel=GetElapsedTime(timer); + e=1.0; + if (n == 1) + serial=parallel; + else + e=((1.0/(1.0/((serial/(serial+parallel))+(1.0-(serial/(serial+parallel)))/ + (double) n)))-(1.0/(double) n))/(1.0-1.0/(double) n); + (void) FormatLocaleFile(stderr, + " Performance[%.20g]: %.20gi %0.3fips %0.6fe %0.6fu %lu:%02lu.%03lu\n", + (double) n,(double) iterations,(double) iterations/parallel,e,user_time, + (unsigned long) (parallel/60.0),(unsigned long) floor(fmod(parallel, + 60.0)),(unsigned long) (1000.0*(parallel-floor(parallel))+0.5)); + timer=DestroyTimerInfo(timer); + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M o g r i f y I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MogrifyImage() applies simple single image processing options to a single +% image that may be part of a large list, but also handles any 'region' +% image handling. +% +% The image in the list may be modified in three different ways... +% +% * directly modified (EG: -negate, -gamma, -level, -annotate, -draw), +% * replaced by a new image (EG: -spread, -resize, -rotate, -morphology) +% * replace by a list of images (only the -separate option!) +% +% In each case the result is returned into the list, and a pointer to the +% modified image (last image added if replaced by a list of images) is +% returned. +% +% ASIDE: The -crop is present but restricted to non-tile single image crops +% +% This means if all the images are being processed (such as by +% MogrifyImages(), next image to be processed will be as per the pointer +% (*image)->next. Also the image list may grow as a result of some specific +% operations but as images are never merged or deleted, it will never shrink +% in length. Typically the list will remain the same length. +% +% WARNING: As the image pointed to may be replaced, the first image in the +% list may also change. GetFirstImageInList() should be used by caller if +% they wish return the Image pointer to the first image in list. +% +% +% The format of the MogrifyImage method is: +% +% MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, +% const char **argv,Image **image) +% +% A description of each parameter follows: +% +% o image_info: the image info.. +% +% o argc: Specifies a pointer to an integer describing the number of +% elements in the argument vector. +% +% o argv: Specifies a pointer to a text array containing the command line +% arguments. +% +% o image: the image. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static inline Image *GetImageCache(const ImageInfo *image_info,const char *path, + ExceptionInfo *exception) +{ + char + key[MaxTextExtent]; + + ExceptionInfo + *sans_exception; + + Image + *image; + + ImageInfo + *read_info; + + /* + Read an image into a image cache if not already present. Return the image + that is in the cache under that filename. + */ + (void) FormatLocaleString(key,MaxTextExtent,"cache:%s",path); + sans_exception=AcquireExceptionInfo(); + image=(Image *) GetImageRegistry(ImageRegistryType,key,sans_exception); + sans_exception=DestroyExceptionInfo(sans_exception); + if (image != (Image *) NULL) + return(image); + read_info=CloneImageInfo(image_info); + (void) CopyMagickString(read_info->filename,path,MaxTextExtent); + image=ReadImage(read_info,exception); + read_info=DestroyImageInfo(read_info); + if (image != (Image *) NULL) + (void) SetImageRegistry(ImageRegistryType,key,image,exception); + return(image); +} + +static inline MagickBooleanType IsPathWritable(const char *path) +{ + if (IsPathAccessible(path) == MagickFalse) + return(MagickFalse); + if (access_utf8(path,W_OK) != 0) + return(MagickFalse); + return(MagickTrue); +} + +static MagickBooleanType MonitorProgress(const char *text, + const MagickOffsetType offset,const MagickSizeType extent, + void *wand_unused(client_data)) +{ + char + message[MaxTextExtent], + tag[MaxTextExtent]; + + const char + *locale_message; + + char + *p; + + wand_unreferenced(client_data); + + if ((extent <= 1) || (offset < 0) || (offset >= (MagickOffsetType) extent)) + return(MagickTrue); + if ((offset != (MagickOffsetType) (extent-1)) && ((offset % 50) != 0)) + return(MagickTrue); + (void) CopyMagickString(tag,text,MaxTextExtent); + p=strrchr(tag,'/'); + if (p != (char *) NULL) + *p='\0'; + (void) FormatLocaleString(message,MaxTextExtent,"Monitor/%s",tag); + locale_message=GetLocaleMessage(message); + if (locale_message == message) + locale_message=tag; + if (p == (char *) NULL) + (void) FormatLocaleFile(stderr,"%s: %ld of %lu, %02ld%% complete\r", + locale_message,(long) offset,(unsigned long) extent,(long) + (100L*offset/(extent-1))); + else + (void) FormatLocaleFile(stderr,"%s[%s]: %ld of %lu, %02ld%% complete\r", + locale_message,p+1,(long) offset,(unsigned long) extent,(long) + (100L*offset/(extent-1))); + if (offset == (MagickOffsetType) (extent-1)) + (void) FormatLocaleFile(stderr,"\n"); + (void) fflush(stderr); + return(MagickTrue); +} + +static Image *SparseColorOption(const Image *image,const ChannelType channel, + const SparseColorMethod method,const char *arguments, + const MagickBooleanType color_from_image,ExceptionInfo *exception) +{ + ChannelType + channels; + + char + token[MaxTextExtent]; + + const char + *p; + + double + *sparse_arguments; + + Image + *sparse_image; + + MagickBooleanType + error; + + MagickPixelPacket + color; + + size_t + x; + + size_t + number_arguments, + number_colors; + + /* + SparseColorOption() parses the complex -sparse-color argument into an an + array of floating point values then calls SparseColorImage(). Argument is + a complex mix of floating-point pixel coodinates, and color specifications + (or direct floating point numbers). The number of floats needed to + represent a color varies depending on the current channel setting. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickCoreSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickCoreSignature); + /* + Limit channels according to image - and add up number of color channel. + */ + channels=channel; + if (image->colorspace != CMYKColorspace) + channels=(ChannelType) (channels & ~IndexChannel); /* no index channel */ + if (image->matte == MagickFalse) + channels=(ChannelType) (channels & ~OpacityChannel); /* no alpha channel */ + number_colors=0; + if ((channels & RedChannel) != 0) + number_colors++; + if ((channels & GreenChannel) != 0) + number_colors++; + if ((channels & BlueChannel) != 0) + number_colors++; + if ((channels & IndexChannel) != 0) + number_colors++; + if ((channels & OpacityChannel) != 0) + number_colors++; + + /* + Read string, to determine number of arguments needed, + */ + p=arguments; + x=0; + while( *p != '\0' ) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if ( *token == ',' ) continue; + if ( isalpha((int) ((unsigned char) *token)) || *token == '#' ) { + if ( color_from_image ) { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError, "InvalidArgument", "`%s': %s", "sparse-color", + "Color arg given, when colors are coming from image"); + return( (Image *) NULL); + } + x += number_colors; /* color argument */ + } + else { + x++; /* floating point argument */ + } + } + error=MagickTrue; + if ( color_from_image ) { + /* just the control points are being given */ + error = ( x % 2 != 0 ) ? MagickTrue : MagickFalse; + number_arguments=(x/2)*(2+number_colors); + } + else { + /* control points and color values */ + error = ( x % (2+number_colors) != 0 ) ? MagickTrue : MagickFalse; + number_arguments=x; + } + if ( error ) { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError, "InvalidArgument", "`%s': %s", "sparse-color", + "Invalid number of Arguments"); + return( (Image *) NULL); + } + + /* Allocate and fill in the floating point arguments */ + sparse_arguments=(double *) AcquireQuantumMemory(number_arguments, + sizeof(*sparse_arguments)); + if (sparse_arguments == (double *) NULL) { + (void) ThrowMagickException(exception,GetMagickModule(),ResourceLimitError, + " MemoryAllocationFailed\n""%s","SparseColorOption"); + return( (Image *) NULL); + } + (void) memset(sparse_arguments,0,number_arguments* + sizeof(*sparse_arguments)); + p=arguments; + x=0; + while( *p != '\0' && x < number_arguments ) { + /* X coordinate */ + *token=','; + while ( *token == ',' ) + (void) GetNextToken(p,&p,MaxTextExtent,token); + if ( *token == '\0' ) break; + if ( isalpha((int) ((unsigned char) *token)) || *token == '#' ) { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError, "InvalidArgument", "`%s': %s", "sparse-color", + "Color found, instead of X-coord"); + error = MagickTrue; + break; + } + sparse_arguments[x++]=StringToDouble(token,(char **) NULL); + /* Y coordinate */ + *token=','; while ( *token == ',' ) GetNextToken(p,&p,MaxTextExtent,token); + if ( *token == '\0' ) break; + if ( isalpha((int) ((unsigned char) *token)) || *token == '#' ) { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError, "InvalidArgument", "`%s': %s", "sparse-color", + "Color found, instead of Y-coord"); + error = MagickTrue; + break; + } + sparse_arguments[x++]=StringToDouble(token,(char **) NULL); + /* color values for this control point */ +#if 0 + if ( (color_from_image ) { + /* get color from image */ + /* HOW??? */ + } + else +#endif + { + /* color name or function given in string argument */ + *token=','; + while ( *token == ',' ) + (void) GetNextToken(p,&p,MaxTextExtent,token); + if ( *token == '\0' ) break; + if ( isalpha((int) ((unsigned char) *token)) || *token == '#' ) { + /* Color string given */ + (void) QueryMagickColor(token,&color,exception); + if ( channels & RedChannel ) + sparse_arguments[x++] = QuantumScale*color.red; + if ( channels & GreenChannel ) + sparse_arguments[x++] = QuantumScale*color.green; + if ( channels & BlueChannel ) + sparse_arguments[x++] = QuantumScale*color.blue; + if ( channels & IndexChannel ) + sparse_arguments[x++] = QuantumScale*color.index; + if ( channels & OpacityChannel ) + sparse_arguments[x++] = QuantumScale*color.opacity; + } + else { + /* Colors given as a set of floating point values - experimental */ + /* NB: token contains the first floating point value to use! */ + if ( channels & RedChannel ) { + while ( *token == ',' ) + (void) GetNextToken(p,&p,MaxTextExtent,token); + if ( *token == '\0' || isalpha((int) ((unsigned char) *token)) || *token == '#' ) + break; + sparse_arguments[x++]=StringToDouble(token,(char **) NULL); + *token = ','; /* used this token - get another */ + } + if ( channels & GreenChannel ) { + while ( *token == ',' ) + (void) GetNextToken(p,&p,MaxTextExtent,token); + if ( *token == '\0' || isalpha((int) ((unsigned char) *token)) || *token == '#' ) + break; + sparse_arguments[x++]=StringToDouble(token,(char **) NULL); + *token = ','; /* used this token - get another */ + } + if ( channels & BlueChannel ) { + while ( *token == ',' ) + (void) GetNextToken(p,&p,MaxTextExtent,token); + if ( *token == '\0' || isalpha((int) ((unsigned char) *token)) || *token == '#' ) + break; + sparse_arguments[x++]=StringToDouble(token,(char **) NULL); + *token = ','; /* used this token - get another */ + } + if ( channels & IndexChannel ) { + while ( *token == ',' ) + (void) GetNextToken(p,&p,MaxTextExtent,token); + if ( *token == '\0' || isalpha((int) ((unsigned char) *token)) || *token == '#' ) + break; + sparse_arguments[x++]=StringToDouble(token,(char **) NULL); + *token = ','; /* used this token - get another */ + } + if ( channels & OpacityChannel ) { + while ( *token == ',' ) + (void) GetNextToken(p,&p,MaxTextExtent,token); + if ( *token == '\0' || isalpha((int) ((unsigned char) *token)) || *token == '#' ) + break; + sparse_arguments[x++]=StringToDouble(token,(char **) NULL); + *token = ','; /* used this token - get another */ + } + } + } + } + if ( number_arguments != x && !error ) { + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, + " InvalidArgument","`%s': %s","sparse-color","Argument Parsing Error"); + sparse_arguments=(double *) RelinquishMagickMemory(sparse_arguments); + return( (Image *) NULL); + } + if ( error ) + return( (Image *) NULL); + + /* Call the Interpolation function with the parsed arguments */ + sparse_image=SparseColorImage(image,channels,method,number_arguments, + sparse_arguments,exception); + sparse_arguments=(double *) RelinquishMagickMemory(sparse_arguments); + return( sparse_image ); +} + +WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, + const char **argv,Image **image,ExceptionInfo *exception) +{ + ChannelType + channel; + + const char + *format, + *option; + + DrawInfo + *draw_info; + + GeometryInfo + geometry_info; + + Image + *region_image; + + ImageInfo + *mogrify_info; + + MagickStatusType + status; + + MagickPixelPacket + fill; + + MagickStatusType + flags; + + QuantizeInfo + *quantize_info; + + RectangleInfo + geometry, + region_geometry; + + ssize_t + i; + + /* + Initialize method variables. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(image != (Image **) NULL); + assert((*image)->signature == MagickCoreSignature); + if ((*image)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename); + if (argc < 0) + return(MagickTrue); + mogrify_info=CloneImageInfo(image_info); + draw_info=CloneDrawInfo(mogrify_info,(DrawInfo *) NULL); + quantize_info=AcquireQuantizeInfo(mogrify_info); + SetGeometryInfo(&geometry_info); + GetMagickPixelPacket(*image,&fill); + SetMagickPixelPacket(*image,&(*image)->background_color,(IndexPacket *) NULL, + &fill); + channel=mogrify_info->channel; + format=GetImageOption(mogrify_info,"format"); + SetGeometry(*image,®ion_geometry); + region_image=NewImageList(); + /* + Transmogrify the image. + */ + for (i=0; i < (ssize_t) argc; i++) + { + Image + *mogrify_image; + + ssize_t + count; + + option=argv[i]; + if (IsCommandOption(option) == MagickFalse) + continue; + count=MagickMax(ParseCommandOption(MagickCommandOptions,MagickFalse,option), + 0L); + if ((i+count) >= (ssize_t) argc) + break; + status=MogrifyImageInfo(mogrify_info,(int) count+1,argv+i,exception); + mogrify_image=(Image *) NULL; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("adaptive-blur",option+1) == 0) + { + /* + Adaptive blur image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=AdaptiveBlurImageChannel(*image,channel, + geometry_info.rho,geometry_info.sigma,exception); + break; + } + if (LocaleCompare("adaptive-resize",option+1) == 0) + { + /* + Adaptive resize image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception); + mogrify_image=AdaptiveResizeImage(*image,geometry.width, + geometry.height,exception); + break; + } + if (LocaleCompare("adaptive-sharpen",option+1) == 0) + { + /* + Adaptive sharpen image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=AdaptiveSharpenImageChannel(*image,channel, + geometry_info.rho,geometry_info.sigma,exception); + break; + } + if (LocaleCompare("affine",option+1) == 0) + { + /* + Affine matrix. + */ + if (*option == '+') + { + GetAffineMatrix(&draw_info->affine); + break; + } + (void) ParseAffineGeometry(argv[i+1],&draw_info->affine,exception); + break; + } + if (LocaleCompare("alpha",option+1) == 0) + { + AlphaChannelType + alpha_type; + + (void) SyncImageSettings(mogrify_info,*image); + alpha_type=(AlphaChannelType) ParseCommandOption(MagickAlphaOptions, + MagickFalse,argv[i+1]); + (void) SetImageAlphaChannel(*image,alpha_type); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("annotate",option+1) == 0) + { + char + *text, + geometry[MaxTextExtent]; + + /* + Annotate image. + */ + (void) SyncImageSettings(mogrify_info,*image); + SetGeometryInfo(&geometry_info); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + text=InterpretImageProperties(mogrify_info,*image,argv[i+2]); + InheritException(exception,&(*image)->exception); + if (text == (char *) NULL) + break; + (void) CloneString(&draw_info->text,text); + text=DestroyString(text); + (void) FormatLocaleString(geometry,MaxTextExtent,"%+f%+f", + geometry_info.xi,geometry_info.psi); + (void) CloneString(&draw_info->geometry,geometry); + draw_info->affine.sx=cos(DegreesToRadians( + fmod(geometry_info.rho,360.0))); + draw_info->affine.rx=sin(DegreesToRadians( + fmod(geometry_info.rho,360.0))); + draw_info->affine.ry=(-sin(DegreesToRadians( + fmod(geometry_info.sigma,360.0)))); + draw_info->affine.sy=cos(DegreesToRadians( + fmod(geometry_info.sigma,360.0))); + (void) AnnotateImage(*image,draw_info); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("antialias",option+1) == 0) + { + draw_info->stroke_antialias=(*option == '-') ? MagickTrue : + MagickFalse; + draw_info->text_antialias=(*option == '-') ? MagickTrue : + MagickFalse; + break; + } + if (LocaleCompare("auto-gamma",option+1) == 0) + { + /* + Auto Adjust Gamma of image based on its mean + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) AutoGammaImageChannel(*image,channel); + break; + } + if (LocaleCompare("auto-level",option+1) == 0) + { + /* + Perfectly Normalize (max/min stretch) the image + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) AutoLevelImageChannel(*image,channel); + break; + } + if (LocaleCompare("auto-orient",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=AutoOrientImage(*image,(*image)->orientation, + exception); + break; + } + break; + } + case 'b': + { + if (LocaleCompare("black-threshold",option+1) == 0) + { + /* + Black threshold image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) BlackThresholdImageChannel(*image,channel,argv[i+1], + exception); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("blue-shift",option+1) == 0) + { + /* + Blue shift image. + */ + (void) SyncImageSettings(mogrify_info,*image); + geometry_info.rho=1.5; + if (*option == '-') + flags=ParseGeometry(argv[i+1],&geometry_info); + mogrify_image=BlueShiftImage(*image,geometry_info.rho,exception); + break; + } + if (LocaleCompare("blur",option+1) == 0) + { + /* + Gaussian blur image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=BlurImageChannel(*image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + if (LocaleCompare("border",option+1) == 0) + { + /* + Surround image with a border of solid color. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception); + mogrify_image=BorderImage(*image,&geometry,exception); + break; + } + if (LocaleCompare("bordercolor",option+1) == 0) + { + if (*option == '+') + { + (void) QueryColorDatabase(MogrifyBorderColor, + &draw_info->border_color,exception); + break; + } + (void) QueryColorDatabase(argv[i+1],&draw_info->border_color, + exception); + break; + } + if (LocaleCompare("box",option+1) == 0) + { + (void) QueryColorDatabase(argv[i+1],&draw_info->undercolor, + exception); + break; + } + if (LocaleCompare("brightness-contrast",option+1) == 0) + { + double + brightness, + contrast; + + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + /* + Brightness / contrast image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + brightness=geometry_info.rho; + contrast=0.0; + if ((flags & SigmaValue) != 0) + contrast=geometry_info.sigma; + (void) BrightnessContrastImageChannel(*image,channel,brightness, + contrast); + InheritException(exception,&(*image)->exception); + break; + } + break; + } + case 'c': + { + if (LocaleCompare("canny",option+1) == 0) + { + /* + Detect edges in the image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=0.10; + if ((flags & PsiValue) == 0) + geometry_info.psi=0.30; + if ((flags & PercentValue) != 0) + { + geometry_info.xi/=100.0; + geometry_info.psi/=100.0; + } + mogrify_image=CannyEdgeImage(*image,geometry_info.rho, + geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception); + break; + } + if (LocaleCompare("cdl",option+1) == 0) + { + char + *color_correction_collection; + + /* + Color correct with a color decision list. + */ + (void) SyncImageSettings(mogrify_info,*image); + color_correction_collection=FileToString(argv[i+1],~0UL,exception); + if (color_correction_collection == (char *) NULL) + break; + (void) ColorDecisionListImage(*image,color_correction_collection); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + if (*option == '+') + channel=DefaultChannels; + else + channel=(ChannelType) ParseChannelOption(argv[i+1]); + break; + } + if (LocaleCompare("charcoal",option+1) == 0) + { + /* + Charcoal image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=CharcoalImage(*image,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + if (LocaleCompare("chop",option+1) == 0) + { + /* + Chop the image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseGravityGeometry(*image,argv[i+1],&geometry,exception); + mogrify_image=ChopImage(*image,&geometry,exception); + break; + } + if (LocaleCompare("clamp",option+1) == 0) + { + /* + Clamp image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ClampImageChannel(*image,channel); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("clip",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + { + (void) SetImageClipMask(*image,(Image *) NULL); + InheritException(exception,&(*image)->exception); + break; + } + (void) ClipImage(*image); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("clip-mask",option+1) == 0) + { + CacheView + *mask_view; + + Image + *mask_image; + + PixelPacket + *magick_restrict q; + + ssize_t + x; + + ssize_t + y; + + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + { + /* + Remove a mask. + */ + (void) SetImageMask(*image,(Image *) NULL); + InheritException(exception,&(*image)->exception); + break; + } + /* + Set the image mask. + FUTURE: This Should Be a SetImageAlphaChannel() call, Or two. + */ + mask_image=GetImageCache(mogrify_info,argv[i+1],exception); + if (mask_image == (Image *) NULL) + break; + if (SetImageStorageClass(mask_image,DirectClass) == MagickFalse) + return(MagickFalse); + mask_view=AcquireAuthenticCacheView(mask_image,exception); + for (y=0; y < (ssize_t) mask_image->rows; y++) + { + q=GetCacheViewAuthenticPixels(mask_view,0,y,mask_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) mask_image->columns; x++) + { + if (mask_image->matte == MagickFalse) + SetPixelOpacity(q,ClampToQuantum(GetPixelIntensity(mask_image, + q))); + SetPixelRed(q,GetPixelOpacity(q)); + SetPixelGreen(q,GetPixelOpacity(q)); + SetPixelBlue(q,GetPixelOpacity(q)); + q++; + } + if (SyncCacheViewAuthenticPixels(mask_view,exception) == MagickFalse) + break; + } + mask_view=DestroyCacheView(mask_view); + mask_image->matte=MagickTrue; + (void) SetImageClipMask(*image,mask_image); + mask_image=DestroyImage(mask_image); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("clip-path",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + (void) ClipImagePath(*image,argv[i+1],*option == '-' ? MagickTrue : + MagickFalse); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("colorize",option+1) == 0) + { + /* + Colorize the image. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=ColorizeImage(*image,argv[i+1],draw_info->fill, + exception); + break; + } + if (LocaleCompare("color-matrix",option+1) == 0) + { + KernelInfo + *kernel; + + (void) SyncImageSettings(mogrify_info,*image); + kernel=AcquireKernelInfo(argv[i+1]); + if (kernel == (KernelInfo *) NULL) + break; + mogrify_image=ColorMatrixImage(*image,kernel,exception); + kernel=DestroyKernelInfo(kernel); + break; + } + if (LocaleCompare("colors",option+1) == 0) + { + /* + Reduce the number of colors in the image. + */ + (void) SyncImageSettings(mogrify_info,*image); + quantize_info->number_colors=StringToUnsignedLong(argv[i+1]); + if (quantize_info->number_colors == 0) + break; + if (((*image)->storage_class == DirectClass) || + (*image)->colors > quantize_info->number_colors) + (void) QuantizeImage(quantize_info,*image); + else + (void) CompressImageColormap(*image); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ColorspaceType + colorspace; + + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + { + (void) TransformImageColorspace(*image,sRGBColorspace); + InheritException(exception,&(*image)->exception); + break; + } + colorspace=(ColorspaceType) ParseCommandOption( + MagickColorspaceOptions,MagickFalse,argv[i+1]); + (void) TransformImageColorspace(*image,colorspace); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("connected-components",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=ConnectedComponentsImage(*image, + (size_t) StringToInteger(argv[i+1]),exception); + break; + } + if (LocaleCompare("contrast",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + (void) ContrastImage(*image,(*option == '-') ? MagickTrue : + MagickFalse); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("contrast-stretch",option+1) == 0) + { + double + black_point, + white_point; + + MagickStatusType + flags; + + /* + Contrast stretch image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + black_point=geometry_info.rho; + white_point=(flags & SigmaValue) != 0 ? geometry_info.sigma : + black_point; + if ((flags & PercentValue) != 0) + { + black_point*=(double) (*image)->columns*(*image)->rows/100.0; + white_point*=(double) (*image)->columns*(*image)->rows/100.0; + } + white_point=(MagickRealType) (*image)->columns*(*image)->rows- + white_point; + (void) ContrastStretchImageChannel(*image,channel,black_point, + white_point); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("convolve",option+1) == 0) + { + double + gamma; + + KernelInfo + *kernel_info; + + ssize_t + j; + + size_t + extent; + + (void) SyncImageSettings(mogrify_info,*image); + kernel_info=AcquireKernelInfo(argv[i+1]); + if (kernel_info == (KernelInfo *) NULL) + break; + extent=kernel_info->width*kernel_info->height; + gamma=0.0; + for (j=0; j < (ssize_t) extent; j++) + gamma+=kernel_info->values[j]; + gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma); + for (j=0; j < (ssize_t) extent; j++) + kernel_info->values[j]*=gamma; + mogrify_image=MorphologyImage(*image,CorrelateMorphology,1, + kernel_info,exception); + kernel_info=DestroyKernelInfo(kernel_info); + break; + } + if (LocaleCompare("crop",option+1) == 0) + { + /* + Crop a image to a smaller size + */ + (void) SyncImageSettings(mogrify_info,*image); +#if 0 + flags=ParseGravityGeometry(*image,argv[i+1],&geometry,exception); + if (((geometry.width != 0) || (geometry.height != 0)) && + ((flags & XValue) == 0) && ((flags & YValue) == 0)) + break; +#endif +#if 0 + mogrify_image=CloneImage(*image,0,0,MagickTrue,&(*image)->exception); + mogrify_image->next = mogrify_image->previous = (Image *) NULL; + (void) TransformImage(&mogrify_image,argv[i+1],(char *) NULL); + InheritException(exception,&mogrify_image->exception); +#else + mogrify_image=CropImageToTiles(*image,argv[i+1],exception); +#endif + break; + } + if (LocaleCompare("cycle",option+1) == 0) + { + /* + Cycle an image colormap. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) CycleColormapImage(*image,(ssize_t) StringToLong(argv[i+1])); + InheritException(exception,&(*image)->exception); + break; + } + break; + } + case 'd': + { + if (LocaleCompare("decipher",option+1) == 0) + { + StringInfo + *passkey; + + /* + Decipher pixels. + */ + (void) SyncImageSettings(mogrify_info,*image); + passkey=FileToStringInfo(argv[i+1],~0UL,exception); + if (passkey != (StringInfo *) NULL) + { + (void) PasskeyDecipherImage(*image,passkey,exception); + passkey=DestroyStringInfo(passkey); + } + break; + } + if (LocaleCompare("density",option+1) == 0) + { + /* + Set image density. + */ + (void) CloneString(&draw_info->density,argv[i+1]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + { + (void) SetImageDepth(*image,MAGICKCORE_QUANTUM_DEPTH); + break; + } + (void) SetImageDepth(*image,StringToUnsignedLong(argv[i+1])); + break; + } + if (LocaleCompare("deskew",option+1) == 0) + { + double + threshold; + + /* + Straighten the image. + */ + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + threshold=40.0*QuantumRange/100.0; + else + threshold=StringToDoubleInterval(argv[i+1],(double) QuantumRange+ + 1.0); + mogrify_image=DeskewImage(*image,threshold,exception); + break; + } + if (LocaleCompare("despeckle",option+1) == 0) + { + /* + Reduce the speckles within an image. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=DespeckleImage(*image,exception); + break; + } + if (LocaleCompare("display",option+1) == 0) + { + (void) CloneString(&draw_info->server_name,argv[i+1]); + break; + } + if (LocaleCompare("distort",option+1) == 0) + { + char + *args, + token[MaxTextExtent]; + + const char + *p; + + DistortImageMethod + method; + + double + *arguments; + + ssize_t + x; + + size_t + number_arguments; + + /* + Distort image. + */ + (void) SyncImageSettings(mogrify_info,*image); + method=(DistortImageMethod) ParseCommandOption(MagickDistortOptions, + MagickFalse,argv[i+1]); + if (method == ResizeDistortion) + { + double + resize_args[2]; + + /* + Resize distortion. + */ + (void) ParseRegionGeometry(*image,argv[i+2],&geometry, + exception); + resize_args[0]=(double) geometry.width; + resize_args[1]=(double) geometry.height; + mogrify_image=DistortImage(*image,method,(size_t) 2, + resize_args,MagickTrue,exception); + break; + } + args=InterpretImageProperties(mogrify_info,*image,argv[i+2]); + InheritException(exception,&(*image)->exception); + if (args == (char *) NULL) + break; + p=(char *) args; + for (x=0; *p != '\0'; x++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + } + number_arguments=(size_t) x; + arguments=(double *) AcquireQuantumMemory(number_arguments, + sizeof(*arguments)); + if (arguments == (double *) NULL) + ThrowWandFatalException(ResourceLimitFatalError, + "MemoryAllocationFailed",(*image)->filename); + (void) memset(arguments,0,number_arguments*sizeof(*arguments)); + p=(char *) args; + for (x=0; (x < (ssize_t) number_arguments) && (*p != '\0'); x++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + arguments[x]=StringToDouble(token,(char **) NULL); + } + args=DestroyString(args); + mogrify_image=DistortImage(*image,method,number_arguments,arguments, + (*option == '+') ? MagickTrue : MagickFalse,exception); + arguments=(double *) RelinquishMagickMemory(arguments); + break; + } + if (LocaleCompare("dither",option+1) == 0) + { + if (*option == '+') + { + quantize_info->dither=MagickFalse; + break; + } + quantize_info->dither=MagickTrue; + quantize_info->dither_method=(DitherMethod) ParseCommandOption( + MagickDitherOptions,MagickFalse,argv[i+1]); + if (quantize_info->dither_method == NoDitherMethod) + quantize_info->dither=MagickFalse; + break; + } + if (LocaleCompare("draw",option+1) == 0) + { + /* + Draw image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) CloneString(&draw_info->primitive,argv[i+1]); + (void) DrawImage(*image,draw_info); + InheritException(exception,&(*image)->exception); + break; + } + break; + } + case 'e': + { + if (LocaleCompare("edge",option+1) == 0) + { + /* + Enhance edges in the image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=EdgeImage(*image,geometry_info.rho,exception); + break; + } + if (LocaleCompare("emboss",option+1) == 0) + { + /* + Gaussian embossen image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=EmbossImage(*image,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + if (LocaleCompare("encipher",option+1) == 0) + { + StringInfo + *passkey; + + /* + Encipher pixels. + */ + (void) SyncImageSettings(mogrify_info,*image); + passkey=FileToStringInfo(argv[i+1],~0UL,exception); + if (passkey != (StringInfo *) NULL) + { + (void) PasskeyEncipherImage(*image,passkey,exception); + passkey=DestroyStringInfo(passkey); + } + break; + } + if (LocaleCompare("encoding",option+1) == 0) + { + (void) CloneString(&draw_info->encoding,argv[i+1]); + break; + } + if (LocaleCompare("enhance",option+1) == 0) + { + /* + Enhance image. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=EnhanceImage(*image,exception); + break; + } + if (LocaleCompare("equalize",option+1) == 0) + { + /* + Equalize image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) EqualizeImageChannel(*image,channel); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("evaluate",option+1) == 0) + { + double + constant; + + MagickEvaluateOperator + op; + + (void) SyncImageSettings(mogrify_info,*image); + op=(MagickEvaluateOperator) ParseCommandOption( + MagickEvaluateOptions,MagickFalse,argv[i+1]); + constant=StringToDoubleInterval(argv[i+2],(double) QuantumRange+ + 1.0); + (void) EvaluateImageChannel(*image,channel,op,constant,exception); + break; + } + if (LocaleCompare("extent",option+1) == 0) + { + /* + Set the image extent. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGravityGeometry(*image,argv[i+1],&geometry,exception); + if (geometry.width == 0) + geometry.width=(*image)->columns; + if (geometry.height == 0) + geometry.height=(*image)->rows; + mogrify_image=ExtentImage(*image,&geometry,exception); + break; + } + break; + } + case 'f': + { + if (LocaleCompare("family",option+1) == 0) + { + if (*option == '+') + { + if (draw_info->family != (char *) NULL) + draw_info->family=DestroyString(draw_info->family); + break; + } + (void) CloneString(&draw_info->family,argv[i+1]); + break; + } + if (LocaleCompare("features",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageArtifact(*image,"identify:features"); + break; + } + (void) SetImageArtifact(*image,"identify:features",argv[i+1]); + (void) SetImageArtifact(*image,"verbose","true"); + break; + } + if (LocaleCompare("fill",option+1) == 0) + { + ExceptionInfo + *sans; + + GetMagickPixelPacket(*image,&fill); + if (*option == '+') + { + (void) QueryMagickColor("none",&fill,exception); + (void) QueryColorDatabase("none",&draw_info->fill,exception); + if (draw_info->fill_pattern != (Image *) NULL) + draw_info->fill_pattern=DestroyImage(draw_info->fill_pattern); + break; + } + sans=AcquireExceptionInfo(); + (void) QueryMagickColor(argv[i+1],&fill,sans); + status=QueryColorDatabase(argv[i+1],&draw_info->fill,sans); + sans=DestroyExceptionInfo(sans); + if (status == MagickFalse) + draw_info->fill_pattern=GetImageCache(mogrify_info,argv[i+1], + exception); + break; + } + if (LocaleCompare("flip",option+1) == 0) + { + /* + Flip image scanlines. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=FlipImage(*image,exception); + break; + } + if (LocaleCompare("floodfill",option+1) == 0) + { + MagickPixelPacket + target; + + /* + Floodfill image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParsePageGeometry(*image,argv[i+1],&geometry,exception); + (void) QueryMagickColor(argv[i+2],&target,exception); + (void) FloodfillPaintImage(*image,channel,draw_info,&target, + geometry.x,geometry.y,*option == '-' ? MagickFalse : MagickTrue); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("flop",option+1) == 0) + { + /* + Flop image scanlines. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=FlopImage(*image,exception); + break; + } + if (LocaleCompare("font",option+1) == 0) + { + if (*option == '+') + { + if (draw_info->font != (char *) NULL) + draw_info->font=DestroyString(draw_info->font); + break; + } + (void) CloneString(&draw_info->font,argv[i+1]); + break; + } + if (LocaleCompare("format",option+1) == 0) + { + format=argv[i+1]; + break; + } + if (LocaleCompare("frame",option+1) == 0) + { + FrameInfo + frame_info; + + /* + Surround image with an ornamental border. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception); + frame_info.width=geometry.width; + frame_info.height=geometry.height; + frame_info.outer_bevel=geometry.x; + frame_info.inner_bevel=geometry.y; + frame_info.x=(ssize_t) frame_info.width; + frame_info.y=(ssize_t) frame_info.height; + frame_info.width=(*image)->columns+2*frame_info.width; + frame_info.height=(*image)->rows+2*frame_info.height; + mogrify_image=FrameImage(*image,&frame_info,exception); + break; + } + if (LocaleCompare("function",option+1) == 0) + { + char + *arguments, + token[MaxTextExtent]; + + const char + *p; + + double + *parameters; + + MagickFunction + function; + + ssize_t + x; + + size_t + number_parameters; + + /* + Function Modify Image Values + */ + (void) SyncImageSettings(mogrify_info,*image); + function=(MagickFunction) ParseCommandOption(MagickFunctionOptions, + MagickFalse,argv[i+1]); + arguments=InterpretImageProperties(mogrify_info,*image,argv[i+2]); + InheritException(exception,&(*image)->exception); + if (arguments == (char *) NULL) + break; + p=(char *) arguments; + for (x=0; *p != '\0'; x++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + } + number_parameters=(size_t) x; + parameters=(double *) AcquireQuantumMemory(number_parameters, + sizeof(*parameters)); + if (parameters == (double *) NULL) + ThrowWandFatalException(ResourceLimitFatalError, + "MemoryAllocationFailed",(*image)->filename); + (void) memset(parameters,0,number_parameters* + sizeof(*parameters)); + p=(char *) arguments; + for (x=0; (x < (ssize_t) number_parameters) && (*p != '\0'); x++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + parameters[x]=StringToDouble(token,(char **) NULL); + } + arguments=DestroyString(arguments); + (void) FunctionImageChannel(*image,channel,function, + number_parameters,parameters,exception); + parameters=(double *) RelinquishMagickMemory(parameters); + break; + } + break; + } + case 'g': + { + if (LocaleCompare("gamma",option+1) == 0) + { + /* + Gamma image. + */ + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + (*image)->gamma=StringToDouble(argv[i+1],(char **) NULL); + else + { + if (strchr(argv[i+1],',') != (char *) NULL) + (void) GammaImage(*image,argv[i+1]); + else + (void) GammaImageChannel(*image,channel, + StringToDouble(argv[i+1],(char **) NULL)); + InheritException(exception,&(*image)->exception); + } + break; + } + if ((LocaleCompare("gaussian-blur",option+1) == 0) || + (LocaleCompare("gaussian",option+1) == 0)) + { + /* + Gaussian blur image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=GaussianBlurImageChannel(*image,channel, + geometry_info.rho,geometry_info.sigma,exception); + break; + } + if (LocaleCompare("geometry",option+1) == 0) + { + /* + Record Image offset, Resize last image. + */ + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + { + if ((*image)->geometry != (char *) NULL) + (*image)->geometry=DestroyString((*image)->geometry); + break; + } + flags=ParseRegionGeometry(*image,argv[i+1],&geometry,exception); + if (((flags & XValue) != 0) || ((flags & YValue) != 0)) + (void) CloneString(&(*image)->geometry,argv[i+1]); + else + mogrify_image=ResizeImage(*image,geometry.width,geometry.height, + (*image)->filter,(*image)->blur,exception); + break; + } + if (LocaleCompare("gravity",option+1) == 0) + { + if (*option == '+') + { + draw_info->gravity=UndefinedGravity; + break; + } + draw_info->gravity=(GravityType) ParseCommandOption( + MagickGravityOptions,MagickFalse,argv[i+1]); + break; + } + if (LocaleCompare("grayscale",option+1) == 0) + { + PixelIntensityMethod + method; + + (void) SyncImagesSettings(mogrify_info,*image); + method=(PixelIntensityMethod) ParseCommandOption( + MagickPixelIntensityOptions,MagickFalse,argv[i+1]); + (void) GrayscaleImage(*image,method); + InheritException(exception,&(*image)->exception); + break; + } + break; + } + case 'h': + { + if (LocaleCompare("highlight-color",option+1) == 0) + { + (void) SetImageArtifact(*image,"compare:highlight-color",argv[i+1]); + break; + } + if (LocaleCompare("hough-lines",option+1) == 0) + { + /* + Identify lines in the image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + if ((flags & XiValue) == 0) + geometry_info.xi=40; + mogrify_image=HoughLineImage(*image,(size_t) geometry_info.rho, + (size_t) geometry_info.sigma,(size_t) geometry_info.xi,exception); + break; + } + break; + } + case 'i': + { + if (LocaleCompare("identify",option+1) == 0) + { + char + *text; + + (void) SyncImageSettings(mogrify_info,*image); + if (format == (char *) NULL) + { + (void) IdentifyImage(*image,stdout,mogrify_info->verbose); + InheritException(exception,&(*image)->exception); + break; + } + text=InterpretImageProperties(mogrify_info,*image,format); + InheritException(exception,&(*image)->exception); + if (text == (char *) NULL) + break; + (void) fputs(text,stdout); + text=DestroyString(text); + break; + } + if (LocaleCompare("implode",option+1) == 0) + { + /* + Implode image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseGeometry(argv[i+1],&geometry_info); + mogrify_image=ImplodeImage(*image,geometry_info.rho,exception); + break; + } + if (LocaleCompare("interline-spacing",option+1) == 0) + { + if (*option == '+') + (void) ParseGeometry("0",&geometry_info); + else + (void) ParseGeometry(argv[i+1],&geometry_info); + draw_info->interline_spacing=geometry_info.rho; + break; + } + if (LocaleCompare("interword-spacing",option+1) == 0) + { + if (*option == '+') + (void) ParseGeometry("0",&geometry_info); + else + (void) ParseGeometry(argv[i+1],&geometry_info); + draw_info->interword_spacing=geometry_info.rho; + break; + } + if (LocaleCompare("interpolative-resize",option+1) == 0) + { + /* + Resize image using 'point sampled' interpolation + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception); + mogrify_image=InterpolativeResizeImage(*image,geometry.width, + geometry.height,(*image)->interpolate,exception); + break; + } + break; + } + case 'k': + { + if (LocaleCompare("kerning",option+1) == 0) + { + if (*option == '+') + (void) ParseGeometry("0",&geometry_info); + else + (void) ParseGeometry(argv[i+1],&geometry_info); + draw_info->kerning=geometry_info.rho; + break; + } + if (LocaleCompare("kuwahara",option+1) == 0) + { + /* + Edge preserving blur. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho-0.5; + mogrify_image=KuwaharaImageChannel(*image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + break; + } + case 'l': + { + if (LocaleCompare("lat",option+1) == 0) + { + /* + Local adaptive threshold image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & PercentValue) != 0) + geometry_info.xi=(double) QuantumRange*geometry_info.xi/100.0; + mogrify_image=AdaptiveThresholdImage(*image,(size_t) + geometry_info.rho,(size_t) geometry_info.sigma,(ssize_t) + geometry_info.xi,exception); + break; + } + if (LocaleCompare("level",option+1) == 0) + { + MagickRealType + black_point, + gamma, + white_point; + + MagickStatusType + flags; + + /* + Parse levels. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + black_point=geometry_info.rho; + white_point=(MagickRealType) QuantumRange; + if ((flags & SigmaValue) != 0) + white_point=geometry_info.sigma; + gamma=1.0; + if ((flags & XiValue) != 0) + gamma=geometry_info.xi; + if ((flags & PercentValue) != 0) + { + black_point*=(MagickRealType) (QuantumRange/100.0); + white_point*=(MagickRealType) (QuantumRange/100.0); + } + if ((flags & SigmaValue) == 0) + white_point=(MagickRealType) QuantumRange-black_point; + if ((*option == '+') || ((flags & AspectValue) != 0)) + (void) LevelizeImageChannel(*image,channel,black_point, + white_point,gamma); + else + (void) LevelImageChannel(*image,channel,black_point,white_point, + gamma); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("level-colors",option+1) == 0) + { + char + token[MaxTextExtent]; + + const char + *p; + + MagickPixelPacket + black_point, + white_point; + + p=(const char *) argv[i+1]; + (void) GetNextToken(p,&p,MaxTextExtent,token); /* get black point color */ + if ((isalpha((int) ((unsigned char) *token)) != 0) || ((*token == '#') != 0)) + (void) QueryMagickColor(token,&black_point,exception); + else + (void) QueryMagickColor("#000000",&black_point,exception); + if (isalpha((int) ((unsigned char) *token)) || (*token == '#')) + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == '\0') + white_point=black_point; /* set everything to that color */ + else + { + if ((isalpha((int) ((unsigned char) *token)) == 0) && ((*token == '#') == 0)) + (void) GetNextToken(p,&p,MaxTextExtent,token); /* Get white point color. */ + if ((isalpha((int) ((unsigned char) *token)) != 0) || ((*token == '#') != 0)) + (void) QueryMagickColor(token,&white_point,exception); + else + (void) QueryMagickColor("#ffffff",&white_point,exception); + } + (void) LevelColorsImageChannel(*image,channel,&black_point, + &white_point,*option == '+' ? MagickTrue : MagickFalse); + break; + } + if (LocaleCompare("linear-stretch",option+1) == 0) + { + double + black_point, + white_point; + + MagickStatusType + flags; + + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + black_point=geometry_info.rho; + white_point=(MagickRealType) (*image)->columns*(*image)->rows; + if ((flags & SigmaValue) != 0) + white_point=geometry_info.sigma; + if ((flags & PercentValue) != 0) + { + black_point*=(double) (*image)->columns*(*image)->rows/100.0; + white_point*=(double) (*image)->columns*(*image)->rows/100.0; + } + if ((flags & SigmaValue) == 0) + white_point=(MagickRealType) (*image)->columns*(*image)->rows- + black_point; + (void) LinearStretchImage(*image,black_point,white_point); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("linewidth",option+1) == 0) + { + draw_info->stroke_width=StringToDouble(argv[i+1],(char **) NULL); + break; + } + if (LocaleCompare("liquid-rescale",option+1) == 0) + { + /* + Liquid rescale image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseRegionGeometry(*image,argv[i+1],&geometry,exception); + if ((flags & XValue) == 0) + geometry.x=1; + if ((flags & YValue) == 0) + geometry.y=0; + mogrify_image=LiquidRescaleImage(*image,geometry.width, + geometry.height,1.0*geometry.x,1.0*geometry.y,exception); + break; + } + if (LocaleCompare("local-contrast",option+1) == 0) + { + MagickStatusType + flags; + + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & RhoValue) == 0) + geometry_info.rho=10; + if ((flags & SigmaValue) == 0) + geometry_info.sigma=12.5; + mogrify_image=LocalContrastImage(*image,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + if (LocaleCompare("lowlight-color",option+1) == 0) + { + (void) SetImageArtifact(*image,"compare:lowlight-color",argv[i+1]); + break; + } + break; + } + case 'm': + { + if (LocaleCompare("magnify",option+1) == 0) + { + /* + Double image size. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=MagnifyImage(*image,exception); + break; + } + if (LocaleCompare("map",option+1) == 0) + { + Image + *remap_image; + + /* + Transform image colors to match this set of colors. + */ + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + break; + remap_image=GetImageCache(mogrify_info,argv[i+1],exception); + if (remap_image == (Image *) NULL) + break; + (void) RemapImage(quantize_info,*image,remap_image); + InheritException(exception,&(*image)->exception); + remap_image=DestroyImage(remap_image); + break; + } + if (LocaleCompare("mask",option+1) == 0) + { + Image + *mask; + + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + { + /* + Remove a mask. + */ + (void) SetImageMask(*image,(Image *) NULL); + InheritException(exception,&(*image)->exception); + break; + } + /* + Set the image mask. + */ + mask=GetImageCache(mogrify_info,argv[i+1],exception); + if (mask == (Image *) NULL) + break; + (void) SetImageMask(*image,mask); + mask=DestroyImage(mask); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("matte",option+1) == 0) + { + (void) SetImageAlphaChannel(*image,(*option == '-') ? + SetAlphaChannel : DeactivateAlphaChannel ); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("mean-shift",option+1) == 0) + { + /* + Delineate arbitrarily shaped clusters in the image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + if ((flags & XiValue) == 0) + geometry_info.xi=0.10*QuantumRange; + if ((flags & PercentValue) != 0) + geometry_info.xi=(double) QuantumRange*geometry_info.xi/100.0; + mogrify_image=MeanShiftImage(*image,(size_t) geometry_info.rho, + (size_t) geometry_info.sigma,geometry_info.xi,exception); + break; + } + if (LocaleCompare("median",option+1) == 0) + { + /* + Median filter image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseGeometry(argv[i+1],&geometry_info); + mogrify_image=StatisticImageChannel(*image,channel,MedianStatistic, + (size_t) geometry_info.rho,(size_t) geometry_info.rho,exception); + break; + } + if (LocaleCompare("mode",option+1) == 0) + { + /* + Mode image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseGeometry(argv[i+1],&geometry_info); + mogrify_image=StatisticImageChannel(*image,channel,ModeStatistic, + (size_t) geometry_info.rho,(size_t) geometry_info.rho,exception); + break; + } + if (LocaleCompare("modulate",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + (void) ModulateImage(*image,argv[i+1]); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("moments",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageArtifact(*image,"identify:moments"); + break; + } + (void) SetImageArtifact(*image,"identify:moments",argv[i+1]); + (void) SetImageArtifact(*image,"verbose","true"); + break; + } + if (LocaleCompare("monitor",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageProgressMonitor(*image, + (MagickProgressMonitor) NULL,(void *) NULL); + break; + } + (void) SetImageProgressMonitor(*image,MonitorProgress, + (void *) NULL); + break; + } + if (LocaleCompare("monochrome",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + (void) SetImageType(*image,BilevelType); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("morphology",option+1) == 0) + { + char + token[MaxTextExtent]; + + const char + *p; + + KernelInfo + *kernel; + + MorphologyMethod + method; + + ssize_t + iterations; + + /* + Morphological Image Operation + */ + (void) SyncImageSettings(mogrify_info,*image); + p=argv[i+1]; + (void) GetNextToken(p,&p,MaxTextExtent,token); + method=(MorphologyMethod) ParseCommandOption( + MagickMorphologyOptions,MagickFalse,token); + iterations=1L; + (void) GetNextToken(p,&p,MaxTextExtent,token); + if ((*p == ':') || (*p == ',')) + (void) GetNextToken(p,&p,MaxTextExtent,token); + if ((*p != '\0')) + iterations=(ssize_t) StringToLong(p); + kernel=AcquireKernelInfo(argv[i+2]); + if (kernel == (KernelInfo *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"UnabletoParseKernel","morphology"); + status=MagickFalse; + break; + } + mogrify_image=MorphologyImageChannel(*image,channel,method, + iterations,kernel,exception); + kernel=DestroyKernelInfo(kernel); + break; + } + if (LocaleCompare("motion-blur",option+1) == 0) + { + /* + Motion blur image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=MotionBlurImageChannel(*image,channel, + geometry_info.rho,geometry_info.sigma,geometry_info.xi,exception); + break; + } + break; + } + case 'n': + { + if (LocaleCompare("negate",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + (void) NegateImageChannel(*image,channel,*option == '+' ? + MagickTrue : MagickFalse); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("noise",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '-') + { + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + mogrify_image=StatisticImageChannel(*image,channel, + NonpeakStatistic,(size_t) geometry_info.rho,(size_t) + geometry_info.sigma,exception); + } + else + { + NoiseType + noise; + + noise=(NoiseType) ParseCommandOption(MagickNoiseOptions, + MagickFalse,argv[i+1]); + mogrify_image=AddNoiseImageChannel(*image,channel,noise, + exception); + } + break; + } + if (LocaleCompare("normalize",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + (void) NormalizeImageChannel(*image,channel); + InheritException(exception,&(*image)->exception); + break; + } + break; + } + case 'o': + { + if (LocaleCompare("opaque",option+1) == 0) + { + MagickPixelPacket + target; + + (void) SyncImageSettings(mogrify_info,*image); + (void) QueryMagickColor(argv[i+1],&target,exception); + (void) OpaquePaintImageChannel(*image,channel,&target,&fill, + *option == '-' ? MagickFalse : MagickTrue); + break; + } + if (LocaleCompare("ordered-dither",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + (void) OrderedPosterizeImageChannel(*image,channel,argv[i+1], + exception); + break; + } + break; + } + case 'p': + { + if (LocaleCompare("paint",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseGeometry(argv[i+1],&geometry_info); + mogrify_image=OilPaintImage(*image,geometry_info.rho,exception); + break; + } + if (LocaleCompare("pen",option+1) == 0) + { + if (*option == '+') + { + (void) QueryColorDatabase("none",&draw_info->fill,exception); + break; + } + (void) QueryColorDatabase(argv[i+1],&draw_info->fill,exception); + break; + } + if (LocaleCompare("perceptible",option+1) == 0) + { + /* + Perceptible image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) PerceptibleImageChannel(*image,channel,StringToDouble( + argv[i+1],(char **) NULL)); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("pointsize",option+1) == 0) + { + if (*option == '+') + (void) ParseGeometry("12",&geometry_info); + else + (void) ParseGeometry(argv[i+1],&geometry_info); + draw_info->pointsize=geometry_info.rho; + break; + } + if (LocaleCompare("polaroid",option+1) == 0) + { + double + angle; + + RandomInfo + *random_info; + + /* + Simulate a Polaroid picture. + */ + (void) SyncImageSettings(mogrify_info,*image); + random_info=AcquireRandomInfo(); + angle=22.5*(GetPseudoRandomValue(random_info)-0.5); + random_info=DestroyRandomInfo(random_info); + if (*option == '-') + { + SetGeometryInfo(&geometry_info); + flags=ParseGeometry(argv[i+1],&geometry_info); + angle=geometry_info.rho; + } + mogrify_image=PolaroidImage(*image,draw_info,angle,exception); + break; + } + if (LocaleCompare("posterize",option+1) == 0) + { + /* + Posterize image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) PosterizeImage(*image,StringToUnsignedLong(argv[i+1]), + quantize_info->dither); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("preview",option+1) == 0) + { + PreviewType + preview_type; + + /* + Preview image. + */ + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + preview_type=UndefinedPreview; + else + preview_type=(PreviewType) ParseCommandOption( + MagickPreviewOptions,MagickFalse,argv[i+1]); + mogrify_image=PreviewImage(*image,preview_type,exception); + break; + } + if (LocaleCompare("profile",option+1) == 0) + { + const char + *name; + + const StringInfo + *profile; + + ExceptionInfo + *sans_exception; + + Image + *profile_image; + + ImageInfo + *profile_info; + + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + { + /* + Remove a profile from the image. + */ + (void) ProfileImage(*image,argv[i+1],(const unsigned char *) + NULL,0,MagickTrue); + InheritException(exception,&(*image)->exception); + break; + } + /* + Associate a profile with the image. + */ + profile_info=CloneImageInfo(mogrify_info); + profile=GetImageProfile(*image,"iptc"); + if (profile != (StringInfo *) NULL) + profile_info->profile=(void *) CloneStringInfo(profile); + sans_exception=AcquireExceptionInfo(); + profile_image=GetImageCache(profile_info,argv[i+1],sans_exception); + sans_exception=DestroyExceptionInfo(sans_exception); + profile_info=DestroyImageInfo(profile_info); + if (profile_image == (Image *) NULL) + { + StringInfo + *profile; + + profile_info=CloneImageInfo(mogrify_info); + (void) CopyMagickString(profile_info->filename,argv[i+1], + MaxTextExtent); + profile=FileToStringInfo(profile_info->filename,~0UL,exception); + if (profile != (StringInfo *) NULL) + { + (void) SetImageInfo(profile_info,0,exception); + (void) ProfileImage(*image,profile_info->magick, + GetStringInfoDatum(profile),(size_t) + GetStringInfoLength(profile),MagickFalse); + profile=DestroyStringInfo(profile); + } + profile_info=DestroyImageInfo(profile_info); + break; + } + ResetImageProfileIterator(profile_image); + name=GetNextImageProfile(profile_image); + while (name != (const char *) NULL) + { + profile=GetImageProfile(profile_image,name); + if (profile != (StringInfo *) NULL) + (void) ProfileImage(*image,name,GetStringInfoDatum(profile), + (size_t) GetStringInfoLength(profile),MagickFalse); + name=GetNextImageProfile(profile_image); + } + profile_image=DestroyImage(profile_image); + break; + } + break; + } + case 'q': + { + if (LocaleCompare("quantize",option+1) == 0) + { + if (*option == '+') + { + quantize_info->colorspace=UndefinedColorspace; + break; + } + quantize_info->colorspace=(ColorspaceType) ParseCommandOption( + MagickColorspaceOptions,MagickFalse,argv[i+1]); + break; + } + break; + } + case 'r': + { + if (LocaleCompare("radial-blur",option+1) == 0 || + LocaleCompare("rotational-blur",option+1) == 0) + { + /* + Radial blur image. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=RotationalBlurImageChannel(*image,channel, + StringToDouble(argv[i+1],(char **) NULL),exception); + break; + } + if (LocaleCompare("raise",option+1) == 0) + { + /* + Surround image with a raise of solid color. + */ + flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception); + (void) RaiseImage(*image,&geometry,*option == '-' ? MagickTrue : + MagickFalse); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("random-threshold",option+1) == 0) + { + /* + Threshold image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) RandomThresholdImageChannel(*image,channel,argv[i+1], + exception); + break; + } + if (LocaleCompare("recolor",option+1) == 0) + { + KernelInfo + *kernel; + + (void) SyncImageSettings(mogrify_info,*image); + kernel=AcquireKernelInfo(argv[i+1]); + if (kernel == (KernelInfo *) NULL) + break; + mogrify_image=ColorMatrixImage(*image,kernel,exception); + kernel=DestroyKernelInfo(kernel); + break; + } + if (LocaleCompare("region",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + if (region_image != (Image *) NULL) + { + /* + Composite region. + */ + (void) CompositeImage(region_image,region_image->matte != + MagickFalse ? CopyCompositeOp : OverCompositeOp,*image, + region_geometry.x,region_geometry.y); + InheritException(exception,®ion_image->exception); + *image=DestroyImage(*image); + *image=region_image; + region_image=(Image *) NULL; + } + if (*option == '+') + break; + /* + Apply transformations to a selected region of the image. + */ + (void) ParseGravityGeometry(*image,argv[i+1],®ion_geometry, + exception); + mogrify_image=CropImage(*image,®ion_geometry,exception); + if (mogrify_image == (Image *) NULL) + break; + region_image=(*image); + *image=mogrify_image; + mogrify_image=(Image *) NULL; + break; + } + if (LocaleCompare("render",option+1) == 0) + { + (void) SyncImageSettings(mogrify_info,*image); + draw_info->render=(*option == '+') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("remap",option+1) == 0) + { + Image + *remap_image; + + /* + Transform image colors to match this set of colors. + */ + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + break; + remap_image=GetImageCache(mogrify_info,argv[i+1],exception); + if (remap_image == (Image *) NULL) + break; + (void) RemapImage(quantize_info,*image,remap_image); + InheritException(exception,&(*image)->exception); + remap_image=DestroyImage(remap_image); + break; + } + if (LocaleCompare("repage",option+1) == 0) + { + if (*option == '+') + { + (void) ParseAbsoluteGeometry("0x0+0+0",&(*image)->page); + break; + } + (void) ResetImagePage(*image,argv[i+1]); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("resample",option+1) == 0) + { + /* + Resample image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + mogrify_image=ResampleImage(*image,geometry_info.rho, + geometry_info.sigma,(*image)->filter,(*image)->blur,exception); + break; + } + if (LocaleCompare("resize",option+1) == 0) + { + /* + Resize image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception); + mogrify_image=ResizeImage(*image,geometry.width,geometry.height, + (*image)->filter,(*image)->blur,exception); + break; + } + if (LocaleCompare("roll",option+1) == 0) + { + /* + Roll image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception); + if ((flags & PercentValue) != 0) + { + geometry.x*=(double) (*image)->columns/100.0; + geometry.y*=(double) (*image)->rows/100.0; + } + mogrify_image=RollImage(*image,geometry.x,geometry.y,exception); + break; + } + if (LocaleCompare("rotate",option+1) == 0) + { + char + *geometry; + + /* + Check for conditional image rotation. + */ + (void) SyncImageSettings(mogrify_info,*image); + if (strchr(argv[i+1],'>') != (char *) NULL) + if ((*image)->columns <= (*image)->rows) + break; + if (strchr(argv[i+1],'<') != (char *) NULL) + if ((*image)->columns >= (*image)->rows) + break; + /* + Rotate image. + */ + geometry=ConstantString(argv[i+1]); + (void) SubstituteString(&geometry,">",""); + (void) SubstituteString(&geometry,"<",""); + (void) ParseGeometry(geometry,&geometry_info); + geometry=DestroyString(geometry); + mogrify_image=RotateImage(*image,geometry_info.rho,exception); + break; + } + break; + } + case 's': + { + if (LocaleCompare("sample",option+1) == 0) + { + /* + Sample image with pixel replication. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception); + mogrify_image=SampleImage(*image,geometry.width,geometry.height, + exception); + break; + } + if (LocaleCompare("scale",option+1) == 0) + { + /* + Resize image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception); + mogrify_image=ScaleImage(*image,geometry.width,geometry.height, + exception); + break; + } + if (LocaleCompare("selective-blur",option+1) == 0) + { + /* + Selectively blur pixels within a contrast threshold. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & PercentValue) != 0) + geometry_info.xi=(double) QuantumRange*geometry_info.xi/100.0; + mogrify_image=SelectiveBlurImageChannel(*image,channel, + geometry_info.rho,geometry_info.sigma,geometry_info.xi,exception); + break; + } + if (LocaleCompare("separate",option+1) == 0) + { + /* + Break channels into separate images. + WARNING: This can generate multiple images! + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=SeparateImages(*image,channel,exception); + break; + } + if (LocaleCompare("sepia-tone",option+1) == 0) + { + double + threshold; + + /* + Sepia-tone image. + */ + (void) SyncImageSettings(mogrify_info,*image); + threshold=StringToDoubleInterval(argv[i+1],(double) QuantumRange+ + 1.0); + mogrify_image=SepiaToneImage(*image,threshold,exception); + break; + } + if (LocaleCompare("segment",option+1) == 0) + { + /* + Segment image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + (void) SegmentImage(*image,(*image)->colorspace, + mogrify_info->verbose,geometry_info.rho,geometry_info.sigma); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("set",option+1) == 0) + { + char + *value; + + /* + Set image option. + */ + if (*option == '+') + { + if (LocaleNCompare(argv[i+1],"registry:",9) == 0) + (void) DeleteImageRegistry(argv[i+1]+9); + else + if (LocaleNCompare(argv[i+1],"option:",7) == 0) + { + (void) DeleteImageOption(mogrify_info,argv[i+1]+7); + (void) DeleteImageArtifact(*image,argv[i+1]+7); + } + else + (void) DeleteImageProperty(*image,argv[i+1]); + break; + } + value=InterpretImageProperties(mogrify_info,*image,argv[i+2]); + InheritException(exception,&(*image)->exception); + if (value == (char *) NULL) + break; + if (LocaleNCompare(argv[i+1],"registry:",9) == 0) + (void) SetImageRegistry(StringRegistryType,argv[i+1]+9,value, + exception); + else + if (LocaleNCompare(argv[i+1],"option:",7) == 0) + { + (void) SetImageOption(image_info,argv[i+1]+7,value); + (void) SetImageOption(mogrify_info,argv[i+1]+7,value); + (void) SetImageArtifact(*image,argv[i+1]+7,value); + } + else + (void) SetImageProperty(*image,argv[i+1],value); + value=DestroyString(value); + break; + } + if (LocaleCompare("shade",option+1) == 0) + { + /* + Shade image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=ShadeImage(*image,(*option == '-') ? MagickTrue : + MagickFalse,geometry_info.rho,geometry_info.sigma,exception); + break; + } + if (LocaleCompare("shadow",option+1) == 0) + { + /* + Shadow image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=4.0; + if ((flags & PsiValue) == 0) + geometry_info.psi=4.0; + mogrify_image=ShadowImage(*image,geometry_info.rho, + geometry_info.sigma,(ssize_t) ceil(geometry_info.xi-0.5),(ssize_t) + ceil(geometry_info.psi-0.5),exception); + break; + } + if (LocaleCompare("sharpen",option+1) == 0) + { + /* + Sharpen image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=SharpenImageChannel(*image,channel,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + if (LocaleCompare("shave",option+1) == 0) + { + /* + Shave the image edges. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception); + mogrify_image=ShaveImage(*image,&geometry,exception); + break; + } + if (LocaleCompare("shear",option+1) == 0) + { + /* + Shear image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=geometry_info.rho; + mogrify_image=ShearImage(*image,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + if (LocaleCompare("sigmoidal-contrast",option+1) == 0) + { + /* + Sigmoidal non-linearity contrast control. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=(double) QuantumRange/2.0; + if ((flags & PercentValue) != 0) + geometry_info.sigma=(double) QuantumRange*geometry_info.sigma/ + 100.0; + (void) SigmoidalContrastImageChannel(*image,channel, + (*option == '-') ? MagickTrue : MagickFalse,geometry_info.rho, + geometry_info.sigma); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("sketch",option+1) == 0) + { + /* + Sketch image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=SketchImage(*image,geometry_info.rho, + geometry_info.sigma,geometry_info.xi,exception); + break; + } + if (LocaleCompare("solarize",option+1) == 0) + { + double + threshold; + + (void) SyncImageSettings(mogrify_info,*image); + threshold=StringToDoubleInterval(argv[i+1],(double) QuantumRange+ + 1.0); + (void) SolarizeImageChannel(*image,channel,threshold,exception); + break; + } + if (LocaleCompare("sparse-color",option+1) == 0) + { + SparseColorMethod + method; + + char + *arguments; + + /* + Sparse Color Interpolated Gradient + */ + (void) SyncImageSettings(mogrify_info,*image); + method=(SparseColorMethod) ParseCommandOption( + MagickSparseColorOptions,MagickFalse,argv[i+1]); + arguments=InterpretImageProperties(mogrify_info,*image,argv[i+2]); + InheritException(exception,&(*image)->exception); + if (arguments == (char *) NULL) + break; + mogrify_image=SparseColorOption(*image,channel,method,arguments, + option[0] == '+' ? MagickTrue : MagickFalse,exception); + arguments=DestroyString(arguments); + break; + } + if (LocaleCompare("splice",option+1) == 0) + { + /* + Splice a solid color into the image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseGravityGeometry(*image,argv[i+1],&geometry,exception); + mogrify_image=SpliceImage(*image,&geometry,exception); + break; + } + if (LocaleCompare("spread",option+1) == 0) + { + /* + Spread an image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseGeometry(argv[i+1],&geometry_info); + mogrify_image=SpreadImage(*image,geometry_info.rho,exception); + break; + } + if (LocaleCompare("statistic",option+1) == 0) + { + StatisticType + type; + + (void) SyncImageSettings(mogrify_info,*image); + type=(StatisticType) ParseCommandOption(MagickStatisticOptions, + MagickFalse,argv[i+1]); + (void) ParseGeometry(argv[i+2],&geometry_info); + mogrify_image=StatisticImageChannel(*image,channel,type,(size_t) + geometry_info.rho,(size_t) geometry_info.sigma,exception); + break; + } + if (LocaleCompare("stretch",option+1) == 0) + { + if (*option == '+') + { + draw_info->stretch=UndefinedStretch; + break; + } + draw_info->stretch=(StretchType) ParseCommandOption( + MagickStretchOptions,MagickFalse,argv[i+1]); + break; + } + if (LocaleCompare("strip",option+1) == 0) + { + /* + Strip image of profiles and comments. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) StripImage(*image); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("stroke",option+1) == 0) + { + ExceptionInfo + *sans; + + if (*option == '+') + { + (void) QueryColorDatabase("none",&draw_info->stroke,exception); + if (draw_info->stroke_pattern != (Image *) NULL) + draw_info->stroke_pattern=DestroyImage( + draw_info->stroke_pattern); + break; + } + sans=AcquireExceptionInfo(); + status=QueryColorDatabase(argv[i+1],&draw_info->stroke,sans); + sans=DestroyExceptionInfo(sans); + if (status == MagickFalse) + draw_info->stroke_pattern=GetImageCache(mogrify_info,argv[i+1], + exception); + break; + } + if (LocaleCompare("strokewidth",option+1) == 0) + { + draw_info->stroke_width=StringToDouble(argv[i+1],(char **) NULL); + break; + } + if (LocaleCompare("style",option+1) == 0) + { + if (*option == '+') + { + draw_info->style=UndefinedStyle; + break; + } + draw_info->style=(StyleType) ParseCommandOption(MagickStyleOptions, + MagickFalse,argv[i+1]); + break; + } + if (LocaleCompare("swirl",option+1) == 0) + { + /* + Swirl image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseGeometry(argv[i+1],&geometry_info); + mogrify_image=SwirlImage(*image,geometry_info.rho,exception); + break; + } + break; + } + case 't': + { + if (LocaleCompare("threshold",option+1) == 0) + { + double + threshold; + + /* + Threshold image. + */ + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + threshold=(double) QuantumRange/2; + else + threshold=StringToDoubleInterval(argv[i+1],(double) QuantumRange+ + 1.0); + (void) BilevelImageChannel(*image,channel,threshold); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("thumbnail",option+1) == 0) + { + /* + Thumbnail image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception); + mogrify_image=ThumbnailImage(*image,geometry.width,geometry.height, + exception); + break; + } + if (LocaleCompare("tile",option+1) == 0) + { + if (*option == '+') + { + if (draw_info->fill_pattern != (Image *) NULL) + draw_info->fill_pattern=DestroyImage(draw_info->fill_pattern); + break; + } + draw_info->fill_pattern=GetImageCache(mogrify_info,argv[i+1], + exception); + break; + } + if (LocaleCompare("tint",option+1) == 0) + { + /* + Tint the image. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=TintImage(*image,argv[i+1],draw_info->fill,exception); + break; + } + if (LocaleCompare("transform",option+1) == 0) + { + /* + Affine transform image. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=AffineTransformImage(*image,&draw_info->affine, + exception); + break; + } + if (LocaleCompare("transparent",option+1) == 0) + { + MagickPixelPacket + target; + + (void) SyncImageSettings(mogrify_info,*image); + (void) QueryMagickColor(argv[i+1],&target,exception); + (void) TransparentPaintImage(*image,&target,(Quantum) + TransparentOpacity,*option == '-' ? MagickFalse : MagickTrue); + InheritException(exception,&(*image)->exception); + break; + } + if (LocaleCompare("transpose",option+1) == 0) + { + /* + Transpose image scanlines. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=TransposeImage(*image,exception); + break; + } + if (LocaleCompare("transverse",option+1) == 0) + { + /* + Transverse image scanlines. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=TransverseImage(*image,exception); + break; + } + if (LocaleCompare("treedepth",option+1) == 0) + { + quantize_info->tree_depth=StringToUnsignedLong(argv[i+1]); + break; + } + if (LocaleCompare("trim",option+1) == 0) + { + /* + Trim image. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=TrimImage(*image,exception); + break; + } + if (LocaleCompare("type",option+1) == 0) + { + ImageType + type; + + (void) SyncImageSettings(mogrify_info,*image); + if (*option == '+') + type=UndefinedType; + else + type=(ImageType) ParseCommandOption(MagickTypeOptions,MagickFalse, + argv[i+1]); + (*image)->type=UndefinedType; + (void) SetImageType(*image,type); + InheritException(exception,&(*image)->exception); + break; + } + break; + } + case 'u': + { + if (LocaleCompare("undercolor",option+1) == 0) + { + (void) QueryColorDatabase(argv[i+1],&draw_info->undercolor, + exception); + break; + } + if (LocaleCompare("unique",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageArtifact(*image,"identify:unique-colors"); + break; + } + (void) SetImageArtifact(*image,"identify:unique-colors","true"); + (void) SetImageArtifact(*image,"verbose","true"); + break; + } + if (LocaleCompare("unique-colors",option+1) == 0) + { + /* + Unique image colors. + */ + (void) SyncImageSettings(mogrify_info,*image); + mogrify_image=UniqueImageColors(*image,exception); + break; + } + if (LocaleCompare("unsharp",option+1) == 0) + { + /* + Unsharp mask image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=1.0; + if ((flags & PsiValue) == 0) + geometry_info.psi=0.05; + mogrify_image=UnsharpMaskImageChannel(*image,channel, + geometry_info.rho,geometry_info.sigma,geometry_info.xi, + geometry_info.psi,exception); + break; + } + break; + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + { + (void) SetImageArtifact(*image,option+1, + *option == '+' ? "false" : "true"); + break; + } + if (LocaleCompare("vignette",option+1) == 0) + { + /* + Vignette image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + if ((flags & XiValue) == 0) + geometry_info.xi=0.1*(*image)->columns; + if ((flags & PsiValue) == 0) + geometry_info.psi=0.1*(*image)->rows; + if ((flags & PercentValue) != 0) + { + geometry_info.xi*=(double) (*image)->columns/100.0; + geometry_info.psi*=(double) (*image)->rows/100.0; + } + mogrify_image=VignetteImage(*image,geometry_info.rho, + geometry_info.sigma,(ssize_t) ceil(geometry_info.xi-0.5),(ssize_t) + ceil(geometry_info.psi-0.5),exception); + break; + } + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageVirtualPixelMethod(*image, + UndefinedVirtualPixelMethod); + break; + } + (void) SetImageVirtualPixelMethod(*image,(VirtualPixelMethod) + ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i+1])); + break; + } + break; + } + case 'w': + { + if (LocaleCompare("wave",option+1) == 0) + { + /* + Wave image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & SigmaValue) == 0) + geometry_info.sigma=1.0; + mogrify_image=WaveImage(*image,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + if (LocaleCompare("wavelet-denoise",option+1) == 0) + { + /* + Wavelet denoise image. + */ + (void) SyncImageSettings(mogrify_info,*image); + flags=ParseGeometry(argv[i+1],&geometry_info); + if ((flags & PercentValue) != 0) + { + geometry_info.rho=QuantumRange*geometry_info.rho/100.0; + geometry_info.sigma=QuantumRange*geometry_info.sigma/100.0; + } + if ((flags & SigmaValue) == 0) + geometry_info.sigma=0.0; + mogrify_image=WaveletDenoiseImage(*image,geometry_info.rho, + geometry_info.sigma,exception); + break; + } + if (LocaleCompare("weight",option+1) == 0) + { + ssize_t + weight; + + weight=ParseCommandOption(MagickWeightOptions,MagickFalse, + argv[i+1]); + if (weight == -1) + weight=(ssize_t) StringToUnsignedLong(argv[i+1]); + draw_info->weight=(size_t) weight; + break; + } + if (LocaleCompare("white-threshold",option+1) == 0) + { + /* + White threshold image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) WhiteThresholdImageChannel(*image,channel,argv[i+1], + exception); + InheritException(exception,&(*image)->exception); + break; + } + break; + } + default: + break; + } + /* + Replace current image with any image that was generated. + */ + if (mogrify_image != (Image *) NULL) + ReplaceImageInListReturnLast(image,mogrify_image); + i+=count; + } + if (region_image != (Image *) NULL) + { + /* + Composite transformed region onto image. + */ + (void) SyncImageSettings(mogrify_info,*image); + (void) CompositeImage(region_image,region_image->matte != MagickFalse ? + CopyCompositeOp : OverCompositeOp,*image,region_geometry.x, + region_geometry.y); + InheritException(exception,®ion_image->exception); + *image=DestroyImage(*image); + *image=region_image; + region_image = (Image *) NULL; + } + /* + Free resources. + */ + quantize_info=DestroyQuantizeInfo(quantize_info); + draw_info=DestroyDrawInfo(draw_info); + mogrify_info=DestroyImageInfo(mogrify_info); + status=(MagickStatusType) (exception->severity < ErrorException ? 1 : 0); + return(status == 0 ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M o g r i f y I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MogrifyImageCommand() transforms an image or a sequence of images. These +% transforms include image scaling, image rotation, color reduction, and +% others. The transmogrified image overwrites the original image. +% +% The format of the MogrifyImageCommand method is: +% +% MagickBooleanType MogrifyImageCommand(ImageInfo *image_info,int argc, +% const char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType MogrifyUsage(void) +{ + static const char + miscellaneous[] = + " -debug events display copious debugging information\n" + " -distribute-cache port\n" + " distributed pixel cache spanning one or more servers\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information\n" + " -version print version information", + operators[] = + " -adaptive-blur geometry\n" + " adaptively blur pixels; decrease effect near edges\n" + " -adaptive-resize geometry\n" + " adaptively resize image using 'mesh' interpolation\n" + " -adaptive-sharpen geometry\n" + " adaptively sharpen pixels; increase effect near edges\n" + " -alpha option on, activate, off, deactivate, set, opaque, copy\n" + " transparent, extract, background, or shape\n" + " -annotate geometry text\n" + " annotate the image with text\n" + " -auto-gamma automagically adjust gamma level of image\n" + " -auto-level automagically adjust color levels of image\n" + " -auto-orient automagically orient (rotate) image\n" + " -bench iterations measure performance\n" + " -black-threshold value\n" + " force all pixels below the threshold into black\n" + " -blue-shift simulate a scene at nighttime in the moonlight\n" + " -blur geometry reduce image noise and reduce detail levels\n" + " -border geometry surround image with a border of color\n" + " -bordercolor color border color\n" + " -brightness-contrast geometry\n" + " improve brightness / contrast of the image\n" + " -canny geometry detect edges in the image\n" + " -cdl filename color correct with a color decision list\n" + " -charcoal radius simulate a charcoal drawing\n" + " -chop geometry remove pixels from the image interior\n" + " -clamp keep pixel values in range (0-QuantumRange)\n" + " -clip clip along the first path from the 8BIM profile\n" + " -clip-mask filename associate a clip mask with the image\n" + " -clip-path id clip along a named path from the 8BIM profile\n" + " -colorize value colorize the image with the fill color\n" + " -color-matrix matrix apply color correction to the image\n" + " -connected-components connectivity\n" + " connected-components uniquely labeled\n" + " -contrast enhance or reduce the image contrast\n" + " -contrast-stretch geometry\n" + " improve contrast by `stretching' the intensity range\n" + " -convolve coefficients\n" + " apply a convolution kernel to the image\n" + " -cycle amount cycle the image colormap\n" + " -decipher filename convert cipher pixels to plain pixels\n" + " -deskew threshold straighten an image\n" + " -despeckle reduce the speckles within an image\n" + " -distort method args\n" + " distort images according to given method ad args\n" + " -draw string annotate the image with a graphic primitive\n" + " -edge radius apply a filter to detect edges in the image\n" + " -encipher filename convert plain pixels to cipher pixels\n" + " -emboss radius emboss an image\n" + " -enhance apply a digital filter to enhance a noisy image\n" + " -equalize perform histogram equalization to an image\n" + " -evaluate operator value\n" + " evaluate an arithmetic, relational, or logical expression\n" + " -extent geometry set the image size\n" + " -extract geometry extract area from image\n" + " -hough-lines geometry\n" + " identify lines in the image\n" + " -features distance analyze image features (e.g. contrast, correlation)\n" + " -fft implements the discrete Fourier transform (DFT)\n" + " -flip flip image vertically\n" + " -floodfill geometry color\n" + " floodfill the image with color\n" + " -flop flop image horizontally\n" + " -frame geometry surround image with an ornamental border\n" + " -function name parameters\n" + " apply function over image values\n" + " -gamma value level of gamma correction\n" + " -gaussian-blur geometry\n" + " reduce image noise and reduce detail levels\n" + " -geometry geometry preferred size or location of the image\n" + " -grayscale method convert image to grayscale\n" + " -help print program options\n" + " -identify identify the format and characteristics of the image\n" + " -ift implements the inverse discrete Fourier transform (DFT)\n" + " -implode amount implode image pixels about the center\n" + " -kuwahara geometry edge preserving noise reduction filter\n" + " -lat geometry local adaptive thresholding\n" + " -layers method optimize, merge, or compare image layers\n" + " -level value adjust the level of image contrast\n" + " -level-colors color,color\n" + " level image with the given colors\n" + " -linear-stretch geometry\n" + " improve contrast by `stretching with saturation'\n" + " -liquid-rescale geometry\n" + " rescale image with seam-carving\n" + " -local-contrast geometry\n" + " enhance local contrast\n" + " -magnify double the size of the image with pixel art scaling\n" + " -mean-shift geometry delineate arbitrarily shaped clusters in the image\n" + " -median geometry apply a median filter to the image\n" + " -mode geometry make each pixel the 'predominant color' of the\n" + " neighborhood\n" + " -modulate value vary the brightness, saturation, and hue\n" + " -monochrome transform image to black and white\n" + " -morphology method kernel\n" + " apply a morphology method to the image\n" + " -motion-blur geometry\n" + " simulate motion blur\n" + " -negate replace every pixel with its complementary color \n" + " -noise geometry add or reduce noise in an image\n" + " -normalize transform image to span the full range of colors\n" + " -opaque color change this color to the fill color\n" + " -ordered-dither NxN\n" + " add a noise pattern to the image with specific\n" + " amplitudes\n" + " -paint radius simulate an oil painting\n" + " -perceptible epsilon\n" + " pixel value less than |epsilon| become epsilon or\n" + " -epsilon\n" + " -polaroid angle simulate a Polaroid picture\n" + " -posterize levels reduce the image to a limited number of color levels\n" + " -profile filename add, delete, or apply an image profile\n" + " -quantize colorspace reduce colors in this colorspace\n" + " -radial-blur angle radial blur the image\n" + " -raise value lighten/darken image edges to create a 3-D effect\n" + " -random-threshold low,high\n" + " random threshold the image\n" + " -region geometry apply options to a portion of the image\n" + " -render render vector graphics\n" + " -resample geometry change the resolution of an image\n" + " -resize geometry resize the image\n" + " -roll geometry roll an image vertically or horizontally\n" + " -rotate degrees apply Paeth rotation to the image\n" + " -sample geometry scale image with pixel sampling\n" + " -scale geometry scale the image\n" + " -segment values segment an image\n" + " -selective-blur geometry\n" + " selectively blur pixels within a contrast threshold\n" + " -sepia-tone threshold\n" + " simulate a sepia-toned photo\n" + " -set property value set an image property\n" + " -shade degrees shade the image using a distant light source\n" + " -shadow geometry simulate an image shadow\n" + " -sharpen geometry sharpen the image\n" + " -shave geometry shave pixels from the image edges\n" + " -shear geometry slide one edge of the image along the X or Y axis\n" + " -sigmoidal-contrast geometry\n" + " increase the contrast without saturating highlights or\n" + " shadows\n" + " -sketch geometry simulate a pencil sketch\n" + " -solarize threshold negate all pixels above the threshold level\n" + " -sparse-color method args\n" + " fill in a image based on a few color points\n" + " -splice geometry splice the background color into the image\n" + " -spread radius displace image pixels by a random amount\n" + " -statistic type radius\n" + " replace each pixel with corresponding statistic from the neighborhood\n" + " -strip strip image of all profiles and comments\n" + " -swirl degrees swirl image pixels about the center\n" + " -threshold value threshold the image\n" + " -thumbnail geometry create a thumbnail of the image\n" + " -tile filename tile image when filling a graphic primitive\n" + " -tint value tint the image with the fill color\n" + " -transform affine transform image\n" + " -transparent color make this color transparent within the image\n" + " -transpose flip image vertically and rotate 90 degrees\n" + " -transverse flop image horizontally and rotate 270 degrees\n" + " -trim trim image edges\n" + " -type type image type\n" + " -unique-colors discard all but one of any pixel color\n" + " -unsharp geometry sharpen the image\n" + " -vignette geometry soften the edges of the image in vignette style\n" + " -wave geometry alter an image along a sine wave\n" + " -wavelet-denoise threshold\n" + " removes noise from the image using a wavelet transform\n" + " -white-threshold value\n" + " force all pixels above the threshold into white", + sequence_operators[] = + " -affinity filename transform image colors to match this set of colors\n" + " -append append an image sequence\n" + " -clut apply a color lookup table to the image\n" + " -coalesce merge a sequence of images\n" + " -combine combine a sequence of images\n" + " -compare mathematically and visually annotate the difference between an image and its reconstruction\n" + " -complex operator perform complex mathematics on an image sequence\n" + " -composite composite image\n" + " -copy geometry offset\n" + " copy pixels from one area of an image to another\n" + " -crop geometry cut out a rectangular region of the image\n" + " -deconstruct break down an image sequence into constituent parts\n" + " -evaluate-sequence operator\n" + " evaluate an arithmetic, relational, or logical expression\n" + " -flatten flatten a sequence of images\n" + " -fx expression apply mathematical expression to an image channel(s)\n" + " -hald-clut apply a Hald color lookup table to the image\n" + " -layers method optimize, merge, or compare image layers\n" + " -morph value morph an image sequence\n" + " -mosaic create a mosaic from an image sequence\n" + " -poly terms build a polynomial from the image sequence and the corresponding\n" + " terms (coefficients and degree pairs).\n" + " -print string interpret string and print to console\n" + " -process arguments process the image with a custom image filter\n" + " -separate separate an image channel into a grayscale image\n" + " -smush geometry smush an image sequence together\n" + " -write filename write images to this file", + settings[] = + " -adjoin join images into a single multi-image file\n" + " -affine matrix affine transform matrix\n" + " -alpha option activate, deactivate, reset, or set the alpha channel\n" + " -antialias remove pixel-aliasing\n" + " -authenticate password\n" + " decipher image with this password\n" + " -attenuate value lessen (or intensify) when adding noise to an image\n" + " -background color background color\n" + " -bias value add bias when convolving an image\n" + " -black-point-compensation\n" + " use black point compensation\n" + " -blue-primary point chromaticity blue primary point\n" + " -bordercolor color border color\n" + " -caption string assign a caption to an image\n" + " -cdl filename color correct with a color decision list\n" + " -channel type apply option to select image channels\n" + " -colors value preferred number of colors in the image\n" + " -colorspace type alternate image colorspace\n" + " -comment string annotate image with comment\n" + " -compose operator set image composite operator\n" + " -compress type type of pixel compression when writing the image\n" + " -decipher filename convert cipher pixels to plain pixels\n" + " -define format:option\n" + " define one or more image format options\n" + " -delay value display the next image after pausing\n" + " -density geometry horizontal and vertical density of the image\n" + " -depth value image depth\n" + " -direction type render text right-to-left or left-to-right\n" + " -display server get image or font from this X server\n" + " -dispose method layer disposal method\n" + " -dither method apply error diffusion to image\n" + " -encipher filename convert plain pixels to cipher pixels\n" + " -encoding type text encoding type\n" + " -endian type endianness (MSB or LSB) of the image\n" + " -family name render text with this font family\n" + " -features distance analyze image features (e.g. contrast, correlation)\n" + " -fill color color to use when filling a graphic primitive\n" + " -filter type use this filter when resizing an image\n" + " -flatten flatten a sequence of images\n" + " -font name render text with this font\n" + " -format \"string\" output formatted image characteristics\n" + " -function name apply a function to the image\n" + " -fuzz distance colors within this distance are considered equal\n" + " -gravity type horizontal and vertical text placement\n" + " -green-primary point chromaticity green primary point\n" + " -intensity method method to generate intensity value from pixel\n" + " -intent type type of rendering intent when managing the image color\n" + " -interlace type type of image interlacing scheme\n" + " -interline-spacing value\n" + " set the space between two text lines\n" + " -interpolate method pixel color interpolation method\n" + " -interword-spacing value\n" + " set the space between two words\n" + " -kerning value set the space between two letters\n" + " -label string assign a label to an image\n" + " -limit type value pixel cache resource limit\n" + " -loop iterations add Netscape loop extension to your GIF animation\n" + " -mask filename associate a mask with the image\n" + " -matte store matte channel if the image has one\n" + " -mattecolor color frame color\n" + " -monitor monitor progress\n" + " -morphology method kernel\n" + " apply a morphology method to the image\n" + " -orient type image orientation\n" + " -page geometry size and location of an image canvas (setting)\n" + " -path path write images to this path on disk\n" + " -ping efficiently determine image attributes\n" + " -pointsize value font point size\n" + " -precision value maximum number of significant digits to print\n" + " -preview type image preview type\n" + " -quality value JPEG/MIFF/PNG compression level\n" + " -quiet suppress all warning messages\n" + " -red-primary point chromaticity red primary point\n" + " -regard-warnings pay attention to warning messages\n" + " -remap filename transform image colors to match this set of colors\n" + " -repage geometry size and location of an image canvas\n" + " -respect-parentheses settings remain in effect until parenthesis boundary\n" + " -sampling-factor geometry\n" + " horizontal and vertical sampling factor\n" + " -scene value image scene number\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -size geometry width and height of image\n" + " -stretch type render text with this font stretch\n" + " -stroke color graphic primitive stroke color\n" + " -strokewidth value graphic primitive stroke width\n" + " -style type render text with this font style\n" + " -synchronize synchronize image to storage device\n" + " -taint declare the image as modified\n" + " -texture filename name of texture to tile onto the image background\n" + " -tile-offset geometry\n" + " tile offset\n" + " -treedepth value color tree depth\n" + " -transparent-color color\n" + " transparent color\n" + " -undercolor color annotation bounding box color\n" + " -units type the units of image resolution\n" + " -verbose print detailed information about the image\n" + " -view FlashPix viewing transforms\n" + " -virtual-pixel method\n" + " virtual pixel access method\n" + " -weight type render text with this font weight\n" + " -white-point point chromaticity white point", + stack_operators[] = + " -delete indexes delete the image from the image sequence\n" + " -duplicate count,indexes\n" + " duplicate an image one or more times\n" + " -insert index insert last image into the image sequence\n" + " -reverse reverse image sequence\n" + " -swap indexes swap two images in the image sequence"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] file [ [options ...] file ...]\n", + GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nImage Operators:\n"); + (void) puts(operators); + (void) printf("\nImage Sequence Operators:\n"); + (void) puts(sequence_operators); + (void) printf("\nImage Stack Operators:\n"); + (void) puts(stack_operators); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf( + "\nBy default, the image format of `file' is determined by its magic\n"); + (void) printf( + "number. To specify a particular image format, precede the filename\n"); + (void) printf( + "with an image format name and a colon (i.e. ps:image) or specify the\n"); + (void) printf( + "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); + (void) printf("'-' for standard input or output.\n"); + return(MagickTrue); +} + +WandExport MagickBooleanType MogrifyImageCommand(ImageInfo *image_info, + int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception) +{ +#define DestroyMogrify() \ +{ \ + if (format != (char *) NULL) \ + format=DestroyString(format); \ + if (path != (char *) NULL) \ + path=DestroyString(path); \ + DestroyImageStack(); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowMogrifyException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option); \ + DestroyMogrify(); \ + return(MagickFalse); \ +} +#define ThrowMogrifyInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",argument,option); \ + DestroyMogrify(); \ + return(MagickFalse); \ +} + + char + *format, + *option, + *path; + + Image + *image; + + ImageStack + image_stack[MaxImageStackDepth+1]; + + MagickBooleanType + global_colormap; + + MagickBooleanType + fire, + pend, + respect_parenthesis; + + MagickStatusType + status; + + ssize_t + i; + + ssize_t + j, + k; + + wand_unreferenced(metadata); + + /* + Set defaults. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + if (argc == 2) + { + option=argv[1]; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + } + if (argc < 2) + return(MogrifyUsage()); + format=(char *) NULL; + path=(char *) NULL; + global_colormap=MagickFalse; + k=0; + j=1; + NewImageStack(); + option=(char *) NULL; + pend=MagickFalse; + respect_parenthesis=MagickFalse; + status=MagickTrue; + /* + Parse command line. + */ + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowMogrifyException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + for (i=1; i < (ssize_t) argc; i++) + { + option=argv[i]; + if (LocaleCompare(option,"(") == 0) + { + FireImageStack(MagickFalse,MagickTrue,pend); + if (k == MaxImageStackDepth) + ThrowMogrifyException(OptionError,"ParenthesisNestedTooDeeply", + option); + PushImageStack(); + continue; + } + if (LocaleCompare(option,")") == 0) + { + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + if (k == 0) + ThrowMogrifyException(OptionError,"UnableToParseExpression",option); + PopImageStack(); + continue; + } + if (IsCommandOption(option) == MagickFalse) + { + char + backup_filename[MaxTextExtent], + *filename, + magic[MagickPathExtent]; + + Image + *images; + + struct stat + properties; + + /* + Option is a file name: begin by reading image from specified file. + */ + FireImageStack(MagickFalse,MagickFalse,pend); + filename=argv[i]; + if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1))) + filename=argv[++i]; + (void) SetImageOption(image_info,"filename",filename); + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + images=ReadImages(image_info,exception); + status&=(images != (Image *) NULL) && + (exception->severity < ErrorException); + if (images == (Image *) NULL) + continue; + properties=(*GetBlobProperties(images)); + if (format != (char *) NULL) + GetPathComponent(images->magick_filename,BasePathSansCompressExtension, + images->filename); + if (path != (char *) NULL) + { + GetPathComponent(option,TailPath,filename); + (void) FormatLocaleString(images->filename,MaxTextExtent,"%s%c%s", + path,*DirectorySeparator,filename); + } + if (format != (char *) NULL) + AppendImageFormat(format,images->filename); + AppendImageStack(images); + FinalizeImageSettings(image_info,image,MagickFalse); + if (global_colormap != MagickFalse) + { + QuantizeInfo + *quantize_info; + + quantize_info=AcquireQuantizeInfo(image_info); + (void) RemapImages(quantize_info,images,(Image *) NULL); + quantize_info=DestroyQuantizeInfo(quantize_info); + } + *backup_filename='\0'; + *magic='\0'; + GetPathComponent(filename,MagickPath,magic); + if (*magic != '\0') + { + char + filename[MagickPathExtent]; + + (void) FormatLocaleString(filename,MagickPathExtent,"%s:%s",magic, + image->filename); + (void) CopyMagickString(image->filename,filename,MagickPathExtent); + } + if ((LocaleCompare(image->filename,"-") != 0) && + (IsPathWritable(image->filename) != MagickFalse)) + { + ssize_t + i; + + /* + Rename image file as backup. + */ + (void) CopyMagickString(backup_filename,image->filename, + MaxTextExtent); + for (i=0; i < 6; i++) + { + (void) ConcatenateMagickString(backup_filename,"~",MaxTextExtent); + if (IsPathAccessible(backup_filename) == MagickFalse) + break; + } + if ((IsPathAccessible(backup_filename) != MagickFalse) || + (rename_utf8(image->filename,backup_filename) != 0)) + *backup_filename='\0'; + } + /* + Write transmogrified image to disk. + */ + image_info->synchronize=MagickTrue; + status&=WriteImages(image_info,image,image->filename,exception); + if (status != MagickFalse) + { +#if defined(MAGICKCORE_HAVE_UTIME) + { + MagickBooleanType + preserve_timestamp; + + preserve_timestamp=IsStringTrue(GetImageOption(image_info, + "preserve-timestamp")); + if (preserve_timestamp != MagickFalse) + { + struct utimbuf + timestamp; + + timestamp.actime=properties.st_atime; + timestamp.modtime=properties.st_mtime; + (void) utime(image->filename,×tamp); + } + } +#endif + if (*backup_filename != '\0') + (void) remove_utf8(backup_filename); + } + RemoveAllImageStack(); + continue; + } + pend=image != (Image *) NULL ? MagickTrue : MagickFalse; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("adaptive-blur",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("adaptive-resize",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("adaptive-sharpen",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("affine",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("alpha",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowMogrifyException(OptionError,"UnrecognizedAlphaChannelType", + argv[i]); + break; + } + if (LocaleCompare("annotate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + i++; + break; + } + if (LocaleCompare("antialias",option+1) == 0) + break; + if (LocaleCompare("append",option+1) == 0) + break; + if (LocaleCompare("attenuate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("authenticate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("auto-gamma",option+1) == 0) + break; + if (LocaleCompare("auto-level",option+1) == 0) + break; + if (LocaleCompare("auto-orient",option+1) == 0) + break; + if (LocaleCompare("average",option+1) == 0) + break; + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'b': + { + if (LocaleCompare("background",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("bias",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("black-point-compensation",option+1) == 0) + break; + if (LocaleCompare("black-threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("blue-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("blue-shift",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("blur",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("border",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("bordercolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("box",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("brightness-contrast",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("canny",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("caption",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + ssize_t + channel; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + channel=ParseChannelOption(argv[i]); + if (channel < 0) + ThrowMogrifyException(OptionError,"UnrecognizedChannelType", + argv[i]); + break; + } + if (LocaleCompare("cdl",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("charcoal",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("chop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("clamp",option+1) == 0) + break; + if (LocaleCompare("clip",option+1) == 0) + break; + if (LocaleCompare("clip-mask",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("clut",option+1) == 0) + break; + if (LocaleCompare("coalesce",option+1) == 0) + break; + if (LocaleCompare("colorize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("color-matrix",option+1) == 0) + { + KernelInfo + *kernel_info; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + kernel_info=AcquireKernelInfo(argv[i]); + if (kernel_info == (KernelInfo *) NULL) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + kernel_info=DestroyKernelInfo(kernel_info); + break; + } + if (LocaleCompare("colors",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse, + argv[i]); + if (colorspace < 0) + ThrowMogrifyException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("combine",option+1) == 0) + { + if (*option == '-') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("comment",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("compare",option+1) == 0) + break; + if (LocaleCompare("complex",option+1) == 0) + { + ssize_t + op; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickComplexOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowMogrifyException(OptionError,"UnrecognizedComplexOperator", + argv[i]); + break; + } + if (LocaleCompare("compose",option+1) == 0) + { + ssize_t + compose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + compose=ParseCommandOption(MagickComposeOptions,MagickFalse, + argv[i]); + if (compose < 0) + ThrowMogrifyException(OptionError,"UnrecognizedComposeOperator", + argv[i]); + break; + } + if (LocaleCompare("composite",option+1) == 0) + break; + if (LocaleCompare("compress",option+1) == 0) + { + ssize_t + compress; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + compress=ParseCommandOption(MagickCompressOptions,MagickFalse, + argv[i]); + if (compress < 0) + ThrowMogrifyException(OptionError,"UnrecognizedImageCompression", + argv[i]); + break; + } + if (LocaleCompare("concurrent",option+1) == 0) + break; + if (LocaleCompare("connected-components",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("contrast",option+1) == 0) + break; + if (LocaleCompare("contrast-stretch",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("convolve",option+1) == 0) + { + KernelInfo + *kernel_info; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + kernel_info=AcquireKernelInfo(argv[i]); + if (kernel_info == (KernelInfo *) NULL) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + kernel_info=DestroyKernelInfo(kernel_info); + break; + } + if (LocaleCompare("copy",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("crop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("cycle",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'd': + { + if (LocaleCompare("decipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("deconstruct",option+1) == 0) + break; + if (LocaleCompare("debug",option+1) == 0) + { + ssize_t + event; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); + if (event < 0) + ThrowMogrifyException(OptionError,"UnrecognizedEventType", + argv[i]); + (void) SetLogEventMask(argv[i]); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (*option == '+') + { + const char + *define; + + define=GetImageOption(image_info,argv[i]); + if (define == (const char *) NULL) + ThrowMogrifyException(OptionError,"NoSuchOption",argv[i]); + break; + } + break; + } + if (LocaleCompare("delay",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("delete",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("density",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("deskew",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("despeckle",option+1) == 0) + break; + if (LocaleCompare("dft",option+1) == 0) + break; + if (LocaleCompare("direction",option+1) == 0) + { + ssize_t + direction; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + direction=ParseCommandOption(MagickDirectionOptions,MagickFalse, + argv[i]); + if (direction < 0) + ThrowMogrifyException(OptionError,"UnrecognizedDirectionType", + argv[i]); + break; + } + if (LocaleCompare("display",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("dispose",option+1) == 0) + { + ssize_t + dispose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse, + argv[i]); + if (dispose < 0) + ThrowMogrifyException(OptionError,"UnrecognizedDisposeMethod", + argv[i]); + break; + } + if (LocaleCompare("distort",option+1) == 0) + { + ssize_t + op; + + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickDistortOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowMogrifyException(OptionError,"UnrecognizedDistortMethod", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("dither",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]); + if (method < 0) + ThrowMogrifyException(OptionError,"UnrecognizedDitherMethod", + argv[i]); + break; + } + if (LocaleCompare("draw",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("duplicate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'e': + { + if (LocaleCompare("edge",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("emboss",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("encipher",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("encoding",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("endian",option+1) == 0) + { + ssize_t + endian; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + endian=ParseCommandOption(MagickEndianOptions,MagickFalse,argv[i]); + if (endian < 0) + ThrowMogrifyException(OptionError,"UnrecognizedEndianType", + argv[i]); + break; + } + if (LocaleCompare("enhance",option+1) == 0) + break; + if (LocaleCompare("equalize",option+1) == 0) + break; + if (LocaleCompare("evaluate",option+1) == 0) + { + ssize_t + op; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickEvaluateOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowMogrifyException(OptionError,"UnrecognizedEvaluateOperator", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("evaluate-sequence",option+1) == 0) + { + ssize_t + op; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickEvaluateOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowMogrifyException(OptionError,"UnrecognizedEvaluateOperator", + argv[i]); + break; + } + if (LocaleCompare("extent",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("extract",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'f': + { + if (LocaleCompare("family",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("features",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("fill",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("filter",option+1) == 0) + { + ssize_t + filter; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]); + if (filter < 0) + ThrowMogrifyException(OptionError,"UnrecognizedImageFilter", + argv[i]); + break; + } + if (LocaleCompare("flatten",option+1) == 0) + break; + if (LocaleCompare("flip",option+1) == 0) + break; + if (LocaleCompare("flop",option+1) == 0) + break; + if (LocaleCompare("floodfill",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("font",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("format",option+1) == 0) + { + (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); + (void) CloneString(&format,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + (void) CloneString(&format,argv[i]); + (void) CopyMagickString(image_info->filename,format,MaxTextExtent); + (void) ConcatenateMagickString(image_info->filename,":", + MaxTextExtent); + (void) SetImageInfo(image_info,0,exception); + if (*image_info->magick == '\0') + ThrowMogrifyException(OptionError,"UnrecognizedImageFormat", + format); + break; + } + if (LocaleCompare("frame",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("function",option+1) == 0) + { + ssize_t + op; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickFunctionOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowMogrifyException(OptionError,"UnrecognizedFunction",argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("fuzz",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("fx",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'g': + { + if (LocaleCompare("gamma",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if ((LocaleCompare("gaussian-blur",option+1) == 0) || + (LocaleCompare("gaussian",option+1) == 0)) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("geometry",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("gravity",option+1) == 0) + { + ssize_t + gravity; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse, + argv[i]); + if (gravity < 0) + ThrowMogrifyException(OptionError,"UnrecognizedGravityType", + argv[i]); + break; + } + if (LocaleCompare("grayscale",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickPixelIntensityOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowMogrifyException(OptionError,"UnrecognizedIntensityMethod", + argv[i]); + break; + } + if (LocaleCompare("green-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'h': + { + if (LocaleCompare("hald-clut",option+1) == 0) + break; + if (LocaleCompare("hough-lines",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + DestroyMogrify(); + return(MogrifyUsage()); + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'i': + { + if (LocaleCompare("identify",option+1) == 0) + break; + if (LocaleCompare("idft",option+1) == 0) + break; + if (LocaleCompare("implode",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("intensity",option+1) == 0) + { + ssize_t + intensity; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + intensity=ParseCommandOption(MagickPixelIntensityOptions, + MagickFalse,argv[i]); + if (intensity < 0) + ThrowMogrifyException(OptionError, + "UnrecognizedPixelIntensityMethod",argv[i]); + break; + } + if (LocaleCompare("intent",option+1) == 0) + { + ssize_t + intent; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + intent=ParseCommandOption(MagickIntentOptions,MagickFalse,argv[i]); + if (intent < 0) + ThrowMogrifyException(OptionError,"UnrecognizedIntentType", + argv[i]); + break; + } + if (LocaleCompare("interlace",option+1) == 0) + { + ssize_t + interlace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, + argv[i]); + if (interlace < 0) + ThrowMogrifyException(OptionError,"UnrecognizedInterlaceType", + argv[i]); + break; + } + if (LocaleCompare("interline-spacing",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("interpolate",option+1) == 0) + { + ssize_t + interpolate; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, + argv[i]); + if (interpolate < 0) + ThrowMogrifyException(OptionError,"UnrecognizedInterpolateMethod", + argv[i]); + break; + } + if (LocaleCompare("interword-spacing",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'k': + { + if (LocaleCompare("kerning",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("kuwahara",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'l': + { + if (LocaleCompare("label",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("lat",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("layers",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickLayerOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowMogrifyException(OptionError,"UnrecognizedLayerMethod", + argv[i]); + break; + } + if (LocaleCompare("level",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("level-colors",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("linewidth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("limit",option+1) == 0) + { + char + *p; + + double + value; + + ssize_t + resource; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + resource=ParseCommandOption(MagickResourceOptions,MagickFalse, + argv[i]); + if (resource < 0) + ThrowMogrifyException(OptionError,"UnrecognizedResourceType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + value=StringToDouble(argv[i],&p); + (void) value; + if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("liquid-rescale",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); + if (list < 0) + ThrowMogrifyException(OptionError,"UnrecognizedListType",argv[i]); + status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) + argv+j,exception); + return(status == 0 ? MagickFalse : MagickTrue); + } + if (LocaleCompare("local-contrast",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || + (strchr(argv[i],'%') == (char *) NULL)) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("loop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'm': + { + if (LocaleCompare("magnify",option+1) == 0) + break; + if (LocaleCompare("map",option+1) == 0) + { + global_colormap=(*option == '+') ? MagickTrue : MagickFalse; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("mask",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("matte",option+1) == 0) + break; + if (LocaleCompare("mattecolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("metric",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickMetricOptions,MagickTrue,argv[i]); + if (type < 0) + ThrowMogrifyException(OptionError,"UnrecognizedMetricType", + argv[i]); + break; + } + if (LocaleCompare("maximum",option+1) == 0) + break; + if (LocaleCompare("mean-shift",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("median",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("minimum",option+1) == 0) + break; + if (LocaleCompare("modulate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("mode",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("monitor",option+1) == 0) + break; + if (LocaleCompare("monochrome",option+1) == 0) + break; + if (LocaleCompare("morph",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("morphology",option+1) == 0) + { + char + token[MaxTextExtent]; + + KernelInfo + *kernel_info; + + ssize_t + op; + + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + (void) GetNextToken(argv[i],(const char **) NULL,MaxTextExtent,token); + op=ParseCommandOption(MagickMorphologyOptions,MagickFalse,token); + if (op < 0) + ThrowMogrifyException(OptionError,"UnrecognizedMorphologyMethod", + token); + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + kernel_info=AcquireKernelInfo(argv[i]); + if (kernel_info == (KernelInfo *) NULL) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + kernel_info=DestroyKernelInfo(kernel_info); + break; + } + if (LocaleCompare("mosaic",option+1) == 0) + break; + if (LocaleCompare("motion-blur",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'n': + { + if (LocaleCompare("negate",option+1) == 0) + break; + if (LocaleCompare("noise",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (*option == '+') + { + ssize_t + noise; + + noise=ParseCommandOption(MagickNoiseOptions,MagickFalse,argv[i]); + if (noise < 0) + ThrowMogrifyException(OptionError,"UnrecognizedNoiseType", + argv[i]); + break; + } + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("noop",option+1) == 0) + break; + if (LocaleCompare("normalize",option+1) == 0) + break; + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'o': + { + if (LocaleCompare("opaque",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("ordered-dither",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("orient",option+1) == 0) + { + ssize_t + orientation; + + orientation=UndefinedOrientation; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + orientation=ParseCommandOption(MagickOrientationOptions,MagickFalse, + argv[i]); + if (orientation < 0) + ThrowMogrifyException(OptionError,"UnrecognizedImageOrientation", + argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'p': + { + if (LocaleCompare("page",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("paint",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("path",option+1) == 0) + { + (void) CloneString(&path,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + (void) CloneString(&path,argv[i]); + break; + } + if (LocaleCompare("perceptible",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("pointsize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("polaroid",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("poly",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("posterize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("precision",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("print",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("process",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("profile",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'q': + { + if (LocaleCompare("quality",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("quantize",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse, + argv[i]); + if (colorspace < 0) + ThrowMogrifyException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("quiet",option+1) == 0) + break; + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'r': + { + if (LocaleCompare("radial-blur",option+1) == 0 || + LocaleCompare("rotational-blur",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("raise",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("random-threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("recolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("red-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + } + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleCompare("region",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("remap",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("render",option+1) == 0) + break; + if (LocaleCompare("repage",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resample",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleNCompare("respect-parentheses",option+1,17) == 0) + { + respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("reverse",option+1) == 0) + break; + if (LocaleCompare("roll",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("rotate",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 's': + { + if (LocaleCompare("sample",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sampling-factor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("scale",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("scene",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("segment",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("selective-blur",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("separate",option+1) == 0) + break; + if (LocaleCompare("sepia-tone",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("set",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("shade",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("shadow",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sharpen",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("shave",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("shear",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sigmoidal-contrast",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("size",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sketch",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("smush",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + i++; + break; + } + if (LocaleCompare("solarize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sparse-color",option+1) == 0) + { + ssize_t + op; + + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickSparseColorOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowMogrifyException(OptionError,"UnrecognizedSparseColorMethod", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("splice",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("spread",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("statistic",option+1) == 0) + { + ssize_t + op; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + op=ParseCommandOption(MagickStatisticOptions,MagickFalse,argv[i]); + if (op < 0) + ThrowMogrifyException(OptionError,"UnrecognizedStatisticType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("stretch",option+1) == 0) + { + ssize_t + stretch; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + stretch=ParseCommandOption(MagickStretchOptions,MagickFalse,argv[i]); + if (stretch < 0) + ThrowMogrifyException(OptionError,"UnrecognizedStyleType", + argv[i]); + break; + } + if (LocaleCompare("strip",option+1) == 0) + break; + if (LocaleCompare("stroke",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("strokewidth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("style",option+1) == 0) + { + ssize_t + style; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + style=ParseCommandOption(MagickStyleOptions,MagickFalse,argv[i]); + if (style < 0) + ThrowMogrifyException(OptionError,"UnrecognizedStyleType", + argv[i]); + break; + } + if (LocaleCompare("swap",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("swirl",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("synchronize",option+1) == 0) + break; + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 't': + { + if (LocaleCompare("taint",option+1) == 0) + break; + if (LocaleCompare("texture",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("tile",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("tile-offset",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("tint",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("transform",option+1) == 0) + break; + if (LocaleCompare("transpose",option+1) == 0) + break; + if (LocaleCompare("transverse",option+1) == 0) + break; + if (LocaleCompare("threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("thumbnail",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("transparent",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("transparent-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("treedepth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("trim",option+1) == 0) + break; + if (LocaleCompare("type",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowMogrifyException(OptionError,"UnrecognizedImageType", + argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'u': + { + if (LocaleCompare("undercolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("unique-colors",option+1) == 0) + break; + if (LocaleCompare("units",option+1) == 0) + { + ssize_t + units; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + units=ParseCommandOption(MagickResolutionOptions,MagickFalse, + argv[i]); + if (units < 0) + ThrowMogrifyException(OptionError,"UnrecognizedUnitsType", + argv[i]); + break; + } + if (LocaleCompare("unsharp",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + { + image_info->verbose=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + break; + } + if (LocaleCompare("view",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("vignette",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowMogrifyException(OptionError, + "UnrecognizedVirtualPixelMethod",argv[i]); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case 'w': + { + if (LocaleCompare("wave",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("wavelet-denoise",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("weight",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("white-point",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("white-threshold",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMogrifyInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("write",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingArgument",option); + break; + } + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + case '?': + break; + default: + ThrowMogrifyException(OptionError,"UnrecognizedOption",option) + } + fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & + FireOptionFlag) == 0 ? MagickFalse : MagickTrue; + if (fire != MagickFalse) + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + } + if (k != 0) + ThrowMogrifyException(OptionError,"UnbalancedParenthesis",argv[i]); + if (i != (ssize_t) argc) + ThrowMogrifyException(OptionError,"MissingAnImageFilename",argv[i]); + DestroyMogrify(); + return(status != 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M o g r i f y I m a g e I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MogrifyImageInfo() applies image processing settings to the image as +% prescribed by command line options. +% +% The format of the MogrifyImageInfo method is: +% +% MagickBooleanType MogrifyImageInfo(ImageInfo *image_info,const int argc, +% const char **argv,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info.. +% +% o argc: Specifies a pointer to an integer describing the number of +% elements in the argument vector. +% +% o argv: Specifies a pointer to a text array containing the command line +% arguments. +% +% o exception: return any errors or warnings in this structure. +% +*/ +WandExport MagickBooleanType MogrifyImageInfo(ImageInfo *image_info, + const int argc,const char **argv,ExceptionInfo *exception) +{ + const char + *option; + + GeometryInfo + geometry_info; + + ssize_t + count; + + ssize_t + i; + + /* + Initialize method variables. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + if (argc < 0) + return(MagickTrue); + /* + Set the image settings. + */ + for (i=0; i < (ssize_t) argc; i++) + { + option=argv[i]; + if (IsCommandOption(option) == MagickFalse) + continue; + count=ParseCommandOption(MagickCommandOptions,MagickFalse,option); + count=MagickMax(count,0L); + if ((i+count) >= (ssize_t) argc) + break; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("adjoin",option+1) == 0) + { + image_info->adjoin=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("antialias",option+1) == 0) + { + image_info->antialias=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("attenuate",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageOption(image_info,option+1); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("authenticate",option+1) == 0) + { + if (*option == '+') + (void) CloneString(&image_info->authenticate,(char *) NULL); + else + (void) CloneString(&image_info->authenticate,argv[i+1]); + break; + } + break; + } + case 'b': + { + if (LocaleCompare("background",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageOption(image_info,option+1); + (void) QueryColorDatabase(MogrifyBackgroundColor, + &image_info->background_color,exception); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + (void) QueryColorDatabase(argv[i+1],&image_info->background_color, + exception); + break; + } + if (LocaleCompare("bias",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"0.0"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("black-point-compensation",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"false"); + break; + } + (void) SetImageOption(image_info,option+1,"true"); + break; + } + if (LocaleCompare("blue-primary",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"0.0"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("bordercolor",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageOption(image_info,option+1); + (void) QueryColorDatabase(MogrifyBorderColor, + &image_info->border_color,exception); + break; + } + (void) QueryColorDatabase(argv[i+1],&image_info->border_color, + exception); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("box",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,"undercolor","none"); + break; + } + (void) SetImageOption(image_info,"undercolor",argv[i+1]); + break; + } + break; + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + MagickSizeType + limit; + + limit=MagickResourceInfinity; + if (LocaleCompare("unlimited",argv[i+1]) != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(argv[i+1],100.0); + (void) SetMagickResourceLimit(MemoryResource,limit); + (void) SetMagickResourceLimit(MapResource,2*limit); + break; + } + if (LocaleCompare("caption",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageOption(image_info,option+1); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + if (*option == '+') + { + image_info->channel=DefaultChannels; + break; + } + image_info->channel=(ChannelType) ParseChannelOption(argv[i+1]); + break; + } + if (LocaleCompare("colors",option+1) == 0) + { + image_info->colors=StringToUnsignedLong(argv[i+1]); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + if (*option == '+') + { + image_info->colorspace=UndefinedColorspace; + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + image_info->colorspace=(ColorspaceType) ParseCommandOption( + MagickColorspaceOptions,MagickFalse,argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("comment",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageOption(image_info,option+1); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("compose",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("compress",option+1) == 0) + { + if (*option == '+') + { + image_info->compression=UndefinedCompression; + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + image_info->compression=(CompressionType) ParseCommandOption( + MagickCompressOptions,MagickFalse,argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + case 'd': + { + if (LocaleCompare("debug",option+1) == 0) + { + if (*option == '+') + (void) SetLogEventMask("none"); + else + (void) SetLogEventMask(argv[i+1]); + image_info->debug=IsEventLogging(); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + if (*option == '+') + { + if (LocaleNCompare(argv[i+1],"registry:",9) == 0) + (void) DeleteImageRegistry(argv[i+1]+9); + else + (void) DeleteImageOption(image_info,argv[i+1]); + break; + } + if (LocaleNCompare(argv[i+1],"registry:",9) == 0) + { + (void) DefineImageRegistry(StringRegistryType,argv[i+1]+9, + exception); + break; + } + (void) DefineImageOption(image_info,argv[i+1]); + break; + } + if (LocaleCompare("delay",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"0"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("density",option+1) == 0) + { + /* + Set image density. + */ + if (*option == '+') + { + if (image_info->density != (char *) NULL) + image_info->density=DestroyString(image_info->density); + (void) SetImageOption(image_info,option+1,"72"); + break; + } + (void) CloneString(&image_info->density,argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + { + image_info->depth=MAGICKCORE_QUANTUM_DEPTH; + break; + } + image_info->depth=StringToUnsignedLong(argv[i+1]); + break; + } + if (LocaleCompare("direction",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("display",option+1) == 0) + { + if (*option == '+') + { + if (image_info->server_name != (char *) NULL) + image_info->server_name=DestroyString( + image_info->server_name); + break; + } + (void) CloneString(&image_info->server_name,argv[i+1]); + break; + } + if (LocaleCompare("dispose",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("dither",option+1) == 0) + { + if (*option == '+') + { + image_info->dither=MagickFalse; + (void) SetImageOption(image_info,option+1,"none"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + image_info->dither=MagickTrue; + break; + } + break; + } + case 'e': + { + if (LocaleCompare("encoding",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("endian",option+1) == 0) + { + if (*option == '+') + { + image_info->endian=UndefinedEndian; + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + image_info->endian=(EndianType) ParseCommandOption( + MagickEndianOptions,MagickFalse,argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("extract",option+1) == 0) + { + /* + Set image extract geometry. + */ + if (*option == '+') + { + if (image_info->extract != (char *) NULL) + image_info->extract=DestroyString(image_info->extract); + break; + } + (void) CloneString(&image_info->extract,argv[i+1]); + break; + } + break; + } + case 'f': + { + if (LocaleCompare("family",option+1) == 0) + { + if (*option != '+') + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("fill",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"none"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("filter",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("font",option+1) == 0) + { + if (*option == '+') + { + if (image_info->font != (char *) NULL) + image_info->font=DestroyString(image_info->font); + break; + } + (void) CloneString(&image_info->font,argv[i+1]); + break; + } + if (LocaleCompare("format",option+1) == 0) + { + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("fuzz",option+1) == 0) + { + if (*option == '+') + { + image_info->fuzz=0.0; + (void) SetImageOption(image_info,option+1,"0"); + break; + } + image_info->fuzz=StringToDoubleInterval(argv[i+1],(double) + QuantumRange+1.0); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + case 'g': + { + if (LocaleCompare("gravity",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("green-primary",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"0.0"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + case 'i': + { + if (LocaleCompare("intensity",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("intent",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("interlace",option+1) == 0) + { + if (*option == '+') + { + image_info->interlace=UndefinedInterlace; + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + image_info->interlace=(InterlaceType) ParseCommandOption( + MagickInterlaceOptions,MagickFalse,argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("interline-spacing",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("interpolate",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("interword-spacing",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + case 'k': + { + if (LocaleCompare("kerning",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + case 'l': + { + if (LocaleCompare("label",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageOption(image_info,option+1); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("limit",option+1) == 0) + { + MagickSizeType + limit; + + ResourceType + type; + + if (*option == '+') + break; + type=(ResourceType) ParseCommandOption(MagickResourceOptions, + MagickFalse,argv[i+1]); + limit=MagickResourceInfinity; + if (LocaleCompare("unlimited",argv[i+2]) != 0) + limit=(MagickSizeType) SiPrefixToDoubleInterval(argv[i+2],100.0); + (void) SetMagickResourceLimit(type,limit); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + /* + Display configuration list. + */ + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i+1]); + switch (list) + { + case MagickCoderOptions: + { + (void) ListCoderInfo((FILE *) NULL,exception); + break; + } + case MagickColorOptions: + { + (void) ListColorInfo((FILE *) NULL,exception); + break; + } + case MagickConfigureOptions: + { + (void) ListConfigureInfo((FILE *) NULL,exception); + break; + } + case MagickDelegateOptions: + { + (void) ListDelegateInfo((FILE *) NULL,exception); + break; + } + case MagickFontOptions: + { + (void) ListTypeInfo((FILE *) NULL,exception); + break; + } + case MagickFormatOptions: + { + (void) ListMagickInfo((FILE *) NULL,exception); + break; + } + case MagickLocaleOptions: + { + (void) ListLocaleInfo((FILE *) NULL,exception); + break; + } + case MagickLogOptions: + { + (void) ListLogInfo((FILE *) NULL,exception); + break; + } + case MagickMagicOptions: + { + (void) ListMagicInfo((FILE *) NULL,exception); + break; + } + case MagickMimeOptions: + { + (void) ListMimeInfo((FILE *) NULL,exception); + break; + } + case MagickModuleOptions: + { + (void) ListModuleInfo((FILE *) NULL,exception); + break; + } + case MagickPolicyOptions: + { + (void) ListPolicyInfo((FILE *) NULL,exception); + break; + } + case MagickResourceOptions: + { + (void) ListMagickResourceInfo((FILE *) NULL,exception); + break; + } + case MagickThresholdOptions: + { + (void) ListThresholdMaps((FILE *) NULL,exception); + break; + } + default: + { + (void) ListCommandOptions((FILE *) NULL,(CommandOption) list, + exception); + break; + } + } + break; + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + (void) SetLogFormat(argv[i+1]); + break; + } + if (LocaleCompare("loop",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"0"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + case 'm': + { + if (LocaleCompare("matte",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"false"); + break; + } + (void) SetImageOption(image_info,option+1,"true"); + break; + } + if (LocaleCompare("mattecolor",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,argv[i+1]); + (void) QueryColorDatabase(MogrifyMatteColor, + &image_info->matte_color,exception); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + (void) QueryColorDatabase(argv[i+1],&image_info->matte_color, + exception); + break; + } + if (LocaleCompare("metric",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageOption(image_info,option+1); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("monitor",option+1) == 0) + { + (void) SetImageInfoProgressMonitor(image_info,MonitorProgress, + (void *) NULL); + break; + } + if (LocaleCompare("monochrome",option+1) == 0) + { + image_info->monochrome=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + break; + } + case 'o': + { + if (LocaleCompare("orient",option+1) == 0) + { + if (*option == '+') + { + image_info->orientation=UndefinedOrientation; + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + image_info->orientation=(OrientationType) ParseCommandOption( + MagickOrientationOptions,MagickFalse,argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + } + case 'p': + { + if (LocaleCompare("page",option+1) == 0) + { + char + *canonical_page, + page[MaxTextExtent]; + + const char + *image_option; + + MagickStatusType + flags; + + RectangleInfo + geometry; + + if (*option == '+') + { + (void) DeleteImageOption(image_info,option+1); + (void) CloneString(&image_info->page,(char *) NULL); + break; + } + (void) memset(&geometry,0,sizeof(geometry)); + image_option=GetImageOption(image_info,"page"); + if (image_option != (const char *) NULL) + (void) ParseAbsoluteGeometry(image_option,&geometry); + canonical_page=GetPageGeometry(argv[i+1]); + flags=ParseAbsoluteGeometry(canonical_page,&geometry); + canonical_page=DestroyString(canonical_page); + (void) FormatLocaleString(page,MaxTextExtent,"%lux%lu", + (unsigned long) geometry.width,(unsigned long) geometry.height); + if (((flags & XValue) != 0) || ((flags & YValue) != 0)) + (void) FormatLocaleString(page,MaxTextExtent,"%lux%lu%+ld%+ld", + (unsigned long) geometry.width,(unsigned long) geometry.height, + (long) geometry.x,(long) geometry.y); + (void) SetImageOption(image_info,option+1,page); + (void) CloneString(&image_info->page,page); + break; + } + if (LocaleCompare("pen",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"none"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("ping",option+1) == 0) + { + image_info->ping=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("pointsize",option+1) == 0) + { + if (*option == '+') + geometry_info.rho=0.0; + else + (void) ParseGeometry(argv[i+1],&geometry_info); + image_info->pointsize=geometry_info.rho; + break; + } + if (LocaleCompare("precision",option+1) == 0) + { + (void) SetMagickPrecision(StringToInteger(argv[i+1])); + break; + } + if (LocaleCompare("preview",option+1) == 0) + { + /* + Preview image. + */ + if (*option == '+') + { + image_info->preview_type=UndefinedPreview; + break; + } + image_info->preview_type=(PreviewType) ParseCommandOption( + MagickPreviewOptions,MagickFalse,argv[i+1]); + break; + } + break; + } + case 'q': + { + if (LocaleCompare("quality",option+1) == 0) + { + /* + Set image compression quality. + */ + if (*option == '+') + { + image_info->quality=UndefinedCompressionQuality; + (void) SetImageOption(image_info,option+1,"0"); + break; + } + image_info->quality=StringToUnsignedLong(argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("quiet",option+1) == 0) + { + static WarningHandler + warning_handler = (WarningHandler) NULL; + + if (*option == '+') + { + /* + Restore error or warning messages. + */ + warning_handler=SetWarningHandler(warning_handler); + break; + } + /* + Suppress error or warning messages. + */ + warning_handler=SetWarningHandler((WarningHandler) NULL); + break; + } + break; + } + case 'r': + { + if (LocaleCompare("red-primary",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"0.0"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + case 's': + { + if (LocaleCompare("sampling-factor",option+1) == 0) + { + /* + Set image sampling factor. + */ + if (*option == '+') + { + if (image_info->sampling_factor != (char *) NULL) + image_info->sampling_factor=DestroyString( + image_info->sampling_factor); + break; + } + (void) CloneString(&image_info->sampling_factor,argv[i+1]); + break; + } + if (LocaleCompare("scene",option+1) == 0) + { + /* + Set image scene. + */ + if (*option == '+') + { + image_info->scene=0; + (void) SetImageOption(image_info,option+1,"0"); + break; + } + image_info->scene=StringToUnsignedLong(argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + unsigned long + seed; + + if (*option == '+') + { + seed=(unsigned long) time((time_t *) NULL); + SetRandomSecretKey(seed); + break; + } + seed=StringToUnsignedLong(argv[i+1]); + SetRandomSecretKey(seed); + break; + } + if (LocaleCompare("size",option+1) == 0) + { + if (*option == '+') + { + if (image_info->size != (char *) NULL) + image_info->size=DestroyString(image_info->size); + break; + } + (void) CloneString(&image_info->size,argv[i+1]); + break; + } + if (LocaleCompare("stroke",option+1) == 0) + { + if (*option == '+') + (void) SetImageOption(image_info,option+1,"none"); + else + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("strokewidth",option+1) == 0) + { + if (*option == '+') + (void) SetImageOption(image_info,option+1,"0"); + else + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("style",option+1) == 0) + { + if (*option == '+') + (void) SetImageOption(image_info,option+1,"none"); + else + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("synchronize",option+1) == 0) + { + if (*option == '+') + { + image_info->synchronize=MagickFalse; + break; + } + image_info->synchronize=MagickTrue; + break; + } + break; + } + case 't': + { + if (LocaleCompare("taint",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"false"); + break; + } + (void) SetImageOption(image_info,option+1,"true"); + break; + } + if (LocaleCompare("texture",option+1) == 0) + { + if (*option == '+') + { + if (image_info->texture != (char *) NULL) + image_info->texture=DestroyString(image_info->texture); + break; + } + (void) CloneString(&image_info->texture,argv[i+1]); + break; + } + if (LocaleCompare("tile-offset",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"0"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("transparent-color",option+1) == 0) + { + if (*option == '+') + { + (void) QueryColorDatabase("none",&image_info->transparent_color, exception); + (void) SetImageOption(image_info,option+1,"none"); + break; + } + (void) QueryColorDatabase(argv[i+1],&image_info->transparent_color, + exception); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("type",option+1) == 0) + { + if (*option == '+') + { + image_info->type=UndefinedType; + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + image_info->type=(ImageType) ParseCommandOption(MagickTypeOptions, + MagickFalse,argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + case 'u': + { + if (LocaleCompare("undercolor",option+1) == 0) + { + if (*option == '+') + { + (void) DeleteImageOption(image_info,option+1); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("units",option+1) == 0) + { + if (*option == '+') + { + image_info->units=UndefinedResolution; + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + image_info->units=(ResolutionType) ParseCommandOption( + MagickResolutionOptions,MagickFalse,argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + { + if (*option == '+') + { + image_info->verbose=MagickFalse; + break; + } + image_info->verbose=MagickTrue; + image_info->ping=MagickFalse; + break; + } + if (LocaleCompare("view",option+1) == 0) + { + if (*option == '+') + { + if (image_info->view != (char *) NULL) + image_info->view=DestroyString(image_info->view); + break; + } + (void) CloneString(&image_info->view,argv[i+1]); + break; + } + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + if (*option == '+') + { + image_info->virtual_pixel_method=UndefinedVirtualPixelMethod; + (void) SetImageOption(image_info,option+1,"undefined"); + break; + } + image_info->virtual_pixel_method=(VirtualPixelMethod) + ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i+1]); + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + case 'w': + { + if (LocaleCompare("weight",option+1) == 0) + { + if (*option == '+') + (void) SetImageOption(image_info,option+1,"0"); + else + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + if (LocaleCompare("white-point",option+1) == 0) + { + if (*option == '+') + { + (void) SetImageOption(image_info,option+1,"0.0"); + break; + } + (void) SetImageOption(image_info,option+1,argv[i+1]); + break; + } + break; + } + default: + break; + } + i+=count; + } + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M o g r i f y I m a g e L i s t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MogrifyImageList() applies any command line options that might affect the +% entire image list (e.g. -append, -coalesce, etc.). +% +% The format of the MogrifyImage method is: +% +% MagickBooleanType MogrifyImageList(ImageInfo *image_info,const int argc, +% const char **argv,Image **images,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info.. +% +% o argc: Specifies a pointer to an integer describing the number of +% elements in the argument vector. +% +% o argv: Specifies a pointer to a text array containing the command line +% arguments. +% +% o images: pointer to pointer of the first image in image list. +% +% o exception: return any errors or warnings in this structure. +% +*/ +WandExport MagickBooleanType MogrifyImageList(ImageInfo *image_info, + const int argc,const char **argv,Image **images,ExceptionInfo *exception) +{ + ChannelType + channel; + + const char + *option; + + ImageInfo + *mogrify_info; + + MagickStatusType + status; + + QuantizeInfo + *quantize_info; + + ssize_t + i; + + ssize_t + count, + index; + + /* + Apply options to the image list. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + assert(images != (Image **) NULL); + assert((*images)->previous == (Image *) NULL); + assert((*images)->signature == MagickCoreSignature); + if ((*images)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + (*images)->filename); + if ((argc <= 0) || (*argv == (char *) NULL)) + return(MagickTrue); + mogrify_info=CloneImageInfo(image_info); + quantize_info=AcquireQuantizeInfo(mogrify_info); + channel=mogrify_info->channel; + status=MagickTrue; + for (i=0; i < (ssize_t) argc; i++) + { + if (*images == (Image *) NULL) + break; + option=argv[i]; + if (IsCommandOption(option) == MagickFalse) + continue; + count=ParseCommandOption(MagickCommandOptions,MagickFalse,option); + count=MagickMax(count,0L); + if ((i+count) >= (ssize_t) argc) + break; + status=MogrifyImageInfo(mogrify_info,(int) count+1,argv+i,exception); + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("affinity",option+1) == 0) + { + (void) SyncImagesSettings(mogrify_info,*images); + if (*option == '+') + { + (void) RemapImages(quantize_info,*images,(Image *) NULL); + InheritException(exception,&(*images)->exception); + break; + } + i++; + break; + } + if (LocaleCompare("append",option+1) == 0) + { + Image + *append_image; + + (void) SyncImagesSettings(mogrify_info,*images); + append_image=AppendImages(*images,*option == '-' ? MagickTrue : + MagickFalse,exception); + if (append_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=append_image; + break; + } + if (LocaleCompare("average",option+1) == 0) + { + Image + *average_image; + + /* + Average an image sequence (deprecated). + */ + (void) SyncImagesSettings(mogrify_info,*images); + average_image=EvaluateImages(*images,MeanEvaluateOperator, + exception); + if (average_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=average_image; + break; + } + break; + } + case 'c': + { + if (LocaleCompare("channel",option+1) == 0) + { + if (*option == '+') + { + channel=DefaultChannels; + break; + } + channel=(ChannelType) ParseChannelOption(argv[i+1]); + break; + } + if (LocaleCompare("clut",option+1) == 0) + { + Image + *clut_image, + *image; + + (void) SyncImagesSettings(mogrify_info,*images); + image=RemoveFirstImageFromList(images); + clut_image=RemoveFirstImageFromList(images); + if (clut_image == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"ImageSequenceRequired","`%s'",option); + image=DestroyImage(image); + status=MagickFalse; + break; + } + (void) ClutImageChannel(image,channel,clut_image); + clut_image=DestroyImage(clut_image); + InheritException(exception,&image->exception); + *images=DestroyImageList(*images); + *images=image; + break; + } + if (LocaleCompare("coalesce",option+1) == 0) + { + Image + *coalesce_image; + + (void) SyncImagesSettings(mogrify_info,*images); + coalesce_image=CoalesceImages(*images,exception); + if (coalesce_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=coalesce_image; + break; + } + if (LocaleCompare("combine",option+1) == 0) + { + Image + *combine_image; + + (void) SyncImagesSettings(mogrify_info,*images); + combine_image=CombineImages(*images,channel,exception); + if (combine_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=combine_image; + break; + } + if (LocaleCompare("compare",option+1) == 0) + { + double + distortion; + + Image + *difference_image, + *image, + *reconstruct_image; + + MetricType + metric; + + /* + Mathematically and visually annotate the difference between an + image and its reconstruction. + */ + (void) SyncImagesSettings(mogrify_info,*images); + image=RemoveFirstImageFromList(images); + reconstruct_image=RemoveFirstImageFromList(images); + if (reconstruct_image == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"ImageSequenceRequired","`%s'",option); + image=DestroyImage(image); + status=MagickFalse; + break; + } + metric=UndefinedMetric; + option=GetImageOption(image_info,"metric"); + if (option != (const char *) NULL) + metric=(MetricType) ParseCommandOption(MagickMetricOptions, + MagickFalse,option); + difference_image=CompareImageChannels(image,reconstruct_image, + channel,metric,&distortion,exception); + if (difference_image == (Image *) NULL) + break; + reconstruct_image=DestroyImage(reconstruct_image); + image=DestroyImage(image); + if (*images != (Image *) NULL) + *images=DestroyImageList(*images); + *images=difference_image; + break; + } + if (LocaleCompare("complex",option+1) == 0) + { + ComplexOperator + op; + + Image + *complex_images; + + (void) SyncImageSettings(mogrify_info,*images); + op=(ComplexOperator) ParseCommandOption(MagickComplexOptions, + MagickFalse,argv[i+1]); + complex_images=ComplexImages(*images,op,exception); + if (complex_images == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=complex_images; + break; + } + if (LocaleCompare("composite",option+1) == 0) + { + Image + *mask_image, + *composite_image, + *image; + + RectangleInfo + geometry; + + (void) SyncImagesSettings(mogrify_info,*images); + image=RemoveFirstImageFromList(images); + composite_image=RemoveFirstImageFromList(images); + if (composite_image == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"ImageSequenceRequired","`%s'",option); + image=DestroyImage(image); + status=MagickFalse; + break; + } + (void) TransformImage(&composite_image,(char *) NULL, + composite_image->geometry); + SetGeometry(composite_image,&geometry); + (void) ParseAbsoluteGeometry(composite_image->geometry,&geometry); + GravityAdjustGeometry(image->columns,image->rows,image->gravity, + &geometry); + mask_image=RemoveFirstImageFromList(images); + if (mask_image != (Image *) NULL) + { + if ((image->compose == DisplaceCompositeOp) || + (image->compose == DistortCompositeOp)) + { + /* + Merge Y displacement into X displacement image. + */ + (void) CompositeImage(composite_image,CopyGreenCompositeOp, + mask_image,0,0); + mask_image=DestroyImage(mask_image); + } + else + { + /* + Set a blending mask for the composition. + */ + if (image->mask != (Image *) NULL) + image->mask=DestroyImage(image->mask); + image->mask=mask_image; + (void) NegateImage(image->mask,MagickFalse); + } + } + (void) CompositeImageChannel(image,channel,image->compose, + composite_image,geometry.x,geometry.y); + if (mask_image != (Image *) NULL) + { + image->mask=DestroyImage(image->mask); + mask_image=image->mask; + } + composite_image=DestroyImage(composite_image); + InheritException(exception,&image->exception); + *images=DestroyImageList(*images); + *images=image; + break; + } + if (LocaleCompare("copy",option+1) == 0) + { + Image + *source_image; + + OffsetInfo + offset; + + RectangleInfo + geometry; + + /* + Copy image pixels. + */ + (void) SyncImageSettings(mogrify_info,*images); + (void) ParsePageGeometry(*images,argv[i+2],&geometry,exception); + offset.x=geometry.x; + offset.y=geometry.y; + source_image=(*images); + if (source_image->next != (Image *) NULL) + source_image=source_image->next; + (void) ParsePageGeometry(source_image,argv[i+1],&geometry, + exception); + status=CopyImagePixels(*images,source_image,&geometry,&offset, + exception); + break; + } + break; + } + case 'd': + { + if (LocaleCompare("deconstruct",option+1) == 0) + { + Image + *deconstruct_image; + + (void) SyncImagesSettings(mogrify_info,*images); + deconstruct_image=DeconstructImages(*images,exception); + if (deconstruct_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=deconstruct_image; + break; + } + if (LocaleCompare("delete",option+1) == 0) + { + if (*option == '+') + DeleteImages(images,"-1",exception); + else + DeleteImages(images,argv[i+1],exception); + break; + } + if (LocaleCompare("dither",option+1) == 0) + { + if (*option == '+') + { + quantize_info->dither=MagickFalse; + break; + } + quantize_info->dither=MagickTrue; + quantize_info->dither_method=(DitherMethod) ParseCommandOption( + MagickDitherOptions,MagickFalse,argv[i+1]); + break; + } + if (LocaleCompare("duplicate",option+1) == 0) + { + Image + *duplicate_images; + + if (*option == '+') + duplicate_images=DuplicateImages(*images,1,"-1",exception); + else + { + const char + *p; + + size_t + number_duplicates; + + number_duplicates=(size_t) StringToLong(argv[i+1]); + p=strchr(argv[i+1],','); + if (p == (const char *) NULL) + duplicate_images=DuplicateImages(*images,number_duplicates, + "-1",exception); + else + duplicate_images=DuplicateImages(*images,number_duplicates, + p+1,exception); + } + AppendImageToList(images, duplicate_images); + (void) SyncImagesSettings(mogrify_info,*images); + break; + } + break; + } + case 'e': + { + if (LocaleCompare("evaluate-sequence",option+1) == 0) + { + Image + *evaluate_image; + + MagickEvaluateOperator + op; + + (void) SyncImageSettings(mogrify_info,*images); + op=(MagickEvaluateOperator) ParseCommandOption( + MagickEvaluateOptions,MagickFalse,argv[i+1]); + evaluate_image=EvaluateImages(*images,op,exception); + if (evaluate_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=evaluate_image; + break; + } + break; + } + case 'f': + { + if (LocaleCompare("fft",option+1) == 0) + { + Image + *fourier_image; + + /* + Implements the discrete Fourier transform (DFT). + */ + (void) SyncImageSettings(mogrify_info,*images); + fourier_image=ForwardFourierTransformImage(*images,*option == '-' ? + MagickTrue : MagickFalse,exception); + if (fourier_image == (Image *) NULL) + break; + *images=DestroyImageList(*images); + *images=fourier_image; + break; + } + if (LocaleCompare("flatten",option+1) == 0) + { + Image + *flatten_image; + + (void) SyncImagesSettings(mogrify_info,*images); + flatten_image=MergeImageLayers(*images,FlattenLayer,exception); + if (flatten_image == (Image *) NULL) + break; + *images=DestroyImageList(*images); + *images=flatten_image; + break; + } + if (LocaleCompare("fx",option+1) == 0) + { + Image + *fx_image; + + (void) SyncImagesSettings(mogrify_info,*images); + fx_image=FxImageChannel(*images,channel,argv[i+1],exception); + if (fx_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=fx_image; + break; + } + break; + } + case 'h': + { + if (LocaleCompare("hald-clut",option+1) == 0) + { + Image + *hald_image, + *image; + + (void) SyncImagesSettings(mogrify_info,*images); + image=RemoveFirstImageFromList(images); + hald_image=RemoveFirstImageFromList(images); + if (hald_image == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"ImageSequenceRequired","`%s'",option); + image=DestroyImage(image); + status=MagickFalse; + break; + } + (void) HaldClutImageChannel(image,channel,hald_image); + hald_image=DestroyImage(hald_image); + InheritException(exception,&image->exception); + if (*images != (Image *) NULL) + *images=DestroyImageList(*images); + *images=image; + break; + } + break; + } + case 'i': + { + if (LocaleCompare("ift",option+1) == 0) + { + Image + *fourier_image, + *magnitude_image, + *phase_image; + + /* + Implements the inverse fourier discrete Fourier transform (DFT). + */ + (void) SyncImagesSettings(mogrify_info,*images); + magnitude_image=RemoveFirstImageFromList(images); + phase_image=RemoveFirstImageFromList(images); + if (phase_image == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"ImageSequenceRequired","`%s'",option); + magnitude_image=DestroyImage(magnitude_image); + status=MagickFalse; + break; + } + fourier_image=InverseFourierTransformImage(magnitude_image, + phase_image,*option == '-' ? MagickTrue : MagickFalse,exception); + magnitude_image=DestroyImage(magnitude_image); + phase_image=DestroyImage(phase_image); + if (fourier_image == (Image *) NULL) + break; + if (*images != (Image *) NULL) + *images=DestroyImageList(*images); + *images=fourier_image; + break; + } + if (LocaleCompare("insert",option+1) == 0) + { + Image + *p, + *q; + + index=0; + if (*option != '+') + index=(ssize_t) StringToLong(argv[i+1]); + p=RemoveLastImageFromList(images); + if (p == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"NoSuchImage","`%s'",argv[i+1]); + status=MagickFalse; + break; + } + q=p; + if (index == 0) + PrependImageToList(images,q); + else + if (index == (ssize_t) GetImageListLength(*images)) + AppendImageToList(images,q); + else + { + q=GetImageFromList(*images,index-1); + if (q == (Image *) NULL) + { + p=DestroyImage(p); + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"NoSuchImage","`%s'",argv[i+1]); + status=MagickFalse; + break; + } + InsertImageInList(&q,p); + } + *images=GetFirstImageInList(q); + break; + } + break; + } + case 'l': + { + if (LocaleCompare("layers",option+1) == 0) + { + Image + *layers; + + ImageLayerMethod + method; + + (void) SyncImagesSettings(mogrify_info,*images); + layers=(Image *) NULL; + method=(ImageLayerMethod) ParseCommandOption(MagickLayerOptions, + MagickFalse,argv[i+1]); + switch (method) + { + case CoalesceLayer: + { + layers=CoalesceImages(*images,exception); + break; + } + case CompareAnyLayer: + case CompareClearLayer: + case CompareOverlayLayer: + default: + { + layers=CompareImageLayers(*images,method,exception); + break; + } + case MergeLayer: + case FlattenLayer: + case MosaicLayer: + case TrimBoundsLayer: + { + layers=MergeImageLayers(*images,method,exception); + break; + } + case DisposeLayer: + { + layers=DisposeImages(*images,exception); + break; + } + case OptimizeImageLayer: + { + layers=OptimizeImageLayers(*images,exception); + break; + } + case OptimizePlusLayer: + { + layers=OptimizePlusImageLayers(*images,exception); + break; + } + case OptimizeTransLayer: + { + OptimizeImageTransparency(*images,exception); + break; + } + case RemoveDupsLayer: + { + RemoveDuplicateLayers(images,exception); + break; + } + case RemoveZeroLayer: + { + RemoveZeroDelayLayers(images,exception); + break; + } + case OptimizeLayer: + { + /* + General Purpose, GIF Animation Optimizer. + */ + layers=CoalesceImages(*images,exception); + if (layers == (Image *) NULL) + { + status=MagickFalse; + break; + } + InheritException(exception,&layers->exception); + *images=DestroyImageList(*images); + *images=layers; + layers=OptimizeImageLayers(*images,exception); + if (layers == (Image *) NULL) + { + status=MagickFalse; + break; + } + InheritException(exception,&layers->exception); + *images=DestroyImageList(*images); + *images=layers; + layers=(Image *) NULL; + OptimizeImageTransparency(*images,exception); + InheritException(exception,&(*images)->exception); + (void) RemapImages(quantize_info,*images,(Image *) NULL); + break; + } + case CompositeLayer: + { + CompositeOperator + compose; + + Image + *source; + + RectangleInfo + geometry; + + /* + Split image sequence at the first 'NULL:' image. + */ + source=(*images); + while (source != (Image *) NULL) + { + source=GetNextImageInList(source); + if ((source != (Image *) NULL) && + (LocaleCompare(source->magick,"NULL") == 0)) + break; + } + if (source != (Image *) NULL) + { + if ((GetPreviousImageInList(source) == (Image *) NULL) || + (GetNextImageInList(source) == (Image *) NULL)) + source=(Image *) NULL; + else + { + /* + Separate the two lists, junk the null: image. + */ + source=SplitImageList(source->previous); + DeleteImageFromList(&source); + } + } + if (source == (Image *) NULL) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"MissingNullSeparator","layers Composite"); + status=MagickFalse; + break; + } + /* + Adjust offset with gravity and virtual canvas. + */ + SetGeometry(*images,&geometry); + (void) ParseAbsoluteGeometry((*images)->geometry,&geometry); + geometry.width=source->page.width != 0 ? + source->page.width : source->columns; + geometry.height=source->page.height != 0 ? + source->page.height : source->rows; + GravityAdjustGeometry((*images)->page.width != 0 ? + (*images)->page.width : (*images)->columns, + (*images)->page.height != 0 ? (*images)->page.height : + (*images)->rows,(*images)->gravity,&geometry); + compose=OverCompositeOp; + option=GetImageOption(mogrify_info,"compose"); + if (option != (const char *) NULL) + compose=(CompositeOperator) ParseCommandOption( + MagickComposeOptions,MagickFalse,option); + CompositeLayers(*images,compose,source,geometry.x,geometry.y, + exception); + source=DestroyImageList(source); + break; + } + } + if (layers == (Image *) NULL) + break; + InheritException(exception,&layers->exception); + *images=DestroyImageList(*images); + *images=layers; + break; + } + break; + } + case 'm': + { + if (LocaleCompare("map",option+1) == 0) + { + (void) SyncImagesSettings(mogrify_info,*images); + if (*option == '+') + { + (void) RemapImages(quantize_info,*images,(Image *) NULL); + InheritException(exception,&(*images)->exception); + break; + } + i++; + break; + } + if (LocaleCompare("maximum",option+1) == 0) + { + Image + *maximum_image; + + /* + Maximum image sequence (deprecated). + */ + (void) SyncImagesSettings(mogrify_info,*images); + maximum_image=EvaluateImages(*images,MaxEvaluateOperator,exception); + if (maximum_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=maximum_image; + break; + } + if (LocaleCompare("minimum",option+1) == 0) + { + Image + *minimum_image; + + /* + Minimum image sequence (deprecated). + */ + (void) SyncImagesSettings(mogrify_info,*images); + minimum_image=EvaluateImages(*images,MinEvaluateOperator,exception); + if (minimum_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=minimum_image; + break; + } + if (LocaleCompare("morph",option+1) == 0) + { + Image + *morph_image; + + (void) SyncImagesSettings(mogrify_info,*images); + morph_image=MorphImages(*images,StringToUnsignedLong(argv[i+1]), + exception); + if (morph_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=morph_image; + break; + } + if (LocaleCompare("mosaic",option+1) == 0) + { + Image + *mosaic_image; + + (void) SyncImagesSettings(mogrify_info,*images); + mosaic_image=MergeImageLayers(*images,MosaicLayer,exception); + if (mosaic_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=mosaic_image; + break; + } + break; + } + case 'p': + { + if (LocaleCompare("poly",option+1) == 0) + { + char + *args, + token[MaxTextExtent]; + + const char + *p; + + double + *arguments; + + Image + *polynomial_image; + + ssize_t + x; + + size_t + number_arguments; + + /* + Polynomial image. + */ + (void) SyncImageSettings(mogrify_info,*images); + args=InterpretImageProperties(mogrify_info,*images,argv[i+1]); + InheritException(exception,&(*images)->exception); + if (args == (char *) NULL) + break; + p=(char *) args; + for (x=0; *p != '\0'; x++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + } + number_arguments=(size_t) x; + arguments=(double *) AcquireQuantumMemory(number_arguments, + sizeof(*arguments)); + if (arguments == (double *) NULL) + ThrowWandFatalException(ResourceLimitFatalError, + "MemoryAllocationFailed",(*images)->filename); + (void) memset(arguments,0,number_arguments* + sizeof(*arguments)); + p=(char *) args; + for (x=0; (x < (ssize_t) number_arguments) && (*p != '\0'); x++) + { + (void) GetNextToken(p,&p,MaxTextExtent,token); + if (*token == ',') + (void) GetNextToken(p,&p,MaxTextExtent,token); + arguments[x]=StringToDouble(token,(char **) NULL); + } + args=DestroyString(args); + polynomial_image=PolynomialImageChannel(*images,channel, + number_arguments >> 1,arguments,exception); + arguments=(double *) RelinquishMagickMemory(arguments); + if (polynomial_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=polynomial_image; + break; + } + if (LocaleCompare("print",option+1) == 0) + { + char + *string; + + (void) SyncImagesSettings(mogrify_info,*images); + string=InterpretImageProperties(mogrify_info,*images,argv[i+1]); + if (string == (char *) NULL) + break; + InheritException(exception,&(*images)->exception); + (void) FormatLocaleFile(stdout,"%s",string); + string=DestroyString(string); + } + if (LocaleCompare("process",option+1) == 0) + { + char + **arguments; + + int + j, + number_arguments; + + (void) SyncImagesSettings(mogrify_info,*images); + arguments=StringToArgv(argv[i+1],&number_arguments); + if (arguments == (char **) NULL) + break; + if ((argc > 1) && (strchr(arguments[1],'=') != (char *) NULL)) + { + char + breaker, + quote, + *token; + + const char + *arguments; + + int + next, + status; + + size_t + length; + + TokenInfo + *token_info; + + /* + Support old style syntax, filter="-option arg". + */ + length=strlen(argv[i+1]); + token=(char *) NULL; + if (~length >= (MaxTextExtent-1)) + token=(char *) AcquireQuantumMemory(length+MaxTextExtent, + sizeof(*token)); + if (token == (char *) NULL) + break; + next=0; + arguments=argv[i+1]; + token_info=AcquireTokenInfo(); + status=Tokenizer(token_info,0,token,length,arguments,"","=", + "\"",'\0',&breaker,&next,"e); + token_info=DestroyTokenInfo(token_info); + if (status == 0) + { + const char + *argv; + + argv=(&(arguments[next])); + (void) InvokeDynamicImageFilter(token,&(*images),1,&argv, + exception); + } + token=DestroyString(token); + break; + } + (void) SubstituteString(&arguments[1],"-",""); + (void) InvokeDynamicImageFilter(arguments[1],&(*images), + number_arguments-2,(const char **) arguments+2,exception); + for (j=0; j < number_arguments; j++) + arguments[j]=DestroyString(arguments[j]); + arguments=(char **) RelinquishMagickMemory(arguments); + break; + } + break; + } + case 'r': + { + if (LocaleCompare("reverse",option+1) == 0) + { + ReverseImageList(images); + InheritException(exception,&(*images)->exception); + break; + } + break; + } + case 's': + { + if (LocaleCompare("smush",option+1) == 0) + { + Image + *smush_image; + + ssize_t + offset; + + (void) SyncImagesSettings(mogrify_info,*images); + offset=(ssize_t) StringToLong(argv[i+1]); + smush_image=SmushImages(*images,*option == '-' ? MagickTrue : + MagickFalse,offset,exception); + if (smush_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + *images=DestroyImageList(*images); + *images=smush_image; + break; + } + if (LocaleCompare("swap",option+1) == 0) + { + Image + *p, + *q, + *u, + *v; + + ssize_t + swap_index; + + index=(-1); + swap_index=(-2); + if (*option != '+') + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + swap_index=(-1); + flags=ParseGeometry(argv[i+1],&geometry_info); + index=(ssize_t) geometry_info.rho; + if ((flags & SigmaValue) != 0) + swap_index=(ssize_t) geometry_info.sigma; + } + p=GetImageFromList(*images,index); + q=GetImageFromList(*images,swap_index); + if ((p == (Image *) NULL) || (q == (Image *) NULL)) + { + (void) ThrowMagickException(exception,GetMagickModule(), + OptionError,"NoSuchImage","`%s'",(*images)->filename); + status=MagickFalse; + break; + } + if (p == q) + break; + u=CloneImage(p,0,0,MagickTrue,exception); + if (u == (Image *) NULL) + break; + v=CloneImage(q,0,0,MagickTrue,exception); + if (v == (Image *) NULL) + { + u=DestroyImage(u); + break; + } + ReplaceImageInList(&p,v); + ReplaceImageInList(&q,u); + *images=GetFirstImageInList(q); + break; + } + break; + } + case 'w': + { + if (LocaleCompare("write",option+1) == 0) + { + char + key[MaxTextExtent]; + + Image + *write_images; + + ImageInfo + *write_info; + + (void) SyncImagesSettings(mogrify_info,*images); + (void) FormatLocaleString(key,MaxTextExtent,"cache:%s",argv[i+1]); + (void) DeleteImageRegistry(key); + write_images=CloneImageList(*images,exception); + write_info=CloneImageInfo(mogrify_info); + status&=WriteImages(write_info,write_images,argv[i+1],exception); + write_info=DestroyImageInfo(write_info); + write_images=DestroyImageList(write_images); + break; + } + break; + } + default: + break; + } + i+=count; + } + quantize_info=DestroyQuantizeInfo(quantize_info); + mogrify_info=DestroyImageInfo(mogrify_info); + status&=MogrifyImageInfo(image_info,argc,argv,exception); + return(status != 0 ? MagickTrue : MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M o g r i f y I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MogrifyImages() applies image processing options to a sequence of images as +% prescribed by command line options. +% +% The format of the MogrifyImage method is: +% +% MagickBooleanType MogrifyImages(ImageInfo *image_info, +% const MagickBooleanType post,const int argc,const char **argv, +% Image **images,Exceptioninfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info.. +% +% o post: If true, post process image list operators otherwise pre-process. +% +% o argc: Specifies a pointer to an integer describing the number of +% elements in the argument vector. +% +% o argv: Specifies a pointer to a text array containing the command line +% arguments. +% +% o images: pointer to a pointer of the first image in image list. +% +% o exception: return any errors or warnings in this structure. +% +*/ +WandExport MagickBooleanType MogrifyImages(ImageInfo *image_info, + const MagickBooleanType post,const int argc,const char **argv, + Image **images,ExceptionInfo *exception) +{ +#define MogrifyImageTag "Mogrify/Image" + + MagickStatusType + status; + + MagickBooleanType + proceed; + + size_t + n; + + ssize_t + i; + + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (images == (Image **) NULL) + return(MogrifyImage(image_info,argc,argv,images,exception)); + assert((*images)->previous == (Image *) NULL); + assert((*images)->signature == MagickCoreSignature); + if ((*images)->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + (*images)->filename); + if ((argc <= 0) || (*argv == (char *) NULL)) + return(MagickTrue); + (void) SetImageInfoProgressMonitor(image_info,(MagickProgressMonitor) NULL, + (void *) NULL); + status=MagickTrue; +#if 0 + (void) FormatLocaleFile(stderr, "mogrify start %s %d (%s)\n",argv[0],argc, + post?"post":"pre"); +#endif + /* + Pre-process multi-image sequence operators + */ + if (post == MagickFalse) + status&=MogrifyImageList(image_info,argc,argv,images,exception); + /* + For each image, process simple single image operators + */ + i=0; + n=GetImageListLength(*images); + for (;;) + { +#if 0 + (void) FormatLocaleFile(stderr,"mogrify %ld of %ld\n",(long) + GetImageIndexInList(*images),(long)GetImageListLength(*images)); +#endif + status&=MogrifyImage(image_info,argc,argv,images,exception); + proceed=SetImageProgress(*images,MogrifyImageTag,(MagickOffsetType) i, n); + if (proceed == MagickFalse) + break; + if ((*images)->next == (Image *) NULL) + break; + *images=(*images)->next; + i++; + } + assert(*images != (Image *) NULL); +#if 0 + (void) FormatLocaleFile(stderr,"mogrify end %ld of %ld\n",(long) + GetImageIndexInList(*images),(long)GetImageListLength(*images)); +#endif + /* + Post-process, multi-image sequence operators + */ + *images=GetFirstImageInList(*images); + if (post != MagickFalse) + status&=MogrifyImageList(image_info,argc,argv,images,exception); + return(status != 0 ? MagickTrue : MagickFalse); +} diff --git a/ImageMagick-6.9.12-44/wand/mogrify.h b/ImageMagick-6.9.12-44/wand/mogrify.h new file mode 100644 index 0000000..590bd78 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/mogrify.h @@ -0,0 +1,43 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand mogrify command-line method. +*/ +#ifndef MAGICKWAND_MOGRIFY_H +#define MAGICKWAND_MOGRIFY_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef MagickBooleanType + (*MagickCommand)(ImageInfo *,int,char **,char **,ExceptionInfo *); + +extern WandExport MagickBooleanType + MagickCommandGenesis(ImageInfo *,MagickCommand,int,char **,char **, + ExceptionInfo *), + MogrifyImage(ImageInfo *,const int,const char **,Image **,ExceptionInfo *), + MogrifyImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *), + MogrifyImageInfo(ImageInfo *,const int,const char **,ExceptionInfo *), + MogrifyImageList(ImageInfo *,const int,const char **,Image **, + ExceptionInfo *), + MogrifyImages(ImageInfo *,const MagickBooleanType,const int,const char **, + Image **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/montage.c b/ImageMagick-6.9.12-44/wand/montage.c new file mode 100644 index 0000000..63ab3fb --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/montage.c @@ -0,0 +1,1841 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M OOO N N TTTTT AAA GGGG EEEEE % +% MM MM O O NN N T A A G E % +% M M M O O N N N T AAAAA G GG EEE % +% M M O O N NN T A A G G E % +% M M OOO N N T A A GGG EEEEE % +% % +% % +% MagickWand Methods to Create Image Thumbnails % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Use the montage program to create a composite image by combining several +% separate images. The images are tiled on the composite image optionally +% adorned with a border, frame, image name, and more. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/mogrify-private.h" +#include "magick/string-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ M o n t a g e I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MontageImageCommand() reads one or more images, applies one or more image +% processing operations, and writes out the image in the same or +% differing format. +% +% The format of the MontageImageCommand method is: +% +% MagickBooleanType MontageImageCommand(ImageInfo *image_info,int argc, +% char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType MontageUsage(void) +{ + static const char + miscellaneous[] = + " -debug events display copious debugging information\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information\n" + " -version print version information", + operators[] = + " -adaptive-sharpen geometry\n" + " adaptively sharpen pixels; increase effect near edges\n" + " -annotate geometry text\n" + " annotate the image with text\n" + " -auto-orient automagically orient image\n" + " -blur geometry reduce image noise and reduce detail levels\n" + " -border geometry surround image with a border of color\n" + " -crop geometry preferred size and location of the cropped image\n" + " -extent geometry set the image size\n" + " -flatten flatten a sequence of images\n" + " -flip flip image in the vertical direction\n" + " -flop flop image in the horizontal direction\n" + " -frame geometry surround image with an ornamental border\n" + " -layers method optimize, merge, or compare image layers\n" + " -monochrome transform image to black and white\n" + " -polaroid angle simulate a Polaroid picture\n" + " -resize geometry resize the image\n" + " -rotate degrees apply Paeth rotation to the image\n" + " -scale geometry scale the image\n" + " -strip strip image of all profiles and comments\n" + " -transform affine transform image\n" + " -transpose flip image vertically and rotate 90 degrees\n" + " -transparent color make this color transparent within the image\n" + " -type type image type\n" + " -unsharp geometry sharpen the image", + settings[] = + " -adjoin join images into a single multi-image file\n" + " -affine matrix affine transform matrix\n" + " -alpha option on, activate, off, deactivate, set, opaque, copy\n" + " transparent, extract, background, or shape\n" + " -authenticate password\n" + " decipher image with this password\n" + " -blue-primary point chromaticity blue primary point\n" + " -bordercolor color border color\n" + " -caption string assign a caption to an image\n" + " -channel type apply option to select image channels\n" + " -colors value preferred number of colors in the image\n" + " -colorspace type alternate image colorsapce\n" + " -comment string annotate image with comment\n" + " -compose operator composite operator\n" + " -compress type type of pixel compression when writing the image\n" + " -define format:option\n" + " define one or more image format options\n" + " -delay value display the next image after pausing\n" + " -density geometry horizontal and vertical density of the image\n" + " -depth value image depth\n" + " -display server query font from this X server\n" + " -dispose method layer disposal method\n" + " -dither method apply error diffusion to image\n" + " -draw string annotate the image with a graphic primitive\n" + " -encoding type text encoding type\n" + " -endian type endianness (MSB or LSB) of the image\n" + " -extract geometry extract area from image\n" + " -fill color color to use when filling a graphic primitive\n" + " -filter type use this filter when resizing an image\n" + " -font name render text with this font\n" + " -format \"string\" output formatted image characteristics\n" + " -gamma value level of gamma correction\n" + " -geometry geometry preferred tile and border sizes\n" + " -gravity direction which direction to gravitate towards\n" + " -green-primary point chromaticity green primary point\n" + " -identify identify the format and characteristics of the image\n" + " -interlace type type of image interlacing scheme\n" + " -interpolate method pixel color interpolation method\n" + " -kerning value set the space between two letters\n" + " -label string assign a label to an image\n" + " -limit type value pixel cache resource limit\n" + " -matte store matte channel if the image has one\n" + " -mattecolor color frame color\n" + " -mode type framing style\n" + " -monitor monitor progress\n" + " -origin geometry image origin\n" + " -page geometry size and location of an image canvas (setting)\n" + " -pointsize value font point size\n" + " -profile filename add, delete, or apply an image profile\n" + " -quality value JPEG/MIFF/PNG compression level\n" + " -quantize colorspace reduce colors in this colorspace\n" + " -quiet suppress all warning messages\n" + " -red-primary point chromaticity red primary point\n" + " -regard-warnings pay attention to warning messages\n" + " -repage geometry size and location of an image canvas (operator)\n" + " -respect-parentheses settings remain in effect until parenthesis boundary\n" + " -sampling-factor geometry\n" + " horizontal and vertical sampling factor\n" + " -scenes range image scene range\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -set attribute value set an image attribute\n" + " -shadow add a shadow beneath a tile to simulate depth\n" + " -size geometry width and height of image\n" + " -stroke color color to use when stroking a graphic primitive\n" + " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n" + " -synchronize synchronize image to storage device\n" + " -taint declare the image as modified\n" + " -texture filename name of texture to tile onto the image background\n" + " -thumbnail geometry create a thumbnail of the image\n" + " -tile geometry number of tiles per row and column\n" + " -title string decorate the montage image with a title\n" + " -transparent-color color\n" + " transparent color\n" + " -treedepth value color tree depth\n" + " -trim trim image edges\n" + " -units type the units of image resolution\n" + " -verbose print detailed information about the image\n" + " -virtual-pixel method\n" + " virtual pixel access method\n" + " -white-point point chromaticity white point", + sequence_operators[] = + " -coalesce merge a sequence of images\n" + " -composite composite image", + stack_operators[] = + " -clone indexes clone an image\n" + " -delete indexes delete the image from the image sequence\n" + " -duplicate count,indexes\n" + " duplicate an image one or more times\n" + " -insert index insert last image into the image sequence\n" + " -reverse reverse image sequence\n" + " -swap indexes swap two images in the image sequence"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] file [ [options ...] file ...] file\n", + GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nImage Operators:\n"); + (void) puts(operators); + (void) printf("\nImage Sequence Operators:\n"); + (void) puts(sequence_operators); + (void) printf("\nImage Stack Operators:\n"); + (void) puts(stack_operators); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf( + "\nIn addition to those listed above, you can specify these standard X\n"); + (void) printf( + "resources as command line options: -background, -bordercolor,\n"); + (void) printf( + "-borderwidth, -font, -mattecolor, or -title\n"); + (void) printf( + "\nBy default, the image format of `file' is determined by its magic\n"); + (void) printf( + "number. To specify a particular image format, precede the filename\n"); + (void) printf( + "with an image format name and a colon (i.e. ps:image) or specify the\n"); + (void) printf( + "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); + (void) printf("'-' for standard input or output.\n"); + return(MagickTrue); +} + +WandExport MagickBooleanType MontageImageCommand(ImageInfo *image_info, + int argc,char **argv,char **metadata,ExceptionInfo *exception) +{ +#define DestroyMontage() \ +{ \ + if (montage_info != (MontageInfo *) NULL) \ + montage_info=DestroyMontageInfo(montage_info); \ + if (montage_info != (MontageInfo *) NULL) \ + montage_info=DestroyMontageInfo(montage_info); \ + if (montage_image != (Image *) NULL) \ + montage_image=DestroyImageList(montage_image); \ + DestroyImageStack(); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowMontageException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option); \ + DestroyMontage(); \ + return(MagickFalse); \ +} +#define ThrowMontageInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",option,argument); \ + DestroyMontage(); \ + return(MagickFalse); \ +} + + char + *option, + *transparent_color; + + const char + *format; + + Image + *image, + *montage_image; + + ImageStack + image_stack[MaxImageStackDepth+1]; + + long + first_scene, + last_scene; + + MagickBooleanType + fire, + pend, + respect_parenthesis; + + MagickStatusType + status; + + MontageInfo + *montage_info; + + ssize_t + i; + + ssize_t + j, + k, + scene; + + /* + Set defaults. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + if (argc == 2) + { + option=argv[1]; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + } + if (argc < 3) + return(MontageUsage()); + format="%w,%h,%m"; + first_scene=0; + j=1; + k=0; + last_scene=0; + montage_image=NewImageList(); + montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL); + NewImageStack(); + option=(char *) NULL; + pend=MagickFalse; + respect_parenthesis=MagickFalse; + scene=0; + status=MagickFalse; + transparent_color=(char *) NULL; + /* + Parse command line. + */ + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowMontageException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + for (i=1; i < (ssize_t) (argc-1); i++) + { + option=argv[i]; + if (LocaleCompare(option,"(") == 0) + { + FireImageStack(MagickTrue,MagickTrue,pend); + if (k == MaxImageStackDepth) + ThrowMontageException(OptionError,"ParenthesisNestedTooDeeply", + option); + PushImageStack(); + continue; + } + if (LocaleCompare(option,")") == 0) + { + FireImageStack(MagickTrue,MagickTrue,MagickTrue); + if (k == 0) + ThrowMontageException(OptionError,"UnableToParseExpression",option); + PopImageStack(); + continue; + } + if (IsCommandOption(option) == MagickFalse) + { + Image + *images; + + FireImageStack(MagickFalse,MagickFalse,pend); + for (scene=(ssize_t) first_scene; scene <= (ssize_t) last_scene ; scene++) + { + char + *filename; + + /* + Option is a file name: begin by reading image from specified file. + */ + filename=argv[i]; + if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1))) + filename=argv[++i]; + (void) SetImageOption(image_info,"filename",filename); + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + if (first_scene != last_scene) + { + char + filename[MaxTextExtent]; + + /* + Form filename for multi-part images. + */ + (void) InterpretImageFilename(image_info,(Image *) NULL, + image_info->filename,(int) scene,filename); + if (LocaleCompare(filename,image_info->filename) == 0) + (void) FormatLocaleString(filename,MaxTextExtent,"%s.%.20g", + image_info->filename,(double) scene); + (void) CopyMagickString(image_info->filename,filename, + MaxTextExtent); + } + (void) CloneString(&image_info->font,montage_info->font); + images=ReadImages(image_info,exception); + status&=(images != (Image *) NULL) && + (exception->severity < ErrorException); + if (images == (Image *) NULL) + continue; + AppendImageStack(images); + } + continue; + } + pend=image != (Image *) NULL ? MagickTrue : MagickFalse; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("adaptive-sharpen",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("adjoin",option+1) == 0) + break; + if (LocaleCompare("affine",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("alpha",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowMontageException(OptionError,"UnrecognizedAlphaChannelType", + argv[i]); + break; + } + if (LocaleCompare("annotate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + i++; + break; + } + if (LocaleCompare("auto-orient",option+1) == 0) + break; + if (LocaleCompare("authenticate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'b': + { + if (LocaleCompare("background",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + (void) QueryColorDatabase(argv[i], + &montage_info->background_color,exception); + break; + } + if (LocaleCompare("blue-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("blur",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("border",option+1) == 0) + { + if (k == 0) + { + (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); + montage_info->border_width=0; + } + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + if (k == 0) + montage_info->border_width=StringToUnsignedLong(argv[i]); + break; + } + if (LocaleCompare("bordercolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + (void) QueryColorDatabase(argv[i],&montage_info->border_color, + exception); + break; + } + if (LocaleCompare("borderwidth",option+1) == 0) + { + montage_info->border_width=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + montage_info->border_width=StringToUnsignedLong(argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("caption",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + ssize_t + channel; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + channel=ParseChannelOption(argv[i]); + if (channel < 0) + ThrowMontageException(OptionError,"UnrecognizedChannelType", + argv[i]); + break; + } + if (LocaleCompare("clone",option+1) == 0) + { + Image + *clone_images, + *clone_list; + + if (k == 0) + clone_list=CloneImageList(image,exception); + else + clone_list=CloneImageList(image_stack[k-1].image,exception); + if (clone_list == (Image *) NULL) + ThrowMontageException(ImageError,"ImageSequenceRequired",option); + FireImageStack(MagickTrue,MagickTrue,MagickTrue); + if (*option == '+') + clone_images=CloneImages(clone_list,"-1",exception); + else + { + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + clone_images=CloneImages(clone_list,argv[i],exception); + } + if (clone_images == (Image *) NULL) + ThrowMontageException(OptionError,"NoSuchImage",option); + AppendImageStack(clone_images); + clone_list=DestroyImageList(clone_list); + break; + } + if (LocaleCompare("coalesce",option+1) == 0) + break; + if (LocaleCompare("colors",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowMontageException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("comment",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("compose",option+1) == 0) + { + ssize_t + compose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + compose=ParseCommandOption(MagickComposeOptions,MagickFalse,argv[i]); + if (compose < 0) + ThrowMontageException(OptionError,"UnrecognizedComposeOperator", + argv[i]); + break; + } + if (LocaleCompare("composite",option+1) == 0) + break; + if (LocaleCompare("compress",option+1) == 0) + { + ssize_t + compress; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + compress=ParseCommandOption(MagickCompressOptions,MagickFalse, + argv[i]); + if (compress < 0) + ThrowMontageException(OptionError,"UnrecognizedCompressType", + argv[i]); + break; + } + if (LocaleCompare("concurrent",option+1) == 0) + break; + if (LocaleCompare("crop",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'd': + { + if (LocaleCompare("debug",option+1) == 0) + { + ssize_t + event; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); + if (event < 0) + ThrowMontageException(OptionError,"UnrecognizedEventType", + argv[i]); + (void) SetLogEventMask(argv[i]); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (*option == '+') + { + const char + *define; + + define=GetImageOption(image_info,argv[i]); + if (define == (const char *) NULL) + ThrowMontageException(OptionError,"NoSuchOption",argv[i]); + break; + } + break; + } + if (LocaleCompare("delete",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("delay",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("density",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("display",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("dispose",option+1) == 0) + { + ssize_t + dispose; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]); + if (dispose < 0) + ThrowMontageException(OptionError,"UnrecognizedDisposeMethod", + argv[i]); + break; + } + if (LocaleCompare("dither",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]); + if (method < 0) + ThrowMontageException(OptionError,"UnrecognizedDitherMethod", + argv[i]); + break; + } + if (LocaleCompare("draw",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("duplicate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'e': + { + if (LocaleCompare("encoding",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("endian",option+1) == 0) + { + ssize_t + endian; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + endian=ParseCommandOption(MagickEndianOptions,MagickFalse, + argv[i]); + if (endian < 0) + ThrowMontageException(OptionError,"UnrecognizedEndianType", + argv[i]); + break; + } + if (LocaleCompare("extent",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'f': + { + if (LocaleCompare("fill",option+1) == 0) + { + (void) QueryColorDatabase("none",&montage_info->fill,exception); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + (void) QueryColorDatabase(argv[i],&montage_info->fill, + exception); + break; + } + if (LocaleCompare("filter",option+1) == 0) + { + ssize_t + filter; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]); + if (filter < 0) + ThrowMontageException(OptionError,"UnrecognizedImageFilter", + argv[i]); + break; + } + if (LocaleCompare("flatten",option+1) == 0) + break; + if (LocaleCompare("flip",option+1) == 0) + break; + if (LocaleCompare("flop",option+1) == 0) + break; + if (LocaleCompare("font",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + (void) CloneString(&montage_info->font,argv[i]); + break; + } + if (LocaleCompare("format",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + format=argv[i]; + break; + } + if (LocaleCompare("frame",option+1) == 0) + { + if (k == 0) + { + (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); + (void) CloneString(&montage_info->frame,(char *) NULL); + } + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + if (k == 0) + (void) CloneString(&montage_info->frame,argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'g': + { + if (LocaleCompare("gamma",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("geometry",option+1) == 0) + { + (void) CloneString(&montage_info->geometry,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + (void) CloneString(&montage_info->geometry,argv[i]); + break; + } + if (LocaleCompare("gravity",option+1) == 0) + { + ssize_t + gravity; + + montage_info->gravity=UndefinedGravity; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + gravity=ParseCommandOption(MagickGravityOptions,MagickFalse, + argv[i]); + if (gravity < 0) + ThrowMontageException(OptionError,"UnrecognizedGravityType", + argv[i]); + montage_info->gravity=(GravityType) gravity; + break; + } + if (LocaleCompare("green-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'h': + { + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + DestroyMontage(); + return(MontageUsage()); + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'i': + { + if (LocaleCompare("identify",option+1) == 0) + break; + if (LocaleCompare("insert",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("interlace",option+1) == 0) + { + ssize_t + interlace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, + argv[i]); + if (interlace < 0) + ThrowMontageException(OptionError,"UnrecognizedInterlaceType", + argv[i]); + break; + } + if (LocaleCompare("interpolate",option+1) == 0) + { + ssize_t + interpolate; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, + argv[i]); + if (interpolate < 0) + ThrowMontageException(OptionError,"UnrecognizedInterpolateMethod", + argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'k': + { + if (LocaleCompare("kerning",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'l': + { + if (LocaleCompare("label",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("layers",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickLayerOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowMontageException(OptionError,"UnrecognizedLayerMethod", + argv[i]); + break; + } + if (LocaleCompare("limit",option+1) == 0) + { + char + *p; + + double + value; + + ssize_t + resource; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + resource=ParseCommandOption(MagickResourceOptions,MagickFalse, + argv[i]); + if (resource < 0) + ThrowMontageException(OptionError,"UnrecognizedResourceType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + value=StringToDouble(argv[i],&p); + (void) value; + if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); + if (list < 0) + ThrowMontageException(OptionError,"UnrecognizedListType",argv[i]); + status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) + argv+j,exception); + DestroyMontage(); + return(status == 0 ? MagickFalse : MagickTrue); + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || + (strchr(argv[i],'%') == (char *) NULL)) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'm': + { + if (LocaleCompare("matte",option+1) == 0) + break; + if (LocaleCompare("mattecolor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + (void) QueryColorDatabase(argv[i],&montage_info->matte_color, + exception); + break; + } + if (LocaleCompare("mode",option+1) == 0) + { + MontageMode + mode; + + (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + mode=UndefinedMode; + if (LocaleCompare("frame",argv[i]) == 0) + { + mode=FrameMode; + (void) CloneString(&montage_info->frame,"15x15+3+3"); + montage_info->shadow=MagickTrue; + break; + } + if (LocaleCompare("unframe",argv[i]) == 0) + { + mode=UnframeMode; + montage_info->frame=(char *) NULL; + montage_info->shadow=MagickFalse; + montage_info->border_width=0; + break; + } + if (LocaleCompare("concatenate",argv[i]) == 0) + { + mode=ConcatenateMode; + montage_info->frame=(char *) NULL; + montage_info->shadow=MagickFalse; + montage_info->gravity=(GravityType) NorthWestGravity; + (void) CloneString(&montage_info->geometry,"+0+0"); + montage_info->border_width=0; + break; + } + if (mode == UndefinedMode) + ThrowMontageException(OptionError,"UnrecognizedImageMode", + argv[i]); + break; + } + if (LocaleCompare("monitor",option+1) == 0) + break; + if (LocaleCompare("monochrome",option+1) == 0) + break; + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'n': + { + if (LocaleCompare("noop",option+1) == 0) + break; + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'o': + { + if (LocaleCompare("origin",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'p': + { + if (LocaleCompare("page",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("pointsize",option+1) == 0) + { + montage_info->pointsize=12; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + montage_info->pointsize=StringToDouble(argv[i],(char **) NULL); + break; + } + if (LocaleCompare("polaroid",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("profile",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'q': + { + if (LocaleCompare("quality",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("quantize",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowMontageException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("quiet",option+1) == 0) + break; + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'r': + { + if (LocaleCompare("red-primary",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleCompare("render",option+1) == 0) + break; + if (LocaleCompare("repage",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("resize",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleNCompare("respect-parentheses",option+1,17) == 0) + { + respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + if (LocaleCompare("reverse",option+1) == 0) + break; + if (LocaleCompare("rotate",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 's': + { + if (LocaleCompare("sampling-factor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("scale",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("scenes",option+1) == 0) + { + first_scene=0; + last_scene=0; + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + first_scene=(int) StringToLong(argv[i]); + last_scene=first_scene; + (void) sscanf(argv[i],"%ld-%ld",&first_scene,&last_scene); + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("set",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("shadow",option+1) == 0) + { + if (k == 0) + { + (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); + montage_info->shadow=(*option == '-') ? MagickTrue : + MagickFalse; + break; + } + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("sharpen",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || (IsGeometry(argv[i]) == MagickFalse)) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("size",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("stroke",option+1) == 0) + { + (void) QueryColorDatabase("none",&montage_info->stroke,exception); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + (void) QueryColorDatabase(argv[i],&montage_info->stroke, + exception); + break; + } + if (LocaleCompare("strip",option+1) == 0) + break; + if (LocaleCompare("strokewidth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("support",option+1) == 0) + { + i++; /* deprecated */ + break; + } + if (LocaleCompare("swap",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("synchronize",option+1) == 0) + break; + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 't': + { + if (LocaleCompare("taint",option+1) == 0) + break; + if (LocaleCompare("texture",option+1) == 0) + { + (void) CloneString(&montage_info->texture,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + (void) CloneString(&montage_info->texture,argv[i]); + break; + } + if (LocaleCompare("thumbnail",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("tile",option+1) == 0) + { + if (k == 0) + { + (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); + (void) CloneString(&montage_info->tile,(char *) NULL); + } + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + if (k == 0) + (void) CloneString(&montage_info->tile,argv[i]); + break; + } + if (LocaleCompare("tile-offset",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("tint",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("transform",option+1) == 0) + break; + if (LocaleCompare("transpose",option+1) == 0) + break; + if (LocaleCompare("title",option+1) == 0) + { + (void) CloneString(&montage_info->title,(char *) NULL); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + (void) CloneString(&montage_info->title,argv[i]); + break; + } + if (LocaleCompare("transform",option+1) == 0) + break; + if (LocaleCompare("transparent",option+1) == 0) + { + transparent_color=(char *) NULL; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + (void) CloneString(&transparent_color,argv[i]); + break; + } + if (LocaleCompare("transparent-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("treedepth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("trim",option+1) == 0) + break; + if (LocaleCompare("type",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowMontageException(OptionError,"UnrecognizedImageType", + argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'u': + { + if (LocaleCompare("units",option+1) == 0) + { + ssize_t + units; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + units=ParseCommandOption(MagickResolutionOptions,MagickFalse, + argv[i]); + if (units < 0) + ThrowMontageException(OptionError,"UnrecognizedUnitsType", + argv[i]); + break; + } + if (LocaleCompare("unsharp",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + { + break; + } + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + break; + } + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowMontageException(OptionError, + "UnrecognizedVirtualPixelMethod",argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case 'w': + { + if (LocaleCompare("white-point",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowMontageException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowMontageInvalidArgumentException(option,argv[i]); + break; + } + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + case '?': + break; + default: + ThrowMontageException(OptionError,"UnrecognizedOption",option) + } + fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & + FireOptionFlag) == 0 ? MagickFalse : MagickTrue; + if (fire != MagickFalse) + FireImageStack(MagickTrue,MagickTrue,MagickTrue); + } + if (k != 0) + ThrowMontageException(OptionError,"UnbalancedParenthesis",argv[i]); + if (i-- != (ssize_t) (argc-1)) + ThrowMontageException(OptionError,"MissingAnImageFilename",argv[i]); + if (image == (Image *) NULL) + ThrowMontageException(OptionError,"MissingAnImageFilename",argv[argc-1]); + FinalizeImageSettings(image_info,image,MagickTrue); + if (image == (Image *) NULL) + ThrowMontageException(OptionError,"MissingAnImageFilename",argv[argc-1]); + (void) CopyMagickString(montage_info->filename,argv[argc-1],MaxTextExtent); + montage_image=MontageImageList(image_info,montage_info,image,exception); + if (montage_image == (Image *) NULL) + status=MagickFalse; + else + { + /* + Write image. + */ + GetImageException(montage_image,exception); + (void) CopyMagickString(image_info->filename,argv[argc-1],MaxTextExtent); + (void) CopyMagickString(montage_image->magick_filename,argv[argc-1], + MaxTextExtent); + if (*montage_image->magick == '\0') + (void) CopyMagickString(montage_image->magick,image->magick, + MaxTextExtent); + status&=WriteImages(image_info,montage_image,argv[argc-1],exception); + if (metadata != (char **) NULL) + { + char + *text; + + text=InterpretImageProperties(image_info,montage_image,format); + InheritException(exception,&montage_image->exception); + if (text == (char *) NULL) + ThrowMontageException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + (void) ConcatenateString(&(*metadata),text); + text=DestroyString(text); + } + } + DestroyMontage(); + return(status != 0 ? MagickTrue : MagickFalse); +} diff --git a/ImageMagick-6.9.12-44/wand/montage.h b/ImageMagick-6.9.12-44/wand/montage.h new file mode 100644 index 0000000..9891900 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/montage.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand montage command-line method. +*/ +#ifndef MAGICKWAND_MONTAGE_H +#define MAGICKWAND_MONTAGE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport MagickBooleanType + MontageImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/pixel-iterator.c b/ImageMagick-6.9.12-44/wand/pixel-iterator.c new file mode 100644 index 0000000..137df5e --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/pixel-iterator.c @@ -0,0 +1,996 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP IIIII X X EEEEE L % +% P P I X X E L % +% PPPP I X EEE L % +% P I X X E L % +% P IIIII X X EEEEE LLLLL % +% % +% IIIII TTTTT EEEEE RRRR AAA TTTTT OOO RRRR % +% I T E R R A A T O O R R % +% I T EEE RRRR AAAAA T O O RRRR % +% I T E R R A A T O O R R % +% IIIII T EEEEE R R A A T OOO R R % +% % +% % +% ImageMagick Image Pixel Iterator Methods % +% % +% Software Design % +% Cristy % +% March 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/magick-wand-private.h" +#include "wand/pixel-iterator.h" +#include "wand/pixel-wand.h" +#include "wand/wand.h" + +/* + Define declarations. +*/ +#define PixelIteratorId "PixelIterator" + +/* + Typedef declarations. +*/ +struct _PixelIterator +{ + size_t + id; + + char + name[MaxTextExtent]; + + ExceptionInfo + *exception; + + CacheView + *view; + + RectangleInfo + region; + + MagickBooleanType + active; + + ssize_t + y; + + PixelWand + **pixel_wands; + + MagickBooleanType + debug; + + size_t + signature; +}; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l e a r P i x e l I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClearPixelIterator() clear resources associated with a PixelIterator. +% +% The format of the ClearPixelIterator method is: +% +% void ClearPixelIterator(PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +*/ +WandExport void ClearPixelIterator(PixelIterator *iterator) +{ + assert(iterator != (const PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + iterator->pixel_wands=DestroyPixelWands(iterator->pixel_wands, + iterator->region.width); + ClearMagickException(iterator->exception); + iterator->pixel_wands=NewPixelWands(iterator->region.width); + iterator->active=MagickFalse; + iterator->y=0; + iterator->debug=IsEventLogging(); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e P i x e l I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClonePixelIterator() makes an exact copy of the specified iterator. +% +% The format of the ClonePixelIterator method is: +% +% PixelIterator *ClonePixelIterator(const PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the magick iterator. +% +*/ +WandExport PixelIterator *ClonePixelIterator(const PixelIterator *iterator) +{ + PixelIterator + *clone_iterator; + + assert(iterator != (PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + clone_iterator=(PixelIterator *) AcquireCriticalMemory( + sizeof(*clone_iterator)); + (void) memset(clone_iterator,0,sizeof(*clone_iterator)); + clone_iterator->id=AcquireWandId(); + (void) FormatLocaleString(clone_iterator->name,MaxTextExtent,"%s-%.20g", + PixelIteratorId,(double) clone_iterator->id); + clone_iterator->exception=AcquireExceptionInfo(); + InheritException(clone_iterator->exception,iterator->exception); + clone_iterator->view=CloneCacheView(iterator->view); + clone_iterator->region=iterator->region; + clone_iterator->active=iterator->active; + clone_iterator->y=iterator->y; + clone_iterator->pixel_wands=ClonePixelWands((const PixelWand **) + iterator->pixel_wands,iterator->region.width); + clone_iterator->debug=iterator->debug; + if (clone_iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s", + clone_iterator->name); + clone_iterator->signature=WandSignature; + return(clone_iterator); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y P i x e l I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyPixelIterator() deallocates resources associated with a PixelIterator. +% +% The format of the DestroyPixelIterator method is: +% +% PixelIterator *DestroyPixelIterator(PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +*/ +WandExport PixelIterator *DestroyPixelIterator(PixelIterator *iterator) +{ + assert(iterator != (const PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + iterator->view=DestroyCacheView(iterator->view); + iterator->pixel_wands=DestroyPixelWands(iterator->pixel_wands, + iterator->region.width); + iterator->exception=DestroyExceptionInfo(iterator->exception); + iterator->signature=(~WandSignature); + RelinquishWandId(iterator->id); + iterator=(PixelIterator *) RelinquishMagickMemory(iterator); + return(iterator); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P i x e l I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPixelIterator() returns MagickTrue if the iterator is verified as a pixel +% iterator. +% +% The format of the IsPixelIterator method is: +% +% MagickBooleanType IsPixelIterator(const PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the magick iterator. +% +*/ +WandExport MagickBooleanType IsPixelIterator(const PixelIterator *iterator) +{ + size_t + length; + + if (iterator == (const PixelIterator *) NULL) + return(MagickFalse); + if (iterator->signature != WandSignature) + return(MagickFalse); + length=strlen(PixelIteratorId); + if (LocaleNCompare(iterator->name,PixelIteratorId,length) != 0) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w P i x e l I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewPixelIterator() returns a new pixel iterator. +% +% The format of the NewPixelIterator method is: +% +% PixelIterator *NewPixelIterator(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport PixelIterator *NewPixelIterator(MagickWand *wand) +{ + const char + *quantum; + + ExceptionInfo + *exception; + + Image + *image; + + PixelIterator + *iterator; + + size_t + depth; + + CacheView + *view; + + depth=MAGICKCORE_QUANTUM_DEPTH; + quantum=GetMagickQuantumDepth(&depth); + if (depth != MAGICKCORE_QUANTUM_DEPTH) + ThrowWandFatalException(WandError,"QuantumDepthMismatch",quantum); + assert(wand != (MagickWand *) NULL); + image=GetImageFromMagickWand(wand); + if (image == (Image *) NULL) + return((PixelIterator *) NULL); + exception=AcquireExceptionInfo(); + view=AcquireVirtualCacheView(image,exception); + if (view == (CacheView *) NULL) + return((PixelIterator *) NULL); + iterator=(PixelIterator *) AcquireCriticalMemory(sizeof(*iterator)); + (void) memset(iterator,0,sizeof(*iterator)); + iterator->id=AcquireWandId(); + (void) FormatLocaleString(iterator->name,MaxTextExtent,"%s-%.20g", + PixelIteratorId,(double) iterator->id); + iterator->exception=exception; + iterator->view=view; + SetGeometry(image,&iterator->region); + iterator->region.width=image->columns; + iterator->region.height=image->rows; + iterator->region.x=0; + iterator->region.y=0; + iterator->pixel_wands=NewPixelWands(iterator->region.width); + iterator->y=0; + iterator->debug=IsEventLogging(); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + iterator->signature=WandSignature; + return(iterator); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l C l e a r I t e r a t o r E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelClearIteratorException() clear any exceptions associated with the +% iterator. +% +% The format of the PixelClearIteratorException method is: +% +% MagickBooleanType PixelClearIteratorException(PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +*/ +WandExport MagickBooleanType PixelClearIteratorException( + PixelIterator *iterator) +{ + assert(iterator != (PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + ClearMagickException(iterator->exception); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w P i x e l R e g i o n I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewPixelRegionIterator() returns a new pixel iterator. +% +% The format of the NewPixelRegionIterator method is: +% +% PixelIterator *NewPixelRegionIterator(MagickWand *wand,const ssize_t x, +% const ssize_t y,const size_t width,const size_t height) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x,y,columns,rows: These values define the perimeter of a region of +% pixels. +% +*/ +WandExport PixelIterator *NewPixelRegionIterator(MagickWand *wand, + const ssize_t x,const ssize_t y,const size_t width,const size_t height) +{ + CacheView + *view; + + const char + *quantum; + + ExceptionInfo + *exception; + + Image + *image; + + PixelIterator + *iterator; + + size_t + depth; + + assert(wand != (MagickWand *) NULL); + depth=MAGICKCORE_QUANTUM_DEPTH; + quantum=GetMagickQuantumDepth(&depth); + if (depth != MAGICKCORE_QUANTUM_DEPTH) + ThrowWandFatalException(WandError,"QuantumDepthMismatch",quantum); + if ((width == 0) || (height == 0)) + ThrowWandFatalException(WandError,"ZeroRegionSize",quantum); + image=GetImageFromMagickWand(wand); + if (image == (Image *) NULL) + return((PixelIterator *) NULL); + exception=AcquireExceptionInfo(); + view=AcquireVirtualCacheView(image,exception); + if (view == (CacheView *) NULL) + return((PixelIterator *) NULL); + iterator=(PixelIterator *) AcquireCriticalMemory(sizeof(*iterator)); + (void) memset(iterator,0,sizeof(*iterator)); + iterator->id=AcquireWandId(); + (void) FormatLocaleString(iterator->name,MaxTextExtent,"%s-%.20g", + PixelIteratorId,(double) iterator->id); + iterator->exception=exception; + iterator->view=view; + SetGeometry(image,&iterator->region); + iterator->region.width=width; + iterator->region.height=height; + iterator->region.x=x; + iterator->region.y=y; + iterator->pixel_wands=NewPixelWands(iterator->region.width); + iterator->y=0; + iterator->debug=IsEventLogging(); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + iterator->signature=WandSignature; + return(iterator); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t C u r r e n t I t e r a t o r R o w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetCurrentIteratorRow() returns the current row as an array of pixel +% wands from the pixel iterator. +% +% The format of the PixelGetCurrentIteratorRow method is: +% +% PixelWand **PixelGetCurrentIteratorRow(PixelIterator *iterator, +% size_t *number_wands) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +% o number_wands: the number of pixel wands. +% +*/ +WandExport PixelWand **PixelGetCurrentIteratorRow(PixelIterator *iterator, + size_t *number_wands) +{ + const IndexPacket + *indexes; + + const PixelPacket + *pixels; + + ssize_t + x; + + assert(iterator != (PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + *number_wands=0; + iterator->active=MagickTrue; + pixels=GetCacheViewVirtualPixels(iterator->view,iterator->region.x, + iterator->region.y+iterator->y,iterator->region.width,1, + iterator->exception); + if (pixels == (const PixelPacket *) NULL) + { + InheritException(iterator->exception,GetCacheViewException( + iterator->view)); + return((PixelWand **) NULL); + } + indexes=GetCacheViewVirtualIndexQueue(iterator->view); + for (x=0; x < (ssize_t) iterator->region.width; x++) + PixelSetQuantumColor(iterator->pixel_wands[x],pixels+x); + if (GetCacheViewColorspace(iterator->view) == CMYKColorspace) + for (x=0; x < (ssize_t) iterator->region.width; x++) + PixelSetBlackQuantum(iterator->pixel_wands[x], + GetPixelBlack(indexes+x)); + if (GetCacheViewStorageClass(iterator->view) == PseudoClass) + for (x=0; x < (ssize_t) iterator->region.width; x++) + PixelSetIndex(iterator->pixel_wands[x], + GetPixelBlack(indexes+x)); + *number_wands=iterator->region.width; + return(iterator->pixel_wands); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t I t e r a t o r E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetIteratorException() returns the severity, reason, and description of +% any error that occurs when using other methods in this API. +% +% The format of the PixelGetIteratorException method is: +% +% char *PixelGetIteratorException(const PixelIterator *iterator, +% ExceptionType *severity) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +% o severity: the severity of the error is returned here. +% +*/ +WandExport char *PixelGetIteratorException(const PixelIterator *iterator, + ExceptionType *severity) +{ + char + *description; + + assert(iterator != (const PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + assert(severity != (ExceptionType *) NULL); + *severity=iterator->exception->severity; + description=(char *) AcquireQuantumMemory(2UL*MaxTextExtent, + sizeof(*description)); + if (description == (char *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + iterator->name); + *description='\0'; + if (iterator->exception->reason != (char *) NULL) + (void) CopyMagickString(description,GetLocaleExceptionMessage( + iterator->exception->severity,iterator->exception->reason),MaxTextExtent); + if (iterator->exception->description != (char *) NULL) + { + (void) ConcatenateMagickString(description," (",MaxTextExtent); + (void) ConcatenateMagickString(description,GetLocaleExceptionMessage( + iterator->exception->severity,iterator->exception->description), + MaxTextExtent); + (void) ConcatenateMagickString(description,")",MaxTextExtent); + } + return(description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t E x c e p t i o n T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetIteratorExceptionType() the exception type associated with the +% iterator. If no exception has occurred, UndefinedExceptionType is returned. +% +% The format of the PixelGetIteratorExceptionType method is: +% +% ExceptionType PixelGetIteratorExceptionType( +% const PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the magick iterator. +% +*/ +WandExport ExceptionType PixelGetIteratorExceptionType( + const PixelIterator *iterator) +{ + assert(iterator != (const PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + return(iterator->exception->severity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t I t e r a t o r R o w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetIteratorRow() returns the current pixel iterator row. +% +% The format of the PixelGetIteratorRow method is: +% +% MagickBooleanType PixelGetIteratorRow(PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +*/ +WandExport ssize_t PixelGetIteratorRow(PixelIterator *iterator) +{ + assert(iterator != (const PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + return(iterator->y); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t N e x t I t e r a t o r R o w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetNextIteratorRow() returns the next row as an array of pixel wands +% from the pixel iterator. +% +% The format of the PixelGetNextIteratorRow method is: +% +% PixelWand **PixelGetNextIteratorRow(PixelIterator *iterator, +% size_t *number_wands) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +% o number_wands: the number of pixel wands. +% +*/ +WandExport PixelWand **PixelGetNextIteratorRow(PixelIterator *iterator, + size_t *number_wands) +{ + const IndexPacket + *indexes; + + const PixelPacket + *pixels; + + ssize_t + x; + + assert(iterator != (PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + *number_wands=0; + if (iterator->active != MagickFalse) + iterator->y++; + if (PixelSetIteratorRow(iterator,iterator->y) == MagickFalse) + return((PixelWand **) NULL); + pixels=GetCacheViewVirtualPixels(iterator->view,iterator->region.x, + iterator->region.y+iterator->y,iterator->region.width,1, + iterator->exception); + if (pixels == (const PixelPacket *) NULL) + { + InheritException(iterator->exception,GetCacheViewException( + iterator->view)); + return((PixelWand **) NULL); + } + indexes=GetCacheViewVirtualIndexQueue(iterator->view); + for (x=0; x < (ssize_t) iterator->region.width; x++) + PixelSetQuantumColor(iterator->pixel_wands[x],pixels+x); + if (GetCacheViewColorspace(iterator->view) == CMYKColorspace) + for (x=0; x < (ssize_t) iterator->region.width; x++) + PixelSetBlackQuantum(iterator->pixel_wands[x], + GetPixelBlack(indexes+x)); + if (GetCacheViewStorageClass(iterator->view) == PseudoClass) + for (x=0; x < (ssize_t) iterator->region.width; x++) + PixelSetIndex(iterator->pixel_wands[x], + GetPixelIndex(indexes+x)); + *number_wands=iterator->region.width; + return(iterator->pixel_wands); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t P r e v i o u s I t e r a t o r R o w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetPreviousIteratorRow() returns the previous row as an array of pixel +% wands from the pixel iterator. +% +% The format of the PixelGetPreviousIteratorRow method is: +% +% PixelWand **PixelGetPreviousIteratorRow(PixelIterator *iterator, +% size_t *number_wands) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +% o number_wands: the number of pixel wands. +% +*/ + +WandExport PixelWand **PixelGetPreviousRow(PixelIterator *iterator) +{ + size_t + number_wands; + + return(PixelGetPreviousIteratorRow(iterator,&number_wands)); +} + +WandExport PixelWand **PixelGetPreviousIteratorRow(PixelIterator *iterator, + size_t *number_wands) +{ + const IndexPacket + *indexes; + + const PixelPacket + *pixels; + + ssize_t + x; + + assert(iterator != (PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + *number_wands=0; + if (iterator->active != MagickFalse) + iterator->y--; + if (PixelSetIteratorRow(iterator,iterator->y) == MagickFalse) + return((PixelWand **) NULL); + pixels=GetCacheViewVirtualPixels(iterator->view,iterator->region.x, + iterator->region.y+iterator->y,iterator->region.width,1, + iterator->exception); + if (pixels == (const PixelPacket *) NULL) + { + InheritException(iterator->exception,GetCacheViewException( + iterator->view)); + return((PixelWand **) NULL); + } + indexes=GetCacheViewVirtualIndexQueue(iterator->view); + for (x=0; x < (ssize_t) iterator->region.width; x++) + PixelSetQuantumColor(iterator->pixel_wands[x],pixels+x); + if (GetCacheViewColorspace(iterator->view) == CMYKColorspace) + for (x=0; x < (ssize_t) iterator->region.width; x++) + PixelSetBlackQuantum(iterator->pixel_wands[x], + GetPixelBlack(indexes+x)); + if (GetCacheViewStorageClass(iterator->view) == PseudoClass) + for (x=0; x < (ssize_t) iterator->region.width; x++) + PixelSetIndex(iterator->pixel_wands[x], + GetPixelIndex(indexes+x)); + *number_wands=iterator->region.width; + return(iterator->pixel_wands); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l R e s e t I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelResetIterator() resets the pixel iterator. Use it in conjunction +% with PixelGetNextIteratorRow() to iterate over all the pixels in a pixel +% container. +% +% The format of the PixelResetIterator method is: +% +% void PixelResetIterator(PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +*/ +WandExport void PixelResetIterator(PixelIterator *iterator) +{ + assert(iterator != (PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + iterator->active=MagickFalse; + iterator->y=0; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t F i r s t I t e r a t o r R o w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetFirstIteratorRow() sets the pixel iterator to the first pixel row. +% +% The format of the PixelSetFirstIteratorRow method is: +% +% void PixelSetFirstIteratorRow(PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the magick iterator. +% +*/ +WandExport void PixelSetFirstIteratorRow(PixelIterator *iterator) +{ + assert(iterator != (PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + iterator->active=MagickFalse; + iterator->y=iterator->region.y; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t I t e r a t o r R o w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetIteratorRow() set the pixel iterator row. +% +% The format of the PixelSetIteratorRow method is: +% +% MagickBooleanType PixelSetIteratorRow(PixelIterator *iterator, +% const ssize_t row) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +*/ +WandExport MagickBooleanType PixelSetIteratorRow(PixelIterator *iterator, + const ssize_t row) +{ + assert(iterator != (const PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + if ((row < 0) || (row >= (ssize_t) iterator->region.height)) + return(MagickFalse); + iterator->active=MagickTrue; + iterator->y=row; + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t L a s t I t e r a t o r R o w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetLastIteratorRow() sets the pixel iterator to the last pixel row. +% +% The format of the PixelSetLastIteratorRow method is: +% +% void PixelSetLastIteratorRow(PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the magick iterator. +% +*/ +WandExport void PixelSetLastIteratorRow(PixelIterator *iterator) +{ + assert(iterator != (PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + iterator->active=MagickFalse; + iterator->y=(ssize_t) iterator->region.height-1; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S y n c I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSyncIterator() syncs the pixel iterator. +% +% The format of the PixelSyncIterator method is: +% +% MagickBooleanType PixelSyncIterator(PixelIterator *iterator) +% +% A description of each parameter follows: +% +% o iterator: the pixel iterator. +% +*/ +WandExport MagickBooleanType PixelSyncIterator(PixelIterator *iterator) +{ + ExceptionInfo + *exception; + + IndexPacket + *magick_restrict indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict pixels; + + assert(iterator != (const PixelIterator *) NULL); + assert(iterator->signature == WandSignature); + if (iterator->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name); + if (SetCacheViewStorageClass(iterator->view,DirectClass) == MagickFalse) + return(MagickFalse); + exception=iterator->exception; + pixels=GetCacheViewAuthenticPixels(iterator->view,iterator->region.x, + iterator->region.y+iterator->y,iterator->region.width,1,exception); + if (pixels == (PixelPacket *) NULL) + { + InheritException(iterator->exception,GetCacheViewException( + iterator->view)); + return(MagickFalse); + } + indexes=GetCacheViewAuthenticIndexQueue(iterator->view); + for (x=0; x < (ssize_t) iterator->region.width; x++) + PixelGetQuantumColor(iterator->pixel_wands[x],pixels+x); + if (GetCacheViewColorspace(iterator->view) == CMYKColorspace) + for (x=0; x < (ssize_t) iterator->region.width; x++) + SetPixelBlack(indexes+x,PixelGetBlackQuantum( + iterator->pixel_wands[x])); + if (SyncCacheViewAuthenticPixels(iterator->view,exception) == MagickFalse) + { + InheritException(iterator->exception,GetCacheViewException( + iterator->view)); + return(MagickFalse); + } + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/wand/pixel-iterator.h b/ImageMagick-6.9.12-44/wand/pixel-iterator.h new file mode 100644 index 0000000..32214a8 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/pixel-iterator.h @@ -0,0 +1,68 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Pixel Iterator Methods. +*/ +#ifndef MAGICKWAND_PIXEL_ITERATOR_H +#define MAGICKWAND_PIXEL_ITERATOR_H + +#include "wand/magick-wand.h" +#include "wand/pixel-wand.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct _PixelIterator + PixelIterator; + +extern WandExport char + *PixelGetIteratorException(const PixelIterator *,ExceptionType *); + +extern WandExport ExceptionType + PixelGetIteratorExceptionType(const PixelIterator *); + +extern WandExport MagickBooleanType + IsPixelIterator(const PixelIterator *), + PixelClearIteratorException(PixelIterator *), + PixelSetIteratorRow(PixelIterator *,const ssize_t), + PixelSyncIterator(PixelIterator *); + +extern WandExport PixelIterator + *ClonePixelIterator(const PixelIterator *), + *DestroyPixelIterator(PixelIterator *), + *NewPixelIterator(MagickWand *), + *NewPixelRegionIterator(MagickWand *,const ssize_t,const ssize_t,const size_t, + const size_t); + +extern WandExport PixelWand + **PixelGetCurrentIteratorRow(PixelIterator *,size_t *), + **PixelGetNextIteratorRow(PixelIterator *,size_t *), + **PixelGetPreviousIteratorRow(PixelIterator *,size_t *); + +extern WandExport ssize_t + PixelGetIteratorRow(PixelIterator *); + +extern WandExport void + ClearPixelIterator(PixelIterator *), + PixelResetIterator(PixelIterator *), + PixelSetFirstIteratorRow(PixelIterator *), + PixelSetLastIteratorRow(PixelIterator *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/pixel-wand-private.h b/ImageMagick-6.9.12-44/wand/pixel-wand-private.h new file mode 100644 index 0000000..e83a884 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/pixel-wand-private.h @@ -0,0 +1,29 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MAgickWand pixel wand private methods. +*/ +#ifndef MAGICKWAND_PIXEL_WAND_PRIVATE_H +#define MAGICKWAND_PIXEL_WAND_PRIVATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/pixel-wand.c b/ImageMagick-6.9.12-44/wand/pixel-wand.c new file mode 100644 index 0000000..89e1e33 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/pixel-wand.c @@ -0,0 +1,2324 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% PPPP IIIII X X EEEEE L % +% P P I X X E L % +% PPPP I X EEE L % +% P I X X E L % +% P IIIII X X EEEEE LLLLL % +% % +% W W AAA N N DDDD % +% W W A A NN N D D % +% W W W AAAAA N N N D D % +% WW WW A A N NN D D % +% W W A A N N DDDD % +% % +% % +% MagickWand Image Pixel Wand Methods % +% % +% Software Design % +% Cristy % +% March 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/magick-wand-private.h" +#include "wand/pixel-wand-private.h" +#include "wand/wand.h" + +/* + Define declarations. +*/ +#define PixelWandId "PixelWand" + +/* + Typedef declarations. +*/ +struct _PixelWand +{ + size_t + id; + + char + name[MaxTextExtent]; + + ExceptionInfo + *exception; + + MagickPixelPacket + pixel; + + size_t + count; + + MagickBooleanType + debug; + + size_t + signature; +}; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l e a r P i x e l W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClearPixelWand() clears resources associated with the wand. +% +% The format of the ClearPixelWand method is: +% +% void ClearPixelWand(PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport void ClearPixelWand(PixelWand *wand) +{ + assert(wand != (PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + ClearMagickException(wand->exception); + wand->pixel.colorspace=sRGBColorspace; + wand->debug=IsEventLogging(); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e P i x e l W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClonePixelWand() makes an exact copy of the specified wand. +% +% The format of the ClonePixelWand method is: +% +% PixelWand *ClonePixelWand(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport PixelWand *ClonePixelWand(const PixelWand *wand) +{ + PixelWand + *clone_wand; + + assert(wand != (PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + clone_wand=(PixelWand *) AcquireCriticalMemory(sizeof(*clone_wand)); + (void) memset(clone_wand,0,sizeof(*clone_wand)); + clone_wand->id=AcquireWandId(); + (void) FormatLocaleString(clone_wand->name,MaxTextExtent,"%s-%.20g", + PixelWandId,(double) clone_wand->id); + clone_wand->exception=AcquireExceptionInfo(); + InheritException(clone_wand->exception,wand->exception); + clone_wand->pixel=wand->pixel; + clone_wand->count=wand->count; + clone_wand->debug=IsEventLogging(); + if (clone_wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_wand->name); + clone_wand->signature=WandSignature; + return(clone_wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e P i x e l W a n d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ClonePixelWands() makes an exact copy of the specified wands. +% +% The format of the ClonePixelWands method is: +% +% PixelWand **ClonePixelWands(const PixelWand **wands, +% const size_t number_wands) +% +% A description of each parameter follows: +% +% o wands: the magick wands. +% +% o number_wands: the number of wands. +% +*/ +WandExport PixelWand **ClonePixelWands(const PixelWand **wands, + const size_t number_wands) +{ + ssize_t + i; + + PixelWand + **clone_wands; + + clone_wands=(PixelWand **) AcquireCriticalMemory((size_t) number_wands& + sizeof(*clone_wands)); + for (i=0; i < (ssize_t) number_wands; i++) + clone_wands[i]=ClonePixelWand(wands[i]); + return(clone_wands); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y P i x e l W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyPixelWand() deallocates resources associated with a PixelWand. +% +% The format of the DestroyPixelWand method is: +% +% PixelWand *DestroyPixelWand(PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport PixelWand *DestroyPixelWand(PixelWand *wand) +{ + assert(wand != (PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->exception=DestroyExceptionInfo(wand->exception); + wand->signature=(~WandSignature); + RelinquishWandId(wand->id); + wand=(PixelWand *) RelinquishMagickMemory(wand); + return(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y P i x e l W a n d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyPixelWands() deallocates resources associated with an array of +% pixel wands. +% +% The format of the DestroyPixelWands method is: +% +% PixelWand **DestroyPixelWands(PixelWand **wand, +% const size_t number_wands) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o number_wands: the number of wands. +% +*/ +WandExport PixelWand **DestroyPixelWands(PixelWand **wand, + const size_t number_wands) +{ + ssize_t + i; + + assert(wand != (PixelWand **) NULL); + assert(*wand != (PixelWand *) NULL); + assert((*wand)->signature == WandSignature); + if ((*wand)->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",(*wand)->name); + for (i=(ssize_t) number_wands-1; i >= 0; i--) + wand[i]=DestroyPixelWand(wand[i]); + wand=(PixelWand **) RelinquishMagickMemory(wand); + return(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P i x e l W a n d S i m i l a r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPixelWandSimilar() returns MagickTrue if the distance between two +% colors is less than the specified distance. +% +% The format of the IsPixelWandSimilar method is: +% +% MagickBooleanType IsPixelWandSimilar(PixelWand *p,PixelWand *q, +% const double fuzz) +% +% A description of each parameter follows: +% +% o p: the pixel wand. +% +% o q: the pixel wand. +% +% o fuzz: any two colors that are less than or equal to this distance +% squared are consider similar. +% +*/ +WandExport MagickBooleanType IsPixelWandSimilar(PixelWand *p,PixelWand *q, + const double fuzz) +{ + assert(p != (PixelWand *) NULL); + assert(p->signature == WandSignature); + if (p->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",p->name); + assert(q != (PixelWand *) NULL); + assert(q->signature == WandSignature); + if (q->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",q->name); + p->pixel.fuzz=fuzz; + q->pixel.fuzz=fuzz; + return(IsMagickColorSimilar(&p->pixel,&q->pixel)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s P i x e l W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsPixelWand() returns MagickTrue if the wand is verified as a pixel wand. +% +% The format of the IsPixelWand method is: +% +% MagickBooleanType IsPixelWand(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport MagickBooleanType IsPixelWand(const PixelWand *wand) +{ + if (wand == (const PixelWand *) NULL) + return(MagickFalse); + if (wand->signature != WandSignature) + return(MagickFalse); + if (LocaleNCompare(wand->name,PixelWandId,strlen(PixelWandId)) != 0) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w P i x e l W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewPixelWand() returns a new pixel wand. +% +% The format of the NewPixelWand method is: +% +% PixelWand *NewPixelWand(void) +% +*/ +WandExport PixelWand *NewPixelWand(void) +{ + const char + *quantum; + + PixelWand + *wand; + + size_t + depth; + + depth=MAGICKCORE_QUANTUM_DEPTH; + quantum=GetMagickQuantumDepth(&depth); + if (depth != MAGICKCORE_QUANTUM_DEPTH) + ThrowWandFatalException(WandError,"QuantumDepthMismatch",quantum); + wand=(PixelWand *) AcquireCriticalMemory(sizeof(*wand)); + (void) memset(wand,0,sizeof(*wand)); + wand->id=AcquireWandId(); + (void) FormatLocaleString(wand->name,MaxTextExtent,"%s-%.20g",PixelWandId, + (double) wand->id); + wand->exception=AcquireExceptionInfo(); + GetMagickPixelPacket((Image *) NULL,&wand->pixel); + wand->debug=IsEventLogging(); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->signature=WandSignature; + return(wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w P i x e l W a n d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewPixelWands() returns an array of pixel wands. +% +% The format of the NewPixelWands method is: +% +% PixelWand **NewPixelWands(const size_t number_wands) +% +% A description of each parameter follows: +% +% o number_wands: the number of wands. +% +*/ +WandExport PixelWand **NewPixelWands(const size_t number_wands) +{ + ssize_t + i; + + PixelWand + **wands; + + wands=(PixelWand **) AcquireCriticalMemory((size_t) number_wands* + sizeof(*wands)); + for (i=0; i < (ssize_t) number_wands; i++) + wands[i]=NewPixelWand(); + return(wands); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l C l e a r E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelClearException() clear any exceptions associated with the iterator. +% +% The format of the PixelClearException method is: +% +% MagickBooleanType PixelClearException(PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport MagickBooleanType PixelClearException(PixelWand *wand) +{ + assert(wand != (PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + ClearMagickException(wand->exception); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t A l p h a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetAlpha() returns the normalized alpha value of the pixel wand. +% +% The format of the PixelGetAlpha method is: +% +% double PixelGetAlpha(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport double PixelGetAlpha(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((double) QuantumScale*(QuantumRange-wand->pixel.opacity)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t A l p h a Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetAlphaQuantum() returns the alpha value of the pixel wand. +% +% The format of the PixelGetAlphaQuantum method is: +% +% Quantum PixelGetAlphaQuantum(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport Quantum PixelGetAlphaQuantum(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(QuantumRange-ClampToQuantum(wand->pixel.opacity)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t B l a c k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetBlack() returns the normalized black color of the pixel wand. +% +% The format of the PixelGetBlack method is: +% +% double PixelGetBlack(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport double PixelGetBlack(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((double) QuantumScale*wand->pixel.index); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t B l a c k Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetBlackQuantum() returns the black color of the pixel wand. +% +% The format of the PixelGetBlackQuantum method is: +% +% Quantum PixelGetBlackQuantum(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport Quantum PixelGetBlackQuantum(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(ClampToQuantum(wand->pixel.index)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t B l u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetBlue() returns the normalized blue color of the pixel wand. +% +% The format of the PixelGetBlue method is: +% +% double PixelGetBlue(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport double PixelGetBlue(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((double) QuantumScale*wand->pixel.blue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t B l u e Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetBlueQuantum() returns the blue color of the pixel wand. +% +% The format of the PixelGetBlueQuantum method is: +% +% Quantum PixelGetBlueQuantum(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport Quantum PixelGetBlueQuantum(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(ClampToQuantum(wand->pixel.blue)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t C o l o r A s S t r i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetColorAsString() returnsd the color of the pixel wand as a string. +% +% The format of the PixelGetColorAsString method is: +% +% char *PixelGetColorAsString(PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport char *PixelGetColorAsString(const PixelWand *wand) +{ + char + *color; + + MagickPixelPacket + pixel; + + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + pixel=wand->pixel; + color=AcquireString((const char *) NULL); + GetColorTuple(&pixel,MagickFalse,color); + return(color); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t C o l o r A s N o r m a l i z e d S t r i n g % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetColorAsNormalizedString() returns the normalized color of the pixel +% wand as a string. +% +% The format of the PixelGetColorAsNormalizedString method is: +% +% char *PixelGetColorAsNormalizedString(PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport char *PixelGetColorAsNormalizedString(const PixelWand *wand) +{ + char + color[2*MaxTextExtent]; + + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + (void) FormatLocaleString(color,MaxTextExtent,"%g,%g,%g", + (double) (QuantumScale*wand->pixel.red), + (double) (QuantumScale*wand->pixel.green), + (double) (QuantumScale*wand->pixel.blue)); + if (wand->pixel.colorspace == CMYKColorspace) + (void) FormatLocaleString(color+strlen(color),MaxTextExtent,",%g", + (double) (QuantumScale*wand->pixel.index)); + if (wand->pixel.matte != MagickFalse) + (void) FormatLocaleString(color+strlen(color),MaxTextExtent,",%g", + (double) (QuantumScale*wand->pixel.opacity)); + return(ConstantString(color)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t C o l o r C o u n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetColorCount() returns the color count associated with this color. +% +% The format of the PixelGetColorCount method is: +% +% size_t PixelGetColorCount(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport size_t PixelGetColorCount(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->count); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t C y a n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetCyan() returns the normalized cyan color of the pixel wand. +% +% The format of the PixelGetCyan method is: +% +% double PixelGetCyan(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport double PixelGetCyan(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((double) QuantumScale*wand->pixel.red); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t C y a n Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetCyanQuantum() returns the cyan color of the pixel wand. +% +% The format of the PixelGetCyanQuantum method is: +% +% Quantum PixelGetCyanQuantum(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport Quantum PixelGetCyanQuantum(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(ClampToQuantum(wand->pixel.red)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetException() returns the severity, reason, and description of any +% error that occurs when using other methods in this API. +% +% The format of the PixelGetException method is: +% +% char *PixelGetException(const PixelWand *wand,ExceptionType *severity) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o severity: the severity of the error is returned here. +% +*/ +WandExport char *PixelGetException(const PixelWand *wand, + ExceptionType *severity) +{ + char + *description; + + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(severity != (ExceptionType *) NULL); + *severity=wand->exception->severity; + description=(char *) AcquireQuantumMemory(2UL*MaxTextExtent, + sizeof(*description)); + if (description == (char *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + wand->name); + *description='\0'; + if (wand->exception->reason != (char *) NULL) + (void) CopyMagickString(description,GetLocaleExceptionMessage( + wand->exception->severity,wand->exception->reason),MaxTextExtent); + if (wand->exception->description != (char *) NULL) + { + (void) ConcatenateMagickString(description," (",MaxTextExtent); + (void) ConcatenateMagickString(description,GetLocaleExceptionMessage( + wand->exception->severity,wand->exception->description),MaxTextExtent); + (void) ConcatenateMagickString(description,")",MaxTextExtent); + } + return(description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t E x c e p t i o n T y p e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetExceptionType() the exception type associated with the wand. If +% no exception has occurred, UndefinedExceptionType is returned. +% +% The format of the PixelGetExceptionType method is: +% +% ExceptionType PixelGetExceptionType(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +*/ +WandExport ExceptionType PixelGetExceptionType(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(wand->exception->severity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t F u z z % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetFuzz() returns the normalized fuzz value of the pixel wand. +% +% The format of the PixelGetFuzz method is: +% +% double PixelGetFuzz(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport double PixelGetFuzz(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((double) wand->pixel.fuzz); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t G r e e n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetGreen() returns the normalized green color of the pixel wand. +% +% The format of the PixelGetGreen method is: +% +% double PixelGetGreen(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport double PixelGetGreen(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((double) QuantumScale*wand->pixel.green); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t G r e e n Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetGreenQuantum() returns the green color of the pixel wand. +% +% The format of the PixelGetGreenQuantum method is: +% +% Quantum PixelGetGreenQuantum(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport Quantum PixelGetGreenQuantum(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(ClampToQuantum(wand->pixel.green)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t H S L % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetHSL() returns the normalized HSL color of the pixel wand. +% +% The format of the PixelGetHSL method is: +% +% void PixelGetHSL(const PixelWand *wand,double *hue,double *saturation, +% double *lightness) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o hue,saturation,lightness: Return the pixel hue, saturation, and +% brightness. +% +*/ +WandExport void PixelGetHSL(const PixelWand *wand,double *hue, + double *saturation,double *lightness) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + ConvertRGBToHSL(ClampToQuantum(wand->pixel.red),ClampToQuantum( + wand->pixel.green),ClampToQuantum(wand->pixel.blue),hue,saturation, + lightness); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t I n d e x % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetIndex() returns the colormap index from the pixel wand. +% +% The format of the PixelGetIndex method is: +% +% IndexPacket PixelGetIndex(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport IndexPacket PixelGetIndex(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((IndexPacket) wand->pixel.index); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t M a g e n t a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetMagenta() returns the normalized magenta color of the pixel wand. +% +% The format of the PixelGetMagenta method is: +% +% double PixelGetMagenta(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport double PixelGetMagenta(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((double) QuantumScale*wand->pixel.green); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t M a g e n t a Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetMagentaQuantum() returns the magenta color of the pixel wand. +% +% The format of the PixelGetMagentaQuantum method is: +% +% Quantum PixelGetMagentaQuantum(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport Quantum PixelGetMagentaQuantum(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(ClampToQuantum(wand->pixel.green)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t M a g i c k C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetMagickColor() gets the magick color of the pixel wand. +% +% The format of the PixelGetMagickColor method is: +% +% void PixelGetMagickColor(PixelWand *wand,MagickPixelPacket *color) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o color: The pixel wand color is returned here. +% +*/ +WandExport void PixelGetMagickColor(const PixelWand *wand, + MagickPixelPacket *color) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(color != (MagickPixelPacket *) NULL); + *color=wand->pixel; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t O p a c i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetOpacity() returns the normalized opacity value of the pixel wand. +% +% The format of the PixelGetOpacity method is: +% +% double PixelGetOpacity(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport double PixelGetOpacity(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((double) QuantumScale*wand->pixel.opacity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t O p a c i t y Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetOpacityQuantum() returns the opacity value of the pixel wand. +% +% The format of the PixelGetOpacityQuantum method is: +% +% Quantum PixelGetOpacityQuantum(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport Quantum PixelGetOpacityQuantum(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(ClampToQuantum(wand->pixel.opacity)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t Q u a n t u m C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetQuantumColor() gets the color of the pixel wand as a PixelPacket. +% +% The format of the PixelGetQuantumColor method is: +% +% void PixelGetQuantumColor(PixelWand *wand,PixelPacket *color) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o color: The pixel wand color is returned here. +% +*/ +WandExport void PixelGetQuantumColor(const PixelWand *wand,PixelPacket *color) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(color != (PixelPacket *) NULL); + color->opacity=ClampToQuantum(wand->pixel.opacity); + if (wand->pixel.colorspace == CMYKColorspace) + { + color->red=ClampToQuantum((MagickRealType) QuantumRange- + (wand->pixel.red*(QuantumRange-wand->pixel.index)+wand->pixel.index)); + color->green=ClampToQuantum((MagickRealType) QuantumRange- + (wand->pixel.green*(QuantumRange-wand->pixel.index)+ + wand->pixel.index)); + color->blue=ClampToQuantum((MagickRealType) QuantumRange- + (wand->pixel.blue*(QuantumRange-wand->pixel.index)+wand->pixel.index)); + return; + } + color->red=ClampToQuantum(wand->pixel.red); + color->green=ClampToQuantum(wand->pixel.green); + color->blue=ClampToQuantum(wand->pixel.blue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t R e d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetRed() returns the normalized red color of the pixel wand. +% +% The format of the PixelGetRed method is: +% +% double PixelGetRed(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport double PixelGetRed(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((double) QuantumScale*wand->pixel.red); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t R e d Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetRedQuantum() returns the red color of the pixel wand. +% +% The format of the PixelGetRedQuantum method is: +% +% Quantum PixelGetRedQuantum(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport Quantum PixelGetRedQuantum(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(ClampToQuantum(wand->pixel.red)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t Y e l l o w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetYellow() returns the normalized yellow color of the pixel wand. +% +% The format of the PixelGetYellow method is: +% +% double PixelGetYellow(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport double PixelGetYellow(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return((double) QuantumScale*wand->pixel.blue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l G e t Y e l l o w Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelGetYellowQuantum() returns the yellow color of the pixel wand. +% +% The format of the PixelGetYellowQuantum method is: +% +% Quantum PixelGetYellowQuantum(const PixelWand *wand) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +*/ +WandExport Quantum PixelGetYellowQuantum(const PixelWand *wand) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + return(ClampToQuantum(wand->pixel.blue)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t A l p h a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetAlpha() sets the normalized alpha value of the pixel wand. +% +% The format of the PixelSetAlpha method is: +% +% void PixelSetAlpha(PixelWand *wand,const double alpha) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully +% transparent. +% +*/ +WandExport void PixelSetAlpha(PixelWand *wand,const double alpha) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.opacity=(MagickRealType) (QuantumRange- + ClampToQuantum((MagickRealType) QuantumRange*alpha)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t A l p h a Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetAlphaQuantum() sets the alpha value of the pixel wand. +% +% The format of the PixelSetAlphaQuantum method is: +% +% void PixelSetAlphaQuantum(PixelWand *wand, +% const Quantum opacity) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o opacity: the opacity value. +% +*/ +WandExport void PixelSetAlphaQuantum(PixelWand *wand,const Quantum opacity) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.opacity=(MagickRealType) (QuantumRange-opacity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t B l a c k % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetBlack() sets the normalized black color of the pixel wand. +% +% The format of the PixelSetBlack method is: +% +% void PixelSetBlack(PixelWand *wand,const double black) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o black: the black color. +% +*/ +WandExport void PixelSetBlack(PixelWand *wand,const double black) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.index=(MagickRealType) ClampToQuantum((MagickRealType) + QuantumRange*black); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t B l a c k Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetBlackQuantum() sets the black color of the pixel wand. +% +% The format of the PixelSetBlackQuantum method is: +% +% void PixelSetBlackQuantum(PixelWand *wand,const Quantum black) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o black: the black color. +% +*/ +WandExport void PixelSetBlackQuantum(PixelWand *wand,const Quantum black) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.index=(MagickRealType) black; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t B l u e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetBlue() sets the normalized blue color of the pixel wand. +% +% The format of the PixelSetBlue method is: +% +% void PixelSetBlue(PixelWand *wand,const double blue) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o blue: the blue color. +% +*/ +WandExport void PixelSetBlue(PixelWand *wand,const double blue) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.blue=(MagickRealType) ClampToQuantum((MagickRealType) + QuantumRange*blue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t B l u e Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetBlueQuantum() sets the blue color of the pixel wand. +% +% The format of the PixelSetBlueQuantum method is: +% +% void PixelSetBlueQuantum(PixelWand *wand,const Quantum blue) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o blue: the blue color. +% +*/ +WandExport void PixelSetBlueQuantum(PixelWand *wand,const Quantum blue) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.blue=(MagickRealType) blue; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetColor() sets the color of the pixel wand with a string (e.g. +% "blue", "#0000ff", "rgb(0,0,255)", "cmyk(100,100,100,10)", etc.). +% +% The format of the PixelSetColor method is: +% +% MagickBooleanType PixelSetColor(PixelWand *wand,const char *color) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o color: the pixel wand color. +% +*/ +WandExport MagickBooleanType PixelSetColor(PixelWand *wand,const char *color) +{ + MagickBooleanType + status; + + MagickPixelPacket + pixel; + + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + status=QueryMagickColor(color,&pixel,wand->exception); + if (status != MagickFalse) + wand->pixel=pixel; + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t C o l o r C o u n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetColorCount() sets the color count of the pixel wand. +% +% The format of the PixelSetColorCount method is: +% +% void PixelSetColorCount(PixelWand *wand,const size_t count) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o count: the number of this particular color. +% +*/ +WandExport void PixelSetColorCount(PixelWand *wand,const size_t count) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->count=count; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t C o l o r F r o m W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetColorFromWand() sets the color of the pixel wand. +% +% The format of the PixelSetColorFromWand method is: +% +% void PixelSetColorFromWand(PixelWand *wand,const PixelWand *color) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o color: set the pixel wand color here. +% +*/ +WandExport void PixelSetColorFromWand(PixelWand *wand,const PixelWand *color) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(color != (const PixelWand *) NULL); + wand->pixel=color->pixel; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t C y a n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetCyan() sets the normalized cyan color of the pixel wand. +% +% The format of the PixelSetCyan method is: +% +% void PixelSetCyan(PixelWand *wand,const double cyan) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o cyan: the cyan color. +% +*/ +WandExport void PixelSetCyan(PixelWand *wand,const double cyan) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.red=(MagickRealType) ClampToQuantum((MagickRealType) + QuantumRange*cyan); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t C y a n Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetCyanQuantum() sets the cyan color of the pixel wand. +% +% The format of the PixelSetCyanQuantum method is: +% +% void PixelSetCyanQuantum(PixelWand *wand,const Quantum cyan) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o cyan: the cyan color. +% +*/ +WandExport void PixelSetCyanQuantum(PixelWand *wand,const Quantum cyan) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.red=(MagickRealType) cyan; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t F u z z % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetFuzz() sets the fuzz value of the pixel wand. +% +% The format of the PixelSetFuzz method is: +% +% void PixelSetFuzz(PixelWand *wand,const double fuzz) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o fuzz: the fuzz value. +% +*/ +WandExport void PixelSetFuzz(PixelWand *wand,const double fuzz) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.fuzz=(MagickRealType) fuzz; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t G r e e n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetGreen() sets the normalized green color of the pixel wand. +% +% The format of the PixelSetGreen method is: +% +% void PixelSetGreen(PixelWand *wand,const double green) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o green: the green color. +% +*/ +WandExport void PixelSetGreen(PixelWand *wand,const double green) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.green=(MagickRealType) ClampToQuantum((MagickRealType) + QuantumRange*green); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t G r e e n Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetGreenQuantum() sets the green color of the pixel wand. +% +% The format of the PixelSetGreenQuantum method is: +% +% void PixelSetGreenQuantum(PixelWand *wand,const Quantum green) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o green: the green color. +% +*/ +WandExport void PixelSetGreenQuantum(PixelWand *wand,const Quantum green) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.green=(MagickRealType) green; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t H S L % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetHSL() sets the normalized HSL color of the pixel wand. +% +% The format of the PixelSetHSL method is: +% +% void PixelSetHSL(PixelWand *wand,const double hue, +% const double saturation,const double lightness) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o hue,saturation,lightness: Return the pixel hue, saturation, and +% brightness. +% +*/ +WandExport void PixelSetHSL(PixelWand *wand,const double hue, + const double saturation,const double lightness) +{ + Quantum + blue, + green, + red; + + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue); + wand->pixel.red=(MagickRealType) red; + wand->pixel.green=(MagickRealType) green; + wand->pixel.blue=(MagickRealType) blue; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t I n d e x % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetIndex() sets the colormap index of the pixel wand. +% +% The format of the PixelSetIndex method is: +% +% void PixelSetIndex(PixelWand *wand,const IndexPacket index) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o index: the colormap index. +% +*/ +WandExport void PixelSetIndex(PixelWand *wand,const IndexPacket index) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.index=(MagickRealType) index; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t M a g e n t a % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetMagenta() sets the normalized magenta color of the pixel wand. +% +% The format of the PixelSetMagenta method is: +% +% void PixelSetMagenta(PixelWand *wand,const double magenta) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o magenta: the magenta color. +% +*/ +WandExport void PixelSetMagenta(PixelWand *wand,const double magenta) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.green=(MagickRealType) ClampToQuantum((MagickRealType) + QuantumRange*magenta); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t M a g e n t a Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetMagentaQuantum() sets the magenta color of the pixel wand. +% +% The format of the PixelSetMagentaQuantum method is: +% +% void PixelSetMagentaQuantum(PixelWand *wand, +% const Quantum magenta) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o magenta: the green magenta. +% +*/ +WandExport void PixelSetMagentaQuantum(PixelWand *wand,const Quantum magenta) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.green=(MagickRealType) magenta; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t M a g i c k C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetMagickColor() sets the color of the pixel wand. +% +% The format of the PixelSetMagickColor method is: +% +% void PixelSetMagickColor(PixelWand *wand,const MagickPixelPacket *color) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o color: the pixel wand color. +% +*/ +WandExport void PixelSetMagickColor(PixelWand *wand, + const MagickPixelPacket *color) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(color != (const MagickPixelPacket *) NULL); + wand->pixel=(*color); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t O p a c i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetOpacity() sets the normalized opacity value of the pixel wand. +% +% The format of the PixelSetOpacity method is: +% +% void PixelSetOpacity(PixelWand *wand,const double opacity) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o opacity: the opacity value. +% +*/ +WandExport void PixelSetOpacity(PixelWand *wand,const double opacity) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.matte=MagickTrue; + wand->pixel.opacity=(MagickRealType) ClampToQuantum((MagickRealType) + QuantumRange*opacity); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t O p a c i t y Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetOpacityQuantum() sets the opacity value of the pixel wand. +% +% The format of the PixelSetOpacityQuantum method is: +% +% void PixelSetOpacityQuantum(PixelWand *wand, +% const Quantum opacity) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o opacity: the opacity value. +% +*/ +WandExport void PixelSetOpacityQuantum(PixelWand *wand,const Quantum opacity) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.opacity=(MagickRealType) opacity; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t Q u a n t u m C o l o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetQuantumColor() sets the color of the pixel wand. +% +% The format of the PixelSetQuantumColor method is: +% +% void PixelSetQuantumColor(PixelWand *wand,const PixelPacket *color) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o color: the pixel wand color. +% +*/ +WandExport void PixelSetQuantumColor(PixelWand *wand,const PixelPacket *color) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + assert(color != (PixelPacket *) NULL); + wand->pixel.red=(MagickRealType) color->red; + wand->pixel.green=(MagickRealType) color->green; + wand->pixel.blue=(MagickRealType) color->blue; + wand->pixel.opacity=(MagickRealType) color->opacity; + wand->pixel.matte=color->opacity != OpaqueOpacity ? MagickTrue : MagickFalse; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t R e d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetRed() sets the normalized red color of the pixel wand. +% +% The format of the PixelSetRed method is: +% +% void PixelSetRed(PixelWand *wand,const double red) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o red: the red color. +% +*/ +WandExport void PixelSetRed(PixelWand *wand,const double red) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.red=(MagickRealType) ClampToQuantum((MagickRealType) + QuantumRange*red); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t R e d Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetRedQuantum() sets the red color of the pixel wand. +% +% The format of the PixelSetRedQuantum method is: +% +% void PixelSetRedQuantum(PixelWand *wand,const Quantum red) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o red: the red color. +% +*/ +WandExport void PixelSetRedQuantum(PixelWand *wand,const Quantum red) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.red=(MagickRealType) red; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t Y e l l o w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetYellow() sets the normalized yellow color of the pixel wand. +% +% The format of the PixelSetYellow method is: +% +% void PixelSetYellow(PixelWand *wand,const double yellow) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o yellow: the yellow color. +% +*/ +WandExport void PixelSetYellow(PixelWand *wand,const double yellow) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.blue=(MagickRealType) ClampToQuantum((MagickRealType) + QuantumRange*yellow); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% P i x e l S e t Y e l l o w Q u a n t u m % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% PixelSetYellowQuantum() sets the yellow color of the pixel wand. +% +% The format of the PixelSetYellowQuantum method is: +% +% void PixelSetYellowQuantum(PixelWand *wand,const Quantum yellow) +% +% A description of each parameter follows: +% +% o wand: the pixel wand. +% +% o yellow: the yellow color. +% +*/ +WandExport void PixelSetYellowQuantum(PixelWand *wand,const Quantum yellow) +{ + assert(wand != (const PixelWand *) NULL); + assert(wand->signature == WandSignature); + if (wand->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); + wand->pixel.blue=(MagickRealType) yellow; +} diff --git a/ImageMagick-6.9.12-44/wand/pixel-wand.h b/ImageMagick-6.9.12-44/wand/pixel-wand.h new file mode 100644 index 0000000..2328194 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/pixel-wand.h @@ -0,0 +1,114 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand pixel wand methods. +*/ +#ifndef MAGICKWAND_PIXEL_WAND_H +#define MAGICKWAND_PIXEL_WAND_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct _PixelWand + PixelWand; + +extern WandExport char + *PixelGetColorAsNormalizedString(const PixelWand *), + *PixelGetColorAsString(const PixelWand *), + *PixelGetException(const PixelWand *,ExceptionType *); + +extern WandExport double + PixelGetAlpha(const PixelWand *) magick_attribute((__pure__)), + PixelGetBlack(const PixelWand *) magick_attribute((__pure__)), + PixelGetBlue(const PixelWand *) magick_attribute((__pure__)), + PixelGetCyan(const PixelWand *) magick_attribute((__pure__)), + PixelGetFuzz(const PixelWand *) magick_attribute((__pure__)), + PixelGetGreen(const PixelWand *) magick_attribute((__pure__)), + PixelGetMagenta(const PixelWand *) magick_attribute((__pure__)), + PixelGetOpacity(const PixelWand *) magick_attribute((__pure__)), + PixelGetRed(const PixelWand *) magick_attribute((__pure__)), + PixelGetYellow(const PixelWand *) magick_attribute((__pure__)); + +extern WandExport ExceptionType + PixelGetExceptionType(const PixelWand *); + +extern WandExport IndexPacket + PixelGetIndex(const PixelWand *); + +extern WandExport MagickBooleanType + IsPixelWand(const PixelWand *), + IsPixelWandSimilar(PixelWand *,PixelWand *,const double), + PixelClearException(PixelWand *), + PixelSetColor(PixelWand *,const char *); + +extern WandExport PixelWand + *ClonePixelWand(const PixelWand *), + **ClonePixelWands(const PixelWand **,const size_t), + *DestroyPixelWand(PixelWand *), + **DestroyPixelWands(PixelWand **,const size_t), + *NewPixelWand(void), + **NewPixelWands(const size_t); + +extern WandExport Quantum + PixelGetAlphaQuantum(const PixelWand *) magick_attribute((__pure__)), + PixelGetBlackQuantum(const PixelWand *) magick_attribute((__pure__)), + PixelGetBlueQuantum(const PixelWand *) magick_attribute((__pure__)), + PixelGetCyanQuantum(const PixelWand *) magick_attribute((__pure__)), + PixelGetGreenQuantum(const PixelWand *) magick_attribute((__pure__)), + PixelGetMagentaQuantum(const PixelWand *) magick_attribute((__pure__)), + PixelGetOpacityQuantum(const PixelWand *) magick_attribute((__pure__)), + PixelGetRedQuantum(const PixelWand *) magick_attribute((__pure__)), + PixelGetYellowQuantum(const PixelWand *) magick_attribute((__pure__)); + +extern WandExport size_t + PixelGetColorCount(const PixelWand *) magick_attribute((__pure__)); + +extern WandExport void + ClearPixelWand(PixelWand *), + PixelGetHSL(const PixelWand *,double *,double *,double *), + PixelGetMagickColor(const PixelWand *,MagickPixelPacket *), + PixelGetQuantumColor(const PixelWand *,PixelPacket *), + PixelSetAlpha(PixelWand *,const double), + PixelSetAlphaQuantum(PixelWand *,const Quantum), + PixelSetBlack(PixelWand *,const double), + PixelSetBlackQuantum(PixelWand *,const Quantum), + PixelSetBlue(PixelWand *,const double), + PixelSetBlueQuantum(PixelWand *,const Quantum), + PixelSetColorFromWand(PixelWand *,const PixelWand *), + PixelSetColorCount(PixelWand *,const size_t), + PixelSetCyan(PixelWand *,const double), + PixelSetCyanQuantum(PixelWand *,const Quantum), + PixelSetFuzz(PixelWand *,const double), + PixelSetGreen(PixelWand *,const double), + PixelSetGreenQuantum(PixelWand *,const Quantum), + PixelSetHSL(PixelWand *,const double,const double,const double), + PixelSetIndex(PixelWand *,const IndexPacket), + PixelSetMagenta(PixelWand *,const double), + PixelSetMagentaQuantum(PixelWand *,const Quantum), + PixelSetMagickColor(PixelWand *,const MagickPixelPacket *), + PixelSetOpacity(PixelWand *,const double), + PixelSetOpacityQuantum(PixelWand *,const Quantum), + PixelSetQuantumColor(PixelWand *,const PixelPacket *), + PixelSetRed(PixelWand *,const double), + PixelSetRedQuantum(PixelWand *,const Quantum), + PixelSetYellow(PixelWand *,const double), + PixelSetYellowQuantum(PixelWand *,const Quantum); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/stream.c b/ImageMagick-6.9.12-44/wand/stream.c new file mode 100644 index 0000000..75f3bd8 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/stream.c @@ -0,0 +1,753 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% SSSSS TTTTT RRRR EEEEE AAA M M % +% SS T R R E A A MM MM % +% SSS T RRRR EEE AAAAA M M M % +% SS T R R E A A M M % +% SSSSS T R R EEEEE A A M M % +% % +% % +% Stream Image to a Raw Image Format % +% % +% Software Design % +% Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Stream is a lightweight tool to stream one or more pixel components of the +% image or portion of the image to your choice of storage formats. It writes +% the pixel components as they are read from the input image a row at a time +% making stream desirable when working with large images or when you require +% raw pixel components. +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/mogrify-private.h" +#include "magick/stream-private.h" +#include "magick/string-private.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S t r e a m I m a g e C o m m a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% StreamImageCommand() is a lightweight method designed to extract pixels +% from large image files to a raw format using a minimum of system resources. +% The entire image or any regular portion of the image can be extracted. +% +% The format of the StreamImageCommand method is: +% +% MagickBooleanType StreamImageCommand(ImageInfo *image_info,int argc, +% char **argv,char **metadata,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o argc: the number of elements in the argument vector. +% +% o argv: A text array containing the command line arguments. +% +% o metadata: any metadata is returned here. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickBooleanType StreamUsage(void) +{ + static const char + miscellaneous[] = + " -debug events display copious debugging information\n" + " -help print program options\n" + " -list type print a list of supported option arguments\n" + " -log format format of debugging information\n" + " -version print version information", + settings[] = + " -authenticate password\n" + " decipher image with this password\n" + " -channel type apply option to select image channels\n" + " -colorspace type alternate image colorspace\n" + " -compress type type of pixel compression when writing the image\n" + " -define format:option\n" + " define one or more image format options\n" + " -density geometry horizontal and vertical density of the image\n" + " -depth value image depth\n" + " -extract geometry extract area from image\n" + " -identify identify the format and characteristics of the image\n" + " -interlace type type of image interlacing scheme\n" + " -interpolate method pixel color interpolation method\n" + " -limit type value pixel cache resource limit\n" + " -map components one or more pixel components\n" + " -monitor monitor progress\n" + " -quantize colorspace reduce colors in this colorspace\n" + " -quiet suppress all warning messages\n" + " -regard-warnings pay attention to warning messages\n" + " -respect-parentheses settings remain in effect until parenthesis boundary\n" + " -sampling-factor geometry\n" + " horizontal and vertical sampling factor\n" + " -seed value seed a new sequence of pseudo-random numbers\n" + " -set attribute value set an image attribute\n" + " -size geometry width and height of image\n" + " -storage-type type pixel storage type\n" + " -synchronize synchronize image to storage device\n" + " -taint declare the image as modified\n" + " -transparent-color color\n" + " transparent color\n" + " -verbose print detailed information about the image\n" + " -virtual-pixel method\n" + " virtual pixel access method"; + + ListMagickVersion(stdout); + (void) printf("Usage: %s [options ...] input-image raw-image\n", + GetClientName()); + (void) printf("\nImage Settings:\n"); + (void) puts(settings); + (void) printf("\nMiscellaneous Options:\n"); + (void) puts(miscellaneous); + (void) printf( + "\nBy default, the image format of `file' is determined by its magic\n"); + (void) printf( + "number. To specify a particular image format, precede the filename\n"); + (void) printf( + "with an image format name and a colon (i.e. ps:image) or specify the\n"); + (void) printf( + "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); + (void) printf("'-' for standard input or output.\n"); + return(MagickTrue); +} + +WandExport MagickBooleanType StreamImageCommand(ImageInfo *image_info, + int argc,char **argv,char **metadata,ExceptionInfo *exception) +{ +#define DestroyStream() \ +{ \ + DestroyImageStack(); \ + stream_info=DestroyStreamInfo(stream_info); \ + for (i=0; i < (ssize_t) argc; i++) \ + argv[i]=DestroyString(argv[i]); \ + argv=(char **) RelinquishMagickMemory(argv); \ +} +#define ThrowStreamException(asperity,tag,option) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ + option); \ + DestroyStream(); \ + return(MagickFalse); \ +} +#define ThrowStreamInvalidArgumentException(option,argument) \ +{ \ + (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ + "InvalidArgument","`%s': %s",option,argument); \ + DestroyStream(); \ + return(MagickFalse); \ +} + + char + *filename, + *option; + + const char + *format; + + Image + *image; + + ImageStack + image_stack[MaxImageStackDepth+1]; + + MagickBooleanType + fire, + pend, + respect_parenthesis; + + MagickStatusType + status; + + ssize_t + i; + + ssize_t + j, + k; + + StreamInfo + *stream_info; + + /* + Set defaults. + */ + assert(image_info != (ImageInfo *) NULL); + assert(image_info->signature == MagickCoreSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(exception != (ExceptionInfo *) NULL); + (void) metadata; + if (argc == 2) + { + option=argv[1]; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + return(MagickTrue); + } + } + if (argc < 3) + return(StreamUsage()); + format="%w,%h,%m"; + (void) format; + j=1; + k=0; + NewImageStack(); + option=(char *) NULL; + pend=MagickFalse; + respect_parenthesis=MagickFalse; + stream_info=AcquireStreamInfo(image_info); + status=MagickTrue; + /* + Stream an image. + */ + ReadCommandlLine(argc,&argv); + status=ExpandFilenames(&argc,&argv); + if (status == MagickFalse) + ThrowStreamException(ResourceLimitError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + status=OpenStream(image_info,stream_info,argv[argc-1],exception); + if (status == MagickFalse) + { + DestroyStream(); + return(MagickFalse); + } + for (i=1; i < (ssize_t) (argc-1); i++) + { + option=argv[i]; + if (LocaleCompare(option,"(") == 0) + { + FireImageStack(MagickFalse,MagickTrue,pend); + if (k == MaxImageStackDepth) + ThrowStreamException(OptionError,"ParenthesisNestedTooDeeply",option); + PushImageStack(); + continue; + } + if (LocaleCompare(option,")") == 0) + { + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + if (k == 0) + ThrowStreamException(OptionError,"UnableToParseExpression",option); + PopImageStack(); + continue; + } + if (IsCommandOption(option) == MagickFalse) + { + Image + *images; + + /* + Stream input image. + */ + FireImageStack(MagickFalse,MagickFalse,pend); + filename=argv[i]; + if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1))) + filename=argv[++i]; + (void) CopyMagickString(image_info->filename,filename,MaxTextExtent); + images=StreamImage(image_info,stream_info,exception); + status&=(images != (Image *) NULL) && + (exception->severity < ErrorException); + if (images == (Image *) NULL) + continue; + AppendImageStack(images); + continue; + } + pend=image != (Image *) NULL ? MagickTrue : MagickFalse; + switch (*(option+1)) + { + case 'a': + { + if (LocaleCompare("authenticate",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + break; + } + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 'c': + { + if (LocaleCompare("cache",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowStreamInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("channel",option+1) == 0) + { + ssize_t + channel; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + channel=ParseChannelOption(argv[i]); + if (channel < 0) + ThrowStreamException(OptionError,"UnrecognizedChannelType", + argv[i]); + break; + } + if (LocaleCompare("colorspace",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse, + argv[i]); + if (colorspace < 0) + ThrowStreamException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("compress",option+1) == 0) + { + ssize_t + compress; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + compress=ParseCommandOption(MagickCompressOptions,MagickFalse, + argv[i]); + if (compress < 0) + ThrowStreamException(OptionError,"UnrecognizedImageCompression", + argv[i]); + break; + } + if (LocaleCompare("concurrent",option+1) == 0) + break; + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 'd': + { + if (LocaleCompare("debug",option+1) == 0) + { + ssize_t + event; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); + if (event < 0) + ThrowStreamException(OptionError,"UnrecognizedEventType",argv[i]); + (void) SetLogEventMask(argv[i]); + break; + } + if (LocaleCompare("define",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + if (*option == '+') + { + const char + *define; + + define=GetImageOption(image_info,argv[i]); + if (define == (const char *) NULL) + ThrowStreamException(OptionError,"NoSuchOption",argv[i]); + break; + } + break; + } + if (LocaleCompare("density",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowStreamInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("depth",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowStreamInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("duration",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowStreamInvalidArgumentException(option,argv[i]); + break; + } + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 'e': + { + if (LocaleCompare("extract",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowStreamInvalidArgumentException(option,argv[i]); + break; + } + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 'h': + { + if ((LocaleCompare("help",option+1) == 0) || + (LocaleCompare("-help",option+1) == 0)) + { + DestroyStream(); + return(StreamUsage()); + } + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 'i': + { + if (LocaleCompare("identify",option+1) == 0) + break; + if (LocaleCompare("interlace",option+1) == 0) + { + ssize_t + interlace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, + argv[i]); + if (interlace < 0) + ThrowStreamException(OptionError,"UnrecognizedInterlaceType", + argv[i]); + break; + } + if (LocaleCompare("interpolate",option+1) == 0) + { + ssize_t + interpolate; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, + argv[i]); + if (interpolate < 0) + ThrowStreamException(OptionError,"UnrecognizedInterpolateMethod", + argv[i]); + break; + } + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 'l': + { + if (LocaleCompare("limit",option+1) == 0) + { + char + *p; + + double + value; + + ssize_t + resource; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + resource=ParseCommandOption(MagickResourceOptions,MagickFalse, + argv[i]); + if (resource < 0) + ThrowStreamException(OptionError,"UnrecognizedResourceType", + argv[i]); + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + value=StringToDouble(argv[i],&p); + (void) value; + if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) + ThrowStreamInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("list",option+1) == 0) + { + ssize_t + list; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); + if (list < 0) + ThrowStreamException(OptionError,"UnrecognizedListType",argv[i]); + status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) + argv+j,exception); + DestroyStream(); + return(status == 0 ? MagickFalse : MagickTrue); + } + if (LocaleCompare("log",option+1) == 0) + { + if (*option == '+') + break; + i++; + if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL)) + ThrowStreamException(OptionError,"MissingArgument",option); + break; + } + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 'm': + { + if (LocaleCompare("map",option+1) == 0) + { + (void) CopyMagickString(argv[i]+1,"san",MaxTextExtent); + if (*option == '+') + break; + i++; + SetStreamInfoMap(stream_info,argv[i]); + break; + } + if (LocaleCompare("monitor",option+1) == 0) + break; + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 'q': + { + if (LocaleCompare("quantize",option+1) == 0) + { + ssize_t + colorspace; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + colorspace=ParseCommandOption(MagickColorspaceOptions, + MagickFalse,argv[i]); + if (colorspace < 0) + ThrowStreamException(OptionError,"UnrecognizedColorspace", + argv[i]); + break; + } + if (LocaleCompare("quiet",option+1) == 0) + break; + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 'r': + { + if (LocaleCompare("regard-warnings",option+1) == 0) + break; + if (LocaleNCompare("respect-parentheses",option+1,17) == 0) + { + respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; + break; + } + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 's': + { + if (LocaleCompare("sampling-factor",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowStreamInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("seed",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowStreamInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("set",option+1) == 0) + { + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + break; + } + if (LocaleCompare("size",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + if (IsGeometry(argv[i]) == MagickFalse) + ThrowStreamInvalidArgumentException(option,argv[i]); + break; + } + if (LocaleCompare("storage-type",option+1) == 0) + { + ssize_t + type; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + type=ParseCommandOption(MagickStorageOptions,MagickFalse,argv[i]); + if (type < 0) + ThrowStreamException(OptionError,"UnrecognizedStorageType", + argv[i]); + SetStreamInfoStorageType(stream_info,(StorageType) type); + break; + } + if (LocaleCompare("synchronize",option+1) == 0) + break; + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 't': + { + if (LocaleCompare("taint",option+1) == 0) + break; + if (LocaleCompare("transparent-color",option+1) == 0) + { + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + break; + } + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case 'v': + { + if (LocaleCompare("verbose",option+1) == 0) + break; + if ((LocaleCompare("version",option+1) == 0) || + (LocaleCompare("-version",option+1) == 0)) + { + ListMagickVersion(stdout); + break; + } + if (LocaleCompare("virtual-pixel",option+1) == 0) + { + ssize_t + method; + + if (*option == '+') + break; + i++; + if (i == (ssize_t) argc) + ThrowStreamException(OptionError,"MissingArgument",option); + method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, + argv[i]); + if (method < 0) + ThrowStreamException(OptionError,"UnrecognizedVirtualPixelMethod", + argv[i]); + break; + } + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + case '?': + break; + default: + ThrowStreamException(OptionError,"UnrecognizedOption",option) + } + fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & + FireOptionFlag) == 0 ? MagickFalse : MagickTrue; + if (fire != MagickFalse) + FireImageStack(MagickFalse,MagickTrue,MagickTrue); + } + if (k != 0) + ThrowStreamException(OptionError,"UnbalancedParenthesis",argv[i]); + if (i-- != (ssize_t) (argc-1)) + ThrowStreamException(OptionError,"MissingAnImageFilename",argv[i]); + if (image == (Image *) NULL) + ThrowStreamException(OptionError,"MissingAnImageFilename",argv[i]); + FinalizeImageSettings(image_info,image,MagickTrue); + if (image == (Image *) NULL) + ThrowStreamException(OptionError,"MissingAnImageFilename",argv[i]); + DestroyStream(); + return(status != 0 ? MagickTrue : MagickFalse); +} diff --git a/ImageMagick-6.9.12-44/wand/stream.h b/ImageMagick-6.9.12-44/wand/stream.h new file mode 100644 index 0000000..4fe9b85 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/stream.h @@ -0,0 +1,32 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand montage command-line method. +*/ +#ifndef MAGICKWAND_STREAM_H +#define MAGICKWAND_STREAM_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport MagickBooleanType + StreamImageCommand(ImageInfo *,int,char **,char **,ExceptionInfo *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/studio.h b/ImageMagick-6.9.12-44/wand/studio.h new file mode 100644 index 0000000..f110e26 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/studio.h @@ -0,0 +1,366 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand private application programming interface declarations. +*/ +#ifndef MAGICKWAND_STUDIO_H +#define MAGICKWAND_STUDIO_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if defined(WIN32) || defined(WIN64) +# define MAGICKWAND_WINDOWS_SUPPORT +#else +# define MAGICKWAND_POSIX_SUPPORT +#endif + +#define MAGICKWAND_IMPLEMENTATION 1 + +#if !defined(MAGICKWAND_CONFIG_H) +# define MAGICKWAND_CONFIG_H +# if !defined(vms) && !defined(macintosh) +# include "magick/magick-config.h" +# else +# include "magick-config.h" +# endif +#if defined(MAGICKCORE__FILE_OFFSET_BITS) && !defined(_FILE_OFFSET_BITS) +# define _FILE_OFFSET_BITS MAGICKCORE__FILE_OFFSET_BITS +#endif +#if defined(_magickcore_const) && !defined(const) +# define const _magickcore_const +#endif +#if defined(_magickcore_inline) && !defined(inline) +# define inline _magickcore_inline +#endif +# if defined(__cplusplus) || defined(c_plusplus) +# undef inline +# endif +#endif + +#if !defined(const) +# define STDC +#endif + +#include +#include +#if defined(MAGICKCORE_HAVE_SYS_STAT_H) +# include +#endif +#if defined(MAGICKCORE_STDC_HEADERS) +# include +# include +#else +# if defined(MAGICKCORE_HAVE_STDLIB_H) +# include +# endif +#endif +#if !defined(magick_restrict) +# if !defined(_magickcore_restrict) +# define magick_restrict restrict +# else +# define magick_restrict _magickcore_restrict +# endif +#endif +#if defined(MAGICKCORE_HAVE_STRING_H) +# if !defined(STDC_HEADERS) && defined(MAGICKCORE_HAVE_MEMORY_H) +# include +# endif +# include +#endif +#if defined(MAGICKCORE_HAVE_STRINGS_H) +# include +#endif +#if defined(MAGICKCORE_HAVE_INTTYPES_H) +# include +#endif +#if defined(MAGICKCORE_HAVE_STDINT_H) +# include +#endif +#if defined(MAGICKCORE_HAVE_UNISTD_H) +# include +#endif +#if defined(MAGICKWAND_WINDOWS_SUPPORT) && defined(_DEBUG) +#define _CRTDBG_MAP_ALLOC +#endif + +#if defined(MAGICKWAND_WINDOWS_SUPPORT) && defined(_DEBUG) +#define _CRTDBG_MAP_ALLOC +#endif +#if defined(MAGICKWAND_WINDOWS_SUPPORT) +# include +#if !defined(__CYGWIN__) +# include +#endif +# if !defined(MAGICKCORE_HAVE_STRERROR) +# define HAVE_STRERROR +# endif +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(MAGICKCORE_HAVE_XLOCALE_H) +# include +#endif +#if defined(MAGICKCORE_THREAD_SUPPORT) +# include +#endif +#if defined(MAGICKCORE_HAVE_SYS_SYSLIMITS_H) +# include +#endif +#if defined(MAGICKCORE_HAVE_ARM_LIMITS_H) +# include +#endif + +#if defined(MAGICKCORE_HAVE_CL_CL_H) && !defined(MAGICK_PIXEL_RGBA) +# include +# define MAGICKCORE_OPENCL_SUPPORT 1 +#endif +#if defined(MAGICKCORE_HAVE_OPENCL_CL_H) && !defined(MAGICK_PIXEL_RGBA) +# include +# define MAGICKCORE_OPENCL_SUPPORT 1 +#endif + +#if defined(_OPENMP) && ((_OPENMP >= 200203) || defined(__OPENCC__)) +# include +# define MAGICKCORE_OPENMP_SUPPORT 1 +#endif + +#if defined(MAGICKCORE_HAVE_PREAD) && defined(MAGICKCORE_HAVE_DECL_PREAD) && !MAGICKCORE_HAVE_DECL_PREAD +ssize_t pread(int,void *,size_t,off_t); +#endif + +#if defined(MAGICKCORE_HAVE_PWRITE) && defined(MAGICKCORE_HAVE_DECL_PWRITE) && !MAGICKCORE_HAVE_DECL_PWRITE +ssize_t pwrite(int,const void *,size_t,off_t); +#endif + +#if defined(MAGICKCORE_HAVE_STRLCPY) && defined(MAGICKCORE_HAVE_DECL_STRLCPY) && !MAGICKCORE_HAVE_DECL_STRLCPY +extern size_t strlcpy(char *,const char *,size_t); +#endif + +#if defined(MAGICKCORE_HAVE_VSNPRINTF) && defined(MAGICKCORE_HAVE_DECL_VSNPRINTF) && !MAGICKCORE_HAVE_DECL_VSNPRINTF +extern int vsnprintf(char *,size_t,const char *,va_list); +#endif + +#if defined(MAGICKWAND_WINDOWS_SUPPORT) || defined(MAGICKWAND_POSIX_SUPPORT) +# include +# include +# if defined(MAGICKWAND_POSIX_SUPPORT) +# if defined(MAGICKCORE_HAVE_SYS_NDIR_H) || defined(MAGICKCORE_HAVE_SYS_DIR_H) || defined(MAGICKCORE_HAVE_NDIR_H) +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# if defined(MAGICKCORE_HAVE_SYS_NDIR_H) +# include +# endif +# if defined(MAGICKCORE_HAVE_SYS_DIR_H) +# include +# endif +# if defined(MAGICKCORE_HAVE_NDIR_H) +# include +# endif +# else +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +# endif +# include +# include +# endif +# if !defined(S_ISDIR) +# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +# endif +# if !defined(S_ISREG) +# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) +# endif +# include "wand/MagickWand.h" +# if !defined(MAGICKWAND_WINDOWS_SUPPORT) +# include +# if defined(MAGICKCORE_HAVE_SYS_TIMES_H) +# include +# endif +# if defined(MAGICKCORE_HAVE_SYS_RESOURCE_H) +# include +# endif +# if defined(MAGICKCORE_HAVE_SYS_MMAN_H) +# include +# endif +# if defined(MAGICKCORE_HAVE_SYS_SENDFILE_H) +# include +# endif +#endif +#else +# include +# include +# if defined(macintosh) +# if !defined(DISABLE_SIOUX) +# include +# include +# endif +# include +# endif +#endif + +#if defined(S_IRUSR) && defined(S_IWUSR) +# define S_MODE (S_IRUSR | S_IWUSR) +#elif defined (MAGICKWAND_WINDOWS_SUPPORT) +# define S_MODE (_S_IREAD | _S_IWRITE) +#else +# define S_MODE 0600 +#endif + +#if defined(MAGICKWAND_WINDOWS_SUPPORT) +# include "magick/nt-base.h" +#endif +#if defined(macintosh) +# include "magick/mac.h" +#endif +#if defined(vms) +# include "magick/vms.h" +#endif + +#include "wand/MagickWand.h" + +#undef HAVE_CONFIG_H +#undef gamma +#undef index +#undef pipe +#undef y1 + +/* + Review these platform specific definitions. +*/ +#if defined(MAGICKWAND_POSIX_SUPPORT) && !defined(__OS2__) +# define DirectorySeparator "/" +# define DirectoryListSeparator ':' +# define EditorOptions " -title \"Edit Image Comment\" -e vi" +# define Exit exit +# define IsBasenameSeparator(c) ((c) == '/' ? MagickTrue : MagickFalse) +# define X11_PREFERENCES_PATH "~/." +# define ProcessPendingEvents(text) +# define ReadCommandlLine(argc,argv) +# define SetNotifyHandlers +#else +# if defined(vms) +# define X11_APPLICATION_PATH "decw$system_defaults:" +# define DirectorySeparator "" +# define DirectoryListSeparator ';' +# define EditorOptions "" +# define Exit exit +# define IsBasenameSeparator(c) \ + (((c) == ']') || ((c) == ':') || ((c) == '/') ? MagickTrue : MagickFalse) +# define MAGICKCORE_LIBRARY_PATH "sys$login:" +# define MAGICKCORE_SHARE_PATH "sys$login:" +# define X11_PREFERENCES_PATH "decw$user_defaults:" +# define ProcessPendingEvents(text) +# define ReadCommandlLine(argc,argv) +# define SetNotifyHandlers +# endif +# if defined(__OS2__) +# define DirectorySeparator "\\" +# define DirectoryListSeparator ';' +# define EditorOptions " -title \"Edit Image Comment\" -e vi" +# define Exit exit +# define IsBasenameSeparator(c) \ + (((c) == '/') || ((c) == '\\') ? MagickTrue : MagickFalse) +# define PreferencesDefaults "~\." +# define ProcessPendingEvents(text) +# define ReadCommandlLine(argc,argv) +# define SetNotifyHandlers +#endif +# if defined(macintosh) +# define X11_APPLICATION_PATH "/usr/lib/X11/app-defaults/" +# define DirectorySeparator ":" +# define DirectoryListSeparator ';' +# define EditorOptions "" +# define IsBasenameSeparator(c) ((c) == ':' ? MagickTrue : MagickFalse) +# define MAGICKCORE_LIBRARY_PATH "" +# define MAGICKCORE_SHARE_PATH "" +# define X11_PREFERENCES_PATH "~/." +# if defined(DISABLE_SIOUX) +# define ReadCommandlLine(argc,argv) +# define SetNotifyHandlers \ + SetFatalErrorHandler(MacFatalErrorHandler); \ + SetErrorHandler(MACErrorHandler); \ + SetWarningHandler(MACWarningHandler) +# else +# define ReadCommandlLine(argc,argv) argc=ccommand(argv); puts(MagickVersion); +# define SetNotifyHandlers \ + SetErrorHandler(MACErrorHandler); \ + SetWarningHandler(MACWarningHandler) +# endif +# endif +# if defined(MAGICKWAND_WINDOWS_SUPPORT) +# define DirectorySeparator "\\" +# define DirectoryListSeparator ';' +# define EditorOptions "" +# define IsBasenameSeparator(c) \ + (((c) == '/') || ((c) == '\\') ? MagickTrue : MagickFalse) +# define ProcessPendingEvents(text) +# if !defined(X11_PREFERENCES_PATH) +# define X11_PREFERENCES_PATH "~\\." +# endif +# define ReadCommandlLine(argc,argv) +# define SetNotifyHandlers \ + SetErrorHandler(NTErrorHandler); \ + SetWarningHandler(NTWarningHandler) +# if !defined(MAGICKCORE_HAVE_TIFFCONF_H) +# define HAVE_TIFFCONF_H +# endif +# endif + +#endif + +/* + Define system symbols if not already defined. +*/ +#if !defined(STDIN_FILENO) +#define STDIN_FILENO 0x00 +#endif + +#if !defined(O_BINARY) +#define O_BINARY 0x00 +#endif + +#if !defined(PATH_MAX) +#define PATH_MAX 4096 +#endif + +/* + Magick defines. +*/ +#define MAGICK_SSIZE_MAX (SSIZE_MAX) +#define MAGICK_SSIZE_MIN (-(SSIZE_MAX)-1) +#if defined(_MSC_VER) +# define DisableMSCWarning(nr) __pragma(warning(push)) \ + __pragma(warning(disable:nr)) +# define RestoreMSCWarning __pragma(warning(pop)) +#else +# define DisableMSCWarning(nr) +# define RestoreMSCWarning +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/wand-view.c b/ImageMagick-6.9.12-44/wand/wand-view.c new file mode 100644 index 0000000..5956d5f --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/wand-view.c @@ -0,0 +1,1401 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% W W AAA N N DDDD % +% W W A A NN N D D % +% W W W AAAAA N N N D D % +% WW WW A A N NN D D % +% W W A A N N DDDD % +% % +% V V IIIII EEEEE W W % +% V V I E W W % +% V V I EEE W W W % +% V V I E WW WW % +% V IIIII EEEEE W W % +% % +% % +% MagickWand Wand View Methods % +% % +% Software Design % +% Cristy % +% March 2003 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/magick-wand-private.h" +#include "wand/wand.h" +#include "magick/monitor-private.h" +#include "magick/thread-private.h" +/* + Define declarations. +*/ +#define WandViewId "WandView" + +/* + Typedef declarations. +*/ +struct _WandView +{ + size_t + id; + + char + name[MaxTextExtent], + *description; + + RectangleInfo + extent; + + MagickWand + *wand; + + CacheView + *view; + + size_t + number_threads; + + PixelWand + ***pixel_wands; + + ExceptionInfo + *exception; + + MagickBooleanType + debug; + + size_t + signature; +}; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C l o n e W a n d V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CloneWandView() makes a copy of the specified wand view. +% +% The format of the CloneWandView method is: +% +% WandView *CloneWandView(const WandView *wand_view) +% +% A description of each parameter follows: +% +% o wand_view: the wand view. +% +*/ +WandExport WandView *CloneWandView(const WandView *wand_view) +{ + WandView + *clone_view; + + ssize_t + i; + + assert(wand_view != (WandView *) NULL); + assert(wand_view->signature == WandSignature); + if (wand_view->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand_view->name); + clone_view=(WandView *) AcquireCriticalMemory(sizeof(*clone_view)); + (void) memset(clone_view,0,sizeof(*clone_view)); + clone_view->id=AcquireWandId(); + (void) FormatLocaleString(clone_view->name,MaxTextExtent,"%s-%.20g", + WandViewId,(double) clone_view->id); + clone_view->description=ConstantString(wand_view->description); + clone_view->view=CloneCacheView(wand_view->view); + clone_view->extent=wand_view->extent; + clone_view->number_threads=wand_view->number_threads; + clone_view->exception=AcquireExceptionInfo(); + InheritException(clone_view->exception,wand_view->exception); + for (i=0; i < (ssize_t) wand_view->number_threads; i++) + clone_view->pixel_wands[i]=ClonePixelWands((const PixelWand **) + wand_view->pixel_wands[i],wand_view->extent.width); + clone_view->debug=wand_view->debug; + if (clone_view->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_view->name); + clone_view->signature=WandSignature; + return(clone_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y W a n d V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyWandView() deallocates memory associated with a wand view. +% +% The format of the DestroyWandView method is: +% +% WandView *DestroyWandView(WandView *wand_view) +% +% A description of each parameter follows: +% +% o wand_view: the wand view. +% +*/ + +static PixelWand ***DestroyPixelsTLS(PixelWand ***pixel_wands, + const size_t number_wands,const size_t number_threads) +{ + ssize_t + i; + + assert(pixel_wands != (PixelWand ***) NULL); + for (i=0; i < (ssize_t) number_threads; i++) + if (pixel_wands[i] != (PixelWand **) NULL) + pixel_wands[i]=DestroyPixelWands(pixel_wands[i],number_wands); + pixel_wands=(PixelWand ***) RelinquishMagickMemory(pixel_wands); + return(pixel_wands); +} + +WandExport WandView *DestroyWandView(WandView *wand_view) +{ + assert(wand_view != (WandView *) NULL); + assert(wand_view->signature == WandSignature); + wand_view->pixel_wands=DestroyPixelsTLS(wand_view->pixel_wands, + wand_view->extent.width,wand_view->number_threads); + wand_view->view=DestroyCacheView(wand_view->view); + wand_view->exception=DestroyExceptionInfo(wand_view->exception); + wand_view->signature=(~WandSignature); + RelinquishWandId(wand_view->id); + wand_view=(WandView *) RelinquishMagickMemory(wand_view); + return(wand_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D u p l e x T r a n s f e r W a n d V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DuplexTransferWandViewIterator() iterates over three wand views in +% parallel and calls your transfer method for each scanline of the view. The +% source and duplex pixel extent is not confined to the image canvas-- that is +% you can include negative offsets or widths or heights that exceed the image +% dimension. However, the destination wand view is confined to the image +% canvas-- that is no negative offsets or widths or heights that exceed the +% image dimension are permitted. +% +% The callback signature is: +% +% MagickBooleanType DuplexTransferImageViewMethod(const WandView *source, +% const WandView *duplex,WandView *destination,const ssize_t y, +% const int thread_id,void *context) +% +% Use this pragma if the view is not single threaded: +% +% #pragma omp critical +% +% to define a section of code in your callback transfer method that must be +% executed by a single thread at a time. +% +% The format of the DuplexTransferWandViewIterator method is: +% +% MagickBooleanType DuplexTransferWandViewIterator(WandView *source, +% WandView *duplex,WandView *destination, +% DuplexTransferWandViewMethod transfer,void *context) +% +% A description of each parameter follows: +% +% o source: the source wand view. +% +% o duplex: the duplex wand view. +% +% o destination: the destination wand view. +% +% o transfer: the transfer callback method. +% +% o context: the user defined context. +% +*/ +WandExport MagickBooleanType DuplexTransferWandViewIterator(WandView *source, + WandView *duplex,WandView *destination,DuplexTransferWandViewMethod transfer, + void *context) +{ + ExceptionInfo + *exception; + + Image + *destination_image, + *duplex_image, + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + size_t + height; +#endif + + ssize_t + y; + + assert(source != (WandView *) NULL); + assert(source->signature == WandSignature); + if (transfer == (DuplexTransferWandViewMethod) NULL) + return(MagickFalse); + source_image=source->wand->images; + duplex_image=duplex->wand->images; + destination_image=destination->wand->images; + if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=destination->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + height=(size_t) (source->extent.height-source->extent.y); + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(source_image,destination_image,height,1) +#endif + for (y=source->extent.y; y < (ssize_t) source->extent.height; y++) + { + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + sync; + + const IndexPacket + *magick_restrict duplex_indexes, + *magick_restrict indexes; + + const PixelPacket + *magick_restrict duplex_pixels, + *magick_restrict pixels; + + IndexPacket + *magick_restrict destination_indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict destination_pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewVirtualPixels(source->view,source->extent.x,y, + source->extent.width,1,source->exception); + if (pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(source->view); + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x); + if (source_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetBlackQuantum(source->pixel_wands[id][x], + GetPixelBlack(indexes+x)); + if (source_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetIndex(source->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + duplex_pixels=GetCacheViewVirtualPixels(duplex->view,duplex->extent.x,y, + duplex->extent.width,1,duplex->exception); + if (duplex_pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + duplex_indexes=GetCacheViewVirtualIndexQueue(duplex->view); + for (x=0; x < (ssize_t) duplex->extent.width; x++) + PixelSetQuantumColor(duplex->pixel_wands[id][x],duplex_pixels+x); + if (duplex_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) duplex->extent.width; x++) + PixelSetBlackQuantum(duplex->pixel_wands[id][x], + GetPixelBlack(duplex_indexes+x)); + if (duplex_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) duplex->extent.width; x++) + PixelSetIndex(duplex->pixel_wands[id][x], + GetPixelIndex(duplex_indexes+x)); + destination_pixels=GetCacheViewAuthenticPixels(destination->view, + destination->extent.x,y,destination->extent.width,1,exception); + if (destination_pixels == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + destination_indexes=GetCacheViewAuthenticIndexQueue(destination->view); + for (x=0; x < (ssize_t) destination->extent.width; x++) + PixelSetQuantumColor(destination->pixel_wands[id][x], + destination_pixels+x); + if (destination_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) destination->extent.width; x++) + PixelSetBlackQuantum(destination->pixel_wands[id][x], + GetPixelBlack(destination_indexes+x)); + if (destination_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) destination->extent.width; x++) + PixelSetIndex(destination->pixel_wands[id][x], + GetPixelIndex(destination_indexes+x)); + if (transfer(source,duplex,destination,y,id,context) == MagickFalse) + status=MagickFalse; + for (x=0; x < (ssize_t) destination->extent.width; x++) + PixelGetQuantumColor(destination->pixel_wands[id][x], + destination_pixels+x); + if (destination_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) destination->extent.width; x++) + SetPixelBlack(destination_indexes+x,PixelGetBlackQuantum( + destination->pixel_wands[id][x])); + sync=SyncCacheViewAuthenticPixels(destination->view,exception); + if (sync == MagickFalse) + { + InheritException(destination->exception,GetCacheViewException( + source->view)); + status=MagickFalse; + } + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,source->description,progress, + source->extent.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t W a n d V i e w E x c e p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetWandViewException() returns the severity, reason, and description of any +% error that occurs when utilizing a wand view. +% +% The format of the GetWandViewException method is: +% +% char *GetWandViewException(const WandView *wand_view, +% ExceptionType *severity) +% +% A description of each parameter follows: +% +% o wand_view: the pixel wand_view. +% +% o severity: the severity of the error is returned here. +% +*/ +WandExport char *GetWandViewException(const WandView *wand_view, + ExceptionType *severity) +{ + char + *description; + + assert(wand_view != (const WandView *) NULL); + assert(wand_view->signature == WandSignature); + if (wand_view->debug != MagickFalse) + (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand_view->name); + assert(severity != (ExceptionType *) NULL); + *severity=wand_view->exception->severity; + description=(char *) AcquireQuantumMemory(2UL*MaxTextExtent, + sizeof(*description)); + if (description == (char *) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + wand_view->name); + *description='\0'; + if (wand_view->exception->reason != (char *) NULL) + (void) CopyMagickString(description,GetLocaleExceptionMessage( + wand_view->exception->severity,wand_view->exception->reason), + MaxTextExtent); + if (wand_view->exception->description != (char *) NULL) + { + (void) ConcatenateMagickString(description," (",MaxTextExtent); + (void) ConcatenateMagickString(description,GetLocaleExceptionMessage( + wand_view->exception->severity,wand_view->exception->description), + MaxTextExtent); + (void) ConcatenateMagickString(description,")",MaxTextExtent); + } + return(description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t W a n d V i e w E x t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetWandViewExtent() returns the wand view extent. +% +% The format of the GetWandViewExtent method is: +% +% RectangleInfo GetWandViewExtent(const WandView *wand_view) +% +% A description of each parameter follows: +% +% o wand_view: the wand view. +% +*/ +WandExport RectangleInfo GetWandViewExtent(const WandView *wand_view) +{ + assert(wand_view != (WandView *) NULL); + assert(wand_view->signature == WandSignature); + return(wand_view->extent); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t W a n d V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetWandViewIterator() iterates over the wand view in parallel and calls +% your get method for each scanline of the view. The pixel extent is +% not confined to the image canvas-- that is you can include negative offsets +% or widths or heights that exceed the image dimension. Any updates to +% the pixels in your callback are ignored. +% +% The callback signature is: +% +% MagickBooleanType GetImageViewMethod(const WandView *source, +% const ssize_t y,const int thread_id,void *context) +% +% Use this pragma if the view is not single threaded: +% +% #pragma omp critical +% +% to define a section of code in your callback get method that must be +% executed by a single thread at a time. +% +% The format of the GetWandViewIterator method is: +% +% MagickBooleanType GetWandViewIterator(WandView *source, +% GetWandViewMethod get,void *context) +% +% A description of each parameter follows: +% +% o source: the source wand view. +% +% o get: the get callback method. +% +% o context: the user defined context. +% +*/ +WandExport MagickBooleanType GetWandViewIterator(WandView *source, + GetWandViewMethod get,void *context) +{ + Image + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + size_t + height; +#endif + + ssize_t + y; + + assert(source != (WandView *) NULL); + assert(source->signature == WandSignature); + if (get == (GetWandViewMethod) NULL) + return(MagickFalse); + source_image=source->wand->images; + status=MagickTrue; + progress=0; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + height=(size_t) (source->extent.height-source->extent.y); + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(source_image,source_image,height,1) +#endif + for (y=source->extent.y; y < (ssize_t) source->extent.height; y++) + { + const int + id = GetOpenMPThreadId(); + + const IndexPacket + *indexes; + + const PixelPacket + *pixels; + + ssize_t + x; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewVirtualPixels(source->view,source->extent.x,y, + source->extent.width,1,source->exception); + if (pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(source->view); + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x); + if (source_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetBlackQuantum(source->pixel_wands[id][x], + GetPixelBlack(indexes+x)); + if (source_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetIndex(source->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + if (get(source,y,id,context) == MagickFalse) + status=MagickFalse; + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,source->description,progress, + source->extent.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t W a n d V i e w P i x e l s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetWandViewPixels() returns the wand view pixel_wands. +% +% The format of the GetWandViewPixels method is: +% +% PixelWand *GetWandViewPixels(const WandView *wand_view) +% +% A description of each parameter follows: +% +% o wand_view: the wand view. +% +*/ +WandExport PixelWand **GetWandViewPixels(const WandView *wand_view) +{ + const int + id = GetOpenMPThreadId(); + + assert(wand_view != (WandView *) NULL); + assert(wand_view->signature == WandSignature); + return(wand_view->pixel_wands[id]); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% G e t W a n d V i e w W a n d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetWandViewWand() returns the magick wand associated with the wand view. +% +% The format of the GetWandViewWand method is: +% +% MagickWand *GetWandViewWand(const WandView *wand_view) +% +% A description of each parameter follows: +% +% o wand_view: the wand view. +% +*/ +WandExport MagickWand *GetWandViewWand(const WandView *wand_view) +{ + assert(wand_view != (WandView *) NULL); + assert(wand_view->signature == WandSignature); + return(wand_view->wand); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s W a n d V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsWandView() returns MagickTrue if the parameter is verified as a wand +% view object. +% +% The format of the IsWandView method is: +% +% MagickBooleanType IsWandView(const WandView *wand_view) +% +% A description of each parameter follows: +% +% o wand_view: the wand view. +% +*/ +WandExport MagickBooleanType IsWandView(const WandView *wand_view) +{ + size_t + length; + + if (wand_view == (const WandView *) NULL) + return(MagickFalse); + if (wand_view->signature != WandSignature) + return(MagickFalse); + length=strlen(WandViewId); + if (LocaleNCompare(wand_view->name,WandViewId,length) != 0) + return(MagickFalse); + return(MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w W a n d V i e w % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewWandView() returns a wand view required for all other methods in the +% Wand View API. +% +% The format of the NewWandView method is: +% +% WandView *NewWandView(MagickWand *wand) +% +% A description of each parameter follows: +% +% o wand: the wand. +% +*/ + +static PixelWand ***AcquirePixelsTLS(const size_t number_wands, + const size_t number_threads) +{ + PixelWand + ***pixel_wands; + + ssize_t + i; + + pixel_wands=(PixelWand ***) AcquireQuantumMemory(number_threads, + sizeof(*pixel_wands)); + if (pixel_wands == (PixelWand ***) NULL) + return((PixelWand ***) NULL); + (void) memset(pixel_wands,0,number_threads*sizeof(*pixel_wands)); + for (i=0; i < (ssize_t) number_threads; i++) + { + pixel_wands[i]=NewPixelWands(number_wands); + if (pixel_wands[i] == (PixelWand **) NULL) + return(DestroyPixelsTLS(pixel_wands,number_wands,number_threads)); + } + return(pixel_wands); +} + +WandExport WandView *NewWandView(MagickWand *wand) +{ + WandView + *wand_view; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + wand_view=(WandView *) AcquireCriticalMemory(sizeof(*wand_view)); + (void) memset(wand_view,0,sizeof(*wand_view)); + wand_view->id=AcquireWandId(); + (void) FormatLocaleString(wand_view->name,MaxTextExtent,"%s-%.20g", + WandViewId,(double) wand_view->id); + wand_view->description=ConstantString("WandView"); + wand_view->wand=wand; + wand_view->exception=AcquireExceptionInfo(); + wand_view->view=AcquireVirtualCacheView(wand_view->wand->images, + wand_view->exception); + wand_view->extent.width=wand->images->columns; + wand_view->extent.height=wand->images->rows; + wand_view->number_threads=GetOpenMPMaximumThreads(); + wand_view->pixel_wands=AcquirePixelsTLS(wand_view->extent.width, + wand_view->number_threads); + if (wand_view->pixel_wands == (PixelWand ***) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + wand_view->debug=IsEventLogging(); + wand_view->signature=WandSignature; + return(wand_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% N e w W a n d V i e w E x t e n t % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% NewWandViewExtent() returns a wand view required for all other methods +% in the Wand View API. +% +% The format of the NewWandViewExtent method is: +% +% WandView *NewWandViewExtent(MagickWand *wand,const ssize_t x, +% const ssize_t y,const size_t width,const size_t height) +% +% A description of each parameter follows: +% +% o wand: the magick wand. +% +% o x,y,columns,rows: These values define the perimeter of a extent of +% pixel_wands view. +% +*/ +WandExport WandView *NewWandViewExtent(MagickWand *wand,const ssize_t x, + const ssize_t y,const size_t width,const size_t height) +{ + WandView + *wand_view; + + assert(wand != (MagickWand *) NULL); + assert(wand->signature == WandSignature); + wand_view=(WandView *) AcquireCriticalMemory(sizeof(*wand_view)); + (void) memset(wand_view,0,sizeof(*wand_view)); + wand_view->id=AcquireWandId(); + (void) FormatLocaleString(wand_view->name,MaxTextExtent,"%s-%.20g", + WandViewId,(double) wand_view->id); + wand_view->description=ConstantString("WandView"); + wand_view->exception=AcquireExceptionInfo(); + wand_view->view=AcquireVirtualCacheView(wand_view->wand->images, + wand_view->exception); + wand_view->wand=wand; + wand_view->extent.width=width; + wand_view->extent.height=height; + wand_view->extent.x=x; + wand_view->extent.y=y; + wand_view->number_threads=GetOpenMPMaximumThreads(); + wand_view->pixel_wands=AcquirePixelsTLS(wand_view->extent.width, + wand_view->number_threads); + if (wand_view->pixel_wands == (PixelWand ***) NULL) + ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed", + GetExceptionMessage(errno)); + wand_view->debug=IsEventLogging(); + wand_view->signature=WandSignature; + return(wand_view); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t W a n d V i e w D e s c r i p t i o n % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetWandViewDescription() associates a description with an image view. +% +% The format of the SetWandViewDescription method is: +% +% void SetWandViewDescription(WandView *image_view,const char *description) +% +% A description of each parameter follows: +% +% o wand_view: the wand view. +% +% o description: the wand view description. +% +*/ +MagickExport void SetWandViewDescription(WandView *wand_view, + const char *description) +{ + assert(wand_view != (WandView *) NULL); + assert(wand_view->signature == WandSignature); + wand_view->description=ConstantString(description); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t W a n d V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetWandViewIterator() iterates over the wand view in parallel and calls +% your set method for each scanline of the view. The pixel extent is +% confined to the image canvas-- that is no negative offsets or widths or +% heights that exceed the image dimension. The pixels are initiallly +% undefined and any settings you make in the callback method are automagically +% synced back to your image. +% +% The callback signature is: +% +% MagickBooleanType SetImageViewMethod(ImageView *destination, +% const ssize_t y,const int thread_id,void *context) +% +% Use this pragma if the view is not single threaded: +% +% #pragma omp critical +% +% to define a section of code in your callback set method that must be +% executed by a single thread at a time. +% +% The format of the SetWandViewIterator method is: +% +% MagickBooleanType SetWandViewIterator(WandView *destination, +% SetWandViewMethod set,void *context) +% +% A description of each parameter follows: +% +% o destination: the wand view. +% +% o set: the set callback method. +% +% o context: the user defined context. +% +*/ +WandExport MagickBooleanType SetWandViewIterator(WandView *destination, + SetWandViewMethod set,void *context) +{ + ExceptionInfo + *exception; + + Image + *destination_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + size_t + height; +#endif + + ssize_t + y; + + assert(destination != (WandView *) NULL); + assert(destination->signature == WandSignature); + if (set == (SetWandViewMethod) NULL) + return(MagickFalse); + destination_image=destination->wand->images; + if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=destination->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + height=(size_t) (destination->extent.height-destination->extent.y); + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(destination_image,destination_image,height,1) +#endif + for (y=destination->extent.y; y < (ssize_t) destination->extent.height; y++) + { + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + sync; + + IndexPacket + *magick_restrict indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewAuthenticPixels(destination->view,destination->extent.x, + y,destination->extent.width,1,exception); + if (pixels == (PixelPacket *) NULL) + { + InheritException(destination->exception,GetCacheViewException( + destination->view)); + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(destination->view); + if (set(destination,y,id,context) == MagickFalse) + status=MagickFalse; + for (x=0; x < (ssize_t) destination->extent.width; x++) + PixelGetQuantumColor(destination->pixel_wands[id][x],pixels+x); + if (destination_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) destination->extent.width; x++) + SetPixelBlack(indexes+x,PixelGetBlackQuantum( + destination->pixel_wands[id][x])); + sync=SyncCacheViewAuthenticPixels(destination->view,exception); + if (sync == MagickFalse) + { + InheritException(destination->exception,GetCacheViewException( + destination->view)); + status=MagickFalse; + } + if (destination_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(destination_image,destination->description, + progress,destination->extent.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% S e t W a n d V i e w T h r e a d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SetWandViewThreads() sets the number of threads in a thread team. +% +% The format of the SetWandViewDescription method is: +% +% void SetWandViewThreads(WandView *image_view, +% const size_t number_threads) +% +% A description of each parameter follows: +% +% o image_view: the image view. +% +% o number_threads: the number of threads in a thread team. +% +*/ +MagickExport void SetWandViewThreads(WandView *image_view, + const size_t number_threads) +{ + assert(image_view != (WandView *) NULL); + assert(image_view->signature == MagickCoreSignature); + image_view->number_threads=number_threads; + if (number_threads > (size_t) GetMagickResourceLimit(ThreadResource)) + image_view->number_threads=GetOpenMPMaximumThreads(); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% T r a n s f e r W a n d V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% TransferWandViewIterator() iterates over two wand views in parallel and +% calls your transfer method for each scanline of the view. The source pixel +% extent is not confined to the image canvas-- that is you can include +% negative offsets or widths or heights that exceed the image dimension. +% However, the destination wand view is confined to the image canvas-- that +% is no negative offsets or widths or heights that exceed the image dimension +% are permitted. +% +% The callback signature is: +% +% MagickBooleanType TransferImageViewMethod(const WandView *source, +% WandView *destination,const ssize_t y,const int thread_id, +% void *context) +% +% Use this pragma if the view is not single threaded: +% +% #pragma omp critical +% +% to define a section of code in your callback transfer method that must be +% executed by a single thread at a time. +% +% The format of the TransferWandViewIterator method is: +% +% MagickBooleanType TransferWandViewIterator(WandView *source, +% WandView *destination,TransferWandViewMethod transfer,void *context) +% +% A description of each parameter follows: +% +% o source: the source wand view. +% +% o destination: the destination wand view. +% +% o transfer: the transfer callback method. +% +% o context: the user defined context. +% +*/ +WandExport MagickBooleanType TransferWandViewIterator(WandView *source, + WandView *destination,TransferWandViewMethod transfer,void *context) +{ + ExceptionInfo + *exception; + + Image + *destination_image, + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + size_t + height; +#endif + + ssize_t + y; + + assert(source != (WandView *) NULL); + assert(source->signature == WandSignature); + if (transfer == (TransferWandViewMethod) NULL) + return(MagickFalse); + source_image=source->wand->images; + destination_image=destination->wand->images; + if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=destination->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + height=(size_t) (source->extent.height-source->extent.y); + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(source_image,destination_image,height,1) +#endif + for (y=source->extent.y; y < (ssize_t) source->extent.height; y++) + { + const int + id = GetOpenMPThreadId(); + + MagickBooleanType + sync; + + const IndexPacket + *magick_restrict indexes; + + const PixelPacket + *magick_restrict pixels; + + IndexPacket + *magick_restrict destination_indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict destination_pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewVirtualPixels(source->view,source->extent.x,y, + source->extent.width,1,source->exception); + if (pixels == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewVirtualIndexQueue(source->view); + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x); + if (source_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetBlackQuantum(source->pixel_wands[id][x], + GetPixelBlack(indexes+x)); + if (source_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetIndex(source->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + destination_pixels=GetCacheViewAuthenticPixels(destination->view, + destination->extent.x,y,destination->extent.width,1,exception); + if (destination_pixels == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + destination_indexes=GetCacheViewAuthenticIndexQueue(destination->view); + for (x=0; x < (ssize_t) destination->extent.width; x++) + PixelSetQuantumColor(destination->pixel_wands[id][x],pixels+x); + if (destination_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) destination->extent.width; x++) + PixelSetBlackQuantum(destination->pixel_wands[id][x], + GetPixelBlack(indexes+x)); + if (destination_image->storage_class == PseudoClass) + for (x=0; x < (ssize_t) destination->extent.width; x++) + PixelSetIndex(destination->pixel_wands[id][x], + GetPixelIndex(indexes+x)); + if (transfer(source,destination,y,id,context) == MagickFalse) + status=MagickFalse; + for (x=0; x < (ssize_t) destination->extent.width; x++) + PixelGetQuantumColor(destination->pixel_wands[id][x], + destination_pixels+x); + if (destination_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) destination->extent.width; x++) + SetPixelBlack(destination_indexes+x,PixelGetBlackQuantum( + destination->pixel_wands[id][x])); + sync=SyncCacheViewAuthenticPixels(destination->view,exception); + if (sync == MagickFalse) + { + InheritException(destination->exception,GetCacheViewException( + source->view)); + status=MagickFalse; + } + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,source->description,progress, + source->extent.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U p d a t e W a n d V i e w I t e r a t o r % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UpdateWandViewIterator() iterates over the wand view in parallel and calls +% your update method for each scanline of the view. The pixel extent is +% confined to the image canvas-- that is no negative offsets or widths or +% heights that exceed the image dimension are permitted. Updates to pixels +% in your callback are automagically synced back to the image. +% +% The callback signature is: +% +% MagickBooleanType UpdateImageViewMethod(WandView *source,const ssize_t y, +% const int thread_id,void *context) +% +% Use this pragma if the view is not single threaded: +% +% #pragma omp critical +% +% to define a section of code in your callback update method that must be +% executed by a single thread at a time. +% +% The format of the UpdateWandViewIterator method is: +% +% MagickBooleanType UpdateWandViewIterator(WandView *source, +% UpdateWandViewMethod update,void *context) +% +% A description of each parameter follows: +% +% o source: the source wand view. +% +% o update: the update callback method. +% +% o context: the user defined context. +% +*/ +WandExport MagickBooleanType UpdateWandViewIterator(WandView *source, + UpdateWandViewMethod update,void *context) +{ + ExceptionInfo + *exception; + + Image + *source_image; + + MagickBooleanType + status; + + MagickOffsetType + progress; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + size_t + height; +#endif + + ssize_t + y; + + assert(source != (WandView *) NULL); + assert(source->signature == WandSignature); + if (update == (UpdateWandViewMethod) NULL) + return(MagickFalse); + source_image=source->wand->images; + if (SetImageStorageClass(source_image,DirectClass) == MagickFalse) + return(MagickFalse); + status=MagickTrue; + progress=0; + exception=source->exception; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + height=(size_t) (source->extent.height-source->extent.y); + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(source_image,source_image,height,1) +#endif + for (y=source->extent.y; y < (ssize_t) source->extent.height; y++) + { + const int + id = GetOpenMPThreadId(); + + IndexPacket + *magick_restrict indexes; + + ssize_t + x; + + PixelPacket + *magick_restrict pixels; + + if (status == MagickFalse) + continue; + pixels=GetCacheViewAuthenticPixels(source->view,source->extent.x,y, + source->extent.width,1,exception); + if (pixels == (PixelPacket *) NULL) + { + InheritException(source->exception,GetCacheViewException( + source->view)); + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(source->view); + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x); + if (source_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelSetBlackQuantum(source->pixel_wands[id][x], + GetPixelBlack(indexes+x)); + if (update(source,y,id,context) == MagickFalse) + status=MagickFalse; + for (x=0; x < (ssize_t) source->extent.width; x++) + PixelGetQuantumColor(source->pixel_wands[id][x],pixels+x); + if (source_image->colorspace == CMYKColorspace) + for (x=0; x < (ssize_t) source->extent.width; x++) + SetPixelBlack(indexes+x,PixelGetBlackQuantum( + source->pixel_wands[id][x])); + if (SyncCacheViewAuthenticPixels(source->view,exception) == MagickFalse) + { + InheritException(source->exception,GetCacheViewException(source->view)); + status=MagickFalse; + } + if (source_image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp atomic +#endif + progress++; + proceed=SetImageProgress(source_image,source->description,progress, + source->extent.height); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + return(status); +} diff --git a/ImageMagick-6.9.12-44/wand/wand-view.h b/ImageMagick-6.9.12-44/wand/wand-view.h new file mode 100644 index 0000000..d23d045 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/wand-view.h @@ -0,0 +1,73 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITTransferNS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickWand wand view methods. +*/ +#ifndef MAGICKWAND_WAND_VIEW_H +#define MAGICKWAND_WAND_VIEW_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct _WandView + WandView; + +typedef MagickBooleanType + (*DuplexTransferWandViewMethod)(const WandView *,const WandView *,WandView *, + const ssize_t,const int,void *), + (*GetWandViewMethod)(const WandView *,const ssize_t,const int,void *), + (*SetWandViewMethod)(WandView *,const ssize_t,const int,void *), + (*TransferWandViewMethod)(const WandView *,WandView *,const ssize_t, + const int,void *), + (*UpdateWandViewMethod)(WandView *,const ssize_t,const int,void *); + +extern WandExport char + *GetWandViewException(const WandView *,ExceptionType *); + +extern WandExport MagickBooleanType + DuplexTransferWandViewIterator(WandView *,WandView *,WandView *, + DuplexTransferWandViewMethod,void *), + GetWandViewIterator(WandView *,GetWandViewMethod,void *), + IsWandView(const WandView *), + SetWandViewIterator(WandView *,SetWandViewMethod,void *), + TransferWandViewIterator(WandView *,WandView *,TransferWandViewMethod,void *), + UpdateWandViewIterator(WandView *,UpdateWandViewMethod,void *); + +extern WandExport MagickWand + *GetWandViewWand(const WandView *); + +extern WandExport PixelWand + **GetWandViewPixels(const WandView *); + +extern WandExport RectangleInfo + GetWandViewExtent(const WandView *); + +extern WandExport void + SetWandViewDescription(WandView *,const char *), + SetWandViewThreads(WandView *,const size_t); + +extern WandExport WandView + *CloneWandView(const WandView *), + *DestroyWandView(WandView *), + *NewWandView(MagickWand *), + *NewWandViewExtent(MagickWand *,const ssize_t,const ssize_t,const size_t, + const size_t); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/wand/wand.c b/ImageMagick-6.9.12-44/wand/wand.c new file mode 100644 index 0000000..c839481 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/wand.c @@ -0,0 +1,156 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W W AAA N N DDDD % +% W W A A NN N D D % +% W W W AAAAA N N N D D % +% WW WW A A N NN D D % +% W W A A N N DDDD % +% % +% % +% MagickWand Support Methods % +% % +% Software Design % +% Cristy % +% May 2004 % +% % +% % +% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "wand/studio.h" +#include "wand/MagickWand.h" +#include "wand/magick-wand-private.h" +#include "wand/wand.h" + +static SplayTreeInfo + *wand_ids = (SplayTreeInfo *) NULL; + +static MagickBooleanType + instantiate_wand = MagickFalse; + +static SemaphoreInfo + *wand_semaphore = (SemaphoreInfo *) NULL; + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% A c q u i r e W a n d I d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireWandId() returns a unique wand id. +% +% The format of the AcquireWandId() method is: +% +% size_t AcquireWandId() +% +*/ +WandExport size_t AcquireWandId(void) +{ + static size_t + id = 0; + + size_t + wand_id; + + if (wand_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&wand_semaphore); + LockSemaphoreInfo(wand_semaphore); + if (wand_ids == (SplayTreeInfo *) NULL) + wand_ids=NewSplayTree((int (*)(const void *,const void *)) NULL, + (void *(*)(void *)) NULL,(void *(*)(void *)) NULL); + wand_id=id++; + (void) AddValueToSplayTree(wand_ids,(const void *) wand_id, + (const void *) wand_id); + instantiate_wand=MagickTrue; + UnlockSemaphoreInfo(wand_semaphore); + return(wand_id); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% D e s t r o y W a n d I d s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DestroyWandIds() deallocates memory associated with the wand id's. +% +% The format of the DestroyWandIds() method is: +% +% void DestroyWandIds(void) +% +% A description of each parameter follows: +% +*/ +WandExport void DestroyWandIds(void) +{ + if (wand_semaphore == (SemaphoreInfo *) NULL) + ActivateSemaphoreInfo(&wand_semaphore); + LockSemaphoreInfo(wand_semaphore); + if (wand_ids != (SplayTreeInfo *) NULL) + wand_ids=DestroySplayTree(wand_ids); + instantiate_wand=MagickFalse; + UnlockSemaphoreInfo(wand_semaphore); + DestroySemaphoreInfo(&wand_semaphore); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e l i n q u i s h W a n d I d % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RelinquishWandId() relinquishes a unique wand id. +% +% The format of the RelinquishWandId() method is: +% +% void RelinquishWandId(const size_t *id) +% +% A description of each parameter follows: +% +% o id: a unique wand id. +% +*/ +WandExport void RelinquishWandId(const size_t id) +{ + LockSemaphoreInfo(wand_semaphore); + if (wand_ids != (SplayTreeInfo *) NULL) + (void) DeleteNodeFromSplayTree(wand_ids,(const void *) id); + UnlockSemaphoreInfo(wand_semaphore); +} diff --git a/ImageMagick-6.9.12-44/wand/wand.h b/ImageMagick-6.9.12-44/wand/wand.h new file mode 100644 index 0000000..d481738 --- /dev/null +++ b/ImageMagick-6.9.12-44/wand/wand.h @@ -0,0 +1,36 @@ +/* + Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. You may + obtain a copy of the License at + + https://imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + ImageMagick wand support methods. +*/ +#ifndef MAGICKWAND_WAND_H +#define MAGICKWAND_WAND_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern WandExport size_t + AcquireWandId(void); + +extern WandExport void + DestroyWandIds(void), + RelinquishWandId(const size_t); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/ImageMagick-6.9.12-44/winpath.sh b/ImageMagick-6.9.12-44/winpath.sh new file mode 100644 index 0000000..ffa1a74 --- /dev/null +++ b/ImageMagick-6.9.12-44/winpath.sh @@ -0,0 +1,71 @@ +#!/bin/sh +# Copyright © 1999 ImageMagick Studio LLC +# Copyright (C) 2003 - 2008 GraphicsMagick Group +# +# This program is covered by multiple licenses, which are described in +# LICENSE. You should have received a copy of LICENSE with this +# package; otherwise see https://imagemagick.org/script/license.php. +# +# Convert the specified POSIX path to a Windows path under MinGW and Cygwin +# The optional second parameter specifies the level of backslash escaping +# to apply for each Windows backslash position in order to support varying +# levels of variable substitutions in scripts. +# +# Note that Cygwin includes the 'cygpath' utility, which already provides +# path translation capability. +# +# Written by Bob Friesenhahn, June 2002 +# +arg="$1" +escapes=0 +if test -n "$2" +then + escapes="$2" +fi +if test $escapes -gt 3 +then + echo "$0: escape level must in range 0 - 3" + exit 1 +fi +result='' +length=0 +max_length=0 +mount | sed -e 's:\\:/:g' | ( + IFS="\n" + while read mount_entry + do + win_mount_path=`echo "$mount_entry" | sed -e 's: .*::g'` + unix_mount_path=`echo "$mount_entry" | sed -e 's:.* on ::;s: type .*::'` + temp=`echo "$arg" | sed -e "s!^$unix_mount_path!$win_mount_path/!"` + if test "$temp" != "$arg" + then + candidate="$temp" + length=${#unix_mount_path} + if test $length -gt $max_length + then + result=$candidate + max_length=$length + fi + fi + done + if test -z "$result" + then + echo "$0: path \"$arg\" is not mounted" + exit 1 + fi + case $escapes in + 0) + echo "$result" | sed -e 's:/:\\:g' + ;; + 1) + echo "$result" | sed -e 's:/:\\\\:g' + ;; + 2) + echo "$result" | sed -e 's:/:\\\\\\\\:g' + ;; + 3) + echo "$result" | sed -e 's:/:\\\\\\\\\\\\\\\\:g' + ;; + esac + exit 0; + ) diff --git a/ImageMagick-6.9.12-44/www/Magick++/Blob.html b/ImageMagick-6.9.12-44/www/Magick++/Blob.html new file mode 100644 index 0000000..d4e99a1 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Blob.html @@ -0,0 +1,93 @@ + + + + + +Magick++ API: Working with Blobs + + + + + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/COPYING b/ImageMagick-6.9.12-44/www/Magick++/COPYING new file mode 100644 index 0000000..4d5f0dc --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/COPYING @@ -0,0 +1,22 @@ + +Copyright 1999, 2000, 2001 Bob Friesenhahn + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files ("Magick++"), to deal in Magick++ without restriction, +including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of +Magick++, and to permit persons to whom the Magick++ is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of Magick++. + +The software is provided "as is", without warranty of any kind, +express or implied, including but not limited to the warranties of +merchantability, fitness for a particular purpose and +noninfringement. In no event shall Bob Friesenhahn be liable for +any claim, damages or other liability, whether in an action of +contract, tort or otherwise, arising from, out of or in connection +with Magick++ or the use or other dealings in Magick++. + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Cache.fig b/ImageMagick-6.9.12-44/www/Magick++/Cache.fig new file mode 100644 index 0000000..5b880a7 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Cache.fig @@ -0,0 +1,35 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +0 +1200 2 +1 3 0 3 4 4 0 0 20 0.000 1 0.0000 2715 3030 31 31 2715 3030 2745 3037 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1200 3300 1200 2100 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2925 1875 1500 1875 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3825 1875 4800 1875 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1200 3600 1200 4800 +2 2 0 1 0 6 9 0 30 0.000 0 0 -1 0 0 5 + 2325 2700 4125 2700 4125 3825 2325 3825 2325 2700 +2 2 0 1 0 2 10 0 30 0.000 0 0 7 0 0 5 + 1500 2100 4800 2100 4800 4800 1500 4800 1500 2100 +2 2 0 1 7 7 11 0 20 0.000 0 0 -1 0 0 5 + 900 1500 5100 1500 5100 5100 900 5100 900 1500 +4 1 0 0 0 16 12 0.0000 4 180 810 3375 1950 columns()\001 +4 2 0 0 0 16 12 0.0000 4 180 510 1500 3525 rows()\001 +4 0 0 0 0 16 12 0.0000 4 165 255 1575 2325 0,0\001 +4 1 0 0 0 16 12 0.0000 4 180 795 3375 2625 columns_\001 +4 1 0 0 0 16 12 0.0000 4 135 225 2325 2625 x,y\001 +4 2 0 0 0 16 12 0.0000 4 135 495 2250 3300 rows_\001 +4 0 0 0 0 16 12 0.0000 4 135 405 2730 3232 Pixel\001 diff --git a/ImageMagick-6.9.12-44/www/Magick++/Cache.png b/ImageMagick-6.9.12-44/www/Magick++/Cache.png new file mode 100644 index 0000000000000000000000000000000000000000..91d0efb3098b9bcff21276a575caa7f9184a9e10 GIT binary patch literal 1838 zcmY*Zdodc@WOQ*K#lxf)-BdF4*w86NPx+Ly*e*0_Zk8aQTzV~vz=Y7ueeeZYP{Lr(0y4q&i z5C}xq{|q4<^!wl*KBxxThBSR|&`pL0Mfv~$0ER>&QK?jxm6g@j*4Ee8M@L7uw6rjp zOe_`~8XAhn<4sLXc|0Bz3MCK-GMNm4K#0X+2L}g*LSbNFKoAq+TH-P@Gev;N)zuY= zL>d|zy7Am>iMBi?Pft%z3#!FYaG(e%Q^qvInqiq(Vl5FtKm?Zs$MW1-TH*je1Soj` z6AP*VpjrUW4JZo+5Kw?<3t-KFS|VU@5Rfqe5UJo02nd;s$>X_+#RR32hd_Y3v_P>$ zqAeC{R$EJyNF?#`@w&RYQmHhE=T@Y@@!{HEPy_u4fh?VzPzXfB(x2cJ`OWZxLWfs= z#`M707Q`-28<}>jSpDEt?UzZXE{z7?^&e1HgYPpBIdSeJjYK@^j2~H%LsWI@;ETKrqQAecGUy62*Mbyt*(oERXrx9 z0VNBY`$b>gvi95C3-4;Q06dOgG3kOWR5XxyQ}Hn8%{p z8*A5$5dW{#-I5<3x|yd^fB)uNYP(`hrKLWO*V?-G+bwFm)lrF! z7R?s}&tG5#%7@usk3=bSMd;Zd>pJ6p5l)>svYx5RPsays?$2nE|AG)6%N}Rvde|S{ z?pWWxN&8jX($HI~3UgZ3t$}^DG9hdXIJdd-J$!RdZO4k9w+of5aE1Hy`;FaCO}-~v zwH6)OCXOyGwp*Ny>AFPxxA*>=CFSxuWUE-AAy|B(3H!{9S^_&fmFVHkTcWMFNk7(> z=kZ->^%QVpan!#XAkK((&d2OeO1ir}b>z450E~^X=hjck*=_!#P4A4&@wxVw^D)%c z3m5pf!=thj1F_}5KQrN$zb&kPR{XwmXr75Y1VHrN|oxocDgTKFuI=s!~ zjYoc0ay?|Iup`dEmtwT|WO=gPvTeR9uUVY^dfj&fOed!MrV)CYlp{mk#rhJdr?kLy zBSXRmlRz1{!JE$Sy6+79Ls@lG&~*v6OPjD25v|_M;Yd-($0B-uLsr`wzruXC#)~m^ zuPJ1oGh7TVV3fSD%PzAc?O59tRz~`Ad)PpI90m z*7$S=vs7|7oPTfRRSb#rfo7y+atu6{yW9;_+(q-l51+?cjd^Z#B%pnAty`yW?S zhKen|9Lu)Xgu#+O{?boIgd>kAQDi-dNc_d;t^3qT&#Z4heCHtJnzI8PO~ueDXfR^pofw#^OgbE_I{l%_o0F8pU~?hxk0Rg+ z3^pT$!e!9m)C{=S-zjuDiw*a?z)9t%f-;i1@RM{#I*Z0|Pi7~jP + + +SVG drawing +This was produced by version 4.1 of GNU libplot, a free library for exporting 2-D vector graphics. + + + + + + + + + + + + + + + + + + + + + + +columns() +rows() +0,0 +columns_ +x,y +rows_ +Pixel + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/ChangeLog.html b/ImageMagick-6.9.12-44/www/Magick++/ChangeLog.html new file mode 100644 index 0000000..924dede --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/ChangeLog.html @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/CoderInfo.html b/ImageMagick-6.9.12-44/www/Magick++/CoderInfo.html new file mode 100644 index 0000000..dfab62a --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/CoderInfo.html @@ -0,0 +1,104 @@ + + + + + +Magick++ API: Access Raw Image Pixels + + + +
    +

    Magick::CoderInfo

    +

    The CoderInfo class provides the means to provide information regarding ImageMagick support for an image format (designated by a magick string). It may be used to provide support for a specific named format (provided as an argument to the constructor), or as an element of a container when format support is queried using the coderInfoList() templated function.

    +

    The following code fragment illustrates how CoderInfo may be used.

    +
    +CoderInfo info("GIF"); 
    +cout < info->name() << ": (" << info->description() << ") : "; 
    +cout << "Readable = "; 
    +if ( info->isReadable() ) 
    +  cout << "true"; 
    +else 
    +  cout << "false"; 
    +cout << ", "; 
    +cout << "Writable = "; 
    +if ( info->isWritable() ) 
    +  cout << "true"; 
    +else 
    +  cout << "false"; 
    +cout << ", "; 
    +cout << "Multiframe = "; 
    +if ( info->isMultiframe() ) 
    +  cout << "true"; 
    +else 
    +  cout << "false"; 
    +cout << endl;
    +
    +

    The methods available in the CoderInfo class are shown in the following table:

    +
    +

      CoderInfo Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +

      Method

      +

      Returns

      +

      Signature

      +

      Description

      +

      CoderInfo

      +

      void

      +

      Construct object corresponding to named format (e.g. "GIF"). An exception is thrown if the format is not supported.

      +

      name

      +

      std::string

      +

      void

      +

      Format name (e.g. "GIF").

      +

      description

      +

      std::string

      +

      void

      +

      Format description (e.g. "CompuServe graphics interchange format").

      +

      isReadable

      +

      bool

      +

      void

      +

      Format is readable.

      +

      isWritable

      +

      bool

      +

      void

      +

      Format is writeable.

      +

      isMultiFrame

      +

      bool

      +

      void

      +

      Format supports multiple frames.

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Color.html b/ImageMagick-6.9.12-44/www/Magick++/Color.html new file mode 100644 index 0000000..3ac5993 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Color.html @@ -0,0 +1,260 @@ + + + + + +Magick++ API: Working with Color + + + +
    +

    Magick::Color

    +

    Color is the base color class in Magick++. It is a simple container class for the pixel red, green, blue, and alpha values scaled to fit ImageMagick's Quantum size. Normally users will instantiate a class derived from Color which supports the color model that fits the needs of the application. The Color class may be constructed directly from an SVG-style color string.

    +

    Quantum

    + +The base type used to represent color samples in ImageMagick is the Quantum type. Pixels are represented by a structure of Quantum values. For example, an RGB pixel contains red, green, and blue quantums, while an RGBA pixel contains red, green, blue, and opacity quantums. The maximum value that a Quantum can attain is specified by a constant value represented by the MaxRGB define, which is itself determined by the number of bits in a Quantum. The QuantumDepth build option determines the number of bits in a Quantum. + +

    PixelPacket

    + +PixelPacket is the internal representation of a pixel in ImageMagick. ImageMagick may be compiled to support 32, 64, or 128 bit pixels of type PixelPacket. This is controlled by the value of the QuantumDepth define. The default is 32 bit pixels (QuantumDepth=8), which provides the best performance and the least resource consumption. If additional color precision or range is desired, then ImageMagick may be compiled with QuantumDepth=16 or QuantumDepth=32. The following table shows the relationship between QuantumDepth, the type of Quantum, and the overall PixelPacket size. +

    Effect Of QuantumDepth Values

    +
    + ++++ + + + + + + + + + + + + + + + +
    +

    QuantumDepth

    +

    Quantum Typedef

    +

    PixelPacket Size

    +

    8

    +

    unsigned char

    +

    32 bits

    +

    16

    +

    unsigned short

    +

    64 bits

    +

    32

    +

    unsigned int

    +

    128 bits

    +

    Color Class

    +

    The Color base class is not intended to be used directly. Normally a user will construct a derived class or inherit from this class. Color arguments are must be scaled to fit the Quantum size. The Color class contains a pointer to a PixelPacket, which may be allocated by the Color class, or may refer to an existing pixel in an image.

    +

    An alternate way to construct the class is via an SVG-compatible color specification string (e.g. Color("red") or Color ("#FF0000")). Since the class may be constructed from a string, convenient strings may be passed in place of an explicit Color object in methods which accept a reference to Color. Color may also be converted to a std::string for convenience in user interfaces, and for saving settings to a text file.

    +
    +class Color +{ + public: + Color ( Quantum red_, + Quantum green_, + Quantum blue_ ); + Color ( Quantum red_, + Quantum green_, + Quantum blue_, + Quantum alpha_ ); + Color ( const std::string &svgColor_ ); + Color ( const char * svgColor_ ); + Color ( void ); + virtual ~Color ( void ); + Color ( const Color & color_ ); + + // Red color (range 0 to MaxRGB) + void redQuantum ( Quantum red_ ); + Quantum redQuantum ( void ) const; + + // Green color (range 0 to MaxRGB) + void greenQuantum ( Quantum green_ ); + Quantum greenQuantum ( void ) const; + + // Blue color (range 0 to MaxRGB) + void blueQuantum ( Quantum blue_ ); + Quantum blueQuantum ( void ) const; + + // Alpha level (range OpaqueOpacity=0 to TransparentOpacity=MaxRGB) + void alphaQuantum ( Quantum alpha_ ); + Quantum alphaQuantum ( void ) const; + + // Scaled (to 1.0) version of alpha for use in sub-classes + // (range opaque=0 to transparent=1.0) + void alpha ( double alpha_ ); + double alpha ( void ) const; + + // Does object contain valid color? + void isValid ( bool valid_ ); + bool isValid ( void ) const; + + // Set color via SVG color specification string + const Color& operator= ( const std::string & svgColor_ ); + const Color& operator= ( const char * svgColor_ ); + + // Assignment operator + Color& operator= ( const Color& color_ ); + + // Return SVG color specification string + /* virtual */ operator std::string() const; + + // Return ImageMagick PixelPacket + operator PixelPacket() const; + + // Construct color via ImageMagick PixelPacket + Color ( const PixelPacket &color_ ); + + // Set color via ImageMagick PixelPacket + const Color& operator= ( PixelPacket &color_ ); +}; +
    +

    Color Derived Classes

    + +++ + + + + + + + + + + +
    +

    ColorRGB

    +

    Representation of RGB color with red, green, and blue specified as ratios (0 to 1)

    +

    ColorGray

    +

    Representation of grayscale sRGB color (equal parts red, green, and blue) specified as a ratio (0 to 1)

    +

    ColorMono

    +

    Representation of a black/white color (true/false)

    +

    ColorYUV

    +

    Representation of a color in the YUV colorspace

    +

    ColorRGB

    +

    Representation of an sRGB color. All color arguments have a valid range of 0.0 - 1.0.

    +
    +class ColorRGB : public Color 
    +{ 
    +  public: 
    +    ColorRGB ( double red_, double green_, double blue_ ); 
    +    ColorRGB ( void ); 
    +    ColorRGB ( const Color & color_ ); 
    +    /* virtual */  ~ColorRGB ( void ); 
    +  
    +    void           red ( double red_ ); 
    +    double         red ( void ) const; 
    +  
    +    void           green ( double green_ ); 
    +    double         green ( void ) const; 
    +  
    +    void           blue ( double blue_ ); 
    +    double         blue ( void ) const;
    +
    +    // Assignment operator from base class 
    +    ColorRGB& operator= ( const Color& color_ ); 
    +}; 
    +
    +

    ColorGray

    +

    Representation of a grayscale color (in linear colorspace). Grayscale is simply RGB with equal parts of red, green, and blue. All double arguments have a valid range of 0.0 - 1.0.

    +
    +class ColorGray : public Color 
    +{ 
    +  public: 
    +    ColorGray ( double shade_ ); 
    +    ColorGray ( void ); 
    +    ColorGray ( const Color & color_ ); 
    +    /* virtual */ ~ColorGray ();
    +
    +    void           shade ( double shade_ ); 
    +    double         shade ( void ) const;
    +
    +    // Assignment operator from base class 
    +    ColorGray& operator= ( const Color& color_ ); 
    +}; 
    +
    +

    ColorMono

    +

    Representation of a black/white pixel (in RGB colorspace). Color arguments are constrained to 'false' (black pixel) and 'true' (white pixel).

    +
    +class ColorMono : public Color 
    +{ 
    +  public: 
    +    ColorMono ( bool mono_ ); 
    +    ColorMono ( void ); 
    +    ColorMono ( const Color & color_ ); 
    +    /* virtual */ ~ColorMono (); 
    +  
    +    void           mono ( bool mono_ ); 
    +    bool           mono ( void ) const;
    +
    +    // Assignment operator from base class 
    +    ColorMono& operator= ( const Color& color_ ); 
    +}; 
    +
    +

    ColorHSL

    +

    Representation of a color in Hue/Saturation/Luminosity (HSL) colorspace.

    +
    +class ColorHSL : public Color 
    +{ 
    +  public: 
    +    ColorHSL ( double hue_, double saturation_, double luminosity_ ); 
    +    ColorHSL ( void ); 
    +    ColorHSL ( const Color & color_ ); 
    +    /* virtual */  ~ColorHSL ( ); 
    +  
    +    void           hue ( double hue_ ); 
    +    double         hue ( void ) const; 
    +  
    +    void           saturation ( double saturation_ ); 
    +    double         saturation ( void ) const; 
    +  
    +    void           luminosity ( double luminosity_ ); 
    +    double         luminosity ( void ) const;
    +
    +    // Assignment operator from base class 
    +    ColorHSL& operator= ( const Color& color_ ); 
    +}; 
    +
    +

    ColorYUV

    +

    Representation of a color in YUV colorspace (used to encode color for television transmission).

    +

    Argument ranges:

    +
    +
    Y: 0.0 through 1.0
    +
    U: -0.5 through 0.5
    +
    V: -0.5 through 0.5
    +
    +
    +class ColorYUV : public Color 
    +{ 
    +  public: 
    +    ColorYUV ( double y_, double u_, double v_ ); 
    +    ColorYUV ( void ); 
    +    ColorYUV ( const Color & color_ ); 
    +    /* virtual */ ~ColorYUV ( void ); 
    +  
    +    void           u ( double u_ ); 
    +    double         u ( void ) const; 
    +  
    +    void           v ( double v_ ); 
    +    double         v ( void ) const; 
    +  
    +    void           y ( double y_ ); 
    +    double         y ( void ) const;
    +
    +    // Assignment operator from base class 
    +    ColorYUV& operator= ( const Color& color_ ); 
    +}; 
    +
    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Documentation.html b/ImageMagick-6.9.12-44/www/Magick++/Documentation.html new file mode 100644 index 0000000..6f560ef --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Documentation.html @@ -0,0 +1,67 @@ + + + + + +Magick++ API Documentation + + + +

    +
    +

    Magick++ provides a simple C++ API to the ImageMagick image processing library which supports reading and writing a huge number of image formats as well as supporting a broad spectrum of traditional image processing operations. The ImageMagick C API is complex and the data structures are currently not documented. Magick++ provides access to most of the features available from the C API but in a simple object-oriented and well-documented framework.

    +

    Magick++ is intended to support commercial-grade application development. In order to avoid possible conflicts with the user's application, all symbols contained in Magick++ (included by the header <Magick++.h>) are scoped to the namespace Magick. Symbols from the ImageMagick C library are imported under the MagickCore namespace to avoid possible conflicts and ImageMagick macros are only included within the Magick++ implementation so they won't impact the user's application.

    +

    The core class in Magick++ is the Image class. The Image class provides methods to manipulate a single image frame (e.g. a JPEG image). Standard Template Library (STL)compatible algorithms and function objects are provided in order to manipulate multiple image frames or to read and write file formats which support multiple image frames (e.g. GIF animations, MPEG animations, and Postscript files).

    +

    The Image class supports reference-counted memory management which supports the semantics of an intrinsic variable type (e.g. 'int') with an extremely efficient operator = and copy constructor (only a pointer is assigned) while ensuring that the image data is replicated as required so that it the image may be modified without impacting earlier generations. Since the Image class manages heap memory internally, images are best allocated via C++ automatic (stack-based) memory allocation. This support allows most programs using Magick++ to be written without using any pointers, simplifying the implementation and avoiding the risks of using pointers. When a program uses automatic memory allocation to allocate Magick++ images, that aspect of the program becomes naturally exception-safe and thread-safe.

    +

    The image class uses a number of supportive classes in order to specify arguments. Colors are specified via the Color class. Colors specified in X11-style string form are implicitly converted to the Color class. Geometry arguments (those specifying width, height, and/or x and y offset) are specified via the Geometry class. Similar to the Color class, geometries specified as an X11-style string are implicitly converted to the Geometry class. Two dimensional drawable objects are specified via the Drawable class. Drawable objects may be provided as a single object or as a list of objects to be rendered using the current image options. Montage options (a montage is a rendered grid of thumbnails in one image) are specified via the Montage class.

    +

    Errors are reported using C++ exceptions derived from the Exception class, which is itself derived from the standard C++ exception class. Exceptions are reported synchronous with the operation and are caught by the first matching try block as the stack is unraveled. This allows a clean coding style in which multiple related Magick++ commands may be executed with errors handled as a unit rather than line-by-line. Since the Image object provides reference-counted memory management, unreferenced images on the stack are automagically cleaned up, avoiding the potential for memory leaks.

    +

    For ease of access, the documentation for the available user-level classes is available via the following table.

    +
    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Magick++ User-Level Classes
    BlobBinary Large OBject container.
    CoderInfoReport information about supported image formats (use with +coderInfoList())
    ColorColor specification.
    DrawableDrawable shape (for input to 'draw').
    ExceptionC++ exception objects.
    GeometryGeometry specification.
    ImageImage frame. This is the primary object in Magick++.
    MontageMontage options for montageImages().
    PixelsLow-level access to image pixels.
    STLSTL algorithms and function objects for operating on +containers of image frames.
    TypeMetricContainer for font type metrics (use with +Image::fontTypeMetrics).
    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Drawable.html b/ImageMagick-6.9.12-44/www/Magick++/Drawable.html new file mode 100644 index 0000000..13c0f1c --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Drawable.html @@ -0,0 +1,798 @@ + + + + + +Magick++ API: Drawing on Images + + + +
    +

    Magick::Drawable

    +

    Drawable provides a convenient interface for preparing vector, image, or text arguments for the Image::draw() method. Each instance of a Drawable sub-class represents a single drawable object. Drawable objects may be drawn "one-by-one" via multiple invocations of the Image draw() method, or may be drawn "all-at-once" by passing a list of Drawable objects to the Image draw() method. The one-by-one approach is convenient for simple drawings, while the list-based approach is appropriate for drawings which require more sophistication.

    +

    The following is an example using the Drawable subclasses with a one-by-one approach to draw the following figure:

    +

    example +

    +
    +#include <string> +#include <iostream> +#include <Magick++.h> + +using namespace std; +using namespace Magick; + +int main(int /*argc*/,char **argv) +{ + try { + InitializeMagick(*argv); + + // Create base image (white image of 300 by 200 pixels) + Image image( Geometry(300,200), Color("white") ); + + // Set draw options + image.strokeColor("red"); // Outline color + image.fillColor("green"); // Fill color + image.strokeWidth(5); + + // Draw a circle + image.draw( DrawableCircle(100,100, 50,100) ); + + // Draw a rectangle + image.draw( DrawableRectangle(200,200, 270,170) ); + + // Display the result + image.display( ); + } + catch( exception & error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} +
    +

    Since Drawable is an object it may be saved in an array or a list for later (perhaps repeated) use. The following example shows how to draw the same figure using the list-based approach:

    +
    +#include <string> +#include <iostream> +#include <list> +#include <Magick++.h> + +using namespace std; +using namespace Magick; + +int main(int /*argc*/,char **/*argv*/) +{ + try { + + InitializeMagick(*argv); + + // Create base image (white image of 300 by 200 pixels) + Image image( Geometry(300,200), Color("white") ); + + // Construct drawing list + std::list<Magick::Drawable> drawList; + + // Add some drawing options to drawing list + drawList.push_back(DrawableStrokeColor("red")); // Outline color + drawList.push_back(DrawableStrokeWidth(5)); // Stroke width + drawList.push_back(DrawableFillColor("green")); // Fill color + + // Add a Circle to drawing list + drawList.push_back(DrawableCircle(100,100, 50,100)); + + // Add a Rectangle to drawing list + drawList.push_back(DrawableRectangle(200,100, 270,170)); + + // Draw everything using completed drawing list + image.draw(drawList); + + // Display the result + image.display( ); + } + catch( exception & error_ ) + { + cout << "Caught exception: " << error_.what() << endl; + return 1; + } + + return 0; +} +
    +

    Drawable depends on the simple Coordinate structure which represents a pair of x,y coodinates. The methods provided by the Coordinate structure are shown in the following table:

    +

    Coordinate Structure Methods

    + + + + + + + + + + + + + + + + + + + +
    +

    Method/Member

    +

    Signature

    +

    Description

    +

    Coordinate

    +

    void

    +

    Default Constructor

    +

    double x_, double y_

    +

    Constructor, setting first & second

    +

    x

    +

    double x_

    +

    x coordinate member

    +

    y

    +

    double y_

    +

    y coordinate member

    +

    The Drawable classes are shown in the following table. Only constructor signatures are documented here. Each Drawable class also provides methods by which each individual parameter may be adjusted.

    +

    Drawable Classes

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Sub-Class

    +

    Constructor Signature

    +

    Description

    +

    DrawableAffine

    +

    double sx_, double sy_, double rx_, double ry_, double tx_, double ty_

    +

    Specify a transformation matrix to adjust scaling, rotation, and translation (coordinate transformation) for subsequently drawn objects in the same or decendent drawing context. The sx_ & sy_ parameters represent the x & y scale factors, the rx_ & ry_ parameters represent the x & y rotation, and the tx_ & ty_ parameters represent the x & y translation.

    +

    void

    +

    Specify a transformation matrix to adjust scaling, rotation, and translation (coordinate transformation) for subsequently drawn objects in the same or decendent drawing context. Initialized to unity (no effect) affine values. Use class methods (not currently documented) to adjust individual parameters from their unity values.

    +

    DrawableAngle

    +

    double angle_

    +

    Set drawing angle

    +

    DrawableArc

    +

    double startX_, double startY_, double endX_, double endY_, double startDegrees, double endDegrees_

    +

    Draw an arc using the stroke color and based on the circle starting at coordinates startX_,startY_, and ending with coordinates endX_,endY_, and bounded by the rotational arc startDegrees_,endDegrees_

    +

    DrawableBezier

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    Draw a bezier curve using the stroke color and based on the coordinates specified by the coordinates_ list.

    +

    DrawableClipPath

    +

    const std::string &id_

    +

    Select a drawing clip path matching id_.

    +

    DrawableCircle

    +

    double originX_, double originY_, double perimX_, double perimY_

    +

    Draw a circle using the stroke color and thickness using specified origin and perimeter coordinates. If a fill color is specified, then the object is filled.

    +

    DrawableColor

    +

    double x_, double y_, PaintMethod paintMethod_

    +

    Color image according to paintMethod. The point method recolors the target pixel. The replace method recolors any pixel that matches the color of the target pixel. Floodfill recolors any pixel that matches the color of the target pixel and is a neighbor, whereas filltoborder recolors any neighbor pixel that is not the border color. Finally, reset recolors all pixels.

    +

    DrawableCompositeImage

    +

    double x_, double y_, const std::string &filename_

    +

    Composite current image with contents of specified image, at specified coordinates. If the matte attribute is set to true, then the image composition will consider an alpha channel, or transparency, present in the image file so that non-opaque portions allow part (or all) of the composite image to show through.

    +

    double x_, double y_, const Image &image_

    +

    double x_, double y_, double width_, double height_, const std::string &filename_

    +

    Composite current image with contents of specified image, rendered with specified width and height, at specified coordinates. If the matte attribute is set to true, then the image composition will consider an alpha channel, or transparency, present in the image file so that non-opaque portions allow part (or all) of the composite image to show through. If the specified width or height is zero, then the image is composited at its natural size, without enlargement or reduction.

    +

    double x_, double y_, double width_, double height_, const Image &image_

    +

    double x_, double y_, double width_, double height_, const std::string &filename_, CompositeOperator composition_

    +

    Composite current image with contents of specified image, rendered with specified width and height, using specified composition algorithm, at specified coordinates. If the matte attribute is set to true, then the image composition will consider an alpha channel, or transparency, present in the image file so that non-opaque portions allow part (or all) of the composite image to show through. If the specified width or height is zero, then the image is composited at its natural size, without enlargement or reduction.

    +

    double x_, double y_, double width_, double height_, const Image &image_, CompositeOperator composition_

    +

    DrawableDashArray

    +

    const double* dasharray_

    +

    Specify the pattern of dashes and gaps used to stroke paths. The strokeDashArray represents a zero-terminated array of numbers that specify the lengths of alternating dashes and gaps in pixels. If an odd number of values is provided, then the list of values is repeated to yield an even number of values. A typical strokeDashArray_ array might contain the members 5 3 2 0, where the zero value indicates the end of the pattern array.

    +

    DrawableDashOffset

    +

    double offset_

    +

    Specify the distance into the dash pattern to start the dash. See documentation on SVG's stroke-dashoffset property for usage details.

    +

    DrawableEllipse

    +

    double originX_, double originY_, double radiusX_, double radiusY_, double arcStart_, double arcEnd_

    +

    Draw an ellipse using the stroke color and thickness, specified origin, x & y radius, as well as specified start and end of arc in degrees. If a fill color is specified, then the object is filled.

    +

    DrawableFillColor

    +

    const Color &color_

    +

    Specify drawing object fill color.

    +

    DrawableFillRule

    +

    FillRule fillRule_

    +

    Specify the algorithm which is to be used to determine what parts of the canvas are included inside the shape. See documentation on SVG's fill-rule property for usage details.

    +

    DrawableFillOpacity

    +

    double opacity_

    +

    Specify opacity to use when drawing using fill color.

    +

    DrawableFont

    +

    const std::string &font_

    +

    Specify font name to use when drawing text.

    +

    const std::string &family_,
    +StyleType style_,
    +unsigned int weight_,
    +StretchType stretch_

    +

    Specify font family, style, weight (one of the set { 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 } with 400 being the normal size), and stretch to be used to select the font used when drawing text. Wildcard matches may be applied to style via the AnyStyle enumeration, applied to weight if weight is zero, and applied to stretch via the AnyStretch enumeration.

    +

    DrawableGravity

    +

    GravityType gravity_

    +

    Specify text positioning gravity.

    +

    DrawableLine

    +

    double startX_, double startY_, double endX_, double endY_

    +

    Draw a line using stroke color and thickness using starting and ending coordinates

    +

    DrawableMatte

    +

    double x_, double y_, PaintMethod paintMethod_

    +

    Change the pixel matte value to transparent. The point method changes the matte value of the target pixel. The replace method changes the matte value of any pixel that matches the color of the target pixel. Floodfill changes the matte value of any pixel that matches the color of the target pixel and is a neighbor, whereas filltoborder changes the matte value of any neighbor pixel that is not the border color, Finally reset changes the matte value of all pixels.

    +

    DrawableMiterLimit

    +

    size_t miterLimit_

    +

    Specify miter limit. When two line segments meet at a sharp angle and miter joins have been specified for 'lineJoin', it is possible for the miter to extend far beyond the thickness of the line stroking the path. The miterLimit' imposes a limit on the ratio of the miter length to the 'lineWidth'. The default value of this parameter is 4.

    +

    DrawablePath

    +

    const std::list<Magick::VPath> &path_

    +

    Draw on image using vector path.

    +

    DrawablePoint

    +

    double x_, double y_

    +

    Draw a point using stroke color and thickness at coordinate

    +

    DrawablePointSize

    +

    double pointSize_

    +

    Set font point size.

    +

    DrawablePolygon

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    Draw an arbitrary polygon using stroke color and thickness consisting of three or more coordinates contained in an STL list. If a fill color is specified, then the object is filled.

    +

    DrawablePolyline

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    Draw an arbitrary polyline using stroke color and thickness consisting of three or more coordinates contained in an STL list. If a fill color is specified, then the object is filled.

    +

    DrawablePopClipPath

    +

    void

    +

    Pop (terminate) clip path definition started by DrawablePushClipPath.

    +

    DrawablePopGraphicContext

    +

    void

    +

    Pop Graphic Context. Removing the current graphic context from the graphic context stack restores the options to the values they had prior to the preceding DrawablePushGraphicContext operation.

    +

    DrawablePushClipPath

    +

    const std::string &id_

    +

    Push (create) clip path definition with id_. Clip patch definition consists of subsequent drawing commands, terminated by DrawablePopClipPath.

    +

    DrawablePushGraphicContext

    +

    void

    +

    Push Graphic Context. When a graphic context is pushed, options set after the context is pushed (such as coordinate transformations, color settings, etc.) are saved to a new graphic context. This allows related options to be saved on a graphic context "stack" in order to support heirarchical nesting of options. When DrawablePopGraphicContext is used to pop the current graphic context, the options in effect during the last DrawablePushGraphicContext operation are restored.

    +

    DrawablePushPattern

    +

    std::string &id_, ssize_t x_, ssize_t y_, size_t width_, size_t height_

    +

    Start a pattern definition with arbitrary pattern name specified by id_, pattern offset specified by x_ and y_, and pattern size specified by width_ and height_. The pattern is defined within the coordinate system defined by the specified offset and size. Arbitrary drawing objects (including DrawableCompositeImage) may be specified between DrawablePushPattern and DrawablePopPattern in order to draw the pattern. Normally the pair DrawablePushGraphicContext & DrawablePopGraphicContext are used to enclose a pattern definition. Pattern definitions are terminated by a DrawablePopPattern object.

    +

    DrawablePopPattern

    +

    void

    +

    Terminate a pattern definition started via DrawablePushPattern.

    +

    DrawableRectangle

    +

    double upperLeftX_, double upperLeftY_, double lowerRightX_, double lowerRightY

    +

    Draw a rectangle using stroke color and thickness from upper-left coordinates to lower-right coordinates. If a fill color is specified, then the object is filled.

    +

    DrawableRotation

    +

    double angle_

    +

    Set rotation to use when drawing (coordinate transformation).

    +

    DrawableRoundRectangle

    +

    double centerX_, double centerY_, double width_, double hight_, double cornerWidth_, double cornerHeight_

    +

    Draw a rounded rectangle using stroke color and thickness, with specified center coordinate, specified width and height, and specified corner width and height. If a fill color is specified, then the object is filled.

    +

    DrawableScaling

    +

    double x_, double y_

    +

    Apply scaling in x and y direction while drawing objects (coordinate transformation).

    +

    DrawableSkewX

    +

    double angle_

    +

    Apply Skew in X direction (coordinate transformation)

    +

    DrawableSkewY

    +

    double angle_

    +

    Apply Skew in Y direction

    +

    DrawableStrokeAntialias

    +

    bool flag_

    +

    Antialias while drawing lines or object outlines.

    +

    DrawableStrokeColor

    +

    const Color &color_

    +

    Set color to use when drawing lines or object outlines.

    +

    DrawableStrokeLineCap

    +

    LineCap linecap_

    +

    Specify the shape to be used at the end of open subpaths when they are stroked. Values of LineCap are UndefinedCap, ButtCap, RoundCap, and SquareCap.

    +

    DrawableStrokeLineJoin

    +

    LineJoin linejoin_

    +

    Specify the shape to be used at the corners of paths (or other vector shapes) when they are stroked. Values of LineJoin are UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin.

    +

    DrawableStrokeOpacity

    +

    double opacity_

    +

    Opacity to use when drawing lines or object outlines.

    +

    DrawableStrokeWidth

    +

    double width_

    +

    Set width to use when drawing lines or object outlines.

    +

    DrawableText

    +

    double x_, double y_, std::string text_

    +

    Annotate image with text using stroke color, font, font pointsize, and box color (text background color), at specified coordinates. If text contains special format characters the image filename, type, width, height, or other image attributes may be incorporated in the text (see label()).

    +

    const double x_, const double y_, const std::string &text_, const std::string &encoding_

    +

    Annotate image with text represented with text encoding, using current stroke color, font, font pointsize, and box color (text background color), at specified coordinates. If text contains special format characters the image filename, type, width, height, or other image attributes may be incorporated in the text (see label()).

    +

    The text encoding specifies the code set to use for text annotations. The only character encoding which may be specified at this time is "UTF-8" for representing Unicode as a sequence of bytes. Specify an empty string to set text encoding to the system's default. Successful text annotation using Unicode may require fonts designed to support Unicode.

    +

    DrawableTextAntialias

    +

    bool flag_

    +

    Antialias while drawing text (default true). The main reason to disable text antialiasing is to avoid adding new colors to the image.

    +

    DrawableTextDecoration

    +

    DecorationType decoration_

    +

    Specify decoration (e.g. UnderlineDecoration) to apply to text.

    +

    DrawableTextUnderColor

    +

    const Color &color_

    +

    Draw a box under rendered text using the specified color.

    +

    DrawableTranslation

    +

    double x_, double y_

    +

    Apply coordinate translation (set new coordinate origin).

    +

    DrawableViewbox

    +

    ssize_t x1_, ssize_t y1_, ssize_t x2_, ssize_t y2_

    +

    Dimensions of the output viewbox. If the image is to be written to a vector format (e.g. MVG or SVG), then a DrawablePushGraphicContext() object should be pushed to the head of the list, followed by a DrawableViewbox() statement to establish the output canvas size. A matching DrawablePopGraphicContext() object should be pushed to the tail of the list.

    +

    Vector Path Classes

    +

    The vector paths supported by Magick++ are based on those supported by the SVG XML specification. Vector paths are not directly drawable, they must first be supplied as a constructor argument to the DrawablePath class in order to create a drawable object. The DrawablePath class effectively creates a drawable compound component which may be replayed as desired. If the drawable compound component consists only of vector path objects using relative coordinates then the object may be positioned on the image by preceding it with a DrawablePath which sets the current drawing coordinate. Alternatively coordinate transforms may be used to translate the origin in order to position the object, rotate it, skew it, or scale it.

    +

    The "moveto" commands

    +

    The "moveto" commands establish a new current point. The effect is as if the "pen" were lifted and moved to a new location. A path data segment must begin with either one of the "moveto" commands or one of the "arc" commands. Subsequent "moveto" commands (i.e., when the "moveto" is not the first command) represent the start of a new subpath:

    +

    Moveto Classes

    + ++++ + + + + + + + + + + + + + +
    +

    Sub-Class

    +

    Constructor Signature

    +

    Description

    +

    PathMovetoAbs

    +

    const Magick::Coordinate &coordinate_

    +

    Start a new sub-path at the given coordinate. PathMovetoAbs indicates that absolute coordinates will follow; PathMovetoRel indicates that relative coordinates will follow. If a relative moveto appears as the first element of the path, then it is treated as a pair of absolute coordinates. If a moveto is followed by multiple pairs of coordinates, the subsequent pairs are treated as implicit lineto commands.

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    PathMovetoRel

    +

    const Magick::Coordinate &coordinate_

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    The "closepath" command

    +

    The "closepath" command causes an automatic straight line to be drawn from the current point to the initial point of the current subpath:

    +

    Closepath Classes

    + ++++ + + + + + + +
    +

    Sub-Class

    +

    Constructor Signature

    +

    Description

    +

    PathClosePath

    +

    void

    +

    Close the current subpath by drawing a straight line from the current point to current subpath's most recent starting point (usually, the most recent moveto point).

    +

    The "lineto" commands

    +

    The various "lineto" commands draw straight lines from the current point to a new point:

    +

    Lineto Classes

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Sub-Class

    +

    Constructor Signature

    +

    Description

    +

    PathLinetoAbs

    +

    const Magick::Coordinate& coordinate_

    +

    Draw a line from the current point to the given coordinate which becomes the new current point. PathLinetoAbs indicates that absolute coordinates are used; PathLinetoRel indicates that relative coordinates are used. A number of coordinates pairs may be specified in a list to draw a polyline. At the end of the command, the new current point is set to the final set of coordinates provided.

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    PathLinetoRel

    +

    const Magick::Coordinate& coordinate_

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    PathLinetoHorizontalAbs

    +

    double x_

    +

    Draws a horizontal line from the current point (cpx, cpy) to (x, cpy). PathLinetoHorizontalAbs indicates that absolute coordinates are supplied; PathLinetoHorizontalRel indicates that relative coordinates are supplied. At the end of the command, the new current point becomes (x, cpy) for the final value of x.

    +

    PathLinetoHorizontalRel

    +

    double x_

    +

    PathLinetoVerticalAbs

    +

    double y_

    +

    Draws a vertical line from the current point (cpx, cpy) to (cpx, y). PathLinetoVerticalAbs indicates that absolute coordinates are supplied; PathLinetoVerticalRel indicates that relative coordinates are supplied. At the end of the command, the new current point becomes (cpx, y) for the final value of y.

    +

    PathLinetoVerticalRel

    +

    double y_

    +

    The curve commands

    +

    These three groups of commands draw curves:

    + +

    The cubic Bézier curve commands

    +

    The cubic Bézier commands depend on the PathCurvetoArgs argument class, which has the constructor signature

    +
    +  PathCurvetoArgs( double x1_, double y1_, 
    +                   double x2_, double y2_, 
    +                   double x_, double y_ );
    +
    +

    The commands are as follows:

    +

    Cubic Bézier Curve Classes

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Sub-Class

    +

    Constructor Signature

    +

    Description

    +

    PathCurvetoAbs

    +

    const Magick::PathCurvetoArgs &args_

    +

    Draws a cubic Bézier curve from the current point to (x,y) using (x1,y1) as the control point at the beginning of the curve and (x2,y2) as the control point at the end of the curve. PathCurvetoAbs indicates that absolutecoordinates will follow; PathCurvetoRel indicates that relative coordinates will follow. Multiple sets of coordinates may be specified to draw a polybezier. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    +

    const std::list<Magick::PathCurvetoArgs> &args_

    +

    PathCurvetoRel

    +

    const Magick::PathCurvetoArgs &args_

    +

    const std::list<Magick::PathCurvetoArgs> &args_

    +

    PathSmoothCurvetoAbs

    +

    const Magick::Coordinate &coordinates_

    +

    Draws a cubic Bézier curve from the current point to (x,y). The first control point is assumed to be the reflection of the second control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not an PathCurvetoAbs, PathCurvetoRel, PathSmoothCurvetoAbs or PathSmoothCurvetoRel, assume the first control point is coincident with the current point.) (x2,y2) is the second control point (i.e., the control point at the end of the curve). PathSmoothCurvetoAbs indicates that absolute coordinates will follow; PathSmoothCurvetoRel indicates that relative coordinates will follow. Multiple sets of coordinates may be specified to draw a polybezier. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    PathSmoothCurvetoRel

    +

    const Magick::Coordinate &coordinates_

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    The quadratic Bézier curve commands

    +

    The quadratic Bézier commands depend on the PathQuadraticCurvetoArgs argument class, which has the constructor signature:

    +
    +  PathQuadraticCurvetoArgs( double x1_, double y1_, 
    +                            double x_, double y_ );
    +
    +

    The quadratic Bézier commands are as follows:

    +

    Quadratic Bézier Curve Classes

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Sub-Class

    +

    Constructor Signature

    +

    Description

    +

    PathQuadraticCurvetoAbs

    +

    const Magick::PathQuadraticCurvetoArgs &args_

    +

    Draws a quadratic Bézier curve from the current point to (x,y) using (x1,y1) as the control point. PathQuadraticCurvetoAbs indicates that absolute coordinates will follow; PathQuadraticCurvetoRel indicates that relative coordinates will follow. Multiple sets of coordinates may be specified to draw a polybezier. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    +

    const std::list<Magick::PathQuadraticCurvetoArgs> &args_

    +

    PathQuadraticCurvetoRel

    +

    const Magick::PathQuadraticCurvetoArgs &args_

    +

    const std::list<Magick::PathQuadraticCurvetoArgs> &args_

    +

    PathSmoothQuadraticCurvetoAbs

    +

    const Magick::Coordinate &coordinate_

    +

    Draws a quadratic Bézier curve from the current point to (x,y). The control point is assumed to be the reflection of the control point on the previous
    +command relative to the current point. (If there is no previous command or if the previous command was not a PathQuadraticCurvetoAbs, PathQuadraticCurvetoRel, PathSmoothQuadraticCurvetoAbs or PathSmoothQuadraticCurvetoRel, assume the control point is coincident with the current point.) PathSmoothQuadraticCurvetoAbs indicates that absolute coordinates will follow; PathSmoothQuadraticCurvetoRel indicates that relative coordinates will follow. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    PathSmoothQuadraticCurvetoRel

    +

    const Magick::Coordinate &coordinate_

    +

    const std::list<Magick::Coordinate> &coordinates_

    +

    The elliptical arc curve commands

    +

    The elliptical arc curve commands depend on the PathArcArgs argument class, which has the constructor signature:

    +
    +   PathArcArgs( double radiusX_, double radiusY_, 
    +                double xAxisRotation_, bool largeArcFlag_, 
    +                bool sweepFlag_, double x_, double y_ );
    +
    +

    The elliptical arc commands are as follows:

    +

    Elliptical Arc Curve Classes

    + ++++ + + + + + + + + + + + + + +
    +

    Sub-Class

    +

    Constructor Signature

    +

    Description

    +

    PathArcAbs

    +

    const Magick::PathArcArgs &coordinates_

    +

    Draws an elliptical arc from the current point to (x, y). The size and orientation of the ellipse are defined by two radii (radiusX, radiusY) and an xAxisRotation, which indicates how the ellipse as a whole is rotated relative to the current coordinate system. The center (cx, cy) of the ellipse is calculated automagically to satisfy the constraints imposed by the other parameters. largeArcFlag and sweepFlag contribute to the automatic calculations and help determine how the arc is drawn. If largeArcFlag is true then draw the larger of the available arcs. If sweepFlag is true, then draw the arc matching a clock-wise rotation.

    +

    const std::list<Magick::PathArcArgs> &coordinates_

    +

    PathArcRel

    +

    const Magick::PathArcArgs &coordinates_

    +

    const std::list<Magick::PathArcArgs> &coordinates_

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Drawable_example_1.png b/ImageMagick-6.9.12-44/www/Magick++/Drawable_example_1.png new file mode 100644 index 0000000000000000000000000000000000000000..50e204596b74d2ebb5f5361889f7c2c780a0195d GIT binary patch literal 1438 zcmaKsYcv#i7{>oDv#g0MWw*=3CbyYkl-tm%HH{eeb(=FqZ0nwg!(mC3+;fW=jZ4<8 zTn3pK4Iy_;gG?z2Nkplp7!+pyJA3x)o_#<3-uHRVd!CO^nv;W-yxd+n0DwHnn&=FG z1Xg?x$x4aoD}nVFuO=ruS4$`!kqCbI0w*S5Yb(5d9R>$O5(%QwP+1uw5D);kwFRf9 zU|AV-a)RsYu&WDtdP1QPa=FmM1Fo&XjEpuSh)e^PY@qQ1D187j8$fa!01<#+zd|at z@)WRX1}aNHLMV;{kj>6J2lPjP^d^9di!apyWH5Bcz>qP(JONNzns6V)#{*bdDJKAa zH-O$_05>*ZP>=`!)__kG0MgYYqJ?Yp^g28#C%RTZ!7}%N$N3$$P zhh_iF)mv}xhq)g&Hx&ssD)J)|7Xm!((gLE|%-5)ATA$q9d}?XiHb(HcgkRd39Aw;U z0pC;<@P=u#=%Wg-?TOQBKt#i!>gXAgiFsIvrtoRCDVci9v{2w>!pn4|P2wBdI!+I{ z_Dz4p^Ed4``gw8t*Lu&A$LHV2q-M9{NGUl#QStMG-{Qs#I+qV0V;w{h3BUAzQJ}e3 z?dh{RPD;s@rQ;i8&OD?#kA}@qa}^Fr%oPiL*)#85M%R=US9xW4t#_VMBgxO1vZXMYvJZ?vPHm_SThs#UhOvnW9HzUBO3HV#h@{ zGi@v4=m?JHp|hs+*=5ZwKcnHMm(bCGHwVF*3xyWek@cw6 zqk9@ceZM=gD!k0)8BsS_24tHSsoH@8&l#jqNy3V=L08AJlRLT8n`~x>2`<#DYVFLU z3%Gl(ME|J1@QHna8>Syw*qk-rSHn<_OK*<&%Xos9TWm&+taWVCKvl~hVV(To@3Pa+ zVVIRQ&#hq?#HF8q_v`tb$Zxw)W3qnR`nT0hqtMG9r3bad-z#QHCP`g~?c>t7o$F&_ zag(ow!?zd&0#nYmg+r^0X9aW6nuqG{U99_{D54_J$h)IFt8I$vOQt?Q`Q)=nEtVeA zU{sQtMDI@I^jtKSrY2D$ff)aI6di;Zi89nA)3!u3GJHzWO=UjSuogSSR;XsG`Hwx| z5Q<9?7-ZO6RR*@twCWxc_+#F1B#ULTG04yINN-9s{}XuB6N}kFQJLCG9%9bU_$1Mi z*0T(ovCXagCg02T%Rq0Lb2XWHR`wp2(Gu|3*P=dL8ix!NVxuY6n7gkZNuF9Am7?J5 zNSkU%zY=GhPZ=X&IR%^3LN(7#Y6@z_G1Z + + + + +Magick++ API: Enumerations + + + +
    +

    Enumerations

    + + + + +
    +

    > + Contents

    +
    + + + + + +
    +

    > + ChannelType

    +
    +

    ChannelType is used as an +argument when doing color separations. Use ChannelType when +extracting a layer from an image. MatteChannel is useful for +extracting the opacity values from an image. Note that an image may +be represented in RGB, RGBA, CMYK, or CMYKA, pixel formats and a +channel may only be extracted if it is valid for the current pixel +format.

    +

    ChannelType

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedChannel

    +
    +

    Unset value.

    +
    +

    RedChannel

    +
    +

    Extract red channel (RGB images only)

    +
    +

    CyanChannel

    +
    +

    Extract cyan channel (CMYK images only)

    +
    +

    GreenChannel

    +
    +

    Extract green channel (RGB images only)

    +
    +

    MagentaChannel

    +
    +

    Extract magenta channel (CMYK images only)

    +
    +

    BlueChannel

    +
    +

    Extract blue channel (RGB images only)

    +
    +

    YellowChannel

    +
    +

    Extract yellow channel (CMYK images only)

    +
    +

    OpacityChannel

    +
    +

    Extract matte (opacity values) channel (CMYKA images only)

    +
    +

    BlackChannel

    +
    +

    Extract black channel (CMYK images only)

    +
    +

    MatteChannel

    +
    +

    Extract matte (opacity values) channel (RGB images only)

    +
    +


    +

    + + + + +
    +

    + + > + ClassType

    +
    +

    ClassType specifies the image +storage class. +

    +

    ClassType

    + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedClass

    +
    +

    Unset value.

    +
    +

    DirectClass

    +
    +

    Image is composed of pixels which represent literal color + values.

    +
    +

    PseudoClass

    +
    +

    Image is composed of pixels which specify an index in a color + palette.

    +
    +


    +

    + + + + +
    +

    + > + ColorspaceType

    +
    +

    The ColorspaceType enumeration is used to specify the colorspace +that quantization (color reduction and mapping) is done under or to +specify the colorspace when encoding an output image. Colorspaces are +ways of describing colors to fit the requirements of a particular +application (e.g. Television, offset printing, color monitors). +Color reduction, by default, takes place in the RGBColorspace. +Empirical evidence suggests that distances in color spaces such as +YUVColorspace or YIQColorspace correspond to perceptual +color differences more closely han do distances in RGB space. These +color spaces may give better results when color reducing an image. +Refer to quantize for more details. +

    +

    When encoding an output image, the +colorspaces RGBColorspace, CMYKColorspace, and +GRAYColorspace may be specified. The CMYKColorspace +option is only applicable when writing TIFF, JPEG, and Adobe +Photoshop bitmap (PSD) files. +

    +

    ColorspaceType

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedColorspace

    +
    +

    Unset value.

    +
    +

    CMYKColorspace

    +
    +

    Cyan-Magenta-Yellow-Black colorspace. CYMK is a subtractive + color system used by printers and photographers for the rendering + of colors with ink or emulsion, normally on a white surface.

    +
    +

    GRAYColorspace

    +
    +

    Grayscale colorspace

    +
    +

    HCLColorspace

    +
    +

    +
    +

    LabColorspace

    +
    +

    +
    +

    LCHabColorspace

    +
    +

    +
    +

    LuvColorspace

    +
    +

    +
    +

    OHTAColorspace

    +
    +

    +
    +

    RGBColorspace

    +
    +

    Red-Green-Blue colorspace.

    +
    +

    sRGBColorspace

    +
    +

    +
    +

    scRGBColorspace

    +
    +

    +
    +

    TransparentColorspace

    +
    +

    The Transparent color space behaves uniquely in that it + preserves the matte channel of the image if it exists.

    +
    +

    XYZColorspace

    +
    +

    +
    +

    YCbCrColorspace

    +
    +

    +
    +

    YCCColorspace

    +
    +

    +
    +

    YIQColorspace

    +
    +

    +
    +

    YPbPrColorspace

    +
    +

    +
    +

    YUVColorspace

    +
    +

    Y-signal, U-signal, and V-signal colorspace. YUV is most widely + used to encode color for use in television transmission.

    +
    +


    +

    + + + + +
    +

    + > + CompositeOperator

    +
    +

    CompositeOperator is used to +select the image composition algorithm used to compose a composite +image with an image. By default, each of the composite +image pixels are replaced by the corresponding image tile pixel. +Specify CompositeOperator to select a different algorithm. +

    +

    CompositeOperator

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedCompositeOp

    +
    +

    Unset value.

    +
    +

    OverCompositeOp

    +
    +

    The result is the union of the the two image shapes with the + composite image obscuring image in the region of + overlap.

    +
    +

    InCompositeOp

    +
    +

    The result is a simply composite image cut by the shape + of image. None of the image data of image is included in + the result.

    +
    +

    OutCompositeOp

    +
    +

    The resulting image is composite image with the shape of + image cut out.

    +
    +

    AtopCompositeOp

    +
    +

    The result is the same shape as image image, with + composite image obscuring image there the image + shapes overlap. Note that this differs from OverCompositeOp + because the portion of composite image outside of image's + shape does not appear in the result.

    +
    +

    XorCompositeOp

    +
    +

    The result is the image data from both composite image + and image that is outside the overlap region. The overlap + region will be blank.

    +
    +

    PlusCompositeOp

    +
    +

    The result is just the sum of the image data. Output + values are cropped to 255 (no overflow). This operation is + independent of the matte channels.

    +
    +

    MinusCompositeOp

    +
    +

    The result of composite image - image, with + overflow cropped to zero. The matte chanel is ignored (set to 255, + full coverage).

    +
    +

    AddCompositeOp

    +
    +

    The result of composite image + image, with + overflow wrapping around (mod 256).

    +
    +

    SubtractCompositeOp

    +
    +

    The result of composite image - image, with + underflow wrapping around (mod 256). The add and subtract + operators can be used to perform reverible transformations.

    +
    +

    DifferenceCompositeOp

    +
    +

    The result of abs(composite image - image). This + is useful for comparing two very similar images.

    +
    +

    MultiplyCompositeOp

    +
    +

    +
    +

    BumpmapCompositeOp

    +
    +

    The result image shaded by composite image.

    +
    +

    CopyCompositeOp

    +
    +

    The resulting image is image replaced with composite + image. Here the matte information is ignored.

    +
    +

    CopyRedCompositeOp

    +
    +

    The resulting image is the red layer in image replaced + with the red layer in composite image. The other layers are + copied untouched.

    +
    +

    CopyGreenCompositeOp

    +
    +

    The resulting image is the green layer in image replaced + with the green layer in composite image. The other layers + are copied untouched.

    +
    +

    CopyBlueCompositeOp

    +
    +

    The resulting image is the blue layer in image replaced + with the blue layer in composite image. The other layers + are copied untouched.

    +
    +

    CopyOpacityCompositeOp

    +
    +

    The resulting image is the matte layer in image replaced + with the matte layer in composite image. The other layers + are copied untouched. +

    +

    The image compositor requires a matte, or alpha channel in the + image for some operations. This extra channel usually defines a + mask which represents a sort of a cookie-cutter for the image. + This is the case when matte is 255 (full coverage) for pixels + inside the shape, zero outside, and between zero and 255 on the + boundary. For certain operations, if image does not + have a matte channel, it is initialized with 0 for any pixel + matching in color to pixel location (0,0), otherwise 255 (to work + properly borderWidth must be 0).

    +
    +

    ClearCompositeOp

    +
    +

    +
    +

    DissolveCompositeOp

    +
    +

    +
    +

    DisplaceCompositeOp

    +
    +

    +
    +

    ModulateCompositeOp

    +
    +

    +
    +

    ThresholdCompositeOp

    +
    +

    +
    +


    +

    + + + + +
    +

    >CompressionType

    +
    +

    CompressionType is used to +express the desired compression type when encoding an image. Be aware +that most image types only support a sub-set of the available +compression types. If the compression type specified is incompatable +with the image, ImageMagick selects a compression type compatable +with the image type. +

    +

    CompressionType

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedCompression

    +
    +

    Unset value.

    +
    +

    NoCompression

    +
    +

    No compression

    +
    +

    BZipCompression

    +
    +

    BZip (Burrows-Wheeler block-sorting text compression algorithm + and Huffman coding) as used by bzip2 utilities

    +
    +

    FaxCompression

    +
    +

    CCITT Group 3 FAX compression

    +
    +

    Group4Compression

    +
    +

    CCITT Group 4 FAX compression (used only for TIFF)

    +
    +

    JPEGCompression

    +
    +

    JPEG compression

    +
    +

    LZWCompression

    +
    +

    Lempel-Ziv-Welch (LZW) compression (caution, patented by + Unisys)

    +
    +

    RunlengthEncodedCompression

    +
    +

    Run-Length encoded (RLE) compression

    +
    +

    ZipCompression

    +
    +

    Lempel-Ziv compression (LZ77) as used in PKZIP and GNU gzip.

    +
    +


    +

    + + + + +
    +

    + > + DecorationType

    +
    +

    The DecorationType enumerations +are used to specify line decorations of rendered text. +

    +

    DecorationType

    + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    NoDecoration

    +
    +

    No decoration

    +
    +

    UnderlineDecoration

    +
    +

    Underlined text

    +
    +

    OverlineDecoration

    +
    +

    Overlined text

    +
    +

    LineThroughDecoration

    +
    +

    Strike-through text

    +
    +


    +

    + + + + +
    +

    >EndianType

    +
    +

    The EndianType enumerations are +used to specify the endian option for formats which support it (e.g. +TIFF). +

    +


    +

    +

    EndianType

    + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedEndian

    +
    +

    Not defined (default)

    +
    +

    LSBEndian

    +
    +

    Little endian (like Intel X86 and DEC Alpha)

    +
    +

    MSBEndian

    +
    +

    Big endian (like Motorola 68K, Mac PowerPC, & SPARC)

    +
    +


    +

    + + + + +
    +

    >FillRule

    +
    +

    FillRule specifies the algorithm +which is to be used to determine what parts of the canvas are +included inside the shape. See the documentation on SVG's fill-rule +property for usage details. +

    +

    FillRule

    + + + + + + + + + + + + + +
    +

    UndefinedRule

    +
    +

    Fill rule not specified

    +
    +

    EvenOddRule

    +
    +

    See SVG fill-rule evenodd rule.

    +
    +

    NonZeroRule

    +
    +

    See SVG fill-rule nonzero rule.

    +
    +


    +

    + + + + +
    +

    >FilterTypes

    +
    +

    FilterTypes is used to adjust +the filter algorithm used when resizing images. Different filters +experience varying degrees of success with various images and can +take sipngicantly different amounts of processing time. +ImageMagick uses the LanczosFilter by default since this +filter has been shown to provide the best results for most images in +a reasonable amount of time. Other filter types (e.g. TriangleFilter) +may execute much faster but may show artifacts when the image is +re-sized or around diagonal lines. The only way to be sure is to test +the filter with sample images. +

    +

    FilterTypes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedFilter

    +
    +

    Unset value.

    +
    +

    PointFilter

    +
    +

    Point Filter

    +
    +

    BoxFilter

    +
    +

    Box Filter

    +
    +

    TriangleFilter

    +
    +

    Triangle Filter

    +
    +

    HermiteFilter

    +
    +

    Hermite Filter

    +
    +

    HanningFilter

    +
    +

    Hanning Filter

    +
    +

    HammingFilter

    +
    +

    Hamming Filter

    +
    +

    BlackmanFilter

    +
    +

    Blackman Filter

    +
    +

    GaussianFilter

    +
    +

    Gaussian Filter

    +
    +

    QuadraticFilter

    +
    +

    Quadratic Filter

    +
    +

    CubicFilter

    +
    +

    Cubic Filter

    +
    +

    CatromFilter

    +
    +

    Catrom Filter

    +
    +

    MitchellFilter

    +
    +

    Mitchell Filter

    +
    +

    LanczosFilter

    +
    +

    Lanczos Filter

    +
    +

    BesselFilter

    +
    +

    Bessel Filter

    +
    +

    SincFilter

    +
    +

    Sinc Filter

    +
    +


    +

    + + + + +
    +

    >GravityType

    +
    +

    GravityType specifies +positioning of an object (e.g. text, image) within a bounding region +(e.g. an image). Gravity provides a convenient way to locate objects +irrespective of the size of the bounding region, in other words, you +don't need to provide absolute coordinates in order to position an +object. A common default for gravity is NorthWestGravity. +

    +

    GravityType

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    ForgetGravity

    +
    +

    Don't use gravity.

    +
    +

    NorthWestGravity

    +
    +

    Position object at top-left of region.

    +
    +

    NorthGravity

    +
    +

    Postiion object at top-center of region

    +
    +

    NorthEastGravity

    +
    +

    Position object at top-right of region

    +
    +

    WestGravity

    +
    +

    Position object at left-center of region

    +
    +

    CenterGravity

    +
    +

    Position object at center of region

    +
    +

    EastGravity

    +
    +

    Position object at right-center of region

    +
    +

    SouthWestGravity

    +
    +

    Position object at left-bottom of region

    +
    +

    SouthGravity

    +
    +

    Position object at bottom-center of region

    +
    +

    SouthEastGravity

    +
    +

    Position object at bottom-right of region

    +
    +


    +

    + + + + +
    +

    >ImageType

    +
    +

    ImageType indicates the type +classification of the image. +

    +

    ImageType

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedType

    +
    +

    Unset value.

    +
    +

    BilevelType

    +
    +

    Monochrome image

    +
    +

    GrayscaleType

    +
    +

    Grayscale image

    +
    +

    GrayscaleMatteType

    +
    +

    Grayscale image with opacity

    +
    +

    PaletteType

    +
    +

    Indexed color (palette) image

    +
    +

    PaletteMatteType

    +
    +

    Indexed color (palette) image with opacity

    +
    +

    TrueColorType

    +
    +

    Truecolor image

    +
    +

    TrueColorMatteType

    +
    +

    Truecolor image with opacity

    +
    +

    ColorSeparationType

    +
    +

    Cyan/Yellow/Magenta/Black (CYMK) image

    +
    +


    +

    + + + + +
    +

    >InterlaceType

    +
    +

    InterlaceType specifies the ordering of the red, green, and +blue pixel information in the image. Interlacing is usually used to +make image information available to the user faster by taking +advantage of the space vs time tradeoff. For example, interlacing +allows images on the Web to be recognizable sooner and satellite +images to accumulate/render with image resolution increasing over +time. +

    +

    Use LineInterlace or +PlaneInterlace to create an interlaced GIF or progressive JPEG +image. +

    +

    InterlaceType

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedInterlace

    +
    +

    Unset value.

    +
    +

    NoInterlace

    +
    +

    Don't interlace image (RGBRGBRGBRGBRGBRGB...)

    +
    +

    LineInterlace

    +
    +

    Use scanline interlacing (RRR...GGG...BBB...RRR...GGG...BBB...)

    +
    +

    PlaneInterlace

    +
    +

    Use plane interlacing (RRRRRR...GGGGGG...BBBBBB...)

    +
    +

    PartitionInterlace

    +
    +

    Similar to plane interlaing except that the different planes + are saved to individual files (e.g. image.R, image.G, and image.B)

    +
    +


    +

    + + + + +
    +

    >ChannelType

    +
    +

    ChannelType is used as an +argument when doing color separations. Use ChannelType when +extracting a layer from an image. MatteLayer is useful for +extracting the opacity values from an image. +

    +

    ChannelType

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedLayer

    +
    +

    Unset value.

    +
    +

    RedLayer

    +
    +

    Select red layer

    +
    +

    GreenLayer

    +
    +

    Select green layer

    +
    +

    BlueLayer

    +
    +

    Select blue layer

    +
    +

    MatteLayer

    +
    +

    Select matte (opacity values) layer

    +
    +


    +

    + + + + +
    +

    >LineCap

    +
    +

    The LineCap enumerations specify +shape to be used at the end of open subpaths when they are stroked. +See SVG's 'stroke-linecap' +for examples. +

    +

    LineCap

    + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedCap

    +
    +

    Unset value.

    +
    +

    ButtCap

    +
    +

    Square ending.

    +
    +

    RoundCap

    +
    +

    Rounded ending (half-circle end with radius of 1/2 stroke + width).

    +
    +

    SquareCap

    +
    +

    Square ending, extended by 1/2 the stroke width at end.

    +
    +


    +

    + + + + +
    +

    >LineJoin

    +
    +

    The LineJoin enumerations +specify the shape to be used at the corners of paths or basic shapes +when they are stroked. See SVG's 'stroke-linejoin' +for examples. +

    +

    ChannelType

    + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedJoin

    +
    +

    Unset value.

    +
    +

    MiterJoin

    +
    +

    Sharp-edged join

    +
    +

    RoundJoin

    +
    +

    Rounded-edged join

    +
    +

    BevelJoin

    +
    +

    Beveled-edged join

    +
    +


    +

    + + + + +
    +

    >NoiseType

    +
    +

    NoiseType is used as an argument +to select the type of noise to be added to the image. +

    +

    NoiseType

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UniformNoise

    +
    +

    Uniform noise

    +
    +

    GaussianNoise

    +
    +

    Gaussian noise

    +
    +

    MultiplicativeGaussianNoise

    +
    +

    Multiplicative Gaussian noise

    +
    +

    ImpulseNoise

    +
    +

    Impulse noise

    +
    +

    LaplacianNoise

    +
    +

    Laplacian noise

    +
    +

    PoissonNoise

    +
    +

    Poisson noise

    +
    +


    +

    + + + + + +
    +

    + >OrientationType

    +
    +

    OrientationType +specifies the orientation of the image. Useful for when the image is +produced via a different ordinate system, the camera was turned on +its side, or the page was scanned sideways.

    +

    OrientationType

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Scanline Direction

    +
    +

    Frame Direction

    +
    +

    UndefinedOrientation

    +
    +

    Unknown

    +
    +

    Unknown

    +
    +

    TopLeftOrientation

    +
    +

    Left to right

    +
    +

    Top to bottom

    +
    +

    TopRightOrientation

    +
    +

    Right to left

    +
    +

    Top to bottom

    +
    +

    BottomRightOrientation

    +
    +

    Right to left

    +
    +

    Bottom to top

    +
    +

    BottomLeftOrientation

    +
    +

    Left to right

    +
    +

    Bottom to top

    +
    +

    LeftTopOrientation

    +
    +

    Top to bottom

    +
    +

    Left to right

    +
    +

    RightTopOrientation

    +
    +

    Top to bottom

    +
    +

    Right to left

    +
    +

    RightBottomOrientation

    +
    +

    Bottom to top

    +
    +

    Right to left

    +
    +

    LeftBottomOrientation

    +
    +

    Bottom to top

    +
    +

    Left to right

    +
    +


    +

    + + + + +
    +

    >PaintMethod

    +
    +

    PaintMethod specifies how pixel +colors are to be replaced in the image. It is used to select the +pixel-filling algorithm employed. +

    +

    PaintMethod

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    PointMethod

    +
    +

    Replace pixel color at point.

    +
    +

    ReplaceMethod

    +
    +

    Replace color for all image pixels matching color at point.

    +
    +

    FloodfillMethod

    +
    +

    Replace color for pixels surrounding point until encountering + pixel that fails to match color at point.

    +
    +

    FillToBorderMethod

    +
    +

    Replace color for pixels surrounding point until encountering + pixels matching border color.

    +
    +

    ResetMethod

    +
    +

    Replace colors for all pixels in image with pen color.

    +
    +


    +

    + + + + +
    +

    >QuantumTypes

    +
    +

    QuantumTypes is used to indicate +the source or destination format of entire pixels, or components of +pixels ("Quantums") while they are being read, or written +to, a pixel cache. The validity of these format specifications +depends on whether the Image pixels are in RGB format, RGBA format, +or CMYK format. The pixel Quantum size is determined by the Image +depth (eight or sixteen bits). +

    +

    RGB(A) Image Quantums

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    IndexQuantum

    +
    +

    PseudoColor colormap indices (valid only for image with + colormap)

    +
    +

    RedQuantum

    +
    +

    Red pixel Quantum

    +
    +

    GreenQuantum

    +
    +

    Green pixel Quantum

    +
    +

    BlueQuantum

    +
    +

    Blue pixel Quantum

    +
    +

    AlphaQuantum

    +
    +

    Alpha Quantum

    +
    +


    +

    +

    CMY(K)(A) Image Quantum

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    CyanQuantum

    +
    +

    Cyan pixel Quantum

    +
    +

    MagentaQuantum

    +
    +

    Magenta pixel Quantum

    +
    +

    YellowQuantum

    +
    +

    Yellow pixel Quantum

    +
    +

    BlackQuantum

    +
    +

    Black pixel Quantum

    +
    +

    AlphaQuantum

    +
    +

    Alpha Quantum

    +
    +


    +

    +

    Grayscale Image +Quantums

    + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    GrayQuantum

    +
    +

    Gray pixel

    +
    +

    GrayOpacityQuantum

    +
    +

    Pixel opacity

    +
    +

    AlphaQuantum

    +
    +

    Alpha Quantum

    +
    +


    +

    +

    Entire Pixels +(Expressed in Byte Order)

    + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    RGBQuantum

    +
    +

    RGB pixel (24 or 48 bits)

    +
    +

    RGBAQuantum

    +
    +

    RGBA pixel (32 or 64 bits)

    +
    +

    CMYKQuantum

    +
    +

    CMYK pixel (32 or 64 bits)

    +
    +

    CMYKAQuantum

    +
    +

    CMYKA pixel (40 or 80 bits)

    +
    +


    +

    + + + + +
    +

    >RenderingIntent

    +
    +

    Rendering intent is a concept defined by ICC +Spec ICC.1:1998-09, "File Format for Color Profiles". +ImageMagick uses RenderingIntent in order to support ICC +Color Profiles. +

    +

    From the specification: "Rendering +intent specifies the style of reproduction to be used during the +evaluation of this profile in a sequence of profiles. It applies +specifically to that profile in the sequence and not to the entire +sequence. Typically, the user or application will set the rendering +intent dynamically at runtime or embedding time." +

    +

    RenderingIntent

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedIntent

    +
    +

    Unset value.

    +
    +

    SaturationIntent

    +
    +

    A rendering intent that specifies the saturation of the pixels + in the image is preserved perhaps at the expense of accuracy in + hue and lightness.

    +
    +

    PerceptualIntent

    +
    +

    A rendering intent that specifies the full gamut of the image + is compressed or expanded to fill the gamut of the destination + device. Gray balance is preserved but colorimetric accuracy might + not be preserved.

    +
    +

    AbsoluteIntent

    +
    +

    Absolute colorimetric

    +
    +

    RelativeIntent

    +
    +

    Relative colorimetric

    +
    +


    +

    + + + + +
    +

    >ResolutionType

    +
    +

    By default, ImageMagick defines +resolutions in pixels per inch. ResolutionType provides a +means to adjust this. +

    +

    ResolutionType

    + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedResolution

    +
    +

    Unset value.

    +
    +

    PixelsPerInchResolution

    +
    +

    Density specifications are specified in units of pixels per + inch (english units).

    +
    +

    PixelsPerCentimeterResolution

    +
    +

    Density specifications are specified in units of pixels per + centimeter (metric units).

    +
    +


    +

    + + + + +
    +

    >StorageType

    +
    +

    The StorageType enumerations are +used to specify the storage format of pixels in the source or +destination pixel array. +

    +

    StorageType

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    CharPixel

    +
    +

    Character type

    +
    +

    ShortPixel

    +
    +

    Short type

    +
    +

    IntegerPixel

    +
    +

    Integer type

    +
    +

    FloatPixel

    +
    +

    Float type

    +
    +

    DoublePixel

    +
    +

    Double type

    +
    +


    +

    + + + + +
    +

    >StretchType

    +
    +

    The StretchType enumerations are +used to specify the relative width of a font to the regular width for +the font family. If the width is not important, the AnyStretch +enumeration may be specified for a wildcard match. +

    +

    StretchType

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    AnyStretch

    +
    +

    Wildcard match for font stretch

    +
    +

    NormalStretch

    +
    +

    Normal width font

    +
    +

    UltraCondensedStretch

    +
    +

    Ultra-condensed (narrowest) font

    +
    +

    ExtraCondensedStretch

    +
    +

    Extra-condensed font

    +
    +

    CondensedStretch

    +
    +

    Condensed font

    +
    +

    SemiCondensedStretch

    +
    +

    Semi-Condensed font

    +
    +

    SemiExpandedStretch

    +
    +

    Semi-Expanded font

    +
    +

    ExpandedStretch

    +
    +

    Expanded font

    +
    +

    ExtraExpandedStretch

    +
    +

    Extra-Expanded font

    +
    +

    UltraExpandedStretch

    +
    +

    Ultra-expanded (widest) font

    +
    +


    +

    + + + + +
    +

    >StyleType

    +
    +

    The StyleType enumerations are +used to specify the style (e.g. Italic) of a font. If the style is +not important, the AnyStyle enumeration may be specified for a +wildcard match. +

    +

    StyleType

    + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    AnyStyle

    +
    +

    Wildcard match for font style

    +
    +

    NormalStyle

    +
    +

    Normal font style

    +
    +

    ItalicStyle

    +
    +

    Italic font style

    +
    +

    ObliqueStyle

    +
    +

    Oblique font style

    +
    +


    +

    + + + + +
    +

    >VirtualPixelMethod

    +
    +

    The VirtualPixelMethod enumerations are +used to specify the virtual pixel method. +

    +


    +

    +

    VirtualPixelMethod

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Enumeration

    +
    +

    Description

    +
    +

    UndefinedVirtualPixelMethod

    +
    +

    Not defined

    +
    +

    BackgroundVirtualPixelMethod

    +
    +

    the area surrounding the image is the background color +

    +
    +

    BlackVirtualPixelMethod

    +
    +

    the area surrounding the image is black

    +
    +

    CheckerTileVirtualPixelMethod

    +
    +

    alternate squares with image and background color +

    +
    +

    DitherVirtualPixelMethod

    +
    +

    non-random 32x32 dithered pattern +

    +
    +

    EdgeVirtualPixelMethod

    +
    +

    extend the edge pixel toward infinity +

    +
    +

    GrayVirtualPixelMethod

    +
    +

    the area surrounding the image is gray +

    +
    +

    HorizontalTileVirtualPixelMethod

    +
    +

    horizontally tile the image, background color above/below

    +
    +

    HorizontalTileEdgeVirtualPixelMethod

    +
    +

    horizontally tile the image and replicate the side edge pixels

    +
    +

    MirrorVirtualPixelMethod

    +
    +

    mirror tile the image +

    +
    +

    RandomVirtualPixelMethod

    +
    +

    choose a random pixel from the image +

    +
    +

    TileVirtualPixelMethod

    +
    +

    tile the image (default) +

    +
    +

    TransparentVirtualPixelMethod

    +
    +

    the area surrounding the image is transparent blackness +

    +
    +

    VerticalTileVirtualPixelMethod

    +
    +

    vertically tile the image, sides are background color +

    +
    +

    VerticalTileEdgeVirtualPixelMethod

    +
    +

    vertically tile the image and replicate the side edge pixels +

    +
    +

    WhiteVirtualPixelMethod

    +
    +

    the area surrounding the image is white +

    +
    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Exception.html b/ImageMagick-6.9.12-44/www/Magick++/Exception.html new file mode 100644 index 0000000..b582f44 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Exception.html @@ -0,0 +1,465 @@ + + + + + +Magick++ API: Exceptions + + + +
    +

    Magick::Exception Classes

    +

    Exception represents the base class of objects thrown when +Magick++reports an error. Magick++ throws C++ exceptions synchronous +with the operation where the error occurred. This allows errors to be +trapped within the enclosing code (perhaps the code to process a +single image) while allowing the code to be written with a simple +coding style.

    +

    A try/catch block should be placed around any sequence of +operations which can be considered an important body of work. For +example, if your program processes lists of images and some of these +images may be defective, by placing the try/catch block around the +entire sequence of code that processes one image (including +instantiating the image object), you can minimize the overhead of +error checking while ensuring that all objects created to deal with +that object are safely destroyed (C++ exceptions unroll the stack +until the enclosing try block, destroying any created objects). +

    +

    The pseudo code for the main loop of your program may look like: +

    +
    +using namespace std; +for infile in list +{ + try { + // Construct an image instance first so that we don't have to worry + // about object construction failure due to a minor warning exception + // being thrown. + Magick::Image image; + try { + // Try reading image file + image.read(infile); + } + catch( Magick::WarningCoder &warning ) + { + // Process coder warning while loading file (e.g. TIFF warning) + // Maybe the user will be interested in these warnings (or not). + // If a warning is produced while loading an image, the image + // can normally still be used (but not if the warning was about + // something important!) + cerr << "Coder Warning: " << warning.what() << endl; + } + catch( Magick::Warning &warning ) + { + // Handle any other Magick++ warning. + cerr << "Warning: " << warning.what() << endl; + } + catch( Magick::ErrorFileOpen &error ) + { + // Process Magick++ file open error + cerr << "Error: " << error.what() << endl; + continue; // Try next image. + } + try { + image.rotate(90); + image.write("outfile"); + } + catch ( MagickExeption & error) + { + // Handle problem while rotating or writing outfile. + cerr << "Caught Magick++ exception: " << error.what() << endl; + } + } + catch( std::exception & error ) + { + // Process any other exceptions derived from standard C++ exception + cerr << "Caught C++ STD exception: " << error.what() << endl; + } + catch( ... ) + { + // Process *any* exception (last-ditch effort). There is not a lot + // you can do here other to retry the operation that failed, or exit + } +} +
    +

    The desired location and number of try/catch blocks in your program +depends how sophisticated its error handling must be. Very simple +programs may use just one try/catch block.

    +

    The Exception class is derived from the C++ standard +exception class. This means that it contains a C++ string containing +additional information about the error (e.g to display to the user). +Obtain access to this string via the what() method.  For +example: +

    +
    +catch( Exception & error_ ) 
    +    { 
    +      cout << "Caught exception: " << error_.what() << endl; 
    +    }
    +
    +

    The classes Warning and Error derive from the +Exception class. Exceptions derived from Warning are +thrown to represent non-fatal errors which may effect the +completeness or quality of the result (e.g. one image provided as an +argument to montage is defective). In most cases, a Warning +exception may be ignored by catching it immediately, processing it +(e.g. printing a diagnostic) and continuing on. Exceptions derived +from Error are thrown to represent fatal errors that can not +produce a valid result (e.g. attempting to read a file which does not +exist). +

    +

    The specific derived exception classes +are shown in the following tables: +

    +

    Warning Sub-Classes

    +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +

      Warning

      +
      +

      Warning Description

      +
      +

      WarningUndefined

      +
      +

      Unspecified warning type.

      +
      +

      WarningBlob

      +
      +

      NOT + CURRENTLY USED

      +
      +

      WarningCache

      +
      +

      NOT + CURRENTLY USED

      +
      +

      WarningCoder

      +
      +

      Warnings issued by some coders.

      +
      +

      WarningConfigure

      +
      +

      NOT + CURRENTLY USED

      +
      +

      WarningCorruptImage

      +
      +

      Warning issued when an image is determined to be + corrupt.

      +
      +

      WarningDelegate

      +
      +

      Warnings reported by the delegate (interface to + external programs) subsystem.

      +
      +

      WarningDraw

      +
      +

      Warnings reported by the rendering subsystem.

      +
      +

      WarningFileOpen

      +
      +

      Warning reported when The image file could not be + opened (permission problem, wrong file type, or does not exist).

      +
      +

      WarningImage

      +
      +

      NOT CURRENTLY USED

      +
      +

      WarningMissingDelegate

      +
      +

      NOT CURRENTLY USED

      +
      +

      WarningModule

      +
      +

      NOT CURRENTLY USED

      +
      +

      WarningMonitor

      +
      +

      NOT CURRENTLY USED

      +
      +

      WarningOption

      +
      +

      Warning reported when an option is malformed or + out of range.

      +
      +

      WarningRegistry

      +
      +

      NOT CURRENTLY USED

      +
      +

      WarningResourceLimit

      +
      +

      Warning reported when a program resource is + exhausted (e.g. not enough memory).

      +
      +

      WarningStream

      +
      +

      NOT CURRENTLY USED

      +
      +

      WarningType

      +
      +

      NOT CURRENTLY USED

      +
      +

      WarningXServer

      +
      +

      Warnings reported by the X11 subsystem.

      +
    +


    +

    +

    Error Sub-Classes

    +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +

      Error

      +
      +

      Error Description

      +
      +

      ErrorUndefined

      +
      +

      Unspecified error type.

      +
      +

      ErrorBlob

      +
      +

      Error reported by BLOB I/O subsystem.

      +
      +

      ErrorCache

      +
      +

      Error reported by the pixel cache subsystem.

      +
      +

      ErrorCoder

      +
      +

      Error reported by coders (image format support).

      +
      +

      ErrorConfigure

      +
      +

      Errors reported while loading configuration files.

      +
      +

      ErrorCorruptImage

      +
      +

      Error reported when the image file is corrupt.

      +
      +

      ErrorDelegate

      +
      +

      Errors reported by the delegate (interface to + external programs) subsystem.

      +
      +

      ErrorDraw

      +
      +

      Error reported while drawing on image.

      +
      +

      ErrorFileOpen

      +
      +

      Error reported when the image file can not be + opened.

      +
      +

      ErrorImage

      +
      +

      Errors reported while drawing.

      +
      +

      ErrorMissingDelegate

      +
      +

      Error reported when an add-on library or program + is necessary in order to support the requested operation.

      +
      +

      ErrorModule

      +
      +

      Errors reported by the module loader subsystem.

      +
      +

      ErrorMonitor

      +
      +

      NOT CURRENTLY USED

      +
      +

      ErrorOption

      +
      +

      Error reported when an option is malformed or out + of range.

      +
      +

      ErrorRegistry

      +
      +

      Errors reported by the image/BLOB registry + subsystem.

      +
      +

      ErrorResourceLimit

      +
      +

      Error reported when a program resource is + exhausted (e.g. not enough memory).

      +
      +

      ErrorStream

      +
      +

      Errors reported by the pixel stream subsystem.

      +
      +

      ErrorType

      +
      +

      Errors reported by the type (font) rendering + subsystem.

      +
      +

      ErrorXServer

      +
      +

      Errors reported by the X11 subsystem.

      +
    +



    +

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/FormatCharacters.html b/ImageMagick-6.9.12-44/www/Magick++/FormatCharacters.html new file mode 100644 index 0000000..054c5cb --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/FormatCharacters.html @@ -0,0 +1,96 @@ + + + + + +Magick++ API: Annotating an Image + + + +
    +

    Special Format Characters

    +

    The Magick::Image methods annotate, draw, label, and the template function montageImages support special format characters contained in the argument text. These format characters work similar to C's printf. Whenever a format character appears in the text, it is replaced with the equivalent attribute text. The available format characters are shown in the following table.

    +
    +

    Format Characters

    +
    + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Format Character

    +

    Description

    +

    %b

    +

    file size

    +

    %d

    +

    directory

    +

    %e

    +

    filename extension

    +

    %f

    +

    filename

    +

    %h

    +

    height

    +

    %m

    +

    magick (e.g GIF)

    +

    %p

    +

    page number

    +

    %s

    +

    scene number

    +

    %t

    +

    top of filename

    +

    %w

    +

    width

    +

    %x

    +

    x resolution

    +

    %y

    +

    y resolution

    +

    \n

    +

    newline

    +

    \r

    +

    carriage return

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Future.html b/ImageMagick-6.9.12-44/www/Magick++/Future.html new file mode 100644 index 0000000..924dede --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Future.html @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Geometry.html b/ImageMagick-6.9.12-44/www/Magick++/Geometry.html new file mode 100644 index 0000000..cfb6bcf --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Geometry.html @@ -0,0 +1,820 @@ + + + + + +Magick++ API: Geometry + + + +
    +

    Magick::Geometry

    +

    Geometry provides a convenient means to specify a geometry +argument. The object may be initialized from a C string or C++ string +containing a geometry specification. It may also be initialized by +more efficient parameterized constructors. +

    +

    Geometry +Specifications

    +

    Geometry specifications are in the form +"<width>x<height>{+-}<xoffset>{+-}<yoffset>" +(where width, height, xoffset, and yoffset +are numbers) for specifying the size and placement location for an +object. +

    +

    The width and height +parts of the geometry specification are measured in pixels. The +xoffset and yoffset parts are also measured in pixels +and are used to specify the distance of the placement coordinate from +the left and top and edges of the image, respectively. Both types of +offsets are measured from the indicated edge of the object to the +corresponding edge of the image. The X offset may be specified in the +following ways: +

    + + + + + + + + + + + +
    +

    +xoffset

    +
    +

    The left edge of the object is to be placed xoffset + pixels in from the left edge of the image.

    +
    +

    -xoffset

    +
    +

    The left edge of the object is to be placed outside the image, + xoffset pixels out from the left edge of the image.

    +
    +

    The Y offset has similar meanings: +

    + + + + + + + + + + + +
    +

    +yoffset

    +
    +

    The top edge of the object is to be yoffset pixels + below the top edge of the image.

    +
    +

    -yoffset

    +
    +

    The top edge of the object is to be yoffset pixels + above the top edge of the image.

    +
    +

    Offsets must be given as pairs; in other words, in order to +specify either xoffset or yoffset both must be present. +

    +

    ImageMagick +Extensions To Geometry Specifications

    +

    ImageMagick has added a number of +qualifiers to the standard geometry string for use when resizing +images. The form of an extended geometry string is +"<width>x<height>{+-}<xoffset>{+-}<yoffset>{%}{!}{<}{>}". +Extended geometry strings should only be used when resizing +an image. Using an extended geometry string for other +applications may cause the API call to fail. The available +qualifiers are shown in the following table: +

    +

    ImageMagick Geometry +Qualifiers

    + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Qualifier

    +
    +

    Description

    +
    +

    %

    +
    +

    Interpret width and height as a percentage of the + current size.

    +
    +

    !

    +
    +

    Resize to width and height exactly, loosing original + aspect ratio.

    +
    +

    <

    +
    +

    Resize only if the image is smaller than the geometry + specification.

    +
    +

    >

    +
    +

    Resize only if the image is greater than the geometry + specification.

    +
    +

    Postscript Page Size Extension +To Geometry Specifications

    +

    Any geometry string specification supplied to the Geometry +constructor is considered to be a Postscript page size nickname if +the first character is not numeric. The Geometry constructor converts +these page size specifications into the equivalent numeric geometry +string specification (preserving any offset component) prior to +conversion to the internal object format. Postscript page size +specifications are short-hand for the pixel geometry required to fill +a page of that size. Since the 11x17 inch page size used in the US +starts with a digit, it is not supported as a Postscript page size +nickname. Instead, substitute the geometry specification "792x1224>" +when 11x17 output is desired. +

    +

    An example of a Postscript page size +specification is "letter+43+43>". +

    +

    Postscript Page Size +Nicknames

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Postscript Page Size Nickname

    +
    +

    Equivalent Extended Geometry Specification

    +
    +

    Ledger

    +
    +

    1224x792>

    +
    +

    Legal

    +
    +

    612x1008>

    +
    +

    Letter

    +
    +

    612x792>

    +
    +

    LetterSmall

    +
    +

    612x792>

    +
    +

    ArchE

    +
    +

    2592x3456>

    +
    +

    ArchD

    +
    +

    1728x2592>

    +
    +

    ArchC

    +
    +

    1296x1728>

    +
    +

    ArchB

    +
    +

    864x1296>

    +
    +

    ArchA

    +
    +

    648x864>

    +
    +

    A0

    +
    +

    2380x3368>

    +
    +

    A1

    +
    +

    1684x2380>

    +
    +

    A2

    +
    +

    1190x1684>

    +
    +

    A3

    +
    +

    842x1190>

    +
    +

    A4

    +
    +

    595x842>

    +
    +

    A4Small

    +
    +

    595x842>

    +
    +

    A5

    +
    +

    421x595>

    +
    +

    A6

    +
    +

    297x421>

    +
    +

    A7

    +
    +

    210x297>

    +
    +

    A8

    +
    +

    148x210>

    +
    +

    A9

    +
    +

    105x148>

    +
    +

    A10

    +
    +

    74x105>

    +
    +

    B0

    +
    +

    2836x4008>

    +
    +

    B1

    +
    +

    2004x2836>

    +
    +

    B2

    +
    +

    1418x2004>

    +
    +

    B3

    +
    +

    1002x1418>

    +
    +

    B4

    +
    +

    709x1002>

    +
    +

    B5

    +
    +

    501x709>

    +
    +

    C0

    +
    +

    2600x3677>

    +
    +

    C1

    +
    +

    1837x2600>

    +
    +

    C2

    +
    +

    1298x1837>

    +
    +

    C3

    +
    +

    918x1298>

    +
    +

    C4

    +
    +

    649x918>

    +
    +

    C5

    +
    +

    459x649>

    +
    +

    C6

    +
    +

    323x459>

    +
    +

    Flsa

    +
    +

    612x936>

    +
    +

    Flse

    +
    +

    612x936>

    +
    +

    HalfLetter

    +
    +

    396x612>

    +
    +

    Geometry Methods

    +

    Geometry provides methods to initialize +its value from strings, from a set of parameters, or via attributes. +The methods available for use in Geometry are shown in the following +table: +

    +

    Geometry Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Method

    +
    +

    Return Type

    +
    +

    Signature(s)

    +
    +

    Description

    +
    +

    Geometry

    +
    +

     

    +
    +

    size_t width_, size_t height_, ssize_t xOff_ = + 0, ssize_t yOff_ = 0, bool xNegative_ = false, bool + yNegative_ = false

    +
    +

    Construct geometry via explicit parameters.

    +
    +

    const string geometry_

    +
    +

    Construct geometry from C++ string

    +
    +

    const char * geometry_

    +
    +

    Construct geometry from C string

    +
    +

    width

    +
    +

    void

    +
    +

    size_t width_

    +
    +

    Width

    +
    +

    size_t

    +
    +

    void

    +
    +

    height

    +
    +

    void

    +
    +

    size_t height_

    +
    +

    Height

    +
    +

    size_t

    +
    +

    void

    +
    +

    xOff

    +
    +

    void

    +
    +

    ssize_t xOff_

    +
    +

    X offset from origin

    +
    +

    ssize_t

    +
    +

    void

    +
    +

    yOff

    +
    +

    void

    +
    +

    ssize_t yOff_

    +
    +

    Y offset from origin

    +
    +

    size_t

    +
    +

    void

    +
    +

    xNegative

    +
    +

    void

    +
    +

    bool xNegative_

    +
    +

    Sign of X offset negative? (X origin at right)

    +
    +

    bool

    +
    +

    void

    +
    +

    yNegative

    +
    +

    void

    +
    +

    bool yNegative_

    +
    +

    Sign of Y offset negative? (Y origin at bottom)

    +
    +

    bool

    +
    +

    void

    +
    +

    percent

    +
    +

    void

    +
    +

    bool percent_

    +
    +

    Width and height are expressed as percentages

    +
    +

    bool

    +
    +

    void

    +
    +

    aspect

    +
    +

    void

    +
    +

    bool aspect_

    +
    +

    Resize without preserving aspect ratio (!)

    +
    +

    bool

    +
    +

    void

    +
    +

    greater

    +
    +

    void

    +
    +

    bool greater_

    +
    +

    Resize if image is greater than size (>)

    +
    +

    bool

    +
    +

    void

    +
    +

    less

    +
    +

    void

    +
    +

    bool less_

    +
    +

    Resize if image is less than size (<)

    +
    +

    bool

    +
    +

    void

    +
    +

    isValid

    +
    +

    void

    +
    +

    bool isValid_

    +
    +

    Does object contain a valid geometry? May be set to false + in order to invalidate an existing geometry object.

    +
    +

    bool

    +
    +

    void

    +
    +

    operator =

    +
    +

    const Geometry&

    +
    +

    const string geometry_

    +
    +

    Set geometry via C++ string

    +
    +

    operator =

    +
    +

    const Geometry&

    +
    +

    const char * geometry_

    +
    +

    Set geometry via C string

    +
    +

    operator string

    +
    +

    string

    +
    +

    Geometry&

    +
    +

    Obtain C++ string representation of geometry

    +
    +

    In addition, we support these yet to be documented geometry flags: the fill area flag ('^') and the pixel area count limit flag ('@').

    +



    +

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Image++.html b/ImageMagick-6.9.12-44/www/Magick++/Image++.html new file mode 100644 index 0000000..1ce082e --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Image++.html @@ -0,0 +1,3145 @@ + + + + + +Magick++ API: Working with Images + + + +
    +
    +

    Magick::Image Class

    +
    +

    Quick Contents

    + +

    Image is the primary object in Magick++ and represents +a single image frame (see design ). The +STL interface must be used to operate on +image sequences or images (e.g. of format GIF, TIFF, MIFF, Postscript, +& MNG) which are comprized of multiple image frames. Individual +frames of a multi-frame image may be requested by adding array-style +notation to the end of the file name (e.g. "animation.gif[3]" retrieves +the fourth frame of a GIF animation.  Various image manipulation +operations may be applied to the image. Attributes may be set on the +image to influence the operation of the manipulation operations. The Pixels class provides low-level access to +image +pixels. As a convenience, including <Magick++.h> +is sufficient in order to use the complete Magick++ API. The Magick++ +API is enclosed within the Magick namespace so you must either +add the prefix " Magick:: " to each class/enumeration name or +add +the statement " using namespace Magick;" after including the Magick++.h +header.

    +

    The preferred way to allocate Image objects is via automatic +allocation (on the stack). There is no concern that allocating Image +objects on the stack will excessively enlarge the stack since Magick++ +allocates all large data objects (such as the actual image data) from +the heap. Use of automatic allocation is preferred over explicit +allocation (via new) since it is much less error prone and +allows use of C++ scoping rules to avoid memory leaks. Use of automatic +allocation allows Magick++ objects to be assigned and copied just like +the C++ intrinsic data types (e.g. 'int '), leading to clear and +easy to read code. Use of automatic allocation leads to naturally +exception-safe code since if an exception is thrown, the object is +automagically deallocated once the stack unwinds past the scope of the +allocation (not the case for objects allocated via new ).

    +

    Image is very easy to use. For example, here is a the source to a +program which reads an image, crops it, and writes it to a new file +(the +exception handling is optional but strongly recommended):

    +
    +#include <Magick++.h> 
    +#include <iostream> 
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +
    +  // Construct the image object. Seperating image construction from the 
    +  // the read operation ensures that a failure to read the image file 
    +  // doesn't render the image object useless. 
    +  Image image;
    +  try { 
    +    // Read a file into image object 
    +    image.read( "girl.gif" );
    +
    +    // Crop the image to specified size (width, height, xOffset, yOffset)
    +    image.crop( Geometry(100,100, 100, 100) );
    +
    +    // Write the image to a file 
    +    image.write( "x.gif" ); 
    +  } 
    +  catch( Exception &error_ ) 
    +    { 
    +      cout << "Caught exception: " << error_.what() << endl; 
    +      return 1; 
    +    } 
    +  return 0; 
    +}
    +
    +The following is the source to a program which illustrates the use of +Magick++'s efficient reference-counted assignment and copy-constructor +operations which minimize use of memory and eliminate unncessary copy +operations (allowing Image objects to be efficiently assigned, and +copied into containers).  The program accomplishes the +following: +
      +
    1. Read master image.
    2. +
    3. Assign master image to second image.
    4. +
    5. Resize second image to the size 640x480.
    6. +
    7. Assign master image to a third image.
    8. +
    9. Resize third image to the size 800x600.
    10. +
    11. Write the second image to a file.
    12. +
    13. Write the third image to a file.
    14. +
    +
    +#include <Magick++.h> 
    +#include <iostream> 
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +
    +  Image master("horse.jpg"); 
    +  Image second = master; 
    +  second.resize("640x480"); 
    +  Image third = master; 
    +  third.resize("800x600"); 
    +  second.write("horse640x480.jpg"); 
    +  third.write("horse800x600.jpg"); 
    +  return 0; 
    +}
    +
    +During the entire operation, a maximum of three images exist in memory +and the image data is never copied. +

    The following is the source for another simple program which creates +a 100 by 100 pixel white image with a red pixel in the center and +writes it to a file:

    +
    +#include <Magick++.h> 
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +  Image image( "100x100", "white" ); 
    +  image.pixelColor( 49, 49, "red" ); 
    +  image.write( "red_pixel.png" ); 
    +  return 0; 
    +}
    +
    +If you wanted to change the color image to grayscale, you could add the +lines: +
    +image.quantizeColorSpace( GRAYColorspace ); 
    +image.quantizeColors( 256 ); 
    +image.quantize( );
    +
    +

    or, more simply:

    +
    + image.type( GrayscaleType );
    +
    +

    prior to writing the image.

    +
    +

    BLOBs

    +
    +While encoded images (e.g. JPEG) are most often written-to and +read-from a disk file, encoded images may also reside in memory. +Encoded +images in memory are known as BLOBs (Binary Large OBjects) and may be +represented using the Blob class. The encoded +image may be initially placed in memory by reading it directly from a +file, reading the image from a database, memory-mapped from a disk +file, or could be written to memory by Magick++. Once the encoded image +has been placed within a Blob, it may be read into a Magick++ Image via +a constructor or read() +. Likewise, a Magick++ image may be written to a Blob via write() . +

    An example of using Image to write to a Blob follows:

    +
    +#include >Magick++.h> 
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +
    +  // Read GIF file from disk 
    +  Image image( "giraffe.gif" );
    +  // Write to BLOB in JPEG format 
    +  Blob blob; 
    +  image.magick( "JPEG" ) // Set JPEG output format 
    +  image.write( &blob );
    +
    +  [ Use BLOB data (in JPEG format) here ]
    +
    +  return 0; 
    +}
    +
    +


    +likewise, to read an image from a Blob, you could use one of the +following examples:

    +

    [ Entry condition for the following examples +is that data is pointer to encoded image data and length +represents the size of the data ]

    +
    +Blob blob( data, length ); 
    +Image image( blob );
    +
    +or +
    +Blob blob( data, length ); 
    +Image image; 
    +image.read( blob);
    +
    +some images do not contain their size or format so the size and format must be specified in advance: +
    +Blob blob( data, length ); 
    +Image image; 
    +image.size( "640x480") 
    +image.magick( "RGBA" ); 
    +image.read( blob);
    +
    +
    +

    Constructors

    +
    +Image may be constructed in a number of ways. It may be constructed +from a file, a URL, or an encoded image (e.g. JPEG) contained in an +in-memory BLOB . The available Image +constructors are shown in the following table:

    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Constructors
    +
    Signature
    +
    +
    Description
    +
    const std::string &imageSpec_Construct Image by reading from file or URL +specified by imageSpec_. Use array notation (e.g. filename[9]) +to select a specific scene from a multi-frame image.
    const Geometry &size_, const Color &color_Construct a blank image canvas of specified +size and color
    const Blob &blob_Construct Image by reading from +encoded image data contained in an in-memory BLOB +. Depending on the constructor arguments, the Blob size +, depth , magick (format) +may +also be specified. Some image formats require that size be specified. +The default ImageMagick uses for depth depends on the compiled-in +Quantum size (8 or 16).  If ImageMagick's Quantum size does not +match that of the image, the depth may need to be specified. +ImageMagick can usually automagically detect the image's format. +When a format can't be automagically detected, the format (magick ) must be specified.
    const Blob +&blob_, const Geometry &size_
    const Blob +&blob_, const Geometry &size, +size_t depth
    const Blob +&blob_, const Geometry &size, +size_t depth_, const string &magick_
    const Blob +&blob_, const Geometry &size, +const +string &magick_
    const size_t width_, 
    + const size_t height_,
    + std::string map_,
    + const +StorageType type_,
    + const void *pixels_
    Construct a new Image based on an array of +image pixels. The pixel data must be in scanline order top-to-bottom. +The data can be character, short int, integer, float, or double. Float +and double require the pixels to be normalized [0..1]. The other types +are [0..MaxRGB].  For example, to create a 640x480 image from +unsigned red-green-blue character data, use +

       Image image( 640, 480, "RGB", +0, pixels );

    +

    The parameters are as follows:

    + + + + + + + + + + + + + + + + + + + + + + + +
    width_Width in pixels of the image.
    height_Height in pixels of the image.
    map_This character string can be any +combination or order of R = red, G = green, B = blue, A = alpha, C = +cyan, Y = yellow M = magenta, and K = black. The ordering reflects the +order of the pixels in the supplied pixel array.
    type_Pixel +storage type (CharPixel, ShortPixel, IntegerPixel, FloatPixel, or +DoublePixel)
    pixels_This array of values contain the pixel +components as defined by the map_ and type_ parameters. The length of +the arrays must equal the area specified by the width_ and height_ +values and type_ parameters.
    +
    +
    +

    Image Manipulation +Methods

    +
    +Image supports access to all the single-image (versus +image-list) manipulation operations provided by the ImageMagick +library. If you +must process a multi-image file (such as an animation), the STL interface , which provides a multi-image +abstraction on top of Image, must be used. +

    Image manipulation methods are very easy to use.  For example:

    +
    +Image image; 
    +image.read("myImage.tiff"); 
    +image.addNoise(GaussianNoise); 
    +image.write("myImage.tiff");
    +
    +adds gaussian noise to the image file "myImage.tiff". +

    The operations supported by Image are shown in the following table:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Image Manipulation Methods
    MethodSignature(s)Description
    +
    adaptiveThreshold
    +
    +
    size_t width, size_t +height, size_t offset = 0
    +
    Apply adaptive thresholding to +the image. Adaptive thresholding is useful if the ideal threshold level +is not known in advance, or if the illumination gradient is not +constant +across the image. Adaptive thresholding works by evaulating the mean +(average) of a pixel region (size specified by width and height) +and using the mean as the thresholding value. In order to remove +residual noise from the background, the threshold may be adjusted by +subtracting a constant offset (default zero) from the mean to +compute the threshold.
    +
    +
    addNoise
    +
    NoiseType +noiseType_Add noise to image with specified noise type.
    addNoiseChannel
    +
    const ChannelType +channel_, const NoiseType noiseType_
    +
    Add noise to an image +channel with the specified noise type. The channel_ parameter specifies the +channel to add noise to.  The noiseType_ parameter +specifies the type of noise.
    +
    affineTransform
    +
    const DrawableAffine +&affine
    +
    Transform image by +specified affine (or free transform) matrix.
    +
    +
    annotate
    +
    const std::string &text_, const Geometry &location_Annotate using specified text, and placement +location
    string text_, const Geometry +&boundingArea_, GravityType +gravity_Annotate using specified text, bounding area, +and placement gravity. If boundingArea_ is invalid, then +bounding area is entire image.
    const std::string &text_, const Geometry &boundingArea_, GravityType gravity_, double +degrees_, Annotate with text using specified text, +bounding area, placement gravity, and rotation. If boundingArea_ +is invalid, then bounding area is entire image.
    const std::string &text_, GravityType gravity_Annotate with text (bounding area is entire +image) and placement gravity.
    +
    blur
    +
    const double radius_ = 1, const double sigma_ += 0.5Blur image. The radius_ parameter +specifies the radius of the Gaussian, in pixels, not counting the +center +pixel.  The sigma_ parameter specifies the standard +deviation of the Laplacian, in pixels.
    blurChannel
    +
    const ChannelType +channel_, const double radius_ = 0.0, const double sigma_ = 1.0
    +
    Blur an image +channel. The channel_ +parameter specifies the channel to blur. The radius_ parameter +specifies the radius of the Gaussian, in pixels, not counting the +center +pixel.  The sigma_ parameter specifies the standard +deviation of the Laplacian, in pixels.
    +
    border
    +
    const Geometry +&geometry_ = "6x6+0+0"Border image (add border to image).  The +color of the border is specified by the borderColor attribute.
    +
    cdl
    +
    const std::string &cdl_color correct with a color decision list. See http://en.wikipedia.org/wiki/ASC_CDL for details.
    +
    channel
    +
    ChannelType +layer_Extract channel from image. Use this option +to extract a particular channel from  the image.  MatteChannel +  for  example, is useful for extracting the opacity values +from an image.
    +
    charcoal
    +
    const double radius_ = 1, const double sigma_ += 0.5Charcoal effect image (looks like charcoal +sketch). The radius_ parameter specifies the radius of the +Gaussian, in pixels, not counting the center pixel.  The sigma_ +parameter specifies the standard deviation of the Laplacian, in pixels.
    +
    chop
    +
    const Geometry +&geometry_Chop image (remove vertical or horizontal +subregion of image)
    +
    colorize
    +
    const unsigned int opacityRed_, const +unsigned int opacityGreen_, const unsigned int opacityBlue_, const +Color &penColor_Colorize image with pen color, using +specified percent opacity for red, green, and blue quantums.
    +
    colorMatrix
    +
    const size_t order_, const double *color_matrix_apply color correction to the image.
    +
    comment
    +
    const std::string &comment_Comment image (add comment string to +image).  By default, each image is commented with its file name. +Use  this  method to  assign a specific comment to the +image.  Optionally you can include the image filename, type, +width, height, or other  image  attributes by embedding special format characters.
    compare
    +
    const Image &reference_
    +
    Compare current image with +another image. Sets meanErrorPerPixel +, normalizedMaxError , and normalizedMeanError in the current +image. False is returned if the images are identical. An ErrorOption +exception is thrown if the reference image columns, rows, colorspace, +or +matte differ from the current image.
    +
    +
    composite
    +
    const Image +&compositeImage_, ssize_t xOffset_, ssize_t yOffset_, CompositeOperator +compose_ = InCompositeOpCompose an image onto the current image at +offset specified by xOffset_, yOffset_ using the +composition algorithm specified by compose_
    const Image +&compositeImage_, const Geometry +&offset_, CompositeOperator +compose_ = InCompositeOpCompose an image onto the current image at +offset specified by offset_ using the composition algorithm +specified by compose_
    const Image +&compositeImage_, GravityType +gravity_, CompositeOperator +compose_ = InCompositeOpCompose an image onto the current image with +placement specified by gravity_ using the composition +algorithm +specified by compose_
    +
    contrast
    +
    size_t sharpen_Contrast image (enhance intensity differences +in image)
    +
    convolve
    +
    size_t order_, const double *kernel_Convolve image.  Applies a user-specfied +convolution to the image. The order_ parameter represents the +number of columns and rows in the filter kernel, and kernel_ +is a two-dimensional array of doubles representing the convolution +kernel to apply.
    +
    crop
    +
    const Geometry +&geometry_Crop image (subregion of original image)
    +
    cycleColormap
    +
    int amount_Cycle image colormap
    +
    despeckle
    +
    voidDespeckle image (reduce speckle noise)
    +
    display
    +
    voidDisplay image on screen.
    + Caution: if +an image format is not compatible with the display visual (e.g. +JPEG on a colormapped display) then the original image will be +altered. Use a copy of the original if this is a problem.
    +
    distort
    +
    const DistortImageMethod method, const size_t number_arguments, const double *arguments, const bool bestfit = false Distort image.  Applies a user-specfied +distortion to the image.
    +
    draw
    +
    const Drawable +&drawable_Draw shape or text on image.
    const std::list<Drawable +> &drawable_Draw shapes or text on image using a set of +Drawable objects contained in an STL list. Use of this method improves +drawing performance and allows batching draw objects together in a +list for repeated use.
    +
    edge
    +
    size_t radius_ = 0.0Edge image (hilight edges in image).  +The radius is the radius of the pixel neighborhood.. Specify a radius +of zero for automatic radius selection.
    +
    emboss
    +
    const double radius_ = 1, const double sigma_ += 0.5Emboss image (hilight edges with 3D effect). +The radius_ parameter specifies the radius of the Gaussian, in +pixels, not counting the center pixel.  The sigma_ +parameter specifies the standard deviation of the Laplacian, in pixels.
    +
    enhance
    +
    voidEnhance image (minimize noise)
    +
    equalize
    +
    voidEqualize image (histogram equalization)
    +
    erase
    +
    voidSet all image pixels to the current +background color.
    +
    extent
    const Geometry &geometry_extends the image as defined by the geometry, gravity, and image background color.
    const Geometry +&geometry_, const Color &backgroundColor_
    const Geometry &geometry_, const GravityType +&gravity_extends the image as defined by the geometry, gravity, and image background color.
    const Geometry +&geometry_, const Color &backgroundColor_, +const GravityType &gravity_
    +
    flip
    +
    voidFlip image (reflect each scanline in the +vertical direction)
    +
    floodFill- +
    + Color
    +
    ssize_t x_, ssize_t y_, const Color &fillColor_Flood-fill color across pixels +that match the color of the target pixel and are neighbors of the +target pixel. Uses current fuzz setting when determining color match.
    const Geometry +&point_, const Color &fillColor_
    ssize_t x_, ssize_t y_, const Color &fillColor_, const Color +&borderColor_Flood-fill color across pixels +starting at target-pixel and stopping at pixels matching specified +border color. Uses current fuzz setting when determining color match.
    const Geometry +&point_, const Color &fillColor_, +const Color &borderColor_
    floodFillOpacityconst long x_, const long y_, const unsigned int +opacity_, const PaintMethod method_Floodfill pixels matching color (within fuzz +factor) of target pixel(x,y) with replacement opacity value using +method.
    +
    floodFill- +
    + Texture
    +
    ssize_t x_, ssize_t y_,  const +Image &texture_Flood-fill texture across pixels +that match the color of the target pixel and are neighbors of the +target pixel. Uses current fuzz setting when determining color match.
    const Geometry +&point_, const Image &texture_
    ssize_t x_, ssize_t y_, const Image +&texture_, const Color &borderColor_Flood-fill texture across pixels +starting at target-pixel and stopping at pixels matching specified +border color. Uses current fuzz setting when determining color match.
    const Geometry +&point_, const Image &texture_, const +Color +&borderColor_
    +
    flop
    +
    void Flop image (reflect each scanline in the +horizontal direction)
    +
    frame
    +
    const Geometry +&geometry_ = "25x25+6+6"Add decorative frame around image
    size_t width_, size_t height_, +ssize_t x_, ssize_t y_, ssize_t innerBevel_ = 0, ssize_t outerBevel_ = 0
    +
    fx
    +
    const std::string expression, const Magick::ChannelType channelFx image.  Applies a mathematical +expression to the image.
    +
    gamma
    +
    double gamma_Gamma correct image (uniform red, green, and +blue correction).
    double gammaRed_, double gammaGreen_, double +gammaBlue_Gamma correct red, green, and blue channels +of image.
    +
    gaussianBlur
    +
    const double width_, const double sigma_Gaussian blur image. The number of neighbor +pixels to be included in the convolution mask is specified by +'width_'.  For example, a width of one gives a (standard) 3x3 +convolution mask. The standard deviation of the gaussian bell curve is +specified by 'sigma_'.
    gaussianBlurChannel
    +
    const ChannelType +channel_, const double radius_ = 0.0, const double sigma_ = 1.0
    +
    Gaussian blur +an image channel. The channel_ parameter specifies the +channel to blur. The number of neighbor +pixels to be included in the convolution mask is specified by +'width_'.  For example, a width of one gives a (standard) 3x3 +convolution mask. The standard deviation of the gaussian bell curve is +specified by 'sigma_'.
    haldClut
    +
    const Image &reference_
    +
    apply a Hald color lookup table to the image.
    +
    +
    implode
    +
    const double factor_Implode image (special effect)
    +
    inverseFourierTransform
    +
    const Image &phaseImage_, const bool magnitude_implements the inverse discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.
    +
    label
    +
    const string &label_Assign a label to an image. Use this option +to  assign  a  specific label to the image. Optionally +you can include the image filename, type, width, height, or scene +number in the label by embedding  +special format characters. If the first character of string is @, +the +image label is read from a file titled by the remaining characters in +the string. When converting to Postscript, use this  option to +specify a header string to print above the image.
    level
    +
    const double black_point, +const double white_point, const double mid_point=1.0
    +
    Level image. Adjust the +levels of the image by scaling the colors falling between specified +white and black points to the full available quantum range. The +parameters provided represent the black, mid (gamma), and white +points.  The black point specifies the darkest color in the image. +Colors darker than the black point are set to zero. Mid point (gamma) +specifies a gamma correction to apply to the image. White point +specifies the lightest color in the image.  Colors brighter than +the white point are set to the maximum quantum value. The black and +white point have the valid range 0 to MaxRGB while mid (gamma) has a +useful range of 0 to ten.
    +
    levelChannel
    +
    const ChannelType +channel, const double black_point, const double white_point, const +double mid_point=1.0
    +
    Level image channel. +Adjust the levels of the image channel by scaling the values falling +between specified white and black points to the full available quantum +range. The parameters provided represent the black, mid (gamma), and +white points. The black point specifies the darkest color in the image. +Colors darker than the black point are set to zero. Mid point (gamma) +specifies a gamma correction to apply to the image. White point +specifies the lightest color in the image. Colors brighter than the +white point are set to the maximum quantum value. The black and white +point have the valid range 0 to MaxRGB while mid (gamma) has a useful +range of 0 to ten.
    +
    +
    magnify
    +
    voidMagnify image by integral size
    +
    map
    +
    const Image &mapImage_ , bool dither_ = +falseRemap image colors with closest color from +reference image. Set dither_ to true in to apply +Floyd/Steinberg +error diffusion to the image. By default, color reduction chooses an +optimal  set  of colors that best represent the original +image. Alternatively, you can  choose  a  +particular  set  of colors  from  an image file +with this option.
    +
    matteFloodfill
    +
    const Color +&target_, const unsigned int  opacity_, const ssize_t x_, const +ssize_t +y_, PaintMethod method_Floodfill designated area with a replacement +opacity value.
    medianFilterconst double radius_ = 0.0Filter image by replacing each pixel +component with the median color in a circular neighborhood
    +
    mergeLayers
    +
    LayerMethod +noiseType_handle multiple images forming a set of image layers or animation frames.
    +
    minify
    +
    voidReduce image by integral size
    modifyImagevoidPrepare to update image. Ensures that there +is only one reference to the underlying image so that the underlying +image may be safely modified without effecting previous generations of +the image. Copies the underlying image to a new image if necessary.
    +
    modulate
    +
    double brightness_, double saturation_, +double hue_Modulate percent hue, saturation, and +brightness of an image. Modulation of saturation and brightness is as a +ratio of the current value (1.0 for no change). Modulation of hue is an +absolute rotation of -180 degrees to +180 degrees from the current +position corresponding to an argument range of 0 to 2.0 (1.0 for no +change).
    motionBlur
    +
    const double radius_, +const double sigma_, const double angle_
    +
    Motion blur image with +specified blur factor. The radius_ parameter specifies the radius of +the Gaussian, in pixels, not counting the center pixel.  The +sigma_ parameter specifies the standard deviation of the Laplacian, in +pixels. The angle_ parameter specifies the angle the object appears to +be comming from (zero degrees is from the right).
    +
    +
    negate
    +
    bool grayscale_ = falseNegate colors in image.  Replace every +pixel with its complementary color (white becomes black, yellow becomes +blue, etc.).  Set grayscale to only negate grayscale values in +image.
    +
    normalize
    +
    voidNormalize image (increase contrast by +normalizing the pixel values to span the full range of color values).
    +
    oilPaint
    +
    size_t radius_ = 3Oilpaint image (image looks like oil painting)
    +
    opacity
    +
    unsigned int opacity_Set or attenuate the opacity channel in the +image. If the image pixels are opaque then they are set to the +specified +opacity value, otherwise they are blended with the supplied opacity +value.  The value of opacity_ ranges from 0 (completely opaque) to + MaxRGB +. The defines OpaqueOpacity and TransparentOpacity are +available to specify completely opaque or completely transparent, +respectively.
    +
    opaque
    +
    const Color +&opaqueColor_, const Color &penColor_Change color of pixels matching opaqueColor_ +to specified penColor_.
    +
    ping
    +
    const std::string &imageSpec_Ping is similar to read +except only enough of the image is read to determine the image columns, +rows, and filesize.  The columns , + rows , and fileSize +attributes are valid after invoking ping.  The image data is not +valid after calling ping.
    const Blob &blob_
    process
    +
    std::string name_, +const ssize_t argc_, char **argv_
    +
    Execute the named +process module, passing any arguments via an argument vector, with +argc_ +specifying the number of arguments in the vector, and argv_ passing the +address of an array of null-terminated C strings which constitute the +argument vector. An exception is thrown if the requested process module +does not exist, fails to load, or fails during execution.
    +
    +
    quantize
    +
    bool measureError_ = falseQuantize image (reduce number of colors). Set +measureError_ to true in order to calculate error attributes.
    +
    raise
    +
    const Geometry +&geometry_ = "6x6+0+0",  bool raisedFlag_ =  falseRaise image (lighten or darken the edges of +an image to give a 3-D raised or lowered effect)
    +
    read
    +
    const string &imageSpec_Read image into current object
    const Geometry +&size_, const std::string &imageSpec_Read image of specified size into current +object. This form is useful for images that do not specifiy their size +or to specify a size hint for decoding an image. For example, when +reading a Photo CD, JBIG, or JPEG image, a size request causes the +library to return an image which is the next resolution greater or +equal to the specified size. This may result in memory and time savings.
    const Blob &blob_Read encoded image of specified +size from an in-memory BLOB into current +object. Depending on the method arguments, the Blob size, depth, and +format may also be specified. Some image formats require that size be +specified. The default ImageMagick uses for depth depends on its +Quantum size (8 or 16).  If ImageMagick's Quantum size does not +match that of the image, the depth may need to be specified. +ImageMagick can usually automagically detect the image's format. +When +a format can't be automagically detected, the format must be specified.
    const Blob +&blob_, const Geometry &size_
    const Blob +&blob_, const Geometry &size_, +size_t depth_
    const Blob +&blob_, const Geometry &size_, +size_t depth_, const string &magick_ 
    const Blob +&blob_, const Geometry &size_, +const +string &magick_
    const size_t width_, const size_t +height_, std::string map_, const StorageType type_, const void *pixels_Read image based on an array of image pixels. +The pixel data must be in scanline order top-to-bottom. The data can be +character, short int, integer, float, or double. Float and double +require the pixels to be normalized [0..1]. The other types are +[0..MaxRGB].  For example, to create a 640x480 image from +unsigned red-green-blue character data, use +

      image.read( 640, 480, "RGB", CharPixel, +pixels );

    +

    The parameters are as follows:

    + + + + + + + + + + + + + + + + + + + + + + + +
    width_Width in pixels of the image.
    height_Height in pixels of the image.
    map_This character string can be any +combination or order of R = red, G = green, B = blue, A = alpha, C = +cyan, Y = yellow M = magenta, and K = black. The ordering reflects the +order of the pixels in the supplied pixel array.
    type_Pixel storage type (CharPixel, +ShortPixel, IntegerPixel, FloatPixel, or DoublePixel)
    pixels_This array of values contain the pixel +components as defined by the map_ and type_ parameters. The length of +the arrays must equal the area specified by the width_ and height_ +values and type_ parameters.
    +
    +
    reduceNoise
    +
    const double order_reduce noise in image using a noise peak elimination filter.
    randomThreshold
    +
    const Geometry +&thresholds_
    +
    Random threshold the +image. Changes the value of individual pixels based on the intensity of +each pixel compared to a random threshold. The result is a +low-contrast, two color image. The thresholds_ argument is a +geometry containing LOWxHIGH thresholds. If the string contains +2x2, 3x3, or 4x4, then an ordered dither of order 2, 3, or 4 will be +performed instead. This is a very fast alternative to 'quantize' based +dithering.
    +
    randomThresholdChannel
    +
    const Geometry +&thresholds_, const ChannelType channel_
    +
    Random threshold an +image channel. Similar to randomThreshold() +but restricted to the specified channel.
    +
    +
    roll
    +
    int columns_, ssize_t rows_Roll image (rolls image vertically and +horizontally) by specified number of columnms and rows)
    +
    rotate
    +
    double degrees_Rotate image counter-clockwise by specified +number of degrees.
    +
    sample
    +
    const Geometry +&geometry_ Resize image by using pixel sampling algorithm
    +
    scale
    +
    const Geometry +&geometry_Resize image by using simple ratio algorithm
    +
    segment
    +
    double clusterThreshold_ = 1.0,
    + double smoothingThreshold_ = 1.5
    Segment (coalesce similar image components) +by analyzing the histograms of the color components and identifying +units that are homogeneous with the fuzzy c-means technique. Also uses quantizeColorSpace +and verbose image attributes. Specify clusterThreshold_ +, +as the number  of  pixels  each cluster  must +exceed +the cluster threshold to be considered valid. SmoothingThreshold_ +eliminates noise in the  second derivative of the histogram. As +the +value is  increased, you can  expect  a  smoother +second derivative.  The default is 1.5.
    +
    shade
    +
    double azimuth_ = 30, double elevation_ = 30, +
    + bool colorShading_ = false
    Shade image using distant light source. +Specify azimuth_ and elevation_ as the  +position  of  the light source. By default, the shading +results as a grayscale image.. Set colorShading_ to true +to +shade the red, green, and blue components of the image.
    +
    shadow
    +
    const double percent_opacity = 80, const double sigma_ += 0.5, const ssize_t x_ = 0, const ssize_t y_ = 0simulate an image shadow
    +
    sharpen
    +
    const double radius_ = 1, const double sigma_ += 0.5Sharpen pixels in image.  The radius_ +parameter specifies the radius of the Gaussian, in pixels, not counting +the center pixel.  The sigma_ parameter specifies the +standard deviation of the Laplacian, in pixels.
    sharpenChannel
    +
    const ChannelType +channel_, const double radius_ = 0.0, const double sigma_ = 1.0
    +
    Sharpen pixel +quantums in an image channel  The channel_ parameter specifies the +channel to sharpen..  The radius_ +parameter specifies the radius of the Gaussian, in pixels, not counting +the center pixel.  The sigma_ parameter specifies the +standard deviation of the Laplacian, in pixels.
    +
    shave
    +
    const Geometry &geometry_Shave pixels from image edges.
    +
    shear
    +
    double xShearAngle_, double yShearAngle_Shear image (create parallelogram by sliding +image by X or Y axis).  Shearing slides one edge of an image along +the X  or  Y axis,  creating  a +parallelogram.  An X direction shear slides an edge along the X +axis, while  a  Y  direction shear  slides  +an edge along the Y axis.  The amount of the shear is controlled +by a shear angle.  For X direction  shears,  x  +degrees is measured relative to the Y axis, and similarly, for Y +direction shears  y  degrees is measured relative to the X +axis. Empty triangles left over from shearing the  image  are +filled  with  the  color  defined as borderColor
    +
    solarize
    +
    double factor_ = 50.0Solarize image (similar to effect seen when +exposing a photographic film to light during the development process)
    +
    splice
    +
    const Geometry +&geometry_splice the background color into the image
    +
    spread
    +
    size_t amount_ = 3Spread pixels randomly within image by +specified amount
    +
    stegano
    +
    const Image &watermark_Add a digital watermark to the image (based +on second image)
    +
    sparseColor
    +
    const ChannelType channel, const SparseColorMethod method, const size_t number_arguments, const double *arguments Sparse color image, given a set of coordinates, interpolates the colors found at those coordinates, across the whole image, using various methods.
    +
    statistics
    +
    ImageStatistics *statisticsObtain image statistics. Statistics are normalized to the range of 0.0 to 1.0 and are output to the specified ImageStatistics structure. The structure includes members maximum, minimum, mean, standard_deviation, and variance for each of these channels: red, green, blue, and opacity (e.g. statistics->red.maximum).
    +
    stereo
    +
    const Image &rightImage_Create an image which appears in stereo when +viewed with red-blue glasses (Red image on left, blue on right)
    +
    swirl
    +
    double degrees_Swirl image (image pixels are rotated by +degrees)
    +
    texture
    +
    const Image &texture_Layer a texture on pixels matching image +background color.
    +
    threshold
    +
    double threshold_Threshold image
    +
    transform
    +
    const Geometry +&imageGeometry_Transform image based on image +and crop geometries. Crop geometry is optional.
    const Geometry +&imageGeometry_, const Geometry +&cropGeometry_ 
    +
    transparent
    +
    const Color +&color_Add matte image to image, setting pixels +matching color to transparent.
    +
    trim
    +
    voidTrim edges that are the background color from +the image.
    +
    unsharpmask
    +
    double radius_, double sigma_, double +amount_, double threshold_Sharpen the image using the unsharp mask +algorithm. The radius_ +parameter specifies the radius of the Gaussian, in pixels, not +counting the center pixel. The sigma_ parameter specifies the +standard deviation of the Gaussian, in pixels. The amount_ +parameter specifies the percentage of the difference between the +original and the blur image that is added back into the original. The threshold_ +parameter specifies the threshold in pixels needed to apply the +diffence amount.
    unsharpmaskChannel
    +
    const ChannelType +channel_, const double radius_, const double sigma_, const double +amount_, const double threshold_
    +
    Sharpen an image +channel using the unsharp mask algorithm. The channel_ parameter specifies the +channel to sharpen. The radius_ +parameter specifies the radius of the Gaussian, in pixels, not +counting the center pixel. The sigma_ parameter specifies the +standard deviation of the Gaussian, in pixels. The amount_ +parameter specifies the percentage of the difference between the +original and the blur image that is added back into the original. The threshold_ +parameter specifies the threshold in pixels needed to apply the +diffence amount.
    +
    wave
    +
    double amplitude_ = 25.0, double wavelength_ += 150.0Alter an image along a sine wave.
    +
    write
    +
    const string &imageSpec_Write image to a file using filename imageSpec_ +.
    + Caution: if +an image format is selected which is capable of supporting fewer +colors than the original image or quantization has been requested, the +original image will be quantized to fewer colors. Use a copy of the +original if this is a problem.
    Blob *blob_Write image to a in-memory BLOB stored in blob_. The magick_ +parameter specifies the image format to write (defaults to magick ). The depth_ parameter species the image +depth (defaults to depth ).
    + Caution: if +an image format is selected which is capable of supporting fewer +colors than the original image or quantization has been requested, the +original image will be quantized to fewer colors. Use a copy of the +original if this is a problem.
    Blob *blob_, +std::string &magick_
    Blob *blob_, +std::string &magick_, size_t depth_
    const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_, const std::string &map_, +const StorageType type_, void *pixels_Write pixel data into a buffer you supply. +The data is saved either as char, short int, integer, float or double +format in the order specified by the type_ parameter. For example, we +want to extract scanline 1 of a 640x480 image as character data in +red-green-blue order: +

      image.write(0,0,640,1,"RGB",0,pixels); +

    +

    The parameters are as follows:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    x_Horizontal ordinate of left-most +coordinate of region to extract.
    y_Vertical ordinate of top-most +coordinate of region to extract.
    columns_Width in pixels of the region to +extract.
    rows_Height in pixels of the region to +extract.
    map_This character string can be any +combination or order of R = red, G = green, B = blue, A = alpha, C = +cyan, Y = yellow, M = magenta, and K = black. The ordering reflects +the order of the pixels in the supplied pixel array.
    type_Pixel storage type (CharPixel, +ShortPixel, IntegerPixel, FloatPixel, or DoublePixel)
    pixels_This array of values contain the pixel +components as defined by the map_ and type_ parameters. The length of +the arrays must equal the area specified by the width_ and height_ +values and type_ parameters.
    +
    +
    resize
    +
    const Geometry +&geometry_Resize image to specified size.
    +
    +

    Image Attributes

    +
    +Image attributes are set and obtained via methods in Image. Except for +methods which accept pointer arguments (e.g. chromaBluePrimary) +all methods return attributes by value. +

    Image attributes are easily used. For example, to set the resolution +of the TIFF file "file.tiff" to 150 dots-per-inch (DPI) in both the +horizontal and vertical directions, you can use the following example +code:

    +
    +string filename("file.tiff"); 
    +Image image; 
    +image.read(filename); 
    +image.resolutionUnits(PixelsPerInchResolution); 
    +image.density(Geometry(150,150));   // could also use image.density("150x150") 
    +image.write(filename)
    +
    +The supported image attributes and the method arguments required to +obtain them are shown in the following table:
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Attributes
    +
    Function
    +
    +
    Type
    +
    +
    Get Signature
    +
    +
    Set Signature
    +
    +
    Description
    +
    +
    adjoin
    +
    boolvoidbool flag_Join images into a single multi-image file.
    +
    antiAlias
    +
    boolvoidbool flag_Control antialiasing of rendered Postscript +and Postscript or TrueType fonts. Enabled by default.
    +
    animation- +
    + Delay
    +
    size_t (0 to 65535)voidsize_t delay_Time in 1/100ths of a second (0 to 65535) +which must expire before displaying the next image in an animated +sequence. This option is useful for regulating the animation of a +sequence  of GIF images within Netscape.
    +
    animation- +
    + Iterations
    +
    size_tvoidsize_t iterations_Number of iterations to loop an animation +(e.g. Netscape loop extension) for.
    attribute
    +
    string
    +
    const +std::string name_
    +
    const +std::string name_, const std::string value_An arbitrary named +image attribute. Any number of named attributes may be attached to the +image. For example, the image comment is a named image attribute with +the name "comment". EXIF tags are attached to the image as named +attributes. Use the syntax "EXIF:<tag>" to request an EXIF tag +similar to "EXIF:DateTime".
    +
    +
    background- +
    + Color
    +
    Color voidconst Color +&color_Image background color
    +
    background- +
    + Texture
    +
    stringvoidconst string &texture_Image file name to use as the background +texture. Does not modify image pixels.
    +
    baseColumns
    +
    size_tvoid Base image width (before transformations)
    +
    baseFilename
    +
    stringvoid Base image filename (before transformations)
    +
    baseRows
    +
    size_tvoid Base image height (before transformations)
    +
    borderColor
    +
    Color void const Color +&color_Image border color
    boundingBoxGeometryvoid Return smallest bounding box enclosing +non-border pixels. The current fuzz value is used when discriminating +between pixels. This is the crop bounding box used by +crop(Geometry(0,0)).
    +
    boxColor
    +
    Color voidconst Color +&boxColor_Base color that annotation text is rendered +on.
    cacheThresholdsize_t const size_tPixel cache threshold in bytes. Once this +threshold is exceeded, all subsequent pixels cache operations are +to/from disk. This is a static method and the attribute it sets is +shared by all Image objects.
    channelDepth
    +
    size_t +
    +
    const +ChannelType channel_
    +
    const ChannelType +channel_, const size_t depth_
    +
    Channel modulus depth. +The channel modulus depth represents the minimum number of bits +required +to support the channel without loss. Setting the channel's modulus +depth +modifies the channel (i.e. discards resolution) if the requested +modulus +depth is less than the current modulus depth, otherwise the channel is +not altered. There is no attribute associated with the modulus depth so +the current modulus depth is obtained by inspecting the pixels. As a +result, the depth returned may be less than the most recently set +channel depth. Subsequent image processing may result in increasing the +channel depth.
    +
    +
    chroma- +
    + BluePrimary
    +
    double x & ydouble *x_, double *y_double x_, double y_Chromaticity blue primary point (e.g. x=0.15, +y=0.06)
    +
    chroma- +
    + GreenPrimary
    +
    double x & ydouble *x_, double *y_double x_, double y_Chromaticity green primary point (e.g. x=0.3, +y=0.6)
    +
    chroma- +
    + RedPrimary
    +
    double x & ydouble *x_, double *y_double x_, double y_Chromaticity red primary point (e.g. x=0.64, +y=0.33)
    +
    chroma- +
    + WhitePoint
    +
    double x & ydouble*x_, double *y_double x_, double y_Chromaticity white point (e.g. x=0.3127, +y=0.329)
    +
    classType
    +
    ClassType + void ClassType +class_Image storage class.  Note that +conversion from a DirectClass image to a PseudoClass image may result +in a loss of color due to the limited size of the palette (256 or +65535 colors).
    +
    clipMask
    +
    Imagevoidconst Image &clipMask_Associate a clip mask image with the current +image. The clip mask image must have the same dimensions as the current +image or an exception is thrown. Clipping occurs wherever pixels are +transparent in the clip mask image. Clipping Pass an invalid image to +unset an existing clip mask.
    +
    colorFuzz
    +
    doublevoiddouble fuzz_Colors within this distance are considered +equal. A number of algorithms search for a target  color. By +default the color must be exact. Use this option to match colors that +are close to the target color in RGB space.
    +
    colorMap
    +
    Color size_t index_size_t index_, const Color &color_Color at colormap index.
    +
    colorMapSize
    +
    +
    size_t
    +
    void
    +
    size_t entries_
    +
    Number of entries in the +colormap. Setting the colormap size may extend or truncate the +colormap. +The maximum number of supported entries is specified by the MaxColormapSizeconstant, +and is dependent on the value of QuantumDepth when ImageMagick is +compiled. An exception is thrown if more entries are requested than may +be supported. Care should be taken when truncating the colormap to +ensure that the image colormap indexes reference valid colormap entries.
    +
    +
    colorSpace
    +
    ColorspaceType +colorSpace_voidColorspaceType +colorSpace_The colorspace (e.g. CMYK) used to represent +the image pixel colors. Image pixels are always stored as RGB(A) except +for the case of CMY(K).
    +
    columns
    +
    size_tvoid Image width
    +
    comment
    +
    stringvoid Image comment
    +
    compose
    +
    CompositeOperator + voidCompositeOperator +compose_Composition operator to be used when +composition is implicitly used (such as for image flattening).
    +
    compress- +
    + Type
    +
    CompressionType + voidCompressionType +compressType_Image compresion type. The default is the +compression type of the specified image file.
    +
    debug
    +
    boolvoidbool flag_Enable printing of internal debug messages +from ImageMagick as it executes.
    defineValue
    +
    string
    +
    const std::string +&magick_, const std::string &key_
    +
    const std::string +&magick_, const std::string &key_,  const std::string +&value_
    +
    Set or obtain a +definition string to applied when encoding or decoding the specified +format. The meanings of the definitions are format specific. The format +is designated by the magick_ +argument, the format-specific key is designated by key_, and the associated value is +specified by value_. See the +defineSet() method if the key must be removed entirely.
    +
    defineSet
    +
    bool
    +
    const std::string +&magick_, const std::string &key_
    +
    const std::string +&magick_, const std::string &key_, bool flag_
    +
    Set or obtain a +definition flag to applied when encoding or decoding the specified +format.. Similar to the defineValue() method except that +passing the flag_ value +'true' +creates a value-less define with that format and key. Passing the flag_ +value 'false' removes any existing matching definition. The method +returns 'true' if a matching key exists, and 'false' if no matching key +exists.
    +
    +
    density
    +
    Geometry   +(default 72x72)voidconst Geometry +&density_Vertical and horizontal resolution in pixels +of the image. This option specifies an image density when decoding a +Postscript or Portable Document page. Often used with psPageSize.
    +
    depth
    +
     size_t (8-32)voidsize_t depth_Image depth. Used to specify the bit depth +when reading or writing  raw images or when the output format +supports multiple depths. Defaults to the quantum depth that +ImageMagick is compiled with.
    +
    endian
    +
    EndianType + voidEndianType +endian_Specify (or obtain) endian option for formats +which support it.
    +
    directory
    +
    stringvoid Tile names from within an image montage
    +
    file
    +
    FILE *FILE *FILE *file_Image file descriptor.
    +
    fileName
    +
    stringvoidconst string &fileName_Image file name.
    +
    fileSize
    +
    off_tvoid Number of bytes of the image on disk
    +
    fillColor
    +
    Colorvoidconst Color &fillColor_Color to use when filling drawn objects
    +
    fillPattern
    +
    Imagevoidconst Image &fillPattern_Pattern image to use when filling drawn +objects.
    +
    fillRule
    +
    FillRule + voidconst Magick::FillRule &fillRule_Rule to use when filling drawn objects.
    +
    filterType
    +
    FilterTypes + voidFilterTypes +filterType_Filter to use when resizing image. The +reduction filter employed has a sigificant effect on the time required +to resize an image and the resulting quality. The default filter is Lanczos +which has been shown to produce high quality results when reducing most +images.
    +
    font
    +
    stringvoidconst string &font_Text rendering font. If the font is a fully +qualified X server font name, the font is obtained from an X  +server. To use a TrueType font, precede the TrueType filename with an +@. Otherwise, specify  a  Postscript font name (e.g. +"helvetica").
    +
    fontPointsize
    +
    size_tvoidsize_t pointSize_Text rendering font point size
    +
    fontTypeMetrics
    +
    TypeMetric const std::string &text_, TypeMetric *metrics Update metrics with font type metrics using +specified text, and current font and fontPointSize settings.
    +
    format
    +
    stringvoid Long form image format description.
    +
    gamma
    +
    double (typical range 0.8 to 2.3)void Gamma level of the image. The same color +image displayed on two different  workstations  may  +look  different due to differences in the display monitor.  +Use gamma correction  to  adjust  for this  +color  difference.
    +
    geometry
    +
    Geometry void Preferred size of the image when encoding.
    +
    gifDispose- +
    + Method
    +
    size_t
    + { 0 = Disposal not specified,
    + 1 = Do not dispose of graphic,
    + 3 = Overwrite graphic with background color, +
    + 4 = Overwrite graphic with previous graphic. }
    voidsize_t disposeMethod_GIF disposal method. This option is used to +control how successive frames are rendered (how the preceding frame is +disposed of) when creating a GIF animation.
    +
    iccColorProfile
    +
    Blob voidconst Blob +&colorProfile_ICC color profile. Supplied via a Blob since Magick++/ and ImageMagick do not +currently support formating this data structure directly.  +Specifications are available from the +International Color Consortium for the format of ICC color profiles.
    +
    interlace- +
    + Type
    +
    InterlaceType + voidInterlaceType +interlace_The type of interlacing scheme (default NoInterlace +). This option is used to specify the type of  interlacing +scheme  for  raw  image formats such as RGB or YUV. NoInterlace +means do not  interlace, LineInterlace uses scanline +interlacing, and PlaneInterlace uses plane interlacing. +PartitionInterlace is like PlaneInterlace except the  +different planes  are saved  to individual files (e.g.  +image.R, image.G, and image.B). Use LineInterlace or +PlaneInterlace to create an interlaced GIF or progressive JPEG +image.
    +
    iptcProfile
    +
    Blob voidconst Blob & +iptcProfile_IPTC profile. Supplied via a Blob since Magick++ and ImageMagick do not +currently  support formating this data structure directly. +Specifications are available from the +International Press Telecommunications Council for IPTC profiles.
    +
    label
    +
    stringvoidconst string &label_Image label
    +
    magick
    +
    stringvoid const string &magick_Get image format (e.g. "GIF")
    +
    matte
    +
    boolvoidbool matteFlag_True if the image has transparency. If set +True, store matte channel if  the image has one otherwise create +an opaque one.
    +
    matteColor
    +
    Color voidconst Color +&matteColor_Image matte (frame) color
    +
    meanError- +
    + PerPixel
    +
    doublevoid The mean error per pixel computed when an +image is color reduced. This parameter is only valid if verbose is set +to true and the image has just been quantized.
    modulusDepth
    +
    size_t +
    +
    void
    +
    size_t +depth_
    +
    Image +modulus depth (minimum number of bits required to support +red/green/blue components without loss of accuracy). The pixel modulus +depth may be decreased by supplying a value which is less than the +current value, updating the pixels (reducing accuracy) to the new +depth. +The pixel modulus depth can not be increased over the current value +using this method.
    +
    +
    monochrome
    +
    boolvoidbool flag_Transform the image to black and white
    +
    montage- +
    + Geometry
    +
    Geometry void Tile size and offset within an image montage. +Only valid for montage images.
    +
    normalized- +
    + MaxError
    +
    doublevoid The normalized max error per pixel computed +when an image is color reduced. This parameter is only valid if verbose +is set to true and the image has just been quantized.
    +
    normalized- +
    + MeanError
    +
    doublevoid The normalized mean error per pixel computed +when an image is color reduced. This parameter is only valid if verbose +is set to true and the image has just been quantized.
    orientation
    +
    OrientationTypevoid
    +
    OrientationType +orientation_Image orientation. + Supported by some file formats such as DPX and TIFF. Useful for +turning the right way up.
    +
    +
    packets
    +
    size_tvoid The number of runlength-encoded packets in +
    + the image
    +
    packetSize
    +
    size_tvoid The number of bytes in each pixel packet
    +
    page
    +
    Geometry + voidconst Geometry &pageSize_Preferred size and location of an image +canvas. +

    Use this option to specify the dimensions +and position of the Postscript page in dots per inch or a TEXT page in +pixels. This option is typically used in concert with density .

    +

    Page may also be used to position a GIF +image (such as for a scene in an animation)

    +
    +
    pixelColor
    +
    Color ssize_t x_, ssize_t y_ssize_t x_, ssize_t y_, const Color &color_Get/set pixel color at location x & y.
    +
    profile
    +
    +
    Blob
    +
    const std::string name_
    +
    const std::string name_, const Blob +&colorProfile_
    +
    Get/set/remove a named +profile. Valid names include "*", +"8BIM", "ICM", "IPTC", or a user/format-defined profile name.
    +
    +
    quality
    +
    size_t (0 to 100)voidsize_t quality_JPEG/MIFF/PNG compression level (default 75).
    +
    quantize- +
    + Colors
    +
    size_tvoidsize_t colors_Preferred number of colors in the image. The +actual number of colors in the image may be less than your request, but +never more. Images with less unique colors than specified with this +option will have any duplicate or unused colors removed.
    +
    quantize- +
    + ColorSpace
    +
    ColorspaceType + voidColorspaceType +colorSpace_Colorspace to quantize colors in (default +RGB). Empirical evidence suggests that distances in color spaces such +as YUV or YIQ correspond to perceptual color differences more closely +than do distances in RGB space. These color spaces may give better +results when color reducing an image.
    +
    quantize- +
    + Dither
    +
    boolvoidbool flag_Apply Floyd/Steinberg error diffusion to the +image. The basic strategy of dithering is to  trade  +intensity +resolution  for  spatial  resolution  by  +averaging the intensities  of  several  +neighboring  pixels. Images which  suffer  from  +severe  contouring  when  reducing colors can be +improved with this option. The quantizeColors or monochrome option must +be set for this option to take effect.
    +
    quantize- +
    + TreeDepth
    +
    size_t voidsize_t treeDepth_Depth of the quantization color +classification tree. Values of 0 or 1 allow selection of the optimal +tree depth for the color reduction algorithm. Values between 2 and 8 +may be used to manually adjust the tree depth.
    +
    rendering- +
    + Intent
    +
    RenderingIntent + voidRenderingIntent +render_The type of rendering intent
    +
    resolution- +
    + Units
    +
    ResolutionType + voidResolutionType +units_Units of image resolution
    +
    rows
    +
    size_tvoid The number of pixel rows in the image
    +
    scene
    +
    size_tvoidsize_t scene_Image scene number
    +
    signature
    +
    stringbool force_ = false Image MD5 signature. Set force_ to 'true' to +force re-computation of signature.
    +
    size
    +
    Geometry voidconst Geometry +&geometry_Width and height of a raw image (an image +which does not support width and height information).  Size may +also be used to affect the image size read from a multi-resolution +format (e.g. Photo CD, JBIG, or JPEG.
    +
    strip
    +
    voidstrips an image of all profiles and comments.
    +
    strokeAntiAlias
    +
    boolvoidbool flag_Enable or disable anti-aliasing when drawing +object outlines.
    +
    strokeColor
    +
    Colorvoidconst Color &strokeColor_Color to use when drawing object outlines
    +
    strokeDashOffset
    +
    size_tvoiddouble strokeDashOffset_While drawing using a dash pattern, specify +distance into the dash pattern to start the dash (default 0).
    +
    strokeDashArray
    +
    const double*voidconst double* strokeDashArray_Specify the pattern of dashes and gaps used +to stroke paths. The strokeDashArray represents a zero-terminated +array of numbers that specify the lengths (in pixels) of alternating +dashes and gaps in user units. If an odd number of values is provided, +then the list of values is repeated to yield an even number of +values.  A typical strokeDashArray_ array might contain the +members 5 3 2 0, where the zero value indicates the end of the pattern +array.
    +
    strokeLineCap
    +
    LineCapvoidLineCap lineCap_Specify the shape to be used at the corners +of paths (or other vector shapes) when they are stroked. Values of +LineJoin are UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin.
    +
    strokeLineJoin
    +
    LineJoinvoidLineJoin lineJoin_Specify the shape to be used at the corners +of paths (or other vector shapes) when they are stroked. Values of +LineJoin are UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin.
    +
    strokeMiterLimit
    +
    size_tvoidsize_t miterLimit_Specify miter limit. When two line segments +meet at a sharp angle and miter joins have been specified for +'lineJoin', it is possible for the miter to extend far beyond the +thickness of the line stroking the path. The miterLimit' imposes a +limit on the ratio of the miter length to the 'lineWidth'. The default +value of this parameter is 4.
    +
    strokeWidth
    +
    doublevoiddouble strokeWidth_Stroke width for use when drawing vector +objects (default one)
    +
    strokePattern
    +
    Imagevoidconst Image &strokePattern_Pattern image to use while drawing object +stroke (outlines).
    +
    subImage
    +
    size_tvoidsize_t subImage_Subimage of an image sequence
    +
    subRange
    +
    size_tvoidsize_t subRange_Number of images relative to the base image
    +
    textEncoding
    +
    +
    string
    +
    void
    +
    const std::string &encoding_
    +
    Specify the code set to use for text +annotations. The only character encoding which may be specified at +this time is "UTF-8" for representing Unicode as a +sequence of bytes. Specify an empty string to use the default ASCII +encoding. Successful text annotation using Unicode may require fonts +designed to support Unicode.
    +
    +
    tileName
    +
    stringvoidconst string &tileName_Tile name
    +
    totalColors
    +
    size_tvoid Number of colors in the image
    +
    type
    +
    ImageType + void ImageType Image type.
    +
    verbose
    +
    boolvoidbool verboseFlag_Print detailed information about the image
    +
    view
    +
    stringvoidconst string &view_FlashPix viewing parameters.
    +
    virtualPixelMethod
    +
    VirtualPixelMethod + voidVirtualPixelMethod +virtualPixelMethod_Image virtual pixel method.
    +
    x11Display
    +
    string (e.g. "hostname:0.0")voidconst string &display_X11 display to display to, obtain fonts from, +or to capture image from
    +
    xResolution
    +
    doublevoid x resolution of the image
    +
    yResolution
    +
    doublevoid y resolution of the image
    +
    +

    Low-Level Image Pixel Access

    +
    +Image pixels (of type PixelPacket ) +may be accessed directly via the Image Pixel Cache .  The +image pixel cache is a rectangular window into the actual image pixels +(which may be in memory, memory-mapped from a disk file, or entirely on +disk). Two interfaces exist to access the Image Pixel Cache. +The +interface described here (part of the Image class) supports +only +one view at a time. See the Pixels +class for a more abstract interface which supports simultaneous pixel +views (up to the number of rows). As an analogy, the interface +described +here relates to the Pixels class as +stdio's gets() relates to fgets(). The Pixels +class provides the more general form of the interface. +

    Obtain existing image pixels via getPixels(). Create a new +pixel region using setPixels().

    +

    In order to ensure that only the current generation of the image is +modified, the Image's modifyImage() method +should be invoked to reduce the reference count on the underlying image +to one. If this is not done, then it is possible for a previous +generation of the image to be modified due to the use of reference +counting when copying or constructing an Image.
    +

    +

    Depending on the capabilities of the operating system, and the +relationship of the window to the image, the pixel cache may be a copy +of the pixels in the selected window, or it may be the actual image +pixels. In any case calling syncPixels() insures that the base +image is updated with the contents of the modified pixel cache. The +method readPixels() supports copying foreign pixel data +formats +into the pixel cache according to the QuantumTypes. The method writePixels() +supports copying the pixels in the cache to a foreign pixel +representation according to the format specified by QuantumTypes.

    +

    The pixel region is effectively a small image in which the pixels +may be accessed, addressed, and updated, as shown in the following +example:

    +
    +cache
    +Image image("cow.png"); 
    +// Ensure that there are no other references to this image.
    +image.modifyImage();
    +// Set the image type to TrueColor DirectClass representation.
    +image.type(TrueColorType);
    +// Request pixel region with size 60x40, and top origin at 20x30 
    +ssize_t columns = 60; 
    +PixelPacket *pixel_cache = image.getPixels(20,30,columns,40); 
    +// Set pixel at column 5, and row 10 in the pixel cache to red. 
    +ssize_t column = 5; 
    +ssize_t row = 10; 
    +PixelPacket *pixel = pixel_cache+row*columns+column; 
    +*pixel = Color("red"); 
    +// Save changes to underlying image .
    +image.syncPixels();
    +  // Save updated image to file.
    +image.write("horse.png");
    +
    +

    The image cache supports the following methods:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Cache Methods
    +
    Method
    +
    +
    Returns
    +
    +
    Signature
    +
    +
    Description
    +
    +
    getConstPixels
    +
    const PixelPacket +*const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_Transfers pixels from the image to the pixel +cache as defined by the specified rectangular region. The returned pointer remains valid until the next getPixel, +getConstPixels, or setPixels call and should never be deallocated by +the +user.
    +
    getConstIndexes
    +
    const IndexPacket*voidReturns a pointer to the Image pixel indexes +corresponding to a previous getPixel, +getConstPixels, or setPixels call.  The +returned pointer remains valid until the next getPixel, getConstPixels, +or setPixels call and should never be deallocated by the user. Only valid for PseudoClass images or CMYKA images. The +pixel indexes represent an array of type IndexPacket, with each entry +corresponding to an x,y pixel position. For PseudoClass images, the +entry's value is the offset into the colormap (see colorMap +) for that pixel. For CMYKA images, the indexes are used to contain the +alpha channel.
    +
    getIndexes
    +
    IndexPacket*voidReturns a pointer to the Image pixel indexes +corresponding to the pixel region requested by the last getConstPixels , getPixels +, or setPixels call. The +returned pointer remains valid until the next getPixel, getConstPixels, +or setPixels call and should never be deallocated by the user. Only valid for PseudoClass images +or +CMYKA images. The pixel indexes represent an array of type +IndexPacket, with each entry corresponding to a pixel x,y position. For +PseudoClass images, the entry's value is the offset into the colormap +(see colorMap ) for that pixel. For +CMYKA +images, the indexes are used to contain the alpha channel.
    +
    getPixels
    +
    PixelPacket *const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_Transfers pixels from the image to the pixel +cache as defined by the specified rectangular region. Modified pixels +may be subsequently transferred back to the image via syncPixels. The returned pointer remains valid until the next getPixel, +getConstPixels, or setPixels call and should never be deallocated by +the +user.
    +
    setPixels
    +
    PixelPacket *const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_Allocates a pixel cache region to store image +pixels as defined by the region rectangle.  This area is +subsequently transferred from the pixel cache to the image via +syncPixels. The returned pointer remains +valid until the next getPixel, getConstPixels, or setPixels call and +should never be deallocated by the user.
    +
    syncPixels
    +
    voidvoidTransfers the image cache pixels to the image.
    +
    readPixels
    +
    voidQuantumTypes +quantum_, unsigned char *source_,Transfers one or more pixel components from a +buffer or file into the image pixel cache of an image. ReadPixels is +typically used to support image decoders. The region transferred +corresponds to the region set by a preceding setPixels call.
    +
    writePixels
    +
    voidQuantumTypes +quantum_, unsigned char *destination_Transfers one or more pixel components from +the image pixel cache to a buffer or file. WritePixels is typically +used to support image encoders. The region transferred corresponds to +the region set by a preceding getPixels or getConstPixels call.
    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Image.fig b/ImageMagick-6.9.12-44/www/Magick++/Image.fig new file mode 100644 index 0000000..96ffd9b --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Image.fig @@ -0,0 +1,98 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +0 +1200 2 +6 5250 4125 7425 5175 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 5325 4350 7425 4350 7425 5175 5325 5175 5325 4350 +4 1 0 0 0 0 10 0.0000 4 135 810 6450 4275 class Options\001 +4 2 0 0 0 0 8 0.0000 4 135 1785 7350 4575 MagickCore::ImageInfo* _imageInfo\001 +4 2 0 0 0 0 8 0.0000 4 135 2040 7350 4800 MagickCore::QuantizeInfo* _quantizeInfo\001 +4 2 0 0 0 0 8 0.0000 4 135 1875 7350 5025 MagickCore::QuantizeInfo* _drawInfo\001 +-6 +6 600 4800 2400 5625 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 600 5025 2400 5025 2400 5625 600 5625 600 5025 +4 1 0 0 0 0 10 0.0000 4 135 690 1500 4950 class Image\001 +4 2 0 0 0 0 8 0.0000 4 135 1395 2325 5400 class ImageRef* _imageRef\001 +-6 +6 1425 3600 1575 4650 +1 3 0 1 0 0 0 0 20 0.000 1 0.0000 1500 3675 75 75 1500 3675 1500 3750 +1 3 0 1 0 0 0 0 20 0.000 1 0.0000 1500 4125 75 75 1500 4125 1500 4200 +1 3 0 1 0 0 0 0 20 0.000 1 0.0000 1500 4575 75 75 1500 4575 1500 4650 +-6 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 4800 2400 5325 2400 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 4800 2775 5550 4350 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2400 5325 3075 3600 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2400 3000 3075 3000 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2400 1800 3075 2325 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7425 4500 8100 3900 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7425 2250 8100 2250 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 4 + 1 1 1.00 60.00 120.00 + 7425 2550 7800 2550 7800 2850 8100 2850 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 600 2700 2400 2700 2400 3300 600 3300 600 2700 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 600 1500 2400 1500 2400 2100 600 2100 600 1500 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 8100 2100 9300 2100 9300 2400 8100 2400 8100 2100 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 8100 2700 9300 2700 9300 3000 8100 3000 8100 2700 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 8100 3600 9300 3600 9300 4200 8100 4200 8100 3600 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 8100 4500 9300 4500 9300 5100 8100 5100 8100 4500 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 8100 5400 9300 5400 9300 6000 8100 6000 8100 5400 +2 2 0 1 11 11 100 0 25 0.000 0 0 7 0 0 5 + 75 300 9825 300 9825 6150 75 6150 75 300 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7425 4800 8100 4800 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7425 5025 8100 5700 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 3075 2100 4800 2100 4800 3900 3075 3900 3075 2100 +2 2 0 1 0 6 5 0 32 0.000 0 0 7 0 0 5 + 5325 2100 7425 2100 7425 2700 5325 2700 5325 2100 +4 1 0 0 0 18 14 0.0000 4 210 3300 5250 900 Magick++ Image Data Structures\001 +4 1 0 0 0 0 10 0.0000 4 135 690 1575 1425 class Image\001 +4 1 0 0 0 0 10 0.0000 4 135 690 1500 2625 class Image\001 +4 1 0 0 0 0 10 0.0000 4 135 1725 8700 3525 struct MagickCore::ImageInfo\001 +4 1 0 0 0 0 10 0.0000 4 135 1890 8700 4425 struct MagickCore::QuantizeInfo\001 +4 2 0 0 0 0 8 0.0000 4 135 1395 2325 1875 class ImageRef* _imageRef\001 +4 2 0 0 0 0 8 0.0000 4 135 1395 2325 3075 class ImageRef* _imageRef\001 +4 2 0 0 0 0 8 0.0000 4 135 1665 4725 2475 struct MagickCore::Image* _image\001 +4 1 0 0 0 0 10 0.0000 4 135 1680 8700 5325 struct MagickCore::DrawInfo\001 +4 2 0 0 0 0 8 0.0000 4 135 1485 4725 3750 class MutexLock _mutexLock\001 +4 2 0 0 0 0 8 0.0000 4 135 1140 4725 2850 class Options* _options\001 +4 2 0 0 0 0 8 0.0000 4 135 390 4725 3150 long _id\001 +4 2 0 0 0 0 8 0.0000 4 135 645 4725 3450 ssize_t _refCount\001 +4 1 0 0 0 0 10 0.0000 4 135 675 8708 2295 Image Data\001 +4 1 0 0 0 0 10 0.0000 4 135 1005 8700 2902 Image Attributes\001 +4 1 0 0 0 0 10 0.0000 4 135 1485 6450 2025 struct MagickCore::Image\001 +4 1 0 0 0 0 10 0.0000 4 135 900 3975 1950 class ImageRef\001 +4 1 0 0 0 0 10 0.0000 4 105 150 2625 2925 ref\001 +4 1 0 0 0 0 10 0.0000 4 105 150 2625 1875 ref\001 +4 1 0 0 0 0 10 0.0000 4 105 150 2625 4425 ref\001 diff --git a/ImageMagick-6.9.12-44/www/Magick++/Image.html b/ImageMagick-6.9.12-44/www/Magick++/Image.html new file mode 100644 index 0000000..2060125 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Image.html @@ -0,0 +1,3145 @@ + + + + + +Magick++ API: Working with Images + + + +
    +
    +

    Magick::Image Class

    +
    +

    Quick Contents

    + +

    Image is the primary object in Magick++ and represents +a single image frame (see design ). The +STL interface must be used to operate on +image sequences or images (e.g. of format GIF, TIFF, MIFF, Postscript, +& MNG) which are comprized of multiple image frames. Individual +frames of a multi-frame image may be requested by adding array-style +notation to the end of the file name (e.g. "animation.gif[3]" retrieves +the fourth frame of a GIF animation.  Various image manipulation +operations may be applied to the image. Attributes may be set on the +image to influence the operation of the manipulation operations. The Pixels class provides low-level access to +image +pixels. As a convenience, including <Magick++.h> +is sufficient in order to use the complete Magick++ API. The Magick++ +API is enclosed within the Magick namespace so you must either +add the prefix " Magick:: " to each class/enumeration name or +add +the statement " using namespace Magick;" after including the Magick++.h +header.

    +

    The preferred way to allocate Image objects is via automatic +allocation (on the stack). There is no concern that allocating Image +objects on the stack will excessively enlarge the stack since Magick++ +allocates all large data objects (such as the actual image data) from +the heap. Use of automatic allocation is preferred over explicit +allocation (via new) since it is much less error prone and +allows use of C++ scoping rules to avoid memory leaks. Use of automatic +allocation allows Magick++ objects to be assigned and copied just like +the C++ intrinsic data types (e.g. 'int '), leading to clear and +easy to read code. Use of automatic allocation leads to naturally +exception-safe code since if an exception is thrown, the object is +automagically deallocated once the stack unwinds past the scope of the +allocation (not the case for objects allocated via new ).

    +

    Image is very easy to use. For example, here is a the source to a +program which reads an image, crops it, and writes it to a new file +(the +exception handling is optional but strongly recommended):

    +
    +#include <Magick++.h> 
    +#include <iostream> 
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +
    +  // Construct the image object. Seperating image construction from the 
    +  // the read operation ensures that a failure to read the image file 
    +  // doesn't render the image object useless. 
    +  Image image;
    +  try { 
    +    // Read a file into image object 
    +    image.read( "girl.gif" );
    +
    +    // Crop the image to specified size (width, height, xOffset, yOffset)
    +    image.crop( Geometry(100,100, 100, 100) );
    +
    +    // Write the image to a file 
    +    image.write( "x.gif" ); 
    +  } 
    +  catch( Exception &error_ ) 
    +    { 
    +      cout << "Caught exception: " << error_.what() << endl; 
    +      return 1; 
    +    } 
    +  return 0; 
    +}
    +
    +The following is the source to a program which illustrates the use of +Magick++'s efficient reference-counted assignment and copy-constructor +operations which minimize use of memory and eliminate unncessary copy +operations (allowing Image objects to be efficiently assigned, and +copied into containers).  The program accomplishes the +following: +
      +
    1. Read master image.
    2. +
    3. Assign master image to second image.
    4. +
    5. Resize second image to the size 640x480.
    6. +
    7. Assign master image to a third image.
    8. +
    9. Resize third image to the size 800x600.
    10. +
    11. Write the second image to a file.
    12. +
    13. Write the third image to a file.
    14. +
    +
    +#include <Magick++.h> 
    +#include <iostream> 
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +
    +  Image master("horse.jpg"); 
    +  Image second = master; 
    +  second.resize("640x480"); 
    +  Image third = master; 
    +  third.resize("800x600"); 
    +  second.write("horse640x480.jpg"); 
    +  third.write("horse800x600.jpg"); 
    +  return 0; 
    +}
    +
    +During the entire operation, a maximum of three images exist in memory +and the image data is never copied. +

    The following is the source for another simple program which creates +a 100 by 100 pixel white image with a red pixel in the center and +writes it to a file:

    +
    +#include <Magick++.h> 
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +  Image image( "100x100", "white" ); 
    +  image.pixelColor( 49, 49, "red" ); 
    +  image.write( "red_pixel.png" ); 
    +  return 0; 
    +}
    +
    +If you wanted to change the color image to grayscale, you could add the +lines: +
    +image.quantizeColorSpace( GRAYColorspace ); 
    +image.quantizeColors( 256 ); 
    +image.quantize( );
    +
    +

    or, more simply:

    +
    + image.type( GrayscaleType );
    +
    +

    prior to writing the image.

    +
    +

    BLOBs

    +
    +While encoded images (e.g. JPEG) are most often written-to and +read-from a disk file, encoded images may also reside in memory. +Encoded +images in memory are known as BLOBs (Binary Large OBjects) and may be +represented using the Blob class. The encoded +image may be initially placed in memory by reading it directly from a +file, reading the image from a database, memory-mapped from a disk +file, or could be written to memory by Magick++. Once the encoded image +has been placed within a Blob, it may be read into a Magick++ Image via +a constructor or read() +. Likewise, a Magick++ image may be written to a Blob via write() . +

    An example of using Image to write to a Blob follows:

    +
    +#include >Magick++.h> 
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +
    +  // Read GIF file from disk 
    +  Image image( "giraffe.gif" );
    +  // Write to BLOB in JPEG format 
    +  Blob blob; 
    +  image.magick( "JPEG" ) // Set JPEG output format 
    +  image.write( &blob );
    +
    +  [ Use BLOB data (in JPEG format) here ]
    +
    +  return 0; 
    +}
    +
    +


    +likewise, to read an image from a Blob, you could use one of the +following examples:

    +

    [ Entry condition for the following examples +is that data is pointer to encoded image data and length +represents the size of the data ]

    +
    +Blob blob( data, length ); 
    +Image image( blob );
    +
    +or +
    +Blob blob( data, length ); 
    +Image image; 
    +image.read( blob);
    +
    +some images do not contain their size or format so the size and format must be specified in advance: +
    +Blob blob( data, length ); 
    +Image image; 
    +image.size( "640x480") 
    +image.magick( "RGBA" ); 
    +image.read( blob);
    +
    +
    +

    Constructors

    +
    +Image may be constructed in a number of ways. It may be constructed +from a file, a URL, or an encoded image (e.g. JPEG) contained in an +in-memory BLOB . The available Image +constructors are shown in the following table:

    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Constructors
    +
    Signature
    +
    +
    Description
    +
    const std::string &imageSpec_Construct Image by reading from file or URL +specified by imageSpec_. Use array notation (e.g. filename[9]) +to select a specific scene from a multi-frame image.
    const Geometry &size_, const Color &color_Construct a blank image canvas of specified +size and color
    const Blob &blob_Construct Image by reading from +encoded image data contained in an in-memory BLOB +. Depending on the constructor arguments, the Blob size +, depth , magick (format) +may +also be specified. Some image formats require that size be specified. +The default ImageMagick uses for depth depends on the compiled-in +Quantum size (8 or 16).  If ImageMagick's Quantum size does not +match that of the image, the depth may need to be specified. +ImageMagick can usually automagically detect the image's format. +When a format can't be automagically detected, the format (magick ) must be specified.
    const Blob +&blob_, const Geometry &size_
    const Blob +&blob_, const Geometry &size, +size_t depth
    const Blob +&blob_, const Geometry &size, +size_t depth_, const string &magick_
    const Blob +&blob_, const Geometry &size, +const +string &magick_
    const size_t width_, 
    + const size_t height_,
    + std::string map_,
    + const +StorageType type_,
    + const void *pixels_
    Construct a new Image based on an array of +image pixels. The pixel data must be in scanline order top-to-bottom. +The data can be character, short int, integer, float, or double. Float +and double require the pixels to be normalized [0..1]. The other types +are [0..MaxRGB].  For example, to create a 640x480 image from +unsigned red-green-blue character data, use +

       Image image( 640, 480, "RGB", +0, pixels );

    +

    The parameters are as follows:

    + + + + + + + + + + + + + + + + + + + + + + + +
    width_Width in pixels of the image.
    height_Height in pixels of the image.
    map_This character string can be any +combination or order of R = red, G = green, B = blue, A = alpha, C = +cyan, Y = yellow M = magenta, and K = black. The ordering reflects the +order of the pixels in the supplied pixel array.
    type_Pixel +storage type (CharPixel, ShortPixel, IntegerPixel, FloatPixel, or +DoublePixel)
    pixels_This array of values contain the pixel +components as defined by the map_ and type_ parameters. The length of +the arrays must equal the area specified by the width_ and height_ +values and type_ parameters.
    +
    +
    +

    Image Manipulation +Methods

    +
    +Image supports access to all the single-image (versus +image-list) manipulation operations provided by the ImageMagick +library. If you +must process a multi-image file (such as an animation), the STL interface , which provides a multi-image +abstraction on top of Image, must be used. +

    Image manipulation methods are very easy to use.  For example:

    +
    +Image image; 
    +image.read("myImage.tiff"); 
    +image.addNoise(GaussianNoise); 
    +image.write("myImage.tiff");
    +
    +adds gaussian noise to the image file "myImage.tiff". +

    The operations supported by Image are shown in the following table:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Image Manipulation Methods
    MethodSignature(s)Description
    +
    adaptiveThreshold
    +
    +
    size_t width, size_t +height, size_t offset = 0
    +
    Apply adaptive thresholding to +the image. Adaptive thresholding is useful if the ideal threshold level +is not known in advance, or if the illumination gradient is not +constant +across the image. Adaptive thresholding works by evaulating the mean +(average) of a pixel region (size specified by width and height) +and using the mean as the thresholding value. In order to remove +residual noise from the background, the threshold may be adjusted by +subtracting a constant offset (default zero) from the mean to +compute the threshold.
    +
    +
    addNoise
    +
    NoiseType +noiseType_Add noise to image with specified noise type.
    addNoiseChannel
    +
    const ChannelType +channel_, const NoiseType noiseType_
    +
    Add noise to an image +channel with the specified noise type. The channel_ parameter specifies the +channel to add noise to.  The noiseType_ parameter +specifies the type of noise.
    +
    affineTransform
    +
    const DrawableAffine +&affine
    +
    Transform image by +specified affine (or free transform) matrix.
    +
    +
    annotate
    +
    const std::string &text_, const Geometry &location_Annotate using specified text, and placement +location
    string text_, const Geometry +&boundingArea_, GravityType +gravity_Annotate using specified text, bounding area, +and placement gravity. If boundingArea_ is invalid, then +bounding area is entire image.
    const std::string &text_, const Geometry &boundingArea_, GravityType gravity_, double +degrees_, Annotate with text using specified text, +bounding area, placement gravity, and rotation. If boundingArea_ +is invalid, then bounding area is entire image.
    const std::string &text_, GravityType gravity_Annotate with text (bounding area is entire +image) and placement gravity.
    +
    blur
    +
    const double radius_ = 1, const double sigma_ += 0.5Blur image. The radius_ parameter +specifies the radius of the Gaussian, in pixels, not counting the +center +pixel.  The sigma_ parameter specifies the standard +deviation of the Laplacian, in pixels.
    blurChannel
    +
    const ChannelType +channel_, const double radius_ = 0.0, const double sigma_ = 1.0
    +
    Blur an image +channel. The channel_ +parameter specifies the channel to blur. The radius_ parameter +specifies the radius of the Gaussian, in pixels, not counting the +center +pixel.  The sigma_ parameter specifies the standard +deviation of the Laplacian, in pixels.
    +
    border
    +
    const Geometry +&geometry_ = "6x6+0+0"Border image (add border to image).  The +color of the border is specified by the borderColor attribute.
    +
    cdl
    +
    const std::string &cdl_color correct with a color decision list. See http://en.wikipedia.org/wiki/ASC_CDL for details.
    +
    channel
    +
    ChannelType +layer_Extract channel from image. Use this option +to extract a particular channel from  the image.  MatteChannel +  for  example, is useful for extracting the opacity values +from an image.
    +
    charcoal
    +
    const double radius_ = 1, const double sigma_ += 0.5Charcoal effect image (looks like charcoal +sketch). The radius_ parameter specifies the radius of the +Gaussian, in pixels, not counting the center pixel.  The sigma_ +parameter specifies the standard deviation of the Laplacian, in pixels.
    +
    chop
    +
    const Geometry +&geometry_Chop image (remove vertical or horizontal +subregion of image)
    +
    colorize
    +
    const unsigned int opacityRed_, const +unsigned int opacityGreen_, const unsigned int opacityBlue_, const +Color &penColor_Colorize image with pen color, using +specified percent opacity for red, green, and blue quantums.
    +
    colorMatrix
    +
    const size_t order_, const double *color_matrix_apply color correction to the image.
    +
    comment
    +
    const std::string &comment_Comment image (add comment string to +image).  By default, each image is commented with its file name. +Use  this  method to  assign a specific comment to the +image.  Optionally you can include the image filename, type, +width, height, or other  image  attributes by embedding special format characters.
    compare
    +
    const Image &reference_
    +
    Compare current image with +another image. Sets meanErrorPerPixel +, normalizedMaxError , and normalizedMeanError in the current +image. False is returned if the images are identical. An ErrorOption +exception is thrown if the reference image columns, rows, colorspace, +or +matte differ from the current image.
    +
    +
    composite
    +
    const Image +&compositeImage_, ssize_t xOffset_, ssize_t yOffset_, CompositeOperator +compose_ = InCompositeOpCompose an image onto the current image at +offset specified by xOffset_, yOffset_ using the +composition algorithm specified by compose_
    const Image +&compositeImage_, const Geometry +&offset_, CompositeOperator +compose_ = InCompositeOpCompose an image onto the current image at +offset specified by offset_ using the composition algorithm +specified by compose_
    const Image +&compositeImage_, GravityType +gravity_, CompositeOperator +compose_ = InCompositeOpCompose an image onto the current image with +placement specified by gravity_ using the composition +algorithm +specified by compose_
    +
    contrast
    +
    size_t sharpen_Contrast image (enhance intensity differences +in image)
    +
    convolve
    +
    size_t order_, const double *kernel_Convolve image.  Applies a user-specfied +convolution to the image. The order_ parameter represents the +number of columns and rows in the filter kernel, and kernel_ +is a two-dimensional array of doubles representing the convolution +kernel to apply.
    +
    crop
    +
    const Geometry +&geometry_Crop image (subregion of original image)
    +
    cycleColormap
    +
    int amount_Cycle image colormap
    +
    despeckle
    +
    voidDespeckle image (reduce speckle noise)
    +
    display
    +
    voidDisplay image on screen.
    + Caution: if +an image format is is not compatible with the display visual (e.g. +JPEG on a colormapped display) then the original image will be +altered. Use a copy of the original if this is a problem.
    +
    distort
    +
    const DistortImageMethod method, const size_t number_arguments, const double *arguments, const bool bestfit = false Distort image.  Applies a user-specfied +distortion to the image.
    +
    draw
    +
    const Drawable +&drawable_Draw shape or text on image.
    const std::list<Drawable +> &drawable_Draw shapes or text on image using a set of +Drawable objects contained in an STL list. Use of this method improves +drawing performance and allows batching draw objects together in a +list for repeated use.
    +
    edge
    +
    size_t radius_ = 0.0Edge image (hilight edges in image).  +The radius is the radius of the pixel neighborhood.. Specify a radius +of zero for automatic radius selection.
    +
    emboss
    +
    const double radius_ = 1, const double sigma_ += 0.5Emboss image (hilight edges with 3D effect). +The radius_ parameter specifies the radius of the Gaussian, in +pixels, not counting the center pixel.  The sigma_ +parameter specifies the standard deviation of the Laplacian, in pixels.
    +
    enhance
    +
    voidEnhance image (minimize noise)
    +
    equalize
    +
    voidEqualize image (histogram equalization)
    +
    erase
    +
    voidSet all image pixels to the current +background color.
    +
    extent
    const Geometry &geometry_extends the image as defined by the geometry, gravity, and image background color.
    const Geometry +&geometry_, const Color &backgroundColor_
    const Geometry &geometry_, const GravityType +&gravity_extends the image as defined by the geometry, gravity, and image background color.
    const Geometry +&geometry_, const Color &backgroundColor_, +const GravityType &gravity_
    +
    flip
    +
    voidFlip image (reflect each scanline in the +vertical direction)
    +
    floodFill- +
    + Color
    +
    ssize_t x_, ssize_t y_, const Color &fillColor_Flood-fill color across pixels +that match the color of the target pixel and are neighbors of the +target pixel. Uses current fuzz setting when determining color match.
    const Geometry +&point_, const Color &fillColor_
    ssize_t x_, ssize_t y_, const Color &fillColor_, const Color +&borderColor_Flood-fill color across pixels +starting at target-pixel and stopping at pixels matching specified +border color. Uses current fuzz setting when determining color match.
    const Geometry +&point_, const Color &fillColor_, +const Color &borderColor_
    floodFillOpacityconst long x_, const long y_, const unsigned int +opacity_, const PaintMethod method_Floodfill pixels matching color (within fuzz +factor) of target pixel(x,y) with replacement opacity value using +method.
    +
    floodFill- +
    + Texture
    +
    ssize_t x_, ssize_t y_,  const +Image &texture_Flood-fill texture across pixels +that match the color of the target pixel and are neighbors of the +target pixel. Uses current fuzz setting when determining color match.
    const Geometry +&point_, const Image &texture_
    ssize_t x_, ssize_t y_, const Image +&texture_, const Color &borderColor_Flood-fill texture across pixels +starting at target-pixel and stopping at pixels matching specified +border color. Uses current fuzz setting when determining color match.
    const Geometry +&point_, const Image &texture_, const +Color +&borderColor_
    +
    flop
    +
    void Flop image (reflect each scanline in the +horizontal direction)
    +
    frame
    +
    const Geometry +&geometry_ = "25x25+6+6"Add decorative frame around image
    size_t width_, size_t height_, +ssize_t x_, ssize_t y_, ssize_t innerBevel_ = 0, ssize_t outerBevel_ = 0
    +
    fx
    +
    const std::string expression, const Magick::ChannelType channelFx image.  Applies a mathematical +expression to the image.
    +
    gamma
    +
    double gamma_Gamma correct image (uniform red, green, and +blue correction).
    double gammaRed_, double gammaGreen_, double +gammaBlue_Gamma correct red, green, and blue channels +of image.
    +
    gaussianBlur
    +
    const double width_, const double sigma_Gaussian blur image. The number of neighbor +pixels to be included in the convolution mask is specified by +'width_'.  For example, a width of one gives a (standard) 3x3 +convolution mask. The standard deviation of the gaussian bell curve is +specified by 'sigma_'.
    gaussianBlurChannel
    +
    const ChannelType +channel_, const double radius_ = 0.0, const double sigma_ = 1.0
    +
    Gaussian blur +an image channel. The channel_ parameter specifies the +channel to blur. The number of neighbor +pixels to be included in the convolution mask is specified by +'width_'.  For example, a width of one gives a (standard) 3x3 +convolution mask. The standard deviation of the gaussian bell curve is +specified by 'sigma_'.
    haldClut
    +
    const Image &reference_
    +
    apply a Hald color lookup table to the image.
    +
    +
    implode
    +
    const double factor_Implode image (special effect)
    +
    inverseFourierTransform
    +
    const Image &phaseImage_, const bool magnitude_implements the inverse discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.
    +
    label
    +
    const string &label_Assign a label to an image. Use this option +to  assign  a  specific label to the image. Optionally +you can include the image filename, type, width, height, or scene +number in the label by embedding  +special format characters. If the first character of string is @, +the +image label is read from a file titled by the remaining characters in +the string. When converting to Postscript, use this  option to +specify a header string to print above the image.
    level
    +
    const double black_point, +const double white_point, const double mid_point=1.0
    +
    Level image. Adjust the +levels of the image by scaling the colors falling between specified +white and black points to the full available quantum range. The +parameters provided represent the black, mid (gamma), and white +points.  The black point specifies the darkest color in the image. +Colors darker than the black point are set to zero. Mid point (gamma) +specifies a gamma correction to apply to the image. White point +specifies the lightest color in the image.  Colors brighter than +the white point are set to the maximum quantum value. The black and +white point have the valid range 0 to MaxRGB while mid (gamma) has a +useful range of 0 to ten.
    +
    levelChannel
    +
    const ChannelType +channel, const double black_point, const double white_point, const +double mid_point=1.0
    +
    Level image channel. +Adjust the levels of the image channel by scaling the values falling +between specified white and black points to the full available quantum +range. The parameters provided represent the black, mid (gamma), and +white points. The black point specifies the darkest color in the image. +Colors darker than the black point are set to zero. Mid point (gamma) +specifies a gamma correction to apply to the image. White point +specifies the lightest color in the image. Colors brighter than the +white point are set to the maximum quantum value. The black and white +point have the valid range 0 to MaxRGB while mid (gamma) has a useful +range of 0 to ten.
    +
    +
    magnify
    +
    voidMagnify image by integral size
    +
    map
    +
    const Image &mapImage_ , bool dither_ = +falseRemap image colors with closest color from +reference image. Set dither_ to true in to apply +Floyd/Steinberg +error diffusion to the image. By default, color reduction chooses an +optimal  set  of colors that best represent the original +image. Alternatively, you can  choose  a  +particular  set  of colors  from  an image file +with this option.
    +
    matteFloodfill
    +
    const Color +&target_, const unsigned int  opacity_, const ssize_t x_, const +ssize_t +y_, PaintMethod method_Floodfill designated area with a replacement +opacity value.
    medianFilterconst double radius_ = 0.0Filter image by replacing each pixel +component with the median color in a circular neighborhood
    +
    mergeLayers
    +
    LayerMethod +noiseType_handle multiple images forming a set of image layers or animation frames.
    +
    minify
    +
    voidReduce image by integral size
    modifyImagevoidPrepare to update image. Ensures that there +is only one reference to the underlying image so that the underlying +image may be safely modified without effecting previous generations of +the image. Copies the underlying image to a new image if necessary.
    +
    modulate
    +
    double brightness_, double saturation_, +double hue_Modulate percent hue, saturation, and +brightness of an image. Modulation of saturation and brightness is as a +ratio of the current value (1.0 for no change). Modulation of hue is an +absolute rotation of -180 degrees to +180 degrees from the current +position corresponding to an argument range of 0 to 2.0 (1.0 for no +change).
    motionBlur
    +
    const double radius_, +const double sigma_, const double angle_
    +
    Motion blur image with +specified blur factor. The radius_ parameter specifies the radius of +the Gaussian, in pixels, not counting the center pixel.  The +sigma_ parameter specifies the standard deviation of the Laplacian, in +pixels. The angle_ parameter specifies the angle the object appears to +be comming from (zero degrees is from the right).
    +
    +
    negate
    +
    bool grayscale_ = falseNegate colors in image.  Replace every +pixel with its complementary color (white becomes black, yellow becomes +blue, etc.).  Set grayscale to only negate grayscale values in +image.
    +
    normalize
    +
    voidNormalize image (increase contrast by +normalizing the pixel values to span the full range of color values).
    +
    oilPaint
    +
    size_t radius_ = 3Oilpaint image (image looks like oil painting)
    +
    opacity
    +
    unsigned int opacity_Set or attenuate the opacity channel in the +image. If the image pixels are opaque then they are set to the +specified +opacity value, otherwise they are blended with the supplied opacity +value.  The value of opacity_ ranges from 0 (completely opaque) to + MaxRGB +. The defines OpaqueOpacity and TransparentOpacity are +available to specify completely opaque or completely transparent, +respectively.
    +
    opaque
    +
    const Color +&opaqueColor_, const Color &penColor_Change color of pixels matching opaqueColor_ +to specified penColor_.
    +
    ping
    +
    const std::string &imageSpec_Ping is similar to read +except only enough of the image is read to determine the image columns, +rows, and filesize.  The columns , + rows , and fileSize +attributes are valid after invoking ping.  The image data is not +valid after calling ping.
    const Blob &blob_
    process
    +
    std::string name_, +const ssize_t argc_, char **argv_
    +
    Execute the named +process module, passing any arguments via an argument vector, with +argc_ +specifying the number of arguments in the vector, and argv_ passing the +address of an array of null-terminated C strings which constitute the +argument vector. An exception is thrown if the requested process module +does not exist, fails to load, or fails during execution.
    +
    +
    quantize
    +
    bool measureError_ = falseQuantize image (reduce number of colors). Set +measureError_ to true in order to calculate error attributes.
    +
    raise
    +
    const Geometry +&geometry_ = "6x6+0+0",  bool raisedFlag_ =  falseRaise image (lighten or darken the edges of +an image to give a 3-D raised or lowered effect)
    +
    read
    +
    const string &imageSpec_Read image into current object
    const Geometry +&size_, const std::string &imageSpec_Read image of specified size into current +object. This form is useful for images that do not specifiy their size +or to specify a size hint for decoding an image. For example, when +reading a Photo CD, JBIG, or JPEG image, a size request causes the +library to return an image which is the next resolution greater or +equal to the specified size. This may result in memory and time savings.
    const Blob &blob_Read encoded image of specified +size from an in-memory BLOB into current +object. Depending on the method arguments, the Blob size, depth, and +format may also be specified. Some image formats require that size be +specified. The default ImageMagick uses for depth depends on its +Quantum size (8 or 16).  If ImageMagick's Quantum size does not +match that of the image, the depth may need to be specified. +ImageMagick can usually automagically detect the image's format. +When +a format can't be automagically detected, the format must be specified.
    const Blob +&blob_, const Geometry &size_
    const Blob +&blob_, const Geometry &size_, +size_t depth_
    const Blob +&blob_, const Geometry &size_, +size_t depth_, const string &magick_ 
    const Blob +&blob_, const Geometry &size_, +const +string &magick_
    const size_t width_, const size_t +height_, std::string map_, const StorageType type_, const void *pixels_Read image based on an array of image pixels. +The pixel data must be in scanline order top-to-bottom. The data can be +character, short int, integer, float, or double. Float and double +require the pixels to be normalized [0..1]. The other types are +[0..MaxRGB].  For example, to create a 640x480 image from +unsigned red-green-blue character data, use +

      image.read( 640, 480, "RGB", CharPixel, +pixels );

    +

    The parameters are as follows:

    + + + + + + + + + + + + + + + + + + + + + + + +
    width_Width in pixels of the image.
    height_Height in pixels of the image.
    map_This character string can be any +combination or order of R = red, G = green, B = blue, A = alpha, C = +cyan, Y = yellow M = magenta, and K = black. The ordering reflects the +order of the pixels in the supplied pixel array.
    type_Pixel storage type (CharPixel, +ShortPixel, IntegerPixel, FloatPixel, or DoublePixel)
    pixels_This array of values contain the pixel +components as defined by the map_ and type_ parameters. The length of +the arrays must equal the area specified by the width_ and height_ +values and type_ parameters.
    +
    +
    reduceNoise
    +
    const double order_reduce noise in image using a noise peak elimination filter.
    randomThreshold
    +
    const Geometry +&thresholds_
    +
    Random threshold the +image. Changes the value of individual pixels based on the intensity of +each pixel compared to a random threshold. The result is a +low-contrast, two color image. The thresholds_ argument is a +geometry containing LOWxHIGH thresholds. If the string contains +2x2, 3x3, or 4x4, then an ordered dither of order 2, 3, or 4 will be +performed instead. This is a very fast alternative to 'quantize' based +dithering.
    +
    randomThresholdChannel
    +
    const Geometry +&thresholds_, const ChannelType channel_
    +
    Random threshold an +image channel. Similar to randomThreshold() +but restricted to the specified channel.
    +
    +
    roll
    +
    int columns_, ssize_t rows_Roll image (rolls image vertically and +horizontally) by specified number of columnms and rows)
    +
    rotate
    +
    double degrees_Rotate image counter-clockwise by specified +number of degrees.
    +
    sample
    +
    const Geometry +&geometry_ Resize image by using pixel sampling algorithm
    +
    scale
    +
    const Geometry +&geometry_Resize image by using simple ratio algorithm
    +
    segment
    +
    double clusterThreshold_ = 1.0,
    + double smoothingThreshold_ = 1.5
    Segment (coalesce similar image components) +by analyzing the histograms of the color components and identifying +units that are homogeneous with the fuzzy c-means technique. Also uses quantizeColorSpace +and verbose image attributes. Specify clusterThreshold_ +, +as the number  of  pixels  each cluster  must +exceed +the cluster threshold to be considered valid. SmoothingThreshold_ +eliminates noise in the  second derivative of the histogram. As +the +value is  increased, you can  expect  a  smoother +second derivative.  The default is 1.5.
    +
    shade
    +
    double azimuth_ = 30, double elevation_ = 30, +
    + bool colorShading_ = false
    Shade image using distant light source. +Specify azimuth_ and elevation_ as the  +position  of  the light source. By default, the shading +results as a grayscale image.. Set colorShading_ to true +to +shade the red, green, and blue components of the image.
    +
    shadow
    +
    const double percent_opacity = 80, const double sigma_ += 0.5, const ssize_t x_ = 0, const ssize_t y_ = 0simulate an image shadow
    +
    sharpen
    +
    const double radius_ = 1, const double sigma_ += 0.5Sharpen pixels in image.  The radius_ +parameter specifies the radius of the Gaussian, in pixels, not counting +the center pixel.  The sigma_ parameter specifies the +standard deviation of the Laplacian, in pixels.
    sharpenChannel
    +
    const ChannelType +channel_, const double radius_ = 0.0, const double sigma_ = 1.0
    +
    Sharpen pixel +quantums in an image channel  The channel_ parameter specifies the +channel to sharpen..  The radius_ +parameter specifies the radius of the Gaussian, in pixels, not counting +the center pixel.  The sigma_ parameter specifies the +standard deviation of the Laplacian, in pixels.
    +
    shave
    +
    const Geometry &geometry_Shave pixels from image edges.
    +
    shear
    +
    double xShearAngle_, double yShearAngle_Shear image (create parallelogram by sliding +image by X or Y axis).  Shearing slides one edge of an image along +the X  or  Y axis,  creating  a +parallelogram.  An X direction shear slides an edge along the X +axis, while  a  Y  direction shear  slides  +an edge along the Y axis.  The amount of the shear is controlled +by a shear angle.  For X direction  shears,  x  +degrees is measured relative to the Y axis, and similarly, for Y +direction shears  y  degrees is measured relative to the X +axis. Empty triangles left over from shearing the  image  are +filled  with  the  color  defined as borderColor
    +
    solarize
    +
    double factor_ = 50.0Solarize image (similar to effect seen when +exposing a photographic film to light during the development process)
    +
    splice
    +
    const Geometry +&geometry_splice the background color into the image
    +
    spread
    +
    size_t amount_ = 3Spread pixels randomly within image by +specified amount
    +
    stegano
    +
    const Image &watermark_Add a digital watermark to the image (based +on second image)
    +
    sparseColor
    +
    const ChannelType channel, const SparseColorMethod method, const size_t number_arguments, const double *arguments Sparse color image, given a set of coordinates, interpolates the colors found at those coordinates, across the whole image, using various methods.
    +
    statistics
    +
    ImageStatistics *statisticsObtain image statistics. Statistics are normalized to the range of 0.0 to 1.0 and are output to the specified ImageStatistics structure. The structure includes members maximum, minimum, mean, standard_deviation, and variance for each of these channels: red, green, blue, and opacity (e.g. statistics->red.maximum).
    +
    stereo
    +
    const Image &rightImage_Create an image which appears in stereo when +viewed with red-blue glasses (Red image on left, blue on right)
    +
    swirl
    +
    double degrees_Swirl image (image pixels are rotated by +degrees)
    +
    texture
    +
    const Image &texture_Layer a texture on pixels matching image +background color.
    +
    threshold
    +
    double threshold_Threshold image
    +
    transform
    +
    const Geometry +&imageGeometry_Transform image based on image +and crop geometries. Crop geometry is optional.
    const Geometry +&imageGeometry_, const Geometry +&cropGeometry_ 
    +
    transparent
    +
    const Color +&color_Add matte image to image, setting pixels +matching color to transparent.
    +
    trim
    +
    voidTrim edges that are the background color from +the image.
    +
    unsharpmask
    +
    double radius_, double sigma_, double +amount_, double threshold_Sharpen the image using the unsharp mask +algorithm. The radius_ +parameter specifies the radius of the Gaussian, in pixels, not +counting the center pixel. The sigma_ parameter specifies the +standard deviation of the Gaussian, in pixels. The amount_ +parameter specifies the percentage of the difference between the +original and the blur image that is added back into the original. The threshold_ +parameter specifies the threshold in pixels needed to apply the +diffence amount.
    unsharpmaskChannel
    +
    const ChannelType +channel_, const double radius_, const double sigma_, const double +amount_, const double threshold_
    +
    Sharpen an image +channel using the unsharp mask algorithm. The channel_ parameter specifies the +channel to sharpen. The radius_ +parameter specifies the radius of the Gaussian, in pixels, not +counting the center pixel. The sigma_ parameter specifies the +standard deviation of the Gaussian, in pixels. The amount_ +parameter specifies the percentage of the difference between the +original and the blur image that is added back into the original. The threshold_ +parameter specifies the threshold in pixels needed to apply the +diffence amount.
    +
    wave
    +
    double amplitude_ = 25.0, double wavelength_ += 150.0Alter an image along a sine wave.
    +
    write
    +
    const string &imageSpec_Write image to a file using filename imageSpec_ +.
    + Caution: if +an image format is selected which is capable of supporting fewer +colors than the original image or quantization has been requested, the +original image will be quantized to fewer colors. Use a copy of the +original if this is a problem.
    Blob *blob_Write image to a in-memory BLOB stored in blob_. The magick_ +parameter specifies the image format to write (defaults to magick ). The depth_ parameter species the image +depth (defaults to depth ).
    + Caution: if +an image format is selected which is capable of supporting fewer +colors than the original image or quantization has been requested, the +original image will be quantized to fewer colors. Use a copy of the +original if this is a problem.
    Blob *blob_, +std::string &magick_
    Blob *blob_, +std::string &magick_, size_t depth_
    const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_, const std::string &map_, +const StorageType type_, void *pixels_Write pixel data into a buffer you supply. +The data is saved either as char, short int, integer, float or double +format in the order specified by the type_ parameter. For example, we +want to extract scanline 1 of a 640x480 image as character data in +red-green-blue order: +

      image.write(0,0,640,1,"RGB",0,pixels); +

    +

    The parameters are as follows:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    x_Horizontal ordinate of left-most +coordinate of region to extract.
    y_Vertical ordinate of top-most +coordinate of region to extract.
    columns_Width in pixels of the region to +extract.
    rows_Height in pixels of the region to +extract.
    map_This character string can be any +combination or order of R = red, G = green, B = blue, A = alpha, C = +cyan, Y = yellow, M = magenta, and K = black. The ordering reflects +the order of the pixels in the supplied pixel array.
    type_Pixel storage type (CharPixel, +ShortPixel, IntegerPixel, FloatPixel, or DoublePixel)
    pixels_This array of values contain the pixel +components as defined by the map_ and type_ parameters. The length of +the arrays must equal the area specified by the width_ and height_ +values and type_ parameters.
    +
    +
    resize
    +
    const Geometry +&geometry_Resize image to specified size.
    +
    +

    Image Attributes

    +
    +Image attributes are set and obtained via methods in Image. Except for +methods which accept pointer arguments (e.g. chromaBluePrimary) +all methods return attributes by value. +

    Image attributes are easily used. For example, to set the resolution +of the TIFF file "file.tiff" to 150 dots-per-inch (DPI) in both the +horizontal and vertical directions, you can use the following example +code:

    +
    +string filename("file.tiff"); 
    +Image image; 
    +image.read(filename); 
    +image.resolutionUnits(PixelsPerInchResolution); 
    +image.density(Geometry(150,150));   // could also use image.density("150x150") 
    +image.write(filename)
    +
    +The supported image attributes and the method arguments required to +obtain them are shown in the following table:
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Attributes
    +
    Function
    +
    +
    Type
    +
    +
    Get Signature
    +
    +
    Set Signature
    +
    +
    Description
    +
    +
    adjoin
    +
    boolvoidbool flag_Join images into a single multi-image file.
    +
    antiAlias
    +
    boolvoidbool flag_Control antialiasing of rendered Postscript +and Postscript or TrueType fonts. Enabled by default.
    +
    animation- +
    + Delay
    +
    size_t (0 to 65535)voidsize_t delay_Time in 1/100ths of a second (0 to 65535) +which must expire before displaying the next image in an animated +sequence. This option is useful for regulating the animation of a +sequence  of GIF images within Netscape.
    +
    animation- +
    + Iterations
    +
    size_tvoidsize_t iterations_Number of iterations to loop an animation +(e.g. Netscape loop extension) for.
    attribute
    +
    string
    +
    const +std::string name_
    +
    const +std::string name_, const std::string value_An arbitrary named +image attribute. Any number of named attributes may be attached to the +image. For example, the image comment is a named image attribute with +the name "comment". EXIF tags are attached to the image as named +attributes. Use the syntax "EXIF:<tag>" to request an EXIF tag +similar to "EXIF:DateTime".
    +
    +
    background- +
    + Color
    +
    Color voidconst Color +&color_Image background color
    +
    background- +
    + Texture
    +
    stringvoidconst string &texture_Image file name to use as the background +texture. Does not modify image pixels.
    +
    baseColumns
    +
    size_tvoid Base image width (before transformations)
    +
    baseFilename
    +
    stringvoid Base image filename (before transformations)
    +
    baseRows
    +
    size_tvoid Base image height (before transformations)
    +
    borderColor
    +
    Color void const Color +&color_Image border color
    boundingBoxGeometryvoid Return smallest bounding box enclosing +non-border pixels. The current fuzz value is used when discriminating +between pixels. This is the crop bounding box used by +crop(Geometry(0,0)).
    +
    boxColor
    +
    Color voidconst Color +&boxColor_Base color that annotation text is rendered +on.
    cacheThresholdsize_t const size_tPixel cache threshold in bytes. Once this +threshold is exceeded, all subsequent pixels cache operations are +to/from disk. This is a static method and the attribute it sets is +shared by all Image objects.
    channelDepth
    +
    size_t +
    +
    const +ChannelType channel_
    +
    const ChannelType +channel_, const size_t depth_
    +
    Channel modulus depth. +The channel modulus depth represents the minimum number of bits +required +to support the channel without loss. Setting the channel's modulus +depth +modifies the channel (i.e. discards resolution) if the requested +modulus +depth is less than the current modulus depth, otherwise the channel is +not altered. There is no attribute associated with the modulus depth so +the current modulus depth is obtained by inspecting the pixels. As a +result, the depth returned may be less than the most recently set +channel depth. Subsequent image processing may result in increasing the +channel depth.
    +
    +
    chroma- +
    + BluePrimary
    +
    double x & ydouble *x_, double *y_double x_, double y_Chromaticity blue primary point (e.g. x=0.15, +y=0.06)
    +
    chroma- +
    + GreenPrimary
    +
    double x & ydouble *x_, double *y_double x_, double y_Chromaticity green primary point (e.g. x=0.3, +y=0.6)
    +
    chroma- +
    + RedPrimary
    +
    double x & ydouble *x_, double *y_double x_, double y_Chromaticity red primary point (e.g. x=0.64, +y=0.33)
    +
    chroma- +
    + WhitePoint
    +
    double x & ydouble*x_, double *y_double x_, double y_Chromaticity white point (e.g. x=0.3127, +y=0.329)
    +
    classType
    +
    ClassType + void ClassType +class_Image storage class.  Note that +conversion from a DirectClass image to a PseudoClass image may result +in a loss of color due to the limited size of the palette (256 or +65535 colors).
    +
    clipMask
    +
    Imagevoidconst Image &clipMask_Associate a clip mask image with the current +image. The clip mask image must have the same dimensions as the current +image or an exception is thrown. Clipping occurs wherever pixels are +transparent in the clip mask image. Clipping Pass an invalid image to +unset an existing clip mask.
    +
    colorFuzz
    +
    doublevoiddouble fuzz_Colors within this distance are considered +equal. A number of algorithms search for a target  color. By +default the color must be exact. Use this option to match colors that +are close to the target color in RGB space.
    +
    colorMap
    +
    Color size_t index_size_t index_, const Color &color_Color at colormap index.
    +
    colorMapSize
    +
    +
    size_t
    +
    void
    +
    size_t entries_
    +
    Number of entries in the +colormap. Setting the colormap size may extend or truncate the +colormap. +The maximum number of supported entries is specified by the MaxColormapSizeconstant, +and is dependent on the value of QuantumDepth when ImageMagick is +compiled. An exception is thrown if more entries are requested than may +be supported. Care should be taken when truncating the colormap to +ensure that the image colormap indexes reference valid colormap entries.
    +
    +
    colorSpace
    +
    ColorspaceType +colorSpace_voidColorspaceType +colorSpace_The colorspace (e.g. CMYK) used to represent +the image pixel colors. Image pixels are always stored as RGB(A) except +for the case of CMY(K).
    +
    columns
    +
    size_tvoid Image width
    +
    comment
    +
    stringvoid Image comment
    +
    compose
    +
    CompositeOperator + voidCompositeOperator +compose_Composition operator to be used when +composition is implicitly used (such as for image flattening).
    +
    compress- +
    + Type
    +
    CompressionType + voidCompressionType +compressType_Image compresion type. The default is the +compression type of the specified image file.
    +
    debug
    +
    boolvoidbool flag_Enable printing of internal debug messages +from ImageMagick as it executes.
    defineValue
    +
    string
    +
    const std::string +&magick_, const std::string &key_
    +
    const std::string +&magick_, const std::string &key_,  const std::string +&value_
    +
    Set or obtain a +definition string to applied when encoding or decoding the specified +format. The meanings of the definitions are format specific. The format +is designated by the magick_ +argument, the format-specific key is designated by key_, and the associated value is +specified by value_. See the +defineSet() method if the key must be removed entirely.
    +
    defineSet
    +
    bool
    +
    const std::string +&magick_, const std::string &key_
    +
    const std::string +&magick_, const std::string &key_, bool flag_
    +
    Set or obtain a +definition flag to applied when encoding or decoding the specified +format.. Similar to the defineValue() method except that +passing the flag_ value +'true' +creates a value-less define with that format and key. Passing the flag_ +value 'false' removes any existing matching definition. The method +returns 'true' if a matching key exists, and 'false' if no matching key +exists.
    +
    +
    density
    +
    Geometry   +(default 72x72)voidconst Geometry +&density_Vertical and horizontal resolution in pixels +of the image. This option specifies an image density when decoding a +Postscript or Portable Document page. Often used with psPageSize.
    +
    depth
    +
     size_t (8-32)voidsize_t depth_Image depth. Used to specify the bit depth +when reading or writing  raw images or when the output format +supports multiple depths. Defaults to the quantum depth that +ImageMagick is compiled with.
    +
    endian
    +
    EndianType + voidEndianType +endian_Specify (or obtain) endian option for formats +which support it.
    +
    directory
    +
    stringvoid Tile names from within an image montage
    +
    file
    +
    FILE *FILE *FILE *file_Image file descriptor.
    +
    fileName
    +
    stringvoidconst string &fileName_Image file name.
    +
    fileSize
    +
    off_tvoid Number of bytes of the image on disk
    +
    fillColor
    +
    Colorvoidconst Color &fillColor_Color to use when filling drawn objects
    +
    fillPattern
    +
    Imagevoidconst Image &fillPattern_Pattern image to use when filling drawn +objects.
    +
    fillRule
    +
    FillRule + voidconst Magick::FillRule &fillRule_Rule to use when filling drawn objects.
    +
    filterType
    +
    FilterTypes + voidFilterTypes +filterType_Filter to use when resizing image. The +reduction filter employed has a sigificant effect on the time required +to resize an image and the resulting quality. The default filter is Lanczos +which has been shown to produce high quality results when reducing most +images.
    +
    font
    +
    stringvoidconst string &font_Text rendering font. If the font is a fully +qualified X server font name, the font is obtained from an X  +server. To use a TrueType font, precede the TrueType filename with an +@. Otherwise, specify  a  Postscript font name (e.g. +"helvetica").
    +
    fontPointsize
    +
    size_tvoidsize_t pointSize_Text rendering font point size
    +
    fontTypeMetrics
    +
    TypeMetric const std::string &text_, TypeMetric *metrics Update metrics with font type metrics using +specified text, and current font and fontPointSize settings.
    +
    format
    +
    stringvoid Long form image format description.
    +
    gamma
    +
    double (typical range 0.8 to 2.3)void Gamma level of the image. The same color +image displayed on two different  workstations  may  +look  different due to differences in the display monitor.  +Use gamma correction  to  adjust  for this  +color  difference.
    +
    geometry
    +
    Geometry void Preferred size of the image when encoding.
    +
    gifDispose- +
    + Method
    +
    size_t
    + { 0 = Disposal not specified,
    + 1 = Do not dispose of graphic,
    + 3 = Overwrite graphic with background color, +
    + 4 = Overwrite graphic with previous graphic. }
    voidsize_t disposeMethod_GIF disposal method. This option is used to +control how successive frames are rendered (how the preceding frame is +disposed of) when creating a GIF animation.
    +
    iccColorProfile
    +
    Blob voidconst Blob +&colorProfile_ICC color profile. Supplied via a Blob since Magick++/ and ImageMagick do not +currently support formating this data structure directly.  +Specifications are available from the +International Color Consortium for the format of ICC color profiles.
    +
    interlace- +
    + Type
    +
    InterlaceType + voidInterlaceType +interlace_The type of interlacing scheme (default NoInterlace +). This option is used to specify the type of  interlacing +scheme  for  raw  image formats such as RGB or YUV. NoInterlace +means do not  interlace, LineInterlace uses scanline +interlacing, and PlaneInterlace uses plane interlacing. +PartitionInterlace is like PlaneInterlace except the  +different planes  are saved  to individual files (e.g.  +image.R, image.G, and image.B). Use LineInterlace or +PlaneInterlace to create an interlaced GIF or progressive JPEG +image.
    +
    iptcProfile
    +
    Blob voidconst Blob & +iptcProfile_IPTC profile. Supplied via a Blob since Magick++ and ImageMagick do not +currently  support formating this data structure directly. +Specifications are available from the +International Press Telecommunications Council for IPTC profiles.
    +
    label
    +
    stringvoidconst string &label_Image label
    +
    magick
    +
    stringvoid const string &magick_Get image format (e.g. "GIF")
    +
    matte
    +
    boolvoidbool matteFlag_True if the image has transparency. If set +True, store matte channel if  the image has one otherwise create +an opaque one.
    +
    matteColor
    +
    Color voidconst Color +&matteColor_Image matte (frame) color
    +
    meanError- +
    + PerPixel
    +
    doublevoid The mean error per pixel computed when an +image is color reduced. This parameter is only valid if verbose is set +to true and the image has just been quantized.
    modulusDepth
    +
    size_t +
    +
    void
    +
    size_t +depth_
    +
    Image +modulus depth (minimum number of bits required to support +red/green/blue components without loss of accuracy). The pixel modulus +depth may be decreased by supplying a value which is less than the +current value, updating the pixels (reducing accuracy) to the new +depth. +The pixel modulus depth can not be increased over the current value +using this method.
    +
    +
    monochrome
    +
    boolvoidbool flag_Transform the image to black and white
    +
    montage- +
    + Geometry
    +
    Geometry void Tile size and offset within an image montage. +Only valid for montage images.
    +
    normalized- +
    + MaxError
    +
    doublevoid The normalized max error per pixel computed +when an image is color reduced. This parameter is only valid if verbose +is set to true and the image has just been quantized.
    +
    normalized- +
    + MeanError
    +
    doublevoid The normalized mean error per pixel computed +when an image is color reduced. This parameter is only valid if verbose +is set to true and the image has just been quantized.
    orientation
    +
    OrientationTypevoid
    +
    OrientationType +orientation_Image orientation. + Supported by some file formats such as DPX and TIFF. Useful for +turning the right way up.
    +
    +
    packets
    +
    size_tvoid The number of runlength-encoded packets in +
    + the image
    +
    packetSize
    +
    size_tvoid The number of bytes in each pixel packet
    +
    page
    +
    Geometry + voidconst Geometry &pageSize_Preferred size and location of an image +canvas. +

    Use this option to specify the dimensions +and position of the Postscript page in dots per inch or a TEXT page in +pixels. This option is typically used in concert with density .

    +

    Page may also be used to position a GIF +image (such as for a scene in an animation)

    +
    +
    pixelColor
    +
    Color ssize_t x_, ssize_t y_ssize_t x_, ssize_t y_, const Color &color_Get/set pixel color at location x & y.
    +
    profile
    +
    +
    Blob
    +
    const std::string name_
    +
    const std::string name_, const Blob +&colorProfile_
    +
    Get/set/remove a named +profile. Valid names include "*", +"8BIM", "ICM", "IPTC", or a user/format-defined profile name.
    +
    +
    quality
    +
    size_t (0 to 100)voidsize_t quality_JPEG/MIFF/PNG compression level (default 75).
    +
    quantize- +
    + Colors
    +
    size_tvoidsize_t colors_Preferred number of colors in the image. The +actual number of colors in the image may be less than your request, but +never more. Images with less unique colors than specified with this +option will have any duplicate or unused colors removed.
    +
    quantize- +
    + ColorSpace
    +
    ColorspaceType + voidColorspaceType +colorSpace_Colorspace to quantize colors in (default +RGB). Empirical evidence suggests that distances in color spaces such +as YUV or YIQ correspond to perceptual color differences more closely +than do distances in RGB space. These color spaces may give better +results when color reducing an image.
    +
    quantize- +
    + Dither
    +
    boolvoidbool flag_Apply Floyd/Steinberg error diffusion to the +image. The basic strategy of dithering is to  trade  +intensity +resolution  for  spatial  resolution  by  +averaging the intensities  of  several  +neighboring  pixels. Images which  suffer  from  +severe  contouring  when  reducing colors can be +improved with this option. The quantizeColors or monochrome option must +be set for this option to take effect.
    +
    quantize- +
    + TreeDepth
    +
    size_t voidsize_t treeDepth_Depth of the quantization color +classification tree. Values of 0 or 1 allow selection of the optimal +tree depth for the color reduction algorithm. Values between 2 and 8 +may be used to manually adjust the tree depth.
    +
    rendering- +
    + Intent
    +
    RenderingIntent + voidRenderingIntent +render_The type of rendering intent
    +
    resolution- +
    + Units
    +
    ResolutionType + voidResolutionType +units_Units of image resolution
    +
    rows
    +
    size_tvoid The number of pixel rows in the image
    +
    scene
    +
    size_tvoidsize_t scene_Image scene number
    +
    signature
    +
    stringbool force_ = false Image MD5 signature. Set force_ to 'true' to +force re-computation of signature.
    +
    size
    +
    Geometry voidconst Geometry +&geometry_Width and height of a raw image (an image +which does not support width and height information).  Size may +also be used to affect the image size read from a multi-resolution +format (e.g. Photo CD, JBIG, or JPEG.
    +
    strip
    +
    voidstrips an image of all profiles and comments.
    +
    strokeAntiAlias
    +
    boolvoidbool flag_Enable or disable anti-aliasing when drawing +object outlines.
    +
    strokeColor
    +
    Colorvoidconst Color &strokeColor_Color to use when drawing object outlines
    +
    strokeDashOffset
    +
    size_tvoiddouble strokeDashOffset_While drawing using a dash pattern, specify +distance into the dash pattern to start the dash (default 0).
    +
    strokeDashArray
    +
    const double*voidconst double* strokeDashArray_Specify the pattern of dashes and gaps used +to stroke paths. The strokeDashArray represents a zero-terminated +array of numbers that specify the lengths (in pixels) of alternating +dashes and gaps in user units. If an odd number of values is provided, +then the list of values is repeated to yield an even number of +values.  A typical strokeDashArray_ array might contain the +members 5 3 2 0, where the zero value indicates the end of the pattern +array.
    +
    strokeLineCap
    +
    LineCapvoidLineCap lineCap_Specify the shape to be used at the corners +of paths (or other vector shapes) when they are stroked. Values of +LineJoin are UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin.
    +
    strokeLineJoin
    +
    LineJoinvoidLineJoin lineJoin_Specify the shape to be used at the corners +of paths (or other vector shapes) when they are stroked. Values of +LineJoin are UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin.
    +
    strokeMiterLimit
    +
    size_tvoidsize_t miterLimit_Specify miter limit. When two line segments +meet at a sharp angle and miter joins have been specified for +'lineJoin', it is possible for the miter to extend far beyond the +thickness of the line stroking the path. The miterLimit' imposes a +limit on the ratio of the miter length to the 'lineWidth'. The default +value of this parameter is 4.
    +
    strokeWidth
    +
    doublevoiddouble strokeWidth_Stroke width for use when drawing vector +objects (default one)
    +
    strokePattern
    +
    Imagevoidconst Image &strokePattern_Pattern image to use while drawing object +stroke (outlines).
    +
    subImage
    +
    size_tvoidsize_t subImage_Subimage of an image sequence
    +
    subRange
    +
    size_tvoidsize_t subRange_Number of images relative to the base image
    +
    textEncoding
    +
    +
    string
    +
    void
    +
    const std::string &encoding_
    +
    Specify the code set to use for text +annotations. The only character encoding which may be specified at +this time is "UTF-8" for representing Unicode as a +sequence of bytes. Specify an empty string to use the default ASCII +encoding. Successful text annotation using Unicode may require fonts +designed to support Unicode.
    +
    +
    tileName
    +
    stringvoidconst string &tileName_Tile name
    +
    totalColors
    +
    size_tvoid Number of colors in the image
    +
    type
    +
    ImageType + void ImageType Image type.
    +
    verbose
    +
    boolvoidbool verboseFlag_Print detailed information about the image
    +
    view
    +
    stringvoidconst string &view_FlashPix viewing parameters.
    +
    virtualPixelMethod
    +
    VirtualPixelMethod + voidVirtualPixelMethod +virtualPixelMethod_Image virtual pixel method.
    +
    x11Display
    +
    string (e.g. "hostname:0.0")voidconst string &display_X11 display to display to, obtain fonts from, +or to capture image from
    +
    xResolution
    +
    doublevoid x resolution of the image
    +
    yResolution
    +
    doublevoid y resolution of the image
    +
    +

    Low-Level Image Pixel Access

    +
    +Image pixels (of type PixelPacket ) +may be accessed directly via the Image Pixel Cache .  The +image pixel cache is a rectangular window into the actual image pixels +(which may be in memory, memory-mapped from a disk file, or entirely on +disk). Two interfaces exist to access the Image Pixel Cache. +The +interface described here (part of the Image class) supports +only +one view at a time. See the Pixels +class for a more abstract interface which supports simultaneous pixel +views (up to the number of rows). As an analogy, the interface +described +here relates to the Pixels class as +stdio's gets() relates to fgets(). The Pixels +class provides the more general form of the interface. +

    Obtain existing image pixels via getPixels(). Create a new +pixel region using setPixels().

    +

    In order to ensure that only the current generation of the image is +modified, the Image's modifyImage() method +should be invoked to reduce the reference count on the underlying image +to one. If this is not done, then it is possible for a previous +generation of the image to be modified due to the use of reference +counting when copying or constructing an Image.
    +

    +

    Depending on the capabilities of the operating system, and the +relationship of the window to the image, the pixel cache may be a copy +of the pixels in the selected window, or it may be the actual image +pixels. In any case calling syncPixels() insures that the base +image is updated with the contents of the modified pixel cache. The +method readPixels() supports copying foreign pixel data +formats +into the pixel cache according to the QuantumTypes. The method writePixels() +supports copying the pixels in the cache to a foreign pixel +representation according to the format specified by QuantumTypes.

    +

    The pixel region is effectively a small image in which the pixels +may be accessed, addressed, and updated, as shown in the following +example:

    +
    +cache
    +Image image("cow.png"); 
    +// Ensure that there are no other references to this image.
    +image.modifyImage();
    +// Set the image type to TrueColor DirectClass representation.
    +image.type(TrueColorType);
    +// Request pixel region with size 60x40, and top origin at 20x30 
    +ssize_t columns = 60; 
    +PixelPacket *pixel_cache = image.getPixels(20,30,columns,40); 
    +// Set pixel at column 5, and row 10 in the pixel cache to red. 
    +ssize_t column = 5; 
    +ssize_t row = 10; 
    +PixelPacket *pixel = pixel_cache+row*columns+column; 
    +*pixel = Color("red"); 
    +// Save changes to underlying image .
    +image.syncPixels();
    +  // Save updated image to file.
    +image.write("horse.png");
    +
    +

    The image cache supports the following methods:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Cache Methods
    +
    Method
    +
    +
    Returns
    +
    +
    Signature
    +
    +
    Description
    +
    +
    getConstPixels
    +
    const PixelPacket +*const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_Transfers pixels from the image to the pixel +cache as defined by the specified rectangular region. The returned pointer remains valid until the next getPixel, +getConstPixels, or setPixels call and should never be deallocated by +the +user.
    +
    getConstIndexes
    +
    const IndexPacket*voidReturns a pointer to the Image pixel indexes +corresponding to a previous getPixel, +getConstPixels, or setPixels call.  The +returned pointer remains valid until the next getPixel, getConstPixels, +or setPixels call and should never be deallocated by the user. Only valid for PseudoClass images or CMYKA images. The +pixel indexes represent an array of type IndexPacket, with each entry +corresponding to an x,y pixel position. For PseudoClass images, the +entry's value is the offset into the colormap (see colorMap +) for that pixel. For CMYKA images, the indexes are used to contain the +alpha channel.
    +
    getIndexes
    +
    IndexPacket*voidReturns a pointer to the Image pixel indexes +corresponding to the pixel region requested by the last getConstPixels , getPixels +, or setPixels call. The +returned pointer remains valid until the next getPixel, getConstPixels, +or setPixels call and should never be deallocated by the user. Only valid for PseudoClass images +or +CMYKA images. The pixel indexes represent an array of type +IndexPacket, with each entry corresponding to a pixel x,y position. For +PseudoClass images, the entry's value is the offset into the colormap +(see colorMap ) for that pixel. For +CMYKA +images, the indexes are used to contain the alpha channel.
    +
    getPixels
    +
    PixelPacket *const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_Transfers pixels from the image to the pixel +cache as defined by the specified rectangular region. Modified pixels +may be subsequently transferred back to the image via syncPixels. The returned pointer remains valid until the next getPixel, +getConstPixels, or setPixels call and should never be deallocated by +the +user.
    +
    setPixels
    +
    PixelPacket *const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_Allocates a pixel cache region to store image +pixels as defined by the region rectangle.  This area is +subsequently transferred from the pixel cache to the image via +syncPixels. The returned pointer remains +valid until the next getPixel, getConstPixels, or setPixels call and +should never be deallocated by the user.
    +
    syncPixels
    +
    voidvoidTransfers the image cache pixels to the image.
    +
    readPixels
    +
    voidQuantumTypes +quantum_, unsigned char *source_,Transfers one or more pixel components from a +buffer or file into the image pixel cache of an image. ReadPixels is +typically used to support image decoders. The region transferred +corresponds to the region set by a preceding setPixels call.
    +
    writePixels
    +
    voidQuantumTypes +quantum_, unsigned char *destination_Transfers one or more pixel components from +the image pixel cache to a buffer or file. WritePixels is typically +used to support image encoders. The region transferred corresponds to +the region set by a preceding getPixels or getConstPixels call.
    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Image.png b/ImageMagick-6.9.12-44/www/Magick++/Image.png new file mode 100644 index 0000000000000000000000000000000000000000..35a85ee3954795cde31556efa1a39d80de6457db GIT binary patch literal 23923 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 + + + + +Magick++ API: Design Principles + + + +
    +
    +

    Magick::Image Data Structures

    +The class Magick::Image is a simple handle which points to a reference-counted image representation. This allows multiple Magick::Image instances to share the same image and attributes. At the point in time that the image data, or image attributes are modified and the current reference count is greater than one, the image data and attributes are copied to create a new image with a reference count of one and the reference count on the old image is decremented. If the reference count on the old image becomes zero, then the associated reference and data are deleted. This strategy represents a simple (but effective) form of garbage collection +

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/ImageMagick.png b/ImageMagick-6.9.12-44/www/Magick++/ImageMagick.png new file mode 100644 index 0000000000000000000000000000000000000000..dc53f7a86d29e8b2d847a8a28344956ac82583e6 GIT binary patch literal 305589 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%0D#q44a7~3n+!aA_3RaJC+SWS@JRVc353rI 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%0AWBF>*9#$rS>=Pe`WIJ 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

    LGEm)2{E=-x9-Yd~UMzH~1bhs;4D8 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 + + + + +Magick++ API: Install Magick++ + + + +

    +

    Installing Magick++

    +

    General

    +

    In order to compile Magick++ you must have access to a standard C++ implementation. The author uses gcc 3.4 (GNU C++) which is available under UNIX and under the Cygwin UNIX-emulation environment for Windows. Standards compliant commercial C++ compilers should also work fine. Most modern C++ compilers for Microsoft Windows or the Mac should work (project files are provided for Microsoft Visual C++ 8.0).

    +

    It was decided that Magick++ will be around for the long-haul, so its API definition depends on valuable C++ features which should be common in all current and future C++ compilers. The compiler must support the following C++ standard features:

    +
      +
    • +

      templates

    • +
    • +

      static constructors

    • +
    • +

      C++-style casts (e.g. static_cast)

    • +
    • +

      bool type

    • +
    • +

      string class (<string>)

    • +
    • +

      exceptions (<exception>)

    • +
    • +

      namespaces

    • +
    • +

      Standard Template Library (STL) (e.g. <list>, <vector>)

    +

    The author has personally verified that Magick++ compiles and runs using the following compiler/platform combinations:

    +
    +

    Tested Configurations

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Operating System

    +

    Architecture

    +

    Compiler

    +

    SunOS 5.6, 5.7, 5.8 ("Solaris 2.6, 7, & 8)

    +

    SPARC

    +

    GCC 3.0.4

    +

    SunOS 5.7 ("Solaris 7")

    +

    SPARC

    +

    Sun Workshop 5.0 C++

    +

    SunOS 5.8 ("Solaris 8")

    +

    SPARC

    +

    Sun WorkShop 6 update 2 C++ 5.3

    +

    FreeBSD 4.0

    +

    Intel Pentium II

    +

    GCC 2.95

    +

    Windows NT 4.0 SP6a

    +

    Intel Pentium II

    +

    Visual C++ 8.0 Standard Edition

    +

    Windows XP

    +

    Intel Pentium IV

    +

    Visual C++ 8.0 Standard Edition Service Pack 5

    +

    Windows '98 + Cygwin 1.3.10

    +

    Intel Pentium III

    +

    GCC 2.95.3-5

    +

    Windows NT 4.0 SP6a

    +

    Intel Pentium II

    +

    GCC 2.95.3-5

    +

    Windows XP + Cygwin 1.3.10

    +

    Intel Pentium IV

    +

    GCC 2.95.3-5

    +

    Users of Magick++ have reported that the following configurations work with Magick++:

    +
    +

    Other Known Working Configurations

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Operating System

    +

    Architecture

    +

    Compiler

    +

    Reported By

    +

    Red Hat Linux 8.0

    +

    i386 & alpha

    +

    EGCS 1.1.2

    +

    Dr. Alexander Zimmermann <Alexander.Zimmermann@fmi.uni-passau.de>

    +

    Red Hat Linux 7.0

    +

    i386

    +

    GCC 2.95.2

    +

    Dr. Alexander Zimmermann <Alexander.Zimmermann@fmi.uni-passau.de>

    +

    Red Hat Linux 7.0

    +

    i386

    +

    GCC "2.96" snapshot

    +

    ???

    +

    Red Hat Linux 7.X

    +

    i386 & alpha

    +

    GCC 3.0

    +

    Dr. Alexander Zimmermann <Alexander.Zimmermann@fmi.uni-passau.de>

    +

    SGI IRIX 6.2, 6.5

    +

    MIPS

    +

    IRIX C++ 7.3.1.2m

    +

    Albert Chin-A-Young <china@thewrittenword.com>

    +

    SunOS 5.5.1

    +

    SPARC

    +

    Sun WorkShop CC 5.0

    +

    Albert Chin-A-Young <china@thewrittenword.com>

    +

    SunOS 5.6, 5.7, 5.8

    +

    SPARC

    +

    Sun Forte CC 5.3

    +

    Albert Chin-A-Young <china@thewrittenword.com>

    +

    HP-UX 11.00

    +

    PA-RISC

    +

    HP-UX aCC A.03.30

    +

    Albert Chin-A-Young <china@thewrittenword.com>

    +

    Mac OS 9

    +

    PowerPC

    +

    CodeWarrior Professional Release 6

    +

    Leonard Rosenthol <leonardr@digapp.com>

    +

    Mac OS X 10.1 "Darwin"

    +

    PowerPC

    +

    GCC 2.95.2 (apple gcc -926)

    +

    Cristy

    +

    Please let me know if you have successfully built and executed Magick++ using a different configuration so that I can add to the table of verified configurations.

    +
    +

    Unix/Linux

    +

    Building From Source

    +

    Magick++ is now built using the ImageMagick configure script and Makefiles. Please follow the installation instructions provided by its README.txt file. The following instructions pertain to the Magick++ specific configuration and build options.

    +

    To install ImageMagick plus Magick++ under Unix, installation should be similar to

    +

    ./configure [ --prefix=/prefix ]
    +make
    +make install

    +

    The library is currently named similar to 'libMagick++.a' (and/or libMagick++.so.5.0.39) and is installed under prefix/lib while the headers are installed with Magick++.h being installed in prefix/include and the remaining headers in prefix/include/Magick++.

    +

    To influence the options the configure script chooses, you may specify 'make' option variables when running the configure script. For example, the command

    +
    ./configure CXX=CC CXXFLAGS=-O2 LIBS=-lposix
    +


    +specifies additional options to the configure script. The following table shows the available options.

    +
    +

    Environment Variables That Effect Configure

    + +++ + + + + + + + + + + + + + + + + +
    +

    Make Option Variable

    +

    Description

    +

    CXX

    +

    Name of C++ compiler (e.g. 'CC -Xa') to use compiler 'CC -Xa'

    +

    CXXFLAGS

    +

    Compiler flags (e.g. '-g -O2') to compile with

    +

    CPPFLAGS

    +

    Include paths (-I/somedir) to look for header files

    +

    LDFLAGS

    +

    Library paths (-L/somedir) to look for libraries. Systems that support the notion of a library run-path may additionally require -R/somedir or '-rpath /somedir' in order to find shared libraries at run time.

    +

    LIBS

    +

    Extra libraries (-lsomelib) required to link

    +

    Installing Linux RPMs

    +

    Linux RPMs of ImageMagick and Magick++ can be downloaded from ftp://ftp.imagemagick.org/pub/ImageMagick/linux/.

    +
    +

    Windows '9X, NT, 2003, 2008, XP, & Windows 7

    +

    Visual C++

    +

    Windows NT through Windows Vista are supported by the ImageMagick source package for NT available in the 'win2k' subdirectory of the ImageMagick ftp site (and mirrors). The ImageMagick source package for NT provides sources to ImageMagick, Magick++, add-on libraries (e.g. JPEG), and a ready-made Visual C++ 8.0 build environment. Please read the configuration and build instructions in README.txt (under the heading "Windows Win2K/XP VISUAL C++ 8.0 COMPILATION") in order to build Magick++.

    +

    Cygwin & GCC

    +

    It is possible to build both ImageMagick and Magick++ under the Cygwin Unix-emulation environment for Windows NT. Obtain and install Cgywin from http://www.cygwin.com/ . An X11R6 environment for Cygwin is available from http://www.cygwin.com/xfree/ .To build using Cygwin and GCC, follow the instructions for building under Unix.

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Magick++.png b/ImageMagick-6.9.12-44/www/Magick++/Magick++.png new file mode 100644 index 0000000000000000000000000000000000000000..849ece76f5b4ca709715024ed200dd9d21dec347 GIT binary patch literal 10111 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/www/Magick++/Montage.html b/ImageMagick-6.9.12-44/www/Magick++/Montage.html new file mode 100644 index 0000000..f1a80ee --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Montage.html @@ -0,0 +1,332 @@ + + + + + +Magick++ API: Montage + + + +
    +

    Magick::Montage Class

    +

    A montage is a single image which is composed of thumbnail images composed in a uniform grid. The size of the montage image is determined by the size of the individual thumbnails and the number of rows and columns in the grid.

    +

    The following illustration shows a montage consisting of three columns and two rows of thumbnails rendered on a gray background:

    +

    +

    Montages may be either "plain" (undecorated thumbnails) or "framed" (decorated thumbnails). In order to more easily understand the options supplied to MontageImages(), montage options are supplied by two different classes: Magick::Montage and Magick::MontageFramed.

    +

    Plain Montages

    +

    Magick::Montage is the base class to provide montage options and provides methods to set all options required to render simple (unframed) montages. See Magick::MontageFramedif you would like to create a framed montage.

    +

    Unframed thumbnails consist of four components: the thumbnail image, the thumbnail border, an optional thumbnail shadow, and an optional thumbnail label area.

    +

    +

    +

    Montage Methods

    +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +

      Method

      +

      Return Type

      +

      Signature(s)

      +

      Description

      +

      Montage

      +

      void

      +

      Default constructor

      +

      backgroundColor

      +

      void

      +

      const Color &backgroundColor_

      +

      Specifies the background color that thumbnails are imaged upon.

      +

      Color

      +

      void

      +

      compose

      +

      void

      +

      CompositeOperator compose_

      +

      Specifies the image composition algorithm for thumbnails. This controls the algorithm by which the thumbnail image is placed on the background. Use of OverCompositeOp is recommended for use with images that have transparency. This option may have negative side-effects for images without transparency.

      +

      CompositeOperator

      +

      void

      +

      fileName

      +

      void

      +

      std::string fileName_

      +

      Specifies the image filename to be used for the generated montage images. To handle the case were multiple montage images are generated, a printf-style format may be embedded within the filename. For example, a filename specification of image%02d.miff names the montage images as image00.miff, image01.miff, etc.

      +

      std::string

      +

      void

      +

      fill

      +

      void

      +

      const Color &pen_

      +

      Specifies the fill color to use for the label text.

      +

      Color

      +

      void

      +

      font

      +

      void

      +

      std::string font_

      +

      Specifies the thumbnail label font.

      +

      std::string

      +

      void

      +

      geometry

      +

      void

      +

      const Geometry &geometry_

      +

      Specifies the size of the generated thumbnail.

      +

      Geometry

      +

      void

      +

      gravity

      +

      void

      +

      GravityType gravity_

      +

      Specifies the thumbnail positioning within the specified geometry area. If the thumbnail is smaller in any dimension than the geometry, then it is placed according to this specification.

      +

      GravityType

      +

      void

      +

      label

      +

      void

      +

      std::string label_

      +

      Specifies the format used for the image label. Special format characters may be embedded in the format string to include information about the image.

      +

      std::string

      +

      void

      +

      penColor

      +

      void

      +

      const Color &pen_

      +

      Specifies the pen color to use for the label text (same as fill).

      +

      Color

      +

      void

      +

      pointSize

      +

      void

      +

      size_t pointSize_

      +

      Specifies the thumbnail label font size.

      +

      size_t

      +

      void

      +

      shadow

      +

      void

      +

      bool shadow_

      +

      Enable/disable drop-shadow on thumbnails.

      +

      bool

      +

      void

      +

      stroke

      +

      void

      +

      const Color &pen_

      +

      Specifies the stroke color to use for the label text .

      +

      Color

      +

      void

      +

      texture

      +

      void

      +

      std::string texture_

      +

      Specifies a texture image to use as montage background. The built-in textures "granite:" and "plasma:" are available. A texture is the same as a background image.

      +

      std::string

      +

      void

      +

      tile

      +

      void

      +

      const Geometry &tile_

      +

      Specifies the maximum number of montage columns and rows in the montage. The montage is built by filling out all cells in a row before advancing to the next row. Once the montage has reached the maximum number of columns and rows, a new montage image is started.

      +

      Geometry

      +

      void

      +

      transparentColor

      +

      void

      +

      const Color &transparentColor_

      +

      Specifies a montage color to set transparent. This option can be set the same as the background color in order for the thumbnails to appear without a background when rendered on an HTML page. For best effect, ensure that the transparent color selected does not occur in the rendered thumbnail colors.

      +

      Color

      +

      void

    +

    Framed Montages

    +

    Magick::MontageFramed provides the means to specify montage options when it is desired to have decorative frames around the image thumbnails. MontageFramed inherits from Montage and therefore provides all the methods of Montage as well as those shown in the table "MontageFramed Methods".

    +

    Framed thumbnails consist of four components: the thumbnail image, the thumbnail frame, the thumbnail border, an optional thumbnail shadow, and an optional thumbnail label area.

    +

    +

    +

    MontageFramed Methods

    +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +

      Method

      +

      Return Type

      +

      Signature(s)

      +

      Description

      +

      MontageFramed

      +

      void

      +

      Default constructor (enable frame via frameGeometry).

      +

      borderColor

      +

      void

      +

      const Color &borderColor_

      +

      Specifies the background color within the thumbnail frame.

      +

      Color

      +

      void

      +

      borderWidth

      +

      void

      +

      size_t borderWidth_

      +

      Specifies the border (in pixels) to place between a thumbnail and its surrounding frame. This option only takes effect if thumbnail frames are enabled (via frameGeometry) and the thumbnail geometry specification doesn't also specify the thumbnail border width.

      +

      size_t

      +

      void

      +

      frameGeometry

      +

      void

      +

      const Geometry &frame_

      +

      Specifies the geometry specification for frame to place around thumbnail. If this parameter is not specified, then the montage is unframed.

      +

      Geometry

      +

      void

      +

      matteColor

      +

      void

      +

      const Color &matteColor_

      +

      Specifies the thumbnail frame color.

      +

      Color

      +

      void

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/NEWS.html b/ImageMagick-6.9.12-44/www/Magick++/NEWS.html new file mode 100644 index 0000000..924dede --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/NEWS.html @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/PixelPacket.html b/ImageMagick-6.9.12-44/www/Magick++/PixelPacket.html new file mode 100644 index 0000000..c62a65e --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/PixelPacket.html @@ -0,0 +1,111 @@ + + + + + +Magick++ API: PixelPacket + + + +
    +

    PixelPacket Structure

    +

    The PixelPacket structure is used to represent pixels in ImageMagick. ImageMagick may be compiled to support 32 or 64 bit pixels. The size of PixelPacket is controlled by the value of the QuantumDepth define. The default is 64 bit pixels, which provide the best accuracy. If memory consumption must be minimized, or processing time must be minimized, then ImageMagick may be compiled with QuantumDepth=8. The following table shows the relationship between QuantumDepth, the type of Quantum, and the overall PixelPacket size.

    +
    +

    Effect Of QuantumDepth Values

    +
    + ++++ + + + + + + + + + + +
    +

    QuantumDepth

    +

    Quantum Type

    +

    PixelPacket Size

    +

    8

    +

    unsigned char

    +

    32 bits

    +

    16

    +

    unsigned short

    +

    64 bits

    +

    The members of the PixelPacket structure, and their interpretation, are shown in the following table:

    +
    +

    PixelPacket Structure Members

    +
    + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Member

    +

    Type

    +

    Interpretation

    +

    RGBColorspace

    +

    RGBColorspace + matte

    +

    CMYKColorspace

    +

    red

    +

    Quantum

    +

    Red

    +

    Red

    +

    Cyan

    +

    green

    +

    Quantum

    +

    Green

    +

    Green

    +

    Magenta

    +

    blue

    +

    Quantum

    +

    Blue

    +

    Blue

    +

    Yellow

    +

    opacity

    +

    Quantum

    +

    Ignored

    +

    Opacity

    +

    Ignored

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/Pixels.html b/ImageMagick-6.9.12-44/www/Magick++/Pixels.html new file mode 100644 index 0000000..57fb835 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/Pixels.html @@ -0,0 +1,259 @@ + + + + + +Magick++ API: Working with Pixels + + + +
    +

    Magick::Pixels

    +

    The Pixels class provides efficient access to raw image +pixels. Image pixels (of type PixelPacket) +may be accessed directly via the Image Pixel Cache. The image +pixel cache is a rectangular window (a view) into the actual image +pixels (which may be in memory, memory-mapped from a disk file, or +entirely on disk). Obtain existing image pixels via get(). +Create a new pixel region using set().

    +

    Depending on the capabilities of the operating system, and the +relationship of the window to the image, the pixel cache may be a copy +of the pixels in the selected window, or it may be the actual image +pixels. In any case calling sync() insures that the base image +is updated with the contents of the modified pixel cache. The method decode()supports +copying foreign pixel data formats into the pixel cache according to +the QuantumTypes. The method encode() supports copying +the pixels in the cache to a foreign pixel representation according to +the format specified by QuantumTypes.

    +

    Setting a view using the Pixels class does not cause the number of +references to the underlying image to be reduced to one. Therefore, in +order to ensure that only the current generation of the image is +modified, the Image's modifyImage() +method should be invoked to reduce the reference count on the underlying +image to one. If this is not done, then it is possible for a previous +generation of the image to be modified due to the use of reference +counting when copying or constructing an Image.

    +

    The PixelPacket* returned by the set and get +methods, and the IndexPacket* returned by the indexes +method point to pixel data managed by the Pixels class. The Pixels +class is responsible for releasing resources associated with the pixel +view. This means that the pointer should never be passed to delete() or +free().

    +

    The pixel view is a small image in which +the pixels may be accessed, addressed, and updated, as shown in the +following example, which produces an image similar to the one on the +right (minus lines and text):

    +

    +
    + // Create base image + Image image(Geometry(254,218), "white"); + + + // Set the image type to TrueColor DirectClass representation. + image.type(TrueColorType); + // Ensure that there is only one reference to underlying image + // If this is not done, then image pixels will not be modified. + image.modifyImage(); + + // Allocate pixel view + Pixels view(image); + + // Set all pixels in region anchored at 38x36, with size 160x230 to green. + size_t columns = 196; size_t rows = 162; + Color green("green"); + PixelPacket *pixels = view.get(38,36,columns,rows); + for ( ssize_t row = 0; row < rows ; ++row ) + for ( ssize_t column = 0; column < columns ; ++column ) + *pixels++=green; + + // Save changes to image. + view.sync(); + + // Set all pixels in region anchored at 86x72, with size 108x67 to yellow. + columns = 108; rows = 67; + Color yellow("yellow"); + pixels = view.get(86,72,columns,rows); + for ( ssize_t row = 0; row < rows ; ++row ) + for ( ssize_t column = 0; column < columns ; ++column ) + *pixels++=yellow; + view.sync(); + + // Set pixel at position 108,94 to red + *(view.get(108,94,1,1)) = Color("red"); + + // Save changes to image. + view.sync(); +
    +

    Pixels supports the following +methods:

    +

    Pixel Cache Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Method

    +
    +

    Returns

    +
    +

    Signature

    +
    +

    Description

    +
    +

    get

    +
    +

    PixelPacket*

    +
    +

    const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_

    +
    +

    Transfers read-write pixels from the image to +the pixel cache as defined by the specified rectangular region. + Modified pixels may be subsequently transferred back to the image + via sync. The value returned is intended for pixel access + only. It should never be deallocated.

    +
    +

    getConst

    +
    +

    const PixelPacket*

    +
    +

    const ssize_t x_, const ssize_t y_, const size_t + columns_, const size_t rows_

    +
    +

    Transfers read-only pixels from the image to +the pixel cache as defined by the specified rectangular region.

    +
    +

    set

    +
    +

    PixelPacket*

    +
    +

    const ssize_t x_, const ssize_t y_, const size_t + columns_, const size_t rows_

    +
    +

    Allocates a pixel cache region to store image + pixels as defined by the region rectangle.  This area is + subsequently transferred from the pixel cache to the image via sync. +The value returned is intended for pixel access only. It should +never be deallocated.

    +
    +

    sync

    +
    +

    void

    +
    +

    void

    +
    +

    Transfers the image cache pixels to the image.

    +
    +

    indexes

    +
    +

    IndexPacket*

    +
    +

    void

    +
    +

    Returns the PsuedoColor pixel indexes + corresponding to the pixel region defined by the last get + , getConst, or set + call. Only valid for PseudoColor and CMYKA images. The pixel + indexes (an array of type IndexPacket, which is typedef Quantum, +which is itself typedef unsigned char, or unsigned short, +depending on the value of the QuantumDepth define) provide +the colormap index (see colorMap) for each pixel in the +image. For CMYKA images, the indexes represent the black +channel. The value returned is intended for pixel access only. It +should never be deallocated.

    +
    +

    x

    +
    +

    int

    +
    +

    void

    +
    +

    Left ordinate of view

    +
    +

    y

    +
    +

    int

    +
    +

    void

    +
    +

    Top ordinate of view

    +
    +

    columns

    +
    +

    size_t

    +
    +

    void

    +
    +

    Width of view

    +
    +

    rows

    +
    +

    size_t

    +
    +

    void

    +
    +

    Height of view

    +
    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/README.txt b/ImageMagick-6.9.12-44/www/Magick++/README.txt new file mode 100644 index 0000000..c4cb380 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/README.txt @@ -0,0 +1,5 @@ +This directory contains the Magick++ documentation. + +The file NEWS.html is generated from Magick++ source directory via + txt2html -t 'Magick++ News' < NEWS > ../www/Magick++/NEWS.html +using Seth Golub's fantastic txt2html translator. diff --git a/ImageMagick-6.9.12-44/www/Magick++/STL.html b/ImageMagick-6.9.12-44/www/Magick++/STL.html new file mode 100644 index 0000000..a9a8568 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/STL.html @@ -0,0 +1,1908 @@ + + + + + +Magick++ API: STL Templates + + + +
    +

    Magick++ STL Support

    +Magick++ provides a set of Standard +Template Libary (STL ) +algorithms for operating across ranges of image frames in a container. +It also provides a set of STL unary function objects to apply an +operation on image frames in a container via an algorithm which uses +unary function objects. A good example of a standard algorithm which is +useful for processing containers of image frames is the STL for_each +algorithm which invokes a unary function object on a range of container +elements. +

    Magick++ uses a limited set of template argument types. The current +template argument types are:

    +Container +
    A container having the properties of a Back +Insertion Sequence . Sequences support forward iterators and Back +Insertion Sequences support the additional abilty to append an element +via push_back(). Common compatable container types are the STL < vector > and <list > template +containers. This template argument is usually used to represent an +output container in which one or more image frames may be appended. +Containers like STL <vector +> which have a given default capacity may need to have their +capacity adjusted via reserve() to a larger capacity +in order to support the expected final size . Since Magick++ +images are very small, it is likely that the default capacity of STL < vector > is +sufficient for most situations.
    + InputIterator +
    An input iterator used to express a position in a +container. These template arguments are typically used to represent a +range of elements with first_ representing the first element to +be processed and last_ representing the element to stop at. When +processing the entire contents of a container, it is handy to know that +STL containers usually provide the begin() and end() methods to return +input interators which correspond with the first and last elements, +respectively.
    +

    The following is an example of how frames from a GIF animation "test_image_anim.gif" may be appended horizontally +with the resulting image written to the file appended_image.miff:

    +
    +#include <list> 
    +#include <Magick++.h> 
    +using namespace std; 
    +using namespace Magick;
    +
    +int main(int /*argc*/,char **/*argv*/) 
    +{ 
    +   list<Image> imageList; 
    +   readImages( &imageList, "test_image_anim.gif" );
    +
    +   Image appended; 
    +   appendImages( &appended, imageList.begin(), imageList.end() ); 
    +   appended.write( "appended_image.miff" ); 
    +   return 0; 
    +}
    +
    +

    The available Magick++ specific STL algorithms for operating on +sequences of image frames are shown in the following table:
    +  +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Magick++ STL Algorithms For Image Sequences
      +
      Algorithm
      +
      +
      Signature
      +
      +
      Description
      +
      +
      animateImages
      +
      InputIterator +first_, InputIterator +last_Animate a sequence of image frames. Image +frames are displayed in succession, creating an animated effect. The +animation options are taken from the first image frame. This feature is +only supported under X11 at the moment.
      +
      appendImages
      +
      Image +*appendedImage_, InputIterator +first_, InputIterator +last_, bool stack_ = falseAppend a sequence of image frames, writing +the result to appendedImage_. All the input image frames must +have the same width or height. Image frames of the same width are +stacked top-to-bottom. Image frames of the same height are stacked +left-to-right. If the stack_ parameter is false, rectangular +image frames are stacked left-to-right otherwise top-to-bottom.
      +
      averageImages
      +
      Image +*averagedImage_, InputIterator +first_, InputIterator +last_Average a sequence of image frames, writing +the result to averagedImage_. All the input image frames must +be the same size in pixels.
      +
      coalesceImages
      +
      Container +*coalescedImages_, InputIterator +first_, InputIterator +last_
      +
      Create a coalesced image sequence obtained by +"playing" the image sequence (observing page offsets and disposal +methods) to create a new image sequence in which all frames are full +size and completely rendered. Note that if the original image sequence +relied on page offsets and disposal methods that the resulting sequence +will be larger (perhaps much larger) then the original. This is useful +for GIF animation sequences that have page offsets and disposal methods. +The resuting image sequence is returned via coalescedImages_.
      +
      deconstructImages
      +
      Container +*deconstructedImages_, InputIterator +first_, InputIterator +last_Break down an image sequence into constituent +parts.  This is useful for creating GIF or MNG animation sequences. +The input sequence is specified by first_ and last_, and +the deconstructed images are returned via deconstructedImages_.
      +
      displayImages
      +
      InputIterator +first_, InputIterator +last_Display a sequence of image frames. Through +use of a pop-up menu, image frames may be selected in succession. This +feature is fully supported under X11 but may have only limited support +in other environments.
      + Caution: if +an image format is not compatable with the display visual (e.g. JPEG +on a colormapped display) then the original image will be altered. Use a +copy of the original if this is a problem.
      +
      flattenImages
      +
      Image +*flattendImage_, InputIterator +first_, InputIterator +last_Merge a sequence of image frames which +represent image layers into a single composited representation. The flattendImage_ +parameter points to an existing Image to update with the flattened +image. This function is useful for combining Photoshop layers into a +single image.
      +
      forwardFourierTransformImage
      +
      Container +*fourierImages_, const Image &image_ Implements the discrete Fourier transform (DFT) of the image as a magnitude / phase image pair via fourierImages_.
      +
      forwardFourierTransformImage
      +
      Container +*fourierImages_, const Image &image_, const bool magnitude_ Implements the discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair via fourierImages_.
      +
      mapImages
      +
      InputIterator +first_, InputIterator +last_, const Image & mapImage_, bool +dither_,  bool measureError_ = falseReplace the colors of a sequence of images +with the closest color from a reference image. Set dither_ to true +to enable dithering.  Set measureError_ to true in +order to evaluate quantization error.
      +
      montageImages
      +
      Container +*montageImages_, InputIterator +first_, InputIterator +last_, const Montage &montageOpts_Create a composite image by combining several +separate image frames. Multiple frames may be generated in the output +container montageImages_ depending on the tile setting and the +number of image frames montaged. Montage options are provided via the +parameter montageOpts_ . Options set in the first image frame ( backgroundColor, borderColor , matteColor , penColor, font, +and fontPointsize ) are also used +as options by montageImages().
      +
      morphImages
      +
      Container +*morphedImages_, InputIterator +first_, InputIterator +last_, size_t frames_Morph a seqence of image frames. This +algorithm  expands the number of image frames (output to the +container morphedImages_) by adding the number of intervening +frames specified by frames_ such that the original frames morph +(blend) into each other when played as an animation.
      +
      mosaicImages
      +
      Image *mosaicImage_, InputIterator +first_, InputIterator +last_Inlay a number of images to form a single +coherent picture. The mosicImage_ argument is updated with a +mosaic constructed from the image sequence represented by first_ +through last_ .
      quantizeImages
      InputIterator +first_, InputIterator +last_, bool measureError_ = falseQuantize colors in images using current +quantization settings. Set measureError_ to true in order +to measure quantization error.
      +
      readImages
      +
      Container +*sequence_, const std::string &imageSpec_Read a sequence of image frames into existing +container (appending to container sequence_) with image names +specified in the UTF-8 string imageSpec_.
      Container +*sequence_, const Blob &blob_Read a sequence of image frames into existing +container (appending to container sequence_) from Blob +blob_.
      +
      writeImages
      +
      InputIterator +first_, InputIterator +last_, const std::string &imageSpec_, bool adjoin_ = trueWrite images in container to file specified +by string imageSpec_. Set adjoin_ to false to write a +set of image frames via a wildcard imageSpec_ (e.g. +image%02d.miff).
      +The wildcard must be one of %0Nd, %0No, or %0Nx.
      + Caution: if +an image format is selected which is capable of supporting fewer colors +than the original image or quantization has been requested, the original +image will be quantized to fewer colors. Use a copy of the original if +this is a problem.
      InputIterator +first_, InputIterator +last_, Blob *blob_, bool adjoin_ = trueWrite images in container to in-memory BLOB +specified by Blob blob_. Set adjoin_ to false to +write a set of image frames via a wildcard imageSpec_ (e.g. +image%02d.miff).
      + Caution: if an +image format is selected which is capable of supporting fewer colors +than the original image or quantization has been requested, the original +image will be quantized to fewer colors. Use a copy of the original if +this is a problem.
    +

    In addition, we support these yet to be documented methods: combineImages(), evaluateImages(), mergeImageLayers(), optimizeImageLayers(), optimizePlusImageLayers(), and separateImages().

    +

    +
    +

    Magick++ Unary Function Objects

    +
    +Magick++ unary function objects inherit from the STL unary_function +template class . The STL unary_function template class is of the form +
    unary_function<Arg, Result>
    +and expects that derived classes implement a method of the form: +
    Result operator()( Arg argument_);
    +which is invoked by algorithms using the function object. In the case +of unary function objects defined by Magick++, the invoked function +looks like: +
    void operator()( Image &image_);
    +with a typical implementation looking similar to: +
    void operator()( Image &image_ ) 
    +   {
    +     image_.contrast( +_sharpen );
    +   }
    +where contrast is an Image method and _sharpen is an +argument stored within the function object by its contructor. Since +constructors may be polymorphic, a given function object may have +several constructors and selects the appropriate Image method based on +the arguments supplied. +

    In essence, unary function objects (as provided by Magick++) simply +provide the means to construct an object which caches arguments for +later use by an algorithm designed for use with unary function objects. +There is a unary function object corresponding each algorithm provided +by the Image class and there is a contructor +available compatable with each synonymous method in the Image class.

    +

    The unary function objects that Magick++ provides to support +manipulating images are shown in the following table:
    +  +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Magick++ Unary Function Objects For Image Manipulation
      Function ObjectConstructor Signatures(s)Description
      +
      adaptiveThresholdImage
      +
      +
      size_t width, size_t +height, unsigned offset = 0
      +
      Apply adaptive thresholding to +the image. Adaptive thresholding is useful if the ideal threshold level +is not known in advance, or if the illumination gradient is not constant +across the image. Adaptive thresholding works by evaulating the mean +(average) of a pixel region (size specified by width and height) +and using the mean as the thresholding value. In order to remove +residual noise from the background, the threshold may be adjusted by +subtracting a constant offset (default zero) from the mean to +compute the threshold.
      +
      +
      addNoiseImage
      +
      NoiseType +noiseType_Add noise to image with specified noise type.
      affineTransformImage
      +
      const DrawableAffine +&affine_
      +
      Transform image by +specified affine (or free transform) matrix.
      +
      +
      annotateImage
      +
      const std::string &text_, const Geometry &location_Annotate with text using specified text, +bounding area, placement gravity, and rotation. If boundingArea_ +is invalid, then bounding area is entire image.
      std::string text_, const Geometry &boundingArea_, GravityType gravity_Annotate using specified text, bounding area, +and placement gravity. If boundingArea_ is invalid, then +bounding area is entire image.
      const std::string &text_, const Geometry &boundingArea_, GravityType gravity_, double +degrees_, Annotate with text using specified text, +bounding area, placement gravity, and rotation. If boundingArea_ +is invalid, then bounding area is entire image.
      const std::string &text_, GravityType gravity_Annotate with text (bounding area is entire +image) and placement gravity.
      +
      blurImage
      +
      const double radius_ = 1, const double sigma_ += 0.5Blur image. The radius_ parameter specifies +the radius of the Gaussian, in pixels, not counting the center +pixel.  The sigma_ parameter specifies the standard deviation of +the Laplacian, in pixels.
      +
      borderImage
      +
      const Geometry +&geometry_ = "6x6+0+0"Border image (add border to image).  The +color of the border is specified by the borderColor attribute.
      +
      charcoalImage
      +
      const double radius_ = 1, const double sigma_ += 0.5Charcoal effect image (looks like charcoal +sketch). The radius_ parameter specifies the radius of the Gaussian, in +pixels, not counting the center pixel.  The sigma_ parameter +specifies the standard deviation of the Laplacian, in pixels.
      +
      chopImage
      +
      const Geometry +&geometry_Chop image (remove vertical or horizontal +subregion of image)
      +
      colorizeImage
      +
      const size_t opacityRed_, const +size_t opacityGreen_, const size_t opacityBlue_, const Color +&penColor_Colorize image with pen color, using +specified percent opacity for red, green, and blue quantums.
      const size_t opacity_, const Color &penColor_Colorize image with pen color, using +specified percent opacity.
      +
      commentImage
      +
      const std::string &comment_Comment image (add comment string to +image).  By default, each image is commented with its file name. +Use  this  method to  assign a specific comment to the +image.  Optionally you can include the image filename, type, width, +height, or other  image  attributes by embedding special format characters.
      +
      compositeImage
      +
      const Image +&compositeImage_, ssize_t xOffset_, ssize_t yOffset_, CompositeOperator +compose_ = InCompositeOpCompose an image onto another at +specified offset and using specified algorithm
      const Image +&compositeImage_, const Geometry &offset_, CompositeOperator +compose_ = InCompositeOp
      +
      condenseImage
      +
      voidCondense image (Re-run-length encode image in +memory).
      +
      contrastImage
      +
      size_t sharpen_Contrast image (enhance intensity differences +in image)
      +
      cropImage
      +
      const Geometry +&geometry_Crop image (subregion of original image)
      +
      cycleColormap-
      + Image
      +
      int amount_Cycle image colormap
      +
      despeckleImage
      +
      voidDespeckle image (reduce speckle noise)
      +
      drawImage
      +
      const Drawable +&drawable_Draw shape or text on image.
      const std::list<Drawable +> &drawable_Draw shapes or text on image using a set of +Drawable objects contained in an STL list. Use of this method improves +drawing performance and allows batching draw objects together in a list +for repeated use.
      +
      edgeImage
      +
      size_t radius_ = 0.0Edge image (hilight edges in image).  +The radius is the radius of the pixel neighborhood.. Specify a radius +of zero for automatic radius selection.
      +
      embossImage
      +
      const double radius_ = 1, const double sigma_ += 0.5Emboss image (hilight edges with 3D effect). +The radius_ parameter specifies the radius of the Gaussian, in pixels, +not counting the center pixel.  The sigma_ parameter specifies the +standard deviation of the Laplacian, in pixels.
      +
      enhanceImage
      +
      voidEnhance image (minimize noise)
      +
      equalizeImage
      +
      voidEqualize image (histogram equalization)
      +
      flipImage
      +
      voidFlip image (reflect each scanline in the +vertical direction)
      +
      floodFill-
      + ColorImage
      +
      ssize_t x_, ssize_t y_, const Color &fillColor_Flood-fill color across pixels +that match the color of the target pixel and are neighbors of the +target pixel. Uses current fuzz setting when determining color match.
      const Geometry +&point_, const Color &fillColor_
      ssize_t x_, ssize_t y_, const Color &fillColor_, const Color +&borderColor_Flood-fill color across pixels +starting at target-pixel and stopping at pixels matching specified +border color. Uses current fuzz setting when determining color match.
      const Geometry +&point_, const Color &fillColor_, const Color &borderColor_
      +
      floodFill-
      + TextureImage
      +
      ssize_t x_, ssize_t y_,  const Image &texture_Flood-fill texture across pixels +that match the color of the target pixel and are neighbors of the +target pixel. Uses current fuzz setting when determining color match.
      const Geometry +&point_, const Image &texture_
      ssize_t x_, ssize_t y_, const Image +&texture_, const Color &borderColor_Flood-fill texture across pixels +starting at target-pixel and stopping at pixels matching specified +border color. Uses current fuzz setting when determining color match.
      const Geometry +&point_, const Image &texture_, const Color +&borderColor_
      +
      flopImage
      +
      void Flop image (reflect each scanline in the +horizontal direction)
      +
      frameImage
      +
      const Geometry +&geometry_ = "25x25+6+6"Add decorative frame around image
      size_t width_, size_t height_, +ssize_t x_, ssize_t y_, ssize_t innerBevel_ = 0, ssize_t outerBevel_ = 0
      +
      gammaImage
      +
      double gamma_Gamma correct image (uniform red, green, and +blue correction).
      double gammaRed_, double gammaGreen_, double +gammaBlue_Gamma correct red, green, and blue channels +of image.
      +
      gaussianBlurImage
      +
      double width_, double sigma_Gaussian blur image. The number of neighbor +pixels to be included in the convolution mask is specified by +'width_'.  For example, a width of one gives a (standard) 3x3 +convolution mask. The standard deviation of the gaussian bell curve is +specified by 'sigma_'.
      +
      implodeImage
      +
      double factor_Implode image (special effect)
      +
      inverseFourierTransformImage
      +
      const Image +&phaseImage_, const bool magnitude_implements the inverse discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.
      +
      labelImage
      +
      const string &label_Assign a label to an image. Use this option +to  assign  a  specific label to the image. Optionally +you can include the image filename, type, width, height, or scene +number in the label by embedding  special +format characters. If the first character of string is @, the image +label is read from a file titled by the remaining characters in the +string. When converting to Postscript, use this  option to specify +a header string to print above the image.
      levelImage
      +
      const double black_point, +const double white_point, const double mid_point=1.0
      +
      Level image. Adjust the +levels of the image by scaling the colors falling between specified +white and black points to the full available quantum range. The +parameters provided represent the black, mid (gamma), and white +points.  The black point specifies the darkest color in the image. +Colors darker than the black point are set to zero. Mid point (gamma) +specifies a gamma correction to apply to the image. White point +specifies the lightest color in the image.  Colors brighter than +the white point are set to the maximum quantum value. The black and +white point have the valid range 0 to QuantumRange while mid (gamma) has a +useful range of 0 to ten.
      levelChannelImage
      +
      const Magick::ChannelType +channel, const double black_point, const double white_point, const +double mid_point=1.0
      +
      Level image channel. +Adjust the levels of the image channel by scaling the values falling +between specified white and black points to the full available quantum +range. The parameters provided represent the black, mid (gamma), and +white points. The black point specifies the darkest color in the image. +Colors darker than the black point are set to zero. Mid point (gamma) +specifies a gamma correction to apply to the image. White point +specifies the lightest color in the image. Colors brighter than the +white point are set to the maximum quantum value. The black and white +point have the valid range 0 to QuantumRange while mid (gamma) has a useful +range of 0 to ten.
      +
      layerImage
      +
      ChannelType +layer_Extract layer from image. Use this option to +extract a particular layer from  the image.  MatteLayer,  +for  example, is useful for extracting the opacity values from an +image.
      +
      magnifyImage
      +
      voidMagnify image by integral size
      +
      mapImage
      +
      const Image +&mapImage_ , bool dither_ = falseRemap image colors with closest color from +reference image. Set dither_ to true in to apply Floyd/Steinberg +error diffusion to the image. By default, color reduction chooses an +optimal  set  of colors that best represent the original +image. Alternatively, you can  choose  a  +particular  set  of colors  from  an image file +with this option.
      +
      matteFloodfill-
      + Image
      +
      const Color +&target_, unsigned int matte_, ssize_t x_, ssize_t y_, PaintMethod method_Floodfill designated area with a matte value
      medianFilterImageconst double radius_ = 0.0Filter image by replacing each pixel +component with the median color in a circular neighborhood
      +
      minifyImage
      +
      voidReduce image by integral size
      +
      modulateImage
      +
      double brightness_, double saturation_, +double hue_Modulate percent hue, saturation, and +brightness of an image. Modulation of +saturation and brightness is as a ratio of the current value (1.0 for no +change). Modulation of hue is an absolute rotation of -180 degrees to ++180 degrees from the current position corresponding to an argument +range of 0 to 2.0 (1.0 for no change).
      +
      negateImage
      +
      bool grayscale_ = falseNegate colors in image.  Replace every +pixel with its complementary color (white becomes black, yellow becomes +blue, etc.).  Set grayscale to only negate grayscale values in +image.
      +
      normalizeImage
      +
      voidNormalize image (increase contrast by +normalizing the pixel values to span the full range of color values).
      +
      oilPaintImage
      +
      size_t radius_ = 3Oilpaint image (image looks like oil painting)
      +
      opacityImage
      +
      size_t opacity_Set or attenuate the opacity channel in the +image. If the image pixels are opaque then they are set to the specified +opacity value, otherwise they are blended with the supplied opacity +value.  The value of opacity_ ranges from 0 (completely opaque) to QuantumRange. +The defines OpaqueOpacity and TransparentOpacity are +available to specify completely opaque or completely transparent, +respectively.
      +
      opaqueImage
      +
      const Color +&opaqueColor_, const Color &penColor_Change color of pixels matching opaqueColor_ +to specified penColor_.
      +
      quantizeImage
      +
      bool measureError_ = falseQuantize image (reduce number of colors). Set +measureError_ to true in order to calculate error attributes.
      +
      raiseImage
      +
      const Geometry +&geometry_ = "6x6+0+0",  bool raisedFlag_ =  falseRaise image (lighten or darken the edges of +an image to give a 3-D raised or lowered effect)
      +
      reduceNoise-
      + Image
      +
      voidReduce noise in image using a +noise peak elimination filter.
      size_t order_
      +
      rollImage
      +
      int columns_, ssize_t rows_Roll image (rolls image vertically and +horizontally) by specified number of columnms and rows)
      +
      rotateImage
      +
      double degrees_Rotate image counter-clockwise by specified +number of degrees
      +
      sampleImage
      +
      const Geometry +&geometry_ Resize image by using pixel sampling algorithm
      +
      scaleImage
      +
      const Geometry +&geometry_Resize image by using simple ratio algorithm
      +
      segmentImage
      +
      double clusterThreshold_ = 1.0,
      + double smoothingThreshold_ = 1.5
      Segment (coalesce similar image components) +by analyzing the histograms of the color components and identifying +units that are homogeneous with the fuzzy c-means technique. Also uses quantizeColorSpace +and verbose image attributes. Specify clusterThreshold_ , +as the number  of  pixels  each cluster  must exceed +the cluster threshold to be considered valid. SmoothingThreshold_ +eliminates noise in the  second derivative of the histogram. As the +value is  increased, you can  expect  a  smoother +second derivative.  The default is 1.5.
      +
      shadeImage
      +
      double azimuth_ = 30, double elevation_ = 30,
      + bool colorShading_ = false
      Shade image using distant light source. +Specify azimuth_ and elevation_ as the  +position  of  the light source. By default, the shading +results as a grayscale image.. Set colorShading_ to true to +shade the red, green, and blue components of the image.
      +
      sharpenImage
      +
      const double radius_ = 1, const double sigma_ += 0.5Sharpen pixels in image. The radius_ +parameter specifies the radius of the Gaussian, in pixels, not counting +the center pixel.  The sigma_ parameter specifies the standard +deviation of the Laplacian, in pixels.
      +
      shaveImage
      +
      const Geometry +&geometry_Shave pixels from image edges.
      +
      shearImage
      +
      double xShearAngle_, double yShearAngle_Shear image (create parallelogram by sliding +image by X or Y axis).  Shearing slides one edge of an image along +the X  or  Y axis,  creating  a +parallelogram.  An X direction shear slides an edge along the X +axis, while  a  Y  direction shear  slides  an +edge along the Y axis.  The amount of the shear is controlled by a +shear angle.  For X direction  shears,  x  degrees +is measured relative to the Y axis, and similarly, for Y direction +shears  y  degrees is measured relative to the X axis. Empty +triangles left over from shearing the  image  are filled  +with  the  color  defined as borderColor
      +
      solarizeImage
      +
      double factor_Solarize image (similar to effect seen when +exposing a photographic film to light during the development process)
      +
      spreadImage
      +
      size_t amount_ = 3Spread pixels randomly within image by +specified amount
      +
      steganoImage
      +
      const Image +&watermark_Add a digital watermark to the image (based +on second image)
      +
      stereoImage
      +
      const Image +&rightImage_Create an image which appears in stereo when +viewed with red-blue glasses (Red image on left, blue on right)
      +
      swirlImage
      +
      double degrees_Swirl image (image pixels are rotated by +degrees)
      +
      textureImage
      +
      const Image +&texture_Layer a texture on image background
      +
      thresholdImage
      +
      double threshold_Threshold image
      +
      transformImage
      +
      const Geometry +&imageGeometry_Transform image based on image +and crop geometries. Crop geometry is optional.
      const Geometry +&imageGeometry_, const Geometry +&cropGeometry_ 
      +
      transparentImage
      +
      const Color +&color_Add matte image to image, setting pixels +matching color to transparent.
      +
      trimImage
      +
      voidTrim edges that are the background color from +the image.
      +
      waveImage
      +
      double amplitude_ = 25.0, double wavelength_ += 150.0Alter an image along a sine wave.
      +
      zoomImage
      +
      const Geometry +&geometry_Zoom image to specified size.
    +

    +

    Function objects are available to set attributes on image frames +which are equivalent to methods in the Image object. These function +objects allow setting an option across a range of image frames using f +or_each().

    +

    The following code is an example of how the color 'red' may be set +to transparent in a GIF animation:

    +
    +list<image> images; 
    +readImages( &images, "animation.gif" ); 
    +for_each ( images.begin(), images.end(), transparentImage( "red" )  ); 
    +writeImages( images.begin(), images.end(), "animation.gif" );
    +
    +

    The available function objects for setting image attributes are
    +  +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Image Attributes
      +
      Attribute
      +
      +
      Type
      +
      +
      Constructor Signature(s)
      +
      +
      Description
      +
      +
      adjoinImage
      +
      boolbool flag_Join images into a single multi-image file.
      +
      antiAliasImage
      +
      boolbool flag_Control antialiasing of rendered Postscript +and Postscript or TrueType fonts. Enabled by default.
      +
      animation-
      + DelayImage
      +
      size_t (0 to 65535)size_t delay_Time in 1/100ths of a second (0 to 65535) +which must expire before displaying the next image in an animated +sequence. This option is useful for regulating the animation of a +sequence  of GIF images within Netscape.
      +
      animation-
      + IterationsImage
      +
      size_tsize_t iterations_Number of iterations to loop an animation +(e.g. Netscape loop extension) for.
      +
      background-
      + ColorImage
      +
      Color const Color +&color_Image background color
      +
      background-
      + TextureImage
      +
      std::stringconst string &texture_Image to use as background texture.
      +
      borderColor-
      + Image
      +
      Color  const Color +&color_Image border color
      +
      boxColorImage
      +
      Color const Color +&boxColor_Base color that annotation text is rendered +on.
      +
      chroma-
      + BluePrimaryImage
      +
      double x & ydouble x_, double y_Chromaticity blue primary point (e.g. x=0.15, +y=0.06)
      +
      chroma-
      + GreenPrimaryImage
      +
      double x & ydouble x_, double y_Chromaticity green primary point (e.g. x=0.3, +y=0.6)
      +
      chroma-
      + RedPrimaryImage
      +
      double x & ydouble x_, double y_Chromaticity red primary point (e.g. x=0.64, +y=0.33)
      +
      chroma-
      + WhitePointImage
      +
      double x & ydouble x_, double y_Chromaticity white point (e.g. x=0.3127, +y=0.329)
      +
      colorFuzzImage
      +
      doubledouble fuzz_Colors within this distance are considered +equal. A number of algorithms search for a target  color. By +default the color must be exact. Use this option to match colors that +are close to the target color in RGB space.
      +
      colorMapImage
      +
      Color size_t index_, const Color &color_Color at color-pallet index.
      colorSpaceImageColorspaceType ColorspaceType +colorSpace_The colorspace (e.g. CMYK) used to represent +the image pixel colors. Image pixels are always stored as RGB(A) except +for the case of CMY(K).
      +
      composeImage
      +
      CompositeOperator CompositeOperator +compose_Composition operator to be used when +composition is implicitly used (such as for image flattening).
      +
      compressType-
      + Image
      +
      CompressionType CompressionType +compressType_Image compresion type. The default is the +compression type of the specified image file.
      +
      densityImage
      +
      Geometry   +(default 72x72)const Geometry +&density_Vertical and horizontal resolution in pixels +of the image. This option specifies an image density when decoding a +Postscript or Portable Document page. Often used with psPageSize.
      +
      depthImage
      +
      size_t (8 or 16)size_t depth_Image depth. Used to specify the bit depth +when reading or writing  raw images or thwn the output format +supports multiple depths. Defaults to the quantum depth that +ImageMagick is compiled with.
      +
      endianImage
      +
      EndianType EndianType +endian_Specify (or obtain) endian option for formats +which support it.
      +
      fileNameImage
      +
      std::stringconst std::string &fileName_Image file name.
      +
      fillColorImage
      +
      Colorconst Color &fillColor_Color to use when filling drawn objects
      +
      filterTypeImage
      +
      FilterTypes FilterTypes +filterType_Filter to use when resizing image. The +reduction filter employed has a sigificant effect on the time required +to resize an image and the resulting quality. The default filter is Lanczos +which has been shown to produce good results when reducing images.
      +
      fontImage
      +
      std::stringconst std::string &font_Text rendering font. If the font is a fully +qualified X server font name, the font is obtained from an X  +server. To use a TrueType font, precede the TrueType filename with an @. +Otherwise, specify  a  Postscript font name (e.g. +"helvetica").
      +
      fontPointsize-
      + Image
      +
      size_tsize_t pointSize_Text rendering font point size
      +
      gifDispose-
      + MethodImage
      +
      size_t
      + { 0 = Disposal not specified,
      + 1 = Do not dispose of graphic,
      + 3 = Overwrite graphic with background color,
      + 4 = Overwrite graphic with previous graphic. }
      size_t disposeMethod_layer disposal method. This option is used to +control how successive frames are rendered (how the preceding frame is +disposed of) when creating a GIF animation.
      +
      interlace-
      + TypeImage
      +
      InterlaceType InterlaceType +interlace_The type of interlacing scheme (default NoInterlace +). This option is used to specify the type of  interlacing +scheme  for  raw  image formats such as RGB or YUV. NoInterlace +means do not  interlace, LineInterlace uses scanline +interlacing, and PlaneInterlace uses plane interlacing. +PartitionInterlace is like PlaneInterlace except the  +different planes  are saved  to individual files (e.g.  +image.R, image.G, and image.B). Use LineInterlace or PlaneInterlace +to create an interlaced GIF or progressive JPEG image.
      +
      isValidImage
      +
      boolbool isValid_Set image validity. Valid images become empty +(inValid) if argument is false.
      +
      labelImage
      +
      std::stringconst std::string &label_Image label
      +
      lineWidthImage
      +
      doubledouble lineWidth_Line width for drawing lines, circles, +ellipses, etc. See Drawable .
      +
      magickImage
      +
      std::string const std::string &magick_Get image format (e.g. "GIF")
      +
      matteImage
      +
      boolbool matteFlag_True if the image has transparency. If set +True, store matte channel if  the image has one otherwise create +an opaque one.
      +
      matteColorImage
      +
      Color const Color +&matteColor_Image matte (frame) color
      +
      monochrome-
      + Image
      +
      boolbool flag_Transform the image to black and white
      +
      pageImage
      +
      Geometry const Geometry &pageSize_Preferred size and location of an image +canvas. +

      Use this option to specify the dimensions and +position of the Postscript page in dots per inch or a TEXT page in +pixels. This option is typically used in concert with density .

      +

      Page may also be used to position a GIF image +(such as for a scene in an animation)

      +
      +
      penColorImage
      +
      Color const Color +&penColor_Pen color to use when annotating on or +drawing on image.
      +
      penTextureImage
      +
      Image const Image & penTexture_Texture image to paint with (similar to +penColor).
      +
      pixelColorImage
      +
      Color size_t x_, size_t y_, const Color &color_Get/set pixel color at location x & y.
      +
      psPageSizeImage
      +
      Geometry const Geometry &pageSize_Postscript page size. Use this  option +to specify the dimensions  of the Postscript page in dots per inch +or a TEXT page in pixels. This option is typically used in concert with density.
      +
      qualityImage
      +
      size_t (0 to 100)size_t quality_JPEG/MIFF/PNG compression level (default 75).
      +
      quantize-
      + ColorsImage
      +
      size_tsize_t colors_Preferred number of colors in the image. The +actual number of colors in the image may be less than your request, but +never more. Images with less unique colors than specified with this +option will have any duplicate or unused colors removed.
      +
      quantize-
      + ColorSpaceImage
      +
      ColorspaceType ColorspaceType +colorSpace_Colorspace to quantize colors in (default +RGB). Empirical evidence suggests that distances in color spaces such +as YUV or YIQ correspond to perceptual color differences more closely +than do distances in RGB space. These color spaces may give better +results when color reducing an image.
      +
      quantize-
      + DitherImage
      +
      boolbool flag_Apply Floyd/Steinberg error diffusion to the +image. The basic strategy of dithering is to  trade  intensity +resolution  for  spatial  resolution  by  +averaging the intensities  of  several  +neighboring  pixels. Images which  suffer  from  +severe  contouring  when  reducing colors can be improved +with this option. The quantizeColors or monochrome option must be set +for this option to take effect.
      +
      quantize-
      + TreeDepthImage
      +
      size_t (0 to 8)size_t treeDepth_Depth of the quantization color +classification tree. Values of 0 or 1 allow selection of the optimal +tree depth for the color reduction algorithm. Values between 2 and 8 may +be used to manually adjust the tree depth.
      +
      rendering-
      + IntentImage
      +
      RenderingIntent RenderingIntent +render_The type of rendering intent
      +
      resolution-
      + UnitsImage
      +
      ResolutionType ResolutionType +units_Units of image resolution
      +
      sceneImage
      +
      size_tsize_t scene_Image scene number
      +
      sizeImage
      +
      Geometry const Geometry +&geometry_Width and height of a raw image (an image +which does not support width and height information).  Size may +also be used to affect the image size read from a multi-resolution +format (e.g. Photo CD, JBIG, or JPEG.
      +
      stripImage
      +
      voidstrips an image of all profiles and comments.
      +
      strokeColorImage
      +
      Color const Color +&strokeColor_Color to use when drawing object outlines
      +
      subImageImage
      +
      size_tsize_t subImage_Subimage of an image sequence
      +
      subRangeImage
      +
      size_tsize_t subRange_Number of images relative to the base image
      +
      tileNameImage
      +
      std::stringconst std::string &tileName_Tile name
      +
      typeImage
      +
      ImageType ImageType +type_Image storage type.
      +
      verboseImage
      +
      boolbool verboseFlag_Print detailed information about the image
      +
      viewImage
      +
      std::stringconst std::string &view_FlashPix viewing parameters.
      +
      x11DisplayImage
      +
      std::string (e.g. "hostname:0.0")const std::string &display_X11 display to display to, obtain fonts from, +or to capture image from
    +

    +
    +

    Query Image Format Support

    +
    +

    Magick++ provides the  coderInfoList() +function to support obtaining information about the image formats +supported by ImageMagick. Support for image formats in ImageMagick +is provided by modules known as "coders". A user-provided container is +updated based on a boolean truth-table match. The truth-table supports +matching based on whether ImageMagick can read the format, write the +format, or supports multiple frames for the format. A wildcard specifier +is supported for any "don't care" field. The data obtained via +coderInfoList() may be useful for preparing GUI dialog boxes or for +deciding which output format to write based on support within the +ImageMagick build.

    +

    The definition of coderInfoList is:

    +
    +class CoderInfo 
    +  { 
    +  public:
    +
    +    enum MatchType { 
    +      AnyMatch,  // match any coder 
    +      TrueMatch, // match coder if true 
    +      FalseMatch // match coder if false 
    +    };
    +
    +    [ remaining CoderInfo methods ]
    +
    +   }
    +
    +  template <class Container > 
    +  void coderInfoList( Container *container_, 
    +                      CoderInfo::MatchType isReadable_   = CoderInfo::AnyMatch, 
    +                      CoderInfo::MatchType isWritable_   = CoderInfo::AnyMatch, 
    +                      CoderInfo::MatchType isMultiFrame_ = CoderInfo::AnyMatch 
    +                      );
    +
    +

    The following example shows how to retrieve a list of all of the +coders which support reading images and print the coder attributes (all +listed formats will be readable):

    +
    +  list<CoderInfo> coderList; 
    +  coderInfoList( &coderList,           // Reference to output list 
    +                 CoderInfo::TrueMatch, // Match readable formats 
    +                 CoderInfo::AnyMatch,  // Don't care about writable formats 
    +                 CoderInfo::AnyMatch); // Don't care about multi-frame support 
    +  list<CoderInfo>::iterator entry = coderList.begin(); 
    +  while( entry != coderList.end() ) 
    +  { 
    +    cout << entry->name() << ": (" << entry->description() << ") : "; 
    +    cout << "Readable = "; 
    +    if ( entry->isReadable() ) 
    +      cout << "true"; 
    +    else 
    +      cout << "false"; 
    +    cout << ", "; 
    +    cout << "Writable = "; 
    +    if ( entry->isWritable() ) 
    +      cout << "true"; 
    +    else 
    +      cout << "false"; 
    +    cout << ", "; 
    +    cout << "Multiframe = "; 
    +    if ( entry->isMultiframe() ) 
    +      cout << "true"; 
    +    else 
    +      cout << "false"; 
    +    cout << endl;
    +    entry ++;
    +   } 
    +
    +   }  +

    Obtaining A Color Histogram 

    +

    Magick++ provides the colorHistogram template function to +retrieve a color histogram from an image. A color histogram provides a +count of how many times each color occurs in the image. The histogram is +written into a user-provided container, which (for example) could be a <vector> or a <map>.  When a +<map> is used, the Color +is used as the key so that quick lookups of usage counts for colors may +be performed. Writing into a <map> +may be slower than writing into a <vector> +since the <map> sorts the +entries (by color intensity) and checks for uniqueness. Each histogram +entry is contained in type std::pair<Magick::Color,unsigned +long> with the first +member of the pair being a Color, +and the second member of the pair being an 'unsigned long'. Use the <pair> "first" member to access the Color +and the "second" member to +access the number of times the color occurs in the image.

    +

    The template function declaration is as follows:
    +

    +
    +template <class Container >
    +void colorHistogram( Container *histogram_, const Image image)
    +
    +

    The following examples illustrate using both a <map> and a +<vector> to retrieve the color histogram, and print out a +formatted summary.
    +
    +Using <map>:
    +   
    +

    +  Image image("image.miff");
    +  map<Color,unsigned long> histogram;
    +  colorHistogram( &histogram, image );
    +  std::map<Color,unsigned long>::const_iterator p=histogram.begin();
    +  while (p != histogram.end())
    +    {
    +      cout << setw(10) << (int)p->second << ": ("
    +           << setw(quantum_width) << (int)p->first.redQuantum() << ","
    +           << setw(quantum_width) << (int)p->first.greenQuantum() << ","
    +           << setw(quantum_width) << (int)p->first.blueQuantum() << ")"
    +           << endl;
    +       p++;
    +    }
    +
    +
    +Using <vector>:
    +   
    +
    +  Image image("image.miff");
    +  std::vector<std::pair<Color,unsigned long> > histogram;
    +  colorHistogram( &histogram, image );
    +  std::vector<std::pair<Color,unsigned long> >::const_iterator p=histogram.begin();
    +  while (p != histogram.end())
    +    {
    +      cout << setw(10) << (int)p->second << ": ("
    +           << setw(quantum_width) << (int)p->first.redQuantum() << ","
    +           << setw(quantum_width) << (int)p->first.greenQuantum() << ","
    +           << setw(quantum_width) << (int)p->first.blueQuantum() << ")"
    +           << endl;
    +      p++;
    +    }
    +
    +

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/TypeMetric.html b/ImageMagick-6.9.12-44/www/Magick++/TypeMetric.html new file mode 100644 index 0000000..e72a34f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/TypeMetric.html @@ -0,0 +1,91 @@ + + + + + +Magick++ API: Type Metrics + + + +
    +

    Magick::TypeMetric

    +

    The TypeMetric class provides the means to pass data from the Image class's TypeMetric method to the user. It provides information regarding font metrics such as ascent, descent, text width, text height, and maximum horizontal advance. The units of these font metrics are in pixels, and that the metrics are dependent on the current Image font (default Ghostscript's "Helvetica"), pointsize (default 12 points), and x/y resolution (default 72 DPI) settings.

    +

    The pixel units may be converted to points (the standard resolution-independent measure used by the typesetting industry) via the following equation:

    +
    +size_points = (size_pixels * 72)/resolution
    +
    +

    where resolution is in dots-per-inch (DPI). This means that at the default image resolution, there is one pixel per point.

    +

    Note that a font's pointsize is only a first-order approximation of the font height (ascender + descender) in points. The relationship between the specified pointsize and the rendered font height is determined by the font designer.

    +

    See FreeType Glyph Conventions for a detailed description of font metrics related issues.

    +

    The methods available in the TypeMetric class are shown in the following table:

    +

    TypeMetric Methods

    +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +

      Method

      +

      Returns

      +

      Units

      +

      Signature

      +

      Description

      +

      ascent

      +

      double

      +

      Pixels

      +

      void

      +

      Returns the distance in pixels from the text baseline to the highest/upper grid coordinate used to place an outline point. Always a positive value.

      +

      descent

      +

      double

      +

      Pixels

      +

      void

      +

      Returns the distance in pixels from the baseline to the lowest grid coordinate used to place an outline point. Always a negative value.

      +

      textWidth

      +

      double

      +

      Pixels

      +

      void

      +

      Returns text width in pixels.

      +

      textHeight

      +

      double

      +

      Pixels

      +

      void

      +

      Returns text height in pixels.

      +

      maxHorizontalAdvance

      +

      double

      +

      Pixels

      +

      void

      +

      Returns the maximum horizontal advance (advance from the beginning of a character to the beginning of the next character) in pixels.

    +
    + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/index.html b/ImageMagick-6.9.12-44/www/Magick++/index.html new file mode 100644 index 0000000..1b8fede --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/index.html @@ -0,0 +1,92 @@ + + + + + +Magick++ API + + + +
    +

    +

    ImageMagick Magick++ API

    +

    Magick++ is the object-oriented C++ API to the ImageMagick +image-processing library, the most comprehensive open-source image +processing package available. Read the latest NEWS +and ChangeLog for Magick++. +

    +

    Magick++ +supports an object model which is inspired by PerlMagick. +Images support implicit reference counting so that copy constructors +and assignment incur almost no cost. The cost of actually copying an +image (if necessary) is done just before modification and this copy +is managed automagically by Magick++. De-referenced copies are +automagically deleted. The image objects support value (rather than +pointer) semantics so it is trivial to support multiple generations +of an image in memory at one time. +

    +

    Magick++ provides integrated support for the Standard +Template Library (STL) so that the powerful containers available +(e.g. deque, +vector, list, +and map) can +be used to write programs similar to those possible with PERL & +PerlMagick. STL-compatible template versions of ImageMagick's +list-style operations are provided so that operations may be +performed on multiple images stored in STL containers. +

    +

    Documentation

    +

    Detailed documentation is +provided for all Magick++ classes, class methods, and template +functions which comprise the API. See a Gentle Introduction to Magick++ for an introductory tutorial to Magick++. We include the source if you want to correct, enhance, or expand the tutorial.

    +

    +

    Obtaining Magick++

    +

    Magick++ is included as part of ImageMagick +source releases and may be retrieved via ftp +or Github. +

    +

    Installation

    +

    Once you have the Magick++ sources available, follow these detailed +installation instructions for UNIX and +Windows. +

    +

    Usage +

    +

    A helper script named Magick++-config is installed +under Unix which assists with recalling compilation options required +to compile and link programs which use Magick++. For example, the +following command will compile and link the source file example.cpp +to produce the executable example (notice that quotes are +backward quotes): +

    +
    c++ -O2 -o example example.cpp +`Magick++-config --cppflags --cxxflags --ldflags --libs`
    +

    Windows users may get started by manually editing a project file +for one of the Magick++ demo programs. +

    +

    Be sure to initialize the ImageMagick library prior to using the +Magick++ library. This initialization is performed by passing the +path to the ImageMagick DLLs (assumed to be in the same directory +as your program) to the InitializeMagick() function call. This is +commonly performed by providing the path to your program (argv[0]) as +shown in the following example: +

    +
    int main( ssize_t /*argc*/, char ** +argv)
    {
    +InitializeMagick(*argv);
    +

    +

    Reporting Bugs

    +

    Please report any bugs via the +Magick++ bug tracking forum. +Questions regarding usage should be directed to +Magick++ discussion forum. +

    +

    Related Packages

    +

    Users who are interested in displaying their images at video game +rates on a wide number of platforms and graphic environments (e.g. +Windows, X11, BeOS, and Linux/CGI) may want to try PtcMagick, +which provides a simple interface between Magick++ and OpenPTC. +

    + + + diff --git a/ImageMagick-6.9.12-44/www/Magick++/magick.css b/ImageMagick-6.9.12-44/www/Magick++/magick.css new file mode 100644 index 0000000..4ada346 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/magick.css @@ -0,0 +1,798 @@ +body { + background: white; + color: black; + font-family: Candara, Sans-Serif; + margin: 0px; + padding: 0px; + font-size: 10pt; +} + +a { + background: transparent; + color: #17457c; + text-decoration: none; + font-weight: bold; +} + +a[href]:hover { + background: transparent; + color: #991e1e; + text-decoration: underline; + font-weight: bold; +} + +div.cmd { + color: black; + background: #d2ddf6; + font-family: monospace; + margin: 1.33em 40px; + padding: 1.33em 1.33em 1.33em 2.66em; + text-indent:-1.33em; +} + +div.crt { + border-style: ridge; + border-width: 7px; + border-color: blue; + color: white; + background: #000044; + font-family: monospace; + margin: 1.33em 0em; + padding: .66em 1.33em .66em 1.33em; +} + +div.cmdout { + color: black; + background: #d0d0dd; + font-family: Times, serif; + margin: 1.33em 40px; + padding: .66em 1.33em .66em 1.33em; +} + +div.doc-section > p { + margin: 1.33em 0px; +} + +div.doc-section { + margin: 1.33em 40px; +} + +div.eastbar { + right: 0.2em; + position: absolute; +} + +div.eqn { + text-align: center; + } + +div.footer { + margin-left: 160px; + background: white; +} + +div.group { + border: 2px solid #666; + padding: 0; + margin: 0.8em 8px; +} + +div.image { + text-align: center; +} + +div.info { + clear: both; +} + +div.main { + background: white; + color: black; + border-left-style: solid; + border-left-color: #d0d0d0; + border-left-width: 1px; + padding-left: .75em; + padding-bottom: .75em; + padding-top: 0px; + padding-right: .75em; + margin-left: 160px; + margin-right: 10px; +} + +div.menu { + background: #f5f5f5; + color: black; + padding-left: .66em; + padding-right: .66em; + padding-top: .75em; + font-weight: bold; + vertical-align: top; + left: 0px; +} + +div.sep { + background: #f5f5f5; + color: black; + padding-left: 1.33em; + padding-top: .75em; + font-weight: bold; + vertical-align: top; + left: 0px; + font-size: 66%; +} + +div.sponsor { + padding-left: .5em; + padding-top: .25em; + font-size: 83.333%; +} + +div.sponsbox { + background: #ffffff; + border-style: solid; + border-color: #d0d0d0; + border-width: 1px; + padding-left: .66em; + font-weight: bold; + vertical-align: top; + left: 0px; +} + +div.sub { + background: #f5f5f5; + color: black; + padding-left: 1.66em; + padding-top: .15em; + font-weight: bold; + vertical-align: top; + left: 0px; + font-size: 90%; +} + +div.text { + color: black; + background: #d2ddf6; + font-family: monospace; + margin: 1.33em 40px; + padding: 1.33em; +} + +div.titlebar { + background-image: url("https://legacy.imagemagick.org/images/background.jpg"); + background-repeat: repeat-x; + height: 118px; + width: 100%; + background-color: white; /* #f5f5f5; */ + border:0px; + padding-bottom:0px; +} + +div.westbar { + width: 160px; + left: 0em; + position: absolute; + /* height: 100%; */ + font-size: 9pt; + border-right-style: solid; + border-right-color: #d0d0d0; + border-right-width: 1px; +} + +acronym, .help { + border-bottom: 1px dashed #9999cc; + cursor: help; +} + +div.info img { + float: left; + padding: 0em 1em 0em 0em; +} + +dl.doc { + padding: .833em 1.33em 1.33em 1.33em; + border-spacing: 0px; + width: 85%; + text-align: left; + margin: 1.33em 40px; + border-style: solid; + border-color: #d0d0d0; + border-width: 1px; +} + +dt { + font-weight: bold; + margin-left: 3em; + margin-top: 2em; + margin-bottom: .5em; +} + +dd { + margin: .5em .5em .5em 5em; +} + +em.arg { + color: #8b0000; /* darkred; */ + font-weight: normal; +} + +em.caution { + color: #981e49; + font-weight: bold; +} + +em.emergency { + color: #c74646; + font-weight: bold; +} + +em.option { + color: #8b0000; + font-weight: normal; +} + +em.QR { + color: #00008b; + font-weight: normal; +} + +em.warn { + color: #d5a82f; + font-weight: bold; +} + +fieldset { + padding: .5em; + background: white; + border: 1px dotted #aaaa77; + margin-left: 20px; + margin-right: 20px; + margin-top: .5em; +} + +fieldset legend { + color: #fff; + background-color: #aaaa77; + font-size: smaller; + padding: .1ex .5ex; + border-right: 1px solid gray; + border-bottom: 1px solid gray; + font-weight: bold; +} + +form { + margin: 1.33em 0px; + margin-left: 40px; + margin-right: 40px; +} + +h1 { + color: black; + padding: 5px; + background: #f5f5f5; + border-style: solid; + border-color: #d0d0d0; + border-width: 1px; + margin-bottom: 30px; + margin-top: 5px; + font-weight: bold; + font-size: 110%; + text-align: center; + text-transform: capitalize; + clear: left; +} + +h2 { + font-weight: bold; + clear: both; + font-size: 110%; +} + +h3 { + font-weight: bold; + clear: both; + font-size: 100%; +} + +h4 { + font-weight: bolder; + clear: both; + font-size: 95%; +} + +h5 { + margin: 1.33em 0px; + margin-left: 40px; + margin-right: 40px; + font-weight: bold; + clear: both; + font-size: 100%; +} + +iframe { + margin: 1%; +} + +img { + border: none; +} + +img.icon { + float: left; + margin: 5px; +} + +img.map { + margin: 0px; + padding: 0px; +} + +kbd { + font-weight: bold; +} + +li { + margin-left: 40px; + margin-right: 40px; +} + +li table { + margin: 1em 0px; + width: 100%; +} + +.list li { + padding-bottom: 1.2em; +} + +.list p { + margin: 0 0 0 0; +} + +p { + margin: 0.75em 0px; + text-align: left; +} + +p+h3, pre+h3, ul+h3, ol+h3, dl+h3 { + margin-top: 2em; +} + +p.code { + color: black; + background: #f5f5f5; + border: 1pt dashed #2f6fab; + font-family: monospace; + font-size: 8pt; + white-space: pre; + margin: 1.33em 40px; + padding: .66em 1.33em; +} + +p.crt { + white-space: nowrap; + border-style: ridge; + border-width: 7px; + border-color: blue; + color: white; + background: #000044; + font-family: monospace; + font-size: 9pt; + margin: 1.33em 40px; + padding: .66em 1.33em; +} + +p.crtsnip { + text-align: center; + margin-left: auto; + margin-right: auto; + margin-top: 1.33em; + margin-bottom: 1.33em; + width: 50%; + white-space: nowrap; + border-top-style: ridge; + border-bottom-style: ridge; + border-top-width: 7px; + border-bottom-width: 7px; + border-color: blue; + color: white; + font-weight: bolder; + background: #000044; + font-family: monospace; + padding: .66em 1.33em; +} + +p.crtsnip em.arg { + color: #ffbbbb; /* brighter red; */ +} + +p.info { + margin: 0.75em 0px; + text-align: left; +} + +p.image img { + border: none; +} + +p.image { + text-align: center; +} + +p.image, p.image-slices { + text-align: center; +} + +p.image-slices img { + display: block; + margin: 0px; + padding: 0px; + border: none; + margin-left: auto; + margin-right: auto; +} + +p.navigation-index { + padding: 10px; + margin-top: 1px; + margin-bottom: 0px; + margin-left: 0; + margin-right: 0; + background: white; + text-align: center; + font-size: 80%; + white-space: normal; +} + +p.options { + padding: 0 3em; +} + +p.pre { + white-space: pre; + color: black; + background: #d2ddf6; + font-family: monospace; + padding: 0em; + margin: 0em; +} + +p.text { + color: black; + background: #d2ddf6; + font-family: monospace; + margin: 1.33em 40px; + padding: 1.33em; +} + +p.warn { + padding: .66em 3em; + background: #ffeedd; +} + +pre { + padding-top: 0pt; + padding-bottom: 0pt; + margin: 0pt; + font-size: 90%; +} + +pre.code { + color: black; + background: #f5f5f5; + border: solid 2px black; + font-family: monospace; + white-space: pre; + margin: 1.33em 0px; + margin-left: 40px; + margin-right: 40px; + padding: 1.33em; + font-size: 90%; +} + +pre.crt { + padding: 0; + margin: 0; + } + +pre.debug { + color: black; + background: #d2ddf6; + border: solid 2px black; + font-family: monospace; + white-space: pre; + margin: 1.33em 0px; + margin-left: 40px; + margin-right: 40px; + padding: 1.33em; +} + +pre.text { + color: black; + background: #ddddff; + font-family: monospace; + white-space: pre; + margin: 1.33em 0px; + margin-left: 40px; + margin-right: 40px; + padding: 1.33em; +} + +span.bull { + color: #d0d0d0; +} + +span.crtin { + color: white; + font-weight: bolder; + padding: .67em 1.33em .67em 0; +} + +span.crtout, .crtprompt { + color: #ffff77; + padding-top: .67em; + padding-bottom: .67em; +} + +span.crtout { + padding-left: 1.33em; + padding-right: 1.33em; + display: block; +} + +span.crtprompt { + padding-right: 0; + text-indent:-1.33em; +} + +span.different { + font-weight: bold; + background-color: transparent; + color: blue; +} + +span.filter { + font-weight: bold; +} + +span.info-east { + float: right; +} + +span.info-west { + float: left; +} + +span.option { + white-space: normal; +} + +span.path { + font-weight: bold; +} + +span.size-mod-title { } + +table.doc { + padding: 1.33em; + border-spacing: 0px; + width: 91%; + text-align: left; + margin: 1.33em 40px; + border-style: solid; + border-color: #d0d0d0; + border-width: 1px; +} + +table.doc td,th { + padding: .3em .5em; +} + +td { + text-align: left; + padding: .5em; +} + +td.map { + margin: 0px; + padding: 0px; +} + +th { + background-color: #d2ddf6; + color: black + text-align: left; + padding: .5em; +} + +th.size-alt, tr.size-alt, td.size-alt { + background-color: #f0f0f0; +} + +th.size-norm, tr.size-norm, td.size-norm { + background-color: #f7f7f7; +} + +#footer { + margin-left:0px; +} + +#footer-west { + float: left; + padding: 20px; +} + +#footer-east { + float: right; + padding: 20px; +} + +#header { + background-color: #ADD8E6; /* lightblue; */ + position: fixed; + top: 0px; + left: 0px; + width: 100%; + height: 4em; + border-bottom: solid 1px; + z-index: 10; +} + +#linkbar, #navigation-bar { + clear: both; + background: #f5f5f5; + color: black; + border: solid #d0d0d0; + border-width: 1px 0px 1px 0px; + padding: 5px 5px 5px 10px; + font-weight: bold; + text-align: center; + margin-left:0px; +} + +#linkbar-east { + float: right; +} + +#linkbar-center { + padding: 0px 80px; +} + +#linkbar-west { + float: left; +} + +#margin { + padding: 10px; + vertical-align: top; + white-space: nowrap; + left: 0px; +} + +#menu { + background: #f5f5f5; + color: black; + border-style: solid; + border-color: #d0d0d0; + border-width: 0px 1px 0px 0px; + padding: 10px; + font-weight: bold; + vertical-align: top; + white-space: nowrap; + top: 100px; + left: 0px; + height: 100%; +} + +#main { + margin-left: 0px; + padding-right: 0px; + padding-left: 10px; +} + +#menu a { + display: block; +} + +#menu a.sponsor { + display: block; + padding-left: 10px; + font-size: 76.6666%; +} + +#menu a.sub { + display: block; + padding-left: 10px; + font-size: 90%; +} + +#menu p { + display: none; +} + +#menu span { + display: none; +} + +#menu-button { + background-color: transparent; + padding: 0; + position: absolute; + top: 100px; + left: 0px; + cursor: w-resize; +} + +#notice { + color:#b90006; +} + +#titlebar { + background-image: url("https://legacy.imagemagick.org/images/background.jpg"); + background-repeat: repeat-x; + height: 118px; +} + +#table { + text-align: left; + margin: 1.33em 0px; + margin-left: 40px; + margin-right: 40px; + border-style: solid; + border-color: #d0d0d0; + border-width: 1px; +} + +#titlebar-east { + float: right; +} + +#titlebar-west { + float: left; +} +*/ + +#www-imagemagick-org { + background: #f5f5f5; +} + +@media print { + #titlebar, #navigation-bar, #linkbar, #menu, #margin { display: none } + + #main { + margin-left: 0px; + padding-right: 0px; + padding-left: 0px; + } +} + +.size-alt { background-color: #f5f5f5; } + +.size-accent { background-color: #f5f5f5; } + +.size-mod-body { font-size: 93.666%; } + +.size-mod-foot { } + +.size-mod-head { + text-align: left; + font-weight: bold; +} + +.size-mod-title { + font-size: 1.3em; + font-weight: bold; +} + +.viewport +{ + color: black; + background: #f5f5f5; + border: solid 2px black; + font-family: monospace; + font-size: 83.333%; + white-space: pre; + margin: 1.33em 40px; + padding: 1.33em; + height: 480px; + overflow: auto; +} diff --git a/ImageMagick-6.9.12-44/www/Magick++/montage-sample-framed.jpg b/ImageMagick-6.9.12-44/www/Magick++/montage-sample-framed.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56197cc703a26e95d468fecdc42ab98d66c0f879 GIT binary patch literal 20198 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 XGk50fFJ+DB-2JvH$V0uf{{Kw?h|Eb~ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/www/Magick++/right_triangle.png b/ImageMagick-6.9.12-44/www/Magick++/right_triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..8deb4029e881cb42a1aad8b3335d6d814a8b958a GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngd!3-pihitnGq*&4&eH|GXHuiJ>Nn{1`g#vs+ zT!Sj-_3fH7>)f2CWpkz-no~7zPPNd9M4+s`r;B4q#hl~>1rCXeKYV=7WYmNR3e4|p x6`k6za)^bwr{d>|R~OGXZ{@#gtMQJN!FC(N!bvx)cz{|NJYD@<);T3K0RX%iG3@{V literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-framed.fig b/ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-framed.fig new file mode 100644 index 0000000..f447acb --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-framed.fig @@ -0,0 +1,40 @@ +#FIG 3.2 +Portrait +Center +Inches +Letter +100.00 +Single +0 +1200 2 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 4800 1200 4350 2250 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5775 1200 5325 2025 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6525 4275 5250 4575 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3825 1200 3600 1875 +2 5 0 1 -1 -1 2 0 -1 0.000 0 0 -1 0 0 5 + 0 thumbnail-sample-framed.jpg + 2700 1800 6300 1800 6300 5385 2700 5385 2700 1800 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6525 3075 6150 3150 +2 2 0 1 0 7 10 0 -1 0.000 0 0 -1 0 0 5 + 1650 600 7425 600 7425 6300 1650 6300 1650 600 +4 1 -1 0 0 16 10 0.0000 4 120 480 5775 975 Thumb\001 +4 1 -1 0 0 16 10 0.0000 4 105 435 5775 1155 Frame\001 +4 1 -1 0 0 16 14 0.0000 4 165 2160 4500 5700 FRAMED THUMBNAIL\001 +4 1 -1 0 0 16 10 0.0000 4 120 480 3825 975 Thumb\001 +4 1 -1 0 0 16 10 0.0000 4 120 465 3825 1155 Border\001 +4 1 -1 0 0 16 10 0.0000 4 135 435 4800 1140 Image\001 +4 1 -1 0 0 16 10 0.0000 4 120 480 4800 975 Thumb\001 +4 1 -1 0 0 16 10 0.0000 4 120 480 6900 3000 Thumb\001 +4 1 -1 0 0 16 10 0.0000 4 120 570 6900 3180 Shadow\001 +4 1 -1 0 0 16 10 0.0000 4 120 480 6900 4200 Thumb\001 +4 1 -1 0 0 16 10 0.0000 4 120 390 6900 4380 Label\001 diff --git a/ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-framed.jpg b/ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-framed.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a27e719c9b46728d04558fa70e4a8429bc5beb73 GIT binary patch literal 14968 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-plain.fig b/ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-plain.fig new file mode 100644 index 0000000..95bff11 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-plain.fig @@ -0,0 +1,35 @@ +#FIG 3.2 +Portrait +Center +Inches +Letter +100.00 +Single +-3 +1200 2 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3825 1200 3600 1875 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 4950 1200 4575 2100 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6000 3900 4950 4350 +2 5 0 1 -1 -1 2 0 -1 0.000 0 0 -1 0 0 5 + 0 thumbnail-sample-plain.jpg + 2700 1800 5850 1800 5850 4935 2700 4935 2700 1800 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6000 3075 5250 3375 +2 2 0 1 0 7 10 0 -1 0.000 0 0 -1 0 0 5 + 1800 600 6900 600 6900 6000 1800 6000 1800 600 +4 1 -1 0 0 16 14 0.0000 4 165 1875 4275 5250 PLAIN THUMBNAIL\001 +4 1 -1 0 0 16 10 0.0000 4 120 480 3825 975 Thumb\001 +4 1 -1 0 0 16 10 0.0000 4 120 465 3825 1155 Border\001 +4 1 -1 0 0 16 10 0.0000 4 135 435 4950 1140 Image\001 +4 1 -1 0 0 16 10 0.0000 4 120 480 4950 975 Thumb\001 +4 1 -1 0 0 16 10 0.0000 4 120 570 6300 3180 Shadow\001 +4 1 -1 0 0 16 10 0.0000 4 120 480 6300 3000 Thumb\001 +4 1 -1 0 0 16 10 0.0000 4 120 390 6300 4005 Label\001 +4 1 -1 0 0 16 10 0.0000 4 120 480 6300 3825 Thumb\001 diff --git a/ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-plain.jpg b/ImageMagick-6.9.12-44/www/Magick++/thumbnail-anatomy-plain.jpg new file mode 100644 index 0000000000000000000000000000000000000000..011949a41f497f0cac85f10af3b896ffb67facc2 GIT binary patch literal 12609 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/www/Magick++/thumbnail-sample-plain.jpg b/ImageMagick-6.9.12-44/www/Magick++/thumbnail-sample-plain.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ce49c8a10bd34a390fd8309b9004d7c1a189198 GIT binary patch literal 7387 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 c^Ry^vkM_)DJNlJ!P*_pW?LC#W59f3L2Uyg| + + + + + ImageMagick (legacy) – Advanced Linux Source Installation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Advanced Linux Installation

    +

    Download & UnpackConfigureBuildInstallLinux-specific Build InstructionsMac OS X-specific Build InstructionsMinGW-specific Build InstructionsDealing with Unexpected Problems

    + +

    It's possible you don't want to concern yourself with advanced installation under Linux or Linux systems. If so, you also have the option of installing a pre-compiled binary release or if you still want to install from source without all the fuss see the simple Install From Source instructions. However, if you want to customize the configuration and installation of ImageMagick under Linux or Linux systems, lets begin.

    + +

    Download & Unpack

    + +

    ImageMagick builds on a variety of Linux and Linux-like operating systems including Linux, Solaris, FreeBSD, Mac OS X, and others. A compiler is required and fortunately almost all modern Linux systems have one. Download ImageMagick.tar.gz from imagemagick.org or a mirror and verify the distribution against its message digest.

    + +

    Unpack the distribution it with this command:

    + +
    tar xvzf ImageMagick.tar.gz
    +
    + +

    Now that you have the ImageMagick Linux/Linux source distribution unpacked, let's configure it.

    + + +

    Configure

    + +

    The configure script looks at your environment and decides what it can cobble together to get ImageMagick compiled and installed on your system. This includes finding a compiler, where your compiler header files are located (e.g. stdlib.h), and if any delegate libraries are available for ImageMagick to use (e.g. JPEG, PNG, TIFF, etc.). If you are willing to accept configure's default options, and build from within the source directory, you can simply type:

    + +
      $ cd ImageMagick-6.9.12-40$ ./configure
    +

    Watch the configure script output to verify that it finds everything that + you think it should. Pay particular attention to the last lines of the script output. For example, here is a recent report from our system:

    + +
    ImageMagick is configured as follows. Please verify that this configuration
    +matches your expectations.
    +
    +Host system type: x86_64-unknown-linux-gnu
    +Build system type: x86_64-unknown-linux-gnu
    +
    +                  Option                     Value
    +-------------------------------------------------------------------------------
    +Shared libraries  --enable-shared=yes		yes
    +Static libraries  --enable-static=yes		yes
    +Module support    --with-modules=yes		yes
    +GNU ld            --with-gnu-ld=yes		yes
    +Quantum depth     --with-quantum-depth=16	16
    +High Dynamic Range Imagery
    +                  --enable-hdri=no		no
    +
    +Delegate Configuration:
    +BZLIB             --with-bzlib=yes		yes
    +Autotrace         --with-autotrace=yes	yes
    +DJVU              --with-djvu=yes		no
    +DPS               --with-dps=yes		no
    +FlashPIX          --with-fpx=yes		no
    +FontConfig        --with-fontconfig=yes	yes
    +FreeType          --with-freetype=yes		yes
    +GhostPCL          None			pcl6 (unknown)
    +GhostXPS          None			gxps (unknown)
    +Ghostscript       None			gs (8.63)
    +result_ghostscript_font_dir='none'
    +Ghostscript fonts --with-gs-font-dir=default
    +Ghostscript lib   --with-gslib=yes		no (failed tests)
    +Graphviz          --with-gvc=yes		yes
    +JBIG              --with-jbig=		no
    +JPEG v1           --with-jpeg=yes		yes
    +JPEG-2000         --with-jp2=yes		yes
    +LCMS              --with-lcms=yes		yes
    +LQR               --with-lqr=yes		no
    +Magick++          --with-magick-plus-plus=yes	yes
    +OpenEXR           --with-openexr=yes		yes
    +PERL              --with-perl=yes		/usr/bin/perl
    +PNG               --with-png=yes		yes
    +RSVG              --with-rsvg=yes		yes
    +TIFF              --with-tiff=yes		yes
    +result_windows_font_dir='none'
    +Windows fonts     --with-windows-font-dir=
    +WMF               --with-wmf=yes		yes
    +X11               --with-x=			yes
    +XML               --with-xml=yes		yes
    +ZLIB              --with-zlib=yes		yes
    +
    +X11 Configuration:
    +      X_CFLAGS        =
    +      X_PRE_LIBS      = -lSM -lICE
    +      X_LIBS          =
    +      X_EXTRA_LIBS    =
    +
    +Options used to compile and link:
    +  PREFIX          = /usr/local
    +  EXEC-PREFIX     = /usr/local
    +  VERSION         = 6.4.8
    +  CC              = gcc -std=gnu99
    +  CFLAGS          = -fopenmp -g -O2 -Wall -W -pthread
    +  MAGICK_CFLAGS   = -fopenmp -g -O2 -Wall -W -pthread
    +  CPPFLAGS        = -I/usr/local/include/ImageMagick
    +  PCFLAGS         = -fopenmp
    +  DEFS            = -DHAVE_CONFIG_H
    +  LDFLAGS         = -lfreetype
    +  MAGICK_LDFLAGS  = -L/usr/local/lib -lfreetype
    +  LIBS            = -lMagickCore-Q16 -llcms -ltiff -lfreetype -ljpeg -lfontconfig -lXext
    +                    -lSM -lICE -lX11 -lXt -lbz2 -lz -lm -lgomp -lpthread -lltdl
    +  CXX             = g++
    +  CXXFLAGS        = -g -O2 -Wall -W -pthread
    +
    + +

    You can influence choice of compiler, compilation flags, or libraries of the configure script by setting initial values for variables in the configure command line. These include, among others:

    + +
    +
    CC
    +
    Name of C compiler (e.g. cc -Xa) to use.
    +
    CXX
    +
    Name of C++ compiler to use (e.g. CC).
    +
    CFLAGS
    +
    Compiler flags (e.g. -g -O2) to compile C code.
    +
    CXXFLAGS
    +
    Compiler flags (e.g. -g -O2) to compile C++ code.
    +
    CPPFLAGS
    +
    Include paths (.e.g. -I/usr/local) to look for header files.
    +
    LDFLAGS
    +
    Library paths (.e.g. -L/usr/local) to look for libraries systems that support the notion of a library run-path may require an additional argument in order to find shared libraries at run time. For example, the Solaris linker requires an argument of the form -R/path. Some Linux systems will work with -rpath /usr/local/lib, while some other Linux systems who's gcc does not pass -rpath to the linker, require an argument of the form -Wl,-rpath,/usr/local/lib.
    +
    LIBS
    +
    Extra libraries (.e.g. -l/usr/local/lib) required to link.
    +
    + +

    Here is an example of setting configure variables from the command line:

    + +
    configure CC=c99 CFLAGS=-O2 LDFLAGS='-L/usr/local/lib -R/usr/local/lib' LIBS=-lposix
    +
    + +

    Any variable (e.g. CPPFLAGS or LDFLAGS) which requires a directory path must specify an absolute path rather than a relative path.

    + +

    Configure can usually find the X include and library files automagically, but if it doesn't, you can use the --x-includes=path and --x-libraries=path options to specify their locations.

    + +

    The configure script provides a number of ImageMagick specific options. When disabling an option --disable-something is equivalent to specifying --enable-something=no and --without-something is equivalent to --with-something=no. The configure options are as follows (execute configure --help to see all options).

    + +

    ImageMagick options represent either features to be enabled, disabled, or packages to be included in the build. When a feature is enabled (via --enable-something), it enables code already present in ImageMagick. When a package is enabled (via --with-something), the configure script will search for it, and if is properly installed and ready to use (headers and built libraries are found by compiler) it will be included in the build. The configure script is delivered with all features disabled and all packages enabled. In general, the only reason to disable a package is if a package exists but it is unsuitable for the build (perhaps an old version or not compiled with the right compilation flags).

    + +

    Here are the optional features you can configure:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    --enable-sharedbuild the shared libraries and support for loading coder and process modules. Shared libraries are preferred because they allow programs to share common code, making the individual programs much smaller. In addition shared libraries are required in order for PerlMagick to be dynamically loaded by an installed PERL (otherwise an additional PERL (PerlMagick) must be installed. +

    + ImageMagick built with delegates (see MAGICK PLUG-INS below) can pose additional challenges. If ImageMagick is built using static libraries (the default without --enable-shared) then delegate libraries may be built as either static libraries or shared libraries. However, if ImageMagick is built using shared libraries, then all delegate libraries must also be built as shared libraries. Static libraries usually have the extension .a, while shared libraries typically have extensions like .so, .sa, or .dll. Code in shared libraries normally must compiled using a special compiler option to produce Position Independent Code (PIC). The only time this not necessary is if the platform compiles code as PIC by default. +

    + PIC compilation flags differ from vendor to vendor (gcc's is -fPIC). However, you must compile all shared library source with the same flag (for gcc use -fPIC rather than -fpic). While static libraries are normally created using an archive tool like ar, shared libraries are built using special linker or compiler options (e.g. -shared for gcc). +

    + If --enable-shared is not specified, a new PERL interpreter (PerlMagick) is built which is statically linked against the PerlMagick extension. This new interpreter is installed into the same directory as the ImageMagick utilities. If --enable-shared is specified, the PerlMagick extension is built as a dynamically loadable object which is loaded into your current PERL interpreter at run-time. Use of dynamically-loaded extensions is preferable over statically linked extensions so use --enable-shared if possible (note that all libraries used with ImageMagick must be shared libraries!).
    --disable-staticstatic archive libraries (with extension .a) are not built. If you are building shared libraries, there is little value to building static libraries. Reasons to build static libraries include: 1) they can be easier to debug; 2) clients do not have external dependencies (i.e. libMagick.so); 3) building PIC versions of the delegate libraries may take additional expertise and effort; 4) you are unable to build shared libraries.
    --disable-installeddisable building an installed ImageMagick (default enabled). +

    + By default the ImageMagick build is configured to formally install into a directory tree. This the most secure and reliable way to install ImageMagick. Use this option to configure ImageMagick so that it doesn't use hard-coded paths and locates support files by computing an offset path from the executable (or from the location specified by the MAGICK_HOME environment variable. The uninstalled configuration is ideal for binary distributions which are expected to extract and run in any location.
    --enable-ccmallocenable 'ccmalloc' memory debug support (default disabled).
    --enable-profenable 'prof' profiling support (default disabled).
    --enable-gprofenable 'gprof' profiling support (default disabled).
    --enable-gcovenable 'gcov' profiling support (default disabled).
    --disable-openmpdisable OpenMP (default enabled). +

    + Certain ImageMagick algorithms, for example convolution, can achieve a significant speed-up with the assistance of the OpenMP API when running on modern dual and quad-core processors.
    --disable-largefiledisable support for large (64 bit) file offsets. +

    + By default, ImageMagick is compiled with support for large files (> 2GB on a 32-bit CPU) if the operating system supports large files. Some applications which use the ImageMagick library may also require support for large files. By disabling support for large files via --disable-largefile, dependent applications do not require special compilation options for large files in order to use the library.
    + +

    Here are the optional packages you can configure:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    --with-quantum-depthnumber of bits in a pixel quantum (default 16). +

    + Use this option to specify the number of bits to use per pixel quantum (the size of the red, green, blue, and alpha pixel components). For example, --with-quantum-depth=8 builds ImageMagick using 8-bit quantums. Most computer display adapters use 8-bit quantums. Currently supported arguments are 8, 16, or 32. We recommend the default of 16 because some image formats support 16 bits-per-pixel. However, this option is important in determining the overall run-time performance of ImageMagick. +

    + The number of bits in a quantum determines how many values it may contain. Each quantum level supports 256 times as many values as the previous level. The following table shows the range available for various quantum sizes. +

    +
    Quantum Depth     Valid Range (Decimal)   Valid Range (Hex)
    +    8             0-255                   00-FF
    +   16             0-65535                 0000-FFFF
    +   32             0-4294967295            00000000-FFFFFFFF
    +
    +

    + Larger pixel quantums can cause ImageMagick to run more slowly and to require more memory. For example, using sixteen-bit pixel quantums can cause ImageMagick to run 15% to 50% slower (and take twice as much memory) than when it is built to support eight-bit pixel quantums. +

    + The amount of virtual memory consumed by an image can be computed by the equation (5 * Quantum Depth * Rows * Columns) / 8. This an important consideration when resources are limited, particularly since processing an image may require several images to be in memory at one time. The following table shows memory consumption values for a 1024x768 image: +

    +
    Quantum Depth   Virtual Memory
    +     8               3MB
    +    16               8MB
    +    32              15MB
    +
    --enable-hdriaccurately represent the wide range of intensity levels.
    --enable-osx-universal-binarybuild a universal binary on OS X.
    --without-modulesdisable support for dynamically loadable modules. +

    + Image coders and process modules are built as loadable modules which are installed under the directory [prefix]/lib/ImageMagick-X.X.X/modules-QN (where 'N' equals 8, 16, or 32 depending on the quantum depth) in the subdirectories coders and filters respectively. The modules build option is only available in conjunction with --enable-shared. If --enable-shared is not also specified, support for building modules is disabled. Note that if --enable-shared and --disable-modules are specified, the module loader is active (allowing extending an installed ImageMagick by simply copying a module into place) but ImageMagick itself is not built using modules.
    --with-cacheset pixel cache threshold (defaults to available memory). +

    + Specify a different image pixel cache threshold with this option. This sets the maximum amount of heap memory that ImageMagick is allowed to consume before switching to using memory-mapped temporary files to store raw pixel data.
    --without-threadsdisable threads support. +

    + By default, the ImageMagick library is compiled with multi-thread support. If this undesirable, specify --without-threads.
    --with-frozenpathsenable frozen delegate paths. +

    + Normally, external program names are substituted into the delegates.xml configuration file without full paths. Specify this option to enable saving full paths to programs using locations determined by configure. This useful for environments where programs are stored under multiple paths, and users may use different PATH settings than the person who builds ImageMagick.
    --without-magick-plus-plusdisable build/install of Magick++. +

    + Disable building Magick++, the C++ application programming interface to ImageMagick. A suitable C++ compiler is required in order to build Magick++. Specify the CXX configure variable to select the C++ compiler to use (default g++), and CXXFLAGS to select the desired compiler optimization and debug flags (default -g -O2). Antique C++ compilers will normally be rejected by configure tests so specifying this option should only be necessary if Magick++ fails to compile.
    --without-perldisable build/install of PerlMagick, or +

    + By default, PerlMagick is conveniently compiled and installed as part of ImageMagick's normal configure, make, sudo make install process. When --without-perl is specified, you must first install ImageMagick, change to the PerlMagick subdirectory, build, and finally install PerlMagick. Note, PerlMagick is configured even if --without-perl is specified. If the argument --with-perl=/path/to/perl is supplied, /../path/to/perl is be taken as the PERL interpreter to use. This important in case the perl executable in your PATH is not PERL5, or is not the PERL you want to use.
    --with-perl=PERLuse specified Perl binary to configure PerlMagick.
    --with-perl-options=OPTIONSoptions to pass on command-line when generating PerlMagick's Makefile from Makefile.PL. +

    + The PerlMagick module is normally installed using the Perl interpreter's installation PREFIX, rather than ImageMagick's. If ImageMagick's installation prefix is not the same as PERL's PREFIX, then you may find that PerlMagick's sudo make install step tries to install into a directory tree that you don't have write permissions to. This common when PERL is delivered with the operating system or on Internet Service Provider (ISP) web servers. If you want PerlMagick to install elsewhere, then provide a PREFIX option to PERL's configuration step via "--with-perl-options=PREFIX=/some/place". Other options accepted by MakeMaker are 'LIB', 'LIBPERL_A', 'LINKTYPE', and 'OPTIMIZE'. See the ExtUtils::MakeMaker(3) manual page for more information on configuring PERL extensions.
    --without-bzlibdisable BZLIB support.
    --without-dpsdisable Display Postscript support.
    --with-fpxenable FlashPIX support.
    --without-freetypedisable TrueType support.
    --with-gslibenable Ghostscript library support.
    --without-jbigdisable JBIG support.
    --without-jpegdisable JPEG support.
    --without-jp2disable JPEG v2 support.
    --without-lcmsdisable LCMS support.
    --without-lzmadisable LZMA support.
    --without-pngdisable PNG support.
    --without-tiffdisable TIFF support.
    --without-wmfdisable WMF support.
    --with-fontpathprepend to default font search path.
    --with-gs-font-dirdirectory containing Ghostscript fonts. +

    + Specify the directory containing the Ghostscript Postscript Type 1 font files (e.g. n022003l.pfb) so that they can be rendered using the FreeType library. If the font files are installed using the default Ghostscript installation paths (${prefix}/share/ghostwww/fonts), they should be discovered automagically by configure and specifying this option is not necessary. Specify this option if the Ghostscript fonts fail to be located automagically, or the location needs to be overridden.
    --with-windows-font-dirdirectory containing MS-Windows fonts. +

    + Specify the directory containing MS-Windows-compatible fonts. This not necessary when ImageMagick is running under MS-Windows.
    --without-xmldisable XML support.
    --without-zlibdisable ZLIB support.
    --without-xdon't use the X Window System. +

    + By default, ImageMagick uses the X11 delegate libraries if they are available. When --without-x is specified, use of X11 is disabled. The display, animate, and import sub-commands are not included. The remaining sub-commands have reduced functionality such as no access to X11 fonts (consider using Postscript or TrueType fonts instead).
    --with-share-path=DIRAlternate path to share directory (default share/ImageMagick).
    --with-libstdc=DIRuse libstdc++ in DIR (for GNU C++).
    + +

    While configure is designed to ease installation of ImageMagick, it often discovers problems that would otherwise be encountered later when compiling ImageMagick. The configure script tests for headers and libraries by executing the compiler (CC) with the specified compilation flags (CFLAGS), pre-processor flags (CPPFLAGS), and linker flags (LDFLAGS). Any errors are logged to the file config.log. If configure fails to discover a header or library please review this log file to determine why, however, please be aware that *errors in the config.log are normal* because configure works by trying something and seeing if it fails. An error in config.log is only a problem if the test should have passed on your system.

    + +

    Common causes of configure failures are: 1) a delegate header is not in the header include path (CPPFLAGS -I option); 2) a delegate library is not in the linker search/run path (LDFLAGS -L/-R option); 3) a delegate library is missing a function (old version?); or 4) compilation environment is faulty.

    +

    If all reasonable corrective actions have been tried and the problem appears be due to a flaw in the configure script, please send a bug report to the ImageMagick Defect Support Forum. All bug reports should contain the operating system type (as reported by uname -a) and the compiler/compiler-version. A copy of the configure script output and/or the relevant portion of config.log file may be valuable in order to find the problem. If you post portions of config.log, please also send a script of the configure output and a description of what you expected to see (and why) so the failure you are observing can be identified and resolved.

    + +

    ImageMagick is now configured and ready to build

    + +

    Build

    + +

    Once ImageMagick is configured, these standard build targets are available from the generated make files:

    + +
    +
    make
    +
    Build ImageMagick.
    +
    sudo make install
    +
    Install ImageMagick.
    +
    make check
    +
    Run tests using the installed ImageMagick (sudo make install must be done first). Ghostscript and Freetype are prerequisites, otherwise certain unit tests that render text and the EPS, PS, and PDF formats will likely fail.
    +
    make clean
    +
    Remove everything in the build directory created by make.
    +
    make distclean
    +
    remove everything in the build directory created by configure and make. This useful if you want to start over from scratch.
    +
    make uninstall
    +
    Remove all files from the system which are (or would be) installed by sudo make install using the current configuration. Note that this target is imperfect for PerlMagick since Perl no longer supports an uninstall target.
    +
    + +

    In most cases you will simply wand to compile ImageMagick with this command:

    + +
    make
    +
    + +

    Once built, you can optionally install ImageMagick on your system as discussed below.

    + +

    Install

    + +

    Now that ImageMagick is configured and built, type:

    + +
    make install
    +
    + +

    to install it.

    + +

    By default, ImageMagick is installs binaries in /../usr/local/bin, libraries in /../usr/local/lib, header files in /../usr/local/include and documentation in /../usr/local/share. You can specify an alternative installation prefix other than /../usr/local by giving configure the option --prefix=PATH. This valuable in case you don't have privileges to install under the default paths or if you want to install in the system directories instead.

    + +

    To confirm your installation of the ImageMagick distribution was successful, ensure that the installation directory is in your executable search path and type:

    + +
    $ convert logo: logo.gif
    +$ identify logo.gif
    +
    + +

    The ImageMagick logo is displayed on your X11 display.

    + +

    To verify the ImageMagick build configuration, type:

    + +
    identify -list configure
    +
    + +

    To list which image formats are supported , type:

    + +
    identify -list format
    +
    + +

    For a more comprehensive test, you run the ImageMagick test suite by typing:

    + +
    make check
    +
    + +

    Ghostscript is a prerequisite, otherwise the EPS, PS, and PDF tests will fail. Note that due to differences between the developer's environment and your own it is possible that a few tests may fail even though the results are ok. Differences between the developer's environment and your own may include the compiler, the CPU type, and the library versions used. The ImageMagick developers use the current release of all dependent libraries.

    + +

    Linux-specific Build instructions

    + +

    Download ImageMagick.src.rpm from ftp.imagemagick.org or its mirrors and verify the distribution against its message digest.

    + +

    Build ImageMagick with this command:

    + +
    rpmbuild --rebuild ImageMagick.src.rpm
    +
    + +

    After the build you, locate the RPMS folder and install the ImageMagick binary RPM distribution:

    + +
      $ rpm -ivh ImageMagick-6.9.12-?.*.rpm
    +

    Mac OS X-specific Build instructions

    + +

    Perform these steps as an administrator or with the sudo command:

    + +

    Install MacPorts. Download and install MacPorts and type the following commands:

    + +
    $ sudo port -v install freetype +bytecode
    +$ sudo port -v install librsvg
    +$ sudo port -v install graphviz +gs +wmf +jbig +jpeg2 +lcms
    +
    + +

    This installs many of the delegate libraries ImageMagick will utilize such as JPEG and FreeType.

    + + +

    Install the latest Xcode from Apple.

    +

    Use the port command to install any delegate libraries you require, for example:

    + +
    sudo port install jpeg
    +
    + +

    Now lets build ImageMagick:

    + +

    Download the ImageMagick source distribution and verify the distribution against its message digest.

    +

    Unpack and change into the top-level ImageMagick directory:

    +
      $ tar xvzf ImageMagick-6.9.12-40.tar.gz$ cd ImageMagick-6.9.12-40

    Configure ImageMagick:

    +
    ./configure --prefix=/opt --with-quantum-depth=16 \
    +  --disable-dependency-tracking --with-x=yes \
    +  --x-includes=/usr/X11R6/include --x-libraries=/usr/X11R6/lib/ \
    +  --without-perl"
    +
    +

    Build ImageMagick:

    +
    make
    +
    +

    Install ImageMagick:

    +
    sudo make install
    +
    +

    To verify your install, type

    + +
    /opt/local/bin/identify -list font
    +
    + +

    to list all the fonts ImageMagick knows about.

    +

    To test the ImageMagick GUI, in a new shell, type:

    + +
    display -display :0
    +
    + +

    MinGW-specific Build instructions

    + +

    Although you can download and install delegate libraries yourself, many are already available in the GnuWin32 distribution. Download and install whichever delegate libraries you require such as JPEG, PNG, TIFF, etc. Make sure you specify the development headers when you install a package. Next type,

    + +
      $ tar jxvf ImageMagick-6.9.12-?.tar.bz2
      $ cd ImageMagick-6.9.12-40
      $ export CPPFLAGS="-Ic:/Progra~1/GnuWin32/include"
      $ export LDFLAGS="-Lc:/Progra~1/GnuWin32/lib"
      $ ./configure --without-perl
      $ make
      $ sudo make install
    +

    Dealing with Unexpected Problems

    + +

    Chances are the download, configure, build, and install of ImageMagick went flawlessly as it is intended, however, certain systems and environments may cause one or more steps to fail. We discuss a few problems we've run across and how to take corrective action to ensure you have a working release of ImageMagick

    + +

    Build Problems

    +

    If the build complains about missing dependencies (e.g. .deps/source.PLO), add --disable-dependency-tracking to your configure command line.

    + +

    Some systems may fail to link at build time due to unresolved symbols. Try adding the LDFLAGS to the configure command line:

    + +
    configure LDFLAGS='-L/usr/local/lib -R/usr/local/lib'
    +
    + +

    Dynamic Linker Run-time Bindings

    +

    On some systems, ImageMagick may not find its shared library, libMagick.so. Try running the ldconfig with the library path:

    + +
    /sbin/ldconfig /usr/local/lib
    +
    + +

    Solaris and Linux systems have the ldd command which is useful to track which libraries ImageMagick depends on:

    + +
    ldd `which convert`
    +
    + +

    Delegate Libraries

    +

    On occasion you may receive these warnings:

    +
    +no encode delegate for this image format
    +
    +

    This exception indicates that an external delegate library or its headers were not available when ImageMagick was built. To add support for the image format, download and install the requisite delegate library and its header files and reconfigure, rebuild, and reinstall ImageMagick. As an example, lets add support for the JPEG image format. First we install the JPEG RPMS:

    + +
    yum install libjpeg libjpeg-devel
    +
    + +

    Now reconfigure, rebuild, and reinstall ImageMagick. To verify JPEG is now properly supported within ImageMagick, use this command:

    + +
    identify -list format
    +
    + +

    You should see a mode of rw- associated with the JPEG tag. This mode means the image can be read or written and can only support one image per image file.

    + +

    PerlMagick

    +

    If PerlMagick fails to link with a message similar to libperl.a is not found, rerun configure with the --enable-shared or --enable-shared --with-modules options.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/advanced-unix-installation.html b/ImageMagick-6.9.12-44/www/advanced-unix-installation.html new file mode 100644 index 0000000..9781342 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/advanced-unix-installation.html @@ -0,0 +1,659 @@ + + + + + + + + + + ImageMagick (legacy) - Advanced Unix Source Installation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Advanced Unix Installation

    +

    Download & UnpackConfigureBuildInstallLinux-specific Build InstructionsMac OS X-specific Build InstructionsMinGW-specific Build InstructionsDealing with Unexpected Problems

    + +

    It's possible you don't want to concern yourself with advanced installation under Unix or Linux systems. If so, you also have the option of installing a pre-compiled binary release or if you still want to install from source without all the fuss see the simple Install From Source instructions. However, if you want to customize the configuration and installation of ImageMagick under Unix or Linux systems, lets begin.

    + +

    Download & Unpack

    + +

    ImageMagick builds on a variety of Unix and Unix-like operating systems including Linux, Solaris, FreeBSD, Mac OS X, and others. A compiler is required and fortunately almost all modern Unix systems have one. Download ImageMagick.tar.gz from imagemagick.org or a mirror and verify the distribution against its message digest.

    + +

    Unpack the distribution it with this command:

    + +
    tar xvzf ImageMagick.tar.gz
    +
    + +

    Now that you have the ImageMagick Unix/Linux source distribution unpacked, let's configure it.

    + + +

    Configure

    + +

    The configure script looks at your environment and decides what it can cobble together to get ImageMagick compiled and installed on your system. This includes finding a compiler, where your compiler header files are located (e.g. stdlib.h), and if any delegate libraries are available for ImageMagick to use (e.g. JPEG, PNG, TIFF, etc.). If you are willing to accept configure's default options, and build from within the source directory, you can simply type:

    + +
    $ cd ImageMagick-6.9.11-62$ ./configure
    +

    Watch the configure script output to verify that it finds everything that + you think it should. Pay particular attention to the last lines of the script output. For example, here is a recent report from our system:

    + +
    ImageMagick is configured as follows. Please verify that this configuration
    +matches your expectations.
    +
    +Host system type: x86_64-unknown-linux-gnu
    +Build system type: x86_64-unknown-linux-gnu
    +
    +                  Option                     Value
    +-------------------------------------------------------------------------------
    +Shared libraries  --enable-shared=yes		yes
    +Static libraries  --enable-static=yes		yes
    +Module support    --with-modules=yes		yes
    +GNU ld            --with-gnu-ld=yes		yes
    +Quantum depth     --with-quantum-depth=16	16
    +High Dynamic Range Imagery
    +                  --enable-hdri=no		no
    +
    +Delegate Configuration:
    +BZLIB             --with-bzlib=yes		yes
    +Autotrace         --with-autotrace=yes	yes
    +DJVU              --with-djvu=yes		no
    +DPS               --with-dps=yes		no
    +FlashPIX          --with-fpx=yes		no
    +FontConfig        --with-fontconfig=yes	yes
    +FreeType          --with-freetype=yes		yes
    +GhostPCL          None			pcl6 (unknown)
    +GhostXPS          None			gxps (unknown)
    +Ghostscript       None			gs (8.63)
    +result_ghostscript_font_dir='none'
    +Ghostscript fonts --with-gs-font-dir=default
    +Ghostscript lib   --with-gslib=yes		no (failed tests)
    +Graphviz          --with-gvc=yes		yes
    +JBIG              --with-jbig=		no
    +JPEG v1           --with-jpeg=yes		yes
    +JPEG-2000         --with-jp2=yes		yes
    +LCMS              --with-lcms=yes		yes
    +LQR               --with-lqr=yes		no
    +Magick++          --with-magick-plus-plus=yes	yes
    +OpenEXR           --with-openexr=yes		yes
    +PERL              --with-perl=yes		/usr/bin/perl
    +PNG               --with-png=yes		yes
    +RSVG              --with-rsvg=yes		yes
    +TIFF              --with-tiff=yes		yes
    +result_windows_font_dir='none'
    +Windows fonts     --with-windows-font-dir=
    +WMF               --with-wmf=yes		yes
    +X11               --with-x=			yes
    +XML               --with-xml=yes		yes
    +ZLIB              --with-zlib=yes		yes
    +
    +X11 Configuration:
    +      X_CFLAGS        =
    +      X_PRE_LIBS      = -lSM -lICE
    +      X_LIBS          =
    +      X_EXTRA_LIBS    =
    +
    +Options used to compile and link:
    +  PREFIX          = /usr/local
    +  EXEC-PREFIX     = /usr/local
    +  VERSION         = 6.4.8
    +  CC              = gcc -std=gnu99
    +  CFLAGS          = -fopenmp -g -O2 -Wall -W -pthread
    +  MAGICK_CFLAGS   = -fopenmp -g -O2 -Wall -W -pthread
    +  CPPFLAGS        = -I/usr/local/include/ImageMagick
    +  PCFLAGS         = -fopenmp
    +  DEFS            = -DHAVE_CONFIG_H
    +  LDFLAGS         = -lfreetype
    +  MAGICK_LDFLAGS  = -L/usr/local/lib -lfreetype
    +  LIBS            = -lMagickCore-Q16 -llcms -ltiff -lfreetype -ljpeg -lfontconfig -lXext
    +                    -lSM -lICE -lX11 -lXt -lbz2 -lz -lm -lgomp -lpthread -lltdl
    +  CXX             = g++
    +  CXXFLAGS        = -g -O2 -Wall -W -pthread
    +
    + +

    You can influence choice of compiler, compilation flags, or libraries of the configure script by setting initial values for variables in the configure command line. These include, among others:

    + +
    +
    CC
    +
    Name of C compiler (e.g. cc -Xa) to use.
    +
    CXX
    +
    Name of C++ compiler to use (e.g. CC).
    +
    CFLAGS
    +
    Compiler flags (e.g. -g -O2) to compile C code.
    +
    CXXFLAGS
    +
    Compiler flags (e.g. -g -O2) to compile C++ code.
    +
    CPPFLAGS
    +
    Include paths (.e.g. -I/usr/local) to look for header files.
    +
    LDFLAGS
    +
    Library paths (.e.g. -L/usr/local) to look for libraries systems that support the notion of a library run-path may require an additional argument in order to find shared libraries at run time. For example, the Solaris linker requires an argument of the form -R/path. Some Linux systems will work with -rpath /usr/local/lib, while some other Linux systems who's gcc does not pass -rpath to the linker, require an argument of the form -Wl,-rpath,/usr/local/lib.
    +
    LIBS
    +
    Extra libraries (.e.g. -l/usr/local/lib) required to link.
    +
    + +

    Here is an example of setting configure variables from the command line:

    + +
    configure CC=c99 CFLAGS=-O2 LDFLAGS='-L/usr/local/lib -R/usr/local/lib' LIBS=-lposix
    +
    + +

    Any variable (e.g. CPPFLAGS or LDFLAGS) which requires a directory path must specify an absolute path rather than a relative path.

    + +

    Configure can usually find the X include and library files automagically, but if it doesn't, you can use the --x-includes=path and --x-libraries=path options to specify their locations.

    + +

    The configure script provides a number of ImageMagick specific options. When disabling an option --disable-something is equivalent to specifying --enable-something=no and --without-something is equivalent to --with-something=no. The configure options are as follows (execute configure --help to see all options).

    + +

    ImageMagick options represent either features to be enabled, disabled, or packages to be included in the build. When a feature is enabled (via --enable-something), it enables code already present in ImageMagick. When a package is enabled (via --with-something), the configure script will search for it, and if is properly installed and ready to use (headers and built libraries are found by compiler) it will be included in the build. The configure script is delivered with all features disabled and all packages enabled. In general, the only reason to disable a package is if a package exists but it is unsuitable for the build (perhaps an old version or not compiled with the right compilation flags).

    + +

    Here are the optional features you can configure:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    --enable-sharedbuild the shared libraries and support for loading coder and process modules. Shared libraries are preferred because they allow programs to share common code, making the individual programs much smaller. In addition shared libraries are required in order for PerlMagick to be dynamically loaded by an installed PERL (otherwise an additional PERL (PerlMagick) must be installed. +

    + ImageMagick built with delegates (see MAGICK PLUG-INS below) can pose additional challenges. If ImageMagick is built using static libraries (the default without --enable-shared) then delegate libraries may be built as either static libraries or shared libraries. However, if ImageMagick is built using shared libraries, then all delegate libraries must also be built as shared libraries. Static libraries usually have the extension .a, while shared libraries typically have extensions like .so, .sa, or .dll. Code in shared libraries normally must compiled using a special compiler option to produce Position Independent Code (PIC). The only time this not necessary is if the platform compiles code as PIC by default. +

    + PIC compilation flags differ from vendor to vendor (gcc's is -fPIC). However, you must compile all shared library source with the same flag (for gcc use -fPIC rather than -fpic). While static libraries are normally created using an archive tool like ar, shared libraries are built using special linker or compiler options (e.g. -shared for gcc). +

    + If --enable-shared is not specified, a new PERL interpreter (PerlMagick) is built which is statically linked against the PerlMagick extension. This new interpreter is installed into the same directory as the ImageMagick utilities. If --enable-shared is specified, the PerlMagick extension is built as a dynamically loadable object which is loaded into your current PERL interpreter at run-time. Use of dynamically-loaded extensions is preferable over statically linked extensions so use --enable-shared if possible (note that all libraries used with ImageMagick must be shared libraries!).
    --disable-staticstatic archive libraries (with extension .a) are not built. If you are building shared libraries, there is little value to building static libraries. Reasons to build static libraries include: 1) they can be easier to debug; 2) clients do not have external dependencies (i.e. libMagick.so); 3) building PIC versions of the delegate libraries may take additional expertise and effort; 4) you are unable to build shared libraries.
    --disable-installeddisable building an installed ImageMagick (default enabled). +

    + By default the ImageMagick build is configured to formally install into a directory tree. This the most secure and reliable way to install ImageMagick. Use this option to configure ImageMagick so that it doesn't use hard-coded paths and locates support files by computing an offset path from the executable (or from the location specified by the MAGICK_HOME environment variable. The uninstalled configuration is ideal for binary distributions which are expected to extract and run in any location.
    --enable-ccmallocenable 'ccmalloc' memory debug support (default disabled).
    --enable-profenable 'prof' profiling support (default disabled).
    --enable-gprofenable 'gprof' profiling support (default disabled).
    --enable-gcovenable 'gcov' profiling support (default disabled).
    --disable-openmpdisable OpenMP (default enabled). +

    + Certain ImageMagick algorithms, for example convolution, can achieve a significant speed-up with the assistance of the OpenMP API when running on modern dual and quad-core processors.
    --disable-largefiledisable support for large (64 bit) file offsets. +

    + By default, ImageMagick is compiled with support for large files (> 2GB on a 32-bit CPU) if the operating system supports large files. Some applications which use the ImageMagick library may also require support for large files. By disabling support for large files via --disable-largefile, dependent applications do not require special compilation options for large files in order to use the library.
    + +

    Here are the optional packages you can configure:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    --with-quantum-depthnumber of bits in a pixel quantum (default 16). +

    + Use this option to specify the number of bits to use per pixel quantum (the size of the red, green, blue, and alpha pixel components). For example, --with-quantum-depth=8 builds ImageMagick using 8-bit quantums. Most computer display adapters use 8-bit quantums. Currently supported arguments are 8, 16, or 32. We recommend the default of 16 because some image formats support 16 bits-per-pixel. However, this option is important in determining the overall run-time performance of ImageMagick. +

    + The number of bits in a quantum determines how many values it may contain. Each quantum level supports 256 times as many values as the previous level. The following table shows the range available for various quantum sizes. +

    +
    Quantum Depth     Valid Range (Decimal)   Valid Range (Hex)
    +    8             0-255                   00-FF
    +   16             0-65535                 0000-FFFF
    +   32             0-4294967295            00000000-FFFFFFFF
    +
    +

    + Larger pixel quantums can cause ImageMagick to run more slowly and to require more memory. For example, using sixteen-bit pixel quantums can cause ImageMagick to run 15% to 50% slower (and take twice as much memory) than when it is built to support eight-bit pixel quantums. +

    + The amount of virtual memory consumed by an image can be computed by the equation (5 * Quantum Depth * Rows * Columns) / 8. This an important consideration when resources are limited, particularly since processing an image may require several images to be in memory at one time. The following table shows memory consumption values for a 1024x768 image: +

    +
    Quantum Depth   Virtual Memory
    +     8               3MB
    +    16               8MB
    +    32              15MB
    +
    --enable-hdriaccurately represent the wide range of intensity levels.
    --enable-osx-universal-binarybuild a universal binary on OS X.
    --without-modulesdisable support for dynamically loadable modules. +

    + Image coders and process modules are built as loadable modules which are installed under the directory [prefix]/lib/ImageMagick-X.X.X/modules-QN (where 'N' equals 8, 16, or 32 depending on the quantum depth) in the subdirectories coders and filters respectively. The modules build option is only available in conjunction with --enable-shared. If --enable-shared is not also specified, support for building modules is disabled. Note that if --enable-shared and --disable-modules are specified, the module loader is active (allowing extending an installed ImageMagick by simply copying a module into place) but ImageMagick itself is not built using modules.
    --with-cacheset pixel cache threshold (defaults to available memory). +

    + Specify a different image pixel cache threshold with this option. This sets the maximum amount of heap memory that ImageMagick is allowed to consume before switching to using memory-mapped temporary files to store raw pixel data.
    --without-threadsdisable threads support. +

    + By default, the ImageMagick library is compiled with multi-thread support. If this undesirable, specify --without-threads.
    --with-frozenpathsenable frozen delegate paths. +

    + Normally, external program names are substituted into the delegates.xml configuration file without full paths. Specify this option to enable saving full paths to programs using locations determined by configure. This useful for environments where programs are stored under multiple paths, and users may use different PATH settings than the person who builds ImageMagick.
    --without-magick-plus-plusdisable build/install of Magick++. +

    + Disable building Magick++, the C++ application programming interface to ImageMagick. A suitable C++ compiler is required in order to build Magick++. Specify the CXX configure variable to select the C++ compiler to use (default g++), and CXXFLAGS to select the desired compiler optimization and debug flags (default -g -O2). Antique C++ compilers will normally be rejected by configure tests so specifying this option should only be necessary if Magick++ fails to compile.
    --without-perldisable build/install of PerlMagick, or +

    + By default, PerlMagick is conveniently compiled and installed as part of ImageMagick's normal configure, make, sudo make install process. When --without-perl is specified, you must first install ImageMagick, change to the PerlMagick subdirectory, build, and finally install PerlMagick. Note, PerlMagick is configured even if --without-perl is specified. If the argument --with-perl=/path/to/perl is supplied, /../path/to/perl is be taken as the PERL interpreter to use. This important in case the perl executable in your PATH is not PERL5, or is not the PERL you want to use.
    --with-perl=PERLuse specified Perl binary to configure PerlMagick.
    --with-perl-options=OPTIONSoptions to pass on command-line when generating PerlMagick's Makefile from Makefile.PL. +

    + The PerlMagick module is normally installed using the Perl interpreter's installation PREFIX, rather than ImageMagick's. If ImageMagick's installation prefix is not the same as PERL's PREFIX, then you may find that PerlMagick's sudo make install step tries to install into a directory tree that you don't have write permissions to. This common when PERL is delivered with the operating system or on Internet Service Provider (ISP) web servers. If you want PerlMagick to install elsewhere, then provide a PREFIX option to PERL's configuration step via "--with-perl-options=PREFIX=/some/place". Other options accepted by MakeMaker are 'LIB', 'LIBPERL_A', 'LINKTYPE', and 'OPTIMIZE'. See the ExtUtils::MakeMaker(3) manual page for more information on configuring PERL extensions.
    --without-bzlibdisable BZLIB support.
    --without-dpsdisable Display Postscript support.
    --with-fpxenable FlashPIX support.
    --without-freetypedisable TrueType support.
    --with-gslibenable Ghostscript library support.
    --without-jbigdisable JBIG support.
    --without-jpegdisable JPEG support.
    --without-jp2disable JPEG v2 support.
    --without-lcmsdisable LCMS support.
    --without-lzmadisable LZMA support.
    --without-pngdisable PNG support.
    --without-tiffdisable TIFF support.
    --without-wmfdisable WMF support.
    --with-fontpathprepend to default font search path.
    --with-gs-font-dirdirectory containing Ghostscript fonts. +

    + Specify the directory containing the Ghostscript Postscript Type 1 font files (e.g. n022003l.pfb) so that they can be rendered using the FreeType library. If the font files are installed using the default Ghostscript installation paths (${prefix}/share/ghostwww/fonts), they should be discovered automagically by configure and specifying this option is not necessary. Specify this option if the Ghostscript fonts fail to be located automagically, or the location needs to be overridden.
    --with-windows-font-dirdirectory containing MS-Windows fonts. +

    + Specify the directory containing MS-Windows-compatible fonts. This not necessary when ImageMagick is running under MS-Windows.
    --without-xmldisable XML support.
    --without-zlibdisable ZLIB support.
    --without-xdon't use the X Window System. +

    + By default, ImageMagick uses the X11 delegate libraries if they are available. When --without-x is specified, use of X11 is disabled. The display, animate, and import sub-commands are not included. The remaining sub-commands have reduced functionality such as no access to X11 fonts (consider using Postscript or TrueType fonts instead).
    --with-share-path=DIRAlternate path to share directory (default share/ImageMagick).
    --with-libstdc=DIRuse libstdc++ in DIR (for GNU C++).
    + +

    While configure is designed to ease installation of ImageMagick, it often discovers problems that would otherwise be encountered later when compiling ImageMagick. The configure script tests for headers and libraries by executing the compiler (CC) with the specified compilation flags (CFLAGS), pre-processor flags (CPPFLAGS), and linker flags (LDFLAGS). Any errors are logged to the file config.log. If configure fails to discover a header or library please review this log file to determine why, however, please be aware that *errors in the config.log are normal* because configure works by trying something and seeing if it fails. An error in config.log is only a problem if the test should have passed on your system.

    + +

    Common causes of configure failures are: 1) a delegate header is not in the header include path (CPPFLAGS -I option); 2) a delegate library is not in the linker search/run path (LDFLAGS -L/-R option); 3) a delegate library is missing a function (old version?); or 4) compilation environment is faulty.

    +

    If all reasonable corrective actions have been tried and the problem appears be due to a flaw in the configure script, please send a bug report to the ImageMagick Defect Support Forum. All bug reports should contain the operating system type (as reported by uname -a) and the compiler/compiler-version. A copy of the configure script output and/or the relevant portion of config.log file may be valuable in order to find the problem. If you post portions of config.log, please also send a script of the configure output and a description of what you expected to see (and why) so the failure you are observing can be identified and resolved.

    + +

    ImageMagick is now configured and ready to build

    + +

    Build

    + +

    Once ImageMagick is configured, these standard build targets are available from the generated make files:

    + +
    +
    make
    +
    Build ImageMagick.
    +
    sudo make install
    +
    Install ImageMagick.
    +
    make check
    +
    Run tests using the installed ImageMagick (sudo make install must be done first). Ghostscript and Freetype are prerequisites, otherwise certain unit tests that render text and the EPS, PS, and PDF formats will likely fail.
    +
    make clean
    +
    Remove everything in the build directory created by make.
    +
    make distclean
    +
    remove everything in the build directory created by configure and make. This useful if you want to start over from scratch.
    +
    make uninstall
    +
    Remove all files from the system which are (or would be) installed by sudo make install using the current configuration. Note that this target is imperfect for PerlMagick since Perl no longer supports an uninstall target.
    +
    + +

    In most cases you will simply wand to compile ImageMagick with this command:

    + +
    make
    +
    + +

    Once built, you can optionally install ImageMagick on your system as discussed below.

    + +

    Install

    + +

    Now that ImageMagick is configured and built, type:

    + +
    make install
    +
    + +

    to install it.

    + +

    By default, ImageMagick is installs binaries in /../usr/local/bin, libraries in /../usr/local/lib, header files in /../usr/local/include and documentation in /../usr/local/share. You can specify an alternative installation prefix other than /../usr/local by giving configure the option --prefix=PATH. This valuable in case you don't have privileges to install under the default paths or if you want to install in the system directories instead.

    + +

    To confirm your installation of the ImageMagick distribution was successful, ensure that the installation directory is in your executable search path and type:

    + +
    $ convert logo: logo.gif
    +$ identify logo.gif
    +
    + +

    The ImageMagick logo is displayed on your X11 display.

    + +

    To verify the ImageMagick build configuration, type:

    + +
    identify -list configure
    +
    + +

    To list which image formats are supported , type:

    + +
    identify -list format
    +
    + +

    For a more comprehensive test, you run the ImageMagick test suite by typing:

    + +
    make check
    +
    + +

    Ghostscript is a prerequisite, otherwise the EPS, PS, and PDF tests will fail. Note that due to differences between the developer's environment and your own it is possible that a few tests may fail even though the results are ok. Differences between the developer's environment and your own may include the compiler, the CPU type, and the library versions used. The ImageMagick developers use the current release of all dependent libraries.

    + +

    Linux-specific Build instructions

    + +

    Download ImageMagick.src.rpm from ftp.imagemagick.org or its mirrors and verify the distribution against its message digest.

    + +

    Build ImageMagick with this command:

    + +
    rpmbuild --rebuild ImageMagick.src.rpm
    +
    + +

    After the build you, locate the RPMS folder and install the ImageMagick binary RPM distribution:

    + +
    $ rpm -ivh ImageMagick-6.9.11-?.*.rpm
    +

    Mac OS X-specific Build instructions

    + +

    Perform these steps as an administrator or with the sudo command:

    + +

    Install MacPorts. Download and install MacPorts and type the following commands:

    + +
    $ sudo port -v install freetype +bytecode
    +$ sudo port -v install librsvg
    +$ sudo port -v install graphviz +gs +wmf +jbig +jpeg2 +lcms
    +
    + +

    This installs many of the delegate libraries ImageMagick will utilize such as JPEG and FreeType.

    + + +

    Install the latest Xcode from Apple.

    +

    Use the port command to install any delegate libraries you require, for example:

    + +
    sudo port install jpeg
    +
    + +

    Now lets build ImageMagick:

    + +

    Download the ImageMagick source distribution and verify the distribution against its message digest.

    +

    Unpack and change into the top-level ImageMagick directory:

    +
    $ tar xvzf ImageMagick-6.9.11-62.tar.gz$ cd ImageMagick-6.9.11-62

    Configure ImageMagick:

    +
    ./configure --prefix=/opt --with-quantum-depth=16 \
    +  --disable-dependency-tracking --with-x=yes \
    +  --x-includes=/usr/X11R6/include --x-libraries=/usr/X11R6/lib/ \
    +  --without-perl"
    +
    +

    Build ImageMagick:

    +
    make
    +
    +

    Install ImageMagick:

    +
    sudo make install
    +
    +

    To verify your install, type

    + +
    /opt/local/bin/identify -list font
    +
    + +

    to list all the fonts ImageMagick knows about.

    +

    To test the ImageMagick GUI, in a new shell, type:

    + +
    display -display :0
    +
    + +

    MinGW-specific Build instructions

    + +

    Although you can download and install delegate libraries yourself, many are already available in the GnuWin32 distribution. Download and install whichever delegate libraries you require such as JPEG, PNG, TIFF, etc. Make sure you specify the development headers when you install a package. Next type,

    + +
    $ tar jxvf ImageMagick-6.9.11-?.tar.bz2
    $ cd ImageMagick-6.9.11-62
    $ export CPPFLAGS="-Ic:/Progra~1/GnuWin32/include"
    $ export LDFLAGS="-Lc:/Progra~1/GnuWin32/lib"
    $ ./configure --without-perl
    $ make
    $ sudo make install
    +

    Dealing with Unexpected Problems

    + +

    Chances are the download, configure, build, and install of ImageMagick went flawlessly as it is intended, however, certain systems and environments may cause one or more steps to fail. We discuss a few problems we've run across and how to take corrective action to ensure you have a working release of ImageMagick

    + +
    Build Problems
    +

    If the build complains about missing dependencies (e.g. .deps/source.PLO), add --disable-dependency-tracking to your configure command line.

    + +

    Some systems may fail to link at build time due to unresolved symbols. Try adding the LDFLAGS to the configure command line:

    + +
    configure LDFLAGS='-L/usr/local/lib -R/usr/local/lib'
    +
    + +
    Dynamic Linker Run-time Bindings
    +

    On some systems, ImageMagick may not find its shared library, libMagick.so. Try running the ldconfig with the library path:

    + +
    /sbin/ldconfig /usr/local/lib
    +
    + +

    Solaris and Linux systems have the ldd command which is useful to track which libraries ImageMagick depends on:

    + +
    ldd `which convert`
    +
    + +
    Delegate Libraries
    +

    On occasion you may receive these warnings:

    +
    +no encode delegate for this image format
    +
    +

    This exception indicates that an external delegate library or its headers were not available when ImageMagick was built. To add support for the image format, download and install the requisite delegate library and its header files and reconfigure, rebuild, and reinstall ImageMagick. As an example, lets add support for the JPEG image format. First we install the JPEG RPMS:

    + +
    yum install libjpeg libjpeg-devel
    +
    + +

    Now reconfigure, rebuild, and reinstall ImageMagick. To verify JPEG is now properly supported within ImageMagick, use this command:

    + +
    identify -list format
    +
    + +

    You should see a mode of rw- associated with the JPEG tag. This mode means the image can be read or written and can only support one image per image file.

    + +
    PerlMagick
    +

    If PerlMagick fails to link with a message similar to libperl.a is not found, rerun configure with the --enable-shared or --enable-shared --with-modules options.

    + +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/www/advanced-windows-installation.html b/ImageMagick-6.9.12-44/www/advanced-windows-installation.html new file mode 100644 index 0000000..071720f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/advanced-windows-installation.html @@ -0,0 +1,159 @@ + + + + + + + + + + ImageMagick (legacy) – Advanced Windows Source Installation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Advanced Windows Installation

    +

    This document describes the requirements and instructions to build ImageMagick for Windows on your own machine.

    + +

    Requirements

    +
      +
    • Visual Studio 2013 (or newer)
    • +
    • Git for Windows
    • +
    • AMD APP SDK (optional for OpenCL support)
    • +
    + +

    Install Visual Studio dependencies

    +

    To build ImageMagick with Visual Studio the following components should be installed: +

  1. Desktop development with C++ (workload)
  2. +
  3. Visual C++ ATL for x86 and x64
  4. +
  5. Visual C++ MFC for x86 and x64
  6. + + +

    Naming of these components might differ between version of Visual Studio. The example above use the Visual Studio 2017 names.

    + +

    Clone the dependencies

    +

    The ImageMagick library is build with a number of third party libraries. Run CloneRepositories.cmd to clone these libraries and the ImageMagick library.

    + +

    Build configure.exe

    +

    One of the folders that was created in the previous step is called VisualMagick and this folder contains a folder called configure. This folder contains a solution configure.sln. Open this solution with Visual Studio and start a Release build of the project. This will create a file called configure.exe in the folder. Running this program will start a Wizard that allows configuration of ImageMagick and its individual components.

    + +

    Build ImageMagick

    +

    Depending on which options where chosen when running configure.exe one of the following solutions will be created in the VisualMagick folder:

    + +
      +
    • VisualDynamicMT.sln (Dynamic Multi-threaded DLL runtimes)
    • +
    • VisualStaticMTD.sln (Static Multi-threaded DLL runtimes)
    • +
    • VisualStaticMT.sln (Static Multi-threaded runtimes)
    • +
    + +

    Open the solution to start building ImageMagick. The binaries will be created in the VisualMagick\bin folder.

    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/animate.html b/ImageMagick-6.9.12-44/www/animate.html new file mode 100644 index 0000000..2d97ca5 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/animate.html @@ -0,0 +1,576 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Animate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Animation Viewer

    +

    Example UsageOption Summary

    + +

    Use the animate program to animate an image sequence on any X server. See Command Line Processing for advice on how to structure your animate command or see below for example usages of the command.

    + +

    Example Usage

    + +

    We list a few examples of the animate command here to illustrate its usefulness and ease of use. To get started, lets animate an image sequence in the GIF format:

    + +
    animate movie.gif
    +
    + +

    To animate a directory of JPEG images, use:

    + +
    animate *.jpg
    +
    + +

    You can find additional examples of using animate in Examples of ImageMagick Usage.

    + + +

    Option Summary

    + +

    The animate command recognizes these options. Click on an option to get more details about how that option works.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    -alphaon, activate, off, deactivate, set, opaque, copy", +transparent, extract, background, or shape the alpha channel
    -antialiasremove pixel-aliasing
    -authenticate valuedecrypt image with this password
    -backdropbackground color
    -background colorbackground color
    -border geometrysurround image with a border of color
    -bordercolor colorborder color
    -channel typeapply option to select image channels
    -clipclip along the first path from the 8BIM profile
    -clip-path idclip along a named path from the 8BIM profile
    -coalescemerge a sequence of images
    -colormap typeShared or Private
    -colors valuepreferred number of colors in the image
    -colorspace typeset image colorspace
    -comment stringannotate image with comment
    -compress typeimage compression type
    -contrastenhance or reduce the image contrast
    -crop geometrypreferred size and location of the cropped image
    -debug eventsanimate copious debugging information
    -decipher filenameconvert cipher pixels to plain
    -define format:optiondefine one or more image format options
    -delay centisecondsanimate the next image after pausing
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -despecklereduce the speckles within an image
    -display serverget image or font from this X server
    -dispose methodlayer disposal method
    -dither methodapply error diffusion to image
    -edge radiusapply a filter to detect edges in the image
    -endian typeendianness (MSB or LSB) of the image
    -enhanceapply a digital filter to enhance a noisy image
    -extract geometryextract area from image
    -filter typeuse this filter when resizing an image
    -flattenflatten a sequence of images
    -flipflip image in the vertical direction
    -flopflop image in the horizontal direction
    -frame geometrysurround image with an ornamental border
    -gamma valuelevel of gamma correction
    -geometry geometrypreferred size or location of the image
    -gravity geometryhorizontal and vertical backdrop placement
    -helpprint program options
    -identifyidentify the format and characteristics of the image
    -immutable typeprohibit image edits
    -interlace typetype of image interlacing scheme
    -interpolate methodpixel color interpolation method
    -label nameassign a label to an image
    -limit type valuepixel cache resource limit
    -log formatformat of debugging information
    -map filenametransform image colors to match this set of colors
    -mattecolor colorframe color
    -monitormonitor progress
    -monochrometransform image to black and white
    -negatereplace each pixel with its complementary color
    -page geometrysize and location of an image canvas (setting)
    -profile filenameadd, delete, or apply an image profile
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -raise valuelighten/darken image edges to create a 3-D effect
    -regard-warningspay attention to warning messages.
    -remote commandexecute a command in an remote animate process
    -resample geometrychange the resolution of an image
    -resize geometryresize the image
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -roll geometryroll an image vertically or horizontally
    -rotate degreesapply Paeth rotation to the image
    -sample geometryscale image with pixel sampling
    -sampling-factor geometryhorizontal and vertical sampling factor
    -scene valueimage scene number
    -segment valuessegment an image
    -seed valueseed a new sequence of pseudo-random numbers
    -set attribute valueset an image attribute
    -sharpen geometrysharpen the image
    -size geometrywidth and height of image
    -stripstrip image of all profiles and comments
    -thumbnail geometrycreate a thumbnail of the image
    -transparent-color colortransparent color
    -trimtrim image edges
    -update secondsdetect when image file is modified and reanimate
    -verboseprint detailed information about the image
    -versionprint version information
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    -visualanimate image using this visual type
    -window idanimate images to background of this window
    -window-group idexit program when this window id is destroyed
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/Image++.html b/ImageMagick-6.9.12-44/www/api/Image++.html new file mode 100644 index 0000000..1e279a7 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/Image++.html @@ -0,0 +1,3245 @@ + + + + + + + + + + ImageMagick - Magick++, C++ API: Image Class + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +

    Magick::Image Class

    + +
    +

    Image is the primary object in Magick++ and represents +a single image frame (see design ). The +STL interface must be used to operate on +image sequences or images (e.g. of format GIF, TIFF, MIFF, Postscript, +& MNG) which are comprised of multiple image frames. Individual +frames of a multi-frame image may be requested by adding array-style +notation to the end of the file name (e.g. "animation.gif[3]" retrieves +the fourth frame of a GIF animation. Various image manipulation +operations may be applied to the image. Attributes may be set on the +image to influence the operation of the manipulation operations. The Pixels class provides low-level access to +image +pixels. As a convenience, including <Magick++.h> +is sufficient in order to use the complete Magick++ API. The Magick++ +API is enclosed within the Magick namespace so you must either +add the prefix " Magick:: " to each class/enumeration name or +add +the statement " using namespace Magick;" after including the Magick++.h +header.

    +

    The preferred way to allocate Image objects is via automatic +allocation (on the stack). There is no concern that allocating Image +objects on the stack will excessively enlarge the stack since Magick++ +allocates all large data objects (such as the actual image data) from +the heap. Use of automatic allocation is preferred over explicit +allocation (via new) since it is much less error prone and +allows use of C++ scoping rules to avoid memory leaks. Use of automatic +allocation allows Magick++ objects to be assigned and copied just like +the C++ intrinsic data types (e.g. 'int '), leading to clear and +easy to read code. Use of automatic allocation leads to naturally +exception-safe code since if an exception is thrown, the object is +automagically deallocated once the stack unwinds past the scope of the +allocation (not the case for objects allocated via new ).

    +

    Image is very easy to use. For example, here is a the source to a +program which reads an image, crops it, and writes it to a new file +(the +exception handling is optional but strongly recommended):

    +
    +#include <Magick++.h> 
    +#include <iostream> 
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +
    +  // Construct the image object. Separating image construction from the 
    +  // the read operation ensures that a failure to read the image file 
    +  // doesn't render the image object useless. 
    +  Image image;
    +  try { 
    +    // Read a file into image object 
    +    image.read( "girl.gif" );
    +
    +    // Crop the image to specified size (width, height, xOffset, yOffset)
    +    image.crop( Geometry(100,100, 100, 100) );
    +
    +    // Write the image to a file 
    +    image.write( "x.gif" ); 
    +  } 
    +  catch( Exception &error_ ) 
    +    { 
    +      cout << "Caught exception: " << error_.what() << endl; 
    +      return 1; 
    +    } 
    +  return 0; 
    +}
    +
    +The following is the source to a program which illustrates the use of +Magick++'s efficient reference-counted assignment and copy-constructor +operations which minimize use of memory and eliminate unnecessary copy +operations (allowing Image objects to be efficiently assigned, and +copied into containers). The program accomplishes the +following: +
      +
    1. Read master image.
    2. +
    3. Assign master image to second image.
    4. +
    5. Resize second image to the size 640x480.
    6. +
    7. Assign master image to a third image.
    8. +
    9. Resize third image to the size 800x600.
    10. +
    11. Write the second image to a file.
    12. +
    13. Write the third image to a file.
    14. +
    +
    +#include  
    +#include  
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +
    +  Image master("horse.jpg"); 
    +  Image second = master; 
    +  second.resize("640x480"); 
    +  Image third = master; 
    +  third.resize("800x600"); 
    +  second.write("horse640x480.jpg"); 
    +  third.write("horse800x600.jpg"); 
    +  return 0; 
    +}
    +
    +During the entire operation, a maximum of three images exist in memory +and the image data is never copied. +

    The following is the source for another simple program which creates +a 100 by 100 pixel white image with a red pixel in the center and +writes it to a file:

    +
    +#include  
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +  Image image( "100x100", "white" ); 
    +  image.pixelColor( 49, 49, "red" ); 
    +  image.write( "red_pixel.png" ); 
    +  return 0; 
    +}
    +
    +If you wanted to change the color image to grayscale, you could add the +lines: +
    +image.quantizeColorSpace( GRAYColorspace ); 
    +image.quantizeColors( 256 ); 
    +image.quantize( );
    +
    +

    +

    or, more simply:

    +
    + image.type( GrayscaleType );
    +
    +

    prior to writing the image.

    +
    +

    BLOBs

    +
    +While encoded images (e.g. JPEG) are most often written-to and +read-from a disk file, encoded images may also reside in memory. +Encoded +images in memory are known as BLOBs (Binary Large OBjects) and may be +represented using the Blob class. The encoded +image may be initially placed in memory by reading it directly from a +file, reading the image from a database, memory-mapped from a disk +file, or could be written to memory by Magick++. Once the encoded image +has been placed within a Blob, it may be read into a Magick++ Image via +a constructor or read() +. Likewise, a Magick++ image may be written to a Blob via write() . +

    An example of using Image to write to a Blob follows:
    +

    +
    +#include  
    +using namespace std; 
    +using namespace Magick; 
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +
    +  // Read GIF file from disk 
    +  Image image( "giraffe.gif" );
    +  // Write to BLOB in JPEG format 
    +  Blob blob; 
    +  image.magick( "JPEG" ) // Set JPEG output format 
    +  image.write( &blob );
    +
    +  [ Use BLOB data (in JPEG format) here ]
    +
    +  return 0; 
    +}
    +
    +


    +likewise, to read an image from a Blob, you could use one of the +following examples:

    +

    [ Entry condition for the following examples +is that data is pointer to encoded image data and length +represents the size of the data ]

    +
    +Blob blob( data, length ); 
    +Image image( blob );
    +
    +or +
    +Blob blob( data, length ); 
    +Image image; 
    +image.read( blob);
    +
    +some images do not contain their size or format so the size and format must be specified in advance: +
    +Blob blob( data, length ); 
    +Image image; 
    +image.size( "640x480") 
    +image.magick( "RGBA" ); 
    +image.read( blob);
    +
    +
    +

    Constructors

    +
    +Image may be constructed in a number of ways. It may be constructed +from a file, a URL, or an encoded image (e.g. JPEG) contained in an +in-memory BLOB . The available Image +constructors are shown in the following table:
    +
    + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Image Constructors
      +
      Signature
      +
      +
      Description
      +
      const std::string &imageSpec_Construct Image by reading from file or URL +specified by imageSpec_. Use array notation (e.g. filename[9]) +to select a specific scene from a multi-frame image.
      const Geometry &size_, const Color &color_Construct a blank image canvas of specified +size and color
      const Blob &blob_Construct Image by reading from +encoded image data contained in an in-memory BLOB +. Depending on the constructor arguments, the Blob size +, depth , magick (format) +may +also be specified. Some image formats require that size be specified. +The default ImageMagick uses for depth depends on the compiled-in +Quantum size (8 or 16). If ImageMagick's Quantum size does not +match that of the image, the depth may need to be specified. +ImageMagick can usually automagically detect the image's format. +When a format can't be automagically detected, the format (magick ) must be specified.
      const Blob +&blob_, const Geometry &size_
      const Blob +&blob_, const Geometry &size, +size_t depth
      const Blob +&blob_, const Geometry &size, +size_t depth_, const string &magick_
      const Blob +&blob_, const Geometry &size, +const +string &magick_
      const size_t width_,
      + const size_t height_,
      + std::string map_,
      + const +StorageType type_,
      + const void *pixels_
      Construct a new Image based on an array of +image pixels. The pixel data must be in scanline order top-to-bottom. +The data can be character, short int, integer, float, or double. Float +and double require the pixels to be normalized [0..1]. The other types +are [0..MaxRGB]. For example, to create a 640x480 image from +unsigned red-green-blue character data, use +

      Image image( 640, 480, "RGB", +0, pixels );

      +

      The parameters are as follows:
      + + + + + + + + + + + + + + + + + + + + + + + + +
      width_Width in pixels of the image.
      height_Height in pixels of the image.
      map_This character string can be any +combination or order of R = red, G = green, B = blue, A = alpha, C = +cyan, Y = yellow M = magenta, and K = black. The ordering reflects the +order of the pixels in the supplied pixel array.
      type_Pixel +storage type (CharPixel, ShortPixel, IntegerPixel, FloatPixel, or +DoublePixel)
      pixels_This array of values contain the pixel +components as defined by the map_ and type_ parameters. The length of +the arrays must equal the area specified by the width_ and height_ +values and type_ parameters.
      +

      +
    +
    +

    Image Manipulation Methods

    +
    +Image supports access to all the single-image (versus +image-list) manipulation operations provided by the ImageMagick +library. If you +must process a multi-image file (such as an animation), the STL interface , which provides a multi-image +abstraction on top of Image, must be used. +

    Image manipulation methods are very easy to use. For example:

    +
    +Image image; 
    +image.read("myImage.tiff"); 
    +image.addNoise(GaussianNoise); 
    +image.write("myImage.tiff");
    +
    +adds gaussian noise to the image file "myImage.tiff". +

    The operations supported by Image are shown in the following table:
    + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Image Image Manipulation Methods
      MethodSignature(s)Description
      +
      adaptiveThreshold
      +
      +
      size_t width, size_t +height, size_t offset = 0
      +
      Apply adaptive thresholding to +the image. Adaptive thresholding is useful if the ideal threshold level +is not known in advance, or if the illumination gradient is not +constant +across the image. Adaptive thresholding works by evaluating the mean +(average) of a pixel region (size specified by width and height) +and using the mean as the thresholding value. In order to remove +residual noise from the background, the threshold may be adjusted by +subtracting a constant offset (default zero) from the mean to +compute the threshold.
      +
      +
      addNoise
      +
      NoiseType +noiseType_Add noise to image with specified noise type.
      addNoiseChannel
      +
      const ChannelType +channel_, const NoiseType noiseType_
      +
      Add noise to an image +channel with the specified noise type. The channel_ parameter specifies the +channel to add noise to. The noiseType_ parameter +specifies the type of noise.
      +
      affineTransform
      +
      const DrawableAffine +&affine
      +
      Transform image by +specified affine (or free transform) matrix.
      +
      +
      annotate
      +
      const std::string &text_, const Geometry &location_Annotate using specified text, and placement +location
      string text_, const Geometry +&boundingArea_, GravityType +gravity_Annotate using specified text, bounding area, +and placement gravity. If boundingArea_ is invalid, then +bounding area is entire image.
      const std::string &text_, const Geometry &boundingArea_, GravityType gravity_, double +degrees_, Annotate with text using specified text, +bounding area, placement gravity, and rotation. If boundingArea_ +is invalid, then bounding area is entire image.
      const std::string &text_, GravityType gravity_Annotate with text (bounding area is entire +image) and placement gravity.
      +
      blur
      +
      const double radius_ = 1, const double sigma_ += 0.5Blur image. The radius_ parameter +specifies the radius of the Gaussian, in pixels, not counting the +center +pixel. The sigma_ parameter specifies the standard +deviation of the Laplacian, in pixels.
      blurChannel
      +
      const ChannelType +channel_, const double radius_ = 0.0, const double sigma_ = 1.0
      +
      Blur an image +channel. The channel_ +parameter specifies the channel to blur. The radius_ parameter +specifies the radius of the Gaussian, in pixels, not counting the +center +pixel. The sigma_ parameter specifies the standard +deviation of the Laplacian, in pixels.
      +
      border
      +
      const Geometry +&geometry_ = "6x6+0+0"Border image (add border to image). The +color of the border is specified by the borderColor attribute.
      +
      cdl
      +
      const std::string &cdl_color correct with a color decision list. See http://en.wikipedia.org/wiki/ASC_CDL for details.
      +
      channel
      +
      ChannelType +layer_Extract channel from image. Use this option +to extract a particular channel from the image. MatteChannel + for example, is useful for extracting the opacity values +from an image.
      +
      charcoal
      +
      const double radius_ = 1, const double sigma_ += 0.5Charcoal effect image (looks like charcoal +sketch). The radius_ parameter specifies the radius of the +Gaussian, in pixels, not counting the center pixel. The sigma_ +parameter specifies the standard deviation of the Laplacian, in pixels.
      +
      chop
      +
      const Geometry +&geometry_Chop image (remove vertical or horizontal +subregion of image)
      +
      colorize
      +
      const unsigned int opacityRed_, const +unsigned int opacityGreen_, const unsigned int opacityBlue_, const +Color &penColor_Colorize image with pen color, using +specified percent opacity for red, green, and blue quantums.
      +
      colorMatrix
      +
      const size_t order_, const double *color_matrix_apply color correction to the image.
      +
      comment
      +
      const std::string &comment_Comment image (add comment string to +image). By default, each image is commented with its file name. +Use this method to assign a specific comment to the +image. Optionally you can include the image filename, type, +width, height, or other image attributes by embedding special format characters.
      compare
      +
      const Image &reference_
      +
      Compare current image with +another image. Sets meanErrorPerPixel +, normalizedMaxError , and normalizedMeanError in the current +image. False is returned if the images are identical. An ErrorOption +exception is thrown if the reference image columns, rows, colorspace, +or +matte differ from the current image.
      +
      +
      composite
      +
      const Image +&compositeImage_, ssize_t xOffset_, ssize_t yOffset_, CompositeOperator +compose_ = InCompositeOpCompose an image onto the current image at +offset specified by xOffset_, yOffset_ using the +composition algorithm specified by compose_.
      const Image +&compositeImage_, const Geometry +&offset_, CompositeOperator +compose_ = InCompositeOpCompose an image onto the current image at +offset specified by offset_ using the composition algorithm +specified by compose_ .
      const Image +&compositeImage_, GravityType +gravity_, CompositeOperator +compose_ = InCompositeOpCompose an image onto the current image with +placement specified by gravity_ using the composition +algorithm +specified by compose_.
      +
      contrast
      +
      size_t sharpen_Contrast image (enhance intensity differences +in image)
      +
      convolve
      +
      size_t order_, const double *kernel_Convolve image. Applies a user-specified +convolution to the image. The order_ parameter represents the +number of columns and rows in the filter kernel, and kernel_ +is a two-dimensional array of doubles representing the convolution +kernel to apply.
      +
      crop
      +
      const Geometry +&geometry_Crop image (subregion of original image)
      +
      cycleColormap
      +
      int amount_Cycle image colormap
      +
      despeckle
      +
      voidDespeckle image (reduce speckle noise)
      +
      display
      +
      voidDisplay image on screen.
      + Caution: if +an image format is is not compatible with the display visual (e.g. +JPEG on a colormapped display) then the original image will be +altered. Use a copy of the original if this is a problem.
      +
      distort
      +
      const DistortImageMethod method, const size_t number_arguments, const double *arguments, const bool bestfit = false Distort image. Applies a user-specified +distortion to the image.
      +
      draw
      +
      const Drawable +&drawable_Draw shape or text on image.
      const std::list<Drawable +> &drawable_Draw shapes or text on image using a set of +Drawable objects contained in an STL list. Use of this method improves +drawing performance and allows batching draw objects together in a +list for repeated use.
      +
      edge
      +
      size_t radius_ = 0.0Edge image (hilight edges in image). +The radius is the radius of the pixel neighborhood.. Specify a radius +of zero for automatic radius selection.
      +
      emboss
      +
      const double radius_ = 1, const double sigma_ += 0.5Emboss image (hilight edges with 3D effect). +The radius_ parameter specifies the radius of the Gaussian, in +pixels, not counting the center pixel. The sigma_ +parameter specifies the standard deviation of the Laplacian, in pixels.
      +
      enhance
      +
      voidEnhance image (minimize noise)
      +
      equalize
      +
      voidEqualize image (histogram equalization)
      +
      erase
      +
      voidSet all image pixels to the current +background color.
      +
      extent
      const Geometry &geometry_extends the image as defined by the geometry, gravity, and image background color.
      const Geometry +&geometry_, const Color &backgroundColor_
      const Geometry &geometry_, const GravityType +&gravity_extends the image as defined by the geometry, gravity, and image background color.
      const Geometry +&geometry_, const Color &backgroundColor_, +const GravityType &gravity_
      +
      flip
      +
      voidFlip image (reflect each scanline in the +vertical direction)
      +
      floodFill- +
      + Color
      +
      ssize_t x_, ssize_t y_, const Color &fillColor_Flood-fill color across pixels +that match the color of the target pixel and are neighbors of the +target pixel. Uses current fuzz setting when determining color match.
      const Geometry +&point_, const Color &fillColor_
      ssize_t x_, ssize_t y_, const Color &fillColor_, const Color +&borderColor_Flood-fill color across pixels +starting at target-pixel and stopping at pixels matching specified +border color. Uses current fuzz setting when determining color match.
      const Geometry +&point_, const Color &fillColor_, +const Color &borderColor_
      floodFillOpacityconst long x_, const long y_, const unsigned int +opacity_, const PaintMethod method_Floodfill pixels matching color (within fuzz +factor) of target pixel(x,y) with replacement opacity value using +method.
      +
      floodFill- +
      + Texture
      +
      ssize_t x_, ssize_t y_, const +Image &texture_Flood-fill texture across pixels +that match the color of the target pixel and are neighbors of the +target pixel. Uses current fuzz setting when determining color match.
      const Geometry +&point_, const Image &texture_
      ssize_t x_, ssize_t y_, const Image +&texture_, const Color &borderColor_Flood-fill texture across pixels +starting at target-pixel and stopping at pixels matching specified +border color. Uses current fuzz setting when determining color match.
      const Geometry +&point_, const Image &texture_, const +Color +&borderColor_
      +
      flop
      +
      void Flop image (reflect each scanline in the +horizontal direction)
      +
      frame
      +
      const Geometry +&geometry_ = "25x25+6+6"Add decorative frame around image
      size_t width_, size_t height_, +ssize_t x_, ssize_t y_, ssize_t innerBevel_ = 0, ssize_t outerBevel_ = 0
      +
      fx
      +
      const std::string expression, const Magick::ChannelType channelFx image. Applies a mathematical +expression to the image.
      +
      gamma
      +
      double gamma_Gamma correct image (uniform red, green, and +blue correction).
      double gammaRed_, double gammaGreen_, double +gammaBlue_Gamma correct red, green, and blue channels +of image.
      +
      gaussianBlur
      +
      const double width_, const double sigma_Gaussian blur image. The number of neighbor +pixels to be included in the convolution mask is specified by +'width_'. For example, a width of one gives a (standard) 3x3 +convolution mask. The standard deviation of the gaussian bell curve is +specified by 'sigma_'.
      gaussianBlurChannel
      +
      const ChannelType +channel_, const double radius_ = 0.0, const double sigma_ = 1.0
      +
      Gaussian blur +an image channel. The channel_ parameter specifies the +channel to blur. The number of neighbor +pixels to be included in the convolution mask is specified by +'width_'. For example, a width of one gives a (standard) 3x3 +convolution mask. The standard deviation of the gaussian bell curve is +specified by 'sigma_'.
      haldClut
      +
      const Image &reference_
      +
      apply a Hald color lookup table to the image.
      +
      +
      implode
      +
      const double factor_Implode image (special effect)
      +
      inverseFourierTransform
      +
      const Image &phaseImage_, const bool magnitude_implements the inverse discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.
      +
      label
      +
      const string &label_Assign a label to an image. Use this option +to assign a specific label to the image. Optionally +you can include the image filename, type, width, height, or scene +number in the label by embedding +special format characters. If the first character of string is @, +the +image label is read from a file titled by the remaining characters in +the string. When converting to Postscript, use this option to +specify a header string to print above the image.
      level
      +
      const double black_point, +const double white_point, const double mid_point=1.0
      +
      Level image. Adjust the +levels of the image by scaling the colors falling between specified +white and black points to the full available quantum range. The +parameters provided represent the black, mid (gamma), and white +points. The black point specifies the darkest color in the image. +Colors darker than the black point are set to zero. Mid point (gamma) +specifies a gamma correction to apply to the image. White point +specifies the lightest color in the image. Colors brighter than +the white point are set to the maximum quantum value. The black and +white point have the valid range 0 to MaxRGB while mid (gamma) has a +useful range of 0 to ten.
      +
      levelChannel
      +
      const ChannelType +channel, const double black_point, const double white_point, const +double mid_point=1.0
      +
      Level image channel. +Adjust the levels of the image channel by scaling the values falling +between specified white and black points to the full available quantum +range. The parameters provided represent the black, mid (gamma), and +white points. The black point specifies the darkest color in the image. +Colors darker than the black point are set to zero. Mid point (gamma) +specifies a gamma correction to apply to the image. White point +specifies the lightest color in the image. Colors brighter than the +white point are set to the maximum quantum value. The black and white +point have the valid range 0 to MaxRGB while mid (gamma) has a useful +range of 0 to ten.
      +
      +
      magnify
      +
      voidMagnify image by integral size
      +
      map
      +
      const Image &mapImage_ , bool dither_ = +falseRemap image colors with closest color from +reference image. Set dither_ to true in to apply +Floyd/Steinberg +error diffusion to the image. By default, color reduction chooses an +optimal set of colors that best represent the original +image. Alternatively, you can choose a +particular set of colors from an image file +with this option.
      +
      matteFloodfill
      +
      const Color +&target_, const unsigned int opacity_, const ssize_t x_, const +ssize_t +y_, PaintMethod method_Floodfill designated area with a replacement +opacity value.
      medianFilterconst double radius_ = 0.0Filter image by replacing each pixel +component with the median color in a circular neighborhood
      +
      mergeLayers
      +
      LayerMethod +noiseType_handle multiple images forming a set of image layers or animation frames.
      +
      minify
      +
      voidReduce image by integral size
      modifyImagevoidPrepare to update image. Ensures that there +is only one reference to the underlying image so that the underlying +image may be safely modified without effecting previous generations of +the image. Copies the underlying image to a new image if necessary.
      +
      modulate
      +
      double brightness_, double saturation_, +double hue_Modulate percent hue, saturation, and +brightness of an image. Modulation of saturation and brightness is as a +ratio of the current value (1.0 for no change). Modulation of hue is an +absolute rotation of -180 degrees to +180 degrees from the current +position corresponding to an argument range of 0 to 2.0 (1.0 for no +change).
      motionBlur
      +
      const double radius_, +const double sigma_, const double angle_
      +
      Motion blur image with +specified blur factor. The radius_ parameter specifies the radius of +the Gaussian, in pixels, not counting the center pixel. The +sigma_ parameter specifies the standard deviation of the Laplacian, in +pixels. The angle_ parameter specifies the angle the object appears to +be coming from (zero degrees is from the right).
      +
      +
      negate
      +
      bool grayscale_ = falseNegate colors in image. Replace every +pixel with its complementary color (white becomes black, yellow becomes +blue, etc.). Set grayscale to only negate grayscale values in +image.
      +
      normalize
      +
      voidNormalize image (increase contrast by +normalizing the pixel values to span the full range of color values).
      +
      oilPaint
      +
      size_t radius_ = 3Oilpaint image (image looks like oil painting)
      +
      opacity
      +
      unsigned int opacity_Set or attenuate the opacity channel in the +image. If the image pixels are opaque then they are set to the +specified +opacity value, otherwise they are blended with the supplied opacity +value. The value of opacity_ ranges from 0 (completely opaque) to + MaxRGB +. The defines OpaqueOpacity and TransparentOpacity are +available to specify completely opaque or completely transparent, +respectively.
      +
      opaque
      +
      const Color +&opaqueColor_, const Color &penColor_Change color of pixels matching opaqueColor_ +to specified penColor_.
      +
      ping
      +
      const std::string &imageSpec_Ping is similar to read +except only enough of the image is read to determine the image columns, +rows, and filesize. The columns , + rows , and fileSize +attributes are valid after invoking ping. The image data is not +valid after calling ping.
      const Blob &blob_
      process
      +
      std::string name_, +const ssize_t argc_, char **argv_
      +
      Execute the named +process module, passing any arguments via an argument vector, with +argc_ +specifying the number of arguments in the vector, and argv_ passing the +address of an array of null-terminated C strings which constitute the +argument vector. An exception is thrown if the requested process module +does not exist, fails to load, or fails during execution.
      +
      +
      quantize
      +
      bool measureError_ = falseQuantize image (reduce number of colors). Set +measureError_ to true in order to calculate error attributes.
      +
      raise
      +
      const Geometry +&geometry_ = "6x6+0+0", bool raisedFlag_ = falseRaise image (lighten or darken the edges of +an image to give a 3-D raised or lowered effect)
      +
      read
      +
      const string &imageSpec_Read image into current object
      const Geometry +&size_, const std::string &imageSpec_Read image of specified size into current +object. This form is useful for images that do not specify their size +or to specify a size hint for decoding an image. For example, when +reading a Photo CD, JBIG, or JPEG image, a size request causes the +library to return an image which is the next resolution greater or +equal to the specified size. This may result in memory and time savings.
      const Blob &blob_Read encoded image of specified +size from an in-memory BLOB into current +object. Depending on the method arguments, the Blob size, depth, and +format may also be specified. Some image formats require that size be +specified. The default ImageMagick uses for depth depends on its +Quantum size (8 or 16). If ImageMagick's Quantum size does not +match that of the image, the depth may need to be specified. +ImageMagick can usually automagically detect the image's format. +When +a format can't be automagically detected, the format must be specified.
      const Blob +&blob_, const Geometry &size_
      const Blob +&blob_, const Geometry &size_, +size_t depth_
      const Blob +&blob_, const Geometry &size_, +size_t depth_, const string &magick_
      const Blob +&blob_, const Geometry &size_, +const +string &magick_
      const size_t width_, const size_t +height_, std::string map_, const StorageType type_, const void *pixels_Read image based on an array of image pixels. +The pixel data must be in scanline order top-to-bottom. The data can be +character, short int, integer, float, or double. Float and double +require the pixels to be normalized [0..1]. The other types are +[0..MaxRGB]. For example, to create a 640x480 image from +unsigned red-green-blue character data, use +

      image.read( 640, 480, "RGB", CharPixel, +pixels );

      +

      The parameters are as follows:
      + + + + + + + + + + + + + + + + + + + + + + + + +
      width_Width in pixels of the image.
      height_Height in pixels of the image.
      map_This character string can be any +combination or order of R = red, G = green, B = blue, A = alpha, C = +cyan, Y = yellow M = magenta, and K = black. The ordering reflects the +order of the pixels in the supplied pixel array.
      type_Pixel storage type (CharPixel, +ShortPixel, IntegerPixel, FloatPixel, or DoublePixel)
      pixels_This array of values contain the pixel +components as defined by the map_ and type_ parameters. The length of +the arrays must equal the area specified by the width_ and height_ +values and type_ parameters.
      +

      +
      +
      reduceNoise
      +
      const double order_reduce noise in image using a noise peak elimination filter.
      randomThreshold
      +
      const Geometry +&thresholds_
      +
      Random threshold the +image. Changes the value of individual pixels based on the intensity of +each pixel compared to a random threshold. The result is a +low-contrast, two color image. The thresholds_ argument is a +geometry containing LOWxHIGH thresholds. If the string contains +2x2, 3x3, or 4x4, then an ordered dither of order 2, 3, or 4 will be +performed instead. This is a very fast alternative to 'quantize' based +dithering.
      +
      randomThresholdChannel
      +
      const Geometry +&thresholds_, const ChannelType channel_
      +
      Random threshold an +image channel. Similar to randomThreshold() +but restricted to the specified channel.
      +
      +
      roll
      +
      int columns_, ssize_t rows_Roll image (rolls image vertically and +horizontally) by specified number of columns and rows)
      +
      rotate
      +
      double degrees_Rotate image counter-clockwise by specified +number of degrees.
      +
      sample
      +
      const Geometry +&geometry_ Resize image by using pixel sampling algorithm
      +
      scale
      +
      const Geometry +&geometry_Resize image by using simple ratio algorithm
      +
      segment
      +
      double clusterThreshold_ = 1.0,
      + double smoothingThreshold_ = 1.5
      Segment (coalesce similar image components) +by analyzing the histograms of the color components and identifying +units that are homogeneous with the fuzzy c-means technique. Also uses quantizeColorSpace +and verbose image attributes. Specify clusterThreshold_ +, +as the number of pixels each cluster must +exceed +the cluster threshold to be considered valid. SmoothingThreshold_ +eliminates noise in the second derivative of the histogram. As +the +value is increased, you can expect a smoother +second derivative. The default is 1.5.
      +
      shade
      +
      double azimuth_ = 30, double elevation_ = 30, +
      + bool colorShading_ = false
      Shade image using distant light source. +Specify azimuth_ and elevation_ as the +position of the light source. By default, the shading +results as a grayscale image.. Set colorShading_ to true +to +shade the red, green, and blue components of the image.
      +
      shadow
      +
      const double percent_opacity = 80, const double sigma_ += 0.5, const ssize_t x_ = 0, const ssize_t y_ = 0simulate an image shadow
      +
      sharpen
      +
      const double radius_ = 1, const double sigma_ += 0.5Sharpen pixels in image. The radius_ +parameter specifies the radius of the Gaussian, in pixels, not counting +the center pixel. The sigma_ parameter specifies the +standard deviation of the Laplacian, in pixels.
      sharpenChannel
      +
      const ChannelType +channel_, const double radius_ = 0.0, const double sigma_ = 1.0
      +
      Sharpen pixel +quantums in an image channel The channel_ parameter specifies the +channel to sharpen.. The radius_ +parameter specifies the radius of the Gaussian, in pixels, not counting +the center pixel. The sigma_ parameter specifies the +standard deviation of the Laplacian, in pixels.
      +
      shave
      +
      const Geometry &geometry_Shave pixels from image edges.
      +
      shear
      +
      double xShearAngle_, double yShearAngle_Shear image (create parallelogram by sliding +image by X or Y axis). Shearing slides one edge of an image along +the X or Y axis, creating a +parallelogram. An X direction shear slides an edge along the X +axis, while a Y direction shear slides +an edge along the Y axis. The amount of the shear is controlled +by a shear angle. For X direction shears, x +degrees is measured relative to the Y axis, and similarly, for Y +direction shears y degrees is measured relative to the X +axis. Empty triangles left over from shearing the image are +filled with the color defined as borderColor.
      +
      solarize
      +
      double factor_ = 50.0Solarize image (similar to effect seen when +exposing a photographic film to light during the development process)
      +
      splice
      +
      const Geometry +&geometry_splice the background color into the image
      +
      spread
      +
      size_t amount_ = 3Spread pixels randomly within image by +specified amount
      +
      stegano
      +
      const Image &watermark_Add a digital watermark to the image (based +on second image)
      +
      sparseColor
      +
      const ChannelType channel, const SparseColorMethod method, const size_t number_arguments, const double *arguments Sparse color image, given a set of coordinates, interpolates the colors found at those coordinates, across the whole image, using various methods.
      +
      statistics
      +
      ImageStatistics *statisticsObtain image statistics. Statistics are normalized to the range of 0.0 to 1.0 and are output to the specified ImageStatistics structure. The structure includes members maximum, minimum, mean, standard_deviation, and variance for each of these channels: red, green, blue, and opacity (e.g. statistics->red.maximum).
      +
      stereo
      +
      const Image &rightImage_Create an image which appears in stereo when +viewed with red-blue glasses (Red image on left, blue on right)
      +
      swirl
      +
      double degrees_Swirl image (image pixels are rotated by +degrees)
      +
      texture
      +
      const Image &texture_Layer a texture on pixels matching image +background color.
      +
      threshold
      +
      double threshold_Threshold image
      +
      transform
      +
      const Geometry +&imageGeometry_Transform image based on image +and crop geometries. Crop geometry is optional.
      const Geometry +&imageGeometry_, const Geometry +&cropGeometry_
      +
      transparent
      +
      const Color +&color_Add matte image to image, setting pixels +matching color to transparent.
      +
      trim
      +
      voidTrim edges that are the background color from +the image.
      +
      unsharpmask
      +
      double radius_, double sigma_, double +amount_, double threshold_Sharpen the image using the unsharp mask +algorithm. The radius_ +parameter specifies the radius of the Gaussian, in pixels, not +counting the center pixel. The sigma_ parameter specifies the +standard deviation of the Gaussian, in pixels. The amount_ +parameter specifies the percentage of the difference between the +original and the blur image that is added back into the original. The threshold_ +parameter specifies the threshold in pixels needed to apply the +difference amount.
      unsharpmaskChannel
      +
      const ChannelType +channel_, const double radius_, const double sigma_, const double +amount_, const double threshold_
      +
      Sharpen an image +channel using the unsharp mask algorithm. The channel_ parameter specifies the +channel to sharpen. The radius_ +parameter specifies the radius of the Gaussian, in pixels, not +counting the center pixel. The sigma_ parameter specifies the +standard deviation of the Gaussian, in pixels. The amount_ +parameter specifies the percentage of the difference between the +original and the blur image that is added back into the original. The threshold_ +parameter specifies the threshold in pixels needed to apply the +difference amount.
      +
      wave
      +
      double amplitude_ = 25.0, double wavelength_ += 150.0Alter an image along a sine wave.
      +
      write
      +
      const string &imageSpec_Write image to a file using filename imageSpec_ +.
      + Caution: if +an image format is selected which is capable of supporting fewer +colors than the original image or quantization has been requested, the +original image will be quantized to fewer colors. Use a copy of the +original if this is a problem.
      Blob *blob_Write image to a in-memory BLOB stored in blob_. The magick_ +parameter specifies the image format to write (defaults to magick ). The depth_ parameter species the image +depth (defaults to depth ).
      + Caution: if +an image format is selected which is capable of supporting fewer +colors than the original image or quantization has been requested, the +original image will be quantized to fewer colors. Use a copy of the +original if this is a problem.
      Blob *blob_, +std::string &magick_
      Blob *blob_, +std::string &magick_, size_t depth_
      const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_, const std::string &map_, +const StorageType type_, void *pixels_Write pixel data into a buffer you supply. +The data is saved either as char, short int, integer, float or double +format in the order specified by the type_ parameter. For example, we +want to extract scanline 1 of a 640x480 image as character data in +red-green-blue order: +

      image.write(0,0,640,1,"RGB",0,pixels); +

      +

      The parameters are as follows:
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      x_Horizontal ordinate of left-most +coordinate of region to extract.
      y_Vertical ordinate of top-most +coordinate of region to extract.
      columns_Width in pixels of the region to +extract.
      rows_Height in pixels of the region to +extract.
      map_This character string can be any +combination or order of R = red, G = green, B = blue, A = alpha, C = +cyan, Y = yellow, M = magenta, and K = black. The ordering reflects +the order of the pixels in the supplied pixel array.
      type_Pixel storage type (CharPixel, +ShortPixel, IntegerPixel, FloatPixel, or DoublePixel)
      pixels_This array of values contain the pixel +components as defined by the map_ and type_ parameters. The length of +the arrays must equal the area specified by the width_ and height_ +values and type_ parameters.
      +

      +
      +
      resize
      +
      const Geometry +&geometry_Resize image to specified size.
    +

    +
    +

    Image Attributes

    +
    +Image attributes are set and obtained via methods in Image. Except for +methods which accept pointer arguments (e.g. chromaBluePrimary) +all methods return attributes by value. +

    Image attributes are easily used. For example, to set the resolution +of the TIFF file "file.tiff" to 150 dots-per-inch (DPI) in both the +horizontal and vertical directions, you can use the following example +code:

    +
    +string filename("file.tiff"); 
    +Image image; 
    +image.read(filename); 
    +image.resolutionUnits(PixelsPerInchResolution); 
    +image.density(Geometry(150,150));   // could also use image.density("150x150") 
    +image.write(filename)
    +
    +The supported image attributes and the method arguments required to +obtain them are shown in the following table:
    + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Image Attributes
      +
      Function
      +
      +
      Type
      +
      +
      Get Signature
      +
      +
      Set Signature
      +
      +
      Description
      +
      +
      adjoin
      +
      boolvoidbool flag_Join images into a single multi-image file.
      +
      antiAlias
      +
      boolvoidbool flag_Control antialiasing of rendered Postscript +and Postscript or TrueType fonts. Enabled by default.
      +
      animation- +
      + Delay
      +
      size_t (0 to 65535)voidsize_t delay_Time in 1/100ths of a second (0 to 65535) +which must expire before displaying the next image in an animated +sequence. This option is useful for regulating the animation of a +sequence of GIF images within Netscape.
      +
      animation- +
      + Iterations
      +
      size_tvoidsize_t iterations_Number of iterations to loop an animation +(e.g. Netscape loop extension) for.
      attribute
      +
      string
      +
      const +std::string name_
      +
      const +std::string name_, const std::string value_An arbitrary named +image attribute. Any number of named attributes may be attached to the +image. For example, the image comment is a named image attribute with +the name "comment". EXIF tags are attached to the image as named +attributes. Use the syntax "EXIF:<tag>" to request an EXIF tag +similar to "EXIF:DateTime".
      +
      +
      background- +
      + Color
      +
      Color voidconst Color +&color_Image background color
      +
      background- +
      + Texture
      +
      stringvoidconst string &texture_Image file name to use as the background +texture. Does not modify image pixels.
      +
      baseColumns
      +
      size_tvoid Base image width (before transformations)
      +
      baseFilename
      +
      stringvoid Base image filename (before transformations)
      +
      baseRows
      +
      size_tvoid Base image height (before transformations)
      +
      borderColor
      +
      Color void const Color +&color_Image border color
      boundingBoxGeometryvoid Return smallest bounding box enclosing +non-border pixels. The current fuzz value is used when discriminating +between pixels. This is the crop bounding box used by +crop(Geometry(0,0)).
      +
      boxColor
      +
      Color voidconst Color +&boxColor_Base color that annotation text is rendered +on.
      cacheThresholdsize_t const size_tPixel cache threshold in megabytes. Once this +threshold is exceeded, all subsequent pixels cache operations are +to/from disk. This is a static method and the attribute it sets is +shared by all Image objects.
      channelDepth
      +
      size_t +
      +
      const +ChannelType channel_
      +
      const ChannelType +channel_, const size_t depth_
      +
      Channel modulus depth. +The channel modulus depth represents the minimum number of bits +required +to support the channel without loss. Setting the channel's modulus +depth +modifies the channel (i.e. discards resolution) if the requested +modulus +depth is less than the current modulus depth, otherwise the channel is +not altered. There is no attribute associated with the modulus depth so +the current modulus depth is obtained by inspecting the pixels. As a +result, the depth returned may be less than the most recently set +channel depth. Subsequent image processing may result in increasing the +channel depth.
      +
      +
      chroma- +
      + BluePrimary
      +
      double x & ydouble *x_, double *y_double x_, double y_Chromaticity blue primary point (e.g. x=0.15, +y=0.06)
      +
      chroma- +
      + GreenPrimary
      +
      double x & ydouble *x_, double *y_double x_, double y_Chromaticity green primary point (e.g. x=0.3, +y=0.6)
      +
      chroma- +
      + RedPrimary
      +
      double x & ydouble *x_, double *y_double x_, double y_Chromaticity red primary point (e.g. x=0.64, +y=0.33)
      +
      chroma- +
      + WhitePoint
      +
      double x & ydouble*x_, double *y_double x_, double y_Chromaticity white point (e.g. x=0.3127, +y=0.329)
      +
      classType
      +
      ClassType + void ClassType +class_Image storage class. Note that +conversion from a DirectClass image to a PseudoClass image may result +in a loss of color due to the limited size of the palette (256 or +65535 colors).
      +
      clipMask
      +
      Imagevoidconst Image &clipMask_Associate a clip mask image with the current +image. The clip mask image must have the same dimensions as the current +image or an exception is thrown. Clipping occurs wherever pixels are +transparent in the clip mask image. Clipping Pass an invalid image to +unset an existing clip mask.
      +
      colorFuzz
      +
      doublevoiddouble fuzz_Colors within this distance are considered +equal. A number of algorithms search for a target color. By +default the color must be exact. Use this option to match colors that +are close to the target color in RGB space.
      +
      colorMap
      +
      Color size_t index_size_t index_, const Color &color_Color at colormap index.
      +
      colorMapSize
      +
      +
      size_t
      +
      void
      +
      size_t entries_
      +
      Number of entries in the +colormap. Setting the colormap size may extend or truncate the +colormap. +The maximum number of supported entries is specified by the MaxColormapSizeconstant, +and is dependent on the value of QuantumDepth when ImageMagick is +compiled. An exception is thrown if more entries are requested than may +be supported. Care should be taken when truncating the colormap to +ensure that the image colormap indexes reference valid colormap entries.
      +
      +
      colorSpace
      +
      ColorspaceType +colorSpace_voidColorspaceType +colorSpace_The colorspace (e.g. CMYK) used to represent +the image pixel colors. Image pixels are always stored as RGB(A) except +for the case of CMY(K).
      +
      columns
      +
      size_tvoid Image width
      +
      comment
      +
      stringvoid Image comment
      +
      compose
      +
      CompositeOperator + voidCompositeOperator +compose_Composition operator to be used when +composition is implicitly used (such as for image flattening).
      +
      compress- +
      + Type
      +
      CompressionType + voidCompressionType +compressType_Image compresion type. The default is the +compression type of the specified image file.
      +
      debug
      +
      boolvoidbool flag_Enable printing of internal debug messages +from ImageMagick as it executes.
      defineValue
      +
      string
      +
      const std::string +&magick_, const std::string &key_
      +
      const std::string +&magick_, const std::string &key_, const std::string +&value_
      +
      Set or obtain a +definition string to applied when encoding or decoding the specified +format. The meanings of the definitions are format specific. The format +is designated by the magick_ +argument, the format-specific key is designated by key_, and the associated value is +specified by value_. See the +defineSet() method if the key must be removed entirely.
      +
      defineSet
      +
      bool
      +
      const std::string +&magick_, const std::string &key_
      +
      const std::string +&magick_, const std::string &key_, bool flag_
      +
      Set or obtain a +definition flag to applied when encoding or decoding the specified +format.. Similar to the defineValue() method except that +passing the flag_ value +'true' +creates a value-less define with that format and key. Passing the flag_ +value 'false' removes any existing matching definition. The method +returns 'true' if a matching key exists, and 'false' if no matching key +exists.
      +
      +
      density
      +
      Geometry +(default 72x72)voidconst Geometry +&density_Vertical and horizontal resolution in pixels +of the image. This option specifies an image density when decoding a +Postscript or Portable Document page. Often used with psPageSize.
      +
      depth
      +
      size_t (8-32)voidsize_t depth_Image depth. Used to specify the bit depth +when reading or writing raw images or when the output format +supports multiple depths. Defaults to the quantum depth that +ImageMagick is compiled with.
      +
      endian
      +
      EndianType + voidEndianType +endian_Specify (or obtain) endian option for formats +which support it.
      +
      directory
      +
      stringvoid Tile names from within an image montage
      +
      file
      +
      FILE *FILE *FILE *file_Image file descriptor.
      +
      fileName
      +
      stringvoidconst string &fileName_Image file name.
      +
      fileSize
      +
      off_tvoid Number of bytes of the image on disk
      +
      fillColor
      +
      Colorvoidconst Color &fillColor_Color to use when filling drawn objects
      +
      fillPattern
      +
      Imagevoidconst Image &fillPattern_Pattern image to use when filling drawn +objects.
      +
      fillRule
      +
      FillRule + voidconst Magick::FillRule &fillRule_Rule to use when filling drawn objects.
      +
      filterType
      +
      FilterTypes + voidFilterTypes +filterType_Filter to use when resizing image. The +reduction filter employed has a significant effect on the time required +to resize an image and the resulting quality. The default filter is Lanczos +which has been shown to produce high quality results when reducing most +images.
      +
      font
      +
      stringvoidconst string &font_Text rendering font. If the font is a fully +qualified X server font name, the font is obtained from an X +server. To use a TrueType font, precede the TrueType filename with an +@. Otherwise, specify a Postscript font name (e.g. +"helvetica").
      +
      fontPointsize
      +
      size_tvoidsize_t pointSize_Text rendering font point size
      +
      fontTypeMetrics
      +
      TypeMetric const std::string &text_, TypeMetric *metrics Update metrics with font type metrics using +specified text, and current font and fontPointSize settings.
      +
      format
      +
      stringvoid Long form image format description.
      +
      gamma
      +
      double (typical range 0.8 to 2.3)void Gamma level of the image. The same color +image displayed on two different workstations may +look different due to differences in the display monitor. +Use gamma correction to adjust for this +color difference.
      +
      geometry
      +
      Geometry void Preferred size of the image when encoding.
      +
      gifDispose- +
      + Method
      +
      size_t
      + { 0 = Disposal not specified,
      + 1 = Do not dispose of graphic,
      + 3 = Overwrite graphic with background color, +
      + 4 = Overwrite graphic with previous graphic. }
      voidsize_t disposeMethod_GIF disposal method. This option is used to +control how successive frames are rendered (how the preceding frame is +disposed of) when creating a GIF animation.
      +
      iccColorProfile
      +
      Blob voidconst Blob +&colorProfile_ICC color profile. Supplied via a Blob since Magick++/ and ImageMagick do not +currently support formating this data structure directly. +Specifications are available from the +International Color Consortium for the format of ICC color profiles.
      +
      interlace- +
      + Type
      +
      InterlaceType + voidInterlaceType +interlace_The type of interlacing scheme (default NoInterlace +). This option is used to specify the type of interlacing +scheme for raw image formats such as RGB or YUV. NoInterlace +means do not interlace, LineInterlace uses scanline +interlacing, and PlaneInterlace uses plane interlacing. +PartitionInterlace is like PlaneInterlace except the +different planes are saved to individual files (e.g. +image.R, image.G, and image.B). Use LineInterlace or +PlaneInterlace to create an interlaced GIF or progressive JPEG +image.
      +
      iptcProfile
      +
      Blob voidconst Blob & +iptcProfile_IPTC profile. Supplied via a Blob since Magick++ and ImageMagick do not +currently support formating this data structure directly. +Specifications are available from the +International Press Telecommunications Council for IPTC profiles.
      +
      label
      +
      stringvoidconst string &label_Image label
      +
      magick
      +
      stringvoid const string &magick_Get image format (e.g. "GIF")
      +
      matte
      +
      boolvoidbool matteFlag_True if the image has transparency. If set +True, store matte channel if the image has one otherwise create +an opaque one.
      +
      matteColor
      +
      Color voidconst Color +&matteColor_Image matte (frame) color
      +
      meanError- +
      + PerPixel
      +
      doublevoid The mean error per pixel computed when an +image is color reduced. This parameter is only valid if verbose is set +to true and the image has just been quantized.
      modulusDepth
      +
      size_t +
      +
      void
      +
      size_t +depth_
      +
      Image +modulus depth (minimum number of bits required to support +red/green/blue components without loss of accuracy). The pixel modulus +depth may be decreased by supplying a value which is less than the +current value, updating the pixels (reducing accuracy) to the new +depth. +The pixel modulus depth can not be increased over the current value +using this method.
      +
      +
      monochrome
      +
      boolvoidbool flag_Transform the image to black and white
      +
      montage- +
      + Geometry
      +
      Geometry void Tile size and offset within an image montage. +Only valid for montage images.
      +
      normalized- +
      + MaxError
      +
      doublevoid The normalized max error per pixel computed +when an image is color reduced. This parameter is only valid if verbose +is set to true and the image has just been quantized.
      +
      normalized- +
      + MeanError
      +
      doublevoid The normalized mean error per pixel computed +when an image is color reduced. This parameter is only valid if verbose +is set to true and the image has just been quantized.
      orientation
      +
      OrientationTypevoid
      +
      OrientationType +orientation_Image orientation. + Supported by some file formats such as DPX and TIFF. Useful for +turning the right way up.
      +
      +
      packets
      +
      size_tvoid The number of runlength-encoded packets in +
      + the image
      +
      packetSize
      +
      size_tvoid The number of bytes in each pixel packet
      +
      page
      +
      Geometry + voidconst Geometry &pageSize_Preferred size and location of an image +canvas. +

      Use this option to specify the dimensions +and position of the Postscript page in dots per inch or a TEXT page in +pixels. This option is typically used in concert with density .

      +

      Page may also be used to position a GIF +image (such as for a scene in an animation)

      +
      +
      pixelColor
      +
      Color ssize_t x_, ssize_t y_ssize_t x_, ssize_t y_, const Color &color_Get/set pixel color at location x & y.
      +
      profile
      +
      +
      Blob
      +
      const std::string name_
      +
      const std::string name_, const Blob +&colorProfile_
      +
      Get/set/remove a named +profile. Valid names include "*", +"8BIM", "ICM", "IPTC", or a user/format-defined profile name.
      +
      +
      quality
      +
      size_t (0 to 100)voidsize_t quality_JPEG/MIFF/PNG compression level (default 75).
      +
      quantize- +
      + Colors
      +
      size_tvoidsize_t colors_Preferred number of colors in the image. The +actual number of colors in the image may be less than your request, but +never more. Images with less unique colors than specified with this +option will have any duplicate or unused colors removed.
      +
      quantize- +
      + ColorSpace
      +
      ColorspaceType + voidColorspaceType +colorSpace_Colorspace to quantize colors in (default +RGB). Empirical evidence suggests that distances in color spaces such +as YUV or YIQ correspond to perceptual color differences more closely +than do distances in RGB space. These color spaces may give better +results when color reducing an image.
      +
      quantize- +
      + Dither
      +
      boolvoidbool flag_Apply Floyd/Steinberg error diffusion to the +image. The basic strategy of dithering is to trade +intensity +resolution for spatial resolution by +averaging the intensities of several +neighboring pixels. Images which suffer from +severe contouring when reducing colors can be +improved with this option. The quantizeColors or monochrome option must +be set for this option to take effect.
      +
      quantize- +
      + TreeDepth
      +
      size_t voidsize_t treeDepth_Depth of the quantization color +classification tree. Values of 0 or 1 allow selection of the optimal +tree depth for the color reduction algorithm. Values between 2 and 8 +may be used to manually adjust the tree depth.
      +
      rendering- +
      + Intent
      +
      RenderingIntent + voidRenderingIntent +render_The type of rendering intent
      +
      resolution- +
      + Units
      +
      ResolutionType + voidResolutionType +units_Units of image resolution
      +
      rows
      +
      size_tvoid The number of pixel rows in the image
      +
      scene
      +
      size_tvoidsize_t scene_Image scene number
      +
      signature
      +
      stringbool force_ = false Image MD5 signature. Set force_ to 'true' to +force re-computation of signature.
      +
      size
      +
      Geometry voidconst Geometry +&geometry_Width and height of a raw image (an image +which does not support width and height information). Size may +also be used to affect the image size read from a multi-resolution +format (e.g. Photo CD, JBIG, or JPEG.
      +
      strip
      +
      voidstrips an image of all profiles and comments.
      +
      strokeAntiAlias
      +
      boolvoidbool flag_Enable or disable anti-aliasing when drawing +object outlines.
      +
      strokeColor
      +
      Colorvoidconst Color &strokeColor_Color to use when drawing object outlines
      +
      strokeDashOffset
      +
      size_tvoiddouble strokeDashOffset_While drawing using a dash pattern, specify +distance into the dash pattern to start the dash (default 0).
      +
      strokeDashArray
      +
      const double*voidconst double* strokeDashArray_Specify the pattern of dashes and gaps used +to stroke paths. The strokeDashArray represents a zero-terminated +array of numbers that specify the lengths (in pixels) of alternating +dashes and gaps in user units. If an odd number of values is provided, +then the list of values is repeated to yield an even number of +values. A typical strokeDashArray_ array might contain the +members 5 3 2 0, where the zero value indicates the end of the pattern +array.
      +
      strokeLineCap
      +
      LineCapvoidLineCap lineCap_Specify the shape to be used at the corners +of paths (or other vector shapes) when they are stroked. Values of +LineJoin are UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin.
      +
      strokeLineJoin
      +
      LineJoinvoidLineJoin lineJoin_Specify the shape to be used at the corners +of paths (or other vector shapes) when they are stroked. Values of +LineJoin are UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin.
      +
      strokeMiterLimit
      +
      size_tvoidsize_t miterLimit_Specify miter limit. When two line segments +meet at a sharp angle and miter joins have been specified for +'lineJoin', it is possible for the miter to extend far beyond the +thickness of the line stroking the path. The miterLimit' imposes a +limit on the ratio of the miter length to the 'lineWidth'. The default +value of this parameter is 4.
      +
      strokeWidth
      +
      doublevoiddouble strokeWidth_Stroke width for use when drawing vector +objects (default one)
      +
      strokePattern
      +
      Imagevoidconst Image &strokePattern_Pattern image to use while drawing object +stroke (outlines).
      +
      subImage
      +
      size_tvoidsize_t subImage_Subimage of an image sequence
      +
      subRange
      +
      size_tvoidsize_t subRange_Number of images relative to the base image
      +
      textEncoding
      +
      +
      string
      +
      void
      +
      const std::string &encoding_
      +
      Specify the code set to use for text +annotations. The only character encoding which may be specified at +this time is "UTF-8" for representing Unicode as a +sequence of bytes. Specify an empty string to use the default ASCII +encoding. Successful text annotation using Unicode may require fonts +designed to support Unicode.
      +
      +
      tileName
      +
      stringvoidconst string &tileName_Tile name
      +
      totalColors
      +
      size_tvoid Number of colors in the image
      +
      type
      +
      ImageType + void ImageType Image type.
      +
      verbose
      +
      boolvoidbool verboseFlag_Print detailed information about the image
      +
      view
      +
      stringvoidconst string &view_FlashPix viewing parameters.
      +
      virtualPixelMethod
      +
      VirtualPixelMethod + voidVirtualPixelMethod +virtualPixelMethod_Image virtual pixel method.
      +
      x11Display
      +
      string (e.g. "hostname:0.0")voidconst string &display_X11 display to display to, obtain fonts from, +or to capture image from
      +
      xResolution
      +
      doublevoid x resolution of the image
      +
      yResolution
      +
      doublevoid y resolution of the image
    +
    +

    Low-Level Image Pixel Access

    +
    +Image pixels (of type PixelPacket ) +may be accessed directly via the Image Pixel Cache . The +image pixel cache is a rectangular window into the actual image pixels +(which may be in memory, memory-mapped from a disk file, or entirely on +disk). Two interfaces exist to access the Image Pixel Cache. +The +interface described here (part of the Image class) supports +only +one view at a time. See the Pixels +class for a more abstract interface which supports simultaneous pixel +views (up to the number of rows). As an analogy, the interface +described +here relates to the Pixels class as +stdio's gets() relates to fgets(). The Pixels +class provides the more general form of the interface. +

    Obtain existing image pixels via getPixels(). Create a new +pixel region using setPixels().

    +

    In order to ensure that only the current generation of the image is +modified, the Image's modifyImage() method +should be invoked to reduce the reference count on the underlying image +to one. If this is not done, then it is possible for a previous +generation of the image to be modified due to the use of reference +counting when copying or constructing an Image.
    +

    +

    Depending on the capabilities of the operating system, and the +relationship of the window to the image, the pixel cache may be a copy +of the pixels in the selected window, or it may be the actual image +pixels. In any case calling syncPixels() insures that the base +image is updated with the contents of the modified pixel cache. The +method readPixels() supports copying foreign pixel data +formats +into the pixel cache according to the QuantumTypes. The method writePixels() +supports copying the pixels in the cache to a foreign pixel +representation according to the format specified by QuantumTypes.

    +

    The pixel region is effectively a small image in which the pixels +may be accessed, addressed, and updated, as shown in the following +example: +

    +

    +Image image("cow.png"); +// Ensure that there are no other references to this image. +image.modifyImage(); +// Set the image type to TrueColor DirectClass representation. +image.type(TrueColorType); +// Request pixel region with size 60x40, and top origin at 20x30 +ssize_t columns = 60; +PixelPacket *pixel_cache = image.getPixels(20,30,columns,40); +// Set pixel at column 5, and row 10 in the pixel cache to red. +ssize_t column = 5; +ssize_t row = 10; +PixelPacket *pixel = pixel_cache+row*columns+column; +*pixel = Color("red"); +// Save changes to underlying image . +image.syncPixels(); + // Save updated image to file. +image.write("horse.png"); +
    +

    +

    The image cache supports the following methods:
    + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Image Cache Methods
      +
      Method
      +
      +
      Returns
      +
      +
      Signature
      +
      +
      Description
      +
      +
      getConstPixels
      +
      const PixelPacket +*const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_Transfers pixels from the image to the pixel +cache as defined by the specified rectangular region. The returned pointer remains valid until the next getPixel, +getConstPixels, or setPixels call and should never be deallocated by +the +user.
      +
      getConstIndexes
      +
      const IndexPacket*voidReturns a pointer to the Image pixel indexes +corresponding to a previous getPixel, +getConstPixels, or setPixels call. The +returned pointer remains valid until the next getPixel, getConstPixels, +or setPixels call and should never be deallocated by the user. Only valid for PseudoClass images or CMYKA images. The +pixel indexes represent an array of type IndexPacket, with each entry +corresponding to an x,y pixel position. For PseudoClass images, the +entry's value is the offset into the colormap (see colorMap +) for that pixel. For CMYKA images, the indexes are used to contain the +alpha channel.
      +
      getIndexes
      +
      IndexPacket*voidReturns a pointer to the Image pixel indexes +corresponding to the pixel region requested by the last getConstPixels , getPixels +, or setPixels call. The +returned pointer remains valid until the next getPixel, getConstPixels, +or setPixels call and should never be deallocated by the user. Only valid for PseudoClass images +or +CMYKA images. The pixel indexes represent an array of type +IndexPacket, with each entry corresponding to a pixel x,y position. For +PseudoClass images, the entry's value is the offset into the colormap +(see colorMap ) for that pixel. For +CMYKA +images, the indexes are used to contain the alpha channel.
      +
      getPixels
      +
      PixelPacket *const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_Transfers pixels from the image to the pixel +cache as defined by the specified rectangular region. Modified pixels +may be subsequently transferred back to the image via syncPixels. The returned pointer remains valid until the next getPixel, +getConstPixels, or setPixels call and should never be deallocated by +the +user.
      +
      setPixels
      +
      PixelPacket *const ssize_t x_, const ssize_t y_, const size_t +columns_, const size_t rows_Allocates a pixel cache region to store image +pixels as defined by the region rectangle. This area is +subsequently transferred from the pixel cache to the image via +syncPixels. The returned pointer remains +valid until the next getPixel, getConstPixels, or setPixels call and +should never be deallocated by the user.
      +
      syncPixels
      +
      voidvoidTransfers the image cache pixels to the image.
      +
      readPixels
      +
      voidQuantumTypes +quantum_, unsigned char *source_,Transfers one or more pixel components from a +buffer or file into the image pixel cache of an image. ReadPixels is +typically used to support image decoders. The region transferred +corresponds to the region set by a preceding setPixels call.
      +
      writePixels
      +
      voidQuantumTypes +quantum_, unsigned char *destination_Transfers one or more pixel components from +the image pixel cache to a buffer or file. WritePixels is typically +used to support image encoders. The region transferred corresponds to +the region set by a preceding getPixels or getConstPixels call.
    +

    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/www/api/animate.html b/ImageMagick-6.9.12-44/www/api/animate.html new file mode 100644 index 0000000..85f1988 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/animate.html @@ -0,0 +1,124 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Interactively Animate an Image Sequence + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    + +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/annotate.html b/ImageMagick-6.9.12-44/www/api/annotate.html new file mode 100644 index 0000000..2787fd3 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/annotate.html @@ -0,0 +1,278 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Annotate an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AnnotateImageFormatMagickCaptionGetMultilineTypeMetricsGetTypeMetrics

    + +

    AnnotateImage

    + +

    AnnotateImage() annotates an image with text.

    + +

    The format of the AnnotateImage method is:

    + +
    +MagickBooleanType AnnotateImage(Image *image,DrawInfo *draw_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    +

    FormatMagickCaption

    + +

    FormatMagickCaption() formats a caption so that it fits within the image width. It returns the number of lines in the formatted caption.

    + +

    The format of the FormatMagickCaption method is:

    + +
    +ssize_t FormatMagickCaption(Image *image,DrawInfo *draw_info,
    +  const MagickBooleanType split,TypeMetric *metrics,char **caption)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    The image.

    + +
    draw_info
    +

    the draw info.

    + +
    split
    +

    when no convenient line breaks-- insert newline.

    + +
    metrics
    +

    Return the font metrics in this structure.

    + +
    caption
    +

    the caption.

    + +

    GetMultilineTypeMetrics

    + +

    GetMultilineTypeMetrics() returns the following information for the specified font and text:

    + +
    +    character width
    +    character height
    +    ascender
    +    descender
    +    text width
    +    text height
    +    maximum horizontal advance
    +    bounds: x1
    +    bounds: y1
    +    bounds: x2
    +    bounds: y2
    +    origin: x
    +    origin: y
    +    underline position
    +    underline thickness
    +
    + +

    This method is like GetTypeMetrics() but it returns the maximum text width and height for multiple lines of text.

    + +

    The format of the GetMultilineTypeMetrics method is:

    + +
    +MagickBooleanType GetMultilineTypeMetrics(Image *image,
    +  const DrawInfo *draw_info,TypeMetric *metrics)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    metrics
    +
    Return the font metrics in this structure.
    + +
    +
    +

    GetTypeMetrics

    + +

    GetTypeMetrics() returns the following information for the specified font and text:

    + +
    +    character width
    +    character height
    +    ascender
    +    descender
    +    text width
    +    text height
    +    maximum horizontal advance
    +    bounds: x1
    +    bounds: y1
    +    bounds: x2
    +    bounds: y2
    +    origin: x
    +    origin: y
    +    underline position
    +    underline thickness
    +
    + +

    The format of the GetTypeMetrics method is:

    + +
    +MagickBooleanType GetTypeMetrics(Image *image,const DrawInfo *draw_info,
    +  TypeMetric *metrics)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    metrics
    +
    Return the font metrics in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/attribute.html b/ImageMagick-6.9.12-44/www/api/attribute.html new file mode 100644 index 0000000..05d4a08 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/attribute.html @@ -0,0 +1,419 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Set Text Attributes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    GetImageChannelDepthGetImageQuantumDepthGetImageTypeIdentifyImageMonochromeIdentifyImageTypeIsGrayImageIsMonochromeImageIsOpaqueImageSetImageChannelDepthSetImageType

    + +

    GetImageChannelDepth

    + +

    GetImageChannelDepth() returns the depth of a particular image channel.

    + +

    The format of the GetImageChannelDepth method is:

    + +
    +size_t GetImageDepth(const Image *image,ExceptionInfo *exception)
    +size_t GetImageChannelDepth(const Image *image,
    +  const ChannelType channel,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetImageQuantumDepth

    + +

    GetImageQuantumDepth() returns the depth of the image rounded to a legal quantum depth: 8, 16, or 32.

    + +

    The format of the GetImageQuantumDepth method is:

    + +
    +size_t GetImageQuantumDepth(const Image *image,
    +  const MagickBooleanType constrain)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    constrain
    +
    A value other than MagickFalse, constrains the depth to a maximum of MAGICKCORE_QUANTUM_DEPTH.
    + +
    +
    +

    GetImageType

    + +

    GetImageType() returns the potential type of image:

    + +

    Bilevel Grayscale GrayscaleMatte Palette PaletteMatte TrueColor TrueColorMatte ColorSeparation ColorSeparationMatte

    + +

    To ensure the image type matches its potential, use SetImageType():

    + +
    +    (void) SetImageType(image,GetImageType(image));
    +
    + +

    The format of the GetImageType method is:

    + +
    +ImageType GetImageType(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    IdentifyImageMonochrome

    + +

    IdentifyImageMonochrome() returns MagickTrue if all the pixels in the image have the same red, green, and blue intensities and the intensity is either 0 or QuantumRange.

    + +

    The format of the IdentifyImageMonochrome method is:

    + +
    +MagickBooleanType IdentifyImageMonochrome(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    IdentifyImageType

    + +

    IdentifyImageType() returns the potential type of image:

    + +

    Bilevel Grayscale GrayscaleMatte Palette PaletteMatte TrueColor TrueColorMatte ColorSeparation ColorSeparationMatte

    + +

    To ensure the image type matches its potential, use SetImageType():

    + +
    +    (void) SetImageType(image,IdentifyImageType(image,exception),exception);
    +
    + +

    The format of the IdentifyImageType method is:

    + +
    +ImageType IdentifyImageType(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    IsGrayImage

    + +

    IsGrayImage() returns MagickTrue if the type of the image is grayscale or bi-level.

    + +

    The format of the IsGrayImage method is:

    + +
    +MagickBooleanType IsGrayImage(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    IsMonochromeImage

    + +

    IsMonochromeImage() returns MagickTrue if type of the image is bi-level.

    + +

    The format of the IsMonochromeImage method is:

    + +
    +MagickBooleanType IsMonochromeImage(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    IsOpaqueImage

    + +

    IsOpaqueImage() returns MagickTrue if none of the pixels in the image have an opacity value other than opaque (0).

    + +

    The format of the IsOpaqueImage method is:

    + +
    +MagickBooleanType IsOpaqueImage(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SetImageChannelDepth

    + +

    SetImageChannelDepth() sets the depth of the image.

    + +

    The format of the SetImageChannelDepth method is:

    + +
    +MagickBooleanType SetImageDepth(Image *image,const size_t depth)
    +MagickBooleanType SetImageChannelDepth(Image *image,
    +  const ChannelType channel,const size_t depth)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    depth
    +
    the image depth.
    + +
    +
    +

    SetImageType

    + +

    SetImageType() sets the type of image. Choose from these types:

    + +

    BilevelType, GrayscaleType, GrayscaleMatteType, PaletteType, PaletteMatteType, TrueColorType, TrueColorMatteType, ColorSeparationType, ColorSeparationMatteType, OptimizeType

    + +

    The format of the SetImageType method is:

    + +
    +MagickBooleanType SetImageType(Image *image,const ImageType type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    type
    +
    Image type.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/blob.html b/ImageMagick-6.9.12-44/www/api/blob.html new file mode 100644 index 0000000..aad82bc --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/blob.html @@ -0,0 +1,433 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Read or Write Binary Large OBjects + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    BlobToImageFileToBlobFileToImageGetBlobPropertiesImageToBlobImageToFileImagesToBlobInjectImageBlobIsBlobExemptIsBlobTemporary

    + +

    BlobToImage

    + +

    BlobToImage() implements direct to memory image formats. It returns the blob as an image.

    + +

    The format of the BlobToImage method is:

    + +
    +Image *BlobToImage(const ImageInfo *image_info,const void *blob,
    +  const size_t length,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    blob
    +
    the address of a character stream in one of the image formats understood by ImageMagick.
    + +
    +
    length
    +
    This size_t integer reflects the length in bytes of the blob.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    FileToBlob

    + +

    FileToBlob() returns the contents of a file as a buffer terminated with the '\0' character. The length of the buffer (not including the extra terminating '\0' character) is returned via the 'length' parameter. Free the buffer with RelinquishMagickMemory().

    + +

    The format of the FileToBlob method is:

    + +
    +unsigned char *FileToBlob(const char *filename,const size_t extent,
    +  size_t *length,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    blob
    +
    FileToBlob() returns the contents of a file as a blob. If an error occurs NULL is returned.
    + +
    +
    filename
    +
    the filename.
    + +
    +
    extent
    +
    The maximum length of the blob.
    + +
    +
    length
    +
    On return, this reflects the actual length of the blob.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    FileToImage

    + +

    FileToImage() write the contents of a file to an image.

    + +

    The format of the FileToImage method is:

    + +
    +MagickBooleanType FileToImage(Image *,const char *filename)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    filename
    +
    the filename.
    + +
    +
    +

    GetBlobProperties

    + +

    GetBlobProperties() returns information about an image blob.

    + +

    The format of the GetBlobProperties method is:

    + +
    +const struct stat *GetBlobProperties(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    ImageToBlob

    + +

    ImageToBlob() implements direct to memory image formats. It returns the image as a formatted blob and its length. The magick member of the Image structure determines the format of the returned blob (GIF, JPEG, PNG, etc.). This method is the equivalent of WriteImage(), but writes the formatted "file" to a memory buffer rather than to an actual file.

    + +

    The format of the ImageToBlob method is:

    + +
    +unsigned char *ImageToBlob(const ImageInfo *image_info,Image *image,
    +  size_t *length,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    image
    +
    the image.
    + +
    +
    length
    +
    return the actual length of the blob.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ImageToFile

    + +

    ImageToFile() writes an image to a file. It returns MagickFalse if an error occurs otherwise MagickTrue.

    + +

    The format of the ImageToFile method is:

    + +
    + MagickBooleanType ImageToFile(Image *image,char *filename,
    +   ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    filename
    +
    Write the image to this file.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ImagesToBlob

    + +

    ImagesToBlob() implements direct to memory image formats. It returns the image sequence as a blob and its length. The magick member of the ImageInfo structure determines the format of the returned blob (GIF, JPEG, PNG, etc.)

    + +

    Note, some image formats do not permit multiple images to the same image stream (e.g. JPEG). in this instance, just the first image of the sequence is returned as a blob.

    + +

    The format of the ImagesToBlob method is:

    + +
    +unsigned char *ImagesToBlob(const ImageInfo *image_info,Image *images,
    +  size_t *length,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    images
    +
    the image list.
    + +
    +
    length
    +
    return the actual length of the blob.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    InjectImageBlob

    + +

    InjectImageBlob() injects the image with a copy of itself in the specified format (e.g. inject JPEG into a PDF image).

    + +

    The format of the InjectImageBlob method is:

    + +
    +MagickBooleanType InjectImageBlob(const ImageInfo *image_info,
    +  Image *image,Image *inject_image,const char *format,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info..
    + +
    +
    image
    +
    the image.
    + +
    +
    inject_image
    +
    inject into the image stream.
    + +
    +
    format
    +
    the image format.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    IsBlobExempt

    + +

    IsBlobExempt() returns true if the blob is exempt.

    + +

    The format of the IsBlobExempt method is:

    + +
    + MagickBooleanType IsBlobExempt(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    IsBlobTemporary

    + +

    IsBlobTemporary() returns true if the blob is temporary.

    + +

    The format of the IsBlobTemporary method is:

    + +
    + MagickBooleanType IsBlobTemporary(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/cache-view.html b/ImageMagick-6.9.12-44/www/api/cache-view.html new file mode 100644 index 0000000..98efcb5 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/cache-view.html @@ -0,0 +1,686 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Cache Views + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireAuthenticCacheViewAcquireVirtualCacheViewCloneCacheViewDestroyCacheViewGetCacheViewChannelsGetCacheViewColorspaceGetCacheViewExceptionGetCacheViewStorageClassGetCacheViewAuthenticPixelsGetOneCacheViewAuthenticPixelGetCacheViewAuthenticIndexQueueGetCacheViewAuthenticPixelQueueGetCacheViewVirtualIndexQueueGetCacheViewVirtualPixelQueueGetCacheViewVirtualPixelsGetOneCacheViewVirtualPixelGetOneCacheViewVirtualMethodPixelQueueCacheViewAuthenticPixelsSetCacheViewStorageClassSetCacheViewVirtualPixelMethodSyncCacheViewAuthenticPixels

    + +

    AcquireAuthenticCacheView

    + +

    AcquireAuthenticCacheView() acquires an authentic view into the pixel cache.

    + +

    The format of the AcquireAuthenticCacheView method is:

    + +
    +CacheView *AcquireAuthenticCacheView(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    AcquireVirtualCacheView

    + +

    AcquireVirtualCacheView() acquires a virtual view into the pixel cache, using the VirtualPixelMethod that is defined within the given image itself.

    + +

    The format of the AcquireVirtualCacheView method is:

    + +
    +CacheView *AcquireVirtualCacheView(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    CloneCacheView

    + +

    CloneCacheView() makes an exact copy of the specified cache view.

    + +

    The format of the CloneCacheView method is:

    + +
    +CacheView *CloneCacheView(const CacheView *cache_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    +

    DestroyCacheView

    + +

    DestroyCacheView() destroys the specified view returned by a previous call to AcquireVirtualCacheView().

    + +

    The format of the DestroyCacheView method is:

    + +
    +CacheView *DestroyCacheView(CacheView *cache_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    +

    GetCacheViewChannels

    + +

    GetCacheViewChannels() returns the image pixel channels associated with the specified view.

    + +

    The format of the GetCacheViewChannels method is:

    + +
    +size_t GetCacheViewChannels(const CacheView *cache_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    +

    GetCacheViewColorspace

    + +

    GetCacheViewColorspace() returns the image colorspace associated with the specified view.

    + +

    The format of the GetCacheViewColorspace method is:

    + +
    +ColorspaceType GetCacheViewColorspace(const CacheView *cache_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    +

    GetCacheViewException

    + +

    GetCacheViewException() returns the image exception associated with the specified view.

    + +

    The format of the GetCacheViewException method is:

    + +
    +ExceptionInfo GetCacheViewException(const CacheView *cache_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    +

    GetCacheViewStorageClass

    + +

    GetCacheViewStorageClass() returns the image storage class associated with the specified view.

    + +

    The format of the GetCacheViewStorageClass method is:

    + +
    +ClassType GetCacheViewStorageClass(const CacheView *cache_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    +

    GetCacheViewAuthenticPixels

    + +

    GetCacheViewAuthenticPixels() gets pixels from the in-memory or disk pixel cache as defined by the geometry parameters. A pointer to the pixels is returned if the pixels are transferred, otherwise a NULL is returned.

    + +

    The format of the GetCacheViewAuthenticPixels method is:

    + +
    +PixelPacket *GetCacheViewAuthenticPixels(CacheView *cache_view,
    +  const ssize_t x,const ssize_t y,const size_t columns,
    +  const size_t rows,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a region of pixels.
    + +
    +
    +

    GetOneCacheViewAuthenticPixel

    + +

    GetOneCacheViewAuthenticPixel() returns a single pixel at the specified (x,y) location. The image background color is returned if an error occurs.

    + +

    The format of the GetOneCacheViewAuthenticPixel method is:

    + +
    +MagickBooleaNType GetOneCacheViewAuthenticPixel(
    +  const CacheView *cache_view,const ssize_t x,const ssize_t y,
    +  PixelPacket *pixel,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    x,y
    +
    These values define the offset of the pixel.
    + +
    +
    pixel
    +
    return a pixel at the specified (x,y) location.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetCacheViewAuthenticIndexQueue

    + +

    GetCacheViewAuthenticIndexQueue() returns the indexes associated with the last call to SetCacheViewIndexes() or GetCacheViewAuthenticIndexQueue(). The indexes are authentic and can be updated.

    + +

    The format of the GetCacheViewAuthenticIndexQueue() method is:

    + +
    +IndexPacket *GetCacheViewAuthenticIndexQueue(CacheView *cache_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    +

    GetCacheViewAuthenticPixelQueue

    + +

    GetCacheViewAuthenticPixelQueue() returns the pixels associated with the last call to QueueCacheViewAuthenticPixels() or GetCacheViewAuthenticPixels(). The pixels are authentic and therefore can be updated.

    + +

    The format of the GetCacheViewAuthenticPixelQueue() method is:

    + +
    +PixelPacket *GetCacheViewAuthenticPixelQueue(CacheView *cache_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    +

    GetCacheViewVirtualIndexQueue

    + +

    GetCacheViewVirtualIndexQueue() returns the indexes associated with the last call to GetCacheViewVirtualIndexQueue(). The indexes are virtual and therefore cannot be updated.

    + +

    The format of the GetCacheViewVirtualIndexQueue() method is:

    + +
    +const IndexPacket *GetCacheViewVirtualIndexQueue(
    +  const CacheView *cache_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    +

    GetCacheViewVirtualPixelQueue

    + +

    GetCacheViewVirtualPixelQueue() returns the pixels associated with the last call to GetCacheViewVirtualPixels(). The pixels are virtual and therefore cannot be updated.

    + +

    The format of the GetCacheViewVirtualPixelQueue() method is:

    + +
    +const PixelPacket *GetCacheViewVirtualPixelQueue(
    +  const CacheView *cache_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    +

    GetCacheViewVirtualPixels

    + +

    GetCacheViewVirtualPixels() gets virtual pixels from the in-memory or disk pixel cache as defined by the geometry parameters. A pointer to the pixels is returned if the pixels are transferred, otherwise a NULL is returned.

    + +

    The format of the GetCacheViewVirtualPixels method is:

    + +
    +const PixelPacket *GetCacheViewVirtualPixels(
    +  const CacheView *cache_view,const ssize_t x,const ssize_t y,
    +  const size_t columns,const size_t rows,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a region of pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetOneCacheViewVirtualPixel

    + +

    GetOneCacheViewVirtualPixel() returns a single pixel at the specified (x,y) location. The image background color is returned if an error occurs. If you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead.

    + +

    The format of the GetOneCacheViewVirtualPixel method is:

    + +
    +MagickBooleanType GetOneCacheViewVirtualPixel(
    +  const CacheView *cache_view,const ssize_t x,const ssize_t y,
    +  PixelPacket *pixel,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    x,y
    +
    These values define the offset of the pixel.
    + +
    +
    pixel
    +
    return a pixel at the specified (x,y) location.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetOneCacheViewVirtualMethodPixel

    + +

    GetOneCacheViewVirtualMethodPixel() returns a single virtual pixel at the specified (x,y) location. The image background color is returned if an error occurs. If you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead.

    + +

    The format of the GetOneCacheViewVirtualPixel method is:

    + +
    +MagickBooleanType GetOneCacheViewVirtualMethodPixel(
    +  const CacheView *cache_view,
    +  const VirtualPixelMethod virtual_pixel_method,const ssize_t x,
    +  const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    virtual_pixel_method
    +
    the virtual pixel method.
    + +
    +
    x,y
    +
    These values define the offset of the pixel.
    + +
    +
    pixel
    +
    return a pixel at the specified (x,y) location.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    QueueCacheViewAuthenticPixels

    + +

    QueueCacheViewAuthenticPixels() queues authentic pixels from the in-memory or disk pixel cache as defined by the geometry parameters. A pointer to the pixels is returned if the pixels are transferred, otherwise a NULL is returned.

    + +

    The format of the QueueCacheViewAuthenticPixels method is:

    + +
    +PixelPacket *QueueCacheViewAuthenticPixels(CacheView *cache_view,
    +  const ssize_t x,const ssize_t y,const size_t columns,
    +  const size_t rows,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a region of pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SetCacheViewStorageClass

    + +

    SetCacheViewStorageClass() sets the image storage class associated with the specified view.

    + +

    The format of the SetCacheViewStorageClass method is:

    + +
    +MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view,
    +  const ClassType storage_class)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    storage_class
    +
    the image storage class: PseudoClass or DirectClass.
    + +
    +
    +

    SetCacheViewVirtualPixelMethod

    + +

    SetCacheViewVirtualPixelMethod() sets the virtual pixel method associated with the specified cache view.

    + +

    The format of the SetCacheViewVirtualPixelMethod method is:

    + +
    +MagickBooleanType SetCacheViewVirtualPixelMethod(CacheView *cache_view,
    +  const VirtualPixelMethod virtual_pixel_method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    virtual_pixel_method
    +
    the virtual pixel method.
    + +
    +
    +

    SyncCacheViewAuthenticPixels

    + +

    SyncCacheViewAuthenticPixels() saves the cache view pixels to the in-memory or disk cache. It returns MagickTrue if the pixel region is flushed, otherwise MagickFalse.

    + +

    The format of the SyncCacheViewAuthenticPixels method is:

    + +
    +MagickBooleanType SyncCacheViewAuthenticPixels(CacheView *cache_view,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    cache_view
    +
    the cache view.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/cache.html b/ImageMagick-6.9.12-44/www/api/cache.html new file mode 100644 index 0000000..c9c2cdb --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/cache.html @@ -0,0 +1,577 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Get or Set Image Pixels + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquirePixelCacheNexusAcquirePixelCachePixelsGetAuthenticIndexQueueGetAuthenticPixelQueueGetAuthenticPixelsGetOneAuthenticPixelGetOneVirtualMagickPixelGetOneVirtualMethodPixelGetOneVirtualPixelGetVirtualIndexQueueGetVirtualPixelQueueGetVirtualPixelsQueueAuthenticPixelsSetPixelCacheVirtualMethodSyncAuthenticPixels

    + +

    AcquirePixelCacheNexus

    + +

    AcquirePixelCacheNexus() allocates the NexusInfo structure.

    + +

    The format of the AcquirePixelCacheNexus method is:

    + +
    +NexusInfo **AcquirePixelCacheNexus(const size_t number_threads)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    number_threads
    +
    the number of nexus threads.
    + +
    +
    +

    AcquirePixelCachePixels

    + +

    AcquirePixelCachePixels() returns the pixels associated with the specified image.

    + +

    The format of the AcquirePixelCachePixels() method is:

    + +
    +const void *AcquirePixelCachePixels(const Image *image,
    +  MagickSizeType *length,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    length
    +
    the pixel cache length.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetAuthenticIndexQueue

    + +

    GetAuthenticIndexQueue() returns the authentic black channel or the colormap indexes associated with the last call to QueueAuthenticPixels() or GetVirtualPixels(). NULL is returned if the black channel or colormap indexes are not available.

    + +

    The format of the GetAuthenticIndexQueue() method is:

    + +
    +IndexPacket *GetAuthenticIndexQueue(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    GetAuthenticPixelQueue

    + +

    GetAuthenticPixelQueue() returns the authentic pixels associated with the last call to QueueAuthenticPixels() or GetAuthenticPixels().

    + +

    The format of the GetAuthenticPixelQueue() method is:

    + +
    +PixelPacket *GetAuthenticPixelQueue(const Image image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    GetAuthenticPixels

    + +

    GetAuthenticPixels() obtains a pixel region for read/write access. If the region is successfully accessed, a pointer to a PixelPacket array representing the region is returned, otherwise NULL is returned.

    + +

    The returned pointer may point to a temporary working copy of the pixels or it may point to the original pixels in memory. Performance is maximized if the selected region is part of one row, or one or more full rows, since then there is opportunity to access the pixels in-place (without a copy) if the image is in memory, or in a memory-mapped file. The returned pointer must *never* be deallocated by the user.

    + +

    Pixels accessed via the returned pointer represent a simple array of type PixelPacket. If the image type is CMYK or if the storage class is PseduoClass, call GetAuthenticIndexQueue() after invoking GetAuthenticPixels() to obtain the black color component or colormap indexes (of type IndexPacket) corresponding to the region. Once the PixelPacket (and/or IndexPacket) array has been updated, the changes must be saved back to the underlying image using SyncAuthenticPixels() or they may be lost.

    + +

    The format of the GetAuthenticPixels() method is:

    + +
    +PixelPacket *GetAuthenticPixels(Image *image,const ssize_t x,
    +  const ssize_t y,const size_t columns,const size_t rows,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a region of pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetOneAuthenticPixel

    + +

    GetOneAuthenticPixel() returns a single pixel at the specified (x,y) location. The image background color is returned if an error occurs.

    + +

    The format of the GetOneAuthenticPixel() method is:

    + +
    +MagickBooleanType GetOneAuthenticPixel(const Image image,const ssize_t x,
    +  const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    x,y
    +
    These values define the location of the pixel to return.
    + +
    +
    pixel
    +
    return a pixel at the specified (x,y) location.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetOneVirtualMagickPixel

    + +

    GetOneVirtualMagickPixel() returns a single pixel at the specified (x,y) location. The image background color is returned if an error occurs. If you plan to modify the pixel, use GetOneAuthenticPixel() instead.

    + +

    The format of the GetOneVirtualMagickPixel() method is:

    + +
    +MagickBooleanType GetOneVirtualMagickPixel(const Image image,
    +  const ssize_t x,const ssize_t y,MagickPixelPacket *pixel,
    +  ExceptionInfo exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    x,y
    +
    these values define the location of the pixel to return.
    + +
    +
    pixel
    +
    return a pixel at the specified (x,y) location.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetOneVirtualMethodPixel

    + +

    GetOneVirtualMethodPixel() returns a single pixel at the specified (x,y) location as defined by specified pixel method. The image background color is returned if an error occurs. If you plan to modify the pixel, use GetOneAuthenticPixel() instead.

    + +

    The format of the GetOneVirtualMethodPixel() method is:

    + +
    +MagickBooleanType GetOneVirtualMethodPixel(const Image image,
    +  const VirtualPixelMethod virtual_pixel_method,const ssize_t x,
    +  const ssize_t y,Pixelpacket *pixel,ExceptionInfo exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    virtual_pixel_method
    +
    the virtual pixel method.
    + +
    +
    x,y
    +
    These values define the location of the pixel to return.
    + +
    +
    pixel
    +
    return a pixel at the specified (x,y) location.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetOneVirtualPixel

    + +

    GetOneVirtualPixel() returns a single virtual pixel at the specified (x,y) location. The image background color is returned if an error occurs. If you plan to modify the pixel, use GetOneAuthenticPixel() instead.

    + +

    The format of the GetOneVirtualPixel() method is:

    + +
    +MagickBooleanType GetOneVirtualPixel(const Image image,const ssize_t x,
    +  const ssize_t y,PixelPacket *pixel,ExceptionInfo exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    x,y
    +
    These values define the location of the pixel to return.
    + +
    +
    pixel
    +
    return a pixel at the specified (x,y) location.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetVirtualIndexQueue

    + +

    GetVirtualIndexQueue() returns the virtual black channel or the colormap indexes associated with the last call to QueueAuthenticPixels() or GetVirtualPixels(). NULL is returned if the black channel or colormap indexes are not available.

    + +

    The format of the GetVirtualIndexQueue() method is:

    + +
    +const IndexPacket *GetVirtualIndexQueue(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    GetVirtualPixelQueue

    + +

    GetVirtualPixelQueue() returns the virtual pixels associated with the last call to QueueAuthenticPixels() or GetVirtualPixels().

    + +

    The format of the GetVirtualPixelQueue() method is:

    + +
    +const PixelPacket *GetVirtualPixelQueue(const Image image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    GetVirtualPixels

    + +

    GetVirtualPixels() returns an immutable pixel region. If the region is successfully accessed, a pointer to it is returned, otherwise NULL is returned. The returned pointer may point to a temporary working copy of the pixels or it may point to the original pixels in memory. Performance is maximized if the selected region is part of one row, or one or more full rows, since there is opportunity to access the pixels in-place (without a copy) if the image is in memory, or in a memory-mapped file. The returned pointer must *never* be deallocated by the user.

    + +

    Pixels accessed via the returned pointer represent a simple array of type PixelPacket. If the image type is CMYK or the storage class is PseudoClass, call GetAuthenticIndexQueue() after invoking GetAuthenticPixels() to access the black color component or to obtain the colormap indexes (of type IndexPacket) corresponding to the region.

    + +

    If you plan to modify the pixels, use GetAuthenticPixels() instead.

    + +

    Note, the GetVirtualPixels() and GetAuthenticPixels() methods are not thread- safe. In a threaded environment, use GetCacheViewVirtualPixels() or GetCacheViewAuthenticPixels() instead.

    + +

    The format of the GetVirtualPixels() method is:

    + +
    +const PixelPacket *GetVirtualPixels(const Image *image,const ssize_t x,
    +  const ssize_t y,const size_t columns,const size_t rows,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a region of pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    QueueAuthenticPixels

    + +

    QueueAuthenticPixels() queues a mutable pixel region. If the region is successfully initialized a pointer to a PixelPacket array representing the region is returned, otherwise NULL is returned. The returned pointer may point to a temporary working buffer for the pixels or it may point to the final location of the pixels in memory.

    + +

    Write-only access means that any existing pixel values corresponding to the region are ignored. This is useful if the initial image is being created from scratch, or if the existing pixel values are to be completely replaced without need to refer to their pre-existing values. The application is free to read and write the pixel buffer returned by QueueAuthenticPixels() any way it pleases. QueueAuthenticPixels() does not initialize the pixel array values. Initializing pixel array values is the application's responsibility.

    + +

    Performance is maximized if the selected region is part of one row, or one or more full rows, since then there is opportunity to access the pixels in-place (without a copy) if the image is in memory, or in a memory-mapped file. The returned pointer must *never* be deallocated by the user.

    + +

    Pixels accessed via the returned pointer represent a simple array of type PixelPacket. If the image type is CMYK or the storage class is PseudoClass, call GetAuthenticIndexQueue() after invoking GetAuthenticPixels() to obtain the black color component or the colormap indexes (of type IndexPacket) corresponding to the region. Once the PixelPacket (and/or IndexPacket) array has been updated, the changes must be saved back to the underlying image using SyncAuthenticPixels() or they may be lost.

    + +

    The format of the QueueAuthenticPixels() method is:

    + +
    +PixelPacket *QueueAuthenticPixels(Image *image,const ssize_t x,
    +  const ssize_t y,const size_t columns,const size_t rows,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a region of pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SetPixelCacheVirtualMethod

    + +

    SetPixelCacheVirtualMethod() sets the "virtual pixels" method for the pixel cache and returns the previous setting. A virtual pixel is any pixel access that is outside the boundaries of the image cache.

    + +

    The format of the SetPixelCacheVirtualMethod() method is:

    + +
    +VirtualPixelMethod SetPixelCacheVirtualMethod(const Image *image,
    +  const VirtualPixelMethod virtual_pixel_method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    virtual_pixel_method
    +
    choose the type of virtual pixel.
    + +
    +
    +

    SyncAuthenticPixels

    + +

    SyncAuthenticPixels() saves the image pixels to the in-memory or disk cache. The method returns MagickTrue if the pixel region is flushed, otherwise MagickFalse.

    + +

    The format of the SyncAuthenticPixels() method is:

    + +
    +MagickBooleanType SyncAuthenticPixels(Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/channel.html b/ImageMagick-6.9.12-44/www/api/channel.html new file mode 100644 index 0000000..847e018 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/channel.html @@ -0,0 +1,258 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Get or Set Image Channels + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    CombineImagesGetImageAlphaChannelSeparateImageChannelSeparateImagesSetImageAlphaChannel

    + +

    CombineImages

    + +

    CombineImages() combines one or more images into a single image. The grayscale value of the pixels of each image in the sequence is assigned in order to the specified channels of the combined image. The typical ordering would be image 1 => Red, 2 => Green, 3 => Blue, etc.

    + +

    The format of the CombineImages method is:

    + +
    +Image *CombineImages(const Image *image,const ChannelType channel,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetImageAlphaChannel

    + +

    GetImageAlphaChannel() returns MagickFalse if the image alpha channel is not activated. That is, the image is RGB rather than RGBA or CMYK rather than CMYKA.

    + +

    The format of the GetImageAlphaChannel method is:

    + +
    +MagickBooleanType GetImageAlphaChannel(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    SeparateImageChannel

    + +

    SeparateImageChannel() separates a channel from the image and returns it as a grayscale image. A channel is a particular color component of each pixel in the image.

    + +

    The format of the SeparateImageChannel method is:

    + +
    +MagickBooleanType SeparateImageChannel(Image *image,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    Identify which channel to extract: RedChannel, GreenChannel, BlueChannel, OpacityChannel, CyanChannel, MagentaChannel, YellowChannel, or BlackChannel.
    + +
    +
    +

    SeparateImages

    + +

    SeparateImages() returns a separate grayscale image for each channel specified.

    + +

    The format of the SeparateImages method is:

    + +
    +MagickBooleanType SeparateImages(const Image *image,
    +  const ChannelType channel,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    Identify which channels to extract: RedChannel, GreenChannel, BlueChannel, OpacityChannel, CyanChannel, MagentaChannel, YellowChannel, or BlackChannel.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SetImageAlphaChannel

    + +

    SetImageAlphaChannel() activates, deactivates, resets, or sets the alpha channel.

    + +

    The format of the SetImageAlphaChannel method is:

    + +
    +MagickBooleanType SetImageAlphaChannel(Image *image,
    +  const AlphaChannelType alpha_type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    alpha_type
    +
    The alpha channel type: ActivateAlphaChannel, AssociateAlphaChannel, CopyAlphaChannel, Disassociate, DeactivateAlphaChannel, ExtractAlphaChannel, OpaqueAlphaChannel, ResetAlphaChannel, SetAlphaChannel, ShapeAlphaChannel, and TransparentAlphaChannel.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/cipher.html b/ImageMagick-6.9.12-44/www/api/cipher.html new file mode 100644 index 0000000..462b99b --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/cipher.html @@ -0,0 +1,357 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Convert to and from Cipher Pixels + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireAESInfoDestroyAESInfoEncipherAESBlockPasskeyDecipherImagePasskeyEncipherImageSetAESKeyPasskeyDecipherImagePasskeyEncipherImage

    + +

    AcquireAESInfo

    + +

    AcquireAESInfo() allocate the AESInfo structure.

    + +

    The format of the AcquireAESInfo method is:

    + +
    +AESInfo *AcquireAESInfo(void)
    +
    + +

    DestroyAESInfo

    + +

    DestroyAESInfo() zeros memory associated with the AESInfo structure.

    + +

    The format of the DestroyAESInfo method is:

    + +
    +AESInfo *DestroyAESInfo(AESInfo *aes_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    aes_info
    +
    the cipher context.
    + +
    +
    +

    EncipherAESBlock

    + +

    EncipherAESBlock() enciphers a single block of plaintext to produce a block of ciphertext.

    + +

    The format of the EncipherAESBlock method is:

    + +
    +void EncipherAES(AESInfo *aes_info,const unsigned char *plaintext,
    +  unsigned char *ciphertext)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    aes_info
    +
    the cipher context.
    + +
    +
    plaintext
    +
    the plain text.
    + +
    +
    ciphertext
    +
    the cipher text.
    + +
    +
    +

    PasskeyDecipherImage

    + +

    PasskeyDecipherImage() converts cipher pixels to plain pixels.

    + +

    The format of the PasskeyDecipherImage method is:

    + +
    +MagickBooleanType PasskeyDecipherImage(Image *image,
    +  const StringInfo *passkey,ExceptionInfo *exception)
    +MagickBooleanType DecipherImage(Image *image,const char *passphrase,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    passphrase
    +
    decipher cipher pixels with this passphrase.
    + +
    +
    passkey
    +
    decrypt cipher pixels with this passkey.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    PasskeyEncipherImage

    + +

    PasskeyEncipherImage() converts pixels to cipher-pixels.

    + +

    The format of the PasskeyEncipherImage method is:

    + +
    +MagickBooleanType PasskeyEncipherImage(Image *image,
    +  const StringInfo *passkey,ExceptionInfo *exception)
    +MagickBooleanType EncipherImage(Image *image,const char *passphrase,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    passphrase
    +
    encipher pixels with this passphrase.
    + +
    +
    passkey
    +
    decrypt cipher pixels with this passkey.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SetAESKey

    + +

    SetAESKey() sets the key for the AES cipher. The key length is specified in bits. Valid values are 128, 192, or 256 requiring a key buffer length in bytes of 16, 24, and 32 respectively.

    + +

    The format of the SetAESKey method is:

    + +
    +SetAESKey(AESInfo *aes_info,const StringInfo *key)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    aes_info
    +
    the cipher context.
    + +
    +
    key
    +
    the key.
    + +
    +
    +

    PasskeyDecipherImage

    + +

    PasskeyDecipherImage() converts cipher pixels to plain pixels.

    + +

    The format of the PasskeyDecipherImage method is:

    + +
    +MagickBooleanType PasskeyDecipherImage(Image *image,
    +  const StringInfo *passkey,ExceptionInfo *exception)
    +MagickBooleanType DecipherImage(Image *image,const char *passphrase,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    passphrase
    +
    decipher cipher pixels with this passphrase.
    + +
    +
    passkey
    +
    decrypt cipher pixels with this passkey.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    PasskeyEncipherImage

    + +

    PasskeyEncipherImage() converts pixels to cipher-pixels.

    + +

    The format of the PasskeyEncipherImage method is:

    + +
    +MagickBooleanType PasskeyEncipherImage(Image *image,
    +  const StringInfo *passkey,ExceptionInfo *exception)
    +MagickBooleanType EncipherImage(Image *image,const char *passphrase,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    passphrase
    +
    decipher cipher pixels with this passphrase.
    + +
    +
    passkey
    +
    decrypt cipher pixels with this passkey.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/color.html b/ImageMagick-6.9.12-44/www/api/color.html new file mode 100644 index 0000000..e7086d2 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/color.html @@ -0,0 +1,423 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Count the Colors in an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireColorCacheGetColorInfoListGetColorListListColorInfoQueryColorComplianceQueryColorDatabaseQueryColornameQueryMagickColorComplianceQueryMagickColorQueryMagickColorname

    + +

    AcquireColorCache

    + +

    AcquireColorCache() caches one or more color configurations which provides a mapping between color attributes and a color name.

    + +

    The format of the AcquireColorCache method is:

    + +
    +LinkedListInfo *AcquireColorCache(const char *filename,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    filename
    +
    the font file name.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetColorInfoList

    + +

    GetColorInfoList() returns any colors that match the specified pattern.

    + +

    The format of the GetColorInfoList function is:

    + +
    +const ColorInfo **GetColorInfoList(const char *pattern,
    +  size_t *number_colors,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_colors
    +
    This integer returns the number of colors in the list.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetColorList

    + +

    GetColorList() returns any colors that match the specified pattern.

    + +

    The format of the GetColorList function is:

    + +
    +char **GetColorList(const char *pattern,size_t *number_colors,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_colors
    +
    This integer returns the number of colors in the list.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ListColorInfo

    + +

    ListColorInfo() lists color names to the specified file. Color names are a convenience. Rather than defining a color by its red, green, and blue intensities just use a color name such as white, blue, or yellow.

    + +

    The format of the ListColorInfo method is:

    + +
    +MagickBooleanType ListColorInfo(FILE *file,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    file
    +

    List color names to this file handle.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    QueryColorCompliance

    + +

    QueryColorCompliance() returns the red, green, blue, and opacity intensities for a given color name.

    + +

    The format of the QueryColorCompliance method is:

    + +
    +MagickBooleanType QueryColorCompliance(const char *name,
    +  const ComplianceType compliance,PixelPacket *color,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    name
    +
    the color name (e.g. white, blue, yellow).
    + +
    +
    compliance
    +
    Adhere to this color standard: SVG, X11, or XPM.
    + +
    +
    color
    +
    the red, green, blue, and opacity intensities values of the named color in this structure.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    QueryColorDatabase

    + +

    QueryColorDatabase() returns the red, green, blue, and opacity intensities for a given color name.

    + +

    The format of the QueryColorDatabase method is:

    + +
    +MagickBooleanType QueryColorDatabase(const char *name,PixelPacket *color,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    name
    +
    the color name (e.g. white, blue, yellow).
    + +
    +
    color
    +
    the red, green, blue, and opacity intensities values of the named color in this structure.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    QueryColorname

    + +

    QueryColorname() returns a named color for the given color intensity. If an exact match is not found, a rgb() color is returned instead.

    + +

    The format of the QueryColorname method is:

    + +
    +MagickBooleanType QueryColorname(const Image *image,
    +  const PixelPacket *color,const ComplianceType compliance,char *name,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    color
    +

    the color intensities.

    + +
    compliance
    +

    Adhere to this color standard: SVG, X11, or XPM.

    + +
    name
    +

    Return the color name or hex value.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    QueryMagickColorCompliance

    + +

    QueryMagickColorCompliance() returns the red, green, blue, and opacity intensities for a given color name and standards compliance.

    + +

    The format of the QueryMagickColor method is:

    + +
    +MagickBooleanType QueryMagickColorCompiliance(const char *name,
    +  const ComplianceType compliance,MagickPixelPacket *color,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    name
    +
    the color name (e.g. white, blue, yellow).
    + +
    +
    compliance
    +
    Adhere to this color standard: SVG, X11, or XPM.
    + +
    +
    color
    +
    the red, green, blue, and opacity intensities values of the named color in this structure.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    QueryMagickColor

    + +

    QueryMagickColor() returns the red, green, blue, and opacity intensities for a given color name.

    + +

    The format of the QueryMagickColor method is:

    + +
    +MagickBooleanType QueryMagickColor(const char *name,
    +  MagickPixelPacket *color,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    name
    +
    the color name (e.g. white, blue, yellow).
    + +
    +
    color
    +
    the red, green, blue, and opacity intensities values of the named color in this structure.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    QueryMagickColorname

    + +

    QueryMagickColorname() returns a named color for the given color intensity. If an exact match is not found, a hex value is returned instead. For example an intensity of rgb:(0,0,0) returns black whereas rgb:(223,223,223) returns #dfdfdf.

    + +

    The format of the QueryMagickColorname method is:

    + +
    +MagickBooleanType QueryMagickColorname(const Image *image,
    +  const PixelPacket *color,const ComplianceType compliance,char *name,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    color
    +

    the color intensities.

    + +
    Compliance
    +

    Adhere to this color standard: SVG, X11, or XPM.

    + +
    name
    +

    Return the color name or hex value.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/colormap.html b/ImageMagick-6.9.12-44/www/api/colormap.html new file mode 100644 index 0000000..4456df4 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/colormap.html @@ -0,0 +1,176 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Colormap Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireImageColormapCycleColormap

    + +

    AcquireImageColormap

    + +

    AcquireImageColormap() allocates an image colormap and initializes it to a linear gray colorspace. If the image already has a colormap, it is replaced. AcquireImageColormap() returns MagickTrue if successful, otherwise MagickFalse if there is not enough memory.

    + +

    The format of the AcquireImageColormap method is:

    + +
    +MagickBooleanType AcquireImageColormap(Image *image,const size_t colors)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    colors
    +
    the number of colors in the image colormap.
    + +
    +
    +

    CycleColormap

    + +

    CycleColormap() displaces an image's colormap by a given number of positions. If you cycle the colormap a number of times you can produce a psychodelic effect.

    + +

    The format of the CycleColormapImage method is:

    + +
    +MagickBooleanType CycleColormapImage(Image *image,const ssize_t displace)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    displace
    +
    displace the colormap this amount.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/colorspace.html b/ImageMagick-6.9.12-44/www/api/colorspace.html new file mode 100644 index 0000000..9ab292b --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/colorspace.html @@ -0,0 +1,266 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Dealing with Image Colorspaces + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    GetImageColorspaceTypeSetImageColorspaceSetImageGraySetImageMonochromeTransformImageColorspace

    + +

    GetImageColorspaceType

    + +

    GetImageColorspaceType() returns the potential colorspace of image: sRGBColorspaceType, RGBColorspaceType, GRAYColorspaceType, etc.

    + +

    To ensure the image type matches its potential, use SetImageColorspaceType():

    + +
    +    (void) SetImageColorspaceType(image,GetImageColorspaceType(image),
    +exception);
    +
    + +

    The format of the GetImageColorspaceType method is:

    + +
    +ColorspaceType GetImageColorspaceType(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SetImageColorspace

    + +

    SetImageColorspace() sets the colorspace member of the Image structure.

    + +

    The format of the SetImageColorspace method is:

    + +
    +MagickBooleanType SetImageColorspace(Image *image,
    +  const ColorspaceType colorspace)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    colorspace
    +
    the colorspace.
    + +
    +
    +

    SetImageGray

    + +

    SetImageGray() returns MagickTrue if all the pixels in the image have the same red, green, and blue intensities and changes the type of the image to bi-level or grayscale.

    + +

    The format of the SetImageGray method is:

    + +
    +MagickBooleanType SetImageGray(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SetImageMonochrome

    + +

    SetImageMonochrome() returns MagickTrue if all the pixels in the image have the same red, green, and blue intensities and the intensity is either 0 or QuantumRange and changes the type of the image to bi-level.

    + +

    The format of the SetImageMonochrome method is:

    + +
    +MagickBooleanType SetImageMonochrome(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    TransformImageColorspace

    + +

    TransformImageColorspace() transforms an image colorspace.

    + +

    The format of the TransformImageColorspace method is:

    + +
    +MagickBooleanType TransformImageColorspace(Image *image,
    +  const ColorspaceType colorspace)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    colorspace
    +
    the colorspace.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/compare.html b/ImageMagick-6.9.12-44/www/api/compare.html new file mode 100644 index 0000000..e44d478 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/compare.html @@ -0,0 +1,163 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Compare an Image to a Reconstructed Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    CompareImageCommand

    + +

    CompareImageCommand

    + +

    CompareImageCommand() compares two images and returns the difference between them as a distortion metric and as a new image visually annotating their differences.

    + +

    The format of the CompareImageCommand method is:

    + +
    +MagickBooleanType CompareImageCommand(ImageInfo *image_info,int argc,
    +  char **argv,char **metadata,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    argc
    +
    the number of elements in the argument vector.
    + +
    +
    argv
    +
    A text array containing the command line arguments.
    + +
    +
    metadata
    +
    any metadata is returned here.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/composite.html b/ImageMagick-6.9.12-44/www/api/composite.html new file mode 100644 index 0000000..84f9a3c --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/composite.html @@ -0,0 +1,163 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Composite an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    CompositeImageCommand

    + +

    CompositeImageCommand

    + +

    CompositeImageCommand() reads one or more images and an optional mask and composites them into a new image.

    + +

    The format of the CompositeImageCommand method is:

    + +
    +MagickBooleanType CompositeImageCommand(ImageInfo *image_info,int argc,
    +  char **argv,char **metadata,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    argc
    +
    the number of elements in the argument vector.
    + +
    +
    argv
    +
    A text array containing the command line arguments.
    + +
    +
    metadata
    +
    any metadata is returned here.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/constitute.html b/ImageMagick-6.9.12-44/www/api/constitute.html new file mode 100644 index 0000000..cb12ced --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/constitute.html @@ -0,0 +1,337 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Constitute an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    ConstituteImagePingImagePingImagesReadImageReadImagesWriteImageWriteImages

    + +

    ConstituteImage

    + +

    ConstituteImage() returns an image from the pixel data you supply. The pixel data must be in scanline order top-to-bottom. The data can be char, short int, int, float, or double. Float and double require the pixels to be normalized [0..1], otherwise [0..QuantumRange]. For example, to create a 640x480 image from unsigned red-green-blue character data, use:

    + +
    +image = ConstituteImage(640,480,"RGB",CharPixel,pixels,&exception);
    +
    + +

    The format of the ConstituteImage method is:

    + +
    +Image *ConstituteImage(const size_t columns,const size_t rows,
    +  const char *map,const StorageType storage,const void *pixels,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    columns
    +
    width in pixels of the image.
    + +
    +
    rows
    +
    height in pixels of the image.
    + +
    +
    map
    +
    This string reflects the expected ordering of the pixel array. It can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad.
    + +
    +
    storage
    +
    Define the data type of the pixels. Float and double types are expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, LongPixel, QuantumPixel, or ShortPixel.
    + +
    +
    pixels
    +
    This array of values contain the pixel components as defined by map and type. You must preallocate this array where the expected length varies depending on the values of width, height, map, and type.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    PingImage

    + +

    PingImage() returns all the properties of an image or image sequence except for the pixels. It is much faster and consumes far less memory than ReadImage(). On failure, a NULL image is returned and exception describes the reason for the failure.

    + +

    The format of the PingImage method is:

    + +
    +Image *PingImage(const ImageInfo *image_info,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    Ping the image defined by the file or filename members of this structure.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    PingImages

    + +

    PingImages() pings one or more images and returns them as an image list.

    + +

    The format of the PingImage method is:

    + +
    +Image *PingImages(const ImageInfo *image_info,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ReadImage

    + +

    ReadImage() reads an image or image sequence from a file or file handle. The method returns a NULL if there is a memory shortage or if the image cannot be read. On failure, a NULL image is returned and exception describes the reason for the failure.

    + +

    The format of the ReadImage method is:

    + +
    +Image *ReadImage(const ImageInfo *image_info,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    Read the image defined by the file or filename members of this structure.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ReadImages

    + +

    ReadImages() reads one or more images and returns them as an image list.

    + +

    The format of the ReadImage method is:

    + +
    +Image *ReadImages(const ImageInfo *image_info,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    WriteImage

    + +

    WriteImage() writes an image or an image sequence to a file or file handle. If writing to a file is on disk, the name is defined by the filename member of the image structure. WriteImage() returns MagickFalse is there is a memory shortage or if the image cannot be written. Check the exception member of image to determine the cause for any failure.

    + +

    The format of the WriteImage method is:

    + +
    +MagickBooleanType WriteImage(const ImageInfo *image_info,Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    image
    +
    the image.
    + +
    +
    +

    WriteImages

    + +

    WriteImages() writes an image sequence into one or more files. While WriteImage() can write an image sequence, it is limited to writing the sequence into a single file using a format which supports multiple frames. WriteImages(), however, does not have this limitation, instead it generates multiple output files if necessary (or when requested). When ImageInfo's adjoin flag is set to MagickFalse, the file name is expected to include a printf-style formatting string for the frame number (e.g. "image02d.png").

    + +

    The format of the WriteImages method is:

    + +
    +MagickBooleanType WriteImages(const ImageInfo *image_info,Image *images,
    +  const char *filename,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    images
    +
    the image list.
    + +
    +
    filename
    +
    the image filename.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/decorate.html b/ImageMagick-6.9.12-44/www/api/decorate.html new file mode 100644 index 0000000..d58e37b --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/decorate.html @@ -0,0 +1,217 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Decorate an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    BorderImageFrameImageRaiseImage

    + +

    BorderImage

    + +

    BorderImage() surrounds the image with a border of the color defined by the bordercolor member of the image structure. The width and height of the border are defined by the corresponding members of the border_info structure.

    + +

    The format of the BorderImage method is:

    + +
    +Image *BorderImage(const Image *image,const RectangleInfo *border_info,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    border_info
    +
    Define the width and height of the border.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    FrameImage

    + +

    FrameImage() adds a simulated three-dimensional border around the image. The color of the border is defined by the matte_color member of image. Members width and height of frame_info specify the border width of the vertical and horizontal sides of the frame. Members inner and outer indicate the width of the inner and outer shadows of the frame.

    + +

    The format of the FrameImage method is:

    + +
    +Image *FrameImage(const Image *image,const FrameInfo *frame_info,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    frame_info
    +
    Define the width and height of the frame and its bevels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    RaiseImage

    + +

    RaiseImage() creates a simulated three-dimensional button-like effect by lightening and darkening the edges of the image. Members width and height of raise_info define the width of the vertical and horizontal edge of the effect.

    + +

    The format of the RaiseImage method is:

    + +
    +MagickBooleanType RaiseImage(const Image *image,
    +  const RectangleInfo *raise_info,const MagickBooleanType raise)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    raise_info
    +
    Define the width and height of the raise area.
    + +
    +
    raise
    +
    A value other than zero creates a 3-D raise effect, otherwise it has a lowered effect.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/deprecate.html b/ImageMagick-6.9.12-44/www/api/deprecate.html new file mode 100644 index 0000000..7d79ba3 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/deprecate.html @@ -0,0 +1,1738 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Deprecated Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    MagickAverageImagesClonePixelViewDestroyPixelViewDuplexTransferPixelViewIteratorGetPixelViewExceptionGetPixelViewHeightGetPixelViewIteratorGetPixelViewPixelsGetPixelViewWandGetPixelViewWidthGetPixelViewXGetPixelViewYIsPixelViewMagickClipPathImageDrawGetFillAlphaDrawGetStrokeAlphaDrawPeekGraphicWandDrawPopGraphicContextDrawPushGraphicContextDrawSetFillAlphaDrawSetStrokeAlphaMagickColorFloodfillImageMagickDescribeImageMagickFlattenImagesMagickGetImageAttributeMagickGetImageMatteMagickGetImagePixelsMagickGetImageSizeMagickMapImageMagickMatteFloodfillImageMagickMedianFilterImageMagickMinimumImagesMagickModeImageMagickMosaicImagesMagickOpaqueImageMagickPaintFloodfillImageMagickPaintOpaqueImageMagickPaintTransparentImageMagickRadialBlurImageMagickRecolorImageMagickReduceNoiseImageMagickMaximumImagesMagickSetImageAttributeMagickSetImageIndexMagickTransparentImageMagickRegionOfInterestImageMagickSetImagePixelsMagickWriteImageBlobNewPixelViewNewPixelViewRegionPixelGetNextRowPixelIteratorGetExceptionSetPixelViewIteratorTransferPixelViewIteratorUpdatePixelViewIterator

    + +

    MagickAverageImages

    + +

    MagickAverageImages() average a set of images.

    + +

    The format of the MagickAverageImages method is:

    + +
    +MagickWand *MagickAverageImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    ClonePixelView

    + +

    ClonePixelView() makes a copy of the specified pixel view.

    + +

    The format of the ClonePixelView method is:

    + +
    +PixelView *ClonePixelView(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    DestroyPixelView

    + +

    DestroyPixelView() deallocates memory associated with a pixel view.

    + +

    The format of the DestroyPixelView method is:

    + +
    +PixelView *DestroyPixelView(PixelView *pixel_view,
    +  const size_t number_wands,const size_t number_threads)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    number_wand
    +
    the number of pixel wands.
    + +
    +
    number_threads
    +
    number of threads.
    + +
    +
    +

    DuplexTransferPixelViewIterator

    + +

    DuplexTransferPixelViewIterator() iterates over three pixel views in parallel and calls your transfer method for each scanline of the view. The source and duplex pixel region is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. However, the destination pixel view is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted.

    + +

    Use this pragma:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback transfer method that must be executed by a single thread at a time.

    + +

    The format of the DuplexTransferPixelViewIterator method is:

    + +
    +MagickBooleanType DuplexTransferPixelViewIterator(PixelView *source,
    +  PixelView *duplex,PixelView *destination,
    +  DuplexTransferPixelViewMethod transfer,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source pixel view.
    + +
    +
    duplex
    +
    the duplex pixel view.
    + +
    +
    destination
    +
    the destination pixel view.
    + +
    +
    transfer
    +
    the transfer callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    GetPixelViewException

    + +

    GetPixelViewException() returns the severity, reason, and description of any error that occurs when utilizing a pixel view.

    + +

    The format of the GetPixelViewException method is:

    + +
    +char *GetPixelViewException(const PixelWand *pixel_view,
    +  ExceptionType *severity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel pixel_view.
    + +
    +
    severity
    +
    the severity of the error is returned here.
    + +
    +
    +

    GetPixelViewHeight

    + +

    GetPixelViewHeight() returns the pixel view height.

    + +

    The format of the GetPixelViewHeight method is:

    + +
    +size_t GetPixelViewHeight(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    GetPixelViewIterator

    + +

    GetPixelViewIterator() iterates over the pixel view in parallel and calls your get method for each scanline of the view. The pixel region is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. Any updates to the pixels in your callback are ignored.

    + +

    Use this pragma:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback get method that must be executed by a single thread at a time.

    + +

    The format of the GetPixelViewIterator method is:

    + +
    +MagickBooleanType GetPixelViewIterator(PixelView *source,
    +  GetPixelViewMethod get,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source pixel view.
    + +
    +
    get
    +
    the get callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    GetPixelViewPixels

    + +

    GetPixelViewPixels() returns the pixel view pixel_wands.

    + +

    The format of the GetPixelViewPixels method is:

    + +
    +PixelWand *GetPixelViewPixels(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    GetPixelViewWand

    + +

    GetPixelViewWand() returns the magick wand associated with the pixel view.

    + +

    The format of the GetPixelViewWand method is:

    + +
    +MagickWand *GetPixelViewWand(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    GetPixelViewWidth

    + +

    GetPixelViewWidth() returns the pixel view width.

    + +

    The format of the GetPixelViewWidth method is:

    + +
    +size_t GetPixelViewWidth(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    GetPixelViewX

    + +

    GetPixelViewX() returns the pixel view x offset.

    + +

    The format of the GetPixelViewX method is:

    + +
    +ssize_t GetPixelViewX(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    GetPixelViewY

    + +

    GetPixelViewY() returns the pixel view y offset.

    + +

    The format of the GetPixelViewY method is:

    + +
    +ssize_t GetPixelViewY(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    IsPixelView

    + +

    IsPixelView() returns MagickTrue if the parameter is verified as a pixel view container.

    + +

    The format of the IsPixelView method is:

    + +
    +MagickBooleanType IsPixelView(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    MagickClipPathImage

    + +

    MagickClipPathImage() clips along the named paths from the 8BIM profile, if present. Later operations take effect inside the path. Id may be a number if preceded with #, to work on a numbered path, e.g., "#1" to use the first path.

    + +

    The format of the MagickClipPathImage method is:

    + +
    +MagickBooleanType MagickClipPathImage(MagickWand *wand,
    +  const char *pathname,const MagickBooleanType inside)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    pathname
    +
    name of clipping path resource. If name is preceded by #, use clipping path numbered by name.
    + +
    +
    inside
    +
    if non-zero, later operations take effect inside clipping path. Otherwise later operations take effect outside clipping path.
    + +
    +
    +

    DrawGetFillAlpha

    + +

    DrawGetFillAlpha() returns the alpha used when drawing using the fill color or fill texture. Fully opaque is 1.0.

    + +

    The format of the DrawGetFillAlpha method is:

    + +
    +double DrawGetFillAlpha(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetStrokeAlpha

    + +

    DrawGetStrokeAlpha() returns the alpha of stroked object outlines.

    + +

    The format of the DrawGetStrokeAlpha method is:

    + +
    +double DrawGetStrokeAlpha(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    +
    +

    DrawPeekGraphicWand

    + +

    DrawPeekGraphicWand() returns the current drawing wand.

    + +

    The format of the PeekDrawingWand method is:

    + +
    +DrawInfo *DrawPeekGraphicWand(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPopGraphicContext

    + +

    DrawPopGraphicContext() destroys the current drawing wand and returns to the previously pushed drawing wand. Multiple drawing wands may exist. It is an error to attempt to pop more drawing wands than have been pushed, and it is proper form to pop all drawing wands which have been pushed.

    + +

    The format of the DrawPopGraphicContext method is:

    + +
    +MagickBooleanType DrawPopGraphicContext(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPushGraphicContext

    + +

    DrawPushGraphicContext() clones the current drawing wand to create a new drawing wand. The original drawing wand(s) may be returned to by invoking PopDrawingWand(). The drawing wands are stored on a drawing wand stack. For every Pop there must have already been an equivalent Push.

    + +

    The format of the DrawPushGraphicContext method is:

    + +
    +MagickBooleanType DrawPushGraphicContext(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawSetFillAlpha

    + +

    DrawSetFillAlpha() sets the alpha to use when drawing using the fill color or fill texture. Fully opaque is 1.0.

    + +

    The format of the DrawSetFillAlpha method is:

    + +
    +void DrawSetFillAlpha(DrawingWand *wand,const double fill_alpha)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    fill_alpha
    +
    fill alpha
    + +
    +
    +

    DrawSetStrokeAlpha

    + +

    DrawSetStrokeAlpha() specifies the alpha of stroked object outlines.

    + +

    The format of the DrawSetStrokeAlpha method is:

    + +
    +void DrawSetStrokeAlpha(DrawingWand *wand,const double stroke_alpha)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    stroke_alpha
    +
    stroke alpha. The value 1.0 is opaque.
    + +
    +
    +

    MagickColorFloodfillImage

    + +

    MagickColorFloodfillImage() changes the color value of any pixel that matches target and is an immediate neighbor. If the method FillToBorderMethod is specified, the color value is changed for any neighbor pixel that does not match the bordercolor member of image.

    + +

    The format of the MagickColorFloodfillImage method is:

    + +
    +MagickBooleanType MagickColorFloodfillImage(MagickWand *wand,
    +  const PixelWand *fill,const double fuzz,const PixelWand *bordercolor,
    +  const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    fill
    +
    the floodfill color pixel wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    bordercolor
    +
    the border color pixel wand.
    + +
    +
    x,y
    +
    the starting location of the operation.
    + +
    +
    +

    MagickDescribeImage

    + +

    MagickDescribeImage() identifies an image by printing its attributes to the file. Attributes include the image width, height, size, and others.

    + +

    The format of the MagickDescribeImage method is:

    + +
    +const char *MagickDescribeImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickFlattenImages

    + +

    MagickFlattenImages() merges a sequence of images. This useful for combining Photoshop layers into a single image.

    + +

    The format of the MagickFlattenImages method is:

    + +
    +MagickWand *MagickFlattenImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageAttribute

    + +

    MagickGetImageAttribute() returns a value associated with the specified property. Use MagickRelinquishMemory() to free the value when you are finished with it.

    + +

    The format of the MagickGetImageAttribute method is:

    + +
    +char *MagickGetImageAttribute(MagickWand *wand,const char *property)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    property
    +
    the property.
    + +
    +
    +

    MagickGetImageMatte

    + +

    MagickGetImageMatte() returns MagickTrue if the image has a matte channel otherwise MagickFalse.

    + +

    The format of the MagickGetImageMatte method is:

    + +
    +size_t MagickGetImageMatte(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImagePixels

    + +

    MagickGetImagePixels() extracts pixel data from an image and returns it to you. The method returns MagickTrue on success otherwise MagickFalse if an error is encountered. The data is returned as char, short int, int, ssize_t, float, or double in the order specified by map.

    + +

    Suppose you want to extract the first scanline of a 640x480 image as character data in red-green-blue order:

    + +
    +MagickGetImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
    +
    + +

    The format of the MagickGetImagePixels method is:

    + +
    +MagickBooleanType MagickGetImagePixels(MagickWand *wand,
    +  const ssize_t x,const ssize_t y,const size_t columns,
    +  const size_t rows,const char *map,const StorageType storage,
    +  void *pixels)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x, y, columns, rows
    +
    These values define the perimeter of a region of pixels you want to extract.
    + +
    +
    map
    +
    This string reflects the expected ordering of the pixel array. It can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad.
    + +
    +
    storage
    +
    Define the data type of the pixels. Float and double types are expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, LongPixel, QuantumPixel, or ShortPixel.
    + +
    +
    pixels
    +
    This array of values contain the pixel components as defined by map and type. You must preallocate this array where the expected length varies depending on the values of width, height, map, and type.
    + +
    +
    +

    MagickGetImageSize

    + +

    MagickGetImageSize() returns the image length in bytes.

    + +

    The format of the MagickGetImageSize method is:

    + +
    +MagickBooleanType MagickGetImageSize(MagickWand *wand,
    +  MagickSizeType *length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    length
    +
    the image length in bytes.
    + +
    +
    +

    MagickMapImage

    + +

    MagickMapImage() replaces the colors of an image with the closest color from a reference image.

    + +

    The format of the MagickMapImage method is:

    + +
    +MagickBooleanType MagickMapImage(MagickWand *wand,
    +  const MagickWand *map_wand,const MagickBooleanType dither)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    map
    +
    the map wand.
    + +
    +
    dither
    +
    Set this integer value to something other than zero to dither the mapped image.
    + +
    +
    +

    MagickMatteFloodfillImage

    + +

    MagickMatteFloodfillImage() changes the transparency value of any pixel that matches target and is an immediate neighbor. If the method FillToBorderMethod is specified, the transparency value is changed for any neighbor pixel that does not match the bordercolor member of image.

    + +

    The format of the MagickMatteFloodfillImage method is:

    + +
    +MagickBooleanType MagickMatteFloodfillImage(MagickWand *wand,
    +  const double alpha,const double fuzz,const PixelWand *bordercolor,
    +  const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    alpha
    +
    the level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    bordercolor
    +
    the border color pixel wand.
    + +
    +
    x,y
    +
    the starting location of the operation.
    + +
    +
    +

    MagickMedianFilterImage

    + +

    MagickMedianFilterImage() applies a digital filter that improves the quality of a noisy image. Each pixel is replaced by the median in a set of neighboring pixels as defined by radius.

    + +

    The format of the MagickMedianFilterImage method is:

    + +
    +MagickBooleanType MagickMedianFilterImage(MagickWand *wand,
    +  const double radius)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the pixel neighborhood.
    + +
    +
    +

    MagickMinimumImages

    + +

    MagickMinimumImages() returns the minimum intensity of an image sequence.

    + +

    The format of the MagickMinimumImages method is:

    + +
    +MagickWand *MagickMinimumImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickModeImage

    + +

    MagickModeImage() makes each pixel the 'predominant color' of the neighborhood of the specified radius.

    + +

    The format of the MagickModeImage method is:

    + +
    +MagickBooleanType MagickModeImage(MagickWand *wand,
    +  const double radius)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the pixel neighborhood.
    + +
    +
    +

    MagickMosaicImages

    + +

    MagickMosaicImages() inlays an image sequence to form a single coherent picture. It returns a wand with each image in the sequence composited at the location defined by the page offset of the image.

    + +

    The format of the MagickMosaicImages method is:

    + +
    +MagickWand *MagickMosaicImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickOpaqueImage

    + +

    MagickOpaqueImage() changes any pixel that matches color with the color defined by fill.

    + +

    The format of the MagickOpaqueImage method is:

    + +
    +MagickBooleanType MagickOpaqueImage(MagickWand *wand,
    +  const PixelWand *target,const PixelWand *fill,const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    target
    +
    Change this target color to the fill color within the image.
    + +
    +
    fill
    +
    the fill pixel wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    +

    MagickPaintFloodfillImage

    + +

    MagickPaintFloodfillImage() changes the color value of any pixel that matches target and is an immediate neighbor. If the method FillToBorderMethod is specified, the color value is changed for any neighbor pixel that does not match the bordercolor member of image.

    + +

    The format of the MagickPaintFloodfillImage method is:

    + +
    +MagickBooleanType MagickPaintFloodfillImage(MagickWand *wand,
    +  const ChannelType channel,const PixelWand *fill,const double fuzz,
    +  const PixelWand *bordercolor,const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    fill
    +
    the floodfill color pixel wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    bordercolor
    +
    the border color pixel wand.
    + +
    +
    x,y
    +
    the starting location of the operation.
    + +
    +
    +

    MagickPaintOpaqueImage

    + +

    MagickPaintOpaqueImage() changes any pixel that matches color with the color defined by fill.

    + +

    The format of the MagickPaintOpaqueImage method is:

    + +
    +MagickBooleanType MagickPaintOpaqueImage(MagickWand *wand,
    +  const PixelWand *target,const PixelWand *fill,const double fuzz)
    +MagickBooleanType MagickPaintOpaqueImageChannel(MagickWand *wand,
    +  const ChannelType channel,const PixelWand *target,
    +  const PixelWand *fill,const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    target
    +
    Change this target color to the fill color within the image.
    + +
    +
    fill
    +
    the fill pixel wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    +

    MagickPaintTransparentImage

    + +

    MagickPaintTransparentImage() changes any pixel that matches color with the color defined by fill.

    + +

    The format of the MagickPaintTransparentImage method is:

    + +
    +MagickBooleanType MagickPaintTransparentImage(MagickWand *wand,
    +  const PixelWand *target,const double alpha,const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    target
    +
    Change this target color to specified opacity value within the image.
    + +
    +
    alpha
    +
    the level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    +

    MagickRadialBlurImage

    + +

    MagickRadialBlurImage() radial blurs an image.

    + +

    The format of the MagickRadialBlurImage method is:

    + +
    +MagickBooleanType MagickRadialBlurImage(MagickWand *wand,
    +  const double angle)
    +MagickBooleanType MagickRadialBlurImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double angle)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    angle
    +
    the angle of the blur in degrees.
    + +
    +
    +

    MagickRecolorImage

    + +

    MagickRecolorImage() apply color transformation to an image. The method permits saturation changes, hue rotation, luminance to alpha, and various other effects. Although variable-sized transformation matrices can be used, typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA (or RGBA with offsets). The matrix is similar to those used by Adobe Flash except offsets are in column 6 rather than 5 (in support of CMYKA images) and offsets are normalized (divide Flash offset by 255).

    + +

    The format of the MagickRecolorImage method is:

    + +
    +MagickBooleanType MagickRecolorImage(MagickWand *wand,
    +  const size_t order,const double *color_matrix)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    order
    +
    the number of columns and rows in the color matrix.
    + +
    +
    color_matrix
    +
    An array of doubles representing the color matrix.
    + +
    +
    +

    MagickReduceNoiseImage

    + +

    MagickReduceNoiseImage() smooths the contours of an image while still preserving edge information. The algorithm works by replacing each pixel with its neighbor closest in value. A neighbor is defined by radius. Use a radius of 0 and ReduceNoise() selects a suitable radius for you.

    + +

    The format of the MagickReduceNoiseImage method is:

    + +
    +MagickBooleanType MagickReduceNoiseImage(MagickWand *wand,
    +  const double radius)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the pixel neighborhood.
    + +
    +
    +

    MagickMaximumImages

    + +

    MagickMaximumImages() returns the maximum intensity of an image sequence.

    + +

    The format of the MagickMaximumImages method is:

    + +
    +MagickWand *MagickMaximumImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickSetImageAttribute

    + +

    MagickSetImageAttribute() associates a property with an image.

    + +

    The format of the MagickSetImageAttribute method is:

    + +
    +MagickBooleanType MagickSetImageAttribute(MagickWand *wand,
    +  const char *property,const char *value)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    property
    +
    the property.
    + +
    +
    value
    +
    the value.
    + +
    +
    +

    MagickSetImageIndex

    + +

    MagickSetImageIndex() set the current image to the position of the list specified with the index parameter.

    + +

    The format of the MagickSetImageIndex method is:

    + +
    +MagickBooleanType MagickSetImageIndex(MagickWand *wand,
    +  const ssize_t index)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    index
    +
    the scene number.
    + +
    +
    +

    MagickTransparentImage

    + +

    MagickTransparentImage() changes any pixel that matches color with the color defined by fill.

    + +

    The format of the MagickTransparentImage method is:

    + +
    +MagickBooleanType MagickTransparentImage(MagickWand *wand,
    +  const PixelWand *target,const double alpha,const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    target
    +
    Change this target color to specified opacity value within the image.
    + +
    +
    alpha
    +
    the level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    +

    MagickRegionOfInterestImage

    + +

    MagickRegionOfInterestImage() extracts a region of the image and returns it as a new wand.

    + +

    The format of the MagickRegionOfInterestImage method is:

    + +
    +MagickWand *MagickRegionOfInterestImage(MagickWand *wand,
    +  const size_t width,const size_t height,const ssize_t x,
    +  const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the region width.
    + +
    +
    height
    +
    the region height.
    + +
    +
    x
    +
    the region x offset.
    + +
    +
    y
    +
    the region y offset.
    + +
    +
    +

    MagickSetImagePixels

    + +

    MagickSetImagePixels() accepts pixel datand stores it in the image at the location you specify. The method returns MagickFalse on success otherwise MagickTrue if an error is encountered. The pixel data can be either char, short int, int, ssize_t, float, or double in the order specified by map.

    + +

    Suppose your want to upload the first scanline of a 640x480 image from character data in red-green-blue order:

    + +
    +MagickSetImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
    +
    + +

    The format of the MagickSetImagePixels method is:

    + +
    +MagickBooleanType MagickSetImagePixels(MagickWand *wand,
    +  const ssize_t x,const ssize_t y,const size_t columns,
    +  const size_t rows,const char *map,const StorageType storage,
    +  const void *pixels)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x, y, columns, rows
    +
    These values define the perimeter of a region of pixels you want to define.
    + +
    +
    map
    +
    This string reflects the expected ordering of the pixel array. It can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad.
    + +
    +
    storage
    +
    Define the data type of the pixels. Float and double types are expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from these types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel, or DoublePixel.
    + +
    +
    pixels
    +
    This array of values contain the pixel components as defined by map and type. You must preallocate this array where the expected length varies depending on the values of width, height, map, and type.
    + +
    +
    +

    MagickWriteImageBlob

    + +

    MagickWriteImageBlob() implements direct to memory image formats. It returns the image as a blob and its length. Use MagickSetFormat() to set the format of the returned blob (GIF, JPEG, PNG, etc.).

    + +

    Use MagickRelinquishMemory() to free the blob when you are done with it.

    + +

    The format of the MagickWriteImageBlob method is:

    + +
    +unsigned char *MagickWriteImageBlob(MagickWand *wand,size_t *length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    length
    +
    the length of the blob.
    + +
    +
    +

    NewPixelView

    + +

    NewPixelView() returns a pixel view required for all other methods in the Pixel View API.

    + +

    The format of the NewPixelView method is:

    + +
    +PixelView *NewPixelView(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the wand.
    + +
    +
    +

    NewPixelViewRegion

    + +

    NewPixelViewRegion() returns a pixel view required for all other methods in the Pixel View API.

    + +

    The format of the NewPixelViewRegion method is:

    + +
    +PixelView *NewPixelViewRegion(MagickWand *wand,const ssize_t x,
    +  const ssize_t y,const size_t width,const size_t height)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a region of pixel_wands view.
    + +
    +
    +

    PixelGetNextRow

    + +

    PixelGetNextRow() returns the next row as an array of pixel wands from the pixel iterator.

    + +

    The format of the PixelGetNextRow method is:

    + +
    +PixelWand **PixelGetNextRow(PixelIterator *iterator,
    +  size_t *number_wands)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    number_wands
    +
    the number of pixel wands.
    + +
    +
    +

    PixelIteratorGetException

    + +

    PixelIteratorGetException() returns the severity, reason, and description of any error that occurs when using other methods in this API.

    + +

    The format of the PixelIteratorGetException method is:

    + +
    +char *PixelIteratorGetException(const Pixeliterator *iterator,
    +  ExceptionType *severity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    severity
    +
    the severity of the error is returned here.
    + +
    +
    +

    SetPixelViewIterator

    + +

    SetPixelViewIterator() iterates over the pixel view in parallel and calls your set method for each scanline of the view. The pixel region is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension. The pixels are initiallly undefined and any settings you make in the callback method are automagically synced back to your image.

    + +

    Use this pragma:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback set method that must be executed by a single thread at a time.

    + +

    The format of the SetPixelViewIterator method is:

    + +
    +MagickBooleanType SetPixelViewIterator(PixelView *destination,
    +  SetPixelViewMethod set,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    destination
    +
    the pixel view.
    + +
    +
    set
    +
    the set callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    TransferPixelViewIterator

    + +

    TransferPixelViewIterator() iterates over two pixel views in parallel and calls your transfer method for each scanline of the view. The source pixel region is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. However, the destination pixel view is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted.

    + +

    Use this pragma:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback transfer method that must be executed by a single thread at a time.

    + +

    The format of the TransferPixelViewIterator method is:

    + +
    +MagickBooleanType TransferPixelViewIterator(PixelView *source,
    +  PixelView *destination,TransferPixelViewMethod transfer,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source pixel view.
    + +
    +
    destination
    +
    the destination pixel view.
    + +
    +
    transfer
    +
    the transfer callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    UpdatePixelViewIterator

    + +

    UpdatePixelViewIterator() iterates over the pixel view in parallel and calls your update method for each scanline of the view. The pixel region is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted. Updates to pixels in your callback are automagically synced back to the image.

    + +

    Use this pragma:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback update method that must be executed by a single thread at a time.

    + +

    The format of the UpdatePixelViewIterator method is:

    + +
    +MagickBooleanType UpdatePixelViewIterator(PixelView *source,
    +  UpdatePixelViewMethod update,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source pixel view.
    + +
    +
    update
    +
    the update callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/display.html b/ImageMagick-6.9.12-44/www/api/display.html new file mode 100644 index 0000000..f8aef4a --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/display.html @@ -0,0 +1,124 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Interactively Display and Edit an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    + +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/distort.html b/ImageMagick-6.9.12-44/www/api/distort.html new file mode 100644 index 0000000..9215054 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/distort.html @@ -0,0 +1,291 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Image Distortions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AffineTransformImageDistortImageRotateImageSparseColorImage

    + +

    AffineTransformImage

    + +

    AffineTransformImage() transforms an image as dictated by the affine matrix. It allocates the memory necessary for the new Image structure and returns a pointer to the new image.

    + +

    The format of the AffineTransformImage method is:

    + +
    +Image *AffineTransformImage(const Image *image,
    +  AffineMatrix *affine_matrix,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    affine_matrix
    +
    the affine matrix.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    DistortImage

    + +

    DistortImage() distorts an image using various distortion methods, by mapping color lookups of the source image to a new destination image usally of the same size as the source image, unless 'bestfit' is set to true.

    + +

    If 'bestfit' is enabled, and distortion allows it, the destination image is adjusted to ensure the whole source 'image' will just fit within the final destination image, which will be sized and offset accordingly. Also in many cases the virtual offset of the source image will be taken into account in the mapping.

    + +

    If the '-verbose' control option has been set print to standard error the equicelent '-fx' formula with coefficients for the function, if practical.

    + +

    The format of the DistortImage() method is:

    + +
    +Image *DistortImage(const Image *image,const DistortImageMethod method,
    +  const size_t number_arguments,const double *arguments,
    +  MagickBooleanType bestfit, ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image to be distorted.
    + +
    +
    method
    +
    the method of image distortion.
    + +
    ArcDistortion always ignores source image offset, and always 'bestfit' the destination image with the top left corner offset relative to the polar mapping center.
    + +
    Affine, Perspective, and Bilinear, do least squares fitting of the distrotion when more than the minimum number of control point pairs are provided.
    + +
    Perspective, and Bilinear, fall back to a Affine distortion when less than 4 control point pairs are provided. While Affine distortions let you use any number of control point pairs, that is Zero pairs is a No-Op (viewport only) distortion, one pair is a translation and two pairs of control points do a scale-rotate-translate, without any shearing.
    + +
    +
    number_arguments
    +
    the number of arguments given.
    + +
    +
    arguments
    +
    an array of floating point arguments for this method.
    + +
    +
    bestfit
    +
    Attempt to 'bestfit' the size of the resulting image. This also forces the resulting image to be a 'layered' virtual canvas image. Can be overridden using 'distort:viewport' setting.
    + +
    +
    exception
    +
    return any errors or warnings in this structure
    + +
    Extra Controls from Image meta-data (artifacts)...
    + +
    o "verbose" Output to stderr alternatives, internal coefficents, and FX equivalents for the distortion operation (if feasible). This forms an extra check of the distortion method, and allows users access to the internal constants IM calculates for the distortion.
    + +
    o "distort:viewport" Directly set the output image canvas area and offest to use for the resulting image, rather than use the original images canvas, or a calculated 'bestfit' canvas.
    + +
    o "distort:scale" Scale the size of the output canvas by this amount to provide a method of Zooming, and for super-sampling the results.
    + +
    Other settings that can effect results include
    + +
    o 'interpolate' For source image lookups (scale enlargements)
    + +
    o 'filter' Set filter to use for area-resampling (scale shrinking). Set to 'point' to turn off and use 'interpolate' lookup instead
    + +
    +
    +

    RotateImage

    + +

    RotateImage() creates a new image that is a rotated copy of an existing one. Positive angles rotate counter-clockwise (right-hand rule), while negative angles rotate clockwise. Rotated images are usually larger than the originals and have 'empty' triangular corners. X axis. Empty triangles left over from shearing the image are filled with the background color defined by member 'background_color' of the image. RotateImage allocates the memory necessary for the new Image structure and returns a pointer to the new image.

    + +

    The format of the RotateImage method is:

    + +
    +Image *RotateImage(const Image *image,const double degrees,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    degrees
    +

    Specifies the number of degrees to rotate the image.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    SparseColorImage

    + +

    SparseColorImage(), given a set of coordinates, interpolates the colors found at those coordinates, across the whole image, using various methods.

    + +

    The format of the SparseColorImage() method is:

    + +
    +Image *SparseColorImage(const Image *image,const ChannelType channel,
    +  const SparseColorMethod method,const size_t number_arguments,
    +  const double *arguments,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image to be filled in.
    + +
    +
    channel
    +
    Specify which color values (in RGBKA sequence) are being set. This also determines the number of color_values in above.
    + +
    +
    method
    +
    the method to fill in the gradient between the control points.
    + +
    The methods used for SparseColor() are often simular to methods used for DistortImage(), and even share the same code for determination of the function coefficents, though with more dimensions (or resulting values).
    + +
    +
    number_arguments
    +
    the number of arguments given.
    + +
    +
    arguments
    +
    array of floating point arguments for this method-- x,y,color_values-- with color_values given as normalized values.
    + +
    +
    exception
    +
    return any errors or warnings in this structure
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/draw.html b/ImageMagick-6.9.12-44/www/api/draw.html new file mode 100644 index 0000000..40e0a9c --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/draw.html @@ -0,0 +1,464 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Draw on an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireDrawInfoCloneDrawInfoDestroyDrawInfoDrawAffineImageDrawClipPathDrawClippingMaskDrawCompositeMaskDrawGradientImageDrawImageDrawPatternPathDrawPrimitiveGetAffineMatrix

    + +

    AcquireDrawInfo

    + +

    AcquireDrawInfo() returns a DrawInfo structure properly initialized.

    + +

    The format of the AcquireDrawInfo method is:

    + +
    +DrawInfo *AcquireDrawInfo(void)
    +
    + +

    CloneDrawInfo

    + +

    CloneDrawInfo() makes a copy of the given draw_info structure. If NULL is specified, a new DrawInfo structure is created initialized to default values.

    + +

    The format of the CloneDrawInfo method is:

    + +
    +DrawInfo *CloneDrawInfo(const ImageInfo *image_info,
    +  const DrawInfo *draw_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    +

    DestroyDrawInfo

    + +

    DestroyDrawInfo() deallocates memory associated with an DrawInfo structure.

    + +

    The format of the DestroyDrawInfo method is:

    + +
    +DrawInfo *DestroyDrawInfo(DrawInfo *draw_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    draw_info
    +
    the draw info.
    + +
    +
    +

    DrawAffineImage

    + +

    DrawAffineImage() composites the source over the destination image as dictated by the affine transform.

    + +

    The format of the DrawAffineImage method is:

    + +
    +MagickBooleanType DrawAffineImage(Image *image,const Image *source,
    +  const AffineMatrix *affine)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    source
    +
    the source image.
    + +
    +
    affine
    +
    the affine transform.
    + +
    +
    +

    DrawClipPath

    + +

    DrawClipPath() draws the clip path on the image mask.

    + +

    The format of the DrawClipPath method is:

    + +
    +MagickBooleanType DrawClipPath(Image *image,const DrawInfo *draw_info,
    +  const char *id)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    id
    +
    the clip path id.
    + +
    +
    +

    DrawClippingMask

    + +

    DrawClippingMask() draws the clip path and returns it as an image clipping mask.

    + +

    The format of the DrawClippingMask method is:

    + +
    +Image *DrawClippingMask(Image *image,const DrawInfo *draw_info,
    +  const char *id,const char *clip_path,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    id
    +
    the clip path id.
    + +
    +
    clip_path
    +
    the clip path.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    DrawCompositeMask

    + +

    DrawCompositeMask() draws the mask path and returns it as an image mask.

    + +

    The format of the DrawCompositeMask method is:

    + +
    +Image *DrawCompositeMask(Image *image,const DrawInfo *draw_info,
    +  const char *id,const char *mask_path,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    id
    +
    the mask path id.
    + +
    +
    mask_path
    +
    the mask path.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    DrawGradientImage

    + +

    DrawGradientImage() draws a linear gradient on the image.

    + +

    The format of the DrawGradientImage method is:

    + +
    +MagickBooleanType DrawGradientImage(Image *image,
    +  const DrawInfo *draw_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    +

    DrawImage

    + +

    DrawImage() draws a graphic primitive on your image. The primitive may be represented as a string or filename. Precede the filename with an "at" sign (@) and the contents of the file are drawn on the image. You can affect how text is drawn by setting one or more members of the draw info structure.

    + +

    The format of the DrawImage method is:

    + +
    +MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    +

    DrawPatternPath

    + +

    DrawPatternPath() draws a pattern.

    + +

    The format of the DrawPatternPath method is:

    + +
    +MagickBooleanType DrawPatternPath(Image *image,const DrawInfo *draw_info,
    +  const char *name,Image **pattern)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    name
    +
    the pattern name.
    + +
    +
    image
    +
    the image.
    + +
    +
    +

    DrawPrimitive

    + +

    DrawPrimitive() draws a primitive (line, rectangle, ellipse) on the image.

    + +

    The format of the DrawPrimitive method is:

    + +
    +MagickBooleanType DrawPrimitive(Image *image,const DrawInfo *draw_info,
    +  PrimitiveInfo *primitive_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    primitive_info
    +
    Specifies a pointer to a PrimitiveInfo structure.
    + +
    +
    +

    GetAffineMatrix

    + +

    GetAffineMatrix() returns an AffineMatrix initialized to the identity matrix.

    + +

    The format of the GetAffineMatrix method is:

    + +
    +void GetAffineMatrix(AffineMatrix *affine_matrix)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    affine_matrix
    +
    the affine matrix.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/drawing-wand.html b/ImageMagick-6.9.12-44/www/api/drawing-wand.html new file mode 100644 index 0000000..fb29d5e --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/drawing-wand.html @@ -0,0 +1,3867 @@ + + + + + + + + + + ImageMagick (legacy) – MagickWand, C API: Drawing Wand Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    ClearDrawingWandCloneDrawingWandDestroyDrawingWandDrawAffineDrawAnnotationDrawArcDrawBezierDrawCircleDrawClearExceptionDrawCompositeDrawColorDrawCommentDrawEllipseDrawGetBorderColorDrawGetClipPathDrawGetClipRuleDrawGetClipUnitsDrawGetDensityDrawGetExceptionDrawGetExceptionTypeDrawGetFillColorDrawGetFillOpacityDrawGetFillRuleDrawGetFontDrawGetFontFamilyDrawGetFontResolutionDrawGetFontSizeDrawGetFontStretchDrawGetFontStyleDrawGetFontWeightDrawGetGravityDrawGetOpacityDrawGetStrokeAntialiasDrawGetStrokeColorDrawGetStrokeDashArrayDrawGetStrokeDashOffsetDrawGetStrokeLineCapDrawGetStrokeLineJoinDrawGetStrokeMiterLimitDrawGetStrokeOpacityDrawGetStrokeWidthDrawGetTextAlignmentDrawGetTextAntialiasDrawGetTextDecorationDrawGetTextDirectionDrawGetTextEncodingDrawGetTextKerningDrawGetTextInterlineSpacingDrawGetTextInterwordSpacingDrawGetVectorGraphicsDrawGetTextUnderColorDrawLineDrawMatteDrawPathCloseDrawPathCurveToAbsoluteDrawPathCurveToRelativeDrawPathCurveToQuadraticBezierAbsoluteDrawPathCurveToQuadraticBezierRelativeDrawPathCurveToQuadraticBezierSmoothAbsoluteDrawPathCurveToQuadraticBezierSmoothRelativeDrawPathCurveToSmoothAbsoluteDrawPathCurveToSmoothRelativeDrawPathEllipticArcAbsoluteDrawPathEllipticArcRelativeDrawPathFinishDrawPathLineToAbsoluteDrawPathLineToRelativeDrawPathLineToHorizontalAbsoluteDrawPathLineToHorizontalRelativeDrawPathLineToVerticalAbsoluteDrawPathLineToVerticalRelativeDrawPathMoveToAbsoluteDrawPathMoveToRelativeDrawPathStartDrawPointDrawPolygonDrawPolylineDrawPopClipPathDrawPopDefsDrawPopPatternDrawPushClipPathDrawPushDefsDrawPushPatternDrawRectangleDrawResetVectorGraphicsDrawRotateDrawRoundRectangleDrawScaleDrawSetBorderColorDrawSetClipPathDrawSetClipRuleDrawSetClipUnitsDrawSetDensityDrawSetFillColorDrawSetFillOpacityDrawSetFontResolutionDrawSetOpacityDrawSetFillPatternURLDrawSetFillRuleDrawSetFontDrawSetFontFamilyDrawSetFontSizeDrawSetFontStretchDrawSetFontStyleDrawSetFontWeightDrawSetGravityDrawSetStrokeColorDrawSetStrokePatternURLDrawSetStrokeAntialiasDrawSetStrokeDashArrayDrawSetStrokeDashOffsetDrawSetStrokeLineCapDrawSetStrokeLineJoinDrawSetStrokeMiterLimitDrawSetStrokeOpacityDrawSetStrokeWidthDrawSetTextAlignmentDrawSetTextAntialiasDrawSetTextDecorationDrawSetTextDirectionDrawSetTextEncodingDrawSetTextKerningDrawSetTextInterlineSpacingDrawSetTextInterwordSpacingDrawSetTextUnderColorDrawSetVectorGraphicsDrawSkewXDrawSkewYDrawTranslateDrawSetViewboxIsDrawingWandNewDrawingWandPeekDrawingWandPopDrawingWandPushDrawingWand

    + +

    ClearDrawingWand

    + +

    ClearDrawingWand() clears resources associated with the drawing wand.

    + +

    The format of the ClearDrawingWand method is:

    + +
    +void ClearDrawingWand(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand to clear.
    + +
    +
    +

    CloneDrawingWand

    + +

    CloneDrawingWand() makes an exact copy of the specified wand.

    + +

    The format of the CloneDrawingWand method is:

    + +
    +DrawingWand *CloneDrawingWand(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    DestroyDrawingWand

    + +

    DestroyDrawingWand() frees all resources associated with the drawing wand. Once the drawing wand has been freed, it should not be used and further unless it re-allocated.

    + +

    The format of the DestroyDrawingWand method is:

    + +
    +DrawingWand *DestroyDrawingWand(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand to destroy.
    + +
    +
    +

    DrawAffine

    + +

    DrawAffine() adjusts the current affine transformation matrix with the specified affine transformation matrix. Note that the current affine transform is adjusted rather than replaced.

    + +

    The format of the DrawAffine method is:

    + +
    +void DrawAffine(DrawingWand *wand,const AffineMatrix *affine)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    Drawing wand
    + +
    +
    affine
    +
    Affine matrix parameters
    + +
    +
    +

    DrawAnnotation

    + +

    DrawAnnotation() draws text on the image.

    + +

    The format of the DrawAnnotation method is:

    + +
    +void DrawAnnotation(DrawingWand *wand,const double x,
    +  const double y,const unsigned char *text)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    x ordinate to left of text
    + +
    +
    y
    +
    y ordinate to text baseline
    + +
    +
    text
    +
    text to draw
    + +
    +
    +

    DrawArc

    + +

    DrawArc() draws an arc falling within a specified bounding rectangle on the image.

    + +

    The format of the DrawArc method is:

    + +
    +void DrawArc(DrawingWand *wand,const double sx,const double sy,
    +  const double ex,const double ey,const double sd,const double ed)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    sx
    +
    starting x ordinate of bounding rectangle
    + +
    +
    sy
    +
    starting y ordinate of bounding rectangle
    + +
    +
    ex
    +
    ending x ordinate of bounding rectangle
    + +
    +
    ey
    +
    ending y ordinate of bounding rectangle
    + +
    +
    sd
    +
    starting degrees of rotation
    + +
    +
    ed
    +
    ending degrees of rotation
    + +
    +
    +

    DrawBezier

    + +

    DrawBezier() draws a bezier curve through a set of points on the image.

    + +

    The format of the DrawBezier method is:

    + +
    +void DrawBezier(DrawingWand *wand,
    +  const size_t number_coordinates,const PointInfo *coordinates)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    number_coordinates
    +
    number of coordinates
    + +
    +
    coordinates
    +
    coordinates
    + +
    +
    +

    DrawCircle

    + +

    DrawCircle() draws a circle on the image.

    + +

    The format of the DrawCircle method is:

    + +
    +void DrawCircle(DrawingWand *wand,const double ox,
    +  const double oy,const double px, const double py)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    ox
    +
    origin x ordinate
    + +
    +
    oy
    +
    origin y ordinate
    + +
    +
    px
    +
    perimeter x ordinate
    + +
    +
    py
    +
    perimeter y ordinate
    + +
    +
    +

    DrawClearException

    + +

    DrawClearException() clear any exceptions associated with the wand.

    + +

    The format of the DrawClearException method is:

    + +
    +MagickBooleanType DrawClearException(DrawWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawComposite

    + +

    DrawComposite() composites an image onto the current image, using the specified composition operator, specified position, and at the specified size.

    + +

    The format of the DrawComposite method is:

    + +
    +MagickBooleanType DrawComposite(DrawingWand *wand,
    +  const CompositeOperator compose,const double x,
    +  const double y,const double width,const double height,
    +  MagickWand *magick_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    compose
    +
    composition operator
    + +
    +
    x
    +
    x ordinate of top left corner
    + +
    +
    y
    +
    y ordinate of top left corner
    + +
    +
    width
    +
    Width to resize image to prior to compositing. Specify zero to use existing width.
    + +
    +
    height
    +
    Height to resize image to prior to compositing. Specify zero to use existing height.
    + +
    +
    magick_wand
    +
    Image to composite is obtained from this wand.
    + +
    +
    +

    DrawColor

    + +

    DrawColor() draws color on image using the current fill color, starting at specified position, and using specified paint method. The available paint methods are:

    + +
    +    PointMethod: Recolors the target pixel
    +    ReplaceMethod: Recolor any pixel that matches the target pixel.
    +    FloodfillMethod: Recolors target pixels and matching neighbors.
    +    ResetMethod: Recolor all pixels.
    +
    + +

    The format of the DrawColor method is:

    + +
    +void DrawColor(DrawingWand *wand,const double x,const double y,
    +  const PaintMethod paint_method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    x ordinate.
    + +
    +
    y
    +
    y ordinate.
    + +
    +
    paint_method
    +
    paint method.
    + +
    +
    +

    DrawComment

    + +

    DrawComment() adds a comment to a vector output stream.

    + +

    The format of the DrawComment method is:

    + +
    +void DrawComment(DrawingWand *wand,const char *comment)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    comment
    +
    comment text
    + +
    +
    +

    DrawEllipse

    + +

    DrawEllipse() draws an ellipse on the image.

    + +

    The format of the DrawEllipse method is:

    + +
    + void DrawEllipse(DrawingWand *wand,const double ox,const double oy,
    +   const double rx,const double ry,const double start,const double end)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    ox
    +
    origin x ordinate
    + +
    +
    oy
    +
    origin y ordinate
    + +
    +
    rx
    +
    radius in x
    + +
    +
    ry
    +
    radius in y
    + +
    +
    start
    +
    starting rotation in degrees
    + +
    +
    end
    +
    ending rotation in degrees
    + +
    +
    +

    DrawGetBorderColor

    + +

    DrawGetBorderColor() returns the border color used for drawing bordered objects.

    + +

    The format of the DrawGetBorderColor method is:

    + +
    +void DrawGetBorderColor(const DrawingWand *wand,
    +  PixelWand *border_color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    border_color
    +
    Return the border color.
    + +
    +
    +

    DrawGetClipPath

    + +

    DrawGetClipPath() obtains the current clipping path ID. The value returned must be deallocated by the user when it is no longer needed.

    + +

    The format of the DrawGetClipPath method is:

    + +
    +char *DrawGetClipPath(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetClipRule

    + +

    DrawGetClipRule() returns the current polygon fill rule to be used by the clipping path.

    + +

    The format of the DrawGetClipRule method is:

    + +
    +     FillRule DrawGetClipRule(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetClipUnits

    + +

    DrawGetClipUnits() returns the interpretation of clip path units.

    + +

    The format of the DrawGetClipUnits method is:

    + +
    +ClipPathUnits DrawGetClipUnits(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetDensity

    + +

    DrawGetDensity() obtains the vertical and horizontal resolution. The value returned must be deallocated by the user when it is no longer needed.

    + +

    The format of the DrawGetDensity method is:

    + +
    +char *DrawGetDensity(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetException

    + +

    DrawGetException() returns the severity, reason, and description of any error that occurs when using other methods in this API.

    + +

    The format of the DrawGetException method is:

    + +
    +char *DrawGetException(const DrawWand *wand,
    +  ExceptionType *severity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    severity
    +
    the severity of the error is returned here.
    + +
    +
    +

    DrawGetExceptionType

    + +

    DrawGetExceptionType() the exception type associated with the wand. If no exception has occurred, UndefinedExceptionType is returned.

    + +

    The format of the DrawGetExceptionType method is:

    + +
    +ExceptionType DrawGetExceptionType(const DrawWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    DrawGetFillColor

    + +

    DrawGetFillColor() returns the fill color used for drawing filled objects.

    + +

    The format of the DrawGetFillColor method is:

    + +
    +void DrawGetFillColor(const DrawingWand *wand,
    +  PixelWand *fill_color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    fill_color
    +
    Return the fill color.
    + +
    +
    +

    DrawGetFillOpacity

    + +

    DrawGetFillOpacity() returns the opacity used when drawing using the fill color or fill texture. Fully opaque is 1.0.

    + +

    The format of the DrawGetFillOpacity method is:

    + +
    +double DrawGetFillOpacity(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetFillRule

    + +

    DrawGetFillRule() returns the fill rule used while drawing polygons.

    + +

    The format of the DrawGetFillRule method is:

    + +
    +FillRule DrawGetFillRule(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetFont

    + +

    DrawGetFont() returns a null-terminaged string specifying the font used when annotating with text. The value returned must be freed by the user when no longer needed.

    + +

    The format of the DrawGetFont method is:

    + +
    +char *DrawGetFont(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetFontFamily

    + +

    DrawGetFontFamily() returns the font family to use when annotating with text. The value returned must be freed by the user when it is no longer needed.

    + +

    The format of the DrawGetFontFamily method is:

    + +
    +char *DrawGetFontFamily(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetFontResolution

    + +

    DrawGetFontResolution() gets the image X and Y resolution.

    + +

    The format of the DrawGetFontResolution method is:

    + +
    +DrawBooleanType DrawGetFontResolution(const DrawingWand *wand,
    +  double *x,double *y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the x-resolution.
    + +
    +
    y
    +
    the y-resolution.
    + +
    +
    +

    DrawGetFontSize

    + +

    DrawGetFontSize() returns the font pointsize used when annotating with text.

    + +

    The format of the DrawGetFontSize method is:

    + +
    +double DrawGetFontSize(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetFontStretch

    + +

    DrawGetFontStretch() returns the font stretch used when annotating with text.

    + +

    The format of the DrawGetFontStretch method is:

    + +
    +StretchType DrawGetFontStretch(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetFontStyle

    + +

    DrawGetFontStyle() returns the font style used when annotating with text.

    + +

    The format of the DrawGetFontStyle method is:

    + +
    +StyleType DrawGetFontStyle(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetFontWeight

    + +

    DrawGetFontWeight() returns the font weight used when annotating with text.

    + +

    The format of the DrawGetFontWeight method is:

    + +
    +size_t DrawGetFontWeight(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetGravity

    + +

    DrawGetGravity() returns the text placement gravity used when annotating with text.

    + +

    The format of the DrawGetGravity method is:

    + +
    +GravityType DrawGetGravity(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetOpacity

    + +

    DrawGetOpacity() returns the opacity used when drawing with the fill or stroke color or texture. Fully opaque is 1.0.

    + +

    The format of the DrawGetOpacity method is:

    + +
    +double DrawGetOpacity(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetStrokeAntialias

    + +

    DrawGetStrokeAntialias() returns the current stroke antialias setting. Stroked outlines are antialiased by default. When antialiasing is disabled stroked pixels are thresholded to determine if the stroke color or underlying canvas color should be used.

    + +

    The format of the DrawGetStrokeAntialias method is:

    + +
    +MagickBooleanType DrawGetStrokeAntialias(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetStrokeColor

    + +

    DrawGetStrokeColor() returns the color used for stroking object outlines.

    + +

    The format of the DrawGetStrokeColor method is:

    + +
    +void DrawGetStrokeColor(const DrawingWand *wand,
    +  PixelWand *stroke_color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    stroke_color
    +
    Return the stroke color.
    + +
    +
    +

    DrawGetStrokeDashArray

    + +

    DrawGetStrokeDashArray() returns an array representing the pattern of dashes and gaps used to stroke paths (see DrawSetStrokeDashArray). The array must be freed once it is no longer required by the user.

    + +

    The format of the DrawGetStrokeDashArray method is:

    + +
    +double *DrawGetStrokeDashArray(const DrawingWand *wand,
    +  size_t *number_elements)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    number_elements
    +
    address to place number of elements in dash array
    + +
    +
    +

    DrawGetStrokeDashOffset

    + +

    DrawGetStrokeDashOffset() returns the offset into the dash pattern to start the dash.

    + +

    The format of the DrawGetStrokeDashOffset method is:

    + +
    +double DrawGetStrokeDashOffset(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetStrokeLineCap

    + +

    DrawGetStrokeLineCap() returns the shape to be used at the end of open subpaths when they are stroked. Values of LineCap are UndefinedCap, ButtCap, RoundCap, and SquareCap.

    + +

    The format of the DrawGetStrokeLineCap method is:

    + +
    +LineCap DrawGetStrokeLineCap(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetStrokeLineJoin

    + +

    DrawGetStrokeLineJoin() returns the shape to be used at the corners of paths (or other vector shapes) when they are stroked. Values of LineJoin are UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin.

    + +

    The format of the DrawGetStrokeLineJoin method is:

    + +
    +LineJoin DrawGetStrokeLineJoin(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetStrokeMiterLimit

    + +

    DrawGetStrokeMiterLimit() returns the miter limit. When two line segments meet at a sharp angle and miter joins have been specified for 'lineJoin', it is possible for the miter to extend far beyond the thickness of the line stroking the path. The miterLimit' imposes a limit on the ratio of the miter length to the 'lineWidth'.

    + +

    The format of the DrawGetStrokeMiterLimit method is:

    + +
    +size_t DrawGetStrokeMiterLimit(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetStrokeOpacity

    + +

    DrawGetStrokeOpacity() returns the opacity of stroked object outlines.

    + +

    The format of the DrawGetStrokeOpacity method is:

    + +
    +double DrawGetStrokeOpacity(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetStrokeWidth

    + +

    DrawGetStrokeWidth() returns the width of the stroke used to draw object outlines.

    + +

    The format of the DrawGetStrokeWidth method is:

    + +
    +double DrawGetStrokeWidth(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetTextAlignment

    + +

    DrawGetTextAlignment() returns the alignment applied when annotating with text.

    + +

    The format of the DrawGetTextAlignment method is:

    + +
    +AlignType DrawGetTextAlignment(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetTextAntialias

    + +

    DrawGetTextAntialias() returns the current text antialias setting, which determines whether text is antialiased. Text is antialiased by default.

    + +

    The format of the DrawGetTextAntialias method is:

    + +
    +MagickBooleanType DrawGetTextAntialias(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetTextDecoration

    + +

    DrawGetTextDecoration() returns the decoration applied when annotating with text.

    + +

    The format of the DrawGetTextDecoration method is:

    + +
    +DecorationType DrawGetTextDecoration(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetTextDirection

    + +

    DrawGetTextDirection() returns the direction that will be used when annotating with text.

    + +

    The format of the DrawGetTextDirection method is:

    + +
    +DirectionType DrawGetTextDirection(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetTextEncoding

    + +

    DrawGetTextEncoding() returns a null-terminated string which specifies the code set used for text annotations. The string must be freed by the user once it is no longer required.

    + +

    The format of the DrawGetTextEncoding method is:

    + +
    +char *DrawGetTextEncoding(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetTextKerning

    + +

    DrawGetTextKerning() gets the spacing between characters in text.

    + +

    The format of the DrawSetFontKerning method is:

    + +
    +double DrawGetTextKerning(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetTextInterlineSpacing

    + +

    DrawGetTextInterlineSpacing() gets the spacing between lines in text.

    + +

    The format of the DrawGetTextInterwordSpacing method is:

    + +
    +double DrawGetTextInterwordSpacing(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetTextInterwordSpacing

    + +

    DrawGetTextInterwordSpacing() gets the spacing between words in text.

    + +

    The format of the DrawSetFontKerning method is:

    + +
    +double DrawGetTextInterwordSpacing(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetVectorGraphics

    + +

    DrawGetVectorGraphics() returns a null-terminated string which specifies the vector graphics generated by any graphics calls made since the wand was instantiated. The string must be freed by the user once it is no longer required.

    + +

    The format of the DrawGetVectorGraphics method is:

    + +
    +char *DrawGetVectorGraphics(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetTextUnderColor

    + +

    DrawGetTextUnderColor() returns the color of a background rectangle to place under text annotations.

    + +

    The format of the DrawGetTextUnderColor method is:

    + +
    +void DrawGetTextUnderColor(const DrawingWand *wand,
    +  PixelWand *under_color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    under_color
    +
    Return the under color.
    + +
    +
    +

    DrawLine

    + +

    DrawLine() draws a line on the image using the current stroke color, stroke opacity, and stroke width.

    + +

    The format of the DrawLine method is:

    + +
    +void DrawLine(DrawingWand *wand,const double sx,const double sy,
    +  const double ex,const double ey)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    sx
    +
    starting x ordinate
    + +
    +
    sy
    +
    starting y ordinate
    + +
    +
    ex
    +
    ending x ordinate
    + +
    +
    ey
    +
    ending y ordinate
    + +
    +
    +

    DrawMatte

    + +

    DrawMatte() paints on the image's opacity channel in order to set effected pixels to transparent. to influence the opacity of pixels. The available paint methods are:

    + +
    +    PointMethod: Select the target pixel
    +    ReplaceMethod: Select any pixel that matches the target pixel.
    +    FloodfillMethod: Select the target pixel and matching neighbors.
    +    FillToBorderMethod: Select the target pixel and neighbors not matching
    +border color.
    +    ResetMethod: Select all pixels.
    +
    + +

    The format of the DrawMatte method is:

    + +
    +void DrawMatte(DrawingWand *wand,const double x,const double y,
    +  const PaintMethod paint_method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    x ordinate
    + +
    +
    y
    +
    y ordinate
    + +
    +
    paint_method
    +
    paint method.
    + +
    +
    +

    DrawPathClose

    + +

    DrawPathClose() adds a path element to the current path which closes the current subpath by drawing a straight line from the current point to the current subpath's most recent starting point (usually, the most recent moveto point).

    + +

    The format of the DrawPathClose method is:

    + +
    +void DrawPathClose(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPathCurveToAbsolute

    + +

    DrawPathCurveToAbsolute() draws a cubic Bezier curve from the current point to (x,y) using (x1,y1) as the control point at the beginning of the curve and (x2,y2) as the control point at the end of the curve using absolute coordinates. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    + +

    The format of the DrawPathCurveToAbsolute method is:

    + +
    +void DrawPathCurveToAbsolute(DrawingWand *wand,const double x1,
    +  const double y1,const double x2,const double y2,const double x,
    +  const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x1
    +
    x ordinate of control point for curve beginning
    + +
    +
    y1
    +
    y ordinate of control point for curve beginning
    + +
    +
    x2
    +
    x ordinate of control point for curve ending
    + +
    +
    y2
    +
    y ordinate of control point for curve ending
    + +
    +
    x
    +
    x ordinate of the end of the curve
    + +
    +
    y
    +
    y ordinate of the end of the curve
    + +
    +
    +

    DrawPathCurveToRelative

    + +

    DrawPathCurveToRelative() draws a cubic Bezier curve from the current point to (x,y) using (x1,y1) as the control point at the beginning of the curve and (x2,y2) as the control point at the end of the curve using relative coordinates. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    + +

    The format of the DrawPathCurveToRelative method is:

    + +
    +void DrawPathCurveToRelative(DrawingWand *wand,const double x1,
    +  const double y1,const double x2,const double y2,const double x,
    +  const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x1
    +
    x ordinate of control point for curve beginning
    + +
    +
    y1
    +
    y ordinate of control point for curve beginning
    + +
    +
    x2
    +
    x ordinate of control point for curve ending
    + +
    +
    y2
    +
    y ordinate of control point for curve ending
    + +
    +
    x
    +
    x ordinate of the end of the curve
    + +
    +
    y
    +
    y ordinate of the end of the curve
    + +
    +
    +

    DrawPathCurveToQuadraticBezierAbsolute

    + +

    DrawPathCurveToQuadraticBezierAbsolute() draws a quadratic Bezier curve from the current point to (x,y) using (x1,y1) as the control point using absolute coordinates. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    + +

    The format of the DrawPathCurveToQuadraticBezierAbsolute method is:

    + +
    +void DrawPathCurveToQuadraticBezierAbsolute(DrawingWand *wand,
    +  const double x1,const double y1,const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x1
    +
    x ordinate of the control point
    + +
    +
    y1
    +
    y ordinate of the control point
    + +
    +
    x
    +
    x ordinate of final point
    + +
    +
    y
    +
    y ordinate of final point
    + +
    +
    +

    DrawPathCurveToQuadraticBezierRelative

    + +

    DrawPathCurveToQuadraticBezierRelative() draws a quadratic Bezier curve from the current point to (x,y) using (x1,y1) as the control point using relative coordinates. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    + +

    The format of the DrawPathCurveToQuadraticBezierRelative method is:

    + +
    +void DrawPathCurveToQuadraticBezierRelative(DrawingWand *wand,
    +  const double x1,const double y1,const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x1
    +
    x ordinate of the control point
    + +
    +
    y1
    +
    y ordinate of the control point
    + +
    +
    x
    +
    x ordinate of final point
    + +
    +
    y
    +
    y ordinate of final point
    + +
    +
    +

    DrawPathCurveToQuadraticBezierSmoothAbsolute

    + +

    DrawPathCurveToQuadraticBezierSmoothAbsolute() draws a quadratic Bezier curve (using absolute coordinates) from the current point to (x,y). The control point is assumed to be the reflection of the control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not a DrawPathCurveToQuadraticBezierAbsolute, DrawPathCurveToQuadraticBezierRelative, DrawPathCurveToQuadraticBezierSmoothAbsolute or DrawPathCurveToQuadraticBezierSmoothRelative, assume the control point is coincident with the current point.). At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    + +

    The format of the DrawPathCurveToQuadraticBezierSmoothAbsolute method is:

    + +
    +void DrawPathCurveToQuadraticBezierSmoothAbsolute(
    +  DrawingWand *wand,const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    x ordinate of final point
    + +
    +
    y
    +
    y ordinate of final point
    + +
    +
    +

    DrawPathCurveToQuadraticBezierSmoothRelative

    + +

    DrawPathCurveToQuadraticBezierSmoothRelative() draws a quadratic Bezier curve (using relative coordinates) from the current point to (x,y). The control point is assumed to be the reflection of the control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not a DrawPathCurveToQuadraticBezierAbsolute, DrawPathCurveToQuadraticBezierRelative, DrawPathCurveToQuadraticBezierSmoothAbsolute or DrawPathCurveToQuadraticBezierSmoothRelative, assume the control point is coincident with the current point.). At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    + +

    The format of the DrawPathCurveToQuadraticBezierSmoothRelative method is:

    + +
    +void DrawPathCurveToQuadraticBezierSmoothRelative(DrawingWand *wand,
    +  const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    x ordinate of final point
    + +
    +
    y
    +
    y ordinate of final point
    + +
    +
    +

    DrawPathCurveToSmoothAbsolute

    + +

    DrawPathCurveToSmoothAbsolute() draws a cubic Bezier curve from the current point to (x,y) using absolute coordinates. The first control point is assumed to be the reflection of the second control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not an DrawPathCurveToAbsolute, DrawPathCurveToRelative, DrawPathCurveToSmoothAbsolute or DrawPathCurveToSmoothRelative, assume the first control point is coincident with the current point.) (x2,y2) is the second control point (i.e., the control point at the end of the curve). At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    + +

    The format of the DrawPathCurveToSmoothAbsolute method is:

    + +
    +void DrawPathCurveToSmoothAbsolute(DrawingWand *wand,
    +  const double x2,const double y2,const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x2
    +
    x ordinate of second control point
    + +
    +
    y2
    +
    y ordinate of second control point
    + +
    +
    x
    +
    x ordinate of termination point
    + +
    +
    y
    +
    y ordinate of termination point
    + +
    +
    +

    DrawPathCurveToSmoothRelative

    + +

    DrawPathCurveToSmoothRelative() draws a cubic Bezier curve from the current point to (x,y) using relative coordinates. The first control point is assumed to be the reflection of the second control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not an DrawPathCurveToAbsolute, DrawPathCurveToRelative, DrawPathCurveToSmoothAbsolute or DrawPathCurveToSmoothRelative, assume the first control point is coincident with the current point.) (x2,y2) is the second control point (i.e., the control point at the end of the curve). At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.

    + +

    The format of the DrawPathCurveToSmoothRelative method is:

    + +
    +void DrawPathCurveToSmoothRelative(DrawingWand *wand,
    +  const double x2,const double y2,const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x2
    +
    x ordinate of second control point
    + +
    +
    y2
    +
    y ordinate of second control point
    + +
    +
    x
    +
    x ordinate of termination point
    + +
    +
    y
    +
    y ordinate of termination point
    + +
    +
    +

    DrawPathEllipticArcAbsolute

    + +

    DrawPathEllipticArcAbsolute() draws an elliptical arc from the current point to (x, y) using absolute coordinates. The size and orientation of the ellipse are defined by two radii (rx, ry) and an xAxisRotation, which indicates how the ellipse as a whole is rotated relative to the current coordinate system. The center (cx, cy) of the ellipse is calculated automagically to satisfy the constraints imposed by the other parameters. largeArcFlag and sweepFlag contribute to the automatic calculations and help determine how the arc is drawn. If largeArcFlag is true then draw the larger of the available arcs. If sweepFlag is true, then draw the arc matching a clock-wise rotation.

    + +

    The format of the DrawPathEllipticArcAbsolute method is:

    + +
    +void DrawPathEllipticArcAbsolute(DrawingWand *wand,
    +  const double rx,const double ry,const double x_axis_rotation,
    +  const MagickBooleanType large_arc_flag,
    +  const MagickBooleanType sweep_flag,const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    rx
    +
    x radius
    + +
    +
    ry
    +
    y radius
    + +
    +
    x_axis_rotation
    +
    indicates how the ellipse as a whole is rotated relative to the current coordinate system
    + +
    +
    large_arc_flag
    +
    If non-zero (true) then draw the larger of the available arcs
    + +
    +
    sweep_flag
    +
    If non-zero (true) then draw the arc matching a clock-wise rotation
    + +
    + +
    +
    +

    DrawPathEllipticArcRelative

    + +

    DrawPathEllipticArcRelative() draws an elliptical arc from the current point to (x, y) using relative coordinates. The size and orientation of the ellipse are defined by two radii (rx, ry) and an xAxisRotation, which indicates how the ellipse as a whole is rotated relative to the current coordinate system. The center (cx, cy) of the ellipse is calculated automagically to satisfy the constraints imposed by the other parameters. largeArcFlag and sweepFlag contribute to the automatic calculations and help determine how the arc is drawn. If largeArcFlag is true then draw the larger of the available arcs. If sweepFlag is true, then draw the arc matching a clock-wise rotation.

    + +

    The format of the DrawPathEllipticArcRelative method is:

    + +
    +void DrawPathEllipticArcRelative(DrawingWand *wand,
    +  const double rx,const double ry,const double x_axis_rotation,
    +  const MagickBooleanType large_arc_flag,
    +  const MagickBooleanType sweep_flag,const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    rx
    +
    x radius
    + +
    +
    ry
    +
    y radius
    + +
    +
    x_axis_rotation
    +
    indicates how the ellipse as a whole is rotated relative to the current coordinate system
    + +
    +
    large_arc_flag
    +
    If non-zero (true) then draw the larger of the available arcs
    + +
    +
    sweep_flag
    +
    If non-zero (true) then draw the arc matching a clock-wise rotation
    + +
    +
    +

    DrawPathFinish

    + +

    DrawPathFinish() terminates the current path.

    + +

    The format of the DrawPathFinish method is:

    + +
    +void DrawPathFinish(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPathLineToAbsolute

    + +

    DrawPathLineToAbsolute() draws a line path from the current point to the given coordinate using absolute coordinates. The coordinate then becomes the new current point.

    + +

    The format of the DrawPathLineToAbsolute method is:

    + +
    +void DrawPathLineToAbsolute(DrawingWand *wand,const double x,
    +  const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    target x ordinate
    + +
    +
    y
    +
    target y ordinate
    + +
    +
    +

    DrawPathLineToRelative

    + +

    DrawPathLineToRelative() draws a line path from the current point to the given coordinate using relative coordinates. The coordinate then becomes the new current point.

    + +

    The format of the DrawPathLineToRelative method is:

    + +
    +void DrawPathLineToRelative(DrawingWand *wand,const double x,
    +  const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    target x ordinate
    + +
    +
    y
    +
    target y ordinate
    + +
    +
    +

    DrawPathLineToHorizontalAbsolute

    + +

    DrawPathLineToHorizontalAbsolute() draws a horizontal line path from the current point to the target point using absolute coordinates. The target point then becomes the new current point.

    + +

    The format of the DrawPathLineToHorizontalAbsolute method is:

    + +
    +void DrawPathLineToHorizontalAbsolute(DrawingWand *wand,
    +  const double x)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    target x ordinate
    + +
    +
    +

    DrawPathLineToHorizontalRelative

    + +

    DrawPathLineToHorizontalRelative() draws a horizontal line path from the current point to the target point using relative coordinates. The target point then becomes the new current point.

    + +

    The format of the DrawPathLineToHorizontalRelative method is:

    + +
    +void DrawPathLineToHorizontalRelative(DrawingWand *wand,
    +  const double x)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    target x ordinate
    + +
    +
    +

    DrawPathLineToVerticalAbsolute

    + +

    DrawPathLineToVerticalAbsolute() draws a vertical line path from the current point to the target point using absolute coordinates. The target point then becomes the new current point.

    + +

    The format of the DrawPathLineToVerticalAbsolute method is:

    + +
    +void DrawPathLineToVerticalAbsolute(DrawingWand *wand,
    +  const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    y
    +
    target y ordinate
    + +
    +
    +

    DrawPathLineToVerticalRelative

    + +

    DrawPathLineToVerticalRelative() draws a vertical line path from the current point to the target point using relative coordinates. The target point then becomes the new current point.

    + +

    The format of the DrawPathLineToVerticalRelative method is:

    + +
    +void DrawPathLineToVerticalRelative(DrawingWand *wand,
    +  const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    y
    +
    target y ordinate
    + +
    +
    +

    DrawPathMoveToAbsolute

    + +

    DrawPathMoveToAbsolute() starts a new sub-path at the given coordinate using absolute coordinates. The current point then becomes the specified coordinate.

    + +

    The format of the DrawPathMoveToAbsolute method is:

    + +
    +void DrawPathMoveToAbsolute(DrawingWand *wand,const double x,
    +  const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    target x ordinate
    + +
    +
    y
    +
    target y ordinate
    + +
    +
    +

    DrawPathMoveToRelative

    + +

    DrawPathMoveToRelative() starts a new sub-path at the given coordinate using relative coordinates. The current point then becomes the specified coordinate.

    + +

    The format of the DrawPathMoveToRelative method is:

    + +
    +void DrawPathMoveToRelative(DrawingWand *wand,const double x,
    +  const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    target x ordinate
    + +
    +
    y
    +
    target y ordinate
    + +
    +
    +

    DrawPathStart

    + +

    DrawPathStart() declares the start of a path drawing list which is terminated by a matching DrawPathFinish() command. All other DrawPath commands must be enclosed between a DrawPathStart() and a DrawPathFinish() command. This is because path drawing commands are subordinate commands and they do not function by themselves.

    + +

    The format of the DrawPathStart method is:

    + +
    +void DrawPathStart(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPoint

    + +

    DrawPoint() draws a point using the current fill color.

    + +

    The format of the DrawPoint method is:

    + +
    +void DrawPoint(DrawingWand *wand,const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    target x coordinate
    + +
    +
    y
    +
    target y coordinate
    + +
    +
    +

    DrawPolygon

    + +

    DrawPolygon() draws a polygon using the current stroke, stroke width, and fill color or texture, using the specified array of coordinates.

    + +

    The format of the DrawPolygon method is:

    + +
    +void DrawPolygon(DrawingWand *wand,
    +  const size_t number_coordinates,const PointInfo *coordinates)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    number_coordinates
    +
    number of coordinates
    + +
    +
    coordinates
    +
    coordinate array
    + +
    +
    +

    DrawPolyline

    + +

    DrawPolyline() draws a polyline using the current stroke, stroke width, and fill color or texture, using the specified array of coordinates.

    + +

    The format of the DrawPolyline method is:

    + +
    +void DrawPolyline(DrawingWand *wand,
    +  const size_t number_coordinates,const PointInfo *coordinates)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    number_coordinates
    +
    number of coordinates
    + +
    +
    coordinates
    +
    coordinate array
    + +
    +
    +

    DrawPopClipPath

    + +

    DrawPopClipPath() terminates a clip path definition.

    + +

    The format of the DrawPopClipPath method is:

    + +
    +void DrawPopClipPath(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPopDefs

    + +

    DrawPopDefs() terminates a definition list.

    + +

    The format of the DrawPopDefs method is:

    + +
    +void DrawPopDefs(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPopPattern

    + +

    DrawPopPattern() terminates a pattern definition.

    + +

    The format of the DrawPopPattern method is:

    + +
    +MagickBooleanType DrawPopPattern(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPushClipPath

    + +

    DrawPushClipPath() starts a clip path definition which is comprized of any number of drawing commands and terminated by a DrawPopClipPath() command.

    + +

    The format of the DrawPushClipPath method is:

    + +
    +void DrawPushClipPath(DrawingWand *wand,const char *clip_mask_id)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    clip_mask_id
    +
    string identifier to associate with the clip path for later use.
    + +
    +
    +

    DrawPushDefs

    + +

    DrawPushDefs() indicates that commands up to a terminating DrawPopDefs() command create named elements (e.g. clip-paths, textures, etc.) which may safely be processed earlier for the sake of efficiency.

    + +

    The format of the DrawPushDefs method is:

    + +
    +void DrawPushDefs(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPushPattern

    + +

    DrawPushPattern() indicates that subsequent commands up to a DrawPopPattern() command comprise the definition of a named pattern. The pattern space is assigned top left corner coordinates, a width and height, and becomes its own drawing space. Anything which can be drawn may be used in a pattern definition. Named patterns may be used as stroke or brush definitions.

    + +

    The format of the DrawPushPattern method is:

    + +
    +MagickBooleanType DrawPushPattern(DrawingWand *wand,
    +  const char *pattern_id,const double x,const double y,
    +  const double width,const double height)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    pattern_id
    +
    pattern identification for later reference
    + +
    +
    x
    +
    x ordinate of top left corner
    + +
    +
    y
    +
    y ordinate of top left corner
    + +
    +
    width
    +
    width of pattern space
    + +
    +
    height
    +
    height of pattern space
    + +
    +
    +

    DrawRectangle

    + +

    DrawRectangle() draws a rectangle given two coordinates and using the current stroke, stroke width, and fill settings.

    + +

    The format of the DrawRectangle method is:

    + +
    +void DrawRectangle(DrawingWand *wand,const double x1,
    +  const double y1,const double x2,const double y2)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    x1
    +
    x ordinate of first coordinate
    + +
    +
    y1
    +
    y ordinate of first coordinate
    + +
    +
    x2
    +
    x ordinate of second coordinate
    + +
    +
    y2
    +
    y ordinate of second coordinate
    + +
    +
    +

    DrawResetVectorGraphics

    + +

    DrawResetVectorGraphics() resets the vector graphics associated with the specified wand.

    + +

    The format of the DrawResetVectorGraphics method is:

    + +
    +void DrawResetVectorGraphics(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawRotate

    + +

    DrawRotate() applies the specified rotation to the current coordinate space.

    + +

    The format of the DrawRotate method is:

    + +
    +void DrawRotate(DrawingWand *wand,const double degrees)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    degrees
    +
    degrees of rotation
    + +
    +
    +

    DrawRoundRectangle

    + +

    DrawRoundRectangle() draws a rounted rectangle given two coordinates, x & y corner radiuses and using the current stroke, stroke width, and fill settings.

    + +

    The format of the DrawRoundRectangle method is:

    + +
    +void DrawRoundRectangle(DrawingWand *wand,double x1,double y1,
    +  double x2,double y2,double rx,double ry)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x1
    +
    x ordinate of first coordinate
    + +
    +
    y1
    +
    y ordinate of first coordinate
    + +
    +
    x2
    +
    x ordinate of second coordinate
    + +
    +
    y2
    +
    y ordinate of second coordinate
    + +
    +
    rx
    +
    radius of corner in horizontal direction
    + +
    +
    ry
    +
    radius of corner in vertical direction
    + +
    +
    +

    DrawScale

    + +

    DrawScale() adjusts the scaling factor to apply in the horizontal and vertical directions to the current coordinate space.

    + +

    The format of the DrawScale method is:

    + +
    +void DrawScale(DrawingWand *wand,const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    horizontal scale factor
    + +
    +
    y
    +
    vertical scale factor
    + +
    +
    +

    DrawSetBorderColor

    + +

    DrawSetBorderColor() sets the border color to be used for drawing bordered objects.

    + +

    The format of the DrawSetBorderColor method is:

    + +
    +void DrawSetBorderColor(DrawingWand *wand,const PixelWand *border_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    border_wand
    +
    border wand.
    + +
    +
    +

    DrawSetClipPath

    + +

    DrawSetClipPath() associates a named clipping path with the image. Only the areas drawn on by the clipping path will be modified as ssize_t as it remains in effect.

    + +

    The format of the DrawSetClipPath method is:

    + +
    +MagickBooleanType DrawSetClipPath(DrawingWand *wand,
    +  const char *clip_mask)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    clip_mask
    +
    name of clipping path to associate with image
    + +
    +
    +

    DrawSetClipRule

    + +

    DrawSetClipRule() set the polygon fill rule to be used by the clipping path.

    + +

    The format of the DrawSetClipRule method is:

    + +
    +void DrawSetClipRule(DrawingWand *wand,const FillRule fill_rule)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    fill_rule
    +
    fill rule (EvenOddRule or NonZeroRule)
    + +
    +
    +

    DrawSetClipUnits

    + +

    DrawSetClipUnits() sets the interpretation of clip path units.

    + +

    The format of the DrawSetClipUnits method is:

    + +
    +void DrawSetClipUnits(DrawingWand *wand,
    +  const ClipPathUnits clip_units)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    clip_units
    +
    units to use (UserSpace, UserSpaceOnUse, or ObjectBoundingBox)
    + +
    +
    +

    DrawSetDensity

    + +

    DrawSetDensity() sets the vertical and horizontal resolution.

    + +

    The format of the DrawSetDensity method is:

    + +
    +MagickBooleanType DrawSetDensity(DrawingWand *wand,
    +  const char *density)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    density
    +
    the vertical and horizontal resolution.
    + +
    +
    +

    DrawSetFillColor

    + +

    DrawSetFillColor() sets the fill color to be used for drawing filled objects.

    + +

    The format of the DrawSetFillColor method is:

    + +
    +void DrawSetFillColor(DrawingWand *wand,const PixelWand *fill_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    fill_wand
    +
    fill wand.
    + +
    +
    +

    DrawSetFillOpacity

    + +

    DrawSetFillOpacity() sets the opacity to use when drawing using the fill color or fill texture. Fully opaque is 1.0.

    + +

    The format of the DrawSetFillOpacity method is:

    + +
    +void DrawSetFillOpacity(DrawingWand *wand,const double fill_opacity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    fill_opacity
    +
    fill opacity
    + +
    +
    +

    DrawSetFontResolution

    + +

    DrawSetFontResolution() sets the image resolution.

    + +

    The format of the DrawSetFontResolution method is:

    + +
    +MagickBooleanType DrawSetFontResolution(DrawingWand *wand,
    +  const double x_resolution,const double y_resolution)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x_resolution
    +
    the image x resolution.
    + +
    +
    y_resolution
    +
    the image y resolution.
    + +
    +
    +

    DrawSetOpacity

    + +

    DrawSetOpacity() sets the opacity to use when drawing using the fill or stroke color or texture. Fully opaque is 1.0.

    + +

    The format of the DrawSetOpacity method is:

    + +
    +void DrawSetOpacity(DrawingWand *wand,const double opacity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    opacity
    +
    fill opacity
    + +
    +
    +

    DrawSetFillPatternURL

    + +

    DrawSetFillPatternURL() sets the URL to use as a fill pattern for filling objects. Only local URLs ("#identifier") are supported at this time. These local URLs are normally created by defining a named fill pattern with DrawPushPattern/DrawPopPattern.

    + +

    The format of the DrawSetFillPatternURL method is:

    + +
    +MagickBooleanType DrawSetFillPatternURL(DrawingWand *wand,
    +  const char *fill_url)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    fill_url
    +
    URL to use to obtain fill pattern.
    + +
    +
    +

    DrawSetFillRule

    + +

    DrawSetFillRule() sets the fill rule to use while drawing polygons.

    + +

    The format of the DrawSetFillRule method is:

    + +
    +void DrawSetFillRule(DrawingWand *wand,const FillRule fill_rule)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    fill_rule
    +
    fill rule (EvenOddRule or NonZeroRule)
    + +
    +
    +

    DrawSetFont

    + +

    DrawSetFont() sets the fully-sepecified font to use when annotating with text.

    + +

    The format of the DrawSetFont method is:

    + +
    +MagickBooleanType DrawSetFont(DrawingWand *wand,const char *font_name)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    font_name
    +
    font name
    + +
    +
    +

    DrawSetFontFamily

    + +

    DrawSetFontFamily() sets the font family to use when annotating with text.

    + +

    The format of the DrawSetFontFamily method is:

    + +
    +MagickBooleanType DrawSetFontFamily(DrawingWand *wand,
    +  const char *font_family)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    font_family
    +
    font family
    + +
    +
    +

    DrawSetFontSize

    + +

    DrawSetFontSize() sets the font pointsize to use when annotating with text.

    + +

    The format of the DrawSetFontSize method is:

    + +
    +void DrawSetFontSize(DrawingWand *wand,const double pointsize)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    pointsize
    +
    text pointsize
    + +
    +
    +

    DrawSetFontStretch

    + +

    DrawSetFontStretch() sets the font stretch to use when annotating with text. The AnyStretch enumeration acts as a wild-card "don't care" option.

    + +

    The format of the DrawSetFontStretch method is:

    + +
    +void DrawSetFontStretch(DrawingWand *wand,
    +  const StretchType font_stretch)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    font_stretch
    +
    font stretch (NormalStretch, UltraCondensedStretch, CondensedStretch, SemiCondensedStretch, SemiExpandedStretch, ExpandedStretch, ExtraExpandedStretch, UltraExpandedStretch, AnyStretch)
    + +
    +
    +

    DrawSetFontStyle

    + +

    DrawSetFontStyle() sets the font style to use when annotating with text. The AnyStyle enumeration acts as a wild-card "don't care" option.

    + +

    The format of the DrawSetFontStyle method is:

    + +
    +void DrawSetFontStyle(DrawingWand *wand,const StyleType style)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    style
    +
    font style (NormalStyle, ItalicStyle, ObliqueStyle, AnyStyle)
    + +
    +
    +

    DrawSetFontWeight

    + +

    DrawSetFontWeight() sets the font weight to use when annotating with text.

    + +

    The format of the DrawSetFontWeight method is:

    + +
    +void DrawSetFontWeight(DrawingWand *wand,
    +  const size_t font_weight)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    font_weight
    +
    font weight (valid range 100-900)
    + +
    +
    +

    DrawSetGravity

    + +

    DrawSetGravity() sets the text placement gravity to use when annotating with text.

    + +

    The format of the DrawSetGravity method is:

    + +
    +void DrawSetGravity(DrawingWand *wand,const GravityType gravity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    gravity
    +
    positioning gravity (NorthWestGravity, NorthGravity, NorthEastGravity, WestGravity, CenterGravity, EastGravity, SouthWestGravity, SouthGravity, SouthEastGravity)
    + +
    +
    +

    DrawSetStrokeColor

    + +

    DrawSetStrokeColor() sets the color used for stroking object outlines.

    + +

    The format of the DrawSetStrokeColor method is:

    + +
    +void DrawSetStrokeColor(DrawingWand *wand,
    +  const PixelWand *stroke_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    stroke_wand
    +
    stroke wand.
    + +
    +
    +

    DrawSetStrokePatternURL

    + +

    DrawSetStrokePatternURL() sets the pattern used for stroking object outlines.

    + +

    The format of the DrawSetStrokePatternURL method is:

    + +
    +MagickBooleanType DrawSetStrokePatternURL(DrawingWand *wand,
    +  const char *stroke_url)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    stroke_url
    +
    URL specifying pattern ID (e.g. "#pattern_id")
    + +
    +
    +

    DrawSetStrokeAntialias

    + +

    DrawSetStrokeAntialias() controls whether stroked outlines are antialiased. Stroked outlines are antialiased by default. When antialiasing is disabled stroked pixels are thresholded to determine if the stroke color or underlying canvas color should be used.

    + +

    The format of the DrawSetStrokeAntialias method is:

    + +
    +void DrawSetStrokeAntialias(DrawingWand *wand,
    +  const MagickBooleanType stroke_antialias)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    stroke_antialias
    +
    set to false (zero) to disable antialiasing
    + +
    +
    +

    DrawSetStrokeDashArray

    + +

    DrawSetStrokeDashArray() specifies the pattern of dashes and gaps used to stroke paths. The stroke dash array represents an array of numbers that specify the lengths of alternating dashes and gaps in pixels. If an odd number of values is provided, then the list of values is repeated to yield an even number of values. To remove an existing dash array, pass a zero number_elements argument and null dasharray. A typical stroke dash array might contain the members 5 3 2.

    + +

    The format of the DrawSetStrokeDashArray method is:

    + +
    +MagickBooleanType DrawSetStrokeDashArray(DrawingWand *wand,
    +  const size_t number_elements,const double *dasharray)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    number_elements
    +
    number of elements in dash array
    + +
    +
    dasharray
    +
    dash array values
    + +
    +
    +

    DrawSetStrokeDashOffset

    + +

    DrawSetStrokeDashOffset() specifies the offset into the dash pattern to start the dash.

    + +

    The format of the DrawSetStrokeDashOffset method is:

    + +
    +void DrawSetStrokeDashOffset(DrawingWand *wand,
    +  const double dash_offset)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    dash_offset
    +
    dash offset
    + +
    +
    +

    DrawSetStrokeLineCap

    + +

    DrawSetStrokeLineCap() specifies the shape to be used at the end of open subpaths when they are stroked. Values of LineCap are UndefinedCap, ButtCap, RoundCap, and SquareCap.

    + +

    The format of the DrawSetStrokeLineCap method is:

    + +
    +void DrawSetStrokeLineCap(DrawingWand *wand,
    +  const LineCap linecap)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    linecap
    +
    linecap style
    + +
    +
    +

    DrawSetStrokeLineJoin

    + +

    DrawSetStrokeLineJoin() specifies the shape to be used at the corners of paths (or other vector shapes) when they are stroked. Values of LineJoin are UndefinedJoin, MiterJoin, RoundJoin, and BevelJoin.

    + +

    The format of the DrawSetStrokeLineJoin method is:

    + +
    +void DrawSetStrokeLineJoin(DrawingWand *wand,
    +  const LineJoin linejoin)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    linejoin
    +
    line join style
    + +
    +
    +

    DrawSetStrokeMiterLimit

    + +

    DrawSetStrokeMiterLimit() specifies the miter limit. When two line segments meet at a sharp angle and miter joins have been specified for 'lineJoin', it is possible for the miter to extend far beyond the thickness of the line stroking the path. The miterLimit' imposes a limit on the ratio of the miter length to the 'lineWidth'.

    + +

    The format of the DrawSetStrokeMiterLimit method is:

    + +
    +void DrawSetStrokeMiterLimit(DrawingWand *wand,
    +  const size_t miterlimit)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    miterlimit
    +
    miter limit
    + +
    +
    +

    DrawSetStrokeOpacity

    + +

    DrawSetStrokeOpacity() specifies the opacity of stroked object outlines.

    + +

    The format of the DrawSetStrokeOpacity method is:

    + +
    +void DrawSetStrokeOpacity(DrawingWand *wand,
    +  const double stroke_opacity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    stroke_opacity
    +
    stroke opacity. The value 1.0 is opaque.
    + +
    +
    +

    DrawSetStrokeWidth

    + +

    DrawSetStrokeWidth() sets the width of the stroke used to draw object outlines.

    + +

    The format of the DrawSetStrokeWidth method is:

    + +
    +void DrawSetStrokeWidth(DrawingWand *wand,
    +  const double stroke_width)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    stroke_width
    +
    stroke width
    + +
    +
    +

    DrawSetTextAlignment

    + +

    DrawSetTextAlignment() specifies a text alignment to be applied when annotating with text.

    + +

    The format of the DrawSetTextAlignment method is:

    + +
    +void DrawSetTextAlignment(DrawingWand *wand,const AlignType alignment)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    alignment
    +
    text alignment. One of UndefinedAlign, LeftAlign, CenterAlign, or RightAlign.
    + +
    +
    +

    DrawSetTextAntialias

    + +

    DrawSetTextAntialias() controls whether text is antialiased. Text is antialiased by default.

    + +

    The format of the DrawSetTextAntialias method is:

    + +
    +void DrawSetTextAntialias(DrawingWand *wand,
    +  const MagickBooleanType text_antialias)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    text_antialias
    +
    antialias boolean. Set to false (0) to disable antialiasing.
    + +
    +
    +

    DrawSetTextDecoration

    + +

    DrawSetTextDecoration() specifies a decoration to be applied when annotating with text.

    + +

    The format of the DrawSetTextDecoration method is:

    + +
    +void DrawSetTextDecoration(DrawingWand *wand,
    +  const DecorationType decoration)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    decoration
    +
    text decoration. One of NoDecoration, UnderlineDecoration, OverlineDecoration, or LineThroughDecoration
    + +
    +
    +

    DrawSetTextDirection

    + +

    DrawSetTextDirection() specifies the direction to be used when annotating with text.

    + +

    The format of the DrawSetTextDirection method is:

    + +
    +void DrawSetTextDirection(DrawingWand *wand,
    +  const DirectionType direction)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    direction
    +
    text direction. One of RightToLeftDirection, LeftToRightDirection
    + +
    +
    +

    DrawSetTextEncoding

    + +

    DrawSetTextEncoding() specifies the code set to use for text annotations. The only character encoding which may be specified at this time is "UTF-8" for representing Unicode as a sequence of bytes. Specify an empty string to set text encoding to the system's default. Successful text annotation using Unicode may require fonts designed to support Unicode.

    + +

    The format of the DrawSetTextEncoding method is:

    + +
    +void DrawSetTextEncoding(DrawingWand *wand,const char *encoding)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    encoding
    +
    character string specifying text encoding
    + +
    +
    +

    DrawSetTextKerning

    + +

    DrawSetTextKerning() sets the spacing between characters in text.

    + +

    The format of the DrawSetTextKerning method is:

    + +
    +void DrawSetTextKerning(DrawingWand *wand,const double kerning)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    kerning
    +
    text kerning
    + +
    +
    +

    DrawSetTextInterlineSpacing

    + +

    DrawSetTextInterlineSpacing() sets the spacing between line in text.

    + +

    The format of the DrawSetInterlineSpacing method is:

    + +
    +void DrawSetTextInterlineSpacing(DrawingWand *wand,
    +  const double interline_spacing)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    interline_spacing
    +
    text line spacing
    + +
    +
    +

    DrawSetTextInterwordSpacing

    + +

    DrawSetTextInterwordSpacing() sets the spacing between words in text.

    + +

    The format of the DrawSetInterwordSpacing method is:

    + +
    +void DrawSetTextInterwordSpacing(DrawingWand *wand,
    +  const double interword_spacing)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    interword_spacing
    +
    text word spacing
    + +
    +
    +

    DrawSetTextUnderColor

    + +

    DrawSetTextUnderColor() specifies the color of a background rectangle to place under text annotations.

    + +

    The format of the DrawSetTextUnderColor method is:

    + +
    +void DrawSetTextUnderColor(DrawingWand *wand,
    +  const PixelWand *under_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    under_wand
    +
    text under wand.
    + +
    +
    +

    DrawSetVectorGraphics

    + +

    DrawSetVectorGraphics() sets the vector graphics associated with the specified wand. Use this method with DrawGetVectorGraphics() as a method to persist the vector graphics state.

    + +

    The format of the DrawSetVectorGraphics method is:

    + +
    +MagickBooleanType DrawSetVectorGraphics(DrawingWand *wand,
    +  const char *xml)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    xml
    +
    the drawing wand XML.
    + +
    +
    +

    DrawSkewX

    + +

    DrawSkewX() skews the current coordinate system in the horizontal direction.

    + +

    The format of the DrawSkewX method is:

    + +
    +void DrawSkewX(DrawingWand *wand,const double degrees)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    degrees
    +
    number of degrees to skew the coordinates
    + +
    +
    +

    DrawSkewY

    + +

    DrawSkewY() skews the current coordinate system in the vertical direction.

    + +

    The format of the DrawSkewY method is:

    + +
    +void DrawSkewY(DrawingWand *wand,const double degrees)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    degrees
    +
    number of degrees to skew the coordinates
    + +
    +
    +

    DrawTranslate

    + +

    DrawTranslate() applies a translation to the current coordinate system which moves the coordinate system origin to the specified coordinate.

    + +

    The format of the DrawTranslate method is:

    + +
    +void DrawTranslate(DrawingWand *wand,const double x,
    +  const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x
    +
    new x ordinate for coordinate system origin
    + +
    +
    y
    +
    new y ordinate for coordinate system origin
    + +
    +
    +

    DrawSetViewbox

    + +

    DrawSetViewbox() sets the overall canvas size to be recorded with the drawing vector data. Usually this will be specified using the same size as the canvas image. When the vector data is saved to SVG or MVG formats, the viewbox is use to specify the size of the canvas image that a viewer will render the vector data on.

    + +

    The format of the DrawSetViewbox method is:

    + +
    +void DrawSetViewbox(DrawingWand *wand,ssize_t x1,ssize_t y1,
    +  ssize_t x2,ssize_t y2)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    x1
    +
    left x ordinate
    + +
    +
    y1
    +
    top y ordinate
    + +
    +
    x2
    +
    right x ordinate
    + +
    +
    y2
    +
    bottom y ordinate
    + +
    +
    +

    IsDrawingWand

    + +

    IsDrawingWand() returns MagickTrue if the wand is verified as a drawing wand.

    + +

    The format of the IsDrawingWand method is:

    + +
    +MagickBooleanType IsDrawingWand(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    NewDrawingWand

    + +

    NewDrawingWand() returns a drawing wand required for all other methods in the API.

    + +

    The format of the NewDrawingWand method is:

    + +
    +DrawingWand *NewDrawingWand(void)
    +
    + +

    PeekDrawingWand

    + +

    PeekDrawingWand() returns the current drawing wand.

    + +

    The format of the PeekDrawingWand method is:

    + +
    +DrawInfo *PeekDrawingWand(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    PopDrawingWand

    + +

    PopDrawingWand() destroys the current drawing wand and returns to the previously pushed drawing wand. Multiple drawing wands may exist. It is an error to attempt to pop more drawing wands than have been pushed, and it is proper form to pop all drawing wands which have been pushed.

    + +

    The format of the PopDrawingWand method is:

    + +
    +MagickBooleanType PopDrawingWand(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    PushDrawingWand

    + +

    PushDrawingWand() clones the current drawing wand to create a new drawing wand. The original drawing wand(s) may be returned to by invoking PopDrawingWand(). The drawing wands are stored on a drawing wand stack. For every Pop there must have already been an equivalent Push.

    + +

    The format of the PushDrawingWand method is:

    + +
    +MagickBooleanType PushDrawingWand(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/effect.html b/ImageMagick-6.9.12-44/www/api/effect.html new file mode 100644 index 0000000..f3d4bec --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/effect.html @@ -0,0 +1,826 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Add an Effect + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AdaptiveBlurImageAdaptiveSharpenImageBlurImageConvolveImageDespeckleImageEdgeImageEmbossImageFilterImageGaussianBlurImageMotionBlurImageKuwaharaImagePreviewImageRotationalBlurImageSelectiveBlurImageShadeImageSharpenImageSpreadImageUnsharpMaskImage

    + +

    AdaptiveBlurImage

    + +

    AdaptiveBlurImage() adaptively blurs the image by blurring less intensely near image edges and more intensely far from edges. We blur the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and AdaptiveBlurImage() selects a suitable radius for you.

    + +

    The format of the AdaptiveBlurImage method is:

    + +
    +Image *AdaptiveBlurImage(const Image *image,const double radius,
    +  const double sigma,ExceptionInfo *exception)
    +Image *AdaptiveBlurImageChannel(const Image *image,
    +  const ChannelType channel,double radius,const double sigma,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Laplacian, in pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    AdaptiveSharpenImage

    + +

    AdaptiveSharpenImage() adaptively sharpens the image by sharpening more intensely near image edges and less intensely far from edges. We sharpen the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and AdaptiveSharpenImage() selects a suitable radius for you.

    + +

    The format of the AdaptiveSharpenImage method is:

    + +
    +Image *AdaptiveSharpenImage(const Image *image,const double radius,
    +  const double sigma,ExceptionInfo *exception)
    +Image *AdaptiveSharpenImageChannel(const Image *image,
    +  const ChannelType channel,double radius,const double sigma,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Laplacian, in pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    BlurImage

    + +

    BlurImage() blurs an image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, the radius should be larger than sigma. Use a radius of 0 and BlurImage() selects a suitable radius for you.

    + +

    The format of the BlurImage method is:

    + +
    +Image *BlurImage(const Image *image,const double radius,
    +  const double sigma,ExceptionInfo *exception)
    +Image *BlurImageChannel(const Image *image,const ChannelType channel,
    +  const double radius,const double sigma,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ConvolveImage

    + +

    ConvolveImage() applies a custom convolution kernel to the image.

    + +

    The format of the ConvolveImage method is:

    + +
    +Image *ConvolveImage(const Image *image,const size_t order,
    +  const double *kernel,ExceptionInfo *exception)
    +Image *ConvolveImageChannel(const Image *image,const ChannelType channel,
    +  const size_t order,const double *kernel,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    order
    +
    the number of columns and rows in the filter kernel.
    + +
    +
    kernel
    +
    An array of double representing the convolution kernel.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    DespeckleImage

    + +

    DespeckleImage() reduces the speckle noise in an image while perserving the edges of the original image. A speckle removing filter uses a complementary hulling technique (raising pixels that are darker than their surrounding neighbors, then complementarily lowering pixels that are brighter than their surrounding neighbors) to reduce the speckle index of that image (reference Crimmins speckle removal).

    + +

    The format of the DespeckleImage method is:

    + +
    +Image *DespeckleImage(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    EdgeImage

    + +

    EdgeImage() finds edges in an image. Radius defines the radius of the convolution filter. Use a radius of 0 and EdgeImage() selects a suitable radius for you.

    + +

    The format of the EdgeImage method is:

    + +
    +Image *EdgeImage(const Image *image,const double radius,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    radius
    +
    the radius of the pixel neighborhood.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    EmbossImage

    + +

    EmbossImage() returns a grayscale image with a three-dimensional effect. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and Emboss() selects a suitable radius for you.

    + +

    The format of the EmbossImage method is:

    + +
    +Image *EmbossImage(const Image *image,const double radius,
    +  const double sigma,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    radius
    +
    the radius of the pixel neighborhood.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    FilterImage

    + +

    FilterImage() applies a custom convolution kernel to the image.

    + +

    The format of the FilterImage method is:

    + +
    +Image *FilterImage(const Image *image,const KernelInfo *kernel,
    +  ExceptionInfo *exception)
    +Image *FilterImageChannel(const Image *image,const ChannelType channel,
    +  const KernelInfo *kernel,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    kernel
    +
    the filtering kernel.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GaussianBlurImage

    + +

    GaussianBlurImage() blurs an image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, the radius should be larger than sigma. Use a radius of 0 and GaussianBlurImage() selects a suitable radius for you.

    + +

    The format of the GaussianBlurImage method is:

    + +
    +Image *GaussianBlurImage(const Image *image,onst double radius,
    +  const double sigma,ExceptionInfo *exception)
    +Image *GaussianBlurImageChannel(const Image *image,
    +  const ChannelType channel,const double radius,const double sigma,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    MotionBlurImage

    + +

    MotionBlurImage() simulates motion blur. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and MotionBlurImage() selects a suitable radius for you. Angle gives the angle of the blurring motion.

    + +

    Andrew Protano contributed this effect.

    + +

    The format of the MotionBlurImage method is:

    + +
    +    Image *MotionBlurImage(const Image *image,const double radius,
    +const double sigma,const double angle,ExceptionInfo *exception)
    +    Image *MotionBlurImageChannel(const Image *image,const ChannelType channel,
    +const double radius,const double sigma,const double angle,
    +ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    angle
    +
    Apply the effect along this angle.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    KuwaharaImage

    + +

    KuwaharaImage() is an edge preserving noise reduction filter.

    + +

    The format of the KuwaharaImage method is:

    + +
    +Image *KuwaharaImage(const Image *image,const double width,
    +  const double sigma,ExceptionInfo *exception)
    +Image *KuwaharaImageChannel(const Image *image,const ChannelType channel,
    +  const double width,const double sigma,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    radius
    +
    the square window radius.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    PreviewImage

    + +

    PreviewImage() tiles 9 thumbnails of the specified image with an image processing operation applied with varying parameters. This may be helpful pin-pointing an appropriate parameter for a particular image processing operation.

    + +

    The format of the PreviewImages method is:

    + +
    +Image *PreviewImages(const Image *image,const PreviewType preview,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    preview
    +
    the image processing operation.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    RotationalBlurImage

    + +

    RotationalBlurImage() applies a rotational blur to the image.

    + +

    Andrew Protano contributed this effect.

    + +

    The format of the RotationalBlurImage method is:

    + +
    +    Image *RotationalBlurImage(const Image *image,const double angle,
    +ExceptionInfo *exception)
    +    Image *RotationalBlurImageChannel(const Image *image,
    +const ChannelType channel,const double angle,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    angle
    +
    the angle of the rotational blur.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SelectiveBlurImage

    + +

    SelectiveBlurImage() selectively blur pixels within a contrast threshold. It is similar to the unsharpen mask that sharpens everything with contrast above a certain threshold.

    + +

    The format of the SelectiveBlurImage method is:

    + +
    +Image *SelectiveBlurImage(const Image *image,const double radius,
    +  const double sigma,const double threshold,ExceptionInfo *exception)
    +Image *SelectiveBlurImageChannel(const Image *image,
    +  const ChannelType channel,const double radius,const double sigma,
    +  const double threshold,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    threshold
    +
    only pixels within this contrast threshold are included in the blur operation.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ShadeImage

    + +

    ShadeImage() shines a distant light on an image to create a three-dimensional effect. You control the positioning of the light with azimuth and elevation; azimuth is measured in degrees off the x axis and elevation is measured in pixels above the Z axis.

    + +

    The format of the ShadeImage method is:

    + +
    +Image *ShadeImage(const Image *image,const MagickBooleanType gray,
    +  const double azimuth,const double elevation,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    gray
    +
    A value other than zero shades the intensity of each pixel.
    + +
    +
    azimuth, elevation
    +
    Define the light source direction.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SharpenImage

    + +

    SharpenImage() sharpens the image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and SharpenImage() selects a suitable radius for you.

    + +

    Using a separable kernel would be faster, but the negative weights cancel out on the corners of the kernel producing often undesirable ringing in the filtered result; this can be avoided by using a 2D gaussian shaped image sharpening kernel instead.

    + +

    The format of the SharpenImage method is:

    + +
    +    Image *SharpenImage(const Image *image,const double radius,
    +const double sigma,ExceptionInfo *exception)
    +    Image *SharpenImageChannel(const Image *image,const ChannelType channel,
    +const double radius,const double sigma,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Laplacian, in pixels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SpreadImage

    + +

    SpreadImage() is a special effects method that randomly displaces each pixel in a block defined by the radius parameter.

    + +

    The format of the SpreadImage method is:

    + +
    +Image *SpreadImage(const Image *image,const double radius,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    radius
    +
    Choose a random pixel in a neighborhood of this extent.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    UnsharpMaskImage

    + +

    UnsharpMaskImage() sharpens one or more image channels. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and UnsharpMaskImage() selects a suitable radius for you.

    + +

    The format of the UnsharpMaskImage method is:

    + +
    +    Image *UnsharpMaskImage(const Image *image,const double radius,
    +const double sigma,const double amount,const double threshold,
    +ExceptionInfo *exception)
    +    Image *UnsharpMaskImageChannel(const Image *image,
    +const ChannelType channel,const double radius,const double sigma,
    +const double gain,const double threshold,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    gain
    +
    the percentage of the difference between the original and the blur image that is added back into the original.
    + +
    +
    threshold
    +
    the threshold in pixels needed to apply the diffence gain.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/enhance.html b/ImageMagick-6.9.12-44/www/api/enhance.html new file mode 100644 index 0000000..4f12119 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/enhance.html @@ -0,0 +1,842 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Enhance an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AutoGammaImageAutoLevelImageBrightnessContrastImageColorDecisionListImageClutImageContrastImageContrastStretchImageEnhanceImageEqualizeImageGammaImageGrayscaleImageHaldClutImageLevelImageLevelImageLevelizeImageChannelLevelImageColorLinearStretchImageModulateImageNegateImageThe NormalizeImageSigmoidalContrastImage

    + +

    AutoGammaImage

    + +

    AutoGammaImage() extract the 'mean' from the image and adjust the image to try make set its gamma appropriatally.

    + +

    The format of the AutoGammaImage method is:

    + +
    +MagickBooleanType AutoGammaImage(Image *image)
    +MagickBooleanType AutoGammaImageChannel(Image *image,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    The image to auto-level
    + +
    +
    channel
    +
    The channels to auto-level. If the special 'SyncChannels' flag is set all given channels is adjusted in the same way using the mean average of those channels.
    + +
    +
    +

    AutoLevelImage

    + +

    AutoLevelImage() adjusts the levels of a particular image channel by scaling the minimum and maximum values to the full quantum range.

    + +

    The format of the LevelImage method is:

    + +
    +MagickBooleanType AutoLevelImage(Image *image)
    +MagickBooleanType AutoLevelImageChannel(Image *image,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    The image to auto-level
    + +
    +
    channel
    +
    The channels to auto-level. If the special 'SyncChannels' flag is set the min/max/mean value of all given channels is used for all given channels, to all channels in the same way.
    + +
    +
    +

    BrightnessContrastImage

    + +

    BrightnessContrastImage() changes the brightness and/or contrast of an image. It converts the brightness and contrast parameters into slope and intercept and calls a polynomical function to apply to the image.

    + +

    The format of the BrightnessContrastImage method is:

    + +
    +MagickBooleanType BrightnessContrastImage(Image *image,
    +  const double brightness,const double contrast)
    +MagickBooleanType BrightnessContrastImageChannel(Image *image,
    +  const ChannelType channel,const double brightness,
    +  const double contrast)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    brightness
    +
    the brightness percent (-100 .. 100).
    + +
    +
    contrast
    +
    the contrast percent (-100 .. 100).
    + +
    +
    +

    ColorDecisionListImage

    + +

    ColorDecisionListImage() accepts a lightweight Color Correction Collection (CCC) file which solely contains one or more color corrections and applies the correction to the image. Here is a sample CCC file:

    + +
    +    <ColorCorrectionCollection xmlns="urn:ASC:CDL:v1.2">
    +    <ColorCorrection id="cc03345">
    +          <SOPNode>
    +               <Slope> 0.9 1.2 0.5 </Slope>
    +               <Offset> 0.4 -0.5 0.6 </Offset>
    +               <Power> 1.0 0.8 1.5 </Power>
    +          </SOPNode>
    +          <SATNode>
    +               <Saturation> 0.85 </Saturation>
    +          </SATNode>
    +    </ColorCorrection>
    +    </ColorCorrectionCollection>
    +
    + +

    which includes the slop, offset, and power for each of the RGB channels as well as the saturation.

    + +

    The format of the ColorDecisionListImage method is:

    + +
    +MagickBooleanType ColorDecisionListImage(Image *image,
    +  const char *color_correction_collection)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    color_correction_collection
    +
    the color correction collection in XML.
    + +
    +
    +

    ClutImage

    + +

    ClutImage() replaces each color value in the given image, by using it as an index to lookup a replacement color value in a Color Look UP Table in the form of an image. The values are extracted along a diagonal of the CLUT image so either a horizontal or vertial gradient image can be used.

    + +

    Typically this is used to either re-color a gray-scale image according to a color gradient in the CLUT image, or to perform a freeform histogram (level) adjustment according to the (typically gray-scale) gradient in the CLUT image.

    + +

    When the 'channel' mask includes the matte/alpha transparency channel but one image has no such channel it is assumed that that image is a simple gray-scale image that will effect the alpha channel values, either for gray-scale coloring (with transparent or semi-transparent colors), or a histogram adjustment of existing alpha channel values. If both images have matte channels, direct and normal indexing is applied, which is rarely used.

    + +

    The format of the ClutImage method is:

    + +
    +MagickBooleanType ClutImage(Image *image,Image *clut_image)
    +MagickBooleanType ClutImageChannel(Image *image,
    +  const ChannelType channel,Image *clut_image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image, which is replaced by indexed CLUT values
    + +
    +
    clut_image
    +
    the color lookup table image for replacement color values.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    +

    ContrastImage

    + +

    ContrastImage() enhances the intensity differences between the lighter and darker elements of the image. Set sharpen to a MagickTrue to increase the image contrast otherwise the contrast is reduced.

    + +

    The format of the ContrastImage method is:

    + +
    +MagickBooleanType ContrastImage(Image *image,
    +  const MagickBooleanType sharpen)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    sharpen
    +
    Increase or decrease image contrast.
    + +
    +
    +

    ContrastStretchImage

    + +

    ContrastStretchImage() is a simple image enhancement technique that attempts to improve the contrast in an image by `stretching' the range of intensity values it contains to span a desired range of values. It differs from the more sophisticated histogram equalization in that it can only apply a linear scaling function to the image pixel values. As a result the `enhancement' is less harsh.

    + +

    The format of the ContrastStretchImage method is:

    + +
    +MagickBooleanType ContrastStretchImage(Image *image,
    +  const char *levels)
    +MagickBooleanType ContrastStretchImageChannel(Image *image,
    +  const size_t channel,const double black_point,
    +  const double white_point)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    black_point
    +
    the black point.
    + +
    +
    white_point
    +
    the white point.
    + +
    +
    levels
    +
    Specify the levels where the black and white points have the range of 0 to number-of-pixels (e.g. 1, 10x90, etc.).
    + +
    +
    +

    EnhanceImage

    + +

    EnhanceImage() applies a digital filter that improves the quality of a noisy image.

    + +

    The format of the EnhanceImage method is:

    + +
    +Image *EnhanceImage(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    EqualizeImage

    + +

    EqualizeImage() applies a histogram equalization to the image.

    + +

    The format of the EqualizeImage method is:

    + +
    +MagickBooleanType EqualizeImage(Image *image)
    +MagickBooleanType EqualizeImageChannel(Image *image,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    +

    GammaImage

    + +

    GammaImage() gamma-corrects a particular image channel. The same image viewed on different devices will have perceptual differences in the way the image's intensities are represented on the screen. Specify individual gamma levels for the red, green, and blue channels, or adjust all three with the gamma parameter. Values typically range from 0.8 to 2.3.

    + +

    You can also reduce the influence of a particular channel with a gamma value of 0.

    + +

    The format of the GammaImage method is:

    + +
    +MagickBooleanType GammaImage(Image *image,const char *level)
    +MagickBooleanType GammaImageChannel(Image *image,
    +  const ChannelType channel,const double gamma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    level
    +
    the image gamma as a string (e.g. 1.6,1.2,1.0).
    + +
    +
    gamma
    +
    the image gamma.
    + +
    +
    +

    GrayscaleImage

    + +

    GrayscaleImage() converts the colors in the reference image to gray.

    + +

    The format of the GrayscaleImageChannel method is:

    + +
    +MagickBooleanType GrayscaleImage(Image *image,
    +  const PixelIntensityMethod method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    +

    HaldClutImage

    + +

    HaldClutImage() applies a Hald color lookup table to the image. A Hald color lookup table is a 3-dimensional color cube mapped to 2 dimensions. Create it with the HALD coder. You can apply any color transformation to the Hald image and then use this method to apply the transform to the image.

    + +

    The format of the HaldClutImage method is:

    + +
    +MagickBooleanType HaldClutImage(Image *image,Image *hald_image)
    +MagickBooleanType HaldClutImageChannel(Image *image,
    +  const ChannelType channel,Image *hald_image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image, which is replaced by indexed CLUT values
    + +
    +
    hald_image
    +
    the color lookup table image for replacement color values.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    +

    LevelImage

    + +

    LevelImage() adjusts the levels of a particular image channel by scaling the colors falling between specified white and black points to the full available quantum range.

    + +

    The parameters provided represent the black, and white points. The black point specifies the darkest color in the image. Colors darker than the black point are set to zero. White point specifies the lightest color in the image. Colors brighter than the white point are set to the maximum quantum value.

    + +

    If a '!' flag is given, map black and white colors to the given levels rather than mapping those levels to black and white. See LevelizeImageChannel() and LevelizeImageChannel(), below.

    + +

    Gamma specifies a gamma correction to apply to the image.

    + +

    The format of the LevelImage method is:

    + +
    +MagickBooleanType LevelImage(Image *image,const char *levels)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    levels
    +
    Specify the levels where the black and white points have the range of 0-QuantumRange, and gamma has the range 0-10 (e.g. 10x90+2). A '!' flag inverts the re-mapping.
    + +
    +
    +

    LevelImage

    + +

    LevelImage() applies the normal level operation to the image, spreading out the values between the black and white points over the entire range of values. Gamma correction is also applied after the values has been mapped.

    + +

    It is typically used to improve image contrast, or to provide a controlled linear threshold for the image. If the black and white points are set to the minimum and maximum values found in the image, the image can be normalized. or by swapping black and white values, negate the image.

    + +

    The format of the LevelImage method is:

    + +
    +MagickBooleanType LevelImage(Image *image,const double black_point,
    +  const double white_point,const double gamma)
    +MagickBooleanType LevelImageChannel(Image *image,
    +  const ChannelType channel,const double black_point,
    +  const double white_point,const double gamma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    black_point
    +
    The level which is to be mapped to zero (black)
    + +
    +
    white_point
    +
    The level which is to be mapped to QuantumRange (white)
    + +
    +
    gamma
    +
    adjust gamma by this factor before mapping values. use 1.0 for purely linear stretching of image color values
    + +
    +
    +

    LevelizeImageChannel

    + +

    LevelizeImageChannel() applies the reversed LevelImage() operation to just the specific channels specified. It compresses the full range of color values, so that they lie between the given black and white points. Gamma is applied before the values are mapped.

    + +

    LevelizeImageChannel() can be called with by using a +level command line API option, or using a '!' on a -level or LevelImage() geometry string.

    + +

    It can be used for example de-contrast a greyscale image to the exact levels specified. Or by using specific levels for each channel of an image you can convert a gray-scale image to any linear color gradient, according to those levels.

    + +

    The format of the LevelizeImageChannel method is:

    + +
    +MagickBooleanType LevelizeImageChannel(Image *image,
    +  const ChannelType channel,const char *levels)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    black_point
    +
    The level to map zero (black) to.
    + +
    +
    white_point
    +
    The level to map QuantumRange (white) to.
    + +
    +
    gamma
    +
    adjust gamma by this factor before mapping values.
    + +
    +
    +

    LevelImageColor

    + +

    LevelImageColor() maps the given color to "black" and "white" values, linearly spreading out the colors, and level values on a channel by channel bases, as per LevelImage(). The given colors allows you to specify different level ranges for each of the color channels separately.

    + +

    If the boolean 'invert' is set true the image values will modifyed in the reverse direction. That is any existing "black" and "white" colors in the image will become the color values given, with all other values compressed appropriatally. This effectivally maps a greyscale gradient into the given color gradient.

    + +

    The format of the LevelColorsImageChannel method is:

    + +
    +    MagickBooleanType LevelColorsImage(Image *image,
    +const MagickPixelPacket *black_color,
    +const MagickPixelPacket *white_color,const MagickBooleanType invert)
    +    MagickBooleanType LevelColorsImageChannel(Image *image,
    +const ChannelType channel,const MagickPixelPacket *black_color,
    +const MagickPixelPacket *white_color,const MagickBooleanType invert)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    black_color
    +
    The color to map black to/from
    + +
    +
    white_point
    +
    The color to map white to/from
    + +
    +
    invert
    +
    if true map the colors (levelize), rather than from (level)
    + +
    +
    +

    LinearStretchImage

    + +

    LinearStretchImage() discards any pixels below the black point and above the white point and levels the remaining pixels.

    + +

    The format of the LinearStretchImage method is:

    + +
    +MagickBooleanType LinearStretchImage(Image *image,
    +  const double black_point,const double white_point)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    black_point
    +
    the black point.
    + +
    +
    white_point
    +
    the white point.
    + +
    +
    +

    ModulateImage

    + +

    ModulateImage() lets you control the brightness, saturation, and hue of an image. Modulate represents the brightness, saturation, and hue as one parameter (e.g. 90,150,100). If the image colorspace is HSL, the modulation is lightness, saturation, and hue. For HWB, use blackness, whiteness, and hue. And for HCL, use chrome, luma, and hue.

    + +

    The format of the ModulateImage method is:

    + +
    +MagickBooleanType ModulateImage(Image *image,const char *modulate)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    modulate
    +
    Define the percent change in brightness, saturation, and hue.
    + +
    +
    +

    NegateImage

    + +

    NegateImage() negates the colors in the reference image. The grayscale option means that only grayscale values within the image are negated.

    + +

    The format of the NegateImageChannel method is:

    + +
    +MagickBooleanType NegateImage(Image *image,
    +  const MagickBooleanType grayscale)
    +MagickBooleanType NegateImageChannel(Image *image,
    +  const ChannelType channel,const MagickBooleanType grayscale)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    grayscale
    +
    If MagickTrue, only negate grayscale pixels within the image.
    + +
    +
    +

    The NormalizeImage

    + +

    The NormalizeImage() method enhances the contrast of a color image by mapping the darkest 2 percent of all pixel to black and the brightest 1 percent to white.

    + +

    The format of the NormalizeImage method is:

    + +
    +MagickBooleanType NormalizeImage(Image *image)
    +MagickBooleanType NormalizeImageChannel(Image *image,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    +

    SigmoidalContrastImage

    + +

    SigmoidalContrastImage() adjusts the contrast of an image with a non-linear sigmoidal contrast algorithm. Increase the contrast of the image using a sigmoidal transfer function without saturating highlights or shadows. Contrast indicates how much to increase the contrast (0 is none; 3 is typical; 20 is pushing it); mid-point indicates where midtones fall in the resultant image (0 is white; 50 is middle-gray; 100 is black). Set sharpen to MagickTrue to increase the image contrast otherwise the contrast is reduced.

    + +

    The format of the SigmoidalContrastImage method is:

    + +
    +MagickBooleanType SigmoidalContrastImage(Image *image,
    +  const MagickBooleanType sharpen,const char *levels)
    +MagickBooleanType SigmoidalContrastImageChannel(Image *image,
    +  const ChannelType channel,const MagickBooleanType sharpen,
    +  const double contrast,const double midpoint)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    sharpen
    +
    Increase or decrease image contrast.
    + +
    +
    contrast
    +
    strength of the contrast, the larger the number the more 'threshold-like' it becomes.
    + +
    +
    midpoint
    +
    midpoint of the function as a color value 0 to QuantumRange.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/exception.html b/ImageMagick-6.9.12-44/www/api/exception.html new file mode 100644 index 0000000..d1cd08b --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/exception.html @@ -0,0 +1,514 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Dealing with Exceptions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireExceptionInfoClearMagickExceptionCatchExceptionCloneExceptionInfoDestroyExceptionInfoGetExceptionMessageGetLocaleExceptionMessageInheritExceptionInitializeExceptionInfoMagickErrorMagickFatalErrorMagickWarningSetErrorHandlerSetFatalErrorHandlerSetWarningHandlerThrowException

    + +

    AcquireExceptionInfo

    + +

    AcquireExceptionInfo() allocates the ExceptionInfo structure.

    + +

    The format of the AcquireExceptionInfo method is:

    + +
    +ExceptionInfo *AcquireExceptionInfo(void)
    +
    + +

    ClearMagickException

    + +

    ClearMagickException() clears any exception that may not have been caught yet.

    + +

    The format of the ClearMagickException method is:

    + +
    +ClearMagickException(ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    exception
    +
    the exception info.
    + +
    +
    +

    CatchException

    + +

    CatchException() returns if no exceptions is found otherwise it reports the exception as a warning, error, or fatal depending on the severity.

    + +

    The format of the CatchException method is:

    + +
    +CatchException(ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    exception
    +
    the exception info.
    + +
    +
    +

    CloneExceptionInfo

    + +

    CloneExceptionInfo() clones the ExceptionInfo structure.

    + +

    The format of the CloneExceptionInfo method is:

    + +
    +ExceptionInfo *CloneException(ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    exception
    +
    the exception info.
    + +
    +
    +

    DestroyExceptionInfo

    + +

    DestroyExceptionInfo() deallocates memory associated with an exception.

    + +

    The format of the DestroyExceptionInfo method is:

    + +
    +ExceptionInfo *DestroyExceptionInfo(ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    exception
    +
    the exception info.
    + +
    +
    +

    GetExceptionMessage

    + +

    GetExceptionMessage() returns the error message defined by the specified error code.

    + +

    The format of the GetExceptionMessage method is:

    + +
    +char *GetExceptionMessage(const int error)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    error
    +
    the error code.
    + +
    +
    +

    GetLocaleExceptionMessage

    + +

    GetLocaleExceptionMessage() converts a enumerated exception severity and tag to a message in the current locale.

    + +

    The format of the GetLocaleExceptionMessage method is:

    + +
    +const char *GetLocaleExceptionMessage(const ExceptionType severity,
    +  const char *tag)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    severity
    +
    the severity of the exception.
    + +
    +
    tag
    +
    the message tag.
    + +
    +
    +

    InheritException

    + +

    InheritException() inherits an exception from a related exception.

    + +

    The format of the InheritException method is:

    + +
    +InheritException(ExceptionInfo *exception,const ExceptionInfo *relative)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    exception
    +
    the exception info.
    + +
    +
    relative
    +
    the related exception info.
    + +
    +
    +

    InitializeExceptionInfo

    + +

    InitializeExceptionInfo() initializes an exception to default values.

    + +

    The format of the InitializeExceptionInfo method is:

    + +
    +InitializeExceptionInfo(ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    exception
    +
    the exception info.
    + +
    +
    +

    MagickError

    + +

    MagickError() calls the exception handler methods with an error reason.

    + +

    The format of the MagickError method is:

    + +
    +void MagickError(const ExceptionType error,const char *reason,
    +  const char *description)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    exception
    +
    Specifies the numeric error category.
    + +
    +
    reason
    +
    Specifies the reason to display before terminating the program.
    + +
    +
    description
    +
    Specifies any description to the reason.
    + +
    +
    +

    MagickFatalError

    + +

    MagickFatalError() calls the fatal exception handler methods with an error reason.

    + +

    The format of the MagickError method is:

    + +
    +void MagickFatalError(const ExceptionType error,const char *reason,
    +  const char *description)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    exception
    +
    Specifies the numeric error category.
    + +
    +
    reason
    +
    Specifies the reason to display before terminating the program.
    + +
    +
    description
    +
    Specifies any description to the reason.
    + +
    +
    +

    MagickWarning

    + +

    MagickWarning() calls the warning handler methods with a warning reason.

    + +

    The format of the MagickWarning method is:

    + +
    +void MagickWarning(const ExceptionType warning,const char *reason,
    +  const char *description)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    warning
    +
    the warning severity.
    + +
    +
    reason
    +
    Define the reason for the warning.
    + +
    +
    description
    +
    Describe the warning.
    + +
    +
    +

    SetErrorHandler

    + +

    SetErrorHandler() sets the exception handler to the specified method and returns the previous exception handler.

    + +

    The format of the SetErrorHandler method is:

    + +
    +ErrorHandler SetErrorHandler(ErrorHandler handler)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    handler
    +
    the method to handle errors.
    + +
    +
    +

    SetFatalErrorHandler

    + +

    SetFatalErrorHandler() sets the fatal exception handler to the specified method and returns the previous fatal exception handler.

    + +

    The format of the SetErrorHandler method is:

    + +
    +ErrorHandler SetErrorHandler(ErrorHandler handler)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    handler
    +
    the method to handle errors.
    + +
    +
    +

    SetWarningHandler

    + +

    SetWarningHandler() sets the warning handler to the specified method and returns the previous warning handler.

    + +

    The format of the SetWarningHandler method is:

    + +
    +ErrorHandler SetWarningHandler(ErrorHandler handler)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    handler
    +
    the method to handle warnings.
    + +
    +
    +

    ThrowException

    + +

    ThrowException() throws an exception with the specified severity code, reason, and optional description.

    + +

    The format of the ThrowException method is:

    + +
    +MagickBooleanType ThrowException(ExceptionInfo *exception,
    +  const ExceptionType severity,const char *reason,
    +  const char *description)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    exception
    +
    the exception info.
    + +
    +
    severity
    +
    the severity of the exception.
    + +
    +
    reason
    +
    the reason for the exception.
    + +
    +
    description
    +
    the exception description.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/feature.html b/ImageMagick-6.9.12-44/www/api/feature.html new file mode 100644 index 0000000..27fcdee --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/feature.html @@ -0,0 +1,277 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Image Features + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    CannyEdgeImageGetImageChannelFeaturesUse HoughLineImageMeanShiftImage

    + +

    CannyEdgeImage

    + +

    CannyEdgeImage() uses a multi-stage algorithm to detect a wide range of edges in images.

    + +

    The format of the CannyEdgeImage method is:

    + +
    +Image *CannyEdgeImage(const Image *image,const double radius,
    +  const double sigma,const double lower_percent,
    +  const double upper_percent,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    radius
    +
    the radius of the gaussian smoothing filter.
    + +
    +
    sigma
    +
    the sigma of the gaussian smoothing filter.
    + +
    +
    lower_percent
    +
    percentage of edge pixels in the lower threshold.
    + +
    +
    upper_percent
    +
    percentage of edge pixels in the upper threshold.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetImageChannelFeatures

    + +

    GetImageChannelFeatures() returns features for each channel in the image in each of four directions (horizontal, vertical, left and right diagonals) for the specified distance. The features include the angular second moment, contrast, correlation, sum of squares: variance, inverse difference moment, sum average, sum varience, sum entropy, entropy, difference variance, difference entropy, information measures of correlation 1, information measures of correlation 2, and maximum correlation coefficient. You can access the red channel contrast, for example, like this:

    + +
    +channel_features=GetImageChannelFeatures(image,1,exception);
    +contrast=channel_features[RedChannel].contrast[0];
    +
    + +

    Use MagickRelinquishMemory() to free the features buffer.

    + +

    The format of the GetImageChannelFeatures method is:

    + +
    +ChannelFeatures *GetImageChannelFeatures(const Image *image,
    +  const size_t distance,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    distance
    +
    the distance.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    Use HoughLineImage

    + +

    Use HoughLineImage() in conjunction with any binary edge extracted image (we recommand Canny) to identify lines in the image. The algorithm accumulates counts for every white pixel for every possible orientation (for angles from 0 to 179 in 1 degree increments) and distance from the center of the image to the corner (in 1 px increments) and stores the counts in an accumulator matrix of angle vs distance. The size of the accumulator is 180x(diagonal/2). Next it searches this space for peaks in counts and converts the locations of the peaks to slope and intercept in the normal x,y input image space. Use the slope/intercepts to find the endpoints clipped to the bounds of the image. The lines are then drawn. The counts are a measure of the length of the lines.

    + +

    The format of the HoughLineImage method is:

    + +
    +Image *HoughLineImage(const Image *image,const size_t width,
    +  const size_t height,const size_t threshold,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    width, height
    +
    find line pairs as local maxima in this neighborhood.
    + +
    +
    threshold
    +
    the line count threshold.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    MeanShiftImage

    + +

    MeanShiftImage() delineate arbitrarily shaped clusters in the image. For each pixel, it visits all the pixels in the neighborhood specified by the window centered at the pixel and excludes those that are outside the radius=(window-1)/2 surrounding the pixel. From those pixels, it finds those that are within the specified color distance from the current mean, and computes a new x,y centroid from those coordinates and a new mean. This new x,y centroid is used as the center for a new window. This process iterates until it converges and the final mean is replaces the (original window center) pixel value. It repeats this process for the next pixel, etc., until it processes all pixels in the image. Results are typically better with colorspaces other than sRGB. We recommend YIQ, YUV or YCbCr.

    + +

    The format of the MeanShiftImage method is:

    + +
    +Image *MeanShiftImage(const Image *image,const size_t width,
    +  const size_t height,const double color_distance,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    width, height
    +
    find pixels in this neighborhood.
    + +
    +
    color_distance
    +
    the color distance.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/fourier.html b/ImageMagick-6.9.12-44/www/api/fourier.html new file mode 100644 index 0000000..a8def1a --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/fourier.html @@ -0,0 +1,222 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Fourier Transform + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    ComplexImagesForwardFourierTransformImageInverseFourierTransformImage

    + +

    ComplexImages

    + +

    ComplexImages() performs complex mathematics on an image sequence.

    + +

    The format of the ComplexImages method is:

    + +
    +MagickBooleanType ComplexImages(Image *images,const ComplexOperator op,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    op
    +
    A complex operator.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ForwardFourierTransformImage

    + +

    ForwardFourierTransformImage() implements the discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.

    + +

    The format of the ForwadFourierTransformImage method is:

    + +
    +Image *ForwardFourierTransformImage(const Image *image,
    +  const MagickBooleanType modulus,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    modulus
    +
    if true, return as transform as a magnitude / phase pair otherwise a real / imaginary image pair.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    InverseFourierTransformImage

    + +

    InverseFourierTransformImage() implements the inverse discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.

    + +

    The format of the InverseFourierTransformImage method is:

    + +
    +Image *InverseFourierTransformImage(const Image *magnitude_image,
    +  const Image *phase_image,const MagickBooleanType modulus,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    magnitude_image
    +
    the magnitude or real image.
    + +
    +
    phase_image
    +
    the phase or imaginary image.
    + +
    +
    modulus
    +
    if true, return transform as a magnitude / phase pair otherwise a real / imaginary image pair.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/fx.html b/ImageMagick-6.9.12-44/www/api/fx.html new file mode 100644 index 0000000..ee39c6b --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/fx.html @@ -0,0 +1,161 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Add a Special Effect + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    FxImage

    + +

    FxImage

    + +

    FxImage() applies a mathematical expression to the specified image.

    + +

    The format of the FxImage method is:

    + +
    +Image *FxImage(const Image *image,const char *expression,
    +  ExceptionInfo *exception)
    +Image *FxImageChannel(const Image *image,const ChannelType channel,
    +  const char *expression,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    expression
    +
    A mathematical expression.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/histogram.html b/ImageMagick-6.9.12-44/www/api/histogram.html new file mode 100644 index 0000000..e151544 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/histogram.html @@ -0,0 +1,283 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Image Histograms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    GetImageHistogramIdentifyPaletteImageIsHistogramImageIsPaletteImageMinMaxStretchImageGetNumberColorsUniqueImageColors

    + +

    GetImageHistogram

    + +

    GetImageHistogram() returns the unique colors in an image.

    + +

    The format of the GetImageHistogram method is:

    + +
    +size_t GetImageHistogram(const Image *image,
    +  size_t *number_colors,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    file
    +

    Write a histogram of the color distribution to this file handle.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    IdentifyPaletteImage

    + +

    IdentifyPaletteImage() returns MagickTrue if the image has 256 unique colors or less.

    + +

    The format of the IdentifyPaletteImage method is:

    + +
    +MagickBooleanType IdentifyPaletteImage(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    IsHistogramImage

    + +

    IsHistogramImage() returns MagickTrue if the image has 1024 unique colors or less.

    + +

    The format of the IsHistogramImage method is:

    + +
    +MagickBooleanType IsHistogramImage(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    IsPaletteImage

    + +

    IsPaletteImage() returns MagickTrue if the image is PseudoClass and has 256 unique colors or less.

    + +

    The format of the IsPaletteImage method is:

    + +
    +MagickBooleanType IsPaletteImage(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    MinMaxStretchImage

    + +

    MinMaxStretchImage() uses the exact minimum and maximum values found in each of the channels given, as the BlackPoint and WhitePoint to linearly stretch the colors (and histogram) of the image. The stretch points are also moved further inward by the adjustment values given.

    + +

    If the adjustment values are both zero this function is equivalent to a perfect normalization (or autolevel) of the image.

    + +

    Each channel is stretched independantally of each other (producing color distortion) unless the special 'SyncChannels' flag is also provided in the channels setting. If this flag is present the minimum and maximum point will be extracted from all the given channels, and those channels will be stretched by exactly the same amount (preventing color distortion).

    + +

    In the special case that only ONE value is found in a channel of the image that value is not stretched, that value is left as is.

    + +

    The 'SyncChannels' is turned on in the 'DefaultChannels' setting by default.

    + +

    The format of the MinMaxStretchImage method is:

    + +
    +MagickBooleanType MinMaxStretchImage(Image *image,
    +  const ChannelType channel, const double black_adjust,
    +  const double white_adjust)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    The image to auto-level
    + +
    +
    channel
    +
    The channels to auto-level. If the special 'SyncChannels' flag is set, all the given channels are stretched by the same amount.
    + +
    +
    black_adjust, white_adjust
    +
    Move the Black/White Point inward from the minimum and maximum points by this color value.
    + +
    +
    +

    GetNumberColors

    + +

    GetNumberColors() returns the number of unique colors in an image.

    + +

    The format of the GetNumberColors method is:

    + +
    +size_t GetNumberColors(const Image *image,FILE *file,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    file
    +

    Write a histogram of the color distribution to this file handle.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    UniqueImageColors

    + +

    UniqueImageColors() returns the unique colors of an image.

    + +

    The format of the UniqueImageColors method is:

    + +
    +Image *UniqueImageColors(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/image-view.html b/ImageMagick-6.9.12-44/www/api/image-view.html new file mode 100644 index 0000000..1e416ea --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/image-view.html @@ -0,0 +1,698 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Image View Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    CloneImageViewDestroyImageViewDuplexTransferImageViewIteratorGetImageViewAuthenticIndexesGetImageViewAuthenticPixelsGetImageViewExceptionGetImageViewExtentGetImageViewImageGetImageViewIteratorGetImageViewVirtualIndexesGetImageViewVirtualPixelsIsImageViewNewImageViewNewImageViewRegionSetImageViewDescriptionSetImageViewIteratorSetImageViewThreadsTransferImageViewIteratorUpdateImageViewIterator

    + +

    CloneImageView

    + +

    CloneImageView() makes a copy of the specified image view.

    + +

    The format of the CloneImageView method is:

    + +
    +ImageView *CloneImageView(const ImageView *image_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    +

    DestroyImageView

    + +

    DestroyImageView() deallocates memory associated with a image view.

    + +

    The format of the DestroyImageView method is:

    + +
    +ImageView *DestroyImageView(ImageView *image_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    +

    DuplexTransferImageViewIterator

    + +

    DuplexTransferImageViewIterator() iterates over three image views in parallel and calls your transfer method for each scanline of the view. The source and duplex pixel extent is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. However, the destination image view is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted.

    + +

    The callback signature is:

    + +
    +MagickBooleanType DuplexTransferImageViewMethod(const ImageView *source,
    +  const ImageView *duplex,ImageView *destination,const ssize_t y,
    +  const int thread_id,void *context)
    +
    + +

    Use this pragma if the view is not single threaded:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback transfer method that must be executed by a single thread at a time.

    + +

    The format of the DuplexTransferImageViewIterator method is:

    + +
    +MagickBooleanType DuplexTransferImageViewIterator(ImageView *source,
    +  ImageView *duplex,ImageView *destination,
    +  DuplexTransferImageViewMethod transfer,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source image view.
    + +
    +
    duplex
    +
    the duplex image view.
    + +
    +
    destination
    +
    the destination image view.
    + +
    +
    transfer
    +
    the transfer callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    GetImageViewAuthenticIndexes

    + +

    GetImageViewAuthenticIndexes() returns the image view authentic indexes.

    + +

    The format of the GetImageViewAuthenticPixels method is:

    + +
    +IndexPacket *GetImageViewAuthenticIndexes(const ImageView *image_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    +

    GetImageViewAuthenticPixels

    + +

    GetImageViewAuthenticPixels() returns the image view authentic pixels.

    + +

    The format of the GetImageViewAuthenticPixels method is:

    + +
    +PixelPacket *GetImageViewAuthenticPixels(const ImageView *image_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    +

    GetImageViewException

    + +

    GetImageViewException() returns the severity, reason, and description of any error that occurs when utilizing a image view.

    + +

    The format of the GetImageViewException method is:

    + +
    +char *GetImageViewException(const PixelImage *image_view,
    +  ExceptionType *severity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the pixel image_view.
    + +
    +
    severity
    +
    the severity of the error is returned here.
    + +
    +
    +

    GetImageViewExtent

    + +

    GetImageViewExtent() returns the image view extent.

    + +

    The format of the GetImageViewExtent method is:

    + +
    +RectangleInfo GetImageViewExtent(const ImageView *image_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    +

    GetImageViewImage

    + +

    GetImageViewImage() returns the image associated with the image view.

    + +

    The format of the GetImageViewImage method is:

    + +
    +MagickCore *GetImageViewImage(const ImageView *image_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    +

    GetImageViewIterator

    + +

    GetImageViewIterator() iterates over the image view in parallel and calls your get method for each scanline of the view. The pixel extent is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. Any updates to the pixels in your callback are ignored.

    + +

    The callback signature is:

    + +
    +MagickBooleanType GetImageViewMethod(const ImageView *source,
    +  const ssize_t y,const int thread_id,void *context)
    +
    + +

    Use this pragma if the view is not single threaded:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback get method that must be executed by a single thread at a time.

    + +

    The format of the GetImageViewIterator method is:

    + +
    +MagickBooleanType GetImageViewIterator(ImageView *source,
    +  GetImageViewMethod get,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source image view.
    + +
    +
    get
    +
    the get callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    GetImageViewVirtualIndexes

    + +

    GetImageViewVirtualIndexes() returns the image view virtual indexes.

    + +

    The format of the GetImageViewVirtualIndexes method is:

    + +
    +const IndexPacket *GetImageViewVirtualIndexes(
    +  const ImageView *image_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    +

    GetImageViewVirtualPixels

    + +

    GetImageViewVirtualPixels() returns the image view virtual pixels.

    + +

    The format of the GetImageViewVirtualPixels method is:

    + +
    +const PixelPacket *GetImageViewVirtualPixels(const ImageView *image_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    +

    IsImageView

    + +

    IsImageView() returns MagickTrue if the parameter is verified as a image view object.

    + +

    The format of the IsImageView method is:

    + +
    +MagickBooleanType IsImageView(const ImageView *image_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    +

    NewImageView

    + +

    NewImageView() returns a image view required for all other methods in the Image View API.

    + +

    The format of the NewImageView method is:

    + +
    +ImageView *NewImageView(MagickCore *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the wand.
    + +
    +
    +

    NewImageViewRegion

    + +

    NewImageViewRegion() returns a image view required for all other methods in the Image View API.

    + +

    The format of the NewImageViewRegion method is:

    + +
    +ImageView *NewImageViewRegion(MagickCore *wand,const ssize_t x,
    +  const ssize_t y,const size_t width,const size_t height)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a extent of pixel_wands view.
    + +
    +
    +

    SetImageViewDescription

    + +

    SetImageViewDescription() associates a description with an image view.

    + +

    The format of the SetImageViewDescription method is:

    + +
    +void SetImageViewDescription(ImageView *image_view,
    +  const char *description)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    description
    +
    the image view description.
    + +
    +
    +

    SetImageViewIterator

    + +

    SetImageViewIterator() iterates over the image view in parallel and calls your set method for each scanline of the view. The pixel extent is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension. The pixels are initiallly undefined and any settings you make in the callback method are automagically synced back to your image.

    + +

    The callback signature is:

    + +
    +MagickBooleanType SetImageViewMethod(ImageView *destination,
    +  const ssize_t y,const int thread_id,void *context)
    +
    + +

    Use this pragma if the view is not single threaded:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback set method that must be executed by a single thread at a time.

    + +

    The format of the SetImageViewIterator method is:

    + +
    +MagickBooleanType SetImageViewIterator(ImageView *destination,
    +  SetImageViewMethod set,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    destination
    +
    the image view.
    + +
    +
    set
    +
    the set callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    SetImageViewThreads

    + +

    SetImageViewThreads() sets the number of threads in a thread team.

    + +

    The format of the SetImageViewDescription method is:

    + +
    +void SetImageViewThreads(ImageView *image_view,
    +  const size_t number_threads)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    number_threads
    +
    the number of threads in a thread team.
    + +
    +
    +

    TransferImageViewIterator

    + +

    TransferImageViewIterator() iterates over two image views in parallel and calls your transfer method for each scanline of the view. The source pixel extent is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. However, the destination image view is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted.

    + +

    The callback signature is:

    + +
    +MagickBooleanType TransferImageViewMethod(const ImageView *source,
    +  ImageView *destination,const ssize_t y,const int thread_id,
    +  void *context)
    +
    + +

    Use this pragma if the view is not single threaded:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback transfer method that must be executed by a single thread at a time.

    + +

    The format of the TransferImageViewIterator method is:

    + +
    +MagickBooleanType TransferImageViewIterator(ImageView *source,
    +  ImageView *destination,TransferImageViewMethod transfer,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source image view.
    + +
    +
    destination
    +
    the destination image view.
    + +
    +
    transfer
    +
    the transfer callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    UpdateImageViewIterator

    + +

    UpdateImageViewIterator() iterates over the image view in parallel and calls your update method for each scanline of the view. The pixel extent is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted. Updates to pixels in your callback are automagically synced back to the image.

    + +

    The callback signature is:

    + +
    +MagickBooleanType UpdateImageViewMethod(ImageView *source,
    +  const ssize_t y,const int thread_id,void *context)
    +
    + +

    Use this pragma if the view is not single threaded:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback update method that must be executed by a single thread at a time.

    + +

    The format of the UpdateImageViewIterator method is:

    + +
    +MagickBooleanType UpdateImageViewIterator(ImageView *source,
    +  UpdateImageViewMethod update,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source image view.
    + +
    +
    update
    +
    the update callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/image.html b/ImageMagick-6.9.12-44/www/api/image.html new file mode 100644 index 0000000..d04eb07 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/image.html @@ -0,0 +1,1192 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Image Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireImageAcquireImageInfoAcquireNextImageAppendImagesCatchImageExceptionClipImagePathCloneImageCloneImageInfoCopyImagePixelsDestroyImageDestroyImageInfoGetImageClipMaskGetImageExceptionGetImageInfoGetImageInfoFileGetImageMaskGetImageChannelsGetImageVirtualPixelMethodInterpretImageFilenameIsHighDynamicRangeImageIsImageObjectIsTaintImageModifyImageNewMagickImageReferenceImageResetImagePageResetImagePixelsSetImageBackgroundColorSetImageChannelsSetImageColorSetImageStorageClassSetImageClipMaskSetImageExtentSetImageInfoBlobSetImageInfoFileSetImageMaskSetImageOpacitySetImageVirtualPixelMethodSmushImagesStripImageSyncImageSettings

    + +

    AcquireImage

    + +

    AcquireImage() returns a pointer to an image structure initialized to default values.

    + +

    The format of the AcquireImage method is:

    + +
    +Image *AcquireImage(const ImageInfo *image_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    Many of the image default values are set from this structure. For example, filename, compression, depth, background color, and others.
    + +
    +
    +

    AcquireImageInfo

    + +

    AcquireImageInfo() allocates the ImageInfo structure.

    + +

    The format of the AcquireImageInfo method is:

    + +
    +ImageInfo *AcquireImageInfo(void)
    +
    + +

    AcquireNextImage

    + +

    AcquireNextImage() initializes the next image in a sequence to default values. The next member of image points to the newly allocated image. If there is a memory shortage, next is assigned NULL.

    + +

    The format of the AcquireNextImage method is:

    + +
    +void AcquireNextImage(const ImageInfo *image_info,Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    Many of the image default values are set from this structure. For example, filename, compression, depth, background color, and others.
    + +
    +
    image
    +
    the image.
    + +
    +
    +

    AppendImages

    + +

    AppendImages() takes all images from the current image pointer to the end of the image list and appends them to each other top-to-bottom if the stack parameter is true, otherwise left-to-right.

    + +

    The current gravity setting now effects how the image is justified in the final image.

    + +

    The format of the AppendImages method is:

    + +
    +Image *AppendImages(const Image *images,const MagickBooleanType stack,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image sequence.
    + +
    +
    stack
    +
    A value other than 0 stacks the images top-to-bottom.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    CatchImageException

    + +

    CatchImageException() returns if no exceptions are found in the image sequence, otherwise it determines the most severe exception and reports it as a warning or error depending on the severity.

    + +

    The format of the CatchImageException method is:

    + +
    +ExceptionType CatchImageException(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    An image sequence.
    + +
    +
    +

    ClipImagePath

    + +

    ClipImagePath() sets the image clip mask based any clipping path information if it exists.

    + +

    The format of the ClipImagePath method is:

    + +
    +MagickBooleanType ClipImagePath(Image *image,const char *pathname,
    +  const MagickBooleanType inside)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    pathname
    +
    name of clipping path resource. If name is preceded by #, use clipping path numbered by name.
    + +
    +
    inside
    +
    if non-zero, later operations take effect inside clipping path. Otherwise later operations take effect outside clipping path.
    + +
    +
    +

    CloneImage

    + +

    CloneImage() copies an image and returns the copy as a new image object.

    + +

    If the specified columns and rows is 0, an exact copy of the image is returned, otherwise the pixel data is undefined and must be initialized with the QueueAuthenticPixels() and SyncAuthenticPixels() methods. On failure, a NULL image is returned and exception describes the reason for the failure.

    + +

    The format of the CloneImage method is:

    + +
    +Image *CloneImage(const Image *image,const size_t columns,
    +  const size_t rows,const MagickBooleanType orphan,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    columns
    +
    the number of columns in the cloned image.
    + +
    +
    rows
    +
    the number of rows in the cloned image.
    + +
    +
    detach
    +
    With a value other than 0, the cloned image is detached from its parent I/O stream.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    CloneImageInfo

    + +

    CloneImageInfo() makes a copy of the given image info structure. If NULL is specified, a new image info structure is created initialized to default values.

    + +

    The format of the CloneImageInfo method is:

    + +
    +ImageInfo *CloneImageInfo(const ImageInfo *image_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    +

    CopyImagePixels

    + +

    CopyImagePixels() copies pixels from the source image as defined by the geometry the destination image at the specified offset.

    + +

    The format of the CopyImagePixels method is:

    + +
    +MagickBooleanType CopyImagePixels(Image *image,const Image *source_image,
    +  const RectangleInfo *geometry,const OffsetInfo *offset,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the destination image.
    + +
    +
    source_image
    +
    the source image.
    + +
    +
    geometry
    +
    define the dimensions of the source pixel rectangle.
    + +
    +
    offset
    +
    define the offset in the destination image.
    + +
    +
    exception
    +
    return the highest severity exception.
    + +
    +
    +

    DestroyImage

    + +

    DestroyImage() dereferences an image, deallocating memory associated with the image if the reference count becomes zero.

    + +

    The format of the DestroyImage method is:

    + +
    +Image *DestroyImage(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    DestroyImageInfo

    + +

    DestroyImageInfo() deallocates memory associated with an ImageInfo structure.

    + +

    The format of the DestroyImageInfo method is:

    + +
    +ImageInfo *DestroyImageInfo(ImageInfo *image_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    +

    GetImageClipMask

    + +

    GetImageClipMask() returns the clip path associated with the image.

    + +

    The format of the GetImageClipMask method is:

    + +
    +Image *GetImageClipMask(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    GetImageException

    + +

    GetImageException() traverses an image sequence and returns any error more severe than noted by the exception parameter.

    + +

    The format of the GetImageException method is:

    + +
    +void GetImageException(Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    Specifies a pointer to a list of one or more images.
    + +
    +
    exception
    +
    return the highest severity exception.
    + +
    +
    +

    GetImageInfo

    + +

    GetImageInfo() initializes image_info to default values.

    + +

    The format of the GetImageInfo method is:

    + +
    +void GetImageInfo(ImageInfo *image_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    +

    GetImageInfoFile

    + +

    GetImageInfoFile() returns the image info file member.

    + +

    The format of the GetImageInfoFile method is:

    + +
    +FILE *GetImageInfoFile(const ImageInfo *image_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    +

    GetImageMask

    + +

    GetImageMask() returns the mask associated with the image.

    + +

    The format of the GetImageMask method is:

    + +
    +Image *GetImageMask(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    GetImageChannels

    + +

    GetImageChannels() returns the number of pixel channels associated with the specified image.

    + +

    The format of the GetChannels method is:

    + +
    +size_t GetImageChannels(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    GetImageVirtualPixelMethod

    + +

    GetImageVirtualPixelMethod() gets the "virtual pixels" method for the image. A virtual pixel is any pixel access that is outside the boundaries of the image cache.

    + +

    The format of the GetImageVirtualPixelMethod() method is:

    + +
    +VirtualPixelMethod GetImageVirtualPixelMethod(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    InterpretImageFilename

    + +

    InterpretImageFilename() interprets embedded characters in an image filename. The filename length is returned.

    + +

    The format of the InterpretImageFilename method is:

    + +
    +size_t InterpretImageFilename(const ImageInfo *image_info,Image *image,
    +  const char *format,int value,char *filename)
    +
    + +

    A description of each parameter follows.

    + +
    image_info
    +

    the image info..

    + +
    image
    +

    the image.

    + +
    format
    +

    A filename describing the format to use to write the numeric argument. Only the first numeric format identifier is replaced.

    + +
    value
    +

    Numeric value to substitute into format filename.

    + +
    filename
    +

    return the formatted filename in this character buffer.

    + +

    IsHighDynamicRangeImage

    + +

    IsHighDynamicRangeImage() returns MagickTrue if any pixel component is non-integer or exceeds the bounds of the quantum depth (e.g. for Q16 0..65535.

    + +

    The format of the IsHighDynamicRangeImage method is:

    + +
    +MagickBooleanType IsHighDynamicRangeImage(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    IsImageObject

    + +

    IsImageObject() returns MagickTrue if the image sequence contains a valid set of image objects.

    + +

    The format of the IsImageObject method is:

    + +
    +MagickBooleanType IsImageObject(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    IsTaintImage

    + +

    IsTaintImage() returns MagickTrue any pixel in the image has been altered since it was first constituted.

    + +

    The format of the IsTaintImage method is:

    + +
    +MagickBooleanType IsTaintImage(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    ModifyImage

    + +

    ModifyImage() ensures that there is only a single reference to the image to be modified, updating the provided image pointer to point to a clone of the original image if necessary.

    + +

    The format of the ModifyImage method is:

    + +
    +MagickBooleanType ModifyImage(Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    NewMagickImage

    + +

    NewMagickImage() creates a blank image canvas of the specified size and background color.

    + +

    The format of the NewMagickImage method is:

    + +
    +Image *NewMagickImage(const ImageInfo *image_info,const size_t width,
    +  const size_t height,const MagickPixelPacket *background)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    width
    +
    the image width.
    + +
    +
    height
    +
    the image height.
    + +
    +
    background
    +
    the image color.
    + +
    +
    +

    ReferenceImage

    + +

    ReferenceImage() increments the reference count associated with an image returning a pointer to the image.

    + +

    The format of the ReferenceImage method is:

    + +
    +Image *ReferenceImage(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    ResetImagePage

    + +

    ResetImagePage() resets the image page canvas and position.

    + +

    The format of the ResetImagePage method is:

    + +
    +MagickBooleanType ResetImagePage(Image *image,const char *page)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    page
    +
    the relative page specification.
    + +
    +
    +

    ResetImagePixels

    + +

    ResetImagePixels() reset the image pixels, that is, all the pixel components are zereod.

    + +

    The format of the SetImage method is:

    + +
    +MagickBooleanType ResetImagePixels(Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SetImageBackgroundColor

    + +

    SetImageBackgroundColor() initializes the image pixels to the image background color. The background color is defined by the background_color member of the image structure.

    + +

    The format of the SetImage method is:

    + +
    +MagickBooleanType SetImageBackgroundColor(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    SetImageChannels

    + +

    SetImageChannels() sets the number of pixels channels associated with the image.

    + +

    The format of the SetImageChannels method is:

    + +
    +MagickBooleanType SetImageChannels(Image *image,const size_t channels)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channels
    +
    The number of pixel channels.
    + +
    +
    +

    SetImageColor

    + +

    SetImageColor() set the entire image canvas to the specified color.

    + +

    The format of the SetImageColor method is:

    + +
    +MagickBooleanType SetImageColor(Image *image,
    +  const MagickPixelPacket *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    background
    +
    the image color.
    + +
    +
    +

    SetImageStorageClass

    + +

    SetImageStorageClass() sets the image class: DirectClass for true color images or PseudoClass for colormapped images.

    + +

    The format of the SetImageStorageClass method is:

    + +
    +MagickBooleanType SetImageStorageClass(Image *image,
    +  const ClassType storage_class)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    storage_class
    +
    The image class.
    + +
    +
    +

    SetImageClipMask

    + +

    SetImageClipMask() associates a clip path with the image. The clip path must be the same dimensions as the image. Set any pixel component of the clip path to TransparentOpacity to prevent that corresponding image pixel component from being updated when SyncAuthenticPixels() is applied.

    + +

    The format of the SetImageClipMask method is:

    + +
    +MagickBooleanType SetImageClipMask(Image *image,const Image *clip_mask)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    clip_mask
    +
    the image clip path.
    + +
    +
    +

    SetImageExtent

    + +

    SetImageExtent() sets the image size (i.e. columns & rows).

    + +

    The format of the SetImageExtent method is:

    + +
    +MagickBooleanType SetImageExtent(Image *image,const size_t columns,
    +  const size_t rows)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    columns
    +
    The image width in pixels.
    + +
    +
    rows
    +
    The image height in pixels.
    + +
    +
    +

    SetImageInfoBlob

    + +

    SetImageInfoBlob() sets the image info blob member.

    + +

    The format of the SetImageInfoBlob method is:

    + +
    +void SetImageInfoBlob(ImageInfo *image_info,const void *blob,
    +  const size_t length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    blob
    +
    the blob.
    + +
    +
    length
    +
    the blob length.
    + +
    +
    +

    SetImageInfoFile

    + +

    SetImageInfoFile() sets the image info file member.

    + +

    The format of the SetImageInfoFile method is:

    + +
    +void SetImageInfoFile(ImageInfo *image_info,FILE *file)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    file
    +
    the file.
    + +
    +
    +

    SetImageMask

    + +

    SetImageMask() associates a mask with the image. The mask must be the same dimensions as the image.

    + +

    The format of the SetImageMask method is:

    + +
    +MagickBooleanType SetImageMask(Image *image,const Image *mask)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    mask
    +
    the image mask.
    + +
    +
    +

    SetImageOpacity

    + +

    SetImageOpacity() sets the opacity levels of the image.

    + +

    The format of the SetImageOpacity method is:

    + +
    +MagickBooleanType SetImageOpacity(Image *image,const Quantum opacity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    opacity
    +
    the level of transparency: 0 is fully opaque and QuantumRange is fully transparent.
    + +
    +
    +

    SetImageVirtualPixelMethod

    + +

    SetImageVirtualPixelMethod() sets the "virtual pixels" method for the image and returns the previous setting. A virtual pixel is any pixel access that is outside the boundaries of the image cache.

    + +

    The format of the SetImageVirtualPixelMethod() method is:

    + +
    +VirtualPixelMethod SetImageVirtualPixelMethod(const Image *image,
    +  const VirtualPixelMethod virtual_pixel_method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    virtual_pixel_method
    +
    choose the type of virtual pixel.
    + +
    +
    +

    SmushImages

    + +

    SmushImages() takes all images from the current image pointer to the end of the image list and smushes them to each other top-to-bottom if the stack parameter is true, otherwise left-to-right.

    + +

    The current gravity setting now effects how the image is justified in the final image.

    + +

    The format of the SmushImages method is:

    + +
    +Image *SmushImages(const Image *images,const MagickBooleanType stack,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image sequence.
    + +
    +
    stack
    +
    A value other than 0 stacks the images top-to-bottom.
    + +
    +
    offset
    +
    minimum distance in pixels between images.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    StripImage

    + +

    StripImage() strips an image of all profiles and comments.

    + +

    The format of the StripImage method is:

    + +
    +MagickBooleanType StripImage(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    SyncImageSettings

    + +

    SyncImageSettings() syncs image_info options into per-image attributes.

    + +

    The format of the SyncImageSettings method is:

    + +
    +MagickBooleanType SyncImageSettings(const ImageInfo *image_info,
    +  Image *image)
    +MagickBooleanType SyncImagesSettings(const ImageInfo *image_info,
    +  Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    image
    +
    the image.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/layer.html b/ImageMagick-6.9.12-44/www/api/layer.html new file mode 100644 index 0000000..0511ceb --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/layer.html @@ -0,0 +1,472 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Dealing with Image Layers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    CoalesceImagesDisposeImagesCompareImageLayersDeconstructImagesOptimizeImageLayersOptimizeImagePlusLayersOptimizeImageTransparencyRemoveDuplicateLayersRemoveZeroDelayLayersCompositeLayersMergeImageLayers

    + +

    CoalesceImages

    + +

    CoalesceImages() composites a set of images while respecting any page offsets and disposal methods. GIF, MIFF, and MNG animation sequences typically start with an image background and each subsequent image varies in size and offset. A new image sequence is returned with all images the same size as the first images virtual canvas and composited with the next image in the sequence.

    + +

    The format of the CoalesceImages method is:

    + +
    +Image *CoalesceImages(Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image sequence.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    DisposeImages

    + +

    DisposeImages() returns the coalesced frames of a GIF animation as it would appear after the GIF dispose method of that frame has been applied. That is it returned the appearance of each frame before the next is overlaid.

    + +

    The format of the DisposeImages method is:

    + +
    +Image *DisposeImages(Image *images,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image sequence.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    CompareImageLayers

    + +

    CompareImageLayers() compares each image with the next in a sequence and returns the minimum bounding region of all the pixel differences (of the ImageLayerMethod specified) it discovers.

    + +

    Images do NOT have to be the same size, though it is best that all the images are 'coalesced' (images are all the same size, on a flattened canvas, so as to represent exactly how an specific frame should look).

    + +

    No GIF dispose methods are applied, so GIF animations must be coalesced before applying this image operator to find differences to them.

    + +

    The format of the CompareImageLayers method is:

    + +
    +Image *CompareImageLayers(const Image *images,
    +  const ImageLayerMethod method,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    method
    +
    the layers type to compare images with. Must be one of... CompareAnyLayer, CompareClearLayer, CompareOverlayLayer.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    DeconstructImages

    + +

    DeconstructImages() compares each image with the next in a sequence and returns the minimum bounding region of all differences from the first image.

    + +

    This function is deprecated in favor of the more universal CompareImageLayers() function.

    + +

    The format of the DeconstructImages method is:

    + +
    +Image *DeconstructImages(const Image *images,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    OptimizeImageLayers

    + +

    OptimizeImageLayers() compares each image the GIF disposed forms of the previous image in the sequence. From this it attempts to select the smallest cropped image to replace each frame, while preserving the results of the GIF animation.

    + +

    The format of the OptimizeImageLayers method is:

    + +
    +Image *OptimizeImageLayers(const Image *image,
    +         ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    OptimizeImagePlusLayers

    + +

    OptimizeImagePlusLayers() is exactly as OptimizeImageLayers(), but may also add or even remove extra frames in the animation, if it improves the total number of pixels in the resulting GIF animation.

    + +

    The format of the OptimizePlusImageLayers method is:

    + +
    +Image *OptimizePlusImageLayers(const Image *image,
    +         ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    OptimizeImageTransparency

    + +

    OptimizeImageTransparency() takes a frame optimized GIF animation, and compares the overlayed pixels against the disposal image resulting from all the previous frames in the animation. Any pixel that does not change the disposal image (and thus does not effect the outcome of an overlay) is made transparent.

    + +

    WARNING: This modifies the current images directly, rather than generate a new image sequence.

    + +

    The format of the OptimizeImageTransperency method is:

    + +
    +void OptimizeImageTransperency(Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image sequence
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    RemoveDuplicateLayers

    + +

    RemoveDuplicateLayers() removes any image that is exactly the same as the next image in the given image list. Image size and virtual canvas offset must also match, though not the virtual canvas size itself.

    + +

    No check is made with regards to image disposal setting, though it is the dispose setting of later image that is kept. Also any time delays are also added together. As such coalesced image animations should still produce the same result, though with duplicte frames merged into a single frame.

    + +

    The format of the RemoveDuplicateLayers method is:

    + +
    +void RemoveDuplicateLayers(Image **image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    RemoveZeroDelayLayers

    + +

    RemoveZeroDelayLayers() removes any image that as a zero delay time. Such images generally represent intermediate or partial updates in GIF animations used for file optimization. They are not ment to be displayed to users of the animation. Viewable images in an animation should have a time delay of 3 or more centi-seconds (hundredths of a second).

    + +

    However if all the frames have a zero time delay, then either the animation is as yet incomplete, or it is not a GIF animation. This a non-sensible situation, so no image will be removed and a 'Zero Time Animation' warning (exception) given.

    + +

    No warning will be given if no image was removed because all images had an appropriate non-zero time delay set.

    + +

    Due to the special requirements of GIF disposal handling, GIF animations should be coalesced first, before calling this function, though that is not a requirement.

    + +

    The format of the RemoveZeroDelayLayers method is:

    + +
    +void RemoveZeroDelayLayers(Image **image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    CompositeLayers

    + +

    CompositeLayers() compose the source image sequence over the destination image sequence, starting with the current image in both lists.

    + +

    Each layer from the two image lists are composted together until the end of one of the image lists is reached. The offset of each composition is also adjusted to match the virtual canvas offsets of each layer. As such the given offset is relative to the virtual canvas, and not the actual image.

    + +

    Composition uses given x and y offsets, as the 'origin' location of the source images virtual canvas (not the real image) allowing you to compose a list of 'layer images' into the destiantioni images. This makes it well sutiable for directly composing 'Clears Frame Animations' or 'Coaleased Animations' onto a static or other 'Coaleased Animation' destination image list. GIF disposal handling is not looked at.

    + +

    Special case:- If one of the image sequences is the last image (just a single image remaining), that image is repeatally composed with all the images in the other image list. Either the source or destination lists may be the single image, for this situation.

    + +

    In the case of a single destination image (or last image given), that image will ve cloned to match the number of images remaining in the source image list.

    + +

    This is equivelent to the "-layer Composite" Shell API operator.

    + + +

    The format of the CompositeLayers method is:

    + +
    +void CompositeLayers(Image *destination,
    +    const CompositeOperator compose, Image *source,
    +    const ssize_t x_offset, const ssize_t y_offset,
    +    ExceptionInfo *exception);
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    destination
    +
    the destination images and results
    + +
    +
    source
    +
    source image(s) for the layer composition
    + +
    +
    compose, x_offset, y_offset
    +
    arguments passed on to CompositeImages()
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    MergeImageLayers

    + +

    MergeImageLayers() composes all the image layers from the current given image onward to produce a single image of the merged layers.

    + +

    The inital canvas's size depends on the given ImageLayerMethod, and is initialized using the first images background color. The images are then compositied onto that image in sequence using the given composition that has been assigned to each individual image.

    + +

    The format of the MergeImageLayers is:

    + +
    +Image *MergeImageLayers(const Image *image,
    +  const ImageLayerMethod method,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image list to be composited together
    + +
    +
    method
    +
    the method of selecting the size of the initial canvas.
    + +
    MergeLayer: Merge all layers onto a canvas just large enough to hold all the actual images. The virtual canvas of the first image is preserved but otherwise ignored.
    + +
    FlattenLayer: Use the virtual canvas size of first image. Images which fall outside this canvas is clipped. This can be used to 'fill out' a given virtual canvas.
    + +
    MosaicLayer: Start with the virtual canvas of the first image, enlarging left and right edges to contain all images. Images with negative offsets will be clipped.
    + +
    TrimBoundsLayer: Determine the overall bounds of all the image layers just as in "MergeLayer", then adjust the canvas and offsets to be relative to those bounds, without overlaying the images.
    + +
    WARNING: a new image is not returned, the original image sequence page data is modified instead.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/list.html b/ImageMagick-6.9.12-44/www/api/list.html new file mode 100644 index 0000000..b473a76 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/list.html @@ -0,0 +1,783 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Working with Image Lists + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AppendImageToListCloneImageListCloneImagesDeleteImageFromListDeleteImagesDestroyImageListDuplicateImagesGetFirstImageInListGetImageFromListGetImageIndexInListGetImageListLengthGetLastImageInListGetNextImageInListGetPreviousImageInListImageListToArrayInsertImageInListNewImageListPrependImageToListRemoveImageFromListRemoveFirstImageFromListRemoveLastImageFromListReplaceImageInListReplaceImageInListReturnLastReverseImageListSpliceImageIntoListSplitImageList

    + +

    AppendImageToList

    + +

    AppendImageToList() appends the second image list to the end of the first list. The given image list pointer is left unchanged, unless it was empty.

    + +

    The format of the AppendImageToList method is:

    + +
    +AppendImageToList(Image *images,const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list to be appended to.
    + +
    +
    image
    +
    the appended image or image list.
    + +
    +
    +

    CloneImageList

    + +

    CloneImageList() returns a duplicate of the image list.

    + +

    The format of the CloneImageList method is:

    + +
    +Image *CloneImageList(const Image *images,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    CloneImages

    + +

    CloneImages() clones one or more images from an image sequence, using a comma separated list of image numbers or ranges.

    + +

    The numbers start at 0 for the first image in the list, while negative numbers refer to images starting counting from the end of the range. Images may be referred to multiple times to clone them multiple times. Images referred beyond the available number of images in list are ignored.

    + +

    Images referenced may be reversed, and results in a clone of those images also being made with a reversed order.

    + +

    The format of the CloneImages method is:

    + +
    +Image *CloneImages(const Image *images,const char *scenes,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image sequence.
    + +
    +
    scenes
    +
    This character string specifies which scenes to clone (e.g. 1,3-5,7-3,2).
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    DeleteImageFromList

    + +

    DeleteImageFromList() deletes an image from the list. List pointer is moved to the next image, if one is present. See RemoveImageFromList().

    + +

    The format of the DeleteImageFromList method is:

    + +
    +DeleteImageFromList(Image **images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    DeleteImages

    + +

    DeleteImages() deletes one or more images from an image sequence, using a comma separated list of image numbers or ranges.

    + +

    The numbers start at 0 for the first image, while negative numbers refer to images starting counting from the end of the range. Images may be referred to multiple times without problems. Image referred beyond the available number of images in list are ignored.

    + +

    If the referenced images are in the reverse order, that range will be completely ignored, unlike CloneImages().

    + +

    The format of the DeleteImages method is:

    + +
    +DeleteImages(Image **images,const char *scenes,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image sequence.
    + +
    +
    scenes
    +
    This character string specifies which scenes to delete (e.g. 1,3-5,-2-6,2).
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    DestroyImageList

    + +

    DestroyImageList() destroys an image list.

    + +

    The format of the DestroyImageList method is:

    + +
    +Image *DestroyImageList(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image sequence.
    + +
    +
    +

    DuplicateImages

    + +

    DuplicateImages() duplicates one or more images from an image sequence, using a count and a comma separated list of image numbers or ranges.

    + +

    The numbers start at 0 for the first image, while negative numbers refer to images starting counting from the end of the range. Images may be referred to multiple times without problems. Image referred beyond the available number of images in list are ignored.

    + +

    The format of the DuplicateImages method is:

    + +
    +Image *DuplicateImages(Image *images,const size_t number_duplicates,
    +  const char *scenes,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image sequence.
    + +
    +
    number_duplicates
    +
    duplicate the image sequence this number of times.
    + +
    +
    scenes
    +
    This character string specifies which scenes to duplicate (e.g. 1,3-5,-2-6,2).
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetFirstImageInList

    + +

    GetFirstImageInList() returns a pointer to the first image in the list.

    + +

    The format of the GetFirstImageInList method is:

    + +
    +Image *GetFirstImageInList(const Image *images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    GetImageFromList

    + +

    GetImageFromList() returns an image at the specified index from the image list. Starting with 0 as the first image in the list.

    + +

    A negative offset will return the image from the end of the list, such that an index of -1 is the last image.

    + +

    If no such image exists at the specified offset a NULL image pointer is returned. This will only happen if index is less that the negative of the list length, or larger than list length -1. EG: ( -N to N-1 )

    + +

    The format of the GetImageFromList method is:

    + +
    +Image *GetImageFromList(const Image *images,const ssize_t index)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    index
    +
    the position within the list.
    + +
    +
    +

    GetImageIndexInList

    + +

    GetImageIndexInList() returns the offset in the list of the specified image.

    + +

    The format of the GetImageIndexInList method is:

    + +
    +ssize_t GetImageIndexInList(const Image *images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    GetImageListLength

    + +

    GetImageListLength() returns the length of the list (the number of images in the list).

    + +

    The format of the GetImageListLength method is:

    + +
    +size_t GetImageListLength(const Image *images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    GetLastImageInList

    + +

    GetLastImageInList() returns a pointer to the last image in the list.

    + +

    The format of the GetLastImageInList method is:

    + +
    +Image *GetLastImageInList(const Image *images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    GetNextImageInList

    + +

    GetNextImageInList() returns the next image in the list.

    + +

    The format of the GetNextImageInList method is:

    + +
    +Image *GetNextImageInList(const Image *images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    GetPreviousImageInList

    + +

    GetPreviousImageInList() returns the previous image in the list.

    + +

    The format of the GetPreviousImageInList method is:

    + +
    +Image *GetPreviousImageInList(const Image *images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    ImageListToArray

    + +

    ImageListToArray() is a convenience method that converts an image list to a sequential array, with a NULL image pointer at the end of the array.

    + +

    The images remain part of the original image list, with the array providing an alternative means of indexing the image array.

    + +

    group = ImageListToArray(images, exception); while (i = 0; group[i] != (Image *) NULL; i++) printf("s\n", group[i]->filename); printf("d images\n", i); group = RelinquishMagickMemory(group);

    + +

    The format of the ImageListToArray method is:

    + +
    +Image **ImageListToArray(const Image *images,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image list.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    InsertImageInList

    + +

    InsertImageInList() insert the given image or image list, into the first image list, immediately AFTER the image pointed to. The given image list pointer is left unchanged unless previously empty.

    + +

    The format of the InsertImageInList method is:

    + +
    +InsertImageInList(Image **images,Image *insert)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list to insert into.
    + +
    +
    insert
    +
    the image list to insert.
    + +
    +
    +

    NewImageList

    + +

    NewImageList() creates an empty image list.

    + +

    The format of the NewImageList method is:

    + +
    +Image *NewImageList(void)
    +
    + +

    PrependImageToList

    + +

    PrependImageToList() prepends the image to the beginning of the list.

    + +

    The format of the PrependImageToList method is:

    + +
    +PrependImageToList(Image *images,Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    image
    +
    the image.
    + +
    +
    +

    RemoveImageFromList

    + +

    RemoveImageFromList() removes and returns the image pointed to.

    + +

    The given image list pointer is set to point to the next image in list if it exists, otherwise it is set to the previous image, or NULL if list was emptied.

    + +

    The format of the RemoveImageFromList method is:

    + +
    +Image *RemoveImageFromList(Image **images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    RemoveFirstImageFromList

    + +

    RemoveFirstImageFromList() removes and returns the first image in the list.

    + +

    If the given image list pointer pointed to the removed first image, it is set to the new first image of list, or NULL if list was emptied, otherwise it is left as is.

    + +

    The format of the RemoveFirstImageFromList method is:

    + +
    +Image *RemoveFirstImageFromList(Image **images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    RemoveLastImageFromList

    + +

    RemoveLastImageFromList() removes and returns the last image from the list.

    + +

    If the given image list pointer pointed to the removed last image, it is set to the new last image of list, or NULL if list was emptied, otherwise it is left as is.

    + +

    The format of the RemoveLastImageFromList method is:

    + +
    +Image *RemoveLastImageFromList(Image **images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    ReplaceImageInList

    + +

    ReplaceImageInList() replaces an image in the list with the given image, or list of images. Old image is destroyed.

    + +

    The images list pointer is set to point to the first image of the inserted list of images.

    + +

    The format of the ReplaceImageInList method is:

    + +
    +ReplaceImageInList(Image **images,Image *replace)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the list and pointer to image to replace
    + +
    +
    replace
    +
    the image or image list replacing the original
    + +
    +
    +

    ReplaceImageInListReturnLast

    + +

    ReplaceImageInListReturnLast() is exactly as ReplaceImageInList() except the images pointer is set to the last image in the list of replacement images.

    + +

    This allows you to simply use GetNextImageInList() to go to the image that follows the just replaced image, even if a list of replacement images was inserted.

    + +

    The format of the ReplaceImageInList method is:

    + +
    +ReplaceImageInListReturnLast(Image **images,Image *replace)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the list and pointer to image to replace
    + +
    +
    replace
    +
    the image or image list replacing the original
    + +
    +
    +

    ReverseImageList

    + +

    ReverseImageList() reverses the order of an image list. The list pointer is reset to that start of the re-ordered list.

    + +

    The format of the ReverseImageList method is:

    + +
    +void ReverseImageList(Image **images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +

    SpliceImageIntoList

    + +

    SpliceImageIntoList() removes 'length' images from the list and replaces them with the specified splice. Removed images are returned.

    + +

    The format of the SpliceImageIntoList method is:

    + +
    +SpliceImageIntoList(Image **images,const size_t,
    +  const Image *splice)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    length
    +
    the length of the image list to remove.
    + +
    +
    splice
    +
    Replace the removed image list with this list.
    + +
    +
    +

    SplitImageList

    + +

    SplitImageList() splits an image into two lists, after given image The list that was split off is returned, which may be empty.

    + +

    The format of the SplitImageList method is:

    + +
    +Image *SplitImageList(Image *images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image list.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/magick++-classes.html b/ImageMagick-6.9.12-44/www/api/magick++-classes.html new file mode 100644 index 0000000..bacd63d --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/magick++-classes.html @@ -0,0 +1,174 @@ + + + + + + + + + + ImageMagick - Magick++, C++ API: Classes + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +

    Magick++ Classes

    +
    +

    Magick++ provides a simple C++ API to the ImageMagick image processing library which supports reading and writing a huge number of image formats as well as supporting a broad spectrum of traditional image processing operations. The ImageMagick C API is complex and the data structures are currently not documented. Magick++ provides access to most of the features available from the C API but in a simple object-oriented and well-documented framework.

    +

    Magick++ is intended to support commercial-grade application development. In order to avoid possible conflicts with the user's application, all symbols contained in Magick++ (included by the header <Magick++.h>) are scoped to the namespace Magick. Symbols from the ImageMagick C library are imported under the MagickCore namespace to avoid possible conflicts and ImageMagick macros are only included within the Magick++ implementation so they won't impact the user's application.

    +

    The core class in Magick++ is the Image class. The Image class provides methods to manipulate a single image frame (e.g. a JPEG image). Standard Template Library (STL)compatible algorithms and function objects are provided in order to manipulate multiple image frames or to read and write file formats which support multiple image frames (e.g. GIF animations, MPEG animations, and Postscript files).

    +

    The Image class supports reference-counted memory management which supports the semantics of an intrinsic variable type (e.g. 'int') with an extremely efficient operator = and copy constructor (only a pointer is assigned) while ensuring that the image data is replicated as required so that it the image may be modified without impacting earlier generations. Since the Image class manages heap memory internally, images are best allocated via C++ automatic (stack-based) memory allocation. This support allows most programs using Magick++ to be written without using any pointers, simplifying the implementation and avoiding the risks of using pointers. When a program uses automatic memory allocation to allocate Magick++ images, that aspect of the program becomes naturally exception-safe and thread-safe.

    +

    The image class uses a number of supportive classes in order to specify arguments. Colors are specified via the Color class. Colors specified in X11-style string form are implicitly converted to the Color class. Geometry arguments (those specifying width, height, and/or x and y offset) are specified via the Geometry class. Similar to the Color class, geometries specified as an X11-style string are implicitly converted to the Geometry class. Two dimensional drawable objects are specified via the Drawable class. Drawable objects may be provided as a single object or as a list of objects to be rendered using the current image options. Montage options (a montage is a rendered grid of thumbnails in one image) are specified via the Montage class.

    +

    Errors are reported using C++ exceptions derived from the Exception class, which is itself derived from the standard C++ exception class. Exceptions are reported synchronous with the operation and are caught by the first matching try block as the stack is unraveled. This allows a clean coding style in which multiple related Magick++ commands may be executed with errors handled as a unit rather than line-by-line. Since the Image object provides reference-counted memory management, unreferenced images on the stack are automagically cleaned up, avoiding the potential for memory leaks.

    +

    For ease of access, the documentation for the available user-level classes is available via the following table.

    +
    +
      + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Magick++ User-Level Classes
      BlobBinary Large OBject container.
      CoderInfoReport information about supported image formats (use with +coderInfoList())
      ColorColor specification.
      DrawableDrawable shape (for input to 'draw').
      ExceptionC++ exception objects.
      GeometryGeometry specification.
      ImageImage frame. This is the primary object in Magick++.
      MontageMontage options for montageImages().
      PixelsLow-level access to image pixels.
      STLSTL algorithms and function objects for operating on +containers of image frames.
      TypeMetricContainer for font type metrics (use with +Image::fontTypeMetrics).
      +
    +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/www/api/magick-deprecate.html b/ImageMagick-6.9.12-44/www/api/magick-deprecate.html new file mode 100644 index 0000000..c420af6 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/magick-deprecate.html @@ -0,0 +1,1735 @@ + + + + + + + + + + ImageMagick - MagickWand, C API: Deprecated Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    +

    MagickAverageImagesClonePixelViewDestroyPixelViewDuplexTransferPixelViewIteratorGetPixelViewExceptionGetPixelViewHeightGetPixelViewIteratorGetPixelViewPixelsGetPixelViewWandGetPixelViewWidthGetPixelViewXGetPixelViewYIsPixelViewMagickClipPathImageDrawGetFillAlphaDrawGetStrokeAlphaDrawPeekGraphicWandDrawPopGraphicContextDrawPushGraphicContextDrawSetFillAlphaDrawSetStrokeAlphaMagickColorFloodfillImageMagickDescribeImageMagickFlattenImagesMagickGetImageAttributeMagickGetImageMatteMagickGetImagePixelsMagickGetImageSizeMagickMapImageMagickMatteFloodfillImageMagickMedianFilterImageMagickMinimumImagesMagickModeImageMagickMosaicImagesMagickOpaqueImageMagickPaintFloodfillImageMagickPaintOpaqueImageMagickPaintTransparentImageMagickRadialBlurImageMagickRecolorImageMagickReduceNoiseImageMagickMaximumImagesMagickSetImageAttributeMagickSetImageIndexMagickTransparentImageMagickRegionOfInterestImageMagickSetImagePixelsMagickWriteImageBlobNewPixelViewNewPixelViewRegionPixelGetNextRowPixelIteratorGetExceptionSetPixelViewIteratorTransferPixelViewIteratorUpdatePixelViewIterator

    + +

    MagickAverageImages

    + +

    MagickAverageImages() average a set of images.

    + +

    The format of the MagickAverageImages method is:

    + +
    +MagickWand *MagickAverageImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    ClonePixelView

    + +

    ClonePixelView() makes a copy of the specified pixel view.

    + +

    The format of the ClonePixelView method is:

    + +
    +PixelView *ClonePixelView(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    DestroyPixelView

    + +

    DestroyPixelView() deallocates memory associated with a pixel view.

    + +

    The format of the DestroyPixelView method is:

    + +
    +PixelView *DestroyPixelView(PixelView *pixel_view,
    +  const size_t number_wands,const size_t number_threads)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    number_wand
    +
    the number of pixel wands.
    + +
    +
    number_threads
    +
    number of threads.
    + +
    +
    +

    DuplexTransferPixelViewIterator

    + +

    DuplexTransferPixelViewIterator() iterates over three pixel views in parallel and calls your transfer method for each scanline of the view. The source and duplex pixel region is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. However, the destination pixel view is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted.

    + +

    Use this pragma:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback transfer method that must be executed by a single thread at a time.

    + +

    The format of the DuplexTransferPixelViewIterator method is:

    + +
    +MagickBooleanType DuplexTransferPixelViewIterator(PixelView *source,
    +  PixelView *duplex,PixelView *destination,
    +  DuplexTransferPixelViewMethod transfer,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source pixel view.
    + +
    +
    duplex
    +
    the duplex pixel view.
    + +
    +
    destination
    +
    the destination pixel view.
    + +
    +
    transfer
    +
    the transfer callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    GetPixelViewException

    + +

    GetPixelViewException() returns the severity, reason, and description of any error that occurs when utilizing a pixel view.

    + +

    The format of the GetPixelViewException method is:

    + +
    +char *GetPixelViewException(const PixelWand *pixel_view,
    +  ExceptionType *severity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel pixel_view.
    + +
    +
    severity
    +
    the severity of the error is returned here.
    + +
    +
    +

    GetPixelViewHeight

    + +

    GetPixelViewHeight() returns the pixel view height.

    + +

    The format of the GetPixelViewHeight method is:

    + +
    +size_t GetPixelViewHeight(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    GetPixelViewIterator

    + +

    GetPixelViewIterator() iterates over the pixel view in parallel and calls your get method for each scanline of the view. The pixel region is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. Any updates to the pixels in your callback are ignored.

    + +

    Use this pragma:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback get method that must be executed by a single thread at a time.

    + +

    The format of the GetPixelViewIterator method is:

    + +
    +MagickBooleanType GetPixelViewIterator(PixelView *source,
    +  GetPixelViewMethod get,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source pixel view.
    + +
    +
    get
    +
    the get callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    GetPixelViewPixels

    + +

    GetPixelViewPixels() returns the pixel view pixel_wands.

    + +

    The format of the GetPixelViewPixels method is:

    + +
    +PixelWand *GetPixelViewPixels(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    GetPixelViewWand

    + +

    GetPixelViewWand() returns the magick wand associated with the pixel view.

    + +

    The format of the GetPixelViewWand method is:

    + +
    +MagickWand *GetPixelViewWand(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    GetPixelViewWidth

    + +

    GetPixelViewWidth() returns the pixel view width.

    + +

    The format of the GetPixelViewWidth method is:

    + +
    +size_t GetPixelViewWidth(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    GetPixelViewX

    + +

    GetPixelViewX() returns the pixel view x offset.

    + +

    The format of the GetPixelViewX method is:

    + +
    +ssize_t GetPixelViewX(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    GetPixelViewY

    + +

    GetPixelViewY() returns the pixel view y offset.

    + +

    The format of the GetPixelViewY method is:

    + +
    +ssize_t GetPixelViewY(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    IsPixelView

    + +

    IsPixelView() returns MagickTrue if the the parameter is verified as a pixel view container.

    + +

    The format of the IsPixelView method is:

    + +
    +MagickBooleanType IsPixelView(const PixelView *pixel_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pixel_view
    +
    the pixel view.
    + +
    +
    +

    MagickClipPathImage

    + +

    MagickClipPathImage() clips along the named paths from the 8BIM profile, if present. Later operations take effect inside the path. Id may be a number if preceded with #, to work on a numbered path, e.g., "#1" to use the first path.

    + +

    The format of the MagickClipPathImage method is:

    + +
    +MagickBooleanType MagickClipPathImage(MagickWand *wand,
    +  const char *pathname,const MagickBooleanType inside)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    pathname
    +
    name of clipping path resource. If name is preceded by #, use clipping path numbered by name.
    + +
    +
    inside
    +
    if non-zero, later operations take effect inside clipping path. Otherwise later operations take effect outside clipping path.
    + +
    +
    +

    DrawGetFillAlpha

    + +

    DrawGetFillAlpha() returns the alpha used when drawing using the fill color or fill texture. Fully opaque is 1.0.

    + +

    The format of the DrawGetFillAlpha method is:

    + +
    +double DrawGetFillAlpha(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawGetStrokeAlpha

    + +

    DrawGetStrokeAlpha() returns the alpha of stroked object outlines.

    + +

    The format of the DrawGetStrokeAlpha method is:

    + +
    +double DrawGetStrokeAlpha(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    +
    +

    DrawPeekGraphicWand

    + +

    DrawPeekGraphicWand() returns the current drawing wand.

    + +

    The format of the PeekDrawingWand method is:

    + +
    +DrawInfo *DrawPeekGraphicWand(const DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPopGraphicContext

    + +

    DrawPopGraphicContext() destroys the current drawing wand and returns to the previously pushed drawing wand. Multiple drawing wands may exist. It is an error to attempt to pop more drawing wands than have been pushed, and it is proper form to pop all drawing wands which have been pushed.

    + +

    The format of the DrawPopGraphicContext method is:

    + +
    +MagickBooleanType DrawPopGraphicContext(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawPushGraphicContext

    + +

    DrawPushGraphicContext() clones the current drawing wand to create a new drawing wand. The original drawing wand(s) may be returned to by invoking PopDrawingWand(). The drawing wands are stored on a drawing wand stack. For every Pop there must have already been an equivalent Push.

    + +

    The format of the DrawPushGraphicContext method is:

    + +
    +MagickBooleanType DrawPushGraphicContext(DrawingWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    +

    DrawSetFillAlpha

    + +

    DrawSetFillAlpha() sets the alpha to use when drawing using the fill color or fill texture. Fully opaque is 1.0.

    + +

    The format of the DrawSetFillAlpha method is:

    + +
    +void DrawSetFillAlpha(DrawingWand *wand,const double fill_alpha)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    fill_alpha
    +
    fill alpha
    + +
    +
    +

    DrawSetStrokeAlpha

    + +

    DrawSetStrokeAlpha() specifies the alpha of stroked object outlines.

    + +

    The format of the DrawSetStrokeAlpha method is:

    + +
    +void DrawSetStrokeAlpha(DrawingWand *wand,const double stroke_alpha)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the drawing wand.
    + +
    +
    stroke_alpha
    +
    stroke alpha. The value 1.0 is opaque.
    + +
    +
    +

    MagickColorFloodfillImage

    + +

    MagickColorFloodfillImage() changes the color value of any pixel that matches target and is an immediate neighbor. If the method FillToBorderMethod is specified, the color value is changed for any neighbor pixel that does not match the bordercolor member of image.

    + +

    The format of the MagickColorFloodfillImage method is:

    + +
    +MagickBooleanType MagickColorFloodfillImage(MagickWand *wand,
    +  const PixelWand *fill,const double fuzz,const PixelWand *bordercolor,
    +  const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    fill
    +
    the floodfill color pixel wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    bordercolor
    +
    the border color pixel wand.
    + +
    +
    x,y
    +
    the starting location of the operation.
    + +
    +
    +

    MagickDescribeImage

    + +

    MagickDescribeImage() identifies an image by printing its attributes to the file. Attributes include the image width, height, size, and others.

    + +

    The format of the MagickDescribeImage method is:

    + +
    +const char *MagickDescribeImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickFlattenImages

    + +

    MagickFlattenImages() merges a sequence of images. This useful for combining Photoshop layers into a single image.

    + +

    The format of the MagickFlattenImages method is:

    + +
    +MagickWand *MagickFlattenImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageAttribute

    + +

    MagickGetImageAttribute() returns a value associated with the specified property. Use MagickRelinquishMemory() to free the value when you are finished with it.

    + +

    The format of the MagickGetImageAttribute method is:

    + +
    +char *MagickGetImageAttribute(MagickWand *wand,const char *property)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    property
    +
    the property.
    + +
    +
    +

    MagickGetImageMatte

    + +

    MagickGetImageMatte() returns MagickTrue if the image has a matte channel otherwise MagickFalse.

    + +

    The format of the MagickGetImageMatte method is:

    + +
    +size_t MagickGetImageMatte(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImagePixels

    + +

    MagickGetImagePixels() extracts pixel data from an image and returns it to you. The method returns MagickTrue on success otherwise MagickFalse if an error is encountered. The data is returned as char, short int, int, ssize_t, float, or double in the order specified by map.

    + +

    Suppose you want to extract the first scanline of a 640x480 image as character data in red-green-blue order:

    + +
    +MagickGetImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
    +
    + +

    The format of the MagickGetImagePixels method is:

    + +
    +MagickBooleanType MagickGetImagePixels(MagickWand *wand,
    +  const ssize_t x,const ssize_t y,const size_t columns,
    +  const size_t rows,const char *map,const StorageType storage,
    +  void *pixels)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x, y, columns, rows
    +
    These values define the perimeter of a region of pixels you want to extract.
    + +
    +
    map
    +
    This string reflects the expected ordering of the pixel array. It can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad.
    + +
    +
    storage
    +
    Define the data type of the pixels. Float and double types are expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, LongPixel, QuantumPixel, or ShortPixel.
    + +
    +
    pixels
    +
    This array of values contain the pixel components as defined by map and type. You must preallocate this array where the expected length varies depending on the values of width, height, map, and type.
    + +
    +
    +

    MagickGetImageSize

    + +

    MagickGetImageSize() returns the image length in bytes.

    + +

    The format of the MagickGetImageSize method is:

    + +
    +MagickBooleanType MagickGetImageSize(MagickWand *wand,
    +  MagickSizeType *length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    length
    +
    the image length in bytes.
    + +
    +
    +

    MagickMapImage

    + +

    MagickMapImage() replaces the colors of an image with the closest color from a reference image.

    + +

    The format of the MagickMapImage method is:

    + +
    +MagickBooleanType MagickMapImage(MagickWand *wand,
    +  const MagickWand *map_wand,const MagickBooleanType dither)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    map
    +
    the map wand.
    + +
    +
    dither
    +
    Set this integer value to something other than zero to dither the mapped image.
    + +
    +
    +

    MagickMatteFloodfillImage

    + +

    MagickMatteFloodfillImage() changes the transparency value of any pixel that matches target and is an immediate neighbor. If the method FillToBorderMethod is specified, the transparency value is changed for any neighbor pixel that does not match the bordercolor member of image.

    + +

    The format of the MagickMatteFloodfillImage method is:

    + +
    +MagickBooleanType MagickMatteFloodfillImage(MagickWand *wand,
    +  const double alpha,const double fuzz,const PixelWand *bordercolor,
    +  const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    alpha
    +
    the level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    bordercolor
    +
    the border color pixel wand.
    + +
    +
    x,y
    +
    the starting location of the operation.
    + +
    +
    +

    MagickMedianFilterImage

    + +

    MagickMedianFilterImage() applies a digital filter that improves the quality of a noisy image. Each pixel is replaced by the median in a set of neighboring pixels as defined by radius.

    + +

    The format of the MagickMedianFilterImage method is:

    + +
    +MagickBooleanType MagickMedianFilterImage(MagickWand *wand,
    +  const double radius)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the pixel neighborhood.
    + +
    +
    +

    MagickMinimumImages

    + +

    MagickMinimumImages() returns the minimum intensity of an image sequence.

    + +

    The format of the MagickMinimumImages method is:

    + +
    +MagickWand *MagickMinimumImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickModeImage

    + +

    MagickModeImage() makes each pixel the 'predominant color' of the neighborhood of the specified radius.

    + +

    The format of the MagickModeImage method is:

    + +
    +MagickBooleanType MagickModeImage(MagickWand *wand,
    +  const double radius)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the pixel neighborhood.
    + +
    +
    +

    MagickMosaicImages

    + +

    MagickMosaicImages() inlays an image sequence to form a single coherent picture. It returns a wand with each image in the sequence composited at the location defined by the page offset of the image.

    + +

    The format of the MagickMosaicImages method is:

    + +
    +MagickWand *MagickMosaicImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickOpaqueImage

    + +

    MagickOpaqueImage() changes any pixel that matches color with the color defined by fill.

    + +

    The format of the MagickOpaqueImage method is:

    + +
    +MagickBooleanType MagickOpaqueImage(MagickWand *wand,
    +  const PixelWand *target,const PixelWand *fill,const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    target
    +
    Change this target color to the fill color within the image.
    + +
    +
    fill
    +
    the fill pixel wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    +

    MagickPaintFloodfillImage

    + +

    MagickPaintFloodfillImage() changes the color value of any pixel that matches target and is an immediate neighbor. If the method FillToBorderMethod is specified, the color value is changed for any neighbor pixel that does not match the bordercolor member of image.

    + +

    The format of the MagickPaintFloodfillImage method is:

    + +
    +MagickBooleanType MagickPaintFloodfillImage(MagickWand *wand,
    +  const ChannelType channel,const PixelWand *fill,const double fuzz,
    +  const PixelWand *bordercolor,const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    fill
    +
    the floodfill color pixel wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    bordercolor
    +
    the border color pixel wand.
    + +
    +
    x,y
    +
    the starting location of the operation.
    + +
    +
    +

    MagickPaintOpaqueImage

    + +

    MagickPaintOpaqueImage() changes any pixel that matches color with the color defined by fill.

    + +

    The format of the MagickPaintOpaqueImage method is:

    + +
    +MagickBooleanType MagickPaintOpaqueImage(MagickWand *wand,
    +  const PixelWand *target,const PixelWand *fill,const double fuzz)
    +MagickBooleanType MagickPaintOpaqueImageChannel(MagickWand *wand,
    +  const ChannelType channel,const PixelWand *target,
    +  const PixelWand *fill,const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    target
    +
    Change this target color to the fill color within the image.
    + +
    +
    fill
    +
    the fill pixel wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    +

    MagickPaintTransparentImage

    + +

    MagickPaintTransparentImage() changes any pixel that matches color with the color defined by fill.

    + +

    The format of the MagickPaintTransparentImage method is:

    + +
    +MagickBooleanType MagickPaintTransparentImage(MagickWand *wand,
    +  const PixelWand *target,const double alpha,const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    target
    +
    Change this target color to specified opacity value within the image.
    + +
    +
    alpha
    +
    the level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    +

    MagickRadialBlurImage

    + +

    MagickRadialBlurImage() radial blurs an image.

    + +

    The format of the MagickRadialBlurImage method is:

    + +
    +MagickBooleanType MagickRadialBlurImage(MagickWand *wand,
    +  const double angle)
    +MagickBooleanType MagickRadialBlurImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double angle)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    angle
    +
    the angle of the blur in degrees.
    + +
    +
    +

    MagickRecolorImage

    + +

    MagickRecolorImage() apply color transformation to an image. The method permits saturation changes, hue rotation, luminance to alpha, and various other effects. Although variable-sized transformation matrices can be used, typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA (or RGBA with offsets). The matrix is similar to those used by Adobe Flash except offsets are in column 6 rather than 5 (in support of CMYKA images) and offsets are normalized (divide Flash offset by 255).

    + +

    The format of the MagickRecolorImage method is:

    + +
    +MagickBooleanType MagickRecolorImage(MagickWand *wand,
    +  const size_t order,const double *color_matrix)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    order
    +
    the number of columns and rows in the color matrix.
    + +
    +
    color_matrix
    +
    An array of doubles representing the color matrix.
    + +
    +
    +

    MagickReduceNoiseImage

    + +

    MagickReduceNoiseImage() smooths the contours of an image while still preserving edge information. The algorithm works by replacing each pixel with its neighbor closest in value. A neighbor is defined by radius. Use a radius of 0 and ReduceNoise() selects a suitable radius for you.

    + +

    The format of the MagickReduceNoiseImage method is:

    + +
    +MagickBooleanType MagickReduceNoiseImage(MagickWand *wand,
    +  const double radius)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the pixel neighborhood.
    + +
    +
    +

    MagickMaximumImages

    + +

    MagickMaximumImages() returns the maximum intensity of an image sequence.

    + +

    The format of the MagickMaximumImages method is:

    + +
    +MagickWand *MagickMaximumImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickSetImageAttribute

    + +

    MagickSetImageAttribute() associates a property with an image.

    + +

    The format of the MagickSetImageAttribute method is:

    + +
    +MagickBooleanType MagickSetImageAttribute(MagickWand *wand,
    +  const char *property,const char *value)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    property
    +
    the property.
    + +
    +
    value
    +
    the value.
    + +
    +
    +

    MagickSetImageIndex

    + +

    MagickSetImageIndex() set the current image to the position of the list specified with the index parameter.

    + +

    The format of the MagickSetImageIndex method is:

    + +
    +MagickBooleanType MagickSetImageIndex(MagickWand *wand,
    +  const ssize_t index)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    index
    +
    the scene number.
    + +
    +
    +

    MagickTransparentImage

    + +

    MagickTransparentImage() changes any pixel that matches color with the color defined by fill.

    + +

    The format of the MagickTransparentImage method is:

    + +
    +MagickBooleanType MagickTransparentImage(MagickWand *wand,
    +  const PixelWand *target,const double alpha,const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    target
    +
    Change this target color to specified opacity value within the image.
    + +
    +
    alpha
    +
    the level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    +

    MagickRegionOfInterestImage

    + +

    MagickRegionOfInterestImage() extracts a region of the image and returns it as a new wand.

    + +

    The format of the MagickRegionOfInterestImage method is:

    + +
    +MagickWand *MagickRegionOfInterestImage(MagickWand *wand,
    +  const size_t width,const size_t height,const ssize_t x,
    +  const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the region width.
    + +
    +
    height
    +
    the region height.
    + +
    +
    x
    +
    the region x offset.
    + +
    +
    y
    +
    the region y offset.
    + +
    +
    +

    MagickSetImagePixels

    + +

    MagickSetImagePixels() accepts pixel datand stores it in the image at the location you specify. The method returns MagickFalse on success otherwise MagickTrue if an error is encountered. The pixel data can be either char, short int, int, ssize_t, float, or double in the order specified by map.

    + +

    Suppose your want to upload the first scanline of a 640x480 image from character data in red-green-blue order:

    + +
    +MagickSetImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
    +
    + +

    The format of the MagickSetImagePixels method is:

    + +
    +MagickBooleanType MagickSetImagePixels(MagickWand *wand,
    +  const ssize_t x,const ssize_t y,const size_t columns,
    +  const size_t rows,const char *map,const StorageType storage,
    +  const void *pixels)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x, y, columns, rows
    +
    These values define the perimeter of a region of pixels you want to define.
    + +
    +
    map
    +
    This string reflects the expected ordering of the pixel array. It can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad.
    + +
    +
    storage
    +
    Define the data type of the pixels. Float and double types are expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from these types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel, or DoublePixel.
    + +
    +
    pixels
    +
    This array of values contain the pixel components as defined by map and type. You must preallocate this array where the expected length varies depending on the values of width, height, map, and type.
    + +
    +
    +

    MagickWriteImageBlob

    + +

    MagickWriteImageBlob() implements direct to memory image formats. It returns the image as a blob and its length. Use MagickSetFormat() to set the format of the returned blob (GIF, JPEG, PNG, etc.).

    + +

    Use MagickRelinquishMemory() to free the blob when you are done with it.

    + +

    The format of the MagickWriteImageBlob method is:

    + +
    +unsigned char *MagickWriteImageBlob(MagickWand *wand,size_t *length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    length
    +
    the length of the blob.
    + +
    +
    +

    NewPixelView

    + +

    NewPixelView() returns a pixel view required for all other methods in the Pixel View API.

    + +

    The format of the NewPixelView method is:

    + +
    +PixelView *NewPixelView(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the wand.
    + +
    +
    +

    NewPixelViewRegion

    + +

    NewPixelViewRegion() returns a pixel view required for all other methods in the Pixel View API.

    + +

    The format of the NewPixelViewRegion method is:

    + +
    +PixelView *NewPixelViewRegion(MagickWand *wand,const ssize_t x,
    +  const ssize_t y,const size_t width,const size_t height)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a region of pixel_wands view.
    + +
    +
    +

    PixelGetNextRow

    + +

    PixelGetNextRow() returns the next row as an array of pixel wands from the pixel iterator.

    + +

    The format of the PixelGetNextRow method is:

    + +
    +PixelWand **PixelGetNextRow(PixelIterator *iterator,
    +  size_t *number_wands)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    number_wands
    +
    the number of pixel wands.
    + +
    +
    +

    PixelIteratorGetException

    + +

    PixelIteratorGetException() returns the severity, reason, and description of any error that occurs when using other methods in this API.

    + +

    The format of the PixelIteratorGetException method is:

    + +
    +char *PixelIteratorGetException(const Pixeliterator *iterator,
    +  ExceptionType *severity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    severity
    +
    the severity of the error is returned here.
    + +
    +
    +

    SetPixelViewIterator

    + +

    SetPixelViewIterator() iterates over the pixel view in parallel and calls your set method for each scanline of the view. The pixel region is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension. The pixels are initiallly undefined and any settings you make in the callback method are automagically synced back to your image.

    + +

    Use this pragma:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback set method that must be executed by a single thread at a time.

    + +

    The format of the SetPixelViewIterator method is:

    + +
    +MagickBooleanType SetPixelViewIterator(PixelView *destination,
    +  SetPixelViewMethod set,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    destination
    +
    the pixel view.
    + +
    +
    set
    +
    the set callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    TransferPixelViewIterator

    + +

    TransferPixelViewIterator() iterates over two pixel views in parallel and calls your transfer method for each scanline of the view. The source pixel region is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. However, the destination pixel view is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted.

    + +

    Use this pragma:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback transfer method that must be executed by a single thread at a time.

    + +

    The format of the TransferPixelViewIterator method is:

    + +
    +MagickBooleanType TransferPixelViewIterator(PixelView *source,
    +  PixelView *destination,TransferPixelViewMethod transfer,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source pixel view.
    + +
    +
    destination
    +
    the destination pixel view.
    + +
    +
    transfer
    +
    the transfer callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    UpdatePixelViewIterator

    + +

    UpdatePixelViewIterator() iterates over the pixel view in parallel and calls your update method for each scanline of the view. The pixel region is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted. Updates to pixels in your callback are automagically synced back to the image.

    + +

    Use this pragma:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback update method that must be executed by a single thread at a time.

    + +

    The format of the UpdatePixelViewIterator method is:

    + +
    +MagickBooleanType UpdatePixelViewIterator(PixelView *source,
    +  UpdatePixelViewMethod update,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source pixel view.
    + +
    +
    update
    +
    the update callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/www/api/magick-image.html b/ImageMagick-6.9.12-44/www/api/magick-image.html new file mode 100644 index 0000000..9039bfe --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/magick-image.html @@ -0,0 +1,8207 @@ + + + + + + + + + + ImageMagick (legacy) – MagickWand, C API: Image Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    GetImageFromMagickWandMagickAdaptiveBlurImageMagickAdaptiveResizeImageMagickAdaptiveSharpenImageMagickAdaptiveThresholdImageMagickAddImageMagickAddNoiseImageMagickAffineTransformImageMagickAnnotateImageMagickAnimateImagesMagickAppendImagesMagickAutoGammaImageMagickAutoLevelImageMagickAutoOrientImageMagickBlackThresholdImageMagickBlueShiftImageMagickBlurImageMagickBorderImageUse MagickBrightnessContrastImageMagickCharcoalImageMagickChopImageMagickClampImageMagickClipImageMagickClipImagePathMagickClutImageMagickCoalesceImagesMagickColorDecisionListImageMagickColorizeImageMagickColorMatrixImageMagickCombineImagesMagickCommentImageMagickCompareImageChannelsMagickCompareImageLayersMagickCompareImagesMagickCompositeImageMagickCompositeImageGravityMagickCompositeLayersMagickContrastImageMagickContrastStretchImageMagickConvolveImageMagickCropImageMagickCycleColormapImageMagickConstituteImageMagickDecipherImageMagickDeconstructImagesMagickDeskewImageMagickDespeckleImageMagickDestroyImageMagickDisplayImageMagickDisplayImagesMagickDistortImageMagickDrawImageMagickEdgeImageMagickEmbossImageMagickEncipherImageMagickEnhanceImageMagickEqualizeImageMagickEvaluateImageMagickExportImagePixelsMagickExtentImageMagickFilterImageMagickFlipImageMagickFloodfillPaintImageMagickFlopImageMagickForwardFourierTransformImageMagickFrameImageMagickFunctionImageMagickFxImageMagickGammaImageMagickGaussianBlurImageMagickGetImageMagickGetImageAlphaChannelMagickGetImageClipMaskMagickGetImageBackgroundColorMagickGetImageBlobMagickGetImagesBlobMagickGetImageBluePrimaryMagickGetImageBorderColorMagickGetImageChannelDepthMagickGetImageChannelDistortionMagickGetImageChannelDistortionsMagickGetImageChannelFeaturesMagickGetImageChannelKurtosisMagickGetImageChannelMeanMagickGetImageChannelRangeMagickGetImageChannelStatisticsMagickGetImageColormapColorMagickGetImageColorsMagickGetImageColorspaceMagickGetImageComposeMagickGetImageCompressionMagickGetImageCompressionQualityMagickGetImageDelayMagickGetImageDepthMagickGetImageDistortionMagickGetImageDisposeMagickGetImageEndianMagickGetImageFilenameMagickGetImageFormatMagickGetImageFuzzMagickGetImageGammaMagickGetImageGravityMagickGetImageGreenPrimaryMagickGetImageHeightMagickGetImageHistogramMagickGetImageInterlaceSchemeMagickGetImageInterpolateMethodMagickGetImageIterationsMagickGetImageLengthMagickGetImageMatteColorMagickGetImageOrientationMagickGetImagePageMagickGetImagePixelColorMagickGetImageRedPrimaryMagickGetImageRegionMagickGetImageRenderingIntentMagickGetImageResolutionMagickGetImageSceneMagickGetImageSignatureMagickGetImageTicksPerSecondMagickGetImageTypeMagickGetImageUnitsMagickGetImageVirtualPixelMethodMagickGetImageWhitePointMagickGetImageWidthMagickGetNumberImagesMagickGetImageTotalInkDensityMagickHaldClutImageMagickHasNextImageMagickHasPreviousImageMagickIdentifyImageMagickImplodeImageMagickImportImagePixelsMagickInverseFourierTransformImageMagickLabelImageMagickLevelImageMagickLevelImageColorsMagickLevelizeImageMagickLinearStretchImageMagickLiquidRescaleImageMagickLocalContrastImageMagickMagnifyImageMagickMergeImageLayersMagickMinifyImageMagickModulateImageMagickMontageImageMagickMorphImagesMagickMorphologyImageMagickMotionBlurImageMagickNegateImageMagickNewImageMagickNextImageMagickNormalizeImageMagickOilPaintImageMagickOpaquePaintImageMagickOptimizeImageLayersMagickOptimizeImageTransparencyMagickOrderedPosterizeImageMagickPingImageMagickPingImageBlobMagickPingImageFileMagickPolaroidImageMagickPosterizeImageMagickPreviewImagesMagickPreviousImageMagickQuantizeImageMagickQuantizeImagesMagickRaiseImageMagickRandomThresholdImageMagickReadImageMagickReadImageBlobMagickReadImageFileMagickRemapImageMagickRemoveImageMagickResampleImageMagickResetImagePageMagickResizeImageMagickRollImageMagickRotateImageMagickRotationalBlurImageMagickSampleImageMagickScaleImageMagickSegmentImageMagickSelectiveBlurImageMagickSeparateImageChannelMagickSepiaToneImageMagickSetImageMagickSetImageAlphaChannelMagickSetImageBackgroundColorMagickSetImageBiasMagickSetImageBluePrimaryMagickSetImageBorderColorMagickSetImageChannelDepthMagickSetImageClipMaskMagickSetImageColorMagickSetImageColormapColorMagickSetImageColorspaceMagickSetImageComposeMagickSetImageCompressionMagickSetImageCompressionQualityMagickSetImageDelayMagickSetImageDepthMagickSetImageDisposeMagickSetImageEndianMagickSetImageExtentMagickSetImageFilenameMagickSetImageFormatMagickSetImageFuzzMagickSetImageGammaMagickSetImageGravityMagickSetImageGreenPrimaryMagickSetImageInterlaceSchemeMagickSetImageInterpolateMethodMagickSetImageIterationsMagickSetImageMatteMagickSetImageMatteColorMagickSetImageOpacityMagickSetImageOrientationMagickSetImagePageMagickSetImagePixelColorMagickSetImageProgressMonitorMagickSetImageRedPrimaryMagickSetImageRenderingIntentMagickSetImageResolutionMagickSetImageSceneMagickSetImageTicksPerSecondMagickSetImageTypeMagickSetImageUnitsMagickSetImageVirtualPixelMethodMagickSetImageWhitePointMagickShadeImageMagickShadowImageMagickSharpenImageMagickShaveImageMagickShearImageMagickSigmoidalContrastImageMagickSimilarityImageMagickSketchImageMagickSmushImagesMagickSolarizeImageMagickSparseColorImageMagickSpliceImageMagickSpreadImageMagickStatisticImageMagickSteganoImageMagickStereoImageMagickStripImageMagickSwirlImageMagickTextureImageMagickThresholdImageMagickThumbnailImageMagickTintImageMagickTransformImageMagickTransformImageColorspaceMagickTransparentPaintImageMagickTransposeImageMagickTransverseImageMagickTrimImageMagickUniqueImageColorsMagickUnsharpMaskImageMagickVignetteImageMagickWaveImageMagickWhiteThresholdImageMagickWriteImageMagickWriteImageFileMagickWriteImagesMagickWriteImagesFile

    + +

    GetImageFromMagickWand

    + +

    GetImageFromMagickWand() returns the current image from the magick wand.

    + +

    The format of the GetImageFromMagickWand method is:

    + +
    +Image *GetImageFromMagickWand(const MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickAdaptiveBlurImage

    + +

    MagickAdaptiveBlurImage() adaptively blurs the image by blurring less intensely near image edges and more intensely far from edges. We blur the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and MagickAdaptiveBlurImage() selects a suitable radius for you.

    + +

    The format of the MagickAdaptiveBlurImage method is:

    + +
    +MagickBooleanType MagickAdaptiveBlurImage(MagickWand *wand,
    +  const double radius,const double sigma)
    +MagickBooleanType MagickAdaptiveBlurImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double radius,const double sigma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    +

    MagickAdaptiveResizeImage

    + +

    MagickAdaptiveResizeImage() adaptively resize image with data dependent triangulation.

    + +

    MagickBooleanType MagickAdaptiveResizeImage(MagickWand *wand, const size_t columns,const size_t rows)

    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    the number of columns in the scaled image.
    + +
    +
    rows
    +
    the number of rows in the scaled image.
    + +
    +
    +

    MagickAdaptiveSharpenImage

    + +

    MagickAdaptiveSharpenImage() adaptively sharpens the image by sharpening more intensely near image edges and less intensely far from edges. We sharpen the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and MagickAdaptiveSharpenImage() selects a suitable radius for you.

    + +

    The format of the MagickAdaptiveSharpenImage method is:

    + +
    +MagickBooleanType MagickAdaptiveSharpenImage(MagickWand *wand,
    +  const double radius,const double sigma)
    +MagickBooleanType MagickAdaptiveSharpenImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double radius,const double sigma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    +

    MagickAdaptiveThresholdImage

    + +

    MagickAdaptiveThresholdImage() selects an individual threshold for each pixel based on the range of intensity values in its local neighborhood. This allows for thresholding of an image whose global intensity histogram doesn't contain distinctive peaks.

    + +

    The format of the AdaptiveThresholdImage method is:

    + +
    +MagickBooleanType MagickAdaptiveThresholdImage(MagickWand *wand,
    +  const size_t width,const size_t height,const ssize_t offset)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the width of the local neighborhood.
    + +
    +
    height
    +
    the height of the local neighborhood.
    + +
    +
    offset
    +
    the mean offset.
    + +
    +
    +

    MagickAddImage

    + +

    MagickAddImage() adds a clone of the images from the second wand and inserts them into the first wand.

    + +

    Use MagickSetLastIterator(), to append new images into an existing wand, current image will be set to last image so later adds with also be appened to end of wand.

    + +

    Use MagickSetFirstIterator() to prepend new images into wand, any more images added will also be prepended before other images in the wand. However the order of a list of new images will not change.

    + +

    Otherwise the new images will be inserted just after the current image, and any later image will also be added after this current image but before the previously added images. Caution is advised when multiple image adds are inserted into the middle of the wand image list.

    + +

    The format of the MagickAddImage method is:

    + +
    +MagickBooleanType MagickAddImage(MagickWand *wand,
    +  const MagickWand *add_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    add_wand
    +
    A wand that contains the image list to be added
    + +
    +
    +

    MagickAddNoiseImage

    + +

    MagickAddNoiseImage() adds random noise to the image.

    + +

    The format of the MagickAddNoiseImage method is:

    + +
    +MagickBooleanType MagickAddNoiseImage(MagickWand *wand,
    +  const NoiseType noise_type)
    +MagickBooleanType MagickAddNoiseImageChannel(MagickWand *wand,
    +  const ChannelType channel,const NoiseType noise_type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    noise_type
    +
    The type of noise: Uniform, Gaussian, Multiplicative, Impulse, Laplacian, or Poisson.
    + +
    +
    +

    MagickAffineTransformImage

    + +

    MagickAffineTransformImage() transforms an image as dictated by the affine matrix of the drawing wand.

    + +

    The format of the MagickAffineTransformImage method is:

    + +
    +MagickBooleanType MagickAffineTransformImage(MagickWand *wand,
    +  const DrawingWand *drawing_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    drawing_wand
    +
    the draw wand.
    + +
    +
    +

    MagickAnnotateImage

    + +

    MagickAnnotateImage() annotates an image with text.

    + +

    The format of the MagickAnnotateImage method is:

    + +
    +MagickBooleanType MagickAnnotateImage(MagickWand *wand,
    +  const DrawingWand *drawing_wand,const double x,const double y,
    +  const double angle,const char *text)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    drawing_wand
    +
    the draw wand.
    + +
    +
    x
    +
    x ordinate to left of text
    + +
    +
    y
    +
    y ordinate to text baseline
    + +
    +
    angle
    +
    rotate text relative to this angle.
    + +
    +
    text
    +
    text to draw
    + +
    +
    +

    MagickAnimateImages

    + +

    MagickAnimateImages() animates an image or image sequence.

    + +

    The format of the MagickAnimateImages method is:

    + +
    +MagickBooleanType MagickAnimateImages(MagickWand *wand,
    +  const char *server_name)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    server_name
    +
    the X server name.
    + +
    +
    +

    MagickAppendImages

    + +

    MagickAppendImages() append the images in a wand from the current image onwards, creating a new wand with the single image result. This is affected by the gravity and background settings of the first image.

    + +

    Typically you would call either MagickResetIterator() or MagickSetFirstImage() before calling this function to ensure that all the images in the wand's image list will be appended together.

    + +

    The format of the MagickAppendImages method is:

    + +
    +MagickWand *MagickAppendImages(MagickWand *wand,
    +  const MagickBooleanType stack)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    stack
    +
    By default, images are stacked left-to-right. Set stack to MagickTrue to stack them top-to-bottom.
    + +
    +
    +

    MagickAutoGammaImage

    + +

    MagickAutoGammaImage() extracts the 'mean' from the image and adjust the image to try make set its gamma appropriatally.

    + +

    The format of the MagickAutoGammaImage method is:

    + +
    +MagickBooleanType MagickAutoGammaImage(MagickWand *wand)
    +MagickBooleanType MagickAutoGammaImageChannel(MagickWand *wand,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    +

    MagickAutoLevelImage

    + +

    MagickAutoLevelImage() adjusts the levels of a particular image channel by scaling the minimum and maximum values to the full quantum range.

    + +

    The format of the MagickAutoLevelImage method is:

    + +
    +MagickBooleanType MagickAutoLevelImage(MagickWand *wand)
    +MagickBooleanType MagickAutoLevelImageChannel(MagickWand *wand,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    +

    MagickAutoOrientImage

    + +

    MagickAutoOrientImage() adjusts an image so that its orientation is suitable $ for viewing (i.e. top-left orientation).

    + +

    The format of the MagickAutoOrientImage method is:

    + +
    +MagickBooleanType MagickAutoOrientImage(MagickWand *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickBlackThresholdImage

    + +

    MagickBlackThresholdImage() is like MagickThresholdImage() but forces all pixels below the threshold into black while leaving all pixels above the threshold unchanged.

    + +

    The format of the MagickBlackThresholdImage method is:

    + +
    +MagickBooleanType MagickBlackThresholdImage(MagickWand *wand,
    +  const PixelWand *threshold)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    threshold
    +
    the pixel wand.
    + +
    +
    +

    MagickBlueShiftImage

    + +

    MagickBlueShiftImage() mutes the colors of the image to simulate a scene at nighttime in the moonlight.

    + +

    The format of the MagickBlueShiftImage method is:

    + +
    +MagickBooleanType MagickBlueShiftImage(MagickWand *wand,
    +  const double factor)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    factor
    +
    the blue shift factor (default 1.5)
    + +
    +
    +

    MagickBlurImage

    + +

    MagickBlurImage() blurs an image. We convolve the image with a gaussian operator of the given radius and standard deviation (sigma). For reasonable results, the radius should be larger than sigma. Use a radius of 0 and BlurImage() selects a suitable radius for you.

    + +

    The format of the MagickBlurImage method is:

    + +
    +MagickBooleanType MagickBlurImage(MagickWand *wand,const double radius,
    +  const double sigma)
    +MagickBooleanType MagickBlurImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double radius,const double sigma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    radius
    +
    the radius of the , in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the , in pixels.
    + +
    +
    +

    MagickBorderImage

    + +

    MagickBorderImage() surrounds the image with a border of the color defined by the bordercolor pixel wand.

    + +

    The format of the MagickBorderImage method is:

    + +
    +MagickBooleanType MagickBorderImage(MagickWand *wand,
    +  const PixelWand *bordercolor,const size_t width,
    +  const size_t height)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    bordercolor
    +
    the border color pixel wand.
    + +
    +
    width
    +
    the border width.
    + +
    +
    height
    +
    the border height.
    + +
    +
    +

    Use MagickBrightnessContrastImage

    + +

    Use MagickBrightnessContrastImage() to change the brightness and/or contrast of an image. It converts the brightness and contrast parameters into slope and intercept and calls a polynomical function to apply to the image.

    + +

    The format of the MagickBrightnessContrastImage method is:

    + +
    +MagickBooleanType MagickBrightnessContrastImage(MagickWand *wand,
    +  const double brightness,const double contrast)
    +MagickBooleanType MagickBrightnessContrastImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double brightness,
    +  const double contrast)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    brightness
    +
    the brightness percent (-100 .. 100).
    + +
    +
    contrast
    +
    the contrast percent (-100 .. 100).
    + +
    +
    +

    MagickCharcoalImage

    + +

    MagickCharcoalImage() simulates a charcoal drawing.

    + +

    The format of the MagickCharcoalImage method is:

    + +
    +MagickBooleanType MagickCharcoalImage(MagickWand *wand,
    +  const double radius,const double sigma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    +

    MagickChopImage

    + +

    MagickChopImage() removes a region of an image and collapses the image to occupy the removed portion

    + +

    The format of the MagickChopImage method is:

    + +
    +MagickBooleanType MagickChopImage(MagickWand *wand,const size_t width,
    +  const size_t height,const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the region width.
    + +
    +
    height
    +
    the region height.
    + +
    +
    x
    +
    the region x offset.
    + +
    +
    y
    +
    the region y offset.
    + +
    +
    +

    MagickClampImage

    + +

    MagickClampImage() restricts the color range from 0 to the quantum depth.

    + +

    The format of the MagickClampImage method is:

    + +
    +MagickBooleanType MagickClampImage(MagickWand *wand)
    +MagickBooleanType MagickClampImageChannel(MagickWand *wand,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    +

    MagickClipImage

    + +

    MagickClipImage() clips along the first path from the 8BIM profile, if present.

    + +

    The format of the MagickClipImage method is:

    + +
    +MagickBooleanType MagickClipImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickClipImagePath

    + +

    MagickClipImagePath() clips along the named paths from the 8BIM profile, if present. Later operations take effect inside the path. Id may be a number if preceded with #, to work on a numbered path, e.g., "#1" to use the first path.

    + +

    The format of the MagickClipImagePath method is:

    + +
    +MagickBooleanType MagickClipImagePath(MagickWand *wand,
    +  const char *pathname,const MagickBooleanType inside)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    pathname
    +
    name of clipping path resource. If name is preceded by #, use clipping path numbered by name.
    + +
    +
    inside
    +
    if non-zero, later operations take effect inside clipping path. Otherwise later operations take effect outside clipping path.
    + +
    +
    +

    MagickClutImage

    + +

    MagickClutImage() replaces colors in the image from a color lookup table.

    + +

    The format of the MagickClutImage method is:

    + +
    +MagickBooleanType MagickClutImage(MagickWand *wand,
    +  const MagickWand *clut_wand)
    +MagickBooleanType MagickClutImageChannel(MagickWand *wand,
    +  const ChannelType channel,const MagickWand *clut_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    clut_image
    +
    the clut image.
    + +
    +
    +

    MagickCoalesceImages

    + +

    MagickCoalesceImages() composites a set of images while respecting any page offsets and disposal methods. GIF, MIFF, and MNG animation sequences typically start with an image background and each subsequent image varies in size and offset. MagickCoalesceImages() returns a new sequence where each image in the sequence is the same size as the first and composited with the next image in the sequence.

    + +

    The format of the MagickCoalesceImages method is:

    + +
    +MagickWand *MagickCoalesceImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickColorDecisionListImage

    + +

    MagickColorDecisionListImage() accepts a lightweight Color Correction Collection (CCC) file which solely contains one or more color corrections and applies the color correction to the image. Here is a sample CCC file:

    + +
    +    <ColorCorrectionCollection xmlns="urn:ASC:CDL:v1.2">
    +    <ColorCorrection id="cc03345">
    +          <SOPNode>
    +               <Slope> 0.9 1.2 0.5 </Slope>
    +               <Offset> 0.4 -0.5 0.6 </Offset>
    +               <Power> 1.0 0.8 1.5 </Power>
    +          </SOPNode>
    +          <SATNode>
    +               <Saturation> 0.85 </Saturation>
    +          </SATNode>
    +    </ColorCorrection>
    +    </ColorCorrectionCollection>
    +
    + +

    which includes the offset, slope, and power for each of the RGB channels as well as the saturation.

    + +

    The format of the MagickColorDecisionListImage method is:

    + +
    +MagickBooleanType MagickColorDecisionListImage(MagickWand *wand,
    +  const char *color_correction_collection)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    color_correction_collection
    +
    the color correction collection in XML.
    + +
    +
    +

    MagickColorizeImage

    + +

    MagickColorizeImage() blends the fill color with each pixel in the image.

    + +

    The format of the MagickColorizeImage method is:

    + +
    +MagickBooleanType MagickColorizeImage(MagickWand *wand,
    +  const PixelWand *colorize,const PixelWand *opacity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    colorize
    +
    the colorize pixel wand.
    + +
    +
    opacity
    +
    the opacity pixel wand.
    + +
    +
    +

    MagickColorMatrixImage

    + +

    MagickColorMatrixImage() apply color transformation to an image. The method permits saturation changes, hue rotation, luminance to alpha, and various other effects. Although variable-sized transformation matrices can be used, typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA (or RGBA with offsets). The matrix is similar to those used by Adobe Flash except offsets are in column 6 rather than 5 (in support of CMYKA images) and offsets are normalized (divide Flash offset by 255).

    + +

    The format of the MagickColorMatrixImage method is:

    + +
    +MagickBooleanType MagickColorMatrixImage(MagickWand *wand,
    +  const KernelInfo *color_matrix)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    color_matrix
    +
    the color matrix.
    + +
    +
    +

    MagickCombineImages

    + +

    MagickCombineImages() combines one or more images into a single image. The grayscale value of the pixels of each image in the sequence is assigned in order to the specified hannels of the combined image. The typical ordering would be image 1 => Red, 2 => Green, 3 => Blue, etc.

    + +

    The format of the MagickCombineImages method is:

    + +
    +MagickWand *MagickCombineImages(MagickWand *wand,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    +

    MagickCommentImage

    + +

    MagickCommentImage() adds a comment to your image.

    + +

    The format of the MagickCommentImage method is:

    + +
    +MagickBooleanType MagickCommentImage(MagickWand *wand,
    +  const char *comment)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    comment
    +
    the image comment.
    + +
    +
    +

    MagickCompareImageChannels

    + +

    MagickCompareImageChannels() compares one or more image channels of an image to a reconstructed image and returns the difference image.

    + +

    The format of the MagickCompareImageChannels method is:

    + +
    +MagickWand *MagickCompareImageChannels(MagickWand *wand,
    +  const MagickWand *reference,const ChannelType channel,
    +  const MetricType metric,double *distortion)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    reference
    +
    the reference wand.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    metric
    +
    the metric.
    + +
    +
    distortion
    +
    the computed distortion between the images.
    + +
    +
    +

    MagickCompareImageLayers

    + +

    MagickCompareImageLayers() compares each image with the next in a sequence and returns the maximum bounding region of any pixel differences it discovers.

    + +

    The format of the MagickCompareImageLayers method is:

    + +
    +MagickWand *MagickCompareImageLayers(MagickWand *wand,
    +  const ImageLayerMethod method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    method
    +
    the compare method.
    + +
    +
    +

    MagickCompareImages

    + +

    MagickCompareImages() compares an image to a reconstructed image and returns the specified difference image.

    + +

    The format of the MagickCompareImages method is:

    + +
    +MagickWand *MagickCompareImages(MagickWand *wand,
    +  const MagickWand *reference,const MetricType metric,double *distortion)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    reference
    +
    the reference wand.
    + +
    +
    metric
    +
    the metric.
    + +
    +
    distortion
    +
    the computed distortion between the images.
    + +
    +
    +

    MagickCompositeImage

    + +

    MagickCompositeImage() composite one image onto another at the specified offset.

    + +

    The format of the MagickCompositeImage method is:

    + +
    +MagickBooleanType MagickCompositeImage(MagickWand *wand,
    +  const MagickWand *source_wand,const CompositeOperator compose,
    +  const ssize_t x,const ssize_t y)
    +MagickBooleanType MagickCompositeImageChannel(MagickWand *wand,
    +  const ChannelType channel,const MagickWand *composite_wand,
    +  const CompositeOperator compose,const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand holding the destination images
    + +
    +
    source_image
    +
    the magick wand holding source image.
    + +
    +
    compose
    +
    This operator affects how the composite is applied to the image. The default is Over. These are some of the compose methods availble.
    + +
    OverCompositeOp InCompositeOp OutCompositeOp AtopCompositeOp XorCompositeOp PlusCompositeOp MinusCompositeOp AddCompositeOp SubtractCompositeOp DifferenceCompositeOp BumpmapCompositeOp CopyCompositeOp DisplaceCompositeOp
    + +
    +
    x
    +
    the column offset of the composited image.
    + +
    +
    y
    +
    the row offset of the composited image.
    + +
    +
    +

    MagickCompositeImageGravity

    + +

    MagickCompositeImageGravity() composite one image onto another using the specified gravity.

    + +

    The format of the MagickCompositeImageGravity method is:

    + +
    +MagickBooleanType MagickCompositeImageGravity(MagickWand *wand,
    +  const MagickWand *source_wand,const CompositeOperator compose,
    +  const GravityType gravity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand holding the destination images
    + +
    +
    source_image
    +
    the magick wand holding source image.
    + +
    +
    compose
    +
    This operator affects how the composite is applied to the image. The default is Over. These are some of the compose methods availble.
    + +
    OverCompositeOp InCompositeOp OutCompositeOp AtopCompositeOp XorCompositeOp PlusCompositeOp MinusCompositeOp AddCompositeOp SubtractCompositeOp DifferenceCompositeOp BumpmapCompositeOp CopyCompositeOp DisplaceCompositeOp
    + +
    +
    gravity
    +
    positioning gravity (NorthWestGravity, NorthGravity, NorthEastGravity, WestGravity, CenterGravity, EastGravity, SouthWestGravity, SouthGravity, SouthEastGravity)
    + +
    +
    +

    MagickCompositeLayers

    + +

    MagickCompositeLayers() composite the images in the source wand over the images in the destination wand in sequence, starting with the current image in both lists.

    + +

    Each layer from the two image lists are composted together until the end of one of the image lists is reached. The offset of each composition is also adjusted to match the virtual canvas offsets of each layer. As such the given offset is relative to the virtual canvas, and not the actual image.

    + +

    Composition uses given x and y offsets, as the 'origin' location of the source images virtual canvas (not the real image) allowing you to compose a list of 'layer images' into the destiantioni images. This makes it well sutiable for directly composing 'Clears Frame Animations' or 'Coaleased Animations' onto a static or other 'Coaleased Animation' destination image list. GIF disposal handling is not looked at.

    + +

    Special case:- If one of the image sequences is the last image (just a single image remaining), that image is repeatally composed with all the images in the other image list. Either the source or destination lists may be the single image, for this situation.

    + +

    In the case of a single destination image (or last image given), that image will ve cloned to match the number of images remaining in the source image list.

    + +

    This is equivelent to the "-layer Composite" Shell API operator.

    + +

    The format of the MagickCompositeLayers method is:

    + +
    +MagickBooleanType MagickCompositeLayers(MagickWand *wand,
    +  const MagickWand *source_wand, const CompositeOperator compose,
    +  const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand holding destaintion images
    + +
    +
    source_wand
    +
    the wand holding the source images
    + +
    +
    compose, x, y
    +
    composition arguments
    + +
    +
    +

    MagickContrastImage

    + +

    MagickContrastImage() enhances the intensity differences between the lighter and darker elements of the image. Set sharpen to a value other than 0 to increase the image contrast otherwise the contrast is reduced.

    + +

    The format of the MagickContrastImage method is:

    + +
    +MagickBooleanType MagickContrastImage(MagickWand *wand,
    +  const MagickBooleanType sharpen)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    sharpen
    +
    Increase or decrease image contrast.
    + +
    + +
    +
    +

    MagickContrastStretchImage

    + +

    MagickContrastStretchImage() enhances the contrast of a color image by adjusting the pixels color to span the entire range of colors available. You can also reduce the influence of a particular channel with a gamma value of 0.

    + +

    The format of the MagickContrastStretchImage method is:

    + +
    +MagickBooleanType MagickContrastStretchImage(MagickWand *wand,
    +  const double black_point,const double white_point)
    +MagickBooleanType MagickContrastStretchImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double black_point,
    +  const double white_point)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    black_point
    +
    the black point.
    + +
    +
    white_point
    +
    the white point.
    + +
    +
    +

    MagickConvolveImage

    + +

    MagickConvolveImage() applies a custom convolution kernel to the image.

    + +

    The format of the MagickConvolveImage method is:

    + +
    +MagickBooleanType MagickConvolveImage(MagickWand *wand,
    +  const size_t order,const double *kernel)
    +MagickBooleanType MagickConvolveImageChannel(MagickWand *wand,
    +  const ChannelType channel,const size_t order,
    +  const double *kernel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    order
    +
    the number of columns and rows in the filter kernel.
    + +
    +
    kernel
    +
    An array of doubles representing the convolution kernel.
    + +
    +
    +

    MagickCropImage

    + +

    MagickCropImage() extracts a region of the image.

    + +

    The format of the MagickCropImage method is:

    + +
    +MagickBooleanType MagickCropImage(MagickWand *wand,
    +  const size_t width,const size_t height,const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the region width.
    + +
    +
    height
    +
    the region height.
    + +
    +
    x
    +
    the region x-offset.
    + +
    +
    y
    +
    the region y-offset.
    + +
    +
    +

    MagickCycleColormapImage

    + +

    MagickCycleColormapImage() displaces an image's colormap by a given number of positions. If you cycle the colormap a number of times you can produce a psychodelic effect.

    + +

    The format of the MagickCycleColormapImage method is:

    + +
    +MagickBooleanType MagickCycleColormapImage(MagickWand *wand,
    +  const ssize_t displace)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    pixel_wand
    +
    the pixel wand.
    + +
    +
    +

    MagickConstituteImage

    + +

    MagickConstituteImage() adds an image to the wand comprised of the pixel data you supply. The pixel data must be in scanline order top-to-bottom. The data can be char, short int, int, float, or double. Float and double require the pixels to be normalized [0..1], otherwise [0..Max], where Max is the maximum value the type can accomodate (e.g. 255 for char). For example, to create a 640x480 image from unsigned red-green-blue character data, use

    + +

    MagickConstituteImage(wand,640,480,"RGB",CharPixel,pixels);

    + +

    The format of the MagickConstituteImage method is:

    + +
    +MagickBooleanType MagickConstituteImage(MagickWand *wand,
    +  const size_t columns,const size_t rows,const char *map,
    +  const StorageType storage,void *pixels)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    width in pixels of the image.
    + +
    +
    rows
    +
    height in pixels of the image.
    + +
    +
    map
    +
    This string reflects the expected ordering of the pixel array. It can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad.
    + +
    +
    storage
    +
    Define the data type of the pixels. Float and double types are expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, LongPixel, QuantumPixel, or ShortPixel.
    + +
    +
    pixels
    +
    This array of values contain the pixel components as defined by map and type. You must preallocate this array where the expected length varies depending on the values of width, height, map, and type.
    + +
    +
    +

    MagickDecipherImage

    + +

    MagickDecipherImage() converts cipher pixels to plain pixels.

    + +

    The format of the MagickDecipherImage method is:

    + +
    +MagickBooleanType MagickDecipherImage(MagickWand *wand,
    +  const char *passphrase)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    passphrase
    +
    the passphrase.
    + +
    +
    +

    MagickDeconstructImages

    + +

    MagickDeconstructImages() compares each image with the next in a sequence and returns the maximum bounding region of any pixel differences it discovers.

    + +

    The format of the MagickDeconstructImages method is:

    + +
    +MagickWand *MagickDeconstructImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickDeskewImage

    + +

    MagickDeskewImage() removes skew from the image. Skew is an artifact that occurs in scanned images because of the camera being misaligned, imperfections in the scanning or surface, or simply because the paper was not placed completely flat when scanned.

    + +

    The format of the MagickDeskewImage method is:

    + +
    +MagickBooleanType MagickDeskewImage(MagickWand *wand,
    +  const double threshold)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    threshold
    +
    separate background from foreground.
    + +
    +
    +

    MagickDespeckleImage

    + +

    MagickDespeckleImage() reduces the speckle noise in an image while perserving the edges of the original image.

    + +

    The format of the MagickDespeckleImage method is:

    + +
    +MagickBooleanType MagickDespeckleImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickDestroyImage

    + +

    MagickDestroyImage() dereferences an image, deallocating memory associated with the image if the reference count becomes zero.

    + +

    The format of the MagickDestroyImage method is:

    + +
    +Image *MagickDestroyImage(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    MagickDisplayImage

    + +

    MagickDisplayImage() displays an image.

    + +

    The format of the MagickDisplayImage method is:

    + +
    +MagickBooleanType MagickDisplayImage(MagickWand *wand,
    +  const char *server_name)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    server_name
    +
    the X server name.
    + +
    +
    +

    MagickDisplayImages

    + +

    MagickDisplayImages() displays an image or image sequence.

    + +

    The format of the MagickDisplayImages method is:

    + +
    +MagickBooleanType MagickDisplayImages(MagickWand *wand,
    +  const char *server_name)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    server_name
    +
    the X server name.
    + +
    +
    +

    MagickDistortImage

    + +

    MagickDistortImage() distorts an image using various distortion methods, by mapping color lookups of the source image to a new destination image usally of the same size as the source image, unless 'bestfit' is set to true.

    + +

    If 'bestfit' is enabled, and distortion allows it, the destination image is adjusted to ensure the whole source 'image' will just fit within the final destination image, which will be sized and offset accordingly. Also in many cases the virtual offset of the source image will be taken into account in the mapping.

    + +

    The format of the MagickDistortImage method is:

    + +
    +MagickBooleanType MagickDistortImage(MagickWand *wand,
    +  const DistortImageMethod method,const size_t number_arguments,
    +  const double *arguments,const MagickBooleanType bestfit)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image to be distorted.
    + +
    +
    method
    +
    the method of image distortion.
    + +
    ArcDistortion always ignores the source image offset, and always 'bestfit' the destination image with the top left corner offset relative to the polar mapping center.
    + +
    Bilinear has no simple inverse mapping so it does not allow 'bestfit' style of image distortion.
    + +
    Affine, Perspective, and Bilinear, do least squares fitting of the distortion when more than the minimum number of control point pairs are provided.
    + +
    Perspective, and Bilinear, falls back to a Affine distortion when less that 4 control point pairs are provided. While Affine distortions let you use any number of control point pairs, that is Zero pairs is a no-Op (viewport only) distrotion, one pair is a translation and two pairs of control points do a scale-rotate-translate, without any shearing.
    + +
    +
    number_arguments
    +
    the number of arguments given for this distortion method.
    + +
    +
    arguments
    +
    the arguments for this distortion method.
    + +
    +
    bestfit
    +
    Attempt to resize destination to fit distorted source.
    + +
    +
    +

    MagickDrawImage

    + +

    MagickDrawImage() renders the drawing wand on the current image.

    + +

    The format of the MagickDrawImage method is:

    + +
    +MagickBooleanType MagickDrawImage(MagickWand *wand,
    +  const DrawingWand *drawing_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    drawing_wand
    +
    the draw wand.
    + +
    +
    +

    MagickEdgeImage

    + +

    MagickEdgeImage() enhance edges within the image with a convolution filter of the given radius. Use a radius of 0 and Edge() selects a suitable radius for you.

    + +

    The format of the MagickEdgeImage method is:

    + +
    +MagickBooleanType MagickEdgeImage(MagickWand *wand,const double radius)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the pixel neighborhood.
    + +
    +
    +

    MagickEmbossImage

    + +

    MagickEmbossImage() returns a grayscale image with a three-dimensional effect. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and Emboss() selects a suitable radius for you.

    + +

    The format of the MagickEmbossImage method is:

    + +
    +MagickBooleanType MagickEmbossImage(MagickWand *wand,const double radius,
    +  const double sigma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    +

    MagickEncipherImage

    + +

    MagickEncipherImage() converts plaint pixels to cipher pixels.

    + +

    The format of the MagickEncipherImage method is:

    + +
    +MagickBooleanType MagickEncipherImage(MagickWand *wand,
    +  const char *passphrase)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    passphrase
    +
    the passphrase.
    + +
    +
    +

    MagickEnhanceImage

    + +

    MagickEnhanceImage() applies a digital filter that improves the quality of a noisy image.

    + +

    The format of the MagickEnhanceImage method is:

    + +
    +MagickBooleanType MagickEnhanceImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickEqualizeImage

    + +

    MagickEqualizeImage() equalizes the image histogram.

    + +

    The format of the MagickEqualizeImage method is:

    + +
    +MagickBooleanType MagickEqualizeImage(MagickWand *wand)
    +MagickBooleanType MagickEqualizeImageChannel(MagickWand *wand,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    +

    MagickEvaluateImage

    + +

    MagickEvaluateImage() applys an arithmetic, relational, or logical expression to an image. Use these operators to lighten or darken an image, to increase or decrease contrast in an image, or to produce the "negative" of an image.

    + +

    The format of the MagickEvaluateImage method is:

    + +
    +MagickBooleanType MagickEvaluateImage(MagickWand *wand,
    +  const MagickEvaluateOperator operator,const double value)
    +MagickBooleanType MagickEvaluateImages(MagickWand *wand,
    +  const MagickEvaluateOperator operator)
    +MagickBooleanType MagickEvaluateImageChannel(MagickWand *wand,
    +  const ChannelType channel,const MagickEvaluateOperator op,
    +  const double value)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    op
    +
    A channel operator.
    + +
    +
    value
    +
    A value value.
    + +
    +
    +

    MagickExportImagePixels

    + +

    MagickExportImagePixels() extracts pixel data from an image and returns it to you. The method returns MagickTrue on success otherwise MagickFalse if an error is encountered. The data is returned as char, short int, int, ssize_t, float, or double in the order specified by map.

    + +

    Suppose you want to extract the first scanline of a 640x480 image as character data in red-green-blue order:

    + +
    +MagickExportImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
    +
    + +

    The format of the MagickExportImagePixels method is:

    + +
    +MagickBooleanType MagickExportImagePixels(MagickWand *wand,
    +  const ssize_t x,const ssize_t y,const size_t columns,
    +  const size_t rows,const char *map,const StorageType storage,
    +  void *pixels)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x, y, columns, rows
    +
    These values define the perimeter of a region of pixels you want to extract.
    + +
    +
    map
    +
    This string reflects the expected ordering of the pixel array. It can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad.
    + +
    +
    storage
    +
    Define the data type of the pixels. Float and double types are expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, LongPixel, QuantumPixel, or ShortPixel.
    + +
    +
    pixels
    +
    This array of values contain the pixel components as defined by map and type. You must preallocate this array where the expected length varies depending on the values of width, height, map, and type.
    + +
    +
    +

    MagickExtentImage

    + +

    MagickExtentImage() extends the image as defined by the geometry, gravity, and wand background color. Set the (x,y) offset of the geometry to move the original wand relative to the extended wand.

    + +

    The format of the MagickExtentImage method is:

    + +
    +MagickBooleanType MagickExtentImage(MagickWand *wand,const size_t width,
    +  const size_t height,const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the region width.
    + +
    +
    height
    +
    the region height.
    + +
    +
    x
    +
    the region x offset.
    + +
    +
    y
    +
    the region y offset.
    + +
    +
    +

    MagickFilterImage

    + +

    MagickFilterImage() applies a custom convolution kernel to the image.

    + +

    The format of the MagickFilterImage method is:

    + +
    +MagickBooleanType MagickFilterImage(MagickWand *wand,
    +  const KernelInfo *kernel)
    +MagickBooleanType MagickFilterImageChannel(MagickWand *wand,
    +  const ChannelType channel,const KernelInfo *kernel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    kernel
    +
    An array of doubles representing the convolution kernel.
    + +
    +
    +

    MagickFlipImage

    + +

    MagickFlipImage() creates a vertical mirror image by reflecting the pixels around the central x-axis.

    + +

    The format of the MagickFlipImage method is:

    + +
    +MagickBooleanType MagickFlipImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickFloodfillPaintImage

    + +

    MagickFloodfillPaintImage() changes the color value of any pixel that matches target and is an immediate neighbor. If the method FillToBorderMethod is specified, the color value is changed for any neighbor pixel that does not match the bordercolor member of image.

    + +

    The format of the MagickFloodfillPaintImage method is:

    + +
    +MagickBooleanType MagickFloodfillPaintImage(MagickWand *wand,
    +  const ChannelType channel,const PixelWand *fill,const double fuzz,
    +  const PixelWand *bordercolor,const ssize_t x,const ssize_t y,
    +  const MagickBooleanType invert)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    fill
    +
    the floodfill color pixel wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    bordercolor
    +
    the border color pixel wand.
    + +
    +
    x,y
    +
    the starting location of the operation.
    + +
    +
    invert
    +
    paint any pixel that does not match the target color.
    + +
    +
    +

    MagickFlopImage

    + +

    MagickFlopImage() creates a horizontal mirror image by reflecting the pixels around the central y-axis.

    + +

    The format of the MagickFlopImage method is:

    + +
    +MagickBooleanType MagickFlopImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickForwardFourierTransformImage

    + +

    MagickForwardFourierTransformImage() implements the discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.

    + +

    The format of the MagickForwardFourierTransformImage method is:

    + +
    +MagickBooleanType MagickForwardFourierTransformImage(MagickWand *wand,
    +  const MagickBooleanType magnitude)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    magnitude
    +
    if true, return as magnitude / phase pair otherwise a real / imaginary image pair.
    + +
    +
    +

    MagickFrameImage

    + +

    MagickFrameImage() adds a simulated three-dimensional border around the image. The width and height specify the border width of the vertical and horizontal sides of the frame. The inner and outer bevels indicate the width of the inner and outer shadows of the frame.

    + +

    The format of the MagickFrameImage method is:

    + +
    +MagickBooleanType MagickFrameImage(MagickWand *wand,
    +  const PixelWand *matte_color,const size_t width,
    +  const size_t height,const ssize_t inner_bevel,
    +  const ssize_t outer_bevel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    matte_color
    +
    the frame color pixel wand.
    + +
    +
    width
    +
    the border width.
    + +
    +
    height
    +
    the border height.
    + +
    +
    inner_bevel
    +
    the inner bevel width.
    + +
    +
    outer_bevel
    +
    the outer bevel width.
    + +
    +
    +

    MagickFunctionImage

    + +

    MagickFunctionImage() applys an arithmetic, relational, or logical expression to an image. Use these operators to lighten or darken an image, to increase or decrease contrast in an image, or to produce the "negative" of an image.

    + +

    The format of the MagickFunctionImage method is:

    + +
    +MagickBooleanType MagickFunctionImage(MagickWand *wand,
    +  const MagickFunction function,const size_t number_arguments,
    +  const double *arguments)
    +MagickBooleanType MagickFunctionImageChannel(MagickWand *wand,
    +  const ChannelType channel,const MagickFunction function,
    +  const size_t number_arguments,const double *arguments)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    function
    +
    the image function.
    + +
    +
    number_arguments
    +
    the number of function arguments.
    + +
    +
    arguments
    +
    the function arguments.
    + +
    +
    +

    MagickFxImage

    + +

    MagickFxImage() evaluate expression for each pixel in the image.

    + +

    The format of the MagickFxImage method is:

    + +
    +MagickWand *MagickFxImage(MagickWand *wand,const char *expression)
    +MagickWand *MagickFxImageChannel(MagickWand *wand,
    +  const ChannelType channel,const char *expression)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    expression
    +
    the expression.
    + +
    +
    +

    MagickGammaImage

    + +

    MagickGammaImage() gamma-corrects an image. The same image viewed on different devices will have perceptual differences in the way the image's intensities are represented on the screen. Specify individual gamma levels for the red, green, and blue channels, or adjust all three with the gamma parameter. Values typically range from 0.8 to 2.3.

    + +

    You can also reduce the influence of a particular channel with a gamma value of 0.

    + +

    The format of the MagickGammaImage method is:

    + +
    +MagickBooleanType MagickGammaImage(MagickWand *wand,const double gamma)
    +MagickBooleanType MagickGammaImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double gamma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    level
    +
    Define the level of gamma correction.
    + +
    +
    +

    MagickGaussianBlurImage

    + +

    MagickGaussianBlurImage() blurs an image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, the radius should be larger than sigma. Use a radius of 0 and MagickGaussianBlurImage() selects a suitable radius for you.

    + +

    The format of the MagickGaussianBlurImage method is:

    + +
    +MagickBooleanType MagickGaussianBlurImage(MagickWand *wand,
    +  const double radius,const double sigma)
    +MagickBooleanType MagickGaussianBlurImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double radius,const double sigma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    +

    MagickGetImage

    + +

    MagickGetImage() gets the image at the current image index.

    + +

    The format of the MagickGetImage method is:

    + +
    +MagickWand *MagickGetImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageAlphaChannel

    + +

    MagickGetImageAlphaChannel() returns MagickFalse if the image alpha channel is not activated. That is, the image is RGB rather than RGBA or CMYK rather than CMYKA.

    + +

    The format of the MagickGetImageAlphaChannel method is:

    + +
    +MagickBooleanType MagickGetImageAlphaChannel(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageClipMask

    + +

    MagickGetImageClipMask() gets the image clip mask at the current image index.

    + +

    The format of the MagickGetImageClipMask method is:

    + +
    +MagickWand *MagickGetImageClipMask(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageBackgroundColor

    + +

    MagickGetImageBackgroundColor() returns the image background color.

    + +

    The format of the MagickGetImageBackgroundColor method is:

    + +
    +MagickBooleanType MagickGetImageBackgroundColor(MagickWand *wand,
    +  PixelWand *background_color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    background_color
    +
    Return the background color.
    + +
    +
    +

    MagickGetImageBlob

    + +

    MagickGetImageBlob() implements direct to memory image formats. It returns the image as a blob (a formatted "file" in memory) and its length, starting from the current position in the image sequence. Use MagickSetImageFormat() to set the format to write to the blob (GIF, JPEG, PNG, etc.).

    + +

    Utilize MagickResetIterator() to ensure the write is from the beginning of the image sequence.

    + +

    Use MagickRelinquishMemory() to free the blob when you are done with it.

    + +

    The format of the MagickGetImageBlob method is:

    + +
    +unsigned char *MagickGetImageBlob(MagickWand *wand,size_t *length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    length
    +
    the length of the blob.
    + +
    +
    +

    MagickGetImagesBlob

    + +

    MagickGetImagesBlob() implements direct to memory image formats. It returns the image sequence as a blob and its length. The format of the image determines the format of the returned blob (GIF, JPEG, PNG, etc.). To return a different image format, use MagickSetImageFormat().

    + +

    Note, some image formats do not permit multiple images to the same image stream (e.g. JPEG). in this instance, just the first image of the sequence is returned as a blob.

    + +

    The format of the MagickGetImagesBlob method is:

    + +
    +unsigned char *MagickGetImagesBlob(MagickWand *wand,size_t *length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    length
    +
    the length of the blob.
    + +
    +
    +

    MagickGetImageBluePrimary

    + +

    MagickGetImageBluePrimary() returns the chromaticy blue primary point for the image.

    + +

    The format of the MagickGetImageBluePrimary method is:

    + +
    +MagickBooleanType MagickGetImageBluePrimary(MagickWand *wand,double *x,
    +  double *y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the chromaticity blue primary x-point.
    + +
    +
    y
    +
    the chromaticity blue primary y-point.
    + +
    +
    +

    MagickGetImageBorderColor

    + +

    MagickGetImageBorderColor() returns the image border color.

    + +

    The format of the MagickGetImageBorderColor method is:

    + +
    +MagickBooleanType MagickGetImageBorderColor(MagickWand *wand,
    +  PixelWand *border_color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    border_color
    +
    Return the border color.
    + +
    +
    +

    MagickGetImageChannelDepth

    + +

    MagickGetImageChannelDepth() gets the depth for one or more image channels.

    + +

    The format of the MagickGetImageChannelDepth method is:

    + +
    +size_t MagickGetImageChannelDepth(MagickWand *wand,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    +

    MagickGetImageChannelDistortion

    + +

    MagickGetImageChannelDistortion() compares one or more image channels of an image to a reconstructed image and returns the specified distortion metric.

    + +

    The format of the MagickGetImageChannelDistortion method is:

    + +
    +MagickBooleanType MagickGetImageChannelDistortion(MagickWand *wand,
    +  const MagickWand *reference,const ChannelType channel,
    +  const MetricType metric,double *distortion)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    reference
    +
    the reference wand.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    metric
    +
    the metric.
    + +
    +
    distortion
    +
    the computed distortion between the images.
    + +
    +
    +

    MagickGetImageChannelDistortions

    + +

    MagickGetImageChannelDistortions() compares one or more image channels of an image to a reconstructed image and returns the specified distortion metrics.

    + +

    Use MagickRelinquishMemory() to free the metrics when you are done with them.

    + +

    The format of the MagickGetImageChannelDistortion method is:

    + +
    +double *MagickGetImageChannelDistortion(MagickWand *wand,
    +  const MagickWand *reference,const MetricType metric)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    reference
    +
    the reference wand.
    + +
    +
    metric
    +
    the metric.
    + +
    +
    +

    MagickGetImageChannelFeatures

    + +

    MagickGetImageChannelFeatures() returns features for each channel in the image in each of four directions (horizontal, vertical, left and right diagonals) for the specified distance. The features include the angular second moment, contrast, correlation, sum of squares: variance, inverse difference moment, sum average, sum varience, sum entropy, entropy, difference variance, difference entropy, information measures of correlation 1, information measures of correlation 2, and maximum correlation coefficient. You can access the red channel contrast, for example, like this:

    + +
    +channel_features=MagickGetImageChannelFeatures(wand,1);
    +contrast=channel_features[RedChannel].contrast[0];
    +
    + +

    Use MagickRelinquishMemory() to free the statistics buffer.

    + +

    The format of the MagickGetImageChannelFeatures method is:

    + +
    +ChannelFeatures *MagickGetImageChannelFeatures(MagickWand *wand,
    +  const size_t distance)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    distance
    +
    the distance.
    + +
    +
    +

    MagickGetImageChannelKurtosis

    + +

    MagickGetImageChannelKurtosis() gets the kurtosis and skewness of one or more image channels.

    + +

    The format of the MagickGetImageChannelKurtosis method is:

    + +
    +MagickBooleanType MagickGetImageChannelKurtosis(MagickWand *wand,
    +  const ChannelType channel,double *kurtosis,double *skewness)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    kurtosis
    +
    The kurtosis for the specified channel(s).
    + +
    +
    skewness
    +
    The skewness for the specified channel(s).
    + +
    +
    +

    MagickGetImageChannelMean

    + +

    MagickGetImageChannelMean() gets the mean and standard deviation of one or more image channels.

    + +

    The format of the MagickGetImageChannelMean method is:

    + +
    +MagickBooleanType MagickGetImageChannelMean(MagickWand *wand,
    +  const ChannelType channel,double *mean,double *standard_deviation)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    mean
    +
    The mean pixel value for the specified channel(s).
    + +
    +
    standard_deviation
    +
    The standard deviation for the specified channel(s).
    + +
    +
    +

    MagickGetImageChannelRange

    + +

    MagickGetImageChannelRange() gets the range for one or more image channels.

    + +

    The format of the MagickGetImageChannelRange method is:

    + +
    +MagickBooleanType MagickGetImageChannelRange(MagickWand *wand,
    +  const ChannelType channel,double *minima,double *maxima)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    minima
    +
    The minimum pixel value for the specified channel(s).
    + +
    +
    maxima
    +
    The maximum pixel value for the specified channel(s).
    + +
    +
    +

    MagickGetImageChannelStatistics

    + +

    MagickGetImageChannelStatistics() returns statistics for each channel in the image. The statistics include the channel depth, its minima and maxima, the mean, the standard deviation, the kurtosis and the skewness. You can access the red channel mean, for example, like this:

    + +
    +channel_statistics=MagickGetImageChannelStatistics(wand);
    +red_mean=channel_statistics[RedChannel].mean;
    +
    + +

    Use MagickRelinquishMemory() to free the statistics buffer.

    + +

    The format of the MagickGetImageChannelStatistics method is:

    + +
    +ChannelStatistics *MagickGetImageChannelStatistics(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageColormapColor

    + +

    MagickGetImageColormapColor() returns the color of the specified colormap index.

    + +

    The format of the MagickGetImageColormapColor method is:

    + +
    +MagickBooleanType MagickGetImageColormapColor(MagickWand *wand,
    +  const size_t index,PixelWand *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    index
    +
    the offset into the image colormap.
    + +
    +
    color
    +
    Return the colormap color in this wand.
    + +
    +
    +

    MagickGetImageColors

    + +

    MagickGetImageColors() gets the number of unique colors in the image.

    + +

    The format of the MagickGetImageColors method is:

    + +
    +size_t MagickGetImageColors(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageColorspace

    + +

    MagickGetImageColorspace() gets the image colorspace.

    + +

    The format of the MagickGetImageColorspace method is:

    + +
    +ColorspaceType MagickGetImageColorspace(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageCompose

    + +

    MagickGetImageCompose() returns the composite operator associated with the image.

    + +

    The format of the MagickGetImageCompose method is:

    + +
    +CompositeOperator MagickGetImageCompose(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageCompression

    + +

    MagickGetImageCompression() gets the image compression.

    + +

    The format of the MagickGetImageCompression method is:

    + +
    +CompressionType MagickGetImageCompression(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageCompressionQuality

    + +

    MagickGetImageCompressionQuality() gets the image compression quality.

    + +

    The format of the MagickGetImageCompressionQuality method is:

    + +
    +size_t MagickGetImageCompressionQuality(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageDelay

    + +

    MagickGetImageDelay() gets the image delay.

    + +

    The format of the MagickGetImageDelay method is:

    + +
    +size_t MagickGetImageDelay(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageDepth

    + +

    MagickGetImageDepth() gets the image depth.

    + +

    The format of the MagickGetImageDepth method is:

    + +
    +size_t MagickGetImageDepth(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageDistortion

    + +

    MagickGetImageDistortion() compares an image to a reconstructed image and returns the specified distortion metric.

    + +

    The format of the MagickGetImageDistortion method is:

    + +
    +MagickBooleanType MagickGetImageDistortion(MagickWand *wand,
    +  const MagickWand *reference,const MetricType metric,
    +  double *distortion)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    reference
    +
    the reference wand.
    + +
    +
    metric
    +
    the metric.
    + +
    +
    distortion
    +
    the computed distortion between the images.
    + +
    +
    +

    MagickGetImageDispose

    + +

    MagickGetImageDispose() gets the image disposal method.

    + +

    The format of the MagickGetImageDispose method is:

    + +
    +DisposeType MagickGetImageDispose(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageEndian

    + +

    MagickGetImageEndian() gets the image endian.

    + +

    The format of the MagickGetImageEndian method is:

    + +
    +EndianType MagickGetImageEndian(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageFilename

    + +

    MagickGetImageFilename() returns the filename of a particular image in a sequence.

    + +

    The format of the MagickGetImageFilename method is:

    + +
    +char *MagickGetImageFilename(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageFormat

    + +

    MagickGetImageFormat() returns the format of a particular image in a sequence.

    + +

    The format of the MagickGetImageFormat method is:

    + +
    +char *MagickGetImageFormat(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageFuzz

    + +

    MagickGetImageFuzz() gets the image fuzz.

    + +

    The format of the MagickGetImageFuzz method is:

    + +
    +double MagickGetImageFuzz(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageGamma

    + +

    MagickGetImageGamma() gets the image gamma.

    + +

    The format of the MagickGetImageGamma method is:

    + +
    +double MagickGetImageGamma(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageGravity

    + +

    MagickGetImageGravity() gets the image gravity.

    + +

    The format of the MagickGetImageGravity method is:

    + +
    +GravityType MagickGetImageGravity(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageGreenPrimary

    + +

    MagickGetImageGreenPrimary() returns the chromaticy green primary point.

    + +

    The format of the MagickGetImageGreenPrimary method is:

    + +
    +MagickBooleanType MagickGetImageGreenPrimary(MagickWand *wand,double *x,
    +  double *y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the chromaticity green primary x-point.
    + +
    +
    y
    +
    the chromaticity green primary y-point.
    + +
    +
    +

    MagickGetImageHeight

    + +

    MagickGetImageHeight() returns the image height.

    + +

    The format of the MagickGetImageHeight method is:

    + +
    +size_t MagickGetImageHeight(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageHistogram

    + +

    MagickGetImageHistogram() returns the image histogram as an array of PixelWand wands.

    + +

    The format of the MagickGetImageHistogram method is:

    + +
    +PixelWand **MagickGetImageHistogram(MagickWand *wand,
    +  size_t *number_colors)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    number_colors
    +
    the number of unique colors in the image and the number of pixel wands returned.
    + +
    +
    +

    MagickGetImageInterlaceScheme

    + +

    MagickGetImageInterlaceScheme() gets the image interlace scheme.

    + +

    The format of the MagickGetImageInterlaceScheme method is:

    + +
    +InterlaceType MagickGetImageInterlaceScheme(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageInterpolateMethod

    + +

    MagickGetImageInterpolateMethod() returns the interpolation method for the sepcified image.

    + +

    The format of the MagickGetImageInterpolateMethod method is:

    + +
    +InterpolatePixelMethod MagickGetImageInterpolateMethod(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageIterations

    + +

    MagickGetImageIterations() gets the image iterations.

    + +

    The format of the MagickGetImageIterations method is:

    + +
    +size_t MagickGetImageIterations(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageLength

    + +

    MagickGetImageLength() returns the image length in bytes.

    + +

    The format of the MagickGetImageLength method is:

    + +
    +MagickBooleanType MagickGetImageLength(MagickWand *wand,
    +  MagickSizeType *length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    length
    +
    the image length in bytes.
    + +
    +
    +

    MagickGetImageMatteColor

    + +

    MagickGetImageMatteColor() returns the image matte color.

    + +

    The format of the MagickGetImageMatteColor method is:

    + +
    +MagickBooleanType MagickGetImagematteColor(MagickWand *wand,
    +  PixelWand *matte_color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    matte_color
    +
    Return the matte color.
    + +
    +
    +

    MagickGetImageOrientation

    + +

    MagickGetImageOrientation() returns the image orientation.

    + +

    The format of the MagickGetImageOrientation method is:

    + +
    +OrientationType MagickGetImageOrientation(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImagePage

    + +

    MagickGetImagePage() returns the page geometry associated with the image.

    + +

    The format of the MagickGetImagePage method is:

    + +
    +MagickBooleanType MagickGetImagePage(MagickWand *wand,
    +  size_t *width,size_t *height,ssize_t *x,ssize_t *y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the page width.
    + +
    +
    height
    +
    the page height.
    + +
    +
    x
    +
    the page x-offset.
    + +
    +
    y
    +
    the page y-offset.
    + +
    +
    +

    MagickGetImagePixelColor

    + +

    MagickGetImagePixelColor() returns the color of the specified pixel.

    + +

    The format of the MagickGetImagePixelColor method is:

    + +
    +MagickBooleanType MagickGetImagePixelColor(MagickWand *wand,
    +  const ssize_t x,const ssize_t y,PixelWand *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x,y
    +
    the pixel offset into the image.
    + +
    +
    color
    +
    Return the colormap color in this wand.
    + +
    +
    +

    MagickGetImageRedPrimary

    + +

    MagickGetImageRedPrimary() returns the chromaticy red primary point.

    + +

    The format of the MagickGetImageRedPrimary method is:

    + +
    +MagickBooleanType MagickGetImageRedPrimary(MagickWand *wand,double *x,
    +  double *y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the chromaticity red primary x-point.
    + +
    +
    y
    +
    the chromaticity red primary y-point.
    + +
    +
    +

    MagickGetImageRegion

    + +

    MagickGetImageRegion() extracts a region of the image and returns it as a a new wand.

    + +

    The format of the MagickGetImageRegion method is:

    + +
    +MagickWand *MagickGetImageRegion(MagickWand *wand,
    +  const size_t width,const size_t height,const ssize_t x,
    +  const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the region width.
    + +
    +
    height
    +
    the region height.
    + +
    +
    x
    +
    the region x offset.
    + +
    +
    y
    +
    the region y offset.
    + +
    +
    +

    MagickGetImageRenderingIntent

    + +

    MagickGetImageRenderingIntent() gets the image rendering intent.

    + +

    The format of the MagickGetImageRenderingIntent method is:

    + +
    +RenderingIntent MagickGetImageRenderingIntent(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageResolution

    + +

    MagickGetImageResolution() gets the image X and Y resolution.

    + +

    The format of the MagickGetImageResolution method is:

    + +
    +MagickBooleanType MagickGetImageResolution(MagickWand *wand,double *x,
    +  double *y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the image x-resolution.
    + +
    +
    y
    +
    the image y-resolution.
    + +
    +
    +

    MagickGetImageScene

    + +

    MagickGetImageScene() gets the image scene.

    + +

    The format of the MagickGetImageScene method is:

    + +
    +size_t MagickGetImageScene(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageSignature

    + +

    MagickGetImageSignature() generates an SHA-256 message digest for the image pixel stream.

    + +

    The format of the MagickGetImageSignature method is:

    + +
    +char *MagickGetImageSignature(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageTicksPerSecond

    + +

    MagickGetImageTicksPerSecond() gets the image ticks-per-second.

    + +

    The format of the MagickGetImageTicksPerSecond method is:

    + +
    +size_t MagickGetImageTicksPerSecond(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageType

    + +

    MagickGetImageType() gets the potential image type:

    + +

    Bilevel Grayscale GrayscaleMatte Palette PaletteMatte TrueColor TrueColorMatte ColorSeparation ColorSeparationMatte

    + +

    To ensure the image type matches its potential, use MagickSetImageType():

    + +
    +    (void) MagickSetImageType(wand,MagickGetImageType(wand));
    +
    + +

    The format of the MagickGetImageType method is:

    + +
    +ImageType MagickGetImageType(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageUnits

    + +

    MagickGetImageUnits() gets the image units of resolution.

    + +

    The format of the MagickGetImageUnits method is:

    + +
    +ResolutionType MagickGetImageUnits(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageVirtualPixelMethod

    + +

    MagickGetImageVirtualPixelMethod() returns the virtual pixel method for the sepcified image.

    + +

    The format of the MagickGetImageVirtualPixelMethod method is:

    + +
    +VirtualPixelMethod MagickGetImageVirtualPixelMethod(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageWhitePoint

    + +

    MagickGetImageWhitePoint() returns the chromaticy white point.

    + +

    The format of the MagickGetImageWhitePoint method is:

    + +
    +MagickBooleanType MagickGetImageWhitePoint(MagickWand *wand,double *x,
    +  double *y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the chromaticity white x-point.
    + +
    +
    y
    +
    the chromaticity white y-point.
    + +
    +
    +

    MagickGetImageWidth

    + +

    MagickGetImageWidth() returns the image width.

    + +

    The format of the MagickGetImageWidth method is:

    + +
    +size_t MagickGetImageWidth(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetNumberImages

    + +

    MagickGetNumberImages() returns the number of images associated with a magick wand.

    + +

    The format of the MagickGetNumberImages method is:

    + +
    +size_t MagickGetNumberImages(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetImageTotalInkDensity

    + +

    MagickGetImageTotalInkDensity() gets the image total ink density.

    + +

    The format of the MagickGetImageTotalInkDensity method is:

    + +
    +double MagickGetImageTotalInkDensity(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickHaldClutImage

    + +

    MagickHaldClutImage() replaces colors in the image from a Hald color lookup table. A Hald color lookup table is a 3-dimensional color cube mapped to 2 dimensions. Create it with the HALD coder. You can apply any color transformation to the Hald image and then use this method to apply the transform to the image.

    + +

    The format of the MagickHaldClutImage method is:

    + +
    +MagickBooleanType MagickHaldClutImage(MagickWand *wand,
    +  const MagickWand *hald_wand)
    +MagickBooleanType MagickHaldClutImageChannel(MagickWand *wand,
    +  const ChannelType channel,const MagickWand *hald_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    hald_image
    +
    the hald CLUT image.
    + +
    +
    +

    MagickHasNextImage

    + +

    MagickHasNextImage() returns MagickTrue if the wand has more images when traversing the list in the forward direction

    + +

    The format of the MagickHasNextImage method is:

    + +
    +MagickBooleanType MagickHasNextImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickHasPreviousImage

    + +

    MagickHasPreviousImage() returns MagickTrue if the wand has more images when traversing the list in the reverse direction

    + +

    The format of the MagickHasPreviousImage method is:

    + +
    +MagickBooleanType MagickHasPreviousImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickIdentifyImage

    + +

    MagickIdentifyImage() identifies an image by printing its attributes to the file. Attributes include the image width, height, size, and others.

    + +

    The format of the MagickIdentifyImage method is:

    + +
    +const char *MagickIdentifyImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickImplodeImage

    + +

    MagickImplodeImage() creates a new image that is a copy of an existing one with the image pixels "implode" by the specified percentage. It allocates the memory necessary for the new Image structure and returns a pointer to the new image.

    + +

    The format of the MagickImplodeImage method is:

    + +
    +MagickBooleanType MagickImplodeImage(MagickWand *wand,
    +  const double radius)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    amount
    +
    Define the extent of the implosion.
    + +
    +
    +

    MagickImportImagePixels

    + +

    MagickImportImagePixels() accepts pixel datand stores it in the image at the location you specify. The method returns MagickTrue on success otherwise MagickFalse if an error is encountered. The pixel data can be either char, short int, int, ssize_t, float, or double in the order specified by map.

    + +

    Suppose your want to upload the first scanline of a 640x480 image from character data in red-green-blue order:

    + +
    +MagickImportImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
    +
    + +

    The format of the MagickImportImagePixels method is:

    + +
    +MagickBooleanType MagickImportImagePixels(MagickWand *wand,
    +  const ssize_t x,const ssize_t y,const size_t columns,
    +  const size_t rows,const char *map,const StorageType storage,
    +  const void *pixels)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x, y, columns, rows
    +
    These values define the perimeter of a region of pixels you want to define.
    + +
    +
    map
    +
    This string reflects the expected ordering of the pixel array. It can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad.
    + +
    +
    storage
    +
    Define the data type of the pixels. Float and double types are expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from these types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel, or DoublePixel.
    + +
    +
    pixels
    +
    This array of values contain the pixel components as defined by map and type. You must preallocate this array where the expected length varies depending on the values of width, height, map, and type.
    + +
    +
    +

    MagickInverseFourierTransformImage

    + +

    MagickInverseFourierTransformImage() implements the inverse discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.

    + +

    The format of the MagickInverseFourierTransformImage method is:

    + +
    +MagickBooleanType MagickInverseFourierTransformImage(
    +  MagickWand *magnitude_wand,MagickWand *phase_wand,
    +  const MagickBooleanType magnitude)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    magnitude_wand
    +
    the magnitude or real wand.
    + +
    +
    phase_wand
    +
    the phase or imaginary wand.
    + +
    +
    magnitude
    +
    if true, return as magnitude / phase pair otherwise a real / imaginary image pair.
    + +
    +
    +

    MagickLabelImage

    + +

    MagickLabelImage() adds a label to your image.

    + +

    The format of the MagickLabelImage method is:

    + +
    +MagickBooleanType MagickLabelImage(MagickWand *wand,const char *label)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    label
    +
    the image label.
    + +
    +
    +

    MagickLevelImage

    + +

    MagickLevelImage() adjusts the levels of an image by scaling the colors falling between specified white and black points to the full available quantum range. The parameters provided represent the black, mid, and white points. The black point specifies the darkest color in the image. Colors darker than the black point are set to zero. Mid point specifies a gamma correction to apply to the image. White point specifies the lightest color in the image. Colors brighter than the white point are set to the maximum quantum value.

    + +

    The format of the MagickLevelImage method is:

    + +
    +MagickBooleanType MagickLevelImage(MagickWand *wand,
    +  const double black_point,const double gamma,const double white_point)
    +MagickBooleanType MagickLevelImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double black_point,const double gamma,
    +  const double white_point)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    Identify which channel to level: RedChannel, GreenChannel, etc.
    + +
    +
    black_point
    +
    the black point.
    + +
    +
    gamma
    +
    the gamma.
    + +
    +
    white_point
    +
    the white point.
    + +
    +
    +

    MagickLevelImageColors

    + +

    MagickLevelImageColors() maps the given color to "black" and "white" values, linearly spreading out the colors, and level values on a channel by channel bases, as per LevelImage(). The given colors allows you to specify different level ranges for each of the color channels separately.

    + +

    The format of the MagickLevelImageColors method is:

    + +
    +MagickBooleanType MagickLevelImageColors(MagickWand *wand,
    +  const PixelWand *black_color,const PixelWand *white_color,
    +  const MagickBooleanType invert)
    +MagickBooleanType MagickLevelImageColorsChannel(MagickWand *wand,
    +  const ChannelType channel,const PixelWand *black_color,
    +  const PixelWand *white_color,const MagickBooleanType invert)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    Identify which channel to level: RedChannel, GreenChannel, etc.
    + +
    +
    black_color
    +
    the black color.
    + +
    +
    white_color
    +
    the white color.
    + +
    +
    invert
    +
    if true map the colors (levelize), rather than from (level)
    + +
    +
    +

    MagickLevelizeImage

    + +

    MagickLevelizeImage() applies the reversed MagickLevelImage(). It compresses the full range of color values, so that they lie between the given black and white points. Gamma is applied before the values are mapped. It can be used to de-contrast a greyscale image to the exact levels specified.

    + +

    The format of the MagickLevelizeImage method is:

    + +
    +MagickBooleanType MagickLevelizeImage(MagickWand *wand,
    +  const double black_point,const double gamma,const double white_point)
    +MagickBooleanType MagickLevelizeImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double black_point,const double gamma,
    +  const double white_point)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    Identify which channel to level: RedChannel, GreenChannel, etc.
    + +
    +
    black_point
    +
    The level to map zero (black) to.
    + +
    +
    gamma
    +
    adjust gamma by this factor before mapping values.
    + +
    +
    white_point
    +
    The level to map QuantumRange (white) to.
    + +
    +
    +

    MagickLinearStretchImage

    + +

    MagickLinearStretchImage() stretches with saturation the image intensity.

    + +

    You can also reduce the influence of a particular channel with a gamma value of 0.

    + +

    The format of the MagickLinearStretchImage method is:

    + +
    +MagickBooleanType MagickLinearStretchImage(MagickWand *wand,
    +  const double black_point,const double white_point)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    black_point
    +
    the black point.
    + +
    +
    white_point
    +
    the white point.
    + +
    +
    +

    MagickLiquidRescaleImage

    + +

    MagickLiquidRescaleImage() rescales image with seam carving.

    + +

    MagickBooleanType MagickLiquidRescaleImage(MagickWand *wand, const size_t columns,const size_t rows,const double delta_x, const double rigidity)

    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    the number of columns in the scaled image.
    + +
    +
    rows
    +
    the number of rows in the scaled image.
    + +
    +
    delta_x
    +
    maximum seam transversal step (0 means straight seams).
    + +
    +
    rigidity
    +
    introduce a bias for non-straight seams (typically 0).
    + +
    +
    +

    MagickLocalContrastImage

    + +

    MagickLocalContrastImage() attempts to increase the appearance of large-scale light-dark transitions. Local contrast enhancement works similarly to sharpening with an unsharp mask, however the mask is instead created using an image with a greater blur distance.

    + +

    MagickBooleanType MagickLocalContrastImage(MagickWand *wand, const double radius,const double strength)

    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    strength
    +
    the strength of the blur mask in percentage.
    + +
    +
    +

    MagickMagnifyImage

    + +

    MagickMagnifyImage() is a convenience method that scales an image proportionally to twice its original size.

    + +

    The format of the MagickMagnifyImage method is:

    + +
    +MagickBooleanType MagickMagnifyImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickMergeImageLayers

    + +

    MagickMergeImageLayers() composes all the image layers from the current given image onward to produce a single image of the merged layers.

    + +

    The inital canvas's size depends on the given ImageLayerMethod, and is initialized using the first images background color. The images are then compositied onto that image in sequence using the given composition that has been assigned to each individual image.

    + +

    The format of the MagickMergeImageLayers method is:

    + +
    +MagickWand *MagickMergeImageLayers(MagickWand *wand,
    +  const ImageLayerMethod method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    method
    +
    the method of selecting the size of the initial canvas.
    + +
    MergeLayer: Merge all layers onto a canvas just large enough to hold all the actual images. The virtual canvas of the first image is preserved but otherwise ignored.
    + +
    FlattenLayer: Use the virtual canvas size of first image. Images which fall outside this canvas is clipped. This can be used to 'fill out' a given virtual canvas.
    + +
    MosaicLayer: Start with the virtual canvas of the first image, enlarging left and right edges to contain all images. Images with negative offsets will be clipped.
    + +
    +
    +

    MagickMinifyImage

    + +

    MagickMinifyImage() is a convenience method that scales an image proportionally to one-half its original size

    + +

    The format of the MagickMinifyImage method is:

    + +
    +MagickBooleanType MagickMinifyImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickModulateImage

    + +

    MagickModulateImage() lets you control the brightness, saturation, and hue of an image. Hue is the percentage of absolute rotation from the current position. For example 50 results in a counter-clockwise rotation of 90 degrees, 150 results in a clockwise rotation of 90 degrees, with 0 and 200 both resulting in a rotation of 180 degrees.

    + +

    To increase the color brightness by 20 and decrease the color saturation by 10 and leave the hue unchanged, use: 120,90,100.

    + +

    The format of the MagickModulateImage method is:

    + +
    +MagickBooleanType MagickModulateImage(MagickWand *wand,
    +  const double brightness,const double saturation,const double hue)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    brightness
    +
    the percent change in brighness.
    + +
    +
    saturation
    +
    the percent change in saturation.
    + +
    +
    hue
    +
    the percent change in hue.
    + +
    +
    +

    MagickMontageImage

    + +

    MagickMontageImage() creates a composite image by combining several separate images. The images are tiled on the composite image with the name of the image optionally appearing just below the individual tile.

    + +

    The format of the MagickMontageImage method is:

    + +
    +MagickWand *MagickMontageImage(MagickWand *wand,
    +  const DrawingWand drawing_wand,const char *tile_geometry,
    +  const char *thumbnail_geometry,const MontageMode mode,
    +  const char *frame)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    drawing_wand
    +
    the drawing wand. The font name, size, and color are obtained from this wand.
    + +
    +
    tile_geometry
    +
    the number of tiles per row and page (e.g. 6x4+0+0).
    + +
    +
    thumbnail_geometry
    +
    Preferred image size and border size of each thumbnail (e.g. 120x120+4+3>).
    + +
    +
    mode
    +
    Thumbnail framing mode: Frame, Unframe, or Concatenate.
    + +
    +
    frame
    +
    Surround the image with an ornamental border (e.g. 15x15+3+3). The frame color is that of the thumbnail's matte color.
    + +
    +
    +

    MagickMorphImages

    + +

    MagickMorphImages() method morphs a set of images. Both the image pixels and size are linearly interpolated to give the appearance of a meta-morphosis from one image to the next.

    + +

    The format of the MagickMorphImages method is:

    + +
    +MagickWand *MagickMorphImages(MagickWand *wand,
    +  const size_t number_frames)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    number_frames
    +
    the number of in-between images to generate.
    + +
    +
    +

    MagickMorphologyImage

    + +

    MagickMorphologyImage() applies a user supplied kernel to the image according to the given mophology method.

    + +

    The format of the MagickMorphologyImage method is:

    + +
    +MagickBooleanType MagickMorphologyImage(MagickWand *wand,
    +  const MorphologyMethod method,const ssize_t iterations,
    +  const KernelInfo *kernel)
    +MagickBooleanType MagickMorphologyImageChannel(MagickWand *wand,
    +  ChannelType channel,const MorphologyMethod method,
    +  const ssize_t iterations,const KernelInfo *kernel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    method
    +
    the morphology method to be applied.
    + +
    +
    iterations
    +
    apply the operation this many times (or no change). A value of -1 means loop until no change found. How this is applied may depend on the morphology method. Typically this is a value of 1.
    + +
    +
    kernel
    +
    An array of doubles representing the morphology kernel.
    + +
    +
    +

    MagickMotionBlurImage

    + +

    MagickMotionBlurImage() simulates motion blur. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and MotionBlurImage() selects a suitable radius for you. Angle gives the angle of the blurring motion.

    + +

    The format of the MagickMotionBlurImage method is:

    + +
    +MagickBooleanType MagickMotionBlurImage(MagickWand *wand,
    +  const double radius,const double sigma,const double angle)
    +MagickBooleanType MagickMotionBlurImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double radius,const double sigma,
    +  const double angle)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    angle
    +
    Apply the effect along this angle.
    + +
    +
    +

    MagickNegateImage

    + +

    MagickNegateImage() negates the colors in the reference image. The Grayscale option means that only grayscale values within the image are negated.

    + +

    You can also reduce the influence of a particular channel with a gamma value of 0.

    + +

    The format of the MagickNegateImage method is:

    + +
    +MagickBooleanType MagickNegateImage(MagickWand *wand,
    +  const MagickBooleanType gray)
    +MagickBooleanType MagickNegateImageChannel(MagickWand *wand,
    +  const ChannelType channel,const MagickBooleanType gray)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    gray
    +
    If MagickTrue, only negate grayscale pixels within the image.
    + +
    +
    +

    MagickNewImage

    + +

    MagickNewImage() adds a blank image canvas of the specified size and background color to the wand.

    + +

    The format of the MagickNewImage method is:

    + +
    +MagickBooleanType MagickNewImage(MagickWand *wand,
    +  const size_t columns,const size_t rows,
    +  const PixelWand *background)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the image width.
    + +
    +
    height
    +
    the image height.
    + +
    +
    background
    +
    the image color.
    + +
    +
    +

    MagickNextImage

    + +

    MagickNextImage() sets the next image in the wand as the current image.

    + +

    It is typically used after MagickResetIterator(), after which its first use will set the first image as the current image (unless the wand is empty).

    + +

    It will return MagickFalse when no more images are left to be returned which happens when the wand is empty, or the current image is the last image.

    + +

    When the above condition (end of image list) is reached, the iterator is automaticall set so that you can start using MagickPreviousImage() to again iterate over the images in the reverse direction, starting with the last image (again). You can jump to this condition immeditally using MagickSetLastIterator().

    + +

    The format of the MagickNextImage method is:

    + +
    +MagickBooleanType MagickNextImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickNormalizeImage

    + +

    MagickNormalizeImage() enhances the contrast of a color image by adjusting the pixels color to span the entire range of colors available

    + +

    You can also reduce the influence of a particular channel with a gamma value of 0.

    + +

    The format of the MagickNormalizeImage method is:

    + +
    +MagickBooleanType MagickNormalizeImage(MagickWand *wand)
    +MagickBooleanType MagickNormalizeImageChannel(MagickWand *wand,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    +

    MagickOilPaintImage

    + +

    MagickOilPaintImage() applies a special effect filter that simulates an oil painting. Each pixel is replaced by the most frequent color occurring in a circular region defined by radius.

    + +

    The format of the MagickOilPaintImage method is:

    + +
    +MagickBooleanType MagickOilPaintImage(MagickWand *wand,
    +  const double radius)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the circular neighborhood.
    + +
    +
    +

    MagickOpaquePaintImage

    + +

    MagickOpaquePaintImage() changes any pixel that matches color with the color defined by fill.

    + +

    The format of the MagickOpaquePaintImage method is:

    + +
    +MagickBooleanType MagickOpaquePaintImage(MagickWand *wand,
    +  const PixelWand *target,const PixelWand *fill,const double fuzz,
    +  const MagickBooleanType invert)
    +MagickBooleanType MagickOpaquePaintImageChannel(MagickWand *wand,
    +  const ChannelType channel,const PixelWand *target,
    +  const PixelWand *fill,const double fuzz,const MagickBooleanType invert)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    target
    +
    Change this target color to the fill color within the image.
    + +
    +
    fill
    +
    the fill pixel wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    invert
    +
    paint any pixel that does not match the target color.
    + +
    +
    +

    MagickOptimizeImageLayers

    + +

    MagickOptimizeImageLayers() compares each image the GIF disposed forms of the previous image in the sequence. From this it attempts to select the smallest cropped image to replace each frame, while preserving the results of the animation.

    + +

    The format of the MagickOptimizeImageLayers method is:

    + +
    +MagickWand *MagickOptimizeImageLayers(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickOptimizeImageTransparency

    + +

    MagickOptimizeImageTransparency() takes a frame optimized GIF animation, and compares the overlayed pixels against the disposal image resulting from all the previous frames in the animation. Any pixel that does not change the disposal image (and thus does not effect the outcome of an overlay) is made transparent.

    + +

    WARNING: This modifies the current images directly, rather than generate a new image sequence. The format of the MagickOptimizeImageTransparency method is:

    + +
    +MagickBooleanType MagickOptimizeImageTransparency(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickOrderedPosterizeImage

    + +

    MagickOrderedPosterizeImage() performs an ordered dither based on a number of pre-defined dithering threshold maps, but over multiple intensity levels, which can be different for different channels, according to the input arguments.

    + +

    The format of the MagickOrderedPosterizeImage method is:

    + +
    +MagickBooleanType MagickOrderedPosterizeImage(MagickWand *wand,
    +  const char *threshold_map)
    +MagickBooleanType MagickOrderedPosterizeImageChannel(MagickWand *wand,
    +  const ChannelType channel,const char *threshold_map)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel or channels to be thresholded.
    + +
    +
    threshold_map
    +
    A string containing the name of the threshold dither map to use, followed by zero or more numbers representing the number of color levels tho dither between.
    + +
    Any level number less than 2 is equivalent to 2, and means only binary dithering will be applied to each color channel.
    + +
    No numbers also means a 2 level (bitmap) dither will be applied to all channels, while a single number is the number of levels applied to each channel in sequence. More numbers will be applied in turn to each of the color channels.
    + +
    For example: "o3x3,6" generates a 6 level posterization of the image with a ordered 3x3 diffused pixel dither being applied between each level. While checker,8,8,4 will produce a 332 colormaped image with only a single checkerboard hash pattern (50 grey) between each color level, to basically double the number of color levels with a bare minimim of dithering.
    + +
    +
    +

    MagickPingImage

    + +

    MagickPingImage() is like MagickReadImage() except the only valid information returned is the image width, height, size, and format. It is designed to efficiently obtain this information from a file without reading the entire image sequence into memory.

    + +

    The format of the MagickPingImage method is:

    + +
    +MagickBooleanType MagickPingImage(MagickWand *wand,const char *filename)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    filename
    +
    the image filename.
    + +
    +
    +

    MagickPingImageBlob

    + +

    MagickPingImageBlob() pings an image or image sequence from a blob.

    + +

    The format of the MagickPingImageBlob method is:

    + +
    +MagickBooleanType MagickPingImageBlob(MagickWand *wand,
    +  const void *blob,const size_t length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    blob
    +
    the blob.
    + +
    +
    length
    +
    the blob length.
    + +
    +
    +

    MagickPingImageFile

    + +

    MagickPingImageFile() pings an image or image sequence from an open file descriptor.

    + +

    The format of the MagickPingImageFile method is:

    + +
    +MagickBooleanType MagickPingImageFile(MagickWand *wand,FILE *file)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    file
    +
    the file descriptor.
    + +
    +
    +

    MagickPolaroidImage

    + +

    MagickPolaroidImage() simulates a Polaroid picture.

    + +

    The format of the MagickPolaroidImage method is:

    + +
    +MagickBooleanType MagickPolaroidImage(MagickWand *wand,
    +  const DrawingWand *drawing_wand,const double angle)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    drawing_wand
    +
    the draw wand.
    + +
    +
    angle
    +
    Apply the effect along this angle.
    + +
    +
    +

    MagickPosterizeImage

    + +

    MagickPosterizeImage() reduces the image to a limited number of color level.

    + +

    The format of the MagickPosterizeImage method is:

    + +
    +MagickBooleanType MagickPosterizeImage(MagickWand *wand,
    +  const size_t levels,const MagickBooleanType dither)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    levels
    +
    Number of color levels allowed in each channel. Very low values (2, 3, or 4) have the most visible effect.
    + +
    +
    dither
    +
    Set this integer value to something other than zero to dither the mapped image.
    + +
    +
    +

    MagickPreviewImages

    + +

    MagickPreviewImages() tiles 9 thumbnails of the specified image with an image processing operation applied at varying strengths. This helpful to quickly pin-point an appropriate parameter for an image processing operation.

    + +

    The format of the MagickPreviewImages method is:

    + +
    +MagickWand *MagickPreviewImages(MagickWand *wand,
    +  const PreviewType preview)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    preview
    +
    the preview type.
    + +
    +
    +

    MagickPreviousImage

    + +

    MagickPreviousImage() sets the previous image in the wand as the current image.

    + +

    It is typically used after MagickSetLastIterator(), after which its first use will set the last image as the current image (unless the wand is empty).

    + +

    It will return MagickFalse when no more images are left to be returned which happens when the wand is empty, or the current image is the first image. At that point the iterator is than reset to again process images in the forward direction, again starting with the first image in list. Images added at this point are prepended.

    + +

    Also at that point any images added to the wand using MagickAddImages() or MagickReadImages() will be prepended before the first image. In this sense the condition is not quite exactly the same as MagickResetIterator().

    + +

    The format of the MagickPreviousImage method is:

    + +
    +MagickBooleanType MagickPreviousImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickQuantizeImage

    + +

    MagickQuantizeImage() analyzes the colors within a reference image and chooses a fixed number of colors to represent the image. The goal of the algorithm is to minimize the color difference between the input and output image while minimizing the processing time.

    + +

    The format of the MagickQuantizeImage method is:

    + +
    +MagickBooleanType MagickQuantizeImage(MagickWand *wand,
    +  const size_t number_colors,const ColorspaceType colorspace,
    +  const size_t treedepth,const MagickBooleanType dither,
    +  const MagickBooleanType measure_error)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    number_colors
    +
    the number of colors.
    + +
    +
    colorspace
    +
    Perform color reduction in this colorspace, typically RGBColorspace.
    + +
    +
    treedepth
    +
    Normally, this integer value is zero or one. A zero or one tells Quantize to choose a optimal tree depth of Log4(number_colors). A tree of this depth generally allows the best representation of the reference image with the least amount of memory and the fastest computational speed. In some cases, such as an image with low color dispersion (a few number of colors), a value other than Log4(number_colors) is required. To expand the color tree completely, use a value of 8.
    + +
    +
    dither
    +
    A value other than zero distributes the difference between an original image and the corresponding color reduced image to neighboring pixels along a Hilbert curve.
    + +
    +
    measure_error
    +
    A value other than zero measures the difference between the original and quantized images. This difference is the total quantization error. The error is computed by summing over all pixels in an image the distance squared in RGB space between each reference pixel value and its quantized value.
    + +
    +
    +

    MagickQuantizeImages

    + +

    MagickQuantizeImages() analyzes the colors within a sequence of images and chooses a fixed number of colors to represent the image. The goal of the algorithm is to minimize the color difference between the input and output image while minimizing the processing time.

    + +

    The format of the MagickQuantizeImages method is:

    + +
    +MagickBooleanType MagickQuantizeImages(MagickWand *wand,
    +  const size_t number_colors,const ColorspaceType colorspace,
    +  const size_t treedepth,const MagickBooleanType dither,
    +  const MagickBooleanType measure_error)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    number_colors
    +
    the number of colors.
    + +
    +
    colorspace
    +
    Perform color reduction in this colorspace, typically RGBColorspace.
    + +
    +
    treedepth
    +
    Normally, this integer value is zero or one. A zero or one tells Quantize to choose a optimal tree depth of Log4(number_colors). A tree of this depth generally allows the best representation of the reference image with the least amount of memory and the fastest computational speed. In some cases, such as an image with low color dispersion (a few number of colors), a value other than Log4(number_colors) is required. To expand the color tree completely, use a value of 8.
    + +
    +
    dither
    +
    A value other than zero distributes the difference between an original image and the corresponding color reduced algorithm to neighboring pixels along a Hilbert curve.
    + +
    +
    measure_error
    +
    A value other than zero measures the difference between the original and quantized images. This difference is the total quantization error. The error is computed by summing over all pixels in an image the distance squared in RGB space between each reference pixel value and its quantized value.
    + +
    +
    +

    MagickRaiseImage

    + +

    MagickRaiseImage() creates a simulated three-dimensional button-like effect by lightening and darkening the edges of the image. Members width and height of raise_info define the width of the vertical and horizontal edge of the effect.

    + +

    The format of the MagickRaiseImage method is:

    + +
    +MagickBooleanType MagickRaiseImage(MagickWand *wand,
    +  const size_t width,const size_t height,const ssize_t x,
    +  const ssize_t y,const MagickBooleanType raise)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width,height,x,y
    +
    Define the dimensions of the area to raise.
    + +
    +
    raise
    +
    A value other than zero creates a 3-D raise effect, otherwise it has a lowered effect.
    + +
    +
    +

    MagickRandomThresholdImage

    + +

    MagickRandomThresholdImage() changes the value of individual pixels based on the intensity of each pixel compared to threshold. The result is a high-contrast, two color image.

    + +

    The format of the MagickRandomThresholdImage method is:

    + +
    +MagickBooleanType MagickRandomThresholdImage(MagickWand *wand,
    +  const double low,const double high)
    +MagickBooleanType MagickRandomThresholdImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double low,const double high)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    low,high
    +
    Specify the high and low thresholds. These values range from 0 to QuantumRange.
    + +
    +
    +

    MagickReadImage

    + +

    MagickReadImage() reads an image or image sequence. The images are inserted at the current image pointer position. Use MagickSetFirstIterator(), MagickSetLastIterator, or MagickSetIteratorIndex() to specify the current image pointer position at the beginning of the image list, the end, or anywhere in-between respectively.

    + +

    The format of the MagickReadImage method is:

    + +
    +MagickBooleanType MagickReadImage(MagickWand *wand,const char *filename)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    filename
    +
    the image filename.
    + +
    +
    +

    MagickReadImageBlob

    + +

    MagickReadImageBlob() reads an image or image sequence from a blob.

    + +

    The format of the MagickReadImageBlob method is:

    + +
    +MagickBooleanType MagickReadImageBlob(MagickWand *wand,
    +  const void *blob,const size_t length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    blob
    +
    the blob.
    + +
    +
    length
    +
    the blob length.
    + +
    +
    +

    MagickReadImageFile

    + +

    MagickReadImageFile() reads an image or image sequence from an open file descriptor.

    + +

    The format of the MagickReadImageFile method is:

    + +
    +MagickBooleanType MagickReadImageFile(MagickWand *wand,FILE *file)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    file
    +
    the file descriptor.
    + +
    +
    +

    MagickRemapImage

    + +

    MagickRemapImage() replaces the colors of an image with the closest color from a reference image.

    + +

    The format of the MagickRemapImage method is:

    + +
    +MagickBooleanType MagickRemapImage(MagickWand *wand,
    +  const MagickWand *remap_wand,const DitherMethod method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    affinity
    +
    the affinity wand.
    + +
    +
    method
    +
    choose from these dither methods: NoDitherMethod, RiemersmaDitherMethod, or FloydSteinbergDitherMethod.
    + +
    +
    +

    MagickRemoveImage

    + +

    MagickRemoveImage() removes an image from the image list.

    + +

    The format of the MagickRemoveImage method is:

    + +
    +MagickBooleanType MagickRemoveImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    insert
    +
    the splice wand.
    + +
    +
    +

    MagickResampleImage

    + +

    MagickResampleImage() resample image to desired resolution.

    + +

    Bessel Blackman Box Catrom Cubic Gaussian Hanning Hermite Lanczos Mitchell Point Quandratic Sinc Triangle

    + +

    Most of the filters are FIR (finite impulse response), however, Bessel, Gaussian, and Sinc are IIR (infinite impulse response). Bessel and Sinc are windowed (brought down to zero) with the Blackman filter.

    + +

    The format of the MagickResampleImage method is:

    + +
    +MagickBooleanType MagickResampleImage(MagickWand *wand,
    +  const double x_resolution,const double y_resolution,
    +  const FilterTypes filter,const double blur)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x_resolution
    +
    the new image x resolution.
    + +
    +
    y_resolution
    +
    the new image y resolution.
    + +
    +
    filter
    +
    Image filter to use.
    + +
    +
    blur
    +
    the blur factor where > 1 is blurry, < 1 is sharp.
    + +
    +
    +

    MagickResetImagePage

    + +

    MagickResetImagePage() resets the Wand page canvas and position.

    + +

    The format of the MagickResetImagePage method is:

    + +
    +MagickBooleanType MagickResetImagePage(MagickWand *wand,
    +  const char *page)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    page
    +
    the relative page specification.
    + +
    +
    +

    MagickResizeImage

    + +

    MagickResizeImage() scales an image to the desired dimensions with one of these filters:

    + +
    +    Bessel   Blackman   Box
    +    Catrom   CubicGaussian
    +    Hanning  Hermite    Lanczos
    +    Mitchell PointQuandratic
    +    Sinc     Triangle
    +
    + +

    Most of the filters are FIR (finite impulse response), however, Bessel, Gaussian, and Sinc are IIR (infinite impulse response). Bessel and Sinc are windowed (brought down to zero) with the Blackman filter.

    + +

    The format of the MagickResizeImage method is:

    + +
    +MagickBooleanType MagickResizeImage(MagickWand *wand,
    +  const size_t columns,const size_t rows,
    +  const FilterTypes filter,const double blur)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    the number of columns in the scaled image.
    + +
    +
    rows
    +
    the number of rows in the scaled image.
    + +
    +
    filter
    +
    Image filter to use.
    + +
    +
    blur
    +
    the blur factor where > 1 is blurry, < 1 is sharp.
    + +
    +
    +

    MagickRollImage

    + +

    MagickRollImage() offsets an image as defined by x and y.

    + +

    The format of the MagickRollImage method is:

    + +
    +MagickBooleanType MagickRollImage(MagickWand *wand,const ssize_t x,
    +  const size_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the x offset.
    + +
    +
    y
    +
    the y offset.
    + +
    +
    +

    MagickRotateImage

    + +

    MagickRotateImage() rotates an image the specified number of degrees. Empty triangles left over from rotating the image are filled with the background color.

    + +

    The format of the MagickRotateImage method is:

    + +
    +MagickBooleanType MagickRotateImage(MagickWand *wand,
    +  const PixelWand *background,const double degrees)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    background
    +
    the background pixel wand.
    + +
    +
    degrees
    +
    the number of degrees to rotate the image.
    + +
    + +
    +
    +

    MagickRotationalBlurImage

    + +

    MagickRotationalBlurImage() rotational blurs an image.

    + +

    The format of the MagickRotationalBlurImage method is:

    + +
    +MagickBooleanType MagickRotationalBlurImage(MagickWand *wand,
    +  const double angle)
    +MagickBooleanType MagickRotationalBlurImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double angle)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    angle
    +
    the angle of the blur in degrees.
    + +
    +
    +

    MagickSampleImage

    + +

    MagickSampleImage() scales an image to the desired dimensions with pixel sampling. Unlike other scaling methods, this method does not introduce any additional color into the scaled image.

    + +

    The format of the MagickSampleImage method is:

    + +
    +MagickBooleanType MagickSampleImage(MagickWand *wand,
    +  const size_t columns,const size_t rows)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    the number of columns in the scaled image.
    + +
    +
    rows
    +
    the number of rows in the scaled image.
    + +
    +
    +

    MagickScaleImage

    + +

    MagickScaleImage() scales the size of an image to the given dimensions.

    + +

    The format of the MagickScaleImage method is:

    + +
    +MagickBooleanType MagickScaleImage(MagickWand *wand,
    +  const size_t columns,const size_t rows)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    the number of columns in the scaled image.
    + +
    +
    rows
    +
    the number of rows in the scaled image.
    + +
    +
    +

    MagickSegmentImage

    + +

    MagickSegmentImage() segments an image by analyzing the histograms of the color components and identifying units that are homogeneous with the fuzzy C-means technique.

    + +

    The format of the SegmentImage method is:

    + +
    +MagickBooleanType MagickSegmentImage(MagickWand *wand,
    +  const ColorspaceType colorspace,const MagickBooleanType verbose,
    +  const double cluster_threshold,const double smooth_threshold)
    +
    + +

    A description of each parameter follows.

    + +
    wand
    +

    the wand.

    + +
    colorspace
    +

    the image colorspace.

    + +
    verbose
    +

    Set to MagickTrue to print detailed information about the identified classes.

    + +
    cluster_threshold
    +

    This represents the minimum number of pixels contained in a hexahedra before it can be considered valid (expressed as a percentage).

    + +
    smooth_threshold
    +

    the smoothing threshold eliminates noise in the second derivative of the histogram. As the value is increased, you can expect a smoother second derivative.

    + +

    MagickSelectiveBlurImage

    + +

    MagickSelectiveBlurImage() selectively blur an image within a contrast threshold. It is similar to the unsharpen mask that sharpens everything with contrast above a certain threshold.

    + +

    The format of the MagickSelectiveBlurImage method is:

    + +
    +MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand,
    +  const double radius,const double sigma,const double threshold)
    +MagickBooleanType MagickSelectiveBlurImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double radius,const double sigma,
    +  const double threshold)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    radius
    +
    the radius of the gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the gaussian, in pixels.
    + +
    +
    threshold
    +
    only pixels within this contrast threshold are included in the blur operation.
    + +
    +
    +

    MagickSeparateImageChannel

    + +

    MagickSeparateImageChannel() separates a channel from the image and returns a grayscale image. A channel is a particular color component of each pixel in the image.

    + +

    The format of the MagickSeparateImageChannel method is:

    + +
    +MagickBooleanType MagickSeparateImageChannel(MagickWand *wand,
    +  const ChannelType channel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    +

    MagickSepiaToneImage

    + +

    MagickSepiaToneImage() applies a special effect to the image, similar to the effect achieved in a photo darkroom by sepia toning. Threshold ranges from 0 to QuantumRange and is a measure of the extent of the sepia toning. A threshold of 80 is a good starting point for a reasonable tone.

    + +

    The format of the MagickSepiaToneImage method is:

    + +
    +MagickBooleanType MagickSepiaToneImage(MagickWand *wand,
    +  const double threshold)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    threshold
    +
    Define the extent of the sepia toning.
    + +
    +
    +

    MagickSetImage

    + +

    MagickSetImage() replaces the last image returned by MagickSetIteratorIndex(), MagickNextImage(), MagickPreviousImage() with the images from the specified wand.

    + +

    The format of the MagickSetImage method is:

    + +
    +MagickBooleanType MagickSetImage(MagickWand *wand,
    +  const MagickWand *set_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    set_wand
    +
    the set_wand wand.
    + +
    +
    +

    MagickSetImageAlphaChannel

    + +

    MagickSetImageAlphaChannel() activates, deactivates, resets, or sets the alpha channel.

    + +

    The format of the MagickSetImageAlphaChannel method is:

    + +
    +MagickBooleanType MagickSetImageAlphaChannel(MagickWand *wand,
    +  const AlphaChannelType alpha_type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    alpha_type
    +
    the alpha channel type: ActivateAlphaChannel, DeactivateAlphaChannel, OpaqueAlphaChannel, or SetAlphaChannel.
    + +
    +
    +

    MagickSetImageBackgroundColor

    + +

    MagickSetImageBackgroundColor() sets the image background color.

    + +

    The format of the MagickSetImageBackgroundColor method is:

    + +
    +MagickBooleanType MagickSetImageBackgroundColor(MagickWand *wand,
    +  const PixelWand *background)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    background
    +
    the background pixel wand.
    + +
    +
    +

    MagickSetImageBias

    + +

    MagickSetImageBias() sets the image bias for any method that convolves an image (e.g. MagickConvolveImage()).

    + +

    The format of the MagickSetImageBias method is:

    + +
    +MagickBooleanType MagickSetImageBias(MagickWand *wand,
    +  const double bias)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    bias
    +
    the image bias.
    + +
    +
    +

    MagickSetImageBluePrimary

    + +

    MagickSetImageBluePrimary() sets the image chromaticity blue primary point.

    + +

    The format of the MagickSetImageBluePrimary method is:

    + +
    +MagickBooleanType MagickSetImageBluePrimary(MagickWand *wand,
    +  const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the blue primary x-point.
    + +
    +
    y
    +
    the blue primary y-point.
    + +
    +
    +

    MagickSetImageBorderColor

    + +

    MagickSetImageBorderColor() sets the image border color.

    + +

    The format of the MagickSetImageBorderColor method is:

    + +
    +MagickBooleanType MagickSetImageBorderColor(MagickWand *wand,
    +  const PixelWand *border)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    border
    +
    the border pixel wand.
    + +
    +
    +

    MagickSetImageChannelDepth

    + +

    MagickSetImageChannelDepth() sets the depth of a particular image channel.

    + +

    The format of the MagickSetImageChannelDepth method is:

    + +
    +MagickBooleanType MagickSetImageChannelDepth(MagickWand *wand,
    +  const ChannelType channel,const size_t depth)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    depth
    +
    the image depth in bits.
    + +
    +
    +

    MagickSetImageClipMask

    + +

    MagickSetImageClipMask() sets image clip mask.

    + +

    The format of the MagickSetImageClipMask method is:

    + +
    +MagickBooleanType MagickSetImageClipMask(MagickWand *wand,
    +  const MagickWand *clip_mask)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    clip_mask
    +
    the clip_mask wand.
    + +
    +
    +

    MagickSetImageColor

    + +

    MagickSetImageColor() set the entire wand canvas to the specified color.

    + +

    The format of the MagickSetImageColor method is:

    + +
    +MagickBooleanType MagickSetImageColor(MagickWand *wand,
    +  const PixelWand *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    background
    +
    the image color.
    + +
    +
    +

    MagickSetImageColormapColor

    + +

    MagickSetImageColormapColor() sets the color of the specified colormap index.

    + +

    The format of the MagickSetImageColormapColor method is:

    + +
    +MagickBooleanType MagickSetImageColormapColor(MagickWand *wand,
    +  const size_t index,const PixelWand *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    index
    +
    the offset into the image colormap.
    + +
    +
    color
    +
    Return the colormap color in this wand.
    + +
    +
    +

    MagickSetImageColorspace

    + +

    MagickSetImageColorspace() sets the image colorspace.

    + +

    The format of the MagickSetImageColorspace method is:

    + +
    +MagickBooleanType MagickSetImageColorspace(MagickWand *wand,
    +  const ColorspaceType colorspace)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    colorspace
    +
    the image colorspace: UndefinedColorspace, RGBColorspace, GRAYColorspace, TransparentColorspace, OHTAColorspace, XYZColorspace, YCbCrColorspace, YCCColorspace, YIQColorspace, YPbPrColorspace, YPbPrColorspace, YUVColorspace, CMYKColorspace, sRGBColorspace, HSLColorspace, or HWBColorspace.
    + +
    +
    +

    MagickSetImageCompose

    + +

    MagickSetImageCompose() sets the image composite operator, useful for specifying how to composite the image thumbnail when using the MagickMontageImage() method.

    + +

    The format of the MagickSetImageCompose method is:

    + +
    +MagickBooleanType MagickSetImageCompose(MagickWand *wand,
    +  const CompositeOperator compose)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    compose
    +
    the image composite operator.
    + +
    +
    +

    MagickSetImageCompression

    + +

    MagickSetImageCompression() sets the image compression.

    + +

    The format of the MagickSetImageCompression method is:

    + +
    +MagickBooleanType MagickSetImageCompression(MagickWand *wand,
    +  const CompressionType compression)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    compression
    +
    the image compression type.
    + +
    +
    +

    MagickSetImageCompressionQuality

    + +

    MagickSetImageCompressionQuality() sets the image compression quality.

    + +

    The format of the MagickSetImageCompressionQuality method is:

    + +
    +MagickBooleanType MagickSetImageCompressionQuality(MagickWand *wand,
    +  const size_t quality)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    quality
    +
    the image compression tlityype.
    + +
    +
    +

    MagickSetImageDelay

    + +

    MagickSetImageDelay() sets the image delay.

    + +

    The format of the MagickSetImageDelay method is:

    + +
    +MagickBooleanType MagickSetImageDelay(MagickWand *wand,
    +  const size_t delay)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    delay
    +
    the image delay in ticks-per-second units.
    + +
    +
    +

    MagickSetImageDepth

    + +

    MagickSetImageDepth() sets the image depth.

    + +

    The format of the MagickSetImageDepth method is:

    + +
    +MagickBooleanType MagickSetImageDepth(MagickWand *wand,
    +  const size_t depth)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    depth
    +
    the image depth in bits: 8, 16, or 32.
    + +
    +
    +

    MagickSetImageDispose

    + +

    MagickSetImageDispose() sets the image disposal method.

    + +

    The format of the MagickSetImageDispose method is:

    + +
    +MagickBooleanType MagickSetImageDispose(MagickWand *wand,
    +  const DisposeType dispose)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    dispose
    +
    the image disposeal type.
    + +
    +
    +

    MagickSetImageEndian

    + +

    MagickSetImageEndian() sets the image endian method.

    + +

    The format of the MagickSetImageEndian method is:

    + +
    +MagickBooleanType MagickSetImageEndian(MagickWand *wand,
    +  const EndianType endian)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    endian
    +
    the image endian type.
    + +
    +
    +

    MagickSetImageExtent

    + +

    MagickSetImageExtent() sets the image size (i.e. columns & rows).

    + +

    The format of the MagickSetImageExtent method is:

    + +
    +MagickBooleanType MagickSetImageExtent(MagickWand *wand,
    +  const size_t columns,const unsigned rows)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    The image width in pixels.
    + +
    +
    rows
    +
    The image height in pixels.
    + +
    +
    +

    MagickSetImageFilename

    + +

    MagickSetImageFilename() sets the filename of a particular image in a sequence.

    + +

    The format of the MagickSetImageFilename method is:

    + +
    +MagickBooleanType MagickSetImageFilename(MagickWand *wand,
    +  const char *filename)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    filename
    +
    the image filename.
    + +
    +
    +

    MagickSetImageFormat

    + +

    MagickSetImageFormat() sets the format of a particular image in a sequence.

    + +

    The format of the MagickSetImageFormat method is:

    + +
    +MagickBooleanType MagickSetImageFormat(MagickWand *wand,
    +  const char *format)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    format
    +
    the image format.
    + +
    +
    +

    MagickSetImageFuzz

    + +

    MagickSetImageFuzz() sets the image fuzz.

    + +

    The format of the MagickSetImageFuzz method is:

    + +
    +MagickBooleanType MagickSetImageFuzz(MagickWand *wand,
    +  const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    fuzz
    +
    the image fuzz.
    + +
    +
    +

    MagickSetImageGamma

    + +

    MagickSetImageGamma() sets the image gamma.

    + +

    The format of the MagickSetImageGamma method is:

    + +
    +MagickBooleanType MagickSetImageGamma(MagickWand *wand,
    +  const double gamma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    gamma
    +
    the image gamma.
    + +
    +
    +

    MagickSetImageGravity

    + +

    MagickSetImageGravity() sets the image gravity type.

    + +

    The format of the MagickSetImageGravity method is:

    + +
    +MagickBooleanType MagickSetImageGravity(MagickWand *wand,
    +  const GravityType gravity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    gravity
    +
    the image interlace scheme: NoInterlace, LineInterlace, PlaneInterlace, PartitionInterlace.
    + +
    +
    +

    MagickSetImageGreenPrimary

    + +

    MagickSetImageGreenPrimary() sets the image chromaticity green primary point.

    + +

    The format of the MagickSetImageGreenPrimary method is:

    + +
    +MagickBooleanType MagickSetImageGreenPrimary(MagickWand *wand,
    +  const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the green primary x-point.
    + +
    +
    y
    +
    the green primary y-point.
    + +
    + +
    +
    +

    MagickSetImageInterlaceScheme

    + +

    MagickSetImageInterlaceScheme() sets the image interlace scheme.

    + +

    The format of the MagickSetImageInterlaceScheme method is:

    + +
    +MagickBooleanType MagickSetImageInterlaceScheme(MagickWand *wand,
    +  const InterlaceType interlace)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    interlace
    +
    the image interlace scheme: NoInterlace, LineInterlace, PlaneInterlace, PartitionInterlace.
    + +
    +
    +

    MagickSetImageInterpolateMethod

    + +

    MagickSetImageInterpolateMethod() sets the image interpolate pixel method.

    + +

    The format of the MagickSetImageInterpolateMethod method is:

    + +
    +MagickBooleanType MagickSetImageInterpolateMethod(MagickWand *wand,
    +  const InterpolatePixelMethod method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    method
    +
    the image interpole pixel methods: choose from Undefined, Average, Bicubic, Bilinear, Filter, Integer, Mesh, NearestNeighbor.
    + +
    +
    +

    MagickSetImageIterations

    + +

    MagickSetImageIterations() sets the image iterations.

    + +

    The format of the MagickSetImageIterations method is:

    + +
    +MagickBooleanType MagickSetImageIterations(MagickWand *wand,
    +  const size_t iterations)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    delay
    +
    the image delay in 1/100th of a second.
    + +
    +
    +

    MagickSetImageMatte

    + +

    MagickSetImageMatte() sets the image matte channel.

    + +

    The format of the MagickSetImageMatteColor method is:

    + +
    +MagickBooleanType MagickSetImageMatteColor(MagickWand *wand,
    +  const MagickBooleanType *matte)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    matte
    +
    Set to MagickTrue to enable the image matte channel otherwise MagickFalse.
    + +
    +
    +

    MagickSetImageMatteColor

    + +

    MagickSetImageMatteColor() sets the image matte color.

    + +

    The format of the MagickSetImageMatteColor method is:

    + +
    +MagickBooleanType MagickSetImageMatteColor(MagickWand *wand,
    +  const PixelWand *matte)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    matte
    +
    the matte pixel wand.
    + +
    +
    +

    MagickSetImageOpacity

    + +

    MagickSetImageOpacity() sets the image to the specified opacity level.

    + +

    The format of the MagickSetImageOpacity method is:

    + +
    +MagickBooleanType MagickSetImageOpacity(MagickWand *wand,
    +  const double alpha)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    alpha
    +
    the level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
    + +
    +
    +

    MagickSetImageOrientation

    + +

    MagickSetImageOrientation() sets the image orientation.

    + +

    The format of the MagickSetImageOrientation method is:

    + +
    +MagickBooleanType MagickSetImageOrientation(MagickWand *wand,
    +  const OrientationType orientation)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    orientation
    +
    the image orientation type.
    + +
    +
    +

    MagickSetImagePage

    + +

    MagickSetImagePage() sets the page geometry of the image.

    + +

    The format of the MagickSetImagePage method is:

    + +
    +MagickBooleanType MagickSetImagePage(MagickWand *wand,
    +  const size_t width,const size_t height,const ssize_t x,
    +  const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the page width.
    + +
    +
    height
    +
    the page height.
    + +
    +
    x
    +
    the page x-offset.
    + +
    +
    y
    +
    the page y-offset.
    + +
    +
    +

    MagickSetImagePixelColor

    + +

    MagickSetImagePixelColor() sets the color of the specified pixel.

    + +

    The format of the MagickSetImagePixelColor method is:

    + +
    +MagickBooleanType MagickSetImagePixelColor(MagickWand *wand,
    +  const ssize_t x,const ssize_t y,const PixelWand *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x,y
    +
    the pixel offset into the image.
    + +
    +
    color
    +
    Return the colormap color in this wand.
    + +
    +
    +

    MagickSetImageProgressMonitor

    + +

    MagickSetImageProgressMonitor() sets the wand image progress monitor to the specified method and returns the previous progress monitor if any. The progress monitor method looks like this:

    + +
    +    MagickBooleanType MagickProgressMonitor(const char *text,
    +const MagickOffsetType offset,const MagickSizeType span,
    +void *client_data)
    +
    + +

    If the progress monitor returns MagickFalse, the current operation is interrupted.

    + +

    The format of the MagickSetImageProgressMonitor method is:

    + +
    +MagickProgressMonitor MagickSetImageProgressMonitor(MagickWand *wand
    +  const MagickProgressMonitor progress_monitor,void *client_data)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    progress_monitor
    +
    Specifies a pointer to a method to monitor progress of an image operation.
    + +
    +
    client_data
    +
    Specifies a pointer to any client data.
    + +
    +
    +

    MagickSetImageRedPrimary

    + +

    MagickSetImageRedPrimary() sets the image chromaticity red primary point.

    + +

    The format of the MagickSetImageRedPrimary method is:

    + +
    +MagickBooleanType MagickSetImageRedPrimary(MagickWand *wand,
    +  const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the red primary x-point.
    + +
    +
    y
    +
    the red primary y-point.
    + +
    +
    +

    MagickSetImageRenderingIntent

    + +

    MagickSetImageRenderingIntent() sets the image rendering intent.

    + +

    The format of the MagickSetImageRenderingIntent method is:

    + +
    +MagickBooleanType MagickSetImageRenderingIntent(MagickWand *wand,
    +  const RenderingIntent rendering_intent)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    rendering_intent
    +
    the image rendering intent: UndefinedIntent, SaturationIntent, PerceptualIntent, AbsoluteIntent, or RelativeIntent.
    + +
    +
    +

    MagickSetImageResolution

    + +

    MagickSetImageResolution() sets the image resolution.

    + +

    The format of the MagickSetImageResolution method is:

    + +
    +MagickBooleanType MagickSetImageResolution(MagickWand *wand,
    +  const double x_resolution,const double y_resolution)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x_resolution
    +
    the image x resolution.
    + +
    +
    y_resolution
    +
    the image y resolution.
    + +
    +
    +

    MagickSetImageScene

    + +

    MagickSetImageScene() sets the image scene.

    + +

    The format of the MagickSetImageScene method is:

    + +
    +MagickBooleanType MagickSetImageScene(MagickWand *wand,
    +  const size_t scene)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    delay
    +
    the image scene number.
    + +
    +
    +

    MagickSetImageTicksPerSecond

    + +

    MagickSetImageTicksPerSecond() sets the image ticks-per-second.

    + +

    The format of the MagickSetImageTicksPerSecond method is:

    + +
    +MagickBooleanType MagickSetImageTicksPerSecond(MagickWand *wand,
    +  const ssize_t ticks_per-second)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    ticks_per_second
    +
    the units to use for the image delay.
    + +
    +
    +

    MagickSetImageType

    + +

    MagickSetImageType() sets the image type.

    + +

    The format of the MagickSetImageType method is:

    + +
    +MagickBooleanType MagickSetImageType(MagickWand *wand,
    +  const ImageType image_type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    image_type
    +
    the image type: UndefinedType, BilevelType, GrayscaleType, GrayscaleMatteType, PaletteType, PaletteMatteType, TrueColorType, TrueColorMatteType, ColorSeparationType, ColorSeparationMatteType, or OptimizeType.
    + +
    +
    +

    MagickSetImageUnits

    + +

    MagickSetImageUnits() sets the image units of resolution.

    + +

    The format of the MagickSetImageUnits method is:

    + +
    +MagickBooleanType MagickSetImageUnits(MagickWand *wand,
    +  const ResolutionType units)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    units
    +
    the image units of resolution : UndefinedResolution, PixelsPerInchResolution, or PixelsPerCentimeterResolution.
    + +
    +
    +

    MagickSetImageVirtualPixelMethod

    + +

    MagickSetImageVirtualPixelMethod() sets the image virtual pixel method.

    + +

    The format of the MagickSetImageVirtualPixelMethod method is:

    + +
    +VirtualPixelMethod MagickSetImageVirtualPixelMethod(MagickWand *wand,
    +  const VirtualPixelMethod method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    method
    +
    the image virtual pixel method : UndefinedVirtualPixelMethod, ConstantVirtualPixelMethod, EdgeVirtualPixelMethod, MirrorVirtualPixelMethod, or TileVirtualPixelMethod.
    + +
    +
    +

    MagickSetImageWhitePoint

    + +

    MagickSetImageWhitePoint() sets the image chromaticity white point.

    + +

    The format of the MagickSetImageWhitePoint method is:

    + +
    +MagickBooleanType MagickSetImageWhitePoint(MagickWand *wand,
    +  const double x,const double y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the white x-point.
    + +
    +
    y
    +
    the white y-point.
    + +
    +
    +

    MagickShadeImage

    + +

    MagickShadeImage() shines a distant light on an image to create a three-dimensional effect. You control the positioning of the light with azimuth and elevation; azimuth is measured in degrees off the x axis and elevation is measured in pixels above the Z axis.

    + +

    The format of the MagickShadeImage method is:

    + +
    +MagickBooleanType MagickShadeImage(MagickWand *wand,
    +  const MagickBooleanType gray,const double azimuth,
    +  const double elevation)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    gray
    +
    A value other than zero shades the intensity of each pixel.
    + +
    +
    azimuth, elevation
    +
    Define the light source direction.
    + +
    +
    +

    MagickShadowImage

    + +

    MagickShadowImage() simulates an image shadow.

    + +

    The format of the MagickShadowImage method is:

    + +
    +MagickBooleanType MagickShadowImage(MagickWand *wand,
    +  const double opacity,const double sigma,const ssize_t x,const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    opacity
    +
    percentage transparency.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    x
    +
    the shadow x-offset.
    + +
    +
    y
    +
    the shadow y-offset.
    + +
    +
    +

    MagickSharpenImage

    + +

    MagickSharpenImage() sharpens an image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, the radius should be larger than sigma. Use a radius of 0 and MagickSharpenImage() selects a suitable radius for you.

    + +

    The format of the MagickSharpenImage method is:

    + +
    +MagickBooleanType MagickSharpenImage(MagickWand *wand,
    +  const double radius,const double sigma)
    +MagickBooleanType MagickSharpenImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double radius,const double sigma)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    +

    MagickShaveImage

    + +

    MagickShaveImage() shaves pixels from the image edges. It allocates the memory necessary for the new Image structure and returns a pointer to the new image.

    + +

    The format of the MagickShaveImage method is:

    + +
    +MagickBooleanType MagickShaveImage(MagickWand *wand,
    +  const size_t columns,const size_t rows)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    the number of columns in the scaled image.
    + +
    +
    rows
    +
    the number of rows in the scaled image.
    + +
    + +
    +
    +

    MagickShearImage

    + +

    MagickShearImage() slides one edge of an image along the X or Y axis, creating a parallelogram. An X direction shear slides an edge along the X axis, while a Y direction shear slides an edge along the Y axis. The amount of the shear is controlled by a shear angle. For X direction shears, x_shear is measured relative to the Y axis, and similarly, for Y direction shears y_shear is measured relative to the X axis. Empty triangles left over from shearing the image are filled with the background color.

    + +

    The format of the MagickShearImage method is:

    + +
    +MagickBooleanType MagickShearImage(MagickWand *wand,
    +  const PixelWand *background,const double x_shear,const double y_shear)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    background
    +
    the background pixel wand.
    + +
    +
    x_shear
    +
    the number of degrees to shear the image.
    + +
    +
    y_shear
    +
    the number of degrees to shear the image.
    + +
    +
    +

    MagickSigmoidalContrastImage

    + +

    MagickSigmoidalContrastImage() adjusts the contrast of an image with a non-linear sigmoidal contrast algorithm. Increase the contrast of the image using a sigmoidal transfer function without saturating highlights or shadows. Contrast indicates how much to increase the contrast (0 is none; 3 is typical; 20 is pushing it); mid-point indicates where midtones fall in the resultant image (0 is white; 50 is middle-gray; 100 is black). Set sharpen to MagickTrue to increase the image contrast otherwise the contrast is reduced.

    + +

    The format of the MagickSigmoidalContrastImage method is:

    + +
    +MagickBooleanType MagickSigmoidalContrastImage(MagickWand *wand,
    +  const MagickBooleanType sharpen,const double alpha,const double beta)
    +MagickBooleanType MagickSigmoidalContrastImageChannel(MagickWand *wand,
    +  const ChannelType channel,const MagickBooleanType sharpen,
    +  const double alpha,const double beta)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    Identify which channel to level: RedChannel, GreenChannel,
    + +
    +
    sharpen
    +
    Increase or decrease image contrast.
    + +
    +
    alpha
    +
    strength of the contrast, the larger the number the more 'threshold-like' it becomes.
    + +
    +
    beta
    +
    midpoint of the function as a color value 0 to QuantumRange.
    + +
    +
    +

    MagickSimilarityImage

    + +

    MagickSimilarityImage() compares the reference image of the image and returns the best match offset. In addition, it returns a similarity image such that an exact match location is completely white and if none of the pixels match, black, otherwise some gray level in-between.

    + +

    The format of the MagickSimilarityImage method is:

    + +
    +MagickWand *MagickSimilarityImage(MagickWand *wand,
    +  const MagickWand *reference,RectangeInfo *offset,double *similarity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    reference
    +
    the reference wand.
    + +
    +
    offset
    +
    the best match offset of the reference image within the image.
    + +
    +
    similarity
    +
    the computed similarity between the images.
    + +
    +
    +

    MagickSketchImage

    + +

    MagickSketchImage() simulates a pencil sketch. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and SketchImage() selects a suitable radius for you. Angle gives the angle of the blurring motion.

    + +

    The format of the MagickSketchImage method is:

    + +
    +MagickBooleanType MagickSketchImage(MagickWand *wand,
    +  const double radius,const double sigma,const double angle)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    angle
    +
    Apply the effect along this angle.
    + +
    +
    +

    MagickSmushImages

    + +

    MagickSmushImages() takes all images from the current image pointer to the end of the image list and smushs them to each other top-to-bottom if the stack parameter is true, otherwise left-to-right.

    + +

    The format of the MagickSmushImages method is:

    + +
    +MagickWand *MagickSmushImages(MagickWand *wand,
    +  const MagickBooleanType stack,const ssize_t offset)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    stack
    +
    By default, images are stacked left-to-right. Set stack to MagickTrue to stack them top-to-bottom.
    + +
    +
    offset
    +
    minimum distance in pixels between images.
    + +
    +
    +

    MagickSolarizeImage

    + +

    MagickSolarizeImage() applies a special effect to the image, similar to the effect achieved in a photo darkroom by selectively exposing areas of photo sensitive paper to light. Threshold ranges from 0 to QuantumRange and is a measure of the extent of the solarization.

    + +

    The format of the MagickSolarizeImage method is:

    + +
    +MagickBooleanType MagickSolarizeImage(MagickWand *wand,
    +  const double threshold)
    +MagickBooleanType MagickSolarizeImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double threshold)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    threshold
    +
    Define the extent of the solarization.
    + +
    +
    +

    MagickSparseColorImage

    + +

    MagickSparseColorImage(), given a set of coordinates, interpolates the colors found at those coordinates, across the whole image, using various methods.

    + +

    The format of the MagickSparseColorImage method is:

    + +
    +MagickBooleanType MagickSparseColorImage(MagickWand *wand,
    +  const ChannelType channel,const SparseColorMethod method,
    +  const size_t number_arguments,const double *arguments)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image to be sparseed.
    + +
    +
    method
    +
    the method of image sparseion.
    + +
    ArcSparseColorion will always ignore source image offset, and always 'bestfit' the destination image with the top left corner offset relative to the polar mapping center.
    + +
    Bilinear has no simple inverse mapping so will not allow 'bestfit' style of image sparseion.
    + +
    Affine, Perspective, and Bilinear, will do least squares fitting of the distrotion when more than the minimum number of control point pairs are provided.
    + +
    Perspective, and Bilinear, will fall back to a Affine sparseion when less than 4 control point pairs are provided. While Affine sparseions will let you use any number of control point pairs, that is Zero pairs is a No-Op (viewport only) distrotion, one pair is a translation and two pairs of control points will do a scale-rotate-translate, without any shearing.
    + +
    +
    number_arguments
    +
    the number of arguments given for this sparseion method.
    + +
    +
    arguments
    +
    the arguments for this sparseion method.
    + +
    +
    +

    MagickSpliceImage

    + +

    MagickSpliceImage() splices a solid color into the image.

    + +

    The format of the MagickSpliceImage method is:

    + +
    +MagickBooleanType MagickSpliceImage(MagickWand *wand,
    +  const size_t width,const size_t height,const ssize_t x,
    +  const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the region width.
    + +
    +
    height
    +
    the region height.
    + +
    +
    x
    +
    the region x offset.
    + +
    +
    y
    +
    the region y offset.
    + +
    +
    +

    MagickSpreadImage

    + +

    MagickSpreadImage() is a special effects method that randomly displaces each pixel in a block defined by the radius parameter.

    + +

    The format of the MagickSpreadImage method is:

    + +
    +MagickBooleanType MagickSpreadImage(MagickWand *wand,const double radius)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    radius
    +
    Choose a random pixel in a neighborhood of this extent.
    + +
    +
    +

    MagickStatisticImage

    + +

    MagickStatisticImage() replace each pixel with corresponding statistic from the neighborhood of the specified width and height.

    + +

    The format of the MagickStatisticImage method is:

    + +
    +MagickBooleanType MagickStatisticImage(MagickWand *wand,
    +  const StatisticType type,const double width,const size_t height)
    +MagickBooleanType MagickStatisticImageChannel(MagickWand *wand,
    +  const ChannelType channel,const StatisticType type,const double width,
    +  const size_t height)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    type
    +
    the statistic type (e.g. median, mode, etc.).
    + +
    +
    width
    +
    the width of the pixel neighborhood.
    + +
    +
    height
    +
    the height of the pixel neighborhood.
    + +
    +
    +

    MagickSteganoImage

    + +

    MagickSteganoImage() hides a digital watermark within the image. Recover the hidden watermark later to prove that the authenticity of an image. Offset defines the start position within the image to hide the watermark.

    + +

    The format of the MagickSteganoImage method is:

    + +
    +MagickWand *MagickSteganoImage(MagickWand *wand,
    +  const MagickWand *watermark_wand,const ssize_t offset)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    watermark_wand
    +
    the watermark wand.
    + +
    +
    offset
    +
    Start hiding at this offset into the image.
    + +
    +
    +

    MagickStereoImage

    + +

    MagickStereoImage() composites two images and produces a single image that is the composite of a left and right image of a stereo pair

    + +

    The format of the MagickStereoImage method is:

    + +
    +MagickWand *MagickStereoImage(MagickWand *wand,
    +  const MagickWand *offset_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    offset_wand
    +
    Another image wand.
    + +
    +
    +

    MagickStripImage

    + +

    MagickStripImage() strips an image of all profiles and comments.

    + +

    The format of the MagickStripImage method is:

    + +
    +MagickBooleanType MagickStripImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickSwirlImage

    + +

    MagickSwirlImage() swirls the pixels about the center of the image, where degrees indicates the sweep of the arc through which each pixel is moved. You get a more dramatic effect as the degrees move from 1 to 360.

    + +

    The format of the MagickSwirlImage method is:

    + +
    +MagickBooleanType MagickSwirlImage(MagickWand *wand,const double degrees)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    degrees
    +
    Define the tightness of the swirling effect.
    + +
    +
    +

    MagickTextureImage

    + +

    MagickTextureImage() repeatedly tiles the texture image across and down the image canvas.

    + +

    The format of the MagickTextureImage method is:

    + +
    +MagickWand *MagickTextureImage(MagickWand *wand,
    +  const MagickWand *texture_wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    texture_wand
    +
    the texture wand
    + +
    +
    +

    MagickThresholdImage

    + +

    MagickThresholdImage() changes the value of individual pixels based on the intensity of each pixel compared to threshold. The result is a high-contrast, two color image.

    + +

    The format of the MagickThresholdImage method is:

    + +
    +MagickBooleanType MagickThresholdImage(MagickWand *wand,
    +  const double threshold)
    +MagickBooleanType MagickThresholdImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double threshold)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    threshold
    +
    Define the threshold value.
    + +
    +
    +

    MagickThumbnailImage

    + +

    MagickThumbnailImage() changes the size of an image to the given dimensions and removes any associated profiles. The goal is to produce small low cost thumbnail images suited for display on the Web.

    + +

    The format of the MagickThumbnailImage method is:

    + +
    +MagickBooleanType MagickThumbnailImage(MagickWand *wand,
    +  const size_t columns,const size_t rows)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    the number of columns in the scaled image.
    + +
    +
    rows
    +
    the number of rows in the scaled image.
    + +
    +
    +

    MagickTintImage

    + +

    MagickTintImage() applies a color vector to each pixel in the image. The length of the vector is 0 for black and white and at its maximum for the midtones. The vector weighting function is f(x)=(1-(4.0*((x-0.5)*(x-0.5)))).

    + +

    The format of the MagickTintImage method is:

    + +
    +MagickBooleanType MagickTintImage(MagickWand *wand,
    +  const PixelWand *tint,const PixelWand *opacity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    tint
    +
    the tint pixel wand.
    + +
    +
    opacity
    +
    the opacity pixel wand.
    + +
    +
    +

    MagickTransformImage

    + +

    MagickTransformImage() is a convenience method that behaves like MagickResizeImage() or MagickCropImage() but accepts scaling and/or cropping information as a region geometry specification. If the operation fails, a NULL image handle is returned.

    + +

    The format of the MagickTransformImage method is:

    + +
    +MagickWand *MagickTransformImage(MagickWand *wand,const char *crop,
    +  const char *geometry)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    crop
    +
    A crop geometry string. This geometry defines a subregion of the image to crop.
    + +
    +
    geometry
    +
    An image geometry string. This geometry defines the final size of the image.
    + +
    +
    +

    MagickTransformImageColorspace

    + +

    MagickTransformImageColorspace() transform the image colorspace, setting the images colorspace while transforming the images data to that colorspace.

    + +

    The format of the MagickTransformImageColorspace method is:

    + +
    +MagickBooleanType MagickTransformImageColorspace(MagickWand *wand,
    +  const ColorspaceType colorspace)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    colorspace
    +
    the image colorspace: UndefinedColorspace, sRGBColorspace, RGBColorspace, GRAYColorspace, OHTAColorspace, XYZColorspace, YCbCrColorspace, YCCColorspace, YIQColorspace, YPbPrColorspace, YPbPrColorspace, YUVColorspace, CMYKColorspace, HSLColorspace, HWBColorspace.
    + +
    +
    +

    MagickTransparentPaintImage

    + +

    MagickTransparentPaintImage() changes any pixel that matches color with the color defined by fill.

    + +

    The format of the MagickTransparentPaintImage method is:

    + +
    +MagickBooleanType MagickTransparentPaintImage(MagickWand *wand,
    +  const PixelWand *target,const double alpha,const double fuzz,
    +  const MagickBooleanType invert)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    target
    +
    Change this target color to specified opacity value within the image.
    + +
    +
    alpha
    +
    the level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    invert
    +
    paint any pixel that does not match the target color.
    + +
    +
    +

    MagickTransposeImage

    + +

    MagickTransposeImage() creates a vertical mirror image by reflecting the pixels around the central x-axis while rotating them 90-degrees.

    + +

    The format of the MagickTransposeImage method is:

    + +
    +MagickBooleanType MagickTransposeImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickTransverseImage

    + +

    MagickTransverseImage() creates a horizontal mirror image by reflecting the pixels around the central y-axis while rotating them 270-degrees.

    + +

    The format of the MagickTransverseImage method is:

    + +
    +MagickBooleanType MagickTransverseImage(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickTrimImage

    + +

    MagickTrimImage() remove edges that are the background color from the image.

    + +

    The format of the MagickTrimImage method is:

    + +
    +MagickBooleanType MagickTrimImage(MagickWand *wand,const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    fuzz
    +
    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.
    + +
    +
    +

    MagickUniqueImageColors

    + +

    MagickUniqueImageColors() discards all but one of any pixel color.

    + +

    The format of the MagickUniqueImageColors method is:

    + +
    +MagickBooleanType MagickUniqueImageColors(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickUnsharpMaskImage

    + +

    MagickUnsharpMaskImage() sharpens an image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and UnsharpMaskImage() selects a suitable radius for you.

    + +

    The format of the MagickUnsharpMaskImage method is:

    + +
    +MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand,
    +  const double radius,const double sigma,const double amount,
    +  const double threshold)
    +MagickBooleanType MagickUnsharpMaskImageChannel(MagickWand *wand,
    +  const ChannelType channel,const double radius,const double sigma,
    +  const double amount,const double threshold)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    channel
    +
    the image channel(s).
    + +
    +
    radius
    +
    the radius of the Gaussian, in pixels, not counting the center pixel.
    + +
    +
    sigma
    +
    the standard deviation of the Gaussian, in pixels.
    + +
    +
    amount
    +
    the percentage of the difference between the original and the blur image that is added back into the original.
    + +
    +
    threshold
    +
    the threshold in pixels needed to apply the diffence amount.
    + +
    +
    +

    MagickVignetteImage

    + +

    MagickVignetteImage() softens the edges of the image in vignette style.

    + +

    The format of the MagickVignetteImage method is:

    + +
    +MagickBooleanType MagickVignetteImage(MagickWand *wand,
    +  const double black_point,const double white_point,const ssize_t x,
    +  const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    black_point
    +
    the black point.
    + +
    +
    white_point
    +
    the white point.
    + +
    +
    x, y
    +
    Define the x and y ellipse offset.
    + +
    +
    +

    MagickWaveImage

    + +

    MagickWaveImage() creates a "ripple" effect in the image by shifting the pixels vertically along a sine wave whose amplitude and wavelength is specified by the given parameters.

    + +

    The format of the MagickWaveImage method is:

    + +
    +MagickBooleanType MagickWaveImage(MagickWand *wand,
    +  const double amplitude,const double wave_length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    amplitude, wave_length
    +
    Define the amplitude and wave length of the sine wave.
    + +
    +
    +

    MagickWhiteThresholdImage

    + +

    MagickWhiteThresholdImage() is like ThresholdImage() but force all pixels above the threshold into white while leaving all pixels below the threshold unchanged.

    + +

    The format of the MagickWhiteThresholdImage method is:

    + +
    +MagickBooleanType MagickWhiteThresholdImage(MagickWand *wand,
    +  const PixelWand *threshold)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    threshold
    +
    the pixel wand.
    + +
    +
    +

    MagickWriteImage

    + +

    MagickWriteImage() writes an image to the specified filename. If the filename parameter is NULL, the image is written to the filename set by MagickReadImage() or MagickSetImageFilename().

    + +

    The format of the MagickWriteImage method is:

    + +
    +MagickBooleanType MagickWriteImage(MagickWand *wand,
    +  const char *filename)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    filename
    +
    the image filename.
    + +
    + +
    +
    +

    MagickWriteImageFile

    + +

    MagickWriteImageFile() writes an image to an open file descriptor.

    + +

    The format of the MagickWriteImageFile method is:

    + +
    +MagickBooleanType MagickWriteImageFile(MagickWand *wand,FILE *file)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    file
    +
    the file descriptor.
    + +
    +
    +

    MagickWriteImages

    + +

    MagickWriteImages() writes an image or image sequence.

    + +

    The format of the MagickWriteImages method is:

    + +
    +MagickBooleanType MagickWriteImages(MagickWand *wand,
    +  const char *filename,const MagickBooleanType adjoin)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    filename
    +
    the image filename.
    + +
    +
    adjoin
    +
    join images into a single multi-image file.
    + +
    +
    +

    MagickWriteImagesFile

    + +

    MagickWriteImagesFile() writes an image sequence to an open file descriptor.

    + +

    The format of the MagickWriteImagesFile method is:

    + +
    +MagickBooleanType MagickWriteImagesFile(MagickWand *wand,FILE *file)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    file
    +
    the file descriptor.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/magick-property.html b/ImageMagick-6.9.12-44/www/api/magick-property.html new file mode 100644 index 0000000..88ddf43 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/magick-property.html @@ -0,0 +1,1963 @@ + + + + + + + + + + ImageMagick (legacy) – MagickWand, C API: Property Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    MagickDeleteImageArtifactMagickDeleteImagePropertyMagickDeleteOptionMagickGetAntialiasMagickGetBackgroundColorMagickGetColorspaceMagickGetCompressionMagickGetCompressionQualityMagickGetCopyrightMagickGetFilenameMagickGetFontMagickGetFormatMagickGetGravityMagickGetHomeURLMagickGetImageArtifactMagickGetImageArtifactsMagickGetImageProfileMagickGetImageProfilesMagickGetImagePropertyMagickGetImagePropertiesMagickGetInterlaceSchemeMagickGetInterpolateMethodMagickGetOptionMagickGetOptionsMagickGetOrientationMagickGetPackageNameMagickGetPageMagickGetPointsizeMagickGetQuantumDepthMagickGetQuantumRangeMagickGetReleaseDateMagickGetResolutionMagickGetResourceMagickGetResourceLimitMagickGetSamplingFactorsMagickGetSizeMagickGetSizeOffsetMagickGetTypeMagickGetVersionMagickProfileImageMagickRemoveImageProfileMagickSetAntialiasMagickSetBackgroundColorMagickSetColorspaceMagickSetCompressionMagickSetCompressionQualityMagickSetDepthMagickSetExtractMagickSetFilenameMagickSetFontMagickSetFormatMagickSetGravityMagickSetImageArtifactMagickSetImageProfileMagickSetImagePropertyMagickSetInterlaceSchemeMagickSetInterpolateMethodMagickSetOptionMagickSetOrientationMagickSetPageMagickSetPassphraseMagickSetPointsizeMagickSetProgressMonitorMagickSetResourceLimitMagickSetResolutionMagickSetSamplingFactorsMagickSetSecurityPolicyMagickSetSizeMagickSetSizeOffsetMagickSetType

    + +

    MagickDeleteImageArtifact

    + +

    MagickDeleteImageArtifact() deletes a wand artifact.

    + +

    The format of the MagickDeleteImageArtifact method is:

    + +
    +MagickBooleanType MagickDeleteImageArtifact(MagickWand *wand,
    +  const char *artifact)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    artifact
    +
    the image artifact.
    + +
    +
    +

    MagickDeleteImageProperty

    + +

    MagickDeleteImageProperty() deletes a wand property.

    + +

    The format of the MagickDeleteImageProperty method is:

    + +
    +MagickBooleanType MagickDeleteImageProperty(MagickWand *wand,
    +  const char *property)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    property
    +
    the image property.
    + +
    +
    +

    MagickDeleteOption

    + +

    MagickDeleteOption() deletes a wand option.

    + +

    The format of the MagickDeleteOption method is:

    + +
    +MagickBooleanType MagickDeleteOption(MagickWand *wand,
    +  const char *option)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    option
    +
    the image option.
    + +
    +
    +

    MagickGetAntialias

    + +

    MagickGetAntialias() returns the antialias property associated with the wand.

    + +

    The format of the MagickGetAntialias method is:

    + +
    +MagickBooleanType MagickGetAntialias(const MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetBackgroundColor

    + +

    MagickGetBackgroundColor() returns the wand background color.

    + +

    The format of the MagickGetBackgroundColor method is:

    + +
    +PixelWand *MagickGetBackgroundColor(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetColorspace

    + +

    MagickGetColorspace() gets the wand colorspace type.

    + +

    The format of the MagickGetColorspace method is:

    + +
    +ColorspaceType MagickGetColorspace(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetCompression

    + +

    MagickGetCompression() gets the wand compression type.

    + +

    The format of the MagickGetCompression method is:

    + +
    +CompressionType MagickGetCompression(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetCompressionQuality

    + +

    MagickGetCompressionQuality() gets the wand compression quality.

    + +

    The format of the MagickGetCompressionQuality method is:

    + +
    +size_t MagickGetCompressionQuality(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetCopyright

    + +

    MagickGetCopyright() returns the ImageMagick API copyright as a string constant.

    + +

    The format of the MagickGetCopyright method is:

    + +
    +const char *MagickGetCopyright(void)
    +
    + +

    MagickGetFilename

    + +

    MagickGetFilename() returns the filename associated with an image sequence.

    + +

    The format of the MagickGetFilename method is:

    + +
    +const char *MagickGetFilename(const MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetFont

    + +

    MagickGetFont() returns the font associated with the MagickWand.

    + +

    The format of the MagickGetFont method is:

    + +
    +char *MagickGetFont(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetFormat

    + +

    MagickGetFormat() returns the format of the magick wand.

    + +

    The format of the MagickGetFormat method is:

    + +
    +const char MagickGetFormat(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetGravity

    + +

    MagickGetGravity() gets the wand gravity.

    + +

    The format of the MagickGetGravity method is:

    + +
    +GravityType MagickGetGravity(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetHomeURL

    + +

    MagickGetHomeURL() returns the ImageMagick home URL.

    + +

    The format of the MagickGetHomeURL method is:

    + +
    +char *MagickGetHomeURL(void)
    +
    + +

    MagickGetImageArtifact

    + +

    MagickGetImageArtifact() returns a value associated with the specified artifact. Use MagickRelinquishMemory() to free the value when you are finished with it.

    + +

    The format of the MagickGetImageArtifact method is:

    + +
    +char *MagickGetImageArtifact(MagickWand *wand,const char *artifact)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    artifact
    +
    the artifact.
    + +
    +
    +

    MagickGetImageArtifacts

    + +

    MagickGetImageArtifacts() returns all the artifact names that match the specified pattern associated with a wand. Use MagickGetImageProperty() to return the value of a particular artifact. Use MagickRelinquishMemory() to free the value when you are finished with it.

    + +

    The format of the MagickGetImageArtifacts method is:

    + +
    +char *MagickGetImageArtifacts(MagickWand *wand,
    +  const char *pattern,size_t *number_artifacts)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_artifacts
    +
    the number artifacts associated with this wand.
    + +
    +
    +

    MagickGetImageProfile

    + +

    MagickGetImageProfile() returns the named image profile.

    + +

    The format of the MagickGetImageProfile method is:

    + +
    +unsigned char *MagickGetImageProfile(MagickWand *wand,const char *name,
    +  size_t *length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    name
    +
    Name of profile to return: ICC, IPTC, or generic profile.
    + +
    +
    length
    +
    the length of the profile.
    + +
    +
    +

    MagickGetImageProfiles

    + +

    MagickGetImageProfiles() returns all the profile names that match the specified pattern associated with a wand. Use MagickGetImageProfile() to return the value of a particular property. Use MagickRelinquishMemory() to free the value when you are finished with it.

    + +

    The format of the MagickGetImageProfiles method is:

    + +
    +char *MagickGetImageProfiles(MagickWand *wand,const char *pattern,
    +  size_t *number_profiles)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_profiles
    +
    the number profiles associated with this wand.
    + +
    +
    +

    MagickGetImageProperty

    + +

    MagickGetImageProperty() returns a value associated with the specified property. Use MagickRelinquishMemory() to free the value when you are finished with it.

    + +

    The format of the MagickGetImageProperty method is:

    + +
    +char *MagickGetImageProperty(MagickWand *wand,const char *property)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    property
    +
    the property.
    + +
    +
    +

    MagickGetImageProperties

    + +

    MagickGetImageProperties() returns all the property names that match the specified pattern associated with a wand. Use MagickGetImageProperty() to return the value of a particular property. Use MagickRelinquishMemory() to free the value when you are finished with it.

    + +

    The format of the MagickGetImageProperties method is:

    + +
    +char *MagickGetImageProperties(MagickWand *wand,
    +  const char *pattern,size_t *number_properties)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_properties
    +
    the number properties associated with this wand.
    + +
    +
    +

    MagickGetInterlaceScheme

    + +

    MagickGetInterlaceScheme() gets the wand interlace scheme.

    + +

    The format of the MagickGetInterlaceScheme method is:

    + +
    +InterlaceType MagickGetInterlaceScheme(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetInterpolateMethod

    + +

    MagickGetInterpolateMethod() gets the wand compression.

    + +

    The format of the MagickGetInterpolateMethod method is:

    + +
    +InterpolatePixelMethod MagickGetInterpolateMethod(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetOption

    + +

    MagickGetOption() returns a value associated with a wand and the specified key. Use MagickRelinquishMemory() to free the value when you are finished with it.

    + +

    The format of the MagickGetOption method is:

    + +
    +char *MagickGetOption(MagickWand *wand,const char *key)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    key
    +
    the key.
    + +
    +
    +

    MagickGetOptions

    + +

    MagickGetOptions() returns all the option names that match the specified pattern associated with a wand. Use MagickGetOption() to return the value of a particular option. Use MagickRelinquishMemory() to free the value when you are finished with it.

    + +

    The format of the MagickGetOptions method is:

    + +
    +char *MagickGetOptions(MagickWand *wand,const char *pattern,,
    +  size_t *number_options)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_options
    +
    the number options associated with this wand.
    + +
    +
    +

    MagickGetOrientation

    + +

    MagickGetOrientation() gets the wand orientation type.

    + +

    The format of the MagickGetOrientation method is:

    + +
    +OrientationType MagickGetOrientation(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetPackageName

    + +

    MagickGetPackageName() returns the ImageMagick package name as a string constant.

    + +

    The format of the MagickGetPackageName method is:

    + +
    +const char *MagickGetPackageName(void)
    +
    + + +

    MagickGetPage

    + +

    MagickGetPage() returns the page geometry associated with the magick wand.

    + +

    The format of the MagickGetPage method is:

    + +
    +MagickBooleanType MagickGetPage(const MagickWand *wand,
    +  size_t *width,size_t *height,ssize_t *x,ssize_t *y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the page width.
    + +
    +
    height
    +
    page height.
    + +
    +
    x
    +
    the page x-offset.
    + +
    +
    y
    +
    the page y-offset.
    + +
    +
    +

    MagickGetPointsize

    + +

    MagickGetPointsize() returns the font pointsize associated with the MagickWand.

    + +

    The format of the MagickGetPointsize method is:

    + +
    +double MagickGetPointsize(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetQuantumDepth

    + +

    MagickGetQuantumDepth() returns the ImageMagick quantum depth as a string constant.

    + +

    The format of the MagickGetQuantumDepth method is:

    + +
    +const char *MagickGetQuantumDepth(size_t *depth)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    depth
    +
    the quantum depth is returned as a number.
    + +
    +
    +

    MagickGetQuantumRange

    + +

    MagickGetQuantumRange() returns the ImageMagick quantum range as a string constant.

    + +

    The format of the MagickGetQuantumRange method is:

    + +
    +const char *MagickGetQuantumRange(size_t *range)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    range
    +
    the quantum range is returned as a number.
    + +
    +
    +

    MagickGetReleaseDate

    + +

    MagickGetReleaseDate() returns the ImageMagick release date as a string constant.

    + +

    The format of the MagickGetReleaseDate method is:

    + +
    +const char *MagickGetReleaseDate(void)
    +
    + +

    MagickGetResolution

    + +

    MagickGetResolution() gets the image X and Y resolution.

    + +

    The format of the MagickGetResolution method is:

    + +
    +MagickBooleanType MagickGetResolution(const MagickWand *wand,double *x,
    +  double *y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x
    +
    the x-resolution.
    + +
    +
    y
    +
    the y-resolution.
    + +
    +
    +

    MagickGetResource

    + +

    MagickGetResource() returns the specified resource in megabytes.

    + +

    The format of the MagickGetResource method is:

    + +
    +MagickSizeType MagickGetResource(const ResourceType type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetResourceLimit

    + +

    MagickGetResourceLimit() returns the specified resource limit in megabytes.

    + +

    The format of the MagickGetResourceLimit method is:

    + +
    +MagickSizeType MagickGetResourceLimit(const ResourceType type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetSamplingFactors

    + +

    MagickGetSamplingFactors() gets the horizontal and vertical sampling factor.

    + +

    The format of the MagickGetSamplingFactors method is:

    + +
    +double *MagickGetSamplingFactor(MagickWand *wand,
    +  size_t *number_factors)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    number_factors
    +
    the number of factors in the returned array.
    + +
    +
    +

    MagickGetSize

    + +

    MagickGetSize() returns the size associated with the magick wand.

    + +

    The format of the MagickGetSize method is:

    + +
    +MagickBooleanType MagickGetSize(const MagickWand *wand,
    +  size_t *columns,size_t *rows)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    the width in pixels.
    + +
    +
    height
    +
    the height in pixels.
    + +
    +
    +

    MagickGetSizeOffset

    + +

    MagickGetSizeOffset() returns the size offset associated with the magick wand.

    + +

    The format of the MagickGetSizeOffset method is:

    + +
    +MagickBooleanType MagickGetSizeOffset(const MagickWand *wand,
    +  ssize_t *offset)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    offset
    +
    the image offset.
    + +
    +
    +

    MagickGetType

    + +

    MagickGetType() returns the wand type.

    + +

    The format of the MagickGetType method is:

    + +
    +ImageType MagickGetType(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetVersion

    + +

    MagickGetVersion() returns the ImageMagick API version as a string constant and as a number.

    + +

    The format of the MagickGetVersion method is:

    + +
    +const char *MagickGetVersion(size_t *version)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    version
    +
    the ImageMagick version is returned as a number.
    + +
    +
    +

    MagickProfileImage

    + +

    MagickProfileImage() adds or removes a ICC, IPTC, or generic profile from an image. If the profile is NULL, it is removed from the image otherwise added. Use a name of '*' and a profile of NULL to remove all profiles from the image.

    + +

    The format of the MagickProfileImage method is:

    + +
    +MagickBooleanType MagickProfileImage(MagickWand *wand,const char *name,
    +  const void *profile,const size_t length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    name
    +
    Name of profile to add or remove: ICC, IPTC, or generic profile.
    + +
    +
    profile
    +
    the profile.
    + +
    +
    length
    +
    the length of the profile.
    + +
    +
    +

    MagickRemoveImageProfile

    + +

    MagickRemoveImageProfile() removes the named image profile and returns it.

    + +

    The format of the MagickRemoveImageProfile method is:

    + +
    +unsigned char *MagickRemoveImageProfile(MagickWand *wand,
    +  const char *name,size_t *length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    name
    +
    Name of profile to return: ICC, IPTC, or generic profile.
    + +
    +
    length
    +
    the length of the profile.
    + +
    +
    +

    MagickSetAntialias

    + +

    MagickSetAntialias() sets the antialias propery of the wand.

    + +

    The format of the MagickSetAntialias method is:

    + +
    +MagickBooleanType MagickSetAntialias(MagickWand *wand,
    +  const MagickBooleanType antialias)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    antialias
    +
    the antialias property.
    + +
    +
    +

    MagickSetBackgroundColor

    + +

    MagickSetBackgroundColor() sets the wand background color.

    + +

    The format of the MagickSetBackgroundColor method is:

    + +
    +MagickBooleanType MagickSetBackgroundColor(MagickWand *wand,
    +  const PixelWand *background)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    background
    +
    the background pixel wand.
    + +
    +
    +

    MagickSetColorspace

    + +

    MagickSetColorspace() sets the wand colorspace type.

    + +

    The format of the MagickSetColorspace method is:

    + +
    +MagickBooleanType MagickSetColorspace(MagickWand *wand,
    +  const ColorspaceType colorspace)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    colorspace
    +
    the wand colorspace.
    + +
    +
    +

    MagickSetCompression

    + +

    MagickSetCompression() sets the wand compression type.

    + +

    The format of the MagickSetCompression method is:

    + +
    +MagickBooleanType MagickSetCompression(MagickWand *wand,
    +  const CompressionType compression)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    compression
    +
    the wand compression.
    + +
    +
    +

    MagickSetCompressionQuality

    + +

    MagickSetCompressionQuality() sets the wand compression quality.

    + +

    The format of the MagickSetCompressionQuality method is:

    + +
    +MagickBooleanType MagickSetCompressionQuality(MagickWand *wand,
    +  const size_t quality)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    quality
    +
    the wand compression quality.
    + +
    +
    +

    MagickSetDepth

    + +

    MagickSetDepth() sets the wand pixel depth.

    + +

    The format of the MagickSetDepth method is:

    + +
    +MagickBooleanType MagickSetDepth(MagickWand *wand,
    +  const size_t depth)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    depth
    +
    the wand pixel depth.
    + +
    +
    +

    MagickSetExtract

    + +

    MagickSetExtract() sets the extract geometry before you read or write an image file. Use it for inline cropping (e.g. 200x200+0+0) or resizing (e.g.200x200).

    + +

    The format of the MagickSetExtract method is:

    + +
    +MagickBooleanType MagickSetExtract(MagickWand *wand,
    +  const char *geometry)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    geometry
    +
    the extract geometry.
    + +
    +
    +

    MagickSetFilename

    + +

    MagickSetFilename() sets the filename before you read or write an image file.

    + +

    The format of the MagickSetFilename method is:

    + +
    +MagickBooleanType MagickSetFilename(MagickWand *wand,
    +  const char *filename)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    filename
    +
    the image filename.
    + +
    +
    +

    MagickSetFont

    + +

    MagickSetFont() sets the font associated with the MagickWand.

    + +

    The format of the MagickSetFont method is:

    + +
    +MagickBooleanType MagickSetFont(MagickWand *wand, const char *font)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    font
    +
    the font
    + +
    +
    +

    MagickSetFormat

    + +

    MagickSetFormat() sets the format of the magick wand.

    + +

    The format of the MagickSetFormat method is:

    + +
    +MagickBooleanType MagickSetFormat(MagickWand *wand,const char *format)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    format
    +
    the image format.
    + +
    +
    +

    MagickSetGravity

    + +

    MagickSetGravity() sets the gravity type.

    + +

    The format of the MagickSetGravity type is:

    + +
    +MagickBooleanType MagickSetGravity(MagickWand *wand,
    +  const GravityType type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    type
    +
    the gravity type.
    + +
    +
    +

    MagickSetImageArtifact

    + +

    MagickSetImageArtifact() sets a key-value pair in the image artifact namespace. Artifacts differ from properties. Properties are public and are generally exported to an external image format if the format supports it. Artifacts are private and are utilized by the internal ImageMagick API to modify the behavior of certain algorithms.

    + +

    The format of the MagickSetImageArtifact method is:

    + +
    +MagickBooleanType MagickSetImageArtifact(MagickWand *wand,
    +  const char *artifact,const char *value)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    artifact
    +
    the artifact.
    + +
    +
    value
    +
    the value.
    + +
    +
    +

    MagickSetImageProfile

    + +

    MagickSetImageProfile() adds a named profile to the magick wand. If a profile with the same name already exists, it is replaced. This method differs from the MagickProfileImage() method in that it does not apply any CMS color profiles.

    + +

    The format of the MagickSetImageProfile method is:

    + +
    +MagickBooleanType MagickSetImageProfile(MagickWand *wand,
    +  const char *name,const void *profile,const size_t length)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    name
    +
    Name of profile to add or remove: ICC, IPTC, or generic profile.
    + +
    +
    profile
    +
    the profile.
    + +
    +
    length
    +
    the length of the profile.
    + +
    +
    +

    MagickSetImageProperty

    + +

    MagickSetImageProperty() associates a property with an image.

    + +

    The format of the MagickSetImageProperty method is:

    + +
    +MagickBooleanType MagickSetImageProperty(MagickWand *wand,
    +  const char *property,const char *value)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    property
    +
    the property.
    + +
    +
    value
    +
    the value.
    + +
    +
    +

    MagickSetInterlaceScheme

    + +

    MagickSetInterlaceScheme() sets the image compression.

    + +

    The format of the MagickSetInterlaceScheme method is:

    + +
    +MagickBooleanType MagickSetInterlaceScheme(MagickWand *wand,
    +  const InterlaceType interlace_scheme)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    interlace_scheme
    +
    the image interlace scheme: NoInterlace, LineInterlace, PlaneInterlace, PartitionInterlace.
    + +
    +
    +

    MagickSetInterpolateMethod

    + +

    MagickSetInterpolateMethod() sets the interpolate pixel method.

    + +

    The format of the MagickSetInterpolateMethod method is:

    + +
    +MagickBooleanType MagickSetInterpolateMethod(MagickWand *wand,
    +  const InterpolateMethodPixel method)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    method
    +
    the interpolate pixel method.
    + +
    +
    +

    MagickSetOption

    + +

    MagickSetOption() associates one or options with the wand (.e.g MagickSetOption(wand,"jpeg:perserve","yes")).

    + +

    The format of the MagickSetOption method is:

    + +
    +MagickBooleanType MagickSetOption(MagickWand *wand,const char *key,
    +  const char *value)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    key
    +
    The key.
    + +
    +
    value
    +
    The value.
    + +
    +
    +

    MagickSetOrientation

    + +

    MagickSetOrientation() sets the wand orientation type.

    + +

    The format of the MagickSetOrientation method is:

    + +
    +MagickBooleanType MagickSetOrientation(MagickWand *wand,
    +  const OrientationType orientation)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    orientation
    +
    the wand orientation.
    + +
    +
    +

    MagickSetPage

    + +

    MagickSetPage() sets the page geometry of the magick wand.

    + +

    The format of the MagickSetPage method is:

    + +
    +MagickBooleanType MagickSetPage(MagickWand *wand,
    +  const size_t width,const size_t height,const ssize_t x,
    +  const ssize_t y)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    width
    +
    the page width.
    + +
    +
    height
    +
    the page height.
    + +
    +
    x
    +
    the page x-offset.
    + +
    +
    y
    +
    the page y-offset.
    + +
    +
    +

    MagickSetPassphrase

    + +

    MagickSetPassphrase() sets the passphrase.

    + +

    The format of the MagickSetPassphrase method is:

    + +
    +MagickBooleanType MagickSetPassphrase(MagickWand *wand,
    +  const char *passphrase)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    passphrase
    +
    the passphrase.
    + +
    +
    +

    MagickSetPointsize

    + +

    MagickSetPointsize() sets the font pointsize associated with the MagickWand.

    + +

    The format of the MagickSetPointsize method is:

    + +
    +MagickBooleanType MagickSetPointsize(MagickWand *wand,
    +  const double pointsize)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    pointsize
    +
    the size of the font
    + +
    +
    +

    MagickSetProgressMonitor

    + +

    MagickSetProgressMonitor() sets the wand progress monitor to the specified method and returns the previous progress monitor if any. The progress monitor method looks like this:

    + +
    +    MagickBooleanType MagickProgressMonitor(const char *text,
    +const MagickOffsetType offset,const MagickSizeType span,
    +void *client_data)
    +
    + +

    If the progress monitor returns MagickFalse, the current operation is interrupted.

    + +

    The format of the MagickSetProgressMonitor method is:

    + +
    +MagickProgressMonitor MagickSetProgressMonitor(MagickWand *wand
    +  const MagickProgressMonitor progress_monitor,void *client_data)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    progress_monitor
    +
    Specifies a pointer to a method to monitor progress of an image operation.
    + +
    +
    client_data
    +
    Specifies a pointer to any client data.
    + +
    +
    +

    MagickSetResourceLimit

    + +

    MagickSetResourceLimit() sets the limit for a particular resource in megabytes.

    + +

    The format of the MagickSetResourceLimit method is:

    + +
    +MagickBooleanType MagickSetResourceLimit(const ResourceType type,
    +  const MagickSizeType limit)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    type
    +
    the type of resource: AreaResource, MemoryResource, MapResource, DiskResource, FileResource.
    + +
    o The maximum limit for the resource.
    + +
    +
    +

    MagickSetResolution

    + +

    MagickSetResolution() sets the image resolution.

    + +

    The format of the MagickSetResolution method is:

    + +
    +MagickBooleanType MagickSetResolution(MagickWand *wand,
    +  const double x_resolution,const double y_resolution)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x_resolution
    +
    the image x resolution.
    + +
    +
    y_resolution
    +
    the image y resolution.
    + +
    +
    +

    MagickSetSamplingFactors

    + +

    MagickSetSamplingFactors() sets the image sampling factors.

    + +

    The format of the MagickSetSamplingFactors method is:

    + +
    +MagickBooleanType MagickSetSamplingFactors(MagickWand *wand,
    +  const size_t number_factors,const double *sampling_factors)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    number_factoes
    +
    the number of factors.
    + +
    +
    sampling_factors
    +
    An array of doubles representing the sampling factor for each color component (in RGB order).
    + +
    +
    +

    MagickSetSecurityPolicy

    + +

    MagickSetSecurityPolicy() sets the ImageMagick security policy. It returns MagickFalse if the policy is already set or if the policy does not parse.

    + +

    The format of the MagickSetAntialias method is:

    + +
    +MagickBooleanType MagickSetAntialias(MagickWand *wand,
    +  const char *policy)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    policy
    +
    the security policy in the XML format.
    + +
    +
    +

    MagickSetSize

    + +

    MagickSetSize() sets the size of the magick wand. Set it before you read a raw image format such as RGB, GRAY, or CMYK.

    + +

    The format of the MagickSetSize method is:

    + +
    +MagickBooleanType MagickSetSize(MagickWand *wand,
    +  const size_t columns,const size_t rows)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    the width in pixels.
    + +
    +
    rows
    +
    the rows in pixels.
    + +
    +
    +

    MagickSetSizeOffset

    + +

    MagickSetSizeOffset() sets the size and offset of the magick wand. Set it before you read a raw image format such as RGB, GRAY, or CMYK.

    + +

    The format of the MagickSetSizeOffset method is:

    + +
    +MagickBooleanType MagickSetSizeOffset(MagickWand *wand,
    +  const size_t columns,const size_t rows,
    +  const ssize_t offset)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    columns
    +
    the image width in pixels.
    + +
    +
    rows
    +
    the image rows in pixels.
    + +
    +
    offset
    +
    the image offset.
    + +
    +
    +

    MagickSetType

    + +

    MagickSetType() sets the image type attribute.

    + +

    The format of the MagickSetType method is:

    + +
    +MagickBooleanType MagickSetType(MagickWand *wand,
    +  const ImageType image_type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    image_type
    +
    the image type: UndefinedType, BilevelType, GrayscaleType, GrayscaleMatteType, PaletteType, PaletteMatteType, TrueColorType, TrueColorMatteType, ColorSeparationType, ColorSeparationMatteType, or OptimizeType.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/magick-wand.html b/ImageMagick-6.9.12-44/www/api/magick-wand.html new file mode 100644 index 0000000..2dc9858 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/magick-wand.html @@ -0,0 +1,708 @@ + + + + + + + + + + ImageMagick (legacy) – MagickWand, C API: Wand Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    ClearMagickWandCloneMagickWandDestroyMagickWandIsMagickWandMagickClearExceptionMagickGetExceptionMagickGetExceptionTypeMagickGetIteratorIndexMagickQueryConfigureOptionMagickQueryConfigureOptionsMagickQueryFontMetricsMagickQueryMultilineFontMetricsMagickQueryFontsMagickQueryFormatsMagickRelinquishMemoryMagickResetIteratorMagickSetFirstIteratorMagickSetIteratorIndexMagickSetLastIteratorMagickWandGenesisMagickWandTerminusNewMagickWandNewMagickWandFromImageIsMagickWandInstantiated

    + +

    ClearMagickWand

    + +

    ClearMagickWand() clears resources associated with the wand, leaving the wand blank, and ready to be used for a new set of images.

    + +

    The format of the ClearMagickWand method is:

    + +
    +void ClearMagickWand(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    CloneMagickWand

    + +

    CloneMagickWand() makes an exact copy of the specified wand.

    + +

    The format of the CloneMagickWand method is:

    + +
    +MagickWand *CloneMagickWand(const MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    DestroyMagickWand

    + +

    DestroyMagickWand() deallocates memory associated with an MagickWand.

    + +

    The format of the DestroyMagickWand method is:

    + +
    +MagickWand *DestroyMagickWand(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    IsMagickWand

    + +

    IsMagickWand() returns MagickTrue if the wand is verified as a magick wand.

    + +

    The format of the IsMagickWand method is:

    + +
    +MagickBooleanType IsMagickWand(const MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickClearException

    + +

    MagickClearException() clears any exceptions associated with the wand.

    + +

    The format of the MagickClearException method is:

    + +
    +MagickBooleanType MagickClearException(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetException

    + +

    MagickGetException() returns the severity, reason, and description of any error that occurs when using other methods in this API.

    + +

    The format of the MagickGetException method is:

    + +
    +char *MagickGetException(const MagickWand *wand,ExceptionType *severity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    severity
    +
    the severity of the error is returned here.
    + +
    +
    +

    MagickGetExceptionType

    + +

    MagickGetExceptionType() returns the exception type associated with the wand. If no exception has occurred, UndefinedExceptionType is returned.

    + +

    The format of the MagickGetExceptionType method is:

    + +
    +ExceptionType MagickGetExceptionType(const MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickGetIteratorIndex

    + +

    MagickGetIteratorIndex() returns the position of the iterator in the image list.

    + +

    The format of the MagickGetIteratorIndex method is:

    + +
    +ssize_t MagickGetIteratorIndex(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickQueryConfigureOption

    + +

    MagickQueryConfigureOption() returns the value associated with the specified configure option.

    + +

    The format of the MagickQueryConfigureOption function is:

    + +
    +char *MagickQueryConfigureOption(const char *option)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    option
    +
    the option name.
    + +
    +
    +

    MagickQueryConfigureOptions

    + +

    MagickQueryConfigureOptions() returns any configure options that match the specified pattern (e.g. "*" for all). Options include NAME, VERSION, LIB_VERSION, etc.

    + +

    The format of the MagickQueryConfigureOptions function is:

    + +
    +char **MagickQueryConfigureOptions(const char *pattern,
    +  size_t *number_options)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_options
    +
    Returns the number of configure options in the list.
    + +
    + +
    +
    +

    MagickQueryFontMetrics

    + +

    MagickQueryFontMetrics() returns a 13 element array representing the following font metrics:

    + +
    +    Element Description
    +    -------------------------------------------------
    +    0 character width
    +    1 character height
    +    2 ascender
    +    3 descender
    +    4 text width
    +    5 text height
    +    6 maximum horizontal advance
    +    7 bounding box: x1
    +    8 bounding box: y1
    +    9 bounding box: x2
    +   10 bounding box: y2
    +   11 origin: x
    +   12 origin: y
    +
    + +

    The format of the MagickQueryFontMetrics method is:

    + +
    +double *MagickQueryFontMetrics(MagickWand *wand,
    +  const DrawingWand *drawing_wand,const char *text)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the Magick wand.
    + +
    +
    drawing_wand
    +
    the drawing wand.
    + +
    +
    text
    +
    the text.
    + +
    +
    +

    MagickQueryMultilineFontMetrics

    + +

    MagickQueryMultilineFontMetrics() returns a 13 element array representing the following font metrics:

    + +
    +    Element Description
    +    -------------------------------------------------
    +    0 character width
    +    1 character height
    +    2 ascender
    +    3 descender
    +    4 text width
    +    5 text height
    +    6 maximum horizontal advance
    +    7 bounding box: x1
    +    8 bounding box: y1
    +    9 bounding box: x2
    +   10 bounding box: y2
    +   11 origin: x
    +   12 origin: y
    +
    + +

    This method is like MagickQueryFontMetrics() but it returns the maximum text width and height for multiple lines of text.

    + +

    The format of the MagickQueryFontMetrics method is:

    + +
    +double *MagickQueryMultilineFontMetrics(MagickWand *wand,
    +  const DrawingWand *drawing_wand,const char *text)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the Magick wand.
    + +
    +
    drawing_wand
    +
    the drawing wand.
    + +
    +
    text
    +
    the text.
    + +
    +
    +

    MagickQueryFonts

    + +

    MagickQueryFonts() returns any font that match the specified pattern (e.g. "*" for all).

    + +

    The format of the MagickQueryFonts function is:

    + +
    +char **MagickQueryFonts(const char *pattern,size_t *number_fonts)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_fonts
    +
    Returns the number of fonts in the list.
    + +
    + +
    +
    +

    MagickQueryFormats

    + +

    MagickQueryFormats() returns any image formats that match the specified pattern (e.g. "*" for all).

    + +

    The format of the MagickQueryFormats function is:

    + +
    +char **MagickQueryFormats(const char *pattern,size_t *number_formats)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_formats
    +
    This integer returns the number of image formats in the list.
    + +
    +
    +

    MagickRelinquishMemory

    + +

    MagickRelinquishMemory() relinquishes memory resources returned by such methods as MagickIdentifyImage(), MagickGetException(), etc.

    + +

    The format of the MagickRelinquishMemory method is:

    + +
    +void *MagickRelinquishMemory(void *resource)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    resource
    +
    Relinquish the memory associated with this resource.
    + +
    +
    +

    MagickResetIterator

    + +

    MagickResetIterator() resets the wand iterator.

    + +

    It is typically used either before iterating though images, or before calling specific functions such as MagickAppendImages() to append all images together.

    + +

    Afterward you can use MagickNextImage() to iterate over all the images in a wand container, starting with the first image.

    + +

    Using this before MagickAddImages() or MagickReadImages() will cause new images to be inserted between the first and second image.

    + +

    The format of the MagickResetIterator method is:

    + +
    +void MagickResetIterator(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickSetFirstIterator

    + +

    MagickSetFirstIterator() sets the wand iterator to the first image.

    + +

    After using any images added to the wand using MagickAddImage() or MagickReadImage() will be prepended before any image in the wand.

    + +

    Also the current image has been set to the first image (if any) in the Magick Wand. Using MagickNextImage() will then set teh current image to the second image in the list (if present).

    + +

    This operation is similar to MagickResetIterator() but differs in how MagickAddImage(), MagickReadImage(), and MagickNextImage() behaves afterward.

    + +

    The format of the MagickSetFirstIterator method is:

    + +
    +void MagickSetFirstIterator(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickSetIteratorIndex

    + +

    MagickSetIteratorIndex() set the iterator to the given position in the image list specified with the index parameter. A zero index will set the first image as current, and so on. Negative indexes can be used to specify an image relative to the end of the images in the wand, with -1 being the last image in the wand.

    + +

    If the index is invalid (range too large for number of images in wand) the function will return MagickFalse, but no 'exception' will be raised, as it is not actually an error. In that case the current image will not change.

    + +

    After using any images added to the wand using MagickAddImage() or MagickReadImage() will be added after the image indexed, regardless of if a zero (first image in list) or negative index (from end) is used.

    + +

    Jumping to index 0 is similar to MagickResetIterator() but differs in how MagickNextImage() behaves afterward.

    + +

    The format of the MagickSetIteratorIndex method is:

    + +
    +MagickBooleanType MagickSetIteratorIndex(MagickWand *wand,
    +  const ssize_t index)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    index
    +
    the scene number.
    + +
    +
    +

    MagickSetLastIterator

    + +

    MagickSetLastIterator() sets the wand iterator to the last image.

    + +

    The last image is actually the current image, and the next use of MagickPreviousImage() will not change this allowing this function to be used to iterate over the images in the reverse direction. In this sense it is more like MagickResetIterator() than MagickSetFirstIterator().

    + +

    Typically this function is used before MagickAddImage(), MagickReadImage() functions to ensure new images are appended to the very end of wand's image list.

    + +

    The format of the MagickSetLastIterator method is:

    + +
    +void MagickSetLastIterator(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    MagickWandGenesis

    + +

    MagickWandGenesis() initializes the MagickWand environment.

    + +

    The format of the MagickWandGenesis method is:

    + +
    +void MagickWandGenesis(void)
    +
    + +

    MagickWandTerminus

    + +

    MagickWandTerminus() terminates the MagickWand environment.

    + +

    The format of the MagickWandTerminus method is:

    + +
    +void MagickWandTerminus(void)
    +
    + +

    NewMagickWand

    + +

    NewMagickWand() returns a wand required for all other methods in the API. A fatal exception is thrown if there is not enough memory to allocate the wand. Use DestroyMagickWand() to dispose of the wand when it is no longer needed.

    + +

    The format of the NewMagickWand method is:

    + +
    +MagickWand *NewMagickWand(void)
    +
    + +

    NewMagickWandFromImage

    + +

    NewMagickWandFromImage() returns a wand with an image.

    + +

    The format of the NewMagickWandFromImage method is:

    + +
    +MagickWand *NewMagickWandFromImage(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    IsMagickWandInstantiated

    + +

    IsMagickWandInstantiated() returns MagickTrue if the ImageMagick environment is currently instantiated-- that is, MagickWandGenesis() has been called but MagickWandTerminus() has not.

    + +

    The format of the IsMagickWandInstantiated method is:

    + +
    +MagickBooleanType IsMagickWandInstantiated(void)
    +
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/magick.html b/ImageMagick-6.9.12-44/www/api/magick.html new file mode 100644 index 0000000..daca087 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/magick.html @@ -0,0 +1,207 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Read or List Image formats + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    GetMagickPrecisionIsMagickCoreInstantiatedMagickCoreGenesisMagickCoreTerminusSetMagickPrecision

    + +

    GetMagickPrecision

    + +

    GetMagickPrecision() returns the maximum number of significant digits to be printed.

    + +

    The format of the GetMagickPrecision method is:

    + +
    +int GetMagickPrecision(void)
    +
    + +

    IsMagickCoreInstantiated

    + +

    IsMagickCoreInstantiated() returns MagickTrue if the ImageMagick environment is currently instantiated-- that is, MagickCoreGenesis() has been called but MagickCoreTerminus() has not.

    + +

    The format of the IsMagickCoreInstantiated method is:

    + +
    +MagickBooleanType IsMagickCoreInstantiated(void)
    +
    + +

    MagickCoreGenesis

    + +

    MagickCoreGenesis() initializes the MagickCore environment.

    + +

    The format of the MagickCoreGenesis function is:

    + +
    +MagickCoreGenesis(const char *path,
    +  const MagickBooleanType establish_signal_handlers)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    path
    +
    the execution path of the current ImageMagick client.
    + +
    +
    establish_signal_handlers
    +
    set to MagickTrue to use MagickCore's own signal handlers for common signals.
    + +
    +
    +

    MagickCoreTerminus

    + +

    MagickCoreTerminus() destroys the MagickCore environment.

    + +

    The format of the MagickCoreTerminus function is:

    + +
    +MagickCoreTerminus(void)
    +
    + +

    SetMagickPrecision

    + +

    SetMagickPrecision() sets the maximum number of significant digits to be printed.

    + +

    An input argument of 0 returns the current precision setting.

    + +

    A negative value forces the precision to reset to a default value according to the environment variable "MAGICK_PRECISION", the current 'policy' configuration setting, or the default value of '6', in that order.

    + +

    The format of the SetMagickPrecision method is:

    + +
    +int SetMagickPrecision(const int precision)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    precision
    +
    set the maximum number of significant digits to be printed.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/memory.html b/ImageMagick-6.9.12-44/www/api/memory.html new file mode 100644 index 0000000..bcfe9c4 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/memory.html @@ -0,0 +1,556 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Memory Allocation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireCriticalMemoryAcquireAlignedMemoryAcquireMagickMemoryAcquireCriticalMemoryAcquireQuantumMemoryAcquireVirtualMemoryCopyMagickMemoryGetMagickMemoryMethodsGetVirtualMemoryBlobRelinquishAlignedMemoryRelinquishMagickMemoryRelinquishVirtualMemoryResetMagickMemoryResizeMagickMemoryResizeQuantumMemorySetMagickAlignedMemoryMethodsSetMagickMemoryMethods

    + +

    AcquireCriticalMemory

    + +

    AcquireCriticalMemory(): allocate a small memory request with AcquireMagickMemory(), however, on fail throw a fatal exception and exit. Free the memory reserve with RelinquishMagickMemory(). AcquireAlignedMemory(): allocate a small memory request that is aligned on a cache line. On fail, return NULL for possible recovery. Free the memory reserve with RelinquishMagickMemory(). AcquireMagickMemory()/ResizeMagickMemory(): allocate a small to medium memory request, typically with malloc()/realloc(). On fail, return NULL for possible recovery. Free the memory reserve with RelinquishMagickMemory(). AcquireQuantumMemory()/ResizeQuantumMemory(): allocate a small to medium memory request. This is a secure memory allocator as it accepts two parameters, count and quantum, to ensure the request does not overflow. It also check to ensure the request does not exceed the maximum memory per the security policy. Free the memory reserve with RelinquishMagickMemory(). AcquireVirtualMemory(): allocate a large memory request either in heap, memory-mapped, or memory-mapped on disk depending on whether heap allocation fails or if the request exceeds the maximum memory policy. Free the memory reserve with RelinquishVirtualMemory(). ResetMagickMemory(): fills the bytes of the memory area with a constant byte.

    + +

    In addition, we provide hooks for your own memory constructor/destructors.

    +
    utilize our internal custom allocator as follows
    +

    Segregate our memory requirements from any program that calls our API. This should help reduce the risk of others changing our program state or causing memory corruption.

    + +

    Our custom memory allocation manager implements a best-fit allocation policy using segregated free lists. It uses a linear distribution of size classes for lower sizes and a power of two distribution of size classes at higher sizes. It is based on the paper, "Fast Memory Allocation using Lazy Fits." written by Yoo C. Chung.

    + +

    By default, C's standard library is used (e.g. malloc); use the custom memory allocator by defining MAGICKCORE_ANONYMOUS_MEMORY_SUPPORT to allocate memory with private anonymous mapping rather than from the heap.

    + +

    AcquireAlignedMemory

    + +

    AcquireAlignedMemory() returns a pointer to a block of memory whose size is at least (count*quantum) bytes, and whose address is aligned on a cache line.

    + +

    The format of the AcquireAlignedMemory method is:

    + +
    +void *AcquireAlignedMemory(const size_t count,const size_t quantum)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    count
    +
    the number of objects to allocate contiguously.
    + +
    +
    quantum
    +
    the size (in bytes) of each object.
    + +
    +
    +

    AcquireMagickMemory

    + +

    AcquireMagickMemory() returns a pointer to a block of memory at least size bytes suitably aligned for any use.

    + +

    The format of the AcquireMagickMemory method is:

    + +
    +void *AcquireMagickMemory(const size_t size)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    size
    +
    the size of the memory in bytes to allocate.
    + +
    +
    +

    AcquireCriticalMemory

    + +

    AcquireCriticalMemory() is just like AcquireMagickMemory(), throws a fatal exception if the memory cannot be acquired.

    + +

    That is, AcquireCriticalMemory() returns a pointer to a block of memory that is at least size bytes, and that is suitably aligned for any use; however, if this is not possible, it throws an exception and terminates the program as unceremoniously as possible.

    + +

    The format of the AcquireCriticalMemory method is:

    + +
    +void *AcquireCriticalMemory(const size_t size)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    size
    +
    the size (in bytes) of the memory to allocate.
    + +
    +
    +

    AcquireQuantumMemory

    + +

    AcquireQuantumMemory() returns a pointer to a block of memory at least count * quantum bytes suitably aligned for any use.

    + +

    The format of the AcquireQuantumMemory method is:

    + +
    +void *AcquireQuantumMemory(const size_t count,const size_t quantum)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    count
    +
    the number of objects to allocate contiguously.
    + +
    +
    quantum
    +
    the size (in bytes) of each object.
    + +
    +
    +

    AcquireVirtualMemory

    + +

    AcquireVirtualMemory() allocates a pointer to a block of memory at least size bytes suitably aligned for any use. In addition to heap, it also supports memory-mapped and file-based memory-mapped memory requests.

    + +

    The format of the AcquireVirtualMemory method is:

    + +
    +MemoryInfo *AcquireVirtualMemory(const size_t count,const size_t quantum)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    count
    +
    the number of objects to allocate contiguously.
    + +
    +
    quantum
    +
    the size (in bytes) of each object.
    + +
    +
    +

    CopyMagickMemory

    + +

    CopyMagickMemory() copies size bytes from memory area source to the destination. Copying between objects that overlap will take place correctly. It returns destination.

    + +

    The format of the CopyMagickMemory method is:

    + +
    +void *CopyMagickMemory(void *magick_restrict destination,
    +  const void *magick_restrict source,const size_t size)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    destination
    +
    the destination.
    + +
    +
    source
    +
    the source.
    + +
    +
    size
    +
    the size of the memory in bytes to allocate.
    + +
    +
    +

    GetMagickMemoryMethods

    + +

    GetMagickMemoryMethods() gets the methods to acquire, resize, and destroy memory.

    + +

    The format of the GetMagickMemoryMethods() method is:

    + +
    +void GetMagickMemoryMethods(AcquireMemoryHandler *acquire_memory_handler,
    +  ResizeMemoryHandler *resize_memory_handler,
    +  DestroyMemoryHandler *destroy_memory_handler)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    acquire_memory_handler
    +
    method to acquire memory (e.g. malloc).
    + +
    +
    resize_memory_handler
    +
    method to resize memory (e.g. realloc).
    + +
    +
    destroy_memory_handler
    +
    method to destroy memory (e.g. free).
    + +
    +
    +

    GetVirtualMemoryBlob

    + +

    GetVirtualMemoryBlob() returns the virtual memory blob associated with the specified MemoryInfo structure.

    + +

    The format of the GetVirtualMemoryBlob method is:

    + +
    +void *GetVirtualMemoryBlob(const MemoryInfo *memory_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    memory_info
    +
    The MemoryInfo structure.
    +
    +

    RelinquishAlignedMemory

    + +

    RelinquishAlignedMemory() frees memory acquired with AcquireAlignedMemory() or reuse.

    + +

    The format of the RelinquishAlignedMemory method is:

    + +
    +void *RelinquishAlignedMemory(void *memory)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    memory
    +
    A pointer to a block of memory to free for reuse.
    + +
    +
    +

    RelinquishMagickMemory

    + +

    RelinquishMagickMemory() frees memory acquired with AcquireMagickMemory() or AcquireQuantumMemory() for reuse.

    + +

    The format of the RelinquishMagickMemory method is:

    + +
    +void *RelinquishMagickMemory(void *memory)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    memory
    +
    A pointer to a block of memory to free for reuse.
    + +
    +
    +

    RelinquishVirtualMemory

    + +

    RelinquishVirtualMemory() frees memory acquired with AcquireVirtualMemory().

    + +

    The format of the RelinquishVirtualMemory method is:

    + +
    +MemoryInfo *RelinquishVirtualMemory(MemoryInfo *memory_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    memory_info
    +
    A pointer to a block of memory to free for reuse.
    + +
    +
    +

    ResetMagickMemory

    + +

    ResetMagickMemory() fills the first size bytes of the memory area pointed to by memory with the constant byte c. We use a volatile pointer when updating the byte string. Most compilers will avoid optimizing away access to a volatile pointer, even if the pointer appears to be unused after the call.

    + +

    The format of the ResetMagickMemory method is:

    + +
    +void *ResetMagickMemory(void *memory,int c,const size_t size)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    memory
    +
    a pointer to a memory allocation.
    + +
    +
    c
    +
    set the memory to this value.
    + +
    +
    size
    +
    size of the memory to reset.
    + +
    +
    +

    ResizeMagickMemory

    + +

    ResizeMagickMemory() changes the size of the memory and returns a pointer to the (possibly moved) block. The contents will be unchanged up to the lesser of the new and old sizes.

    + +

    The format of the ResizeMagickMemory method is:

    + +
    +void *ResizeMagickMemory(void *memory,const size_t size)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    memory
    +
    A pointer to a memory allocation.
    + +
    +
    size
    +
    the new size of the allocated memory.
    + +
    +
    +

    ResizeQuantumMemory

    + +

    ResizeQuantumMemory() changes the size of the memory and returns a pointer to the (possibly moved) block. The contents will be unchanged up to the lesser of the new and old sizes.

    + +

    The format of the ResizeQuantumMemory method is:

    + +
    +void *ResizeQuantumMemory(void *memory,const size_t count,
    +  const size_t quantum)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    memory
    +
    A pointer to a memory allocation.
    + +
    +
    count
    +
    the number of objects to allocate contiguously.
    + +
    +
    quantum
    +
    the size (in bytes) of each object.
    + +
    +
    +

    SetMagickAlignedMemoryMethods

    + +

    SetMagickAlignedMemoryMethods() sets the methods to acquire and relinquish aligned memory.

    + +

    The format of the SetMagickAlignedMemoryMethods() method is:

    + +
    +SetMagickAlignedMemoryMethods(
    +  AcquireAlignedMemoryHandler acquire_aligned_memory_handler,
    +  RelinquishAlignedMemoryHandler relinquish_aligned_memory_handler)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    acquire_memory_handler
    +
    method to acquire aligned memory.
    + +
    +
    relinquish_aligned_memory_handler
    +
    method to relinquish aligned memory.
    + +
    +
    +

    SetMagickMemoryMethods

    + +

    SetMagickMemoryMethods() sets the methods to acquire, resize, and destroy memory. Your custom memory methods must be set prior to the MagickCoreGenesis() method.

    + +

    The format of the SetMagickMemoryMethods() method is:

    + +
    +SetMagickMemoryMethods(AcquireMemoryHandler acquire_memory_handler,
    +  ResizeMemoryHandler resize_memory_handler,
    +  DestroyMemoryHandler destroy_memory_handler)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    acquire_memory_handler
    +
    method to acquire memory (e.g. malloc).
    + +
    +
    resize_memory_handler
    +
    method to resize memory (e.g. realloc).
    + +
    +
    destroy_memory_handler
    +
    method to destroy memory (e.g. free).
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/mime.html b/ImageMagick-6.9.12-44/www/api/mime.html new file mode 100644 index 0000000..40c65e2 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/mime.html @@ -0,0 +1,275 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Mime Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireMimeCacheGetMimeInfoListGetMimeListGetMimeDescriptionGetMimeTypeListMimeInfo

    + +

    AcquireMimeCache

    + +

    AcquireMimeCache() caches one or more magic configurations which provides a mapping between magic attributes and a magic name.

    + +

    The format of the AcquireMimeCache method is:

    + +
    +LinkedListInfo *AcquireMimeCache(const char *filename,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    filename
    +
    the font file name.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetMimeInfoList

    + +

    GetMimeInfoList() returns any image aliases that match the specified pattern.

    + +

    The magic of the GetMimeInfoList function is:

    + +
    +const MimeInfo **GetMimeInfoList(const char *pattern,
    +  size_t *number_aliases,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_aliases
    +
    This integer returns the number of magics in the list.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetMimeList

    + +

    GetMimeList() returns any image format alias that matches the specified pattern.

    + +

    The format of the GetMimeList function is:

    + +
    +char **GetMimeList(const char *pattern,size_t *number_aliases,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_aliases
    +
    This integer returns the number of image format aliases in the list.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetMimeDescription

    + +

    GetMimeDescription() returns the mime type description.

    + +

    The format of the GetMimeDescription method is:

    + +
    +const char *GetMimeDescription(const MimeInfo *mime_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    mime_info
    +
    The magic info.
    + +
    +
    +

    GetMimeType

    + +

    GetMimeType() returns the mime type.

    + +

    The format of the GetMimeType method is:

    + +
    +const char *GetMimeType(const MimeInfo *mime_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    mime_info
    +
    The magic info.
    + +
    +
    +

    ListMimeInfo

    + +

    ListMimeInfo() lists the magic info to a file.

    + +

    The format of the ListMimeInfo method is:

    + +
    +MagickBooleanType ListMimeInfo(FILE *file,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    file
    +

    An pointer to a FILE.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/module.html b/ImageMagick-6.9.12-44/www/api/module.html new file mode 100644 index 0000000..530d747 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/module.html @@ -0,0 +1,547 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Loadable Modules + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireModuleInfoDestroyModuleListGetModuleInfoGetModuleInfoListGetModuleListGetMagickModulePathIsModuleTreeInstantiatedInvokeDynamicImageFilterListModuleInfoOpenModuleOpenModulesRegisterModuleTagToCoderModuleNameTagToFilterModuleNameTagToModuleNameUnregisterModule

    + +

    AcquireModuleInfo

    + +

    AcquireModuleInfo() allocates the ModuleInfo structure.

    + +

    The format of the AcquireModuleInfo method is:

    + +
    +ModuleInfo *AcquireModuleInfo(const char *path,const char *tag)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    path
    +
    the path associated with the tag.
    + +
    +
    tag
    +
    a character string that represents the image format we are looking for.
    + +
    +
    +

    DestroyModuleList

    + +

    DestroyModuleList() unregisters any previously loaded modules and exits the module loaded environment.

    + +

    The format of the DestroyModuleList module is:

    + +
    +void DestroyModuleList(void)
    +
    + +

    GetModuleInfo

    + +

    GetModuleInfo() returns a pointer to a ModuleInfo structure that matches the specified tag. If tag is NULL, the head of the module list is returned. If no modules are loaded, or the requested module is not found, NULL is returned.

    + +

    The format of the GetModuleInfo module is:

    + +
    +ModuleInfo *GetModuleInfo(const char *tag,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    tag
    +
    a character string that represents the image format we are looking for.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetModuleInfoList

    + +

    GetModuleInfoList() returns any modules that match the specified pattern.

    + +

    The format of the GetModuleInfoList function is:

    + +
    +const ModuleInfo **GetModuleInfoList(const char *pattern,
    +  size_t *number_modules,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    number_modules
    +
    This integer returns the number of modules in the list.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetModuleList

    + +

    GetModuleList() returns any image format modules that match the specified pattern.

    + +

    The format of the GetModuleList function is:

    + +
    +char **GetModuleList(const char *pattern,const MagickModuleType type,
    +  size_t *number_modules,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    pattern
    +
    Specifies a pointer to a text string containing a pattern.
    + +
    +
    type
    +
    choose from MagickImageCoderModule or MagickImageFilterModule.
    + +
    +
    number_modules
    +
    This integer returns the number of modules in the list.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetMagickModulePath

    + +

    GetMagickModulePath() finds a module with the specified module type and filename.

    + +

    The format of the GetMagickModulePath module is:

    + +
    +MagickBooleanType GetMagickModulePath(const char *filename,
    +  MagickModuleType module_type,char *path,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    filename
    +
    the module file name.
    + +
    +
    module_type
    +
    the module type: MagickImageCoderModule or MagickImageFilterModule.
    + +
    +
    path
    +
    the path associated with the filename.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    IsModuleTreeInstantiated

    + +

    IsModuleTreeInstantiated() determines if the module tree is instantiated. If not, it instantiates the tree and returns it.

    + +

    The format of the IsModuleTreeInstantiated() method is:

    + +
    +MagickBooleanType IsModuleTreeInstantiated(Exceptioninfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    InvokeDynamicImageFilter

    + +

    InvokeDynamicImageFilter() invokes a dynamic image filter.

    + +

    The format of the InvokeDynamicImageFilter module is:

    + +
    +MagickBooleanType InvokeDynamicImageFilter(const char *tag,Image **image,
    +  const int argc,const char **argv,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    tag
    +
    a character string that represents the name of the particular module.
    + +
    +
    image
    +
    the image.
    + +
    +
    argc
    +
    a pointer to an integer describing the number of elements in the argument vector.
    + +
    +
    argv
    +
    a pointer to a text array containing the command line arguments.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ListModuleInfo

    + +

    ListModuleInfo() lists the module info to a file.

    + +

    The format of the ListModuleInfo module is:

    + +
    +MagickBooleanType ListModuleInfo(FILE *file,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    file
    +

    An pointer to a FILE.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    OpenModule

    + +

    OpenModule() loads a module, and invokes its registration module. It returns MagickTrue on success, and MagickFalse if there is an error.

    + +

    The format of the OpenModule module is:

    + +
    +MagickBooleanType OpenModule(const char *module,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    module
    +
    a character string that indicates the module to load.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    OpenModules

    + +

    OpenModules() loads all available modules.

    + +

    The format of the OpenModules module is:

    + +
    +MagickBooleanType OpenModules(ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    RegisterModule

    + +

    RegisterModule() adds an entry to the module list. It returns a pointer to the registered entry on success.

    + +

    The format of the RegisterModule module is:

    + +
    +ModuleInfo *RegisterModule(const ModuleInfo *module_info,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    info
    +
    a pointer to the registered entry is returned.
    + +
    +
    module_info
    +
    a pointer to the ModuleInfo structure to register.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    TagToCoderModuleName

    + +

    TagToCoderModuleName() munges a module tag and obtains the filename of the corresponding module.

    + +

    The format of the TagToCoderModuleName module is:

    + +
    +char *TagToCoderModuleName(const char *tag,char *name)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    tag
    +
    a character string representing the module tag.
    + +
    +
    name
    +
    return the module name here.
    + +
    +
    +

    TagToFilterModuleName

    + +

    TagToFilterModuleName() munges a module tag and returns the filename of the corresponding filter module.

    + +

    The format of the TagToFilterModuleName module is:

    + +
    +void TagToFilterModuleName(const char *tag,char name)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    tag
    +
    a character string representing the module tag.
    + +
    +
    name
    +
    return the filter name here.
    + +
    +
    +

    TagToModuleName

    + +

    TagToModuleName() munges the module tag name and returns an upper-case tag name as the input string, and a user-provided format.

    + +

    The format of the TagToModuleName module is:

    + +
    +TagToModuleName(const char *tag,const char *format,char *module)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    tag
    +
    the module tag.
    + +
    +
    format
    +
    a sprintf-compatible format string containing s where the upper-case tag name is to be inserted.
    + +
    +
    module
    +
    pointer to a destination buffer for the formatted result.
    + +
    +
    +

    UnregisterModule

    + +

    UnregisterModule() unloads a module, and invokes its de-registration module. Returns MagickTrue on success, and MagickFalse if there is an error.

    + +

    The format of the UnregisterModule module is:

    + +
    +MagickBooleanType UnregisterModule(const ModuleInfo *module_info,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    module_info
    +
    the module info.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/mogrify.html b/ImageMagick-6.9.12-44/www/api/mogrify.html new file mode 100644 index 0000000..c2333fe --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/mogrify.html @@ -0,0 +1,168 @@ + + + + + + + + + + ImageMagick (legacy) – MagickWand, C API: Command-line Interface + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    MagickCommandGenesis

    + +

    MagickCommandGenesis

    + +

    MagickCommandGenesis() applies image processing options to an image as prescribed by command line options.

    + +

    The format of the MagickCommandGenesis method is:

    + +
    +MagickBooleanType MagickCommandGenesis(ImageInfo *image_info,
    +  MagickCommand command,int argc,char **argv,char **metadata,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    command
    +
    Choose from ConvertImageCommand, IdentifyImageCommand, MogrifyImageCommand, CompositeImageCommand, CompareImageCommand, ConjureImageCommand, StreamImageCommand, ImportImageCommand, DisplayImageCommand, or AnimateImageCommand.
    + +
    +
    argc
    +
    Specifies a pointer to an integer describing the number of elements in the argument vector.
    + +
    +
    argv
    +
    Specifies a pointer to a text array containing the command line arguments.
    + +
    +
    metadata
    +
    any metadata is returned here.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/monitor.html b/ImageMagick-6.9.12-44/www/api/monitor.html new file mode 100644 index 0000000..f7df999 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/monitor.html @@ -0,0 +1,237 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Monitor the Progress of an Image Operation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    SetImageProgressSetImageProgressMonitorSetImageInfoProgressMonitor

    + +

    SetImageProgress

    + +

    SetImageProgress() returns the progress of an image processing operation.

    + +

    The format of the SetImageProgress method is:

    + +
    +    MagickBooleanType SetImageProgress(const char *text,
    +const MagickOffsetType offset,const MagickSizeType extent)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    text
    +
    description of the image processing operation.
    + +
    +
    offset
    +
    the offset relative to the extent parameter.
    + +
    +
    extent
    +
    the extent of the progress.
    + +
    +
    +

    SetImageProgressMonitor

    + +

    SetImageProgressMonitor() sets the image progress monitor to the specified method and returns the previous progress monitor if any. The progress monitor method looks like this:

    + +
    +    MagickBooleanType MagickProgressMonitor(const char *text,
    +const MagickOffsetType offset,const MagickSizeType extent,
    +void *client_data)
    +
    + +

    If the progress monitor returns MagickFalse, the current operation is interrupted.

    + +

    The format of the SetImageProgressMonitor method is:

    + +
    +MagickProgressMonitor SetImageProgressMonitor(Image *image,
    +  const MagickProgressMonitor progress_monitor,void *client_data)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    progress_monitor
    +
    Specifies a pointer to a method to monitor progress of an image operation.
    + +
    +
    client_data
    +
    Specifies a pointer to any client data.
    + +
    +
    +

    SetImageInfoProgressMonitor

    + +

    SetImageInfoProgressMonitor() sets the image_info progress monitor to the specified method and returns the previous progress monitor if any. The progress monitor method looks like this:

    + +
    +    MagickBooleanType MagickProgressMonitor(const char *text,
    +const MagickOffsetType offset,const MagickSizeType extent,
    +void *client_data)
    +
    + +

    If the progress monitor returns MagickFalse, the current operation is interrupted.

    + +

    The format of the SetImageInfoProgressMonitor method is:

    + +
    +MagickProgressMonitor SetImageInfoProgressMonitor(ImageInfo *image_info,
    +  const MagickProgressMonitor progress_monitor,void *client_data)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    progress_monitor
    +
    Specifies a pointer to a method to monitor progress of an image operation.
    + +
    +
    client_data
    +
    Specifies a pointer to any client data.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/montage.html b/ImageMagick-6.9.12-44/www/api/montage.html new file mode 100644 index 0000000..b2118e3 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/montage.html @@ -0,0 +1,124 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Create an Image Thumbnail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    + +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/morphology.html b/ImageMagick-6.9.12-44/www/api/morphology.html new file mode 100644 index 0000000..1685ae6 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/morphology.html @@ -0,0 +1,487 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Morphological Erosions, Dilations, Openings, and Closings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireKernelInfoCloneKernelInfoDestroyKernelInfoMorphologyApplyMorphologyImageChannelScaleGeometryKernelInfoScaleKernelInfoShowKernelInfoUnityAddKernelInfoZeroKernelNans

    + +

    AcquireKernelInfo

    + +

    AcquireKernelInfo() takes the given string (generally supplied by the user) and converts it into a Morphology/Convolution Kernel. This allows users to specify a kernel from a number of pre-defined kernels, or to fully specify their own kernel for a specific Convolution or Morphology Operation.

    + +

    The kernel so generated can be any rectangular array of floating point values (doubles) with the 'control point' or 'pixel being affected' anywhere within that array of values.

    + +

    Previously IM was restricted to a square of odd size using the exact center as origin, this is no longer the case, and any rectangular kernel with any value being declared the origin. This in turn allows the use of highly asymmetrical kernels.

    + +

    The floating point values in the kernel can also include a special value known as 'nan' or 'not a number' to indicate that this value is not part of the kernel array. This allows you to shaped the kernel within its rectangular area. That is 'nan' values provide a 'mask' for the kernel shape. However at least one non-nan value must be provided for correct working of a kernel.

    + +

    The returned kernel should be freed using the DestroyKernelInfo method when you are finished with it. Do not free this memory yourself.

    + +

    Input kernel defintion strings can consist of any of three types.

    + +

    "name:args[[@><]" Select from one of the built in kernels, using the name and geometry arguments supplied. See AcquireKernelBuiltIn()

    + +

    "WxH[+X+Y][@><]:num, num, num ..." a kernel of size W by H, with W*H floating point numbers following. the 'center' can be optionally be defined at +X+Y (such that +0+0 is top left corner). If not defined the pixel in the center, for odd sizes, or to the immediate top or left of center for even sizes is automatically selected.

    + +

    "num, num, num, num, ..." list of floating point numbers defining an 'old style' odd sized square kernel. At least 9 values should be provided for a 3x3 square kernel, 25 for a 5x5 square kernel, 49 for 7x7, etc. Values can be space or comma separated. This is not recommended.

    + +

    You can define a 'list of kernels' which can be used by some morphology operators A list is defined as a semi-colon separated list kernels.

    + +

    " kernel ; kernel ; kernel ; "

    + +

    Any extra ';' characters, at start, end or between kernel defintions are simply ignored.

    + +

    The special flags will expand a single kernel, into a list of rotated kernels. A '@' flag will expand a 3x3 kernel into a list of 45-degree cyclic rotations, while a '>' will generate a list of 90-degree rotations. The '<' also exands using 90-degree rotates, but giving a 180-degree reflected kernel before the +/- 90-degree rotations, which can be important for Thinning operations.

    + +

    Note that 'name' kernels will start with an alphabetic character while the new kernel specification has a ':' character in its specification string. If neither is the case, it is assumed an old style of a simple list of numbers generating a odd-sized square kernel has been given.

    + +

    The format of the AcquireKernal method is:

    + +
    +KernelInfo *AcquireKernelInfo(const char *kernel_string)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    kernel_string
    +
    the Morphology/Convolution kernel wanted.
    + +
    +
    +

    CloneKernelInfo

    + +

    CloneKernelInfo() creates a new clone of the given Kernel List so that its can be modified without effecting the original. The cloned kernel should be destroyed using DestoryKernelInfo() when no longer needed.

    + +

    The format of the CloneKernelInfo method is:

    + +
    +KernelInfo *CloneKernelInfo(const KernelInfo *kernel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    kernel
    +
    the Morphology/Convolution kernel to be cloned
    + +
    +
    +

    DestroyKernelInfo

    + +

    DestroyKernelInfo() frees the memory used by a Convolution/Morphology kernel.

    + +

    The format of the DestroyKernelInfo method is:

    + +
    +KernelInfo *DestroyKernelInfo(KernelInfo *kernel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    kernel
    +
    the Morphology/Convolution kernel to be destroyed
    + +
    +
    +

    MorphologyApply

    + +

    MorphologyApply() applies a morphological method, multiple times using a list of multiple kernels. This is the method that should be called by other 'operators' that internally use morphology operations as part of their processing.

    + +

    It is basically equivalent to as MorphologyImage() (see below) but without any user controls. This allows internel programs to use this function, to actually perform a specific task without possible interference by any API user supplied settings.

    + +

    It is MorphologyImage() task to extract any such user controls, and pass them to this function for processing.

    + +

    More specifically all given kernels should already be scaled, normalised, and blended appropriatally before being parred to this routine. The appropriate bias, and compose (typically 'UndefinedComposeOp') given.

    + +

    The format of the MorphologyApply method is:

    + +
    +Image *MorphologyApply(const Image *image,MorphologyMethod method,
    +  const ChannelType channel, const ssize_t iterations,
    +  const KernelInfo *kernel, const CompositeMethod compose,
    +  const double bias, ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the source image
    + +
    +
    method
    +
    the morphology method to be applied.
    + +
    +
    channel
    +
    the channels to which the operations are applied The channel 'sync' flag determines if 'alpha weighting' is applied for convolution style operations.
    + +
    +
    iterations
    +
    apply the operation this many times (or no change). A value of -1 means loop until no change found. How this is applied may depend on the morphology method. Typically this is a value of 1.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    kernel
    +
    An array of double representing the morphology kernel.
    + +
    +
    compose
    +
    How to handle or merge multi-kernel results. If 'UndefinedCompositeOp' use default for the Morphology method. If 'NoCompositeOp' force image to be re-iterated by each kernel. Otherwise merge the results using the compose method given.
    + +
    +
    bias
    +
    Convolution Output Bias.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    MorphologyImageChannel

    + +

    MorphologyImageChannel() applies a user supplied kernel to the image according to the given mophology method.

    + +

    This function applies any and all user defined settings before calling the above internal function MorphologyApply().

    + +

    User defined settings include... * Output Bias for Convolution and correlation ("-bias" or "-define convolve:bias=??") * Kernel Scale/normalize settings ("-set 'option:convolve:scale'") This can also includes the addition of a scaled unity kernel. * Show Kernel being applied ("-set option:showKernel 1")

    + +

    The format of the MorphologyImage method is:

    + +
    +Image *MorphologyImage(const Image *image,MorphologyMethod method,
    +  const ssize_t iterations,KernelInfo *kernel,ExceptionInfo *exception)
    +
    + +

    Image *MorphologyImageChannel(const Image *image, const ChannelType channel,MorphologyMethod method,const ssize_t iterations, KernelInfo *kernel,ExceptionInfo *exception)

    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    method
    +
    the morphology method to be applied.
    + +
    +
    iterations
    +
    apply the operation this many times (or no change). A value of -1 means loop until no change found. How this is applied may depend on the morphology method. Typically this is a value of 1.
    + +
    +
    channel
    +
    the channel type.
    + +
    +
    kernel
    +
    An array of double representing the morphology kernel. Warning: kernel may be normalized for the Convolve method.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ScaleGeometryKernelInfo

    + +

    ScaleGeometryKernelInfo() takes a geometry argument string, typically provided as a "-set option:convolve:scale {geometry}" user setting, and modifies the kernel according to the parsed arguments of that setting.

    + +

    The first argument (and any normalization flags) are passed to ScaleKernelInfo() to scale/normalize the kernel. The second argument is then passed to UnityAddKernelInfo() to add a scled unity kernel into the scaled/normalized kernel.

    + +

    The format of the ScaleGeometryKernelInfo method is:

    + +
    +void ScaleGeometryKernelInfo(KernelInfo *kernel,
    +  const double scaling_factor,const MagickStatusType normalize_flags)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    kernel
    +
    the Morphology/Convolution kernel to modify
    + +
    o geometry:
    + +
    +       "-set option:convolve:scale {geometry}" setting.
    +
    + +

    +

    Magick::Blob

    +

    Blob provides the means to contain any opaque data. It is named after the term "Binary Large OBject" commonly used to describe unstructured data (such as encoded images) which is stored in a database. While the function of Blob is very simple (store a pointer and size associated with allocated data), the Blob class provides some very useful capabilities. In particular, it is fully reference counted just like the Image class.

    +

    The Blob class supports value assignment while preserving any outstanding earlier versions of the object. Since assignment is via a pointer internally, Blob is efficient enough to be stored directly in an STL container or any other data structure which requires assignment. In particular, by storing a Blob in an associative container (such as STL's 'map') it is possible to create simple indexed in-memory "database" of Blobs.

    +

    Magick++ currently uses Blob to contain encoded images (e.g. JPEG) as well as ICC and IPTC profiles. Since Blob is a general-purpose class, it may be used for other purposes as well.

    +

    The methods Blob provides are shown in the following table:

    +
    +

    Blob Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Method

    +

    Return Type

    +

    Signature(s)

    +

    Description

    +

    Blob

    +

    void

    +

    Default constructor

    +

    const void* data_, size_t length_

    +

    Construct object with data, making a copy of the supplied data

    +

    const Blob& blob_

    +

    Copy constructor (reference counted)

    +

    operator=

    +

    Blob

    +

    const Blob& blob_

    +

    Assignment operator (reference counted)

    +

    update

    +

    void

    +

    const void* data_, size_t length_

    +

    Update object contents, making a copy of the supplied data. Any existing data in the object is deallocated.

    +

    data

    +

    const void*

    +

    void

    +

    Obtain pointer to data

    +

    length

    +

    size_t

    +

    void

    +

    Obtain data length

    +

    updateNoCopy

    +

    void

    +

    void* data_, size_t length_, Blob::Allocator allocator_ = Blob::NewAllocator

    +

    Update object contents, using supplied pointer directly (no copy) Any existing data in the object is deallocated. The user must ensure that the pointer supplied is not deleted or otherwise modified after it has been supplied to this method. The optional allocator_ parameter allows the user to specify if the C (MallocAllocator) or C++ (NewAllocator) memory allocation system was used to allocate the memory. The default is to use the C++ memory allocator.

    +
    +

    <6EU-9!HV%$$mkm5X8m!E7l+fv_;`tvqacz8_jXPXD z9g`Kc>*2u5>ZlC5oX*mJCjYE%k$S$7E%=B?V#lEQag$>7_QwMm<8l(IlNP)=b>{6w z-y&WTBH@Y1Ai_E+kh1HU)nEaLvZqZCW}W~FUj+K#_pa(a*%T0!KVxhYQX*LVDQEVg zcjZ*mm-|JdQFdF&zTKCu5qpb<)bX|X=d!p9+1AY~pd{T4)|eiTVDSB9)d_}x(W3sR zwo-9M)2Ymi8=F?zBhC^~mur1?8F5N(vBgWF@Ho>FEF7Iz{X}yUd^o><77C?l2{r$& zwjiiuX@Q)NmXQh+x^+r*xve&I`QM@$!ye-WfnlCQlUkqAiB~keMzR8;B8)u`D?vk( zlP6qXnDf1W2_sgV{X%i`=Nvf%GQN0noch7TVswo$#F!5@V>?7Y+DHN3-WiU4-c_UOu!;Y`X;8VraJUZ+Z6o;JY4eL$N>{EfO!jkXYRlpb?q{V( z!pmlsjS(T*q4*-IrLCVmHx>q&DL+gH((dyWO3_Icnwr63W1hS-LR0B(51IW}K~FYN z`KJ1X2D82Qw_&Q+{fx^y$Dj&LeA%Y#MgBpTdInMWeAI615kWWVq}NWuWu4_*o%fk) zR_72F+3@k?XVGIQ`VNB@<1>yaFcfrMZpu&iYu$pMRzOXeIO-Rzj#pvH?2{~fI$9ap z{?{Veu&+<*JAa-bOlojRHWVD1ZWNza&sXxGZOGyGt1w=3y?>dpQN@zr`gXPBg#f?F znh*Mu8E~o_3$By?yv8py-lJUE8#)81e9JHy>@Wq&x#>0(%)`Cq0v)vIa+()37=2soB_zb$uFLV z{X!3rnGByppLZ)QaXm@t+Hl6;XJ@6=Tq+Z5t2vdTy@nb~$OE=lQr{8qqo;vU&Mfw# za`S2%TAiyLL9F`=K09qvPGH#uM#CoMk3EvD_L6VF6KFe5KWYF~h$Ckjf0q<);0z~! z+2+zg-P*mUO8*QeyZyJ~i#@xmT9n!+#RO-cp7zHh#2@W%F%t@TQxx*kWutmhq(W}t zz>yVioLX0_j(a2XBe&TyD?>@JfE@C(7B$w}7IYsp*6~M={oV{_@y4aR7B>(-Ln>)u z00k*`8q|gFdF@J4^>@9TsjGZ&?|skK7dU{6XGz*UufF_&t+&KCFk>6~0H?>v>tNTN z0jQH@^;Jmsy_p~s`dBKUmg~2V*|6hHuG^FFQRuAlntB>PlmHc)fVq#0wX;GS>rv<& z{&i}>U_vs*q~Gv|`g>~n@XoCl567`ys<;qC>~zk#-8p|tMB(>lUdnk&hnBD;T2^ZV zx|N8z%zB0LdvQ)AXHDkU4NKVlN8HEPAmBU-29J%>i=aJDpPutV`(Vzpk`V1Y`G5+W^oSlZToC#3E(zCqj#(ih)e z6J!^C8z12lChWSjg%*Vx65;o6H=JJ~GuY-!qJ%P4*bh!(&P`S%nU^vg>TY8-!3Wk{ z6LEL#EmLP%%Q+J1)VbK@YCvl0es_67gI5JIWBlz2-gm&bH`+6y8lNpa-c2P$;@Z18 zB!L_Ai;`nrLdCOVF1~Bbc8)7<=QIzR?;eDUF26<;2~^lj9u`hO*N)PsA%Y6fof%ko zTCpg*JUfxE#>3A+)jUJHWR1G?tBCr}X#PFbKpCxsmfPT>%LVUUL;uo?)lV%phf2M^ z*uQrP(->8f*{4zAq)9k+2VaF1P^v#AfJcOwa&I0jkX;C9EG&Fqo?`pfdoL5b_J4Kh zq!~W6ynq+8=pCi}F@^M}KTF6PEnyPj?IbVLlDC7K)%l9`Vq{aV1nu5&H8(gr?$FS! zjS-51T=Uvm>%LAsGdM$0okZ42sONcHeJ_yKRtJylm9%!1c4FK9f?MHuE%fPlRk(qJz3W35 zZIK|DWG#JD)of6ZfDHq0Uc1E~w_nXoqHIi5lsxvLQT%d%-GmeE{M|9D?J`c44}Q}G z(AOS*w=yj3iIZ4Qw-?0xTej2QbMvg@riOL3wQG{@6P37Pur5>@yL5u7Q@)l?@nrJB z5(cK!!IM>M^9vr;l4{Xln(-9_NX$`yB$e!h751k+MO1{_$Lf^l9q-OSCEz z(qX!4p>yMCn?{Af($apAprFlVLghVqSXDJ3C%H_M zWymMa;K^-uo;9?wN`g%k129E-Gwa#EHet$F!HGl9Q9)J?tr}C%l1AA0vo9ylC<^|P zD^(m*j>Z0cy!Tt{DOm@=-c)}Hs`zYJ%`jA0;q1HXyQ$gQb#~k*HD_!zzg8T#{8^Rc zeC9b5H`90Vl}so9qN(gK`wmVM^)yh5NTOkW88>R}+wvBlx(gq1AU-08upDYgE=O&v z7v;eeaetA=!0z@UhIAd{(aNZ_h0W%i^eh<0)SXwCWo1RxerOF`%O3W^*C=$w{+B!7 zy~Y2SrfwX^YL^(^G*&VIKg<@bAehEL zU;H{XL?)(GD~5^VD9*8p9!9g)3s`6qgH_ z4JJy93$QGbLMIzu$QG@6_25=O_$>rBu%T;hki23HHO0#=2D|o0(3f7NmaKs)C24V*H zEKbFCR=n=Z)si=oZ+yQo?61fmRq{^5qFsg^hlH&rqG9@rgL2DMQUZ}y@@yyf*$Uex zGFPjiy>W-MFfUg9*64twK+)FG1*sY#@mu%&%RN=QA@dSVry=yewsnpf zWMU6!hYn$?c6N2VosHh`W=<3&JOJeY_0?V2Wp8e%CZ){Jvn@0veN3G zOpR_u_;*h=_szKUHr~6)A+rc4ap-HpUvo7Qmx>nHN2auoSPGz$m-Ywj24gn}u8dko z>n2bad6Xa;$MiK@MR|QBj-XJL87}y$i zMEXRLBrH7i`!YPl09UPj{--(9ez_9gzz*F0A?W>C)g*n#y^KbxRvM{W`!4H;jEbU+ zK9DrQyrwfz{mMAiD){ud4G?*1a(lIt-lX+~!Ko#Q0jhEwOR zrpE5k&Os;hBF#XN(v*E6$t58X!lw^SF-dV(d3)fA&%WI9xqMTG(`ciquAuoxOybm0 z4L@IX$hT2uPQD*A=G2q1r`Jc=pBxx)**J^i{k%gsNHaYYJpskilWA1Ke+TOJZyA-WhxG9M@&e8ohWuvj|A1lJSF}8sJLPF!!qK2DNbD2F8 zbW4XEtyL=Lq*v4LF;zBGHdcSBiVDq&LW-r7E8EX5HBAfgX6+dP)^Hx&9z`ul@pFZ; zP#H&;+7ifqRj0g6;hUt^Gp3>>3I$f^hb!^@alGN`*zY!+?=i{`xGU%S4XZqklv8>$ z5H-n5i8K9u4&}BNkSA_2&*IZX9~)Qm5r>V9fSZMzqH!_L{hM=U`dHKV4SP8KuATV zLmPaHm^w9>lua5-mX46GX(n6M8igW6BWJz!^`*+NeR~vCJur6?+6;n`##1W|6n*MuXGYS5UUGiIi>q1l1yH@@ZMX+cDmTTZoh)b5e*idN`R z(F{SFBi?v^4XRpU`PM6AQ=1Z_KD&O5_%4Cm=jwu6kUrQ|YI#!j4h=bt=IRXu$8h0z z>8SDuejIR}_2E{dk}Lbi5I>pxz%!k}(t{~u69J$vc5N?@wcsi@e-5q4+Y)i(6G56f2pi>Na{akQS=XCbw(wNGwM`<~-< zbku8JL)fj-nh>pO9a_0&Cn;DmEM6D@_0CKvg?p+g7!>X@QzZ;xEe}1pNaMT#?<6M;y>KF_npE~atP)edMm zzIHDsF?dsa5N%8p$wP=)!DIsx7Z@IeNO9)=IM0|kjynB1Aj4X5w#x&^7Ke1Gk9shI>AN}-)rB!M4jfDB}HyEe~WRI-_ z|16fcVsf8=%soxr(jv!(qkVQ#pI0IAQRo9|cT~N&Zbj4skRcgf&=TkFbV9;&1U)&1 z0mV`FWxpN|r*ag>2c30(yI2w}D|7br-KSDOfv8-bYd7jeJ=wKU8~5(RP`M5PCsFuG-)xjK-rIp_ zWaCz|a$A-rv1qE`SKE*IBp{&+zMOXx=bOT_<(;8IPW~%wv`T_uO5Zw%}xE zRUzUHD;&D{j{TWJ_bcIGqtgNCzLt!DH$N(rAZg}TD^JQ2A}wwULmUS!c#3JN+UD#k zghuqF0@-sCM!RhR7}1X_xCnD*6*Lmc_Vx#7_vv`5b^q4N8Ler49k0OMN_$OZ*+aVb z=n+|%7$kmntj84d=9zKZg&bqa-|5t@oE(M&QxD>sZhLt4ft zgcOP+bt{xsbsJvu9>fY2=SHAS7uxHFNv&hCv)t>dW;hsln%0Hm`D|e{5L6vhSmgxI zexA*me#4;9+9&fll4d*QT`g@%WfWx444y345>qM6g}NR~dMU{lCZM|Pv2QRa5<${1 zmxkB%-eqB{^{%(kGRe)J8(ZuBcsL#v1@m^X!4AG%a(}cD&jh37d3*l8mSDAaPY@YE zJc{|va~|?NQM=dX3WFToVX9kUGeeR_sgK5+f>jKuKzP9@V~<+Y1@jtko5r0tt%uwR zd`JkQrheEJVoq68$b0|tk9GBTwNJ8BhSN0cu#Nu?ywy=rng8HJkBFgx^(i`uR)Ekc zHZg)>`U|qUx(tmc$+G?EHykzF*Yk4+-zd3-O}5l*FQq$@cC%@m#U6Lh;D)L}s;Nqm z=q(HQ)yX-o60W!^2|8=Fs1Kgv4`M`tyhK)`9HZ}dP6gATpz7?IXPJcr0%66jij9fk zmWK1;&%eg3E$2Vc^39If0AwV~8~oaTAbpKGJ*XmYJ>yg@Xj)PVmijEvZ}6)ZIeWz) zpm-bVEAGJXSkqMHSt&+k`DmvrPG|;SELb=az^qkA!K+ei^G&2V$j3T2Z$T`CD%GI$ zwE+-L)D;U?a5c{=sIsuzN~)4P@e2ddC~z4is#NG^8Wowz<^?E6R(EX-FQ&@V5|v$4 zth{@P8=GBuXx}_zYJQ{r^ix~yZBmz+T36VW`pvB4XmqaR_=y2u7|}Y%I9->>x2OA# zL1gfH{++cjFHt zd!n7Q;~e;`C*M^EthV@kquIFMr?{nLpK0t|T8~wv@(oL%xR8bQsgbjuS>nnZ;60H`(3m)>HIbXb)$`hpN<%XsJJlRkcwkgi@l8Xu9#MMt!y8TkwVOy^dTOI zNjG~Sn>-4dO-r-_;Ia%|}XY%_8?cwwteYj?55O-NjKsJ786|Blcba zTj6jSo0}4O<-pbiXt|qy+Gs-yZ`=>YUtW}~-&C`E3`duh+p8$TI9GuApXMPEsheya zIt+eFl9Qlw3pB!&&h8o}s5f8!lv&z{CTWnovstG|tnZrUHAcsLhjq(C$(v!$vX{j| z>(z|?fDPRSWW*E;l+s&97$wf^{a{y4!NH)tnsOgJS}rvCVgv@%jAvqhSrMwo=rp_L z>z@YwZ+hfs(%Jto-keDw^W=`?4q-0xY=&D^?Qv+@EC(b3cSucfKdpJ2YJaGbS|hbO zDw@PijhEI7CC+~M8=PGg!yHuZ9#}Wn)*Hcz;KXxtZDK7LgiE*EJJc}Okx8|yg&YnE zq-iaJ5~yv_Vtl|xOcs0ky?H%Bi-+{ zA>`5D%H9whHG!A>;#k4Yl>zFj%&PRL$CM;}4E`ZF>NE6fvGFt({(-m|Z zGvlUsGw@aTthQ_Z>=fel6m0`^XubU`~f z00E{qb&-t9m&IpP^830|AqeurwFG`}#MG*!Ww@V}=i-A3ZqP4+4p z%ajqO|5+R@4bFYbD+8HRZ%qF1Sa+*?PXEUxKfR0d;_~yTa|PE^|EK=ig4E$Y$=|@{ z-q`)NpRV+RR$AmT4d^*=L@WAzPTYd;lyd9Y6PEbRr36GXi8o&X9O3utYb>F0(Twrk#o?1M#Q-U3pk+smv`#RLAz+*T6{p&+^s z8JFRvChLcsyJj~x?0w?Etg_A|*43gWL&^UQ3yAGI?*Ki4$sTahPK^6lf-a}_G4Gc>?-ner)*HLVtg z7r_JKdh!}a41@kzh22uV_~!U@=BP*0QT7+1VPTZ@PxRE?OIIb&$KA_49yd_0amPmI zGW}ZC)Rm9}Y7QxZmWG&0vJhSU2DG-nX#b#o;63>NsXW3ek9?enUho$C%cGWUuU+RI z#j=6VO7q2#gmQYLg7jhLZ{Zc5)P8Pm+zm^S92&w3yV(~=)KXZYdu7E((U)&Co+s#g zZ;|8M?d89XnRy|4D6j_7quFAd@U-ktK755AFt*``$Y%?Yp!>4B+8KLK6o*5hK;7Cg z0SRDW*9)0~67b%p4?q5WdZOxlOP-J;lD7?WECG@oYF)O%GF{H^$Y%NY5U}rx^^dc@ zb72;f4V0-Z%-}}{NeO_q_xO2eJ;eub&Ox)@B)u)e7R2@@4bZe+ZR6=J%Fjv(V0?TY znKA3i+N3nA$P+sW2kDFB-Gk?U`$IK?>u!pN0tX4v2XR)YJR$&F^%mQBRVr-rtHEqJMF@hv8KMNfAfP)$z%E;co4@b6+uYC~KoiM^~2wAAp%t8U6^c>#1UQ~vhzL39BN5YQk_Iq4FnWyq~_~N z$PGi6!x?#hKX0VNV!?&Sz_~Baz%D;BBuM9Pw{0q2{qw)?J?}rEGp~s@7&Q|GtZku< zDamCNlrL{O;t!Arr|ro)2CLLqW5_f@=q?$~cFiREzgUG=AiW#+Gvh4m?wCO>~)ZXTKc zx&pUpcmc(#8J5g+Gn-g0fJQ$R{edipZx2C{zfs8g#YxUlf^t>OIp;jZI&vpUZQifR zir)jLu4Xee%WPSC3Nn*31@$PIT8vI#Hw~yqWSO$-1r0yxsFCJk2~dtgQ&7@XQ`Ztf ze(k0&#a5~ashTo>f5cqG+?Fknw_WKj=Cu!rdIeWu_6Fmb@{oTsQe7=z?Xqj$!5?gy z;pQ99twt-ky9U-^M$04>8i=0*OEwU53FnbY#U^WpZkn;JD=TtXrfLC?6{iY?n85qT zz**S~(JHh;d5j)xq$nmV+PZNWBiQos5F72Mx3;((}5HHD3QP8~6a z(xM^hR{GVA)ey&)^&Q_rU#5k5gOw8t7dzdn&<&02fjnuzZ4U;f61!CS@qI0?CN0Jl z5|OO?F**ADih}aA*m*svevaR$VZip681ww|D$=KVR9h7B7R{8=l9Ne^iv?O$T<@!Q zn+F{`D~ruX0Q3M=$hCQaeulfbC~|zDnZe3~Ak5Z>#4X0G#D%;)>fFGc9*fy}www>I z0@`@BsG!E}J%~`eUXxBxOp?0 zIIb+*v+l#eo3Pi|01R=_JyRV*K+kN3$e=lAT|omH`aW1}!k3a^UaL6^uqxFJrSi0) zb%BBpYn$H$xmKmNzsiUHvEvEPH10xh+sVzUP~m-^hKRc@pHVkEv?3Dzs(T`72KK286Hzr4SAFZelK;+V%Kgf$kQ99%ar?z_WD`nSt7M3AjRTy z1#v04W$Li<i;R)(Z&J=cdFO3I}hu>qVpaCGZ{~< z&SvE`CsSVR=IX?C4-pAnQO zNn%{+2dnzd)5brppNF{?-Ypn7@Y%b0!sa(oOzA=D1>=4k&wSDpsLM;%=@scLTA1(fBf#0ZQ_m#s{g7jCb0{ zA52)<&~)-;QSDzetGurofbD;`^Daz%3ZC}}fx4vR=Cj#539*~|84ci-#cMlstuRLc zh!0g%Qm*ZQYH$|5aO{VBi&KykHp4@5k=@n5Blst%3^3EMu)ceVk4OrK8 zG<)CwQ=lYc<))?#79_5K_$9x9jJka5sEb?Td=uA1LmBV6N3D~@k} z5cmtD4OZT$h4>f#bMP+ zUHYYc;8{VX<7Ydb%I^D_3MEOe1uUxGB%FpZHx-Hq*v1$sP8VM+z)d#3^fc@?Y`@wv zrj~EVd+FQoIL9R|>9`6)&?T>lf@%yV-!#>wRUt<_9WO)~n(@8PwG~hJ@p#CxIdZyr zs2oew7qBX-Re=NZI-AUJXK8+Y$Da@$RY`^O3a_5CnHPzxic;0)^w$8YYOuR6PzGl< zCt4h$N+JWA^(m66>29rCvIVNT3egQzt(OxJLL_d5#f%;&4C#MVgsqtCV5h%m?yuS; z!$I6UkBSi>^4qyZSQC>Y{)?vA^V-}9USm82l z?lf@NDt_uNYr+v73FxtdA8RyiwyZs0Mi0n1*3U-aTbRUYNmQ`>>dziv3Lf2|GGV;tkppJ*RKGz9Kvzv_H!3i)tNTD(B(_^@8%zj0ma%zI`IB zEDs4v342+P+vk5tE-!(g|0)Zf3tRl{2b}#3dzQ|r61BiN6xU&?AWDdPAfx+ifEAZa z)G9@FG+3=AdT@kx`y?{cO;O$qnD)(kAahtTp!*(~aY_6^TuH^%KaIA{tXmZoR;p#U zqTrqOPPR8dL{@K`9sXW2NA!;HcLhi0OOCi~lk#vho+7G&4fpoN_0bk7Em(yMeQ{iu zd6o69%u?hsixubXeyBs_QR=)V5;Fxb|6DEbfVV;k;ja7wQ#@A`9uR8L# z(_6)wU&YN#uP-#I{F%>2PI5sQ7av{cv&u= zlcgsS3He5vak3J-K?OUYE$_A?v%d*t$)Y|paiT+>cVOn0Xs8nza_B3C`K1^VZ{CUe=yVT2{j zMsixR4Re0338M^tw(Ed#b%HYoYNW=?>1S&)z{R7Jo9*COY|!M2EwFxBncKLnF_f7#)_!kdCF$8Lb7di5mwg7L@wV`$;~f3{}9e%4ZEfp`qE37zHO-Rjov@AX56 z>WKxt93%80WC^R(xN)fGJ`QSmaEnc@Pt4K4`@&77i0^O!Tu9&EW1Q$xTNo)g`pJ=Y z)=`dB3%>v7a|q|P@3fps=cUB}!IlEWFX)bjjjujsinl+z)%??*#N9D&eTq)ElHFU? zue+a}-pf8cdLrZKRPvGDwvQ-BfBBTi6pSK^t*Q*WU_*D^U}# z|L~{d84|q8>UPd*i?1s+Ye@ET!w_u1awxBU)JU)J(WXxKSTRQ^crDxbPLU!F~56y~o4BwOE7QV_hYk~5}DX(K} zw_t2(IL^*dn{$|1w$53E!59Qbo#M^)JfGD(gJ_+O2`$pw>>P%V5%XR+ppqAx`^)Wh z8?X<2_(iWEFXHw#6s6^+&VJiJ( z-zoN1hTt(rQ6CsD-zIR=2~h2RC9tE`4$6T%q?IuOoZN9Bc5LE5254KK#H zg0H5Jragf;Ioqs0^1N%H3bHQ%+CHrEsUV-ZsQgQ2#|B2DkDAsDZjTD)D_)!EkL`w5 z|8QS`)Bkxu|1DdH?_#2~%;mB7=0-cOn9=?a?62>j=yD0jl--`D!p|1hncem9@zD?O z!MDY`)&^&R3cC)LQ*1c@^hhsPE89|DM!UK@_bl zd;wji3;BDbcgXI?yL2A(rMtm#pXt@rQK0lHnJN$U1RqKGUo=6Nq?ook7d^FeQMY|? z2Bw!`?1${e)FZ|4Wjd8^XG5pg$t<%PwTUzA7cc!S-3t$wtAjosYEXI(A9RE(N?6zG z$@+T#MJufmQCb6SYapPB1p6`4T?wScrJ_%-r}j^4Jk8*i2+PBleTLYjuhoC9uBQw` z3p&Ejlb0r|EHbT#-j!9m*LN}1+vV7f+UFOp_TPzElP;L!IWVz<{LbDQQWQ@{d9j#f zBy~=UYY@E<0go>p^_CvC$@WD1IPOD11_W5n%rqW1*)z_$ltIrc3Z_2bb05_bqz}0M zT(WV;D*KsJym3HlmqtZFRwJU<#kk7ZwxPnaG0M61VJ{_hfUmfm+Q(nFqT$#rOb}7J z;?|yN2>a)LaY$aO{9EQo)&-Ti$T_b1e%n7m76mP29`;k7R)~opi+6SqNI{=EmuHas zkY2f%q5HybyUJ%u4ckmm`M5;@K^g+j`>iTVX-T;vu%5t1Xi_*3TeFx8g01WJBI zeN_6a!|!z2+kZx&Eg%aDFLrVn&0BD@Bze0vZ7WUO^MRDF$GF{aBa%Zg1(adQzU()d zy}>JW=Sv+Vaa%>44&1~xiflS5mlr0`*i#d^Hov({}&ur z;dKa)#yVzHQfO5Qhpy4r9tGjf)`OU+f-&K)BT=oQEi>uzj%n(RvD#vm6(SG&^xkFoD?hlAbr zC4wMG^xg%dC4%VD%jj(eBSa7kGmKsnZM5hNiQfCDqt_5Udhflr=t7e3I_KIwTEEgnwLUq&BWz5_U%VyXqG~Z{ZzNxRud|AWe9*%@PyQJOvU3Cg z$PzDcDj7Yz?=Q%V898v?T*peBRrM-X8gY;*asII+6#_kVY-n_Vz$)Wu^(OTsvG-s5 zsa2HWZlttbJ~TKRlcAkmC|uV1m;f&LNLYPj`6ZS33Pe3R{#oz4KZCX&X}ansh7z=1 zP1R!l6mdRR@nuoKeonCt6-2)%u7T5NR+@MIINt&!{=CnM6GoODNosC#jUsOB>}R02 zMwk>=@Lux3zaLj${{_H`^3s^f3s|id6x0J;hc> zdnjLOR)O}ql6D8aIAs)r&s8r(imUM>%kh!0KP}*?ng2m?x?Hq-;S1px71XwqDNE#=YYN=uj-;C!trp3O2t;-u;*pE`CBJ~+{AA}{+=e8B44dr-KiRh_)CHJTA^EjAB$$R53cx()9~oXuP2 z@p1fd5g|F~oHw`gCjZfO)Sy#vmJsvOjDe-nIlqP3-wobUYZ5f54ns**2L+M^Bus~L znv?V27{6(K>AsHtG~X^&QEWGc5~-#a5jH%I#mw~Eo&qk^XF@&osONhL6OYq9p~w#6 zi^uVNH1!2^sdAGwZI$;xOgM#06m8m}?pylQ6jPUnDQjlW0Y-!@7an{q^6OGSemRvQ z9tQJ1OzLM^scI3I{zW#*N0c|II6l@ z;QGV|2c}t`l)8TBuNRx+%}}1Gb$|IUA_@0@8feNjtN;%1BR#%Qoeo*GY&aWtNXA0! zm-l_!%WJ-y&EP-3_hGn13$Wlua(uHMEQa_@&Y3wWzr1!Y2?6fDudb1a9j)lCd08^y zYXS42ODy`NGvIS|hjn7q;TQ?*6=;?rwos~NifhnRcR3~%8j$x8CZEh`#V#qdf{Sk9 z4O_ED%t=pG4@QK==kxFw^;&Ea++5wbmDE4=Z;Oh;;!g8{-EMJy6zw7@OF(f+Cc4Zl zOOLFWEv=dMEv~B)0e);KK>Z9!*2qL+GM^Es1MNLj=)g*RHlwkmGkOtR)O3fK2F5R) z?R&okox@868H8JvoTU<#AHkpqUirqb#X$YpYuda0>6SY4$7Ly>+vDxt($?g$Stj+9 z5jhGUL^f%ujDa4puPQ;S@xb4o*3EnxQL&O_;P2H7soYiT{Rp%M$G7RSr;L-+i4${` zZ@F#7=<89nmh_w72gl@ohY&bnmB$D_QkD5~ep@2?-o)OqJ+yH0%M@7IP!9GymXvqf5;WP09~R z?SOh^aRF&NYi3X1O`+{m41S_X-7|?BA9J<==SWykZiI}zvvQ>h#1;%Mfm874tsRXK zSWl26WR?-o8wwx$!yN(kUK2gfqpWKe zW7nT7dxbIxG6yPcmqsKe zk%tUK09#dVy?mji0z{Zmy0RC1)Cbig)eJ$i+_2%-A7tjOZw|}t3HprLLrqk4mfjCy z&;^5swM{}XvegoanKdG=FUZdDtu3R37R%>@G?p>^x8u)xqU+$+N*_+IDbj2T3r!Nc zM;p8;^-UPYVG5pO#1bF%U+~;BU=a~as=9qlilil&jBejQ*@Yhr2$Hj(2^Gk!fySnU z@dm!HI}-J~#Ex2(NPrA7-MkKYm!A-s#Yl4{6_b2`CB`7$+Hj5M;em4poZ61y!wBNy zzCmI*p?V3;K_(y;VV1m1W%S?pwBq0JDbKp5-rPn~qe5PBsGv|EQ)as1J12fGz^;i} zZCI9~TnYgrVG&i1-TOhR1Wb3`v)!d`*723mk@R;D@#7m$rp3}DB)uj8X(%*s0a_Wy7^KW(S^X$esV5;I=#}#tRd&UX`Bl#P# z#erda@=Kl5pEq29Lola|bJ1_9scKpsGcS+2Z5KtPgTk+uQ=$GpH%wuFdpZK+TDEx)hGgZKD;pN`6^G^ap(f=Zcu>De! zIja9;vaRu8K)oqt8yU2%QTQ_Ma@rm2pFbp<4;*W zs@>C{_kAYIN@xk#@`WaoG2vUkKh&$@OhRjx2!r2zMlrBLm1S-(r{=s}Vhem(Gzai% z-f7r;b1f!X%*rCH&dhnam=Itvuu+MsSHwou)hLHH43GWNit=evMTAismdsb<>unTs za5Kwh#cEp^VN$<5+vp|QV_3z-71+?&YV}|!CQq>rc`|D~9b0|xg0I7c_51gMdlqy2 z6cep$<#uj^@ZG8PB1P7$oX0z7!sg(hnF4K-oxa04ow(^KrZ<-)H2^*Lm4$-`f!Ep3*S;=U@T=V z*R`uOZ%_M3<9hPY8w*9jW5JYypb{hdtbv+0wsbgr0@3LK=&B`^xsRkcfvRVeFOh{T z7KX;4v&*UAHs|X7aFz>3{eUY_n5n90WotQ;jWgKdU+X}*|Ab3}5No}Vb@WAb88cM8 ze>Z#3k*(;Q@((;AXcD?yU!9y;tmjGv9^I{O^cDEy#a{H%!LvLp z$0-*#*%u4NZweRR)f4Obp|vsdLIyqz7bix>jp#zrz~(}wb7Wb4ncTWK%HJ0>RQG8h8@CQQzTqRvw*k_oFO!fnSlS#ng?YwfU4x zYRAO??pUbnlaBls1(l?inL_@km?Pe6@t7E)4MNw8!V-TME4rR?i!_DpPIMXz-ZAUhgYGK-gb8z@U`yDOu)e6lh^+;^>A(Zx|`-;uBC zzcT}JOzdh?WU(tt6EV+YY_6hq8t(u}@sbv7@N0jxvz7AkGr$rl3;OoYtJ4u+3~Xg$goBp~P#-6YKR-Sg=wG*^}pO z#T=K~olzUSoqp6+ZnGyYDJH=1+1wb3lo(#lA4mdaOkJi2!i_%ccE6{>1Pp8VyOWQP z{|7ak4|hYc%&Bc+P!jx8wr9$w>dKDNpdc0btg>YTm9NLF>qL!58D0C?3XQH_JS(rW zF;xfyt*0;VeLc&IB6)A9hY`mZG%;f2!S&*wENEO=GBH17zShanpn2xjt!ie)I6DHv6J|7n#tJMbt zEQ?)8?QZdS5vHmbhuW6?&sD5EvB<|oJmcDbVX-}Mi5NoHx4>5UP8&oDox9VlGza_! z2$?*^7BsMQ3VLmvnr@W#}^RX&$)&6N1s)GaE9v+=BX>R3dsQUf6ZzW&`ZD|?vP|$VkCLWij z$@Ix!R54A5xClNOaYd1(XoLZ5iLFnUB$p6uslbVTOkvP7_CnnvDZVU*4RA#d2|~ZG z7|^v@TR`rBsC0A!y=_D==~X41XN?xYpVH|0u9Hr+F`PjB8Ihrgu4&CT5<;LyiHjl6 z#16t14RSPHznTmDF*Gb6|6cq~p}Q-i??Ij>?gKm1F#@W)=%LRuywHet!ZTkws&yFaB*5XVD1IUYWox_ zA2!&~bOF3P(5MU1q6e$y@cDeQt;%|fy6xV1*;`F_v73NNW~8-KvjCw0CwTwPx_km| zzs(``E2Pt3ASysI0KeU3K5Ho#8??4x25K(ZcqTNH_BiYEFm2WEMug?4(Lg$&19Pp% zY#)c!#-M|+V|@8*1PPCf9X|#SXj07_0mdZmLmQnTE|M_{kS`&)O@d97gVR^cq zr0JAaQkSPB7TzGCjx_3ekJNg7k4m$)2Kjy==l-Qv#PIF^CxeB{b=)1u2JRToEn#Bo z#_J!N>opp_UE3JBCCggmxp;sITm@RjuVl_Sr+zf2@`)XyZa_B087$eq=2&)D?Ju!Td11)7x!4Xi#i}&^}=ozORa` z)(XXo`Q+PLK35$NTI_urD9RlH)tBGU=GcY8B7rV1<{NspOfz9+Y7ig`)o9CIs{dCV z+OJ|g(Cd97dJKeZJ1ppF!72CrEO+MWw)&(sUZO_N5AW%Tl z@M)1}z+s)dJeVJc&m8-Y;-mFR0u~(r-<-wWr&5Q!GpelgjfbRyP3X4|w@jxuc=P7( z?EwjD|HAro??RPIS!{#}{Fk}`qcqLPdMinKW%mpBsoDQb@Tqa6R3uDKsk?)VEaCNS z*b{>b86~8gX3JD!a^UAS1)AP@<(g`nje}Z*s2NK9)e=su+=}9)q#qz1!z!E&<7GQY zzI7^ShS5!1IFW^$VokQRFOs=oO5O7sTt!NCTOWdYITX^adlqZyFND_ANb2yN%GOhU!|al(|%5b*#$OZ#*KX$s!aRw{#?z#w>4Jr{m%|HjS({|N2 zqp!NZtuxDhcLt<7Pgyd0>VI5Q`i;YwoNYvx>J}fL6qrV!0PT5I`aNI;XT07oPj*2n z8@sbvFdge4K|nnf(E>F6x%TLTLLZP;J~0Q_9Pb?u4O?25xI-ys$f_F7-v$0s@^7s7 zytR6hUG^lL>SQF!-<5;Z=e4!#aFQw#+roG8yv~a#Jg17YT#;rUqL*ThsY6GLVq)_w z`|>XFO5r4i&+d2()bE4WdUI4GCa6eSRCXOHm@Az5kL#{&4sidJk zVC1(_j)#tEUnC9Gz&Z&NuV+A&#-NZ{{gs58%L8E5zjP3BOwY`DH-;M>{-C#wn9oYe zwC=iLpN^5A*o)PCZL*#P7#W06_VqXkBi%$artGP*>)N&k{fPMwiy=+eMx4S&IK@0AL1wxp2weAR_fQa~6M%C^J2Nyv0TOt(?gAf)LM z{gg4^bjAY==_R*5;HHcnVN!~=TS&hq)K%M&)d?r40Wf3V&=q#}fQA;I zQOV0l#|`D>Mb(^#X*z&VNd%eIHt1ASR{!}9N(ZuMM3mA|qpQoSI)kI|P~_vTfBwR{ zFWI>il&g9N+K<}h`TxSIQd!eCD@OmjwM*TUvB zUVZ+qBeF9^(LZwY;h*}Rnq+rl(^WOlk;cVT2T4;wm*53~1*0B5ni1ZATrgjY`S@&x zgx&mPzCLWm=(OO4UG!7|sdQ}h!ojbN2rU))Cr@5)fY99Z^@7i+Iv*_hS;Esx`Ci#e zszIFT`yH1hwea7{luyn1TE4{ztdx5d%I#C#IEF5RO4Pa4X!NE6T&ktxoF+R1XYOq# zwZ9OaGby*d(xpDHQzm%T`5TW%F7%rhmiIDsTk(&t-KdZfZ}QV(Pam&`!N(-^Q<{Z3;2fJ6{6_6!YRxbvXn8 zg5%0qA=x9dSL*EZW@7;ZHHIahw64CLYf15ebHos6v1F%IPtzD%ef2GXkV~TLE?EqV zpN}upPuf4_I2eEEOi4}RbE&^^f&Nap#c z909+Z2x~0_;AUTlNI!ssq<@QD+FrQh_#tn$@L`#QVI|osSC;LpTGY!?&_;0u)o+Qe zw`%uDivVf4Oo*_MmMPmgEE1y@drsn1wa?8seAr}D=xLK9{O7Zy{9dz$=NQHOcrXw4 zdxdaD(0UN*#kJ^FLf@CtZn4Z+iWjD?8Zr3zM z@Qa2gsrmDlH)mNEl<)IA@0|>Xvn~?_2K0~EQ-g>J9J6ON(@7YgiSx{ zR?DJxHFkQ^Z!5c{H{xqSZ|u@N=mc`#jh9L^mUu%!2Iu{DvK;xZiwylqTmnWxXhF>c zwP!nHw!i$^i12F4l!}8KK#Y3}zwBVG;mOp_eiQ9;vjlecc22}?8M*c5<;~<1mc++x zP@E=N;AS!tM#_xgCSbZrsenH8fykCKYrbqTFou&S)<0ndCnay^SIR0-w4ofmK^PGJ zJn$!M0OG*ur2ywn^Ox3!w;7UXqx23gK&ORtroHd$ZcRv7f!w-cfUk$p?FdkvoB>$* z68{gG{a;vA|4l8PMw`e%|H87WS-Ck_xhtM$J0OYu%@}$o{O4arl>ssw*RR%9BKmN0 zYV(iGe=T0x92*|4SytvI9)CT!zAvt8R4=vS|ERh8WO+|AzM0alw&h#N_mp;s!YzJv z@yy{Ys$Xt@(plwg!WfXL@DS~^XEfHNfl9wEB<1rYWG(U32GAG1$;Xti1^T~M`^J}$ zzSDTS--xlwsi6o&|$l~LEI{EfKLNO1E$n^7>o!xMLO>2Rh;c&+R z5?J>gk@t|R;QJQy`*B_zB%Mh!pt7*hqCR$^IiUfjMZx2#bN|a_#~UQd z({7a4!5_8JR>uX!twAaW(&~AZPVcTNl`xbbHe8-to$u^Yz zG!ncGDs_Btsq#dGjT*MVsI$?u2U{Dnqak2^pw{gDhy>KW2W4?lARw+r)M#-1mHjUO%cBUDP23)nyUlecNg&bv$iy-@9uthP%V0b>%HY?yo0&krneHCX>q@J{nRYf zBn01$p-!<;F@6Jp|4!>@)q|2>CM2in$g9j4wr2MviARIBe@t|?hVAw2K&iUU zG98`ue7M+}yv@GQ(B~Oh?F-r@iF~>#T?=$82X4+8eX~r6m5I_X-2=g8s39s-3dq-} za95J#sevg0JI@#2yD4EEvd?6mQ-ZS7pnSH6o%=!w2O40}zPwxI4_)AsN;%|JlU&@v2Z_H;zEd8>)UoA3#;F2Gx zdyRc?`P9$~_4dv4AEbF9@jn)98rx}VdG$0BJYyeyy`HIRuSuHc%`bpe0^YkXqS9K^ zADb=2CayLfbMF*tE%D|zyDAE}D9_oMw6nS1QQJ`?Y(tOa-^Ma;ae1DLN#Bi?Q@ofn z`N@P0TLlR4@7CJ;iA@?2a}Fl*5cfwA^vFqqUhdVZyf$>Xd_ik0=Xz^aW@oc_{K&it z{nT|kO$#|uWViR|ZMZi2bt+7q>1<{{HzWL_#|iLTN|F{B<({|y{^jc*MhD0YYRpFx zcy+A<*N(JDqfaztb4VTh+R0ynIZ9nKKU9g;g&Z=uJze=cK%E;Zv{Y5(?*3vVV-+}n z_sCA#FlJF^eug}Nbk%E_@xh<3AO3|A}Nc~mc?p};LjzBz2kyf9TAC?9)v zjWc^6C|GK7T&3#V%=mXdWVlcGH~#x~Z_3kkNsk{W->!(SDddC9WnQq$*VqP{bH>!m zwb5y;d7DgaA*CiqR*u9#jb&-uFd{WGcz^7QsRO_8M)1AwAXVAKEBEZ={YrbK=b6?M zYQuf+X058elkry+=-c+lu|F()J*>lFIU>!wJ1Ey%WXjz~qW|7B91%7&PlpqwYRkK{ z*9f4cy(2a0Ah4SSRt>d3XQs4!KmF-t+l)0qv(aw=$ENbyPR#7PR=N>JJ{8D_Ox@TCMIQn(bxG>^*85#e?<2=V-b;z(?+VL~ls6Wj zE(K|3d0B3U-1_4F;+D)N!>1`DIj428gPKBkRA*PwtsVWke_?5xBsOx~3bH<2^)S8t zsUplZ)bh64{>nlI(mZEk0gns$G?s3}?r~lxwxSK(fI_x$UAro499h1pZP*D6(=`nwVpAjoh41scji`M?bC>l(iEw=(Xpu*s!WsK^99b@k7ulu(PmDyBox#sbdH}3 zr_xA@&q_L-Tj`Q=VjCZU3@^0NTED6N@6&%DG3uvmKQPF0Z&-0GFPM53K~yjGw~j*d zZ~75cyXUM|ou@8LKs5ij{dsKMwqJ&l;j1OHdQ_fmsA~+`lgR$dg7Y0c|(kzns{P8n25xx*e>1Jw%wI||FuJT*w>uK#k~dd zEL!5t-KX*R$KfO)DPV1{MEBQ^3m zz%2aULv&VvY`Luua?Ei2i$V=VO-n)T;oFN5=<^A};7sqp@Y5L$F5@3QAiEzUFS;RV zUIF*vOEWw4e_?Ho^75e<#|bBBk9HeJ3Nt^SQCT+_0plqW$s=*LBDRdTj0|T@SIDH3 z0O_ulylT6+rsH_`W|8HO7snw8MD%Flnw({0DfWd~ZC)%z>VNeDlNJBg3vfkv$T!@T z-Peat-?Hu(FO-H>AD4MGxQHm9;JcXVwUmW_6~AFCmN(1#nftU+tu~Z&ZU0_1fG`GvkkL-PD4R^p#t!tYK<=ud zC8uV--GNoMBfqGkTG0x@}XX~i?ih;njc)A`etJhRGE<5yvkM{wr{iDh0h%z8Y71rwIM57{i< zi@7$b-G4CL%j_w%g#Rm4)->2ppa+eYXlKqLJ=CzPwS2g@)P6IM>FsO`A}V9}`=}cg z{4d4;bHjw_3VW2VqDIJq!;8}6aGckg@|ONP2O{ZRDD~q>h^{ge)=4>*7(eLuCStbZ zp=)0WaS*WJnsA^9t=7WAUyDJOI+;1^Crmsj&4=5$LuBnfH`#1e7Zoet0gXL1&@DqMp)MQgjNI~-al@BJ3*qTj3H z7iybC^49?M&Y|I8`~`3N$CdRnJk~j@G>_}>47AO5vM3L_nVz?Vt)`Ax-z3f1@}SCa zo6rMi9U~i{IdMjmJZe}%FX?-Ib&PP{6_$J1iTEs42o~NopAX%!8%fa@cWW&lVb?oe z5{KbMW-nQi02Xa*;s7qaM$viko8*4p# zlsErSI!N(VKb}9#{O3pu44C|fBaQtI#cQ?Y+r_`I(%w9E+4%gyVD) zzu+g6yJIlGuNh7J)o9p+QB45=v(xL_`*C?&QfNdZ8&?iP#z$!xo3jLH9+ zxh<qYIo8v-aRCLmPKAjv9_?c6U@Q;N!vl*#&Q%UUm&ia)qu*yW`>JBZTnsoR@1wD$Iu=7-JdJsMs zJ?9h*e{>F#jA?51pa4e+gU2&y;E|t z6a_aaAjXBBM86B28GAi#Kl7F>l8C}HzE64EoRRDs17DMR#)x z%khMSeCF|{>ZFaV6Jx|DT&ui2TbNdlWwU#~jORo`%dSvQ6qUIt&>DZ2g}Gyi*?#E%fky9u23zo!20oqze=poS+A zrJ6?(@9$^!{kP;-Hn%hVubO5YvWTDLZs2>;?2_7TgZ(v6m=LpOp z78C>JWBnFyLB?|`PA2m48V;h~SI5N4FQN5OB{5zR^P4JKCqlU1zan^h=y-QEcprff z&4c5u_72<)JA~`2OHVG&N>r9Xaa#tX%PX9GT-C~&YQH$-prHe}`IhRHa_w)==_Mry zxAv9!9igMM-(4(uqC%aUnSnjHf~FN#ilGj0$xTX2&ScW2DFz5(d@AEK z@&{&ORAD_0{x|sgzxVpAH^EK0H;8pBN*P*+#Q4SfbEo`!Cjr;Lu(HZxo{bG1mrW1B zj$9^)19u}2)TBBkOBoTFtcGL+2I8Nqt8I{)fE`NDlLF!9Lr$G9Nu|NR?jz26uJ7NQ z$gKO|&Yp_5@as>9tztywU^_fs5-EB~otF~@Sml%ai?T*s9-oWef1U#Uq}xBr5Av7l z;#)Ey1ih+00~%z#9+6{y1L4AL?F_RZb_k6`vbJm3&nZ)mmU0Bm8eAMoq6FQKsgW(1 zWXm!!paRrP?TiEKBVAgO93c*_X^x_0%3<>FL+F;dd2biw=(Gm}3GJKOah;KZrV9SjVEE7w6OH$ke znC-SOFg0yv|0h2E)cqeEm`txusSY$x-yITC6>8K{{YdZ1)!aEM*>r-LP$fU+vt;A^ z{tdo8Qd={i_K5eK$#(vONLt^7zrn8Xc>f=!?xwjOG?5>~w?57lNWc=5Ot1Iiy2w=o z9<9S=9WjurM-cg`c5+tGg|;4zsXKsIQ_NRktgshgAy?o>iwo^zZWrFzr4wyni6HI63U|2BLVA4w z;AP)@Yl)+`fw~vFC(8v`W25LGa$2_{LZNXe_XZ8$CCAqAWcek3(|#&H8La6}fA)-3 zlZUUKF^8dFM+~$saor>Nb~?$P1&eWo^Rw$4Fm9&gp9t*N(ev9Q&M8ARYJ;f+Njhw7 zG97PxBhv@DmQ>=n#Ck1tQi~L4$RWsgNqz01OYD&M>0a$hfm#2kcA~Vu`;x&bxY1ufx!KH3V9piT{jamqPiDHhhu>F4j zu{Qsus#@K?b{>X?()(1%+G`CVHaX>pIQc0><@O&0c0PJd7(C`bu69@ysHfFI&B&%e z1|!~PZJ=bfePp%qSz9aX>fui?BZl4@CI%SvsT$A_5qAg`0Yub3lg9%BQHwErIO7HP z@|nqjvb2aqfR37O6nUFxauAf*z#$Z5jjX(=}88gPzw~m*xi?%Mx z_vB0FC7!4eUwr_DK)FZNQdjw51d3~s;6}bx`-W{i~G@MXbeH#3Yv{~VjC>#OzcmlJUGEE_!>X> z%+%pNCZhHv;L1PyYT72M6IHebXNG_`f>@J2< z=n_}rrO~|Wa~cuL=M*I1?sA2XY1qb0iYZs11l0-PQmJ4S%U~^p3UdxW(`Ursy78#; z8s7%$8`ca4mJoqf~-#HW~UnDp= zGHG)hy85jF{=$kfO;?>g`f6_khgZF6?9-)SgaCk`{dkEiOYz$h>`D0_LPyGJZPf)^ z=tj9MZCxH1aGyM5W4vI-%&^Rns;0hw?)I|QyNUIG0zMLz`m`zJP>4Gducw}iRFbXHvQ@Xeq^)cvxj(1_^9lqA z$<~Sa{Dvl!4dLkBk?;m|W#_8y+x0`pOy)7#>INTQ?4ZZ45Jm`06`xo3UAJ~ zEk=M}pT;xEk7=r^*YhK;afU%CNNE-1<(cCWO+DhzPg__>x;s46O*IzdCZ~Wd%E#|} zlAC$1l5aP5B*;>-y+{k&at$$UBxSYGU{z9itM!Zgl4NSel5UxBM?&Q_r@b~azspBK z;pOVJ<&xmx+^Xjn1YTr?{hQ~oOTug4hej3!tuW`oA1r=>VXuigJ z8Iw$X+y0^mhL4#>)?G&8{fccffhOq}fZi#chng<86hC`Zz{aj-~$g-E=R|Z|xU+AH7MieCpOBzeILiUIub7#RbYV}c^uZ&a5abET_AosNB zf?L7pb!dmBJnqx9TF{q`5 zca;VlCY>afe_6G*Q>EkTnZ4u+UqU;Y_?{h((8AiP&vnvOUhop`BjO2_AMKNV-rF&M zdlPiNp50jHLzLnJ_&wjakAo)q7TCd zLR}5l@@KE!o=HC4tu+s)3o`goaDx_c3|lS^eVWuY^N57RMF6&stk29#^I0Hl%G9yn zs^z;A&Y;)YH%H{A?PrrWBI{53F8@S)wcBVZ4qw5ZUedXRQMjRBnSNG$64q~9Ux;@~;klRbA81%E z)$j^Qvd3D)OVU9pj8;CJ%%nQiE6kpMVHKSGp>%_F_WbZ(;~(_PzH>;H(-%;U%?SQe z166>-z!{HNo+!E7O!XE8w|?eb-`qR5Eu8&Bia+HNuT}hlRh$;_O^whC@{?fKgsa4F zg~j(Ek~or=7f>ZpzTq0Y30fyJB!8qO?%De`Zre%f_OiHkxCz?}^SC_6yyiTJ_Ae~l zPygi?wukHe{{h$WPPq%;oYHr@*3-nMJNl^6VsZQUOzEeib{(CozLol*Da3TdTM6a0 z^<+edJASl2G)b_XBkr6^GFDepgWFraHtxNgT=yb{-IgprmxZW2?L1UwdRr{Z3k~%v ztdpUf;4sF0$A(Ha*LJ4#ml~B{hC*-&^$1jP->CJ*-k#p;WavFG{B+6$9P{hw%1gzY z_d?rEgAsliEBWrRN*OT&pQG*XcyTj|Aac3qNOO_S;BH;7)_UiyEDtYq-3=y(p)!_Rl^^W z9&6a7m(Hn)v&ey^FBlZ$)jLKfF|fdR zz;2W{lh#Tq_bPX`@s3fjputR?o|(9w3MWqz6T((iK~?WQtrCk&#k>TWi_$msBvN4$ z`vR9b*W@IOU2hj64=&^q!|7)iqYP$1<*oUNlbB2vEQKJ?g<_oi9{#jBDCBvUc-^&0 z@I+)nQzoiC)0V5kmmE}CJS!!z_kXu1<$uJP_wR@C)m72LM|>Xlp5$<{t!{lR z*kNMOUEB z$|8x(L`IMo3w%G&l*5yld-oW;6suPdrq|){1Q@;>pS#KXFr|^*>z-EaFxGh_$${WV zVNPjZxQX7W78%~;+1&U*KwxxEQ&bO9JxAI%sSEZ2uanDjrOxt{th;&3=}bCQIlL^T zT|o6XuMCLuqInuCr^XhXN<#J z-@e&v`gn&k&sj8+%n)#@!vgnI^&%?q*71b=5ThX59oK}LcxHdSsXZyiSD{#Kn`I}o zy~d8VFqT{(t=Kj6`c&=2TTJ-*~nDn}9vj zrT3#)COMp)1Jf$2rkp}3MX0!)kzH>ZBT&Ujrs+E{wlt@V`iR%9fi*Rk3c=We8r0Jw z5B>?x>5&D!IKqn^Wb1=8!ROT-7OPBz&5z$}}G?sZnFWOAPived3(6 zs?L+f97{U^((eK&t;E{ZQ@32T&Vt}lXE89Ps;Rvo4fkTpy>zD z8z&6$0SjN^XMho{Y_tN2X$W`T@BGP$LOxHR(+4RehT6L-NhpRk1c_D1m0U-s7Gb6=ZjO z5~*LYd!62Y(ENRRNjS>Y2j;t?8>qU)*+pnkE?|+)=ne@7#)g%Xky?(o#`zN&zl-~J zL=-h2MDC_JclCu}Tg`=_S8KZ=_-DkfJILm6d}VPymlM)tJMwSylLyp?2`z^sDbye{`{Ty5rv)Q^v8w(a75F|JR3mypW zE{!+tA-KD12<{HSrIE(n-6goYySoI)-|v?9+uzv#7-x)gbuP|bkLpM3Syi=at-0pJ zN&**c5XDJTKJ7K?Q8AZxVsq(-Y^#n5_b>|V7j#;#W8Wza7)v^Cvn^QToiW!Ce>g~N z1wmponb|=(>OJ?trO^2lJdng*|%hBu>f?+z~mmA6+$g2kgxpY z*o)T$VAp&)2L--qhtp9pf{W5KU+gtJs?Y-1?&&2mz#YU%`8{ztFw!6ezFWc8*+v#%?v20Hh5?8FSG6mT?aT*P*K#j62?%8^|wZ!1uZB)?f^2m~)JR38lujd|o& z1Yo-4k#QQkApTv;Uova)f58OQDo5-_Zwe~q_vO&DzD!jM4bYN&jSf`1%>^KFWJe*b z{aPx(^-uUrC{1ZP7;z^^0O=kj!A_sjY1_^TQUs6sC2MQR^Iv>MIzu{EV(Sw3xFV27 zHNL^av!3Ged~@lQMBZ1=k%EWJ+$_j;?FRI?p)4bNhuG@i;lzH!!)Qnh@EnEtaeLNe z>(_MiE3RrDn@?M_*I8)NR;sFYOUB{MhE_z!&%@dbR_2p{+x_@AafiB9E$MPbuAJlb zXF=8Z$(zB=k8;xJ{K2+akmsZi^_L=OV?YCr=Z8z_F5gA$r0MzgnYcRduj<6Hp=jKl zOuw4*KJ-XGFhm+oq;s@s&ll5JaDj5`iRhBn_J*aT`|<6lY|{Ndr^g=Zy44b>MV@;{ z>tCETy|>(VFQ{+p=o2f@VW3;b0CxK9*W%zSV{O09DQJobnl=r(i)HLyl^gAJh zn1!F(l3@u66whPgK60qarY94`Ojy%uf%0pwT4<%YR}#(;bBK$BsyR`YhewN2-9lk? zesnkJTHi}hkcbc6Ggc=oC3FY93&xU`7e2C2kGLDE(8ag(YQ;$ho(e6~mnT*&vx(v> z$8GLQ0vC;Io$X~bj--hP@>N9Zr^?D;W+Vmu!*x^zCA5sT#{~wbcc$Z{7+r5(5tJVOF5t%*d)7Nqj z2-#9q_S68-xu?cMX}ug>f{sl{i3v|;w_!!>Zv89iXc1S$-AWwBt%?L%1*%%VL^D5; zrx7>3L5xV{yO+^iy5mS6YV^?sh+1Uj|9)5#+R@-SmBCY_mp9C6g3Nxe(D-^Z~I(q z?a{BpJ-R|BuZ)qG!#`E~m}CB8l%-Jnb>=6zd1W4hRbq=?wfH~??hp~*jJjErRXqCA zIV;b6Twtk{G~y@~5KhqB>FsE2KwwY2>;ok<_NUJ&8Pnih2Ci50d*5)YkVKELl)?O= zp%9LVygDCNB!S~z>D8GbpCPAnfY?({(!Rf2B*Q4eh5u+z-}zYGf$QJ<;lBw}aNk@e zbc5~s=ccsRfQ2^L_L`h;7BYEJor8DoC`$AZ7)M3-jITE@ zs*_X4aBt?znH3M)X|BKGpW%MI%qgdq-4ey6SC$ndSvHAiAVG!Cmxst33&O_zNG;U) z1K?+OpfHD{*E?$-1rHhY5(fgX{4$32XbKJXHAY?%4t3=78dtRwCL(k}adE&WhNle| zNYy#zgdPA9mFXGE5v0rR@jvyMG<>q6UiRaf?NgH4y?I%$bj5>raa$F}Q~l_Cd&;9y zhpI`ZCD3K${Pt&PcE7)#} zJMH@YYvKBx2{kP+jqW&(zW!91I&6S`o1Fmh&^WJqFX2W0FpW+&NJORt6olB{2wqgP zR@imOOfi$!1$2NS~+dhld{@OfTmCn@qw`b##`mf|7)nD}@ zI--||4n9ztP8%xiyc|>(_Kd?sB5PV$%N}?rGu08nULtHaT2WxMLW_&Rf=zRxAc>GO zvcB8~dhe`&^@3VbT||RJ#k*h2jKhpeV@C_gI2+Hd?=nl9d9ky;Usq`85Vz8@(&MUL zQS#PA)|Tx4!XxEA*y~&vPdQb-(DpI*dtB^}M{5OBB>Ss? ziz15r5G_g@A}JPs_r zg@kTs=8=K-z+-UEgW4#Da=esF2jdGanyY-c`t#t$AHd+VTBq<9Q!G@_*KX=Q&)$Dt zUaM;@&`{tB>0V)=>b3$Bu8fXiaErisho*r*pTI4L9*XoOq@~*CHd+O+=2&aZWSW zjL&vfa*7S49wGaRq2PE?EcZlT>Ou!0fYWMA5T97eFNK?3Hu@32|D(Ftk<&%d9cTE$ zSI8cn%{BEoa^?)7h`Uk?j2&o*51?r0F>R+)stoVW?|p9|T0um+g}u)mZFjE18)4)% z{>c=PqDWk}y6;_^RbbF^pj0{bC64tc&Yo2jWMbGdEMZdhy{?zr^g{|h4Q>1x6I(Ww zpxK;(5Mu6WHy5+X64lrq~L>m2UKy2|^_RDWa5J+RU==E?`~o&Y)DXLjd`wfMnU z#Gc0Hw=%phV+$s&1K;nDY??G0|7fl3oUTFdjop7N2S?pbM7DqE_CqtvZb9{cmyJk- zMGAiR&MTUhyFvvwcBx~L;r^B9{`JTOsyGi8lr(r974*xcAN^-3*~WdSpldG;HVP;| zdPI9pNRQ{|xC+h&N?jDO@rRXt2N+_H=wM*z7&f4~eNpzCly{wBg@M1o(=}Y;VOL!O zTT-5hZV-jBg*~(iDy+i6K_rfcw892sU6+yX`!7`b#W?l4dmRm{Q?8{QI_o}StWM1Z z0VewC=h(T{ER{h!R+X)30cBIP+t+Xcy}Ie?-JcDXHFTbYirD3mg^xu-CjzA24w?7E zR^?#ps5hrJScG&lWyVcPt5(~&Swf0`03q@gR@2Smct=`X!)30LB6WSt#aki6Yar3H zpfQ$J3Vz96lUncCGJL_X(YrWcwL&sBxmiQbV-!V>T{CEbe_UUYXBNXsR;}u)Bk*x3 z>c&~xM9rnbWVR^Z=oQ{u6)=AUvdTmS8pj1rY68+3f&3gWhsR2|pNq-Zb`_-!=BfDVqjs_*^C|}x^;{%58a2Q8 zDYupAR`vsScm_K^^aDGpYd;fIw*sQn9UuPf;iUe}<%xdjkx&v;zdGE7*AKKS#d61( z(e19sw9#@S)E;rKo|;gUq6c*i7H9aCxxu*QhnzOMTkmoYb<)9YDx#HEz?uKtmFF@o zI`uGB>v3k{>2aJWvT?e1{pA1S;@*$c+H7igA)n+y#ScFp)rQ?4yZx>x>ahTdYxK7@EFjN%9 z5(mEIQX;r}G9B}-O=Ki%!kK9VoF_8UWIxOuJSlR=yrO0?gHF00iV1%a^A_mX|0D=) z5~kbD32|@_QyK#tD1hwO3aR6e9tHi&QWtd?i`jlPUX{~Feq;-I+o+hbYXdQMN3_>~ zqwV@|s)01!_{fYZx>{mJgsSgYR=wnWFjta_b?v@Xc?pu|jX=Nsf{IR1<=vtNME&$Qtu{RZD%Vt8?6A-une%O6yIu%1uH%FwO;}li*1+sW8!_y^ zDvZD{jNRi7az?0W{XBn3eVB3rSxMRc7Rq0xFP@W85rOb4m6<(Isnl&Z|7M0g$du|3 zLUJV1j1pA=VTF+!QafyR+;eV$vCJ&lPDneM734W?e1DcrpIwoh>dubdz+5!lhnrYC zD`)*ppdRQ7G&|#GwX+y>lCS}mTYGADcMNa-LPhIX%4iB|M^UvU7T{VoDtBF8+gDT^ z={=AGH^9?wWd{1FMwtlp<;RWFppK$(+%Q|%NCShD>{aTi8Lo~BO{}#G6=swuc<~|S zbd=u%X=vUQ)>axQn!02w&v@=pj!8^MM1fPm8r@@>wYwU-TI)7iGsE8fuh@7}ccv)r zU?yKKnaNY9U!DQI>0V;KC*=W*WX8f}OD$-BLoJGd|JwHdL&@7$Fx`D_o|ty4B>X+T zVamij=ME#;3+401{dr#h-6^?zDQ$$excQ8lrSnmDZZZjqXsC$&f;0U63VjAefTU$| z726qke|O8_vG$-nC*hCpvYd&hil@0edsqL zNPeF!#VTWct_n*u1B{yRT|_8y@vYL&CFPWUA5_8tozO{8AO$`KTWRPMU%gpT%zoqEMC60JYqUIioAE|UnGLx<&QJKvw zF11oB=Jv1Qq3Tn&D8vaEDcmJn)Oa@02qtloQcL!g#mOA|9Gf4#dfH_R6RyL@r$Ej7 zo0?KgE?W+*XaHu_P>gCU$O(kF$^AG>tF9mjIH`g|8Fzz4C_1c-LL67ga{NQBb`7sq z{j|)gskC-#8N)`o9LEveYcfK$w0tUzuWYB7&f)(p4rYrrM%97Ir?`9VN^I`Qulha9)+1YW z+fR*GR0agvT17B@9H=ac3-n-AfbqZ5C3BT7BB~(5gPQR$9B47(>8HgvSmGr+c>(@@ zPp9Ls1RF;NwxV}1m8I_|+Xxji8U<9Auv;b3kCu8V2k?c3xhXTih84?-PR9LR>a2DM z?@G!*OW&?>SmUOqfc_{KA~>}h@h`ctb)y{W<#C*E5nPjb_MV#X%!_~4K--?sl0ObNKk{6Y9U-emm5m=unU3bk}m7vI)PtBCES|a#7H+q zOu$h$JFOs(5X8<4T*gZ<;9=EgL= z#I^Fjh2mTF{v9LkB4K&d?+UDKCL+_<9ALPG67&}}m(U&fTur|r_E7$wz_Ufb4GK#_ zrg$pOH8(3Cu1Z>qNPJUJ9RPD9eN7puCd4KSlvD~eW9UfV4V$i0{9Ee6rucr`YntO3+xkuFNP}1G8Qsb zlb4j{;UNuvg-ZPOR1PHep0BY0e@O+3?^=`u-wDM``L9Y0Ys=l4Kb!_CAzbYA{zBty z{lriNPGtD85;;$G;!Q?L5IA7#pQ}S%fa7vmC)ttd)CWT*0{MS#!6KQ`@*)bfh;Q%2tGW?`LNxer_=a_b^YlX#) zC<=JtQ(4)#?3gwC-sw&{Tr1fuRQH8$w}_b51pC{Td+4yxH4T3|jy5HR%LHrT7lnJf zx_Lc&HJ8dJI9PleIQSruW*gEm_Nf3j!*D(J7PX_lVh!S;{|Plvw<-!~ZAVq2osExO zb?mFE@+Q`0IWd?_+i)c`H+Y{%C#p#4#mX!iUu5KHkMR{3!m5zqh*v1-m0p4+B94}= zH|KGTSOxfCA&hty7)2{TdEJ>BRXpR&_Rcs|%Q8m0BUmi7E$Ec!)Ewt(+F`e?>5V)l z5V+{iQd)-U^?sVmfMA;`_W=ayjIqIqG^42fu*oYG$xY=c_xMnp+`-$OZ^fR@SOipB zLr#<7`AW!@H@+sHmK*Q;%)(`&c}6&z$FF8pTAWhOIM(SO+9&6?^(|W)}|w9KKjdahg%oS*r;$<>T}b5639%{PA8~;)LBNM>E(As8A9Xu?diG0$fX2V zRI+LFT)GKPFNuaP7))>DxbYL_ny~f1gm1KHwvszdk=YrCFH3JS z{ggfYfAfeBd*wK$v^yoID@QSZ%lIU(mTQ;b_r(uzsJE!MsMTe3q1mhZdF$06;Km5z z8NzL6I)ku-QZ`w)Hz-4Qavs>u#)q3&wp#v{k=B@2`Zuh-o*M&yf*JFyo6a^UCcsf2 z*$N&^1ug`*oX}AtjZ<8I0-)rqqoq502W|7y&ekuGlMPtKW<{-}Hlmd+aRFgKP?Dc< z{7U7f6_Sn02;Y-Q4~U7I_*U;j_;<#{vS1!sq69yW{XvhgEB_k;eYh@YC5;H2L9&QY zCk(M5%Jo;7PwN5bbnG`D?0hd-UJ@2&s*4FOvik0jl%?${U7m*(Zj}u|!zGeI0-PKf zMb4dwP)g^9KLClm%`cOljm5?fD%%7@bbFqw7sHab>g|Ny*Z~#9^Me;T{Qy_Mp0_*g z>#&=(0{(09A3&}b-6ea59IW+hGH%G&8NSemA^Z~o*nE}T{if&g)QhvZmn@l{ALNvb z^;2H%pLFiw&DcnrAqKl@lv&w}>r|bsa>c{c+r|N*PSzF-=>mRVbUA3(3hbVy*~g)^=E&5;~U#v z_bMLYeJ68i?rH2jUqkp2Mj#1zitx9)$ZcI;q6-!mj@C8O{Bp51ql;x!Ueu!%Q( z{S3+_5F`0Q@X^=76|ZAu_78w8`iV{K|JA*e%h4b7x2W>8yIR&X?WLnYF+lqOe|a7Z zkXd;Ck^|l5VxEMZfs_#9SuTCXKlibde*oBeNR8%2rmJ;6F_S13FP^C{{Z2V{N$pO- zN%@U!VNN;RpoG87asozA5rj@|q4kV*>{l~V#|7Z$DTc;QTUI)hHiGpzq{ZvHvc4Bg zf5rD+I<@pv`p=4c`%AV1Gm#=GWy{c z6s0TLHcS(n%0N`%l~#Yg-&6it_aumQ8)}=Dj$HkAma|(gBuI4+yn#*7QkVW*X317; zd(4ZN6TA?qPB^>6I~ARYGbQ(uF5C`HVb!K7ZA$R(Mf`KQNIeiKyw*dGlxkf!&N^9~ z&ytnJt=8(JKpo*Z<9#VQq%R#JJ`ZK?zfvWS!mBUv`g9>veB)CX&BK_}|4v6Fok~W{ zB|aLg0Li^{<_vaeIC;_|!bc{zu1|=)Q^L;tr;eQ1Ls|~oAHciXp&AQ%^VAUxWZ7)K zZBIR*N=#{vP-eJd*Wr8}-AwA%O5k`ql^tBTl?BZtSl59KyYwpVgJ=r=t(Nr5Eo^@x zGt{)Hxp1~<`O9rw$Dbmzp0F>L4}#RwwTfQfv;t2TuX|GZ1!th9bac2`d#AKwGyA0# z`4a1Kq=6G>n)Ha;_W-Ka*;);m-`tNLd&^`Q;JX#+J5kV|P~Gu*+dXBm{Q~|1~N?yXLeN|6B)PE~_uL>PMum zNl9k&mo z#T1^3Z&>oGuZ9ctgWLHk4u7*iTV?g1imj22p&}`c$wW1oI?#asJvH--E(d&dyF$<_ zC#1JoGrS3r?0J^3@DG5#!X==(I2iEoitgGEEekjmgPyJ^LqACbz0cxG@HVtodL<<5 zR`ux8lfTOrvjR-D81V_cXD?>oA?V*cg;XwXOw6 zSBHRa{zG6ot!mNDU~Ves5?g%x+PLExv!gjAi$fdwyoA4tLjT=TMH<@X4tY?`VdS(S z(PsPI&@xs~XMTrv#5>k!yG)8^3(~Yl<)S1ByFIXo6pMz1w$CXvyLu_^jaL zK);t7>{NsQo7ZT4X~c402zw(M&zfMskH9w~9h6v5yFSL)4yh>HL`S8<(lzH&J|k{I zD{LMI`4o$CJOo5{JENz6ofniYK$ulsxxg^^O?ynx5(KL4oSSquN%NGCO9*dq#Z^V6 z(-4v5qfef-07~kCzpu=;ENfSwB2SG`UdW*T0RTB496H$MDmJ5Pk~!A%Zf(-qhwDp> z<`^4rskreq`-x;Ms1V5_=&>!Ap4pb<^0VaO@(s-RG(NuKf=U0?kHx@%$LjT0r1e!X zg*0gPY$NhzM(p1$`jGlg>EUnn7_(xk$UxBN*zaQc|5N}EA6+%%AR+}=I(l-Dw*DSd=@Jri0X{6SP^ zl$SC^$=$|C+gtW&MVb;bPPj~f?CYxmpqzP;a)vL161t6=V|YGLou{k*-7Al7?m10h z3p#!wH*b+fW)RA7i|9=jX^)zltIRhYfh+ScHk89+l;FoLFu|vY?8|F}kM2{k&^7NK z{cs#%iDq2DApeD!bwzw^uUC~kkRgXDW-I8O8j45@7Sg$-RKNEYYy^*-M7EAB)2W}l z_vco`cWwfvOV*-#hZG#IOM12ak86S)8%t4G1(+R7{vJ@t>cWr_*nahnZ!@Qkt(?m4 zT>}Htd&TT})tfE>I%;+OmD4=#jtR;*oZ9i2s5|atJm52aNvp{zmMpiaD`Lv0w9l2z zP1$ljD6cE1+M_vphSl|RF<=N6xzHWiV_52#_}7Yx|N69le=G5ua4+hy9dRpC#ZTcY zfH#0#=B0nA6pQbjxafUwt}XHs$8>vMwEY8sw>`_H8BO{FxR7`~`snrFO}#$Uw|j+~ zY5}#YjqX;{XKUv?sk4O(oJHrnI2~4A>}}G(F>2UMXqDG;9n5c1f-hjLAh)4ZaI+`mt zXxaF5nMf-EMFb>G`Hp8c?XLlaw`h9#RvUdY?$ZLvc6H3Z-xX4N`0qL9zh|AlTf%QS z7Ld7R)w-UF!g6SV5?G%UiyL$42 zeZ+k`?1{P4XHL1hQOghmwuz;cEpF~kxOw{J;H8%Eq*sc(z-Q};RCmiJZM~)?cIqS> z>H4-IEvysMWnYKwR=7}*v{qcD6e0z-;SRoWb4MHW$|?vyn}!m z_MwjG#udBN#K`=TI8Us+gLwMtHgccu=#K54>1G2I0X({FrPX)Gs1UgAX0v!K(LsW@ zm%YV|$d-`2X;J12W|;ceyo^z2*D4WJpJ7k9ED~4epGXT&OLj}P$B0{C z_g1N?^9j~XmE|@Xb@xc+ps~3_j=u=M^3fNHyR38Yl5?x{J)u2eBEf|L%cr4MKoF>J3(gVDEp@99{dI zuKv6x@oM5j=&0uwv0C2;@eT)lyL{%fy3Ny%Mp6EkH5JtSUj`AgTJC`1BQ7YqND1#> z+=5Z|czTCtcxKxB?{0MhYs@P}9ISE!&a~oUCy_`jmAXNE!+u3lmxMB_omy2CWxbN5PRnJ`guu^n6($k_A5|yu zB23sx`gZ9!Lr~Hv6AtXoXA9F}JJ&?9SM41hvV`LL_GAS#ixQbv=4vK8Y|j(gE2P5S zn0}SPln_uv6dlFNO1C#W)p`B>tSQbc-zI;_tp6TXGMV#?R_Eh!6t?`-m}QFAyo}Ve zH3P@)W=S5Ze_$dN4An)u29*rZzNOjkOx%Ogz-B|7ZY*AL(d#{7!;?}+Poi`37isOY z`rp`(cZ2ivm2S(MtxxZsE2l&=@bJ{(4jhv>d}aZgTi)=53$vjGZFtlw_^0akXM( zim#=m73OhstXD4~h(=aHJ$b~|$z!%M;Z`Ym1lhdg^iL)PqY`(7Jh7_wA8`r=jULgh zC$TCgrJ=5D3{tEj7O`(6229vJtCvq$q)y$7Z6MN^=Un#V4CoEp%9!a&LZB934y@HO zQ82(DOPbl1g_xrN{FM_THhx62fIRDK8(kEqC8#rETl|Hdfpec)^)5BdH=H|qeX^@A zJWlfyzePe!wHPnUKbMnqZ%aFyThHq`ms=?2O%%dMV9@nbr%P_77PlWCtWGy8-xe13 z8)2+yAuoyl&;-EAFxU0D4R3p}iKWzsXvyjD63h-=O%&)G=q(QO^+CL9*^;XBjk)2m zRHG7o!=FdniswJwT;4H%(DV(h4wA%+&|QCI2)jKO?*DGlEY+?_5a{h5atEPLnbOKU z9$Fdxps7Zz9C{QJ2Mkt9ZE!Rr+;!~5O6JZfSa$spw)aBcoMWhak#j0Cmk?QYQa9?jJvzWr3*g&)Fj(bZ2PWu#efxSDim{gFQ2bJAv+s4eV5W7 z29E5mG_}hLZiNZDrfxs;%SLBgaBf`Kcikzk5!nGZdsc-?ZpyjsdDY34l1cYoq@BV) zlF`xfbtdI;lx^F*%l0YD$m)nnfFe5mNA~^ zrDtC&FK@RTi0qL-8c&>-lX#7is%&ju z@l_G#RejQ^<7B0>J-zGfcGS$?AW0BoJsPNE_7h?f3}xkcqNyWO;+hTQlc*a|B&IGRtl=OU-II?8jkp7)F*>j_bew}ku4!In{%uqKB^tM^- zhU&;LDNT}-_vxzn9|FJ2zvPR$@G^>yl`&Y>2^je3uYQeIX5hz8N!NC`8@PAVzzgGi z5iEMJ9*7h*s!HLecT_y^^0)kl8-m_%P%EG(TYYcAao ztdhF-I7pU$$4w;iaGI{ug8I)Mw1R(@$n#&xsGSa1`kyW92X(kxh;SL-r0pGqYC~Y4dXjeg9S$vnWZv z4vu6?*wD&jnPI(8n)&m2G6uGenXRHl`}-xMoN)bW_Fhz!{bUBcex6>feAa-f(S1h| z;pcr-lI{ZGF9L(7gQpLrlTDF_&4z@O6r(qZ2x<{6rH|Y?GleNr3D~gH z>EIY4G9!}NcnwBB&%pIpBHv(0>b#wE*bhzeU?d`mWUICEq%= zXK8O`rW?Y0XS27{{MI8eBemaMT`PXj{;kV?G4!v}&A;cKe_-fKT~4(N9|*VBL(%Pd zjtP1!wrc6AdgRw=8u0^;FAV9}LM*&BM2JbYLxCZKngbx1ej@UW^*d|c=ArM$$sk4 zI+)Q0?_EacDJreRiR(i89Zp%PWqwTT;S+OuvJ!)?pxDBSP(!*$Fv>G7`{a|h`~n}V zn`*n}NoDRz=G>Ft_R=|`P4$2e&ui{cDf;EYqju$;fyU^U7#s7hIv)%-2~;{W)0oBv zNA2PlCANtc_7hnevRt-2t4TJSud?TGwQS~$vVV=V6|rh~s6bMROV&5QP2e3-n?TKc z5^3J28#Z^(D)bJg*(hmFHbxnp*~Yk)@4-a&Vq73U@cYBqvp2-uey1zfNA2M<@0VwOf$&K- zknDR5%Q{ZxBn|oKoeLD5h>d?QxKA500vj_C7Y>xEc12EuaW^Coy2VW#l7NOkUY*lzwVQ*;`Yh*mr>o%(4T z-HO z6E=5WH(g`i?kj%%q{}ej)TW$oZk+`4t(wR-OIE9!2l<7)$5R2-NZZJ6IZTV_XhG@b zqyXPxx^zRDKwpTw+{A4@gVtg*p_nvZ(|gAT0S|l2lUM*_WXyN7(X|H0 zJP0F2VM@kP7vXfL*wM}6%6_`l7;T zjr~n8A94Q%IEPk<`yjTV0qAEb5pM^r;l#;V3e|rW-{c;!R&}Ys2z%JyYS53+KbC~L zOiwFKzGv$6Im}NDUMLSQh|duerKX{oK5cX0&Ti}4xo`VI-^y95XEx(K+bAP5g`F`^Xs&A* zr)G;L(~ING)4G<9E#5L+t_A%cKoHH&uLh1q1W0tNN)tmFc^FT$?ZmfDXFyZG*)j4F#|)&7G!$mCgyy)pTGswk$6Ep0DloL?|@ z0=>)Ue3-Q$i6k+Y(ZCZA>8)AI9Zw{iMOFz`D<29$gxF`=gV9fIn*H8pcbN@sK18bR zpI3(l2UU_%Wvt%7(#C3jDYK-IP7`nKbjcLWit z*~`4H{$uWd=FOm^Tp48z8!ID$BrsdqXlqQRh*}^3lruw; z9d=R68&evk`H`}Ji$M+T>y-e44*jfFR9jCb$>0=ZB94tZ!&Q!g*J`A$vWRv#Eb0U8 zZnRsXH_1*GPjJv^izTYi>=@N$&)6S;Hs`}tcB{?C53Lcu&pI zE{3b!>Z_MILSBcY*$A?o*etDbGuK{26Wq0o8Tl-oRXuRB>bhf$q~rNf;gX}!fi5YN z(+gGZ35T@0BzH|_gZ9seo&24QF-Wa{O`N=H=B=g1oN;avzVnwcIAeD^B2DUc+=^K$ zk^kz5zgBPU6D^Of{L`)Jf>M{?vhR+gLnaJA^6CuWs%_no!8FN$67nMAr1|CC2naqQ z7{v{JX^`4dfIxZsAN~8T4`)ePJ0Ev?@8In3j6Bt=&({a{wtbm>+iG}So%_ve^^S(G z`+UYx#+I8;ed>-%9o-bVN0PEV)mGfh^NsZ>DRY+7=FCQtwty}%g<+gA%G2<7he|A! z8NI0L4cZVRpZ7*~w)v^gIK#8KH_l-y(sOb&CJjU1ZNxL_C%>{yE%*f@e5AJk3d_)v zy<6xO#)oZtYv}-6_7n<6sIVtXQYz5P^sYHf27)Q(&u)t@CVS!==r8Xsh|pV#5R@EC+u~EVZa!3yEZ7*oE%96 z3o8Nq763Q^kf^c?Q>M|Mh4(^x9tzF>r#=4dL^Z6{-u?i6?$s4HY*@t)r-GDna%K{ZK+SS&+(T>3Ya?xe8AyS?E8^b@8M7GmaTkiwtN zFlP2BA3!Sc6aL8XBmo3B;a!TB;Zlxr?@BA60=~k7({?vjk?+5{blEb}Q9)ehRMEN3 zh2?M;X&3zcVdMc__#cW+tgTDwgNp6RQ~1vK(l~6>uM>SCbpPJ@{I7=(TP|XoOP@^| zU}!GxvTj|@AZxk(7Bm$xaI^=Z7i(HTtx4OU&*?V8BzOW?=Ig4!MKd3vy% zp!GN7UB-{Q^GbQc7HiaQU)quyPJHKf#V#Q`>UeeERGMkl36X zWtTL$z&27Nx$5p~R%^w0TO$^jIo~+@AZXRN)X)+bpq!af!NK8Ij@>@Z;+WOCT>9Q* z^xCIkZBmOuynNoZszgc?t^W0TifLlBtz5io-VeQ8)YGLo-w!sdi>`CbysB2*ADx`&se~MIBq?a31@Hl&8cy)?pQb5}*?93IVBTAZ-FP|h z321%6oWkV55SyOd^0=}~Rv}0<^H!F|-mJraX4C}|`yiLt)t(mVgIn%VA$m~e4%4F7 zIC&>0j$8;=*5ACmlr)9=2G*Y#=qE^I(&k8TDUVwctiND(S3Y#{ z3KtbY1ab@2Y!&EiZ9f;}o1ayePcFA1!Nl?dYW@Le#acqZkS@g!+&J5YhCT-{KwX;x zJF#l+`O!Ex=u&9cXwV~LQ|PL#-RNHM?T98UVRto6)=5rNeTvSDBE>O2J+l_GlGhG) za%og_`$Cr@oS$KSvs->M7>z0QXPKqr=HAcbA`Otr?CNh>SL%A@8=yW2rR&3ou0v5m z)P{GAgrzgA(DjJx%hae35#4^RO-$VBmRKacsq?DHveoKbBO|Rk?y|I~c?{5(F9Dq3 z*XoB1m+x6sa5-G6@CglOV5DDOfFz5`vdS(#P)l>r);ts6oL4kyf1ZvYThmaIWlh_- zu5nT1OcRfZVt5zpW`jsN5i zfb+|V;IN}_%<{;q^7@mYOodO~S^w#>hT?D8SLVpp^V=Gq^y_|{Eh8@154Ou^n3{>W z$`;0VBtqIY^*Mp$()`$Q|CnK7@%$l{;YiRKCOfGEgAb-^+~nA3!xrQ8+K_?kS4y+V zd-?jDMQJTf_Nb)aS<}6=20psu2oMUovj8tF!Bo7EL(m zKcn~IPx@j*r)>mj7>@Ik38hS^IE0l)6BFx-nS7vMEuZDHc8dB~65n+?PBQ#rUa3(^ zZCthlqRC@Zj@&IT~nfj6Z=z-lBif9Ry`OmW~1GC`)8meLaU z|FDI`_s){6TqVObU*wu7HKpf!F6t5zMU41H;O;ZsMaRn(Tf=Kg^dEpcG|i6q)bR&^ zO7kM=D~|CX3Wd5nG(q4sz_E zab_<*KKbpw*2muP=vmX?(ruqnh=2a$P?KF(P(7!jPHaz~Fjd=mR0B^9ca%nH^7#BD zuI_eh9#QquNlq8Xd62(^VBufkUz}+5<1);iV@J+N&r&N73;0mvkY6QjeJNIrPjUHg z;u=&E5)*QaD2X=d1SCT85PS85d(%mH?JkILz8;0}2RlBOVft`xarR6XBUwg0^J+zZ z%}|1m{{t8?3#+Fga--+(*ZR?q_MXZC7wULx`F|V}KA7t#9|n?pt@9+qMpUS>GQB} z7sp(37fPrv+CP2mb zg`)agz(Z=9Uv7x9zrxU7oKUDdLV8RYFn z8#H;0)2LfQlropJC7;+@zS0f;CD(pQA{;Szw*4KI7mIJkj=q0zAk`cJFEe)ws(0fQ zkRUpnt~AA=iT*iM%3|9y65qnuePKf;96m>bOWp8C*zLF_8rPIV5#jb90L&_3>b8l$ z#(Bb#lTXi=>%dav{=!#sW z3i~Sjl8S63OCAsi<|@y?#4umfowdrm|5(yx^W_JBnm?olf(mz_8iP*@RfcbP9gw!| z;H&!Ewsj+x2=UE~dVQvyaxj&Zy1cw5BFal|ogn|=Dl&}WUhnM zUF|mlivoJx15?-v{b#OGbq$KMcFlvqmIC<**wHm<7E62yR=Sbb9THT$OxFOIpBj94wJ0|FO9QH~+ z$V%BdjM4leJL0*nyLI($;8aGi!MfM`?kfr^40E~cO?j=j|N>|mB19erO=n}HLP$*GvZp8SgV-6-;#Q;lQ=<~c$@NJ zX#u$eRFs2P;z78@T*iW1# z>t`Mzn4uf5prr(n5oDaR?250g>(OcexCXdx2PrzdKkFNbpby>5BR_XXJ`KftbO9WbR-dZ-ZkN<@V za4v|j+YN`c{zkZYSclu45*bZpVOZ}2O@1Tn*Zvwb8d>dq(Ow0Yj%WHl<>&t_JGeWH zujbP{pZ@4nx>?k_tude!K3p7=@hVw`oSU90o8MMhOVDK@v&>`vzg-q_3icRrTIbFW zwGU8U7XOwiau@#kH$oQIz0reGqVEsi{oe>zZ1WtC1#9IqCoqjk)fJ*gu)`ho%TYWdwmgqhY8VUcv`~5v z%AZtGYL<}yoTi~tS@?iDbx3+&5L|%BM2didAXqJ_`_Zn=KmXWYwIBnm?QgBZC;KAT zO1A?Ii!NNb0u=M_N+*5>3PpTp@O{dT8zH43-tmgee&oUyM} z_74x)*U2@Z_U&Q-P2)xk&9g+}7GpgngnLBgb#i}l|3_4@%2q&>w@9mIwDR_Z_rC1Q8Cs(j%;7^5vPyyYBWlDg(yAL#q*JA% z!jMUKbPTO4TEZGkGiR3;R|}qrrQ+r8w}ut@B#bKdeRMaNHx^A{)v#`{vU|X+deL1r z)yLmKy|5KF5-}Q zh=Hn)*5%6idJ)@niR3#O;vuV+wh4(#7P)9vua9*Fx%alBCtF+`gp;oy*>w5hUg~KU zwMtB;{=yVBSw`!9)Pi9RUGoyxD1h)-j+h-7;Poebvl7?3a`vBUu9c$2Y7?k-KfAMt zovwlSDIR#_e_Q?qAFfQX*M9rUE{EKFRz7MYp@IBO^kVJAOW6VY;<={uw55X-L4oCUcWDgGE4Y z>&xC6`EdCRj~wh&R(hU)Ra2p9g#={FU8>Ba5Zfgmqq-(Ug2lYe+sO!Q{!}k~&2K_G zcKM?Ubh>|jE6s`X2BQaKkvQ$RwQu%jmYi&+e%gG7w-Bqx>H@h^@L|q!6J(6kQ$-Ou z1wb_yrZ^X;#Dd@%uNdI;Y9^#@V?9fP0%(oBo@ip$T*v`?btE@?G~S<%d;mM8j@Y_7 zl6QGtJ?;(Eef|`8ZRLl7_cds0TRxY-;@R2{bM5aE;{PVk{=O-4?q`9B6&mTi|p2h(>u;{ zrQZ9trY!OS+DE;Glw+?C4JozOb%9f)JKgxNj7j)tXG#1uO479CsO-8EH z+Qld9nw!Y600n}*LT2A`jcABq9E~V=Ja(k3w**CezvJvZwkm#6@|B{;KX|`Kh%KLf zp-{Hb`U=SUj!Z445J_PrxmbK>oFFkSfrw&3&HGnj3**3s!4B~t2BW!+?i(CxhO;B+ zPB*mLkC{Q>yS{LE3ZE69ZK;8(kCc-UW+*-8td{w#SCQ2BA8hF{dMUS4>Sv%0Rd7T~ zg6@k9!&9c139PAa9oSQmwMWtkh1|g}gOO(fRh>!b>N5edCt#qJ%0gxQuB7L-6FyF> zK*TcGX5AwWWL^BSwgb!K5c|BcqTVqelz=Z~NJlYiO~?E3BTpjkw)PxqjW9v0s6iv7 zWpUhk7^0`~pMWU!bJ?ROC{38jqhS!#NB0E!?9C*njBnAZiB^IpWSs^+cQ^Vdo?6Hd zMVJRQ#jb%VCYva)6T=b&kZ-hQ_=hkn7V5tV-s%eUB++J>T{VFg_3`^b9I6%eAdG(1 zs2h6nhmVEWrRi3PiLpP-XI~DUacCA@Qja*eJ%KB2+~x~T$|S*}VUMwO;aJH|Giz$J zr2DYI5>k=unMeQhcY z#N7d*s?W9(M!urTT_en@x}tTSK9fGNiD4+#h8zliyLA z;kE&$f|3>^culYz;HrS8cjVR2>_?kwFvwki!sO$ZSs z%I&}=wmiCTH2WQLOOD35&g=U6@NfA!BIgnk?}fj_&s=hj)ZQyCFVxDjXC{x(^{3PX zCLl8HJtwBm8#Rt`-$%6KlzS}#&(d4I*I_Ym``X7!D!vhmcMZ;{1Y6zGaF!})rkd+@ z$87Nna1A?d^X{obT}EB5Y5Jy-Y0C629^xMvrI~H3{MASeBH+CSaBqj4l^W?zVajVZ z?t|o0gv6~^^OQ!`+X1)rC8yO2Q_HzX_4EN0Z;a30D~;7#>%1uUDm)G=T6j?^uQs@U zQ?l7ej_Q*teX#nYdT^+3^6KZD1+;40LWz8nD8~uPS9BAW8k|(Va@#gqu%hCU<1x4F zt`=JYjg9s9t*POD_JTFQQg0-6S%7fkbjlT7?NQ1(IYQ#Uo&!fBuq?v8>NeYMe1Gj3 ze0iKKs>~>+ynr`~&DeIbTSpF>bME2eJus&C!*@Cg1GoBBSbRnp9>4b2ivjB@l*@vg z+n*UXAB#gWtAYi6UCySH&x&JDvPqoU@z0;8dz5v$vqhRctcLG225wdUe?D4$iu z)2ettzlvdTUfH>m)D$*G&Rq!+2kV3K{^wNU=r)V{ccjR2GmL$6u%!Ue?|%gp)h8Jr?R|Y z`m`%+huX(dJ%fCGRYCFtnSnrYpyt}{UdLy0O~RF-YjHjeT5@|B8*1GJSG5ZAO5I-T zo)2o@%sN_sXn2bWDJI525>GcO5&}qPBYj?*Bn!5YCOBB+*JEySXwKwx4t>c!Kh?}8 z@KwB|)YcBz+?zI&l8C2a-HoWhnm9{QaKJU5@K*Z#Rq!oZU#RX`=8Wuq`{j%(8+@B8i!+9kBZ`Y!K|V? z!Sw+^`PN%nmjT1360U5zRP+z9-27!qGxcjwc-*F|DVCkT9&cpblC|dui01d}9#v$KM@L)20FZ zn@^Ogq!6+@tNe^*&wNFvlrchUFNC-yGFKk&e>|M%sqYx*K)5Xb({Wux&T-8XH+{5` zpt*vvuo;6^ft6DkPa2h$b4pV#&-yn4)7m4GB4$h7upga42+4a+gFejdtj!p^CmDmTXbEO-FXK!( zs*~)sxAYv$yDfK=K3h1TnCiF@_JH6rknF+<`;CC08Ig*q9`jnTZ!^NnULB}tPMY~q z^ir_vgVDR01Bu1py-q!v3%4(AK1|mx;(yqjAYX>L;2OQVC?p%u<)wr9``6&~`%S9!aH6ygbW3;^=?QKnPnNzr`{ zAw5V#>D;6bPShuQtFURQSxEd0^7MEih(F1{(uS8#quc`lRhN7*rWBY9V~Gta0a!em z##BU=SWsdIRQJDq@lurM(_r}r`wN1+H2&!Fgo=>wS8l38yTcI%CcX%tYY%nA5SBL_ zVCRFv*@u#LTt3}#uw4U)7~F_tSJT}CWC{h8rM zmq3%jv?bWBxgBLdYkS#_0_I2Gkp7dXtyc?=lt0v;_*m;5OYOZ%>9#t!H>hP7Yu-;x zk*E*uAyrTIY|nhE_o>m2lWV{c(`<9wiD1GQE1pr5^P-Wzxz`|nj$MImEJx4Sk8paZ z?GSZ;tkE`lY+bszSif^$A+f_;@eV53u{D#JN%r&olU7{+@)+yjmRIbVA>Z{5qHfhI zQ+E8HUPE$}5$y0Wf(m_WlD_)3H_0B_&5^{O7PZdI`Rt>T89Ug)r}SDIQ44OaIW z^FTj;btvakbP~FzLZg!6gS&PyY^JmQ+)Ag9jm>-5)|5qx(LC7f6~O8rEJumd88g3m z+JAE~CGQAyLJ=}kG81_B%F4-3|v`v``25qDp&nK7w6w{j>w!=B?m#-S&QEY4T&AQ^G3BU zP302sN&2|e3ASD3#*qWB{{(NY5y*;2^Y)Rl0UVt_h4#euEBV3qfyaIo z&X-U8MmRL!|7SN@*ZDUa*?ap1^n1&hbq^jsbU-9oEoo!w+!o)P_M3Rv3IEOIzNCK6 z9CymmLvYf7^lW`wmZt2R8`__ik!#CadQ?Mtx=WWPbxF5q?uu%JYSZZg>IaVs-1_%_UTsrhY73vt!EjDqSJsE#-~EN?P4;MmNr?&p10d;CB`GH~W&R2Cm&c zCb?Bs_7sp>qpz<=N`FpU2t7N>M1CxZ5a<&oIgEM5I@e}qr>;Ar#H3&+_Vv5Q8w4lW z{T=>Te(K0?N8yE~)~+u&g4Q5@p2bzBH=dJ3hd?LPd~fMVJBg?zO2q!`xP$Jwf?1g= zDburjMub|uw1%OW@IvfVjbug(2WBMMfy)-3Bq=3g7U6w%?Wq|*QbRn=P>q=TH})u| zRS;Y+Z!Ji+i>K|S0$W|I1?v&ON=))d4ULuoyJJyO^JQW|mI;WNdzU3rB0@FhV8q{C zhN-(csGN`Y$XQb7nQGDPg`ZxD@(Hj_#rR7rZcZ?+-7Y*0=Su2d7kF-u^r`V|1`zhX zQ$oX3n})|Wl|yn$x@LpQq!7ZvJ0U<~jT$=#8EI8O^DC9%PQq+cwPZ3fI!tv@p@I3w za?vherY)n}*Hqt``LBeHDq&~p)8ZdzvN};>{BYE5SZhrzS?#iiu@{F3Yv^i&(l4Hd zyyeFiYFdLUP+TvBL@=rp2e?;X59f}&Zh(82RIC+~8N;_!20E+8shMeSvnGO0jLs)p z+|{|F%eVOo3lc3kT8hq{2Hyz6=~kCt>JUm2KhK$dSD-9((y~{J``RA3 zQH{XJvVDE#xoIaa&c?)~=&_4sUvORtz>2?MWE$(%v&mF9Q-N#aCG%K^k;|b#*zC!HdO}T zKPX-S|6d83+=bD)qEbghtzQqTjdAed@qc+3sj$f+=bY2YbJEc0vR?M-`GA6lUiMlr z&pvt%PNnqQe(C{n=zEIN#sa_c4qrA8lQ>H#wdN%$W`(oSGtuWNIg?V{&N5{m^fBiY z3kt=W0xb@cI2H@a@SRW{*p;OxyGLnz$+$#abud}^o$k_7+N68y^;JbdK4`$pBX50F z2yQE1MwnVQ-JZfcR#C6@x??P_vP0H=Vir_LI`wD_B`JL4b1=Da6T6&~_)|AKRA|)0 z%p91w+<-Y-PWrBh>fI)o^ZeHTP&fOWI{E|D-D%aq8Y2T6zXU-06Y$;-R<2o{A#uV` z`_T4$0Hlk~t)Qvk)SgQHN>)QX|I)1-wRVSTVPRJz=?0HLK!j7)tOy_ZCHP92pQKEi z*L-B)9aQm7J}#Tqs;*w_L$frzkFpUE#~DuIGi&onSb2QDs`9_AD149JiTA$|g0bIP zW6s=~Q+ajYm5eqqDzN|1oR{rZk&MYj+}9@}mvE&W1bqsHLP)&uG+H34P?ntq4TN<@ zU;hTq-j60=0iZi4 z?QCzgQEV!uyYrvAWQ{kqbM@<=9fI+j1yg!A=p)!T*8w5=AqEN(md>6c2_x9m8G(Al z$g?Iw$m`Crg8Jc}H9t9pUl##9(L*?>jsW}khyK6y6mvm)$vN18T0f#dVTrAK*$52&W;P?_(fln5Vhjo z$|X7uV|^O^ecI{mj8T~_QpO$gsbku@j@7aV$!8R~=67L5%mrl4i{&eKug8uD8fg)y zzA3JoI-rSc<$;o1d%jxq2?sD(6%w#m+PLB6vq!~zy&5(31fj@uaIQNMEz!4cl+|A)KpOAJv`c7aJxEPmKMXRB*S03zDCk)`DYYBxV9?v%vbT?Sbcu&2uej^AsKZz8N17$;hru_2v6>%*xQlIf{|Bdh{ zC4Fy%F@F<0`gb7?d-YcVo@4oU;q8<6cddRC^nd#nSCmItbn~kCPs7x^Y9qRz8u0QQ z^H(ZdgYZQEM8V?#^WF2kW=(gDyrN!x#Q#EYp>S3BCvS4}!jFsn7uFA0@XJ9Ul+zK6 z{pgdTt+FnupSR)Dk>Lqan;kL~_q5hAjoC_EEyVS*0!U0x^y)_E-Qqt;$jOc=dtp$I zo;DFqkTi@$ZMwfiN~&XyF8EoYhTl9xnS+Qk($YX7Q2Y_&BEMjFwb(@R1Kc83r;+<( zxh%y@apI6&CpWlM(v-d-?NCygZhxdDrHy;`;-eX)F-?}@O!keh@xvJwuK2W-H6B@< zItQ8*v)iMPWkenmrZLraaPxC@c{mrPMl?>R5Ci3pqPK3aqh~mrK;B}Hp#JF>-?BR=w`>zgrSs5XV|XnqtSKdBlWLhkaHydMyh+Rb%97WUoSQh~ zMM7OGYXvg8?-uHGke-XVe(a;!+noz*p#Ljmmik{eu{W)XJqf$GjbTR%@>ZBL4V*Qn z`Y-940?)ZdQ}FJCz-LhD30ZDv$~=;dj{dhtYlp9ai8HY^5aEb(1?6~Mr znwST&or4rmB23}onzJQ>IA&m2S3;h7_PwcNkJ%O4x*>;j-L%>$L0nPfT=OWqyikn| zXfDTx=^)c|`T+6;u&BHJ>CA*as$?GLI=MyRa2NGt$UcK)7k#JZP&A2Gu3fLMvUjC##`m5Q~!IDkc#Fpr+oIhia{Uxmx9X>mPA`;z-p)Gb^v^&V~l* zR~Tm*z$4^FNlsjFfAlS@4I}5eDcr`Js;t&?vQdg1rDJ?;D6NcEC{ORvi~am0uMyE) zV@xZehbo-Iq~>Gp%Z=~_X>ZD!`Y^-Eok0z=BI)?$&qk(Ft^!k)K(mH`Zylh1xR1+> zwv5b;8xpB&hMEnGLH%N~aLdMqS;mZNqGyZVYV3V|Gwf}2;hM9;fDV3 zP$cuoia%nsa~O`UYwsdx^UcriY%T$z@8lyZQRuq8kkkF+&LCFx#kkDshDvo~$;TKk zUf?-LT&mBL)D$55H)D{LJHK00PxSM#$$BG*dX)PrcyB7Ms2ig@g+HS5t)TH)o0+l$ zLu2o^!bYK$or=%Y6$H|YAj}KkK}Pmg^K=yKOkeT*)O*6{gFzP&>KTOkKYmW)^Y9TgbWJ#JcAPyHTVbhmJ;bc~@OV z<@dpqB3GySGSH>u#t^>pA0@wfc%`H2GpxSxMRxC(=b{)v8fN?nPlitPetRuIH!fx>Thb_l-ub_{%HZz#g%_ zGKKD|?4+;QE-m`zU80OGIUq5a>er`%=?7S}kjDW>k%(p%vE&#lPMr{lzkNbb<8)@o z4m4mx|L0;f8UEEZB}Ug;i*zS&bjFt8nPUHJY@eYASrf~lWyI;uvRTg%Wtu6{Noxpr&ao&juL;5+~j|jwh%iF<9!kLzgpm^h_n01 z1}}j9G8&F4uS6bF6&n8-ZQox%Q2z;I_dPHE5?btGWtt_#r0;t0;g~lmlK`1SuHShY zitBV3q5j6mRj7L%dn)Za?;Z;kiV4l@!|Pj4DXIMYaqCCKJ67&RE5}FhXMst4*r{XF z+aoAi#K)*AbHO<16Kjzt=TYOb*h}Fp61T8Vk-5goZsSm3je`zctJh%kc=<9VR zR8?_G`MlpXJdQ{00-%P}^CVjghvhcBJyo0A+iEQuu1?NQyU1sY#7a1tnK-JaV0j5@ zOu)jGCkz;r)nIxqBu8QFj^a6q@1+G@NHk>T1u|$$kNJyUKMU)4c?6Y3Vf3EK)u}Dk zcc%{PU{QM`-oomVqTd~-4h5SST+Yv^5x{2`l$P13iR$V4C>__3a15LBSsMQGs1Ex# zvUNlRueo^=-ukX$7U2#jdIpv1YWEsLwp1*A~vR-b|yYMiHe?<+d~F@ zb#ihTXqc@XoN#4UUZ?c#r{{Bd7(n|XF~CM}%v&jjfYp+9_`1%ZfLh|MAQx@j4k-J{ znl}kSfYCpIP_@Y@&~2KZt0(Pyh~HMpi`>m~$kY&NUt%1gSYwM78M9J8vc}!F(e`^f zv4rW!DCY?>SIQrnUC=4NjXK5M=R+7Vmlh@&ty@&p{#3@Vez{u2C&@!&P*b!DZK8Ui z&Bd}B9-ZUsw{t`itv|FlsOS>P7ED+x+QB7-5@_SXu3(|K^@V|*))@>ebt3)~)xNPs9d7xEbcek!9>Q>!LdB>8Uvc-L(m(DO~@q<*A+@OXm=%Rh5l_jo8| z$zk#xlPdI|Z?4u&-*nN5MtH#}X*1KP?Mxt#v48R~8=E{44bc*UutE{%=I${+a$Y15 ze8(7iIKbvb1@?GgToivYup4F4mXBMRd7Axnah}WzL&JFG)Uceco}daT<0UT3?o@&x zM)Lut`b-+%!ILY+@zuRQ6^ha(dFad+#0N1_?3dB{H3kqe(u}QDaIl=3`RhUy`LE-8=DBC@D3{x>mv!#n#SJ!uD;jH$l^NhN z=#=W9Si`itK>g5H8+^rl^lJ@Wp@^`Q(EN#oW)@r;Cw;YBjEA5c{`i){YKu{fo1%Kh zfgh`&uS%h0YNF(F<-qy>v9c(~OPuza;-YVd)j=3|_?Uye($P;5y# z6)5pOYcVGw1BQvIUzonCt}vVW2~rZ1G6BW|b7W_@8MQRLM{2Dhn{#*V#P6TXp82zD71LB5-DA+hM8S!PwK z`q*^NJ}FptRV6?DbRmMgL(X_xJc3 zVJrx%;_yk)$Klmqpd^7Z`%31UQG~0uVY~0`@^1vo5_pFMaz2NH^_RS^=Pwx@yg*YS zhZk!a1MtG_fAAt#IPZ6OfhPLXFyn5Z(n2lq%WBS1`|TZ7%V*yQktYT4&p$<_GttT) z#GIu}iqLbsqcV2wGbYy~5OJvfp3iEx+%#g`3Z)J8T66Ei)xW}O3+D+T+z4Ya@1tYl zgE2%hEZ2>=KW9Eb;SEXHko&O|6m*r(^hl9eXIPPMnmA$-TjU%|6WbkD4R`o-rS-J@ z*oF66Q8F`lvn=c~A8?!ipyaAkh53nl?Uo|rOA*gBWH@&XG79L+hn~RUrjch5j}HV~ z(H}_5X9|x`D2lsxwope9ipB-%Q`<0f$vVAbA^1`oHpDnSyLixtt8R-0px9U2BZQl@ zvf)j^q_3Ms53@sg@6?FOmEXy0SGiBz2jC>*+WG!B{*(8-+X#Bz5H|Vx1CxWcA^JmBlzQ8aWgBObnsQL|mHvLN(Pz?nOO!<}U43S@y&(g8bq##iSIkdJ z$%S`jct>2$#H)*3dUEOe5l(9N+@^A}=2_da$fLOfN40`$l5fQ%t(*hPP*VD3%eJTr zn8LH5<lbo<} z1e#<6^?Y?Cr=-oQENwkEEwg}D3_iIfg7z|$Ow?ULMqdnlhdZfh$*5P(@F^-@fCRg& z$MAx0V(sm2A=t!^YiDd+)NP#53DDU&R5qW%UpqKW;;6cdgX|+(r8E4oot}owLqikVE`& z-N_ZoSRXzpGqA2XP#Tv(o?`j-eI`a>0I#Q$h1wyy`w$3!acZ_P$VFC!GT4Z-SDx9a z`I7}FLXCD=mhH4-({u(5pWo%;H-buc3j!~q4Y0Ne;4;n`5@B>H_Wso&w+bQMRKejM`Tw|&bA>i8MW?TZ{zf1w`o(@wYPPBXx2_7*Yk>dIg5L-;%@Y44iU5xP zd@XC4VXN1JYp8`{HnOIg{jO3p^hjjmZ1rJHLryA8$P7%hM{FgUN2%$4uw}U{~MY~ zOhF}wWyAoHq8>D1$!RJyJw3nbd*hBfyr&tsRpCkTt4_)_I2YECBxnS}!2u_m89#gs zYh{~=C*y!EtBDFUd*WP;;sS?17KY-dq^RyH{Wz4=l(!b4edfQsgv6dsoyT0C7|fy+ z%y2Spt46eerw_yrCXa@X^i*6A;!D;0!c&eXi6s9FyEl&aTL#CzTvB4v%f2aWZVM1v zVzOx*fS7>kDOmG(R9#o{;rkXxTWREV-FRg$+hD zA}8Mbln=?pDmxiIyMbpVGtMIZQYrM5p4D@<4(?CTN0nE13*4T{U2mGxR3;izUFl1W zn5l*P)}>-j0oz<2ZESS+w|ITF+Us&cHGS=ja9q*wJPpGCG;W!;3I0&Hkc+qh%@~9( zc`*SlW+|7apxEQG!nQ_@=tcdeDkl||kob9Cg3RPL#XIXI6FTMAZ*i|qKQ%2&Jpu`Z zw56E8a(~Kc4zW|Eqiy$MK>iSu^JO{5qe9efxMM$?toAdA`$HADP@b%-gRl}pYZZ~QFHAO2cvPJ_FBr5Lqg!5kA z*i;I2!i*HDUUa(t_(Ngk%ja?Ebi}8sZ+Of5ky@lDL3RfiOA>*NRSK3&`j1S@pCcBr z-!LR3%|kGm1ER}6j!*@oG{lubb(+-pLlitjyYA+bS~*KFNYF6ogrNushDeCRNoS=s zySP`=;b_+O@$gm3Oz?KA3bT!{?=Pv89)Zoj$9(e5;A)Vd2FORj_0(5u#cVCs9W(oe z{ZM}(v8^-auoUbYHpbiCuO{JOXrNH+Y;Gz-;>QOhYY+)m+E)j%z&{QcAov@B zO!JCgZq0c+=+$eX$10SfH^7M+(AgJ=MbRn$rds==%x?7xy|38BHlX zwa}Es*1pza`EL1U?XV*Z{Rs)j(v#;6ZM;Opt{9>)nN$`2uf)SdXl~jHQPPAP^6L3> zM{vO~Mv=4ukz<)FHUZ%d@xpE$%K%|phNG94PJTvQVOtO?VBHj32Cg^A7Ji_F`FPe^>FFTkHnA^-cP6e)+`iAc` zKl{4I{?88!Z>5>1zTU-F z!l)-l{08B3ICU8KA<^&liTXN4P;Q}vd<3*j?|2-5^Eog_M4nn^I@4mRX1>gqQPm7P zQh`bi0ehe-r|Kz5D!K|*t7)R?h9z9Zqlt7 zan+q5B*wG{=2ddH$dn|QFx%Bve!ikqHf+##{T1PazpP4;j5>Y4BkxXlArR%|8PV(` z0Mpw%D`&wW#4npK<9t?}J(^5pS^ZRj0)>iQ&uOB5zUp^4 z$!#NCR3F4d3k_n_3z*2f-uqm;uYFKwNQ%7KccX2&eXjpOljDBORB;ERC#L?@Y(dNN z^+Q?X2D>z(0WT^B6QI~GRWGVe4pewCm9Ome;z<*^dFBBrdFLe7B4N>W?i24qqMw_4oJ zp1ad|VI|M6{Bt)~{!uzfK`0sU>d(08n+Y<0n#_+};xXa*% zmAEtubNx+iT$#CCu)Is?%Q|cQ4lZ9^M9uKQWb3rm{-8(8#5leZ%N-7?EHF{HlRQ_!tGmGbV5?sc z@I|0cuC?rz#qX~h8d_Qz_QyH`B+=_N^BaM}BVjE_Pk|)n3^t#+d$-xBGb3d@<8x+Z zIbpZrob10QCBmEht1LO;3zuy7eha|cE*t62-znN|29~|kZHr!8q(hg=V-9ymQJ35I zk160A1-TgY)YN#=rbY0P{lW~;2VTgYRPW@RJq>96Fs!j$R-<^99Z%)`^3ZyxKC9O+ zL5P2&zJFQqWtv=3PM>Y0_c_{OZhIaW8{V8ZYFn8Ymq zS9q^puJ_84wDP!X>s8?`}C+}rOO2Ung z)!zuqv#%yxMYn-_sp|^N;Hdki=Nt+fSVp{U$heuNx@R1GVBxN~7B-@cm8Z^L5I<2P zF~?M4p?3;9iH|Z}vy4#7FB*$DIGT=Yl5=O_ofO{myHOoiVUDSj!k#&gaqBEj zQ`06_o)S9@z%h-<;&<7XRI^HiH7c?8hmp!Bp3+gaP7-}@&`*04Bq2W0Ih<6m^eL=W zr=BxdhE>q&SI71rzg`*_Bae!85`7B9;#uKYknJ ztl{+&72fFJ0ykCUz5iljxS3{(hSG*ii55HmLesrwd=( zu(RT1St(*+DJbq`_rxZcmH-^KnFt$lAKjlo@FNn3L1R3U}eWR3^i^u^UF1vpgm zwoNQ+gS)DY@$UVqU@+K!y0Jn=i@hfq=634K^qx~XkU;W@&g|(^={b>kg_`D&72e2* zOUZ67d9a6(u7)LH@r`8J?hB`-TUGw}Et`J9#N?9xr2`xg4iRwU<%SfHLLfEKbSmU9IIqA=%YjRBJSfZ zwwi~VEEg6I({G)^K$v~XMFPX1VmIV@q!boe@}<&S)DydcFfR{YKL5i^&}#J#1~dqD z^Q$MO>0iP;2*bZU#J)>5RWoPTCH(|H7vOPyJ$w;uv!iZ&$%!$#xs&WCB8gD0`RV4y>K*G2=Wos5lW4EUyN zywGWTZiw%hD5@8Rk=XQ`Us}rv)iI4zG zL;;Ei_#XO zv9AFa(!*0@moNg!Nc{*{-5ep4>)^#Kdow~BS&iVi<>guAsWxmYduh#|&I9I0qodcH z8P+GmKMz9HeYTQr9?Fyu))l#mziaDH=y`ATdjk4O+U-EdN#3Ud1yj#(@**2v-Tt;8}gHLAaFRlFl;sWCi+~Z~HBX3ys-FG2GhpuHJeH5OL11Zam{ElCR;hH;yebS2xl#Q#~aB!ZC}R-WW^ zpp6k#SY6B8U7hJ88YetV4X(CqG21T-bjC)*KuW^P%C+EqcvK_&uyzwNg{C!9XYe*x zqB&S{yKn+O*$+cr#?c)m>d8e)w;#e);F6Lzg;)3R|8Vw}L2>Qdx;L%?0zpD>3($=O zclRa)x5h${V2!(La19b%LgTKDy9al74^Hr8y`7x1*4}5=xmEYRpJ&f1ikfqd|9Hmp z{KmT3Y{NsgrL~HB7`8k@)a}@52eP!zcCYiJP2<$|NFzg&!qp!A231QNz6pat zR)Do$2(x78pb->bt&#Q6etRr@{24!Q()$x|>%%0`qE^b!5GVW?udk?$UWi9b5$*F( z`rKstJV$!LjWu0~TlFAmJ%`^DTKs?M^s)L@v9H9)V3E9BW3;NXZuWH{oAh3KU+6vV zf0Q{Qkjn#pa)FQQW1n}bFAslG7%B=WDogEYIsMWg6HoBd>IHHsI*Q9cckNNYe$D<- zZ!-2fqOJSlYt0!h+nRn?EL^u->VQ}Y&D36#Cf$X51fk(tgSxErxCswVDnI*|xB@{L z9vYOJ)GMeVuLo}_pgI{5Gg@E;Q{(zi>3b&hFJeX40*ml)=&T-eObQTot);PBZu6xy zh$@5&eKH~WcA&&}lk>--nifet*ow4xZZ(72<_sfKuL4(#UiZbiOk1fT=`)FCO5CP{ z0v-d#!EI@g4#oo5uUp;<3qb=#JsiDqfuLdaNojKP3i?}pvF28`#s#hGJTX=#P;9H_ ztYq8woL8Xh_}3eWypIgm13JSR`S{rl$(W^TIDJV5STomy=i){>_i9U<-vH(VMJT)yh>oY({tjwudZrYK}Ti&X3nUHA^e;D zd7*__4r;Uv=had8X{9PtGG&4dO+8r3jA~0RM1!yv-(LFnj1-7v{U6p@S)}YC;HtG( z)=OeK?bLXZK zY*X$aIsdGzqid9|fXFr8?n}b9BVsptQTdyCX#Z?wthIfHc7tUbUj-{>ZLSgv9UI-r zRf&r!$5xVXz40%R6&j&p(s)}s$3=O2Z);OqJYte>M+;=M1FYj1uzxF2sC_$`}ghaQ7R|v;_p;HJs|!9yzrdx9$16#=4!(g zT-k#KpQ(0TULS}*l$iAkmtPEQwE&!u179&8vsjkDOJ8x?T^x*!82BRzHcX^?{+BlQ|VV6lhwoRB&$H{izF4&4L6m_rY^@IpSI*4@0 zjLs?+MXG@3BC3tVF2H?V>B*n1gC6#k3~eJEv6Jtajpqrq&%F9tO>a?fI|zW$IWvfK zLDArmIb#B;-3=eAMN8J^{WmKOHjv)x=^3h$7TH5@xX|k*9Np8IyPuNajpEv z#8VFXp9Qd@##*rZ!N*n&zNy$K*#)yym+3Er#Iu>oh}oKbzh3yEbGXb`toiG2=+Ezz z7(B!M8~gJ+C6@FjB?kDD64U$>Dl7RDD%1EAD*Ml$6QjTr8qMpU;Nz|eswgYCroE}a zcej4+_mJY1$7dIQ`Ey?KAOFN7>e}BzW=RLrru;^9RM}%kl0)DphxqS~52_@5yS9=K zKpHw^hhu4NJ+2~4B^aiV2B*`mv@W7ssXo(aa~Q@RdrL6l{PxQ2$yC_aTkK1ZQKyIK z5UYhZT)Wb${Nv*u1=1p8G&lk*Wf`Z=FdyNkUl-EaLho`QB=T{my)^qTneCXngG?Xu zAN(tFJk7&u?J!ui8|zWzHp@R{StQVZO20+J1c1W$2gjUt*TTLwhpK|zb9+k@r(I(n zdF$S!TOT4IO=(qaYP}KTcPxu?UY6Eb4?ibuF<92)pr>BmronRPW4sDK%AIiS)Djh8 ziomz69rG|_VQx%&3D$#$2Cung__Wem6|3YOb)$}L3Rj~kXoPEbgVw^zwGL{NY*wz( zk+xw3d7HNhK@T%Bng!XBRxl9?n{q{Pr$ymGz@9P`AHw$^4WXdJ41>PS79auY^rEEV zkWpaprqLdV{XIbowhajliJdCrM~--jP9J0#;-LL#-IY|gLBTbbU^opbMy(5BxxabA z5g9EJ(*zOfF3B@P5Ikbvh)tK97gT*XacQ>w zl42*!)Yp9vkpA+m9D}vSqtr>r9z*oTd+^DscF*8u8({E$dQ{(7uH!(V#whc}JrUuC zE(c2Yw#mM>`Qdah?KuWcISs$qGfioa8DTK@*EwsY$&?f;|L_{EiQR%M{iMHSXcaW z>I0Yk{W_FUF?q;u=p(cbsP<7k<;ke?t!hb6Y|A)lNiZ2r9qM*M>#ztbc|RsBP3+s_ zffbTBHJKWc-grI|aAEGg@rORMtAAQ)vFg7`^d(;84RqJ zz3&FQb%PQ=O~Xto!9@wg6GZ*fK0Ero*nthA>M`wxNlZgKIhen^yIG za8B^28wJk5xrBXJ&G!IS^MZZZJyx9nCYD~80#j(OHQ|Rz1~=X}mCD|lWxJe?4d}n) z6f+h7R{m1L{F5BcBG`EAoz%R>D_ITghH2|Lyq+=C#^CMGS6@#Sf%8*MQI@&v)J6(o4Y+=1jo!@l*O zF6X{6mCITNmldPnbjGYA9NwmF@sddEZ#~i&Oy+PNrNg|+JbY&cQvge_W9LC*0tU1p zWUpLwy9aNp8a`}_qxl2Y+(Af{)TU+ZFtDB+^Il?bvGhKs3i^ilKzE}!&IuijGo1&wgdTIhD6PJ` zz-ESy*}AbL%*s4F+BRqef>?m?>&*d3jSv@8{`fjs1jqHYUl4SG%TLCszMX0*{QVUI z*Zox2{0Ljh6gfYv17f^b%@#MOj-Nz>n%|rl9ii47#jLA9;Wdwj(V0P<{_p@zDSk`# z)x(`g^Gb}NurZU4c9E4u#-X2zx^)nV2U#MTS3L|7H=awi+|5T9`h05o>u9}j zqm&l@a@7d`-BMX-|IHEkV<9hl)z*46vIw8=CYt_*Fjmq*bW}Un?f{1;uHQu58%VKz ze1b1jB(Ds4|0r4b0S-BNl(hL1v4YpdJM|OHYB(IlC-;x9yzX@`9F1}lyZ{$SMJM1D z^Sp5B#s7AT^=)|K$=nmqU7N$xhxs-5Hd2L-|F(g&P%yN(!K0lMZ2t&F?H8_ubN_`C zuu>j=PwY-qIJ4A{c#L5+Cft@_hVN8-p0YBw6EuI42l%4wCCsPHl9W#nCp?O8c=EU> zYbxI@HQ;&sG3Oe2euPlwr0CAA7Xzo!sl~GC=5F46_07*5v|$~26u~Ob20=zd9ePUt zNupADLz6=R%Sbjg9WMPY0(6d?uNkfnbO3tFwSutxSEUjF=N&6%0)p+!n-eBvR3-#^ zM$%hJ@jiTAmypZLq0s#Dl+vizrVY6?EbS^rb}v~I1UGKzL}J0T$p?yQbw?Zh@f5`z zisdMS*~xx zv5`eMV3WkP7m@x?O6P}wWpwahtq9Wj@nL}ID$P6I%cU+g;-q}$dI*iqkug>6`v7n&_%TPu|<_oa-1e5LowhoFa#oS zB%jAx^B<$aeqXMn#sM})8f#R*9LWd7%WsX=m?N1NdS4%NB^9N}0t1eh+SHr1m8Mq0 zUImWb4k2J&+~`SY(kv|lwDY)mi|10@n?EWqWoJ4hI5sTvFJ<$v8YIN;DVdw9@qdrf z1!Ax~j&ma|orr8CbWu(;HBUJ;TBq8XSVSjp_oDdK-R3ctQ$# z7)g`j-bxekdeV&5y%Uv*Sr>fwxlY8-FX08+LLFM%QjExtQZZ>4Rgp1K?ipv;Lib%? z76RCL)uhkfG}Pi$%WUH>1mumwUwFFClJEI&AJMicFPy;sPnVHd4_!Y^FE8VSt0T%R zRtc4&u3UWqN=H&B1R&0-smUJ~!^uZ$sFp2f1ltZ+beFk9K6|S6W(mkIouct=dv0n!cp3}@wHU^9G>&z(8Ggki7x<`RL#QiW1ne=Vk{4|$Z;JR zwIiT74h^ZSXzgnjksD@WVn{JRIL>F*+e$)@%nrCTp?+^vkdWeb;xS%j);u*vw9v}d z`A-Uk`|t7$hZQlMo^8BZQget_dY=8Xrlc;minZW-xwoBeD6qm6k!w@0OFI85B4-IJ zWe3&$thv+=>n{YeM&%a%Z@hH;S0hJcAV-DkvUe!aIV^Ei0yplO&4s~BNB!gVYpm}E zY$ZYco7d{QX+hU7s#`KhTq*R~g>*DOE3Ph0tEnS_M!c`0M@UJ_Y*7obz4QqK&+@hv zzN{`b22}{V?Y=G`J1RE^Rar$wPcDAb`8pCejVSt{mWR~d{Ns`z%j(Bmp|?<0sX;dx z-W!GnC_;hwf%-*0U#snKo{A#IOFddRfv^pyPm!RK*KNIK#QP(~By4`_XLv%blYKk8 zs!(2B{UW%re+=1MBBddHeP?hEKgB>^@Tok`|v4WIH63{{at zt13hQ8v?LyaVovBIaDPIN_iuux2@hCMyx%Lw!?XbUw3qCY$PxMr-g0>R>Y!OAO$XT z{PtE#Cj2WRi4NOoB)!1vN6WHj2F|rut~Gtelk$NCaZDS zHJsDTzfrTeCBe@%`cRdTVBnx5>5Gu@Im*1L!`!z)sj6YzW#;fT>$8ulLPg{(c0QACkJ5JuXXnsv zMa+XF_T;m@A$eVe+XTXF2E?V3WK!;}41|u#Ss!68o|Bce5f00yvWph^q3Jgj=feoQ zO5&!pl7X5XxX7ylm`89s=GffWK;%I4tiwsp*9SYrtd~5F%~GBc&lqG-q0S7VMwEGF z)?p4Fy!Ca&^)k*P$GX;f8*_YZvL|yN0?fJQMQUD<=Cw!X0#TVryM)BAxM!^xoSta> z(X`$#H{n8T_Ys|Av0G&q7!KaiES$!I-d0^>?`V4fbV2e|>ByGiBI4AyubbN_U)Cdz z#_9er5_*zcltS*heDHessTS=Jx>L5rf_X4QPCDPPyrg>@-F}lKN!}7L_ZqJ;%lwtOsoq5B0ZqLTXLAIM(9v=Y8~K>C1V~l#PF8Hqwfs4~Af?d$~2_sO5Wn z+yeARXmyS**86S_Szng)E;|aeP^mn8Qja*0(G001F?Nmor~56{F8S{{;~)9g+OW)8 zu;kKVZIkYogXYuExxxx)5!K~7+>&2`@~w&D0x&&vr_FbQ)qx`*1~2Nu+&fS3a(+Jj z`FA1jd8hne!Rr6FOW=#G5Hg;QXAf?k+jo7HQ+|^>S&aV`ppI3xU0r8iwcGz^GHL{6 zOZYo9rgksCz{!teWht=YBJ7icyT8aVNy1BpiJ>5%+K&gOt*9H?9h7{d0D5{f*_PIe z-~}`v_QETlLON(87Sx4fFEYQ1B0c< z!ZsaQ3X;p12(luuPH{1qxn;gmzIG=mnRj`ujy#S2dp?0M&y;#)8$oFkK<&SBF6*PUUIv(&CJWW zc+0F9FK?7uH!Z2s$~7k>;k^kiHnOsaSoA!P>@~nHg$m>uHmqn-Xr~x8hvl;h5!n<2 z5>t{!FmTGUoo@$vRf(D@Q!I;>MMq9@`2jekIp|IB87s+uwA9=V_kl5@4mc~NCTVGh zF<*vm8l7}pp(A3S*`BSTF>C|w%B)Wb-DC%8o z6NR9ia?bU@rk)u}6~7~~D>tMDiYsHz1?}Za6!2FNZ9C@oaR0jKxrauEwe%PbUgG0> zPW)w*mCgAGKR&yb!r{D>(uQcqm6E706tr_WUl)~MXnFnJ3YSt5quWi@h*?}|@w90z zzoe}tj0Qdrsrm~cs)CR%@(H7@FKmzxB9cB^7rZMoN03)Aklh}b|8q9b{iLq3`x4^V z2wJ0QWC94&C2-B$-r?(yZjfomfj;xR1`Mfp*__$O*HfN~;0W*%+2WG3lhv27ZhH3; z=I2L8DsL!5!E^CiZ6=W(^2D2vIk0hEb12e^E-K?z%#Q+5qRp-qw)THG10VhdBoLQB z<(-hg(DCU;RAt0|_r?4TrF7i8qpv$LDL)d)ur`JmSth7FNKnLPV&;Zubhy|K1g+wm zr`vum``8WHPuyn?VHUs~@Yed3j^Q)B0ZSWFw2amxDR!p#3|`icWuvpLQ_};>AEh0O zSwF?<(k7i}j)IN0&;wW&sKT)Z3U@@Q+|VSSgY@2c9|z3TMaKj~j8vz2vP4o^LXw?t zL((!-Se!6lXDKU#`N(5x%dk+lxH+;bj)3IheX` zIf6nm7Rv2uE_jRj5j@vSFxRVDboXwi*;?C)g>y->iBlXj$C;A=M+F_S#VCE}*G1Pe z*;=|ts=HYgj3nph)oCKH%ZI7&c^^07JZN@M zNaA_!TFGvJ*3l5Kv%o$F;bz|5dt?s+M zp1D8CRf(oZDvzno5cpXDZm_f)-m2;z|L(V^%Kok2Mh_1&%O+S+@-8-R{9&+;{t_j; zV*j{8wtJDn7wUXnL1t;vd2Xy!#vo3k^KfKD1YH|pI-g9k(v5R&VU2NFa>6I2HuK8R zksnwp$@?f|Zz2awDX}(SZF4OQ^%kD;W}Q;0`}Db9E(i-~3A(rJ^7w{ONUW^MEZ4-d z81cGywT!T~?Xl*{`qf2tcQ(#lq3}_7!$#lav*O0&B}aO`nN0<7YS#-|XUz zCQ+7XZO63d+|TfU(YjB*#*EZYHAjJ0`66iw`LdN`y9|EZ4jty@pZ^+Of3{>h1kY@x z?|tQucCg=R8XecjD0f%6d!}`wEf=Z!^4TQ}*T+|E);oj3Q@+q?X9RP5dZTcS7)Dmf zZ_4=9sMZV;b|g_>iz<{%nE%T`(I`t00Ub0yeLZzZ#~K&);Cn2lJ>OGl&w+eq{UJ1U z)J|XZ2xh!Z5;_Sp*{U_NO!s=L$Ev(S*3!q2LEXqv*Qyq9K&~Es_%tP4npA3G(w1bZ zMU+P$`2w-7%Wt78Cb9WojJWpvy3d^cId9o1ZUw7{m4T4mOc4Z!e@UbB-N1yS(;lZ6 zR`Y9e@FgiWPLj{W9QQ)KZ?+i$nFkw?Mqc2%`dagIpV|6K>+kih*8eKsGl~D*_x^D= z%|q1YTzFO<#^d41o04B2kEiD~XW?maRXEZQ&?IJ|@;gme2X{D?`~jfA zd-Tmhz#k-v#-k)0O!}vmYl=?5k)_3d*eL(;<8sFfjo;F>7)gau6!@pn&zA~YKBd1x z;orpheA{KcNycuo@cEwf<+ zlm@Z4Pfu3be8*CrU~jQpaRF5Xx8uAbMKl zE^|JgF*JT#WO`ze%||9y)WInl(R%JVNo1Qotp$1g`t`RVc=UgOQKSX=!=U_v2m!(Y zT#bftP?~@LuBulAj&a1Do(fBN(SE8h*z^7wB^*CP85mYhEm=T%Q>gqa{P@d(PF{Qct^p^@l&Cs94qrX ztSf14)W|e#Hu8mIz3;y)5IAB>;dh(2!%ZA{Z2xjFrpNYe53Ets+=9YpNzCYR2bJqv zVjF4%dm^Usun0DHaYN|{wFz2%T6^3w;xu6>!T50+@6fk3+dh6lBGJCHESxRi_bO!h zmdi}MzySuUi0qUmV};+@zHZM$`y@N(#h#IP>H*j-*$0K#H>@t&Ev4XJ$8FPDX!*?2 z$G&}`w!8yn@^`7b)fGs}+eD#$&W9T`F7|34_A=Y5|1SiNbgxo-v%Pud6rYn5rk$AJ zZK9lH7!t8BNp#z6WR7AuGSh)?*A$eRk`h1kTLl*}U28Z1ftni%AGV~=)i$!y=xpwx zu(!MlE)~L+x3*76fCkMxucW(qRpHkz4&J23h7PemUt!Pe`o*^PU8y^olGdz3gNS+; z7;~`}2-iRIV^#G%biiA6k3`5>*MA|Ty}i^(zC~#Xm_XiFu|;KCXx2ufS)tWkZkBYh z?eh+1)q$@$08A+GSYWhPE(G|cq@^?&Mz6X|!jC}dPvamJBieRt5Eo9w6=y^F z=%-~DnLfV^Ya!ZaonW33Xv8;Ow7BSRfr+(DE0Y4Q0_VIC*V?F#4&A>G z=IPr{Lyp<-t%N|6EtxpoF{wvr*5unLtW^s``oWR-TDoV;P140crr~xp*pAwSQpup| zdbXPe4-2$6s&J|tRXmAzGs3K~R|uIss+dpyaOh`FDOjkuE>d^-KLzNG{ctmoQFsh} zBS6A%RnJr1QrUd+q#`)Gl4vZUXHf4t!#;<-h{NA!=lX6&t6NL|Jn)#$h@h3fZW!QT zIpdHWgZQ0nBvcH6!0MT?^T`cw6S&~MsrwZ9V4t(0iy5FSwTBm9(erK|sitLY$>>df zfxf9|0;T|{dMC$TZVktaPMD9lm}5B&>&kN;@zw{bsz)H41rm4QKM8TWszeSOFgpQw zB}K6Aa>$G_gLCDjKh4Ci>%dT4 zI!eZaEV|rVsn2DVdIpwshcC}U8st(eaX%ha_`(bTYZm1qnoHtUgQ-X_Ejjc+1}jks z9BWl?CPk9nv{6dyD^QOpQ$DILGqAm720m-8;#!~3%29A3$iraEBg~dVkLjpmbx54z zgEG@!tD=0oAgVz?q-N!SEC;r5{rv^jO0xRz5AdJGr#i^$+_?G8nQi-Ge@cYvFS@Me z{xZLZ8oy;ASE^~L9lakfY~8}p-ExR(^iLg-{{{I|3FNLUf7gNpvGhOHApU9TPyZLY zH~qVOz;F9gKdF|$^V0~rl zRYAFF01x4v`_y+g!69RHtTr9^=!?UM@-FCPU8k7Jl0vFPnn`fwkf*aOID--S<#=~k zyWJI$jjeRSC-NNz9K3x&C`A5o{4@`kkHYr~$PouEdJ`Au9gbWK=X=IIc}`C|H@^A- z$vYVSAV6@&p!f3K46%W#3zVMxJs~UOSsoCzZI4cv9dFq3o-KzvVPiNB@4aXVZLEI1 za($x+Y(!{Nph*#n#(?8CW0H9JH#g|t;MLnylmbKB`}q3HpT>$?7{9<(2adIDO*6MO zu&&NrN3 zc<42-!_uwf5waC5to}aSR77ebpZphwio}~%ygJ{3E04jZoW(0MXmT=TS>ea?Jeg5+ z!y1|UE-^>^c2OLhT&K;+x>A_-<)B;fBd*(Lb2+QuxpQPCBErb07^?twUwP&-51*0h!AkGz;Z-Vp@{1UaNABS_)=D9UB8HD z%(^J404`jPMj(-|&nw+d^3u^1~|E`xPJD!9`ZcWKoyQbV4QKE1l90n-cO zsgTcgf)pS(Q=DZ#KZ&%d;Tp-dz`%cFR%$W-J&Ku)O>_VnA>^X6>WZ?cu9!? zy=u;V>aOXB20kirI7a*;oWutCUzQ`Bp)ko>OseZ~-&EWbWU%EID^SRl8+*OAt+x>R zG}XF>$9XPQbW7-<&6~jjAjjy^sL1I}z6u8?rV!xvEWEmiYOU0NB-4bXj#&|Q!~lo- z*i8)iiYbTl21Ig+myz9AT{a3Uw`*)RZOwyGomQ-5twai}3A`!FQax^p;tS zYbUoTml@{Z2izc(ombnf5C>E%Qmj#24IP05N-U4wTagRHIy3P=`w|$WDC(5%a3^Ow z#XXAa_`XY!@O3W9>R)mwny{=FNLbN9W@~*wVSCT4RK(@tJ0bN5dQP!TvkAJ0QQ-?Z9SD;^*rpzOp7UU+s`L~a7HzzOg@ln=*KOiV$ht-Gs5x#Ut1&@sCoR$l)_R#^&QY5TBm5-u_#l>{W(mLO|3NeBB^=qm*mnY{e>8?jjwOD1k*iIA6J1p#ATd^A zOH`-8maaE7XCFgffFZNM4+dt}jIL^NdtTl?lWFTj1oC<&wsYq#c7GQY&7=R}nR(wP zz2<`Y?JtBMCUD%Mc}I+2_}_5v@~A`(OXZUgH0<@!%<2W1DW&J8#_j zF@6zl1XrzcQ~7?v>&A)SFPTl-*|vYCm%dxA{|q0*m;vi@NH$MVNagCJ0Q!%Z91J^K zVNKPnm$YnL98wk3IFT!eYI63z+%j9sm~B1J^p;sZg<~rg4=4E5gf#;@cYXFY~C z)CPSg)LG^}p+w}FC>F#B+9BrVKA5bH9hQ0lEGxcoDPBbd6y1?bb|*3stK_ zo@H9XP`xt~Gr*T!-g=iceOi+~b1mn(vCo|Rxa&S9N+I@&HsYv)t#hW;aB_up>Xh}q zn0>v{m>!>!-aJuPa`1a01sDOn0?qT8Y2+Inlq4z0P$cRA?sjbny5X0{qR8xQ=DiSJ zh(m$&MGc8gUiz#cLvBzOxMG(>T7^ScFIDD0QN3&f0 z`J<}5OJ;dB#G{wK)Kaw{aXeXp!kVSxJRt4{>>N*8V2$obOfbE)tzQ43L4SXRG{!&& zQUI1E_yiWel@L<|h$wf%E?r1>kgCs(bjDKiZ7PgWXIR#Y)nYddb>QTTmvJ+lF(2@x zL-06aMKi7EexTO{$`p6xc3!-tXX-ERI8xlvg~-7gf(7tx-o(Z6!j#{}uOP^mQ!Pns zgksfWJOGXDow($h`h-QzV_-0>|qA%N}7$?TWdOVphV16R4i$!J*Yni+Z0eg6xwcZKLN32ps z*=6JJbcP%hbQrIn9Ast*2-vHCrqj*!$iVd+Ao;lk3tQXt<2Y2_1WUZ(M4w;N-e5p~ zIiEj?!E9%jeuuHr_*SbZ1l6Gvx=i`cT)tfO?>Dj3h-t{^9213lTQG)6Oq*6l=7}8> z`fX87!z6jxf~jzPMw3m=m<~9KpW+tXz`y(b6t7%e^0JJLb=SGDt7`!LB;HVfHH1Ou z;rM_%)n9EBzC&RSJWlzox5XOgMER7oXqot7%! ze=j*7BK}Gj;fhUIu%(n7_dV#;-%|sMLyx36d1&UOnD!>G^1>j~r4Pf?C{mm}#Uk*`4X z!BK2ygh}+b!o4$#!%bNuj=!~m^2ok_vCQ%AVv`s;@K@A))h(P-O3!fW`UP1jSI)AF ziITd*>kSfI>pz6rUg)$tw^IFivF?i_~25Bd@IR999sx?j` z%+)-!LrmHF+$#i0Pe(!F3N8*d+xH8b|AjE5&9dAtf!(xvZtYl^QTiIH!LPh@#;FHR zBG6{VQcmGvXz$qB70)ixJjZ!VJ$__rjqh%$25{%wMbi|1PRJb8Q5ifH)I=vQu9Or< z$?6UtzE>}Y(pafrikfbb zvSyE$t6MS$N?g=cf)-;rA-nk!3pLQLJBV`Ey_5AL%N> zpPgt!_ds!S!osjF=GaL?_u8EDC)Lg5qRrh&OpYI@CDH^MT-DYR7&>=QFAY&^b2m0s3EsaUW9kf^?rFO?cEt^cFp@D8LnHt4h8_&A#1Gzl2!DH_kj_m--E zL|V^2LB((okINt|L>`QY97 z!J>yNS-t`gut$I6P~{m_*oJRi(K@YOCtExxtk=Fg&9=-sWLC_Ps;aM@I7O;xdrE49 zkS93>PevU|YXLvvXN6cvn;U>>8>@1e+&2hgA~3J6jxX|n=_{t$t}Cf2w?kAF334gvr_`SlDDSpor#OT?#zkL>YsgHi@ry3VumNCt6JN z0(`{x>e7XRC)Fl8oe${Zlq?j{vwlypAvg}@H1~e&WbvjBF>ZKyzOVJ zh#D0iG?p!NaDwAcOGV$S5{b;qEs;Qsc=u^7!w!r@USbM}h(8`gI*R^>cvu*Hqn&>- zAC7o`M$N8mpl^-UKY0>!BT`DXa?*?H1YTMp{IFk0EBI-<4k1M=H32KT;^3? zX^ZtE;Jj5N83VlAx6GXh(4T!JD|PEbWfffSh@WL6+|nc-bo~kAcpdISEG$$)ZTmV* zGV6Q_CC?A9y2Zch?jc?i0K2?^Y9*Bem1TIcis=RmVHLWGLWpjCd{{rxBfDzIe9WMQ zl!u4e?a-}<+^^m7GFyoXMXbdNB5=MY#M5x94I!{*0Halc1I@+m zS#B)5{g!4tQGJUK7p@O2>YdLp_ffs~bq*zNi-JGGe%$JI=&kB}3tl9XFz;NO#o5%OXLxr17PHW78sV@&@3~K*470PpG8p_&EWYVC=Pxg@E0$m!gLw{8 zy%_l8N0<`R%cX zN)ZhnmJPy3cWSZmrBS_D44Ei^wZalooRbYGWE3B-T)Sa%sse$xT9 zBH9;S;})Fs){IQ7ZoVrw3i;z%?SXF3s99C3Ls~*6ET*{(qUm9 zL-9sPvZs2vjcRSF$~N1iT|^NU2Ew-Qx&88volo?*J(Is(n8fyK?^GRbQMAY&$$P$L zZCW59!>Lb{x3t{xZ%ovOLpiaWrtQ!41L4c1H@~9h`q-uhffpGBtTUrrUsCN<4sTC8 zP_S0GF<8-27qK#K!)9aVivUew<2QnaP!r3a>jqG2@z zMLkfl1E$6bxj2F64^Oinb1h+rCXp$){5%ege2^wkD(}j2#@Tz?+xr}?&zNp@}N~ds3ABR}c!g2@lP1Aso%yHZi z?N#`CM1diVWtYu^sCounJ9qWZSTUUFag@51(!rY}1M){WQ1*?Al=?$oMmE;!ffZofau@D!~eHS<+>MN z;4{Mz_{^{)O7K_IUkKuycE2X!f&pBKPWmthUzL=$I`+?B+>tl;PuQ*P@)PfJ#>;Bx zY%$YQaWpL7G~j!}L1Y#%6g5S0a^#Ent-e|qgZMps7f~UOf?a|= zMQPpjZi7+c$kk)z5pbHLPg`TB(Ihz42_@jT-dUzvjf~T9U%=TFIT}e9e~OPkJ7S=1 zew;rKQ2fv#f7n9S*rwpwB-hAVOR;W~P+#I%ea1O0c5?I=0wbARDpFY8RrqnuQKq_( z)**JrDD6zrsrga}`b$h?%1gWt6-Nu=L;QJ6T;RDMs5?FFeF<9$If}qT4;`oo!29 zmR2CW#E}!qw{^%_dRbXsnyUhX*Lh5Sky#9Sce8z;OUv;FmC7SgYv_6JH$JT_=zG+g zf6f3N6qz)gO+PY4Y+G24R3{jGsr&j~xF;AT zcmp@I!*JaI-}dZ3ygkwv{m)3;`+8A@3$+esNo@Fn>h|>7Khz2Yo>-WOBb51G(PV+a zQW1*QSOQnd=lxk5ji*6_d|y}<`251Hmk^lFc5uSQTn|=r5Y+9KhUWi7oBp+jm--;L zX~Z$}5ccIx)#3Q4Jw4yK7V%Mfdvw9mFJhiT7i-zqg^ShxGu8(TCZ9?NtGoAZ6*Q;| z$iU`H0pJat;4q=`V+SH$V`kA_4z$nt=WLP19_A|9EfN0>>9GHwTfxgAgT5~ zB9)oMl0a%^iHR;IdC8YoH=8yp`~5z>l%bA(4n*qUi$V2A8$P|jkrz)o0sb}FlQBd!r(<>L@|@^*{F2zS=MU<(B#NdpDCJJ; zZa`*BWbw4fm8=;wjS=&(=(P^_G9?mIW0NHXsC1HkF6=v|qae z2`T@?Un>2KR8{dRaXL``zN9fX zRZDGMH`)Wr)JePB*r(KyU14w1X{7UxtRHb7S&GKRg8Yv?jy3BmToL3zq(j=qKF$1M zZ?2-eNc8>x-cqndKliV(4F1qz2}69;?laY_-piV|dfl zf57w;NMhd4S|FuC7j;o6&4X6W7N4OIymp{_$9j)~=n^5Toc%^)3n2;j7~%^*wpT%9hrQvZD9c<1x3(alEo~;5sRQ- z@rHfz%Wk_(#aNOO6H|n7?aI{rklMq< zRTLF3FenLF8oasmvLotp0qM=huml!AcL{lGM;C6F+tP<5#T@0Br z?P*7slNFdP`85<&FGe$`k;p|2+uP#96KmD7h>d#pU2Oxx#$BGV3~joFB$(&2713Zz zF$1m{9WJknpAR&8p^?OxuZ@V<3od^LFQJ4evI#I%)z=jwjku3Hia6~bg0G`-P`pX1 z((6|Y|0%8w!2e+z>Pz`l>z3hT+5(?rT0dR?;>qd=_Y8x}`Fn68lH&stsRQ2z5hI}e z;|bO}9Pj#nWfA&6$ojMFuZkAS@02e*kMDXa53`>#P1k=y;r1jyIPrV;$Lo{jtDnio z|JWISzG;g1n}Zaziu0rQ}#o)i2zk8pQF9~(v} zlgi^3X3*l21!{;wWbf>Q{e=*-)zfHW7w-aioCtm_O%oLrmZaH&6OKYp2oum}BWTCK zd|KyiEl%2zK?F8oF5YwLu)<{$4h$iU=em-~@mVANqJ%Op+mGV~cVG{4iacg-LvIQc zry@%*)vBAQp(6GQU8Fzy@a1w!4*G87^?xX-O-x_C?S|4NCnfv8!&Ut}1HY;T`ap4{ z(Vtmc{3c8U`*B(R`{(R@hYR>&<7KLqOrWZ9A1~62WH;*P`S;GhmT2!`;JmdDjn*}9 z$UV*}eQZnDR4Jw5hTvf9(CtI%+%J~|W(vv^W3GrR88^o}Op!jn8<>AHA~|x!)Pmij znlAzv4o(?0^%HoRb*L4cHD8BA+X{z8u?W83m1@7{-N$@KyeU8-A|qL}52zaFNm3`) zOa5^d$@4YwbK=)xDu{S1-)YkJ8H3pxp@S~$m83!YPuJMzmh;%Q4LahelijAt#a>8i`)o>RjkNn8TG)x8Lira&d~j&IbrJ@mlMq% z7^O((A_T0XppVA2WuG<0edU0qU56SbxusUHa>J(G>2U%h>eskO*lTQ~dY*wG zRfY=G#g<}a3WsuBPBxBTpG8xuuYxxt1(U&F)V3ki<;?P(aQxW_GVI|f;3fK^&JEe> ztNO8NfD5Oc`p8=@dM7=@r}ucJo4XREIfV31`lpUX{1WaYwluQ4Ko-s`ON(uksI0={ z&Wg_;&ePCcHZAP18@>NNJ$U{zkSq5Uqj+{MOAw)et|E&LKRl@VVI7EG?n^TCTd*WR zlc-!?7u(l6_3vI!pTImK>}jNm-T~ox7>IqZySHsFa3Yyy=72bQM)xr0)!yJT@zdaB)AiTH^CbBV1Wi2XxuHh zdlKBead+3?jk||#+&#l<_kMS3YN}?YzF+fmcbz(C_ul)QN7q`m6^fV=CHg=1FA2!& z2wUN|{J%;}=Fmgm2;?5qZ^vn`!BXk!`-zh;Zb?_hSw~)Qb~m=x3F(6c^zz5DX5KiJ zqmF67rSK-m498@?!4X}5LKOgqb6KU*!b!u+3{cPXrH8u)XAGN4F-6cR z-)!GbUccWwK!v|iQT7{H%M(>p)v{^gpw)1S_)k2(zQZ~0d*r3_VyLd0-EVbCiQ(n( zf53wPr~mClMEKBhRBb~BLLuJOUu5ITIKt#VC)N6YoXnI+(2+-p)iUAY<0q?F_++*U zJ`$kqW_1V1DZ~)OzP@}}QsSD*f6MwTjo?^ax~`v5Q`Yiok4kS!NhP{OIn$%~EcB$i z^=Dcmw&v)K-6?HfYVZ#Vz6#h!_AObV!e4;60I$|cr zh9QBn;hbj1!D9Mm3WH2svucg1UDd$YqxSdIqS73lGHBl&Y%TvJ$|3+Ktjryee=v|mPhA8F9v1$Z`(c^*<^2L* zU(Gkd_6l@RivrI#P^OX2r`O=I9& zV^+t9N@4%gvVgbK(L`sxh_%;8WhCCO8sdc24Msj}eUbN0I{)a0*0Zsr_B9S_{kg=o zT9%wo1JMn;9N$FVb61n|;nEu%_)<|ZH=$)n+6%tcIJEYGAOE*Ht7gT2+P(gjqPQD= zEUfKaaJXbYTLGCXH)d_`%NalGtvghs`o8cb^F{Z?hx>-!1x`5KE)OWPSO;?9O2qZz zN?HbRz3#%?zc}lrwdAD4-kOw*p=hMX#v$bq5T}wLc&culTOhyVdK!V9IA+= z_!3R1@jcV=@=*RstT z+GyzXt)ki}kg42f`rN$hmwx&#UYwRmDEdL#7a?#y-uW_@W2s-OBpm zDe10(TZ5iobCq*njK&Z=#`MbO?RnP?J7NR3KeXZd(`HO}M;-}-;y;g@DslbIRTbRx zFA^F%#3?^|-#LCZ$9PY-K~nz*?nDGLQDPQ8K4D%!?le7)5bbVcp?>AEq(@koY98-I z!#k0>cLwd@m9i^RM&DII)A8hA%QC{%ItibiN&c@cTIdFsOM4abUaB23kIy_)mCOm( zHCal6mCYqsI^V%E5jo7Q^@j+j)~ucd!Rz{>7>-2g&3a>@;rO6>e&{s$Yx~*`(rQNw_O|%XwD~c%w3U#_f4qGqF)$D6;MBt~Ix!hd3a>&G^ z!FUp$JoGw>SBP@H0rNLs0xj#J?#SWsQu>lw0&Lsml1EzNd^C!kcFh{5+G#9Zzb(I* z#NKMgU;w$ABnd3t&1~-iX|a4v{S^@9Z`rMphMcyA*6vjl&g(H_HR*DDtn0FDF4k$D zCnM*{Cfb~rUQ9Jaqm_>LRWDFc%l&85wcH#@rqhm8bt{hF{)8%t+LO}mY}9?cG@g^t zzX1Ep5%Gp}wX==&r>1%awu@Hx*z-?0O)b=FCzR$PDe8rULD_vw81nKc%#@VhHJWE< zn_52Ag{Q#yh_`Zt!{rw}jv#c!#}njvM;C_it9_od=f(+5Sc74BZ=I;8(g?0n{7usb zHQGim4Ouh4h37Y>=9xp~=~iOn#mO%t->$Hxt#4QfIwW9dvs@Jniu$DZz-vH;Bw82~ ziJi(#BgO(l!yY(>`Al~u9Ffn32ver`XU+KQSDwiRiq_5j%+9f=R-YvcDTw3IRXbIX zZlh(nu)mtNpyw~XyH80`)Qo8_F zWz1P2%B$ak_5+a-$mJiWEpJ?pb+aP3mjDZvSw*54wFswq~_g%zO1g7ET% zJA{NRg~9xPzh$keY5>}QGD-M7Sp9)&R0v2=kLIyQEB&0=31b6eAY03uudB-obh0Y1 z848QAnb=#Gl{*ekkffsQeDrGCZ;Z#ARFsF|rsyj7u{z@2>G5Z`kTg>?_POS3^+MCM-6EIIo9`4>->uZEh0_-Q@l#lzLQ7ohEi8j>yKo5 zk%9IIHmEFmN$4Q^CZDBy)0sHt86<;9dH&hWl&LzwP_N67^JLgDl7$(T@`*V*^LiAy z;{mGaG%A`jIy1NmzqOb=r>v?W-Yen>FdLwMXQBRSOnk>md7AIj3r%j_n=_(e>R3o5 zyGM)c(Z6pD5ap&D#3*)-A7)PSjVORtzZ0i+shS+ZW-909!ODEn(~?^`VAo!;2(okh zlF$Ci7{UJ5Z*GzmHX*w47l}<9g$oOns;Rnld;c2;WctvfP!{bpz?UWK>+^rF>2arI zGjWf+XKv4)77CaK$Mn@si3)qT&=$FSM)h+GCWn!HqjUalzT=O1iUUgUT!Y)@*zcu9>MQx z)m;dNF+sVa`#hK8k%o?A#mUE{(t?XgWEXl)H57;I#@TE|c=TcuFHlzlAM4a|9Gk2P zwE8_4^YuP{WuHs+P1&3P0w_`NcI2|{Aucl+vLQ(7_q?G}x67LRRo zcUn80>fSPNFgaSIusKY{<~{ltAm%r)NNGwYo(e?*?f7q4N+;g&Lv(HI4TDhE#vHcg zaT0ywI;>oMWooFC2-ceBZlFp}Z(*+vEolPc7WM|B9#p3=nR2F-8?z%#S4BOX$|FD2 zDDlZKb4cAa)hVyBL5=EIrXWX^&ca$jO~UgF;oEY56v~K$fk0@7lz(^+jMg=h-jXSr z7{e3VmXsp;^o4A+hEb9WoY1|bBk8WMl9}`RNaC{WwAy%dt~1-*dkKYk=U#bno8k7# zBzZ~hI+Y$(p#70xIp(<=*EBO3`G#ovTZN;f8QC-IR?2r>1R2(+Zv#%a#?{H6q)2do z5WYh1BpoQM@D=(4GIrFZVp`Si(Or6jVZ9+U?$UrTPYtTpS82$#+2hKy?J|VK&5_Y~ z+eoir<6&7wxQQPzKQM=br2h4$OXV=&nPPvmcUkLWa}VM%XAG@;`J}w^zK)2{RV-2Z z_VKul?V;B5|YpCUt*~>{Kj?Mw$^`YWB&oan);U+0xoA4crlr<)r7sBB(AW|L=|$?Hq2;| zQ*MQaKQmiL{YCoMOub=JPuHtSPhX#+@Wk7$^L>Ac=SnFbd+!_V;{2H;xL@WndtN32b*#{(xr=gT}tV*B!%Tu1jj--xz8kYzW>^E=l>l``CprY>y??J zP8o>P99koe`XH{`sG4c~4>(4R^gkB#`M?r?*djp#KL8tks>uK?Bak?^AE!oCRb?Ib zrHuZ!9LxV&$^Sm$&7kp@%~m~5-!`YbcM}PPREekeTew{))cAJWBjnL(%<&BVHCg=s zxJ@tIlA6~psT((3L+&}U8?{X!_};_PM;o?oHSd?$C#TMihiG(;Q7>gZa@6T`?0bmKZ&VS-;ohDF@1dtOs%{=F zx^6DE;7>05_O1NX2O}Kvc#{k+&)gr0M8!DgdHukSUkfr^R)qq@9LS(B6;>lZ6FtC3QU#f&*ezwxN%QgIl0)CCd_mCr(T zly;~185q8%q!zer&hjCWQmB8C_zl%@1>3ddgf;ViYa}@p8^O3Sg6S$T2A}l2I?nAy zKxf5D9cEk|9On7_=H2afV)@!eC0+}ME<{GAj2AjenxI&SGt49K0Q;Baru(@)Ra!0K z<5q&#YJZWAx|*r@%Gqk53#2!pHEXSnxHi?y44@79o*mT{rbIde0Hk&STq;b zFoL+B>Uj)YBRFXPaEdsZEG=DXncLBd08(UzV!u`1Os?6mcq8y(wJ<4{ZfR#QlTNka zCHLq^%qSS0At`qM9SC3#{EU%UYlck69Wg?>RN*WsWcFrSwiq^AE7k|D`EHm?lbOXv zWpyNuc=Yu>L6ixo7Qk#$`Zw%d6x+d|d{vMa^^z-G8FuE@kO6M@G9{p=FGK5e~Oz|N2h+$7-;fw}J-S=^tbf z88p`WHLDX|9N$4-K{w}AQPlg6X+!a5^6V_E5cax}&w5O@fN0@8GP@YIl;h^bfhHqa z%EG*hn?gSvV&F0FOG#a;pi_(Z_8W=9Mx5-%2^cmKWI&$VvavG>ACdJAF0*&e#PfNQ zm5uU}B?LFHl?t7d1(^i}Uo@nD!NbFUk;HOhkrhyzRhhm_rwi8!xi|3Up}EV^-q11rMPfK5 z=)%9^00Tfe{C)Qm9^ZVpiRQ4ftAaKE~RN}EA3IotKR!|fB993-?E^Y+sl z>-kn3Q`EbrjZetLN(}t3Yr!0hQTPtbM!ol(3(GEZuE9=ABF{>=Ic-WEI;dBl?Zznx ztxe56QCu@2h1^UozFdj%`1}dA0Wuck^Gj9k-TVbzWbUvra`MA=qmN?iFFzii?U=0i z_VwQkYrDg1 z6PS`_1c6H!K=nl1K5b|0AyXS{$Gi8C3%3$JIOF`a-={^n-2Sb_r&l3tydY6k^Vvni z$+Ft*3Q(QV+bT%l)yK9F72*I1IQ9(IcbE(GjlHL22r6VR=+4~$D#s^>m^szA>&f?`)X3o)NgA>nysd z85mNm#&W+1KGiYfjIC|X8403$M*;Xe9N`B>B2xFV;O*wCA2nh2q1;09K?np9Z2V9bbz5(vG zw*MI;v=29IvXHGK8jC-~Q`A+^uj3cdvItPeW+5`0`IbTixVi(3E9OH@iTA z+DHUjItL&XC5QV(FH5)3{g7P$L9|UmC`0UZ_q_p=ysO3ph+Odl+577uLey*Cpycc& zs1KnVOHt#Fy|ak)tn0vAWf=bq0E_itI}EEjuzLM-kE*UhPvW9lgO#jFSwttfk zH%0DmOp{yB)hnY`_*}bNG^zpG>k}NuXZnwfLCrtu(~lQPb+I{*$=hWq@9&vW#>s>n zcq;<5WNK?FawA#43K8(kBl{Wt3jeShl(eZ744(tK&9_%cfuP3_8{+%5= zKuO}j9xHNBSkK8CF{v_^JRCW~Y`gm-_29)@O|RY=KNhJvR|;pof~i*h4HCQ?n{=Au z!)1}iwXGcXeG<9q^~RBdq_wK|oUfcZ4M_RP*W zmY)vvs%vxH_6q7nbc$Yju^O~KnyYTwSU-&I*7=WSSsLB2356(xgDyFPznU34Mp(`mf>s7wx7G{D?|a1woN7Ee zRQCTO;qbF%#7|-mO84(W+W4*FSnwu@?p+1Q)Ao(LT6*EAu)A$Nt9gcpz5f zSD5}{8m;&V$6E#2o}?3kh6YnDN9+M_Qen~7>7rRTirpl2d2I^0KWF2pT&`BC>Nf-)cO-&-5JV@esqVLn{d@AftzPnjDB|Q_ zbBnt3qrS_cXvAC>`2HQvZ7^#wO&+{bT02vyu>jl5GR&%igzGEK5F3Iy=;#IyRrYns z*Vie9%S9%I(5VP+L2n-_%bnrS{}~2^N$Earu>D2Cf^0qKh#F!ZhcK%5n|$vFt_)Ti zu6a7n6(9BUDdo4E5sHZUG}euQXF8bo&U*DVokeR9XgllX?~sE0@rih7Nh&nj zA9f&@5wM%t%u=ll4=l#laW+rP?=42gd1s)crb?b#O7-WS$n%Z`7 zQ>*IwgT{cKTUzBG1LC6z#7QN{`887x*et85fZ(TCRCm<|-xZwv9>h{Z6 zQTXMZUpIo3=q6*B+$V;yKtO*^EsrD1?TsA=({!4a*_6K5%%&443 zz!%SZeoZrx9lbaw0Yy(z$j|T&p|-d8YLse77inM6$LQ+w*kwNCe|*{gGl;;0 z+z074=*mrrNNz-RuMrs7Uu|A?PoySqU_0W}>L$I}p(lFB(cnk?f(58{8O|6rURV>` z+{Ud(oF-og3owmUEth!JMT5Lxe8g^PD{_-qH8`PFfwidhN!Uf-Y`M;R>JfYQ!9~Xz z8;=MtZcH~+X0o;ZgPg#ajJpm;7Wh5#>Y;P3P&$shTYAb5d95#R*iqtiYK(%)IhtO6`6U@4Sz}l@Odm5D|FJe)p!JME z{eDZ-iT~$v(ehVOf@v;_z0&SVcsaJ*D2_Ash8EIIzD50wdjtGYfLw@+ugp}Py{T$2 z+=6FQhh?#*!(DrT(`EU7zGN$CU4~Miv2oZnHpSUs=Ns=2szBGx zQ~;5-GCl2JQy5m*o4<~NkZ(7}eD=W+wvT@h2?NBEU1NR)vyttZ=Bux8r>vyD5bM|& zUgFn_1}T*uDqG8SU}^K~qj@j3t`(ZsP=4Ha%A0y{-druqwEUunoolVs@GbU7%DYp1 z{6#ku25Gs)oVa6@y%E~_XJRnwt*&R({;0a6W$h`?Qfm8cUn(XRC>k45A#pO|H@#tx z*o(Nvc7C&Ku-Y5ZDnoVUp5q9D;IMclfxiUL0!b3mT*tWUSxEcItI-Gg=M2F1v# zJVSNWyjenFBQ6=N_jujQfYtVY7sLMR9KS$Bq4s4^L81`@)EN5++cHzlrOi(>x`qaQ zeAk&S%s|sG5${0kLHTuwESQ~du_zxY$4$3lhe%ttId(JE@@GI4IkN(lmGN^gz8bxa zwmN&QI!e-g#E9?_24Qo+Z81T%go``?j_@zc=ec7|t2DnTtJUF~d0dOQ=qkg>IgSqp z1z1tXiE_Ka{=Nj(GPybh(|_`&WV!PluXaPNB^5W%J@ zes0U5;Md%0zHoHV8<(-w0|0gPs$f83oX@TJLUHTi5{2_0d9~~06_`V@ZF7LucF{aISmfaN?2*DbpGpcYSe%o@A~SFpSxba?g3GwnsRh8@n0HRS2wQPl*r zYdERPsCRe9_FD5u`s|XdUO|B>c;ffo6q@Sc+uQGk)!bJB!dMUElPWV-OOLSw&j@#F zWSkal`Hs=t?XqRPb$-Ijj4T*Fd+Y0(?zwndTh^{VD#0REi!YWXPQ->O!<6_`?)8r| zg{H+i%Aa3-Bs2CLD!6SCAb-$krp_;z?(f_m3dP}3vPJO5POHBVF#`_KDMLEGizv={ z#7Nq&WYFq1`W0z?*mC_jI|sdHG@<3rzG(lXhV2krS#ZrF2y~$ihAz=7Lo6$Obo8I8 z*rh9`r75S}Y@-KIJ8M&k4Eko>FI86Ty2S*Ic)z8!K)y>-bLr|$L8TL(Lzt9Wi4d`1NM|{VLOgY-NQ?#3Kh~BAp`&|ocSr~kO_9CfSoxa#1Anoz68+V= z;X|o7j)(}vqbv8l3(GQp-2#>Wz&G9!=+&>&NM;w{Ea0bbJb;{a=V0*%_U}MkiK1$B z@`=|Kybno><;8i)7NXT8`l!hg)rjNM-J`Y{qMq)RW4Tr5m6B(TX}sQnI-(=*EhTtM z;vo1n%g^fdZ=T9N?#3a6IhgM}C;g97PWDF>f;$lc;xmeE<_XnIRBAbk6O-I`-SxiK^}N@&7)0wyXQMa+LHcWavFp1 zGEgNglNVQvS1CLHR1mryG`UYOkUuBQQ;;(EQu&s7HFl%FrtT)N1`#%Es}awMNxR=* z?kNdaf=I2yf6WtW+DEr^F6^|3vSLMbt8DczKFo$)+IM{VqwCcVgpX5LJylm7j{7eI z<2Fb_^*JpRj$m`6s!ola-w&$>goNihKwz)#J$6Bh)$YXC2cJY)b1@&#xT@tJHLskh zKENyC3awGr5^$CQruy>Lk(?xP zWj8YCJqy1ZV+?f)9{#$g@N&J9?aEIr0QpRE^z0qT(YZGGDy?pKTCTm(MSNLt`$&Az zLqdFrKC8wX_{T0At3S!j&P`HY2b-O8fN&82^mxl6Ay}b3dX^|;>YxWU)zCivK8n7?J(mB_u_x;nLYiqd@D70V(Aj9(`MR*mx@Jv53IoLA=L)UxzK=h4Hy`14@*Vp@#Dj{zs)#+YdE*mEooW%6b zc!)k_T$*Q@22FQzyIrsdX$$;_P}{i=A;IhZy~xRXSpRESnPPk){)KCzdZ%+81Lg|= zQofZuP_D%1_hBRlIL<|kt-u3@rdDhQOy*O}uRvO_)xaC2Cbm79>t1MP+$*`{$-o3* zlS#I6a1)QP=VLVqzUN7@bFc|U2U!7O0NltxB!_&0X_*YJZl#H(yWuTou&MK#=#Sj_ zv`j4(*=z{15x8HD~FbIBc21r?2ba`q~sn@gS=Puab5MY>m+Z0 zU(O~j;1>oaI%YSd#qP^!=uL%V@EhOogYj~^E1wk7%spdwIsy8q!s)qaVlGcVeQS#V zFNKp1a#qIuL6NXD!H&_isqb-d@0ytFhLq0E)Tfqq@~5JL(3)NRHQcz|Y(pAM?>S=O z9^7Ri#RSTH^pZ&09?o5`~z2@_4N3i&W$Y*CN6Sgd$EuO_P)A-zu+bL)-yD4ve zpLCnHaF`!a$zIBg=!BXvRm?CQAYy6PGaFsQI8M9aomxUUqc1%@d%p=DUzz?mx0djR0KYN@ zGN3E}qBkF8L2>`>8=1&k;gvYAwdS$0++3ks8mEbss>b>r7rz%v2A!g11l`g59XKMN zf}l5H-qRU0hbb66#co~j;Mq`C_D$(?7R@O%qt38=5N^tq>j`-aksDBDnKWN_5>`m7YWT5+TmUeEH z+O4W21Rt7G=pR@2R1D)j%1mhPJ})8Ds9t$-l8wjS4KcS7=zfh3(CN}fX^PGX>AbeZ z1}8Y#(FDLj9tFuXsFR8tRoN{+$zAaU8#Ebiytk*LGjd5UnsB4iEw zIwR_hN5mY^XNqIl9$V&8bU^gQ4jL6vMv{|iTZMJ#)1lWKr%_pe0Z)|-g3)B-`?Z|l z;6syks*#)fW_yVUpdOy_s(-HXpRjccTkkL5OtjVtj>v%4TeZ2`!;V6(DDy(o7j3o)Et|*mGy_q>@6b+pC8lonY#Rp_E;|A#!(y;3IAyQ5l-cgGNI|}#eIqy zYDiqCnLazo?()QFU3ylRH2l7SfR?~9j-`RF8={zm`hjl1{Chyw3wnz&aSP9lcWZ8` zf00lv;U^%ERQkXKEb#p6u9CNL&Z+bz(fIa2Yf9j>M~--46nghhVq!BnAYYB@ipYun&Ees*(I{5<7Bu!dGHZBSsE8_K&}Zl??D zE1i?)VO+F|8N^1spFt%5pEvrSW#9i4Nd9jJ;WRx;cqhl-XTvm=DEAAXcoqQl1#R!S z74J=?)doXgn&!(-NJW0HUZHAHehF23IafMo#e0kc6B;BGAQXEU@KYn=-(4R6myaO| z9?!0=`>qbB0)gtzIE9LO`Q1gXi4MhnPl93~0A?8&zG!FKwVl^{>uw7daMqL! zCfzF3EC#yHPIy{WQ~B%hgO|%J$OJ||wM=T$RSln7?0o%sufKicjxI+9sIwK?s(fOY z&E33bxeAUyhEw%oMhvIV1B|EU!DF|xg1$Bu^Vb&$(VbmgL z>X`2(wR10jHVQIsgB^_DXeTd+o+|AQhv!@ZIt4U8#!3Uwm2%$En~ctQF#o8f%JXAS zxDGT}f_TCTY!{xnKIp5H<7z~^DQxLgjwbJhHgMpT z^Dw0W$x|**0*jFBp~aDMXj$XQ);x<|wK>rf$aFC{$^~7quKk1Z**4p+Sjj$lEj`vE3dP z4NAGMT0EG==DSa<&o!FvJ>Tc%2%LYLu>+WF*h=TyB=<-FZ(CQEYVN}NKZtt5>V)iS zW^E^9maA<*>~wv^IOZoBUbiRv`UcOdnP`jOLBheKfH zqV_v7c{zxs(#tfI9my=wd#%8!ODG2qan;h3rY(vAev;&b(4l9rZ*0&s;_0Ibm)1Mw zZr1gRB&P4o0$Mn{6JkL>jUMp~-Le(Bo@)&>J7gR0LqC?&NmCcvMkRwqYLic=)Xf?JaeqAxcash`yQpQmp&_L=-n0I&+O+AWF?{SO z3AWldpm#glIPgqMwYqp!{VoVBxlxqX5bdjSetzx0THCz1xwzrps3KPKERsIV+wHbt zKKiDtIzZw@(XZz=`_0QSSD>juZEdl?7i+5QFh#dsPgJmzPbDZnJ%5jG;PvM=bR6;p z%7gg&(>pKK^_nD37&W(m#JBnep%=}o20+1R>A-H}$QWry!o3W(+1m+YS{otN+@ac{>M)d=w94O_9I@y*`Jp4bFOoUq0iA}@847{ZChF;nI~#6!f=sK<((JvO$)9lQ1~QZxsh^Jwk0v)P z2YX3c(ct|W^BUT*nqI(c+)NpC28BV1mxOG*>s(8+EZX9Ll-a)8!%N9B|E)kO?{>a{ z#Qd1}9$Uj>I#ZE`Teg`VM@7}zU!)V8{*`A!&`)!sx)o0Uu7~J0_2VRp2k7H$VU6Kf zr!tmX8MF)A4K;Ct0Xfm8(!D73WkTy>aQs(ZSqTvSE ze0zeEQ0!=|FV{DX+K(F^?8oc*A&vh+KO5y^HVmOPpr&Bi=&A#WTsAo|O zs@|!P8?w6_cN_(#StF4 z4HG?wCs(nb(0f8r zo|WE_%in;bzbP0O2C2qnO$^r?czL+F)C@`DAO8pl;vMD48GoB+K}x#R7?17o@)fqd zJsWXuQ9ZgIuCYB6z19!PSUINYVf3qfw@5c1x+sFqTr&$14KF26SHlm_I$)SJG>{;K z&Ljr8S~l?D>=)oP#+g2MRcBl(y6{y+gkIs#xK^BKal@w(>QdD!%@7;MvKij|0ntH9 z9JNlvxe6LX()Ux^;puLNL&`iq5=+6&Qi;_>3mk;GD@G-rF+!u9>e2jFP>?-jh-imU zG4*X)ctL=pnWpA6@%)1VWt_pOK?|}QQ;Jyla!jIf4?#?JAe`clZuN5>T^I0)Yz%|T zXZXie9x9BZXt!mHx~bZ&%q&0}CRra+tIf1TxhJ?A%$cb`t7CTR-F2t|CJ|-g*mM5m z3}#0UEFg|*Hxq4mduz%&JK6udQeoY}V%9_G(GmV*vK@8{fZB0NC))xJzO~wJ_d1lb ze3ZN*>R!Tl9Fvb}kzUfuss%1-Q7dy%Zmt;K$80AZV#GRhA;bvyde4iBDx|%ex zE+$b)F2b&9S%CIl^VXc<_PtTWP~`XJ(woZRkaGuagr?|G^hdVT7@LySshO+HM5`sb z@YfUeH-<4O=8Aal*7DXO*hP|@B*X0%qI=^%iJkU)%!u1qEJ{(uT(@_i%0}o1d4_Gt zhK{e%RJCk$$wQie?|4UM!0gIm<5P0VHPJs&zNeYg*<`w`{2H~07iJ+t8jcvfmED!# z$UZ_NZ0-pM_a_y90s@o>KOPhoU6d;{=l(pbh;C@;G@AOURQfasEv0{ugP_NZ~PI&3EUCbtb{4xqaXn zwA@ug;rcLxtZ$~({GSeKt5egR#3#&~!m>t-$1!oiCwVK(sE8$Bwp+28gKB+?)R8L& zo0XB328XINvn?KJqNgXuMYnsD3NkqAkg-7H^f1m3S{PWVd#4z4pwcdoXC6+J5@!l@Lh*Y9MD zP_(?+&WaH$kUX1bI+Gji?@r&2iwFv4s50Kt3%^wJryeWT%R;GK>H{cPtGg*{dMS~uqu3&*;3&Lc3c6~`*Fa|!}gL=5(?i)5PLmBS)eR1 zAIw0X=U46V@;w+TrX|?SZII65d@}o3vcd>hY*?;nu9#0gXF!MiNH@k^QDcE{@MHlJ zV@cBI(NHu*-rbrsnnU$qj&9jG#`aHC@oY*`qmPKRh_n#Oc?wW+Hq(k6s)FGr@bx=Z zL;zcW@-LnUCZX`4&4y#Am_@u_rB9*vz+p@cr z3-X>A?+MM5US_8Sy#I?-(70gHx_so~Ig?|Uk!kB)A4rj`7hgX+MX8W4uvB>j{2ZGf zppqpAR1b_ZW1iAYo-#C-kXIR`4Q;dh?+}Os$8BJ`8vI1Z3w^TrJjGzuQs0+&2$(*M zUVl&$dEyP`Z(hYIe$*@~iY!`b*Q#B_#myd8da2cLSvAMl23~d3ieJeIRv!N zGc?1(!9dSbbr*hl2XFZ8v@P&{Is(j=cb{;|IM~|Bvc|wF**=-%=y56PG5ZZJFUGsF z8JasiC-&{#sN)WdEN$rLu%mKH)h+AK?hz0lkrA;#T$b~+3YIN}9#3Td zhr00wvBI{z!~QwXH%(*wSmE$-dZBP^vP+_SHq)@*{4T_-K6@A!OF2^Io?qT%OMK0z zyUohz(D<6jWn6i6x1&>kqgng`>`2P~83ZeCC0@1n`$YFAGuUHJNKW#hYPY3m)}ceA z$aJwbyf&f|zj#01OyF+1jj}5?{`5`JdD>nO6s zV5J$c)x)1u_PKkHNu z%U>6`?Q&L48V(>$Q2To;oyAP$XKlslhnX-`)^3s+3OQ;+XDWUbp{u1P%7uI7d9jrs=&l4d8X&?fC9pQdX^CeJ}PW_KQb|d`j@9EcZ7C2mis->%hDcymhf`C zkBmFWo0gd)<_XZNe+Ia%vlkNbWeOGdjSVkPOrEImyNbWP&m$^&*3esBkdzHd$W;hW zXQ7@7Ap{acwR^VgZRi-3Fx}FZaa7)GqBo!sPiyYw)%wsO^h;52^nmO^Vf3NOMQHt2ntPmj&fE#^lzXc#QgN^c6f}C@26{l48#^ zCAt8egZHoLhU=)*KdJ+}DW`{yO5+8wC5r_#%4(A%o0ca_Ypv{vn-rVLqK%l@i@w($ zoewCr!ON2brjDZ}0&Kj*hum&f-kznr`+Q8|>E&L{xM&6~*e;7*OqwAR1&R@w1v56b z1^a8&)lOhUE1102cDKzi36`UFzbto}sBsM?sgimQ8h$n4ICDGFWt zs@mufs=r9iPCU)Zgg4L~iS62{gr>d~9plD2n>39B5c>7NG>e$&Y=gpV{uF>V(R4-% z$x*?)6~zki94+{csZn}9>=0-bLofeRBHHpDZhFz{R&4d>o`J>j%Tg)`Fy5Ld{5D=} z#-wQxtUfKzZT4*?CVTu>i>_q5S)(bnk)H0RH5=t$q?Ar#3)oI0A8`_YYtge*o!yKU zMv0c5%LEw^O4{q_VWnTFz65!^c;=n@i!=il_IONEul@-d<;_gV@okhgSbre8J7;Ih zIJf}_YDuG^zw0yGj`g-qew1{^KBYud82Yp+mlTk=d3vM$fnNQ<&@}18K{wB0`w(^d|z8}SGcwjvQ;d2&}yoF@93A7R%>{?SP@)>}?%AXtqv zvY$(Uk|!1>S+=vkLVv$;qCzb-Cll>ayH8uvw9d-==C=NCx;!=%n9E7DMwLVEupv+3 zz^L+~M9$(t`K1XbqCte{XP+9VPm8(ec7n_?avGLaL!Y}y_PG!M+M9AwJ-)BtQIf?f^)o|dp+X5HDHlX2F+g-J zhkVRWZ9P8tUWicvEtI;G)PdW*=36xC1kWpU(KASGVeTk!(fMlmHQKm+=Q+{n&u(~> zjcEf08AkU`0cQDoDd)~j8QlCLQ#ANlx%F0|4O5JnJ>LuUSWfIE=(Pev|0L0MCeT0< zAqU*DA-g8Vmhl#f3AWC~(Tb-|XHqD&UVh!&)h{E+!|g_*pXz6=P~$pK_e64|)mBo< zWwL^O*=?@(9KurT3e{tT=x63mxKg+4lzj=R3GN+l#SyVs^Ve9g?BRGuP$|O;uTnGe zH&)v0_UjnVf{t|o@=B{MiFtcPNbWS^fVrjpp%P46d?K_lqgDu+M>zDvCAo!_ZDF(Nljj!&=Nmyo?uG2)!LSgWaAuZUHF+JkQ z8QWU|rPtPy5?~zL$C`mxrx^ptD3^{w4hBDRzqX!*Cl`ROspHo7q>_r> zkUqi&W2=WK!4>J_yYeB*TT>7`qkn`-ih9>**pVyF&YVg-)6Bwzcbr zosR<@W2(GWh7JGGON+RzI5p{ccJd_p3n&$10^7mnDm%`g*xe8$7u#)ZzSFar|#a!B-m%d3tv%BMK^UY8R(<1%X(28>2Z*)Hi zXxH-PnriPylh2!56~(ocug+{pFDaH=qq*|&xEfw3Zpo{@>toSBi=RgcoFtas8VDP) zpkVkz&9<+EqkR$FIH|TRH~VVrCWzzcXqM1O1;p&mZu}!wtIf)$EI=)hC{Eu?>85-g zjRNJ>vl>=Nk-j)gHO|i73e)N5bWapLeX`lWCj~AQa^`ORkx)HjdOyMxT3E!)f~(|< ze0>feSrA_19|G!KVkJPDg72u^&-@~$hun<3Ng~RtjT#|IzI`S6@DTN6YDhUS-G;_l znoL-pRA6YpCWW@?|6uGbAEMma_iqpo7^F*5QecLmq)Vh3dVnE@5a}4YYt!8@pp<~r z(A|x+bf*H+rF4k<$Nt`X@B4n7c~#>}q=Vp{CnF*)tsMnW!bCB!(_$s&bM9}1#EZ+!8uZ*OC=Yz+G9y{T z&t>Ug{fsGoH{sHR0Y(N?e$z$+YO)yhY#63n>@9MO=NEDmB&*NK{vB%mlRCwAzN&;( zsD1{U+Qrf#xxSWi4ZGW#7lO$~oW;-|-^Cm9Xr(Rg#lEDGDXb?_csMruxVB?MXskfG zwztuj#fkO8(9F-;!kWg^9QHW`t}=tD5pLpr6K1NIA!4Hj+}tE+@D@oM0u`) zerwtKD|EvY`PW65w4{LTLf`2}PY@Xk_N_0WRZ)pk_8dsTF6Ynm4!>=6K3_&>%)(XLBQrctSjT!!Ldm~3 z>xz)lBwBo0g00WxesX%GN!?Ok3Gr3*u^mLGU3E0*Yge&pNwv#=@Ake?^2}Jyz|1Qw za9dAWljteo=XvEyxV0v`3%KHLN)I+5A*aeE+{s|&xb956T=|N2g&Lb>^Y!4L(H0DI zoAFC2yVx1(X%ZQC)YB9j(2UQ~JG`DhNrX3aKij%C-u3|fOF^#e{l`bAcb#XqztPKo z*446Y)TZg}iSUFs0*&`48#!f1O?}HRR)fv)+!%b(Y1I)A=j?ZBPOJ~1$^$Z@y zR-5V<0m}BgJ0m;7Pqdd6v|wZ-?O)utMr_FnTp~wOLsATJzXZ#KrPlmP?0`4)eWdD_ zZ{;yI_Z@Sf`CVg>KlNC43mxfZ;^en4hCHi}JQ>+(jUQpLtS}!-U~nm?370aCZq7rV zQC$64@T1LWm`-Sw2P9FBpnR?t!1%)Zg9j-(ky%p*`Am7XJ%UGTQ;_)gC#))ER8WBH zPpVVt-N79voo0&wc;B#cW$WFLy8oJwjzcO%qI4Wl&~SH4SaR5<{Hcr{9dl*8G)5Da z-@QN&uLug)Fjv%6_+ie}-uww=0bVsvX@%$EamVXyo9@j4z5^bGxsSk9>f-%j@HR~T zM90qcYm2f>y0i%fO?xXLqxNV?3iQYA6W{=d7v~k&$z#TYQx`x_P}_vWmChe)oZ?9UqT!gSBz%XP7zU ze93qC6z!TE?2w|>BGNBt_)D6vU$nMxhMfyHMQ_6fD8+2Ai1YL9)P5aII@%~Ht7Bnd zgsdDL!Z#3v1oFRr*Opfi^t_m~(EhZuSaP-KN<>s%K-BqBQ_{V#HO2sUU&bSs}$E{vq`sdR@mhc?yOMJ~-5M@XD6=l3oo(!aXAw8q1! z6<_cAR?(EYW|$mfRrkfHWe$t8I!iE_N8-}sDBpPpeSf-0#i_np*zd8?p`+xd%HXth z`ztj=Ft@XEJ<~TucUal4?u3QBxDj{2IX?S$Ypro%iJv8d^$T@%C%QPteXP8AYpPEFHbNDvCcmpPyzoho zWXsiHktE&uavT1?1_DNMs{d(vP_*9c%nEi0^xCPcw5J=G9?OnCN8~pMf1=RD9Zd7M zmV7Ko21z{?t+{dST(*azYMv*QXXkw3r6Z*%hGV`hW)r^A<*njEtEdpmv^7I`h)0oF zDsm`VRF~&8pOqOU+4Xr}>ZEId)k`_;YE`6C3oQzRvSM@A)Ih=4$^nkS-&;8jU4u(h zllwfIB-;Y=6&kB!TWE{lrN%z6e0+Tm%A=2}aEu;=N0{A%MUS-pjL7j~|K-v)Jg^bXT3j`E};1Ef@r(go_a zkJfAR^g;PFNYm1GH80Up;_yTi4KwT$z%T0HANEH1x42Y zz$Vom|4&(+g+M(+|K8^$`0NqbJq^GD)sbNOW0XZ&v7Cso%}1gh)d_N}N~}OkBBwWJk9D_C zzjw*m2mif_VMG&2L+yr!3<{eS$iXN@KZr@+fs@Z|<0-y(&r||Bz@30>LNi?RlM=U|J44qr#gL@#Z1T^};Nx35ix%^d~$0p+fPE^)#K4 zYo=Ydx1DB>3sjH;GUtoP8*d%aa7iiZ83>D6hW>=o{%=}gxM+T_Mdx&F(W=_)?nwa; ze`A6E>afQ*6f8fkMa>yOc>#PJu+9cBpJd|{q8 z`%Z?{&kgeJO77MH`KjN)2fzjT0|iEVAHms;i& zSCf^xk7EOVBMp<$6)vDj0Y-(bkEBCeW@~4Ktb;S3WS>}%!}~J+iB(0ak;>}M?C?)G zVz>i|TbVE+`VZK`gV}P4bCSObsjndoibb!|4jj zfZf>VLvC`K^3zQ|P}NHkciGu6;xSVV_?_#+aT8YpPWMU|4H2bv%HW8GhHx1I(w5%j zlr>?F)1QxDubIwwd$Y0rwKWLSrH%35n5O@adrJ)V&14*jNd!Xv^K412NuW0R;j|e` zz+JJ%z%Z3vvvIw?q3@>jyZ%xz|Q)(8s!fXPXElp-Wa75!+Q&X z=mV5ar%|rq2pw;21jB3Q)B??3d7fATG4kLEsTY*XIr#RW(?B@fQK{ zh)h@ZAI(uq(piF#gUNH&VFa#rQF+>hX!|aPZ#UbEpFQ_>PxFH6f;Z9$4<7(^%3`#e z&+UWXR1O4Hbtfd@DIf@HBi7={-atFL{kl;E{kC+eRdW08YYiq1Moi5mNi+nF=xAVn z!Ghhc4-7ufu1j~<^$f-#lCOy<);Q;iZ~SvBdl0sJ(>%+;&>4Uh1cMm}N!guw;je{h z@m*B8Oi1rnKue+4(yM~inH-1PUF?;v(yoI_Iw$W#QtCfc;oLSBVeMO7kW|1TJX6Vl zmI^qmuALN%hVA+$-!Xb$Cf@D^0U0yt$xCTTqd(E|KmWWjE5ctpw7*~5e;*ZoRPl4! zVh}JXKO36*ZMUj8-Js!%wKE#&kG#XxD`8p^3BVNSWBt>~q2bo+4YR9U!{;w)PQ(vY zl5^h8)T0=3nupOosw7IN`=An*5q+<_`t_yaW(#1=svKe%46HIDx;if!^In#gKMpSu z%U;G;i_ccR`g1h`3^mwACMsR;OVhiY2t0w@-mX#{l7hRzO9=e8NY2ztjkA7>S&7`I z10vfxW`U)8;W}iHxBPYA!*&78LrL?fAGCTb?Jv~6Znm$SPB>Kv;kM?%sZ2vCGbaa4 zg%JVzRFAh1o=NKqJiXKnANb*E&W%Xuv2O7-=R1Yc*ay?T_#Wt2_Oko>4{k=O&-4zG z68C;OhmhiI)Wup)D!YP*a(O{XT#xlOIZNykq-C@fN|05nG=gl^owPax~>8&tl ze>cRG?F$;)H+ziR7d;-Y{*B_5(aHZNP(D7CUxy57R+`)A6{$8ok%0e_$f6n)efgzJF-w6r9Kl zsTQ?jh~x-pejzDB^t${H0#F>g=zA1NqG+>E!L#d&v3Cx|qZabIX&cSDy2r<>ISIV| zNK_NFn5R|^yZ8$B$BX`9oq-=eY_uhuq=Fd3WFQ}Q&ONd&4BiYnmS2!lLIfA6^kZr) z;P3b>RSdo37_)Lkr+tqxtsK<1^!miDbm^lB-n#B>=&)wi5r}>fAjv;4R<39XtB2y8 z?k3vqEj2c|X6h=?C>DRK>gO#rimmbdGLS7c*#t@b*7KnC6QjuiX_$nrjh{oAB0G>B z_q~)XE$wIMjs~((uq9aR`Yv+cSV-*}O+hj`r8p6f5%KjuIg87GeMQeBwxkEC$2L8q zpv;D`b?$S^!LBGyiid2=Q{GNJmh1-_z$%Z#ky#5uGJgOD?@!PN)$R<%D-_>vtDQBxv7T>)_1JQ^^R>EMsH50| zd8?L0mD|HvP(Q?UZ981RDl60%4^xb^Mu0{x^lJpka|c&~)X73lvFL2NVQcmfJ$nu1G7cD|n z;m)>e2p3PR7(HTBxnf3WONYm|U@4WNLFFR0XELeJ9f5-56Y8%_|fKZl0Ld}jbs&=_Z*iV@Y zu<_jQTPg&iHixl#!4Ui6u&mo&dV+4+5)oVPVeATPCS;snhJL_Z%*WQeqPF?s==}`P zh+v8Uosb>+XpSlFvVep+dXv?2fQ|dvw4Z~5OF2E!wMK9Z$GKgUb6RR=Aw0DHjeivo;NJ&Ty&ID$lfI5&avUcLhbQzf%KZ9(pba>v z)WE|5+TV{R`N3wU-x)1D-JlJt3)Gh2ot&5Fe}xY>kTZqXTT~=5Mn?8}kD~z+96AnU zgGPRS4zlALb04*qYo&>T!(AFa&i@`MXrqVb4pM#(15Iy&=FbIYBeYXa*@SVKs%8TB zhMh+$6}+r$Hq6G^P1e=Eub|l^=Pm~x2KsK6`h@~)V7#9NM=EC%?W^`Ky$ zvQQeEenV2CyoM~=oF&xA-qr1`zBzhTmy8?RIYSy z^+uH?52&a~*Y8^tzM_uz>iut>&NXjm*N;scc;IiShU>$9n3$UIQPIN~S}BK06kn(_ z6~wI^(XaE2%f4CIm`~l9V)HK>Z=-&!|GGz6`Q=h`ofAeI1pn@Iw(sA&jFQ3o7GHf8`e@7>O`gNu+NLrf@EHwj=_bo+E9k}-%qEAba^ONG z(*giJL(2*-a;n8A)f=1>P_!F}t`pNsd%ZI0Zn^H(xn@=P)kIrkJpG!Q&C5um5*9wcO#~LyeI3C>{4Hlt^3ByXK+pX835j^6L))B`z|YZFTW!8YO)ZJ(_TJm0z~$aVOlBF6G?L-$B|R zswaQ{HpM+oz0KI|L_3q7pk>`<1{88ozHI4sfJFA3l?DD_u34g=!0+7fTcy{gBs$wd z7D@$c_!7oJ&}plj697d|(;k&TZ$2O(1PdfYI$1;tNDcl3^L5Q_AXc(YDg5CJ7tkDj zR=kx}A7;V4HS2L~L|9w5ak-?%aC0OU+_^pGV2^X2It*~m>j3mDD;{LUKiJ{Uq!V)F zzZN|~IqYN?Bb}y2J!F-0KFo<_5<5`pr(I2@bZ{v+fMVEwWhvVeM(TLD1?N#53Jp3e zT}=ED(OZcebCsjr8Qi$rr7K(WVE*q#1pec}s7E^BkZFwC$j(_@O&%G@GyR-2TM{`f zk9K}~UnW?>UytpB;-4~X-u#`Ojjj3Gp}ALl07lZ;qc^Db)yNFP5}1|-`wBdtgq6Ir zhuavKov+a}<>W~=>w?$Z#j>FdPz+T?ySz;y~vC3qNj3Rvz` zGF!yxynex&3>_Hq43kEw3e&t(Z4rsst*z4}jQq;f+~6F$@{-pA z%prrNw^tP@5RmgS4V_&Z$DDzrBF%TMXK5PD&2tkUij;Q-jFW#{1sbCX|B^t~J>giJ z!;SxS8xuOqbhu$&3>r}LnG^LFYlj*jv~Y#YHxONar4wHbDF3ZVn%TDcf()YjKd-a@ zbg^5=tRodz9Y6~3M86%d*`?KbRx$VOoFp|Z7)|oc(DF}Ga zhk4HehZBGA43)RxfU=V1_CGFBBF>-CAk4%d%I}%Jh`*b)w~@e$^3hTlY_2?e-T*wN z6B7D1fa|@Rp&X4hltjqG&fg7?33T9)DPWH=5f>btCT+M}-Y&OT%j}}D-%k^9w)B1V zOhwiz8(s&HKPO`Z5U}Q_3zF8cpefdHS9d$uFV;F7+sCHMa91y9IY>`CC1xEn0?#xt zFq+Tufz(WBN@&kgCIL)W*-sI*_A!V7P>n^uyGm!@5IbCrWkU(7uJHzw$U3@+GgDho z&#(6t>mSc$j)pOLND46P>r**E>qzo4)BrR-nkJ0cOTAgORp}KMUsmE>awsJ&OdA>+ zT441pHBj}@T~(;bjAs{u@~2B=+x0)Sz2^VN zPwo51NFyD$?9Y-6HvK9F?*vLuGT}C@`IN@F9eX;QqPzbR&9epYu{j+Q&WqRXtSj!36S)SWH3&{1i#JDAVx?O3lLO&63_ z&Z^D%tTVS)X%{G{t(r|e`=LtC1v1DzUiJjJ{*tGFw|qE^j+3<)niP9G+tQ;gCZes@ zb2YC^hY9{dshRV=xcR;dkfjkB1wN@woTuy2UkiNIlADz@=}}f1u6>QxMM;`A4R`NB z=8RC4UK8n9Dhunp+2@ianwQSBM+=G1PyU1FDY>Sdaub1WLr_CQIsc)ZcR$g6&OsZC z1zp$7NJC!`gbR(9tM5n51=H7ivH)_I=)cP;PS6&`(L+Mt@7xvzVdoYiwAY3M5tnmX zc%}dqhb`sQyZJ5Pt&7h-_!2yb24tHUy$69@z=*dDny?2jh1i1LugUy^^0x_)pL6w9 zFT$s@zJgC*@m8nPZWAvEr1Cd0dJQ^IRPoGT(D;0DFLxykMn8pSrA-1zl1%jl5RdbW z;W{q)C#ku)gsuw$+i?whNzKB$VLwg77(LRG+shFc*dv8BP0_j$=p!{IZkbVES-BI* ze7<>98PBX44`SBuZIG*uaVM91FgJKfP*!f zTydCAgsuPy+G0g_vUu45UcfefaOwQwUsmi!SO)*CQuxFXhwzTU*yTZ$%6AzNR7CGw zGOnSU&{0R0Dv7z4nOSelI~e8XA$nP>)9isT%fJa#QS6;r?G%PF4$I>81Mm5+$VFi( z-*dL(`%heuY;f&nr2hD8-Pdo0OWB%;a9%b)%)dL8 z2tlxTfzhI3?8xKAxtX=iW&2EcXGU8obk*Z}6 zowDb8TO(mYpDa5#`}xrH?(|>C`dlBb>d4N4eV55{$V1`pUVv-*)DS^#_==yR3IOTmo zYW6-G7q5d7jcYUE7(oG=i<1&y;6{%I=d$jO;A_I*_m+(_eETHQZG6)w39J)!ttE^2 z{flJ`4wUoj|N1o*G@$<8BU&(_ZQ5`33`+yWb*#g;v=ksZ@n8EbUL2I)<=Hp9Y;q49 z8?)jv+Svf^3cg$OzH~51El;+?8EPm@qeeG2kfs%K25Xw=k6AL>CF(gFPfASEnb%#wO|7(zu})Qmv^0dMfMh zBd23u3&^}LM#rTaG|mPRevytt9zn5VbmrL!MeOX!E2N4a6@Ld8Rm{clu*f07Po57{ zM?;1wto}NSZUc71&mBf47lM|2m)*38(xNJcHK8+$w}A7ot+h5l{w_LNQ#u*alTLil zwp#in1x){)eU~rNsu@m0;2NwonwVo|)k*kHvJWmusyrY@zE`myTAeH1SSaE0Q8Xs# z8}|!_C+V{ah6xNKv76GrBgK3Z;vgclt6}ggdX64nMq~@W@{aHja3po|(NgK&ZZS-} z{oNeGOscxk@%zz(&pwJP@*is19}>pAUJa;XXXU70e0JJji4jqs{Z&vD1FOnB6ko?3 zIcn>R*Zs%(6+ny}z0z7)rI8J_k+o{E)76){gr|5qtw+TOwoI}nJ~5S{_Xm@c^!M<_ zTriURJmNV9?oJp>^kJ_Ze~+!#> z(%97UXh+j(lbfDW1k}nl;+^qE6NwlqP6TT~V`IHpRj|lutITHnolF%6)-y$jbTG-Z zV)a0F<0@B1+BLzNBq<_a97Xa_X!Dzw92t=Xk(luIg|CGckdRacnro8P8T^Rf`IcEy z;UQ!u#3+8~-bp63svQcHQg-m&S7dk2FD5cjQr~$T8jx|a#Lz9)H|%N-r4uaB0Ru?i z?82Q*>w*svX25Q2U(|`zsjSxXEZ)cuTuV?^TaG5dObRLw5%3v{sq)fbgYiJw54EyiqpuVw7t!pD{YO7Ktjd1jNb>d?gOMP1q54w#4*NXS|- zhL<6X&oJHqq-8@l>#WBzkCWwWm&uZ8&cdCZrCO&^+ngALfG{dyu+ZjQMyN7=IB^!y zq-0=0?pJXWwvs#4$~YICjihZ7`F>>bD?PQ;<8~MRYp0?wesL<2s&KLc5ane7xw#e7RO~^?pCpY-ms#s|NqijIz zTES-y_vNf{8{t1Wj?M_+@4~*}dN4JGw2z>~?-BTK|8V}kM0`dk$#gXBm4^r}cd(M) z@XNX!Yw%iyksB@aata3rONzW$qE1_#AuhE1T+9w(aXa~Ls3Fgl8sJ&g)l^-nR%X-@ z$OG+VVbG!+PtPQ#Sol0-j%q*NBe0zx*f%41x-YNV9Ts;vHooPOxa0(W7M4iE+(39p5SP|Q3+X5bw_@$?UD2Vd~ zX;97_e%`=HL8gdy*){?SSDRzGjV`khHb!s5J5FDdl9yunDBAML+V~g^Tyrb-+PJYa z{oh=^MPLiKMPe0g(2Ui0OY5VPIg6fG|rP7`>rXl-O)y` zwQ_RHBuYQ^)-72);G<=VTWKsyo9Eb0`)^Gq&CE0nw45ETU=~O;Vmtciy-cJ$zA!#x z90+l-uAw$vc-wq@C0ra04C;NwDVh~ceRS$JbRF9FD@{=!0zyFPbwkz+X>5K)ccx0c&VV zHiN59SD`M`QK88=pBfw6|dJTV|k^gTITO zOjR+K>~{|VNgkLd^)M_mZDGE?dhxkF_SQm&;UsOX!y0n)oUz=&5l>@ye-ip;(L!#p zT07zCwDg*N88%w{96YoB3AtqiUO$$SU$|~+eEqYrR5an`(wf#{_m05SK#b9z^ONWW zye2G4m;e1?|LH_EsBbg8Z>A-zQGA0Ir%y)WFOh7dB~n!Oj(>Z?F51ATqY27WjK*>| zkL?>dH!dmmHM)(t2K5k#Qhc)pf-GNwE>cMpyek@TBXkcFi?8g zyjM`U10}tx)51Rew3~!?7}Va{ zBz9j)ln{tiR;=2bkNTxD2&pGWp%WSLGpY9SBQ)zi=;%ZW^Hw8J*WQ=8YrqBFzP#=+5mc~@}*={bGVIGE` z3a=cP){BnDq9z*{O)s&@V9?qP7TwpBe(<=GON$kmA6M((urj;(xwQ=0NJS(SbdI61 zkP;rBD*Bc8Qlv(;$_WSJq9bcC)kEXHd0atiU8k3CY}}^cGRdH{xR{DE$xyaV+_ICk zxL>&~1&0iSSfZ<}&fP4$;;v>^<^cZGGO+2e@WW5m7W9)x_arv9L0kLmi?nveKz)y@B*7r4ZJj?8~olW?ZiZK-*X zb2E?^-Cdz$d+l%T1@`Q>o)M?9(Hr1pa#`)Z(;*(2bgHAvG~q4E?~fo@Zy_Zc;;?ta z^j?_g10NXM#TX90avjzMy=3>4kn_*qe7^U2L&R%F)k zhlZ=6I*1c~$%ch!7j82yG}dA=4+rSSW|3F)ilWcVw`nMoG7YzFz?d?Wr111BpypJ{ z&Pd=ZOqA`TrON#T(#$T@kUQU=;rnAFMC1{d_(RqU<;3{;6AHF<5wC6-aQ7i#!`9a$ zi({^I%%Vk~xO9U*?1?lBD+d<3F@*lZeF<6_knf4Gb}d#1?`$J<9%nzu*i(P?h~2eP zc(l|$k%&O)IVxCKAM7oTqPfk3CyJSSpj>-@h>4e(7boI+%N7(|?oa32;3K~&k3gVl z(^+(%w_5FbwLLR*Jl=~Yi!D5*N_;{d}zpLgyq`>wqgDI%#QX8{AaU6k93ez z-QmX+YRgRQV-u~}wB5_HRJfw@3UcJWOzyq4JwYEGNOVu2J4W|6z2q0AU$?k>%dck+ zD;>2whF}P#Gw4v2GsTp^GdRUC0?F+t9?K?)L{^Xt%!_roM^?v^^{I|bPM>^Pwlrc^ zc+U!q$oWf;x#EgRdO(fy-g^!>gjCH?T3K zxDy(0+6p645ge{0v-i6CoC>&pD98Y5{Cje(mrL7tmHa)cRdEu6OMkR;^|={{v|!-w z$@^+#ia_n8pbJN^73n#g>QEGR9#md&5c0Dd9ah4!uI;NKI3o4EP;&n;WJX}itF}&A zyF6%tESUsNYv!=a!8M=QLgI6kGNSd zvd|U^?448NO&?Oh;b$HJ9S%B`|EBOR9|!97N`I=CatSUz;UlGB=9^di67@vPyqR~= z9?Vv$zB5r$eosRs`A$hlq3KCPBUgu#)>QJ^v2&X(>zhlnHS+U}5Gx&It1^ zr#Ncr%Mz;tkn4D4rdb~pkds=gxXs8`!j?O6sXM(FL-2kgL~qQh0nPOse^!`~ zpf0l}LFMh1&`HC|66370;rp8DUUUsKHVkYDNr^)Y`BkCBHsZeK+d99}I5|{y1TLXC zHiK{|2dk014~c}ovsRiGPcB7dZaj&(=hhvEKt_LI<$R+6nd&rN1jUDt!EqDvLizR@&?Nkz{YphPKE_LsU1c*eKUzvR3=r zAX@dFnrHV1s%IHkX5Ge6+C=hp1pEB~f~Hw|%cJClv#?fl_c`-O?vH8bk*H1`YGZh4 zXk$*t5Lqs%w{2DJ3SAtkzQ12ijAhinAnsck`?HkPYmD;{?3%;)fmY3KnnL^El}@*4 zefuWs62q4mSaT%7f{o0(a&%0K;E!hPz@bM z@45@!I1@(iT)z61D>1ua2#fL+Tv1suO|bQz7#np8O2)R&St@A=_TVE8^ev|+=EUDH zm!Kh!3w{L?GRBqv<4b2NuG(ai@~05qiHAO)lsLVbV=M zZhOGZDwq-+4EA65azcbLx@?@11T|ysx(1ih3l2cDc zIhVilEgM-Mk0g_*i61ziH|wveZp#WlG9Zb~E9lm@-WjRyg2zC?)l}-u%gJ&D$@SSqnrM>@)pS9OfI-7+M?oM7X1@VBPnUsZ}WlpT`AKF9mXcN znv79Cb-d9b#36k)PQ8dC$TZrV?+;T>U>USX zFM67xnY;|$<+UYbEo3aFiqFv!@79)6IfqgFiFTSX^j>f;J@R!%5Z^Y@xJAVG3dCsS z_rP^SIJhynn7GRo7hN?^70jY1anAg)$>t&*mF_8t}&LtHmTGCC`;htk(e?vB{;A^OoC z>FQ@}Ivm*GlVKLs5o^4ruDSvXbc64R9j z>G+&;E|0--4r_H%Kfu|qY-RofpZ znK$kaUv2UbwGw$buueT=@4J4Hv32AsvS%duasL5H@_XA3gDmN57-~AQvMwAFrJ;A^ ztDy)2ypuTa&OM#HsA#v*4K!3BYaC)`M5H{JEWrlZOM!f{X) zw2#O1?ynB!hGzw)#B4TX*y<#l$whFll~!}fmkV~N*B~Ks8cj?VJq`UN6d~0m#6PNN zn!})tMcZz~SFJ<5$sL7OoeCAcJ5?6$8^)GvOp4JFpN8-`s#8;%8hxm*1{p1vzbWdZ z?U=-r)wk;^K{XDerH2N7DEr&Vs;*e~*;QrzkQfP(G&F2>v1S513RSTZ0$Wf;?;SM zs>M;eOqc^m#Q9z+HbnHMZfK$iI2&UM-#0YjTqsLU*wmfHnuFFgFj%a<+|H-F4IHBf z2kPrHJk842%^}(IMRY7_rcot^Ce!ZFeykFRyOU{)7pn}s7e?srRNL7%b0rg;6=fQP zZ|#QsiDqGC*BEVt^B(6(lILQH7tbb)FpbCcN;fmCtf#i@*yHBsNzJ90BGxjwd4p&2z~5uWVL_^Zf$njugyAuW0gkjh^J_yz~tmizOcoqwWzYvmDT zYj2eV#rG{K=(58Z`OSSty0J^1mz=IP@;@~Vc*V5vhrK+cFVeNs2hEo_<41-T)zj2L z>D7u>=#z`1K)QHCn0A*R2Ojg|pn&C>`6I4pt~~L_QNoxe3%+|Wfs@_kqxsHm`4$ak zxwN}_Um{*o_Gt@!=$~l99s+znyacQ5OjFe4PY5?ISAD{sWuW2*v?s}{i9bdxY5C$h zT*k)0zK^}XQ*l$|U?IwBAlgNLqmAbU3-M~+Ru#szcVj6oc})tXDc9?rtH(h8VKl%} z@@Aea+*n#_X>zv-3dF?!uzRWhe1T_fxn)J)N8(eN$s9iH z!KW>;zAO}drVeo{%Q%8{gkc>VePEq{b_3xLoV-Nv>p`bxBBAdgA&1NLuaurvZe?`T z8O{3}O1=U%>%TT~nh1aOqER30AT8+iHW-&mGJ>g5b>>}C#fmnCM@{arlcw?nz)Qro zUJ?O_oGnT$WN6#~j!U*~w@F?7luqkjq~ko<)_;bc|la$U$R$4{K&ih)a~ z7jG+Dzt{5yXhmyCo|^98|B2>Qf=i7T;iv30Op5lY;D%koo)oNSvL*u>isRLk`S7&hM4-k2$40gp}%-t5yG z7{q%&fKO~U>gye~w!-{chu9NC(aZOT;BlS$p~SP_VF@Lh%ixXqg_8G?a031ajXgL> z-{PW~VXFuz<$0GF3ip9A56FE~BC>FQL2%L(aB0&M`jgN%>_=5EC`haq-+0Q6PUy@Po0Y;YrpJj?1S?Lp01Th`@G%OhmI>q;Uqdx#+mVE z^WVs#ghV(8n+jb>DfsodIEqGt9&KhN;zj3PE!FI22wSJ?R zz-3?j=DMY57Hi{tbz%dnM39CwIx}kd)uJY47_rHvz(dSE@e65<(O-kKNp#JKM^Ye^ z8sN^whGp2#3fVr!b*vR74d$HL&}O&Q!)$O=6wd;R_IR7*_?CSmfmSglN_3|zv@o5T z;B-lY|3s@%*pSsS_?u1im>|U@w41h%A_oXq7b~L_apo3~gKlBObt`n;6Q)6Wo)nJ| zIr_oYTADReGaOCa52qCn#Un|9L)dhk!~4nBN>YT0$?|cBrf1M3*>|fK^m9=``R@=` z>4t-Zc&#zEAi0C9q!Cm5S|mw2pjzxsH)UXf2vRUkyA}ptGS%1|BrN-CZVx=2{eE$e zWrb~tZd3vKBaIC9Ah5)>p*b3f8OoC7KB4tn6NODWGOv)YzoQzt=YQ|o6N;ce@L{13 zoTW2&(Cy#mmmZn09xbbR??P7!nO|XoJ2WmaDr!u~ToSJ7))ZigJXb0_9EDYER19o6 zz+*htlW&xV7;;(eSJa&p-j^|?`%mwq`FY=X3UJaFvO@I5+om9?FU+pPUrW??~HwgP&iSK|SHsGD=(l z048fSmt>)9WO`=FCF?mci0Srd>{?FNFff(S%!!NGaSP7=0_?e#>Ih&VP@*_cYy z!?1<2{yA>RiID9;lbH6Q9M9#3JY(!Zwv7n%i4u!uZaO%QCev0K@M_s*r#m^Fsp#D! ze1am&syMyE`1&|khn`Z9%r%DBe7{3JOn6vEYng;b0~>qj^6t>g@Ee+mP?_bD+T0WF zvF273LB|v`O7pBriKV;>)V~C7O)VV!K~x@;<$j~(lJLP#@{U$hcr{lvBasF9Qg2&F z-;p&Uc?+}fb6L%iLLMptF_N148@BORyV_v(f7U*{w|sStxapZMxjrU;f#ofKgKrK# znnTRjQgfA5ai9Z77rTehSb~)p%;x*?EaHA-e{LF!UOx0prP)HzoTz$0r-ybW#u%cv zzQ+D~b==cCzc^*&0)?z;DzX*lu&*>s^4Ad(xTWR$2yIhuHX?o%rbRKouX}6&4?vs< z*REjTbP;E9Q_YfjS(hZguV_*gO1b&~r%s|KVVjfFA1TXc_)Xn$?vBX(*)f@0<3EGQ^sRluOS zPA13-8(H(R% zZmVPbc1g4=o3UARKgA;TDeSo^vZF`U($;~}NFOifaoCe>9bEQ}bo~T{=N;Bo=#;<4{btjxB;VB)*kZF zyUOfC(oB~j%wO#|w=U7Q^!pax$Ga%S7K+MeoD7}W{S3tQzg*{QBzndhx0W0tZ`o07 z1Q%nQ7h6-D%AZr~+D{JKs%*!~WBTJOQ!QtkAVMPMc$ck@-g^;%#b4wi65zz#Fwgz? z&7z^8Q2AQ_ngmH^3el$hwk*7j<}p?dH_o(c^MVCQ>lGR&?RsB}OeY;(Z~14?KHQP% z{6Mrj7SFqhfKHuA$R(Sf0!6s0+A5&ZNBH{(yO+s%phJ-58s#HRa7tn))Qs zwuvTC6p@gAT=972SCa`ugLY#tOSjBILw&$;=Yn&0YXq=_S&AFd&GFE+F*)ZheyQ%0 zoGv39zfN3yabT=fa;_mFgj?w_{S(O6Ox1?(Jv){N;Ds{1f@C(RiFDX{#hd@3IYp(Lnz0}G>1ZyN^ksd0SjwEE(KDao!U!pkA zDMGj53C_{TWbH*|^$$9Frz19>BP-KBuA)N-<=7ZPV8sf-gKLYsL!iaogC}UA zrNu&VcXutW-7oup&)(?Bub3VUk-4R|QQead!Jcj*kB5fY|olyQO z&uhJj@EHec0_&;)&_r<4WAun>j9d_=fm~!OgU<2+$@Y&?Vd?_F&}Xj=c&TK`2>wVH z`3q>*X(rzW-F#}JK-oxN zAg;^LUwX{&TQeSBtgIoVV%lgHV12eF;JHgrqt6|_CeSYO^&#FgR-wUky1m8$WDHAUX^KZ8F9oY2|o{>i~^Bj{LUOnfLOk|eB* z)2R$r&Pb6}7O10wf#!~;_1ypZf0t+c){DN04E|KEz_6Y4@?bM9ou}=qN){oL9W8}I z=5(I$kI~YA`2F+)xv{KbJjv!~wNRhGB~je@>pdqdE;}?N&{PD8U%d4& z7;gscJQ)wGd*P*bKlua8_(O}6{nkvfa4nr`JfAfI@cP%^x1*xW=`#*FKp z>n@;rAKLnbS@mfbi)DOsNAop)n)Cv>EgD4tav@S*S2194W^V@X%9y^>n9i zx5Dlp^9FA`o5RU;xgLldGY0yd?k}|X1}&eG5P{c?$J`tMM~UqN z^$RrV&TeTdSFREjWDS0tT4f2{7TF~a6+GkG%$pGg8j2GxVm=8SEvG<>0yQ23Tiarp zGCc-2Cl?Sj*zXaJXqPPGbgVnO3ng>lXge}mbhI_Rx;m76J1$@uNNtkWi&iOc@8@s0 zLx`M*r=$d()PN7*C)j~{daJIhN>hAAf~4>m1I)6gmep=2bo*9jzPkqNn~Z?oD5FYX zGvvZ$XNKuW!oe+6h>Q>KeNtKO@k3WO_9! zOYFc9+Do5wg7VjbYvDcyaH7^SJL|AbD@%xA5sy~CZivQW7=p~2@+Rs*+Ew~Oka=ZX zp4a7dby8mK;a8U3a=D5QK@0d0s%7`iqynT(QP$0qw`qSSxKog4tf)8npW!)0<-fyo z51A-uW2i==lPJirLvW{{-OZiA7k-Mlc*)q1w$E^)b#n2a` zux^9J0q*MDZu6ZUxwp;q#?U{Lv^O=ulwa#h1~!UCB<(fpR1HPD`Z8?v>}ec}D?NgJ zK-yoK!jQ0HPJNK#QSb2TRQ-@L6!4`ys)Na`nd_1scIFy-UL>YSM3I$pp)cG`=EJ)P zn!+Iw=djA_qG&lkd!qB`sr&u5O>l=DN@%7@d-(?|ho>2Q8OdZ~q=W>K~-!<*Ih(59(^KIy0t2MPlaR*!`Z;wFj z1fuG@;(Lw3Jv}|dx;8bwjU<;TJ8?LWM54FP9(1h;j0TM*)3mKcHPSU}%5Em+rOkb} zv9XLFN)`tD%Tt))Q+>GFG6ooQem)6dzOGmms!c*|Tc>NEsY@HrZ!g|Drk@dbg)`j@E!<9w#-otOhA&znP8nF!dcm-!4n zzxY4bLh!!$} zs%A5OdB3YaO&{`@#RJM&S(Y97{}}^({PI)9oxgE}yURPeQ@PphQ20aigb$H4L|yF8 zfKxVGi}3P~i;_ll*wUo){)VG0`%U5N1rSdOt<6tS-}NLgj=(`GdChtw`NMuJOd& z3pI}SG)C-y&z9}M)Bi4eb!H4xzC9>iXaA!qNc`uzQ{JE=5*eWi-HyMFQ8Y5Q&HnWA z>42>h74nU{oJtZY=`+&ie)S{2n)bvK4pC)U60HW?0?r9YI%g{pVfDUqc%@~`Q&Ia` z6cqZ%QPl|(OcySnz{7QCbTcr2xlkXLNQUe~Ea`3vsa~XQyF^*aS(E60jNy49nmoz0 zsSI^$^a%~BV_yVH12fU7^zbO62O;BLdd|q*Jj zoQ%u+m`sUhYaPX_+jxkuxpB*z!LPty^RLX^bfQ8R=)+S)H;UuJh|*+0v|3p12Ae%wo$6HBztif2Ga;4}gPSxL-bA5X#n=asxN< zl3`%5_pEJ8`B>@x$(@5%$+M4!%r`4QcZbVbwd%^+NH6~v=kh$=zQmzrmT=XJl4XKR zlP%@#PR?#lZfj0(f~>|5gt<5AOmSgJx2w~+R@448j`4{VsH}wLnnQ^pLI>; z-wQ}JQZKe^HZ^g456gM4zG-zkrPOSK9(Fz_gu6yx5!_Gc8+TC*OI&kxDU8hx1KFOm z5@NO2^lrWzyGqNKfQc1VE`!xUfT?*`-73MZUoT$%g;scet#GBe@HKYfHqYay0v zb$%ZRJJ&Us+6qn^lbsv>8`CRRU*p-^g+hI)1~TDVhd0w z$AFlnD`}5Ue>UD_^Y*igd%74+ec8_(5A`Q$lEn$HeMXGEi0LWGb*EiWj8ttv_6A>_ zOMXAQs9=w)Hy{t%=vOU=r%x&D?r}rZd8ngdgIYawQo** z1e{X;8G5t>ou-g^8TllAWW0JdxS|?qDCGBPSZk75$5mEmPI*B`dn9N}QUj(V;}%4q z>L2KfmawZkg;m`^`OD7Rk8UzBg{luQ~V+sdE`HFd<{!N<@%S*%-| zJlZZ{9?n?Er283KFPl1_tJ?IAG>f@;ab*Kxto2d*{ ze&%r|#bNAK>tRm&zjiDO#6MuJYX1VVq-Pj!_(`7o~2nMpknhH`J-%pqpt?#QpAVa#MhP z=M#nkw$yfAWWlQQx^%&M;_Jwd2h+q_JiBJ&iKkboTrx9-7t0ipTE0i2zrT%WptjNwO z)7GKwv7C(ro@pi-@06Fjm)~Zpw$*Eti`J+@_JX%@c&S?X)F8OzQpM>F~rGU`t&1>qbt_%~eJKdY3|i zGpK~y!6>KWe)|Q@dqof}R84^L$wVj)8VkM_PKhu^Y%H0=r?!(^Lqm5Rx=&)ymcB+GSJ7E2q;J=m4Xw&q~gN3LdL0t>#>yC5UF(`fn4cp{N*Xn*&h#+C^5CP zOq$xu@FR3`tYQ@c$|d6~0~nJW*y$vcb|jU$V$8y72%Bj9Rf&o=O$ANHK5@;G-f*IK zjmYf+Ejc*T($>KGoT@;QE>JF1UQM?|P;EYBd}HU1cPPo}8O`|ggT{|#NOQr;iwJCK zGLUOLkj#Xg%T6vD5BQC+h83)wmsmhjP!uwf6dTRl4k;CwC+hf}SYBjKr<4-g zbzWTr?Ur1Dda6||o97;@t5r6a$e-i%g|9@TWQ(0SqU|UU#>m!PP6bjV4=ZKO*HQT5 z&udm{dV$hrJYARLGmN1iF#NzTETWUvHBpdQOz|oZ+5(hvS6KRQ5j66@T8^l{A#Bg7 zy;q8Q)_ch^d)v3F+C-CftlJD;IeB$EMb67c2o=GQ(ww5Zzsoscei6yvbyQ|F3a*+}|_RW8~no^pi9L@MiPHcdQP{FmJw6~RpX zafVXQsTh-No(@U5S1?ZD<163E_m>E|NhiXQHRo?;{bjv^HcZ5g0U`MTgTfZA_db47JhkD5=)4Qq;^yvtO5 z{TO3Ai}W(OTA6`DN=EwRG0$^@EmlZoxPH!zplph>g)NO8OEK$en~60{C^SLmlYkBN zS@pJxRUEs>xv>+{;^h7ZOY4l9<7!HfgqhD)O$OI9VaobvE=Z@yJr$KbRd4+7`(aN2 zm1Se~O^F?*ctt!<5d-3z1-nIpj=k?pSUA5>s)n58s#bJO4j8H{Uoc`^PE!xgL7X?h ziHesJFEyCoiE^rIw%=8#oYpv?RWN1&6w9I4$32PTPOkn}v@01Y$`YL2O0az^|IW(u z+09TQx6puMit_NTHpyvok$)7qjDN^;)64Xb<<$u7SkDxPx9(e9Uk3RMNlUQ?)Lo77 z*hJ}-1T~t$yL$8eb0s4+r6UYL-x^}9rHz|Y4SANGK(TT=t)0~P zjSLi1((uVTCGcl2U-fUcZv;I13D~{~>T}Qi6wbD(Gli8c#90}idf>8dtnX2u!js*f zM-GHk-EwDqY@$tg%AHsHv`jynz7a*)q|;|Q{p2(m+xOyB5)dVn{W~_6XZ|JT%G{UQ z?p$423zH76X(nk{7)u4;hMEFAUscD4y*^r>b_+v@C6VC|TpKX&L3K zH|uL-2PR0T1AuBJV6n082lj{gG2Nj;GS>djwY=lqR$qW8*V((OqgE+lK|hyh6u(en zM(u=1EgXbN%p3nK%b!98X;Q0TQjkb4pc@~)dz!%AbxF+ta2zlYI4I(vEMm-FR9t2< z1c>T2>*Fhy(m2ADVmK#-$UNChx>fND-dJ%UT2&)6)_EI_ivj_?J<2%tWqIIh@jie9((rtb*%pf&>ypiV@jU;wd2_&;JL6WF#U631=3!hMg} zOQ*yhE$Yf011~GlKm)XVC(~8U-A=k)Vldk}fh~O(kKh{nxhn1wY(<@vg-YC`H;K|Y znbHsbInDsdPo>j4?RWO>q{rqo*M&Q7HnblvX6C~7{}3)V5*6K4==jvrqN_yS#hLSy z=7d^G8T1Wnyp4A>)A*R9ftQzgKW(WY0Ft%lq3%C4UFJ1?fHf)EiMzMOwEF4IYh$S; z$6J0i691%m%W-=_CsFx4Nd4?`)1CTlB)XGxLf6@%S&D_zBGo{M(?c*3wv2!zESkS z^mnf7v>w=JQ9q1NBs}bs3S61~8i=&l@s>aN3+-nmZH&Almh-rm^ep$ntG*3Mx=EIN zMv`<8u}LM?TdnGYR*?b-R$j=d$hl<8dPoex#?!ed!&Ui*qC~kedU2b&KPQ;a_5<~W zz2ovO81TJAd{&Q&tO+tL();+yo@j9r<8NWZ( zb!ugID6ps9#8c&XzL#)*2k?6_j+-cA$m%#4jUkol5VVYPMl3kIVDhB-x6iKm$7VuV z;a}K?zv7VuL<_$#*3GSFZSAjmEFnvNsH3)L5+jt^FoWM*>M7LJSBAnm>H4a~5gOK< z?0pkqSy(t3nB{+=;WukkdTbTMl{je1mwu-0Ck8Nm-u(;B-SGU{OG;O3T#fUjVB-(Q zq8szfv~x<>XTjr;wzMq7%T4FjPVdyT#Ux4O{EVsi#~79GU1&pY$-b5p1sba#ki?|% zJS;i0mnIxyDW(rang_MyI~j%Y6%rGMY3JmXXFDD^JKLC6o|=E5$(V6Vg&TCY6k$y| z6zovEjUXGXI{a-td&tXpz72Q0g9E7Xxai)D@0a05+S)P*7QAuN^4p4;^exnqvm1mY zL1RdpvY@Y;nvo<~u=R0@Y40qv{`iExoDWL8UJ$ja2lB-QA7}`BcYcvlBoRF zyJn0f>P&H}^JRU9J_y{eJ|sz*cfEKrn(zJAw$6Tu3erz`EsS?0+tNdpw&9uDcx>8?fcubD+(5Y$tK z3aD~&iQ3-kTs75)ZF6y3WZklIiT|?x$;<9?I8|kinpq&`nsfe7L5leA?((MUx8)zy zNB&Qn7>_^dam=|wbXl|pjyiDS#A+|f?cj2TWa_7W7x}nTXeb-)Penz_6^6{EqEgmo z-Dv{GnEZRR8xE)T_mCG?aS4N?;DBqO-MCE)H?mcTq|m?oP4_ zD|mEG_!|RdyVTx}n3`kXB=)wwlQCXeo7;ee)gX#U*3saP4if=bGvFfBue|?BWF9TW zgqY&!+pPeb_btNA1l3Iaa93+r%Z~MT9dq#0WVx6_1M7`hSqyjB-mq1z975L4mfc}Bt)YmfK_fsmeGZwpw1D^OB`|=qxO=#nr(+p z+bO}{LZaP!J*27p zoB;F=PtHy!HSXYW0sGXmj64}zrknKBTVunKH_e7W4|RXUq)C>lnQR(S$_4#8&Emvy zL3R0-xknP2a0 zJ7ZE6mOK8P&;P$m(--&B*Lq^uU#;TC0OgaQLOR8UkLJ zAxlkgPYIT&(+hl2Fk;ljZ%GI(F|v5eQEa~;k)UHy6S->IrCi^7{J)GQ8RA{Sylo~{ z?aJ^j+;h&T zaq0}@RHzJi6F$-%-EQ@q`KpxFZA6Ui55h&Z(0tcNZXRF>W;k=}gt3A8MkOBDyJq+M z)#MGKSy*F~Ii!X1YW2N#8@J>e{R*`vIti05fDRm)CM3VazVJ-u(LsEbEH)d+niK-3;@p9 zvMaEHX3^%(1o-l*d8~#+WF&xEDp-uNLYO9tr^iW+NSfXx!#m_})|vuh)Wn;~OhyM{3mBWvF+uE1+sGhVci79Zhqy2#pAx(uyv0aDrkTJ#kP zXE9nzY*QoTb(4ns7rJqd8x>je!uFHl@7?68g(%gDl#0Q)w469C`3_Bg?{bvenvnbx zYPHE5ud{#?^;Nko(yPkbf)OnA$o<`5!ICQ9a`U}CqSu+y?UBJ5n9=pg4%zdY$xj5} zgJ1RxKl?%9)bQtWD&z+HcUUlg{v>GIdt-9X4UoZ0OBy-Ta z@%>1f&Msh?*G4)T<|_Oo=$xEPFBnHN<(M_en2=a@g75HS5n?0eH07#>F&G<%1@YcR z-%D$X>X5`KD{;+snbC{+tDmnhj;LX7tTDF2+WF#u`s|aLb`et1v^gve|H>O{V%DsU zL^1M|Mcogjz-h6W*FMK*+qc{gES1-qpAqawlV+^G&}+lvgL+E%N;;8;XF}7?q0D=` zcSbq_3ZcKX$SlL>XM!UX$#IXTIoZpx8#`5=9zOMM{U$k0d?%+(uyDPkxZWK9^Iqig znxhG;U2^w`v|{_^s~df#EIerGR_z?EJxdu4_QF$lk>U1^W=7pxM^;~spN>K*8`GQ8 zUL87utydSMPCZNCGDMEOatC6;D5M_A*a8#{i_?(xaWnm47A_X7Ts$~7<1x1#fzma% znCyuYEjPUs%9s!$(srzml~^C8*YxOhL6h2u+*Ropk)eB{og=YQH-E?TLwyfmy86q* zv3}1$*_soJQxE5zr(j%sJ6N*G3w7!0Ai4(vY9<9H&uZ>p>3+{|<|+y9HW;i+;}w&A zd`=vNnb-MWGj&stjaifh=N8~>hvSN}R!W9@_AGDW1jVqN)a>OGRsNiOtFD4XR3DmJ z{2mtG>|3#D0l@#Y#rPu2|BK}_xtuBoyT=8G3>7zKtI}FM#%0&H>Anb$;E%>oBFJ`l zRsKj1LPV#HxKuEUl$c&+p|frTxL2cElnDWT5(EmejSBl92lU-0t1dkKRv$-3`afan z46UsXTnw91atpcr&=RP?WFslb;OOpawxGk;`YmiY)Q)ncW;HAa@Kcd*FD_kHZ$hoC z4|@Svzwdrj7fxUPWLME>`W8R%XH*OjM>jT>^Nj?TO41%jH*8TQHl7_j=g)qA{$qP8 zUoa&CX|7JH zn*_6dZ?CxFm*5OM62eH{31Yt1?29^fGz`XZl7vYHA#Rv$38JM*gS~rCd&3*$RLoqF&l$wycN! zazc8`SQ1gH`!4*ji*Ssddl5s;cp5C`NJoZK`T#?63L%D%T!D)?fAL{$L#N^}x*W_0hy}U$eN1S%JO{ueudslg{_lIVUKDv?N zQ-*H~+%77yIedgjBk^Ga%6cc^UAXl^EvtGFYabHqq@l;XD7#Qd* zbR01pqtCHE>hjR?{ivau3wIY8nT@J6|2g3(fJ!U;I${){j^znjw%%MJdtEnQ%RKF; zSJ(>lmG8_v5B}25rZ-Ay^iC)ej$C7XlBldL$H*wAt|QC>-Q$QNG7hkW+?1$|YHsom zaK7_;i6A2wW-KlOx-{n{uRvt#Q;Rr4)5$walV5eOe$S+(bC|5g3J+*qrPz{$yOyvW z`BDludKN#T&H+P2_^JWu_*~3KkJ%3Y>z;k=f{&_ALc1I{8cDXcCzn(O|Kgyv*OEYE zcNk9MiX!f=sV*SO@YxS#PknlKE7qsT!#;`5KQHH||3Vv@%rN&2&-ECdn)-2KBI8)? z#?K-)M<@5|h>H#v^L^^0$kAY?tS&HY_d9+QH{8I4;iRnM_M8gk zw@NrQ>adNVYP2go1(pzG4h6UvvpBV=*p?2obrg;1&azLjZ`8U#pA8{ex+YE63r*U!>OR0Q3Q2y7>4Vk3T;Y*6(tl-QuR(xAHiR3RL-an)ZG7L zMKt)=iiqZYh$}^PA??;AwRoB9XhVUAg-|I#ZCZ*DzK`$F&EkglnW~HV28z>8M~Ij{ zv(Kl;HE=nRX|bQ9VBY53*lxkF`*edkI`26Q^atL2^<>RMQV0uxk4UPC$m{1LQcqad zYrfpJdci@8rel-x?^D7Ad}zjpsl+3|+l`}hCBK`U@fT7lAGVZ%Ns}UQ%w?_yOD4U{ zU{#20-4Grskr*Ut7epsM3*NJ1eKS!>ZmQ_=5Fbgh4!Z+zrNP!0fzXWKpRIYV zgzj|X1SZM`9G88FS@Tt{Nki`9wAclZyJefu1hZZJ^XDYa876$cw49pzqSH`7m(XTe zU;3}wjSq-^KRFcwW!BTO{BLB=+`^+%6S3ts_4eNfIhschrW<4Y4Msx?s z+lgwCHh+7Irv8Vw$Tg%FP+i$gRO|?n+a+Cf{Mq5ffxCOZ^jg$JMW44?_-ME@=-ppv z-u{vS!>cDZS89aBB%}0Bhn1&IERV848#ShW+R#&|AGUNw+9^c&TH6fcE!tEzyV3S zoIclop?&s{wqy->mJsdo@ph}9DsD+PFC{JZNkz$P$$Ts&td5oo3M;2mm=-z2PcE&j z8rvAHHb1#=gni<{WRG8Ijexd%H;38t+v`srr{^1R1r8=YuFst0JdXJ_v5V>lSXQX!+4X9odD8?*fr{`L8fIxv>(56`OZJK6Z9xSchg11& z-p4cW+@t2!zC8SCqxJhg4V#wJzf1KD9DTMYVk5@tYuQ>M(U{cPa^e~uqRqwvBI^vquPA=<7h~zi2gUZldEH+7H zxqL~fpPn@ZyM+!ZyNb9(T%ONLgENPSCO!2e#YnFvtsAAd9wYo(ig!>~=Zs#bqTg$1Ienfr zy|00xvBJuw(SovWJ@!pw>w|y)xS7%qz2-Yc8tUyT<6Ep#_vpch4x5v4-Mp67@(dxvx4u79f&+LvErYl`aKMS)-pqz^1 zwM1=`$?(VphLi`NK9JI$tKyx3P`3)0O(fDu>AT-ENs zIiP2TYrPMt_m5R33OoNVwB_eJF%(*q-S;_Kp*7V0yfX4w4sB;p!Krzr*0IS{SiW>K zUn(nF0X&~eg-JT*mhPWE?U9Pu0y~{JnF}~pJ2^9(pJ`wd+I{0#PybQYAXRp5n~f8+ z0HloN?{sIafhyxHeP`Y%pbjr1mTC#(Puz#tz2!(;!!^A)9>N|Y;frs(ubYU5xQ$Z! zX%MlPIvp+?X21@UXJZ)IxPJxzMo%9J3$1Y?TP09>4H*7_z4q$M>U#t12K`?H&72=6 z9(MrkfM}bCSJ1{>zfa;)MzRw9-=F*b|LmRHtpAd^m->xoYkCE%;OVtJOmOge1nDl! zdsG^6*lIq{1aB56&!WFol`_MJU+X^)enpXZ&#kiQ9Wz=6(vfcFq{gY$R;BxR+o|{| zYcj#$ZJI{?9;}&-hmRgivQJ#fopc*>JU!MCbd|iMj|OTGDuOsVjKz8s87Ho*b5qX| zSbB3YkcUi9wY!iB^?G=-)_8%N$I*}(aHrE>`lTa;dt?`@uokYqR0Ba*FD5wM=eAb+2_wAmq9f{iqy*3TFFMhVt~lV_ zvl-@)c78G{zRy5Zxt+ud>kOs0K#0xOm`H0SZJuaT6DtbM5wa+DtBwIx!AVz>M=X{jhPBx6Pf6yzfoUmdd`iG<{DqAAQxMGwHcE5gQmJC z%mbvt@Edy4Ur~g$qK`igSQ;!v225;z8|<$I6{M5#zYefxY}TkhPkP<43hI6r?o-u= z4iQC5$-2iqucQatBBaG3db7j8B_ls7l`hXxYB*{5WSAMX{`Gx&Atub4!1ig#9^hG% z;FP3Z+95%trSAJR--uZ1;ly~@O zIz5Za8v}@uxb^PoVWlfT+4*ymiEZ&jV^Y%btEO6y9UVX}z=862*r>VN41qK&sebeo zmFSaw+O_Vv4Z-R|l6GYB9YlQzq8b6gSp7R_ERFa|1E3u~4%_yagc$SQrSs(#HIr$# zon^XB)8{C`O{( z>E~_gsYrEl);-|X43Axaf zJ`~kr_Xr#P3k`$7IG1=zi(18T>Vq-b7X5a1;+x-#W=e%FFQDy~_rT2|G}qy#N@JtR z7?)@g-NZd;@bh^|DV8HRsYEwlTu-la@QDv(P&Y&Dc5rBroEz}Cr=)4*wo4ezA$qZw zay6xdFaFnJ%imy$(4sY*{oTgYl8F=)!4bZ_%HFcF~y61J?7 zCH{mgrKWM)%jX;r)iQpmr0>(Y;v~njE@E?i#egBIf!+2*+A<} zg<`X1pXY2quQOGb$W0tZ+I7L#e`H5#TsfWC|CUkf{)deE$6mtVFSPpH*xVcGiMMzE z4=ridIpw2I)Ai_TVZObFkl%qdnJVjX{GN-l$^wyZVV>rd3ffj=XFeBmsc{r%&M%$s zPzRCm7~{moP-IamW?oVD&oWMV5?mT0<-UFj1=9b-sFg&xL`j04QFJv>tkW&ztIVyS zB~3g%*WBahh%x*Kav~~?rGMt(22I|p25aS_lx2v+$7()cX<%&^M6hQ-ml-YLq%QOW zVv_aylh^FFB+FHiY@->>45h-NfaSA!^Y#9Nx(_{{YY67$J~%% z!aO+$V)PeUZ3*jv3oEDA8e5vN4_3>s2JYfgI}SxJ5HN6VlcP5maeBXUO(8N z_AbTW9p2`zxDNP0ED!$?izdFO^a=oQkyBk1s38^@ z5G!|T@p2U_QHRRYoh}nHufNqt&PFGx>}Sb#b6R6ogvenx504ryx5P$W#v z$KKmVqcy1dbnH!Cw9X&^sS}^$$;&@)+_k}O2lA>>(uv%9CsF(~Qzz6Z?d2`#qMCcY zQ)S95_~SabCdhwpv`vctVl9Fn)_jUc_?8t;y{hUNt|P3_ri%G& zLzW_U$-ZrTVHy%i7xj?NU`%ueuwfQk7W{@BB6q2IrZmBKXWDP5p-rj@rwZ5Kb{Rp5M*`rnUq`7|Ok*F)2_Sb*re9gpltWU&fINd&_kkj z|GJB0MpBtt^eqFg7|SHz*)=p4-Rlm(zFR#Cc~{TCCxDY@xHM71#D`GAq|MdVdq*(z z{H1VsCP3|vj*&^VQ{2d05bnIohl6|U$@og^9{dU7M^1~)F9C)dNwQS($3AY)%+*JsRHH*5V{U*W3<-aCz4bCExr>Ds$MoVPeYdi7v#CWd-T5u*E-(-R^-k#y<9 ziAD(uA08LDXDvtG)VNjygEtrh$7BPI!#Jhc60_nqm1>8f(HQENqcwxWy|4S-GGH6sS*Rx zGR9!oeCD+qs5f!CF~R8V`2CF`#`U{#Vp-pn14NGp0`ruf3UoHY$!NneP1k;3(X(g1 zl0iUo%TpzR-*&!!iHb85fjN3yetDM%FC)N8i&D{|Q#@Jb48pFsv5N` zDs@}>bw&?#rzr0cq&hO+R#WPbcZZh^RY?_&U^UMHjToLSQ(>kUKbW?}Mx6>Zd1CiT z_!4Ujx>Mgv3MAOGe3D4!AWjnUyWiWjipNu)xJ`%vYa8q<(#H6={=Dh&Gv`peq6J6m z$f9ZJ-B{u*;Q?jqWvUwxiTf|C!+8m-pJaL&&<&|O+~4sy>so;WR0{&>;Q1*wXeRe+ zS@?smkiTXgtr=w1*}hh!#=9)gGp@CXdI^f3CZBLLaya${46;niIL`A}988CVoX`=h$!DO z=SL&K#>TK-7+bjvkp9-!>4;zA``Z`ee#TeD4utTGX-%k8qUPaN%LG>3usjHc~>fA@}JOwrB|C=g6AOYNVKp|91Hbx{9;ZE=EB|;ao$9 zUW$AThGz_5ZeqBJbH>X?H0J#ZnMCAS#nU)QDS>Gg8dzV>AG7%fElYxRbR!1-x*!w2 zmL^(i&55qpdFWe(wng)_1xJSorIBijw7&0#a?!hiZvx*2__5&T5r5YkSAF(v8haUD zb88{Mso_UH?Z#NnDW}Fp+m#x-sZ@TtXGeD7jnV!*Seeqh8r?+WU|Z#xHP4g3(BPa8 zosmK+x z`7pyZ+4i~a2|QjNgVBn0EnxQ3!teEBSHxC%+`{G9?k;|8P$iB-DZk(ezKe>MIphu2 z?O$lQ2gOW_iH*Vg_$2b@G5n$*(LC?k=*0{=S0I4mQl9ge{*W)`Z)kg1O5^82ZA znBR}#!y2$OnAy`4*1_-ydYhI3|6fK)Iqle=*L$AhOBQ{@yDy4sng{JF-e|2d3ON#WF96RRrGGML*`I}I75 zq^3P1ML0ODn(Z8pz~n}5c_V_=d7$0b=iepSET+?`pCLp;4yT)P3B&GJIlEPoa|iD}tJZL{ zIKN}Hh%9XqsBLp-RI&ez`s^Z-u+0wX+u!4expA3LpJSMKE?h;jA&+R`yO2#_8riSv z1+X=8zehu0u27)y%ZQLGI2XM7z54uo@pxY0-nfA0;UDu1xx#-{8;=Y2WRcCsJu?T2 z>j|WEqyt%tx}M-*?P;l*Lkn-LP17Ha1>~lxzdxjr?*kY)gu|X%jx$#f&Jl(Y!m)!; z=M9U`K1`;~#{PwNBW1)Nqy$C0&&joB5x8s{)wv|~Y}L1zc6;@Ulgm14>WYu8NF*SwyJ{R%;wr`KVQPSaAfrQmI**{A=9v9}J2t6Ta;hXBC> z1P>0uJrG=jyE}sh5*UWT-QC@TyITkYgA;6mySrO(4VKIK-us+$>el_L-v6g|?b&Os z?q1zLxtP`Ar3hh>-_PH+4np`A%D2s8#&tl8D;-!Dhu7gZfu2wyP;YCXutpr3kvQx^ zJ-?3>NM_gJhI9Jnwg#(Ik~f_w0fKQT=-Pr7+Y<&`VRf_H+DSa)TeSTuf#RH$@=7?y zY1sd))%+dv;TkDqM~GZcp{*x~;52;ZpjP`NhZAT)+YlIASZf^G#`UVLKtMwod6V$E z=!6kcz_5^`dmgS}jPLJNos{chK2_i9d}`pl_yeP|e$Ry>jRM-b6y|wf9X6At&;b1z zqhDLF@-68#Poza~+nO};Yq^&myw2upY-8w3%0!FE`B?|8H0?)s$2T>SOSYaaX~oP- zB*4>GX2@`7st-bK> zqQH*))WYjECK`sQ~E_>+ZU}S2x2O6NX{4Vl*ufD3WYq1gd zGp8tlknVYnU?+c_8Ogzhvc*UEO*L_*kOs_m?i@C~ zv~S74^t#HEW>{{0!2=lGCB_hoxGGEY%)1fZv!&ts`1tZ%)?*{=#Qiie$5{G^lyIio z>&w|i%Vvj6^`}^Xa!ETZs@S8(hIwqmdh|!LkID;RUblnhHBqp!#1lA*F@~u%Ceb{h zsKIfmx)L4bNyKV_x7Eo*-COBfr~q={k5g3G&1lPxo*mO?y5G(!BD1@+zV$vthq(=& zSSL|hBcIrku%2}LU5sO&h%P@5iK)h2>tXD$&A7T?Viy;~6n~d!4<*Jsa;Yui`;wCr zq?N^YA>8UYr`lArxIUmWli&oB?*g<`?Zq0KZ~Jvd2^5=#J|-kD*)%4~(O8X{7|+nR z5$yHZV*l$#J+Av-(E8GT`zA^}!43s8CS>N&sfR3?0t0*tpo-mI5D+M7@iD;RMamj!QG8dqTJ=*H-&gKlLRur-@RZmE3p2r0ohAt)A+2u1OGFQh)n z-PoOJ@YJiji=JX7hMNWmEI3xqr8iGj0YRgu zxl3kTaPLL+;VrmRd1iddqZWWs?-R!Bg{9j)gp?ugEs!ZYbyUBlwW4X=aR^>5`J8MtF-Wt7gCfve5K%pUD3v2R}lcBdY$n!U8-yyPQ>I1RPG5rVh-}k zbmaz;6ai6S~nvYUMgMGvASO&1t>$&i0drqKlczGa+iZ463=d4_JL$+62gC9yFtjVEPCbjh{wbTYE>&(F(bVj-uhyo9AfcEjJq{C$CkSq)t`(afX;&%9Cv$|dp0YP~z^SeY zPNTcpT1_mY5mcJkm)O*c3M?TrJOL zC2&oA!CgfArKsq$V@c~OWFTJw%`u=f&aK~T9_7}l7@j^`uMl=;8P@i{IFor^y^z1E z`ZCyZ(q3ZSs(7~jo#La7zgoi!vpV=u{<=Iu7Im3y2U7a4*fweOANydA-MPL73X_Nq zc15MKlW%07rklS&aks>Y7+R{#^8|h!dQnVEV;Vw)%Ghu2##7!)Ev-jRCXry%efYvO z9`-iPa@i?4-xqG_AJ%sC&J*ibBVn7F9!6*2t*KXmBZ?jTv6*!t%vj18-Hi1yEUrxEIarA$iY`X~DtppXdtl*ec1=6|1zFn`2>1LmAI& zuOVB(vlvRwOI!0c=VaeXNX#6DG9&$6rcW${38CfRPs4D6OC1QC55|&7hKrSTLSPaO z*mAElEIXdQ%}w`$G~Rh|Y17$4G^>l5Ba5q{A*tOj@byV1Z`Uogl8b+`h?LB4b3P0{A{TIgSy$37k&Y-txz&~IU>-Q; zV2LJ=C}wsAhfd&^n*sHfnx)y&fIkU09PFYEEXD09wH&_T>VLC_>aD@xEG!T%9rZt< zmks5@edP^7O(kbu>O_|kn}1@NhRq!q@TD)M^tb*Oj_ZoCwq6`W*GDQXOIA)=Mp&Cc zIrZ6>6^4ZU4aevR?`dK;dRzVDKR9If993kYb!oXn*o%)|jrSbwzL(H{nfqyVziCBUBcwT}j7kr7dwh2$JYY{6u&84*e8&*Zd&uqmwAksw_H`!1^VQyC@A} zgd%TXH0=iLWl_>%NNu1d_PBhUO;}O5yQ#FyVPnDA=B|uHIW&H6O8cy6d>6LKd|j;r z`TYT=BQw+dHtDo{2W!Z~viS}xutO0zZBogN%y*P>y&_c7mw%aLcYSroD(?>cQ9+BQ zb7UIzff1>b0GWBLPrmEn2+uUp<^$X07%A75!U3t&IXW2vy?J=fgg%5a1Iu))K3VuL zz{l23DGk!>G^X+O&~CSCF({#QQS%lfOYXFoD*c$++E^Z7fjI7Rsy&dmka&h4riOx0 zJ~C}z_~5Kh#g)_m3r?XCGpSZv;e2(h^<3Go6Lw#_AZ$9v`@~VsjW_5G z7iWL5Z4SC$Jz2iT%YcTAH#B|M=lR%Vh!_Rxy7->_fFBhkV8+Z*Essej;)by1Dx}Ru z)6z}6TToRGIR;w(iXo(!&Crneg>13zyUt`0#WFzLFqyIc?QG`=Ov)KAk*mDIfHU}e?%yS>ZuvhT)t?~3=&qO+=SV7U|9`7suY zwPwP7IeA5G>ws>1L4DaUMKM-Fh&EkjObY7OA{qvVyL&4pQ*~x^Iokuzq+nrkQk*yW zuc!66#-^*y_Zh7(=I}8};uG^bHk)6*(|Ns}q+q_4*&4_7J-q*f7{-zcso<&QKY(mh z=z_LoVJ4)iyM>K)Kuel@=eRBxF|6ycIhS`=L8e154l7Fq2eGrcZ?mheukYCGW<1YF zK+Mu`b*_lX?MlzohB&t&#Bl)N-9>FuhVJOa?RLt|hekHx&x~iUq9mqT>ZMWy%z)(< zPqdvAlwYmY_IHz)WC-vMx1vr7jE`gQx@Twl{3j$lVa2AdceAy>=T-~~AC&zqSePvb zl~Ukg{K5tz3Wf){VbvDCDaS4-9IEQ(0PYHz`WYQlLyK}nt4mz90{lcFoP)@#-rcw2 zzqGNcNvmrhfmPm`n>rO+^!es$)_)XIn1$(&f2X{`=MI!R-c?AJzkG3-%bM)aMG;CF zOnkTWnSNXiEmhW>dI5bEC_8ZwolzFL!pJKGV%Z#fFRTx8)wC$`Fo!CTAO#Z8vhDuM zPow3(2f`+IaEZ;kz*#JLdp7JEVsQ=a6YMWm5Yn(3)z*Z$4o766=uxWN*65t&$B-P( zoP{5aL>*Q`KAdA_xrP|R<^olFDD4Ecf$B3fHL}^d)C>UDlZYB_qTh<M3G`I#QQp?_)dnef1hT-LV3{<-@y5=8aWR&X4BGRNHf^CWspLNl%9XvYubGQspr z+L|T`2mN>azncx($G)8kC%Nl}m{i?sc^}!g8vOoUpGAyosDQ5K=}f6?aYHIjJ6)2B ziT5V1>!x1S21|87Ykp^%JQ^vtHu0yo)Hx2HZaHC;w}r&iFw;vF5?l^9l-D8C_?}!8 z@`mQxb32zKWe&VMEBqtW7{wdw`PSP!SLLyR7YELV?So2 z`HIIloXr-uCbMzNRi0ecc*RSHd=db3r%bhrj`g@U(zQm^hxP|-d)+^VZC4)iviT8& zCAdY>2m5QbBP%Z2b5&=z#D9f1S;a z3i(SU*GFFhDfQ;_6JZ}80;MPE3=nVT_vmi?8$r;KNCyE5iNLH=`ouDgO2z~zcs8l4v{`E(DafY+0^DkCJ zNEG%mvJ-u*n!LYC&6x;igH*Es$qWbgSCr`6-wV@BT@B~@RSXDHSTk*Iso9!5%{{Z# z?@e71>t4qp+HRz5Pu$rq)_)CwbzHTx*z65)ZmoP34NdOCnQX$rXR>k<(D(&G({MNm zT@nyF<2lG!;vkDh@ts?W-GknrF~7Moiv4GN!=mwz3=o^$`FctYj{a;+vz>;lNn4`q zeX4H!{b9MgPB+`U0s2GW=WOb2wx7x6Xh;Y*9!(1nRwrY+qHei3l5V>IgSDL*OkvKzVsJB>tp!s;A7#+6h_`AC*b_4U?AWDu{VX zy#qazuCIxJO<;td#ol(Y>JKILInRyK;_keD7OL8@AAHtXVYyy^PqxkYZFbh~eP76} zAM^KvD_JVk#nALsW@>fBi z&HHKT{5gs>BYokgE}APu@{J(J_e~i{R*0NWjoz=*`M-cAgWU1eB`ltE^zT(Dw2Z%j zExRh7$Qh1w0;HyNj0SE5uVjXw*n{O01rlza@CmcJ82E(3 zPxZTu3Dyp3!sd_gUAlrmc#{!xDD_Z_2!S0JxrDhBn!LchB!#)ymrrfB2!+U>WFgA} zCXI?O*3Cr%j z@Ec0>lxet`DH^1}O0CPHGK4+;$U)&0G*qaSEAd+ftHS`N04H6VR0k!s+ z@bdS+2v-r#mlRP2vttNMr;8(G75Ho=l?>nNG75KlM1WUT$$@1Gsd<}ZpN^sQ;rS#r zJ+CHS0sGGjX?_`Ghm-g}hMBnRlI!e|TG6I2+yco~@=XaCs8ZC4iYx4J8%|PS=U6Me zbo~ns^lXF9p&CbZ>4d*EYT>b)Tt!j$oLLNwQU5(gLDjFCA_b@xLo;DPu3@h@uy-vE8a$i1*XuBzBJ2L0)el)@qobwMfa5!>+BIf3nYOJ7b*V>$dogWra2YO_ zkKk-I{SUP{2tRtnRXpJds52vd4c1e^qa=x7&C8pqqZ8%fP%PYLn#R>$^cT=aVAyV= z$&gaefj)n4oSkFYG84-!qiY+lCy^qua;O-WJ*dvM?m|;)qVnxX%?8g}?+tA5d@-Fn zP879`IqWUuq)-X&FiY-}y2B)Aj2Oj4OcA`tW0Uzgxvqvgsr`5iJ^wC&{R4S4IXizh zfaIXTMXW@(2zq3beWs1axOr$~LS3|5#QJ=)4*ZrT_AC zx|JOWZ1%dfQzw4cC!Y|uZvVs9IlHdl5vh%I>@5zHMGDa(!?;CdUiF?8fJc6)h3p@U zp?lsxU5?l8v%7x*PN_w#@%WTYIUPCkqt@&jKs4(0kYP?o4KhYho{_Fn?2I~f54Dwj zhwc)4>x?5YGfk~3b5%x{Qh?%>Q4w&PQ;;<3%iRgx>}=9B6T|!R<=syE-({>L$UHN` zE;Aq5A|lLPbb>qPZ$cXC4K>VV!-tq%`0rev>}aq1n>uBkuy* z6wE<76*u*}?OoVuutiqNTpSPzvWR)526Y+MbGF&?_n?<;5-QO44a@<3~GIbfsNF zt?{_R97c2@NXx;${dWKp2$GtpQy@t2xw7P}&HZhZRjXcS1WDrv;ivkARfW{ay32?Q z_~F%Mb%wjYP*wrLc1^JNi)6npBm2LN8=WZouPPht-s-MpCy*{ES;@S!6JWh)A+Wq| z3iEx3R@TCahK-5n>M*daf7@r0hq0P&#+ELnd@5A?R9&^T*!XyC$|@P{B;2B@(S>Gqjfu2YKM#;QDR?=0!Pe+-S)0)Rdk3N60u>OVV<{Y$KYxnor3ht zor`UDBC6o}CXMd5iXbGU7u3?}HkbDiZ=R4QL*%99(PWwdrs>oNI4P*T`ANBqZ_J>= zJkqFpkDkR^edoPUUtN(U&Hnn$!CbX@vM7ZZL6dU1ZJtN0?5}b$%6?=0+t4xee%FLVeBPWwbi`?riK0WUgDeZodT_v)NNb8tJw}{^M?UP4BO~9>D0%cx z-?4l}rsLvtf7Ll5l*y{8Q6Ct7$Xjla)P$7fd^*QpOMir?^3(-E(iwL+@o~C0Uy)!> zAd?annZK^_=!_e?)H(8e2czv2ZsvIom#jBp(U_X2O`1X@XAxFEgqpUxV6i-U=*qJv zqPb!7mF?}wnCf9H6D2m&hh!a0)`#}u$d)Z$|1n}=BVrAKjY4PsFx=e5N z+kw+lQK~!*c1XSz9WSRZ-HDb|mZmKC!57P@Y^4^wQlo;v$*#pSDK~S@!++NWP%p zpO9kE=ADN3b4g;!0~7yH?vTzBu*q7JqSeNd_b`-uY-9nu_!eydti{#Y^aOCO{RIT* zj}hy(+4cn9#*C@_1y}_(BerBQ-P3B@vRidWY^DgFB(hy>EwAGar?VGGO4HO&I*Or} z$?fv(M6GgWy)V|6ZC%c_0Oa|YhMgL@uYUr!z`)R9-y zP`TaZF6iUuP=HxpubeK{7*2mAIigNQpdM97#9AhEIXxKH#k^;$q7EEf9{B>Z<0cxZ zSG>{f8;O`h;OxksQEXaGh0Hpj&&c}2R8)* zx|c5Si)c><0JtimD8D@Bcru>zYrnNtMUC}rYL5mfV_>E{Fs1ffupjq}hd?4mzo6|a z1}tYG#LbAX7#az6#azhQUY_Ye1-sXUg*DE@gcZd^8#u7*)~qj#B9tEBz@L2;mx7ybPyQmdpd(>q@HP>F>HR&u2Cc zH5+04>yllg{vRUyvy-qYSip4*k4!)4QX~Tu)|)MNPmztrMaEWP6HJI^EXz`nj0<2g zhzvkM!Z8mhzvj8d1^x--UeZ+Qv?sjTWLd~BWltn!q=qys7Bh)c106MCEKnRTL*g`B zPesqk9>V^k6Z{b~-c_x+@vTFBAZE32i6q!O?N5g>Zb3970YEwd#;|Go)RRMSxcXKu z<~5|_By3M_Mu-gxYG%s|D-Pk#0mm|>CN5cNG@Fe?Qkip0M_j{kc;L8pSSHZbGT3TK zwJj?wcUr8ncMjn;%Uw zRB{qEk^<()#R|3WM31J*I)*0FNv`Q+WD=8~WkmK=Ri9;Yuv>ykRu+7PY-W#;*{lXI z136!YU>bkwJ+=~0mZx*7d*&CMSn)jsxRec`};mu`BWdU z2=qZE+Pftm%7SG|>jM<4Y4c4MORNG%ec;zy(y-?U&nP&o%(_|Yl7plMYeE~ax?GN~ zXT#IqTUjX&e))-o3dZECq7lAg$Wn}LO8UjP)Q}r-U5N(W;B6J_hK=@4)aiTBF)PX= zQC74WGll#QW*II@b?4f_d{%H?K-%iPSY8pkpY;3jxUDq)gx6NZ=?D3}rHGequwF5* zka@LZC-7`a&kA^SlkU1#1Nvft((|Qyjm&E;MttJrr272Qx#~6c+s0!Oollf|e*uqB zY!uEoo^Ql)6C{@6Y>7Mpd0;CRsRBnG;khj5%(7x zh4P`TrEc5P!DX&gxxe!xAIcW*j00w4OTjH)u00b4{{ntbb>C`W(}bv7PP8me5Ibm= z&%=N$DEp(Pi=G>n=09@ z^s(POQCcxkKD;h<*KTfP(j17W+GaApppXFSGnjfcs-`vTiw^TccL$9j-E(rW<}9-E z4h(tBZex%$#rD09g#)%@{}8gzM90gl zRFj`R`ij(U>_eq1Z40BAiB-Z|%R?8?G6Dn;RE18zD6=e_O?sBDsM%kMp8x9C%XdE) zc0+V)4ABv8t!i~4rEk>hTGH{J9->W{<|dzymwQA2iG^!LFI{hH70XX@86yD@oZi9h zrmxByU#qXU>D|rmW%k{FjoFOePHzkR(2ip}vozo)In20Ng(SD=2H_WA%lY<`hWrx^ zjR0OG{Ri?npGr#7pPfUypoW(!F%HSKGsj8GW(KAW598%1TiVWkofKMkjP&S%6pUvC5p@+(r(?k^4Qn(%L2MhM2ajYX$c;w`MI_JrC=LZ;ZB}8fm^(m-TC@d}eXoa2?RbE>XSBQXBY7H5(o|}h3L}|E zN(l?OX73wgM}X}s*aTElJaix|bNd3Zp=ko?6ae3e+B)Sh#PC%0LxP=$@z z5*@0M9EPSYlV>I%8&B+SUwhFK7h;hl%@mt{M&6n@DYLX06ws32a(LNb&ouSXgaFOL zj3~oAl+#}+G-g#!G$o2Z&cyzs_TjPS`%6fOX9T2M9i8AODE+quQgmU)l1;Is>*j|= z&$n2cd=$YBjhxCxn74zeXR?8Uamt5sibgfo+cj#MHSxG}j7Yx~)SIZq4ZF2;#L+*Y zsZ8pAj^J(m_0gZdm3<|$&)k3*3IJPc&^BB zr8{}cw+H;~eoYDtLGksRfi!lCu$JYCCOdYA`h2MJxt45rXl7ocT#)U_lI3xX>@nuhG!ew_I0iNX}R(a?R_n-*qbJM=HICd|T6HoV|nnIb+RU za*Y0lS03}^bNuXSHeB%+`t|a^0+uAftuaSHAy2bSV>SDqUq6{NlJ4HNI2kcI3W=1@8fZhOe5n-aQfKd)7r=h3y}KFfY{e(Z^NW+mR8uJ|NIEll{o8D2}AMRd;ejXAan^*%gG2j%Urz)^`|a zsUgsyyi@*6VxsBCajuOD4(y;V4d*l~K$tj%O>%J=3Jp3f35oeKODgXyxNG1{EThLA z9@F%)i6h_fW+L7s(2+F};u@*Trjz3Z`dD*XE#cjUShY5>I>upUOz^)F`U|kp{0mTM zj70aEll4Xdk*);!jjAnMK5i!%GqPR(!-3r7 zmwvC#(7~Gx*FZuyr%SEYPSNX@_|g?|?rNJj(NT^yNxB4Kgj+W0);sxNGz>M>kAO1j z7v9XViWmC(GN`-Z9B=X{TL|n578M?*iy&1;_{kuVZ#^+){}Aidz&ka0B&`#7txb$^ zy~bwFEsBq^f|I@wKnUv#er6>pJ7QnuwV*kDc==yIGtmoSBv|e*U>N&J@V%cSd(&S4 zYQhWKo$}sU>UkSt_l!sL7w|#sYCq!XSIgStd)a4Gzk>+^m)!2tw>F8<^QtZ15col- znPZ$G+i$lN){^-X5zxt{aTK7INYI^|rO!|Ub7lXLh`b)f#BRElBS^>P_uHys21e{^ zhIa~aM&-v+>OyHD*EHt9>3bJNW#!ip)hX)!_ z6Ym`Hq#5PDz`zFLXn?HhZl6u`IKx-=A3iWf<~}62blyqDJ$C&COck(}Zd~^4exESt z!|s^6z@wgZ^hs~}VW!)=C)DYJ-h``3;T?e*$QI5A7J4hX@FGdB}PMSx4HL)zYep58d+m2DruU>sc zKKV3EXjaMk3Qw1=G5ZLT_I4{`7b&nhib+TK$7IFV{2F@@65b)}oky>NSEoBNf!ndIvxgik7bhdRP6b(L-B6Y|@zOxjYKnim1s=2|RT ztf6f7961uW93#KpEuriodWRp90nMW-<+GAj3iC+SRT`SRPqA&rk}f9+a>fv`6a9cD zvUf=$m&$ZtF{M9JM%41V$vu05MR(d6h565fdn5=(3mc*#K1HG{`GH}$gt;TJy%t(8 z3Jb*q(~YA92M~`!n1}sTT(iUMVNR4+72Kw7A`~vN3SvfA(VP&{sLHt`w{DUnS?^i9 zF)*7HwW7@~(qw*ew9-iL-!P5|KQ#V2*{zinFZsDjU#o`uYXNtvzMO)_2S5SG|I{tg zSX(H#&bKIc5T8w*$`Dbbk{)u7!LNu`juMkP$$;Q$D|rFEll&uJx98P$7ex0;J!A)?vjRJA@X;0Aoo`Ii>BM z1Ee&FaJ2GC#iD7U7d4GGO!Lm3tpynviq|?kydAZM+RBH+J`AFCd%WCQC6nO}n_U@P zT#6!9*@(`%4^R*NI=XVK>mr)Tp^*Fg@~tvr?8kEi3%~U!DZhxVmohOD>NKqyPS`oY z8@85LBXUtg0+im*R2iu_1vx*PUpyrijhgLQmctO+7GGHN-i z%%DWEOD6@aub7zc%i7oe*S061Q~39`P{#*G^4b!frG+(}&>o5iUS)pG2`#VB2=kC zHTiXD>P(Y7nLiJ)hUp_3roS650zXRru{NKYp=`pM|8r$Nhpdem{MA`Izus!Yd`)|{xxgz@%_w?)7cf#VUQ#DNbjO;1kRu&ZVy`VFpPeY?JMNbJwQ zfFQHRxj*Hv!fTzS{wFi(w2o#%O)_^3&8esF8NY@X?gblAUGx5*M}&8Z1+w8hGsOJ` z&@)Cn;#kF<3;X@yl+yd*?+Fj^eSbXn5E?$^hN>{-CT*}Q+amR)RH5sa3qlhaGW2a7 z8r2T^uXjgE9~YezIe)x$!yxbr{WN$p>6sa@I2B{i6u_%2!sE6=jPuQn zSTS-uxNcn*HrW$mZJ_AShz~$j8|WhyGNBH4#J4xnAq@{pau2 z817ij3NnO|(8!ta6fgFS1erDtw8+~EF=|$VLX$VUUxgz}Gw~w@WLd;s6Tvu(;q{HE zMrA2=O=)jYh9@5;Tkyg>I~5nMzcluegn0!}Y>{KvC&N-#A?&oQwDI__LO;=34o}oz zA@sB;9y>lyMqUxeBFX=SB>IMGM-^M8{Ai^-~Hp|2God&%UfiinPX&CX9sk-YTVTnpTT=B zxnVAQ-9R^V*g#JuC0;{+Rs!K%8O=A&Z@J_RauO2L(QJ$clUN#FjDK_!id^m0VU<^){h)fAC3b9qN_p)pkuSempbA6gEca951y~cW<>vFWi z4N?5hhGzydf8Sr>=w_$VS1FiO>d&>s-4Vww5%|O*<6|QXP($+H0;@O#MMno>O2=Un z&N$zDaMzyg;9F7l>ODsOcfMl!&&l~;9Z5Z7Kax9O`Q2Z@#~zW<85fcax@tagy8UA> zjD1FhKgw17I)?KFRfJvLM00r~qC(y#C@lxA#VXv0W%KjOI(A!qx+D6qq;eQ#_cM)^ z3enot)dF7!wW1?kgGA)yQmlp=-!EndI#fD$WNN8nU6tfS*Z!Nj3oYktcAu{~MvADI z(fTi)t~Y+tN&odZc1HjE<^TQF)$#sw2E+gR07&C)X#WWDHW}9$eGjVUe*{COJBY2F zUB~Y|RAGZnNK7DNO=}u-5!BzFsIpWk`5V@=2bB5Qiyo-7x?~oJ$A`uL^)v#Wl>fZS ze}|&~|92v)vL)D`k1gJXu+qs3An`Ir>XLj^CsAZAqGNjZ;xqdHswuuycy%aoemB$( zEHCA6)nC9#37Eaz~(dCp=qKi`z#|_)@IiMfECThx&-{Mc(%# zdRBY(niTi8wtRD1h~Au@Bs`1|AjJ)?J)ouoqN||p)^&)#TXu5onA4`nRd}+Ai72%U zYk13O!v6$g$kb(X>QkY$7g9OjlL0~W{n{&)jGTLwd3aA5_K0uJ-6cWJPDL!2t@v67 zyOjtEa_TfZN88@i$Do#qKNVN^Y+~w3iriJ0%M^xyJXa%A2cM(u+DERWz7?9j723W| z)${CX78fO0OW~b#$I>1*Z(Z>ZW+tgpGEmp%Cxf@~3lh)aiieBt>3zB!f$l8Ae?& zWKZFaLX*sqoVZA)ZcNZgTtP__lf;>zjHlEtQ6SXoB+hxba?4V~7 z#XT3;cojQsJ-qn9p0Iav?-aTBl@$rWX^v0eFACa*(U{o`-jO1x3d~JzxyB%Nl^eQ{ z+7rv^1NyR`sg|eqBQ@oO1woRAYJKJhwAKn7V@XL6Ry4w!W2uP8=RXDW8{ikK=;zB; zhO-k}S7TuGx&(zSOH4LlYQCNUO}myUMma)_a+$4JOW(J)x23QaIx!_P(Z*Sre5Np44HMsnM>wVL^%U%4CV$CCYq;AEeV zqQ;m#`suGbF|Jjy??_9ac0^D^Bh#JP7l>(^U3-1&RdU}~K}{0Y2rTaKDk4H70|O1M z*AgGl`sz=j8$ZamG6?83ye7BMII^&@VO^XJoT}3ophEmw$FZAFrfeSZqfO|1Ndc^9 zC=*a@GaKII!@FD2F6(%bhN_o&FP>jkTzxb8OBQC9`3{^qL zWDBN}#EEW+eyut*YAWpq#UdPi0LC7}ZnK1rc#&&c|D4Dv+mOtxKSGcD58p_-T4### z>^^qHvqL+w6E_b|JI@Z1Yl3zNpUYPgYUJ?PHa=_+=0#uC)t)EY0sL1p2(@r4qb!&-!|&zIfacdMG?K6Ruhw_fSTuTEvH zfvWe;+OQ+$_)ec*I>;BH2r3q09&f_A4lWz?y%i_VyjUalT%Fn1%?|;Kj2_B}M$Lm` zDaH1a|FF0y#D2?czH~vHNd5v=SZ5)Y_hIaNXKT+XVOtLbku^!X2bfHKCg`rs7%`#` z)rE`P>vpB|V`bCj988_U9|Bwj$eU@7D$rQLdE}#_DEl>;Bnvx1fSkf{IyQN}6~%6y3m>l5dHi{7{69qvM_^4fD6I743}t<=i6T5fbafmlm4) zhA?nyBygP7wO0G6)?L?UGJKt)7IvPdcleFSmg?Y^ed1J?0~A58Sk+ed_%+gj6ts#6 zF+)bb4Pbg57v0q3;2=O&%e^?OFBw&p6!< zBc-lJ5w-Mu6xz_|K7q{%g0&sYrGb0r#xq}@(Mqi|!6YY#-}vNyWB{uoaIzIgg@-I$ z6{hhC7pM>-ql|Z(kBNYG!j;8SlH3L!Sv2hDk}5xysU`{-U-^)oP`Xz? zvV*}hr$FPY>smEr$*6ua1Zv*XH zbfX9cruJuVRB%6*ym5UhU(%l3-aeaSSz(m?KDnUdx=nx({m4X|OX^>n0Y*_Qy<<=E z17p_s#8i>Hcdpru!ik2aAHo~&Nc?E5{iiQ_ofZv5qKFjhK)dGWl6x1bw>2#!|3(=sGi3^pUql-#aewjK z1QLxF|Ic9PU+tlP-JzUryE_V?XQI4`n`}F$U#2onRS)-@q)Q8=9(Xo4IMWDnGE;B{ zK$PDp?Ko66Fon;=A0xyH9%_EzwL~PT40rI!$o~8deu)&lD4XRC#e14(iW*>JrcMNm zSzH)lwVgndh8FUu%dT^E4K{a!k)(z5twA4&5e~;`nn7I2-x=whfLdZ5Q%{rSM*`9(Ciy47;0n@Q&(e@UY80% zEA7lERxqz}Z=&?W;%*-;xr}^6C?PbzhK)+ycH;9G{b9_rLXS`V5f-n#ZVZ`O%ej}X z{_ZC?Z6I5!o*R~S33&&=BY;9mxfq*inzw!{Y7qVbA0Iz5DC3~eJEYesc3xMO)<{gh zWRjOY-kVFF;OSP=qCuDcyJ;HwWAo1=7P+mlm^|Bttf#Fg-E`YcT5XHCFgkdVo zx&q7pD7RKkrW)W2(g7cxv)1z___LZFc1zRdBhW z??dNPgxviWrv_=^c6At*sgvJo(x4w=+hej@ z&vlRH5!Smq=XLEL`o_-HiMPe4L=P{9xVc|)IdLq4c?iA%Y%K_cb?T!Ti>Y4al;k5g zEs&Xxzqo$g7t#c2R?RjCoPaaNQR`SO64oM#LVRYI!#WG3@iw+);{`nGqO9y!0Yn^EY1U)ak%z(jS@Cwk(myRF8)!TBmTo&5C)&x*WWmO zF^k@5X%QJS6%ZX9$**lmo!UeZ-ygE*5a^l`yqNO|ag=?_UaXk7?OyKEv_acej$r(=;?<8`{pz?MHb|I^KDq_>xKi1a_17+o9}ef^$1Qhj>*uh+Se6koZX0av~k1d zV4HJz^&yv_{bDRHOfOF!?0Yj|fw8sIJu3X_Tb~!hJ6ce=fmbAsGkJIKc0mr6G4(RN zRCD9SDVP0z+=PN?6IEmrG-`Y!^+>wzG3%#bxmhQabImGn~l33aCYN?q5l+L zW7DCZ&F~=P_a?AoPWtgA_jU9+V>0$_066nc2Bb zzt5-)$x<7(N(i_Ve=&?LBpnzJ>?Mmmt08V*qn_G|*!*Fso4VP_{9gra$*+THALIk@ES{t6jeD-Jp-L05P^*TkN zwvMW)JZjp24^iq ziQB&pG4b_v-yG=U0a2`j|YB@A)Y5E$uxE&lejmniAPlEkc zh07s}~FI26w9_@ohcfVeJUmB=zYslKdoL@v4`+McaD+@R?t5mcC4nfz3 zLI!JWgg7$GKqXDg$l}x9>KzMVr9OVY5&u*Jf|sJSK!XPZZR87PmafL&{m-g9pY@uh zO$^m@H~qf0gNLBRJpBdO?;oh0BIPOlu2d@Uz{yg4owh0_A5?`;Rng#YrRS0{aXq=x zS0oW;GcG}SiS(&3b)Mb!G}D_}@sKRDMJRjyxmaH_pDo>ydm|P_sfyuoBZl(M{Dg^z z{q#|p3);PMZ6bn|8S^e{ymlbBzsbkn83ZAHPFqt~EBrPP_9S<9DqQ68S_kh3R^K%D ztkaM$?!C`sF4iu!BNa1&%j^sn-dtqNe_D4R9f!R02iG2J{sO#wJ++PfP~gjUxppCJ z*Cpht4-7x;!n|zTZl7mQY%dS=irFHpXM`=bWd9%D-m0O^ub!L))3$2ANf#j%|=_c-*pn#3ZKt9aEpLyU=4>*zg<(G20y^FXGY_xC9kLBY|4({ zC~8u`X92vwfO3XPHJ?{r>mp*L_SjL^hMar*`9G(dGW)DrWqjAA%M{6r_1NuZ<51YZ zAcE{aa=JR~?1H}nu)7!%8s-?*vdjw9XfozA3GRnSSYi;}IrB&HRs^uK&t9t)uSz+q&^DhA zJMDQy!s;7+a_%$%j(d^g)ot|Zc=(r73ba1__XpzvO1b&HmoKqEp3fXXRd!szn&mU! zHf;Szwd!6I3ikz{U;JV;Us^Bhg5cOW&k}jHRkKmX6V8*{ZNWUPnf|ks@8{Na@m!k@FAp%k5@NYXHn$~ zs@EbLUf!GUU67;!lP{n;gbA_LC_J$)V^&@9@>f zV63^H-n_d8?~9>#ozL_mzWjzp-7g-m;56&$PM(9FwtJA? z-T4_?#?(tKYoV6vPsWjvpB+#SNnCn1PlvIv=$%gZx=Px@wQBslp@MU^EP+OUf0DOJiBG& zvln$OQxBg4_*XAS!OV+k{G4-!-pWD58+KR%Aqs-Q;PL+dUo_mLivVK_tuLG2TlIO3n8lgs$$uj zgjjM59IlNXdDBWc2}+o`ACZOqh5aj^l1|_-o7Bwl;#!rLH{s<*lcVp=ir$@*`T39_tFwO<*Q%x8o9SoyU4V%{hCSU>mV{EgJ^1b zU$dLYNBxPhja=P{NaR^Bf8ktDx=`KUJldjrEaV8<*0oEL&m6L^Z>l+PN?HTPfoi-; zBq#C;P3TrNHbbkXR-@L;#vxl{M>t5s_PI0I=o3%WA%juBPTITbc+Kl4KBPtEAP5CQ z`l|Ohwx-=Zciv*!)QxR3VM?ONvwQ*hC2Zaou)L*kg*qwQ#V;8iRTjRN<^WhmAJyQq z9yyG7ZO=q@b&+Oeyi%683-uNcF1q;r3Tk8BKcl7QmWE-KEG z+1yA6ndDN}C$!GP2DDc5RyQui_vS+vIA}Fa#(Pw)Dkx|1dw|Zz zxSU{%5TW)^0;W;N9k`mU?ds$RUB%eKeIHe+HYg6YzLYewEb= z0*+VtJcMw0>!-iW6Fmnm7r`2vS>~H{zZ6h@fKAr*K^;_sL9gMp=i(0C(8U6R zF#xYTXZP7)_8q1Qy&f$nRh06A3m(Pq;R-jCQ1yH9vVhwfbAaCH}6sLQ4f`-8_XF6A)9JT~tHKbCzP_ z*`#PRH{wytDs@^06>7DJBJI)YDBrHQCIfB5p^=d?3yxB=bA=jTEbld`RelZY@_Mu&4n8EJiOjzL@{|_39{si3Yo_aY(H7& zyZo44b*=IH)rrwzc{wV!p2$_-X&x5*6#=f=D03M;x-P!x9%gaPaBi%+kM8o$+hW`N z&Rcht@vR1i;usc_>m-qH$3%8`%05}_?FgYyZLZ|RWeXmlmH=iX4 z#<2sr((HcQ{qy$f>q!d0u|4iDK>gzGqsl{5!NK9f@phBZ{Nx?}r7!K*=Kax+$yMiR zYr( zrHob{ZeZVs(t`ZGcYqmmLU}6ix!P1-CW~Y*U!+4l^dE_1qZJFwptFoZr$Hk7utj7N zv@=jQpGdFREZEI;`6|m{%a#>LXkVc5f=~!)@seMbEHvkv+4SB@S;l-Q0Ck4yGt%)N zSS?@T|L7fMN6EP`tv%)lXJS{$A%dVoRu5Zx&85KEt?jzz=DN zhBg2lgth6Rq=>wRQpQqxd8t4KPc2OJzFqMB0N{+c=F!m|<(Yl`qOhuFq*y*v~MTDF`|uJt+sCgewadIM>&U9>yCsE?O)y{vhIh zZ%Eh7ELBjvs6~kR3&02f05motE3vGHN~ed);=7Y7001li9)KpySc~(Y*6;t;zW({P zAr7=bS~M(uljFx{JAKNj2-iauf-VOPjzrvL6FDbOlB9tG>wt_~`64J>k15ACuUEQN)*@zmWWNn-1IMjuP0=eQup%XFn&(`Zzu?PGxA%gx!1t&Nlic|782#(}A*LFt7nG%VjdY z!3sVM7q3k7aiKK1JHU3X#9b@{dH z7X8Z=$a8B7nvel7=>?I(OgxkQ&?6^C6j=r zUbJw`JxCQrt{X%wqrK8j2`f#zIAVQB=+e5eUR$n_|Q5PCDn+I@Wt})Tk}$05Qxmb zDfd{HX-CW_D|ji`n;Dkb2t`R9a3zy-)^$>1(tFj@v+07=8$aP_2PmU-4KM}@3UxB1-q>XD_>MdBq*f_q9(z+nEm6CP#~0Yr@6hfn=t~lA zU~MjqC?P#KMEOlBArebka^mP?j4B5&#w9WI0n zcTyVrl3$)>yUIYnap2Rx3XgwCz9x;{*yC>4JA^#R=(g`PdpHyo_>SI3@#}nYKM?Em zpkr{<$dfZ%hjA1t13F&(#FlsXxV&X&r}m>XFfwP25bQNaw9;ET_(ggg%EHbTnOjy-emeqPcPWbAOY$3Dub12;RbXS2Y_14U9cO}N4CG$$!$5`fw zhOEKPWfB~$I2!8(w!5o6v<)2|#`#^lw8+NhNePEB!2`vP+^Eoe$`0u0Nb# zfhni?aAM>5TS{??EA;-XK7+dpq;H(ZJ;57Z?MBB!!TN@^xD~TI`j?8`3O-ts&xH|? zU_q%W7nqQcZOg*WxZY}tYsI*kZZZDcnVJ89n*dC}Zh&zqw=#LghZA_JaA$AG#H$jt zfnfu<-PPmkH7}((9=C7oD;9>G^TdPvXr*=Y2|+_8_Sv*<=r3}I--9KpAbwsPeAMPv zvsVWYg{SjW*5)>+#m%u-OIozJLc}MSzSOw$kGK34*=A02SI3^lNj^{7JhxKOn@`co zkC2t>`p%PP9}@gStEZ*M9I3DQkjS?BzNVzz5el7}-nMBf>2KU#$y_#E>;Ei;XDX}m zQ@0oypVwYOwYE4|$oi}+D}x$Z+#Zv3UF=dZE{>3Yxa@E9LrtVs7lK$^;?JUWpFS0@ zo&OkH5spsrSX_2pRvxk7NIO3BXo0VkL?x=s>Gq^v95j7gn9pjjZDZ29J3rN5GWfFh zI4x6sQm&%QS5`aYz^qU5(eOP|c(}5F|B!sh;GA6?GIAVHpGhyFH0Ev8lw}0E;BrY8 zbCo=O6f&Bu%YM8$!jmOfi3mSf2qlQifG23CD-Bk4Z0(^^eTXlLW(H-tbgV04%yMU9 zWprgL451*Kb|tyx!rQABR^!h5*7RJ7m4D#N>Pj@95+k}0``KzOoY=0rpYa|=SEz_0 zZsR#fnJ$Ovpa`$3yr}X-7(D-b>0-TSTx>+GEmL|MBONT3xJmVP zbr0t|V9BMf3d*Tfzb5O*a3$)%8+>?F=0OBqxOwy#au=8Y{Ni#;T;f;k^0e=NNAt^9 z`3#noYy8h-_Wzao|2g9M-zCidF9H6){S6oPX~~9EtE+X9u9peAaT>~u{2ARrCvS4%Kt7HfOB^`~L4%ejvhDTtyM4Vy z25-cGFz(t@CoM?b#{7kELABnIZJ|IlH$HFOyvnnHgNTzm3^+YZU1E-7soHQrKh>oE zR7q$`rqL92xLz)AaQMwll;vyfVjfwC8t2HHb8e#Bii(2%4r+uDj<>Y2KhHMp%juP0 zPx~s7Tc}|y+vW3R@ z3&MJ=e8_gYCrNcabjodWHM~d(nvEsnkMlhD2-AAIhiTGqP)aX@Xr;2wOeC;es~v@v(%MNOX8{?^=rrErGWnoXg8SD8Hc5+|~); zq<&y6M|T@N;##(yM8=2HJXqMeSgUN|o}v_>Vuc-)?I@JDXZ3+pRYw`|ML4pcP9;8I zq-xK^21HsN$R8)8!?67fk8vpqtUxpRPo*t8PF06+WnJG4}YbZ+#jRE)KzZ>I+eRD+S^|4cBUjT_WTm zl>ex^qWV6zLz8sAU9aK3n~fXVbjqO1Dmdc|ReFo`@u8~KHm6>t7MV(b{m)3t^bBe| zdN*@ZkV-mSma{-C;5_l&bn{Wa?C^&MM?&fS=Q@=HB?`JN@ev@VP-(~)IgUe=a6?j(4vj)=F1F^{r%C!6G=-M z`{rA%gOOOLQ*@+iUbXbUr`@Ey4NHs7?7Od@huY+>w{fqN=HqH`a!f4%5A275H5`c< zM|A0>UM%{1mG=7lQywl#O)aQaZq8G5oV z+O25Mw*0g%<4Lr~PJ}$IhrS69NfrtVuP$>*)AkZ;ODyFBNvSPQXl%?!A1&*1cccb`DY4>72fHX&sVYF|yY2 z0tL;cENxvjRbgBYfJ62pUY_!ePxMjF8@mJU&c2e!zdqmyDpIal$Kr~CohIv9UE7TQ z5SYB~%Pq5KLlW7@@&QC7T%u;yR^G7|oIOs63YSwr66L#=luFz!#ALoVIvD9%>qf)f z=WY}CEh*=15y70QMcn@Q3PU>_CVZOZf74etHo0J4nGv6E8+#>Zh%TxE;O z81!1iagQ0VA-HYxCTycbUn;sA5=_G9T*A0(naDmwq^4la0OiS@gI26!>}E7jV~_+H ze2V$KB+uWqP`_HTpfr!C5jENaSAASxbAUvNSo6DXiq$r?%Ivo^6c3p4`yXpdkckFy zcv0ijU9}tz-{VakW$WJ^S|6L%x_8a+6M2lMtIdEGz)N~+Q>7WU_EywVVJ7Jqs3zHB zE`js7mdIKHSx|(PLSJN5!TBvuCW)c9_I|GsA{7!MB94f+sUqmUl~cu=u#{icoi=}*1N(zd$6h&YirLH8qGmJ&!JJmSW+dj zlF6O=cOKOD8hPozsb5n1?0>{JHC3@lNxLnTa6Cot^B7mNa0+j_d;h!0`iq8=JRgUb zgD_}k$KGM~<^6uh?ap6-w&}|iL9H47Dqyfp&h$(9tkhE3JFVP2W812%0=F1{9o*@E!Pjz zBPT}PxFun?S48RFkniQXx&NM$h5vZsZ85n?KDk~`-N?HLs;Ox$VANUd|7IO;4z=mU zKL#ejHU;WC=X9}Fs;wskeJ~3}r#hSX(Q!)Up{Hx>a8HAjXa|jk+mwRGius&-HF22{ zHF|h@OXTcUpzTMw2u97;!DGy}Fpq3sRa(Mx+ZEo?R;yc^eve!1c;=x-wV2X`=wX5A zVY(PVhoKM&>t)e9ar|>!G>r%drFDVc&Bm#O+h-k{rqmwOBz=5l4Gs|Deq>&j3)5DE zAIYMB`s(MGGlDFcAlFY{?WWYXHc9S(ig?^a*-}9ajx}{mz22j8J6#cM1}CTcZ};iR z+C;!mDs~sAeYl%s8$$73<+c)Mfo|qD;%fGEADSllcP9)sQ9o6*Fa_Na+-X&9V4TSV zt32aGN(_t6FamPjUkyh*_NQ^IE#eoRV1f3K8z(#qO3BS&ES(zMk=FK4!# zr;vx8La;%%F$gI<_DkiD^cZXNo;YR=yUm z;Q=OfFx50$+7~g5tsUi8j231D4{5-;egeDjx9Co3Np^5M@#5m4a-fYQ6rCTX)#ihf)fRE1ux%6*VQA96ytT41TXv=P3q_aj9~+|st{X6z*#Y|D5*y`!Rx5)#lt z7XQ^RDmTz8US7JJ`6Blv<4>_0T7yI$ZYs`5^HbGk>EemyyvBUz@W=@p<}3^#R@|gR zazG8h;gI@t;kcX+8W~;K05Xf+)?@hJVLMUj-(mZo%^A1ZLxGUsyPM!!BjPMbpk-jf z2EEer1&`-d?=kx@C;u_gX4zy*@EADFP9g4))x!?C>RsNgc?(2l0bAEYq$oe&$FrT< z4=V`_RVI0KY89AyOp;J%pRj~|t&vj$(Bxg1WS1dbqPE@dYa@P=d{cowh8|a|7l& zQri8SsG(4ZV8g;6c8&kiTM=;;&Q-TlnxAMj1A5Q~>q2L!{%!#2li#pHZMJR&Ff69X`S;m|>--~{|ZPWuSZF}A~iULXu%A(%z z{=>l%M)LuWG@2nTu8p?+2TsXC7Eo80 z+|nazb~I~B^CK7i4fb#iN_nE5_d4I55{$xHB(6b@=IGMx0v&-eOB8lGKj-rDF{A7( zy1c`SlZLV$^f2Kx@4?I&d@Z!v(I?e__mfsjNjncw+ol~+Jj4^1N0p@T4mEVh%req&e2`jhlIjwwh#gQcRu! zFJbQTk~*yE&^h|MtkCOamHV)dSYu&U|5Dy+{sOinLd;H(yT2DAM;eisY&-z%uBP7m zOxb+&aAKbrYM51itCImd)9`1FncK~3=1V-H*Vr?Rqw)AEkNTKW{3*D}&(LPbC-5tC z&Xwi?+9C;8U0LO^Z608aUhJ7Tq6yZEBIs>>a_LZ07(_EElJ6+4x8ctQOXfS?IvArh zOzLBNENO}Ht<>UoL<66%lfd^kf3=TPXPw13+!xo2O>~|ZEU}})@$$UUR5u{=7aUij zhxv=kh}?i}eBg=bVZS6+vem+(WKFQYc2;44cD1^W<2T&`$+9V?-h>1u!E=&Qd7{p+ zg)(gZ4dp65Fd`tTao7NpZcQGtGqAWm)9x4w4{4(Qw-6}}r_k2(KJJcmg6;5|q|E3> z)@YO-1C2mVC)CjkdW!zyW5R%{5!R(*z4_E|_m>OYZ0HWazSv_!!R|5km@&N79M7J@ z>+kveq}x5X&Cf&3;whN$b(Oa7m$;opYU+^6J^>k@M)W-fEhYj7~3(f}*+SMQ0 zWTb!gzMcgcw0`j%RDGyHCIr4fQl-)PW9{{Y^!z%ST{!jLQc%OK*{5gOX6TD(>icI} z%7j-Qtvi!gn+Z+gb}lwrDZ5hHV26d{UjX3&lWY*P^g^XF8yj6++mN!?%gK7f#DNK1 zIRr1XE_z(wU8kh`rN2OMcAgY&zSPL@Rb+5cM|4f>RqEtaZfG=~1@rM44E(1YBg$F2 zCF`2lmt;Vi_g~kV;F7awE1kQpZ(1c9q4FlS`NjysjD-aHA%Mx#+mB`zh)-sgC{v!3 zHA~z)x@*6yt=U{;}z@+kr$6x0(8u(^8a;dhriXE3)r}SN+lAX%H_=gqt*k5YR zgBfxNs%Ed3`NNW+2|U&GMEJ+yUx)f8f{a`@Z4yiIJRfgM=zElm7VHe)tPG};gzG1#(uK4V_(CKnwjDqJYv{qcSYcL1Al&o+%rNbvV?p$;kHl% zd((>MFF@KWbv{2yu#Rm&F=->GjqF#k$xo_mos}+)*Gb5XgdHvnF2jfahL`z ze0i`<1#U21HkEw_6agiprRgk&a{h2+z|*>>jwhO)Fa-2U&fElQj~8sc3{rX>&e6AUR5C`h=PPR!Vibdq3mW5~5>GlZ zQ!c1$pJL-D*Pb$pVUDR*EJih43!y*)Lz^1x41Y}YkM53WvMMe&nvdT9x? zT5mM+po3y4`}_Le3cYNanN;6EOV$x*6i#!L%LRhgPN;6m4lDa53?@rE7PM2I?-S|2 z6`JW2UXa_6^{~o;5JzsYQNb0X5(Y|2LR__j*BvPI-esWtq@Qwe`;j#>Ocm>hyqXpD zT0oYwX=VTl;|%VdF2!Tq1NzKCPDKFFrR-**tRa@M9nQVIsblkQ07Jpj3cx~-TYw=h zOelv^L@o;XBU2|+ZQ^(LkWe=**?s2XWwq3{P?Lz;teqK*cw9m+Du%hPii#$vg{K+Y!;k((~{q)Wy6}B?f>7 z1OTSj7e%{_T*+Pwy8TzG4iyCywXR!WQ%Q~9xZQce3DV~sKX)qPhzo`?Pgjzuy>h=@ zs$Z*^t9Z9$<)c-3W(Lq}B{dEe`=#(ax!mdDs|&7kf_t;;#G(3NJr_*MILi6u9?s3c zRX_q`aa1yARkyd)=g(hN;%Z&I{yS~%=BEA+Sz7<-_ET2N@0qB%ACi>y592TU^idoU z@MGt{07e|VrE}fdcWvKY!aG{=9CTE5g8M1b0?SjjG_@o*ty ztz);Ti|hqn*qCc7wZTEHo)74JI2h9tH+EhTOg*ot?t?wYxeraVhM-<|r7?ROOKWkJ zW$Di<4FTV8!OpG%D)ppaim--?@AOiaPTRgHhj|pZpAP6-qBYy(P5b~GgMP(|C5rWj zZZZbZ+|Rcq^C0^?R^KApK-KA2UyMI-q$mU--x-TcD;xvMid})_ zwR6Tp@mS87`bFHOu(5TYMUMy%T1nw4aa&7hvG=buG9$46uLJow9T$0zfIzfw0W&ky zA%)g7D2lfIhW;28MQeI%$`0S@+Y|=r;dvHIDCIL_G_~6E>yepstK`jtvv}55Lyd@INjL z2)l$i?sC66-Wty*t)5ZEiz~rIne3QFjxYB^Kayr|ysUKhcXjbRz)D4lCCb7dF|2KS zXw@c)oQ($yUM{jRP%%#v68)|>$SLJ0RQTCSPSk9sVfy(%lW8Cx_*v4!xV)gm@M zYK%hz10gQ&f0`O#{I~02VVtjVg#$!=u>O@n7WY2W09s$Y&BNIlvUiY@3+l@r0w<;T zPsJ?IIz-q-Cr#QRH9!X&<+phe18Mb#aj7Fxo;2g1s*AS%91csmAi2>uJD32iVVr1V zF3Va7&GuR@!gjyt0=Ut_M^kLjTJv)^+CDl2<+o;2!4E&^%qIMWy3SzKtUyNRZTyQ2 zw=jaOemvqT4br%EmDt^t(_%>1XQBpLsc>~~#}~&75=u$VhtD=XP1eo&meFes`>r5W zjp|u|5@RO6fXJ9`htqHkM`^2&YK;@QG5aE>i^4UP{DBO6qvlCgK)D0u0de}x# znNZuyW@UlXD~`^EPal(`a9fvV7De^kl?vuQGV5oN^p2gs1Jxi898Z=xMfi*CcTj%% z&O7A`S)eHy+L1An#jh)+H!XbLy7k)hyoPgHe$Ef1vkUZl5Puh2cH_fHkCO6mK`0y- zPuae5zaKvJ3$1qKtJ&UjxzsMn^%qbnyQXipo;v=|zL87oR;En5*#gZ5Ux&iXF?}jF z^9_qDp=ksCNSaHJGz$7cwa)V#%npEQGY5J;H z#RrRJySu!KWXi81t#Zpk>a7n+gqDR9P|;{hOM*=hP{E-Q z6BovI{f+K^NuD>B7B0D@Hu~evYI#^~#ZNYlf8|B6uLKI?}l{ ztZKK_f0gvx65bG`QIqHAUmBB(t~O?JSn_=|wrg*utlmsrYU1|-e5IR@&+uE5i z5S1t)&|(*#^MU;bBV#IwPx5zKX@~EcfKYk`aT^lk00h#mMonW`g=4lfeB~eCb=#8X ze}CA6vR(Rx`e)nf`nXU!ps0b{6w_`ipQ1=e+9C> zrgsKg_X6Q|v-4WuJX-*jTztwPTFC7l%#B`D_OaH)xL&aGic~iHl2zoD)(jd=gZ1}n zGPXZ$LrguyXPaJWetl}`gr0XAzc`V~1n<_s(@B@Rq@dO@j6KW~ zO5F6sxh6l>KsQf7k^gnn!ZN?!lTg3h@TRLo`J!fZp~aPbQ5k(|CqNq`{h^+{t00Dg z-t#T(=T4G_67=k24bnM{(s=7n2|CVr8hzEi>dXFw39JHCS9;24Fbgz+IX?hhplQ0F z@FUBkdfUe;?kfB6i`Ogn&&|-(|8hueJl&YO{tF1yPQgD*BbBpY62)Bn3s}+ND@&Lp z?~FI$<|hs8w7S%vp^!32a4jxS@WAG`Z~Gl<%PNTtb;6pi$lSZzYe$O{TP#cn(@h3K zO5l;F(E7SiG_lp)yY`nSmvCGFEpDU65H_Pl8kVuwdN2Va*f3}zW>#K;TwM5SV?fg; zTF6anCAEhp3UD~5rA%<@rajAG2<5*b5_>(E0af@5uy&7XxMXPu&*e>tMsgwd9hFY+ z<~jwGCDlWM%09qd+}ri_!A!ps^qm-3M1{W2>5D2xJD0`walnWu=yB|@0`rL%wyGj7 z(3va5WQ_zgZfsvHq-rzzZ^%c?UlCvKu8=tC>!U^RnA%RR^Pp$Ma|$3DA^m%JUa>cm zzfP(2Tp+^%ajzD*lEXY?ttb77g`j*4lvJ*o_!^Ne-9Q4-G0&T?hs7=c~;cakK zi;oW<2%9NLgE~=sW@?^`67T;MC6NET7&z@Lk*UX?xt~&N@>ZAfFTmk-Ag|;XtAc=Jk5K0X#x6KK1mYK|LJ}>wU~!!md$TFB+FPrS5VmG-LOi z$N(&HfnqtwZ^lMuHO>OP9OL91ofGX+;+KoQ{|tn#wqjD7?wLd)k8FGKi})<8-v-!vy*87igpexsr% zbtKQYe^~aJ-A#vswDs-VNm&K%>m+f@Ej^@j#f@H=S1D@Z$5n+NdO4DuzW{zSG82mv; zP&mcqx@(;fs^2~%qmI}agwb=M#&3NL0nw%7?d6K)HQqBEFVNKx&thW8&AUFzR3-DK zS=FlN&aYB;-qkKXRwCpw0~)cgK|%bb9{%Vs$nq|dsT6Uka9U7cV9Tdot4NnFSf4vr zJ#{7sX=J&wBo@K!{GD$x{4rtPE^+MXzu4`KgFwi?^tM{JE&TM)_F98``XFMs8aXCN zMvj@W{h-(dHHczMng589TiQWR$@apuCi~=BJOJ#UlnU9Ok`X%A_D)QX8y6HFm}l8$tM+USLF#oqi`OP z$v`|#l0X7wdl`qBjgulVK?+gLPXr2H<*YA>u;iTRyTxMS6Swp#7ax526n?&$%!>J{ zx!++mSYnuA3(80;vr+XdWb)WHsbm->$z>LVqeWIOOrb{FB`2!bP1b32UG>LlFtWx} zfgHz2Q%2Pcl_;~s)7{h)r}soSJeSk(bbV}s$yI^G-=p0aL}d#+%UF$*Z$EFc59!Dz zC$_Bo!|oixp8V-Q8(fWUXMxL4UhB(w;nXXx<5(+5@@VpC!#R`9Ge0-#m6t!y2x-Z= zAg$i|kcOmnfYq(7^}RxZ@-;wJ$o=FfV*y&rT4B0U!C)Ze2l-dLY+E8VXLYRp$iQ!) zR@u*D)IQeuBlsAWj@A4Li1*GlTMr$a@A6pJ5Z^g(AGw1?Pp2d2f1@eJR(57`$@6iY zYZ@?MXPkMB$U^A~idDbIj~TP|`DPkecWg1T{_0P$3Sh_1zoc|xUcPv2E&PCIqZ&GH zCaIV-_|86%B;s=-futNuou_jX<{}sTk;_9EiGB#HGH=QF^9uv06{QNFRL*&Suakb7 z{gxfq;+wJ)vbR)vIv|8SaXJ0-skE6>=D89!AfjPR6T>P+9;ACsxPBfDg2>DS&2?zC zy&=OCG~(&o;Y2f&CI|VlkcfXDl#4sPd$P_RBGqmo)zDS2Hh~nd89J5IHx2y9omOiL?SI;)*KG6#{!|=n8O`vCBU5+HM}eTPV4*FdM!!>1XCsME zbasc0Xnc|)O4#%+QrMFaEzaDxVBip%wHub2;F4B+Gq44C_dY5^31nukV?eqS06CU6 zGU;pxY)IrvMv~WgRDb*e4;)@<;V`pW*a9gT7bc`U4Ixdjw(&pD4$Dmuvh-(Zj`{qQ z^`BXL{igRP_Oi@k16e#X#TO8SB5mXMd-m2M&jx&RtEX~YYD!9PXO0MYn8?+SND{v7 z>zdlfWVy5n6y*d;(>9Lk2YT^pQ|%+59VCfxmn~(1^da;>Pyc{%i{w%ZCepUXfSw| z$aiZ4Q`*8_#5?o)JpE0XQbP~Jm>+6zXi_{-+dAWI-uFf-0(1w>8RlS`pi-UyhxC`akq5)oItpm1d@wlSalQnrnagb z)O%Ne7Vz~yJjKBOo#XY-n-r!Z+#{wOT7TFsDDAE92zDK1dr75%Vz0Hv<^j>tsj94r zNrnyVioCGti80mAgy*v_JQ8e@y=HJ8ggMjPkp_pJzJ_Sb`8aCITMa$Dr6l#S6b7Ag z{XqzyFd0bj+xJUYHN_8}GHkcEGCsbOi<~WYD{RM8pH2%?9u|A zqpZ3}CDv`TAlf=M>Y7vi79OgiK~A7lT4LmqC@FHW{fS?b+ONS53TT*s&r<8=P&uIIMJleXBGelHUWqnnOFzQ*dHEKb==4*&lUdrhn)l zbQUy!_@ZQVv$X<{;zBg81nbGG0|-fie(m~ML(Mo$EiF6axrMD{>0*P0sG^r~Ef7Ll zSX4$FS*%VphQcMJwxm1B)F0EKwFIEmJr2m4P33`Sd@3WUrg)3|Vp0bsu{~kstfzTv z5dW`v&88QzW}sPmdFy+oEfv;J`Tbxm$AFok4Q+Sh9vSmVX;;Ir`ug+GNc;4BWcL%HEK(4cxi<&V;4H31o-oBTsBR))+}+B|77N#DIlJ#gV7H} zCllUH1yp>-!ErsFeSq**kv0`~!dH`x4K5zX^LcO;BNmDjWX}Uoisd`{Ho`9Rm#HQ- z@?`e0PD?KdkGPqaNUjyVgHgVIVvP6}d%xdjoyHM~HOe8PGjyx7A3T#>vt5i(46)i8 zd?9Qa?Lv=NxcYgg%wcB%4rKFYAs|ierJ>M*NS`J>gQ>kO&u~KW} zPm&%!#09mogXSN@9l>Q5db6;Dz|G-aZ<(=$B4E-BH>%C)c$iguPc>xb6O~OlWnS=+ zYSP3n8v)st=b|7uODY!3{ZP#Lt<-f@yW#sizYe?YCbbR}x8di-VB8z0^gFlnV&(`M z>##h38fng2_95h%&M35@aO#@=h7}jRvt^)t!SoM;RC(=lb32>_qF3=Pzp-@ofJa7*}zVHh@B$6#4o=FT8Fhc{c9N+ldm2q)u$@ zxIHk*mZwYjhtvJ=EkqtM%mVP?F92#1^;J-;IH&kMMePf#1+)2EcE#6mWAjl<{YSE$ zHRN0uQ;pwspe6BRIZRcg^Xikknr-%uwJ}RI#16PpiaU+csB!PV1sM8$Fhhx2ESKgb zhKF|CjPWl?cr}w7CSCMGXTB(lgJ{rgg)N@Vn7|vei!D0(yMfJ)5u^1?Kk(>TnJ@%^ zAxBy4rD^2qj9Fm?3Rp%B6K<%{O~vlGgYa3AT+EL@mR)ZPL^-Af(uo2IP%@6Hw#(GC zvE7m4GwKbrVlOcr-s;VDp00=O^8A;62~t!4H#53~mbLG0KF(#(BY79azW^6K z{AK-%K=RsBqF9|pO&9`JH>77RE;6z)Qs`8qVM?#TJ)4xA(M6&XfgBxHl+QoO;1r7L z&9<(q4mkvCzov`=_{rd>lt>*~Lg1eNhpP8*WV>zqhi$c6HEL57394$Z+9P&EY^o@U zy|>zG&!9H7VpFlHJ!{8`QJY#tjiT-Sx}N8`djH;kA^D!?d3@IK>9}Cc_oueoFy+(9 zu;ej6NHw2fu&`I)up!o7)x(DF$le)B%WG=I6eBc;ug@t3?0btq?Zz|mL#mfjkk{xiDV=HbI2k97I>gKp=Q zCifeUpj;iH@)smT&7m74S`wE-pbTueH}OV3Z)u9|vo{L7TUi~yB(R~VI|h4In;{$D zug=rOayJ7c{G1$*n-7kSt!IbV7n0&ab`g2fmt%K!jo-Gpt3lY-SJeI+?h%x=FK9@B ztY0s2XzGK1?BDGHx{@l6Mlz!fX*9hB&d+(<#K_c-% z|Jo>Qs=zPqW+99d3*TSphSN#n2Gq`Bd#&HSVIoV4=Q<=0-W4RY+B1JtXW@C$O+&s_ z(R{dygR3DW;ZHpMm+Ja&cdgcq+V+zbirEwVmpSiFb4Dwm zCyqc%ngd{F#t>c>6*`T-TR8$(6iC)b~LiQ$2Dr{PnoX*=tgOOojzda6-L zwYN44=1ynS)kozIX%l`jX}-y6B8X~lEBQpwuu?NEgc?1zcU+87?iJ{`B@VxhlxmEt zutp0Y9&NJEbI%WY92tm$K%r^1ywjfuUpf~x&;dD3dA$Y^_ErE;UEWq1!U%V)cV;M5 z6Ubj00#_i}=B#nr$nmaJMU~XJT|_g_r)Te!#Q!{uvqr;+q!+dqW4S@gjsO)MKmF;( zM+k-Sht)6Ho7sp`W)-W-(tn;4Go{JYLy6niz`TYKqW81*K)s+-CQ4;EIc)@O%N+hX z9X6-4;G@*Mu$J?RzNQGWfsb=gWk)HrR0K{T+O{T$@TjtgW$mP+9lnyE`swn}5BcAR z2+<{cA}ZRUVE-i5BE2cgRAj4U4hW~afn^Ck& zIr7nqX^*~B`g>Hx&k5W-Cpa&CYuAB%*#;A7HfyzbZ*K)+V~Co@MNYW*`3AsScI?D9 zbe6*YoX8J(m0ykhsmk?iW*cP7pC}|`XmCZ}T5oTSiB-mh1x8e9cm)^FI=W`ts0DEL zKQEO3{Xn<^gI(7s)G`fVw{KdcZ>@Yo$4U6({tJIqJA)LV3EdL|ZhjQp5Oc7;Nw~Cw zh#NX-@Fbb|U^OycS0Z)c5sTSVNn5sfzl#zI1d24D4_TF^MSifO3d`F>ijX0+w!93+ z92=?{3n&Zx$q~G-@R`^ydWR2V`U4;JM$w17i0DKL)93o`$zzfVV&BMTX-W5&uyM23 zKqD$AajiAU9Pw%AHavmh7KJqb!CL%yS_z?=|G&ZDACtrGWTMW`GxGE4X6Nn84$}W% z{r1=A7b1d6&4QLR$!v}1I-et}ILJ_AF$SaB zMVmJ(#~<53v)49o(c-$FI&q!LXE~uV3BbYb-PVC6e4o>&_=#W@AK?nrPL@WqNitL9 zL+A`87Ky>om*0rlnTt}@@%|m~k`YN=9V%N}xo)L&d8gwMXIWZkjuqbhUsMY7l4@OI z^UQYQbJt(nvDDaCP54zX^YxELaol_Z!$t;Wn?~ZelHx*NYzJ&iZhOFV^ z+>@oCq>_j^t$jca&B%6p8NpW-ckvIGAD{tPS#32pEn)wvLwNttG+Q=Al-4zLl~0}; zbn}M3IvK3~cHf!k3eQL6e#(DHco@V!=K}lp~fAJhkH^%Bq)D6ZW0t6`09Fto^?o=xbWkWK;_&GZrLn+r1>KK* z_;{K?4UIVTM{%CriTZNtVNAl@Ru1hns`ZKg;wybsVu%=~FtBvAu1IA`k2ppD6Db}RRL-V8qqo$9I^f=VR0XBhOm4s!@8F31lffy z`Jz6z+g%=-MGi2!5;606zOf_4_ftaCw9q{5PYdM~A%3X*K+kCnm!@qbn1H z#wbkkV_4^c5NLk2k|rZ?Oe2cp$*z?uyRUUvT|R&3pV8hSBg0~sDjvPI%~AHJUWrz~Nk!W#e-@U@Eda4OH{Nk&@mbqu|3v~+^&}=b$+u+`d zDq_%RJf(a{eCPQss|)RoFMp)ORs+u^VZH1rj{{uY0v;}(kY&%TgX>=IK$?WN++YC? zlG!kx;nC2h8~SE~(2FE-laK%K4UUli4p(kbgQmb=7Sw(Vdm(I(itBMSJ0z+%ToH7Q z_^jK<+Ao?T*K+0CJVy!_TB_^ri#F1Nw+D(Jg8Zz|G3Cj<4e9>VP!CWD{)?&fl$J1l z#~<81`~KFc*9$ndBSNK=TPuEBho`0=?$_CTw}`oO8j)}uk9JLKB2}`{Dlw7Mk?xYo z*R5#ONG@I+`h3(uZU-Z5tNCoFX;Ga8i6n6rb$p$tS7zstw?X&>d=-{oPQGnmZ5JTd zM*SpjxX!;yuc-RCJLfJ@YHhVe6)RL`GRoOJ&6=Za9DnwO*c=aYJuG^@q@D&$c^>>k zK7>>HR3#uFNVq~y4*s4A4FN0_*Me6bWygT?eho>ZvGcYTCXn}qYsTu!Pl_P**+R?y zJdQKeBi+CW?*NtF63Bs(*)C0$wxX9_tSJhodhg4{&p>^9vxwy4RHXp5xFt61i#XEt z>G|(AMBE!Dxv;@B@DkInUjy>;YDGnxNJL|ssS#Epn|U2Jf)#5Vxy2&P#Mbu`AE}z| zsa$xqBcWrWmy-?cT_cd)aqC%KaDhs^CVSyhAyrfHSH6UwY1;iaLd@^^^V|~Q+M|WE z^8TU|!tAs5+cq!aVdFQ46h8Ps7H_mfbox_~lD4vxG)^W^f*#Gz~$<|rle z$kl6!St{BkzKi315y)b2YoTU^rO3~EZ+Kqwxn^z(ybFdO}A4hJ~H*is8f0`SofRc-ry~t|dGc(hg$>1&iEVq@t3TLt7`( zPP#z1h6UCyj*mX`pL0e&=H=6p2n%Ny`+0GJjABaP4p70a6o!@8qhu0DhkcuD32@G9 zMxYXu($erjtPOL- zDDkzGoH#HSEQHpiLnoJPnA{$U!MdL=_Ue1i!C4&25hXc1VeP<=zy8%Q)&4R{hCw>- zd0JfFjP|fvL6mhS|L{D&gMY|wZLCT}6biHix~3PrL0JC>OK6@8mg56$iFoH6MZe1~ zwV2qJ7IND?Zvfkcq0GBMXZ&Z+dh4ifP9^VdhQ2~k=bsSv9@k60t+kg=DUDi&Fccq{ z;5{!+8eeLH`Y%dWECeAZ#O)NIif$2e?IVIk)$xe3HRa7duCpUzF)hP-lYqEzsc zlmTGcy#<*;wH&Q>A=L0m99>1}r0F!86f}D63Q6fmb_w6;(N(KesP={bfSEY8h&%0e z?)ZSlvL5k}HM=*TJQg`*6@`m$!Zm=8wseW{+>WYwEy6Amp6yU&a)c_W;A z@0|!caSP76$k|U?J+JeXX0dyU5c;!P`y>P7m9w`goSmV={0h=kISGZYmJMy}Qgol) z;x_ykB%=a_DV>fLJ7?|kS2^pp%is};@5e=uRkCj1JGbmP+C*CK#;VAvI1liX(@}4M z_sekwOdJXc3yHpkhb(Vop{nt0TvpDth^uBcF|7&xEx-)2`S)T>g8qSvldI-5JAMni z`ZbyM>h^Q}yU1bfV+ygHV^HF>5p&c;MGzB0?5hFjH_dbu_)zNy!$}IhdT^6)IO0VV z^>wBK9Hh$5af9|+>@k)_9n&ygN@Nb(D9I>hCCql~VW{0T2)577Z2FU=Hwi)5N>H<< zfT8?jPFNf!CdDg>5S%*GStnS_%erI9EQ-8vC6w=fhgWy;h4J-zy5#RU#g>v?3`ud$ zzaJww=3iA(eTV%mV*)NFGdIEbQph!IH!#5h6dwEtu~DbQZ)J|rW(zNPjmLFD9cRs- zs#b;6COf_j1($Y~6@2F0KO2itSN+=Pm$iEdRpXFVeh%a>55`AA##A0RZdTJrZljUp z!@A%C{Gb}CsAMJy-Mahoi*F1;V*>XJsw=chetxcPoVzsm=J)8rWP~vNR$KlR_BZ1{ zv%kJR9MS~N7Q17VxQA$4di=JaNX?neSy%Qxm8VkBD8-PKe6Xeke<3EUb*!vtx>*Cm zG#7#ke?(N0U`#Og`T`(5xphTcSS!+o|1m+pL_ zo#eQjTy+-|JkQ5K)&sC?Y{!w^72FiS`sr~bw+|m$1hW5X1z?xke&Upz@MHQ&I9kL@ z%9|qTP29V(Sh>pNgcWkQcJJbcWcUF@-zo|QrU<1)P`q5G=IaaY#A^)@e)O%jBb@Jv z9S*U!8(bP~^Hc)$&B5t$N-7bYAz!kM#TUT*wv(9iPMK!&pCQvk_rJLEL)WV}R{fIK zv~Nnv^j?R~FoH&}QJtGq$^_)cTTFf&jF;V$oF~RYJN@}em6}3|5#{R$O8MX+zbay& zoCwsUQFc>*W|hD^vB{LCU)i@Z6CD^=*w|EvXsPuGLn+{jvnH$?jKkibUxBZM%kcJg z{gYZF!$xbv-ffb2UFS5zxK1carW@-<+$4k75!752sz0=~wwTDgq_l~jirjo=|Ne(~ z@S7QHQzL@4)#p8$h7XrZNxbhTv=Y@*W{BX~scL8O!|`s2pzt&tk&Fphouw{ivj4@` z4!^l~`&*ldb;()}c>Sq-WMX9VfZqw6QtY28otUwtFUhn3f41-e45v8(Bt%2!nEkZ~ zsqW7Z)(u6;w=nalMGPcoR5Gg}F9qR&#wb&jZP1j6jLwbl@Bnsp0P0rEf4nYU8FH1F zE{ON&a%hs(RsC>kpDLg7?h|N`VjMYc7%QM zSz|wz6Kyc&TjF2N4*DGO|6KzKn9@s(fPBtV?fh8R>X#s+(#%0?;d=9&^YPdKf9zaV z&`Xz@CL3gN_0{~eRI@bp5PW|KIjagQaod?ur_ml;wIY%-nt?VEW!^bD85yyCTKSF0 zgR#2ajlIoMD@*vRInY)7O|MMpW0<3pZy$7A&_?bpO=S3|fuuW#G)c{UrGi*+1rjMQ%wYf3Eu@Zj6H-dfBZ6R z_Z{R-K2%>B*0bZzX~SLleTbL`{6JU|J_i3lj{3ZxT(!AApZh~dsq2V*qfGU zku@a)d`5ckKoeQqvacptZ1%DoC*oVgtw#-afNziT)&1v-!%3|luXSu#k!aQYd9uCe z$v0{6vfO-oJP-K*)?fL6V;lPr@~UifdQ*7OxM)FmTUmwJmLx1IQGe8=0?n;P#G?Mi z>Y#Fc=77o8N7p6B;JAiHi; zOPM|k)y^X+pFmUMo4!m294;9hX#M#{%DimtX*~)x2##NWWwQHKjUAksn&= zc`g-MQYFq=3Xa>WNDVvulM6>az1;Cp7o`uBv@-Ra z33j36n;r&I=_o{(=x^}1l^9y?7*E5aX+ZflJB7?wzq}9k?heF=gE)zSSZ9^Xk86b( z^o)$DGD?rZ382|@fp?y^NvWgRhYjCE|K2+Kt`^eD6wH*S?+a7 z+OL;qC0*nPB#2{ZX{kys$x^KLLo9JF_E%puEw>Y3%;C{d! z#^o+b(4N^Q#!U1*iGP)+S9q-SuA+Ku%&(by6QBF+aH4Jk%3UPPx&}8SexOD-J7vAd z^Fv@v?&FBR3=dLCl5 zskFrrTkHj%O{vyVA7ICx%X9N)NkDT1%0lUwxU(upOz$e!St)7CUvg$J?yw?|vLP`U zQhXeI1NA;xvEDQDW(@G@fOJP1yY$OpH%t7vMvTrkvSLS7U97TN)7(Cx#PVqJ?ll@S z~DnXqp!mrXr}14?*@tgU%eD&DIOu6Vy94@U0=r8P2Blzl%nSK&=+ zYUkA+Ao&vL=>2BTj_i&>lPZc*|K>}6DNZn}RjCXM{oV+#C3-euZl?8IKzs#3(J|pg z&+rB(#Z*;hQi+lhtib6+4fnAjr3^ufIcwc)aApwifN@pocz!PIYq?MJ>xuKRxe%T%fV}%wjdqOEFV7OFzr2@jj{-t@ ztNMd}&TMn?DS2Le$MOKZ#M~D#*zr-CI&^_Bl64oUGeJZkf=Xd^}KZDhe=Kw7(g5^KxVYTfKoKHF;_91V2#RbUr7^B@T=LP zBgehV(+0D(%d{{DGc}!$BAtmgJ-Vjdt!^HjA&voc)bCt*mZZC(PzlM)jv!uBsYlkz zN$3nyaIS+`s2`8`buf#;D%A1o==|^%BV|+SPwZL253tLwQ}VjBG?6NHNk8tu%)82W zOIdCWKZ7Z${Q62Z-iyYwd;1C|WA7F5hL=dz&(`+){h?OW;OAf-<1egQ-RFTJZW=L{ ze1n5$BpO8g4OHZE*owIMFXHqwOMaxhv;^e3O^=hlM5*J7G3OH}m1wu!L|#>BPUf9@acI^@R z1y(!_5~Ggpj}XNX183I2cr+e15-cR-0wwc7xs&)Nw#$4I<>`$0?9IkudBn>^TnJmY z`T0%CRRbH(4aabMEk$32Op)#1`uoQHUd8F1j~wqEmI%^Y`b;~3`6J@flZ5d1qkO9% zXz~=GiVU}HlKWCeeVKsa;B{A2YS;o!>4J^ho}JRBdb(G5LIRi z`m-@s!)HIdH>t+@(le?DmSJhCl5XIfKS#uv-6&hz2-^_;|XQ_J8c0HCwu~E3^`QGsR4|G`-GZ*APZ+UF2;Nno5h5qb50MH+A~hU&Z*dCr5xWDjmoc=M4{D7up?~OWD`#$UMjqQbZY!tVIZC8} z8Y0#oDoZs0jy3#c*_^(e-<&r+8uO16XkO$dw$KTPx7x1#NC)hx^ay*5u~;iOIF}%#vdPRGfkt1t2+kV7(Q22fOVX#rcjhE!~`R%v1@=2(W<*A z-hjt0vrTu3yT9X6$VqpFC77&GQvH>s8@C`rFB_zmSSTOLeX4xP{Y%Rlf^ z&mq=ARzRR?KKGGFSBFk?K*@c0e!%*-&k^ADiBL_V*4{R6XU_@knltSOjF(am8A32H zelD?KQ(5&D4))!E2^Ht0P~$PL?FaMw+`N-1KRU}v&)aT>uJya1NC6|&*4jjn@NSt0 z$3tIz0-?q#*G&mLGwDh;Gq&&&T0@>dOTr?9rTdgGs{R93ZTh@Qlb${83kgOa^~|Qx z9IOiiD=@)m{~f0_cC^%Rgy*VoE%seAa9S%05XN~_12Wn}60vi1K7B#l33IaXD9Z;(&%2j=ItmY|ET z@J>*fI&3O1_s{5$rSTn<|};Zuwkx403b>N*~*1k3Rhei=x_?j9v|yyel}~ ztDt6D(#gZ)ot1MJ%)QPvg}p0v$c7`DdeABn4_V{yOOoVXoz*fqd0}RHQN197u&uis z1n~2vetD(6s?hHWcy{ikLROa=Ud(E}w~BiQBy#buszpW=2IG7bJl11LL8-7tQ73`g z!oX~B)*O6R)am&#^Gnee9{2JOH5K0DMqknt?8!XW#CX3asw2kPrMxbzGm{c}eRsEE zAf+}_VN)6=9w=JHDkr=pE-XWogLIvFvGZUB`6UFlP0qo~1Y)my=z_X0aJWvI9W~NAvK1eyT{02u z@?WpuGTmr6r;7^~$k%X^J_F;-Sr(sne8_$VR@W5Ca}uQ9F`qu_BqjM$@1ozs+Yh_u z_{~&Zu)Xg2^G)Z7{E?wid?oeTTv3aOTbrUf+3KZ8Q8L3CK1jjQcu801H<%G-#T?As z56uk01ul2gl>fD1!2g}H|A|y9jelox=9BU@u?gDy@=!}gavKVZ#)k(R8c$Q@*{SM7 zzQk2i@*+ypR)%2|!yd=oJiClm2e*fKe^i(XT~TC zgjeKq8q+H%?TJze+ZBXpb@~;BL|D#llEJ(R6TlD?pYPzB9p|RdqsYh3Zg;Hra>#M$WTv{VN*raQMI6r_~Ovt~TD0HRHRl5a-_` z{K)*1$~QDSlRhckIxF~ZTnxm3D=?k39I?f!l*Wqv+J#*ed#T*7fi{xqiwpsk?iorY zMkIHKW59X_S>i3n4n8Fw-9xZFVvE?sAsr$Z8u|kL$e=N_)KtDE=?-LR1S4c0=>>e@ zP3g4CUaf!LwRPOqh-jKXBA8Rrvr%E~LV(wk|+v^WF8zO49>que2(_m!^q zR+R&|`hT-S_O+Cl%bnkxTrTbEY=IJ?=M6x6d?Dkpmwh34)I)8CAzBs9Jx6L=IMt2T2e&21W+E(7&%>Y4B`MK)htisRPEbD0 z_}Jd{LzTpGgcj$c6xDsuFy8Mz7DvOW2PNk3*U!y&9}u8_x5Dde+gmd{j= zyoocib(Z^|EoBHhiA1h2pA0dqwtiYDc;%`4jL0w+-_r7Zo5guwoU7$if9#^By!2Vu zUK7XCG%ATuEwygCKc1F$XPnf%ZP=}q0yS6jrE?;41E>tsgj@0CnZ@1*P#Qsh4?2Q2 zw+ zLFK_^ihO~aw-$`D)114Ispn%DM4*E{>$ z=m5j#>|a{8#-;9>U@IvF^(;Yi_jh{|NfOC>MiHrq&cbC`Z@_mO^92Uuxs_lTD}Ll0 zICwW(FEjm)?9*dCKFbA(aC}?lKtkg!5Toki+z3Axaf0V~RE`7E1k`iy?h4rlE|KI$ zxpk$M$}-S=*MDfQBh#nZAW#I|-U*KjCaxnq82~Sl&_aah4LYU0;sLuWks@`s7;g4b zMzCKQ3k%>fk=$*8I^b63{o;}Fdkr4J)xdE9wis^R=;`O+2Lw>?#uDeE9f-uNK5x@LMqv%yO$Q8$HM zDeID}nTF~pj%`LOyw~@;LHXG&UZJm=;LNd1PbJT%EXU(Evz~A|{C=7r0l&{>7MdcS zDd)!IO6if0UMREUG!FY$qy-6Yy!tXkEV-~kyNs}R?5z*((gi)9D!;1iK@l=mPNXG$ zwsVb*TUT^@7|!eclQ>&#yS(L=ul=9V6;=8F;A@*Lw>^I6_p4eNPBmXN2sRWQ5i06$ zB=9_*r>79D;pBp^87WQK@14{sV8#REbr|#OIw1q9t>W^qSs^=Yvk{bFom`0fYlY0> zy9$mgV(n6L30vw|Jr7lqY~=Z87h-h@h)IAPU9;@BY4H*E!}DX)#Z@+%6WT1O&y3FP zwJwjIJduf09V57Nsw4!RJX^b9F41kFM}iB#1M;*M_8u6T51DXE2L@4jH1WXgib|Ve zGbVKK2&`+^o)o^bcmLngqnRZ$!`(3E$MnZ&V$EY$&E`` z2$j7QJFijHbT?&$2$S*0kGJ)VF4!mq0Zxl?^cFo2q~bm8k}U&Z>=CZB(BTF9K05^d z0=l@Ijh#pK+Z@QC8|%dxa*3U>JmraCW$Ih6fp>7mq(;tD5n2f+!l|3fZsd!h&j9|w z(@L9`QX2H|1XdH;tIG2U`zbO-wyuD}CWT*J{)kbS+ebWC#h(k_fc?S|Z)?hPa@qI| zM;ub6_u$oEo(l^6|2xD!C+-xx-Y?nQI}alKwH-759B7S;RSkcSC^d#`cFy<(0Gc)t zHSOSRn*p7i#omM?YnBK-?g{@YiF7AcBz3JeoKHE*ux^=CJAD&$qshg=5!8@)kQgnT zo-dXChSogxZDQZ-P@D0{j*33z2CPHL>(I%>!I`fm$_*!2T2@Boq=F;jEZAJ2U8l2# zs<$D`5%bo>9Kv9t?s}CL(wf`CHKHk=csBJ^i0 zh0&Bhy;Y%Aqkh$ZK(q7bc~M7ce%ue6W(Kep6@udukA+=d%n1hT(P1YBuM97Ex6V=; z!H6W~nDnm}s^bTWTNT(0g=6bD2=u6Hz-W<67PVJb5DYLv3}bqr7igK>yM|@^%f8}2 zSl6Z?^a_5N(+YpeU(n6*FX*oL%8h~45E+IlYyYn+4VisXS$H>=N7|S4@uVPY)EF8n z-}037G)a%i+SlW|(YB>I4qt#IrMu6rz`5E5QzgUVccm_}%AGX60sk@Pyjwug1G8sI zHRHw#)iz{Y-aoPpjPc);HwWxF`!i2f=cyX#LK~9`KpCSqsC%c9-`hmRorx#vV!608@^Il;i993wDv+P8g7>MwYu2?TqHw)65TtGfI_{$!maHAh#oK5bFArpf( zc*_HPN2|MijRVu^g3h3{O*|3dSgI_ZJ`kL`;ihPTFB#M6GhT_&m4$YEB2C{C=Fafb zi$RL|M-SqbJms(ig)q*lCV3wvW^;9-f`NFGi1z$#%288IOYGeq41V8YWVm2snq)xA(NLEl_H1HA_I? z+5{c1S#|@Toqq0j#utkwa}hfE974I>@F2?FeTf;sg=^=It-|#LFKe8+R5X_G%s*uYoAR3w9Y2&wGKrHixXubu%UAkK=jm0hOXK&OUkzTSRTaX-yQOFKTh<`vvW8I!34|>Xg^X(u$k9aEEHBg`8xUL9Ciib{ z0z&&&xX0a*37i)rDT7XpNQ^#V-#Bsy#LJZ?#JgPXZEzC@i zy5F&udf;w;rT;m?_l?Q5VYLtf_#@`m8sRi^Y3p~%WyKnMqt>6$*s3LRX;#4$o%vll zb0T6FU)xRWyF+Zw-GzDi9tK>TmeU&nbcu4O3T10>NdcyAT}3aB`M2u*kAqd+cA8zqmmpDFOa&9i08;bJf^4 z(dlW0aN?d<_jc$^-W@x87e^3bAZ@-l8#>_l<=j#PQ%AayF&N)kTeqSmf$R-7(ynpopw3K7 zXP&{f?LEA}JWpjtf%ex9V`(REb0d6b1+C;mnhvONpEp$TC^%1@5D;Pct>;VWzZMx3 zY}5fnDT;c`+AKAP1V?;#rLZxPCs*4KVxgaX!Y2x{Tz9LmIRjt!OOAKCZHUtMIb|O| zay;VT8FG^~GM-dOdJz(`{KZK|9l3H`@%&xPA)8IMR@&#YtZA9KqSa{n&9S%=-pQ0F z6r73?RIMqG6LKGnHox`~E>j~yx4ZlE+d}4i1diD6rFrv8>NESky(eN;UV@%Z(OE|{ zY^7EUB>wgp_)TC{Bi9QqdlT31_{ZI>mrV8^$Kh!ByVC(JRjG61sT5&Ce$q6 z;aXRc4TBJe(2k}Rovg0fxp`1=6k8IeLomux(M)81gTjSS<+TIRinXZYc#)YU9uupg zz}4c%mwt0O8%9qWN)t?r)uw)NHMTQL-qRDB%47D9PfSAkO_(`tWzL8_ikb5cz*3cZ z1k<4ZV1*tS{2fR1{$=9+rxK{O@I3T~-X@j9Aa&Wg_fPSs4Wj}5)RkJ=*!FN!A}~%4 zF?-pv&Rfvb0lp3M}KX(!xc0PsAAigQcCn-4&`;v;UgHrNQU= z`X|M>g;@4RlV>($sJ=hREZ#G~pEUGqhkP2geEsdn@Pt%d5Vb~@W-TeKXT!rIP%h=$ zmxkAk)`5O!c?arM0gneh!G`t3T-|(DtB<)bTW!iq2O|J5(I3q~Ki}8bvz_pa((Y3! z-beRV6NMXo4kjmEo|lO{7k|EA5_@m_h%nF;E8{n4mtXIEl9rwehL)L0gU*SLw}Bpy z$bb*TINu!5*EUHGdsFmnf9epWImqRR58hyf6k|8m!*Wcui}olIev|&mI>U-rqqbI_ z6WM(m@fxq`hoQ}sv>PQRao}w$CRm~8(zpc`BOgQWm?p+3sbUdT?av{9i2y8l-#QFN@P8_3mQsejSRNdPT{G2`x~$aZ9sh6K95^JEpoq+o)aP zo4U`#aYU4LewSB0#t0ohglr61yV5$*}`1yjJ{ zRWIHMpnIQC5r)b0V#h2&APAE=O#%5cMHu1I{L>x{z4)LL!;E{v=u;F}OZ@OuY4^36u%IsrMI&5Wn5yvQ)`Z4LC($EB~#ghi7brkl{{W|s+()=lcpW%rO`WMoQ? zs=N4Nc*2tO?KZZB{BIp=8Qw7F*f5&3$yZ@Cpdn-21PO0&Pdw7GMr>J|^QlyTlb#cK z1Yjsr_{cbY7`J!#pfD&!kK~4APwQvTG^5HwMj%@NjHZ>WYwID4?yvsbFyfKlV3*oR zGF=LNt8Ly4oKydRg||+LygEc5QjM5;2mb(DBInxB!%n|(+%puB z#G;6JbCCMI6xE&RG-jYQ;}o>l7<2iXCim+UntK{DmO#fT8G{xm&e^8l{1)w=Sah4K zk}lYe+f(h7@buI`&E7kf^w%K_CP*oL)UjslVf*U>(0 z5mAuu6R6LM4VZ?1E3HW`DBQJh1rEmllC)^;v~MMn8@Cf+!O}}p{lt)myU;+*W9oyd_p=!I(s&nDxEGDd2+_^HI3Uv!(JGANfB-e zhtMg$j{k@bX}PZXl_kbu8#%4$derdkHg4*(fBaXGMvM3^ma@||4*&Sk)AzH^xA=wg&oOb{e10A^U~<6~-abU@8CLGMnQb+{uYJF` zc`Y@Ev$5QdI%wT~RVM6Mi)}Y*j_1TLWlAq<)HicoCJC+VaI~l>@Jc zo+Q2v@d%}6;Dp3TD;ZqTy~%Khbqm#sn4Yq9qx|rRDgueh z_pS5i@Y@o;lCZ$x&`rcONt-0ve0#s3IX=9a1UL}JrkdV1| z7K6bp2>oC??(v2`w^*L3_ybFsQ=Jo)!5Z5NG$SL;-ajr)V|2z}1l9U#3l^DqCS66M zJM&fip{Wu6QFYMhBF7I(LhG^{sgDIcs~w~@ojVS(C-~teI-uS(Y^Xtx|KdLaIl{phUe^ z0bD_%NiJFv%)3!?G-*UyW(WQOv^0*^DNF@Zzk`5eXP-6tG&@^b+Kvt@oBkN zF3!Crtx{S(8cHs`;wi0UJ%3S4qj|c#X=@YK`bYeSP@Dc%KdbB^JS ztNc{#1=W;`^b<};)Dz)gQ#>1!2Av$d6!#pD;mv{4=b1w*{9kV8zimElKe;#SiOdDi zcNwx|+q6CtXpskJC5>3@F3hqPs?e$7J!)@}wjUAtZpn9Hrpe<}`fPN9xOMFph3hL> zn1A5ON-@05{I$3suQKJzdvOeSO4c|$&N{TwN>U9&Xnf_A{gR&f%k6^mLCdsfu2jmC zuR9+@eO}G(HoS`X!>G~m?dSOxrr2aj@#9mEW>B`tM_(Sk?L7{5tl$@MH>4N0rYs`_ z6$_G8@Nl<>np?QrO}D~LU;UehKdlwKl7pxbX)Rv+)0e!}evzz58*S+U7{SBXyxht1P#&r?pDNsnY@VyhjRddqb!0kcL0EoThOh_iPV; zr6TL!E9-xCC6+X%-T>LiP(pP)e5W6Oz$);`=YV}*QO$)yh#T2-E+b}KX{&8z_CmVb)VxU5hCi~$Qx(5EB0lCos@_Z-f5Xj+ zvz2)B*R!|6t*Rtg5uQJ)j+5$U(3WQmEdaZ#>;R$~Q#K_>1c-!Y8VUZYmpd_4wa z_Q}kEZ10`n3%1W6FP$9;kE;BVcTnZkj2fY%>f>T1mSUq?etuA072*^=(;`XX%t(ip z3O#j6?~rM(nQA*iY@ey;B&>%EkZZD^1gMAF6Kz%Zk^O`sXn`7?vC*}G%HQAozaG!3 zUq#^w#D=FY|AQ5%`}vxqtwxJF`Ml9tgWLU4&UJa?bMvN`5%;#w`~cFemg?k)i4Trm znIIVlTOPI5mE!B_bv@|gl-iM|?yM!a!UKaIwQ(ru!f+V6Af%Zjc}yk;BQM@_lg3m} zzZm>xx~dUBP?_TRg8BZtOIW3j2`kd0PoXvupik(r!_K)JD)F0c1epKcoy$AK$0wH5 zu7zI?_|UK~r1!T(krP_Ye^TphjRI=73|SkJw!zQ@4Wen zJ3Ah?hbBS$Mx{_8Y8GFD&JA4%Q zE%r&PKlO`&ULjwgYCLC`LU0+ep}3a&>30kMS@|KG3yQnaG|$#%CSe~xf=jlaV_=PZ_kS*F2-*%s4EF)zqv*`F)+vK`8i#8c{D*3W4-=a@b1X zWkB19d=1~a`hkK-BGRN7z+|!Kcwc06s~qeE}PcI4M?A zDz-dl#F{!^#86+uGluD?IcXIHr=hA%W=)YTS zRc|!%^%(IRcu1p&QPz-Pe~L|aiL45XwoYeY=2>srDAYxnXx#Rw4Qs=%@s?eJnP{>D z`;vwJbRDqWS(>3BMKti@rxO1riu0}G%^dALZ=w^yf;8^hc;oJ_!QI{6C6IjV{l0rY&-v<9ouB7t zudbS_YxP`X&N;@o@5?5!W)}N-2T1|Y$cQ9BCLtoI6_fJaozJA}yIa7-z$OO*?`#x0 zbdFvpFZ4w!eHc8|ntKz19eWF6(y=brY$G&@lIg<`P1M%?-Yil%17$E0kr36sEMsZ| zOnS$!;6jCjdwmx><%j(g2gVWsjrqawrE|`XHpe+3)9Ei+SHPPwXD^Em6`G(Ib1$U2 z_7_vS+1~8`yo*WgjOP8JKR@XRI;^eL2~>%llwNx8q7ctcL&x?YF>jyd zMBSPwpeb%PIZ+iNQ0a-tk^l-SLp$wX} zhGR2dPx-0cHfzF?g3H%udQui%kHB{jFX`v9*7qxG{sBs;OmHe|wbSA#ZE{jQx_cgvNY6 z{uQ-Q^cH~WXcyV|PSYdlFpXe@X8%NU5=d-S$iQ?>uBnK*S(@C86iFB-r^;31`|9kX zNPeoTm zH0WSd)lTd!OA9IDM<^kVM>=5f!~Z~lAg~-lq^)Wo+@ZYbxRa8viiS}#hL%(ZT&pgo z{tT6Hzw>WGyz}%1cD+k>^V|IWBO(`wcV=eoMC$=}w-33-esqn@CRu5Nd&dE1tyA{Mi) z$|KDNrcZh+L?r$y3#w*n4(F@iG&^r2G{OPr*lm!@P%2LcA#BSbW)Ny#>P+?YjIuf! z@ev+A-=4VrA#+FsOA@He-UZDR>-1|GrhF+EQkJQarS5kN1-ab;RGPxhV##>c=4=M4 zf@oPeE4b3I#u{I?+V$;+ei2blNB4Io*Ty%dh1HA6kg+IlWh5havuCgr^Mm-azOSx#ycc#-W| zeKqD8$Z@54r1cF$-#eWKls}kupyCOcifWgb*o^t7*{q7pSjtBh*=OkkTGN#SVP-Eb zoGtxjSm1D$vmk-jyOST#8B%=nikN`WWK5j~Sl>bb0jnISO2}qynnm$gw$`4W4RH6) zFw9?p%o10NrD>fOvyFg3y@GJ1b?5oWVlf}l!w7e~TLYD7$wi9TSfENk51B$fNz#=4 zSKXx~9Rq=IT}1>Ykw-dVcxo5G~WJI za^a#U-m%V>uXdn%6$?~U6gZkIaE~cb%ve0A2XcOHrJ0zwCjKA9xYiZJ$bfC`{R`u$XV>ex1$b?? z;BP6_35EJylSYQdGVYf397(dr@p%!92)huJ#}ZRy9^c}yG)09S6Kx1li!M0z9WFGR zMfNlhmy7#uj(=Gtx2xGUblCwPq2!Z=hG|}2lLEP}=FM#Mn=7QG9k1e#vkW3Q*R;|f zorH&rRF~sj!1DdJ!ZX${#t|a%k#^@Dr^PV#M7-)38cW)4Y}hMzGX3)5v^a6+htVIM z`2v|bgB`yv47gblRy;1AdJSLm>(}DY;}y0nD0Yh|sNS`|)q!5|N7qYQ_(6MZn9K{C z48w>6R3rko-ENQal8S5;gvR3Qfe`S9IthgM`n%N35#?%J+?~;t!f0Rnwb3Y2} z`F}I>dh89@@2*+At*qyV1~1%#e8tD4Hx%qn$V4_hV|6m`hUQT4Dm)K`#K#;}nY*ee zf`?l#NBXTPKB(w!t3-eAt>2P0#}wR_$ySKQjmPF9W)T>b>J2uNj@wWxAJ8~KQ-x*!tB_WcrJfpRW{RUga^6Yf;&rGxcEUK6CPQ&d6fN%Ug) zD`)XZCLu#nd-XSzz8(>purC{3dHN+)AIkW}>BO^$f0_x-`k6LMic{jVjK|&FYe6E1 zR|GI6QPYNJ~O_gkgoF6x9<)7E;&y>Vp25}4DEI}6+gbxw%J zD=swX7u`cUkl7L*#2TX;%8N8Aq*Ufxr!)4ja?8)2Z|VzpPAM-dZs5t@Acv9wb;ez2$GpVWXa{i zu9AH%e^omA3C+Y2!KEd-9>EtXAt6`sWMP6jR8(f?f-k+#X_N3kuoU4WLTt?P={A8Y zzOE*&h+$oVS3)0Wmq^ck=2pi`aIPs=MoArdgfX&j4s2f{0krl~ghi{C*ERNu-C?<9_T1o`rg`G5o`!a6hIR>7v zhz-B_BLQSG!N}SwR#t}{YyI#0yVIS!w4QAZye<5|9`MnIR;oWqr(zGzHm13Fxp{Y0 zQ%^frow&XDx-qYAZr;#&yjSo7Gc%b8b*(Ac}g@8H`U-pAxjm3(u|4Idd z{>#uH+cF_jxvKrdj{hpr+!RHm?n={7D@64bAHo>wJV`>hh5oJ7!&;u4e$q{ewznqv zJH&~XQ%BFD@$mT(j6^B|)_0P-g4)%VB2P0{So+w7&Q4`MSvwMEbE8*~acP3`p0>nY z@~#ewwLNzGxqMpfGeB$s=YmyOX96!4TW<6G-3gSdB?8{GW~cvaiE zMu*b0uoBwlWff;5^yc|RG?4q+gb9Ow?$_B2FO#-0hHd|+l)a5`o}h1ZjWJDmQn8{q zUTLJ3VO3tj7$1UJU^V4-`behONwG`Qc|i+BYtUpAoOb5M?F@mUqR!h>1j~%Wn1_yU zE=t~*A;g|{dStGTOSCq+OR3_gvM@#O!;P?k-Ab450c-n)Z|54_H7K+ zFOx+UF`@xwRkx%>vk>mTlt*@G#8^ajyZR5fr^*)ms;I=6}C0(;q zw8Gb*(wB^L-`nxUFG7+1)-{b(0+;>jcQfJ>Z-_Apo9l0NadCr~>Q5OwqSwX5Gk+-M zUzQnd&Po5(sstPO50_;aiwqni7}8UFOIXD}4B}U{wqa95-DP4+yrXqTS3p1>p?#QP zH}gyk+9=TvFBRido1k=Iw!&L4q8Tl=14q>HtCwSl#bMw7fy>siw2-}7nVkOdBj^tt zJ`j%<_YJ=ai#zirT(m4VXum~5$c!AMZ<(|oT01igMg)Nyc*?zdilBMUn4T*rV(9K# z<1IEqfOVTvx;{ysLv_29yzG#dE!ARKHb4YLttl>7zn}dg7+Gw9=uq5Kw`3Z{SN%?^9v4WaSE3IR2&7?*}zzg+4js%o3PoxMQ$n zkO#{jxKTA@+1nxquxW)aXsZN8{$M$F9E4m~Rc`#92cO3?my7PTaZ`w7bRw{ZY!HaY z1;GEoSn<1&eldH9NEcL3C1-(e~q;jjYaO zZDIXrAkW~+SdLU&2YBqsN!S50>cP~y&`kY;0*ov{YGSVBW>|Tj-_iOCDTf`}%D%+e z?`PV}mTD`Ikb0UP1^_|5@tH1>TjFPv8niUooBv(a|1XOptNXja>vrrt^H*Z;bvwpR zXhH6#Y%b$$+OuTMv#rZD_fdnoipxNW$M)mWleiWNO+_V$`Bw_$yAbOZFsJf(V_hS< zUz!aQkno;LbK<~;-b18oq@+OZT%RyF7~1t&3BElOnNX06D)^Z(56b6)zNlndOuBhJ%tGE_38%;lGTOVFhA^JCJx9yxO+@@}m zK5a1BH}N{Qxuvf#U~;c~$Rd+KAEZg)$$Q zz+^0BQiJr60+&)JIXqg8wjQRaU$VCEQ$J6T)Yr`^{(Bm){U^~u0DH>$$Sj9cYNpWt zd?PFNG{|0@6urzLUYoP%Be(@))=lm_nk=^buIk$PwT*bixF&ym>p=O`-Mr5Ky=}BD1WO7y>e{fv;jS5F|35z-3^qG_sr)l_xZvqS2kOaSmFpqlnDeR2Ud2Sa2ul-+k3)9|i z&&33lZI0wlXAM7r{^EBaeJzXWfl7;dfY0HJ$qx%A)5(GEN6$e66-`ptUOi(B8kR{6 z^c``xa;t}{;FPMxuIX&*>4&ArZQ4TP(?Sblte|xdd@t$Bj`-o!Yc1;!go_zL4zzrF zksAt&+2iXJhRhEx9~>ntPIxzlv^wI<_jt!$p4mxMSL%mM`_kR&f=UbCD5#3O5~E;V z$hWeMlly?=_*jx}lh%YOIiRIXvQ&PuoUoeykx!kmKPyn!p`Lb+d8~DAvgr@p zrvOpSE89bGgA}tOtxkXWJ>yauAxd1&{IHAAaRHi;hQ306rX z@f5!~mvwym+cK6K;Gj_Es*F}nGWHsjT@%kpzN*>8M*1;Ye#69mztQ&a?fn<}X5>uGGGSA{()`1t zwz64l_}D@Q0XnW+-2Av&Tq#q)A>{SzH%DQ+hZ`{vBC-{4Tfj`GFh-=XHL0ui?TVR= z_wJI-?N|3|I$jEkNR_sVnERQJ_V!tz1LE0wd$c-7q_zckymt;HK6vk7b>otEjEJ<9 z4AbkFH>*oZaO`H)L-!B2qXTBeLKk`f_$`{^xWndn)j$k;(P7N{^l5Yp48yLu1@mb< z_N{ieJ_XKiRaHNcHh?-6u%~}DP;vh>Nf(MSU2f<4f^hKj8njBO=_CwCUeXc8J1(>3 zQmz}0UkEZA0DH_*5p{9!FP#fO`NK3H{2x;|3koARVN_lV))2O_0VY$?(OQh;gPpm8 zc$rh@4N@8RM%}A*Ar0N7jjLPtVkxWs=C)Z-DI!x3mBLs@+MFk}rTwG$HvZtOoJ~dD zLIQ(~ACOdi|w565uVDHVZ|ux4b4LX%7h{+_nR$I0e`V3*Rsh zq2gOtA?{?{nao=jwcsQ=Hu@0Ln-ptNh&~M|Nn?+%V@&3LIiC%$UQ&I(^-`FgHzeLM zZhpC4)qVzw z`o~uZrlx=30(^~qMA67B%stv3pQ{v!zbEMVLiuZ;%own-nSD$<R5nb@^ao`oYL zvf(~xaJ>AbHfHF%W;1#U7b5Y~5?lJ=+M;wwBKb z{aN&>Dn8HF4s-D4NLvx6_Xe4HrqD_M(DF?pPj3`m&)=fyC-Ycq3wI46+FCX-^I9zuL*BPH=eXv#CEpG1SeQ-Qw(YY z&hY*74{D{=vAC&N?jZ908n?_uSNL%)4f-5l$LOleknk;H$B0J*ucT4_#5^Gks&~ka zCv17KnKMY@nZ5^F*AM7|2?(9fGsFoYeOmH0=?jE~exXG`y-0@|#)x%@1j5g61|pUR zd6Xn95w~iFq>9bURQp8}lwco+WTu*$VC9WQRBcpkI8%W9AucC`Ge&#&g60#1%ESfy z=%qGXXld#)adduPYAvQ`a1FMe?LR9eoFJu_vR~T8!8p2R1~;!t?vXHHmNR7a_6akhn$ zVKCjt+|vnO)!D~*K`2|f zs@DZ?a{()2wz_nPz>bhOiDL7R-FsP1KRt2fEzA6!_0xp5VH+u&c%=LA<@k*eD6^OX zgQ)SH_q1>!5i#eA$&yWSa{j$qrz5+WogOcJN%RtFT(+9OzVC#DDuX*+RZE(&&)Ur3 z9DXniZeCyQ->5Zn_`d~AI-D0ClivBo1d@&Yg2VXlu2ejn2q)2B&xZwlDoHF`nn2tyvaYQ2Q=XgEUV(rEiQLT!oe=blP)~pKZW2abA`N;Y2d%aj zM_lOYEBaUyC%j-#!UL%K0vd+(Q8mheSefzO>Kj;i>kWGd@tomhy9(M-?5o`>n7PJ* zP{S|WzmDEd@VKf%BpvW{BkXw6T0d}rEV5>D^kgNCMg0;J+V*7yZE3HUwz<<>OSyXs ze&h{i`n*6qO3MENzDiuH*DA^QQP$}x)a?eBn z?@*ml8vRs8aE|hT5y+8xRI^c_u^Ly3fwqN02)Bq z!UzYk3k7GroUYhc3}})kCGJq)0+jy3;*>=>@E};$Wu_kDGqi%m98&pJU&O_fZ{p#G zvH;mZL0R0hr7J@9=Qp{OMXLH#9nWb%uU}AH(0BLRJsu-!Nw?a zmp`6zGL0~U8&F~ymZ;r-)f00Ll0jI;)4LVWGrowg^gYURx&m?E%p9i$g_&uex3jls zeBQzNSPXuQpprgaI)~AyHK^$cTzg{Fepaa04Y*6x8dD5K!~$e(7fXRa8$TN@Ad`MT zkI2TN8V=Bjo%8@Wi3Q{lc>@iTFyi=2`#VGTZ`5X^+r;SO;twd?Xc$_dKVx0LR=FIy zf+^W8!e^f%o|js46LlPz`bVqRz?W_qWX<^fij=I7lS(Vs+UnDf*~j|r))2&36S>2J zMEmuH5W9;A{{vE`CBiU2nLK$Mn`}Ls)pi7s8aZ2xD~!rr&Ma=@T$RJwZ|YpeS<$97 zYemCH^BA;g6r?i^Nip?Q3s^SV_A_X6Fk6g8yXUE@hqu+T4BTG??0rdfo+P;8H%vIn zYQ-x==Svjt8kL(6p!`a!<(O~b{5HBD&Fr-88_c|B;zKWeh8sfDf?FE<_}st_Skz*b z(xfL&zy?c|JKCpP|Ge)7b>TH|g{fKg6&1#r#*}Ooi}Au}oB;Y<7+6`{nUj{k?XqMk z+?7^W6#e#udMztN_jX0ifFG0$YUHawu^J6xt6KWWh9nRERv5V+fo&%vDKC`*-UvEY zfgq#M@JP;;5C#i9r}hwHZMFq}}5Y_u_SDf5oLgq=K19d$4BJsVfNYM%uu$1Fya=LaX5U-Kd_<}uL>2(ZWDCl%d_(COtz$~sTD~dc+oiw-u zz9WbN7U_HUQ#F&C&cNi%uMl1=sirI{pE|!r*L~=OjwslwnLn@qAiq8;DSmALqe!;n z=(mM!*nI9S{$z%!D`Ptgo}AWt;1zOmX`PFq8yPs*_vhlgxhWgoz}jYw8zo!uTwPGE zpSt4tUFHkDJ+>b0M0Ffr$(&tEQz9{BlAHn{8jSa{YJ|cp{gZ=#X@#s1O-i5G*%f2^{&T3KWlUQ zJBmD{9!}(HTq}b~xCj|3p@D8wc_n*AsqBKu(TctCr#eYjB8K#@QQk}ru88$58sv6$ zscFpAfm5vQhIFmGY6D^Iii?L*l}rB%&S%rUFGl9!J>~@AUsC;Q`v$2_UG`pVC6sAB zt_xJ71yz_Il0I|RWpELc>D}l(aHV(`jup+~VpmN%21N#lX6hUBl|k))xVGx6)6-Ze zu)v+@ENjSepJ|n@Dj2AudH3{jjOg9JEQ%-2RP%ibGn8-BawJL$gM`x10ih-JywRWW}X^if=_=a}$}fKGm?LCi)HS zHL_jjwLp0dD<=NX*34yD9VVk?Q9Uw_YdjLhARK4tdT?Tle>9eX@3qKdTBLvB3;%Z) zm|QtiYy4Y)g!SX$jcEChP)+`1et0S{U-d`cWypl`G$oSz%~9G`%#2Zp^2*4szILS5 z{kJOIEfmkG5+|$Apn3~T8hzMR_#DH@_+o?tJDnT~!~QdSZu!D&1HF{H;m3_?=C+02 z)NDBs4(aHwal*zZrxTj&eV^5wQY?lbgU21+#J*<@4PzC~bhGQ_;M*Uq)sYYVi53OD z-jf;YGoBNA4$TL@vYHplRlugSpL+a1x&pc0*N}&+wD?3Hr1@iks|3>eZEQ`6aza33 zm=Z?MMz^|31ugR0nw?6DWh*V(TWe0OZHi&OPa{8CX&}%Zd6N1Qr#M>UvXc&%*UdlX zzHhR-t{UQ(9k5SW@Kv)4Q!H)$MvLQEJ5z9w89lR4*#2IkUZo#>#@W9D0wm-(Xyho+ zKFqxxCHu;(x!|LFR-J7AWr1l{*IAs!oRZORs(o%X==55RjcoQy75EIti2|KNi++sy zrr4P@)CNC@ki@z~9gUwt4wGxs&VETGv@DRqWhP?7`P;vtq$FxCFe-Gi{!3{?u!lsnGd^@ynF z%}RpHFHpMM$aK;jEC-ScA@fo$vxyHsAMi^Gt;yX*?-DS+&K~7XL~)K4%%Oq}5=ASo zkv`1T-^Uj{{)$>GFkF#Y(=;R!uE^_+NaW)sBM+7J$kZe)d`Njvs0CV3e2r2bK5_Ce z6ZG;leuy0ek`d*WE*?&=EIMBUn6*(%!^CR?CR%11MFDv_V6t~)w)c34EKQ*&6;QW7vHN2N~#qr#bvutl!uPZ9-? zwfvfuc>8YAZD?&l||cle&v(IBTv=Eb6>Yc+zYRQHSKhH9<@)k?~CWC?a@1#Up%`HX(}p z8X|f+K_Z*9ebI4W_iNU*)-v)d?|<4~v3VMF?w~%{OnZQ~;hb-(H0MP-iGHc4jCa2} zt!};YU{3y_jk}=dfWOxmPuC$@xe8+sYGK{$5e_1aVM7B#dR)>~dW959PvZ;xEW5gw zCv)`Nq5@8E2o^-mUn$_DVjdSd*F5i7yDU)Hvo^^JIZ@{rUmGC5UD4ECe_#I!Smk(> za{j(By2>RaSUY--P1+gpQ4{t_jS|0!6b(|-OjcETgP;9kkjhH(cgF5Nyhku^IUof4 zMv{*I61Sw~5)y$E>2a~6g&@w#&c3V}#tlh4<0Dlxqs7ngjS9s#5|XI}%VT86t1t>M zSZt_Z6ynSX&^`&yWf77xRuICW&M9-AuYjIysT~qlhezpU7X9H@)Ve071VHN^SbM1J z&SadCKyNK&BJ&zgW*F8+lY9+lac@XXa*^i4`_cFRT|1 z=z5jKV>LAiCBd0N_aiK>$_}VhwLH>9kQr`O-!H#YQ;$1@E8=p;Fnz~+U5eAwG2bVW zI5IH!H98q9bw$USl}sTIb})Ehr}!ysWLaMCD1gYae5j4ROA#H`6hM0N+e^3p0-ap zzg4s#t*bSR2$_hEhPnT$a;gAuAb|4Lsn@#(43N1vyYu;IQ<<2ZEh95;an7o1$n^{lIZOz(wSb1CXkpTo`5x8D&C0b zNKXDCaUAri)|ToO3#;>#Me_1}KKO7GcmC%*uhrDc-dTnUa_cUhDtBwR_H|fgtzrD%JC5_rPrVSFI5_oBsR+bRkBagp! zw4|Qmb}D#`4-+9x39$~pIIbNF_hH;P{HkSH|I?Rhw!25m=u_R}Z1*BQzn1YT zYcEoQb=!@VX-%5(VDArbP)&L~dJ*u{*^AD2#3co9uqExSa5NK{nTmauRr(x>KsD^E z3!Saw?9@?Lup5>;djGZ7Imp`_T9DQN;5QYuV4`6lPd}bCkoW=%=9BrX6K`TUJIVq~Jv3>$FC;t*f8|^^2#UYAG{x z3$38;6bSRg)yAY|NW+53^T#c}nT4qFW)#329BscM0-+YV$!aL%XX-oS=pLFt-non+ zTO-ISMzM&5k+d5oTL@rhStF>B>kW$h<>MhO?mD2zR{&bu6}b%kIH8ts;hK;*iR&9v zQ+U^3bU!mLz1QGde13;NzV;V}EGzFn_0gZ1L$R#v;_u^5%FOYEeupdM12G*x}0SuscF4u1!isApy-V zTb!aDU*LHn&ncDlmypewSl~R31KwL|8dkZaQT&IXlOGxVT zTI}-jw1s_57i8v>)ho3JW;ixi@FeOV5ZLOe=oA&6HMSe_(mVqLGr70zoiVG|`Fr0~ zAG!U3d*38T9^s6RJ9KDU@a>XCKV#Fn%yeb}a)Y~?QCpI76=cICN1N&Su211)YO+oL z%yG~wgymq%@f`vU9`ZUAj5=kz34l_iW&zcF>+UcueSH-u)1V^agU`mg*MhH)SQ~GS znPL!0Ex($>9WbjjsW{L;;=EhBM(HA4h-HccDz^)|A8}41X)ORRe!JwXRFOVu&$8= z#Qv0ED2TpK3D;g{WEAC^vR2!kw|S#JIizP7;}7p)$XeC<59eWnCi+xd;SMb zZHa@}SbFKxGURHU*Yw2FsPT+%DaKle;B8tUle{Z39B$AE*?WW!&p z8!9rh^>J{kEviEA`Xu$EMdA6W34Y-G4n9xmCxF%E^JEqrt-EH5J2VIyvHtwY)XUl) zQ+xJT_irX8^;4m&TF)?h9pDd$MO^iv3J2|z1-rTZl_{9s(GImvW`n-TTd&t{POI)v zUa0MJlIYs@x zrH-DGsGi|cQUgxnIjI;Ydn~+ZR=hwV&6mTv5d=;`97<@j?8NTV&4Q^2W^Yl`LCrnL z-MvNZSsT9_Qr@zf9X*CCJW}w;ABttKrc~)kCE^a^X@;7md+csJAQ!!awN##r_NTIv z3lo~aCH=TBhN%1@s78>!kQw&(xgpr8!ddcTpB|cqr2IB#FK+=Od8WDzFhaxmlZeXv z1|=AsLUbAxhWSCsn~p;bDLLDlnTguVv<*`e4X>eJs7pn#G|Y8GZ^JJQ;M4GSONR6) zQI?q1SB^PFwAmeauMlx!7Hgwl!#9-W{#(7@{0C4(P<{WqW~}AhW{hABWl)(x{iUJk z4Ko!rYj#Ga_OC-+yBCf(8y?idOKJ7ak-S{mw3oGw40I=U}C{8W5#wx>F>j2GvRVwn$%8>HybvU*6vT~ zsej<;%a8DNrYctwf{#pXJ+p4&2G8;0M_4%xmE9{ZB(1M0nJ|dOXSkUJh2@*aI}B%kpvDO7=>dr+TeGpu z7S&&2M>p^M47_#ip>wksU;w{!qz{<>9XO||HA?(tQ+MEyX=-&X8m=M* z;=3mYBEA}LX-mE;Np)64`@vs$9HfNB_Qtmj=*eI+ag!-n!BhSU$qg=#>~cMyAJ|N% zgYT&1kl)pA(p9HN9zO&gA=2VWVRJ~H#ZS`Km6@ zedWaSDeu=NR6U%=M86vEmQF?+56cWO!`VY15$KU&%fcmii}eGWyIWOj$SRTaz7DXu zqdcvRfr$K-hY2oyJAM*6BqZH1l*>oif`Y~S!icgg{EQ)}OV=<{W4Al|n-Vm41UjYD zV^Qk7{YBx9Y^qiD6@`<0Q>KQR7TSjjmkXb(LDf*|k_K+x)*c zG-&(=;#aL9SV4EC0xt9U;Y!Sq=Xae)WS&^A|G>GGnfKclWGdP=En#?5|JeTe%OV8( zJprt^_BEPO5utw406;Y@$lF;rl;1$jz#%E_5MH&i!Y{~psK`;M_zj_qn}uc1uh^nQ zhqNMxMg_@qXBog^j4zj$?1d6R4xfya`vX&Da~0~x7ge(wuTex^V@=X$^(VHQp*q%ke?>FkHE3$H zIEqQRB{mg6uM^W0c(N>d>&2;L0EdiLy7r>6nhUG_H-XM>aK9b<#cz}SaV8y?rtL{y zd6|%w4MihT8FgvRS8Yg9is{Z3$#0rD>)6yPc$k19ynrJz9yTm8oU%yj{H@1eKoS?q zWbsN&hRM3?MUgNj9vgAyP6qP;bHvL6=(6Y51?#uCRD+r@btMxUpmfGr3>Fthwc5uP zRZBw`Po{2CnWDpV3*$B=p@&JjNFSSP^=gfZ1du7oa`~@|B=w1wrvM=}a9GT2FO6c9 zd?Au5Kveu0hJov%6Xf`lq&7NI}$l3@}We+QT=c=tL%7q2d2L zvnR7y+uF55evt1po12MKACKRE0&*>=3kmZHyQR&oRF)9vL>`4=re6pyYOKH_KLPpT zyYRkSDT1NFvj@zF2MR;gGk`J2j8?D11hXA`y1s<(f`J&n0$lg=T-@!KTv_bn*;d1a z{0_ZBx_Rp`NL6e6KfFC`yt*OEw__6$-)whg1^GAEej$c}Sc*%_s_KUa>ss=$11Y>m z-BegfOX8?-{W#f0LH<}P6`*VVwh~S6w;>dOLY$xIi5TNU& zR3AS&WfzlmY&U0}Ztb{miq((~A#oQWvrNdsTR`21tvKMl7fM%?Yf9UZFmn7Z0Bpx< z%5nPT9H7u@?u>Ji66xIA9Acn*6ibd^X@t?RJRiC^ilb3&BXr$cXrfc`202f51g*F$~r^uw_lGJgn!_4_P)(dyuC-cF#P?yMdlCOtozzc zjr4DLFRedt?d3S%ZZce-t#QQue;6TT!}W(?xawk=u*95TxLW?~W<24ZXX=#z$&l;i zLosM&2`9~1NY)dTdUXZui$ib0=cV*VB`PK{qZ}rTziPe!>UzUP{yV~X#l<@9foYnpgEiuJP0o5b}00lW5{>Er3m7^7cZjW zKX9cvmvd)#{P)R!;C#p&Uq0jhfjeT7Z^sJ$1BbiUPI%M*J2Ua+K}s8DE-!8BKHt^0 z|L+BrQ>zP>-@lsH{uzj4VxzgI;vK2s9Gn-&<;yUP-=9ax>BZIpUVM3u5ZfPzsGooD zalF;;KkqH8`~x?KIQDYs>GvMiTZH;|ykq|}u7Rq|qcFc)5?Moc*-Px&{`>bx5OzKB zxfqYbTOk`6Q&#iq>v#PPGCmT|kV=pAkB9Pddy*^g^*#a=}g{DIpmYFsTDALmEAAjjq3 zUAy%71E6FS`|?zdBs*%px?ZIou?gmZ=`31+)LU!V`WX z`j-FLA4(G{m`-PmN_|9W;^qCA82XZvY^`d?3M>;OMCcDCPECsOZBI8b!76ulZ(S`J zGj*};uK&K9BE@E(YCu)jhaGrGnNz9>~5fHkZ^|D@~QQZ#I#@EQs{SX_aOK{5q3aY$piieXkoa%6AsLdnMHZ!_ z5z%J$f~kb&pHBP~=HY>S+bZD4ye&kqS6y1bJK1w=Rm{4qa;bk{M(NF`0NdD&*&pua`Fz<}@@NAvK)qjudmw3JTa z%aK4ucC7?QDZB_KhDeP2hxHHoHLw#UNRaE0o+__l;HXPfC#JjM_j97MXvr9MfV_|& znri1wxfh=YbwQ(7rbqE*dSalbgJUzU`Uug@U9~|lZwunP4b`Yv4>JKiMzM!tv8n=7 zPgCpmAX}_E8@$uoi`5nbwxXQBdqDuyT?SM&eDyPRlRqd5%Mu#jEs_SY_2EZ-%nI0( z2DhBO64rnL`bq8s0x~k=s(r-HGvD5&P@j{Nd#OU{P_|@SQD|{r=OhP2uARJmGeNj_ zCv=}Faz9cob`$pX*%U{|nIRC9_lUOQhhZ5n{spJ&CDPFLQ}pZ;(#h_N8gzP(>|BIp z2nm0MoU}!WFR*UyUG1c5U?7xf`YjwBIvg^09m}*P`Z;p1v`L)YmMb<`L4b-FVj&^g zN}9vLaq4;@tgJ#*yZ5`|=U>r@;jg=sHT-+`m$wYghdDsTuOE}jVStJ837T4uJWM)7 z{p)>JY6kOuAfVZRqa$CgcQ!{rd}>`FbL@}Is-_8cRpzk4Bq50|G-%< z(OWQCWV>V-;tLlJF$_U$$|dJo1!`QT+6t+HR3SOhs9~~>e$x6#<8@zI!7gl#Yk8Bn zvA3wy(G!2KVt@Y`Y8edr1@rvYB^~y~K#*U2UlR!zB&LosDn#yIrDKG_?tShR5~Fe)+(MK43K#`WQV4 zT$H00mz9*eluk>F%~asdi`?G!dC-sA#LUEu1-*``>9^x@Krtt(9(bAw>G~GRre8Kj z$ZPxV29FW!(9eajI(DMA)oU^LB^CSUCwBfg+7fjBL1w$cy)l@al2B&rBq`STj^XU1 zo}g`YZ=Q8)M*zrrL`Y>93ysU}sD}cnq1@e3#Z2Ge=TfeHYwi1O@mQ3-+&$7=b*j4I zk?kn&*1`JhwnY=DTzU-GMYX9JSv2^2?y;snRsfUFZWg@{R%x%G9EU1XrGiBE_je4%?u_YXONRWm`s%)pQ<+H z3VoDdC$4#vD2!!3jbX07cXRaK*oD+z=zdpSo}DuXQUUB;cKA9VMN!m3>@CBR z-0TG1+LCec*g!j1lZn?w&@AD-qwS_=t*kNf96592-`a2yyM;P%={@>;ENu3Ke?1>H zH(M1;n88n$lr2w-963LF%b$It0%P<-HUzo@qQ6qr$8Yv69vC9Im09AU2jEsqVR@p@ zhsWrTXw+jBFLSk*2o6~OkZ9Z^$ zYawFPu-egaD)Hw^M$#DI?u653>6;-rzTy1h8Cu`@h~{n6&5~!yYJ7jFC?!8z*V2*T zSG^;~x?ic4J-u?$a@)ni4zTRIVYX5^OUmE&lX2G~9>lSGk=(WY%)|zXCA04b5m@a9 z2)vPEzRv3yJgP)`QP1ICACs{a>!j_LhKrg;hpNUuTMw_)6F|11C`p|744j8d~8V=~S7t|h{J?RMu9OV*Rm zUCu*pP1+S5R9Kf+7|0|e6nu=!{OQD=jVvD592&+4xRAIrxHkKBby(h#AM$1DP9q-e z2+k#kWAPv3JMW8fSVKWJzmBP=|6Lx~S@TYF@tD)_eNt@mVq6WPl{=b>rqxlzBS>F& zwGRt@JDSk-{+kkX`cRMeM;&jO{UE8=8%>YYNUl>KeAtuj_(9}q?#yk8m*QKmn(}z} zjQp*dA7O|r@l?x2v^c@>8Oi1PoG?)2uXzx(doH}mHGnaRl{^U2x! z?6cR}Yu&0(AUuWF^t}|8g@QGg;M3rm1lo(15UZHplMe}wKKK$bq&|U_Qs5*9LwzK z3aOP@!%#16p_Zf*ejb!s1NSMa!iN9M#6;%H(R2#X6xyIpQpPH}2{9^nu=QsNls6}$ zs9#XDhhg4XwA22On~mvJ*1J}fW|pYHFc5`kW*6VKi^uI+{F44mdn>E) zUBQw|32PlxM0@md&i+fwIG1Ob%Agc(=nt%%+qKsANgtqf<-%j1X}D&>W!+_eg{F1A z2Of zy}>W7V`a!T{f5%oQp031K^TV`KrI*o#vf0nT>T~J+>|Ua%3kUeBO@L+J2ta-$wi8U zVmt}>BE)W-p-|W!uQH6niQd^-OQ=#qpVA3A*U4?xDAxe3O7EhR19>MXqRF;glrnWml zf!6sAHcq$H;6EP|bMGZ*p1x_v#xu{YyI?BUo2b2x{56Dq-D!C*hgLE!>3FmbwcwV6 zl(0#{s*IFKOLUAOAEqi)5}M4_B%wh~X4%jT$f4&UrG7+g-G7Kb$CgKnGGXyGK`5VL zf6^ciL19{oR572W{NLfj(wkIqOhsC$gf~fD{Yd32riAsc)pU_6PeMDQI($2_diF!% z7pxb_&6aJ!f#Pf4X(@>$)|^`ItDX@e5<871y9mZefjJk0gS+a)3{7MP$q(#Nfu9^6QFZtUF?dqiY94uQ{*9JQHy4;r^b*5LUi zo`0MnMwNJzc-aI_`-8jI?EnTWX6+nZY1I5p`lSOARNOwhy!=^U;iC zH=S8yXsR`+3f08xFy8r8)|dLzjzWYUW#PRmqRj&$%DOd?NZjk? znxQt0JRCyU&9Vwo%!V>mvU2Gde|@hd9Qa^X?kByQdel9O}5_wmR! z!PIMkS9<-LYo=}+*s?+k6b;~ZUrP@Y;)oazS}jCNboShXm?0H`S0cmta9-*4Q-LR9rn>GxaSgEsOafXAn+l5t5D>JuxbtCDF*3-Xq|K+FQ(< z21P;IdfFFwOY-rnArfaG5}s(^^s~ps2fvCXGpT%QT{M%;6zA&>B~yrUN)ZpQtZlpA zY8O#s+*h>*n+eE~ioVGxZFz>j5FCG8QiRS1<);r>aW~vn5O9WQcPgBG!#g3Z))fdP zkM+EfOeY+&exR2+;2XKy@%3w=a;BKX2l%ps?qD9ObxOkztz@F!N%e}O#=bbg^T0&j zLo7Y}wP#<8cjIypFG>?z;V&>g!;T>SX5U9CHp?-Qky*X6D`N^L}+|G#;0MSPPqE z%3TYE`_9B(#M8FEnw@;Ok}oiqHT4oG{9!<}hbc&LhUO?N&HhN#EL7G2demBVc9O8+ zHMF$7JMU$yA!?$hM<#zT$wTD=H#GO6mygpkei^6hqC!ow$jyW2_Z|5sc1kz9BVm=z z(a_g$cYN~I6Q)}$R#>3uGs7It9k#gN?7uTNP&I7wK*V2C+MnvPy6y34JCu}zOCKVi zFMn>%i>E@8RoJCS96jm7_y*mt2nXnmZyTM z5fKl(N!{iZM|BtQ_-I}oKV%E$8Zde|i{ixhZAbY!&limxy*%lCAN8Jm#e0{nl0E0p z_w>!!to>+?D&|bO=;v*03aggF<@ZTd_7r|v`dUVGcY4R(X$jSUR&}?gM1^Ux`@TEa z@4GILP&cFGg4mb+HNKscb9QZ1;BIjU3z7)xY;!Xv z>~xoYzw24Y)8l}RaK2O1XJ9L3gtX6nG4U+D(flp4G=Z0ldr~zT_wtV}a~mrIy|vCh zc$~AF6pnr1FmTORN9nlr^F5};D!aah-Nf!et|#>V3gDtX7UKf*jGuoVZ&hZh|I|6f zx_RPe2B=e210vT^Mfk@h3gc9pM9P93&=6(a8uD!o6Y@>H=D3-J-ptLl@%p$Ld*FG} zf(E2qg~vo_iLPF4f{8dc-JYApmf-zU~f?rHqe7)B6* z#tG;4TOxp?BfI;nS(CHdW&eclWm12J3AmYtY9Q4L=OESz_nq-L6^T4~ChXy_8L8Ks z+)O;Km&41cd{qyZ1e8_vRsm-?brkJ8Gg(0XlU1UeLLQS+2sRCTLjKBc z2S9K&H}NaMHZ^Y!<>zWUJ3A(;C~&BT_-S;IAr=X5MD-eX>Qz=I+k+Qt{>B+qRghY* zbEPC2Z?XIsO7Bgc?SphoOWqg5DU^i!x@U9CdxUKwG}*D$65qn_%xO8F2NKXv`y4Jm zl<90!l6V(NmjEHf0f?`cnM4C^HsXD2)$*_nReET*LqWks-63{i{Kq#Blm?=5jhNpQ zfR!awDw1TBAz6Hs%zS*a;&|WSi&R9_k-zie<5NsP2vaB zPHS1T_tp088{k$9MlbXduHCtGYMgj7fR{=+jmaKldxVCy94P9ZyL=S zrH2N3Q6VGVoEpG{-8D-8tEg)&lFEp(Y&|||(sizzdMlUGrw(JKJohe~yw24?ZEar+ z1CBa<>@RrS{8VPzCv^K@C?CTX6I3*fbg^>C=*dJXuWLx$?(T4^pH?W@eB=03opY)T zS}FKsHum`w>7Bj8pXKMu5p6v3e*y;ol*aXY(+86nJF$HCU8Q|5M#syyb1q@mj(k0Q zpUZ^ABcH5{TVugKxw{n5WwW|p=N4_r2bJVMt7?r?t1lf3dbMC(APxOAD(PehTk$eL zu9p^yB`woq(v5zFfAAA@*It^eYIu(Q!_gHHV9$DLx4jW@)i+4&GCMNOnZ@GM(B=5x z+&+-9O?{V=<7rOa&>XU6l@>Qo}p71_-^Qk;%W~~<}n{A zvp;}?N^hZnovF4xP-jv_={4h$;lwlE4`{q}G%T8zN*Gm*D?wki67~9Hs3VVvIPOV% zOUSs~1AQpd@%fdgm6$o#pHhEE{C(;q*Za#s@?`{@%8;CI1omUjoizO zX&*yX;v8I{Y%vm}9dF~FdRL){8!Y3Xz6VLfxq`cZI6B%bzh$)uHv1fu9FI+AA)h|s z^?Hd`FZ~Pg1+;U9{=TMBmHFzbF^-2ydquj_p+B)lxw8C_rv;E?5NE@cE6CUhX>xsN}BrX1! zS+cIa9%cdxrtWnqt)ho1-6>;bw`iw)47E!?k}OD(Z{RquM(pjYG#gPBxNI7?fk!YJ z`Zz^HXLF}NOmWK4{o}bR;6EGnV)B90NdESW)^}&X1q6JI&2Tl{3Z28|Fv@Hf{R=7k z*QrB|VM!CQO+~_f^cMo%gJ-0?Nq2SUeRS8jwP||QbUMr)k3a_D1WElXV6I4p#5p(~ zQHRoZpWtcRTfIQ{B8NHQ=NC6QRFW#{1;MsTN}_9xD1ORoVutgglK%PWd-*i={05z6 z(aCn3KLcVLqL#3zu%4_NA_$7gF0q~hj_&&=DQrd`y19kFCquLUBfswjK)0lUzVFK>`ZB+rp3s!7CrcHf;CC^iHgUdh;j8x1Lq?x#3YMnSl zDa3L88S3~VAT!15ColV!#6~&P1SR%Q;Xo!FTk1KxQRJ|pYW#iUESvrd07mPUZBnLIgc!%QjH}(P;Q&FozH7gRH0yQ zWZ`3@@2x}&wN?x_os?vLr6Was2Oejw4zL>5$k&BQVIPb!Yl|^ZAr0butyDV84PA9V zSd$%qNg)&=)J|*&jG6b`E7L_>9kNdTGjkM_PNzToX4R=Ls+CQLp)o=g9NVl?R{260 zn2mMcSe>*F9Q!$!9)UBX8LY@oktsqE!{qb|pFiwCd*KzQ%#k_a6H#>@_s5TcKw>8tDGdH9pzuCI&B^>)r zLn^}Euiq*f>ONMrB4PM#^dLD?Ixw~1*>3HC3L@F&I1ZrqIivBbKkoMeU@h3zcHEr>_97=w(k}|`X|3@roMFp1epc{r;pfhYSPL$;|Y3gw1lbLjsHS^xQ#D8^o!U;{Gm%Lt z&_+|l=XK?_FA3Nc5ZvT?=@PQ$AG~EtXxc2rK?epimEGDn^dmZPFg`lwI-0bbjF5c( z6?&A^R`{f3vB}I{ygV;nE79s;V&*>++06yx!i0BQ#X@K#aW>pjRopC{YyyW%vq}YY z`EW=as}F?gZ=qC{fzd3{@P#ADzYs<&^Ip14E_=r;aMxlq?mu*G#2c(XOUnh{2M88X zGrV-Oli7sszp!XNx^;+cn)$9GjSoZ%^T}FXV&j<;a4wf|Qi|Rh>7JitVFb|^Q9F{v z#J9}V#F2ELKIb|>3`YT(oC=X&%g?dp(wUHnZZ_{*;KC;%9y$dr7mM!uy>)h012I>2 z8zyKQ=e$MwQgN-7&L2u++MpebYZ^0%hSUkPlY)7-rEG}dJO--Q`S@2`&SP*AE&dR* zD1U-tX^HM{o^9c@huxZLQzb%e>8@Mhr`xbiz#_qhIC*rve4YM6#XA^sNu#@guLqVt0)_v91Z>G*P;Jl-#BBd=T z=#xLIq)EwpSw7ah43!MePVxuk`W0zce>q1MrC#2wcdQ%+R~iw#z(eda)7xk;7kxHy z42wAlEnrf|g0N#%Ws{axrhB%AI!g)Ha>Vq1LZBoK90F%h6&)EXkLcDrA$GIKhW~FN z@CfI0(~yJ6{;v?QtQ8K!Z!P<02+*T+>O3NcLs08@m=I}5(40r1nO?U(|L-A?{C|YN z7uX%aRj-+L;qA~cM*W;-1DjSP@d=aEh`mCk0GExL~C2CMq zeZXR)A~W#As%1uhBsb^#AzT_~N}|6Fm)Jv%!nknr>0mV0PH5c1%mTt63n&B3W;{~EHseS*oB?f(N(P2n#D=r2Tm<6WQcPg?Np<$Ylr;QMaj z3@(s$npocd>^o7vhHiB#i2j8jhbuZW?m|?(XXiOlQ3EhaYmbqEo zTDhy8nlW1 z(3+&49v7{yNg`u!LT_kRMvvpVgDQ<$m3%#|s<2(&phJ6Gy0SLLM#+GVkr~tGBvRO7 z8Sv=HY9E?wIu^wi>T|L=-rUinB))_jKF=<3mN9xLkeN@U>h z?87l?V_i5GEpZcf*!FjH+`=MBAl(q$2)?V!;!#mq@a-{&O_-MTYHa;?dr-4li&y%8 z(&&H7*?)37A`pj|@%}=5dSmLaUp$;l`*3@(+wB}bCj$OR$^KCA;4({YI{suP00>l_ zeyaS^s?+LH|0<-sF0nrE*1Csrc~atR*_-q)7b%QWW=w##OHI3_EfL^jw`j)_PE%~v zWL1Ruj|8Cj*>H(`NRgsU8lu$DTsdSXGf`ELHWhP7?G1d%o1Z;xs0yz=Awy+qB|E3N zmCv3KE%x~YU^oLJr?qz% zg)quL7mAaZ742$mWUg&eeYdU+m2#MMBJd$T#qo*cYMA}O9`f0Ssc}UFJt&Hro)`kc z1*ZrQPPJ^{r2l`MHUH0t^gp-n|5?_B0EVBBA`M8d`hYCp$s=fOH^251K@!nsHue>o zl~uI~W9v@RU+fj>nT*c44U|-z$z}8q<#q2_{WgwOT{$~#eU+kwQCHoB^e~!&N=D%* zl?0E~rZvfB_R3-ZdZ7Qeul@i3P9(a4myVm)tj6)nulwrv?0u_*GahT?ANw~OHm1n( zdv(h8h4FDx+(%ZaELu~&e<4sV3ry_Yi5?8NxUO9#W`~~&(=&U8Z`xpf{)KS8Q!i<^ zb2BgmI=0KxOIH7B!UErn7=~Yp6EvQzeSF|wSm3XH#hF)VCSR+;Ljdhr*VEgEDPzEE zSxZR=>r~Q@(5iTukx1i^e*ByLlU~wJx^ehxihnX%8Z#xSCr+mT zYW}a#+D0@YM#*bOS|Edqqir)4$VFqOFB3M&8e$ktqyC{SDF`ARUa;a(O-KKdN*_z zV?AH`JKqbF$roUB1_D87yoz9U3`~)tK8rhzFOWSR&eb$;@ z%9}SRnt8q!N-PkL4yycxaNPg&ey%Pp6wON{ks}0N{uknn;qfm7va|U>EBNE#T~Ema z{N~&FoiT+IzAq7y?|MIdU!*=hN9lkJ{zAayJmI?YqA7-d5bjP6bj{-o0`ZFw?N1Dx zy@em>iG82-)P-iuuIl|M)rQ`}g{~NeBo=uF{L@HwU#bHKKk)pP-%2LA_y9=46MW!Y zJ?HzT_<{WwVyEjvx9bUaxGT7|q0f7n79_ZI@&DQCw3>y_C6tFLN9gR@D`dyDz#s>T^LvGQ2FKz+Qed6>%p%3IZ+ zK_*1mfw8k??BV~u;SG?S8}3!YNwxA>aMpfu-5t~jHo;2E-fKmFW@pg+MP&n~cWn7O4i^0PT~VuLjV!~|fn9$285kr>O> zpTo+3y|ZpQfgYCTzJ)HmEfd-1;~I)9psI{{bgAz-pL}*GsJM3BUdGEA`3td)57LEH zmPKfk(}E={4G^V*_EYd_K2{TSk#K3Aej?2;G4j7xYegQwgKEyAIK~sR%CmR)Gt@AF z-1sMkK*FB4eMTfn;d|1)hND1Wq#9e?S%saodKH+Sl9La(5SI5i*)Dbv#wN4ei!SB5*@Z2{;y;VW)xwety zYE)-Iv*V7ZOWMgx91Dr_MAt^`O^nMCqRk@H4W*cZaro!^Dqgl`8`$v*M2p)QMcy(A zc}bZO0U)30f0CByxbU7<`%s}Rn$z1N2{JXS*h=!3`U6qLvToE@W2gx=Z7lIcnTg`y z+oJaTWTz0fjjnG3-GpfocW%@+K@kU@zSmuYc^&2YgdKSK{Jw6|+6nOk&QP7J4e!%r z@5LOSq7k=S^zz;2uf{l*qH6p5gB7%uNHff`m$a0+PZ}YhcRW-)E$5^tVb%F|{zCNC z^NwGTWRqXcVQi|J_F2yIOimP<6fw$DBMB+TSWV(&v-tbiiKA~xT#T-gf@MyEpINg* z7O`+9Vw-uBH81E_leRgKcbn4#{*FD*N>@g0C5SL}kMU{Ex&B3QYno^`&4zgC*qprxE; zIy8ZPgrIoATdgA=PT&Ex+q{Y15kVG_uBr!HR5+yQyzXEnV-!r$AKk=PK-uXy?Q= z(*UK*PFz6M(rG>6Ux<+^q4mvWF@eJQO8p!XA8g#`sB8whX1MdNuWPSfX!TnQc8$V= zm-F&%j7ew&f&{jXgiSp=;I6f_48|=}w=J2UgzV=@rKg7qd^RdRZB=QY>ev%t+wL!f z9OYjKHZYx3L+4{a=vC;q(ltTxxJ=Anh#MAaU!}@&tN&!F2-phl)7~u9-E+$-?KN0& z?F?5Z$wiPT555S(4aYW_LkC1Mj@6)0$WZE-RrvH=wXiLiU96^Wi@YAAhIkFwUY4g$ zx@M-=Zlhf?HT$s4SW#>U22X%Q8lYi>$-c>k1$agA2;DoenD3QV0Io~6lZXq#OO@8^ z*BT}@3~FP8MF(T&@lM*!-K-?m*Tfw+U;=N6`(wb|?-d4G74*xO{Fmrmu0GwSz)t`w zoWv-GX#t@~s6Z90XsA%6i&$(gcmTQ7;#r(0sbMnscd1_xm0lnp_(s@5>u5cMr{5!( z`_$RYEC@a0MvKqXwkM&&x_4h2Y@ZxRh4wEYk(m?$_Beg^IZ@n}cU@t@)Go8|3)pUJ z0Y+}hR^c??O3;NB`FuK5--*V6>!DdKvZX&(}#olGrC&x3<= z@?UHmTnx8B4yn=eTkatBg)+=@iIwr32~>?fadkTrjM%*b0dJG#A6_TZmnR;@*<78S zd=dU@9G>ERqdC5Jjf?QZ$j2yiLgiZWQ^13o1Qg@e`iwk!x z#Pn+$jIqlu9_sBwU*Q8vE8~mm3R`jQx1a?^@Nb{)tEXOEI$5=6KMeHV@m8E#$h}^P z<1epNUPa})U@h$vgq7$7kLBScgaE(|&}-WM2oGuN(P;yjJhd4#sevxzAGfg><;&Kp zeFhB$cgZcG+0jlPJ#MF;ji+E+ENyLjw_Tx6Wddc?!zWf23{uoc7jkBE7W#vrzD5DO zH79SzJQDn^C?AF;yHy}k)Ty^e0hRL!B79eG^SeS3{NT>SX319TH2+b}?1#)F(<8Nn z$c%jizLR|Fe*%5GvcA# z>Isj9@S0&=w~vbBy!q5#*QmgktuGl+CuN`5SLTCDUx!G=X{R*$Pkvf`KH&ekyBLgj ztW)9g2x)w>m>W<1W3;i#P*xs0F(&Qh9hEViy_dV+&uH}U{WqeuhsKC<14vH0Tghh5 z8;0x-=5c6UjZIc8y+*@Wn5d@S>S^d+>0D``;t-8PA|u!WAeVo$d*lgE7%1M+A@o!R zE)%C_&8@tB!8`dGuh*A2H1s>^UkK)|51dXSzE&Z(nX5x7B}PC)X--|2ok0%0z`r`8 z#XkFX5&7X*_%@=gs z5{Ty;l?ix#I=%4l_W3Uvku&VS8k#iK>+s{?9Z%I*)V*tUr=6QXOz`9uaA82ze~$&o zP;9|RoU?~`X`RZxa?7$hcPuweC1v7-PrUX&oCqNeu!rDbb@y~Bs4Y&dML7mWgTRxP zi`(yb=hiUGpkWnxEcTUqZCwXt9TZlOL#)}WXOMd=s{pK0=|a=@NsL8Zc0q z#2WDQ$-&X-W`^IX^WYGVI2Z@+mR(Lv%rrJs?X#hv45hsGmsXKXH`$K}i3)uE`c2t! z>o)@ETf%hQHAWZz;nqiQm5%M`E&m4<)| zDho*Fxn~lTATPhEqPbZ*bn<9ZblVxV+U+`E{LxRidH^lwIldf>tff}BM)!5Q+@SYqcV+vs$i=D#XYzeU zhpUx6{xzIY?8`7;RxuPZrpra3JpZhLZ-em?iC%1I;9@11ukeZewQT4ym6ja}3(J8j z;E+ku!D|G*m`ySMutrDgGZmC-uL$m4eq3fiwJXR?BWpoDolre8(0U!m0dqrzTn@IG z*Ow;1C#+Pq;+g^j0`c)3mtu!RS{=R`qhK=Ft*MEV_y%dk8I+gsY?29*J!T+iV~8ZmOnh>4Uv`biR}^Mqr=-Go&UT%Ba}1pb~e z-nz08cvw>UF1e}i{ftrJ^faU}+DV%v>3)M^<-wFmnu=q1b;{(~0~I8jk?$D9(%6{}~o&~{X4L{MiMaM0$f;rt?v4} zDZMz70NnQ5lvGc(iM50=m4WNJmO2-Xd%dt)v5AFxyo33GjxBo$F6!AHV^bfgVO6@D zN%RIAb9JyvtZ8DtTPTYzO8O5`{2vtwCF|hc7vvgAhgaA=@bcl5kR{-aRDTrG??Fd$ zYcpCqGVHa}HLhrPZXRi%`R?C2RyX0=?fpOj<37pd0uys_(lKL&h|K1&()gsOvW|Nh zQokD%LVB&`GqIAoNsR3==dMi$QNo$T@NEM(w*)KLx%>4so#))BXmI{Gt=6!ycumud zrR0mt>$inEUL&O3NQO?hA^_qZ8!i^T7BSEFq}Zm(U1h8odNGj9mfWmz0sZMb*y-c8wtGmlc0hB3QRbtbhc3#vGqHCK>u(X&Xj`ZT-;WNvf5b{WBco={r6a z2Bvy-nSGXg)iXsnA0Z@A8(I>NO!yvM^uCO#&uB%WgBCGnAyiUMUA-K}&bbu3LxGH~ zDxT^sOc~N~oWu7@*qE@Dd$5%~mkFm$uV-eia1S|nsx1NBXqt~se=DM6!DGrhoF_+v zVVd-+%5gHAE4g?*S?Fsct477H5I$uRF1Y_B&O<#=qZZImc}F|~-<5h1zY<(SHZKo_W-1W4#U-_-^m5oN1vn_YRIPoyJf|5ObBOOID4b|)bx5zi zG@QEe z(p<_cAvqEVyDbip?B4v8V_(B125tyh`CM^r-Wb^1l+nFyDEeQN5=9Y3k+yN%ckn68 zK1i`GRp%bpU6!Cq?p{5WvHrv@LY2V99u^s7MN9Q%c!w9~bLORB$XpTJJm`{`MQf1s zm2ByKGdTJT8Tdk2tH@yfsw>6zJ+qmY}P zC7mG4PpW_aj<;WTa#mWET|tI!4{Q+ttKM$C4Ej&EN4~u5yR24P|HKIV?((v4&@jG? zUTBk$oJ8#|5~_cgJGsGl^HE=L{oCNiKy=pmmzkT`vy>Lea%tVIjw?Nbx{eYVgaC>c zQR~+S%J*XsgpY?JrM2=k=%T!LK&tpn`_zt=hdc}R#1 zva?VVaEO0=ma6BvrrGTx&ux7FLX?1eaRg7kyJ_u)B>?=}zYupb$7cUkV=|~^@%xWr zI`sVTs=LdvR2&vS zh14@CU)~{6_62hJV7rS0Ms#ONT0KEP@~pcu@GZ) z$G@D?sF&o+dTW9Bd=TP|?e+anGYbk?MO!ZQ<(Q8(|B=u1 z04sN3R}2i$Bv0;cjZSWM7Mly=wViYo=0_W zg>W)dZu>W!s#x<1#b)i-@D&lpN(*9Bd%xA{SC#9ZBO09#YmSJg*+F-cG6zqI$K&7T zec2sFlYAZye*3(nR-Ni5l0({6(UJ~g3%rpQLQ-Y7oTeuoP||s#4b8kKg@~8=#HG5= z%q$AYmO|V?4bxl=-eZx&B7BP z-Jyd(833FSj z`wZ2a_gQViQCnEZK(zy-d5O5LgG`S`yPzs{H(yoKzuz?}f8h6eo=GqyJ1evR=WdEti1|LD=VSgpgH{96(vqUL$jJ@oG4Xr1Mq>3Hc^1=`1_ z4`fOwId)BL0_iox_YPlbvn-$qlj*zg7pc>+u+td0l(Aq@3zkZ#U453RdW)D9Ka|vdU(pFrmp-X zum;}ju)g5JooeY2KF!-;UaM2r(mlxQg1TVG8&)KLwyMNAlIq!xI5PEBbpjr%BO-{I~cip(c`j7SD=OnW^|FW~z9@q*9TM z(hj7Cb;6Fvlxr6~>{%THBVHhG9#U`*7hho2XA{2NkCsd+<#Ci(Vp5JDw4a{JRwivV zViukYyxsVmTnFtJ0`5nzV;wU^Ly_yf{-Y_NS^1wd1@z(l9ZVa<*+^SUJg8BM57YTw zMkqq&vGs1!w=?%?m4>K;6lbu{+Gx45FrRHyhiJbF*nzPAdP?T(C$g!|BuCa4%j~gk zVj}~g4{rfRQqsBtI-wjD3wMdCkw7jKvz4A>Fso%g*xvx`C_v2mR3@2_8?L(1=|NKWRl?I zr(4xE6P5>-9aJ@DNs0@cREHNl$l3^b){1o7SLk<^nNX)?P%#N*F~vXk#I)Swz~RH` znm+%mf15$-81I^JpHF(GSwqJhoy;OV}BN~y2y_RiJKx3n@c`xA7|u%1|f zZ@*vKLkBB7gZu*AxCJA}T2g+K4^ltdJK-ty*a_L8|4uGz1M_euHR<(Jomf8Cs(9m)0aDmz z@*jSb_l)!ZBRV4IHj=W&Om&hXwN}Ey8iAg;mYU@8KA)n&5z1fng&nuHZseinBmpzu z@m|fdQoF4#dBD3Nk9r@+3;sTRh&`#y;l-d)iZo4X`2hXf>}e&(my*wFN(Sal3Yy5a zDpHe*Yze;SRkhuexI2XqMAa?|#7 zFOs`Su~Ji7ror~y$w(@xJ(CVGsG=e7Fs)c~&7|q{`X8xH<&^3BD&>0aa3X~(zw`N+ zPsWauOEV(!$Rp4eqm`)KtEX7@)!b_#Qv(p0yq^0)@tw*TU0hpzHIR&2J+vq0kMwx| z;}XEAegD7fYA~|_&gK3AlS?D4>AeBlwx9#5cWq;GAazlcRyk)c?{5wK?tdlDmr%Yp zZN3{-rG#<&WdR{}AiALi*kU$2J7twB_{L$S9M`rco<>{PY*ivvozO!eHq;uNp||fB z)Aj7rh1+IxoV{*Y;h_kP=X@gK6-NEZYN>-^FE%gHiefgSy}w|&N!oK?6qL+`b3jO# zlWYnt8|2B6Ooe7BBB;12LLcRv-d0cX>b`EX;BWh6%-le0Dp$In%~d{40ipszWBX<9WOs<&JtOb)V|I-%MdqtHgH|_`kVSK|p5RNsoN7}q z{&jwFdax(*%)4X3y}FJ*3TOTGM}&dZ!WS7+j5TexWU4}b=BdFtRZSWsbac|E| z+9B%?@A(lfX92=xT~|mLdMf|ut~Y`K{GWC3Li^9I2K41qDZ{d`5PV;p`|;@#f$Ykw zibI^z-RE=l26?^(b{!R9gb++)>Eile^UO9}W4!de1Lpl#xa=k2Dfr)~x?+dr25sGe zV4~Y=G=>B1P!n3wlH0z^B0@~^Q2HwapJ3eDD4Np#qJR}SDys99`fmhoO&|qHvqac4 zVPw`$Tv`Ys3++FimGpA{ zND}%JL-O`PFHw&;XEq6vp+fMRt@oX_YRgUQ~stqpIq?3j^Z-tL5nc0oD^6s^X)+G?Y7Qwn4n7R?uuCO~%n+c^WY>R2p{1;-@wYz4^(`f*(g?R*zMassrXsm6Z7~2x+ zHc3Ix>v_CER+3tv%p)+;j8xCPX(a!;+^g|4m$g6;5mDxY+}F{hQ%(#A)D;ns%8!9{ zYKK%V^0B04im+K=V%n4iJYwrw^i;GSaG@3gcAc*;s-q{p6D}3TVtY)HHK3ic793@> z$_iKUkv2|aFn5v!us}TUyUJ5tYNdhw?&h@-L|zW%bNnp>eN@>eD&iC7UD zh>ySUWvv^VTZW1K^##sQmxYj~iFgmXOfJo#r}W+&)F_lMbYg)^igMK5!z*cHMG^Z0 z$fh+~s}D7O(TomBd27)AOQ?elT+%eTE!W%}-6r!1@Oy%m%ckErDm~?hqP#ioVYQIsF=w7YBSB?7uo~+zmRaz$q}*i_F?L%*meIBhG9YiP=OQN8t?8TvExQZ ze6(Zwp^H8|#y;^CFbYK6=H-qRXl9Zh#Eyxn9^|Kvoy)dJ4{=zcs|GoFtvi^3 zP21!G2EYv2688pomx+$sPlqaG!Xt1maj^u*xbV9mF2r%j7Ob?%!xW*2g0ito`|`^0 z$U)puVqnoBWRsaJtrF%VD%MOO5C`Wy1KCa4$VinXC>>xRrZXJ?&^%=7wCT+3-qX%a8ixImNsIlBpqS(M{f7;y`$P1eZbJLnZ5PqEKV|SYBbKNwE%v97@~LY zQ(u2U7k=0jEz^%vrte_>9ugC;`dJ!*WEkpLM3m{W&7rNrZ{q7yC70;Ra?S>kM}cgY zX{8UAt3gR*!C&bUwf?2EK86aNAzJjZdXSe7^Q|3(P6NPolhQtx6~qDM&~JY-#$0s9 z00AbsBAz~1EF4S^_qJKH%8~7=qpu!|O zt1`0L8$=~x<8b43(2vkV?320N5?k>#wlv?Xl}q`vZuFaSC$q+bbX+d%h*5=H7|GWT zeOcD}n+A$rqz8&5fVcsi+~plXSe2Ruri;Ou3pWul>U<<@9X& ze@qk-J6U$WPGUQMNp-<#aZhOoTtmMZaNIYy3TG7aV)~iN%|$PlV?d+SsTI;W5un{ktUC4xQ1X(av zb`X|U_Cp&I4D3niwS;o8&CpMU!Mb+TC8Y|3h?pCdBr<;g1dnaelk#q|eQ0lu(Zr5m z3SFns7~u0~#R{UnWvN=PZd)pzAMO1C#R(^_ue?b>yr2owv5=v+ zmQcZ#Z~f07H|kH+sATI^sRgQkt*%k-+O*4bmR zh)OFn!9&k_?Rj#3?XapYnrE{&o8K^y)^?^U45I!&2hKf&&?V|B8&6b`e-uf z?Hnt#(jFdz?re(r&l`6?mU$$06Z zqv;aaLn`bkt;2Rc@TnA*H_jewn)~!UIZz2Lxb!wtmE zzo>c(x2W3o`I4r!P{x*LY>25ISmp}V^q?w9BHeY~IJ z{TKFe?Q5TVo$IrfnJiiyj)^}!#YbcVBpWaT2`a(qVpilvIHGy$;LYvVV?J8iyV^*2 zy+Kq4CXrC#wp!h~2PZcGCWmJ1Z(4hvyW8OeE0)bFDt$LXR~CEDckx-0EZbt?f^zXa zGCu2mMm&R4V>d(V0r7iUJ9gP}?k%y7e*#rerL$T(FnoiktsIH(IXd=RZa;o9P2J5Z zXUXVz2@PaN|B)X6@>dz?Jb9k!$x_xGjlF(K-t*xo$C4r=5g_*^))>?cNC9u?2oNm`T7)O zqZV%xwQj{8VB3ECL~`7a>GG_i?PkGSHg#vweXSQMoo zt{VnQ&K_;C#^>5N*PHTRRua+u#=%=;Mn^O;5xt0o05j;|Mna!v*a>>Izcro(g{d70 zM@#<(J`JEPP0`W_sdkF1=xbkM=I6ZbDv>k#zaIi61A5n2B6KTxM|O%j3I-=B5-k-F z;PiT{bWZm*VwK>qaTw-}XyUXdJ`MM~-T_e2-o0`y%Ifkx&IhvAgCEWoHH&CnW0^bN zvnUT*ZxtX{WUIGrAx_nzKS|2E=y`Y5Id$x$Xy7e)M984<*}`2>p!hI1*2rTos9JUq z)w-^WuockTRKSHafi_8qMT9R^BRLJk&D<$T5=u4}%FE?^S?mQ<+BH#RHE}qF4?o8V zT%oBucf;N281>MPE&`}*qP^7dm(D*3sQhBKN%t0wHpuygXShI%foeraIDOX`o55i9 z3-#g?S5_s}ya5O~txZ7jCIc7k|(};9*m&kfUMh_0)n8uYs6K`=p zoE=fF7QwE*y6IVi4cE3vIBoebHwTf!l*tfFK~*mMH?ux~i!IWiUWq4#CVt{z*|biO z`XFy>LQ&OHh@=yzJ8}U#d@GV0wQISjfseKCn8{)*|Jr8SGpr>XNhYXKy(EQ(>wPN& zS+ksakB`Hr$b*CWH`APLSz&z|WWutc55=fhyR8*2JS)#1zqkXfsZC|&`>(DKJWVry zQN7bJ^-hqUdD2RaXy5~q%2kP|^q(6U%nGLznN%}>{?VjWJwwN4Jz$0leO?A)y4dIV zB|NB2Y;d`U4!!>ej&kXxbZS~{QrLe}nR}`>3>&XXD7Lh|d5r58>A{I;luvnC&5QJ` zJC)&Lcm6fiZq+$+Nqkd5J(i{}5oV0u?|C)I^9z;JmObylm+!vfllc3|2+UjXg)&FX zOHXHMK|I!?W*+Ib)WwIs8uZ5YgO5 z6W~~gaPh+m7;tj#Fu~#{1U6@L{fxuCH=goC(ou)e;>j)xsM&SCc>k)E;y36U+ur{uqAbe(hl7^Wb z)vpvk_mYP;uvYsGn`FSx_xjYRdb;T_whEx?Sr%4d=9>6#e@!Kz z^lueb?Ld9Q?vJ(SOrDbL%^>vw^(ol{FV^yx3+9vs{pGxt8o@S*>bc-7k-H-ZcmcW$8no>=w8GFE zB3Zn-hmy-(1Xwrli!lStj8h1Ac9cLgY=W)@Sb6++iQ53Fr@4_CJ0DU^N=FrS9vkPK zJ+@07uQy@ohqZJrVm_Mtn9>9`c1s^iU0!}E^0p#SHl+m1P~JG9N=y|L$6}2ZOMKXn zX4H$L?X?}i4K9wdXomc#&`6CKV7U+~2RGASwd6tHZC}r*eZEPwKpRxVO6Yiw2gYoq z!^`(X_6sFAXSEhG57ETho)xoQg3sD=D#DT?aFY;&(2Y7na2M-6ghk&W#b1aJ)zk%r z{IKGjni~IBb%l#)Ub((nYsY;;<8ffka=&;af5U5 zlp`tl2F~rF6cy;CN$!QrA0%oDlTvCUHFagyLL6yQ>(Tm_!}yi0r;VG{ zaB6bY0n8`)I|{lsZ@#%9WZU+F*t%S`fujj5>?8w#X(Xr6#4B7aOU_1vu_>FAq~R)Fw1?Lim8+;gc)qjv#;XJ)&pX*<#M= za>mo#8upwe_9YRUKm9GSLhjx)rwnIx~yqm4` z>p_u@$`IFe54^BvFOIfpp49L~1{h^&!`@v|;8t)_k(C^cfwD^PvmjvpM}?Ku*__?* zGha4w`Z_K@%j~CcTmMB%d3QYJlkAxLyPb|y*@&Cwt@Bs;E_Z)!Zrw|w%Fj+yRvlme zeG~oyobr0-edqq2cG0J<)cFB1!`_;;(R_}SN(PF{YfvO)cI$)Ue(*(NT}b|oK%e!* z0g{uQ!>HPo{z~pR_QxT|#zTgKb6%Yn!qzHdn9cXv!3|c#T^ExrPy#`8L7=3z4 z%E$X8^SW>^`3G*I<@|4t17MM3@Nb`&tV^C(#j!wa?%MN4c%5H=Wv9kHp_Gdr!Cm_|{I>H2eR@v^TVKh}1PCv`tZ`9IkI=4Gc)9jV&ka)) zmDO#=5nSKR z7WG2T$=tjR+O#f*wdXv9Rd34P7)Jw|!6(l8{vik`savV!YDqO-*HxOZnU=vM9xY+ zEpUI9NMDCjBlP~)Xh6gytOB&0f_Q(Pjx(0g2%ot{S@lp_UvJPzkrTDr&uVC<)!YRN z6Y+*s%nj@V3rFdyew!ZY`S$Pmif5(HjLppI_oZ@UI@6wArXlDG9PIK3qz982&5K3C;#d(T_g`R}KlRqIoabO$UN1rOfIU7QydPJ2i*<<_z6En2g4n^BvPnE{NuWWp*c~^@;2iiaz`hXKA zM(+>*&J7V1$*l(fGQ71T9E4AZK9t&5?b;48#eb5KcB|J7v%1Q;UvWIl6tS}8s*xSM zUDJxy-@-Y7EJ;k(7V-aS6(*0`hBjm#Tz8$OKX|x6?B!Dp_?>y+9;wc6^i0x$)Nkdf zk;sVp093nYUtf6R+y0~;p&f;Y&e0V$+TD*^9}hvZBe`f}Fvb~V!JLM>jdqN?d;?~j zwfk&RR#rvtND85^_RI!WFUbq^~4VYg0mzN^{$lPj(kpZ?+kUmo4P*+$R`&ykH@{1G$D#1 z2vI&mx#ZQ+C0i^|N%nkL>d*u*$>zRVEmfvoOB)!q=owUV0qvk93DY5catfED4EJ3( zkIZDk-Mv}!7H3(T?#Yn_)Dt!I0-jUnONx|Ze~RuEWT%%j=T(hnPU6pagdfUoY%e__ z!wx^M-mgC5`{Emx{8wXw#gdao2%3c4u%yo8FkGYxVp`M${A65vo{`D+u%A>Gs#W}z zF5fIv!f^>1>obPm4xwixMkDSjm8b^liSB8VO5)9U20v+f7H+Nw z%YQx=jm=<}4ycO&S@d@@Z8*rZLg*Wpi*(CRK7US7T^pnrle;K0i$9w-(Hfj3(o3Q> zSTL2JK2~-?rdJMpb#JPQIYBpFkC1i z`p?E~QqAD)-xqeWj14;Eu}9iEv>d?`qNt3CUTRmMQYU+ zP|d6szXF=HOSt0064Yhw6$p9mm?Pkvp3+cLSGBt++NDX}{nEB=Rj3WGl%;1&z}?AG znA!;nEVR7nfRgJfV8p5zG5=IvVjgufoJ?7nTBKd+cii$Vy&lCG+}7OL#qe^(#CCwP z?p{uNz1GOE>3-XQq7}^iugRj)@UPnW9}ZQz_eGc<>h8bc95V6N1+*`={cX&x^BTY| z8-@y_PQB_jN&y-U)h9}>FRzwp-Czc4*nW_gcYu#cK`kouf{j~$y~V+P!QA0#F>jEF zO7QE`o9pbeX$eCNun^coRXGrwS2g{Rx*@cic`%pb?(pXR>7|pvEy&SqZmH%53UXb7 zr;cUbJy?G;gX)Be84vwoWZ~h(FVN}d;__1fEv7K;0uWvBT8|QSHEJC(;6s?cc{p#g z?;}6OFX=9pQ#q>ju?{T^j3=*q9-o+QQRsCIDcj=Y=Qd(t##6nu}h(TSniFt1!N zrYO3hndx6td?4tv_6)l51hlwDaK!j^`~EC|HJ=l%+S`Y{MsGCzF(B2HC6rJ{(M$|T zzj?Ua-v(qT=EZTF`T$^kdMNdk{;x2}TJ;FH=xs7>8&`E7y_5+2%NS^GS|G;VOT|8` zsi1rIi{UPwJC#vsK@d=r4=?|^r=>{XR@u{Ke>NtmEt!(vD8t2vg?N+2QTFgmJFTY= zVtAw9Wk^_2^h&P;EL8J!=u&Z*xv3m{XX49h@z^}vDX)gG=qAbVu_^m2i%pMpc$M>1 z3LG055j?1TIj{vP2JCbWJhf}}&u*ya7x-5lB&D0WQb(@>lxHqIkEwr{_13>o8Sy;e z$R9){wBw)3Hh1dHi_;Z+BnVXYp4NCFj~duO{0ENVR)2MKS$2VT>hTq&**5_HyMx_N z-c|VTuUGj(b^DDQ&ZTDJ8aj#3>njp@Fdn#xn+Gn*aQKOf=NAQqWoP<)41mpdKqSAO)#9`H&2Z9t5GRqm@s+$ z?5BG_X(s)Bl*?i3`>Lxg0d}4IMnT0dOv`1$b!(KH48_NH+BbK)BvS9q2ih)25f|Eh zPz$w{SQD(_&qG&%&)S^p`ptaN@;_Qt#9eMxK}^d{-ONX#-HYo0m%`9+6Fb`_&kC%R zG5VtEt1cZf%>$IW<;F$Ao(yK~-_#!I7M05eY#N#U4U7Y#?f!thA6Y<;T5(K~@j+H& z>shsp<*k*4U<&<=)ie_2rSykyH;=$%J{7M#o6oZ|S23iv=Ades%UGK=s&az3tLI72 zKsE=9ftS)#aM~$6jn*LsxaO zxCYaD|LnJrpAvvy-Ce|c(ms@+DFrMK$3QVZB7X zf|C#jf3{fM5@!J|15zw|W;@UqY@yhPyHx%xNlX(RBvb}9d3Y_jF%`G625@;-;mLK4 zX~hH`^Hj}kvP5lqbHqnolTfC8LKD@J&&Qa_d+r2n`O?Wjkot4n`9 zcRi|0YKWpQuV|p|G3viAMh(rsH#zh*lLP$S*g>%CqMP=jf!Wh#jMo~$Qc7vFmba+;<{SCTb})BFd_WNtcI3FIX~^0qaF$!$T2 zS+tsg$_SU4M71h8H1z$khHKdE%r_e1b>wVS{}C@5N|QhTjT&f1-birTK7Z8dgFE_u z%0$t2Kk}hg44cKq=m)DD_;y6WIUu#-OLH z>e;va5crt-;DZdN0gPHMr#mQ2(JXL&IEaFM(BWJ0y=J56MQ+b70cx$hr_Irzj6C4W zRS7CtK{0;`!G>xOk<%QV$#6p*MVaPzsJJzu=BeCnP9+-Pi23GEq1i`GwF&J0b_5Uy z&v3Rk%93!6YdlnI&Deqtuh{e>e#LPS3CW}P;lj1rhh|Nnq;qtulKQ%|w!)pV-d;{j zht{D(I@9mQ_8ehuMNX8>e+E1oC<#thQYF*3 z+~@kF?DGdKXBoMN`_lRa6}$q7z{5Rra<1t1pORe84apc)6+{1k^UFR!e$bH0#`w~w3VHd+2!*sDQgvafZ`jFAnag~x zw+5HUF%$wNhmH!q-IT@z)XCnqda(n4U{5G~pd~CgyT%0C@Z)e^kE@C^&=wWKKhL<$ z>z_C8l-<0P9edg}S8Is1_;$2Uc^&gr-&r#_EVsIP2CSYx9_CEBNs&kSA=3CpPu8op zZDCu6Y*TI>72-Xl_rz6c)^Os>b<;iq`>om5JE?M8lw(9_W53w|U~3gb2}wx7tO8Bx zrq}z2`vzF-r7=4zINL9nVbD#~`-;u!`LB~~V`H4T_>iKJ>DOy8h}t>8z7WuJU6gD^ zxwx@MX(f9qT-OGko!7pKOHVguXewzW(szDg2|>!FQ(ABk^6_y~o3mwWd`^{8RAEGJ z(B$-r3EF%H4Z-$bGhEVecTq1NC}4{}rq>5dFPsYA<}v{78#}~Ja_$tEt zd!~bQSgvBC%L4oZfwY}D8Y1uG?=8MN3$S?TJWg-xJg};N-j{kVYb>3A`u=sNYln=| z`X9JEfa%@e4f-iZ_+Ou*U1#H;I(cO=)mI#^u6MwoeP5W!dYx*2@#K7&K_nqNKkK)a zQz~J3#G(Nxrx8Bo4b#`#1R)RY?@kS%lpnOSmZUz-ZhEOE3<>$jCkMVQn`2*U1>YZF zrf`0c#1B&1x8x&I&o?9m?#8;%HPO=2|tsXrfs-nV|1Q+B_Lvg z(5Y}B?MpBW_#cZzq50a&B1KpM6>9dz?7!n2@)~Ih9xSH(G3vL#q8O9K0DOAP$owLU z@5t_4ph%OwyhHGGIP=Gbi_6URgRV6#U0popm z!Vwy#`43aJD7AE!?EGS;t&*c}EU(b5|Iq|=zn`ge>u4S&mpX;{g@AlLzoAy-e zO+C=_YZt8;qAB?4HGbY?I4qCj7Zu;{KiDMq?ff+Fvy+!MK>17VvhEg<*Zs*BaDb&` z18$nVKjsk?Iv55~JE_l82OrbIHq(EMXV^GDIjmweUyJ?&hZFdkiaXW6Z?LsyGV1r% z=UGfz4>6SYeIk#wZtf6OsujPyT-RQ%&_)ivq(-Y_<;0T@$k|2SI3|TmS1HiayuBSi z6FGC$CgxX_Nobn<7;4JhjNQJcn~+y|R_ylKjlNaA`T<3Yl$oT3>{MJOyY5OIuj!!s zkouB(AVT=KMj(ocgLmzrKBGbDnet(^5@pY`n9Iy`i+J~1x*MDk#8+UTqKvY*X+f)) zOlw+!5&zZSj-6isMUZjbMB0UXf)&`A>IM#=D8S=08loY#pDWIJOJ1T|x?mz*9_pMf zbZ}=ASPG*UtLBUsGu=9B&H5V^WA|p`;fAWVCL4 zA*fYceGOQi?Bjn05CR_L|61{MQ!bJvHBaCd@W9Y@pk}|DwO6`S@^if=tP$gjD-3yz zB^8mA*xpK|DXWtp9W7 z^~1YBjS2kCO5NYzY$`0jU4p`_EbBi^>kBok>`(|1N=aCM-KDqg*7gdxg&C<7CGfec z5a!;KBR4TthObcUXHr>X8ss8YFZsn$IfjCjr@Y?XYCW{Gsx|SH8L6zY$U8+ywKIN} zilyh8t~<8PN9;tTaNbTm4~fP{*l$#+(`}qTCXBXutkxh2Z^Y^o!I7+f$oDXH<-tRY zZ2D#b@&bNdv>k?PP<;?&fj9uC7Vt}*hXl0SrLe+>f#}Q%%9~lt=XotdYzAd&jvbOC zj#KK8{c+u9Knn;nJz+x5hQ^?qXPX0^0A#ODEa~sae;XmBBo2o!RlH4VrNYRc#KdH! zr=mi;YZ&Aqc`DuD_u6+jJEOZ7^55)8BC0ki+2w%@-+f|qsK$WrZf5PX3+O4KUQ(Ma zGUFC$w@ORf9Uv5vdbPDj=%s6rl)vrXBYQ}tur7R815WgBc0$-?eiZz^Y%1jZE59zz zA=skbYPx4P;j$-!&RC`H7UL@8V1!R?334vQwWtxPo&m>@bNpCVSv1|R*Obm26^o69 zi7*JVjxMGvQ|6^IEkAOxq&5*1zb;>oub)LYmW6kg+1__<>+8|^wLou2Avu-g?|mk# z+ti%@jqN?>A7*fqpMBCW`6jXYV*H_tA#v*(a$Ur#h(~+YW*#jwEededF~i0DjG)aryVppBy~<)3NWMuu zDVvGi5{c0VGo(-KE9K~HU0+WCZ_CiX15sJu|L~Ak+AMxUfX=ZuLeW-E<@wIwc})nH zXXQE-4KDMr{mIrFaeEa4iV+ro`Z5GusxI=XhuF)Jx8Z4e?RF|01Aj=$1%v~7uhbI^ z&dJDE@5`zk=PpV0zJc(3<1Q`_Z{F#PeCno?6Jo3a*Ltjbw*$ZL9OlT)$?jrCQdLYp zvJ?oB-h{%N+)x>%PGY)ogVWDrrCyjPt_$Q&tiSf zJgwP@N0&G(t*<1>7<|kpC_uGBkS)3q~aj^@!jk8MxY*N z`Lk~8Mj(R4nW7r~7u05Sv*)6xWR0w4L!prMb?4B1@`@eafH;2{q3_km6IKl&uaNZG z?9Ultv5*S(g%XAxM9+jeLLWYF!%~x}Fo8Vc3Hit%WJrkP4u}VD^ zT6(Zg)sfBawY2mD7cmz5=4yzIIceiUU*cC+kpr(kZCjzF4h4;bPJoz!4<+pliw2f@ zO85i~YgSQ02)5%5Lk5~)3;Y3y*)+%fU?_dzIn(`QL z^`tmg=Ftk<$)j6BBgGST{JK*!y0t7--_rINtKoI)?}BcV>k>vFqDAc^?iO8n458Lo zHK{rw%ukU89u4?c5g2ByC)zv7o%B4%vC_K{ky^MM*5(@49vADj4Cv0eT3NJ*8diw( zp1M;+U+UVD4vcWL@6lBrD!acRI!@9 zD zlP25SvJA-VU}01bnEe4GBL1Yqm+Vc= z(phC^@)=zJtyjRNA4WK+&=B?J)rBnbQvSLqj{7a)YbY>UY2HvJ0){{J&0OyE)76BD zQX8Dy^a6d!B{2{bLy#4TDdgy`7~p1Fd=s%#9v4*jUWkus5iXW<`kMuIVnjQv1x90! z3TnwXPR98>j`t(?j$I$yJXzYlKE3Z5=c~w?l;^>!8KI=_@X1LM25~P?*|a7$TaqdG zi(q@MX*1F#4StW?%^IgRnLg8(D~!JsMI}AK>5U(_E_h$N^g*ncJEU-*WT$9h#Z#!S zOJp6~@NKtJrFN=bN-txlmGA843B0#$6CAL3cw^x6S8`>(wod)OI4d@zdnp4wVZ3_& zxIi%`lMn(|#Cdv`CuRx;Ob-q(fREleV__OlD#@!qlL?MbJtg z_TC?cjc$&>{RacNfs;}f3gK%M86jTV=pRcEJ5W|gYq4`+ zs_-P$WP!HLO|!cD?gJ=S7UkM7O))j3!h~x+T%K9&)+v6mu|V}ZsPddOnJrIYn68Oc zy*0Y$(k1@mG5rt+K|ITuloS|W$9PjIEgfWA)QA0j*dAB!>Im zlCUevsinP9F@rf{Zp^Pm+o-D*B%W%Q2p2!yx6D$t^gXQOt?&irZ1&Wt^s<&e@v z8z#fJ#uhK})~As>=Sa>P>6-yOi?*P*klGlsy(NSwY4Ggyh(7$Z(tQtuAd2eh2{^H? zxEx#_(mTXxJ-Cz6(L|6L%})R|z2dR4!|ql~pjChsgT$0a^qB&rspOfjRpKe@_*qg| zeqvAM5-|;?|J`! z$)5UR=hTPCj=K?`n-rO68Z(2|d6stSyDhosUVzE{U%C?%Jp+gayu0xJudp^QW zOkvoLWshCT^T!ySoRtL+m76LvA{ znjM3P#JFxBH=arXwbS$?^3A!t4mp*deRkgM5V{XeTY?*J`%w3T&hgy~!6?u)5@MfTgkY=Y@h?-xjDMW_Lo+)3Q%9jxxSY9~|dkI_g?L2C|M z3p9y3iHVu%YH>@E!AC>fxpSGZF`wbSrANp2`KKso>KIT4--6Cet#A z9Kms+BZg_v9A+ZY4w&ih=f*qXx;_UiYVr|LfsJV7$h0!&RbER@VMXeumdJUBPqQzH zGi2FN!a6+z+4J28rdNUwtUn7*#*f1{fZIGI=IOFrxcxMJVWc$Uq68%jJ>$4BDE;?r z^bP$TuFm!_Y~@A2hu5#hOl}MGD48yC(>syY%Q@DSRjZ>M`Cahn=Q*Qc_V(;3J*b~N zMeHkVHr4qz$cdiLoR!;PSr$g>8MmkCybBf7ag&Q^`uT{9i?!+z2D*A)D73~4EXx9{ z#bQHX;GC(Q?X>ig=!-?&W-I#=3h#r6Ha@a#)%lSn;&LMXDN|X;;#W517q2El4F^Uzl2Cy)-k@*_(XK!N+X&8!iX8NFuw3EbV2(uJ1fntZAia~YuR?A zpEtyYMRMpuM9jr1lK0oiObu^3E30Dp3HUJ#HMinc-_;vE;*Dtjt`iz{pm*)FmNwX+ z*J|6bC0_~$^KC?JGF&Y#4Gfxd!jQu-)er^hc|Y8Qsd2u|xpgrowPr7geHP-!y;<)$ zZ5mvK&?4K|WxjiVhrDr*)!6JqDuz)9SNZ`a=Z*s2J|i7KXK+$O_-t6j-?OAFdZb%h{&yZhO9T+n>Hyu{r&!3T^@G5Ml*sDl(OLxl2_O;ow_+2<6zvp>6sHWywfpQgIr zCOlrK_82maNgQtP-oTXAXE~cf%mWgw8En{G3|4zPM{Q;kHgMi9M)nnc9y-sh#f8V@ zu)`!KMl4b(;~AS&D*YHLvQ>vD9)r9Q>mpiEIEB*m`EZCpD|Uc+1maTI6ixEWQ`x4` zv_#g~63IU%N0y=`s{@h<5wumz1FLLD?sQx~T=*pO;^Nyb^hmYBU(bIvdRN)-sNeot zl&E8?;FAy?xsof++})+p`q;tKGvmTUpRy*n=q|bnJFI!2%%H71ayKVG7`hp{9@8X! zW_~}Lz0hl=?WBi0ulqY+P9k{(_X)bjS#Y$-V`Q(RtxD;?^$lJ^+<5(|4 z>x`-350I3jC80PN(!ETmn9BH+%PHg7@38>^%Ve0PA^&n?ya2ri;&>^pWwgeXlgDSy zJ$Cb?eKDx|B8za??pp{WWYc$QKa*Q7cgQ)vxqD?1JYl#m-V=DIlPTsv?I|LtGeX!T zwZHSUnBs5)`gbS_PjFq4jgS*8Kp(291nXLG{M}lCj3J#X)&LRUg0rcgZIwr9} ze@~=;;1)C6yS35;dJ@-@^=jV7%0ing|R>NqVqK~XpRyM}S-NH=PR0z$64 z*#aeoOkU_dk+J)dvlY32Hdn;LM~+8-kmyWX>Of$FA~) z(m7TZi`=bvlr^63hk0a`y9wS|jaje3L1=~J2YvRMU{Ll6HjX>FkJdNnm+HD@bCj2o7U zL76M@0#A4{paM?0AJp@k)?G}h`tfjXeCpR-ELsx9bx^;QwAOv0IV+sI%|yI*o~|sA zj&O&!>1JiKkvn)~Tzd^N}Apj1vTjO0X= z#{>=S2K5bF(|>kn^&CY1+nu5I7lEGG9hpezIJ6D=xuW3N7P@7B)9YdDSN}jIw{s$# zXJSGKmKQMIMHCNiB9>Upo4lbx5$aQl>oiDVB5~p z&O@MU9#%Ok2CrTH+avNuuDg$AC3`G;0-`@1mJEcK*eYW%7L(RFjFsBfHA!|Q`cy2A z$#?rT=Ws+Zvbe2%(7~%{^h4zerX_@vUUk5`CO;XSEI|TsDt8JYKr}K1xu9;XyIXtf ziCKKk@Py^~opv1UTV)w8!@z8y;x0-TFaY_$otQ*n>>;Xy@y=igbqUx!O~(OW)VSZJD#-sQXUfl=)jN0~ zW^ZYIrG_tPjxO`p(!f|>%rd~T+ zw#->>2dp|-92Ky-R~E%mY!*yT&WLPkLTz#D#xoAxqXnZgtC!sW@9^{IQBH7 zl7V@d7})USiAj`2e8>Ac>{VwQhq?_i-av|EPVSy&8l3eq43%ArEl{g39=S9*Gq`Om zX8p9hxf+P>$53B&!%xl{G?-RZ8KZCTJQvs_s|we-xvls<2Jo z9nFNiCYOg$-#m5av^pXTq-S4XMRr6>IJ(1b%>1^m?uy46F}!e(irp~ra0g_j`vB)G zQ(qKWgZGz}>Bo3mqq6#6={G&$k`L<&3@embKHg6Y$${jk_r8Z=&^lQy_~qO74uhGP zZ2@HoTWnKSi_*l2s5KKsD7SZ zql8!OzO{W>{tgBAq(6RUve|svfr>%egc(?p@Qggp$ z1t@XSMv(HA_LL0syM{&UXhnG2TXh{imLDilXkNp5@@hMb4?iI0uzsb@d956apF+0M zR9PQ3ow#gE)iYeM^7F+-g6WNgKyyDxt_ZNW*&R8)4b*J92=vn8CW1o98uZqe zwq#p4x7<>-R}{k;osUtAE5zSAH6f*{M_G+Tm;8$K-(rDWj>Y^Sy+o9qH_~i1G z*Ib~n$SzFG#~6Bw-P--I?L#DPBRx)cUv{`rU0>Z)p{$Tp>CQl%I8i2Q)X|>aJ~^SW z?`X9-6S$e$_i!Hj$J-ZZlIJL~WfhuRI5xH3(rwFPOV^YbEA|P-bJ?pw?is}$##`+^ zaNKhjQ<*0s1Za^-+-dFi%ND6=OQhkDRhY^s1sFG0K7(==)=MYfQShwI!2bhhvASAw zP#2^;N>yIGeC*$7T+4G&C;tn)sDLt+9;^R=oK*)P`utTk5$R20-)kC#r_OJQey+IH zf$cl*0M(%uEBz9@wT`e&&dZWptyBCWq-T?r!|my**7yUZ&?eJo@8n6@GLw<_zus=Z zKiLyKdbcN~Vkb|2tZVPEX{7w_JR)U}lK4jrE>RH zlaOUK2nXeh;Yxwc7&xGJo?I-*RXasL6c_!5fb~?I$(C7Nf}!Nr)8#NeavD=+Kxo3( zNLs5DxS96*+Zgg3(Ey7Qjs4qTCKM%o?HUXmf~n`}*-CKbEO{E~Qr zSx2SjnfxgGSU83wuW{m}k+oc$tH=eYyaMqv#G7rSDiNV%0!Ax1)pEnI8eF$f#L-mdzA+jyr9^UdO809H?%h4=y6sg-5ky zdJw1`ptE`~H zv_uyZ0D6ToO6}6CA(Wd`o|$qk>R?#=qNv5`hcYwV;gd-tT|XsVU&kAvayw(TkdO)~ zB=Va(%~Wq_gVZ}T-kMcZR!@lv^DQRMKVV3JBe=^})_p)~!US%!vZtgyR};4A z56(pLq0Rd7JX1&%L5lWTw)V~D*Vn$q;9m^|w%SKG3xc~xWzrYTTXrmGTn@ggq&r(g zUu_NdR!_Db;uVPuVA<-eX>xBBiyiprCt;Ll?<)|Q>F2d>d_KX?rs$Jw-+#6# zG7P<`M|joY8#@29iR=6RzfBya`*Jgc+mTE}y#nAarfn|pHIu2&ayqIQi5sakerd8y zUdIU~*D8(pv&Q{K7Z4Ff5V1Pq!4gkRb8qz12cv<$h)m9zc<97Aa*X~Q*$9Kp%Bu_G zwHgTfw^{E?aRTn@2!-z&&Z-uXhd;~Vd-GZU@{6M{gBmsQVR}}|jQMV=#9{%@Gw*>k zmL_iGC0~5F3bGnF3u?eiE^-P<@rkj!KZYonzyGwde_ITe&GNhkHO(R7*^W=CXf)JuMPBhEja(0COOBy>eHJfE5gW^R=1^0bMHnm2#EZowuDa3Y!;;om+1y>z74u(r(L0s{*z=8D=8V*8%!06I6NFHULHS93F=KN z7G?YThWpe0^>xqY0Ae0Cb*xG=dTMmxE>SPeDT*d0FtqN8Sg!u(Hx>EOxGb8A4i$_n4v(<9)`Lzc*(GXOEBZ6qwBb!#B;}?DnExTv4 z1i!Zrc?*q08&1FnpFx80Bt*KYs18e{_^npG&wF|(Z{)v_7njeHNXbctY0(uq)u0;t zJ6^*~lq!n8ZC*V*5$*>SIAn5VZgviAbzEH)u@!5&0sNEl=@{SOr{ADXb%ffgLib7G zYqOI3bg=jnPsDz+X7tQcPF5U8DoUX56g8&oC#vp01PRHx(eAxkb$H*BPrJ4n{XG}} z3C(|pq?=q;`;xC1O=Bh$$sPW#b=gWE10;XJqFcj~jkrs46cH*m|e$)YxEdkHx?c>!M?R z_V~Nq=>26mE0{nf8feu%`6w*0e5LWQjN+)xC(WKsROdLaRW{R?@1?_(ds<$8yN;-0 z2rDrYu1w$j@LuXdeN(|IE@nu4JnIWUBVT3*&%oHR<>=3uKfe9BPEa2ahOwif|3i!y zZ}Cv4t`48vM_pt3Yp0L7(RWLdarmN>25dIAYaE$V{Ao4K83hFwc@^Kk&x_!P_SB}| zE@3&IfEzIZEJ=*FVAa9+=6n>Vz%yTsz~HZ^fx!K2QTeY z5rcu|9eqt0wF+ykhi_7VaR-u{+}aJ(+c3oOO2d>s$3J*-XFLDExnDFWwR53yTpo{9-WZCu>})}jPd)o&M}bYdFW-k?}Dq74c` zT4xMVn{N&6^(w(~8yj_^(`;Phj(s?e0&t8hO$W+cyYbq0)x#7`4!}{4~B=ane8>G9B(RN0qxNEz+tJsvnK;f$i#`B0@ z*(x)R3?YyNgfJRKoP)qw&4!-HZC3lQ44@K5yM^-c8jehsWH8r~N>EWvn$a|2uU>BK zcw}a6gz1Z~r~ct^2NqVxpg?t7T{XKb#$Yu~$xsO&ijJ>L%fHX*i64*}|T4vDs7cf)I0dV>jLV z`JfUQ=XW*!;?`(rHVDqO{0Tu!aM`MWd6WDEvM;K$FN(<%lS39+J9+52ML(hewtypK8#Z4P@j)v4<1NE$Xm}Y`HVh%#u>SseH zg6Uuz?pEI3c`n9(x-_uWx#E};dAC%o*KCh^TrrtW-cO0<$qJaz3j99V)uw=#l=Yv< zM^E!#M!~VDY`Y4+k1ndcrUEJBY1A%eHZB**rB1U9Ru8%i7u2=HLK51-2Cs2lk`~q6 z!NJ!4Ce2mW+SKB*mQk7Ne6QAbQ1wvL*fIRJQtaUREhtm3tp6-p$*XzEN6a1VrHuao zgR~p}7Z?*(bB(LF-hC#tkLH~N*|wTh2f5U=|4EFOGV%{X#}NNv&Etj!4KIJ5Uq z*IH~G{!?sg&Cw9=ME0BiR3#>nPly~w61OX>?d|Qdz$OKo?72cBtqzo z8uQTO=ZYc+77uT-2`B(9$Pc@Gr;sG@yn{y|AlnU2W^ZB$Y+mw<*T132pEjXhkyshK z`p-6P(VMcX4p5b>o|sNWrE?(HV9&iK@usk|9c?SF2MsOgNXs%H@jiQ1}*KyNu$9=^7=h;J^`l&QyGn#2|WE zgsPQj_k!u869a{5-tMoqRe|^Kn#w0@I~HY~ZZhIp&b;p#oBSkMP!8t{(iQT)&q;}u zyN?&N&$6Up&Fy&!wD;qSU(K@a8 z;OLEZ|mSEo!g z>`(R=hP*<}qPaGYhq8_%v%DC@M|}r907Rnx60#cKzF9TRke4N5N3I$#jz$%|ibJ(= zBNQ6*-tcN0n!OF_9n=%ZU=5^D!?*eBX(*XYf2DlppUQb{ zx%<4QdT;ZK6`)&P1>6=&5C zPX@R4AaHHVpi@KzQyU?kaq2Eo7ag9VMz1JOU;~wUBc*duQEl>VS&)w0jTq@oCfBM5Yvc|3Yo3m@x^k&! zH^|-_5PAD!Bg1J0&RZet@uA$=aY%m~7I*n+R=*wNO?2aUbT0h?G1X;55jJJJ%uOiV z0UX?c+VDOr@W*k4Obc^)l8cvGk#VboN70 zG^UT79;utdax}`#pRP_$ROKMPaIwUMQal)NZZK8(d+%cp)22&{Zf(R*Z34r4RP&KK zEA!~r!uJMNB(CN5weLhBo^m&?%XwWQB>t>l+rdS`3?f6SLZBydhW^j#peVF&O$>(| zlZ2~P0Rx~S;}Z6oxFhC|o*Lbal)2VE#C{ZoX2mr}?1%UB%pa$^4pCiO-X3fMKCM?mVFWp+5ud{z_zYGBGb}07q(WYD&M{7MwaUy7=1Y5OJG{<{pG62nj+-LBjy* z%1b|a-YbtjFYEzy=Jq|YO5WTqFb{z)A&=H{0x@<#Nl>#q1PbH9{PV+#td9Q6_yhCk zzo*gGzocD8LMMV3awVqJV#yX=?C!I&iBjQH&Q@9I8M8}6{+i}Wd*LicJwviB?}~=v zu%SGrE9{=RyQ15hbZl6^QXVZ<55cSin9`c zap0B{m4hlR!E+T*_5$B*B*s=mup`c>AS5_YQ>?PD>`dS2S?{X>-cn$p#g6O1==@&h z9AMhxvz3MCA5u1OD4DtOhaFprJ5o8Pw5i!?t9}=j77J9hjs8~2l;0Jj>gTmAuE##4 zh<3qJ+_*o~zXWW{(3Fc-)9PFw#T;1qBMI9>Jc9P;}st?|*2;#S$u2^UGaFkDJ5GdvO zG<6`t6MiadIpmb#S5aac2NLDB$=2vT%JWIlOKM=!x***wf7q;YwUD>MKXcWAp4H*) z^fK~JNBX&zzI%)Ftr%4uYMM?bOAXz`A&dJ}MFyD1b;?5E@T|0s+Wej^(}24qpoHMX zBz%gpP~+-4j>)?z!9<0={F1lZt5$yB4@21@Rj@O%fL4iCKpku?6XZWf%i0Q!e@DxP z@xFQddD4dD;h$8mPqsrak3_aL+%xkS|AC$rWkpBBf3J=Qbd86xC8mL8Jjy?R&7-nQs-DJ@oTz~q7es8JxAxhk(Dg?Yf)Rdx7ZUbLZ4SMTO zTnTL#tL@22ePf8iD^PA8^)74kxn&TRXEo8#?rL+K98%`m+hj+af$w{5naj7Y&~y2> zJN*|K`2X8a2yoqZ>e#msf3l|2TBY=z*J5U9m8WS8S>>`SGg7EVKevlkbrwP8x zApoKcn#hYw!2+rM-b)BXdGnVbN*=YFCHJyEm|Ykc<NYql3X% z#=Tb>)2-gagi{^5j8T&PvradY$KT@E`|a%1eA(j?*lL@=@2^G_ zfxu2UfmUxoQt33Ckb~yq;*OMvGSOV3`C8&1$%aAMj*d@NnONws`W?0+jS) zav0ZT;H6a~tO0%{&}$Kw znT8L$rGQ>p3TCII;O2Y7Qj#6Gd#(i1`U?16XcjW1ZQIaZk@D0|&%*WgUm?f8G3FQ5PNZM}l(XhAE#nQx`UgHbGHzPs6%f}L<9PF5Rx2~H@ zTc?y$NrCzGM~1?9;#hkXz!+|fa)9>)#%4-FOcSt!w95OHTvK^^rmTQWpg}njjwtML zX+l$bw(;sukMj|)^W$6lA)ep4ce_htsg-!0Yv8||NJZv9^okNLxn_>dB*Uwd(FKS2 zPz9Ef4#WYfDJkP>o1%~0KLwCcRX8ghCo{<>L5QU03kHzFoSheviyMU>k_TGQgF9?E ze(V63cDNf#5Gi-B@0~%=<~RKKFTXZB4Ig@~`fe_{P-Q{u#2}>jK?fp@3AYiWE#B+v z5)-qqiH+=jlsfv9;m80el5FHF+=v=$0|_5^ds&Nw0dcBcW7Nc!9->8Pylt)s>Q4p& zi|Xp3G(ye8bs9@)vgfT^Y;JHF+U4K0p8-@9;S8&WEfTQ~X(4MeGs8t;LeO9uibC(B z3S-kvLysw=yc`3%xgaMwD6t^!cJ+2FOGH?lg8fWlX!DJ&LVb;x$iAP9JYGxN#R32LT{X3iyQHe4niMpkxIrKmwZt^#r%(XnFh;&s>g}mtOoG$CysqbT)m$FE_Lw5r()HEq4&IMQ8^&4w!l;%ia`h+<+lSo zPj)N5{>JDm!A~sbgrq6`M%~}hr0J>PQEg?Z@t*ko2n|Go+!Ae?dxB{C?W}iX^IYm36qE zdH=ORN@a7A<=xnEMkskc2$$-oF8uUk_@^Z1cY41GnLYrQ-r?8(926F;I3KvlEeq5Y z^UvgM-oZIL1g{4ck5AVbro=|8^hP0(WyH-gqqv*#wnyPmU0}#4Ox3&UIn3EWrA3S> zNio;Ipl9jfz2*KZ{upDhlj93A>3Qrw6D%Kj!*$OGA4Ekvte~x`&N*aJkAn!pHGK785&`Le+WcfEiz8z!y+G3tng5+pvs4HD8*` zvm^8=&|_%Bi5taU=~i?-L3`-fJNX zN>ZRNBx?fQx;5>b`s-WGW2=zip`Qgx3+on467?-Jnhu!DfyoCyxMBT(}T<-oofXYz*n;p|Gx{P5x;YY5mg{3}nUx5CFnTb1! z6m{dkaN+vM)mS+OXTFpc!wOZMT0slevi9!Vfx(vO-RI!eR2#fgKX#{?b{#A=;Jj|I zZh17$Uc}qYq=THE+80dRNR8SZvf8Zzn!hoV)jerb+4YoVW)#?X6cbO?jmRiV)M3& zoVoTdd-q=NRrb(Bz2WQjc3a7n7E8!09*3tFel+h=DD{!qZ|s@J!IfY?ClcBldtM`= z0ld^>Moc(;Ti;GS0(DQ9WfI?{{`&$LcjVmD`Q@IclSmvxiSX}RGHxdOK8YYCslPBg z#k@$`B>Pz2H4kNazN(sil5Yiy*Kgs-jWzFR)vpcaXmZE+J%ctjTt__79O{lD(gzZ5 zMj&y$ml*D|;MpJL8Ug}M{4D6ES~ofjeM!+q5S`i?_%dm8>ZSvAl&JTr-qNp4$6Xt9 z@ds^gikA<_{NP_+?&jS^EgWm6J>kJ4(+ZN!)vmizBKX+1AVhjA+M{y)TwD0Eb47E@ zJ=@eIw3yeeA^_d;8H_SUS7T=fNr^79#-4Gvi0YbZl4?vE6Dj)n5f@2MqF#($oS7hUMNhbk ziqA%zAFA1E4>|3o+bw|nZ#H(jP$}MDy0T^(OC&W?hMp>9DzqpHP@~N_#MQYrA5tPV zEGi3cvI@OTF;bi|V{g07xo$YczB(O4=^y2`DC!E6V@~M{hY{Xtx=rew*OS3hQ_yEQ z9g$T^^{EBm= zsjmevJks-k`7MA`<#jb z_faOz0+t${3kGppb=~A$iwT9CFWpgs^T4y^T==fX2;ee@qdNt`d~A2cR;T6wlz=i# zCeoNculcV#pi27xl+!S|heoFJy|p+R#}}X8pL#qQwcoygAI2cM8K4mYgj5yB^!IyE9{+LViqWxN&;6wZg2u^ z-VBkBw46u)XR%~A0#+8AAUZShe zS@kLDPdvSLpCSLJG&lXFxZI#PRT${RO@CqeZHP1#^;L&rIu3_`yr5u-L7D!tm`EM( z+d)hI*oai{vxya}Um3l}%1HEk^KzrkL{FQ?+Se&b)S zr?2Fupxa5${qaqs2b#6A{!wt$D&?ca%8$plPil-}li&*aGo&1UYle7SQk$Ygf$rN4 zy)a}TZUgzdgwOZtmWhuH*{prJb^VZy@JTYS7 zvC4wa(L8hHS|=K0*uh z8h+gV56tuSegD%gL!idrbzL4aqu0fBdoG;t8gxC{n5;2FQ=%>uA7yB2qcU8SFH!-k zr|$#0;EW;ZAwf*cP2OGY*(x{TSsnT^kRDnZXYvkNs0QMWrfE!FSHqyRjK?O!Qr0@; zkLxu&A?rdpbMuQy=}Y;J*v~xO8F>J+)?3+?mh>Y%5Y!Y0%b7QhrR9cF#z)E+z;$U~ zc)d<&T}{P>UxZ|{2dOnMj~qlK^+xVB^r`uJ$uKY7O0LdavZ8(4?7-GTY;#aOG+hbi z!2XfB5n%*5E2_~zq!|)iSSraLKd6dak4Sm^kiC{#l{c_9CIeTVhq8||?QjVGn#7+sQJZV;@`b;^UuIB1+tB?m_B6kcNp zw}@mk$lViFr3Jxv{xc8At3{7?ER~ZTJ9;+5iz_p_VP&B zUzp$SfFksqEa*j_&(h{sQurXap(kMy-ulQ5(nfN~PAfA$z!@TXNkQW^TFT-!MUS|u zs9`S&mWxYaYWF?Y%nz!TkeaYMRk{YQ`Z7NkbDcP(i>j{*sqnm+wqwx_$=+Ip(x_+! zE{OWh1b*Y`Y+w|ZJabwMrz4Kt))5Ju^_W$;d|=t_)RJd|l~rqh;tuc}(r@ zXyoVKzc30T-l6Gyq)}?Y0_-d33*^C?y1IABVapviZwCRFoy#u+XZ1FWO=LNb(FQIC z$n1Z%IOCk>Hgn4iGq!fj9J!1cJtDg+{%GaEmNAk>`X+Q_4ek1_r| zQFI7||9dqq^vWF^hdqIBQcO5X9#R+7^rUVB>$bZ{XO9tZ8x>&1sB-;jBv&&-H3w`e z<3|5r=#+-X+5_}E1S3AAXb5{@=OJ&zyKxcGeJ!aixI{;6%B2!~{#m{*YmVt9Z2&6! z3!|k!Y-p&fWI5}wsuHg1Sq%DPV$r!*K*RH9qNuMO8a=*eNOm|^UbNpXLg%V?W2L~% zib{U#0Z+N~q4d}bNhJXQ{hE!sHf<Zj~EF2cuoVM``HN|J%Q66*#{I2vgkOG)9| zISZkuJnJBm=2?dTrZ$Pxw3C`e{3K%jB%aJXLusJ8vL{L4od#~W_Rl)q5pI(sj-`C2 z(Oy`&j9Hk6lv)pl;b2V-Jn;;?LB%zPw>slQaFHnD5$Ct!y3dXEOxFAVL5`N`|8G3B zzXFGz@#0R8QcK;g1|OaO7gTUQd}wnI@Ku%wm>Cb%2mI7h>Fzchl`qiin_IE2by^gq z-rrO|>`$NP)9N}nDa{yc`014WK&M6OPi-9SUy)^=AKdeLnYxhoY4=0*2ExG0&r{)J zE8>%=eis|W;C+E{^zTC}Mpv083~(sYH;6;|q~F8+Xj)hjGsV26^g3$=j|b zOmxnm>2uEQtAsG(%vyuqy--zXL~ml8K@^XT3nfq*k#;-qsRUeTQywUXf~x4&kOql^ z8FESogL42=T*+5<5SblqsC{~CP_pfodwC^+TsgJ-rKxX+o_!xlb_f^TVa^K?&8X; z8iLHvb=me*0A1e*S+9J&zEQHM(G1ZJnQDy8;*ma;S5T;Kl8?O7Irs~ckugob5dL; zHnxW?{0A7`sJcfpS@&~QUVTEA2{q&0{fE21FqJc$4)yL~f;1(vB#~yJ6y5DQ zk99GhR<;wnnK5xo%^2W~UC(x>+WC)Gzcg{X{~#%oRABwpO;lmIf2YO-oTd|v%q+01 z#`SPL5*T`3a+S+ZSVy4v@jKG$N|W>O)iV5$O{CsU#tng^okHl;3Nj@bW$yrHa#OHY zKnQp^8G1_IK9W_|Q)EggG^&)09X~B=)5zHS5EvlH$V|nNRUNmS12$7BGTjQ9tE`j} z>gX7}7CfA)>mfUkcH?Oe?Q{*vaO&P7ZGI)!hf>?m(C|)8MLQRQ;v|!)jX2HZQ~OwM zD^?}+X1E;|U331e)aBWE|9&RfDVyX+YJXwU1W`Wi?MGTsnMKm4Qr=;Yq^g=2(vn@u zgm`$XrF<7Ho{d1`zpTtIyDcy<8Q3-#k(Os)Cv~)9tz2ir6!&wi7wimyBv~{X*szi! zYd1PB$-L|UY?W(YGQ*+Hfu1>_%Sy}N-?W#W65DEyP^}(qck?oQmtwT}!M5gsD~U`N^--!0w_% z5g2(QZDJ1c?sv+lZe{U^x-I4c4)Zc~mi%;-b)+g~f@moROk`c)LCGmxH(l`@hv9x# zYiF0Q_+0R=69OesMH$OEmuMCtyG$8QX+t`S@X<83R8&>vL67|kc>E?_wM&GV@y_V= z8H1KBx6B9fcgBpISV&7Ej#9J-&uHKK-uXqu$Sjb<5db3``c{U=SeEidlZS+9A5x>d zeIm`LVJ(^7&rP}4hl@iLbUR)}l%xgCIqNj*$^E9qS_u$zY94am+Lq)0n;~ro+``4` zU!yU``eX1z@OkM3%jogb2pLwosK6%<*Nf-ef{&!INBN1d>swY5G5+k*x~Ih?&e6-u zf)tKTy|&Rr58v0^`Vy&ZY%GN|IFWhi5zD<^Da`6z^F0^FaT3>@It2|7u08_wiqUDh zYDAi2yc_RsyXq}Wn)6(AZm)~vIvXg;(D?0tgbAE0%pePR3ltBQm_=M(IyzldTYp@*!dBK&&ZrVH+{; z*)dZx0l@K%7~j`R!9~IBs>KZK3br)$&0{8RG+48yFcd9v3#lho?L3F`TXf{lUEMiM z(chQ{ti*BBt{yJVg8h6HPgopV?eT_B8ofE5_jU#)Rsy>HYO|$|zNp7fHP%Q_!(eqH zp6j8BiKzRDPa>Y{wom`6X#mA-pP*%$^s5KQf&C<4r3gEYJmx^=f7;v&Z{eQRne6|R zV@pax-t}Gz-&`v*iI#_j47<9iZfQFuE{9toA-zE$7+M)|8nc?x-wQon>mGO*-C)lZ zF2KRHl82&9W*ImtVA@QPD&srnF%cCyeJ+j=9vAxygY$dlnW52L#SmuK$%a9ju)Bn~<4Drz0#9hu!pI*N4`x3PXPa<`+NJuG2mR-kjS`YqeyWp6YqJQ&duQ7~z%%z!tiUJhAd(u7g z?s$X4)$#e9)H?hfT0LZKRk`0Ka&up+N+#dWMmQN0?ke9l=BE|qRwhGeP1*ETuEp}C zS5L9yC${GiiE;=rk{>Hbt{`S6N+#~DquLO&0YJkjEuOF^k-^6}nauj_ND|&FbHh?! zkmZsf$qN{%WwgSDn|u6H!_zUvA|%;@3@SuHa(AdYFl`L>VuKM!7$nC|F;$P)E-$Im z*JzwsAxWHS3uO)c3j+-H)>Ic5+8*I*S?{$Xp^HGipg4({3I5Hd0zn~CLY(H@z*j}0 zMd1`wX0}pUfctL5Lbt-&5KUpZu^CflL>B^rpKx$q9tnm}IDGj_L% z$1HcwKidp@K!mV0>fD#DlF#6s(vr>2iM?#b3bL!fBhCWZxJt`=J;v#gPjcam8Z)9< z2~R^jEBrN3y$M(Ug9fuy)YDP=VetVrG8hEh#5sp)0m&HS^WlVf-=ey{bz**(zKO4uE;QVJUqBr(Q-DQrTwuf z{65}!0cOQie|N{Vd&+uUAo&>itvWgyJ$U!W%tgwOHr0x>jEE;nU4uSnur%(yi!L`z zfM^Xm>`8{%p*Gc~`MV@d_y5u~t33XnS^a;`oFAV>26i1X!Wftn{=%%gEb@%;KB@Sb zZSLM`Y%M`wCucZNA$+fs2FWhw+()^HFFE&Gnyd4uG9t08=q}3%B?ShIFTTMhR&JV1 zd2j2*MLcop`Q6>aR2fTel7$BlHZMyj#v3uiK)&uYox7LMgnH`e;HH^Gw2vj)R~*+R zGnc7ALiJB3y=bv2?+0(wwsKHejJtvJ>)R+rb2kZv94^yy>5O-Z*~v53hQ3Q!a*7~p zcw3F2<$;;!Ye<9@lg=x*qnKW1=g+u?51V@iBC){~`zS!#3Fl+}*QLkTkjn{TSHy!h zUp<^(EfN>~^*+VmV!gwB%!E8-E$wKd0E}gWtizu(4H!*`4<7UuD+fX*=S34CyG^0Q zZni6oxi7}sFCfd%ug>GFgE0yxLr22Jb^$EuLyD=LA1a5|hbrAL1X}GqoDX%SO$vBJ zdH%v6%uEcKc&Bk)3J6xmF4{#lqdBZ-DQR^Ht8+aV5&nhwI=}zoE5q*y1EUvs+>`=B z)%tvgLSEdUM^*QUO&M$`MF~8{jeT7Ac53p|{JyXvjlKnR_b@8wq%7pS z6t|k8WfTv`&QC=0Jo|z)%4BLQVpT^!-0mU-VXYP9!+X_79Vr%vx4x|LncomY#P@$; zteKbo`Bdh0>;5TEkygg0RH)ZZ{^j! z1S_lat}YVg1a8LoPm_$LTuA09zU-}TMCA2ide3C&?+-OErDu`-P8z({ zqMT@RbA-78sB%KWtP;yw`B-;{lP`U_mTflcjUYQgU{`X*!HT#U`4_R&JvYFS^GLKD z*#P1_*kzJ8M|ce``p7gdw@*mt6qvx@ZJdVgcSfBuoBu?tt^dS%&$twNwB}l?Rv~*^ z`ew5UkIc0h(avfqMHV-)qbG-t4f0)9jxUtBJN9oWUd{rSuJeK8_~MwVNKNjzvsH$^ z^ThnwcN536J)5U?yDYYqfH{DseP;XR&|G8IsLCB2>Z0AT6AH1W#|88rXH&SVZDb7*xe&K%j<(r5?)&XUpkf+S zz!79@g5XUWbhritI+7Ef!Nc^M_1JQ&^tp?}7md!uChlnxp=yju#OeL}5?Z|cWhSm+ z(~5lwo9~w2f1?-C$%@a=BaFmH^+T^qAI;im@dZyIJlEGZJ8!MN*G=B+oS8%HzV5L4 zrm5{2E{;?DQdPQS->I#_NklWVvg`avmZWH?AAD`h=15tukcrKJa%8`X4`|SwO-4bj ztVTB*^nk}i6soTcl%t2?wUoCpY+FdwxJ6X+!*eCJ$#GO9``7K66<$*WL_(cRWa$v^ zlJ%V|$ct(3n+RlGkZ`2Gx2yk(osBcGjX2kIZn3?vFZ0r(wjB!|B&AOoC}-cZWvM#F z=!(L%Jlv`g)#6B4m8NG<1qxgH<>k`POB&Nww5I=QwThXuNS_}%F~5NP^^AK-L|PBcY0FCbPR>2G*%e; zk1<{GMH`;q=|-A|FnQLV>;`%28Lzjd3=J+p<(4_if3_W>Rto=eg|wn=cpRe&!y3F} zLlQ*UJ9%r8Q$L|li&{%hk`0be)~og!c2b@=(spr}*=86bl~Icb+>7@U7ak$lBLSd_ z7RGkvc9It3ZlJG^&&o;NJI(7X`C1ENDO;=%{Hk5~^nwI=?InMEG0pvtvD4CbNS>4* zxjGNRWu_*9((jmIloZ3jf=>{Nn#yJ@P*@V)r9Lz94yQlPgtQe3v>u-w?%@IXq}viq^k#s)pZ+hD-?yBT?v zsInvuIhjjp3Zcf}DN2PQPy(B{Gret=R6D{GkP_(F*ky zc|(Jakd2U^*WkU&y8_mzrKumt=sNZ`+&j=dn^>sv2 zCFZoof3I!OPN4MA7-n=ttQtQtNlM&vl&2eN_&=4NeHXT5z@yoyD?C*mm(Sg=Dlr?( zFU3+@)W*BaIwWMh`5ZHEpYct)vDasoK5Mc!M9Kl(Xar^}PNDZx_$89Urp0z-5Rw_W^a>WZ*UF#M9 zi8)v@hyADchCN}(c!veH5ShLwegbbGoq8rcx7l&xw7Win#8m7vTXuB{gIZRtfQSkU*KFJfS^Vk z-n&3g!u1pLjr@ z)%k;SNs@c=Ia}}){3-rNL?u@tcIif7YzA}Pw$4Ejqr;AJlx|&c(?aI)BC-j^2AJfB z3tqM#kwnM-%cLb`A;0ipv*n^c=>&A_OntSxSj4w<`?T~@8ixm9?JZ!2N~z~=;ofvK z@8cYkL>!R-CPDutSTet4)p{WZ_APjPr9W9f>LfIGBy68dCCE1Mm?? z=#zxm9QS{QJLJ-L(z&4SKaY1WiNq46w=~(*`4jc(NW=;9$j?@qhk+`M#~czqt@uAU zP7Se7Mtw3SJ!v)a0n3S(iHpxukhlHA|HebZNMT|;SpFMr`Z_0((Z$%FkABM&;A)yM zp^NlemezQie_%5R>FF?MA}kN9!3@&re61qbdESTIKR?XC`9oA%2mrUnAlbr85e2r* zHSU=dy%~BO-+YlubC>7Pw%a}s6c1-%mWu? zTIZJp(mP6CH#`7 zr=`|@Xi*wIo>2{TMJ5a;-?j@i=6q2$ZF+I^Dm4 z5`0E3RG8CcIus=w?tBaWc;lyvJU}={`;8vTWv_c@bj5=iH?)-NMoh5$$IQLhxJMlghfW~rCjiljf;XZ(cB;Mhzo z#rEJtG{SZ$tTE&efxs+Gbq0WLGqMVE5$(;FN&O9p2NsS+3TK!zO;GV()eNkfCh8cX ze-yur{_Y`E>`P5t!Kqv@Mun}p;p%|0^|;w8HN9!dIdbm;w+feO!BnY)cfd#p33GdT zX2AOqV~@Sa>DqVnTDOh1!wFln8=nvQTLph&VM`zPHp;+wpbg_0eKPiSX2?yE_Iaq| z2;6|kbHaCLlrt-UF=Zyva<}t&ZN~(fZY7Y3Yl~5Zxylt=@Xu5D2Ed-W-w$*EtUwHB~cEkI`=~#CO-i3qdc5s2{nDT9sr1KGOFw;F~NST^jaE`#GAg| zXBejwXG?;?_TQ~8aP+!93!Xv{ zAe2wKb`Ye@DyGB0r$lh_KiSi*B;qWg_$}hFgT`Sj9relIU#$zDUYrpQ$pS&;)ayhg|mCo z1x?jD;SITuj9#qtM^aca)6iBuU-^}Ujst&BOm41^APV&Q zL}&)za%Dn1iU)5L-1jpMw0p&2K)B;52)De|RFPY^n-_+*#Q84GZZT?(x}KXlho{T$ zdR){%l6sssG!&@!9Nt-W$T;(7#z*ZJ&whs5Q|})pxG-(QU(_Hak~(HjjL?wT`k~Z8 z6h&G-1*52(R@2|5b3&S4xyBk^7v~z+N$uH3J!AIvqnGUAr;fgy6-zbhtJh4A0!fY9 zOFyreTEntshlkk$!ojV1JMY*qgbf7tM)QBHo@WF9!U&dDG)!1HzbFp9*|BJG>|}(y`$?9S6QVsF8(fuEvfmJp(tjjoZ6^!lI*5k%<-($B>vX zASr?nl_hmCw0jGEZdF||DhfIc3MQa|Va8s`3Ap&1e(T{EoFsAdS?=M-8VQ*r9eP7VM z32?pRKGE=vB=jUw#cT)H;THA8!6MVPvFj>eOL83qoU%ZAUB8Yy!CJ}c9;1$W`2ZH< z3k+n^T+rDR_vSRMZ|se494rs`LuG>HJHJvqW{9r&J=W=jlqJ8vi1YM<8Nbnx!%rUE zVubwwGhX}7?+x)io$m$xN*rP23s6sM=~>4~e@Qa?r$^NNBMhmuDZ2{-?b&+fcF|Jm z86HV+!kh%_i&JhlrGwzW<5nicW9u9zBCGc3;nXMUyd>(htAUpDwP_riUhFoJcq}W5 z)!AxEC>YjWfPUl0;y*SWI!+rUn(dZT^QI|elgAny4f&9bq5>V5m$uFFed(*NJ#w}2 zSq@+@#I;O1?{v^5EGZUi_s?z-p-ksB{56oXb$Lnn(;N;Kk*12Sg-&|npW^#?>-X26 zJw?{S7o>g!)QClPPUAU1hmBqSKvsD0$OshGL*)*t;oB!oZT;e z2&@z0!tm&HX!gsm>6N6BLSVhQR#$e_$r!~`(#4*_(ZFrB9r8HH7v*|mw+~3#wP8{ zE*^@Ou7raOccPkQ+LBf*vA%xenkChb0y%LFurDuKD`2=63e2H--tSWki)}aD4Uo$x2D5zn&)orvZOVg{`&Og`i2GdI%#+rx-&0Q2 z$=s-u5(H|=;J@q_akR`EIKLBozOeed62a)rcCBn?us=M>0ET3 zQZB`s*rMH_7}5bTGHn%nS$FmByMK9={H9j72E69i3b*#@LeY-+%ISrL`MTm-%;pO( zi(N2(Bh0BSX^nhN`%)=Bc0nsM?oIGnF_&FOeL)(6G}#5| zz_H|d%Fd8uEk}xC5>0V=j7pI9Jn5#!~IBqxOzx+ClS3xd^jZ(T9MeD<0_E?}}&4w>@`o^(}8HmNN#J>@&=by$&ZjOm}yE=Y}DPEJx4v9wgIas)k1!tj~ z6?HeKNe#T(ABw3udPzeO#NzIDW&n=bZdMo|eA&W8DPdVUI0V2Q7);`)5&+8~uEq8j zW((!w`&UoBd|jOq`F>r~l_2HeFxj6BI#VeA(BOA#)6-}FA9HUN6<51-jgsIH+#Lc0 zhv4oG!QI{6-Q8V+26qjOyGyXf8;4+xJHg)5Ti(6D^N)Xw?_8eCb<~5$JwJ%jDJaJ}r}eVjIs96C_UQL8mPs4C{|{nqZ28!Em`!LeGlD6Yd2EJ( zMPN4bFwHTKlo06iy8FEhhvdt@__sSSMsrb;UEHE)1j{XiT~caTU@J7)CKxg=fU=Yo z`fuI?r#jS0%BR+3f+LeQPh2rctz1U8PFKMD@PvketTgClr)OcNbUQvlFhq$w`3 zKMZ!;%oq@)2oWpe^Q?}`8GI_|9VZ3cZ<+?lWu!F%`a6b~oQ0xaPxP7iRA2bO`C>1u z^||WBtzPl*RN;B3*+?W%cQ}PUo_QnXumBx0qW!!i3qi|pE>{{)R3}PKk9XnN?M*y? zI~5y#!IQM`$#CGJ0I=={o$yBl%7(H4-X%nYTkRtAojmi8@E&7~ZiuMZ8ej$#De(qw z5+#l~wVAp{)a6lE^)jrB(g1IqW*QsN+dBpmIg|nv+PJ2sPbs5=p=_;dV+Bt8?ofb& zUH;H9M$slY&qquB-*j}MsxkuYCqfVGn={`jE98zm0?R5Eqr}la^q~fZUbw%1uUwGf zRO86Sx9;7~!bq~6ts5%4P+F05Z*Zp>-*~(QrqH}yOcW}MLRQVjIr*b=g!?FbR+;`LZ@`(! zY&lCGG6T7>SET;nr8E?{-j((ioLXUL$ABvTts^=*{8BBo)j}|Y#O+AMoUnr5`R8r7 z+t`5NJkVSyplEA2T$b| z*uyX9NTN6?0PXW+6f~f?b?wC`jmTMn%q;6d*P$EF;Os^{eo?h}tA|9g&UA?{nB*9R zGaoB0^m$ANzUM{jsp0#I&7E3DXC;HrVF*6&Bk6YRQprX9&SJrN0zhU4Z^)rN_{V;P z&-q12h>G1;@r2MHqa9i8p!BOhjazL$cMmrLxkg7#H z-4^k_8JcEF_b+u;bz6n@dJSAT1g~oQ?xOCcQK-_;m5R~Xqvx-uHYi0`BUqEu!C`I= zXz8e+>iEwlD~F~mjl8_^eKPGa)0GA2G`3~^V<-w{_#Z-(Nqg1w<}PF^3|W_7t|_VZ z+gOd3ZKL9A`WqWrW6NU*9+fiG^}x9@s!XH+@!TE&JXQydji8HKxPwOoe4FzmND+Ty z&6DOQ4z);ywcHHr3Zw(t+8ZY)imk<^nRy_01m@v#)%R%0psA$%@%-$CT=eW1uwC)C zv)|w_38h7@BFVisp7Tr<+drCy^0W%U-0On~7=KHy4o`2&Y%B3OkZS+BK`}>V&F7*0 zO=CsL1=pb37TWQGTD(zlblSvcF^@;udStcQCI)x#6@^9RckjQV;sq^7c<+?@qj zA^$8+nMncM0#N!C5Qt~DV~vD~%@*bZT0;)MWN#0KY;aNhf;D%f zo7rZ}d6wbSAkupS+HD#ysbnE9e_&!{gh^W{=kut602ELKOY1-wtqT1?k^yZ3sR`M~ zy`_iE$Cl247pJFpGbWak16ne{92X0#_ooJHMV3WnZ-3r!&#@8<6!J5^C3#pQ&J2aZ z`ZuULU(*%$mDOK{&nJ#%Y^_i{>@myR!qV~U%RuwooV@4PB-HqeV8So^HBiBOyYIvY0{dRd#MJHnV0} zJug*;4kqVwlY#ft;6W8&v;^!29m9}~Ff+8ck!2t$J5Qx;m*;c@KpUr@1vS~Q>GGE-Js)g;uJuP@`=p2Zgu zDFtKTqAO|anE7mFX2cBIiz*_QP%4^=8JBjw#En`&>gV$r6pl5n%>u`9wkmh3WOERP=E81eW8(-1WtD33laQ#h9gh}|VO=JdP#%;Uac6Dn_SBGB#I`)1pz>q1!x92$s!vfZY8$SseWBP}<@ z-;|f)zZ}5RH()iNy;g~7xWhbg6LNJw{udOo)+y^BM4(|AI+|I)X5@{7#gmwl{ZhnQg?s9DAZ=L4TDy zb?}^e$RcwkDH<^!FfpOiCcB80frz>Z`ug*!+F0hWK#|nmLAY=hfwmmF@G*L%C-AN= z+mwYPrV?QJvlaDn-2|L;fl{baIy)B%2`j;mZb?bLM`PtM$y!P(E2U6eLJGuME~Ad8 zznhIvIpZxI71n8N^dv_`;92DUnw7&yp@@O?{5#;n3H$4za|H zD)bvYpV~Ja`oEyss%qSuGh^Kvp(g6l`b>G~SIratf|_zL`rMEd8lqjl{9<0#$A_4i zxvFYLZH&G!9Euk<7k^Y{B*2mpQ8#isKKS5ixic_E^NcohZ^gC?p2c! zpw#7q3FOEfkdCaE9!c1}+qNkb+^eywTx97-A7&*>&J`ua1jUP!1w3`OHXm?RmxVr? zuVS3}l9=k%Q!~H#hbPol-Vb6*sTbur3bN-Roy{)JOgDO61Ql142q^NG@6R#0EEAh7 zdHGEq=?5jvW;PS2Fac%B14+ZkwPwGOo~EkG8oUY2BgLXaYrt0M8SRaKo2r@1x8V80 zo2WYfJgL#eiEtEC@oQaka$0)O5ni?6%h3T>7tz+Q`&#h&MN$3+&3 z?Au|N0{E*~{~oAMY17r9xIhaXWu-cP`+n(GO&^Dpk0~>Hwv+wLA$eCU*2y#B*RILqoMG23I#g~M-$hO#s4XxnG1_4`j<_qhxHBqS!N!_2>+{PPPNbhYA&vHzy&p1GEfu$z_xRN!|_ zDqg-by1aR)^(?nPP4@2|pe9l}-zf8P>Wm>t);tIdkjhbgElDR%<|AzITrkm;!tR8} zuIKuF?ywikmvV5gIewpruYQh~TnSJjY?%J4MXJO~bDWlzcCVE-v&WiI{ek2N8E-*TR4mHA9WZENm&lkHj+jMZha{`YZeD@wGyFPhjeT@0Nw`e?XH;~&^fGpD&L-A# zXXixv$s8F7mgQM@bfqvn%+ydbvAks69Y$JMNr!0E#u?5CfB&3X67fqT8(eIDjnw3LKW~hU$`dg`kj|j z0Zc&7F_mMk-LOfMHRFJ4^X0=fYeNm@%Kt!BU1*(?fOls=B;8l-XK>fWQ1fAhh(W7ynT zX>8sYUo$RUB3uw>b9~k%S<(OfmzE~YFrr;MO~ETIWU>a{xba*Lke=-Sj(!;aF6 z-^)|8pqE>i^VJHHZkRv0GDr$}j}2MiJaeYVf0Kql|3NJ3{GUb~7f*xHOZ~?2pS(&s zBh%OAYdr_v<7(g{tq-obw0;F?XyAPVN3MSAFf|l~cF|Q*>h1MX*I|DQ^BUJBDNdiq zpWa{6xd2h>%JW+OdIBkOb*_$|f~${4*I=W5ldXB?+$>npPqRe&o;>DiFI*5)!6x4t zTRm$u(>PcTmUa0>zQZ3^n>w%SaOEdzYr<_ms(a1;S;Cv5aGdMXRgg-hQ1U>!6Q0)+ zpX2NO%3qsE3z>l9k8P`lypSB8Z@RaVz5S%|jfB6ln0m({5qv$sRkp|TQj>%WX8my{Vmmbvkzvi%+bCac z-@aP)bxUGsja_v$SnmAl`KIZ2U>RM1EkLrdH3pbXt$m!F#xVNv#1^&y!UhDG&tpfz zhfQ-WBR2tEz_hWF@Ph@(NeOd$kXhE3=!UCTUhCu4zo0tK-T#83Qo*@kf#Ha^HwCTS zNn#k3T(y0Ze&#yt3`(Vq-J6MQY`P5{t zZz(qhG^DZZK6S2Lk9QhB&W17&g?WlP;WD~3B_3e|L+eflW7TTgZ2mcBY~`%;#_qEp z0eT}8-mwCz$Q{qUwk>JB>Bb;MpaRE^HA;;Ok|EBaOJYgYaZsfu9f#{ULy+ITFl@<- zCh=Ezxa+XkKXHGmvq7=*fu7$2BvCm#3RFJv6A}&}Z+vx5FI3_y(Sj@H<}&#Db3^-M zl{#OzMZH~Z+(@du)uLJR&#mbk!YNG}lJCEeHmO=p&7q&ms6G_dROrr^5ynWJi>w?S!`M z=SEoKh50Y_b_bbO@Pec7G`IH$ikzfP^K#u|y?U#KU)*d&j=n~;CZ{ATtG3(|$(}(_ z`Ju8odIYcD4`WZYKnX)1&X+(k7D=11I)WCZZ{^I~bjpV~F)HfwV&4g-3V6h|Q`>;_4K4TS5w49*p$(R#=%)ibPY3@S#A;x|i?>z|!MfU-hrzw6F94aL&H~LrekJfT1_LVMomMvuE6yuJqNcWy@Zm z1;>CqVgdz{<`H(Xa|Om6@%{PSqCVoT9#)uvh1=&x-2Gz5sgO#h8e2VyGHd$nu=^5c z;Q;l+?yDB>rsrzWS_%i%fDF0~XV<|Qq52HWu?#YdVAnqV9-Bv1>?-7$4|ES+&PsQ- zaCoGX#n{8=Eo1it#NK!fpo{zOGb+8trxo$M=2Q?R9TJ3`!*K0Kg z9#9m8LzVbMDBqjS*sjXgsDQ&7oywF#j}iTr&1u%V%U_S#OibgmJZ3_z`pn^2DG@Z~ zsD9{vDj-h*wJ4;~Q>yq>V11Jl?gJ+F{slyb^ugotJ?UP3Ka}TYK102;%3>%_J#xLq z9atA#fkpZ(Ftoe;Mf(p|NH8rE4o(`336TGyR2k!UBY4i-9yeJp7^Owju#ZH z^EHY5B;LtAyF$x52W#56VXN2{(o^EIGTd<`jL!|;n^egT$IX)SlFSxy1MW*L zS32gE*oTv@wN0L<2hQV#QGOPKS_nMeM`mw>V@-q^Y+Z*@5J}bjeyE_=_(9atZ{tF) ztI2up7^X%~Vm4W$)8#LyD^9iSy=su$9~Xb&tYsziRq27QZ$RP0>ONSo!_AL(UwBFEK(G0Dw}Z5mVb?eOC)t|MitHw zUE4G?Q6zU;eWHY?(Tu2yIbdQ#`@qAe#c_uCnRk?LpOT9O(LiRGP(2^ZNiGt>f-C|r z*5==l{~zB)^eJxelm+9nAN5jt9nErd6I(aV)wM)rzf(iM3f|Ep_SNO6vlr%b2-1LFPE9em8ozjZjyrXjdB|`yyN3v)Gw6pvG$15_Ui>_z7++M7w zufs0}Ri_DM9c?W<2hD7yEhKr7K-|4-QC@dydbxB})DJLsoR+)BMhy6oVk`{F>fOR{1Bl>rweR}_q_s=zo3G-ACW!>xhO%1 z#rla}A~1y8E24sSP~HZk3;+HD38f3V-R&pnAm?KGQ|_>HSgX8^<10O62T}1K#f;~c z09MQ34g7rsdni~8t-ryFw6U2Qos4}4IdZ*C658PNQ5Mur%gZkVLHlHAbzU-xndXDv zD|cBbqTt<`0PWZrXkzRd1jRPRyFoaeLf`8%LS=S+;6n*zUTqZXkQY{J-2HlD%^AWG zWl*Iva27kKDj^(#5K2ye(V7o1+S*%VQhQ^ulua5~TP-^0H;!$xtVLqslfPxtD27`X zP$;P7b(d>l%IIKH6`^2qFrk_g>#-88|y=Qj>*JggU<9V!PynLx56iYUx|C5}ey zj3U`_RT=V7R0Iwf3=`rN){%N_vC7rL!`OStz#U%|92C%-Nh5;gi*JbIpHV$$iWmKK z_H)d_^?TOX|9hPj%ba_O3zT~k)`ZMhb&8{{1m475uvfECoy3p30vB< zy6QVWxDX|PcG42iy(1uS2QxO~AlZ;>l{sr}4J5)C4rgHWjIHJ$#@&N_;|3WfB!9^&4RvoypqEw;B9b+%x@=a3BZPzpast7dl8 zFCTJH{0lGo#0WLQ7QJvhy%IXj63Mohv@NWH#RDIYTb0X zu*ue6m}tmzR+sbXs!aIrAFJu4{cnz1k-u{q;n|+*h$n0sgG)r8M*X-U?$8VrrFXGa z`9KGSsqPDf;w?i!uV7XnuFII-_Qbnuu?1sSS1F#0WJjAq_|2new7|v&No=kq6+43} z6oH34losLhAaA`{oIY)$Sml4C!oB4GJr>aKLN3j_kia6LLle1yz0l1)JBOrWO@^Ct+81ueBr=(fu)R z3lQl<*w_*LApAoGxy2B}J2Lo1S5NPxNBNg2G`Ph8KPU6&x{Hn6dLHR}x_x}mCRd42 zno1eD;^6u{Okg#71FXM*3jJ52(<>a#e1C`$S)p=c`(g11Pmr)D8Er}!_5FRq5}GgD z;q|CCx%zQirMY$hy`uAnn6y%^p-&gea$a@j)V!*xa7wB_1WpHc=FMv;V`cLQh-7IR zaW#hi{xS?py8nw+spASG5|b`Iv^wS38Z@6fq;;jSeTv*R*{r73TtS!9h@h6`5k#PD zZ-5Sq2(6$}iWo`#h;ZhtE_XQ?gpd<>O`~Mg-Z6CQuuN1IgKlX{`)%A}U=!Iv5tiEM zBfG};f5phUe0DtsnD~f;iuQl_BTdGxTBx(Bp4D{cTFFTFxFt2<(V`{tu=i?8p}E+3 zZ}|f#{dWxsyBf1~iGS^Mq!u1$9oISy@rMbaj7@`}zx}hc`v0p-KrjIRMy0zw4z=M5 z(690^ySHI-*s?r-$I}B_h&zeNcl6LQA5bf_W-SmXFs9Q%1-d~uQNo~_V~VXlbnDF8 zU0xY^EV&yf8d$|u1TL#tU!pY7o_GFvP$fk;Q7|ZO2*kd70JQ#Uowej@_sDf0!4dvQ zlu$N4zcH&^%GL^0^{pTZ(k#Q$A42zfEi0^?#x2VEL&3$&n23l^<*)EwE#2U+b?p>s z&t1dWwLt}tR@lsLIHul01{GltrxR=tJKRieAt<{SF=2-vZI4$8t3JKXG(>qwDRVv1Sazmf#bC8Q^Ck1E9g> zIdb0DCY8(i>Z)5?;^DXpRL zG76Y*V>-EQ58V=kt=Gjy41N>7zA)~kbBHmyHkwgvIz{?`yPut3Gkwt-Dp$VIg#30buGeeQhmF+-Iq>b6CV9Ql_w#OKtef zs^*{cVSYkOV%GwAd^h9IH%;ItoksM`=+?UEvdk*w5QZ58|Qn5I5BEE5c z@u8NWhLRDtRy(#zy3T%JhXS>VNjUg2Q6uC*-WON#Zc7g|0+&us6!Mq=Ac#zM{X>wa*1Ts$mo znL?F99kPx5WU^ccd`C!LGIVg`4%$7^!(FS?Q6~XO(>(9_SpZkpiogo}_V7D{%UH}S z)86}!-S=D|yomO`(cR@2w`NJuarUpyUsd0D!X|9!wB0g6$;C&Ep{0&+-KnxvW>Zig zM!y;kUnblnwTeV9{t?eH)7CihV822)(}vF3ZU||(4k=_%dtYPo7t}_AW@XS)+YTOD zRnXWMNUgJ7rIyoV`rp9$PeYzBAafBPij3KlCT7w%`N_(61EEN%=)-4`p6a4giMO7R z6R#chpnC-NIaiW)j3UtFO?)=nqB?wI3Mj9UUgRVUU}%ZV-Hp4AJe)O^-mBNASoR$X z>*g;Qjoux~TzP63{`2eVNYMzropHVHl7m=13k25$vtb#G_fB-Q4^u~j`Hd_rge$K_+71|sdoP>YFaT;2ZQkG}=GVHvJS(sf zTAoE0oX*9uRE-h&(W1a<0*Mrz=4v;D>w7E;Q40YskU5v@8_2e)zXfLZjf1evftWAaA^Dz+gQi!X(r(yfL zgFo7_B#{DWA%r5>vD$c{o5{Wo^7fT#2ddpmfAR>p7%Q$P9Gv!?|EV9iaT1$~hpR@t z)V>fR3HZbxQ6x7Yi(}^@{R=2cZivgGJeO5lQ?>>60bVm<8GD16-t#;`nK01PWwING-dIQ`J}VLX2Y>M3IFpbKbet7 zGI%NEKhggmmA8o#KB!OmxB-o@;GoP=aosU3>*LI?hZ&qt3faFby3?MkZg~-TuJ9cAvEX-{;KHm^!M?1uvcf})q zR^-ilec6~^qv=!3xLhk8WX;a5p!qj%6FCdw%UGzmJvcv8>x&XMe7yQQrB~>FmJU^NomNtIF zBJe1fxw_X5+BdLpa6y)GN+P$7uoGmh{PFhr85U>vGKR$bFDT-czo6jn6YF<{Y6%Nq z9zlNMzdV$5%_YV3nI^@P_|utSO^}EXX?bO;*Z8|diK4kr)@+vCv!!C5+jS_pQXcy& zpyQQ^y^i)uG=;GWD2R8=(J-~%_Ubz-f|OM@2vxPx zEBFWaC8Uat&_>C%o`4H9(sL*_C-WUIr!Y&hwpX)1E2X!H?nZTvL4Kw-SX3Shiec~?r8=Msgw6=p5L(TIBu*t>^}^Q{MM#~ zTenJj?#(}!^T5Mu|5?UEP~P5Wx#<5D*r{$qq<&NfyjwhB{-Rb(9zBmfJemfO({pH9 z2G;I43Tg65x3ZFxBatNC>lDwQSS|O-JoH>{?V3#E!>2h2V``MBJmu~6p>Y_YGWx3# za|8XQS5CgOiLb;k4>W7_(nh#9BfhHYTBn>0jx6~at?Cf}LbWsU_OAFS=-uczP?mQpxA*rT z1v45znFz{KurVSaR6M9|5Aa|9x-?W1C)>7mcXP>7G~{9&C66E%Edv$WZH)8bc`4Eg z4*bEn+ty<1gIZAQ zESak%v4XP+jn*$YTHM^ar7gi%$F7_gaypm+_N7SC%GY7k;gR% zw{cJ0jdH zP4$aHSQ8qsHNP)S*SpI+Syn`>Qi^;%&6Tb*0Rm^h1?^BUC(?5yx5b^&JDkoPLiiGyqRA1R;$a z4B?jX{GI%1ow2|&#gVLYnnekyj|n(vlJ)YTv?=MIe&~PHBqe)FSx&s3QgjZ}vAw{u z9jG=@@@V4_7)yUEm(UC=!%W_vaTJ^HrWQA$hTp`2Q@li%+CzEv)B<;Yqm+2lXH3aO zc-c`4;f#f*>=VYJyyAWznI?D-Sb$&%%GB?Iz|yn#I)6b$_uZuz-UXdSgtiFP0v|}p zua`+~2QO;&-0EFWclNAwTQ-Q|P$<{T(5!T~Js6P2>FE$Dk>RVTG%b1Hdsht#MY?pe zsZvqsEX$gL7>zsnZ`?v&9@Kq_*TkEQYs+ApttDS3sYtzVHJ)&#f`a>IhkFUChF((~_4X@pX;XcpFHK zJqmAH(jGv8!bj*+i2*#NzS5_bqo<-R{eiJc(_?2p!|2z8_?q?6FdvJP&^m;ZQd@~^ zi^GmAik_V3a_ro!mV+yNx2{l(lV9y>nY6u->+aVODMO75f=dfUg%=&QA_bi+ucA6c z%mQS0UFMgwtSNb5_dY#$vX>bk8o(vi536(c+t2Dwk0-b>JPJF51=>ZXpJo=iUg&wX z*CF8VCcximxhW`e25YhrbXR2DwBP>Y{6?}KZ6)fa+E4s*Imc} zWmP%CuWz6L2+;%(3>v?GE)g&e7MJoF5_!B+{OsKM7gQ}z-;hIqLx)71CChF=7Eif7OH;DOS5Q~}lxOJ>6UzQ@Zhp%+IiSkbJzyW0C0-bi zexf!frVI{mUvIEAXJt9kJF!(Yrvzn8P-oOx%ewTp&3=Q~xf^$H_722vNOHTsH4@qC zDSk0t79JM9aRIb45KMbw<7({Fz_m{|F!QAXhXmM``LvW<3Qgi_i#m-K5;Mge@kcV% z$z+ueD_k5*BodxJHe}L~$_&7-G#?yuJ`1vI@Ao7*QHQJjG(Fp2Xn)Xh#Jhs*jt>P= z+ayTzNR5DIE4sfXt<^MW=FJ^Ur&SAf0pDFF zIq(AUUZ5nk#(tNyk)im4jUpX91|lz(Df||nV-LKdp9}rglz+vwwNfxMWOUPV&jp8a zyTc>`uqs?4<{zovTU)qmM7BzBn-iB?phs36w~dV4`<#(uTQAs74XKXX^Ei6)jZNyQ z7c|C_?}wCdwNY^Qi%_ai0V%%_P}whOLzR5_@M4G`=KBn%#ybl#o@MTC@!Bj_9n@;K z+`>S|wK2Q75zldOtv<6%xW{OeF1b7lBhJU&LWy3^!Q&k z1uSWYNY;$O&*RULP0!gOAC|(dK3E`ixT*eIwd|j?O8=<$ z@#7zC#<{S{PjyP&*4Smu)&Wbim6RLkO>a}duSR>EL)vzUbXy$h0ph~q`gewT03G7g zE`JJEsxIn3sIA1hi!CjM9*vmcd9YYHl|xkF9rx}c4IUl&^0KA&&L?4U;-E)7jr?w? z4-JNYgktAehNQ8W2y3M6_&NKc_*x~C#PnLymftkZ@gLS$JFE3^in7>$(I6p-VT)m1 ze%g^Z*&-&UovVGHT)q!r-%G{IYUDk505zjonY&z5uKCyqBl~LtY+eG|RKNyILc3(~ zbuM4jD~q1a`9J-@%Mq6ZxNe~0gj2dG_UF}-25<8BL!~^{$vOTk^N*MZ^yB+~MInCR z_Q9Drd|`}eXg3%ka>5IWtVh;&AH3k^r}RWVC{(EySFzxjs__(v+%jR%bNtc1Cqt{M zo)K6@P-8?iTtMY9LZr9$NITOQDM6%?m*pA@;$T|TfOuM$7pR+BrShAXuwv`lw`(^P#i{z z>q^nhDp84}+v)Yg{z00O3tGf0-I6X{9YKTnCe6<;7cpY{RtEjF6Nx}QS%>Ax<>rXW zGKE`I)x$Z&xk>2kLE7!f#bU580acV*H3SVeB#Bhvu#-E^Ieux7>ATySmtWHEQPz?$ zy-f1mta+eyTn~xfMzML2NJUf`rZhbd^TSwj9cxQdNJXQ*pnhGU3RT_iaN#g0Rejn0 zUk&lUYko$f0Yyl3bn@D>82rPw_2N6LJGGb$BaK_eO|W{sE=RHvzB~P^hJrs5;W0^> zE|#6ZMR2-4OL3QO_8@(rG zJvE@^w+*5w(gELkjjU?G?>vlkSPn}OWJS@&d~V%o%7Td;dD6}L`T$YVod~oxXRG+< zHk~b=vf%_P;{{MYpRQu|0*a00W(Mh;k*>b0?Ft! z1)do)i*_Pwx|~-+pZPckf#19NdTqM$=SMn^Z4T?s(gpA-n*Xr{1`G3%KYcMDISzkY zOqg2VKOrhIY1+x9~3`DO=@GBc<-85Vq^TnQ*`2%T) zVZ8v(K3C2jX~`Z7O3v=ci0+L59p1WT*|!3P-s55S=8E0!1v#|@COXB#<#bGC2x?O# zB~q%pC!@e=WleRas3cc$TByYP>e9wR$A()1D^yVO71w0fGOf=#0oG>0w?ge*d5e;( zOtAwYVO0K-$yT?OV--;htIJk8po)O%cRof-(+{3C{e1JYMa7fPj>`qGn`kkrlR1}@J|TQ+@Hf35(RTFzl(Uy9mv??&1ZJEazvzE@$WRhhKWbv%C2x3jbuP{kea z`avm8(!Z==R1rW5lmGt@pb|@xH);QL-r#yRwnX7}r|%wQpa3MLRLwhUfI#@8EWm%X9*vVD|77m!T4wJHL9ll?kn-w~;boSWP zL%W1MS?;c2Tzbyn+2q2-NCNp<-ZLb^KYmX^mb?OI+w;^NTfNbL1My6Fi% zKVWz0Ey21<%@B9>%X{m!(lYbV47jxt%&K_gv}?Fv6C&yLY8F?tb8oc(6BxqhnuQd8f)lZ90;pt#3X1Z+cL z?hzcW!_61u#e+BJ<{}=Y{N>08LU52#lT%N>q^A&pZo&K-;LpP1;-D50SY0QqyuhyT z$u-I;<|RS{U0$|(a~}!MeTOCn+o;{Lz3ysV+2(@4X3Aa9qWILOkf5*t6d#%2&Xc*@ zPD%?Z{n?%noZ)~Z$nbT_VJ9*vFu?m2x7CBWaCh1d^haNooa2vd<3>9K2p6baIFv^nb((JxCNk=?s@Dh5oEP#qn~y9vPyO? z4#`m3lIWtJo;s(NRT+N@#!Qbt9M678HQHWi9%)##DYK(ofL7>Y=5-P3Plh@-;!LwW znE5+LP(zf_Us?JlubHg&DczX%rkv)}I8JNnMqX4>??#Q}QuA|pO_*pgHBn_AWx#Z- zX0WqIe#$U`ymy-NW6%xDm*@z4qoEnLmLoL|aX+s=PBX0#;=vU0 z#IXj4(-I)SwAPJ~w=IyT+J3>L-r7Q=KYorQD|%tvxiD!Tuk{TpKoh)adVJ)%zW1ji z#ot1Webkw1r-YU#)#(Bst?C|G(yZIkfaz`?z{@78AHH#}`nid&{X$w! zZOY~6IdtGbkv2Su@AqE#EPk7z2*29rz^V#!^cY?FJs;;OWF$=^v@DyP5U_ z!}l~Bmp4#4t*f}s{o5BDH8&M4IM49lwBky{yRvwNcS-ixr z*T^xrWCAm&Xz~Dl)vC_H1=YL_1Qm>o+#}o5I+drN7Jn)u%UpB8C5n7HQyRKe&r`V? zseKBeNwAHmV*0AH$NhUfv!%TvGs7R0GGl6snVvi~Y|oEftXwSfruI9>OE`ek?&e-~ z{yy5hM4_Yf$?r1h(pm3>H@ZLa=6VwK#gn`z-4TkS49(fLm>}7be zs(p&%kHUCT5Spm-P|uecy!7HvbNznUvS5NF&N|5lC)%$9R?;nNnkCB9QCB!zkuxxo zUlvDL^bYxD?Uc^dD0>mGGEy=)(-~H7|K+HLif^by<-l>1l*Wi3>koa1I}V)L~<+*M7#Cfs)uh%mQGGN(2c9 zGV6ioeM)>Ul5e-_f72=9Nh!IH0Pfm&;uh}e3!+iCUvySz308ny6v^otk$D`nRVZ{Q zH%Y)QgNFh<4-SkuGbOksN>mDPn{?j$p$PX!!e}0O408Mbgt`1T1pQsk|G!f8|9>8I zLwv7`YR|jHmIw*DP$E!Qov_H8A&k6rtLH*36dSi9DioAF(C}0Em77=Pgg6s@I0Eu| z{v$eflhRK2>_;^3x+UEWp0Gw1*PO%rwM`hBb$l7MQ=U{8% zdZ_?EHP@PE3S0bdhQ?_{#FodcDh3nI^;DT^6@g!Y|zo2k35qeJtt>+D!dG3d4uZx5}+h{E@$=P%D z`#3_#RHmc29e9rYPbWwiM3|sJMiwI5F{l*vDxtY3@tudNTiQPSI0an;UOf1`W4iTp zQ!`_(rIK_cX~P_?xdDXrYj_|X>gH%!T2LRg$w+D`#tLPdnJzSF`#!IF!pp*@aF0Q2 zy^PCT_pEpPgh$PxeLn=BM}>I)C}~@Lf-Yh3>2)!rvHNU`=AvmMn^U6|IYy0q0C)V9 zs$F)%xo!g{Bry!;mA(~R`Ddkk46#~39{gp?R4NIem*wQqYsBSm#qB2+m_0~>ugH~* zW_WL&Hiu>@hWvT51+W)owA=J~+EmogH@aaTy5n6BTpd}qh=@?mC!LrR`v&XuE5Qnl zd{@?{LKO~P?ULpE3F-JGXKmfQvOT%m-6__ArHT^;IR0`qq%4opL|29$!^{xG?kGE{ z1|VmcrI~_R6A+`XKL#o>aOoX2xyHw+EMiB*hcfV`R{g60(>>WQ8J6m~ni^yRgmJ-&0J@oUD1CqV9OIg{nQASA;-T|4( zye_n@FGE1DHSfv#6J%8rcE)_88joPO+%R=_f?zN;&V5IE{oDhZ4#^OK z-o@#U=+i|Pwt_5!)bV%a^u13*xQwN^db8>Wu1dYqj@h#=vF(=_-rW)Mxr*crk;Q+c zJWBkPVw@I0eu`srKlKyCXF3LwExB-0dgN&RDG^m}l#G>hC%)9O|38eqgq2>Cu8vlmc4l(IJ2N}EHhSX5QQ zhNLCtXca5bo(iCQGymMewS+nU*o7L0`mo82<8h(Yi;%esNx28Gzpe$w& zc2}iHc>u{a{ZpZEb@A~YWRnLgtx(9m*X5#ewB_WuT^b}h5qB1>EK9erq248|kg+<% zef1`FyOt(5gh zUS@UrbZDUZcc%hL?X znN&*#yTv{v)=pmPn*-;*zq9>1rvw=2^-{}0jYzm4Dj=g~|_a^^cgWcHPxc3C7b0SS8dJuB$l!jZ3N zo=3sd_Mm%u)QZAtOL5pdHAm^E8snR{vng=tNl=RS?dzLr>uJp{i{k)N!ZrPj6kg0-S0{%=Zyye0hwZYC7s)N|(V1O1U z(+1DR$BR#zQU?|N27B~2GQRrZOOPlQwEhD9FWRVxsXxIu8h7`3_}NOOlebT-iO!Vl z0H2JEyr2_~nh|-oTSaN$F2%MDD`RQ^ZzX+4l+|A}ApOe_8#DHg-Rs zm~y#WX<%d1B{Sb}E626}Q8&DHuo^R2y81$0&LP9YbX6ACwaREEf=G5)e>j)zB)E3E z)wtRBo95~;`=y$gd_+e1ea*1*ZH^u5kF*#G`k-;mv`cc)7aKzBgmaFBf(dT)Jv%0LKev&o=nV8lx-hA4&A+K$pQ3v` zojoom{0hACUU&~)OY#5noBA(*6~Dnv8p6W+l;-p<7b=Jp!R~gE#2Z_8a8Fz_kqy3x z9UT4I%&1@cF`R-}C+4*t&5#H6wCKQ>-uH`B4W$Z$Cq)?Te*jGC2%ibXjvwP>cOTUS z*&Lm939y;f&3a1@uPb6oU+NKLnJO5qNNXH^iUnqPqe^%xH0#1kkrcONV*Yn?Mo02) zAKimViYns)DvZ5XWrV;iNvAP{uSYuH>cRz=_NkxEaOJzQRxOsW-&Ad2jpKYih~~A0 z%N38JYni;J1z3mOq5DpWqhR2bvBtDS0zZ~3OJ)>n_ok&=C*S2>U9|IUPv6^+*9APD zF&+Yv8n_-z@nMNwS95BI_L<{hBtjPOR(nSHF#8ZaC82h6+-aH zRj}&KDHhasOrFi?qSChc`9N*yR+Wo&$r6yJmO_jRJm}#=sKbSD!S3q}H#~rUemM`* zJrMI({}XGz>o2h-dCiPK-g4L{E-b;Joo8Geg%^iHvHb^xL(XV`qw!k-ye}#S8fSWy z)jp*zoKvDutg7lEaP!Fk-Z-BV*2!0TJO%`54WDC7fz4-cFsQozCT*778lYJZVqu?g zK_`|}%)nJr+M7laS`xDr+ z*97fidtrn(aY?<9ZA}4$w?Drz6{(Eyf9A=TMVbzhXM%gd>4JsM{w(!8X!P=no5X2Z zSgVy<)Zj>hwbdPOeyD3wlyvi<1too|K#-fiqb0^fyH-#>gZkGymGB@r7_9%{ z(~98B{M$a~KNFeS@($Rc_VZ^zEf|T^>UD=fWUgc0qe1y@ubLfp!fUZ&b`Zx^^LirIWYh+b%`*F0Am}@{@7_sK2$*Z~>Z9IUWNc|4ZIaJ2`-sIL+h**(Y4LXlMXMf z*O96pCz;kvy6$UH!t)pI5=jDvsTXX|EMEp;6JiOp?bW4~L$os0m|c8K zB(U)n!;|cu_+p{qOGwZkEnc$t-Xv1!03zR%gdNuY0P7p|7>e*q-a9UZPWiH0j|ocI z)aF5izmqSAT`)$*0;Mq8-Wy(e&9x5q`6>yFD93p!0;e5irjb}=K?C1r42)+W&$vF& zXUxwTS6w3DpE+i?Hr>}z`bPV=10o$7-o*buufIpCUSl@$r(pm6D0^?7F%30SGJdoW zZs`DHuH*X{<|9vN5QyJ%CL@bAKz)JasCr(7mSk>Oq|jQk6g0ZKMA z;&p)S9rxkdEwL!n%dZJM0w3?p^ek$Sw4TXJZ%4Eg8lowlHu#`bMWm|rw=Q+CGJkBH zqRF*=W>10xz{PoCtSEp~io2S`oF^kBXy&N?Ru~rboBsdgfXE$YZb!x!4 z8s&nMiiV+T;z)EmskNw0FC&x5UovZd(S&qi%=)HT$33zn=I|{Yz5RIr zY&qkHn&=IjIqaB-SrlZkX$u-G^Q&Nm0&O4@FnuoK%=S zaHJ2#)QHyx--$4J@cc9Q8Uqqr(~dGD-o`^5&kmLkLrbNAp(hKHK>eRA`EGRP9he|Y zvEE?E&~`Wxx2o%%1k$W{Yt#< zaUWu$R#8UMXyln!gHTIpl2!K0nhKW8ot)~tk6g_IsY}4EEBeZwRN30YTCCKTd?#!Z z>O-bl6J*^O5EJiOaCz99oj*vn6|cWIy6qJEnRCO5VP{A|Cs$PQ0*ZK8-OB~R?x<+y z_8q2n@GPgmtBgwb=CJ`UPb2c8d#e#W<~aLHOPj4FIV84e-|@&ae_tFdG5(`s31E9e z%(uT;&Q18Sp{ivXa}*c1`SJ!*br){iwiB%XGhTq%+2gj_TxIAXMvV_#s6<;o$&Fin zH=v{rL-X%q*eLglL@g*v!9=fDXY$j!kr~JH^OWClYslae3~Ppn5Pe_38z?<} zU$5IHY*?$`<(|eOhmIlH>X1e4fGmM8k>Jf986IFOBQdTN7TtWMC|9Za50TNC-&i(CeF4fXW)l2pTaLcF`y~LY+){USFOD zFWqoLimI#L4;OypIb0{5V;xT2CVN`U#cq44Dnrs=U{^i%JEToORIgigQv!v}qF_yy z?89f9DoBj}t4jVjwT;pIcS`Mo3-;Y?>cNFy)OT2g!5cQdUW@{-P)QQG!%Dgy-ainCmpq8!mq z2h(=5ODuoblT6}%9K#l{g{_twX~Lxf=OkO_h1ATo8g_UP}A@5#OH{$Z;8hyd1 zk-A(@Mxak<-qL#?p#R8RJB-*)EMl#WQt5tg~U^EiH>YYL30#C6k^G+d$~ zUSYIx9*tb#tuF98D!Xy{MQudwvoCy(Xa12y*>TRcmU^YgpiQRzcclR$&2a?uz0Ona zz2U3u_vGLGtw5M@nZyiEaVJI2uN`AX*R|rV98myeXU}W21$r_yh2^rZWe)Z}*=j8_ zm<>Wn;eK!B(WNLlzlsxRDsfK$KI?AP+*{vF^9)gG#4v#bR zTu?A2aSf8(PyML|8b7z8rx8nb!EaGrtnL7pi;pU@bnWoAiPH!8Kgng>m>�m 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%0DPD4 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≪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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/frame.jpg b/ImageMagick-6.9.12-44/images/frame.jpg new file mode 100644 index 0000000000000000000000000000000000000000..428bb5e6dd0f8f28c255d5e46158741b7640401e GIT binary patch literal 6067 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

    +

    ScaleKernelInfo

    + +

    ScaleKernelInfo() scales the given kernel list by the given amount, with or without normalization of the sum of the kernel values (as per given flags).

    + +

    By default (no flags given) the values within the kernel is scaled directly using given scaling factor without change.

    + +

    If either of the two 'normalize_flags' are given the kernel will first be normalized and then further scaled by the scaling factor value given.

    + +

    Kernel normalization ('normalize_flags' given) is designed to ensure that any use of the kernel scaling factor with 'Convolve' or 'Correlate' morphology methods will fall into -1.0 to +1.0 range. Note that for non-HDRI versions of IM this may cause images to have any negative results clipped, unless some 'bias' is used.

    + +

    More specifically. Kernels which only contain positive values (such as a 'Gaussian' kernel) will be scaled so that those values sum to +1.0, ensuring a 0.0 to +1.0 output range for non-HDRI images.

    + +

    For Kernels that contain some negative values, (such as 'Sharpen' kernels) the kernel will be scaled by the absolute of the sum of kernel values, so that it will generally fall within the +/- 1.0 range.

    + +

    For kernels whose values sum to zero, (such as 'Laplician' kernels) kernel will be scaled by just the sum of the postive values, so that its output range will again fall into the +/- 1.0 range.

    + +

    For special kernels designed for locating shapes using 'Correlate', (often only containing +1 and -1 values, representing foreground/brackground matching) a special normalization method is provided to scale the positive values separately to those of the negative values, so the kernel will be forced to become a zero-sum kernel better suited to such searches.

    + +

    WARNING: Correct normalization of the kernel assumes that the '*_range' attributes within the kernel structure have been correctly set during the kernels creation.

    + +

    NOTE: The values used for 'normalize_flags' have been selected specifically to match the use of geometry options, so that '!' means NormalizeValue, '^' means CorrelateNormalizeValue. All other GeometryFlags values are ignored.

    + +

    The format of the ScaleKernelInfo method is:

    + +
    +void ScaleKernelInfo(KernelInfo *kernel, const double scaling_factor,
    +         const MagickStatusType normalize_flags )
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    kernel
    +
    the Morphology/Convolution kernel
    + +
    o scaling_factor:
    + +
    +       zero.  If the kernel is normalized regardless of any flags.
    +
    + +

    o normalize_flags: + +

    +       specifically: NormalizeValue, CorrelateNormalizeValue,
    +                     and/or PercentValue
    +
    + +

    +

    +

    ShowKernelInfo

    + +

    ShowKernelInfo() outputs the details of the given kernel defination to standard error, generally due to a users 'showKernel' option request.

    + +

    The format of the ShowKernelInfo method is:

    + +
    +void ShowKernelInfo(const KernelInfo *kernel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    kernel
    +
    the Morphology/Convolution kernel
    + +
    +
    +

    UnityAddKernelInfo

    + +

    UnityAddKernelInfo() Adds a given amount of the 'Unity' Convolution Kernel to the given pre-scaled and normalized Kernel. This in effect adds that amount of the original image into the resulting convolution kernel. This value is usually provided by the user as a percentage value in the 'convolve:scale' setting.

    + +

    The resulting effect is to convert the defined kernels into blended soft-blurs, unsharp kernels or into sharpening kernels.

    + +

    The format of the UnityAdditionKernelInfo method is:

    + +
    +void UnityAdditionKernelInfo(KernelInfo *kernel, const double scale )
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    kernel
    +
    the Morphology/Convolution kernel
    + +
    o scale:
    + +
    +       the given kernel.
    +
    + +

    +

    +

    ZeroKernelNans

    + +

    ZeroKernelNans() replaces any special 'nan' value that may be present in the kernel with a zero value. This is typically done when the kernel will be used in special hardware (GPU) convolution processors, to simply matters.

    + +

    The format of the ZeroKernelNans method is:

    + +
    +void ZeroKernelNans (KernelInfo *kernel)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    kernel
    +
    the Morphology/Convolution kernel
    + +
    +
    + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/paint.html b/ImageMagick-6.9.12-44/www/api/paint.html new file mode 100644 index 0000000..2f03f4e --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/paint.html @@ -0,0 +1,327 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Paint on an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    FloodfillPaintImageOilPaintImageOpaquePaintImageTransparentPaintImageTransparentPaintImageChroma

    + +

    FloodfillPaintImage

    + +

    FloodfillPaintImage() changes the color value of any pixel that matches target and is an immediate neighbor. If the method FillToBorderMethod is specified, the color value is changed for any neighbor pixel that does not match the bordercolor member of image.

    + +

    By default target must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color for the purposes of the floodfill.

    + +

    The format of the FloodfillPaintImage method is:

    + +
    +MagickBooleanType FloodfillPaintImage(Image *image,
    +  const ChannelType channel,const DrawInfo *draw_info,
    +  const MagickPixelPacket target,const ssize_t x_offset,
    +  const ssize_t y_offset,const MagickBooleanType invert)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    draw_info
    +
    the draw info.
    + +
    +
    target
    +
    the RGB value of the target color.
    + +
    +
    x_offset,y_offset
    +
    the starting location of the operation.
    + +
    +
    invert
    +
    paint any pixel that does not match the target color.
    + +
    +
    +

    OilPaintImage

    + +

    OilPaintImage() applies a special effect filter that simulates an oil painting. Each pixel is replaced by the most frequent color occurring in a circular region defined by radius.

    + +

    The format of the OilPaintImage method is:

    + +
    +Image *OilPaintImage(const Image *image,const double radius,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    radius
    +
    the radius of the circular neighborhood.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    OpaquePaintImage

    + +

    OpaquePaintImage() changes any pixel that matches color with the color defined by fill.

    + +

    By default color must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. Fuzz defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color.

    + +

    The format of the OpaquePaintImage method is:

    + +
    +MagickBooleanType OpaquePaintImage(Image *image,
    +  const PixelPacket *target,const PixelPacket *fill,
    +  const MagickBooleanType invert)
    +MagickBooleanType OpaquePaintImageChannel(Image *image,
    +  const ChannelType channel,const PixelPacket *target,
    +  const PixelPacket *fill,const MagickBooleanType invert)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel(s).
    + +
    +
    target
    +
    the RGB value of the target color.
    + +
    +
    fill
    +
    the replacement color.
    + +
    +
    invert
    +
    paint any pixel that does not match the target color.
    + +
    +
    +

    TransparentPaintImage

    + +

    TransparentPaintImage() changes the opacity value associated with any pixel that matches color to the value defined by opacity.

    + +

    By default color must match a particular pixel color exactly. However, in many cases two colors may differ by a small amount. Fuzz defines how much tolerance is acceptable to consider two colors as the same. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color.

    + +

    The format of the TransparentPaintImage method is:

    + +
    +MagickBooleanType TransparentPaintImage(Image *image,
    +  const MagickPixelPacket *target,const Quantum opacity,
    +  const MagickBooleanType invert)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    target
    +
    the target color.
    + +
    +
    opacity
    +
    the replacement opacity value.
    + +
    +
    invert
    +
    paint any pixel that does not match the target color.
    + +
    +
    +

    TransparentPaintImageChroma

    + +

    TransparentPaintImageChroma() changes the opacity value associated with any pixel that matches color to the value defined by opacity.

    + +

    As there is one fuzz value for the all the channels, the TransparentPaintImage() API is not suitable for the operations like chroma, where the tolerance for similarity of two color component (RGB) can be different, Thus we define this method take two target pixels (one low and one hight) and all the pixels of an image which are lying between these two pixels are made transparent.

    + +

    The format of the TransparentPaintImage method is:

    + +
    +MagickBooleanType TransparentPaintImage(Image *image,
    +  const MagickPixelPacket *low,const MagickPixelPacket *hight,
    +  const Quantum opacity,const MagickBooleanType invert)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    low
    +
    the low target color.
    + +
    +
    high
    +
    the high target color.
    + +
    +
    opacity
    +
    the replacement opacity value.
    + +
    +
    invert
    +
    paint any pixel that does not match the target color.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/pixel-iterator.html b/ImageMagick-6.9.12-44/www/api/pixel-iterator.html new file mode 100644 index 0000000..26c659f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/pixel-iterator.html @@ -0,0 +1,547 @@ + + + + + + + + + + ImageMagick (legacy) – MagickWand, C API: Pixel Iterator Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    ClearPixelIteratorClonePixelIteratorDestroyPixelIteratorIsPixelIteratorNewPixelIteratorPixelClearIteratorExceptionNewPixelRegionIteratorPixelGetCurrentIteratorRowPixelGetIteratorExceptionPixelGetIteratorExceptionTypePixelGetIteratorRowPixelGetNextIteratorRowPixelGetPreviousIteratorRowPixelResetIteratorPixelSetFirstIteratorRowPixelSetIteratorRowPixelSetLastIteratorRowPixelSyncIterator

    + +

    ClearPixelIterator

    + +

    ClearPixelIterator() clear resources associated with a PixelIterator.

    + +

    The format of the ClearPixelIterator method is:

    + +
    +void ClearPixelIterator(PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    +

    ClonePixelIterator

    + +

    ClonePixelIterator() makes an exact copy of the specified iterator.

    + +

    The format of the ClonePixelIterator method is:

    + +
    +PixelIterator *ClonePixelIterator(const PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the magick iterator.
    + +
    +
    +

    DestroyPixelIterator

    + +

    DestroyPixelIterator() deallocates resources associated with a PixelIterator.

    + +

    The format of the DestroyPixelIterator method is:

    + +
    +PixelIterator *DestroyPixelIterator(PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    +

    IsPixelIterator

    + +

    IsPixelIterator() returns MagickTrue if the iterator is verified as a pixel iterator.

    + +

    The format of the IsPixelIterator method is:

    + +
    +MagickBooleanType IsPixelIterator(const PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the magick iterator.
    + +
    +
    +

    NewPixelIterator

    + +

    NewPixelIterator() returns a new pixel iterator.

    + +

    The format of the NewPixelIterator method is:

    + +
    +PixelIterator *NewPixelIterator(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    PixelClearIteratorException

    + +

    PixelClearIteratorException() clear any exceptions associated with the iterator.

    + +

    The format of the PixelClearIteratorException method is:

    + +
    +MagickBooleanType PixelClearIteratorException(PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    +

    NewPixelRegionIterator

    + +

    NewPixelRegionIterator() returns a new pixel iterator.

    + +

    The format of the NewPixelRegionIterator method is:

    + +
    +PixelIterator *NewPixelRegionIterator(MagickWand *wand,const ssize_t x,
    +  const ssize_t y,const size_t width,const size_t height)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a region of pixels.
    + +
    +
    +

    PixelGetCurrentIteratorRow

    + +

    PixelGetCurrentIteratorRow() returns the current row as an array of pixel wands from the pixel iterator.

    + +

    The format of the PixelGetCurrentIteratorRow method is:

    + +
    +PixelWand **PixelGetCurrentIteratorRow(PixelIterator *iterator,
    +  size_t *number_wands)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    number_wands
    +
    the number of pixel wands.
    + +
    +
    +

    PixelGetIteratorException

    + +

    PixelGetIteratorException() returns the severity, reason, and description of any error that occurs when using other methods in this API.

    + +

    The format of the PixelGetIteratorException method is:

    + +
    +char *PixelGetIteratorException(const PixelIterator *iterator,
    +  ExceptionType *severity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    severity
    +
    the severity of the error is returned here.
    + +
    +
    +

    PixelGetIteratorExceptionType

    + +

    PixelGetIteratorExceptionType() the exception type associated with the iterator. If no exception has occurred, UndefinedExceptionType is returned.

    + +

    The format of the PixelGetIteratorExceptionType method is:

    + +
    +ExceptionType PixelGetIteratorExceptionType(
    +  const PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the magick iterator.
    + +
    +
    +

    PixelGetIteratorRow

    + +

    PixelGetIteratorRow() returns the current pixel iterator row.

    + +

    The format of the PixelGetIteratorRow method is:

    + +
    +MagickBooleanType PixelGetIteratorRow(PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    +

    PixelGetNextIteratorRow

    + +

    PixelGetNextIteratorRow() returns the next row as an array of pixel wands from the pixel iterator.

    + +

    The format of the PixelGetNextIteratorRow method is:

    + +
    +PixelWand **PixelGetNextIteratorRow(PixelIterator *iterator,
    +  size_t *number_wands)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    number_wands
    +
    the number of pixel wands.
    + +
    +
    +

    PixelGetPreviousIteratorRow

    + +

    PixelGetPreviousIteratorRow() returns the previous row as an array of pixel wands from the pixel iterator.

    + +

    The format of the PixelGetPreviousIteratorRow method is:

    + +
    +PixelWand **PixelGetPreviousIteratorRow(PixelIterator *iterator,
    +  size_t *number_wands)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    number_wands
    +
    the number of pixel wands.
    + +
    +
    +

    PixelResetIterator

    + +

    PixelResetIterator() resets the pixel iterator. Use it in conjunction with PixelGetNextIteratorRow() to iterate over all the pixels in a pixel container.

    + +

    The format of the PixelResetIterator method is:

    + +
    +void PixelResetIterator(PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    +

    PixelSetFirstIteratorRow

    + +

    PixelSetFirstIteratorRow() sets the pixel iterator to the first pixel row.

    + +

    The format of the PixelSetFirstIteratorRow method is:

    + +
    +void PixelSetFirstIteratorRow(PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the magick iterator.
    + +
    +
    +

    PixelSetIteratorRow

    + +

    PixelSetIteratorRow() set the pixel iterator row.

    + +

    The format of the PixelSetIteratorRow method is:

    + +
    +MagickBooleanType PixelSetIteratorRow(PixelIterator *iterator,
    +  const ssize_t row)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    +

    PixelSetLastIteratorRow

    + +

    PixelSetLastIteratorRow() sets the pixel iterator to the last pixel row.

    + +

    The format of the PixelSetLastIteratorRow method is:

    + +
    +void PixelSetLastIteratorRow(PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the magick iterator.
    + +
    +
    +

    PixelSyncIterator

    + +

    PixelSyncIterator() syncs the pixel iterator.

    + +

    The format of the PixelSyncIterator method is:

    + +
    +MagickBooleanType PixelSyncIterator(PixelIterator *iterator)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    iterator
    +
    the pixel iterator.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/pixel-wand.html b/ImageMagick-6.9.12-44/www/api/pixel-wand.html new file mode 100644 index 0000000..4a75420 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/pixel-wand.html @@ -0,0 +1,1664 @@ + + + + + + + + + + ImageMagick (legacy) – MagickWand, C API: Pixel Wand Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    ClearPixelWandClonePixelWandClonePixelWandsDestroyPixelWandDestroyPixelWandsIsPixelWandSimilarIsPixelWandNewPixelWandNewPixelWandsPixelClearExceptionPixelGetAlphaPixelGetAlphaQuantumPixelGetBlackPixelGetBlackQuantumPixelGetBluePixelGetBlueQuantumPixelGetColorAsStringPixelGetColorAsNormalizedStringPixelGetColorCountPixelGetCyanPixelGetCyanQuantumPixelGetExceptionPixelGetExceptionTypePixelGetFuzzPixelGetGreenPixelGetGreenQuantumPixelGetHSLPixelGetIndexPixelGetMagentaPixelGetMagentaQuantumPixelGetMagickColorPixelGetOpacityPixelGetOpacityQuantumPixelGetQuantumColorPixelGetRedPixelGetRedQuantumPixelGetYellowPixelGetYellowQuantumPixelSetAlphaPixelSetAlphaQuantumPixelSetBlackPixelSetBlackQuantumPixelSetBluePixelSetBlueQuantumPixelSetColorPixelSetColorCountPixelSetColorFromWandPixelSetCyanPixelSetCyanQuantumPixelSetFuzzPixelSetGreenPixelSetGreenQuantumPixelSetHSLPixelSetIndexPixelSetMagentaPixelSetMagentaQuantumPixelSetMagickColorPixelSetOpacityPixelSetOpacityQuantumPixelSetQuantumColorPixelSetRedPixelSetRedQuantumPixelSetYellowPixelSetYellowQuantum

    + +

    ClearPixelWand

    + +

    ClearPixelWand() clears resources associated with the wand.

    + +

    The format of the ClearPixelWand method is:

    + +
    +void ClearPixelWand(PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    ClonePixelWand

    + +

    ClonePixelWand() makes an exact copy of the specified wand.

    + +

    The format of the ClonePixelWand method is:

    + +
    +PixelWand *ClonePixelWand(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    ClonePixelWands

    + +

    ClonePixelWands() makes an exact copy of the specified wands.

    + +

    The format of the ClonePixelWands method is:

    + +
    +PixelWand **ClonePixelWands(const PixelWand **wands,
    +  const size_t number_wands)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wands
    +
    the magick wands.
    + +
    +
    number_wands
    +
    the number of wands.
    + +
    +
    +

    DestroyPixelWand

    + +

    DestroyPixelWand() deallocates resources associated with a PixelWand.

    + +

    The format of the DestroyPixelWand method is:

    + +
    +PixelWand *DestroyPixelWand(PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    DestroyPixelWands

    + +

    DestroyPixelWands() deallocates resources associated with an array of pixel wands.

    + +

    The format of the DestroyPixelWands method is:

    + +
    +PixelWand **DestroyPixelWands(PixelWand **wand,
    +  const size_t number_wands)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    number_wands
    +
    the number of wands.
    + +
    +
    +

    IsPixelWandSimilar

    + +

    IsPixelWandSimilar() returns MagickTrue if the distance between two colors is less than the specified distance.

    + +

    The format of the IsPixelWandSimilar method is:

    + +
    +MagickBooleanType IsPixelWandSimilar(PixelWand *p,PixelWand *q,
    +  const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    p
    +
    the pixel wand.
    + +
    +
    q
    +
    the pixel wand.
    + +
    +
    fuzz
    +
    any two colors that are less than or equal to this distance squared are consider similar.
    + +
    +
    +

    IsPixelWand

    + +

    IsPixelWand() returns MagickTrue if the wand is verified as a pixel wand.

    + +

    The format of the IsPixelWand method is:

    + +
    +MagickBooleanType IsPixelWand(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    NewPixelWand

    + +

    NewPixelWand() returns a new pixel wand.

    + +

    The format of the NewPixelWand method is:

    + +
    +PixelWand *NewPixelWand(void)
    +
    + +

    NewPixelWands

    + +

    NewPixelWands() returns an array of pixel wands.

    + +

    The format of the NewPixelWands method is:

    + +
    +PixelWand **NewPixelWands(const size_t number_wands)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    number_wands
    +
    the number of wands.
    + +
    +
    +

    PixelClearException

    + +

    PixelClearException() clear any exceptions associated with the iterator.

    + +

    The format of the PixelClearException method is:

    + +
    +MagickBooleanType PixelClearException(PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetAlpha

    + +

    PixelGetAlpha() returns the normalized alpha value of the pixel wand.

    + +

    The format of the PixelGetAlpha method is:

    + +
    +double PixelGetAlpha(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetAlphaQuantum

    + +

    PixelGetAlphaQuantum() returns the alpha value of the pixel wand.

    + +

    The format of the PixelGetAlphaQuantum method is:

    + +
    +Quantum PixelGetAlphaQuantum(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetBlack

    + +

    PixelGetBlack() returns the normalized black color of the pixel wand.

    + +

    The format of the PixelGetBlack method is:

    + +
    +double PixelGetBlack(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetBlackQuantum

    + +

    PixelGetBlackQuantum() returns the black color of the pixel wand.

    + +

    The format of the PixelGetBlackQuantum method is:

    + +
    +Quantum PixelGetBlackQuantum(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetBlue

    + +

    PixelGetBlue() returns the normalized blue color of the pixel wand.

    + +

    The format of the PixelGetBlue method is:

    + +
    +double PixelGetBlue(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetBlueQuantum

    + +

    PixelGetBlueQuantum() returns the blue color of the pixel wand.

    + +

    The format of the PixelGetBlueQuantum method is:

    + +
    +Quantum PixelGetBlueQuantum(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetColorAsString

    + +

    PixelGetColorAsString() returnsd the color of the pixel wand as a string.

    + +

    The format of the PixelGetColorAsString method is:

    + +
    +char *PixelGetColorAsString(PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetColorAsNormalizedString

    + +

    PixelGetColorAsNormalizedString() returns the normalized color of the pixel wand as a string.

    + +

    The format of the PixelGetColorAsNormalizedString method is:

    + +
    +char *PixelGetColorAsNormalizedString(PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetColorCount

    + +

    PixelGetColorCount() returns the color count associated with this color.

    + +

    The format of the PixelGetColorCount method is:

    + +
    +size_t PixelGetColorCount(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetCyan

    + +

    PixelGetCyan() returns the normalized cyan color of the pixel wand.

    + +

    The format of the PixelGetCyan method is:

    + +
    +double PixelGetCyan(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetCyanQuantum

    + +

    PixelGetCyanQuantum() returns the cyan color of the pixel wand.

    + +

    The format of the PixelGetCyanQuantum method is:

    + +
    +Quantum PixelGetCyanQuantum(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetException

    + +

    PixelGetException() returns the severity, reason, and description of any error that occurs when using other methods in this API.

    + +

    The format of the PixelGetException method is:

    + +
    +char *PixelGetException(const PixelWand *wand,ExceptionType *severity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    severity
    +
    the severity of the error is returned here.
    + +
    +
    +

    PixelGetExceptionType

    + +

    PixelGetExceptionType() the exception type associated with the wand. If no exception has occurred, UndefinedExceptionType is returned.

    + +

    The format of the PixelGetExceptionType method is:

    + +
    +ExceptionType PixelGetExceptionType(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    +

    PixelGetFuzz

    + +

    PixelGetFuzz() returns the normalized fuzz value of the pixel wand.

    + +

    The format of the PixelGetFuzz method is:

    + +
    +double PixelGetFuzz(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetGreen

    + +

    PixelGetGreen() returns the normalized green color of the pixel wand.

    + +

    The format of the PixelGetGreen method is:

    + +
    +double PixelGetGreen(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetGreenQuantum

    + +

    PixelGetGreenQuantum() returns the green color of the pixel wand.

    + +

    The format of the PixelGetGreenQuantum method is:

    + +
    +Quantum PixelGetGreenQuantum(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetHSL

    + +

    PixelGetHSL() returns the normalized HSL color of the pixel wand.

    + +

    The format of the PixelGetHSL method is:

    + +
    +void PixelGetHSL(const PixelWand *wand,double *hue,double *saturation,
    +  double *lightness)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    hue,saturation,lightness
    +
    Return the pixel hue, saturation, and brightness.
    + +
    +
    +

    PixelGetIndex

    + +

    PixelGetIndex() returns the colormap index from the pixel wand.

    + +

    The format of the PixelGetIndex method is:

    + +
    +IndexPacket PixelGetIndex(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetMagenta

    + +

    PixelGetMagenta() returns the normalized magenta color of the pixel wand.

    + +

    The format of the PixelGetMagenta method is:

    + +
    +double PixelGetMagenta(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetMagentaQuantum

    + +

    PixelGetMagentaQuantum() returns the magenta color of the pixel wand.

    + +

    The format of the PixelGetMagentaQuantum method is:

    + +
    +Quantum PixelGetMagentaQuantum(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetMagickColor

    + +

    PixelGetMagickColor() gets the magick color of the pixel wand.

    + +

    The format of the PixelGetMagickColor method is:

    + +
    +void PixelGetMagickColor(PixelWand *wand,MagickPixelPacket *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    color
    +
    The pixel wand color is returned here.
    + +
    +
    +

    PixelGetOpacity

    + +

    PixelGetOpacity() returns the normalized opacity value of the pixel wand.

    + +

    The format of the PixelGetOpacity method is:

    + +
    +double PixelGetOpacity(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetOpacityQuantum

    + +

    PixelGetOpacityQuantum() returns the opacity value of the pixel wand.

    + +

    The format of the PixelGetOpacityQuantum method is:

    + +
    +Quantum PixelGetOpacityQuantum(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetQuantumColor

    + +

    PixelGetQuantumColor() gets the color of the pixel wand as a PixelPacket.

    + +

    The format of the PixelGetQuantumColor method is:

    + +
    +void PixelGetQuantumColor(PixelWand *wand,PixelPacket *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    color
    +
    The pixel wand color is returned here.
    + +
    +
    +

    PixelGetRed

    + +

    PixelGetRed() returns the normalized red color of the pixel wand.

    + +

    The format of the PixelGetRed method is:

    + +
    +double PixelGetRed(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetRedQuantum

    + +

    PixelGetRedQuantum() returns the red color of the pixel wand.

    + +

    The format of the PixelGetRedQuantum method is:

    + +
    +Quantum PixelGetRedQuantum(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetYellow

    + +

    PixelGetYellow() returns the normalized yellow color of the pixel wand.

    + +

    The format of the PixelGetYellow method is:

    + +
    +double PixelGetYellow(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelGetYellowQuantum

    + +

    PixelGetYellowQuantum() returns the yellow color of the pixel wand.

    + +

    The format of the PixelGetYellowQuantum method is:

    + +
    +Quantum PixelGetYellowQuantum(const PixelWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    +

    PixelSetAlpha

    + +

    PixelSetAlpha() sets the normalized alpha value of the pixel wand.

    + +

    The format of the PixelSetAlpha method is:

    + +
    +void PixelSetAlpha(PixelWand *wand,const double alpha)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    alpha
    +
    the level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
    + +
    +
    +

    PixelSetAlphaQuantum

    + +

    PixelSetAlphaQuantum() sets the alpha value of the pixel wand.

    + +

    The format of the PixelSetAlphaQuantum method is:

    + +
    +void PixelSetAlphaQuantum(PixelWand *wand,
    +  const Quantum opacity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    opacity
    +
    the opacity value.
    + +
    +
    +

    PixelSetBlack

    + +

    PixelSetBlack() sets the normalized black color of the pixel wand.

    + +

    The format of the PixelSetBlack method is:

    + +
    +void PixelSetBlack(PixelWand *wand,const double black)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    black
    +
    the black color.
    + +
    +
    +

    PixelSetBlackQuantum

    + +

    PixelSetBlackQuantum() sets the black color of the pixel wand.

    + +

    The format of the PixelSetBlackQuantum method is:

    + +
    +void PixelSetBlackQuantum(PixelWand *wand,const Quantum black)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    black
    +
    the black color.
    + +
    +
    +

    PixelSetBlue

    + +

    PixelSetBlue() sets the normalized blue color of the pixel wand.

    + +

    The format of the PixelSetBlue method is:

    + +
    +void PixelSetBlue(PixelWand *wand,const double blue)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    blue
    +
    the blue color.
    + +
    +
    +

    PixelSetBlueQuantum

    + +

    PixelSetBlueQuantum() sets the blue color of the pixel wand.

    + +

    The format of the PixelSetBlueQuantum method is:

    + +
    +void PixelSetBlueQuantum(PixelWand *wand,const Quantum blue)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    blue
    +
    the blue color.
    + +
    +
    +

    PixelSetColor

    + +

    PixelSetColor() sets the color of the pixel wand with a string (e.g. "blue", "#0000ff", "rgb(0,0,255)", "cmyk(100,100,100,10)", etc.).

    + +

    The format of the PixelSetColor method is:

    + +
    +MagickBooleanType PixelSetColor(PixelWand *wand,const char *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    color
    +
    the pixel wand color.
    + +
    +
    +

    PixelSetColorCount

    + +

    PixelSetColorCount() sets the color count of the pixel wand.

    + +

    The format of the PixelSetColorCount method is:

    + +
    +void PixelSetColorCount(PixelWand *wand,const size_t count)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    count
    +
    the number of this particular color.
    + +
    +
    +

    PixelSetColorFromWand

    + +

    PixelSetColorFromWand() sets the color of the pixel wand.

    + +

    The format of the PixelSetColorFromWand method is:

    + +
    +void PixelSetColorFromWand(PixelWand *wand,const PixelWand *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    color
    +
    set the pixel wand color here.
    + +
    +
    +

    PixelSetCyan

    + +

    PixelSetCyan() sets the normalized cyan color of the pixel wand.

    + +

    The format of the PixelSetCyan method is:

    + +
    +void PixelSetCyan(PixelWand *wand,const double cyan)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    cyan
    +
    the cyan color.
    + +
    +
    +

    PixelSetCyanQuantum

    + +

    PixelSetCyanQuantum() sets the cyan color of the pixel wand.

    + +

    The format of the PixelSetCyanQuantum method is:

    + +
    +void PixelSetCyanQuantum(PixelWand *wand,const Quantum cyan)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    cyan
    +
    the cyan color.
    + +
    +
    +

    PixelSetFuzz

    + +

    PixelSetFuzz() sets the fuzz value of the pixel wand.

    + +

    The format of the PixelSetFuzz method is:

    + +
    +void PixelSetFuzz(PixelWand *wand,const double fuzz)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    fuzz
    +
    the fuzz value.
    + +
    +
    +

    PixelSetGreen

    + +

    PixelSetGreen() sets the normalized green color of the pixel wand.

    + +

    The format of the PixelSetGreen method is:

    + +
    +void PixelSetGreen(PixelWand *wand,const double green)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    green
    +
    the green color.
    + +
    +
    +

    PixelSetGreenQuantum

    + +

    PixelSetGreenQuantum() sets the green color of the pixel wand.

    + +

    The format of the PixelSetGreenQuantum method is:

    + +
    +void PixelSetGreenQuantum(PixelWand *wand,const Quantum green)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    green
    +
    the green color.
    + +
    +
    +

    PixelSetHSL

    + +

    PixelSetHSL() sets the normalized HSL color of the pixel wand.

    + +

    The format of the PixelSetHSL method is:

    + +
    +void PixelSetHSL(PixelWand *wand,const double hue,
    +  const double saturation,const double lightness)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    hue,saturation,lightness
    +
    Return the pixel hue, saturation, and brightness.
    + +
    +
    +

    PixelSetIndex

    + +

    PixelSetIndex() sets the colormap index of the pixel wand.

    + +

    The format of the PixelSetIndex method is:

    + +
    +void PixelSetIndex(PixelWand *wand,const IndexPacket index)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    index
    +
    the colormap index.
    + +
    +
    +

    PixelSetMagenta

    + +

    PixelSetMagenta() sets the normalized magenta color of the pixel wand.

    + +

    The format of the PixelSetMagenta method is:

    + +
    +void PixelSetMagenta(PixelWand *wand,const double magenta)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    magenta
    +
    the magenta color.
    + +
    +
    +

    PixelSetMagentaQuantum

    + +

    PixelSetMagentaQuantum() sets the magenta color of the pixel wand.

    + +

    The format of the PixelSetMagentaQuantum method is:

    + +
    +void PixelSetMagentaQuantum(PixelWand *wand,
    +  const Quantum magenta)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    magenta
    +
    the green magenta.
    + +
    +
    +

    PixelSetMagickColor

    + +

    PixelSetMagickColor() sets the color of the pixel wand.

    + +

    The format of the PixelSetMagickColor method is:

    + +
    +void PixelSetMagickColor(PixelWand *wand,const MagickPixelPacket *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    color
    +
    the pixel wand color.
    + +
    +
    +

    PixelSetOpacity

    + +

    PixelSetOpacity() sets the normalized opacity value of the pixel wand.

    + +

    The format of the PixelSetOpacity method is:

    + +
    +void PixelSetOpacity(PixelWand *wand,const double opacity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    opacity
    +
    the opacity value.
    + +
    +
    +

    PixelSetOpacityQuantum

    + +

    PixelSetOpacityQuantum() sets the opacity value of the pixel wand.

    + +

    The format of the PixelSetOpacityQuantum method is:

    + +
    +void PixelSetOpacityQuantum(PixelWand *wand,
    +  const Quantum opacity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    opacity
    +
    the opacity value.
    + +
    +
    +

    PixelSetQuantumColor

    + +

    PixelSetQuantumColor() sets the color of the pixel wand.

    + +

    The format of the PixelSetQuantumColor method is:

    + +
    +void PixelSetQuantumColor(PixelWand *wand,const PixelPacket *color)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    color
    +
    the pixel wand color.
    + +
    +
    +

    PixelSetRed

    + +

    PixelSetRed() sets the normalized red color of the pixel wand.

    + +

    The format of the PixelSetRed method is:

    + +
    +void PixelSetRed(PixelWand *wand,const double red)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    red
    +
    the red color.
    + +
    +
    +

    PixelSetRedQuantum

    + +

    PixelSetRedQuantum() sets the red color of the pixel wand.

    + +

    The format of the PixelSetRedQuantum method is:

    + +
    +void PixelSetRedQuantum(PixelWand *wand,const Quantum red)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    red
    +
    the red color.
    + +
    +
    +

    PixelSetYellow

    + +

    PixelSetYellow() sets the normalized yellow color of the pixel wand.

    + +

    The format of the PixelSetYellow method is:

    + +
    +void PixelSetYellow(PixelWand *wand,const double yellow)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    yellow
    +
    the yellow color.
    + +
    +
    +

    PixelSetYellowQuantum

    + +

    PixelSetYellowQuantum() sets the yellow color of the pixel wand.

    + +

    The format of the PixelSetYellowQuantum method is:

    + +
    +void PixelSetYellowQuantum(PixelWand *wand,const Quantum yellow)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the pixel wand.
    + +
    +
    yellow
    +
    the yellow color.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/profile.html b/ImageMagick-6.9.12-44/www/api/profile.html new file mode 100644 index 0000000..4b9a243 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/profile.html @@ -0,0 +1,389 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Dealing with Image Profiles + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    CloneImageProfilesDeleteImageProfileDestroyImageProfilesGetImageProfileGetNextImageProfileProfileImageRemoveImageProfileResetImageProfileIteratorSetImageProfileSyncImageProfiles

    + +

    CloneImageProfiles

    + +

    CloneImageProfiles() clones one or more image profiles.

    + +

    The format of the CloneImageProfiles method is:

    + +
    +MagickBooleanType CloneImageProfiles(Image *image,
    +  const Image *clone_image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    clone_image
    +
    the clone image.
    + +
    +
    +

    DeleteImageProfile

    + +

    DeleteImageProfile() deletes a profile from the image by its name.

    + +

    The format of the DeleteImageProfile method is:

    + +
    +MagickBooleanTyupe DeleteImageProfile(Image *image,const char *name)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    name
    +
    the profile name.
    + +
    +
    +

    DestroyImageProfiles

    + +

    DestroyImageProfiles() releases memory associated with an image profile map.

    + +

    The format of the DestroyProfiles method is:

    + +
    +void DestroyImageProfiles(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    GetImageProfile

    + +

    GetImageProfile() gets a profile associated with an image by name.

    + +

    The format of the GetImageProfile method is:

    + +
    +const StringInfo *GetImageProfile(const Image *image,const char *name)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    name
    +
    the profile name.
    + +
    +
    +

    GetNextImageProfile

    + +

    GetNextImageProfile() gets the next profile name for an image.

    + +

    The format of the GetNextImageProfile method is:

    + +
    +char *GetNextImageProfile(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    hash_info
    +
    the hash info.
    + +
    +
    +

    ProfileImage

    + +

    ProfileImage() associates, applies, or removes an ICM, IPTC, or generic profile with / to / from an image. If the profile is NULL, it is removed from the image otherwise added or applied. Use a name of '*' and a profile of NULL to remove all profiles from the image.

    + +

    ICC and ICM profiles are handled as follows: If the image does not have an associated color profile, the one you provide is associated with the image and the image pixels are not transformed. Otherwise, the colorspace transform defined by the existing and new profile are applied to the image pixels and the new profile is associated with the image.

    + +

    The format of the ProfileImage method is:

    + +
    +MagickBooleanType ProfileImage(Image *image,const char *name,
    +  const void *datum,const size_t length,const MagickBooleanType clone)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    name
    +
    Name of profile to add or remove: ICC, IPTC, or generic profile.
    + +
    +
    datum
    +
    the profile data.
    + +
    +
    length
    +
    the length of the profile.
    + +
    +
    clone
    +
    should be MagickFalse.
    + +
    +
    +

    RemoveImageProfile

    + +

    RemoveImageProfile() removes a named profile from the image and returns its value.

    + +

    The format of the RemoveImageProfile method is:

    + +
    +void *RemoveImageProfile(Image *image,const char *name)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    name
    +
    the profile name.
    + +
    +
    +

    ResetImageProfileIterator

    + +

    ResetImageProfileIterator() resets the image profile iterator. Use it in conjunction with GetNextImageProfile() to iterate over all the profiles associated with an image.

    + +

    The format of the ResetImageProfileIterator method is:

    + +
    +ResetImageProfileIterator(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    SetImageProfile

    + +

    SetImageProfile() adds a named profile to the image. If a profile with the same name already exists, it is replaced. This method differs from the ProfileImage() method in that it does not apply CMS color profiles.

    + +

    The format of the SetImageProfile method is:

    + +
    +MagickBooleanType SetImageProfile(Image *image,const char *name,
    +  const StringInfo *profile)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    name
    +
    the profile name, for example icc, exif, and 8bim (8bim is the Photoshop wrapper for iptc profiles).
    + +
    +
    profile
    +
    A StringInfo structure that contains the named profile.
    + +
    +
    +

    SyncImageProfiles

    + +

    SyncImageProfiles() synchronizes image properties with the image profiles. Currently we only support updating the EXIF resolution and orientation.

    + +

    The format of the SyncImageProfiles method is:

    + +
    +MagickBooleanType SyncImageProfiles(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/property.html b/ImageMagick-6.9.12-44/www/api/property.html new file mode 100644 index 0000000..5786f12 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/property.html @@ -0,0 +1,422 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Get/Set Image Properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    CloneImagePropertiesDefineImagePropertyDeleteImagePropertyDestroyImagePropertiesFormatImagePropertyGetImagePropertyGetNextImagePropertyInterpretImagePropertiesRemoveImagePropertyResetImagePropertyIteratorSetImageProperty

    + +

    CloneImageProperties

    + +

    CloneImageProperties() clones all the image properties to another image.

    + +

    The format of the CloneImageProperties method is:

    + +
    +MagickBooleanType CloneImageProperties(Image *image,
    +  const Image *clone_image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    clone_image
    +
    the clone image.
    + +
    +
    +

    DefineImageProperty

    + +

    DefineImageProperty() associates an assignment string of the form "key=value" with an artifact or options. It is equivelent to SetImageProperty().

    + +

    The format of the DefineImageProperty method is:

    + +
    +MagickBooleanType DefineImageProperty(Image *image,
    +  const char *property)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    property
    +
    the image property.
    + +
    +
    +

    DeleteImageProperty

    + +

    DeleteImageProperty() deletes an image property.

    + +

    The format of the DeleteImageProperty method is:

    + +
    +MagickBooleanType DeleteImageProperty(Image *image,const char *property)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    property
    +
    the image property.
    + +
    +
    +

    DestroyImageProperties

    + +

    DestroyImageProperties() destroys all properties and associated memory attached to the given image.

    + +

    The format of the DestroyDefines method is:

    + +
    +void DestroyImageProperties(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    FormatImageProperty

    + +

    FormatImageProperty() permits formatted property/value pairs to be saved as an image property.

    + +

    The format of the FormatImageProperty method is:

    + +
    +MagickBooleanType FormatImageProperty(Image *image,const char *property,
    +  const char *format,...)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    The image.

    + +
    property
    +

    The attribute property.

    + +
    format
    +

    A string describing the format to use to write the remaining arguments.

    + +

    GetImageProperty

    + +

    GetImageProperty() gets a value associated with an image property.

    + +

    This includes, profile prefixes, such as "exif:", "iptc:" and "8bim:" It does not handle non-prifile prefixes, such as "fx:", "option:", or "artifact:".

    + +

    The returned string is stored as a properity of the same name for faster lookup later. It should NOT be freed by the caller.

    + +

    The format of the GetImageProperty method is:

    + +
    +const char *GetImageProperty(const Image *image,const char *key)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    key
    +
    the key.
    + +
    +
    +

    GetNextImageProperty

    + +

    GetNextImageProperty() gets the next free-form string property name.

    + +

    The format of the GetNextImageProperty method is:

    + +
    +char *GetNextImageProperty(const Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    InterpretImageProperties

    + +

    InterpretImageProperties() replaces any embedded formatting characters with the appropriate image property and returns the interpreted text.

    + +

    This searches for and replaces \n \r \ replaced by newline, return, and percent resp. &lt; &gt; &amp; replaced by '<', '>', '&' resp. replaced by percent

    + +

    x [x] where 'x' is a single letter properity, case sensitive). [type:name] where 'type' a is special and known prefix. [name] where 'name' is a specifically known attribute, calculated value, or a per-image property string name, or a per-image 'artifact' (as generated from a global option). It may contain ':' as long as the prefix is not special.

    + +

    Single letter substitutions will only happen if the character before the percent is NOT a number. But braced substitutions will always be performed. This prevents the typical usage of percent in a interpreted geometry argument from being substituted when the percent is a geometry flag.

    + +

    If 'glob-expresions' ('*' or '?' characters) is used for 'name' it may be used as a search pattern to print multiple lines of "name=value\n" pairs of the associacted set of properities.

    + +

    The returned string must be freed using DestoryString() by the caller.

    + +

    The format of the InterpretImageProperties method is:

    + +
    +char *InterpretImageProperties(const ImageInfo *image_info,Image *image,
    +  const char *embed_text)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    image
    +
    the image.
    + +
    +
    embed_text
    +
    the address of a character string containing the embedded formatting characters.
    + +
    +
    +

    RemoveImageProperty

    + +

    RemoveImageProperty() removes a property from the image and returns its value.

    + +

    In this case the ConstantString() value returned should be freed by the caller when finished.

    + +

    The format of the RemoveImageProperty method is:

    + +
    +char *RemoveImageProperty(Image *image,const char *property)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    property
    +
    the image property.
    + +
    +
    +

    ResetImagePropertyIterator

    + +

    ResetImagePropertyIterator() resets the image properties iterator. Use it in conjunction with GetNextImageProperty() to iterate over all the values associated with an image property.

    + +

    The format of the ResetImagePropertyIterator method is:

    + +
    +ResetImagePropertyIterator(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    SetImageProperty

    + +

    SetImageProperty() saves the given string value either to specific known attribute or to a freeform property string.

    + +

    The format of the SetImageProperty method is:

    + +
    +MagickBooleanType SetImageProperty(Image *image,const char *property,
    +  const char *value)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    property
    +
    the image property.
    + +
    +
    values
    +
    the image property values.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/quantize.html b/ImageMagick-6.9.12-44/www/api/quantize.html new file mode 100644 index 0000000..0316860 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/quantize.html @@ -0,0 +1,497 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Reduce the Number of Unique Colors in an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    QuantizeImageAcquireQuantizeInfoCloneQuantizeInfoCompressImageColormapDestroyQuantizeInfoGetImageQuantizeErrorGetQuantizeInfoPosterizeImageQuantizeImageQuantizeImagesRemapImageRemapImagesSetGrayscaleImage

    + +

    QuantizeImage

    + +

    QuantizeImage() takes a standard RGB or monochrome images and quantizes them down to some fixed number of colors.

    + +

    For purposes of color allocation, an image is a set of n pixels, where each pixel is a point in RGB space. RGB space is a 3-dimensional vector space, and each pixel, Pi, is defined by an ordered triple of red, green, and blue coordinates, (Ri, Gi, Bi).

    + +

    Each primary color component (red, green, or blue) represents an intensity which varies linearly from 0 to a maximum value, Cmax, which corresponds to full saturation of that color. Color allocation is defined over a domain consisting of the cube in RGB space with opposite vertices at (0,0,0) and (Cmax, Cmax, Cmax). QUANTIZE requires Cmax = 255.

    + +

    The algorithm maps this domain onto a tree in which each node represents a cube within that domain. In the following discussion these cubes are defined by the coordinate of two opposite vertices (vertex nearest the origin in RGB space and the vertex farthest from the origin).

    + +

    The tree's root node represents the entire domain, (0,0,0) through (Cmax,Cmax,Cmax). Each lower level in the tree is generated by subdividing one node's cube into eight smaller cubes of equal size. This corresponds to bisecting the parent cube with planes passing through the midpoints of each edge.

    + +

    The basic algorithm operates in three phases: Classification, Reduction, and Assignment. Classification builds a color description tree for the image. Reduction collapses the tree until the number it represents, at most, the number of colors desired in the output image. Assignment defines the output image's color map and sets each pixel's color by restorage_class in the reduced tree. Our goal is to minimize the numerical discrepancies between the original colors and quantized colors (quantization error).

    + +

    Classification begins by initializing a color description tree of sufficient depth to represent each possible input color in a leaf. However, it is impractical to generate a fully-formed color description tree in the storage_class phase for realistic values of Cmax. If colors components in the input image are quantized to k-bit precision, so that Cmax= 2k-1, the tree would need k levels below the root node to allow representing each possible input color in a leaf. This becomes prohibitive because the tree's total number of nodes is 1 + sum(i=1, k, 8k).

    + +

    A complete tree would require 19,173,961 nodes for k = 8, Cmax = 255.

    +
    avoid building a fully populated tree, QUANTIZE
    +

    (1) Initializes data structures for nodes only as they are needed; (2) Chooses a maximum depth for the tree as a function of the desired number of colors in the output image (currently log2(colormap size)).

    + +

    For each pixel in the input image, storage_class scans downward from the root of the color description tree. At each level of the tree it identifies the single node which represents a cube in RGB space containing the pixel's color. It updates the following data for each such node:

    + +
    +    n1: Number of pixels whose color is contained in the RGB cube which
    +    this node represents;
    +
    + +

    n2: Number of pixels whose color is not represented in a node at lower depth in the tree; initially, n2 = 0 for all nodes except leaves of the tree.

    + +

    Sr, Sg, Sb: Sums of the red, green, and blue component values for all pixels not classified at a lower depth. The combination of these sums and n2 will ultimately characterize the mean color of a set of pixels represented by this node.

    + +

    E: the distance squared in RGB space between each pixel contained within a node and the nodes' center. This represents the quantization error for a node.

    + +

    Reduction repeatedly prunes the tree until the number of nodes with n2 > 0 is less than or equal to the maximum number of colors allowed in the output image. On any given iteration over the tree, it selects those nodes whose E count is minimal for pruning and merges their color statistics upward. It uses a pruning threshold, Ep, to govern node selection as follows:

    + +
    +
    + +
    Ep = 0 while number of nodes with (n2 > 0) > required maximum number of colors prune all nodes such that E <= Ep Set Ep to minimum E in remaining nodes
    + +
    This has the effect of minimizing any quantization error when merging two nodes together.
    + +
    When a node to be pruned has offspring, the pruning procedure invokes itself recursively in order to prune the tree from the leaves upward. n2, Sr, Sg, and Sb in a node being pruned are always added to the corresponding data in that node's parent. This retains the pruned node's color characteristics for later averaging.
    + +
    For each node, n2 pixels exist for which that node represents the smallest volume in RGB space containing those pixel's colors. When n2 > 0 the node will uniquely define a color in the output image. At the beginning of reduction, n2 = 0 for all nodes except a the leaves of the tree which represent colors present in the input image.
    + +
    The other pixel count, n1, indicates the total number of colors within the cubic volume which the node represents. This includes n1 - n2 pixels whose colors should be defined by nodes at a lower level in the tree.
    + +
    Assignment generates the output image from the pruned tree. The output
    +
    +
    parts
    +
    (1) A color map, which is an array of color descriptions (RGB triples) for each color present in the output image; (2) A pixel array, which represents each pixel as an index into the color map array.
    + +
    First, the assignment phase makes one pass over the pruned color description tree to establish the image's color map. For each node with n2 > 0, it divides Sr, Sg, and Sb by n2 . This produces the mean color of all pixels that classify no lower than this node. Each of these colors becomes an entry in the color map.
    + +
    Finally, the assignment phase reclassifies each pixel in the pruned tree to identify the deepest node containing the pixel's color. The pixel's value in the pixel array becomes the index of this node's mean color in the color map.
    + +
    This method is based on a similar algorithm written by Paul Raveling.
    + +
    +
    +

    AcquireQuantizeInfo

    + +

    AcquireQuantizeInfo() allocates the QuantizeInfo structure.

    + +

    The format of the AcquireQuantizeInfo method is:

    + +
    +QuantizeInfo *AcquireQuantizeInfo(const ImageInfo *image_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    +

    CloneQuantizeInfo

    + +

    CloneQuantizeInfo() makes a duplicate of the given quantize info structure, or if quantize info is NULL, a new one.

    + +

    The format of the CloneQuantizeInfo method is:

    + +
    +QuantizeInfo *CloneQuantizeInfo(const QuantizeInfo *quantize_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    clone_info
    +
    Method CloneQuantizeInfo returns a duplicate of the given quantize info, or if image info is NULL a new one.
    + +
    +
    quantize_info
    +
    a structure of type info.
    + +
    +
    +

    CompressImageColormap

    + +

    CompressImageColormap() compresses an image colormap by removing any duplicate or unused color entries.

    + +

    The format of the CompressImageColormap method is:

    + +
    +MagickBooleanType CompressImageColormap(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +

    DestroyQuantizeInfo

    + +

    DestroyQuantizeInfo() deallocates memory associated with an QuantizeInfo structure.

    + +

    The format of the DestroyQuantizeInfo method is:

    + +
    +QuantizeInfo *DestroyQuantizeInfo(QuantizeInfo *quantize_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    quantize_info
    +
    Specifies a pointer to an QuantizeInfo structure.
    + +
    +
    +

    GetImageQuantizeError

    + +

    GetImageQuantizeError() measures the difference between the original and quantized images. This difference is the total quantization error. The error is computed by summing over all pixels in an image the distance squared in RGB space between each reference pixel value and its quantized value. These values are computed:

    + +
    +    o mean_error_per_pixel:  This value is the mean error for any single
    +pixel in the image.
    +
    + +
    normalized_mean_square_error
    +

    This value is the normalized mean quantization error for any single pixel in the image. This distance measure is normalized to a range between 0 and 1. It is independent of the range of red, green, and blue values in the image.

    + +
    normalized_maximum_square_error
    +

    Thsi value is the normalized maximum quantization error for any single pixel in the image. This distance measure is normalized to a range between 0 and 1. It is independent of the range of red, green, and blue values in your image.

    + +

    The format of the GetImageQuantizeError method is:

    + +
    +MagickBooleanType GetImageQuantizeError(Image *image)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +

    GetQuantizeInfo

    + +

    GetQuantizeInfo() initializes the QuantizeInfo structure.

    + +

    The format of the GetQuantizeInfo method is:

    + +
    +GetQuantizeInfo(QuantizeInfo *quantize_info)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    quantize_info
    +
    Specifies a pointer to a QuantizeInfo structure.
    + +
    +
    +

    PosterizeImage

    + +

    PosterizeImage() reduces the image to a limited number of colors for a "poster" effect.

    + +

    The format of the PosterizeImage method is:

    + +
    +MagickBooleanType PosterizeImage(Image *image,const size_t levels,
    +  const MagickBooleanType dither)
    +MagickBooleanType PosterizeImageChannel(Image *image,
    +  const ChannelType channel,const size_t levels,
    +  const MagickBooleanType dither)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    Specifies a pointer to an Image structure.
    + +
    +
    levels
    +
    Number of color levels allowed in each channel. Very low values (2, 3, or 4) have the most visible effect.
    + +
    +
    dither
    +
    Set this integer value to something other than zero to dither the mapped image.
    + +
    +
    +

    QuantizeImage

    + +

    QuantizeImage() analyzes the colors within a reference image and chooses a fixed number of colors to represent the image. The goal of the algorithm is to minimize the color difference between the input and output image while minimizing the processing time.

    + +

    The format of the QuantizeImage method is:

    + +
    +MagickBooleanType QuantizeImage(const QuantizeInfo *quantize_info,
    +  Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    quantize_info
    +
    Specifies a pointer to an QuantizeInfo structure.
    + +
    +
    image
    +
    the image.
    + +
    +
    +

    QuantizeImages

    + +

    QuantizeImages() analyzes the colors within a set of reference images and chooses a fixed number of colors to represent the set. The goal of the algorithm is to minimize the color difference between the input and output images while minimizing the processing time.

    + +

    The format of the QuantizeImages method is:

    + +
    +MagickBooleanType QuantizeImages(const QuantizeInfo *quantize_info,
    +  Image *images)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    quantize_info
    +
    Specifies a pointer to an QuantizeInfo structure.
    + +
    +
    images
    +
    Specifies a pointer to a list of Image structures.
    + +
    +
    +

    RemapImage

    + +

    RemapImage() replaces the colors of an image with the closest color from a reference image.

    + +

    The format of the RemapImage method is:

    + +
    +MagickBooleanType RemapImage(const QuantizeInfo *quantize_info,
    +  Image *image,const Image *remap_image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    quantize_info
    +
    Specifies a pointer to an QuantizeInfo structure.
    + +
    +
    image
    +
    the image.
    + +
    +
    remap_image
    +
    the reference image.
    + +
    +
    +

    RemapImages

    + +

    RemapImages() replaces the colors of a sequence of images with the closest color from a reference image.

    + +

    The format of the RemapImage method is:

    + +
    +MagickBooleanType RemapImages(const QuantizeInfo *quantize_info,
    +  Image *images,Image *remap_image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    quantize_info
    +
    Specifies a pointer to an QuantizeInfo structure.
    + +
    +
    images
    +
    the image sequence.
    + +
    +
    remap_image
    +
    the reference image.
    + +
    +
    +

    SetGrayscaleImage

    + +

    SetGrayscaleImage() converts an image to a PseudoClass grayscale image.

    + +

    The format of the SetGrayscaleImage method is:

    + +
    +MagickBooleanType SetGrayscaleImage(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    The image.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/registry.html b/ImageMagick-6.9.12-44/www/api/registry.html new file mode 100644 index 0000000..28f036e --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/registry.html @@ -0,0 +1,295 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: The Image Registry + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    DefineImageRegistryDeleteImageRegistryGetImageRegistryGetNextImageRegistryRegistryComponentTerminusRemoveImageRegistryResetImageRegistryIteratorSetImageRegistry

    + +

    DefineImageRegistry

    + +

    DefineImageRegistry() associates a key/value pair with the image registry.

    + +

    The format of the DefineImageRegistry method is:

    + +
    +MagickBooleanType DefineImageRegistry(const RegistryType type,
    +  const char *option,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    type
    +
    the type.
    + +
    +
    option
    +
    the option.
    + +
    +
    exception
    +
    the exception.
    + +
    +
    +

    DeleteImageRegistry

    + +

    DeleteImageRegistry() deletes a key from the image registry.

    + +

    The format of the DeleteImageRegistry method is:

    + +
    +MagickBooleanType DeleteImageRegistry(const char *key)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    key
    +
    the registry.
    + +
    +
    +

    GetImageRegistry

    + +

    GetImageRegistry() returns a value associated with an image registry key.

    + +

    The format of the GetImageRegistry method is:

    + +
    +void *GetImageRegistry(const RegistryType type,const char *key,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    type
    +
    the type.
    + +
    +
    key
    +
    the key.
    + +
    +
    exception
    +
    the exception.
    + +
    +
    +

    GetNextImageRegistry

    + +

    GetNextImageRegistry() gets the next image registry value.

    + +

    The format of the GetNextImageRegistry method is:

    + +
    +char *GetNextImageRegistry(void)
    +
    + +

    RegistryComponentTerminus

    + +

    RegistryComponentTerminus() destroys the registry component.

    + +

    The format of the DestroyDefines method is:

    + +
    +void RegistryComponentTerminus(void)
    +
    + +

    RemoveImageRegistry

    + +

    RemoveImageRegistry() removes a key from the image registry and returns its value.

    + +

    The format of the RemoveImageRegistry method is:

    + +
    +void *RemoveImageRegistry(const char *key)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    key
    +
    the registry.
    + +
    +
    +

    ResetImageRegistryIterator

    + +

    ResetImageRegistryIterator() resets the registry iterator. Use it in conjunction with GetNextImageRegistry() to iterate over all the values in the image registry.

    + +

    The format of the ResetImageRegistryIterator method is:

    + +
    +ResetImageRegistryIterator(void)
    +
    + +

    SetImageRegistry

    + +

    SetImageRegistry() associates a value with an image registry key.

    + +

    The format of the SetImageRegistry method is:

    + +
    +MagickBooleanType SetImageRegistry(const RegistryType type,
    +  const char *key,const void *value,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    type
    +
    the type.
    + +
    +
    key
    +
    the key.
    + +
    +
    value
    +
    the value.
    + +
    +
    exception
    +
    the exception.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/resize.html b/ImageMagick-6.9.12-44/www/api/resize.html new file mode 100644 index 0000000..1c4dff1 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/resize.html @@ -0,0 +1,490 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Resize an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AdaptiveResizeImageInterpolativeResizeImageLiquidRescaleImageMagnifyImageMinifyImageResampleImageResizeImageSampleImageScaleImageThumbnailImage

    + +

    AdaptiveResizeImage

    + +

    AdaptiveResizeImage() adaptively resize image with pixel resampling.

    + +

    This is shortcut function for a fast interpolative resize using mesh interpolation. It works well for small resizes of less than +/- 50 of the original image size. For larger resizing on images a full filtered and slower resize function should be used instead.

    + +

    The format of the AdaptiveResizeImage method is:

    + +
    +Image *AdaptiveResizeImage(const Image *image,const size_t columns,
    +  const size_t rows,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    columns
    +
    the number of columns in the resized image.
    + +
    +
    rows
    +
    the number of rows in the resized image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    InterpolativeResizeImage

    + +

    InterpolativeResizeImage() resizes an image using the specified interpolation method.

    + +

    The format of the InterpolativeResizeImage method is:

    + +
    +Image *InterpolativeResizeImage(const Image *image,const size_t columns,
    +  const size_t rows,const InterpolatePixelMethod method,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    columns
    +
    the number of columns in the resized image.
    + +
    +
    rows
    +
    the number of rows in the resized image.
    + +
    +
    method
    +
    the pixel interpolation method.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    LiquidRescaleImage

    + +

    LiquidRescaleImage() rescales image with seam carving.

    + +

    The format of the LiquidRescaleImage method is:

    + +
    +Image *LiquidRescaleImage(const Image *image,
    +  const size_t columns,const size_t rows,
    +  const double delta_x,const double rigidity,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    columns
    +
    the number of columns in the rescaled image.
    + +
    +
    rows
    +
    the number of rows in the rescaled image.
    + +
    +
    delta_x
    +
    maximum seam transversal step (0 means straight seams).
    + +
    +
    rigidity
    +
    introduce a bias for non-straight seams (typically 0).
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    MagnifyImage

    + +

    MagnifyImage() doubles the size of the image with a pixel art scaling algorithm.

    + +

    The format of the MagnifyImage method is:

    + +
    +Image *MagnifyImage(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    MinifyImage

    + +

    MinifyImage() is a convenience method that scales an image proportionally to half its size.

    + +

    The format of the MinifyImage method is:

    + +
    +Image *MinifyImage(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ResampleImage

    + +

    ResampleImage() resize image in terms of its pixel size, so that when displayed at the given resolution it will be the same size in terms of real world units as the original image at the original resolution.

    + +

    The format of the ResampleImage method is:

    + +
    +Image *ResampleImage(Image *image,const double x_resolution,
    +  const double y_resolution,const FilterTypes filter,const double blur,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image to be resized to fit the given resolution.
    + +
    +
    x_resolution
    +
    the new image x resolution.
    + +
    +
    y_resolution
    +
    the new image y resolution.
    + +
    +
    filter
    +
    Image filter to use.
    + +
    +
    blur
    +
    the blur factor where > 1 is blurry, < 1 is sharp.
    + +
    +
    +

    ResizeImage

    + +

    ResizeImage() scales an image to the desired dimensions, using the given filter (see AcquireFilterInfo()).

    + +

    If an undefined filter is given the filter defaults to Mitchell for a colormapped image, a image with a matte channel, or if the image is enlarged. Otherwise the filter defaults to a Lanczos.

    + +

    ResizeImage() was inspired by Paul Heckbert's "zoom" program.

    + +

    The format of the ResizeImage method is:

    + +
    +Image *ResizeImage(Image *image,const size_t columns,
    +  const size_t rows,const FilterTypes filter,const double blur,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    columns
    +
    the number of columns in the scaled image.
    + +
    +
    rows
    +
    the number of rows in the scaled image.
    + +
    +
    filter
    +
    Image filter to use.
    + +
    +
    blur
    +
    the blur factor where > 1 is blurry, < 1 is sharp. Typically set this to 1.0.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SampleImage

    + +

    SampleImage() scales an image to the desired dimensions with pixel sampling. Unlike other scaling methods, this method does not introduce any additional color into the scaled image.

    + +

    The format of the SampleImage method is:

    + +
    +Image *SampleImage(const Image *image,const size_t columns,
    +  const size_t rows,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    columns
    +
    the number of columns in the sampled image.
    + +
    +
    rows
    +
    the number of rows in the sampled image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ScaleImage

    + +

    ScaleImage() changes the size of an image to the given dimensions.

    + +

    The format of the ScaleImage method is:

    + +
    +Image *ScaleImage(const Image *image,const size_t columns,
    +  const size_t rows,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    columns
    +
    the number of columns in the scaled image.
    + +
    +
    rows
    +
    the number of rows in the scaled image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ThumbnailImage

    + +

    ThumbnailImage() changes the size of an image to the given dimensions and removes any associated profiles. The goal is to produce small low cost thumbnail images suited for display on the Web.

    + +

    The format of the ThumbnailImage method is:

    + +
    +Image *ThumbnailImage(const Image *image,const size_t columns,
    +  const size_t rows,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    columns
    +
    the number of columns in the scaled image.
    + +
    +
    rows
    +
    the number of rows in the scaled image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/resource.html b/ImageMagick-6.9.12-44/www/api/resource.html new file mode 100644 index 0000000..f1fca95 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/resource.html @@ -0,0 +1,312 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Monitor or Limit Resource Consumption + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AcquireMagickResourceAcquireUniqueFileResourceGetMagickResourceGetMagickResourceLimitListMagickResourceInfoRelinquishMagickResourceRelinquishUniqueFileResourceSetMagickResourceLimit

    + +

    AcquireMagickResource

    + +

    AcquireMagickResource() acquires resources of the specified type. MagickFalse is returned if the specified resource is exhausted otherwise MagickTrue.

    + +

    The format of the AcquireMagickResource() method is:

    + +
    +MagickBooleanType AcquireMagickResource(const ResourceType type,
    +  const MagickSizeType size)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    type
    +
    the type of resource.
    + +
    +
    size
    +
    the number of bytes needed from for this resource.
    + +
    +
    +

    AcquireUniqueFileResource

    + +

    AcquireUniqueFileResource() returns a unique file name, and returns a file descriptor for the file open for reading and writing.

    + +

    The format of the AcquireUniqueFileResource() method is:

    + +
    +int AcquireUniqueFileResource(char *path)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    path
    +
    Specifies a pointer to an array of characters. The unique path name is returned in this array.
    + +
    +
    +

    GetMagickResource

    + +

    GetMagickResource() returns the specified resource.

    + +

    The format of the GetMagickResource() method is:

    + +
    +MagickSizeType GetMagickResource(const ResourceType type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    type
    +
    the type of resource.
    + +
    +
    +

    GetMagickResourceLimit

    + +

    GetMagickResourceLimit() returns the specified resource limit.

    + +

    The format of the GetMagickResourceLimit() method is:

    + +
    +MagickSizeType GetMagickResourceLimit(const ResourceType type)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    type
    +
    the type of resource.
    + +
    +
    +

    ListMagickResourceInfo

    + +

    ListMagickResourceInfo() lists the resource info to a file.

    + +

    The format of the ListMagickResourceInfo method is:

    + +
    +MagickBooleanType ListMagickResourceInfo(FILE *file,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    file
    +

    An pointer to a FILE.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    RelinquishMagickResource

    + +

    RelinquishMagickResource() relinquishes resources of the specified type.

    + +

    The format of the RelinquishMagickResource() method is:

    + +
    +void RelinquishMagickResource(const ResourceType type,
    +  const MagickSizeType size)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    type
    +
    the type of resource.
    + +
    +
    size
    +
    the size of the resource.
    + +
    +
    +

    RelinquishUniqueFileResource

    + +

    RelinquishUniqueFileResource() relinquishes a unique file resource.

    + +

    The format of the RelinquishUniqueFileResource() method is:

    + +
    +MagickBooleanType RelinquishUniqueFileResource(const char *path)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    name
    +
    the name of the temporary resource.
    + +
    +
    +

    SetMagickResourceLimit

    + +

    SetMagickResourceLimit() sets the limit for a particular resource.

    + +

    The format of the SetMagickResourceLimit() method is:

    + +
    +MagickBooleanType SetMagickResourceLimit(const ResourceType type,
    +  const MagickSizeType limit)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    type
    +
    the type of resource.
    + +
    +
    limit
    +
    the maximum limit for the resource.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/segment.html b/ImageMagick-6.9.12-44/www/api/segment.html new file mode 100644 index 0000000..5e97084 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/segment.html @@ -0,0 +1,153 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Segment an Image with Thresholding Fuzzy c-Means + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    SegmentImage

    + +

    SegmentImage

    + +

    SegmentImage() segment an image by analyzing the histograms of the color components and identifying units that are homogeneous with the fuzzy C-means technique.

    + +

    The format of the SegmentImage method is:

    + +
    +MagickBooleanType SegmentImage(Image *image,
    +  const ColorspaceType colorspace,const MagickBooleanType verbose,
    +  const double cluster_threshold,const double smooth_threshold)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    colorspace
    +

    Indicate the colorspace.

    + +
    verbose
    +

    Set to MagickTrue to print detailed information about the identified classes.

    + +
    cluster_threshold
    +

    This represents the minimum number of pixels contained in a hexahedra before it can be considered valid (expressed as a percentage).

    + +
    smooth_threshold
    +

    the smoothing threshold eliminates noise in the second derivative of the histogram. As the value is increased, you can expect a smoother second derivative.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/shear.html b/ImageMagick-6.9.12-44/www/api/shear.html new file mode 100644 index 0000000..b150978 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/shear.html @@ -0,0 +1,230 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Shear or Rotate an Image by an Arbitrary Angle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    The XShearImageDeskewImageIntegralRotateImageShearImageShearRotateImage

    + +

    The XShearImage

    + +

    The XShearImage() and YShearImage() methods are based on the paper "A Fast Algorithm for General Raster Rotation" by Alan W. Paeth, Graphics Interface '86 (Vancouver). ShearRotateImage() is adapted from a similar method based on the Paeth paper written by Michael Halle of the Spatial Imaging Group, MIT Media Lab.

    + +

    DeskewImage

    + +

    DeskewImage() removes skew from the image. Skew is an artifact that occurs in scanned images because of the camera being misaligned, imperfections in the scanning or surface, or simply because the paper was not placed completely flat when scanned.

    + +

    The amount of rotation calculated to deskew the image is saved in the artifact "deskew:angle".

    + +

    If the artifact "deskew:auto-crop" is given the image will be automatically cropped of the excess background.

    + +

    The format of the DeskewImage method is:

    + +
    +Image *DeskewImage(const Image *image,const double threshold,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    threshold
    +
    separate background from foreground.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    IntegralRotateImage

    + +

    IntegralRotateImage() rotates the image an integral of 90 degrees. It allocates the memory necessary for the new Image structure and returns a pointer to the rotated image.

    + +

    The format of the IntegralRotateImage method is:

    + +
    +Image *IntegralRotateImage(const Image *image,size_t rotations,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    rotations
    +

    Specifies the number of 90 degree rotations.

    + +

    ShearImage

    + +

    ShearImage() creates a new image that is a shear_image copy of an existing one. Shearing slides one edge of an image along the X or Y axis, creating a parallelogram. An X direction shear slides an edge along the X axis, while a Y direction shear slides an edge along the Y axis. The amount of the shear is controlled by a shear angle. For X direction shears, x_shear is measured relative to the Y axis, and similarly, for Y direction shears y_shear is measured relative to the X axis. Empty triangles left over from shearing the image are filled with the background color defined by member 'background_color' of the image.. ShearImage() allocates the memory necessary for the new Image structure and returns a pointer to the new image.

    + +

    ShearImage() is based on the paper "A Fast Algorithm for General Raster Rotatation" by Alan W. Paeth.

    + +

    The format of the ShearImage method is:

    + +
    +Image *ShearImage(const Image *image,const double x_shear,
    +  const double y_shear,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    x_shear, y_shear
    +

    Specifies the number of degrees to shear the image.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +

    ShearRotateImage

    + +

    ShearRotateImage() creates a new image that is a rotated copy of an existing one. Positive angles rotate counter-clockwise (right-hand rule), while negative angles rotate clockwise. Rotated images are usually larger than the originals and have 'empty' triangular corners. X axis. Empty triangles left over from shearing the image are filled with the background color defined by member 'background_color' of the image. ShearRotateImage allocates the memory necessary for the new Image structure and returns a pointer to the new image.

    + +

    ShearRotateImage() is based on the paper "A Fast Algorithm for General Raster Rotatation" by Alan W. Paeth. ShearRotateImage is adapted from a similar method based on the Paeth paper written by Michael Halle of the Spatial Imaging Group, MIT Media Lab.

    + +

    The format of the ShearRotateImage method is:

    + +
    +Image *ShearRotateImage(const Image *image,const double degrees,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows.

    + +
    image
    +

    the image.

    + +
    degrees
    +

    Specifies the number of degrees to rotate the image.

    + +
    exception
    +

    return any errors or warnings in this structure.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/signature.html b/ImageMagick-6.9.12-44/www/api/signature.html new file mode 100644 index 0000000..8f310bc --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/signature.html @@ -0,0 +1,146 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Compute a Message Digest for an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    SignatureImage

    + +

    SignatureImage

    + +

    SignatureImage() computes a message digest from an image pixel stream with an implementation of the NIST SHA-256 Message Digest algorithm. This signature uniquely identifies the image and is convenient for determining if an image has been modified or whether two images are identical.

    + +

    The format of the SignatureImage method is:

    + +
    +MagickBooleanType SignatureImage(Image *image)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/statistic.html b/ImageMagick-6.9.12-44/www/api/statistic.html new file mode 100644 index 0000000..c2337ee --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/statistic.html @@ -0,0 +1,545 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Image Statistics + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    EvaluateImageFunctionImageGetImageChannelEntropyGetImageChannelKurtosisGetImageChannelMeanGetImageChannelMomentsGetImageChannelPerceptualHashGetImageChannelRangeGetImageChannelStatisticsPolynomialImageStatisticImage

    + +

    EvaluateImage

    + +

    EvaluateImage() applies a value to the image with an arithmetic, relational, or logical operator to an image. Use these operations to lighten or darken an image, to increase or decrease contrast in an image, or to produce the "negative" of an image.

    + +

    The format of the EvaluateImageChannel method is:

    + +
    +MagickBooleanType EvaluateImage(Image *image,
    +  const MagickEvaluateOperator op,const double value,
    +  ExceptionInfo *exception)
    +MagickBooleanType EvaluateImages(Image *images,
    +  const MagickEvaluateOperator op,const double value,
    +  ExceptionInfo *exception)
    +MagickBooleanType EvaluateImageChannel(Image *image,
    +  const ChannelType channel,const MagickEvaluateOperator op,
    +  const double value,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    op
    +
    A channel op.
    + +
    +
    value
    +
    A value value.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    FunctionImage

    + +

    FunctionImage() applies a value to the image with an arithmetic, relational, or logical operator to an image. Use these operations to lighten or darken an image, to increase or decrease contrast in an image, or to produce the "negative" of an image.

    + +

    The format of the FunctionImageChannel method is:

    + +
    +MagickBooleanType FunctionImage(Image *image,
    +  const MagickFunction function,const ssize_t number_parameters,
    +  const double *parameters,ExceptionInfo *exception)
    +MagickBooleanType FunctionImageChannel(Image *image,
    +  const ChannelType channel,const MagickFunction function,
    +  const ssize_t number_parameters,const double *argument,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    function
    +
    A channel function.
    + +
    +
    parameters
    +
    one or more parameters.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetImageChannelEntropy

    + +

    GetImageChannelEntropy() returns the entropy of one or more image channels.

    + +

    The format of the GetImageChannelEntropy method is:

    + +
    +MagickBooleanType GetImageChannelEntropy(const Image *image,
    +  const ChannelType channel,double *entropy,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    entropy
    +
    the average entropy of the selected channels.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetImageChannelKurtosis

    + +

    GetImageChannelKurtosis() returns the kurtosis and skewness of one or more image channels.

    + +

    The format of the GetImageChannelKurtosis method is:

    + +
    +MagickBooleanType GetImageChannelKurtosis(const Image *image,
    +  const ChannelType channel,double *kurtosis,double *skewness,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    kurtosis
    +
    the kurtosis of the channel.
    + +
    +
    skewness
    +
    the skewness of the channel.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetImageChannelMean

    + +

    GetImageChannelMean() returns the mean and standard deviation of one or more image channels.

    + +

    The format of the GetImageChannelMean method is:

    + +
    +MagickBooleanType GetImageChannelMean(const Image *image,
    +  const ChannelType channel,double *mean,double *standard_deviation,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    mean
    +
    the average value in the channel.
    + +
    +
    standard_deviation
    +
    the standard deviation of the channel.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetImageChannelMoments

    + +

    GetImageChannelMoments() returns the normalized moments of one or more image channels.

    + +

    The format of the GetImageChannelMoments method is:

    + +
    +ChannelMoments *GetImageChannelMoments(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetImageChannelPerceptualHash

    + +

    GetImageChannelPerceptualHash() returns the perceptual hash of one or more image channels.

    + +

    The format of the GetImageChannelPerceptualHash method is:

    + +
    +ChannelPerceptualHash *GetImageChannelPerceptualHash(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetImageChannelRange

    + +

    GetImageChannelRange() returns the range of one or more image channels.

    + +

    The format of the GetImageChannelRange method is:

    + +
    +MagickBooleanType GetImageChannelRange(const Image *image,
    +  const ChannelType channel,double *minima,double *maxima,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    minima
    +
    the minimum value in the channel.
    + +
    +
    maxima
    +
    the maximum value in the channel.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    GetImageChannelStatistics

    + +

    GetImageChannelStatistics() returns statistics for each channel in the image. The statistics include the channel depth, its minima, maxima, mean, standard deviation, kurtosis and skewness. You can access the red channel mean, for example, like this:

    + +
    +channel_statistics=GetImageChannelStatistics(image,exception);
    +red_mean=channel_statistics[RedChannel].mean;
    +
    + +

    Use MagickRelinquishMemory() to free the statistics buffer.

    + +

    The format of the GetImageChannelStatistics method is:

    + +
    +ChannelStatistics *GetImageChannelStatistics(const Image *image,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    PolynomialImage

    + +

    PolynomialImage() returns a new image where each pixel is the sum of the pixels in the image sequence after applying its corresponding terms (coefficient and degree pairs).

    + +

    The format of the PolynomialImage method is:

    + +
    +Image *PolynomialImage(const Image *images,const size_t number_terms,
    +  const double *terms,ExceptionInfo *exception)
    +Image *PolynomialImageChannel(const Image *images,
    +  const size_t number_terms,const ChannelType channel,
    +  const double *terms,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    images
    +
    the image sequence.
    + +
    +
    channel
    +
    the channel.
    + +
    +
    number_terms
    +
    the number of terms in the list. The actual list length is 2 x number_terms + 1 (the constant).
    + +
    +
    terms
    +
    the list of polynomial coefficients and degree pairs and a constant.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    StatisticImage

    + +

    StatisticImage() makes each pixel the min / max / median / mode / etc. of the neighborhood of the specified width and height.

    + +

    The format of the StatisticImage method is:

    + +
    +Image *StatisticImage(const Image *image,const StatisticType type,
    +  const size_t width,const size_t height,ExceptionInfo *exception)
    +Image *StatisticImageChannel(const Image *image,
    +  const ChannelType channel,const StatisticType type,
    +  const size_t width,const size_t height,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    channel
    +
    the image channel.
    + +
    +
    type
    +
    the statistic type (median, mode, etc.).
    + +
    +
    width
    +
    the width of the pixel neighborhood.
    + +
    +
    height
    +
    the height of the pixel neighborhood.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/stream.html b/ImageMagick-6.9.12-44/www/api/stream.html new file mode 100644 index 0000000..b70358f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/stream.html @@ -0,0 +1,163 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: The Pixel FIFO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    StreamImageCommand

    + +

    StreamImageCommand

    + +

    StreamImageCommand() is a lightweight method designed to extract pixels from large image files to a raw format using a minimum of system resources. The entire image or any regular portion of the image can be extracted.

    + +

    The format of the StreamImageCommand method is:

    + +
    +MagickBooleanType StreamImageCommand(ImageInfo *image_info,int argc,
    +  char **argv,char **metadata,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_info
    +
    the image info.
    + +
    +
    argc
    +
    the number of elements in the argument vector.
    + +
    +
    argv
    +
    A text array containing the command line arguments.
    + +
    +
    metadata
    +
    any metadata is returned here.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/transform.html b/ImageMagick-6.9.12-44/www/api/transform.html new file mode 100644 index 0000000..d38342f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/transform.html @@ -0,0 +1,604 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Transform an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    AutoOrientImageChopImageCropImageCropImageToTilesExcerptImageExtentImageFlipImageFlopImageRollImageShaveImageSpliceImageTransformImageto CropImageToTilesTransformImagesTransposeImageTransverseImageTrimImage

    + +

    AutoOrientImage

    + +

    AutoOrientImage() adjusts an image so that its orientation is suitable for viewing (i.e. top-left orientation).

    + +

    The format of the AutoOrientImage method is:

    + +
    +Image *AutoOrientImage(const Image *image,
    +  const OrientationType orientation,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    The image.
    + +
    +
    orientation
    +
    Current image orientation.
    + +
    +
    exception
    +
    Return any errors or warnings in this structure.
    + +
    +
    +

    ChopImage

    + +

    ChopImage() removes a region of an image and collapses the image to occupy the removed portion.

    + +

    The format of the ChopImage method is:

    + +
    +Image *ChopImage(const Image *image,const RectangleInfo *chop_info)
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    chop_info
    +
    Define the region of the image to chop.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    CropImage

    + +

    CropImage() extracts a region of the image starting at the offset defined by geometry. Region must be fully defined, and no special handling of geometry flags is performed.

    + +

    The format of the CropImage method is:

    + +
    +Image *CropImage(const Image *image,const RectangleInfo *geometry,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    geometry
    +
    Define the region of the image to crop with members x, y, width, and height.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    CropImageToTiles

    + +

    CropImageToTiles() crops a single image, into a possible list of tiles. This may include a single sub-region of the image. This basically applies all the normal geometry flags for Crop.

    + +

    Image *CropImageToTiles(const Image *image, const RectangleInfo *crop_geometry,ExceptionInfo *exception)

    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image The transformed image is returned as this parameter.
    + +
    +
    crop_geometry
    +
    A crop geometry string.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ExcerptImage

    + +

    ExcerptImage() returns a excerpt of the image as defined by the geometry.

    + +

    The format of the ExcerptImage method is:

    + +
    +Image *ExcerptImage(const Image *image,const RectangleInfo *geometry,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    geometry
    +
    Define the region of the image to extend with members x, y, width, and height.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ExtentImage

    + +

    ExtentImage() extends the image as defined by the geometry, gravity, and image background color. Set the (x,y) offset of the geometry to move the original image relative to the extended image.

    + +

    The format of the ExtentImage method is:

    + +
    +Image *ExtentImage(const Image *image,const RectangleInfo *geometry,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    geometry
    +
    Define the region of the image to extend with members x, y, width, and height.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    FlipImage

    + +

    FlipImage() creates a vertical mirror image by reflecting the pixels around the central x-axis.

    + +

    The format of the FlipImage method is:

    + +
    +Image *FlipImage(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    FlopImage

    + +

    FlopImage() creates a horizontal mirror image by reflecting the pixels around the central y-axis.

    + +

    The format of the FlopImage method is:

    + +
    +Image *FlopImage(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    RollImage

    + +

    RollImage() offsets an image as defined by x_offset and y_offset.

    + +

    The format of the RollImage method is:

    + +
    +Image *RollImage(const Image *image,const ssize_t x_offset,
    +  const ssize_t y_offset,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    x_offset
    +
    the number of columns to roll in the horizontal direction.
    + +
    +
    y_offset
    +
    the number of rows to roll in the vertical direction.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    ShaveImage

    + +

    ShaveImage() shaves pixels from the image edges. It allocates the memory necessary for the new Image structure and returns a pointer to the new image.

    + +

    The format of the ShaveImage method is:

    + +
    +Image *ShaveImage(const Image *image,const RectangleInfo *shave_info,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    shave_image
    +
    Method ShaveImage returns a pointer to the shaved image. A null image is returned if there is a memory shortage or if the image width or height is zero.
    + +
    +
    image
    +
    the image.
    + +
    +
    shave_info
    +
    Specifies a pointer to a RectangleInfo which defines the region of the image to crop.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    SpliceImage

    + +

    SpliceImage() splices a solid color into the image as defined by the geometry.

    + +

    The format of the SpliceImage method is:

    + +
    +Image *SpliceImage(const Image *image,const RectangleInfo *geometry,
    +  ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    geometry
    +
    Define the region of the image to splice with members x, y, width, and height.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    TransformImage

    + +

    TransformImage() is a convenience method that behaves like ResizeImage() or CropImage() but accepts scaling and/or cropping information as a region geometry specification. If the operation fails, the original image handle is left as is.

    + +

    This should only be used for single images.

    + +

    The format of the TransformImage method is:

    + +
    +MagickBooleanType TransformImage(Image **image,const char *crop_geometry,
    +  const char *image_geometry)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image The transformed image is returned as this parameter.
    + +
    +
    crop_geometry
    +
    A crop geometry string. This geometry defines a subregion of the image to crop.
    + +
    +
    image_geometry
    +
    An image geometry string. This geometry defines the final size of the image.
    + +
    +
    +

    to CropImageToTiles

    + +

    to CropImageToTiles() or ResizeImage(), as appropriate.

    + +

    TransformImages

    + +

    TransformImages() calls TransformImage() on each image of a sequence.

    + +

    The format of the TransformImage method is:

    + +
    +MagickBooleanType TransformImages(Image **image,
    +  const char *crop_geometry,const char *image_geometry)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image The transformed image is returned as this parameter.
    + +
    +
    crop_geometry
    +
    A crop geometry string. This geometry defines a subregion of the image to crop.
    + +
    +
    image_geometry
    +
    An image geometry string. This geometry defines the final size of the image.
    + +
    +
    +

    TransposeImage

    + +

    TransposeImage() creates a horizontal mirror image by reflecting the pixels around the central y-axis while rotating them by 90 degrees.

    + +

    The format of the TransposeImage method is:

    + +
    +Image *TransposeImage(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    TransverseImage

    + +

    TransverseImage() creates a vertical mirror image by reflecting the pixels around the central x-axis while rotating them by 270 degrees.

    + +

    The format of the TransverseImage method is:

    + +
    +Image *TransverseImage(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +

    TrimImage

    + +

    TrimImage() trims pixels from the image edges. It allocates the memory necessary for the new Image structure and returns a pointer to the new image.

    + +

    The format of the TrimImage method is:

    + +
    +Image *TrimImage(const Image *image,ExceptionInfo *exception)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image
    +
    the image.
    + +
    +
    exception
    +
    return any errors or warnings in this structure.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/version.html b/ImageMagick-6.9.12-44/www/api/version.html new file mode 100644 index 0000000..39e41ff --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/version.html @@ -0,0 +1,312 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, C API: Get the Version and Copyrights + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    GetMagickCopyrightGetMagickDelegatesGetMagickFeaturesGetMagickHomeURLGetMagickLicenseGetMagickPackageNameGetMagickQuantumDepthGetMagickQuantumRangeGetMagickReleaseDateGetMagickCoreSignatureGetMagickVersionListMagickVersion

    + +

    GetMagickCopyright

    + +

    GetMagickCopyright() returns the ImageMagick API copyright as a string.

    + +

    The format of the GetMagickCopyright method is:

    + +
    +const char *GetMagickCopyright(void)
    +
    + +

    GetMagickDelegates

    + +

    GetMagickDelegates() returns the ImageMagick delegate libraries.

    + +

    The format of the GetMagickDelegates method is:

    + +
    +const char *GetMagickDelegates(void)
    +
    + +

    No parameters are required.

    + +

    GetMagickFeatures

    + +

    GetMagickFeatures() returns the ImageMagick features.

    + +

    The format of the GetMagickFeatures method is:

    + +
    +const char *GetMagickFeatures(void)
    +
    + +

    No parameters are required.

    + +

    GetMagickHomeURL

    + +

    GetMagickHomeURL() returns the ImageMagick home URL.

    + +

    The format of the GetMagickHomeURL method is:

    + +
    +char *GetMagickHomeURL(void)
    +
    + +

    GetMagickLicense

    + +

    GetMagickLicense() returns the ImageMagick API license as a string.

    + +

    The format of the GetMagickLicense method is:

    + +
    +const char *GetMagickLicense(void)
    +
    + +

    GetMagickPackageName

    + +

    GetMagickPackageName() returns the ImageMagick package name.

    + +

    The format of the GetMagickName method is:

    + +
    +const char *GetMagickName(void)
    +
    + +

    No parameters are required.

    + +

    GetMagickQuantumDepth

    + +

    GetMagickQuantumDepth() returns the ImageMagick quantum depth.

    + +

    The format of the GetMagickQuantumDepth method is:

    + +
    +const char *GetMagickQuantumDepth(size_t *depth)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    depth
    +
    the quantum depth is returned as a number.
    + +
    +
    +

    GetMagickQuantumRange

    + +

    GetMagickQuantumRange() returns the ImageMagick quantum range.

    + +

    The format of the GetMagickQuantumRange method is:

    + +
    +const char *GetMagickQuantumRange(size_t *range)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    range
    +
    the quantum range is returned as a number.
    + +
    +
    +

    GetMagickReleaseDate

    + +

    GetMagickReleaseDate() returns the ImageMagick release date.

    + +

    The format of the GetMagickReleaseDate method is:

    + +
    +const char *GetMagickReleaseDate(void)
    +
    + +

    No parameters are required.

    + +

    GetMagickCoreSignature

    + +

    GetMagickCoreSignature() returns a signature that uniquely encodes the MagickCore libary version, quantum depth, HDRI status, OS word size, and endianness.

    + +

    The format of the GetMagickCoreSignature method is:

    + +
    +unsigned int GetMagickCoreSignature(const StringInfo *nonce)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    nonce
    +
    arbitrary data.
    + +
    +
    +

    GetMagickVersion

    + +

    GetMagickVersion() returns the ImageMagick API version as a string and as a number.

    + +

    The format of the GetMagickVersion method is:

    + +
    +const char *GetMagickVersion(size_t *version)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    version
    +
    the ImageMagick version is returned as a number.
    + +
    +
    +

    ListMagickVersion

    + +

    ListMagickVersion() identifies the ImageMagick version by printing its attributes to the file. Attributes include the copyright, features, and delegates.

    + +

    The format of the ListMagickVersion method is:

    + +
    +void ListMagickVersion(FILE *file)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    file
    +
    the file, typically stdout.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/api/wand-view.html b/ImageMagick-6.9.12-44/www/api/wand-view.html new file mode 100644 index 0000000..4f65059 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/api/wand-view.html @@ -0,0 +1,630 @@ + + + + + + + + + + ImageMagick (legacy) – MagickWand, C API: Wand View Methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    CloneWandViewDestroyWandViewDuplexTransferWandViewIteratorGetWandViewExceptionGetWandViewExtentGetWandViewIteratorGetWandViewPixelsGetWandViewWandIsWandViewNewWandViewNewWandViewExtentSetWandViewDescriptionSetWandViewIteratorSetWandViewThreadsTransferWandViewIteratorUpdateWandViewIterator

    + +

    CloneWandView

    + +

    CloneWandView() makes a copy of the specified wand view.

    + +

    The format of the CloneWandView method is:

    + +
    +WandView *CloneWandView(const WandView *wand_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand_view
    +
    the wand view.
    + +
    +
    +

    DestroyWandView

    + +

    DestroyWandView() deallocates memory associated with a wand view.

    + +

    The format of the DestroyWandView method is:

    + +
    +WandView *DestroyWandView(WandView *wand_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand_view
    +
    the wand view.
    + +
    +
    +

    DuplexTransferWandViewIterator

    + +

    DuplexTransferWandViewIterator() iterates over three wand views in parallel and calls your transfer method for each scanline of the view. The source and duplex pixel extent is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. However, the destination wand view is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted.

    + +

    The callback signature is:

    + +
    +MagickBooleanType DuplexTransferImageViewMethod(const WandView *source,
    +  const WandView *duplex,WandView *destination,const ssize_t y,
    +  const int thread_id,void *context)
    +
    + +

    Use this pragma if the view is not single threaded:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback transfer method that must be executed by a single thread at a time.

    + +

    The format of the DuplexTransferWandViewIterator method is:

    + +
    +MagickBooleanType DuplexTransferWandViewIterator(WandView *source,
    +  WandView *duplex,WandView *destination,
    +  DuplexTransferWandViewMethod transfer,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source wand view.
    + +
    +
    duplex
    +
    the duplex wand view.
    + +
    +
    destination
    +
    the destination wand view.
    + +
    +
    transfer
    +
    the transfer callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    GetWandViewException

    + +

    GetWandViewException() returns the severity, reason, and description of any error that occurs when utilizing a wand view.

    + +

    The format of the GetWandViewException method is:

    + +
    +char *GetWandViewException(const WandView *wand_view,
    +  ExceptionType *severity)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand_view
    +
    the pixel wand_view.
    + +
    +
    severity
    +
    the severity of the error is returned here.
    + +
    +
    +

    GetWandViewExtent

    + +

    GetWandViewExtent() returns the wand view extent.

    + +

    The format of the GetWandViewExtent method is:

    + +
    +RectangleInfo GetWandViewExtent(const WandView *wand_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand_view
    +
    the wand view.
    + +
    +
    +

    GetWandViewIterator

    + +

    GetWandViewIterator() iterates over the wand view in parallel and calls your get method for each scanline of the view. The pixel extent is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. Any updates to the pixels in your callback are ignored.

    + +

    The callback signature is:

    + +
    +MagickBooleanType GetImageViewMethod(const WandView *source,
    +  const ssize_t y,const int thread_id,void *context)
    +
    + +

    Use this pragma if the view is not single threaded:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback get method that must be executed by a single thread at a time.

    + +

    The format of the GetWandViewIterator method is:

    + +
    +MagickBooleanType GetWandViewIterator(WandView *source,
    +  GetWandViewMethod get,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source wand view.
    + +
    +
    get
    +
    the get callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    GetWandViewPixels

    + +

    GetWandViewPixels() returns the wand view pixel_wands.

    + +

    The format of the GetWandViewPixels method is:

    + +
    +PixelWand *GetWandViewPixels(const WandView *wand_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand_view
    +
    the wand view.
    + +
    +
    +

    GetWandViewWand

    + +

    GetWandViewWand() returns the magick wand associated with the wand view.

    + +

    The format of the GetWandViewWand method is:

    + +
    +MagickWand *GetWandViewWand(const WandView *wand_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand_view
    +
    the wand view.
    + +
    +
    +

    IsWandView

    + +

    IsWandView() returns MagickTrue if the parameter is verified as a wand view object.

    + +

    The format of the IsWandView method is:

    + +
    +MagickBooleanType IsWandView(const WandView *wand_view)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand_view
    +
    the wand view.
    + +
    +
    +

    NewWandView

    + +

    NewWandView() returns a wand view required for all other methods in the Wand View API.

    + +

    The format of the NewWandView method is:

    + +
    +WandView *NewWandView(MagickWand *wand)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the wand.
    + +
    +
    +

    NewWandViewExtent

    + +

    NewWandViewExtent() returns a wand view required for all other methods in the Wand View API.

    + +

    The format of the NewWandViewExtent method is:

    + +
    +WandView *NewWandViewExtent(MagickWand *wand,const ssize_t x,
    +  const ssize_t y,const size_t width,const size_t height)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand
    +
    the magick wand.
    + +
    +
    x,y,columns,rows
    +
    These values define the perimeter of a extent of pixel_wands view.
    + +
    +
    +

    SetWandViewDescription

    + +

    SetWandViewDescription() associates a description with an image view.

    + +

    The format of the SetWandViewDescription method is:

    + +
    +void SetWandViewDescription(WandView *image_view,const char *description)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    wand_view
    +
    the wand view.
    + +
    +
    description
    +
    the wand view description.
    + +
    +
    +

    SetWandViewIterator

    + +

    SetWandViewIterator() iterates over the wand view in parallel and calls your set method for each scanline of the view. The pixel extent is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension. The pixels are initiallly undefined and any settings you make in the callback method are automagically synced back to your image.

    + +

    The callback signature is:

    + +
    +MagickBooleanType SetImageViewMethod(ImageView *destination,
    +  const ssize_t y,const int thread_id,void *context)
    +
    + +

    Use this pragma if the view is not single threaded:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback set method that must be executed by a single thread at a time.

    + +

    The format of the SetWandViewIterator method is:

    + +
    +MagickBooleanType SetWandViewIterator(WandView *destination,
    +  SetWandViewMethod set,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    destination
    +
    the wand view.
    + +
    +
    set
    +
    the set callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    SetWandViewThreads

    + +

    SetWandViewThreads() sets the number of threads in a thread team.

    + +

    The format of the SetWandViewDescription method is:

    + +
    +void SetWandViewThreads(WandView *image_view,
    +  const size_t number_threads)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    image_view
    +
    the image view.
    + +
    +
    number_threads
    +
    the number of threads in a thread team.
    + +
    +
    +

    TransferWandViewIterator

    + +

    TransferWandViewIterator() iterates over two wand views in parallel and calls your transfer method for each scanline of the view. The source pixel extent is not confined to the image canvas-- that is you can include negative offsets or widths or heights that exceed the image dimension. However, the destination wand view is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted.

    + +

    The callback signature is:

    + +
    +MagickBooleanType TransferImageViewMethod(const WandView *source,
    +  WandView *destination,const ssize_t y,const int thread_id,
    +  void *context)
    +
    + +

    Use this pragma if the view is not single threaded:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback transfer method that must be executed by a single thread at a time.

    + +

    The format of the TransferWandViewIterator method is:

    + +
    +MagickBooleanType TransferWandViewIterator(WandView *source,
    +  WandView *destination,TransferWandViewMethod transfer,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source wand view.
    + +
    +
    destination
    +
    the destination wand view.
    + +
    +
    transfer
    +
    the transfer callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +

    UpdateWandViewIterator

    + +

    UpdateWandViewIterator() iterates over the wand view in parallel and calls your update method for each scanline of the view. The pixel extent is confined to the image canvas-- that is no negative offsets or widths or heights that exceed the image dimension are permitted. Updates to pixels in your callback are automagically synced back to the image.

    + +

    The callback signature is:

    + +
    +MagickBooleanType UpdateImageViewMethod(WandView *source,const ssize_t y,
    +  const int thread_id,void *context)
    +
    + +

    Use this pragma if the view is not single threaded:

    + +
    +    #pragma omp critical
    +
    + +

    to define a section of code in your callback update method that must be executed by a single thread at a time.

    + +

    The format of the UpdateWandViewIterator method is:

    + +
    +MagickBooleanType UpdateWandViewIterator(WandView *source,
    +  UpdateWandViewMethod update,void *context)
    +
    + +

    A description of each parameter follows:

    + +
    +
    + +
    +
    +
    source
    +
    the source wand view.
    + +
    +
    update
    +
    the update callback method.
    + +
    +
    context
    +
    the user defined context.
    + +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/architecture.html b/ImageMagick-6.9.12-44/www/architecture.html new file mode 100644 index 0000000..d79c356 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/architecture.html @@ -0,0 +1,1507 @@ + + + + + + + + + + ImageMagick (legacy) – Architecture + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Architecture

    +

    The Pixel CacheStreaming PixelsImage Properties and ProfilesLarge Image SupportThreads of ExecutionHeterogeneous Distributed ProcessingCustom Image CodersCustom Image Filters

    + +

    The citizens of Oz were quite content with their benefactor, the all-powerful Wizard. They accepted his wisdom and benevolence without ever questioning the who, why, and where of his power. Like the citizens of Oz, if you feel comfortable that ImageMagick can help you convert, edit, or compose your images without knowing what goes on behind the curtain, feel free to skip this section. However, if you want to know more about the software and algorithms behind ImageMagick, read on. To fully benefit from this discussion, you should be comfortable with image nomenclature and be familiar with computer programming.

    + +

    Architecture Overview

    + +

    An image typically consists of a rectangular region of pixels and metadata. To convert, edit, or compose an image in an efficient manner, we need convenient access to any pixel anywhere within the region (and sometimes outside the region). And in the case of an image sequence, we need access to any pixel of any region of any image in the sequence. However, there are hundreds of image formats such JPEG, TIFF, PNG, GIF, etc., that makes it difficult to access pixels on demand. Within these formats we find differences in:

    + +
      +
    • colorspace (e.g sRGB, linear RGB, linear GRAY, CMYK, YUV, Lab, etc.)
    • +
    • bit depth (.e.g 1, 4, 8, 12, 16, etc.)
    • +
    • storage format (e.g. unsigned, signed, float, double, etc.)
    • +
    • compression (e.g. uncompressed, RLE, Zip, BZip, etc.)
    • +
    • orientation (i.e. top-to-bottom, right-to-left, etc.),
    • +
    • layout (.e.g. raw, interspersed with opcodes, etc.)
    • +
    + +

    In addition, some image pixels may require attenuation, some formats permit more than one frame, and some formats contain vector graphics that must first be rasterized (converted from vector to pixels).

    + +

    An efficient implementation of an image processing algorithm may require we get or set:

    + +
      +
    • one pixel a time (e.g. pixel at location 10,3)
    • +
    • a single scanline (e.g. all pixels from row 4)
    • +
    • a few scanlines at once (e.g. pixel rows 4-7)
    • +
    • a single column or columns of pixels (e.g. all pixels from column 11)
    • +
    • an arbitrary region of pixels from the image (e.g. pixels defined at 10,7 to 10,19)
    • +
    • a pixel in random order (e.g. pixel at 14,15 and 640,480)
    • +
    • pixels from two different images (e.g. pixel at 5,1 from image 1 and pixel at 5,1 from image 2)
    • +
    • pixels outside the boundaries of the image (e.g. pixel at -1,-3)
    • +
    • a pixel component that is unsigned (65311) or in a floating-point representation (e.g. 0.17836)
    • +
    • a high-dynamic range pixel that can include negative values (e.g. -0.0072973525628) as well as values that exceed the quantum depth (e.g. 65931)
    • +
    • one or more pixels simultaneously in different threads of execution
    • +
    • all the pixels in memory to take advantage of speed-ups offered by executing in concert across heterogeneous platforms consisting of CPUs, GPUs, and other processors
    • +
    + +

    Some images include a clip mask that define which pixels are eligible to be updated. Pixels outside the area defined by the clip mask remain untouched.

    + +

    Given the varied image formats and image processing requirements, we implemented the ImageMagick pixel cache to provide convenient sequential or parallel access to any pixel on demand anywhere inside the image region (i.e. authentic pixels) and from any image in a sequence. In addition, the pixel cache permits access to pixels outside the boundaries defined by the image (i.e. virtual pixels).

    + +

    In addition to pixels, images have a plethora of image properties and profiles. Properties include the well known attributes such as width, height, depth, and colorspace. An image may have optional properties which might include the image author, a comment, a create date, and others. Some images also include profiles for color management, or EXIF, IPTC, 8BIM, or XMP informational profiles. ImageMagick provides command line options and programming methods to get, set, or view image properties or profiles or apply profiles.

    + +

    ImageMagick consists of nearly a half million lines of C code and optionally depends on several million lines of code in dependent libraries (e.g. JPEG, PNG, TIFF libraries). Given that, one might expect a huge architecture document. However, a great majority of image processing is simply accessing pixels and its metadata and our simple, elegant, and efficient implementation makes this easy for the ImageMagick developer. We discuss the implementation of the pixel cache and getting and setting image properties and profiles in the next few sections. Next, we discuss using ImageMagick within a thread of execution. In the final sections, we discuss image coders to read or write a particular image format followed by a few words on creating a filter to access or update pixels based on your custom requirements.

    + +

    The Pixel Cache

    + +

    The ImageMagick pixel cache is a repository for image pixels with up to 5 channels. The first 4 channels are stored contiguously and an optional second area follows with 1 channel. The channels are at the depth specified when ImageMagick was built. The channel depths are 8 bits-per-pixel component for the Q8 version of ImageMagick, 16 bits-per-pixel component for the Q16 version, and 32 bits-per-pixel component for the Q32 version. By default pixel components are unsigned quantities, however, if you use the high dynamic-range version of ImageMagick, the components are 32-bit floating point. The primary 4 channels can hold any value but typically contain red, green, blue, and alpha intensities or cyan, magenta, yellow, and alpha intensities. The optional fifth channel contains the colormap indexes for colormapped images or the black channel for CMYK images. The pixel cache storage may be heap memory, disk-backed memory mapped, or on disk. The pixel cache is reference-counted. Only the cache properties are copied when the cache is cloned. The cache pixels are subsequently copied only when you signal your intention to update any of the pixels.

    + +

    Create the Pixel Cache

    + +

    The pixel cache is associated with an image when it is created and it is initialized when you try to get or put pixels. Here are three common methods to associate a pixel cache with an image:

    + +
    +
    Create an image canvas initialized to the background color:

    +
    image=AllocateImage(image_info);
    +if (SetImageExtent(image,640,480) == MagickFalse)
    +  { /* an exception was thrown */ }
    +(void) QueryMagickColor("red",&image->background_color,&image->exception);
    +SetImageBackgroundColor(image);
    +
    + +
    Create an image from a JPEG image on disk:

    +
    (void) strcpy(image_info->filename,"image.jpg"):
    +image=ReadImage(image_info,exception);
    +if (image == (Image *) NULL)
    +  { /* an exception was thrown */ }
    +
    +
    Create an image from a memory based image:

    +
    image=BlobToImage(blob_info,blob,extent,exception);
    +if (image == (Image *) NULL)
    +  { /* an exception was thrown */ }
    +
    +
    + +

    In our discussion of the pixel cache, we use the MagickCore API to illustrate our points, however, the principles are the same for other program interfaces to ImageMagick.

    + +

    When the pixel cache is initialized, pixels are scaled from whatever bit depth they originated from to that required by the pixel cache. For example, a 1-channel 1-bit monochrome PBM image is scaled to a 4 channel 8-bit RGBA image, if you are using the Q8 version of ImageMagick, and 16-bit RGBA for the Q16 version. You can determine which version you have with the -version option:

    + +
      $ identify -version
      $ Version: ImageMagick 6.9.12-40 2022-02-15 Q16 https://imagemagick.org
    +

    As you can see, the convenience of the pixel cache sometimes comes with a trade-off in storage (e.g. storing a 1-bit monochrome image as 16-bit RGBA is wasteful) and speed (i.e. storing the entire image in memory is generally slower than accessing one scanline of pixels at a time). In most cases, the benefits of the pixel cache typically outweigh any disadvantages.

    + +

    Access the Pixel Cache

    + +

    Once the pixel cache is associated with an image, you typically want to get, update, or put pixels into it. We refer to pixels inside the image region as authentic pixels and outside the region as virtual pixels. Use these methods to access the pixels in the cache:

    + + +

    Here is a typical MagickCore code snippet for manipulating pixels in the pixel cache. In our example, we copy pixels from the input image to the output image and decrease the intensity by 10%:

    +
    const PixelPacket
    +  *p;
    +
    +PixelPacket
    +  *q;
    +
    +ssize_t
    +  x,
    +  y;
    +
    +destination=CloneImage(source,source->columns,source->rows,MagickTrue,
    +  exception);
    +if (destination == (Image *) NULL)
    +  { /* an exception was thrown */ }
    +for (y=0; y < (ssize_t) source->rows; y++)
    +{
    +  p=GetVirtualPixels(source,0,y,source->columns,1,exception);
    +  q=GetAuthenticPixels(destination,0,y,destination->columns,1,exception);
    +  if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)
    +    break;
    +  for (x=0; x < (ssize_t) source->columns; x++)
    +  {
    +    SetPixelRed(q,90*p->red/100);
    +    SetPixelGreen(q,90*p->green/100);
    +    SetPixelBlue(q,90*p->blue/100);
    +    SetPixelOpacity(q,90*p->opacity/100);
    +    p++;
    +    q++;
    +  }
    +  if (SyncAuthenticPixels(destination,exception) == MagickFalse)
    +    break;
    +}
    +if (y < (ssize_t) source->rows)
    +  { /* an exception was thrown */ }
    +
    + +

    When we first create the destination image by cloning the source image, the pixel cache pixels are not copied. They are only copied when you signal your intentions to modify or set the pixel cache by calling GetAuthenticPixels() or QueueAuthenticPixels(). Use QueueAuthenticPixels() if you want to set new pixel values rather than update existing ones. You could use GetAuthenticPixels() to set pixel values but it is slightly more efficient to use QueueAuthenticPixels() instead. Finally, use SyncAuthenticPixels() to ensure any updated pixels are pushed to the pixel cache.

    + +

    Recall how we mentioned that the indexes of a colormapped image or the black channel of a CMYK image are stored separately. Use GetVirtualIndexQueue() (to read the indexes) or GetAuthenticIndexQueue() (to update the indexes) to gain access to this channel. For example, to print the colormap indexes, use:

    +
    const IndexPacket
    +  *indexes;
    +
    +for (y=0; y < (ssize_t) source->rows; y++)
    +{
    +  p=GetVirtualPixels(source,0,y,source->columns,1);
    +  if (p == (const PixelPacket *) NULL)
    +    break;
    +  indexes=GetVirtualIndexQueue(source);
    +  for (x=0; x < (ssize_t) source->columns; x++)
    +    (void) printf("%d\n",GetPixelIndex(indexes+x));
    +}
    +if (y < (ssize_t) source->rows)
    +  /* an exception was thrown */
    +
    + +

    The pixel cache manager decides whether to give you direct or indirect access to the image pixels. In some cases the pixels are staged to an intermediate buffer-- and that is why you must call SyncAuthenticPixels() to ensure this buffer is pushed out to the pixel cache to guarantee the corresponding pixels in the cache are updated. For this reason we recommend that you only read or update a scanline or a few scanlines of pixels at a time. However, you can get any rectangular region of pixels you want. GetAuthenticPixels() requires that the region you request is within the bounds of the image area. For a 640 by 480 image, you can get a scanline of 640 pixels at row 479 but if you ask for a scanline at row 480, an exception is returned (rows are numbered starting at 0). GetVirtualPixels() does not have this constraint. For example,

    +
    p=GetVirtualPixels(source,-3,-3,source->columns+3,6,exception);
    +
    + +

    gives you the pixels you asked for without complaint, even though some are not within the confines of the image region.

    + +

    Virtual Pixels

    + +

    There are a plethora of image processing algorithms that require a neighborhood of pixels about a pixel of interest. The algorithm typically includes a caveat concerning how to handle pixels around the image boundaries, known as edge pixels. With virtual pixels, you do not need to concern yourself about special edge processing other than choosing which virtual pixel method is most appropriate for your algorithm.

    +

    Access to the virtual pixels are controlled by the SetImageVirtualPixelMethod() method from the MagickCore API or the -virtual-pixel option from the command line. The methods include:

    + +
    +
    background
    +
    the area surrounding the image is the background color
    +
    black
    +
    the area surrounding the image is black
    +
    checker-tile
    +
    alternate squares with image and background color
    +
    dither
    +
    non-random 32x32 dithered pattern
    +
    edge
    +
    extend the edge pixel toward infinity (default)
    +
    gray
    +
    the area surrounding the image is gray
    +
    horizontal-tile
    +
    horizontally tile the image, background color above/below
    +
    horizontal-tile-edge
    +
    horizontally tile the image and replicate the side edge pixels
    +
    mirror
    +
    mirror tile the image
    +
    random
    +
    choose a random pixel from the image
    +
    tile
    +
    tile the image
    +
    transparent
    +
    the area surrounding the image is transparent blackness
    +
    vertical-tile
    +
    vertically tile the image, sides are background color
    +
    vertical-tile-edge
    +
    vertically tile the image and replicate the side edge pixels
    +
    white
    +
    the area surrounding the image is white
    +
    + + +

    Cache Storage and Resource Requirements

    + +

    Recall that this simple and elegant design of the ImageMagick pixel cache comes at a cost in terms of storage and processing speed. The pixel cache storage requirements scales with the area of the image and the bit depth of the pixel components. For example, if we have a 640 by 480 image and we are using the Q16 version of ImageMagick, the pixel cache consumes image width * height * bit-depth / 8 * channels bytes or approximately 2.3 mebibytes (i.e. 640 * 480 * 2 * 4). Not too bad, but what if your image is 25000 by 25000 pixels? The pixel cache requires approximately 4.7 gibibytes of storage. Ouch. ImageMagick accounts for possible huge storage requirements by caching large images to disk rather than memory. Typically the pixel cache is stored in memory using heap memory. If heap memory is exhausted, we create the pixel cache on disk and attempt to memory-map it. If memory-map memory is exhausted, we simply use standard disk I/O. Disk storage is cheap but it is also very slow, upwards of 1000 times slower than memory. We can get some speed improvements, up to 5 times, if we use memory mapping to the disk-based cache. These decisions about storage are made automagically by the pixel cache manager negotiating with the operating system. However, you can influence how the pixel cache manager allocates the pixel cache with cache resource limits. The limits include:

    + +
    +
    width
    +
    maximum width of an image. Exceed this limit and an exception is thrown and processing stops.
    +
    height
    +
    maximum height of an image. Exceed this limit and an exception is thrown and processing stops.
    +
    area
    +
    maximum area in bytes of any one image that can reside in the pixel cache memory. If this limit is exceeded, the image is automagically cached to disk and optionally memory-mapped.
    +
    memory
    +
    maximum amount of memory in bytes to allocate for the pixel cache from the heap.
    +
    map
    +
    maximum amount of memory map in bytes to allocate for the pixel cache.
    +
    disk
    +
    maximum amount of disk space in bytes permitted for use by the pixel cache. If this limit is exceeded, the pixel cache is not created and a fatal exception is thrown.
    +
    files
    +
    maximum number of open pixel cache files. When this limit is exceeded, any subsequent pixels cached to disk are closed and reopened on demand. This behavior permits a large number of images to be accessed simultaneously on disk, but without a speed penalty due to repeated open/close calls.
    +
    thread
    +
    maximum number of threads that are permitted to run in parallel.
    +
    time
    +
    maximum number of seconds that the process is permitted to execute. Exceed this limit and an exception is thrown and processing stops.
    +
    + +

    Note, these limits pertain to the ImageMagick pixel cache. Certain algorithms within ImageMagick do not respect these limits nor does any of the external deleg +ate libraries (e.g. JPEG, TIFF, etc.).

    + +

    To determine the current setting of these limits, use this command:

    +
    -> identify -list resource
    +Resource limits:
    +  Width: 100MP
    +  Height: 100MP
    +  Area: 25.181GB
    +  Memory: 11.726GiB
    +  Map: 23.452GiB
    +  Disk: unlimited
    +  File: 768
    +  Thread: 12
    +  Throttle: 0
    +  Time: unlimited
    +
    + +

    You can set these limits either as a security policy (see policy.xml), with an environment variable, with the -limit command line option, or with the SetMagickResourceLimit() MagickCore API method. As an example, our online web interface to ImageMagick, ImageMagick Studio, includes these policy limits to help prevent a denial-of-service:

    +
    <policymap>
    +  <!-- temporary path must be a preexisting writable directory -->
    +  <policy domain="resource" name="temporary-path" value="/tmp"/>
    +  <policy domain="resource" name="memory" value="256MiB"/>
    +  <policy domain="resource" name="map" value="512MiB"/>
    +  <policy domain="resource" name="width" value="8KP"/>
    +  <policy domain="resource" name="height" value="8KP"/>
    +  <policy domain="resource" name="area" value="16KP"/>
    +  <policy domain="resource" name="disk" value="1GiB"/>
    +  <policy domain="resource" name="file" value="768"/>
    +  <policy domain="resource" name="thread" value="2"/>
    +  <policy domain="resource" name="throttle" value="0"/>
    +  <policy domain="resource" name="time" value="120"/>
    +  <policy domain="resource" name="list-length" value="128"/>
    +  <policy domain="system" name="precision" value="6"/>
    +  <policy domain="cache" name="shared-secret" stealth="true" value="replace with your secret phrase"/>
    +  <policy domain="coder" rights="none" pattern="MVG" />
    +  <policy domain="coder" rights="none" pattern="EPS" />
    +  <policy domain="coder" rights="none" pattern="PS" />
    +  <policy domain="coder" rights="none" pattern="PS2" />
    +  <policy domain="coder" rights="none" pattern="PS3" />
    +  <policy domain="coder" rights="none" pattern="PDF" />
    +  <policy domain="coder" rights="none" pattern="XPS" />
    +  <policy domain="filter" rights="none" pattern="*" />
    +  <policy domain="delegate" rights="none" pattern="HTTPS" />  
    +  <policy domain="delegate" rights="none" pattern="SHOW" />
    +  <policy domain="delegate" rights="none" pattern="WIN" />
    +  <policy domain="path" rights="none" pattern="@*"/>  
    +</policymap>
    +
    +

    Since we process multiple simultaneous sessions, we don't want any one session consuming all the available memory.With this policy, large images are cached to disk. If the image is too large and exceeds the pixel cache disk limit, the program exits. In addition, we place a time limit to prevent any run-away processing tasks. If any one image has a width or height that exceeds 8192 pixels, an exception is thrown and processing stops. As of ImageMagick 6.9.4-2, you can prevent the use of any delegate or all delegates (set the pattern to "*"). Note, prior to this release, use a domain of "coder" to prevent delegate usage (e.g. domain="coder" rights="none" pattern="HTTPS"). The policy also prevents indirect reads. If you want to, for example, read text from a file (e.g. caption:@myCaption.txt), you'll need to remove this policy.

    + +

    Note, the cache limits are global to each invocation of ImageMagick, meaning if you create several images, the combined resource requirements are compared to the limit to determine the pixel cache storage disposition.

    + +

    To determine which type and how much resources are consumed by the pixel cache, add the -debug cache option to the command-line:

    +
    $ convert -debug cache logo: -sharpen 3x2 null:
    +2016-12-17T13:33:42-05:00 0:00.000 0.000u 7.0.0 Cache convert: cache.c/DestroyPixelCache/1275/Cache
    +  destroy
    +2016-12-17T13:33:42-05:00 0:00.000 0.000u 7.0.0 Cache convert: cache.c/OpenPixelCache/3834/Cache
    +  open LOGO[0] (Heap Memory, 640x480x4 4.688MiB)
    +2016-12-17T13:33:42-05:00 0:00.010 0.000u 7.0.0 Cache convert: cache.c/OpenPixelCache/3834/Cache
    +  open LOGO[0] (Heap Memory, 640x480x3 3.516MiB)
    +2016-12-17T13:33:42-05:00 0:00.010 0.000u 7.0.0 Cache convert: cache.c/ClonePixelCachePixels/1044/Cache
    +  Memory => Memory
    +2016-12-17T13:33:42-05:00 0:00.020 0.010u 7.0.0 Cache convert: cache.c/ClonePixelCachePixels/1044/Cache
    +  Memory => Memory
    +2016-12-17T13:33:42-05:00 0:00.020 0.010u 7.0.0 Cache convert: cache.c/OpenPixelCache/3834/Cache
    +  open LOGO[0] (Heap Memory, 640x480x3 3.516MiB)
    +2016-12-17T13:33:42-05:00 0:00.050 0.100u 7.0.0 Cache convert: cache.c/DestroyPixelCache/1275/Cache
    +  destroy LOGO[0]
    +2016-12-17T13:33:42-05:00 0:00.050 0.100u 7.0.0 Cache convert: cache.c/DestroyPixelCache/1275/Cache
    +  destroy LOGO[0]
    +
    +

    This command utilizes a pixel cache in memory. The logo consumed 4.688MiB and after it was sharpened, 3.516MiB.

    + + +

    Distributed Pixel Cache

    +

    A distributed pixel cache is an extension of the traditional pixel cache available on a single host. The distributed pixel cache may span multiple servers so that it can grow in size and transactional capacity to support very large images. Start up the pixel cache server on one or more machines. When you read or operate on an image and the local pixel cache resources are exhausted, ImageMagick contacts one or more of these remote pixel servers to store or retrieve pixels. The distributed pixel cache relies on network bandwidth to marshal pixels to and from the remote server. As such, it will likely be significantly slower than a pixel cache utilizing local storage (e.g. memory, disk, etc.).

    +
    convert -distribute-cache 6668 &  // start on 192.168.100.50
    +convert -define registry:cache:hosts=192.168.100.50:6668 myimage.jpg -sharpen 5x2 mimage.png
    +
    + +

    Cache Views

    + +

    GetVirtualPixels(), GetAuthenticPixels(), QueueAuthenticPixels(), and SyncAuthenticPixels(), from the MagickCore API, can only deal with one pixel cache area per image at a time. Suppose you want to access the first and last scanline from the same image at the same time? The solution is to use a cache view. A cache view permits you to access as many areas simultaneously in the pixel cache as you require. The cache view methods are analogous to the previous methods except you must first open a view and close it when you are finished with it. Here is a snippet of MagickCore code that permits us to access the first and last pixel row of the image simultaneously:

    + +
    CacheView
    +  *view_1,
    +  *view_2;
    +
    +view_1=AcquireVirtualCacheView(source,exception);
    +view_2=AcquireVirtualCacheView(source,exception);
    +for (y=0; y < (ssize_t) source->rows; y++)
    +{
    +  u=GetCacheViewVirtualPixels(view_1,0,y,source->columns,1,exception);
    +  v=GetCacheViewVirtualPixels(view_2,0,source->rows-y-1,source->columns,1,exception);
    +  if ((u == (const PixelPacket *) NULL) || (v == (const PixelPacket *) NULL))
    +    break;
    +  for (x=0; x < (ssize_t) source->columns; x++)
    +  {
    +    /* do something with u & v here */
    +  }
    +}
    +view_2=DestroyCacheView(view_2);
    +view_1=DestroyCacheView(view_1);
    +if (y < (ssize_t) source->rows)
    +  { /* an exception was thrown */ }
    +
    + +

    Magick Pixel Cache Format

    + +

    Recall that each image format is decoded by ImageMagick and the pixels are deposited in the pixel cache. If you write an image, the pixels are read from the pixel cache and encoded as required by the format you are writing (e.g. GIF, PNG, etc.). The Magick Pixel Cache (MPC) format is designed to eliminate the overhead of decoding and encoding pixels to and from an image format. MPC writes two files. One, with the extension .mpc, retains all the properties associated with the image or image sequence (e.g. width, height, colorspace, etc.) and the second, with the extension .cache, is the pixel cache in the native raw format. When reading an MPC image file, ImageMagick reads the image properties and memory maps the pixel cache on disk eliminating the need for decoding the image pixels. The trade-off is in disk space. MPC is generally larger in file size than most other image formats.

    +

    The most efficient use of MPC image files is a write-once, read-many-times pattern. For example, your workflow requires extracting random blocks of pixels from the source image. Rather than re-reading and possibly decompressing the source image each time, we use MPC and map the image directly to memory.

    + +

    Best Practices

    + +

    Although you can request any pixel from the pixel cache, any block of pixels, any scanline, multiple scanlines, any row, or multiple rows with the GetVirtualPixels(), GetAuthenticPixels(), QueueAuthenticPixels, GetCacheViewVirtualPixels(), GetCacheViewAuthenticPixels(), and QueueCacheViewAuthenticPixels() methods, ImageMagick is optimized to return a few pixels or a few pixels rows at time. There are additional optimizations if you request a single scanline or a few scanlines at a time. These methods also permit random access to the pixel cache, however, ImageMagick is optimized for sequential access. Although you can access scanlines of pixels sequentially from the last row of the image to the first, you may get a performance boost if you access scanlines from the first row of the image to the last, in sequential order.

    + +

    You can get, modify, or set pixels in row or column order. However, it is more efficient to access the pixels by row rather than by column.

    + +

    If you update pixels returned from GetAuthenticPixels() or GetCacheViewAuthenticPixels(), don't forget to call SyncAuthenticPixels() or SyncCacheViewAuthenticPixels() respectively to ensure your changes are synchronized with the pixel cache.

    + +

    Use QueueAuthenticPixels() or QueueCacheViewAuthenticPixels() if you are setting an initial pixel value. The GetAuthenticPixels() or GetCacheViewAuthenticPixels() method reads pixels from the cache and if you are setting an initial pixel value, this read is unnecessary. Don't forget to call SyncAuthenticPixels() or SyncCacheViewAuthenticPixels() respectively to push any pixel changes to the pixel cache.

    + +

    GetVirtualPixels(), GetAuthenticPixels(), QueueAuthenticPixels(), and SyncAuthenticPixels() are slightly more efficient than their cache view counter-parts. However, cache views are required if you need access to more than one region of the image simultaneously or if more than one thread of execution is accessing the image.

    + +

    You can request pixels outside the bounds of the image with GetVirtualPixels() or GetCacheViewVirtualPixels(), however, it is more efficient to request pixels within the confines of the image region.

    + +

    Although you can force the pixel cache to disk using appropriate resource limits, disk access can be upwards of 1000 times slower than memory access. For fast, efficient, access to the pixel cache, try to keep the pixel cache in heap memory.

    + +

    The ImageMagick Q16 version of ImageMagick permits you to read and write 16 bit images without scaling but the pixel cache consumes twice as many resources as the Q8 version. If your system has constrained memory or disk resources, consider the Q8 version of ImageMagick. In addition, the Q8 version typically executes faster than the Q16 version.

    + +

    A great majority of image formats and algorithms restrict themselves to a fixed range of pixel values from 0 to some maximum value, for example, the Q16 version of ImageMagick permit intensities from 0 to 65535. High dynamic-range imaging (HDRI), however, permits a far greater dynamic range of exposures (i.e. a large difference between light and dark areas) than standard digital imaging techniques. HDRI accurately represents the wide range of intensity levels found in real scenes ranging from the brightest direct sunlight to the deepest darkest shadows. Enable HDRI at ImageMagick build time to deal with high dynamic-range images, but be mindful that each pixel component is a 32-bit floating point value. In addition, pixel values are not clamped by default so some algorithms may have unexpected results due to out-of-band pixel values than the non-HDRI version.

    + +

    If you are dealing with large images, make sure the pixel cache is written to a disk area with plenty of free space. Under Linux, this is typically /tmp and for Windows, c:/temp. You can tell ImageMagick to write the pixel cache to an alternate location and conserve memory with these options:

    + +
    convert -limit memory 2GB -limit map 4GB -define registry:temporary-path=/data/tmp ...
    +
    + +

    Set global resource limits for your environment in the policy.xml configuration file.

    + +

    If you plan on processing the same image many times, consider the MPC format. Reading a MPC image has near-zero overhead because its in the native pixel cache format eliminating the need for decoding the image pixels. Here is an example:

    +
    convert image.tif image.mpc
    +convert image.mpc -crop 100x100+0+0 +repage 1.png
    +convert image.mpc -crop 100x100+100+0 +repage 2.png
    +convert image.mpc -crop 100x100+200+0 +repage 3.png
    +
    + +

    MPC is ideal for web sites. It reduces the overhead of reading and writing an image. We use it exclusively at our online image studio.

    + +

    Streaming Pixels

    + +

    ImageMagick provides for streaming pixels as they are read from or written to an image. This has several advantages over the pixel cache. The time and resources consumed by the pixel cache scale with the area of an image, whereas the pixel stream resources scale with the width of an image. The disadvantage is the pixels must be consumed as they are streamed so there is no persistence.

    + +

    Use ReadStream() or WriteStream() with an appropriate callback method in your MagickCore program to consume the pixels as they are streaming. Here's an abbreviated example of using ReadStream:

    +
    static size_t StreamPixels(const Image *image,const void *pixels,const size_t columns)
    +{
    +  register const PixelPacket
    +    *p;
    +
    +  MyData
    +    *my_data;
    +
    +  my_data=(MyData *) image->client_data;
    +  p=(PixelPacket *) pixels;
    +  if (p != (const PixelPacket *) NULL)
    +    {
    +      /* process pixels here */
    +    }
    +  return(columns);
    +}
    +
    +...
    +
    +/* invoke the pixel stream here */
    +image_info->client_data=(void *) MyData;
    +image=ReadStream(image_info,&StreamPixels,exception);
    +
    + +

    We also provide a lightweight tool, stream, to stream one or more pixel components of the image or portion of the image to your choice of storage formats. It writes the pixel components as they are read from the input image a row at a time making stream desirable when working with large images or when you require raw pixel components. A majority of the image formats stream pixels (red, green, and blue) from left to right and top to bottom. However, a few formats do not support this common ordering (e.g. the PSD format).

    + +

    Image Properties and Profiles

    + +

    Images have metadata associated with them in the form of properties (e.g. width, height, description, etc.) and profiles (e.g. EXIF, IPTC, color management). ImageMagick provides convenient methods to get, set, or update image properties and get, set, update, or apply profiles. Some of the more popular image properties are associated with the Image structure in the MagickCore API. For example:

    + +
    (void) printf("image width: %lu, height: %lu\n",image->columns,image->rows);
    +
    + +

    For a great majority of image properties, such as an image comment or description, we use the GetImageProperty() and SetImageProperty() methods. Here we set a property and fetch it right back:

    + +
    const char
    +  *comment;
    +
    +(void) SetImageProperty(image,"comment","This space for rent");
    +comment=GetImageProperty(image,"comment");
    +if (comment == (const char *) NULL)
    +  (void) printf("Image comment: %s\n",comment);
    +
    + +

    ImageMagick supports artifacts with the GetImageArtifact() and SetImageArtifact() methods. Artifacts are stealth properties that are not exported to image formats (e.g. PNG).

    + +

    Image profiles are handled with GetImageProfile(), SetImageProfile(), and ProfileImage() methods. Here we set a profile and fetch it right back:

    + +
    StringInfo
    +  *profile;
    +
    +profile=AcquireStringInfo(length);
    +SetStringInfoDatum(profile,my_exif_profile);
    +(void) SetImageProfile(image,"EXIF",profile);
    +DestroyStringInfo(profile);
    +profile=GetImageProfile(image,"EXIF");
    +if (profile != (StringInfo *) NULL)
    +  (void) PrintStringInfo(stdout,"EXIF",profile);
    +
    + +

    Large Image Support

    +

    ImageMagick can read, process, or write mega-, giga-, or tera-pixel image sizes. An image width or height can range from 1 to 2 giga-pixels on a 32 bit OS (up to 2147483647 rows/columns) and up to 9 exa-pixels on a 64-bit OS (up to 9223372036854775807 rows/columns). Note, that some image formats have restrictions on image size. For example, Photoshop images are limited to 300,000 pixels for width or height. Here we resize an image to a quarter million pixels square:

    + +
    convert logo: -resize 250000x250000 logo.miff
    +
    + +

    For large images, memory resources will likely be exhausted and ImageMagick will instead create a pixel cache on disk. If your default temporary disk partition is too small, tell ImageMagick to use another partition with plenty of free space. For example:

    +
    convert -define registry:temporary-path=/data/tmp logo:  \ 
    -resize 250000x250000 logo.miff +
    + +

    To ensure large images do not consume all the memory on your system, force the image pixels to memory-mapped disk with resource limits:

    +
    convert -define registry:temporary-path=/data/tmp -limit memory 16mb \
    +  logo: -resize 250000x250000 logo.miff
    +
    + +

    Here we force all image pixels to disk:

    +
    convert -define registry:temporary-path=/data/tmp -limit area 0 \
    +  logo: -resize 250000x250000 logo.miff
    +
    + +

    Caching pixels to disk is about 1000 times slower than memory. Expect long run times when processing large images on disk with ImageMagick. You can monitor progress with this command:

    + +
    convert -monitor -limit memory 2GiB -limit map 4GiB -define registry:temporary-path=/data/tmp \
    +  logo: -resize 250000x250000 logo.miff
    +
    + +

    For really large images, or if there is limited resources on your host, you can utilize a distributed pixel cache on one or more remote hosts:

    +
    convert -distribute-cache 6668 &  // start on 192.168.100.50
    +convert -distribute-cache 6668 &  // start on 192.168.100.51
    +convert -limit memory 2mb -limit map 2mb -limit disk 2gb \
    +  -define registry:cache:hosts=192.168.100.50:6668,192.168.100.51:6668 \
    +  myhugeimage.jpg -sharpen 5x2 myhugeimage.png
    +
    +

    Due to network latency, expect a substantial slow-down in processing your workflow.

    + +

    Threads of Execution

    + +

    Many of ImageMagick's internal algorithms are threaded to take advantage of speed-ups offered by the multicore processor chips. However, you are welcome to use ImageMagick algorithms in your threads of execution with the exception of the MagickCore's GetVirtualPixels(), GetAuthenticPixels(), QueueAuthenticPixels(), or SyncAuthenticPixels() pixel cache methods. These methods are intended for one thread of execution only with the exception of an OpenMP parallel section. To access the pixel cache with more than one thread of execution, use a cache view. We do this for the CompositeImage() method, for example. Suppose we want to composite a single source image over a different destination image in each thread of execution. If we use GetVirtualPixels(), the results are unpredictable because multiple threads would likely be asking for different areas of the pixel cache simultaneously. Instead we use GetCacheViewVirtualPixels() which creates a unique view for each thread of execution ensuring our program behaves properly regardless of how many threads are invoked. The other program interfaces, such as the MagickWand API, are completely thread safe so there are no special precautions for threads of execution.

    + +

    Here is an MagickCore code snippet that takes advantage of threads of execution with the OpenMP programming paradigm:

    +
    CacheView
    +  *image_view;
    +
    +MagickBooleanType
    +  status;
    +
    +ssize_t
    +  y;
    +
    +status=MagickTrue;
    +image_view=AcquireVirtualCacheView(image,exception);
    +#pragma omp parallel for schedule(static,4) shared(status)
    +for (y=0; y < (ssize_t) image->rows; y++)
    +{
    +  register IndexPacket
    +    *indexes;
    +
    +  register PixelPacket
    +    *q;
    +
    +  register ssize_t
    +    x;
    +
    +  if (status == MagickFalse)
    +    continue;
    +  q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
    +  if (q == (PixelPacket *) NULL)
    +    {
    +      status=MagickFalse;
    +      continue;
    +    }
    +  indexes=GetCacheViewAuthenticIndexQueue(image_view);
    +  for (x=0; x < (ssize_t) image->columns; x++)
    +  {
    +    SetPixelRed(q,...);
    +    SetPixelGreen(q,...);
    +    SetPixelBlue(q,...);
    +    SetPixelOpacity(q,...);
    +    if (indexes != (IndexPacket *) NULL)
    +      SetPixelIndex(indexes+x,...);
    +    q++;
    +  }
    +  if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
    +    status=MagickFalse;
    +}
    +image_view=DestroyCacheView(image_view);
    +if (status == MagickFalse)
    +  perror("something went wrong");
    +
    + +

    This code snippet converts an uncompressed Windows bitmap to a Magick++ image:

    +
    #include "Magick++.h"
    +#include <assert.h>
    +#include "omp.h"
    +
    +void ConvertBMPToImage(const BITMAPINFOHEADER *bmp_info,
    +  const unsigned char *restrict pixels,Magick::Image *image)
    +{
    +  /*
    +    Prepare the image so that we can modify the pixels directly.
    +  */
    +  assert(bmp_info->biCompression == BI_RGB);
    +  assert(bmp_info->biWidth == image->columns());
    +  assert(abs(bmp_info->biHeight) == image->rows());
    +  image->modifyImage();
    +  if (bmp_info->biBitCount == 24)
    +    image->type(MagickCore::TrueColorType);
    +  else
    +    image->type(MagickCore::TrueColorMatteType);
    +  register unsigned int bytes_per_row=bmp_info->biWidth*bmp_info->biBitCount/8;
    +  if (bytes_per_row % 4 != 0) {
    +    bytes_per_row=bytes_per_row+(4-bytes_per_row % 4);  // divisible by 4.
    +  }
    +  /*
    +    Copy all pixel data, row by row.
    +  */
    +  #pragma omp parallel for
    +  for (int y=0; y < int(image->rows()); y++)
    +  {
    +    int
    +      row;
    +
    +    register const unsigned char
    +      *restrict p;
    +
    +    register MagickCore::PixelPacket
    +      *restrict q;
    +
    +    row=(bmp_info->biHeight > 0) ? (image->rows()-y-1) : y;
    +    p=pixels+row*bytes_per_row;
    +    q=image->setPixels(0,y,image->columns(),1);
    +    for (int x=0; x < int(image->columns()); x++)
    +    {
    +      SetPixelBlue(q,p[0]);
    +      SetPixelGreen(q,p[1]);
    +      SetPixelRed(q,p[2]);
    +      if (bmp_info->biBitCount == 32) {
    +        SetPixelOpacity(q,p[3]);
    +      }
    +      q++;
    +      p+=bmp_info->biBitCount/8;
    +    }
    +    image->syncPixels();  // sync pixels to pixel cache.
    +  }
    +  return;
    +}
    + +

    If you call the ImageMagick API from your OpenMP-enabled application and you intend to dynamically increase the number of threads available in subsequent parallel regions, be sure to perform the increase before you call the API otherwise ImageMagick may fault.

    + +

    MagickWand supports wand views. A view iterates over the entire, or portion, of the image in parallel and for each row of pixels, it invokes a callback method you provide. This limits most of your parallel programming activity to just that one module. There are similar methods in MagickCore. For an example, see the same sigmoidal contrast algorithm implemented in both MagickWand and MagickCore.

    + +

    In most circumstances, the default number of threads is set to the number of processor cores on your system for optimal performance. However, if your system is hyperthreaded or if you are running on a virtual host and only a subset of the processors are available to your server instance, you might get an increase in performance by setting the thread policy or the MAGICK_THREAD_LIMIT environment variable. For example, your virtual host has 8 processors but only 2 are assigned to your server instance. The default of 8 threads can cause severe performance problems. One solution is to limit the number of threads to the available processors in your policy.xml configuration file:

    +
    <policy domain="resource" name="thread" value="2"/>
    +
    + +

    Or suppose your 12 core hyperthreaded computer defaults to 24 threads. Set the MAGICK_THREAD_LIMIT environment variable and you will likely get improved performance:

    +
    export MAGICK_THREAD_LIMIT=12
    +
    + +

    The OpenMP committee has not defined the behavior of mixing OpenMP with other threading models such as Posix threads. However, using modern releases of Linux, OpenMP and Posix threads appear to interoperate without complaint. If you want to use Posix threads from a program module that calls one of the ImageMagick application programming interfaces (e.g. MagickCore, MagickWand, Magick++, etc.) from Mac OS X or an older Linux release, you may need to disable OpenMP support within ImageMagick. Add the --disable-openmp option to the configure script command line and rebuild and reinstall ImageMagick.

    + +

    You can further increase performance by reducing lock contention with the tcmalloc memory allocation library. To enable, add --with-tcmalloc to the configure command-line when you build ImageMagick.

    + +

    Threading Performance

    +

    It can be difficult to predict behavior in a parallel environment. Performance might depend on a number of factors including the compiler, the version of the OpenMP library, the processor type, the number of cores, the amount of memory, whether hyperthreading is enabled, the mix of applications that are executing concurrently with ImageMagick, or the particular image-processing algorithm you utilize. The only way to be certain of optimal performance, in terms of the number of threads, is to benchmark. ImageMagick includes progressive threading when benchmarking a command and returns the elapsed time and efficiency for one or more threads. This can help you identify how many threads is the most efficient in your environment. For this benchmark we sharpen a 1920x1080 image of a model 10 times with 1 to 12 threads:

    +
    $ convert -bench 10 model.png -sharpen 5x2 null:
    +Performance[1]: 10i 1.135ips 1.000e 8.760u 0:08.810
    +Performance[2]: 10i 2.020ips 0.640e 9.190u 0:04.950
    +Performance[3]: 10i 2.786ips 0.710e 9.400u 0:03.590
    +Performance[4]: 10i 3.378ips 0.749e 9.580u 0:02.960
    +Performance[5]: 10i 4.032ips 0.780e 9.580u 0:02.480
    +Performance[6]: 10i 4.566ips 0.801e 9.640u 0:02.190
    +Performance[7]: 10i 3.788ips 0.769e 10.980u 0:02.640
    +Performance[8]: 10i 4.115ips 0.784e 12.030u 0:02.430
    +Performance[9]: 10i 4.484ips 0.798e 12.860u 0:02.230
    +Performance[10]: 10i 4.274ips 0.790e 14.830u 0:02.340
    +Performance[11]: 10i 4.348ips 0.793e 16.500u 0:02.300
    +Performance[12]: 10i 4.525ips 0.799e 18.320u 0:02.210
    +
    +

    The sweet spot for this example is 6 threads. This makes sense since there are 6 physical cores. The other 6 are hyperthreads. It appears that sharpening does not benefit from hyperthreading.

    +

    In certain cases, it might be optimal to set the number of threads to 1 or to disable OpenMP completely with the MAGICK_THREAD_LIMIT environment variable, -limit command line option, or the policy.xml configuration file.

    + +

    Heterogeneous Distributed Processing

    +

    ImageMagick includes support for heterogeneous distributed processing with the OpenCL framework. OpenCL kernels within ImageMagick permit image processing algorithms to execute across heterogeneous platforms consisting of CPUs, GPUs, and other processors. Depending on your platform, speed-ups can be an order of magnitude faster than the traditional single CPU.

    + +

    First verify that your version of ImageMagick includes support for the OpenCL feature:

    +
    -> identify -version
    +Features: DPC Cipher Modules OpenCL OpenMP(4.5)
    +
    + +

    If so, run this command to realize a significant speed-up for image convolution:

    +
    convert image.png -convolve '-1, -1, -1, -1, 9, -1, -1, -1, -1' convolve.png
    +
    + +

    If an accelerator is not available or if the accelerator fails to respond, ImageMagick reverts to the non-accelerated convolution algorithm.

    + +

    Here is an example OpenCL kernel that convolves an image:

    +
    static inline long ClampToCanvas(const long offset,const ulong range)
    +{
    +  if (offset < 0L)
    +    return(0L);
    +  if (offset >= range)
    +    return((long) (range-1L));
    +  return(offset);
    +}
    +
    +static inline CLQuantum ClampToQuantum(const float value)
    +{
    +  if (value < 0.0)
    +    return((CLQuantum) 0);
    +  if (value >= (float) QuantumRange)
    +    return((CLQuantum) QuantumRange);
    +  return((CLQuantum) (value+0.5));
    +}
    +
    +__kernel void Convolve(const __global CLPixelType *source,__constant float *filter,
    +  const ulong width,const ulong height,__global CLPixelType *destination)
    +{
    +  const ulong columns = get_global_size(0);
    +  const ulong rows = get_global_size(1);
    +
    +  const long x = get_global_id(0);
    +  const long y = get_global_id(1);
    +
    +  const float scale = (1.0/QuantumRange);
    +  const long mid_width = (width-1)/2;
    +  const long mid_height = (height-1)/2;
    +  float4 sum = { 0.0, 0.0, 0.0, 0.0 };
    +  float gamma = 0.0;
    +  register ulong i = 0;
    +
    +  for (long v=(-mid_height); v <= mid_height; v++)
    +  {
    +    for (long u=(-mid_width); u <= mid_width; u++)
    +    {
    +      register const ulong index=ClampToCanvas(y+v,rows)*columns+ClampToCanvas(x+u,
    +        columns);
    +      const float alpha=scale*(QuantumRange-source[index].w);
    +      sum.x+=alpha*filter[i]*source[index].x;
    +      sum.y+=alpha*filter[i]*source[index].y;
    +      sum.z+=alpha*filter[i]*source[index].z;
    +      sum.w+=filter[i]*source[index].w;
    +      gamma+=alpha*filter[i];
    +      i++;
    +    }
    +  }
    +
    +  gamma=1.0/(fabs(gamma) <= MagickEpsilon ? 1.0 : gamma);
    +  const ulong index=y*columns+x;
    +  destination[index].x=ClampToQuantum(gamma*sum.x);
    +  destination[index].y=ClampToQuantum(gamma*sum.y);
    +  destination[index].z=ClampToQuantum(gamma*sum.z);
    +  destination[index].w=ClampToQuantum(sum.w);
    +};
    + +

    See magick/accelerate.c for a complete implementation of image convolution with an OpenCL kernel.

    + +

    Note, that under Windows, you might have an issue with TDR (Timeout Detection and Recovery of GPUs). Its purpose is to detect runaway tasks hanging the GPU by using an execution time threshold. For some older low-end GPUs running the OpenCL filters in ImageMagick, longer execution times might trigger the TDR mechanism and pre-empt the GPU image filter. When this happens, ImageMagick automatically falls back to the CPU code path and returns the expected results. To avoid pre-emption, increase the TdrDelay registry key.

    + +

    Custom Image Coders

    + +

    An image coder (i.e. encoder / decoder) is responsible for registering, optionally classifying, optionally reading, optionally writing, and unregistering one image format (e.g. PNG, GIF, JPEG, etc.). Registering an image coder alerts ImageMagick a particular format is available to read or write. While unregistering tells ImageMagick the format is no longer available. The classifying method looks at the first few bytes of an image and determines if the image is in the expected format. The reader sets the image size, colorspace, and other properties and loads the pixel cache with the pixels. The reader returns a single image or an image sequence (if the format supports multiple images per file), or if an error occurs, an exception and a null image. The writer does the reverse. It takes the image properties and unloads the pixel cache and writes them as required by the image format.

    + +

    Here is a listing of a sample custom coder. It reads and writes images in the MGK image format which is simply an ID followed by the image width and height followed by the RGB pixel values.

    +
    /*
    +  Include declarations.
    +*/
    +#include "magick/studio.h"
    +#include "magick/blob.h"
    +#include "magick/blob-private.h"
    +#include "magick/colorspace.h"
    +#include "magick/exception.h"
    +#include "magick/exception-private.h"
    +#include "magick/image.h"
    +#include "magick/image-private.h"
    +#include "magick/list.h"
    +#include "magick/magick.h"
    +#include "magick/memory_.h"
    +#include "magick/monitor.h"
    +#include "magick/monitor-private.h"
    +#include "magick/quantum-private.h"
    +#include "magick/static.h"
    +#include "magick/string_.h"
    +#include "magick/module.h"
    +
    +/*
    +  Forward declarations.
    +*/
    +static MagickBooleanType
    +  WriteMGKImage(const ImageInfo *,Image *);
    +
    +/*
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%   I s M G K                                                                 %
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%
    +%  IsMGK() returns MagickTrue if the image format type, identified by the
    +%  magick string, is MGK.
    +%
    +%  The format of the IsMGK method is:
    +%
    +%      MagickBooleanType IsMGK(const unsigned char *magick,const size_t length)
    +%
    +%  A description of each parameter follows:
    +%
    +%    o magick: This string is generally the first few bytes of an image file
    +%      or blob.
    +%
    +%    o length: Specifies the length of the magick string.
    +%
    +*/
    +static MagickBooleanType IsMGK(const unsigned char *magick,const size_t length)
    +{
    +  if (length < 7)
    +    return(MagickFalse);
    +  if (LocaleNCompare((char *) magick,"id=mgk",7) == 0)
    +    return(MagickTrue);
    +  return(MagickFalse);
    +}
    +
    +/*
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%   R e a d M G K I m a g e                                                   %
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%
    +%  ReadMGKImage() reads a MGK image file and returns it.  It allocates
    +%  the memory necessary for the new Image structure and returns a pointer to
    +%  the new image.
    +%
    +%  The format of the ReadMGKImage method is:
    +%
    +%      Image *ReadMGKImage(const ImageInfo *image_info,ExceptionInfo *exception)
    +%
    +%  A description of each parameter follows:
    +%
    +%    o image_info: the image info.
    +%
    +%    o exception: return any errors or warnings in this structure.
    +%
    +*/
    +static Image *ReadMGKImage(const ImageInfo *image_info,
    +  ExceptionInfo *exception)
    +{
    +  char
    +    buffer[MaxTextExtent];
    +
    +  Image
    +    *image;
    +
    +  MagickBooleanType
    +    status;
    +
    +  register PixelPacket
    +    *q;
    +
    +  register size_t
    +    x;
    +
    +  register unsigned char
    +    *p;
    +
    +  ssize_t
    +    count,
    +    y;
    +
    +  unsigned char
    +    *pixels;
    +
    +  unsigned long
    +    columns,
    +    rows;
    +
    +  /*
    +    Open image file.
    +  */
    +  assert(image_info != (const ImageInfo *) NULL);
    +  assert(image_info->signature == MagickSignature);
    +  if (image_info->debug != MagickFalse)
    +    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename);
    +  assert(exception != (ExceptionInfo *) NULL);
    +  assert(exception->signature == MagickSignature);
    +  image=AcquireImage(image_info);
    +  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
    +  if (status == MagickFalse)
    +    {
    +      image=DestroyImageList(image);
    +      return((Image *) NULL);
    +    }
    +  /*
    +    Read MGK image.
    +  */
    +  (void) ReadBlobString(image,buffer);  /* read magic number */
    +  if (IsMGK(buffer,7) == MagickFalse)
    +    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
    +  (void) ReadBlobString(image,buffer);
    +  count=(ssize_t) sscanf(buffer,"%lu %lu\n",&columns,&rows);
    +  if (count <= 0)
    +    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
    +  do
    +  {
    +    /*
    +      Initialize image structure.
    +    */
    +    image->columns=columns;
    +    image->rows=rows;
    +    image->depth=8;
    +    if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0))
    +      if (image->scene >= (image_info->scene+image_info->number_scenes-1))
    +        break;
    +    /*
    +      Convert MGK raster image to pixel packets.
    +    */
    +    if (SetImageExtent(image,0,0) == MagickFalse)
    +      {
    +        InheritException(exception,&image->exception);
    +        return(DestroyImageList(image));
    +      }
    +    pixels=(unsigned char *) AcquireQuantumMemory((size_t) image->columns,3UL*sizeof(*pixels));
    +    if (pixels == (unsigned char *) NULL)
    +      ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
    +    for (y=0; y < (ssize_t) image->rows; y++)
    +    {
    +      count=(ssize_t) ReadBlob(image,(size_t) (3*image->columns),pixels);
    +      if (count != (ssize_t) (3*image->columns))
    +        ThrowReaderException(CorruptImageError,"UnableToReadImageData");
    +      p=pixels;
    +      q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
    +      if (q == (PixelPacket *) NULL)
    +        break;
    +      for (x=0; x < (ssize_t) image->columns; x++)
    +      {
    +        SetPixelRed(q,ScaleCharToQuantum(*p++));
    +        SetPixelGreen(q,ScaleCharToQuantum(*p++));
    +        SetPixelBlue(q,ScaleCharToQuantum(*p++));
    +        q++;
    +      }
    +      if (SyncAuthenticPixels(image,exception) == MagickFalse)
    +        break;
    +      if ((image->previous == (Image *) NULL) &&
    +          (SetImageProgress(image,LoadImageTag,y,image>>rows) == MagickFalse))
    +        break;
    +    }
    +    pixels=(unsigned char *) RelinquishMagickMemory(pixels);
    +    if (EOFBlob(image) != MagickFalse)
    +      {
    +        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",image->filename);
    +        break;
    +      }
    +    /*
    +      Proceed to next image.
    +    */
    +    if (image_info->number_scenes != 0)
    +      if (image->scene >= (image_info->scene+image_info->number_scenes-1))
    +        break;
    +    *buffer='\0';
    +    (void) ReadBlobString(image,buffer);
    +    count=(ssize_t) sscanf(buffer,"%lu %lu\n",&columns,&rows);
    +    if (count != 0)
    +      {
    +        /*
    +          Allocate next image structure.
    +        */
    +        AcquireNextImage(image_info,image);
    +        if (GetNextImageInList(image) == (Image *) NULL)
    +          {
    +            image=DestroyImageList(image);
    +            return((Image *) NULL);
    +          }
    +        image=SyncNextImageInList(image);
    +        status=SetImageProgress(image,LoadImageTag,TellBlob(image),GetBlobSize(image));
    +        if (status == MagickFalse)
    +          break;
    +      }
    +  } while (count != 0);
    +  (void) CloseBlob(image);
    +  return(GetFirstImageInList(image));
    +}
    +
    +/*
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%   R e g i s t e r M G K I m a g e                                           %
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%
    +%  RegisterMGKImage() adds attributes for the MGK image format to
    +%  the list of supported formats.  The attributes include the image format
    +%  tag, a method to read and/or write the format, whether the format
    +%  supports the saving of more than one frame to the same file or blob,
    +%  whether the format supports native in-memory I/O, and a brief
    +%  description of the format.
    +%
    +%  The format of the RegisterMGKImage method is:
    +%
    +%      unsigned long RegisterMGKImage(void)
    +%
    +*/
    +ModuleExport unsigned long RegisterMGKImage(void)
    +{
    +  MagickInfo
    +    *entry;
    +
    +  entry=SetMagickInfo("MGK");
    +  entry->decoder=(DecodeImageHandler *) ReadMGKImage;
    +  entry->encoder=(EncodeImageHandler *) WriteMGKImage;
    +  entry->magick=(IsImageFormatHandler *) IsMGK;
    +  entry->description=ConstantString("MGK");
    +  entry->module=ConstantString("MGK");
    +  (void) RegisterMagickInfo(entry);
    +  return(MagickImageCoderSignature);
    +}
    +
    +/*
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%   U n r e g i s t e r M G K I m a g e                                       %
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%
    +%  UnregisterMGKImage() removes format registrations made by the
    +%  MGK module from the list of supported formats.
    +%
    +%  The format of the UnregisterMGKImage method is:
    +%
    +%      UnregisterMGKImage(void)
    +%
    +*/
    +ModuleExport void UnregisterMGKImage(void)
    +{
    +  (void) UnregisterMagickInfo("MGK");
    +}
    +
    +/*
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%   W r i t e M G K I m a g e                                                 %
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%
    +%  WriteMGKImage() writes an image to a file in red, green, and blue
    +%  MGK rasterfile format.
    +%
    +%  The format of the WriteMGKImage method is:
    +%
    +%      MagickBooleanType WriteMGKImage(const ImageInfo *image_info,Image *image)
    +%
    +%  A description of each parameter follows.
    +%
    +%    o image_info: the image info.
    +%
    +%    o image:  The image.
    +%
    +*/
    +static MagickBooleanType WriteMGKImage(const ImageInfo *image_info,Image *image)
    +{
    +  char
    +    buffer[MaxTextExtent];
    +
    +  MagickBooleanType
    +    status;
    +
    +  MagickOffsetType
    +    scene;
    +
    +  register const PixelPacket
    +    *p;
    +
    +  register ssize_t
    +    x;
    +
    +  register unsigned char
    +    *q;
    +
    +  ssize_t
    +    y;
    +
    +  unsigned char
    +    *pixels;
    +
    +  /*
    +    Open output image file.
    +  */
    +  assert(image_info != (const ImageInfo *) NULL);
    +  assert(image_info->signature == MagickSignature);
    +  assert(image != (Image *) NULL);
    +  assert(image->signature == MagickSignature);
    +  if (image->debug != MagickFalse)
    +    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
    +  status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
    +  if (status == MagickFalse)
    +    return(status);
    +  scene=0;
    +  do
    +  {
    +    /*
    +      Allocate memory for pixels.
    +    */
    +    if (image->colorspace != RGBColorspace)
    +      (void) SetImageColorspace(image,RGBColorspace);
    +    pixels=(unsigned char *) AcquireQuantumMemory((size_t) image->columns,
    +      3UL*sizeof(*pixels));
    +    if (pixels == (unsigned char *) NULL)
    +      ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
    +    /*
    +      Initialize raster file header.
    +    */
    +    (void) WriteBlobString(image,"id=mgk\n");
    +    (void) FormatLocaleString(buffer,MaxTextExtent,"%lu %lu\n",
    +      image->columns,image->rows);
    +    (void) WriteBlobString(image,buffer);
    +    for (y=0; y < (ssize_t) image->rows; y++)
    +    {
    +      p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
    +      if (p == (const PixelPacket *) NULL)
    +        break;
    +      q=pixels;
    +      for (x=0; x < (ssize_t) image->columns; x++)
    +      {
    +        *q++=ScaleQuantumToChar(GetPixelRed(p));
    +        *q++=ScaleQuantumToChar(GetPixelGreen(p));
    +        *q++=ScaleQuantumToChar(GetPixelBlue(p));
    +        p++;
    +      }
    +      (void) WriteBlob(image,(size_t) (q-pixels),pixels);
    +      if ((image->previous == (Image *) NULL) &&
    +          (SetImageProgress(image,SaveImageTag,y,image->rows) == MagickFalse))
    +        break;
    +    }
    +    pixels=(unsigned char *) RelinquishMagickMemory(pixels);
    +    if (GetNextImageInList(image) == (Image *) NULL)
    +      break;
    +    image=SyncNextImageInList(image);
    +    status=SetImageProgress(image,SaveImagesTag,scene,
    +      GetImageListLength(image));
    +    if (status == MagickFalse)
    +      break;
    +    scene++;
    +  } while (image_info->adjoin != MagickFalse);
    +  (void) CloseBlob(image);
    +  return(MagickTrue);
    +}
    + +

    To invoke the custom coder from the command line, use these commands:

    +
    convert logo: logo.mgk
    +display logo.mgk
    +
    + +

    We provide the Magick Coder Kit to help you get started writing your own custom coder.

    + +

    Before you build, set the PKG_CONFIG_PATH environment variable if ImageMagick is not in your default system path:

    + +
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig 
    + +

    Custom Image Filters

    + +

    ImageMagick provides a convenient mechanism for adding your own custom image processing algorithms. We call these image filters and they are invoked from the command line with the -process option or from the MagickCore API method ExecuteModuleProcess().

    + +

    Here is a listing of a sample custom image filter. It computes a few statistics such as the pixel brightness and saturation mean and standard-deviation.

    +
    #include <stdio.h>
    +#include <stdlib.h>
    +#include <string.h>
    +#include <time.h>
    +#include <assert.h>
    +#include <math.h>
    +#include "magick/studio.h"
    +#include "magick/MagickCore.h"
    +
    +/*
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%   a n a l y z e I m a g e                                                   %
    +%                                                                             %
    +%                                                                             %
    +%                                                                             %
    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    +%
    +%  analyzeImage() computes the brightness and saturation mean,  standard
    +%  deviation, kurtosis and skewness and stores these values as attributes
    +%  of the image.
    +%
    +%  The format of the analyzeImage method is:
    +%
    +%      size_t analyzeImage(Image *images,const int argc,char **argv,
    +%        ExceptionInfo *exception)
    +%
    +%  A description of each parameter follows:
    +%
    +%    o image: the address of a structure of type Image.
    +%
    +%    o argc: Specifies a pointer to an integer describing the number of
    +%      elements in the argument vector.
    +%
    +%    o argv: Specifies a pointer to a text array containing the command line
    +%      arguments.
    +%
    +%    o exception: return any errors or warnings in this structure.
    +%
    +*/
    +
    +typedef struct _StatisticsInfo
    +{
    +  double
    +    area,
    +    brightness,
    +    mean,
    +    standard_deviation,
    +    sum[5],
    +    kurtosis,
    +    skewness;
    +} StatisticsInfo;
    +
    +static inline int GetMagickNumberThreads(const Image *source,
    +  const Image *destination,const size_t chunk,int multithreaded)
    +{
    +#define MagickMax(x,y)  (((x) > (y)) ? (x) : (y))
    +#define MagickMin(x,y)  (((x) < (y)) ? (x) : (y))
    +
    +  /*
    +    Number of threads bounded by the amount of work and any thread resource
    +    limit.  The limit is 2 if the pixel cache type is not memory or
    +    memory-mapped.
    +  */
    +  if (multithreaded == 0)
    +    return(1);
    +  if (((GetImagePixelCacheType(source) != MemoryCache) &&
    +       (GetImagePixelCacheType(source) != MapCache)) ||
    +      ((GetImagePixelCacheType(destination) != MemoryCache) &&
    +       (GetImagePixelCacheType(destination) != MapCache)))
    +    return(MagickMax(MagickMin(GetMagickResourceLimit(ThreadResource),2),1));
    +  return(MagickMax(MagickMin((ssize_t) GetMagickResourceLimit(ThreadResource),
    +    (ssize_t) (chunk)/64),1));
    +}
    +
    +ModuleExport size_t analyzeImage(Image **images,const int argc,
    +  const char **argv,ExceptionInfo *exception)
    +{
    +#define AnalyzeImageFilterTag  "Filter/Analyze"
    +#define magick_number_threads(source,destination,chunk,multithreaded) \
    +  num_threads(GetMagickNumberThreads(source,destination,chunk,multithreaded))
    +
    +  char
    +    text[MagickPathExtent];
    +
    +  Image
    +    *image;
    +
    +  MagickBooleanType
    +    status;
    +
    +  MagickOffsetType
    +    progress;
    +
    +  assert(images != (Image **) NULL);
    +  assert(*images != (Image *) NULL);
    +  assert((*images)->signature == MagickCoreSignature);
    +  (void) argc;
    +  (void) argv;
    +  image=(*images);
    +  status=MagickTrue;
    +  progress=0;
    +  for ( ; image != (Image *) NULL; image=GetNextImageInList(image))
    +  {
    +    CacheView
    +      *image_view;
    +
    +    double
    +      area;
    +
    +    ssize_t
    +      y;
    +
    +    StatisticsInfo
    +      brightness,
    +      saturation;
    +
    +    if (status == MagickFalse)
    +      continue;
    +    (void) memset(&brightness,0,sizeof(brightness));
    +    (void) memset(&saturation,0,sizeof(saturation));
    +    status=MagickTrue;
    +    image_view=AcquireVirtualCacheView(image,exception);
    +#if defined(MAGICKCORE_OPENMP_SUPPORT)
    +  #pragma omp parallel for schedule(static) \
    +    shared(progress,status,brightness,saturation) \
    +    magick_number_threads(image,image,image->rows,1)
    +#endif
    +    for (y=0; y < (ssize_t) image->rows; y++)
    +    {
    +      const PixelPacket
    +        *p;
    +
    +      ssize_t
    +        i,
    +        x;
    +
    +      StatisticsInfo
    +        local_brightness,
    +        local_saturation;
    +
    +      if (status == MagickFalse)
    +        continue;
    +      p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
    +      if (p == (const PixelPacket *) NULL)
    +        {
    +          status=MagickFalse;
    +          continue;
    +        }
    +      (void) memset(&local_brightness,0,sizeof(local_brightness));
    +      (void) memset(&local_saturation,0,sizeof(local_saturation));
    +      for (x=0; x < (ssize_t) image->columns; x++)
    +      {
    +        double
    +          b,
    +          h,
    +          s;
    +
    +        ConvertRGBToHSL(GetPixelRed(p),GetPixelGreen(p),GetPixelBlue(p),
    +          &h,&s,&b);
    +        b*=QuantumRange;
    +        for (i=1; i <= 4; i++)
    +          local_brightness.sum[i]+=pow(b,(double) i);
    +        s*=QuantumRange;
    +        for (i=1; i <= 4; i++)
    +          local_saturation.sum[i]+=pow(s,(double) i);
    +        p++;
    +      }
    +#if defined(MAGICKCORE_OPENMP_SUPPORT)
    +      #pragma omp critical (analyzeImage)
    +#endif
    +      for (i=1; i <= 4; i++)
    +      {
    +        brightness.sum[i]+=local_brightness.sum[i];
    +        saturation.sum[i]+=local_saturation.sum[i];
    +      }
    +    }
    +    image_view=DestroyCacheView(image_view);
    +    area=(double) image->columns*image->rows;
    +    brightness.mean=brightness.sum[1]/area;
    +    (void) FormatLocaleString(text,MagickPathExtent,"%g",brightness.mean);
    +    (void) SetImageProperty(image,"filter:brightness:mean",text);
    +    brightness.standard_deviation=sqrt(brightness.sum[2]/area-
    +      (brightness.sum[1]/area*brightness.sum[1]/area));
    +    (void) FormatLocaleString(text,MagickPathExtent,"%g",
    +      brightness.standard_deviation);
    +    (void) SetImageProperty(image,"filter:brightness:standard-deviation",text);
    +    if (fabs(brightness.standard_deviation) >= MagickEpsilon)
    +      brightness.kurtosis=(brightness.sum[4]/area-4.0*brightness.mean*
    +        brightness.sum[3]/area+6.0*brightness.mean*brightness.mean*
    +        brightness.sum[2]/area-3.0*brightness.mean*brightness.mean*
    +        brightness.mean*brightness.mean)/(brightness.standard_deviation*
    +        brightness.standard_deviation*brightness.standard_deviation*
    +        brightness.standard_deviation)-3.0;
    +    (void) FormatLocaleString(text,MagickPathExtent,"%g",brightness.kurtosis);
    +    (void) SetImageProperty(image,"filter:brightness:kurtosis",text);
    +    if (brightness.standard_deviation != 0)
    +      brightness.skewness=(brightness.sum[3]/area-3.0*brightness.mean*
    +        brightness.sum[2]/area+2.0*brightness.mean*brightness.mean*
    +        brightness.mean)/(brightness.standard_deviation*
    +        brightness.standard_deviation*brightness.standard_deviation);
    +    (void) FormatLocaleString(text,MagickPathExtent,"%g",brightness.skewness);
    +    (void) SetImageProperty(image,"filter:brightness:skewness",text);
    +    saturation.mean=saturation.sum[1]/area;
    +    (void) FormatLocaleString(text,MagickPathExtent,"%g",saturation.mean);
    +    (void) SetImageProperty(image,"filter:saturation:mean",text);
    +    saturation.standard_deviation=sqrt(saturation.sum[2]/area-
    +      (saturation.sum[1]/area*saturation.sum[1]/area));
    +    (void) FormatLocaleString(text,MagickPathExtent,"%g",
    +      saturation.standard_deviation);
    +    (void) SetImageProperty(image,"filter:saturation:standard-deviation",text);
    +    if (fabs(saturation.standard_deviation) >= MagickEpsilon)
    +      saturation.kurtosis=(saturation.sum[4]/area-4.0*saturation.mean*
    +        saturation.sum[3]/area+6.0*saturation.mean*saturation.mean*
    +        saturation.sum[2]/area-3.0*saturation.mean*saturation.mean*
    +        saturation.mean*saturation.mean)/(saturation.standard_deviation*
    +        saturation.standard_deviation*saturation.standard_deviation*
    +        saturation.standard_deviation)-3.0;
    +    (void) FormatLocaleString(text,MagickPathExtent,"%g",saturation.kurtosis);
    +    (void) SetImageProperty(image,"filter:saturation:kurtosis",text);
    +    if (fabs(saturation.standard_deviation) >= MagickEpsilon)
    +      saturation.skewness=(saturation.sum[3]/area-3.0*saturation.mean*
    +        saturation.sum[2]/area+2.0*saturation.mean*saturation.mean*
    +        saturation.mean)/(saturation.standard_deviation*
    +        saturation.standard_deviation*saturation.standard_deviation);
    +    (void) FormatLocaleString(text,MagickPathExtent,"%g",saturation.skewness);
    +    (void) SetImageProperty(image,"filter:saturation:skewness",text);
    +    if (image->progress_monitor != (MagickProgressMonitor) NULL)
    +      {
    +        MagickBooleanType
    +          proceed;
    +
    +#if defined(MAGICKCORE_OPENMP_SUPPORT)
    +        #pragma omp atomic
    +#endif
    +        progress++;
    +        proceed=SetImageProgress(image,AnalyzeImageFilterTag,progress,
    +          GetImageListLength(image));
    +        if (proceed == MagickFalse)
    +          status=MagickFalse;
    +      }
    +  }
    +  return(MagickImageFilterSignature);
    +}
    +
    + +

    To invoke the custom filter from the command line, use this command:

    +
    convert logo: -process \"analyze\" -verbose info:
    +Image: logo:
    +  Format: LOGO (ImageMagick Logo)
    +  Class: PseudoClass
    +  Geometry: 640x480
    +  ...
    +  filter:brightness:kurtosis: 3.97886
    +  filter:brightness:mean: 58901.3
    +  filter:brightness:skewness: -2.30827
    +  filter:brightness:standard-deviation: 16179.8
    +  filter:saturation:kurtosis: 6.59719
    +  filter:saturation:mean: 5321.05
    +  filter:saturation:skewness: 2.75679
    +  filter:saturation:standard-deviation: 14484.7
    +
    + +

    We provide the Magick Filter Kit to help you get started writing your own custom image filter.

    + +

    Before you build, set the PKG_CONFIG_PATH environment variable if ImageMagick is not in your default system path:

    + +
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig 
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/assets/magick.css b/ImageMagick-6.9.12-44/www/assets/magick.css new file mode 100644 index 0000000..57a8633 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/assets/magick.css @@ -0,0 +1,64 @@ +@charset "UTF-8";/*! + * Bootstrap v5.0.2 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0))}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + (.5rem + 2px));padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + (1rem + 2px));padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + (.75rem + 2px))}textarea.form-control-sm{min-height:calc(1.5em + (.5rem + 2px))}textarea.form-control-lg{min-height:calc(1.5em + (1rem + 2px))}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ +/* + ImageMagick template. +*/ + +html { +} + +body { + color: #555; + padding-top: 3.5rem; +} + +.container { + max-width: 60rem; +} + +.magick-template { + padding: 1.5rem 1.5rem; +} + +.magick-description { + font-size: 1.1rem; + color: #999; +} + +.magick-header { + padding-bottom: 1.25rem; + margin-bottom: 2rem; + border-bottom: .05rem solid #eee; +} + +.magick-footer { + padding: 2.5rem 0; + color: #999; + text-align: center; + background-color: #f9f9f9; + border-top: .05rem solid #e5e5e5; +} + +.magick-footer p:last-child { + margin-bottom: 0; +} + +.magick-icon { + float: left; + margin: 5px; +} + +a.anchor { + position: relative; + top: -3.5rem; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} diff --git a/ImageMagick-6.9.12-44/www/assets/magick.js b/ImageMagick-6.9.12-44/www/assets/magick.js new file mode 100644 index 0000000..8a8cfb6 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/assets/magick.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.0.2 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const i=[];let n=t.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&3!==n.nodeType;)n.matches(e)&&i.push(n),n=n.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]}},e=t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t},i=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i="#"+i.split("#")[1]),e=i&&"#"!==i?i.trim():null}return e},n=t=>{const e=i(t);return e&&document.querySelector(e)?e:null},s=t=>{const e=i(t);return e?document.querySelector(e):null},o=t=>{t.dispatchEvent(new Event("transitionend"))},r=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),a=e=>r(e)?e.jquery?e[0]:e:"string"==typeof e&&e.length>0?t.findOne(e):null,l=(t,e,i)=>{Object.keys(i).forEach(n=>{const s=i[n],o=e[n],a=o&&r(o)?"element":null==(l=o)?""+l:{}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase();var l;if(!new RegExp(s).test(a))throw new TypeError(`${t.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)})},c=t=>!(!r(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),h=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),d=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?d(t.parentNode):null},u=()=>{},f=t=>t.offsetHeight,p=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},m=[],g=()=>"rtl"===document.documentElement.dir,_=t=>{var e;e=()=>{const e=p();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(m.length||document.addEventListener("DOMContentLoaded",()=>{m.forEach(t=>t())}),m.push(e)):e()},b=t=>{"function"==typeof t&&t()},v=(t,e,i=!0)=>{if(!i)return void b(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const r=({target:i})=>{i===e&&(s=!0,e.removeEventListener("transitionend",r),b(t))};e.addEventListener("transitionend",r),setTimeout(()=>{s||o(e)},n)},y=(t,e,i,n)=>{let s=t.indexOf(e);if(-1===s)return t[!i&&n?t.length-1:0];const o=t.length;return s+=i?1:-1,n&&(s=(s+o)%o),t[Math.max(0,Math.min(s,o-1))]},w=/[^.]*(?=\..*)\.|.*/,E=/\..*/,A=/::\d+$/,T={};let O=1;const C={mouseenter:"mouseover",mouseleave:"mouseout"},k=/^(mouseenter|mouseleave)/i,L=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function x(t,e){return e&&`${e}::${O++}`||t.uidEvent||O++}function D(t){const e=x(t);return t.uidEvent=e,T[e]=T[e]||{},T[e]}function S(t,e,i=null){const n=Object.keys(t);for(let s=0,o=n.length;sfunction(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};n?n=t(n):i=t(i)}const[o,r,a]=I(e,i,n),l=D(t),c=l[a]||(l[a]={}),h=S(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=x(r,e.replace(w,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return s.delegateTarget=r,n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s]);return null}}(t,i,n):function(t,e){return function i(n){return n.delegateTarget=t,i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function j(t,e,i,n,s){const o=S(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function M(t){return t=t.replace(E,""),C[t]||t}const P={on(t,e,i,n){N(t,e,i,n,!1)},one(t,e,i,n){N(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=I(e,i,n),a=r!==e,l=D(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void j(t,l,r,o,s?i:null)}c&&Object.keys(l).forEach(i=>{!function(t,e,i,n){const s=e[i]||{};Object.keys(s).forEach(o=>{if(o.includes(n)){const n=s[o];j(t,e,i,n.originalHandler,n.delegationSelector)}})}(t,l,i,e.slice(1))});const h=l[r]||{};Object.keys(h).forEach(i=>{const n=i.replace(A,"");if(!a||e.includes(n)){const e=h[i];j(t,l,r,e.originalHandler,e.delegationSelector)}})},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=p(),s=M(e),o=e!==s,r=L.has(s);let a,l=!0,c=!0,h=!1,d=null;return o&&n&&(a=n.Event(e,i),n(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(s,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach(t=>{Object.defineProperty(d,t,{get:()=>i[t]})}),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},H=new Map;var R={set(t,e,i){H.has(t)||H.set(t,new Map);const n=H.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>H.has(t)&&H.get(t).get(e)||null,remove(t,e){if(!H.has(t))return;const i=H.get(t);i.delete(e),0===i.size&&H.delete(t)}};class B{constructor(t){(t=a(t))&&(this._element=t,R.set(this._element,this.constructor.DATA_KEY,this))}dispose(){R.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(t=>{this[t]=null})}_queueCallback(t,e,i=!0){v(t,e,i)}static getInstance(t){return R.get(t,this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.0.2"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}class W extends B{static get NAME(){return"alert"}close(t){const e=t?this._getRootElement(t):this._element,i=this._triggerCloseEvent(e);null===i||i.defaultPrevented||this._removeElement(e)}_getRootElement(t){return s(t)||t.closest(".alert")}_triggerCloseEvent(t){return P.trigger(t,"close.bs.alert")}_removeElement(t){t.classList.remove("show");const e=t.classList.contains("fade");this._queueCallback(()=>this._destroyElement(t),t,e)}_destroyElement(t){t.remove(),P.trigger(t,"closed.bs.alert")}static jQueryInterface(t){return this.each((function(){const e=W.getOrCreateInstance(this);"close"===t&&e[t](this)}))}static handleDismiss(t){return function(e){e&&e.preventDefault(),t.close(this)}}}P.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',W.handleDismiss(new W)),_(W);class q extends B{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=q.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function z(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function $(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}P.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',t=>{t.preventDefault();const e=t.target.closest('[data-bs-toggle="button"]');q.getOrCreateInstance(e).toggle()}),_(q);const U={setDataAttribute(t,e,i){t.setAttribute("data-bs-"+$(e),i)},removeDataAttribute(t,e){t.removeAttribute("data-bs-"+$(e))},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter(t=>t.startsWith("bs")).forEach(i=>{let n=i.replace(/^bs/,"");n=n.charAt(0).toLowerCase()+n.slice(1,n.length),e[n]=z(t.dataset[i])}),e},getDataAttribute:(t,e)=>z(t.getAttribute("data-bs-"+$(e))),offset(t){const e=t.getBoundingClientRect();return{top:e.top+document.body.scrollTop,left:e.left+document.body.scrollLeft}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},F={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},V={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},K="next",X="prev",Y="left",Q="right",G={ArrowLeft:Q,ArrowRight:Y};class Z extends B{constructor(e,i){super(e),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(i),this._indicatorsElement=t.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return F}static get NAME(){return"carousel"}next(){this._slide(K)}nextWhenVisible(){!document.hidden&&c(this._element)&&this.next()}prev(){this._slide(X)}pause(e){e||(this._isPaused=!0),t.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(o(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(e){this._activeElement=t.findOne(".active.carousel-item",this._element);const i=this._getItemIndex(this._activeElement);if(e>this._items.length-1||e<0)return;if(this._isSliding)return void P.one(this._element,"slid.bs.carousel",()=>this.to(e));if(i===e)return this.pause(),void this.cycle();const n=e>i?K:X;this._slide(n,this._items[e])}_getConfig(t){return t={...F,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},l("carousel",t,V),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?Q:Y)}_addEventListeners(){this._config.keyboard&&P.on(this._element,"keydown.bs.carousel",t=>this._keydown(t)),"hover"===this._config.pause&&(P.on(this._element,"mouseenter.bs.carousel",t=>this.pause(t)),P.on(this._element,"mouseleave.bs.carousel",t=>this.cycle(t))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const e=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType?this._pointerEvent||(this.touchStartX=t.touches[0].clientX):this.touchStartX=t.clientX},i=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},n=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType||(this.touchDeltaX=t.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(t=>this.cycle(t),500+this._config.interval))};t.find(".carousel-item img",this._element).forEach(t=>{P.on(t,"dragstart.bs.carousel",t=>t.preventDefault())}),this._pointerEvent?(P.on(this._element,"pointerdown.bs.carousel",t=>e(t)),P.on(this._element,"pointerup.bs.carousel",t=>n(t)),this._element.classList.add("pointer-event")):(P.on(this._element,"touchstart.bs.carousel",t=>e(t)),P.on(this._element,"touchmove.bs.carousel",t=>i(t)),P.on(this._element,"touchend.bs.carousel",t=>n(t)))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=G[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(e){return this._items=e&&e.parentNode?t.find(".carousel-item",e.parentNode):[],this._items.indexOf(e)}_getItemByOrder(t,e){const i=t===K;return y(this._items,e,i,this._config.wrap)}_triggerSlideEvent(e,i){const n=this._getItemIndex(e),s=this._getItemIndex(t.findOne(".active.carousel-item",this._element));return P.trigger(this._element,"slide.bs.carousel",{relatedTarget:e,direction:i,from:s,to:n})}_setActiveIndicatorElement(e){if(this._indicatorsElement){const i=t.findOne(".active",this._indicatorsElement);i.classList.remove("active"),i.removeAttribute("aria-current");const n=t.find("[data-bs-target]",this._indicatorsElement);for(let t=0;t{P.trigger(this._element,"slid.bs.carousel",{relatedTarget:r,direction:u,from:o,to:a})};if(this._element.classList.contains("slide")){r.classList.add(d),f(r),s.classList.add(h),r.classList.add(h);const t=()=>{r.classList.remove(h,d),r.classList.add("active"),s.classList.remove("active",d,h),this._isSliding=!1,setTimeout(p,0)};this._queueCallback(t,s,!0)}else s.classList.remove("active"),r.classList.add("active"),this._isSliding=!1,p();l&&this.cycle()}_directionToOrder(t){return[Q,Y].includes(t)?g()?t===Y?X:K:t===Y?K:X:t}_orderToDirection(t){return[K,X].includes(t)?g()?t===X?Y:Q:t===X?Q:Y:t}static carouselInterface(t,e){const i=Z.getOrCreateInstance(t,e);let{_config:n}=i;"object"==typeof e&&(n={...n,...e});const s="string"==typeof e?e:n.slide;if("number"==typeof e)i.to(e);else if("string"==typeof s){if(void 0===i[s])throw new TypeError(`No method named "${s}"`);i[s]()}else n.interval&&n.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){Z.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=s(this);if(!e||!e.classList.contains("carousel"))return;const i={...U.getDataAttributes(e),...U.getDataAttributes(this)},n=this.getAttribute("data-bs-slide-to");n&&(i.interval=!1),Z.carouselInterface(e,i),n&&Z.getInstance(e).to(n),t.preventDefault()}}P.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",Z.dataApiClickHandler),P.on(window,"load.bs.carousel.data-api",()=>{const e=t.find('[data-bs-ride="carousel"]');for(let t=0,i=e.length;tt===this._element);null!==o&&r.length&&(this._selector=o,this._triggerArray.push(i))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return J}static get NAME(){return"collapse"}toggle(){this._element.classList.contains("show")?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains("show"))return;let e,i;this._parent&&(e=t.find(".show, .collapsing",this._parent).filter(t=>"string"==typeof this._config.parent?t.getAttribute("data-bs-parent")===this._config.parent:t.classList.contains("collapse")),0===e.length&&(e=null));const n=t.findOne(this._selector);if(e){const t=e.find(t=>n!==t);if(i=t?et.getInstance(t):null,i&&i._isTransitioning)return}if(P.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e&&e.forEach(t=>{n!==t&&et.collapseInterface(t,"hide"),i||R.set(t,"bs.collapse",null)});const s=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[s]=0,this._triggerArray.length&&this._triggerArray.forEach(t=>{t.classList.remove("collapsed"),t.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);const o="scroll"+(s[0].toUpperCase()+s.slice(1));this._queueCallback(()=>{this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[s]="",this.setTransitioning(!1),P.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[s]=this._element[o]+"px"}hide(){if(this._isTransitioning||!this._element.classList.contains("show"))return;if(P.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=this._element.getBoundingClientRect()[t]+"px",f(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const e=this._triggerArray.length;if(e>0)for(let t=0;t{this.setTransitioning(!1),this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),P.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}setTransitioning(t){this._isTransitioning=t}_getConfig(t){return(t={...J,...t}).toggle=Boolean(t.toggle),l("collapse",t,tt),t}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let{parent:e}=this._config;e=a(e);const i=`[data-bs-toggle="collapse"][data-bs-parent="${e}"]`;return t.find(i,e).forEach(t=>{const e=s(t);this._addAriaAndCollapsedClass(e,[t])}),e}_addAriaAndCollapsedClass(t,e){if(!t||!e.length)return;const i=t.classList.contains("show");e.forEach(t=>{i?t.classList.remove("collapsed"):t.classList.add("collapsed"),t.setAttribute("aria-expanded",i)})}static collapseInterface(t,e){let i=et.getInstance(t);const n={...J,...U.getDataAttributes(t),..."object"==typeof e&&e?e:{}};if(!i&&n.toggle&&"string"==typeof e&&/show|hide/.test(e)&&(n.toggle=!1),i||(i=new et(t,n)),"string"==typeof e){if(void 0===i[e])throw new TypeError(`No method named "${e}"`);i[e]()}}static jQueryInterface(t){return this.each((function(){et.collapseInterface(this,t)}))}}P.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',(function(e){("A"===e.target.tagName||e.delegateTarget&&"A"===e.delegateTarget.tagName)&&e.preventDefault();const i=U.getDataAttributes(this),s=n(this);t.find(s).forEach(t=>{const e=et.getInstance(t);let n;e?(null===e._parent&&"string"==typeof i.parent&&(e._config.parent=i.parent,e._parent=e._getParent()),n="toggle"):n=i,et.collapseInterface(t,n)})})),_(et);var it="top",nt="bottom",st="right",ot="left",rt=[it,nt,st,ot],at=rt.reduce((function(t,e){return t.concat([e+"-start",e+"-end"])}),[]),lt=[].concat(rt,["auto"]).reduce((function(t,e){return t.concat([e,e+"-start",e+"-end"])}),[]),ct=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function ht(t){return t?(t.nodeName||"").toLowerCase():null}function dt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function ut(t){return t instanceof dt(t).Element||t instanceof Element}function ft(t){return t instanceof dt(t).HTMLElement||t instanceof HTMLElement}function pt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof dt(t).ShadowRoot||t instanceof ShadowRoot)}var mt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];ft(s)&&ht(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});ft(n)&&ht(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function gt(t){return t.split("-")[0]}function _t(t){var e=t.getBoundingClientRect();return{width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function bt(t){var e=_t(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function vt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&pt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function yt(t){return dt(t).getComputedStyle(t)}function wt(t){return["table","td","th"].indexOf(ht(t))>=0}function Et(t){return((ut(t)?t.ownerDocument:t.document)||window.document).documentElement}function At(t){return"html"===ht(t)?t:t.assignedSlot||t.parentNode||(pt(t)?t.host:null)||Et(t)}function Tt(t){return ft(t)&&"fixed"!==yt(t).position?t.offsetParent:null}function Ot(t){for(var e=dt(t),i=Tt(t);i&&wt(i)&&"static"===yt(i).position;)i=Tt(i);return i&&("html"===ht(i)||"body"===ht(i)&&"static"===yt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&ft(t)&&"fixed"===yt(t).position)return null;for(var i=At(t);ft(i)&&["html","body"].indexOf(ht(i))<0;){var n=yt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ct(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}var kt=Math.max,Lt=Math.min,xt=Math.round;function Dt(t,e,i){return kt(t,Lt(e,i))}function St(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function It(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}var Nt={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=gt(i.placement),l=Ct(a),c=[ot,st].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return St("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:It(t,rt))}(s.padding,i),d=bt(o),u="y"===l?it:ot,f="y"===l?nt:st,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=Ot(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,E=Dt(v,w,y),A=l;i.modifiersData[n]=((e={})[A]=E,e.centerOffset=E-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&vt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},jt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Mt(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.offsets,r=t.position,a=t.gpuAcceleration,l=t.adaptive,c=t.roundOffsets,h=!0===c?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:xt(xt(e*n)/n)||0,y:xt(xt(i*n)/n)||0}}(o):"function"==typeof c?c(o):o,d=h.x,u=void 0===d?0:d,f=h.y,p=void 0===f?0:f,m=o.hasOwnProperty("x"),g=o.hasOwnProperty("y"),_=ot,b=it,v=window;if(l){var y=Ot(i),w="clientHeight",E="clientWidth";y===dt(i)&&"static"!==yt(y=Et(i)).position&&(w="scrollHeight",E="scrollWidth"),y=y,s===it&&(b=nt,p-=y[w]-n.height,p*=a?1:-1),s===ot&&(_=st,u-=y[E]-n.width,u*=a?1:-1)}var A,T=Object.assign({position:r},l&&jt);return a?Object.assign({},T,((A={})[b]=g?"0":"",A[_]=m?"0":"",A.transform=(v.devicePixelRatio||1)<2?"translate("+u+"px, "+p+"px)":"translate3d("+u+"px, "+p+"px, 0)",A)):Object.assign({},T,((e={})[b]=g?p+"px":"",e[_]=m?u+"px":"",e.transform="",e))}var Pt={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:gt(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,Mt(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,Mt(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}},Ht={passive:!0},Rt={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=dt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,Ht)})),a&&l.addEventListener("resize",i.update,Ht),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,Ht)})),a&&l.removeEventListener("resize",i.update,Ht)}},data:{}},Bt={left:"right",right:"left",bottom:"top",top:"bottom"};function Wt(t){return t.replace(/left|right|bottom|top/g,(function(t){return Bt[t]}))}var qt={start:"end",end:"start"};function zt(t){return t.replace(/start|end/g,(function(t){return qt[t]}))}function $t(t){var e=dt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ut(t){return _t(Et(t)).left+$t(t).scrollLeft}function Ft(t){var e=yt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Vt(t,e){var i;void 0===e&&(e=[]);var n=function t(e){return["html","body","#document"].indexOf(ht(e))>=0?e.ownerDocument.body:ft(e)&&Ft(e)?e:t(At(e))}(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=dt(n),r=s?[o].concat(o.visualViewport||[],Ft(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Vt(At(r)))}function Kt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Xt(t,e){return"viewport"===e?Kt(function(t){var e=dt(t),i=Et(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+Ut(t),y:a}}(t)):ft(e)?function(t){var e=_t(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Kt(function(t){var e,i=Et(t),n=$t(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=kt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=kt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ut(t),l=-n.scrollTop;return"rtl"===yt(s||i).direction&&(a+=kt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Et(t)))}function Yt(t){return t.split("-")[1]}function Qt(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?gt(s):null,r=s?Yt(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case it:e={x:a,y:i.y-n.height};break;case nt:e={x:a,y:i.y+i.height};break;case st:e={x:i.x+i.width,y:l};break;case ot:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ct(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case"start":e[c]=e[c]-(i[h]/2-n[h]/2);break;case"end":e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function Gt(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?"clippingParents":o,a=i.rootBoundary,l=void 0===a?"viewport":a,c=i.elementContext,h=void 0===c?"popper":c,d=i.altBoundary,u=void 0!==d&&d,f=i.padding,p=void 0===f?0:f,m=St("number"!=typeof p?p:It(p,rt)),g="popper"===h?"reference":"popper",_=t.elements.reference,b=t.rects.popper,v=t.elements[u?g:h],y=function(t,e,i){var n="clippingParents"===e?function(t){var e=Vt(At(t)),i=["absolute","fixed"].indexOf(yt(t).position)>=0&&ft(t)?Ot(t):t;return ut(i)?e.filter((function(t){return ut(t)&&vt(t,i)&&"body"!==ht(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Xt(t,i);return e.top=kt(n.top,e.top),e.right=Lt(n.right,e.right),e.bottom=Lt(n.bottom,e.bottom),e.left=kt(n.left,e.left),e}),Xt(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}(ut(v)?v:v.contextElement||Et(t.elements.popper),r,l),w=_t(_),E=Qt({reference:w,element:b,strategy:"absolute",placement:s}),A=Kt(Object.assign({},b,E)),T="popper"===h?A:w,O={top:y.top-T.top+m.top,bottom:T.bottom-y.bottom+m.bottom,left:y.left-T.left+m.left,right:T.right-y.right+m.right},C=t.modifiersData.offset;if("popper"===h&&C){var k=C[s];Object.keys(O).forEach((function(t){var e=[st,nt].indexOf(t)>=0?1:-1,i=[it,nt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function Zt(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?lt:l,h=Yt(n),d=h?a?at:at.filter((function(t){return Yt(t)===h})):rt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=Gt(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[gt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}var Jt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=gt(g),b=l||(_!==g&&p?function(t){if("auto"===gt(t))return[];var e=Wt(t);return[zt(t),e,zt(e)]}(g):[Wt(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat("auto"===gt(i)?Zt(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,A=!0,T=v[0],O=0;O=0,D=x?"width":"height",S=Gt(e,{placement:C,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),I=x?L?st:ot:L?nt:it;y[D]>w[D]&&(I=Wt(I));var N=Wt(I),j=[];if(o&&j.push(S[k]<=0),a&&j.push(S[I]<=0,S[N]<=0),j.every((function(t){return t}))){T=C,A=!1;break}E.set(C,j)}if(A)for(var M=function(t){var e=v.find((function(e){var i=E.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},P=p?3:1;P>0&&"break"!==M(P);P--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function te(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ee(t){return[it,st,nt,ot].some((function(e){return t[e]>=0}))}var ie={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=Gt(e,{elementContext:"reference"}),a=Gt(e,{altBoundary:!0}),l=te(r,n),c=te(a,s,o),h=ee(l),d=ee(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},ne={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=lt.reduce((function(t,i){return t[i]=function(t,e,i){var n=gt(t),s=[ot,it].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[ot,st].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},se={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Qt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},oe={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=Gt(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=gt(e.placement),b=Yt(e.placement),v=!b,y=Ct(_),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,A=e.rects.reference,T=e.rects.popper,O="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,C={x:0,y:0};if(E){if(o||a){var k="y"===y?it:ot,L="y"===y?nt:st,x="y"===y?"height":"width",D=E[y],S=E[y]+g[k],I=E[y]-g[L],N=f?-T[x]/2:0,j="start"===b?A[x]:T[x],M="start"===b?-T[x]:-A[x],P=e.elements.arrow,H=f&&P?bt(P):{width:0,height:0},R=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},B=R[k],W=R[L],q=Dt(0,A[x],H[x]),z=v?A[x]/2-N-q-B-O:j-q-B-O,$=v?-A[x]/2+N+q+W+O:M+q+W+O,U=e.elements.arrow&&Ot(e.elements.arrow),F=U?"y"===y?U.clientTop||0:U.clientLeft||0:0,V=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,K=E[y]+z-V-F,X=E[y]+$-V;if(o){var Y=Dt(f?Lt(S,K):S,D,f?kt(I,X):I);E[y]=Y,C[y]=Y-D}if(a){var Q="x"===y?it:ot,G="x"===y?nt:st,Z=E[w],J=Z+g[Q],tt=Z-g[G],et=Dt(f?Lt(J,K):J,Z,f?kt(tt,X):tt);E[w]=et,C[w]=et-Z}}e.modifiersData[n]=C}},requiresIfExists:["offset"]};function re(t,e,i){void 0===i&&(i=!1);var n,s,o=Et(e),r=_t(t),a=ft(e),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(a||!a&&!i)&&(("body"!==ht(e)||Ft(o))&&(l=(n=e)!==dt(n)&&ft(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:$t(n)),ft(e)?((c=_t(e)).x+=e.clientLeft,c.y+=e.clientTop):o&&(c.x=Ut(o))),{x:r.left+l.scrollLeft-c.x,y:r.top+l.scrollTop-c.y,width:r.width,height:r.height}}var ae={placement:"bottom",modifiers:[],strategy:"absolute"};function le(){for(var t=arguments.length,e=new Array(t),i=0;i"applyStyles"===t.name&&!1===t.enabled);this._popper=ue(e,this._menu,i),n&&U.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!t.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(t=>P.on(t,"mouseover",u)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle("show"),this._element.classList.toggle("show"),P.trigger(this._element,"shown.bs.dropdown",e)}}hide(){if(h(this._element)||!this._menu.classList.contains("show"))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){P.on(this._element,"click.bs.dropdown",t=>{t.preventDefault(),this.toggle()})}_completeHide(t){P.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>P.off(t,"mouseover",u)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),U.removeDataAttribute(this._menu,"popper"),P.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...U.getDataAttributes(this._element),...t},l("dropdown",t,this.constructor.DefaultType),"object"==typeof t.reference&&!r(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return t}_getMenuElement(){return t.next(this._element,".dropdown-menu")[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ve;if(t.classList.contains("dropstart"))return ye;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ge:me:e?be:_e}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:e,target:i}){const n=t.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(c);n.length&&y(n,i,"ArrowDown"===e,!n.includes(i)).focus()}static dropdownInterface(t,e){const i=Ae.getOrCreateInstance(t,e);if("string"==typeof e){if(void 0===i[e])throw new TypeError(`No method named "${e}"`);i[e]()}}static jQueryInterface(t){return this.each((function(){Ae.dropdownInterface(this,t)}))}static clearMenus(e){if(e&&(2===e.button||"keyup"===e.type&&"Tab"!==e.key))return;const i=t.find('[data-bs-toggle="dropdown"]');for(let t=0,n=i.length;tthis.matches('[data-bs-toggle="dropdown"]')?this:t.prev(this,'[data-bs-toggle="dropdown"]')[0];return"Escape"===e.key?(n().focus(),void Ae.clearMenus()):"ArrowUp"===e.key||"ArrowDown"===e.key?(i||n().click(),void Ae.getInstance(n())._selectMenuItem(e)):void(i&&"Space"!==e.key||Ae.clearMenus())}}P.on(document,"keydown.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',Ae.dataApiKeydownHandler),P.on(document,"keydown.bs.dropdown.data-api",".dropdown-menu",Ae.dataApiKeydownHandler),P.on(document,"click.bs.dropdown.data-api",Ae.clearMenus),P.on(document,"keyup.bs.dropdown.data-api",Ae.clearMenus),P.on(document,"click.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',(function(t){t.preventDefault(),Ae.dropdownInterface(this)})),_(Ae);class Te{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",e=>e+t),this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",e=>e+t),this._setElementAttributes(".sticky-top","marginRight",e=>e-t)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t)[e];t.style[e]=i(Number.parseFloat(s))+"px"})}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight"),this._resetElementAttributes(".sticky-top","marginRight")}_saveInitialAttribute(t,e){const i=t.style[e];i&&U.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{const i=U.getDataAttribute(t,e);void 0===i?t.style.removeProperty(e):(U.removeDataAttribute(t,e),t.style[e]=i)})}_applyManipulationCallback(e,i){r(e)?i(e):t.find(e,this._element).forEach(i)}isOverflowing(){return this.getWidth()>0}}const Oe={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},Ce={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"};class ke{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&f(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{b(t)})):b(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),b(t)})):b(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className="modal-backdrop",this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...Oe,..."object"==typeof t?t:{}}).rootElement=a(t.rootElement),l("backdrop",t,Ce),t}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),P.on(this._getElement(),"mousedown.bs.backdrop",()=>{b(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(P.off(this._element,"mousedown.bs.backdrop"),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){v(t,this._getElement(),this._config.isAnimated)}}const Le={backdrop:!0,keyboard:!0,focus:!0},xe={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class De extends B{constructor(e,i){super(e),this._config=this._getConfig(i),this._dialog=t.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new Te}static get Default(){return Le}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,"show.bs.modal",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),P.on(this._element,"click.dismiss.bs.modal",'[data-bs-dismiss="modal"]',t=>this.hide(t)),P.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{P.one(this._element,"mouseup.dismiss.bs.modal",t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(t)))}hide(t){if(t&&["A","AREA"].includes(t.target.tagName)&&t.preventDefault(),!this._isShown||this._isTransitioning)return;if(P.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const e=this._isAnimated();e&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),P.off(document,"focusin.bs.modal"),this._element.classList.remove("show"),P.off(this._element,"click.dismiss.bs.modal"),P.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,e)}dispose(){[window,this._dialog].forEach(t=>P.off(t,".bs.modal")),this._backdrop.dispose(),super.dispose(),P.off(document,"focusin.bs.modal")}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new ke({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(t){return t={...Le,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},l("modal",t,xe),t}_showElement(e){const i=this._isAnimated(),n=t.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,n&&(n.scrollTop=0),i&&f(this._element),this._element.classList.add("show"),this._config.focus&&this._enforceFocus(),this._queueCallback(()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,P.trigger(this._element,"shown.bs.modal",{relatedTarget:e})},this._dialog,i)}_enforceFocus(){P.off(document,"focusin.bs.modal"),P.on(document,"focusin.bs.modal",t=>{document===t.target||this._element===t.target||this._element.contains(t.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?P.on(this._element,"keydown.dismiss.bs.modal",t=>{this._config.keyboard&&"Escape"===t.key?(t.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==t.key||this._triggerBackdropTransition()}):P.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?P.on(window,"resize.bs.modal",()=>this._adjustDialog()):P.off(window,"resize.bs.modal")}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove("modal-open"),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(t){P.on(this._element,"click.dismiss.bs.modal",t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:i}=this._element,n=e>document.documentElement.clientHeight;!n&&"hidden"===i.overflowY||t.contains("modal-static")||(n||(i.overflowY="hidden"),t.add("modal-static"),this._queueCallback(()=>{t.remove("modal-static"),n||this._queueCallback(()=>{i.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;(!i&&t&&!g()||i&&!t&&g())&&(this._element.style.paddingLeft=e+"px"),(i&&!t&&!g()||!i&&t&&g())&&(this._element.style.paddingRight=e+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=De.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}P.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=s(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,"show.bs.modal",t=>{t.defaultPrevented||P.one(e,"hidden.bs.modal",()=>{c(this)&&this.focus()})}),De.getOrCreateInstance(e).toggle(this)})),_(De);const Se={backdrop:!0,keyboard:!0,scroll:!1},Ie={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class Ne extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return Se}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||((new Te).hide(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{P.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(P.off(document,"focusin.bs.offcanvas"),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new Te).reset(),P.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),super.dispose(),P.off(document,"focusin.bs.offcanvas")}_getConfig(t){return t={...Se,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},l("offcanvas",t,Ie),t}_initializeBackDrop(){return new ke({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(t){P.off(document,"focusin.bs.offcanvas"),P.on(document,"focusin.bs.offcanvas",e=>{document===e.target||t===e.target||t.contains(e.target)||t.focus()}),t.focus()}_addEventListeners(){P.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),P.on(this._element,"keydown.dismiss.bs.offcanvas",t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()})}static jQueryInterface(t){return this.each((function(){const e=Ne.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}P.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(e){const i=s(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),h(this))return;P.one(i,"hidden.bs.offcanvas",()=>{c(this)&&this.focus()});const n=t.findOne(".offcanvas.show");n&&n!==i&&Ne.getInstance(n).hide(),Ne.getOrCreateInstance(i).toggle(this)})),P.on(window,"load.bs.offcanvas.data-api",()=>t.find(".offcanvas.show").forEach(t=>Ne.getOrCreateInstance(t).show())),_(Ne);const je=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Me=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Pe=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,He=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!je.has(i)||Boolean(Me.test(t.nodeValue)||Pe.test(t.nodeValue));const n=e.filter(t=>t instanceof RegExp);for(let t=0,e=n.length;t{He(t,a)||i.removeAttribute(t.nodeName)})}return n.body.innerHTML}const Be=new RegExp("(^|\\s)bs-tooltip\\S+","g"),We=new Set(["sanitize","allowList","sanitizeFn"]),qe={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},ze={AUTO:"auto",TOP:"top",RIGHT:g()?"left":"right",BOTTOM:"bottom",LEFT:g()?"right":"left"},$e={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Ue={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"};class Fe extends B{constructor(t,e){if(void 0===fe)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return $e}static get NAME(){return"tooltip"}static get Event(){return Ue}static get DefaultType(){return qe}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.Event.SHOW),i=d(this._element),n=null===i?this._element.ownerDocument.documentElement.contains(this._element):i.contains(this._element);if(t.defaultPrevented||!n)return;const s=this.getTipElement(),o=e(this.constructor.NAME);s.setAttribute("id",o),this._element.setAttribute("aria-describedby",o),this.setContent(),this._config.animation&&s.classList.add("fade");const r="function"==typeof this._config.placement?this._config.placement.call(this,s,this._element):this._config.placement,a=this._getAttachment(r);this._addAttachmentClass(a);const{container:l}=this._config;R.set(s,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(l.appendChild(s),P.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=ue(this._element,s,this._getPopperConfig(a)),s.classList.add("show");const c="function"==typeof this._config.customClass?this._config.customClass():this._config.customClass;c&&s.classList.add(...c.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>{P.on(t,"mouseover",u)});const h=this.tip.classList.contains("fade");this._queueCallback(()=>{const t=this._hoverState;this._hoverState=null,P.trigger(this._element,this.constructor.Event.SHOWN),"out"===t&&this._leave(null,this)},this.tip,h)}hide(){if(!this._popper)return;const t=this.getTipElement();if(P.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>P.off(t,"mouseover",u)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");return t.innerHTML=this._config.template,this.tip=t.children[0],this.tip}setContent(){const e=this.getTipElement();this.setElementContent(t.findOne(".tooltip-inner",e),this.getTitle()),e.classList.remove("fade","show")}setElementContent(t,e){if(null!==t)return r(e)?(e=a(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.appendChild(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=Re(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){let t=this._element.getAttribute("data-bs-original-title");return t||(t="function"==typeof this._config.title?this._config.title.call(this._element):this._config.title),t}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){const i=this.constructor.DATA_KEY;return(e=e||R.get(t.delegateTarget,i))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),R.set(t.delegateTarget,i,e)),e}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(t))}_getAttachment(t){return ze[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(t=>{if("click"===t)P.on(this._element,this.constructor.Event.CLICK,this._config.selector,t=>this.toggle(t));else if("manual"!==t){const e="hover"===t?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i="hover"===t?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;P.on(this._element,e,this._config.selector,t=>this._enter(t)),P.on(this._element,i,this._config.selector,t=>this._leave(t))}}),this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e.getTipElement().classList.contains("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e._config.delay&&e._config.delay.show?e._timeout=setTimeout(()=>{"show"===e._hoverState&&e.show()},e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e._config.delay&&e._config.delay.hide?e._timeout=setTimeout(()=>{"out"===e._hoverState&&e.hide()},e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=U.getDataAttributes(this._element);return Object.keys(e).forEach(t=>{We.has(t)&&delete e[t]}),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:a(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),l("tooltip",t,this.constructor.DefaultType),t.sanitize&&(t.template=Re(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};if(this._config)for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=t.getAttribute("class").match(Be);null!==e&&e.length>0&&e.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}static jQueryInterface(t){return this.each((function(){const e=Fe.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}_(Fe);const Ve=new RegExp("(^|\\s)bs-popover\\S+","g"),Ke={...Fe.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},Xe={...Fe.DefaultType,content:"(string|element|function)"},Ye={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class Qe extends Fe{static get Default(){return Ke}static get NAME(){return"popover"}static get Event(){return Ye}static get DefaultType(){return Xe}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip||(this.tip=super.getTipElement(),this.getTitle()||t.findOne(".popover-header",this.tip).remove(),this._getContent()||t.findOne(".popover-body",this.tip).remove()),this.tip}setContent(){const e=this.getTipElement();this.setElementContent(t.findOne(".popover-header",e),this.getTitle());let i=this._getContent();"function"==typeof i&&(i=i.call(this._element)),this.setElementContent(t.findOne(".popover-body",e),i),e.classList.remove("fade","show")}_addAttachmentClass(t){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(t))}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){const t=this.getTipElement(),e=t.getAttribute("class").match(Ve);null!==e&&e.length>0&&e.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}static jQueryInterface(t){return this.each((function(){const e=Qe.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}_(Qe);const Ge={offset:10,method:"auto",target:""},Ze={offset:"number",method:"string",target:"(string|element)"};class Je extends B{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._selector=`${this._config.target} .nav-link, ${this._config.target} .list-group-item, ${this._config.target} .dropdown-item`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,P.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return Ge}static get NAME(){return"scrollspy"}refresh(){const e=this._scrollElement===this._scrollElement.window?"offset":"position",i="auto"===this._config.method?e:this._config.method,s="position"===i?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.find(this._selector).map(e=>{const o=n(e),r=o?t.findOne(o):null;if(r){const t=r.getBoundingClientRect();if(t.width||t.height)return[U[i](r).top+s,o]}return null}).filter(t=>t).sort((t,e)=>t[0]-e[0]).forEach(t=>{this._offsets.push(t[0]),this._targets.push(t[1])})}dispose(){P.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){if("string"!=typeof(t={...Ge,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target&&r(t.target)){let{id:i}=t.target;i||(i=e("scrollspy"),t.target.id=i),t.target="#"+i}return l("scrollspy",t,Ze),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t`${t}[data-bs-target="${e}"],${t}[href="${e}"]`),n=t.findOne(i.join(","));n.classList.contains("dropdown-item")?(t.findOne(".dropdown-toggle",n.closest(".dropdown")).classList.add("active"),n.classList.add("active")):(n.classList.add("active"),t.parents(n,".nav, .list-group").forEach(e=>{t.prev(e,".nav-link, .list-group-item").forEach(t=>t.classList.add("active")),t.prev(e,".nav-item").forEach(e=>{t.children(e,".nav-link").forEach(t=>t.classList.add("active"))})})),P.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:e})}_clear(){t.find(this._selector).filter(t=>t.classList.contains("active")).forEach(t=>t.classList.remove("active"))}static jQueryInterface(t){return this.each((function(){const e=Je.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(window,"load.bs.scrollspy.data-api",()=>{t.find('[data-bs-spy="scroll"]').forEach(t=>new Je(t))}),_(Je);class ti extends B{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let e;const i=s(this._element),n=this._element.closest(".nav, .list-group");if(n){const i="UL"===n.nodeName||"OL"===n.nodeName?":scope > li > .active":".active";e=t.find(i,n),e=e[e.length-1]}const o=e?P.trigger(e,"hide.bs.tab",{relatedTarget:this._element}):null;if(P.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==o&&o.defaultPrevented)return;this._activate(this._element,n);const r=()=>{P.trigger(e,"hidden.bs.tab",{relatedTarget:this._element}),P.trigger(this._element,"shown.bs.tab",{relatedTarget:e})};i?this._activate(i,i.parentNode,r):r()}_activate(e,i,n){const s=(!i||"UL"!==i.nodeName&&"OL"!==i.nodeName?t.children(i,".active"):t.find(":scope > li > .active",i))[0],o=n&&s&&s.classList.contains("fade"),r=()=>this._transitionComplete(e,s,n);s&&o?(s.classList.remove("show"),this._queueCallback(r,e,!0)):r()}_transitionComplete(e,i,n){if(i){i.classList.remove("active");const e=t.findOne(":scope > .dropdown-menu .active",i.parentNode);e&&e.classList.remove("active"),"tab"===i.getAttribute("role")&&i.setAttribute("aria-selected",!1)}e.classList.add("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),f(e),e.classList.contains("fade")&&e.classList.add("show");let s=e.parentNode;if(s&&"LI"===s.nodeName&&(s=s.parentNode),s&&s.classList.contains("dropdown-menu")){const i=e.closest(".dropdown");i&&t.find(".dropdown-toggle",i).forEach(t=>t.classList.add("active")),e.setAttribute("aria-expanded",!0)}n&&n()}static jQueryInterface(t){return this.each((function(){const e=ti.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),h(this)||ti.getOrCreateInstance(this).show()})),_(ti);const ei={animation:"boolean",autohide:"boolean",delay:"number"},ii={animation:!0,autohide:!0,delay:5e3};class ni extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return ei}static get Default(){return ii}static get NAME(){return"toast"}show(){P.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),f(this._element),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),this._element.classList.add("show"),P.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(P.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.remove("show"),this._queueCallback(()=>{this._element.classList.add("hide"),P.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),super.dispose()}_getConfig(t){return t={...ii,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},l("toast",t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',()=>this.hide()),P.on(this._element,"mouseover.bs.toast",t=>this._onInteraction(t,!0)),P.on(this._element,"mouseout.bs.toast",t=>this._onInteraction(t,!1)),P.on(this._element,"focusin.bs.toast",t=>this._onInteraction(t,!0)),P.on(this._element,"focusout.bs.toast",t=>this._onInteraction(t,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ni.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return _(ni),{Alert:W,Button:q,Carousel:Z,Collapse:et,Dropdown:Ae,Modal:De,Offcanvas:Ne,Popover:Qe,ScrollSpy:Je,Tab:ti,Toast:ni,Tooltip:Fe}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map diff --git a/ImageMagick-6.9.12-44/www/changelog.html b/ImageMagick-6.9.12-44/www/changelog.html new file mode 100644 index 0000000..426f612 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/changelog.html @@ -0,0 +1,5356 @@ + + + + + + + + + + ImageMagick (legacy) – Changelog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    2022-02-18 6.9.12-41 <quetzlzacatenango@image...>
    +
  7. Release ImageMagick version 6.9.12-41 GIT revision 17...
  8. +
    2022-02-18 6.9.12-41 <quetzlzacatenango@image...>
    +
  9. unrecognized color as the color is used before it is defined (reference https://github.com/ImageMagick/ImageMagick/issues/4843).
  10. +
  11. optimized performance of thumbnail resizing algorithm (reference https://github.com/ImageMagick/ImageMagick/discussions/4755).
  12. +
    2022-02-15 6.9.12-40 <quetzlzacatenango@image...>
    +
  13. Release ImageMagick version 6.9.12-40 GIT revision 17057:409d6db86:20220215
  14. +
    2022-02-13 6.9.12-40 <quetzlzacatenango@image...>
    +
  15. incontinuity in straight segment of polyline (reference https://github.com/ImageMagick/ImageMagick/issues/4837).
  16. +
    2022-02-12 6.9.12-39 <quetzlzacatenango@image...>
    +
  17. Release ImageMagick version 6.9.12-39 GIT revision 17043:99ef124d0:20220212
  18. +
    2022-02-06 6.9.12-39 <quetzlzacatenango@image...>
    +
  19. optimize reading of XPM properties.
  20. +
  21. Netscape block must appear immediately after the global color table.
  22. +
    2022-02-05 6.9.12-38 <quetzlzacatenango@image...>
    +
  23. Release ImageMagick version 6.9.12-38 GIT revision 17024:bbf05a344:20220205
  24. +
    2022-02-02 6.9.12-38 <quetzlzacatenango@image...>
    +
  25. limit recursion when reading the VID image format.
  26. +
  27. improperly resizing memory due to errant check (reference https://github.com/ImageMagick/ImageMagick/issues/4807).
  28. +
    2022-01-29 6.9.12-37 <quetzlzacatenango@image...>
    +
  29. Release ImageMagick version 6.9.12-37 GIT revision 17011:4dd4d0df4:20220129
  30. +
    2022-01-29 6.9.12-37 <quetzlzacatenango@image...>
    +
  31. limit colorname length to avoid possible DoS
  32. +
  33. restore MPRI URI in SVG
  34. + https://github.com/ImageMagick/ImageMagick/issues/4771).
    2022-01-28 6.9.12-36 <quetzlzacatenango@image...>
    +
  35. Release ImageMagick version 6.9.12-36 GIT revision 17005:bf36be468:20220128
  36. +
    2022-01-21 6.9.12-36 <quetzlzacatenango@image...>
    +
  37. PDF now shows the correct Unicode title (reference https://github.com/ImageMagick/ImageMagick/issues/4771).
  38. +
    2022-01-24 6.9.12-36 Dirk Lemstra <dirk@lem.....org>
    +
  39. Add missing HEIC version check.
  40. +
    2022-01-21 6.9.12-35 <quetzlzacatenango@image...>
    +
  41. Release ImageMagick version 6.9.12-35 GIT revision 16991:2287dca49:20220121
  42. +
    2022-01-12 6.9.12-35 <quetzlzacatenango@image...>
    +
  43. Perist frame delay when converting APNG to Webp (reference https://github.com/ImageMagick/ImageMagick/issues/4704).
  44. +
    2021-12-22 6.9.12-34 <quetzlzacatenango@image...>
    +
  45. Release ImageMagick version 6.9.12-34 GIT revision 16959:c10351c16:20211222
  46. +
    2021-12-22 6.9.12-34 <quetzlzacatenango@image...>
    +
  47. possible DoS for certain SVG constructs (reference https://github.com/ImageMagick/ImageMagick/issues/4626).
  48. +
    2021-12-18 6.9.12-33 <quetzlzacatenango@image...>
    +
  49. Release ImageMagick version 6.9.12-33 GIT revision 16952:add9cb14e:20211218
  50. +
    2021-12-11 6.9.12-33 <quetzlzacatenango@image...>
    +
  51. support face index for font collections, e.g. msgothic.ttc[1].
  52. +
    2021-12-11 6.9.12-33 Dirk Lemstra <dirk@lem.....org>
    +
  53. Improved adjustment of page offset when resizing an image.
  54. +
    2021-12-04 6.9.12-32 <quetzlzacatenango@image...>
    +
  55. Release ImageMagick version 6.9.12-32 GIT revision 16936:e35c98c5a:20211204
  56. +
    2021-11-27 6.9.12-32 <quetzlzacatenango@image...>
    +
  57. set threads to 1 when using ASAN to avoid false positive memory leaks.
  58. +
    2021-11-21 6.9.12-31 <quetzlzacatenango@image...>
    +
  59. Release ImageMagick version 6.9.12-31 GIT revision 16917:149fb8a34:20211121
  60. +
    2021-11-21 6.9.12-31 Dirk Lemstra <dirk@lem.....org>
    +
  61. Fixed an OpenCL build problem.
  62. +
    2021-11-20 6.9.12-30 <quetzlzacatenango@image...>
    +
  63. Release ImageMagick version 6.9.12-30 GIT revision 16912:dda7d0bb7:20211120
  64. +
    2021-11-14 6.9.12-30 <quetzlzacatenango@image...>
    +
  65. Fix integer overflow (reference https://github.com/ImageMagick/ImageMagick6/issues/168).
  66. +
  67. eliminate runtime error: applying zero offset to null pointer.
  68. +
    2021-11-14 6.9.12-29 <quetzlzacatenango@image...>
    +
  69. Release ImageMagick version 6.9.12-29 GIT revision 16895:ba084f6bd:20211114
  70. +
    2021-11-14 6.9.12-29 <quetzlzacatenango@image...>
    +
  71. Fix broken release.
  72. +
    2021-10-29 6.9.12-28 <quetzlzacatenango@image...>
    +
  73. Release ImageMagick version 6.9.12-28 GIT revision 16883:4b5c30c0b:20211029
  74. +
    2021-10-28 6.9.12-28 Dirk Lemstra <dirk@lem.....org>
    +
  75. Fix stack overflow when parsing malicious PS image file (report from Muhammad Aldo Firmansyah).
  76. +
    2021-10-25 6.9.12-27 <quetzlzacatenango@image...>
    +
  77. Release ImageMagick version 6.9.12-27 GIT revision 16873:60fcc2499:20211025
  78. +
    2021-10-25 6.9.12-27 <quetzlzacatenango@image...>
    +
  79. fix x64 Windows build.
  80. +
    2021-10-24 6.9.12-26 <quetzlzacatenango@image...>
    +
  81. Release ImageMagick version 6.9.12-26 GIT revision 16871:3430fb87b:20211024
  82. +
    2021-10-11 6.9.12-26 <quetzlzacatenango@image...>
    +
  83. fix connected component abort trap (reference https://github.com/ImageMagick/ImageMagick/issues/4372).
  84. +
  85. fix possible unitialized values (reference https://github.com/ImageMagick/ImageMagick/issues/4379).
  86. +
  87. fix stack overflow when parsing malicious tiff image file (report from Muhammad Aldo Firmansyah).
  88. +
    2021-10-10 6.9.12-25 <quetzlzacatenango@image...>
    +
  89. Release ImageMagick version 6.9.12-25 GIT revision 16849:2c96ab5d0:20211010
  90. +
    2021-10-03 6.9.12-25 <quetzlzacatenango@image...>
    +
  91. improved algorithm for automatic calculation of pointsize for caption and labels.
  92. +
  93. support -auto-orient option in the identify utlity.
    2021-10-03 6.9.12-24 <quetzlzacatenango@image...>
    +
  94. Release ImageMagick version 6.9.12-24 GIT revision 16842:f6fdd0321:20211003
  95. +
    2021-10-03 6.9.12-24 Dirk Lemstra <dirk@lem.....org>
    +
  96. improved algorithm for automatic calculation of word breaks and pointsize for caption and labels.
  97. +
    2021-09-19 6.9.12-24 <quetzlzacatenango@image...>
    +
  98. improve wrapping between words and within words (reference https://github.com/ImageMagick/ImageMagick/discussions/4227).
  99. +
    2021-09-18 6.9.12-23 <quetzlzacatenango@image...>
    +
  100. Release ImageMagick version 6.9.12-23 GIT revision 16818:bd9fb58de:20210918
  101. +
    2021-09-17 6.9.12-23 Dirk Lemstra <dirk@lem.....org>
    +
  102. Check for `null` in InvokeDelegate() (reference https://github.com/ImageMagick/ImageMagick/issues/4225).
  103. +
    2021-09-12 6.9.12-22 <quetzlzacatenango@image...>
    +
  104. Release ImageMagick version 6.9.12-22 GIT revision 16809:ae88f07cd:20210912
  105. +
    2021-09-11 6.9.12-22 Dirk Lemstra <dirk@lem.....org>
    +
  106. Fixed incorrect check when module is used as the domain in policy.xml that could allow the use of a disabled module. (reference https://github.com/ImageMagick/ImageMagick/security/advisories/GHSA-qvhr-jj4p-j2qr).
  107. +
    2021-09-06 6.9.12-22 <quetzlzacatenango@image...>
    +
  108. Prevent color reduction merging into one color (reference https://github.com/ImageMagick/ImageMagick/issues/4059).
  109. +
    2021-09-04 6.9.12-21 <quetzlzacatenango@image...>
    +
  110. Release ImageMagick version 6.9.12-21 GIT revision 16778:e0967eae2:20210904
  111. +
    2021-08-21 6.9.12-21 <quetzlzacatenango@image...>
    +
  112. Tweak the bilevel image type (reference https://github.com/ImageMagick/ImageMagick/issues/4121).
  113. +
  114. Converting from LAB to RGB leads to wrong colors (reference https://github.com/ImageMagick/ImageMagick/issues/4105).
  115. +
    2021-08-21 6.9.12-20 <quetzlzacatenango@image...>
    +
  116. Release ImageMagick version 6.9.12-20 GIT revision 16761:d49be7fbb:20210821
  117. +
    2021-07-26 6.9.12-20 <quetzlzacatenango@image...>
    +
  118. Heap-based buffer overflow in TIFF coder (alert from Hunter Mitchell).
  119. +
  120. Grayscale image write optimization
  121. +
    2021-07-18 6.9.12-19 <quetzlzacatenango@image...>
    +
  122. Release ImageMagick version 6.9.12-19 GIT revision 16731:1015767a1:20210718
  123. +
    2021-07-17 6.9.12-19 <quetzlzacatenango@image...>
    +
  124. Trim no longer returns an empty image on 1-pixel width input (reference https://github.com/ImageMagick/ImageMagick/issues/3896).
  125. +
  126. Remove virtual canvas offset from difference image.
  127. +
    2021-07-17 6.9.12-18 <quetzlzacatenango@image...>
    +
  128. Release ImageMagick version 6.9.12-18 GIT revision 16714:4ce1321c4:20210717
  129. +
    2021-06-26 6.9.12-18 <quetzlzacatenango@image...>
    +
  130. system() is not supported under IOS.
  131. +
    2021-06-25 6.9.12-17 <quetzlzacatenango@image...>
    +
  132. Release ImageMagick version 6.9.12-17 GIT revision 16689:d02e016da:20210620
  133. +
    2021-06-25 6.9.12-17 <quetzlzacatenango@image...>
    +
  134. malloc() corruption fix (reference https://github.com/ImageMagick/ImageMagick6/issues/159).
  135. +
    2021-06-19 6.9.12-16 <quetzlzacatenango@image...>
    +
  136. Correct TGA orientation (reference https://github.com/ImageMagick/ImageMagick/issues/3844).
  137. +
    2021-06-12 6.9.12-15 <quetzlzacatenango@image...>
    +
  138. Release ImageMagick version 6.9.12-15 GIT revision 16679:b21457a7e:20210612
  139. +
    2021-06-02 6.9.12-15 <quetzlzacatenango@image...>
    +
  140. SVG no longer hangs when handling class in <defs> (reference https://github.com/ImageMagick/ImageMagick/issues/3818).
  141. +
  142. Raise exception for invalid compose:args geometry (reference https://github.com/ImageMagick/ImageMagick/issues/3765).
  143. +
    2021-05-31 6.9.12-14 <quetzlzacatenango@image...>
    +
  144. Release ImageMagick version 6.9.12-14 GIT revision 16665:c75ae771a:20210531
  145. +
    2021-05-17 6.9.12-13 <quetzlzacatenango@image...>
    +
  146. Release ImageMagick version 6.9.12-13 GIT revision 16653:8305ee312:20210517
  147. +
    2021-05-12 6.9.12-13 Dirk Lemstra <dirk@lem.....org>
    +
  148. Fixed reading and writing the XMP chunk in a WebP image (reference https://github.com/ImageMagick/ImageMagick/discussions/3617).
  149. +
    2021-05-11 6.9.12-13 <quetzlzacatenango@image...>
    +
  150. label and caption sanity check is too conservative.
  151. +
    2021-05-07 6.9.12-12 <quetzlzacatenango@image...>
    +
  152. Release ImageMagick version 6.9.12-12 GIT revision 16630:ed78be2e6:20210507
  153. +
    2021-05-06 6.9.12-12 <quetzlzacatenango@image...>
    +
  154. -layers optimize no longer produces broken output (reference https://github.com/ImageMagick/ImageMagick/issues/3520).
  155. +
    2021-05-04 6.9.12-11 <quetzlzacatenango@image...>
    +
  156. Release ImageMagick version 6.9.12-11 GIT revision 16625:7d8a3b762:20210504
  157. +
    2021-04-25 6.9.12-11 <quetzlzacatenango@image...>
    +
  158. reverted color reduction patch so that it treats alpha blending properly.
  159. +
    2021-04-28 6.9.12-10 <quetzlzacatenango@image...>
    +
  160. Release ImageMagick version 6.9.12-10 GIT revision 16602:f98edd4aa:20210428
  161. +
    2021-04-25 6.9.12-10 <quetzlzacatenango@image...>
    +
  162. Check image is not NULL before dereferencing.
  163. +
    2021-04-25 6.9.12-9 <quetzlzacatenango@image...>
    +
  164. Release ImageMagick version 6.9.12-9 GIT revision 16...
  165. +
    2021-04-25 6.9.12-9 <quetzlzacatenango@image...>
    +
  166. eliminate uninitialized value.
  167. +
  168. Differences in computing linear gray (reference https://github.com/ImageMagick/ImageMagick/issues/3571).
  169. +
    2021-04-17 6.9.12-8 <quetzlzacatenango@image...>
    +
  170. Release ImageMagick version 6.9.12-8 GIT revision 16581:0eccd3556:20210417
  171. +
    2021-04-09 6.9.12-8 <quetzlzacatenango@image...>
    +
  172. constrain sub-image list.
  173. +
  174. write tiff colormapped images with an alpha channel as PHOTOMETRIC_RGB
  175. +
    2021-04-03 6.9.12-6 <quetzlzacatenango@image...>
    +
  176. Release ImageMagick version 6.9.12-6 GIT revision 16552:6c4bc786e:20210403
  177. +
    2021-04-01 6.9.12-6 Dirk Lemstra <dirk@lem.....org>
    +
  178. fix portable Windows build.
  179. +
    2021-03-28 6.9.12-5 <quetzlzacatenango@image...>
    +
  180. Release ImageMagick version 6.9.12-5 GIT revision 16537:ffa0d49a7:20210328
  181. +
    2021-03-25 6.9.12-5 Dirk Lemstra <dirk@lem.....org>
    +
  182. OpenCL will be disabled by default, use the environment variable MAGICK_OCL_DEVICE to turn it on or select the device to use.
  183. +
    2021-03-24 6.9.12-5 <quetzlzacatenango@image...>
    +
  184. eliminate extraneous spaces in AC_PATH_PROG (reference https://github.com/ImageMagick/ImageMagick/issues/3428).
  185. +
  186. fix handling of non-square images with -fft option.
  187. +
  188. enable FFTW support with --with-fftw configure script command-line option.
  189. +
    2021-03-20 6.9.12-4 <quetzlzacatenango@image...>
    +
  190. Release ImageMagick version 6.9.12-4 GIT revision 16525:21991f726:20210320
  191. +
    2021-03-13 6.9.12-4 <quetzlzacatenango@image...>
    +
  192. support caption:split define (reference https://github.com/ImageMagick/ImageMagick/discussions/3389).
  193. +
  194. avoid an omp deadlock with policy string
  195. +
    2021-03-06 6.9.12-3 <quetzlzacatenango@image...>
    +
  196. Release ImageMagick version 6.9.12-3 GIT revision 16511:448f9271e:20210306
  197. +
    2021-03-02 6.9.12-3 <quetzlzacatenango@image...>
    +
  198. Eliminate multiple division by zero exceptions (reference https://github.com/ImageMagick/ImageMagick/issues/3339 and others).
  199. +
  200. Use -define filename:literal=true to bypass interpretting embedded formatting characters and instead use the filename literally.
  201. +
    2021-02-27 6.9.12-2 <quetzlzacatenango@image...>
    +
  202. Release ImageMagick version 6.9.12-2 GIT revision 16494:64c0cc234:2021022
  203. +
    2021-02-21 6.9.12-2 <happyerc...@...>
    +
  204. Division by zero error is possible if crafty file sets film-gamma property
  205. +
  206. Check for overflow in thumbnail coder
  207. +
  208. Prevent compiler from optimizing out buffer clearing in cipher
  209. +
    2021-02-21 6.9.12-2 <quetzlzacatenango@image...>
    +
  210. Clone properties from image stack.
  211. +
    2021-02-21 6.9.12-1 <quetzlzacatenango@image...>
    +
  212. Release ImageMagick version 6.9.12-1 GIT revision 16474:e6a300ef2:20210221
  213. +
    2021-02-15 6.9.12-1 <quetzlzacatenango@image...>
    +
  214. fix EXR crash (reference https://github.com/ImageMagick/ImageMagick/issues/3242
  215. +
    2021-02-13 6.9.12-0 <quetzlzacatenango@image...>
    +
  216. Release ImageMagick version 6.9.12-0 GIT revision 16464:dab48bafd:20210213
  217. +
    2021-02-10 6.9.12-0 <quetzlzacatenango@image...>
    +
  218. bump minor version #.
  219. +
    2021-02-07 6.9.11-62 <quetzlzacatenango@image...>
    +
  220. Release ImageMagick version 6.9.11-62 GIT revision 16452:52351447e:20210207
  221. +
    2021-02-01 6.9.11-61 <quetzlzacatenango@image...>
    +
  222. -trim not working as expected (reference https://github.com/ImageMagick/ImageMagick/discussions/3172).
  223. +
  224. possible undefined behavior (reference https://github.com/ImageMagick/ImageMagick/issues/3195).
  225. +
  226. sanitize buggy ascender and descender values (reference https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=980202).
  227. +
    2021-01-30 6.9.11-61 <quetzlzacatenango@image...>
    +
  228. Release ImageMagick version 6.9.11-61 GIT revision 16418:485a53860:20210130
  229. +
    2021-01-25 6.9.11-61 <quetzlzacatenango@image...>
    +
  230. dng:decode element in delegates.xml quoted incorrectly (reference https://github.com/ImageMagick/ImageMagick/issues/3156).
  231. +
  232. Extract GPS info from TIFF images (reference https://github.com/ImageMagick/ImageMagick/issues/3167).
  233. +
  234. Revert tieing MagickFloatType to double (reference https://github.com/ImageMagick/ImageMagick/pull/2832).
  235. +
    2021-01-25 6.9.11-60 <quetzlzacatenango@image...>
    +
  236. Release ImageMagick version 6.9.11-60 GIT revision 16407:584cabd8b:20210125
  237. +
    2021-01-24 6.9.11-60 <quetzlzacatenango@image...>
    +
  238. nothing new, lockstep with IMv7 Release.
  239. +
    2021-01-24 6.9.11-59 <quetzlzacatenango@image...>
    +
  240. Release ImageMagick version 6.9.11-59 GIT revision 16399:3614d5e0a:20210124
  241. +
    2021-01-20 6.9.11-59 <quetzlzacatenango@image...>
    +
  242. strip EXIF marker from profile (reference https://github.com/ImageMagick/ImageMagick/issues/3140).
  243. +
  244. add --enable-opencl to the configure command-line to enable OpenCL support.
  245. +
  246. generate histograms by comparing pixel components rather than color (reference https://github.com/ImageMagick/ImageMagick/discussions/3142).
  247. +
  248. revert annotation performance optimization (reference https://github.com/ImageMagick/ImageMagick6/issues/130).
  249. +
    2021-01-16 6.9.11-58 <quetzlzacatenango@image...>
    +
  250. Release ImageMagick version 6.9.11-58 GIT revision 16343:f38ca0d37:20210116
  251. +
    2021-01-11 6.9.11-58 <quetzlzacatenango@image...>
    +
  252. properly identify SVG images (reference https://github.com/ImageMagick/ImageMagick/issues/3117).
  253. +
  254. duplicate operator: inverse range parameter working again (reference https://github.com/ImageMagick/ImageMagick/issues/3113).
  255. +
  256. Fix rounding error for CSS colors on i686 (reference https://tracker.debian.org/pkg/imagemagick).
  257. +
    2021-01-09 6.9.11-57 <quetzlzacatenango@image...>
    +
  258. Release ImageMagick version 6.9.11-57 GIT revision 16301:c2f75ef89:20210109
  259. +
    2021-01-08 6.9.11-57 <quetzlzacatenango@image...>
    +
  260. update automake/autoconf configuration files.
  261. +
  262. additional checks to prevent integer overflow.
  263. +
    2021-01-05 6.9.11-56 <quetzlzacatenango@image...>
    +
  264. Release ImageMagick version 6.9.11-56 GIT revision 16272:007db884f:20210105
  265. +
    2021-01-05 6.9.11-56 <quetzlzacatenango@image...>
    +
  266. Fix rounding error for CSS colors (reference https://github.com/ImageMagick/ImageMagick6/issues/129).
  267. +
    2021-01-03 6.9.11-55 <quetzlzacatenango@image...>
    +
  268. Release ImageMagick version 6.9.11-55 GIT revision 16266:c3350670f:20210103
  269. +
    2021-01-03 6.9.11-55 <quetzlzacatenango@image...>
    +
  270. revert changes to the default max width/height of image.
  271. +
    2021-01-02 6.9.11-54 <quetzlzacatenango@image...>
    +
  272. Release ImageMagick version 6.9.11-54 GIT revision 16244:6b93d4529:20210102
  273. +
    2020-12-25 6.9.11-54 <quetzlzacatenango@image...>
    +
  274. enable reading of a certain grayscale TIFF image.
  275. +
  276. validate pixel cache offsets (reference https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=29039).
  277. +
    2020-12-24 6.9.11-53 <quetzlzacatenango@image...>
    +
  278. Release ImageMagick version 6.9.11-53 GIT revision 16203:1449d6ede:20201224
  279. +
    2020-12-20 6.9.11-53 <quetzlzacatenango@image...>
    +
  280. CSS colors no longer require commas.
  281. +
  282. eliminate possible arthimetic overflow (reference https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=28849)
  283. +
    2020-12-19 6.9.11-52 <quetzlzacatenango@image...>
    +
  284. Release ImageMagick version 6.9.11-52 GIT revision 16185:710d7811d:20201219
  285. +
    2020-12-19 6.9.11-52 <quetzlzacatenango@image...>
    +
  286. return alpha bytes with stream utility (reference https://github.com/ImageMagick/ImageMagick/discussions/2862).
  287. +
  288. percentage -border in x no longer adds one pixel border in y (reference https://github.com/ImageMagick/ImageMagick/issues/2978).
  289. +
    2020-12-18 6.9.11-51 <quetzlzacatenango@image...>
    +
  290. Release ImageMagick version 6.9.11-51 GIT revision 16180:7d116a3bb:20201218
  291. +
    2020-12-17 6.9.11-51 <quetzlzacatenango@image...>
    +
  292. reduce time to identify PDF/PS/XPS/PCL image width/height (reference https://github.com/ImageMagick/ImageMagick/discussions/2993).
  293. +
    2020-12-16 6.9.11-50 <quetzlzacatenango@image...>
    +
  294. Release ImageMagick version 6.9.11-50 GIT revision 16174:7cd364a33:20201216
  295. +
    2020-12-15 6.9.11-50 <quetzlzacatenango@image...>
    +
  296. revert patch to ready gray alpha TIFF image.
  297. +
    2020-12-14 6.9.11-49 <quetzlzacatenango@image...>
    +
  298. Release ImageMagick version 6.9.11-49 GIT revision 16165:749185e00:20201214
  299. +
    2020-12-13 6.9.11-49 <quetzlzacatenango@image...>
    +
  300. correct previous patch to read planar RGB TIFF images.
  301. +
    2020-12-10 6.9.11-48 <quetzlzacatenango@image...>
    +
  302. Release ImageMagick version 6.9.11-48 GIT revision 16156:573d57764:20201210
  303. +
    2020-12-09 6.9.11-48 <quetzlzacatenango@image...>
    +
  304. Repair unit test failures (reference https://github.com/ImageMagick/ImageMagick/issues/2959).
  305. +
  306. assert failure when loading a PSD file, patch from Hanisch.
  307. +
    2020-12-09 6.9.11-47 <quetzlzacatenango@image...>
    +
  308. Release ImageMagick version 6.9.11-47 GIT revision 16151:77fc4f32d:20201209
  309. +
    2020-12-06 6.9.11-47 <quetzlzacatenango@image...>
    +
  310. use generic TIFF read method for LZW-compressed strips (reference https://github.com/ImageMagick/ImageMagick/discussions/2935).
  311. +
    2020-12-05 6.9.11-46 <quetzlzacatenango@image...>
    +
  312. Release ImageMagick version 6.9.11-46 GIT revision 16139:f0234de70:20201205
  313. +
    2020-11-30 6.9.11-46 <quetzlzacatenango@image...>
    +
  314. possible TIFF related-heap buffer overflow (alert & POC by Hardik Shah).
  315. +
  316. set default system font in policy.xml configuration file.
  317. +
    2020-11-30 6.9.11-45 <quetzlzacatenango@image...>
    +
  318. Release ImageMagick version 6.9.11-45 GIT revision 16125:85c3464d7:20201130
  319. +
    2020-11-27 6.9.11-44 <quetzlzacatenango@image...>
    +
  320. Release ImageMagick version 6.9.11-44 GIT revision 16114:2fdb8e8f7:20201127
  321. +
    2020-11-26 6.9.11-44 Dirk Lemstra <dirk@lem.....org>
    +
  322. correct reading of first row in TIFF decoder.
  323. +
    2020-11-24 6.9.11-44 <quetzlzacatenango@image...>
    +
  324. correct rotation parameter for SVG transform.
  325. +
    2020-11-23 6.9.11-43 <quetzlzacatenango@image...>
    +
  326. Release ImageMagick version 6.9.11-43 GIT revision 16093:d3ad47f10:20201123
  327. +
    2020-11-23 6.9.11-43 <quetzlzacatenango@image...>
    +
  328. add padding to AcquirePolicyString().
  329. +
    2020-11-22 6.9.11-42 <quetzlzacatenango@image...>
    +
  330. Release ImageMagick version 6.9.11-42 GIT revision 16089:ae9803730:20201122
  331. +
    2020-11-21 6.9.11-42 <quetzlzacatenango@image...>
    +
  332. restore passphrase support when rendering PDF's.
  333. +
  334. revert memory patch to avert possible thread lock.
  335. +
    2020-11-20 6.9.11-40 <quetzlzacatenango@image...>
    +
  336. Release ImageMagick version 6.9.11-40 GIT revision 16071:661c8a58a:20201120
  337. +
    2020-11-19 6.9.11-40 <quetzlzacatenango@image...>
    +
  338. remove Linux shell artifact from Windows delegate configuration file.
  339. +
  340. fix shell injection vulnerability via the -authenticate option (reference alex@cure...).
  341. +
    2020-11-17 6.9.11-39 <quetzlzacatenango@image...>
    +
  342. Release ImageMagick version 6.9.11-39 GIT revision 16053:6095d7b94:20201117
  343. +
    2020-11-07 6.9.11-39 <quetzlzacatenango@image...>
    +
  344. support DPX 4:2:2 sampling.
  345. +
    2020-11-14 6.9.11-38 <quetzlzacatenango@image...>
    +
  346. Release ImageMagick version 6.9.11-38 GIT revision 16032:cb7355b0a:20201114
  347. +
    2020-11-07 6.9.11-38 <quetzlzacatenango@image...>
    +
  348. add image settings support to -fx.
  349. +
  350. better support for TIFF YCbCr photometric.
  351. +
  352. verify TTF glyph format before dereferencing (reference https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=26932).
  353. +
  354. force single HEIC image per container.
  355. +
    2020-11-07 6.9.11-37 <quetzlzacatenango@image...>
    +
  356. Release ImageMagick version 6.9.11-37 GIT revision 16011:4d139b73c:20201107
  357. +
    2020-11-07 6.9.11-36 <quetzlzacatenango@image...>
    +
  358. Release ImageMagick version 6.9.11-36 GIT revision 16008:9f3b8ffe4:20201107
  359. +
    2020-11-02 6.9.11-36 <quetzlzacatenango@image...>
    +
  360. do not add entropy based on mkstemp() unique filename.
  361. +
    2020-10-31 6.9.11-35 <quetzlzacatenango@image...>
    +
  362. Release ImageMagick version 6.9.11-35 GIT revision 16002:56875b029:20201031.
  363. +
    2020-10-14 6.9.11-35 <quetzlzacatenango@image...>
    +
  364. prefer ffmpeg over avconv.
  365. +
    2020-10-08 6.9.11-34 <quetzlzacatenango@image...>
    +
  366. Release ImageMagick version 6.9.11-34 GIT revision 15954:c4594f039:20201008
  367. +
    2020-10-05 6.9.11-34 <quetzlzacatenango@image...>
    +
  368. check for linux-compatible sendfile().
  369. +
    2020-10-04 6.9.11-33 <quetzlzacatenango@image...>
    +
  370. Release ImageMagick version 6.9.11-33 GIT revision 15943:757c9b18e:20201004
  371. +
    2020-10-04 6.9.11-33 <quetzlzacatenango@image...>
    +
  372. miscellaneous clean-up.
  373. +
    2020-10-02 6.9.11-32 <quetzlzacatenango@image...>
    +
  374. Release ImageMagick version 6.9.11-32 GIT revision 15931:ee2342eaf:20201002
  375. +
    2020-09-27 6.9.11-32 <quetzlzacatenango@image...>
    +
  376. enable WMF for module build.
  377. +
    2020-09-26 6.9.11-31 <quetzlzacatenango@image...>
    +
  378. Release ImageMagick version 6.9.11-31 GIT revision 15914:f6814fe52:20200926
  379. +
    2020-09-20 6.9.11-31 <quetzlzacatenango@image...>
    +
  380. Add support for APNG (specify explicitly, e.g. apng:animate.png).
  381. +
  382. Add support for WEBM.
  383. +
    2020-09-17 6.9.11-30 <quetzlzacatenango@image...>
    +
  384. Release ImageMagick version 6.9.11-30 GIT revision 15904:67d1d4293:20200919
  385. +
    2020-09-07 6.9.11-30 <quetzlzacatenango@image...>
    +
  386. Add endian support to JSON coder.
  387. +
  388. Regression: MapCache type cache allocation skipped (reference https://github.com/ImageMagick/ImageMagick6/issues/97).
  389. +
  390. Some DCM images include a thumbnail (reference https://github.com/ImageMagick/ImageMagick/pull/2558).
  391. +
    2020-09-05 6.9.11-29 <quetzlzacatenango@image...>
    +
  392. Release ImageMagick version 6.9.11-29 GIT revision 15857:15b663aee:20200905.
  393. +
    2020-08-16 6.9.11-29 <quetzlzacatenango@image...>
    +
  394. Eliminate infinite loop for certain SVG styles (reference https://github.com/ImageMagick/ImageMagick6/issues/96).
  395. +
  396. Add version element to JSON file format (reference https://github.com/ImageMagick/ImageMagick6/issues/91).
  397. +
    2020-08-16 6.9.11-28 <quetzlzacatenango@image...>
    +
  398. Release ImageMagick version 6.9.11-28 GIT revision 15828:1a0a93a49:20200816
  399. +
    2020-08-16 6.9.11-28 <quetzlzacatenango@image...>
    +
  400. Distorted clip path after -extent (reference https://github.com/ImageMagick/ImageMagick/issues/2414).
  401. +
  402. Paths in Photoshop EPS files are corrupted on conversion (reference https://github.com/ImageMagick/ImageMagick/issues/2413).
  403. +
    2020-08-09 6.9.11-27 <quetzlzacatenango@image...>
    +
  404. Release ImageMagick version 6.9.11-27 GIT revision 15822:fc273882d:20200809
  405. +
    2020-08-08 6.9.11-26 <quetzlzacatenango@image...>
    +
  406. Release ImageMagick version 6.9.11-26 GIT revision 15819:515bf4e08:20200808
  407. +
    2020-08-02 6.9.11-26 <quetzlzacatenango@image...>
    +
  408. Paths in Photoshop EPS files are no longer corrupted (reference https://github.com/ImageMagick/ImageMagick/issues/2380).
  409. +
    2020-07-31 6.9.11-25 <quetzlzacatenango@image...>
    +
  410. Release ImageMagick version 6.9.11-25 GIT revision 15804:847957574:20200731
  411. +
    2020-07-13 6.9.11-25 <quetzlzacatenango@image...>
    +
  412. Remove UseCIEColor setting from PDF code as its use is not recommended
  413. +
  414. Update latest documentation.
  415. +
    2020-07-18 6.9.11-24 <quetzlzacatenango@image...>
    +
  416. Release ImageMagick version 6.9.11-24 GIT revision 15789:349d7ff34:20200718
  417. +
    2020-07-13 6.9.11-24 <quetzlzacatenango@image...>
    +
  418. Discover hidden files when globbing (e.g. *.jpg) (reference https://github.com/ImageMagick/ImageMagick/discussions/2239).
  419. +
    2020-07-03 6.9.11-23 <quetzlzacatenango@image...>
    +
  420. Release ImageMagick version 6.9.11-23 GIT revision 15762:9b6e0e045:20200704
  421. +
    2020-06-28 6.9.11-23 <quetzlzacatenango@image...>
    +
  422. Ensure that float is valid in ClampToQuantum() (reference https://github.com/ImageMagick/ImageMagick/pull/2219).
  423. +
    2020-06-26 6.9.11-22 <quetzlzacatenango@image...>
    +
  424. Release ImageMagick version 6.9.11-22 GIT revision 15744:b14dc552e:20200626
  425. +
    2020-06-24 6.9.11-22 <quetzlzacatenango@image...>
    +
  426. fix wrapping of caption (reference https://github.com/ImageMagick/ImageMagick/issues/2178).
  427. +
  428. sanity check of affine matrix when drawing.
  429. +
    2020-06-22 6.9.11-21 <quetzlzacatenango@image...>
    +
  430. Release ImageMagick version 6.9.11-21 GIT revision 15731:0eff8c6b7:20200622
  431. +
    2020-06-21 6.9.11-21 <quetzlzacatenango@image...>
    +
  432. new image property, %N, only report the # of frames in an image sequence, just once rather than on a per frame basis
  433. +
  434. problems converting CMYK to RGB regression (reference https://github.com/ImageMagick/ImageMagick6/issues/83)
  435. +
    2020-06-20 6.9.11-20 <quetzlzacatenango@image...>
    +
  436. Release ImageMagick version 6.9.11-20 GIT revision 15709:77849ee5a:20200620
  437. +
    2020-06-14 6.9.11-20 <quetzlzacatenango@image...>
    +
  438. Fix out-of-bounds vulnerability when reading sixel images (reference https://github.com/ImageMagick/ImageMagick/issues/2143).
  439. +
  440. Fix incorrect parsing of font family list (reference https://github.com/ImageMagick/ImageMagick/issues/2153).
  441. +
    2020-06-12 6.9.11-19 Cristy <quetzlzacatenango@image...>
    +
  442. Release ImageMagick version 6.9.11-19, GIT revision 15677:b26bd57:20200612
  443. +
    2020-06-09 6.9.11-19 Cristy <quetzlzacatenango@image...>
    +
  444. Improve checking for write failures (reference https://github.com/ImageMagick/ImageMagick/pull/2081).
  445. +
    2020-06-08 6.9.11-18 Cristy <quetzlzacatenango@image...>
    +
  446. Release ImageMagick version 6.9.11-18, GIT revision 15667:842c9ade8:20200608
  447. +
    2020-06-08 6.9.11-18 Cristy <quetzlzacatenango@image...>
    +
  448. Colorspace change will remove ICC profile (reference https://github.com/ImageMagick/ImageMagick6/issues/82).
  449. +
    2020-06-07 6.9.11-17 Cristy <quetzlzacatenango@image...>
    +
  450. Release ImageMagick version 6.9.11-17, GIT revision 15651:ff95d16:20200607
  451. +
    2020-06-03 6.9.11-17 Cristy <quetzlzacatenango@image...>
    +
  452. Free up memory after a ICC profile is removed.
  453. +
    2020-05-31 6.9.11-16 Cristy <quetzlzacatenango@image...>
    +
  454. Release ImageMagick version 6.9.11-16, GIT revision 15639:38d3390:20200531
  455. +
    2020-05-31 6.9.11-16 Cristy <quetzlzacatenango@image...>
    +
  456. Fix PDF XREF directory for image sequences with and without ICC profiles.
  457. +
    2020-05-26 6.9.11-15 Cristy <quetzlzacatenango@image...>
    +
  458. CCL area threshold not working correctly.
  459. +
  460. Don't write a ICC profile to PDF if the image is gray (reference https://github.com/ImageMagick/ImageMagick/issues/2070).
  461. +
    2020-05-22 6.9.11-14 Cristy <quetzlzacatenango@image...>
    +
  462. Release ImageMagick version 6.9.11-14, GIT revision 15618:471a07315:20200522
  463. +
    2020-05-22 6.9.11-14 Cristy <quetzlzacatenango@image...>
    +
  464. Errant warning when reading a profile file (reference https://github.com/ImageMagick/ImageMagick/issues/2030).
  465. +
  466. Fix one off error on PDF object for images with ICC profile.
  467. +
    2020-05-17 6.9.11-13 Cristy <quetzlzacatenango@image...>
    +
  468. Release ImageMagick version 6.9.11-13, GIT revision 15610:9445760:20200517.
  469. +
    2020-05-17 6.9.11-13 Cristy <quetzlzacatenango@image...>
    +
  470. Remove errant debugging statement in SVG coder.
  471. +
    2020-05-15 6.9.11-12 Cristy <quetzlzacatenango@image...>
    +
  472. Release ImageMagick version 6.9.11-12, GIT revision 15602:96db62d:20200515.
  473. +
    2020-05-12 6.9.11-12 Cristy <quetzlzacatenango@image...>
    +
  474. Black artifacts during quantization (reference https://github.com/ImageMagick/ImageMagick/discussions/2007#discussioncomment-13546).
  475. +
    2020-04-08 6.9.11-11 Cristy <quetzlzacatenango@image...>
    +
  476. Release ImageMagick version 6.9.11-11, GIT revision 15592:6c1c1a9:20200508
  477. +
    2020-04-28 6.9.11-11 Cristy <quetzlzacatenango@image...>
    +
  478. Disable "random" OpenCL kernel. Previously the work load was distributed but each started with the same random seed.
  479. +
  480. Enable threaded PNG coder.
  481. +
    2020-04-27 6.9.11-10 Cristy <quetzlzacatenango@image...>
    +
  482. Release ImageMagick version 6.9.11-10, GIT revision 15574:867252a:20200427
  483. +
    2020-04-27 6.9.11-10 Cristy <quetzlzacatenango@image...>
    +
  484. Correction to allocate a colormap of the maximum colors when color reducing an image sequence.
  485. +
  486. Write to stdout for mp4:-.
  487. +
    2020-04-26 6.9.11-9 Cristy <quetzlzacatenango@image...>
    +
  488. Release ImageMagick version 6.9.11-9, GIT revision 15563:7e4286f:20200426.
  489. +
    2020-04-25 6.9.11-9 Cristy <quetzlzacatenango@image...>
    +
  490. Allocate a colormap of the maximum colors when color reducing an image sequence.
  491. +
  492. Label was not centered properly (reference https://github.com/ImageMagick/ImageMagick/issues/1879).
  493. +
    2020-04-24 6.9.11-8 Cristy <quetzlzacatenango@image...>
    +
  494. Release ImageMagick version 6.9.11-8, GIT revision 15554:1ab590d:20200424.
  495. +
    2020-04-23 6.9.11-8 Cristy <quetzlzacatenango@image...>
    +
  496. Some configure --with-method-prefix methods were missing (reference https://github.com/ImageMagick/ImageMagick/issues/1912).
  497. +
    2020-04-20 6.9.11-7 Cristy <quetzlzacatenango@image...>
    +
  498. Release ImageMagick version 6.9.11-7, GIT revision 15549:7b11069:20200420.
  499. +
    2020-04-07 6.9.11-7 Cristy <quetzlzacatenango@image...>
    +
  500. Fix erroneous "insufficient image data" exception (reference https://github.com/ImageMagick/ImageMagick/issues/1883).
  501. +
  502. Fix an unconditional jump for the XPM coder (reference https://github.com/ImageMagick/ImageMagick/issues/1895).
  503. +
    2020-04-06 6.9.11-6 Cristy <quetzlzacatenango@image...>
    +
  504. Release ImageMagick version 6.9.11-6, GIT revision 15539:e9e105c:20200406.
  505. +
    2020-04-06 6.9.11-6 Cristy <quetzlzacatenango@image...>
    +
  506. Fix incomplete patch for EPT coder (reference https://github.com/ImageMagick/ImageMagick6/issues/80).
  507. +
    2020-04-05 6.9.11-5 Cristy <quetzlzacatenango@image...>
    +
  508. Release ImageMagick version 6.9.11-5, GIT revision 15536:3689bed3a:20200405
  509. +
    2020-04-05 6.9.11-5 Cristy <quetzlzacatenango@image...>
    +
  510. Default inkscape delegate to version 0.92 (reference https://github.com/ImageMagick/ImageMagick/discussions/1880).
  511. +
  512. Set monochrome image depth to 1 for Group4 compression.
  513. +
    2020-04-05 6.9.11-4 Cristy <quetzlzacatenango@image...>
    +
  514. Release ImageMagick version 6.9.11-4, GIT revision 15531:5fc7a9f:20200405.
  515. +
    2020-03-27 6.9.11-4 Cristy <quetzlzacatenango@image...>
    +
  516. The X max attribute for certain fonts is zero (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=37723).
  517. +
  518. Fix possible null pointer dereference in magick/property.c (reference https://github.com/ImageMagick/ImageMagick/issues/1225).
  519. +
  520. Multi-value of jp2:quality does not work (reference https://github.com/ImageMagick/ImageMagick/issues/1873).
  521. +
  522. Return EPS & TIFF images from the EPT image format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=37781).
  523. +
    2020-03-27 6.9.11-3 Cristy <quetzlzacatenango@image...>
    +
  524. Release ImageMagick version 6.9.11-3, GIT revision 15511:23bb003:20200327.
  525. +
    2020-03-22 6.9.11-3 Cristy <quetzlzacatenango@image...>
    +
  526. Fix numerical instability issue when drawing lines.
  527. +
  528. Fix off by one exception when calling QuantumImages() (reference https://github.com/ImageMagick/ImageMagick6/issues/77).
  529. +
  530. Improve mono font rendering (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=37723).
  531. +
    2020-03-21 6.9.11-2 Cristy <quetzlzacatenango@image...>
    +
  532. Release ImageMagick version 6.9.11-2, GIT revision 15500:698c610:20200321
  533. +
    2020-03-16 6.9.11-2 Cristy <quetzlzacatenango@image...>
    +
  534. Fixed another sizing issue with the label coder when pointsize is set.
  535. +
  536. Respect explicit image filename modified (e.g. png24:im.png) (reference https://github.com/ImageMagick/ImageMagick/issues/1835).
  537. +
  538. Stroked dash array render properly again.
  539. +
    2020-03-15 6.9.11-1 Cristy <quetzlzacatenango@image...>
    +
  540. Release ImageMagick version 6.9.11-1, GIT revision 15487:ffac3c4:20200315.
  541. +
    2020-03-07 6.9.11-1 Cristy <quetzlzacatenango@image...>
    +
  542. Do not throw exception on empty draw path (reference https://github.com/ImageMagick/ImageMagick/issues/974).
  543. +
  544. Fix possible buffer overflow in ComplexImages().
  545. +
    2020-03-06 6.9.11-0 Cristy <quetzlzacatenango@image...>
    +
  546. Release ImageMagick version 6.9.11-0, GIT revision 15465:f7c926d:20200306.
  547. +
    2020-03-01 6.9.11-0 Cristy <quetzlzacatenango@image...>
    +
  548. Label text no longer gets cut-off (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=37621).
  549. +
  550. Prevent heap overflow (reference https://github.com/ImageMagick/ImageMagick/issues/1857).
  551. +
    2020-02-29 6.9.10-97 Cristy <quetzlzacatenango@image...>
    +
  552. Release ImageMagick version 6.9.10-97, GIT revision 15453:0537c847b:20200229
  553. +
    2020-02-24 6.9.10-97 Cristy <quetzlzacatenango@image...>
    +
  554. Make sure we can grok this Fx expression: 1- -2.
  555. +
  556. Do not advance when substituting a NULL string.
  557. +
  558. Correct alpha for named colors in the Q32 non-HDRI build.
  559. +
  560. Write Group4 compressed image as a single strip.
  561. +
    2020-02-23 6.9.10-96 Cristy <quetzlzacatenango@image...>
    +
  562. Release ImageMagick version 6.9.10-96, GIT revision 15438:2ef65d48e:20200223
  563. +
    2020-02-22 6.9.10-96 Cristy <quetzlzacatenango@image...>
    +
  564. Adapt to a change in command-line options in the SVG inkscape delegate.
  565. +
    2020-02-21 6.9.10-95 Cristy <quetzlzacatenango@image...>
    +
  566. No percent sign in lab() color.
  567. +
    2020-02-18 6.9.10-95 Cristy <quetzlzacatenango@image...>
    +
  568. Adapt to a change in command-line options in the SVG inkscape delegate.
  569. +
    2020-02-16 6.9.10-94 Cristy <quetzlzacatenango@image...>
    +
  570. Release ImageMagick version 6.9.10-94, GIT revision 15405:56d9955fc:20200217
  571. +
    2020-02-16 6.9.10-94 Cristy <quetzlzacatenango@image...>
    +
  572. Corrected ellipse orientation when computing image moments.
  573. +
    2020-02-14 6.9.10-93 Cristy <quetzlzacatenango@image...>
    +
  574. Release ImageMagick version 6.9.10-93, GIT revision 15386:2d96228:20200214
  575. +
    2020-02-08 6.9.10-93 Cristy <quetzlzacatenango@image...>
    +
  576. Report gray(127.5) as gray(50%).
  577. +
    2020-02-07 6.9.10-92 Cristy <quetzlzacatenango@image...>
    +
  578. Release ImageMagick version 6.9.10-92, GIT revision 15374:d468797:20200207
  579. +
    2020-02-03 6.9.10-92 Cristy <quetzlzacatenango@image...>
    +
  580. More work on connect components, e.g. keep-colors, remove-colors, keep-topids
  581. +
  582. Initialize mutex before locking if its not already initialized
  583. +
  584. Support 24-bit TIFF images.
  585. +
    2020-02-01 6.9.10-91 Cristy <quetzlzacatenango@image...>
    +
  586. Release ImageMagick version 6.9.10-91, GIT revision 15346:4691fe1:20200201.
  587. +
    2020-01-27 6.9.10-91 Cristy <quetzlzacatenango@image...>
    +
  588. Support additional connected component defines.
  589. +
  590. Refresh cache morphology when writing MPC images.
  591. +
    2020-01-26 6.9.10-89 Cristy <quetzlzacatenango@image...>
    +
  592. Release ImageMagick version 6.9.10-89, GIT revision 15318:2b12203:20200126
  593. +
    2020-01-26 6.9.10-89 Cristy <quetzlzacatenango@image...>
    +
  594. Make png creation reproducible (reference https://github.com/ImageMagick/ImageMagick/pull/1270).
  595. +
  596. Refactor uninitialize variable for -fx "while(,)" expression.
  597. +
    2020-01-25 6.9.10-88 Cristy <quetzlzacatenango@image...>
    +
  598. Release ImageMagick version 6.9.10-88, GIT revision 15309:a3d1b6f:20200125
  599. +
    2020-01-20 6.9.10-88 Cristy <quetzlzacatenango@image...>
    +
  600. Support 32-bit tiles TIFF images.
  601. +
  602. New -connected-component options (reference https://legacy.imagemagick.org/www/connected-components.html).
  603. +
    2020-01-18 6.9.10-87 Cristy <quetzlzacatenango@image...>
    +
  604. Release ImageMagick version 6.9.10-87, GIT revision 15285:f6ba467:20200118
  605. +
    2020-01-12 6.9.10-87 Cristy <quetzlzacatenango@image...>
    +
  606. Conditional compile for huge xml pages for RSVG delegate library.
  607. +
  608. Put "width" property in the PNG namespace (reference https://github.com/ImageMagick/ImageMagick/issues/1833).
  609. +
  610. -combine -colorspace sRGB no longer returns grayscale output (reference https://github.com/ImageMagick/ImageMagick/issues/1835).
  611. +
    2020-01-12 6.9.10-86 Cristy <quetzlzacatenango@image...>
    +
  612. Release ImageMagick version 6.9.10-86, GIT revision 15260:0667659:20200112.
  613. +
    2020-01-12 6.9.10-86 Cristy <quetzlzacatenango@image...>
    +
  614. Fixed three failing Magick.NET unit tests.
  615. +
    2020-01-11 6.9.10-85 Cristy <quetzlzacatenango@image...>
    +
  616. Release ImageMagick version 6.9.10-85, GIT revision 15253:1fdc999:20200111.
  617. +
    2020-01-11 6.9.10-85 Dirk Lemstra <dirk@lem.....org>
    +
  618. Also support svg:xml-parse-huge when using librsvg.
  619. +
    2020-01-07 6.9.10-85 Cristy <quetzlzacatenango@image...>
    +
  620. Support Fx do() iterator.
  621. +
  622. `magick -size 100x100 xc:black black.pnm` no longer creates a white image (reference https://github.com/ImageMagick/ImageMagick/issues/1817).
  623. +
  624. setjmp/longjmp in jpeg.c no longer trigger undefind behavior (reference
    https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=37379).
    +
  625. Permit compositing in the CMYK colorspace (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=37368).
  626. +
    2020-01-04 6.9.10-84 Cristy <quetzlzacatenango@image...>
    +
  627. Release ImageMagick version 6.9.10-84, GIT revision 15212:a45335c:20200104.
  628. +
    2020-01-01 6.9.10-84 Cristy <quetzlzacatenango@image...>
    +
  629. Support extended Fx assignment operators (e.g. *=, /=, ++, --, etc.)
  630. +
  631. Support Fx for() iterator.
    * Optimize Fx performance.
    +
  632. * Ensure circle.rb renders the same for IMv6 and IMv7 (reference https://github.com/rmagick/rmagick/issues/905).
  633. +
    2019-12-30 6.9.10-83 Cristy <quetzlzacatenango@image...>
    +
  634. Release ImageMagick version 6.9.10-83, GIT revision 15184:9f64323:20191230.
  635. +
    2019-12-28 6.9.10-83 Cristy <quetzlzacatenango@image...>
    +
  636. PSD: only set the alpha channel when type is not 0.
  637. +
  638. Fix Lab to custom profile (CMYK or RGB) conversion bug (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=37318).
  639. +
    2019-12-27 6.9.10-82 Cristy <quetzlzacatenango@image...>
    +
  640. Release ImageMagick version 6.9.10-82, GIT revision 15167:12b7f07:20191226.
  641. +
    2019-12-26 6.9.10-82 Cristy <quetzlzacatenango@image...>
    +
  642. Fix Build failure with MinGW-w64 (reference https://github.com/ImageMagick/ImageMagick6/issues/67).
  643. +
  644. Inject image profile properties immediately after the image is read.
  645. +
    2019-12-24 6.9.10-81 Cristy <quetzlzacatenango@image...>
    +
  646. Release ImageMagick version 6.9.10-81, GIT revision 15151:1444366:20191224.
  647. +
    2019-12-18 6.9.10-81 Cristy <quetzlzacatenango@image...>
    +
  648. Replace pseudo-random number generator with a Xoshiro generator.
  649. +
  650. Define MagickAddressType (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=3729).
  651. +
    2019-12-22 6.9.10-80 Cristy <quetzlzacatenango@image...>
    +
  652. Release ImageMagick version 6.9.10-80, GIT revision 15135:8aa94ec27:20191222
  653. +
    2019-12-18 6.9.10-80 Cristy <quetzlzacatenango@image...>
    +
  654. Some clang Releases do not support _aligned_alloc().
  655. +
    2019-12-07 6.9.10-79 Cristy <quetzlzacatenango@image...>
    +
  656. Release ImageMagick version 6.9.10-79, GIT revision 15127:fa10678:20191215.
  657. +
    2019-12-07 6.9.10-79 Cristy <quetzlzacatenango@image...>
    +
  658. Build file clean-up (reference https://github.com/ImageMagick/ImageMagick/pull/1798).
  659. +
  660. Improve semaphore handling @ https://github.com/ImageMagick/ImageMagick/pull/1798).
  661. +
  662. Introduce HeapOverflowSanityCheckGetExtent() method (reference https://github.com/ImageMagick/ImageMagick/pull/1798).
  663. +
    2019-12-01 6.9.10-78 Cristy <quetzlzacatenango@image...>
    +
  664. Release ImageMagick version 6.9.10-78, GIT revision 15097:0136438:20191207.
  665. +
    2019-12-01 6.9.10-78 Cristy <quetzlzacatenango@image...>
    +
  666. -type bilevel behavior restored, it creates a black and white image.
  667. +
    2019-11-29 6.9.10-77 Cristy <quetzlzacatenango@image...>
    +
  668. Release ImageMagick version 6.9.10-77, GIT revision 15087:5e6be1a:20191129.
  669. +
    2019-11-26 6.9.10-77 Cristy <quetzlzacatenango@image...>
    +
  670. Support Pocketmod image format, e.g. convert -density 300 pages?.pdf pocketmod:organize.pdf
  671. +
  672. Fixed numerous issues posted to GitHub (reference https://github.com/ImageMagick/ImageMagick/issues).
  673. +
  674. Update documentation.
  675. + https://github.com/ImageMagick/ImageMagick/issues/1784).
    2019-11-26 6.9.10-75 Cristy <quetzlzacatenango@image...>
    +
  676. Release ImageMagick version 6.9.10-75, GIT revision 15062:f23c75e:20191126.
  677. +
    2019-11-19 6.9.10-75 Cristy <quetzlzacatenango@image...>
    +
  678. Increase the maximum number of bezier coordinates (reference https://github.com/ImageMagick/ImageMagick/issues/1784).
  679. +
  680. Santize "'" from SHOW and WIN delegates under Linux, '"\' for Windows (thanks to Enzo Puig).
  681. +
  682. Correct for TGA orientation (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=34757).
  683. +
  684. The result for -compose Copy -extent on a CMYK image is CMYK (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=37118).
  685. +
  686. Fix potential buffer overflow when reading a fax image (alert from Justin).
  687. +
  688. Support dng:use-camera-wb option.
  689. +
    2019-11-17 6.9.10-74 Cristy <quetzlzacatenango@image...>
    +
  690. Release ImageMagick version 6.9.10-74, GIT revision 15030:6efa1b6:20191117.
  691. +
    2019-11-16 6.9.10-74 Cristy <quetzlzacatenango@image...>
    +
  692. Ensure Ascii85 compression is thread safe.
  693. +
  694. Fixed numerous issues posted to GitHub (reference https://github.com/ImageMagick/ImageMagick/issues).
  695. +
    2019-11-14 6.9.10-73 Cristy <quetzlzacatenango@image...>
    +
  696. Release ImageMagick version 6.9.10-73, GIT revision 15014:bcb2b51:20191114.
  697. +
    2019-11-14 6.9.10-73 Cristy <quetzlzacatenango@image...>
    +
  698. HP's ANSI C/C++ compiler does not support strcasestr().
  699. +
    2019-11-13 6.9.10-72 Cristy <quetzlzacatenango@image...>
    +
  700. Release ImageMagick version 6.9.10-72, GIT revision 15011:4cf3857:20191113.
  701. +
    2019-11-10 6.9.10-72 Cristy <quetzlzacatenango@image...>
    +
  702. Output exception there is an attempt to perform an operation not allowed by the security policy
  703. +
  704. Fixed numerous issues posted to GitHub (reference https://github.com/ImageMagick/ImageMagick/issues).
  705. +
    2019-10-30 6.9.10-71 Cristy <quetzlzacatenango@image...>
    +
  706. Release ImageMagick version 6.9.10-71, GIT revision 14989:8da75bd:20191030.
  707. +
    2019-10-29 6.9.10-71 Cristy <quetzlzacatenango@image...>
    +
  708. JPEG and JPG are aliases in coder security policy.
  709. +
  710. Fixed numerous issues posted to GitHub (reference https://github.com/ImageMagick/ImageMagick/issues).
  711. +
    2019-10-27 6.9.10-70 Cristy <quetzlzacatenango@image...>
    +
  712. Release ImageMagick version 6.9.10-70, GIT revision 14970:4200095:20191027.
  713. +
    2019-10-27 6.9.10-70 Cristy <quetzlzacatenango@image...>
    +
  714. Fixed numerous issues posted to GitHub (reference https://github.com/ImageMagick/ImageMagick/issues).
    2019-10-27 6.9.10-70 Cristy <quetzlzacatenango@image...>
    +
  715. Release ImageMagick version 6.9.10-70, GIT revision 14970:4200095:20191027.
  716. +
    2019-10-27 6.9.10-70 Cristy <quetzlzacatenango@image...>
    +
  717. Fixed numerous issues posted to GitHub (reference https://github.com/ImageMagick/ImageMagick/issues).
  718. +
    2019-10-24 6.9.10-69 Cristy <quetzlzacatenango@image...>
    +
  719. Release ImageMagick version 6.9.10-69, GIT revision 14962:03a9bac:20191024
  720. +
    2019-10-06 6.9.10-69 Cristy <quetzlzacatenango@image...>
    +
  721. Fixed numerous issues posted to GitHub (reference https://github.com/ImageMagick/ImageMagick/issues).
  722. +
  723. Support trim:background-color define for -trim option
  724. +
    2019-10-05 6.9.10-68 Cristy <quetzlzacatenango@image...>
    +
  725. Release ImageMagick version 6.9.10-68, GIT revision 14874:eb58b7e:20191005.
  726. +
    2019-09-30 6.9.10-68 Cristy <quetzlzacatenango@image...>
    +
  727. Support animated WebP encoding/decoding (reference https://github.com/ImageMagick/ImageMagick/pull/1708).
  728. +
  729. Text stroke cut off (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=36829).
  730. +
    2019-09-29 6.9.10-67 Cristy <quetzlzacatenango@image...>
    +
  731. Release ImageMagick version 6.9.10-67, GIT revision 14844:2a2c1b1:20190929.
  732. +
    2019-09-28 6.9.10-67 Cristy <quetzlzacatenango@image...>
    +
  733. line endings renedered as empty boxes (reference https://github.com/ImageMagick/ImageMagick/issues/1704).
  734. +
    2019-09-21 6.9.10-66 Cristy <quetzlzacatenango@image...>
    +
  735. Release ImageMagick version 6.9.10-66, GIT revision 14834:9b20f2e:20190921.
  736. +
    2019-09-20 6.9.10-66 Cristy <quetzlzacatenango@image...>
    +
  737. Support compound statements in the FX while() expression (reference https://github.com/ImageMagick/ImageMagick/issues/1701).
  738. +
    2019-09-14 6.9.10-65 Cristy <quetzlzacatenango@image...>
    +
  739. Release ImageMagick version 6.9.10-65, GIT revision 14829:1a6dc73:20190915/
  740. +
    2019-09-09 6.9.10-65 Cristy <quetzlzacatenango@image...>
    +
  741. Eliminate fault when trace delegate is not available.
  742. +
  743. Properly distinquish linear and non-linear gray colorspaces (reference https://github.com/ImageMagick/ImageMagick/issues/1680).
  744. +
    2019-09-07 6.9.10-64 Cristy <quetzlzacatenango@image...>
    +
  745. Release ImageMagick version 6.9.10-64, GIT revision 14812:b27c543:20190907.
  746. +
    2019-09-02 6.9.10-64 Cristy <quetzlzacatenango@image...>
    +
  747. Support XPM symbolic (reference https://github.com/ImageMagick/ImageMagick/issues/1684).
  748. +
    2019-08-31 6.9.10-63 Cristy <quetzlzacatenango@image...>
    +
  749. Release ImageMagick version 6.9.10-63, GIT revision 14796:9b9fba4:20190831.
  750. +
    2019-08-24 6.9.10-63 Cristy <quetzlzacatenango@image...>
    +
  751. Properly identify the DNG and AI image format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=36581).
  752. +
    2019-08-23 6.9.10-62 Cristy <quetzlzacatenango@image...>
    +
  753. Release ImageMagick version 6.9.10-62, GIT revision 14779:2da539a:20190823.
  754. +
    2019-08-19 6.9.10-62 Cristy <quetzlzacatenango@image...>
    +
  755. Conditionally compile call to AcquireCLocale() (reference https://github.com/ImageMagick/ImageMagick/issues/1669).
  756. +
  757. More robust support for converting bitmap to vector.
  758. +
    2019-08-16 6.9.10-61 Cristy <quetzlzacatenango@image...>
    +
  759. Release ImageMagick version 6.9.10-61, GIT revision 14757:36133aa:20190816.
  760. +
    2019-08-12 6.9.10-61 Cristy <quetzlzacatenango@image...>
    +
  761. Fixed bug when writing MPC to PNG (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=36518).
  762. +
    2019-08-10 6.9.10-60 Cristy <quetzlzacatenango@image...>
    +
  763. Release ImageMagick version 6.9.10-60, GIT revision 14745:ce6bac3:20190810.
  764. +
    2019-08-07 6.9.10-60 Cristy <quetzlzacatenango@image...>
    +
  765. Enable reading EXR image file from stdin.
  766. +
    2019-08-03 6.9.10-59 Cristy <quetzlzacatenango@image...>
    +
  767. Release ImageMagick version 6.9.10-59, GIT revision 14730:b2d457b:20190803.
  768. +
    2019-08-01 6.9.10-59 Cristy <quetzlzacatenango@image...>
    +
  769. Module is a reserved keyword for C++ 20 (reference https://github.com/ImageMagick/ImageMagick/issues/1650).
  770. +
    2019-07-29 6.9.10-58 Cristy <quetzlzacatenango@image...>
    +
  771. Release ImageMagick version 6.9.10-58, GIT revision 14723:fffbce8:20190729.
  772. +
    2019-07-27 6.9.10-58 Cristy <quetzlzacatenango@image...>
    +
  773. Improve GetNextToken() performance.
  774. +
    2019-07-26 6.9.10-57 Cristy <quetzlzacatenango@image...>
    +
  775. Release ImageMagick version 6.9.10-57, GIT revision 14712:94d15b7:20190726.
  776. +
    2019-07-22 6.9.10-57 Cristy <quetzlzacatenango@image...>
    +
  777. Heap-buffer-overflow in Postscript coder (reference https://github.com/ImageMagick/ImageMagick/issues/1644).
  778. +
  779. Correction to the ModulusAdd and ModulusSubtract composite op (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=36413).
  780. +
    2019-07-20 6.9.10-56 Cristy <quetzlzacatenango@image...>
    +
  781. Release ImageMagick version 6.9.10-56, GIT revision 14704:d0be203:20190720.
  782. +
    2019-07-20 6.9.10-56 Cristy <quetzlzacatenango@image...>
    +
  783. Converting from PDF to PBM inverts the image (reference https://github.com/ImageMagick/ImageMagick/issues/1643).
  784. +
    2019-07-18 6.9.10-55 Cristy <quetzlzacatenango@image...>
    +
  785. Release ImageMagick version 6.9.10-55, GIT revision 14700:faac202:20190718.
  786. +
    2019-07-08 6.9.10-55 Cristy <quetzlzacatenango@image...>
    +
  787. Heap-buffer overflow (reference https://github.com/ImageMagick/ImageMagick/issues/1641).
  788. +
  789. PerlMagick test suite passes again (reference https://github.com/ImageMagick/ImageMagick/issues/1640).
  790. +
    2019-07-16 6.9.10-54 Cristy <quetzlzacatenango@image...>
    +
  791. Release ImageMagick version 6.9.10-54, GIT revision 14684:41399a3:20190716
  792. +
    2019-07-08 6.9.10-54 Cristy <quetzlzacatenango@image...>
    +
  793. Avoid divide by zero (reference https://github.com/ImageMagick/ImageMagick/issues/1629).
  794. +
  795. introducing MagickLevelImageColors() MagickWand method.
  796. +
  797. Transient problem with text placement with gravity (reference https://github.com/ImageMagick/ImageMagick/issues/1633).
  798. +
    2019-07-05 6.9.10-53 Cristy <quetzlzacatenango@image...>
    +
  799. Release ImageMagick version 6.9.10-53, GIT revision 14625:70fb1c6:20190705.
  800. +
    2019-07-05 6.9.10-53 Cristy <quetzlzacatenango@image...>
    +
  801. Coder heic.c build failure (reference https://github.com/ImageMagick/ImageMagick6/issues/50).
  802. +
    2019-07-05 6.9.10-52 Cristy <quetzlzacatenango@image...>
    +
  803. Release ImageMagick version 6.9.10-52, GIT revision 14623:672ff6a:20190705.
  804. +
    2019-07-01 6.9.10-52 Cristy <quetzlzacatenango@image...>
    +
  805. Eliminate buffer overflow in TranslateEvent() (reference https://github.com/ImageMagick/ImageMagick/issues/1621).
  806. +
  807. Fix -fx parsing issue (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=36314).
  808. +
    2019-06-30 6.9.10-51 Cristy <quetzlzacatenango@image...>
    +
  809. Release ImageMagick version 6.9.10-51, GIT revision 14607:cec35fb:20190630.
  810. +
    2019-06-24 6.9.10-51 Cristy <quetzlzacatenango@image...>
    +
  811. Clone rather than copy X window name/icon.
  812. +
  813. Optimize PDF reader.
  814. +
    2019-06-23 6.9.10-50 Cristy <quetzlzacatenango@image...>
    +
  815. Release ImageMagick version 6.9.10-50, GIT revision 14583:598f03b:20190623
  816. +
    2019-06-16 6.9.10-50 Cristy <quetzlzacatenango@image...>
    +
  817. Heap-buffer-overflow in MagickCore/fourier.c (reference https://github.com/ImageMagick/ImageMagick/issues/1588).
  818. +
  819. Fixed a number of issues (reference https://imagemagick.org/discourse-server//viewforum.html?f=3).
  820. +
  821. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  822. +
    2019-06-08 6.9.10-49 Cristy <quetzlzacatenango@image...>
    +
  823. Release ImageMagick version 6.9.10-49, GIT revision 14530:19dcf6f:20190608
  824. +
    2019-06-04 6.9.10-49 Cristy <quetzlzacatenango@image...>
    +
  825. Use user defined allocator instead of `malloc` (reference https://github.com/ImageMagick/ImageMagick6/pull/49/).
  826. +
  827. Add static decorator to accelerator kernels (reference https://github.com/ImageMagick/ImageMagick/issues/1366).
  828. +
    2019-05-26 6.9.10-47 Cristy <quetzlzacatenango@image...>
    +
  829. Release ImageMagick version 6.9.10-47, GIT revision 14507:321f99ca6:20190526
  830. +
    2019-05-19 6.9.10-47 Cristy <quetzlzacatenango@image...>
    +
  831. Support 16 and 32 bit tiled float TIFF images.
  832. +
  833. Text improvements to the internal SVG renderer.
  834. +
    2019-05-14 6.9.10-46 Cristy <quetzlzacatenango@image...>
    +
  835. Release ImageMagick version 6.9.10-46, GIT revision 14492:fb2f64950:20190518
  836. +
    2019-05-14 6.9.10-46 Cristy <quetzlzacatenango@image...>
    +
  837. Builds under MacOS X and FreeBSD works again.
  838. +
  839. Return HEIC images in the sRGB colorspace.
  840. +
    2019-05-12 6.9.10-45 Cristy <quetzlzacatenango@image...>
    +
  841. Release ImageMagick version 6.9.10-45, GIT revision 14473:2116be83b:20190512
  842. +
    2019-05-06 6.9.10-45 Cristy <quetzlzacatenango@image...>
    +
  843. Fixed a number of issues (reference https://imagemagick.org/discourse-server//viewforum.html?f=3).
  844. +
  845. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  846. +
    2019-05-03 6.9.10-44 Cristy <quetzlzacatenango@image...>
    +
  847. Release ImageMagick version 6.9.10-44, GIT revision 14449:d077c2e58:20190503
  848. +
    2019-05-03 6.9.10-44 Cristy <quetzlzacatenango@image...>
    +
  849. Fixed a number of issues (reference https://imagemagick.org/discourse-server//viewforum.html?f=3).
  850. +
  851. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  852. +
    2019-05-01 6.9.10-43 Cristy <quetzlzacatenango@image...>
    +
  853. Release ImageMagick version 6.9.10-43, GIT revision 14444:1580c66ba:20190502
  854. +
    2019-05-01 6.9.10-43 Cristy <quetzlzacatenango@image...>
    +
  855. Fixed a number of issues (reference https://imagemagick.org/discourse-server//viewforum.html?f=3).
  856. +
  857. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  858. +
    2019-04-29 6.9.10-42 Cristy <quetzlzacatenango@image...>
    +
  859. Release ImageMagick version 6.9.10-42, GIT revision 14417:929367bd1:20190424
  860. +
    2019-04-20 6.9.10-42 Cristy <quetzlzacatenango@image...>
    +
  861. Fixed a number of issues (reference https://imagemagick.org/discourse-server//viewforum.html?f=3).
  862. +
  863. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  864. +
    2019-04-19 6.9.10-41 Cristy <quetzlzacatenango@image...>
    +
  865. Release ImageMagick version 6.9.10-41, GIT revision 14390:6d46f0a04:20190420
  866. +
    2019-04-14 6.9.10-41 Cristy <quetzlzacatenango@image...>
    +
  867. Fixed a number of issues (reference https://imagemagick.org/discourse-server//viewforum.html?f=3).
  868. +
  869. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  870. +
  871. Honor SOURCE_DATE_EPOCH environment variable (reference https://github.com/ImageMagick/ImageMagick/pull/1496/).
  872. +
  873. Standardize on UTC time for any image format timestamp.
  874. +
    2019-04-12 6.9.10-40 Cristy <quetzlzacatenango@image...>
    +
  875. Release ImageMagick version 6.9.10-40, GIT revision 14362:7e503e231:20190412
  876. +
    2019-04-10 6.9.10-40 Cristy <quetzlzacatenango@image...>
    +
  877. Fixed a number of issues (reference https://imagemagick.org/discourse-server//viewforum.html?f=3).
  878. +
  879. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  880. +
    2019-04-07 6.9.10-39 Cristy <quetzlzacatenango@image...>
    +
  881. Release ImageMagick version 6.9.10-39, GIT revision 14346:6b5a9cc87:20190406
  882. +
    2019-04-06 6.9.10-39 Cristy <quetzlzacatenango@image...>
    +
  883. The -preview raise option now returns expected results.
  884. +
  885. Initialise ghostscript instances with NULL (reference https://github.com/ImageMagick/ImageMagick/pull/1538).
  886. +
    2019-04-06 6.9.10-38 Cristy <quetzlzacatenango@image...>
    +
  887. Release ImageMagick version 6.9.10-38, GIT revision 14341:09f7569e8:20190406
  888. +
    2019-04-06 6.0.10-38 Cristy <quetzlzacatenango@image...>
    +
  889. Modulo off by one patch for -virtual-pixel option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=35789)
  890. +
    2019-04-03 6.9.10-37 Cristy <quetzlzacatenango@image...>
    +
  891. Release ImageMagick version 6.9.10-37, GIT revision 14329:0dc57c67b:20190403
  892. +
    2019-04-03 6.0.10-37 Cristy <quetzlzacatenango@image...>
    +
  893. Fixed -virtual-pixel option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=35789)
  894. +
    2019-03-31 6.9.10-36 Cristy <quetzlzacatenango@image...>
    +
  895. Release ImageMagick version 6.9.10-36, GIT revision 14321:3b6ba12f4:20190331
  896. +
    2019-03-27 6.9.10-36 Cristy <quetzlzacatenango@image...>
    +
  897. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  898. +
    2019-03-24 6.9.10-35 Cristy <quetzlzacatenango@image...>
    +
  899. Release ImageMagick version 6.9.10-35, GIT revision 14298:633d5a989:20190324
  900. +
    2019-03-23 6.9.10-35 Cristy <quetzlzacatenango@image...>
    +
  901. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  902. +
    2019-03-15 6.9.10-34 Cristy <quetzlzacatenango@image...>
    +
  903. Release ImageMagick version 6.9.10-34, GIT revision 14276:b0b2799a2:20190315
  904. +
    2019-03-11 6.9.10-34 Cristy <quetzlzacatenango@image...>
    +
  905. Associate one lock with each resource.
  906. +
  907. Report exception if opening TIFF did not work ou.
  908. +
  909. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  910. +
    2019-03-10 6.9.10-33 Cristy <quetzlzacatenango@image...>
    +
  911. Release ImageMagick version 6.9.10-33, GIT revision 14266:fb9c848b1:20190310
  912. +
    2019-03-06 6.9.10-33 Cristy <quetzlzacatenango@image...>
    +
  913. Fix SVG conversion infinite loop (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=35591).
  914. +
  915. Initialize primitive drawing structure after resizing.
  916. +
    2019-03-05 6.9.10-32 Cristy <quetzlzacatenango@image...>
    +
  917. Release ImageMagick version 6.9.10-32, GIT revision 14250:4d956d2ac:20190305
  918. +
    2019-03-05 6.9.10-32 Cristy <quetzlzacatenango@image...>
    +
  919. Fix out-of-boundary LocaleLowerCase() @ https://github.com/ImageMagick/ImageMagick/issues/1495
  920. +
    2019-03-04 6.9.10-31 Cristy <quetzlzacatenango@image...>
    +
  921. Release ImageMagick version 6.9.10-31, GIT revision 14246:6de0b115c:20190304
  922. +
    2019-03-04 6.9.10-31 Cristy <quetzlzacatenango@image...>
    +
  923. -trim is no longer sensitive to the image virtual canvas.
  924. +
    2019-03-03 6.9.10-30 Cristy <quetzlzacatenango@image...>
    +
  925. Release ImageMagick version 6.9.10-30, GIT revision 14240:d62e5fd8b:20190303
  926. +
    2019-03-03 6.9.10-30 Cristy <quetzlzacatenango@image...>
    +
  927. Support define to remove additional background from an image during a trim, e.g. -fuzz 5% -define trim:percent-background=0% -trim.
  928. +
    2019-02-28 6.9.10-29 Cristy <quetzlzacatenango@image...>
    +
  929. Release ImageMagick version 6.9.10-29, GIT revision 14235:eee85cacc:20190228
  930. +
    2019-02-28 6.9.10-29 Cristy <quetzlzacatenango@image...>
    +
  931. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  932. +
  933. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  934. +
    2019-02-18 6.9.10-28 Cristy <quetzlzacatenango@image...>
    +
  935. Release ImageMagick version 6.9.10-28, GIT revision 14227:580d9f9a6:20190218
  936. +
    2019-02-12 6.9.10-28 Cristy <quetzlzacatenango@image...>
    +
  937. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  938. +
    2019-02-09 6.9.10-27 Cristy <quetzlzacatenango@image...>
    +
  939. Release ImageMagick version 6.9.10-27, GIT revision 14197:4e00248f4:20190209
  940. +
    2019-02-09 6.9.10-27 Cristy <quetzlzacatenango@image...>
    +
  941. Mod patch to properly handle subimage ranges (e.g. image.gif[2-3]).
  942. +
    2019-02-03 6.9.10-27 Cristy <quetzlzacatenango@image...>
    +
  943. Release ImageMagick version 6.9.10-27, GIT revision 14180:153da6bd6:20190203
  944. +
    2019-02-02 6.9.10-26 Cristy <quetzlzacatenango@image...>
    +
  945. Fixed a number of issues (reference https://github.com/ImageMagick/ImageMagick/issues).
  946. +
    2019-01-27 6.9.10-25 Cristy <quetzlzacatenango@image...>
    +
  947. Release ImageMagick version 6.9.10-25, GIT revision 14167:183ec9d88:20190127
  948. +
    2019-01-19 6.9.10-25 Cristy <quetzlzacatenango@image...>
    +
  949. Eliminate spurious font warning (reference https://github.com/ImageMagick/ImageMagick/issues/1458).
  950. +
  951. Support HEIC EXIF & XMP profiles.
  952. +
    2019-01-12 6.9.10-24 Cristy <quetzlzacatenango@image...>
    +
  953. Release ImageMagick version 6.9.10-24, GIT revision 14130:70079ed45:20190112
  954. +
    2019-01-08 6.9.10-24 Cristy <quetzlzacatenango@image...>
    +
  955. Support -clahe option real clip limit (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=35292).
  956. +
  957. ShadeImage() can return negative pixels, clamp to range (reference https://github.com/ImageMagick/ImageMagick/issues/1319).
  958. +
  959. Annotate with negative offsets no longer renders slanted text.
  960. +
    2019-01-01 6.9.10-23 Cristy <quetzlzacatenango@image...>
    +
  961. Release ImageMagick version 6.9.10-23, GIT revision 14106:df6887c14:20190101
  962. +
    2019-01-01 6.9.10-23 Cristy <quetzlzacatenango@image...>
    +
  963. CacheInfo destructor must be aligned in DestroyPixelStream().
  964. +
    2018-12-30 6.9.10-22 Cristy <quetzlzacatenango@image...>
    +
  965. Release ImageMagick version 6.9.10-22, GIT revision 14098:7054d2569:20181230
  966. +
    2018-12-29 6.9.10-22 Cristy <quetzlzacatenango@image...>
    +
  967. Support negative rotations in a geometry (e.g. -10x-10+10+10).
  968. +
  969. Return expected canvas offset after a crop with gravity.
  970. +
  971. Fix HEIC coder compile exception.
  972. +
    2018-12-27 6.9.10-21 Cristy <quetzlzacatenango@image...>
    +
  973. Release ImageMagick version 6.9.10-21, GIT revision 14088:1961662c1:20181227
  974. +
    2018-12-27 6.9.10-21 Cristy <quetzlzacatenango@image...>
    +
  975. Check to ensure SeekBlob() offset can be represented in an off_t.
  976. +
    2018-12-23 6.9.10-20 Cristy <quetzlzacatenango@image...>
    +
  977. Release ImageMagick version 6.9.10-20, GIT revision 14079:0ce665411:20181223
  978. +
    2018-12-19 6.9.10-19 Cristy <quetzlzacatenango@image...>
    +
  979. Release ImageMagick version 6.9.10-19, GIT revision 14069:0ca60eda0:20181219
  980. +
    2018-12-18 6.9.10-18 Cristy <quetzlzacatenango@image...>
    +
  981. Release ImageMagick version 6.9.10-18, GIT revision 14061:2f9ab1cea:20181218
  982. +
    2018-12-18 6.9.10-18 Cristy <quetzlzacatenango@image...>
    +
  983. Revert MagickDoubleType patch to avoid i386 ABI break (reference https://github.com/ImageMagick/ImageMagick6/issues/31);
  984. +
    2018-12-17 6.9.10-17 Cristy <quetzlzacatenango@image...>
    +
  985. Release ImageMagick version 6.9.10-17, GIT revision 14057:667544c39:20181217
  986. +
    2018-12-10 6.9.10-16 Cristy <quetzlzacatenango@image...>
    +
  987. Release ImageMagick version 6.9.10-16, GIT revision 14039:096b7210f:20181210
  988. +
    2018-12-02 6.9.10-16 Cristy <quetzlzacatenango@image...>
    +
  989. Check for modulo underflow.
  990. +
  991. Change SVG default DPI to 86 from 90 to meet recommendation of SVG2 & CSS.
  992. +
    2018-12-01 6.9.10-15 Cristy <quetzlzacatenango@image...>
    +
  993. Release ImageMagick version 6.9.10-15, GIT revision 14011:ddd5bd95d:20181201
  994. +
    2018-10-23 6.9.10-14 Cristy <quetzlzacatenango@image...>
    +
  995. Release ImageMagick version 6.9.10-14, GIT revision 13943:5f6f9f0be:20181023
  996. +
    2018-10-21 6.9.10-13 Cristy <quetzlzacatenango@image...>
    +
  997. Release ImageMagick version 6.9.10-13, GIT revision 13936:2379b24b8:20181021
  998. +
    2018-09-16 6.9.10-12 Cristy <quetzlzacatenango@image...>
    +
  999. Release ImageMagick version 6.9.10-12, GIT revision 13886:d2819c281:20180923
  1000. +
    2018-09-08 6.9.10-12 Cristy <quetzlzacatenango@image...>
    +
  1001. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1002. +
    2018-08-27 6.9.10-11 Cristy <quetzlzacatenango@image...>
    +
  1003. Release ImageMagick version 6.9.10-11, GIT revision 13806:cbb489883:20180828
  1004. +
    2018-08-15 6.9.10-11 Cristy <quetzlzacatenango@image...>
    +
  1005. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1006. +
  1007. Add support for "module" security policy.
  1008. +
    2018-08-13 6.9.10-10 Cristy <quetzlzacatenango@image...>
    +
  1009. Release ImageMagick version 6.9.10-10, GIT revision 13743:8f8009715:20180813
  1010. +
    2018-08-12 6.9.10-10 Dirk Lemstra <dirk@lem.....org>
    +
  1011. Restored thread support for the HEIC coder.
  1012. +
    2018-08-08 6.9.10-10 Cristy <quetzlzacatenango@image...>
    +
  1013. ThumbnailImage function no longer reveals sensitive information (reference https://github.com/ImageMagick/ImageMagick/issues/1243).
  1014. +
    2018-08-06 6.9.10-9 Cristy <quetzlzacatenango@image...>
    +
  1015. Release ImageMagick version 6.9.10-9, GIT revision 13721:6fb59a954:20180805.
  1016. +
    2018-07-24 6.9.10-9 Cristy <quetzlzacatenango@image...>
    +
  1017. XBM coder leaves the hex image data uninitialized if hex value of the pixel is negative.
  1018. +
  1019. More improvements to SVG text handling.
  1020. +
    2018-07-23 6.9.10-8 Cristy <quetzlzacatenango@image...>
    +
  1021. Release ImageMagick version 6.9.10-8, GIT revision 13693:88aeaf9d9:20180723.
  1022. +
    2018-07-20 6.9.10-8 Cristy <quetzlzacatenango@image...>
    +
  1023. Non-HDRI ScaleLongToQuantum() private method no longer adds a half interval.
  1024. +
  1025. Fixed memset() negative-size-param (reference https://github.com/ImageMagick/ImageMagick/issues/1217).
  1026. +
    2018-07-16 6.9.10-7 Cristy <quetzlzacatenango@image...>
    +
  1027. Release ImageMagick version 6.9.10-7, GIT revision 13676:dab6babe2:20180716.
  1028. +
    2018-07-15 6.9.10-7 Cristy <quetzlzacatenango@image...>
    +
  1029. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1030. +
    2018-07-08 6.9.10-6 Cristy <quetzlzacatenango@image...>
    +
  1031. Release ImageMagick version 6.9.10-6, GIT revision 13660:181df547c:20180708.
  1032. +
    2018-07-08 6.9.10-6 Cristy <quetzlzacatenango@image...>
    +
  1033. Improve SVG support for tspan element.
  1034. +
  1035. Add support for -fx image.extent.
  1036. +
    2018-07-04 6.9.10-5 Cristy <quetzlzacatenango@image...>
    +
  1037. Release ImageMagick version 6.9.10-5, GIT revision 13643:fe71cc8b2:20180704.
  1038. +
    2018-07-04 6.9.10-5 Cristy <quetzlzacatenango@image...>
    +
  1039. Fixed a few potential memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1040. +
    2018-07-02 6.9.10-4 Cristy <quetzlzacatenango@image...>
    +
  1041. Release ImageMagick version 6.9.10-4, GIT revision 13635:c1c026715:20180702.
  1042. +
    2018-06-28 6.9.10-4 Cristy <quetzlzacatenango@image...>
    +
  1043. Small tweaks to compile under Cygwin.
  1044. +
  1045. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1046. +
  1047. Support %B property, the image file size without any decorations.
  1048. +
    2018-06-24 6.9.10-3 Cristy <quetzlzacatenango@image...>
    +
  1049. Release ImageMagick version 6.9.10-3, GIT revision 13618:69366aab3:20180624.
  1050. +
    2018-06-18 6.9.10-2 Cristy <quetzlzacatenango@image...>
    +
  1051. More rovust SVG text handling.
  1052. +
    2018-06-16 6.9.10-1 Cristy <quetzlzacatenango@image...>
    +
  1053. Release ImageMagick version 6.9.10-1, GIT revision 13595:dafb03062:20180616.
  1054. +
    2018-06-16 6.9.10-1 Cristy <quetzlzacatenango@image...>
    +
  1055. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1056. +
  1057. Fixed an issue with stroke and label: (reference
  1058. +
    2018-06-12 6.9.10-0 Cristy <quetzlzacatenango@image...>
    +
  1059. Release ImageMagick version 6.9.10-0, GIT revision 13585:82d7dbe0b:20180612.
  1060. +
    2018-06-11 6.9.10-0 Cristy <quetzlzacatenango@image...>
    +
  1061. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1062. +
    2018-06-11 6.9.9-51 Cristy <quetzlzacatenango@image...>
    +
  1063. Release ImageMagick version 6.9.9-51, GIT revision 13574:a58324488:20180611.
  1064. +
    2018-06-06 6.9.9-51 Cristy <quetzlzacatenango@image...>
    +
  1065. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1066. +
    2018-06-02 6.9.9-50 Cristy <quetzlzacatenango@image...>
    +
  1067. Release ImageMagick version 6.9.9-50, GIT revision 13539:2ae91d95c:20180602.
  1068. +
    2018-05-30 6.9.9-50 Cristy <quetzlzacatenango@image...>
    +
  1069. Heap buffer overflow fix (reference https://github.com/ImageMagick/ImageMagick/issues/1156).
  1070. +
  1071. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1072. +
    2018-05-29 6.9.9-49 Cristy <quetzlzacatenango@image...>
    +
  1073. Release ImageMagick version 6.9.9-49, GIT revision 13521:00f535ee9:20180529.
  1074. +
    2018-05-29 6.9.9-49 Cristy <quetzlzacatenango@image...>
    +
  1075. Properly initialize SVG color style.
  1076. +
    2018-05-28 6.9.9-48 Cristy <quetzlzacatenango@image...>
    +
  1077. Release ImageMagick version 6.9.9-47, GIT revision 13518:5cef106dc:20180528.
  1078. +
    2018-05-28 6.9.9-48 Cristy <quetzlzacatenango@image...>
    +
  1079. A SVG rectangle with a width and height of 1, is a point.
  1080. +
    2018-05-21 6.9.9-47 Cristy <quetzlzacatenango@image...>
    +
  1081. Release ImageMagick version 6.9.9-47, GIT revision 13489:3ff167343:20180521.
  1082. +
    2018-05-21 6.9.9-47 Cristy <quetzlzacatenango@image...>
    +
  1083. Fixed memory corruption for MVG paths.
  1084. +
    2018-05-20 6.9.9-46 Cristy <quetzlzacatenango@image...>
    +
  1085. Release ImageMagick version 6.9.9-46, GIT revision 13483:ced03dfb8:20180520.
  1086. +
    2018-05-19 6.9.9-46 Cristy <quetzlzacatenango@image...>
    +
  1087. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1088. +
  1089. Fixed errant 'not enough pixel data' (reference https://github.com/ImageMagick/ImageMagick/issues/1133).
  1090. +
    2018-05-16 6.9.9-45 Cristy <quetzlzacatenango@image...>
    +
  1091. Release ImageMagick version 6.9.9-45, GIT revision 13456:e027e2bb4:20180513.
  1092. +
    2018-05-16 6.9.9-45 Cristy <quetzlzacatenango@image...>
    +
  1093. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1094. +
    2018-05-13 6.9.9-44 Cristy <quetzlzacatenango@image...>
    +
  1095. Release ImageMagick version 6.9.9-44, GIT revision 13456:e027e2bb4:20180513.
  1096. +
    2018-05-03 6.9.9-43 Cristy <quetzlzacatenango@image...>
    +
  1097. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1098. +
    2018-05-01 6.9.9-42 Cristy <quetzlzacatenango@image...>
    +
  1099. Release ImageMagick version 6.9.9-42, GIT revision 13394:69b3ddf2e:20180501.
  1100. +
    2018-05-01 6.9.9-42 <quetzlzacatenango@image...>
    +
  1101. Missing break when checking "compliance" element.
  1102. +
    2018-04-30 6.9.9-41 Cristy <quetzlzacatenango@image...>
    +
  1103. Release ImageMagick version 6.9.9-41, GIT revision 13379:e819f52a2:20180430.
  1104. +
    2018-03-26 6.9.9-41 Cristy <quetzlzacatenango@image...>
    +
  1105. Fixed numerous use of uninitialized values, integer overflow, memory
  1106. +
    2018-03-24 6.9.9-40 Cristy <quetzlzacatenango@image...>
    +
  1107. Release ImageMagick version 6.9.9-40, GIT revision 13136:8b7024499:20180325.
  1108. +
    2018-03-21 6.9.9-40 Cristy <quetzlzacatenango@image...>
    +
  1109. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1110. +
    2018-03-18 6.9.9-39 Cristy <quetzlzacatenango@image...>
    +
  1111. Release ImageMagick version 6.9.9-39, GIT revision 13067:ae2245e56:20180318.
  1112. +
    2018-03-17 6.9.9-39 Cristy <quetzlzacatenango@image...>
    +
  1113. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1114. +
    2018-03-11 6.9.9-38 Cristy <quetzlzacatenango@image...>
    +
  1115. Release ImageMagick version 6.9.9-38, GIT revision 13009:9f53c16ef:20180311.
  1116. +
    2018-03-09 6.9.9-38 Cristy <quetzlzacatenango@image...>
    +
  1117. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1118. +
    2018-03-04 6.9.9-37 Cristy <quetzlzacatenango@image...>
    +
  1119. Release ImageMagick version 6.9.9-37, GIT revision 12940:93dff0b31:20180304.
  1120. +
    2018-03-04 6.9.9-37 Cristy <quetzlzacatenango@image...>
    +
  1121. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1122. +
    2018-02-25 6.9.9-36 Cristy <quetzlzacatenango@image...>
    +
  1123. Release ImageMagick version 6.9.9-36, GIT revision 12898:fad4ecb37:20180225.
  1124. +
    2018-02-19 6.9.9-36 Cristy <quetzlzacatenango@image...>
    +
  1125. Do not refer to page in OptimizeLayerFrames (reference https://github.com/ImageMagick/ImageMagick/pull/987).
  1126. +
  1127. PerlMagick unit tests pass again.
  1128. +
  1129. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1130. +
    2018-02-18 6.9.9-35 Cristy <quetzlzacatenango@image...>
    +
  1131. Release ImageMagick version 6.9.9-35, GIT revision 12843:46d8215af:20180218.
  1132. +
    2018-02-09 6.9.9-35 Dirk Lemstra <dirk@lem.....org>
    +
  1133. Add support for reading the HEIC image format to the Windows build.
  1134. +
    2018-01-23 6.9.9-35 Cristy <quetzlzacatenango@image...>
    +
  1135. Fixed numerous use of uninitialized values, integer overflow, memory exceeded, and timeouts (credit to OSS Fuzz).
  1136. +
  1137. Add list-length policy to limit the maximum image sequence length.
  1138. +
    2018-01-22 6.9.9-34 Cristy <quetzlzacatenango@image...>
    +
  1139. Release ImageMagick version 6.9.9-34, GIT revision 12574:5370ede60:20180122.
  1140. +
    2018-01-06 6.9.9-34 Cristy <quetzlzacatenango@image...>
    +
  1141. Support aspect ratio geometry, e.g. -crop 3:2.
  1142. +
  1143. Add support for reading the HEIC image format (reference https://github.com/ImageMagick/ImageMagick/issues/507).
  1144. +
  1145. Fix IM build when HEIC is enabled.
  1146. +
  1147. Fixed numerous memory leaks, credit to OSS Fuzz.
  1148. +
    2018-01-06 6.9.9-33 Cristy <quetzlzacatenango@image...>
    +
  1149. Release ImageMagick version 6.9.9-33, GIT revision 12491:5c40f3a88:20180106.
  1150. +
    2018-01-06 6.9.9-33 Dirk Lemstra <dirk@lem.....org>
    +
  1151. Fix some enum values in the OpenCL code.
  1152. +
    2018-01-06 6.9.9-32 Cristy <quetzlzacatenango@image...>
    +
  1153. Release ImageMagick version 6.9.9-32, GIT revision 12489:33a04d3e5:20180105.
  1154. +
    2018-01-05 6.9.9-32 Cristy <quetzlzacatenango@image...>
    +
  1155. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1156. +
    2018-01-01 6.9.9-31 Cristy <quetzlzacatenango@image...>
    +
  1157. Release ImageMagick version 6.9.9-31, GIT revision 12477:7701c8ade:20180101.
  1158. +
    2017-12-29 6.9.9-31 Cristy <quetzlzacatenango@image...>
    +
  1159. Check for webpmux library version 0.4.4 (reference https://github.com/ImageMagick/ImageMagick/issues/896).
  1160. +
    2017-12-28 6.9.9-30 Cristy <quetzlzacatenango@image...>
    +
  1161. Release ImageMagick version 6.9.9-30, GIT revision 12462:c2c8f1ab2:20171228.
  1162. +
    2017-12-28 6.9.9-30 Cristy <quetzlzacatenango@image...>
    +
  1163. Fix error reading from pipe under Windows (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=33288).
  1164. +
    2017-12-26 6.9.9-29 Cristy <quetzlzacatenango@image...>
    +
  1165. Release ImageMagick version 6.9.9-29, GIT revision 12459:90e2b0782:20171227.
  1166. +
    2017-12-26 6.9.9-29 Cristy <quetzlzacatenango@image...>
    +
  1167. Fix heap use after free error (reference https://github.com/ImageMagick/ImageMagick/issues/918).
  1168. +
    2017-12-24 6.9.9-28 Cristy <quetzlzacatenango@image...>
    +
  1169. Release ImageMagick version 6.9.9-28, GIT revision 12438:b01f6cc52:20171225.
  1170. +
    2017-12-18 6.9.9-28 Cristy <quetzlzacatenango@image...>
    +
  1171. Fix error reading multi-layer XCF image file.
  1172. +
  1173. Fix possible stack overflow in WEBP reader (reference https://github.com/ImageMagick/ImageMagick/issues/907)
  1174. +
  1175. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1176. +
    2017-12-16 6.9.9-27 Cristy <quetzlzacatenango@image...>
    +
  1177. Release ImageMagick version 6.9.9-27, GIT revision 12369:82d92312a:20171216.
  1178. +
    2017-12-08 6.9.9-27 Cristy <quetzlzacatenango@image...>
    +
  1179. Overall standard deviation is the average of each pixel channel (reference https://imagemagick.org/discourse-server//viewforum.html?f=3).
  1180. +
    2017-12-06 6.9.9-26 Cristy <quetzlzacatenango@image...>
    +
  1181. Release ImageMagick version 6.9.9-26, GIT revision 12341:8f0e0897b:20171205.
  1182. +
    2017-11-30 6.9.9-26 Cristy <quetzlzacatenango@image...>
    +
  1183. Support Stereo composite operator.
  1184. +
  1185. Fix build failure with --without-modules (reference https://github.com/ImageMagick/ImageMagick/issues/890).
  1186. +
    2017-11-30 6.9.9-25 Cristy <quetzlzacatenango@image...>
    +
  1187. Release ImageMagick version 6.9.9-25, GIT revision 12329:9a5a16a1d:20171130.
  1188. +
    2017-11-30 6.9.9-25 Cristy <quetzlzacatenango@image...>
    +
  1189. Fix build failure with libraw 0.14.8 (reference https://github.com/ImageMagick/ImageMagick/issues/888).
  1190. +
    2017-11-29 6.9.9-24 Cristy <quetzlzacatenango@image...>
    +
  1191. Release ImageMagick version 6.9.9-24, GIT revision 12324:5ef2c5a67:20171129.
  1192. +
    2017-11-17 6.9.9-24 Cristy <quetzlzacatenango@image...>
    +
  1193. Support HDRI color profile management.
  1194. +
  1195. Don't delete in-memory blob when reading an image (reference https://github.com/ImageMagick/ImageMagick/issues/886).
  1196. +
    2017-11-11 6.9.9-23 Cristy <quetzlzacatenango@image...>
    +
  1197. Release ImageMagick version 6.9.9-23, GIT revision 12245:6dea84616:20171111.
  1198. +
    2017-11-10 6.9.9-23 Dirk Lemstra <dirk@lem.....org>
    +
  1199. Fixed initialization of OpenCL (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=33044).
  1200. +
    2017-11-05 6.9.9-22 Cristy <quetzlzacatenango@image...>
    +
  1201. Release ImageMagick version 6.9.9-22, GIT revision 12235:27954ec10:20171105.
  1202. +
    2017-11-03 6.9.9-22 Dirk Lemstra <dirk@lem.....org>
    +
  1203. Fixed a problem with resource bookkeeping in AcquireMatrixInfo().
  1204. +
    2017-10-31 6.9.9-21 Cristy <quetzlzacatenango@image...>
    +
  1205. Release ImageMagick version 6.9.9-21, GIT revision 12218:43b16fff0:20171031.
  1206. +
    2017-10-29 6.9.9-21 Cristy <quetzlzacatenango@image...>
    +
  1207. Encode JSON control characters (reference https://github.com/ImageMagick/ImageMagick/issues/848).
  1208. +
    2017-10-15 6.9.9-20 Cristy <quetzlzacatenango@image...>
    +
  1209. Release ImageMagick version 6.9.9-20, GIT revision 12187:fff1bee84:20171015.
  1210. +
    2017-10-08 6.9.9-20 Cristy <quetzlzacatenango@image...>
    +
  1211. Return expected results for a percent 0 -chop option argument (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=32806).
  1212. +
  1213. Tweaks to OpenMP support within ImageMagick.
  1214. +
    2017-10-07 6.9.9-19 Cristy <quetzlzacatenango@image...>
    +
  1215. Release ImageMagick version 6.9.9-19, GIT revision 12151:be787b70d:20171007.
  1216. +
    2017-10-06 6.9.9-19 Cristy <quetzlzacatenango@image...>
    +
  1217. Correct handling of GIF transparency (reference https://github.com/ImageMagick/ImageMagick/issues/831).
  1218. +
    2017-10-04 6.9.9-18 Cristy <quetzlzacatenango@image...>
    +
  1219. Release ImageMagick version 6.9.9-18, GIT revision 12147:f18d78856:20171004.
  1220. +
    2017-10-02 6.9.9-18 Cristy <quetzlzacatenango@image...>
    +
  1221. Resetting the magick_list_initialized boolean when needed (reference https://github.com/ImageMagick/ImageMagick/pull/826).
  1222. +
    2017-10-01 6.9.9-17 Cristy <quetzlzacatenango@image...>
    +
  1223. Release ImageMagick version 6.9.9-17, GIT revision 12132:c19d58e90:20171001.
  1224. +
    2017-10-01 6.9.9-17 Cristy <quetzlzacatenango@image...>
    +
  1225. Fix broken build (reference https://github.com/ImageMagick/ImageMagick/issues/823).
  1226. +
    2017-10-01 6.9.9-16 Cristy <quetzlzacatenango@image...>
    +
  1227. Release ImageMagick version 6.9.9-16, GIT revision 12125:723b0aa6a:20171001.
  1228. +
    2017-09-28 6.9.9-16 Cristy <quetzlzacatenango@image...>
    +
  1229. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/pull/763).
  1230. +
  1231. Support URW-base35 fonts.
  1232. +
    2017-09-23 6.9.9-15 Cristy <quetzlzacatenango@image...>
    +
  1233. Release ImageMagick version 6.9.9-15, GIT revision 12079:839a14e43:20170923.
  1234. +
    2017-09-23 6.9.9-15 Cristy <quetzlzacatenango@image...>
    +
  1235. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1236. +
    2017-09-17 6.9.9-14 Cristy <quetzlzacatenango@image...>
    +
  1237. Release ImageMagick version 6.9.9-14, GIT revision 12050:b9c9b5fe7:20170917.
  1238. +
    2017-09-17 6.9.9-14 ADLab of Venustech
    +
  1239. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/pull/763).
  1240. +
    2017-09-15 6.9.9-14 Glenn Randers-Pehrson <glennrp@image...>
    +
  1241. Stop poential leaks in the JNG decoder (reference: https://github.com/ImageMagick/ImageMagick/issues/760).
  1242. +
  1243. Maximum valid hour is 23, not 24, in the PNG tIME chunk, and maximum valid minute is 59, not 60.
  1244. +
    2017-09-12 6.9.9-13 Cristy <quetzlzacatenango@image...>
    +
  1245. Release ImageMagick version 6.9.9-13, GIT revision 12008:9730b86ce:20170912.
  1246. +
    2017-09-11 6.9.9-13 Glenn Randers-Pehrson <glennrp@image...>
    +
  1247. Use signed integer arithmetic to calculate timezone corrections (reference https://github.com/ImageMagick/ImageMagick/issues/685).
  1248. +
    2017-09-09 6.9.9-12 Cristy <quetzlzacatenango@image...>
    +
  1249. Release ImageMagick version 6.9.9-12, GIT revision 11996:fca0f6e33:20170909.
  1250. +
    2017-09-07 6.9.9-12 Cristy <quetzlzacatenango@image...>
    +
  1251. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1252. +
  1253. The 'compare' difference image now respects the -fuzz option.
  1254. +
    2017-09-03 6.9.9-11 Cristy <quetzlzacatenango@image...>
    +
  1255. Release ImageMagick version 6.9.9-11, GIT revision 11969:a12fbb873:20170903.
  1256. +
    2017-08-28 6.9.9-11 Cristy <quetzlzacatenango@image...>
    +
  1257. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1258. +
  1259. Don't overwrite symbolic links when the shred policy is enabled.
  1260. +
    2017-08-27 6.9.9-10 Cristy <quetzlzacatenango@image...>
    +
  1261. Release ImageMagick version 6.9.9-10, GIT revision 11936:a8112a821:20170827.
  1262. +
    2017-08-26 6.9.9-10 Dirk Lemstra <dirk@lem.....org>
    +
  1263. Fixed thread safety issue inside the pango and librsvg decoder (reference: https://github.com/dlemstra/Magick.NET/issues/91).
  1264. +
    2017-08-20 6.9.9-9 Cristy <quetzlzacatenango@image...>
    +
  1265. Release ImageMagick version 6.9.9-9, GIT revision 11915:5205bda17:20170820.
  1266. +
    2017-08-18 6.6.9-9 Glenn Randers-Pehrson <glennrp@image...>
    +
  1267. Fixed bug with writing tIME chunk when timezone has a negative offset (reference: https://github.com/ImageMagick/ImageMagick/issues/685).
  1268. +
    2017-08-18 6.9.9-8 Cristy <quetzlzacatenango@image...>
    +
  1269. Release ImageMagick version 6.9.9-8, GIT revision 11906:26078285f:20170818.
  1270. +
    2017-08-18 6.9.9-8 Cristy <quetzlzacatenango@image...>
    +
  1271. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1272. +
    2017-08-12 6.9.9-7 Cristy <quetzlzacatenango@image...>
    +
  1273. Release ImageMagick version 6.9.9-7, GIT revision 11893:8c4c56a0e:20170812 (Windows binaries out of sync).
  1274. +
    2017-08-10 6.9.9-6 Cristy <quetzlzacatenango@image...>
    +
  1275. Release ImageMagick version 6.9.9-6, GIT revision 11886:af2b102db:20170810.
  1276. +
    2017-08-10 6.9.9-6 Cristy <quetzlzacatenango@image...>
    +
  1277. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1278. +
    2017-08-10 6.9.9-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  1279. tests/validate.c: Show the reason for failures in the test logs, if available.
  1280. +
    2017-08-03 6.9.9-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  1281. Put UTC time in the PNG tIME chunk instead of local time (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=32447).
  1282. +
    2017-08-02 6.9.9-5 Cristy <quetzlzacatenango@image...>
    +
  1283. Release ImageMagick version 6.9.9-5, GIT revision 11858:7a555e53f:20170802.
  1284. +
    2017-08-01 6.9.9-5 Cristy <quetzlzacatenango@image...>
    +
  1285. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1286. +
    2017-07-29 6.9.9-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  1287. Properly set image->colorspace in the PNG decoder (previously it was setting image->gamma, but only setting image->colorspace for grayscale and gray-alpha images. Reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=32418).
  1288. +
  1289. Fix improper use of NULL in the JNG decoder (CVE-2017-11750, Reference https://github.com/ImageMagick/ImageMagick/issues/632).
  1290. +
    2017-07-29 6.9.9-5 Cristy <quetzlzacatenango@image...>
    +
  1291. Off by one error for gradient coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=32416).
  1292. +
    2017-07-28 6.9.9-4 Cristy <quetzlzacatenango@image...>
    +
  1293. Release ImageMagick version 6.9.9-4, GIT revision 11833:4e81160d6:20170728.
  1294. +
    2017-07-25 6.9.9-4 Cristy <quetzlzacatenango@image...>
    +
  1295. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1296. +
  1297. coders/png.c: Initialized quantum_scanline to prevent a bad free (reference https://github.com/ImageMagick/ImageMagick/issues/621).
  1298. +
    2017-07-24 6.9.9-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  1299. Removed write_chunk_from_profile() from coders/png.c because it has not worked at least since version 6.7.6.
  1300. +
  1301. Removed many redundant checks before RelinquishMagickMemory(), which is safe to call with a NULL argument.
  1302. +
  1303. Removed vpAg chunk write support (we are now writing caNv instead).
  1304. +
  1305. coders/png.c: Initialized quantum_info to prevent memory leakage (reference https://github.com/ImageMagick/ImageMagick/issues/582, CVE-2017-11539).
  1306. +
  1307. coders/png.c: fixed NULL dereference when trying to write an empty MNG (CVE-2017-11522, reference https://github.com/ImageMagick/ImageMagick/issues/586).
  1308. +
    2017-07-24 6.9.9-3 Cristy <quetzlzacatenango@image...>
    +
  1309. Release ImageMagick version 6.9.9-3, GIT revision 11809:2bd88257b:20170724.
  1310. +
    2017-07-23 6.9.9-3 Cristy <quetzlzacatenango@image...>
    +
  1311. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1312. +
    2017-07-23 6.9.9-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  1313. Fix memory leaks when reading a malformed JNG image: https://github.com/ImageMagick/ImageMagick/issues/600 (CVE-2017-13141), https://github.com/ImageMagick/ImageMagick/issues/602 (CVE-2017-12565).
  1314. +
    2017-07-22 6.9.9-2 Cristy <quetzlzacatenango@image...>
    +
  1315. Release ImageMagick version 6.9.9-2, GIT revision 11786:21b23bf09:20170722.
  1316. +
    2017-07-22 6.9.9-2 Cristy <quetzlzacatenango@image...>
    +
  1317. composite -dissolve works again reference https://github.com/ImageMagick/ImageMagick/issues/597).
  1318. +
    2017-07-21 6.9.9-1 Cristy <quetzlzacatenango@image...>
    +
  1319. Release ImageMagick version 6.9.9-1, GIT revision 11782:75f7e994e:20170721.
  1320. +
    2017-07-19 6.9.9-1 Cristy <quetzlzacatenango@image...>
    +
  1321. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1322. +
    2017-07-15 6.9.9-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  1323. Don't write a hex-encoded Exif profile when writing the eXIf chunk.
  1324. +
  1325. Added caNv, eXIf, and pHYs to the list of PNG chunks to be removed by the "-strip" option.
  1326. +
    2017-07-15 6.9.9-0 Cristy <quetzlzacatenango@image...>
    +
  1327. Release ImageMagick version 6.9.9-0, GIT revision 11738:8903861b2:20170715.
  1328. +
    2017-07-13 6.9.9-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  1329. Implemented PNG eXIf chunk support.
  1330. +
    2017-07-08 6.9.9-0 Cristy <quetzlzacatenango@image...>
    +
  1331. Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues).
  1332. +
  1333. Don't use variable float_t / double_t, bump SO (reference https://github.com/ImageMagick/ImageMagick/issues/510).
  1334. +
  1335. Support DNG images with libraw delegate library.
  1336. +
    2017-06-10 6.9.8-10 Cristy <quetzlzacatenango@image...>
    +
  1337. Release ImageMagick version 6.9.8-10, GIT revision 11637:eb6f363:20170610.
  1338. +
    2017-06-10 6.9.8-10 Cristy <quetzlzacatenango@image...>
    +
  1339. Introduce SetMagickSecurityPolicy() (MagickCore) and MagickSetSecurityPolicy() (MagickWand) to set the ImageMagick security policy (reference https://github.com/ImageMagick/ImageMagick/issues/407).
  1340. +
    2017-06-02 6.9.8-9 Cristy <quetzlzacatenango@image...>
    +
  1341. Release ImageMagick version 6.9.8-9, GIT revision 11625:91bb35e:20170602.
  1342. +
    2017-06-02 6.9.8-9 Cristy <quetzlzacatenango@image...>
    +
  1343. Fix choppy bitmap font rendering (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=32071).
  1344. +
  1345. Add support for 'hex:' property.
  1346. +
    2017-05-28 6.9.8-8 Cristy <quetzlzacatenango@image...>
    +
  1347. Release ImageMagick version 6.9.8-8, GIT revision 11606:8b67333:20170528.
  1348. +
    2017-05-28 6.9.8-8 Cristy <quetzlzacatenango@image...>
    +
  1349. Transient error validating the JPEG-2000 image format (reference https://github.com/ImageMagick/ImageMagick/issues/501).
  1350. +
  1351. Properly allocate DCM image colormap (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=32063).
  1352. +
    2017-05-26 6.9.8-7 Cristy <quetzlzacatenango@image...>
    +
  1353. Release ImageMagick version 6.9.8-7, GIT revision 11598:07d1dee:20170526.
  1354. +
    2017-05-23 6.9.8-7 Cristy <quetzlzacatenango@image...>
    +
  1355. Improper allocation of memory for IM instances without threads (reference
    https://github.com/ImageMagick/ImageMagick/issues/497).
    +
  1356. Delete corrupt image from list (reference https://github.com/ImageMagick/ImageMagick/issues/500).
  1357. +
    2017-05-19 6.9.8-6 Cristy <quetzlzacatenango@image...>
    +
  1358. Release ImageMagick version 6.9.8-6, GIT revision 11590:7ce2d38:20170519.
  1359. +
    2017-05-15 6.9.8-6 Cristy <quetzlzacatenango@image...>
    +
  1360. Support various image operators for the compare utility (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=31938).
  1361. +
    2017-05-12 6.9.8-5 Cristy <quetzlzacatenango@image...>
    +
  1362. Release ImageMagick version 6.9.8-5, GIT revision 11575:186b15d:20170512.
  1363. +
    2017-05-10 6.9.8-5 John Cupitt <jcupitt@gmail.com>
    +
  1364. Revise DICOM window and rescale handling (reference https://github.com/ImageMagick/ImageMagick/pull/484)
  1365. +
    2017-05-08 6.9.8-5 Cristy <quetzlzacatenango@image...>
    +
  1366. Fix transient PDF bug (reference https://github.com/ImageMagick/ImageMagick/issues/463).
  1367. +
  1368. Check for EOF conditions for RLE image format.
  1369. +
  1370. Reset histogram page geometry (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31920).
  1371. +
    2017-04-24 6.9.8-4 Cristy <quetzlzacatenango@image...>
    +
  1372. Release ImageMagick version 6.9.8-4, GIT revision 11521:d7433aa:20170424.
  1373. +
    2017-03-26 6.9.8-4 Cristy <quetzlzacatenango@image...>
    +
  1374. Minimize buffer copies to improve OpenCL performance.
  1375. +
  1376. Patch a PCD writer problem, dark pixels (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=3164).
  1377. +
  1378. Support ICC based PDF's (reference https://github.com/ImageMagick/ImageMagick/issues/417).
  1379. +
    2017-03-24 6.9.8-3 Cristy <quetzlzacatenango@image...>
    +
  1380. Release ImageMagick version 6.9.8-3, GIT revision 11444:3f523e5:20170324.
  1381. +
    2017-03-20 6.9.8-3 Cristy <quetzlzacatenango@image...>
    +
  1382. MagickWand-config, use --cflags, not --clags (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31602).
  1383. +
  1384. Respect -loop option for animate -window (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31619).
  1385. +
    2017-03-18 6.9.8-2 Cristy <quetzlzacatenango@image...>
    +
  1386. Release ImageMagick version 6.9.8-2, GIT revision 11436:a912791:20170318.
  1387. +
    2017-03-14 6.9.8-2 Cristy <quetzlzacatenango@image...>
    +
  1388. Support namespaces for the security policy.
  1389. +
    2017-03-11 6.9.8-1 Cristy <quetzlzacatenango@image...>
    +
  1390. Release ImageMagick version 6.9.8-1.
  1391. +
    2017-03-03 6.9.8-0 Cristy <quetzlzacatenango@image...>
    +
  1392. Release ImageMagick version 6.9.8-0, GIT revision 11408:da91a7c:20170311.
  1393. +
    2017-03-06 6.9.8-0 Cristy <quetzlzacatenango@image...>
    +
  1394. Respect throttle policy (reference https://github.com/ImageMagick/ImageMagick/issues/393).
  1395. +
  1396. Support the -authenticate option for PDF (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31530).
  1397. +
    2017-03-03 6.9.7-10 Cristy <quetzlzacatenango@image...>
    +
  1398. Release ImageMagick version 6.9.7-10, GIT revision 11396:44b1bc6:20170303.
  1399. +
    2017-02-21 6.9.7-10 Cristy <quetzlzacatenango@image...>
    +
  1400. Fix Spurious memory allocation message (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31438).
  1401. +
  1402. Identical images should return inf for PSNR (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31487).
  1403. +
    2017-02-18 6.9.7-9 Cristy <quetzlzacatenango@image...>
    +
  1404. Release ImageMagick version 6.9.7-9, GIT revision 11371:126c7c9:20170218.
  1405. +
    2017-02-18 6.9.7-9 Dirk Lemstra <dirk@lem.....org>
    +
  1406. Fixed fd leak for webp coder (reference https://github.com/ImageMagick/ImageMagick/pull/382)
  1407. +
    2017-02-15 6.9.7-9 Cristy <quetzlzacatenango@image...>
    +
  1408. Prevent random pixel data for corrupt JPEG image (bug report from Hirokazu Moriguchi, Sony).
  1409. +
  1410. Support pixel-cache and shred security policies.
  1411. +
    2017-02-12 6.9.7-8 Cristy <quetzlzacatenango@image...>
    +
  1412. Release ImageMagick version 6.9.7-8.
  1413. +
    2017-02-09 6.9.7-8 Dirk Lemstra <dirk@lem.....org>
    +
  1414. Fixed memory leak when creating nested exceptions in Magick++ (reference https://imagemagick.org/discourse-server//viewtopic.html?f=23&p=142634)
  1415. +
    2017-02-06 6.9.7-8 Cristy <quetzlzacatenango@image...>
    +
  1416. Eliminate bogus assertion (reference https://github.com/ImageMagick/ImageMagick/issues/372).
  1417. +
  1418. Unbreak build without JPEG support (reference https://github.com/ImageMagick/ImageMagick/pull/373).
  1419. +
    2017-02-04 6.9.7-7 Cristy <quetzlzacatenango@image...>
    +
  1420. Release ImageMagick version 6.9.7-7, GIT revision 11338:cc980d1:20170204.
  1421. +
    2017-01-28 6.9.7-7 Cristy <quetzlzacatenango@image...>
    +
  1422. Sanitize comments that include braces for the MIFF image format (reference https://github.com/ImageMagick/ImageMagick/issues/368).
  1423. +
    2017-01-27 6.9.7-6 Cristy <quetzlzacatenango@image...>
    +
  1424. Release ImageMagick version 6.9.7-6, GIT revision 11327:6b2f052:20170127.
  1425. +
    2017-01-27 6.9.7-6 Cristy <quetzlzacatenango@image...>
    +
  1426. Uninitialized data in MAT image format (reference https://github.com/ImageMagick/ImageMagick/issues/362).
  1427. +
    2017-01-22 6.9.7-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  1428. Renamed read_vpag_chunk_callback() function to png_user_chunk_callback() in coders/png.c
  1429. +
  1430. Implemented a private PNG caNv (canvas) chunk for remembering the original dimensions and offsets when an image is cropped. Previously we used the oFFs and vpAg chunks for this purpose, but this had potential conflicts with other applications that also use the oFFs chunk.
  1431. +
  1432. coders/png.c: Added support for a proposed new PNG chunk (exIf read-write, eXIf read-only) that is currently being discussed on the png-mng-misc at lists.sourceforge.net mailing list.
  1433. +
    2017-01-14 6.9.7-5 Cristy <quetzlzacatenango@image...>
    +
  1434. Release ImageMagick version 6.9.7-5, GIT revision 11306:cd9b64b:20170121.
  1435. +
    2017-01-18 6.9.7-5 Cristy <quetzlzacatenango@image...>
    +
  1436. Don't set background for transparent tiled images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31210).
  1437. +
    2017-01-14 6.9.7-4 Cristy <quetzlzacatenango@image...>
    +
  1438. Release ImageMagick version 6.9.7-4, GIT revision 11293:c359058:20170114.
  1439. +
    2017-01-14 6.9.7-4 Dirk Lemstra <dirk@lem.....org>
    +
  1440. Added support for RGB555, RGB565, ARGB4444 and ARGB1555 to the BMP encoder (reference https://github.com/ImageMagick/ImageMagick/issues/344).
  1441. +
    2017-01-10 6.9.7-4 Cristy <quetzlzacatenango@image...>
    +
  1442. Recognize XML policy closing tags (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31182).
  1443. +
  1444. Fix memory leak in MPC image format.
  1445. +
    2017-01-07 6.9.7-3 Cristy <quetzlzacatenango@image...>
    +
  1446. Release ImageMagick version 6.9.7-3, GIT revision 11280:7d65a81:20170107.
  1447. +
    2017-01-04 6.9.7-3 Cristy <quetzlzacatenango@image...>
    +
  1448. Increase memory allocation for TIFF pixels (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31161).
  1449. +
    2017-01-03 6.9.7-2 Cristy <quetzlzacatenango@image...>
    +
  1450. Release ImageMagick version 6.9.7-2, GIT revision 11274:2faf8d7:20170103.
  1451. +
    2017-01-02 6.9.7-2 Cristy <quetzlzacatenango@image...>
    +
  1452. Validation unit test for MNG works again.
  1453. +
    2016-12-31 6.9.7-1 Cristy <quetzlzacatenango@image...>
    +
  1454. Release ImageMagick version 6.9.7-1, GIT revision 11265:2b38406:20161231.
  1455. +
    2016-12-26 6.9.7-1 Cristy <quetzlzacatenango@image...>
    +
  1456. Initialize draw_info alpha member to OpaqueAlpha.
  1457. +
  1458. The TMPDIR environment variable has precedence over P_tmpdir (reference https://github.com/ImageMagick/ImageMagick/issues/337).
  1459. +
  1460. Monochrome images no longer have inverted colors (reference https://github.com/ImageMagick/ImageMagick/issues/332).
  1461. +
    2016-12-10 6.9.7-0 Cristy <quetzlzacatenango@image...>
    +
  1462. Release ImageMagick version 6.9.7-0, GIT revision 11230:d5e8abc:20161218.
  1463. +
    2016-12-14 6.9.7-0 Cristy <quetzlzacatenango@image...>
    +
  1464. Bump Release to 6.9.7 to ensure coinstallability of old and new library.
  1465. +
  1466. Lazily evaluate the image storage class and colorspace to prevent cache allocation when pinging an image.
  1467. +
  1468. Do not close path for linejoins of round (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31039).
  1469. +
    2016-12-10 6.9.6-8 Cristy <quetzlzacatenango@image...>
    +
  1470. Release ImageMagick version 6.9.6-8, GIT revision 11219:11d48fe:20161210.
  1471. +
    2016-12-07 6.9.6-8 Cristy <quetzlzacatenango@image...>
    +
  1472. Set colorspace to sRGB if -append has non-homogenous colorspaces (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=29105).
  1473. +
  1474. Respect connected-components:area-threshold define (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31006).
  1475. +
  1476. Return correct offset for negative index for -fx option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31019).
  1477. +
  1478. ABI breakage requires an SO bump (reference https://github.com/ImageMagick/ImageMagick/issues/320).
  1479. +
  1480. Fixed improper scaling of certain FITS images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31028).
  1481. +
  1482. Properly center text label (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=31027).
  1483. +
    2016-12-05 6.9.6-7 Cristy <quetzlzacatenango@image...>
    +
  1484. Release ImageMagick version 6.9.6-7, GIT revision 11188:668b60c:20161205.
  1485. +
    2016-12-02 6.9.6-7 Cristy <quetzlzacatenango@image...>
    +
  1486. Fix possible buffer overflow when writing compressed TIFFS (vulnerability report from Cisco Talos, CVE-2016-8707).
  1487. +
    2016-11-25 6.9.6-6 Cristy <quetzlzacatenango@image...>
    +
  1488. Release ImageMagick version 6.9.6-6, GIT revision 11169:94edafc:20161125.
  1489. +
    2016-11-20 6.9.6-6 Cristy <quetzlzacatenango@image...>
    +
  1490. If a convenient line break is not found, force it for caption: (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=30887).
  1491. +
  1492. Off by 1 error when computing the standard deviation (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=30866).
  1493. +
  1494. Apply Debian patches, (reference https://github.com/ImageMagick/ImageMagick/issues/304).
  1495. +
  1496. Permit EPT images with just a TIFF or EPS image, not both (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=30921).
  1497. +
  1498. The -clone option no longer leak memory.
  1499. +
    2016-11-15 6.9.6-5 Cristy <quetzlzacatenango@image...>
    +
  1500. Release ImageMagick version 6.9.6-5, GIT revision 11139:5175b3c:20161115.
  1501. +
    2016-11-10 6.9.6-5 Cristy <quetzlzacatenango@image...>
    +
  1502. Web pages were broken when we moved to HTTPS protocol.
  1503. +
  1504. Restore -sharpen / -convolve options to work with CMYK (reference https://github.com/ImageMagick/ImageMagick/issues/299).
  1505. +
    2016-11-08 6.9.6-4 Cristy <quetzlzacatenango@image...>
    +
  1506. Release ImageMagick version 6.9.6-4, GIT revision 11130:d7a7e4d:20161108.
  1507. +
    2016-11-01 6.9.6-4 Cristy <quetzlzacatenango@image...>
    +
  1508. Off by one memory allocation (reference https://github.com/ImageMagick/ImageMagick/issues/296).
  1509. +
  1510. Prevent fault in MSL interpreter (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=30797).
  1511. +
    2016-10-30 6.9.6-3 Cristy <quetzlzacatenango@image...>
    +
  1512. Release ImageMagick version 6.9.6-3, GIT revision 11117:e857a26:20161030.
  1513. +
    2016-10-16 6.9.6-3 Dirk Lemstra <dirk@lem.....org>
    +
  1514. Added layer ZIP compression to the PSD encoder.
  1515. +
    2016-10-10 6.9.6-2 Cristy <quetzlzacatenango@image...>
    +
  1516. Release ImageMagick version 6.9.6-2, GIT revision 11095:14d2cea:20161010.
  1517. +
    2016-10-10 6.9.6-2 Cristy <quetzlzacatenango@image...>
    +
  1518. Unit test pass again after small SUN image patch.
  1519. +
    2016-10-07 6.9.6-1 Cristy <quetzlzacatenango@image...>
    +
  1520. Release ImageMagick version 6.9.6-1, GIT revision 11092:1f7ca24:20161008.
  1521. +
    2016-10-07 6.9.6-1 Dirk Lemstra <dirk@lem.....org>
    +
  1522. Fixed incorrect RLE decoding when reading a DCM image that contains multiple segments.
  1523. +
    2016-10-02 6.9.6-0 Cristy <quetzlzacatenango@image...>
    +
  1524. Release ImageMagick version 6.9.6-0, GIT revision 11078:9aec251:20161002.
  1525. +
    2016-09-27 6.9.6-0 Dirk Lemstra <dirk@lem.....org>
    +
  1526. Fixed incorrect RLE decoding when reading an SGI image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=30514)
  1527. +
    2016-09-05 6.9.5-10 Cristy <quetzlzacatenango@image...>
    +
  1528. Release ImageMagick version 6.9.5-10, GIT revision 11054:ddda572:20160920.
  1529. +
    2016-09-17 6.9.5-10 Dirk Lemstra <dirk@lem.....org>
    +
  1530. Added layer RLE compression to the PSD encoder.
  1531. +
  1532. Added define 'psd:preserve-opacity-mask' to preserve the opacity mask in a PSD file.
  1533. +
  1534. Fixed issue where the display window was used instead of the data window when reading EXR files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&p=137849).
  1535. +
    2016-09-05 6.9.5-9 Cristy <quetzlzacatenango@image...>
    +
  1536. Release ImageMagick version 6.9.5-9, GIT revision 11029:777f14c:20160905.
  1537. +
    2016-08-31 6.9.5-9 Dirk Lemstra <dirk@lem.....org>
    +
  1538. Fixed incorrect padding calculation in PSD encoder.
  1539. +
    2016-08-27 6.9.5-8 Cristy <quetzlzacatenango@image...>
    +
  1540. Release ImageMagick version 6.9.5-8, GIT revision 11015:e3335b3:20160827.
  1541. +
    2016-08-27 6.9.5-8 Dirk Lemstra <dirk@lem.....org>
    +
  1542. Added define 'psd:additional-info' to preserve the additional information in a PSD file.
  1543. +
    2016-08-15 6.9.5-8 Cristy <quetzlzacatenango@image...>
    +
  1544. Prevent buffer overflow in BMP & SGI coders (bug report from
    pwchen&rayzhong of tencent).
    +
  1545. Fix MSVG regression (reference https://github.com/ImageMagick/ImageMagick/issues/252).
  1546. +
  1547. Prevent buffer overflow and other problems in SIXEL, PDB, MAP, TIFF, and
    CALS coders (bug report from Donghai Zhu).
    +
  1548. 2016-08-14 6.9.5-7 Cristy <quetzlzacatenango@image...>
    +
  1549. Release ImageMagick version 6.9.5-7, GIT revision 10993:7d2fd25:20160814.
  1550. +
    2016-08-14 6.9.5-7 Cristy <quetzlzacatenango@image...>
    +
  1551. Eliminate compiler warning.
  1552. +
    2016-08-14 6.9.5-6 Cristy <quetzlzacatenango@image...>
    +
  1553. Release ImageMagick version 6.9.5-6, GIT revision 10991:ab76b09:20160814
  1554. +
    2016-08-07 6.9.5-6 Cristy <quetzlzacatenango@image...>
    +
  1555. Prevent spurious removal of MPC cache files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=30256).
  1556. +
    2016-08-06 6.9.5-5 Cristy <quetzlzacatenango@image...>
    +
  1557. Release ImageMagick version 6.9.5-5, GIT revision 10980:ecc03a2:20160806.
  1558. +
    2016-08-03 6.9.5-5 Cristy <quetzlzacatenango@image...>
    +
  1559. Prevent buffer overflow (bug report from Max Thrane).
  1560. +
  1561. Prevent memory use after free (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=30245).
  1562. +
    2016-07-30 6.9.5-4 Cristy <quetzlzacatenango@image...>
    +
  1563. Release ImageMagick version 6.9.5-4, GIT revision 10973:a00fa93:20160729.
  1564. +
    2016-07-35 6.9.5-4 Cristy <quetzlzacatenango@image...>
    +
  1565. Prevent buffer overflow (bug report from Ibrahim el-sayed).
  1566. +
    2016-07-15 6.9.5-3 Cristy <quetzlzacatenango@image...>
    +
  1567. Release ImageMagick version 6.9.5-3, GIT revision 18627:2b5ddbd:20160721.
  1568. +
    2016-07-13 6.9.5-3 Cristy <quetzlzacatenango@image...>
    +
  1569. Fix MVG stroke-opacity (reference https://github.com/ImageMagick/ImageMagick/issues/229).
  1570. +
  1571. Prevent possible buffer overflow when reading TIFF images (bug report from Shi Pu of MS509 Team).
  1572. +
    2016-07-11 6.9.5-2 Cristy <quetzlzacatenango@image...>
    +
  1573. Release ImageMagick version 6.9.5-2, GIT revision 18591:50debe5:20160710.
  1574. +
    2016-07-10 6.9.5-2 Cristy <quetzlzacatenango@image...>
    +
  1575. To comply with the SVG standard, use stroke-opacity for transparent strokes.
  1576. +
    2016-07-09 6.9.5-1 Cristy <quetzlzacatenango@image...>
    +
  1577. Release ImageMagick version 6.9.5-1, GIT revision 18572:28560fc:20160709.
  1578. +
    2016-07-04 6.9.5-1 Cristy <quetzlzacatenango@image...>
    +
  1579. The histogram coder now returns the correct extent.
  1580. +
  1581. Use CopyMagickString() rather than CopyMagickMemory() for strings.
  1582. +
    2016-06-26 6.9.5-0 Cristy <quetzlzacatenango@image...>
    +
  1583. Release ImageMagick version 6.9.5-0, GIT revision 18514:a7b5b46:20160626.
  1584. +
    2016-06-23 6.9.5-0 Cristy <quetzlzacatenango@image...>
    +
  1585. Correct for numerical instability (reference https://github.com/ImageMagick/ImageMagick/issues/218).
  1586. +
    2016-06-21 6.9.4-10 Cristy <quetzlzacatenango@image...>
    +
  1587. Release ImageMagick version 6.9.4-10, GIT revision 10907:a08de63:20160622.
  1588. +
    2016-06-17 6.9.4-10 Dirk Lemstra <dirk@lem.....org>
    +
  1589. Added support for GROUP4 compression to the FAX coder.
  1590. +
    2016-06-17 6.9.4-10 Cristy <quetzlzacatenango@image...>
    +
  1591. Don't return a zero bounding box for QueryMultilineFontMetrics() (reference https://github.com/ImageMagick/ImageMagick/issues/222).
  1592. +
    2016-06-12 6.9.4-9 Cristy <quetzlzacatenango@image...>
    +
  1593. Release ImageMagick version 6.9.4-9, GIT revision 10884:f0e15e8:20160612.
  1594. +
    2016-06-09 6.9.4-9 Cristy <quetzlzacatenango@image...>
    +
  1595. Backoff finite precision epsilon (reference https://github.com/ImageMagick/ImageMagick/issues/215).
  1596. +
  1597. Fix drawing glitch for stroke widths greater than 2 (reference https://github.com/ImageMagick/ImageMagick/issues/218).
  1598. +
    2016-06-05 6.9.4-8 Cristy <quetzlzacatenango@image...>
    +
  1599. Release ImageMagick version 6.9.4-8, GIT revision 18406:ba4ad2d:20160607.
  1600. +
    2016-06-04 6.9.4-8 Cristy <quetzlzacatenango@image...>
    +
  1601. RLE check for pixel offset less than 0 (heap overflow report from Craig Young).
  1602. +
  1603. Properly initialze PES blocks (reference https://github.com/ImageMagick/ImageMagick/issues/213).
  1604. +
    2016-06-03 6.9.4-7 Cristy <quetzlzacatenango@image...>
    +
  1605. Release ImageMagick version 6.9.4-7, GIT revision 10847:339f803:20160602.
  1606. +
    2016-06-02 6.9.4-7 Cristy <quetzlzacatenango@image...>
    +
  1607. Fix small memory leak (patch provided by Андрей Черный).
  1608. +
  1609. Coder path traversal is not authorized (bug report provided by Masaaki Chida).
  1610. +
  1611. Turn off alpha channel for the compare difference image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=29828).
  1612. +
    2016-05-31 6.9.4-6 Cristy <quetzlzacatenango@image...>
    +
  1613. Release ImageMagick version 6.9.4-6, GIT revision 18334:97775b5:20160531.
  1614. +
    2016-05-31 6.9.4-6 Cristy <quetzlzacatenango@image...>
    +
  1615. Support configure script --enable-pipes option to enable pipes (|) in filenames.
  1616. +
  1617. Support configure script --enable-indirect-reads option to enable indirect reads (@) in filenames.
  1618. +
    2016-05-30 6.9.4-5 Cristy <quetzlzacatenango@image...>
    +
  1619. Release ImageMagick version 6.9.4-5, GIT revision 18321:5511ef5:20160530.
  1620. +
    2016-05-28 6.9.4-5 Dirk Lemstra <dirk@lem.....org>
    +
  1621. Most OpenCL operations are now executed asynchronous.
  1622. +
    2016-05-25 6.9.4-5 Cristy <quetzlzacatenango@image...>
    +
  1623. Security improvements to TEXT coder broke it (reference
  1624. +
  1625. Prevent possible shell command injection vulnerability through the authenticate parameter of the PDF, PCL and XPS coders (report from Erez Turjeman). https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=29754).
  1626. +
  1627. Fix stroke offset problem for -annotate (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=29626).
  1628. +
  1629. Add additional checks to DCM reader to prevent data-driven faults (bug report from Hanno Böck).
  1630. +
    2016-05-21 6.9.4-4 Cristy <quetzlzacatenango@image...>
    +
  1631. Release ImageMagick version 6.9.4-4, GIT revision 18241:d4f277c:20160521.
  1632. +
    2016-05-20 6.9.4-4 Cristy <quetzlzacatenango@image...>
    +
  1633. Fixed proper placement of text annotation for east / west gravity.
  1634. +
    2016-05-15 6.9.4-4 Cristy <quetzlzacatenango@image...>
    +
  1635. Release ImageMagick version 6.9.4-4, GIT revision 10789:f7c2e89:20160518.
  1636. +
    2016-05-15 6.9.4-3 Cristy <quetzlzacatenango@image...>
    +
  1637. Fix pixel cache on disk regression (reference https://github.com/ImageMagick/ImageMagick/issues/202).
  1638. +
    2016-05-15 6.9.4-2 Cristy <quetzlzacatenango@image...>
    +
  1639. Release ImageMagick version 6.9.4-2, GIT revision 10778:52dae14:20160516.
  1640. +
    2016-05-10 6.9.4-2 Cristy <quetzlzacatenango@image...>
    +
  1641. Quote passwords when passed to a delegate program.
  1642. +
  1643. Can read geo-related EXIF metdata once-again (reference https://github.com/ImageMagick/ImageMagick/issues/198).
  1644. +
  1645. Sanitize all delegate emedded formatting characters.
  1646. +
  1647. Don't sync pixel cache in AcquireAuthenticCacheView() (bug report from Hanno Böck).
  1648. +
    2016-05-09 6.9.4-1 Cristy <quetzlzacatenango@image...>
    +
  1649. Release ImageMagick version 6.9.4-1, GIT revision 10755:d540dda:20160509.
  1650. +
    2016-05-07 6.9.4-1 Cristy <quetzlzacatenango@image...>
    +
  1651. Remove https delegate.
  1652. +
    2016-05-05 6.9.4-0 Cristy <quetzlzacatenango@image...>
    +
  1653. Release ImageMagick version 6.9.4-0, GIT revision 10741:5746147:20160507.
  1654. +
    2016-05-04 6.9.4-0 Cristy <quetzlzacatenango@image...>
    +
  1655. Check for buffer overflow in magick/draw.c/DrawStrokePolygon().
  1656. +
  1657. Replace show delegate title with image filename rather than label.
  1658. +
  1659. Fix GetNextToken() off by one error.
  1660. +
  1661. Remove support for internal ephemeral coder.
  1662. +
    2016-05-03 6.9.3-10 Cristy <quetzlzacatenango@image...>
    +
  1663. New version 6.9.3-10, GIT revision 10723:9fc8a0c:20160503.
  1664. +
    2016-05-03 6.9.3-10 Cristy <quetzlzacatenango@image...>
    +
  1665. Sanitize input filename for http / https delegates (improved patch).
  1666. +
  1667. Fix for possible security vulnerabilities (reference https://imagemagick.org/discourse-server//viewtopic.html?f=4&t=29588).
  1668. +
    2016-04-30 6.9.3-9 Cristy <quetzlzacatenango@image...>
    +
  1669. New version 6.9.3-9, GIT revision 10716:b527bce:20160430.
  1670. +
    2016-04-12 6.9.3-9 Cristy <quetzlzacatenango@image...>
    +
  1671. Sanitize input filename for http / https delegates.
  1672. +
  1673. Indirect filename must be authorized by policy.
  1674. +
  1675. The txt coder now properly reports Lab colors (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=2944).
  1676. +
    2016-04-11 6.9.3-8 Cristy <quetzlzacatenango@image...>
    +
  1677. New version 6.9.3-8, GIT revision 10690:d058a53:20160411
  1678. +
    2016-03-22 6.9.3-8 Cristy <quetzlzacatenango@image...>
    +
  1679. Respect gravity when rendering text (e.g. convert -gravity center my.txt)
  1680. +
  1681. Return empty string for %d property and no directory (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=29365)
  1682. +
  1683. Return filename for the %i property (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=29364).
  1684. +
  1685. Fixed lost pixels in frequency space (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=29374).
  1686. +
    2016-03-06 6.9.3-7 Cristy <quetzlzacatenango@image...>
    +
  1687. New version 6.9.3-7, GIT revision 10628:810a9fe:20160306
  1688. +
    2016-03-05 6.9.3-7 Dirk Lemstra <dirk@lem.....org>
    +
  1689. -size can now be used the specify the maximum width/height for the following vector formats:
  1690. +
  1691. SVG (when librsvg and cairo are being used).
  1692. +
  1693. EMF (did not work on Windows).
  1694. +
    2016-02-29 6.9.3-7 Cristy <quetzlzacatenango@image...>
    +
  1695. Fixed text alignment issue for label: / coder: (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=29223).
  1696. +
    2016-02-27 6.9.3-6 Cristy <quetzlzacatenango@image...>
    +
  1697. New version 6.9.3-6, GIT revision 10597:83584a1:20160228.
  1698. +
    2016-02-25 6.9.3-6 Cristy <quetzlzacatenango@image...>
    +
  1699. Ensure TXT: image format survives round-trip (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=29206).
  1700. +
    2016-02-21 6.9.2-6 Dirk Lemstra <dirk@lem.....org>
    +
  1701. Added wavelet denoise.
  1702. +
    2016-02-20 6.9.3-5 Cristy <quetzlzacatenango@image...>
    +
  1703. New version 6.9.3-5, GIT revision 10572:cb24a69:20160219.
  1704. +
    2016-02-16 6.9.3-5 Cristy <quetzlzacatenango@image...>
    +
  1705. Too many bytes when writing raw image formats (reference https://github.com/ImageMagick/ImageMagick/issues/132).
  1706. +
    2016-02-12 6.9.3-4 Cristy <quetzlzacatenango@image...>
    +
  1707. New version 6.9.3-4, GIT revision 10560:09f5f5d:20160212.
  1708. +
    2016-02-12 6.9.3-4 Dirk Lemstra <dirk@lem.....org>
    +
  1709. Fixed memory leak when reading an SVG without width/height (reference https://imagemagick.org/discourse-server//viewtopic.html?f=27&p=130197).
  1710. +
    2016-02-09 6.9.3-4 Cristy <quetzlzacatenango@image...>
    +
  1711. Fix compiler error for complext text layout.
  1712. +
    2016-02-05 6.9.3-3 Cristy <quetzlzacatenango@image...>
    +
  1713. New version 6.9.3-3, GIT revision 10540:6b4c918:20160206.
  1714. +
    2016-02-04 6.9.3-3 Cristy <quetzlzacatenango@image...>
    +
  1715. Numerous bugs fixed from fuzzed images (reference https://github.com/ImageMagick/ImageMagick/issues/123).
  1716. +
  1717. The -bias option is no longer a noop (reference https://github.com/ImageMagick/ImageMagick/issues/125).
  1718. +
    2016-01-25 6.9.3-3 Dirk Lemstra <dirk@lem.....org>
    +
  1719. Read XCF layer name (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&p=129638).
  1720. +
    2016-01-23 6.9.3-2 Cristy <quetzlzacatenango@image...>
    +
  1721. New version 6.9.3-2, GIT revision 10496:315028c:20160122.
  1722. +
    2016-01-17 6.9.3-2 Cristy <quetzlzacatenango@image...>
    +
  1723. Don't reuse lock after free (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=29031).
  1724. +
    2016-01-21 6.9.3-2 Dirk Lemstra <dirk@lem.....org>
    +
  1725. Fixed writing DocClass in CALS coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&p=129478).
  1726. +
    2016-01-17 6.9.3-1 Cristy <quetzlzacatenango@image...>
    +
  1727. New version 6.9.3-1, GIT revision 10488:e4f046e:20160116.
  1728. +
    2016-01-06 6.9.3-1 Cristy <quetzlzacatenango@image...>
    +
  1729. Pair AcquireMagickResource with calls to RelinquishMagickResource when resource limits are hit (reference https://github.com/ImageMagick/ImageMagick/pull/75).
  1730. +
  1731. Return non-zero for the -format %b option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=28969).
  1732. +
    2016-01-01 6.9.3-0 Cristy <quetzlzacatenango@image...>
    +
  1733. New version 6.9.3-0, GIT revision 10445:620328b:20160101.
  1734. +
    2015-12-31 6.9.3-0 Cristy <quetzlzacatenango@image...>
    +
  1735. Don't break on euro-style numbers (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=28910).
  1736. +
    2015-12-22 6.9.3-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  1737. 16-bit pnm images have a max value of 65535.
  1738. +
    2015-12-18 6.9.2-10 Cristy <quetzlzacatenango@image...>
    +
  1739. New version 6.9.2-10, GIT revision 10415:e31c09d:20151219.
  1740. +
    2015-12-19 6.9.2-10 Cristy <quetzlzacatenango@image...>
    +
  1741. Fixed compile error when POSIX threads are not defined.
  1742. + https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28791).
    2015-12-18 6.9.2-9 Cristy <quetzlzacatenango@image...>
    +
  1743. New version 6.9.2-9, GIT revision 10402:0027295:20151219
  1744. +
    2015-12-05 6.9.2-9 Dirk Lemstra <dirk@lem.....org>
    +
  1745. Fixed memory leak when reading incorrect PSD files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28791).
  1746. +
    2015-12-05 6.9.2-9 Cristy <quetzlzacatenango@image...>
    +
  1747. Enhance PDF to properly handle unicode titles (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28786).
  1748. +
  1749. Fix memory leak in icon coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=6&t=28848).
  1750. +
    2015-12-05 6.9.2-8 Cristy <quetzlzacatenango@image...>
    +
  1751. New version 6.9.2-8, GIT revision 10374:ac7d144:20151205.
  1752. +
    2015-12-04 6.9.2-8 Cristy <quetzlzacatenango@image...>
    +
  1753. Gray artifacts in large gif when using -layers optimize (reference https://github.com/ImageMagick/ImageMagick/issues/57).
  1754. +
    2015-11-26 6.9.2-7 Cristy <quetzlzacatenango@image...>
    +
  1755. New version 6.9.2-7, GIT revision 10370:eeb7d4e:20151126.
  1756. +
    2015-11-24 6.9.2-7 Dirk Lemstra <dirk@lem.....org>
    +
  1757. The DICOM reader now handles the rescale intercept and slope.
  1758. +
  1759. Added 'bmp3:alpha' option for including the alpha channel when writing an image in the BMP3 format. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=28733).
  1760. +
  1761. Only one thread permitted when delegating to the Ghostscript library under Windows.
  1762. +
    2015-11-14 6.9.2-6 Cristy <quetzlzacatenango@image...>
    +
  1763. New version 6.9.2-6, GIT revision 10341:f408196:20151113.
  1764. +
    2015-11-08 6.9.2-6 Cristy <quetzlzacatenango@image...>
    +
  1765. PixelColor off by one on i386 (reference https://github.com/ImageMagick/ImageMagick/issues/54).
  1766. +
  1767. Eliminate stack overflow (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=28658).
  1768. +
    2015-11-03 6.9.2-6 Dirk Lemstra <dirk@lem.....org>
    +
  1769. Added local contrast enhancement.
  1770. +
  1771. Fixed bug in SetPixelCacheExtent that made images all black (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28514).
  1772. +
  1773. Added support for reading DICOM images with implicit vr little-endian transfer syntax.
  1774. +
    2015-11-02 6.9.2-6 Samuel Thibault <samuel.thibault@...org>
    +
  1775. Added 6dot variant for unicode and iso braille formats (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&p=127111).
  1776. +
    2015-10-31 6.9.2-5 Cristy <quetzlzacatenango@image...>
    +
  1777. New version 6.9.2-5, GIT revision 10316:86a76b6:20151031.
  1778. +
    2015-10-15 6.9.2-5 Dirk Lemstra <dirk@lem.....org>
    +
  1779. Fixed alpha blending issue with semi-transparent pixels in the merged image of PSD files. This can be disabled by setting the option 'psd:alpha-unblend' to 'off' (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28169).
  1780. +
  1781. Fixed issue in jpeg:extent that prevented it from working (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&p=126638).
  1782. +
  1783. Fixed memory leak when reading Photoshop layers in a TIFF file.
  1784. +
    2015-10-12 6.9.2-5 Cristy <quetzlzacatenango@image...>
    +
  1785. Support gradient:bounding-box, gradient:vector, gradient:center, and gradient:radius to shape the gradient rendering.
  1786. +
  1787. Recognize label:@- as stdin (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28501).
  1788. +
  1789. Make commas optional for coordinates (e.g. 0,0 256,256).
  1790. +
    2015-10-10 6.9.2-4 Cristy <quetzlzacatenango@image...>
    +
  1791. New version 6.9.2-4, GIT revision 10273:e00cf21:20151010
  1792. +
    2015-10-08 6.9.2-4 Dirk Lemstra <dirk@lem.....org>
    +
  1793. Fixed accessing subimage in a TIFF photoshop layer (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28469).
  1794. +
  1795. Fixed out of bounds error in -splice (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28466).
  1796. +
    2015-09-25 6.9.2-4 Eric McConville <emcconville@emccon...>
    +
  1797. Created Manhattan Interpolate method for -sparse-color (reference https://github.com/ImageMagick/ImageMagick/pull/36).
  1798. +
    2015-09-22 6.9.2-4 Cristy <quetzlzacatenango@image...>
    +
  1799. Prevent null pointer access (reference https://github.com/ImageMagick/ImageMagick/pull/34).
  1800. +
  1801. Specify histogram code image format implictedly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28412).
  1802. +
  1803. Don't round up for JPEG image resolution (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=28422).
  1804. +
  1805. Read the whole image @ image.jp2[0] or an individual tile @ image.jp2[1], image.jp2[2].
  1806. +
  1807. The -caption option no longer fails for filenames with @ prefix (reference https://github.com/ImageMagick/ImageMagick/issues/43).
  1808. +
  1809. Honor $XDG_CONFIG_HOME and $XDG_CACHE_HOME (reference https://github.com/ImageMagick/ImageMagick/issues/44).
  1810. +
    2015-09-19 6.9.2-3 Cristy <quetzlzacatenango@image...>
    +
  1811. New version 6.9.2-3, GIT revision 10235:c40ee57:20150919
  1812. +
    2015-09-17 6.9.2-2 Dirk Lemstra <dirk@lem.....org>
    +
  1813. Added extra checks to avoid out of bounds error when parsing the 8bim profile (reference https://github.com/ImageMagick/ImageMagick/issues/31).
  1814. +
  1815. Fixed size of memory allocation in RLE coder to avoid segfault (reference https://github.com/ImageMagick/ImageMagick/issues/32).
  1816. +
    2015-09-16 6.9.2-2 Cristy <quetzlzacatenango@image...>
    +
  1817. Add Bootstrap MIT license to ImageMagick web CSS and JS.
  1818. +
  1819. Use modern idiom for autoconf Fix a forgotten dir when regenerating html doc (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28363).
  1820. +
  1821. The -colorspace gray option no long leaves a ghostly shadow (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28350).
  1822. +
    2015-09-14 6.9.2-1 Cristy <quetzlzacatenango@image...>
    +
  1823. New version 6.9.2-1, GIT revision 10201:5879612:20150913.
  1824. +
    2015-09-13 6.9.2-1 Dirk Lemstra <dirk@lem.....org>
    +
  1825. Preserving image origin in TGA files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=28310).
  1826. +
    2015-08-15 6.9.2-1 Cristy <quetzlzacatenango@image...>
    +
  1827. Support color compliance for TXT format (e.g. -define txt:compliance=css) (bug report from Anthony).
  1828. +
  1829. The first argument of a hsl() color is integer, not percentage (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=26072).
  1830. +
  1831. Limit -fx recursive to avoid stack overflow (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28200).
  1832. +
  1833. Support inline images with data URLS.
  1834. +
  1835. Report progress less often (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28299).
  1836. +
  1837. Don't set image colorspace to gray for -alpha copy option.
  1838. +
  1839. Fixed a possible memory leak associated with the -sampling-factor option.
  1840. +
  1841. GetImageType() no longer has side-effects to match behavior of IMv7.
  1842. +
    2015-08-15 6.9.2-0 Cristy <quetzlzacatenango@image...>
    +
  1843. New version 6.9.2-0, GIT revision 10143:3534f6d:20150815.
  1844. +
    2015-08-10 6.9.2-0 Cristy <quetzlzacatenango@image...>
    +
  1845. Swap pixels for -spread command-line option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=28043).
  1846. +
  1847. fx logical operations short circuit (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28179).
  1848. +
  1849. Type cast intensity variable (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28182).
  1850. +
  1851. Fix ModulusAdd & ModulusSubstract for HDRI compositing (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28186).
  1852. +
    2015-07-25 6.9.2-0 Dirk Lemstra <dirk@lem.....org>
    +
  1853. Added "-set colorspace:auto-grayscale false" that will prevent automatic conversion to grayscale inside coders that support grayscale.
  1854. +
  1855. Fixed -list weight and the options for -weight.
  1856. +
  1857. Added fontFamily, fontStyle, fontWeight and textUnderColor to the Image class of Magick++.
  1858. +
  1859. Fixed reading Photoshop layers of LSB TIFF files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=28045).
  1860. +
  1861. Fixed memory leak in font cache under Windows (reference https://imagemagick.org/discourse-server//viewtopic.html?f=6&t=28191).
  1862. +
    2015-07-25 6.9.1-10 Cristy <quetzlzacatenango@image...>
    +
  1863. New version 6.9.1-10, SVN revision 19269.
  1864. +
    2015-07-20 6.9.1-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  1865. coders/magick.c: added "-define h:format=FMT" and "-define magick:format=FMT" options. FMT can be any output format supported by ImageMagick except "H" or "MAGICK". If this define is omitted, the encoder uses GIF by default for pseudoclass images and PNM for directclass images, as previously. Made "MAGICK" (read-write) and "H" (write-only) visible in the format list.
  1866. +
    2015-07-18 6.9.1-10 Dirk lemstra <dirk@lem.....org>
    +
  1867. Removed incorrect EOF check in the DDS reader (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28065).
  1868. +
    2015-07-18 6.9.1-10 Cristy <quetzlzacatenango@image...>
    +
  1869. Fixed undefined behaviors (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28067).
  1870. +
  1871. Return exception message for unknown image properties.
  1872. +
  1873. Color shift removed when reading transparent gray images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28081)
  1874. +
    2015-07-18 6.9.1-9 Cristy <quetzlzacatenango@image...>
    +
  1875. New version 6.9.1-9, SVN revision 19200.
  1876. +
    2015-07-12 6.9.1-9 Dirk Lemstra <dirk@lem.....org>
    +
  1877. Fixed issue with radial gradient in MVG (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27995).
  1878. +
    2015-07-11 6.9.1-8 Cristy <quetzlzacatenango@image...>
    +
  1879. New version 6.9.1-8, SVN revision 19167.
  1880. +
    2015-06-25 6.9.1-8 Cristy <quetzlzacatenango@image...>
    +
  1881. Correct install location of the Magick++ headers (reference https://github.com/ImageMagick/ImageMagick/pull/17/commits).
  1882. +
  1883. Different gif cropping behavior between versions (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28013).
  1884. +
  1885. Cannot read properly simple psd file (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=28002).
  1886. +
    2015-07-04 6.9.1-7 Cristy <quetzlzacatenango@image...>
    +
  1887. New version 6.9.1-7, SVN revision 19121.
  1888. +
    2015-06-27 6.9.1-7 Eric Dalquist
    +
  1889. Fixed and escaped output of the json coder. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&p=27894).
  1890. +
    2015-06-25 6.9.1-7 Cristy <quetzlzacatenango@image...>
    +
  1891. Support BPG image format (respects -quality option).
  1892. +
  1893. A bordered transparent image now remains transparent (reference https://imagemagick.org/discourse-server//viewtopic.html?f=5&t=27937).
  1894. +
  1895. The -update option behavior restored (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=27939).
  1896. +
    2015-06-13 6.9.1-6 Cristy <quetzlzacatenango@image...>
    +
  1897. New version 6.9.1-6, SVN revision 18945.
  1898. +
    2015-06-14 6.9.1-6 Cristy <quetzlzacatenango@image...>
    +
  1899. Cache cloning on disk optimized with sendfile() (if available).
  1900. +
  1901. Add an additional check for end-of-file for the RLE coder (reference https://imagemagick.org/discourse-server//viewforum.html?f=3&t=27870).
  1902. +
  1903. Respect resource limits in AVS coder.
  1904. +
    2015-06-13 6.9.1-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  1905. Reverted change to 6.9.1-3 that skipped palette-building.
  1906. +
    2015-06-13 6.9.1-5 Cristy <quetzlzacatenango@image...>
    +
  1907. New version 6.9.1-5, SVN revision 18882.
  1908. +
    2015-06-03 6.9.1-5 Cristy <quetzlzacatenango@image...>
    +
  1909. Use correct scale when interpretting alpha (e.g. rgba(0,0,0,1)).
  1910. +
  1911. DrawGetVectorGraphics() now returns proper XML (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27751).
  1912. +
  1913. Support writing EXR files with different color types (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=27759).
  1914. +
  1915. Prefer PKG_CHECK_MODULES() when searching for delegate libraries.
  1916. +
  1917. Throw exception if frame option bevel exceeds to the image width / height.
  1918. +
  1919. Resolve undefined behaviors (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27811).
  1920. +
    2015-06-01 6.9.1-4 Cristy <quetzlzacatenango@image...>
    +
  1921. New version 6.9.1-4, SVN revision 18697.
  1922. +
    2015-06-01 6.9.1-4 Cristy <quetzlzacatenango@image...>
    +
  1923. Support 'restrict' keyword under Windows.
  1924. +
    2015-05-25 6.9.1-4 Dirk Lemstra <dirk@lem.....org>
    +
  1925. Added support for reading a user supplied layer mask in PSD files.
  1926. +
  1927. Added support for reading photoshop layers in TIFF files.
  1928. +
    2015-05-24 6.9.1-3 Cristy <quetzlzacatenango@image...>
    +
  1929. New version 6.9.1-3, SVN revision 18623.
  1930. +
    2015-05-03 6.9.1-3 Dirk Lemstra <dirk@lem.....org>
    +
  1931. Fixed transparency issue with 16-bit tga files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27469).
  1932. +
  1933. Fixed writing label and comment in tiff images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25516).
  1934. +
  1935. Jpeg images no longer have pixels per inch as a default value for density units when the density is not set (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27589).
  1936. +
  1937. Added support for setting the font color with -fill to the pango coder.
  1938. +
    2015-05-03 6.9.1-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  1939. Fixed bug with "-define png:format=x" in png.c, introduced in version 6.8.9-0, that caused the define to be ignored.
  1940. +
  1941. Replaced some dead code in ReadJNGImage with an assert().
  1942. +
  1943. Avoid palette-building when writing a grayscale PNG (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27580).
  1944. +
    2015-04-20 6.9.1-3 Cristy <quetzlzacatenango@image...>
    +
  1945. Support -define compose:clamp=false option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26946).
  1946. +
  1947. Don't extend any user supplied image buffer in SeekBlob() (bug report from a.chernij@corp...).
  1948. +
  1949. Improved reproducible builds (reference https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=783933).
  1950. +
  1951. Draw a rectangle of width & height of 1 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24874).
  1952. +
    2015-04-19 6.9.1-2 Cristy <quetzlzacatenango@image...>
    +
  1953. New version 6.9.1-2, SVN revision 18429.
  1954. +
    2015-04-09 6.9.1-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  1955. Avoid using a NULL alpha_image or color_image in the JNG decoder.
  1956. +
    2015-04-07 6.9.1-2 Cristy <quetzlzacatenango@image...>
    +
  1957. Fix JPEG-2000 transparency on write (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27304).
  1958. +
  1959. Identify now identifies PSD (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26948).
  1960. +
  1961. Speed up writing to TGA (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27369).
  1962. +
    2015-04-06 6.9.1-2 Dirk Lemstra <dirk@lem.....org>
    +
  1963. Reduce draw epsilon to increase mathematical stability.
  1964. +
  1965. Fixed UTF8 issue when determining the current working directory on Windows (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27295).
  1966. +
    2015-04-04 6.9.1-1 Cristy <quetzlzacatenango@image...>
    +
  1967. New version 6.9.1-1, SVN revision 18308.
  1968. +
    2015-03-21 6.9.1-1 Cristy <quetzlzacatenango@image...>
    +
  1969. Skip empty frames when comparing layers (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27234).
  1970. +
    2015-03-21 6.9.1-0 Cristy <quetzlzacatenango@image...>
    +
  1971. New version 6.9.1-0, SVN revision 18245.
  1972. +
    2015-03-17 6.9.1-0 Cristy <quetzlzacatenango@image...>
    +
  1973. Grayscale DPX image files are no longer skewed (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27209).
  1974. +
    2015-03-16 6.9.1-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  1975. Fix integer overflow when scaling a 1-bit sample to Q64 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27195).
  1976. +
    2015-03-01 6.9.0-10 Cristy <quetzlzacatenango@image...>
    +
  1977. New version 6.9.0-10, SVN revision 18299.
  1978. +
    2015-03-03 6.9.0-10 Cristy <quetzlzacatenango@image...>
    +
  1979. Account for differences in image size when comparing two images (bug report from Dirk).
  1980. +
  1981. Set an upper ceiling compression with -quality and jpeg:extent (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=27071).
  1982. +
    2015-03-01 6.9.0-9 Cristy <quetzlzacatenango@image...>
    +
  1983. New version 6.9.0-9, SVN revision 18179.
  1984. +
    2015-02-22 6.9.0-9 Cristy <quetzlzacatenango@image...>
    +
  1985. Writing histograms / mpeg working again (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27089).
  1986. +
  1987. The -linear-stretch option worked for Q16 but not Q32 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27112).
  1988. +
    2015-02-22 6.9.0-8 Cristy <quetzlzacatenango@image...>
    +
  1989. Bogus Release, withdrawn.
  1990. +
    2015-02-22 6.9.0-7 Cristy <quetzlzacatenango@image...>
    +
  1991. New version 6.9.0-7, SVN revision 18067.
  1992. +
    2015-02-15 6.9.0-7 Cristy <quetzlzacatenango@image...>
    +
  1993. Line strokes appeared too thin (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26927).
  1994. +
  1995. Keep text in caption area (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22504).
  1996. +
    2015-02-14 6.9.0-6 Cristy <quetzlzacatenango@image...>
    +
  1997. New version 6.9.0-6, SVN revision 18010.
  1998. +
    2015-02-12 6.9.0-6 Dirk Lemstra <dirk@lem.....org>
    +
  1999. Fixed command line execution in Windows for delegates that move files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=27027).
  2000. +
    2015-02-10 6.9.0-6 Cristy <quetzlzacatenango@image...>
    +
  2001. A transient bug for the write MSL element (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27022).
  2002. +
    2015-02-08 6.9.0-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  2003. Remove uninitialized, unused "p++" from coders/png.c, MNG reader.
  2004. +
  2005. Initialize "length" in coders/png.c, WriteJNGImage().
  2006. +
  2007. Fix signed/unsigned mismatch in coders/png.c, MNG reader.
  2008. +
    2015-02-08 6.9.0-5 Cristy <quetzlzacatenango@image...>
    +
  2009. New version 6.9.0-5, SVN revision 17946.
  2010. +
    2015-01-30 6.9.0-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  2011. In coders/gif.c, quiet two warnings.
  2012. +
    2015-01-24 6.9.0-5 Dirk Lemstra <dirk@lem.....org>
    +
  2013. Fixed iccColorProfile() in Magick++ (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=26910).
  2014. +
  2015. Fixed infinite loop in HDR reader (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26929).
  2016. +
    2015-01-23 6.9.0-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  2017. Check lengths of certain MNG chunks before reading them.
  2018. +
  2019. In the PNG codec, check status wherever a function returns it.
  2020. +
    2015-01-18 6.9.0-5 Cristy <quetzlzacatenango@image...>
    +
  2021. Remove possible resource memory leak in a multi-threaded program (bug report and patch from David Chapman <d...@acm.org>.
  2022. +
  2023. Small optimization to pixel cache.
  2024. +
  2025. More image sanity checks.
  2026. +
  2027. Support writing base64-encoded images (e.g
    convert logo: inline:jpeg:logo.txt).
    +
  2028. Repair small TIFF leak when pinging (patch provided by Andrey Cherniy).
  2029. +
    2015-01-16 6.9.0-4 Cristy <quetzlzacatenango@image...>
    +
  2030. New version 6.9.0-4, SVN revision 17697.
  2031. +
    2015-01-07 6.9.0-4 Cristy <quetzlzacatenango@image...>
    +
  2032. Additional coder sanity checks (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26842, https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26682).
  2033. +
    2015-01-05 6.9.0-4 Dirk Lemstra <dirk@lem.....org>
    +
  2034. Report Ghostscript version when -verbose is used and when an exception is raised.
  2035. +
  2036. Fixed invalid path check in MagickCoreGenesis under Windows and disabled ProvideDllMain by default (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&p=118875).
  2037. +
    2015-01-01 6.9.0-3 Cristy <quetzlzacatenango@image...>
    +
  2038. New version 6.9.0-3, SVN revision 17537.
  2039. +
    2015-01-01 6.9.0-3 Cristy <quetzlzacatenango@image...>
    +
  2040. ImageMagick builds when HDRI is enabled (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26803).
  2041. +
    2014-12-31 6.9.0-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  2042. Don't read beyond the end of a tEXt keyword when checking for Raw profile.
  2043. +
    2014-12-27 6.9.0-2 Cristy <quetzlzacatenango@image...>
    +
  2044. New version 6.9.0-2, SVN revision 17468.
  2045. +
    2014-12-14 6.9.0-1 Dirk Lemstra <dirk@snakeware...>
    +
  2046. Added support for reading EXR files to the Windows distribution.
  2047. +
  2048. Fixed enabling alpha in 32-bit BMP files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26662).
  2049. +
  2050. Added support for writing 16-bit TGA files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=26693).
  2051. +
  2052. Improved performance of dds:cluster-fit when OpenMP is enabled.
  2053. +
  2054. Added support for distributed pixel cache to the Windows distribution.
  2055. +
    2014-12-04 6.9.0-1 Alexey Dolgavin <dolgavin.alexey@gmail...>
    +
  2056. Fix ImageMagick crashes while read EXIF from TIFF.
  2057. +
    2014-11-20 6.9.0-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  2058. Don't handle a "previous" image in the PNG or JNG decoder.
  2059. +
  2060. Don't override gamma with 1.0 when reading a grayscale PNG image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26576).
  2061. +
  2062. Update progress monitor for every PNG row instead of every pass (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=26589).
  2063. +
  2064. Reject input PNG with dimensions larger than specified with -limit width and -limit height.
  2065. +
    2014-11-20 6.9.0-1 Cristy <quetzlzacatenango@image...>
    +
  2066. Fix double free / invalid read when converting jpg to pdb (thanks to Hanno).
  2067. +
  2068. Maximum XWD image size is 64Kx64K (thanks to Hanno).
  2069. +
  2070. Maximum DPX number of elements is 8 (thanks to Hanno).
  2071. +
  2072. Transient problem with SVG (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26587).
  2073. +
  2074. Numerous buffer overflow fixes (thanks to Gynvael Coldwind and Mateusz Jurczyk of the Google Security Team).
  2075. +
  2076. Additional PNM sanity checks (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26682).
  2077. +
  2078. The SetImageBias() bias value is no longer ignored (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25732).
  2079. +
  2080. Area crop now returns the expected number of tiles (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26701).
  2081. +
  2082. Respect TGA ColorMapIndex field (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26738).
  2083. +
  2084. Clang does not support __alloc_size__, fix fabs() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26739).
  2085. +
  2086. Support width and height resource limits.
  2087. +
  2088. Don't read TIFF profiles when pinging (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=26670).
  2089. +
    2014-11-16 6.9.0-0 Cristy <quetzlzacatenango@image...>
    +
  2090. New version 6.9.0-0, SVN revision 17067.
  2091. +
    2014-11-03 6.9.0-0 Cristy <quetzlzacatenango@image...>
    +
  2092. Check for zero-sized rendered SVG image (bug report from Vladimir Davydov).
  2093. +
    2014-11-01 6.8.9-10 Cristy <quetzlzacatenango@image...>
    +
  2094. New version 6.8.9-10, SVN revision 16910.
  2095. +
    2014-10-29 6.8.9-10 Cristy <quetzlzacatenango@image...>
    +
  2096. EXIF directory offsets must be greater than 0 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26456).
  2097. +
  2098. Accept morphology kernels from files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=26466).
  2099. +
  2100. Don't optimize JPEG compression by default (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26482).
  2101. +
    2014-10-26 6.8.9-10 Dirk Lemstra <dirk@snakeware...>
    +
  2102. Added support for reading jpeg compressed YCCK tiff files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24412).
  2103. +
  2104. Fixed reading DICOM files with big endian transfer syntax (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26448).
  2105. +
    2014-10-25 6.8.9-9 Cristy <quetzlzacatenango@image...>
    +
  2106. New version 6.8.9-9, SVN revision 16819.
  2107. +
    2014-10-03 6.8.9-9 Dirk Lemstra <dirk@snakeware...>
    +
  2108. Added sixel coder created by Hayaki Saito (@kefir_).
  2109. +
  2110. Fixed buffer overflow in PCX and DCM coder (bug report from Hanno Böck).
  2111. +
  2112. Added support for reading/writing the tIME chunk in the PNG coder.
  2113. +
  2114. Added eps:fit-page option to the PS coder to set -dEPSFitPage.
  2115. +
  2116. Improved reporting tiff:alpha and allowed setting tiff:alpha to unspecified.
  2117. +
    2014-09-30 6.8.9-9 Cristy <quetzlzacatenango@image...>
    +
  2118. Support xyY colorspace (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=26324).
  2119. +
  2120. Reduce noise while preserving edges with the -kuwahara option.
  2121. +
  2122. Off-by-one count when parsing an 8BIM profile.
  2123. +
  2124. Locale.c won't build if uselocale found but strtod_l isn't (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26362).
  2125. +
  2126. OpenCL no longer benchmarks are run on every initialization (patch submitted by Jan Steffens).
  2127. +
  2128. Don't clone a 0x0 image (bug report from Hanno Böck).
  2129. +
    2014-09-21 6.8.9-8 Cristy <quetzlzacatenango@image...>
    +
  2130. New version 6.8.9-8, SVN revision 16502.
  2131. +
    2014-09-16 6.8.9-8 Cristy <quetzlzacatenango@image...>
    +
  2132. JPEG library version >= 80 is thread safe (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=25495).
  2133. +
    2014-08-31 6.8.9-8 Dirk Lemstra <dirk@snakeware...>
    +
  2134. Added support for some legacy dds formats (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=26184).
  2135. +
    2014-08-16 6.8.9-7 Cristy <quetzlzacatenango@image...>
    +
  2136. New version 6.8.9-7, SVN revision 16330.
  2137. +
    2014-08-14 6.8.9-7 Cristy <quetzlzacatenango@image...>
    +
  2138. Fix off by one buglet when extracting profiles 8BIM (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26095).
  2139. +
    2014-07-31 6.8.9-7 Dirk Lemstra <dirk@snakeware...>
    +
  2140. Fixed bug when reading 1 bit PSD. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=26015).
  2141. +
    2014-07-25 6.8.9-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  2142. Relocate initialization of "image_colors" in the PNG encoder, to avoid a possible use of uninitialized variable.
  2143. +
    2014-07-25 6.8.9-6 Cristy <quetzlzacatenango@image...>
    +
  2144. New version 6.8.9-6, SVN revision 16211.
  2145. +
    2014-07-24 6.8.9-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  2146. Use IsOptionMember() instead of LocaleNCompare() in coders/png.c to parse the list of excluded and included PNG chunks.
  2147. +
    2014-07-19 6.8.9-6 Dirk Lemstra <dirk@snakeware...>
    +
  2148. Fixed fill-rule in SVG clip path (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=25882).
  2149. +
    2014-07-14 6.8.9-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  2150. Removed some dead code (testing image->matte) in PNG64 encoder.
  2151. +
    2014-07-07 6.8.9-6 Dirk Lemstra <dirk@snakeware...>
    +
  2152. Added support for R5G6B5, RGB5A1 and RGBA4 dds files.
  2153. +
    2014-07-01 6.8.9-6 Cristy <quetzlzacatenango@image...>
    +
  2154. Write LAB pixels as percentages in the TXT image format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25830).
  2155. +
  2156. Throw exception when image morphology differs when comparing (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25927).
  2157. +
  2158. Remove mogrify backup file (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25683).
  2159. +
  2160. Read WEBP images from STDIN (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25886).
  2161. +
    2014-07-01 6.8.9-5 Cristy <quetzlzacatenango@image...>
    +
  2162. New version 6.8.9-5, SVN revision 16123.
  2163. +
    2014-06-28 6.8.9-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  2164. Do not let libpng16 check ICC/sRGB profiles in non-debug runs; we do it ourselves anyway. Avoids emitting "known incorrect profile" warnings. For strict profile checking and warning, use "-debug coder".
  2165. +
    2014-06-27 6.8.9-5 Dirk Lemstra <dirk@snakeware...>
    +
  2166. Disabled OpenCL acceleration when image has a 'mask' or 'clip-mask'.
  2167. +
    2014-06-25 6.8.9-5 Cristy <quetzlzacatenango@image...>
    +
  2168. Use -define profile:skip=icc, for example, to skip color profiles on read.
  2169. +
    2014-06-23 6.8.9-4 Cristy <quetzlzacatenango@image...>
    +
  2170. New version 6.8.9-4, SVN revision 16057.
  2171. +
    2014-06-15 6.8.9-4 Cristy <quetzlzacatenango@image...>
    +
  2172. Support RMS argument for -evaluate-sequence and -statistic options.
  2173. +
  2174. Fix lseek define for a successful compile under 64-bit MinGW.
  2175. +
  2176. Pipe image to display program no longer reports an exception (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23532).
  2177. +
  2178. Check that profile is non-NULL in coders/tiff.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25770).
  2179. +
    2014-06-08 6.8.9-3 Cristy <quetzlzacatenango@image...>
    +
  2180. New version 6.8.9-3, SVN revision 15975.
  2181. +
    2014-06-07 6.8.9-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  2182. Quiet warning about unused variable "skip_to_iend" in coders/png.c.
  2183. +
    2014-06-07 6.8.9-3 Dirk Lemstra <dirk@snakeware...>
    +
  2184. Fixed creation of SVG from 8bim clip path. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=25594).
  2185. +
    2014-06-02 6.8.9-3 Cristy <quetzlzacatenango@image...>
    +
  2186. The -version option returns 0 status (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25667).
  2187. +
  2188. The inline coder can now read from standard input (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25641).
  2189. +
  2190. Add '=' character to the sanitize whitelist.
  2191. +
    2014-05-30 6.8.9-2 Cristy <quetzlzacatenango@image...>
    +
  2192. New version 6.8.9-2, SVN revision 15932.
  2193. +
    2014-05-18 6.8.9-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  2194. Fixed some bugs in the PNG codec discovered by coverity analysis.
  2195. +
    2014-05-14 6.8.9-2 Cristy <quetzlzacatenango@image...>
    +
  2196. The -fx equality operator returns a proper boolean result now (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25580).
  2197. +
  2198. Permit spaces in the gradient color specification (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25614).
  2199. +
  2200. Fix IdentifyImage() crash when image->magick member is null (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25615).
  2201. +
  2202. The -format M and Y channels are no longer reversed (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25633).
  2203. +
  2204. Remove Makefile race condition where two targets attempt to install magick-baseconfig.h (reference http://git.buildroot.net/buildroot/commit/?id=7395ee9d3b88e45798143e05a28d6d4b51409130)
  2205. +
  2206. Fix memory leak in BlobToStringInfo() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25639).
  2207. +
  2208. In certain cases, -adaptive-sharpen failed to sharpen (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23211
  2209. +
    2014-05-12 6.8.9-2 Dirk Lemstra <dirk@snakeware...>
    +
  2210. Bump major Magick++ library version.
  2211. +
  2212. Added support for writing RLE compressed TGA files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12335).
  2213. +
  2214. Improved performance of parsing the xmp profile (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25612).
  2215. +
  2216. Fixed detecting transparency in PSD files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25634).
  2217. +
    2014-05-09 6.8.9-1 Cristy <quetzlzacatenango@image...>
    +
  2218. New version 6.8.9-1, SVN revision 15697.
  2219. +
    2014-04-22 6.8.9-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  2220. Fixed bug with the PNG00 subformat when the original format was PNG32.
  2221. +
  2222. The "-strip" option now only removes profiles and comments from PNG output. Previously the background, density, and other metadata were also discarded.
  2223. +
    2014-04-22 6.8.9-1 Cristy <quetzlzacatenango@image...>
    +
  2224. Support new -hough-lines option.
  2225. +
  2226. Support new -mean-shift option.
  2227. +
  2228. identify -units without argument no longer faults (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25542).
  2229. +
  2230. Require OpenJP2 version 2.1.0 (opj_stream_set_user_data() method signature change between 2.0.0 and 2.1.0).
  2231. +
    2014-04-20 6.8.9-1 Dirk Lemstra <dirk@snakeware...>
    +
  2232. Added image moments, canny edge and hough line to Magick++.
  2233. +
  2234. The 8bim profile will be updated when the icc/iptc/xmp profile is changed.
  2235. +
  2236. Fix for stack overflow in DestroyXMLTree in Windows (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25457).
  2237. +
  2238. Added new coder for VIPS image format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=25445).
  2239. +
  2240. Moved detection of type to a separate method in Magick++. The type() method no longer modifies the type of the image. Use determineType() instead.
  2241. +
  2242. Improved error messages when a coder uses Ghostscript.
  2243. +
    2014-04-11 6.8.9-0 Cristy <quetzlzacatenango@image...>
    +
  2244. New version 6.8.9-0, SVN revision 15441.
  2245. +
    2014-04-03 6.8.9-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  2246. Fixed bug with -strip failing to exclude PNG chunks (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25353).
  2247. +
    2014-03-30 6.8.9-0 Dirk Lemstra <dirk@snakeware...>
    +
  2248. Added new coder to take a screen shot of a monitor in Windows (reference https://imagemagick.org/discourse-server//viewtopic.html?f=23&t=25191).
  2249. +
    2014-03-24 6.8.9-0 Cristy <quetzlzacatenango@image...>
    +
  2250. Don't transform sRGB compatible colorspaces to sRGB, doing so inadvertently promotes colormapped images to DirectClass.
  2251. +
  2252. Use temporary path rather then current working directory (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25313).
  2253. +
  2254. Support -canny edge detection option.
  2255. +
  2256. Use MAGICKCORE_LIBOPENJP2_DELEGATE instead of MAGICKCORE_JP2_DELEGATE (reference imagemagick.org/discourse-server/viewtopic.html?f=3&t=25376).
  2257. +
    2014-03-28 6.8.8-10 Cristy <quetzlzacatenango@image...>
    +
  2258. New version 6.8.8-9, SVN revision 15239.
  2259. +
    2014-03-23 6.8.8-10 Cristy <quetzlzacatenango@image...>
    +
  2260. Although they are internal methods, deprecate InitializeModuleList(), LoadMimeLists(), and RelinquishCommandQueue() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25263).
  2261. +
    2014-03-20 6.8.8-9 Cristy <quetzlzacatenango@image...>
    +
  2262. New version 6.8.8-9, SVN revision 15192.
  2263. +
    2014-03-16 6.8.8-9 Glenn Randers-Pehrson <glennrp@image...>
    +
  2264. Do not block threads in the png codec when PNG_SETJMP_SUPPORTED is not defined (reference https://imagemagick.org/discourse-server//viewtopic.html?f=23&t=25218).
  2265. +
    2014-03-15 6.8.8-9 Dirk Lemstra <dirk@snakeware...>
    +
  2266. Added tiff:ignore-tags to ignore specific tags.
  2267. +
  2268. Added orderedDither, selectiveBlur, separate, sepiaTone, sketch, smushImages, tint, uniqueColors and vignette to Magick++.
  2269. +
    2014-03-11 6.8.8-9 Cristy <quetzlzacatenango@image...>
    +
  2270. The -define jpeg:extent option overrides the image quality (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25200).
  2271. +
    2014-03-09 6.8.8-8 Cristy <quetzlzacatenango@image...>
    +
  2272. New version 6.8.8-8, SVN revision 15097.
  2273. +
    2014-03-04 6.8.8-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  2274. Reset colorspace to Grayscale when reading a gray PNG image with gamma > 0.75 instead of when gamma==1.0 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25136).
  2275. +
    2014-02-22 6.8.8-8 Dirk Lemstra <dirk@snakeware...>
    +
  2276. The PSD reader creates a merged image if the image does not contain one.
  2277. +
  2278. Added option pdf:fit-page to scale a pdf to the specified size (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=25044).
  2279. +
  2280. The ResolutionInfo in the 8BIM profile will be updated when an image is written.
  2281. +
  2282. Fixed UTF8 issues and added support for reading files with long path names for the Windows distribution.
  2283. +
    2014-02-21 6.8.8-8 Cristy <quetzlzacatenango@image...>
    +
  2284. Convert linear RGB to sRGB before writing the Targa image format.
  2285. +
  2286. Make sure we use the secure C library functions when compiling ImageMagick on Windows.
  2287. +
  2288. Tweak color reduction optimization to return a full color palette (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=25098).
  2289. +
  2290. Patch configure.ac to support FlashPix under Debian (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25140).
  2291. +
  2292. OpenCL support writes to $HOME/.config/ImageMagick, if the path does not exist, two calls to mkdir() are required (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25080).
  2293. +
  2294. Replace MAGICKCORE_JP2_DELEGATE with MAGICKCORE_LIBOPENJP2_DELEGATE in magick/static.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25153).
  2295. +
  2296. Eliminate thread race condition (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=25168).
  2297. +
    2014-02-18 6.8.8-7 Cristy <quetzlzacatenango@image...>
    +
  2298. New version 6.8.8-7, SVN revision 14908.
  2299. +
    2014-02-16 6.8.8-7 Cristy <quetzlzacatenango@image...>
    +
  2300. Prevent possible buffer overflow in messaging system.
  2301. +
    2014-02-16 6.8.8-7 Dirk Lemstra <dirk@snakeware...>
    +
  2302. Improved detection of JPEG 2000 code streams and .j2c support (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=24942).
  2303. +
  2304. Added morphology to Magick++.
  2305. +
    2014-02-13 6.8.8-6 Cristy <quetzlzacatenango@image...>
    +
  2306. New version 6.8.8-6, SVN revision 14868.
  2307. +
    2014-02-13 6.8.8-6 Cristy <quetzlzacatenango@image...>
    +
  2308. identify -define identify:locate=maximum locates the position of the maximum value (stopped working in 6.8.8-5).
  2309. +
    2014-02-03 6.8.8-5 Cristy <quetzlzacatenango@image...>
    +
  2310. New version 6.8.8-5, SVN revision 14838.
  2311. +
    2014-01-31 6.8.8-5 Cristy <quetzlzacatenango@image...>
    +
  2312. Fix case where an image moment might have a mass of 0 or a Hu moment might be 0.
  2313. +
  2314. Enhance the TXT coder to read RGB percent values, e.g. 10.008% (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24934).
  2315. +
    2014-01-30 6.8.8-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  2316. Fixed new "-define png:swap-bytes" option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=24818).
  2317. +
    2014-01-29 6.8.8-4 Cristy <quetzlzacatenango@image...>
    +
  2318. New version 6.8.8-4, SVN revision 14676.
  2319. +
    2014-01-29 6.8.8-4 Cristy <quetzlzacatenango@image...>
    +
  2320. Remove comma at end of enumerator list, magick/compare.h.
  2321. +
    2014-01-28 6.8.8-4 Dirk Lemstra <dirk@snakeware...>
    +
  2322. Added transpose and transverse to Magick++. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=24884).
  2323. +
    2014-01-25 6.8.8-3 Cristy <quetzlzacatenango@image...>
    +
  2324. New version 6.8.8-3, SVN revision 14651.
  2325. +
    2014-01-18 6.8.8-3 Dirk Lemstra <dirk@snakeware...>
    +
  2326. Added ResourceLimits class and text direction/gravity to Magick++.
  2327. +
  2328. Added support for defining dimensions with icon:auto-resize (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=24796).
  2329. +
    2014-01-16 6.8.8-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  2330. Added "-define png:swap-bytes" option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=24818).
  2331. +
  2332. Added image->duration to image.h, calculate duration in gif.c, and report duration in identify.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=23276).
  2333. +
    2014-01-15 6.8.8-3 Cristy <quetzlzacatenango@image...>
    +
  2334. The -type truecolor option for a grayscale image returns RGB JPEG (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24814).
  2335. +
  2336. Support JSON coder (.e.g. convert image.jpg image.json).
  2337. +
    2014-01-10 6.8.8-2 Cristy <quetzlzacatenango@image...>
    +
  2338. New version 6.8.8-2, SVN revision 14347.
  2339. +
    2014-01-09 6.8.8-2 Dirk Lemstra <dirk@snakeware...>
    +
  2340. Added option 'icon:auto-resize' to automatically store multiple sizes in an ico image (requires 256x256 input image).
  2341. +
  2342. Added text kerning/spacing to Magick++. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=23&t=24716).
  2343. +
    2013-12-30 6.8.8-2 Cristy <quetzlzacatenango@image...>
    +
  2344. The -evaluate-sequence sum returns a proper alpha channel now (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24704).
  2345. +
  2346. Support OpenJPEG for JPEG-2000 support.
  2347. +
  2348. Support IsMagickWandInstantiated() method (reference https://imagemagick.org/discourse-server//viewtopic.html?f=6&t=24724).
  2349. +
  2350. LevelColorsImageChannel() returns proper status (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24751).
  2351. +
  2352. Generate a proper SVG clipping path (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24752).
  2353. +
  2354. Return image moments with the identify -moments -verbose options.
  2355. +
  2356. Perceptual hash metric for compare utility: -metric PHASH (algorithm by Fred Wienhaus).
  2357. +
    2013-12-30 6.8.8-1 Cristy <quetzlzacatenango@image...>
    +
  2358. New version 6.8.8-1, SVN revision 14087.
  2359. +
    2013-12-27 6.8.8-1 Cristy <quetzlzacatenango@image...>
    +
  2360. Support points argument for draw MSL element.
  2361. +
  2362. Fix misplaced closing parenthesis for strncmp() call in magick/xml-tree.c.
  2363. +
  2364. The -page option now correctly sets the image page offset (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24701).
  2365. +
    2013-12-26 6.8.8-1 Dirk Lemstra <dirk@snakeware...>
    +
  2366. Added support for reading zip compressed PSD files. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24676).
  2367. +
    2013-12-25 6.8.8-0 Cristy <quetzlzacatenango@image...>
    +
  2368. New version 6.8.8-0, SVN revision 14027.
  2369. +
    2013-12-23 6.8.8-0 Cristy <quetzlzacatenango@image...>
    +
  2370. Blurring with transparency no longer returns a halo (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24665).
  2371. +
  2372. Eliminate ICC profile memory leak for JP2 coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=24679).
  2373. +
    2012-12-21 6.8.8-0 Dirk Lemstra <dirk@snakeware...>
    +
  2374. Made librsvg the default svg library for the windows distribution.
  2375. +
    2013-12-10 6.8.7-10 Cristy <quetzlzacatenango@image...>
    +
  2376. New version 6.8.7-10, SVN revision 13965.
  2377. +
    2013-12-10 6.8.7-10 SiuChi Chan <...>
    +
  2378. Fix crash when using -resize with GPU acceleration (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24603).
  2379. +
    2013-12-08 6.8.7-9 Cristy <quetzlzacatenango@image...>
    +
  2380. New version 6.8.7-9, SVN revision 13950.
  2381. +
    2013-12-05 6.8.7-9 SiuChi Chan <...>
    +
  2382. Silence warning related to GPU memory issues.
  2383. +
  2384. Check if OpenCL is disabled in checkOpenCLEnvironment() method.
  2385. +
  2386. Turn off OpenCL path for Intel OpenCL to avoid crash when not enough memory.
  2387. +
  2388. Fixed a bug for OpenCL convolution.
  2389. +
  2390. Reduce compiler warnings.
  2391. +
    2013-12-03 6.8.7-9 Glenn Randers-Pehrson <glennrp@image...>
    +
  2392. Fixed bug in coders/png.c that caused -define png:color-type=0 to fail (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=24568).
  2393. +
    2013-11-30 6.8.7-9 Dirk Lemstra <dirk@snakeware...>
    +
  2394. Fixed bug in automatic selection of OpenCL device (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24542).
  2395. +
  2396. Fixed transparency for 32 bits BMP.
  2397. +
    2013-11-28 6.8.7-9 Cristy <quetzlzacatenango@image...>
    +
  2398. The -type bilevel option sometimes returned an all white image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24444).
  2399. +
  2400. Check blue channel threshold for -solarize option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24473).
  2401. +
    2013-11-27 6.8.7-8 Cristy <quetzlzacatenango@image...>
    +
  2402. New version 6.8.7-8, SVN revision 13850.
  2403. +
    2013-11-27 6.8.7-8 SiuChi Chan <...>
    +
  2404. Add an OpenCL-accelerated analog of AddNoiseImage().
  2405. +
    2013-11-23 6.8.7-7 Cristy <quetzlzacatenango@image...>
    +
  2406. New version 6.8.7-7, SVN revision 13827.
  2407. +
    2013-11-23 6.8.7-7 SiuChi Chan <...>
    +
  2408. Simplified interface to initialize the OpenCL environment.
  2409. +
  2410. Automatic OpenCL device selection algorithm.
  2411. +
  2412. Support ModulateImage() acceleration.
  2413. +
  2414. Reduce the memory requirement for accelerated blur and unsharp mask.
  2415. +
    2013-11-16 6.8.7-6 Cristy <quetzlzacatenango@image...>
    +
  2416. New version 6.8.7-6, SVN revision 13767.
  2417. +
    2013-11-14 6.8.7-6 Cristy <quetzlzacatenango@image...>
    +
  2418. Fix possible memory corruption when writing PSD images (bug report from Justin Grant).
  2419. +
  2420. Constrain color reduction acceleration to positive integers (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=24459).
  2421. +
  2422. fx:maxima.a now returns the alpha value rather than opacity (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24461).
  2423. +
    2013-11-08 6.8.7-5 Cristy <quetzlzacatenango@image...>
    +
  2424. New version 6.8.7-5, SVN revision 13682.
  2425. +
    2013-11-03 6.8.7-5 Cristy <quetzlzacatenango@image...>
    +
  2426. The jpeg:extent option no longer returns double-free exception (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24366).
  2427. +
  2428. Turn off arch-specific optimizations (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24353).
  2429. +
  2430. The -type bilevel option no longer returns black image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24394).
  2431. +
    2013-11-03 6.8.7-5 Dirk Lemstra <dirk@snakeware...>
    +
  2432. Added support for pangocairo to the windows distribution.
  2433. +
  2434. Added /OpenCL option to configure.exe to enable OpenCL.
  2435. +
  2436. The MIFF/PCL/PDF/PNG/PS2/PS3/TIFF coders will no longer use the quality and compression of the source image when writing.
  2437. +
    2013-10-31 6.8.7-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  2438. Fixed cut-and-paste error in version.c that caused the "png" delegate to be listed twice by the "convert -version" command.
  2439. +
    2013-10-30 6.8.7-4 Cristy <quetzlzacatenango@image...>
    +
  2440. New version 6.8.7-4, SVN revision 13616.
  2441. +
    2013-10-26 6.8.7-4 Siu Chi Chan <...@amd.com>
    +
  2442. Major improvements to the OpenCL infrastructure.
  2443. +
  2444. New OpenCL accelerated algorithms (function image, blur, radial blur, unsharp mask, resize, contrast, equalize, despeckle).
  2445. +
  2446. Added a new checkbox to enable OpenCL in the configure program.
  2447. +
    2013-10-24 6.8.7-4 Cristy <quetzlzacatenango@image...>
    +
  2448. Color reduction acceleration from Yoya (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=24324).
  2449. +
  2450. -intensity rec709luma -colorspace gray returns gamma 1.0/2.2 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24330).
  2451. +
  2452. Handle 16-bit JPEG-compressed TIFF images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24331).
  2453. +
  2454. An image -compose ModulusAdd negate-image returns the original (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24337).
  2455. +
  2456. Support %U escape character for resolution units (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=24140).
  2457. +
    2013-10-23 6.8.7-3 Cristy <quetzlzacatenango@image...>
    +
  2458. New version 6.8.7-3, SVN revision 13557.
  2459. +
    2013-10-23 6.8.7-3 Cristy <quetzlzacatenango@image...>
    +
  2460. The -roll option is now working when the +x coordinate is +0 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24314).
  2461. +
    2013-10-22 6.8.7-2 Cristy <quetzlzacatenango@image...>
    +
  2462. New version 6.8.7-2, SVN revision 13534.
  2463. +
    2013-10-20 6.8.7-2 Cristy <quetzlzacatenango@image...>
    +
  2464. Define cmsUInt32Number if LCMS version is < 2000.
  2465. +
  2466. Set xc:gray() intensity to Rec709Luma (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24303).
  2467. +
    2013-10-20 6.8.7-2 Dirk Lemstra <dirk@snakeware...>
    +
  2468. GetImageDepth() no longer returns incorrect depth when HDRI enabled.
  2469. +
    2013-10-19 6.8.7-1 Cristy <quetzlzacatenango@image...>
    +
  2470. New version 6.8.7-1, SVN revision 13486.
  2471. +
    2013-10-10 6.8.7-1 Cristy <quetzlzacatenango@image...>
    +
  2472. Add support for the -complex option, perform complex mathematics on an image sequence.
  2473. +
  2474. Sync pixel cache for -set colorspace cmyk option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24173).
  2475. +
    2013-09-27 6.8.7-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  2476. Fixed problem with PNG8 reduction in coders/png.c (special case where exactly 256 colors plus one transparent color are present).
  2477. +
  2478. Set image->intensity = Rec709LuminancePixelIntensityMethod before setting the colorspace to Gray while reading a gray PNG (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24205). This ensures that image->gamma will be set to 1.0 (linear).
  2479. +
    2013-09-26 6.8.7-1 Dirk Lemstra <dirk@snakeware...>
    +
  2480. Fixed incorrect size of DICOM image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24135).
  2481. +
  2482. Fixed rounding in YUV coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24148).
  2483. +
  2484. Fixed colorspace issue when combining images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24173).
  2485. +
  2486. Replaced libjpeg with libjpeg-turbo in the windows distribution.
  2487. +
  2488. Added support for liquid rescale to the windows distribution.
  2489. +
  2490. Set image type after syncing the pixel cache.
  2491. +
    2013-09-25 6.8.7-0 Cristy <quetzlzacatenango@image...>
    +
  2492. New version 6.8.7-0, SVN revision 13290.
  2493. +
    2013-09-23 6.8.7-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  2494. Fixed comments about the -quality value in PNG coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=24134).
  2495. +
    2013-09-19 6.8.7-0 Dirk Lemstra <dirk@snakeware...>
    +
  2496. Fixed issue with colormap when reading Viff image.
  2497. +
  2498. Added support for opening https files under windows (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24121).
  2499. +
  2500. Fixed incorrect format when reading EPT image from a blob (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24129).
  2501. +
    2013-09-18 6.8.6-10 Cristy <quetzlzacatenango@image...>
    +
  2502. New version 6.8.6-10, SVN revision 13240.
  2503. +
    2013-09-07 6.8.6-10 Dirk Lemstra <dirk@snakeware...>
    +
  2504. Added support for writing DDS files.
  2505. +
    2013-08-29 6.8.6-10 Cristy <quetzlzacatenango@image...>
    +
  2506. Call SVG / MSL xmlCleanupParser() / xmlInitParser() once (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23991).
  2507. +
  2508. Support LEGO Mindstorms EV3 Robot Graphics File format (contributed by bdwheele@ind.../
  2509. +
  2510. Since glib-2.35.0 g_type_init() was removed (reference https://bugs.gentoo.org/show_bug.cgi?id=481042).
  2511. +
  2512. New identify define to output the location of the minimum, maximum, or mean pixel of the image (e.g. identify -define identify:locate=maximum -define identify:limit=7 rose).
  2513. +
  2514. Column columns / rows no longer inverted for RGF image format (patch from Brian Wheeler <bdwheele@india...>.
  2515. +
  2516. 16bit PSD images might have a 65536 colormap (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24102).
  2517. +
  2518. Ascii map is now declare as AsciiMap (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24106).
  2519. +
  2520. Return label for identify -format "%l" (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=24105).
  2521. +
  2522. Add option to perform Fourier normalization in either the forward or inverse transform (e.g -define fourier:normalize=inverse). The default remains as it was in the forward transform (i.e. -define fourier:normalize=forward)
  2523. +
    2013-08-26 6.8.6-9 Cristy <quetzlzacatenango@image...>
    +
  2524. New version 6.8.6-9, SVN revision 13087.
  2525. +
    2013-08-16 6.8.6-9 SiuChi Chan <...>
    +
  2526. Accelerate numerous image filters with OpenCL under AMD, Intel, and NVidia. Adapted from MulticoreWare OpenCL contribution.
  2527. +
    2013-08-10 6.8.6-9 Dirk Lemstra <dirk@snakeware..>
    +
  2528. Added the following command line options to configure.exe: /x64, set 64 bit build /mtd, set project type to: multi threaded dll /sts, set project type to: single threaded static /mts, set project type to: multi threaded static /mtsd, set project type to: multi threaded static dll /noWizard, skip the wizard and generate the project/solution files
  2529. +
  2530. Fixed infinite loop with jpeg:extent (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23314).
  2531. +
  2532. Fixed performance issue when converting jpeg to png (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23922).
  2533. +
    2013-08-10 6.8.6.9 Glenn Randers-Pehrson <glennrp@image...>
    +
  2534. Added "-define bmp:format=bmp2|bmp3|bmp4" option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=23875).
  2535. +
    2013-08-07 6.8.6-9 Cristy <quetzlzacatenango@image...>
    +
  2536. Free disk resource if cache resources are exhausted (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23877).
  2537. +
  2538. Return proper EXIF:ISOSpeedRating property value for TIFF images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23913).
  2539. +
  2540. Escape MIFF properties with null values (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23931).
  2541. +
  2542. Allow negative pixel values in TXT image format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23923).
  2543. +
  2544. The -fx option no longer crashes for certain expressions (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23932).
  2545. +
  2546. Add support for the -compare option (e.g. convert image.png reference.png -metric RMSE -compare -format "%[distortion]" info:).
  2547. +
  2548. The internal SVG renderer is now invariant for the "fill" and "opacity" keywords.
  2549. +
    2013-08-06 6.8.6-8 Cristy <quetzlzacatenango@image...>
    +
  2550. New version 6.8.6-8, SVN revision 12918.
  2551. +
    2013-08-04 6.8.6-8 Dirk Lemstra <dirk@snakeware...>
    +
  2552. Added support for WebP to the Windows distribution (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=23856).
  2553. +
    2013-07-31 6.8.6-8 Cristy <quetzlzacatenango@image...>
    +
  2554. Properly handle interlaced GIF images with less than 8 rows (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23812).
  2555. +
  2556. Ensure image colorspace is sRGB when writing WebP format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=23841).
  2557. +
  2558. Avoid deadlock with logging subsystem (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=23849).
  2559. +
    2013-07-25 6.8.6-7 Cristy <quetzlzacatenango@image...>
    +
  2560. New version 6.8.6-7, SVN revision 12752.
  2561. +
    2013-07-24 6.8.6-7 Cristy <quetzlzacatenango@image...>
    +
  2562. Missing case for HCLpColorspace (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23811).
  2563. +
    2013-07-21 6.8.6.7 Glenn Randers-Pehrson <glennrp@image...>
    +
  2564. Do not write "jpeg:" properties in a PNG output file (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23794).
  2565. +
    2013-07-17 6.8.6-7 Dirk Lemstra <dirk@snakeware...>
    +
  2566. Fix memory leak in CloneImageArtifacts and CloneImageProfiles.
  2567. +
  2568. Minor fix for the clipMask property in Magick++.
  2569. +
    2013-07-16 6.8.6-6 Cristy <quetzlzacatenango@image...>
    +
  2570. New version 6.8.6-6, SVN revision 12718.
  2571. +
    2013-07-16 6.8.6-6 Cristy <quetzlzacatenango@image...>
    +
  2572. JPEG ICC color profile requires null after ICC tag (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23756).
  2573. +
  2574. Don't sync channels for the -unsharp option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23740).
  2575. +
  2576. Magick++ version so bump (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23752).
  2577. +
    2013-07-15 6.8.6-5 Cristy <quetzlzacatenango@image...>
    +
  2578. New version 6.8.6-5, SVN revision 12684.
  2579. +
    2013-07-12 6.8.6-5 Dirk Lemstra <dirk@snakeware...>
    +
  2580. Fixed calculation of pixel area count limit flag ('@').
  2581. +
  2582. Added option to enable OpenMP to configure.exe and improved creation of x64 project file
  2583. +
    2013-07-10 6.8.6-5 Cristy <quetzlzacatenango@image...>
    +
  2584. Compare exits with a non-zero exit code when no error (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23722).
  2585. +
  2586. Correct calculation of quantization error (reference https://imagemagick.org/discourse-server//viewtopic.html?t=23734).
  2587. +
  2588. Correct quantize tree walking mistake for RiemersmaDither (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=23735).
  2589. +
    2013-07-10 6.8.6-4 Cristy <quetzlzacatenango@image...>
    +
  2590. New version 6.8.6-4, SVN revision 12661.
  2591. +
    2013-07-09 6.8.6-4 Dirk Lemstra <dirk@snakeware...>
    +
  2592. Added combineImages, evaluateImages, mergeImageLayers, optimizeImageLayers optimizePlusImageLayers and separateImages to STL.h (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=23699).
  2593. +
  2594. Added support for the fill area flag ('^') and the pixel area count limit flag ('@') to the Geometry class of Magick++ (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=23704).
  2595. +
  2596. Enabled automatic linking for static Magick++ in Visual Studio (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=23558).
  2597. +
    2013-07-01 6.8.6-4 Cristy <quetzlzacatenango@image...>
    +
  2598. Thumb property need Height, not height (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23661).
  2599. +
  2600. White pixels previously were written as black for the CIP format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23677).
  2601. +
  2602. Rec709Luma is sRGB compatible (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23693).
  2603. +
  2604. Colorspace RGB is linear, gamma is 1.0 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23708).
  2605. +
    2013-07-01 6.8.6-3 Cristy <quetzlzacatenango@image...>
    +
  2606. New version 6.8.6-3, SVN revision 12579.
  2607. +
    2013-06-26 6.8.6-3 Cristy <quetzlzacatenango@image...>
    +
  2608. Improve HCL to RGB roundtrip (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22384).
  2609. +
  2610. Prefer external log configuration file to built-in (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23640).
  2611. +
  2612. Do not log in the IsLinkedListEmpty() method to prevent overflow (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23640).
  2613. +
  2614. Fix bug loading TGA image with 32-bit palette (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17889).
  2615. +
  2616. Color profiles are no longer corrupted for the JPEG format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23651).
  2617. +
  2618. Repair problem with -emboss / -equalize problem (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23643).
  2619. +
    2013-06-24 6.8.6-2 Cristy <quetzlzacatenango@image...>
    +
  2620. New version 6.8.6-2, SVN revision 12561.
  2621. +
    2013-06-21 6.8.6-2 Cristy <quetzlzacatenango@image...>
    +
  2622. Fix memory corruption in the MorphologyApply() method.
  2623. +
    2013-06-20 6.8.6.2 Glenn Randers-Pehrson <glennrp@image...>
    +
  2624. Quiet two warnings about uninitialized variables in coders/png.c
  2625. +
    2013-06-20 6.8.6-1 Cristy <quetzlzacatenango@image...>
    +
  2626. New version 6.8.6-1, SVN revision 12509.
  2627. +
    2013-06-16 6.8.6-1 Cristy <quetzlzacatenango@image...>
    +
  2628. Don't decompand RGB for the -modulate option.
  2629. +
  2630. Improve LCHab and LCHuv roundtrip to / from sRGB (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=23596).
  2631. +
    2013-06-16 6.8.6-0 Cristy <quetzlzacatenango@image...>
    +
  2632. New version 6.8.6-0, SVN revision 12475.
  2633. +
    2013-06-10 6.8.6-0 Cristy <quetzlzacatenango@image...>
    +
  2634. Clone image->intensity in CloneImageProperties() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23569).
  2635. +
  2636. Split test suite into smaller tests (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23577).
  2637. +
  2638. Undercolor rectangle was off by one pixel (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23574).
  2639. +
  2640. Don't msync() for a read-only memory-mapped mode (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23531).
  2641. +
  2642. BlurChannelImage() no longer faults for certain CMYK images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23581).
  2643. +
  2644. Reduce memory requirements for large BMP images.
  2645. +
    2013-06-05 6.8.5-10 Cristy <quetzlzacatenango@image...>
    +
  2646. New version 6.8.5-10, SVN revision 12419.
  2647. +
    2013-06-02 6.8.5-10 Cristy <quetzlzacatenango@image...>
    +
  2648. Improve caption formatting (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23522).
  2649. +
    2013-06-01 6.8.5-9 Cristy <quetzlzacatenango@image...>
    +
  2650. New version 6.8.5-9, SVN revision 12401.
  2651. +
    2013-05-30 6.8.5-9 Cristy <quetzlzacatenango@image...>
    +
  2652. Caption no longer clips long words (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23504).
  2653. +
  2654. The lightness intensity is (min(R',G',B')+max(R',G',B'))/2.0 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23517).
  2655. +
    2013-05-25 6.8.5-8 Cristy <quetzlzacatenango@image...>
    +
  2656. New version 6.8.5-8, SVN revision 12362.
  2657. +
    2013-05-23 6.8.5-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  2658. Stopped a "-fsanitize-address" warning in the JNG coder.
  2659. +
    2013-05-20 6.8.5-8 Cristy <quetzlzacatenango@image...>
    +
  2660. The -white-threshold option is symmetrical with -black-threshold (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23441);
  2661. +
  2662. Fix multi-line PNM comments (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23442).
  2663. +
  2664. The -format option should not automatically append a newline since the user can specify a newline in the formatting expression.
  2665. +
  2666. The -level option is no longer returning a darkened image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23479).
  2667. +
  2668. Identify SVG image as "SVG" (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=27654).
  2669. +
    2013-05-20 6.8.5-7 Cristy <quetzlzacatenango@image...>
    +
  2670. New version 6.8.5-7, SVN revision 12310.
  2671. +
    2013-05-14 6.8.5-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  2672. Recognize PNG iCCP chunks that contain the sRGB profile and replace them with the PNG sRGB chunk. Use "-define png:preserve-iCCP" to get the previous behavior, of simply copying the iCCP chunk.
  2673. +
    2013-05-11 6.8.5-7 Cristy <quetzlzacatenango@image...>
    +
  2674. Sometimes an sRGB image is masquerading as grayscale (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23370).
  2675. +
  2676. Labels no longer overflow (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22964).
  2677. +
  2678. If more then one exception, return the highest security exception.
  2679. +
  2680. A grayscale image returns a color JPEG for -type TrueColor (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=23421).
  2681. +
  2682. Read PAM comment (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23442).
  2683. +
    2013-05-10 6.8.5-6 Cristy <quetzlzacatenango@image...>
    +
  2684. New version 6.8.5-6, SVN revision 12257.
  2685. +
    2013-05-09 6.8.5-6 Cristy <quetzlzacatenango@image...>
    +
  2686. The stream utility no longer faults when exporting float pixels (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23394).
  2687. +
    2013-05-08 6.8.5-5 Cristy <quetzlzacatenango@image...>
    +
  2688. New version 6.8.5-5, SVN revision 12227.
  2689. +
    2013-05-07 6.8.5-5 Nicolas Robidoux <nicolas.robidoux@gmail...>
    +
  2690. Change the sample JPEG quantization table xml to something that works really well with 2x2 Chroma subsampling around quality 75.
  2691. +
    2013-05-06 6.8.5-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  2692. Eliminate whitespace from image properties that hold PNG chunk data.
  2693. +
    2013-05-05 6.8.5-5 Cristy <quetzlzacatenango@image...>
    +
  2694. The -poly option treats the opacity channel as alpha (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23346).
  2695. +
  2696. The -threshold 50% option returns a 50-50 black and white image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23354).
  2697. +
  2698. Let user override the TIFF rows per strip (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=23307).
  2699. +
  2700. Fix transient bug in the -separate option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23335).
  2701. +
    2013-05-01 6.8.5-4 Cristy <quetzlzacatenango@image...>
    +
  2702. New version 6.8.5-4, SVN revision 12089.
  2703. +
    2013-05-01 6.8.5-4 Cristy <quetzlzacatenango@image...>
    +
  2704. Add DeleteImageArtifact() for jpeg:extent artifact (thanks to Jimmy Xie @ Microsoft).
  2705. +
  2706. Track morphology changes per thread to avoid a critical section.
  2707. +
    2013-04-28 6.8.5-3 Cristy <quetzlzacatenango@image...>
    +
  2708. New version 6.8.5-3, SVN revision 12025.
  2709. +
    2013-04-29 6.8.5-3 Cristy <quetzlzacatenango@image...>
    +
  2710. Add DeleteImageArtifact() for jpeg:extent artifact (thanks to Jimmy Xie @ Microsoft).
  2711. +
  2712. Add support for JXR / WDP image format.
  2713. +
    2013-04-28 6.8.5-2 Cristy <quetzlzacatenango@image...>
    +
  2714. New version 6.8.5-2, SVN revision 12013.
  2715. +
    2013-04-28 6.8.5-2 Cristy <quetzlzacatenango@image...>
    +
  2716. Use GetImageOption() for webp options (e.g. webp:lossless).
  2717. +
    2013-04-27 6.8.5-1 Cristy <quetzlzacatenango@image...>
    +
  2718. New version 6.8.5-1, SVN revision 12000.
  2719. +
    2013-04-26 6.8.5-1 Cristy <quetzlzacatenango@image...>
    +
  2720. Recognize xc:gray50 is non-linear.
  2721. +
  2722. Loop over read() until requested bytes are consumed (reference https://imagemagick.org/discourse-server//viewtopic.html?t=23268).
  2723. +
  2724. Don't use gamma lookup map when HDRI is enabled.
  2725. +
    2013-04-24 6.8.5-0 Cristy <quetzlzacatenango@image...>
    +
  2726. New version 6.8.5-0, SVN revision 11979.
  2727. +
    2013-04-16 6.8.5-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  2728. Handle benign errors as warnings in the PNG coder.
  2729. +
    2013-04-16 6.8.5-0 Cristy <quetzlzacatenango@image...>
    +
  2730. Don't modify channel values for -separate (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23193).
  2731. +
  2732. The -adaptive-sharpen option is now sharpening properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23211).
  2733. +
  2734. Sometimes an image says it's grayscale when it's not (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23217).
  2735. +
  2736. Use malloc() to allocate X image data (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23221).
  2737. +
  2738. If there are more components than quantization tables, the last table is replicated.
  2739. +
  2740. Removed the ICC profile from the logo: image definition in coders/magick.c; libpng16 detected that it was a broken sRGB profile.
  2741. +
  2742. Negatives raised to a non-integer power returns NaN's (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23234).
  2743. +
    2013-04-15 6.8.4-10 Cristy <quetzlzacatenango@image...>
    +
  2744. New version 6.8.4-10, SVN revision 11851.
  2745. +
    2013-04-11 6.8.4-10 Cristy <quetzlzacatenango@image...>
    +
  2746. Ensure -define jpeg:extent is restricted to at most 7 iterations (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23179).
  2747. +
  2748. Move X11 font support from annotate.c source module to xwindow.c.
  2749. +
    2013-04-10 6.8.4-9 Cristy <quetzlzacatenango@image...>
    +
  2750. New version 6.8.4-9, SVN revision 11818.
  2751. +
    2013-04-10 6.8.4-9 Bastien Roucaries <roucaries.basti...>
    +
  2752. Respect --program-suffix configure script option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23143).
  2753. +
  2754. Update to the newest AX_CHECK_PTHREAD macro from autoconf-archive.
  2755. +
    2013-04-10 6.8.4-9 Anthony Thyssen <A.Thyssen@griffith...>
    +
  2756. Save the calculated angle for "deskew" as the artifact "deskew:angle"
  2757. +
    2013-04-08 6.8.4-9 Cristy <quetzlzacatenango@image...>
    +
  2758. Pass JP2 format type to decoder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23038).
  2759. +
  2760. Previously tinting a grayscale image returned dark results.
  2761. +
  2762. The -page option only affects new images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23172).
  2763. +
  2764. Revert 'Move binaries to lib subdirectory and link are created from binary package' patch. We're getting too many bug reports.
  2765. +
    2013-04-07 6.8.4-8 Cristy <quetzlzacatenango@image...>
    +
  2766. New version 6.8.4-8, SVN revision 11743.
  2767. +
    2013-04-06 6.8.4-8 Cristy <quetzlzacatenango@image...>
    +
  2768. Include intensity type in the MIFF metadata.
  2769. +
    2013-04-06 6.8.4-7 Cristy <quetzlzacatenango@image...>
    +
  2770. New version 6.8.4-7, SVN revision 11720.
  2771. +
    2013-04-05 6.8.4-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  2772. Fix -sample sampling point to midpoints of sampling areas
  2773. +
  2774. Add a "sample:offset=" define to allow users to adjust this sampling point position in terms of percentage (default = 50x50)
  2775. +
    2013-04-02 6.8.4-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  2776. Don't write a PNG gAMA or cHRM chunk when writing the iCCP or sRGB chunk.
  2777. +
    2013-04-02 6.8.4-7 Cristy <quetzlzacatenango@image...>
    +
  2778. Return MagickWand for the library name for Wand.pc.
  2779. +
  2780. The LCH colorspace makes the round-trip now.
  2781. +
  2782. Revert the default upsampling algortithm for JPEG (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23100).
  2783. +
  2784. Prevent fault when temporary directory is not-writable (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23117).
  2785. +
    2013-04-01 6.8.4-7 Bastien Roucaries <roucaries.basti...>
    +
  2786. Prepare X11 support as a plugin.
  2787. +
  2788. Fix compilation under HPUX of perlmagick
  2789. +
    2013-04-01 6.8.4-6 Cristy <quetzlzacatenango@image...>
    +
  2790. New version 6.8.4-6, SVN revision 11640.
  2791. +
    2013-04-01 6.8.4-6 Cristy <quetzlzacatenango@image...>
    +
  2792. The -clut option return a luma grayscale instead of the expected luminance.
  2793. +
  2794. Add moduledir variable to MagickCore.pc to support the MagickFilter and MagickCore kits.
  2795. +
  2796. Caption fits the sized area (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23085).
  2797. +
    2013-03-31 6.8.4-5 Cristy <quetzlzacatenango@image...>
    +
  2798. New version 6.8.4-5, SVN revision 11619.
  2799. +
    2013-03-30 6.8.4-5 Cristy <quetzlzacatenango@image...>
    +
  2800. Fix transient bug when writing grayscale MIFF images.
  2801. +
  2802. Adding noise to a gray image returns a gray image as expected.
  2803. +
  2804. Image interlace no longer overwritten by proper cloning for GIF format.
  2805. +
  2806. Extract the clipping path from an image file with clip:myimage.
  2807. +
    2013-03-29 6.8.4-4 Cristy <quetzlzacatenango@image...>
    +
  2808. New version 6.8.4-4, SVN revision 11591.
  2809. +
    2013-03-29 6.8.4-4 Cristy <quetzlzacatenango@image...>
    +
  2810. Update unit test signatures for Q8.
  2811. +
  2812. Resolve send() / recv() socket problems under MinGW.
  2813. +
    2013-03-28 6.8.4-3 Cristy <quetzlzacatenango@image...>
    +
  2814. New version 6.8.4-3, SVN revision 11581.
  2815. +
    2013-03-28 6.8.4-3 Cristy <quetzlzacatenango@image...>
    +
  2816. Revert patch to ContrastStretchImage() to match results from 6.8.3-3.
  2817. +
    2013-03-27 6.8.4-2 Cristy <quetzlzacatenango@image...>
    +
  2818. New version 6.8.4-2, SVN revision 11558.
  2819. +
    2013-03-27 6.8.4-2 Cristy <quetzlzacatenango@image...>
    +
  2820. Use MorphologyApply() rather than MorphologyImage() for -sharpen / -blur.
  2821. +
    2013-03-27 6.8.4-1 Cristy <quetzlzacatenango@image...>
    +
  2822. New version 6.8.4-1, SVN revision 11552.
  2823. +
    2013-03-26 6.8.4-1 Cristy <quetzlzacatenango@image...>
    +
  2824. Sync 'intensity' option with current image.
  2825. +
  2826. Normalize sharpen kernel to match that of 6.8.3-3.
  2827. +
    2013-03-26 6.8.4-0 Cristy <quetzlzacatenango@image...>
    +
  2828. New version 6.8.4-0, SVN revision 11531.
  2829. +
    2013-03-20 6.8.4-0 Cristy <quetzlzacatenango@image...>
    +
  2830. Do not write zero-length TIFF tags (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22957).
  2831. +
  2832. Math library should be private for *.pc.in configuration files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=22986).
  2833. +
  2834. Do not split words for caption (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=17123).
  2835. +
  2836. Modify the configure script check for the webp delegate library (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=23025).
  2837. +
  2838. The -blur, -gaussian-blur, and -sharpen are now convenience methods for -morphology convolve.
  2839. +
  2840. Fix infinite loop for 'display -window' (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23028).
  2841. +
  2842. Revert -auto-level patch to match the results of ImageMagick 6.8.3-4.
  2843. +
  2844. Revert g_type_init() patch in svg.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=23035).
  2845. +
    2013-03-18 6.8.3-10 Cristy <quetzlzacatenango@image...>
    +
  2846. New version 6.8.3-10, SVN revision 11413.
  2847. +
    2013-03-15 6.8.3-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  2848. Added IM, libpng, and zlib version info to debug output.
  2849. +
    2013-03-10 6.8.3-10 Bastien Roucaries <roucaries.basti...>
    +
  2850. Move PerlMagick arch independent part to 'default' folder.
  2851. +
  2852. Move binaries to lib subdirectory and link are created from binary package.
  2853. +
    2013-03-10 6.8.3-10 Cristy <quetzlzacatenango@image...>
    +
  2854. The TXT image format can now generate output compatible with the -sparse-color option (e.g. convert image.png sparse-color:image.txt).
  2855. +
  2856. Support -intensity option: method to generate an intensity value from a pixel.
  2857. +
  2858. Add -similarity-threshold option to the compare utility, the minimum distortion for a (sub)image match.
  2859. +
  2860. Avoid seq-fault in AcquireQuantumInfo() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22973).
  2861. +
  2862. Comment resource initializers in magick/resource.c.
  2863. +
    2013-03-10 6.8.3-9 Cristy <quetzlzacatenango@image...>
    +
  2864. New version 6.8.3-9, SVN revision 11294.
  2865. +
    2013-03-09 6.8.3-9 Cristy <quetzlzacatenango@image...>
    +
  2866. Add a space after the LastPage option in coders/ps.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22940).
  2867. +
    2013-03-08 6.8.3-8 Cristy <quetzlzacatenango@image...>
    +
  2868. New version 6.8.3-8, SVN revision 11283.
  2869. +
    2013-03-05 6.8.3-8 Cristy <quetzlzacatenango@image...>
    +
  2870. GIF comments are no longer displaced by 1 for animated GIFs (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22901).
  2871. +
  2872. A blur kernel with a zero sigma is unity.
  2873. +
    2013-03-03 6.8.3-7 Cristy <quetzlzacatenango@image...>
    +
  2874. New version 6.8.3-7, SVN revision 11249.
  2875. +
    2013-03-02 6.8.3-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  2876. Do not replace gAMA found in input with 1/2.2
  2877. +
  2878. Avoid a libpng16 warning about storing unknown chunks.
  2879. +
    2013-03-01 6.8.3-7 Cristy <quetzlzacatenango@image...>
    +
  2880. Improve performance when rendering a caption.
  2881. +
  2882. The compare 'map' image should not be transparent.
  2883. +
  2884. Use only major version for decorating include path.
  2885. +
    2013-02-28 6.8.3-6 Cristy <quetzlzacatenango@image...>
    +
  2886. New version 6.8.3-6, SVN revision 11210.
  2887. +
    2013-02-25 6.8.3-6 Cristy <quetzlzacatenango@image...>
    +
  2888. Support built-in 1x1 and 2x1 threshold maps (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=22861).
  2889. +
  2890. Check for webp version (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22867).
  2891. +
    2013-02-25 6.8.3-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  2892. Relocated png_set_bKGD(), etc., after png_set_IHDR() because they might depend on members of info_ptr that are set by png_set_IHDR().
  2893. +
    2013-02-25 6.8.3-5 Cristy <quetzlzacatenango@image...>
    +
  2894. New version 6.8.3-5, SVN revision 11170.
  2895. +
    2013-02-23 6.8.3-5 Cristy <quetzlzacatenango@image...>
    +
  2896. Read the WebP extended file format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=22809).
  2897. +
  2898. Add arch annotation to include path to distinquish ImageMagick versions 6 & 7.
  2899. +
    2013-02-22 6.8.3-4 Cristy <quetzlzacatenango@image...>
    +
  2900. New version 6.8.3-4, SVN revision 11127.
  2901. +
    2013-02-22 6.8.3-4 Cristy <quetzlzacatenango@image...>
    +
  2902. Reduce default memory resource limit under Windows.
  2903. +
    2013-02-19 6.8.3-3 Cristy <quetzlzacatenango@image...>
    +
  2904. New version 6.8.3-3, SVN revision 11105.
  2905. +
    2013-02-19 6.8.3-3 Cristy <quetzlzacatenango@image...>
    +
  2906. Set WEBP lossless / lossy property properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=22809).
  2907. +
    2013-02-18 6.8.3-2 Cristy <quetzlzacatenango@image...>
    +
  2908. New version 6.8.3-2, SVN revision 11087.
  2909. +
    2013-02-17 6.8.3-2 Cristy <quetzlzacatenango@image...>
    +
  2910. Semaphore is now unlocked when an X11 annotation exception is thrown.
  2911. +
  2912. WEBP coder enhancement and memory leak patch (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=22809).
  2913. +
    2013-02-16 6.8.3-1 Cristy <quetzlzacatenango@image...>
    +
  2914. New version 6.8.3-1, SVN revision 11060.
  2915. +
    2013-02-16 6.8.3-1 Cristy <quetzlzacatenango@image...>
    +
  2916. Disable FORTIFY_SOURCE to fix a bug in LVVM / OpenMP support.
  2917. +
    2013-02-15 6.8.3-0 Cristy <quetzlzacatenango@image...>
    +
  2918. New version 6.8.3-0, SVN revision 11045.
  2919. +
    2013-02-14 6.8.3-0 Cristy <quetzlzacatenango@image...>
    +
  2920. Webp requires alpha, not opacity (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22793).
  2921. +
    2013-02-12 6.8.3-0 Bastien Roucaries <roucaries.basti...>
    +
  2922. Allow PerlMagick to be multi-quantum (e.g. Image::Magick::Q16).
  2923. +
    2013-02-11 6.8.2-10 Cristy <quetzlzacatenango@image...>
    +
  2924. New version 6.8.2-10, SVN revision 11004.
  2925. +
    2013-02-11 6.8.2-10 Cristy <quetzlzacatenango@image...>
    +
  2926. The XPM regression tests passes now.
  2927. +
    2013-02-09 6.8.2-9 Cristy <quetzlzacatenango@image...>
    +
  2928. New version 6.8.2-9, SVN revision 10995.
  2929. +
    2013-02-09 6.8.2-9 Bastien Roucaries <roucaries.basti...>
    +
  2930. Export versioning to automake in order to use it for library prefix.
  2931. +
  2932. So bump was incomplete due to no changing map file.
  2933. +
  2934. Change abi name by adding major version to lib name (will simplify next imagemagick major version Release work) and reset release version to 1 (due to changing abi name).
  2935. +
    2013-02-09 6.8.2-9 Cristy <quetzlzacatenango@image...>
    +
  2936. The DOT coders now compiles with GraphViz 2.30 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22767).
  2937. +
    2013-02-09 6.8.2-8 Cristy <quetzlzacatenango@image...>
    +
  2938. New version 6.8.2-8, SVN revision 10986.
  2939. +
    2013-02-09 6.8.2-8 Cristy <quetzlzacatenango@image...>
    +
  2940. MagickStatisticImage() method signature was corrected, SO bump required.
  2941. +
    2013-02-08 6.8.2-7 Cristy <quetzlzacatenango@image...>
    +
  2942. New version 6.8.2-7, SVN revision 10965.
  2943. +
    2013-02-08 6.8.2-7 Cristy <quetzlzacatenango@image...>
    +
  2944. Ensure MagickCore compiles with a C++ compiler.
  2945. +
    2013-02-07 6.8.2-6 Cristy <quetzlzacatenango@image...>
    +
  2946. New version 6.8.2-6, SVN revision 10961.
  2947. +
    2013-02-07 6.8.2-6 Cristy <quetzlzacatenango@image...>
    +
  2948. Don't destroy an image that's already destroyed (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22747).
  2949. +
  2950. Montage is now invariant to the font when no label image label exists.
  2951. +
    2013-02-06 6.8.2-5 Cristy <quetzlzacatenango@image...>
    +
  2952. New version 6.8.2-5, SVN revision 10952.
  2953. +
    2013-02-05 6.8.2-5 Cristy <quetzlzacatenango@image...>
    +
  2954. FITS now properly renders the 16 bit signed integer format.
  2955. +
    2013-02-04 6.8.2-4 Cristy <quetzlzacatenango@image...>
    +
  2956. New version 6.8.2-4, SVN revision 10909.
  2957. +
    2013-02-02 6.8.2-4 Cristy <quetzlzacatenango@image...>
    +
  2958. Do not subsample raw CMYK JPEG images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22731).
  2959. +
    2013-02-02 6.8.2-3 Cristy <quetzlzacatenango@image...>
    +
  2960. New version 6.8.2-3, SVN revision 10894.
  2961. +
    2013-02-01 6.8.2-3 Cristy <quetzlzacatenango@image...>
    +
  2962. Respect endian for FITS image format.
  2963. +
  2964. Remove artifact when drawing a circle (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22724).
  2965. +
    2013-02-01 6.8.2-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  2966. Deleted some code added to the PNG decoder in SVN revision 10825; it was failing to handle transparency in paletted images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22720).
  2967. +
  2968. Compare alpha to "QuantumRange-OpaqueOpacity" not just "OpaqueOpacity" when detecting transparency in the PNG encoder.
  2969. +
    2013-02-01 6.8.2-2 Cristy <quetzlzacatenango@image...>
    +
  2970. New version 6.8.2-2, SVN revision 10883.
  2971. +
    2013-01-30 6.8.2-2 Cristy <quetzlzacatenango@image...>
    +
  2972. Properly initialize new throttle resource limit.
  2973. +
    2013-01-29 6.8.2-1 Cristy <quetzlzacatenango@image...>
    +
  2974. New version 6.8.2-1, SVN revision 10859.
  2975. +
    2013-01-28 6.8.2-1 Cristy <quetzlzacatenango@image...>
    +
  2976. Fix 'format not a string literal' problem (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22656).
  2977. +
    2013-01-28 6.8.2-0 Cristy <quetzlzacatenango@image...>
    +
  2978. New version 6.8.2-0, SVN revision 10831.
  2979. +
    2013-01-21 6.8.2-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  2980. Impose a 32k limit on the number of text chunks that will be read.
  2981. +
  2982. Implemented PNG00, PNG48 and PNG64 PNG subformats.
  2983. +
  2984. Avoid reading back PNG pixel rows while reading a transparent PNG ( by using a local "alpha" value instead of GetPixelOpacity()).
  2985. +
    2013-01-21 6.8.2-0 Cristy <quetzlzacatenango@image...>
    +
  2986. Avoid a rare thread lock for timeout event (e.g. MAGICK_TIME_LIMIT=30).
  2987. +
  2988. Support a distributed pixel cache.
  2989. +
  2990. Fix numerical stability problem for convolution.
  2991. +
  2992. Increase segment stack size for -draw option.
  2993. +
    2013-01-18 6.8.1-10 Cristy <quetzlzacatenango@image...>
    +
  2994. New version 6.8.1-10, SVN revision 10667.
  2995. +
    2013-01-08 6.8.1-10 Cristy <quetzlzacatenango@image...>
    +
  2996. Add the same noise value to each channel of a grayscale image (+noise).
  2997. +
  2998. Fix recursive descent within XGetWindowImage() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22550).
  2999. +
  3000. Multi-plane MatLab images now render properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22586).
  3001. +
    2013-01-06 6.8.1-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  3002. Fixed LBR01 (left-bit-replication) macro in coders/png.c; problem reported by the clang compiler.
  3003. +
  3004. Chromaticity values were read in the wrong order in the cHRM chunk when it accompanied the sRGB chunk. Libpng applications built with libpng16 and later will detect this and issue a warning (PNG files previously written with the cHRM chunk are OK). Removed the troublesome redundant png_set_cHRM() and png_set_sRGB() calls.
  3005. +
  3006. Look for libpng17 and libpng16 while configuring PNG support.
  3007. +
    2013-01-06 6.8.1-9 Cristy <quetzlzacatenango@image...>
    +
  3008. New version 6.8.1-9, SVN revision 10518.
  3009. +
    2013-01-06 6.8.1-9 Cristy <quetzlzacatenango@image...>
    +
  3010. Type correction in blob code.
  3011. +
    2013-01-02 6.8.1-8 Cristy <quetzlzacatenango@image...>
    +
  3012. New version 6.8.1-8, SVN revision 10481.
  3013. +
    2013-01-02 6.8.1-8 Cristy <quetzlzacatenango@image...>
    +
  3014. Check for a density of zero when rendering with Pango (reference https://imagemagick.org/discourse-server//viewforum.html?f=3).
  3015. +
    2013-01-01 6.8.1-7 Cristy <quetzlzacatenango@image...>
    +
  3016. New version 6.8.1-7, SVN revision 10468.
  3017. +
    2013-01-01 6.8.1-7 Cristy <quetzlzacatenango@image...>
    +
  3018. magick-baseconfig.h is architecture dependant; make headers quantum depth neutral (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=22509).
  3019. +
    2013-01-01 6.8.1-6 Cristy <quetzlzacatenango@image...>
    +
  3020. New version 6.8.1-6, SVN revision 10461.
  3021. +
    2012-12-31 6.8.1-6 Cristy <quetzlzacatenango@image...>
    +
  3022. Repair numerical stability issue with gradients (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22507).
  3023. +
    2012-12-30 6.8.1-5 Cristy <quetzlzacatenango@image...>
    +
  3024. New version 6.8.1-5, SVN revision 10428.
  3025. +
    2012-12-29 6.8.1-5 Cristy <quetzlzacatenango@image...>
    +
  3026. Correction to scientific notation for the -evaluate log option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=22496).
  3027. +
    2012-12-29 6.8.1-4 Cristy <quetzlzacatenango@image...>
    +
  3028. New version 6.8.1-4, SVN revision 10420.
  3029. +
    2012-12-28 6.8.1-4 Cristy <quetzlzacatenango@image...>
    +
  3030. Support scientific notation for the -evaluate log option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=22496).
  3031. +
    2012-12-25 6.8.1-3 Cristy <quetzlzacatenango@image...>
    +
  3032. New version 6.8.1-3, SVN revision 10394.
  3033. +
    2012-12-25 6.8.1-3 Cristy <quetzlzacatenango@image...>
    +
  3034. Remove pow() dependency from public header.
  3035. +
    2012-12-24 6.8.1-2 Cristy <quetzlzacatenango@image...>
    +
  3036. New version 6.8.1-2, SVN revision 10385.
  3037. +
    2012-12-23 6.8.1-2 Cristy <quetzlzacatenango@image...>
    +
  3038. Magickcore headers recently used pow() in the inline functions inside public headers. Thus in order to avoid library depends problem, put -lm in library depends (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22483).
  3039. +
  3040. Negative exponentiation bug fix (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22484).
  3041. +
    2012-12-23 6.8.1-1 Cristy <quetzlzacatenango@image...>
    +
  3042. New version 6.8.1-1, SVN revision 10350.
  3043. +
    2012-12-23 6.8.1-1 Cristy <quetzlzacatenango@image...>
    +
  3044. More large image performance tuning.
  3045. +
    2012-12-20 6.8.1-0 Cristy <quetzlzacatenango@image...>
    +
  3046. New version 6.8.1-0, SVN revision 10327.
  3047. +
    2012-12-16 6.8.1-0 Cristy <quetzlzacatenango@image...>
    +
  3048. Return non-zero exit status if two images differ for the compare utility.
  3049. +
  3050. Large image performance tuning.
  3051. +
    2012-12-15 6.8.0-10 Cristy <quetzlzacatenango@image...>
    +
  3052. New version 6.8.0-10, SVN revision 10236.
  3053. +
    2012-12-13 6.8.0-10 Cristy <quetzlzacatenango@image...>
    +
  3054. Improve exception reporting when AcquireAuthenticCacheView() fails.
  3055. +
    2012-12-13 6.8.0-10 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3056. Minor tweeks and commenting of Virtual Pixel shortcuts in resampling filters.
  3057. +
  3058. Added -define "shepards:power" to control the power setting (def=2) for Shepards Method in -distort and -sparse-color https://imagemagick.org/discourse-server//viewtopic.html?t=22416
  3059. +
    2012-12-13 6.8.0-9 Cristy <quetzlzacatenango@image...>
    +
  3060. New version 6.8.0-9, SVN revision 10182.
  3061. +
    2012-12-10 6.8.0-9 Glenn Randers-Pehrson <glennrp@image...>
    +
  3062. Prepended "Acquire" and "Relinquish" to debugging log messages in magick/resource.c that only showed the filename.
  3063. +
  3064. Added temporary file-count diagnostics to tests/validate.c (this required exporting GetPathTemplate() from magick/resource.c
  3065. +
  3066. Eliminate file leak when writing the JNG image format.
  3067. +
    2012-12-09 6.8.0-9 Cristy <quetzlzacatenango@image...>
    +
  3068. Further support for associating quantum depth with ABI (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22352).
  3069. +
  3070. Check for negative square root when resampling (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22398).
  3071. +
    2012-12-07 6.8.0-8 Cristy <quetzlzacatenango@image...>
    +
  3072. New version 6.8.0-8, SVN revision 10118.
  3073. +
    2012-11-28 6.8.0-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  3074. Fixed problem with writing grayscale PNG, bug introduced in version 6.8.0-0 or 6.8.0-1 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22355).
  3075. +
    2012-11-28 6.8.0-8 Cristy <quetzlzacatenango@image...>
    +
  3076. Allow temporary-path policy to override temporary path environment variables (e.g. MAGICK_TMPDIR).
  3077. +
  3078. Implement symbol versioning (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22352).
  3079. +
  3080. ABI is incompatible if quantum depth change. Add abi indication to library name, thanks to Bastien Roucaries (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22352).
  3081. +
  3082. The stream utility no longer returns a black image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22046).
  3083. +
    2012-11-26 6.8.0-7 Cristy <quetzlzacatenango@image...>
    +
  3084. New version 6.8.0-7, SVN revision 10029.
  3085. +
    2012-11-25 6.8.0-7 Cristy <quetzlzacatenango@image...>
    +
  3086. Width value is optional for label coder (e.g. -size x40 label:Magick).
  3087. +
    2012-11-20 6.8.0-6 Cristy <quetzlzacatenango@image...>
    +
  3088. New version 6.8.0-6, SVN revision 10024.
  3089. +
    2012-11-21 6.8.0-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  3090. Fixed an old bug in chromaticity decoding in coders/bmp.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22294).
  3091. +
  3092. Fixed bug in coders/bmp.c that failed to read a paletted image properly (fix by J. Summers, reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22316).
  3093. +
    2012-11-21 6.8.0-6 Cristy <quetzlzacatenango@image...>
    +
  3094. Fixed bug in coders/bmp.c that failed to read transparency properly (fix by J. Summers, reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22312).
  3095. +
    2012-11-20 6.8.0-5 Cristy <quetzlzacatenango@image...>
    +
  3096. New version 6.8.0-5, SVN revision 10001.
  3097. +
    2012-11-15 6.8.0-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3098. Added % escape prefixes %[artifact:..] and %[option:..] Including glob search, EG: -print "__Options__\n%[option:*]" (backport from IMv7 changes)
  3099. +
    2012-11-10 6.8.0-5 Cristy <quetzlzacatenango@image...>
    +
  3100. Revert HCL saturation strategy patch, it improperly clips white to black.
  3101. +
  3102. Default to -dEPSCrop for Ghostscript unless eps:use-crop=false (reference https://bugzilla.redhat.com/show_bug.cgi?id=832690#c2).
  3103. +
  3104. Add support for -poly, build a polynomial from the image sequence and the corresponding terms (coefficients and degree pairs).
  3105. +
  3106. Support the OLE Macintosh image format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=22257).
  3107. +
    2012-11-08 6.8.0-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  3108. Implemented faster decoding of interlaced PNG images.
  3109. +
    2012-11-03 6.8.0-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  3110. Skip PNG palette-building when it is not needed.
  3111. +
  3112. Let libpng expand sub-8-bit pixels while reading a PNG file.
  3113. +
    2012-11-01 6.8.0-4 Cristy <quetzlzacatenango@image...>
    +
  3114. New version 6.8.0-4, SVN revision 9832.
  3115. +
    2012-10-31 6.8.0-4 Cristy <quetzlzacatenango@image...>
    +
  3116. PFM images are grayscale, not sRGB (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22178).
  3117. +
  3118. Keep YCbCR JPEG compressed TIFF images in the YCbCr colorspace (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22148).
  3119. +
    2012-10-27 6.7.9-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  3120. Don't write sRGB chunk if image->gamma isn't close to (1/2.2), i.e., (0.45 <= gamma <= 0.46) (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22139).
  3121. +
    2012-10-25 6.8.0-3 Cristy <quetzlzacatenango@image...>
    +
  3122. New version 6.8.0-3, SVN revision 9783.
  3123. +
    2012-10-21 6.8.0-3 Cristy <quetzlzacatenango@image...>
    +
  3124. TIFF positional information must be positive (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22106).
  3125. +
  3126. Set the compression quality for the Webp image format.
  3127. +
    2012-10-21 6.8.0-2 Cristy <quetzlzacatenango@image...>
    +
  3128. New version 6.8.0-2, SVN revision 9738.
  3129. +
    2012-10-20 6.8.0-2 Cristy <quetzlzacatenango@image...>
    +
  3130. Wait for more bytes if the number of returned bytes is less than requested in ReadBlob().
  3131. +
  3132. Prefer fullname property for font, if it exists, otherwise family + style.
  3133. +
    2012-10-17 6.8.0-2 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3134. Added LanczosRadius filter, that blurs an EWA Lanczos to a integer support size. Equivalent to Lanczos in tensor resize case.
  3135. +
    2012-10-16 6.8.0-1 Cristy <quetzlzacatenango@image...>
    +
  3136. New version 6.8.0-1, SVN revision 9632.
  3137. +
    2012-10-12 6.8.0-1 Cristy <quetzlzacatenango@image...>
    +
  3138. Fix color management for the -solarize option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22059).
  3139. +
  3140. Some colormap unit tests failed for a quantum depth of 32 (problem report from Glenn Randers-Pehrson).
  3141. +
    2012-10-12 6.8.0-0 Cristy <quetzlzacatenango@image...>
    +
  3142. New version 6.8.0-0, SVN revision 9594.
  3143. +
    2012-10-07 6.8.0-0 Cristy <quetzlzacatenango@image...>
    +
  3144. Check -fx expression early to prevent fault.
  3145. +
  3146. Performance boost for iOS / Android requires a SO major version increment.
  3147. +
  3148. Corrupt PNG image could cause a memory leak (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22024).
  3149. +
    2012-10-06 6.7.9-10 Cristy <quetzlzacatenango@image...>
    +
  3150. New version 6.7.9-10, SVN revision 9514.
  3151. +
    2012-10-01 6.7.9-10 Cristy <quetzlzacatenango@image...>
    +
  3152. SVG specs says "1pt" equals "1.25px" (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21967).
  3153. +
  3154. Support TIFF proprietary tag 34118.
  3155. +
  3156. The define option is no longer "lazy" interpretation (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=22007).
  3157. +
    2012-10-01 6.7.9-9 Cristy <quetzlzacatenango@image...>
    +
  3158. New version 6.7.9-9, SVN revision 9473.
  3159. +
    2012-09-27 6.7.9-9 Cristy <quetzlzacatenango@image...>
    +
  3160. Fix memory leak in JPEG decoder when reading a corrupt image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21948).
  3161. +
  3162. Add exif:thumbnail namespace to distiguish orientation tag (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21938).
  3163. +
  3164. Respect DPX data offsets (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21960).
  3165. +
    2012-09-26 6.7.9-8 Cristy <quetzlzacatenango@image...>
    +
  3166. New version 6.7.9-8, SVN revision 9437.
  3167. +
    2012-09-24 6.7.9-8 Cristy <quetzlzacatenango@image...>
    +
  3168. Off-by-one error in DrawPolygonPrimitive().
  3169. +
  3170. Fix memory leak in WebP decoder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21943).
  3171. +
  3172. Certain caption phrases were cut off (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21550).
  3173. +
    2012-09-22 6.7.9-7 Cristy <quetzlzacatenango@image...>
    +
  3174. New version 6.7.9-7, SVN revision 9410.
  3175. +
    2012-09-20 6.7.9-7 Cristy <quetzlzacatenango@image...>
    +
  3176. jpeg:sampling-factor might be an image property or an option (reference
    https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=21884).
    +
  3177. 2012-09-15 6.7.9-6 Cristy <quetzlzacatenango@image...>
    +
  3178. New version 6.7.9-6, SVN revision 9375.
  3179. +
    2012-09-14 6.7.9-6 Cristy <quetzlzacatenango@image...>
    +
  3180. Don't compand the YCC colorspace, its already companded.
  3181. +
    2012-09-12 6.7.9-5 Cristy <quetzlzacatenango@image...>
    +
  3182. New version 6.7.9-5, SVN revision 9358.
  3183. +
    2012-09-12 6.7.9-5 Nicolas Robidoux <nicolas.robidoux@gmail...>
    +
  3184. Merge static inline Sigmoidal functions from IM7 to IM6.
  3185. +
    2012-09-12 6.7.8-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3186. All untapered windowing filters Welch and Cosine changed to use a 3 lobe support (like Lanczos). These were not part of the original 'zoom' program.
  3187. +
    2012-09-11 6.7.9-5 Nicolas Robidoux <nicolas.robidoux@gmail...>
    +
  3188. sigmoidal-contrast: prevent out of range argument.
  3189. +
    2012-09-09 6.7.9-5 Cristy <quetzlzacatenango@image...>
    +
  3190. The number of default OpenMP threads is 1 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=23&t=21838).
  3191. +
  3192. Only first image of raw grayscale image was set to GRAY (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21428).
  3193. +
  3194. Change sigmoidal-contrast define to inline method to conform with ANSI-C requirements.
  3195. +
    2012-09-10 6.7.9-5 Nicolas Robidoux <nicolas.robidoux@gmail...>
    +
  3196. enhance.c improvements:
  3197. +
  3198. Add tanh/atanh clone of legacy sigmoidal map (faster & more accurate);
  3199. +
  3200. Add final ClampToQuantum in sigmoidal colormap loop;
  3201. +
  3202. Remove OpenMP for threads that do not loop over rows;
  3203. +
  3204. Immediate no-op exit from sigmoidal-contrast if contrast<MagickEpsilon.
  3205. +
    2012-09-08 6.7.9-4 Cristy <quetzlzacatenango@image...>
    +
  3206. New version 6.7.9-4, SVN revision 9282.
  3207. +
    2012-09-05 6.7.9-4 Cristy <quetzlzacatenango@image...>
    +
  3208. Identify image files with embedded '%d' (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21798).
  3209. +
  3210. Don't include TIFF header for compress.c source module https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21800).
  3211. +
    2012-09-01 6.7.9-3 Cristy <quetzlzacatenango@image...>
    +
  3212. New version 6.7.9-3, SVN revision 9202.
  3213. +
    2012-08-28 6.7.9-3 Cristy <quetzlzacatenango@image...>
    +
  3214. Support -channel sync option for -equalize (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21746).
  3215. +
  3216. Don't remove color profile when setting the image colorspace (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21747).
  3217. +
  3218. Recognize ICO format in URL (e.g. http://www.google.com/favicon.ico).
  3219. +
  3220. Don't define HAVE_BOOLEAN for JPEG under MinGW (reference https://imagemagick.org/discourse-server//viewtopic.html?t=14071).
  3221. +
    2012-08-26 6.7.9-2 Cristy <quetzlzacatenango@image...>
    +
  3222. New version 6.7.9-2, SVN revision 9120.
  3223. +
    2012-08-25 6.7.9-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  3224. Fixed bug in Q32 builds that erroneously read grayscale 16-bit PNGs as PseudoColor.
  3225. +
    2012-08-24 6.7.9-2 Cristy <quetzlzacatenango@image...>
    +
  3226. Support -channel option for -solarize (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21738).
  3227. +
    2012-08-23 6.7.9-1 Cristy <quetzlzacatenango@image...>
    +
  3228. New version 6.7.9-1, SVN revision 9095.
  3229. +
    2012-08-22 6.7.9-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  3230. The gAMA chunk with gamma==1.0 was ignored while deciding whether to set the image colorspace to GRAY when reading grayscale PNG images.
  3231. +
    2012-08-16 6.7.9-1 Cristy <quetzlzacatenango@image...>
    +
  3232. Adjust scaling for Luv colorspace conversion (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21664).
  3233. +
  3234. Copy alpha channel of the -median option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=21694).
  3235. +
  3236. Don't add matte channel for -coalesce if input images don't have one.
  3237. +
  3238. Prevent memory leak in ImageToBlob() if image write fails.
  3239. +
  3240. In rare cases, label would not auto-size properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21716).
  3241. +
  3242. Identify command now reports the image colorspace for non-verbose results.
  3243. +
  3244. Account for stroke width when rendering a caption (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=21721).
  3245. +
  3246. Don't colorize alpha channel if it is not active (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21547
  3247. +
    2012-08-15 6.7.9-0 Cristy <quetzlzacatenango@image...>
    +
  3248. New version 6.7.9-0, SVN revision 8970.
  3249. +
    2012-08-14 6.7.9-0 Cristy <quetzlzacatenango@image...>
    +
  3250. RGB -> HCL, return correct hue when g < b < r (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=21646).
  3251. +
  3252. Prefer inkscape for best SVG compliance.
  3253. +
  3254. HCL -> RGB conversion enhancement (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=21663).
  3255. +
  3256. Utilize inkscape if it is in your execution path otherwise RSVG. If neither is available, revert to the internal SVG renderer.
  3257. +
  3258. Initialize image->x_resolution and y_resolution to 0 in image.c (previously they were initialized to DefaultResolution, which is 72.0).
  3259. +
    2012-08-12 6.7.8-10 Cristy <quetzlzacatenango@image...>
    +
  3260. New version 6.7.8-10, SVN revision 8915.
  3261. +
    2012-08-10 6.7.8-9 Cristy <quetzlzacatenango@image...>
    +
  3262. Respect the image mask for option -selective-blur (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21631).
  3263. +
  3264. Fix multiple issues with BMPv5 colorimetry (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21640).
  3265. +
    2012-08-10 6.7.8-9 Cristy <quetzlzacatenango@image...>
    +
  3266. New version 6.7.8-9, SVN revision 8902.
  3267. +
    2012-08-07 6.7.8-9 Cristy <quetzlzacatenango@image...>
    +
  3268. Selective blur stopped working after version 6.7.4-10 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21604).
  3269. +
  3270. Color reduction now handles transparent pixel properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18463).
  3271. +
  3272. ClipImagePath() now returns a valid SVG XML for Windows x64 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21617).
  3273. +
    2012-08-05 6.7.8-8 Cristy <quetzlzacatenango@image...>
    +
  3274. New version 6.7.8-8, SVN revision 8845.
  3275. +
    2012-08-03 6.7.8-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3276. Added 2d named convolution kernel Binomial (for Fred Wienhaus)
  3277. +
    2012-08-01 6.7.8-8 Nicolas Robidoux <nicolas.robidoux@gmail...>
    +
  3278. Clean up sigmoidal-contrast.
  3279. +
    2012-07-31 6.7.8-8 Cristy <quetzlzacatenango@image...>
    +
  3280. Use ConcatenateString() for multi-block GIF comments.
  3281. +
  3282. Caption no longer chops off text (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21558).
  3283. +
  3284. Support LUV colorspace.
  3285. +
  3286. Support HCL colorspace.
  3287. +
  3288. Don't transform the composite image colorspace, set it instead.
  3289. +
  3290. Interpret -border 5% as 5% of width and 5% of height (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21537).
  3291. +
  3292. Don't normalize zero-sum kernels (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21584).
  3293. +
  3294. Transform grayscale to linear RGB if fill color is non-gray (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21586).
  3295. +
    2012-07-30 6.7.8-7 Cristy <quetzlzacatenango@image...>
    +
  3296. New version 6.7.8-7, SVN revision 8766.
  3297. +
    2012-07-28 6.7.8-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  3298. Update certain typecasts for libpng < and >= 1.4.0 to allow memory allocation > 4GB and prevent a DOS.
  3299. +
    2012-07-28 6.7.8-7 Cristy <quetzlzacatenango@image...>
    +
  3300. Set DICOM grayscale images to the gray colorspace.
  3301. +
  3302. Missing grestore from ps3.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20445).
  3303. +
  3304. Use GetMagickResourceLimit(ThreadResource) to set the # threads (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21543).
  3305. +
    2012-07-22 6.7.8-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  3306. Only report sRGB, iCCP, gAMA, cHRM chunks in "identify" output when these chunks were actually present in input, and not when they were inserted by the PNG decoder.
  3307. +
    2012-07-22 6.7.8-6 Cristy <quetzlzacatenango@image...>
    +
  3308. New version 6.7.8-6, SVN revision 8720.
  3309. +
    2012-07-21 6.7.8-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  3310. Make sure "intent" is initialized in the PNG decoder.
  3311. +
    2012-07-21 6.7.8-5 Cristy <quetzlzacatenango@image...>
    +
  3312. New version 6.7.8-5, SVN revision 8717.
  3313. +
    2012-07-20 6.7.8-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  3314. Corrected an error in the logic introduced in 6.7.8-3 to always write a color PNG when image->colorspace is sRGB.
  3315. +
    2012-07-19 6.7.8-5 Cristy <quetzlzacatenango@image...>
    +
  3316. Inverse YUV colorspace now produces pure red as expected.
  3317. +
  3318. Support halted streams: cat image.pnm | convert 'pnm:fd:0[0]' 'pnm:fd:0[0]' x:.
  3319. +
    2012-07-18 6.7.8-4 Cristy <quetzlzacatenango@image...>
    +
  3320. New version 6.7.8-4, SVN revision 8697.
  3321. +
    2012-07-17 6.7.8-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  3322. Write ICON subimage as PNG32, only when its dimensions are 256x256 and image->compression is UndefinedCompression or ZipCompression.
  3323. +
    2012-07-16 6.7.8-4 Cristy <quetzlzacatenango@image...>
    +
  3324. sRGB color gradients should be in a non-linear colorspace.
  3325. +
  3326. Fix -fx to interpret scientific notation properly.
  3327. +
  3328. The draw epsilon was too sensitive.
  3329. +
    2012-07-15 6.7.8-3 Cristy <quetzlzacatenango@image...>
    +
  3330. New version 6.7.8-3, SVN revision 8675.
  3331. +
    2012-07-14 6.7.8-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  3332. Always write a color PNG when image->colorspace is sRGB.
  3333. +
    2012-07-08 6.7.8-3 Cristy <quetzlzacatenango@image...>
    +
  3334. Attenuate random noise (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21387).
  3335. +
  3336. Return linear grayscale for gradient:white-black.
  3337. +
  3338. Promote linear grayscale to linear RGB when compositing.
  3339. +
  3340. gradient:white-black is sRGB whereas gradient:'icc-color(rgb,255,255,255)- icc-color(rgb,0,0,0)' is linear RGB whereas gradient:'gray(255)-gray(0)' is linear grayscale.
  3341. +
  3342. Revert sigmoidal contrast define (reference https://imagemagick.org/discourse-server//viewtopic.html?f=22&t=21415).
  3343. +
    2012-07-08 6.7.8-2 Cristy <quetzlzacatenango@image...>
    +
  3344. New version 6.7.8-2, SVN revision 8621.
  3345. +
    2012-07-02 6.7.8-2 Cristy <quetzlzacatenango@image...>
    +
  3346. Set the colorspace to linear gray when reading intensity values (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21362).
  3347. +
  3348. Don't overrun pixel buffer on inverse fourier for odd image widths.
  3349. +
  3350. Change LAB encoding to permit blurring, resize, etc. (signed A and B channel values now stored using a 50% bias)
  3351. + Additional.. This removes a non-linear discontinuity from stored LAB space values. As a result you can now Blur, Compose, Resize and Distort in LAB colorspace, without problems that previously existed. +
    2012-07-04 6.7.8-1 Cristy <quetzlzacatenango@image...>
    +
  3352. New version 6.7.8-1, SVN revision 8595.
  3353. +
    2012-07-02 6.7.8-1 Cristy <quetzlzacatenango@image...>
    +
  3354. A single argument -stereo option now works as documented (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21348).
  3355. +
  3356. The -separate option returns channels as linear grayscale.
  3357. +
  3358. Remove the sRGB color profile when converting to grayscale (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=21355).
  3359. +
    2012-06-29 6.7.8-0 Cristy <quetzlzacatenango@image...>
    +
  3360. New version 6.7.8-0, SVN revision 8554.
  3361. +
    2012-06-28 6.8.0-0 Cristy <quetzlzacatenango@image...>
    +
  3362. Increase epsilon value, smallest difference between two points (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=15870).
  3363. +
    2012-06-28 6.7.7-10 Cristy <quetzlzacatenango@image...>
    +
  3364. New version 6.7.7-10, SVN revision 8534.
  3365. +
    2012-06-26 6.7.7-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  3366. Don't attempt to use Z_RLE compression strategy with old zlib (prior to zlib-1.2.0) that does not support it.
  3367. +
  3368. Increase PLTE chunk length to accommodate background color in indexed PNG (reference imagemagick.org/discourse-server/viewtopic.html?f=1&t=21288).
  3369. +
  3370. Added png:PLTE.number_colors to verbose output.
  3371. +
    2012-06-25 6.7.7-10 Cristy <quetzlzacatenango@image...>
    +
  3372. Permit linear RGB for PNM and TIFF image formats.
  3373. +
  3374. Fix conflicting types for 'GenerateDifferentialNoise' (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21286).
  3375. +
  3376. Fix cast to pointer from integer of different size (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21286).
  3377. +
  3378. Fix broken MSL profile tag (reference https://imagemagick.org/discourse-server//viewforum.html?f=9).
  3379. +
  3380. Better recognition of a CMYK PDF.
  3381. +
    2012-06-24 6.7.7-9 Cristy <quetzlzacatenango@image...>
    +
  3382. New version 6.7.7-9, SVN revision 8460.
  3383. +
    2012-06-23 6.7.7-9 Cristy <quetzlzacatenango@image...>
    +
  3384. Some options were incorrectly promoting linear gray to sRGB.
  3385. +
    2012-06-22 6.7.7-8 Cristy <quetzlzacatenango@image...>
    +
  3386. New version 6.7.7-8, SVN revision 8432.
  3387. +
    2012-06-15 6.7.7-8 Cristy <quetzlzacatenango@image...>
    +
  3388. Support the -features option in convert / mogrify.
  3389. +
  3390. Add support for the %[type] property.
  3391. +
    2012-06-15 6.7.7-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3392. Geometry arguments accept multiple sign character for offsets EG: "-10-10", "-+10-+10", or "+-10+-10" generate negative offsets while "+10+10", "++10++10", or "--10--10" generate positive offsets, that is, you can not only optionally have a sign in offset variable substitutions, but can negate that substitution if you so desire.
  3393. +
    2012-06-12 6.7.7-8 Nicolas Robidoux <nicolas.robidoux@gmail...>
    +
  3394. Refactor Catmull-Rom and Spline "interpolation" using state-of-the-art unpublished formulas.
  3395. +
  3396. Fix incorrect transparency handling of "interpolative" cubic B-spline smoothing.
  3397. +
    2012-06-09 6.7.7-8 Cristy <quetzlzacatenango@image...>
    +
  3398. Initialize alpha channel when floodfill fill color is not opaque.
  3399. +
  3400. XYZ and Lab colorspace conversion tweaked (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21161).
  3401. +
    2012-06-08 6.7.7-7 Cristy <quetzlzacatenango@image...>
    +
  3402. New version 6.7.7-7, SVN revision 8219.
  3403. +
    2012-06-06 6.7.7-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  3404. Disabled the new libpng-1.5.10 test for invalid palette index when reading a PNG or MNG (for speed), or when writing a MNG (because a zero-length PLTE is valid in a MNG when the global PLTE is used).
  3405. +
  3406. Display the PNG colortype as a string in "identify -verbose" output.
  3407. +
    2012-06-06 6.7.7-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3408. Small refactor of Average Interpolators (save some multiplies)
  3409. +
  3410. Added 'Spline' as a filter type as an alias to 'Cubic'. This brings both Catrom and Spline -filter and -interpolate methods in line. Cubic should only be used when defining a general cubic using expert settings or when listed in "filter:verbose" debugging output.
  3411. +
    2012-06-05 6.7.7-6 Cristy <quetzlzacatenango@image...>
    +
  3412. New version 6.7.7-6, SVN revision 8164.
  3413. +
    2012-06-05 6.7.7-6 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3414. Renamed 'Bicubic' interpolation the more precise definition 'Catrom' Old name kept (but hidden) for backward compatibility in bit CLI and API interfaces.
  3415. +
    2012-06-01 6.7.7-6 Cristy <quetzlzacatenango@image...>
    +
  3416. The -set colorspace option sets the colorspace, it does not transform it.
  3417. +
  3418. Assume grayscale images in the GIF format are linear.
  3419. +
  3420. Add Nicolas Robidoux's bicubic interpolation method (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=21118). This replaces the old 'bicubic' which was very extreme 'cardinal' cubic.
  3421. +
  3422. Add DuPont & XFIG copyright to NOTICE.
  3423. +
  3424. sRGB.icc has an unfriendly license, remove it.
  3425. +
  3426. MinGW does not define KEY_WOW64_32KEY (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=21155).
  3427. +
  3428. -evaluate log properly handles negative pixel values.
  3429. +
  3430. The display program displays the ImageMagick logo on EOF.
  3431. +
    2012-05-31 6.7.7-5 Cristy <quetzlzacatenango@image...>
    +
  3432. New version 6.7.7-5, SVN revision 8099.
  3433. +
    2012-05-31 6.7.7-5 Cristy <quetzlzacatenango@image...>
    +
  3434. Set terminal character for GIF comment.
  3435. +
    2012-05-30 6.7.7-4 Cristy <quetzlzacatenango@image...>
    +
  3436. New version 6.7.7-4, SVN revision 8096.
  3437. +
    2012-05-30 6.7.7-4 Cristy <quetzlzacatenango@image...>
    +
  3438. 'convert 1-bit.tif -rotate 90 ...' returns a 1-bit TIFF image as expected.
  3439. +
    2012-05-29 6.7.7-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  3440. Ignore APNG chunks even when libpng is built with the "APNG patch".
  3441. +
    2012-05-29 6.7.7-3 Cristy <quetzlzacatenango@image...>
    +
  3442. New version 6.7.7-3, SVN revision 8089.
  3443. +
    2012-05-28 6.7.7-3 Cristy <quetzlzacatenango@image...>
    +
  3444. Fix bug with stroke-dasharray (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21090).
  3445. +
  3446. In rare cases, caption would not word-wrap properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21106).
  3447. +
  3448. Don't set alpha pixels in SetImageVirtualPixelMethod() unless image area is well defined (i.e. != 0) (reference https://imagemagick.org/discourse-server//viewtopic.html?t=21110).
  3449. +
    2012-05-27 6.7.7-3 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3450. Trialing the addition of new interpolation methods Average16 average of 16 pixels around sampling point Average9 9 pixels around nearest pixel Average4 Average of 4 pixels around sampling point Background Background color (for resampling error checking) Blend Blend of closest 1, 2 or 4 pixel neighbors NOTE: 'Average' is now equivalent to 'Average4', previous to this version it was equivalent to 'Average16'. The 'Background' method is for showing 'resample errors' be it accidental, or on purpose. See IM Examples, Cylindrical Filters.
  3451. +
  3452. added -interpolative-resize added around this version
  3453. +
    2012-05-26 6.7.7-2 Cristy <quetzlzacatenango@image...>
    +
  3454. New version 6.7.7-2, SVN revision 8066.
  3455. +
    2012-05-26 6.7.7-2 Cristy <quetzlzacatenango@image...>
    +
  3456. MagickDelay() is in microseconds, not milliseconds.
  3457. +
    2012-05-25 6.7.7-1 Cristy <quetzlzacatenango@image...>
    +
  3458. New version 6.7.7-1, SVN revision 8059.
  3459. +
    2012-05-20 6.7.7-1 Cristy <quetzlzacatenango@image...>
    +
  3460. In rare cases, caption would not word-wrap properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21044).
  3461. +
  3462. Set the JPEG image colorspace after the columns / rows are set (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21059).
  3463. +
  3464. Potential gray images are in either the gray or RGB colorspaces.
  3465. +
  3466. Restore MagickSetImageEndian() method (reference https://imagemagick.org/discourse-server//viewtopic.html?t=20425&p=81525).
  3467. +
  3468. Respect resolution when rendering SVG (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21076).
  3469. +
    2012-05-20 6.7.7-1 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3470. Delegates now 'spawn' faster (replaced 2 second sleep!) (for "show:")
  3471. +
    2012-05-17 6.7.7-0 Cristy <quetzlzacatenango@image...>
    +
  3472. New version 6.7.7-0, SVN revision 7980.
  3473. +
    2012-05-17 6.7.7-0 Cristy <quetzlzacatenango@image...>
    +
  3474. Group4-compressed TIFF / PDF image formats stopped working (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=21039).
  3475. +
  3476. Auto convert images in the grayscale colorspace to sRGB (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=21031).
  3477. +
    2012-05-16 6.7.6-10 Cristy <quetzlzacatenango@image...>
    +
  3478. New version 6.7.6-10, SVN revision 7952.
  3479. +
    2012-05-14 6.7.6-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  3480. Reset color info in grayscale PNG images to gamma=1.0, undefined rendering_intent and chromaticity only when reading images that don't have a gAMA, sRGB, or cHRM chunk.
  3481. +
    2012-05-14 6.7.6-10 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3482. Added a low level "Cosine" Windowing Filter -- Request by Nicholas Robidox
  3483. +
  3484. Fixed Kaiser Window Filter (was producing all zeros!)
  3485. +
  3486. Kaiser Window Function now uses the working value "filter:kaiser-beta" (formerly "filter:alpha" in previous versions)
  3487. +
  3488. Setting the expert option "filter:kaiser-alpha" will override this, (after being multiplied by PI).
  3489. +
  3490. Added resampling 'weight' sanity check in EWA resampling.
  3491. +
  3492. Set default for histogram:unique-colors to be 'true' when undefined Returning it to previous behavior.
  3493. +
  3494. Refactor of InterpretImageProperties() (percent escape substitutions)
  3495. +
  3496. Add "gamma" as a -set and % escape to access image gamma meta-data
  3497. +
    2012-05-05 6.7.6-9 Cristy <quetzlzacatenango@image...>
    +
  3498. New version 6.7.6-9, SVN revision 7812.
  3499. +
    2012-05-05 6.7.6-9 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3500. Allow braced single letter escapes, EG "%[x]" as equivalent to "%x"
  3501. +
    2012-05-04 6.7.6-9 Glenn Randers-Pehrson <glennrp@image...>
    +
  3502. Don't write an invalid PNG sRGB chunk when rendering intent is undefined.
  3503. +
    2012-05-01 6.7.6-9 Cristy <quetzlzacatenango@image...>
    +
  3504. EXR images are in the linear RGB colorspace with a gamma of 1.0 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=20895).
  3505. +
  3506. Correct annotation offset for right-to-left labels (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20884).
  3507. +
  3508. The -level 100x0% now produces the equivalent of -negate (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20889).
  3509. +
  3510. Virtual pixel transparent no longer cause fatal exception (reference https://imagemagick.org/discourse-server//viewtopic.html?t=20903).
  3511. +
  3512. Promote gray image to sRGB when color is injected.
  3513. +
    2012-04-29 6.7.6-8 Cristy <quetzlzacatenango@image...>
    +
  3514. New version 6.7.6-8, SVN revision 7705.
  3515. +
    2012-04-25 6.7.6-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3516. Gaussian Filter Fixed. For some strange reason it was half the width it should be with an effective sigma of 0.25 (not 0.5). This was the real reason "variable blur" was not blurring enough.
  3517. +
    2012-04-24 6.7.6-8 Cristy <quetzlzacatenango@image...>
    +
  3518. Colorspace round-trip unit tests now work for Q32.
  3519. +
    2012-04-23 6.7.6-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3520. Added the RobidouxSharp filter (originally defined Dec 2011)
  3521. +
  3522. Fixed Variable Blur - bad blur area calculation Also Gaussian is sampling properly. Substitute the faster Cubic for now.
  3523. +
  3524. Convert no longer will do an implicit write to a single space image.
  3525. +
    2012-04-21 6.7.6-7 Cristy <quetzlzacatenango@image...>
    +
  3526. New version 6.7.6-7, SVN revision 7587.
  3527. +
    2012-04-21 6.7.6-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3528. Error when doing an implicit (final) write to a single space filename. This is typically a failed line continuation and is very common. Using an explicit "-write" will let you do this.
  3529. +
    2012-04-20 6.7.6-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3530. Allow +-X+-Y as geometry arguments.
  3531. +
    2012-04-17 6.7.6-7 Cristy <quetzlzacatenango@image...>
    +
  3532. Distinguish grayscale as sRGB not linear RGB.
  3533. +
    2012-04-16 6.7.6-6 Cristy <quetzlzacatenango@image...>
    +
  3534. New version 6.7.6-6, SVN revision 7536.
  3535. +
    2012-04-11 6.7.6-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  3536. Always unlock the semaphore before returning from the png codec, either by a "return" or png_error(); changed all Magick*Exception() calls after setjmp() to png_error() to ensure proper cleanup (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16883).
  3537. +
    2012-04-10 6.7.6-6 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3538. Fixed log known alpha*kernel normalization bug in morphology convolve.
  3539. + Convolve kernel weights have been separated from alpha blend handling. Un-normalized kernels applied to images with active alpha will no longer be auto-normalized due to the effect of alpha blending. The bug causes images using the default channel setting and having an alpha channel to automatically 'normalize' the results of a convolve during the handling of alpha blending. This probably would cause severe effects when a zero-summing kernel is being used on an image containing an active (though likely fully-opaque) alpha channel, as division by near zero weights would cause extreme color values in results. This bug is not normally seen as convolution, which is normally applied only to fully-opaque images. And using a zero-summing kernel on an image with alpha also results in a transparent image! This is why it was not fixed up until now. +
    2012-04-08 6.7.6-6 Cristy <quetzlzacatenango@image...>
    +
  3540. Pixel allocation for Pango is stride*rows not stride*columns.
  3541. +
  3542. Set the image resolution for Postscript files with an embedded Photoshop profile.
  3543. +
  3544. Ensure proper round trips to / from sRGB (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20751).
  3545. +
    2012-04-07 6.7.6-5 Cristy <quetzlzacatenango@image...>
    +
  3546. New version 6.7.6-5, SVN revision 7483.
  3547. +
    2012-04-06 6.7.6-5 Cristy <quetzlzacatenango@image...>
    +
  3548. Avoid fault in SetCacheAlphaChannel() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20681).
  3549. +
  3550. Don't assume EXIF orientation tag is 2 bytes.
  3551. +
    2012-04-04 6.7.6-4 Cristy <quetzlzacatenango@image...>
    +
  3552. New version 6.7.6-4, SVN revision 7356.
  3553. +
    2012-04-01 6.7.6-4 Cristy <quetzlzacatenango@image...>
    +
  3554. Properly set the XCF alpha channel values (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20642).
  3555. +
  3556. Support 'orientation' property (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=20650).
  3557. +
  3558. The default RGB colorspace transform is now linear (reference https://imagemagick.org/discourse-server//viewtopic.html?p=82839#p82839).
  3559. +
  3560. Prevent EXIF integer overflow (CVE-2012-1610).
  3561. +
    2012-03-30 6.7.6-3 Cristy <quetzlzacatenango@image...>
    +
  3562. New version 6.7.6-3, SVN revision 7290.
  3563. +
    2012-03-29 6.7.6-3 Cristy <quetzlzacatenango@image...>
    +
  3564. Don't copy invalid memory when reading TIFF EXIF IFD (CERT-FI case 634116, CVE-2012-1798).
  3565. +
  3566. Bail if we receive excessive JPEG warnings (CERT-FI case 634117, CVE-2012-0260).
  3567. +
  3568. Properly initialize EXIF buffers to prevent JPEG EXIF tag crash (CERT-FI case 634118, CVE-2012-0259).
  3569. +
    2012-03-28 6.7.6-2 Cristy <quetzlzacatenango@image...>
    +
  3570. New version 6.7.6-2, SVN revision 7245.
  3571. +
    2012-03-26 6.7.6-2 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3572. Added "Nearest" as a synonym for "Nearest-Neighbor" interpolate setting
  3573. +
    2012-03-21 6.7.6-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  3574. coders/png.c: stored "file_gamma" for later use by identify.
  3575. +
    2012-03-19 6.7.6-2 Cristy <quetzlzacatenango@image...>
    +
  3576. Add full support for Pango markup.
  3577. +
  3578. Pango namespace is 'pango:', not 'caption:'.
  3579. +
  3580. Correct for EXR images with broken display windows.
  3581. +
    2012-03-18 6.7.6-1 Cristy <quetzlzacatenango@image...>
    +
  3582. New version 6.7.6-1, SVN revision 7145.
  3583. +
    2012-03-16 6.7.6-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  3584. Reduce the scope of quantum_info in the PNG decoder to avoid a possible memory leak (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20522).
  3585. +
    2012-03-13 6.7.6-1 Cristy <quetzlzacatenango@image...>
    +
  3586. Use uint32 pointer for ReadStripMethod in coders/tiff.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20526).
  3587. +
  3588. Ghostscript 32/64 bit detection patch (contributed by axeld@pinc-...).
  3589. +
  3590. Honor center gravity for caption: with Pango support (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20517).
  3591. +
  3592. Add support for pango: coder to render captions with Pango.
  3593. +
    2012-03-10 6.7.6-0 Cristy <quetzlzacatenango@image...>
    +
  3594. New version 6.7.6-0, SVN revision 7090.
  3595. +
    2012-03-06 6.7.6-0 Cristy <quetzlzacatenango@image...>
    +
  3596. Importing from the X11 root windows no longer leaks memory (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20470).
  3597. +
  3598. Check to see if delegate file exists before copying.
  3599. +
    2012-03-05 6.7.5-10 Cristy <quetzlzacatenango@image...>
    +
  3600. New version 6.7.5-10, SVN revision 7056.
  3601. +
    2012-03-05 6.7.5-10 Cristy <quetzlzacatenango@image...>
    +
  3602. Fix too many arguments to AnnotateImage() (copy/paste bug).
  3603. +
    2012-03-02 6.7.5-9 Cristy <quetzlzacatenango@image...>
    +
  3604. New version 6.7.5-9, SVN revision 7046.
  3605. +
    2012-02-29 6.7.5-9 Cristy <quetzlzacatenango@image...>
    +
  3606. Caption no longer includes the prefix "caption:" in the rendered text.
  3607. +
  3608. Auto scale pointsize for -size 100x100 caption:
  3609. +
    2012-03-02 6.7.5-8 Cristy <quetzlzacatenango@image...>
    +
  3610. New version 6.7.5-8, SVN revision 7027.
  3611. +
    2012-03-02 6.7.5-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  3612. non-verbose identify now reports DirectClass for transparent PNG images to agree with the report by identify -verbose. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20448 and https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=15482).
  3613. +
    2012-02-29 6.7.5-8 Cristy <quetzlzacatenango@image...>
    +
  3614. Support infinite caption lengths.
  3615. +
  3616. Permit custom JPEG quantization tables (e.g. -define jpeg:q-table=quantization-table.xml).
  3617. +
  3618. Missing grestore from ps2.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20445).
  3619. +
    2012-02-29 6.7.5-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3620. Added Image list options (like "-delete" and "-swap") to "montage".
  3621. +
    2012-02-25 6.7.5-7 Cristy <quetzlzacatenango@image...>
    +
  3622. New version 6.7.5-7, SVN revision 6965.
  3623. +
    2012-02-23 6.7.5-7 Cristy <quetzlzacatenango@image...>
    +
  3624. Add support for the EMFPlus delegate program.
  3625. +
    2012-02-22 6.7.5-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3626. Re-added the Iterative Distance function in morphology (as opposed to the faster more direct 2-pass Distance Function that replaced it) so it can be used in the special situation of Constrained Distance Morphology. https://imagemagick.org/discourse-server//viewtopic.html??f=2&t=18032
  3627. +
    2012-02-13 6.7.5-6 Cristy <quetzlzacatenango@image...>
    +
  3628. New version 6.7.5-6, SVN revision 6851.
  3629. +
    2012-02-13 6.7.5-6 Cristy <quetzlzacatenango@image...>
    +
  3630. Only set PDF & PS page size when explicitly requested (e.g. -page).
  3631. +
    2012-02-12 6.7.5-5 Cristy <quetzlzacatenango@image...>
    +
  3632. New version 6.7.5-5, SVN revision 6840.
  3633. +
    2012-02-12 6.7.5-5 Cristy <quetzlzacatenango@image...>
    +
  3634. Only use the canvas size of the very first frame of a GIF image sequence.
  3635. +
    2012-02-11 6.7.5-4 Cristy <quetzlzacatenango@image...>
    +
  3636. New version 6.7.5-4, SVN revision 6824.
  3637. +
    2012-02-08 6.7.5-4 Cristy <quetzlzacatenango@image...>
    +
  3638. Set image alpha channel for -virtual-pixel background and transparent.
  3639. +
  3640. Get tiff:fill-order as an image artifact, not an image option.
  3641. +
    2012-02-06 6.7.5-3 Cristy <quetzlzacatenango@image...>
    +
  3642. New version 6.7.5-3, SVN revision 6732.
  3643. +
    2012-02-06 6.7.5-3 Cristy <quetzlzacatenango@image...>
    +
  3644. TIFF no longer writes the incorrect fill order.
  3645. +
    2012-02-05 6.7.5-2 Cristy <quetzlzacatenango@image...>
    +
  3646. New version 6.7.5-2, SVN revision 6718.
  3647. +
    2012-02-03 6.7.5-2 Cristy <quetzlzacatenango@image...>
    +
  3648. Add SyncImagePixelCache() to ensure cache morphology is consistent.
  3649. +
  3650. Patch so two -colorspace options return correct results for round-trip.
  3651. +
    2012-02-02 6.7.5-1 Cristy <quetzlzacatenango@image...>
    +
  3652. New version 6.7.5-1, SVN revision 6684.
  3653. +
    2012-01-30 6.7.5-1 Cristy <quetzlzacatenango@image...>
    +
  3654. Support the -alpha remove option (use it to remove transparency from PDF, convert -density 200 apple.pdf -alpha remove x:).
  3655. +
  3656. Use union instead of casting gzFile and BZFILE.
  3657. +
  3658. Don't treat PSD user channel as alpha (patch from Dominic Benson).
  3659. +
  3660. Prevent overflow when casting short int to size_t when parsing a maliciously crafted image with an IFD whose all IOP tags' value offsets point to the beginning of the IFD itself [CVE-2012-0247].
  3661. +
  3662. Prevent DES when parsing a maliciously crafted image with an IFD whose all IOP tags' value offsets point to the beginning of the IFD itself [CVE-2012-0248].
  3663. +
  3664. Caption with Pango support no longer return a blank canvas.
  3665. +
  3666. Correct sRGB colorspace conversion equations.
  3667. +
    2012-01-30 6.7.5-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  3668. Fix bug in png coder (spurious warning, reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=20257).
  3669. +
    2012-01-28 6.7.5-0 Cristy <quetzlzacatenango@image...>
    +
  3670. New version 6.7.5-0, SVN revision 6606.
  3671. +
    2012-01-25 6.7.5-0 Cristy <quetzlzacatenango@image...>
    +
  3672. Zlib-1.2.5.2 requires gzFile cast (bug report from John Bowler).
  3673. +
    2012-01-25 6.7.4-10 Cristy <quetzlzacatenango@image...>
    +
  3674. New version 6.7.4-10, SVN revision 6592.
  3675. +
    2012-01-25 6.7.4-10 Cristy <quetzlzacatenango@image...>
    +
  3676. Update PerlMagick TIFF regression signatures to match endian order.
  3677. +
    2012-01-24 6.7.4-9 Cristy <quetzlzacatenango@image...>
    +
  3678. New version 6.7.4-9, SVN revision 6589.
  3679. +
    2012-01-24 6.7.4-9 Cristy <quetzlzacatenango@image...>
    +
  3680. Fix rare file link in the pixel cache.
  3681. +
    2012-01-20 6.7.4-8 Cristy <quetzlzacatenango@image...>
    +
  3682. New version 6.7.4-8, SVN revision 6551.
  3683. +
    2012-01-19 6.7.4-8 Cristy <quetzlzacatenango@image...>
    +
  3684. Although MagickRealType is a double, use double for KernelInfo values in the rare event of problems with C++ name mangling.
  3685. +
  3686. Get strokes with patterns (e.g. -stroke xc:red) working again.
  3687. +
  3688. Revert KernelInfo values from MagickRealType to double.
  3689. +
    2012-01-17 6.7.4-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  3690. Don't write ancillary chunks (except for tRNS and gAMA) in PNG-encoded ICO files.
  3691. +
    2012-01-14 6.7.4-7 Cristy <quetzlzacatenango@image...>
    +
  3692. New version 6.7.4-7, SVN revision 6471.
  3693. +
    2012-01-13 6.7.4-7 Cristy <quetzlzacatenango@image...>
    +
  3694. Default to a lighter hinting algorithm for non-monochrome font rendering.
  3695. +
    2012-01-12 6.7.4-6 Cristy <quetzlzacatenango@image...>
    +
  3696. New version 6.7.4-6, SVN revision 6434.
  3697. +
    2012-01-12 6.7.4-6 Cristy <quetzlzacatenango@image...>
    +
  3698. Eliminate preprocessor exception for the HDRI build.
  3699. +
    2012-01-10 6.7.4-5 Cristy <quetzlzacatenango@image...>
    +
  3700. New version 6.7.4-5, SVN revision 6422.
  3701. +
    2012-01-02 6.7.4-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  3702. Fixed -black-threshold and -white-threshold so they work properly with the -channels option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20096).
  3703. +
    2012-01-02 6.7.4-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  3704. Removed PNG_USE_CLONE cruft from the PNG encoder (see 2011-11-19 entry)
  3705. +
  3706. Promote image depths 9-15 to 16 to avoid crashing in the PNG encoder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20098).
  3707. +
    2012-01-01 6.7.4-4 Cristy <quetzlzacatenango@image...>
    +
  3708. New version 6.7.4-4, SVN revision 6318.
  3709. +
    2011-12-30 6.7.4-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  3710. Fix problems with JNG encoder "quality" (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20076).
  3711. +
    2011-12-30 6.7.4-3 Cristy <quetzlzacatenango@image...>
    +
  3712. New version 6.7.4-3, SVN revision 6310.
  3713. +
    2011-12-28 6.7.4-3 Cristy <quetzlzacatenango@image...>
    +
  3714. Fix memory leak in JP2 coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20071).
  3715. +
  3716. Use maximum bounds when rendering PDF (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20078).
  3717. +
    2011-12-25 6.7.4-2 Cristy <quetzlzacatenango@image...>
    +
  3718. New version 6.7.4-2, SVN revision 6254.
  3719. +
    2011-12-24 6.7.4-2 Cristy <quetzlzacatenango@image...>
    +
  3720. Export new Windows binaries.
  3721. +
    2011-12-21 6.7.4-1 Cristy <quetzlzacatenango@image...>
    +
  3722. New version 6.7.4-1, SVN revision 6236.
  3723. +
    2011-12-12 6.7.4-0 Cristy <quetzlzacatenango@image...>
    +
  3724. Sped up -noise option when radius is 0.
  3725. +
  3726. Read concatenated arcs correctly in a SVG path (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19992).
  3727. +
  3728. PDF's now convert properly with -define pdf:use-cropbox=true (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=20033).
  3729. +
    2011-12-09 6.7.4-0 Cristy <quetzlzacatenango@image...>
    +
  3730. New version 6.7.4-0, SVN revision 6162.
  3731. +
    2010-12-06 6.7.4-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  3732. Eliminated use of FARDATA in coders/png.c; it won't be supported in libpng-1.6.0 and is not needed now.
  3733. +
    2011-11-29 6.7.4-0 Cristy <quetzlzacatenango@image...>
    +
  3734. Add GetQuantumFormat() method to return the quantum format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=19961).
  3735. +
  3736. Allow unspecified width/height in geometries with the aspect flag (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19964).
  3737. +
  3738. MagickGetImageDepth() no longer returns the depth setting but instead computes the depth of the image.
  3739. +
    2011-12-02 6.7.4-0 Anthony <quetzlzacatenango@image...>
    +
  3740. Fixed Equal-Area Cropping (size and minimum of delta increments)
  3741. +
    2011-12-01 6.7.3-10 Cristy <quetzlzacatenango@image...>
    +
  3742. New version 6.7.3-10, SVN revision 6106.
  3743. +
    2011-11-29 6.7.3-10 Cristy <quetzlzacatenango@image...>
    +
  3744. Delay reading TIFF EXIF properties to prevent premature exit.
  3745. +
  3746. Remove duplicates from the configuration file search path under Windows.
  3747. +
  3748. Use viewbox offset when setting affine transform translation (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19943).
  3749. +
  3750. Ensure equally sized tiles for -crop 11x2@ (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18322).
  3751. +
  3752. Recognize SI prefixes for jpeg:extent (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19944).
  3753. +
    2011-11-27 6.7.3-9 Cristy <quetzlzacatenango@image...>
    +
  3754. New version 6.7.3-9, SVN revision 6092
  3755. +
    2011-11-27 6.7.3-9 Cristy <quetzlzacatenango@image...>
    +
  3756. Upgrade libtool / ltdl to version 2.4.7.
  3757. +
    2011-11-25 6.7.3-8 Cristy <quetzlzacatenango@image...>
    +
  3758. New version 6.7.3-8, SVN revision 6084
  3759. +
    2011-11-20 6.7.3-8 Cristy <quetzlzacatenango@image...>
    +
  3760. The exif:ExposureBiasValue property is a signed value.
  3761. +
  3762. Prevent buffer underflow for 1-bit PSD images.
  3763. +
  3764. Don't include alpha channel when computing range unless image->matte is set.
  3765. +
  3766. Set FILETYPE_REDUCEDIMAGE tag on pyramidal TIFF images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19892).
  3767. +
  3768. Correct image geometry for Postscript for hi-res bounding box (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19807).
  3769. +
    2011-11-19 6.7.3-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  3770. Fixed bug with scaling Q16 background to PNG sub-8-bit bKGD and again disabled PNG_USE_CLONE in coders/png.c.
  3771. +
    2011-11-18 6.7.3-7 Cristy <quetzlzacatenango@image...>
    +
  3772. New version 6.7.3-7, SVN revision 6024
  3773. +
    2011-11-18 6.7.3-7 Cristy <quetzlzacatenango@image...>
    +
  3774. Ensure embedded XML resource file is null terminated (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19856).
  3775. +
    2011-11-17 6.7.3-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3776. Added a -define filter:alpha to contol the 'alpha value' of the Kaiser Windowing filter. Default value is 6.5
  3777. +
    2010-11-15 6.7.3-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  3778. Reverted the change of 6.6.6-7 that creates an image clone for use by the PNG encoder. This was not useful and was somewhat wasteful.
  3779. +
  3780. After finding out that writing the bKGD chunk in sub-8-bit PNG fails, enabled PNG_USE_CLONE (to create an image clone again)
  3781. +
    2011-11-14 6.7.3-6 Cristy <quetzlzacatenango@image...>
    +
  3782. New version 6.7.3-6, SVN revision 5972.
  3783. +
    2011-11-11 6.7.3-6 Cristy <quetzlzacatenango@image...>
    +
  3784. Prefer the hires bounding box for Postscript rendering (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19807).
  3785. +
  3786. Default configure.xml destination folder to /usr/lib/ImageMagick-ver/config.
  3787. +
    2011-11-09 6.7.3-5 Cristy <quetzlzacatenango@image...>
    +
  3788. New version 6.7.3-5, SVN revision 5936
  3789. +
    2011-11-07 6.7.3-4 Cristy <quetzlzacatenango@image...>
    +
  3790. Add ShearRotateImage() method. RotateImage() now uses distorts rather than shears.
  3791. +
  3792. MagickCoreGenesis() path must be accessible to use (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19795).
  3793. +
    2011-11-06 6.7.3-4 Cristy <quetzlzacatenango@image...>
    +
  3794. New version 6.7.3-4, SVN revision 5876
  3795. +
    2011-11-02 6.7.3-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  3796. Ensure that the GIF encoder writes a large enough logical screen (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19734).
  3797. +
    2011-11-02 6.7.3-3 Cristy <quetzlzacatenango@image...>
    +
  3798. New version 6.7.3-3, SVN revision 5825
  3799. +
    2011-11-02 6.7.3-3 Cristy <quetzlzacatenango@image...>
    +
  3800. Fix small memory leak in the TIFF coder.
  3801. +
  3802. Support -debug accelerate option.
  3803. +
  3804. Support -includearch-dir and -sharearch-dir configure option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19720).
  3805. +
  3806. Use Pango to improve the caption coder.
  3807. +
    2011-11-01 6.7.3-2 Cristy <quetzlzacatenango@image...>
    +
  3808. New version 6.7.3-2, SVN revision 5718
  3809. +
    2011-11-01 6.7.3-2 Cristy <quetzlzacatenango@image...>
    +
  3810. Support Ghostscript under 64-bit Windows (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19659).
  3811. +
  3812. Correct affine translation for certain SVG files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19664).
  3813. +
  3814. -evaluate-sequence multiply no longer hangs ereference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19549).
  3815. +
    2011-10-15 6.7.3-1 Cristy <quetzlzacatenango@image...>
    +
  3816. New version 6.7.3-1.
  3817. +
    2011-10-15 6.7.3-1 Cristy <quetzlzacatenango@image...>
    +
  3818. Read TIFF EXIF profile before reading the image data.
  3819. +
  3820. Fix "test: no: unexpected operator" in the configure script (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19615).
  3821. +
  3822. Off by one error when writing the JPEG XMP profile (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19616).
  3823. +
  3824. Revert GetPathComponent() patch.
  3825. +
    2011-10-09 6.7.3-0 Cristy <quetzlzacatenango@image...>
    +
  3826. New version 6.7.3-0.
  3827. +
    2011-10-09 6.7.3-0 Cristy <quetzlzacatenango@image...>
    +
  3828. Generate output for caption:"[!]" (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=19589.
  3829. +
    2011-10-05 6.7.3-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  3830. Add "png:format" property with possible values png8, png24, and png32, for use when prepending the format type to the filename is not convenient or is not possible, e.g., when embedding the PNG in a PNG-encoded ICO.
  3831. +
    2011-10-04 6.7.2-10 Cristy <quetzlzacatenango@image...>
    +
  3832. New version 6.7.2-10.
  3833. +
    2011-10-04 6.7.2-10 Cristy <quetzlzacatenango@image...>
    +
  3834. Remove most of the LLVM compiler warnings.
  3835. +
  3836. Fix bug in -evaluate-sequence multiply (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19549).
  3837. +
  3838. Upgrade to sRGB V4 ICC profile (reference http://www.color.org/srgbprofiles.xalter).
  3839. +
  3840. Distinguish embedded PNG vs BMP within the MicroSoft ICON image format.
  3841. +
    2011-09-30 6.7.2-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  3842. Recognize the sRGB version 4 ICC profile and write PNG sRGB chunk instead.
  3843. +
  3844. Use crc32 instead of "sRGB" string to recognize certain sRGB profiles.
  3845. +
    2011-09-26 6.7.2-9 Cristy <quetzlzacatenango@image...>
    +
  3846. New version 6.7.2-9.
  3847. +
    2011-09-26 6.7.2-9 Cristy <quetzlzacatenango@image...>
    +
  3848. Fix race condition on image rotate @ 90 degrees.
  3849. +
    2011-09-25 6.7.2-8 Cristy <quetzlzacatenango@image...>
    +
  3850. New version 6.7.2-8.
  3851. +
    2011-09-20 6.7.2-8 Cristy <quetzlzacatenango@image...>
    +
  3852. Prevent infinite loop when font is too large for specified width (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19502).
  3853. +
  3854. Fix LFS cross-compile detection (patch from Mike Frysinger).
  3855. +
  3856. Add open_utf8(), fopen_utf8(), access_utf8(), etc. utility methods.
  3857. +
    2011-09-15 6.7.2-7 Cristy <quetzlzacatenango@image...>
    +
  3858. Convert empty .htm / .html file no longer removes source file.
  3859. +
  3860. -crop 11x2@ now returns 22 images as expected.
  3861. +
  3862. Enable reading the EXIF profile in a TIFF image under Windows.
  3863. +
  3864. Support drawing text with bitmap font.
  3865. +
    2011-09-13 6.7.2-6 Cristy <quetzlzacatenango@image...>
    +
  3866. New version 6.7.2-6.
  3867. +
    2011-09-12 6.7.2-6 Cristy <quetzlzacatenango@image...>
    +
  3868. Expand pixel range for 12 bit DCM images stored in 16-bit words.
  3869. +
  3870. Gray images not displayed properly when saved as MIFF with sRGB colorspace.
  3871. +
  3872. OpenCL's clCreateContextFromType() no longer returns a system default.
  3873. +
  3874. Use -enable-zero-configuration for zero configuration ImageMagick (previously -enable-embeddable).
  3875. +
    2011-09-10 6.7.2-5 Cristy <quetzlzacatenango@image...>
    +
  3876. New version 6.7.2-5.
  3877. +
    2011-09-10 6.7.2-5 Cristy <quetzlzacatenango@image...>
    +
  3878. SO bump.
  3879. +
    2011-09-09 6.7.2-4 Cristy <quetzlzacatenango@image...>
    +
  3880. New version 6.7.2-4.
  3881. +
    2011-09-05 6.7.2-4 Cristy <quetzlzacatenango@image...>
    +
  3882. Fix cut-n-paste error when reading JPEG profiles.
  3883. +
    2011-09-07 6.7.2-3 Cristy <quetzlzacatenango@image...>
    +
  3884. New version 6.7.2-3.
  3885. +
    2011-09-05 6.7.2-3 Cristy <quetzlzacatenango@image...>
    +
  3886. A small memory overwrite when reading TIFF with 1-bit alpha (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19417).
  3887. +
  3888. Remove a 2 byte memory leak when checking for environment variables.
  3889. +
    2011-09-05 6.7.2-2 Cristy <quetzlzacatenango@image...>
    +
  3890. New version 6.7.2-2.
  3891. +
    2011-09-03 6.7.2-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  3892. Recognize the sRGB ICC profile and write the PNG sRGB profile instead of a full iCCP chunk.
  3893. +
    2011-08-31 6.7.2-2 Cristy <quetzlzacatenango@image...>
    +
  3894. Write grayscale MIFF as a single gray pixel component, not RGB (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=19403).
  3895. +
  3896. Bail gracefully for corrupt JPEG images.
  3897. +
  3898. Bail gracefully for negative montage geometries (references https://bugzilla.redhat.com/show_bug.cgi?id=735599).
  3899. +
  3900. Account for DCm bits allocated 16 and significant bits 12 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19420).
  3901. +
  3902. Fix bug when appending JPEG image profiles (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19429).
  3903. +
    2011-08-29 6.7.2-1 Cristy <quetzlzacatenango@image...>
    +
  3904. New version 6.7.2-1.
  3905. +
    2011-08-29 6.7.2-1 Cristy <quetzlzacatenango@image...>
    +
  3906. The AllChannels defined changed to 0x7ffffff to avoid integer overflow.
  3907. +
    2011-08-26 6.7.2-0 Cristy <quetzlzacatenango@image...>
    +
  3908. HDR format 32-bit_rle_xyze implies the XYZ colorspace.
  3909. +
    2011-08-22 6.7.1-10 Cristy <quetzlzacatenango@image...>
    +
  3910. Revert FormatImageAttributeList(), FormatImagePropertyList() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19339).
  3911. +
    2011-08-21 6.7.1-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  3912. Revised configure.ac (and configure) to look for -lpng15, -lpng14, -lpng12, and -lpng in that order instead of just -lpng. This should help find a consistent library and headers when users upgrade their libpng delegate from one version to another, incompatible version.
  3913. +
    2011-08-20 6.7.1-9 Cristy <quetzlzacatenango@image...>
    +
  3914. New version 6.7.1-9.
  3915. +
    2011-08-20 6.7.1-9 Cristy <quetzlzacatenango@image...>
    +
  3916. Fix memory leak in text annotation (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=19331).
  3917. +
    2011-08-18 6.7.1-9 Glenn Randers-Pehrson <glennrp@image...>
    +
  3918. The "-strip" option was excluding the PNG tRNS chunk (see 6.6.6-7, below); revised the -strip option so it behaves as if "-define PNG:include-chunk=none,trns,gama" had appeared on the commandline.
  3919. +
  3920. When writing a PNG8 and more than one transparent color is present, merge them into the image->background_color (Reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=19329), finishing the implementation started in version 6.6.8-7.
  3921. +
    2011-08-18 6.7.1-8 Cristy <quetzlzacatenango@image...>
    +
  3922. New version 6.7.1-8.
  3923. +
    2011-08-18 6.7.1-8 Cristy <quetzlzacatenango@image...>
    +
  3924. Caption now wraps properly for Chinese text (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19249).
  3925. +
    2011-08-18 6.7.1-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  3926. The PNG encoder would sometimes fail to respect the -define PNG:color-type option when the incoming image was PseudoClass (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=19262).
  3927. +
    2011-08-15 6.7.1-7 Cristy <quetzlzacatenango@image...>
    +
  3928. New version 6.7.1-7.
  3929. +
    2011-08-15 6.7.1-7 Cristy <quetzlzacatenango@image...>
    +
  3930. Properly handled continued JPEG embedded profiles.
  3931. +
    2011-08-12 6.7.1-6 Cristy <quetzlzacatenango@image...>
    +
  3932. Yet another attempt to read Japanese filenames under Windows.
  3933. +
    2011-08-10 6.7.1-5 Cristy <quetzlzacatenango@image...>
    +
  3934. New version 6.7.1-5.
  3935. +
    2011-08-10 6.7.1-5 Cristy <quetzlzacatenango@image...>
    +
  3936. Revert -colorspace sRGB option patch (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19256).
  3937. +
  3938. Revert -type PaletteMatte option patch (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19263
  3939. +
    2011-08-09 6.7.1-4 Cristy <quetzlzacatenango@image...>
    +
  3940. New version 6.7.1-4.
  3941. +
    2011-08-09 6.7.1-4 Cristy <quetzlzacatenango@image...>
    +
  3942. Revert MultiByteToWideChar() for Windows patch.
  3943. +
    2011-08-05 6.7.1-3 Cristy <quetzlzacatenango@image...>
    +
  3944. New version 6.7.1-3.
  3945. +
    2011-08-05 6.7.1-3 Cristy <quetzlzacatenango@image...>
    +
  3946. Use MultiByteToWideChar() for Windows filenames (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=19242).
  3947. +
    2011-08-03 6.7.1-2 Cristy <quetzlzacatenango@image...>
    +
  3948. New version 6.7.1-2.
  3949. +
    2011-08-02 6.7.1-2 Cristy <quetzlzacatenango@image...>
    +
  3950. Windows does not support acosh(), asinh(), or atanh().
  3951. +
  3952. Accept filenames with time stamps and a sub-image specification (e.g. test-18:37.jpg[0]).
  3953. +
    2011-08-01 6.7.1-1 Cristy <quetzlzacatenango@image...>
    +
  3954. New version 6.7.1-1.
  3955. +
    2011-08-01 6.7.1-1 Cristy <quetzlzacatenango@image...>
    +
  3956. Support MSL 'set gravity' element.
  3957. +
  3958. Don't report HSB colors as RGB colornames (e.g. hsb(0%,0%,100%)).
  3959. +
  3960. Support -fx acosh(), asinh(), and atanh().
  3961. +
    2011-07-21 6.7.1-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3962. Removed a case that prevented rotations of rectangle kernels.
  3963. +
    2011-07-01 6.7.1-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  3964. Use zlib default compression strategy instead of Z_RLE and Z_FIXED strategies when linking with zlib versions (prior to 1.2.0 and 1.2.2.2, respectively) that don't support them.
  3965. +
  3966. Exit test loop sooner in coders/png.c when a non-gray pixel is found.
  3967. +
    2011-06-30 6.7.0-10 Cristy <quetzlzacatenango@image...>
    +
  3968. New version 6.7.0-10.
  3969. +
    2011-06-30 6.7.0-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  3970. Added "-define PNG:compression-level|strategy|filter=value" options to the PNG encoder. If these options are used, they take precedence over the -quality option (reference https://imagemagick.org/discourse-server//viewtopic.html?&f=1&p=73548).
  3971. +
    2011-06-29 6.7.0-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  3972. Handle "-quality 97" properly in the png encoder, i.e., use intrapixel filtering when writing a MNG file and no filtering when writing a PNG file.
  3973. +
  3974. Added support for Z_RLE strategy in the png compressor, using -quality 98 or 99.
  3975. +
    2011-06-28 6.7.0-10 Cristy <quetzlzacatenango@image...>
    +
  3976. Properly allocate points when render text with large font size (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18997).
  3977. +
    2011-06-25 6.7.0-9 Cristy <quetzlzacatenango@image...>
    +
  3978. New version 6.7.0-9.
  3979. +
    2011-06-18 6.7.0-9 Cristy <quetzlzacatenango@image...>
    +
  3980. Defend against corrupt PSD resource blocks.
  3981. +
    2011-06-15 6.7.0-8 Cristy <quetzlzacatenango@image...>
    +
  3982. New version 6.7.0-8.
  3983. +
    2011-06-14 6.7.0-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  3984. Added Initial implementation of Cylinder to/from Plane 3D Distorts Includes derivative (scaled lookup), and anti-aliased horizon (validity) Currently can NOT handle extractions from full 360 cylinder panoramas.
  3985. +
    2011-06-13 6.7.0-7 Cristy <quetzlzacatenango@image...>
    +
  3986. New version 6.7.0-7.
  3987. +
    2011-06-09 6.7.0-7 Cristy <quetzlzacatenango@image...>
    +
  3988. Fixed "conversion from unsigned __int64 to double not implemented" so IM can compile under VisualStudio 6.
  3989. +
    2011-06-08 6.7.0-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  3990. The PNG encoder would sometimes make black pixels transparent when some other gray level was supposed to be the transparent color (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18900). This occurred only with 1, 2, 4-bit grayscale images with Q16 or Q32 builds.
  3991. +
    2011-06-08 6.7.0-6 Cristy <quetzlzacatenango@image...>
    +
  3992. New version 6.7.0-6.
  3993. +
    2011-06-08 6.7.0-6 Cristy <quetzlzacatenango@image...>
    +
  3994. Fix transient error for composite 'Over' operator.
  3995. +
    2011-06-07 6.7.0-5 Cristy <quetzlzacatenango@image...>
    +
  3996. New version 6.7.0-5.
  3997. +
    2011-06-07 6.7.0-5 Cristy <quetzlzacatenango@image...>
    +
  3998. Fix one-off bug in option parser (reference http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=609177).
  3999. +
  4000. Transient bug with composite 'Over' in magick/composite-private.h.
  4001. +
    2011-06-06 6.7.0-4 Cristy <quetzlzacatenango@image...>
    +
  4002. New version 6.7.0-4.
  4003. +
    2011-06-03 6.7.0-4 Cristy <quetzlzacatenango@image...>
    +
  4004. Support -direction right-to-left for the label: and caption: coders.
  4005. +
  4006. Blue / green reversed for JPEG-compressed TIFF images.
  4007. +
    2011-06-03 6.7.0-3 Cristy <quetzlzacatenango@image...>
    +
  4008. New version 6.7.0-3.
  4009. +
    2011-06-02 6.7.0-2 Cristy <quetzlzacatenango@image...>
    +
  4010. Use memmove() instead of memcpy() in StripString().
  4011. +
    2011-05-27 6.7.0-2 Cristy <quetzlzacatenango@image...>
    +
  4012. New version 6.7.0-2.
  4013. +
    2011-05-26 6.7.0-2 Cristy <quetzlzacatenango@image...>
    +
  4014. ImageMagick now compiles on Hurd (reference http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=628020).
  4015. +
  4016. Use vfprintf rather than fprintf in FormatLocaleFileList().
  4017. +
    2011-05-26 6.7.0-1 Cristy <quetzlzacatenango@image...>
    +
  4018. New version 6.7.0-1.
  4019. +
    2011-05-25 6.7.0-1 Cristy <quetzlzacatenango@image...>
    +
  4020. Not all Linux'es define locale_t (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18819).
  4021. +
    2011-05-22 6.7.0-0 Cristy <quetzlzacatenango@image...>
    +
  4022. New version 6.7.0-0.
  4023. +
    2011-05-21 6.7.0-0 Cristy <quetzlzacatenango@image...>
    +
  4024. Avoid fault on corrupt JPEG images.
  4025. +
  4026. Avoid fault on certain DJVU images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18807).
  4027. +
  4028. Fix -fx to interpret scientific notation properly.
  4029. +
    2011-05-20 6.6.9-10 Cristy <quetzlzacatenango@image...>
    +
  4030. New version 6.6.9-10.
  4031. +
    2011-05-20 6.6.9-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  4032. The PNG encoder now respects the -depth setting, including 1, 2, 4. Previously settings other than 8 and 16 were ignored (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18412).
  4033. +
    2011-05-16 6.6.9-10 Cristy <quetzlzacatenango@image...>
    +
  4034. Don't use comma as a separator for stroked text (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18742).
  4035. +
  4036. Use C locale when generating or interpreting SVG.
  4037. +
  4038. Fix "unterminated macro" for Q32 build of coders/png.c.
  4039. +
    2011-05-15 6.6.9-9 Cristy <quetzlzacatenango@image...>
    +
  4040. New version 6.6.9-9.
  4041. +
    2011-05-14 6.6.9-9 Cristy <quetzlzacatenango@image...>
    +
  4042. The -scale option now considers the alpha channel when scaling.
  4043. +
  4044. Fix transient bug for HSL to RGB and back.
  4045. +
    2011-05-12 6.6.9-9 Glenn Randers-Pehrson <glennrp@image...>
    +
  4046. Fixed PNG8 reduction to work with an image that reduces to 256 colors plus transparency, by merging the two darkest red colors.
  4047. +
    2011-05-04 6.6.9-8 Cristy <quetzlzacatenango@image...>
    +
  4048. New version 6.6.9-8.
  4049. +
    2011-05-02 6.6.9-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  4050. Fixed some cut-and-paste errors in new png.c code that caused PNG8 reductions to fail.
  4051. +
    2011-05-02 6.6.9-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4052. Add various Option Flags, and fix option skip counts for plus forms of simple operators where plus form is the same as minus form. For example the incorrect counts produces a weird error, and possible future segmentation fault in a command like convert rose: +border show:
  4053. +
    2011-04-30 6.6.9-7 Cristy <quetzlzacatenango@image...>
    +
  4054. New version 6.6.9-7.
  4055. +
    2011-04-30 6.6.9-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4056. Fix FX default for interpolation to Bilinear.
  4057. +
    2011-04-27 6.6.9-7 Cristy <quetzlzacatenango@image...>
    +
  4058. Fix pixel interpolation for -draw 'image Over' (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18612).
  4059. +
    2011-04-26 6.6.9-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  4060. Write the proper bKGD chunk value in grayscale PNG images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18624).
  4061. +
    2011-04-25 6.6.9-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4062. Added Inverse method for Sparse Color Interpolation
  4063. +
    2011-04-24 6.6.9-6 Cristy <quetzlzacatenango@image...>
    +
  4064. New version 6.6.9-6.
  4065. +
    2011-04-21 6.6.9-6 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4066. Make filter:blur define a multiplicative adjustment of filter settings rather than a complete override of those settings.
  4067. +
  4068. Add Flags to CommandOptions parse table, removing the need for ImageListOptions parsing table. This is the start of development to produce a "convert" replacement that can read options from both command line and from files or pipelines, in "Do it Immediately" handling.
  4069. +
  4070. Crop Bug Fix. Prevent infinite loop with "+repage -crop 0x40"
  4071. +
    2011-04-18 6.6.9-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  4072. Added "date" to the things that can appear on the -define PNG:exclude-chunk list. This excludes the IM-generated Date:modify and Date:create properties from PNG output text chunks without excluding the rest of the text chunks.
  4073. +
  4074. Added "-define PNG:preserve-colormap" option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18564).
  4075. +
  4076. Simplified LosslessReduceDepthOK() function in coders/png.c
  4077. +
    2011-04-18 6.6.9-6 Cristy <quetzlzacatenango@image...>
    +
  4078. Add support for writing RGB FITS images as separate planes.
  4079. +
    2011-04-16 6.6.9-6 Cristy <quetzlzacatenango@image...>
    +
  4080. Support the HDR 32-bit_rle_xyze format.
  4081. +
  4082. Fixed infinite loop for TARGA images with a V2 develop area.
  4083. +
  4084. Add signal handler for SIGBUS.
  4085. +
    2011-04-15 6.6.9-5 Cristy <quetzlzacatenango@image...>
    +
  4086. New version 6.6.9-5.
  4087. +
    2011-04-15 6.6.9-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  4088. Added "#define PNG_PTR_NORETURN" because this macro does not work on all platforms with libpng15, with failure to load png_longjmp() (ref https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18518).
  4089. +
    2011-04-14 6.6.9-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4090. Layers Composition Bug Fix, animations attributes of first image not transferred in a single destination, multi-source image composition.
  4091. +
    2011-04-09 6.6.9-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4092. Add a special 'Voronoi' Morphology Distance method that will fill in holes using the nearest non-transparent edge pixel. It is experimental, and hidden from normal morphology usage, as it may be interfaced with a future hole-filling color 'Diffusion' method.
  4093. +
    2011-04-08 6.6.9-5 Cristy <quetzlzacatenango@image...>
    +
  4094. MIFF keywords sometimes includes spaces.
  4095. +
    2011-04-07 6.6.9-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4096. Major BUG FIX - wrong sign breaks most morphology methods in IM v6.6.9-4
  4097. +
  4098. Fixed -region handling of transparency. Original images without transparency will use 'Over' while images with transparency will preserve transparency using 'Copy'. Before this only 'Over' was used due to the testing of the wrong image.
  4099. +
  4100. Added Compose methods DarkenIntensity and LightenIntensity
  4101. +
    2011-04-06 6.6.9-4 Cristy <quetzlzacatenango@image...>
    +
  4102. New version 6.6.9-4.
  4103. +
    2011-04-03 6.6.9-4 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4104. Add Octagon shape and Octagonal distance kernels for Morphology
  4105. +
  4106. Fix minor Morphology kernel compose bug (cleanup after Src/Dst swap)
  4107. +
  4108. Fix segmentation fault after error in a morphology 'named' kernel
  4109. +
  4110. Added a range of kernels used for specialised thinning purposes as defined in a research paper by Dan S. Bloomberg.
  4111. +
  4112. Added Dan Bloomberg best thinning skeleton, "Skeleton:3"
  4113. +
  4114. Removed origin pixel from many Hit-and-Miss kernels allowing kernels to not only be used for thinning, but also thickening.
  4115. +
  4116. Renamed "ThinDiagonals" kernel to just "Diagonals"
  4117. +
  4118. Distance uses a fast two pass algorithm, and no longer needs 'iteration'
  4119. +
    2011-04-02 6.6.9-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  4120. Make the PNG encoder use depth==8 when incoming image->depth < 8 (the encoder later reduces the depth if it can), to avoid writing an incorrect image.
  4121. +
  4122. Remove any bogus colormap received by the PNG encoder with an image that is not PseudoClass (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18475).
  4123. +
    2011-04-02 6.6.9-3 Cristy <quetzlzacatenango@image...>
    +
  4124. Added -statistic Gradient
  4125. +
    2011-04-01 6.6.9-3 Cristy <quetzlzacatenango@image...>
    +
  4126. New version 6.6.9-3.
  4127. +
    2011-04-01 6.6.9-3 Cristy <quetzlzacatenango@image...>
    +
  4128. Set the caption height correctly for missing row geometry (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18447).
  4129. +
    2011-03-31 6.6.9-2 Cristy <quetzlzacatenango@image...>
    +
  4130. New version 6.6.9-2.
  4131. +
    2011-03-30 6.6.9-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  4132. Revised the png decoder to store the PNG IHDR and other known PNG chunk data as properties, for later retrieval and reporting by "identify", so users can easily and reliably discover the color-type, bit-depth, etc that were in the input PNG datastream.
  4133. +
  4134. The PNG decoder sometimes set images with more than 256 different gray-alpha pixels to storage_class=PseudoClass with an incorrect colormap.
  4135. +
    2011-03-30 6.6.9-2 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4136. Add a "Resize" distortion method (distort equivalent of -resize).
  4137. +
  4138. Special CLI handling so -distort Resize takes a "geometry" argument.
  4139. +
    2011-03-29 6.6.9-2 Cristy <quetzlzacatenango@image...>
    +
  4140. Expand PCL compressed pixel buffer to prevent delta compressed overrun.
  4141. +
    2011-03-29 6.6.9-1 Cristy <quetzlzacatenango@image...>
    +
  4142. New version 6.6.9-1.
  4143. +
    2011-03-29 6.6.9-1 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4144. Fix AdaptiveResizeImage() to use 'Mesh' Interpolation, and fix its coordinate handling, as originally defined.
  4145. +
    2011-03-29 6.6.9-1 Cristy <quetzlzacatenango@image...>
    +
  4146. Support -statistic standard-deviation option.
  4147. +
  4148. Patch for coders/dcm.c so it compiled with HDRI enabled.
  4149. +
    2011-03-28 6.6.9-0 Cristy <quetzlzacatenango@image...>
    +
  4150. New version 6.6.9-0.
  4151. +
    2011-03-28 6.6.9-0 Cristy <quetzlzacatenango@image...>
    +
  4152. Optimize bilinear interpolation.
  4153. +
  4154. Remove version from etc folder and instead use /etc/ImageMagick.
  4155. +
    2011-03-28 6.6.9-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4156. Separated complex cropping function from TransformImage() as a new function CropImageToTiles(). This new function returns either the new cropped image, or a list of tiles, according to geometry, without replacing the source image. The Source image may be part of a larger list of images, without the function 'losing' the other images of the list.
  4157. +
    2011-03-27 6.6.8-10 Cristy <quetzlzacatenango@image...>
    +
  4158. New version 6.6.8-10.
  4159. +
    2011-03-27 6.6.8-10 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4160. Modified image handling in MogrifyImages() and MogrifyImage() which improves overall handling, and allows correct %p, %n and the %[fx:..] 't' and 'n' escape usage to work correctly.
  4161. +
  4162. Added -duplicate as a multi-image sequence operator
  4163. +
    2011-03-26 6.6.8-9 Cristy <quetzlzacatenango@image...>
    +
  4164. New version 6.6.8-9.
  4165. +
    2011-03-25 6.6.8-9 Cristy <quetzlzacatenango@image...>
    +
  4166. Add InterpolateMagickPixelPacket() method.
  4167. +
  4168. Add support for the %[opaque] property.
  4169. +
    2011-03-25 6.6.8-8 Cristy <quetzlzacatenango@image...>
    +
  4170. New version 6.6.8-8.
  4171. +
    2011-03-25 6.6.8-8 Cristy <quetzlzacatenango@image...>
    +
  4172. Fix memory access bug in CloneString() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=18382).
  4173. +
  4174. Avoid infinite loop when no space is available in MagickFormatCaption().
  4175. +
    2011-03-25 6.6.8-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4176. Removed the fix for %p and %n escapes, as it was not working right
  4177. +
    2011-03-24 6.6.8-7 Cristy <quetzlzacatenango@image...>
    +
  4178. New version 6.6.8-7.
  4179. +
    2011-03-24 6.6.8-7 Cristy <quetzlzacatenango@image...>
    +
  4180. Add support for 16-bit DCM short ints (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18371).
  4181. +
    2011-03-23 6.6.8-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4182. Another fix for -sparse-color and unused color channels
  4183. +
  4184. Finalize the -duplicate option created by Cristy
  4185. +
  4186. Fix of segmentation fault for second image in %[fx:..] during info: (Bug in AcquireFxInfo(), as given start image is not first image)
  4187. +
    2011-03-21 6.6.8-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  4188. Revised the PNG8 encoder to use 50% threshold instead of 0% when reducing transparency to binary. Collapse all resulting fully transparent colors into one (the background color), to reduce the compressed filesize.
  4189. +
  4190. First try the 4-4-4-1 and 3-3-3-1 palettes instead of 3-3-2-1, to preserve colors (especially gray) better, when reducing to PNG8.
  4191. +
  4192. Force the PNG encoder to return image->matte==MagickTrue when the format is RGBA or GA or if the tRNS chunk is present, even when the image is fully opaque (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18349).
  4193. +
    2011-03-21 6.6.8-6 Cristy <quetzlzacatenango@image...>
    +
  4194. New version 6.6.8-6.
  4195. +
    2011-03-21 6.6.8-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  4196. Re-enabled reduction of grayscale images (color-type 0) to 2 or 4 bits when appropriate (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18098).
  4197. +
  4198. The "-define PNG:color-type=4" option did not always force the PNG encoder to write an all-opaque alpha channel (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18349).
  4199. +
    2011-03-14 6.6.8-6 Cristy <quetzlzacatenango@image...>
    +
  4200. Fixed memory leak for PDF and Bitmap PSD RLE support (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18317).
  4201. +
  4202. Support the -statistic option: replace each pixel with corresponding statistic from the neighborhood.
  4203. +
  4204. Add support for -duplicate option.
  4205. +
  4206. Move configuration files from /usr/share and /usr/lib to /etc and /var.
  4207. +
  4208. Do not cache the results of fx: otherwise -format '%[fx:rand()] %[fx:rand()]' returns the same random numbers.
  4209. +
    2011-03-18 6.6.8-6 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4210. Replaced Minus and Divide Composition methods with Dst and Src equivalents. Now users can decide how these non-commutative mathematical operators are applied to the images being composited.
  4211. +
  4212. Fix the percent escape values for %p, %n and %[fx:t], %[fx:n] to respectively mean the current images index and the total number of images within the current image sequence.
  4213. +
    2011-03-17 6.6.8-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4214. Backed out the patch for Variable Blur Composition that was added 2011-02-13 v6.6.7-7, until I can re-think the problem. The existing fix was failing to do circular blurs correctly.
  4215. +
    2011-03-14 6.6.8-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  4216. Fixed a rounding/truncation error while writing the pHYs chunk in the png encoder.
  4217. +
  4218. Don't write text-encoded profile when "-define PNG:exclude-chunk=text,ztxt" is present (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17086 and https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18225).
  4219. +
    2011-03-14 6.6.8-5 Cristy <quetzlzacatenango@image...>
    +
  4220. Add support for the WebP image format.
  4221. +
    2011-03-14 6.6.8-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4222. Ensured that -sparse-color preserves unused channels when channel limited. Before this unused channels would be reset to black.
  4223. +
    2011-03-11 6.6.8-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  4224. Don't try to store a bKGD chunk in a PNG8 when there are already 256 colors in the palette and the background colors is not in that palette (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18199);
  4225. +
  4226. The "-define PNG:exclude-chunk=bKGD" option was also excluding the text chunks. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18253).
  4227. +
    2011-03-10 6.6.8-4 Cristy <quetzlzacatenango@image...>
    +
  4228. Fx is a mathematical function. Do not treat transparency as black.
  4229. +
  4230. No image scene suffix for filenames that include a single bracket (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18267).
  4231. +
    2011-03-10 6.6.8-3 Cristy <quetzlzacatenango@image...>
    +
  4232. New version 6.6.8-3.
  4233. +
    2011-03-10 6.6.8-3 Cristy <quetzlzacatenango@image...>
    +
  4234. Boost causes an ambiguity with ssize_t when building PythonMagick. Add patch from Arfrever@gento... to fix the build exception.
  4235. +
    2011-03-09 6.6.8-2 Cristy <quetzlzacatenango@image...>
    +
  4236. Support the Radiance HDR image format.
  4237. +
  4238. Update the offset in the black channel when sharpening to avoid incorrect results.
  4239. +
  4240. Do not use GenericReadMethod for TIFF images with 64-bits per sample.
  4241. +
    2011-03-06 6.6.8-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  4242. Throw error message when the requested color-type or bit-depth cannot be written by the PNG encoder (error was being thrown into the wrong image structure). (Reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18162).
  4243. +
  4244. Don't write a PNG text chunk with "density" keyword that overrides the PNG pHYs chunk, if the pHYs chunk was not excluded (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18253).
  4245. +
  4246. Ignore any PNG text chunk with a "density" keyword found by the PNG decoder, if the PNG datastream also contains a pHYs chunk.
  4247. +
    2011-03-06 6.6.8-1 Cristy <quetzlzacatenango@image...>
    +
  4248. New version 6.6.8-1.
  4249. +
    2011-03-05 6.6.8-1 Cristy <quetzlzacatenango@image...>
    +
  4250. Support PSD files with one layer and one composite layer.
  4251. +
  4252. We must cast a Quantum type when bit shifting and HDRI is enabled.
  4253. +
    2011-03-05 6.6.8-0 Cristy <quetzlzacatenango@image...>
    +
  4254. New version 6.6.8-0.
  4255. +
    2011-02-27 6.6.8-0 Cristy <quetzlzacatenango@image...>
    +
  4256. Add support for the -mode option.
  4257. +
    2011-02-27 6.6.8-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  4258. Fix scaling of new color-reduction method in the PNG encoder (16-bit images were scaled down to 0 or 1, or nearly black).
  4259. +
  4260. Delay opening the PNG output blob until the PNG encoder is ready to write the IHDR chunk, to avoid writing zero-length PNG files when errors are found while building the palette. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18162).
  4261. +
    2011-02-25 6.6.7-10 Cristy <quetzlzacatenango@image...>
    +
  4262. New version 6.6.7-10.
  4263. +
    2011-02-23 6.6.7-10 Cristy <quetzlzacatenango@image...>
    +
  4264. Avoid seg fault in AppendImages() when one image is in the RGB colorspace but the other is in the CMYK colorspace.
  4265. +
  4266. Get rid of 'respect_parenthesis defined but not used' warnings (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=18173).
  4267. +
    2011-02-22 6.6.7-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  4268. Write sub-8-bit grayscale PNG images as palette-indexed PNG images. This usually makes smaller files anyhow.
  4269. +
  4270. Eliminated a number of redundant tests for gray images in the PNG encoder.
  4271. +
  4272. Removed now-unused IsMonochromeImage() function from coders/png.c
  4273. +
  4274. Scan the colormap instead of all of the pixels, when possible, to determine whether the image received by the PNG encoder is grayscale or black-and-white.
  4275. +
  4276. Avoid reading from the colormap in coders/png.c when it is NULL (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18162).
  4277. +
  4278. Add a check whether the PNG "cheap transparency" criteria are met. That is, there is a single transparent color, no semitransparent colors, and no opaque color that has the same RGB components as the transparent color. If those aren't met, a color that is transparent in one pixel and opaque in another would always be rendered as transparent, so we must write a PNG colortype that has an alpha channel (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18167).
  4279. +
    2011-02-22 6.6.7-9 Cristy <quetzlzacatenango@image...>
    +
  4280. New version 6.6.7-9.
  4281. +
    2011-02-22 6.6.7-9 Glenn Randers-Pehrson <glennrp@image...>
    +
  4282. Disabled reduction of grayscale images (color-type 0) to less than 8 bits when writing because this sometimes produced incorrect output (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18098).
  4283. +
    2011-02-21 6.6.7-9 Cristy <quetzlzacatenango@image...>
    +
  4284. Check image has properties before accessing the splay tree (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18136).
  4285. +
    2011-02-15 6.6.7-8 Cristy <quetzlzacatenango@image...>
    +
  4286. New version 6.6.7-8.
  4287. +
    2011-02-14 6.6.7-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  4288. The PNG encoder should ignore bogus q->opacity values when image->matte is MagickFalse (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18067).
  4289. +
    2011-02-14 6.6.7-8 Cristy <quetzlzacatenango@image...>
    +
  4290. Use implicit image format when explicit format is bogus (e.g. 02.13.11-18:43:58.png now writes as PNG).
  4291. +
  4292. Fix problem with 4GB file seeks on a 32-bit OS.
  4293. +
    2011-02-13 6.6.7-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4294. Fixed Variable blur to handle small (< 1.0 sigma) blurs generated by the blur map being used, rather than just 'cutoff' suddenly.
  4295. +
    2011-02-08 6.6.7-7 Cristy <quetzlzacatenango@image...>
    +
  4296. Support 16-bit per pixel YUV image files.
  4297. +
  4298. Fix off-by-one error in PosterizeImage().
  4299. +
  4300. Posterize now distributes color uniformly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17623).
  4301. +
  4302. Add -smush option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=17953).
  4303. +
  4304. Repair memory leak in the display program.
  4305. +
    2011-02-07 6.6.7-6 Cristy <quetzlzacatenango@image...>
    +
  4306. Fix bug in carg() define when HAVE_COMPLEX is not defined (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=18030).
  4307. +
    2011-02-06 6.6.7-6 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4308. Default sigma for Gauusian resize filter is now 1/2 for both orthogonal resize and cylindrical EWA distortions.
  4309. +
    2011-02-02 6.6.7-5 Cristy <quetzlzacatenango@image...>
    +
  4310. Check if the font is null in RenderFreetype() to prevent fault (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17890).
  4311. +
  4312. Eliminate fault when reading WMF image files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=17971).
  4313. +
  4314. Support multi-page transparent Postscript and PDF image files.
  4315. +
  4316. The compare fuzz metric now returns the same correct value for 'xc:white xc:blue -alpha off' and 'xc:white xc:blue -alpha on'.
  4317. +
    2011-01-29 6.6.7-4 Paul Heckbert <ph@cs.cm...>
    +
  4318. Move coders/tiff.c conditional compile to define TIFF exception / semaphore / key when TIFF delegate is disabled.
  4319. +
    2011-01-29 6.6.7-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  4320. Renamed variables, macros, and functions defined/declared in coders/png.c that were in the libpng namespace (beginning with "png_" or "PNG_").
  4321. +
    2011-01-25 6.6.7-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  4322. Removed a call to GetNumberColors() from the PNG encoder that was only there for debugging purposes and was consuming a huge amount of CPU time. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=17799).
  4323. +
  4324. Sometimes black was still written as transparent, when the PNG encoder received an image with image->matte==true but no transparent pixels were present. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17913);
  4325. +
    2011-01-24 6.6.7-3 Cristy <quetzlzacatenango@image...>
    +
  4326. Remove memory leak from ThrowFileException() macro (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17908).
  4327. +
  4328. Multiple blue error count by 'count' in ClassifyImageColors()
  4329. +
  4330. Add support for the AAI image format.
  4331. +
    2011-01-22 6.6.7-2 Cristy <quetzlzacatenango@image...>
    +
  4332. Accept quoted file paths in indirect file references (e.g. @myFiles.txt).
  4333. +
    2011-01-19 6.6.7-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  4334. Changed the PNG encoder's "transparent_color" from a UShortPixelPacket to LongPixelPacket and made the default (65537,65537,65537), which can never occur in the PNG image data. Previously the default was (0,0,0) and black pixels would be rendered as as transparent when no tRNS chunk was present in the input, which has caused problems with some test cases since version 6.6.6-10.
  4335. +
  4336. Improved the PNG_BUILD_PALETTE section to count opaque, transparent, and semitransparent pixels separately. Previously it wasn't always possible to determine if there was a single fully-transparent color, to decide whether to write an RGBA or Gray-Alpha image or an RGB or Gray image with a tRNS chunk.
  4337. +
    2011-01-15 6.6.7-1 Cristy <quetzlzacatenango@image...>
    +
  4338. Do not reset image next / previous when detach argument is false for CloneImage().
  4339. +
  4340. Inline cropping no longer fails for inline raw images (e.g. -size 640x480 -depth 8 'gray:logo[100x100+200+200]').
  4341. +
    2011-01-14 6.6.7-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  4342. Don't let the PNG encoder try to sort the colormap when there are more than 256 colors in the image. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17834).
  4343. +
    2011-01-10 6.6.7-1 Cristy <quetzlzacatenango@image...>
    +
  4344. Accept escaped % in output filename (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17810).
  4345. +
    2011-01-08 6.6.7-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  4346. Quieted some inconsequential warnings in the PNG codec due to a change in the type of the PNG iCCP profile from png_charp to png_bytep in libpng-1.5.0.
  4347. +
    2011-01-03 6.6.7-0 Cristy <quetzlzacatenango@image...>
    +
  4348. Handle negative heights for ICO images.
  4349. +
    2011-01-02 6.6.7-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  4350. Recent changes sometimes caused the PNG encoder to select colortype=2 (Truecolor) instead of 0 (Grayscale) for grayscale images. This made the filesize larger than necessary and caused some of the PerlMagick tests to fail.
  4351. +
    2011-01-01 6.6.6-10 Glenn Randers-Pehrson <glennrp@image...>
    +
  4352. The PNG decoder now checks whether the image actually has any transparency when the input file contains an alpha channel or a tRNS chunk. (Reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17748)
  4353. +
    2010-12-26 6.6.6-8 Cristy <quetzlzacatenango@image...>
    +
  4354. -posterize fails with more than 40 levels (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17741).
  4355. +
  4356. Add support for the MacPaint image format.
  4357. +
  4358. Eliminate spurious 'invalid colormap index' exception for 16-bit SGI images (bug report by steven.sittser@fligh...).
  4359. +
  4360. Fix user data length for the CIN image format.
  4361. +
    2010-12-21 6.6.6-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  4362. Use a clone instead of the main image in coders/png.c, so the image can still be used later on without being affected by changes made by the PNG encoder.
  4363. +
  4364. Added PNG:exclude-chunk and PNG:include-chunk defines.
  4365. +
  4366. Revised the -strip option so it behaves as though "-define PNG:include-chunk=none,gama" had appeared on the commandline.
  4367. +
  4368. Avoid writing PNG ancillary chunks in the PNG/MNG/JNG encoder while generating the alpha channel for a JNG image.
  4369. +
    2010-12-21 6.6.6-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4370. Removed the forced interpolation setting in AcquireResampleFilterThreadSet It prevented user defined interpolation settings for -clut, and possibly other usage.
  4371. +
    2010-12-17 6.6.6-6 Chris Madison <madisonblu@gmail...>
    +
  4372. Add LZMA compression support to ImageMagick.
  4373. +
  4374. Eliminate seg-fault in MvgPrintf().
  4375. +
    2010-12-17 6.6.6-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  4376. Eliminated a redundant quantization step in the PNG encoder.
  4377. +
  4378. Untangled a confusing but apparently harmless improper loop nesting in the PNG encoder.
  4379. +
  4380. Eliminated redundant "IsGray()" tests from the PNG encoder.
  4381. +
    2010-12-14 6.6.6-6 Cristy <quetzlzacatenango@image...>
    +
  4382. -format "%[fx:u.p{5,5}]" no longer reports parse exception (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17678).
  4383. +
    2010-12-10 6.6.6-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  4384. Make the PNG encoder always rebuild the palette, to avoid losing transparency when it is out of sync with the pixel data (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17655).
  4385. +
  4386. Eliminated CompressColormapTransFirst() since the palette is already compressed and sorted by opacity now when it's recreated.
  4387. +
    2010-12-10 6.6.6-5 Cristy <quetzlzacatenango@image...>
    +
  4388. Account for virtual canvas for the -flip / -flop options (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=17626).
  4389. +
  4390. Also for -transpose and transverse options
  4391. +
  4392. Support -metric fuzz option.
  4393. +
    2010-12-09 6.6.6-4 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4394. Replace IsMagickColorSimilar() which provides the Fuzz Factor threshold function. Note function does not calculate 'distance' in total but short-circuits when threshold is reached for faster processing.
  4395. +
  4396. Ordered Dithered handling of Alpha channel was incorrect - fixing Bug was introduced v6.6.5-6
  4397. +
    2010-12-03 6.6.6-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  4398. Fixed two more cases where the PNG encoder lost transparency (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17516).
  4399. +
    2010-12-01 6.6.6-2 Cristy <quetzlzacatenango@image...>
    +
  4400. Affine multiplication reversed when translating (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17570).
  4401. +
    2010-11-26 6.6.6-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  4402. Revised the "c7x7b" and "c7x7w" ordered-dither maps to be complementary to each other.
  4403. +
    2010-11-27 6.6.6-1 Cristy <quetzlzacatenango@image...>
    +
  4404. Add support for -evaluate-sequence median.
  4405. +
    2010-11-26 6.6.6-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  4406. Fixed two more cases where the PNG encoder lost transparency (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17516).
  4407. +
    2010-11-23 6.6.6-0 Cristy <quetzlzacatenango@image...>
    +
  4408. The policy.xml sets not-to-exceed resource values (e.g. policy memory limit 1GB, -limit 2GB exceeds policy maximum so memory limit is 1GB).
  4409. +
  4410. Support NCC (normalized cross correlation) compare metric.
  4411. +
    2010-11-21 6.6.5-10 Cristy <quetzlzacatenango@image...>
    +
  4412. Fix PNG coder compile error when HDRI is enabled.
  4413. +
    2010-11-17 6.6.5-9 Glenn Randers-Pehrson <glennrp@image...>
    +
  4414. Many of the problems with the PNG encoder have been fixed (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16490).
  4415. +
  4416. The "-type Optimize" option is now deprecated. If present, it is treated by the PNG encoder the same as if the type were undefined. Optimization is now always performed. No other formats used the "type Optimize" option.
  4417. +
  4418. Merged redundant code into LosslessReduceDepth() function in the PNG codec.
  4419. +
    2010-11-14 6.6.5-9 Cristy <quetzlzacatenango@image...>
    +
  4420. The splice option no longer throws spurious "pixels are not authentic" exceptions.
  4421. +
  4422. Thread the -adaptive-resize option.
  4423. +
  4424. Set XBM coder height to height not width.
  4425. +
    2010-11-14 6.6.5-9 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4426. Lanczos2Sharp blur tweaked. New blur = 0.9549963639785485.
  4427. +
    2010-11-13 6.6.5-9 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4428. LanczosSharp blur tweaked to minimize worst case deviation from "perfect preservation of images which only vary horizontally (or vertically)" under no-op. New blur = 0.9812505644269356.
  4429. +
    2010-11-08 6.6.5-8 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4430. Missing logical operator in tiff.c.
  4431. +
    2010-11-08 6.6.5-8 Cristy <quetzlzacatenango@image...>
    +
  4432. Only save TIFF image with 1-bit depth if there is no alpha channel.
  4433. +
  4434. Abandon PSD composite if layer is available.
  4435. +
  4436. %[fx:mean] is the mean of the default channels (all but opacity) (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=17432).
  4437. +
    2010-10-29 6.6.5-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  4438. Added 5x5, 6x6, and 7x7 ordered-dither level maps.
  4439. +
    2010-10-30 6.6.5-5 Cristy <quetzlzacatenango@image...>
    +
  4440. Do not read configure files in the current directory for the "installed" version of ImageMagick.
  4441. +
  4442. Allow numeric characters in the XPM basename (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17385).
  4443. +
    2010-10-29 6.6.5-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  4444. Revised PNG palette optimization
  4445. +
  4446. Added some debug logging in coders/png.c.
  4447. +
    2010-10-28 6.6.5-3 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4448. More precise blur values for Lanczos2Sharp and LanczosSharp.
  4449. +
  4450. Added location of first Mitchell crossing (=8/7) to the filters data structure.
  4451. +
    2010-10-28 6.6.5-2 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4452. Added Lanczos2D* filters now named Lanczos2*
  4453. +
  4454. Reorganization of AcquireFilter() to make it work better
  4455. +
    2010-10-25 6.6.5-1 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4456. Clearer EWA filters (LanczosSharp etc) comments.
  4457. +
    2010-10-25 6.6.5-1 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4458. Added LanczosSharp (3-lobe Lanczos with sharpening)
  4459. +
  4460. Filter sharpening factors are also always applied regardless of usage.
  4461. +
    2010-10-24 6.6.5-1 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4462. CubicBC filter formulas simplified by constant folding. In particular, P1 coefficient (always zero) removed from coeff.
  4463. +
    2010-10-22 6.6.5-1 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4464. Revert the Robidoux filter to a Keys cubic with C=(108 sqrt 2-29)/398 (as already specified in the documentation).
  4465. +
    2010-10-14 6.6.5-1 Cristy <quetzlzacatenango@image...>
    +
  4466. Ignore PS bounding box offsets if -page is set.
  4467. +
  4468. Use #pragma omp master for dumping single threaded debugging information (single caused a fault).
  4469. +
  4470. Add support for -evaluate exp.
  4471. +
    2010-10-12 6.6.5-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4472. Added "filter:sigma" expert setting defining the 'sigma' for the Gaussian filter only. This is similar in action to 'blur' but only for Gaussians, and does not modify the filters support, allowing you to set a very small sigma, without the function 'missing' all pixels. (This will allow future adjustment of Gaussians for variable blur mapping)
  4473. +
    2010-10-10 6.6.5-0 Cristy <quetzlzacatenango@image...>
    +
  4474. Patch for DrawableRotation() and DrawableTranslation() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17246).
  4475. +
  4476. The webp format requires the webpconv delegate program (experimental).
  4477. +
    2010-10-05 6.6.5-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4478. Replaced "Robidoux" with Cubic 'Keys' filter that is near equivalent to the previous sharped "Lanczos2D" filter. (C=0.31089212245300069) This also is very similar to a Mitchell filter but specifically designed for EWA use and is the new default filter for Distorting Images.
  4479. +
  4480. Original sharpened Lanczos2D filter now called "Lanczos2Dsharp"
  4481. +
    2010-10-08 6.6.4-10 Jerry Gay <jerry.gay@gmail..>
    +
  4482. Autodetect file type support in Makefile.PL to prevent test failures
  4483. +
    2010-10-05 6.6.4-10 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4484. Added new filter 'Lanczos2D' a 2-lobe Lanczos as defined by Andreas Gustafsson in his thesis "Interactive Image Warping" (page 24) http://www.gson.org/thesis/warping-thesis.pdf
  4485. +
  4486. Added filter "Robidoux" which is a slightly sharpened version of the "Lanczos2D" filter (blur=0.958033808) specifically designed to be less 'blurry' for horizontal and vertical lines in no-op distortions.
  4487. +
    2010-10-05 6.6.4-10 Cristy <quetzlzacatenango@image...>
    +
  4488. Add support for "pattern:vertical2" and "pattern:horizontal2".
  4489. +
  4490. Add support for "pattern:vertical3" and "pattern:horizontal3".
  4491. +
  4492. Properly handle PSD layers with negative offsets.
  4493. +
    2010-10-03 6.6.4-9 Cristy <quetzlzacatenango@image...>
    +
  4494. Fix memory assertion with --enable-embeddable (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17201).
  4495. +
  4496. Don't permit access to pixels when pinging an image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17194).
  4497. +
    2010-10-02 6.6.4-9 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4498. Added sqrt(2) blurring default for Gaussian Filter if used as a Cylindrical EWA filter. This resulted removing the last aliasing issue that was present in tests for Gaussian EWA resampling. Of course it is still a very blurry filter for default use in EWA.
  4499. +
  4500. Adjusted Variable Mapping Blur Composition so user arguments actual relate properly to the sigma of the blur for a maximum mapping value.
  4501. +
  4502. Fix horizon anti-aliasing for output-scaled perspective distortions.
  4503. +
  4504. 'Bessel' filter is now officially and more accurately named 'Jinc' however 'Bessel' while not visible as a filter option can still be used as an internal alias for 'Jinc'.
  4505. +
    2010-09-28 6.6.4-8 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4506. Chantal Racette double checked the bounding parallelogram computation in resample.c (and I tightened the comments).
  4507. +
    2010-09-28 6.6.4-8 Cristy <quetzlzacatenango@image...>
    +
  4508. Temporary files not always deleted (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=15960).
  4509. +
    2010-09-28 6.6.4-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4510. Bug fix for -filter point distorts (occasional generating black pixels)
  4511. +
    2010-09-27 6.6.4-8 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4512. Simplified the ClampUpAxes code, the use of its outputs, its comments, and credited Craig DeForest for the "clamp singular values" idea.
  4513. +
  4514. No reason to have "insane" precision Sinc in resize.c: Use the 1.2e-12 max. abs. relative error version for Q64 as well as Q32.
  4515. +
    2010-09-27 6.6.4-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4516. Replace the blurry "High Quality EWA" technique with a 'Clamped EWA' for Distort Resampling. This makes -distort a whole lot nicer and allows for the use of better cylindrical filters.
  4517. +
    2010-09-26 6.6.4-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4518. Fix Point filter for ResizeImage() caused by support limiting the Box weighting function.
  4519. +
    2010-09-26 6.6.4-6 Cristy <quetzlzacatenango@image...>
    +
  4520. Don't allow resize filter weights to go to zero (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=17132).
  4521. +
    2010-09-24 6.6.4-6 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4522. Now that MagickPIL is a MagickRealType, some casts are unneeded.
  4523. +
    2010-09-21 6.6.4-6 Cristy <quetzlzacatenango@image...>
    +
  4524. Do not break words if caption size is absolute (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=17123).
  4525. +
  4526. Don't define HAVE_THREADS for --without-threads configure script option.
  4527. +
    2010-09-20 6.6.4-5 Nicolas Robidoux <nicolas.robidoux@gmai...>
    +
  4528. Modified "magick/resize.c" so that MagickPIL is a MagickRealType number. Some computations were needlessly done in long double precision because PIL forced an automatic upcast wherever it appeared. Changed its name to MagickREALTYPEPI. <- This was later reverted back to MagickPIL.
  4529. +
  4530. Modified "magick/resize.c" so that Bohman uses one trig call + one sqrt call instead of two trig calls.
  4531. +
    2010-09-20 6.6.4-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4532. modified "magick/resample.c" to allow use of either EWA or HQEWA (default)
  4533. +
  4534. Removed LanczosFast from supported filters (SincFast*SincFast is faster)
  4535. +
    2010-09-19 6.6.4-5 Cristy <quetzlzacatenango@image...>
    +
  4536. If IPTC profile is not embedded in an 8bim resource, declare it IPTC rather than 8BIM.
  4537. +
  4538. Support %[version] and %[copyright].
  4539. +
  4540. Improve performance of the pixel cache.
  4541. +
    2010-09-18 6.6.4-4 Cristy <quetzlzacatenango@image...>
    +
  4542. Automatically set the quantum depth to 16 for HDRI.
  4543. +
    2010-09-16 6.6.4-2 Cristy <quetzlzacatenango@image...>
    +
  4544. IPTC profile not always wrapped properly inside an 8BIM profile.
  4545. +
  4546. TIFF tile geometry must be divisible by 16.
  4547. +
    2010-09-15 6.6.4-2 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4548. Rename of SincPolynomial to SincFast for easier user understanding
  4549. +
  4550. Ditto for LanczosChebyshev to LanzcosFast
  4551. +
    2010-09-14 6.6.4-2 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4552. Switch default resize filters to using the faster SincPolynomial filter by default internally. However 'Sinc' will still use the Trigonometric function, and can be used to assign the trig version of Sinc() to filters using the filter expert options.
  4553. +
  4554. The default filter for 'distort' was found to be a very blurry inaccurate filter function. It was removed and replaced with a correct Gaussian filter (as used by resize)
  4555. +
  4556. Added a switch so that "-interpolate filter" will force the use of a cylindrical filter for ALL pixels in distorted images. That is you can use that switch to use a cylindrical filter even for images that are being enlarged by the distortion. However EWA is still currently using a fixed 2.0 sampling radius. This switch complements the use of "-filter point" which turns off EWA filters in favor of interpolation for all pixels in a distorted image. BOTH switches should not be used together.
  4557. +
  4558. A bug in the support radius of the EWA resampling function was found, now that correctly defined resize filters are being used. Suddenly Normal Gaussian distortions are not so blurry, and tests with distortions of the 'Rings' image show extremely good and clear results, with only minimal blurring. The filter 'blur' expert option can be used to adjust this further.
  4559. + The above represents a major improvement forward in the quality of the image distortion operator. But near-unity distortions (no scaling) are still overly blurry. +
    2010-09-13 6.6.4-2 Cristy <quetzlzacatenango@image...>
    +
  4560. Don't negate the geometry offset for the -extent option.
  4561. +
    2010-09-09 6.6.4-1 Cristy <quetzlzacatenango@image...>
    +
  4562. The RGBO format is now listed as a supported format.
  4563. +
    2010-09-07 6.6.4-1 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4564. Added the Nicolas Robidoux and Chantal Racette Lanczos resize filter function as "LanczosChebyshev" as faster alternative to Lanczos.
  4565. +
  4566. Re-code Nicolas Robidoux and Chantal Racette Polynomial Approximation of the Sinc Trigonometric resize filter, as a proper filter to allow direct comparison and speed testing of the filter.
  4567. +
  4568. Expanded the "-set option:filter:verbose 1" output, so as to also include the actual functions and other values that were used to create the filter.
  4569. +
    2010-09-02 6.6.4-0 el_supremo <digipete@shaw...>
    +
  4570. Repair a few incorrect LocaleNCompare() calls (ttf.c, ps.c).
  4571. +
    2010-08-31 6.6.4-0 Cristy <quetzlzacatenango@image...>
    +
  4572. Path no longer closed if join style is round (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16943).
  4573. +
  4574. Add case for BGRQuantum to GetQuantumExtent().
  4575. +
  4576. Support no compression on PCX write.
  4577. +
    2010-08-23 6.6.3-10 Cristy <quetzlzacatenango@image...>
    +
  4578. Fixed bug in the raw BGRA coders (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16880).
  4579. +
  4580. Fix off-by-one error in the PSD coders.
  4581. +
  4582. Nicolas Robidoux with the assistance of Chantal Racette contribute an approximation of the sinc function over the interval [-3,3].
  4583. +
  4584. Eliminate a small memory leak in LevelizeImageChannel() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16951).
  4585. +
  4586. Recognize -fx logtwo (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16958).
  4587. +
    2010-08-15 6.6.3-7 Cristy <quetzlzacatenango@image...>
    +
  4588. Throw exception if image size differs for the compare program but the -subimage-search option is not specified.
  4589. +
    2010-08-13 6.6.3-6 Cristy <quetzlzacatenango@image...>
    +
  4590. The AdobeRgb.tif TIFF image no longer faults under Windows (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16838).
  4591. +
  4592. Add -subimage-search option to the compare utility.
  4593. +
    2010-08-12 6.6.3-5 Cristy <quetzlzacatenango@image...>
    +
  4594. The -fx 2e+6/1e+5 argument no longer returns the wrong results (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16833).
  4595. +
    2010-08-10 6.6.3-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  4596. Emit a warning if the PNG encoder can't satisfy the color type and bit depth requested with a "-define" directive.
  4597. +
    2010-08-07 6.6.3-4 Cristy <quetzlzacatenango@image...>
    +
  4598. The orient option sometimes improperly set "undefined" (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16795).
  4599. +
  4600. Only list orientation options for the -list orientation option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16801).
  4601. +
  4602. Return proper standard deviation for combined channels (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16786).
  4603. +
  4604. Handle transparency properly for the PSD image format.
  4605. +
    2010-08-05 6.6.3-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  4606. Properly map PNG intent to image->rendering_intent
  4607. +
    2010-08-01 6.6.3-3 Cristy <quetzlzacatenango@image...>
    +
  4608. Eliminate bogus "invalid colormap index" when pinging ICO images.
  4609. +
  4610. Support -set density / units.
  4611. +
    2010-07-31 6.6.3-2 Cristy <quetzlzacatenango@image...>
    +
  4612. Only use the first alpha channel in PSD image.
  4613. +
  4614. Only use XPM complying colors for XPM images (e.g. green is rgb(0,255,0)).
  4615. +
    2010-07-27 6.6.3-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  4616. Eliminate useless message about assuming zero delay when writing a single-frame MNG, and changed it from Error to Warning when writing a multiple-frame MNG.
  4617. +
    2010-07-25 6.6.3-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  4618. Don't "ping" a PNG image if it is embedded in a MNG. Otherwise the reader tries to read MNG chunks from the interior of the embedded PNG, resulting in an erroneous "corrupted image" message.
  4619. +
    2010-07-09 6.6.3-1 Cristy <quetzlzacatenango@image...>
    +
  4620. Fix memory leak in for corrupt BMP images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16600).
  4621. +
  4622. Repair several issues when writing to stdout (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16620).
  4623. +
  4624. A GIF image with the .bgr extension is still a GIF (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16662).
  4625. +
    2010-07-07 6.6.3-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  4626. The PNG decoder failed to handle the tRNS chunk properly for grayscale images where the PNG bit_depth was not the same as the quantum depth, and the transparent color was not black.
  4627. +
    2010-07-01 6.6.3-0 Chris Madison <madisonblu@gmail...>
    +
  4628. Pinging the DJVU image format no longer faults.
  4629. +
  4630. Check for time-limit-exceeded in only one thread.
  4631. +
  4632. Reading filenames from a file (e.g. @filenames) no longer includes the utility name (side effect of StringToArgv() method).
  4633. +
    2010-06-28 6.6.2-10 Cristy <quetzlzacatenango@image...>
    +
  4634. Support the tiff:fill-order define.
  4635. +
  4636. Filters are case sensitive (e.g. reduce-Colors).
  4637. +
  4638. Restore mogrify's -path option.
  4639. +
  4640. The -list module option lists image coders and image filters.
  4641. +
    2010-06-27 6.6.2-9 Cristy <quetzlzacatenango@image...>
    +
  4642. Add the ImageView API.
  4643. +
  4644. Fix DJVU coder to read one page (e.g. 'image.djvu[2]').
  4645. +
  4646. Support -define png:bit-depth=1 -define png:color-type=3 for PNG format.
  4647. +
    2010-06-22 6.6.2-8 Cristy <quetzlzacatenango@image...>
    +
  4648. Skip byte when DDS bitcount is 32 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16487).
  4649. +
  4650. Montage now uses final background setting (e.g. montage -background none ... -background lightblue show:).
  4651. +
  4652. Do not annotate directory paths in ListFiles().
  4653. +
  4654. Reset the image matte for png:color-type=2.
  4655. +
    2010-06-17 6.6.2-7 Cristy <quetzlzacatenango@image...>
    +
  4656. Support new label:pointsize property.
  4657. +
  4658. Miscellany->Slide Show, in the display program, now cycles through the image sequence.
  4659. +
  4660. Recognize certain hex color values (e.g. #b9e1cc00) for the -fx argument.
  4661. +
  4662. Reduce memory requirements when dithering on the iPhone.
  4663. +
  4664. Command line operators no longer affected by settings that appear after them (e.g. -splice 10x0+0+0 -gravity center).
  4665. +
  4666. Compute the proper DPX user data field size.
  4667. +
    2010-06-15 6.6.2-6 Cristy <quetzlzacatenango@image...>
    +
  4668. Fix some nits to keep the clang compiler happy.
  4669. +
    2010-06-14 6.6.2-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4670. Fix transprancy handling for Morphology Convolve
  4671. +
  4672. Adjustments of Hit And Miss and Edge Detection kernel definitions
  4673. +
  4674. Added 'ThinDiagonals' Thinning Kernel + two sub-types
  4675. +
  4676. Handling for Convolution of 1-D vertical kernels. However this was removed (using #if-#endif) as I found it slower in tests!
  4677. +
    2010-06-12 6.6.2-5 Cristy <quetzlzacatenango@image...>
    +
  4678. mogrify -format properly handles compressed image filename (e.g. -format jpg logo.png.bz2).
  4679. +
  4680. Respect +dither option when saving to the GIF image format.
  4681. +
    2010-06-08 6.6.2-4 Cristy <quetzlzacatenango@image...>
    +
  4682. End of string sentinel is \n not \r.
  4683. +
    2010-06-06 6.6.2-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  4684. Don't decode pixels in coders/png.c when image->ping is set.
  4685. +
    2010-06-06 6.6.2-3 Cristy <quetzlzacatenango@image...>
    +
  4686. Reset image filename when reading inline images.
  4687. +
  4688. Don't clamp floating point values for HDRI-enabled ImageMagick.
  4689. +
    2010-05-25 6.6.2-2 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4690. Replaced '^' morphology kernel rotation with two variants '>' and '<'
  4691. +
  4692. 'Skeleton' variant to thin down images as symmetrically as possible.
  4693. +
  4694. Spelling correction: Manhatten -> Manhattan
  4695. +
    2010-06-01 6.6.2-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  4696. Properly scale color components of the PNG bKGD chunk.
  4697. +
  4698. Prevent MNG divide by zero in calculation of frame_timeout. Set both frame_delay and frame_timeout to infinite when ticks_per_second is zero, as required by the MNG spec.
  4699. +
    2010-05-31 6.6.2-2 Cristy <quetzlzacatenango@image...>
    +
  4700. Add x:silent option to prevent beeps when reading the X image format.
  4701. +
  4702. Recognize TTF for GetMagicInfo().
  4703. +
  4704. Ensure the +set option deletes the image artifact.
  4705. +
    2010-05-28 6.6.2-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  4706. Prevent coders/png.c from attempting to write an empty tRNS chunk.
  4707. +
    2010-05-25 6.6.2-1 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4708. Fix for Square Array Rotates (off center origin rotate)
  4709. +
  4710. Added HitAndMiss kernel Ridges2 to find 2 pixel thick ridges
  4711. +
  4712. Added FreiChen:0,{angle} FreiChen:{angle} and FreiChen:-1 variations to complete this kernels definition
  4713. +
    2010-05-24 6.6.2-1 Cristy <quetzlzacatenango@image...>
    +
  4714. Respect density when rendering SVG images.
  4715. +
  4716. Set AVI handler to the MPEG coder.
  4717. +
  4718. Compute the proper DPX user data field size.
  4719. +
  4720. Do not interpret a format specifier when enclosed in brackets (e.g. rose_tile_%[filename:tile].gif.
  4721. +
  4722. Use 64-bit types when compiling with the 64-bit Visual C++ compiler under Windows.
  4723. +
  4724. Prevent MNG divide by zero in calculation of frame_delay (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16320).
  4725. +
    2010-05-23 6.6.2-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4726. Third Re-write of MorphologyApply() to better handle compound methods.
  4727. +
  4728. Implemented -set option:morphology:compose for merging results of multiple kernels. "None" means re-iterate results with next kernel. While "Undefined" means to use the internal default for a method. Thinning, Thickening, HitAndMiss, Convolve, Correlate defaults to "None" while HitAndMiss defaults to "Lighten" (union of all kernel results). Other morphology methods defaults still to be decided.
  4729. +
  4730. Added HitAndMiss Kernel: Ridges (find ridges and pixel width lines)
  4731. +
  4732. Rotation Expansion of single kernels '^' and '@' flags in arguments EG: -set option:showkernel 1 -morphology Convolve 'Blur:0x2^'
  4733. +
  4734. ExpandKernelInfo() (rotation expand) now groks symmetrical kernels. So the above will only produce a list of 2 kernels, not 4 kernels
  4735. +
    2010-05-18 6.6.2-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4736. Separation of internal function MorphologyApply() from MorphologyImageChannel() to calls to convolve without user settings.
  4737. +
  4738. Rewrite of MorphologyApply() to output better 'verbose' messages
  4739. +
  4740. Better handling of Gaussian tyle filters (bug fixes)
  4741. +
  4742. Bug fix and optimization of kernel size calculations in "gem.c"
  4743. +
  4744. Allow '^' or '@' flags in 'user defined' kernel size arguments to expand kernel into a rotated list. EG: -set option:showkernel 1 -morphology Thinning '3@: 0,1,0 0,1,0 0,0,0'
  4745. +
  4746. Allow a scaled unity kernel to be added to kernel (EdgeDet->Sharpen) EG: -set option:convolve:scale [kernel_scale][^!],[unity_scale][%]
  4747. +
  4748. Addition of "Laplacian of Gaussian" (LOG), also known as Mexican Hat EG: -morphology convolve LOG:0x1
  4749. +
  4750. Added FreiChen, Kirsch Convolution kernels
  4751. +
  4752. Added Discrete 'Laplacian of Gaussian' kernels (Laplacian type 15 and 19)
  4753. +
  4754. Added Edges HitAndMiss Kernel
  4755. +
    2010-05-17 6.6.2-0 Cristy <quetzlzacatenango@image...>
    +
  4756. PSD images require a proper layer to support an alpha channel.
  4757. +
  4758. Enable PFM endian support.
  4759. +
  4760. Add context to -border for montage. Inside the parenthesis it adds a border to the image otherwise it sets the border for the layout manager.
  4761. +
  4762. 24-bit BMP images are not colormapped even if header colors != 0.
  4763. +
  4764. Set DPX user data like this: -set profile dpx:userdata.txt.
  4765. +
  4766. Make sure Lab => RGB => Lab survives the round trip.
  4767. +
    2010-05-15 6.6.1-10 Cristy <quetzlzacatenango@image...>
    +
  4768. Use ScaleCharToQuantum() in coders/src.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16229).
  4769. +
  4770. Don't clamp HDRI EXR pixels.
  4771. +
    2010-05-14 6.6.1-9 Cristy <quetzlzacatenango@image...>
    +
  4772. Increase the estimated # points for the path drawing primitive.
  4773. +
  4774. Remove any prior resolution block from PSD before writing the new block.
  4775. +
    2010-05-14 6.6.1-9 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4776. Addition of more Morphological/Convolution Kernels. DOG (Difference of Gaussians) and DOB (Difference of Blurs), EG: -morphology convolve DOG:0x1,3 -morphology convolve DOB:0x1,3,90
  4777. +
  4778. Added Prewitt, Roberts, Compass Convolution Kernels
  4779. +
  4780. Ring Symbol Kernel (subtraction of Disk from a Disk)
  4781. +
    2010-05-13 6.6.1-9 Cristy <quetzlzacatenango@image...>
    +
  4782. The pixel buffer was underallocated for some image formats when streaming.
  4783. +
    2010-05-12 6.6.1-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4784. Implementation of Pattern Matching Morphology methods HitAndMiss, Thicken, Thinning
  4785. +
  4786. Reporting of Kernel Strings that fail to parse (though not why)
  4787. +
  4788. Parsing of Multiple Kernel Strings, generating a list of kernels
  4789. +
  4790. Union of results from Multiple Kernels for HitAndMiss method
  4791. +
  4792. Iterated Multiple Kernels for all other morphology methods
  4793. +
  4794. Added many new kernels for HitAndMiss and Convolution Sobel, Laplacian, Cross, Peaks, Corners, LineEnds, LineJunctions, ConvexHull (for Thicken), Skeleton (for Thinning)
  4795. +
    2010-05-08 6.6.1-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  4796. Use proper background.index when writing indexed PNG, if the background color is in the palette.
  4797. +
    2010-05-08 6.6.1-7 Cristy <quetzlzacatenango@image...>
    +
  4798. Fix improper 'invalid colormap index' PNG bug.
  4799. +
  4800. Fix PerlMagick compile exception.
  4801. +
    2010-05-07 6.6.1-6 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4802. Added % and ! modification flags to morphology distance kernel scaling factor, for easier usage.
  4803. +
  4804. Bug fix for compose math channel handling and morphology diff usage
  4805. +
    2010-05-06 6.6.1-6 Cristy <quetzlzacatenango@image...>
    +
  4806. Do not claim gray colorspace if gray image includes a non-gray pixel.
  4807. +
  4808. Initialize BMP alpha channel to opaque for RGB images.
  4809. +
  4810. Fixed under allocation for round rectangles.
  4811. +
  4812. The -list option returns a 0 status as expected.
  4813. +
    2010-05-06 6.6.1-6 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4814. Made use of new no-'sync' channel enabled mathematical compose methods for the difference morphology methods. These should now work correctly for specific channels, and more importantly for alpha shaped morphology.
  4815. +
    2010-05-05 6.6.1-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  4816. Fixed bugs with losing the opacity channel while writing some PNG images. (bug reported by Anthony T.)
  4817. +
    2010-05-05 6.6.1-6 Glenn Randers-Pehrson <glennrp@image...>
    +
  4818. Simplified and corrected rowbytes calculation in coders/png.c and added more logging.
  4819. +
    2010-05-05 6.6.1-6 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4820. Rename of "Add" and "Subtract" compositions to "ModulusAdd" and "ModulusSubtract" for more clarity of there functions. Old names will continue to work as expected.
  4821. +
  4822. Fix "Minus", "ModulusAdd", and "ModulusSubtract" to follow normal SVG 'Over' blending specifications, (see next for override) Note that this does NOT include the "Plus" composition method which has SVG definition for it to use a 'Plus' blending rather than 'Over' blending.
  4823. +
  4824. By default mathematical compositions work as per SVG definition. That is the results are synchronized with 'Over' alpha-blending (except "Plus" which uses 'plus' alpha-blending).
  4825. +
  4826. By removing the default 'sync' flag from the -channel setting however Break this inter-channel synchronization and do the mathematical operations only on the individual channels as specified by the -channel setting. That is do 'channel' math rather than 'SVG' composition.
  4827. +
  4828. With this change you can then use mathematical composition methods on individual channels or even with the alpha channel of images.
  4829. +
    2010-04-28 6.6.1-6 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4830. Special case handling in Barrel distortion (pixel at image center)
  4831. +
  4832. Calculation of image for Barrel distortion (pixel vs image coords)
  4833. +
  4834. Argument input (handling optional 'd' argument) for Barrel distortion
  4835. +
    2010-04-24 6.6.1-6 Cristy <quetzlzacatenango@image...>
    +
  4836. Do not declare timestruct under MinGW.
  4837. +
  4838. Respect -compose option for the montage utility (bug report by Anthony).
  4839. +
  4840. A 256 column gradient produces a 256 color GIF image (bug report by Anthony).
  4841. +
  4842. Register / unregister CALS format in static.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=16103).
  4843. +
  4844. Add SetImageColor() method.
  4845. +
    2010-04-17 6.6.1-5 Cristy <quetzlzacatenango@image...>
    +
  4846. Only write one ICC profile to PSD image.
  4847. +
  4848. Sync image colormap for PNG tRNS chunks.
  4849. +
  4850. The -direction option now works with the -annotate and -draw options.
  4851. +
  4852. For the histogram: format, if you have no need for the unique color list, use <kbd>-define histogram:unique-colors=false</kbd> to forego this expensive operation.
  4853. +
  4854. Match on literal after backslash in glob expression (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16068).
  4855. +
  4856. Enable JPEG-compression for grayscale TIFF images (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16064).
  4857. +
  4858. Don't write empty tile if tile geometry matches the image width (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16064).
  4859. +
  4860. Support -regard-warnings in the mogrify utility.
  4861. +
  4862. Output the correct units for the identify utility (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=16075).
  4863. +
    2010-04-15 6.6.1-4 Cristy <quetzlzacatenango@image...>
    +
  4864. Do not set the resample virtual pixel method when undefined.
  4865. +
  4866. Support writing grayscale PSD images.
  4867. +
  4868. Revert Lab-to-XYZ colorspace transform patch.
  4869. +
  4870. Clamp HDRI values for LevelImageChannel() method.
  4871. +
    2010-04-12 6.6.1-3 Cristy <quetzlzacatenango@image...>
    +
  4872. For HSL to RGB, if color temperature is less than 0, set RGB to lightness.
  4873. +
  4874. Do not flip BMP image with negative height when pinging.
  4875. +
    2010-04-08 6.6.1-2 Cristy <quetzlzacatenango@image...>
    +
  4876. Improve support for device link profiles.
  4877. +
    2010-04-06 6.6.1-1 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4878. Fixed bug in -auto-level for special case when only one value is present in some channel of the image. In this case no 'stretch is performed, just as -normalize does.
  4879. +
    2010-04-05 6.6.1-1 Cristy <quetzlzacatenango@image...>
    +
  4880. WMF support under Windows does not produce the same results as under Linux.
  4881. +
    2010-03-31 6.6.1-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4882. Fixed bug in equal-size tile cropping, when image has a page offset.
  4883. +
    2010-03-31 6.6.1-0 Cristy <quetzlzacatenango@image...>
    +
  4884. The -recolor 4x4 matrix is now interpreted properly (previously it summed rather than attenuating the alpha channel).
  4885. +
  4886. Support writing 1-bit PSD images.
  4887. +
  4888. Support LCMS 2.0.
  4889. +
  4890. Improved WMF support under Windows.
  4891. +
    2010-03-30 6.6.1-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  4892. The new coders/png.c was failing to read a 1-bit paletted image properly.
  4893. +
  4894. Finished eliminating the deprecated direct references to members of the png_info structure. ImageMagick can now be built with libpng-1.5.
  4895. +
    2010-03-21 6.6.0-10 Cristy <quetzlzacatenango@image...>
    +
  4896. Respect the -density option when rendering a Postscript or PDF image.
  4897. +
  4898. Distort barrel no longer complains when 3 arguments are given (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=15883).
  4899. +
  4900. Support -direction left-to-right option for rendering text
  4901. +
    2010-03-24 6.6.0-9 Glenn Randers-Pehrson <glennrp@image...>
    +
  4902. coders/png.c: Eliminated support of libpng versions older than 1.0.12.
  4903. +
  4904. Relocated the new, misplaced png_get_rowbytes() call.
  4905. +
  4906. Updated setjmp/longjmp/jmpbuf usage to work with libpng-1.5.
  4907. +
    2010-03-21 6.6.0-9 Cristy <quetzlzacatenango@image...>
    +
  4908. Windows does not support complex.h (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=15808).
  4909. +
  4910. Add support for monochrome PSD images.
  4911. +
  4912. VignetteImage() no longer crashes when x and y arguments are both greater than half the width (x) and height (y) of the image.
  4913. +
    2010-03-20 6.6.0-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  4914. Eliminated some of the deprecated direct references to members of the png_info structure. This must be finished before we can build with libpng-1.5.
  4915. +
    2010-03-18 6.6.0-8 Cristy <quetzlzacatenango@image...>
    +
  4916. The animate program no longer loops twice when -loop 1 is specified.
  4917. +
  4918. The caption format would sometimes hang when the text was not UTF-8.
  4919. +
  4920. Don't gamma correct log to linear color conversion unless the -gamma is specified (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=15799).
  4921. +
    2010-03-17 6.6.0-7 Cristy <quetzlzacatenango@image...>
    +
  4922. Detect CMYKProcessColor AI tag.
  4923. +
  4924. Delete image from command line cache for -write option.
  4925. +
    2010-03-13 6.6.0-6 Cristy <quetzlzacatenango@image...>
    +
  4926. Add support for the Adobe Large Document format.
  4927. +
  4928. Recognize -remap option for the mogrify utility.
  4929. +
  4930. The default Helvetica font is not always available, check for Century Schoolbook too (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=15780).
  4931. +
    2010-03-11 6.6.0-5 Cristy <quetzlzacatenango@image...>
    +
  4932. Permit user to get virtual pixels with a region width of 0.
  4933. +
  4934. Reformulate the jinc() function so that the main peak is of amplitude of 1.
  4935. +
  4936. Resampling filter must respect the image virtual pixel method.
  4937. +
    2010-03-07 6.6.0-4 Cristy <quetzlzacatenango@image...>
    +
  4938. The -evaluate-sequence option behaves like -evaluate except it operates on a sequence of images.
  4939. +
    2010-03-05 6.6.0-2 Cristy <quetzlzacatenango@image...>
    +
  4940. Add support for the -maximum and -minimum options.
  4941. +
    2010-02-27 6.6.0-1 Cristy <quetzlzacatenango@image...>
    +
  4942. Check to see if ICON image width /height exceeds that of the image canvas.
  4943. +
  4944. Set the DPX descriptor to Luma only if the image type is not TrueColor.
  4945. +
  4946. Add support for -fx airy(), j0(), j1(), jinc(), and sinc() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=15685). Anthony, review these for correctness.
  4947. +
  4948. Don't embed an XMP profile in an EPS image for now.
  4949. +
    2010-02-21 6.6.0-0 Cristy <quetzlzacatenango@image...>
    +
  4950. Insufficient image data in EPT is a warning rather than an error.
  4951. +
  4952. Respect -type TrueColor when writing gray DPX images.
  4953. +
  4954. Fix problem reading 10-bit grayscale DPX images when scanline length is not a multiple of 3.
  4955. +
  4956. BMP has an alpha channel, it was treated as an opacity channel.
  4957. +
    2010-02-20 6.5.9-10 Cristy <quetzlzacatenango@image...>
    +
  4958. Write 10-bit grayscale DPX images properly.
  4959. +
    2010-02-18 6.5.9-8 Cristy <quetzlzacatenango@image...>
    +
  4960. Detect PDF ICCBased colorspace.
  4961. +
    2010-02-18 6.5.9-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4962. Finalized -set option:convolve:scale kernel normalize/scale option
  4963. +
    2010-02-16 6.5.9-7 Cristy <quetzlzacatenango@image...>
    +
  4964. TransformImage() resets the image blob when called in the PICT decoder; use SetImageExtent() instead.
  4965. +
    2010-02-14 6.5.9-6 Cristy <quetzlzacatenango@image...>
    +
  4966. Support PSD RLE compression.
  4967. +
    2010-02-13 6.5.9-5 Cristy <quetzlzacatenango@image...>
    +
  4968. The jpeg:extent define sometimes exceeded the specified limit.
  4969. +
    2010-02-09 6.5.9-4 Cristy <quetzlzacatenango@image...>
    +
  4970. Resolve "too many open files" (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=15546).
  4971. +
    2010-02-08 6.5.9-3 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4972. Added Correlate method which does a Convolve without reflecting the kernel.
  4973. +
    2010-02-07 6.5.9-3 Cristy <quetzlzacatenango@image...>
    +
  4974. Initialize grayscale colormap for PSD images.
  4975. +
    2010-02-07 6.5.9-3 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4976. Final testing and fixing of basic morphology operators
  4977. +
  4978. Addition Third-level Subtractive Morphology Methods: EdgeIn, EdgeOut, Edge, TopHat, BottomHat
  4979. +
  4980. Ensuring original kernels passed to morphology are cloned before being modified for use by specific methods (EG: convolve scale/normalize)
  4981. +
    2010-02-03 6.5.9-2 Cristy <quetzlzacatenango@image...>
    +
  4982. display -immutable to display transparent image without a checkboard.
  4983. +
    2010-01-27 6.5.9-1 Glenn Randers-Pehrson <glennrp@image...>
    +
  4984. Make -define png:color-type less persnickety about what it will accept.
  4985. +
    2010-01-24 6.5.9-1 Anthony Thyssen <A.Thyssen@griffith...>
    +
  4986. added use of -precision in 'showkernel' output of -morphology
  4987. +
  4988. correct use of a 'reflected kernel' for 'Convolve' 'Dilate' and 'Distance' Morphology primitives. This does not have a performance hit, though is only truely applicable when the kernel is asymmetric. Note that 'Erode' does not use a 'reflected' kernel, so that 'Open' and 'Close' operations work properly. This 'reflected usage is defined by online morphology lecture notes (Google for "EECE Binary Morphology")
  4989. +
  4990. Added convolve kernel scaling setting "-set option:convolve:scale N" If undefined morphology convolve does not do any scaling or normalization of the convolution kernel. A value of 0.0 causes normalization for both zero and non-zero (added weights) kernel types.
  4991. +
    2010-01-15 6.5.9-1 Cristy <quetzlzacatenango@image...>
    +
  4992. Speed up reading the PSD image format.
  4993. +
  4994. Add the -precision option. Use it to set the maximum number of significant digits to be printed.
  4995. +
  4996. Add -features option to the identify program to display channel features.
  4997. +
  4998. Add -unique option to the identify program to display channel features.
  4999. +
    2010-01-01 6.5.9-0 Cristy <quetzlzacatenango@image...>
    +
  5000. Add support for compact floating point (i.e. -depth 16 -define quantum:format=floating-point).
  5001. +
  5002. Transparent images no longer flicker on certain system when using the display program.
  5003. +
  5004. Permit interactive resizing with the display program.
  5005. +
  5006. Support heterogeneous distributed processing, see ../www/architecture.html#distributed.
  5007. +
  5008. Fix semaphore assertion when reading a corrupt image with Magick++.
  5009. +
  5010. Add support for -brightness-contrast option.
  5011. +
    2010-01-05 6.5.9-0 Stephan Menzel <stephan.menzel@gmail...>
    +
  5012. Add support for the BGRA raw image format.
  5013. +
    2010-01-04 6.5.9-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5014. Added Kernel Generator to generate kernels from user strings, which allows the generation in many built in kernels for both Convolution and other Morphological methods. New Kernels currently include.. Convolution: Gaussian, Blur, Comet Morphological: Rectangle, Square, Diamond, Disk, Plus Distance: Chebyshev, Manhatten, Knight, Euclidean And both old and new (rectangular) user defined kernel specifications including the use of 'nan' to represent elements which are not part of the kernel definition. List built-in kernel types use "-list kernel"
  5015. +
  5016. Added -morphology {method}[:{iteration}] {kernel_string} Initial methods includes no only the basic morphology methods: Dilate, Erode, Open, Close; and a pixel color preserving 'Intensity' version, but also the special methods: Convolve, and Distance. Of course the appropriate kernel should be provided for each specific method.
  5017. +
    2010-01-01 6.5.9-0 Cristy <quetzlzacatenango@image...>
    +
  5018. Add OpenCL-enabled filter (e.g. convert image.png -process "convolve '-1, -1, -1, -1, 9, -1, -1, -1, -1'" image.jpg).
  5019. +
  5020. Added StringTo...() processing functions
  5021. +
    2009-12-27 6.5.8-9 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5022. Added MxN tile cropping with overlapping and space handling. See IM Examples, Cutting and Bordering, Cropping roughly Equal
  5023. +
    2009-12-23 6.5.8-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5024. angle bug fix in variable blur composition with vertical ellipses
  5025. +
  5026. Added ability to have variable angles for ellipses in variable blur composition. See IM Examples, Composition, Variable Blur for details
  5027. +
    2009-12-20 6.5.8-8 Cristy <quetzlzacatenango@image...>
    +
  5028. JPEG does not grok the HSL colorspace.
  5029. +
    2009-12-18 6.5.8-7 Cristy <quetzlzacatenango@image...>
    +
  5030. Off by 1 error when allocating the dash-pattern array in PerlMagick.
  5031. +
  5032. The -gaussian-blur over blurred the opacity channel (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=15218).
  5033. +
    2009-12-13 6.5.8-6 Cristy <quetzlzacatenango@image...>
    +
  5034. Declare InverseFourierTransformImage in Magick++/Include.h.
  5035. +
    2009-12-09 6.5.8-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  5036. The PNG8 encoder would fail to write a 1-color image, due to a bogus MagickFail return from CompressColormapTransFirst().
  5037. +
    2009-12-05 6.5.8-4 Cristy <quetzlzacatenango@image...>
    +
  5038. SVG images are no longer double sized with the -density option.
  5039. +
    2009-12-04 6.5.8-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  5040. Changed the one instance of PNG_COLOR_TYPE_RGBA to PNG_COLOR_TYPE_RGB_ALPHA in coders/png.c
  5041. +
    2009-12-03 6.5.8-3 Cristy <quetzlzacatenango@image...>
    +
  5042. It's interword-spacing, not interword_spacing (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=1515).
  5043. +
  5044. All JP2 depths (e.g. 4, 10, 12, 16) are now supported properly.
  5045. +
    2009-11-28 6.5.8-2 Glenn Randers-Pehrson <glennrp@image...>
    +
  5046. Changed the one remaining ping_info->trans to ping_info->trans_values in coders/png.c
  5047. +
    2009-11-26 6.5.8-1 Chris Madison <madisonblu@gmail...>
    +
  5048. Eliminate bogus 'skip to sync byte' exception for PCD image format.
  5049. +
  5050. -threshold option: threshold to white if the computed intensity of the color channels exceeds the threshold.
  5051. +
  5052. Add -define jpeg:extent option to restrict the maximum JPEG image file size.
  5053. +
    2009-11-26 6.5.8-1 Dr. Ingo Bremer <bremer@wias-...>
    +
  5054. Escape single quote in when writing the UIL format.
  5055. +
    2009-11-25 6.5.8-1 Jee Teck <jee.teck@cteca...>
    +
  5056. The mogrify program +opaque option now recognizes its required argument.
  5057. +
    2009-11-19 6.5.8-0 Cristy <quetzlzacatenango@image...>
    +
  5058. Add magick/morphlogy.{c,h} source templates.
  5059. +
  5060. Sync image option when reading MPR images.
  5061. +
  5062. Optimize ping for SVG images.
  5063. +
  5064. SetLogFormat() no longer causes crash (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=15091).
  5065. +
  5066. Do not call MagickCoreTerminus() when memory allocation fails inside the locale component.
  5067. +
    2009-11-18 6.5.7-9 Cristy <quetzlzacatenango@image...>
    +
  5068. Read / write 32-bit SUN raster images with a odd width.
  5069. +
  5070. Cairo format returns pixels with the alpha premultiplied (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=15081).
  5071. +
    2009-11-12 6.5.7-8 Cristy <quetzlzacatenango@image...>
    +
  5072. Thumb::URI file URI now has the correct number of forward slashes.
  5073. +
    2009-11-09 6.5.7-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  5074. Suppress libpng pedantic warnings and warn about using old libpng-1.4.0 beta versions.
  5075. +
    2009-11-09 6.5.7-7 Cristy <quetzlzacatenango@image...>
    +
  5076. Bump library age.
  5077. +
  5078. Restore -tile-offset functionality (bug report from Anthony).
  5079. +
    2009-11-06 6.5.7-6 Cristy <quetzlzacatenango@image...>
    +
  5080. Animate command line options are no longer ignored.
  5081. +
    2009-11-04 6.5.7-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5082. Bug Fix for Polynomial distortion. which is now working.
  5083. +
    2009-11-01 6.5.7-4 Cristy <quetzlzacatenango@image...>
    +
  5084. Use -define delegate:bimodal=true to activate any bimodal delegates.
  5085. +
  5086. Make sure MagickWand semaphore is acquired before locking it.
  5087. +
    2009-10-28 6.5.7-3 Cristy <quetzlzacatenango@image...>
    +
  5088. Convert SVG clipping path points from unsigned to long.
  5089. +
    2009-10-26 6.5.7-2 Chris Madison <madisonblu@gmail...>
    +
  5090. Only call InstantiateXComponent() if X11 support is included.
  5091. +
  5092. Correct hue computation for the HSB colorspace.
  5093. +
    2009-10-23 6.5.7-1 Samuel Thibault <samuel.thibault@ens-l...>
    +
  5094. Braille coder fix for DirectClass images
  5095. +
    2009-10-19 6.5.7-1 Wang Dataton <wang@datat...>
    +
  5096. Use fdopen() rather than MagickOpenStream() in coders/pict.c.
  5097. +
    2009-10-18 6.5.7-1 Cristy <quetzlzacatenango@image...>
    +
  5098. Alpha blending is not required for ScaleImage().
  5099. +
  5100. Gaussian noise operator is not longer discontinuous.
  5101. +
    2009-10-14 6.5.7-0 Pino Toscano <pino@kde...>
    +
  5102. ImageMagick fails to build in GNU/HURD due to absence of PATH_MAX.
  5103. +
    2009-10-14 6.5.7-0 Cristy <quetzlzacatenango@image...>
    +
  5104. Black channel is now set properly when resizing CMYKA images.
  5105. +
    2009-10-10 6.5.7-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5106. Bug Fixes for degenerate 'affine' cases of BilinearForward distortion.
  5107. +
    2009-10-06 6.5.6-10 Cristy <quetzlzacatenango@image...>
    +
  5108. Declare the MagickCore method SpliceImage() in Magick++/Include.h.
  5109. + QueueCacheViewAuthenticPixels() for the CopyComposite optimization.
    2009-10-04 6.5.6-9 Cristy <quetzlzacatenango@image...>
    +
  5110. Use GetCacheViewAuthenticPixels() rather than
  5111. +
  5112. QueueCacheViewAuthenticPixels() for the CopyComposite optimization.
  5113. +
    2009-10-03 6.5.6-8 Nick Wellnhofer <wellnhofer@aevum...>
    +
  5114. Add missing libraries to the LIBADD entries in coders/Makefile.am, filters/Makefile.am and wand/Makefile.am.
  5115. +
  5116. Use LIBS rather than LDFLAGS in configure.ac for the Freetype delegate library.
  5117. +
    2009-10-01 6.5.6-7 Cristy <quetzlzacatenango@image...>
    +
  5118. Don't use group4 compression if the image is truecolor.
  5119. +
  5120. If image is gray, write grayscale DPX images.
  5121. +
  5122. We no longer lose a scanline when reading multi-frame raw images (Y, R, C, etc.).
  5123. +
  5124. Properly update the EXIF orientation tag.
  5125. +
    2009-09-25 6.5.6-6 Cristy <quetzlzacatenango@image...>
    +
  5126. Permit percentage of hue for HSL (e.g. hsl(12%,...)).
  5127. +
    2009-09-25 6.5.6-5 Cristy <quetzlzacatenango@image...>
    +
  5128. Support -clamp option.
  5129. +
  5130. Patch for IsMagickColorEqual() for HDRI.
  5131. +
  5132. Permit non-percentage HSL colors (e.g. hsl(12.6316,134.58339,219.00012)).
  5133. +
    2009-09-25 6.5.6-5 Elf <elf@ephem...>
    +
  5134. Patch to fix configure's framework's undefinedness (only if the gslib tests are run).
  5135. +
    2009-09-22 6.5.6-4 Cristy <quetzlzacatenango@image...>
    +
  5136. Don't compile Huffman2DEncodeImage() unless the TIFF delegate library is enabled.
  5137. +
  5138. Hue in hsl() format is 0-360 and does not use %.
  5139. +
    2009-09-21 6.5.6-3 Cristy <quetzlzacatenango@image...>
    +
  5140. Deprecate LevelImageColors(), replace with LevelColorsImage().
  5141. +
    2009-09-17 6.5.6-2 Cristy <quetzlzacatenango@image...>
    +
  5142. Optimize copy composite operator.
  5143. +
    2009-09-15 6.5.6-2 Cristy <quetzlzacatenango@image...>
    +
  5144. Use -define jpeg:size to scale a JPEG image to the specified size.
  5145. +
    2009-09-13 6.5.6-0 Cristy <quetzlzacatenango@image...>
    +
  5146. Fix ICON alpha mask scanline pad.
  5147. +
    2009-09-11 6.5.5-10 Cristy <quetzlzacatenango@image...>
    +
  5148. Return the global maximum threads to avoid the rare cache view assertions.
  5149. +
  5150. Throw an end-of-file exception for truncated raw gray images.
  5151. +
    2009-09-10 6.5.5-9 Cristy <quetzlzacatenango@image...>
    +
  5152. Do not include last line of text in the interline spacing computation.
  5153. +
    2009-09-07 6.5.5-8 Cristy <quetzlzacatenango@image...>
    +
  5154. Check that quantum_info is defined before destroying it in the PNG coder.
  5155. +
  5156. Add -interline-spacing option to convert.
  5157. +
    2009-09-03 6.5.5-7 Cristy <quetzlzacatenango@image...>
    +
  5158. Support multi-page transparent Postscript and PDF.
  5159. +
    2009-09-01 6.5.5-6 Cristy <quetzlzacatenango@image...>
    +
  5160. A union is required when converting a thread ID to an unsigned long.
  5161. +
    2009-08-28 6.5.5-5 Cristy <quetzlzacatenango@image...>
    +
  5162. Add support for TIFF 3.9.1.
  5163. +
    2009-08-27 6.5.5-4 Cristy <quetzlzacatenango@image...>
    +
  5164. Validate with the netscape: reference image.
  5165. +
    2009-08-26 6.5.5-3 Cristy <quetzlzacatenango@image...>
    +
  5166. Fix memory leak for threaded PerlMagick scripts.
  5167. +
    2009-08-24 6.5.5-2 Cristy <quetzlzacatenango@image...>
    +
  5168. SVG compile error when if MAGICKCORE_CAIRO_DELEGATE is not defined.
  5169. +
    2009-08-23 6.5.5-1 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5170. Bug Fix for transparency handling in Composite Variable Blur
  5171. +
  5172. Addition of -auto-level and -auto-gamma image enhancements (under trial not yet final)
  5173. +
  5174. Addition of a special -channel flag 'sync' which means that the specified channels are to be modified together by the same amount. The flag is enabled by default. This replaces the current 'channels not modified' type handling thought IM.
  5175. +
  5176. Modified -channel parsing to continue looking for words, after handling any shorthand channel options. For example: -channel RGB,sync
  5177. +
    2009-08-10 6.5.5-0 Cristy <quetzlzacatenango@image...>
    +
  5178. identify -format %c logo.png returns the image comment as expected.
  5179. +
  5180. Clone ImageInfo members scene and number_scenes (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=14437).
  5181. +
  5182. Fix memory leak with the -remote option of the animate program (bug report from Anthony).
  5183. +
  5184. If a grayscale TIFF image has a colormap write it as a colormapped image.
  5185. +
  5186. MVG partial opacity not set properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=6&t=14442).
  5187. +
  5188. Black channel was not blurring properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=14473).
  5189. +
    2009-08-06 6.5.4-10 Cristy <quetzlzacatenango@image...>
    +
  5190. The display program honors -loop.
  5191. +
  5192. (ab) of Lab colorspace was not offset correctly.
  5193. +
  5194. Scale mag/phase and real/imaginary the same for HDRI and non-HDRI builds.
  5195. +
  5196. SVG permits multiple arc paths with an omitted 'A' (reference https://imagemagick.org/discourse-server//viewtopic.html?f=6&t=14377).
  5197. +
  5198. The 'skewY' MVG attribute produced incorrect angles (reference https://imagemagick.org/discourse-server//viewtopic.html?f=6&t=14144).
  5199. +
    2009-08-02 6.5.4-9 Cristy <quetzlzacatenango@image...>
    +
  5200. Optimize GammaImage() method.
  5201. +
    2009-08-02 6.5.4-8 Cristy <quetzlzacatenango@image...>
    +
  5202. OpenMP-enable GetSimilarityMetric().
  5203. +
    2009-07-30 6.5.4-7 Bernhard Rosenkraenzer <bero@arkli...>
    +
  5204. Structure trans_values was renamed to trans_color and trans was renamed to trans_alpha in PNG version 1.4.
  5205. +
    2009-07-29 6.5.4-7 Cristy <quetzlzacatenango@image...>
    +
  5206. Replace color blending in DrawGradientImage() to use Composite Blend. this makes Gradients handle transparency correctly!
  5207. +
    2009-07-28 6.5.4-7 Cristy <quetzlzacatenango@image...>
    +
  5208. The -thumbnail option no longer removes color profiles (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=14312).
  5209. +
  5210. Do not scale real / imaginary FFT / IFT.
  5211. +
  5212. Check for localtime() NULL return.
  5213. +
  5214. import --help requires an X server (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=14323).
  5215. +
  5216. Fails to load MS Windows icons with compressed PNG elements (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=14324).
  5217. +
    2009-07-25 6.5.4-6 Cristy <quetzlzacatenango@image...>
    +
  5218. Support the new JPEG version 7 delegate library.
  5219. +
    2009-07-24 6.5.4-6 Alexander E. Patrakov <patrakov@gmail...>
    +
  5220. Incorrect use of setjmp in coders/png.c.
  5221. +
    2009-07-23 6.5.4-5 Cristy <quetzlzacatenango@image...>
    +
  5222. We broke -scene when we fixed the -dispose option. Try again.
  5223. +
    2009-07-21 6.5.4-4 Cristy <quetzlzacatenango@image...>
    +
  5224. Update autoconf support files.
  5225. +
  5226. More than one -dispose setting overwrote previous settings (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=14252).
  5227. +
  5228. Don't use JPEG's color reduction algorithm for less than 8 colors.
  5229. +
    2009-07-13 6.5.4-3 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5230. Final testing and bug fixes for all mathematical compose methods Including non-overlapping regions bugs found in in operators Divide, ColorDodge, VividLight. And the handling of transparency to follow standard 'Over' Blending in Divide. Only math methods not looked at are the addition methods Plus, Add, Minus, and Subtract, which do not follow normal 'Over' alpha blending behavior, for the purposes of mask handling.
  5231. +
    2009-07-12 6.5.4-3 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5232. Addition of user definable 'Mathematics' compose method -compose Mathematics -set option:compose:args A,B,C,D -composite Will implement the formula f(Sc,Dc) = A*Sc*Dc + B*Sc + C*Dc + D this lets you implement most smooth polynomial compose methods. (requested by Fred WienHaus)
  5233. +
    2009-07-11 6.5.4-3 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5234. Finished the recoding of Composite methods to allow easier debugging and faster access.
  5235. +
  5236. Added PegtopLight compose method as an alternative simpler Softlight alternative. See notes and comparison to SoftLight in... http://www.pegtop.net/delphi/articles/blendmodes/softlight.htm
  5237. +
  5238. From the notes on Photoshop blend modes at http://www.simplefilter.de/en/basics/mixmods.html Added extra composition modes: VividLight, PinLight, LinearBurn, LinearDodge NOTE: 'LinearBurn' the same as 'Plus' but with the normal 'Over' blending.
  5239. +
    2009-07-10 6.5.4-3 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5240. Re-coding of Composite methods HardLight, SoftLight, Overlay, LinearLight, ColorBurn, ColorDodge, Multiply, Screen to make it more readable, easier to debug, and directly comparable to SVG specifications.
  5241. +
  5242. Specifications changed for SoftLight, ColorBurn, ColorDodge Though only SoftLight changed to significantly.
  5243. +
  5244. However implementation errors were found for ColorBurn, LinearLight
  5245. +
    2009-07-01 6.5.4-3 Cristy <quetzlzacatenango@image...>
    +
  5246. Add -blue-shift option.
  5247. +
  5248. Add compression flag for each channel of a PSD layer.
  5249. +
  5250. Implement experimental forward and inverse Fourier transforms (contributed by Sean Burke and Fred Weinhaus). The -fft / -ifft option is not ready for prime time just yet.
  5251. +
  5252. Support -cdl (color decision list) option.
  5253. +
  5254. Don't process directories as filenames when using wildcard paths (i.e. logo[1]/png).
  5255. +
    2009-07-01 6.5.4-2 Cristy <quetzlzacatenango@image...>
    +
  5256. Can't bit shift a float.
  5257. +
    2009-06-25 6.5.4-1 Cristy <quetzlzacatenango@image...>
    +
  5258. Off by one error for multi-frame raw grayscale images.
  5259. +
  5260. Can't stat() a Zip or Bzip opaque structure.
  5261. +
  5262. DPX user bits are no longer truncated.
  5263. +
  5264. Return image colorspace for -format [%colorspace] option.
  5265. +
  5266. ThumbnailImage(): don't subsample if image is already thumbnail size.
  5267. +
    2009-06-23 6.5.4-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5268. Automatic determination of B from C and C from B for a 'Keys Filter' when using the B,C Cubic Filter Expert options was broken. See https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=14037
  5269. +
    2009-06-19 6.5.4-0 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5270. Added -compose 'Blur', variable blur mapping to CompositeImages Arguments X_scale x Y_scale + angle of the blurring ellipse.
  5271. +
  5272. Added "-blur" special compose option to "composite"
  5273. +
  5274. Cleanup of "composite" compose argument handling
  5275. +
    2009-06-18 6.5.3-10 Cristy <quetzlzacatenango@image...>
    +
  5276. Clone pixel cache when cloning image to prevent RMagick semaphore lock.
  5277. +
  5278. Set compare similarity image to NULL to prevent double free.
  5279. +
    2009-06-16 6.5.3-8 Cristy <quetzlzacatenango@image...>
    +
  5280. Set camera formats to require a seekable stream.
  5281. +
  5282. Do not let display program image window exceed the screen size.
  5283. +
    2009-06-14 6.5.3-7 Cristy <quetzlzacatenango@image...>
    +
  5284. Improve FITS keyword parser.
  5285. +
    2009-06-14 6.5.3-7 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5286. Cleanup of compose 'displace' of old useless code that is not used.
  5287. +
  5288. Implement a compose 'distort' mapping method, This is basically exactly like 'displace' but relative to a fixed point which may be user supplied as +X+Y
  5289. +
  5290. Default scaling to width/2 and height/2 of overlay (100% scale) with a distortion 'center' to the middle of the overlay image
  5291. +
  5292. If a '%' flag given scale displacement relative to image size
  5293. +
  5294. If a '!' flag given make scale and center relative to 'background' image instead of the overlay map.
  5295. +
  5296. If no 'height' scale given, use the X scale.
  5297. +
    2009-06-13 6.5.3-6 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5298. Fixed bug for compose methods, Hue, Saturate, Luminize
  5299. +
    2009-06-11 6.5.3-6 Cristy <quetzlzacatenango@image...>
    +
  5300. Report the correct transparent pixel values in the display program magnify windows.
  5301. +
  5302. Do not advance when finalizing image settings in the mogrify program.
  5303. +
    2009-06-11 6.5.3-5 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5304. Fixed "convert" to merge the third 'mask' image into the 'source' image for correct handling of 2 dimensional -compose "displace".
  5305. +
  5306. Fixed PerlMagick Composite() for the same thing.
  5307. +
  5308. Modified compose "Displace" so displacement image's alpha channel can be used to mask the transparency of the overlay area.
  5309. +
    2009-06-07 6.5.3-4 Cristy <quetzlzacatenango@image...>
    +
  5310. Added the HALD image Color LUT, and a no-op HALD: image generator. See Introduction at http://www.quelsolaar.com/technology/clut.html
  5311. +
    2009-06-07 6.5.3-4 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5312. Changed CompositeImageChannel() so that extra compose arguments are now passed in the ImageArtifact "compose:args". This can be assigned to images using -set "option:compose:args" 'args' where args are defined using 'geometry' style or 'comma separated numbers'.
  5313. +
  5314. Declared the special flag needed for Composite Tiling as the ImageArtifact "compose:outside-overlay".
  5315. +
  5316. Documentation update for CompositeImageChannel() in Core Library to reflect these changes.
  5317. +
  5318. Documentation update for DistortImage() in Core Library with the extra ImageArtifact controls it can use.
  5319. +
  5320. Bug correction in normalization of GetOptimalKernelWidth2D() of gem.c
  5321. +
    2009-06-06 6.5.3-3 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5322. Documentation update for CompositeImageChannel() in Core Library. This adds the information on how extra compose arguments needed for specific compose methods are actually passed to the library function. Compose methods such as Blend, Dissolve and Displace.
  5323. +
    2009-06-01 6.5.3-3 Priya Hariharan <priya.hariharan@globa...>
    +
  5324. The target profile in ProfileImage() is no longer accessed after it is freed.
  5325. +
    2009-06-01 6.5.3-1 Cristy <quetzlzacatenango@image...>
    +
  5326. Bug fix for -page.
  5327. +
    2009-05-31 6.5.3-1 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5328. Minor change to -function Arctan to make first argument match slope
  5329. +
    2009-05-29 6.5.3-0 Cristy <quetzlzacatenango@image...>
    +
  5330. Do not treat -page as a global option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13864).
  5331. +
    2009-05-28 6.5.2-10 Cristy <quetzlzacatenango@image...>
    +
  5332. Create thread set for pseudo-random number generator.
  5333. +
    2009-05-25 6.5.2-9 Cristy <quetzlzacatenango@image...>
    +
  5334. Do not change opacity value for the -alpha background option.
  5335. +
  5336. Rebuild automake / autoconf scripts.
  5337. +
    2009-05-23 6.5.2-8 Cristy <quetzlzacatenango@image...>
    +
  5338. Check for XMakeImage() integer overflow vulnerability (Secunia Advisory SA35216).
  5339. +
    2009-05-23 6.5.2-8 Cristy <quetzlzacatenango@image...>
    +
  5340. Permit reading a specific frame of a multi-page TIFF with blobs.
  5341. +
    2009-05-22 6.5.2-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5342. Added new -function methods Arcsin and Arctan
  5343. +
    2009-05-19 6.5.2-8 Glenn Randers-Pehrson <glennrp@image...>
    +
  5344. Fixed a regression with PNG8: format.
  5345. +
    2009-05-19 6.5.2-7 Cristy <quetzlzacatenango@image...>
    +
  5346. The -geometry option was improperly applied twice.
  5347. +
    2009-05-18 6.5.2-6 Richard Oehlinger <richard.oehlinger@celum...>
    +
  5348. Set image colorspace to YCbCrColorspace if JPEG color space is JCS_YCbCr.
  5349. +
    2009-05-14 6.5.2-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  5350. Updated help output and command-line options documentation to bring the -alpha options up to date with what's actually in the code.
  5351. +
    2009-05-13 6.5.2-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  5352. Change "depreciated" to "deprecated" in several files.
  5353. +
    2009-05-10 6.5.2-5 Cristy <quetzlzacatenango@image...>
    +
  5354. Change OpenMP schedule from dynamic to static for RenderFreeType().
  5355. +
  5356. Recognize unicode strings when computing caption word wrapping.
  5357. +
  5358. New -alpha background option to set fully-transparent pixels to the background color.
  5359. +
    2009-05-08 6.5.2-4 Cristy <quetzlzacatenango@image...>
    +
  5360. Combined layer of transparent PSD image was not being read properly.
  5361. +
    2009-05-06 6.5.2-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  5362. Progress on "-define png:bit-depth=value" and "-define png:color-type=value" It is now able to write an opaque black-and-white image in any of the 15 valid combinations of PNG color-type and bit-depth.
  5363. +
  5364. Fixed a regression with writing sub-8-bit grayscale PNGs.
  5365. +
    2009-05-06 6.5.2-2 Chris Madison <madisonblu@gmail...>
    +
  5366. Create 8-bit TIFF images if -depth is set to 8 and HDRI-enable ImageMagick.
  5367. +
    2009-05-04 6.5.2-1 Chris Madison <madisonblu@gmail...>
    +
  5368. Accept file lists on the command line (e.g. echo "rose: rose.png" | convert @- ...).
  5369. +
  5370. Duplicate line in tiff.c breaking read of zip compressed tif (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13688).
  5371. +
  5372. Support policies to permit or deny any coder, delegate, filter, or file path (see policy.xml).
  5373. +
    2009-05-02 6.5.2-0 Chris Madison <madisonblu@gmail...>
    +
  5374. The mogrify -crop option returns multiple images if an x/y offset is not specified (e.g. -crop 100x100).
  5375. +
  5376. Generate a proper file path for -path @filelist.txt (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=13671).
  5377. +
    2009-05-01 6.5.2-0 Glenn Randers-Pehrson <glennrp@image...>
    +
  5378. Accept "-define png:bit-depth=value" and "-define png:color-type=value" options. This is work-in-progress with the objective of being able to precisely specify the type of PNG file to be written. The previously-used internal attribute "png:bit-depth" that was used to communicate between the PNG writer and the JNG writer is changed to "png:bit-depth-written". This feature needs testing. It is important to note that this feature cannot be used to force the PNG to use a bit-depth or color-type that does not losslessly represent the image. You can, however, cause the writer to use a larger depth or to use the RGB colorspace when grayscale or indexed would have been sufficient.
  5379. +
    2009-05-01 6.5.1-10 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5380. Fixed the Rmin usage in Depolar and Polar distortions
  5381. +
  5382. The 6th argument (Ato) for Polar/Depolar is now optional and defaults to Afrom + 360 degrees (or a fill circle from the given start angle)
  5383. +
    2009-04-30 6.5.1-10 Cristy <quetzlzacatenango@image...>
    +
  5384. Do not return a black image for -channel RGBA -gaussian (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13669).
  5385. +
    2009-04-28 6.5.1-9 Cristy <quetzlzacatenango@image...>
    +
  5386. Fix 'conflicting types for Huffman2DEncodeImage' compile exception.
  5387. +
    2009-04-25 6.5.1-9 Cristy <quetzlzacatenango@image...>
    +
  5388. Generate BMP 32-bit ARGB format for images with transparency (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13633).
  5389. +
    2009-04-24 6.5.1-7 Cristy <quetzlzacatenango@image...>
    +
  5390. Grok 'image.psd[0]' and 'image.mpg[0]' (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=13609).
  5391. +
  5392. Normalize similarity based on reconstruction not the original (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13626).
  5393. +
  5394. Support multiple JPEG images encapsulated within DICOM.
  5395. +
    2009-04-23 6.5.1-6 Cristy <quetzlzacatenango@image...>
    +
  5396. Msys does not understand NAME_MAX.
  5397. +
    2009-04-22 6.5.1-5 Cristy <quetzlzacatenango@image...>
    +
  5398. Check for valid linked list before assigning next / previous pointers.
  5399. +
    2009-04-21 6.5.1-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  5400. Check error return from CompressColormapTransFirst() in coders/png.c
  5401. +
    2009-04-21 6.5.1-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  5402. Refrain from modifying image struct members (color, depth, matte) while writing PNG datastreams.
  5403. +
    2009-04-21 6.5.1-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  5404. Sometimes the PNG8: format would produce 1-, 2-, or 4-bit PNG datastreams. Now it always produces 8-bit datastreams as users probably expect.
  5405. +
    2009-04-21 6.5.1-4 Glenn Randers-Pehrson <glennrp@image...>
    +
  5406. Suppressed "shadowed declaration" warnings in coders/jpeg.c and coders/png.c that are triggered by "-Wshadow" gcc compiler flag.
  5407. +
    2009-04-17 6.5.1-3 Cristy <quetzlzacatenango@image...>
    +
  5408. The display program now returns a 0 exit code on success (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13579).
  5409. +
    2009-04-14 6.5.1-3 Glenn Randers-Pehrson <glennrp@image...>
    +
  5410. Folded some long lines and made other cosmetic changes.in coders/png.c
  5411. +
    2009-04-13 6.5.1-3 Cristy <quetzlzacatenango@image...>
    +
  5412. MVG autodetection failing (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=13542).
  5413. +
    2009-04-11 6.5.1-2 Cristy <quetzlzacatenango@image...>
    +
  5414. Image not properly placed when displaying to the X server root (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13532).
  5415. +
  5416. fmax() is not support on some platforms (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13533).
  5417. +
    2009-04-11 6.5.1-2 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5418. Rename existing "Bilinear" distortion as "BilinearReverse"
  5419. +
  5420. Added forward mapped bilinear distort as "BilinearForward"
  5421. +
  5422. The "Bilinear" distort is temporarily obsoleted but will eventually be added as a "BilinearReverse" and "BilinearForward" combination mapping though a unit square.
  5423. +
  5424. Sparse Gradient internally uses "BilinearReverse" for its "Bilinear" gradient function as that method is the direct use of such equations.
  5425. +
    2009-04-01 6.5.1-1 Cristy <quetzlzacatenango@image...>
    +
  5426. Default to min-is-white Photometric for fax / group4 compression (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13468).
  5427. +
  5428. Respect image resolution when setting PDF MediaBox (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=13350).
  5429. +
  5430. Add SimilarityImage() to return how similar one image is to another.
  5431. +
    2009-03-28 6.5.1-0 Cristy <quetzlzacatenango@image...>
    +
  5432. Graceful exit in djvu coder when EOF is thrown.
  5433. +
  5434. Support -unsharp option for the montage program.
  5435. +
    2009-03-28 6.5.0-10 Cristy <quetzlzacatenango@image...>
    +
  5436. Reduce deskew blurring: use AffineTransformImage() rather than RotateImage().
  5437. +
  5438. Unexpected end-of-file @ xwd.c/ReadXWDImage/252 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13430).
  5439. +
    2009-03-26 6.5.0-10 Markus Dahms <markus.dahms@progr...>
    +
  5440. Support for -density & -units options in PSD writer.
  5441. +
    2009-03-26 6.5.0-10 Samuel Thibault <samuel.thibault@ens-l...>
    +
  5442. Fix bug in the braille coder which makes it always segfault.
  5443. +
    2009-03-25 6.5.0-9 Cristy <quetzlzacatenango@image...>
    +
  5444. Enhance the compare program to locate a template image within a larger image.
  5445. +
  5446. Eliminate assertion when generating a PDF thumbnail.
  5447. +
    2009-03-25 6.5.0-8 Cristy <quetzlzacatenango@image...>
    +
  5448. Fix assertion in IntegralRotateImage (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13410).
  5449. +
    2009-03-24 6.5.0-7 Cristy <quetzlzacatenango@image...>
    +
  5450. Referenced counted blob incremented incorrectly in CloneImage() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13410).
  5451. +
    2009-03-23 6.5.0-6 Chris Madison <madisonblu@gmail...>
    +
  5452. Assertion failure reading PSD image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13397).
  5453. +
    2009-03-21 6.5.0-5 Chris Madison <madisonblu@gmail...>
    +
  5454. Change -selective-blur to use gaussian kernel.
  5455. +
    2009-03-21 6.5.0-4 ERB <entropy@xebec...>
    +
  5456. Missing locks in blob - race condition (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13385).
  5457. +
    2009-03-19 6.5.0-3 Chris Madison <madisonblu@gmail...>
    +
  5458. Use default SVG resolution unless resolution is explicitly set (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13373).
  5459. +
  5460. Add support for -selective-blur option.
  5461. +
    2009-03-19 6.5.0-3 ragesteel <iimagemagic-org-iapied0o@gt2.r...>
    +
  5462. ImageToBlob() no longer faults if Jasper compression is wrong (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13372).
  5463. +
    2009-03-19 6.5.0-3 ERB <entropy@xebec...>
    +
  5464. Check the 8BIM profile resource block length (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13368).
  5465. +
  5466. Unlocked read in DeleteNodeByValueFromSplayTree (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13370).
  5467. +
    2009-03-18 6.5.0-2 ERB <entropy@xebec...>
    +
  5468. Eliminate race condition when acquiring a wand (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13357).
  5469. +
  5470. Use of "localtime" in FormatMagickTime not thread-safe (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13358).
  5471. +
    2009-03-18 6.5.0-2 Cristy <quetzlzacatenango@image...>
    +
  5472. Fix the image compose operator at OverCompositeOP for shadows (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=13330).
  5473. +
    2009-03-14 6.5.0-1 Paul Smedley <paul@smedl...>
    +
  5474. Patches to get ImageMagick working under OS2.
  5475. +
    2009-03-10 6.5.0-1 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5476. Expansion of Virtual-Pixel (Cache) handling, to include corrected Mirror, plus addition of CheckerTile, HorizontalTileEdge and VerticalTileEdge
  5477. +
    2009-03-10 6.5.0-0 John Cupitt <jcupitt@gmail...>,
    +
  5478. Glenn Randers-Pehrson <glennrp@image...>
  5479. +
  5480. DICOM reader not handling signed pixels properly.
  5481. +
    2009-03-09 6.4.9-10 Alexander E. Patrakov <patrakov@gmail...>
    +
  5482. Don't call GetValueFromSplayTree() if image properties is NULL.
  5483. +
    2009-03-09 6.4.9-10 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5484. Fix minor size issue with bestfit +distort operation.
  5485. +
  5486. Enable listing of -distort Polynomial
  5487. +
  5488. Minor tweeks and center fixes for Polar/Depolar
  5489. +
    2009-03-01 6.4.9-9 Cristy <quetzlzacatenango@image...>
    +
  5490. Convert returns MagickFalse for the -version option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=13230).
  5491. +
  5492. Don't set pixel opacity unless the image alpha channel is active (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13189).
  5493. +
    2009-02-27 6.4.9-8 Anthony Thyssen <A.Thyssen@griffith...>
    +
  5494. Fix old -clut bug for re-coloring gray images using transparent and semi-transparent colors.
  5495. +
    2009-02-22 6.4.9-7 Rick Mabry <rick.mabry@anony...>
    +
  5496. Changes have been made to scores of the files that generate the documentation. The most noticeable cosmetic changes are to the command-line examples and command-line snippets, which now have a new look: dark blue boxes with white/yellow text to indicate sample input/output. Inclusion of current version and Release dates in appropriate places are now automatically generated. Also, many changes have been made to begin to bring the pages into strict W3C compliance with respect to both HTML and CSS.
  5497. +
    2009-02-21 6.4.9-7 Chris Madison <madisonblu@gmail...>
    +
  5498. The identify program reads the image pixels when the -format option is asking for image statistics.
  5499. +
  5500. Much improved ImageMagick validation suite (exercise with 'make check').
  5501. +
    2009-02-18 6.4.9-5 Jon <jon@brick...>
    +
  5502. Processing the arg list -tile is replaced by -sans0 which is 1 char longer and which overwrites the allocated area.
  5503. +
    2009-02-16 6.4.9-5 Chris Madison <madisonblu@gmail...>
    +
  5504. Add section to license to alert users to third-party licenses in the NOTICE file.
  5505. +
    2009-02-11 6.4.9-3 Anthony <A.Thyssen@griffith...>
    +
  5506. Replaced geometry string parsing using ParseGravityGeometry() in "composite" with more direct use of GravityAdjustGeometry();
  5507. +
    2009-02-10 6.4.9-3 Cristy <quetzlzacatenango@image...>
    +
  5508. Support file descriptors (e.g. convert image.jpg fd:3 ...).
  5509. +
  5510. The stream utility no longer go into an infinite loop (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=13102).
  5511. +
    2009-02-04 6.4.9-2 Cristy <quetzlzacatenango@image...>
    +
  5512. JPEG to PDF was not always reversible (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13020).
  5513. +
    2009-01-30 6.4.9-0 Cristy <quetzlzacatenango@image...>
    +
  5514. Stroking when annotating failed for stroke widths > 2 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=13009).
  5515. +
    2009-01-24 6.4.8-10 Cristy <quetzlzacatenango@image...>
    +
  5516. TransformImageColorspace() returns GRAYColorspace when set (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12990).
  5517. +
  5518. Don;t assume CMYK unless document process colors include Cyan, Magenta, or Yellow.
  5519. +
    2009-01-23 6.4.8-9 Cristy <quetzlzacatenango@image...>
    +
  5520. Increase random angle range for +polaroid from -7..7 to -15..15 degrees.
  5521. +
    2009-01-22 6.4.8-8 Anthony <A.Thyssen@griffith...>
    +
  5522. Fixed a -evaluate AddModulus 'patch' for correct 'negative' handling
  5523. +
    2009-01-20 6.4.8-7 Cristy <quetzlzacatenango@image...>
    +
  5524. Removed previous patches for -shear directions.
  5525. +
    2009-01-20 6.4.8-8 Thomas Stegemann <Thomas.Stegemann@mater...>
    +
  5526. SVG with resolutions other than 72.0 dpi, text is no longer transformed twice.
  5527. +
    2009-01-20 6.4.8-8 Anthony <A.Thyssen@griffith...>
    +
  5528. Renamed -evaluate methods 'sin' and 'cos' to math C math library names
  5529. +
  5530. Added "-function polynomial a,b,c,...." Eg: a*x^2 + b*x + c
  5531. +
  5532. Added "-function sinusoid freq,phase,amplitude,bias (all optional)
  5533. +
    2009-01-18 6.4.8-7 Anthony <A.Thyssen@griffith...>
    +
  5534. Removed "annotate" patches, which causes no end of problems. Original coding worked perfectly fine. Annotate isn't part of SVG!
  5535. +
    2009-01-18 6.4.8-7 Cristy <quetzlzacatenango@image...>
    +
  5536. Respect mouse wheel movements for display program (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=12938).
  5537. +
  5538. Grab button in Display Open menu now works consistently (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12942).
  5539. +
  5540. Patch for problem with opacity in MVG (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12946).
  5541. +
    2009-01-14 6.4.8-6 Cristy <quetzlzacatenango@image...>
    +
  5542. Don't accept discontinuous shear angles for the -annotate option. -- REMOVED
  5543. +
    2009-01-14 6.4.8-6 Mark Freeman <mark.freeman@porci...>
    +
  5544. Apply patch so ImageMagick compiles with Visual Studio 6.
  5545. +
    2009-01-12 6.4.8-5 Alexander E. Patrakov <patrakov@gmail...>
    +
  5546. Fix small memory leak on truncated PNG images.
  5547. +
  5548. Do not allocate pixels when pinging a PNG image.
  5549. +
    2009-01-11 6.4.8-6 Chris Madison <madisonblu@gmail...>
    +
  5550. Set the stroke opacity for "opacity" SVG element (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10594).
  5551. +
    2009-01-10 6.4.8-5 Matthew Litwin <mlitwin@sonic...>
    +
  5552. Convert to windows .ico format no longer inverts alpha channel.
  5553. +
    2009-01-10 6.4.8-5 Cristy <quetzlzacatenango@image...>
    +
  5554. Interpret geometry correctly for negative angles (-shear 30x-10).
  5555. +
    2009-01-08 6.4.8-4 Eberhard Mattes <eberhard.mattes@web.d...>
    +
  5556. Fix GetMagickToken() to accept locales that use "," as radix character.
  5557. +
    2009-01-08 6.4.8-4 Anthony <A.Thyssen@griffith...>
    +
  5558. Add (and Fix) -evaluate methods Sine, Cosine, AddModulus
  5559. +
    2009-01-05 6.4.8-4 Rick Mabry <rick.mabry@anony...>
    +
  5560. Check for negative offsets (bevel widths) for the -frame option.
  5561. +
    2009-01-04 6.4.8-4 Alexander E. Patrakov <patrakov@gmail...>
    +
  5562. Patch for a memory leak and a logical bug in coders/gif.c.
  5563. +
  5564. CopyMagickString() now returns the minimum of the source string length or the length parameter.
  5565. +
  5566. Properly set alpha channel in PNGs with palette and tRNS.
  5567. +
    2009-01-01 6.4.8-4 Cristy <quetzlzacatenango@image...>
    +
  5568. Support %[] embedded filename tag (e.g. convert rose: -set area "%wx%h" 'rose-%[area].png').
  5569. +
  5570. Do not set the fill element when 'opacity' is set (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10594).
  5571. +
  5572. Restore support for decoding the DVI format.
  5573. +
  5574. Add perl and math lib reference to PerlMagick Makefile (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12840).
  5575. +
  5576. Fix crash on invalid JPEG XML profile.
  5577. +
  5578. Export libtool symbols in MagickCore.sym and MagickWand.sym.
  5579. +
  5580. Support sine and cosine as arguments to the -evaluate option.
  5581. +
    2008-12-31 6.4.8-4 Amartyo Banerjee" <amartyo@gmail...>
    +
  5582. Calculate the kurtosis and skewness of image channels (reference http://amartyosscrapbook.blogspot.com/2008/12/formulas-used-to-calculate-kurtosis-and.html).
  5583. +
    2008-12-28 6.4.8-4 Rick Mabry <rick.mabry@anony...>
    +
  5584. Patch magick/display.c and PerlMagick/ContrastStretchImage() to return the same results as the -contrast-stretch option.
  5585. +
  5586. ContrastStretchImageChannel() no longer interpreted as Contast() by MogrifyRegion() in PerlMagick.
  5587. +
    2008-12-28 6.4.8-3 Rick Mabry <rick.mabry@anony...>
    +
  5588. Reverse argument and option in Throw*InvalidArgumentException() macro for proper exception message.
  5589. +
  5590. Recognize negative geometries for -shear and -annotate (.e.g. 45x-30).
  5591. +
  5592. Fix Y shear angle for -shear option.
  5593. +
    2008-12-26 6.4.8-2 Cristy <quetzlzacatenango@image...>
    +
  5594. Use GetImageArtifact() to retrieve -attenuate option value for +noise.
  5595. +
  5596. Support reading FITS test files (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12799).
  5597. +
  5598. Replace input.ttf with the public domain Tuffy.ttf font.
  5599. +
  5600. MagickNewImage() no longer faults when parameters are incorrect (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12817).
  5601. +
  5602. Allocate strings returned by XGetResourceInstance() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12818).
  5603. +
  5604. The -append gravity is relative to the container (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=12821).
  5605. +
    2008-12-19 6.4.8-1 Cristy <quetzlzacatenango@image...>
    +
  5606. Reference cache rather than acquiring when cloning an image.
  5607. +
    2008-12-19 6.4.8-0 Cashish Kulkarni <ashkulz@redif...>
    +
  5608. Cross-compilation failure using MinGW on Linux for ImageMagick trunk
  5609. +
    2008-12-19 6.4.8-0 Cristy <quetzlzacatenango@image...>
    +
  5610. Add -interword-spacing option to convert.
  5611. +
  5612. Initialize the black channel when testing the CMY colorspace (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12685).
  5613. +
  5614. remove calls to exit() in MagickWand (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=12772).
  5615. +
  5616. Validate -affine arguments.
  5617. +
  5618. Accept -attenuate as an option for convert.
  5619. +
  5620. Properly create RGBA image if colormapped image has transparency.
  5621. +
  5622. Support X11 geometry like this: +-4+-4; weird but X11 supports it.
  5623. +
    2008-12-17 6.4.7-10 Chris Madison <madisonblu@gmail...>
    +
  5624. Fix off-by-one problem with -shear.
  5625. +
  5626. Clone pixel cache method when cloning an image.
  5627. +
    2008-12-16 6.4.7-9 Anthony <A.Thyssen@griffith...>
    +
  5628. Make "-layers Coalesce" work as it should.
  5629. +
    2008-12-16 6.4.7-9 Sam Fisher <fisher@image...?
    +
  5630. Support > 2GB TIFF under Windows.
  5631. +
    2008-12-12 6.4.7-8 mootools <help@mooto...>
    +
  5632. FormatMagickTime() checks to ensure the provided time is valid.
  5633. +
    2008-12-12 6.4.7-8 Cristy <quetzlzacatenango@image...>
    +
  5634. Add -kerning option to convert.
  5635. +
  5636. Remove halo effect for the -scale option.
  5637. +
    2008-12-11 6.4.7-7 Alan Wright <alanwright.atex@google...>
    +
  5638. Fix a 1 byte overrun in Postscript coder.
  5639. +
    2008-12-10 6.4.7-6 Cristy <quetzlzacatenango@image...>
    +
  5640. Fix small memory leak in ExpandFilenames().
  5641. +
    2008-12-09 6.4.7-5 Cristy <quetzlzacatenango@image...>
    +
  5642. Fix small memory leak in LoadLocaleList().
  5643. +
  5644. Fix small memory leak in GetProfilesFromResourceBlock().
  5645. +
  5646. Don't forget to scale grayscale values when quantum min-is-white is set.
  5647. +
    2008-12-08 6.4.7-4 Cristy <quetzlzacatenango@image...>
    +
  5648. Include delegate libraries in MagickCore-config script.
  5649. +
    2008-12-07 6.4.7-3 Cristy <quetzlzacatenango@image...>
    +
  5650. Fix off-by-one error for -chop 0x50%.
  5651. +
  5652. Performance improvement bilinear interpolation.
  5653. +
    2008-12-06 6.4.7-2 Cristy <quetzlzacatenango@image...>
    +
  5654. Support absolute paths in the include directive within a configuration file.
  5655. +
    2008-12-05 6.4.7-1 Chris Madison <madisonblu@gmail...>
    +
  5656. Assume Log colorspace if DPX transfer is LogarithmicColorimetric.
  5657. +
  5658. Another attempt at properly extracting the IPTC profile from a 8BIM resource block.
  5659. +
    2008-12-04 6.4.7-1 Anthony <A.Thyssen@griffith...>
    +
  5660. AppendImage() re-written to respect gravity properly! Routine simplified to a single loop for both styles of append
  5661. +
    2008-12-03 6.4.6-9 Cristy <quetzlzacatenango@image...>
    +
  5662. AppendImage() respects gravity.
  5663. +
  5664. Protect against circular image list when cropping.
  5665. +
  5666. The index variable must be long rather than unsigned long for the DCM coder.
  5667. +
    2008-12-02 6.4.6-9 Cristy <quetzlzacatenango@image...>
    +
  5668. Use ScaleQuantumToMap() to prevent fault in SetGrayscaleImage() when quantum depth is 32.
  5669. +
    2008-12-01 6.4.6-8 Cristy <quetzlzacatenango@image...>
    +
  5670. Global replaced accidentally renamed MagickGetImagePixelColor().
  5671. +
    2008-11-29 6.4.6-6 Cristy <quetzlzacatenango@image...>
    +
  5672. Fixed transient bug in the -white-threshold option.
  5673. +
  5674. -extent x256+100+100 no longer returns an exception (reference https://imagemagick.org/discourse-server//viewtopic.html?f=7&t=12583).
  5675. +
    2008-11-27 6.4.6-5 Cristy <quetzlzacatenango@image...>
    +
  5676. TIFF pad is relative to bits-per-sample (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=12563).
  5677. +
    2008-11-27 6.4.6-5 Koshiji Masayuki <kosiji.masayuki@da.mi...>
    +
  5678. Support GBR raw image files.
  5679. +
    2008-11-26 6.4.6-4 Cristy <quetzlzacatenango@image...>
    +
  5680. DPX 10 bit YUV 4:2:2 are now processed properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=12443).
  5681. +
  5682. Default PDF compression to that of the image unless overwritten by the -compress option.
  5683. +
    2008-11-25 6.4.6-3 Cristy <quetzlzacatenango@image...>
    +
  5684. Numerous pixel cache improvements including embedded support for OpenMP in a transparent manner.
  5685. +
    2008-11-20 6.4.6-2 Cristy <quetzlzacatenango@image...>
    +
  5686. Transient bug in encipher / decipher operation (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12540).
  5687. +
    2008-11-14 6.4.6-1 Cristy <quetzlzacatenango@image...>
    +
  5688. MPC image files working again.
  5689. +
  5690. coders/wmf.c/lite_font_stringwidth() returns string width (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12528).
  5691. +
    2008-11-10 6.4.6-0 Cristy <quetzlzacatenango@image...>
    +
  5692. Fix temporary file leak.
  5693. +
    2008-11-18 6.4.5-9 Koshiji Masayuki <kosiji.masayuki@da.mi...>
    +
  5694. Fix bug for RGBO image @ line, plane and partition interlace.
  5695. +
    2008-11-18 6.4.5-9 Chris Madison <madisonblu@gmail...>
    +
  5696. Deprecate pixel methods: AcquireImagePixels(), GetImagePixels(), etc.
  5697. +
  5698. New pixel methods: GetVirtualPixels(), GetAuthenticPixels(), etc.
  5699. +
    2008-11-15 6.4.5-7 Alexander E. Patrakov <patrakov@gmail...>
    +
  5700. GPS and multivalued EXIF properties support
  5701. +
    2008-11-14 6.4.5-6 Manish Aggarwal <manish@circu...>
    +
  5702. Add TransparentPaintImageChroma() to MagickCore and transparentChroma() to Magick++.
  5703. +
    2008-11-10 6.4.5-6 Cristy <quetzlzacatenango@image...>
    +
  5704. Correct DPX frame position property label (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12440).
  5705. +
  5706. Textures are no longer painted as the background color.
  5707. +
  5708. Update both fields of an EXIF resolution.
  5709. +
  5710. Support query-font-metrics MSL tag.
  5711. +
    2008-11-01 6.4.5-4 Cristy <quetzlzacatenango@image...>
    +
  5712. Do not set image colorspace for the MSL modulate tag.
  5713. +
    2008-11-01 6.4.5-3 Cristy <quetzlzacatenango@image...>
    +
  5714. Off by one error when computing affine in DrawAffineImage() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12391.
  5715. +
    2008-10-30 6.4.5-2 Cristy <quetzlzacatenango@image...>
    +
  5716. Fixed local adaptive thresholding when using an offset (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12371.
  5717. +
  5718. Set SetImagePixels() rather than SyncImagePixelCache() to update the pixel cache morphology.
  5719. +
    2008-10-26 6.4.5-1 Cristy <quetzlzacatenango@image...>
    +
  5720. Set explicit image format for BlobToImage() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=12340).
  5721. +
  5722. p_thread_t is an aggregate under MinGW.
  5723. +
    2008-10-20 6.4.5-0 Cristy <quetzlzacatenango@image...>
    +
  5724. pthread_t can be aggregate so stop treating it like its atomic.
  5725. +
  5726. default the WPG image size to 1 top avoid "no pixels defined in cache" exceptions.
  5727. +
    2008-10-17 6.4.4-8 Anthony <A.Thyssen@griffith...>
    +
  5728. slight modification of the added "radial-gradient:" image generator so the radius goes to an edge rather than the corner, allowing more user control based on image size.
  5729. +
  5730. fix -raise N to mean -raise NxN
  5731. +
    2008-10-15 6.4.4-8 Cristy <quetzlzacatenango@image...>
    +
  5732. Add support for inline images.
  5733. +
    2008-10-10 6.4.4-7 Cristy <quetzlzacatenango@image...>
    +
  5734. MinGW supports both Posix threads and Windows critical sections.
  5735. +
    2008-10-06 6.4.4-5 Cristy <quetzlzacatenango@image...>
    +
  5736. pthread_self() can be an aggregate value.
  5737. +
  5738. Scale pixel quantum to match PNG tRNS range (i.e. 0-255).
  5739. +
    2008-10-06 6.4.4-3 Cristy <quetzlzacatenango@image...>
    +
  5740. Set sentinel byte for MVG coder.
  5741. +
  5742. fx:standard_deviation returns standard deviation now instead of mean.
  5743. +
    2008-10-01 6.4.4-1 Florent Monnier <monnier.florent@gmail...>
    +
  5744. Support radial gradients in DrawGradientImage().
  5745. +
    2008-09-26 6.4.4-1 Cristy <quetzlzacatenango@image...>
    +
  5746. Fix memory leak when XMP profile is corrupt.
  5747. +
  5748. Support filename references (e.g. convert image-%d.jpg[1-5] ...).
  5749. +
    2008-09-25 6.4.4-0 Cristy <quetzlzacatenango@image...>
    +
  5750. Use -remap rather than -affinity.
  5751. +
  5752. Don't unregister a module for an image coder signature exception.
  5753. +
  5754. Don't assume a monochrome image is colormapped.
  5755. +
    2008-09-25 6.4.4-0 Anthony <A.Thyssen@griffith...>
    +
  5756. Attempt to fix three image "composite -displace" while also allowing use of separate X, Y grayscale displacement maps, or a merged X=red Y=green (later transparency mask will also be added) as discussed in IM Examples, 'distortion maps', but for -displace.
  5757. +
    2008-09-24 6.4.3-10 Cristy <quetzlzacatenango@image...>
    +
  5758. Fix pixel cache race condition.
  5759. +
    2008-09-23 6.4.3-10 Cristy <quetzlzacatenango@image...>
    +
  5760. Fixed an OTB coder bug (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12119).
  5761. +
    2008-09-23 6.4.3-8 Peter Fales <psfales@alcat...>
    +
  5762. Add NULL terminator to options list to in MontageImageCommand().
  5763. +
    2008-09-23 6.4.3-8 Anthony <A.Thyssen@griffith...>
    +
  5764. Added -layers TrimBounds which will adjust the offsets and canvas bounds to fit the current sequence of layered/animated images. The images themselves are not modified only the 'page' meta-data. As a side-effect all offsets will become positive, with a minimal canvas width/height.
  5765. +
    2008-09-22 6.4.3-8 Cristy <quetzlzacatenango@image...>
    +
  5766. Define _FILE_OFFSET_BITS from MAGICKCORE_FILE_OFFSET_BITS.
  5767. +
    2008-09-10 6.4.3-7 Anthony <A.Thyssen@griffith...>
    +
  5768. String Memory leak from InterpretImageProperties() in "annotate" for Command line handling in mogrify.c
  5769. +
  5770. Allow percent escapes in both -sparse-color and -distort argument strings.
  5771. +
  5772. Fix -alpha to allow Set, Copy, and Extract from command line
  5773. +
  5774. Fix -alpha Set so it only clears the alpha when it was previously off
  5775. +
  5776. Changed 'AllChannels' to be just the 'real' channels (including K).
  5777. +
  5778. Special handling if +level-colors is given one color, and no separator.
  5779. +
  5780. Fix 'matte' flag in DisposeImages() (for -layer dispose)
  5781. +
    2008-09-01 6.4.3-7 Cristy <quetzlzacatenango@image...>
    +
  5782. Fix -interpolate / -compose settings.
  5783. +
  5784. No need to specify -endian for native floating point format.
  5785. +
  5786. Remove small memory leak when cloning image properties (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11981).
  5787. +
  5788. The scan delegate requires a device name, not a symbolic link.
  5789. +
  5790. Report alpha instead of opacity for the TXT image format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12002).
  5791. +
  5792. Add channel support to -motion-blur.
  5793. +
  5794. Set the SVG affine matrix *before* we compute the scale (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12030).
  5795. +
  5796. Rely on 'omp critical' in the rare case where OpenMP is enabled but ImageMagick distribution is built without thread support.
  5797. +
  5798. Return the correct number of unique colors for colormapped image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12055).
  5799. +
  5800. SVG depends on MagickWand for parallel make (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=12099).
  5801. +
    2008-09-02 6.4.3-7
    +
  5802. Addition of 'BarrelInverse' Distortion
  5803. +
    2008-08-27 6.4.3-6 Cristy <quetzlzacatenango@image...>
    +
  5804. Extract / embed namespace for JPEG XMP profiles (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11832).
  5805. +
  5806. Deprecate -map and replace with -affinity which supports dither methods.
  5807. +
  5808. Set image depth when -depth is fired.
  5809. +
  5810. Fix small memory leak in TIFF coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11968).
  5811. +
    2008-08-24 6.4.3-5 Cristy <quetzlzacatenango@image...>
    +
  5812. Parallelize the colorspace transforms.
  5813. +
  5814. Honor gravity for -extent option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11944).
  5815. +
    2008-08-22 6.4.3-3 Cristy <quetzlzacatenango@image...>
    +
  5816. Fixed a memory leak in the TransparentPaintImage() method.
  5817. +
    2008-08-20 6.4.3-2 Cristy <quetzlzacatenango@image...>
    +
  5818. Treat -compose as a setting.
  5819. +
  5820. Check for depth == 0 in GetQuantumScale() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11921).
  5821. +
  5822. Fix CIN coder scanline length (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11922).
  5823. +
    2008-08-20 6.4.3-1 Cristy <quetzlzacatenango@image...>
    +
  5824. Add $(MAGICKWAND_LIBS) dependency to the PerlMagick Makefile (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11908).
  5825. +
  5826. Fix configure script to configure the JBIG delegate library (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11907).
  5827. +
  5828. Error in indexed PNG output if number of colors <= 16 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11905).
  5829. +
    2008-08-18 6.4.3-0 Cristy <quetzlzacatenango@image...>
    +
  5830. Always reinterpret %[fx:] properties.
  5831. +
  5832. Composite based on the composite image compose operator.
  5833. +
    2008-08-14 6.4.2-10 Cristy <quetzlzacatenango@image...>
    +
  5834. Add --coder-path and --filter-path options to MagickCore-config to support the Magick Coder and Image Filter kits.
  5835. +
    2008-08-17 6.4.2-9 Anthony <anthony@griffith...>
    +
  5836. -sparse-color option completed with initial set of methods.
  5837. +
  5838. -distort Barrel arguments expanded.
  5839. +
    2008-08-14 6.4.2-9 Cristy <quetzlzacatenango@image...>
    +
  5840. The -draw option no longer returns an error when for # like .6 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11879).
  5841. +
    2008-08-14 6.4.2-9 Cristy <quetzlzacatenango@image...>
    +
  5842. New dithering selection option, -dither Floyd-Steinberg or -dither Riemersma.
  5843. +
    2008-08-10 6.4.2-8 Anthony <anthony@griffith...>
    +
  5844. Added new distort "Polar" and "DePolar" due to Forum Discussions
  5845. +
    2008-08-07 6.4.2-8 Cristy <quetzlzacatenango@image...>
    +
  5846. Change MPEG delegate from mpeg2decode/mpeg2encode to ffmpeg (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11827).
  5847. +
  5848. Extract embedded XMP and EXIF profiles froma Photoshop resource block.
  5849. +
  5850. Support -compose option in the compare program.
  5851. +
    2008-08-04 6.4.2-7 Cristy <quetzlzacatenango@image...>
    +
  5852. Support -fx scientific-notation (e.g. '2.0*3.81469e-06').
  5853. +
  5854. Substitute DistortImage() with 'AffineProjectionDistortion' for the older DrawAffineImage() in AffineTransformImage().
  5855. +
  5856. Apply Sam Hocevar's patch to replace Hilbert-Peano curve dithering with Floyd Steinberg.
  5857. +
  5858. Added -virtual-pixel method VerticalTile as a complement to HorizontalTile
  5859. +
    2008-08-02 6.4.2-6 Anthony <anthony@griffith...>
    +
  5860. Added -virtual-pixel method HorizontalTile suitable for generating 360 degree Arcs and Polar Distorts.
  5861. +
    2008-07-31 6.4.2-6 Cristy <quetzlzacatenango@image...>
    +
  5862. Patch -fx to properly recognize maxima and minima.
  5863. +
  5864. Add channel specifier to -fx depth, mean, maxima, minima, and standard_deviation (e.g. depth.r).
  5865. +
  5866. Properly append .magick to the USERPROFILES path (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11806).
  5867. +
    2008-07-30 6.4.2-6 Anthony <anthony@griffith...>
    +
  5868. Added a "-set option:distort:scale" which scales the output 'view' by the amount given. This is directly useful for doing 'super-sampled' distorts, just set this, the scale the result back to a normal size.
  5869. +
    2008-07-27 6.4.2-5 Anthony <anthony@griffith...>
    +
  5870. Rewrite on coefficient handling for DistortImages so allow for generation by other operators (SparseColor), and addition of verbose output of equivalent -fx functions for DistortImages to report of the internal coefficients that was calculated, and who they are used.
  5871. +
  5872. Initial implementation of SparseColor for interpolated gradients from sparsely separated points of color (or possibly other forms of arguments)
  5873. +
  5874. New distortion Barrel as defined by Helmut Dersch options A,B,C,D on his web page http://www.all-in-one.ee/~dersch/barrel/barrel.html And as developed by Fred WeinHaus in his PinBarrel script
  5875. +
    2008-07-20 6.4.2-5 Cristy <quetzlzacatenango@image...>
    +
  5876. Certain corrupt GIF images no longer hang (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11723).
  5877. +
  5878. Read more than one image (if they exist) from DJVU image files.
  5879. +
  5880. Don't set image depth in histogram coder (references https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11752).
  5881. +
    2008-07-17 6.4.2-4 Cristy <quetzlzacatenango@image...>
    +
  5882. Fixed cache nexus threading problem to avoid spurious assertions when calling the DistortImage() method.
  5883. +
    2008-07-17 6.4.2-4 Anthony <anthony@griffith...>
    +
  5884. New distortion Shepards which provide semi-localized distorts of control points within an image, as first developed for IM by Frew Weinhaus in his ShapeMorph script. http://www.fmwconcepts.com/imagemagick/shapemorph/ It's almost like taffy pulling!
  5885. +
    2008-07-12 6.4.2-2 Anthony <anthony@griffith...>
    +
  5886. Separate coefficient calculation from DistortImages (future development)
  5887. +
  5888. Perspective and Bilinear Distortions fallback to Affine when less than 4 point pairs are provided.
  5889. +
  5890. Affine Distortion now handles 2 point pairs (SRT of a single line) and a simple translation if only a single point pair is provided.
  5891. +
  5892. Added 'verbose' output of some of the distortion equations generated
  5893. +
  5894. Initial addition of polynomal distortion (incomplete - not working yet)
  5895. +
    2008-06-29 6.4.2-2 Cristy <quetzlzacatenango@image...>
    +
  5896. Add log2 and round as -fx operators.
  5897. +
  5898. Add log and round as -evaluate operator.
  5899. +
  5900. Add -deskew option to straighten an image.
  5901. +
    2008-06-22 6.4.2-1 Cristy <quetzlzacatenango@image...>
    +
  5902. Use the source image interpolation method when drawing an affine image.
  5903. +
    2008-06-24 6.4.2-1 Anthony <anthony@griffith...>
    +
  5904. Added new operator +/-level-colors which will 'level' images based on colors to use for the black and white points. This lets to adjust the image in terms of mapping the given colors from/to black and white respectively.
  5905. +
    2008-06-23 6.4.2-0 Christian Lackas <christian@lacka...>
    +
  5906. Fix a problem with calling mpeg2encode with parameters (%o/%i) in wrong order.
  5907. +
    2008-06-22 6.4.2-0 Cristy <quetzlzacatenango@image...>
    +
  5908. Refactor additional ImageMagick algorithms for OpenMP support.
  5909. +
    2008-06-25 6.4.1-9 Cristy <quetzlzacatenango@image...>
    +
  5910. Add pow as an -evaluate operation, using normalized values
  5911. +
    2008-06-18 6.4.1-9 Anthony <anthony@griffith...>
    +
  5912. Added a LevelizeImageChannels() which is similar to LevelImageChannels() Function maps black and white values to the given level values. Rather than mapping the given level values to black and white. Basically a 'reverse-level' function, with different input args.
  5913. +
  5914. Set +level or a '!' flag in -level or LevelImage() to call the new 'reverse-level' function LevelizeImageChannels().
  5915. +
  5916. More work on IsMagickColorSimilar() to fix relationship between transparent-black and opaque-black, which was matched as 'similar'. Also attempts to fix 'K' channel handling for CMYK colorspace. More work on this to come.
  5917. +
    2008-06-25 6.4.1-9 Cristy <quetzlzacatenango@image...>
    +
  5918. The TXT format correctly reports alpha channel (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11478).
  5919. +
  5920. MONOTCHROME1 Dicom images are not longer inverted (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11492).
  5921. +
    2008-06-13 6.4.1-8 Anthony <anthony@griffith...>
    +
  5922. Fixed IsMagickColorSimilar() as used by -opaque and -transparent so as to understand that the Hue Channel is cyclic by nature
  5923. +
    2008-06-08 6.4.1-8 Cristy <quetzlzacatenango@image...>
    +
  5924. The -sketch option is working again (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11454).
  5925. +
    2008-06-08 6.4.1-7 Cristy <quetzlzacatenango@image...>
    +
  5926. More algorithms refactored to support a threaded cache view.
  5927. +
  5928. EPS2 output only 1/3 of image when using LZW or rle compress (reference https://imagemagick.org/discourse-server//viewforum.html?f=3).
  5929. +
  5930. ISO C++ 1998 does not support 'long long' (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11405).
  5931. +
  5932. Patch GetMagickMemoryHandlers() to return the properly return the memory handler addresses.
  5933. +
  5934. Generate histogram comment if # unique colors exceed 1024 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11434).
  5935. +
    2008-06-03 6.4.1-6 Marton Bokor <marton.bokor@gfthu....>
    +
  5936. Reading EMF files containing non-ascii characters no longer fails for UTF8 encoded paths on Windows XP.
  5937. +
    2008-06-03 6.4.1-6 Cristy <quetzlzacatenango@image...>
    +
  5938. The -colorspace option is an operator, not a setting.
  5939. +
    2008-05-31 6.4.1-5 rsnel <rik@snel....>
    +
  5940. gif.c misreads Gifs in which LZW codes are split across three datablocks.
  5941. +
    2008-05-31 6.4.1-4 Matthew Clark <mclark@gorge...>
    +
  5942. Patches to the JPEG and DCM coders to fix a few problems reading certain DCM image types.
  5943. +
    2008-05-15 6.4.1-4 Cristy <quetzlzacatenango@image...>
    +
  5944. Interpreting the -set option is no longer delayed.
  5945. +
  5946. Add AcquireCacheViews() and DestroyCachewViews() to the API.
  5947. +
  5948. Call DrawAffineImage() instead of CompositeImage() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11288).
  5949. +
  5950. Throw exception for TIFF compression not support (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11289).
  5951. +
  5952. The +opaque option now recognizes its required argument (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11298).
  5953. +
  5954. The -background and -virtual-pixel settings are now applied correctly across parenthesis.
  5955. +
  5956. Only reset the exception signature if the relinquish memory is MagickTrue.
  5957. +
  5958. Correct recolor equation for computing opacity (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11346).
  5959. +
  5960. Set midpoint when scaling JP2 images.
  5961. +
  5962. Semaphores must be passed by reference when destroyed for reliable thread locks.
  5963. +
  5964. Updated Matlab coder (thanks to Jaroslav Fojtik).
  5965. +
    2008-05-13 6.4.1-3 Cristy <quetzlzacatenango@image...>
    +
  5966. MagickGetResource(): resources are MagickSizeType not unsigned long.
  5967. +
    2008-05-11 6.4.1-2 Cristy <quetzlzacatenango@image...>
    +
  5968. Import: properly handle a hierarchy of subwindows under X11.
  5969. +
  5970. Refactor quantum pixel processor to improve ease of use and speed.
  5971. +
    2008-05-09 6.4.1-2 Leonardo de Paula Rosa Piga <lpiga@terra...>
    +
  5972. OpenMP patch for sepia-tone effect.
  5973. +
    2008-05-08 6.4.1-2 Bruno Cardoso Lopes <bruno.cardoso@gmail...>
    +
  5974. OpenMP patch for NormalizeImage() & TintImage()
  5975. +
    2008-05-06 6.4.1-2 <cristiannomartins@gmail...>
    +
  5976. OpenMP patch for GetImageChannelDepth().
  5977. +
  5978. Set depth to 32 when saving MIFF HDRI image files.
  5979. +
    2008-05-05 6.4.1-2 <joao.vita@gmail...>
    +
  5980. OpenMP patch for OilPaintImage Function
  5981. +
    2008-05-05 6.4.1-2 Sean Patrick Burke <seanburk@gmail...>
    +
  5982. Update IPLab coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=11200).
  5983. +
    2008-05-02 6.4.1-1 Cristy <quetzlzacatenango@image...>
    +
  5984. Return correct result for -fx luminence.
  5985. +
  5986. Restore missing break so that PGM images remain PGM.
  5987. +
  5988. Speed up the processing of ASCII PNM files.
  5989. +
  5990. Return the correct number of MNG images for PingImage().
  5991. +
    2008-05-01 6.4.1-0 Cristy <quetzlzacatenango@image...>
    +
  5992. Remove C++ style comments from source.
  5993. +
  5994. Center motion blur kernel.
  5995. +
  5996. Reenable dithering for -monochrome option.
  5997. +
    2008-04-24 6.4.0-11 Cristy <quetzlzacatenango@image...>
    +
  5998. For color reduction, use maximum tree depth if image has 1024 or less unique colors.
  5999. +
  6000. Use a uniform convolution filter for motion blur (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11122).
  6001. +
  6002. Add 'mean' and 'std' symbols to the Fx expression parser.
  6003. +
    2008-04-20 6.4.0-10 Chris Madison <madisonblu@hotma...>
    +
  6004. Updated to the latest autoconf/automake/libtool scripts.
  6005. +
  6006. Default to HSL colorspace when modulating (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=11073).
  6007. +
  6008. The -regard-warnings option properly returns a program status of 1 if and only if a warning or error exception is thrown.
  6009. +
  6010. Report 'no clip path defined' exception for -clip-path option (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11098).
  6011. +
    2008-04-16 6.4.0-8 Cristy <quetzlzacatenango@image...>
    +
  6012. Distinguish between pre and post processing of image list options.
  6013. +
  6014. Return MagickTrue if InvokeDynamicImageFilter() does not generate an exception (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=11065).
  6015. +
    2008-04-16 6.4.0-7 Glenn Randers-Pehrson <glennrp@image...>
    +
  6016. Instead of masking the PNG tRNS values when reducing from 16-bit, set image->matte to MagickFalse and emit a warning. This will produce behavior similar to that of libpng-1.2.27 (and libpng-1.2.19 and earlier).
  6017. +
    2008-04-12 6.4.0-7 Cristy <quetzlzacatenango@image...>
    +
  6018. Fix fault for animate -window root image.gif.
  6019. +
  6020. Use GetImagePixels() rather than SetImagePixels() when making multiple passes and setting image pixels (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=11022).
  6021. +
    2008-04-10 6.4.0-6 Cristy <quetzlzacatenango@image...>
    +
  6022. Compile error in coders/avi.c when JPEG delegate library is unavailable.
  6023. +
    2008-04-09 6.4.0-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  6024. Mask the PNG tRNS values when reducing from 16-bit, in accordance with the PNG specification, instead of scaling them.
  6025. +
    2008-04-09 6.4.0-5 Glenn Randers-Pehrson <glennrp@image...>
    +
  6026. Revised png.c to avoid saving unknown chunk types that will never be used later. This prevents the vulnerability described in CVE-2008-1382, with respect to all unknown chunks except vpAg. To handle an invalid, zero-length vpAg chunk properly will require libpng-1.2.27 or later.
  6027. +
    2008-04-04 6.4.0-5 Cristy <quetzlzacatenango@image...>
    +
  6028. Use mplayer delegate if ImageMagick does not grok AVI op code.
  6029. +
  6030. Use proper rounding for the -fx intensity expression.
  6031. +
    2008-03-26 6.4.0-4 Cristy <quetzlzacatenango@image...>
    +
  6032. Fix +swap option so it no longer throws an assertion.
  6033. +
  6034. Return correct min/max for grayscale JPEG images (e.g. -format %[min]).
  6035. +
    2008-03-26 6.4.0-1 Cristy <quetzlzacatenango@image...>
    +
  6036. Rewrote patch so that writing pyramid TIFF images no longer fails if a tile size is specified (e.g. ptif:image.tif[128x128]).
  6037. +
  6038. Malformed use of caption no longer consumes memory (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10914).
  6039. +
  6040. Don't run Ghostscript twice (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10922).
  6041. +
    2008-03-21 6.4.0-0 Cristy <quetzlzacatenango@image...>
    +
  6042. SpreadImage() no longer introduces noise into the resulting image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10892).
  6043. +
  6044. Properly handle min-is-white TIFF gray scale images.
  6045. +
  6046. Use CompositeImage() instead of DrawAffineImage() if the affine expansion factor is 1.0.
  6047. +
    2008-03-20 6.3.9-10 Cristy <quetzlzacatenango@image...>
    +
  6048. Writing pyramid TIFF images no longer fails if a tile size is specified (e.g. ptif:image.tif[128x128]).
  6049. +
  6050. Reset page geometry when interactively cropping an image with the display program.
  6051. +
    2008-03-18 6.3.9-9 Cristy <quetzlzacatenango@image...>
    +
  6052. With a single swap argument should swap the image with the *last* image.
  6053. +
    2008-03-16 6.3.9-8 Cristy <quetzlzacatenango@image...>
    +
  6054. Make sure we don't sync a blob after it has been closed.
  6055. +
    2008-03-14 6.3.9-7 Cristy <quetzlzacatenango@image...>
    +
  6056. Patch mpeg:encode delegate to properly produce an MPEG image sequence.
  6057. +
    2008-03-11 6.3.9-6 Cristy <quetzlzacatenango@image...>
    +
  6058. Support both GTK and CAIRO interfaces to RSVG (reference ttp://imagemagick.org/discourse-server/viewtopic.html?f=2&t=10802).
  6059. +
  6060. Display colormapped PNG images with alpha properly (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10819).
  6061. +
    2008-03-09 6.3.9-5 Cristy <quetzlzacatenango@image...>
    +
  6062. Define inline to _magickcore_inline (to satisfy HP's aCC compiler).
  6063. +
    2008-03-08 6.3.9-4 Cristy <quetzlzacatenango@image...>
    +
  6064. The rsvg delegate library depends on cairo-svg.
  6065. +
  6066. Account for min-is-white 8-bit gray TIFF images.
  6067. +
    2008-02-29 6.3.9-2 Cristy <quetzlzacatenango@image...>
    +
  6068. Add support for the Postable Document Archive Format.
  6069. +
  6070. Add support for Braille images.
  6071. +
  6072. Add support for DDS images (contributed by Bianca van Schaik).
  6073. +
  6074. Add GetImageAlphaChannel() method.
  6075. +
  6076. PSD clipping paths are once again recognized.
  6077. +
    2008-02-24 6.3.9-1 Cristy <quetzlzacatenango@image...>
    +
  6078. Return the actual image format for HTTP: or FTP: format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=10715).
  6079. +
  6080. Fix so image.quantize(true) returns error as expected (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=10735).
  6081. +
    2008-02-20 6.3.9-0 Cristy <quetzlzacatenango@image...>
    +
  6082. Fixed a small memory leak (8 bytes) in TransformImages().
  6083. +
  6084. Render to Cairo surface rather than a GDK buffer when rendering SVG.
  6085. +
  6086. Identify now reports both actual and reported image depths (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=10716).
  6087. +
    2008-02-17 6.3.8-10 Cristy <quetzlzacatenango@image...>
    +
  6088. Speed up converting large PDF/PS images when only selecting a few pages (e.g. pdffile.pdf[195-199]).
  6089. +
  6090. Deprecate HSLTransform() and TransformHSL().
  6091. +
    2008-02-16 6.3.8-9 Cristy <quetzlzacatenango@image...>
    +
  6092. Fix Magick++-config script to reflect the MagickWand / MagickCore dependencies.
  6093. +
    2008-02-14 6.3.8-7 Cristy <quetzlzacatenango@image...>
    +
  6094. Promote colormapped to truecolor images when enciphering.
  6095. +
    2008-02-08 6.3.8-6 Cristy <quetzlzacatenango@image...>
    +
  6096. Add EncipherImage() / DecipherImage() methods.
  6097. +
  6098. Add -encipher / -decipher options to the command-line utilities.
  6099. +
    2008-02-03 6.3.8-5 Cristy <quetzlzacatenango@image...>
    +
  6100. New Unix/Linux refactoring (should be transparent since changes are reflected in Magick-config and ImageMagick.pc pkg-config files): /usr/local/include => /usr/local/include/ImageMagick libMagick => libMagickCore libWand => libMagickWand Magick-config (deprecated) => MagickCore-config Wand-config (deprecated) => MagickWand-config Add Magick++-config, MagickCore.pc, MagickWand.pc, Magick++.pc
  6101. +
    2008-01-28 6.3.8-3 Cristy <quetzlzacatenango@image...>
    +
  6102. Liquid rescale limits the final size to twice the original size (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=10536).
  6103. +
  6104. Read EXIF data in TIFF images; writing is pending until we can figure out how to use the libtiff delegate library to write EXIF data.
  6105. +
    2008-01-24 6.3.8-2 Cristy <quetzlzacatenango@image...>
    +
  6106. Add support for liquid rescaling (e.g. -liquid-rescale).
  6107. +
  6108. Support a ^ meta character in an image geometry (.e.g convert 640x480.png -resize 240^ returns a 320x240 result).
  6109. +
    2008-01-20 6.3.8-1 Cristy <quetzlzacatenango@image...>
    +
  6110. Fix transient bug where "identify -format '%w;%[exif:Model]'" failed to return camera model number.
  6111. +
    2008-01-14 6.3.8-0 Cristy <quetzlzacatenango@image...>
    +
  6112. Monochome EPS3 images are no longer corrupt (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10422).
  6113. +
  6114. Eliminate memory corruption with broken PICT image (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10447).
  6115. +
  6116. Return a Grayscale colorspace for grayscale DPX image (previously returned Log colorspace).
  6117. +
  6118. Fix -g option for PCL6 support (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10462).
  6119. +
    2008-01-08 6.3.7-10 Cristy <quetzlzacatenango@image...>
    +
  6120. Only read ICON alpha mask if BPP is <= 16.
  6121. +
  6122. Add support for +opaque and +transparent (requested by Anthony).
  6123. +
  6124. Throw an exception *before* we call wmf_api_destroy() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10420).
  6125. +
    2008-01-01 6.3.7-9 Cristy <quetzlzacatenango@image...>
    +
  6126. Use explicit format specifier to render transparent Adobe Illustrator files (i.e. convert ai:image.ai image.png).
  6127. +
  6128. Set RSVG base URI (patch provided by tsdineen).
  6129. +
    2007-12-20 6.3.7-7 Cristy <quetzlzacatenango@image...>
    +
  6130. `Magick-config --version` returns Q16 instead of Q@MAGICKCORE_QUANTUM_DEPTH@.
  6131. +
  6132. Permit commas in numbers in certain locales (e.g. german +100,000).
  6133. +
    2007-12-13 6.3.7-5 Cristy <quetzlzacatenango@image...>
    +
  6134. Added an exception reason to BlobToImage() in the event an image has no magic number and neither the image magick or filename is set.
  6135. +
  6136. Do not pass PhotoYCC data thru gamma-corrected lookup-table.
  6137. +
  6138. Fix bug in GetEXIFProperty() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10300).
  6139. +
    2007-12-12 6.3.7-4 Cristy <quetzlzacatenango@image...>
    +
  6140. Adding comments to your image is now possible with the display program.
  6141. +
    2007-12-09 6.3.7-3 Anthony <anthony@griffith...>
    +
  6142. Adjusted -clut multiplyer for correct handling of "-interpolation Integer" in color lookup.
  6143. +
    2007-12-01 6.3.7-3 Cristy <quetzlzacatenango@image...>
    +
  6144. Fix 'insufficient image data' for DCM format (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10227).
  6145. +
  6146. Force a colormapped image if Palm bits-per-pixel < 16.
  6147. +
  6148. Fix multiple problems with Palm Data Base reader (patch from 1tms@gmx.d...).
  6149. +
  6150. Do not exit after first image with the display --immutable option.
  6151. +
  6152. Update autoconf/automake/libtool configuration files.
  6153. +
  6154. Add support for resource limit units (e.g. -limit memory 16mb).
  6155. +
  6156. Return original image if gaussian blur sigma is 0.0.
  6157. +
  6158. Colormapped multi-image PDF's are no longer corrupt (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10258).
  6159. +
    2007-11-27 6.3.7-2 Anthony <anthony@griffith...>
    +
  6160. Finalisation of new resize filters, "Lagrange" self-windowing filter now adjusts automatically with different support window size.
  6161. +
  6162. Added "Bohman" (another 2'rd order cosine function) and "Bartlett" (triangluar) resize windowing filters.
  6163. +
  6164. Adjusted -clut to use a grayscale image (with no alpha) to select colors from the Lookup Table image.
  6165. +
    2007-11-26 6.3.7-2 Cristy <quetzlzacatenango@image...>
    +
  6166. Not all DCM tags were being saved as image attributes (patch provided by jcupitt@gmail...).
  6167. +
  6168. Normalize pixel values when quantum format is floating-point.
  6169. +
  6170. Initialize the pixel sum to zero when averaging image pixels.
  6171. +
    2007-11-23 6.3.7-1 Anthony <anthony@griffith...>
    +
  6172. Bug fix in height calculation for -layers merge operation
  6173. +
    2007-11-02 6.3.7-0 Cristy <quetzlzacatenango@image...>
    +
  6174. Add support for SCT grayscale images.
  6175. +
  6176. Fixed transparency bug for the ICO image format.
  6177. +
  6178. Fixed small memory leak in the caption and label coders.
  6179. +
  6180. Fixed -threshold option to return all white for -threshold 0 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10126).
  6181. +
    2007-11-06 6.3.6-10 Chris Madison <madisonblu@hotma...>
    +
  6182. Corrected CGM delegate command in config/delegate.xml.
  6183. +
    2007-11-05 6.3.6-9 Chris Madison <madisonblu@hotma...>
    +
  6184. Reclassified X server open error from fatal to non-fatal.
  6185. +
  6186. New SetImageAlphaChannel() method to activate, deactivate, reset, or set the image alpha channel.
  6187. +
  6188. Patch for Scanalytics IPLab image format for non 8-bit images (contributed by Sean Burke).
  6189. +
    2007-11-04 6.3.6-8 Chris Madison <madisonblu@hotma...>
    +
  6190. Remove ctrl-M characters on in various source files.
  6191. +
  6192. Fix signature for Magick++ averageImages() regression tests for HDRI.
  6193. +
  6194. Only invoke PerlMagick x11 regression test if DISPLAY variable is set.
  6195. +
    2007-11-03 6.3.6-7 Chris Madison <madisonblu@hotma...>
    +
  6196. MAGICK_ERX_SRCS should be MAGICK_EXR_SRCS in coders/Makefile.am.
  6197. +
    2007-11-02 6.3.6-6 Cristy <quetzlzacatenango@image...>
    +
  6198. Upgrade to FPX version libfpx-1.2.0.14 (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10041).
  6199. +
  6200. Modules are searched first in the directories specified by the environment variables, and then -- if the desired module is not found -- in the compiled-in path. (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=10039).
  6201. +
    2007-11-01 6.3.6-5 Cristy <quetzlzacatenango@image...>
    +
  6202. Update FPX regression test reference images.
  6203. +
  6204. Fixed Magick++ compile error for Sun Studio 10 compiler.
  6205. +
    2007-10-25 6.3.6-4 Cristy <quetzlzacatenango@image...>
    +
  6206. The -equalize option now respects the -channel option.
  6207. +
    2007-10-23 6.3.6-4 Anthony <anthony@griffith...>
    +
  6208. Additional Filters: Welsh, Parzen, Lagrangian
  6209. +
  6210. Addition of Cubic filter B,C controls
  6211. +
  6212. 'verbose' filter plotting output using -define "filter:verbose"
  6213. +
    2007-10-20 6.3.6-3 Anthony <anthony@griffith...>
    +
  6214. Further expansion and handling of filters with expert options. -filter selects from a table of standard filter settings, while expert options allow complete selection of filter, windowing, support and blurring options. Includes automatic switch from Sinc to Bessel for operators using 2-dimensional cylindrical filter, rather than two pass 1-dimensional orthogonal filters.
  6215. +
    2007-10-14 6.3.6-3 Cristy <quetzlzacatenango@image...>
    +
  6216. Obsolete -support (set filter blur factor)
  6217. +
  6218. Expansion to add -set/define filter options
  6219. +
    2007-10-12 6.3.6-2 Anthony <anthony@griffith...>
    +
  6220. Least Squares coordinate handling added for -distort methods Affine, Perspective, Bilinear. This allows for more than the minimal number of coordinates to be used to 'fit' a distortion function to an image. This addition will allow the use of image registration to generate panorama overviews and better geographical coordinate correction.
  6221. +
  6222. Consolidated the similar methods FlattenImage() and MosaicImage() into a new layers function MergeImageLayers() method, adding 'flatten' and 'mosaic' layer methods.
  6223. +
  6224. Addition of another similar layers method 'merge' which 'unlocks' the normal flatten/mosaic layer merger from the origin, The resulting image will have a virtual canvas of minimal size with an offset. Also images with negative offsets will not be clipped by the 'merge' form of the command. This was created for better layering of distorted images, such as panorama overlays.
  6225. +
  6226. Bug fix in handling transparency for EWA resampling.
  6227. +
  6228. Access to Resize Filter Functions from resize.c (for resample.c) with possible future filter sources... Acquire/Destory/Call ResizeFilter()
  6229. +
  6230. All resize filters added to resampling, but filter handling is incomplete.
  6231. +
    2007-10-05 6.3.6-2 Cristy <quetzlzacatenango@image...>
    +
  6232. The box filter no longer produces a black grid when resizing an image under Mac OS X.
  6233. +
  6234. Respect cropbox for PDF with a subimage specification (e.g. image.pdf[1-3]).
  6235. +
  6236. Detect proper PDF bounding box when offsets are negative.
  6237. +
    2007-10-02 6.3.6-1 Cristy <quetzlzacatenango@image...>
    +
  6238. Speed up the Fx interpreter.
  6239. +
  6240. Use ULL not ui64 for MinGW 64-bit constants.
  6241. +
  6242. Call SyncCacheView() instead of SyncImagePixels() in WaveImage().
  6243. +
  6244. Close all references to a pixel cache on disk before removing the temporary file as required under Windows.
  6245. +
    2007-09-29 6.3.6-0 Anthony <anthony@griffith...>
    +
  6246. Added Scaling 'derivatives' to -distort Arc, so image arcing is now sharp and clear as you approach the center of the distort.
  6247. +
  6248. Added " -set option:distort:viewport 'geometry' " special option that can be used to override the output image size and offset.
  6249. +
  6250. Fixed experimental use of -filter and -support in Resampling (more later).
  6251. +
  6252. Changed order for coordinate arguments in -distort (for later leastsq multiple coordinate distortion function fitting)
  6253. +
    2007-09-22 6.3.6-0 Cristy <quetzlzacatenango@image...>
    +
  6254. Check the API version and quantum depth before loading a coder module or image filter (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=9780).
  6255. +
  6256. Add exception to the image filter signature.
  6257. +
  6258. Get the execution path under Mac OS X.
  6259. +
  6260. TIFFTAG_STRIPBYTECOUNTS requires a uint32 pointer (magick/compress.c).
  6261. +
  6262. Fixed memory leak in CloneString() (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=9763).
  6263. +
  6264. Set S_IRUSR | S_IWUSR | S_IRGRP mode when writing a file in CopyDelegateFile().
  6265. +
    2007-09-18 6.3.5-9 Anthony <anthony@griffith...>
    +
  6266. Bug fix for +distort in Perspective, also effected PerspectiveProjection
  6267. +
    2007-09-17 6.3.5-10 Cristy <quetzlzacatenango@image...>
    +
  6268. Replace all InterpolatePixelColor() calls to use the ResamplePixelColor() method instead.
  6269. +
  6270. Map the display program pan icon window for each oversized image.
  6271. +
  6272. The ufraw delegate does not like quotes around the output filename.
  6273. +
  6274. Adjust the sensitivity of a few PerlMagick tests to pass the validation on a 64-bit FreeBSD system.
  6275. +
  6276. The -level option now works properly for colormapped images.
  6277. +
  6278. Allow Extrapolated blending of images using -blend http://netpbm.sourceforge.net/doc/extendedopacity.html
  6279. +
    2007-09-12 6.3.5-9 Anthony <anthony@griffith...>
    +
  6280. Major Addition, Area Resampling Functions, (scaled interpolation) for pixel lookup in Distortion functions. This improves the look in areas of minification enormously, especially in situations of infinite tiling and horizon views. All virtual pixel methods have been handled to minimise computation time involved with area resampling. To use the new function distortions need to be able to determine scaling vectors (distortion function derivatives) for correct working. All -distort methods, except Arc, uses scaled area resampling.
  6281. +
  6282. Improvements to perspective distort method, to include the correct differentiation between the 'ground' on which the image lies, and the 'sky', the color of which can be set using the -mattecolor setting (as the distortion invalid pixel color). Background color is retains for surrounding ground areas. The horizon is also correct anti-aliased and transparent colors are also allowed, allowing you to add backdrops of gradients and patterns.
  6283. +
    2007-09-04 6.3.5-9 Cristy <quetzlzacatenango@image...>
    +
  6284. Read/Write Scanalytics IPLab image format (contributed by Sean Burke).
  6285. +
  6286. Patched ReadBlobString() to fix a off-by-one vulnerability (alert from iDefense).
  6287. +
  6288. Patched ReadDIBImage() to fix a sign extension vulnerability (alert from iDefense).
  6289. +
  6290. Patched AllocateImageColormap() to fix an integer overflow vulnerability (alert from iDefense).
  6291. +
  6292. Patched ReadDCMImage() to fix an integer overflow vulnerability (alert from iDefense).
  6293. +
  6294. Patched ReadDIBImage() to fix an integer overflow vulnerability (alert from iDefense).
  6295. +
  6296. Patched ReadXBMImage() to fix an integer overflow vulnerability (alert from iDefense).
  6297. +
  6298. Patched ReadDCMImage() to fix an denial of service vulnerability (alert from iDefense).
  6299. +
  6300. Patched ReadXCFImage() to fix an denial of service vulnerability (alert from iDefense).
  6301. +
  6302. If image size changes, don't trust DPX orientation attributes.
  6303. +
    2007-09-04 6.3.5-9 Gozer404
    +
  6304. Add French to the messaging system (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=9601).
  6305. +
  6306. Add -fopenmp to MAGICK_PCFLAGS (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=9608).
  6307. +
    2007-08-14 6.3.5-7 Cristy <quetzlzacatenango@image...>
    +
  6308. Add -alpha {activate,deactivate,reset} option to activate, deactivate, or reset the alpha channel.
  6309. +
  6310. Render proper image labels for VID coder.
  6311. +
  6312. Resolved a conflict for the -list option. Use -list font to list ImageMagick fonts and -list type to list image types.
  6313. +
  6314. Catch any errors returned by pthread_mutex_init() (problem report from devman@gmx-t...).
  6315. +
  6316. TransformHSL() returns a proper hue component.
  6317. +
  6318. Added -clut option and the ClutImage() method.
  6319. +
  6320. Fix glyph memory leak in AnnotateImage (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=9523).
  6321. +
  6322. Rename analyze.c to Analyze.c (reference ttp://imagemagick.org/discourse-server/viewtopic.html?f=3&t=9538).
  6323. +
    2007-08-07 6.3.5-6 Anthony <anthony@griffith...>
    +
  6324. Enabled use of +distort to auto resize destination image to 'bestfit' the distorted input image. This also enabled the use of virtual canvas offsets in source and destination images for most distortion methods.
  6325. +
    2007-08-05 6.3.5-6 Cristy <quetzlzacatenango@image...>
    +
  6326. Remove atexit in Magick++ code to avoid possible client crash (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=9270).
  6327. +
    2007-08-01 6.3.5-5 Cristy <quetzlzacatenango@image...>
    +
  6328. Read/Write Scanalytics IPLab image format (contributed by Sean Burke).
  6329. +
    2007-07-30 6.3.5-5 Anthony <anthony@griffith...>
    +
  6330. Added -distort arc. This update also allows the destination image size and offset to be set according to the specific distortion being applied.
  6331. +
    2007-07-29 6.3.5-5 Cristy <quetzlzacatenango@image...>
    +
  6332. Set the -polaroid border color with the -bordercolor option.
  6333. +
    2007-07-25 6.3.5-4 Cristy <quetzlzacatenango@image...>
    +
  6334. Remove extraneous break statement so -type option properly sets the image_info->type member (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=9261).
  6335. +
    2007-07-21 6.3.5-4 Anthony <anthony@griffith...>
    +
  6336. Allow the use of optional arguments in -distort SRT
  6337. +
    2007-06-29 6.3.5-0 Anthony <anthony@griffith...>
    +
  6338. Initial addition of three Affine Distortions to -distort with the affine mapping defined by the use of; an Affine Matrix, Coordinates of Triangles, or separate Scale-Rotate-Translate actions.
  6339. +
    2007-06-18 6.3.5-0 Cristy <quetzlzacatenango@image...>
    +
  6340. Fix X11 font ascender.
  6341. +
  6342. Add -distort option.
  6343. +
  6344. Add random noise option (e.g. +noise random).
  6345. +
  6346. Many internal algorithms are now threaded to take advantage of speed-ups offered by the new dual and quad-core processor technologies. and quad-core processor technology.
  6347. +
  6348. Tiff images in the LAB colorspace are no longer identified as RGB (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=9015).
  6349. +
  6350. Update image color_profile and iptc_profile members in the JPEG coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=9063);
  6351. +
    2007-06-13 6.3.4-10 Cristy <quetzlzacatenango@image...>
    +
  6352. Fix composite mask bug (reference ../Usage/bugs/composite_mask/).
  6353. +
  6354. Speed up GetPixelOpacity() method (patch from seth@price...).
  6355. +
  6356. Set icon image width/height before allocating the image colormap.
  6357. +
  6358. Remove Photoshop string segment from JPEG profile (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=9006).
  6359. +
    2007-06-11 6.3.4-9 Cristy <quetzlzacatenango@image...>
    +
  6360. Converting a jpg to pdf is creating an empty pdf object (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=8954).
  6361. +
  6362. Respect the '-set type:hinting off option' (bug report from Richard Jones).
  6363. +
  6364. WritePSDImage vulnerable to exploitable heap corruption (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=8967).
  6365. +
    2007-06-09 6.3.4-8 Cristy <quetzlzacatenango@image...>
    +
  6366. SetMagickRegistry() post-increment the value 'id' (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=8944).
  6367. +
    2007-06-02 6.3.4-6 Cristy <quetzlzacatenango@image...>
    +
  6368. Read/write 10 & 12-bit packed DPX images.
  6369. +
  6370. Reduce stack requirements for messaging system.
  6371. +
  6372. Small memory leak for raw profiles in the PNG coder.
  6373. +
    2007-06-01 6.3.4-5 Glenn <glennrp@image...>
    +
  6374. Added GIF, JPEG, and PNG interlace types. For backward compatibility, you can continue to use "-interlace Plane" to request these.
  6375. +
    2007-04-30 6.3.4-0 Anthony <anthony@griffith...>
    +
  6376. Fixed minor bug in the 'curl' for Polaroid of very non-square images.
  6377. +
    2007-06-01 6.3.4-5 Cristy <quetzlzacatenango@image...>
    +
  6378. Set min-is-white for Group4-compressed PDF.
  6379. +
  6380. Add PaintFloodfillImage() method.
  6381. +
    2007-05-30 6.3.4-4 Cristy <quetzlzacatenango@image...>
    +
  6382. Add MEPP metric to compare program. Returns the mean error per pixel along with the normalize mean and maximum error.
  6383. +
  6384. Attach an XMP profile to an image (e.g. convert input.tif -profile xmp:metadata.xmp output.tif).
  6385. +
    2007-05-22 6.3.4-3 Cristy <quetzlzacatenango@image...>
    +
  6386. Fixed mogrify conversions with -format and -path (reference https://imagemagick.org/discourse-server//viewtopic.html?f=1&t=9127).
  6387. +
    2007-05-15 6.3.4-2 Cristy <quetzlzacatenango@image...>
    +
  6388. SVG style element was not always parsed properly.
  6389. +
  6390. Do not dither when the number of unique colors is already less than the maximum.
  6391. +
  6392. Return normalized PAE metric (compare utility).
  6393. +
    2007-05-03 6.3.4-1 Cristy <quetzlzacatenango@image...>
    +
  6394. Add support for PFM images.
  6395. +
  6396. Check for corrupt EXIF image profiles.
  6397. +
  6398. Writing JPEG YCbCr TIFF images no longer faults (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=8896).
  6399. +
    2007-04-30 6.3.4-0 Anthony <anthony@griffith...>
    +
  6400. Fixed minor bug for crop missed images and 'background' GIF disposal.
  6401. +
    2007-04-28 6.3.4-0 Glenn <glennrp@image...>
    +
  6402. Added profile support to the GIF decoder/encoder. They are stored as GIF Application Extensions. Known extensions include existing ICCRGB1 (for ICC profiles) and new MGKIPTC0 and MGK8BIM0 (for IPTC and 8BIM profiles). Unknown extensions found in GIF files are read as gifappNNN.
  6403. +
    2007-04-28 6.3.4-0 Anthony <anthony@griffith...>
    +
  6404. Invert Opacity change for user defined ordered dither threshold maps, so that 'off' map is transparent, and 'on' is opaque.
  6405. +
    2007-04-24 6.3.4-0 Anthony <anthony@griffith...>
    +
  6406. Added an initial Coalesce Images, and a final +map local colortable optimization to the -layers Optimize method, for a simple to use GIF optimization operation. (more work to come)
  6407. +
    2007-04-22 6.3.4-0 Cristy <quetzlzacatenango@image...>
    +
  6408. Properly set the virtual canvas of a multi-frame GIF image sequence.
  6409. +
  6410. Add AcquireOneVirtualPixel() method.
  6411. +
  6412. Set Log colorspace properly when writing DPX images.
  6413. +
  6414. Add -tile-offset option.
  6415. +
  6416. Add support for the EXR image format.
  6417. +
  6418. Improve support for DPX images.
  6419. +
  6420. Add --enable-hdri option to the configure script.
  6421. +
  6422. Add support for high dynamic-range images (HDRI).
  6423. +
    2007-04-20 6.3.3-9 Peter Hull <peterhull90@gmail...>
    +
  6424. Improve support for writing multiple image icons.
  6425. +
    2007-04-18 6.3.3-9 Anthony <anthony@griffith...>
    +
  6426. Separated -layers Optimize from -layers OptimizeFrame to allow the former expansion into a general (multiple method) optimizer of GIF animations
  6427. +
  6428. merged -layers OptimizeTransparency into -layers Optimize method
  6429. +
    2007-04-12 6.3.3-8 Chris Madison <madisonblu@hotma...>
    +
  6430. Fix fault whem comparing a colormapped image with a non-colormapped one.
  6431. +
  6432. Fix race condition when spawning delegate programs.
  6433. +
  6434. TIFF JPEG now respects the -quality compression setting.
  6435. +
  6436. The -fx option now properly groks the logical and operator.
  6437. +
  6438. DPX tilestamp property should be timestamp.
  6439. +
    2007-04-13 6.3.3-7 Anthony <anthony@griffith...>
    +
  6440. Added GravityAdjustGeometry() to "geometry.c" to adjust geometry settings according to given gravity and canvas area it applies to. This is for code simplification throughout MagickCore.
  6441. +
    2007-04-09 6.3.3-6 Anthony <anthony@griffith...>
    +
  6442. Fixed CoalesceImages() to reset virtual canvas info on second and later frames. Other animation handlers may also need to reset virtual canvas sizes to match the first frame, as well.
  6443. +
    2007-04-06 6.3.3-6 Anthony <anthony@griffith...>
    +
  6444. Addition of a CompositeImages() "layer.c" function to compose two separate image lists together (with a virtual canvas offset) in three different ways, depending on the size of the lists.
  6445. +
  6446. A 'hack' for command line use (the two lists separates by the special "NULL" image, which is junked) has also been added. Specifically... "-layers Composite".
  6447. +
    2007-04-04 6.3.3-6 Anthony <anthony@griffith...>
    +
  6448. Add -layers RemoveDups method to remove duplicate sequential images in coalesced animations.
  6449. +
  6450. Add -layers RemoveZero method to remove images with a zero time delay (with no action and a warning is all images have zero time delay)
  6451. +
    2007-04-01 6.3.3-6 Cristy <quetzlzacatenango@image...>
    +
  6452. Permit generic profiles (e.g. -profile name:profile).
  6453. +
    2007-03-31 6.3.3-5 Cristy <quetzlzacatenango@image...>
    +
  6454. Fixed DCM and XWD buffer overflow vulnerabilities (reference http://labs.idefense.com/intelligence/vulnerabilities/display.html?id=496).
  6455. +
    2007-03-28 6.3.3-4 Anthony <anthony@griffith...>
    +
  6456. Code duplication, simplification, and possible logic faults in "list.c".
  6457. +
  6458. Added new Composition method, 'ChangeMask' to return pixels that have changed or will cause a color change in overlays
  6459. +
  6460. Used 'ChangeMask' to implement the "-layers" method "OptimizeTransparency" to improve the compressibility of frame optimized GIF animations. See IM Examples... ../Usage/anim_opt/#opt_trans
  6461. +
    2007-03-19 6.3.3-4 Cristy <quetzlzacatenango@image...>
    +
  6462. Fixed two memory leaks in wand/magick-image.c and magick/stream.c and made some minor changes to the GIF coder to make reading and pinging images faster (patch provided by mstemm@cloud...).
  6463. +
    2007-03-19 6.3.3-3 Cristy <quetzlzacatenango@image...>
    +
  6464. Patch RotateImage() to properly rotate CMYK images.
  6465. +
  6466. Patch the XWD coder to prevent heap overflow vulnerability (vulnerability report from idefense.com [IDEF2108] [IDEF2221] [IDEF2226]).
  6467. +
    2007-03-19 6.3.3-3 Anthony <Anthony@griffith...>
    +
  6468. Fixed bug for GIF Optimization for images without a matte channel.
  6469. +
  6470. Improved image handling for "-layers" method "Dispose".
  6471. +
    2007-03-11 6.3.3-2 Cristy <quetzlzacatenango@image...>
    +
  6472. Improve configure script to better support Ghostscript under Mac OSX ( reference https://imagemagick.org/discourse-server//viewtopic.html?t=8557).
  6473. +
  6474. Force a virtual pixel method of Tile for GetFillColor() and GetStrokeColor().
  6475. +
  6476. Add -reverse option to reverse the image list.
  6477. +
    2007-03-08 6.3.3-1 Cristy <quetzlzacatenango@image...>
    +
  6478. Support versions 2.1.0 and above (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=8620).
  6479. +
  6480. Support SVG rotation about a point (e.g. rotate(45 75 75)).
  6481. +
  6482. Fix fault in DCM coder (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=8618).
  6483. +
  6484. Check for a NULL parser in SVGReference in coders/svg.c (reference https://imagemagick.org/discourse-server//viewtopic.html?f=3&t=8609).
  6485. +
  6486. Add --disable-deprecated configure script option.
  6487. +
  6488. Composite mask now works properly with transparent images.
  6489. +
    2007-03-04 Daniel Kobras <kobras@debia...>
    +
  6490. Fixed additional data-driven faults (reference http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=412945).
  6491. +
  6492. Allocate proper scanline length to prevent a PCX overflow.
  6493. +
    2007-03-03 6.3.3-1 Cristy <quetzlzacatenango@image...>
    +
  6494. Patch ImageMagick to permit referenced labels: -set option:mylabel "color = %[pixel:u[0].p{12,26}]" label:'%[mylabel]'
  6495. +
    2007-02-24 6.3.3-0 Cristy <quetzlzacatenango@image...>
    +
  6496. Escape indirect labels and comments (e.g. -label @file).
  6497. +
  6498. Added -format %C to return the image compression type.
  6499. +
  6500. Do not report channel statistics if -ping -format is specified with the identify program.
  6501. +
  6502. Add ResetImagePage() to reset the image page canvas and position.
  6503. +
  6504. Upgrade to LCMS 1.16
  6505. +
  6506. Configure Ghostscript for library or framework (reference https://imagemagick.org/discourse-server//viewtopic.html?f=2&t=8557).
  6507. +
  6508. Add -taint option to convert/mogrify to mark image as ineligible for
  6509. +
  6510. Fixed various data-driven faults (reference http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=412945). The corrupt JP2 image faults but its failing in the JP2 jas_image_decode() method, not MagickCore. The corrupt XWD image faults but its failing in the X11 XGetPixel() method, not MagickCore.
  6511. +
    2007-02-20 6.3.2-8 Cristy <quetzlzacatenango@image...>
    +
  6512. Use -define quantum:polarity=min-is-black or -define quantum:polarity=min-is-white to toggle the photometric interpretation for a bilevel TIFF image.
  6513. +
    2007-02-17 6.3.2-8 Cristy <quetzlzacatenango@image...>
    +
  6514. Don't interpret embedded format characters when reading comments/labels from a file.
  6515. +
  6516. Reading an image from stdin stopped working.
  6517. +
    2007-02-17 6.3.2-7 Cristy <quetzlzacatenango@image...>
    +
  6518. PerlMagick Label() no longer faults.
  6519. +
  6520. Fix double-free when using the display/animate -geometry option.
  6521. +
  6522. Add GetStringInfoLength() and GetStringInfoDatum(); deprecate profile->length and profile->datum.
  6523. +
    2007-02-16 6.3.2-6 Cristy <quetzlzacatenango@image...>
    +
  6524. Fix file leak in InjectImageBlob().
  6525. +
  6526. Do not reinterpret image properties (e.g. -comment %%w).
  6527. +
    2007-02-14 6.3.2-5 Cristy <quetzlzacatenango@image...>
    +
  6528. Don't over-allocate file buffers.
  6529. +
    2007-02-12 6.3.2-5 Cristy <quetzlzacatenango@image...>
    +
  6530. Format strings in the POSIX locale.
  6531. +
  6532. Make font metrics invariant to the strokewidth.
  6533. +
    2007-02-10 6.3.2-4 Albert Chin <china@thewr...>
    +
  6534. Patch to fix configure.ac typo.
  6535. +
    2007-02-08 6.3.2-4 Cristy <quetzlzacatenango@image...>
    +
  6536. Permit ImageMagick to run as a service under Windows.
  6537. +
  6538. Remove duplicate EXIF properties.
  6539. +
  6540. Support strokewidth option for the caption format.
  6541. +
  6542. Don't use Ghostscript for rendering fonts if Freetype is available.
  6543. +
    2007-02-02 6.3.2-3 Cristy <quetzlzacatenango@image...>
    +
  6544. Added thumbnail format to write EXIF thumbnails.
  6545. +
  6546. Move ReadByteImage() out of Min() macro of ReadPALMImage().
  6547. +
  6548. Move EXIF properties to the EXIF namespace (e.g. exif:XResolution).
  6549. +
    2007-01-26 6.3.2-2 Cristy <quetzlzacatenango@image...>
    +
  6550. Add interpolate and background options to PerlMagick's AffineTransform().
  6551. +
  6552. Revert to Postscript rendering if Freetype delegate library is not available.
  6553. +
    2007-01-20 6.3.2-1 Cristy <quetzlzacatenango@image...>
    +
  6554. Accept Fx expressions from a file with -fx @filename.
  6555. +
  6556. Enhance -fill and -stroke to accept image filenames as patterns.
  6557. +
    2007-01-16 6.3.2-0 Cristy <quetzlzacatenango@image...>
    +
  6558. Save grayscale images as JPEG-compressed grayscale when writing in the TIFF format.
  6559. +
  6560. Update EXIF resolution fields when image density changes.
  6561. +
    2007-01-07 6.3.1-7 Cristy <quetzlzacatenango@image...>
    +
  6562. The -polaroid option now respects -gravity.
  6563. +
  6564. Deprecate Get/SetImageAttribute(). Recommend Get/SetImageProperty() instead.
  6565. +
  6566. Any form of "-crop" with a percentage, implies an offset for the crop.
  6567. +
  6568. Fixed percent option for -border (e.g. -border 10%x0%).
  6569. +
  6570. Add -path option to the mogrify program to specify where to write the images.
  6571. +
    2007-01-06 6.3.1-6 Cristy <quetzlzacatenango@image...>
    +
  6572. Fix the -auto-orient to work with an image sequence (reference https://imagemagick.org/discourse-server//viewtopic.html?t=8100).
  6573. +
  6574. Add -polaroid option to simulate a Polaroid picture.
  6575. +
  6576. Eliminate double-free bug in GradientImage().
  6577. +
  6578. Set AppendImage() matte channel only when image has matte attribute set.
  6579. +
  6580. The -crop with negative offsets do not modify the virtual canvas.
  6581. +
  6582. Caption: Given both the width and height ("-size") of the area to fill, adjust the fonts "-pointsize" until the text just filles the whole space without overflowing.
  6583. +
  6584. Generate proper Windows icon image files (patch provided by Robert M. Jansen).
  6585. +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/cipher.html b/ImageMagick-6.9.12-44/www/cipher.html new file mode 100644 index 0000000..a08e904 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/cipher.html @@ -0,0 +1,183 @@ + + + + + + + + + + ImageMagick (legacy) – Encipher or Decipher an Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Encipher or Decipher an Image

    +

    Encipher an ImageDecipher an ImageEncipher and Decipher Caveats

    + +

    Most images, by design, are made to be viewed often and by many people. Web images, for example, may be viewed hundreds of times a day by a multitude of vistors. However, in some cases, you may want to keep a particular image private so that only you or perhaps a select group of your friends or web visitors can view it. ImageMagick permits you to scramble your images such that unless someone knows your passphrase, they will be unable to view the original content.

    + +

    You could use an enciphering utility to scramble your image but they typically scramble the entire file making it unrecognizable as an image format. With ImageMagick, only the pixels are scrambled. The scrambled image continues to be recognized as an image and will even display in your web page. However, the content appears as gibberish, nothing like the original content.

    + +

    Encipher an Image

    + +

    Use the -encipher option to scramble your image so that it is unrecognizable. The option requires a filename that contains your passphrase. In this example we scramble an image and save it in the PNG format:

    + +
    convert rose.jpg -encipher passphrase.txt rose.png
    +
    + +

    Here we encipher an image using another image as the passphrase:

    + +
    convert rose.jpg -encipher smiley.gif rose.png
    +
    + +

    Decipher an Image

    + +

    Use the -decipher option to unscramble your image so that it is recognizable once again. The option requires a filename that contains your passphrase. In this example we unscramble an image and save it in the JPEG format:

    + +
    convert rose.png -decipher passphrase.txt rose.jpg
    +
    + +

    Encipher and Decipher Caveats

    + +

    Some formats do not support enciphered pixels-- the JPEG or GIF format, for +example. To ensure your image format is supported, encipher a test image and +verify you can restore its original content before you encipher any +additional images in that format.

    + +

    The image format may only support 8-bit and RGB (TrueColor). As such you may +like to include the options "-depth 8 -type TrueColor" before the output +filename.

    + +

    The passphrase can be any combinations of letters and symbols. It should +be a minimum of 12 character combinations to help ensure your image remains +private. Also make sure your passphrase file permissions prevent others from +reading it otherwise unintended users may be able to view the original image +content.

    + +

    You can only restore the original image content if you know your +passphrase. If you lose or forget it, your original image content is lost +forever.

    + +

    ImageMagick only scrambles the image pixels. The image metadata remains +untouched and readable by anyone with access to the image file.

    + +

    ImageMagick uses the AES +cipher in Counter mode. We use the first half of your passphrase to derive the nonce. The second half is the cipher key. When used correctly, AES-CTR provides a high level of confidentiality. To avoid information leaks, you must use a fresh passphrase for each image your encrypt.

    + +

    Currently only ImageMagick can restore your enciphered image content. We +use a standard cipher and mode so other vendors could support enciphered image content.

    + +

    Some small practical examples of image enciphering can be found in IM +Examples Encrypting Image Data.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/cite.html b/ImageMagick-6.9.12-44/www/cite.html new file mode 100644 index 0000000..3244052 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/cite.html @@ -0,0 +1,140 @@ + + + + + + + + + + ImageMagick (legacy) – How to Cite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Cite

    +

    Learn how to cite ImageMagick in your work. Choose from these citation formats:

    + +

    Citation in APA style

    +
    The ImageMagick Development Team. (2021). ImageMagick. Retrieved from https://imagemagick.org
    + +

    Citation in Vancouver style

    +
    1. The ImageMagick Development Team. ImageMagick [Internet]. 2021. Available from: https://imagemagick.org
    + +

    Citation in Harvard style

    +
    The ImageMagick Development Team, 2021. ImageMagick, Available at: https://imagemagick.org.
    +

    Citation in Bibtex format

    +
    @software{imagemagick,
    +  author = {{The ImageMagick Development Team}},
    +  title = {ImageMagick},
    +  url = {https://imagemagick.org},
    +  version = {7.0.10},
    +  date = {2021-01-04},
    +}
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/color-management.html b/ImageMagick-6.9.12-44/www/color-management.html new file mode 100644 index 0000000..fc2b358 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/color-management.html @@ -0,0 +1,178 @@ + + + + + + + + + + ImageMagick (legacy) – Color Management + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Accurate Color Management

    +

    Due to the standardization of sRGB on the Internet, most image formats use SRGB as the default working color space. If the color space of an image is unknown and it is an 8- to 16-bit image format, assuming it is in the sRGB color space is a safe choice. This extends to grayscale as well. We assume non-linear grayscale. These assumptions are overridden if a particular image format includes color space and / or gamma metadata. ImageMagick assumes linear color if the color space is RGB instead of sRGB. You can also override the default color space assumptions with color profiles or the -set option.

    + +

    ImageMagick supports color profiles, however, for images without a profile or a declaration of colorspace, ImageMagick assumes non-linear sRGB. Most image processing algorithms assume a linear colorspace, therefore it might be prudent to convert to linear color or remove the gamma function before certain image processing algorithms are applied. For example,

    + +
    convert myimage.jpg -colorspace RGB -resize 200% -colorspace sRGB mybigimage.jpg
    + +

    To declare that an image is linear RGB rather than sRGB, you can use the set option:

    + +
    convert myimage.png -set colorspace RGB myRGBimage.png
    + +

    Note that declaring an image as linear is not the same as converting the image to linear. Declaring it is linear only sets the meta data and does not change the pixel data. Whereas converting to linear actually changes the pixel data as described in more detail below.

    + +

    Afterwards, the verbose information for the output file lists the colorspace as RGB. This only works on image types containing meta data that distinguishes between linear RGB and non-linear sRGB, such as PNG and GIF. Therefore, if the above command is run with a JPG or TIF output format, the verbose information for the colorspace still shows sRGB. In order to properly have the JPG output know that it is linear RGB, include an appropriate color profile.

    + + +

    By default, converting color images to grayscale returns non-linear gray. To instead convert to linear gray, use the -set or -intensity or -grayscale options:

    + +
    
    +convert myimage.png -colorspace LinearGray myRGBimage.png
    +convert myimage.png -colorspace RGB -colorspace Gray myRGBimage.png
    +convert myimage.png -intensity Rec709luminance -colorspace gray myRGBimage.png
    +convert myimage.png -grayscale Rec709luminance myRGBimage.png
    +
    + +

    Note that LinearGray is new as of Imagemagick 6.9.9-29 and 7.0.7-17.

    + +

    The same concept is needed when separating channels. Normally, the conversion to separate each channel of an sRGB color image produces separate non-linear grayscale images. However the same concept can be applied, if it is desired to keep the separate channels as linear grayscale. For example, the following produces linear grayscale channels.

    + +
    convert myimage.png -colorspace RGB -separate myimage_channels_%d.png
    + +

    When separating and recombining channels, with potential intermediate processing, it is important to identify the colorspace used, especially during the recombination. For example,

    + +
    convert myimage.png -separate myimage_channels_%d.png
    +convert myimage_channels_*.png -combine myimage2.png
    + +

    In the above example, the separated channels are non-linear and the default for -combine is to assume non-linear channels. So the result is the same as the input.

    + +If one desires to separate to linear grayscale channels, recombine them later back to non-linear color, perhaps after some processing, then use the same concept as above for maintaining linear grayscale:

    + +
    convert myimage.png -set colorspace RGB -separate myimage_channels_%d.png
    +convert myimage_channels_*.png -set colorspace RGB -combine -colorspace sRGB myimage2.png
    + +

    When converting to another colorspace and back, such as between sRGB and HSL, the following two commands handle the first case of non-linear channels and the second case of linear channels:

    + +
    convert myimage.png -colorspace HSL -separate myimage_channels_%d.png
    +convert myimage_channels_*.png -set colorspace HSL -combine -colorspace sRGB myimage2.png
    + +
    convert myimage.png -set colorspace RGB -colorspace HSL -separate myimage_channels_%d.png
    +convert myimage_channels_*.png -set colorspace HSL -combine -colorspace RGB -set colorspace sRGB myimage2.png
    + +

    A majority of the image formats assume an sRGB colorspace (e.g. JPEG, PNG, etc.). A few support only linear RGB (e.g. EXR, DPX, CIN, HDR) or only linear GRAY. A few formats support CMYK. For example JPG does, but PNG does not. Then there is the occasional format that also supports LAB (that is CieLAB) (e.g. TIFF, PSD, JPG, JP2). For additional information, see the Colorspace and Supported Formats pages.

    + +

    When specifying individual colors as rgb(...) or hex, these colors will still be interpreted as non-linear, that is, as sRGB colors. However if one wants to create linear colors, use icc-color(rgb,r,g,b)", where r, g, and b are in the range 0 to 1. See the Color page.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/color.html b/ImageMagick-6.9.12-44/www/color.html new file mode 100644 index 0000000..c7661f1 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/color.html @@ -0,0 +1,4993 @@ + + + + + + + + + + ImageMagick (legacy) – Color Names + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Example UsageColor Model SpecificationList of Color Names

    + +

    A number of ImageMagick options and methods take a color as an argument. The color can then be given as a color name (there is a limited but large set of these; see below) or it can be given as a set of numbers (in decimal or hexadecimal), each corresponding to a channel in an RGB or RGBA color model. HSL, HSLA, HSB, HSBA, CMYK, or CMYKA color models may also be specified. These topics are briefly described in the sections below.

    + +

    Use the Color Converter to supply any valid ImageMagick color specification as described below to see a color swatch of that color and to convert to all the other color models.

    + +

    Example Usage

    + +

    Each of the following commands produces the same lime border around the image. (Use "double quotes" for Windows.)

    + +
    convert -bordercolor lime -border 10 image.jpg image.png
    +convert -bordercolor '#0f0' -border 10 image.jpg image.png
    +convert -bordercolor '#00ff00' -border 10 image.jpg image.png
    +convert -bordercolor 'rgb(0,255,0)' -border 10 image.jpg image.png
    +convert -bordercolor 'rgb(0,100%,0)' -border 10 image.jpg image.png
    + +

    The list of recognized color names (for example, aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white, yellow, and others) is shown in a table further below.

    + +

    Color Model Specification

    + +

    The sRGB, CMYK, HSL and HSB color models are used in numerical color specifications. These examples all specify the same red sRGB color:

    + +
    #f00                      #rgb
    +#ff0000                   #rrggbb
    +#ff0000ff                 #rrggbbaa
    +#ffff00000000             #rrrrggggbbbb
    +#ffff00000000ffff         #rrrrggggbbbbaaaa
    +rgb(255, 0, 0)            an integer in the range 0—255 for each component
    +rgb(100.0%, 0.0%, 0.0%)   a float in the range 0—100% for each component
    + +

    The format of an sRGB value in hexadecimal notation is a '#' immediately followed by either three, six, or twelve hexadecimal characters. The three-digit sRGB notation (#rgb) is converted into six-digit form (#rrggbb) by replicating digits, not by adding zeros. For example, #fb0 expands to #ffbb00. This ensures that white (#ffffff) can be specified with the short notation (#fff) and removes any dependencies on the color depth of the image. Use the hexadecimal notation whenever performance is an issue. ImageMagick does not need to load the expansive color table to interpret a hexadecimal color, e.g., #000000, but it does if black is used instead.

    + +

    The format of an sRGB value in the functional notation is 'rgb(r,g,b)', where r, g, and b are either three integer or float values in the range 0—255 or three integer or float percentage values in the range 0—100%. The value 255 corresponds to 100%, and to #F or #FF in the hexadecimal notation: rgb(255, 255, 255) = rgb(100%, 100%, 100%) = #FFF = #FFFFFF.

    + +

    Note, as of ImageMagick 6.9.11-53, the commas are no longer necessary and a slash can proceed the alpha value, e.g. rgb(255 128 0 / 50%)..

    + +

    White space characters are allowed around the numerical values, at least if the entire color argument is enclosed in quotes ('single quotes' for Linux-like systems, "double quotes" for Windows).

    + +

    The sRGB color model is extended in this specification to include alpha to allow specification of the transparency of a color. These examples all specify the same color:

    + +
    rgb(255, 0, 0)                 range 0 - 255
    +rgba(255, 0, 0, 1.0)           the same, with an explicit alpha value
    +rgb(100%, 0%, 0%)              range 0.0% - 100.0%
    +rgba(100%, 0%, 0%, 1.0)        the same, with an explicit alpha value
    + +

    The format of an RGBA value in the functional notation is 'rgba(r,g,b,a)', where r, g, and b are as described above for the RGB functional notation, and where the alpha value a ranges from 0.0 (fully transparent) to 1.0 (fully opaque).

    + +

    There is also a color called 'none' that is fully transparent. This color is shorthand for rgba(0, 0, 0, 0.0).

    + +

    Non-linear gray values are conveniently defined with a name, single intensity value or an intensity value and an alpha value:

    + +
    
    +gray50            near mid gray
    +gray(127)         near mid gray
    +gray(50%)         mid gray
    +graya(50%, 0.5)   semi-transparent mid gray
    + +

    For linear gray values add -colorspace RGB -colorspace Gray or -colorspace LinearGray when creating gray colors. The latter is new as of Imagemagick 6.9.9-29 and 7.0.7-17.

    + +

    The ImageMagick color model also supports hue-saturation-lightness (HSL) and hue-saturation-brightness (HSB) colors as a complement to numerical sRGB colors. HSL colors are encoding as a triple (hue, saturation, lightness). Likewise HSB colors are encoding as a triple (hue, saturation, brightness). HSL or HSB triples are either direct values (hue 0—360, saturation 0—255, lightness or brightness 0—255) or with S,L,B as percentage values relative to these ranges.

    + +

    The HSB color system is geometrically represented as a cone with its apex pointing downward. Hue is measured around the perimeter. Saturation is measured from the axis outward. Brightness is measured from the apex upward.

    + +

    The HSL color system is geometrically represented as a stacked double cone with one apex pointing downward and the other pointing upward. The widest ends of both cones are stacked together one on top of the other. Hue is measured around the perimeter. Saturation is measured from the axis outward. Lightness is measured from the bottom apex upward.

    + +

    See http://en.wikipedia.org/wiki/HSL_and_HSV for more details on HSL and HSB color systems.

    + +

    Hue is represented as an angle of the color around the circular perimeter of the cone(s) (i.e. the rainbow represented in a circle). Hue values are integers or floats in the range 0—360. By definition red=0=360, and the other colors are spread around the circle, so green=120, blue=240, etc. As an angle, it implicitly wraps around such that -120=240 and 480=120, for instance. (Students of trigonometry would say that "coterminal angles are equivalent" here; an angle θ can be standardized by computing the equivalent angle, θ mod 360.)

    + +

    Saturation is measure outward from the central axis of the cone(s) toward the perimeter of the cone(s). Saturation may be expressed as an integer or float in the range 0—255 or as an integer or float percentage in the range 0—100. Saturation may be thought of as the absence of any "white" mixed with the base color. Thus 255 or 100% is full saturation and corresponds to a point on the outside surface of the cone (HSB) or double cone (HSL). It will be the most "colorful" region. 0 or 0% is no saturation which results in some shade of gray. It occurs along the central axis of the cone or double cone with black at the bottom apex and white at the top.

    + +

    Brightness and Lightness also may be represented as integers or floats in the range 0—255 or as integer or float percentages in the range 0—100%. Brightness and Lightness are measured from the bottom apex upward to the top of the cone or double cone along the cone(s) central axis. 0 or 0% corresponds to the bottom apex and 255 or 100% corresponds to the top center of the cone for Brightness and to the top apex of the double cone for Lightness.

    + +

    The HSB color system is a little easier to understand than the HSL color system. In the HSB color system, black is at the bottom apex and white is at the top center of the cone on the central axis. The most colorful or saturated colors will then be at the outer edge of the top of the cone at the widest part. Thus at Saturation=100% and Brightness=100%

    + +
    hsb(0,   100%,  100%)    or    hsb(0,   255,   255)       full red
    +hsb(120, 100%,  100%)    or    hsb(120, 255,   255)       full green
    +hsb(120, 100%,  75%)     or    hsb(120, 255,   191.25)    medium green
    +hsb(120, 100%,  50%)     or    hsb(120, 255,   127.5)     dark green
    +hsb(120, 100%,  25%)     or    hsb(120, 255,   63.75)     very dark green
    +hsb(120, 50%,   50%)     or    hsb(120, 127.5, 127.5)     pastel green
    + +

    In the HSL color system, black is at the bottom apex and white is at the top apex. However, saturation is largest at the middle of the double cone on its outer perimeter and thus at a lightness value of 50%. The most colorful or saturated colors will then be at the outer edge of the double cone at its widest part. Thus at Saturation=100% and Brightness=50%.

    + +
    hsl(0,   100%,  50%)     or    hsl(0,   255,   127.5)     full red
    +hsl(120, 100%,  100%)    or    hsl(120, 255,   255)       white
    +hsl(120, 100%,  75%)     or    hsl(120, 255,   191.25)    pastel green
    +hsl(120, 100%,  50%)     or    hsl(120, 255,   127.5)     full green
    +hsl(120, 100%,  25%)     or    hsl(120, 255,   63.75)     dark green
    +hsl(120, 50%,   50%)     or    hsl(120, 127.5, 127.5)     medium green
    + +

    One advantage of HSB or HSL over RGB is that it can be more intuitive: you can guess at the colors you want, and then tweak. It is also easier to create sets of matching colors (by keeping the hue the same and varying the brightness or lightness and saturation, for example).

    + +

    Just as the 'rgb()' functional notation has the 'rgba()' alpha counterpart, the 'hsl()' and 'hsb()' functional notations have their 'hsla()' 'hsba()' alpha counterparts. These examples specify the same color:

    + +
    hsb(120, 100%,  100%)              full green in hsb
    +hsba(120, 100%,  100%,  1.0)       the same, with an alpha value of 1.0
    +hsb(120, 255,  255)                full green in hsb
    +hsba(120, 255,  255,  1.0)         the same, with an alpha value of 1.0
    +
    +hsl(120, 100%,  50%)               full green in hsl
    +hsla(120, 100%,  50%,  1.0)        the same, with an alpha value of 1.0
    +hsl(120, 255,  127.5)              full green in hsl
    +hsla(120, 255,  127.5,  1.0)       the same, with an alpha value of 1.0
    + +

    For ImageMagick between 6.5.6-6 and 6.9.2-0, HSL (HSB) could only be specified with Hue as percent in range 0—100%, when Saturation and Lightness (Brightness) were also specified as percent in range 0—100%.

    + +

    Specify the Lab colors like this:

    +
    cielab(62.253188, 23.950124, 48.410653)
    +

    Note, the a and b components of any Lab color you specify are biased internally by 50% to ensure it fits in the quantum range (typically 0 to 65535). The bias is retained when writing to the TIFF and MIFF image formats. However, the TXT format supports negative pixel values so the bias is removed when writing to this format:

    +
    $ convert xc:#CD853F -colorspace LAB txt:
    +# ImageMagick pixel enumeration: 1,1,65535,cielab
    +0,0: (40470.8,38266.6,12314.5)  #9E17957BB01A  cielab(61.7544,21.3973,47.9163)
    +
    +$ convert xc:"cielab(61.7544,21.3973,47.9163)" -colorspace sRGB -depth 8 peru.png
    + +

    Or specify colors generically with the icc-color keyword, for example:

    +
    
    +icc-color(cmyk, 0.11, 0.48, 0.83, 0.00)  cymk
    +icc-color(rgb, 1, 0, 0)                  linear rgb
    +icc-color(rgb, red)                      linear rgb
    +icc-color(lineargray, 0.5)               linear gray
    +icc-color(srgb, 1, 0, 0)                 non-linear rgb
    +icc-color(srgb, red)                     non-linear rgb
    +icc-color(gray, 0.5)                     non-linear gray
    +
    + +

    Or specify uncalibrated device colors with the device- keyword, for example:

    +
    device-gray(0.5)
    +device-rgb(0.5, 1.0, 0.0)
    +device-cmyk(0.11, 0.48, 0.83, 0.00)
    + +

    ImageMagick also supports wide-gamut color such as Lab, LC +H, and Display-P3.

    + +

    List of Color Names

    + +

    The table below provides a list of named colors recognized by ImageMagick:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameColorRGBHex
    snowsnowrgb(255, 250, 250)#FFFAFA
    snow1snow1rgb(255, 250, 250)#FFFAFA
    snow2snow2rgb(238, 233, 233)#EEE9E9
    RosyBrown1RosyBrown1rgb(255, 193, 193)#FFC1C1
    RosyBrown2RosyBrown2rgb(238, 180, 180)#EEB4B4
    snow3snow3rgb(205, 201, 201)#CDC9C9
    LightCoralLightCoralrgb(240, 128, 128)#F08080
    IndianRed1IndianRed1rgb(255, 106, 106)#FF6A6A
    RosyBrown3RosyBrown3rgb(205, 155, 155)#CD9B9B
    IndianRed2IndianRed2rgb(238, 99, 99)#EE6363
    RosyBrownRosyBrownrgb(188, 143, 143)#BC8F8F
    brown1brown1rgb(255, 64, 64)#FF4040
    firebrick1firebrick1rgb(255, 48, 48)#FF3030
    brown2brown2rgb(238, 59, 59)#EE3B3B
    IndianRedIndianRedrgb(205, 92, 92)#CD5C5C
    IndianRed3IndianRed3rgb(205, 85, 85)#CD5555
    firebrick2firebrick2rgb(238, 44, 44)#EE2C2C
    snow4snow4rgb(139, 137, 137)#8B8989
    brown3brown3rgb(205, 51, 51)#CD3333
    redredrgb(255, 0, 0)#FF0000
    red1red1rgb(255, 0, 0)#FF0000
    RosyBrown4RosyBrown4rgb(139, 105, 105)#8B6969
    firebrick3firebrick3rgb(205, 38, 38)#CD2626
    red2red2rgb(238, 0, 0)#EE0000
    firebrickfirebrickrgb(178, 34, 34)#B22222
    brownbrownrgb(165, 42, 42)#A52A2A
    red3red3rgb(205, 0, 0)#CD0000
    IndianRed4IndianRed4rgb(139, 58, 58)#8B3A3A
    brown4brown4rgb(139, 35, 35)#8B2323
    firebrick4firebrick4rgb(139, 26, 26)#8B1A1A
    DarkRedDarkRedrgb(139, 0, 0)#8B0000
    red4red4rgb(139, 0, 0)#8B0000
    maroonmaroon (SVG compliance)rgb(128, 0, 0)#800000
    LightPink1LightPink1rgb(255, 174, 185)#FFAEB9
    LightPink3LightPink3rgb(205, 140, 149)#CD8C95
    LightPink4LightPink4rgb(139, 95, 101)#8B5F65
    LightPink2LightPink2rgb(238, 162, 173)#EEA2AD
    LightPinkLightPinkrgb(255, 182, 193)#FFB6C1
    pinkpinkrgb(255, 192, 203)#FFC0CB
    crimsoncrimsonrgb(220, 20, 60)#DC143C
    pink1pink1rgb(255, 181, 197)#FFB5C5
    pink2pink2rgb(238, 169, 184)#EEA9B8
    pink3pink3rgb(205, 145, 158)#CD919E
    pink4pink4rgb(139, 99, 108)#8B636C
    PaleVioletRed4PaleVioletRed4rgb(139, 71, 93)#8B475D
    PaleVioletRedPaleVioletRedrgb(219, 112, 147)#DB7093
    PaleVioletRed2PaleVioletRed2rgb(238, 121, 159)#EE799F
    PaleVioletRed1PaleVioletRed1rgb(255, 130, 171)#FF82AB
    PaleVioletRed3PaleVioletRed3rgb(205, 104, 137)#CD6889
    LavenderBlushLavenderBlushrgb(255, 240, 245)#FFF0F5
    LavenderBlush1LavenderBlush1rgb(255, 240, 245)#FFF0F5
    LavenderBlush3LavenderBlush3rgb(205, 193, 197)#CDC1C5
    LavenderBlush2LavenderBlush2rgb(238, 224, 229)#EEE0E5
    LavenderBlush4LavenderBlush4rgb(139, 131, 134)#8B8386
    maroonmaroon (X11 compliance)rgb(176, 48, 96)#B03060
    HotPink3HotPink3rgb(205, 96, 144)#CD6090
    VioletRed3VioletRed3rgb(205, 50, 120)#CD3278
    VioletRed1VioletRed1rgb(255, 62, 150)#FF3E96
    VioletRed2VioletRed2rgb(238, 58, 140)#EE3A8C
    VioletRed4VioletRed4rgb(139, 34, 82)#8B2252
    HotPink2HotPink2rgb(238, 106, 167)#EE6AA7
    HotPink1HotPink1rgb(255, 110, 180)#FF6EB4
    HotPink4HotPink4rgb(139, 58, 98)#8B3A62
    HotPinkHotPinkrgb(255, 105, 180)#FF69B4
    DeepPinkDeepPinkrgb(255, 20, 147)#FF1493
    DeepPink1DeepPink1rgb(255, 20, 147)#FF1493
    DeepPink2DeepPink2rgb(238, 18, 137)#EE1289
    DeepPink3DeepPink3rgb(205, 16, 118)#CD1076
    DeepPink4DeepPink4rgb(139, 10, 80)#8B0A50
    maroon1maroon1rgb(255, 52, 179)#FF34B3
    maroon2maroon2rgb(238, 48, 167)#EE30A7
    maroon3maroon3rgb(205, 41, 144)#CD2990
    maroon4maroon4rgb(139, 28, 98)#8B1C62
    MediumVioletRedMediumVioletRedrgb(199, 21, 133)#C71585
    VioletRedVioletRedrgb(208, 32, 144)#D02090
    orchid2orchid2rgb(238, 122, 233)#EE7AE9
    orchidorchidrgb(218, 112, 214)#DA70D6
    orchid1orchid1rgb(255, 131, 250)#FF83FA
    orchid3orchid3rgb(205, 105, 201)#CD69C9
    orchid4orchid4rgb(139, 71, 137)#8B4789
    thistle1thistle1rgb(255, 225, 255)#FFE1FF
    thistle2thistle2rgb(238, 210, 238)#EED2EE
    plum1plum1rgb(255, 187, 255)#FFBBFF
    plum2plum2rgb(238, 174, 238)#EEAEEE
    thistlethistlergb(216, 191, 216)#D8BFD8
    thistle3thistle3rgb(205, 181, 205)#CDB5CD
    plumplumrgb(221, 160, 221)#DDA0DD
    violetvioletrgb(238, 130, 238)#EE82EE
    plum3plum3rgb(205, 150, 205)#CD96CD
    thistle4thistle4rgb(139, 123, 139)#8B7B8B
    fuchsiafuchsiargb(255, 0, 255)#FF00FF
    magentamagentargb(255, 0, 255)#FF00FF
    magenta1magenta1rgb(255, 0, 255)#FF00FF
    plum4plum4rgb(139, 102, 139)#8B668B
    magenta2magenta2rgb(238, 0, 238)#EE00EE
    magenta3magenta3rgb(205, 0, 205)#CD00CD
    DarkMagentaDarkMagentargb(139, 0, 139)#8B008B
    magenta4magenta4rgb(139, 0, 139)#8B008B
    purplepurple (SVG compliance)rgb(128, 0, 128)#800080
    MediumOrchidMediumOrchidrgb(186, 85, 211)#BA55D3
    MediumOrchid1MediumOrchid1rgb(224, 102, 255)#E066FF
    MediumOrchid2MediumOrchid2rgb(209, 95, 238)#D15FEE
    MediumOrchid3MediumOrchid3rgb(180, 82, 205)#B452CD
    MediumOrchid4MediumOrchid4rgb(122, 55, 139)#7A378B
    DarkVioletDarkVioletrgb(148, 0, 211)#9400D3
    DarkOrchidDarkOrchidrgb(153, 50, 204)#9932CC
    DarkOrchid1DarkOrchid1rgb(191, 62, 255)#BF3EFF
    DarkOrchid3DarkOrchid3rgb(154, 50, 205)#9A32CD
    DarkOrchid2DarkOrchid2rgb(178, 58, 238)#B23AEE
    DarkOrchid4DarkOrchid4rgb(104, 34, 139)#68228B
    purplepurple (X11 compliance)rgb(160, 32, 240)#A020F0
    indigoindigorgb( 75, 0, 130)#4B0082
    BlueVioletBlueVioletrgb(138, 43, 226)#8A2BE2
    purple2purple2rgb(145, 44, 238)#912CEE
    purple3purple3rgb(125, 38, 205)#7D26CD
    purple4purple4rgb( 85, 26, 139)#551A8B
    purple1purple1rgb(155, 48, 255)#9B30FF
    MediumPurpleMediumPurplergb(147, 112, 219)#9370DB
    MediumPurple1MediumPurple1rgb(171, 130, 255)#AB82FF
    MediumPurple2MediumPurple2rgb(159, 121, 238)#9F79EE
    MediumPurple3MediumPurple3rgb(137, 104, 205)#8968CD
    MediumPurple4MediumPurple4rgb( 93, 71, 139)#5D478B
    DarkSlateBlueDarkSlateBluergb( 72, 61, 139)#483D8B
    LightSlateBlueLightSlateBluergb(132, 112, 255)#8470FF
    MediumSlateBlueMediumSlateBluergb(123, 104, 238)#7B68EE
    SlateBlueSlateBluergb(106, 90, 205)#6A5ACD
    SlateBlue1SlateBlue1rgb(131, 111, 255)#836FFF
    SlateBlue2SlateBlue2rgb(122, 103, 238)#7A67EE
    SlateBlue3SlateBlue3rgb(105, 89, 205)#6959CD
    SlateBlue4SlateBlue4rgb( 71, 60, 139)#473C8B
    GhostWhiteGhostWhitergb(248, 248, 255)#F8F8FF
    lavenderlavenderrgb(230, 230, 250)#E6E6FA
    bluebluergb( 0, 0, 255)#0000FF
    blue1blue1rgb( 0, 0, 255)#0000FF
    blue2blue2rgb( 0, 0, 238)#0000EE
    blue3blue3rgb( 0, 0, 205)#0000CD
    MediumBlueMediumBluergb( 0, 0, 205)#0000CD
    blue4blue4rgb( 0, 0, 139)#00008B
    DarkBlueDarkBluergb( 0, 0, 139)#00008B
    MidnightBlueMidnightBluergb( 25, 25, 112)#191970
    navynavyrgb( 0, 0, 128)#000080
    NavyBlueNavyBluergb( 0, 0, 128)#000080
    RoyalBlueRoyalBluergb( 65, 105, 225)#4169E1
    RoyalBlue1RoyalBlue1rgb( 72, 118, 255)#4876FF
    RoyalBlue2RoyalBlue2rgb( 67, 110, 238)#436EEE
    RoyalBlue3RoyalBlue3rgb( 58, 95, 205)#3A5FCD
    RoyalBlue4RoyalBlue4rgb( 39, 64, 139)#27408B
    CornflowerBlueCornflowerBluergb(100, 149, 237)#6495ED
    LightSteelBlueLightSteelBluergb(176, 196, 222)#B0C4DE
    LightSteelBlue1LightSteelBlue1rgb(202, 225, 255)#CAE1FF
    LightSteelBlue2LightSteelBlue2rgb(188, 210, 238)#BCD2EE
    LightSteelBlue3LightSteelBlue3rgb(162, 181, 205)#A2B5CD
    LightSteelBlue4LightSteelBlue4rgb(110, 123, 139)#6E7B8B
    SlateGray4SlateGray4rgb(108, 123, 139)#6C7B8B
    SlateGray1SlateGray1rgb(198, 226, 255)#C6E2FF
    SlateGray2SlateGray2rgb(185, 211, 238)#B9D3EE
    SlateGray3SlateGray3rgb(159, 182, 205)#9FB6CD
    LightSlateGrayLightSlateGrayrgb(119, 136, 153)#778899
    LightSlateGreyLightSlateGreyrgb(119, 136, 153)#778899
    SlateGraySlateGrayrgb(112, 128, 144)#708090
    SlateGreySlateGreyrgb(112, 128, 144)#708090
    DodgerBlueDodgerBluergb( 30, 144, 255)#1E90FF
    DodgerBlue1DodgerBlue1rgb( 30, 144, 255)#1E90FF
    DodgerBlue2DodgerBlue2rgb( 28, 134, 238)#1C86EE
    DodgerBlue4DodgerBlue4rgb( 16, 78, 139)#104E8B
    DodgerBlue3DodgerBlue3rgb( 24, 116, 205)#1874CD
    AliceBlueAliceBluergb(240, 248, 255)#F0F8FF
    SteelBlue4SteelBlue4rgb( 54, 100, 139)#36648B
    SteelBlueSteelBluergb( 70, 130, 180)#4682B4
    SteelBlue1SteelBlue1rgb( 99, 184, 255)#63B8FF
    SteelBlue2SteelBlue2rgb( 92, 172, 238)#5CACEE
    SteelBlue3SteelBlue3rgb( 79, 148, 205)#4F94CD
    SkyBlue4SkyBlue4rgb( 74, 112, 139)#4A708B
    SkyBlue1SkyBlue1rgb(135, 206, 255)#87CEFF
    SkyBlue2SkyBlue2rgb(126, 192, 238)#7EC0EE
    SkyBlue3SkyBlue3rgb(108, 166, 205)#6CA6CD
    LightSkyBlueLightSkyBluergb(135, 206, 250)#87CEFA
    LightSkyBlue4LightSkyBlue4rgb( 96, 123, 139)#607B8B
    LightSkyBlue1LightSkyBlue1rgb(176, 226, 255)#B0E2FF
    LightSkyBlue2LightSkyBlue2rgb(164, 211, 238)#A4D3EE
    LightSkyBlue3LightSkyBlue3rgb(141, 182, 205)#8DB6CD
    SkyBlueSkyBluergb(135, 206, 235)#87CEEB
    LightBlue3LightBlue3rgb(154, 192, 205)#9AC0CD
    DeepSkyBlueDeepSkyBluergb( 0, 191, 255)#00BFFF
    DeepSkyBlue1DeepSkyBlue1rgb( 0, 191, 255)#00BFFF
    DeepSkyBlue2DeepSkyBlue2rgb( 0, 178, 238)#00B2EE
    DeepSkyBlue4DeepSkyBlue4rgb( 0, 104, 139)#00688B
    DeepSkyBlue3DeepSkyBlue3rgb( 0, 154, 205)#009ACD
    LightBlue1LightBlue1rgb(191, 239, 255)#BFEFFF
    LightBlue2LightBlue2rgb(178, 223, 238)#B2DFEE
    LightBlueLightBluergb(173, 216, 230)#ADD8E6
    LightBlue4LightBlue4rgb(104, 131, 139)#68838B
    PowderBluePowderBluergb(176, 224, 230)#B0E0E6
    CadetBlue1CadetBlue1rgb(152, 245, 255)#98F5FF
    CadetBlue2CadetBlue2rgb(142, 229, 238)#8EE5EE
    CadetBlue3CadetBlue3rgb(122, 197, 205)#7AC5CD
    CadetBlue4CadetBlue4rgb( 83, 134, 139)#53868B
    turquoise1turquoise1rgb( 0, 245, 255)#00F5FF
    turquoise2turquoise2rgb( 0, 229, 238)#00E5EE
    turquoise3turquoise3rgb( 0, 197, 205)#00C5CD
    turquoise4turquoise4rgb( 0, 134, 139)#00868B
    cadet bluecadet bluergb( 95, 158, 160)#5F9EA0
    CadetBlueCadetBluergb( 95, 158, 160)#5F9EA0
    DarkTurquoiseDarkTurquoisergb( 0, 206, 209)#00CED1
    azureazurergb(240, 255, 255)#F0FFFF
    azure1azure1rgb(240, 255, 255)#F0FFFF
    LightCyanLightCyanrgb(224, 255, 255)#E0FFFF
    LightCyan1LightCyan1rgb(224, 255, 255)#E0FFFF
    azure2azure2rgb(224, 238, 238)#E0EEEE
    LightCyan2LightCyan2rgb(209, 238, 238)#D1EEEE
    PaleTurquoise1PaleTurquoise1rgb(187, 255, 255)#BBFFFF
    PaleTurquoisePaleTurquoisergb(175, 238, 238)#AFEEEE
    PaleTurquoise2PaleTurquoise2rgb(174, 238, 238)#AEEEEE
    DarkSlateGray1DarkSlateGray1rgb(151, 255, 255)#97FFFF
    azure3azure3rgb(193, 205, 205)#C1CDCD
    LightCyan3LightCyan3rgb(180, 205, 205)#B4CDCD
    DarkSlateGray2DarkSlateGray2rgb(141, 238, 238)#8DEEEE
    PaleTurquoise3PaleTurquoise3rgb(150, 205, 205)#96CDCD
    DarkSlateGray3DarkSlateGray3rgb(121, 205, 205)#79CDCD
    azure4azure4rgb(131, 139, 139)#838B8B
    LightCyan4LightCyan4rgb(122, 139, 139)#7A8B8B
    aquaaquargb( 0, 255, 255)#00FFFF
    cyancyanrgb( 0, 255, 255)#00FFFF
    cyan1cyan1rgb( 0, 255, 255)#00FFFF
    PaleTurquoise4PaleTurquoise4rgb(102, 139, 139)#668B8B
    cyan2cyan2rgb( 0, 238, 238)#00EEEE
    DarkSlateGray4DarkSlateGray4rgb( 82, 139, 139)#528B8B
    cyan3cyan3rgb( 0, 205, 205)#00CDCD
    cyan4cyan4rgb( 0, 139, 139)#008B8B
    DarkCyanDarkCyanrgb( 0, 139, 139)#008B8B
    tealtealrgb( 0, 128, 128)#008080
    DarkSlateGrayDarkSlateGrayrgb( 47, 79, 79)#2F4F4F
    DarkSlateGreyDarkSlateGreyrgb( 47, 79, 79)#2F4F4F
    MediumTurquoiseMediumTurquoisergb( 72, 209, 204)#48D1CC
    LightSeaGreenLightSeaGreenrgb( 32, 178, 170)#20B2AA
    turquoiseturquoisergb( 64, 224, 208)#40E0D0
    aquamarine4aquamarine4rgb( 69, 139, 116)#458B74
    aquamarineaquamarinergb(127, 255, 212)#7FFFD4
    aquamarine1aquamarine1rgb(127, 255, 212)#7FFFD4
    aquamarine2aquamarine2rgb(118, 238, 198)#76EEC6
    aquamarine3aquamarine3rgb(102, 205, 170)#66CDAA
    MediumAquamarineMediumAquamarinergb(102, 205, 170)#66CDAA
    MediumSpringGreenMediumSpringGreenrgb( 0, 250, 154)#00FA9A
    MintCreamMintCreamrgb(245, 255, 250)#F5FFFA
    SpringGreenSpringGreenrgb( 0, 255, 127)#00FF7F
    SpringGreen1SpringGreen1rgb( 0, 255, 127)#00FF7F
    SpringGreen2SpringGreen2rgb( 0, 238, 118)#00EE76
    SpringGreen3SpringGreen3rgb( 0, 205, 102)#00CD66
    SpringGreen4SpringGreen4rgb( 0, 139, 69)#008B45
    MediumSeaGreenMediumSeaGreenrgb( 60, 179, 113)#3CB371
    SeaGreenSeaGreenrgb( 46, 139, 87)#2E8B57
    SeaGreen3SeaGreen3rgb( 67, 205, 128)#43CD80
    SeaGreen1SeaGreen1rgb( 84, 255, 159)#54FF9F
    SeaGreen4SeaGreen4rgb( 46, 139, 87)#2E8B57
    SeaGreen2SeaGreen2rgb( 78, 238, 148)#4EEE94
    MediumForestGreenMediumForestGreenrgb( 50, 129, 75)#32814B
    honeydewhoneydewrgb(240, 255, 240)#F0FFF0
    honeydew1honeydew1rgb(240, 255, 240)#F0FFF0
    honeydew2honeydew2rgb(224, 238, 224)#E0EEE0
    DarkSeaGreen1DarkSeaGreen1rgb(193, 255, 193)#C1FFC1
    DarkSeaGreen2DarkSeaGreen2rgb(180, 238, 180)#B4EEB4
    PaleGreen1PaleGreen1rgb(154, 255, 154)#9AFF9A
    PaleGreenPaleGreenrgb(152, 251, 152)#98FB98
    honeydew3honeydew3rgb(193, 205, 193)#C1CDC1
    LightGreenLightGreenrgb(144, 238, 144)#90EE90
    PaleGreen2PaleGreen2rgb(144, 238, 144)#90EE90
    DarkSeaGreen3DarkSeaGreen3rgb(155, 205, 155)#9BCD9B
    DarkSeaGreenDarkSeaGreenrgb(143, 188, 143)#8FBC8F
    PaleGreen3PaleGreen3rgb(124, 205, 124)#7CCD7C
    honeydew4honeydew4rgb(131, 139, 131)#838B83
    green1green1rgb( 0, 255, 0)#00FF00
    limelimergb( 0, 255, 0)#00FF00
    LimeGreenLimeGreenrgb( 50, 205, 50)#32CD32
    DarkSeaGreen4DarkSeaGreen4rgb(105, 139, 105)#698B69
    green2green2rgb( 0, 238, 0)#00EE00
    PaleGreen4PaleGreen4rgb( 84, 139, 84)#548B54
    green3green3rgb( 0, 205, 0)#00CD00
    ForestGreenForestGreenrgb( 34, 139, 34)#228B22
    green4green4rgb( 0, 139, 0)#008B00
    greengreenrgb( 0, 128, 0)#008000
    DarkGreenDarkGreenrgb( 0, 100, 0)#006400
    LawnGreenLawnGreenrgb(124, 252, 0)#7CFC00
    chartreusechartreusergb(127, 255, 0)#7FFF00
    chartreuse1chartreuse1rgb(127, 255, 0)#7FFF00
    chartreuse2chartreuse2rgb(118, 238, 0)#76EE00
    chartreuse3chartreuse3rgb(102, 205, 0)#66CD00
    chartreuse4chartreuse4rgb( 69, 139, 0)#458B00
    GreenYellowGreenYellowrgb(173, 255, 47)#ADFF2F
    DarkOliveGreen3DarkOliveGreen3rgb(162, 205, 90)#A2CD5A
    DarkOliveGreen1DarkOliveGreen1rgb(202, 255, 112)#CAFF70
    DarkOliveGreen2DarkOliveGreen2rgb(188, 238, 104)#BCEE68
    DarkOliveGreen4DarkOliveGreen4rgb(110, 139, 61)#6E8B3D
    DarkOliveGreenDarkOliveGreenrgb( 85, 107, 47)#556B2F
    OliveDrabOliveDrabrgb(107, 142, 35)#6B8E23
    OliveDrab1OliveDrab1rgb(192, 255, 62)#C0FF3E
    OliveDrab2OliveDrab2rgb(179, 238, 58)#B3EE3A
    OliveDrab3OliveDrab3rgb(154, 205, 50)#9ACD32
    YellowGreenYellowGreenrgb(154, 205, 50)#9ACD32
    OliveDrab4OliveDrab4rgb(105, 139, 34)#698B22
    ivoryivoryrgb(255, 255, 240)#FFFFF0
    ivory1ivory1rgb(255, 255, 240)#FFFFF0
    LightYellowLightYellowrgb(255, 255, 224)#FFFFE0
    LightYellow1LightYellow1rgb(255, 255, 224)#FFFFE0
    beigebeigergb(245, 245, 220)#F5F5DC
    ivory2ivory2rgb(238, 238, 224)#EEEEE0
    LightGoldenrodYellowLightGoldenrodYellowrgb(250, 250, 210)#FAFAD2
    LightYellow2LightYellow2rgb(238, 238, 209)#EEEED1
    ivory3ivory3rgb(205, 205, 193)#CDCDC1
    LightYellow3LightYellow3rgb(205, 205, 180)#CDCDB4
    ivory4ivory4rgb(139, 139, 131)#8B8B83
    LightYellow4LightYellow4rgb(139, 139, 122)#8B8B7A
    yellowyellowrgb(255, 255, 0)#FFFF00
    yellow1yellow1rgb(255, 255, 0)#FFFF00
    yellow2yellow2rgb(238, 238, 0)#EEEE00
    yellow3yellow3rgb(205, 205, 0)#CDCD00
    yellow4yellow4rgb(139, 139, 0)#8B8B00
    oliveolivergb(128, 128, 0)#808000
    DarkKhakiDarkKhakirgb(189, 183, 107)#BDB76B
    khaki2khaki2rgb(238, 230, 133)#EEE685
    LemonChiffon4LemonChiffon4rgb(139, 137, 112)#8B8970
    khaki1khaki1rgb(255, 246, 143)#FFF68F
    khaki3khaki3rgb(205, 198, 115)#CDC673
    khaki4khaki4rgb(139, 134, 78)#8B864E
    PaleGoldenrodPaleGoldenrodrgb(238, 232, 170)#EEE8AA
    LemonChiffonLemonChiffonrgb(255, 250, 205)#FFFACD
    LemonChiffon1LemonChiffon1rgb(255, 250, 205)#FFFACD
    khakikhakirgb(240, 230, 140)#F0E68C
    LemonChiffon3LemonChiffon3rgb(205, 201, 165)#CDC9A5
    LemonChiffon2LemonChiffon2rgb(238, 233, 191)#EEE9BF
    MediumGoldenRodMediumGoldenRodrgb(209, 193, 102)#D1C166
    cornsilk4cornsilk4rgb(139, 136, 120)#8B8878
    goldgoldrgb(255, 215, 0)#FFD700
    gold1gold1rgb(255, 215, 0)#FFD700
    gold2gold2rgb(238, 201, 0)#EEC900
    gold3gold3rgb(205, 173, 0)#CDAD00
    gold4gold4rgb(139, 117, 0)#8B7500
    LightGoldenrodLightGoldenrodrgb(238, 221, 130)#EEDD82
    LightGoldenrod4LightGoldenrod4rgb(139, 129, 76)#8B814C
    LightGoldenrod1LightGoldenrod1rgb(255, 236, 139)#FFEC8B
    LightGoldenrod3LightGoldenrod3rgb(205, 190, 112)#CDBE70
    LightGoldenrod2LightGoldenrod2rgb(238, 220, 130)#EEDC82
    cornsilk3cornsilk3rgb(205, 200, 177)#CDC8B1
    cornsilk2cornsilk2rgb(238, 232, 205)#EEE8CD
    cornsilkcornsilkrgb(255, 248, 220)#FFF8DC
    cornsilk1cornsilk1rgb(255, 248, 220)#FFF8DC
    goldenrodgoldenrodrgb(218, 165, 32)#DAA520
    goldenrod1goldenrod1rgb(255, 193, 37)#FFC125
    goldenrod2goldenrod2rgb(238, 180, 34)#EEB422
    goldenrod3goldenrod3rgb(205, 155, 29)#CD9B1D
    goldenrod4goldenrod4rgb(139, 105, 20)#8B6914
    DarkGoldenrodDarkGoldenrodrgb(184, 134, 11)#B8860B
    DarkGoldenrod1DarkGoldenrod1rgb(255, 185, 15)#FFB90F
    DarkGoldenrod2DarkGoldenrod2rgb(238, 173, 14)#EEAD0E
    DarkGoldenrod3DarkGoldenrod3rgb(205, 149, 12)#CD950C
    DarkGoldenrod4DarkGoldenrod4rgb(139, 101, 8)#8B6508
    FloralWhiteFloralWhitergb(255, 250, 240)#FFFAF0
    wheat2wheat2rgb(238, 216, 174)#EED8AE
    OldLaceOldLacergb(253, 245, 230)#FDF5E6
    wheatwheatrgb(245, 222, 179)#F5DEB3
    wheat1wheat1rgb(255, 231, 186)#FFE7BA
    wheat3wheat3rgb(205, 186, 150)#CDBA96
    orangeorangergb(255, 165, 0)#FFA500
    orange1orange1rgb(255, 165, 0)#FFA500
    orange2orange2rgb(238, 154, 0)#EE9A00
    orange3orange3rgb(205, 133, 0)#CD8500
    orange4orange4rgb(139, 90, 0)#8B5A00
    wheat4wheat4rgb(139, 126, 102)#8B7E66
    moccasinmoccasinrgb(255, 228, 181)#FFE4B5
    PapayaWhipPapayaWhiprgb(255, 239, 213)#FFEFD5
    NavajoWhite3NavajoWhite3rgb(205, 179, 139)#CDB38B
    BlanchedAlmondBlanchedAlmondrgb(255, 235, 205)#FFEBCD
    NavajoWhiteNavajoWhitergb(255, 222, 173)#FFDEAD
    NavajoWhite1NavajoWhite1rgb(255, 222, 173)#FFDEAD
    NavajoWhite2NavajoWhite2rgb(238, 207, 161)#EECFA1
    NavajoWhite4NavajoWhite4rgb(139, 121, 94)#8B795E
    AntiqueWhite4AntiqueWhite4rgb(139, 131, 120)#8B8378
    AntiqueWhiteAntiqueWhitergb(250, 235, 215)#FAEBD7
    tantanrgb(210, 180, 140)#D2B48C
    bisque4bisque4rgb(139, 125, 107)#8B7D6B
    burlywoodburlywoodrgb(222, 184, 135)#DEB887
    AntiqueWhite2AntiqueWhite2rgb(238, 223, 204)#EEDFCC
    burlywood1burlywood1rgb(255, 211, 155)#FFD39B
    burlywood3burlywood3rgb(205, 170, 125)#CDAA7D
    burlywood2burlywood2rgb(238, 197, 145)#EEC591
    AntiqueWhite1AntiqueWhite1rgb(255, 239, 219)#FFEFDB
    burlywood4burlywood4rgb(139, 115, 85)#8B7355
    AntiqueWhite3AntiqueWhite3rgb(205, 192, 176)#CDC0B0
    DarkOrangeDarkOrangergb(255, 140, 0)#FF8C00
    bisque2bisque2rgb(238, 213, 183)#EED5B7
    bisquebisquergb(255, 228, 196)#FFE4C4
    bisque1bisque1rgb(255, 228, 196)#FFE4C4
    bisque3bisque3rgb(205, 183, 158)#CDB79E
    DarkOrange1DarkOrange1rgb(255, 127, 0)#FF7F00
    linenlinenrgb(250, 240, 230)#FAF0E6
    DarkOrange2DarkOrange2rgb(238, 118, 0)#EE7600
    DarkOrange3DarkOrange3rgb(205, 102, 0)#CD6600
    DarkOrange4DarkOrange4rgb(139, 69, 0)#8B4500
    peruperurgb(205, 133, 63)#CD853F
    tan1tan1rgb(255, 165, 79)#FFA54F
    tan2tan2rgb(238, 154, 73)#EE9A49
    tan3tan3rgb(205, 133, 63)#CD853F
    tan4tan4rgb(139, 90, 43)#8B5A2B
    PeachPuffPeachPuffrgb(255, 218, 185)#FFDAB9
    PeachPuff1PeachPuff1rgb(255, 218, 185)#FFDAB9
    PeachPuff4PeachPuff4rgb(139, 119, 101)#8B7765
    PeachPuff2PeachPuff2rgb(238, 203, 173)#EECBAD
    PeachPuff3PeachPuff3rgb(205, 175, 149)#CDAF95
    SandyBrownSandyBrownrgb(244, 164, 96)#F4A460
    seashell4seashell4rgb(139, 134, 130)#8B8682
    seashell2seashell2rgb(238, 229, 222)#EEE5DE
    seashell3seashell3rgb(205, 197, 191)#CDC5BF
    chocolatechocolatergb(210, 105, 30)#D2691E
    chocolate1chocolate1rgb(255, 127, 36)#FF7F24
    chocolate2chocolate2rgb(238, 118, 33)#EE7621
    chocolate3chocolate3rgb(205, 102, 29)#CD661D
    chocolate4chocolate4rgb(139, 69, 19)#8B4513
    SaddleBrownSaddleBrownrgb(139, 69, 19)#8B4513
    seashellseashellrgb(255, 245, 238)#FFF5EE
    seashell1seashell1rgb(255, 245, 238)#FFF5EE
    sienna4sienna4rgb(139, 71, 38)#8B4726
    siennasiennargb(160, 82, 45)#A0522D
    sienna1sienna1rgb(255, 130, 71)#FF8247
    sienna2sienna2rgb(238, 121, 66)#EE7942
    sienna3sienna3rgb(205, 104, 57)#CD6839
    LightSalmon3LightSalmon3rgb(205, 129, 98)#CD8162
    LightSalmonLightSalmonrgb(255, 160, 122)#FFA07A
    LightSalmon1LightSalmon1rgb(255, 160, 122)#FFA07A
    LightSalmon4LightSalmon4rgb(139, 87, 66)#8B5742
    LightSalmon2LightSalmon2rgb(238, 149, 114)#EE9572
    coralcoralrgb(255, 127, 80)#FF7F50
    OrangeRedOrangeRedrgb(255, 69, 0)#FF4500
    OrangeRed1OrangeRed1rgb(255, 69, 0)#FF4500
    OrangeRed2OrangeRed2rgb(238, 64, 0)#EE4000
    OrangeRed3OrangeRed3rgb(205, 55, 0)#CD3700
    OrangeRed4OrangeRed4rgb(139, 37, 0)#8B2500
    DarkSalmonDarkSalmonrgb(233, 150, 122)#E9967A
    salmon1salmon1rgb(255, 140, 105)#FF8C69
    salmon2salmon2rgb(238, 130, 98)#EE8262
    salmon3salmon3rgb(205, 112, 84)#CD7054
    salmon4salmon4rgb(139, 76, 57)#8B4C39
    coral1coral1rgb(255, 114, 86)#FF7256
    coral2coral2rgb(238, 106, 80)#EE6A50
    coral3coral3rgb(205, 91, 69)#CD5B45
    coral4coral4rgb(139, 62, 47)#8B3E2F
    tomato4tomato4rgb(139, 54, 38)#8B3626
    tomatotomatorgb(255, 99, 71)#FF6347
    tomato1tomato1rgb(255, 99, 71)#FF6347
    tomato2tomato2rgb(238, 92, 66)#EE5C42
    tomato3tomato3rgb(205, 79, 57)#CD4F39
    MistyRose4MistyRose4rgb(139, 125, 123)#8B7D7B
    MistyRose2MistyRose2rgb(238, 213, 210)#EED5D2
    MistyRoseMistyRosergb(255, 228, 225)#FFE4E1
    MistyRose1MistyRose1rgb(255, 228, 225)#FFE4E1
    salmonsalmonrgb(250, 128, 114)#FA8072
    MistyRose3MistyRose3rgb(205, 183, 181)#CDB7B5
    whitewhitergb(255, 255, 255)#FFFFFF
    gray100gray100rgb(255, 255, 255)#FFFFFF
    grey100grey100rgb(255, 255, 255)#FFFFFF
    grey100grey100rgb(255, 255, 255)#FFFFFF
    gray99gray99rgb(252, 252, 252)#FCFCFC
    grey99grey99rgb(252, 252, 252)#FCFCFC
    gray98gray98rgb(250, 250, 250)#FAFAFA
    grey98grey98rgb(250, 250, 250)#FAFAFA
    gray97gray97rgb(247, 247, 247)#F7F7F7
    grey97grey97rgb(247, 247, 247)#F7F7F7
    gray96gray96rgb(245, 245, 245)#F5F5F5
    grey96grey96rgb(245, 245, 245)#F5F5F5
    WhiteSmokeWhiteSmokergb(245, 245, 245)#F5F5F5
    gray95gray95rgb(242, 242, 242)#F2F2F2
    grey95grey95rgb(242, 242, 242)#F2F2F2
    gray94gray94rgb(240, 240, 240)#F0F0F0
    grey94grey94rgb(240, 240, 240)#F0F0F0
    gray93gray93rgb(237, 237, 237)#EDEDED
    grey93grey93rgb(237, 237, 237)#EDEDED
    gray92gray92rgb(235, 235, 235)#EBEBEB
    grey92grey92rgb(235, 235, 235)#EBEBEB
    gray91gray91rgb(232, 232, 232)#E8E8E8
    grey91grey91rgb(232, 232, 232)#E8E8E8
    gray90gray90rgb(229, 229, 229)#E5E5E5
    grey90grey90rgb(229, 229, 229)#E5E5E5
    gray89gray89rgb(227, 227, 227)#E3E3E3
    grey89grey89rgb(227, 227, 227)#E3E3E3
    gray88gray88rgb(224, 224, 224)#E0E0E0
    grey88grey88rgb(224, 224, 224)#E0E0E0
    gray87gray87rgb(222, 222, 222)#DEDEDE
    grey87grey87rgb(222, 222, 222)#DEDEDE
    gainsborogainsbororgb(220, 220, 220)#DCDCDC
    gray86gray86rgb(219, 219, 219)#DBDBDB
    grey86grey86rgb(219, 219, 219)#DBDBDB
    gray85gray85rgb(217, 217, 217)#D9D9D9
    grey85grey85rgb(217, 217, 217)#D9D9D9
    gray84gray84rgb(214, 214, 214)#D6D6D6
    grey84grey84rgb(214, 214, 214)#D6D6D6
    gray83gray83rgb(212, 212, 212)#D4D4D4
    grey83grey83rgb(212, 212, 212)#D4D4D4
    LightGrayLightGrayrgb(211, 211, 211)#D3D3D3
    LightGreyLightGreyrgb(211, 211, 211)#D3D3D3
    gray82gray82rgb(209, 209, 209)#D1D1D1
    grey82grey82rgb(209, 209, 209)#D1D1D1
    gray81gray81rgb(207, 207, 207)#CFCFCF
    grey81grey81rgb(207, 207, 207)#CFCFCF
    gray80gray80rgb(204, 204, 204)#CCCCCC
    grey80grey80rgb(204, 204, 204)#CCCCCC
    gray79gray79rgb(201, 201, 201)#C9C9C9
    grey79grey79rgb(201, 201, 201)#C9C9C9
    gray78gray78rgb(199, 199, 199)#C7C7C7
    grey78grey78rgb(199, 199, 199)#C7C7C7
    gray77gray77rgb(196, 196, 196)#C4C4C4
    grey77grey77rgb(196, 196, 196)#C4C4C4
    gray76gray76rgb(194, 194, 194)#C2C2C2
    grey76grey76rgb(194, 194, 194)#C2C2C2
    silversilverrgb(192, 192, 192)#C0C0C0
    gray75gray75rgb(191, 191, 191)#BFBFBF
    grey75grey75rgb(191, 191, 191)#BFBFBF
    gray74gray74rgb(189, 189, 189)#BDBDBD
    grey74grey74rgb(189, 189, 189)#BDBDBD
    gray73gray73rgb(186, 186, 186)#BABABA
    grey73grey73rgb(186, 186, 186)#BABABA
    gray72gray72rgb(184, 184, 184)#B8B8B8
    grey72grey72rgb(184, 184, 184)#B8B8B8
    gray71gray71rgb(181, 181, 181)#B5B5B5
    grey71grey71rgb(181, 181, 181)#B5B5B5
    gray70gray70rgb(179, 179, 179)#B3B3B3
    grey70grey70rgb(179, 179, 179)#B3B3B3
    gray69gray69rgb(176, 176, 176)#B0B0B0
    grey69grey69rgb(176, 176, 176)#B0B0B0
    gray68gray68rgb(173, 173, 173)#ADADAD
    grey68grey68rgb(173, 173, 173)#ADADAD
    gray67gray67rgb(171, 171, 171)#ABABAB
    grey67grey67rgb(171, 171, 171)#ABABAB
    DarkGrayDarkGrayrgb(169, 169, 169)#A9A9A9
    DarkGreyDarkGreyrgb(169, 169, 169)#A9A9A9
    gray66gray66rgb(168, 168, 168)#A8A8A8
    grey66grey66rgb(168, 168, 168)#A8A8A8
    gray65gray65rgb(166, 166, 166)#A6A6A6
    grey65grey65rgb(166, 166, 166)#A6A6A6
    gray64gray64rgb(163, 163, 163)#A3A3A3
    grey64grey64rgb(163, 163, 163)#A3A3A3
    gray63gray63rgb(161, 161, 161)#A1A1A1
    grey63grey63rgb(161, 161, 161)#A1A1A1
    gray62gray62rgb(158, 158, 158)#9E9E9E
    grey62grey62rgb(158, 158, 158)#9E9E9E
    gray61gray61rgb(156, 156, 156)#9C9C9C
    grey61grey61rgb(156, 156, 156)#9C9C9C
    gray60gray60rgb(153, 153, 153)#999999
    grey60grey60rgb(153, 153, 153)#999999
    gray59gray59rgb(150, 150, 150)#969696
    grey59grey59rgb(150, 150, 150)#969696
    gray58gray58rgb(148, 148, 148)#949494
    grey58grey58rgb(148, 148, 148)#949494
    gray57gray57rgb(145, 145, 145)#919191
    grey57grey57rgb(145, 145, 145)#919191
    gray56gray56rgb(143, 143, 143)#8F8F8F
    grey56grey56rgb(143, 143, 143)#8F8F8F
    gray55gray55rgb(140, 140, 140)#8C8C8C
    grey55grey55rgb(140, 140, 140)#8C8C8C
    gray54gray54rgb(138, 138, 138)#8A8A8A
    grey54grey54rgb(138, 138, 138)#8A8A8A
    gray53gray53rgb(135, 135, 135)#878787
    grey53grey53rgb(135, 135, 135)#878787
    gray52gray52rgb(133, 133, 133)#858585
    grey52grey52rgb(133, 133, 133)#858585
    gray51gray51rgb(130, 130, 130)#828282
    grey51grey51rgb(130, 130, 130)#828282
    fractalfractalrgb(128, 128, 128)#808080
    gray50gray50rgb(127, 127, 127)#7F7F7F
    grey50grey50rgb(127, 127, 127)#7F7F7F
    graygrayrgb(126, 126, 126)#7E7E7E
    gray49gray49rgb(125, 125, 125)#7D7D7D
    grey49grey49rgb(125, 125, 125)#7D7D7D
    gray48gray48rgb(122, 122, 122)#7A7A7A
    grey48grey48rgb(122, 122, 122)#7A7A7A
    gray47gray47rgb(120, 120, 120)#787878
    grey47grey47rgb(120, 120, 120)#787878
    gray46gray46rgb(117, 117, 117)#757575
    grey46grey46rgb(117, 117, 117)#757575
    gray45gray45rgb(115, 115, 115)#737373
    grey45grey45rgb(115, 115, 115)#737373
    gray44gray44rgb(112, 112, 112)#707070
    grey44grey44rgb(112, 112, 112)#707070
    gray43gray43rgb(110, 110, 110)#6E6E6E
    grey43grey43rgb(110, 110, 110)#6E6E6E
    gray42gray42rgb(107, 107, 107)#6B6B6B
    grey42grey42rgb(107, 107, 107)#6B6B6B
    DimGrayDimGrayrgb(105, 105, 105)#696969
    DimGreyDimGreyrgb(105, 105, 105)#696969
    gray41gray41rgb(105, 105, 105)#696969
    grey41grey41rgb(105, 105, 105)#696969
    gray40gray40rgb(102, 102, 102)#666666
    grey40grey40rgb(102, 102, 102)#666666
    gray39gray39rgb( 99, 99, 99)#636363
    grey39grey39rgb( 99, 99, 99)#636363
    gray38gray38rgb( 97, 97, 97)#616161
    grey38grey38rgb( 97, 97, 97)#616161
    gray37gray37rgb( 94, 94, 94)#5E5E5E
    grey37grey37rgb( 94, 94, 94)#5E5E5E
    gray36gray36rgb( 92, 92, 92)#5C5C5C
    grey36grey36rgb( 92, 92, 92)#5C5C5C
    gray35gray35rgb( 89, 89, 89)#595959
    grey35grey35rgb( 89, 89, 89)#595959
    gray34gray34rgb( 87, 87, 87)#575757
    grey34grey34rgb( 87, 87, 87)#575757
    gray33gray33rgb( 84, 84, 84)#545454
    grey33grey33rgb( 84, 84, 84)#545454
    gray32gray32rgb( 82, 82, 82)#525252
    grey32grey32rgb( 82, 82, 82)#525252
    gray31gray31rgb( 79, 79, 79)#4F4F4F
    grey31grey31rgb( 79, 79, 79)#4F4F4F
    gray30gray30rgb( 77, 77, 77)#4D4D4D
    grey30grey30rgb( 77, 77, 77)#4D4D4D
    gray29gray29rgb( 74, 74, 74)#4A4A4A
    grey29grey29rgb( 74, 74, 74)#4A4A4A
    gray28gray28rgb( 71, 71, 71)#474747
    grey28grey28rgb( 71, 71, 71)#474747
    gray27gray27rgb( 69, 69, 69)#454545
    grey27grey27rgb( 69, 69, 69)#454545
    gray26gray26rgb( 66, 66, 66)#424242
    grey26grey26rgb( 66, 66, 66)#424242
    gray25gray25rgb( 64, 64, 64)#404040
    grey25grey25rgb( 64, 64, 64)#404040
    gray24gray24rgb( 61, 61, 61)#3D3D3D
    grey24grey24rgb( 61, 61, 61)#3D3D3D
    gray23gray23rgb( 59, 59, 59)#3B3B3B
    grey23grey23rgb( 59, 59, 59)#3B3B3B
    gray22gray22rgb( 56, 56, 56)#383838
    grey22grey22rgb( 56, 56, 56)#383838
    gray21gray21rgb( 54, 54, 54)#363636
    grey21grey21rgb( 54, 54, 54)#363636
    gray20gray20rgb( 51, 51, 51)#333333
    grey20grey20rgb( 51, 51, 51)#333333
    gray19gray19rgb( 48, 48, 48)#303030
    grey19grey19rgb( 48, 48, 48)#303030
    gray18gray18rgb( 46, 46, 46)#2E2E2E
    grey18grey18rgb( 46, 46, 46)#2E2E2E
    gray17gray17rgb( 43, 43, 43)#2B2B2B
    grey17grey17rgb( 43, 43, 43)#2B2B2B
    gray16gray16rgb( 41, 41, 41)#292929
    grey16grey16rgb( 41, 41, 41)#292929
    gray15gray15rgb( 38, 38, 38)#262626
    grey15grey15rgb( 38, 38, 38)#262626
    gray14gray14rgb( 36, 36, 36)#242424
    grey14grey14rgb( 36, 36, 36)#242424
    gray13gray13rgb( 33, 33, 33)#212121
    grey13grey13rgb( 33, 33, 33)#212121
    gray12gray12rgb( 31, 31, 31)#1F1F1F
    grey12grey12rgb( 31, 31, 31)#1F1F1F
    gray11gray11rgb( 28, 28, 28)#1C1C1C
    grey11grey11rgb( 28, 28, 28)#1C1C1C
    gray10gray10rgb( 26, 26, 26)#1A1A1A
    grey10grey10rgb( 26, 26, 26)#1A1A1A
    gray9gray9rgb( 23, 23, 23)#171717
    grey9grey9rgb( 23, 23, 23)#171717
    gray8gray8rgb( 20, 20, 20)#141414
    grey8grey8rgb( 20, 20, 20)#141414
    gray7gray7rgb( 18, 18, 18)#121212
    grey7grey7rgb( 18, 18, 18)#121212
    gray6gray6rgb( 15, 15, 15)#0F0F0F
    grey6grey6rgb( 15, 15, 15)#0F0F0F
    gray5gray5rgb( 13, 13, 13)#0D0D0D
    grey5grey5rgb( 13, 13, 13)#0D0D0D
    gray4gray4rgb( 10, 10, 10)#0A0A0A
    grey4grey4rgb( 10, 10, 10)#0A0A0A
    gray3gray3rgb( 8, 8, 8)#080808
    grey3grey3rgb( 8, 8, 8)#080808
    gray2gray2rgb( 5, 5, 5)#050505
    grey2grey2rgb( 5, 5, 5)#050505
    gray1gray1rgb( 3, 3, 3)#030303
    grey1grey1rgb( 3, 3, 3)#030303
    blackblackrgb( 0, 0, 0)#000000
    gray0gray0rgb( 0, 0, 0)#000000
    grey0grey0rgb( 0, 0, 0)#000000
    opaqueopaquergb( 0, 0, 0)#000000
    nonenonergba( 0, 0, 0, 0.0)#00000000
    transparenttransparentrgba( 0, 0, 0, 0.0)#00000000
    +
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/command-line-options.html b/ImageMagick-6.9.12-44/www/command-line-options.html new file mode 100644 index 0000000..9ce43d4 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/command-line-options.html @@ -0,0 +1,7473 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Options + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Annotated List of Command-line Options

    +

    -adaptive-blur-adaptive-resize-adaptive-sharpen-adjoin-affine-alpha-annotate-antialias-append-attenuate-authenticate-auto-gamma-auto-level-auto-orient-auto-threshold-backdrop-background-bench-bias-bilateral-blur-black-point-compensation-black-threshold-blend-blue-primary-blue-shift-blur-border-bordercolor-borderwidth-brightness-contrast-cache-canny-caption-cdl-channel-charcoal-channel-fx-chop-clahe-clamp-clip-clip-mask-clip-path-clone-clut-coalesce-colorize-colormap-color-matrix-colors-colorspace-color-threshold-combine-comment-compare-complex-compose-composite-compress-connected-components-contrast-contrast-stretch-convolve-copy-crop-cycle-debug-decipher-deconstruct-define-delay-delete-density-depth-descend-deskew-despeckle-direction-displace-display-dispose-dissimilarity-threshold-dissolve-distort-distribute-cache-dither-draw-duplicate-edge-emboss-encipher-encoding-endian-enhance-equalize-evaluate-evaluate-sequence-extent-extract-family-features-fft-fill-filter-flatten-flip-floodfill-flop-font-foreground-format-format[identify]-frame-frame[import]-function-fuzz-fx-gamma-gaussian-blur-geometry-gravity-grayscale-green-primary-hald-clut-help-highlight-color-hough-lines-iconGeometry-iconic-identify-ift-immutable-implode-insert-intensity-intent-interlace-interline-spacing-interpolate-interpolative-resize-interword-spacing-kerning-kmeans-kuwahara-label-lat-layers-level-level-colors-limit-linear-stretch-linewidth-liquid-rescale-list-log-loop-lowlight-color-magnify-map-map[stream]-mattecolor-median-mean-shift-metric-mode-modulate-moments-monitor-monochrome-morph-morphology-mosaic-motion-blur-name-negate-noise-normalize-opaque-ordered-dither-orient-page-paint-path-pause[animate]-pause[import]-perceptible-ping-pointsize-polaroid-poly-posterize-precision-preview-print-process-profile-quality-quantize-quiet-radial-blur-raise-random-threshold-range-threshold-read-mask-red-primary-regard-warnings-region-remap-remote-render-repage-resample-resize-respect-parentheses-reverse-roll-rotate-sample-sampling-factor-scale-scene-screen-seed-segment-selective-blur-separate-sepia-tone-set-shade-shadow-shared-memory-sharpen-shave-shear-sigmoidal-contrast-silent-similarity-threshold-size-sketch-smush-snaps-solarize-sparse-color-splice-spread-statistic-stegano-stereo-storage-type-stretch-strip-stroke-strokewidth-style-subimage-search-swap-swirl-synchronize-taint-text-font-texture-threshold-thumbnail-tile-tile-offset-tint-title-transform-transparent-transparent-color-transpose-transverse-treedepth-trim-type-undercolor-unique-colors-units-unsharp-update-verbose-version-view-vignette-virtual-pixel-visual-watermark-wave-wavelet-denoise-weight-white-balance-white-point-white-threshold-window-window-group-write-write-mask

    +

    Below is list of command-line options recognized by the ImageMagick command-line tools. If you want a description of a particular option, click on the option name in the navigation bar above and you will go right to it. Unless otherwise noted, each option is recognized by the commands: convert and mogrify.

    + +
    +

    -adaptive-blur radius[xsigma]

    +
    + +

    Adaptively blur pixels, with decreasing effect near edges.

    + +

    A Gaussian operator of the given radius and standard deviation (sigma) is used. If sigma is not given it +defaults to 1.

    + +
    +

    -adaptive-resize geometry

    +
    + +

    Resize the image using data-dependent triangulation.

    + +

    See Image Geometry for complete details about the geometry argument. The -adaptive-resize +option defaults to data-dependent triangulation. Use the -filter to choose a different resampling algorithm. +Offsets, if present in the geometry string, are ignored, and the -gravity option has no effect.

    + +
    +

    -adaptive-sharpen radius[xsigma]

    +
    + +

    Adaptively sharpen pixels, with increasing effect near edges.

    + +

    A Gaussian operator of the given radius and standard deviation +(sigma) is used. If sigma is not given it +defaults to 1.

    + +
    +

    -adjoin

    +
    + +

    Join images into a single multi-image file.

    + +

    This option is enabled by default. An attempt is made to save all images of +an image sequence into the given output file. However, some formats, such as +JPEG and PNG, do not support more than one image per file, and in that case +ImageMagick is forced to write each image as a separate file. As such, if +more than one image needs to be written, the filename given is modified by +adding a -scene number before the suffix, in order to +make distinct names for each image.

    + +

    Use +adjoin to force each image to be written to +separate files, whether or not the file format allows multiple images per file +(for example, GIF, MIFF, and TIFF).

    + +

    Including a C-style integer format string in the output filename will +automagically enable +adjoin and are used to specify +where the -scene number is placed in the filenames. These +strings, such as '%d' or '%03d', are familiar to those +who have used the standard printf()' C-library function. As an +example, the command

    + +
      < class="bg-light text-dark mx-4">convert logo: rose: -morph 15 my%02dmorph.jpg +
    + +

    will create a sequence of 17 images (the two given plus 15 more created by +-morph), named: my00morph.jpg, my01morph.jpg, +my02morph.jpg, ..., my16morph.jpg.

    + +

    In summary, ImageMagick tries to write all images to one file, but will +save to multiple files, if any of the following conditions exist...

    +
      +
    1. the output image's file format does not allow multi-image files,
    2. +
    3. the +adjoin option is given, or
    4. +
    5. a printf() integer format string (eg: "%d") is present in the output + filename.
    6. +
    + + +
    +

    -affine + sx,rx,ry,sy[,tx,ty]

    +
    + +

    Set the drawing transformation matrix for combined rotating and scaling.

    + +

    This option sets a transformation matrix, for use by subsequent -draw or -transform options.

    + +

    The matrix entries are entered as comma-separated numeric values either in +quotes or without spaces.

    + +

    Internally, the transformation matrix has 3x3 elements, but three of them +are omitted from the input because they are constant. The new (transformed) +coordinates (x', y') of a pixel at +position (x, y) in the original +image are calculated using the following matrix equation.

    + +

    affine transformation

    + +

    The size of the resulting image is that of the smallest rectangle that +contains the transformed source image. The parameters +tx and ty +subsequently shift the image pixels so that those that are moved out of the +image area are cut off.

    + +

    The transformation matrix complies with the left-handed pixel coordinate +system: positive x and y directions +are rightward and downward, resp.; positive rotation is clockwise.

    + +

    If the translation coefficients tx and +ty are omitted they default to 0,0. Therefore, +four parameters suffice for rotation and scaling without translation.

    + +

    Scaling by the factors sx and +sy in the x and y directions, +respectively, is accomplished with the following.

    + +

    See -transform, and the -distort method 'Affineprojection for more +information

    + + +
      < class="bg-light text-dark mx-4">-affine sx,0,0,sy +
    + +

    Translation by a displacement (tx, ty) is accomplished like so:

    + +
      < class="bg-light text-dark mx-4">-affine 1,0,0,1,tx,ty +
    + +

    Rotate clockwise about the origin (the upper left-hand corner) by an angle +a by letting c = cos(a), s += sin(a), and using the following.

    + +
      < class="bg-light text-dark mx-4">-affine c,s,-s,c +
    + +

    The cumulative effect of a sequence of -affine +transformations can be accomplished by instead by a single -affine operation using the matrix equal to the product of the matrices +of the individual transformations.

    + +

    An attempt is made to detect near-singular transformation matrices. If the +matrix determinant has a sufficiently small absolute value it is rejected.

    + +
    +

    -alpha type

    +
    + +

    Gives control of the alpha/matte channel of an image.

    + +

    Used to set a flag on an image indicating whether or not to use existing alpha +channel data, to create an alpha channel, or to perform other operations on the alpha channel. Choose the argument type from the list below.

    + +
    +
    +
    Activate
    +
    + Enable the image's transparency channel. Note normally Set + should be used instead of this, unless you specifically need to + preserve existing (but specifically turned Off) transparency + channel.
    + +
    Associate
    +
    + associate the alpha channel with the image.
    + +
    Deactivate
    +
    + Disables the image's transparency channel. Does not delete or change the + existing data, just turns off the use of that data.
    + +
    Disassociate
    +
    + disassociate the alpha channel from the image.
    + +
    Set
    +
    + Activates the alpha/matte channel. If it was previously turned off + then it also resets the channel to opaque. If the image already had + the alpha channel turned on, it will have no effect.
    + +
    Opaque
    +
    + Enables the alpha/matte channel and forces it to be fully opaque. +
    + +
    Transparent
    +
    + Activates the alpha/matte channel and forces it to be fully + transparent. This effectively creates a fully transparent image the + same size as the original and with all its original RGB data still + intact, but fully transparent.
    + +
    Extract
    +
    + Copies the alpha channel values into all the color channels and turns + 'Off' the image's transparency, so as to generate + a grayscale mask of the image's shape. The alpha channel data is left + intact just deactivated. This is the inverse of 'Copy'. +
    + +
    Copy
    +
    + Turns 'On' the alpha/matte channel, then copies the + grayscale intensity of the image, into the alpha channel, converting + a grayscale mask into a transparent shaped mask ready to be colored + appropriately. The color channels are not modified.
    + +
    Shape
    +
    + As per 'Copy' but also colors the resulting shape mask with + the current background color. That is the RGB color channels is + replaced, with appropriate alpha shape. +
    + +
    Remove
    +
    + Composite the image over the background color. +
    + +
    Background
    +
    + Set any fully-transparent pixel to the background color, while leaving + it fully-transparent. This can make some image file formats, such as + PNG, smaller as the RGB values of transparent pixels are more uniform, + and thus can compress better. +
    +
    +
    +
    + +

    Note that while the obsolete +matte operation was the +same as "-alpha Off", the +>-matte operation was the same as "-alpha +Set" and not "-alpha On".

    + +
    +

    + -annotate degrees text
    + -annotate XdegreesxYdegrees text
    -annotate XdegreesxYdegrees{+-}tx{+-}ty text
    -annotate {+-}tx{+-}ty text

    +
    + +

    Annotate an image with text

    + +

    This is a convenience for annotating an image with text. For more precise +control over text annotations, use -draw.

    + + +

    The values Xdegrees and Ydegrees +control the shears applied to the text, while tx and ty are offsets that give the location of the text relative any -gravity setting and defaults to the upper left corner of the image.

    + +

    Using -annotate degrees +or -annotate degreesxdegrees produces an unsheared rotation of the text. The +direction of the rotation is positive, which means a clockwise rotation if degrees is positive. (This conforms to the usual mathematical +convention once it is realized that the positive y–direction is +conventionally considered to be downward for images.)

    + +

    The new (transformed) coordinates (x', y') of a pixel at position (x, y) in the image are calculated using the following matrix +equation.

    + +

    annotate transformation

    + +

    If tx and ty are omitted, they default to 0. This makes the +bottom-left of the text becomes the upper-left corner of the image, which is +probably undesirable. Adding a -gravity option in this +case leads to nice results.

    + +

    Text is any UTF-8 encoded character sequence. If text +is of the form '@mytext.txt', the text is read from the file +mytext.txt. Text in a file is taken literally; no embedded +formatting characters are recognized.

    + +
    +

    -antialias

    +
    + +

    Enable/Disable of the rendering of anti-aliasing pixels when drawing fonts and lines.

    + +

    By default, objects (e.g. text, lines, polygons, etc.) are antialiased when +drawn. Use +antialias to disable the addition of +antialiasing edge pixels. This will then reduce the number of colors added to +an image to just the colors being directly drawn. That is, no mixed colors +are added when drawing such objects.

    + +
    +

    -append

    +
    + +

    Join current images vertically or horizontally.

    + +

    This option creates a single longer image, by joining all the current +images in sequence top-to-bottom. Use +append to +stack images left-to-right.

    + +

    If they are not of the same width, narrower images are padded with the +current -background color setting, and their +position relative to each other can be controlled by the current -gravity setting.

    + +

    For more flexible options, including the abiity to add space between images, +use -smush.

    + +
    +

    -attenuate value

    +
    + +

    Lessen (or intensify) when adding noise to an image.

    + +

    If unset the value is equivalent to 1.0, or a maximum noise addition

    + +
    +

    -authenticate password

    +
    + +

    Decrypt a PDF with a password.

    + +

    Use this option to supply a password for decrypting +a PDF that has been encrypted using Microsoft Crypto API (MSC API). The +encrypting using the MSC API is not supported.

    + +

    For a different encryption method, see -encipher +and -decipher.

    + + +
    +

    -auto-gamma

    +
    + +

    Automagically adjust gamma level of image.

    + +

    This calculates the mean values of an image, then applies a calculated -gamma adjustment so that the mean color in the +image will get a value of 50%.

    + +

    This means that any solid 'gray' image becomes 50% gray.

    + +

    This works well for real-life images with little or no extreme dark and +light areas, but tend to fail for images with large amounts of bright sky or +dark shadows. It also does not work well for diagrams or cartoon like images. +

    + +

    It uses the -channel setting, (including the +'sync' flag for channel synchronization), to determine which color +values is used and modified. As the default -channel setting is 'RGB,sync', channels are modified +together by the same gamma value, preserving colors.

    + + + +
    +

    -auto-level

    +
    + +

    Automagically adjust color levels of image.

    + +

    This is a 'perfect' image normalization operator. It finds the exact +minimum and maximum color values in the image and then applies a -level operator to stretch the values to the full range of +values.

    + +

    The operator is not typically used for real-life images, image scans, or +JPEG format images, as a single 'out-rider' pixel can set a bad min/max values +for the -level operation. On the other hand it is the +right operator to use for color stretching gradient images being used to +generate Color lookup tables, distortion maps, or other 'mathematically' +defined images.

    + +

    The operator is very similar to the -normalize, -contrast-stretch, and -linear-stretch operators, but without 'histogram binning' or 'clipping' +problems that these operators may have. That is -auto-level is the perfect or ideal version these operators.

    + +

    It uses the -channel setting, (including the +special 'sync' flag for channel synchronization), to determine +which color values are used and modified. As the default +channel setting is 'RGB,sync', the +'sync' ensures that the color channels will are modified +together by the same gamma value, preserving colors, and ignoring +transparency.

    + + +
    +

    -auto-orient

    +
    + +

    Adjusts an image so that its orientation is suitable for viewing (i.e. top-left orientation).

    + +

    This operator reads and resets the EXIF image profile setting 'Orientation' +and then performs the appropriate 90 degree rotation on the image to orient +the image, for correct viewing.

    + +

    This EXIF profile setting is usually set using a gravity sensor in digital +camera, however photos taken directly downward or upward may not have an +appropriate value. Also images that have been orientation 'corrected' without +reseting this setting, may be 'corrected' again resulting in a incorrect +result. If the EXIF profile was previously stripped, the -auto-orient operator will do nothing.

    + +
    +

    -auto-threshold method

    +
    + +

    Automatically perform image thresholding.

    + +

    Here are the valid methods:

    + +
    +
    +
    Undefined
    0: No method specified (equivalent to 'OTSU').
    +
    Kapur
    maximum entropy thresholding.
    +
    OTSU
    cluster-based image thresholding.
    +
    Triangle
    a geometric thresholding method.
    +
    +
    + +

    The computed threshold is returned as the auto-threshold:verbose image property. To instead print to your device, use -define auto-threshold:verbose=true.

    + +
    +

    -average

    +
    + +

    Average a set of images.

    + +

    An error results if the images are not identically sized.

    + + +
    +

    -backdrop

    +
    + +

    Display the image centered on a backdrop.

    + +

    This backdrop covers the entire workstation screen and is useful for hiding +other X window activity while viewing the image. The color of the backdrop is +specified as the background color. The color is specified using the format +described under the -fill option.

    + +
    +

    -background color

    +
    + +

    Set the background color.

    + +

    The color is specified using the format described under the -fill option. The default background color (if none is +specified or found in the image) is white.

    + +
    +

    -bench iterations

    +
    + +

    Measure performance.

    + +

    Repeat the entire command for the given number of iterations and report the user-time and elapsed time. For instance, +consider the following command and its output. Modify the benchmark with the +-duration to run the benchmark for a fixed number of seconds and -concurrent +to run the benchmark in parallel (requires the OpenMP feature).

    + +
      < class="bg-light text-dark mx-4">$ convert logo: -resize 200% -bench 5 logo.png +Performance[1]: 5i 1.344ips 1.000e 3.710u 0:03.720 +Performance[2]: 5i 1.634ips 0.549e 3.890u 0:03.060 +Performance[3]: 5i 2.174ips 0.618e 3.190u 0:02.300 +Performance[4]: 5i 1.678ips 0.555e 3.810u 0:02.980 +Performance[4]: 5i 0.875657ips 6.880u 0:05.710 +
    + +

    In this example, 5 iterations were completed at 2.174 iterations per +second, using 3 threads and 3.190 seconds of the user allotted time, for +a total elapsed time of 2.300 seconds.

    + +
    +

    -bias value{%}

    +
    + +

    Add bias when convolving an image.

    + +

    This option shifts the output of -convolve so that +positive and negative results are relative to the specified bias value.

    + +

    This is important for non-HDRI compilations of ImageMagick when dealing +with convolutions that contain negative as well as positive values. This is +especially the case with convolutions involving high pass filters or edge +detection. Without an output bias, the negative values are clipped at +zero.

    + +

    When using an ImageMagick with the HDRI compile-time setting, -bias is not needed, as ImageMagick is able to store/handle any +negative results without clipping to the color value range +(0..QuantumRange).

    + +

    See the discussion on HDRI implementations of ImageMagick on the page High Dynamic-Range Images. For more +about HDRI go the ImageMagick Usage pages or this +Wikipedia +entry.

    + +
    +

    -bilateral-blur width{xheight}{+intensity-sigma}{+spatial-sigma}

    +
    + +

    A non-linear, edge-preserving, and noise-reducing +smoothing filter for images. It replaces the intensity of each pixel with a +weighted average of intensity values from nearby pixels. This weight is +based on a Gaussian distribution. The weights depend not only on Euclidean +distance of pixels, but also on the radiometric differences (e.g., range +differences, such as color intensity, depth distance, etc.). This preserves +sharp edges.

    + +

    The intensity sigma is in the intensity space. A larger value means +that farther colors within the pixel neighborhood (see spatial-sigma) +will be mixed together, resulting in larger areas of semi-equal color.

    + +

    The spatial sigma is in the coordinate space. A larger value means that +farther pixels influence each other as long as their colors are close +enough (see intensity-sigma ). When the neigborhood diameter is greater +than zero, it specifies the neighborhood size regardless of +spatial-sigma. Otherwise, the neigborhood diameter is proportional to +spatial-sigma.

    +

    The default value for the intensity and spatial sigmas are 0.75*diameter and 0.25*diameter respectively.

    + + +
    +

    -black-point-compensation

    +
    + +

    Use black point compensation.

    + +
    +

    -black-threshold value{%}

    +
    + +

    Force to black all pixels below the threshold while leaving all pixels at or above the threshold unchanged.

    + +

    The threshold value can be given as a percentage or as an absolute integer +value within [0, QuantumRange] corresponding to the +desired -channel value. See -threshold for more details on thresholds and resulting values.

    + + +
    +

    -blend geometry

    +
    + +

    Blend an image into another by the given absolute value or percent.

    + +

    Blend will average the images together ('plus') according to the +percentages given and each pixels transparency. If only a single percentage +value is given it sets the weight of the composite or 'source' image, while +the background image is weighted by the exact opposite amount. That is a +-blend 30% merges 30% of the 'source' image with 70% of the +'destination' image. Thus it is equivalent to -blend 30x70%.

    + + +
    +

    -blue-primary x,y

    +
    + +

    Set the blue chromaticity primary point.

    + +
    +

    -blue-shift factor

    +
    + +

    Simulate a scene at nighttime in the moonlight. Start with a factor of 1.5

    + +
    + +
    +

    -blur radius
    -blur radius{xsigma}

    +
    + +

    Reduce image noise and reduce detail levels.

    + +

    Convolve the image with a Gaussian or normal distribution using the given +Sigma value. The formula is:

    + +

    gaussian distribution

    + +

    The Sigma value is the important argument, and +determines the actual amount of blurring that will take place.

    + +

    The Radius is only used to determine the size of the +array which will hold the calculated Gaussian distribution. It should be an +integer. If not given, or set to zero, IM will calculate the largest possible +radius that will provide meaningful results for the Gaussian distribution. +

    + +

    The larger the Radius the slower the +operation is. However too small a Radius, and severe +aliasing effects may result. As a guideline, Radius +should be at least twice the Sigma value, though three +times will produce a more accurate result.

    + +

    This option differs from -gaussian-blur simply +by taking advantage of the separability properties of the distribution. Here +we apply a single-dimensional Gaussian matrix in the horizontal direction, +then repeat the process in the vertical direction.

    + +

    The -virtual-pixel setting will determine how +pixels which are outside the image proper are blurred into the final result. +

    + + +
    +

    -border geometry

    +
    + +

    Surround the image with a border of color.

    + +

    Set the width and height using the size portion of the +geometry argument. See Image Geometry for complete details about the geometry argument. Offsets are +ignored.

    + +

    As of IM 6.7.8-8, the geometry arguments behave as follows:

    + +
    +
    +
    value
    +
    value is added to both left/right and top/bottom
    +
    value-xx
    +
    value-x is added only to left/right and top/bottom are unchanged
    +
    xvalue-y
    +
    value-y is added only to top/bottom and left/right are unchanged
    +
    value-xxvalue-y
    +
    value-x is added to left/right and value-y added to top/bottom
    +
    value-xx0
    +
    value-x is added only to left/right and top/bottom are unchanged
    +
    0xvalue-y
    +
    value-y is added only to top/bottom and left/right are unchanged
    +
    value%
    +
    value % of width is added to left/right and value % of height is added to top/bottom
    +
    value-xx%
    +
    value-x % of width is added to left/right and to top/bottom
    +
    xvalue-y%
    +
    value-y % of height is added to top/bottom and to left/right
    +
    value-x%xvalue-y%
    +
    value-x % of width is added to left/right and value-y % of height is added to top/bottom
    +
    value-x%x0%
    +
    value-x % of width is added to left/right and top/bottom are unchanged
    +
    0%xvalue-y%
    +
    value-y % of height is added to top/bottom and left/right are unchanged
    +
    +
    + +

    Set the border color by preceding with the -bordercolor setting.

    + +

    The -border operation is affected by the current -compose setting and assumes that this is using the default +'Over' composition method. It generates an image of the appropriate +size colors by the current -bordercolor before +overlaying the original image in the center of this net image. This means that +with the default compose method of 'Over' any transparent parts may +be replaced by the current -bordercolor setting.

    +

    See also the -frame option, which has more +functionality.

    + +
    +

    -bordercolor color

    +
    + +

    Set the border color.

    + +

    The color is specified using the format described under the -fill option.

    + +

    The default border color is #DFDFDF, this shade of gray.

    + +
    +

    -borderwidth geometry

    +
    + +

    Set the border width.

    + +
    +

    -brightness-contrast brightness
    -brightness-contrast brightness{xcontrast}{%}

    +
    + +

    Adjust the brightness and/or contrast of the image.

    + +

    Brightness and Contrast values apply changes to the input image. They are +not absolute settings. A brightness or contrast value of zero means no change. +The range of values is -100 to +100 on each. Positive values increase the +brightness or contrast and negative values decrease the brightness or contrast. +To control only contrast, set the brightness=0. To control only brightness, +set contrast=0 or just leave it off.

    + +

    You may also use -channel to control which channels to +apply the brightness and/or contrast change. The default is to apply the same +transformation to all channels.

    + +

    Brightness and Contrast arguments are converted to offset and slope of a +linear transform and applied +using -function polynomial "slope,offset".

    + +

    The slope varies from 0 at contrast=-100 to almost vertical at +contrast=+100. For brightness=0 and contrast=-100, the result are totally +midgray. For brightness=0 and contrast=+100, the result will approach but +not quite reach a threshold at midgray; that is the linear transformation +is a very steep vertical line at mid gray.

    + +

    Negative slopes, i.e. negating the image, are not possible with this +function. All achievable slopes are zero or positive.

    + +

    The offset varies from -0.5 at brightness=-100 to 0 at brightness=0 to +0.5 +at brightness=+100. Thus, when contrast=0 and brightness=100, the result is +totally white. Similarly, when contrast=0 and brightness=-100, the result is +totally black.

    + +

    As the range of values for the arguments are -100 to +100, adding the '%' +symbol is no different than leaving it off.

    + +
    +

    -cache threshold

    +
    + +

    (This option has been replaced by the -limit option).

    + +
    +

    -canny radius
    -canny radius{xsigma}{+lower-percent}{+upper-percent}

    +
    + +

    Canny edge detector uses a multi-stage algorithm to detect a wide range of edges in the image.

    + +

    The thresholds range from 0 to 100% (e.g. -canny 0x1+10%+30%) with {+lower-percent} < {+upper-percent}. If {+upper-percent} is increased but {+lower-percent} remains the same, lesser edge components will be detected, but their lengths will be the same. If {+lower-percent} is increased but {+upper-percent} is the same, the same number of edge components will be detected but their lengths will be shorter. The default thresholds are shown. The radius{xsigma} controls a gaussian blur applied to the input image to reduce noise and smooth the edges.

    + +
    +

    -caption string

    +
    + +

    Assign a caption to an image.

    + +

    This option sets the caption meta-data of an image read in after this +option has been given. To modify a caption of images already in memory use +"-set caption".

    + +

    The caption can contain special format characters listed in the Format and +Print Image Properties. These attributes are expanded when the caption +is finally assigned to the individual images.

    + +

    If the first character of string is @, the image caption is read from a file titled by the +remaining characters in the string. Comments read in from a file are literal; +no embedded formatting characters are recognized.

    + +

    Caption meta-data is not visible on the image itself. To do that use the +-annotate or -draw options +instead.

    + +

    For example,

    + +
      < class="bg-light text-dark mx-4">-caption "%m:%f %wx%h" bird.miff +
    + +

    produces an image caption of MIFF:bird.miff 512x480 (assuming +that the image bird.miff has a width of 512 and a height of +480.

    + + +
    +

    -cdl filename

    +
    + +

    Color correct with a color decision list.

    + +

    Here is an example color correction collection:

    + +
      < class="bg-light text-dark mx-4"><?xml version="1.0" encoding="UTF-8"?> +<ColorCorrectionCollection xmlns="urn:ASC:CDL:v1.2"> + <ColorCorrection id="cc06668"> + <SOPNode> + <Slope> 0.9 1.2 0.5 </Slope> + <Offset> 0.4 -0.5 0.6 </Offset> + <Power> 1.0 0.8 1.5 </Power> + </SOPNode> + <SATNode> + <Saturation> 0.85 </Saturation> + </SATNode> + </ColorCorrection> +</ColorCorrectionCollection> +
    + +
    +

    -channel type

    +
    + +

    Specify those image color channels to which subsequent operators are limited.

    + +

    Choose from: Red, Green, Blue, +Alpha, Gray, Cyan, Magenta, +Yellow, Black, Opacity, +Index, RGB, RGBA, CMYK, or +CMYKA.

    + +

    The channels above can also be specified as a comma-separated list or can be +abbreviated as a concatenation of the letters 'R', 'G', +'B', 'A', 'O', 'C', +'M', 'Y', 'K'.

    + +

    The numerals 0 to 31 may also be used to specify channels, where 0 to 5 are:
    +

      +'0' equals Red or Cyan
      +'1' equals Green or Magenta
      +'2' equals Blue or Yellow
      +'3' equals Black
      +'4' equals Alpha or Opacity
      +'5' equals Index

      +
    + +

    For example, to only select the Red and Blue channels +you can use any of the following:

    +
      < class="bg-light text-dark mx-4"> +-channel Red,Blue +-channel R,B +-channel RB +-channel 0,2 +
    + +

    All the channels that are present in an image can be specified using the +special channel type All. Not all operators are 'channel capable', +but generally any operators that are generally 'grey-scale' image operators, +will understand this setting. See individual operator documentation.

    + +

    On top of the normal channel selection an extra flag can be specified, +'Sync'. This is turned on by default and if set means that +operators that understand this flag should perform: cross-channel +synchronization of the channels. If not specified, then most grey-scale +operators will apply their image processing operations to each individual +channel (as specified by the rest of the -channel +setting) completely independently from each other.

    + +

    For example for operators such as -auto-level and +-auto-gamma the color channels are modified +together in exactly the same way so that colors will remain in-sync. Without +it being set, then each channel is modified separately and +independently, which may produce color distortion.

    + +

    The -morphology 'Convolve' method +and the -compose mathematical methods, also understands +the 'Sync' flag to modify the behavior of pixel colors according +to the alpha channel (if present). That is to say it will modify the image +processing with the understanding that fully-transparent colors should not +contribute to the final result.

    + +

    Basically, by default, operators work with color channels in synchronous, and +treats transparency as special, unless the -channel +setting is modified so as to remove the effect of the 'Sync' flag. +How each operator does this depends on that operators current implementation. +Not all operators understands this flag at this time, but that is changing. +

    + +

    To print a complete list of channel types, use -list +channel.

    + +

    By default, ImageMagick sets -channel to the value +'RGBK,sync', which specifies that operators act on all color +channels except the transparency channel, and that all the color channels are +to be modified in exactly the same way, with an understanding of transparency +(depending on the operation being applied). The 'plus' form +channel will reset the value back to this default.

    + +

    Options that are affected by the -channel setting +include the following. + +-auto-gamma, +-auto-level, +-black-threshold, +-blur, +-clamp, +-clut, +-combine, +-composite (Mathematical compose methods only), +-convolve, +-contrast-stretch, +-evaluate, +-function, +-fx, +-gaussian-blur, +-hald-clut, +-motion-blur, +-morphology, +-negate, +-normalize, +-ordered-dither, +-radial-blur, +-random-threshold, +-range-threshold, +-separate, +-threshold, and +-white-threshold. +

    + +

    Warning, some operators behave differently when the +channel default setting is in effect, versus ANY user defined -channel setting (including the equivalent of the +default). These operators have yet to be made to understand the newer 'Sync' +flag.

    + +

    For example -threshold will by default grayscale +the image before thresholding, if no -channel setting +has been defined. This is not 'Sync flag controlled, yet.

    + +

    Also some operators such as -blur, -gaussian-blur, will modify their handling of the +color channels if the 'alpha' channel is also enabled by -channel. Generally this done to ensure that +fully-transparent colors are treated as being fully-transparent, and thus any +underlying 'hidden' color has no effect on the final results. Typically +resulting in 'halo' effects. The newer -morphology +convolution equivalents however does have a understanding of the 'Sync' flag +and will thus handle transparency correctly by default.

    + +

    As an alpha channel is optional within images, some operators will read the +color channels of an image as a greyscale alpha mask, when the image has no +alpha channel present, and the -channel setting tells +the operator to apply the operation using alpha channels. The -clut operator is a good example of this.

    + +
    +

    -channel-fx expression

    +
    + +

    Exchange, extract, or copy one or more image channels.

    + +

    The expression consists of one or more channels, either mnemonic or numeric (e.g. red or 0, green or 1, etc.), separated by certain operation symbols as follows:

    + +
      < class="bg-light text-dark mx-4"><=> exchange two channels (e.g. red<=>blue) +=> copy one channel to another channel (e.g. red=>green) += assign a constant value to a channel (e.g. red=50%) +, write new image with channels in the specified order (e.g. red, green) +; add a new output image for the next set of channel operations (e.g. red; green; blue) +| move to the next input image for the source of channel data (e.g. | gray=>alpha) +
    + +

    For example, to create 3 grayscale images from the red, green, and blue channels of an image, use:

    + +
      < class="bg-light text-dark mx-4">-channel-fx "red; green; blue" +
    + +

    A channel without an operation symbol implies separate (i.e, semicolon).

    + +

    Here we take an sRGB image and a grayscale image and inject the grayscale image into the alpha channel:

    +
      < class="bg-light text-dark mx-4">convert wizard.png mask.pgm -channel-fx '| gray=>alpha' wizard-alpha.png +
    +

    Use a similar command to define a read mask:

    +
      < class="bg-light text-dark mx-4">convert wizard.png mask.pgm -channel-fx '| gray=>read-mask' wizard-mask.png +
    + +

    Add -debug pixel prior to the -channel-fx option to track the channel morphology.

    + +
    +

    -charcoal factor

    +
    + +

    Simulate a charcoal drawing.

    + +
    +

    -chop geometry

    +
    + +

    Remove pixels from the interior of an image.

    + +

    See Image Geometry for complete details about the geometry argument. The width +and height given in the of the size +portion of the geometry argument give the number of +columns and rows to remove. The offset portion of +the geometry argument is influenced by +a -gravity setting, if present.

    + +

    The -chop option removes entire rows and columns, +and moves the remaining corner blocks leftward and upward to close the gaps.

    + +

    While it can remove internal rows and columns of pixels, it is more +typically used with as -gravity setting and zero +offsets so as to remove a single edge from an image. Compare this to -shave which removes equal numbers of pixels from opposite +sides of the image.

    + +

    Using -chop effectively undoes the results of a -splice that was given the same geometry and -gravity settings.

    + +
    +

    -clahe widthxheight{%}{+}number-bins{+}clip-limit{!}

    +
    + +

    Contrast limited adaptive histogram equalization.

    +

    The image is divided into tiles of width and height pixels. Append % to define the width and height as percentages of the image's dimensions. The tile size should be larger than the size of features to be preserved and respects the aspect ratio of the image. Add ! to force an exact tile width and height. number-bins is the number of histogram bins per tile (min 2, max 65536). The number of histogram bins should be smaller than the number of pixels in a single tile. clip-limit is the contrast limit for localized changes in contrast. A clip-limit of 2 to 3 is a good starting place (e.g. -clahe 50x50%+128+3). Very large values will let the histogram equalization do whatever it wants to do, that is result in maximal local contrast. The value 1 will result in the original image. Note, if the number of bins and the clip-limit are ommitted, they default to 128 and no clipping respectively.

    + + +
    +

    -clamp

    +
    + +

    Set each pixel whose value is below zero to zero and any the pixel whose value is above the quantum range to the quantum range (e.g. 65535) otherwise the pixel value remains unchanged.

    + +
    +

    -clip

    +
    + +

    Apply the clipping path if one is present.

    + +

    If a clipping path is present, it is applied to subsequent operations.

    + +

    For example, in the command

    + +
      < class="bg-light text-dark mx-4">convert cockatoo.tif -clip -negate negated.tif +
    + +

    only the pixels within the clipping path are negated.

    + +

    The -clip feature requires SVG support. If the SVG +delegate library is not present, the option is ignored.

    + +

    Use +clip to disable clipping for subsequent operations.

    + +
    +

    -clip-mask

    +
    + +

    Clip the image as defined by this mask.

    + +

    Use the alpha channel of the current image as a mask. Any areas that is +white is not modified by any of the 'image processing operators' that follow, +until the mask is removed. Pixels in the black areas of the clip mask are +modified per the requirements of the operator.

    + +

    In some ways this is similar to (though not the same) as defining +a rectangular -region, or using the negative of the +mask (third) image in a three image -composite, +operation.

    + +

    Use +clip-mask to disable clipping for subsequent operations.

    + +
    +

    -clip-path id

    +
    + +

    Clip along a named path from the 8BIM profile.

    + +

    This is identical to -clip except choose a specific clip path in the event the image has more than one path available.

    + +

    Use +clip-path to disable clipping for subsequent operations.

    + +
    +

    -clone index(s)

    +
    + +

    Make a clone of an image (or images).

    + +

    Inside parenthesis (where the operator is normally used) it will make a +clone of the images from the last 'pushed' image sequence, and adds them to +the end of the current image sequence. Outside parenthesis +(not recommended) it clones the images from the current image sequence.

    + +

    Specify the image by its index in the sequence. The first image is index +0. Negative indexes are relative to the end of the sequence; for +example, −1 +represents the last image of the sequence. Specify a range of images with a +dash (e.g. 0−4). Separate multiple indexes with commas but no +spaces (e.g. 0,2,5). A value of '0−−1 will +effectively clone all the images.

    + +

    The +clone will simply make a copy of the last image +in the image sequence, and is thus equivalent to using an argument of +'−1'.

    + +
    +

    -clut

    +
    + +

    Replace the channel values in the first image using each corresponding channel in the second image as a color lookup table.

    + +

    The second (LUT) image is ordinarily a gradient image containing the +histogram mapping of how each channel should be modified. Typically it is a +either a single row or column image of replacement color values. If larger +than a single row or column, values are taken from a diagonal line from +top-left to bottom-right corners.

    + +

    The lookup is further controlled by the -interpolate setting, which is especially handy for an +LUT which is not the full length needed by the ImageMagick installed Quality +(Q) level. Good settings for this are 'bilinear' and +'catrom'. Catom can return a useful second-order continuity.

    + +

    This operator is especially suited to replacing a grayscale image with a +specific color gradient from the CLUT image.

    + +

    Only the channel values defined by the -channel +setting will have their values replaced. In particular, since the default -channel setting is RGB, this means that +transparency (alpha/matte channel) is not affected, unless the -channel setting is modified. When the alpha channel is +set, it is treated by the -clut operator in the same way +as the other channels, implying that alpha/matte values are replaced using the +alpha/matte values of the original image.

    + +

    If either the image being modified, or the lookup image, contains no +transparency (i.e. -alpha is turned 'off') but the -channel setting includes alpha replacement, then it is +assumed that image represents a grayscale gradient which is used for the +replacement alpha values. That is you can use a grayscale CLUT image to +adjust a existing images alpha channel, or you can color a grayscale image +using colors form CLUT containing the desired colors, including transparency. +

    + +

    See also -hald-clut which replaces colors +according to the lookup of the full color RGB value from a 2D representation +of a 3D color cube.

    + + +
    +

    -coalesce

    +
    + +

    Fully define the look of each frame of an GIF animation sequence, to form a 'film strip' animation.

    + +

    Overlay each image in an image sequence according to +its -dispose meta-data, to reproduce the look of +an animation at each point in the animation sequence. All images should be +the same size, and are assigned appropriate GIF disposal settings for the +animation to continue working as expected as a GIF animation. Such frames +are more easily viewed and processed than the highly optimized GIF overlay +images.

    + +

    The animation can be re-optimized after processing using +the -layers method 'optimize', although +there is no guarantee that the restored GIF animation optimization is +better than the original.

    + + +
    +

    -colorize value

    +
    + +

    Colorize the image by an amount specified by value using the color specified by the most recent -fill setting.

    + +

    Specify the amount of colorization as a percentage. Separate colorization +values can be applied to the red, green, and blue channels of the image with +a comma-delimited list of colorization +values (e.g., -colorize 0,0,50).

    + +
    +

    -colormap type

    +
    + +

    Define the colormap type.

    + +

    The type can be shared or private.

    + +

    This option only applies when the default X server visual +is PseudoColor or GrayScale. Refer +to -visual for more details. By default, +a shared colormap is allocated. The image shares colors with +other X clients. Some image colors could be approximated, +therefore your image may look very different than intended. +If private is chosen, the image colors appear exactly +as they are defined. However, other clients may go technicolor +when the image colormap is installed.

    + +
    +

    -colors value

    +
    + +

    Set the preferred number of colors in the image.

    + +

    The actual number of colors in the image may be less than your request, +but never more. Note that this a color reduction option. Images with fewer +unique colors than specified by value will have any +duplicate or unused colors removed. The ordering of an existing color +palette may be altered. When converting an image from color to grayscale, +it is more efficient to convert the image to the gray colorspace before +reducing the number of colors. Refer to +the +color reduction algorithm for more details.

    + +
    +

    -color-matrix matrix

    +
    + +

    Apply color correction to the image.

    + +

    This option permits saturation changes, hue rotation, luminance to alpha, +and various other effects. Although variable-sized transformation matrices +can be used, typically one uses a 5x5 matrix for an RGBA image and a 6x6 +for CMYKA (or RGBA with offsets). The matrix is similar to those used by +Adobe Flash except offsets are in column 6 rather than 5 (in support of +CMYKA images) and offsets are normalized (divide Flash offset by 255).

    + +

    As an example, to add contrast to an image with offsets, try this command:

    + +
      < class="bg-light text-dark mx-4">convert kittens.jpg -color-matrix \ + " 1.5 0.0 0.0 0.0, 0.0, -0.157 \ + 0.0 1.5 0.0 0.0, 0.0, -0.157 \ + 0.0 0.0 1.5 0.0, 0.0, -0.157 \ + 0.0 0.0 0.0 1.0, 0.0, 0.0 \ + 0.0 0.0 0.0 0.0, 1.0, 0.0 \ + 0.0 0.0 0.0 0.0, 0.0, 1.0" kittens.png +
    +
    +

    -colorspace value

    +
    + +

    Set the image colorspace.

    + +

    Choices are:

    + +
      < class="bg-light text-dark mx-4">CMY CMYK Gray HCL +HCLp HSB HSI HSL +HSV HWB Jzazbz Lab +LCHab LCHuv LMS Log +Luv OHTA Rec601YCbCr Rec709YCbCr +RGB scRGB sRGB Transparent +xyY XYZ YCbCr YCC +YDbDr YIQ YPbPr YUV +Undefined +
    + +

    To print a complete list of colorspaces, use -list colorspace.

    + +

    For a more accurate color conversion to or from the linear RGB, CMYK, or grayscale colorspaces, use the -profile option. Note, ImageMagick assumes the sRGB colorspace if the image format does not indicate otherwise. For colorspace conversion, the gamma function is first removed to produce linear RGB.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Conversion of RGB to Other Color Spaces
    CMY
    C=QuantumRange−R
    M=QuantumRange−G
    Y=QuantumRange−B
    CMYK — starts with CMY from above
    K=min(C,Y,M)
    C=QuantumRange*(C−K)/(QuantumRange−K)
    M=QuantumRange*(M−K)/(QuantumRange−K)
    Y=QuantumRange*(Y−K)/(QuantumRange−K)
    Gray
    Gray = 0.212656*R+0.715158*G+0.072186*B
    HSB — Hue, Saturation, Brightness; like a cone peak downward
    H=angle around perimeter (0 to 360 deg); H=0 is red; increasing angles toward green
    S=distance from axis outward
    B=distance along axis from bottom upward; B=max(R,G,B); intensity-like
    HSL — Hue, Saturation, Lightness; like a double cone end-to-end with peaks at very top and bottom
    H=angle around perimeter (0 to 360 deg); H=0 is red; increasing angles toward green
    S=distance from axis outward
    L=distance along axis from bottom upward; L=0.5*max(R,G,B) + 0.5*min(R,G,B); intensity-like
    HWB — Hue, Whiteness, Blackness
    Hue (complicated equation)
    Whiteness (complicated equation)
    Blackness (complicated equation)
    LAB
    L (complicated equation relating X,Y,Z)
    A (complicated equation relating X,Y,Z)
    B (complicated equation relating X,Y,Z)
    LinearGray
    LinearGray = 0.298839*R+0.586811*G+0.114350*B
    LOG
    I1 (complicated equation involving logarithm of R)
    I2 (complicated equation involving logarithm of G)
    I3 (complicated equation involving logarithm of B)
    OHTA — approximates principal components transformation
    I1=0.33333*R+0.33334*G+0.33333*B; intensity-like
    I2=(0.50000*R+0.00000*G−0.50000*B)*(QuantumRange+1)/2
    I3=(−0.25000*R+0.50000*G−0.25000*B)*(QuantumRange+1)/2
    Rec601Luma
    Gray = 0.298839*R+0.586811*G+0.114350*B
    Rec601YCbCr
    Y=0.2988390*R+0.5868110*G+0.1143500*B; intensity-like
    Cb=(−0.168736*R-0.331264*G+0.500000*B)*(QuantumRange+1)/2
    Cr=(0.500000*R−0.418688*G−0.081312*B)*(QuantumRange+1)/2
    Rec709Luma
    Gray=0.212656*R+0.715158*G+0.072186*B
    Rec709YCbCr
    Y=0.212656*R+0.715158*G+0.072186*B; intensity-like
    Cb=(−0.114572*R−0.385428*G+0.500000*B)+(QuantumRange+1)/2
    Cr=(0.500000*R−0.454153*G−0.045847*B)+(QuantumRange+1)/2
    sRGB
    if R ≤ .0.0031308 then Rs=R/12.92 else Rs=1.055 R ^ (1.0 / 2.4) - 0.055
    if G ≤ .0.0031308 then Gs=B/12.92 else Gs=1.055 R ^ (1.0 / 2.4) - 0.055
    if B ≤ .0.0031308 then Bs=B/12.92 else Bs=1.055 R ^ (1.0 / 2.4) - 0.055
    XYZ
    X=0.4124564*R+0.3575761*G+0.1804375*B
    Y=0.2126729*R+0.7151522*G+0.0721750*B
    Z=0.0193339*R+0.1191920*G+0.9503041*B
    YCC
    Y=(0.298839*R+0.586811*G+0.114350*B) (with complicated scaling); intensity-like
    C1=(−0.298839*R−0.586811*G+0.88600*B) (with complicated scaling)
    C2=(0.70100*R−0.586811*G−0.114350*B) (with complicated scaling)
    YCbCr
    Y=0.2988390*R+0.5868110*G+0.1143500*B; intensity-like
    Cb=(−0.168736*R−0.331264*G+0.500000*B)*(QuantumRange+1)/2
    Cr=(0.500000*R−0.418688*G−0.081312*B)*(QuantumRange+1)/2
    YIQ
    Y=0.298839*R+0.586811*G+0.114350*B; intensity-like
    I=(0.59600*R−0.27400*G−0.32200*B)*(QuantumRange+1)/2
    Q=(0.21100*R−0.52300*G+0.31200*B)*(QuantumRange+1)/2
    YPbPr
    Y=0.2988390*R+0.5868110*G+0.1143500*B; intensity-like
    Pb=(−0.168736*R−0.331264*G+0.500000*B)*(QuantumRange+1)/2
    Pr=(0.500000*R−0.418688*G−0.081312*B)*(QuantumRange+1)/2
    YUV
    Y=0.298839*R+0.586811*G+0.114350*B; intensity-like
    U=(−0.14740*R−0.28950*G+0.43690*B)*(QuantumRange+1)/2
    V=(0.61500*R−0.51500*G−0.10000*B)*(QuantumRange+1)/2
    +
    + +

    Note the scRGB colorspace requires HDRI support otherwise it behaves just like linear RGB.

    + +

    Use the Undefined colorspace to identify multi-spectral images.

    + +
    +

    -color-threshold start-color-stop-color

    +
    + +

    Return a binary image where all colors within the specified range are changed to white. All other colors are changed to black.

    + +
    +

    -combine

    +

    +combine colorspace

    +
    + +

    Combine one or more images into a single image.

    + +

    The channels (previously set by -channel) of the +combined image are taken from the grayscale values of each image in the +sequence, in order. For the default -channel setting of RGB, this +means the first image is assigned to the Red channel, the second +to the Green channel, the third to the Blue.

    + +

    This option can be thought of as the inverse to -separate, so long as the channel settings are the same. +Thus, in the following example, the final image should be a copy of the +original.

    + +
      < class="bg-light text-dark mx-4">convert original.png -channel RGB -separate sepimage.png +convert sepimage-0.png sepimage-1.png sepimage-2.png -channel RGB \ + -combine imagecopy.png +
    + +
    +

    -comment string

    +
    + +

    Embed a comment in an image.

    + +

    This option sets the comment meta-data of an image read in after this +option has been given. To modify a comment of images already in memory use +"-set comment".

    + +

    The comment can contain special format characters listed in the Format and +Print Image Properties. These attributes are expanded when the comment +is finally assigned to the individual images.

    + +

    If the first character of string is @, the image comment is read from a file titled by the +remaining characters in the string. Comments read in from a file are literal; +no embedded formatting characters are recognized.

    + +

    Comment meta-data are not visible on the image itself. To do that use the +-annotate or -draw options +instead.

    + +

    For example,

    + +
      < class="bg-light text-dark mx-4">-comment "%m:%f %wx%h" bird.miff +
    + +

    produces an image comment of MIFF:bird.miff 512x480 (assuming +that the image bird.miff has a width of 512 and a height of +480.

    + +
    +

    -compare

    +
    + +

    Mathematically and visually annotate the difference between an image and its reconstruction

    + +

    This is a convert version of "compare" for two same sized images. The syntax is as follows, but other metrics are allowed.

    + +
      < class="bg-light text-dark mx-4">convert image.png reference.png -metric RMSE -compare \
      difference.png +
    + +

    To get the metric value use the string format "%[distortion]".

    + +
      < class="bg-light text-dark mx-4">convert image.png reference.png -metric RMSE -compare -format \ + "%[distortion]" info: +
    + +
    +

    -complex operator

    +
    + +

    Perform complex mathematics on an image sequence

    + +Choose from these operators: + +
      < class="bg-light text-dark mx-4">add +conjugate +divide +magnitude-phase +multiply +real-imaginary +subtract +
    + +

    Optionally specify the divide operator SNR with -define complex:snr=float.

    + +
    +

    -compose operator

    +
    + +

    Set the type of image composition.

    + +

    See Alpha Compositing for +a detailed discussion of alpha compositing.

    + +

    This setting affects image processing operators that merge two (or more) +images together in some way. This includes the operators, +-compare, +-composite, +-layers composite, +-flatten, +-mosaic, +-layers merge, +-border, +-frame, +and -extent.

    + +

    It is also one of the primary options for the "composite" +command.

    + + +
    +

    -composite

    +
    + +

    Perform alpha composition on two images and an optional mask

    + +

    Take the first image 'destination' and overlay the second 'source' image +according to the current -compose setting. The location +of the 'source' or 'overlay' image is controlled according to -gravity, and -geometry +settings.

    + +

    If a third image is given this is treated as a grayscale blending 'mask' image +relative to the first 'destination' image. This mask is blended with the +source image. However for the 'displace' compose method, the +mask is used to provide a separate Y-displacement image instead.

    + +

    If a -compose method requires extra numerical +arguments or flags these can be provided by setting the -set 'option:compose:args' +appropriately for the compose method.

    + +

    Some -compose methods can modify the 'destination' +image outside the overlay area. It is disabled by default. You can enable this by setting the define: -define 'compose:clip-to-self=true'.

    + +

    The SVG compositing specification requires that color and opacity values range between zero and QuantumRange inclusive. You can permit values outside this range with this option: -set 'option:compose:clamp=false

    + + +
    +

    -compress type

    +
    + +

    Use pixel compression specified by type when writing the image.

    + +

    Choices are: None, BZip, Fax, Group4, JPEG, JPEG2000, Lossless, LZW, RLE or Zip.

    + +

    To print a complete list of compression types, use -list +compress.

    + +

    Specify +compress to store the binary image in an +uncompressed format. The default is the compression type of the specified +image file.

    + +

    If LZW compression is specified but LZW compression has not been +enabled, the image data is written in an uncompressed LZW format that can be +read by LZW decoders. This may result in larger-than-expected GIF files.

    + +

    Lossless refers to lossless JPEG, which is only available if the +JPEG library has been patched to support it. Use of lossless JPEG is generally +not recommended.

    + +

    +When writing an ICO file, you may request that the images be encoded in +PNG format, by specifying Zip compression.

    + +

    +When writing a JNG file, specify Zip compression to request that +the alpha channel be encoded in PNG "IDAT" format, or JPEG +to request that it be encoded in JPG "JDAA" format.

    + +

    Use the -quality option to set the compression level +to be used by JPEG, PNG, MIFF, and MPEG encoders. +Use the -sampling-factor option to set the +sampling factor to be used by JPEG, MPEG, and YUV encoders for down-sampling +the chroma channels.

    + +
    +

    -connected-components connectivity

    +
    + +

    connected-components labeling detects connected regions in an image, choose from 4 or 8 way connectivity.

    + +

    Use -define connected-components:verbose=true to output statistics associated with each unique label.

    + +
    +

    -contrast

    +
    + +

    Enhance or reduce the image contrast.

    + +

    This option enhances the intensity differences between the lighter and +darker elements of the image. Use -contrast to enhance +the image or +contrast to reduce the image +contrast.

    + +

    For a more pronounced effect you can repeat the option:

    + +
      < class="bg-light text-dark mx-4">convert rose: -contrast -contrast rose_c2.png +
    + +
    +

    -contrast-stretch black-point
    -contrast-stretch black-point{xwhite-point}{%}

    +
    + +

    Increase the contrast in an image by stretching the range of intensity values.

    + +

    While performing the stretch, black-out at most black-point pixels and white-out at most white-point pixels. Or, if percent is used, black-out at most +black-point % pixels and white-out at most white-point % pixels.

    + +

    Prior to ImageMagick 6.4.7-0, -contrast-stretch will black-out at most black-point pixels and white-out at most total pixels +minus white-point pixels. Or, if percent is used, black-out at most black-point % pixels and white-out at most 100% minus white-point % pixels.

    + +

    Note that -contrast-stretch 0 will modify the image such that +the image's min and max values are stretched to 0 and QuantumRange, respectively, without any loss of data due to burn-out or +clipping at either end. This is not the same as -normalize, which is equivalent to -contrast-stretch 0.15x0.05% (or +prior to ImageMagick 6.4.7-0, -contrast-stretch 2%x99%).

    + +

    Internally operator works by creating a histogram bin, and then uses that +bin to modify the image. As such some colors may be merged together when they +originally fell into the same 'bin'.

    + +

    All the channels are normalized in concert by the same amount so as to +preserve color integrity, when the default +channel +setting is in use. Specifying any other -channel +setting will normalize the RGB channels independently.

    + +

    See also -auto-level for a 'perfect' +normalization of mathematical images.

    + +

    This operator is under review for re-development.

    + + +
    +

    -convolve kernel

    +
    + +

    Convolve an image with a user-supplied convolution kernel.

    + +

    The kernel is a matrix specified as +a comma-separated list of integers (with no spaces), ordered left-to right, +starting with the top row. Presently, only odd-dimensioned kernels are +supported, and therefore the number of entries in the specified kernel must be 32=9, 52=25, +72=49, etc.

    + +

    Note that the -convolve operator supports the -bias setting. This option shifts the convolution so that +positive and negative results are relative to a user-specified bias value. +This is important for non-HDRI compilations of ImageMagick when dealing with +convolutions that contain negative as well as positive values. This is +especially the case with convolutions involving high pass filters or edge +detection. Without an output bias, the negative values is clipped at zero. +

    + +

    When using an ImageMagick with the HDRI compile-time setting, -bias is not needed, as ImageMagick is able to store/handle any +negative results without clipping to the color value range (0..QuantumRange). +See the discussion on HDRI implementations of ImageMagick on the page High +Dynamic-Range Images. For more about HDRI go the ImageMagick Usage pages or this +Wikipedia +entry.

    + + +
    +

    -copy geometry offset

    +
    + +

    Copy pixels from one area of an image to another.

    + +
    +

    -crop geometry{@}{!}

    +
    + +

    Cut out one or more rectangular regions of the image.

    + +

    See Image Geometry for complete details about the geometry argument.

    + +

    The width and height of the geometry argument give the size of the image that remains +after cropping, and x and y in the +offset (if present) gives the location of the top left +corner of the cropped image with respect to the original image. To specify the +amount to be removed, use -shave instead.

    + +

    If the x and y offsets are +present, a single image is generated, consisting of the pixels from the +cropping region. The offsets specify the location of the upper left corner of +the cropping region measured downward and rightward with respect to the upper +left corner of the image. If the -gravity option is +present with NorthEast, East, or SouthEast +gravity, it gives the distance leftward from the right edge of the image to +the right edge of the cropping region. Similarly, if the -gravity option is present with SouthWest, +South, or SouthEast gravity, the distance is measured +upward between the bottom edges.

    + +

    If the x and y offsets are +omitted, a set of tiles of the specified geometry, covering the entire input +image, is generated. The rightmost tiles and the bottom tiles are smaller if +the specified geometry extends beyond the dimensions of the input image.

    + +

    You can add the @ to the geometry argument to equally divide the image into the number of tiles generated.

    + +

    By adding a exclamation character flag to the geometry argument, the +cropped images virtual canvas page size and offset is set as if the +geometry argument was a viewport or window. This means the canvas page size +is set to exactly the same size you specified, the image offset set +relative top left corner of the region cropped.

    + +

    If the cropped image 'missed' the actual image on its virtual canvas, a +special single pixel transparent 'missed' image is returned, and a 'crop +missed' warning given.

    + +

    It might be necessary to +repage the image prior to +cropping the image to ensure the crop coordinate frame is relocated to the +upper-left corner of the visible image. + +Similarly you may want to use +repage after cropping to +remove the page offset that will be left behind. This is especially true when +you are going to write to an image format such as PNG that supports an image +offset.

    + +
    +

    -cycle amount

    +
    + +

    Displace image colormap by amount.

    + +

    Amount defines the number of positions each +colormap entry is shifted.

    + + +
    +

    -debug events

    +
    + +

    Enable debug printout.

    + +

    The events parameter specifies which events are to be logged. It +can be either None, All, Trace, or +a comma-separated list consisting of one or more of the following domains: +Accelerate, Annotate, Blob, Cache, +Coder, Configure, Deprecate, +Exception, Locale, Render, +Resource, Security, TemporaryFile, +Transform, X11, or User.

    + + +

    For example, to log cache and blob events, use.

    + +
      < class="bg-light text-dark mx-4">convert -debug "Cache,Blob" rose: rose.png +
    + +

    The User domain is normally empty, but developers can log user +events in their private copy of ImageMagick.

    + +

    To print the complete list of debug methods, use -list +debug.

    + +

    Use the -log option to specify the format for debugging +output.

    + +

    Use +debug to turn off all logging.

    + +

    Debugging may also be set using the MAGICK_DEBUG environment variable. The allowed values for the MAGICK_DEBUG +environment variable are the same as for the -debug +option.

    + + +
    +

    -decipher filename

    +
    + +

    Decipher and restore pixels that were previously transformed by -encipher.

    + +

    Get the passphrase from the file specified by filename.

    + +

    For more information, see the webpage, ImageMagick: Encipher or +Decipher an Image.

    + + +
    +

    -deconstruct

    +
    + +

    Find areas that has changed between images

    + +

    Given a sequence of images all the same size, such as produced by -coalesce, replace the second and later images, with +a smaller image of just the area that changed relative to the previous image. +

    + +

    The resulting sequence of images can be used to optimize an animation +sequence, though will not work correctly for GIF animations when parts of the +animation can go from opaque to transparent.

    + +

    This option is actually equivalent to the -layers +method 'compare-any'.

    + + +
    +

    -define key{=value}...

    +
    + +

    Add specific global settings generally used to control coders and image processing operations.

    + +

    This option creates one or more definitions for coders and decoders to use +while reading and writing image data. Definitions are generally used to +control image file format coder modules, and image processing operations, +beyond what is provided by normal means. Defined settings are listed in -verbose information ("info:" output format) +as "Artifacts".

    + +

    If value is missing for a definition, an empty-valued +definition of a flag is created with that name. This used to control on/off +options. Use +define key to remove definitions +previously created. Use +define "*" to remove all +existing definitions.

    + +

    The same 'artifact' settings can also be defined using the -set "option:key" "value" option, which also allows the use of Format and Print Image +Properties in the defined value.

    + +

    The option and key are case-independent (they are +converted to lowercase for use within the decoders) while the value +is case-dependent.

    + +

    Such settings are global in scope, and affect all images and operations.

    + +

    See ImageMagick Defines for a list of recognized defines. For example:

    + +
      < class="bg-light text-dark mx-4">convert bilevel.tif -define ps:imagemask eps3:stencil.ps +
    + +

    Set attributes of the image registry by prefixing the value with +registry:. For example, to set a temporary path to put work files, +use:

    + +
      < class="bg-light text-dark mx-4">-define registry:temporary-path=/data/tmp +
    + +
    +

    -delay ticks
    -delay ticksxticks-per-second {<} {>}

    +
    + +

    Display the next image after pausing.

    + +

    This option is useful for regulating the animation of image sequences +ticks/ticks-per-second seconds must expire before the display of the +next image. The default is no delay between each showing of the image +sequence. The default ticks-per-second is 100.

    + +

    Use > to change the image delay only if its current +value exceeds the given delay. < changes the image delay +only if current value is less than the given delay. For example, if +you specify 30> and the image delay is 20, the image delay does +not change. However, if the image delay is 40 or 50, the delay it is changed +to 30. Enclose the given delay in quotation marks to prevent the +< or > from being interpreted by your shell as +a file redirection.

    + + +
    +

    -delete indexes

    +
    + +

    Delete the images specified by index, from the image sequence.

    + +

    Specify the image by its index in the sequence. The first image is index +0. Negative indexes are relative to the end of the sequence, for example, -1 +represents the last image of the sequence. Specify a range of images with +a dash (e.g. 0-4). Separate indexes with a comma (e.g. 0,2). Use ++delete to delete the last image in the current image sequence. Use -delete 0--1 to delete the entire image sequence.

    + + +
    +

    -density width
    -density widthxheight

    +
    + +

    Set the horizontal and vertical resolution of an image for rendering to devices.

    + +

    This option specifies the image resolution to store while encoding a raster +image or the canvas resolution while rendering (reading) vector formats such +as Postscript, PDF, WMF, and SVG into a raster image. Image resolution +provides the unit of measure to apply when rendering to an output device or +raster image. The default unit of measure is in dots per inch (DPI). The -units option may be used to select dots per centimeter +instead.

    + +

    The default resolution is 72 dots per inch, which is equivalent to one +point per pixel (Macintosh and Postscript standard). Computer screens are +normally 72 or 96 dots per inch, while printers typically support 150, 300, +600, or 1200 dots per inch. To determine the resolution of your display, use +a ruler to measure the width of your screen in inches, and divide by the +number of horizontal pixels (1024 on a 1024x768 display).

    + +

    If the file format supports it, this option may be used to update the +stored image resolution. Note that Photoshop stores and obtains image +resolution from a proprietary embedded profile. If this profile is not +stripped from the image, then Photoshop will continue to treat the image using +its former resolution, ignoring the image resolution specified in the standard +file header.

    + +

    The -density option sets an attribute and +does not alter the underlying raster image. It may be used to adjust the +rendered size for desktop publishing purposes by adjusting the scale applied +to the pixels. To resize the image so that it is the same size at a different +resolution, use the -resample option.

    + +
    +

    -depth value

    +
    + +

    Depth of the image.

    + +

    Color depth is the number of bits per channel for each pixel. For example, for a depth of 16 using RGB, each channel of Red, Green, and Blue can range from 0 to 2^16-1 (65535). Use this option to specify the depth of raw images formats whose depth is unknown such as GRAY, RGB, or CMYK, or to change the depth of any image after it has been read.

    + +

    Use +depth to return depth to its default value.

    + +
    +

    -descend

    +
    + +

    Obtain image by descending window hierarchy.

    + +
    +

    -deskew threshold{%}

    +
    + +

    Straighten an image. A threshold of 40% works for most images.

    + +

    Use -set option:deskew:auto-crop +true | false to auto crop the image.

    + +
    +

    -despeckle

    +
    + +

    Reduce the speckles within an image.

    + +
    +

    -direction type

    +
    + +

    Render text right-to-left or left-to-right. Requires the RAQM delegate library and complex text layout.

    + +
    +

    -displace horizontal-scale{%}{!}
    -displace horizontal-scalexvertical-scale{%}{!}

    +
    + +

    Shift image pixels as defined by a displacement map.

    + +

    With this option, the 'overlay' image, and optionally the 'mask' image, +is used as a displacement map, which is used to displace the lookup of +what part of the 'background' image is seen at each point of the overlaid +area. Much like the displacement map is a 'lens' that redirects light shining +through it so as to present a distorted view the original 'background' image +behind it.

    + +

    Any perfect grey areas of the displacement map produce a zero +displacement of the image. Black areas produce the given maximum negative +displacement of the lookup point, while white produce a maximum positive +displacement of the lookup.

    + +

    Note that it is the lookup of the 'background' that is displaced, not a +displacement of the image itself. As such an area of the displacement map +containing 'white' will have the lookup point 'shifted' by a positive amount, +and thus generating a copy of the destination image to the right/downward from +the correct position. That is the image will look like it may have been +'shifted' in a negative left/upward direction. Understanding this is a very +important in understanding how displacement maps work.

    + +

    The given arguments define the maximum amount of displacement in pixels +that a particular map can produce. If the displacement scale is large enough +it is also possible to lookup parts of the 'background' image that lie well +outside the bounds of the displacement map itself. That is you could very +easily copy a section of the original image from outside the overlay area +into the overlay area.

    + +

    The '%' flag makes the displacement scale relative to the size of the +overlay image (100% = half width/height of image). Using '!' switches +percentage arguments to refer to the destination image size instead. +these flags were added as of IM v6.5.3-5.

    + +

    Normally a single grayscale displacement map is provided, which with the +given scaling values will determine a single direction (vector) in which +displacements can occur (positively or negatively). However, if you also +specify a third image which is normally used as a mask, +the composite image is used for horizontal X +displacement, while the mask image is used for vertical Y +displacement. This allows you to define completely different displacement +values for the X and Y directions, and allowing you to lookup any point within +the scale bounds. In other words each pixel can lookup +any other nearby pixel, producing complex 2 dimensional displacements, rather +than a simple 1 dimensional vector displacements.

    + +

    Alternatively rather than supplying two separate images, as of IM v6.4.4-0, +you can use the 'red' channel of the overlay image to specify the horizontal +or X displacement, and the 'green' channel for the vertical or Y displacement. +

    + +

    As of IM v6.5.3-5 any alpha channel in the overlay image is used as a +mask the transparency of the destination image. However areas outside the +overlaid areas will not be affected.

    + + +
    +

    -display host:display[.screen]

    +
    + +

    Specifies the X server to contact.

    + +

    This option is used with convert for obtaining image or font from this +X server. See X(1).

    + +
    +

    -dispose method

    +
    + +

    Define the GIF disposal image setting for images that are being created or read in.

    + +

    The layer disposal method defines the way each the displayed image is to be +modified after the current 'frame' of an animation has finished being +displayed (after its 'delay' period), but before the next frame on an +animation is to be overlaid onto the display.

    + +

    Here are the valid methods:

    + +
    +
    +
    Undefined
    0: No disposal specified (equivalent to 'none').
    +
    None
    1: Do not dispose, just overlay next frame image.
    +
    Background
    2: Clear the frame area with the background color.
    +
    Previous
    3: Clear to the image prior to this frames overlay.
    +
    +
    + +

    You can also use the numbers given above, which is what the GIF format +uses internally to represent the above settings.

    + +

    To print a complete list of dispose methods, use -list dispose.

    + +

    Use +dispose, turn off the setting and prevent +resetting the layer disposal methods of images being read in.

    + +

    Use -set 'dispose' method to set the image +disposal method for images already in memory.

    + +
    +

    -dissimilarity-threshold value

    +
    + +

    Maximum RMSE for subimage match (default 0.2).

    + + +
    +

    -dissolve src_percent[xdst_percent]

    +
    + +

    Dissolve an image into another by the given percent.

    + +

    The opacity of the composite image is multiplied by the given percent, then +it is composited 'over' the main image. If src_percent +is greater than 100, start dissolving the main image so it becomes +transparent at a value of '200'. If both percentages +are given, each image are dissolved to the percentages given.

    + +

    Note that dissolve percentages do not add, two opaque images dissolved +'50,50', produce a 75% transparency. For a 50% + 50% blending of the two +images, you would need to use dissolve values of '50,100'.

    + +
    +

    -distort method arguments

    +
    + +

    Distort an image, using the given method and its required arguments.

    + +

    The arguments is a single string containing a list +of floating point numbers separated by commas or spaces. The number of +and meaning of the floating point values depends on the distortion method being used.

    + +

    Choose from these distortion types:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDescription
    ScaleRotateTranslate
    SRT
    + Distort image by first scaling and rotating about a given 'center', + before translating that 'center' to the new location, in that order. It + is an alternative method of specifying a 'Affine' type of + distortion, but without shearing effects. It also provides a good way + of rotating and displacing a smaller image for tiling onto a larger + background (IE 2-dimensional animations).
    + + The number of arguments determine the specific meaning of each + argument for the scales, rotation, and translation operations.
    + +
    +
    2:
    Scale Angle
    +
    3:
    X,Y Angle
    +
    4:
    X,Y Scale Angle
    +
    5:
    X,Y ScaleX,ScaleY Angle
    +
    6:
    X,Y Scale Angle NewX,NewY
    +
    7:
    X,Y ScaleX,ScaleY Angle NewX,NewY
    +
    + + This is actually an alternative way of specifying a 2 dimensional linear + 'Affine' or 'AffineProjection' distortion.
    Affine + Distort the image linearly by moving a list of at least 3 or more sets + of control points (as defined below). Ideally 3 sets or 12 floating + point values are given allowing the image to be linearly scaled, + rotated, sheared, and translated, according to those three points. See + also the related 'AffineProjection' and 'SRT' + distortions.
    + + More than 3 sets given control point pairs (12 numbers) is least + squares fitted to best match a linear affine distortion. If only 2 + control point pairs (8 numbers) are given a two point image translation + rotation and scaling is performed, without any possible shearing, + flipping or changes in aspect ratio to the resulting image. If only one + control point pair is provides the image is only translated, (which may + be a floating point non-integer translation).
    + + This distortion does not include any form of perspective distortion. +
    RigidAffine + A rigid affine (also known as a Euclidean transform), is similar to Affine but restricts the distortion to 4 arguments (S, R, Tx, Ty) with Sy = Sx and Ry = -Rx so that the distortion only has scale, rotation and translation. No skew. A minimum of two control point pairs is required. +
    AffineProjection + Linearly distort an image using the given Affine Matrix of 6 + pre-calculated coefficients forming a set of Affine Equations to map + the source image to the destination image. + +

    + sx, rx, + ry, sy, + tx, ty +

    + + See -affine setting for more detail, and + meanings of these coefficients.
    + + The distortions 'Affine' and 'SRT' provide + alternative methods of defining this distortion, with ImageMagick doing + the calculations needed to generate the required coefficients. You can + see the internally generated coefficients, by using a -verbose setting with those other variants.
    BilinearForward
    + BilinearReverse
    + Bilinear Distortion, given a minimum of 4 sets of coordinate pairs, or + 16 values (see below). Not that lines may not appear straight after + distortion, though the distance between coordinates will remain + consistent.
    + + The 'BilinearForward' is used to map rectangles to any + quadrilateral, while the 'BilinearReverse' form maps any + quadrilateral to a rectangle, while preserving the straight line edges + in each case.
    + + Note that 'BilinearForward' can generate invalid pixels + which will be colored using the -mattecolor + color setting. Also if the quadrilateral becomes 'flipped' the image + may disappear.
    + + There are future plans to produce a true Bilinear distortion that will + attempt to map any quadrilateral to any other quadrilateral, while + preserving edges (and edge distance ratios). + +
    Perspective + Perspective distort the images, using a list of 4 or more sets of + control points (as defined below). More that 4 sets (16 numbers) of + control points provide least squares fitting for more accurate + distortions (for the purposes of image registration and panorama + effects). Less than 4 sets will fall back to a 'Affine' + linear distortion.
    + + Perspective Distorted images ensures that straight lines remain + straight, but the scale of the distorted image will vary. The horizon + is anti-aliased, and the 'sky' color may be set using the + -mattecolor setting.
    PerspectiveProjection + Do a 'Perspective' distortion biased on a set of 8 + pre-calculated coefficients. You can get these coefficients by looking + at the -verbose output of a + 'Perspective' distortion, or by calculating them yourself. + If the last two perspective scaling coefficients are zero, the + remaining 6 represents a transposed 'Affine Matrix'.
    Polynomial + Do an Nth order 2D 'Polynomial' distortion using a set of corresponding + control points. The order of the polynomial dictates the minimum number of + control points needed. Order 1 is the same as -distort Affine. Order 1.5 is the + same as -distort BilinearReverse. Typical use is for a 2nd order distortion. + There is no +distort polynomial.
    Arc + Arc the image (variation of polar mapping) over the angle given around + a circle. + +
    +
    arc_angle
    +
    The angle over which to arc the image side-to-side
    +
    rotate_angle
    +
    Angle to rotate resulting image from vertical center
    +
    top_radius
    +
    Set top edge of source image at this radius
    +
    bottom_radius
    +
    Set bottom edge to this radius (radial scaling)
    +
    + + The resulting image is always resized to best fit the resulting image, + (as if using +distort) while attempting to + preserve scale and aspect ratio of the original image as much as + possible with the arguments given by the user. All four arguments will + be needed to change the overall aspect ratio of an 'Arc'ed image.
    + + This a variation of a polar distortion designed to try to preserve the + aspect ratio of the image rather than direct Cartesian to Polar + conversion.
    Polar + Like 'Arc' but do a complete Cartesian to Polar mapping of + the image. that is the height of the input image is mapped to the + radius limits, while the width is wrapped around between the + angle limits.
    + + Arguments: Rmax,Rmin CenterX,CenterY, start,end_angle
    + + All arguments are optional. With Rmin defaulting to zero, the + center to the center of the image, and the angles going from -180 (top) + to +180 (top). If Rmax is given the special value of + '0', the distance from the center to the nearest edge + is used for the radius of the output image, which will ensure the whole + image is visible (though scaled smaller). However a special value of + '-1' will use the distance from the center to the furthest + corner, This may 'clip' the corners from the input rectangular image, + but will generate the exact reverse of a 'DePolar' with + the same arguments.
    + + If the plus form of distort (+distort) is used + output image center will default to 0,0 of the virtual + canvas, and the image size adjusted to ensure the whole input image is + made visible in the output image on the virtual canvas.
    DePolar + Uses the same arguments and meanings as a 'Polar' distortion + but generates the reverse Polar to Cartesian distortion.
    + + The special Rmax setting of '0' may however clip + the corners of the input image. However using the special + Rmax setting of '-1' (maximum center to corner + distance) will ensure the whole distorted image is preserved in the + generated result, so that the same argument to 'Polar' will + reverse the distortion re-producing the original. + + Note that as this distortion requires the area resampling of a circular + arc, which can not be handled by the builtin EWA resampling function. + As such the normal EWA filters are turned off. It is recommended some + form of 'super-sampling' image processing technique be used to produce + a high quality result.
    Barrel + Given the four coefficients (A,B,C,D) as defined by Helmut + Dersch, perform a barrel or pin-cushion distortion appropriate to + correct radial lens distortions. That is in photographs, make straight + lines straight again.
    + +

    Arguments: A B C [ D [ + X , Y ] ]
    + or Ax Bx Cx Dx + Ay By Cy Dy + [ X , Y ]

    + So that it forms the function +

    Rsrc = r * ( A*r3 + B*r2 + + C*r + D )

    + + Where X,Y is the optional center of the distortion + (defaulting to the center of the image).
    + The second form is typically used to distort images, rather than + correct lens distortions.
    +
    BarrelInverse + This is very similar to 'Barrel' with the same set of + arguments, and argument handling. However it uses the inverse + of the radial polynomial, + so that it forms the function +

    Rsrc = r / ( A*r3 + B*r2 + + C*r + D )

    + Note that this is not the reverse of the 'Barrel' + distortion, just a different barrel-like radial distortion method. + +
    Shepards + Distort the given list control points (any number) using an Inverse + Squared Distance Interpolation Method (Shepards + Method). The control points in effect do 'localized' displacement + of the image around the given control point (preserving the look and + the rotation of the area near the control points. For best results + extra control points should be added to 'lock' the positions of the + corners, edges and other unchanging parts of the image, to prevent + their movement.
    + + The distortion has been likened to 'taffy pulling' using nails, or + pins' stuck in a block of 'jelly' which is then moved to the new + position, distorting the surface of the jelly.
    + + Internally it is equivalent to generating a displacement map (see -displace) for source image color look-up using + the -sparse-color method of the same name. + +
    +
    + +

    To print a complete list of distortion methods, use -list +distort.

    + +

    Many of the above distortion methods such as 'Affine', +'Perspective', and 'Shepards' use a list control points +defining how these points in the given image should be distorted in the +destination image. Each set of four floating point values represent a source +image coordinate, followed immediately by the destination image coordinate. +This produces a list of values such as...

    +

    + U1,V1 X1,Y1 + U2,V2 X2,Y2 + U3,V3 X3,Y3 + ... + Un,Vn Xn,Yn +

    +

    where U,V on the source image is mapped to X,Y on the +destination image.

    + +

    For example, to warp an image using 'perspective' distortion, +needs a list of at least 4 sets of coordinates, or 16 numbers. Here is the +perspective distortion of the built-in "rose:" image. Note how spaces were +used to group the 4 sets of coordinate pairs, to make it easier to read and +understand.

    + +
      < class="bg-light text-dark mx-4">convert rose: -virtual-pixel black \ + -distort Perspective '0,0,0,0 0,45,0,45 69,0,60,10 69,45,60,35' \ + rose_3d_rotated.gif" +
    + +

    If more that the required number of coordinate pairs are given for +a distortion, the distortion method is 'least squares' fitted to produce the +best result for all the coordinate pairs given. If less than the ideal number +of points are given, the distort will generally fall back to a simpler form of +distortion that can handles the smaller number of coordinates (usually a linear +'Affine' distortion).

    + +

    By using more coordinates you can make use of image registration tool to +find matching coordinate pairs in overlapping images, so as to improve the +'fit' of the distortion. Of course a bad coordinate pair can also make the +'fit' worse. Caution is always advised.

    + +

    Colors are acquired from the source image according to a cylindrical +resampling -filter, using a special technique known as +EWA resampling. This produces very high quality results, especially when +images become smaller (minified) in the output, which is very common when +using 'perspective' distortion. For example here we view +a infinitely tiled 'plane' all the way to the horizon.

    + +
      < class="bg-light text-dark mx-4">convert -size 90x90 pattern:checkerboard -normalize -virtual-pixel tile \ + -distort perspective '0,0,5,45 89,0,45,46 0,89,0,89 89,89,89,89' \ + checks_tiled.jpg +
    + +

    Note that a infinitely tiled perspective images involving the horizon can +be very slow, because of the number of pixels that are compressed to generate +each individual pixel close to the 'horizon'. You can turn off EWA +resampling, by specifying the special -filter setting of +'point' (recommended if you plan to use super-sampling instead). +

    + +

    If an image generates invalid pixels, such as the 'sky' in the last +example, -distort will use the current -mattecolor setting for these pixels. If you do not +what these pixels to be visible, set the color to match the rest of the +ground.

    + +

    The output image size will by default be the same as the input image. This +means that if the part of the distorted image falls outside the viewed area of +the 'distorted space', those parts is clipped and lost. However if you use +the plus form of the operator (+distort) the operator +will attempt (if possible) to show the whole of the distorted image, while +retaining a correct 'virtual canvas' offset, for image layering. This offset +may need to be removed using +repage, to remove if it +is unwanted.

    + +

    Setting -verbose setting, will cause -distort to attempt to output the internal coefficients, +and the -fx equivalent to the distortion, for expert study, +and debugging purposes. This many not be available for all distorts.

    + +

    You can alternatively specify a special "-define distort:viewport={geometry_string}" setting which will +specify the size and the offset of the generated 'viewport' image of the +distorted image space.

    + +

    Setting a "-define +distort:scale=scale_factor" will scale the output image (viewport or +otherwise) by that factor without changing the viewed contents of the +distorted image. This can be used either for 'super-sampling' the image for +a higher quality result, or for panning and zooming around the image (with +appropriate viewport changes, or post-distort cropping and resizing).

    + +

    Setting "-define resample:verbose=1" +will output the cylindrical filter lookup table created by the EWA (Elliptical +Weighted Average) resampling algorithm. Note this table uses a squared radius +lookup value. This is typically only used for debugging EWA resampling.

    + + +
    +

    -distribute-cache port

    +
    + +

    Launch a distributed pixel cache server.

    + +
    +

    -dither method

    +
    + +

    Apply a Riemersma or Floyd-Steinberg error diffusion dither to +images when general color reduction is applied via an option, or automagically +when saving to specific formats. This enabled by default.

    + +

    Dithering places two or more colors in neighboring pixels so that to the +eye a closer approximation of the images original color is reproduced. This +reduces the number of colors needed to reproduce the image but at the cost of +a lower level pattern of colors. Error diffusion dithers can use any set of +colors (generated or user defined) to an image.

    + +

    Dithering is turned on by default, to turn it off use the plus form of the +setting, +dither. This will also render PostScript +without text or graphic aliasing. Disabling dithering often (but not always) +leads to faster process, a smaller number of colors, but more cartoon like +image coloring. Generally resulting in 'color banding' effects in areas with +color gradients.

    + +

    The color reduction operators -colors, -monochrome, -remap, and -posterize, apply dithering to images using the reduced +color set they created. These operators are also used as part of automatic +color reduction when saving images to formats with limited color support, such +as GIF:, XBM:, and others, so dithering may also be used +in these cases.

    + +

    Alternatively you can use -random-threshold +to generate purely random dither. Or use -ordered-dither to apply threshold mapped dither +patterns, using uniform color maps, rather than specific color maps.

    +

    Use "-define dither:diffusion-amount=35%, for example, to control the amount of Floyd-Steinberg dither.

    + + +
    +

    -draw string

    +
    + +

    Annotate an image with one or more graphic primitives.

    + +

    Use this option to annotate or decorate an image with one or more graphic +primitives. The primitives include shapes, text, transformations, and pixel +operations.

    + +

    The shape primitives:

    + +
    +
    +
    point
    x,y
    +
    line
    x0,y0 x1,y1
    +
    rectangle
    x0,y0 x1,y1
    +
    roundRectangle
    x0,y0 x1,y1 wc,hc
    +
    arc
    x0,y0 x1,y1 a0,a1
    +
    ellipse
    x0,y0 rx,ry a0,a1
    +
    circle
    x0,y0 x1,y1
    +
    polyline
    x0,y0 ... xn,yn
    +
    polygon
    x0,y0 ... xn,yn
    +
    bezier
    x0,y0 ... xn,yn
    +
    path
    specification
    +
    image
    operator x0,y0 w,h filename
    +
    +
    + +

    The text primitive:

    + +
    +
    text
    x0,y0 string
    +
    +

    The text gravity primitive:

    + +
    +
    gravity
    NorthWest, North, NorthEast, West, Center, East, SouthWest, South, or SouthEast
    +
    + +

    The text gravity primitive only affects the placement of text and does not +interact with the other primitives. It is equivalent to using the -gravity command-line option, except that it is limited in +scope to the -draw option in which it appears.

    + +

    The transformation primitives:

    + +
    +
    +
    rotate
    degrees
    +
    translate
    dx,dy
    +
    scale
    sx,sy
    +
    skewX
    degrees
    +
    skewY
    degrees
    +
    +
    + +

    The pixel operation primitives:

    + +
    +
    +
    color
    x0,y0 method
    +
    matte
    x0,y0 method
    +
    +
    + +

    The shape primitives are drawn in the color specified by the preceding -fill setting. For unfilled shapes, use -fill none. You can optionally control the stroke (the +"outline" of a shape) with the -stroke and -strokewidth settings.

    + +

    A point primitive is specified by a single point in the +pixel plane, that is, by an ordered pair of integer coordinates, +x,y. (As it involves only a single pixel, a point +primitive is not affected by -stroke or -strokewidth.)

    + +

    A line primitive requires a start point and end point.

    + +

    A rectangle primitive is specified by the pair of points at the +upper left and lower right corners.

    + +

    A roundRectangle primitive takes the same corner points as +a rectangle followed by the width and height of the rounded corners +to be removed.

    + +

    The circle primitive makes a disk (filled) or circle (unfilled). +Give the center and any point on the perimeter (boundary).

    + +

    The arc primitive is used to inscribe an elliptical segment in +to a given rectangle. An arc requires the two corners used for +rectangle (see above) followed by the start and end angles of the +arc of the segment (e.g. 130,30 200,100 45,90). The start and end +points produced are then joined with a line segment and the resulting segment +of an ellipse is filled.

    + +

    Use ellipse to draw a partial (or whole) ellipse. Give the +center point, the horizontal and vertical "radii" (the semi-axes of +the ellipse) and start and end angles in degrees (e.g. 100,100 100,150 +0,360).

    + +

    The polyline and polygon primitives require three or +more points to define their perimeters. A polyline is simply +a polygon in which the final point is not stroked to the start +point. When unfilled, this is a polygonal line. If the -stroke setting is none (the default), then +a polyline is identical to a polygon.

    + +

    A coordinate is a pair of integers separated by a space or +optional comma.

    + +

    As an example, to define a circle centered at 100,100 that extends to +150,150 use:

    + +
      < class="bg-light text-dark mx-4">-draw 'circle 100,100 150,150' +
    + +

    The Bezier primitive creates a spline curve and requires three +or points to define its shape. The first and last points are the +knots and these points are attained by the curve, while any +intermediate coordinates are control points. If two control points +are specified, the line between each end knot and its sequentially respective +control point determines the tangent direction of the curve at that end. If +one control point is specified, the lines from the end knots to the one +control point determines the tangent directions of the curve at each end. If +more than two control points are specified, then the additional control points +act in combination to determine the intermediate shape of the curve. In order +to draw complex curves, it is highly recommended either to use the +path primitive or to draw multiple four-point bezier segments with +the start and end knots of each successive segment repeated. For example:

    + +
      < class="bg-light text-dark mx-4">-draw 'bezier 20,50 45,100 45,0 70,50' +-draw 'bezier 70,50 95,100 95,0 120,50' +
    + +

    A path represents an outline of an object, defined in terms of +moveto (set a new current point), lineto (draw a straight line), curveto (draw +a Bezier curve), arc (elliptical or circular arc) and closepath (close the +current shape by drawing a line to the last moveto) elements. Compound paths +(i.e., a path with subpaths, each consisting of a single moveto followed by +one or more line or curve operations) are possible to allow effects such as +donut holes in objects. (See Paths.)

    + +

    Use image to composite an image with another image. Follow the +image keyword with the composite operator, image location, image size, and +filename:

    + +
      < class="bg-light text-dark mx-4">-draw 'image SrcOver 100,100 225,225 image.jpg' +
    + +

    You can use 0,0 for the image size, which means to use the actual +dimensions found in the image header. Otherwise, it is scaled to the given +dimensions. See Alpha Compositing for +a detailed discussion of alpha composition methods that are available.

    + +

    The "special augmented compose operators" such as "dissolve" that require +arguments cannot be used at present with the -draw image option. +

    + +

    Use text to annotate an image with text. Follow the text +coordinates with a string. If the string has embedded spaces, enclose it in +single or double quotes.

    + +

    For example, the following annotates the image with Works like +magick! for an image titled bird.miff.

    + +
      < class="bg-light text-dark mx-4">-draw "text 100,100 'Works like magick!'"
    + +

    See the -annotate option for another convenient way +to annotate an image with text.

    + +

    The rotate primitive rotates subsequent shape primitives and +text primitives about the origin of the main image.:/p> + +

      < class="bg-light text-dark mx-4">-draw "rotate 45 text 10,10 'Works like magick!'"
    + +

    The translate primitive translates subsequent shape and text +primitives.

    + +

    The scale primitive scales them.

    + +

    The skewX and skewY primitives skew them with respect +to the origin of the main image or the region.

    + +

    The transformations modify the current affine matrix, which is initialized +from the initial affine matrix defined by the -affine +option. Transformations are cumulative within the -draw +option. The initial affine matrix is not affected; that matrix is only changed +by the appearance of another -affine option. If another +-draw option appears, the current affine matrix is +reinitialized from the initial affine matrix.

    + +

    Use the color primitive to change the color of a pixel to the +fill color (see -fill). Follow the pixel coordinate with +a method:

    + +
      < class="bg-light text-dark mx-4">point +replace +floodfill +filltoborder +reset +
    + +

    Consider the target pixel as that specified by your coordinate. The +point method recolors the target pixel. The replace +method recolors any pixel that matches the color of the target pixel. +Floodfill recolors any pixel that matches the color of the target +pixel and is a neighbor, whereas filltoborder recolors any neighbor +pixel that is not the border color. Finally, reset recolors all +pixels.

    + +

    Use matte to the change the pixel matte value to transparent. +Follow the pixel coordinate with a method (see the color primitive +for a description of methods). The point method changes the matte +value of the target pixel. The replace method changes the matte +value of any pixel that matches the color of the target pixel. +Floodfill changes the matte value of any pixel that matches the +color of the target pixel and is a neighbor, whereas filltoborder +changes the matte value of any neighbor pixel that is not the border color (-bordercolor). Finally reset changes the +matte value of all pixels.

    + +

    You can set the primitive color, font, and font bounding box color with -fill, -font, and -box +respectively. Options are processed in command line order so be sure to use +these options before the -draw option.

    + +

    Strings that begin with a number must be quoted (e.g. use '1.png' rather +than 1.png).

    + +

    Drawing primitives conform to the Magick +Vector Graphics format.

    +

    Note, drawing requires an alpha channel. If none is available, an all opaque alpha channel is implicitedly created.

    + + +
    +

    -duplicate count,indexes

    +
    + +

    Duplicate an image one or more times.

    + +

    Specify the count and the image to duplicate by its index in the sequence. +The first image is index 0. Negative indexes are relative to the end of the +sequence, for example, -1 represents the last image of the sequence. Specify +a range of images with a dash (e.g. 0-4). Separate indexes with a comma (e.g. +0,2). Use +duplicate to duplicate the last image in the current +image sequence.

    + +
    +

    -edge radius

    +
    + +

    Detect edges within an image.

    + +
    +

    -emboss radius{xsigma

    +
    + +

    Emboss an image.

    + +
    +

    -encipher filename

    +
    + +

    Encipher pixels for later deciphering by -decipher.

    + +

    Get the passphrase from the file specified by filename.

    + +

    For more information, see the webpage, ImageMagick: Encipher or +Decipher an Image.

    + + + +
    +

    -encoding type

    +
    + +

    Specify the text encoding.

    + +

    Choose from

    + +
      < class="bg-light text-dark mx-4">AdobeCustom AdobeExpert +AdobeStandard AppleRoman +BIG5 GB2312 +Latin 2 None +SJIScode Symbol +Unicode Wansung +
    + +
    +

    -endian type

    +
    + +

    Specify endianness (MSB or LSB) of the image.

    + +

    To print a complete list of endian types, use the -list endian option.

    + +

    Use +endian to revert to unspecified endianness.

    + + +
    +

    -enhance

    +
    + +

    Apply a digital filter to enhance a noisy image.

    + + +
    +

    -equalize

    +
    + +

    Perform histogram equalization on the image channel-by-channel.

    + +

    To perform histogram equalization on all channels in concert, transform the +image into some other color space, such as HSL, OHTA, YIQ or YUV, then +equalize the appropriate intensity-like channel, then convert back to RGB.

    + +

    For example using HSL, we have: ... -colorspace HSL -channel lightness +-equalize -colorspace sRGB ...

    + +

    For YIQ, YUV and OHTA use the red channel. For example, OHTA is a principal +components transformation that puts most of the information in the first +channel. Here we have ... -colorspace OHTA -channel red -equalize +-colorspace sRGB ...

    + +
    +

    -evaluate operator value

    +
    + +

    Alter channel pixels by evaluating an arithmetic, relational, or logical expression.

    + +

    (See the -function operator for some +multi-parameter functions. See the -fx operator if more +elaborate calculations are needed.)

    + +

    The behaviors of each operator are summarized in the +following list. For brevity, the numerical value of a "pixel" referred to +below is the value of the corresponding channel of that pixel, while +a "normalized pixel" is that number divided by the maximum +(installation-dependent) value QuantumRange. (If +normalized pixels are used, they are restored, following the other +calculations, to the full range by multiplying by QuantumRange.)

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    operatorSummary (see further below for details)
    Abs Add value to pixels and return absolute value.
    Add Add value to pixels.
    AddModulus Add value to pixels modulo QuantumRange.
    And Binary AND of pixels with value.
    Cos, Cosine Apply cosine to pixels with frequency value with 50% bias added.
    Divide Divide pixels by value.
    Exp base-e exponential function
    Exponential base-e exponential function
    InverseLog Apply inverse scaled logarithm to normalized pixels.
    LeftShift Shift the pixel values left by value bits (i.e., multiply pixels by 2value).
    Log Apply scaled logarithm to normalized pixels.
    Max Set pixels to maximum of value and current pixel value (i.e. set any pixels currently less than value to value).
    Mean Add the value and divide by 2.
    Median Choose the median value from an image sequence.
    Min Set pixels to minimum of value and current pixel value (i.e. set any pixels currently greater than value to value).
    Multiply Multiply pixels by value.
    Or Binary OR of pixels with value.
    Pow Raise normalized pixels to the power value.
    RightShift Shift the pixel values right by value bits (i.e., divide pixels by 2value).
    RMS Square the pixel and add the value.
    RootMeanSquare Square the pixel and add the value.
    Set Set pixel equal to value.
    Sin, Sine Apply sine to pixels with frequency value with 50% bias added.
    Subtract Subtract value from pixels.
    Xor Binary XOR of pixels with value.
    Gaussian-noise
    Impulse-noise
    Laplacian-noise
    Multiplicative-noise (These are equivalent to the corresponding -noise operators.)
    PoissonNoise
    Uniform-noise
    Threshold Threshold pixels larger than value.
    ThresholdBlack Threshold pixels to zero values equal to or below value.
    ThresholdWhite Threshold pixels to maximum values above value.
    +
    + +

    The specified functions are applied only to each previously set -channel in the image. If necessary, the results of the +calculations are truncated (clipped) to fit in the interval [0, QuantumRange]. The transparency channel of the image is +represented as a 'alpha' values (0 = fully transparent), so, for example, a +Divide by 2 of the alpha channel will make the image +semi-transparent. Append the percent symbol '%' to specify a value +as a percentage of the QuantumRange.

    + +

    To print a complete list of -evaluate operators, use +-list evaluate.

    + +

    The results of the Add, Subtract and +Multiply methods can also be achieved using either the -level or the +level operator, with +appropriate argument, to linearly modify the overall range of color values. +Please note, however, that -level treats transparency as +'matte' values (0 = opaque), while -evaluate works with +'alpha' values.

    + +

    AddModulus has been added as of ImageMagick 6.4.8-4 and provides +addition modulo the QuantumRange. It is therefore +equivalent to Add unless the resulting pixel value is outside the +interval [0, QuantumRange].

    + +

    Exp or Exponential has been added as of ImageMagick 6.6.5-1 and +works on normalized pixel values. The value used with +Exp should be negative so as to produce a decaying exponential +function. Non-negative values will always produce results larger unity and +thus outside the interval [0, QuantumRange]. The +formula is expressed below.

    + +

    +exp(value × u) +

    + +

    If the input image is squared, for example, using -function polynomial "2 0 0", then a decaying Gaussian function will be +the result.

    + +

    Log has been added as of ImageMagick 6.4.2-1 and works on +normalized pixel values. This a scaled log function. The value used with Log provides a scaling +factor that adjusts the curvature in the graph of the log function. The +formula applied to a normalized value u is below.

    + +

    +log(value × u + 1) / log(value + 1) +

    + +

    Pow has been added as of ImageMagick 6.4.1-9, and works on +normalized pixel values. Note that Pow is related to the -gamma operator. For example, -gamma 2 is equivalent +to -evaluate pow 0.5, i.e., a 'square root' function. The value used +with -gamma is simply the reciprocal of the value used +with Pow.

    + +

    Cosine and Sine was added as of IM v6.4.8-8 and +converts the image values into a value according to a (co)sine wave function. +The synonyms Cos and Sin may also be used. The output +is biased 50% and normalized by 50% so as to fit in the respective color value +range. The value scaling of the period of the +function (its frequency), and thus determines the number of 'waves' that will +be generated over the input color range. For example, if the value is 1, the effective period is simply the QuantumRange; but if the value is 2, +then the effective period is the half the QuantumRange.

    + +

    +0.5 + 0.5 × cos(2 π u × value). +

    + +

    See also the -function operator, which is a +multi-value version of evaluate.

    + +
    +

    -evaluate-sequence operator

    +
    + +

    Alter channel pixels by evaluating an arithmetic, relational, or logical expression over a sequence of images. Ensure all the images in the sequence are in the same colorspace, otherwise you may get unexpected results, e.g. add -colorspace sRGB to your command-line.

    + +

    To print a complete list of -evaluate-sequence operators, use -list evaluate.

    + +
    +

    -extent geometry

    +
    + +

    Set the image size and offset.

    + +

    If the image is enlarged, unfilled areas are set to the background color. +To position the image, use offsets in the geometry +specification or precede with a -gravity setting. To +specify how to compose the image with the background, use -compose.

    + +

    This command reduces or expands a JPEG image to fit on an 800x600 +display. If the aspect ratio of the input image isn't exactly 4:3, then the +image is centered on an 800x600 black canvas:

    + +
      < class="bg-light text-dark mx-4">convert input.jpg -resize 800x600 -background black -compose Copy \ + -gravity center -extent 800x600 -quality 92 output.jpg +
    + +

    See Image Geometry for complete details about the geometry argument.

    + +
    +

    -extract geometry

    +
    + +

    Extract the specified area from image.

    + +

    This option is most useful for extracting a subregion of a very large raw +image. Note that these two commands are equivalent:

    + +
      < class="bg-light text-dark mx-4">convert -size 16000x16000 -depth 8 -extract 640x480+1280+960 \ + image.rgb image.png", +convert -size 16000x16000 -depth 8 'image.rgb[640x480+1280+960]' \ + image.rgb image.png" +
    + +

    If you omit the offsets, as in

    + +
      < class="bg-light text-dark mx-4">convert -size 16000x16000 -depth 8 -extract 640x480 \ + image.rgb image.png +
    + +

    the image is resized to the specified dimensions instead, +equivalent to:

    + +
      < class="bg-light text-dark mx-4">convert -size 16000x16000 -depth 8 -resize 640x480 image.rgb image.png +
    + +

    See Image Geometry for complete details about the geometry argument.

    + +
    +

    -family fontFamily

    +
    + +

    Set a font family for text.

    + +

    This setting suggests a font family that ImageMagick should try to use for +rendering text. If the family can be found it is used; if not, a default font +(e.g., "Arial") or a family known to be similar is substituted (e.g., +"Courier" might be used if "System" is requested but not found). Note, the family can be a CSS-style font list.

    + +

    For other settings that affect fonts, see the options +-font, +-pointsize, +-stretch, +-style, +and -weight.

    + +
    +

    -features distance

    +
    + +

    Display (co-occurrence matrix) texture measure features for each channel in the image in each of four directions (horizontal, vertical, left and right diagonals) for the specified distance.

    + +
      < class="bg-light text-dark mx-4">Angular Second Moment Sum Entropy +Contrast Entropy +Correlation Difference Variance +Sum of Squares Variance Difference Entropy +Inverse Difference Moment Information Measure of Correlation 1 +Sum Average Information Measure of Correlation 2 +Sum Variance Maximum Correlation Coefficient +
    + +
    +

    -fft

    +
    + +

    Implements the forward discrete Fourier transform (DFT).

    + +

    This option is new as of ImageMagick 6.5.4-3 (and now working for Windows +users in ImageMagick 6.6.0-9). It transforms an image from the normal +(spatial) domain to the frequency domain. In the frequency domain, an image is +represented as a superposition of complex sinusoidal waves of varying +amplitudes. The image x and y coordinates are the possible frequencies along +the x and y directions, respectively, and the pixel intensity values are +complex numbers that correspond to the sinusoidal wave amplitudes. See for +example, Fourier +Transform, Discrete Fourier +Transform and Fast Fourier +Transform.

    + +

    A single image name is provided as output for this option. However, the +output result will have two components. It is either a two-frame image or two +separate images, depending upon whether the image format specified supports +multi-frame images. The reason that we get a dual output result is because the +frequency domain represents an image using complex numbers, which cannot be +visualized directly. Therefore, the complex values are automagically separated +into a two-component image representation. The first component is the +magnitude of the complex number and the second is the phase of the complex +number. See for example, Complex Numbers.

    + +

    The magnitude and phase component images must be specified using image +formats that do not limit the color or compress the image. Thus, MIFF, TIF, +PFM, EXR and PNG are the recommended image formats to use. All of these +formats, except PNG support multi-frame images. So for example,

    + +
      < class="bg-light text-dark mx-4">convert image.png -fft fft_image.miff +
    + +

    generates a magnitude image as fft_image.miff[0] and a phase +image as fft_image.miff[1]. Similarly,

    + +
      < class="bg-light text-dark mx-4">convert image.png -fft fft_image.png +
    + +

    generates a magnitude image as fft_image-0.png and a phase image +as fft_image-1.png. If you prefer this representation, then you can +force any of the other formats to produce two output images by including +adjoin following -fft in the command line.

    + +

    The input image can be any size, but if not square and even-dimensioned, it +is padded automagically to the larger of the width or height of the input +image and to an even number of pixels. The padding will occur at the bottom +and/or right sides of the input image. The resulting output magnitude and +phase images is square at this size. The kind of padding relies on the -virtual-pixel setting.

    + +

    Both output components will have dynamic ranges that fit within +[0, QuantumRange], so that HDRI need not be enabled. +Phase values nominally range from 0 to 2*π, but is scaled to span the full +dynamic range. (The first few releases had non-HDRI scaled but HDRI not +scaled). The magnitude image is not scaled and thus generally will contain +very small values. As such, the image normally will appear totally black. In +order to view any detail, the magnitude image typically is enhanced with a log +function into what is usually called the spectrum. A log function is used to +enhance the darker values more in comparison to the lighter values. This can +be done, for example, as follows:

    + +
      < class="bg-light text-dark mx-4">convert fft_image.miff[0] -contrast-stretch 0 \ + -evaluate log 1000 fft_image_spectrum.png" +
    + +

    where either -contrast-stretch 0 or -auto-level is used to scale the image to full dynamic +range, first. The argument to the -evaluate log +typically is specified between 100 and 10,000, depending upon the amount of +detail that one wants to bring out in the spectrum. Larger values produce more +visible detail. Too much detail, however, may hide the important features.

    + +

    The FFTW delegate library is required to +use -fft.

    + +

    Use +fft to produce two output images that are the real +and imaginary components of the complex valued Fourier transform.

    + +

    However, as the real and imaginary components can contain negative values, +this requires that IM be configured with HDRI enabled. In this case, you must +use either MIFF, TIF, PFM or MPC formats for the real and imaginary component +results, since they are formats that preserve both negative and fractional +values without clipping them or truncating the fractional part. With either +MIFF or TIF, one should add -define quantum:format=32, to allow those image +types to work properly in HDRI mode without clipping.

    + +

    The real and imaginary component images resulting from +fft are also square, even dimensioned images due to the same +padding that was discussed above for the magnitude and phase component +images.

    + +

    See the discussion on HDRI implementations of ImageMagick on the page High Dynamic-Range Images. For more +about HDRI go the ImageMagick Usage pages, Fred's Fourier Processing With ImageMagick page or this Wikipedia + entry.

    + +

    By default the FFT is normalized (and the IFT is not). Use "-define fourier:normalize=forward to explicitly normalize the FFT and unnormalize the IFT.

    + + +
    +

    -fill color

    +
    + +

    Color to use when filling a graphic primitive.

    + +

    This option accepts a color name, a hex color, or a numerical RGB, RGBA, +HSL, HSLA, CMYK, or CMYKA specification. See Color Names for +a description of how to properly specify the color argument.

    + +

    Enclose the color specification in quotation marks to prevent the "#" or +the parentheses from being interpreted by your shell.

    + +

    For example,

    + +
      < class="bg-light text-dark mx-4">-fill blue +-fill "#ddddff" +-fill "rgb(255,255,255)" +
    + +

    See -draw for further details.

    + +

    To print a complete list of color names, use the -list color option.

    + +
    +

    -filter type

    +
    + +

    Use this type of filter when resizing or distorting an image.

    + +

    Use this option to affect the resizing operation of an image during +operations such as -resize and -distort. For example you can use a simple resize filter such as:

    + +
      < class="bg-light text-dark mx-4">Point Hermite Cubic +Box Gaussian Catrom +Triangle Quadratic Mitchell +CubicSpline +
    + +

    Use -define filter:lobes={2,3,4} to specify the support size for filtering for the CubicSpline filter.

    + +

    The Bessel and Sinc filter is also provided (as well +as a faster SincFast equivalent form). However these filters are +generally useless on their own as they are infinite filters that are being +clipped to the filters support size. Their direct use is not recommended +except via expert settings (see below).

    + +

    Instead these special filter functions are typically windowed by a windowing +function that the -filter setting defines. That is +using these functions will define a 'Windowed' filter, appropriate to the +operator involved. Windowed filters include:

    + +
      < class="bg-light text-dark mx-4">Lanczos Hamming Parzen +Blackman Kaiser Welsh +Hanning Bartlett Bohman +
    + +

    Also one special self-windowing filter is also provided +Lagrange, which will automagically re-adjust its function depending +on the current 'support' or 'lobes' expert settings (see below).

    + +

    If you do not select a filter with this option, the filter defaults to +Mitchell for a colormapped image, an image with a matte channel, or +if the image is enlarged. Otherwise the filter default to +Lanczos.

    + +

    To print a complete list of resize filters, use the -list +filter option.

    + +

    You can modify how the filter behaves as it scales your image through the +use of these expert settings (see also -define and -set):-

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    -define filter:blur=factorScale the X axis of the filter (and its window). Use > 1.0 for + blurry or < 1.0 for sharp. This should only be used with Gaussian and + Gaussian-like filters simple filters, or you may not get the expected + results.
    -define filter:support=radiusSet the filter support radius. Defines how large the filter should be and + thus directly defines how slow the filtered resampling process is. All + filters have a default 'preferred' support size. Some filters like + Lagrange and windowed filters adjust themselves depending on + this value. With simple filters this value either does nothing (but slow + the resampling), or will clip the filter function in a detrimental way. +
    -define filter:lobes=countSet the number of lobes to use for the Sinc/Bessel filter. This an + alternative way of specifying the 'support' range of the filter, that is + designed to be more suited to windowed filters, especially when used for + image distorts.
    -define filter:sigma=valueThe 'sigma' value used to define the Gaussian filter. Default + sigma value is '0.5'. It only affects Gaussian but + does not shrink (but may enlarge) the filter's 'support'. It can be used + to generate very small blurs but without the filter 'missing' pixels due + to using a small support setting. A larger value of '0.707' + (a value of '1/sqrt(2)') is another common setting.
    -define filter:b=b-spline_factor
    -define filter:c=keys_alpha_factorRedefine the values used for cubic filters such as Cubic, + Catrom, Mitchel, and Hermite, as well as + the Parzen cubic windowing function. If only one of the values + are defined, the other is set so as to generate a 'Cubic-Keys' filter. + The values meaning was defined by a research paper by + Mitchell-Netravali.
    -define filter:kaiser-beta=valueThe 'alpha' value used to as part of the Kaiser Windowing function. + Default value is '6.5'. It only affects Kaiser windowing function, and + does not affect any other attributes. + Before ImageMagick v6.7.6-10, this option was known as "filter:alpha", (an + inheritance from the very old "zoom" program). It was changed to bring the + function in line with more modern academic research usage, and better + assign it be more definitive.
    -define filter:kaiser-alpha=valueThis value when multiplied by 'PI' is equivalent to "kaiser-beta", and + will override that setting. It only affects Kaiser windowing function, + and does not affect any other attributes.
    -define filter:filter=filter_functionUse this function directly as the weighting filter. This will allow + you to directly use a windowing function such as Blackman, + as a resampling filter, rather than as its normal usage as a windowing + function. If defined, no windowing function also defined, the window function is set + to Box). Directly specifying Sinc or Jinc + as a filter will also do this.
    -define filter:window=filter_functionThe IIR (infinite impulse response) filters Sinc and + Jinc are windowed (brought down to zero over the defined + support range) with the given filter. This allows you to specify a filter + function to be used as a windowing function for these IIR filters. + Many of the defined filters are actually windowing functions for these IIR + filters. A typical choices is Box, (which effectively turns + off the windowing function).
    -define filter:win-support=radiusScale windowing function to this size instead. This causes the windowing + (or self-windowing Lagrange filter) to act is if the support window is + larger than what is actually supplied to the calling operator. The filter + however is still clipped to the real support size given. If unset this + will equal the normal filter support size.
    -define filter:verbose=1This causes IM to print information on the final internal filter + selection to standard output. This includes a commented header on the + filter settings being used, and data allowing the filter weights to be + easily graphed. Note however that some filters are internally defined in terms of other filters. The Lanczos filter for example is defined in terms of + a SincFast windowed SincFast filter, while + Mitchell is defined as a general Cubic family filter + with specific 'B' and 'C' settings.
    +
    + +

    For example, to get a 8 lobe jinc windowed sinc filter (Genseng filter?):

    + +
      < class="bg-light text-dark mx-4">convert image.png \ + -filter sinc \ + -set filter:window=jinc \ + -set filter:lobes=8 \ + -resize 150% image.jpg" +
    + +

    Or a raw un-windowed Sinc filter with 4 lobes:

    + +
      < class="bg-light text-dark mx-4">convert image.png \ + -set filter:filter=sinc \ + -set filter:lobes=4 \ + -resize 150% image.jpg" +
    + +

    To extract the data for a raw windowing function, combine it with +a 'Box' filter. For example the 'Welch parabolic +windowing function.

    + +
      < class="bg-light text-dark mx-4">convert null: -define filter:filter=Box \ + -define filter:window=Welch \ + -define filter:support=1.0 \ + -define filter:verbose=1 \ + -resize 2 null: > window_welch.dat +gnuplot + set grid + plot \"window_welch.dat\" with lines +
    + +

    Note that the use of expert options is provided for image processing experts +who have studied and understand how resize filters work. Without this +knowledge, and an understanding of the definition of the actual filters +involved, using expert settings are more likely to be detrimental to your image +resizing.

    + + +
    +

    -flatten

    +
    + +

    This is a simple alias for the -layers method "flatten".

    + + +
    +

    -flip

    +
    + +

    Create a mirror image

    + +

    reflect the scanlines in the vertical direction. The image will be mirrored +upside-down.

    + + +
    +

    -floodfill {+-}x{+-}y color

    +
    + +

    Floodfill the image with color at the specified offset.

    + +

    Flood fill starts from the given 'seed point' which is not gravity affected. +Any color that matches within -fuzz color distance of the +given color argument, connected to that 'seed point' +will be replaced with the current -fill color.

    + +

    Note that if the pixel at the 'seed point' does not itself match the given +color (according to -fuzz), then no +action will be taken.

    + +

    This operator works more like the -opaque option, than +a more general flood fill that reads the matching color directly at the 'seed +point'. For this form of flood fill, look at -draw and +its 'color floodfill' drawing method.

    + + +
    +

    -flop

    +
    + +

    Create a mirror image.

    + +

    Reflect the scanlines in the horizontal direction, just like the image in +a vertical mirror.

    + + +
    +

    -font name

    +
    + +

    Set the font to use when annotating images with text, or creating labels.

    + +

    To print a complete list of fonts, use the -list font +option (for versions prior to 6.3.6, use 'type' instead of 'font').

    + +

    In addition to the fonts specified by the above pre-defined list, you can +also specify a font from a specific source. For example Arial.ttf +is a TrueType font file, ps:helvetica is PostScript font, and +x:fixed is X11 font.

    + +

    For other settings that affect fonts, see the options -family, -stretch, -style, and -weight.

    + +

    To specify an explicit font filename or collection, specify the font path preceded with a @, e.g., @arial.ttf. You can specify the font face index for font collections, e.g., @msgothic.ttc[1].

    + + +
    +

    -foreground color

    +
    + +

    Define the foreground color for menus.", "display

    + +

    The color is specified using the format described under the -fill option.

    + +

    The default foreground color is black.

    + +
    +

    -format type

    +
    + +

    The image format type.

    + +

    When used with the mogrify utility, this option converts any +image to the image format you specify. +For a list of image format types supported by ImageMagick, use -list format.

    + +

    By default the file is written to its original name. However, if the +filename extension matches a supported format, the extension is replaced with +the image format type specified with -format. For +example, if you specify tiff as the format type and the +input image filename is image.gif, the output image +filename becomes image.tiff.

    + +
    +

    -format string

    +
    + +

    Output formatted image characteristics.

    + +

    See Format and Print Image +Properties for an explanation on how to specify the argument to this +option.

    + +
    +

    -frame geometry

    +
    + +

    Surround the image with a border or beveled frame.

    + +

    The color of the border is specified with the -mattecolor command line option.

    + +

    See Image Geometry for complete details about the geometry argument. The size portion of the geometry argument indicates the amount of extra width and +height that is added to the dimensions of the image. If no offsets are given +in the geometry argument, then the border added is +a solid color. Offsets x and y, if present, specify that +the width and height of the border is partitioned to form an outer bevel of +thickness x pixels and an inner bevel of thickness +y pixels. Negative offsets make no sense as frame arguments. +

    + +

    The -frame option is affected by the current -compose setting and assumes that this is using the default +'Over' composition method. It generates an image of the appropriate +size with the current -bordercolor setting, and then +draws the frame of four distinct colors close to the current -mattecolor. The original image is then overlaid onto +center of this image. This means that with the default compose method of +'Over' any transparent parts may be replaced by the current -bordercolor setting.

    + +

    The image composition is not +affected by the -gravity option.

    + + +
    +

    -frame

    +
    + +

    Include the X window frame in the imported image.

    +
    +

    -function function parameters

    +
    + +

    Apply a function to channel values.

    + +

    This operator performs calculations based on the given arguments to modify +each of the color values for each previously set -channel in the image. See -evaluate for details concerning how the results of the +calculations are handled.

    + +

    This is can be considered a multi-argument version of the -evaluate operator. (Added in +ImageMagick 6.4.8−8.)

    + +

    Here, parameters is a comma-separated list of +numerical values. The number of values varies depending on which function is selected. Choose the function from:

    + +
      < class="bg-light text-dark mx-4">Polynomial +Sinusoid +Arcsin +Arctan +
    + +

    To print a complete list of -function operators, +use -list function. Descriptions follow.

    + +
    +
    +
    Polynomial
    +

    The Polynomial function takes an arbitrary number of parameters, +these being the coefficients of a polynomial, in decreasing order of degree. +That is, entering

    + +
      < class="bg-light text-dark mx-4">-function Polynomial an,an-1,...a1,a0 +
    + +

    will invoke a polynomial function given by

    + +
      < class="bg-light text-dark mx-4">an un + an-1 un-1 + ··· a1 u + a0, +
    + +

    where u is pixel's original normalized channel value.

    + +

    The Polynomial function can be used in place of Set +(the constant polynomial) and Add, Divide, +Multiply, and Subtract (some linear +polynomials) of the -evaluate operator. The -level operator also affects channels linearly. Some +correspondences follow.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    -evaluate Set value -function Polynomial value(Constant functions; set value×100% gray when channels are RGB.)
    -evaluate Add value -function Polynomial 1,value
    -evaluate Subtract value -function Polynomial 1,−value
    -evaluate Multiply value -function Polynomial value,0
    +level black% x white%-function Polynomial A,B(Reduce contrast. Here, A=(white-black)/100 and B=black/100.)
    +
    + +

    The Polynomial function gives great versatility, since +polynomials can be used to fit any continuous curve to any degree of accuracy +desired.

    + +
    +
    Sinusoid
    +
    +

    The Sinusoid function can be used to vary the channel values +sinusoidally by setting frequency, phase shift, amplitude, and a bias. These +values are given as one to four parameters, as follows,

    + +
      < class="bg-light text-dark mx-4">-function Sinusoid freq,[phase,[amp,[bias]]] +
    + +

    where phase is in degrees. (The domain [0,1] of the function +corresponds to 0 through freq×360 degrees.) +The result is that if a pixel's normalized channel value is originally +u, its resulting normalized value is given by

    + +
      < class="bg-light text-dark mx-4">amp * sin(2*π* (freq * u + phase / 360)) + bias +
    + +

    For example, the following generates a curve that starts and ends at 0.9 +(when u=0 and 1, resp.), oscillating three times between +.7−.2=.5 and .7+.2=.9.

    + +
      < class="bg-light text-dark mx-4">-function Sinusoid 3,-90,.2,.7 +
    + +

    The default values of amp and bias are both .5. The default for phase +is 0.

    + +

    The Sinusoid function generalizes Sin and +Cos of the -evaluate operator by allowing +varying amplitude, phase and bias. The correspondence is as follows.

    + +
    + + + + + + + + + +
    -evaluate Sin freq -function Sinusoid freq,0
    -evaluate Cos freq -function Sinusoid freq,90
    +
    +
    +
    ArcSin
    +
    +

    The ArcSin function generates the inverse curve of a Sinusoid, +and can be used to generate cylindrical distortion and displacement maps. +The curve can be adjusted relative to both the input values and output range +of values.

    + +
      < class="bg-light text-dark mx-4">-function ArcSin width,[center,[range,[bias]]] +
    + +

    with all values given in terms of normalized color values (0.0 for black, +1.0 for white). Defaulting to values covering the full range from 0.0 to 1.0 +for bout input (width), and output (width) values. '1.0,0.5,1.0,0.5'

    + +
      < class="bg-light text-dark mx-4">range/π * asin( 2/width * ( u - center ) ) + bias +
    + +
    +
    ArcTan
    +
    +

    The ArcTan function generates a curve that smooth crosses from +limit values at infinities, though a center using the given slope value. +All these values can be adjusted via the arguments.

    + +
      < class="bg-light text-dark mx-4">-function ArcTan slope,[center,[range,[bias]]] +
    + +

    Defaulting to '1.0,0.5,1.0,0.5'. +

    + +
      < class="bg-light text-dark mx-4">range/π * atan( slope*π * ( u - center ) ) + bias +
    +
    +
    +
    + + + +
    +

    -fuzz distance{%}

    +
    + +

    Colors within this distance are considered equal.

    + +

    A number of algorithms search for a target color. By default the color must +be exact. Use this option to match colors that are close to the target color +in RGB space. For example, if you want to automagically trim the edges of an +image with -trim but the image was scanned and the target +background color may differ by a small amount. This option can account for +these differences.

    + +

    The distance can be in absolute intensity units or, by +appending % as a percentage of the maximum possible intensity (255, +65535, or 4294967295).

    + +

    Use +fuzz to reset the fuzz value to 0.

    + + +
    +

    -fx expression

    +
    + +

    Apply a mathematical expression to an image or image channels.

    + +

    If the first character of expression is @, +the expression is read from a file titled by the remaining characters in the +string.

    + +

    See FX, +The Special Effects Image Operator for a detailed discussion of this +option.

    + + +
    +

    -gamma value

    +
    + +

    Level of gamma correction.

    + +

    The same color image displayed on two different workstations may look +different due to differences in the display monitor. Use gamma correction to +adjust for this color difference. Reasonable values extend from +0.8 to 2.3. Gamma less than 1.0 darkens the image and +gamma greater than 1.0 lightens it. Large adjustments to image gamma may +result in the loss of some image information if the pixel quantum size is only +eight bits (quantum range 0 to 255).

    + +

    Gamma adjusts the image's channel values pixel-by-pixel according to +a power law, namely, pow(pixel,1/gamma) or pixel^(1/gamma), where pixel is the +normalized or 0 to 1 color value. For example, using a value of gamma=2 is the +same as taking the square root of the image.

    + +

    Use +gamma value to set the +image gamma level without actually adjusting the image pixels. This option +is useful if the image is of a known gamma but not set as an image attribute +(e.g. PNG images). Write the "file gamma" which is the reciprocal of the +display gamma; e.g., if your image is sRGB and you want to write a PNG gAMA +chunk, use

    + +
      < class="bg-light text-dark mx-4">convert input.png +gamma .45455 output.png +
    + +

    (0.45455 is 1/2.2)

    + +

    Note that gamma adjustments are also available via the -level operator.

    + +
    +

    -gaussian-blur radius
    -gaussian-blur radius{xsigma}

    +
    + +

    Blur the image with a Gaussian operator.

    + +

    Convolve the image with a Gaussian or normal distribution using the given +Sigma value. The formula is:

    + +

    gaussian distribution

    + +

    The Sigma value is the important argument, and +determines the actual amount of blurring that will take place.

    + +

    The Radius is only used to determine the size of the +array which will hold the calculated Gaussian distribution. It should be an +integer. If not given, or set to zero, IM will calculate the largest possible +radius that will provide meaningful results for the Gaussian distribution. +

    + +

    The larger the Radius the radius the slower the +operation is. However too small a Radius, and severe +aliasing effects may result. As a guideline, Radius +should be at least twice the Sigma value, though three +times will produce a more accurate result.

    + +

    This differs from the faster -blur operator in that a +full 2-dimensional convolution is used to generate the weighted average of the +neighboring pixels.

    + +

    The -virtual-pixel setting will determine how +pixels which are outside the image proper are blurred into the final result. +

    + + +
    +

    -geometry geometry

    +
    + +

    Set the preferred size and location of the image.

    + +

    See Image Geometry for complete details about the geometry argument.

    + +
    +

    -gravity type

    +
    + +

    Sets the current gravity suggestion for various other settings and options.

    + +

    Choices include: NorthWest, North, +NorthEast, West, Center, East, +SouthWest, South, SouthEast. Use -list gravity to get a complete list of -gravity settings available in your ImageMagick +installation.

    + +

    The direction you choose specifies where to position text or subimages. For +example, a gravity of Center forces the text to be centered within +the image. By default, the image gravity is undefined. See -draw for more details about graphic primitives. Only the +text primitive of -draw is affected by the -gravity option.

    + +

    The -gravity option is also used in concert with the +-geometry setting and other settings or options that +take geometry as an argument, such as the -crop option.

    + +

    If a -gravity setting occurs before another option +or setting having a geometry argument that specifies an +offset, the offset is usually applied to the point within the image suggested +by the -gravity argument. Thus, in the following +command, for example, suppose the file image.png has dimensions +200x100. The offset specified by the argument to -region +is (−40,+20). The argument to -gravity is +Center, which suggests the midpoint of the image, at the point +(100,50). The offset (−40,20) is applied to that point, giving +(100−40,50+20)=(60,70), so the specified 10x10 region is located at +that point. (In addition, the -gravity affects the +region itself, which is centered at the pixel +coordinate (60,70). (See Image Geometry for complete details about the geometry argument.)

    + +
      < class="bg-light text-dark mx-4">convert image.png -gravity Center -region 10x10-40+20 \ + -negate output.png +
    + +

    When used as an option to composite, -gravity gives the direction that the image gravitates +within the composite.

    + +

    When used as an option to montage, -gravity gives the direction that an image gravitates +within a tile. The default gravity is Center for this purpose.

    + +

    Use +gravity to return gravity to its default value.

    + + +
    +

    -grayscale method

    +
    + +

    Convert image to grayscale.

    + +

    This will use one of the -intensity methods to +convert the given image into a grayscale image.

    + +

    For example, to convert an image to (linear) Rec709Luminance grayscale, type:

    + +
      < class="bg-light text-dark mx-4">convert in.png -grayscale Rec709Luminance out.png +
    + +

    which is equivalent to:

    + +
      < class="bg-light text-dark mx-4"> +convert in.png -colorspace LinearGray out.png +
    + +

    Similarly, to convert an image to (non-linear) Rec709Luma grayscale, type:

    + +
      < class="bg-light text-dark mx-4">convert in.png -grayscale Rec709Luma out.png +
    + +

    which is equivalent to:

    + +
      < class="bg-light text-dark mx-4">convert in.png -colorspace Gray out.png +
    + +

    Note that a 'colorspace' intensity method will produce the same result +regardless of the current colorpsace of the image. But a 'mathematical' +intensity method depends on the current colorspace the image is currently +using.

    + +

    While this operation uses an -intensity method, +it does not use or set the -intensity setting, so +will not affect other operations that may use that setting.

    + + +
    +

    -green-primary x,y

    +
    + +

    Green chromaticity primary point.

    + + +
    +

    -hald-clut

    +
    + +

    Apply a Hald color lookup table to the image.

    + +

    A Hald color lookup table is a 3-dimensional color cube mapped to 2 +dimensions. Create it with the HALD: prefix (e.g. HALD:8). You +can apply any color transformation to the Hald image and then use this option +to apply the transform to the image.

    + +
      < class="bg-light text-dark mx-4">convert image.png hald.png -hald-clut transform.png +
    + +

    This option provides a convenient method for you to use Gimp or Photoshop +to make color corrections to the Hald CLUT image and subsequently apply them +to multiple images using an ImageMagick script.

    + +

    Note that the representation is only of the normal RGB color space and that +the whole color value triplet is used for the interpolated lookup of the +represented Hald color cube image. Because of this the operation is not -channel setting affected, nor can it adjust or modify an +images transparency or alpha/matte channel.

    + +

    See also -clut which provides color value replacement +of the individual color channels, usually involving a simpler grayscale +image. E.g: grayscale to color replacement, or modification by a histogram +mapping.

    + + +
    +

    -help

    +
    + +

    Print usage instructions.

    + +
    +

    -highlight-color color

    +
    + +

    When comparing images, emphasize pixel differences with this color.

    + +
    +

    -hough-lines widthxheight{+threshold}

    +
    + +

    Identify straight lines in the image (e.g. -hough-lines 9x9+195).

    + +

    Use the Hough line detector with any binary edge extracted image to locate and draw any straight lines that it finds.

    + +

    The process accumulates counts for every white pixel in the binary edge image for every possible orientation (for angles from 0 to 179 in 1 deg increments) and distance from the center of the image to the corners (in 1 px increments). It stores the counts in an accumulator matrix of angle vs distance. The size of the accumulator will be 180x(diagonal/2). Next it searches the accumulator for peaks in counts and converts the locations of the peaks to slope and intercept in the normal x,y input image space. The algorithm uses slope/intercepts to find the endpoints clipped to the bounds of the image. The lines are drawn from the given endpoints. The counts are a measure of the length of the lines.

    . + +

    The WxH arguments specify the filter size for locating the peaks in the Hough accumulator. The threshold excludes lines whose counts are less than the threshold value.

    + +

    Use -background to specify the color of the background onto which the lines will be drawn. The default is black.

    + +

    Use -fill to specify the color of the lines. The default is black.

    + +

    Use -stroke and -strokewidth to specify the thickness of the lines. The default is black and no strokewidth.

    + +

    A text file listing the endpoints and counts may be created by using the suffix, .mvg, for the output image.

    + +

    Use -define hough-lines:accumulator=true to return the accumulator image in addition to the lines image.

    + +
    +

    -iconGeometry geometry

    +
    + +

    Specify the icon geometry.

    + +

    Offsets, if present in the geometry specification, are handled in the same +manner as the -geometry option, using X11 style to +handle negative offsets.

    + +

    See Image Geometry for complete details about the geometry argument.

    + +
    +

    -iconic

    +
    + +

    Start in icon mode in X Windows", 'animate', 'display

    + +
    +

    -identify

    +
    + +

    Identify the format and characteristics of the image.

    + +

    This information is printed: image scene number; image name; image size; +the image class (DirectClass or PseudoClass); the total number of unique colors; and the +number of seconds to read and transform the image. Refer to MIFF for +a description of the image class.

    + +

    If -colors is also specified, the total unique colors +in the image and color reduction error values are printed. Refer to color +reduction algorithm for a description of these values.

    + +

    If -verbose precedes this option, copious +amounts of image properties are displayed including image statistics, profiles, +image histogram, and others.

    + +
    +

    -ift

    +
    + +

    Implements the inverse discrete Fourier transform (DFT).

    + +

    This option is new as of ImageMagick 6.5.4-3 (and now working for Windows +users in ImageMagick 6.6.0-9). It transforms a pair of magnitude and phase +images from the frequency domain to a single image in the normal or spatial +domain. See for example, Fourier Transform, +Discrete Fourier Transform and +Fast Fourier Transform.

    + +

    For example, depending upon the image format used to store the result of +the -fft, one would use either

    + +
      < class="bg-light text-dark mx-4">convert fft_image.miff -ift fft_image_ift.png +
    + +

    or

    + +
      < class="bg-light text-dark mx-4">convert fft_image-0.png fft_image-1.png -ift fft_image_ift.png +
    + +

    The resulting image may need to be cropped due to padding introduced when +the original image, prior to the -fft or +fft, was not square or even dimensioned. Any padding is at +the right and/or bottom sides of the image.

    + +

    The FFTW delegate library is required to +use -ift.

    + +

    Use +ift (with HDRI enabled) to transform a pair of real +and imaginary images from the frequency domain to a single image in the normal +(spatial) domain.

    + +

    By default the IFT is not normalized (and the FFT is). Use "-define fourier:normalize=inverse to explicitly normalize the IFT and unnormalize the FFT.

    + +
    +

    -immutable

    +
    + +

    Make image immutable.

    + +
    +

    -implode factor

    +
    + +

    Implode image pixels about the center.

    + +
    +

    -insert index

    +
    + +

    Insert the last image into the image sequence.

    + +

    This option takes last image in the current image sequence and inserts it +at the given index. If a negative index is used, the insert position is +calculated before the last image is removed from the sequence. As such +-insert -1 will result in no change to the image sequence.

    + +

    The +insert option is equivalent to -insert -1. In +other words, insert the last image, at the end of the current image sequence. +Consequently this has no effect on the image sequence order.

    + +
    +

    -intensity method

    +
    + +

    Method to generate intensity value from pixel.

    + +

    ImageMagick provides a number of methods used in situations where an +operator needs to determine a single grayscale value for some purpose, from +an image with red, green, and blue pixel components. Typically the +Rec709Luma formula is used, which is the same formula used when converting images to -colorspace gray.

    + +

    The following formulas are currently provided, and will first convert +the pixel values to linear-RGB or non-linear sRGB colorspace before +being applied to calculate the final greyscale value.

    + +
    +
    +
    Rec601Luma
    0.298839R' + 0.586811G'+ 0.114350B'
    +
    Rec601Luminance
    0.298839R + 0.586811G + 0.114350B
    +
    Rec709Luma
    0.212656R' + 0.715158G' + 0.072186B'
    +
    Rec709Luminance
    0.212656R + 0.715158G + 0.072186B
    +
    Brightness
    max(R', G', B')
    +
    Lightness
    (min(R', G', B') + max(R', G', B')) / 2.0
    +
    +
    + +

    Note that the above R,G,B values is the image's linear-RGB values, while +R',G',B' are sRGB non-linear values.

    + +

    These intensity methods are mathematical in nature and will use the +current value in the images respective R,G,B channel regardless of +what that is, or what colorspace the image is currently using.

    + +
    +
    +
    Average
    (R' + G' + B') / 3.0
    +
    MS
    (R'^2 + G'^2 + B'^2) / 3.0
    +
    RMS
    sqrt( (R'^2 + G'^2 + B'^2) / 3.0 )
    +
    +
    + +

    These methods are often used for other purposes, such as generating a +grayscale difference image between two color images (using -compose 'Difference' composition.

    + +

    For example The 'MS' (Mean Squared) setting is good for minimizing color +error comparisions. While... The method 'RMS' (Root Mean Squared) for +example is appropriate for calculating color vector distance, from a color +difference image. This is equivalent to the color only component of the -fuzz factor color compare setting.

    + +

    See also -grayscale which applies one of the above +grayscaling formula directly to an image without setting the -intensity setting.

    + +

    The -colorspace gray image conversion also uses +the current intensity setting, but will always convert the image to the +appropriate sRGB or linear-RGB colorspace before appling the above +function.

    + +

    To print a complete list of possible pixel intensity setting methods, use -list intensity.

    + +

    Operators affected by the -intensity setting include:

    + +
      < class="bg-light text-dark mx-4">-adaptive-blur +-adaptive-sharpen +-black-threshold +-clut (when mapping greyscale CLUT image to alpha channel if set by -channels) +-colors for gray colorspace +-compose {LightenIntensity, DarkenIntensity, CopyOpacity, CopyBlack} +-contrast-stretch +-distort {ErodeIntensity, DilateIntensity} +-normalize +-random-threshold +-range-threshold +-selective-blur +-shade +-threshold +-tint +-white-threshold +
    + +
    +

    -intent type

    +
    + +

    Use this type of rendering intent when managing the image color.

    + +

    Use this option to affect the color management operation of an image (see +-profile). Choose from these intents: Absolute, +Perceptual, Relative, Saturation.

    + +

    The default intent is Perceptual for the sRGB colorspace and undefined for the RGB and gray colorspaces.

    + +

    To print a complete list of rendering intents, use -list intent.

    + +
    +

    -interlace type

    +
    + +

    The type of interlacing scheme.

    + +

    Choose from:

    + +
      < class="bg-light text-dark mx-4">none +line +plane +partition +JPEG +GIF +PNG +
    + +

    This option is used to specify the type of interlacing scheme for raw image +formats such as RGB or YUV.

    + +

    None means do not interlace (RGBRGBRGBRGBRGBRGB...),

    + +

    Line uses scanline interlacing (RRR...GGG...BBB...RRR...GGG...BBB...), and.

    + +

    Plane uses plane interlacing (RRRRRR...GGGGGG...BBBBBB...).

    + +

    Partition is like plane except the different planes are saved to +individual files (e.g. image.R, image.G, and image.B).

    + +

    Use Line or Plane to create an interlaced +PNG or GIF or progressive JPEG image.

    + +

    To print a complete list of interlacing schemes, use -list +interlace.

    + +
    +

    -interline-spacing value

    +
    + +

    The space between two text lines.

    + +
    +

    -interpolate type

    +
    + +

    Set the pixel color interpolation method to use when looking up a color based on a floating point or real value.

    + +

    When looking up the color of a pixel using a non-integer floating point +value, you typically fall in between the pixel colors defined by the source +image. This setting determines how the color is determined from the colors of +the pixels surrounding that point. That is how to determine the color of a +point that falls between two, or even four different colored pixels.

    + +
    +
    +
    average
    +
    The average color of the surrounding four pixels
    +
    average4
    +
    The average color of the surrounding four pixels
    +
    average9
    +
    The average color of the surrounding nine pixels
    +
    average16
    +
    The average color of the surrounding sixteen pixels
    +
    background
    +
    +
    bilinear
    +
    A double linear interpolation of pixels (the default)
    +
    blend
    +
    +
    catrom
    +
    Fitted bicubic-spines of surrounding 16 pixels
    +
    integer
    +
    The color of the top-left pixel (floor function)
    +
    mesh
    +
    Divide area into two flat triangular interpolations
    +
    nearest-neighbor
    +
    The nearest pixel to the lookup point (rounded function)
    +
    spline
    +
    Direct spline curves (colors are blurred)
    +
    +
    + +

    This most important for distortion operators such as -distort, -implode, -transform and -fx.

    + +

    To print a complete list of interpolation methods, use -list interpolate.

    + +

    See also -virtual-pixel, for control of the +lookup for positions outside the boundaries of the image.

    + + +
    +

    -interpolative-resize geometry

    +
    + +

    Resize with interpolation. See the -interpolate setting.

    + +
    +

    -interword-spacing value

    +
    + +

    The space between two words.

    + +
    +

    -kerning value

    +
    + +

    The space between two letters.

    + + +
    +

    -kmeans colors{xiterations}{+tolerance}

    +
    + +

    Kmeans (iterative) color reduction (e.g. -kmeans 5x100+0.01). Colors is the desired number of colors. Initial colors are found using color quantization. Iterations is the stopping number of iterations (default=100). Convergence is the stopping threshold on the color change between iterations (default=0.01). Processing finishes, if either iterations or tolerance are reached. Use -define kmeans:seed-colors=color-list to initialize the colors, where color-list is a semicolon delimited list of seed colors (e.g. -define kmeans:seed-colors="red;sRGB(19,167,254);#00ffff). A color list overrides the color quantization. A non-empty list of colors overrides the number of colors. Any unassigned initial colors are assigned random colors from the image.

    + +
    +

    -kuwahara radius
    -kuwahara radius{xsigma}

    +
    + +

    Edge preserving noise reduction filter.

    + +

    The radius is more important than the sigma. If sigma is left off, it will be computed automatically from the radius as sigma=radius-0.5. The sigma provides a bit of additional smoothing control.

    + + +
    +

    -label name

    +
    + +

    Assign a label to an image.

    + +

    Use this option to assign a specific label to the image, as it is read in +or created. You can use the -set operation to re-assign +a the labels of images already read in. Image formats such as TIFF, PNG, +MIFF, supports saving the label information with the image.

    + +

    When saving an image to a PostScript file, any label +assigned to an image is used as a header string to print above the postscript +image.

    + +

    You can include the image filename, type, width, height, or other image +attribute by embedding special format character. See Format and Print Image +Properties for details of the percent escape codes.

    + +

    For example,

    + +
      < class="bg-light text-dark mx-4">-label "%m:%f %wx%h" bird.miff +
    + +

    assigns an image label of MIFF:bird.miff 512x480 to the +"bird.miff" image and whose width is 512 and height is 480, as it +is read in. If a +label option was used instead, any +existing label present in the image would be used. You can remove all labels +from an image by assigning the empty string.

    + +

    A label is not drawn on the image, but is embedded in the image datastream +via Label tag or similar mechanism. If you want the label to be +visible on the image itself, use the -draw option, or +during the final processing in the creation of an image montage.

    + +

    If the first character of string is @, the image label is read from a file titled by the +remaining characters in the string. Labels in a file are literal, no embedded +formatting characters are recognized.

    + + +
    +

    -lat width
    -lat widthxheight{+-}offset{%}

    +
    + +

    Perform local adaptive threshold.

    + +

    Adaptively threshold each pixel based on the value of pixels in a +surrounding window. If the current pixel is lighter than this average plus +the optional offset, then it is made white, otherwise it is made +black. Small variations in pixel values such as found in scanned documents +can be ignored if offset is positive. A negative offset will make it more +sensitive to those small variations.

    + +

    This is commonly used to threshold images with an uneven background. It is +based on the assumption that average color of the small window is the +the local background color, from which to separate the foreground color.

    + + +
    +

    -layers method

    +
    + +

    Handle multiple images forming a set of image layers or animation frames.

    + +

    Perform various image operation methods to a ordered sequence of images +which may represent either a set of overlaid 'image layers', a GIF disposal +animation, or a fully-'coalesced' animation sequence.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDescription
    compare-anyCrop the second and later frames to the smallest rectangle + that contains all the differences between the two images. No GIF -dispose methods are taken into account.
    This exactly the same as the -deconstruct operator, and does not preserve animations normal + working, especially when animation used layer disposal methods such as + 'Previous' or 'Background'.
    compare-clearAs 'compare-any' but crop to the bounds of any + opaque pixels which become transparent in the second frame. That is the + smallest image needed to mask or erase pixels for the next frame.
    compare-overlayAs 'compare-any' but crop to pixels that add + extra color to the next image, as a result of overlaying color pixels. + That is the smallest single overlaid image to add or change colors.
    This can be used with the -compose alpha + composition method 'change-mask', to reduce the image to + just the pixels that need to be overlaid.
    coalesceEquivalent to a call to the -coalesce operator. Apply the layer disposal methods set in the + current image sequence to form a fully defined animation sequence, as + it should be displayed. Effectively converting a GIF animation into a + 'film strip'-like animation.
    compositeAlpha Composition of two image lists, separated by a + "null:" image, with the destination image list first, and + the source images last. An image from each list are composited + together until one list is finished. The separator image and source + image lists are removed.
    The -geometry offset is adjusted according + to -gravity in accordance of the virtual + canvas size of the first image in each list. Unlike a normal -composite operation, the canvas offset is also + added to the final composite positioning of each image.
    If one of the image lists only contains one image, that image is + applied to all the images in the other image list, regardless of which + list it is. In this case it is the image meta-data of the list which + preserved.
    disposeThis like 'coalesce' but shows the look of + the animation after the layer disposal method has been applied, before + the next sub-frame image is overlaid. That is the 'dispose' image that + results from the application of the GIF -dispose method. This allows you to check what + is going wrong with a particular animation you may be developing. +
    flattenCreate a canvas the size of the first images virtual + canvas using the current -background color, + and -compose each image in turn onto that + canvas. Images falling outside that canvas is clipped. Final + image will have a zero virtual canvas offset.
    This usually used as one of the final 'image layering' operations + overlaying all the prepared image layers into a final image.
    For a single image this method can also be used to fillout a virtual + canvas with real pixels, or to underlay an opaque color to remove + transparency from an image.
    mergeAs 'flatten' method but merging all the given image + layers to create a new layer image just large enough to hold all the + image without clipping or extra space. The new images virtual offset + will preserve the position of the new layer, even if this offset is + negative. The virtual canvas size of the first image is preserved. +
    Caution is advised when handling image layers with + negative offsets as few image file formats handle them correctly. + Following this operation method with +repage + will remove the layer offset, and create an image in which all the + overlaid image positions relative to each other is preserved, though + not necessarily exactly where you specified them. +
    See also 'trim-bounds' below which is closely related but + without doing the'flatten' to merge the images together.
    mosaicAs 'flatten' method but expanding the initial canvas size + of the first image in a positive direction only so as to hold all the + image layers. However as a virtual canvas is 'locked' to the origin, + by its own definition, image layers with a negative offsets will still + become clipped by the top and left edges. See 'merge' or 'trim-bounds' + if this could be a problem.
    This method is commonly used to layout individual image + using various offset but without knowing the final canvas size. The + resulting image will, like 'flatten' not have any virtual offset, so + can be saved to any image file format.
    optimizeOptimize a coalesced animation, into GIF animation using + a number of general techniques. This currently a short cut to + apply both the 'optimize-frame', and + 'optimize-transparency' methods but may be expanded to + include other optimization methods as they are developed.
    optimize-frameOptimize a coalesced animation, into GIF animation by + reducing the number of pixels per frame as much as possible by + attempting to pick the best layer disposal method to use, while ensuring + the result will continue to animate properly.
    There is no guarantee that the best optimization is found. + But then no reasonably fast GIF optimization algorithm can do this. + However this does seem to do better than most other GIF frame + optimizers seen.
    optimize-plusAs 'optimize-frame' but attempt to improve the + overall optimization by adding extra frames to the animation, without + changing the final look or timing of the animation. The frames are + added to attempt to separate the clearing of pixels from the + overlaying of new additional pixels from one animation frame to the + next. If this does not improve the optimization (for the next frame + only), it will fall back to the results of the previous normal + 'optimize-frame' technique.
    There is the possibility that the change in the disposal + style will result in a worsening in the optimization of later frames, + though this is unlikely. In other words there no guarantee that it is + better than the normal 'optimize-frame' technique. For some + animations however you can get a vast improvement in the final + animation size.
    optimize-transparencyGiven a GIF animation, replace any pixel in the sub-frame + overlay images with transparency, if it does not change the resulting + animation by more than the current -fuzz factor. +
    This should allow a existing frame optimized GIF animation + to compress into a smaller file size due to larger areas of one + (transparent) color rather than a pattern of multiple colors repeating + the current disposed image of the last frame.
    remove-dupsRemove (and merge time delays) of duplicate consecutive + images, so as to simplify layer overlays of coalesced animations. +
    Usually this a result of using a constant time delay + across the whole animation, or after a larger animation was split into + smaller sub-animations. The duplicate frames could also have been + used as part of some frame optimization methods.
    remove-zeroRemove any image with a zero time delay, unless ALL the + images have a zero time delay (and is not a proper timed animation, a + warning is then issued).
    In a GIF animation, such images are usually frames which + provide partial intermediary updates between the frames that are + actually displayed to users. These frames are usually added for + improved frame optimization in GIF animations.
    trim-boundsFind the bounds of all the images in the current + image sequence, then adjust the offsets so all images are contained on + a minimal positive canvas. None of the image data is modified or + merged, only the individual image virtual canvas size and offset. + All the images is given the same canvas size, and will have + a positive offset, but will remain in the same position relative to + each other. As a result of the minimal canvas size at least one image + will touch every edge of that canvas. The image data touching those + edges however may be transparent.
    The result is much like if you used 'merge' followed by a + +repage option, except that all the images + have been kept separate. If 'flatten' is used after using + 'trim-bounds' you will get the same result.
    +
    + +

    To print a complete list of layer types, use -list layers.

    + +

    The operators -coalesce, -deconstruct, -flatten, and -mosaic are only aliases for the above methods and may be deprecated in +the future. Also see -page, -repage operators, the -compose setting, and the +GIF -dispose and -delay +settings.

    + + +
    +

    -level black_point{,white_point}{%}{,gamma}

    +
    + +

    Adjust the level of image channels.

    + +

    Given one, two or three values delimited with commas: black-point, +white-point, gamma (for example: 10,250,1.0 or 2%,98%,0.5). The black and +white points range from 0 to QuantumRange, or from 0 to +100%; if the white point is omitted it is set to (QuantumRange - black_point), so as to center contrast changes. +If a % sign is present anywhere in the string, both black and white +points are percentages of the full color range. Gamma will do a -gamma adjustment of the values. If it is omitted, the +default of 1.0 (no gamma correction) is assumed.

    + +

    In normal usage (-level) the image values are stretched so that +the given 'black_point' value in the original image is set to zero +(or black), while the given 'white_point' value is set to QuantumRange (or white). This provides you with direct +contrast adjustments to the image. The 'gamma' of the resulting +image will then be adjusted.

    + +

    From ImageMagick v6.4.1-9 using the plus form of the operator +(+level) or adding the special '!' flag anywhere in the argument +list, will cause the operator to do the reverse of the level adjustment. That +is a zero, or QuantumRange value (black, and white, resp.) +in the original image, is adjusted to the given level values, allowing you to +de-contrast, or compress the channel values within the image. The +'gamma' is adjusted before the level adjustment to de-contrast the +image is made.

    + +

    Only the channels defined by the current -channel +setting are adjusted (defaults to RGB color channels only), allowing you to +limit the effect of this operator.

    + +

    Please note that the transparency channel is treated as 'matte' +values (0 is opaque) and not as 'alpha' values (0 is transparent).

    + + +
    +

    -level-colors {black_color}{,}{white_color}

    +
    + +

    Adjust the level of an image using the provided dash separated colors.

    + +

    This function is exactly like -level, except that the +value for each color channel is determined by the +'black_color' and 'white_color' colors given (as +described under the -fill option).

    + +

    This effectively means the colors provided to -level-colors +is mapped to become 'black' and 'white' respectively, with all the other +colors linearly adjusted (or clipped) to match that change. Each channel is +adjusted separately using the channel values of the colors specified.

    + +

    On the other hand the plus form of the operator (+level-colors) +will map the image color 'black' and 'white' to the given colors +respectively, resulting in a gradient (de-contrasting) tint of the image to +those colors. This can also be used to convert a plain grayscale image into a +one using the gradient of colors specified.

    + +

    By supplying a single color with a comma separator either before or after +that color, will just replace the respective 'black' or 'white' point +respectively. But if no comma separator is provided, the given color is +used for both the black and white color points, making the operator either +threshold the images around that color (- form) or set all colors to that +color (+ form).

    + + +
    +

    -limit type value

    +
    + +

    Set the pixel cache resource limit.

    + +

    Choose from: width, height, area, memory, map, disk, file, thread, throttle, or time.

    + +

    The value for file is in number of files. The other limits are +in bytes. Define arguments for the memory, map, area, and disk resource limits +with SI prefixes (.e.g 100MB).

    + +

    By default the limits are 768 files, 3GB of image area, 1.5GiB memory, 3GiB +memory map, and 18.45EB of disk. These limits are adjusted relative to the +available resources on your computer if this information is available. When +any limit is reached, ImageMagick fails in some fashion but attempts to take +compensating actions, if possible. For example, the following limits +memory:

    + +
      < class="bg-light text-dark mx-4">-limit memory 32MiB -limit map 64MiB +
    + +

    Use -list resource to list the current limits. For example, our system shows these limits:

    + +
      < class="bg-light text-dark mx-4">-> identify -list resource +Resource limits: + Width: 100MP + Height: 100MP + Area: 25.181GB + Memory: 11.726GiB + Map: 23.452GiB + Disk: unlimited + File: 768 + Thread: 12 + Throttle: 0 + Time: unlimited +
    + +

    Requests for pixel storage to keep intermediate images are satisfied by one +of three resource categories: in-memory pool, memory-mapped files pool, and +disk pool (in that order) depending on the -limit settings +and whether the system honors a resource request. If the total size of +allocated pixel storage in the given pool reaches the corresponding limit, the +request is passed to the next pool. Additionally, requests that exceed the +area limit automagically are allocated on disk.

    + +

    To illustrate how ImageMagick utilizes resource limits, consider a typical +image resource request. First, ImageMagick tries to allocate the pixels in +memory. The request might be denied if the resource request exceeds the +memory limit or if the system does not honor the request. If +a memory request is not honored, the pixels are allocated to disk and the file +is memory-mapped. However, if the allocation request exceeds the +map limit, the resource allocation goes to disk. In all cases, if +the resource request exceeds the area limit, the pixels are +automagically cached to disk. If the disk has a hard limit, the program +fails.

    + +

    In most cases you simply do not need to concern yourself with resource +limits. ImageMagick chooses reasonable defaults and most images do not tax +your computer resources. Where limits do come in handy is when you process +images that are large or on shared systems where ImageMagick can consume all +or most of the available memory. In this case, the ImageMagick workflow slows +other processes or, in extreme cases, brings the system to a halt. Under +these circumstances, setting limits give some assurances that the ImageMagick +workflow will not interfere with other concurrent uses of the computer. For +example, assume you have a web interface that processes images uploaded from +the Internet. To assure ImageMagick does not exceed 10MiB of memory you can +simply set the area limit to 10MiB:

    + +
      < class="bg-light text-dark mx-4">-limit area 10MB +
    + +

    Now whenever a large image is processed, the pixels are automagically +cached to disk instead of memory. This of course implies that large images +typically process very slowly, simply because pixel processing in memory can +be an order of magnitude faster than on disk. Because your web site users +might inadvertently upload a huge image to process, you should set a disk +limit as well:

    + +
      < class="bg-light text-dark mx-4">-limit area 10MB -limit disk 500MB +
    + +

    Here ImageMagick stops processing if an image requires more than 500MB of disk storage.

    + +

    In addition to command-line resource limit option, resources can be set +with environment variables. Set the +environment variables MAGICK_AREA_LIMIT, +MAGICK_DISK_LIMIT, MAGICK_FILE_LIMIT, +MAGICK_MEMORY_LIMIT, MAGICK_MAP_LIMIT, +MAGICK_THREAD_LIMIT, MAGICK_TIME_LIMIT for limits of +image area, disk space, open files, heap memory, memory map, number of threads +of execution, and maximum elapsed time in seconds respectively.

    +

    Note, you can restrict limits relative to any security policies, but you cannot relax them.

    + +

    Inquisitive users can try adding -debug cache to +their commands and then scouring the generated output for references to the +pixel cache, in order to determine how the pixel cache was allocated and how +resources were consumed. Advanced Linux/Linux users can pipe that output +through grep memory|open|destroy|disk for more readable sifting. +

    + +

    For more about ImageMagick's use of resources, see the section Cache +Storage and Resource Requirements on the Architecture page.

    + +
    +

    -linear-stretch black-point
    -linear-stretch black-point{xwhite-point}{%}

    +
    + +

    Linear with saturation stretch.

    + +

    This is very similar to -contrast-stretch, +and uses a 'histogram bin' to determine the range of color values that needs to +be stretched. However it then stretches those colors using the -level operator.

    + +

    As such while the initial determination may have 'binning' round off +effects, the image colors are stretched mathematically, rather than using the +histogram bins. This makes the operator more accurate.

    + +

    note however that a -linear-stretch of +'0' does nothing, while a value of '1' does a near +perfect stretch of the color range.

    + +

    See also -auto-level for a 'perfect' +normalization of mathematical images.

    + +

    This operator is under review for re-development.

    + + +
    +

    -linewidth

    +
    + +

    The line width for subsequent draw operations.

    + +
    +

    -liquid-rescale geometry

    +
    + +

    Rescale image with seam-carving.

    + +

    See Image Geometry for complete details about the geometry argument.

    + +
    +

    -list type

    +
    + +

    Print a list of supported arguments for various options or settings. Choose from these list types:

    + +
      < class="pre-scrollable bg-light text-dark mx-4"> +Align +Alpha +Boolean +Cache +Channel +Class +ClipPath +Coder +Color +Colorspace +Command +Complex +Compose +Compress +Configure +DataType +Debug +Decoration +Delegate +Direction +Dispose +Distort +Dither +Endian +Evaluate +FillRule +Filter +Font +Format +Function +Gravity +Intensity +Intent +Interlace +Interpolate +Kernel +Layers +LineCap +LineJoin +List +Locale +LogEvent +Log +Magic +Method +Metric +Mime +Mode +Morphology +Module +Noise +Orientation +PixelIntensity +Policy +PolicyDomain +PolicyRights +Preview +Primitive +QuantumFormat +Resource +SparseColor +Statistic +Storage +Stretch +Style +Threshold +Type +Units +Validate +VirtualPixel +
    + +

    These lists vary depending on your version of ImageMagick. Use "-list +list" to get a complete listing of all the "-list" arguments +available:

    + +
      < class="bg-light text-dark mx-4">identify -list list +
    + +
    +

    -log string

    +
    + +

    Specify format for debug log.

    + +

    This option specifies the format for the log printed when the -debug option is active.

    + +

    You can display the following components by embedding special format +characters:

    + +
    +
    +
    %d
    domain
    +
    %e
    event
    +
    %f
    function
    +
    %l
    line
    +
    %m
    module
    +
    %p
    process ID
    +
    %r
    real CPU time
    +
    %t
    wall clock time
    +
    %u
    user CPU time
    +
    %%
    percent sign
    +
    \n
    newline
    +
    \r
    carriage return
    +
    +
    + +

    For example:

    + +
      < class="bg-light text-dark mx-4">convert -debug coder -log "%u %m:%l %e" in.gif out.png +
    + +

    The default behavior is to print all of the components.

    + +
    +

    -loop iterations

    +
    + +

    Add Netscape loop extension to your GIF animation.

    + +

    Set iterations to zero to repeat the animation an infinite number of times, +otherwise the animation repeats itself up to iterations +times.

    + +
    +

    -lowlight-color color

    +
    + +

    When comparing images, de-emphasize pixel differences with this color.

    + +
    +

    -magnify

    +
    + +

    Double or triple the size of the image with pixel art scaling. Specify an alternative scaling method with -define magnify:method=method Choose from these methods: eagle2X, eagle3X, eagle3XB, epb2X, fish2X, hq2X, scale2X, scale3X, xbr2X. The default is scale2X.

    + + +
    +

    -map type

    +
    + +

    Display image using this type.

    + +

    Choose from these Standard Colormap types:

    + +
      < class="bg-light text-dark mx-4">best +default +gray +red +green +blue +
    + +

    The X server must support the Standard +Colormap you choose, otherwise an error occurs. Use list as +the type and display searches the list of colormap types in +top-to-bottom order until one is located. See xstdcmap(1) for one way of creating Standard Colormaps.

    + + +
    +

    -map components

    +
    + +

    Pixel map.

    + +

    Here are the valid components of a map:

    + +
    +
    +
    r
    red pixel component
    +
    g
    green pixel component
    +
    b
    blue pixel component
    +
    a
    alpha pixel component (0 is transparent)
    +
    o
    opacity pixel component (0 is opaque)
    +
    i
    grayscale intensity pixel component
    +
    c
    cyan pixel component
    +
    m
    magenta pixel component
    +
    y
    yellow pixel component
    +
    k
    black pixel component
    +
    p
    pad component (always 0)
    +
    +
    + +

    You can specify as many of these components as needed in any order (e.g. +bgr). The components can repeat as well (e.g. rgbr).

    + + +
    +

    -mattecolor color

    +
    + +

    Specify the color to be used with the -frame option.

    + +

    The color is specified using the format described under the -fill option.

    + +

    The default matte color is #BDBDBD, this shade of gray.

    + +
    +

    -maximum

    +
    + +

    Return the maximum intensity of an image sequence.

    + +

    Select the 'maximum' value from all the surrounding pixels.

    + +

    This is legacy option from the method of the same +name.

    + +
    +

    -median geometry

    +
    + +

    Apply a median filter to the image.

    + +

    Select the 'middle' value from all the surrounding pixels.

    + +

    This is legacy option from the method of the same +name.

    + +
    +

    -mean-shift widthxheight{+distance{%}

    +
    + +

    Image noise removal and color reduction/segmentation (e.g. -mean-shift 7x7+10%).

    + +

    widthxheight is the window size and distance is the color distance measured in the range 0 to 1 or 0 to 100%

    + +

    The mean shift algorithm is iterative and thus slower the larger the window size. For each pixel, it gets all the pixels in the window centered at the pixel and excludes those that are outside the radius=sqrt((width-1)(height-1)/4) surrounding the pixel. From those pixels, it finds which of them are within the specified squared color distance from the current mean. It then computes a new x,y centroid from those coordinates and a new mean. This new x,y centroid is used as the center for a new window. This process is iterated until it converges and the final mean is then used to replace the original pixel value. It repeats this process for the next pixel, etc, until it processes all pixels in the image. Results are better when using other colorspaces rather than RGB. Recommend YIQ, YUV or YCbCr, which seem to give equivalent results.

    + +
    +

    -metric type

    +
    + +

    Output to STDERR a measure of the differences between images according to the type given metric.

    + +

    Choose from:

    + +
    +
    +
    AE
    absolute error count, number of different pixels (-fuzz affected)
    +
    DSSIM
    structural dissimilarity index
    +
    FUZZ
    mean color distance
    +
    MAE
    mean absolute error (normalized), average channel error distance
    +
    MEPP
    mean error per pixel (normalized mean error, normalized peak error)
    +
    MSE
    mean error squared, average of the channel error squared
    +
    NCC
    normalized cross correlation
    +
    PAE
    peak absolute (normalized peak absolute)
    +
    PHASH
    perceptual hash for the sRGB and HCLp colorspaces. Specify an alternative colorspace with -define phash:colorspaces=colorspace,colorspace,...
    +
    PSNR
    peak signal to noise ratio
    +
    RMSE
    root mean squared (normalized root mean squared)
    +
    SSIM
    structural similarity index
    +
    +
    + +

    Control the 'AE', or absolute count of pixels that are different, +with the -fuzz factor (ignore pixels which +only changed by a small amount). Use 'PAE' to find the +size of the -fuzz factor needed to make all pixels +'similar', while 'MAE' determines the factor needed +for about half the pixels to be similar.

    + +

    The MEPP metric returns three different metrics +('MAE', 'MAE' normalized, and 'PAE' +normalized) from a single comparison run.

    + +

    The SSIM and DSSIM metrics respect these defines: +-define compare:ssim-radius, -define compare:ssim-sigma, +-define compare:ssim-k1, and -define compare:ssim-k2.

    + +

    To print a complete list of metrics, use the -list +metric option.

    + + +
    +

    -minimum

    +
    + +

    Return the minimum intensity of an image sequence.

    + +

    Select the 'minimal' value from all the surrounding pixels.

    + +

    This is legacy option from the method of the same +name.

    + + + +
    +

    -mode geometry

    +
    + +

    Make each pixel the \'predominant color\' of the neighborhood.'

    + +
    +

    -mode value

    +
    + +

    Mode of operation.

    + +

    Choose the value from these styles: Frame, +Unframe, or Concatenate

    + +

    Use the -list option with a 'Mode' argument +for a list of -mode arguments available in your +ImageMagick installation.

    + + +
    +

    -modulate brightness[,saturation,hue]

    +
    + +

    Vary the brightness, saturation, and hue of an image.

    + +

    The arguments are given as a percentages of variation. A value of 100 means +no change, and any missing values are taken to mean 100.

    + +

    The brightness is a multiplier of the overall +brightness of the image, so 0 means pure black, 50 is half as bright, 200 is +twice as bright. To invert its meaning -negate the image +before and after.

    + +

    The saturation controls the amount of color in an +image. For example, 0 produce a grayscale image, while a large value such as +200 produce a very colorful, 'cartoonish' color.

    + +

    The hue argument causes a "rotation" of the colors +within the image by the amount specified. For example, 50 results in +a counter-clockwise rotation of 90, mapping red shades to purple, and so on. +A value of either 0 or 200 results in a complete 180 degree rotation of the +image. Using a value of 300 is a 360 degree rotation resulting in no change to +the original image.

    + +

    For example, to increase the color brightness by 20% and decrease the color +saturation by 10% and leave the hue unchanged, use -modulate 120,90.

    + +

    Use -set attribute of 'option:modulate:colorspace' to specify which colorspace to +modulate. Choose from HCL, HCLp, HSB, HSI, HSL (the default), HSV, HWB, or LCH (LCHuv). For example,

    + +
      < class="bg-light text-dark mx-4">convert image.png -set option:modulate:colorspace hsb -modulate 120,90 modulate.png +
    + +
    +

    -moments

    +
    + +

    Report image moments and perceptual hash.

    + + +
    +

    -monitor

    +
    + +

    Monitor progress.

    + + +
    +

    -monochrome

    +
    + +

    Transform the image to black and white.

    + +
    +

    -morph frames

    +
    + +

    Morphs an image sequence.

    + +

    Both the image pixels and size are linearly interpolated to give the +appearance of a metamorphosis from one image to the next, over all the images +in the current image list. The added images are the equivalent of a -blend composition. The frames +argument determine how many images to interpolate between each image.

    + + +
    +

    -morphology

    +

    -morphology method kernel

    +
    + +

    Apply a morphology method to the image.

    + +

    See IM Usage Examples, +Morphology.

    + + +
    +

    -mosaic

    +
    + +

    An simple alias for the -layers method "mosaic"

    + + +
    +

    -motion-blur radius
    -motion-blur radius{xsigma}+angle

    +
    + +

    Simulate motion blur.

    + +

    Blur with the given radius, standard deviation (sigma), and angle. The +angle given is the angle toward which the image is blurred. That is the +direction people would consider the object is coming from.

    + +

    Note that the blur is not uniform distribution, giving the motion a +definite sense of direction of movement.

    + +

    The -virtual-pixel setting will determine how +pixels which are outside the image proper are blurred into the final result. +

    + +
    +

    -name

    +
    + +

    Name an image.

    +
    +

    -negate

    +
    + +

    Replace each pixel with its complementary color.

    + +

    The red, green, and blue intensities of an image are negated. White becomes +black, yellow becomes blue, etc. Use +negate to only +negate the grayscale pixels of the image.

    + +
    +

    -noise geometry
    + +noise type

    +
    + +

    Add or reduce noise in an image.

    + +

    The principal function of noise peak elimination filter is to smooth the +objects within an image without losing edge information and without creating +undesired structures. The central idea of the algorithm is to replace a pixel +with its next neighbor in value within a pixel window, if this pixel has been +found to be noise. A pixel is defined as noise if and only if this pixel is +a maximum or minimum within the pixel window.

    + +

    Use -noise radius to +specify the width of the neighborhood when reducing noise. This is equivalent +to using a -statistic NonPeak operation, +which should be used in preference.

    + +

    Use +noise followed by a noise type to add noise to an image. Choose from these noise +types:

    + +
      < class="bg-light text-dark mx-4">Gaussian +Impulse +Laplacian +Multiplicative +Poisson +Random +Uniform +
    + +

    The amount of noise added can be controlled by the -attenuate setting. If unset the value is +equivalent to 1.0, or a maximum noise addition.

    + +

    Note that Random will replace the image with noise rather than add noise to the image. Use Uniform, if you wish to add random noise to the image.

    + +

    To print a complete list of noises, use the -list noise option.

    + +

    Also see the -evaluate noise functions that allows +the use of a controlling value to specify the amount of noise that should be +added to an image.

    + + +
    +

    -normalize

    +
    + +

    Increase the contrast in an image by stretching the range of intensity values.

    + +

    The intensity values are stretched to cover the entire range of possible +values. While doing so, black-out at most 2% of the pixels and +white-out at most 1% of the pixels.

    + +

    Note that as of ImageMagick 6.4.7-0, -normalize +is equivalent to -contrast-stretch 2%x1%. +(Before this version, it was equivalent to -contrast-stretch 2%x99%).

    + +

    All the channels are normalized in concert by the same amount so as to +preserve color integrity, when the default +channel +setting is in use. Specifying any other -channel +setting will normalize the RGB channels independently.

    + +

    See -contrast-stretch for more details. +Also see -auto-level for a 'perfect' normalization +that is better suited to mathematically generated images.

    + +

    This operator is under review for re-development.

    + + +
    +

    -opaque color

    +
    + +

    Change this color to the fill color within the image.

    + +

    The color argument is defined using the format +described under the -fill option. The -fuzz setting can be used to match and replace colors similar to the one +given.

    + +

    Use +opaque to paint any pixel that does not match +the target color.

    + +

    The -transparent operator is exactly the same +as -opaque but replaces the matching color with +transparency rather than the current -fill color setting. +To ensure that it can do this it also ensures that the image has an alpha +channel enabled, as per "-alpha set", for +the new transparent colors, and does not require you to modify the -channel to enable alpha channel handling.

    + + +
    +

    -ordered-dither threshold_map{,level...}

    +
    + +

    Dither the image using a pre-defined ordered dither threshold map specified, and a uniform color map with the +given number of levels per color channel.

    + +

    You can choose from these standard threshold maps:

    + +
      < class="pre-scrollable bg-light text-dark mx-4"> +threshold 1x1 Threshold 1x1 (non-dither) +checks 2x1 Checkerboard 2x1 (dither) +o2x2 2x2 Ordered 2x2 (dispersed) +o3x3 3x3 Ordered 3x3 (dispersed) +o4x4 4x4 Ordered 4x4 (dispersed) +o8x8 8x8 Ordered 8x8 (dispersed) +h4x4a 4x1 Halftone 4x4 (angled) +h6x6a 6x1 Halftone 6x6 (angled) +h8x8a 8x1 Halftone 8x8 (angled) +h4x4o Halftone 4x4 (orthogonal) +h6x6o Halftone 6x6 (orthogonal) +h8x8o Halftone 8x8 (orthogonal) +h16x16o Halftone 16x16 (orthogonal) +c5x5b c5x5 Circles 5x5 (black) +c5x5w Circles 5x5 (white) +c6x6b c6x6 Circles 6x6 (black) +c6x6w Circles 6x6 (white) +c7x7b c7x7 Circles 7x7 (black) +c7x7w Circles 7x7 (white) +
    + +

    The threshold generated a simple 50% threshold of the image. +This could be used with level to do the equivalent of -posterize to reduce an image to basic primary colors. +

    + +

    The checks pattern produces a 3 level checkerboard dither +pattern. That is a grayscale will become a pattern of solid black, solid +white, and mid-tone colors into a checkerboard pattern of black and white. +

    + +

    You can define your own threshold map for ordered +dithering and halftoning your images, in either personal or system +thresholds.xml XML file. See Resources +for more details of configuration files.

    + +

    To print a complete list of the thresholds that have been defined, use the +-list threshold option.

    + +

    Note that at this time the same threshold dithering map is used for all +color channels, no attempt is made to offset or rotate the map for different +channels is made, to create an offset printing effect. Also as the maps are +simple threshold levels, the halftone and circle maps will create incomplete +circles along the edges of a colored area. Also all the effects are purely +on/off boolean effects, without anti-aliasing to make the circles smooth +looking. Large dots can be made to look better with a small amount of blurring +after being created.

    + + +
    +

    -orient image orientation

    +
    + +

    Specify orientation of a digital camera image.

    + +

    Choose from these orientations:

    + +
      < class="bg-light text-dark mx-4">bottom-left right-top +bottom-right top-left +left-bottom top-right +left-top undefined +right-bottom +
    + +

    To print a complete list of orientations, use the -list +orientation option.

    + + +
    +

    -page geometry
    + -page media[offset][{^!<>}]
    + +page +

    +
    + +

    Set the size and location of an image on the larger virtual canvas.

    + +

    See Image Geometry for complete details about the geometry argument.

    + +

    For convenience you can specify the page size using media (see below). Offsets can then be added as with other +geometry arguments (e.g. -page Letter+43+43).

    + +

    Use media as shorthand to specify the dimensions (widthxheight) of the PostScript page in dots per inch or a TEXT page in pixels. +The choices for paper sizes are: 4x6, 5x7, 7x9, 8x10, 9x11, 9x12, 10x13, 10x14, 11x17, 4A0, 2A0, a0, a1, a2, a3, a4, a4small, a5, a6, a7, a8, a9, a10, archa, archb, archC, archd, arche, b0, b1, b10, b2, b3, b4, b5, b6, b7, b8, b9, c0, c1, c2, c3, c4, c5, c6, c7, csheet, dsheet, esheet, executive, flsa, flse, folio, halfletter, isob0, isob1, isob10, isob2, isob3, isob4, isob5, isob6, isob7, isob8, isob9, jisb0, jisb1, jisb2, jisb3, jisb4, jisb5, jisb6, ledger, legal, letter, lettersmall, monarch, quarto, statement, tabloid. To determine the cooresponding size in pixels at 72DPI, use this command for example:

    +
      < class="bg-light text-dark mx-4">convert xc: -format "%[papersize:a4]" info:
    + +

    This option is also used to place subimages when writing to a multi-image +format that supports offsets, such as GIF89 and MNG. When used for this +purpose the offsets are always measured from the top left corner of the canvas +and are not affected by the -gravity option. To +position a GIF or MNG image, use -page{+-}x{+-}y (e.g. -page +100+200). When writing to a MNG +file, a -page option appearing ahead of the first image in +the sequence with nonzero width and height defines the width and height values +that are written in the MHDR chunk. Otherwise, the MNG width and +height are computed from the bounding box that contains all images in the +sequence. When writing a GIF89 file, only the bounding box method is used to +determine its dimensions.

    + +

    For a PostScript page, the image is sized as in -geometry but positioned relative to the lower +left-hand corner of the page by {+-}xoffset{+-}y offset. Use -page 612x792, for example, to center the image within the +page. If the image size exceeds the PostScript page, it is reduced to fit the +page. The default gravity for the -page option is NorthWest, i.e., positive x and y offset are measured rightward and downward from the top left +corner of the page, unless the -gravity option is +present with a value other than NorthWest.

    + +

    The default page dimensions for a TEXT image is 612x792.

    + +

    This option is used in concert with -density.

    + +

    Use +page to remove the page settings for an image.

    + +
    +

    -paint radius

    +
    + +

    Simulate an oil painting.

    + +

    Each pixel is replaced by the most frequent color in a circular +neighborhood whose width is specified with radius.

    + +
    +

    -path path

    + +

    Write images to this path on disk.

    + +
    +

    -pause seconds

    +
    + +

    Pause between animation loops

    + +

    Pause for the specified number of seconds before repeating the animation.

    + +
    +

    -pause seconds

    +
    + +

    Pause between snapshots.

    + +

    Pause for the specified number of seconds before taking the next snapshot.

    + +
    +

    -perceptible epsilon

    +
    + +

    Set each pixel whose value is less than |epsilon| to -epsilon or epsilon (whichever is closer) otherwise the pixel value remains unchanged.

    + +
    +

    -ping

    +
    + +

    Efficiently determine these image characteristics: image number, the file name, the width and height of the image, whether the image is colormapped or not, the number of colors in the image, the number of bytes in the image, the format of the image (JPEG, PNM, etc.). Use +ping to ensure accurate image properties.

    + +
    +

    -pointsize value

    +
    + +

    Pointsize of the PostScript, OPTION1, or TrueType font.

    + +
    +

    -polaroid angle

    +
    + +

    Simulate a Polaroid picture.

    + +

    Use +polaroid to rotate the image at a random angle between -15 and +15 degrees.

    + +
    +

    -poly "wt,exp ..."

    +
    + +

    Combines multiple images according to a weighted sum of polynomials; one floating point weight (coefficient) and one floating point polynomial exponent (power) for each image expressed as comma separated pairs.

    + +

    The weights should typically be fractions between -1 and 1. But the sum of weights should be 1 or at least between 0 and 1 to avoid clamping in non-hdri mode at black and white.

    + +

    The exponents may be positive, negative or zero. A negative exponent is equivalent to 1 divided by the image raised to the corresponding positive exponent. A zero exponent always produces 1 scaled by quantumrange to white, i.e. wt*white, no matter what the image.

    + +

    The format is: output = wt1*image1^exp1 + wt2*image2^exp2 ...

    + +

    Some simple uses are:

    +
      +
    • A weighted sum of each image provided all weights add to unity and all exponents=1. If the weights are all equal to 1/(number of images), then this is equivalent to -evaluate-sequence mean.
    • +
    • The sum of squares of two or more images, provided the weights are equal (and sum to 1 to avoid clamping) and the exponents equal 2.
    • +
    + +

    Note that one may add a constant color to the expression simply by using xc:somecolor for one of the images and specifying the desired weight and exponent equal to 0.

    + +

    Similarly one may add white to the expression by simply using null: (or xc:white) for one of the images with the appropriate weight and exponent equal to 0.

    + + +
    +

    -posterize levels

    +
    + +

    Reduce the image to a limited number of color levels per channel.

    + +

    Very low values of levels, e.g., 2, 3, 4, have the most +visible effect.

    + +
    +

    -precision value

    +
    + +

    Set the maximum number of significant digits to be printed.

    + +
    +

    -preview type

    +
    + +

    Image preview type.

    + +

    Use this option to affect the preview operation of an image (e.g. +convert file.png -preview Gamma Preview:gamma.png). Choose from +these previews:

    + +
      < class="pre-scrollable bg-light text-dark mx-4"> +AddNoise +Blur +Brightness +Charcoal +Despeckle +Dull +EdgeDetect +Gamma +Grayscale +Hue +Implode +JPEG +OilPaint +Quantize +Raise +ReduceNoise +Roll +Rotate +Saturation +Segment +Shade +Sharpen +Shear +Solarize +Spiff +Spread +Swirl +Threshold +Wave +
    + +

    To print a complete list of previews, use the -list preview option.

    + +

    The default preview is JPEG.

    + +
    +

    -print string

    +
    + +

    Interpret string and print to console.

    + +
    +

    -process command

    +
    + +

    Process the image with a custom image filter.

    + +

    The command arguments has the form "module arg1 arg2 arg3 ... +argN" where module is the name of the module to invoke (e.g. +"Analyze") and arg1 arg2 arg3 ... argN are an arbitrary number of arguments to +pass to the process module.

    + +
    +

    -profile filename
    + +profile profile_name

    +
    + +

    Manage ICM, IPTC, or generic profiles in an image.

    + +

    Using -profile filename adds an +ICM (ICC color management), IPTC (newswire information), or a generic profile +to the image.

    + +

    Use +profile profile_name to +remove the indicated profile. ImageMagick uses standard filename globbing, so +wildcard expressions may be used to remove more than one profile. Here we +remove all profiles from the image except for the XMP profile: +profile +"!xmp,*".

    + +

    Use identify -verbose to find out which profiles are in the +image file. Use -strip to remove all profiles (and +comments).

    + +

    To extract a profile, the -profile option is not +used. Instead, simply write the file to an image format such as APP1, 8BIM, ICM, or IPTC.

    + +

    For example, to extract the Exif data (which is stored in JPEG files in the +APP1 profile), use.

    + +

    Set -define precision:highres-transform=true to increase the transform precision. Note, there is a slight performance penalty as the high-precision transform is floating point rather than unsigned.

    + +
      < class="bg-light text-dark mx-4">convert cockatoo.jpg profile.exif +
    + +

    It is important to note that results may depend on whether or not the +original image already has an included profile. Also, keep in mind that -profile is an "operator" (as opposed to a "setting") and +therefore a conversion is made each time it is encountered, in order, in the +command-line. For instance, in the following example, if the original image is +CMYK with profile, a CMYK-CMYK-RGB conversion results.

    + +
      < class="bg-light text-dark mx-4">convert CMYK.tif -profile "CMYK.icc" -profile "RGB.icc" RGB.tiff +
    + +

    Furthermore, since ICC profiles are not necessarily symmetric, extra +conversion steps can yield unwanted results. CMYK profiles are often very +asymmetric since they involve 3−>4 and 4−>3 channel mapping. +

    + +
    +

    -quality value

    +
    + +

    JPEG/MIFF/PNG compression level.

    + +

    For the JPEG and MPEG image formats, quality is 1 (lowest image quality and +highest compression) to 100 (best quality but least effective compression). +The default is to use the estimated quality of your input image if it can +be determined, otherwise 92. When the quality is greater than 90, then the +chroma channels are not downsampled. +Use the -sampling-factor option to specify the +factors for chroma downsampling.

    + +

    For the JPEG-2000 image format, quality is mapped using a non-linear +equation to the compression ratio required by the Jasper library. This +non-linear equation is intended to loosely approximate the quality provided by +the JPEG v1 format. The default quality value 100, a request for non-lossy +compression. A quality of 75 results in a request for 16:1 compression.

    + +

    For the MNG and PNG image formats, the quality value sets the zlib +compression level (quality / 10) and filter-type (quality % 10). The default +PNG "quality" is 75, which means compression level 7 with adaptive PNG +filtering, unless the image has a color map, in which case it means +compression level 7 with no PNG filtering.

    + +

    For compression level 0 (quality value less than 10), the Huffman-only +strategy is used, which is fastest but not necessarily the worst +compression.

    + +

    If filter-type is 4 or less, the specified PNG filter-type is used for +all scanlines:

    + +
    +
    +
    0
    none
    +
    1
    sub
    +
    2
    up
    +
    3
    average
    +
    4
    Paeth
    +
    +
    + +

    If filter-type is 5, adaptive filtering is used when quality is greater +than 50 and the image does not have a color map, otherwise no filtering is +used.

    + +

    If filter-type is 6, adaptive filtering +with minimum-sum-of-absolute-values is used.

    + +

    Only if the output is MNG, if filter-type is 7, the LOCO color +transformation (intrapixel differencing) and adaptive filtering +with minimum-sum-of-absolute-values are used.

    + +

    If the filter-type is 8 the zlib Z_RLE compression strategy (or the +Z_HUFFMAN_ONLY strategy, when compression level is 0) is used with +adaptive PNG filtering.

    + +

    If the filter-type is 9 the zlib Z_RLE compression strategy (or the +Z_HUFFMAN_ONLY strategy, when compression level is 0) is used with +no PNG filtering.

    + +

    The quality setting has no effect on the appearance or signature of PNG +and MNG images, since the compression is always lossless.

    + +

    Not all combinations of compression level, strategy, and PNG filter type +can be obtained using the -quality option. For more precise control, +you can use the PNG:compression-level=N, PNG:compression-strategy=N, and +PNG:compression-filter=N defines, respectively, instead. +See -define. Values from the defines take precedence +over values from the -quality option.

    + +

    For further information, see +the PNG specification.

    + +

    For the MIFF and TIFF image formats, quality/10 is the Zip/BZip compression level, which is 0 (worst but fastest compression) to 9 (best but slowest). It has no effect on the image appearance, since the compression is always lossless.

    + +

    For the BPG image format, quality/2 is the actual BPG compression level (range from 0 to 51).

    + +
    +

    -quantize colorspace

    +
    + +

    Reduce colors using this colorspace.

    + +

    This setting defines the colorspace used to sort out and reduce the number +of colors needed by an image (for later dithering) by operators such as -colors, Note that color reduction also happens +automatically when saving images to color-limited image file formats, such as +GIF, and PNG8.

    + + +
    +

    -quiet

    +
    + +

    Suppress all warning messages. Error messages are still reported.

    + +
    +

    -radial-blur angle

    +
    + +

    Blur around the center of the image.

    + +

    Note that this is actually a rotational blur rather than a radial and as +such actually mis-named.

    + +

    The -virtual-pixel setting will determine how +pixels which are outside the image proper are blurred into the final result. +

    + + +
    +

    -raise thickness

    +
    + +

    Lighten or darken image edges.

    + +

    This will create a 3-D effect. Use -raise to create +a raised effect, otherwise use +raise.

    + +

    Unlike the similar -frame option, -raise does not alter the dimensions of the image.

    + +
    +

    -random-threshold lowxhigh

    +
    + +

    Apply a random threshold to the image.

    + +
    +

    -range-threshold low-black,low-white,high-white,high-black

    +
    + +

    Perform either hard or soft thresholding within some range of values in an image.

    + +
    +

    -read-mask +filename

    +
    + +

    Prevent updates to image pixels specified by the mask.

    + +

    This the same as using a mask used for composite masking operations, with +grayscale values causing blended updates of the image the mask is attached to. +

    + +

    Use +read-mask to remove the mask from images.

    + +

    Also see -clip-mask which work in the same way, +but with strict boolean masking.

    + +
    +

    -red-primary x,y

    +
    + +

    Set the red chromaticity primary point.

    + +
    +

    -regard-warnings

    +
    + +

    Pay attention to warning messages.

    + +

    This option causes some warnings in some image formats to be treated +as errors.

    + +
    +

    -remap filename

    +
    + +

    Reduce the number of colors in an image to the colors used by this image.

    + +

    If the -dither setting is enabled (the default) then +the given colors are dithered over the image as necessary, otherwise the closest +color (in RGB colorspace) is selected to replace that pixel in the image.

    + +

    As a side effect of applying a -remap of colors across all +images in the current image sequence, all the images will have the same color +table. That means that when saved to a file format such as GIF, it will use +that color table as a single common or global color table, for all the images, +without requiring extra local color tables.

    + +

    Use +remap to reduce all images in the current image +sequence to use a common color map over all the images. This equivalent to +appending all the images together (without extra background colors) and color +reducing those images using -colors with a 256 color +limit, then -remap those colors over the original list of +images. This ensures all the images follow a single color map.

    + +

    If the number of colors over all the images is less than 256, then +remap should not perform any color reduction or dithering, as +no color changes are needed. In that case, its only effect is to force the use +of a global color table. This recommended after using either -colors or -ordered-dither to +reduce the number of colors in an animated image sequence.

    + +

    Note, the remap image colormap has at most 8-bits of precision. Deeper color maps are automagically coalesced with other colors to meet this requirement.

    + +
    +

    -region geometry

    +
    + +

    Set a region in which subsequent operations apply.

    + +

    The x and y offsets are treated +in the same manner as in -crop.

    + +

    See Image Geometry for complete details about the geometry argument.

    + +

    Use +region to remove any previously set regions.

    + +
    +

    -remote

    +
    + +

    Perform a remote operation.

    + +

    The only command recognized is the name of an image file to load.

    + +

    If you have more than one display application +running simultaneously, use the window option to +specify which application to control.

    + +
    +

    -render

    +
    + +

    Render vector operations.

    + +

    Use +render to turn off rendering vector operations. +This useful when saving the result to vector formats such as MVG or SVG.

    + +
    +

    -repage geometry

    +
    + +

    Adjust the canvas and offset information of the image.

    + +

    This option is like -page but acts as an image operator +rather than a setting. You can separately set the canvas size or the offset +of the image on that canvas by only providing those components.

    + +

    See Image Geometry for complete details about the geometry argument.

    + +

    If a ! flag is given the offset given is added to the existing +offset to move the image relative to its previous position. This useful for +animation sequences.

    + +

    A given a canvas size of zero such as '0x0' forces it to +recalculate the canvas size so the image (at its current offset) will appear +completely on that canvas (unless it has a negative offset).

    + +

    Use +repage to completely remove/reset the virtual +canvas meta-data from the images.

    + +

    The -set 'page' option can be used to +directly assign virtual canvas meta-data.

    + + +
    +

    -resample horizontalxvertical

    +
    + +

    Resample image to specified horizontal and vertical resolution.

    + +

    Resize the image so that its rendered size remains the same as the original +at the specified target resolution. For example, if a 300 DPI image renders at +3 inches by 2 inches on a 300 DPI device, when the image has been resampled to +72 DPI, it will render at 3 inches by 2 inches on a 72 DPI device. Note that +only a small number of image formats (e.g. JPEG, PNG, and TIFF) are capable of +storing the image resolution. For formats which do not support an image +resolution, the original resolution of the image must be specified via -density on the command line prior to specifying the +resample resolution.

    + +

    Note that Photoshop stores and obtains image resolution from a proprietary +embedded profile. If this profile exists in the image, then Photoshop will +continue to treat the image using its former resolution, ignoring the image +resolution specified in the standard file header.

    + +
    +

    -resize geometry

    +
    + +

    Resize an image.

    + +

    See Image Geometry for complete details about the geometry argument. Offsets, if present in the geometry string, are +ignored, and the -gravity option has no effect.

    + +

    If the -filter option +or -define filter:option=value precedes the -resize option, the image is resized with the specified +filter.

    + +

    Many image processing algorithms assume your image is in a linear-light +coding. If your image is gamma-corrected, you can remove the nonlinear gamma +correction, apply the transform, then restore it like this:

    + +
      < class="bg-light text-dark mx-4">convert portrait.jpg -gamma .45455 -resize 25% -gamma 2.2 \ + -quality 92 passport.jpg +
    + +

    Note, some resampling functions are damped oscillations in approximation of a Sinc function. As such, you may get negative lobes if your release of ImageMagick is HDRI-enabled. To eliminate them, add -clamp to your command-line.

    + +
    +

    -respect-parentheses

    +
    + +

    Settings remain in effect until parenthesis boundary.

    + +
    +

    -reverse

    +
    + +

    Reverse the order of images in the current image list.

    + + +
    +

    -roll {+-}x{+-}y

    +
    + +

    Roll an image vertically or horizontally by the amount given.

    + +

    A negative x offset rolls the image right-to-left. +A negative y offset rolls the image bottom-to-top.

    + + +
    +

    -rotate degrees{<}{>}

    +
    + +

    Apply Paeth image rotation (using shear operations) to the image.

    + +

    Use > to rotate the image only if its width exceeds the +height. < rotates the image only if its width is less +than the height. For example, if you specify -rotate "-90>" and +the image size is 480x640, the image is not rotated. However, if the image is +640x480, it is rotated by -90 degrees. If you use > or +<, enclose it in quotation marks to prevent it from being +misinterpreted as a file redirection.

    + +

    Empty triangles in the corners, left over from rotating the image, are +filled with the background color.

    + +

    See also the -distort operator and specifically the +'ScaleRotateTranslate' distort method.

    + +

    The page or virtual canvas information of the image is also rotated. Use a +repage to remove the virtual canvas page information if it is unwanted.

    + + +
    +

    -sample geometry

    +
    + +

    Minify / magnify the image with pixel subsampling and pixel replication, respectively.

    + +

    Change the image size simply by directly sampling the pixels original +from the image. When magnifying, pixels are replicated in blocks. When +minifying, pixels are sub-sampled (i.e., some rows and columns are skipped +over).

    + +

    The results are thus equivalent to using -resize with +a -filter setting of point (nearest +neighbor), though -sample is a lot faster, as it +avoids all the filter processing of the image. As such it completely ignores +the current -filter setting.

    + +

    The key feature of the -sample is that no new colors +will be added to the resulting image, though some colors may disappear.

    + +

    See Image Geometry for complete details about the geometry argument. Offsets, if present in the geometry string, are +ignored, unlike -resize.

    + + +

    The actual sampling point is the middle of the sub-region being sampled. +As such a single pixel sampling of an image will take the middle pixel, (or +top-left-middle if image has even dimensions). However the -define 'sample:offset' can be set to modify +this position some other location within each sub-region being sampled, as +a percentage offset.

    + +

    By default this value is '50' for the midpoint, but could be set +to '0' for top-left, '100' for bottom-right, or with +separate X and Y offsets such as '0x50' for left-middle edge of +sampling sub-region.

    + + +
    +

    -sampling-factor horizontal-factorxvertical-factor

    +
    + +

    Sampling factors used by JPEG or MPEG-2 encoder and YUV decoder/encoder.

    + +

    This option specifies the sampling factors to be used by the JPEG encoder +for chroma downsampling. If this option is omitted, the JPEG library will use +its own default values. When reading or writing the YUV format and when +writing the M2V (MPEG-2) format, use -sampling-factor 2x1 or -sampling-factor 4:2:2 to specify the 4:2:2 +downsampling method.

    + +
    +

    -scale geometry

    +
    + +

    Minify / magnify the image with pixel block averaging and pixel replication, respectively.

    + +

    Change the image size simply by replacing pixels by averaging pixels +together when minifying, or replacing pixels when magnifying.

    + +

    The results are thus equivalent to using -resize with +a -filter setting of box. Though it is a lot +faster, as it avoids all the filter processing of the image. As such it +completely ignores the current -filter setting.

    + +

    If when shrinking (minifying) images the original image is some integer +multiple of the new image size, the number of pixels averaged together to +produce the new pixel color is the same across the whole image. This is +a special case known as 'binning' and is often used as a method of reducing +noise in image such as those generated by digital cameras, especially in low +light conditions.

    + + +
    +

    -scene value

    +
    + +

    Set scene number.

    + +

    This option sets the scene number of an image or the first image in an image sequence.

    + +
    +

    -screen

    +
    + +

    Specify the screen to capture.

    + +

    This option indicates that the GetImage request used to obtain the image +should be done on the root window, rather than directly on the specified +window. In this way, you can obtain pieces of other windows that overlap the +specified window, and more importantly, you can capture menus or other popups +that are independent windows but appear over the specified window.

    + +
    +

    -seed

    +
    + +

    Seed a new sequence of pseudo-random numbers

    + +
    +

    -segment cluster-thresholdxsmoothing-threshold

    +
    + +

    Segment the colors of an image.

    + +

    Segment an image by analyzing the histograms of the color components and +identifying units that are homogeneous with the fuzzy c-means technique. This +is part of the ImageMagick color quantization routines.

    + +

    Specify cluster threshold as the number of pixels in +each cluster that must exceed the cluster threshold to be considered valid. +Smoothing threshold eliminates noise in the second +derivative of the histogram. As the value is increased, you can expect +a smoother second derivative. The default is 1.5.

    + +

    If the -verbose setting is defined, a detailed report +of the color clusters is returned.

    + + +
    +

    -selective-blur radius
    -selective-blur radius{xsigma}{+threshold}

    +
    + +

    Selectively blur pixels within a contrast threshold.

    + +

    Blurs those pixels that are less than or equal to the threshold in +contrast. The threshold may be expressed as a fraction of QuantumRange or as a percentage.

    + +
    +

    -separate

    +
    + +

    Separate an image channel into a grayscale image. Specify the channel with -channel.

    + +
    +

    -sepia-tone percent-threshold

    +
    + +

    Simulate a sepia-toned photo.

    + +

    Specify threshold as the percent threshold of the intensity (0 - 99.9%).

    + +

    This option applies a special effect to the image, similar to the effect +achieved in a photo darkroom by sepia toning. Threshold ranges from 0 to QuantumRange and is a measure of the extent of the sepia +toning. A threshold of 80% is a good starting point for a reasonable +tone.

    + + + +
    +

    -set key value

    +

    +set key

    +
    + +

    Sets image attributes and properties for images in the current image sequence.

    + +

    This will assign (or modify) specific settings attached to all the images +in the current image sequence. Using the +set form of the +option will either remove, or reset that setting to a default state, as +appropriate.

    + +

    For example, it will modify specific well known image meta-data +'attributes' such as those normally overridden by: the options -delay, -dispose, and -page, -colorspace; generally +assigned before the image is read in, by using a key of +the same name.

    + +

    If the given key does not match a specific known +'attribute ', such as shown above, the setting is stored as a free form +'property' string. Such settings are listed in -verbose information ("info:" output format) as "Properties". +

    + +

    This includes string 'properties' that are set by and assigned to images +using the options -comment, -label, -caption. These options actually assign +a global 'artifact' which are automatically assigned (and any Format Percent +Escapes expanded) to images as they are read in. For example:

    + +
      < class="bg-light text-dark mx-4">$ convert rose: -set comment 'Rose is a rose is a rose is a rose' rose.jpg +identify -format %c rose.jpg +Rose is a rose is a rose is a rose +
    + +

    The set value can also make use of Format and Print Image +Properties in the defined value. For example:

    + +
      < class="bg-light text-dark mx-4">$ convert rose: -set origsize '%wx%h' -resize 50% \ + -format 'Old size = %[origsize] New size = %wx%h' info: +Old size = 70x46 New size = 35x23 +
    + +

    Other well known 'properties' that are available include: +'date:create' and 'date:modify' and +'signature'.

    + +

    The -repage operator will also allow you to modify +the 'page' attribute of an image for images already in memory (also +see -page). However it is designed to provide a finer +control of the sub-parts of this 'attribute'. The -set page +option will only provide a direct, unmodified assignment of 'page' +attribute.

    + +

    This option can also associate a colorspace or profile with your image. +For example,

    + +
      < class="bg-light text-dark mx-4">convert image.psd -set profile ISOcoated_v2_eci.icc image-icc.psd +
    + +

    Some 'properties' must be defined in a specific way to be used. For +example only 'properties' prefixed with "filename:" can be used to +modify the output filename of an image. For example

    + +
      < class="bg-light text-dark mx-4">convert rose: -set filename:mysize '%wx%h' 'rose_%[filename:mysize].png' +
    + +

    If the setting value is prefixed with "option:" the setting will +be saved as a global "Artifact" exactly as if it was set using the -define option. As such settings are global in scope, they +can be used to pass 'attributes' and 'properties' of one specific image, +in a way that allows you to use them in a completely different image, even if +the original image has long since been modified or destroyed. For example:

    + +
      < class="bg-light text-dark mx-4">convert rose: -set option:rosesize '%wx%h' -delete 0 \ + label:'%[rosesize]' label_size_of_rose.gif" +
    + +

    Note that Format Percent Escapes will only match +a 'artifact' if the given key does not match an existing +'attribute' or 'property'.

    + +

    You can set the attributes of the image registry by prefixing the value +with registry:.

    + +

    The -set profile option can also be used to inject +previously-formatted ancillary chunks into the output PNG file, using +the commandline option as shown below or by setting the profile via a +programming interface:

    + +
      < class="bg-light text-dark mx-4">convert in.png -set profile PNG-chunk-x:<filename> out.png +
    + +

    where x is a location flag and +filename is a file containing the chunk +name in the first 4 bytes, then a colon (":"), followed by the chunk data. +This encoder will compute the chunk length and CRC, so those must not +be included in the file.

    + +

    "x" can be "b" (before PLTE), "m" (middle, i.e., between PLTE and IDAT), +or "e" (end, i.e., after IDAT). If you want to write multiple chunks +of the same type, then add a short unique string after the "x" to prevent +subsequent profiles from overwriting the preceding ones, e.g.,

    + + +
      < class="bg-light text-dark mx-4">convert in.png -set profile PNG-chunk-b01:file01 \ + -profile PNG-chunk-b02:file02 out.png +
    + +
    +

    -shade azimuthxelevation

    +
    + +

    Shade the image using a distant light source.

    + +

    Specify azimuth and elevation as +the position of the light source. Use +shade to return +the shading results as a grayscale image.

    + +
    +

    -shadow percent-opacity{xsigma}{+-}x{+-}y{%}

    +
    + +

    Simulate an image shadow.

    + +
    +

    -shared-memory

    +
    + +

    Use shared memory.

    + +

    This option specifies whether the utility should attempt to use shared +memory for pixmaps. ImageMagick must be compiled with shared memory support, +and the display must support the MIT-SHM extension. +Otherwise, this option is ignored. The default is True.

    + +
    +

    -sharpen radius
    -sharpen radius{xsigma}

    +
    + +

    Sharpen the image.

    + +

    Use a Gaussian operator of the given radius and standard deviation (sigma).

    + +
    +

    -shave geometry

    +
    + +

    Shave pixels from the image edges.

    + +

    The size portion of the geometry +argument specifies the width of the region to be removed from both sides of +the image and the height of the regions to be removed from top and bottom. +Offsets are ignored.

    + +

    See Image Geometry for complete details about the geometry argument.

    + +
    +

    -shear Xdegrees[xYdegrees]

    +
    + +

    Shear the image along the x-axis and/or y-axis.

    + +

    The shear angles may be positive, negative, or zero. When Ydegrees is omitted it defaults to Xdegrees. When both angles are +given, the horizontal component of the shear is performed before the vertical +component.

    + +

    Shearing slides one edge of an image along the x-axis or y-axis (i.e., +horizontally or vertically, respectively),creating a parallelogram. The amount +of each is controlled by the respective shear angle. For horizontal shears, +Xdegrees is measured clockwise relative to "up" (the +negative y-axis), sliding the top edge to the right when 0°<Xdegrees<90° and to the left when 90°<Xdegrees<180°. For vertical shears Ydegrees is measured clockwise relative to "right" (the +positive x-axis), sliding the right edge down when 0°<Ydegrees<90° and up when 90°<Ydegrees<180°.

    + +

    Empty triangles left over from shearing the image are filled with the color +defined by the -background option. The color is specified +using the format described under the -fill option.

    + +

    The horizontal shear is performed before the vertical part. This is +important to note, since horizontal and vertical shears do not +commute, i.e., the order matters in a sequence of shears. For +example, the following two commands are not equivalent.

    + +
      < class="bg-light text-dark mx-4">convert logo: -shear 20x0 -shear 0x60 logo-sheared.png +convert logo: -shear 0x60 -shear 20x0 logo-sheared.png +
    + +

    The first of the two commands above is equivalent to the following, except +for the amount of empty space created; the command that follows generates +a smaller image, and so is a better choice in terms of time and space.

    + +
      < class="bg-light text-dark mx-4">convert logo: -shear 20x60 logo-sheared.png +
    + +
    +

    -sigmoidal-contrast contrastxmid-point

    +
    + +

    Increase the contrast without saturating highlights or shadows.

    + +

    Increase the contrast of the image using a sigmoidal transfer function +without saturating highlights or shadows. Contrast +indicates how much to increase the contrast. For example, 0 is none, 3 is +typical and 20 is a lot. +

    + +

    The mid-point indicates where the maximum change +'slope' in contrast should fall in the resultant image (0 is white; 50% is +middle-gray; 100% is black).

    + +

    By default the image contrast is increased, use +sigmoidal-contrast to decrease the contrast.

    + +

    To achieve the equivalent of a sigmoidal brightness change (similar to +a gamma adjustment), you would use -sigmoidal-contrast +{brightness}x0% to increase brightness and +sigmoidal-contrast {brightness}x0% to decrease brightness. +Note the use of '0' fo rthe mid-point of the sigmoidal curve.

    + +

    Using a very high contrast will produce a sort of +'smoothed thresholding' of the image. Not as sharp (with high aliasing +effects) of a true threshold, but with tapered gray-levels around the threshold +mid-point.

    + +
    +

    -silent

    + + +
    + +

    Operate silently. This option is only used +by the import tool.

    + +
    +

    -similarity-threshold value

    +
    + +

    Minimum RMSE for subimage match.

    + +

    If this setting is used, then the search will stop as soon as it finds a match whose metric is less than or equal to the value. A partially filled second output image will result. Using a value of zero, will cause the search to stop at the first perfect match it finds. If this setting is left off, then the search will proceed to completion or as limited by -dissimilarity-threshold.

    + +
    +

    -size width[xheight][+offset]

    +
    + +

    Set the width and height of the image.

    + +

    Use this option to specify the width and height of raw images whose +dimensions are unknown such as GRAY, RGB, or +CMYK. In addition to width and height, use -size with an offset to skip any header information in the +image or tell the number of colors in a MAP image file, (e.g. -size +640x512+256).

    + +

    For Photo CD images, choose from these sizes:

    + +
      < class="bg-light text-dark mx-4">192x128 +384x256 +768x512 +1536x1024 +3072x2048 +
    + +
    +

    -sketch radius
    -sketch radius{xsigma}+angle

    +
    + +

    Simulate a pencil sketch.

    + +

    Sketch with the given radius, standard deviation (sigma), and angle. The +angle given is the angle toward which the image is sketched. That is the +direction people would consider the object is coming from.

    + +
    +

    -smush offset

    +
    + +

    Appends an image sequence together ignoring transparency.

    + +

    Smush is a more flexible version of -append, joining the images in the sequence top-to-bottom (-smush) or left-to-right (+smush), with a gap between images according to the specified offset.

    + +

    If the offset is negative, images will overlap by that amount.

    + +

    -smush respects -gravity. Any empty space will be filled with the -background color.

    + +

    For zero offset and transparent images, the non-transparent parts of the two images will be aligned as close as possible without overlapping.

    + +
    +

    -snaps value

    +
    + +

    Set the number of screen snapshots.

    + +

    Use this option to grab more than one image from the X server screen, to create an animation sequence.

    + +
    +

    -solarize percent-threshold

    +
    + +

    Negate all pixels above the threshold level.

    + +

    Specify factor as the percent threshold of the intensity (0 - 99.9%).

    + +

    This option produces a solarization effect seen when +exposing a photographic film to light during the development process.

    + +
    +

    -sparse-color method 'x,y color ...'

    +
    + +

    color the given image using the specified points of color, and filling the other intervening colors using the given methods.

    + + +
    +
    +
    barycentric
    +
    three point triangle of color given 3 points. + Giving only 2 points will form a linear gradient between those points. + The gradient generated extends beyond the triangle created by those + 3 points.
    +
    bilinear
    +
    Like barycentric but for 4 points. Less than 4 points + fall back to barycentric.
    +
    voronoi
    +
    Simply map each pixel to the to nearest color point + given. The result are polygonal 'cells' of solid color.
    +
    manhattan
    +
    Like voronoi, but resulting polygonal 'cells' are mapped to a fixed coordinate system.
    +
    shepards
    +
    Colors points biased on the ratio of inverse distance + squared. Generating spots of color in a sea of the average of + colors.
    +
    inverse
    +
    Colors points biased on the ratio of inverse distance. + This generates sharper points of color rather than rounded spots of + 'shepards' Generating spots of color in a sea of the + average of colors.
    +
    +
    + +

    The points are placed according to the images location on the virtual +canvas (-page or -repage +offset), and do not actually have to exist on the given image, but may be +some point beyond the edge of the image. All points are floating point values. +

    + +

    Only the color channels defined by the -channel are +modified, which means that by default matte/alpha transparency channel is not +affected. Typically transparency channel is turned off either before or after +the operation.

    + +

    Of course if some color points are transparent to generate a transparent +gradient, then the image also requires transparency enabled to store the +values.

    + +

    All the above methods when given a single point of color will replace all +the colors in the image with the color given, regardless of the point. This is +logical, and provides an alternative technique to recolor an image to some +default value.

    + + +
    +

    -splice geometry

    +
    + +

    Splice the current background color into the image.

    + +

    This will add rows and columns of the current -background color into the given image according to the +given -gravity geometry setting. See Image Geometry for complete details about the geometry argument. Essentially -splice will divide the +image into four quadrants, separating them by the inserted rows and columns. +

    + +

    If a dimension of geometry is zero no rows or columns will be added for that +dimension. Similarly using a zero offset with the appropriate -gravity setting will add rows and columns to the edges of +the image, padding the image only along that one edge. Edge padding is what -splice is most commonly used for.

    + +

    If the exact same geometry and -gravity is later used with -chop the +added all splices removed.

    + +
    +

    -spread amount

    +
    + +

    Displace image pixels by a random amount.

    + +

    The argument amount defines the size of the +neighborhood around each pixel from which to choose a candidate pixel to +blend.

    + +

    The lookup is controlled by the -interpolate setting.

    + +
    +

    -statistic type geometry

    +
    + +

    Replace each pixel with corresponding statistic from the neighborhood.

    + +

    Choose from these statistic types:

    + +
    +
    +
    Gradient
    maximum difference (max - min) value in neighborhood
    +
    Maximum
    maximum value per channel in neighborhood
    +
    Minimum
    minimum value per channel in neighborhood
    +
    Mean
    average value per channel in neighborhood
    +
    Median
    median value per channel in neighborhood
    +
    Mode
    mode (most frequent) value per channel in neighborhood
    +
    Nonpeak
    value just before or after the median value per channel in neighborhood
    +
    RMS
    root mean square value per channel in neighborhood
    +
    StandardDeviation
    standard deviation value per channel in neighborhood
    +
    +
    + +
    +

    -stegano offset

    +
    + +

    Hide watermark within an image.

    + +

    Use an offset to start the image hiding some number of pixels from the +beginning of the image. Note this offset and the image size. You will need +this information to recover the steganographic image (e.g. display -size +320x256+35 stegano:image.png).

    + +
    +

    -stereo +x{+y}

    +
    + +

    Composite two images to create a red / cyan stereo anaglyph.

    + +

    The left side of the stereo pair (second image) is saved as the red channel of the output image. The right side (first image) is saved as the green and blue channels. Red-green stereo glasses are required to properly view the stereo image.

    + +
    +

    -storage-type type

    +
    + +

    Pixel storage type. Here are the valid types:

    + +
    +
    +
    char
    unsigned characters
    +
    double
    doubles
    +
    float
    floats
    +
    integer
    integers
    +
    long
    longs
    +
    quantum
    pixels in the native depth of your ImageMagick distribution
    +
    short
    unsigned shorts
    +
    +
    + +

    Float and double types are normalized from 0.0 to 1.0 otherwise the pixels +values range from 0 to the maximum value the storage type can support.

    + +
    +

    -stretch fontStretch

    +
    + +

    Set a type of stretch style for fonts.

    + +

    This setting suggests a type of stretch that ImageMagick should try to +apply to the currently selected font family. Select fontStretch from the following.

    + +
      < class="bg-light text-dark mx-4">Any +Condensed +Expanded +ExtraCondensed +ExtraExpanded +Normal +SemiCondensed +SemiExpanded +UltraCondensed +UltraExpanded +
    + +

    To print a complete list of stretch types, use -list +stretch.

    + +

    For other settings that affect fonts, see the options -font, -family, -style, and -weight.

    + +
    +

    -strip

    +
    + +

    Strip the image of any profiles, comments or these PNG chunks: bKGD,cHRM,EXIF,gAMA,iCCP,iTXt,sRGB,tEXt,zCCP,zTXt,date.

    + +
    +

    -stroke color

    +
    + +

    Color to use when stroking a graphic primitive.

    + +

    The color is specified using the format described under the -fill option.

    + +

    See -draw for further details.

    + +
    +

    -strokewidth value

    +
    + +

    Set the stroke width.

    + +

    See -draw for further details.

    + +
    +

    -style fontStyle

    +
    + +

    Set a font style for text.

    + +

    This setting suggests a font style that ImageMagick should try to apply to +the currently selected font family. Select fontStyle from +the following.

    + +
      < class="bg-light text-dark mx-4">Any +Italic +Normal +Oblique +
    + +

    For other settings that affect fonts, see the options -font, -family, -stretch, and -weight.

    + +
    +

    -subimage-search

    +
    + +

    Search for subimage.

    + +

    This option is required to have compare search for the best match location +of a small image within a larger image. This search will produce two images +(or two frames). The first is the "difference" image and the second will +be the "match score" image.

    + +

    The "match-score" image is smaller containing a pixel for ever possible +position of the top-left corner of the given sub-image. that is its size will +be the size of the larger_image - sub_image + 1. The brightest location in +this image is the location s the locate on the best match that is also +reported. Note that this may or may not be a perfect match, and the actual +brightness will reflect this. Other bright 'peaks' can be used to locate other +possible matching locations.

    + +

    Note that the search will try to compare the sub-image at every possible +location in the larger image, as such it can be very slow. The smaller the +sub-image the faster this search is.

    + + +
    +

    -swap index,index

    +
    + +

    Swap the positions of two images in the image sequence.

    + +

    For example, -swap 0,2 swaps the first and the third +images in the current image sequence. Use +swap to switch +the last two images in the sequence.

    + +
    +

    -swirl degrees

    +
    + +

    Swirl image pixels about the center.

    + +

    Degrees defines the tightness of the swirl.

    + +
    +

    -synchronize

    +
    + +

    Synchronize image to storage device.

    + +

    Set to "true" to ensure all image data is fully flushed and synchronized +to disk. There is a performance penalty, but the benefits include ensuring a +valid image file in the event of a system crash and early reporting if there +is not enough disk space for the image pixel cache.

    + +
    +

    -taint

    +
    + +

    Mark the image as modified.

    + +
    +

    -text-font name

    +
    + +

    Font for writing fixed-width text.

    + +

    Specifies the name of the preferred font to use in fixed (typewriter style) +formatted text. The default is 14 point Courier.

    + +

    You can tag a font to specify whether it is a PostScript, TrueType, or +OPTION1 font. For example, Courier.ttf is a TrueType font and +x:fixed is OPTION1.

    + +
    +

    -texture filename

    +
    + +

    Name of texture to tile onto the image background.

    + +
    +

    -threshold value{%}

    +
    + + + +

    Apply simultaneous black/white threshold to the image.

    + +

    Any pixel values (more specifically, those channels set using -channel) that exceed the specified threshold are reassigned the +maximum channel value, while all other values are assigned the minimum.

    + +

    The threshold value can be given as a percentage or as an absolute integer +value corresponding to the desired channel value. When given as an integer, +the minimum attainable value is 0 (corresponding to black when all channels +are affected), but the maximum value (corresponding to white) is that of the +quantum depth of the particular build of ImageMagick, and is +therefore dependent on the installation. For that reason, a reasonable +recommendation for most applications is to specify the threshold values as +a percentage.

    + +

    The following would force pixels with red values above 50% to have 100% +red values, while those at or below 50% red would be set to 0 in the red +channel. The green, blue, and alpha channels (if present) would be unchanged. +

    + +
      < class="bg-light text-dark mx-4">convert in.png -channel red -threshold 50% out.png +
    + +

    As (possibly) impractical but instructive examples, the following would +generate an all-black and an all-white image with the same dimensions as the +input image.

    + + +
      < class="bg-light text-dark mx-4">convert in.png -channel RGB -threshold 100% black.png +convert in.png -channel RGB -threshold -1 white.png +
    + +

    See also -black-threshold and -white-threshold. +

    + +
    +

    -thumbnail geometry

    +
    + +

    Create a thumbnail of the image.

    + +

    This is similar to -resize, except it is optimized +for speed and any image profile, other than a color profile, is removed to +reduce the thumbnail size. To strip the color profiles as well, add -strip just before of after this option.

    + +

    See Image Geometry for complete details about the geometry argument.

    + +
    +

    -tile filename

    +
    + +

    Set the tile image used for filling a subsequent graphic primitive.

    + +
    +

    -tile geometry

    +
    + +

    Specify the layout of images.

    + +

    See Image Geometry for complete details about the geometry argument.

    + +
    +

    -tile

    +
    + +

    Specifies that a subsequent composite operation is repeated across and down image.

    + +
    +

    -tile-offset {+-}x{+-}y

    +
    + +

    Specify the offset for tile images, relative to the background image it is tiled on.

    + +

    This should be set before the tiling image is set by -tile or -texture, or directly applied for +creating a tiled canvas using TILE: or PATTERN: input +formats.

    + +

    Internally ImageMagick does a -roll of the tile image +by the arguments given when the tile image is set.

    + +
    +

    -tint value

    +
    + +

    Tint the image with the fill color.

    + +

    Tint the image with the fill color.

    + +

    Specify the amount of tinting as a percentage. Pure colors like black, +white red, yellow, will not be affected by -tint. Only mid-range colors such +as the various shades of grey.

    + +
    +

    -title string

    +
    + +

    Assign a title to displayed image.", "animate", "display", "montage

    + +

    Use this option to assign a specific title to the image. This assigned to +the image window and is typically displayed in the window title bar. +Optionally you can include the image filename, type, width, height, Exif data, +or other image attribute by embedding special format characters described +under the -format option.

    + +

    For example,

    + +
      < class="bg-light text-dark mx-4">-title "%m:%f %wx%h" +
    + +

    produces an image title of MIFF:bird.miff 512x480 for an image +titled bird.miff and whose width is 512 and height is 480.

    + + +
    +

    -transform

    +
    + +

    Transform the image.

    + +

    This option applies the transformation matrix from a previous -affine option.

    + +
      < class="bg-light text-dark mx-4">convert -affine 2,2,-2,2,0,0 -transform bird.ppm bird.jpg +
    + + +

    This operator has been now been superseded by the -distort 'AffineProjection' method.

    + + +
    +

    -transparent color

    +
    + +

    Make this color transparent within the image.

    + +

    The color argument is defined using the format +described under the -fill option. The -fuzz setting can be used to match and replace colors similar to the one +given.

    + +

    Use +transparent to invert the pixels matched. +that is make all non-matching colors transparent.

    + +

    The -opaque operator is exactly the same as -transparent but replaces the matching color with the +current -fill color setting, rather than transparent. +However the -transparent operator also ensures +that the image has an alpha channel enabled, as per "-alpha set", and does not require you to modify the -channel to enable alpha channel handling.

    + +

    Note that this does not define the color as being the 'transparency color' +used for color-mapped image formats, such as GIF. For that use -transparent-color

    + + +
    +

    -transparent-color color

    +
    + +

    Set the transparent color.

    + +

    Sometimes this is used for saving to image formats such as +GIF and PNG8 which uses this color to represent boolean transparency. This +does not make a color transparent, it only defines what color the transparent +color is in the color palette of the saved image. Use -transparent to make an opaque color transparent.

    + +

    This option allows you to have both an opaque visible color, as well as a +transparent color of the same color value without conflict. That is, you can +use the same color for both the transparent and opaque color areas within an +image. This, in turn, frees to you to select a transparent color that is +appropriate when an image is displayed by an application that does not handle a +transparent color index, while allowing ImageMagick to correctly handle images of this +type.

    + +

    The default transparent color is #00000000, which is fully transparent black.

    + +
    +

    -transpose

    +
    + +

    Mirror the image along the top-left to bottom-right diagonal.

    + +

    This option mathematically transposes the pixel array. It is equivalent to the sequence -flip -rotate 90. +

    + +
    +

    -transverse

    +
    + +

    Mirror the image along the images bottom-left top-right diagonal. Equivalent to the operations -flop -rotate 90.

    + + +
    +

    -treedepth value

    +
    + +

    Tree depth for the color reduction algorithm.

    + +

    Normally, this integer value is zero or one. A value of zero or one causes +the use of an optimal tree depth for the color reduction algorithm.

    + +

    An optimal depth generally allows the best representation of the source +image with the fastest computational speed and the least amount of memory. +However, the default depth is inappropriate for some images. To assure the +best representation, try values between 2 and 8 for this parameter. Refer to +the color reduction algorithm for more details.

    + +

    The -colors or -monochrome +option, or writing to an image format which requires color reduction, is +required for this option to take effect.

    + +
    +

    -trim

    +
    + +

    Trim an image.

    + +

    This option removes any edges that are exactly the same color as the corner +pixels. Use -fuzz to make -trim remove +edges that are nearly the same color as the corner pixels.

    + +

    The page or virtual canvas information of the image is preserved allowing +you to extract the result of the -trim operation from the +image. Use a +repage to remove the virtual canvas page +information if it is unwanted.

    + +

    If the trimmed image 'disappears' a warning is produced, and a special +single pixel transparent 'missed' image is returned, in the same way as when a +-crop operation 'misses' the image proper.

    + +

    Use -define trim:percent-background=0% to remove all the background from the image. The amount of background that is tolerated in an edge specified as a percent. 0% means no background is tolerated. 50% means an edge can contain up to 50% pixels that are background per the fuzz-factor.

    + +

    Use -background background-color to identify background color surrounding the region of interest.

    + +
    +

    -type type

    +
    + +

    The image type.

    Choose from: Bilevel, +Grayscale, GrayscaleAlpha, Palette, +PaletteAlpha, TrueColor, TrueColorAlpha, +ColorSeparation, or ColorSeparationAlpha.

    + +

    Normally, when a format supports different subformats such as grayscale and +truecolor, the encoder will try to choose an efficient subformat. The -type option can be used to override this behavior. For +example, to prevent a JPEG from being written in grayscale format even though +only gray pixels are present, use.

    + +
      < class="bg-light text-dark mx-4">convert bird.png -type TrueColor bird.jpg +
    + +

    Similarly, use -type TrueColorAlpha to force the +encoder to write an alpha channel even though the image is opaque, if the +output format supports transparency.

    + +

    Use -type optimize to ensure the image is written in the smallest possible file size.

    + +
    +

    -undercolor color

    +
    + +

    Set the color of the annotation bounding box.

    + +

    The color is specified using the format described under the -fill option.

    + +

    See -draw for further details.

    + + +
    +

    -update seconds

    +
    + +

    Detect when image file is modified and redisplay.

    + +

    Suppose that while you are displaying an image the file that is currently +displayed is over-written. display will automagically detect that +the input file has been changed and update the displayed image +accordingly.

    + + +
    +

    -unique-colors

    +
    + +

    Discard all but one of any pixel color.

    + + +
    +

    -units type

    +
    + +

    The units of image resolution.

    + +

    Choose from: Undefined, PixelsPerInch, or +PixelsPerCentimeter. This option is normally used in conjunction +with the -density option.

    + + +
    +

    -unsharp radius
    -unsharp radius{xsigma}{+gain}{+threshold}

    +
    + +

    Sharpen the image with an unsharp mask operator.

    + +

    The -unsharp option sharpens an image. The image is +convolved with a Gaussian operator of the given radius and standard deviation +(sigma). For reasonable results, radius should be larger than sigma. Use +a radius of 0 to have the method select a suitable radius.

    + +

    The parameters are:

    + +
    +
    +
    radius
    +
    The radius of the Gaussian, in pixels, not counting the center pixel (default 0).
    +
    sigma
    +
    The standard deviation of the Gaussian, in pixels (default 1.0).
    +
    gain
    +
    The fraction of the difference between the original and the blur image that is added back into the original (default 1.0).
    +
    threshold
    +
    The threshold, as a fraction of QuantumRange, needed to apply the difference amount (default 0.05).
    +
    +
    + +
    +

    -verbose

    +
    + +

    Print detailed information about the image when this option precedes the -identify option or info:.

    + + +
    +

    -version

    +
    + +

    Print ImageMagick version string and exit.

    + + +
    +

    -view string

    +
    + +

    FlashPix viewing parameters.

    + + +
    +

    -vignette radius{xsigma}{+-}x{+-}y{%}

    +
    + +

    Soften the edges of the image in vignette style.

    + +

    The vignette effect rolloff is controlled by radiusxsigma. For nominal rolloff, this would be set to 0xsigma. A value of 0x0 will produce a circle/ellipse with no rolloff. The arguments x and y control the size of the circle. Larger values decrease the radii and smaller values increase the radii. Values of +0+0 will generate a circle/ellipse the same size as the image. The default values for x and y are 10% of the corresponding image dimension. Thus, the radii will be decreased by 10%, i.e., the diameters of the circle/ellipse will be 80% of the corresponding image dimension.

    + +
    +

    -virtual-pixel method

    +
    + +

    Specify contents of virtual pixels.

    + +

    This option defines what color source should be used if and when a color +lookup completely 'misses' the source image. The color(s) that appear to +surround the source image. Generally this color is derived from the source +image, but could also be set to a specify background color.

    + +

    Choose from these methods:

    + +
    +
    +
    background
    the area surrounding the image is the background color
    +
    black
    the area surrounding the image is black
    +
    checker-tile
    alternate squares with image and background color
    +
    dither
    non-random 32x32 dithered pattern
    +
    edge
    extend the edge pixel toward infinity
    +
    gray
    the area surrounding the image is gray
    +
    horizontal-tile
    horizontally tile the image, background color above/below
    +
    horizontal-tile-edge
    horizontally tile the image and replicate the side edge pixels
    +
    mirror
    mirror tile the image
    +
    random
    choose a random pixel from the image
    +
    tile
    tile the image (default)
    +
    transparent
    the area surrounding the image is transparent blackness
    +
    vertical-tile
    vertically tile the image, sides are background color
    +
    vertical-tile-edge
    vertically tile the image and replicate the side edge pixels
    +
    white
    the area surrounding the image is white
    +
    +
    + +

    The default value is "edge".

    + +

    This most important for distortion operators such as -distort, -implode, and -fx. +However it also affects operations that may access pixels just outside the +image proper, such as -convolve, -blur, and -sharpen.

    + +

    To print a complete list of virtual pixel types, use the -list virtual-pixel option.

    + + +
    +

    -visual type

    +
    + +

    Animate images using this X visual type.", 'animate', 'display'

    + +

    Choose from these visual classes:

    + +
      < class="bg-light text-dark mx-4">StaticGray TrueColor +GrayScale DirectColor +StaticColor default +PseudoColor visual id +
    + +

    The X server must support the visual you choose, otherwise an error occurs. +If a visual is not specified, the visual class that can display the most +simultaneous colors on the default screen is chosen.

    + + +
    +

    -watermark brightnessxsaturation

    +
    + +

    Watermark an image using the given percentages of brightness and saturation.

    + +

    Take a grayscale image (with alpha mask) and modify the destination image's +brightness according to watermark image's grayscale value and the +brightness percentage. The destinations color saturation +attribute is just direct modified by the saturation +percentage, which defaults to 100 percent (no color change).

    + + +
    +

    -wave amplitude
    -wave amplitudexwavelength

    +
    + +

    Shear the columns of an image into a sine wave.

    + +
    +

    -wavelet-denoise threshold
    -wavelet-denoise thresholdxsoftness

    +
    + +

    Removes noise from the image using a wavelet transform. The threshold is the value below which everything is considered noise and ranges from 0.0 (none) to QuantumRange or use percent (e.g. 5%). Softness attenuates the threshold and typically ranges from 0.0 (none) to 1.0. The higher the value the more noise that remains in the image.

    + +
    +

    -weight fontWeight

    +
    + +

    Set a font weight for text.

    + +

    This setting suggests a font weight that ImageMagick should try to apply to +the currently selected font family. Use a positive integer for +fontWeight or select from the following.

    + +
    +
    +
    Thin
    +
    Same as fontWeight = 100.
    +
    ExtraLight
    +
    Same as fontWeight = 200.
    +
    Light
    +
    Same as fontWeight = 300.
    +
    Normal
    +
    Same as fontWeight = 400.
    +
    Medium
    +
    Same as fontWeight = 500.
    +
    DemiBold
    +
    Same as fontWeight = 600.
    +
    Bold
    +
    Same as fontWeight = 700.
    +
    ExtraBold
    +
    Same as fontWeight = 800.
    +
    Heavy
    +
    Same as fontWeight = 900.
    +
    +
    +
    + +

    To print a complete list of weight types, use -list weight.

    + +

    For other settings that affect fonts, see the options -font, -family, -stretch, and -style.

    + +
    +

    -white-balance

    +
    +

    Applies white balancing to an image according to a grayworld assumption in the LAB colorspace.

    +

    Use -define white-balance:vibrance=value{%} to change the color vibrance of the a & b channels.

    + +
    +

    -white-point x,y

    +
    + +

    Chromaticity white point.

    + +
    +

    -white-threshold value{%}

    +
    + +

    Force to white all pixels above the threshold while leaving all pixels at or below the threshold unchanged.

    + +

    The threshold value can be given as a percentage or as an absolute integer +value within [0, QuantumRange] corresponding to the +desired -channel value. See -thresholdfor more details on thresholds and resulting values.

    + +
    +

    -window id

    +
    + +

    Make the image the background of a window.", 'animate', 'display'

    + +

    id can be a window id or name. Specify root +to select X's root window as the target window.

    + +

    By default the image is tiled onto the background of the target window. If +backdrop or -resize are specified, the +image is surrounded by the background color. Refer to X RESOURCES +for details.

    + +

    The image will not display on the root window if the image has more unique +colors than the target window colormap allows. Use -colors to reduce the number of colors.

    + +
    +

    -window-group

    +
    + +

    Specify the window group.

    + +
    +

    -write filename

    +
    + +

    Write an image sequence.

    + +

    The image sequence preceding the -write filename option is written out, and processing continues with the same image in its current state if there are additional options. To restore the image to its original state after writing it, use the +write filename option.

    + +

    Use -compress to specify the type of image compression.

    + +
    +

    -write-mask filename

    +
    + +

    Prevent updates to image pixels specified by the mask.

    + +

    This the same as using a mask used for composite masking operations, with +grayscale values causing blended updates of the image the mask is attached to. +

    + +

    Use +write-mask to remove the mask from images.

    + +

    Also see -clip-mask which work in the same way, +but with strict boolean masking.

    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/command-line-processing.html b/ImageMagick-6.9.12-44/www/command-line-processing.html new file mode 100644 index 0000000..3e84d6a --- /dev/null +++ b/ImageMagick-6.9.12-44/www/command-line-processing.html @@ -0,0 +1,662 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Processing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Anatomy of the Command-line

    +

    The Anatomy of the Command-lineInput FilenameCommand-line OptionsOutput Filename

    + +

    The ImageMagick command-line tools can be as simple as this:

    + +
    convert image.jpg image.png 
    + +

    Or it can be complex with a plethora of options, as in the following:

    + +
    convert label.gif +matte \
    +  \( +clone  -shade 110x90 -normalize -negate +clone  -compose Plus -composite \) \
    +  \( -clone 0 -shade 110x50 -normalize -channel BG -fx 0 +channel -matte \) \
    +  -delete 0 +swap  -compose Multiply -composite  button.gif");
    + +

    This example command is long enough that the command must be written across several lines, so we formatted it for clarity by inserting backslashes (\). The backslash is the Linux line-continuation character. In the Windows shell, use a carat character (^) for line-continuation. We use the Linux style on these web pages, as above. Sometimes, however, the lines are wrapped by your browser if the browser window is small enough, but the command-lines, shown in white, are still intended to be typed as one line. Line continuation characters need not be entered. The parentheses that are escaped above using the backslash are not escaped in Windows. There are some other differences between Windows and Linux (involving quotation marks, for instance), but we'll discuss some of those issues later, as they arise.

    + +

    Without knowing much about the ImageMagick command-line, you can probably surmise that the first command above converts an image in the JPEG format to one in the PNG format. However, very few may realize the second, more complex command, gives a flat two-dimensional label a three-dimensional look with rich textures and simulated depth:

    + + + + +

    Here we show percent completion of a task as a shaded cylinder:

    + +
      + Shaded Cylinder +
    + +

    Given the complexity of the rendering, you might be surprised it is accomplished by a single command-line:

    + +
    convert -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \
    +  -draw 'roundrectangle 16, 5, 304, 85 20,40' +tile -fill snow \
    +  -draw 'roundrectangle 264, 5, 304, 85  20,40' -tile gradient:chartreuse-green \
    +  -draw 'roundrectangle 16,  5, 180, 85  20,40' -tile gradient:chartreuse1-chartreuse3 \
    +  -draw 'roundrectangle 140, 5, 180, 85  20,40' +tile -fill none \
    +  -draw 'roundrectangle 264, 5, 304, 85 20,40' -strokewidth 2 \
    +  -draw 'roundrectangle 16, 5, 304, 85 20,40' \( +clone -background snow4 \
    +  -shadow 80x3+3+3 \) +swap -background none -layers merge \( +size -pointsize 90 \
    +  -strokewidth 1 -fill red label:'50 %' -trim +repage \( +clone -background firebrick3 \
    +  -shadow 80x3+3+3 \) +swap -background none -layers merge \) -insert 0 -gravity center \
    +  -append -background white -gravity center -extent 320x200 cylinder_shaded.png
    + +

    In the next sections we dissect the anatomy of the ImageMagick command-line. Hopefully, after carefully reading and better understanding how the command-line works, you should be able to accomplish complex image-processing tasks without resorting to the sometimes daunting program interfaces.

    + +

    See Examples of ImageMagick Usage for additional help when using ImageMagick from the command-line.

    + +

    The Anatomy of the Command-line

    +

    The ImageMagick command-line consists of

    + +
      +
    1. one or more required input filenames.
    2. +
    3. zero, one, or more image settings.
    4. +
    5. zero, one, or more image operators.
    6. +
    7. zero, one, or more image sequence operators.
    8. +
    9. zero, one, or more image stacks.
    10. +
    11. zero or one output image filenames (required by +convert, +composite, +montage, +compare, +import, +conjure). +
    12. +
    + +

    You can find a detailed explanation of each of the constituent parts of the command-line in the sections that follow.

    + +

    Input Filename

    + +

    ImageMagick extends the concept of an input filename to include:

    +
      +
    • filename globbing
    • +
    • an explicit image format
    • +
    • using built-in images and patterns
    • +
    • STDIN, STDOUT, and file descriptors
    • +
    • selecting certain frames from an image
    • +
    • selecting a region of an image
    • +
    • forcing an inline image resize
    • +
    • forcing an inline image crop
    • +
    • using filename references
    • +
    + +

    These extensions are explained in the next few paragraphs.

    + +

    Note, by default, if a command-line option is also a filename (e.g., -quality), it is intrepetted as a filename. Use -define registry:option:pedantic=true to instead interpret it as an option.

    + +

    Filename Globbing

    +

    In Linux shells, certain characters such as the asterisk (*) and question mark (?) automagically cause lists of filenames to be generated based on pattern matches. This feature is known as globbing. ImageMagick supports filename globbing for systems, such as Windows, that does not natively support it. For example, suppose you want to convert 1.jpg, 2.jpg, 3.jpg, 4.jpg, and 5.jpg in your current directory to a GIF animation. You can conveniently refer to all of the JPEG files with this command: +

    + +
    convert *.jpg images.gif
    + +

    Explicit Image Format

    +

    Images are stored in a myriad of image formats including +the better known JPEG, PNG, TIFF and others. ImageMagick must know the format +of the image before it can be read and processed. Most formats have a +signature within the image that uniquely identifies the format. Failing +that, ImageMagick leverages the filename extension to determine the format. +For example, image.jpg or image.JPG tells ImageMagick +it is reading an image in the JPEG format.

    + +

    In some cases the image may not contain a signature +and/or the filename does not identify the image format. In these cases an +explicit image format must be specified. For example, suppose our image +is named image and contains raw red, green, and blue intensity +values. ImageMagick has no way to automagically determine the image format +so we explicitly set one: +

    + +
    convert -size 640x480 -depth 8 rgb:image image.png
    + +

    Built-in Images and Patterns

    + +

    ImageMagick has a number of built-in images and patterns. To utilize the checkerboard pattern, for example, use: +

    + +
    convert -size 640x480 pattern:checkerboard checkerboard.png
    + +

    STDIN, STDOUT, and file descriptors

    +

    Linux and Windows permit the output of one command to be piped to the input of another. ImageMagick permits image data to be read and written from the standard streams STDIN (standard in) and STDOUT (standard out), respectively, using a pseudo-filename of -. In this example we pipe the output of + convert to the display program: +

    + +
    convert logo: gif:- | display gif:-
    + +

    The second explicit format "gif:" is optional in the preceding example. The GIF image format has a unique signature within the image so ImageMagick's display command can readily recognize the format as GIF. The convert program also accepts STDIN as input in this way: +

    + +
    convert rose: gif:- | magick - -resize "200%" bigrose.jpg'
    + +

    Other pipes can be accessed via their file descriptors (as of version 6.4.9-3). The file descriptors 0, 1, and 2 are reserved for the standard streams STDIN, STDOUT, and STDERR, respectively, but a pipe associated with a file descriptor number N>2 can be accessed using the pseudonym fd:N. (The pseudonyms fd:0 and fd:1 can be used for STDIN and STDOUT.) The next example shows how to append image data piped from files with descriptors 3 and 4 and direct the result to the file with descriptor number 5. +

    + +
    convert fd:3 fd:4 -append fd:5
    + +

    When needed, explicit image formats can be given as mentioned earlier, as in the following. +

    + +
    convert gif:fd:3 jpg:fd:4 -append tif:fd:5
    + +

    Selecting Frames

    +

    Some images formats contain more than one image frame. Perhaps you only want the first image, or the last, or some number of images in-between. You can specify which image frames to read by appending the image filename with the frame range enclosed in brackets. Here our image (an animated GIF) contains more than one frame but we only want the first: +

    + +
    convert 'images.gif[0]' image.png
    + +

    Linux shells generally interpret brackets so we enclosed the filename in quotes above. +In a Windows command shell the brackets are not interpreted but using quotes doesn't hurt. However, in most cases the roles of single-quotes and double-quotes are reversed with respect to Linux and Windows, so Windows users should usually try double-quotes where we display single-quotes, and vice versa. +

    + +

    You can read more than one image from a sequence with a frame range. For example, you can extract the first four frames of an image sequence: +

    + +
    convert 'images.gif[0-3]' images.mng
    + +

    The default is to step one frame at a time so frames 0, 1, 2, and 3 are returned. Set the step to 2 with -define frames:step=2 and we instead get frames 0 and 2.

    + +

    Finally, you can read more than one image from a sequence, out-of-order. The next command gets the third image in the sequence, followed by the second, and then the fourth: +

    + +
    convert 'images.gif[3,2,4]' images.mng
    + +

    Notice that in the last two commands, a single image is written. The output in this case, where the image type is MNG, is a multi-frame file because the MNG format supports multiple frames. Had the output format been JPG, which only supports single frames, the output would have consisted of separate frames. More about that below, in the section about the Output Filename. +

    + +

    Selecting an Image Region

    +

    Raw images are a sequence of color intensities without additional meta information such as width, height, or image signature. With raw image formats, you must specify the image width and height but you can also specify a region of the image to read. In our example, the image is in the raw 8-bit RGB format and is 6000 pixels wide and 4000 pixels high. However, we only want a region of 600 by 400 near the center of the image: +

    + +
    convert -size 6000x4000 -depth 8 'rgb:image[600x400+1900+2900]' image.jpg
    + +

    + You can get the same results with the -extract option: +

    + +
    convert -size 6000x4000 -depth 8 -extract 600x400+1900+2900 rgb:image image.jpg
    + +

    Inline Image Resize

    +

    It is sometimes convenient to resize an image as they are read. Suppose you have hundreds of large JPEG images you want to convert to a sequence of PNG thumbails: +

    + +
    convert '*.jpg' -resize 120x120 thumbnail%03d.png
    + +

    Here all the images are read and subsequently +resized. It is faster and less resource intensive to resize each image it +is read: +

    + +
    convert '*.jpg[120x120]' thumbnail%03d.png
    + +

    Inline Image Crop

    +

    It is sometimes convenient to crop an image as they are read. Suppose you have hundreds of large JPEG images you want to convert to a sequence of PNG thumbails: +

    + +
    convert '*.jpg' -crop 120x120+10+5 thumbnail%03d.png
    + +

    Here all the images are read and subsequently cropped. It is faster and less resource-intensive to crop each image as it is read: +

    + +
    convert '*.jpg[120x120+10+5]' thumbnail%03d.png
    + + +

    Filename References

    + +

    There are two methods to use a filename to reference other image filenames. +The first is with '@' which reads image filenames separated by white space from the specified file. Assume the file myimages.txt consists of a list of filenames, like so: +

    + +
    frame001.jpg
    +frame002.jpg
    +frame003.jpg
    + +

    We then expect this command:

    + +
    convert @myimages.txt mymovie.gif
    + +

    to read the images frame001.jpg, frame002.jpg, and frame003.jpg and convert them to a GIF image sequence.

    +

    If the image path includes one or more spaces, enclose the path in quotes:

    +
    'my title.jpg'
    + + +

    Some ImageMagick command-line options may exceed the capabilities of +your command-line processor. Windows, for example, limits command-lines +to 8192 characters. If, for example, you have a draw option with polygon +points that exceed the command-line length limit, put the draw option instead +in a file and reference the file with +the @ (e.g. @mypoly.txt).

    + +

    Another method of referring to other image files is by +embedding a formatting character in the filename with a scene range. Consider +the filename image-%d.jpg[1-5]. The command

    + +
    convert image-%d.jpg[1-5]
    + +

    causes ImageMagick to attempt to read images with these filenames: +

    + +
    image-1.jpg
    +image-2.jpg
    +image-3.jpg
    +image-4.jpg
    +image-5.jpg
    + +

    Stream Buffering

    +

    By default, the input stream is buffered. To ensure information on the source file or terminal is read as soon as its available, set the buffer size to 0:

    + +
    convert logo: gif:- | display -define stream:buffer-size=0 gif:-
    + +

    Command-line Options

    + +

    You can direct the behavior of ImageMagick utilities with these command-line options. The behavior of an option falls into one of these categories:

    + + + +

    Image Setting

    + +

    An image setting persists as it appears on the command-line and may affect +subsequent processing such as reading an image, an image operator, or when +writing an image as appropriate. An image setting stays in effect until it +is reset or the command-line terminates. The image settings include:

    + + + +

    In this example, -channel applies to each of the images, since, as we mentioned, settings persist: +

    + +
    convert -channel RGB wand.png wizard.png images.png
    + +

    Image Operator

    + +

    An image operator differs from a setting in that it affects the image +immediately as it appears on the command-line. An operator is +any command-line option not listed as a +image setting or +image sequence operator. Unlike an +image setting, which persists until the command-line terminates, +an operator is applied to the current image set and forgotten. The image operators include:

    + + + +

    In this example, -negate negates the wand image but not the wizard:

    + +
    convert wand.png -negate wizard.png images.png
    + +

    Image Channel Operator

    +

    Operate directly on image channels:

    + + +

    Image Sequence Operator

    + +

    An image sequence operator differs from a setting in that it affects an +image sequence immediately as it appears on the command-line. Choose from +these image sequence operators:

    + + +

    In this example, -append appends three images into one:

    + +
    convert mikayla.png picnic.png beach.png -append vacation.png
    + +

    Image Geometry

    + +

    Many command-line options take a geometry argument +to specify such things as the desired width and height of an image and other +dimensional quantities. Because users want so many variations on the resulting +dimensions, sizes, and positions of images (and because ImageMagick wants to +provide them), the geometry argument can take many +forms. We describe many of these in this section.

    + +

    The image options and settings that take some form of +a geometry argument include the following. +Keep in mind that some of these parse their arguments in slightly +different ways. See the documentation for the individual option or +setting for more specifics.

    + + + +

    The geometry argument might take any of the forms listed in the table below. These will described in more detail in the subsections following the table. The usual form is size[offset], meaning size is required and offset is optional. Occasionally, [size]offset is possible. In no cases are spaces permitted within the geometry argument.

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sizeGeneral description (actual behavior can vary for different options and settings)
    scale%Height and width both scaled by specified percentage.
    scale-x%xscale-y%Height and width individually scaled by specified percentages. (Only one % symbol needed.)
    widthWidth given, height automagically selected to preserve aspect ratio.
    xheightHeight given, width automagically selected to preserve aspect ratio.
    widthxheightMaximum values of height and width given, aspect ratio preserved.
    widthxheight^Minimum values of width and height given, aspect ratio preserved.
    widthxheight!Width and height emphatically given, original aspect ratio ignored.
    widthxheight>Shrinks an image with dimension(s) larger than the corresponding width and/or height argument(s).
    widthxheight<Enlarges an image with dimension(s) smaller than the corresponding width and/or height argument(s).
    area@Resize image to have specified area in pixels. Aspect ratio is preserved.
    x:yHere x and y denotes an aspect ratio (e.g. 3:2 = 1.5).
    {size}{offset}Specifying the offset (default is +0+0). Below, {size} refers to any of the forms above.
    {size}{+-}x{+-}yHorizontal and vertical offsets x and y, specified in pixels. Signs are required for both. Offsets are affected by -gravity setting. Offsets are not affected by % or other size operators. Note that positive X and Y offsets are in the inward direction towards the center of the image for all -gravity options, except 'center'. For East, +X is left. For South, +Y is up. For SouthEast, +X is left and +Y is up. For center, the normal X and Y directional convention is used (+X is right and +Y is down).
    + + +

    Basic adjustments to width and height; the operators %, ^, and !

    +

    Here, just below, are a few simple examples of geometry, showing how it might be used as an argument to the -resize option. We'll use the internal image logo: for our input image. + +This fine image is 640 pixels wide and 480 pixels high. We say its dimensions are 640x480. When we give dimensions of an image, the width (the horizontal dimension) always precedes the height (the vertical dimension). This will be true when we speak of coordinates or offsets into an image, which will always be x–value followed by y. Just think of your high school algebra classes and the xy–plane. (Well, almost: our y–axis will always go downward!) +

    + +
    convert logo: -resize '200%' bigWiz.png
    +magick logo: -resize '200x50%' longShortWiz.png
    +magick logo: -resize '100x200' notThinWiz.png
    +magick logo: -resize '100x200^' biggerNotThinWiz.png
    +magick logo: -resize '100x200!' dochThinWiz.png
    + +

    The first of the four commands is simple—it stretches both the width and height of the input image by 200% in each direction; it magnifies the whole thing by a factor of two. The second command specifies different percentages for each direction, stretching the width to 200% and squashing the height to 50%. The resulting image (in this example) has dimensions 1280x240. Notice that the percent symbol needn't be repeated; the following are equivalent: 200x50%, 200%x50, 200%x50%. +

    + +

    By default, the width and height given in a geometry argument are maximum values unless a percentage is specified. That is, the image is expanded or contracted to fit the specified width and height value while maintaining the aspect ratio (the ratio of its height to its width) of the image. For instance, the third command above "tries" to set the dimensions to 100x200. Imagine gradually shrinking the original image (which is 640x480), keeping is aspect ratio constant, until it just fits into a 100x200 rectangle. Since the image is longer than it is tall, it will fit when its width shrinks to 100 pixels. To preserve the aspect ratio, the height will therefore have to be (480/640)×100 pixels=75 pixels, so the final dimensions will be 100x75.

    + +

    Notice that in the previous example, at least one of the specified dimensions will be attained (in this case, the width, 100 pixels). The resulting image fits snugly within the original. One can do just the opposite of this by invoking the ^ operator, as in the fourth example above. In that case, when 100x200^ is given as the argument, again at least one of the dimensions will be attained, but in this case the resulting image can snugly contain the original. Here the geometry argument gives minimum values. In our example, the height will become 200 and the width will be scaled to preserve the aspect ratio, becoming (640/480)×200 pixels=267 pixels. With the ^ operator, one of those dimensions will match the requested size, but the image will likely overflow the dimensions requested to preserve its aspect ratio. (The ^ feature is new as of IM 6.3.8-2.)

    + +

    We see that ImageMagick is very good about preserving aspect ratios of images, to prevent distortion of your favorite photos and images. But you might really want the dimensions to be 100x200, thereby stretching the image. In this case just tell ImageMagick you really mean it (!) by appending an exclamation operator to the geometry. This will force the image size to exactly what you specify. So, for example, if you specify 100x200! the dimensions will become exactly 100x200 (giving a small, vertically elongated wizard).

    + +

    Bounding the width, height, and area; the operators >, <, and @

    +

    +Here are a few more examples: +

    + +
    convert logo: -resize '100' wiz1.png
    +magick logo: -resize 'x200' wiz2.png
    +magick logo: -resize '100x200>' wiz3.png
    +magick logo: -resize '100x200<' wiz4.png
    + +

    If only one dimension is given it is taken to be the width. When only the width is specified, as in the first example above, the width is accepted as given and the height is chosen to maintain the aspect ratio of the input image. Similarly, if only the height is specified, as in the second example above, the height is accepted and the width is chosen to maintain the aspect ratio.

    + + +

    Use > to shrink an image only if its dimension(s) are larger than the corresponding width and/or height arguments. Use < to enlarge an image only if its dimension(s) are smaller than the corresponding width and/or height arguments. In either case, if a change is made, the result is as if the > or < operator was not present. So, in the third example above, we specified 100x200> and the original image size is 640x480, so the image size is reduced as if we had specified 100x200. However, in the fourth example above, there will be no change to its size.

    + +

    Finally, use @ to specify the maximum area in pixels of an image, again while attempting to preserve aspect ratio. (Pixels take only integer values, so some approximation is always at work.) In the following example, an area of 10000 pixels is requested. The resulting file has dimensions 115x86, which has 9890 pixels.

    + +
    convert logo: -resize '10000@' wiz10000.png
    + +

    In all the examples above and below, we have enclosed the geometry arguments within quotation marks. Doing so is optional in many cases, but not always. We must enclose the geometry specifications in quotation marks when using < or > to prevent these characters from being interpreted by the shell as file redirection. On Windows systems, the carat ^ needs to be within quotes, else it is ignored. To be safe, one should probably maintain a habit of enclosing all geometry arguments in quotes, as we have here. +

    + +

    Offsets in geometry

    +

    +Here are some examples to illustrate the use of offsets in geometry arguments. One typical use of offsets is in conjunction with the +-region option. This option allows many other options to modify the pixels within a specified rectangular subregion of an image. As such, it needs to be given the width and height of that region, and also an offset into the image, which is a pair of coordinates that indicate the location of the region within the larger image. Below, in the first example, we specify a region of size 100x200 to be located at the xy–coordinates x=10, y=20. Let's use the usual algebraic notation (x,y)=(10,20), for convenience. +

    + +
    convert logo: -region '100x200+10+20' -negate wizNeg1.png
    +magick logo: -region '100x200-10+20' -negate wizNeg2.png
    +magick logo: -gravity center -region '100x200-10+20' -negate wizNeg3.png
    + +

    Note that offsets always require +/− signs. The offset is not actually a true location within the image; its coordinates must be added to some other location. Let's refer to that as the current location. In the first two examples above, though, that location is the upper-left hand corner of the image, which has coordinates (0,0). (That is the default situation when there are no other directives given to change it.) The first example above puts the 100x200 rectangle's own upper-left corner at (10,20).

    + +

    A negative offset can make sense in many cases. In the second example above, the offset is (-10,20), specified by -10+20. In that case, only the portion of the (virtual) rectangle obtained that lies within the image can be negated; here it is equivalent to specifying the geometry as 90x200+0+20.

    + +

    In the third example above, the -gravity setting precedes the others and sets the current location within the image at the very center of the image. In this case that is at pixel (320,240), since the size of the image is 640x480. This means that the offsets apply to that location, which thereby gets moved, in this case, to (320-10,240+20)=(310,260). But the 100x200 region itself is affected by the -gravity setting, so instead of affecting its upper-left corner, the region's own center (at (+50,+100) within it) is determined. Therefore the center of the 100x200 rectangle is moved to (310,260). The negated rectangle's upper-left corner is now at (310-50,260-100)=(260,160). +

    + + +

    Image Stack

    + +

    In school, your teacher probably permitted you to work on problems on a scrap of paper and then copy the results to your test paper. An image stack is similar. It permits you to work on an image or image sequence in isolation and subsequently introduce the results back into the command-line. The image stack is delineated with parenthesis. Image operators only affect images in the current stack. For example, we can limit the image rotation to just the wizard image like this:

    + +
    convert wand.gif \( wizard.gif -rotate 30 \) +append images.gif
    + + +

    Notice again that the parentheses are escaped by preceding them with +backslashes. This is required under Linux, where parentheses are special +shell characters. The backslash tells the shell not to interpret +these characters, but to pass them directly to the command being executed. Do +not escape the parentheses under Windows. Each parenthesis (or escaped +parenthesis) must have spaces on either side, as in the example shown +above.

    + +

    In addition to the image operators already discussed, the following image operators are most useful when processing images in an image stack:

    + + + +

    The arguments to these operators are indexes into the image sequence by number, starting with zero, for the first image, and so on. However if you give a negative index, the images are indexed from the end (last image added). That is, an index of -1 is the last image in the current image sequence, -2 gives the second-to-last, and so on.

    + +

    Output Filename

    + +

    ImageMagick extends the concept of an output filename to include:

    + +
      +
    1. an explicit image format
    2. +
    3. write to standard out
    4. +
    5. filename references
    6. +
    + +

    Each of these extensions are explained in the next few paragraphs.

    + +

    Explicit Image Format

    +

    Images can be stored in a myriad of image formats including the better known JPEG, PNG, TIFF and others. ImageMagick must know the desired format of the image before it is written. ImageMagick leverages the filename extension to determine the format. For example, image.jpg tells ImageMagick to write the image in the JPEG format. In some cases the filename does not identify the image format. In these cases, the image is written in the format it was originally read unless an explicit image format is specified. For example, suppose we want to write our image to a filename of image in the raw red, green, and blue intensity format: +

    + +
    convert image.jpg rgb:image
    + + +

    Standard Out

    +

    Linux permits the output of one command to be piped to another. ImageMagick permits piping one command to another with a filename of -. In this example we pipe the output of convert to the display program: +

    + +
    convert logo: gif:- | display gif:-
    + +

    Here the explicit format is optional. The GIF image format has a signature that uniquely identifies it so ImageMagick can readily recognize the format as GIF.

    + +

    Filename References

    +

    Optionally, use an embedded formatting character to write a sequential image list. Suppose our output filename is image-%d.jpg and our image list includes 3 images. You can expect these images files to be written: +

    + +
    image-0.jpg
    +image-1.jpg
    +image-2.jpg
    + +

    Or retrieve image properties to modify the image filename. For example, the command +

    + +
    convert rose: -set filename:area '%wx%h' 'rose-%[filename:area].png'
    + +

    writes an image with this filename: +

    + +
    rose-70x46.png
    + +

    Finally to convert multiple JPEG images to individual PDF pages, use:

    + +
    convert *.jpg +adjoin page-%d.pdf
    + +

    Use -define filename:literal=true to bypass interpretting embedded formatting characters and instead use the filename literally.

    + +

    Stream Buffering

    + +

    By default, the output stream is buffered. To ensure information appears on the destination file or terminal as soon as written, set the buffer size to 0:

    + +
    convert -define stream:buffer-size=0 logo: gif:- | display gif:-
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/command-line-tools.html b/ImageMagick-6.9.12-44/www/command-line-tools.html new file mode 100644 index 0000000..0e2371f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/command-line-tools.html @@ -0,0 +1,145 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Command-line Tools

    +

    ImageMagick includes a number of command-line utilities for manipulating images. Most of you are probably accustomed to editing images one at a time with a graphical user interface (GUI) with such programs as Gimp or Photoshop. However, a GUI is not always convenient. Suppose you want to process an image dynamically from a web script or you want to apply the same operations to many images or repeat a specific operation at different times to the same or different image. For these types of operations, the command-line image processing utility is appropriate.

    + +

    The ImageMagick command-line tools exit with a status of 0 if the command line arguments have a proper syntax and no problems are encountered. Expect a descriptive message and an exit status of 1 if any exception occurs such as improper syntax, a problem reading or writing an image, or any other problem that prevents the command from completing successfully.

    + +

    Here is a short description for each command-line tool. Click on the program name to get details about the program usage and a list of command-line options that alters how the program behaves. If you are just getting acquainted with ImageMagick, start with the convert program. Be sure to peruse Anthony Thyssen's tutorial on how to use ImageMagick utilities to create, edit, compose, or convert images from the command-line.

    + +
    +
    animate
    animate an image sequence on any X server.
    +
    compare
    mathematically and visually annotate the difference between an image and its reconstruction.
    +
    composite
    overlap one image over another.
    +
    conjure
    interpret and execute scripts written in the Magick Scripting Language (MSL).
    +
    convert
    convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more.
    +
    display
    display an image or image sequence on any X server.
    +
    identify
    describe the format and characteristics of one or more image files.
    +
    import
    save any visible window on an X server and outputs it as an image file. You can capture a single window, the entire screen, or any rectangular portion of the screen.
    +
    convert
    convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more.
    +
    magick-script
    use this scripting language convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more.
    +
    mogrify
    resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. Mogrify overwrites the original image file, whereas, convert writes to a different image file.
    +
    montage
    create a composite image by combining several separate images. The images are tiled on the composite image optionally adorned with a border, frame, image name, and more.
    +
    stream
    a lightweight tool to stream one or more pixel components of the image or portion of the image to your choice of storage formats. It writes the pixel components as they are read from the input image a row at a time making stream desirable when working with large images or when you require raw pixel components.
    +
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/compare.html b/ImageMagick-6.9.12-44/www/compare.html new file mode 100644 index 0000000..6477ebd --- /dev/null +++ b/ImageMagick-6.9.12-44/www/compare.html @@ -0,0 +1,476 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Compare + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Image Simularity Comparison

    +

    Example UsageOption Summary

    + +

    Use the compare program to mathematically and visually annotate the difference between an image and its reconstruction. See Command Line Processing for advice on how to structure your compare command or see below for example usages of the command.

    + +

    Example Usage

    + +

    We list a few examples of the compare command here to illustrate its usefulness and ease of use. To get started, lets compare an image to one thats been sharpened:

    + +
    convert rose.jpg -sharpen 0x1 reconstruct.jpg
    +compare rose.jpg reconstruct.jpg difference.png
    +compare -compose src rose.jpg reconstruct.jpg difference.png
    +
    + +
      + rose + rose + ==> + rose +
    + +

    The red areas of the difference image emphasizes (highlight) pixels that are affected by the image sharpening, whereas white de-emphasizes (lowlight) pixels that are untouched by the sharpening process.

    + +

    In addition to the visual interpretation of the difference in an image and its reconstruction, we report a mathematical measure of the difference:

    + +
    -> compare -verbose -metric mae rose.jpg reconstruct.jpg difference.png
    +Image: rose.jpg
    + Channel distortion: MAE
    +  red: 2282.91 (0.034835)
    +  green: 1853.99 (0.0282901)
    +  blue: 2008.67 (0.0306503)
    +  all: 1536.39 (0.0234439)
    +
    +

    Or, if you just want the red channel distortion, use this command:

    + +
    -> compare -channel red -metric PSNR rose.jpg reconstruct.jpg difference.png
    +19.63
    +
    + +

    If your image contains an alpha channel (transparency) you need to explicitly include it in the comparison:

    + +
    -> compare -channel rgba -metric PSNR rose.jpg reconstruct.jpg difference.png
    +19.63
    +
    + +

    If you just want the overall image distortion, use this command:

    + +
    -> compare -metric PSNR rose.jpg reconstruct.jpg difference.png
    +28.31
    +
    + +

    If the reconstructed image is a subimage of the image, the compare program returns the best match offset. In addition, it returns a similarity image such that an exact match location is completely white and if none of the pixels match, black, otherwise some gray level in-between:

    + +
    -> compare -metric RMSE -subimage-search logo.png wizard.jpg similarity.tif
    +85.05 (0.00129778) @ 353,157
    +
    + +

    You can find additional examples of using compare in Graphics from the Command Line. Further discussion is available in More Graphics from the Command Line and Examples of ImageMagick Usage.

    + +

    Two images are considered similar if their difference according to the specified metric and fuzz value is 0, with the exception of the normalized cross correlation metric (NCC), where two images are considered similar when their normalized cross correlation is 1. The default metric is NCC.

    + +

    The compare program returns 2 on error, 0 if the images are similar, or a value between 0 and 1 if they are not similar.

    + +

    Option Summary

    + +

    The compare command recognizes these options. Click on an option to get more details about how that option works.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    -alphaon, activate, off, deactivate, set, opaque, copy", +transparent, extract, background, or shape the alpha channel
    -authenticate valuedecrypt image with this password
    -background colorbackground color
    -brightness-contrast geometryimprove brightness / contrast of the image
    -channel typeapply option to select image channels
    -colorspace typeset image colorspace
    -compose operatorset image composite operator
    -crop geometrycrop the image
    -decipher filenameconvert cipher pixels to plain
    -debug eventsdisplay copious debugging information
    -define format:optiondefine one or more image format options
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -dissimilarity-threshold valuemaximum distortion for (sub)image match (default 0.2)
    -distort type coefficientsdistort image
    -encipher filenameconvert plain pixels to cipher pixels
    -extract geometryextract area from image
    -fuzz distancecolors within this distance are considered equal
    -gravity typehorizontal and vertical text placement
    -helpprint program options
    -highlight-color coloremphasize pixel differences with this color
    -identifyidentify the format and characteristics of the image
    -interlace typetype of image interlacing scheme
    -level valueadjust the level of image contrast
    -limit type valuepixel cache resource limit
    -log formatformat of debugging information
    -lowlight-color colorde-emphasize pixel differences with this color
    -metric typemeasure differences between images with this metric
    -negatereplace each pixel with its complementary color
    -profile filenameadd, delete, or apply an image profile
    -quality valueJPEG/MIFF/PNG compression level
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -read-mask filenameassociate a read mask with the image
    -regard-warningspay attention to warning messages.
    -repage geometrysize and location of an image canvas
    -resize geometryresize the image
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -rotate degreesapply Paeth rotation to the image
    -sampling-factor geometryhorizontal and vertical sampling factor
    -seed valueseed a new sequence of pseudo-random numbers
    -separateseparate an image channel into a grayscale image
    -set attribute valueset an image attribute
    -sigmoidal-contrast geometryincrease the contrast without saturating highlights or shadows
    -similarity-threshold valueminimum distortion for (sub)image match (default 0.0)
    -size geometrywidth and height of image
    -subimage-searchsearch for subimage
    -synchronizesynchronize image to storage device
    -taintmark the image as modified
    -transparent-color colortransparent color
    -trimtrim image edges
    -verboseprint detailed information about the image
    -versionprint version information
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    -read-mask filenameassociate a write mask with the image
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/compose.html b/ImageMagick-6.9.12-44/www/compose.html new file mode 100644 index 0000000..e13ddce --- /dev/null +++ b/ImageMagick-6.9.12-44/www/compose.html @@ -0,0 +1,691 @@ + + + + + + + + + + ImageMagick (legacy) – Alpha Compositing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    + +

    This page descibed the Image composition methods that is used to define how +two images should be merged together in various image operations. For the +Command Line API it is typically set using the -compose setting option.

    + + +

    The description of composition uses abstract terminology in order to allow +the description to be more precise, while avoiding constant values which are +specific to a particular build configuration. Each image pixel is represented +by red, green, and blue levels (which are equal for a gray pixel). The +build-dependent value QuantumRange is the maximum integral +value which may be stored, per pixel, in the red, green, or blue channels of +the image. Each image pixel may also optionally (if the image matte channel is +enabled) have an associated level of opacity, ranging from opaque to +transparent, which may be used to determine the influence of the pixel +color when compositing the pixel with another image pixel. If the image matte +channel is disabled, then all pixels in the image are treated as opaque. The +color of an opaque pixel is fully visible while the color of a transparent +pixel color is entirely absent (pixel color is ignored).

    + +

    By definition, raster images have a rectangular shape. All image rows are of +equal length, as are all image columns. By treating the alpha channel as a +visual "mask" the rectangular image may be given a "shape" by treating the +alpha channel as a cookie-cutter for the image. This is done by setting the +pixels within the shape to be opaque, with pixels outside the shape set as +transparent. Pixels on the boundary of the shape may be between opaque and +transparent in order to provide antialiasing (visually smooth edges). The +description of the composition operators use this concept of image "shape" in +order to make the description of the operators easier to understand. While it +is convenient to describe the operators in terms of "shapes" they are by no +means limited to mask-style operations since they are based on continuous +floating-point mathematics rather than simple boolean operations.

    + +

    The following alpha blending (Duff-Porter) compose methods are available:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDescription
    clearBoth the color and the alpha of the destination are + cleared. Neither the source nor the destination are used (except for + destinations size and other meta-data which is always preserved.
    srcThe source is copied to the destination. The destination + is not used as input, though it is cleared.
    dstThe destination is left untouched. The source image is + completely ignored.
    src-overThe source is composited over the destination. this is + the default alpha blending compose method, when neither the compose + setting is set, nor is set in the image meta-data.
    dst-overThe destination is composited over the source and the + result replaces the destination.
    src-inThe part of the source lying inside of the destination + replaces the destination.
    dst-inThe part of the destination lying inside of the source + replaces the destination. Areas not overlaid are cleared.
    src-outThe part of the source lying outside of the destination + replaces the destination.
    dst-outThe part of the destination lying outside of the source + replaces the destination.
    src-atopThe part of the source lying inside of the destination is + composited onto the destination.
    dst-atopThe part of the destination lying inside of the source is + composited over the source and replaces the destination. Areas not + overlaid are cleared.
    xorThe part of the source that lies outside of the + destination is combined with the part of the destination that lies + outside of the source. Source or Destination, but not both.
    + +

    Any of the 'Src-*' methods can also be specified without the 'Src-' part. +For example the default compose method can be specified as just 'Over'.

    + +

    Many of these compose methods will clear the destination image which was +not overlaid by the source image. This is to be expected as part of that +specific composition methods defintion. You can disable this by setting the +special -define 'compose:outside-overlay' to a value of 'false' will turn off +this behavior.

    + +

    On top of the above 12 Duff-Porter Alpha Composition methods, one special +related method 'Copy' has been provided. This is equivalent to +using the 'Src' with the special -define option 'compose:outside-overlay' set to +'false', so as to only modify the overlaid area, without clearing +the rest of the image outside the overlaid area.

    + +

    The following mathematical composition methods are also available.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDescription
    multiplyThe source is multiplied by the destination and replaces + the destination. The resultant color is always at least as dark as + either of the two constituent colors. Multiplying any color with black + produces black. Multiplying any color with white leaves the original + color unchanged.
    screenThe source and destination are complemented and then + multiplied and then replace the destination. The resultant color is + always at least as light as either of the two constituent colors. + Screening any color with white produces white. Screening any color + with black leaves the original color unchanged.
    plusThe source is added to the destination and replaces the + destination. This operator is useful for averaging or a controlled + merger of two images, rather than a direct overlay.
    addAs per 'plus' but transparency data is treated as matte + values. As such any transparent areas in either image remain + transparent.
    minusSubtract the colors in the source image from the + destination image. When transparency is involved, opaque areas is + subtracted from any destination opaque areas.
    subtractSubtract the colors in the source image from the + destination image. When transparency is involved transparent areas are + subtracted, so only the opaque areas in the source remain opaque in + the destination image.
    differenceSubtracts the darker of the two constituent colors from + the lighter. Painting with white inverts the destination color. + Painting with black produces no change.
    exclusionProduces an effect similar to that of 'difference', but + appears as lower contrast. Painting with white inverts the + destination color. Painting with black produces no change.
    darkenSelects the darker of the destination and source colors. + The destination is replaced with the source when the source is darker, + otherwise it is left unchanged.
    lightenSelects the lighter of the destination and source colors. + The destination is replaced with the source when the source is + lighter, otherwise it is left unchanged.
    + +

    Typically these use the default 'Over' alpha blending when transparencies +are also involved, except for 'Plus' which uses a 'plus' alpha blending. This +means the alpha channel of both images will only be used to ensure that any +visible input remains visible even in parts not overlaid. It also means that +any values are weighted by the alpha channel of the input and output images. +This 'Over' alpha blending is also applied to the lighting composition methods +below.

    + +

    As of IM v6.6.1-6, if the special 'Sync' flag is not specified +(enabled by default) with the -channel setting, then the above mathematical compositions no longer +synchronise its actions with the alpha channel. Instead the math composition +will be applied on an individual channel basis as defined by the -channel. This includes the alpha channel. This special usage +allows you to perform true mathematics of the image channels, without alpha +composition effects, becoming involved.

    + +

    This special flag is not applied to the lighting composition methods (see +below) even though they are closely related to mathematical composition +methods.

    + +

    The following lighting composition methods are also available.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDescription
    linear-dodgeThis is equivalent to 'Plus' in that the color channels + are simply added, however it does not 'Plus' the alpha channel, but + uses the normal 'Over' alpha blending, which transparencies are + involved. Produces a sort of additive multiply-like result. Added + ImageMagick version 6.5.4-3.
    linear-burnAs 'Linear-Dodge', but also subtract one from the result. + Sort of a additive 'Screen' of the images. Added ImageMagick version + 6.5.4-3.
    color-dodgeBrightens the destination color to reflect the source + color. Painting with black produces no change.
    color-burnDarkens the destination color to reflect the source + color. Painting with white produces no change. Fixed in ImageMagick + version 6.5.4-3.
    overlayMultiplies or screens the colors, dependent on the + destination color. Source colors overlay the destination whilst + preserving its highlights and shadows. The destination color is not + replaced, but is mixed with the source color to reflect the lightness + or darkness of the destination.
    hard-lightMultiplies or screens the colors, dependent on the source + color value. If the source color is lighter than 0.5, the destination + is lightened as if it were screened. If the source color is darker + than 0.5, the destination is darkened, as if it were multiplied. The + degree of lightening or darkening is proportional to the difference + between the source color and 0.5. If it is equal to 0.5 the + destination is unchanged. Painting with pure black or white produces + black or white.
    linear-lightLike 'Hard-Light' but using linear-dodge and linear-burn + instead. Increases contrast slightly with an impact on the + foreground's tonal values.
    soft-lightDarkens or lightens the colors, dependent on the source + color value. If the source color is lighter than 0.5, the destination + is lightened. If the source color is darker than 0.5, the destination + is darkened, as if it were burned in. The degree of darkening or + lightening is proportional to the difference between the source color + and 0.5. If it is equal to 0.5, the destination is unchanged. Painting + with pure black or white produces a distinctly darker or lighter area, + but does not result in pure black or white. Fixed in ImageMagick + version 6.5.4-3.
    pegtop-lightAlmost equivalent to 'Soft-Light', but using a + continuous mathematical formula rather than two conditionally + selected formulae. Added ImageMagick version 6.5.4-3.
    vivid-lightA modified 'Linear-Light' designed to preserve very stong + primary and secondary colors in the image. Added ImageMagick version + 6.5.4-3.
    pin-lightSimilar to 'Hard-Light', but using sharp linear shadings, + to simulate the effects of a strong 'pinhole' light source. Added + ImageMagick version 6.5.4-3.
    + +

    Also included are these special purpose compose methods:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDescription
    copyThis is equivalent to the Duff-Porter composition method + 'Src,' but without clearing the parts of the destination + image that is not overlaid.
    copy-*Copy the specified channel (Red, Green, Blue, Cyan, + Magenta, Yellow, Black, or Opacity) in the source image to the + same channel in the destination image. If the channel specified + does not exist in the source image, (which can only happen for methods, + 'copy-opacity' or 'copy-black') then it is + assumed that the source image is a special grayscale channel image + of the values that is to be copied.
    change-maskReplace any destination pixel that is the similar to the + source images pixel (as defined by the current -fuzz factor), with transparency. +
    stereocreate a stereo anaglyph
    + +

    On top of these composed methods are a few special ones that not only require +the two images that are being merged or overlaid, but have some extra numerical +arguments, which are tabled below.

    + +

    In the "composite" command these composition methods are +selected using special options with the arguments needed. They are usually, +but not always, the same name as the composite 'method' they use, and replaces +the normal use of the -compose +setting in the "composite" command. For example...

    + +
    composite ... -blend 50x50 ...
    +
    + +

    As of IM v6.5.3-4 the "convert" command can now also supply +these extra arguments to its -composite operator, using the special -define +attribute of 'compose:args'. This means you can now +make use of these special augmented -compose methods, those the argument and the method both need to be set +separately. For example...

    + +
    convert ... -compose blend  -define compose:args=50,50 -composite ...
    +
    + +

    The following is a table of these special 'argumented' compose methods, +with a brief summary of what they do. For more details see the equivalent +"composite" command option name.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDescription
    dissolveArguments: + src_percent[xdst_percent] +
    Equivalent to "composite" -dissolve +
    Dissolve the 'source' image by the percentage given before overlaying + 'over' the 'destination' image. If src_percent is + greater than 100, it starts dissolving the main image so it will + become transparent at a value of '200'. If + both percentages are given, each image are dissolved to the + percentages given. +
    blendArguments: + src_percent[xdst_percent] +
    Equivalent to "composite" -blend +
    Average the images together ('plus') according to the percentages + given and each pixels transparency. If only a single percentage value + is given it sets the weight of the composite or 'source' image, while + the background image is weighted by the exact opposite amount. That is + a -blend 30 merges 30% of the 'source' image with 70% of + the 'destination' image. Thus it is equivalent to -blend + 30x70. +
    mathematicsArguments: A, B, C, D +
    Not available in "composite" at this time. +
    Merge the source and destination images according to the formula +
    A*Sc*Dc + B*Sc + C*Dc + D +
    Can be used to generate a custom composition method that would + otherwise need to be implemented using the slow -fx DIY image operator. Added + to ImageMagick version 6.5.4-3. +
    As of IM v6.6.1-6 this method will do per-channel math compositions + if the 'Sync' flag is removed from -channel, just like all + the other mathematical composition methods above. +
    modulateArguments: + brightness[xsaturation] +
    Equivalent to "composite" -watermark +
    Take a grayscale image (with alpha mask) and modify the destination + image's brightness according to watermark image's grayscale value and + the brightness percentage. The destinations + color saturation attribute is just direct modified by the saturation percentage, which defaults to 100 percent + (no color change). + +
    displaceArguments: + X-scale[xY-scale][!][%] +
    Equivalent to "composite" -displace +
    With this option, the 'overlay' image, and optionally the 'mask' + image, is used as a relative displacement map, which is used to + displace the lookup of what part of the destination image is seen at + each point of the overlaid area. Much like the displacement map is a + 'lens' that distorts the original 'background' image behind it. +

    + The X-scale is modulated by the 'red' channel of the overlay image + while the Y-scale is modulated by the green channel, (the mask image + if given is rolled into green channel of the overlay image. This + separation allows you to modulate the X and Y lookup displacement + separately allowing you to do 2-dimensional displacements, rather + than 1-dimensional vectored displacements (using grayscale image). +

    + If the overlay image contains transparency this is used as a mask + of the resulting image to remove 'invalid' pixels. +

    + The '%' flag makes the displacement scale relative to the size of the + overlay image (100% = half width/height of image). Using '!' switches + percentage arguments to refer to the destination image size instead. +

    + Special flags were added Added to ImageMagick version 6.5.3-5. +
    distortArguments: + X-scale[xY-scale[+X-center+Y-center]][!][%] +
    Not available in "composite" at this time. +
    Exactly as per 'Displace' (above), but using absolute coordinates, + relative to the center of the overlay (or that given). Basically + allows you to generate absolute distortion maps where 'black' will + look up the left/top edge, and 'white' looks up the bottom/right + edge of the destination image, according to the scale given. +

    + The '!' flag not only switches percentage scaling, to use the + destination image, but also the image the center offset of the lookup. + This means the overlay can lookup a completely different region of the + destination image. +

    + Added to ImageMagick version 6.5.3-5. +
    blurArguments: + Width[xHeight[+Angle][+Angle2]] +
    Equivalent to "composite" -blur +
    A Variable Blur Mapping Composition method, where each pixel in the + overlaid region is replaced with an Elliptical Weighted Average (EWA), + with an ellipse (typically a circle) of the given sigma size, scaled + according to overlay (source image) grayscale mapping. +

    + As per 'Displace' and 'Distort', the red channel will modulate the + width of the ellipse, while the green channel will modulate the height + of the ellipse. If a single Angle value is given in the arguments, + then the ellipse will then be rotated by the angle specified. +

    + Normally the blue channel of the mapping overlay image is ignored. + However if a second ellipse angle is given, then it is assumed that + the blue channel defines a variable angle for the ellipse ranging from + the first angle to the second angle given. This allows to generate + radial blurs, or a rough approximation for rotational blur. Or any mix + of the two. +

    + Added to ImageMagick version 6.5.4-0. +
    + +

    To print a complete list of all the available compose operators, use -list compose.

    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/composite.html b/ImageMagick-6.9.12-44/www/composite.html new file mode 100644 index 0000000..04af04a --- /dev/null +++ b/ImageMagick-6.9.12-44/www/composite.html @@ -0,0 +1,570 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Composite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Overlap One Image over Another

    +

    Example UsageOption Summary

    + +

    Use the composite program to overlap one image over another. See Command Line Processing for advice on how to structure your composite command or see below for example usages of the command.

    + +

    Example Usage

    + +

    We list a few examples of the composite command here to illustrate its usefulness and ease of use. To get started, lets overlay a smiley face over a rose:

    + +
    composite -gravity center smile.gif  rose: rose-over.png
    +
    + +
      + smile + over + rose + ==> + rose +
    + +

    You can create three-dimensional effect with the Atop:

    + +
    convert -size 70x70 canvas:none -fill red -draw 'circle 35,35 10,30' red-circle.png
    +convert -size 70x70 canvas:none -draw 'circle 35,35 35,20' -negate \
    +-channel A -gaussian-blur 0x8 white-highlight.png
    +composite -compose atop -geometry -13-17 white-highlight.png red-circle.png red-ball.png
    +
    + +
      + white highlight + atop + red circle + ==> + red ball +
    + +

    You can find additional examples of using composite in Examples of ImageMagick Usage. You can find out more about them and the mathematics by looking at SVG Alpha Compositing

    + +

    Option Summary

    + +

    The composite command recognizes these options. Click on an option to get more details about how that option works.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    -affine matrixaffine transform matrix
    -alphaon, activate, off, deactivate, set, opaque, copy", +transparent, extract, background, or shape the alpha channel
    -authenticate valuedecrypt image with this password
    -blend geometryblend images
    -blue-primary pointchromaticity blue primary point
    -border geometrysurround image with a border of color
    -bordercolor colorborder color
    -channel typeapply option to select image channels
    -colors valuepreferred number of colors in the image
    -colorspace typeset image colorspace
    -comment stringannotate image with comment
    -compose operatorset image composite operator
    -compress typeimage compression type
    -debug eventsdisplay copious debugging information
    -decipher filenameconvert cipher pixels to plain
    -define format:optiondefine one or more image format options
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -displace geometryshift image pixels defined by a displacement map
    -dissolve valuedissolve the two images a given percent
    -dither methodapply error diffusion to image
    -encipher filenameconvert plain pixels to cipher pixels
    -encoding typetext encoding type
    -endian typeendianness (MSB or LSB) of the image
    -extract geometryextract area from image
    -filter typeuse this filter when resizing an image
    -font namerender text with this font
    -geometry geometrypreferred size or location of the image
    -gravity typehorizontal and vertical text placement
    -green-primary pointchromaticity green primary point
    -helpprint program options
    -identifyidentify the format and characteristics of the image
    -interlace typetype of image interlacing scheme
    -interpolate methodpixel color interpolation method
    -label stringassign a label to an image
    -level valueadjust the level of image contrast
    -limit type valuepixel cache resource limit
    -log formatformat of debugging information
    -monitormonitor progress
    -monochrometransform image to black and white
    -negatereplace each pixel with its complementary color
    -page geometrysize and location of an image canvas (setting)
    -pointsize valuefont point size
    -profile filenameadd, delete, or apply an image profile
    -quality valueJPEG/MIFF/PNG compression level
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -red-primary pointchromaticity red primary point
    -regard-warningspay attention to warning messages.
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -rotate degreesapply Paeth rotation to the image
    -sampling-factor geometryhorizontal and vertical sampling factor
    -scene valueimage scene number
    -seed valueseed a new sequence of pseudo-random numbers
    -set attribute valueset an image attribute
    -sharpen geometrysharpen the image
    -shave geometryshave pixels from the image edges
    -size geometrywidth and height of image
    -stegano offsethide watermark within an image
    -stereo geometrycombine two image to create a stereo anaglyph
    -stripstrip image of all profiles and comments
    -swap indexesswap two images in the image sequence
    -synchronizesynchronize image to storage device
    -taintmark the image as modified
    -thumbnail geometrycreate a thumbnail of the image
    -tilerepeat composite operation across and down image
    -transformaffine transform image
    -transparent-color colortransparent color
    -treedepth valuecolor tree depth
    -type typeimage type
    -units typethe units of image resolution
    -unsharp geometrysharpen the image
    -verboseprint detailed information about the image
    -versionprint version information
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    -watermark geometrypercent brightness and saturation of a watermark
    -white-point pointchromaticity white point
    -white-threshold valueforce all pixels above the threshold into white
    -write filenamewrite images to this file
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/conjure.html b/ImageMagick-6.9.12-44/www/conjure.html new file mode 100644 index 0000000..bce34fa --- /dev/null +++ b/ImageMagick-6.9.12-44/www/conjure.html @@ -0,0 +1,1183 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Conjure + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Example UsageOption SummaryMagick Scripting Language (MSL)

    + +

    The conjure program gives you the ability to perform custom image processing tasks from a script written in the Magick Scripting Language (MSL). MSL is XML-based and consists of action statements with attributes. Actions include reading an image, processing an image, getting attributes from an image, writing an image, and more. An attribute is a key/value pair that modifies the behavior of an action. See Command Line Processing for advice on how to structure your conjure command or see below for example usages of the command.

    + +

    Example Usage

    + +

    We list a few examples of the conjure command here to illustrate its usefulness and ease of use. To get started, here is simple conjure command:

    + +
    conjure -dimensions 400x400 msl:incantation.msl
    +
    + +

    The MSL script incantation.msl used above is here:

    + +
    <?xml version="1.0" encoding="UTF-8"?>
    +<image>
    +  <read filename="image.gif" />
    +  <get width="base-width" height="base-height" />
    +  <resize geometry="%[dimensions]" />
    +  <get width="resize-width" height="resize-height" />
    +  <print output="Image sized from %[base-width]x%[base-height] to %[resize-width]x%[resize-height].\n" />
    +  <write filename="image.png" />
    +</image>
    +
    + +

    In this example, a family stayed home for their vacation but as far as their friends are concerned they went to a beautiful beach in the Caribbean:

    + +
    <?xml version="1.0" encoding="UTF-8"?>
    +<group>
    +    <image id="family">
    +        <read filename="family.gif"/>
    +        <resize geometry="300x300"/>
    +    </image>
    +    <image id="palm-trees">
    +        <read filename="palm-trees.gif"/>
    +        <resize geometry="300x100"/>
    +    </image>
    +    <image>
    +        <read filename="beach.jpg"/>
    +        <composite image="family" geometry="+30+40"/>
    +        <composite image="palm-trees" geometry="+320+90"/>
    +    </image>
    +    <write filename="family-vacation.png"/>
    +</group>
    +
    + +

    Here we display the width in pixels of text for a particular font and pointsize.

    + +
    <?xml version="1.0" encoding="UTF-8"?>
    +<image>
    +  <query-font-metrics text="ImageMagick" font="helvetica" pointsize="48" />
    +  <print output="Text width is %[msl:font-metrics.width] pixels.\n" />
    +</image>
    +
    + +

    The query-font-metrics tag supports these properties:

    + +
    msl:font-metrics.pixels_per_em.x
    +msl:font-metrics.pixels_per_em.y
    +msl:font-metrics.ascent
    +msl:font-metrics.descent
    +msl:font-metrics.width
    +msl:font-metrics.height
    +msl:font-metrics.max_advance
    +msl:font-metrics.bounds.x1
    +msl:font-metrics.bounds.y1
    +msl:font-metrics.bounds.x2
    +msl:font-metrics.bounds.y2
    +msl:font-metrics.origin.x
    +msl:font-metrics.origin.y
    +
    + +

    MSL supports most methods and attributes discussed in the Perl API for ImageMagick. +

    + +

    In addition, MSL supports the swap element with a single indexes element.

    + +

    You can find additional examples of using conjure in Graphics from the Command Line. Further discussion is available in More Graphics from the Command Line and Examples of ImageMagick Usage.

    + + +

    Option Summary

    + +

    The conjure command recognizes these options. Click on an option to get more details about how that option works.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    -debug eventsdisplay copious debugging information
    -helpprint program options
    -log formatformat of debugging information
    -monitormonitor progress
    -quietsuppress all warning messages
    -regard-warningspay attention to warning messages.
    -seed valueseed a new sequence of pseudo-random numbers
    -verboseprint detailed information about the image
    -versionprint version information
    + +

    Magick Scripting Language

    +

    The conjure command recognizes these MSL elements. Any element with a strike-thru is not supported yet.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Magick Scripting Language (MSL)
    MethodParametersDescription
    adaptiveblurgeometry="geometry", radius="double", sigma="double", bias="double", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"adaptively blur the image with a Gaussian operator of the given radius and standard deviation (sigma). Decrease the effect near edges.
    adaptiveresizegeometry="geometry", width="integer", height="integer", filter="Point, Box, Triangle, Hermite, Hanning, Hamming, Blackman, Gaussian, Quadratic, Cubic, Catrom, Mitchell, Lanczos, Bessel, Sinc", support="double", blur="double"adaptively resize image using data dependant triangulation. Specify blur > 1 for blurry or < 1 for sharp
    adaptivesharpengeometry="geometry", radius="double", sigma="double", bias="double", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"adaptively sharpen the image with a Gaussian operator of the given radius and standard deviation (sigma). Increase the effect near edges.
    adaptivethresholdgeometry="geometry", width="integer", height="integer", offset="integer"local adaptive thresholding.
    addnoisenoise="Uniform, Gaussian, Multiplicative, Impulse, Laplacian, Poisson", attenuate="double", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"add noise to an image
    affinetransformaffine="array of float values", translate="float, float", scale= "float, float", rotate="float", skewX="float", skewY="float", interpolate="Average, Bicubic, Bilinear, Filter, Integer, Mesh, NearestNeighbor", background="color name"affine transform image
    affinityimage="image-handle", method="None, FloydSteinberg, Riemersma"choose a particular set of colors from this image
    <annotate>text="string", font="string", family="string", style="Normal, Italic, Oblique, Any", stretch="Normal, UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, SemiExpanded, Expanded, ExtraExpanded, UltraExpanded", weight="integer", pointsize="integer", density="geometry", stroke="color name", strokewidth="integer", fill="color name", undercolor="color name", kerning="float", geometry="geometry", gravity="NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast", antialias="true, false", x="integer", y="integer", affine="array of float values", translate="float, float", scale="float, float", rotate="float". skewX="float", skewY= "float", align="Left, Center, Right", encoding="UTF-8", interline-spacing="double", interword-spacing="double", direction="right-to-left, left-to-right"annotate an image with text. See QueryFontMetrics to get font metrics without rendering any text.
    autogammachannel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"automagically adjust gamma level of image
    autolevelchannel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"automagically adjust color levels of image
    autoorient adjusts an image so that its orientation is suitable for viewing (i.e. top-left orientation)
    blackthresholdthreshold="string", , channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"force all pixels below the threshold intensity into black
    blueshiftfactor="double",simulate a scene at nighttime in the moonlight. Start with a factor of 1.5.
    <blur>geometry="geometry", radius="double", sigma="double", bias="double", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"reduce image noise and reduce detail levels with a Gaussian operator of the given radius and standard deviation (sigma).
    <border>geometry="geometry", width="integer", height="integer", bordercolor="color name", compose="Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyOpacity, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor ",surround the image with a border of color
    <charcoal>geometry="geometry", radius="double", sigma="double"simulate a charcoal drawing
    <chop>geometry="geometry", width="integer", height="integer", x="integer", y="integer"chop an image
    clampchannel="Red, RGB, All, etc."set each pixel whose value is below zero to zero and any the pixel whose value is above the quantum range to the quantum range (e.g. 65535) otherwise the pixel value remains unchanged.
    clipid="name", inside=""true, false"",apply along a named path from the 8BIM profile.
    clipmaskmask="image-handle"clip image as defined by the image mask
    clutimage="image-handle", interpolate="Average, Bicubic, Bilinear, Filter, Integer, Mesh, NearestNeighbor", channel="Red, RGB, All, etc."apply a color lookup table to an image sequence
    coalesce merge a sequence of images
    colorcolor="color name"set the entire image to this color.
    colordecisionlistfilename="string",color correct with a color decision list.
    <colorize>fill="color name", blend="string"colorize the image with the fill color
    colormatrixmatrix="array of float values"apply color correction to the image. Although you can use variable sized matrices, typically you use a 5 x 5 for an RGBA image and a 6x6 for CMYKA. A 6x6 matrix is required for offsets (populate the last column with normalized values).
    <comment>stringadd a comment to your image
    comparelayersmethod="any, clear, overlay"compares each image with the next in a sequence and returns the minimum bounding region of any pixel differences it discovers. Images do not have to be the same size, though it is best that all the images are coalesced (images are all the same size, on a flattened canvas, so as to represent exactly how a specific frame should look).
    <composite>image="image-handle", compose="Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyOpacity, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor ", mask="image-handle", geometry="geometry", x="integer", y="integer", gravity="NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast", opacity="integer", tile="True, False", rotate="double", color="color name", blend="geometry", interpolate="undefined, average, bicubic, bilinear, filter, integer, mesh, nearest-neighbor, spline"composite one image onto another. Use the rotate parameter in concert with the tile parameter.
    <contrast>sharpen="True, False"enhance or reduce the image contrast
    contraststretchlevels="string", 'black-point'="double", 'white-point'="double", channel="Red, RGB, All, etc."improve the contrast in an image by `stretching' the range of intensity values
    convolvecoefficients="array of float values", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow", bias="double"apply a convolution kernel to the image. Given a kernel "order" , you would supply "order*order" float values (e.g. 3x3 implies 9 values).
    <crop>geometry="geometry", width="integer", height="integer", x="integer", y="integer", fuzz="double", gravity="NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast"crop an image
    cyclecolormapamount="integer"displace image colormap by amount
    decipherpassphrase="string"convert cipher pixels to plain pixels
    deconstruct break down an image sequence into constituent parts
    deskewgeometry="string",threshold="double"straighten the image
    <despeckle> reduce the speckles within an image
    differenceimage="image-handle"compute the difference metrics between two images
    distortpoints="array of float values", method="Affine, AffineProjection, Bilinear, Perspective, Resize, ScaleRotateTranslate", virtual-pixel="Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White", best-fit="True, False"distort image
    <draw>primitive="point, line, rectangle, arc, ellipse, circle, path, polyline, polygon, bezier, color, matte, text, @"filename"", points="string" , method=""Point, Replace, Floodfill, FillToBorder, Reset"", stroke="color name", fill="color name", font="string", pointsize="integer", strokewidth="float", antialias="true, false", bordercolor="color name", x="float", y="float", dash-offset="float", dash-pattern="array of float values", affine="array of float values", translate="float, float", scale="float, float", rotate="float", skewX="float", skewY="float", interpolate="undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline", kerning="float", text="string", vector-graphics="string", interline-spacing="double", interword-spacing="double", direction="right-to-left, left-to-right"annotate an image with one or more graphic primitives.
    encipherpassphrase="string"convert plain pixels to cipher pixels
    <edge>radius="double"enhance edges within the image with a convolution filter of the given radius.
    <emboss>geometry="geometry", radius="double", sigma="double"emboss the image with a convolution filter of the given radius and standard deviation (sigma).
    <enhance> apply a digital filter to enhance a noisy image
    <equalize>channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow" perform histogram equalization to the image
    extentgeometry="geometry", width="integer", height="integer", x="integer", y="integer", fuzz="double", background="color name", gravity="NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast"set the image size
    evaluatevalue="double", operator=""Add, And, Divide, LeftShift, Max, Min, Multiply, Or, Rightshift, Subtract, Xor"", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow" apply an arithmetic, relational, or logical expression to the image
    filterkernel="string", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow", bias="double"apply a convolution kernel to the image.
    <flip> reflect the image scanlines in the vertical direction
    <flop> reflect the image scanlines in the horizontal direction
    floodfillpaintgeometry="geometry", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow", x="integer", y="integer" , fill="color name", bordercolor="color name", fuzz="double", invert="True, False"changes the color value of any pixel that matches the color of the target pixel and is a neighbor. If you specify a border color, the color value is changed for any neighbor pixel that is not that color.
    forwardfouriertransformmagnitude="True, False"implements the forward discrete Fourier transform (DFT)
    <frame>geometry="geometry", width="integer", height="integer", inner="integer", outer="integer", fill="color name", compose="Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyOpacity, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor ",surround the image with an ornamental border
    functionparameters="array of float values", function="Sin", virtual-pixel="Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White"apply a function to the image
    <gamma>gamma="string", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"gamma correct the image
    gaussianblurgeometry="geometry", radius="double", sigma="double", bias="double", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"reduce image noise and reduce detail levels with a Gaussian operator of the given radius and standard deviation (sigma).
    getpixelgeometry="geometry", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow", normalize="true, false", x="integer", y="integer"get a single pixel. By default normalized pixel values are returned.
    getpixelsgeometry="geometry", width="integer", height="integer", x="integer", y="integer", map="string", normalize="true, false"get image pixels as defined by the map (e.g. "RGB", "RGBA", etc.). By default non-normalized pixel values are returned.
    grayscalechannel="Average, Brightness, Lightness, Rec601Luma, Rec601Luminance, Rec709Luma, Rec709Luminance, RMS"convert image to grayscale
    haldclutimage="image-handle", channel="Red, RGB, All, etc."apply a Hald color lookup table to an image sequence
    identifyfile="file", features="distance", unique="True, False"identify the attributes of an image
    <implode>amount="double", interpolate="undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline"implode image pixels about the center
    inversediscretefouriertransformmagnitude="True, False"implements the inverse discrete Fourier transform (DFT)
    <label>stringassign a label to an image
    layersmethod="coalesce, compare-any, compare-clear, compare-over, composite, dispose, flatten, merge, mosaic, optimize, optimize-image, optimize-plus, optimize-trans, remove-dups, remove-zero", compose="Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyOpacity, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, LinearLight, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor ", dither="true, false"compare each image the GIF disposed forms of the previous image in the sequence. From this, attempt to select the smallest cropped image to replace each frame, while preserving the results of the animation.
    <level>levels="string", 'black-point'="double", 'gamma'="double", 'white-point'="double", channel="Red, RGB, All, etc."adjust the level of image contrast
    levelcolorsinvert=>"True, False", 'black-point'="string", 'white-point'="string", channel="Red, RGB, All, etc."level image with the given colors
    linearstretchlevels="string", 'black-point'="double", 'white-point'="double"linear with saturation stretch
    liquidresizegeometry="geometry", width="integer", height="integer", delta-x="double", rigidity="double"rescale image with seam-carving.
    <magnify> double the size of the image with pixel art scaling
    maskmask="image-handle"composite image pixels as defined by the mask
    mattefloodfillgeometry="geometry", x="integer", y="integer" , matte="integer", bordercolor="color name", fuzz="double", invert="True, False"changes the matte value of any pixel that matches the color of the target pixel and is a neighbor. If you specify a border color, the matte value is changed for any neighbor pixel that is not that color.
    medianfiltergeometry="geometry", width="integer", height="integer", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"replace each pixel with the median intensity pixel of a neighborhood.
    <minify> half the size of an image
    modegeometry="geometry", width="integer", height="integer", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"make each pixel the "predominant color" of the neighborhood.
    <modulate>factor="geometry", brightness="double", saturation="double", hue="double", lightness="double", whiteness="double", blackness="double" vary the brightness, saturation, and hue of an image by the specified percentage
    morphologykernel="string", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow", iterations="integer"apply a morphology method to the image.
    motionblurgeometry="geometry", radius="double", sigma="double", angle="double", bias="double", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"reduce image noise and reduce detail levels with a Gaussian operator of the given radius and standard deviation (sigma) at the given angle to simulate the effect of motion
    <negate>gray="True, False", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"replace each pixel with its complementary color (white becomes black, yellow becomes blue, etc.)
    <normalize>channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow" transform image to span the full range of color values
    oilpaintradius="integer"simulate an oil painting
    <opaque>color="color name", +fill="color name", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow", invert="True, False"change this color to the fill color within the image
    orderedditherthreshold="threshold, checks, o2x2, o3x3, o4x4, o8x8, h4x4a, h6x6a, h8x8a, h4x4o, h6x6o, h8x8o, h16x16o, hlines6x4", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"order dither image
    perceptibleepsilon="double", channel="Red, RGB, All, etc."set each pixel whose value is less than |"epsilon"| to "-epsilon" or "epsilon" (whichever is closer) otherwise the pixel value remains unchanged..
    polaroidcaption="string", angle="double", pointsize="double", font="string", stroke= "color name", strokewidth="integer", fill="color name", gravity="NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast", background="color name"simulate a Polaroid picture.
    posterizelevels="integer", dither="True, False"reduce the image to a limited number of color level
    <profile>name="string", profile="blob", rendering-intent="Undefined, Saturation, Perceptual, Absolute, Relative", black-point-compensation="True, False"add or remove ICC or IPTC image profile; name is formal name (e.g. ICC or filename; set profile to '' to remove profile
    <quantize>colors="integer", colorspace="RGB, Gray, Transparent, OHTA, XYZ, YCbCr, YIQ, YPbPr, YUV, CMYK, sRGB, HSL, HSB", treedepth= "integer", dither="True, False", dither-method="Riemersma, Floyd-Steinberg", measure_error="True, False", global_colormap="True, False", transparent-color="color"preferred number of colors in the image
    radialblurgeometry="geometry", angle="double", bias="double", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"radial blur the image.
    <raise>geometry="geometry", width="integer", height="integer", x="integer", y="integer", raise="True, False"lighten or darken image edges to create a 3-D effect
    reducenoisegeometry="geometry", width="integer", height="integer", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"reduce noise in the image with a noise peak elimination filter
    remapimage="image-handle", dither="true, false", dither-method="Riemersma, Floyd-Steinberg"replace the colors of an image with the closest color from a reference image.
    <resample>density="geometry", x="double", y="double", filter="Point, Box, Triangle, Hermite, Hanning, Hamming, Blackman, Gaussian, Quadratic, Cubic, Catrom, Mitchell, Lanczos, Bessel, Sinc", support="double"resample image to desired resolution. Specify blur > 1 for blurry or < 1 for sharp
    <resize>geometry="geometry", width="integer", height="integer", filter="Point, Box, Triangle, Hermite, Hanning, Hamming, Blackman, Gaussian, Quadratic, Cubic, Catrom, Mitchell, Lanczos, Bessel, Sinc", support="double", blur="double"scale image to desired size. Specify blur > 1 for blurry or < 1 for sharp
    <roll>geometry="geometry", x="integer", y="integer"roll an image vertically or horizontally
    <rotate>degrees="double", background="color name"rotate an image
    <sample>geometry="geometry", width="integer", height="integer"scale image with pixel sampling.
    <scale>geometry="geometry", width="integer", height="integer"scale image to desired size
    <segment>colorspace="RGB, Gray, Transparent, OHTA, XYZ, YCbCr, YCC, YIQ, YPbPr, YUV, CMYK", verbose="True, False", cluster-threshold="double", smoothing-threshold="double"segment an image by analyzing the histograms of the color components and identifying units that are homogeneous
    selectiveblurgeometry="geometry", radius="double", sigma="double", threshold="double", bias="double", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"selectively blur pixels within a contrast threshold.
    separatechannel="Red, RGB, All, etc."separate a channel from the image into a grayscale image
    <shade>geometry="geometry", azimuth="double", elevation="double", gray="true, false"shade the image using a distant light source
    setpixelgeometry="geometry", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow", color="array of float values", x="integer", y="integer", color="array of float values"set a single pixel. By default normalized pixel values are expected.
    <shadow>geometry="geometry", opacity="double", sigma="double", x="integer", y="integer"simulate an image shadow
    <sharpen>geometry="geometry", radius="double", sigma="double", bias="double", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"sharpen the image with a Gaussian operator of the given radius and standard deviation (sigma).
    <shave>geometry="geometry", width="integer", height="integer"shave pixels from the image edges
    <shear>geometry="geometry", x="double", y="double" fill="color name"shear the image along the X or Y axis by a positive or negative shear angle
    sigmoidalcontrastgeometry="string", 'contrast'="double", 'mid-point'="double" channel="Red, RGB, All, etc.", sharpen="True, False"sigmoidal non-lineraity contrast control. Increase the contrast of the image using a sigmoidal transfer function without saturating highlights or shadows. Contrast" indicates how much to increase the contrast (0 is none; 3 is typical; 20 is a lot); mid-point" indicates where midtones fall in the resultant image (0 is white; 50% is middle-gray; 100% is black). To decrease contrast, set sharpen to False.
    <signature> generate an SHA-256 message digest for the image pixel stream
    sketchgeometry="geometry", radius="double", sigma="double", angle="double"sketch the image with a Gaussian operator of the given radius and standard deviation (sigma) at the given angle
    <solarize>geometry="string", threshold="double", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"negate all pixels above the threshold level
    sparsecolorpoints="array of float values", method="Barycentric, Bilinear, Shepards, Voronoi", virtual-pixel="Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White"interpolate the image colors around the supplied points
    splicegeometry="geometry", width="integer", height="integer", x="integer", y="integer", fuzz="double", background="color name", gravity="NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast"splice an image
    <spread>radius="double", interpolate="undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline"displace image pixels by a random amount
    statisticgeometry="geometry", width="integer", height="integer", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow", type="Median, Mode, Mean, Maximum, Minimum, ReduceNoise"replace each pixel with corresponding statistic from the neighborhood.
    <stegano>image="image-handle", offset="integer"hide a digital watermark within the image
    <stereo>image="image-handle", x="integer", y="integer"composites two images and produces a single image that is the composite of a left and right image of a stereo pair
    <strip> strip an image of all profiles and comments.
    <swirl>degrees="double", interpolate="undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline"swirl image pixels about the center
    texturetexture="image-handle"name of texture to tile onto the image background
    thumbnailgeometry="geometry", width="integer", height="integer"changes the size of an image to the given dimensions and removes any associated profiles.
    <threshold>threshold="string", channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"threshold the image
    tintfill="color name", blend="string"tint the image with the fill color.
    <transparent>color="color name", invert="True, False"make this color transparent within the image
    transpose flip image in the vertical direction and rotate 90 degrees
    transverse flop image in the horizontal direction and rotate 270 degrees
    <trim> remove edges that are the background color from the image
    unsharpmaskgeometry="geometry", radius="double", sigma="double", gain="double", threshold="double"sharpen the image with the unsharp mask algorithm.
    vignettegeometry="geometry", radius="double", sigma="double", x="integer", y="integer", background="color name"offset the edges of the image in vignette style
    wavegeometry="geometry", amplitude="double", wavelength="double", interpolate="undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline"alter an image along a sine wave
    whitethresholdthreshold="string", , channel="All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Opacity, Red, RGB, Yellow"force all pixels above the threshold intensity into white
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/connected-components.html b/ImageMagick-6.9.12-44/www/connected-components.html new file mode 100644 index 0000000..409b8a4 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/connected-components.html @@ -0,0 +1,164 @@ + + + + + + + + + + ImageMagick (legacy) – Connected Components Labeling + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Uniquely Label Connected Regions

    +

    Connected-component labeling (alternatively connected-component analysis, blob extraction, region labeling, blob discovery, or region extraction) uniquely labels connected components in an image. The labeling process scans the image, pixel-by-pixel from top-left to bottom-right, in order to identify connected pixel regions, i.e. regions of adjacent pixels which share the same set of intensity values. For example, let's find the objects in this image:

    +
      + purse +
    +

    To identify the objects in this image, use this command:

    +
    convert objects.gif -connected-components 4 -auto-level -depth 8 objects.png
    +

    The detected objects are uniquely labeled. Use auto leveling to visualize the detected objects:

    +
      + Objects +
    +

    Object statistics is useful to review. To display them, use this command:

    +
    convert objects.gif -define connected-components:verbose=true -connected-components 4 objects.png
    +

    Five objects were detected in the source image with these statistics:

    +
    Objects (id: bounding-box centroid area mean-color):
    +  0: 256x171+0+0 119.2,80.8 33117 srgb(0,0,0)
    +  2: 120x135+104+18 159.5,106.5 8690 srgb(255,255,255)
    +  3: 50x36+129+44 154.2,63.4 1529 srgb(0,0,0)
    +  4: 21x23+0+45 8.8,55.9 409 srgb(255,255,255)
    +  1: 4x10+252+0 253.9,4.1 31 srgb(255,255,255)
    +
    +

    Add -define connected-components:exclude-header=true to show the objects without the header-line.

    +

    Use -connected-components 8 to visit 8 neighbors rather than 4. By default, neighbor colors must be exact to be part of a unique object. Use the -fuzz option to include pixels as part of an object that are close in color.

    +

    You might want to eliminate small objects by merging them with their larger neighbors. If so, use this command:

    +
    convert objects.gif -define connected-components:area-threshold=410 -connected-components 4 \
    +  -auto-level objects.jpg
    +

    Here are the expected results. Notice, how the small objects are now merged with the background.

    +
      + Objects +
    +

    Notice how two of the objects were merged leaving three remaining objects:

    +
    Objects (id: bounding-box centroid area mean-color):
    +  0: 256x171+0+0 118.0,80.4 33557 srgb(0,0,0)
    +  2: 120x135+104+18 159.5,106.5 8690 srgb(255,255,255)
    +  3: 50x36+129+44 154.2,63.4 1529 srgb(0,0,0)
    +

    Area thresholding does not always work if objects are stacked on top of one-another. We're seeking a robust algorithm to tackle this use case.

    +

    By default, the labeled image is grayscale. You can instead replace the object color in the labeled image with the mean-color from the source image. Simply add this setting, -define connected-components:mean-color=true, to your command line.

    +

    Thresholds can optionally include ranges, e.g. -define connected-components:area-threshold=410-1600. To keep the background object, identify it with -define connected-components:background-id=object-id. The default background object is the object with the largest area.

    +

    You may want to remove certain objects. Use -define connected-components:remove-ids=list-of-ids (e.g. -define connected-components:remove-ids=2,4-5). Or use -define connected-components:keep-ids=list-of-ids to keep these objects and merge all others. For convenience, you can keep the top objects with this option: -define connected-components:keep-top=number-of-objects

    +

    Objects in your image may look homogeneous but have slightly different color values. By default, only pixels that match exactly are considered as part of a particular object. For slight variations of color in an object, use -fuzz. For example,

    +
    convert star-map.png -fuzz 5% -define connected-components:verbose=true \
    +  -define connected-components:mean-color=true -connected-components 4 stars.gif
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/contact.html b/ImageMagick-6.9.12-44/www/contact.html new file mode 100644 index 0000000..a9afcea --- /dev/null +++ b/ImageMagick-6.9.12-44/www/contact.html @@ -0,0 +1,180 @@ + + + + + + + + + + ImageMagick (legacy) – Contact the Development Team + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +
    +

    Contact the Wizards

    +

    Post here for any of the issues listed below. You can expect a response from our team if your issue is a sponsorship, license, security, or paid support issue. If you require a response for any other issue, post to the ImageMagick public forums. You can also post bug and security issues to the issues forum. Note, we do not offer sponsored links nor do we respond to solicitations.

    +
    +

    Contact the Wizards

    +

    Enter this code, +83c3aa, in the Authenticate field and fill in the remaining fields. Press Send to forward your message to the ImageMagick wizards:

    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/contrib/color-converter.html b/ImageMagick-6.9.12-44/www/contrib/color-converter.html new file mode 100644 index 0000000..924dede --- /dev/null +++ b/ImageMagick-6.9.12-44/www/contrib/color-converter.html @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/contrib/color-swatch.html b/ImageMagick-6.9.12-44/www/contrib/color-swatch.html new file mode 100644 index 0000000..924dede --- /dev/null +++ b/ImageMagick-6.9.12-44/www/contrib/color-swatch.html @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/convert.html b/ImageMagick-6.9.12-44/www/convert.html new file mode 100644 index 0000000..d30f3e8 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/convert.html @@ -0,0 +1,1358 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Convert + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Convert Between Image Formats

    +

    Use the convert program to convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. See Command Line Processing for advice on how to structure your convert command or see below for example usages of the command.

    + +

    We list a few examples of the convert command here to illustrate its usefulness and ease of use. To get started, lets convert an image in the JPEG format to PNG:

    + +
    convert rose.jpg rose.png
    +
    + +

    Next, we reduce the image size before it is written to the PNG format:

    + +
    convert rose.jpg -resize 50% rose.png
    +
    + + + +

    You can combine multiple image-processing operations to produce complex results:

    + +
    convert -size 320x85 canvas:none -font Bookman-DemiItalic -pointsize 72 \
    +  -draw "text 25,60 \'Magick\'" -channel RGBA -blur 0x6 -fill darkred -stroke magenta \
    +  -draw "text 20,55 \'Magick\'" fuzzy-magick.png
    +
    + +
      + fuzzy-magick +
    + +

    or here we resize an image with improved quality:

    + +
    convert input.png -colorspace RGB +sigmoidal-contrast 11.6933 \
    +  -define filter:filter=Sinc -define filter:window=Jinc -define filter:lobes=3 \
    +  -resize 400% -sigmoidal-contrast 11.6933 -colorspace sRGB output.png');
    +
    + +

    You can find additional examples of using convert in Examples of ImageMagick Usage.

    + +

    Option Summary

    + +

    The convert command recognizes these options. Click on an option to get more details about how that option works.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    -adaptive-blur geometryadaptively blur pixels; decrease effect near edges
    -adaptive-resize geometryadaptively resize image with data dependent triangulation.
    -adaptive-sharpen geometryadaptively sharpen pixels; increase effect near edges
    -adjoinjoin images into a single multi-image file
    -affine matrixaffine transform matrix
    -alphaon, activate, off, deactivate, set, opaque, copy", +transparent, extract, background, or shape the alpha channel
    -annotate geometry textannotate the image with text
    -antialiasremove pixel-aliasing
    -appendappend an image sequence
    -authenticate valuedecipher image with this password
    -auto-gammaautomagically adjust gamma level of image
    -auto-levelautomagically adjust color levels of image
    -auto-orientautomagically orient image
    -background colorbackground color
    -bench iterationsmeasure performance
    -bias valueadd bias when convolving an image
    -black-threshold valueforce all pixels below the threshold into black
    -blue-primary pointchromaticity blue primary point
    -blue-shift factorsimulate a scene at nighttime in the moonlight
    -blur geometryreduce image noise and reduce detail levels
    -border geometrysurround image with a border of color
    -bordercolor colorborder color
    -brightness-contrast geometryimprove brightness / contrast of the image
    -canny geometryuse a multi-stage algorithm to detect a wide range of edges in the image
    -caption stringassign a caption to an image
    -cdl filenamecolor correct with a color decision list
    -channel typeapply option to select image channels
    -charcoal radiussimulate a charcoal drawing
    -chop geometryremove pixels from the image interior
    -clampset each pixel whose value is below zero to zero and any the pixel whose value is above the quantum range to the quantum range (e.g. 65535) otherwise the pixel value remains unchanged.
    -clipclip along the first path from the 8BIM profile
    -clip-mask filenameassociate clip mask with the image
    -clip-path idclip along a named path from the 8BIM profile
    -clone indexclone an image
    -clutapply a color lookup table to the image
    -connected-components connectivityconnected-components uniquely labeled, choose from 4 or 8 way connectivity
    -contrast-stretch geometryimprove the contrast in an image by `stretching' the range of intensity value
    -coalescemerge a sequence of images
    -colorize valuecolorize the image with the fill color
    -color-matrix matrixapply color correction to the image.
    -colors valuepreferred number of colors in the image
    -colorspace typeset image colorspace
    -combinecombine a sequence of images
    -comment stringannotate image with comment
    -comparecompare image
    -complexoperatorperform complex mathematics on an image sequence
    -compose operatorset image composite operator
    -compositecomposite image
    -compress typeimage compression type
    -contrastenhance or reduce the image contrast
    -convolve coefficientsapply a convolution kernel to the image
    -copy geometry offsetcopy pixels from one area of an image to another
    -crop geometrycrop the image
    -cycle amountcycle the image colormap
    -decipher filenameconvert cipher pixels to plain
    -debug eventsdisplay copious debugging information
    -define format:optiondefine one or more image format options
    -deconstructbreak down an image sequence into constituent parts
    -delay centisecondsdisplay the next image after pausing
    -delete indexdelete the image from the image sequence
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -despecklereduce the speckles within an image
    -direction typerender text right-to-left or left-to-right
    -display serverget image or font from this X server
    -dispose methodlayer disposal method
    -distribute-cache portlaunch a distributed pixel cache server
    -distort type coefficientsdistort image
    -dither methodapply error diffusion to image
    -draw stringannotate the image with a graphic primitive
    -duplicate count,indexesduplicate an image one or more times
    -edge radiusapply a filter to detect edges in the image
    -emboss radiusemboss an image
    -encipher filenameconvert plain pixels to cipher pixels
    -encoding typetext encoding type
    -endian typeendianness (MSB or LSB) of the image
    -enhanceapply a digital filter to enhance a noisy image
    -equalizeperform histogram equalization to an image
    -evaluate operator valueevaluate an arithmetic, relational, or logical expression
    -evaluate-sequence operatorevaluate an arithmetic, relational, or logical expression for an image sequence
    -extent geometryset the image size
    -extract geometryextract area from image
    -family namerender text with this font family
    -features distanceanalyze image features (e.g. contract, correlations, etc.).
    -fftimplements the discrete Fourier transform (DFT)
    -fill colorcolor to use when filling a graphic primitive
    -filter typeuse this filter when resizing an image
    -flattenflatten a sequence of images
    -flipflip image in the vertical direction
    -floodfill geometry colorfloodfill the image with color
    -flopflop image in the horizontal direction
    -font namerender text with this font
    -format stringoutput formatted image characteristics
    -frame geometrysurround image with an ornamental border
    -function nameapply a function to the image
    -fuzz distancecolors within this distance are considered equal
    -fx expressionapply mathematical expression to an image channel(s)
    -gamma valuelevel of gamma correction
    -gaussian-blur geometryreduce image noise and reduce detail levels
    -geometry geometrypreferred size or location of the image
    -gravity typehorizontal and vertical text placement
    -grayscale methodconvert image to grayscale
    -green-primary pointchromaticity green primary point
    -helpprint program options
    -hough-lines geometryidentify lines in the image
    -identifyidentify the format and characteristics of the image
    -iftimplements the inverse discrete Fourier transform (DFT)
    -implode amountimplode image pixels about the center
    -insert indexinsert last image into the image sequence
    -intensity methodmethod to generate an intensity value from a pixel
    -intent typetype of rendering intent when managing the image color
    -interlace typetype of image interlacing scheme
    -interline-spacing valuethe space between two text lines
    -interpolate methodpixel color interpolation method
    -interword-spacing valuethe space between two words
    -kerning valuethe space between two characters
    -kuwahara geometryedge preserving noise reduction filter
    -label stringassign a label to an image
    -lat geometrylocal adaptive thresholding
    -layers methodoptimize or compare image layers
    -level valueadjust the level of image contrast
    -limit type valuepixel cache resource limit
    -linear-stretch geometrylinear with saturation histogram stretch
    -liquid-rescale geometryrescale image with seam-carving
    -list typeColor, Configure, Delegate, Format, Magic, Module, Resource, or Type
    -log formatformat of debugging information
    -loop iterationsadd Netscape loop extension to your GIF animation
    -mask filenameassociate a mask with the image
    -mattecolor colorframe color
    -median radiusapply a median filter to the image
    -mean-shift geometrydelineate arbitrarily shaped clusters in the image
    -metric typemeasure differences between images with this metric
    -mode radiusmake each pixel the 'predominant color' of the neighborhood
    -modulate valuevary the brightness, saturation, and hue
    -momentsdisplay image moments.
    -monitormonitor progress
    -monochrometransform image to black and white
    -morph valuemorph an image sequence
    -morphology method kernelapply a morphology method to the image
    -motion-blur geometrysimulate motion blur
    -negatereplace each pixel with its complementary color
    -noise radiusadd or reduce noise in an image
    -normalizetransform image to span the full range of colors
    -opaque colorchange this color to the fill color
    -ordered-dither NxNordered dither the image
    -orient typeimage orientation
    -page geometrysize and location of an image canvas (setting)
    -paint radiussimulate an oil painting
    -perceptibleset each pixel whose value is less than |epsilon| to -epsilon or epsilon (whichever is closer) otherwise the pixel value remains unchanged.
    -pingefficiently determine image attributes
    -pointsize valuefont point size
    -polaroid anglesimulate a Polaroid picture
    -poly termsbuild a polynomial from the image sequence and the corresponding terms (coefficients and degree pairs).
    -posterize levelsreduce the image to a limited number of color levels
    -precision valueset the maximum number of significant digits to be printed
    -preview typeimage preview type
    -print stringinterpret string and print to console
    -process image-filterprocess the image with a custom image filter
    -profile filenameadd, delete, or apply an image profile
    -quality valueJPEG/MIFF/PNG compression level
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -radial-blur angleradial blur the image
    -raise valuelighten/darken image edges to create a 3-D effect
    -random-threshold low,highrandom threshold the image
    -red-primary pointchromaticity red primary point
    -regard-warningspay attention to warning messages.
    -region geometryapply options to a portion of the image
    -remap filenametransform image colors to match this set of colors
    -renderrender vector graphics
    -repage geometrysize and location of an image canvas
    -resample geometrychange the resolution of an image
    -resize geometryresize the image
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -roll geometryroll an image vertically or horizontally
    -rotate degreesapply Paeth rotation to the image
    -sample geometryscale image with pixel sampling
    -sampling-factor geometryhorizontal and vertical sampling factor
    -scale geometryscale the image
    -scene valueimage scene number
    -seed valueseed a new sequence of pseudo-random numbers
    -segment valuessegment an image
    -selective-blur geometryselectively blur pixels within a contrast threshold
    -separateseparate an image channel into a grayscale image
    -sepia-tone thresholdsimulate a sepia-toned photo
    -set attribute valueset an image attribute
    -shade degreesshade the image using a distant light source
    -shadow geometrysimulate an image shadow
    -sharpen geometrysharpen the image
    -shave geometryshave pixels from the image edges
    -shear geometryslide one edge of the image along the X or Y axis
    -sigmoidal-contrast geometryincrease the contrast without saturating highlights or shadows
    -smush offsetsmush an image sequence together
    -size geometrywidth and height of image
    -sketch geometrysimulate a pencil sketch
    -solarize thresholdnegate all pixels above the threshold level
    -splice geometrysplice the background color into the image
    -spread radiusdisplace image pixels by a random amount
    -statistic type geometryreplace each pixel with corresponding statistic from the neighborhood
    -stripstrip image of all profiles and comments
    -stroke colorgraphic primitive stroke color
    -strokewidth valuegraphic primitive stroke width
    -stretch typerender text with this font stretch
    -style typerender text with this font style
    -swap indexesswap two images in the image sequence
    -swirl degreesswirl image pixels about the center
    -synchronizesynchronize image to storage device
    -taintmark the image as modified
    -texture filenamename of texture to tile onto the image background
    -threshold valuethreshold the image
    -thumbnail geometrycreate a thumbnail of the image
    -tile filenametile image when filling a graphic primitive
    -tile-offset geometryset the image tile offset
    -tint valuetint the image with the fill color
    -transformaffine transform image
    -transparent colormake this color transparent within the image
    -transparent-color colortransparent color
    -transposeflip image in the vertical direction and rotate 90 degrees
    -transverseflop image in the horizontal direction and rotate 270 degrees
    -treedepth valuecolor tree depth
    -trimtrim image edges
    -type typeimage type
    -undercolor colorannotation bounding box color
    -unique-colorsdiscard all but one of any pixel color.
    -units typethe units of image resolution
    -unsharp geometrysharpen the image
    -verboseprint detailed information about the image
    -versionprint version information
    -viewFlashPix viewing transforms
    -vignette geometrysoften the edges of the image in vignette style
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    -wave geometryalter an image along a sine wave
    -wavelet-denoise thresholdremoves noise from the image using a wavelet transform
    -weight typerender text with this font weight
    -white-point pointchromaticity white point
    -white-threshold valueforce all pixels above the threshold into white
    -write filenamewrite images to this file
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/defines.html b/ImageMagick-6.9.12-44/www/defines.html new file mode 100644 index 0000000..05c19bf --- /dev/null +++ b/ImageMagick-6.9.12-44/www/defines.html @@ -0,0 +1,1494 @@ + + + + + + + + + + ImageMagick (legacy) – Defines + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    + +

    The -define command-line option adds specific global settings generally used to control coders and image processing operations.

    + +

    This option creates one or more definitions for coders and decoders to use +while reading and writing image data. Definitions are generally used to +control image file format coder modules, and image processing operations, +beyond what is provided by normal means. Defined settings are listed in -verbose information ("info:" output format) as "Artifacts".

    + +

    If value is missing for a definition, an empty-valued +definition of a flag is created with that name. This used to control on/off +options. Use -define keys to remove definitions +previously created. Use +define "*" to remove all existing definitions.

    + +

    The same 'artifact' settings can also be defined using the -set "option:key" "value" option, which also allows the use of Format and Print Image Properties in the defined value.

    + +

    The option and key are case-independent (they are +converted to lowercase for use within the decoders) while the value +is case-dependent.

    + +

    Such settings are global in scope, and affect all images and operations.

    + +
    magick bilevel.tif -define ps:imagemask eps3:stencil.ps
    +
    + +

    Set attributes of the image registry by prefixing the value with +registry:. For example, to set a temporary path to put work files, +use:

    + +
    -define registry:temporary-path=/data/tmp
    +
    + +

    Here is a list of recognized defines:

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Command-line Defines

    auto-threshold:verbosereturn derived threshold as the auto-threshold:threshold image property.
    colorspace:auto-grayscale=on|offPrevent automatic conversion to grayscale inside coders that support + grayscale. This should be accompanied by -type truecolor. PNG and TIF do + not need this define. With PNG, just use PNG24:image. With TIF, just use + -type truecolor. JPG and PSD will need this define.
    compare:ssim-radius=valueSet the structural similarity index radius.
    compare:ssim-sigma=valueSet the structural similarity index sigma.
    compare:ssim-k1=valueSet the structural similarity index k1 argument.
    compare:ssim-k2=valueSet the structural similarity index k2 argument.
    complex:snr=valueSet the divide SNR constant -complex.
    compose:args=argumentsSet certain compose argument values when using convert ... -compose ... + -composite. See Image Composition.
    compose:clip-to-self=true|falseSome -compose methods can modify the + 'destination' image outside the overlay area. It is disabled by default.
    compose:clamp=on|offSet each pixel whose value is below zero to zero and any the pixel + whose value is above the quantum range to the quantum range (e.g. 65535) + otherwise the pixel value remains unchanged. Define supported in + ImageMagick 6.9.1-3 and above.
    connected-components:angle-threshold=valueMerges any region with equivalent ellipse angle smaller than + value into its surrounding region or largest neighbor. + Thresholds can optionally include ranges, e.g. 410-1600.
    connected-components:area-threshold=valueMerges any region with area smaller than value into its + surrounding region or largest neighbor.
    connected-components:background-id=object-idIdentify which object is to be the background object. + Supported in Imagemagick 7.0.9.21.
    connected-components:circularity-threshold=valueMerge any region with circularity smaller than value + into its surrounding region or largest neighbor. Circularity is + computed as 4*pi*area/perimeter^2. + Supported in Imagemagick 7.0.9.24.
    connected-components:diameter-threshold=valueMerge any region with diameter smaller than value + into its surrounding region or largest neighbor. Diameter is + computed as sqrt(4*area/pi). + Supported in Imagemagick 7.0.9.24.
    connected-components:eccentricity-threshold=valueMerge any region with equivalent ellipse eccentricity smaller + than value into its surrounding region or largest neighbor. + Supported in Imagemagick 7.0.9.24.
    connected-components:exclude-header=trueList the objects without the header. Supported in Imagemagick 7.0.9.21.
    connected-components:keep=list-of-idsComma and/or hyphenated list of id values to keep in the output. Supported in Imagemagick 6.9.3-0.
    connected-components:keep-colors=red;green;blueKeeps objects identified by their color in a semicolon separated list. Supported in Imagemagick 6.9.3-0.
    connected-components:keep-top=number-of-objectsKeeps only the top number of objects by area. Supported in Imagemagick 7.0.9.21.
    connected-components:major-axis-threshold=valueMerge any region with equivalent ellipse major axis diameter smaller + than value into its surrounding region or largest neighbor. + Supported in Imagemagick 7.0.9.24.
    connected-components:mean-color=trueChange the output image from id values to mean color values. Supported in Imagemagick 6.9.2-8.
    connected-components:minor-axis-threshold=valueMerge any region with equivalent ellipse minor axis diameter smaller than value into its surrounding region or largest neighbor. Supported in Imagemagick 7.0.9.24.
    connected-components:perimeter-threshold=valueMerge any region with perimeter smaller than value into its surrounding region or largest neighbor. Supported in Imagemagick 7.0.9.24.
    connected-components:remove=list-of-idsComma and/or hyphenated list of id values to remove from the output. + Supported in Imagemagick 6.9.2-9.
    connected-components:remove-colors=red;green;blueRemove objects identified by their color in a semicolon separated list. + Supported in Imagemagick 6.9.3-0.
    connected-components:verbose=trueLists id, bounding box, centroid, area, mean color for each region.
    convolve:scale={kernel_scale}[!^] [,{origin_addition}] [%]Define the kernel scaling. The special flag ! automatically scales to + full dynamic range. The ! flag can be used in combination with a factor or + percent. The factor or percent is then applied after the automatic scaling. + An example is 50%!. This produces a result 50% darker than full dynamic + range scaling. The ^ flag assures the kernel is 'zero-summing', for + example when some values are positive and some are negative as in edge + detection kernels. The origin addition adds that value to the center + pixel of the kernel. This produces an effect that is like adding the image + that many times to the result of the filtered image. The typical value + is 1 so that the original image is added to the result of the convolution. + The default is 0.
    deskew:auto-crop=trueauto crop the image after deskewing.
    delegate:bimodal=trueSpecify direct conversion from Postscript to PDF.
    distort:scale=valueSet the output scaling factor for use with -distort.
    distort:viewport=WxH+X+YSet the viewport for use with -distort.
    dither:diffusion-amount=X%Set the amount of diffusion to use with Floyd-Steinberg diffusion
    filename:literal=trueBy default, an output filename can contain embedded formatting characters. Use this option to bypass interpretting embedded formatting characters and instead use the filename literally.
    filter:option=valueSet a filter option for use with -resize. + See below for specific options.
    filter:b=valueRedefine the spline factor used for cubic filters such as Cubic, + Catrom, Mitchel, and Hermite, as well as the Parzen cubic windowing + function. If only one of the b or c values are defined, the other is + set so as to generate a 'Cubic-Keys' filter. The meaning of the b and c + values was defined in a research paper by Mitchell-Netravali.
    filter:blur=factorScale the X axis of the filter (and its window). Use > 1.0 for blurry + or < 1.0 for sharp. This should only be used with Gaussian and + Gaussian-like filters simple filters, or you may not get the + expected results.
    filter:c=valueRedefine the Keys alpha factor used for cubic filters such as Cubic, + Catrom, Mitchel, and Hermite, as well as the Parzen cubic windowing + function. If only one of the b or c values are defined, the other is + set so as to generate a 'Cubic-Keys' filter. The meaning of the b and c + values was defined in a research paper by Mitchell-Netravali.
    filter:kaiser-alpha=valueSet the Kaiser window alpha value. When it is multiplied by 'PI', + it is equivalent to "kaiser-beta" and will override that setting. + It only affects the Kaiser windowing function and does not affect + any other attributes.
    filter:kaiser-beta=valueSet the Kaiser window beta value. It only affects Kaiser windowing + function and does not affect any other attributes. Before ImageMagick + v6.7.6-10, this option was known as "filter:alpha" (an inheritance + from the very old "zoom" program). It was changed to bring the function + in line with more modern academic research usage and better assign it + be more definitive. The default value is 6.5
    filter:lobes=countSet the number of lobes to use for the Sinc/Bessel filter. + This is an alternate way of specifying the 'support' range of the filter, + that is designed to be more suited to windowed filters, especially when + used for image distorts.
    filter:sigma=valueSet the 'sigma' value used to define the Gaussian filter. + The default sigma value is '0.5'. It only affects the Gaussian filter, + but does not shrink (but may enlarge) the filter's 'support'. + It can be used to generate very small blurs, but without the filter + 'missing' pixels due to using a small support setting. + A larger value of '0.707' (a value of '1/sqrt(2)') is another + common setting.
    filter:support=radiusSet the filter support radius. It defines how large the filter + should be and thus directly defines how slow the filtered resampling + process is. All filters have a default 'preferred' support size. + Some filters like Lagrange and windowed filters adjust themselves + depending on this value. With simple filters this value either does + nothing (but slow the resampling), or will clip the filter function + in a detrimental way.
    filter:verbose=trueEnable printing of information about the final internal + filter selection to standard output. This includes a commented header + on the filter settings being used and data allowing the filter weights + to be easily graphed. Note however that some filters are internally + defined in terms of other filters. The Lanczos filter, for example, + is defined in terms of a SincFast windowed SincFast filter, while + the Mitchell filter is defined as a general Cubic family filter + with specific 'B' and 'C' settings.
    filter:window=filter_functionThe IIR (infinite impulse response) filters Sinc and Jinc are + windowed (brought down to zero over the defined support range) with + the given filter. This allows you to specify a filter function to be + used as a windowing function for these IIR filters. Many of the defined + filters are actually windowing functions for these IIR filters. A typical + choices is Box, (which effectively turns off the windowing function).
    filter:window-support=radiusScale the windowing function to this size. This causes + the windowing (or self-windowing Lagrange filter) to act is if the + support window is larger than what is actually supplied to the calling + operator. The filter, however, is still clipped to the true support + size that is provided. If unset, this will equal the normal filter + support size.
    fourier:normalize=inverseSet the location for the FFT/IFT normalization as use by + +-fft and +-ift. The default is + forward.
    frames:stepWhen selecting image frames, the default is to step one frame at a time through a list, e.g. [0-3], returns frames 0, 1, 2, and 3. Set the step to 2 in this example and we instead get frames 0 and 2.
    h:format=valueSet the image encoding format use when writing a C-style header. + format can be any output format supported by ImageMagick + except for h and magick. If this + option is omitted, the default is GIF for PseudoClass + images and PNM for DirectClass images. +
    hough-lines:accumulator=trueReturn the accumulator image in addition to the lines image.
    json:featuresInclude features in verbose information.
    json:limit
    json:locate
    json:momentsInclude image moments in verbose information.
    kmeans:seed-colors=color-listInitialize the colors, where color-list is a semicolon delimited + list of seed colors (e.g. red;sRGB(19,167,254);#00ffff)
    magick:format=valueSet the image encoding format use when writing a C-style header. + This is the same as "h:format=format" described above.
    magnify:method=valueChoose the method of pixel art magnification. The choices are: + eagle2X, eagle3X, eagle3XB, epb2X, fish2X, hq2X, scale2X (default), + scale3X, xbr2X
    modulate:colorspace=colorspaceDefine the colorspace to use with -modulate. + Any hue-based colorspace may be use. The default is HSL.
    morphology:compose=compose-methodSpecify how to merge results generated by multiple-morphology kernel. The default is none. One + typical value is 'lighten' as used, for example, with the sobel edge + kernels.
    morphology:showKernel=1Output (to 'standard error') all the information about a generated -morphology kernel.
    phash:colorspaces=colorspace,colorspace,...The perceptual hash defaults to the sRGB and HCLp colorspaces. When + using this define, you can specify up to six alternative colorspaces. (as + of IM 7.0.3-8)
    phash:normalize=trueNormalize the phash metric by dividing by the number of channels + specified by -define phash:colorspaces when using compare + -metric phash. (as of IM 7.0.3-8)
    profile:skip=name1,name2,...Skip the named profile[s] when reading the image. Use skip="*" to + skip all named profiles in the image. Many named profiles exist, + including ICC, EXIF, APP1, IPTC, XMP, and others.
    precision:highres-transform=trueIncrease the profile transform precision. Note, there is a slight + performance penalty as the high-precision transform is floating point + rather than unsigned. It is important to note that results may depend + on whether or not the original image already has an included profile.
    preserve-timestamp=true|falsePreserve file timestamp (mogrify only).
    q-table=quantization-table.xmlCustom JPEG quantization tables.
    quantum:format=typeSet the type to floating-point to specify a floating-point + format for raw files (e.g. GRAY:) or for MIFF and TIFF images in HDRI mode + to preserve negative values. If -depth 16 is + included, the result is a single precision floating point format. + If -depth 32 is included, the result is + double precision floating point format. For signed pixel data, use -define quantum:format=signed
    quantum:maximum=valueMaximum value for certain image types such as DCM. If not set, the + the maximum value is QuantumRange.
    quantum:minimum=valueMinimum value for certain image types such as DCM. If not set, the + the minimum value is zero.
    quantum:polarity=photometric-interpretationSet the photometric-interpretation of an image (typically for TIFF + image file format) to either min-is-black (default) or + min-is-white.
    registry:attribute=valueSet attributes of the image registry, for example, + registry:temporary-path=/data/tmp. +
    resample:verbose=trueOutput the cylindrical filter lookup table created by the EWA + (Elliptical Weighted Average) resampling algorithm. Note this table + uses a squared radius lookup value. This is typically only used for + debugging EWA resampling. +
    sample:offset=geometryLocation of the sampling point within the sub-region being sampled, + expressed as percentages (see -sample).
    shepards:power=valueSet the exponent in the Shepard's distortion. The default is 2.
    stream:buffer-size=valueSet the stream buffer size. Select 0 for unbuffered I/O.
    trim:percent-background=X%Set the amount of background that is tolerated in an edge. It is + specified as a percent. 0% means no background is tolerated. + 50% means an edge can contain up to 50% pixels that are background per + the fuzz-factor.
    type:features=stringAdd a font feature to be used by the RAQM delegate during complex + text layout. This is usually used to turn on optional font features that + are not enabled by default, but can be also used to turn off default font + features. Features include those to control kerning, ligature and Arabic.
    type:hinting=falseDisable font hinting. Proper glyph rendering needs the scaled points + to be aligned along the target device pixel grid, through an operation + often called hinting. One of its main purposes is to ensure that important + widths and heights are respected throughout the whole font. (For example, + it is very often desirable that the ‘I’ and the ‘T’ glyphs have their + central vertical line of the same pixel width. Hinting also manages + features like stems and overshoots, which can cause problems at small + pixel sizes.
    x:screen=trueObtain the image from the root window.
    x:silent=trueTurn off the beep when importing an image.

    IMAGE FORMATS

    bmp3:alpha=true|falseInclude any alpha channel when writing in the BMP image format.
    bmp:format=valueValid values are bmp2, bmp3, + and bmp4. This option can be useful when the + method of prepending "BMP2:" to the output filename is inconvenient or + is not available, such as when using the mogrify utility.
    bmp:subtype=valueBMP channel depth subtypes. The choices are: RGB555, RGB565, ARGB4444, + ARGB1555. Only support in BMP (BMP4). BMP3 and BMP2 do not contain header + fields to support these options.
    {caption,label}:{max,start}-pointsize=valueThis sets the bounding pointsize to use when searching for the maximum pointsize where the text annotation still fits within the image boundaries.
    dcm:display-range=resetSet the display range to the minimum and maximum pixel values for the + DCM image format.
    dcm:rescale=trueEnable interpretation of the rescale slope and intercept settings + in the file.
    dcm:rescale=trueEnable interpretation of the rescale slope and intercept settings + in the file.
    dcm:window=CxWSpecify the dcm window center and width.
    dds:cluster-fit=true|falseEnable the DDS cluster-fit.
    dds:compression=dxt1|dxt5|noneSet the dds compression.
    dds:mipmaps=valueSet the dds number of mipmaps.
    dds:weight-by-alpha=true|falseEnable the DDS alpha weighting.
    dng:output-color=valueSelect the output colorspace. The choices are: + 0 - Raw color (unique to each camera), + 1 - sRGB D65 (default), + 2 - Adobe RGB (1998) D65, + 3 - Wide Gamut RGB D65, + 4 - Kodak ProPhoto RGB D65, + 5 - XYZ, + 6 - ACES
    dng:use-auto-bright=falseDisable the histogram-based white level.
    dng:use-auto-wb=trueCompute the white balance by averaging the entire image.
    dng:use-camera-wb=trueUses the white balance specified by the camera.
    dot:layout-engine=valueSpecify the layout engine for the DOT image format (e.g. + neato).
    eps:use-cropbox=trueForce Imagemagick to respect the crop box.
    exr:color-type=valueSpecify the color type for the EXR format: RGB, RGBA, YC, YCA, Y, + YA, R, G, B, A).
    fpx:view=valueSpecify the FlashPix viewing object, which contains the specification + of a viewing transform. The viewing transform enables applications to + represent a set of simple edits as a list of "commands" which are applied + to the image in real time without altering the original image.
    heic:preserve-orientation=truePreserve the original EXIF orientation during HEIC decoding and rotate + the pixels accordingly. By default, EXIF orientation is reset to "1" to + match the actual orientation of pixels in HEIC. +
    icon:auto-resizeAutomatically stores multiple sizes when writing an ico image (requires a 256x256 input image).
    jp2:layer-number=valueSet the maximum number of quality layers to decode. Same for JPT, JC2, + and J2K.
    jp2:number-resolutions=valueSet the number of resolutions to encode.Same for JPT, JC2, and + J2K.
    jp2:progression-order=valueChoose from LRCP, RLCP, RPCL, PCRL or CPRL. Same for JPT, JC2, and + J2K.
    jp2:quality=value,value...Set the quality layer PSNR, given in dB. The order is from left to + right in ascending order. The default is a single lossless quality layer. + Same for JPT, JC2, and J2K.
    jp2:rate=valueSpecify the compression factor to use while writing JPEG-2000 files. + The compression factor is the reciprocal of the compression ratio. The + valid range is 0.0 to 1.0, with 1.0 indicating lossless compression. If + defined, this value overrides the -quality setting. A quality setting + of 75 results in a rate value of 0.06641. Same for JPT, JC2, and J2K.
    jp2:reduce-factor=valueSet the number of highest resolution levels to be discarded.Same for + JPT, JC2, and J2K.
    jpeg:block-smoothing=on|off
    jpeg:colors=valueSet the desired number of colors and let the JPEG encoder do the + quantizing.
    jpeg:dct-method=valueChoose from default, fastest, + float, ifast, and islow.
    jpeg:extent=valueRestrict the maximum JPEG file size, for example -define + jpeg:extent=400KB. The JPEG encoder will search for the highest + compression quality level that results in an output file that does not + exceed the value. The -quality option also will be respected + starting with version 6.9.2-5. Between 6.9.1-0 and 6.9.2-4, add -quality + 100 in order for the jpeg:extent to work properly. Prior to 6.9.1-0, the + -quality setting was ignored.
    jpeg:fancy-upsampling=on|off
    jpeg:optimize-coding=on|off
    jpeg:q-table=table
    jpeg:sampling-factor=sampling-factor-string
    jpeg:size=geometrySet the size hint of a JPEG image, for + example, -define jpeg:size=128x128. + It is most useful for increasing performance and reducing the memory + requirements when reducing the size of a large JPEG image.
    mng:need-cacheoffturn playback caching off for streaming MNG.
    pcl:fit-to-page=true
    pdf:fit-page=geometryGeometry specifies the scaling dimensions for resizing when the PDF is being read. The geometry is either WxH{%} or page size. No offsets are allowed. (introduced in IM 6.8.8-8)
    pdf:fit-to-page=true
    pdf:page-direction=right-to-left
    pdf:stop-on-error=true
    pdf:thumbnail=falseSkip writing a thumbnail when saving a PDF file.
    pdf:use-cropbox=true
    pdf:use-trimbox=true
    png:bit-depth=value
    png:color-type=valueDesired bit-depth and color-type for PNG output. You can force the + PNG encoder to use a different bit-depth and color-type than it would have + normally selected, but only if this does not cause any loss of image + quality. Any attempt to reduce image quality is treated as an error and no + PNG file is written. E.g., if you have a 1-bit black-and-white image, you + can use these "defines" to cause it to be written as an 8-bit grayscale, + indexed, or even a 64-bit RGBA. But if you have a 16-million color image, + you cannot force it to be written as a grayscale or indexed PNG. If you + wish to do this, you must use the appropriate -depth, + -colors, or -type directives to + reduce the image quality prior to using the PNG encoder. Note that in + indexed PNG files, "bit-depth" refers to the number of bits per index, + which can be 1, 2, 4, or 8. In such files, the color samples always have + 8-bit depth.
    png:compression-filter=valueValid values are 0 through 9. 0-4 are the corresponding PNG filters, + 5 means adaptive filtering except for images with a colormap, 6 means + adaptive filtering for all images, 7 means MNG "loco" compression, 8 means + Z_RLE strategy with adaptive filtering, and 9 means Z_RLE strategy with no + filtering.
    png:compression-level=valueValid values are 0 through 9, with 0 providing the least, but fastest + compression and 9 usually providing the best and always the slowest.
    png:compression-strategy=valueValid values are 0 through 4, meaning default, filtered, huffman_only, + rle, and fixed ZLIB compression strategy. If you are using an old zlib + that does not support Z_RLE (before 1.2.0) or Z_FIXED (before 1.2.2.2), + values 3 and 4, respectively, will use the zlib default strategy + instead.
    png:format=value valid values are png8, png24, + png32, png48, + png64, and png00. + This property is useful for specifying + the specific PNG format to be used, when the usual method of prepending the + format name to the output filename is inconvenient, such as when writing + a PNG-encoded ICO file or when using mogrify. + Value = png8 reduces the number of colors to 256, + only one of which may be fully transparent, if necessary. The other + values do not force any reduction of quality; it is an error to request + a format that cannot represent the image data without loss (except that + it is allowed to reduce the bit-depth from 16 to 8 for all formats). + Value = png24 and png48 + allow transparency, only if a single color is fully transparent and that + color does not also appear in an opaque pixel; such transparency is + written in a PNG tRNS chunk. + Value = png00 causes the image to inherit its + color-type and bit-depth from the input image, if the input was also + a PNG.
    png:exclude-chunk=value
    png:include-chunk=valueancillary chunks to be excluded from or included in PNG output. + +

    The value can be the name of a PNG chunk-type such + as bKGD, a comma-separated list of chunk-names + (which can include the word date, the word + all, or the word none). + Although PNG chunk-names are case-dependent, you can use all lowercase + names if you prefer.

    + +

    The "include-chunk" and "exclude-chunk" lists only affect the behavior + of the PNG encoder and have no effect on the PNG decoder.

    + +

    As a special case, if the sRGB chunk is excluded and + the gAMA chunk is included, the gAMA chunk will + only be written if gamma is not 1/2.2, since most decoders assume + sRGB and gamma=1/2.2 when no colorspace information is included in + the PNG file. Because the list is processed from left to right, you + can achieve this with a single define:

    + +
    -define png:include-chunk=none,gAMA
    +
    + +

    As a special case, if the sRGB chunk is not excluded and + the PNG encoder recognizes that the image contains the sRGB ICC profile, + the PNG encoder will write the sRGB chunk instead of the + entire ICC profile. To force the PNG encoder to write the sRGB + profile as an iCCP chunk in the output PNG instead of the + sRGB chunk, exclude the sRGB chunk.

    + +

    The critical PNG chunks IHDR, PLTE, + IDAT, and IEND cannot be excluded. Any such + entries appearing in the list will be ignored.

    + +

    If the ancillary PNG tRNS chunk is excluded and the + image has transparency, the PNG colortype is forced to be 4 or 6 + (GRAY_ALPHA or RGBA). If the image is not transparent, then the + tRNS chunk isn't written anyhow, and there is no effect + on the PNG colortype of the output image.

    + +

    The -strip option does the equivalent of the + following for PNG output:

    + +
    -define png:exclude-chunk=EXIF,iCCP,iTXt,sRGB,tEXt,zCCP,zTXt,date
    + +

    The default behavior is to include all known PNG ancillary chunks + plus ImageMagick's private vpAg ("virtual page") chunk, + and to exclude all PNG chunks that are unknown to ImageMagick, + regardless of their PNG "copy-safe" status as described in the + PNG specification.

    + +

    Any chunk names that are not known to ImageMagick are ignored + if they appear in either the "include-chunk" or "exclude-chunk" list. + The ancillary chunks currently known to ImageMagick are + bKGD, cHRM, gAMA, iCCP, + oFFs, pHYs, sRGB, tEXt, + tRNS, vpAg, and zTXt.

    + +

    You can also put date in the list to include or exclude + the "Date:create" and "Date:modify" text chunks that ImageMagick normally + inserts in the output PNG.

    png:ignore-crc[=true]When you know your image has no CRC or ADLER32 errors, this can speed + up decoding. It is also helpful in debugging bug reports from "fuzzers".
    png:preserve-colormap[=true]Use the existing image->colormap. Normally the PNG encoder will + try to optimize the palette, eliminating unused entries and putting + the transparent colors first. If this flag is set, that behavior + is suppressed.
    png:preserve-iCCP[=true]By default, the PNG decoder and encoder examine any ICC profile + that is present, either from an iCCP chunk in the PNG + input or supplied via an option, and if the profile is recognized + to be the sRGB profile, converts it to the sRGB chunk. + You can use -define png:preserve-iCCP to prevent + this from happening; in such cases the iCCP chunk + will be read or written and no sRGB chunk will be + written. There are some ICC profiles that claim to be sRGB but + have various errors that cause them to be rejected by libpng16; such + profiles are recognized anyhow and converted to the sRGB + chunk, but are rejected if the -define png:preserve-iCCP + is present. Note that not all "sRGB" ICC profiles are recognized + yet; we will add them to the list as we encounter them.
    png:swap-bytes[=true]The PNG specification requires that any multi-byte integers be stored + in network byte order (MSB-LSB endian). This option allows you to + fix any invalid PNG files that have 16-bit samples stored incorrectly + in little-endian order (LSB-MSB). The "-define png:swap-bytes" option + must appear before the input filename on the commandline. The swapping + is done during the libpng decoding operation.
    ps:imagemaskIf the ps:imagemask flag is defined, the PS3 and EPS3 coders will + create Postscript files that render bilevel images with the Postscript + imagemask operator instead of the image operator.
    psd:additional-info=all|selectiveThis option should only be used when converting from a PSD file to + another PSD file. This should be placed after the image is read. The two + options are 'all' and 'selective'. The 'selective' option will preserve + all additional information that is not related to the geometry of the + image. The 'all' option should only be used when the geometry of the + image has not been changed. This option is helpful when transferring + non-simple layers, such as adjustment layers from the input PSD file to + the output PSD file. If this option is not used, the additional + information will not be preserved. This define is available as of + Imagemagick version 6.9.5-8. +
    psd:alpha-unblend=offDisable new automatic un-blending of transparency with the base image + for the flattened layer 0 before adding the alpha channel to the output + image. This define must be placed before the input psd image. (Available + as of IM 6.9.2.5). The automatic un-blending is new to IM 6.9.2.5 and + prevents the transparency from being applied twice in the output + image. This option should be set before reading the image.
    psd:preserve-opacity-mask=trueThis option should only be used when converting from a PSD file to + another PSD file. It will preserve the opacity mask of a layer and add it + back to the layer when the image is saved. Setting this to 'true' will + enable this feature. This define is available as of Imagemagick version + 6.9.5-10. +
    svg:xml-parse-huge=trueEnable rendering of a very large SVG for which you trust the source
    tiff:alpha=associated|unassociated|unspecifiedSpecify the alpha extra samples as associated, unassociated or + unspecified.
    tiff:endian=msb|lsb
    tiff:exif-properties=FalseDisable reading the EXIF properties.
    tiff:gps-properties=FalseDisable reading the GPS properties.
    tiff:fill-order=msb|lsb
    tiff:ignore-layers=trueIgnore the Photoshop layers.
    tiff:ignore-tags=comma-separate-list-of-tag-IDsAllow one or more tag ID values to be ignored.
    tiff:predictor=[1, 2 or 3]A mathematical operator that is applied to the image data before an + encoding scheme is applied. The general idea is that subsequent pixels of + an image resemble each other. Thus, substracting the information from a + pixel that is already contained in previous one is likely to reduce its + information density considerably and aid subsequent compression. + 1 = No prediction scheme used before coding. 2 = Horizontal differencing. + 3 = Floating point horizontal differencing.
    tiff:rows-per-strip=valueSet the number of rows per strip.
    tiff:tile-geometry=WxHSet the tile size for pyramid tiffs. Requires the suffix + PTIF: before the outputname.

    PSEUDO-IMAGE FORMATS
    caption:max-pointsize=pointsizeLimit the maximum point size
    caption:split=booleansplit text if required to fit caption on canvas
    gradient:angle=angle (in degrees)For a linear gradient, this specifies the direction of + the gradient going from color1 to color2 in a clockwise + positive manner relative to north (up). For a radial + gradient, this specifies the rotation of the gradient in a + clockwise positive manner from its normal X-Y orientation. + Supported in Imagemagick 6.9.2-5.
    gradient:bounding-box=WxH+X+YLimit the gradient to a larger or smaller region than + the image dimensions. If the region defined by the bounding + box is smaller than the image, then color1 will be the color + of the background. + Supported in Imagemagick 6.9.2-5.
    gradient:center=x,ySpecify the coordinates of the center point for the + radial gradient. The default is the center of the image. + Supported in Imagemagick 6.9.2-5.
    gradient:direction=valueSpecify the direction of the linear gradient towards + the top/bottom/left/right or diagonal corners. The choices are: + NorthWest, North, Northeast, West, East, SouthWest, South, SouthEast. + Supported in Imagemagick 6.9.2-5.
    gradient:extent=valueSpecify the shape of an image centered radial gradient. + The choices are: Circle, Diagonal, Ellipse, Maximum, Minimum. + Circle and Maximum draw a circular radial gradient even for + rectangular shaped images of radius equal to the larger of + the half-width and half-height of the image. The Circle and + Maximum options are both equivalent to the default radial + gradient. The Minimum option draws a circular radial gradient + even for rectangular shaped images of radius equal to the + smaller of the half-width and half-height of the image. + The Diagonal option draws a circular radial gradient even + for rectangular shaped images of radius equal to the + half-diagonal of the image. The Ellipse options draws an + elliptical radial gradient for rectangular shaped images of + radii equal to half the width and half the height of the image. + Supported in Imagemagick 6.9.2-5.
    gradient:radii=x,ySpecify the x and y radii of the gradient. If the + x radius and the y radius are equal, the shape of the + radial gradient will be a circle. If they differ, then + the shape will be an ellipse. The default values are the + maximum of the half width and half height of the image. + Supported in Imagemagick 6.9.2-5.
    gradient:vector=x1,y1,x2,y2Specify the direction of the linear gradient going from + vector1 (x1,y1) to vector2 (x2,y2). Color1 (fromColor) will be + located at vector position x1,y1 and color2 (toColor) will be + located at vector position x2,y2. + Supported in Imagemagick 6.9.2-5.
    histogram:unique-colors=falseSuppress the textual listing of the image's unique colors.
    pango:align=left|center|right
    pango:auto-dir=true|false
    pango:ellipsize=start|middle|end
    pango:gravity-hint=natural|strong|line
    pango:hinting=none|auto|full
    pango:indent=points
    pango:justify=true|false
    pango:language=en_US|others
    pango:markup=true|false
    pango:single-paragraph=true|false
    pango:wrap=word|char|word-char
    pixel:compliance=valueSet the "pixel:" output format according to several standards. + The choices are SVG, None, Undefined, MVG, X11, XPM. The default + list values for (s)RGB colors in the form of (s)rgb(r,g,b) or + (s)rgba(r,g,b,a). Color names will no longer be presented. For sRGB or + RGB colors, the SVG, X11, XPM and None options lists color names, + if they exist. The MVG and Undefined options list hex values. When + colors are presented or converted to hue-based colorspaces, the values + listed will be integers for hue and percents for the other two components. + For other colorspaces, values may be listed as either percents or + fractional value. Setting the depth to 8 will limit values to the 8-bit + range, except for hue-based colors.
    txt:compliance=valueSet the "txt:" format for the values in parentheses according to + several standards. The choices are svg, none, undefined, mvg, x11, xpm. + The default will list values for (s)RGB colors in the quantum range. + The SVG, X11, XPM, MVG and None options lists values in the 8-bit range + for all Q-level compiles. The undefined option also lists values in the + quantum range. When colors are presented or converted to hue-based + colorspaces, the values listed will be integers for hue and percents for + the other two components. For other colorspaces, values may be listed as + either percents or fractional value. Setting the depth to 8 will limit + values to the 8-bit range, except for hue-based colors.

    Identify Defines

    identify:locate=minimum|maximumLocate the coordinates of one or more image minimum or maximum.
    identify:limit=numberLocate the coordinates for the number of minima or maxima specified.
    + +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/develop.html b/ImageMagick-6.9.12-44/www/develop.html new file mode 100644 index 0000000..ad32986 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/develop.html @@ -0,0 +1,236 @@ + + + + + + + + + + ImageMagick (legacy) – Develop + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Develop

    +

    The functionality of ImageMagick is typically utilized from the command-line or you can use the features from programs written in your favorite language. Choose from these interfaces: G2F (Ada), MagickCore (C), MagickWand (C), ChMagick (Ch), Magick++ (C++), JMagick (Java), JuliaIO (Julia), L-Magick (Lisp), Lua (LuaJIT), NMagick (Neko/haXe), Magick.NET (.NET), PascalMagick (Pascal), PerlMagick (Perl), IMagick (PHP), PythonMagick (Python), magick (R), RMagick (Ruby), or TclMagick (Tcl/TK). With a language interface, use ImageMagick to modify or create images dynamically and automagically.

    + +

    Choose from these language interfaces:

    + +
    +
    C
    + +
    Use the thread-safe MagickWand library to convert, compose, and edit images from the C language. There is also the low-level thread-safe MagickCore library for wizard-level developers.
    + +
    Ch
    + +
    ChMagick is a Ch binding to the MagickCore and MagickWand API. Ch is an embeddable C/C++ interpreter for cross-platform scripting.
    + +
    C++
    + +
    Magick++ provides a thread-safe object-oriented C++ interface to ImageMagick. See A Gentle Introduction to Magick++ for an introductory tutorial to Magick++. We include the source if you want to correct, enhance, or expand the tutorial.
    + +
    GO
    +
    GoImagick is a set of Go bindings to ImageMagick's MagickWand and MagickCore C APIs.
    + +
    Java
    + +
    JMagick provides an object-oriented Java interface to ImageMagick. Im4java is a pure-java interface to the ImageMagick command-line.
    + +
    Julia
    + +
    JuliaIO provides an object-oriented Julia interface to ImageMagick.
    + +
    LabVIEW
    + +
    LVOOP ImageMagick is an object-oriented LabVIEW interface to ImageMagick.
    + +
    Lisp
    + +
    CL-Magick provides a Common Lisp interface to the ImageMagick library.
    + +
    Lua
    + +
    Lua bindings to ImageMagick for LuaJIT using FFI.
    +
    +
    Lua bindings to ImageMagick for Lua using pure-C.
    + +
    Neko
    + +
    NMagick is a port of the ImageMagick library to the haXe and Neko platforms. It provides image manipulation capabilities to both web and desktop applications using Neko.
    + +
    .NET
    + +
    Use Magick.NET to convert, compose, and edit images from Windows .NET.
    +
    + +
    ImageMagickApp is a .NET application written in C# that utilizes the ImageMagick command line to allow conversion of multiple image formats to different formats.
    + +
    Pascal
    + +
    PascalMagick a Pascal binding for the MagickWand API and also the low-level MagickCore library. It works with Free Pascal / Lazarus and Delphi.
    + +
    Perl
    + +
    Use PerlMagick to convert, compose, and edit images from the Perl language.
    + +
    PHP
    + +
    IMagick is a native PHP extension to create and modify images using the ImageMagick API. Documentation for the extension is available here.
    + +
    +
    phMagick is a wrapper class for ImageMagick, wrapping the most common web image manipulation actions in easy to use functions, but allowing full access to ImageMagick's power by issuing system calls to it's command-line programs.
    + + +
    Python
    + + +
    Wand is a ctypes-based ImagedMagick binding library for Python.
    +
    +
    PythonMagick is an object-oriented Python interface to ImageMagick.
    +
    +
    PythonMagickWand is an object-oriented Python interface to MagickWand based on ctypes.
    +
    +
    Scilab Image Processing toolbox utilizes ImageMagick to do imaging tasks such as filtering, blurring, edge detection, thresholding, histogram manipulation, segmentation, mathematical morphology, color image processing, etc..
    + +
    REALbasic
    + +
    The MBS Realbasic ImageMagick is a plugin that utilizes the power of ImageMagick from within the RealBasic environment.
    + +
    R
    + +
    The magick package wraps the Magick++ STL to provide vectorized image processing in R. Get started with using the package vignette.
    + +
    Ruby
    + +
    RMagick is an interface between the Ruby programming language and the MagickCore image processing libraries. Get started with RMagick by perusing the documentation.
    +
    + +
    MagickWand for Ruby is an interface between the Ruby programming language and the MagickWand image processing libraries. Get started with MagickWand for PHP by perusing the documentation.
    + +
    +
    MiniMagick is a Ruby wrapper for ImageMagick command line. MiniMagick gives you convenient access to all the command line options ImageMagick supports.
    +
    + +
    QuickMagick is a gem for easily accessing ImageMagick command line tools from Ruby programs.
    + +
    Rust
    + +
    MagickRust is a MagickWand bindings for the Rust language.
    + +
    Tcl/Tk
    + +
    TclMagick a native Tcl-extension to the ImageMagick MagickWand API.
    + +
    XML RPC
    + +
    RemoteMagick is an XML-RPC web service that creates image thumbnails.
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/display.html b/ImageMagick-6.9.12-44/www/display.html new file mode 100644 index 0000000..c2abda7 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/display.html @@ -0,0 +1,611 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Display + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Image Viewer

    +

    Example UsageOption Summary

    + +

    Use the display program to display an image or image sequence on any X server. See Command Line Processing for advice on how to structure your display command or see below for example usages of the command.

    + +

    Example Usage

    + +

    We list a few examples of the display command here to illustrate its usefulness and ease of use. To get started, lets display an image in the JPEG format:

    + +
    display rose.jpg
    +
    + +

    To tile a slate texture onto the root window, use:

    + +
    display -size 1280x1024 -window root slate.png
    +
    + +

    To display a visual image directory of all your JPEG images, use:

    + +
    display 'vid:*.jpg'
    +
    + +

    The display program defaults to the X screen resolution. To display vector formats at their intended size, override the default resolution:

    + +
    display -density 72 drawing.svg
    +
    + +

    You can find additional examples of using display in Graphics from the Command Line. Further discussion is available in More Graphics from the Command Line and Examples of ImageMagick Usage.

    + + +

    Option Summary

    + +

    The display command recognizes these options. Click on an option to get more details about how that option works.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    -alphaon, activate, off, deactivate, set, opaque, copy", +transparent, extract, background, or shape the alpha channel
    -antialiasremove pixel-aliasing
    -authenticate valuedecrypt image with this password
    -backdropdisplay image centered on a backdrop
    -background colorbackground color
    -border geometrysurround image with a border of color
    -bordercolor colorborder color
    -channel typeapply option to select image channels
    -clipclip along the first path from the 8BIM profile
    -clip-path idclip along a named path from the 8BIM profile
    -coalescemerge a sequence of images
    -colormap typeShared or Private
    -colors valuepreferred number of colors in the image
    -colorspace typeset image colorspace
    -comment stringannotate image with comment
    -compress typeimage compression type
    -contrastenhance or reduce the image contrast
    -crop geometrypreferred size and location of the cropped image
    -debug eventsdisplay copious debugging information
    -decipher filenameconvert cipher pixels to plain
    -define format:optiondefine one or more image format options
    -delay centisecondsdisplay the next image after pausing
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -despecklereduce the speckles within an image
    -display serverget image or font from this X server
    -dispose methodlayer disposal method
    -dither methodapply error diffusion to image
    -edge radiusapply a filter to detect edges in the image
    -endian typeendianness (MSB or LSB) of the image
    -enhanceapply a digital filter to enhance a noisy image
    -equalizeperform histogram equalization to an image
    -extract geometryextract area from image
    -filter typeuse this filter when resizing an image
    -flattenflatten a sequence of images
    -flipflip image in the vertical direction
    -flopflop image in the horizontal direction
    -frame geometrysurround image with an ornamental border
    -fuzz distancecolors within this distance are considered equal
    -gamma valuelevel of gamma correction
    -geometry geometrypreferred size or location of the image
    -gravity geometryhorizontal and vertical backdrop placement
    -helpprint program options
    -identifyidentify the format and characteristics of the image
    -immutable typeprohibit image edits
    -interlace typetype of image interlacing scheme
    -interpolate methodpixel color interpolation method
    -label nameassign a label to an image
    -limit type valuepixel cache resource limit
    -log formatformat of debugging information
    -map filenametransform image colors to match this set of colors
    -mattecolor colorframe color
    -monitormonitor progress
    -monochrometransform image to black and white
    -negatereplace each pixel with its complementary color
    -normalizetransform image to span the full range of colors
    -page geometrysize and location of an image canvas (setting)
    -profile filenameadd, delete, or apply an image profile
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -raise valuelighten/darken image edges to create a 3-D effect
    -regard-warningspay attention to warning messages.
    -remote commandexecute a command in an remote display process
    -resample geometrychange the resolution of an image
    -resize geometryresize the image
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -roll geometryroll an image vertically or horizontally
    -rotate degreesapply Paeth rotation to the image
    -sample geometryscale image with pixel sampling
    -sampling-factor geometryhorizontal and vertical sampling factor
    -scene valueimage scene number
    -seed valueseed a new sequence of pseudo-random numbers
    -segment valuessegment an image
    -set attribute valueset an image attribute
    -sharpen geometrysharpen the image
    -size geometrywidth and height of image
    -stripstrip image of all profiles and comments
    -thumbnail geometrycreate a thumbnail of the image
    -transparent-color colortransparent color
    -black-threshold valueforce all pixels below the threshold into black
    -trimtrim image edges
    -update secondsdetect when image file is modified and redisplay
    -verboseprint detailed information about the image
    -versionprint version information
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    -visualdisplay image using this visual type
    -window iddisplay image to background of this window
    -window-group idexit program when this window id is destroyed
    -write filenamewrite images to this file
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/distribute-pixel-cache.html b/ImageMagick-6.9.12-44/www/distribute-pixel-cache.html new file mode 100644 index 0000000..8e67e32 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/distribute-pixel-cache.html @@ -0,0 +1,139 @@ + + + + + + + + + + ImageMagick (legacy) – Distributed Pixel Cache + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Distributed Pixel Cache

    +

    A distributed pixel cache is an extension of the traditional pixel cache available on a single host. The distributed pixel cache may span multiple servers so that it can grow in size and transactional capacity to support very large images or large image sequences. Start up the pixel cache server on one or more hosts. When you read or operate on an image and the local pixel cache resources are exhausted, ImageMagick contacts one or more of these remote pixel servers to store or retrieve pixels.

    +

    For really large images or large image sequences, or if there is limited resources on your host, you can utilize a distributed pixel cache on one or more remote hosts. To get started, first set your shared secret in the policy.xml security policy configuration file:

    +
    +<policy domain="cache" name="shared-secret" value="passhrase" stealth="true"/>
    +
    + +

    Here we create two distributed pixel caches and utilize them from our desktop:

    +
    convert -distribute-cache 6668 &  # start on 192.168.100.50
    +convert -distribute-cache 6668 &  # start on 192.168.100.51
    +convert -limit memory 1GiB -limit map 2GiB -limit disk 4GiB \
    +  -define registry:cache:hosts=192.168.100.50:6668,192.168.100.51:6668 \
    +  myhugeimage.jpg -sharpen 5x2 myhugeimage.png
    +
    +

    For large image sequences, the servers are contacted in a round-robin fashion to distribute the load over multiple distributed pixel caches (assuming you have a host list rather than a single host). In our example, some modest resources are available on the desktop as defined by the -limit option. For smaller images, they are allocated on the desktop up to the specified limits.

    +

    Your image processing tasks are likely to perform slower when utilizing a distributed pixel cache due to pixels shuffling between the client and the server over a network. Algorithms that access virtual pixels (e.g. -sharpen) are noticeably slower, up to 3 times slower, than algorithms that only access authentic pixels (e.g. -negate) due to increased network traffic.

    +

    A client can only contact a compatible distributed pixel cache server. Compatibility requires the same ImageMagick library interface, quantum depth, HDRI status, OS word size, and endianness. The distributed pixel cache checks these attributes and exits if these requirements are not met.

    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/download.html b/ImageMagick-6.9.12-44/www/download.html new file mode 100644 index 0000000..3ec70c6 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/download.html @@ -0,0 +1,482 @@ + + + + + + + + + + ImageMagick (legacy) – Download + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Download

    +

    Linux Binary ReleaseMac OS X Binary ReleaseiOS Binary ReleaseWindows Binary Release

    + +

    You can install ImageMagick from source. However, if you don't have a proper development environment or if you're anxious to get started, download a ready-to-run Linux or Windows executable. Before you download, you may want to review recent changes to the ImageMagick distribution.

    + +

    ImageMagick source and binary distributions are available from a variety of FTP and Web mirrors around the world.

    + +

    Linux Binary Release

    + +

    These are the Linux variations that we support. If your system is not on the list, try installing from source. Although ImageMagick runs fine on a single core computer, it automagically runs in parallel on multi-core systems reducing run times considerably.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VersionDescription
    magickComplete portable application on Linux, no installation required. Just download and run. This AppImage has an open security policy. ImageMagick recommended practices strongly encourage you to configure a security policy that suits your local environment. Simply add a custom security policy in your local path, .e.g., `~/.config/ImageMagick/policy.xml` and verify with this command: `./magick -list policy`.
    ImageMagick-6.9.12-40.x86_64.rpmRedhat / CentOS 8.3 x86_64 RPM
    ImageMagick-libs-6.9.12-40.x86_64.rpmRedhat / CentOS 8.3 x86_64 RPM
    ImageMagick RPM'sDevelopment, Perl, C++, and documentation RPM's.
    ImageMagick-i386-pc-solaris2.11.tar.gzSolaris Sparc 2.11
    ImageMagick-i686-pc-cygwin.tar.gzCygwin
    ImageMagick-i686-pc-mingw32.tar.gzMinGW
    + +

    Verify its message digest.

    + +

    ImageMagick RPM's are self-installing. Simply type the following command and you're ready to start using ImageMagick:

    + +
      $ rpm -Uvh ImageMagick-6.9.12-40.x86_64.rpm

    You'll need the libraries as well:

    +
      $ rpm -Uvh ImageMagick-libs-6.9.12-40.x86_64.rpm
    +

    Note, if there are missing dependencies, install them from the EPEL repo.

    + +

    For other systems, create (or choose) a directory to install the package into and change to that directory, for example:

    + +
    cd $HOME
    + +

    Next, extract the contents of the package. For example:

    + +
    tar xvzf ImageMagick.tar.gz
    + +

    Set the MAGICK_HOME environment variable to the path where you extracted the ImageMagick files. For example:

    + +
      $ export MAGICK_HOME="$HOME/ImageMagick-6.9.12"
    +

    If the bin subdirectory of the extracted package is not already in your executable search path, add it to your PATH environment variable. For example:

    + +
    export PATH="$MAGICK_HOME/bin:$PATH
    + + +

    On Linux and Solaris machines add $MAGICK_HOME/lib to the LD_LIBRARY_PATH environment variable:

    + +
    LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$MAGICK_HOME/lib
    +export LD_LIBRARY_PATH
    + +

    Finally, to verify ImageMagick is working properly, type the following on the command line:

    + +
    convert logo: logo.gif
    +identify logo.gif
    +display logo.gif
    + +

    Congratulations, you have a working ImageMagick distribution under Linux or Linux and you are ready to use ImageMagick to convert, compose, or edit your images or perhaps you'll want to use one of the Application Program Interfaces for C, C++, Perl, and others.

    + +

    Mac OS X Binary Release

    + +

    We recommend Homebrew which provides pre-built binaries for Mac (some users prefer MacPorts). Download HomeBrew and type:

    + +
    brew install imagemagick
    + +

    ImageMagick depends on Ghostscript fonts. To install them, type:

    + +
    brew install ghostscript
    + +

    The brew command downloads and installs ImageMagick with many of its delegate libraries (e.g. JPEG, PNG, Freetype, etc). Homebrew no longer allows configurable builds; if you need different compile options (e.g. librsvg support), you can download the ImageMagick Mac OS X distribution we provide:

    + +
    + + + + + + + + + + + + + + +
    VersionDescription
    ImageMagick-x86_64-apple-darwin20.1.0.tar.gzmacOS High Sierra
    + +

    Verify its message digest.

    + +

    Create (or choose) a directory to install the package into and change to that directory, for example:

    + +
    cd $HOME
    + +

    Next, extract the contents of the package. For example:

    + +
    tar xvzf ImageMagick-x86_64-apple-darwin20.1.0.tar.gz
    + +

    Set the MAGICK_HOME environment variable to the path where you extracted the ImageMagick files. For example:

    + +
      $ export MAGICK_HOME="$HOME/ImageMagick-6.9.12"
    +

    If the bin subdirectory of the extracted package is not already in your executable search path, add it to your PATH environment variable. For example:

    + +
    export PATH="$MAGICK_HOME/bin:$PATH"
    + + +

    Set the DYLD_LIBRARY_PATH environment variable:

    + +
    export DYLD_LIBRARY_PATH="$MAGICK_HOME/lib/"
    + +

    Finally, to verify ImageMagick is working properly, type the following on the command line:

    + +
    convert logo: logo.gif
    +identify logo.gif
    +display logo.gif
    + +

    Note, the display program requires the X11 server available on your Mac OS X installation DVD. Once that is installed, you will also need to set export DISPLAY=:0.

    + +

    The best way to deal with all the exports is to put them at the end of your .profile file

    + +

    Congratulations, you have a working ImageMagick distribution under Mac OS X and you are ready to use ImageMagick to convert, compose, or edit your images or perhaps you'll want to use one of the Application Program Interfaces for C, C++, Perl, and others.

    + +

    iOS Binary Release

    + +

    ~Claudio provides iOS builds of ImageMagick.

    + +

    Download iOS Distribution

    + +

    You can download the iOS distribution directly from ImageMagick's repository.

    + +

    There are always 2 packages for the compiled ImageMagick:

    + +
      +
    • iOSMagick-VERSION-libs.zip
    • +
    • iOSMagick-VERSION.zip
    • +
    + +

    The first one includes headers and compiled libraries that have been used to compile ImageMagick. Most users would need this one.

    + +

    ImageMagick compiling script for iOS OS and iOS Simulator

    + +

    To run the script:

    +
    ./imagemagick_compile.sh VERSION
    +

    where VERSION is the version of ImageMagick you want to compile (i.e.: 6.9.12-40, svn, ...)

    + +

    This script compiles ImageMagick as a static library to be included in iOS projects and adds support for

    +
      +
    • png
    • +
    • jpeg
    • +
    • tiff
    • +
    + +

    Upon successful compilation a folder called IMPORT_ME is created on your ~/Desktop. You can import it into your Xcode project.

    + +

    Xcode project settings

    + +

    After including everything into Xcode please also make sure to have these settings (Build tab of the project information):

    +
      +
    • Other Linker Flags: -lMagickCore-Q16 -lMagickWand-Q16 -ljpeg -lpng -lbz2 -lz
    • +
    • Header Search Paths: $(SRCROOT) - make it Recursive
    • +
    • Library Search Paths: $(SRCROOT) - make it Recursive
    • +
    + +

    On the lower left click on the small-wheel and select: Add User-Defined Setting

    +
      +
    • Key: OTHER_CFLAGS
    • +
    • Value: -Dmacintosh=1
    • +
    + +

    Sample project

    + +

    A sample project is available for download. It is not updated too often, but it does give an idea of all the settings and some ways to play around with ImageMagick in an iOS application.

    + +

    Windows Binary Release

    + +

    ImageMagick runs on Windows 11 (x86 & x64), Windows 10 (x86 & x64), Windows 8 (x86 & x64), Windows 7 (x86 & x64), Windows Server 2012, Windows Vista (x86 & x64) with Service Pack 2, Windows Server 2008 (x86 & x64) with Service Pack 2, and Windows Server 2008 R2 (x64).

    + +

    The amount of memory can be an important factor, especially if you intend to work on large images. A minimum of 512 MB of RAM is recommended, but the more RAM the better. Although ImageMagick runs well on a single core computer, it automagically runs in parallel on multi-core systems reducing run times considerably.

    + +

    The Windows version of ImageMagick is self-installing. Simply click on the appropriate version below and it will launch itself and ask you a few installation questions. Versions with Q8 in the name are 8 bits-per-pixel component (e.g. 8-bit red, 8-bit green, etc.), whereas, Q16 in the filename are 16 bits-per-pixel component. A Q16 version permits you to read or write 16-bit images without losing precision but requires twice as much resources as the Q8 version. Versions with dll in the filename include ImageMagick libraries as dynamic link libraries. Unless you have a Windows 32-bit OS, we recommend this version of ImageMagick for 64-bit Windows:

    + +
    + + + + + + + + + + + + + + +
    VersionDescription
    ImageMagick-6.9.12-40-Q16-HDRI-x64-dll.exeWin64 dynamic at 16 bits-per-pixel component with High-dynamic-range imaging enabled
    + +

    Or choose from these alternate Windows binary distributions:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +I + + + + + + + + + + + + + + + + + + + + + +
    VersionDescription
    ImageMagick-6.9.12-40-Q16-x64-static.exeWin64 static at 16 bits-per-pixel component
    ImageMagick-6.9.12-40-Q8-x64-dll.exeWin64 dynamic at 8 bits-per-pixel component
    ImageMagick-6.9.12-40-Q8-x64-static.exeWin64 static at 8 bits-per-pixel component
    ImageMagick-6.9.12-40-Q16-x64-dll.exeWin64 dynamic at 16 bits-per-pixel component
    ImageMagick-6.9.12-40-Q16-HDRI-x64-dll.exeWin64 dynamic at 16 bits-per-pixel component with high dynamic-range imaging enabled
    ImageMagick-6.9.12-40-Q16-HDRI-x64-static.exeWin64 static at 16 bits-per-pixel component with high dynamic-range imaging enabled
    ImageMagick-6.9.12-40-Q16-x86-dll.exeWin32 dynamic at 16 bits-per-pixel component
    ImageMagick-6.9.12-40-Q16-x86-static.exeWin32 static at 16 bits-per-pixel component
    ImageMagick-6.9.12-40-Q8-x86-dll.exeWin32 dynamic at 8 bits-per-pixel component
    ImageMagick-6.9.12-40-Q8-x86-static.exeWin32 static at 8 bits-per-pixel component
    ImageMagick-6.9.12-40-Q16-HDRI-x86-dll.exeWin32 dynamic at 16 bits-per-pixel component with high dynamic-range imaging enabled
    ImageMagick-6.9.12-40-Q16-HDRI-x86-static.exeWin32 static at 16 bits-per-pixel component with high dynamic-range imaging enabled
    ImageMagick-6.9.12-portable-Q16-x64.zipPortable Win64 static at 16 bits-per-pixel component. Just copy to your host and run (no installer, no Windows registry entries).
    ImageMagick-6.9.12-portable-Q16-x86.zipPortable Win32 static at 16 bits-per-pixel component. Just copy to your host and run (no installer, no Windows registry entries).
    ImageMagick-6.9.12-portable-Q8-x64.zipPortable Win64 static at 8 bits-per-pixel component. Just copy to your host and run (no installer, no Windows registry entries).
    ImageMagick-6.9.12-portable-Q8-x86.zipPortable Win32 static at 8 bits-per-pixel component. Just copy to your host and run (no installer, no Windows registry entries).
    ImageMagick-6.9.12-portable-Q16-HDRI-x64.zipPortable Win64 static at 16 bits-per-pixel component with high dynamic-range imaging enabled. Just copy to your host and run (no installer, no Windows registry entries).
    ImageMagick-6.9.12-portable-Q16-HDRI-x86.zipPortable Win32 static at 16 bits-per-pixel component with high dynamic-range imaging enabled. Just copy to your host and run (no installer, no Windows registry entries).
    + +

    Verify its message digest.

    + +

    To verify ImageMagick is working properly, type the following in an Command Prompt window:

    + +
    convert logo: logo.gif
    +convert identify logo.gif
    +convert logo.gif win:
    + +

    If you have any problems, you likely need vcomp120.dll. To install it, download Visual C++ Redistributable Package.

    + +

    Note, use a double quote (") rather than a single quote (') for the ImageMagick command line under Windows:

    + +
    convert "e:/myimages/image.png" "e:/myimages/image.jpg"
    +

    Use two double quotes for VBScript scripts:

    +
    Set objShell = wscript.createobject("wscript.shell")
    +objShell.Exec("convert ""e:/myimages/image.png"" ""e:/myimages/image.jpg""")
    + +

    Congratulations, you have a working ImageMagick distribution under Windows and you are ready to use ImageMagick to convert, compose, or edit your images or perhaps you'll want to use one of the Application Program Interfaces for C, C++, Perl, and others.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/escape.html b/ImageMagick-6.9.12-44/www/escape.html new file mode 100644 index 0000000..5821ceb --- /dev/null +++ b/ImageMagick-6.9.12-44/www/escape.html @@ -0,0 +1,953 @@ + + + + + + + + + + ImageMagick (legacy) – Format and Print Image Properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    There are copious amounts of extra data associated with images (metadata), beyond the actual image pixels. This metadata can be useful, either for display, or for various calculations, or in modifying the behavior of later image processing operations. You can utilize percent escapes in a number of options, for example in -format or in montage -label, to print various properties and other settings associated with an image.

    + +
    + + + + + + + + + + + + + + + + +
    Profile DataSuch as EXIF: data, containing focal lengths, exposures, dates, and in + come cases GPS locations. +
    AttributesThese are directly involved with image data, and more commonly + modified as part of normal image processing. These include + width, height, depth, image type (colorspace), timing delays, and + background color. Most specific percent escapes is to access this + information. +
    PropertiesThese are stored as a table of free form strings, and are (if possible) + saved with the image (especially in MIFF and PNG image file formats). + These include: Labels, Captions, Comments. +
    ArtifactsThese are various operational (expert) settings that are saved for + use by various operators, or by the user for future use. It is just + a table of free-form strings. They are not saved with the image when + written. See Artifacts and Options below for details. +
    OptionsAlso operational (expert) settings that are saved for + use by various operators, but are set globally for use by a whole + image list (also not saved). See Artifacts and Options below. +
    + +

    Percent Escape Handling

    + +

    If you request a percent escape such as %[key] the setting +is looked for in the following order until the first match has been +found...

    + +
      +
    1. Handle special prefixes such as 'artifact:' 'option:' 'exif:', or + 'fx:'. This includes and calculations and or globs of those prefixes such + as 'exif:*' or 'artifact:*' (see below).
    2. + +
    3. If key contains a glob pattern (but no known prefix) + search free-form properties table.
    4. + +
    5. If key is a special image 'attribute' name (see list + above) return the associated or calculated image attribute.
    6. + +
    7. Search for setting as a free-form 'property'
    8. +
    9. Search for setting as a free-form 'artifact'
    10. +
    11. Search for setting as a free-form 'option'
    12. + +
    13. Replace escape with empty string, and perhaps produce a warning.
    14. +
    + +

    Remember, all long name forms of percent escapes are handled in a is case +insensitive manner.

    + +

    As of IM v6.8.0-5 you can now access the Artifact and Option +free-form string tables directly, allowing you to override the above sequence, +and avoid accessing an attribute or property of the same name.

    + +
    %[artifact:setting]
    +%[option:setting]
    +
    + +

    Escape handling requires access to an image container. If none are available, a blank image is created to ensure the expression can be processed and a value returned. For example, convert -print "%[fx:.8765/3.14]" null: null:.

    + + +

    Single Letter Attribute Percent Escapes

    + +

    Here are common single letter escapes (short form) is used to report the most +common attributes and properties of an image, such as: the image filename +filename, type, width, height.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    \backslash, the next character is literal and not subject to interpretation
    \nnewline
    \rcarriage return
    <less-than character.
    >greater-than character.
    &ampersand character.
    %%a percent sign
    %bfile size of image read in (use -precision 16 to force results in B)
    %ccomment meta-data property
    %ddirectory component of path
    %efilename extension or suffix
    %ffilename (including suffix)
    %glayer canvas page geometry (equivalent to "%Wx%H%X%Y")
    %hcurrent image height in pixels
    %iimage filename (note: becomes output filename for "info:")
    %kCALCULATED: number of unique colors
    %llabel meta-data property
    %mimage file format (file magic)
    %nnumber of images in current image sequence, reported once per frame
    %ooutput filename (used for delegates)
    %pindex of image in current image list
    %qquantum depth (compile-time constant)
    %rimage class and colorspace
    %sscene number (from input unless re-assigned)
    %tfilename without directory or extension (suffix)
    %uunique temporary filename (used for delegates)
    %wcurrent width in pixels
    %xx resolution (density)
    %yy resolution (density)
    %zimage depth (as read in unless modified, image save depth)
    %Aimage transparency channel enabled (true/false)
    %Bfile size of image read in bytes
    %Cimage compression type
    %Dimage GIF dispose method
    %Goriginal image size (%wx%h; before any resizes)
    %Hpage (canvas) height
    %MMagick filename (original file exactly as given, including read mods)
    %Nnumber of images in current image sequence, reported once per image sequence
    %Opage (canvas) offset ( = %X%Y )
    %Ppage (canvas) size ( = %Wx%H )
    %Qimage compression quality ( 0 = default )
    %S?? scenes ??
    %Timage time delay (in centi-seconds)
    %Uimage resolution units
    %Wpage (canvas) width
    %Xpage (canvas) x offset (including sign)
    %Ypage (canvas) y offset (including sign)
    %Zunique filename (used for delegates)
    %@CALCULATED: trim bounding box (without actually trimming)
    %#CALCULATED: 'signature' hash of image values
    + +

    Here is a sample command and its output for an image with filename +bird.miff and whose width is 512 and height is 480.

    + +
    -> identify -format "%m:%f %wx%h" bird.miff
    +MIFF:bird.miff 512x480
    +
    + +

    Note that all single letter percent escapes can also be used using long +form (from IM version 6.7.6-9, see next). For example %[f] is +equivalent to the %f short form.

    + +

    WARNING: short form percent escapes are NOT performed when the percent +is after a number. For example, 10%x10 does not expand the +%x as a percent escape. If you specifically want to expand the +'x', use the long form which overrides this special case. EG: +10%[x]10.

    + +

    Also be warned that calculated attributes can take some time to generate, +especially for large images.

    + +

    Long Form Attribute Percent Escapes

    + +

    In addition to the above specific and calculated attributes are recognized +when enclosed in braces (long form):

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    %[basename]base filename, no suffixes (as %t)
    %[bit-depth]Actual bit-depth of the pixel data
    %[bounding-box]upper left and lower right corners of the image bounding box
    %[caption]caption meta-data property
    %[caption:pointsize]returns the pointsize computed during caption: processing (as of IM 6.9.1-0)
    %[channels]??? channels in use - colorspace ???
    %[colorspace]colorspace of Image Data (excluding transparency)
    %[compose]
    %[compression]image compression type (as of IM 6.9.6-6)
    %[copyright]ImageMagick Copyright String
    %[depth]depth of image for write (as input unless changed)
    %[deskew:angle]The deskew angle in degrees of rotation
    %[directory]directory part of filename (as %d)
    %[distortion]how well an image resembles a reference image (-compare)
    %[entropy]CALCULATED: entropy of the image
    %[extension]extension part of filename (as %e)
    %[gamma]value of image gamma
    %[group]??? window group ???
    %[height]original height of image (when it was read in)
    %[input]
    %[interlace]Image interlace mode (as of IM 6.9.6-6)
    %[kurtosis]CALCULATED: kurtosis statistic of image
    %[label]label meta-data property
    %[label:pointsize]returns the pointsize computed during label: processing (as of IM 6.9.1-0)
    %[magick]coder used to read image (not the file suffix)
    %[max]CALCULATED: maximum value statistic of image
    %[mean]CALCULATED: average value statistic of image
    %[min]CALCULATED: minimum value statistic of image
    %[opaque]CALCULATED: is image fully-opaque?
    %[orientation]image orientation
    %[page]Virtual canvas (page) geometry
    %[papersize:name]paper size for name in pixels at 72DPI (e.g. papersize:A4)
    %[printsize.x]X printsize
    %[printsize.y]Y printsize
    %[profile:icc]ICC profile info
    %[profile:icm]ICM profile info
    %[profiles]list of any embedded profiles
    %[quality]Image quality value (as of IM 6.9.6-6)
    %[rendering-intent]Image rendering intent (as of IM 6.9.6-6)
    %[resolution.x]X density (resolution) without units
    %[resolution.y]Y density (resolution) without units
    %[scene]original scene number of image in input file
    %[size]original size of image (when it was read in)
    %[skewness]CALCULATED: skewness statistic of image
    %[standard-deviation]CALCULATED: standard deviation statistic of image
    %[type]CALCULATED: image type
    %[unique]unique temporary filename ???
    %[units]image resolution units
    %[version]Version Information of this running ImageMagick
    %[width]original width of image (when it was read in)
    %[zero]zero (unique filename for delegate use)
    + +

    Properties

    + +

    All other long forms of percent escapes (not single letter long form) are +handled in a case insensitive manner. Such escapes will attempt to look +up that name specific data sources.

    + +

    The primary search space (if not a specific attribute listed above) is +a free-form property string. Such strings are associated and saved with +images, and are typically set using either the -set +CLI option (or API equivalent), or from special convenience options +(such as -label, -comment, -caption).

    + +

    These convenience options are globally saved (as 'global options' so thay can +be set before images are read), and later are transferred to the property of +individual images, only when they are read in. At that time any internal +percent escape present is then handled.

    + +

    To change a property of an image already in memory, you need to use -set. +

    + +

    Note that properties, like attributes (and profiles), are saved with +images when write, if the image file format allows.

    + + +

    Artifacts and Options

    + +

    The previous percent escapes are associated with the primary Attributes and +Properties. Which is the original and primary focus of such percent escapes. +

    + +

    However there are many operational settings that are used by various +ImageMagick operators that can be useful to set and later access. These +consist of per-image Artifacts, and Global options (associated with a list of +images, typically the current image list).

    + +

    Note that the major difference between an artifact and a property is that +artifacts, being an internal operational setting, is not saved with images (if +such is possible).

    + +

    For example when you use -define 'distort:viewport=100x100' you +are in fact generating a global option, which the -distort operator will use to modify its behavior (distorted output +image 'view').

    + +

    An Option is essentially an Artifact that has been stored globally as part +of a list of images (specifically a 'Wand' of images). As such they are +identical, in that a Option, is simply a global Artifact for all the +associated images.

    + +

    As such you can use -set 'option:distort:viewport' '100x100' to +achieve the same result of setting a Artifact for the disort operation to use. +

    + +

    Internal Handling of a Global Option...

    + +

    The Core library ('MagickCore') does not generally directly understand +Global Options. As such, continuing the previous example, the +DistortImages() function only looks up an artifact to discover if +a 'viewport' has been provided to it.

    + +

    How Global Options are used when a library function requests an Artifact is +one of the key differences between IMv6 and IMv7.

    + +

    Before each operator, any global Options +are copied to per-image Artifacts, for every image in the current image list. +This allows various operators to find its operational 'defines' or Artifacts. +

    + +

    Note that many API's that do not use Wands (PerlMagick for example using +arrays of images rather than a Wand). In these API's you will not have Global +Options, only per-image Artifacts.

    + +

    In summery a Global Option, if available, is equivalent to a per-image +Artifact.

    + + +

    Glob-Pattern Listing of Properties, Artifacts and Options

    + +

    The setting can contain a glob pattern. As such you can +now list all free-form string properties, artifacts, and options, (but not +specific image attributes) using...

    + +
    convert ... \
    +   -print "__Properties__\n%[*]" \
    +   -print "__Artifacts__\n%[artifact:*]" \
    +   -print "__Options__\n%[option:*]" \
    +   ...
    +
    + +

    The format of glob patterns are very specific and as such is generally +only used to list specific settings, such as when debugging, rather than being +used for image processing use.

    + + +

    Calculated Percent Escape Prefixes

    + +

    There are some special prefixes (before the first ':') which performs +calculations based on the user provided string that follows that prefix. For +example you can do a numerical calculation use %[fx:...] to +evaluate the given FX expressions:

    + +
    %[fx:expression]
    +
    + +

    Use pixel: or hex: to evaluate a pixel color as defined by the FX +expression:

    + +
    %[pixel:expression]
    +
    + +

    Use -define to specify the color compliance (e.g. -define pixel:compliance=css)

    . + +

    Specific Profile Percent Escape Prefixes

    + +

    You can also use the following special formatting syntax to print EXIF +mage meta-data that was included in the image read in:

    + +
    %[EXIF:tag]
    +
    + +

    Choose tag from the following:

    + +
    
    +*  (print all EXIF tags, in keyword=data format)
    +!  (print all EXIF tags, in tag_number data format)
    +#hhhh (print data for EXIF tag #hhhh)
    +ImageWidth
    +ImageLength
    +BitsPerSample
    +Compression
    +PhotometricInterpretation
    +FillOrder
    +DocumentName
    +ImageDescription
    +Make
    +Model
    +StripOffsets
    +Orientation
    +SamplesPerPixel
    +RowsPerStrip
    +StripByteCounts
    +XResolution
    +YResolution
    +PlanarConfiguration
    +ResolutionUnit
    +TransferFunction
    +Software
    +DateTime
    +Artist
    +WhitePoint
    +PrimaryChromaticities
    +TransferRange
    +JPEGProc
    +JPEGInterchangeFormat
    +JPEGInterchangeFormatLength
    +YCbCrCoefficients
    +YCbCrSubSampling
    +YCbCrPositioning
    +ReferenceBlackWhite
    +CFARepeatPatternDim
    +CFAPattern
    +BatteryLevel
    +Copyright
    +ExposureTime
    +FNumber
    +IPTC/NAA
    +EXIFOffset
    +InterColorProfile
    +ExposureProgram
    +SpectralSensitivity
    +GPSInfo
    +ISOSpeedRatings
    +OECF
    +EXIFVersion
    +DateTimeOriginal
    +DateTimeDigitized
    +ComponentsConfiguration
    +CompressedBitsPerPixel
    +ShutterSpeedValue
    +ApertureValue
    +BrightnessValue
    +ExposureBiasValue
    +MaxApertureValue
    +SubjectDistance
    +MeteringMode
    +LightSource
    +Flash
    +FocalLength
    +MakerNote
    +UserComment
    +SubSecTime
    +SubSecTimeOriginal
    +SubSecTimeDigitized
    +FlashPixVersion
    +ColorSpace
    +EXIFImageWidth
    +EXIFImageLength
    +InteroperabilityOffset
    +FlashEnergy
    +SpatialFrequencyResponse
    +FocalPlaneXResolution
    +FocalPlaneYResolution
    +FocalPlaneResolutionUnit
    +SubjectLocation
    +ExposureIndex
    +SensingMethod
    +FileSource
    +SceneType
    +
    +
    +

    Surround the format specification with quotation marks to prevent your +shell from misinterpreting any spaces and square brackets.

    + +

    The following special formatting syntax can be used to print IPTC +information contained in the file:

    + +
    %[IPTC:dataset:record]
    +
    + +

    Select dataset and record from the following:

    + +
    +  Envelope Record
    +  1:00  Model Version
    +  1:05  Destination
    +  1:20  File Format
    +  1:22  File Format Version
    +  1:30  Service Identifier
    +  1:40  Envelope Number
    +  1:50  Product ID
    +  1:60  Envelope Priority
    +  1:70  Date Sent
    +  1:80  Time Sent
    +  1:90  Coded Character Set
    +  1:100  UNO (Unique Name of Object)
    +  1:120  ARM Identifier
    +  1:122  ARM Version
    +
    +Application Record
    +  2:00  Record Version
    +  2:03  Object Type Reference
    +  2:05  Object Name (Title)
    +  2:07  Edit Status
    +  2:08  Editorial Update
    +  2:10  Urgency
    +  2:12  Subject Reference
    +  2:15  Category
    +  2:20  Supplemental Category
    +  2:22  Fixture Identifier
    +  2:25  Keywords
    +  2:26  Content Location Code
    +  2:27  Content Location Name
    +  2:30  Release Date
    +  2:35  Release Time
    +  2:37  Expiration Date
    +  2:38  Expiration Time
    +  2:40  Special Instructions
    +  2:42  Action Advised
    +  2:45  Reference Service
    +  2:47  Reference Date
    +  2:50  Reference Number
    +  2:55  Date Created
    +  2:60  Time Created
    +  2:62  Digital Creation Date
    +  2:63  Digital Creation Time
    +  2:65  Originating Program
    +  2:70  Program Version
    +  2:75  Object Cycle
    +  2:80  By-Line (Author)
    +  2:85  By-Line Title (Author Position) [Not used in Photoshop 7]
    +  2:90  City
    +  2:92  Sub-Location
    +  2:95  Province/State
    +  2:100  Country/Primary Location Code
    +  2:101  Country/Primary Location Name
    +  2:103  Original Transmission Reference
    +  2:105  Headline
    +  2:110  Credit
    +  2:115  Source
    +  2:116  Copyright Notice
    +  2:118  Contact
    +  2:120  Caption/Abstract
    +  2:122  Caption Writer/Editor
    +  2:125  Rasterized Caption
    +  2:130  Image Type
    +  2:131  Image Orientation
    +  2:135  Language Identifier
    +  2:150  Audio Type
    +  2:151  Audio Sampling Rate
    +  2:152  Audio Sampling Resolution
    +  2:153  Audio Duration
    +  2:154  Audio Outcue
    +  2:200  ObjectData Preview File Format
    +  2:201  ObjectData Preview File Format Version
    +  2:202  ObjectData Preview Data
    +
    +Pre-ObjectData Descriptor Record
    +  7:10   Size Mode
    +  7:20   Max Subfile Size
    +  7:90   ObjectData Size Announced
    +  7:95   Maximum ObjectData Size
    +
    +ObjectData Record
    +  8:10   Subfile
    +
    +Post ObjectData Descriptor Record
    +  9:10   Confirmed ObjectData Size
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/examples.html b/ImageMagick-6.9.12-44/www/examples.html new file mode 100644 index 0000000..bbbe6a4 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/examples.html @@ -0,0 +1,126 @@ + + + + + + + + + + ImageMagick (legacy) – Examples of ImageMagick Usage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Showcase

    +

    These examples of ImageMagick usage illustrate what you can do with an image from the command line, a program interface, or script. You can generate this image yourself with this PerlMagick script, examples.pl.

    + +
      [ImageMagick Examples]
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/exception.html b/ImageMagick-6.9.12-44/www/exception.html new file mode 100644 index 0000000..04c254d --- /dev/null +++ b/ImageMagick-6.9.12-44/www/exception.html @@ -0,0 +1,315 @@ + + + + + + + + + + ImageMagick (legacy) – Exceptions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    + +

    ImageMagick returns a status of 0 whenever a command or algorithm successfully complete without complaint. A warning code generally is typically just a notice that something unusual occurred but the command or algorithm still completed and most likely the results are still usable. An error means the command or algorithm could not complete as expected and any results are unreliable. A fatal error means the command or algorithm could not complete and the process exits prematurely and no results are returned.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ImageMagick Error and Warning Codes
    DomainDescriptionWarningErrorFatal Error
    Successthe command or algorithm completed successfully without complaint000
    Resource Limita program resource is exhausted (e.g. not enough memory)300400700
    TypeA font is unavailable; a substitution may have occurred305405705
    Optiona command-line option was malformed310410710
    Delegatean ImageMagick delegate failed to complete315415715
    Missing Delegatethe image type can not be read or written because the appropriate Delegate is missing320420720
    Corrupt Imagethe image file may be corrupt325425725
    FileOpenthe image file could not be opened for reading or writing330430730
    Bloba binary large object could not be allocated, read, or written335435735
    Streamthere was a problem reading or writing from a stream340440740
    Cachepixels could not be read or written to the pixel cache345445745
    Coderthere was a problem with an image coder350450750
    Modulethere was a problem with an image module355455755
    Drawa drawing operation failed360460760
    Imagethe operation could not complete due to an incompatible image365465765
    Wandthere was a problem specific to the MagickWand API370470770
    Randomthere is a problem generating a true or pseudo-random number375475775
    XServeran X resource is unavailable380480780
    Monitorthere was a problem activating the progress monitor385485785
    Registrythere was a problem getting or setting the registry390490790
    Configurethere was a problem getting a configuration file395495795
    Policya policy denies access to a delegate, coder, filter, path, or resource.399499799
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/export.html b/ImageMagick-6.9.12-44/www/export.html new file mode 100644 index 0000000..57bff88 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/export.html @@ -0,0 +1,126 @@ + + + + + + + + + + ImageMagick (legacy) – Export Classification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Export Classification

    +

    ImageMagick Studio LLC is a limited liability corporation based in the United States of America. All of our products are developed via online collaboration in public forums and distributed from a central server within the U.S. Therefore, U.S. export laws and regulations apply to our distributions and remain in force as products and technology are re-exported to different parties and places around the world. Information on export control classifications and associated restrictions may be required for exporting, re-exporting, record keeping, bundling/embedding of ImageMagick products, encryption reporting, and shipping documentation. More information on U.S. Export Regulations can be found at the U. S. Bureau of Industry and Security.

    + +

    The ImageMagick software distribution is classified as ECCN 5D002. However, ImageMagick Studio LLC makes no warranty or representation that this classification is accurate, current, or complete. ImageMagick is exported under the TSU exception in EAR 740.13(e) which applies to software containing or designed for use with encryption software that is publicly available as open source. TSU further provides that Posting encryption source code and corresponding object code on the Internet (e.g., FTP or World Wide Web site) where it may be downloaded by anyone neither establishes "knowledge" of a prohibited export or reexport for purposes of this paragraph, nor triggers any "red flags" necessitating the affirmative duty to inquire[...]. It is your obligation as the exporter to comply with the current applicable requirements of United States export rules and regulations.

    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/favicon.ico b/ImageMagick-6.9.12-44/www/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0aeb05ffb7196a3f7ca6ceac9d6efea44b989097 GIT binary patch literal 99254 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/www/formats.html b/ImageMagick-6.9.12-44/www/formats.html new file mode 100644 index 0000000..a4438ef --- /dev/null +++ b/ImageMagick-6.9.12-44/www/formats.html @@ -0,0 +1,2140 @@ + + + + + + + + + + ImageMagick (legacy) – Image Formats + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Image Formats

    +

    A Word about ColorspacesSupported FormatsPseudo FormatsBuilt-in ImagesBuilt-in PatternsEmbedded Profiles

    + +

    ImageMagick uses an ASCII string known as convert (e.g. GIF) to identify file formats, algorithms acting as formats, built-in patterns, and embedded profile types. Support for some of the formats are delegated to libraries or external programs. The Installation Guide describes where to find these distributions and any special configuration options required.

    + +

    To get a complete listing of which image formats are supported on your system, type

    + +
    identify -list format
    +
    + +

    On some platforms, ImageMagick automagically processes these extensions: .gz for Zip compression, .Z for Linux compression, .bz2 for block compression, and .pgp for PGP encryption. For example, a PNM image called image.pnm.gz is automagically uncompressed.

    + +

    A Word about Colorspaces

    +

    A majority of the image formats assume an sRGB +colorspace (e.g. JPEG, PNG, etc.). A few support only linear RGB (e.g. EXR, +DPX, CIN, HDR) or only linear GRAY (e.g. PGM). A few formats support CMYK. +Then there is the occasional format that also supports LAB (that is CieLAB) +(e.g. TIFF, PSD, JPG, JP2). To determine the colorspace of your image, use +this command:

    + +
    -> identify -verbose image.jpg
    +Image: image.jpg
    +Format: JPEG (Joint Photographic Experts Group JFIF format)
    +...
    +Colorspace: sRGB
    +
    + +OR use the appropriate percent escape +
    $ convert image.jpg -print "%[colorspace]\n" null:
    +sRGB
    +
    + + +

    When processing an image, be aware of the colorspace. Many image +processing algorithms assume a linear RGB colorspace. Although you may get +satisfactory results processing in the sRGB colorspace, you may get improved +results in linear RGB (essentially sRGB with the gamma function removed). For +example,

    + +
    convert image.jpg -colorspace RGB -resize 50% -colorspace sRGB resize.jpg
    +
    + +

    As of IM 6.7.8-2 one can properly work in LAB colorspace whether or not +Imagemagick is HDRI-enabled. Essentially the A and +B channels are stored with a 50% gray bias, to allow it to handle the +negatives required by the format.

    + +
    convert lab.tif -resize 50% resize.jpg
    +
    + +

    Again, it may not make sense for some image processing operators to work +directly in LAB space, but ImageMagick permits it and generally returns +reasonable results.

    + +

    Supported Image Formats

    + +

    ImageMagick supports reading over 100 major file formats (not +including sub-formats). The following table provides a summary of +the supported image formats.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TagModeDescriptionNotes
    AAIRWAAI Dune image
    APNGRWAnimated Portable Network GraphicsNote, you must use an explicit image format specifier to read an APNG (apng:myImage.apng) image sequence, otherwise it assumes a PNG image and only reads the first frame.
    ARTRWPFS: 1st PublisherFormat originally used on the Macintosh (MacPaint?) and later used for PFS: 1st Publisher clip art.
    ARWRSony Digital Camera Alpha Raw Image FormatSet -define dng:use-camera-wb=true to use the RAW-embedded color profile for Sony cameras. You can also set these options: use-auto-wb, use-auto-bright, and output-color.
    AVIRMicrosoft Audio/Visual Interleaved
    AVIFRWFormat derived from the keyframes of AV1 video
    AVSRWAVS X image
    BPGRWBetter Portable GraphicsUse -quality to specify the image compression quality. To meet the requirements of BPG, the quality argument divided by 2 (e.g. -quality 92 assigns 46 as the BPG compression.
    BMP, BMP2, BMP3RWMicrosoft Windows bitmapBy default the BMP format is version 4. Use BMP3 and BMP2 to write versions 3 and 2 respectively. Use -define bmp:ignore-filesize to ignore the filesize check.
    BRFWBraille Ready FormatUses juxtaposition of 6-dot braille patterns (thus 6x2 dot matrices) to reproduce images, using the BRF ASCII Braille encoding.
    CALSRContinuous Acquisition and Life-cycle Support Type 1 imageSpecified in MIL-R-28002 and MIL-PRF-28002. Standard blueprint archive format as used by the US military to replace microfiche.
    CGMRComputer Graphics MetafileRequires ralcgm to render CGM files.
    CINRWKodak Cineon Image FormatUse -set to specify the image gamma or black and white points (e.g. -set gamma 1.7, -set reference-black 95, -set reference-white 685). Properties include cin:file.create_date, cin:file.create_time, cin:file.filename, cin:file.version, cin:film.count, cin:film.format, cin:film.frame_id, cin:film.frame_position, cin:film.frame_rate, cin:film.id, cin:film.offset, cin:film.prefix, cin:film.slate_info, cin:film.type, cin:image.label, cin:origination.create_date, cin:origination.create_time, cin:origination.device, cin:origination.filename, cin:origination.model, cin:origination.serial, cin:origination.x_offset, cin:origination.x_pitch, cin:origination.y_offset, cin:origination.y_pitch, cin:user.data.
    CIPWCisco IP phone image format
    CMYKRWRaw cyan, magenta, yellow, and black samplesUse -size and -depth to specify the image width, height, and depth. To specify a single precision floating-point format, use -define quantum:format=floating-point. Set the depth to 32 for single precision floats, 64 for double precision, and 16 for half-precision.
    CMYKARWRaw cyan, magenta, yellow, black, and alpha samplesUse -size and -depth to specify the image width, height, and depth. To specify a single precision floating-point format, use -define quantum:format=floating-point. Set the depth to 32 for single precision floats, 64 for double precision, and 16 for half-precision.
    CR2RCanon Digital Camera Raw Image FormatRequires an explicit image format otherwise the image is interpreted as a TIFF image (e.g. cr2:image.cr2).
    CRWRCanon Digital Camera Raw Image Format
    CUBERCube Color lookup table converted to a HALD imageSelect levels like this: cube:Vibrant.cube[8] for level 8
    CURRMicrosoft Cursor Icon
    CUTRDR Halo
    DCMRDigital Imaging and Communications in Medicine (DICOM) imageUsed by the medical community for images like X-rays. ImageMagick sets the initial display range based on the Window Center (0028,1050) and Window Width (0028,1051) tags. Use -define dcm:display-range=reset to set the display range to the minimum and maximum pixel values. Use -define dcm:rescale=true to enable interpretation of the rescale slope and intercept settings in the file. Use -define dcm:window=centerXwidth to override the center and width settings in the file with your own values.
    DCRRKodak Digital Camera Raw Image File
    DCXRWZSoft IBM PC multi-page Paintbrush image
    DDSRWMicrosoft Direct Draw SurfaceUse -define to specify the compression (e.g. -define dds:compression={dxt1, dxt5, none}). Other defines include dds:cluster-fit={true,false}, dds:weight-by-alpha={true,false}, dds:fast-mipmaps={true,false}, and use dds:mipmaps to set the number of mipmaps (use fromlist to use the image list).
    DEBUGWRaw pixel debug file, likely only useful to the developers
    DIBRWMicrosoft Windows Device Independent BitmapDIB is a BMP file without the BMP header. Used to support embedded images in compound formats like WMF.
    DJVUR
    DNGRDigital NegativeRequires an explicit image format otherwise the image is interpreted as a TIFF image (e.g. dng:image.dng).
    DOTRGraph VisualizationUse -define to specify the layout engine (e.g. -define dot:layout-engine=twopi).
    DPXRWSMPTE Digital Moving Picture Exchange 2.0 (SMPTE 268M-2003)Use -set to specify the image gamma or black and white points (e.g. -set gamma 1.7, -set reference-black 95, -set reference-white 685).
    EMFRMicrosoft Enhanced Metafile (32-bit)Only available under Microsoft Windows. Use -size command line option to specify the maximum width and height.
    EPDFRWEncapsulated Portable Document Format
    EPIRWAdobe Encapsulated PostScript Interchange formatRequires Ghostscript to read.
    EPSRWAdobe Encapsulated PostScriptRequires Ghostscript to read.
    EPS2WAdobe Level II Encapsulated PostScriptRequires Ghostscript to read.
    EPS3WAdobe Level III Encapsulated PostScriptRequires Ghostscript to read.
    EPSFRWAdobe Encapsulated PostScriptRequires Ghostscript to read.
    EPSIRWAdobe Encapsulated PostScript Interchange formatRequires Ghostscript to read.
    EPTRWAdobe Encapsulated PostScript Interchange format with TIFF previewRequires Ghostscript to read.
    EXRRWHigh dynamic-range (HDR) file format developed by Industrial Light & MagicSee High Dynamic-Range Images for details on this image format. To specify the output color type, use -define exr:color-type={RGB,RGBA,YC,YCA,Y,YA,R,G,B,A}. Use -sampling-factor to specify the sampling rate for YC(A) (e.g. 2x2 or 4:2:0). Requires the OpenEXR delegate library.
    FARBFELDRWFarbfeld lossless image formatsRGB 16-bit RGBA lossless image format
    FAXRWGroup 3 TIFFThis format is a fixed width of 1728 as required by the standard. See TIFF format. Note that FAX machines use non-square pixels which are 1.5 times wider than they are tall but computer displays use square pixels so FAX images may appear to be narrow unless they are explicitly resized using a resize specification of 100x150%.
    FIGRFIG graphics formatRequires TransFig.
    FITSRWFlexible Image Transport SystemTo specify a single-precision floating-point format, use -define quantum:format=floating-point. Set the depth to 64 for a double-precision floating-point format.
    FL32RWFilmLight floating point image format
    FLIFRWFree Lossless Image Format
    FPXRWFlashPix FormatFlashPix has the option to store mega- and giga-pixel images at various resolutions in a single file which permits conservative bandwidth and fast reveal times when displayed within a Web browser. Requires the FlashPix SDK. Specify the FlashPix viewing parameters with the -define fpx:view.
    GIFRWCompuServe Graphics Interchange Format8-bit RGB PseudoColor with up to 256 palette entries. Specify the format GIF87 to write the older version 87a of the format. Use -transparent-color to specify the GIF transparent color (e.g. -transparent-color wheat).
    GPLTRGnuplot plot filesRequires gnuplot4.0.tar.Z or later.
    GRAYRWRaw gray samplesUse -size and -depth to specify the image width, height, and depth. To specify a single precision floating-point format, use -define quantum:format=floating-point. Set the depth to 32 for single precision floats, 64 for double precision, and 16 for half-precision. For signed pixel data, use -define quantum:format=signed.
    GRAYARWRaw gray and alpha samplesUse -size and -depth to specify the image width, height, and depth. To specify a single precision floating-point format, use -define quantum:format=floating-point. Set the depth to 32 for single precision floats, 64 for double precision, and 16 for half-precision.
    HDRRWRadiance RGBE image format
    HDRRWRadiance RGBE image format
    HEICRWApple High efficiency Image FormatHEIC requires the libheif delegate library.
    HPGLRHP-GL plotter languageRequires hp2xx-3.4.4.tar.gz
    HRZRWSlow Scane TeleVision
    HTMLRWHypertext Markup Language with a client-side image mapAlso known as HTM. Requires html2ps to read.
    ICORMicrosoft iconAlso known as ICON.
    INFOWFormat and characteristics of the image
    ISOBRLWISO/TR 11548-1 BRaiLleUses juxtaposition of 8-dot braille patterns (thus 8x2 dot matrices) to reproduce images, using the ISO/TR 11548-1 Braille encoding.
    ISOBRL6WISO/TR 11548-1 BRaiLle 6 dotsUses juxtaposition of 6-dot braille patterns (thus 6x2 dot matrices) to reproduce images, using the ISO/TR 11548-1 Braille encoding.
    JBIGRWJoint Bi-level Image experts Group file interchange formatAlso known as BIE and JBG. Requires jbigkit-1.6.tar.gz.
    JNGRWMultiple-image Network GraphicsJPEG in a PNG-style wrapper with transparency. Requires libjpeg and libpng-1.0.11 or later, libpng-1.2.5 or later recommended.
    JP2RWJPEG-2000 JP2 File Format SyntaxSpecify the encoding options with the -define option. See JP2 Encoding Options for more details.
    JPTRWJPEG-2000 Code Stream SyntaxSpecify the encoding options with the -define option See JP2 Encoding Options for more details.
    J2CRWJPEG-2000 Code Stream SyntaxSpecify the encoding options with the -define option See JP2 Encoding Options for more details.
    J2KRWJPEG-2000 Code Stream SyntaxSpecify the encoding options with the -define option See JP2 Encoding Options for more details.
    JPEGRWJoint Photographic Experts Group JFIF formatNote, JPEG is a lossy compression. In addition, you cannot create black and white images with JPEG nor can you save transparency.

    Requires jpegsrc.v8c.tar.gz. You can set quality scaling for luminance and chrominance separately (e.g. -quality 90,70). You can optionally define the DCT method, for example to specify the float method, use -define jpeg:dct-method=float. By default we compute optimal Huffman coding tables. Specify -define jpeg:optimize-coding=false to use the default Huffman tables. Two other options include -define jpeg:block-smoothing and -define jpeg:fancy-upsampling. Set the sampling factor with -define jpeg:sampling-factor. You can size the image with jpeg:size, for example -define jpeg:size=128x128. To restrict the maximum file size, use jpeg:extent, for example -define jpeg:extent=400KB. To define one or more custom quantization tables, use -define jpeg:q-table=filename. These values are multiplied by -quality argument divided by 100.0. To avoid reading a particular associated image profile, use -define profile:skip=name (e.g. profile:skip=ICC).
    JXRRWJPEG extended rangeRequires the jxrlib delegate library. Put the JxrDecApp and JxrEncApp applications in your execution path.
    JSONWJavaScript Object Notation, a lightweight data-interchange formatInclude additional attributes about the image with these defines: -define json:locate, -define json:limit, -define json:moments, or -define json:features. Specify the JSON model schema version with -define json:version. The current version is 1.0. Any version less than 1.0, returns the original JSON output which included misspelled labels.
    JXLRWJPEG XL image coding systemRequires the brunsli delegate library.
    KERNELWMorphology kernel formatformat suitable for a morphology kernel
    MANRLinux reference manual pagesRequires that GNU groff and Ghostcript are installed.
    MATRMATLAB image format
    MIFFRWMagick image file formatThis format persists all image attributes known to ImageMagick. To specify a single precision floating-point format, use -define quantum:format=floating-point. Set the depth to 32 for single precision floats, 64 for double precision, and 16 for half-precision.
    MONORWBi-level bitmap in least-significant-byte first order
    MNGRWMultiple-image Network GraphicsA PNG-like Image Format Supporting Multiple Images, Animation and Transparent JPEG. Requires libpng-1.0.11 or later, libpng-1.2.5 or later recommended. An interframe delay of 0 generates one frame with each additional layer composited on top. For motion, be sure to specify a non-zero delay.
    M2VRWMotion Picture Experts Group file interchange format (version 2)Requires ffmpeg.
    MPEGRWMotion Picture Experts Group file interchange format (version 1)Requires ffmpeg.
    MPCRWMagick Pixel Cache image file formatThe most efficient data processing pattern is a write-once, read-many-times pattern. The image is generated or copied from source, then various analyses are performed on the image pixels over time. MPC supports this pattern. MPC is the native in-memory ImageMagick uncompressed file format. This file format is identical to that used by ImageMagick to represent images in memory and is read by mapping the file directly into memory. The MPC format is not portable and is not suitable as an archive format. It is suitable as an intermediate format for high-performance image processing. The MPC format requires two files to support one image. Image attributes are written to a file with the extension .mpc, whereas, image pixels are written to a file with the extension .cache.
    MPRRWMagick Persistent RegistryThis format permits you to write to and read images from memory. The image persists until the program exits. For example, let's use the MPR to create a checkerboard: +
    convert \( -size 15x15 canvas:black canvas:white -append \) \
    +  \( +clone -flip \) +append -write mpr:checkers +delete \
    +  -size 240x240 tile:mpr:checkers board.png
    +
    MRWRSony (Minolta) Raw Image FileSet -define dng:use-camera-wb=true to use the RAW-embedded color profile for Sony cameras.
    MSLRWMagick Scripting LanguageMSL is the XML-based scripting language supported by the conjure utility. MSL requires the libxml2 delegate library.
    MTVRWMTV Raytracing image format
    MVGRWMagick Vector Graphics.The native ImageMagick vector metafile format. A text file containing vector drawing commands accepted by convert's -draw option.
    NEFRNikon Digital SLR Camera Raw Image File
    ORFROlympus Digital Camera Raw Image File
    ORARopen exchange format for layered raster based graphics
    OTBRWOn-the-air Bitmap
    P7RWXv's Visual Schnauzer thumbnail format
    PALMRWPalm pixmap
    PAMWCommon 2-dimensional bitmap format
    CLIPBOARDRWWindows ClipboardOnly available under Microsoft Windows.
    PBMRWPortable bitmap format (black and white)
    PCDRWPhoto CDThe maximum resolution written is 768x512 pixels since larger images require huffman compression (which is not supported). Use -bordercolor to specify the border color (e.g. -bordercolor black).
    PCDSRWPhoto CDDecode with the sRGB color tables.
    PCLWHP Page Control LanguageUse -define to specify fit to page option (e.g. -define pcl:fit-to-page=true).
    PCXRWZSoft IBM PC Paintbrush file
    PDBRWPalm Database ImageViewer Format
    PDFRWPortable Document FormatRequires Ghostscript to read. By default, ImageMagick sets the page size to the MediaBox. Some PDF files, however, have a CropBox or TrimBox that is smaller than the MediaBox and may include white space, registration or cutting marks outside the CropBox or TrimBox. To force ImageMagick to use the CropBox or TrimBox rather than the MediaBox, use -define (e.g. -define pdf:use-cropbox=true or -define pdf:use-trimbox=true). Use -density to improve the appearance of your PDF rendering (e.g. -density 300x300). Use -alpha remove to remove transparency. To specify direct conversion from Postscript to PDF, use -define delegate:bimodel=true. Use -define pdf:fit-page=true to scale to the page size. To immediately stop processing upon an error, set -define pdf:stop-on-error to true. To set the page direction preferences to right-to-left, try -define pdf:page-direction=right-to-left. Use -alpha remove to remove transparency. When writing to a PDF, thumbnails are included by default. To skip generating thumbnails, -define pdf:thumbnail=false. To enable interpolation when rendering, use -define pdf:interpolate=true.
    PEFRPentax Electronic FileRequires an explicit image format otherwise the image is interpreted as a TIFF image (e.g. pef:image.pef).
    PESREmbrid Embroidery Format
    PFARPostscript Type 1 font (ASCII)Opening as file returns a preview image.
    PFBRPostscript Type 1 font (binary)Opening as file returns a preview image.
    PFMRWPortable float map format
    PGMRWPortable graymap format (gray scale)
    PICONRWPersonal Icon
    PICTRWApple Macintosh QuickDraw/PICT file
    PIXRAlias/Wavefront RLE image format
    PNGRWPortable Network GraphicsRequires libpng-1.0.11 or later, libpng-1.2.5 or later recommended. The PNG specification does not support pixels-per-inch units, only pixels-per-centimeter. To avoid reading a particular associated image profile, use -define profile:skip=name (e.g. profile:skip=ICC).
    PNG8RWPortable Network Graphics8-bit indexed with optional binary transparency
    PNG00RWPortable Network GraphicsPNG inheriting subformat from original if possible
    PNG24RWPortable Network Graphicsopaque or binary transparent 24-bit RGB
    PNG32RWPortable Network Graphicsopaque or transparent 32-bit RGBA
    PNG48RWPortable Network Graphicsopaque or binary transparent 48-bit RGB
    PNG64RWPortable Network Graphicsopaque or transparent 64-bit RGB
    PNMRWPortable anymapPNM is a family of formats supporting portable bitmaps (PBM) , graymaps (PGM), and pixmaps (PPM). There is no file format associated with pnm itself. If PNM is used as the output format specifier, then ImageMagick automagically selects the most appropriate format to represent the image. The default is to write the binary version of the formats. Use -compress none to write the ASCII version of the formats.
    POCKETMODRWPocketmod personal organizer formatExample usage: convert -density 300 pages?.pdf pocketmod:organize.pdf
    PPMRWPortable pixmap format (color)
    PSRWAdobe PostScript fileRequires Ghostscript to read. To force ImageMagick to respect the crop box, use -define (e.g. -define eps:use-cropbox=true). Use -density to improve the appearance of your Postscript rendering (e.g. -density 300x300). Use -alpha remove to remove transparency. To specify direct conversion from PDF to Postscript, use -define delegate:bimodel=true.
    PS2RWAdobe Level II PostScript fileRequires Ghostscript to read.
    PS3RWAdobe Level III PostScript fileRequires Ghostscript to read.
    PSBRWAdobe Large Document Format
    PSDRWAdobe Photoshop bitmap fileUse -define psd:alpha-unblend=off to disable alpha blenning in the merged image. Use -define psd:additional-info=all|selective to transfer additional information from the input PSD file to output PSD file. The 'selective' option will preserve all additional information that is not related to the geometry of the image. The 'all' option should only be used when the geometry of the image has not been changed. This option is helpful when transferring non-simple layers, such as adjustment layers from the input PSD file to the output PSD file. This define is available as of Imagemagick version 6.9.5-8. Use -define psd:preserve-opacity-mask=true to preserve the opacity mask of a layer and add it back to the layer when the image is saved.
    PTIFRWPyramid encoded TIFFMulti-resolution TIFF containing successively smaller versions of the image down to the size of an icon.
    PWPRSeattle File Works multi-image file
    RADRRadiance image fileRequires that ra_ppm from the Radiance software package be installed.
    RAFRFuji CCD-RAW Graphic File
    RAWRWRaw gray samplesUse -size and -depth to specify the image width, height, and depth. To specify a single precision floating-point format, use -define quantum:format=floating-point. Set the depth to 32 for single precision floats, 64 for double precision, and 16 for half-precision. For signed pixel data, use -define quantum:format=signed.
    RGBRWRaw red, green, and blue samplesUse -size and -depth to specify the image width, height, and depth. To specify a single precision floating-point format, use -define quantum:format=floating-point. Set the depth to 32 for single precision floats, 64 for double precision, and 16 for half-precision.
    RGB565RRaw red, green, blue pixels in the 5-6-5 formatUse -size to specify the image width and height.
    RGBARWRaw red, green, blue, and alpha samplesUse -size and -depth to specify the image width, height, and depth. To specify a single precision floating-point format, use -define quantum:format=floating-point. Set the depth to 32 for single precision floats, 64 for double precision, and 16 for half-precision.
    RGFRWLEGO Mindstorms EV3 Robot Graphics File
    RLARAlias/Wavefront image file
    RLERUtah Run length encoded image file
    SCTRScitex Continuous Tone Picture
    SFWRSeattle File Works image
    SGIRWIrix RGB image
    SHTMLWHypertext Markup Language client-side image mapUsed to write HTML clickable image maps based on a the output of montage or a format which supports tiled images such as MIFF.
    SID, MrSIDRMultiresolution seamless imageRequires the mrsidgeodecode command line utility that decompresses MG2 or MG3 SID image files.
    SPARSE-COLORWRaw text fileFormat compatible with the -sparse-color option. Lists only non-fully-transparent pixels.
    SUNRWSUN Rasterfile
    SVGRWScalable Vector GraphicsImageMagick utilizes inkscape if its in your execution path otherwise RSVG. If neither are available, ImageMagick reverts to its internal SVG renderer. The default resolution is 96 DPI. Use -size command line option to specify the maximum width and height. If you want to render a very large SVG and you trust the source, enable this option: -define svg:xml-parse-huge=true.
    TEXTRtext fileRequires an explicit format specifier to read, e.g. text:README.txt.
    TGARWTruevision Targa imageAlso known as formats ICB, VDA, and VST.
    TIFFRWTagged Image File FormatAlso known as TIF. Requires tiff-v3.6.1.tar.gz or later. Use -define to specify the rows per strip (e.g. -define tiff:rows-per-strip=8). To define the tile geometry, use for example, -define tiff:tile-geometry=128x128. To specify a signed format, use -define quantum:format=signed. To specify a single-precision floating-point format, use -define quantum:format=floating-point. Set the depth to 64 for a double-precision floating-point format. Use -define quantum:polarity=min-is-black or -define quantum:polarity=min-is-white toggle the photometric interpretation for a bilevel image. Specify the extra samples as associated or unassociated alpha with, for example, -define tiff:alpha=unassociated. Set the fill order with -define tiff:fill-order=msb|lsb. Set the TIFF endianness with -define tiff:endian=msb|lsb. Use -define tiff:exif-properties=false to skip reading the EXIF properties. Use -define tiff:gps-properties=false to skip reading the GPS properties. You can set a number of TIFF software attributes including document name, host computer, artist, timestamp, make, model, software, and copyright. For example, -set tiff:software "My Company". If you want to ignore certain TIFF tags, use this option: -define tiff:ignore-tags=comma-separated-list-of-tag-IDs. Since version 6.9.1-4 there is support for reading photoshop layers in TIFF files, this can be disabled with -define tiff:ignore-layers=true. To preserve compression of the source image, use: -define tiff:preserve-compression=true.
    TIMRPSX TIM file
    TTFRTrueType font fileRequires freetype 2. Opening as file returns a preview image. Use -set if you do not want to hint glyph outlines after their scaling to device pixels (e.g. -set type:hinting off).
    TXTRWRaw text fileUse -define to specify the color compliance (e.g. -define txt:compliance=css).
    UBRLWUnicode BRaiLleUses juxtaposition of 8-dot braille patterns (thus 8x2 dot matrices) to reproduce images, using the Unicode Braille encoding.
    UBRL6WUnicode BRaiLle 6 dotsUses juxtaposition of 6-dot braille patterns (thus 6x2 dot matrices) to reproduce images, using the Unicode Braille encoding.
    UILWX-Motif UIL table
    UYVYRWInterleaved YUV raw imageUse -size and -depth command line options to specify width and height. Use -sampling-factor to set the desired subsampling (e.g. -sampling-factor 4:2:2).
    VICARRWVICAR rasterfile format
    VIFFRWKhoros Visualization Image File Format
    WBMPRWWireless bitmapSupport for uncompressed monochrome only.
    WDPRWJPEG extended rangeRequires the jxrlib delegate library. Put the JxrDecApp and JxrEncApp applications in your execution path.
    WEBPRWWeppy image formatRequires the WEBP delegate library. Specify the encoding options with the -define option See WebP Encoding Options for more details.
    WMFRWindows MetafileRequires libwmf. By default, renders WMF files using the dimensions specified by the metafile header. Use the -density option to adjust the output resolution, and thereby adjust the output size. The default output resolution is 72DPI so -density 144 results in an image twice as large as the default. Use -background color to specify the WMF background color (default white) or -texture filename to specify a background texture image.
    WPGRWord Perfect Graphics File
    XRWdisplay or import an image to or from an X11 serverUse -define to obtain the image from the root window (e.g. -define x:screen=true). Set x:silent=true to turn off the beep when importing an image.
    XBMRWX Windows system bitmap, black and white onlyUsed by the X Windows System to store monochrome icons.
    XCFRGIMP image
    XPMRWX Windows system pixmapAlso known as PM. Used by the X Windows System to store color icons.
    XWDRWX Windows system window dumpUsed by the X Windows System to save/display screen dumps.
    X3FRSigma Camera RAW Picture File
    YCbCrRWRaw Y, Cb, and Cr samplesUse -size and -depth to specify the image width, height, and depth.
    YCbCrARWRaw Y, Cb, Cr, and alpha samplesUse -size and -depth to specify the image width, height, and depth.
    YUVRWCCIR 601 4:1:1Use -size and -depth command line options to specify width, height, and depth. Use -sampling-factor to set the desired subsampling (e.g. -sampling-factor 4:2:2).
    +
    +
    +

    Pseudo-image Formats

    + +

    ImageMagick supports a number of image format specifications which refer to images prepared via an algorithm, or input/output targets. The following table lists these pseudo-image formats:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TagModeDescriptionNotes
    ASHLARWImage sequence laid out in continuous irregular coursesBy default, a reasonable canvas size and border width is determined relative to the image collection you provide. You can explicitedly set the canvas size and border width by appending to the filename, e.g. ashlar:canvas.png[1024x768+4+4]. By default, alignment is along the left edge. Use -define ashlar:best-fit=true to align on both the left and right edges. You can label the image tiles with, for example, -label %f.
    CANVASRCanvas image of specified colorUseful to create solid color canvas images. Use + -size and -depth to specify the + image width, height, and depth. Example canvas color specifications + include canvas:red and canvas:#FF0000.
    + + If no color is specified a 'white' canvas image is + generated. If no -size is specified + a single pixel image of the specified color is generated.
    CAPTIONRImage captionUse -define caption:split=true to split text if required to fit caption on the canvas
    CLIPRWClip path of image
    CLIPBOARDRWWindows ClipboardOnly available under Microsoft Windows.
    FRACTALRPlasma fractal image
    GRADIENTRGradual passing from one shade to anotherReturns a rendered linear top-to-bottom gradient image using the specified image size.
    HALDRIdentity Hald CLUT ImageSelect levels like this: hald:[8] for level 8.
    HISTOGRAMWHistogram of the imageThe histogram includes the unique colors of the image as an image comment. If you have no need for the unique color list, use -define histogram:unique-colors=false to forego this expensive operation.
    INLINERWBase64-encoded inline imageThe inline image look similar to inline:data:;base64,/9j/4AAQSk...knrn//2Q==. If the inline image exceeds 5000 characters, reference it from a file (e.g. inline:inline.txt). You can also write a base64-encoded image. Embed the mime type in the filename, for example, convert myimage inline:jpeg:myimage.txt.
    LABELRText image formatSpecify the desired text as the filename (e.g. label:"This a label").
    MAPRWColormap intensities and indicesSet -depth to set the sample size of the intensities; indices are 16-bit if colors > 256.
    MASKRWImage mask
    MATTEWMATTE formatWrite only.
    NULLRWNULL imageUseful for creating blank tiles with montage (use NULL:). Also useful as an output format when evaluating image read performance.
    PANGORImage captionYou can configure the caption layout with these defines: -define pango:auto-dir=true/false, -define pango:ellipsize=start/middle/end, -define pango:gravity-hint=natural/strong/line, -define pango:hinting=none/auto/full, -define pango:indent=points, -define pango:justify=true/false, -define pango:language=en_US/etc, -define pango:markup=true/false, -define pango:single-paragraph=true/false, -define pango:wrap=word/char/word-char and -define pango:align=left/center/right.
    PLASMARPlasma fractal image
    PREVIEWWShow a preview an image enhancement, effect, or f/xCreates a preview montage of images prepared over a parametric range in order to assist with parameter selection. Specify the desired + preview type via the -preview option).
    PRINTWSend image to your computer printerLinux users may set the PRINTER (for 'lpr') or LPDEST (for 'lp') environment variables to select the desired printer.
    SCANRImport image from a scanner deviceRequires SANE Specify the device name and path as the filename (e.g. scan:'hpaio:/usb/Officejet_6200_series?serial=CN4ATCE3G20453').
    RADIAL_GRADIENTRGradual radial passing from one shade to anotherReturns a rendered radial top-to-bottom gradient image using the specified image size.
    SCANXRImport image from the default scanner device
    SCREENSHOTRan image that shows the contents of a computer display
    STEGANORSteganographic imageUse -size command line option to specify width, height, and offset of the steganographic image
    TILERTiled imageCreate a tiled version of an image at by tiling a image. Use -size to specify the tiled image size. Tiles are composited on an image background and therefore is responsive to the -compose option. The image is specified similar to + TILE:image.miff.
    UNIQUEWWrite only unique pixels to the image file.
    VIDRWVisual Image DirectoryUsed to create a thumbnailed directory (tiled thumbnails) of a set of images which may be used to select images to view via the display program, or saved to a MIFF or SHTML file.
    WINRWSelect image from or display image to your computer screenOnly supported under Microsoft Windows.
    XRWSelect image from or display image to your X server screenAlso see the import and display + programs.
    XCRCanvas image of specified colorAn backward compatible alias for the 'canvas:' + psuedo-file format, used to create a solid color canvas image. +
    +
    + +
    +

    Built-in Images

    + +

    ImageMagick includes a number of built-in (embedded) images which may be referenced as if they were an image file. The convert: format tag may be used via the syntax magick:name to request an embedded image (e.g. magick:logo). For backwards compatibility, the image specifications GRANITE:, LOGO:, NETSCAPE:, and ROSE: may also be used to request images with those names.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TagModeDescriptionNotes
    GRANITER128x128 granite texture patternGRANITE
    LOGORImageMagick Logo, 640x480Logo
    NETSCAPERimage using colors in Netscape 216 (6x6x6 ) color cube, 216x144Most commonly used with the convert and magick mogrify programs with the -map option to create web safe images.
    ROSERPicture of a rose, 70x46ROSE
    WIZARDRImageMagick Wizard, 480x640Logo
    + +
    +

    Built-in Patterns

    + +

    ImageMagick includes a number of built-in (embedded) patterns which may be referenced as if they were an image file. The pattern: format tag may be used via the syntax pattern:name to request an embedded pattern (e.g. pattern:checkerboard). The pattern size is controlled with the -size command line option.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TagModeDescriptionNotes
    BRICKSRbrick pattern, 16x16BRICKS
    CHECKERBOARDRcheckerboard pattern, 30x30CHECKERBOARD
    CIRCLESRcircles pattern, 16x16CIRCLES
    CROSSHATCHRcrosshatch pattern, 8x4CROSSHATCH
    CROSSHATCH30Rcrosshatch pattern with lines at 30 degrees, 8x4CROSSHATCH30
    CROSSHATCH45Rcrosshatch pattern with lines at 45 degrees, 8x4CROSSHATCH45
    FISHSCALESRfish scales pattern, 16x8FISHSCALES
    GRAY0R0% intensity gray, 32x32GRAY0
    GRAY5R5% intensity gray, 32x32GRAY5
    GRAY10R10% intensity gray, 32x32 GRAY10
    GRAY15R15% intensity gray, 32x32GRAY15
    GRAY20R20% intensity gray, 32x32GRAY20
    GRAY25R25% intensity gray, 32x32GRAY25
    GRAY30R30% intensity gray, 32x32GRAY30
    GRAY35R35% intensity gray, 32x32GRAY35
    GRAY40R40% intensity gray, 32x32GRAY40
    GRAY45R45% intensity gray, 32x32GRAY45
    GRAY50R50% intensity gray, 32x32GRAY50
    GRAY55R55% intensity gray, 32x32GRAY55
    GRAY60R60% intensity gray, 32x32GRAY60
    GRAY65R65% intensity gray, 32x32GRAY65
    GRAY70R70% intensity gray, 32x32GRAY70
    GRAY75R75% intensity gray, 32x32GRAY75
    GRAY80R80% intensity gray, 32x32 GRAY80
    GRAY85R85% intensity gray, 32x32GRAY85
    GRAY90R90% intensity gray, 32x32GRAY90
    GRAY95R95% intensity gray, 32x32GRAY95
    GRAY100R100% intensity gray, 32x32GRAY100
    HEXAGONSRhexagon pattern, 30x18HEXAGONS
    HORIZONTALRhorizontal line pattern, 8x4HORIZONTAL
    HORIZONTAL2Rhorizontal line pattern, 8x8HORIZONTAL2
    HORIZONTAL3Rhorizontal line pattern, 9x9HORIZONTAL3
    HORIZONTALSAWRhorizontal saw-tooth pattern, 16x8HORIZONTALSAW
    HS_BDIAGONALRbackward diagonal line pattern (45 degrees slope), 8x8HS_BDIAGONAL
    HS_CROSSRcross line pattern, 8x8HS_CROSS
    HS_DIAGCROSSRdiagonal line cross pattern (45 degrees slope), 8x8HS_DIAGCROSS
    HS_FDIAGONALRforward diagonal line pattern (45 degrees slope), 8x8HS_FDIAGONAL
    HS_HORIZONTALRhorizontal line pattern, 8x8HS_HORIZONTAL
    HS_VERTICALRvertical line pattern, 8x8HS_VERTICAL
    LEFT30Rforward diagonal pattern (30 degrees slope), 8x4LEFT0
    LEFT45Rforward diagonal line pattern (45 degrees slope), 8x8LEFT45
    LEFTSHINGLERleft shingle pattern, 24x24LEFTSHINGLE
    OCTAGONSRoctagons pattern, 16x16OCTAGONS
    RIGHT30Rbackward diagonal line pattern (30 degrees) 8x4RIGHT30
    RIGHT45Rbackward diagonal line pattern (30 degrees), 8x8RIGHT45
    RIGHTSHINGLERright shingle pattern, 24x24RIGHTSHINGLE
    SMALLFISHSCALESRsmall fish scales pattern, 8x8SMALLFISHSCALES
    VERTICALRvertical line pattern, 8x8VERTICAL
    VERTICAL2Rvertical line pattern, 8x8VERTICAL2
    VERTICAL3Rvertical line pattern, 9x9VERTICAL3
    VERTICALBRICKSRvertical brick pattern, 16x16VERTICALBRICKS
    VERTICALLEFTSHINGLERvertical left shingle pattern, 24x24VERTICALLEFTSHINGLE
    VERTICALRIGHTSHINGLERvertical right shingle pattern, 24x24VERTICALRIGHTSHINGLE
    VERTICALSAWRvertical saw-tooth pattern, 8x16VERTICALSAW
    + +
    +

    Embedded Image Profiles

    + +

    ImageMagick provides a number of format identifiers which are used to add, remove, and save embedded profiles for images which can support embedded profiles. Image types which may contain embedded profiles are TIFF, JPEG, and PDF.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TagModeDescriptionNotes
    8BIMRWPhotoshop resource format (binary)
    8BIMTEXTRWPhotoshop resource format (ASCII)An ASCII representation of the 8BIM format.
    APP1RWRaw application information
    APP1JPEGRWRaw JPEG binary dataProfile in JPEG wrapper.
    ICCRWInternational Color Consortium color profileAlso known as ICM. To read, use -profile with + convert.
    IPTCRWIPTC Newsphoto (binary)To read, use -profile with convert
    IPTCTEXTRWIPTC Newsphoto (ASCII)An ASCII representation of the IPTC format.
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/fx.html b/ImageMagick-6.9.12-44/www/fx.html new file mode 100644 index 0000000..3d9f4af --- /dev/null +++ b/ImageMagick-6.9.12-44/www/fx.html @@ -0,0 +1,491 @@ + + + + + + + + + + ImageMagick (legacy) – The FX Special Effects Image Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    FX Special Effects Image Operator

    +

    The FX Special Effects Image OperatorThe Anatomy of an FX Expression

    + + + +

    Use the FX special effects image operator to apply a mathematical expression to an image or image channels. Use FX to:

    + +
      +
    • create canvases, gradients, mathematical colormaps
    • +
    • move color values between images and channels
    • +
    • translate, flip, mirror, rotate, scale, shear and generally distort images
    • +
    • merge or composite multiple images together
    • +
    • convolve or merge neighboring pixels together
    • +
    • generate image metrics or 'fingerprints'
    • +
    + +

    The expression can be simple:

    + +
      convert -size 64x64 canvas:black -channel blue -fx "1/2" fx_navy.png
      +
    + +

    Here, we convert a black to a navy blue image:

    + +
      + black + ==> + navy +
    + +

    Or the expression can be complex:

    + +
      convert rose: \
      +  -fx "(1.0/(1.0+exp(10.0*(0.5-u)))-0.006693)*1.0092503" \
      +  rose-sigmoidal.png
      +
    + +

    This expression results in a high contrast version of the source image:

    + +
      + rose + ==> + rose-sigmoidal +
    + +

    The expression can include variable assignments. Assignments, in most cases, reduce the complexity of an expression and permit some operations that might not be possible any other way. For example, lets create a radial gradient:

    + +
      convert -size 70x70 canvas: \
      +  -fx "Xi=i-w/2; Yj=j-h/2; 1.2*(0.5-hypot(Xi,Yj)/70.0)+0.5" \
      +  radial-gradient.png
      +
    + +

    The command above returns this image:

    + +
      + radial-gradient +
    + +

    This FX expression adds random noise to an image:

    + +
      convert photo.jpg -fx 'iso=32; rone=rand(); rtwo=rand(); \
      +  myn=sqrt(-2*ln(rone))*cos(2*Pi*rtwo); myntwo=sqrt(-2*ln(rtwo))* \
      +  cos(2*Pi*rone); pnoise=sqrt(p)*myn*sqrt(iso)* \
      +  channel(4.28,3.86,6.68,0)/255; max(0,p+pnoise)' noisy.png
      +
    + +

    This FX script utilizes a loop to create a Julia set:

    + +
      convert -size 400x400 xc:black -colorspace gray -fx " \
      +  Xi=2.4*i/w-1.2; \
      +  Yj=2.4*j/h-1.2; \
      +  for (pixel=0.0, (hypot(Xi,Yj) < 2.0) && (pixel < 1.0), \
      +    delta=Xi^2-Yj^2; \
      +    Yj=2.0*Xi*Yj+0.2; \
      +    Xi=delta+0.4; \
      +    pixel+=0.00390625 \
      +  ); \
      +  pixel == 1.0 ? 0.0 : pixel" \
      +  \( -size 1x1 xc:white xc:red xc:orange xc:yellow xc:green1 xc:cyan xc:blue \
      +     xc:blueviolet xc:white -reverse +append -filter Cubic -resize 1024x1! \) \
      +  -clut -rotate -90 julia-set.png
    + +
      + Julia Fractals +
    + +

    This FX script prints the first 10 prime numbers:

    +
      convert xc: -channel gray -fx " \
      +  for (prime=2, prime < 30, composite=0; \
      +    for (nn=2, nn < (prime/2+1), if ((prime % nn) == 0, composite++, ); nn++); \
      +      if (composite <= 0, debug(prime), ); prime++)" null:
    + +

    See Using FX, The Special Effects Image Operator for more examples.

    + +

    The next section discusses the FX expression language.

    + +

    The Anatomy of an FX Expression

    + +

    The FX Expression Language

    + +

    The formal FX expression language is defined here:

    + +
    +
    numbers:
    +
    integer, floating point, scientific notation (+/- required, e.g. 3.81469e-06), International System number postfixes (.e.g KB, Mib, GB, etc.)
    +
    constants:
    +
    E (Euler's number), Epsilon, Opaque, Phi (golden ratio), Pi, QuantumRange, QuantumScale, Transparent
    +
    FX operators (in order of precedence):
    +
    ^ (power), unary -, *, /, % (modulo), +, -, + <<, >>, <, <=, >, >=, +=, -=, *=, /=, %=, <<=, >>=, + &=, |=, ++, --, ==, !=, & (bitwise AND), | (bitwise OR), + && (logical AND), || (logical OR), + ~ (logical NOT), ?: (ternary conditional)
    +
    array:
    +
    an image offers array storage (e.g. p[-1,-1].r) bounded by its width and height. An image sequence represents multiple arrays (e.g. u.p[0,0].r, v.p[0,0].r). Storage is limited to Quantum values, e.g. [0..65535] for Q16 builds and floating point for HDRI-enabled builds.
    +
    math functions:
    +
    abs(), acos(), acosh(), airy(), alt(), asin(), asinh(), atan(), atanh(), atan2(), ceil(), clamp(), cos(), cosh(), debug(), drc(), erf(), exp(), floor(), gauss(), gcd(), hypot(), int(), isnan(), j0(), j1(), jinc(), ln(), log(), logtwo(), max(), min(), mod(), not(), pow(), rand(), round(), sign(), sin(), sinc(), sinh(), sqrt(), squish(), tan(), tanh(), trunc()
    +
    channel functions:
    +
    channel(r,g,b,a), channel(c,m,y,k,a)
    +
    color names:
    +
    red, cyan, black, etc.
    +
    color functions:
    +
    srgb(), srgba(), rgb(), rgba(), cmyk(), cmyka(), hsl(), hsla(), etc.
    +
    color hex values:
    +
    #ccc, #cbfed0, #b9e1cc00, etc.
    +
    symbols:
    +
    u: first image in list
    +
    v: second image in list
    +
    s: current image in list (for %[fx:] otherwise = u)
    +
    t: index of current image (s) in list
    +
    n: number of images in list
    + +
    i: column offset
    +
    j: row offset
    +
    p: pixel to use (absolute or relative to current pixel)
    + +
    w: width of this image
    +
    h: height of this image
    +
    z: channel depth
    + +
    r: red value (from RGBA), of a specific or current pixel
    +
    g: green
    +
    b: blue
    +
    a: alpha
    +
    o: opacity
    + +
    c: cyan value of CMYK color of pixel
    +
    y: yellow
    +
    m: magenta
    +
    k: black
    + +
    intensity: pixel intensity
    + +
    hue: pixel hue
    +
    saturation: pixel saturation
    +
    lightness: pixel lightness
    +
    luma: pixel luma
    + +
    page.width: page width
    +
    page.height: page height
    +
    page.x: page x offset
    +
    page.y: page y offset
    + +
    printsize.x: x printsize
    +
    printsize.y: y printsize
    + +
    resolution.x: x resolution
    +
    resolution.y: y resolution
    + +
    depth: image depth
    +
    extent: image extent
    +
    minima: image minima
    +
    maxima: image maxima
    +
    mean: image mean
    +
    standard_deviation: image standard deviation
    +
    kurtosis: image kurtosis
    +
    skewness: image skewness (add a channel specifier to compute a statistic for that channel, e.g. depth.r)
    +
    iterators:
    +
    do(), for(), while()
    +
    image attributes:
    +
    image.depth, image.kurtosis, image.maxima, image.minima, image.resolution.x, image.resolution.y, image.skewness, image.standard_deviation
    +
    + +

    The FX Expression

    + +

    An FX expression may include any combination of the following:

    +
    +
    x ^ y
    exponentiation (xy)
    +
    ( ... )
    grouping
    +
    x * y
    multiplication
    +
    x / y
    division
    +
    x % y
    modulo
    +
    x + y
    addition
    +
    x - y
    subtraction
    +
    x << y
    left shift
    +
    x >> y
    right shift
    +
    x < y
    boolean relation, return value 1.0 if x < y, otherwise 0.0
    +
    x <= y
    boolean relation, return value 1.0 if x <= y, otherwise 0.0
    +
    x > y
    boolean relation, return value 1.0 if x > y, otherwise 0.0
    +
    x >= y
    boolean relation, return value 1.0 if x >= y, otherwise 0.0
    +
    x == y
    boolean relation, return value 1.0 if x == y, otherwise 0.0
    +
    x != y
    boolean relation, return value 1.0 if x != y, otherwise 0.0
    +
    x & y
    binary AND
    +
    x | y
    binary OR
    +
    x && y
    logical AND connective, return value 1.0 if x > 0 and y > 0, otherwise 0.0
    +
    x || y
    logical OR connective (inclusive), return value 1.0 if x > 0 or y > 0 (or both), otherwise 0.0
    +
    ~x
    logical NOT operator, return value 1.0 if not x > 0, otherwise 0.0
    +
    +x
    unary plus, return 1.0*value
    +
    -x
    unary minus, return -1.0*value
    +
    x ? y : z
    ternary conditional expression, return value y if x != 0, otherwise z; only one ternary conditional permitted per statement
    +
    x = y
    assignment; single character variables are reserved, instead use 2 or more characters, letter combinations only (e.g. Xi not X1)
    +
    x ; y
    statement separator
    +
    phi
    constant (1.618034...)
    +
    pi
    constant (3.14159265359...)
    +
    e
    constant (2.71828...)
    +
    QuantumRange
    constant maximum pixel value (255 for Q8, 65535 for Q16)
    +
    QuantumScale
    constant 1.0/QuantumRange
    +
    intensity
    pixel intensity whose value respects the -intensity option.
    +
    hue
    pixel hue
    +
    saturation
    pixel saturation
    +
    lightness
    pixel lightness; equivalent to 0.5*max(red,green,blue) + 0.5*min(red,green,blue)
    +
    luminance
    pixel luminance; equivalent to 0.212656*red + 0.715158*green + 0.072186*blue
    +
    red, green, blue, etc.
    color names
    +
    #ccc, #cbfed0, #b9e1cc00, etc.
    color hex values
    +
    rgb(), rgba(), cmyk(), cmyka(), hsl(), hsla()
    color functions
    +
    s, t, u, v, n, i, j, w, h, z, r, g, b, a, o, c, y, m, k
    symbols
    +
    abs(x)
    absolute value function
    +
    acos(x)
    arc cosine function
    +
    acosh(x)
    inverse hyperbolic cosine function
    +
    airy(x)
    Airy function (max=1, min=0); airy(x)=[jinc(x)]2=[2*j1(pi*x)/(pi*x)]2
    +
    alt(x)
    sign alternation function (return 1.0 if int(x) is even, -1.0 if int(x) is odd)
    +
    asin(x)
    arc sine function
    +
    asinh(x)
    inverse hyperbolic sine function
    +
    atan(x)
    arc tangent function
    +
    atanh(x)
    inverse hyperbolic tangent function
    +
    atan2(y,x)
    arc tangent function of two variables
    +
    ceil(x)
    smallest integral value not less than argument
    +
    channel(r,g,b,a)
    select numeric argument based on current channel
    +
    channel(c,m,y,k,a)
    select numeric argument based on current channel
    +
    clamp(x)
    clamp value
    +
    cos(x)
    cosine function
    +
    cosh(x)
    hyperbolic cosine function
    +
    debug(x)
    print x (useful for debugging your expression)
    +
    do(condition test, statements)
    iterate while the condition is not equal to 0
    +
    drc(x,y)
    dynamic range compression (knee curve); drc(x,y)=(x)/(y*(x-1)+1); -1<y<1
    +
    erf(x)
    error function
    +
    exp(x)
    natural exponential function (ex)
    +
    floor(x)
    largest integral value not greater than argument
    +
    for(initialization, condition test, expression)
    iterate while the condition is not equal to 0
    +
    gauss(x)
    gaussian function; gauss(x)=exp(-x*x/2)/sqrt(2*pi)
    +
    gcd(x,y)
    greatest common denominator
    +
    hypot(x,y)
    the square root of x2+y2
    +
    if(condition test, nonzero-expression, zero-expression)
    interpret expression depending on condition
    +
    int(x)
    greatest integer function (return greatest integer less than or equal to x)
    +
    isnan(x)
    return 1.0 if x is NAN, 0.0 otherwise
    +
    j0(x)
    Bessel functions of x of the first kind of order 0
    +
    j1(x)
    Bessel functions of x of the first kind of order 1
    +
    jinc(x)
    jinc function (max=1, min=-0.1323); jinc(x)=2*j1(pi*x)/(pi**x)
    +
    ln(x)
    natural logarithm function
    +
    log(x)
    logarithm base 10
    +
    logtwo(x)
    logarithm base 2
    +
    ln(x)
    natural logarithm
    +
    max(x, y)
    maximum of x and y
    +
    min(x, y)
    minimum of x and y
    +
    mod(x, y)
    floating-point remainder function
    +
    not(x)
    return 1.0 if x is zero, 0.0 otherwise
    +
    pow(x,y)
    power function (xy)
    +
    rand()
    value uniformly distributed over the interval [0.0, 1.0) with a 2 to the 128th-1 period
    +
    round()
    round to integral value, regardless of rounding direction
    +
    sign(x)
    return -1.0 if x is less than 0.0 otherwise 1.0
    +
    sin(x)
    sine function
    +
    sinc(x)
    sinc function (max=1, min=-0.21); sinc(x)=sin(pi*x)/(pi*x)
    +
    squish(x)
    squish function; squish(x)=1.0/(1.0+exp(-x))
    +
    sinh(x)
    hyperbolic sine function
    +
    sqrt(x)
    square root function
    +
    tan(x)
    tangent function
    +
    tanh(x)
    hyperbolic tangent function
    +
    trunc(x)
    round to integer, towards zero
    +
    while(condition test, expression)
    iterate while the condition is not equal to 0
    +
    image.depth, image.kurtosis, image.maxima, image.minima, image.resolution.x, image.resolution.y, image.skewness, image.standard_deviation
    image attributes
    +
    +

    The expression semantics include these rules:

    + +
      +
    • symbols are case insensitive
    • +
    • only one ternary conditional (e.g. x ? y : z) per statement
    • +
    • statements are assignments or the final expression to return
    • +
    • an assignment starts a statement, it is not an operator
    • +
    • single character variables are reserved. Assignments to reserved built-ins do not throw an exception and have no effect; e.g. r=3.0; r returns the pixel red color value, not 3.0
    • +
    • unary operators have a lower priority than binary operators, that is, the unary minus (negation) has lower precedence than exponentiation, so -3^2 is interpreted as -(3^2) = -9. Use parentheses to clarify your intent (e.g. (-3)^2 = 9).
    • +
    • care must be exercised when using the slash ('/') symbol. The string of characters 1/2x is interpreted as (1/2)x. The contrary interpretation should be written explicitly as 1/(2x). Again, the use of parentheses helps clarify the meaning and should be used whenever there is any chance of misinterpretation.
    • +
    +
    + + +

    Source Images

    + +

    The symbols u and v refer to the first and second images, respectively, in the current image sequence. Refer to a particular image in a sequence by appending its index to any image reference (usually u), with a zero index for the beginning of the sequence. A negative index counts from the end. For example, u[0] is the first image in the sequence, u[2] is the third, u[-1] is the last image, and u[t] is the current image. The current image can also be referenced by s. If the sequence number exceeds the length of the sequence, the count is wrapped. Thus in a 3-image sequence, u[-1], u[2], and u[5] all refer to the same (third) image.

    + +

    As an example, we form an image by averaging the first image and third images (the second (index 1) image is ignored and just junked):

    + +
      convert image1.jpg image2.jpg image3.jpg -fx "(u+u[2])/2.0" image.jpg
      +
    + +

    By default, the image to which p, r, g, b, a, etc., are applied is the current image s in the image list. This is equivalent to u except when used in an escape sequence %[fx:...].

    + +

    It is important to note the special role played by the first image. This is the only image in the image sequence that is modified, other images are used only for their data. As an illustrative example, consider the following, and note that the setting -channel red instructs -fx to modify only the green channel; nothing in the red or blue channels will change. It is instructive to ponder why the result is not symmetric.

    + +
      convert -channel green logo: -flop logo: -resize "20%" -fx "(u+v)/2" image.jpg
      +
    + +
      + logo-sm-flop.png + logo-sm.png +==> + logo-sm-fx.png +
    + +
    +

    Accessing Pixels

    + +

    All color values are normalized to the range of 0.0 to 1.0. The alpha channel ranges from 0.0 (fully transparent) to 1.0 (fully opaque).

    + +

    The pixels are processed one at a time, but a different pixel of an image can be specified using a pixel index represented by p. For example,

    + +
      p[-1].g      green value of pixel to the immediate left of the current pixel
      +p[-1,-1].r   red value of the pixel diagonally left and up from current pixel
      +
    + +

    To specify an absolute position, use braces, rather than brackets.

    + +
      p{0,0}.r     red value of the pixel in the upper left corner of the image
      +p{12,34}.b   blue pixel value at column number 12, row 34 of the image
      +
    + +

    Integer values of the position retrieve the color of the pixel referenced, while non-integer position values return a blended color according to the current -interpolate setting.

    + +

    A position outside the boundary of the image retrieves a value dictated by the -virtual-pixel option setting.

    + +

    Apply an Expression to Select Image Channels

    + +

    Use the -channel setting to specify the output channel of the result. If no output channel is given, the result is set over all channels except the opacity channel. For example, to replace the red channel of alpha.png with the average of the green channels from the images alpha.png and beta.png, use:

    + +
      convert alpha.png beta.png -channel red -fx "(u.g+v.g)/2" gamma.png
      +
    + + +

    Results

    + +

    The -fx operator evaluates the given expression for each channel (set by -channel) of each pixel in the first image (u) in the sequence. The computed values are temporarily stored in a copy (clone) of that first image until all the pixels have been processed, after which this single new image replaces the list of images in the current image sequence. As such, in the previous example the updated version of alpha.png replaces both of the original images, alpha.png and beta.png, before being saved as gamma.png.

    + +

    The current image s is set to the first image in the sequence (u), and t to its index, 0. The symbols i and j reference the current pixel being processed.

    + + +

    For use with -format, the value-escape %[fx:] is evaluated just once for each image in the current image sequence. As each image in the sequence is being evaluated, s and t successively refer to the current image and its index, while i and j are set to zero, and the current channel set to red (-channel is ignored). An example:

    + +
      convert canvas:'rgb(25%,50%,75%)' rose: -colorspace gray  \
      +  -format 'Red channel of NW corner of image #%[fx:t] is %[fx:s]\n' info:
      +Red channel of NW corner of image #0 is 0.464883
      +Red channel of NW corner of image #1 is 0.184582
      +
    + +

    Here we use the image indexes to rotate each image differently, and use -set with the image index to set a different pause delay on the first image in the animation:

    + +
      convert rose: -duplicate 29 -virtual-pixel Gray -distort SRT '%[fx:360.0*t/n]' \
      +  -set delay '%[fx:t == 0 ? 240 : 10]' -loop 0 rose.gif
      +
    + +

    The color-escape %[pixel:] or %[hex:] is evaluated once per image and per color channel in that image (-channel is ignored), The values generated are then converted into a color string (a named color or hex color value). The symbols i and j are set to zero, and s and t refer to each successively current image and index.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/gradient.html b/ImageMagick-6.9.12-44/www/gradient.html new file mode 100644 index 0000000..2980402 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/gradient.html @@ -0,0 +1,286 @@ + + + + + + + + + + ImageMagick (legacy) – Image Gradients + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Create a Gradual Blend of Two Colors

    +

    An image gradient creates a gradual blend between two colors formed into a shape that is linear, circular, or ellipical.

    + +

    For a linear gradient, the operator is either:

    + +
    gradient:
    +gradient:color1-color2
    +
    + +

    The for a radial gradient, the operator is either:

    + +
    radial-gradient:
    +radial-gradient:color1-color2
    +
    + +

    In the above, color1 is the fromColor and color2 is the toColor, as described in more detail below. The default is white for color1 and black for color2, i.e., white-black.

    + +

    The default for a linear gradient has color1 at the top of the image and color2 at the bottom of the image. Similarly, the default for a radial gradient has color1 at the center of the image and color2 at the boundary of the image.

    + +

    Gradient colors may be any valid color defined per ../www/color.html. The named colors of black/white/grayXX and gray(XX[%]) are non-linear gray. For Linux systems, enclose rgb(a) and hex colors in quotes. Use double quotes, if using variables for the values.

    + +

    Here is an example linear (as opposed to radial) gradient:

    + +
    convert -size 256x256 gradient: linear_gradient.png
    +convert -size 256x256 gradient:white-black linear_gradient.png
    +
    +

    + +

    If you want a radial gradient, try:

    + +
    convert -size 256x256 radial-gradient: radial_gradient.png
    +convert -size 256x256 radial-gradient:white-black radial_gradient.png
    +
    +

    + +

    If you want non-linear grayscale gradients, then add -colorspace RGB -colorspace gray +before saving the output. For example:

    + +

    convert -size 256x256 gradient: linear_gradient.png
    +convert -size 256x256 gradient:white-black -colorspace RGB -colorspace gray linear_linear_gradient.png
    +
    + +
    convert -size 256x256 radial-gradient: radial_gradient.png
    +convert -size 256x256 radial-gradient:white-black -colorspace RGB -colorspace gray linea_radial_gradient.png
    +
    + + +

    As of IM 6.9.2.5, gradients have been enhanced through the use of several -defines.

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    -define gradient:vector=x1,y1, x2,y2Specifies the direction of the linear gradient going from vector1 + (x1,y1) to vector2 (x2,y2). Color1 (fromColor) will be located at vector + position x1,y1 and color2 (toColor) will be located at vector position + x2,y2.
    -define gradient:center=x,ySpecifies the coordinates of the center point for the radial gradient. + The default is the center of the image.
    -define gradient:radii=x,ySpecifies the x and y radii of the gradient. If the x radius and the y + radius are equal, the shape of the radial gradient will be a circle. If + they differ, then the shape will be an ellipse. The default values are the + maximum of the half width and half height of the image.
    -define gradient:angle=angle in degreesFor a linear gradient, this specifies the direction of the gradient + going from color1 to color2 in a clockwise positive manner relative to + north (up). For a radial gradient, this specifies the rotation of the + gradient in a clockwise positive manner from its normal X-Y + orientation.
    -define gradient:bounding-box=widthxheight+x+yLimits the gradient to a larger or smaller region than the image + dimensions. If the region defined by the bounding box is smaller than the + image, then color1 will be the color of the background.
    + + +

    We also support two convenience defines for setting the linear gradient direction and the radial gradient shape.

    + + + + + + + + + + + +
    -define gradient:direction={NorthWest, North, Northeast, West, East, SouthWest, South, SouthEast}Specifies the direction of the linear gradient towards the + top/bottom/left/right or diagonal corners.
    -define gradient:extent={Circle, Diagonal, Ellipse, Maximum, Minimum}Specifies the shape of an image centered radial gradient. Circle and + Maximum draw a circular radial gradient even for rectangular shaped images + of radius equal to the larger of the half-width and half-height of the + image. The Circle and Maximum options are both equivalent to the default + radial gradient. The Minimum option draws a circular radial gradient + even for rectangular shaped images of radius equal to the smaller of the + half-width and half-height of the image. The Diagonal option draws a + circular radial gradient even for rectangular shaped images of radius equal + to the half-diagonal of the image. The Ellipse options draws an elliptical + radial gradient for rectangular shaped images of radii equal to half the + width and half the height of the image.
    + +

    Examples

    + +

    The default linear gradient may also be generated in any of the following ways (or by reversing the direction and swapping color1 and color2):

    + +
    convert -size 256x128 -define gradient:direction=north gradient:black-white linear_gradient_default.png
    +convert -size 256x128 -define gradient:angle=0 gradient:black-white linear_gradient_default.png
    +
    +

    + +

    The equivalent of

    + +
    convert -size 128x256 gradient: -rotate 90 linear_gradient_east.png
    +
    + +

    can be generate by either of the following (or by reversing the direction and swapping color1 and color2):

    + +
    convert -size 256x128 -define gradient:direction=east gradient:black-white linear_gradient_east.png
    +convert -size 256x128 -define gradient:angle=90 gradient:black-white linear_gradient_east.png
    +
    +

    + + +

    Examples of radial gradients going from black in the center to white at the boundary for the cases of "maximum/circle/default", "minimum", "diagonal", "ellipse" and 45 degree rotated ellipse, respectively, follow below.

    + + +
    convert -size 256x128 radial-gradient:black-white radial_gradient_maximum.png
    +convert -size 256x128 -define gradient:radii=128,128 radial-gradient:black-white radial_gradient_maximum.png
    +
    +

    + +
    convert -size 256x128 -define gradient:extent=minimum radial-gradient:black-white radial_gradient_minimum.png
    +convert -size 256x128 -define gradient:radii=64,64 radial-gradient:black-white radial_gradient_minimum.png
    +
    +

    + +
    convert -size 256x128 -define gradient:extent=diagonal radial-gradient:black-white radial_gradient_diagonal.png
    +
    +

    + +
    convert -size 256x128 -define gradient:extent=ellipse radial-gradient:black-white radial_gradient_ellipse.png
    +convert -size 256x128 -define gradient:radii=128,64 radial-gradient:black-white radial_gradient_ellipse.png
    +
    +

    + +
    convert -size 256x256 -define gradient:radii=128,64 -define gradient:angle=45 radial-gradient:black-white radial_gradient_ellipse_angle45.png
    +
    +

    + +
    + +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/high-dynamic-range.html b/ImageMagick-6.9.12-44/www/high-dynamic-range.html new file mode 100644 index 0000000..2aeb5bf --- /dev/null +++ b/ImageMagick-6.9.12-44/www/high-dynamic-range.html @@ -0,0 +1,150 @@ + + + + + + + + + + ImageMagick (legacy) – High Dynamic-Range Images + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    High Dynamic-range Imaging

    +

    High dynamic-range imaging (HDRI) permits a far greater dynamic range of exposures (i.e. a large difference between light and dark areas) than standard digital imaging techniques. HDRI accurately represents the wide range of intensity levels found in real scenes ranging from the brightest direct sunlight to the deepest darkest shadows. The HDR imaging approach includes:

    + +
      +
    • render/capture floating-point color space
    • +
    • encompass the entire perceivable gamut (extend values outside [0,1] range)
    • +
    • post-process in extended color space
    • +
    • apply tone-mapping for specific display
    • +
    + +

    Enabling HDRI in ImageMagick

    + +

    By default, image pixels in ImageMagick are stored as unsigned values that range from 0 to the quantum depth, which is typically 16-bits (Q16). With HDRI enabled, the pixels are stored in a floating-point representation and can include negative values as well as values that exceed the quantum depth. A majority of digital image formats do not support HDRI, and for those images any pixels outside the quantum range are clamped before they are stored.

    + +

    The most promising HDR image format is EXR. You must have the OpenEXR delegate library installed to read or write this format. Other HDR formats include TIFF 48-bit integer and 96-bit float formats, HDR, PFM, and ImageMagick's own MIFF format.

    + +

    To enable the HDRI version of ImageMagick, use this Linux/Linux command:

    + +
    ./configure --enable-hdri
    +
    + +

    Under Windows, set the MAGICKCORE_HDRI_SUPPORT definition in the magick-baseconfig.h configuration file and build.

    + +

    To verify HDRI is properly configured, look for "HDRI" as a feature:

    + +
    identify -version
    +Features: HDRI
    +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/history.html b/ImageMagick-6.9.12-44/www/history.html new file mode 100644 index 0000000..8e30a4d --- /dev/null +++ b/ImageMagick-6.9.12-44/www/history.html @@ -0,0 +1,143 @@ + + + + + + + + + + ImageMagick (legacy) – History + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Genesis

    +
    +I swear by my life and my love of it that I will never live for the sake of another man, nor ask another man to live for mine. -- John Galt in "Atlas Shrugged", by Ayn Rand
    + +

    ImageMagick started with a request from my DuPont supervisor, Dr. David Pensak, to display computer-generated images on a monitor only capable of showing 256 unique colors simultaneously.

    + +

    In 1987, monitors that could display 24-bit true color images were rare and quite expensive. There were a plethora of chemists and biologists at DuPont, but very few were computer scientists to confer with. Instead, I turned to Usenet for help, and posted a request for an algorithm to reduce 24-bit images to 256 colors. Paul Raveling of the USC Information Sciences Institute responded, with not only a solution, but one that was already in source code and available from USC's FTP site. Over the course of the next few years, I had frequent opportunities to get help with other vexing computer science problems I encountered in the course of doing my job at DuPont. Eventually I felt compelled to give thanks for the help I received from the knowledgeable folks on Usenet. I decided to freely release the image processing tools I developed to the world so that others could benefit from my efforts.

    + +

    In 1990 there were few freely available image processing tools so I expected an enthusiastic reception. Before a release was possible, Dr. Pensak had to convince upper management at DuPont to give away what they might perceive as valuable intellectual property. I suspect they agreed simply because ImageMagick was not chemically or biologically based, so they did not understand its value to the company. Either way, ImageMagick would not be available today without DuPont transferring the copyright to ImageMagick Studio LLC. ImageMagick was posted to Usenet's comp.archives group on August 1st, 1990.

    + +

    After ImageMagick's release, I got the occasional request for an enhancement, a report of a bug, or a contribution to the source base. In the mid 90's, I released the culmination of these efforts as ImageMagick 4.2.9. At the time, I thought ImageMagick was complete. It was utilized by thousands of users world-wide, and it was even showing up as part of a new operating system distributed freely called "Linux".

    + +

    The next generation of ImageMagick, version 5, started when Bob Friesenhahn contacted me and suggested I improve the application programming interface so users could leverage the image-processing algorithms from other languages or scripts. Bob also wrote a C++ wrapper for ImageMagick called Magick++, and began contributing enhancements such as the module loader facility, automatic file identification, and test suites. In the mean-time, the project picked up a few other notable contributors: Glenn Randers-Pehrson, William Radcliffe, and Leonard Rosenthol. By now, ImageMagick was utilized by tens of thousands of users, who reacted gruffly when a new release broke an existing API call or script. The other members of the group wanted to freeze the API and command line, but I felt ImageMagick was not quite what I had envisioned it could be. Bob and the others created a fork of ImageMagick while I continued to develop ImageMagick.

    + +

    I did not work alone for long. Anthony Thyssen contacted me about deficiencies in the ImageMagick command line programs. He pointed out that the command line was confusing when dealing with more than one image. He suggested an orderly, well-defined method for dealing with the command line, and this became ImageMagick version 6. His efforts are detailed on his web pages, Examples of ImageMagick Usage. I highly recommend that you peruse his site. He has illustrated the power of ImageMagick in ways that even I did not know were possible.

    + +

    Another notable contributor, Fred Weinhaus, makes available a plethora of command-line scripts that perform geometric transforms, blurs, sharpens, edging, noise removal, and color manipulations. Glenn Randers-Pehrson is our PNG guru and makes other valuable contributions. Dirk Lemstra made, and continues to make, numerous improvements to make ImageMagick more robust under Windows and distributes a .NET wrapper, Magick.NET.

    + +

    The design of ImageMagick is an evolutionary process, with the design and implementation efforts serving to influence and guide further progress in the other. With ImageMagick version 7, we improved the design based on lessons learned from the version 6 implementation. ImageMagick was originally designed to display RGB images to an X Windows server. Over time we extended support to RGBA images and then to the CMYK and CMYKA image format. With ImageMagick version 7, we extend support to arbitrary colorspaces with an arbitrary number of pixel channels. In addition, ImageMagick 7 stores pixel channels as floats permitting out of band values (e.g. negative) and reduces rounding error.

    + +

    Cristy
    Principal ImageMagick Architect

    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/identify.html b/ImageMagick-6.9.12-44/www/identify.html new file mode 100644 index 0000000..91737d0 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/identify.html @@ -0,0 +1,492 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Identify + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Image Format and Characteristics

    +

    Example UsageOption Summary

    + +

    The identify program describes the format and characteristics of one or more image files. It also reports if an image is incomplete or corrupt. The information returned includes the image number, the file name, the width and height of the image, whether the image is colormapped or not, the number of colors in the image, the number of bytes in the image, the format of the image (JPEG, PNM, etc.), and finally the number of seconds it took to read and process the image. Many more attributes are available with the verbose option. See Command Line Processing for advice on how to structure your identify command or see below for example usages of the command.

    + +

    Example Usage

    + +

    We list a few examples of the identify command here to illustrate its usefulness and ease of use. To get started, lets identify an image in the JPEG format:

    + +
    -> identify rose.jpg
    +rose.jpg JPEG 70x46 70x46+0+0 8-bit sRGB 2.36KB 0.000u 0:00.000
    +
    + +

    By default, identify provides the following output:

    + +
      Filename[frame #] image-format widthxheight page-widthxpage-height+x-offset+y-offset colorspace user-time elapsed-time
    + +

    Next, we look at the same image in greater detail:

    + +
    -> identify -verbose rose.jpg
    +Image: rose.jpg
    +  Format: JPEG (Joint Photographic Experts Group JFIF format)
    +  Mime type: images/jpeg
    +  Class: DirectClass
    +  Geometry: 70x46+0+0
    +  Units: Undefined
    +  Type: TrueColor
    +  Endianess: Undefined
    +  Colorspace: sRGB
    +  Depth: 8-bit
    +  Channel depth:
    +    red: 8-bit
    +    green: 8-bit
    +    blue: 8-bit
    +  Channel statistics:
    +    Pixels: 3220
    +    Red:
    +      min: 35 (0.137255)
    +      max: 255 (1)
    +      mean: 145.57 (0.570865)
    +      standard deviation: 67.2976 (0.263912)
    +      kurtosis: -1.37971
    +      skewness: 0.0942169
    +      entropy: 0.974889
    +    Green:
    +      min: 33 (0.129412)
    +      max: 255 (1)
    +      mean: 89.2193 (0.349879)
    +      standard deviation: 52.0803 (0.204236)
    +      kurtosis: 2.70722
    +      skewness: 1.82562
    +      entropy: 0.877139
    +    Blue:
    +      min: 11 (0.0431373)
    +      max: 255 (1)
    +      mean: 80.3742 (0.315193)
    +      standard deviation: 53.8536 (0.21119)
    +      kurtosis: 2.90978
    +      skewness: 1.92617
    +      entropy: 0.866692
    +  Image statistics:
    +    Overall:
    +      min: 11 (0.0431373)
    +      max: 255 (1)
    +      mean: 105.055 (0.411979)
    +      standard deviation: 58.1422 (0.228008)
    +      kurtosis: 1.25759
    +      skewness: 1.4277
    +      entropy: 0.90624
    +  Rendering intent: Perceptual
    +  Gamma: 0.454545
    +  Chromaticity:
    +    red primary: (0.64,0.33)
    +    green primary: (0.3,0.6)
    +    blue primary: (0.15,0.06)
    +    white point: (0.3127,0.329)
    +  Background color: white
    +  Border color: srgb(223,223,223)
    +  Matte color: grey74
    +  Transparent color: black
    +  Interlace: None
    +  Intensity: Undefined
    +  Compose: Over
    +  Page geometry: 70x46+0+0
    +  Dispose: Undefined
    +  Iterations: 0
    +  Compression: JPEG
    +  Quality: 92
    +  Orientation: Undefined
    +  Properties:
    +    date:create: 2014-11-09T09:00:35-05:00
    +    date:modify: 2014-11-09T09:00:35-05:00
    +    jpeg:colorspace: 2
    +    jpeg:sampling-factor: 2x2,1x1,1x1
    +    signature: 22a99838bd5594250f706d1d9383b2830f439fcbaf1455cbe2f7f59a4deb065a
    +  Artifacts:
    +    filename: rose.jpg
    +    verbose: true
    +  Tainted: False
    +  Filesize: 2.36KB
    +  Number pixels: 3.22K
    +  Pixels per second: 3.22EB
    +  User time: 0.000u
    +  Elapsed time: 0:01.000
    +  Version: ImageMagick Q16 https://imagemagick.org
    +
    + +

    Note, the image signature is generated from the pixel components, not the ima +ge metadata.

    + + +

    To get the print size in inches of an image at 72 DPI, use:

    + +
    -> identify -format "%[fx:w/72] by %[fx:h/72] inches" document.png
    +8.5 x 11 inches
    +
    + +

    The depth and dimensions of a raw image must be specified on the command line:

    + +
    -> identify -depth 8 -size 640x480 image.raw
    +image.raw RGB 640x480 sRGB 9kb 0.000u 0:01
    +
    + +

    Here we display the image texture features, moments, perceptual hash, and the number of unique colors in the image:

    + +
    -> identify -verbose -features 1 -moments -unique image.png
    +
    + +

    Here is a special define that outputs the location of the minimum or maximum pixel of the image:

    + +
    identify -precision 5 -define identify:locate=maximum -define identify:limit=3 image.png
    +
    + +

    You can find additional examples of using identify in Examples of ImageMagick Usage.

    + +

    Option Summary

    + +

    The identify command recognizes these options. Click on an option to get more details about how that option works.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    -alphaon, activate, off, deactivate, set, opaque, copy", +transparent, extract, background, or shape the alpha channel
    -antialiasremove pixel-aliasing
    -authenticate valuedecrypt image with this password
    -auto-orientautomagically orient image
    -channel typeapply option to select image channels
    -clipclip along the first path from the 8BIM profile
    -clip-mask filenameassociate clip mask with the image
    -clip-path idclip along a named path from the 8BIM profile
    -colorspace typeset image colorspace
    -crop geometrycrop the image
    -debug eventsdisplay copious debugging information
    -define format:optiondefine one or more image format options
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -endian typeendianness (MSB or LSB) of the image
    -extract geometryextract area from image
    -features distanceanalyze image features (e.g. contract, correlations, etc.).
    -format stringoutput formatted image characteristics
    -gamma valuelevel of gamma correction
    -grayscale methodconvert image to grayscale
    -helpprint program options
    -interlace typetype of image interlacing scheme
    -interpolate methodpixel color interpolation method
    -limit type valuepixel cache resource limit
    -list typeColor, Configure, Delegate, Format, Magic, Module, Resource, or Type
    -log formatformat of debugging information
    -mask filenameassociate a mask with the image
    -momentsdisplay image moments and perceptual hash.
    -monitormonitor progress
    -negatereplace each pixel with its complementary color
    -pingby default, efficiently determine certain image characteristics.
    -precision valueset the maximum number of significant digits to be printed
    -quietsuppress all warning messages
    -regard-warningspay attention to warning messages.
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -sampling-factor geometryhorizontal and vertical sampling factor
    -set attribute valueset an image attribute
    -size geometrywidth and height of image
    -stripstrip image of all profiles and comments
    -uniquedisplay image the number of unique colors in the image.
    -units typethe units of image resolution
    -verboseprint detailed information about the image
    -versionprint version information
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/import.html b/ImageMagick-6.9.12-44/www/import.html new file mode 100644 index 0000000..513a15f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/import.html @@ -0,0 +1,471 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Import + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Screenshot Utility

    +

    Example UsageOption Summary

    + +

    Use the import program to capture some or all of an X server screen and save the image to a file. import captures the window selected by clicking or program argument. See Command Line Processing for advice on how to structure your import command or see below for example usages of the command.

    + +

    Example Usage

    + +

    We list a few examples of the import command here to illustrate its usefulness and ease of use. To get started, lets import an image of an X11 window in the JPEG format:

    + +
    import rose.jpg
    +
    + +

    To capture the entire X server screen in the Postscript image format:

    + +
    import -window root screen.ps
    +
    + +

    You can find additional examples of using import in Graphics from the Command Line. Further discussion is available in More Graphics from the Command Line and Examples of ImageMagick Usage.

    + + +

    Option Summary

    + +

    The import command recognizes these options. Click on an option to get more details about how that option works.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    -adjoinjoin images into a single multi-image file
    -annotate geometry textannotate the image with text
    -borderinclude window border in the output image
    -channel typeapply option to select image channels
    -colors valuepreferred number of colors in the image
    -colorspace typeset image colorspace
    -comment stringannotate image with comment
    -compress typeimage compression type
    -contrastenhance or reduce the image contrast
    -crop geometrypreferred size and location of the cropped image
    -debug eventsimport copious debugging information
    -define format:optiondefine one or more image format options
    -delay centisecondsimport the next image after pausing
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -descendobtain image by descending window hierarchy
    -display serverget image or font from this X server
    -dispose methodlayer disposal method
    -dither methodapply error diffusion to image
    -encipher filenameconvert plain pixels to cipher pixels
    -encoding typetext encoding type
    -endian typeendianness (MSB or LSB) of the image
    -filter typeuse this filter when resizing an image
    -frameinclude window manager frame
    -geometry geometrypreferred size or location of the image
    -gravity typehorizontal and vertical text placement
    -helpprint program options
    -identifyidentify the format and characteristics of the image
    -interlace typetype of image interlacing scheme
    -interpolate methodpixel color interpolation method
    -label nameassign a label to an image
    -limit type valuepixel cache resource limit
    -log formatformat of debugging information
    -monitormonitor progress
    -monochrometransform image to black and white
    -negatereplace each pixel with its complementary color
    -page geometrysize and location of an image canvas (setting)
    -pause secondsseconds delay between snapshots
    -quality valueJPEG/MIFF/PNG compression level
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -quietsuppress all warning messages
    -regard-warningspay attention to warning messages.
    -repage geometrysize and location of an image canvas
    -resize geometryresize the image
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -rotate degreesapply Paeth rotation to the image
    -sampling-factor geometryhorizontal and vertical sampling factor
    -scene valueimage scene number
    -screenselect image from root window
    -seed valueseed a new sequence of pseudo-random numbers
    -set attribute valueset an image attribute
    -silentoperate silently, i.e. don't ring any bells
    -stripstrip image of all profiles and comments
    -synchronizesynchronize image to storage device
    -taintmark the image as modified
    -transparent-color colortransparent color
    -trimtrim image edges
    -type typeimage type
    -verboseprint detailed information about the image
    -versionprint version information
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    -window idselect window with this id or name
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/index.html b/ImageMagick-6.9.12-44/www/index.html new file mode 100644 index 0000000..c46d4da --- /dev/null +++ b/ImageMagick-6.9.12-44/www/index.html @@ -0,0 +1,275 @@ + + + + + + + + + + ImageMagick (legacy) – Convert, Edit, or Compose Digital Images + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    ImageMagick (legacy)

    + +

    +Use ImageMagick® to create, edit, compose, or convert digital images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, GIF, WebP, HEIC, SVG, PDF, DPX, EXR and TIFF. ImageMagick can resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves.

    + +

    ImageMagick is free software delivered as a ready-to-run binary distribution or as source code that you may use, copy, modify, and distribute in both open and proprietary applications. It is distributed under a derived Apache 2.0 license.

    + +

    ImageMagick utilizes multiple computational threads to increase performance and can read, process, or write mega-, giga-, or tera-pixel image sizes.

    + +

    The current release is ImageMagick 6.9.12-28. It runs on Linux, Windows, Mac Os X, iOS, Android OS, and others.

    + +

    The authoritative ImageMagick version 6 web site is https://legacy.imagemagick.org. The authoritative source code repository is https://github.com/ImageMagick/ImageMagick6. Find the latest release of ImageMagick, version 7, at https://imagemagick.org.

    + +

    The design of ImageMagick is an evolutionary process, with the design and implementation efforts serving to influence and guide further progress in the other. With ImageMagick version 7, we aim to improve the design based on lessons learned from the version 6 implementation.

    + +

    Features and Capabilities

    +

    Here are just a few examples of what ImageMagick can do for you:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Animationcreate a GIF animation sequence from a group of images.
    Color managementaccurate color management with color profiles or in lieu of-- built-in gamma compression or expansion as demanded by the colorspace.
    Command-line processingutilize ImageMagick from the command-line.
    Complex text layoutbidirectional text support and shaping.
    Compositeoverlap one image over another.
    Connected component labelinguniquely label connected regions in an image.
    Decorateadd a border or frame to an image.
    Delineate image featuresCanny edge detection, Hough lines.
    Discrete Fourier transformimplements the forward and inverse DFT.
    Distributed pixel cacheoffload intermediate pixel storage to one or more remote servers.
    Drawadd shapes or text to an image.
    Encipher or decipher an imageconvert ordinary images into unintelligible gibberish and back again.
    Format conversionconvert an image from one format to another (e.g. PNG to JPEG).
    Generalized pixel distortioncorrect for, or induce image distortions including perspective.
    Heterogeneous distributed processingcertain algorithms are OpenCL-enabled to take advantage of speed-ups offered by executing in concert across heterogeneous platforms consisting of CPUs, GPUs, and other processors.
    High dynamic-range imagesaccurately represent the wide range of intensity levels found in real scenes ranging from the brightest direct sunlight to the deepest darkest shadows.
    Image calculatorapply a mathematical expression to an image, image sequence, or image channels.
    Image gradientscreate a gradual blend of two colors whose shape is horizontal, vertical, circular, or elliptical.
    Image identificationdescribe the format and attributes of an image.
    ImageMagick on the iPhoneconvert, edit, or compose images on your iOS device such as the iPhone or iPad.
    Large image supportread, process, or write mega-, giga-, or tera-pixel image sizes.
    Montagejuxtapose image thumbnails on an image canvas.
    Morphology of shapesextract features, describe shapes, and recognize patterns in images.
    Motion picture supportread and write the common image formats used in digital film work.
    Noise and color reductionKuwahara Filter, mean-shift.
    Perceptual hashmap visually identical images to the same or similar hash-- useful in image retrieval, authentication, indexing, or copy detection as well as digital watermarking.
    Special effectsblur, sharpen, threshold, or tint an image.
    Text & commentsinsert descriptive or artistic text in an image.
    Threads of execution supportImageMagick is thread safe and most internal algorithms execute in parallel to take advantage of speed-ups offered by multicore processor chips.
    Transformresize, rotate, deskew, crop, flip or trim an image.
    Transparencyrender portions of an image invisible.
    Virtual pixel supportconvenient access to pixels outside the image boundaries.
    +
    + +

    Examples of ImageMagick Usage shows how to use ImageMagick from the command-line to accomplish any of these tasks and much more. Also, see Fred's ImageMagick Scripts: a plethora of command-line scripts that perform geometric transforms, blurs, sharpens, edging, noise removal, and color manipulations. With Magick.NET, use ImageMagick without having to install ImageMagick on your server or desktop. Finally, see Snibgo's ImageMagick Cookbook for Windows-based ImageMagick scripting.

    + +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/www/install-source.html b/ImageMagick-6.9.12-44/www/install-source.html new file mode 100644 index 0000000..4aafb2c --- /dev/null +++ b/ImageMagick-6.9.12-44/www/install-source.html @@ -0,0 +1,203 @@ + + + + + + + + + + ImageMagick (legacy) – Install from Source + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Install ImageMagick from Source

    +

    Install from Linux SourceInstall from Windows Source

    + +

    Chances are, ImageMagick is already installed on your computer if you are using some flavor of Linux, and its likely not installed if you are using some form of Windows. In either case, you can type the following to find out:

    + +
    identify -version
    +
    + +

    If the identify program executes and identifies itself as ImageMagick, you may not need to install ImageMagick from source unless you want to add support for additional image formats or upgrade to a newer version. You also have the option of installing a pre-compiled binary release. However, if you still want to install from source, choose a platform, Linux or Windows. Before installing from source, you may want to review recent changes to the ImageMagick distribution.

    + +

    The authoritative source code repository is https://github.com/ImageMagick/ImageMagick6.

    + +

    Install from Linux Source

    + +

    ImageMagick builds on a variety of Linux and Linux-like operating systems including Linux, Solaris, FreeBSD, Mac OS X, and others. A compiler is required and fortunately almost all modern Linux systems have one. Clone the source repository:

    + +
      $ git clone https://github.com/ImageMagick/ImageMagick6.git ImageMagick-6.9.12
    +

    Or download ImageMagick.tar.gz from imagemagick.org or a mirror and verify the distribution against its message digest.

    + +

    Next configure and compile ImageMagick. Note the pkg-config script is required so that ImageMagick can find certain optional delegate libraries on your system. To configure, type:

    + +
      $ cd ImageMagick-6.9.12
      $ ./configure
      $ make
    +

    If build fails, try gmake instead.

    + +

    For advanced users, we recommend a modules build:

    +
      $ ./configure --with-modules
    +

    If ImageMagick configured and compiled without complaint, you are ready to install it on your system. Administrator privileges are required to install. To install, type

    + +
    sudo make install
    +
    + +

    You may need to configure the dynamic linker run-time bindings:

    + +
    sudo ldconfig /usr/local/lib
    +
    + +

    Finally, verify the ImageMagick install worked properly, type

    + +
    /usr/local/bin/convert logo: logo.gif
    +
    + +

    For a more comprehensive test, run the ImageMagick validation suite. Ghostscript and Freetype are prerequisites, otherwise expect the EPS, PS, PDF and text annotations tests to fail.

    + +
    make check
    +
    + +

    Congratulations, you have a working ImageMagick distribution and you are ready to use ImageMagick to convert, compose, or edit your images or perhaps you'll want to use one of the Application Program Interfaces for C, C++, Perl, and others.

    + +

    The above instructions will satisfy a great number of ImageMagick users, but we suspect a few will have additional questions or problems to consider. For example, what does one do if ImageMagick fails to configure or compile? Or what if you don't have administrator privileges and what if you don't want to install ImageMagick in the default /../usr/local folder? You will find the answer to these questions, and more, in Advanced Linux Source Installation.

    + +

    Install from Windows Source

    + +

    Building ImageMagick source for Windows requires a modern version of Microsoft Visual Studio IDE. Users have reported success with the Borland C++ compiler as well. If you don't have a compiler you can still install a self-installing binary release.

    + +

    Clone the Github repo:

    + +
    git clone -b ImageMagick-Windows-6 --single-branch https://github.com/ImageMagick/ImageMagick6-Windows.git ImageMagick-Windows-6
    + +

    and run CloneRepositories.cmd. Alternatively, download ImageMagick-windows.zip and verify its message digest. For the latter, you can unpack the distribution with WinZip or type the following from any MS-DOS Command Prompt window:

    + +
    unzip ImageMagick-windows.zip
    + +

    Next, launch your Visual Studio IDE and choose Open->Project. Select the configure workspace from the ImageMagick-6.9.12/VisualMagick/configure folder and press Open. Choose Build->Build Solution +to compile the program and on completion run the program.

    + +
      [configure]
    + +

    Press Next and click on the multi-threaded static build. If you are using the Visual Studio 6.0 IDE, make sure no check is next to the Generate Visual Studio 7 format option. Now press, on Next twice and finally Finish. The configuration utility just created a workspace required to build ImageMagick from source. Choose Open->Project and select the VisualStaticMT workspace from the ImageMagick-6.9.12/VisualMagick/ folder. Finally, choose Build->Build Solution to compile and build the ImageMagick distribution.

    + +

    To verify ImageMagick is working properly, launch a MS-DOS Command Prompt window and type

    + +
      $ cd ImageMagick-6.9.12
      $ convert logo: image.jpg
    +

    For a more comprehensive test, run the ImageMagick validation suite:

    + +
    validate
    +
    + +

    Congratulations, you have a working ImageMagick distribution under Windows and you are ready to use ImageMagick to convert, compose, or edit your images or perhaps you'll want to use one of the Application Program Interfaces for C, C++, Perl, and others.

    + +

    The above instructions will satisfy a great number of ImageMagick users, but we suspect a few will have additional questions or problems to consider. For example, what does one do if ImageMagick fails to configure or compile? Or what if you want to install ImageMagick in a place other than the ImageMagick-6.9.12/VisualMagick/bin folder? You will find the answer to these questions, and more, in Advanced Windows Source Installation.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/jp2.html b/ImageMagick-6.9.12-44/www/jp2.html new file mode 100644 index 0000000..987ff10 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/jp2.html @@ -0,0 +1,202 @@ + + + + + + + + + + ImageMagick (legacy) – JP2 Encoding Options + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    + +

    ImageMagick's JPEG-2000 image formats, JP2 and JPC, accept a plethora of encoding options as detailed below. As an example, suppose you are interested in these options:

    + +
      +
    • code blocks are 64 samples in width and 32 samples in height
    • +
    • no multicomponent transform
    • +
    • 4 resolution levels for each component
    • +
    • compression is lossy at 64:1
    • +
    + +

    Use this command to convert a JPEG-2000 image to the PNG image format:

    + +
    convert wizard.jp2 wizard.png
    +
    + +

    Let's convert a JPEG image to a lossless JPEG-2000 image:

    + +
    convert wizard.jpg -quality 0 wizard.jp2
    +
    + +

    Here we extract an area from the image:

    + +
    convert 'wizard.jp2[640x480+0+0]' wizard.png
    +
    + +

    Extract a particular tile from the image:

    + +
    convert 'wizard.jp2[2]' wizard.png
    +
    + +

    Specify a subsampling factor:

    + +
    convert wizard.png -colorspace YUV -sampling-factor 2,2 wizard.jp2
    +
    + +

    Save a tiled JPEG-2000 image:

    + +
    convert wizard.png 'wizard.png[512x512]'
    +
    + +

    Write a digital Cinema 4K profile compliant codestream:

    + +
    convert wizard.png -resize 4096x2160! -depth 12 wizard.jp2
    +
    + +

    Here is a complete list of JPEG-2000 decoding options:

    + +
    + + + + + + + + + +
    jp2:layer-number=xset the maximum number of quality layers to decode.
    jp2:reduce-factor=xset the number of highest resolution levels to be discarded.
    + +

    Here is a complete list of JPEG-2000 encoding options:

    + +
    + + +
    jp2:number-resolutions=x
    +
    number of resolutions to encode.
    + + + + + + + + + + + + + +
    jp2:quality=x,x,...set the quality layer PSNR, given in dB. The order is from left to right in ascending order. The default is a single lossless quality layer.
    jp2:rate=x,x,...the compression ratio values. Each value is a factor of compression, thus 20 means 20 times compressed. The order is from left to right in descending order. A final lossless quality layer is signified by the value 1. The default is a single lossless quality layer.
    jp2:progression-order=xchoose from LRCP, RLCP, RPCL, PCRL or CPRL.
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/license.html b/ImageMagick-6.9.12-44/www/license.html new file mode 100644 index 0000000..c28f82f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/license.html @@ -0,0 +1,248 @@ + + + + + + + + + + ImageMagick (legacy) – License + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    License

    +

    Terms and Conditions for Use, Reproduction, and DistributionHow to Apply the License to your Work

    + +

    Before we get to the text of the license, lets just review what the license says in simple terms:

    + +

    It allows you to:

    + +
      +
    • freely download and use ImageMagick software, in whole or in part, for personal, company internal, or commercial purposes;
    • +
    • use ImageMagick software in packages or distributions that you create;
    • +
    • link against a library under a different license;
    • +
    • link code under a different license against a library under this license;
    • +
    • merge code into a work under a different license;
    • +
    • extend patent grants to any code using code under this license;
    • +
    • and extend patent protection.
    • +
    + +

    It forbids you to:

    + +
      +
    • redistribute any piece of ImageMagick-originated software without proper attribution;
    • +
    • use any marks owned by ImageMagick Studio LLC in any way that might state or imply that ImageMagick Studio LLC endorses your distribution;
    • +
    • use any marks owned by ImageMagick Studio LLC in any way that might state or imply that you created the ImageMagick software in question.
    • +
    + +

    It requires you to:

    + +
      +
    • include a copy of the license in any redistribution you may make that includes ImageMagick software;
    • +
    • provide clear attribution to ImageMagick Studio LLC for any distributions that include ImageMagick software.
    • +
    + +

    It does not require you to:

    + +
      +
    • include the source of the ImageMagick software itself, or of any modifications you may have made to it, in any redistribution you may assemble that includes it;
    • +
    • submit changes that you make to the software back to the ImageMagick Studio LLC (though such feedback is encouraged).
    • +
    + +

    A few other clarifications include:

    + +
      +
    • ImageMagick is freely available without charge;
    • +
    • you may include ImageMagick on any digital media as long as you comply with the terms of the license;
    • +
    • you can give modified code away for free or sell it under the terms of the ImageMagick license or distribute the result under a different license, but you need to acknowledge the use of the ImageMagick software;
    • +
    • the license is compatible with the GPL V3.
    • +
    • when exporting the ImageMagick software, review its export classification.
    • +
    + + +

    Terms and Conditions for Use, Reproduction, and Distribution

    + +

    The legally binding and authoritative terms and conditions for use, reproduction, and distribution of ImageMagick follow:

    + +

    Copyright © 1999 ImageMagick Studio LLC, a non-profit organization dedicated to making software imaging solutions freely available.

    + +

    1. Definitions.

    + +

    License shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    + +

    Licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    + +

    Legal Entity shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, control means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    + +

    You (or Your) shall mean an individual or Legal Entity exercising permissions granted by this License.

    + +

    Source form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    + +

    Object form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    + +

    Work shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    + +

    Derivative Works shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    + +

    Contribution shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as Not a Contribution.

    + +

    Contributor shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

    + +

    2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

    + +

    3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

    + +

    4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    + +
      +
    1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
    2. + +
    3. You must cause any modified files to carry prominent notices stating that You changed the files; and
    4. + +
    5. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
    6. + +
    7. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
    8. +
    + +

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

    + +

    5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

    + +

    6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

    + +

    7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

    + +

    8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

    + +

    9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

    + + +

    How to Apply the License to your Work

    + +

    To apply the ImageMagick License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information (don't include the brackets). The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

    + +
       Copyright [yyyy] [name of copyright owner]
    +
    +   Licensed under the ImageMagick License (the "License"); you may not use
    +   this file except in compliance with the License.  You may obtain a copy
    +   of the License at
    +
    +     ../www/license.html
    +
    +   Unless required by applicable law or agreed to in writing, software
    +   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    +   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
    +   License for the specific language governing permissions and limitations
    +   under the License.
    +
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/links.html b/ImageMagick-6.9.12-44/www/links.html new file mode 100644 index 0000000..a9e3c89 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/links.html @@ -0,0 +1,206 @@ + + + + + + + + + + ImageMagick (legacy) – Related Web Sites + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Links

    +

    Command-line TutorialsProgram Interface TutorialsImageMagick TechniquesInstallation TutorialsImageMagick TopicsImageMagick Book ReviewWeb Site MirrorsImage BankOther Projects

    + +

    Listed here are a number of external web sites that are related to ImageMagick. ImageMagick Studio does not maintain or endorse these sites, but we feel they are a helpfull adjunct to this web site.

    + +

    Use ImageMagick Online

    + + +

    Command-line Tutorials

    + + +

    Program Interface Tutorials

    + + + +

    Installation Tutorials

    + + + +

    ImageMagick Techniques

    + + + +

    ImageMagick Topics

    + + +

    ImageMagick Legacy Discussion

    + + +

    ImageMagick Web Site Mirrors

    + + +

    Image Bank

    + + + +

    Other Projects

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/magick++.html b/ImageMagick-6.9.12-44/www/magick++.html new file mode 100644 index 0000000..b6e2aa3 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/magick++.html @@ -0,0 +1,229 @@ + + + + + + + + + + ImageMagick (legacy) – Magick++, C++ API for ImageMagick + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    DocumentationObtaining Magick++InstallationReporting Bugs

    + + +

    Magick++ API is the object-oriented C++ API to the ImageMagick image-processing library.

    +

    Magick++ supports an object model which is inspired by PerlMagick. +Images support implicit reference counting so that copy constructors +and assignment incur almost no cost. The cost of actually copying an +image (if necessary) is done just before modification and this copy +is managed automagically by Magick++. De-referenced copies are +automagically deleted. The image objects support value (rather than +pointer) semantics so it is trivial to support multiple generations +of an image in memory at one time. +

    +

    Magick++ provides integrated support for the Standard +Template Library (STL) so that the powerful containers available +(e.g. deque, +vector, list, +and map) can +be used to write programs similar to those possible with PERL & +PerlMagick. STL-compatible template versions of ImageMagick's +list-style operations are provided so that operations may be +performed on multiple images stored in STL containers. +

    +

    Documentation

    + +

    Detailed documentation is +provided for all Magick++ classes, class methods, and template +functions which comprise the API. See a Gentle Introduction to Magick++ for an introductory tutorial to Magick++. We include the source if you want to correct, enhance, or expand the tutorial.

    +

    Obtaining Magick++

    + +

    Magick++ is included as part of ImageMagick +source releases and may be retrieved via HTTP +or GitHub. +

    +

    Installation

    + +

    Once you have the Magick++ sources available, follow these detailed +installation instructions for UNIX and +Windows. +

    +

    Usage

    +

    A helper script named Magick++-config is installed +under Linux which assists with recalling compilation options required +to compile and link programs which use Magick++. For example, the +following command compiles and links the source file demo.cpp +to produce the executable demo (notice that quotes are +backward quotes): +

    +
    c++ `Magick++-config --cxxflags --cppflags` -O2 -o demo demo.cpp \
    +  `Magick++-config --ldflags --libs`
    +
    +

    Set the PKG_CONFIG_PATH environment variable if ImageMagick is not in your default system path:

    + +
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
    +
    + +

    Windows users may get started by manually editing a project file +for one of the Magick++ demo programs. +

    +

    Note, under Windows (and possibly the Mac) it may be necessary to initialize the ImageMagick library prior to using the Magick++ library. This initialization is performed by passing the path to the ImageMagick DLLs (assumed to be in the same directory as your program) to the InitializeMagick() function call. This is commonly performed by providing the path to your program (argv[0]) as shown in the following example:

    +
    int main( int argc, char ** argv) {
    +  InitializeMagick(*argv);
    +  ...
    +
    +

    This initialization step is not required under Linux, Linux, +Cygwin, or any other operating environment that supports the notion +of installing ImageMagick in a known location.

    +

    Here is a example program that utilizes the Magick++ API to get you started, magick++.cpp. It reads an image, crops it, and writes it to disk in the PNG image format.

    + +
    
    +#include <Magick++.h> 
    +#include <iostream> 
    +
    +using namespace std; 
    +using namespace Magick; 
    +
    +int main(int argc,char **argv) 
    +{ 
    +  InitializeMagick(*argv);
    +
    +  // Construct the image object. Seperating image construction from the 
    +  // the read operation ensures that a failure to read the image file 
    +  // doesn't render the image object useless. 
    +  Image image;
    +  try { 
    +    // Read a file into image object 
    +    image.read( "logo:" );
    +
    +    // Crop the image to specified size (width, height, xOffset, yOffset)
    +    image.crop( Geometry(100,100, 100, 100) );
    +
    +    // Write the image to a file 
    +    image.write( "logo.png" ); 
    +  } 
    +  catch( Exception &error_ ) 
    +    { 
    +      cout << "Caught exception: " << error_.what() << endl; 
    +      return 1; 
    +    } 
    +  return 0; 
    +}
    +
    +

    Reporting Bugs

    + +

    Questions regarding usage should be directed to or to report any bugs go to +Magick++ community forum. +

    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/magick-core.html b/ImageMagick-6.9.12-44/www/magick-core.html new file mode 100644 index 0000000..fc121cb --- /dev/null +++ b/ImageMagick-6.9.12-44/www/magick-core.html @@ -0,0 +1,376 @@ + + + + + + + + + + ImageMagick (legacy) – MagickCore, Low-level C API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    + +

    The MagickCore API is a low-level interface between the C programming language and the ImageMagick image processing libraries and is recommended for wizard-level programmers only. Unlike the MagickWand C API which uses only a few opaque types and accessors, with MagickCore you almost exlusively access the structure members directly. A description of the MagickCore public methods are found here:

    + + + +

    After you write your MagickCore program, compile it like this:

    + +
    cc -o core core.c `pkg-config --cflags --libs MagickCore`
    + +

    Note, if your instance of ImageMagick does not support modules but does include support for the WMF image format, you'll need to link with the MagickWand library instead (since it is a dependency of the WMF image format):

    + +
    cc -o core core.c `pkg-config --cflags --libs MagickWand`
    + +

    Set the PKG_CONFIG_PATH environment variable if ImageMagick is not in your default system path:

    + +
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
    + +

    Here is a example program that utilizes the MagickCore API to get you started, core.c. It reads a GIF image, creates a thumbnail, and writes it to disk in the PNG image format.

    + +
    #include <stdio.h>
    +#include <stdlib.h>
    +#include <string.h>
    +#include <time.h>
    +#include <magick/MagickCore.h>
    +
    +int main(int argc,char **argv)
    +{
    +  ExceptionInfo
    +    *exception;
    +
    +  Image
    +    *image,
    +    *images,
    +    *resize_image,
    +    *thumbnails;
    +
    +  ImageInfo
    +    *image_info;
    +
    +  if (argc != 3)
    +    {
    +      (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
    +      exit(0);
    +    }
    +  /*
    +    Initialize the image info structure and read an image.
    +  */
    +  MagickCoreGenesis(*argv,MagickTrue);
    +  exception=AcquireExceptionInfo();
    +  image_info=CloneImageInfo((ImageInfo *) NULL);
    +  (void) strcpy(image_info->filename,argv[1]);
    +  images=ReadImage(image_info,exception);
    +  if (exception->severity != UndefinedException)
    +    CatchException(exception);
    +  if (images == (Image *) NULL)
    +    exit(1);
    +  /*
    +    Convert the image to a thumbnail.
    +  */
    +  thumbnails=NewImageList();
    +  while ((image=RemoveFirstImageFromList(&images)) != (Image *) NULL)
    +  {
    +    resize_image=ResizeImage(image,106,80,LanczosFilter,1.0,exception);
    +    if (resize_image == (Image *) NULL)
    +      MagickError(exception->severity,exception->reason,exception->description);
    +    (void) AppendImageToList(&thumbnails,resize_image);
    +    DestroyImage(image);
    +  }
    +  /*
    +    Write the image thumbnail.
    +  */
    +  (void) strcpy(thumbnails->filename,argv[2]);
    +  WriteImage(image_info,thumbnails);
    +  /*
    +    Destroy the image thumbnail and exit.
    +  */
    +  thumbnails=DestroyImageList(thumbnails);
    +  image_info=DestroyImageInfo(image_info);
    +  exception=DestroyExceptionInfo(exception);
    +  MagickCoreTerminus();
    +  return(0);
    +}
    +

    Now lets perform the same contrast enhancement while taking advantage of our dual or quad-core processing system by running the algorithm in parallel utilizing wand views. The sigmoidal-contrast.c module reads an image, applies sigmoidal non-linearity contrast control, and writes the result to disk just like the previous contrast enhancement program, but now it does its work in parallel (assumes ImageMagick is built with OpenMP support).

    + +
    #include <stdio.h>
    +#include <stdlib.h>
    +#include <math.h>
    +#include <magick/MagickCore.h>
    +
    +static MagickBooleanType SigmoidalContrast(ImageView *contrast_view,
    +  const ssize_t y,const int id,void *context)
    +{
    +#define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
    +#define SigmoidalContrast(x) \
    +  (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
    +
    +  RectangleInfo
    +    extent;
    +
    +  register IndexPacket
    +    *indexes;
    +
    +  register PixelPacket
    +    *pixels;
    +
    +  register ssize_t
    +    x;
    +
    +  extent=GetImageViewExtent(contrast_view);
    +  pixels=GetImageViewAuthenticPixels(contrast_view);
    +  for (x=0; x < (ssize_t) (extent.width-extent.x); x++)
    +  {
    +    SetPixelRed(pixels,RoundToQuantum(SigmoidalContrast(GetPixelRed(pixels)));
    +    SetPixelGreen(pixels,RoundToQuantum(SigmoidalContrast(GetPixelGreen(pixels)));
    +    SetPixelBlue(pixels,RoundToQuantum(SigmoidalContrast(GetPixelBlue(pixels)));
    +    SetPixelOpacity(pixels,RoundToQuantum(SigmoidalContrast(GetPixelOpacity(pixels)));
    +    pixels++;
    +  }
    +  indexes=GetImageViewAuthenticIndexes(contrast_view);
    +  if (indexes != (IndexPacket *) NULL)
    +    for (x=0; x < (ssize_t) (extent.width-extent.x); x++)
    +      SetPixelIndex(indexes+x,RoundToQuantum(SigmoidalContrast(GetPixelIndex(indexes+x))));
    +  return(MagickTrue);
    +}
    +
    +int main(int argc,char **argv)
    +{
    +#define ThrowImageException(image) \
    +{ \
    + \
    +  CatchException(exception); \
    +  if (contrast_image != (Image *) NULL) \
    +    contrast_image=DestroyImage(contrast_image); \
    +  exit(-1); \
    +}
    +#define ThrowViewException(view) \
    +{ \
    +  char \
    +    *description; \
    + \
    +  ExceptionType \
    +    severity; \
    + \
    +  description=GetImageViewException(view,&severity); \
    +  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
    +  description=DestroyString(description); \
    +  exit(-1); \
    +}
    +
    +  ExceptionInfo
    +    *exception;
    +
    +  Image
    +    *contrast_image;
    +
    +  ImageInfo
    +    *image_info;
    +
    +  ImageView
    +    *contrast_view;
    +
    +  MagickBooleanType
    +    status;
    +
    +  if (argc != 3)
    +    {
    +      (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
    +      exit(0);
    +    }
    +  /*
    +    Read an image.
    +  */
    +  MagickCoreGenesis(*argv,MagickTrue);
    +  image_info=AcquireImageInfo();
    +  (void) CopyMagickString(image_info->filename,argv[1],MaxTextExtent);
    +  exception=AcquireExceptionInfo();
    +  contrast_image=ReadImage(image_info,exception);
    +  if (contrast_image == (Image *) NULL)
    +    ThrowImageException(contrast_image);
    +  /*
    +    Sigmoidal non-linearity contrast control.
    +  */
    +  contrast_view=NewImageView(contrast_image);
    +  if (contrast_view == (ImageView *) NULL)
    +    ThrowImageException(contrast_image);
    +  status=UpdateImageViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
    +  if (status == MagickFalse)
    +    ThrowImageException(contrast_image);
    +  contrast_view=DestroyImageView(contrast_view);
    +  /*
    +    Write the image then destroy it.
    +  */
    +  status=WriteImages(image_info,contrast_image,argv[2],exception);
    +  if (status == MagickFalse)
    +    ThrowImageException(contrast_image);
    +  contrast_image=DestroyImage(contrast_image);
    +  exception=DestroyExceptionInfo(exception);
    +  image_info=DestroyImageInfo(image_info);
    +  MagickCoreTerminus();
    +  return(0);
    +}
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/magick-script.html b/ImageMagick-6.9.12-44/www/magick-script.html new file mode 100644 index 0000000..bca638e --- /dev/null +++ b/ImageMagick-6.9.12-44/www/magick-script.html @@ -0,0 +1,1323 @@ + + + + + + + + + + ImageMagick - Command-line Tools: Magick-script + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    +

    Use the magick-script scripting language to convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. See Command Line Processing for advice on how to structure your convert command or see below for example usages of the command.

    + +

    Here is an example script:

    + +
    +    #!/bin/env magick-script
    +    -size 100x100 xc:red ( rose: -rotate -90 ) +append  -write show:
    +
    + + +

    You can find additional examples of using magick-script in Examples of ImageMagick Usage.

    + +

    Option Summary

    + +

    The magick command recognizes these options. Click on an option to get more details about how that option works.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    -adaptive-blur geometryadaptively blur pixels; decrease effect near edges
    -adaptive-resize geometryadaptively resize image with data dependent triangulation.
    -adaptive-sharpen geometryadaptively sharpen pixels; increase effect near edges
    -adjoinjoin images into a single multi-image file
    -affine matrixaffine transform matrix
    -alphaon, activate, off, deactivate, set, opaque, copy", +transparent, extract, background, or shape the alpha channel
    -annotate geometry textannotate the image with text
    -antialiasremove pixel-aliasing
    -appendappend an image sequence
    -authenticate valuedecipher image with this password
    -auto-gammaautomagically adjust gamma level of image
    -auto-levelautomagically adjust color levels of image
    -auto-orientautomagically orient image
    -background colorbackground color
    -bench iterationsmeasure performance
    -bias valueadd bias when convolving an image
    -black-threshold valueforce all pixels below the threshold into black
    -blue-primary pointchromaticity blue primary point
    -blue-shift factorsimulate a scene at nighttime in the moonlight
    -blur geometryreduce image noise and reduce detail levels
    -border geometrysurround image with a border of color
    -bordercolor colorborder color
    -brightness-contrast geometryimprove brightness / contrast of the image
    -canny geometryuse a multi-stage algorithm to detect a wide range of edges in the image
    -caption stringassign a caption to an image
    -cdl filenamecolor correct with a color decision list
    -channel typeapply option to select image channels
    -charcoal radiussimulate a charcoal drawing
    -chop geometryremove pixels from the image interior
    -clampset each pixel whose value is below zero to zero and any the pixel whose value is above the quantum range to the quantum range (e.g. 65535) otherwise the pixel value remains unchanged.
    -clipclip along the first path from the 8BIM profile
    -clip-mask filenameassociate clip mask with the image
    -clip-path idclip along a named path from the 8BIM profile
    -clone indexclone an image
    -clutapply a color lookup table to the image
    -connected-components connectivityconnected-components uniquely labeled, choose from 4 or 8 way connectivity
    -contrast-stretch geometryimprove the contrast in an image by `stretching' the range of intensity value
    -coalescemerge a sequence of images
    -colorize valuecolorize the image with the fill color
    -color-matrix matrixapply color correction to the image.
    -colors valuepreferred number of colors in the image
    -colorspace typeset image colorspace
    -combinecombine a sequence of images
    -comment stringannotate image with comment
    -comparecompare image
    -complexoperatorperform complex mathematics on an image sequence
    -compose operatorset image composite operator
    -compositecomposite image
    -compress typeimage compression type
    -contrastenhance or reduce the image contrast
    -convolve coefficientsapply a convolution kernel to the image
    -copy geometry offsetcopy pixels from one area of an image to another
    -crop geometrycrop the image
    -cycle amountcycle the image colormap
    -decipher filenameconvert cipher pixels to plain
    -debug eventsdisplay copious debugging information
    -define format:optiondefine one or more image format options
    -deconstructbreak down an image sequence into constituent parts
    -delay valuedisplay the next image after pausing
    -delete indexdelete the image from the image sequence
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -despecklereduce the speckles within an image
    -direction typerender text right-to-left or left-to-right
    -display serverget image or font from this X server
    -dispose methodlayer disposal method
    -distribute-cache portlaunch a distributed pixel cache server
    -distort type coefficientsdistort image
    -dither methodapply error diffusion to image
    -draw stringannotate the image with a graphic primitive
    -duplicate count,indexesduplicate an image one or more times
    -edge radiusapply a filter to detect edges in the image
    -emboss radiusemboss an image
    -encipher filenameconvert plain pixels to cipher pixels
    -encoding typetext encoding type
    -endian typeendianness (MSB or LSB) of the image
    -enhanceapply a digital filter to enhance a noisy image
    -equalizeperform histogram equalization to an image
    -evaluate operator valueevaluate an arithmetic, relational, or logical expression
    -evaluate-sequence operatorevaluate an arithmetic, relational, or logical expression for an image sequence
    -extent geometryset the image size
    -extract geometryextract area from image
    -family namerender text with this font family
    -features distanceanalyze image features (e.g. contract, correlations, etc.).
    -fftimplements the discrete Fourier transform (DFT)
    -fill colorcolor to use when filling a graphic primitive
    -filter typeuse this filter when resizing an image
    -flattenflatten a sequence of images
    -flipflip image in the vertical direction
    -floodfill geometry colorfloodfill the image with color
    -flopflop image in the horizontal direction
    -font namerender text with this font
    -format stringoutput formatted image characteristics
    -frame geometrysurround image with an ornamental border
    -function nameapply a function to the image
    -fuzz distancecolors within this distance are considered equal
    -fx expressionapply mathematical expression to an image channel(s)
    -gamma valuelevel of gamma correction
    -gaussian-blur geometryreduce image noise and reduce detail levels
    -geometry geometrypreferred size or location of the image
    -gravity typehorizontal and vertical text placement
    -grayscale methodconvert image to grayscale
    -green-primary pointchromaticity green primary point
    -helpprint program options
    -hough-lines geometryidentify lines in the image
    -identifyidentify the format and characteristics of the image
    -iftimplements the inverse discrete Fourier transform (DFT)
    -implode amountimplode image pixels about the center
    -insert indexinsert last image into the image sequence
    -intensity methodmethod to generate an intensity value from a pixel
    -intent typetype of rendering intent when managing the image color
    -interlace typetype of image interlacing scheme
    -interline-spacing valuethe space between two text lines
    -interpolate methodpixel color interpolation method
    -interword-spacing valuethe space between two words
    -kerning valuethe space between two characters
    -kuwahara geometryedge preserving noise reduction filter
    -label stringassign a label to an image
    -lat geometrylocal adaptive thresholding
    -layers methodoptimize or compare image layers
    -level valueadjust the level of image contrast
    -limit type valuepixel cache resource limit
    -linear-stretch geometrylinear with saturation histogram stretch
    -liquid-rescale geometryrescale image with seam-carving
    -list typeColor, Configure, Delegate, Format, Magic, Module, Resource, or Type
    -log formatformat of debugging information
    -loop iterationsadd Netscape loop extension to your GIF animation
    -mask filenameassociate a mask with the image
    -mattecolor colorframe color
    -median radiusapply a median filter to the image
    -mean-shift geometrydelineate arbitrarily shaped clusters in the image
    -metric typemeasure differences between images with this metric
    -mode radiusmake each pixel the 'predominant color' of the neighborhood
    -modulate valuevary the brightness, saturation, and hue
    -momentsdisplay image moments.
    -monitormonitor progress
    -monochrometransform image to black and white
    -morph valuemorph an image sequence
    -morphology method kernelapply a morphology method to the image
    -motion-blur geometrysimulate motion blur
    -negatereplace each pixel with its complementary color
    -noise radiusadd or reduce noise in an image
    -normalizetransform image to span the full range of colors
    -opaque colorchange this color to the fill color
    -ordered-dither NxNordered dither the image
    -orient typeimage orientation
    -page geometrysize and location of an image canvas (setting)
    -paint radiussimulate an oil painting
    -perceptibleset each pixel whose value is less than |epsilon| to -epsilon or epsilon (whichever is closer) otherwise the pixel value remains unchanged.
    -pingefficiently determine image attributes
    -pointsize valuefont point size
    -polaroid anglesimulate a Polaroid picture
    -poly termsbuild a polynomial from the image sequence and the corresponding terms (coefficients and degree pairs).
    -posterize levelsreduce the image to a limited number of color levels
    -precision valueset the maximum number of significant digits to be printed
    -preview typeimage preview type
    -print stringinterpret string and print to console
    -process image-filterprocess the image with a custom image filter
    -profile filenameadd, delete, or apply an image profile
    -quality valueJPEG/MIFF/PNG compression level
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -radial-blur angleradial blur the image
    -raise valuelighten/darken image edges to create a 3-D effect
    -random-threshold low,highrandom threshold the image
    -red-primary pointchromaticity red primary point
    -regard-warningspay attention to warning messages.
    -region geometryapply options to a portion of the image
    -remap filenametransform image colors to match this set of colors
    -renderrender vector graphics
    -repage geometrysize and location of an image canvas
    -resample geometrychange the resolution of an image
    -resize geometryresize the image
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -roll geometryroll an image vertically or horizontally
    -rotate degreesapply Paeth rotation to the image
    -sample geometryscale image with pixel sampling
    -sampling-factor geometryhorizontal and vertical sampling factor
    -scale geometryscale the image
    -scene valueimage scene number
    -seed valueseed a new sequence of pseudo-random numbers
    -segment valuessegment an image
    -selective-blur geometryselectively blur pixels within a contrast threshold
    -separateseparate an image channel into a grayscale image
    -sepia-tone thresholdsimulate a sepia-toned photo
    -set attribute valueset an image attribute
    -shade degreesshade the image using a distant light source
    -shadow geometrysimulate an image shadow
    -sharpen geometrysharpen the image
    -shave geometryshave pixels from the image edges
    -shear geometryslide one edge of the image along the X or Y axis
    -sigmoidal-contrast geometryincrease the contrast without saturating highlights or shadows
    -smush offsetsmush an image sequence together
    -size geometrywidth and height of image
    -sketch geometrysimulate a pencil sketch
    -solarize thresholdnegate all pixels above the threshold level
    -splice geometrysplice the background color into the image
    -spread radiusdisplace image pixels by a random amount
    -statistic type geometryreplace each pixel with corresponding statistic from the neighborhood
    -stripstrip image of all profiles and comments
    -stroke colorgraphic primitive stroke color
    -strokewidth valuegraphic primitive stroke width
    -stretch typerender text with this font stretch
    -style typerender text with this font style
    -swap indexesswap two images in the image sequence
    -swirl degreesswirl image pixels about the center
    -synchronizesynchronize image to storage device
    -taintmark the image as modified
    -texture filenamename of texture to tile onto the image background
    -threshold valuethreshold the image
    -thumbnail geometrycreate a thumbnail of the image
    -tile filenametile image when filling a graphic primitive
    -tile-offset geometryset the image tile offset
    -tint valuetint the image with the fill color
    -transformaffine transform image
    -transparent colormake this color transparent within the image
    -transparent-color colortransparent color
    -transposeflip image in the vertical direction and rotate 90 degrees
    -transverseflop image in the horizontal direction and rotate 270 degrees
    -treedepth valuecolor tree depth
    -trimtrim image edges
    -type typeimage type
    -undercolor colorannotation bounding box color
    -unique-colorsdiscard all but one of any pixel color.
    -units typethe units of image resolution
    -unsharp geometrysharpen the image
    -verboseprint detailed information about the image
    -versionprint version information
    -viewFlashPix viewing transforms
    -vignette geometrysoften the edges of the image in vignette style
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    -wave geometryalter an image along a sine wave
    -wavelet-denoise thresholdremoves noise from the image using a wavelet transform
    -weight typerender text with this font weight
    -white-point pointchromaticity white point
    -white-threshold valueforce all pixels above the threshold into white
    -write filenamewrite images to this file
    +
    +
    +
    +
    + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/magick-vector-graphics.html b/ImageMagick-6.9.12-44/www/magick-vector-graphics.html new file mode 100644 index 0000000..dedf713 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/magick-vector-graphics.html @@ -0,0 +1,929 @@ + + + + + + + + + + ImageMagick (legacy) – Magick Vector Graphics + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Magick Vector Graphics

    +

    MVG OverviewDrawing Primitives

    + +

    This specification defines the features and syntax for Magick Vector Graphics (MVG), a modularized language for describing two-dimensional vector and mixed vector/raster graphics in ImageMagick. You can use the language to draw from the +command line, from an MVG file, from an SVG -- Scalable Vector Graphics file or from one of the ImageMagick program interfaces. Use this command, for example, to render an arc:

    + +
    convert -size 100x60 canvas:skyblue -fill white -stroke black \
    +  -draw "path \'M 30,40  A 30,20  20  0,0 70,20 A 30,20  20  1,0 30,40 Z \'" \
    +  arc.png');
    +
    + +

    and here is the result:

    + +
      + arc +
    + +

    When the drawing gets sufficiently complex, we recommend you assemble the graphic primitives into a MVG file. For our example, we use piechart.mvg:

    + +
    push graphic-context
    +  viewbox 0 0 624 369
    +  affine 0.283636 0 0 0.283846 -0 -0
    +  push graphic-context
    +    push graphic-context
    +      fill 'darkslateblue'
    +      stroke 'blue'
    +      stroke-width 1
    +      rectangle 1,1 2199,1299
    +    pop graphic-context
    +    push graphic-context
    +      font-size 40
    +      fill 'white'
    +      stroke-width 1
    +      text 600,1100 'Average: 20.0'
    +    pop graphic-context
    +    push graphic-context
    +      fill 'red'
    +      stroke 'black'
    +      stroke-width 5
    +      path 'M700.0,600.0 L340.0,600.0 A360.0,360.0 0 0,1 408.1452123287954,389.2376150414973 z'
    +    pop graphic-context
    +    push graphic-context
    +      font-size 40
    +      fill 'white'
    +      stroke-width 1
    +      text 1400,140 'MagickWand for PHP'
    +    pop graphic-context
    +    push graphic-context
    +      font-size 30
    +      fill 'white'
    +      stroke-width 1
    +      text 1800,140 '(10.0%)'
    +    pop graphic-context
    +    push graphic-context
    +      fill 'red'
    +      stroke 'black'
    +      stroke-width 4
    +      rectangle 1330,100 1370,140
    +    pop graphic-context
    +    push graphic-context
    +      fill 'yellow'
    +      stroke 'black'
    +      stroke-width 5
    +      path 'M700.0,600.0 L408.1452123287954,389.2376150414973 A360.0,360.0 0 0,1 976.5894480359858,369.56936567559273 z'
    +    pop graphic-context
    +    push graphic-context
    +      font-size 40
    +      fill 'white'
    +      stroke-width 1
    +      text 1400,220 'MagickCore'
    +    pop graphic-context
    +    push graphic-context
    +      font-size 30
    +      fill 'white'
    +      stroke-width 1
    +      text 1800,220 '(29.0%)'
    +    pop graphic-context
    +    push graphic-context
    +      fill 'yellow'
    +      stroke 'black'
    +      stroke-width 4
    +      rectangle 1330,180 1370,220
    +    pop graphic-context
    +    push graphic-context
    +      fill 'fuchsia'
    +      stroke 'black'
    +      stroke-width 5
    +      path 'M700.0,600.0 L976.5894480359858,369.56936567559273 A360.0,360.0 0 0,1 964.2680466142854,844.4634932636567 z'
    +    pop graphic-context
    +    push graphic-context
    +      font-size 40
    +      fill 'white'
    +      stroke-width 1
    +      text 1400,300 'MagickWand'
    +    pop graphic-context
    +    push graphic-context
    +      font-size 30
    +      fill 'white'
    +      stroke-width 1
    +      text 1800,300 '(22.9%)'
    +    pop graphic-context
    +    push graphic-context
    +      fill 'fuchsia'
    +      stroke 'black'
    +      stroke-width 4
    +      rectangle 1330,260 1370,300
    +    pop graphic-context
    +    push graphic-context
    +      fill 'blue'
    +      stroke 'black'
    +      stroke-width 5
    +      path 'M700.0,600.0 L964.2680466142854,844.4634932636567 A360.0,360.0 0 0,1 757.853099990584,955.3210081341651 z'
    +    pop graphic-context
    +    push graphic-context
    +      font-size 40
    +      fill 'white'
    +      stroke-width 1
    +      text 1400,380 'JMagick'
    +    pop graphic-context
    +    push graphic-context
    +      font-size 30
    +      fill 'white'
    +      stroke-width 1
    +      text 1800,380 '(10.6%)'
    +    pop graphic-context
    +    push graphic-context
    +      fill 'blue'
    +      stroke 'black'
    +      stroke-width 4
    +      rectangle 1330,340 1370,380
    +    pop graphic-context
    +    push graphic-context
    +      fill 'lime'
    +      stroke 'black'
    +      stroke-width 5
    +      path 'M700.0,600.0 L757.853099990584,955.3210081341651 A360.0,360.0 0 0,1 340.0,600.0 z'
    +    pop graphic-context
    +    push graphic-context
    +      font-size 40
    +      fill 'white'
    +      stroke-width 1
    +      text 1400,460 'Magick++'
    +    pop graphic-context
    +    push graphic-context
    +      font-size 30
    +      fill 'white'
    +      stroke-width 1
    +      text 1800,460 '(27.5%)'
    +    pop graphic-context
    +    push graphic-context
    +      fill 'lime'
    +      stroke 'black'
    +      stroke-width 4
    +      rectangle 1330,420 1370,460
    +    pop graphic-context
    +    push graphic-context
    +      font-size 100
    +      fill 'white'
    +      stroke-width 1
    +      text 100,150 'ImageMagick'
    +    pop graphic-context
    +    push graphic-context
    +      fill 'none'
    +      stroke 'black'
    +      stroke-width 5
    +      circle 700,600 700,960
    +    pop graphic-context
    +  pop graphic-context
    +pop graphic-context
    +
    + +

    to render a pie chart with this command:

    + +
    convert mvg:piechart.mvg piechart.png
    +
    + +

    which produces this rendering:

    + +
      + piechart +
    + +

    However, in general, MVG is sufficiently difficult to work with that you probably want to use a program to generate your graphics in the SVG format. ImageMagick automagically converts SVG to MVG and renders your image, for example, we render piechart.svg with this command:

    + +
    convert mvg:piechart.svg piechart.jpg
    +
    + + +

    to produce the same pie chart we created with the MVG language.

    + +

    Drawing is available from many of the ImageMagick program interfaces as well. ImageMagick converts the drawing API calls to MVG and renders it. Here is example code written in the MagickWand language:

    + +
    (void) PushDrawingWand(draw_wand);
    +{
    +  const PointInfo points[6] =
    +  {
    +    { 180,504 },
    +    { 282.7,578.6 },
    +    { 243.5,699.4 },
    +    { 116.5,699.4 },
    +    { 77.26,578.6 },
    +    { 180,504 }
    +  };
    +
    +  DrawSetStrokeAntialias(draw_wand,True);
    +  DrawSetStrokeWidth(draw_wand,9);
    +  DrawSetStrokeLineCap(draw_wand,RoundCap);
    +  DrawSetStrokeLineJoin(draw_wand,RoundJoin);
    +  (void) DrawSetStrokeDashArray(draw_wand,0,(const double *)NULL);
    +  (void) PixelSetColor(color,"#4000c2");
    +  DrawSetStrokeColor(draw_wand,color);
    +  DrawSetFillRule(draw_wand,EvenOddRule);
    +  (void) PixelSetColor(color,"#800000");
    +  DrawSetFillColor(draw_wand,color);
    +  DrawPolygon(draw_wand,6,points);
    +}
    +(void) PopDrawingWand(draw_wand);
    +
    + +

    MVG Overview

    + +

    MVG ignores all white-space between commands. This allows multiple MVG commands per line. It is common convention to terminate each MVG command with a new line to make MVG easier to edit and read. This syntax description uses indentation in MVG sequences to aid with understanding. Indentation is supported but is not required.

    + +

    Metafile wrapper syntax (to support stand-alone MVG files):

    + +
    push graphic-context
    +  viewbox 0 0 width height
    +  [ any other MVG commands ]
    +pop graphic-context
    +
    + +

    Pattern syntax (saving and restoring context):

    + +
    push pattern id x,y width,height
    + push graphic-context
    +  [ drawing commands ]
    + pop graphic-context
    +pop pattern
    +
    + +

    an example is (%s is a identifier string):

    + +
    push defs
    + push pattern %s 10,10 20,20
    +  push graphic-context
    +   fill red
    +   rectangle 5,5 15,15
    +  pop graphic-context
    +  push graphic-context
    +   fill green
    +   rectangle 10,10 20,20
    +  pop graphic-context
    + pop pattern
    +pop defs
    +
    + +

    For image tiling use:

    + +
    push pattern id x,y width,height
    + image Copy ...
    +pop pattern
    +
    + +

    Note you can use the pattern for either the fill or stroke like:

    + +
    stroke url(#%s)
    +
    + +

    or

    + +
    fill url(#%s)
    +
    + +

    The clip path defines a clipping area, where only the contained area to be drawn upon. Areas outside of the clipping areare masked.

    + +
    push defs
    + push clip-path "myClipPath"
    +  push graphic-context
    +   rectangle 10,10 20,20
    +  pop graphic-context
    + pop clip-path
    +pop defs
    +clip-path url(#myClipPath)
    +
    + +

    Drawing Primitives

    + +

    Here is a complete description of the MVG drawing primitives:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PrimitiveDescription
    affine sx,rx,ry,sy,tx,ty
    arc x0,y0 x1,y1 a0,a1
    bezier x0,y0 ... xn,ynBezier (spline) requires three or more x,y coordinates to define its shape. The first and last points are the knots (preserved coordinates) and any intermediate coordinates are the control points. If two control points are specified, the line between each end knot and its sequentially respective control point determines the tangent direction of the curve at that end. If one control point is specified, the lines from the end knots to the one control point determines the tangent directions of the curve at each end. If more than two control points are specified, then the additional control points act in combination to determine the intermediate shape of the curve. In order to draw complex curves, it is highly recommended either to use the Path primitive or to draw multiple four-point bezier segments with the start and end knots of each successive segment repeated.
    border-color color
    circle originx,originy perimeterx,perimetery
    clip-path url(name)
    clip-rule ruleChoose from these rule types: +
    evenodd
    +nonzero
    clip-units unitsChoose from these unit types: +
    userSpace
    +userSpaceOnUse
    +objectBoundingBox
    color x,y methodChoose from these method types: +
    point
    +replace
    +floodfill
    +filltoborder
    +reset
    compliance typeChoose from these compliance types: MVG or SVG
    decorate typeChoose from these types of decorations: +
    none
    +line-through
    +overline
    +underline
    ellipse centerx,centery radiusx,radiusy arcstart,arcstop
    fill colorChoose from any of these colors.
    fill-opacity opacityThe opacity ranges from 0.0 (fully transparent) to 1.0 (fully opaque) or as a percentage (e.g. 50%).
    fill-rule ruleChoose from these rule types: +
    evenodd
    +nonzero
    font name
    font-family family
    font-size point-size
    font-stretch typeChoose from these stretch types: +
    all
    +normal
    +ultra-condensed
    +extra-condensed
    +condensed
    +semi-condensed
    +semi-expanded
    +expanded
    +extra-expanded
    +ultra-expanded
    font-style styleChoose from these styles: +
    all
    +normal
    +italic
    +oblique
    font-weight weightChoose from these weights: +
    all
    +normal
    +bold
    +100
    +200
    +300
    +400
    +500
    +600
    +700
    +800
    +900
    gradient-units unitsChoose from these units: +
    userSpace
    +userSpaceOnUse
    +objectBoundingBox
    gravity typeChoose from these gravity types: +
    NorthWest
    +North
    +NorthEast
    +West
    +Center
    +East
    +SouthWest
    +South
    +SouthEast
    image compose x,y width,height 'filename'Choose from these compose operations: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDescription
    clearBoth the color and the alpha of the destination are cleared. Neither the source nor the destination are used as input.
    srcThe source is copied to the destination. The destination is not used as input.
    dstThe destination is left untouched.
    src-overThe source is composited over the destination.
    dst-overThe destination is composited over the source and the result replaces the destination.
    src-inThe part of the source lying inside of the destination replaces the destination.
    dst-inThe part of the destination lying inside of the source replaces the destination.
    src-outThe part of the source lying outside of the destination replaces the destination.
    dst-outThe part of the destination lying outside of the source replaces the destination.
    src-atopThe part of the source lying inside of the destination is composited onto the destination.
    dst-atopThe part of the destination lying inside of the source is composited over the source and replaces the destination.
    multiplyThe source is multiplied by the destination and replaces the destination. The resultant color is always at least as dark as either of the two constituent colors. Multiplying any color with black produces black. Multiplying any color with white leaves the original color unchanged.
    screenThe source and destination are complemented and then multiplied and then replace the destination. The resultant color is always at least as light as either of the two constituent colors. Screening any color with white produces white. Screening any color with black leaves the original color unchanged.
    overlayMultiplies or screens the colors, dependent on the destination color. Source colors overlay the destination whilst preserving its highlights and shadows. The destination color is not replaced, but is mixed with the source color to reflect the lightness or darkness of the destination.
    darkenSelects the darker of the destination and source colors. The destination is replaced with the source when the source is darker, otherwise it is left unchanged.
    lightenSelects the lighter of the destination and source colors. The destination is replaced with the source when the source is lighter, otherwise it is left unchanged.
    linear-lightIncrease contrast slightly with an impact on the foreground's tonal values.
    color-dodgeBrightens the destination color to reflect the source color. Painting with black produces no change.
    color-burnDarkens the destination color to reflect the source color. Painting with white produces no change.
    hard-lightMultiplies or screens the colors, dependent on the source color value. If the source color is lighter than 0.5, the destination is lightened as if it were screened. If the source color is darker than 0.5, the destination is darkened, as if it were multiplied. The degree of lightening or darkening is proportional to the difference between the source color and 0.5. If it is equal to 0.5 the destination is unchanged. Painting with pure black or white produces black or white.
    soft-lightDarkens or lightens the colors, dependent on the source color value. If the source color is lighter than 0.5, the destination is lightened. If the source color is darker than 0.5, the destination is darkened, as if it were burned in. The degree of darkening or lightening is proportional to the difference between the source color and 0.5. If it is equal to 0.5, the destination is unchanged. Painting with pure black or white produces a distinctly darker or lighter area, but does not result in pure black or white.
    plusThe source is added to the destination and replaces the destination. This operator is useful for animating a dissolve between two images.
    addAs per 'plus' but transparency data is treated as matte + values. As such any transparent areas in either image remain + transparent.
    minusSubtract the colors in the source image from the + destination image. When transparency is involved, Opaque areas will be + subtracted from any destination opaque areas.
    subtractSubtract the colors in the source image from the + destination image. When transparency is involved transparent areas are + subtracted, so only the opaque areas in the source remain opaque in + the destination image.
    differenceSubtracts the darker of the two constituent colors from the lighter. Painting with white inverts the destination color. Painting with black produces no change.
    exclusionProduces an effect similar to that of 'difference', but appears as lower contrast. Painting with white inverts the destination color. Painting with black produces no change.
    xorThe part of the source that lies outside of the destination is combined with the part of the destination that lies outside of the source.
    copy-*Copy the specified channel in the source image to the + same channel in the destination image. If the channel specified in + the source image does not exist, (which can only happen for methods, + 'copy-opacity' or 'copy-black') then it is + assumed that the source image is a special grayscale channel image + of the values to be copied.
    change-maskReplace any destination pixel that is the similar to the source images pixel (as defined by the current -fuzz factor), with transparency.
    interline-spacing pixels
    interword-spacing pixels
    kerning pixels
    line x,y x1,y1
    matte x,y methodChoose from these methods: +
    point
    +replace
    +floodfill
    +filltoborder
    +reset
    offset offset
    opacity opacityUse percent (e.g. 50%).
    path path
    point x,y
    polygon x,y x1,y1, ..., xn,yn
    polyline x,y x1,y1, ..., xn,yn
    pop clip-path
    pop defs
    pop gradient
    pop graphic-context
    pop pattern
    push clip-path "name"
    push defs
    push gradient id linear x,y x1,y1
    push gradient id radial xc,cy xf,yf radius
    push graphic-context { "id" }the id is optional
    push pattern id radial x,y width,height
    rectangle x,y x1,y1
    rotate angle
    roundrectangle x,y x1,y1 width,height
    scale x,y
    skewX angle
    skewX angle
    stop-color color offset
    stroke color
    stroke-antialias 0 • 1
    stroke-dasharray none • numeric-list
    stroke-dashoffset offset
    stroke-linecap typeChoose from these cap types: +
    butt
    +round
    +square
    stroke-linejoin typeChoose from these join types: +
    bevel
    +miter
    +round
    stroke-miterlimit limit
    stroke-opacity opacityThe opacity ranges from 0.0 (fully transparent) to 1.0 (fully opaque) or as a percentage (e.g. 50%).
    stroke-width width
    text "text"
    text-antialias 0 • 1
    text-undercolor color
    translate x,y
    use "url(#id)"
    viewbox x,y x1,y1
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/magick-wand.html b/ImageMagick-6.9.12-44/www/magick-wand.html new file mode 100644 index 0000000..c24f405 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/magick-wand.html @@ -0,0 +1,424 @@ + + + + + + + + + + ImageMagick (legacy) – MagickWand, C API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    MagickWand Image API for C

    +

    The MagickWand API is the recommended interface between the C programming language and the ImageMagick image processing libraries. Unlike the MagickCore C API, MagickWand uses only a few opaque types. Accessors are available to set or get important wand properties. A description of the MagickWand public methods are found here:

    + + + +

    After you write your MagickWand program, compile it like this:

    + +
    cc -o wand wand.c `pkg-config --cflags --libs MagickWand`
    + +

    Set the PKG_CONFIG_PATH environment variable if ImageMagick is not in your default system path:

    + +
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
    + +

    Here is a example program that utilizes the MagickWand API to get you started, wand.c. It reads an image, creates a thumbnail, and writes the result to disk.

    + +
    #include <stdio.h>
    +#include <stdlib.h>
    +#include <wand/MagickWand.h>
    +
    +int main(int argc,char **argv)
    +{
    +#define ThrowWandException(wand) \
    +{ \
    +  char \
    +    *description; \
    + \
    +  ExceptionType \
    +    severity; \
    + \
    +  description=MagickGetException(wand,&severity); \
    +  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
    +  description=(char *) MagickRelinquishMemory(description); \
    +  exit(-1); \
    +}
    +
    +  MagickBooleanType
    +    status;
    +
    +  MagickWand
    +    *magick_wand;
    +
    +  if (argc != 3)
    +    {
    +      (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
    +      exit(0);
    +    }
    +  /*
    +    Read an image.
    +  */
    +  MagickWandGenesis();
    +  magick_wand=NewMagickWand();
    +  status=MagickReadImage(magick_wand,argv[1]);
    +  if (status == MagickFalse)
    +    ThrowWandException(magick_wand);
    +  /*
    +    Turn the images into a thumbnail sequence.
    +  */
    +  MagickResetIterator(magick_wand);
    +  while (MagickNextImage(magick_wand) != MagickFalse)
    +    MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
    +  /*
    +    Write the image then destroy it.
    +  */
    +  status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
    +  if (status == MagickFalse)
    +    ThrowWandException(magick_wand);
    +  magick_wand=DestroyMagickWand(magick_wand);
    +  MagickWandTerminus();
    +  return(0);
    +}
    +
    + +

    Here is another program that shows one way to get and set image pixels with the MagickWand API, contrast.c. It reads an image, applies sigmoidal non-linearity contrast control, and writes the result to disk.

    + +
    #include <stdio.h>
    +#include <stdlib.h>
    +#include <math.h>
    +#include <wand/MagickWand.h>
    +
    +int main(int argc,char **argv)
    +{
    +#define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
    +#define SigmoidalContrast(x) \
    +  (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
    +#define ThrowWandException(wand) \
    +{ \
    +  char \
    +    *description; \
    + \
    +  ExceptionType \
    +    severity; \
    + \
    +  description=MagickGetException(wand,&severity); \
    +  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
    +  description=(char *) MagickRelinquishMemory(description); \
    +  exit(-1); \
    +}
    +
    +  long
    +    y;
    +
    +  MagickBooleanType
    +    status;
    +
    +  MagickPixelPacket
    +    pixel;
    +
    +  MagickWand
    +    *contrast_wand,
    +    *image_wand;
    +
    +  PixelIterator
    +    *contrast_iterator,
    +    *iterator;
    +
    +  PixelWand
    +    **contrast_pixels,
    +    **pixels;
    +
    +  register long
    +    x;
    +
    +  unsigned long
    +    width;
    +
    +  if (argc != 3)
    +    {
    +      (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
    +      exit(0);
    +    }
    +  /*
    +    Read an image.
    +  */
    +  MagickWandGenesis();
    +  image_wand=NewMagickWand();
    +  status=MagickReadImage(image_wand,argv[1]);
    +  if (status == MagickFalse)
    +    ThrowWandException(image_wand);
    +  contrast_wand=CloneMagickWand(image_wand);
    +  /*
    +    Sigmoidal non-linearity contrast control.
    +  */
    +  iterator=NewPixelIterator(image_wand);
    +  contrast_iterator=NewPixelIterator(contrast_wand);
    +  if ((iterator == (PixelIterator *) NULL) ||
    +      (contrast_iterator == (PixelIterator *) NULL))
    +    ThrowWandException(image_wand);
    +  for (y=0; y < (long) MagickGetImageHeight(image_wand); y++)
    +  {
    +    pixels=PixelGetNextIteratorRow(iterator,&width);
    +    contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&width);
    +    if ((pixels == (PixelWand **) NULL) ||
    +        (contrast_pixels == (PixelWand **) NULL))
    +      break;
    +    for (x=0; x < (long) width; x++)
    +    {
    +      PixelGetMagickColor(pixels[x],&pixel);
    +      pixel.red=SigmoidalContrast(pixel.red);
    +      pixel.green=SigmoidalContrast(pixel.green);
    +      pixel.blue=SigmoidalContrast(pixel.blue);
    +      pixel.index=SigmoidalContrast(pixel.index);
    +      PixelSetMagickColor(contrast_pixels[x],&pixel);
    +    }
    +    (void) PixelSyncIterator(contrast_iterator);
    +  }
    +  if (y < (long) MagickGetImageHeight(image_wand))
    +    ThrowWandException(image_wand);
    +  contrast_iterator=DestroyPixelIterator(contrast_iterator);
    +  iterator=DestroyPixelIterator(iterator);
    +  image_wand=DestroyMagickWand(image_wand);
    +  /*
    +    Write the image then destroy it.
    +  */
    +  status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
    +  if (status == MagickFalse)
    +    ThrowWandException(image_wand);
    +  contrast_wand=DestroyMagickWand(contrast_wand);
    +  MagickWandTerminus();
    +  return(0);
    +}
    +
    +

    Now lets perform the same contrast enhancement while taking advantage of our dual or quad-core processing system by running the algorithm in parallel utilizing wand views. The sigmoidal-contrast.c module reads an image, applies sigmoidal non-linearity contrast control, and writes the result to disk just like the previous contrast enhancement program, but now it does its work in parallel (assumes ImageMagick is built with OpenMP support).

    + +
    #include <stdio.h>
    +#include <stdlib.h>
    +#include <math.h>
    +#include <wand/MagickWand.h>
    +
    +static MagickBooleanType SigmoidalContrast(WandView *pixel_view,
    +  const ssize_t y,const int id,void *context)
    +{
    +#define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
    +#define SigmoidalContrast(x) \
    +  (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
    +
    +  RectangleInfo
    +    extent;
    +
    +  MagickPixelPacket
    +    pixel;
    +
    +  PixelWand
    +    **pixels;
    +
    +  register long
    +    x;
    +
    +  extent=GetWandViewExtent(contrast_view);
    +  pixels=GetWandViewPixels(contrast_view);
    +  for (x=0; x < (long) (extent.width-extent.height); x++)
    +  {
    +    PixelGetMagickColor(pixels[x],&pixel);
    +    pixel.red=SigmoidalContrast(pixel.red);
    +    pixel.green=SigmoidalContrast(pixel.green);
    +    pixel.blue=SigmoidalContrast(pixel.blue);
    +    pixel.index=SigmoidalContrast(pixel.index);
    +    PixelSetMagickColor(contrast_pixels[x],&pixel);
    +  }
    +  return(MagickTrue);
    +}
    +
    +int main(int argc,char **argv)
    +{
    +#define ThrowViewException(view) \
    +{ \
    +  description=GetWandViewException(view,&severity); \
    +  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
    +  description=(char *) MagickRelinquishMemory(description); \
    +  exit(-1); \
    +}
    +#define ThrowWandException(wand) \
    +{ \
    +  description=MagickGetException(wand,&severity); \
    +  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
    +  description=(char *) MagickRelinquishMemory(description); \
    +  exit(-1); \
    +}
    +
    +  char
    +    *description;
    +
    +  ExceptionType
    +    severity;
    +
    +  MagickBooleanType
    +    status;
    +
    +  MagickPixelPacket
    +    pixel;
    +
    +  MagickWand
    +    *contrast_wand;
    +
    +  WandView
    +    *contrast_view;
    +
    +  if (argc != 3)
    +    {
    +      (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
    +      exit(0);
    +    }
    +  /*
    +    Read an image.
    +  */
    +  MagickWandGenesis();
    +  contrast_wand=NewMagickWand();
    +  status=MagickReadImage(contrast_wand,argv[1]);
    +  if (status == MagickFalse)
    +    ThrowWandException(contrast_wand);
    +  /*
    +    Sigmoidal non-linearity contrast control.
    +  */
    +  contrast_view=NewWandView(contrast_wand);
    +  if (contrast_view == (WandView *) NULL)
    +    ThrowWandException(contrast_wand);
    +  status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
    +  if (status == MagickFalse)
    +    ThrowWandException(contrast_wand);
    +  contrast_view=DestroyWandView(contrast_view);
    +  /*
    +    Write the image then destroy it.
    +  */
    +  status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
    +  if (status == MagickFalse)
    +    ThrowWandException(contrast_wand);
    +  contrast_wand=DestroyMagickWand(contrast_wand);
    +  MagickWandTerminus();
    +  return(0);
    +}
    +
    +

    MagickWand Examples in C illustrates how to use the ImageMagick MagickWand API. Each example is presented as a C function, complete with headers, so that it can be copied to a file and then included in your own C project.

    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/magick.html b/ImageMagick-6.9.12-44/www/magick.html new file mode 100644 index 0000000..521340e --- /dev/null +++ b/ImageMagick-6.9.12-44/www/magick.html @@ -0,0 +1,1361 @@ + + + + + + + + + + ImageMagick - Command-line Tools: Magick + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    +

    Use the magick program to convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. See Command Line Processing for advice on how to structure your convert command or see below for example usages of the command.

    + +

    We list a few examples of the magick command here to illustrate its usefulness and ease of use. To get started, lets convert an image in the JPEG format to PNG:

    + +
    magick rose.jpg rose.png
    +
    + +

    Next, we reduce the image size before it is written to the PNG format:

    + +
    magick rose.jpg -resize 50% rose.png
    +
    + + + +

    You can combine multiple image-processing operations to produce complex results:

    + +
    magick -size 320x85 canvas:none -font Bookman-DemiItalic -pointsize 72 \
    +  -draw "text 25,60 \'Magick\'" -channel RGBA -blur 0x6 -fill darkred -stroke magenta \
    +  -draw "text 20,55 \'Magick\'" fuzzy-magick.png
    +
    + +
      + fuzzy-magick +
    + +

    or here we resize an image with improved quality:

    + +
    magick input.png -colorspace RGB +sigmoidal-contrast 11.6933 \
    +  -define filter:filter=Sinc -define filter:window=Jinc -define filter:lobes=3 \
    +  -resize 400% -sigmoidal-contrast 11.6933 -colorspace sRGB output.png');
    +
    + +

    Utilize other command-line tools from the magick tool. To invoke this functionality, simply create a symbolic link to the magick tool or specify the tool you want to use as the first argument. These two methods are equivalent:

    + +
    ln -s magick convert
    +convert rose.jpg rose.png
    +magick convert rose.jpg rose.png
    +
    + +

    You can find additional examples of using magick in Examples of ImageMagick Usage.

    + +

    Option Summary

    + +

    The magick command recognizes these options. Click on an option to get more details about how that option works.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    -adaptive-blur geometryadaptively blur pixels; decrease effect near edges
    -adaptive-resize geometryadaptively resize image with data dependent triangulation.
    -adaptive-sharpen geometryadaptively sharpen pixels; increase effect near edges
    -adjoinjoin images into a single multi-image file
    -affine matrixaffine transform matrix
    -alphaon, activate, off, deactivate, set, opaque, copy", +transparent, extract, background, or shape the alpha channel
    -annotate geometry textannotate the image with text
    -antialiasremove pixel-aliasing
    -appendappend an image sequence
    -authenticate valuedecipher image with this password
    -auto-gammaautomagically adjust gamma level of image
    -auto-levelautomagically adjust color levels of image
    -auto-orientautomagically orient image
    -background colorbackground color
    -bench iterationsmeasure performance
    -bias valueadd bias when convolving an image
    -black-threshold valueforce all pixels below the threshold into black
    -blue-primary pointchromaticity blue primary point
    -blue-shift factorsimulate a scene at nighttime in the moonlight
    -blur geometryreduce image noise and reduce detail levels
    -border geometrysurround image with a border of color
    -bordercolor colorborder color
    -brightness-contrast geometryimprove brightness / contrast of the image
    -canny geometryuse a multi-stage algorithm to detect a wide range of edges in the image
    -caption stringassign a caption to an image
    -cdl filenamecolor correct with a color decision list
    -channel typeapply option to select image channels
    -charcoal radiussimulate a charcoal drawing
    -chop geometryremove pixels from the image interior
    -clampset each pixel whose value is below zero to zero and any the pixel whose value is above the quantum range to the quantum range (e.g. 65535) otherwise the pixel value remains unchanged.
    -clipclip along the first path from the 8BIM profile
    -clip-mask filenameassociate clip mask with the image
    -clip-path idclip along a named path from the 8BIM profile
    -clone indexclone an image
    -clutapply a color lookup table to the image
    -connected-components connectivityconnected-components uniquely labeled, choose from 4 or 8 way connectivity
    -contrast-stretch geometryimprove the contrast in an image by `stretching' the range of intensity value
    -coalescemerge a sequence of images
    -colorize valuecolorize the image with the fill color
    -color-matrix matrixapply color correction to the image.
    -colors valuepreferred number of colors in the image
    -colorspace typeset image colorspace
    -combinecombine a sequence of images
    -comment stringannotate image with comment
    -comparecompare image
    -complexoperatorperform complex mathematics on an image sequence
    -compose operatorset image composite operator
    -compositecomposite image
    -compress typeimage compression type
    -contrastenhance or reduce the image contrast
    -convolve coefficientsapply a convolution kernel to the image
    -copy geometry offsetcopy pixels from one area of an image to another
    -crop geometrycrop the image
    -cycle amountcycle the image colormap
    -decipher filenameconvert cipher pixels to plain
    -debug eventsdisplay copious debugging information
    -define format:optiondefine one or more image format options
    -deconstructbreak down an image sequence into constituent parts
    -delay valuedisplay the next image after pausing
    -delete indexdelete the image from the image sequence
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -despecklereduce the speckles within an image
    -direction typerender text right-to-left or left-to-right
    -display serverget image or font from this X server
    -dispose methodlayer disposal method
    -distribute-cache portlaunch a distributed pixel cache server
    -distort type coefficientsdistort image
    -dither methodapply error diffusion to image
    -draw stringannotate the image with a graphic primitive
    -duplicate count,indexesduplicate an image one or more times
    -edge radiusapply a filter to detect edges in the image
    -emboss radiusemboss an image
    -encipher filenameconvert plain pixels to cipher pixels
    -encoding typetext encoding type
    -endian typeendianness (MSB or LSB) of the image
    -enhanceapply a digital filter to enhance a noisy image
    -equalizeperform histogram equalization to an image
    -evaluate operator valueevaluate an arithmetic, relational, or logical expression
    -evaluate-sequence operatorevaluate an arithmetic, relational, or logical expression for an image sequence
    -extent geometryset the image size
    -extract geometryextract area from image
    -family namerender text with this font family
    -features distanceanalyze image features (e.g. contract, correlations, etc.).
    -fftimplements the discrete Fourier transform (DFT)
    -fill colorcolor to use when filling a graphic primitive
    -filter typeuse this filter when resizing an image
    -flattenflatten a sequence of images
    -flipflip image in the vertical direction
    -floodfill geometry colorfloodfill the image with color
    -flopflop image in the horizontal direction
    -font namerender text with this font
    -format stringoutput formatted image characteristics
    -frame geometrysurround image with an ornamental border
    -function nameapply a function to the image
    -fuzz distancecolors within this distance are considered equal
    -fx expressionapply mathematical expression to an image channel(s)
    -gamma valuelevel of gamma correction
    -gaussian-blur geometryreduce image noise and reduce detail levels
    -geometry geometrypreferred size or location of the image
    -gravity typehorizontal and vertical text placement
    -grayscale methodconvert image to grayscale
    -green-primary pointchromaticity green primary point
    -helpprint program options
    -hough-lines geometryidentify lines in the image
    -identifyidentify the format and characteristics of the image
    -iftimplements the inverse discrete Fourier transform (DFT)
    -implode amountimplode image pixels about the center
    -insert indexinsert last image into the image sequence
    -intensity methodmethod to generate an intensity value from a pixel
    -intent typetype of rendering intent when managing the image color
    -interlace typetype of image interlacing scheme
    -interline-spacing valuethe space between two text lines
    -interpolate methodpixel color interpolation method
    -interword-spacing valuethe space between two words
    -kerning valuethe space between two characters
    -kuwahara geometryedge preserving noise reduction filter
    -label stringassign a label to an image
    -lat geometrylocal adaptive thresholding
    -layers methodoptimize or compare image layers
    -level valueadjust the level of image contrast
    -limit type valuepixel cache resource limit
    -linear-stretch geometrylinear with saturation histogram stretch
    -liquid-rescale geometryrescale image with seam-carving
    -list typeColor, Configure, Delegate, Format, Magic, Module, Resource, or Type
    -log formatformat of debugging information
    -loop iterationsadd Netscape loop extension to your GIF animation
    -mask filenameassociate a mask with the image
    -mattecolor colorframe color
    -median radiusapply a median filter to the image
    -mean-shift geometrydelineate arbitrarily shaped clusters in the image
    -metric typemeasure differences between images with this metric
    -mode radiusmake each pixel the 'predominant color' of the neighborhood
    -modulate valuevary the brightness, saturation, and hue
    -momentsdisplay image moments.
    -monitormonitor progress
    -monochrometransform image to black and white
    -morph valuemorph an image sequence
    -morphology method kernelapply a morphology method to the image
    -motion-blur geometrysimulate motion blur
    -negatereplace each pixel with its complementary color
    -noise radiusadd or reduce noise in an image
    -normalizetransform image to span the full range of colors
    -opaque colorchange this color to the fill color
    -ordered-dither NxNordered dither the image
    -orient typeimage orientation
    -page geometrysize and location of an image canvas (setting)
    -paint radiussimulate an oil painting
    -perceptibleset each pixel whose value is less than |epsilon| to -epsilon or epsilon (whichever is closer) otherwise the pixel value remains unchanged.
    -pingefficiently determine image attributes
    -pointsize valuefont point size
    -polaroid anglesimulate a Polaroid picture
    -poly termsbuild a polynomial from the image sequence and the corresponding terms (coefficients and degree pairs).
    -posterize levelsreduce the image to a limited number of color levels
    -precision valueset the maximum number of significant digits to be printed
    -preview typeimage preview type
    -print stringinterpret string and print to console
    -process image-filterprocess the image with a custom image filter
    -profile filenameadd, delete, or apply an image profile
    -quality valueJPEG/MIFF/PNG compression level
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -radial-blur angleradial blur the image
    -raise valuelighten/darken image edges to create a 3-D effect
    -random-threshold low,highrandom threshold the image
    -red-primary pointchromaticity red primary point
    -regard-warningspay attention to warning messages.
    -region geometryapply options to a portion of the image
    -remap filenametransform image colors to match this set of colors
    -renderrender vector graphics
    -repage geometrysize and location of an image canvas
    -resample geometrychange the resolution of an image
    -resize geometryresize the image
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -roll geometryroll an image vertically or horizontally
    -rotate degreesapply Paeth rotation to the image
    -sample geometryscale image with pixel sampling
    -sampling-factor geometryhorizontal and vertical sampling factor
    -scale geometryscale the image
    -scene valueimage scene number
    -seed valueseed a new sequence of pseudo-random numbers
    -segment valuessegment an image
    -selective-blur geometryselectively blur pixels within a contrast threshold
    -separateseparate an image channel into a grayscale image
    -sepia-tone thresholdsimulate a sepia-toned photo
    -set attribute valueset an image attribute
    -shade degreesshade the image using a distant light source
    -shadow geometrysimulate an image shadow
    -sharpen geometrysharpen the image
    -shave geometryshave pixels from the image edges
    -shear geometryslide one edge of the image along the X or Y axis
    -sigmoidal-contrast geometryincrease the contrast without saturating highlights or shadows
    -smush offsetsmush an image sequence together
    -size geometrywidth and height of image
    -sketch geometrysimulate a pencil sketch
    -solarize thresholdnegate all pixels above the threshold level
    -splice geometrysplice the background color into the image
    -spread radiusdisplace image pixels by a random amount
    -statistic type geometryreplace each pixel with corresponding statistic from the neighborhood
    -stripstrip image of all profiles and comments
    -stroke colorgraphic primitive stroke color
    -strokewidth valuegraphic primitive stroke width
    -stretch typerender text with this font stretch
    -style typerender text with this font style
    -swap indexesswap two images in the image sequence
    -swirl degreesswirl image pixels about the center
    -synchronizesynchronize image to storage device
    -taintmark the image as modified
    -texture filenamename of texture to tile onto the image background
    -threshold valuethreshold the image
    -thumbnail geometrycreate a thumbnail of the image
    -tile filenametile image when filling a graphic primitive
    -tile-offset geometryset the image tile offset
    -tint valuetint the image with the fill color
    -transformaffine transform image
    -transparent colormake this color transparent within the image
    -transparent-color colortransparent color
    -transposeflip image in the vertical direction and rotate 90 degrees
    -transverseflop image in the horizontal direction and rotate 270 degrees
    -treedepth valuecolor tree depth
    -trimtrim image edges
    -type typeimage type
    -undercolor colorannotation bounding box color
    -unique-colorsdiscard all but one of any pixel color.
    -units typethe units of image resolution
    -unsharp geometrysharpen the image
    -verboseprint detailed information about the image
    -versionprint version information
    -viewFlashPix viewing transforms
    -vignette geometrysoften the edges of the image in vignette style
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    -wave geometryalter an image along a sine wave
    -wavelet-denoise thresholdremoves noise from the image using a wavelet transform
    -weight typerender text with this font weight
    -white-point pointchromaticity white point
    -white-threshold valueforce all pixels above the threshold into white
    -write filenamewrite images to this file
    +
    +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/www/miff.html b/ImageMagick-6.9.12-44/www/miff.html new file mode 100644 index 0000000..28853a3 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/miff.html @@ -0,0 +1,290 @@ + + + + + + + + + + ImageMagick (legacy) – Magick Image File Format + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Magick Image File Format

    +

    MIFF HeaderMIFF Binary Data

    + +

    The Magick Image File Format (MIFF) is ImageMagick's own platform-independent format for storing bitmap images. It has an advantage over other image formats in that it stores all metadata known to ImageMagick (e.g. image color profiles, comments, author, copyright, etc.), whereas, other formats may only support a small portion of available metadata or none at all. A MIFF image file consist of two sections. The first section is a header composed of keys describing the image in text form. The next section is the binary image data. We discuss these sections in detail below.

    + +

    MIFF Header

    + + +

    The MIFF header is composed entirely of ISO-8859-1 characters. The fields in the header are key and value combination in the key = value format, with each key and value separated by an equal sign (=). Each key = value combination is delimited by at least one control or whitespace character. Comments may appear in the header section and are always delimited by braces. The MIFF header always ends with a colon (:) character, followed by a ctrl-Z character. It is also common to proceed the colon with a formfeed and a newline character. The formfeed prevents the listing of binary data when using the more Linux program, whereas, the ctrl-Z has the same effect with the type command on the Windows command line.

    + +

    The following is a partial list of key = value combinations that are typically be found in a MIFF file:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    background-color = color
    border-color = color
    matte-color = colorthese optional keys reflect the image background, border, and matte colors respectively. A color can be a name (e.g. white) or a hex value (e.g. #ccc).
    class = { DirectClass, PseudoClass }the type of binary pixel data stored in the MIFF file. If this key is not present, DirectClass pixel data is assumed.
    colors = valuethe number of colors in a DirectClass image. For a PseudoClass image, this key specifies the number of entries in the colormap. If this key is not present in the header, and the image is PseudoClass, a linear 256 color grayscale colormap is assumed. The maximum number of colormap entries is 65536.
    colorspace = { RGB, CMYK, ... }the colorspace of the pixel data. The default is RGB.
    columns = valuethe width of the image in pixels. This a required key and has no default value.
    compression = {BZip, None, Zip, ... }the type of algorithm used to compress the image data. If this key is not present, the pixel data is assumed to be uncompressed.
    delay = microsecondsthe interframe delay in an image sequence in microseconds.
    depth = { 8, 16, 32 }the depth of a single color value representing values from 0 to 255 (depth 8), 0 - 65535 (depth 16), or 0 - 4294967295 (depth 32). If this key is absent, a depth of 8 is assumed.
    dispose = valuelayer disposal method. Here are the valid values: +
      +
      0. No disposal specified.
      +
      1. Do not dispose between frames.
      +
      2. Overwrite frame with background color from header.
      +
      3. Overwrite with previous frame.
      +
    +
    gamma = valuethe gamma of the image. If it is not specified, a gamma of 1.0 (linear brightness response) is assumed.
    id = ImageMagickidentifies the file as a MIFF-format image file. This key is required and has no default. Although this key can appear anywhere in the header, it should start as the first key of the header in column 1. This will allow programs like file(1) to easily identify the file as MIFF.
    iterations = valuethe number of times an image sequence loops before stopping.
    label = { string ]defines a short title or caption for the image. If any whitespace appears in the label, it must be enclosed within braces.
    matte = { True, False }specifies whether a the image has matte data. Matte data is generally useful for image compositing.
    montage = <width>x<height>[+-]<x offset>[+-]<y offset>size and location of the individual tiles of a composite image. + Use this key when the image is a composite of a number of different tiles. A tile consists of an image and optionally a border and a label. Width is the size in pixels of each individual tile in the horizontal direction and height is the size in the vertical direction. Each tile must have an equal number of pixels in width and equal in height. However, the width can differ from the height. X offset is the offset in number of pixels from the vertical edge of the composite image where the first tile of a row begins and y offset is the offset from the horizontal edge where the first tile of a column begins. If this key is specified, a directory of tile names must follow the image header. The format of the directory is explained below.
    page = valuepreferred size and location of an image canvas.
    profile-icc = valuethe number of bytes in the International Color Consortium color profile. The profile is defined by the ICC profile specification located at http://www.color.org/icc_specs2.html.
    red-primary = x,y
    green-primary = x,y
    blue-primary = x,y
    white-point = x,ythis optional key reflects the chromaticity primaries and white point.
    rendering-intent = { saturation, perceptual, absolute, relative }Rendering intent is the CSS-1 property that has been defined by the International Color Consortium (http://www.color.org).
    resolution = <x-resolution>x<y-resolution>vertical and horizontal resolution of the image. See units for the specific resolution units (e.g. pixels per inch).
    rows = valuethe height of the image in pixels. This a required key and has no default value.
    scene = valuethe sequence number for this MIFF image file. This optional key is useful when a MIFF image file is one in a sequence of files used in an animation.
    signature = valuethis optional key contains a string that uniquely identifies the image pixel contents. NIST's SHA-256 message digest algorithm is recommended.
    units = { pixels-per-inch, pixels-per-centimeter }image resolution units.
    + +

    Other key value pairs are permitted. If a value contains whitespace it must be enclosed with braces as illustrated here:

    + +
    id=ImageMagick
    +class=PseudoClass  colors=256  matte=False
    +columns=1280  rows=1024  depth=8
    +compression=RLE
    +colorspace=RGB
    +copyright={© 1999-2017 ImageMagick Studio LLC}
    +⋮
    +
    + +

    Note that key = value combinations may be separated by newlines or spaces and may occur in any order within the header. Comments (within braces) may appear anywhere before the colon.

    + +

    If you specify the montage key in the header, follow the header with a directory of image tiles. This directory consists of a name for each tile of the composite image separated by a newline character. The list is terminated with a NULL character.

    + +

    If you specify the color-profile key in the header, follow the header (or montage directory if the montage key is in the header) with the binary color profile.

    + +

    The header is separated from the image data by a : character immediately followed by a newline.

    + +

    MIFF Binary Data

    + +

    Next comes the binary image data itself. How the image data is formatted depends upon the class of the image as specified (or not specified) by the value of the class key in the header.

    + +

    DirectClass images are continuous-tone, images stored as RGB (red, green, blue), RGBA (red, green, blue, alpha), CMYK (cyan, yellow, magenta, black), or CMYKA (cyan, yellow, magenta, black, alpha) intensity values as defined by the colorspace key. Each intensity value is one byte in length for images of depth 8 (0..255), two bytes for a depth of 16 (0..65535), and images of depth 32 (0..4294967295) require four bytes in most significant byte first order.

    + +

    PseudoClass images are colormapped RGB images. The colormap is stored as a series of red, green, and blue pixel values, each value being a byte in size. If the image depth is 16, each colormap entry consumes two bytes with the most significant byte being first. The number of colormap entries is defined by the colors key. The colormap data occurs immediately following the header (or image directory if the montage key is in the header). PseudoClass image data is an array of index values into the color map. If there are 256 +or fewer colors in the image, each byte of image data contains an index value. If the image contains more than 256 colors or the image depth is 16, the index value is stored as two contiguous bytes with the most significant byte being first. If matte is true, each colormap index is followed by a 1 or 2-byte alpha value.

    + +

    The image pixel data in a MIFF file may be uncompressed, runlength encoded, Zip compressed, or BZip compressed. The compression key in the header defines how the image data is compressed. Uncompressed pixels are stored one scanline at a time in row order. Runlength-encoded compression counts runs of identical adjacent pixels and stores the pixels followed by a length byte (the number of identical pixels minus 1). Zip and BZip compression compresses each row of an image and precedes the compressed row with the length of compressed pixel bytes as a word in most significant byte first order.

    + +

    MIFF files may contain more than one image. Simply concatenate each individual image (composed of a header and image data) into one file.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/mirror.html b/ImageMagick-6.9.12-44/www/mirror.html new file mode 100644 index 0000000..c53ba31 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/mirror.html @@ -0,0 +1,148 @@ + + + + + + + + + + ImageMagick (legacy) – Mirror + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Mirrors

    +

    ImageMagick source and binary distributions are available from a variety of FTP and Web mirrors around the world listed below. ImageMagick stable and development source releases are also available from Git. Before you download, you may want to review recent changes to the ImageMagick distribution. The authoritative source code repository is https://github.com/ImageMagick/ImageMagick6.

    +

    The latest release of ImageMagick is version 6.9.12-40.

    +
    +
    Germany
    +
    https://mirror.dogado.de/imagemagick/
    +
    http://mirror.checkdomain.de/imagemagick/
    +
    ftp://mirror.checkdomain.de/imagemagick/
    +
    Sweden
    +
    https://ftp.acc.umu.se/mirror/imagemagick.org/ftp/
    +
    rsync://ftp.acc.umu.se/mirror/imagemagick.org/ftp/
    +
    Russia
    +
    https://mirror.surf/imagemagick/
    +
    United States
    +
    ../download
    +
    https://github.com/ImageMagick/ImageMagick6 (Git)
    +
    Select Binaries
    +
    http://www.macports.org/ports.html?by=name&substr=imagemagick (Mac OS X)
    +
    http://hpux.connect.org.uk/hppd/hpux/X11/Viewers/ (HP-UX 10.20 and 11.00)
    +
    Rsync Mirrors
    +
    rsync://mirror.surf/imagemagick//
    +
    rsync://rsync.is.co.za/IS-Mirror/mirror.imagemagick.org/
    +
    rsync://mirror.imagemagick.org/magick6_html/ (Web site mirror)
    +
    rsync://mirror.imagemagick.org/magick_ftp/ (FTP mirror)
    +
    +

    If you want to add a new mirror, please contact us.

    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/mogrify.html b/ImageMagick-6.9.12-44/www/mogrify.html new file mode 100644 index 0000000..3218926 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/mogrify.html @@ -0,0 +1,1340 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Mogrify + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Inline Image Modification

    +

    Example UsageOption Summary

    + +

    Use the mogrify program to resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option) with any changes you request. See Command Line Processing for advice on how to structure your mogrify command or see below for sample usages of the command.

    + +

    Example Usage

    + +

    We list a few examples of the mogrify command here to illustrate its usefulness and ease of use. To get started, let's reduce the size of our +rose:

    + +
    mogrify -resize 50% rose.jpg
    +
    + + + +

    You can resize all your JPEG images in a folder to a maximum dimension of 256x256 with this command:

    + +
    mogrify -resize 256x256 *.jpg
    +
    + +

    Finally, we convert all our PNG images in a folder to the JPEG format:

    + +
    mogrify -format jpg *.png
    +
    + +

    Here image files 1.png, 2.png, etc., are left untouched and files 1.jpg, 2.jpg, etc., are created. They are copies of their respective PNG images except are stored in the JPEG image format.

    + + +

    You can find additional examples of using mogrify in Graphics from the Command Line. Further discussion is available in More Graphics from the Command Line and Examples of ImageMagick Usage.

    + +

    Option Summary

    + +

    The mogrify command recognizes these options. Click on an option to get more details about how that option works.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    -adaptive-blur geometryadaptively blur pixels; decrease effect near edges
    -adaptive-resize geometryadaptively resize image with data dependent triangulation.
    -adaptive-sharpen geometryadaptively sharpen pixels; increase effect near edges
    -adjoinjoin images into a single multi-image file
    -affine matrixaffine transform matrix
    -alphaon, activate, off, deactivate, set, opaque, copy", +transparent, extract, background, or shape the alpha channel
    -annotate geometry textannotate the image with text
    -antialiasremove pixel-aliasing
    -appendappend an image sequence
    -authenticate valuedecipher image with this password
    -auto-gammaautomagically adjust gamma level of image
    -auto-levelautomagically adjust color levels of image
    -auto-orientautomagically orient image
    -background colorbackground color
    -bench iterationsmeasure performance
    -bias valueadd bias when convolving an image
    -black-threshold valueforce all pixels below the threshold into black
    -blue-primary pointchromaticity blue primary point
    -blue-shift factorsimulate a scene at nighttime in the moonlight
    -blur geometryreduce image noise and reduce detail levels
    -border geometrysurround image with a border of color
    -bordercolor colorborder color
    -brightness-contrast geometryimprove brightness / contrast of the image
    -canny geometryuse a multi-stage algorithm to detect a wide range of edges in the image
    -caption stringassign a caption to an image
    -cdl filenamecolor correct with a color decision list
    -channel typeapply option to select image channels
    -charcoal radiussimulate a charcoal drawing
    -chop geometryremove pixels from the image interior
    -clipclip along the first path from the 8BIM profile
    -clampset each pixel whose value is below zero to zero and any the pixel whose value is above the quantum range to the quantum range (e.g. 65535) otherwise the pixel value remains unchanged.
    -clip-mask filenameassociate clip mask with the image
    -clip-path idclip along a named path from the 8BIM profile
    -clutapply a color lookup table to the image
    -complexoperatorperform complex mathematics on an image sequence
    -connected-components connectivityconnected-components uniquely labeled, choose from 4 or 8 way connectivity
    -contrast-stretch geometryimprove the contrast in an image by `stretching' the range of intensity value
    -coalescemerge a sequence of images
    -colorize valuecolorize the image with the fill color
    -color-matrix matrixapply color correction to the image.
    -colors valuepreferred number of colors in the image
    -colorspace typeset image colorspace
    -combinecombine a sequence of images
    -comment stringannotate image with comment
    -compose operatorset image composite operator
    -compositecomposite image
    -compress typeimage compression type
    -contrastenhance or reduce the image contrast
    -convolve coefficientsapply a convolution kernel to the image
    -copy geometry offsetcopy pixels from one area of an image to another
    -crop geometrycrop the image
    -cycle amountcycle the image colormap
    -decipher filenameconvert cipher pixels to plain
    -debug eventsdisplay copious debugging information
    -define format:optiondefine one or more image format options
    -deconstructbreak down an image sequence into constituent parts
    -delay centisecondsdisplay the next image after pausing
    -delete indexdelete the image from the image sequence
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -despecklereduce the speckles within an image
    -direction typerender text right-to-left or left-to-right
    -display serverget image or font from this X server
    -dispose methodlayer disposal method
    -distort type coefficientsdistort image
    -distribute-cache portlaunch a pixel cache server
    -dither methodapply error diffusion to image
    -draw stringannotate the image with a graphic primitive
    -duplicate count,indexesduplicate an image one or more times
    -edge radiusapply a filter to detect edges in the image
    -emboss radiusemboss an image
    -encipher filenameconvert plain pixels to cipher pixels
    -encoding typetext encoding type
    -endian typeendianness (MSB or LSB) of the image
    -enhanceapply a digital filter to enhance a noisy image
    -equalizeperform histogram equalization to an image
    -evaluate operator valueevaluate an arithmetic, relational, or logical expression
    -evaluate-sequence operatorevaluate an arithmetic, relational, or logical expression for an image sequence
    -extent geometryset the image size
    -extract geometryextract area from image
    -family namerender text with this font family
    -features distanceanalyze image features (e.g. contract, correlations, etc.).
    -fftimplements the discrete Fourier transform (DFT)
    -fill colorcolor to use when filling a graphic primitive
    -filter typeuse this filter when resizing an image
    -flattenflatten a sequence of images
    -flipflip image in the vertical direction
    -floodfill geometry colorfloodfill the image with color
    -flopflop image in the horizontal direction
    -font namerender text with this font
    -format typeoutput formatted image characteristics
    -frame geometrysurround image with an ornamental border
    -function nameapply a function to the image
    -fuzz distancecolors within this distance are considered equal
    -fx expressionapply mathematical expression to an image channel(s)
    -gamma valuelevel of gamma correction
    -gaussian-blur geometryreduce image noise and reduce detail levels
    -geometry geometrypreferred size or location of the image
    -gravity typehorizontal and vertical text placement
    -grayscale methodconvert image to grayscale
    -green-primary pointchromaticity green primary point
    -helpprint program options
    -hough-lines geometryidentify lines in the image
    -identifyidentify the format and characteristics of the image
    -ifftimplements the inverse discrete Fourier transform (DFT)
    -implode amountimplode image pixels about the center
    -insert indexinsert last image into the image sequence
    -intensity methodmethod to generate an intensity value from a pixel
    -intent typetype of rendering intent when managing the image color
    -interlace typetype of image interlacing scheme
    -interline-spacing valuethe space between two text lines
    -interpolate methodpixel color interpolation method
    -interword-spacing valuethe space between two words
    -kerning valuethe space between two characters
    -kuwahara geometryedge preserving noise reduction filter
    -label stringassign a label to an image
    -lat geometrylocal adaptive thresholding
    -layers methodoptimize or compare image layers
    -level valueadjust the level of image contrast
    -limit type valuepixel cache resource limit
    -linear-stretch geometrylinear with saturation histogram stretch
    -liquid-rescale geometryrescale image with seam-carving
    -log formatformat of debugging information
    -loop iterationsadd Netscape loop extension to your GIF animation
    -mask filenameassociate a mask with the image
    -mattecolor colorframe color
    -median radiusapply a median filter to the image
    -mean-shift geometrydelineate arbitrarily shaped clusters in the image
    -metric typemeasure differences between images with this metric
    -mode radiusmake each pixel the 'predominant color' of the neighborhood
    -modulate valuevary the brightness, saturation, and hue
    -monitormonitor progress
    -monochrometransform image to black and white
    -morph valuemorph an image sequence
    -morphology method kernelapply a morphology method to the image
    -motion-blur geometrysimulate motion blur
    -negatereplace each pixel with its complementary color
    -noise radiusadd or reduce noise in an image
    -normalizetransform image to span the full range of colors
    -opaque colorchange this color to the fill color
    -ordered-dither NxNordered dither the image
    -orient typeimage orientation
    -page geometrysize and location of an image canvas (setting)
    -path pathwrite images to this path on disk
    -paint radiussimulate an oil painting
    -perceptibleset each pixel whose value is less than |epsilon| to -epsilon or epsilon (whichever is closer) otherwise the pixel value remains unchanged.
    -pingefficiently determine image attributes
    -pointsize valuefont point size
    -polaroid anglesimulate a Polaroid picture
    -poly termsbuild a polynomial from the image sequence and the corresponding terms (coefficients and degree pairs).
    -posterize levelsreduce the image to a limited number of color levels
    -precision valueset the maximum number of significant digits to be printed
    -preview typeimage preview type
    -print stringinterpret string and print to console
    -process image-filterprocess the image with a custom image filter
    -profile filenameadd, delete, or apply an image profile
    -quality valueJPEG/MIFF/PNG compression level
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -radial-blur angleradial blur the image
    -raise valuelighten/darken image edges to create a 3-D effect
    -random-threshold low,highrandom threshold the image
    -red-primary pointchromaticity red primary point
    -regard-warningspay attention to warning messages.
    -region geometryapply options to a portion of the image
    -remap filenametransform image colors to match this set of colors
    -renderrender vector graphics
    -repage geometrysize and location of an image canvas
    -resample geometrychange the resolution of an image
    -resize geometryresize the image
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -roll geometryroll an image vertically or horizontally
    -rotate degreesapply Paeth rotation to the image
    -sample geometryscale image with pixel sampling
    -sampling-factor geometryhorizontal and vertical sampling factor
    -scale geometryscale the image
    -scene valueimage scene number
    -seed valueseed a new sequence of pseudo-random numbers
    -segment valuessegment an image
    -selective-blur geometryselectively blur pixels within a contrast threshold
    -separateseparate an image channel into a grayscale image
    -sepia-tone thresholdsimulate a sepia-toned photo
    -set attribute valueset an image attribute
    -shade degreesshade the image using a distant light source
    -shadow geometrysimulate an image shadow
    -sharpen geometrysharpen the image
    -shave geometryshave pixels from the image edges
    -shear geometryslide one edge of the image along the X or Y axis
    -sigmoidal-contrast geometryincrease the contrast without saturating highlights or shadows
    -size geometrywidth and height of image
    -sketch geometrysimulate a pencil sketch
    -smush offsetsmush an image sequence together
    -solarize thresholdnegate all pixels above the threshold level
    -splice geometrysplice the background color into the image
    -spread radiusdisplace image pixels by a random amount
    -statistic type geometryreplace each pixel with corresponding statistic from the neighborhood
    -stripstrip image of all profiles and comments
    -stroke colorgraphic primitive stroke color
    -strokewidth valuegraphic primitive stroke width
    -stretch typerender text with this font stretch
    -style typerender text with this font style
    -swap indexesswap two images in the image sequence
    -swirl degreesswirl image pixels about the center
    -synchronizesynchronize image to storage device
    -texture filenamename of texture to tile onto the image background
    -threshold valuethreshold the image
    -thumbnail geometrycreate a thumbnail of the image
    -tile filenametile image when filling a graphic primitive
    -tile-offset geometryset the image tile offset
    -tint valuetint the image with the fill color
    -transformaffine transform image
    -transparent colormake this color transparent within the image
    -transparent-color colortransparent color
    -transposeflip image in the vertical direction and rotate 90 degrees
    -transverseflop image in the horizontal direction and rotate 270 degrees
    -treedepth valuecolor tree depth
    -trimtrim image edges
    -type typeimage type
    -undercolor colorannotation bounding box color
    -unique-colorsdiscard all but one of any pixel color.
    -units typethe units of image resolution
    -unsharp geometrysharpen the image
    -verboseprint detailed information about the image
    -versionprint version information
    -viewFlashPix viewing transforms
    -vignette geometrysoften the edges of the image in vignette style
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    -wave geometryalter an image along a sine wave
    -wavelet-denoise thresholdremoves noise from the image using a wavelet transform
    -weight typerender text with this font weight
    -white-point pointchromaticity white point
    -white-threshold valueforce all pixels above the threshold into white
    -write filenamewrite images to this file
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/montage.html b/ImageMagick-6.9.12-44/www/montage.html new file mode 100644 index 0000000..ec3264e --- /dev/null +++ b/ImageMagick-6.9.12-44/www/montage.html @@ -0,0 +1,686 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Montage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Juxtapose Image Thumbnails on a Canvas

    +

    Example UsageOption Summary

    + +

    Use the montage program to create a composite image by combining several separate images. The images are tiled on the composite image optionally adorned with a border, frame, image name, and more. See Command Line Processing for advice on how to structure your montage command or see below for example usages of the command.

    + +

    Example Usage

    + +

    We list a few examples of the montage command here to illustrate its usefulness and ease of use. To get started, let's montage two images into a single composite:

    + +
    montage -background '#336699' -geometry +4+4 rose.jpg red-ball.png montage.jpg
    +
    + + + +

    Ok, let's add some decorations:

    + +
    montage -label %f -frame 5 -background '#336699' -geometry +4+4 rose.jpg red-ball.png frame.jpg
    +
    + + + +

    You can find additional examples of using montage at Examples of ImageMagick Usage and Graphics from the Command Line. Further discussion is available in More Graphics from the Command Line and Examples of ImageMagick Usage.

    + +

    Option Summary

    + +

    The montage command recognizes these options. Click on an option to get more details about how that option works.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    -adaptive-sharpen geometryadaptively sharpen pixels; increase effect near edges
    -adjoinjoin images into a single multi-image file
    -affine matrixaffine transform matrix
    -alphaon, activate, off, deactivate, set, opaque, copy", +transparent, extract, background, or shape the alpha channel
    -annotate geometry textannotate the image with text
    -authenticate valuedecrypt image with this password
    -auto-orientautomagically orient image
    -background colorbackground color
    -blue-primary pointchromaticity blue primary point
    -blur geometryreduce image noise and reduce detail levels
    -border geometrysurround image with a border of color
    -bordercolor colorborder color
    -caption stringassign a caption to an image
    -channel typeapply option to select image channels
    -clone indexclone an image
    -coalescemerge a sequence of images
    -colors valuepreferred number of colors in the image
    -colorspace typeset image colorspace
    -comment stringannotate image with comment
    -compose operatorset image composite operator
    -compositecomposite image
    -compress typeimage compression type
    -crop geometrypreferred size and location of the cropped image
    -debug eventsdisplay copious debugging information
    -define format:optiondefine one or more image format options
    -delay centisecondsdisplay the next image after pausing
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -display serverget image or font from this X server
    -dispose methodlayer disposal method
    -dither methodapply error diffusion to image
    -draw stringannotate the image with a graphic primitive
    -duplicate count,indexesduplicate an image one or more times
    -endian typeendianness (MSB or LSB) of the image
    -extent geometryset the image size
    -extract geometryextract area from image
    -fill colorcolor to use when filling a graphic primitive
    -filter typeuse this filter when resizing an image
    -flattenflatten a sequence of images
    -flipflip image in the vertical direction
    -flopflop image in the horizontal direction
    -font namerender text with this font
    -frame geometrysurround image with an ornamental border
    -gamma valuelevel of gamma correction
    -geometry geometrypreferred size or location of the image
    -gravity typehorizontal and vertical text placement
    -green-primary pointchromaticity green primary point
    -helpprint program options
    -identifyidentify the format and characteristics of the image
    -interlace typetype of image interlacing scheme
    -interpolate methodpixel color interpolation method
    -kerning valuethe space between two characters
    -label stringassign a label to an image
    -limit type valuepixel cache resource limit
    -log formatformat of debugging information
    -mattecolor colorframe color
    -mode typeframing style
    -monitormonitor progress
    -monochrometransform image to black and white
    -origin geometryimage origin
    -page geometrysize and location of an image canvas (setting)
    -pointsize valuefont point size
    -polaroid anglesimulate a Polaroid picture
    -profile filenameadd, delete, or apply an image profile
    -quality valueJPEG/MIFF/PNG compression level
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -red-primary pointchromaticity red primary point
    -regard-warningspay attention to warning messages.
    -repage geometrysize and location of an image canvas
    -resize geometryresize the image
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -rotate degreesapply Paeth rotation to the image
    -sampling-factor geometryhorizontal and vertical sampling factor
    -scale geometryscale the image
    -scenes rangeimage scene range
    -seed valueseed a new sequence of pseudo-random numbers
    -shadow geometrysimulate an image shadow
    -size geometrywidth and height of image
    -stripstrip image of all profiles and comments
    -stroke colorgraphic primitive stroke color
    -synchronizesynchronize image to storage device
    -taintmark the image as modified
    -texture filenamename of texture to tile onto the image background
    -tile geometrynumber of tiles per row and column (e.g. -tile 8x)
    -tile-offset geometryset the image tile offset
    -titledecorate the montage image with a title
    -transformaffine transform image
    -transparent colormake this color transparent within the image
    -transposeflip image in the vertical direction and rotate 90 degrees
    -transparent-color colortransparent color
    -treedepth valuecolor tree depth
    -trimtrim image edges
    -type typeimage type
    -units typethe units of image resolution
    -unsharp geometrysharpen the image
    -verboseprint detailed information about the image
    -versionprint version information
    -viewFlashPix viewing transforms
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    -white-point pointchromaticity white point
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/motion-picture.html b/ImageMagick-6.9.12-44/www/motion-picture.html new file mode 100644 index 0000000..9206654 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/motion-picture.html @@ -0,0 +1,236 @@ + + + + + + + + + + ImageMagick (legacy) – Motion Picture Digital Images + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Motion Picture and Effects

    +

    Log FormatDPX PropertiesDPX Settings

    + +

    DPX (SMPTE 268M-2003) - This format is used in Motion Picture and Effects industry that makes particular use of the extensive header information and the format's flexibility in being able to handle high dynamic range and logarithmic color values at a variety of bit depths using RGB or YCbCr pixel descriptions. It is based on, but largely supersedes, Kodak's Cineon format that has a more film specific header.

    + +

    One example of it's use includes scanning film for use in post production. Each frame is stored as an individual DPX file ranging from 2k (2048 pixels wide) to 8k (8192 pixels wide - for IMAX frames) at anything between 8 to 64 bits per color component. A sequence of these might then be processed using compositing software, altering the color or adding visual effects. Once complete they might then be recorded digitally to tape or projected back on to film.

    + +

    The color values for each pixel are often stored logarithmically (particularly if the sequence is destined to be transferred back on to film) which more naturally reflects the density of how color information is stored in the emulsion on the original film. When viewed without alteration, logarithmic files appear to have very low contrast and requires a 'look up table' to translate the logarithmic image to something that resembles what you might see if the image was transferred back to film and projected in a cinema. Apart from making the image linear (like most typical computer images) and adjusting the gamma level this table sets where the black and white point lies.

    + +

    For a 10 bit logarithmic image where each color component value ranges from 0 to 1023 the black and white points are normally set at 95 for black and 685 for white. What this means is that the logarithmic file stores color values that are lighter than what the linear version will display as pure white and darker than what it will display as pure black. This extra information therefore remains available for an effects artists who might wish to alter the brightness of the image after it has been stored as a DPX file.

    + +

    As an example, had this information been lost, reducing the brightness of an image uniformly would result in highlights becoming darker, whereas with this extra information the highlights instead reduce in size and start showing details that were previously too bright to be seen. The latter is far closer to what happens in the real world.

    + +

    The header can contain Film and/or Television specific data related to a production. For example the television header can contain a SMPTE time code so that shots exported as a DPX sequence from a production's edit can be easily replaced once any effects have been added. The film header holds information about the reel of film the frames originated from and various camera settings that were used while filming. All these details usually stay with the images as they are passed between post-production companies.

    + +

    Log Format

    + +

    The color values for each pixel are often stored logarithmically (particularly if the sequence is destined to be transferred back on to film) which more naturally reflects the density of how color information is stored in the emulsion on the original film. When viewed without alteration logarithmic files appear to have very low contrast (leftmost image), and so require a 'look up table' to translate the logarithmic image to something that resembles what you might see if the image was transferred back to film and projected in a cinema (rightmost image). Apart from making the image linear (like most typical computer images) and adjusting the gamma level this table sets where the black and white point lies.

    + +
      + bluebells-log + bluebells-linear +
    + +

    For a 10 bit logarithmic image where each color component value ranges from 0 to 1023 the black and white points are normally set at 95 for black and 685 for white. What this means is that the logarithmic file stores color values that are lighter than what the linear version will display as pure white and darker than what it will display as pure black. This extra information therefore remains available for an effects artists who might wish to alter the brightness of the image after it has been stored as a DPX file.

    + +

    As an example, had this information been lost, reducing the brightness of a linear image uniformly would result in highlights becoming darker (leftmost image), whereas with this extra information the highlights instead reduce in size and start showing details that were previously too bright to be seen (rightmost image). The latter is far closer to what happens in the real world.

    + +
      + bluebells-clipped + bluebells-darker +
    + +

    DPX Properties

    + +

    ImageMagick supports these DPX properties:

    + +
    dpx:file.copyright
    +dpx:file.creator
    +dpx:file.filename
    +dpx:file.project
    +dpx:file.version
    +dpx:film.count
    +dpx:film.format
    +dpx:film.frame_id
    +dpx:film.frame_position
    +dpx:film.frame_rate
    +dpx:film.held_count
    +dpx:film.id
    +dpx:film.offset
    +dpx:film.prefix
    +dpx:film.sequence_length
    +dpx:film.shutter_angle
    +dpx:film.slate
    +dpx:film.type
    +dpx:orientation.aspect_ratio
    +dpx:orientation.border
    +dpx:orientation.device
    +dpx:orientation.filename
    +dpx:orientation.serial
    +dpx:orientation.x_center
    +dpx:orientation.x_offset
    +dpx:orientation.x_size
    +dpx:orientation.y_center
    +dpx:orientation.y_offset
    +dpx:orientation.y_size
    +dpx:television.black_gain
    +dpx:television.black_level
    +dpx:television.break_point
    +dpx:television.field_number
    +dpx:television.frame_rate
    +dpx:television.gamma
    +dpx:television.integration_times
    +dpx:television.interlace
    +dpx:television.padding
    +dpx:television.time.code
    +dpx:television.time_offset
    +dpx:television.user.bits
    +dpx:television.vertical_sample_rate
    +dpx:television.video_signal
    +dpx:television.white_level
    +dpx:user.id
    +dpx:user.data
    +
    + +

    Look for any user data as the dpx:user-data image profile.

    + +

    To determine which properties are associated with your DPX image, use this command for example:

    + +
    identify -verbose bluebells.dpx
    +
    + +

    To identify a particular property, try this:

    + +
    identify -format "%[dpx:television.time.code]" bluebells.dpx
    +
    + +

    Finally, to set a property:

    + +
    convert bluebells.dpx -define dpx:television.time.code=10:00:02:15 bluebells-001.dpx
    +
    + +

    DPX Settings

    + +

    Use -set to specify the image or film gamma or black and white points. For example use: +

    + +
    -set gamma 1.7
    +-set film-gamma 0.6
    +-set reference-black 95
    +-set reference-white 685
    +-set profile dpx:user.data
    +
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/news.html b/ImageMagick-6.9.12-44/www/news.html new file mode 100644 index 0000000..44e430c --- /dev/null +++ b/ImageMagick-6.9.12-44/www/news.html @@ -0,0 +1,150 @@ + + + + + + + + + + ImageMagick (legacy) – News + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    News

    +

    NewsCommunity

    + +

    ImageMagick recommended practices strongly encourage you to configure a security policy that best suits your local environment.

    + +

    We are utilizing a new community discussion service. The previous discourse server remains available to read legacy discussions.

    + +

    We discovered a bug in the pseudo-random generator prior to ImageMagick 6.9.10-81, the first 3 values repeated because the random state was not initialized properly. As a consequence of the fix, expect a different numerical sequence when seeding (-seed).

    + + +

    As an analog to linear (RGB) and non-linear (sRGB) color colorspaces, as of ImageMagick 6.9.9-29, we introduce the LinearGray colorspace. Gray is non-linear grayscale and LinearGray is linear (e.g. -colorspace linear-gray).

    + +

    ImageMagick version 7 has been released. We encourage you to migrate your workstreams to version 7. However, we recognize a significant version 6 user community. As such, the ImageMagick development team is committed to maintain, but not enhance, version 6 at least until 2028 and possibly beyond.

    + +

    The ImageMagick development process ensures a stable API and ABI. Before each ImageMagick release, we perform a comprehensive security assessment that includes memory error, thread data race detection, and continuous fuzzing to detect and prevent security vulnerabilities.

    + +

    Want more performance from ImageMagick? Try these options:

    + + +

    If these options are prohibitive, you can reduce the quality of the image results. The default build is Q16. If you instead use a Q8 build, you use half the memory The trade-off is reduced precision. For a Q8 build of ImageMagick, use this configure script option: --with-quantum-depth=8.

    + +

    Community

    +

    To join the ImageMagick community, try the discussion service. You can review questions or comments (with informed responses) posed by ImageMagick users or ask your own questions. If you want to contribute image processing algorithms, other enhancements, or bug fixes, open an issue.

    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/opencl.html b/ImageMagick-6.9.12-44/www/opencl.html new file mode 100644 index 0000000..bb99c28 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/opencl.html @@ -0,0 +1,152 @@ + + + + + + + + + + ImageMagick (legacy) – Parallel Execution with OpenCL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    + +

    The following is a list of image operators that have been OpenCL-accelerated:

    +
    blur
    +charcoal
    +contrast
    +constrast-stretch
    +convolve
    +despeckle
    +edge
    +equalize
    +emboss
    +function
    +gaussian-blur
    +grayscale
    +modulate
    +motion-blur
    +negate
    +noise
    +radial-blur
    +resize
    +sketch
    +unsharp
    +

    When the OpenCL acceleration is invoked for the first time, ImageMagick conducts a series of tests to configure the OpenCL environment according to the system hardware; therefore, it is normal to experience a higher latency the first time you use an accelerated option. The OpenCL kernels are embedded inside ImageMagick in source format. During the initial setup, ImageMagick discovers all the available OpenCL devices and compiles the kernels for each of these targets. ImageMagick also runs several performance tests internally to determine the preferred device to use. The compiled kernel code and the performance test results are stored into the cache directory so that the data can be reused by subsequent invocations of the OpenCL path. By default, the OpenCL cached data is stored in $HOME/.cache/ImageMagick on Linux and on MacOSX or in %LOCALAPPDATA%\ImageMagick on Windows. To change the cache directory, set the MAGICK_OPENCL_CACHE_DIR environment variable. ImageMagick is able to detect hardware changes, driver updates, and new kernel sources and re-run the setup and the calibration test. You can also force ImageMagick to re-run the process by removing the content from the cache directory.

    +

    If ImageMagick includes OpenCL support, the OpenCL path is enable by default. You can disable it, simply set the environment variable MAGICK_OCL_DEVICE to OFF. You could also force the OpenCL path to use a particular class of devices by setting it to GPU or CPU.

    +

    In addition to the environment variables just mentioned, ImageMagick provides a set of APIs that allow developers to gain a finer grain control of the OpenCL acceleration. For example, use the InitializeOpenCL) function to initialize the OpenCL environment:

    +
    clEnv=GetCurrentOpenCLEnv();
    +if (InitializeOpenCL(clEnv,exception) == MagickFalse)
    +  {
    +    /* looks like OpenCL is not supported  */
    +  }
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/openmp.html b/ImageMagick-6.9.12-44/www/openmp.html new file mode 100644 index 0000000..2eeaac8 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/openmp.html @@ -0,0 +1,143 @@ + + + + + + + + + + ImageMagick (legacy) – Parallel Execution with OpenMP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Threads of Execution

    +

    Many of ImageMagick's internal algorithms are threaded to take advantage of speed-ups offered by the multicore processor chips and OpenMP. OpenMP, is an API specification for parallel programming. If your compiler supports OpenMP (e.g. gcc, Visual Studio 2005) directives, ImageMagick automatically includes support. To verify, look for the OpenMP feature of ImageMagick with this command:

    +
    -> identify -version
    +Version: ImageMagick 6.9.11-50 2021-01-04 Q16 https://imagemagick.org
    +Copyright: © 1999-2021 ImageMagick Studio LLC
    +Features: OpenMP(4.5)
    +

    With OpenMP enabled, most ImageMagick algorithms execute on all the cores on your system in parallel. ImageMagick typically divides the work so that each thread processes 64 rows of pixels. As rows are completed, OpenMP assigns more chunks of pixel rows to each thread until the algorithm completes. For example, if you have a quad-core system, and attempt to resize an image, the resizing takes place on 4 cores (8 if hyperthreading is enabled).

    +

    You can further increase performance by reducing lock contention with the tcmalloc memory allocation library. To enable, add --with-tcmalloc to the configure command-line when you build ImageMagick.

    +

    The Perils of Parallel Execution

    +

    It can be difficult to predict behavior in a parallel environment. Performance might depend on a number of factors including the compiler, the version of the OpenMP library, the processor type, the number of cores, the amount of memory, whether hyperthreading is enabled, the mix of applications that are executing concurrently with ImageMagick, or the particular image-processing algorithm you utilize. The only way to be certain of the optimal performance, in terms of the number of threads, is to benchmark. ImageMagick includes progressive threading when benchmarking a command and returns the elapsed time and efficiency for one or more threads. This can help you identify how many threads are the most efficient in your environment. Here is an example benchmark for threads 1-8:

    + +
    $ convert -bench 40 model.png -sharpen 0x1 null:
    +Performance[1]: 40i 0.712ips 1.000e 14.000u 0:14.040
    +Performance[2]: 40i 1.362ips 0.657e 14.550u 0:07.340
    +Performance[3]: 40i 2.033ips 0.741e 14.530u 0:04.920
    +Performance[4]: 40i 2.667ips 0.789e 14.590u 0:03.750
    +Performance[5]: 40i 3.236ips 0.820e 14.970u 0:03.090
    +Performance[6]: 40i 3.802ips 0.842e 15.280u 0:02.630
    +Performance[7]: 40i 4.274ips 0.857e 15.540u 0:02.340
    +Performance[8]: 40i 4.831ips 0.872e 15.680u 0:02.070
    +

    Better performance correlates with higher values of IPS (iterations-per-second). In our example, 8 cores are optimal. However, in certain cases it might be optimal to set the number of threads to 1 (e.g. -limit thread 1) or to disable OpenMP completely. To disable this feature, add --disable-openmp to your configure script command line then rebuild and re-install ImageMagick.

    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/perl-magick.html b/ImageMagick-6.9.12-44/www/perl-magick.html new file mode 100644 index 0000000..745057a --- /dev/null +++ b/ImageMagick-6.9.12-44/www/perl-magick.html @@ -0,0 +1,2657 @@ + + + + + + + + + + ImageMagick (legacy) – PerlMagick, Perl API for ImageMagick + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    PerlMagick Image API for Perl

    +

    InstallationOverviewExample ScriptRead or Write an ImageManipulate an ImageSet an Image AttributeGet an Image AttributeCompare an Image to its ReconstructionCreate an Image MontageWorking with BlobsDirect-access to Image PixelsMiscellaneous MethodsHandling ExceptionsConstant

    + + +

    PerlMagick is an objected-oriented Perl interface to ImageMagick. Use the module to read, manipulate, or write an image or image sequence from within a Perl script. This makes it very suitable for Web CGI scripts. You must have ImageMagick 6.5.5 or above and Perl version 5.005_02 or greater installed on your system for PerlMagick to build properly.

    + +

    There are a number of useful scripts available to show you the value of PerlMagick. You can do Web based image manipulation and conversion with MagickStudio, or use L-systems to create images of plants using mathematical constructs, and finally navigate through collections of thumbnail images and select the image to view with the WebMagick Image Navigator.

    + +

    You can try PerlMagick from your Web browser at the ImageMagick Studio. Or, you can see examples of select PerlMagick functions.

    + +

    Installation

    + +

    UNIX

    + +

    Is PerlMagick available from your system RPM repository? For example, on our CentOS system, we install PerlMagick thusly:

    + +
    yum install ImageMagick-perl
    +
    + +

    If not, you must install PerlMagick from the ImageMagick source distribution. Download the latest source release.

    + +

    Unpack the distribution with this command:

    + +
    tar xvzf ImageMagick.tar.gz
    +
    + +

    Next configure and compile ImageMagick:

    + +
      $ cd ImageMagick-6.9.12
      $ ./configure -with-perl
      $ make
    +

    If ImageMagick / PerlMagick configured and compiled without complaint, you are ready to install it on your system. Administrator privileges are required to install. To install, type

    + +
    sudo make install
    +
    + +

    You may need to configure the dynamic linker run-time bindings:

    + +
    sudo ldconfig /usr/local/lib
    +
    + + +

    Finally, verify the PerlMagick install worked properly, type

    + +
    perl -MImage::Magick -le 'print Image::Magick->QuantumDepth'
    +
    + +

    Congratulations, you have a working ImageMagick distribution and you are ready to use PerlMagick to convert, compose, or edit your images.

    + +

    Windows XP / Windows 2000

    + +

    ImageMagick must already be installed on your system. Also, the ImageMagick source distribution for Windows 2000 is required. You must also have the nmake from the Visual C++ or J++ development environment. Copy \bin\IMagick.dll and \bin\X11.dll to a directory in your dynamic load path such as c:\perl\site\5.00502.

    + +

    Next, type

    + +
    cd PerlMagick
    +perl Makefile.nt
    +nmake
    +nmake install
    +
    + + +

    Running the Regression Tests

    + +

    To verify a correct installation, type

    + +
    make test
    +
    + +

    Use nmake test under Windows. There are a few demonstration scripts available to exercise many of the functions PerlMagick can perform. Type

    + +
    cd demo
    +make
    +
    + +

    You are now ready to utilize the PerlMagick methods from within your Perl scripts.

    + +

    Overview

    + +

    Any script that wants to use PerlMagick methods must first define the methods within its namespace and instantiate an image object. Do this with:

    + +
    use Image::Magick;
    +
    +$image = Image::Magick->new;
    +
    + +

    PerlMagick is quantum aware. You can request a specific quantum depth when you instantiate an image object:

    + +
    use Image::Magick::Q16;
    +
    +$image = Image::Magick::Q16->new;
    +
    + +

    The new() method takes the same parameters as SetAttribute . For example,

    + +
    $image = Image::Magick->new(size=>'384x256');
    +
    + +

    Next you will want to read an image or image sequence, manipulate it, and then display or write it. The input and output methods for PerlMagick are defined in Read or Write an Image. See Set an Image Attribute for methods that affect the way an image is read or written. Refer to Manipulate an Image for a list of methods to transform an image. Get an Image Attribute describes how to retrieve an attribute for an image. Refer to Create an Image Montage for details about tiling your images as thumbnails on a background. Finally, some methods do not neatly fit into any of the categories just mentioned. Review Miscellaneous Methods for a list of these methods.

    + +

    Once you are finished with a PerlMagick object you should consider destroying it. Each image in an image sequence is stored in virtual memory. This can potentially add up to mebibytes of memory. Upon destroying a PerlMagick object, the memory is returned for use by other Perl methods. The recommended way to destroy an object is with undef:

    + +
    undef $image;
    +
    + +

    To delete all the images but retain the Image::Magick object use

    + +
    @$image = ();
    +
    + +

    and finally, to delete a single image from a multi-image sequence, use

    + +
    undef $image->[$x];
    +
    + +

    The next section illustrates how to use various PerlMagick methods to manipulate an image sequence.

    + +

    Some of the PerlMagick methods require external programs such as Ghostscript. This may require an explicit path in your PATH environment variable to work properly. For example (in Linux),

    + +
    $ENV{PATH}' . "='/../bin:/usr/bin:/usr/local/bin';
    +
    + +

    Example Script

    + +

    Here is an example script to get you started:

    + +
    #!/usr/local/bin/perl
    +use Image::Magick;
    +my($image, $x);
    +$image = Image::Magick->new; +$x = $image->Read('girl.png', 'logo.png', 'rose.png'); +warn "$x" if "$x";
    +$x = $image->Crop(geometry=>'100x100+100+100'); +warn "$x" if "$x";
    +$x = $image->Write('x.png'); +warn "$x" if "$x"; +
    + +

    The script reads three images, crops them, and writes a single image as a GIF animation sequence. In many cases you may want to access individual images of a sequence. The next example illustrates how this done:

    + +
    #!/usr/local/bin/perl
    +use Image::Magick;
    +my($image, $p, $q);
    +$image = new Image::Magick; +$image->Read('x1.png'); +$image->Read('j*.jpg'); +$image->Read('k.miff[1, 5, 3]'); +$image->Contrast(); +for ($x = 0; $image->[$x]; $x++) +{ + $image->[$x]->Frame('100x200') if $image->[$x]->Get('magick') eq 'GIF'; + undef $image->[$x] if $image->[$x]->Get('columns') < 100; +} +$p = $image->[1]; +$p->Draw(stroke=>'red', primitive=>'rectangle', points=>20,20 100,100'); +$q = $p->Montage(); +undef $image; +$q->Write('x.miff'); +
    + +

    Suppose you want to start out with a 100 by 100 pixel white canvas with a red pixel in the center. Try

    + +
    $image = Image::Magick->new;
    +$image->Set(size=>'100x100');
    +$image->ReadImage('canvas:white');
    +$image->Set('pixel[49,49]'=>'red');
    +
    + +

    Here we reduce the intensity of the red component at (1,1) by half:

    + +
    @pixels = $image->GetPixel(x=>1,y=>1);
    +$pixels[0]*=0.5;
    +$image->SetPixel(x=>1,y=>1,color=>\@pixels);
    +
    + +

    Or suppose you want to convert your color image to grayscale:

    + +
    $image->Quantize(colorspace=>'gray');
    +
    + +

    Let's annotate an image with a Taipai TrueType font:

    + +
    $text = 'Works like magick!';
    +$image->Annotate(font=>'kai.ttf', pointsize=>40, fill=>'green', text=>$text);
    +
    + +

    Perhaps you want to extract all the pixel intensities from an image and write them to STDOUT:

    + +
    @pixels = $image->GetPixels(map=>'I', height=>$height, width=>$width, normalize=>true);
    +binmode STDOUT;
    +print pack('B*',join('',@pixels));
    +
    + +

    Other clever things you can do with a PerlMagick objects include

    + +
    $i = $#$p"+1";   # return the number of images associated with object p
    +push(@$q, @$p);  # push the images from object p onto object q
    +@$p = ();        # delete the images but not the object p
    +$p->Convolve([1, 2, 1, 2, 4, 2, 1, 2, 1]);   # 3x3 Gaussian kernel
    +
    + +

    Read or Write an Image

    + +

    Use the methods listed below to either read, write, or display an image or image sequence:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Read or Write Methods
    MethodParametersReturn ValueDescription
    Readone or more filenamesthe number of images readread an image or image sequence
    Writefilenamethe number of images writtenwrite an image or image sequence
    Displayserver namethe number of images displayeddisplay the image or image sequence to an X server
    Animateserver namethe number of images animatedanimate image sequence to an X server
    + +

    For convenience, methods Write(), Display(), and Animate() can take any parameter that SetAttribute knows about. For example,

    + +
    $image->Write(filename=>'image.png', compression=>'None');
    +
    + +

    Use - as the filename to method Read() to read from standard in or to method Write() to write to standard out:

    + +
    binmode STDOUT;
    +$image->Write('png:-');
    +
    + +

    To read an image in the GIF format from a PERL filehandle, use:

    + +
    $image = Image::Magick->new;
    +open(IMAGE, 'image.gif');
    +$image->Read(file=>\*IMAGE);
    +close(IMAGE);
    +
    + +

    To write an image in the PNG format to a PERL filehandle, use:

    + +
    $filename = "image.png";
    +open(IMAGE, ">$filename");
    +$image->Write(file=>\*IMAGE, filename=>$filename);
    +close(IMAGE);
    +
    + +

    Note, reading from or writing to a Perl filehandle may fail under Windows due to different versions of the C-runtime libraries between ImageMagick and the ActiveState Perl distributions or if one of the DLL's is linked with the /MT option. See Potential Errors Passing CRT Objects Across DLL Boundaries for an explanation.

    + +

    If %0Nd, %0No, or %0Nx appears in the filename, it is interpreted as a printf format specification and the specification is replaced with the specified decimal, octal, or hexadecimal encoding of the scene number. For example,

    + +
    image%03d.miff
    +
    + +

    converts files image000.miff, image001.miff, etc.

    + +

    You can optionally add Image to any method name. For example, ReadImage() is an alias for method Read().

    + +

    Manipulate an Image

    + +

    Once you create an image with, for example, method ReadImage() you may want to operate on it. Below is a list of all the image manipulations methods available to you with PerlMagick. There are examples of select PerlMagick methods. Here is an example call to an image manipulation method:

    + +
    $image->Crop(geometry=>'100x100+10+20');
    +$image->[$x]->Frame("100x200");
    +
    + +

    And here is a list of other image manipulation methods you can call:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Manipulation Methods
    MethodParametersDescription
    AdaptiveBlurgeometry=>geometry, radius=>double, sigma=>double, bias=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}adaptively blur the image with a Gaussian operator of the given radius and standard deviation (sigma). Decrease the effect near edges.
    AdaptiveResizegeometry=>geometry, width=>integer, height=>integer, filter=>{Point, Box, Triangle, Hermite, Hanning, Hamming, Blackman, Gaussian, Quadratic, Cubic, Catrom, Mitchell, Lanczos, Bessel, Sinc}, support=>double, blur=>doubleadaptively resize image using data dependant triangulation. Specify blur > 1 for blurry or < 1 for sharp
    AdaptiveSharpengeometry=>geometry, radius=>double, sigma=>double, bias=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}adaptively sharpen the image with a Gaussian operator of the given radius and standard deviation (sigma). Increase the effect near edges.
    AdaptiveThresholdgeometry=>geometry, width=>integer, height=>integer, bias=>doublelocal adaptive thresholding.
    AddNoisenoise=>{Uniform, Gaussian, Multiplicative, Impulse, Laplacian, Poisson}, attenuate=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}add noise to an image
    AffineTransformaffine=>array of float values, translate=>float, float, scale=> float, float, rotate=>float, skewX=>float, skewY=>float, interpolate={Average, Bicubic, Bilinear, Filter, Integer, Mesh, NearestNeighbor}, background=>color nameaffine transform image
    Affinityimage=>image-handle, method=>{None, FloydSteinberg, Riemersma}choose a particular set of colors from this image
    Annotatetext=>string, font=>string, family=>string, style=>{Normal, Italic, Oblique, Any}, stretch=>{Normal, UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, SemiExpanded, Expanded, ExtraExpanded, UltraExpanded}, weight=>integer, pointsize=>integer, density=>geometry, stroke=>color name, strokewidth=>integer, fill=>color name, undercolor=>color name, kerning=>float, geometry=>geometry, gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}, antialias=>{true, false}, x=>integer, y=>integer, affine=>array of float values, translate=>float, float, scale=>float, float, rotate=>float. skewX=>float, skewY=> float, align=>{Left, Center, Right}, encoding=>{UTF-8}, interline-spacing=>double, interword-spacing=>double, direction=>{right-to-left, left-to-right}, decorate=>{none, underline, overline, line-through}annotate an image with text. See QueryFontMetrics to get font metrics without rendering any text.
    AutoGammachannel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}automagically adjust gamma level of image
    AutoLevelchannel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}automagically adjust color levels of image
    AutoOrient
    adjusts an image so that its orientation is suitable for viewing (i.e. top-left orientation)
    AutoThresholdmethod=>{Kapur, OTSU, Triangle}automatically perform image thresholding
    BilateralSmoothinggeometry=>geometry, width=>integer, height=>integer, intensity-sigma=>double, spatial-sigma=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}a non-linear, edge-preserving, and noise-reducing smoothing filter for images. It replaces the intensity of each pixel with a weighted average of intensity values from nearby pixels. This weight is based on a Gaussian distribution. The weights depend not only on Euclidean distance of pixels, but also on the radiometric differences (e.g., range differences, such as color intensity, depth distance, etc.). This preserves sharp edges. The default value for the intensity and spatial sigmas are 2*diameter and 0.5*diameter respectively.
    BlackThresholdthreshold=>color, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}force all pixels below the threshold intensity into black
    BlueShiftfactor=>double,simulate a scene at nighttime in the moonlight. Start with a factor of 1.5.
    Blurgeometry=>geometry, radius=>double, sigma=>double, bias=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}reduce image noise and reduce detail levels with a Gaussian operator of the given radius and standard deviation (sigma).
    Bordergeometry=>geometry, width=>integer, height=>integer, bordercolor=>color name, compose=>{Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyAlpha, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor },surround the image with a border of color
    CannyEdgegeometry=>geometry, radius=>double, sigma=>double, 'lower-percent'=>double, 'upper-percent'=>doubleuse a multi-stage algorithm to detect a wide range of edges in the image (e.g. CannyEdge('0x1+10%+40%')).
    Charcoalgeometry=>geometry, radius=>double, sigma=>doublesimulate a charcoal drawing
    Chopgeometry=>geometry, width=>integer, height=>integer, x=>integer, y=>integer, gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}chop an image
    CLAHEgeometry=>geometry, width=>integer, height=>integer, number-bins=>integer, clip-limit=>doublecontrast limited adaptive histogram equalization. width, height divides the image into tiles. number-bins is the number of histogram bins per tile (min 2, max 256). clip-limit is the contrast limit for localised changes in contrast. A clip-limit of 2 to 3 is a good starting place.
    Clampchannel=>{Red, RGB, All, etc.}set each pixel whose value is below zero to zero and any the pixel whose value is above the quantum range to the quantum range (e.g. 65535) otherwise the pixel value remains unchanged.
    Clipid=>name, inside=>{true, false},apply along a named path from the 8BIM profile.
    ClipMaskmask=>image-handleclip image as defined by the image mask
    Clutimage=>image-handle, interpolate={Average, Bicubic, Bilinear, Filter, Integer, Mesh, NearestNeighbor}, channel=>{Red, RGB, All, etc.}apply a color lookup table to an image sequence
    Colorcolor=>color nameset the entire image to this color.
    ColorDecisionListfilename=>string,color correct with a color decision list.
    Colorizefill=>color name, blend=>stringcolorize the image with the fill color
    ColorMatrixmatrix=>array of float valuesapply color correction to the image. Although you can use variable sized matrices, typically you use a 5 x 5 for an RGBA image and a 6x6 for CMYKA. A 6x6 matrix is required for offsets (populate the last column with normalized values).
    Colorspacecolorspace=>{RGB, Gray, Transparent, OHTA, XYZ, YCbCr, YCC, YIQ, YPbPr, YUV, CMYK} set the image colorspace
    Commentstringadd a comment to your image
    ColorThresholdstart-color=>color, stop-color=>color, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}force all pixels below the threshold intensity into black
    CompareLayersmethod=>{any, clear, overlay}compares each image with the next in a sequence and returns the minimum bounding region of any pixel differences it discovers. Images do not have to be the same size, though it is best that all the images are coalesced (images are all the same size, on a flattened canvas, so as to represent exactly how a specific frame should look).
    Compositeimage=>image-handle, compose=>{Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyAlpha, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor }, mask=>image-handle, geometry=>geometry, x=>integer, y=>integer, gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}, opacity=>integer, tile=>{True, False}, rotate=>double, color=>color name, blend=>geometry, interpolate=>{undefined, average, bicubic, bilinear, filter, integer, mesh, nearest-neighbor, spline}, clip-to-self=>{True, False}composite one image onto another. Use the rotate parameter in concert with the tile parameter.
    ConnectedComponentsconnectivity=>integer,connected-components uniquely labeled, choose from 4 or 8 way connectivity.
    Contrastsharpen=>{True, False}enhance or reduce the image contrast
    ContrastStretchlevels=>string, 'black-point'=>double, 'white-point'=>double, channel=>{Red, RGB, All, etc.}improve the contrast in an image by `stretching' the range of intensity values
    Convolvecoefficients=>array of float values, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, bias=>doubleapply a convolution kernel to the image. Given a kernel order , you would supply order*order float values (e.g. 3x3 implies 9 values).
    CopyPixelsimage=>image-handle, geometry=>geometry, width=>integer, height=>integer, x=>integer, y=>integer, offset=>geometry, gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}, dx=>integer, dy=>integercopy pixels from the image as defined by the widthxheight+x+y to image at offset +dx,+dy.
    Cropgeometry=>geometry, width=>integer, height=>integer, x=>integer, y=>integer, fuzz=>double, gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}crop an image
    CycleColormapamount=>integerdisplace image colormap by amount
    Decipherpassphrase=>stringconvert cipher pixels to plain pixels
    Deconstruct
    break down an image sequence into constituent parts
    Deskewgeometry=>string,threshold=>doublestraighten the image
    Despeckle reduce the speckles within an image
    Differenceimage=>image-handlecompute the difference metrics between two images
    Distortpoints=>array of float values, method=>{Affine, AffineProjection, ScaleRotateTranslate, SRT, Perspective, PerspectiveProjection, BilinearForward, BilinearReverse, Polynomial, Arc, Polar, DePolar, Barrel, BarrelInverse, Shepards, Resize}, 'virtual-pixel'=>{Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White}, 'best-fit'=>{True, False}distort image
    Drawprimitive=>{point, line, rectangle, arc, ellipse, circle, path, polyline, polygon, bezier, color, matte, text, @filename}, points=>string , method=>{Point, Replace, Floodfill, FillToBorder, Reset}, stroke=>color name, fill=>color name, font=>string, pointsize=>integer, strokewidth=>float, antialias=>{true, false}, bordercolor=>color name, x=>float, y=>float, dash-offset=>float, dash-pattern=>array of float values, affine=>array of float values, translate=>float, float, scale=>float, float, rotate=>float, skewX=>float, skewY=>float, interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline}, kerning=>float, text=>string, vector-graphics=>string, interline-spacing=>double, interword-spacing=>double, direction=>{right-to-left, left-to-right}annotate an image with one or more graphic primitives.
    Encipherpassphrase=>stringconvert plain pixels to cipher pixels
    Edgeradius=>doubleenhance edges within the image with a convolution filter of the given radius.
    Embossgeometry=>geometry, radius=>double, sigma=>doubleemboss the image with a convolution filter of the given radius and standard deviation (sigma).
    Enhance
    apply a digital filter to enhance a noisy image
    Equalizechannel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}
    perform histogram equalization to the image
    Extentgeometry=>geometry, width=>integer, height=>integer, x=>integer, y=>integer, fuzz=>double, background=>color name, gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}set the image size
    Evaluatevalue=>double, operator=>{Add, And, Divide, LeftShift, Max, Min, Multiply, Or, Rightshift, RMS, Subtract, Xor}, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} apply an arithmetic, relational, or logical expression to the image
    Filterkernel=>string, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, bias=>doubleapply a convolution kernel to the image.
    Flip
    reflect the image scanlines in the vertical direction
    Flop
    reflect the image scanlines in the horizontal direction
    FloodfillPaintgeometry=>geometry, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, x=>integer, y=>integer , fill=>color name, bordercolor=>color name, fuzz=>double, invert=>{True, False}changes the color value of any pixel that matches the color of the target pixel and is a neighbor. If you specify a border color, the color value is changed for any neighbor pixel that is not that color.
    ForwardFourierTransformmagnitude=>{True, False}implements the forward discrete Fourier transform (DFT)
    Framegeometry=>geometry, width=>integer, height=>integer, inner=>integer, outer=>integer, fill=>color name, compose=>{Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyAlpha, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor },surround the image with an ornamental border
    Functionparameters=>array of float values, function=>{Sin}, 'virtual-pixel'=>{Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White}apply a function to the image
    Gammagamma=>string, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}gamma correct the image
    GaussianBlurgeometry=>geometry, radius=>double, sigma=>double, bias=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}reduce image noise and reduce detail levels with a Gaussian operator of the given radius and standard deviation (sigma).
    GetPixelgeometry=>geometry, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, normalize=>{true, false}, x=>integer, y=>integerget a single pixel. By default normalized pixel values are returned.
    GetPixelsgeometry=>geometry, width=>integer, height=>integer, x=>integer, y=>integer, map=>string, normalize=>{true, false}get image pixels as defined by the map (e.g. "RGB", "RGBA", etc.). By default non-normalized pixel values are returned.
    Grayscalechannel=>{Average, Brightness, Lightness, Rec601Luma, Rec601Luminance, Rec709Luma, Rec709Luminance, RMS}convert image to grayscale
    HaldClutimage=>image-handle, channel=>{Red, RGB, All, etc.}apply a Hald color lookup table to an image sequence
    HoughLinegeometry=>geometry, width=>double, height=>double, threshold=>doubleidentify lines in the image (e.g. HoughLine('9x9+195')).
    Identifyfile=>file, features=>distance, moments=>{True, False}, unique=>{True, False}identify the attributes of an image
    Implodeamount=>double, interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline}implode image pixels about the center
    InverseDiscreteFourierTransformmagnitude=>{True, False}implements the inverse discrete Fourier transform (DFT)
    Kmeansgeometry=>geometry, 'colors'=>double, 'iterations'=>double, 'tolerance'=>doubleK means color reduction.
    Kuwaharageometry=>geometry, radius=>double, sigma=>double, bias=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}edge preserving noise reduction filter
    Labelstringassign a label to an image
    Layersmethod=>{coalesce, compare-any, compare-clear, compare-over, composite, dispose, flatten, merge, mosaic, optimize, optimize-image, optimize-plus, optimize-trans, remove-dups, remove-zero}, compose=>{Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyAlpha, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, LinearLight, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor }, dither=>{true, false}compare each image the GIF disposed forms of the previous image in the sequence. From this, attempt to select the smallest cropped image to replace each frame, while preserving the results of the animation.
    Levellevels=>string, 'black-point'=>double, 'gamma'=>double, 'white-point'=>double, channel=>{Red, RGB, All, etc.}adjust the level of image contrast
    LevelColorsinvert=>>{True, False}, 'black-point'=>string, 'white-point'=>string, channel=>{Red, RGB, All, etc.}level image with the given colors
    LinearStretchlevels=>string, 'black-point'=>double, 'white-point'=>doublelinear with saturation stretch
    LiquidResizegeometry=>geometry, width=>integer, height=>integer, delta-x=>double, rigidity=>doublerescale image with seam-carving.
    Magnify
    double the size of the image with pixel art scaling
    Maskmask=>image-handlecomposite image pixels as defined by the mask
    MatteFloodfillgeometry=>geometry, x=>integer, y=>integer , matte=>integer, bordercolor=>color name, fuzz=>double, invert=>{True, False}changes the matte value of any pixel that matches the color of the target pixel and is a neighbor. If you specify a border color, the matte value is changed for any neighbor pixel that is not that color.
    MeanShiftgeometry=>geometry, width=>double, height=>double, distance=>doubledelineate arbitrarily shaped clusters in the image (e.g. MeanShift('7x7+10%')).
    MedianFiltergeometry=>geometry, width=>integer, height=>integer, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}replace each pixel with the median intensity pixel of a neighborhood.
    Minify
    half the size of an image
    Modegeometry=>geometry, width=>integer, height=>integer, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}make each pixel the predominant color of the neighborhood.
    Modulatefactor=>geometry, brightness=>double, saturation=>double, hue=>double, lightness=>double, whiteness=>double, blackness=>double vary the brightness, saturation, and hue of an image by the specified percentage
    Morphologykernel=>string, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, iterations=>integerapply a morphology method to the image.
    MotionBlurgeometry=>geometry, radius=>double, sigma=>double, angle=>double, bias=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}reduce image noise and reduce detail levels with a Gaussian operator of the given radius and standard deviation (sigma) at the given angle to simulate the effect of motion
    Negategray=>{True, False}, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}replace each pixel with its complementary color (white becomes black, yellow becomes blue, etc.)
    Normalizechannel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}
    transform image to span the full range of color values
    OilPaintradius=>integersimulate an oil painting
    Opaquecolor=>color name, +fill=>color name, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, invert=>{True, False}change this color to the fill color within the image
    OrderedDitherthreshold=>{threshold, checks, o2x2, o3x3, o4x4, o8x8, h4x4a, h6x6a, h8x8a, h4x4o, h6x6o, h8x8o, h16x16o, hlines6x4}, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}order dither image
    Perceptibleepsilon=>double, channel=>{Red, RGB, All, etc.}set each pixel whose value is less than |epsilon| to -epsilon or epsilon (whichever is closer) otherwise the pixel value remains unchanged..
    Polaroidcaption=>string, angle=>double, pointsize=>double, font=>string, stroke=> color name, strokewidth=>integer, fill=>color name, gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}, background=>color namesimulate a Polaroid picture.
    Posterizelevels=>integer, dither=>{True, False}reduce the image to a limited number of color level
    Profilename=>string, profile=>blob, rendering-intent=>{Undefined, Saturation, Perceptual, Absolute, Relative}, black-point-compensation=>{True, False}add or remove ICC or IPTC image profile; name is formal name (e.g. ICC or filename; set profile to '' to remove profile
    Quantizecolors=>integer, colorspace=>{RGB, Gray, Transparent, OHTA, XYZ, YCbCr, YIQ, YPbPr, YUV, CMYK, sRGB, HSL, HSB}, treedepth=> integer, dither=>{True, False}, dither-method=>{Riemersma, Floyd-Steinberg}, measure_error=>{True, False}, global_colormap=>{True, False}, transparent-color=>colorpreferred number of colors in the image
    Raisegeometry=>geometry, width=>integer, height=>integer, x=>integer, y=>integer, raise=>{True, False}lighten or darken image edges to create a 3-D effect
    RangeThresholdgeometry=>geometry, 'low-black'=>double, 'low-white'=>double, 'high-white'=>double, 'high-black'=>doublecombine soft and hard image thresholding.
    ReduceNoisegeometry=>geometry, width=>integer, height=>integer, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}reduce noise in the image with a noise peak elimination filter
    Remapimage=>image-handle, dither=>{true, false}, dither-method=>{Riemersma, Floyd-Steinberg}replace the colors of an image with the closest color from a reference image.
    Resampledensity=>geometry, x=>double, y=>double, filter=>{Point, Box, Triangle, Hermite, Hanning, Hamming, Blackman, Gaussian, Quadratic, Cubic, Catrom, Mitchell, Lanczos, Bessel, Sinc}, support=>doubleresample image to desired resolution. Specify blur > 1 for blurry or < 1 for sharp
    Resizegeometry=>geometry, width=>integer, height=>integer, filter=>{Point, Box, Triangle, Hermite, Hanning, Hamming, Blackman, Gaussian, Quadratic, Cubic, Catrom, Mitchell, Lanczos, Bessel, Sinc}, support=>double, blur=>doublescale image to desired size. Specify blur > 1 for blurry or < 1 for sharp
    Rollgeometry=>geometry, x=>integer, y=>integerroll an image vertically or horizontally
    Rotatedegrees=>double, background=>color namerotate an image
    RotationalBlurgeometry=>geometry, angle=>double, bias=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}radial blur the image.
    Samplegeometry=>geometry, width=>integer, height=>integerscale image with pixel sampling.
    Scalegeometry=>geometry, width=>integer, height=>integerscale image to desired size
    Segmentcolorspace=>{RGB, Gray, Transparent, OHTA, XYZ, YCbCr, YCC, YIQ, YPbPr, YUV, CMYK}, verbose={True, False}, cluster-threshold=>double, smoothing-threshold=doublesegment an image by analyzing the histograms of the color components and identifying units that are homogeneous
    SelectiveBlurgeometry=>geometry, radius=>double, sigma=>double, threshold=>double, bias=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}selectively blur pixels within a contrast threshold.
    Separatechannel=>{Red, RGB, All, etc.}separate a channel from the image into a grayscale image
    Shadegeometry=>geometry, azimuth=>double, elevation=>double, gray=>{true, false}shade the image using a distant light source
    SetPixelgeometry=>geometry, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, color=>array of float values, x=>integer, y=>integer, color=>array of float valuesset the value a single pixel. Normalized pixel values are expected.
    SetPixelsgeometry=>geometry, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, color=>array of float values, width=>integer, height=>integer, x=>integer, y=>integer, color=>array of float valuesset the value of one or more pixels. Normalized pixel values are expected.
    Shadowgeometry=>geometry, opacity=>double, sigma=>double, x=>integer, y=>integersimulate an image shadow
    Sharpengeometry=>geometry, radius=>double, sigma=>double, bias=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}sharpen the image with a Gaussian operator of the given radius and standard deviation (sigma).
    Shavegeometry=>geometry, width=>integer, height=>integershave pixels from the image edges
    Sheargeometry=>geometry, x=>double, y=>double fill=>color nameshear the image along the X or Y axis by a positive or negative shear angle
    SigmoidalContrastgeometry=>string, 'contrast'=>double, 'mid-point'=>double channel=>{Red, RGB, All, etc.}, sharpen=>{True, False}sigmoidal non-lineraity contrast control. Increase the contrast of the image using a sigmoidal transfer function without saturating highlights or shadows. Contrast indicates how much to increase the contrast (0 is none; 3 is typical; 20 is a lot); mid-point indicates where midtones fall in the resultant image (0 is white; 50% is middle-gray; 100% is black). To decrease contrast, set sharpen to False.
    Signature
    generate an SHA-256 message digest for the image pixel stream
    Sketchgeometry=>geometry, radius=>double, sigma=>double, angle=>doublesketch the image with a Gaussian operator of the given radius and standard deviation (sigma) at the given angle
    Solarizegeometry=>string, threshold=>double, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}negate all pixels above the threshold level
    SortPixels
    sorts pixels within each scanline in ascending order of intensity.
    SparseColorpoints=>array of float values, method=>{Barycentric, Bilinear, Shepards, Voronoi}, 'virtual-pixel'=>{Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White}interpolate the image colors around the supplied points
    Splicegeometry=>geometry, width=>integer, height=>integer, x=>integer, y=>integer, fuzz=>double, background=>color name, gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}splice an image
    Spreadradius=>double, interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline}displace image pixels by a random amount
    Statisticgeometry=>geometry, width=>integer, height=>integer, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, type=>{Median, Mode, Mean, Maximum, Minimum, ReduceNoise, RMS}replace each pixel with corresponding statistic from the neighborhood.
    Steganoimage=>image-handle, offset=>integerhide a digital watermark within the image
    Stereoimage=>image-handle, x=>integer, y=>integercomposites two images and produces a single image that is the composite of a left and right image of a stereo pair
    Strip
    strip an image of all profiles and comments.
    Swirldegrees=>double, interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline}swirl image pixels about the center
    Texturetexture=>image-handlename of texture to tile onto the image background
    Thumbnailgeometry=>geometry, width=>integer, height=>integerchanges the size of an image to the given dimensions and removes any associated profiles.
    Thresholdthreshold=>string, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}threshold the image
    Tintfill=>color name, blend=>stringtint the image with the fill color.
    Transparentcolor=>color name, invert=>{True, False}make this color transparent within the image
    Transpose
    flip image in the vertical direction and rotate 90 degrees
    Transverse
    flop image in the horizontal direction and rotate 270 degrees
    Trim
    remove edges that are the background color from the image
    UnsharpMaskgeometry=>geometry, radius=>double, sigma=>double, gain=>double, threshold=>doublesharpen the image with the unsharp mask algorithm.
    Vignettegeometry=>geometry, radius=>double, sigma=>double, x=>integer, y=>integer, background=>color nameoffset the edges of the image in vignette style
    Wavegeometry=>geometry, amplitude=>double, wavelength=>double, interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline}alter an image along a sine wave
    WaveDenoisegeometry=>geometry, threshold=>double, threshold=>doubleremoves noise from the image using a wavelet transform
    WhiteBalanceapplies white balancing to an image according to a grayworld assumption in the LAB colorspace.
    WhiteThresholdthreshold=>string, , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}force all pixels above the threshold intensity into white
    + +

    Note, that the geometry parameter is a short cut for the width and height parameters (e.g. geometry=>'106x80' is equivalent to width=>106, height=>80 ).

    + +

    You can specify @filename in both Annotate() and Draw(). This reads the text or graphic primitive instructions from a file on disk. For example,

    + +
    image->Draw(fill=>'red', primitive=>'rectangle',
    + points=>'20,20 100,100  40,40 200,200  60,60 300,300');
    +
    + +

    Is equivalent to

    + +
    $image->Draw(fill=>'red', primitive=>'@draw.txt');
    +
    + +

    Where draw.txt is a file on disk that contains this:

    + +
    rectangle 20, 20 100, 100
    +rectangle 40, 40 200, 200
    +rectangle 60, 60 300, 300
    +
    + +

    The text parameter for methods, Annotate(), Comment(), Draw(), and Label() can include the image filename, type, width, height, or other image attribute by embedding these special format characters:

    + +
    %b   file size
    +%c   comment
    +%d   directory
    +%e   filename extension
    +%f   filename
    +%g   page geometry
    +%h   height
    +%i   input filename
    +%k   number of unique colors
    +%l   label
    +%m   magick
    +%n   number of scenes
    +%o   output filename
    +%p   page number
    +%q   quantum depth
    +%r   image class and colorspace
    +%s   scene number
    +%t   top of filename
    +%u   unique temporary filename
    +%w   width
    +%x   x resolution
    +%y   y resolution
    +%z   image depth
    +%C   image compression type
    +%D   image dispose method
    +%H   page height
    +%Q   image compression quality
    +%T   image delay
    +%W   page width
    +%X   page x offset
    +%Y   page y offset
    +%@   bounding box
    +%#   signature
    +%%   a percent sign
    +\n   newline
    +\r   carriage return
    +
    + +

    For example,

    + +
    text=>"%m:%f %wx%h"
    +
    + +

    produces an annotation of MIFF:bird.miff 512x480 for an image titled bird.miff and whose width is 512 and height is 480.

    + +

    You can optionally add Image to any method name. For example, TrimImage() is an alias for method Trim().

    + +

    Most of the attributes listed above have an analog in convert. See the documentation for a more detailed description of these attributes.

    + +

    Set an Image Attribute

    + +

    Use method Set() to set an image attribute. For example,

    + +
    $image->Set(dither=>'True');
    +$image->[$x]->Set(delay=>3);
    +
    + +

    Where this example uses 'True' and this document says '{True, False}', +you can use the case-insensitive strings 'True' and 'False', or you +can use the integers 1 and 0.

    + +

    When you call Get() on a Boolean attribute, Image::Magick returns 1 or 0, not a string.

    + +

    And here is a list of all the image attributes you can set:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Attributes
    AttributeValuesDescription
    adjoin{True, False}join images into a single multi-image file
    alpha{On, Off, Opaque, Transparent, Copy, Extract, Set}control of and special operations involving the alpha/matte channel
    antialias{True, False}remove pixel aliasing
    area-limitintegerset pixel area resource limit.
    attenuatedoublelessen (or intensify) when adding noise to an image.
    authenticatestringdecrypt image with this password.
    backgroundcolor nameimage background color
    blue-primaryx-value, y-valuechromaticity blue primary point (e.g. 0.15, 0.06)
    bordercolorcolor nameset the image border color
    clip-maskimageassociate a clip mask with the image.
    colormap[i]color namecolor name (e.g. red) or hex value (e.g. #ccc) at position +i
    commentstringset the image comment
    compression{None, BZip, Fax, Group4, JPEG, JPEG2000, LosslessJPEG, LZW, RLE, Zip}type of image compression
    debug{All, Annotate, Blob, Cache, Coder, Configure, Deprecate, Draw, Exception, Locale, None, Resource, Transform, X11}display copious debugging information
    delayintegerthis many 1/100ths of a second must expire before displaying the next image in a sequence
    densitygeometryvertical and horizontal resolution in pixels of the image
    depthintegerimage depth
    direction{Undefined, right-to-left, left-to-rightrender text right-to-left or left-to-right
    disk-limitintegerset disk resource limit
    dispose{Undefined, None, Background, Previous}layer disposal method
    dither{True, False}apply error diffusion to the image
    displaystringspecifies the X server to contact
    extractgeometryextract area from image
    filefilehandleset the image filehandle
    filenamestringset the image filename
    fillcolorThe fill color paints any areas inside the outline of drawn shape.
    fontstringuse this font when annotating the image with text
    fuzzintegercolors within this distance are considered equal
    gammadoublegamma level of the image
    Gravity{Forget, NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}type of image gravity
    green-primaryx-value, y-valuechromaticity green primary point (e.g. 0.3, 0.6)
    index[x, y]stringcolormap index at position (x, y)
    interlace{None, Line, Plane, Partition, JPEG, GIF, PNG}the type of interlacing scheme
    iterationsintegeradd Netscape loop extension to your GIF animation
    labelstringset the image label
    loopintegeradd Netscape loop extension to your GIF animation
    magickstringset the image format
    map-limitintegerset map resource limit
    maskimageassociate a mask with the image.
    matte{True, False}enable the image matte channel
    mattecolorcolor nameset the image matte color
    memory-limitintegerset memory resource limit
    monochrome{True, False}transform the image to black and white
    optionstringassociate an option with an image format (e.g. option=>'ps:imagemask'
    orientation{TopLeft, TopRight, BottomRight, BottomLeft, LeftTop, RightTop, RightBottom, LeftBottom}image orientation
    page{ Letter, Tabloid, Ledger, Legal, Statement, Executive, A3, A4, A5, B4, B5, Folio, Quarto, 10x14} or geometrypreferred size and location of an image canvas
    pixel[x, y]stringhex value (e.g. #ccc) at position (x, y)
    pointsizeintegerpointsize of the Postscript or TrueType font
    precisionintegerset the maximum number of significant digits to be printed
    qualityintegerJPEG/MIFF/PNG compression level
    red-primaryx-value, y-valuechromaticity red primary point (e.g. 0.64, 0.33)
    sampling-factorgeometryhorizontal and vertical sampling factor
    sceneintegerimage scene number
    serverstringspecifies the X server to contact
    sizestringwidth and height of a raw image
    strokecolorThe stroke color paints along the outline of a shape.
    texturestringname of texture to tile onto the image background
    tile-offsetgeometryimage tile offset
    time-limitintegerset time resource limit in seconds
    type{Bilevel, Grayscale, GrayscaleMatte, Palette, PaletteMatte, TrueColor, TrueColorMatte, ColorSeparation, ColorSeparationMatte}image type
    units{ Undefined, PixelsPerInch, PixelsPerCentimeter}units of image resolution
    verbose{True, False}print detailed information about the image
    virtual-pixel{Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White}the virtual pixel method
    white-pointx-value, y-valuechromaticity white point (e.g. 0.3127, 0.329)
    + +

    Note, that the geometry parameter is a short cut for the width and height parameters (e.g. geometry=>'106x80' is equivalent to width=>106, height=>80).

    + +

    SetAttribute() is an alias for method Set().

    + +

    Most of the attributes listed above have an analog in +convert. See the documentation for a more detailed description of these attributes.

    + +

    Get an Image Attribute

    + +

    Use method Get() to get an image attribute. For example,

    + +
    ($a, $b, $c) = $image->Get('colorspace', 'magick', 'adjoin');
    +$width = $image->[3]->Get('columns');
    +
    + +

    In addition to all the attributes listed in Set an Image Attribute , you can get these additional attributes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Image Attributes
    AttributeValuesDescription
    areaintegercurrent area resource consumed
    base-columnsintegerbase image width (before transformations)
    base-filenamestringbase image filename (before transformations)
    base-rowsintegerbase image height (before transformations)
    class{Direct, Pseudo}image class
    colorsintegernumber of unique colors in the image
    columnsintegerimage width
    copyrightstringget PerlMagick's copyright
    directorystringtile names from within an image montage
    elapsed-timedoubleelapsed time in seconds since the image was created
    errordoublethe mean error per pixel computed with methods Compare() or Quantize()
    bounding-boxstringimage bounding box
    diskintegercurrent disk resource consumed
    filesizeintegernumber of bytes of the image on disk
    formatstringget the descriptive image format
    geometrystringimage geometry
    heightintegerthe number of rows or height of an image
    iccstringICC profile
    iccstringICM profile
    idintegerImageMagick registry id
    IPTCstringIPTC profile
    mean-errordoublethe normalized mean error per pixel computed with methods Compare() or Quantize()
    mapintegercurrent memory-mapped resource consumed
    matte{True, False}whether or not the image has a matte channel
    maximum-errordoublethe normalized max error per pixel computed with methods Compare() or Quantize()
    memoryintegercurrent memory resource consumed
    mimestringMIME of the image format
    montagegeometrytile size and offset within an image montage
    page.xintegerx offset of image virtual canvas
    page.yintegery offset of image virtual canvas
    rowsintegerthe number of rows or height of an image
    signaturestringSHA-256 message digest associated with the image pixel stream
    taint{True, False}True if the image has been modified
    total-ink-densitydoublereturns the total ink density for a CMYK image
    transparent-colorcolor nameset the image transparent color
    user-timedoubleuser time in seconds since the image was created
    versionstringget PerlMagick's version
    widthintegerthe number of columns or width of an image
    XMPstringXMP profile
    x-resolutionintegerx resolution of the image
    y-resolutionintegery resolution of the image
    + +

    GetAttribute() is an alias for method Get().

    + +

    Most of the attributes listed above have an analog in +convert. See the documentation for a more detailed description of these attributes.

    + +

    Compare an Image to its Reconstruction

    + +

    Mathematically and visually annotate the difference between an image and its reconstruction with the Compare() method. The method supports these parameters:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Compare Parameters
    ParameterValuesDescription
    channeldoubleselect image channels, the default is all channels except alpha.
    fuzzdoublecolors within this distance are considered equal
    imageimage-referencethe image reconstruction
    metricAE, MAE, MEPP, MSE, PAE, PSNR, RMSEmeasure differences between images with this metric
    + +

    In this example, we compare the ImageMagick logo to a sharpened reconstruction:

    + +
    use Image::Magick;
    +
    +$logo=Image::Magick->New();
    +$logo->Read('logo:');
    +$sharp=Image::Magick->New();
    +$sharp->Read('logo:');
    +$sharp->Sharpen('0x1');
    +$difference=$logo->Compare(image=>$sharp, metric=>'rmse');
    +print $difference->Get('error'), "\n";
    +$difference->Display();
    +
    + +

    In addition to the reported root mean squared error of around 0.024, a difference image is displayed so you can visually identify the difference between the images.

    + +

    Create an Image Montage

    + +

    Use method Montage() to create a composite image by combining several separate images. The images are tiled on the composite image with the name of the image optionally appearing just below the individual tile. For example,

    + +
    $image->Montage(geometry=>'160x160', tile=>'2x2', texture=>'granite:');
    +
    + +

    And here is a list of Montage() parameters you can set:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Montage Parameters
    ParameterValuesDescription
    backgroundcolor namebackground color name
    borderintegerimage border width
    filenamestringname of montage image
    fillcolor namefill color for annotations
    fontstringX11 font name
    framegeometrysurround the image with an ornamental border
    geometrygeometrypreferred tile and border size of each tile of the composite +image (e.g. 120x120+4+3>)
    gravityNorthWest, North, NorthEast, West, Center, East, SouthWest, +South, SouthEastdirection image gravitates to within a tile
    labelstringassign a label to an image
    modeFrame, Unframe, Concatenatethumbnail framing options
    pointsizeintegerpointsize of the Postscript or TrueType font
    shadow{True, False}add a shadow beneath a tile to simulate depth
    strokecolor namestroke color for annotations
    texturestringname of texture to tile onto the image background
    tilegeometrythe number of tiles per row and page (e.g. 6x4)
    titlestringassign a title to the image montage
    transparentstringmake this color transparent within the image
    + +

    Note, that the geometry parameter is a short cut for the width and height parameters (e.g. geometry=>'106x80' is equivalent to width=>106, height=>80).

    + +

    MontageImage() is an alias for method Montage().

    + +

    Most of the attributes listed above have an analog in montage. See the documentation for a more detailed description of these attributes.

    + +

    Working with Blobs

    + +

    A blob contains data that directly represent a particular image +format in memory instead of on disk. PerlMagick supports +blobs in any of these image formats and provides methods to convert a blob to or from a particular image format.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Blob Methods
    MethodParametersReturn ValueDescription
    ImageToBlobany image attributean array of image data in the respective image formatconvert an image or image sequence to an array of blobs
    BlobToImageone or more blobsthe number of blobs converted to an imageconvert one or more blobs to an image
    + +

    ImageToBlob() returns the image data in their respective formats. You can then print it, save it to an ODBC database, write it to a file, or pipe it to a display program:

    + +
    @blobs = $image->ImageToBlob();
    +open(DISPLAY,"| display -") || die;
    +binmode DISPLAY;
    +print DISPLAY $blobs[0];
    +close DISPLAY;
    +
    + +

    Method BlobToImage() returns an image or image sequence converted from the supplied blob:

    + +
    @blob=$db->GetImage();
    +$image=Image::Magick->new(magick=>'jpg');
    +$image->BlobToImage(@blob);
    +
    + +

    Direct-access to Image Pixels

    + +

    Use these methods to obtain direct access to the image pixels:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Direct-access to Image Pixels
    MethodParametersDescription
    GetAuthenticPixelsgeometry=>geometry, width=>integer, height=>integer, x=>integer, y=>integerreturn authentic pixels as a C pointer
    GetVirtualPixelsgeometry=>geometry, width=>integer, height=>integer, x=>integer, y=>integerreturn virtual pixels as a const C pointer
    GetAuthenticIndexQueuereturn colormap indexes or black pixels as a C pointer
    GetVirtualIndexQueuereturn colormap indexes or black pixels as a const C pointer
    SyncAuthenticPixelssync authentic pixels to pixel cache
    + +

    Miscellaneous Methods

    + +

    The Append() method append a set of images. For example,

    + +
    $p = $image->Append(stack=>{true,false});
    +
    + +

    appends all the images associated with object $image. By default, images are stacked left-to-right. Set stack to True to stack them top-to-bottom.

    + +

    The Clone() method copies a set of images. For example,

    + +
    $q = $p->Clone();
    +
    + +

    copies all the images from object $p to $q. You can use this method for single or multi-image sequences.

    + +

    Coalesce() composites a set of images while respecting any page +offsets and disposal methods. GIF, MIFF, and MNG animation sequences +typically start with an image background and each subsequent image +varies in size and offset. A new image sequence is returned with all +images the same size as the first images virtual canvas and composited +with the next image in the sequence.. For example,

    + +
    $q = $p->Coalesce();
    +
    + +

    The ComplexImages() method performs complex mathematics on an image sequence. For example,

    + +
    $p = $image->ComplexImages('conjugate');
    +
    + +

    The EvaluateImages() method applies an arithmetic, logical or relational expression to a set of images. For example,

    + + +
    $p = $image->EvaluateImages('mean');
    +
    + +

    averages all the images associated with object $image.

    + +

    The Features() method returns features for each channel in the image in each of four directions (horizontal, vertical, left and right diagonals) for the specified distance. The features include the angular second momentum, contrast, correlation, sum of squares: variance, inverse difference moment, sum average, sum varience, sum entropy, entropy, difference variance, difference entropy, information measures of correlation 1, information measures of correlation 2, and maximum correlation coefficient. Values in RGB, CMYK, RGBA, or CMYKA order (depending on the image type).

    + +
    @features = $image->Features(1);
    +
    + +

    The Flatten() method flattens a set of images and returns it. For example,

    + +
    $p = $images->Flatten(background=>'none');
    +$p->Write('flatten.png');
    +
    + +

    The sequence of images is replaced by a single image created by composing each image after the first over the first image.

    + +

    The Fx() method applies a mathematical expression to a set of images and returns the results. For example,

    + +
    $p = $image->Fx(expression=>'(g+b)/2.0',channel=>'red');
    +$p->Write('fx.miff');
    +
    + +

    replaces the red channel with the average of the green and blue channels.

    + +

    See FX, The Special Effects Image Operator for a detailed discussion of this method.

    + +

    Histogram() returns the unique colors in the image and a count for each one. The returned values are an array of red, green, blue, opacity, and count values.

    + +

    The Morph() method morphs a set of images. Both the image pixels and size are linearly interpolated to give the appearance of a meta-morphosis from one image to the next:

    + +
    $p = $image->Morph(frames=>integer);
    +
    + +

    where frames is the number of in-between images to generate. The default is 1.

    + +

    Mosaic() creates an mosaic from an image sequence.

    + +

    Method Mogrify() is a single entry point for the image manipulation methods (Manipulate an Image). The parameters are the name of a method followed by any parameters the method may require. For example, these calls are equivalent:

    + +
    $image->Crop('340x256+0+0');
    +$image->Mogrify('crop', '340x256+0+0');
    +
    + +

    Method MogrifyRegion() applies a transform to a region of the image. It is similar to Mogrify() but begins with the region geometry. For example, suppose you want to brighten a 100x100 region of your image at location (40, 50):

    + +
    $image->MogrifyRegion('100x100+40+50', 'modulate', brightness=>50);
    +
    + +

    PerceptualHash() maps visually identical images to the same or similar hash-- useful in image retrieval, authentication, indexing, or copy detection as well as digital watermarking. For each channel and for the sRGB and the HCLp colorspaces, 7 hash values are returned For an sRGB images, for example, expect 42 perceptual hashes.

    + +
    @phash = $image->PerceptualHash();
    + +

    Ping() is a convenience method that returns information about an image without having to read the image into memory. It returns the width, height, file size in bytes, and the file format of the image. You can specify more than one filename but only one filehandle:

    + +
    ($width, $height, $size, $format) = $image->Ping('logo.png');
    +($width, $height, $size, $format) = $image->Ping(file=>\*IMAGE);
    +($width, $height, $size, $format) = $image->Ping(blob=>$blob);
    +
    + +

    This a more efficient and less memory intensive way to query if an image exists and what its characteristics are.

    + +

    Poly() builds a polynomial from the image sequence and the corresponding terms (coefficients and degree pairs):

    + +
    $p = $image->Poly([0.5,1.0,0.25,2.0,1.0,1.0]);
    +
    + +

    PreviewImage() tiles 9 thumbnails of the specified image with an image processing operation applied at varying strengths. This may be helpful pin-pointing an appropriate parameter for a particular image processing operation. Choose from these operations: Rotate, Shear, Roll, Hue, Saturation, Brightness, Gamma, Spiff, Dull, Grayscale, Quantize, Despeckle, ReduceNoise, AddNoise, Sharpen, Blur, Threshold, EdgeDetect, Spread, Solarize, Shade, Raise, Segment, Swirl, Implode, Wave, OilPaint, CharcoalDrawing, JPEG. Here is an example:

    + +
    $preview = $image->Preview('Gamma');
    +$preview->Display();
    +
    + +

    To have full control over text positioning you need font metric information. Use

    + +
    ($x_ppem, $y_ppem, $ascender, $descender, $width, $height, $max_advance) =
    +  $image->QueryFontMetrics(parameters);
    +
    + +

    Where parameters is any parameter of the Annotate method. The return values are:

    + +
      +
    1. character width
    2. +
    3. character height
    4. +
    5. ascender
    6. +
    7. descender
    8. +
    9. text width
    10. +
    11. text height
    12. +
    13. maximum horizontal advance
    14. +
    15. bounds: x1
    16. +
    17. bounds: y1
    18. +
    19. bounds: x2
    20. +
    21. bounds: y2
    22. +
    23. origin: x
    24. +
    25. origin: y
    26. +
    + +

    Use QueryMultilineFontMetrics() to get the maximum text width and height for multiple lines of text.

    + +

    Call QueryColor() with no parameters to return a list of known colors names or specify one or more color names to get these attributes: red, green, blue, and opacity value.

    + +
    @colors = $image->QueryColor();
    +($red, $green, $blue) = $image->QueryColor('cyan');
    +($red, $green, $blue, $alpha) = $image->QueryColor('#716baeff');
    +
    + +

    QueryColorname() accepts a color value and returns its respective name or hex value;

    + +
    $name = $image->QueryColorname('rgba(80,60,0,0)');
    +
    + +

    Call QueryFont() with no parameters to return a list of known fonts or specify one or more font names to get these attributes: font name, description, family, style, stretch, weight, encoding, foundry, format, metrics, and glyphs values.

    + +
    @fonts = $image->QueryFont();
    +$weight = ($image->QueryFont('Helvetica'))[5];
    +
    + +

    Call QueryFormat() with no parameters to return a list of known image formats or specify one or more format names to get these attributes: adjoin, blob support, raw, decoder, encoder, description, and module.

    + +
    @formats = $image->QueryFormat();
    +($adjoin, $blob_support, $raw, $decoder, $encoder, $description, $module) =
    +  $image->QueryFormat('gif');
    +
    + +

    Call MagickToMime() with the image format name to get its MIME type such as images/tiff from tif.

    + +
    $mime = $image->MagickToMime('tif');
    +
    + +

    Use RemoteCommand() to send a command to an already running display or animate application. The only parameter is the name of the image file to display or animate.

    + +
    $image->RemoteCommand('image.jpg');
    +
    + +

    The Smush() method smushes a set of images together. For example,

    + +
    $p = $image->Smush(stack=>{true,false},offset=>integer);
    +
    + +

    smushes together all the images associated with object $image. By default, images are smushed left-to-right. Set stack to True to smushed them top-to-bottom.

    + +

    Statistics() returns the image statistics for each channel in the image. The returned values are an array of depth, minima, maxima, mean, standard deviation, kurtosis, skewness, and entropy values in RGB, CMYK, RGBA, or CMYKA order (depending on the image type).

    + +
    @statistics = $image->Statistics();
    +
    + +

    Finally, the Transform() method accepts a fully-qualified geometry specification for cropping or resizing one or more images. For example,

    + +
    $p = $image->Transform(crop=>'100x100+0+0');
    +
    + +

    You can optionally add Image to any method name above. For example, PingImage() is an alias for method Ping().

    + +

    Handling Exceptions

    + +

    All PerlMagick methods return an undefined string context upon success. If any problems occur, the error is returned as a string with an embedded numeric status code. A status code less than 400 is a warning. This means that the operation did not complete but was recoverable to some degree. A numeric code greater or equal to 400 is an error and indicates the operation failed completely. Here is how exceptions are returned for the different methods:

    + +

    Methods which return a number (e.g. Read(), Write()):

    + +
    $x = $image->Read(...);
    +warn "$x" if "$x";      # print the error message
    +$x =~ /(\d+)/;
    +print $1;               # print the error number
    +print 0+$x;             # print the number of images read
    +
    + +

    Methods which operate on an image (e.g. Resize(), Crop()):

    + +
    $x = $image->Crop(...);
    +warn "$x" if "$x";      # print the error message
    +$x =~ /(\d+)/;
    +print $1;               # print the error number
    +
    + +

    Methods which return images (EvaluateSequence(), Montage(), Clone()) should be checked for errors this way:

    + +
    $x = $image->Montage(...);
    +warn "$x" if !ref($x);  # print the error message
    +$x =~ /(\d+)/;
    +print $1;               # print the error number
    +
    + +

    Here is an example error message:

    + +
    Error 400: Memory allocation failed
    +
    + +

    Review the complete list of error and warning codes.

    + +

    The following illustrates how you can use a numeric status code:

    + +
    $x = $image->Read('rose.png');
    +$x =~ /(\d+)/;
    +die "unable to continue" if ($1 == ResourceLimitError);
    +
    + +

    Constants

    + +

    PerlMagick includes these constants:

    + +
    BlobError
    +BlobWarning
    +CacheError
    +CacheWarning
    +CoderError
    +CoderWarning
    +ConfigureError
    +ConfigureWarning
    +CorruptImageError
    +CorruptImageWarning
    +DelegateError
    +DelegateWarning
    +DrawError
    +DrawWarning
    +ErrorException
    +FatalErrorException
    +FileOpenError
    +FileOpenWarning
    +ImageError
    +ImageWarning
    +MissingDelegateError
    +MissingDelegateWarning
    +ModuleError
    +ModuleWarning
    +Opaque
    +OptionError
    +OptionWarning
    +QuantumDepth
    +QuantumRange
    +RegistryError
    +RegistryWarning
    +ResourceLimitError
    +ResourceLimitWarning
    +StreamError
    +StreamWarning
    +Success
    +Transparent
    +TypeError
    +TypeWarning
    +WarningException
    +XServerError
    +XServerWarning
    +
    + +

    You can access them like this:

    + +
    Image::Magick->QuantumDepth
    +
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/porting.html b/ImageMagick-6.9.12-44/www/porting.html new file mode 100644 index 0000000..9fe90ce --- /dev/null +++ b/ImageMagick-6.9.12-44/www/porting.html @@ -0,0 +1,694 @@ + + + + + + + + + + ImageMagick (legacy) – Porting to ImageMagick Version 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Porting Guide

    +

    ImageMagick Version 7High Dynamic Range ImagingPixel ChannelsAlphaGrayscaleMasksMagickCore APIHeader FilesDeprecated Features RemovedCommand-line InterfaceVersion 7 Change Summary

    + +

    The design of ImageMagick is an evolutionary process, with the design and implementation efforts serving to influence and guide further progress in the other. With ImageMagick version 7, we improved the design based on lessons learned from the version 6 implementation. ImageMagick was originally designed to display RGB images to an X Windows server. Over time we extended support to RGBA images and then to the CMYK and CMYKA image format. With ImageMagick version 7, we extend support to arbitrary colorspaces with an arbitrary number of pixel channels. In addition, ImageMagick 7 stores pixel channels as floats permitting out of band values (e.g. negative) and reduces rounding error. There are numerous other design enhancements described within.

    + +

    To support variable pixel channels in the MagickCore API, pixel handling has changed when getting or setting the pixel channels. You can access channels as an array, pixel[i], or use an accessor method such as GetPixelRed() or SetPixelRed(). There are some modest changes to the MagickCore and MagickWand API's. The Magick++ and PerlMagick API's have not changed and matches that of the ImageMagick version 6.

    + +

    The shell API (command line) of ImageMagick version 7 has undergone +a major overhaul, with specific emphasis on the ability to read 'options' not +only from the command line, but also from scripts, and file streams. This +allows for the use of 'co-processing' programming techniques or performing +image handling using 'daemon/server backends', and even multi-machine +distributed processing.

    + +

    With the shell API overhaul other improvements were made, including: +better reporting of which option failed, the consolidation and deprecation of +options, and more global use of 'image properties' (more commonly known as +'percent escapes' in option arguments.

    + +

    ImageMagick version 7 is available now as a production release.

    + +

    Now that ImageMagick version 7 is released, we continue to support and enhance version 6 for a minimum of 10 years.

    + +

    High Dynamic Range Imaging

    +

    ImageMagick version 7 enables high dynamic range imaging (HDRI) by default. HDRI accurately represents the wide range of intensity levels found in real scenes ranging from the brightest direct sunlight to the deepest darkest shadows. In addition, image processing results are more accurate. The disadvantage is it requires more memory and may result in slower processing times. If you see differences in the results of your version 6 command-line with version 7, it is likely due to HDRI. You may need to add -clamp to your command-line to constrain pixels to the 0 .. QuantumRange range, or disable HDRI when you build ImageMagick version 7. To disable HDRI (recommended for smart phone builds such as iOS or production sites where performance is a premium), simply add --disable-hdri to the configure script command line when building ImageMagick.

    + +

    Pixel Channels

    +

    A pixel is comprised of one or more color values, or channels (e.g. red pixel channel).

    +

    Prior versions of ImageMagick (4-6), support 4 to 5 pixel channels (RGBA or CMYKA). The first 4 channels are accessed with the PixelPacket data structure. The structure includes 4 members of type Quantum (typically 16-bits) of red, green, blue, and opacity. The black channel or colormap indexes are supported by a separate method and structure, IndexPacket. As an example, here is a code snippet from ImageMagick version 6 that negates the color components (but not the alpha component) of the image pixels:

    + +
    for (y=0; y < (ssize_t) image->rows; y++)
    +{
    +  IndexPacket
    +    *indexes;
    +
    +  PixelPacket
    +    *q;
    +
    +  q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
    +  if (q == (PixelPacket *) NULL)
    +    {
    +      status=MagickFalse;
    +      continue;
    +    }
    +  indexes=GetCacheViewAuthenticIndexQueue(image_view);
    +  for (x=0; x < (ssize_t) image->columns; x++)
    +  {
    +    if ((channel & RedChannel) != 0)
    +      q->red=(Quantum) QuantumRange-q->red;
    +    if ((channel & GreenChannel) != 0)
    +      q->green=(Quantum) QuantumRange-q->green;
    +    if ((channel & BlueChannel) != 0)
    +      q->blue=(Quantum) QuantumRange-q->blue;
    +    if (((channel & IndexChannel) != 0) &&
    +        (image->colorspace == CMYKColorspace))
    +      indexes[x]=(IndexPacket) QuantumRange-indexes[x];
    +    q++;
    +  }
    +  if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
    +    status=MagickFalse;
    +}
    + +

    ImageMagick version 7 supports any number of channels from 1 to 64 (and beyond) and simplifies access with a single method that returns an array of pixel channels of type Quantum. Source code that compiles against prior versions of ImageMagick requires refactoring to work with ImageMagick version 7. We illustrate with an example. Let's naively refactor the version 6 code snippet from above so it works with the ImageMagick version 7 API:

    + +
    for (y=0; y < (ssize_t) image->rows; y++)
    +{
    +  Quantum
    +    *q;
    +
    +  q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
    +  if (q == (Quantum *) NULL)
    +    {
    +      status=MagickFalse;
    +      continue;
    +    }
    +  for (x=0; x < (ssize_t) image->columns; x++)
    +  {
    +    if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
    +      SetPixelRed(image,QuantumRange-GetPixelRed(image,q),q);
    +    if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
    +      SetPixelGreen(image,QuantumRange-GetPixelGreen(image,q),q);
    +    if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
    +      SetPixelBlue(image,QuantumRange-GetPixelBlue(image,q),q);
    +    if ((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0)
    +      SetPixelBlack(image,QuantumRange-GetPixelBlack(image,q),q);
    +    if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
    +      SetPixelAlpha(image,QuantumRange-GetPixelAlpha(image,q),q);
    +    q+=GetPixelChannels(image);
    +  }
    +  if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
    +    status=MagickFalse;
    +}
    + +

    Let's do that again but take full advantage of the new variable pixel channel support:

    + +
    for (y=0; y < (ssize_t) image->rows; y++)
    +{
    +  Quantum
    +    *q;
    +
    +  q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
    +  if (q == (Quantum *) NULL)
    +    {
    +      status=MagickFalse;
    +      continue;
    +    }
    +  for (x = 0; x < (ssize_t) image->columns; x++)
    +  {
    +    ssize_t
    +      i;
    +
    +    if (GetPixelWriteMask(image,q) <= (QuantumRange/2))
    +      {
    +        q+=GetPixelChannels(image);
    +        continue;
    +      }
    +    for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
    +    {
    +      PixelChannel channel = GetPixelChannelChannel(image,i);
    +      PixelTrait traits = GetPixelChannelTraits(image,channel);
    +      if ((traits & UpdatePixelTrait) == 0)
    +        continue;
    +      q[i]=QuantumRange-q[i];
    +    }
    +    q+=GetPixelChannels(image);
    +  }
    +  if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
    +    status=MagickFalse;
    +}
    + +

    Note, how we use GetPixelChannels() to advance to the next set of pixel channels.

    + +

    The colormap indexes and black pixel channel (for the CMYK colorspace) are no longer stored in the index channel, previously accessed with GetAuthenticIndexQueue() and GetCacheViewAuthenticIndexQueue(). Instead they are now a first class pixel channel and accessed as a member of the pixel array (e.g. pixel[4]) or with the convenience pixel accessor methods GetPixelIndex(), SetPixelIndex(), GetPixelBlack(), and SetPixelBlack().

    + +

    As a consequence of using an array structure for variable pixel channels, auto-vectorization compilers have additional opportunities to speed up pixel loops.

    +

    The `sync` channel in IMv6 was really a flag instead of a channel. In IMv7, we instead use a flag: -define compose:sync=false.

    + +

    Pixel Accessors

    +

    You can access pixel channel as array elements (e.g. pixel[1]) or use convenience accessors to get or set pixel channels:

    + +
    GetPixela()                  SetPixela()
    +GetPixelAlpha()              SetPixelAlpha()
    +GetPixelb()                  SetPixelb()
    +GetPixelBlack()              SetPixelBlack()
    +GetPixelBlue()               SetPixelBlue()
    +GetPixelCb()                 SetPixelCb()
    +GetPixelCr()                 SetPixelCr()
    +GetPixelCyan()               SetPixelCyan()
    +GetPixelGray()               SetPixelGray()
    +GetPixelGreen()              SetPixelGreen()
    +GetPixelIndex()              SetPixelIndex()
    +GetPixelL()                  SetPixelL()
    +GetPixelMagenta()            SetPixelMagenta()
    +GetPixelReadMask()           SetPixelReadMask()
    +GetPixelWriteMask()          SetPixelWriteMask()
    +GetPixelMetacontentExtent()  SetPixelMetacontentExtent()
    +GetPixelOpacity()            SetPixelOpacity()
    +GetPixelRed()                SetPixelRed()
    +GetPixelYellow()             SetPixelYellow()
    +GetPixelY()                  SetPixelY()
    + +

    You can find these accessors defined in the header file, MagickCore/pixel-accessor.h

    + +

    Pixel Traits

    +

    Each pixel channel includes one or more of these traits:

    +
    +
    Undefined
    +
    no traits associated with this pixel channel
    +
    Copy
    +
    do not update this pixel channel, just copy it
    +
    Update
    +
    update this pixel channel
    +
    Blend
    +
    blend this pixel channel with the alpha mask if it's enabled
    +
    +

    We provide these methods to set and get pixel traits:

    +
    GetPixelAlphaTraits()    SetPixelAlphaTraits()
    +GetPixelBlackTraits()    SetPixelBlackTraits()
    +GetPixelBlueTraits()     SetPixelBlueTraits()
    +GetPixelCbTraits()       SetPixelCbTraits()
    +GetPixelChannelTraits()  SetPixelChannelTraits()
    +GetPixelCrTraits()       SetPixelCrTraits()
    +GetPixelGrayTraits()     SetPixelGrayTraits()
    +GetPixelGreenTraits()    SetPixelGreenTraits()
    +GetPixelIndexTraits()    SetPixelIndexTraits()
    +GetPixelMagentaTraits()  SetPixelMagentaTraits()
    +GetPixelRedTraits()      SetPixelRedTraits()
    +GetPixelYellowTraits()   SetPixelYellowTraits()
    +GetPixelYTraits()        SetPixelYTraits()
    +

    For convenience you can set the active trait for a set of pixel channels with a channel mask and this method:

    +
    SetImageChannelMask()
    +
    + +

    Previously MagickCore methods had channel analogs, for example, NegateImage() and NegateImageChannels(). The channel analog methods are no longer necessary because the pixel channel traits specify whether to act on a particular pixel channel or whether to blend with the alpha mask. For example, instead of

    +
    NegateImageChannel(image,channel);
    +

    we use:

    +
    channel_mask=SetImageChannelMask(image,channel);
    +NegateImage(image,exception);
    +(void) SetImageChannelMask(image,channel_mask);
    + +

    Pixel User Channels

    +

    In version 7, we introduce pixel user channels. Traditionally we utilize 4 channels, red, green, blue, and alpha. For CMYK we also have a black channel. User channels are designed to contain whatever additional channel information that makes sense for your application. Some examples include extra channels in TIFF or PSD images or perhaps you require a channel with infrared information for the pixel. You can associate traits with the user channels so that when they are acted upon by an image processing algorithm (e.g. blur) the pixels are copied, acted upon by the algorithm, or even blended with the alpha channel if that makes sense.

    +

    Pixel Metacontent

    +

    In version 7, we introduce pixel metacontent. Metacontent is content about content. So rather than being the content itself, it's something that describes or is associated with the content. Here the content is a pixel. The pixel metacontent is for your exclusive use (internally the data is just copied, it is not modified) and is accessed with these MagickCore API methods:

    +
    SetImageMetacontentExtent()
    +GetImageMetacontentExtent()
    +GetVirtualMetacontent()
    +GetAuthenticMetacontent()
    +GetCacheViewAuthenticMetacontent()
    +GetCacheViewVirtualMetacontent()
    + +

    Alpha

    +

    We support alpha now, previously opacity. With alpha, a value of 0 means that the pixel does not have any coverage information and is transparent; i.e. there was no color contribution from any geometry because the geometry did not overlap this pixel. A value of QuantumRange means that the pixel is opaque because the geometry completely overlapped the pixel. As a consequence, in version 7, the PixelInfo structure member alpha has replaced the previous opacity member. Another consequence is the alpha part of an sRGB value in hexadecimal notation is now reversed (e.g. #0000 is fully transparent).

    +

    Colorspace

    +

    The Rec601Luma and Rec709Luma colorspaces are no longer supported. Instead, specify the gray colorspace and choose from these intensity options:

    +
    Rec601Luma
    +Rec601Luminance
    +Rec709Luma
    +Rec709Luminance
    +

    For example,

    +
    magick myImage.png -intensity Rec709Luminance -colorspace gray myImage.jpg
    + +

    Grayscale

    +

    Previously, grayscale images were Rec601Luminance and consumed 4 channels: red, green, blue, and alpha. With version 7, grayscale consumes only 1 channel requiring far less resources as a result.

    + +

    Masks

    +

    Version 7 supports masks for most image operators. White pixels in a read mask ignores corresponding pixel in an image whereas white pixels in a write mask protects the corresponding pixel in the image. From the command-line, you can associate a mask with an image with the -read-mask and -write-mask options. This polarity matches the masks in version 6 of ImageMagick for ease of porting your workflow. For convenience, we continue to support the -mask option in version 7 to match the behavior of version 6.

    +

    In this example, we compute the distortion of a masked reconstructed image:

    +
    compare -metric rmse -read-mask hat_mask.png hat.png wizard.png difference.png
    +

    Here we protect certain pixels from change:

    +
    magick rose: -write-mask rose_bg_mask.png -modulate 110,100,33.3  +write-mask rose_blue.png
    + +

    A mask associated with an image persists until it is modified or removed. This may produce unexpected results for complex command-lines. Here we only want to clip when applying the alpha option, not the resize:

    +
    +convert -density 300 -colorspace srgb image.eps -alpha transparent -clip -alpha opaque +clip -resize 1000x1000 -strip image.png
    +
    + +

    MagickCore API

    +

    Here are a list of changes to the MagickCore API:

    +
      +
    • Almost all image processing algorithms are now channel aware.
    • +
    • The MagickCore API adds an ExceptionInfo argument to those methods that lacked it in version 6, e.g. NegateImage(image,MagickTrue,exception)
    • +
    • All method channel analogs have been removed (e.g. BlurImageChannel()), they are no longer necessary, use pixel traits instead.
    • +
    • Public and private API calls are now declared with the GCC visibility attribute. The MagickCore and MagickWand dynamic libraries now only export public struct and function declarations.
    • +
    • The InterpolatePixelMethod enum is now PixelInterpolateMethod.
    • +
    • The IntegerPixel storage type is removed (use LongPixel instead) and LongLongPixel is added
    • +
    • Image signatures have changed to account for variable pixel channels.
    • +
    • All color packet structures, PixelPacket, LongPacket, and DoublePacket, are consolidated to a single color structure, PixelInfo.
    • +
    • The ChannelMoments structure member I is now invariant. I conflicts with the complex.h header.
    • +
    • We added a length parameter to FormatMagickSize() to permit variable length buffers.
    • +
    +

    MagickWand API

    +

    Here are a list of changes to the MagickWand API:

    +
      +
    • Almost all image processing algorithms are now channel aware.
    • +
    • The DrawMatte() method is now called DrawAlpha().
    • +
    • The MagickSetImageBias() and MagickSetImageClipMask() methods are no longer supported.
    • +
    +

    Magick++ API

    +

    Here are a list of changes to the Magick++ API:

    +
      +
    • Almost all image processing algorithms are now channel aware.
    • +
    • Use this construct, for example, to avoid operating on the alpha channel: +
      image.negateChannel(Magick::ChannelType(Magick::CompositeChannels ^ Magick::AlphaChannel));
      +
      +
    • +
    +

    Header Files

    +

    Prior versions of ImageMagick (4-6) reference the ImageMagick header files as magick/ and wand/. ImageMagick 7 instead uses MagickCore/ and MagickWand/ respectively. For example,

    +
    #include <MagickCore/MagickCore.h>
    +#include <MagickWand/MagickWand.h>
    + +

    Deprecated Features Removed

    +

    All deprecated features from ImageMagick version 6 are removed in version 7. These include the Magick-config and Wand-config configuration utilities. Instead use:

    + +
    MagickCore-config
    +MagickWand-config
    +

    The FilterImage() method has been removed. Use ConvolveImage() instead.

    + +

    In addition, all deprecated MagickCore and MagickWand methods are no longer available in version 7.

    + +

    The Bessel filter was removed as it is an alias for Jinc. Use -filter Jinc instead.

    + +

    Shell API or Command-line Interface

    + +

    As mentioned the primary focus of the changes to the Shell API or Command +Line Interface is the abstraction so that not only can options be +read from command line arguments, but also from a file (script) or from a file +stream (interactive commands, or co-processing).

    + +

    To do this the CLI parser needed to be re-written, so as to always perform +all options, in a strict, do-it-as-you-see it order. Previously in IMv6 +options were performed in groups (known as 'FireOptions), this awkwardness is +now gone. However the strict order means that you can no longer give operations +before providing an image for the operations to work on. To do so will now +produce an error.

    + +

    Error reporting is now reporting exactly which option (by argument count on +command line, or line,column in scripts) caused the 'exception'. This is not +complete as yet but getting better. Also not complete is 'regard-warnings' +handling or its replacement, which will allow you to ignore reported errors +and continue processing (as appropriate due to error) in co-processes or +interactive usage.

    + +

    With the IMv7 parser, activated by the `magick` utility, settings are applied to each image in memory in turn (if any). While an option: only need to be applied once globally. Using the other utilities directly, or as an argument to the `magick` CLI (e.g. `magick convert`) utilizes the legacy parser.

    + +

    The parenthesis options used to 'push' the current image list, and image +settings (EG: '(' and ')' ) on to a stack now has +a completely separate image settings stack. That is parenthesis 'push/pull' +image lists, and curly braces (EG: '{' and '}' ) will +'push/pull' image settings.

    + +

    Of course due to the previously reported changes to the underlying channel +handling will result be many side effects to almost all options. Here are some +specific

    + +

    Most algorithms update the red, green, blue, black (for CMYK), and alpha +channels. Most operators will blend alpha the other color channels, but other +operators (and situations) may require this blending to be disabled, and is +currently done by removing alpha from the active channels via +-channel option. (e.g. magick castle.gif -channel RGB +-negate castle.png).

    + +

    Reading gray-scale images generate an image with only one channel. If +that image is to then accept color the -colorspace setting needs to +be applied to expand the one channel into separate RGB (or other) channels. +

    +

    Previously, command-line arguments were limited to 4096 characters, with ImageMagick version 7 the limit has increased to 131072 characters.

    + +

    Command Changes

    +

    Here are a list of changes to the ImageMagick commands:

    +
    +
    magick
    +
    The "magick" command is the new primary command of the Shell + API, replacing the old "magick" command. This allows you to + create a 'magick script' of the form "#!/path/to/command/magick + -script", or pipe options into a command "magick -script + -, as a background process.
    + +
    magick-script
    +
    This the same as "magick", (only command name is different) + but which has an implicit "-script" option. This allows you to + use it in an "env" style script form. That is a magick script + starts with the 'she-bang' line of "#!/usr/bin/env + magick-script" allowing the script interpreter to be found anywhere + on the users command "PATH". This is required to get around + a "one argument she-bang bug" that is common on most UNIX systems + (including Linux, but not MacOSX).
    +
    animate, compare, composite, conjure, convert, display, identify, import, mogrify, montage, stream
    +
    To reduce the footprint of the command-line utilities, these utilities are symbolic links to the magick utility. You can also invoke them from the magick utility, for example, use magick convert logo: logo.png to invoke the magick utility. +
    + +

    Behavioral Changes

    +

    Image settings are applied to each image on the command line. To associate a setting with a particular image, use parenthesis to remove ambiguity. In this example we assign a unique page offset to each image:

    +
    magick \( -page +10+20 first.png \) \( -page +100+200 second.png \) ...
    + +

    By default, image operations such as convolution blends alpha with each channel. To convolve each channel independently, deactivate the alpha channel as follows:

    +
    magick ... -alpha discrete -blur 0x1 ...
    +

    To remove the alpha values from your image, use -alpha off. If you want to instead persist the alpha channel but not blend the alpha pixels for certain image processing operations, use -alpha deactivate instead.

    +

    Some options have changed in ImageMagick version 7. These include:

    +
    +
    -channel
    +
    the default is to update the RGBA channels, previously, in IMv6, the default was RGB. If you get results that differ from IMv6, you may need to specify -channel RGB on your command line (e.g. -channel RGB -negate).
    +
    +combine
    +
    This option now requires an argument, the image colorspace (e.g. +combine sRGB).
    +
    -format
    +
    The %Z image property is no longer supported.
    +
    -gamma
    +
    Multiple gamma arguments (e.g. -gamma 1,2,3) are no longer supported, instead use -channel (e.g. -channel blue -gamma 2).
    +
    -region
    +
    This option sets a write mask for the region you define. In IMv6, a separate image was cloned instead, operated on, and the results were composited to the source image. In addition, the draw transformations are relative to the upper left corner of the image, previously in IMv6 they were relative to the region.
    +
    + +

    Use -define morphology:showKernel=1 to post the morphology or convolution kernel. Previously it was -define showKernel=1.

    + +

    New Options

    +

    ImageMagick version 7 supports these new options, though most are limited +to the "magick" command, or to use in "magick" +scripts.

    + +
    +
    { ... }
    +
    Save (and restore) the current image settings (internally known as the + "image_info" structure). This is automatically done with parenthesis (EG: + '(' and ')') is "-regard-parenthesis" has + been set, just as in IMv6. Caution is advised to prevent un-balanced + braces errors.
    + +
    --
    +
    End of options, to be used in IMv7 "mogrify" command to + explicitly separate the operations to be applied and the images that + are to be processed 'in-place'. (not yet implemented). However if + not provided, "-read" can still be used to differentiate + secondary image reads (for use in things like alpha composition) from + the 'in-place' image being processed. In other commands (such as "magick") it is equivalent to an explicit "-read" (see below) of the next option as an image (as it was in IMv6).
    + +
    -alpha activate/deactivate
    +
    enables and disables the alpha channel, respectively, with persistence. This is like on/off in Imagemagick 6. In Imagemagick 7, -alpha off will remove the alpha channel permanently such that -alpha on will not re-enable it.
    + +
    -alpha discrete
    +
    treat the alpha channel independently (do not blend).
    + +
    -channel-fx expression
    +
    +

    exchange, extract, or copy one or more image channels.

    + +

    The expression consists of one or more channels, either mnemonic or numeric (e.g. red or 0, green or 1, etc.), separated by certain operation symbols as follows:

    + +
    <=>  exchange two channels (e.g. red<=>blue)
    +=>   copy one channel to another channel (e.g. red=>green)
    +=    assign a constant value to a channel (e.g. red=50%)
    +,    write new image with channels in the specified order (e.g. red, green)
    +;    add a new output image for the next set of channel operations (e.g. red; green; blue)
    +|    move to the next input image for the source of channel data (e.g. | gray=>alpha)
    + +

    For example, to create 3 grayscale images from the red, green, and blue channels of an image, use:

    + +
    -channel-fx "red; green; blue"
    + +

    A channel without an operation symbol implies separate (i.e, semicolon).

    + +

    Here we take an sRGB image and a grayscale image and inject the grayscale image into the alpha channel:

    +
    magick wizard.png mask.pgm -channel-fx '| gray=>alpha' wizard-alpha.png
    +

    Use a similar command to define a read mask:

    +
    magick wizard.png mask.pgm -channel-fx '| gray=>read-mask' wizard-mask.png
    + +

    Add -debug pixel prior to the -channel-fx option to track the channel morphology.

    + +
    + +
    -exit
    +
    Stop processing at this point. No further options will be processed after + this option. Can be used in a script to force the "magick" + command to exit, without actually closing the pipeline that it is + processing options from. May also be used as a 'final' option on the "magick" command + line, instead of an implicit output image, to completely prevent any image + write. ASIDE: even the "NULL:" coder requires at least one + image, for it to 'not write'! This option does not require any images at + all.
    + +
    -read {image}
    +
    Explicit read of an image, rather than an implicit read. This allows you + to read from filenames that start with an 'option' character, and which + otherwise could be mistaken as an option (unknown or otherwise). This will + eventually be used in "mogrify" to allow the reading of + secondary images, and allow the use of image list operations within that + command.
    + +
    -read-mask
    +
    prevent updates to image pixels specified by the mask
    + +
    -region
    +
    supported in ImageMagick 7.0.2-6 and above
    + +
    -script {file}
    +
    In "magick", stop the processing of command line arguments as + image operations, and read all further options from the given file or + pipeline.
    +
    -write-mask
    +
    prevent pixels from being written.
    + +
    + +

    Changed Options

    +

    These options are known to have changed, in some way.

    +
    +
    -bias
    +
    The option is no longer recognized. Use -define convolve:bias=value instead.
    +
    -draw
    +
    The matte primitive is now alpha (e.g. -draw 'alpha 0,0 floodfill').
    +
    -negate
    +
    currently negates all channels, including alpha if present. As such you may need to use the -channel option to prevent alpha negation (e.g. -channel RGB -negate).
    +
    -preview
    +
    this option is now an image operator. The PREVIEW image format has been removed.
    +
    + +

    Deprecated warning given, but will work (for now)

    +
    +
    -affine
    +
    Replaced by -draw "affine ...". (see transform)
    +
    -average
    +
    Replaced by -evaluate-sequence Mean.
    +
    -box
    +
    Replaced by -undercolor.
    +
    -deconstruct
    +
    Replaced by -layers CompareAny.
    +
    -gaussian
    +
    Replaced by -gaussian-blur.
    +
    -/+map
    +
    Replaced by -/+remap.
    +
    -/+mask
    +
    Replaced by -/+read-mask, -/+write-mask.
    +
    -/+matte
    +
    Replaced by -alpha Set/Off.
    +
    -transform
    +
    Replaced by -distort Affine "...".
    +
    + +

    Deprecated warning given, and ignored (for now)

    +

    Almost 'plus' (+) option that did not do anything has been marked as +deprecated, and does nothing. It does not even have associated code. For +example "+annotate", "+resize", "+clut", and "+draw" .

    + +
    +
    -affinity
    +
    Replaced by -remap.
    +
    -maximum
    +
    Replaced by -evaluate-sequence Max.
    +
    -median
    +
    Replaced by -evaluate-sequence Median.
    +
    -minimum
    +
    Replaced by -evaluate-sequence Min.
    +
    -recolor
    +
    Replaced by -color-matrix.
    +
    + +

    Removed / Replaced Options ("no such option" error and abort)

    + +
    +
    -interpolate filter
    +
    remove slow and useless interpolation method
    +
    -origin
    +
    old option, unknown meaning.
    +
    -pen
    +
    Replaced by -fill.
    +
    -passphrase
    +
    old option, unknown meaning
    +
    +

    Version 7 Change Summary

    +

    Changes from ImageMagick version 6 to version 7 are summarized here:

    +

    High Dynamic Range Imaging

    +
      +
    • ImageMagick version 7 enables HDRI by default. Expect more accurate image processing results with higher memory requirements and possible slower processing times. You can disable this feature for resource constrained system such as a cell phone with a slight loss of accuracy for certain algorithms (e.g. resizing).
    • +
    +

    Pixels

    +
      +
    • Pixels are no longer addressed with PixelPacket structure members (e.g. red, green, blue, opacity) but as an array of channels (e.g. pixel[PixelRedChannel]).
    • +
    • Use convenience macros to access pixel channels (e.g. GetPixelRed(), SetPixelRed()).
    • +
    • The black channel for the CMYK colorspace is no longer stored in the index channel, previously accessed with GetAuthenticIndexQueue() and GetCacheViewAuthenticIndexQueue(). Instead it is now a pixel channel and accessed with the convenience pixel macros GetPixelBlack() and SetPixelBlack().
    • +
    • The index channel for colormapped images is no longer stored in the index channel, previously accessed with GetAuthenticIndexQueue() and GetCacheViewAuthenticIndexQueue(). Instead it is now a pixel channel and accessed with the convenience pixel macros GetPixelIndex() and SetPixelIndex().
    • +
    • Use GetPixelChannels() to advance to the next set of pixel channels.
    • +
    • Use the metacontent channel to associate metacontent with each pixel.
    • +
    • All color packet structures, PixelPacket, LongPacket, and DoublePacket, are consolidated to a single color structure, PixelInfo.
    • +
    +

    Alpha

    +
      +
    • We support alpha rather than opacity (0 transparent; QuantumRange opaque).
    • +
    • Use GetPixelAlpha() or SetPixelAlpha() to get or set the alpha pixel channel value.
    • +
    +

    Grayscale

    +
      +
    • Grayscale images consume one pixel channel in ImageMagick version 7. To process RGB, set the colorspace to RGB (e.g. -colorspace sRGB).
    • +
    +

    Masks

    +
      +
    • ImageMagick version 6 only supports read mask in limited circumstances. Version 7 supports both a read and write mask. The read mask is honored by most image-processing algorithms.
    • +
    +

    MagickCore API

    +
      +
    • Almost all image processing algorithms are now channel aware.
    • +
    • MagickCore, version 7, adds an ExceptionInfo argument to those methods that lacked it in version 6, e.g. NegateImage(image,MagickTrue,exception);
    • +
    • All method channel analogs have been removed (e.g. BlurImageChannel()), they are no longer necessary, use pixel traits instead.
    • +
    • Public and private API calls are now declared with the GCC visibility attribute. The MagickCore and MagickWand dynamic libraries now only export public struct and function declarations.
    • +
    • The InterpolatePixelMethod enum is now PixelInterpolateMethod.
    • +
    • To account for variable pixel channels, images may now return a different signature.
    • +
    +

    Deprecated Methods

    +
      +
    • All ImageMagick version 6 MagickCore and MagickWand deprecated methods are removed and no longer available in ImageMagick version 7.
    • +
    • All MagickCore channel method analogs are removed (e.g. NegateImageChannels()). For version 7, use pixel traits instead.
    • +
    • The FilterImage() method has been removed. Use ConvolveImage() instead.
    • +
    +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/quantize.html b/ImageMagick-6.9.12-44/www/quantize.html new file mode 100644 index 0000000..2b31252 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/quantize.html @@ -0,0 +1,244 @@ + + + + + + + + + + ImageMagick (legacy) – Color Reduction Utilizing Adaptive Spatial Subdivision + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Algorithm DescriptionMeasuring Color Reduction Error

    + +

    This document describes how ImageMagick performs color reduction on an image. To fully understand what follows, you should have a knowledge of basic imaging techniques and the tree data structure and terminology.

    + +

    Algorithm Description

    + +

    For purposes of color allocation, an image is a set of n pixels, where each pixel is a point in RGB space. RGB space is a 3-dimensional vector space, and each pixel, p(i), is defined by an ordered triple of red, green, and blue coordinates, (r(i), g(i), b(i)).

    + +

    Each primary color component (red, green, or blue) represents an intensity which varies linearly from 0 to a maximum value, Cmax, which corresponds to full saturation of that color. Color allocation is defined over a domain consisting of the cube in RGB space with opposite vertices at (0, 0, 0) and (Cmax, Cmax, Cmax). ImageMagick requires Cmax= 255.

    + +

    The algorithm maps this domain onto a tree in which each node represents a cube within that domain. In the following discussion, these cubes are defined by the coordinate of two opposite vertices: The vertex nearest the origin in RGB space and the vertex farthest from the origin.

    + +

    The tree's root node represents the entire domain, (0,0,0) through (Cmax, Cmax, Cmax). Each lower level in the tree is generated by subdividing one node's cube into eight smaller cubes of equal size. This corresponds to bisecting the parent cube with planes passing through the midpoints of each edge.

    + +

    The basic algorithm operates in three phases:

    + +
      +
    1. Classification
    2. +
    3. Reduction
    4. +
    5. Assignment
    6. +
    + +

    Classification

    + +

    Classification builds a color description tree for the image. Reduction collapses the tree until the number it represents, at most, is the number of colors desired in the output image. Assignment defines the output image's color map and sets each pixel's color by reclassification in the reduced tree. Our goal is to minimize the numerical discrepancies between the original colors and quantized colors. To learn more about quantization error, see Measuring Color Reduction Error.

    + +

    Classification begins by initializing a color description tree of sufficient depth to represent each possible input color in a leaf. However, it is impractical to generate a fully-formed color description tree in the classification phase for realistic values of Cmax. If color components in the input image are quantized to k-bit precision, so that Cmax = 2^k-1, the tree would need k levels below the root node to allow representing each possible input color in a leaf. This becomes prohibitive because the tree's total number of nodes:

    + +
    total nodes = 1+Sum(8^i), i=1,k
    +
    +For k=8,
    +nodes = 1 + (8^1+8^2+....+8^8)
    +      = 1 + 8(8^8 - 1)/(8 - 1)
    +      = 19,173,961
    +
    + +

    Therefore, to avoid building a fully populated tree, ImageMagick:

    + +
      +
    1. initializes data structures for nodes only as they are needed;
    2. +
    3. chooses a maximum depth for the tree as a function of the desired number of colors in the output image (currently the base-two logarithm of Cmax).
    4. +
    + +
    For Cmax=255,
    +maximum tree depth = log2(256)
    +                   = 8
    +
    + +

    A tree of this depth generally allows the best representation of the source image with the fastest computational speed and the least amount of memory. However, the default depth is inappropriate for some images. Therefore, the caller can request a specific tree depth.

    + +

    For each pixel in the input image, classification scans downward from the root of the color description tree. At each level of the tree, it identifies the single node which represents a cube in RGB space containing the pixels' color. It updates the following data for each such node:

    + +
    +
    n1
    +
    number of pixels whose color is contained in the RGB cube which this node represents;
    +
    n2
    +
    number of pixels whose color is not represented in a node at lower depth in the tree; initially, n2=0 for all nodes except leaves of the tree.
    +
    Sr,Sg,Sb
    +
    sums of the red, green, and blue component values for all pixels not classified at a lower depth. The combination of these sums and n2 will ultimately characterize the mean color of a set of pixels represented by this node.
    +
    E
    +
    the distance squared in RGB space between each pixel contained within a node and the nodes' center. This represents the quantization error for a node.
    +
    + +

    Reduction

    + +

    Reduction repeatedly prunes the tree until the number of nodes with n2 > 0 is less than or equal to the maximum number of colors allowed in the output image. On any given iteration over the tree, it selects those nodes whose E value is minimal for pruning and merges their color statistics upward. It uses a pruning threshold, Ep, to govern node selection as follows:

    + +
    Ep = 0
    +while number of nodes with (n2 > 0) > required maximum number of colors
    +   prune all nodes such that E <= Ep
    +   Set Ep  to minimum E in remaining nodes
    +
    + +

    This has the effect of minimizing any quantization error when merging two nodes together.

    + +

    When a node to be pruned has offspring, the pruning procedure invokes itself recursively in order to prune the tree from the leaves upward. The values of n2, Sr, Sg, and Sb in a node being pruned are always added to the corresponding data in that node's parent. This retains the pruned node's color characteristics for later averaging.

    + +

    For each node, n2 pixels exist for which that node represents the smallest volume in RGB space containing those pixel's colors. When n2 > 0 the node will uniquely define a color in the output image. At the beginning of reduction, n2 = 0 for all nodes except the leaves of the tree which represent colors present in the input image.

    + +

    The other pixel count, n1, indicates the total number of colors within the cubic volume which the node represents. This includes n1 - n2 pixels whose colors should be defined by nodes at a lower level in the tree.

    + +

    Assignment

    + +

    Assignment generates the output image from the pruned tree. The output image consists of two parts:

    +
      +
    1. A color map, which is an array of color descriptions (RGB triples) for each color present in the output image.
    2. + +
    3. A pixel array, which represents each pixel as an index into the color map array.
    4. +
    + +

    First, the assignment phase makes one pass over the pruned color description tree to establish the image's color map. For each node with n2 > 0, it divides Sr, Sg, and Sb by n2. This produces the mean color of all pixels that classify no lower than this node. Each of these colors becomes an entry in the color map.

    + +

    Finally, the assignment phase reclassifies each pixel in the pruned tree to identify the deepest node containing the pixel's color. The pixel's value in the pixel array becomes the index of this node's mean color in the color map.

    + +

    Empirical evidence suggests that the distances in color spaces such as YUV, or YIQ correspond to perceptual color differences more closely than do distances in RGB space. These color spaces may give better results when color reducing an image. Here the algorithm is as described except each pixel is a point in the alternate color space. For convenience, the color components are normalized to the range 0 to a maximum value, Cmax. The color reduction can then proceed as described.

    + +

    Measuring Color Reduction Error

    + +

    Depending on the image, the color reduction error may be obvious or invisible. Images with high spatial frequencies (such as hair or grass) will show error much less than pictures with large smoothly shaded areas (such as faces). This because the high-frequency contour edges introduced by the color reduction process are masked by the high frequencies in the image.

    + +

    To measure the difference between the original and color reduced images (the total color reduction error), ImageMagick sums over all pixels in an image the distance squared in RGB space between each original pixel value and its color reduced value. ImageMagick prints several error measurements including the mean error per pixel, the normalized mean error, and the normalized maximum error.

    + +

    The normalized error measurement can be used to compare images. In general, the closer the mean error is to zero the more the quantized image resembles the source image. Ideally, the error should be perceptually-based, since the human eye is the final judge of quantization quality.

    + +

    These errors are measured and printed when the -colors and -verbose options are specified on the convert command line:

    + +
    + + + + + + + + + + + + + +
    mean error per pixelis the mean error for any single pixel in the image.
    normalized mean square erroris the normalized mean square quantization error for any single pixel in the image. This distance measure is normalized to a range between 0 and 1. It is independent of the range of red, green, and blue values in the image.
    normalized maximum square erroris the largest normalized square quantization error for any single pixel in the image. This distance measure is normalized to a range between of red, green, and blue values in the image.
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/resources.html b/ImageMagick-6.9.12-44/www/resources.html new file mode 100644 index 0000000..c972b1f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/resources.html @@ -0,0 +1,417 @@ + + + + + + + + + + ImageMagick (legacy) – Resources + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Resources

    +

    Configuration FilesModulesFontsEnvironment Variables

    + +

    ImageMagick depends on a number of external resources including configuration files, loadable modules, fonts, and environment variables.

    + +

    Configuration Files

    + +

    ImageMagick depends on a number of external configuration files detailed here:

    + +
    +
    coder.xml
    +
    Associate an image format with the specified coder module. + + ImageMagick has a number of coder modules to support the reading and/or writing of an image format (e.g. JPEG). Some coder modules support more than one associated image format and the mapping between an associated format and its respective coder module is defined in this configuration file. For example, the PNG coder module not only supports the PNG image format, but the JNG and MNG formats as well. +
    + +
    colors.xml
    +
    Associate a color name with its red, green, blue, and alpha intensities. + + A number of command line options require a color parameter. It is often convenient to refer to a color by name (e.g. white) rather than by hex value (e.g. #fff). This file maps a color name to its equivalent red, green, blue, and alpha intensities (e.g. for white, red = 255, green = 255, blue = 255, and alpha = 0). +
    + +
    configure.xml
    +
    Set ImageMagick build parameters and system-wide environment variables (e.g. MAGICK_TEMPORARY_PATH). + As ImageMagick is built, a number of build parameters are saved to this configuration file. They include the version, release date, dependent delegate libraries, and quantum depth among others. +
    + +
    delegates.xml
    +
    Associate delegate programs with certain image formats. + + ImageMagick relies on a number of delegate programs to support certain image formats such as ufraw-batch to read raw camera formats or Ghostscript to read Postscript images. Use this configuration file to map an input or output format to an external delegate program. +
    + +
    english.xml
    +
    Associate message tags with English translations.
    + +
    francais.xml
    +
    Associate message tags with French translations.
    + +
    locale.xml
    +
    Associate message tags with a translation for your locale. + + ImageMagick has a number of informational, warning, and error messages that are represented as tags. Tags are short descriptions of a message such as + FileNotFound or MemoryAllocationFailed. This configuration file lists locales that have a translation for each tag recognized by ImageMagick. Currently only English and French translations are available in the english.xml and francais.xml configuration files. +
    + +
    log.xml
    +
    Configure logging parameters. + ImageMagick is capable of spewing copious amounts of informational or debugging statements. Use this file to configure how the information will appear in a log message and where you want the logging messages posted. +
    + +
    magic.xml
    +
    Associate an image format with a unique identifier. + Many image formats have identifiers that uniquely identify a particular image format. For example, the GIF image format always begins with GIF8 as the first 4 characters of the image. ImageMagick uses this information to quickly determine the type of image it is dealing with when it reads an image. +
    + +
    mime.xml
    +
    Associate an internet media type with a unique identifier. + Many files and data streams have identifiers that uniquely identify a +particular internet media type. For example, files in the "Corel Draw +drawing" format (mime type="application/vnd.corel-draw") are associated with +the filename pattern *.cdr, and also have an initial string of the +characters "CDRXvrsn". ImageMagick uses combinations of this information, +when available, to attempt to quickly determine the internet media type of a +file or data stream. +
    + +
    policy.xml
    +
    Configure ImageMagick security policies. + By default any coder, delegate, filter, or file path is permitted. Use a policy to deny access to, for example, the MPEG video delegate, or permit reading images from a file system but deny writing to that same file system. Or use the resource policy to set resource limits. Policies are useful for multi-user servers that want to limit the overall impact ImageMagick has on the system. For example, to limit the maximum image size in memory to 100MP: + +
    <policy domain="resource" name="area" value="100KP"/>
    + +Any image larger than this area limit is cached to disk rather than memory. + +Use width to limit the maximum width of an image in pixels. Exceed this limit and an exception is thrown and processing stops. + +
    <policy domain="resource" name="width" value="8KP"/>
    + +To limit the elapsed time of any ImageMagick command to 5 minutes, use this policy: + +
    <policy domain="resource" name="time" value="300"/>
    +Define arguments for the memory, map, and disk resources with SI prefixes (.e.g 100MB). In addition, resource policies are maximums for each instance of ImageMagick (e.g. policy memory limit 1GB, the -limit 2GB option exceeds policy maximum so memory limit is 1GB).
    + +
    quantization-table.xml
    +
    Custom JPEG quantization tables. Activate with -define:q-table=quantization-table.xml.
    + +
    thresholds.xml
    +
    Set threshold maps for ordered posterized dither.
    + +
    type.xml
    +
    Configure fonts. + Define the font name, family, foundry, style, format, metrics, and glyphs for any font you want to use within ImageMagick. +
    + +
    type-ghostscript.xml
    +
    Configure Ghostscript fonts. + The Ghostscript package includes a number of fonts that can be accessed with ImageMagick. +
    + +
    type-windows.xml
    +
    Associate names with Windows font glyphs.
    +
    + +

    Under Linux and Linux, ImageMagick searches for each of the configuration files listed above by looking in the locations given below, in order, and loads them if found:

    + +
    $MAGICK_CONFIGURE_PATH
    +$PREFIX/etc/ImageMagick-6 
    +$PREFIX/share/ImageMagick-6 
    +$XDG_CACHE_HOME/ImageMagick
    +$HOME/.config/ImageMagick
    +<client path>/etc/ImageMagick
    + +

    The environmental variable $PREFIX is the default install path (e.g. /usr/local). The client path is the execution path of your ImageMagick client (e.g. /usr/local) .

    + +

    For the Linux or Linux pre-compiled uninstalled binary distributions, the configuration load order is:

    + +
    $MAGICK_CONFIGURE_PATH
    +$MAGICK_HOME/etc/ImageMagick-6 
    +$MAGICK_HOME/share/ImageMagick-6 
    +$PREFIX/share/ImageMagick-6 
    +$XDG_CACHE_HOME/ImageMagick
    +$HOME/.config/ImageMagick/
    +<client path>/etc/ImageMagick
    +<current directory>
    + +

    Under Windows, ImageMagick searches for these configuration files in the following order, and loads them if found:

    + +
    $MAGICK_CONFIGURE_PATH
    +<windows registry>
    +$PREFIX/config
    +$USERPROFILE/.config/ImageMagick
    +<client path>
    + +

    Above, $PREFIX is the default install path, typically c:\\Program Files\\ImageMagick-6.9.12.

    + +

    For an uninstalled Windows installation, the configuration load order is:

    + +
    $MAGICK_CONFIGURE_PATH
    +$MAGICK_HOME
    +$USERPROFILE/.config/ImageMagick
    +client path
    +<current directory>
    + +

    If a configuration file cannot not be found, ImageMagick relies on built-in default values.

    + +

    Modules

    + +

    Coders

    +

    An image coder (i.e. encoder / decoder) is responsible for registering, optionally classifying, optionally reading, optionally writing, and unregistering one image format (e.g. PNG, GIF, JPEG, etc.). ImageMagick searches for coders in the following order and it uses the first match found:

    + +
    $MAGICK_HOME/lib/ImageMagick-6.9.12/modules-Q16/coders
    +<client path>/../lib/ImageMagick-6.9.12/modules-Q16/coders
    +$MAGICK_HOME/lib/ImageMagick-6.9.12/modules-Q16/coders
    +$MAGICK_HOME/share/ImageMagick-6.9.12/modules-Q16/coders
    +$XDG_CACHE_HOME/ImageMagick
    +$HOME/.config/ImageMagick
    +<client path>/lib/ImageMagick-6.9.12/modules-Q16/coders
    + +

    Filters

    +

    ImageMagick provides a convenient mechanism for adding your own custom image processing algorithms. ImageMagick searches for filters in the following order and it uses the first match found:

    +
    $MAGICK_HOME/lib/ImageMagick-6.9.12/modules-Q16/filters
    +<client path>/../lib/ImageMagick-6.9.12/modules-Q16/filters
    +$MAGICK_HOME/lib/ImageMagick-6.9.12/modules-Q16/filters
    +$MAGICK_HOME/share/ImageMagick-6.9.12/modules-Q16/filters
    +$XDG_CACHE_HOME/ImageMagick
    +$HOME/.config/ImageMagick
    +<client path>/lib/ImageMagick-6.9.12/modules-Q16/filters
    + +

    Fonts

    + +

    ImageMagick is able to load raw TrueType and Postscript font files. It searches for the font configuration file, type.xml, in the following order, and loads them if found:

    + +
    $MAGICK_CONFIGURE_PATH
    +$MAGICK_HOME/etc/ImageMagick/-6.9.12
    +$MAGICK_HOME/share/ImageMagick-6.9.12
    +$XDG_CACHE_HOME/ImageMagick
    +$HOME/.config/ImageMagick
    +<client path>/etc/ImageMagick
    +$MAGICK_FONT_PATH
    + +

    Environment Variables

    + +

    Environment variables recognized by ImageMagick include:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HOMESet path to search for configuration files in $HOME/.config/ImageMagick if the directory exists.
    LD_LIBRARY_PATHSet path to the ImageMagick shareable libraries and other dependent libraries.
    MAGICK_AREA_LIMITSet the maximum width * height of an image that can reside in the pixel cache memory. Images that exceed the area limit are cached to disk (see MAGICK_DISK_LIMIT) and optionally memory-mapped.
    MAGICK_CODER_FILTER_PATHSet search path to use when searching for filter process modules (invoked via -process). This path permits the user to extend ImageMagick's image processing functionality by adding loadable modules to a preferred location rather than copying them into the ImageMagick installation directory. The formatting of the search path is similar to operating system search paths (i.e. colon delimited for Linux, and semi-colon delimited for Microsoft Windows). This user specified search path is searched before trying the default search path.
    MAGICK_CODER_MODULE_PATHSet path where ImageMagick can locate its coder modules. This path permits the user to arbitrarily extend the image formats supported by ImageMagick by adding loadable coder modules from an preferred location rather than copying them into the ImageMagick installation directory. The formatting of the search path is similar to operating system search paths (i.e. colon delimited for Linux, and semi-colon delimited for Microsoft Windows). This user specified search path is searched before trying the default search path.
    MAGICK_CONFIGURE_PATHSet path where ImageMagick can locate its configuration files. Use this search path to search for configuration (.xml) files. The formatting of the search path is similar to operating system search paths (i.e. colon delimited for Linux, and semi-colon delimited for Microsoft Windows). This user specified search path is searched before trying the default search path.
    MAGICK_DEBUGSet debug options. See -debug for a description of debugging options.
    MAGICK_DISK_LIMITSet maximum amount of disk space in bytes permitted for use by the pixel cache. When this limit is exceeded, the pixel cache is not be created and an error message is returned.
    MAGICK_ERRORMODESet the process error mode (Windows only). A typical use might be a value of 1 to prevent error mode dialogs from displaying a message box and hanging the application.
    MAGICK_FILE_LIMITSet maximum number of open pixel cache files. When this limit is exceeded, any subsequent pixels cached to disk are closed and reopened on demand. This behavior permits a large number of images to be accessed simultaneously on disk, but with a speed penalty due to repeated open/close calls.
    MAGICK_FONT_PATHSet path ImageMagick searches for TrueType and Postscript Type1 font files. This path is only consulted if a particular font file is not found in the current directory.
    MAGICK_HEIGHT_LIMITSet the maximum height of an image.
    MAGICK_HOMESet the path at the top of ImageMagick installation directory. This path is consulted by uninstalled builds of ImageMagick which do not have their location hard-coded or set by an installer.
    MAGICK_LIST_LENGTH_LIMITSet the maximum length of an image sequence.
    MAGICK_MAP_LIMITSet maximum amount of memory map in bytes to allocate for the pixel cache. When this limit is exceeded, the image pixels are cached to disk (see MAGICK_DISK_LIMIT).
    MAGICK_MEMORY_LIMITSet maximum amount of memory in bytes to allocate for the pixel cache from the heap. When this limit is exceeded, the image pixels are cached to memory-mapped disk (see MAGICK_MAP_LIMIT).
    MAGICK_OCL_DEVICESet to off to disable hardware acceleration of certain accelerated algorithms (e.g. blur, convolve, etc.).
    MAGICK_PRECISIONSet the maximum number of significant digits to be printed.
    MAGICK_SHRED_PASSESIf you want to keep the temporary files ImageMagick creates private, overwrite them with zeros or random data before they are removed. On the first pass, the file is zeroed. For subsequent passes, random data is written.
    MAGICK_SYNCHRONIZESet to "true" to ensure all image data is fully flushed and synchronized to disk. There is a performance penalty, however, the benefits include ensuring a valid image file in the event of a system crash and early reporting if there is not enough disk space for the image pixel cache.
    MAGICK_TEMPORARY_PATHSet path to store temporary files.
    MAGICK_THREAD_LIMITSet maximum parallel threads. Many ImageMagick algorithms run in parallel on multi-processor systems. Use this environment variable to set the maximum number of threads that are permitted to run in parallel.
    MAGICK_THROTTLE_LIMITPeriodically yield the CPU for at least the time specified in milliseconds.
    MAGICK_TIME_LIMITSet maximum time in seconds. When this limit is exceeded, an exception is thrown and processing stops.
    MAGICK_WIDTH_LIMITSet the maximum width of an image.
    SOURCE_DATE_EPOCHA UNIX timestamp, defined as the number of seconds, excluding leap seconds, since 01 Jan 1970 00:00:00 UTC.
    + +

    Define arguments for the MAGICK_MEMORY_LIMIT, MAGICK_DISK_LIMIT, and MAGICK_MEMORY_LIMIT environment variables with SI prefixes (.e.g 100MB). MAGICK_WIDTH_LIMIT, MAGICK_HEIGHT_LIMIT and MAGICK_AREA_LIMIT accepts pixel suffixes such as MP for mega-pixels (e.g. 100MP). Note, you can restrict limits relative to any security policies, but you cannot relax them.

    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/search.html b/ImageMagick-6.9.12-44/www/search.html new file mode 100644 index 0000000..6b31b9a --- /dev/null +++ b/ImageMagick-6.9.12-44/www/search.html @@ -0,0 +1,157 @@ + + + + + + + + + + ImageMagick (legacy) – Search + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    +
    + + ImageMagick Search + + + + + + + + + + + + + +
    + + + + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/security-policy.html b/ImageMagick-6.9.12-44/www/security-policy.html new file mode 100644 index 0000000..c3f4f4f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/security-policy.html @@ -0,0 +1,294 @@ + + + + + + + + + + ImageMagick (legacy) – Security Policy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Security Policy

    +

    Security Policy Pixel Cache Synchronize PolicyZero Configuration Security PolicyOther Security Considerations

    + +

    ImageMagick reocmmended practices strongly encourage you to configure a security policy that suits your local environment. The policy is open by default. This affords maximum utility for ImageMagick installations that run in a sandboxed environment, perhaps in a Docker instance, or behind a firewall where security risks are greatly diminished as opposed to a public website.

    + +

    Security is a trade-off between a secure environment and convenience. If you want ImageMagick to be optimally secure, you could, for example, limit ImageMagick to only read or write web safe images (e.g. GIF, JPEG, PNG). However, ImageMagick provides for a more secure option by adjusting the security policy per the requirements of your local environment or organizational policies. The security policy covers areas such as memory, which paths to read or write, how many images are permitted in an image sequence, how long a workflow can run, how much disk the image pixels can consume, a secret passphrase for remote connections, which coders are permitted or denied, and others. These policies should provide robust coverage to not only secure your environment per your requirements but also ensure ImageMagick remains a good citizen (e.g. prevent thrashing with large images) in your local environment.

    + +

    As an example, suppose you download an image from the internet and unbeknownst to you its been crafted to generate a 20000 by 20000 pixel image. ImageMagick attempts to allocate enough resources (memory, disk) and your system will likely deny the resource request and exit. However, its also possible that your computer might be temporarily sluggish or unavailable or ImageMagick may abort. To prevent such a scenario, you can set limits in the policy.xml configuration file. You might wonder why ImageMagick does not already include reasonable limits? Simply because what is reasonable in your environment, might not be reasonable to someone else. For example, you may have ImageMagick sandboxed where security is not a concern, whereas another user may use ImageMagick to process images on their publically accessible website. Or ImageMagick is runs on a host with 1TB of memory whereas another ImageMagick instance runs on a tablet. By policy, permitting giga-pixel image processing on the large memory host makes sense, not so much for the resource constrained tablet. If you utilize ImageMagick from a public website, you may want to increase security by preventing usage of the MVG or HTTPS coders. Only you can decide what are reasonable limits taking in consideration your environment. We provide this policy with reasonable limits and encourage you to modify it to suit your local environment:

    + +
    <policymap>
    +  <!-- temporary path must be a preexisting writable directory -->
    +  <policy domain="resource" name="temporary-path" value="/data/magick"/>
    +  <policy domain="resource" name="memory" value="256MiB"/>
    +  <policy domain="resource" name="list-length" value="32"/>
    +  <policy domain="resource" name="width" value="8KP"/>
    +  <policy domain="resource" name="height" value="8KP"/>
    +  <policy domain="resource" name="map" value="512MiB"/>
    +  <policy domain="resource" name="area" value="16KP"/>
    +  <policy domain="resource" name="disk" value="1GiB"/>
    +  <policy domain="resource" name="file" value="768"/>
    +  <policy domain="resource" name="thread" value="2"/>
    +  <policy domain="resource" name="time" value="120"/>
    +  <policy domain="filter" rights="none" pattern="*" />
    +  <policy domain="path" rights="none" pattern="@*"/>  <!-- indirect reads not permitted -->
    +  <policy domain="module" rights="none" pattern="URL" />
    +  <policy domain="coder" rights="write" pattern="{MSVG,MVG,PS,PDF,XPS}" />
    +  <policy domain="cache" name="memory-map" value="anonymous"/>
    +  <policy domain="cache" name="synchronize" value="true"/>
    +  <policy domain="cache" name="shared-secret" value="passphrase" stealth="True"/>
    +  <policy domain="system" name="precision" value="6"/>
    +  <policy domain="system" name="shred" value="1"/>
    +</policymap>
    + +

    Since we process multiple simultaneous sessions, we do not want any one session consuming all the available memory. With this policy, large images are cached to disk. If the image is too large and exceeds the pixel cache disk limit, the program exits. In addition, we place a time limit to prevent any run-away processing tasks. If any one image has a width or height that exceeds 8192 pixels or if an image sequence exceeds 32 frames, an exception is thrown and processing stops. As of ImageMagick 6.9.4-6, you can prevent the use of any delegate or all delegates (set the pattern to "*"). Note, prior to these releases, use a domain of coder to prevent delegate usage (e.g. domain="coder" rights="none" pattern="HTTPS"). We prevent users from executing any image filters. The policy also prevents indirect reads. If you want to, for example, read text from a file (e.g. caption:@myCaption.txt), you'll need to disable the path policy.

    + +

    Policy patterns are case sensitive. To get expected behavior, coders and modules must be upper-case (e.g. "EPS" not "eps") or use a case-insensitive pattern such as [Pp][Nn][Gg].

    + +

    Here is what you can expect when you restrict the HTTPS coder, for example:

    + +
    $ convert ../images/wizard.png wizard.jpg
    +convert: attempt to perform an operation not allowed by the security policy `HTTPS'
    +convert: no images defined `wizard.jpg'
    + +

    As of ImageMagick version 6.9.7-9, you can conveniently deny access to all delegates and coders except for a small subset of proven web-safe image types. For example,

    + +
    <policy domain="delegate" rights="none" pattern="*" />
    +<policy domain="module" rights="none" pattern="*" />
    +<policy domain="module" rights="read | write" pattern="{GIF,JPEG,PNG,WEBP}" />
    +

    The module policy enables or disables a complete module for both read or write. To just read or write an image format, use the `coder` policy instead. For example, we disable reading just a few Postscript related formats, you can still write them:

    +
    <policy domain="coder" rights="write" pattern="{PDF,PS,PS2,PS3,XPS}" />
    + +

    As of ImageMagick 6.9.9-11, you can allocate the pixel cache and some internal buffers with anonymous memory mapping rather than from heap. As a consequence, the pixels are initialized to zero resulting in a minor performance penalty. You can also securely delete any temporary files for increased security. The value is the number of times to shred (replace its content with random data) before deleting a temporary file. For example,

    +
    <policy domain="system" name="memory-map" value="anonymous"/>
    +<policy domain="cache" name="memory-map" value="anonymous"/>
    +<policy domain="system" name="shred" value="1"/>
    + +

    Some image processing algorithms (e.g. wavelet transform) might consume a substantial amount of memory to complete. ImageMagick maintains a separate memory pool for these large resource requests and as of 6.9.9-0 permits you to set a maximum request limit. If the limit is exceeded, the allocation is instead memory-mapped on disk. Here we limit the maximum memory request by policy:

    +
    <policy domain="system" name="max-memory-request" value="256MiB"/> 
    + +

    As of ImageMagick version 6.9.9-35, you can limit the maximum number of images in a sequence. For example, to limit an image sequence to at most 64 frames, use:

    +
    <policy domain="resource" name="list-length" value="64"/>
    + +

    For additional details about resource limits and the policy configuration file, read Resources and Architecture.

    + +

    As of ImageMagick 6.9.8-10, you can programmatically set the ImageMagick security policy with SetMagickSecurityPolicy() (MagickCore) or MagickSetSecurityPolicy() (MagickWand).

    + +

    As of ImageMagick version 6.9.10-11, you can set a module security policy. For example, to prevent Postscript or PDF interpretation, use:

    +
    <policy domain="module" rights="none" pattern="{ps,pdf,xps}/>
    + +

    As of ImageMagick version 6.9-10-52, you can set a font policy. Specify a path to a Unicode font that ImageMagick defaults to whenever the user does not specify a font preference:

    +
    <policy domain="system" name="font" value="/usr/share/fonts/arial-unicode.ttf"/>
    + +

    You can verify your policy changes are in effect with this command:

    + +
    -> identify -list policy
    +Path: ImageMagick-6/policy.xml
    +  Policy: Resource
    +    name: list-length
    +    value: 32
    +  Policy: Resource
    +    name: time
    +    value: 120
    +  Policy: Resource
    +    name: thread
    +    value: 2
    +  Policy: Resource
    +    name: file
    +    value: 768
    +  Policy: Resource
    +    name: disk
    +    value: 1GiB
    +  Policy: Resource
    +    name: map
    +    value: 512MiB
    +  Policy: Resource
    +    name: memory
    +    value: 256MiB
    +  Policy: Resource
    +    name: area
    +    value: 16KP
    +  Policy: Resource
    +    name: height
    +    value: 8KP
    +  Policy: Resource
    +    name: width
    +    value: 8KP
    +  Policy: Resource
    +    name: temporary-path
    +    value: /opt/tmp
    +  Policy: System
    +    name: precision
    +    value: 6
    +  Policy: Cache
    +    name: memory-map
    +    value: anonymous
    +  Policy: Cache
    +    name: synchronize
    +    value: true
    +  Policy: Coder
    +    rights: Write 
    +    pattern: {HTTP,HTTPS,MVG,PS,EPS,PDF,XPS}
    +  Policy: Filter
    +    rights: None 
    +    pattern: *
    +  Policy: Path
    +    rights: None 
    +    pattern: @*
    +  Policy: System
    +    name: font
    +    value: ImageMagick-6/arial-unicode.ttf
    +
    +Path: [built-in]
    +  Policy: Undefined
    +    rights: None 
    +

    Notice the shared-secret policy is not listed due to the stealth property.

    + +

    Pixel Cache Synchronize Policy

    + +

    When writing image pixels to disk, ImageMagick firsts preallocates the disk file, which is much faster than fully populating the file with zeros. To further increase performance, we memory-map the file on disk. With memory-mapping, we get an increase in performance (up to 5x), however, there remains a possibility that as the disk file is populated, it may run out of free space. The OS then throws a SIGBUS signal which prevents ImageMagick from continuing. To prevent a SIGBUS, use this security policy: + +

    +<policy domain="cache" name="synchronize" value="True"/>
    +
    + +

    Set to True to ensure all image data is fully flushed and synchronized to disk. There is a performance penalty, however, the benefits include ensuring a valid image file in the event of a system crash and early reporting if there is not enough disk space for the image pixel cache.

    + +

    Zero Configuration Security Policy

    + +

    A zero configuration build of ImageMagick does not permit external configurat +ion files. To define your security policy, you must instead edit the magick/policy-private.h source module, add your policy statements, and then build the ImageMagick distribution. Here is an example zero configuration security policy:

    + +
    static const char
    +  *ZeroConfigurationPolicy = \
    +"<policymap> \
    +  <policy domain=\"coder\" rights=\"none\" pattern=\"MVG\"/> \
    +</policymap>";
    + +

    Other Security Considerations

    + +

    If you spot a security flaw in ImageMagick, post your concern as an issue to +GitHub. Be sure to include how to reproduce the security flaw and a link to any images needed to reproduce the flaw. Alternatively, contact us and select Security Issue as the issue.

    + +

    In addition to the security policy, you can make ImageMagick safer by ...

    +
      +
    • keeping ImageMagick up-to-date. The latest releases have fixes for any security flaws we discovered in the past;
    • +
    • sanitizing any filenames or command line options you pass to ImageMagick;
    • +
    • running ImageMagick in a sanitized software container such as Docker;
    • +
    • running ImageMagick as the least-privileged user (e.g. 'nobody');
    • +
    • explicitly setting the image file type. For example, use the filename png:image.png rather than image.png. Without an explicit image type in the filename, ImageMagick guesses the image type.
    • +
    • do not create temporary files in shared directories, instead specify a private area to store only ImageMagick temporary files by setting the temporary-path security policy or the -define registry:temporary-path=/data/magick command-line option.
    • +
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/sitemap.html b/ImageMagick-6.9.12-44/www/sitemap.html new file mode 100644 index 0000000..df05e93 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/sitemap.html @@ -0,0 +1,279 @@ + + + + + + + + + + ImageMagick (legacy) – Sitemap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Sitemap

    +

    OverviewDownload ImageMagickInstall ImageMagickCommand-line ToolsProgram InterfacesImage FormatsGetting HelpSupport ImageMagickMiscellaneous Topics

    + +

    Use this ImageMagick sitemap to quickly jump to one of the areas of interest listed below. If you can't find what you want on this page, try our site search.

    + +

    Overview

    + +
    +
  6586. Introduction: convert, edit, or compose images from the command-line or program interface.
  6587. +
  6588. Examples of ImageMagick usage: a few examples that show what you can do with an image using ImageMagick.
  6589. +
  6590. Anthony Thyssen's examples of ImageMagick usage: a comprehensive tutorial of using ImageMagick from the command line.
  6591. +
  6592. Color names: how to specify a color name, a hex color, or a numerical RGB, RGBA, HSL, HSLA, CMYK, or CMYKA color.
  6593. +
  6594. Color management: accurate color management with color profiles or in lieu of-- built-in gamma compression or expansion as demanded by the colorspace.
  6595. +
  6596. Resources: ImageMagick depends on external resources including configuration files, loadable modules, fonts, and environment variables.
  6597. +
  6598. Parallel execution: ImageMagick is threaded to take advantage of speed-ups offered by the multicore processor chips.
  6599. +
  6600. Security policy: best practices strongly encourage you to configure a security policy that suits your local environment.
  6601. +
  6602. Architecture: get to know more about the software and algorithms behind ImageMagick.
  6603. +
  6604. License: the legally binding and authoritative terms and conditions for use, reproduction, and distribution of ImageMagick.
  6605. +
  6606. Export classification: export control status of ImageMagick.
  6607. +
  6608. ImageMagick version 7: ImageMagick version 7 is in development, learn how it differs from previous versions.
  6609. +
  6610. History: how ImageMagick was conceived and developed.
  6611. +
    + +

    Download ImageMagick

    + +
    +
  6612. Download ImageMagick: ImageMagick source and binary distributions are available from a variety of FTP and Web mirrors.
  6613. +
  6614. +
  6615. Linux source: Linux source distributions.
  6616. +
  6617. Windows source: Windows source distributions.
  6618. +
  6619. Linux and Windows binaries: Linux and Windows binary distributions.
  6620. +
  6621. Git repository: stable and development source releases.
  6622. +
  6623. Delegate libraries: ImageMagick depends on a number of optional delegate libraries to extend its functionality.
  6624. +
  6625. +
    + +

    Install ImageMagick

    + +

    You can install ImageMagick from source. However, if you don't have a proper development environment or if you're anxious to get started, download a ready-to-run Linux or Windows executable.

    +
    +
  6626. Install from source: ImageMagick builds under Windows, Mac OS X, and Linux.
  6627. +
  6628. Install from a binary distribution: install a ready-to-run Linux or Windows executable.
  6629. +
    + +

    Command-line Tools

    +
    +
  6630. Command-line tools: overview of the ImageMagick commands. +
      +
    • animate: animates an image sequence on any X server.
    • +
    • compare: mathematically and visually annotate the difference between an image and its reconstruction.
    • +
    • composite: overlaps one image over another.
    • +
    • conjure: interprets and executes scripts written in the Magick Scripting Language (MSL).
    • +
    • convert: convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and more.
    • +
    • display: displays an image or image sequence on any X server.
    • +
    • identify: describes the format and characteristics of one or more image files.
    • +
    • import: saves any visible window on an X server and outputs it as an image file.
    • +
    • mogrify: resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and more.
    • +
    • montage: create a composite image by combining several separate images.
    • +
    • stream: a lightweight tool to stream one or more pixel components of the image or portion of the image to your choice of storage formats.
    • +
  6631. +
  6632. Command line processing: the anatomy of the command line.
  6633. +
  6634. Command line options: annotated list of all options that can appear on the command-line.
  6635. +
  6636. Fx: apply a mathematical expression to an image or image channels.
  6637. +
  6638. Fred's ImageMagick Scripts: a plethora of command-line scripts that perform geometric transforms, blurs, sharpens, edging, noise removal, and color manipulations.
  6639. +
    + +

    Program Interfaces

    + +
    +
  6640. Program interfaces: application programming interfaces. +
      +
    • CL-Magick: provides a Common Lisp interface to the ImageMagick library.
    • +
    • Magick.NT: Use Magick.NET to convert, compose, and edit images from Windows .NET.
    • +
    • Magick++: provides an object-oriented C++ interface to ImageMagick.
    • +
    • IMagick: is a native PHP extension to create and modify images using the ImageMagick API.
    • +
    • JMagick: provides an object-oriented Java interface to ImageMagick.
    • +
    • MagickCore: C API, recommended for wizard-level developers.
    • +
    • MagickWand: convert, compose, and edit images from the C language.
    • +
    • nMagick: is a port of the ImageMagick library to the haXe and Neko platforms.
    • +
    • PascalMagick: a Pascal binding for the MagickWand API and also the low-level MagickCore library.
    • +
    • PerlMagick: convert, compose, and edit images from the Perl language.
    • +
    • PythonMagick: an object-oriented Python interface to ImageMagick.
    • +
    • RMagick: is an interface between the Ruby programming language and ImageMagick.
    • +
    • TclMagick: a native Tcl-extension to the ImageMagick MagickWand API.
    • +
  6641. +
    + +

    Image Formats

    +
    +
  6642. Supported image formats: annotated list of all image formats that ImageMagick can read and/or write.
  6643. +
  6644. Motion picture digital images: use SMPTE DPX Version 2.0 to process images used by the motion picture (film and high-definition) industry.
  6645. +
  6646. High dynamic-range images: accurately represent the wide range of intensity levels found in real scenes ranging from the brightest direct sunlight to the deepest darkest shadows.
  6647. +
  6648. Magick Vector Graphics: a modularized language for describing two-dimensional vector and mixed vector/raster graphics in ImageMagick.
  6649. +
  6650. Magick Image File Format: MIFF is ImageMagick's own platform-independent format for storing bitmap images.
  6651. +
    + +

    Getting Help

    + +
    +
  6652. Definitive Guide to ImageMagick: this book explains ImageMagick in a practical, learn-by-example fashion.
  6653. +
  6654. ImageMagick Tricks: this book is packed with examples of photo manipulations, logo creation, animations, and complete web projects.
  6655. +
  6656. Discussions service: get help from fellow ImageMagick users and developers, post to these forums.
  6657. +
  6658. Contact the Wizards: for bug reports (only if you do not want to sign up to the discussions service), a source or documentation patch, a security or license issue, or if you want to be a sponsor of the ImageMagick project.
  6659. +
    + +

    Support ImageMagick

    + +
    +
  6660. Report bugs and vulnerabilities: our highest priority is to fix security defects and bug reports, usually within 48 hours of your report. The bug discourse server requires that you register. If you do not want to register, you can contact the ImageMagick developers with a convenient web form.
  6661. +
  6662. Sponsor ImageMagick: contribute bug fixes, enhancements, hardware, funds, etc. to ensure the ImageMagick project thrives.
  6663. +
    + +

    Miscellaneous Topics

    + +
    +
    +
  6664. Animation: create a GIF animation sequence from a group of images.
  6665. +
  6666. Canny edge detection: extract edges from an image using the Canny technique.
  6667. +
  6668. Color management: accurate color management with color profiles or in lieu of-- built-in gamma compression or expansion as demanded by the colorspace.
  6669. +
  6670. Command-line processing: utilize ImageMagick from the command line.
  6671. +
  6672. Composite: overlap one image over another.
  6673. +
  6674. Connected component labeling: uniquely label connected regions in an image.
  6675. +
  6676. Decorate: add a border or frame to an image.
  6677. +
  6678. Discrete Fourier transform: implements the forward and inverse DFT.
  6679. +
  6680. Distributed pixel cache: offload intermediate pixel storage to one or more remote servers .
  6681. +
  6682. Draw: add shapes or text to an image.
  6683. +
  6684. Encipher or decipher an image: convert ordinary images into unintelddgible gibberish and back again.
  6685. +
  6686. Escapes: utilize percent escapes in a number of options, for example in -format or in montage -label, to print various properties and other settings associated with an + image.
  6687. +
  6688. Format conversion: convert an image from one format to another (e.g. PNG to JPEG).
  6689. +
  6690. Generalized pixel distortion: correct for, or induce image distortions including perspective.
  6691. +
  6692. Heterogeneous distributed processing: certain algorithms are OpenCL-enabled to take advantage of speed-ups offered by executing in concert across heterogeneous platforms consisting of CPUs, GPUs, and other processors.
  6693. +
  6694. High dynamic-range images: accurately represent the wide range of intensity levels found in real scenes ranging from the brightest direct sunlight to the deepest darkest shadows.
  6695. +
  6696. Hough lines: fit straight lines to edges in an image using the Hough transform technique.
  6697. +
  6698. Image calculator: apply a mathematical expression to an image or image channels.
  6699. +
  6700. Image gradients: create a gradual blend of two colors whose shape is horizontal, vertical, circular, or elliptical.
  6701. +
  6702. Image identification: describe the format and attributes of an image.
  6703. +
  6704. ImageMagick on the iPhone: convert, edit, or compose images on your iPhone.
  6705. +
  6706. Kuwahara filter: apply an edge perserving noise and color reduction filter to an image.
  6707. +
  6708. Large image support: read, process, or write mega-, giga-, or tera-pixel image sizes.
  6709. +
  6710. Mean-shift: apply a color reduction technique to an image.
  6711. +
  6712. Montage: juxtapose image thumbnails on an image canvas.
  6713. +
  6714. Morphology of shapes: extract features, describe shapes and recognize patterns in images.
  6715. +
  6716. Motion picture support: read and write the common image formats used in digital film work.
  6717. +
  6718. Special effects: blur, sharpen, threshold, or tint an image.
  6719. +
  6720. Text & comments: insert descriptive or artistic text in an image.
  6721. +
  6722. Threads of execution support: ImageMagick is thread safe and most internal algorithms execute in parallel to take advantage of speed-ups offered by multicore processor chips.
  6723. +
  6724. Transform: resize, rotate, crop, or trim an image.
  6725. +
  6726. Transparency: render portions of an image invisible.
  6727. +
  6728. Virtual pixel support: convenient access to pixels outside the image region.
  6729. +
    +
    +

    ImageMagick Next Generation

    +

    We have a next generation release of ImageMagick, version 7, at https://imagemagick.org

    +
    + +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/analyze.c b/ImageMagick-6.9.12-44/www/source/analyze.c new file mode 100644 index 0000000..25f17c1 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/analyze.c @@ -0,0 +1,237 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% AAA N N AAA L Y Y ZZZZZ EEEEE % +% A A NN N A A L Y Y ZZ E % +% AAAAA N N N AAAAA L Y ZZZ EEE % +% A A N NN A A L Y ZZ E % +% A A N N A A LLLLL Y ZZZZZ EEEEE % +% % +% Analyze An Image % +% % +% Software Design % +% Bill Corbis % +% December 1998 % +% % +% % +% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% https://imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +*/ + +/* + Include declarations. +*/ +#include +#include +#include +#include +#include +#include +#include "magick/MagickCore.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% a n a l y z e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% analyzeImage() computes the brightness and saturation mean, standard +% deviation, kurtosis and skewness and stores these values as attributes +% of the image. +% +% The format of the analyzeImage method is: +% +% size_t analyzeImage(Image *images,const int argc, +% char **argv,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the address of a structure of type Image. +% +% o argc: Specifies a pointer to an integer describing the number of +% elements in the argument vector. +% +% o argv: Specifies a pointer to a text array containing the command line +% arguments. +% +% o exception: return any errors or warnings in this structure. +% +*/ +ModuleExport size_t analyzeImage(Image **images,const int argc, + const char **argv,ExceptionInfo *exception) +{ + char + text[MaxTextExtent]; + + double + area, + brightness, + brightness_mean, + brightness_standard_deviation, + brightness_kurtosis, + brightness_skewness, + brightness_sum_x, + brightness_sum_x2, + brightness_sum_x3, + brightness_sum_x4, + hue, + saturation, + saturation_mean, + saturation_standard_deviation, + saturation_kurtosis, + saturation_skewness, + saturation_sum_x, + saturation_sum_x2, + saturation_sum_x3, + saturation_sum_x4; + + Image + *image; + + assert(images != (Image **) NULL); + assert(*images != (Image *) NULL); + assert((*images)->signature == MagickCoreSignature); + (void) argc; + (void) argv; + image=(*images); + for ( ; image != (Image *) NULL; image=GetNextImageInList(image)) + { + CacheView + *image_view; + + MagickBooleanType + status; + + ssize_t + y; + + brightness_sum_x=0.0; + brightness_sum_x2=0.0; + brightness_sum_x3=0.0; + brightness_sum_x4=0.0; + brightness_mean=0.0; + brightness_standard_deviation=0.0; + brightness_kurtosis=0.0; + brightness_skewness=0.0; + saturation_sum_x=0.0; + saturation_sum_x2=0.0; + saturation_sum_x3=0.0; + saturation_sum_x4=0.0; + saturation_mean=0.0; + saturation_standard_deviation=0.0; + saturation_kurtosis=0.0; + saturation_skewness=0.0; + area=0.0; + status=MagickTrue; + image_view=AcquireCacheView(image); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(dynamic,4) shared(status) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + register const PixelPacket + *p; + + register ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + ConvertRGBToHSB(GetPixelRed(p),GetPixelGreen(p), + GetPixelBlue(p),&hue,&saturation,&brightness); + brightness*=QuantumRange; + brightness_sum_x+=brightness; + brightness_sum_x2+=brightness*brightness; + brightness_sum_x3+=brightness*brightness*brightness; + brightness_sum_x4+=brightness*brightness*brightness*brightness; + saturation*=QuantumRange; + saturation_sum_x+=saturation; + saturation_sum_x2+=saturation*saturation; + saturation_sum_x3+=saturation*saturation*saturation; + saturation_sum_x4+=saturation*saturation*saturation*saturation; + area++; + p++; + } + } + image_view=DestroyCacheView(image_view); + if (area <= 0.0) + break; + brightness_mean=brightness_sum_x/area; + (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_mean); + (void) SetImageProperty(image,"filter:brightness:mean",text); + brightness_standard_deviation=sqrt(brightness_sum_x2/area-(brightness_sum_x/ + area*brightness_sum_x/area)); + (void) FormatMagickString(text,MaxTextExtent,"%g", + brightness_standard_deviation); + (void) SetImageProperty(image,"filter:brightness:standard-deviation",text); + if (brightness_standard_deviation != 0) + brightness_kurtosis=(brightness_sum_x4/area-4.0*brightness_mean* + brightness_sum_x3/area+6.0*brightness_mean*brightness_mean* + brightness_sum_x2/area-3.0*brightness_mean*brightness_mean* + brightness_mean*brightness_mean)/(brightness_standard_deviation* + brightness_standard_deviation*brightness_standard_deviation* + brightness_standard_deviation)-3.0; + (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_kurtosis); + (void) SetImageProperty(image,"filter:brightness:kurtosis",text); + if (brightness_standard_deviation != 0) + brightness_skewness=(brightness_sum_x3/area-3.0*brightness_mean* + brightness_sum_x2/area+2.0*brightness_mean*brightness_mean* + brightness_mean)/(brightness_standard_deviation* + brightness_standard_deviation*brightness_standard_deviation); + (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_skewness); + (void) SetImageProperty(image,"filter:brightness:skewness",text); + saturation_mean=saturation_sum_x/area; + (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_mean); + (void) SetImageProperty(image,"filter:saturation:mean",text); + saturation_standard_deviation=sqrt(saturation_sum_x2/area-(saturation_sum_x/ + area*saturation_sum_x/area)); + (void) FormatMagickString(text,MaxTextExtent,"%g", + saturation_standard_deviation); + (void) SetImageProperty(image,"filter:saturation:standard-deviation",text); + if (saturation_standard_deviation != 0) + saturation_kurtosis=(saturation_sum_x4/area-4.0*saturation_mean* + saturation_sum_x3/area+6.0*saturation_mean*saturation_mean* + saturation_sum_x2/area-3.0*saturation_mean*saturation_mean* + saturation_mean*saturation_mean)/(saturation_standard_deviation* + saturation_standard_deviation*saturation_standard_deviation* + saturation_standard_deviation)-3.0; + (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_kurtosis); + (void) SetImageProperty(image,"filter:saturation:kurtosis",text); + if (saturation_standard_deviation != 0) + saturation_skewness=(saturation_sum_x3/area-3.0*saturation_mean* + saturation_sum_x2/area+2.0*saturation_mean*saturation_mean* + saturation_mean)/(saturation_standard_deviation* + saturation_standard_deviation*saturation_standard_deviation); + (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_skewness); + (void) SetImageProperty(image,"filter:saturation:skewness",text); + } + return(MagickImageFilterSignature); +} diff --git a/ImageMagick-6.9.12-44/www/source/coder.xml b/ImageMagick-6.9.12-44/www/source/coder.xml new file mode 100644 index 0000000..4d2394f --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/coder.xml @@ -0,0 +1,23 @@ + + + + + +]> + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/colors.xml b/ImageMagick-6.9.12-44/www/source/colors.xml new file mode 100644 index 0000000..55bfb5d --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/colors.xml @@ -0,0 +1,28 @@ + + + + + + +]> + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/configure.xml b/ImageMagick-6.9.12-44/www/source/configure.xml new file mode 100644 index 0000000..f816123 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/configure.xml @@ -0,0 +1,50 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/contrast.c b/ImageMagick-6.9.12-44/www/source/contrast.c new file mode 100644 index 0000000..c7c2043 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/contrast.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include + +int main(int argc,char **argv) +{ +#define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange) +#define SigmoidalContrast(x) \ + (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503) +#define ThrowWandException(wand) \ +{ \ + char \ + *description; \ + \ + ExceptionType \ + severity; \ + \ + description=MagickGetException(wand,&severity); \ + (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \ + description=(char *) MagickRelinquishMemory(description); \ + exit(-1); \ +} + + MagickBooleanType + status; + + MagickPixelPacket + pixel; + + MagickWand + *contrast_wand, + *image_wand; + + PixelIterator + *contrast_iterator, + *iterator; + + PixelWand + **contrast_pixels, + **pixels; + + register ssize_t + x; + + size_t + width; + + ssize_t + y; + + if (argc != 3) + { + (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]); + exit(0); + } + /* + Read an image. + */ + MagickWandGenesis(); + image_wand=NewMagickWand(); + status=MagickReadImage(image_wand,argv[1]); + if (status == MagickFalse) + ThrowWandException(image_wand); + contrast_wand=CloneMagickWand(image_wand); + /* + Sigmoidal non-linearity contrast control. + */ + iterator=NewPixelIterator(image_wand); + contrast_iterator=NewPixelIterator(contrast_wand); + if ((iterator == (PixelIterator *) NULL) || + (contrast_iterator == (PixelIterator *) NULL)) + ThrowWandException(image_wand); + for (y=0; y < (ssize_t) MagickGetImageHeight(image_wand); y++) + { + pixels=PixelGetNextIteratorRow(iterator,&width); + contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&width); + if ((pixels == (PixelWand **) NULL) || + (contrast_pixels == (PixelWand **) NULL)) + break; + for (x=0; x < (ssize_t) width; x++) + { + PixelGetMagickColor(pixels[x],&pixel); + pixel.red=SigmoidalContrast(pixel.red); + pixel.green=SigmoidalContrast(pixel.green); + pixel.blue=SigmoidalContrast(pixel.blue); + pixel.index=SigmoidalContrast(pixel.index); + PixelSetMagickColor(contrast_pixels[x],&pixel); + } + (void) PixelSyncIterator(contrast_iterator); + } + if (y < (ssize_t) MagickGetImageHeight(image_wand)) + ThrowWandException(image_wand); + contrast_iterator=DestroyPixelIterator(contrast_iterator); + iterator=DestroyPixelIterator(iterator); + image_wand=DestroyMagickWand(image_wand); + /* + Write the image then destroy it. + */ + status=MagickWriteImages(contrast_wand,argv[2],MagickTrue); + if (status == MagickFalse) + ThrowWandException(image_wand); + contrast_wand=DestroyMagickWand(contrast_wand); + MagickWandTerminus(); + return(0); +} diff --git a/ImageMagick-6.9.12-44/www/source/core.c b/ImageMagick-6.9.12-44/www/source/core.c new file mode 100644 index 0000000..2d1803a --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/core.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include + +int main(int argc,char **argv) +{ + ExceptionInfo + *exception; + + Image + *image, + *images, + *resize_image, + *thumbnails; + + ImageInfo + *image_info; + + if (argc != 3) + { + (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]); + exit(0); + } + /* + Initialize the image info structure and read an image. + */ + MagickCoreGenesis(*argv,MagickTrue); + exception=AcquireExceptionInfo(); + image_info=CloneImageInfo((ImageInfo *) NULL); + (void) strcpy(image_info->filename,argv[1]); + images=ReadImage(image_info,exception); + if (exception->severity != UndefinedException) + CatchException(exception); + if (images == (Image *) NULL) + exit(1); + /* + Convert the image to a thumbnail. + */ + thumbnails=NewImageList(); + while ((image=RemoveFirstImageFromList(&images)) != (Image *) NULL) + { + resize_image=ResizeImage(image,106,80,LanczosFilter,1.0,exception); + if (resize_image == (Image *) NULL) + MagickError(exception->severity,exception->reason,exception->description); + (void) AppendImageToList(&thumbnails,resize_image); + DestroyImage(image); + } + /* + Write the image thumbnail. + */ + (void) strcpy(thumbnails->filename,argv[2]); + WriteImage(image_info,thumbnails); + /* + Destroy the image thumbnail and exit. + */ + thumbnails=DestroyImageList(thumbnails); + image_info=DestroyImageInfo(image_info); + exception=DestroyExceptionInfo(exception); + MagickCoreTerminus(); + return(0); +} diff --git a/ImageMagick-6.9.12-44/www/source/core/sigmoidal-contrast.c b/ImageMagick-6.9.12-44/www/source/core/sigmoidal-contrast.c new file mode 100644 index 0000000..cc33070 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/core/sigmoidal-contrast.c @@ -0,0 +1,116 @@ +#include +#include +#include +#include + +static MagickBooleanType SigmoidalContrast(ImageView *contrast_view, + const ssize_t y,const int id,void *context) +{ +#define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange) +#define SigmoidalContrast(x) \ + (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503) + + RectangleInfo + extent; + + register IndexPacket + *indexes; + + register PixelPacket + *pixels; + + register ssize_t + x; + + extent=GetImageViewExtent(contrast_view); + pixels=GetImageViewAuthenticPixels(contrast_view); + for (x=0; x < (ssize_t) (extent.width-extent.height); x++) + { + pixels[x].red=RoundToQuantum(SigmoidalContrast(pixels[x].red)); + pixels[x].green=RoundToQuantum(SigmoidalContrast(pixels[x].green)); + pixels[x].blue=RoundToQuantum(SigmoidalContrast(pixels[x].blue)); + pixels[x].opacity=RoundToQuantum(SigmoidalContrast(pixels[x].opacity)); + } + indexes=GetImageViewAuthenticIndexes(contrast_view); + if (indexes != (IndexPacket *) NULL) + for (x=0; x < (ssize_t) (extent.width-extent.height); x++) + indexes[x]=(IndexPacket) RoundToQuantum(SigmoidalContrast(indexes[x])); + return(MagickTrue); +} + +int main(int argc,char **argv) +{ +#define ThrowImageException(image) \ +{ \ + \ + CatchException(exception); \ + if (contrast_image != (Image *) NULL) \ + contrast_image=DestroyImage(contrast_image); \ + exit(-1); \ +} +#define ThrowViewException(view) \ +{ \ + char \ + *description; \ + \ + ExceptionType \ + severity; \ + \ + description=GetImageViewException(view,&severity); \ + (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \ + description=(char *) MagickRelinquishMemory(description); \ + exit(-1); \ +} + + ExceptionInfo + *exception; + + Image + *contrast_image; + + ImageInfo + *image_info; + + ImageView + *contrast_view; + + MagickBooleanType + status; + + if (argc != 3) + { + (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]); + exit(0); + } + /* + Read an image. + */ + MagickCoreGenesis(*argv,MagickTrue); + image_info=AcquireImageInfo(); + (void) CopyMagickString(image_info->filename,argv[1],MaxTextExtent); + exception=AcquireExceptionInfo(); + contrast_image=ReadImage(image_info,exception); + if (contrast_image == (Image *) NULL) + ThrowImageException(contrast_image); + /* + Sigmoidal non-linearity contrast control. + */ + contrast_view=NewImageView(contrast_image); + if (contrast_view == (ImageView *) NULL) + ThrowImageException(contrast_image); + status=UpdateImageViewIterator(contrast_view,SigmoidalContrast,(void *) NULL); + if (status == MagickFalse) + ThrowImageException(contrast_image); + contrast_view=DestroyImageView(contrast_view); + /* + Write the image then destroy it. + */ + status=WriteImages(image_info,contrast_image,argv[2],exception); + if (status == MagickFalse) + ThrowImageException(contrast_image); + contrast_image=DestroyImage(contrast_image); + exception=DestroyExceptionInfo(exception); + image_info=DestroyImageInfo(image_info); + MagickCoreTerminus(); + return(0); +} diff --git a/ImageMagick-6.9.12-44/www/source/delegates.xml b/ImageMagick-6.9.12-44/www/source/delegates.xml new file mode 100644 index 0000000..f37aaf8 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/delegates.xml @@ -0,0 +1,122 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/english.xml b/ImageMagick-6.9.12-44/www/source/english.xml new file mode 100644 index 0000000..dbaa11d --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/english.xml @@ -0,0 +1,1682 @@ + + + + + + + + + +]> + + + + + + unable to open image + + + unable to open file + + + unable to read blob + + + unable to write blob + + + unrecognized image format + + + zero-length blob not permitted + + + + + + + cache resources exhausted + + + incompatible API + + + no pixels defined in cache + + + pixel cache is not open + + + pixels are not authentic + + + unable to clone cache + + + unable to extend cache + + + unable to get cache nexus + + + unable to open pixel cache + + + unable to persist pixel cache + + + unable to read pixel cache + + + unable to write pixel cache + + + + + unable to acquire cache view + + + unable to extend pixel cache + + + + + + + colormap type not supported + + + colorspace model is not supported + + + compression not supported + + + data encoding scheme is not supported + + + data storage type is not supported + + + delta-PNG is not supported + + + encrypted WPG image file not supported + + + fractal compression not supported + + + image column or row size is not supported + + + image does not have a clip mask + + + image does not have an alpha channel + + + image does not have a EXIF thumbnail + + + image is not tiled + + + irregular channel geometry not supported + + + JNG compression not supported + + + JPEG compression not supported + + + JPEG embedding failed + + + location type is not supported + + + map storage type is not supported + + + multi-dimensional matrices are not supported + + + multiple record list not supported + + + no bitmap on clipboard + + + no APP1 data is available + + + no 8BIM data is available + + + no color profile is available + + + no data returned + + + no image vector graphics; unable to generate SVG + + + no IPTC profile available + + + number of images is not supported + + + only continuous tone picture supported + + + only level zero files Supported + + + PNG compression not supported + + + RLE compression not supported + + + unable to copy profile + + + unable to create bitmap + + + unable to create a DC + + + unable to decompress image + + + unable to write MPEG parameters + + + unable to zip-compress image + + + ZIP compression not supported + + + + + exif profile size exceeds limit and will be truncated + + + lossless to lossy JPEG conversion + + + + + + + include element nested too deeply + + + + + unable to access configure file + + + unable to open module file + + + + + + + + an error has occurred reading from file + + + an error has occurred writing to file + + + cipher support not enabled + + + colormap exceeded 256 colors + + + corrupt image + + + file format version mismatch + + + image depth not supported + + + image file does not contain any image data + + + image type not supported + + + improper image header + + + insufficient image data in file + + + invalid colormap index + + + invalid pixel + + + length and filesize do not match + + + maximum channels exceeded + + + missing image channel + + + negative or zero image size + + + non OS2 BMP header size less than 40 + + + not enough pixel data + + + not enough tiles found in level + + + too much image data in file + + + static planes value not equal to 1 + + + unable to read extension block + + + unable to read image header + + + unable to read image data + + + unable to runlength decode image + + + unable to uncompress image + + + unexpected end-of-file + + + unexpected sampling factor + + + unknown pattern type + + + unrecognized alpha channel option + + + unrecognized bits per pixel + + + unrecognized compression + + + unrecognized number of colors + + + + + unable to persist key + + + + + insufficient image data in file + + + length and filesize do not match + + + corrupt PCD image, skipping to sync byte + + + + + + + + delegate failed + + + failed to compute output size + + + failed to render file + + + failed to scan file + + + no tag found + + + PCL delegate failed + + + Postscript delegate failed + + + unable to create image + + + unable to decode image file + + + unable to encode image file + + + unable to initialize FPX library + + + unable to initialize WMF library + + + unable to manage JP2 stream + + + unable to read aspect ratio + + + unable to read summary info + + + unable to set affine matrix + + + unable to set aspect ratio + + + unable to set color twist + + + unable to set contrast + + + unable to set filtering value + + + unable to set image title + + + unable to set JPEG level + + + unable to set region of interest + + + unable to set summary info + + + unable to write SVG format + + + XPS delegate failed + + + + + + + already pushing pattern definition + + + non-conforming drawing primitive definition + + + not a relative URL + + + not currently pushing pattern definition + + + segment stack overflow + + + too many bezier coordinates + + + unable to print + + + unbalanced graphic context push-pop + + + URL not found + + + + + + + + an error has occurred reading from file + + + unable to create temporary file + + + unable to open file + + + unable to write file + + + + + + + + angle is discontinuous + + + colormapped image required + + + color separated image required + + + color profile operates on another colorspace + + + image depth not supported + + + image morphology differs + + + image list is required + + + image size differs + + + images too dissimilar + + + left and right image sizes differ + + + negative or zero image size + + + no images were found + + + no images were loaded + + + too many cluster + + + unable to create color transform + + + width or height exceeds limit + + + + + associate profile with image, a source and destination color profile required for transform + + + + + + + filter failed + + + + + + + + delegate library support not built-in + + + no decode delegate for this image format + + + no encode delegate for this image format + + + + + delegate library support not built-in + + + FreeType library is not available + + + LCMS color profile library is not available + + + no encode delegate for this image format + + + + + + + + image coder signature mismatch + + + image filter signature mismatch + + + unable to load module + + + unable to register image format + + + + + unable to initialize module loader + + + + + unable to close module + + + + + + + + not authorized + + + + + + + unable to get registry ID + + + unable to set registry + + + + + + + + pixel cache allocation failed + + + memory allocation failed + + + too many objects + + + unable to acquire string + + + unable to allocate colormap + + + unable to convert font + + + unable to create colormap + + + unable to dither image + + + unable to clone package info + + + unable to get package info + + + + + time limit exceeded + + + unable to allocate dash pattern + + + unable to allocate derivates + + + unable to allocate gamma map + + + unable to allocate image + + + unable to allocate image pixels + + + unable to destroy semaphore + + + unable to instantiate semaphore + + + unable to allocate string + + + Memory allocation failed + + + unable to concatenate string + + + unable to convert text + + + unable to create colormap + + + unable to clone image + + + unable to display image + + + unable to escape string + + + unable to interpret MSL image + + + unable to lock semaphore + + + unable to unlock semaphore + + + + + memory allocation failed + + + + + + + + font substitution required + + + unable to get type metrics + + + unable to initialize freetype library + + + unable to read font + + + unrecognized font encoding + + + + + unable to read font + + + + + + + image does not contain the stream geometry + + + no stream handler is defined + + + pixel cache is not open + + + + + + + invalid colormap index + + + zero region size + + + unable to open file + + + wand quantum depth does not match that of the core API + + + wand contains no images + + + wand contains no iterators + + + + + + + color is not known to server + + + no window with specified ID exists + + + standard Colormap is not initialized + + + unable to connect to remote display + + + unable to create bitmap + + + unable to create colormap + + + unable to create pixmap + + + unable to create property + + + unable to create standard colormap + + + unable to display image info + + + unable to get property + + + unable to get Standard Colormap + + + unable to get visual + + + unable to grab mouse + + + unable to load font + + + unable to match visual to Standard Colormap + + + unable to open X server + + + unable to read X window attributes + + + unable to read X window image + + + unrecognized colormap type + + + unrecognized gravity type + + + unrecognized visual specifier + + + + + unable to create X cursor + + + unable to create graphic context + + + unable to create standard colormap + + + unable to create text property + + + unable to create X window + + + unable to create X image + + + unable to create X pixmap + + + unable to display image + + + unable to get visual + + + unable to get pixel info + + + unable to load font + + + unable to make X window + + + unable to open X server + + + unable to view fonts + + + + + using default visual + + + unable to get visual + + + + + + + + add noise to image + + + + + append image sequence + + + + + assign image colors + + + + + average image sequence + + + + + chop image + + + + + classify image colors + + + + + replace color in image + + + + + colorize image + + + + + combine image + + + + + contrast-stretch image + + + + + convolve image + + + + + crop image + + + + + decode image + + + + + despeckle image + + + + + distort image + + + + + dither image colors + + + + + dull image contrast + + + + + encode image + + + + + equalize image + + + + + flip image + + + + + flop image + + + + + add frame to image + + + + + fx image + + + + + gamma correct image + + + + + compute image histogram + + + + + implode image + + + + + level image + + + + + load image + + + load images + + + + + magnfiy image + + + + + filter image with neighborhood ranking + + + + + minify image + + + + + modulate image + + + + + mogrify image + + + + + montage image + + + + + morph image sequence + + + + + mosaic image + + + + + negate image + + + + + oil paint image + + + + + set opaque color in image + + + + + plasma image + + + + + preview image + + + + + raise image + + + + + recolor color image + + + + + reduce image colors + + + + + reduce the image noise + + + + + render image + + + + + resize image + + + + + RGB transform image + + + + + roll image + + + + + rotate image + + + + + sample image + + + + + save image + + + save images + + + + + scale image + + + + + segment image + + + + + extract a channel from image + + + + + sepia-tone image + + + + + shade image + + + + + sharpen image + + + + + sharpen image contrast + + + + + sigmoidal contrast image + + + + + solarize image + + + + + splice image + + + + + spread image + + + + + stegano image + + + + + stereo image + + + + + swirl image + + + + + texture image + + + + + threshold image + + + + + tile image + + + + + tint image + + + + + transform RGB image + + + + + set transparent color in image + + + + + wave image + + + + + write image + + + + + x shear image + + + + + y shear image + + + + diff --git a/ImageMagick-6.9.12-44/www/source/examples.pl b/ImageMagick-6.9.12-44/www/source/examples.pl new file mode 100644 index 0000000..49a02c1 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/examples.pl @@ -0,0 +1,460 @@ +#!/usr/bin/perl +# +# Overall demo of the major PerlMagick methods. +# +use Image::Magick; + +# +# Read model & smile image. +# +print "Read...\n"; +$null=Image::Magick->new; +$null->Set(size=>'70x70'); +$x=$null->ReadImage('NULL:black'); +warn "$x" if "$x"; + +$model=Image::Magick->new(); +$x=$model->ReadImage('model.gif'); +warn "$x" if "$x"; +$model->Label('Magick'); +$model->Set(background=>'white'); + +$smile=Image::Magick->new; +$x=$smile->ReadImage('smile.gif'); +warn "$x" if "$x"; +$smile->Label('Smile'); +$smile->Set(background=>'white'); +# +# Create image stack. +# +print "Transform image...\n"; +$images=Image::Magick->new(); + +print "Adaptive Blur...\n"; +$example=$model->Clone(); +$example->Label('Adaptive Blur'); +$example->AdaptiveBlur('0x1'); +push(@$images,$example); + +print "Adaptive Resize...\n"; +$example=$model->Clone(); +$example->Label('Adaptive Resize'); +$example->AdaptiveResize('60%'); +push(@$images,$example); + +print "Adaptive Sharpen...\n"; +$example=$model->Clone(); +$example->Label('Adaptive Sharpen'); +$example->AdaptiveSharpen('0x1'); +push(@$images,$example); + +print "Adaptive Threshold...\n"; +$example=$model->Clone(); +$example->Label('Adaptive Threshold'); +$example->AdaptiveThreshold('5x5+5%'); +push(@$images,$example); + +print "Add Noise...\n"; +$example=$model->Clone(); +$example->Label('Add Noise'); +$example->AddNoise("Laplacian"); +push(@$images,$example); + +print "Annotate...\n"; +$example=$model->Clone(); +$example->Label('Annotate'); +$example->Annotate(text=>'Magick',geometry=>'+0+20',font=>'Generic.ttf', + fill=>'gold',gravity=>'North',pointsize=>14); +push(@$images,$example); + +print "Auto-gamma...\n"; +$example=$model->Clone(); +$example->Label('Auto Gamma'); +$example->AutoGamma(); +push(@$images,$example); + +print "Auto-level...\n"; +$example=$model->Clone(); +$example->Label('Auto Level'); +$example->AutoLevel(); +push(@$images,$example); + +print "Blur...\n"; +$example=$model->Clone(); +$example->Label('Blur'); +$example->Blur('0.0x1.0'); +push(@$images,$example); + +print "Border...\n"; +$example=$model->Clone(); +$example->Label('Border'); +$example->Border(geometry=>'6x6',color=>'gold'); +push(@$images,$example); + +print "Channel...\n"; +$example=$model->Clone(); +$example->Label('Channel'); +$example->Channel(channel=>'red'); +push(@$images,$example); + +print "Charcoal...\n"; +$example=$model->Clone(); +$example->Label('Charcoal'); +$example->Charcoal('0x1'); +push(@$images,$example); + +print "ColorMatrix...\n"; +$example=$model->Clone(); +$example->Label('ColorMatrix'); +$example->ColorMatrix([1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0.5, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]); +push(@$images,$example); + +print "Composite...\n"; +$example=$model->Clone(); +$example->Label('Composite'); +$example->Composite(image=>$smile,compose=>'over',geometry=>'+35+65'); +push(@$images,$example); + +print "Contrast...\n"; +$example=$model->Clone(); +$example->Label('Contrast'); +$example->Contrast(); +push(@$images,$example); + +print "Contrast Stretch...\n"; +$example=$model->Clone(); +$example->Label('Contrast Stretch'); +$example->ContrastStretch('5%'); +push(@$images,$example); + +print "Convolve...\n"; +$example=$model->Clone(); +$example->Label('Convolve'); +$example->Convolve([1, 1, 1, 1, 4, 1, 1, 1, 1]); +push(@$images,$example); + +print "Crop...\n"; +$example=$model->Clone(); +$example->Label('Crop'); +$example->Crop(geometry=>'80x80+25+50'); +$example->Set(page=>'0x0+0+0'); +push(@$images,$example); + +print "Despeckle...\n"; +$example=$model->Clone(); +$example->Label('Despeckle'); +$example->Despeckle(); +push(@$images,$example); + +print "Distort...\n"; +$example=$model->Clone(); +$example->Label('Distort'); +$example->Distort(method=>'arc',points=>[60],'virtual-pixel'=>'white'); +push(@$images,$example); + +print "Draw...\n"; +$example=$model->Clone(); +$example->Label('Draw'); +$example->Draw(fill=>'none',stroke=>'gold',primitive=>'circle', + points=>'60,90 60,120',strokewidth=>2); +push(@$images,$example); + +print "Detect Edges...\n"; +$example=$model->Clone(); +$example->Label('Detect Edges'); +$example->Edge(); +push(@$images,$example); + +print "Emboss...\n"; +$example=$model->Clone(); +$example->Label('Emboss'); +$example->Emboss('0x1'); +push(@$images,$example); + +print "Equalize...\n"; +$example=$model->Clone(); +$example->Label('Equalize'); +$example->Equalize(); +push(@$images,$example); + +print "Implode...\n"; +$example=$model->Clone(); +$example->Label('Explode'); +$example->Implode(-1); +push(@$images,$example); + +print "Flip...\n"; +$example=$model->Clone(); +$example->Label('Flip'); +$example->Flip(); +push(@$images,$example); + +print "Flop...\n"; +$example=$model->Clone(); +$example->Label('Flop'); +$example->Flop(); +push(@$images,$example); + +print "Frame...\n"; +$example=$model->Clone(); +$example->Label('Frame'); +$example->Frame('15x15+3+3'); +push(@$images,$example); + +print "Fx...\n"; +$example=$model->Clone(); +$example->Label('Fx'); +push(@$images,$example->Fx(expression=>'0.5*u')); + +print "Gamma...\n"; +$example=$model->Clone(); +$example->Label('Gamma'); +$example->Gamma(1.6); +push(@$images,$example); + +print "Gaussian Blur...\n"; +$example=$model->Clone(); +$example->Label('Gaussian Blur'); +$example->GaussianBlur('0.0x1.5'); +push(@$images,$example); + +print "Gradient...\n"; +$gradient=Image::Magick->new; +$gradient->Set(size=>'130x194'); +$x=$gradient->ReadImage('gradient:#20a0ff-#ffff00'); +warn "$x" if "$x"; +$gradient->Label('Gradient'); +push(@$images,$gradient); + +print "Grayscale...\n"; +$example=$model->Clone(); +$example->Label('Grayscale'); +$example->Set(type=>'grayscale'); +push(@$images,$example); + +print "Implode...\n"; +$example=$model->Clone(); +$example->Label('Implode'); +$example->Implode(0.5); +push(@$images,$example); + +print "Level...\n"; +$example=$model->Clone(); +$example->Label('Level'); +$example->Level('20%'); +push(@$images,$example); + +print "Median Filter...\n"; +$example=$model->Clone(); +$example->Label('Median Filter'); +$example->MedianFilter(); +push(@$images,$example); + +print "Modulate...\n"; +$example=$model->Clone(); +$example->Label('Modulate'); +$example->Modulate(brightness=>110,saturation=>110,hue=>110); +push(@$images,$example); +$example=$model->Clone(); + +print "Monochrome...\n"; +$example=$model->Clone(); +$example->Label('Monochrome'); +$example->Quantize(colorspace=>'gray',colors=>2,dither=>'false'); +push(@$images,$example); + +print "Morphology...\n"; +$example=$model->Clone(); +$example->Label('Morphology'); +$example->Morphology(method=>'Dilate',kernel=>'Diamond',iterations=>3); +push(@$images,$example); + +print "Motion Blur...\n"; +$example=$model->Clone(); +$example->Label('Motion Blur'); +$example->MotionBlur('0x13+10-10'); +push(@$images,$example); + +print "Negate...\n"; +$example=$model->Clone(); +$example->Label('Negate'); +$example->Negate(); +push(@$images,$example); + +print "Normalize...\n"; +$example=$model->Clone(); +$example->Label('Normalize'); +$example->Normalize(); +push(@$images,$example); + +print "Oil Paint...\n"; +$example=$model->Clone(); +$example->Label('Oil Paint'); +$example->OilPaint(); +push(@$images,$example); + +print "Plasma...\n"; +$plasma=Image::Magick->new; +$plasma->Set(size=>'130x194'); +$x=$plasma->ReadImage('plasma:fractal'); +warn "$x" if "$x"; +$plasma->Label('Plasma'); +push(@$images,$plasma); + +print "Polaroid...\n"; +$example=$model->Clone(); +$example->Label('Polaroid'); +$example->Polaroid(caption=>'Magick',rotate=>-5.0,gravity=>'center'); +push(@$images,$example); + +print "Quantize...\n"; +$example=$model->Clone(); +$example->Label('Quantize'); +$example->Quantize(); +push(@$images,$example); + +print "Radial Blur...\n"; +$example=$model->Clone(); +$example->Label('Radial Blur'); +$example->RadialBlur(10); +push(@$images,$example); + +print "Raise...\n"; +$example=$model->Clone(); +$example->Label('Raise'); +$example->Raise('10x10'); +push(@$images,$example); + +print "Reduce Noise...\n"; +$example=$model->Clone(); +$example->Label('Reduce Noise'); +$example->ReduceNoise(); +push(@$images,$example); + +print "Resize...\n"; +$example=$model->Clone(); +$example->Label('Resize'); +$example->Resize('60%'); +push(@$images,$example); + +print "Roll...\n"; +$example=$model->Clone(); +$example->Label('Roll'); +$example->Roll(geometry=>'+20+10'); +push(@$images,$example); + +print "Rotate...\n"; +$example=$model->Clone(); +$example->Label('Rotate'); +$example->Rotate(45); +push(@$images,$example); + +print "Sample...\n"; +$example=$model->Clone(); +$example->Label('Sample'); +$example->Sample('60%'); +push(@$images,$example); + +print "Scale...\n"; +$example=$model->Clone(); +$example->Label('Scale'); +$example->Scale('60%'); +push(@$images,$example); + +print "Segment...\n"; +$example=$model->Clone(); +$example->Label('Segment'); +$example->Segment(); +push(@$images,$example); + +print "Shade...\n"; +$example=$model->Clone(); +$example->Label('Shade'); +$example->Shade(geometry=>'30x30',gray=>'true'); +push(@$images,$example); + +print "Sharpen...\n"; +$example=$model->Clone(); +$example->Label('Sharpen'); +$example->Sharpen('0.0x1.0'); +push(@$images,$example); + +print "Shave...\n"; +$example=$model->Clone(); +$example->Label('Shave'); +$example->Shave('10x10'); +push(@$images,$example); + +print "Shear...\n"; +$example=$model->Clone(); +$example->Label('Shear'); +$example->Shear('-20x20'); +push(@$images,$example); + +print "Sketch...\n"; +$example=$model->Clone(); +$example->Label('Sketch'); +$example->Set(colorspace=>'Gray'); +$example->Sketch('0x20+120'); +push(@$images,$example); + +print "Sigmoidal Contrast...\n"; +$example=$model->Clone(); +$example->Label('Sigmoidal Contrast'); +$example->SigmoidalContrast("3x50%"); +push(@$images,$example); + +print "Spread...\n"; +$example=$model->Clone(); +$example->Label('Spread'); +$example->Spread(); +push(@$images,$example); + +print "Solarize...\n"; +$example=$model->Clone(); +$example->Label('Solarize'); +$example->Solarize(); +push(@$images,$example); + +print "Swirl...\n"; +$example=$model->Clone(); +$example->Label('Swirl'); +$example->Swirl(90); +push(@$images,$example); + +print "Unsharp Mask...\n"; +$example=$model->Clone(); +$example->Label('Unsharp Mask'); +$example->UnsharpMask('0.0x1.0'); +push(@$images,$example); + +print "Vignette...\n"; +$example=$model->Clone(); +$example->Label('Vignette'); +$example->Vignette('0x20'); +push(@$images,$example); + +print "Wave...\n"; +$example=$model->Clone(); +$example->Label('Wave'); +$example->Wave('25x150'); +push(@$images,$example); +# +# Create image montage. +# +print "Montage...\n"; +$montage=$images->Montage(geometry=>'128x160+8+4>',gravity=>'Center', + tile=>'5x+10+200',compose=>'over',background=>'#ffffff', + font=>'Generic.ttf',pointsize=>18,fill=>'#600',stroke=>'none', + shadow=>'true'); + +$logo=Image::Magick->new(); +$logo->Read('logo:'); +$logo->Zoom('40%'); +$montage->Composite(image=>$logo,gravity=>'North'); + +print "Write...\n"; +$montage->Set(matte=>'false'); +$montage->Write('demo.jpg'); +print "Display...\n"; +$montage->Write('win:'); diff --git a/ImageMagick-6.9.12-44/www/source/francais.xml b/ImageMagick-6.9.12-44/www/source/francais.xml new file mode 100644 index 0000000..2f7c700 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/francais.xml @@ -0,0 +1,1664 @@ + + + + + + + + + +]> + + + + + + impossible d'ouvrir l'image + + + impossible d'ouvrir le fichier + + + impossible de lire un blob + + + impossible d'écrire un blob + + + format d'image non reconnu + + + blob de taille nulle non autorisé + + + + + + + Ressources du cache épuisées + + + incompatible API + + + pas de pixels définis dans le cache + + + cache pixels non ouvert + + + pixels are not authentic + + + impossible de clôner le cache + + + impossible d'étendre le cache + + + impossible de récupérer le nexus du cache + + + impossible d'ouvrir le cache pixels + + + impossible de rendre persistant le cache pixels + + + impossible de lire le cache pixels + + + impossible d'écrire le cache pixels + + + + + échec allocation cache view + + + impossible extend le cache pixels + + + + + + + table de couleurs non supportée + + + espace colorimétrique non supporté + + + schéma d'encodage de données non supporté + + + type de stockage de données non supporté + + + delta-PNG non supporté + + + image WPG encryptée non supportée + + + compression Fractal non supportée + + + nombre de lignes ou de colonnes dans l'image non supporté + + + image sans masque de coupe + + + image sans vignette EXIF + + + l'image n'a pas de canal de transparence + + + l'image n'a pas tiled + + + irregular channel geometry not supported + + + compression JNG non supportée + + + compression JPEG non supportée + + + Échec incorporation JPEG + + + Type d'emplacement non supporté + + + Map storage type is not supported + + + Matrices multi-dimensionnelles non supportées + + + Liste à enregistrements multiples non supportée + + + pas de bitmap dans le presse-papier + + + pas de données APP1 disponibles + + + pas de données 8BIM disponibles + + + pas de profil colorimétrique disponible + + + aucune donnée fournie + + + aucune image définie + + + pas d'image en graphique vectoriel; unable to generate SVG + + + pas de profil IPTC disponible + + + nombre d'images non supporté + + + seules les images à tons continus sont supportées + + + seuls les fichiers de niveau zéro sont supportés + + + compression PNG non supportée + + + compression RLE non supportée + + + impossible de copier le profil + + + impossible de créer la bitmap + + + impossible de créer un DC + + + impossible de décompresser l'image + + + impossible d'écrire les paramètres MPEG + + + impossible de compresser l'image en zip + + + Fichier image RLE non supporté + + + compression ZIP non supportée + + + + + Conversion JPEG sans perte vers JPEG avec perte + + + + + + + trop de niveau d'inclusion d'éléments + + + + + impossible d'accéder au fichier de configuration + + + impossible d'ouvrir le fichier de module + + + + + + + + Une erreur est survenue lors de la lecture du fichier + + + Une erreur est survenue lors de l'écriture dans un fichier + + + cipher support not enabled + + + Table de couleurs a plus que 256 couleurs + + + Image corrompue + + + erreur sur la version du format de fichier + + + profondeur d'image non supportée + + + le fichier image ne contient pas de données d'image + + + type d'image non supporté + + + En-tête d'image incorrect + + + Pas assez de données d'image dans le fichier + + + Index dans la table de couleurs invalide + + + Pixel invalide + + + Longueur et taille du fichier ne correspondent pas + + + maximum de canals dépassent les + + + absence l'image canel + + + Taille d'image négative ou nulle + + + Taille en-tête BMP non-OS2 plus petite que 40 + + + Pas assez de données pixel + + + Pas assez de tuiles trouvées à ce niveau + + + Trop de données d'image dans le fichier + + + Valeur statique des plans différente de 1 + + + impossible de lire le bloc d'extension + + + impossible de lire l'en-tête de l'image + + + impossible de lire les données de l'image + + + impossible de décoder l'image avec « runlength » + + + impossible de décompresser l'image + + + fin de fichier inattendue + + + facteur d'échantillonnage inattendu + + + type de motif inconnu + + + alpha de canal l'option non reconnus + + + bits par pixel non reconnus + + + compression non reconnue + + + nombre de couleurs non reconnu + + + + + impossible de rendre la clé persistante + + + + + pas assez de données d'image dans le fichier + + + Longueur et taille du fichier ne correspondent pas + + + Image PCD corrompue, saut à l'octet de synchronisation + + + + + + + + Échec de la délégation + + + Impossible de calculer la taille en sortie + + + Impossible de générer le fichier + + + Impossible de lire le fichier + + + pas de balise trouvée + + + Échec délégation PCL + + + Échec délégation Postscript + + + impossible de créer l'image + + + impossible de décoder le fichier d'image + + + impossible d'encoder le fichier d'image + + + impossible d'initialiser la librairie FPX + + + impossible d'initialiser la librairie WMF + + + impossible de gérer un flux JP2 + + + impossible de lire le ratio d'aspect + + + impossible de lire le résumé des informations + + + impossible de fixer la matrice affine + + + impossible de fixer le ratio d'aspect + + + impossible de fixer la torsion de couleur + + + impossible de fixer le contraste + + + impossible de fixer la valeur du filtre + + + impossible de fixer le titre de l'image + + + impossible de fixer le niveau JPEG + + + impossible de fixer la zone d'intérêt + + + impossible de fixer le résumé des informations + + + impossible d'écrire au format SVG + + + Échec délégation XPS + + + + + + + Définition de motif déjà fixée + + + Définition de primitive de dessin non conforme + + + URL non relative + + + Actuellement pas de définition de motif + + + Débordement pile de segments + + + Trop de coordonnées bézier + + + impossible d'imprimer + + + erreur d'imbrication des contextes graphiques + + + URL inaccessible + + + + + + + + an error has occurred reading from file + + + impossible de créer un fichier temporaire + + + impossible d'ouvrir le fichier + + + impossible d'enregistrer le fichier + + + + + + + + filter failed + + + + + + + angle discontinu + + + Image avec table de couleurs requise + + + Image avec couleurs séparées requise + + + Le profil colorimétrique ne peut fonctionner que dans un autre espace colorimétrique + + + différences dans les espaces colorimétriques de l'image + + + profondeur d'image non supportée + + + différences dans la morphology de l'image + + + une liste d'images est requise + + + différences dans la taille de l'image + + + images too dissimilar + + + différences dans les tailles des images gauche et droite + + + Taille d'image négative ou nulle + + + aucune image trouvée + + + aucune image chargée + + + trop de grappes + + + impossible de créer la transformation de couleurs + + + Largeur ou hauteur dépassent les limites + + + + + associate profile with image, a source and destination color profile required for transform + + + + + + + + delegate library support not built-in + + + pas de délégué pour décoder ce format d'image + + + pas de délégué pour encoder ce format d'image + + + + + delegate library support not built-in + + + pas de délégué pour encoder ce format d'image + + + + + + + + image coder signature mismatch + + + image filter signature mismatch + + + impossible de charger le module + + + impossible d'enregister le format d'image + + + + + impossible d'initialiser le chargeur de module + + + + + impossible de fermer le module + + + + + + + + not authorized + + + + + + + impossible de trouver l'identifiant de registre + + + impossible de fixer le registre + + + + + + + + Échec allocation du cache pixel + + + Échec allocation mémoire + + + too many objects + + + échec acquisition de la chaine + + + échec allocation table de couleurs + + + échec conversion police de caractères + + + échec création table de couleurs + + + échec tramage de l'image + + + impossible de cloner les informations du paquet + + + impossible de récupérer les informations du paquet + + + + + time limit exceeded + + + impossible d'allouer le motif de traits + + + échec d'allocation des dérivées + + + échec allocation table gamma + + + échec allocation image + + + échec allocation pixels de l'image + + + échec allocation informations sémaphore + + + échec allocation chaine + + + Échec allocation mémoire + + + impossible de concatener la chaine + + + impossible de convertir le texte + + + impossible de créer la table de couleurs + + + impossible de cloner l'image + + + impossible d'afficher l'image + + + impossible de rendre la chaine compatible + + + impossible d'interpréter l'image MSL + + + + + échec allocation mémoire + + + + + + + + substitution de police de caractères nécessaire + + + impossible de déterminer le type de métriques + + + impossible d'initialiser la librairie freetype + + + impossible de lire la police de caractères + + + encodage de la police de caractères non reconnu + + + + + impossible de lire la police de caractères + + + + + + + l'image de contient pas la géométrie du flux + + + pas de gestionnaire de flux défini + + + Cache pixel non ouvert + + + + + + + index invalide dans la table de couleurs + + + région de taille nulle + + + impossible d'ouvrir le fichier + + + la profondeur du quantum pour Wand ne correspond pas à celle de l'API principale + + + Pas d'images pour Wand + + + Pas d'itérateur pour Wand + + + + + + + couleur inconnue du serveur + + + aucune fenêtre avec l'ID spécifié + + + la table de couleurs standard n'est pas initialisée + + + impossible de se connecter au display distant + + + impossible de créer la bitmap + + + impossible de créer la table de couleurs + + + impossible de créer la pixmap + + + impossible de créer la propriété + + + impossible de créer la table de couleurs standard + + + impossible d'afficher les informations de l'image + + + impossible de récupérer la propriété + + + impossible de récupérer la table de couleurs standard + + + impossible de récupérer le visuel + + + unable to grab mouse + + + impossible de charger la police de caractères + + + impossible d'établir la correspondance entre le visuel et la table de couleurs standard + + + impossible de se connecter au serveur X + + + impossible de lire les attributs de la fenêtre X + + + impossible de lire l'image de la fenêtre X + + + type de table de couleurs non reconnnu + + + type de gravité non reconnu + + + spécification de visuel non reconnue + + + + + impossible de créer le curseur X + + + impossible de créer le contexte graphique + + + impossible de créer la table de couleurs standard + + + impossible de créer le propriété texte + + + impossible de créer la fenêtre X + + + impossible de créer l'image X + + + impossible de créer la pixmap X + + + impossible d'afficher l'image + + + impossible de récupérer le visuel + + + impossible de récupérer les informations de pixel + + + impossible de charger la police de caractères + + + impossible de créer la fenêtre X + + + impossible de se connecter au serveur X + + + impossible d'afficher les polices de caractères + + + + + utilisation du visuel par défaut + + + impossible de récupérer le visuel + + + + + + + + Ajouter du bruit à l'image + + + + + Ajouter à la séquence d'images + + + + + Affecter les couleurs de l'image + + + + + Moyenner la séquence d'images + + + + + Cisailler l'image + + + + + Classifier les couleurs de l'image + + + + + Remplacer une couleur dans l'image + + + + + Coloriser l'image + + + + + Combiner l'image + + + + + Contrast-stretch l'image + + + + + Convolution de l'image + + + + + Couper une zone rectangulaire de l'image + + + + + Décoder l'image + + + + + Flou intérieur de l'image + + + + + Distortion de l'image + + + + + Tramer les couleurs de l'image + + + + + Réduire le brillant du contraste de l'image + + + + + encode l'image + + + + + Egaliser l'image + + + + + Réflection verticale de l'image + + + + + Réflection horizontale de l'image + + + + + Ajouter un cadre à l'image + + + + + Appliquer une expression mathématique à l'image + + + + + Correction gamma de l'image + + + + + Calculer l'histogramme de l'image + + + + + Condenser les pixels de l'image autour du centre + + + + + Ajuster le niveau de contraste de l'image + + + + + Charger l'image + + + Charger les images + + + + + Magnfiy image + + + + + Filter image with neighborhood ranking + + + + + Minify image + + + + + Modulate image + + + + + Mogrify image + + + + + Montage image + + + + + Morphing de la séquence d'images + + + + + Mosaic image + + + + + Negate image + + + + + Effet peinture à l'huile pour l'image + + + + + Fixer la couleur opage dans l'image + + + + + Plasma image + + + + + Aperçu de l'image + + + + + Raise image + + + + + Re-coloriser une image couleur + + + + + Réduire le nombre de couleurs de l'image + + + + + Réduire le bruit de l'image + + + + + Render image + + + + + Redimensionner l'image + + + + + Transformation RVB de l'image + + + + + Roll image + + + + + Rotation de l'image + + + + + Sample image + + + + + Enregistrer l'image + + + Enregistrer les images + + + + + Échelle de l'image + + + + + Segmenter l'image + + + + + Extraire un canal de l'image + + + + + Effet ton sépia pour l'image + + + + + Ombrer l'image + + + + + Augmenter la netteté de l'image + + + + + Augmenter la netteté du contraste de l'image + + + + + Sigmoidal contrast image + + + + + Effet solariation pour l'image + + + + + Splice image + + + + + Spread image + + + + + Effet stégano pour l'image + + + + + Effet stéréo pour l'image + + + + + Swirl image + + + + + Texturer l'image + + + + + Appliquer un seuil à l'image + + + + + Effet tuiles pour l'image + + + + + Tint image + + + + + Transformation RVB de l'image + + + + + Choisir la couleur transparente dans l'image + + + + + Effet vagues pour l'image + + + + + write image + + + + + X Shear image + + + + + Y Shear image + + + + diff --git a/ImageMagick-6.9.12-44/www/source/incantation.msl b/ImageMagick-6.9.12-44/www/source/incantation.msl new file mode 100644 index 0000000..b593a47 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/incantation.msl @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/locale.xml b/ImageMagick-6.9.12-44/www/source/locale.xml new file mode 100644 index 0000000..d593fba --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/locale.xml @@ -0,0 +1,48 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/log.xml b/ImageMagick-6.9.12-44/www/source/log.xml new file mode 100644 index 0000000..8a29099 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/log.xml @@ -0,0 +1,80 @@ + + + + + + + + + +]> + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/magic.xml b/ImageMagick-6.9.12-44/www/source/magic.xml new file mode 100644 index 0000000..7f17731 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/magic.xml @@ -0,0 +1,23 @@ + + + + + + +]> + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/mgk.c b/ImageMagick-6.9.12-44/www/source/mgk.c new file mode 100644 index 0000000..23f76a3 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/mgk.c @@ -0,0 +1,450 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% M M GGGG K K % +% MM MM G K K % +% M M M G GG KKK % +% M M G G K K % +% M M GGG K K % +% % +% % +% Read/Write MGK Image Format. % +% % +% Software Design % +% John Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% http://www.imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/blob-private.h" +#include "magick/cache.h" +#include "magick/colorspace.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/image.h" +#include "magick/image-private.h" +#include "magick/list.h" +#include "magick/magick.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/quantum-private.h" +#include "magick/static.h" +#include "magick/string_.h" +#include "magick/module.h" + +/* + Forward declarations. +*/ +static MagickBooleanType + WriteMGKImage(const ImageInfo *,Image *); + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% I s M G K % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% IsMGK() returns MagickTrue if the image format type, identified by the +% magick string, is MGK. +% +% The format of the IsMGK method is: +% +% MagickBooleanType IsMGK(const unsigned char *magick,const size_t length) +% +% A description of each parameter follows: +% +% o magick: This string is generally the first few bytes of an image file +% or blob. +% +% o length: Specifies the length of the magick string. +% +*/ +static MagickBooleanType IsMGK(const unsigned char *magick,const size_t length) +{ + if (length < 7) + return(MagickFalse); + if (LocaleNCompare((char *) magick,"id=mgk",7) == 0) + return(MagickTrue); + return(MagickFalse); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e a d M G K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ReadMGKImage() reads a MGK image file and returns it. It allocates +% the memory necessary for the new Image structure and returns a pointer to +% the new image. +% +% The format of the ReadMGKImage method is: +% +% Image *ReadMGKImage(const ImageInfo *image_info, +% ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image_info: the image info. +% +% o exception: return any errors or warnings in this structure. +% +*/ +static Image *ReadMGKImage(const ImageInfo *image_info,ExceptionInfo *exception) +{ + char + buffer[MaxTextExtent]; + + Image + *image; + + MagickBooleanType + status; + + register ssize_t + x; + + register PixelPacket + *q; + + register unsigned char + *p; + + ssize_t + count, + y; + + unsigned char + *pixels; + + unsigned long + columns, + rows; + + /* + Open image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickSignature); + if (image_info->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", + image_info->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickSignature); + image=AcquireImage(image_info); + status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); + if (status == MagickFalse) + { + image=DestroyImageList(image); + return((Image *) NULL); + } + /* + Read MGK image. + */ + (void) ReadBlobString(image,buffer); /* read magic number */ + if (IsMGK(buffer,7) == MagickFalse) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + (void) ReadBlobString(image,buffer); + count=(ssize_t) sscanf(buffer,"%20lu %20lu\n",&columns,&rows); + if (count <= 0) + ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + do + { + /* + Initialize image structure. + */ + image->columns=columns; + image->rows=rows; + image->depth=8; + if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + /* + Convert MGK raster image to pixel packets. + */ + if (SetImageExtent(image,0,0) == MagickFalse) + { + InheritException(exception,&image->exception); + return(DestroyImageList(image)); + } + pixels=(unsigned char *) AcquireQuantumMemory((size_t) image->columns, + 3UL*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + for (y=0; y < (ssize_t) image->rows; y++) + { + count=(ssize_t) ReadBlob(image,(size_t) (3*image->columns),pixels); + if (count != (ssize_t) (3*image->columns)) + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + p=pixels; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + break; + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelRed(q,ScaleCharToQuantum(*p++)); + SetPixelGreen(q,ScaleCharToQuantum(*p++)); + SetPixelBlue(q,ScaleCharToQuantum(*p++)); + q++; + } + if (SyncAuthenticPixels(image,exception) == MagickFalse) + break; + if ((image->previous == (Image *) NULL) && + (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse)) + break; + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (EOFBlob(image) != MagickFalse) + { + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; + } + /* + Proceed to next image. + */ + if (image_info->number_scenes != 0) + if (image->scene >= (image_info->scene+image_info->number_scenes-1)) + break; + *buffer='\0'; + (void) ReadBlobString(image,buffer); + count=(ssize_t) sscanf(buffer,"%20lu %20lu\n",&columns,&rows); + if (count > 0) + { + /* + Allocate next image structure. + */ + AcquireNextImage(image_info,image); + if (GetNextImageInList(image) == (Image *) NULL) + { + status=MagickFalse; + break; + } + image=SyncNextImageInList(image); + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + status=SetImageProgress(image,LoadImageTag,TellBlob(image), + GetBlobSize(image)); + if (status == MagickFalse) + break; + } + } + } while (count > 0); + (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); + return(GetFirstImageInList(image)); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% R e g i s t e r M G K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RegisterMGKImage() adds attributes for the MGK image format to +% the list of supported formats. The attributes include the image format +% tag, a method to read and/or write the format, whether the format +% supports the saving of more than one frame to the same file or blob, +% whether the format supports native in-memory I/O, and a brief +% description of the format. +% +% The format of the RegisterMGKImage method is: +% +% size_t RegisterMGKImage(void) +% +*/ +ModuleExport size_t RegisterMGKImage(void) +{ + MagickInfo + *entry; + + entry=SetMagickInfo("MGK"); + entry->decoder=(DecodeImageHandler *) ReadMGKImage; + entry->encoder=(EncodeImageHandler *) WriteMGKImage; + entry->magick=(IsImageFormatHandler *) IsMGK; + entry->description=ConstantString("MGK"); + entry->module=ConstantString("MGK"); + (void) RegisterMagickInfo(entry); + return(MagickImageCoderSignature); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% U n r e g i s t e r M G K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% UnregisterMGKImage() removes format registrations made by the +% MGK module from the list of supported formats. +% +% The format of the UnregisterMGKImage method is: +% +% UnregisterMGKImage(void) +% +*/ +ModuleExport void UnregisterMGKImage(void) +{ + (void) UnregisterMagickInfo("MGK"); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% W r i t e M G K I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% WriteMGKImage() writes an image to a file in red, green, and blue +% MGK rasterfile format. +% +% The format of the WriteMGKImage method is: +% +% MagickBooleanType WriteMGKImage(const ImageInfo *image_info, +% Image *image) +% +% A description of each parameter follows. +% +% o image_info: the image info. +% +% o image: The image. +% +*/ +static MagickBooleanType WriteMGKImage(const ImageInfo *image_info,Image *image) +{ + char + buffer[MaxTextExtent]; + + MagickBooleanType + status; + + MagickOffsetType + scene; + + register const PixelPacket + *p; + + register ssize_t + x; + + register unsigned char + *q; + + ssize_t + y; + + unsigned char + *pixels; + + /* + Open output image file. + */ + assert(image_info != (const ImageInfo *) NULL); + assert(image_info->signature == MagickSignature); + assert(image != (Image *) NULL); + assert(image->signature == MagickSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + if (status == MagickFalse) + return(status); + scene=0; + do + { + /* + Allocate memory for pixels. + */ + if (image->colorspace != RGBColorspace) + (void) SetImageColorspace(image,RGBColorspace); + pixels=(unsigned char *) AcquireQuantumMemory((size_t) image->columns, + 3UL*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); + /* + Initialize raster file header. + */ + (void) WriteBlobString(image,"id=mgk\n"); + (void) FormatLocaleString(buffer,MaxTextExtent,"%lu %lu\n",image->columns, + image->rows); + (void) WriteBlobString(image,buffer); + for (y=0; y < (ssize_t) image->rows; y++) + { + p=AcquireImagePixels(image,0,y,image->columns,1,&image->exception); + if (p == (const PixelPacket *) NULL) + break; + q=pixels; + for (x=0; x < (ssize_t) image->columns; x++) + { + *q++=ScaleQuantumToChar(GetRedSample(p)); + *q++=ScaleQuantumToChar(GetGreenSample(p)); + *q++=ScaleQuantumToChar(GetBlueSample(p)); + p++; + } + (void) WriteBlob(image,(size_t) (q-pixels),pixels); + if ((image->previous == (Image *) NULL) && + (SetImageProgress(image,SaveImageTag,y,image->rows) == MagickFalse)) + break; + } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (GetNextImageInList(image) == (Image *) NULL) + break; + image=SyncNextImageInList(image); + status=SetImageProgress(image,SaveImagesTag,scene, + GetImageListLength(image)); + if (status == MagickFalse) + break; + scene++; + } while (image_info->adjoin != MagickFalse); + (void) CloseBlob(image); + return(MagickTrue); +} diff --git a/ImageMagick-6.9.12-44/www/source/mime.xml b/ImageMagick-6.9.12-44/www/source/mime.xml new file mode 100644 index 0000000..9530fc8 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/mime.xml @@ -0,0 +1,1145 @@ + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/piechart.mvg b/ImageMagick-6.9.12-44/www/source/piechart.mvg new file mode 100644 index 0000000..e400186 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/piechart.mvg @@ -0,0 +1,150 @@ +push graphic-context + viewbox 0 0 624 369 + affine 0.283636 0 0 0.283846 -0 -0 + push graphic-context + push graphic-context + fill 'darkslateblue' + stroke 'blue' + stroke-width 1 + rectangle 1,1 2199,1299 + pop graphic-context + push graphic-context + font-size 40 + fill 'white' + stroke-width 1 + text 600,1100 'Average: 20.0' + pop graphic-context + push graphic-context + fill 'red' + stroke 'black' + stroke-width 5 + path 'M700.0,600.0 L340.0,600.0 A360.0,360.0 0 0,1 408.1452123287954,389.2376150414973 z' + pop graphic-context + push graphic-context + font-size 40 + fill 'white' + stroke-width 1 + text 1400,140 'MagickWand for PHP' + pop graphic-context + push graphic-context + font-size 30 + fill 'white' + stroke-width 1 + text 1800,140 '(10.0%)' + pop graphic-context + push graphic-context + fill 'red' + stroke 'black' + stroke-width 4 + rectangle 1330,100 1370,140 + pop graphic-context + push graphic-context + fill 'yellow' + stroke 'black' + stroke-width 5 + path 'M700.0,600.0 L408.1452123287954,389.2376150414973 A360.0,360.0 0 0,1 976.5894480359858,369.56936567559273 z' + pop graphic-context + push graphic-context + font-size 40 + fill 'white' + stroke-width 1 + text 1400,220 'MagickCore' + pop graphic-context + push graphic-context + font-size 30 + fill 'white' + stroke-width 1 + text 1800,220 '(29.0%)' + pop graphic-context + push graphic-context + fill 'yellow' + stroke 'black' + stroke-width 4 + rectangle 1330,180 1370,220 + pop graphic-context + push graphic-context + fill 'fuchsia' + stroke 'black' + stroke-width 5 + path 'M700.0,600.0 L976.5894480359858,369.56936567559273 A360.0,360.0 0 0,1 964.2680466142854,844.4634932636567 z' + pop graphic-context + push graphic-context + font-size 40 + fill 'white' + stroke-width 1 + text 1400,300 'MagickWand' + pop graphic-context + push graphic-context + font-size 30 + fill 'white' + stroke-width 1 + text 1800,300 '(22.9%)' + pop graphic-context + push graphic-context + fill 'fuchsia' + stroke 'black' + stroke-width 4 + rectangle 1330,260 1370,300 + pop graphic-context + push graphic-context + fill 'blue' + stroke 'black' + stroke-width 5 + path 'M700.0,600.0 L964.2680466142854,844.4634932636567 A360.0,360.0 0 0,1 757.853099990584,955.3210081341651 z' + pop graphic-context + push graphic-context + font-size 40 + fill 'white' + stroke-width 1 + text 1400,380 'JMagick' + pop graphic-context + push graphic-context + font-size 30 + fill 'white' + stroke-width 1 + text 1800,380 '(10.6%)' + pop graphic-context + push graphic-context + fill 'blue' + stroke 'black' + stroke-width 4 + rectangle 1330,340 1370,380 + pop graphic-context + push graphic-context + fill 'lime' + stroke 'black' + stroke-width 5 + path 'M700.0,600.0 L757.853099990584,955.3210081341651 A360.0,360.0 0 0,1 340.0,600.0 z' + pop graphic-context + push graphic-context + font-size 40 + fill 'white' + stroke-width 1 + text 1400,460 'Magick++' + pop graphic-context + push graphic-context + font-size 30 + fill 'white' + stroke-width 1 + text 1800,460 '(27.5%)' + pop graphic-context + push graphic-context + fill 'lime' + stroke 'black' + stroke-width 4 + rectangle 1330,420 1370,460 + pop graphic-context + push graphic-context + font-size 100 + fill 'white' + stroke-width 1 + text 100,150 'ImageMagick' + pop graphic-context + push graphic-context + fill 'none' + stroke 'black' + stroke-width 5 + circle 700,600 700,960 + pop graphic-context + pop graphic-context +pop graphic-context diff --git a/ImageMagick-6.9.12-44/www/source/piechart.svg b/ImageMagick-6.9.12-44/www/source/piechart.svg new file mode 100644 index 0000000..cb63c22 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/piechart.svg @@ -0,0 +1,32 @@ + + + + + + Average: 20.0 + + MagickWand for PHP + (10.0%) + + + MagickCore + (29.0%) + + + MagickWand + (22.9%) + + + JMagick + (10.6%) + + + Magick++ + (27.5%) + + ImageMagick + + + diff --git a/ImageMagick-6.9.12-44/www/source/policy.xml b/ImageMagick-6.9.12-44/www/source/policy.xml new file mode 100644 index 0000000..d497934 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/policy.xml @@ -0,0 +1,80 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/quantization-table.xml b/ImageMagick-6.9.12-44/www/source/quantization-table.xml new file mode 100644 index 0000000..fb71874 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/quantization-table.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + +]> + + + + Luma Quantization Table + + 16, 16, 16, 18, 25, 37, 56, 85, + 16, 17, 20, 27, 34, 40, 53, 75, + 16, 20, 24, 31, 43, 62, 91, 135, + 18, 27, 31, 40, 53, 74, 106, 156, + 25, 34, 43, 53, 69, 94, 131, 189, + 37, 40, 62, 74, 94, 124, 169, 238, + 56, 53, 91, 106, 131, 169, 226, 311, + 85, 75, 135, 156, 189, 238, 311, 418 + +
    + +
    + diff --git a/ImageMagick-6.9.12-44/www/source/thresholds.xml b/ImageMagick-6.9.12-44/www/source/thresholds.xml new file mode 100644 index 0000000..02b96a8 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/thresholds.xml @@ -0,0 +1,336 @@ + + + + + + + + + +]> + + + + + + Threshold 1x1 (non-dither) + + 1 + + + + + Checkerboard 2x1 (dither) + + 1 2 + 2 1 + + + + + + Ordered 2x2 (dispersed) + + 1 3 + 4 2 + + + + + Ordered 3x3 (dispersed) + + 3 7 4 + 6 1 9 + 2 8 5 + + + + + + Ordered 4x4 (dispersed) + + 1 9 3 11 + 13 5 15 7 + 4 12 2 10 + 16 8 14 6 + + + + + + Ordered 8x8 (dispersed) + + 1 49 13 61 4 52 16 64 + 33 17 45 29 36 20 48 32 + 9 57 5 53 12 60 8 56 + 41 25 37 21 44 28 40 24 + 3 51 15 63 2 50 14 62 + 35 19 47 31 34 18 46 30 + 11 59 7 55 10 58 6 54 + 43 27 39 23 42 26 38 22 + + + + + + Halftone 4x4 (angled) + + 4 2 7 5 + 3 1 8 6 + 7 5 4 2 + 8 6 3 1 + + + + + Halftone 6x6 (angled) + + 14 13 10 8 2 3 + 16 18 12 7 1 4 + 15 17 11 9 6 5 + 8 2 3 14 13 10 + 7 1 4 16 18 12 + 9 6 5 15 17 11 + + + + + Halftone 8x8 (angled) + + 13 7 8 14 17 21 22 18 + 6 1 3 9 28 31 29 23 + 5 2 4 10 27 32 30 24 + 16 12 11 15 20 26 25 19 + 17 21 22 18 13 7 8 14 + 28 31 29 23 6 1 3 9 + 27 32 30 24 5 2 4 10 + 20 26 25 19 16 12 11 15 + + + + + + Halftone 4x4 (orthogonal) + + 7 13 11 4 + 12 16 14 8 + 10 15 6 2 + 5 9 3 1 + + + + + Halftone 6x6 (orthogonal) + + 7 17 27 14 9 4 + 21 29 33 31 18 11 + 24 32 36 34 25 22 + 19 30 35 28 20 10 + 8 15 26 16 6 2 + 5 13 23 12 3 1 + + + + + Halftone 8x8 (orthogonal) + + 7 21 33 43 36 19 9 4 + 16 27 51 55 49 29 14 11 + 31 47 57 61 59 45 35 23 + 41 53 60 64 62 52 40 38 + 37 44 58 63 56 46 30 22 + 15 28 48 54 50 26 17 10 + 8 18 34 42 32 20 6 2 + 5 13 25 39 24 12 3 1 + + + + + + Halftone 16x16 (orthogonal) + + 4 12 24 44 72 100 136 152 150 134 98 70 42 23 11 3 + 7 16 32 52 76 104 144 160 158 142 102 74 50 31 15 6 + 19 27 40 60 92 132 168 180 178 166 130 90 58 39 26 18 + 36 48 56 80 124 176 188 204 203 187 175 122 79 55 47 35 + 64 68 84 116 164 200 212 224 223 211 199 162 114 83 67 63 + 88 96 112 156 192 216 232 240 239 231 214 190 154 111 95 87 + 108 120 148 184 208 228 244 252 251 243 226 206 182 147 119 107 + 128 140 172 196 219 235 247 256 255 246 234 218 194 171 139 127 + 126 138 170 195 220 236 248 253 254 245 233 217 193 169 137 125 + 106 118 146 183 207 227 242 249 250 241 225 205 181 145 117 105 + 86 94 110 155 191 215 229 238 237 230 213 189 153 109 93 85 + 62 66 82 115 163 198 210 221 222 209 197 161 113 81 65 61 + 34 46 54 78 123 174 186 202 201 185 173 121 77 53 45 33 + 20 28 37 59 91 131 167 179 177 165 129 89 57 38 25 17 + 8 13 29 51 75 103 143 159 157 141 101 73 49 30 14 5 + 1 9 21 43 71 99 135 151 149 133 97 69 41 22 10 2 + + + + + + + Circles 5x5 (black) + + 1 21 16 15 4 + 5 17 20 19 14 + 6 21 25 24 12 + 7 18 22 23 11 + 2 8 9 10 3 + + + + + + Circles 5x5 (white) + + 25 21 10 11 22 + 20 9 6 7 12 + 19 5 1 2 13 + 18 8 4 3 14 + 24 17 16 15 23 + + + + + Circles 6x6 (black) + + 1 5 14 13 12 4 + 6 22 28 27 21 11 + 15 29 35 34 26 20 + 16 30 36 33 25 19 + 7 23 31 32 24 10 + 2 8 17 18 9 3 + + + + + Circles 6x6 (white) + + 36 32 23 24 25 33 + 31 15 9 10 16 26 + 22 8 2 3 11 17 + 21 7 1 4 12 18 + 30 14 6 5 13 27 + 35 29 20 19 28 34 + + + + + Circles 7x7 (black) + + 3 9 18 28 17 8 2 + 10 24 33 39 32 23 7 + 19 34 44 48 43 31 16 + 25 40 45 49 47 38 27 + 20 35 41 46 42 29 15 + 11 21 36 37 28 22 6 + 4 12 13 26 14 5 1 + + + + + + Circles 7x7 (white) + + 47 41 32 22 33 42 48 + 40 26 17 11 18 27 43 + 31 16 6 2 7 19 34 + 25 10 5 1 3 12 23 + 30 15 9 4 8 20 35 + 39 29 14 13 21 28 44 + 46 38 37 24 36 45 49 + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/type-apple.xml b/ImageMagick-6.9.12-44/www/source/type-apple.xml new file mode 100644 index 0000000..57fe9d1 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/type-apple.xml @@ -0,0 +1,1367 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/type-dejavu.xml b/ImageMagick-6.9.12-44/www/source/type-dejavu.xml new file mode 100644 index 0000000..a60e597 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/type-dejavu.xml @@ -0,0 +1,58 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/type-ghostscript.xml b/ImageMagick-6.9.12-44/www/source/type-ghostscript.xml new file mode 100644 index 0000000..5a75e83 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/type-ghostscript.xml @@ -0,0 +1,50 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/type-urw-base35.xml b/ImageMagick-6.9.12-44/www/source/type-urw-base35.xml new file mode 100644 index 0000000..2f70e72 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/type-urw-base35.xml @@ -0,0 +1,50 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/type-windows.xml b/ImageMagick-6.9.12-44/www/source/type-windows.xml new file mode 100644 index 0000000..6d2a3d4 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/type-windows.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImageMagick-6.9.12-44/www/source/type.xml b/ImageMagick-6.9.12-44/www/source/type.xml new file mode 100644 index 0000000..f21c7dd --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/type.xml @@ -0,0 +1,17 @@ + + + + + +]> + + + + diff --git a/ImageMagick-6.9.12-44/www/source/wand.c b/ImageMagick-6.9.12-44/www/source/wand.c new file mode 100644 index 0000000..32760a0 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/wand.c @@ -0,0 +1,55 @@ +#include +#include +#include + +int main(int argc,char **argv) +{ +#define ThrowWandException(wand) \ +{ \ + char \ + *description; \ + \ + ExceptionType \ + severity; \ + \ + description=MagickGetException(wand,&severity); \ + (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \ + description=(char *) MagickRelinquishMemory(description); \ + exit(-1); \ +} + + MagickBooleanType + status; + + MagickWand + *magick_wand; + + if (argc != 3) + { + (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]); + exit(0); + } + /* + Read an image. + */ + MagickWandGenesis(); + magick_wand=NewMagickWand(); + status=MagickReadImage(magick_wand,argv[1]); + if (status == MagickFalse) + ThrowWandException(magick_wand); + /* + Turn the images into a thumbnail sequence. + */ + MagickResetIterator(magick_wand); + while (MagickNextImage(magick_wand) != MagickFalse) + MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0); + /* + Write the image then destroy it. + */ + status=MagickWriteImages(magick_wand,argv[2],MagickTrue); + if (status == MagickFalse) + ThrowWandException(magick_wand); + magick_wand=DestroyMagickWand(magick_wand); + MagickWandTerminus(); + return(0); +} diff --git a/ImageMagick-6.9.12-44/www/source/wand/sigmoidal-contrast.c b/ImageMagick-6.9.12-44/www/source/wand/sigmoidal-contrast.c new file mode 100644 index 0000000..0183ebf --- /dev/null +++ b/ImageMagick-6.9.12-44/www/source/wand/sigmoidal-contrast.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include + +static MagickBooleanType SigmoidalContrast(WandView *contrast_view, + const ssize_t y,const int id,void *context) +{ +#define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange) +#define SigmoidalContrast(x) \ + (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503) + + RectangleInfo + extent; + + MagickPixelPacket + pixel; + + PixelWand + **pixels; + + register ssize_t + x; + + extent=GetWandViewExtent(contrast_view); + pixels=GetWandViewPixels(contrast_view); + for (x=0; x < (ssize_t) (extent.width-extent.x); x++) + { + PixelGetMagickColor(pixels[x],&pixel); + pixel.red=SigmoidalContrast(pixel.red); + pixel.green=SigmoidalContrast(pixel.green); + pixel.blue=SigmoidalContrast(pixel.blue); + pixel.index=SigmoidalContrast(pixel.index); + PixelSetMagickColor(pixels[x],&pixel); + } + return(MagickTrue); +} + +int main(int argc,char **argv) +{ +#define ThrowViewException(view) \ +{ \ + description=GetWandViewException(view,&severity); \ + (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \ + description=(char *) MagickRelinquishMemory(description); \ + exit(-1); \ +} +#define ThrowWandException(wand) \ +{ \ + description=MagickGetException(wand,&severity); \ + (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \ + description=(char *) MagickRelinquishMemory(description); \ + exit(-1); \ +} + + char + *description; + + ExceptionType + severity; + + MagickBooleanType + status; + + MagickPixelPacket + pixel; + + MagickWand + *contrast_wand; + + WandView + *contrast_view; + + if (argc != 3) + { + (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]); + exit(0); + } + /* + Read an image. + */ + MagickWandGenesis(); + contrast_wand=NewMagickWand(); + status=MagickReadImage(contrast_wand,argv[1]); + if (status == MagickFalse) + ThrowWandException(contrast_wand); + /* + Sigmoidal non-linearity contrast control. + */ + contrast_view=NewWandView(contrast_wand); + if (contrast_view == (WandView *) NULL) + ThrowWandException(contrast_wand); + status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL); + if (status == MagickFalse) + ThrowWandException(contrast_wand); + contrast_view=DestroyWandView(contrast_view); + /* + Write the image then destroy it. + */ + status=MagickWriteImages(contrast_wand,argv[2],MagickTrue); + if (status == MagickFalse) + ThrowWandException(contrast_wand); + contrast_wand=DestroyMagickWand(contrast_wand); + MagickWandTerminus(); + return(0); +} diff --git a/ImageMagick-6.9.12-44/www/stream.html b/ImageMagick-6.9.12-44/www/stream.html new file mode 100644 index 0000000..8fe1bc6 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/stream.html @@ -0,0 +1,320 @@ + + + + + + + + + + ImageMagick (legacy) – Command-line Tools: Stream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Streaming Interface

    +

    Example UsageOption Summary

    + +

    Stream is a lightweight tool to stream one or more pixel components of the image or portion of the image to your choice of storage formats. It writes the pixel components as they are read from the input image a row at a time making stream desirable when working with large images or when you require raw pixel components.

    + +

    Example Usage

    + +

    We list a few examples of the stream command here to illustrate its usefulness and ease of use. To get started, lets stream the red, green, blue components of a 640x480 JPEG image to disk as unsigned characters:

    + +
    stream -map rgb -storage-type char image.jpg pixels.dat
    +display -depth 8 -size 640x480 rgb:pixels.dat
    +
    + +

    Here we extract a 100x100 region from a TIFF image in the grayscale format as doubles:

    + +
    stream -map i -storage-type double -extract 100x100+30+40 image.tif gray.raw
    +
    + +

    You can also associate the region to extract with the image filename:

    + +
    stream -map i -storage-type double 'image.tif[100x100+30+40]' gray.raw
    +
    + +

    Streaming requires that the image coder read the image pixels in row order. Not all formats adhere to this requirement. Verify a particular image format first, before you utilize streaming in your workflow.

    + + + +

    Option Summary

    + +

    The stream command recognizes these options. Click on an option to get more details about how that option works.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    -authenticate valuedecrypt image with this password
    -channel typeapply option to select image channels
    -colorspace typeset image colorspace
    -debug eventsdisplay copious debugging information
    -define format:optiondefine one or more image format options
    -density geometryhorizontal and vertical density of the image
    -depth valueimage depth
    -extract geometryextract area from image
    -helpprint program options
    -interlace typetype of image interlacing scheme
    -interpolate methodpixel color interpolation method
    -limit type valuepixel cache resource limit
    -list typeColor, Configure, Delegate, Format, Magic, Module, Resource, or Type
    -log formatformat of debugging information
    -map componentsstore pixels in this format.
    -monitormonitor progress
    -quantize colorspacereduce image colors in this colorspace
    -quietsuppress all warning messages
    -regard-warningspay attention to warning messages.
    -respect-parenthesessettings remain in effect until parenthesis boundary.
    -sampling-factor geometryhorizontal and vertical sampling factor
    -seed valueseed a new sequence of pseudo-random numbers
    -set attribute valueset an image attribute
    -size geometrywidth and height of image
    -storage-type typestore pixels with this storage type.
    -synchronizesynchronize image to storage device
    -taintmark the image as modified
    -transparent-color colortransparent color
    -verboseprint detailed information about the image
    -versionprint version information
    -virtual-pixel methodaccess method for pixels outside the boundaries of the image
    + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/support.html b/ImageMagick-6.9.12-44/www/support.html new file mode 100644 index 0000000..4fc6848 --- /dev/null +++ b/ImageMagick-6.9.12-44/www/support.html @@ -0,0 +1,185 @@ + + + + + + + + + + ImageMagick (legacy) – Support ImageMagick Development + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    Sponsor this Project

    +

    Contribute a Bug Fix or EnhancementSponsor the ImageMagick Project

    + + + + +

    We want to thank the following sponsors of the ImageMagick project, including:

    + +
    +
    [Network Redux] We manage everything so you don't have to

    +
    GitHub The world's leading software development platform.

    +
    [AMD] Enabling today. Inspiring tomorrow.

    +
    [Futureweb – Your Austrian Webdesign & Hosting Company] Futureweb – Your Austrian Webdesign & Hosting Company.

    +
    [LeaderSSL] We enable secure connections for websites.

    +
    + +

    Contribute a Bug Fix or Enhancement

    +

    Open an issue on the GitHub repository if you think you have found a bug or security vulnerability. Open a pull request to the repository if you have a fix. Post to the discussions forum if you want to propose an enhancement for discussion.

    + +

    Sponsor the ImageMagick Project

    + +

    ImageMagick has been available for free since the early 1990's. It has consistently been one of the most comprehensive free image processing packages available, but, unlike competing packages, it continues to be supported and enhanced. Today, ImageMagick is more comprehensive and better supported than ever.

    +

    ImageMagick has enjoyed considerable support from commercial users. Since ImageMagick is not restricted from use in commercial or proprietary applications, it is used to support thousands of commercial web sites and is used in professional digital image and movie studios as well as publishing shops. It is also used as a component of a number of commercial applications. Many of these commercial users have made contributions to ImageMagick, large and small, often anonymous, but always appreciated.

    +

    ImageMagick Studio LLC is looking for support from individuals or companies that use ImageMagick, or would like to help support free software. If you or your company depends on ImageMagick, supporting ImageMagick is a way to express your gratitude and to contribute back to the further development of ImageMagick.

    +

    ImageMagick support can take many forms. The following are some possibilities:

    +
      +
    • Contribute source code or patches to help improve ImageMagick.
    • +
    • Send us a licensed copy of Adobe Photoshop.
    • +
    • Lend us developers to add support for additional image formats or to finish integrating support for the SVG specification.
    • +
    • Extend our FFT algorithm to support non-square images.
    • +
    • Port our Linux build environment from Autoconf / Automake to CMake.
    • +
    • Provide technical writers to assist with the development of commercial-grade technical documentation.
    • +
    • Donate a quality SWOP or Eurostandard ICC profile to use as a default CMYK to RGB conversion profile.
    • +
    • Donate a workstation with a modern processor and plenty of memory and disk. We would use it for our primary development environment.
    • +
    • Donate a Windows laptop so we can build and test ImageMagick under Windows 11.
    • +
    • Make a monetary contribution:
    + +

    Donations can be anonymous, or public.

    +
    +Sponsor the ImageMagick Project +

    Github

    +

    ImageMagick Studio LLC is the organization that designs, maintains, and enhances the ImageMagick software suite. In the past, we paid for the privilege of producing free software out of our own pockets. Now, to help defray costs associated with network bandwidth, development software, computer hardware, taxes, legal, and other expenses, we accept donations from individuals or companies like yourself.

    +
      + +
    +

    Paypal

    +

    For direct monetary contributions, click on the donate button to contribute thru Paypal or with a credit card:

    + +
      +Sponsor ImageMagick +
    + +

    Bitcoin

    +

    Our Bitcoin Address is: bc1qd7lckxu36ceupgt4wpnvnug3dr8jcnpqxsla2k. Or you can reference the below QR code:

    +
      +
      Click to Donate to ImageMagick via Bitcoin
      +
    +
    +
    +

    If you have any questions about supporting ImageMagick, please contact us. +

    + + +
    +
    +
    + + + + + + diff --git a/ImageMagick-6.9.12-44/www/wand.png b/ImageMagick-6.9.12-44/www/wand.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fe5f9cb192aacbbc6f05595f24364cac942198 GIT binary patch literal 1511 zcmZ{kdpOez7{`CiC54S-L(Y*9N7!sGt!!vxD`F_5<9@3c+1$g5l4;dJ?zhb3^0+j) zbsCk>=DKiJx*Rb{91cUL(wxRUN$V2G1s-?A0o&iFl5;m#(kMg|yeSeAe#C)$9`n77i?$1sQ0GT7zm%2% zfGmWFv-9xkFhQeV8!%2vI~wOLuF@FT(b~SYvH(+dJZaE>0F4H%^~g z(z8ljP8p$yw<+b65z(14J)(I4;ruu$wQKFbZ0>VHQ6Vp{ZUKO;+uv&H3zYJ=cZ(S- zO|5=JZU%d=jlD>?N?P66;v0ZMhDs5?GK0o;c^yD)H@$une*+$&`WO5qj2-irfe8ZN0r=XI6`*yE7darv}(U zl3*vtCT;a`|3<`AbW!))$&ab@DwquUo|nA?w-S0wA531=ax2!ggju zMV}9N78cL$Ka6x>3OB!W#){+^O7r2}EfvuGhy%vPnNOcyD0cNldn!Tl<}R@>ygA2a zBQ+}WYNl*+^t^NQy4Y;DICL5N`1&)RRmj6Am#(czXsd7}`R3qCQ=y6HsZ%^tK9g@l zH9U$5!yE)FuGif(pQobdQj&Rd>GC-qTD+uKWHz0C+1y(rY<_rlvytoJadRJ2r=qG# zml4+J?6~^i_d=9OX00LU6S=&fZv(nZv7Jmrix9=8*rWIjSVkvmIX>>623wuu5 zn_bzzAXw{iuizhK8BB6>R6?V*N3a@5utFX%A@gx_0k_Rx@!?6Xw^ zYMj=1hak5=^XS^r1=M}4KPeQQ9KS+`S<||!gRxOP3q2WzzNrb7SA8?H*@3&8v3|Bb zC0B-fEOY(M-<_=^fva6@(yFU=2MTx?Px&mS8L5M;zPj6e>}8~0;a2d})WId|Q;9c4`$8xzx(ZzvyYi13n+Sy=1NfRs3mo;=KG!{RaT z(-qdyXD(9PwHIwo?U#CbMuU(uhb|6n7pxl&{FTPV#*w1})?6m`OP-`Y74Jn24xomh zgJMD?0L + + + + + ImageMagick (legacy) – WebP Encoding Options + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    +
    +

    ImageMagick's WebP image format accepts a plethora of encoding options as detailed below. As an example, suppose you are interested in these options:

    + +
      +
    • quality of 50
    • +
    • lossless compression
    • +
    + +

    Use this command:

    + +
    convert wizard.png -quality 50 -define webp:lossless=true wizard.webp
    + +

    Here is a complete list of WebP encoding options:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    alpha-compression=valueencode the alpha plane: 0 = none, 1 = compressed.
    alpha-filtering=valuepredictive filtering method for alpha plane: 0=none, 1=fast, 2=best.
    alpha-quality=valuethe compression value for alpha compression between 0 and 100. Lossless compression of alpha is achieved using a value of 100, while the lower values result in a lossy compression. The default is 100.
    auto-filter=true, falsewhen enabled, the algorithm spends additional time optimizing the filtering strength to reach a well-balanced quality.
    emulate-jpeg-size=true, falsereturn a similar compression to that of JPEG but with less degradation.
    filter-sharpness=valuefilter sharpness.
    filter-strength=valuethe strength of the deblocking filter, between 0 (no filtering) and 100 (maximum filtering). A value of 0 turns off any filtering. Higher values increase the strength of the filtering process applied after decoding the image. The higher the value, the smoother the image appears. Typical values are usually in the range of 20 to 50.
    filter-type=valuefilter type: 0 = simple, 1 = strong
    image-hint=default, photo, picture, graphthe hint about the image type.
    lossless=true, falseencode the image without any loss.
    low-memory=true, falsereduce memory usage.
    method=valuethe compression method to use. It controls the trade off between encoding speed and the compressed file size and quality. Possible values range from 0 to 6. Default value is 4. When higher values are utilized, the encoder spends more time inspecting additional encoding possibilities and decide on the quality gain. Lower value might result in faster processing time at the expense of larger file size and lower compression quality.
    preprocessing=valueChoose from: 0=none, 1=segment-smooth, 2=pseudo-random dithering.
    partitions=valueprogressive decoding: choose 0 to 3.
    partition-limit=valueChoose 0 for no quality degradation and 100 for maximum degradation.
    pass=valuemaximum number of passes to target compression size or PSNR.
    segment=valueChoose from 1 to 4, the maximum number of segments to use.
    show-compressed=true, false
    sns-strength=valuethe amplitude of the spatial noise shaping. Spatial noise shaping (SNS) refers to a general collection of built-in algorithms used to decide which area of the picture should use relatively less bits, and where else to better transfer these bits. The possible range goes from 0 (algorithm is off) to 100 (the maximal effect). The default value is 80.
    target-size=valuea target size (in bytes) to try and reach for the compressed output. The compressor makes several passes of partial encoding in order to get as close as possible to this target.
    target-psnr=valuedesired minimal distortion.
    thread-level=valueenable multi-threaded encoding: 0 = disabled, 1 = enabled.
    use-sharp-yuv=valueif needed, use sharp (and slow) RGB->YUV conversion.
    +
    +
    +
    + + + + + + diff --git a/ImageMagick.spec b/ImageMagick.spec index e6b8d1c..280a74a 100644 --- a/ImageMagick.spec +++ b/ImageMagick.spec @@ -1,5 +1,7 @@ -%global VER 6.9.10 -%global Patchlevel 86 +%global VER 6.9.12 +%global Patchlevel 44 +# Disable automatic .la file removal +%global __brp_remove_la_files %nil Name: ImageMagick %if 0%{?fedora} >= 27 @@ -17,7 +19,7 @@ License: ImageMagick Url: http://www.imagemagick.org/ Source0: https://www.imagemagick.org/download/%{name}-%{VER}-%{Patchlevel}.tar.xz -Patch0: ImageMagick-6.9.9-3-multiarch-implicit-pkgconfig-dir.patch +#Patch0: ImageMagick-6.9.9-3-multiarch-implicit-pkgconfig-dir.patch BuildRequires: bzip2-devel, freetype-devel, libjpeg-devel, libpng-devel BuildRequires: libtiff-devel, giflib-devel, zlib-devel, perl-devel >= 5.8.1 @@ -162,7 +164,7 @@ however. %prep %setup -q -n %{name}-%{VER}-%{Patchlevel} -%patch0 -p1 -b .multiarch-implicit-pkgconfig-dir +#%%patch0 -p1 -b .multiarch-implicit-pkgconfig-dir # for %%doc @@ -274,15 +276,15 @@ rm PerlMagick/demo/Generic.ttf %ldconfig_scriptlets c++ %files -%doc README.txt LICENSE NOTICE AUTHORS.txt NEWS.txt ChangeLog Platforms.txt +%doc README.txt LICENSE NOTICE AUTHORS.txt NEWS.txt ChangeLog.md %{_bindir}/[a-z]* %{_mandir}/man[145]/[a-z]* %{_mandir}/man1/%{name}.* %files libs %doc LICENSE NOTICE AUTHORS.txt QuickStart.txt -%{_libdir}/libMagickCore-6.Q16.so.6* -%{_libdir}/libMagickWand-6.Q16.so.6* +%{_libdir}/libMagickCore-6.Q16.so.7* +%{_libdir}/libMagickWand-6.Q16.so.7* %{_libdir}/%{name}-%{VER} %{_datadir}/%{name}-6 %exclude %{_libdir}/%{name}-%{VER}/modules-Q16/coders/djvu.* @@ -325,7 +327,7 @@ rm PerlMagick/demo/Generic.ttf %files c++ %doc Magick++/AUTHORS Magick++/ChangeLog Magick++/NEWS Magick++/README %doc www/Magick++/COPYING -%{_libdir}/libMagick++-6.Q16.so.8* +%{_libdir}/libMagick++-6.Q16.so.9* %files c++-devel %doc Magick++/examples @@ -344,6 +346,101 @@ rm PerlMagick/demo/Generic.ttf %doc PerlMagick/demo/ PerlMagick/Changelog PerlMagick/README.txt %changelog +* Mon Mar 28 2022 Luya Tshimbalanga - 1:6.9.12.44-1 +- New upstream release 6.9.12.44 + +* Wed Mar 23 2022 Luya Tshimbalanga - 1:6.9.12.43-1 +- New upstream release 6.9.12.43 + +* Tue Mar 15 2022 Luya Tshimbalanga - 1:6.9.12.42-1 +- New upstream release 6.9.12.42 + +* Thu Feb 17 2022 Luya Tshimbalanga - 1:6.9.12.40-1 +- New upstream release 6.9.12-40 (#2051040) + +* Sat Jan 29 2022 Luya Tshimbalanga - 1:6.9.12.37-1 +- Update to 6.9.12.37 (#2034280) + +* Mon Jan 24 2022 Timm Bäder - 1:6.9.12.32-3 +- Disable automatic .la file removal +- https://fedoraproject.org/wiki/Changes/RemoveLaFiles + +* Wed Jan 19 2022 Fedora Release Engineering - 1:6.9.12.32-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Mon Dec 06 2021 Luya Tshimbalanga - 1:6.9.12-32 +- Update to 6.9.12-32 (#2029637) + +* Tue Nov 23 2021 Sérgio Basto - 1:6.9.12-31 +- Update ImageMagick to 6.9.12-31 (#2025909) + +* Mon Nov 22 2021 Sérgio Basto - 1:6.9.12-30 +- Update ImageMagick to 6.9.12-30 (#2017126) + +* Sun Oct 31 2021 Fedora Release Monitoring - 1:6.9.12-28 +- Update to 6.9.12-28 (resolves #2017126) + +* Tue Oct 26 2021 Fedora Release Monitoring - 1:6.9.12-27 +- Update to 6.9.12-27 (#2017126) + +* Mon Oct 04 2021 Fedora Release Monitoring - 1:6.9.12-25 +- Update to 6.9.12-25 (#1869912) +- New url address +- Use pkgconfig for depending packages + +* Fri Aug 27 2021 Vít Ondruch - 1:6.9.11.27-8 +- Fix segfaults on s390x with rubygem-acitvestorage test suite. + Resolves: rhbz#1993193 + +* Sun Aug 22 2021 Richard Shaw - 1:6.9.11.27-7 +- Rebuild for OpenEXR/Imath 3.1. + +* Tue Aug 10 2021 Richard Shaw - 1:6.9.11.27-6 +- Rebuild for OpenEXR/Imath 3. + +* Wed Jul 21 2021 Fedora Release Engineering - 1:6.9.11.27-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Fri May 21 2021 Jitka Plesnikova - 1:6.9.11.27-4 +- Perl 5.34 rebuild + +* Mon Jan 25 2021 Fedora Release Engineering - 1:6.9.11.27-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Fri Jan 01 2021 Richard Shaw - 1:6.9.11.27-2 +- Rebuild for OpenEXR 2.5.3. + +* Tue Aug 11 2020 Michael Cronenworth - 1:6.9.11.27-1 +- Update to 6.9.11.27 + +* Mon Jul 27 2020 Fedora Release Engineering - 1:6.9.11.22-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Thu Jul 2 2020 Mamoru TASAKA - 1:6.9.11.22-2 +- Backport upstream patch to make ruby rmagick test pass (bug 1844192) + +* Mon Jun 29 2020 Michael Cronenworth - 1:6.9.11.22-1 +- Update to 6.9.11.22 + +* Sat Jun 27 2020 Jitka Plesnikova - 1:6.9.11.21-2 +- Perl 5.32 re-rebuild updated packages + +* Thu Jun 25 2020 Michael Cronenworth - 1:6.9.11.21-1 +- Update to 6.9.11.21 + +* Mon Jun 22 2020 Jitka Plesnikova - 1:6.9.11.16-2 +- Perl 5.32 rebuild + +* Wed Jun 03 2020 Michael Cronenworth - 1:6.9.11.16-1 +- Update to 6.9.11.16 +- Drop extra BRs on -devel package (RHBZ#1835344) + +* Mon May 11 2020 Gwyn Ciesla - 1:6.9.10.86-3 +- Rebuild for new LibRaw + +* Tue Jan 28 2020 Fedora Release Engineering - 1:6.9.10.86-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + * Mon Jan 13 2020 Michael Cronenworth - 1:6.9.10.86-1 - Update to 6.9.10.86 diff --git a/sources b/sources index c166af0..11b948f 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (ImageMagick-6.9.10-86.tar.xz) = 6d3362a83168ecc5b710bc020db2fa30495d442ffff72a77a99fb8be56225283660cd00ac2d1f75c5d19b44c64b212221aadda90fc0a0d76cc2e1e32bca62ffa +SHA512 (ImageMagick-6.9.12-44.tar.xz) = cf0c34796d4250296d55782931743bc396fd1485c5b638b6de6f7bc5d16048e6cddbb4b17f5c98d604c7af7f13217c31d57f39087d8a2c761aed8703f41e0993

    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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/images/button.gif b/ImageMagick-6.9.12-44/images/button.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a1521cbace2d54e1903a6c95b3d94701a4d0f4c GIT binary patch literal 1887 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

    y z@BRx^s+601w|J92z;VH2v(2l#YRZQOev^H;oIRks`*WL=-wz)?6xjNf!~*ejNTd=|^a8HR9~_>Gj~|&5>vi zE`Kh69<9%xAMC>KzyJQzkv1Qfm_BJz9WE~E$R9l#?-GZP>)$ommk1Xh>rME3;%9#U zU{ZcRcE&drW96h{=MV^d@{>W~KKl zzw?`v-*@lcrJKVRt4Y9w{NA&tJ2yYCE4$oflXQIY-JK~@613H*#xXZlss!Blc6YBQ z?z5zK0RKK9yAT>XPrg#zNtb-HM2;Mh^KU4vd%uI}5p$)>=HC8bOh;%dxKpQe-N;+; zcYft}0h99k&KXNgXD`!97pXx z&u-E^^Kr+FsmXEo$dNvdef%+{wXprpb6aYy#jm08I`nN&u3Qcr%byb{zhTD?;`Uy_ ze>XTO$$O!#AoY)Vo1O>f&&}*te*eh$jrW-?rjdZb`ArO@xqZdl6Z3oDz8)@da^*@1 zAtBm*X-l!2n8nYP6Dw9U^fN1OBPitCg9onmg5oj=|C4_e;rVLY^lln5qzXih8X2x$ z9ggR&#Xvex4;U$V&N@s>xGcp#dZq0~I`hBR#P6OF^sxaiWKw?LzI|JGv)Hy(Bw%oU zfA`(DE?g$=3HeRF{m5^&kca&CufOKhWaCHd&YU?3XY(QE6pe}D)0;A-t|pEN-zPL5 z!p zh1oUnyLTjg`29bV^841UTXdt?Vl@dEoZrM|3QLwWcjBLr-!#UNXCkdh*Fr4j_ifwO z8Skn*e|UD&xOcgDWQ)zGM}3KM@%a7Am$&5NH*Q>ni%VtT&!=^oGzmFh;!mH3&GF;u zylHRVT*a}Km0-*moUdJ>oZ63F#dP@P4Q>Quke8oNk1furiQj!9>%;HDCgu0do8*Uv zEtZpj!THUz;o`+1PW%({`=_5WIgZtC$*0{(S9gY8zhzVt?MeX<*{SKRif7$mU&m zzHnKIe}u>VyuCD!CVuyirVqc1n3Uf)Zrl*wG`4LO37CZ6V*LZpZ*jYJ^5i-kZ-l%h zKE8M{iQ6w`(fIMTpjx%OlE;K`g=23hJ@R`ZJTBgr;y2Cvz_VJ&Z+?CrnomNUj`IIi z7@roqO&{5cQ~H}WDcKh)@mFjscm&f{itmSG8u>jarat^GW>S7%zkZ#o3GByW5-i4Aod=TFI7)q)bPX!MaKHL?Fvfq0fnVO?#vBY` zY11~nFG=4-<)LlyaozuGR`tZBB;2!b!$_(pk*RJ8cV2kA>U=e;(KcA2-#GfQd z;&T0p!u?9yyd4VvJRd&X%PCFaxep(XbFg~eye7c6$N6(f9uxH(7bsuN16C?xcANpOHY`#;bMxO~Dt&U%wNbqYGl5foGjdi4tPoy(W&(xstzUKsOr+t$eM2}$(f_b(>p z_vOo%g*TCHTSWpU;rG#_eH;uSX7K%�j1uw3g#HZ$n77g)w7Bg*|(^dBmGDX9hr& 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 TAL9KYzf*kK4^?*aqQL(LD2=V& literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/setattribute.t b/ImageMagick-6.9.12-44/PerlMagick/t/setattribute.t new file mode 100644 index 0000000..d5aac6f --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/setattribute.t @@ -0,0 +1,243 @@ +#!/usr/bin/perl +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Test setting & getting attributes. +# +BEGIN { $| = 1; $test=1, print "1..71\n"; } +END {print "not ok 1\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't' || die 'Cd failed'; + +# Determine if QuantumMagick is defined +$image=Image::Magick->new; +my $depth = $image->Get('depth'); + +testSetAttribute('input.miff','adjoin','True'); + +++$test; +testSetAttribute('input.miff','adjoin','False'); + +++$test; +testSetAttribute('input.miff','antialias','True'); + +++$test; +testSetAttribute('input.miff','antialias','False'); + +++$test; +testSetAttribute('input.miff','compression','None'); + +++$test; +testSetAttribute('input.miff','compression','JPEG'); + +++$test; +testSetAttribute('input.miff','compression','LZW'); + +++$test; +testSetAttribute('input.miff','compression','RLE'); + +++$test; +testSetAttribute('input.miff','compression','Zip'); + +++$test; +testSetAttribute('input.miff','density','72x72'); + +++$test; +testSetAttribute('input.miff','dispose','Undefined'); + +++$test; +testSetAttribute('input.miff','dispose','None'); + +++$test; +testSetAttribute('input.miff','dispose','Background'); + +++$test; +testSetAttribute('input.miff','dispose','Previous'); + +++$test; +testSetAttribute('input.miff','delay',100); + +++$test; +testSetAttribute('input.miff','dither','True'); + +++$test; +testSetAttribute('input.miff','dither','False'); + +++$test; +testSetAttribute('input.miff','display','bogus:0.0'); + +++$test; +testSetAttribute('input.miff','filename','bogus.jpg'); + +++$test; +testSetAttribute('input.miff','font',q/-*-helvetica-medium-r-*-*-12-*-*-*-*-*-iso8859-*/); + +++$test; +testSetAttribute('input.miff','iterations',10); + +++$test; +testSetAttribute('input.miff','interlace','None'); + +++$test; +testSetAttribute('input.miff','interlace','Line'); + +++$test; +testSetAttribute('input.miff','interlace','Plane'); + +++$test; +testSetAttribute('input.miff','interlace','Partition'); + +++$test; +testSetAttribute('input.miff','loop',100); + +++$test; +testSetAttribute('input.miff','magick','TIFF'); + +++$test; +testSetAttribute('input.miff','monochrome','True'); + +++$test; +testSetAttribute('input.miff','monochrome','False'); + +++$test; +testSetAttribute('input.miff','page','595x842+0+0'); + +++$test; +testSetAttribute('input.miff','pointsize',12); + +++$test; +testSetAttribute('input.miff','preview','Rotate'); + +++$test; +testSetAttribute('input.miff','preview','Shear'); + +++$test; +testSetAttribute('input.miff','preview','Roll'); + +++$test; +testSetAttribute('input.miff','preview','Hue'); + +++$test; +testSetAttribute('input.miff','preview','Saturation'); + +++$test; +testSetAttribute('input.miff','preview','Brightness'); + +++$test; +testSetAttribute('input.miff','preview','JPEG'); + +++$test; +testSetAttribute('input.miff','preview','Spiff'); + +++$test; +testSetAttribute('input.miff','preview','Dull'); + +++$test; +testSetAttribute('input.miff','preview','Grayscale'); + +++$test; +testSetAttribute('input.miff','preview','Quantize'); + +++$test; +testSetAttribute('input.miff','preview','Despeckle'); + +++$test; +testSetAttribute('input.miff','preview','ReduceNoise'); + +++$test; +testSetAttribute('input.miff','preview','AddNoise'); + +++$test; +testSetAttribute('input.miff','preview','Sharpen'); + +++$test; +testSetAttribute('input.miff','preview','Blur'); + +++$test; +testSetAttribute('input.miff','preview','Threshold'); + +++$test; +testSetAttribute('input.miff','preview','EdgeDetect'); + +++$test; +testSetAttribute('input.miff','preview','Spread'); + +++$test; +testSetAttribute('input.miff','preview','Solarize'); + +++$test; +testSetAttribute('input.miff','preview','Shade'); + +++$test; +testSetAttribute('input.miff','preview','Raise'); + +++$test; +testSetAttribute('input.miff','preview','Segment'); + +++$test; +testSetAttribute('input.miff','preview','Solarize'); + +++$test; +testSetAttribute('input.miff','preview','Swirl'); + +++$test; +testSetAttribute('input.miff','preview','Implode'); + +++$test; +testSetAttribute('input.miff','preview','Wave'); + +++$test; +testSetAttribute('input.miff','preview','OilPaint'); + +++$test; +testSetAttribute('input.miff','preview','Charcoal'); + +++$test; +testSetAttribute('input.miff','quality',25); + +++$test; +testSetAttribute('input.miff','scene',5); + +++$test; +testSetAttribute('input.miff','subimage',9); + +++$test; +testSetAttribute('input.miff','subrange',16); + +++$test; +testSetAttribute('input.miff','server','mymachine:0.0'); + +++$test; +testSetAttribute('input.miff','size','25x25'); + +++$test; +testSetAttribute('input.miff','size','25x25'); + +# I have no idea what this does +++$test; +testSetAttribute('input.miff','tile','some value'); + +++$test; +testSetAttribute('input.miff','texture','granite:'); + +++$test; +testSetAttribute('input.miff','verbose','True'); + +++$test; +testSetAttribute('input.miff','verbose','False'); + diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/subroutines.pl b/ImageMagick-6.9.12-44/PerlMagick/t/subroutines.pl new file mode 100644 index 0000000..0a024c2 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/subroutines.pl @@ -0,0 +1,1269 @@ +# Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# Common subroutines to support tests +# +# Contributed by Bob Friesenhahn +# + +# +# Test composite method using comparison with a reference image +# +# Usage: testFilterCompare( background image name, background read options, +# composite image name, composite read options, +# composite options,reference image +# normalized_mean_error, +# normalized_maximum_error ); +sub testCompositeCompare { + my ($background_name, + $background_read_options, + $composite_name, + $composite_read_options, + $composite_options, + $refimage_name, + $normalized_mean_error_max, + $normalized_maximum_error_max) = @_; + my ($background, + $composite, + $errorinfo, + $normalized_maximum_error, + $normalized_mean_error, + $refimage, + $status); + + $errorinfo=''; + $status=''; + $normalized_mean_error_max+=1.0e-12; + $normalized_maximum_error_max+=1.0e-12; + + #print( $filter, " ...\n" ); + + # Create images + $background=Image::Magick->new; + $composite=Image::Magick->new; + $refimage=Image::Magick->new; + + # Read background image + if ( "$background_read_options" ne "" ) { + print("Set($background_read_options) ...\n"); + eval "\$status=\$background->Set($background_read_options);"; + if ("$status") + { + $errorinfo = "Set($background_read_options): $status"; + goto COMPARE_RUNTIME_ERROR; + } + } + $status=$background->ReadImage($background_name); + if ("$status") + { + $errorinfo = "Readimage ($background_name): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + # Read composite image + if ( "$composite_read_options" ne "" ) { + print("Set($composite_read_options) ...\n"); + eval "\$status=\$composite->Set($composite_read_options);"; + if ("$status") + { + $errorinfo = "Set($composite_read_options): $status"; + goto COMPARE_RUNTIME_ERROR; + } + } + $status=$composite->ReadImage($composite_name); + if ("$status") + { + $errorinfo = "Readimage ($composite_name): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + # Do composition + print("Composite\($composite_options\) ...\n"); + eval "\$status=\$background->Composite(image=>\$composite, $composite_options);"; + if ("$status") + { + $errorinfo = "Composite ($composite_options): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + $background->Clamp(); + $background->set(depth=>8); +# if ("$filter" eq "Atop") { +# $background->write(filename=>"$refimage_name", compression=>'None'); +# $background->Display(); +# } + + $status=$refimage->ReadImage("$refimage_name"); + if ("$status") + { + $errorinfo = "Readimage ($refimage_name): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + $status=$background->Difference($refimage); + if ("$status") + { + $errorinfo = "Difference($refimage_name): $status"; + print(" Reference: ", $refimage->Get('columns'), "x", $refimage->Get('rows'), "\n"); + print(" Computed: ", $background->Get('columns'), "x", $background->Get('rows'), "\n"); + goto COMPARE_RUNTIME_ERROR; + } + + $normalized_mean_error=0; + $normalized_mean_error=$background->GetAttribute('mean-error'); + if ( !defined($normalized_mean_error) ) + { + $errorinfo = "GetAttribute('mean-error') returned undefined value!"; + goto COMPARE_RUNTIME_ERROR; + } + $normalized_maximum_error=0; + $normalized_maximum_error=$background->GetAttribute('maximum-error'); + if ( ! defined($normalized_maximum_error) ) + { + $errorinfo = "GetAttribute('maximum-error') returned undefined value!"; + goto COMPARE_RUNTIME_ERROR; + } + if ( ($normalized_mean_error > $normalized_mean_error_max) || + ($normalized_maximum_error > $normalized_maximum_error_max) ) + { + print(" mean-error=$normalized_mean_error, maximum-error=$normalized_maximum_error\n"); + print "not ok $test\n"; + $background->Display(); + undef $background; + undef $composite; + undef $refimage; + return 1 + } + + undef $background; + undef $composite; + undef $refimage; + print "ok $test\n"; + return 0; + + COMPARE_RUNTIME_ERROR: + undef $background; + undef $composite; + undef $refimage; + print(" $errorinfo\n"); + print "not ok $test\n"; + return 1 +} + +# +# Test reading a 16-bit file in which two signatures are possible, +# depending on whether 16-bit pixels data has been enabled +# +# Usage: testRead( read filename, expected ref_8 [, expected ref_16] [, expected ref_32] ); +# +sub testRead { + my( $infile, $ref_8, $ref_16, $ref_32 ) = @_; + + my($image,$magick,$success,$ref_signature); + + $failure=0; + + if ( !defined( $ref_16 ) ) + { + $ref_16 = $ref_8; + } + if ( !defined( $ref_32 ) ) + { + $ref_32 = $ref_16; + } + + if (Image::Magick->new()->QuantumDepth == 32) + { + $ref_signature=$ref_32; + } + elsif (Image::Magick->new()->QuantumDepth == 16) + { + $ref_signature=$ref_16; + } + else + { + $ref_signature=$ref_8; + } + + $magick=''; + + # + # Test reading from file + # + { + my($image, $signature, $status); + + print( " testing reading from file \"", $infile, "\" ...\n"); + $image=Image::Magick->new; + $image->Set(size=>'512x512'); + $status=$image->ReadImage("$infile"); + if( "$status" && !($status =~ /Exception ((315)|(350))/)) { + print "ReadImage $infile: $status\n"; + ++$failure; + } else { + if( "$status" ) { + print "ReadImage $infile: $status\n"; + } + undef $status; + $magick=$image->Get('magick'); + $signature=$image->Get('signature'); + + if ( $signature ne $ref_signature ) { + print "ReadImage()\n"; + print "Image: $infile, signatures do not match.\n"; + print " Expected: $ref_signature\n"; + print " Computed: $signature\n"; + print " Depth: ", Image::Magick->new()->QuantumDepth, "\n"; + ++$failure; + $image->Display(); + } + } + undef $image; + } + + # + # Test reading from blob + # + if (!($infile =~ /\.bz2$/) && !($infile =~ /\.gz$/) && !($infile =~ /\.Z$/)) + { + my(@blob, $blob_length, $image, $signature, $status); + + if( open( FILE, "< $infile")) + { + print( " testing reading from BLOB with magick \"", $magick, "\"...\n"); + binmode( FILE ); + $blob_length = read( FILE, $blob, 10000000 ); + close( FILE ); + if( defined( $blob ) ) { + $image=Image::Magick->new(magick=>$magick); + $status=$image->BlobToImage( $blob ); + undef $blob; + if( "$status" && !($status =~ /Exception ((315)|(350))/)) { + print "BlobToImage $infile: $status\n"; + ++$failure; + } else { + if( "$status" ) { + print "ReadImage $infile: $status\n"; + } + $signature=$image->Get('signature'); + if ( $signature ne $ref_signature ) { + print "BlobToImage()\n"; + print "Image: $infile, signatures do not match.\n"; + print " Expected: $ref_signature\n"; + print " Computed: $signature\n"; + print " Depth: ", Image::Magick->new()->QuantumDepth, "\n"; + #$image->Display(); + ++$failure; + } + } + } + } + undef $image; + } + + # + # Display test status + # + if ( $failure != 0 ) { + print "not ok $test\n"; + } else { + print "ok $test\n"; + } +} + + +# +# Test reading a file, and compare with a reference file +# +sub testReadCompare { + my( $srcimage_name,$refimage_name, $read_options, + $normalized_mean_error_max, $normalized_maximum_error_max) = @_; + my($srcimage, $refimage, $normalized_mean_error, $normalized_maximum_error); + + $errorinfo=''; + $normalized_mean_error_max+=1.0e-12; + $normalized_maximum_error_max+=1.0e-12; + + # Create images + $srcimage=Image::Magick->new; + $refimage=Image::Magick->new; + + if ( "$read_options" ne "" ) { + eval "\$status=\$srcimage->Set($read_options);"; + if ("$status") + { + $errorinfo = "Set($read_options): $status"; + warn("$errorinfo"); + goto COMPARE_RUNTIME_ERROR; + } + } + + $status=$srcimage->ReadImage("$srcimage_name"); + if ("$status") + { + $errorinfo = "Readimage ($srcimage_name): $status"; + warn("$errorinfo"); + goto COMPARE_RUNTIME_ERROR; + } + +# if ("$srcimage_name" eq "input.tim") { +# $srcimage->write(filename=>"$refimage_name", compression=>'None'); +# } + + #print("writing file $refimage_name\n"); + #$srcimage->Quantize(colors=>256); + #$status=$srcimage->write(filename=>"$refimage_name", compression=>'rle'); + #warn "$status" if $status; + + $status=$refimage->ReadImage("$refimage_name"); + if ("$status") + { + $errorinfo = "Readimage ($refimage_name): $status"; + warn("$errorinfo"); + goto COMPARE_RUNTIME_ERROR; + } + + $srcimage->Clamp(); + $srcimage->set(depth=>8); + + # FIXME: The following statement should not be needed. +# $status=$refimage->Set(type=>'TrueColor'); +# if ("$status") +# { +# $errorinfo = "Set(type=>'TrueColor'): $status"; +# goto COMPARE_RUNTIME_ERROR; +# } + + # Verify that $srcimage and $refimage contain the same number of frames. + if ( $#srcimage != $#refimage ) + { + $errorinfo = "Source and reference images contain different number of frames ($#srcimage != $#refimage)"; + warn("$errorinfo"); + goto COMPARE_RUNTIME_ERROR; + } + + # Compare each frame in the sequence. + for ($index = 0; $srcimage->[$index] && $refimage->[$index]; $index++) + { + $status=$srcimage->[$index]->Difference($refimage->[$index]); + if ("$status") + { + $errorinfo = "Difference($refimage_name)->[$index]: $status"; + warn("$errorinfo"); + goto COMPARE_RUNTIME_ERROR; + } + } + + + $normalized_mean_error=0; + $normalized_mean_error=$srcimage->GetAttribute('mean-error'); + if ( !defined($normalized_mean_error) ) + { + $errorinfo = "GetAttribute('mean-error') returned undefined value!"; + warn("$errorinfo"); + goto COMPARE_RUNTIME_ERROR; + } + $normalized_maximum_error=0; + $normalized_maximum_error=$srcimage->GetAttribute('maximum-error'); + if ( ! defined($normalized_maximum_error) ) + { + $errorinfo = "GetAttribute('maximum-error') returned undefined value!"; + warn("$errorinfo"); + goto COMPARE_RUNTIME_ERROR; + } + if ( ($normalized_mean_error > $normalized_mean_error_max) || + ($normalized_maximum_error > $normalized_maximum_error_max) ) + { + print("mean-error=$normalized_mean_error, maximum-error=$normalized_maximum_error\n"); + #$srcimage->Display(); + print "not ok $test\n"; + return 1 + } + + undef $srcimage; + undef $refimage; + print "ok $test\n"; + return 0; + + COMPARE_RUNTIME_ERROR: + undef $srcimage; + undef $refimage; + print "not ok $test\n"; + return 1 +} + +# +# Test reading a file which requires a file size to read (GRAY, RGB, CMYK) +# or supports multiple resolutions (JBIG, JPEG, PCD) +# +# Usage: testRead( read filename, size, depth, expected ref_8 [, expected ref_16] [, expected ref_32] ); +# +sub testReadSized { + my( $infile, $size, $ref_8, $ref_16, $ref_32 ) = @_; + + my($image,$ref_signature); + + if ( !defined( $ref_16 ) ) + { + $ref_16 = $ref_8; + } + if ( !defined( $ref_32 ) ) + { + $ref_32 = $ref_16; + } + + if (Image::Magick->new()->QuantumDepth == 32) + { + $ref_signature=$ref_32; + } + elsif (Image::Magick->new()->QuantumDepth == 16) + { + $ref_signature=$ref_16; + } + else + { + $ref_signature=$ref_8; + } + + $image=Image::Magick->new; + + # Set size attribute + $status=$image->SetAttribute(size=>"$size"); + warn "$status" if "$status"; + + # If depth is not zero, then set it + if ( Image::Magick->new()->QuantumDepth != 0 ) { + $status=$image->SetAttribute(depth=>Image::Magick->new()->QuantumDepth); + warn "$status" if "$status"; + } + + $status=$image->ReadImage("$infile"); + if( "$status" ) { + print "ReadImage $infile: $status"; + print "not ok $test\n"; + } else { + $signature=$image->Get('signature'); + if ( $signature ne $ref_signature ) { + print "ReadImage()\n"; + print "Image: $infile, signatures do not match.\n"; + print " Expected: $ref_signature\n"; + print " Computed: $signature\n"; + print " Depth: ", Image::Magick->new()->QuantumDepth, "\n"; + print "not ok $test\n"; + #$image->Display(); + } else { + print "ok $test\n"; + } + } +} + +# +# Test writing a file by first reading a source image, writing to a new image, +# reading the written image, and comparing with expected REF_8. +# +# Usage: testReadWrite( read filename, write filename, write options, +# expected ref_8 [, expected ref_16] ); +# +# .e.g +# +# testReadWrite( 'input.jpg', 'output.jpg', q/quality=>80, interlace=>'None'/, +# 'dc0a144a0b9480cd1e93757a30f01ae3' ); +# +# If the REF_8 of the written image is not what is expected, the written +# image is preserved. Otherwise, the written image is removed. +# +sub testReadWrite { + my( $infile, $outfile, $writeoptions, $ref_8, $ref_16, $ref_32 ) = @_; + + my($image); + + if ( !defined( $ref_16 ) ) + { + $ref_16 = $ref_8; + } + if ( !defined( $ref_32 ) ) + { + $ref_32 = $ref_16; + } + + if (Image::Magick->new()->QuantumDepth == 32) + { + $ref_signature=$ref_32; + } + elsif (Image::Magick->new()->QuantumDepth == 16) + { + $ref_signature=$ref_16; + } + else + { + $ref_signature=$ref_8; + } + + $image=Image::Magick->new; + $status=$image->ReadImage("$infile"); + $signature=$image->Get('signature'); + if( "$status" ) { + print "ReadImage $infile: $status\n"; + print "not ok $test\n"; + } else { + # Write image to file + my $options = 'filename=>"$outfile", ' . "$writeoptions"; + #print "Using options: $options\n"; + eval "\$status=\$image->WriteImage( $options ) ;"; + if( $@ ) { + print "$@\n"; + print "not ok $test\n"; + exit 1; + } + if( "$status" ) { + print "WriteImage $outfile: $status\n"; + print "not ok $test\n"; + } else { + my($image); + + # Read image just written + $image=Image::Magick->new; + $status=$image->ReadImage("$outfile"); + if( "$status" ) { + print "ReadImage $outfile: $status\n"; + print "not ok $test\n"; + } else { + # Check signature + $signature=$image->Get('signature'); + if ( $signature ne $ref_signature ) { + print "ReadImage()\n"; + print "Image: $infile, signatures do not match.\n"; + print " Expected: $ref_signature\n"; + print " Computed: $signature\n"; + print " Depth: ", Image::Magick->new()->QuantumDepth, "\n"; + print "not ok $test\n"; + $image->Display(); + } else { + print "ok $test\n"; + ($file = $outfile) =~ s/.*://g; + #unlink "$file"; + } + } + } + } +} + +# +# Test reading a file, and compare with a reference file +# +sub testReadWriteCompare { + my( $srcimage_name, $outimage_name, $refimage_name, + $read_options, $write_options, + $normalized_mean_error_max, $normalized_maximum_error_max) = @_; + my($srcimage, $refimage, $normalized_mean_error, + $normalized_maximum_error); + + $errorinfo=''; + $normalized_mean_error_max+=1.0e-12; + $normalized_maximum_error_max+=1.0e-12; + + $image=Image::Magick->new; + $refimage=Image::Magick->new; + + # + # Read the initial image + # + $status=$image->ReadImage($srcimage_name); + if ("$status") + { + $errorinfo = "Readimage ($srcimage_name): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + # + # Write image to output file + # + if ( "$write_options" ne "" ) { + eval "\$status=\$image->Set($write_options);"; + if ("$status") + { + $errorinfo = "Set($write_options): $status"; + goto COMPARE_RUNTIME_ERROR; + } + } + $image->Set(filename=>"$outimage_name"); + + $status=$image->WriteImage( ); + if ("$status") + { + $errorinfo = "WriteImage ($outimage_name): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + undef $image; + $image=Image::Magick->new; + + # + # Read image from output file + # + if ( "$read_options" ne "" ) { + eval "\$status=\$image->Set($read_options);"; + if ("$status") + { + $errorinfo = "Set($read_options): $status"; + goto COMPARE_RUNTIME_ERROR; + } + } + + $image->ReadImage("$outimage_name"); + if ("$status") + { + $errorinfo = "WriteImage ($outimage_name): $status"; + goto COMPARE_RUNTIME_ERROR; + } + +# eval "\$status=\$image->Set($write_options);"; +#$status=$image->write(filename=>"$refimage_name", compression=>'None'); +# warn "$status" if $status; + + # + # Read reference image + # + $status=$refimage->ReadImage("$refimage_name"); + if ("$status") + { + $errorinfo = "Readimage ($refimage_name): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + # + # Compare output file with reference image + # + + $image->Clamp(); + $image->set(depth=>8); + + # FIXME: The following statement should not be needed. +# $status=$refimage->Set(type=>'TrueColor'); +# if ("$status") +# { +# $errorinfo = "Set(type=>'TrueColor'): $status"; +# goto COMPARE_RUNTIME_ERROR; +# } + + $status=$image->Difference($refimage); + if ("$status") + { + $errorinfo = "Difference($refimage_name): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + $normalized_mean_error=0; + $normalized_mean_error=$image->GetAttribute('mean-error'); + if ( !defined($normalized_mean_error) ) + { + $errorinfo = "GetAttribute('mean-error') returned undefined value!"; + goto COMPARE_RUNTIME_ERROR; + } + $normalized_maximum_error=0; + $normalized_maximum_error=$image->GetAttribute('maximum-error'); + if ( ! defined($normalized_maximum_error) ) + { + $errorinfo = "GetAttribute('maximum-error') returned undefined value!"; + goto COMPARE_RUNTIME_ERROR; + } + + if ( ($normalized_mean_error > $normalized_mean_error_max) || + ($normalized_maximum_error > $normalized_maximum_error_max) ) + { + print("mean-error=$normalized_mean_error, maximum-error=$normalized_maximum_error\n"); + print "not ok $test\n"; + return 1 + } + + print "ok $test\n"; + undef $image; + undef $refimage; + return 0; + + COMPARE_RUNTIME_ERROR: + warn("$errorinfo"); + print "not ok $test\n"; + undef $image; + undef $refimage; + return 1 +} + +# +# Test writing a file by first reading a source image, writing to a +# new image, and reading the written image. Depends on detecting +# reported errors by ImageMagick +# +# Usage: testReadWrite( read filename, write filename, write options); +# +# .e.g +# +# testReadWrite( 'input.jpg', 'output.jpg', q/quality=>80, 'interlace'=>'None'/ ); +# +# If the read of the written image is not what is expected, the +# written image is preserved. Otherwise, the written image is +# removed. +# +sub testReadWriteNoVerify { + my( $infile, $outfile, $writeoptions) = @_; + + my($image, $images); + + $image=Image::Magick->new; + $status=$image->ReadImage("$infile"); + if( "$status" ) { + print "$status\n"; + print "ReadImage $infile: not ok $test\n"; + } else { + # Write image to file + my $options = 'filename=>"$outfile", ' . $writeoptions; + #print "Using options: $options\n"; + eval "\$status=\$image->WriteImage( $options ) ;"; + if( $@ ) { + print "$@"; + print "not ok $test\n"; + exit 1; + } + if( "$status" ) { + print "WriteImage $outfile: $status\n"; + print "not ok $test\n"; + } else { + my($image); + + # Read image just written + $image=Image::Magick->new; + $status=$image->ReadImage("$outfile"); + if( "$status" ) { + print "ReadImage $outfile: $status\n"; + print "not ok $test\n"; + } else { + print "ok $test\n"; + unlink $outfile; + } + } + } +} + +# +# Test writing a file by first reading a source image, writing to a new image, +# reading the written image, and comparing with expected REF_8. +# +# Usage: testReadWriteSized( read filename, +# write filename, +# read filename size, +# read filename depth, +# write options, +# expected ref_8 [,expected ref_16] ); +# +# .e.g +# +# testReadWriteSized( 'input.jpg', 'output.jpg', '70x46', 8, q/quality=>80, +# 'interlace'=>'None'/, 'dc0a144a0b9480cd1e93757a30f01ae3' ); +# +# If the REF_8 of the written image is not what is expected, the written +# image is preserved. Otherwise, the written image is removed. A depth of 0 is +# ignored. +# +sub testReadWriteSized { + my( $infile, $outfile, $size, $readdepth, $writeoptions, $ref_8, $ref_16, + $ref_32 ) = @_; + + my($image, $ref_signature); + + if ( !defined( $ref_16 ) ) + { + $ref_16 = $ref_8; + } + if ( !defined( $ref_32 ) ) + { + $ref_32 = $ref_16; + } + + if (Image::Magick->new()->QuantumDepth == 32) + { + $ref_signature=$ref_32; + } + elsif (Image::Magick->new()->QuantumDepth == 16) + { + $ref_signature=$ref_16; + } + else + { + $ref_signature=$ref_8; + } + + $image=Image::Magick->new; + + #$image->SetAttribute(debug=>'transform'); + + # Set size attribute + $status=$image->SetAttribute(size=>"$size"); + warn "$status" if "$status"; + + # If read depth is not zero, then set it + if ( $readdepth != 0 ) { + $status=$image->SetAttribute(depth=>$readdepth); + warn "$status" if "$status"; + } + + $status=$image->ReadImage("$infile"); + if( "$status" ) { + print "ReadImage $infile: $status\n"; + print "not ok $test\n"; + } else { + # Write image to file + my $options = 'filename=>"$outfile", ' . "$writeoptions"; + #print "Using options: $options\n"; + eval "\$status=\$image->WriteImage( $options ) ;"; + if( $@ ) { + print "$@\n"; + print "not ok $test\n"; + exit 1; + } + if( "$status" ) { + print "WriteImage $outfile: $status\n"; + print "not ok $test\n"; + } else { + my($image); + + $image=Image::Magick->new; + + if ( $readdepth != 0 ) { + $status=$image->SetAttribute(depth=>$readdepth); + warn "$status" if "$status"; + } + # Set image size attribute + $status=$image->SetAttribute(size=>"$size"); + warn "$status" if "$status"; + + # Read image just written + $status=$image->ReadImage("$outfile"); + if( "$status" ) { + print "ReadImage $outfile: $status\n"; + print "not ok $test\n"; + } else { + # Check signature + $signature=$image->Get('signature'); + + if ( $signature ne $ref_signature ) { + print "ReadImage()\n"; + print "Image: $infile, signatures do not match.\n"; + print " Expected: $ref_signature\n"; + print " Computed: $signature\n"; + print " Depth: ", Image::Magick->new()->QuantumDepth, "\n"; + print "not ok $test\n"; + #$image->Display(); + } else { + print "ok $test\n"; + #$image->Display(); + ($file = $outfile) =~ s/.*://g; + unlink "$file"; + } + } + } + } +} + +# +# Test SetAttribute method +# +# Usage: testSetAttribute( name, attribute); +# +sub testSetAttribute { + my( $srcimage, $name, $attribute ) = @_; + + my($image); + + # Create temporary image + $image=Image::Magick->new; + + $status=$image->ReadImage("$srcimage"); + warn "Readimage: $status" if "$status"; + + # Set image option + print "Image Option : $name=>$attribute\n"; + eval "\$status = \$image->Set('$name'=>'$attribute') ;"; + warn "SetImage: $status" if "$status"; + + # Convert input values to expected output values + $expected=$attribute; + if ($attribute eq 'True' || $attribute eq 'true') { + $expected = 1; + } elsif ($attribute eq 'False' || $attribute eq 'false') { + $expected = 0; + } + + + $value=$image->GetAttribute($name); + + if( defined( $value ) ) { + if ("$expected" eq "$value") { + print "ok $test\n"; + } else { + print "Expected ($expected), Got ($value)\n"; + print "not ok $test\n"; + } + } else { + print "GetAttribute returned undefined value!\n"; + print "not ok $test\n"; + } +} + +# +# Test GetAttribute method +# +# Usage: testGetAttribute( name, expected); +# +sub testGetAttribute { + my( $srcimage, $name, $expected ) = @_; + + my($image); + + # Create temporary image + $image=Image::Magick->new; + + $status=$image->ReadImage("$srcimage"); + warn "Readimage: $status" if "$status"; + + $value=$image->GetAttribute($name); + + if( !defined( $expected ) && !defined( $value ) ) { + # Undefined value is expected + print "ok $test\n"; + } elsif ( !defined( $value ) ) { + print "Expected ($expected), Got (undefined)\n"; + print "not ok $test\n"; + } else { + if ("$expected" eq "$value") { + print "ok $test\n"; + } else { + print "Expected ($expected), Got ($value)\n"; + print "not ok $test\n"; + } + } +} + +# +# Test MontageImage method +# +# Usage: testMontage( input image attributes, montage options, expected REF_8 +# [, expected REF_16] ); +# +sub testMontage { + my( $imageOptions, $montageOptions, $ref_8, $ref_16, $ref_32 ) = @_; + + my($image,$ref_signature); + + if ( !defined( $ref_16 ) ) + { + $ref_16 = $ref_8; + } + if ( !defined( $ref_32 ) ) + { + $ref_32 = $ref_16; + } + + if (Image::Magick->new()->QuantumDepth == 32) + { + $ref_signature=$ref_32; + } + elsif (Image::Magick->new()->QuantumDepth == 16) + { + $ref_signature=$ref_16; + } + else + { + $ref_signature=$ref_8; + } + + # Create image for image list + $images=Image::Magick->new; + + # Create temporary image + $image=Image::Magick->new; + + my @colors = ( '#000000', '#008000', '#C0C0C0', '#00FF00', + '#808080', '#808000', '#FFFFFF', '#FFFF00', + '#800000', '#000080', '#FF0000', '#0000FF', + '#800080', '#008080', '#FF00FF', '#00FFFF' ); + + my $color; + foreach $color ( @colors ) { + + # Generate image + $image->Set(size=>'50x50'); + #print("\$image->ReadImage(xc:$color);\n"); + $status=$image->ReadImage("xc:$color"); + if ("$status") { + warn "Readimage: $status" if "$status"; + } else { + # Add image to list + push( @$images, @$image); + } + undef @$image; + } + + # Set image options + if ("$imageOptions" ne "") { + print("\$images->Set($imageOptions)\n"); + eval "\$status = \$images->Set($imageOptions) ;"; + warn "SetImage: $status" if "$status"; + } + + #print "Border color : ", $images->Get('bordercolor'), "\n"; + #print "Matte color : ", $images->Get('mattecolor'), "\n"; + #print "Pen color : ", $images->Get('pen'), "\n"; + + # Do montage + #print "Montage Options: $montageOptions\n"; + print("\$montage=\$images->Montage( $montageOptions )\n"); + eval "\$montage=\$images->Montage( $montageOptions ) ;"; + if( $@ ) { + print "$@"; + print "not ok $test\n"; + return 1; + } + + if( ! ref($montage) ) { + print "not ok $test\n"; + } else { + # Check REF_8 signature + # $montage->Display(); + $signature=$montage->GetAttribute('signature'); + if ( defined( $signature ) ) { + if ( $signature ne $ref_signature ) { + print "ReadImage()\n"; + print "Test $test, signatures do not match.\n"; + print " Expected: $ref_signature\n"; + print " Computed: $signature\n"; + print " Depth: ", Image::Magick->new()->QuantumDepth, "\n"; + $status = $montage->Write("test_${test}_out.miff"); + warn "Write: $status" if "$status"; + + print "not ok $test\n"; + } else { + # Check montage directory + my $directory = $montage->Get('directory'); + my $expected = join( "\xff", @colors ) . "\xff"; + if ( !defined($directory) ) { + print "ok $test\n"; + } elsif ( $directory ne $expected) { + print("Invalid montage directory:\n\"$directory\"\n"); + print("Expected:\n\"$expected\"\n"); + print "not ok $test\n"; + } else { + # Check montage geometry + $montage_geom=$montage->Get('montage'); + if( !defined($montage_geom) ) { + print("Montage geometry not defined!\n"); + print "not ok $test\n"; + } elsif ( $montage_geom !~ /^\d+x\d+\+\d+\+\d+$/ ) { + print("Montage geometry not in correct format: \"$montage_geom\"\n"); + print "not ok $test\n"; + } else { + print "ok $test\n"; + } + } + } + } else { + warn "GetAttribute returned undefined value!"; + print "not ok $test\n"; + } + } +} + +# +# Test filter method using signature compare +# +# Usage: testFilterSignature( input image attributes, filter, options, expected REF_8 +# [, expected REF_16] ); +# +sub testFilterSignature { + my( $srcimage, $filter, $filter_options, $ref_8, $ref_16, $ref_32 ) = @_; + + my($image, $ref_signature); + +# print( $filter, " ...\n" ); + + if ( !defined( $ref_16 ) ) + { + $ref_16 = $ref_8; + } + if ( !defined( $ref_32 ) ) + { + $ref_32 = $ref_16; + } + + if (Image::Magick->new()->QuantumDepth == 32) + { + $ref_signature=$ref_32; + } + elsif (Image::Magick->new()->QuantumDepth == 16) + { + $ref_signature=$ref_16; + } + else + { + $ref_signature=$ref_8; + } + + # Create temporary image + $image=Image::Magick->new; + + $status=$image->ReadImage("$srcimage"); + warn "Readimage: $status" if "$status"; + + print("$filter\($filter_options\) ...\n"); + $image->$filter($filter_options); +#$image->write(filename=>"reference/filter/$filter.miff", compression=>'None'); + + $signature=$image->GetAttribute('signature'); + if ( defined( $signature ) ) { + if ( $signature ne $ref_signature ) { + print "Test $test, signatures do not match.\n"; + print " Expected: $ref_signature\n"; + print " Computed: $signature\n"; + print " Depth: ", Image::Magick->new()->QuantumDepth, "\n"; + #$image->Display(); + print "not ok $test\n"; + } else { + print "ok $test\n"; + } + } else { + warn "GetAttribute returned undefined value!"; + print "not ok $test\n"; + } +} + +# +# Test filter method using comparison with reference image +# +# Usage: testFilterCompare( input image, input image options, reference image, filter, filter options, +# normalized_mean_error, +# normalized_maximum_error ); +sub testFilterCompare { + my ($srcimage_name, $src_read_options, $refimage_name, $filter, + $filter_options, $normalized_mean_error_max, + $normalized_maximum_error_max) = @_; + my($srcimage, $refimage, $normalized_mean_error, + $normalized_maximum_error); + my($status,$errorinfo); + + $errorinfo=''; + $status=''; + $normalized_mean_error_max+=1.0e-12; + $normalized_maximum_error_max+=1.0e-12; + + #print( $filter, " ...\n" ); + + # Create images + $srcimage=Image::Magick->new; + $refimage=Image::Magick->new; + + if ( "$src_read_options" ne "" ) { + print("Set($src_read_options) ...\n"); + eval "\$status=\$srcimage->Set($src_read_options);"; + if ("$status") + { + $errorinfo = "Set($src_read_options): $status"; + goto COMPARE_RUNTIME_ERROR; + } + } + + $status=$srcimage->ReadImage($srcimage_name); + #eval "\$status=\$srcimage->ReadImage($srcimage_name);"; + if ("$status") + { + $errorinfo = "Readimage ($srcimage_name): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + print("$filter\($filter_options\) ...\n"); + eval "\$status=\$srcimage->$filter($filter_options);"; + if ("$status") + { + $errorinfo = "$filter ($filter_options): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + $srcimage->Clamp(); + $srcimage->set(depth=>8); +# if ("$filter" eq "Shear") { +# $srcimage->Display(); +# $srcimage->write(filename=>"$refimage_name", compression=>'None'); +# } + + $status=$refimage->ReadImage("$refimage_name"); + if ("$status") + { + $errorinfo = "Readimage ($refimage_name): $status"; + goto COMPARE_RUNTIME_ERROR; + } + + # FIXME: The following statement should not be needed. +# $status=$refimage->Set(type=>'TrueColor'); +# if ("$status") +# { +# $errorinfo = "Set(type=>'TrueColor'): $status"; +# goto COMPARE_RUNTIME_ERROR; +# } + + $status=$srcimage->Difference($refimage); + if ("$status") + { + $errorinfo = "Difference($refimage_name): $status"; + print(" Reference: ", $refimage->Get('columns'), "x", $refimage->Get('rows'), "\n"); + print(" Computed: ", $srcimage->Get('columns'), "x", $srcimage->Get('rows'), "\n"); + goto COMPARE_RUNTIME_ERROR; + } + + $normalized_mean_error=0; + $normalized_mean_error=$srcimage->GetAttribute('mean-error'); + if ( !defined($normalized_mean_error) ) + { + $errorinfo = "GetAttribute('mean-error') returned undefined value!"; + goto COMPARE_RUNTIME_ERROR; + } + $normalized_maximum_error=0; + $normalized_maximum_error=$srcimage->GetAttribute('maximum-error'); + if ( ! defined($normalized_maximum_error) ) + { + $errorinfo = "GetAttribute('maximum-error') returned undefined value!"; + goto COMPARE_RUNTIME_ERROR; + } + if ( ($normalized_mean_error > $normalized_mean_error_max) || + ($normalized_maximum_error > $normalized_maximum_error_max) ) + { + print(" mean-error=$normalized_mean_error, maximum-error=$normalized_maximum_error\n"); + print "not ok $test\n"; + #$srcimage->Display(); + undef $srcimage; + undef $refimage; + return 1 + } + + undef $srcimage; + undef $refimage; + print "ok $test\n"; + return 0; + + COMPARE_RUNTIME_ERROR: + undef $srcimage; + undef $refimage; + print(" $errorinfo\n"); + print "not ok $test\n"; + return 1 +} +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_16.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_16.tiff new file mode 100644 index 0000000000000000000000000000000000000000..b591be053b810eff640e6750583897e0bbb23d3d GIT binary patch literal 1902 zcmYk7O>7fK6vtNpX~M1zTf`; zZ{FDBPd-715!&-9+6f^p$qmnQYZRhv_U^x@pS!rQLm(swhsus;Q7X%FeMRGym`-%O ziwKA$<#ihnDvvf!^a_LeIWoPAAnsIlz{jNY{+7loZ*|WvzUW6pNu~`>#76IL5zY)g z4}z^-Bm${GukudhiS|F3BLnS6?cy#XAR!`1k}R7Nz1#lH7>3edtF<`4gGAyQ=*VCr zHDbA6+HGD+VdHgCBzc0w2oj}qMER^tYh_w;@nxG;tJP%z8;f8>NE*e(h!CHO@Ab;H zTEn*8QRXm+N__HF(3wYKTp5T*M3GFPLwv4v+qT!eGDoV_XTINQAvB#oIIDpXLNNE5 zRRYAZDacgWh7S>FXi6yr-4hy_#*{*theJzTg|VMF6GuX_5Cr;({C~evt^i>^Zf zB}5`bITZw5eS+E6HUU?U+HSSleDEPx!BZqZ5(L5D9&}Ixg&qdYG^(t+dXyvCcszL! zjGB(^xPWX2Aka;7^#i}-`>Lv@hV-uPIbPijd*Nh_vSxGjQKubrVo@cQ8YyfzPOYyO z%YkKWHdhUpZZM_9qRF8`lXqC*F3hvm>wG%SCi{jX50fz^8;!kU%nn_cM@w~R-L^N` zcZ+Rf(TF9p%7`8`J-1wkCtWE(OA2*=|KpX~Rg--~Jv3w7S;+U=nes_|2u2Z*5%;O&X?XXHZ1I$c5IRr?cXTNX4 zZMW`ty?PJ%iez%ef*~rpUeLS$V#X}nvH*fA7Xg*XKnqk1L_X5>ZebR$dw}p=3R|&R z1)XVSI3nUgx1eY7INw6PiJ=u`U*{KFKmd}59nvu_0aE(5;cTl|v{aePw0f&fDp{=K z7%uk^7gXx-wkbW(Fj@)3RWQVCG>XTe>hdopY!A$snq_Ltp%9q>D4jp-febD2;{{~k zaG;;7C?UR4!B`;~1`hmOkY!3ODobW#E47Vq4UAQ-%qsPD&#O^MmOw+2MzOLW_Nid? zP^0d`Vl0W8CQ!08dUZY_q6|zI{hu|V z>3FV7WfRU9Ns{iSk*I-+F|);6fuGBh#4*1DI-p{Lj47#zXar>zW)?Vsm*Ce@eCR)E zxNgq}M5F{9FQS&22@!q(7=ZoWsPSH)70Cbs7&4ui!{BrZs+~u0@&9zqn8`Ji@IWRc zGYmFA=Aih56TT0llb{hrnd_;5%#7CS1&qSz{J?<}$s`Ct8eoJFK(=zv{LT*bSW?s! zNu{9%6v(8x3XH|yL3~w#P?faE8BrlB+AqNI3W@@nfr}94#~>dFa}n~vFb7!J6Xx)g z@J`?TeP{r5_93(v2@-;*Kog<2g=il$)R(^-=6?Ywzv1_MEWF>xXuTZ%0`~3)Ep&Nl z`OB4y+1#;}FP0I)xLBN>y>w|};>wk!r8{?g|LN1s%?A%|-Fo?QZSDGXjK{~%oGBKk zra! K&o?&i-TNPn4y+Ua literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_16_matte.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_16_matte.tiff new file mode 100644 index 0000000000000000000000000000000000000000..c705f06290afdda7432ec81cee05496b17bf0c2a GIT binary patch literal 2030 zcmYk7O>7fK6vtOYXxTW^2&(iz!y<8ULOwQ48$w)M zjj_aeKP0NEpmsOT0g8wn!=>uU3B5FurB;TXD_CDDtEer@0dZ+1=o@EC{FL#&?ECHi z|7ONJK7INq`glL;2rev$Rok}86rz}GR}QIXr{_Bv?nu$JbxK81tmG9|38_TIdkBX} zRNOQGq2f?=pk3%z&yw*y1Tm+g2|hVW@9ik8vafY+`FSV83nHyDA~bYwhcKr5ndj~7 zApuA^dYN@1rW=1_hIBO^HfHw_4siia5JWL2(A$k)wFH#9>-FWi*GM3&fQ|?@LN%27 zxzS*yUaY;E37LXQ;v|OYG3ojW?sZ?6!u(k|Fgv3yo4{+hJ@BzD6E>{i1 z8gfhrVl6!S(reBkJ}h;G13XX0&=Iz-6~iz#?IJ@;rKhgjtRpm@IXtC+5kj!;WxW81 zX;6?UIa@A-r=T$@>$L_HGL9*QG7FOyn2O{4$e1wVqFK*V2QvTuLYV@DZt4Zw1Qj0% z5b31nwbZm@=(_}b+SIU0rP}@XnF<~wnL*F<{<5KiGAOh$Xr@|nO6$iNk_?BVhry_3 z8m0xvZU6$^)Yji~o31O%a&M2?Qfj()iJl7Zy53*8j_O1&`ZZLd>6;2g$lH87~9Tw z%MEQ=3q_OCpz76Zt5|_2VZOGrSuyNgM1z=@!RFPpw`Cd@Y@h*ZW)14_r`H^bA(|x1 zgKE}&RD%`(F&$V|xI*ZTlW8MC98y)!ZH+p%Wmb%WV>1snOlK_?2WBD@?E%D7lXq)y z+p3s$yWU2=BJq?qukn(qX4Td|*l~12*8zem69JV#R~=L|L_Sc}R(1+++JLZK@>?;S zH8fd|Gla+4R#r{o5w?YF6MZY{e4SaY0|7_|c1Xpz07&86s=2G8)56+JyxyL5R7zqM zhj6itSfEmYVNiOos?{TisbGkyU=WW$)nZ>v*dAD8nk!Om2Kh)DpjhUp4KlRAju()D z!-0M(qX_@M3dRzNJK(_11yQ6_r=pOn?)2^=Oao(CDLQMFP1`P0K@>nk5QeZc&v&R` z`AD^5!DMuS=5j!Z!qDZp2#?~hx)`VD@X(3h73E;XwCrjw2Of;MjUz=xl#3y`&9RM0&zg5eu7idM$fB=S!$7e7&orG%hA$+)hSh-M+X-NKo zOh`NdHb11G_?Qu{3riwQjBK|FA+Hi=W#dUKym^G=jVNpclkLFdAFZ4Zoi** zL;hyR{kOO-6oz|=0|*Hm-`0Es{ttFAJstVme*PygqR)T0AEATXzV@>ObPoCXB;@aO zJo~Pncfqqs@J++@EHDb(XTKL;Le64oW%Y~vbTT!4@j^bo(3f9=cL?GX3^tYa_4LIH ziwhrJSX`R>ERyPz`x23a+@BoiPYg!RBvX-3^7++te?R;R^er(G29SN1K3_x_&(2Ow zEi9zdmoBZW+`8quPo8XV-@kw3#)}sl8&|JlJTfvlIXgQ(zPft-`sipXb>_^eQ&+Cs ty!rh3#>Ta4$B*~-4-ZdG4G)*g=gu8FmPnjGPssXuKL705*4CXn{{gC-!?^$e literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256.tiff new file mode 100644 index 0000000000000000000000000000000000000000..4e976e59ba8e05633dd64d4fe9ff09679ea9f17d GIT binary patch literal 5004 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_matte.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_matte.tiff new file mode 100644 index 0000000000000000000000000000000000000000..ff71ae78babd0df4b1afa5ad2ee32109ee8831c9 GIT binary patch literal 8402 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 DMS&3s literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_planar_separate.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_planar_separate.tiff new file mode 100644 index 0000000000000000000000000000000000000000..df4432ad8f22be2aedd1a04dacda6c0af7b36cac GIT binary patch literal 5020 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 F{y*nY5#j&< literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_12bit.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_12bit.tiff new file mode 100644 index 0000000000000000000000000000000000000000..6774cb7af56c575ee823c9fae98332e874637f67 GIT binary patch literal 164260 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

?oi>qI(^E(q7F+Q#Aa z79<3cAk09liQ+8`X+jha6^W$=vXdYhiAB?NsK0RjBC0BkRKzl46~S0T_1>eW`t^J; zoD^QYet*0B_TlSS4n4ZrJ@mFeJ}?*``cE94sPC`2^>;%$sCPpS||6bNVoO^ZI?y`SZJv9{BF%{pWgr2ZyUSeSgKPEM&!-RcNd5SMeuSP3pFO&NwyGp4=ta`}M9@zrCsAHM zm-vx?>1Vp}LAhl6THK-SBq7BelI7*3-(vkt}b8Y7rl(Zb0#NwN!qMl&+Q vSaC-l<0z1XB;J%FI3pTmAwK!He;;1dW!L|Zk89cf?XNXn!)w_-u5 +# + +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/hdf' || die 'Cd failed'; + +# +# 1) Test 256 color pseudocolor HDF +# +testRead( 'input_256.hdf', + '975cdb03f0fa923936f1cecf7b8a49a917493393a0eb098828ab710295195584' ); + +# +# 2) Test TrueColor HDF +# +++$test; +testRead( 'input_truecolor.hdf', + '975cdb03f0fa923936f1cecf7b8a49a917493393a0eb098828ab710295195584' ); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/hdf/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/hdf/write.t new file mode 100644 index 0000000..73b36a8 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/hdf/write.t @@ -0,0 +1,32 @@ +#!/usr/bin/perl +# +# Test writing HDF images +# +# Contributed by Bob Friesenhahn +# +BEGIN { $| = 1; $test=1; print "1..2\n"; } +END {print "not ok $test\n" unless $loaded;} + +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/hdf' || die 'Cd failed'; + +# +# 1) Test pseudocolor image +# +testReadWrite( 'input_256.hdf', + 'output_256.hdf', + q/quality=>54/, + '975cdb03f0fa923936f1cecf7b8a49a917493393a0eb098828ab710295195584' ); + +# +# 2) Test truecolor image +# +++$test; +testReadWrite( 'input_truecolor.hdf', + 'output_truecolor.hdf', + q/quality=>55/, + '975cdb03f0fa923936f1cecf7b8a49a917493393a0eb098828ab710295195584' ); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/hpgl/input.hpgl b/ImageMagick-6.9.12-44/PerlMagick/t/hpgl/input.hpgl new file mode 100644 index 0000000..40ea84f --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/hpgl/input.hpgl @@ -0,0 +1 @@ +IN;SP1;CA7;PU3598,4271;PD673,4271,673,7197,;PU3598,4259;PD660,4259,660,7197,;PU609,3975;PD609,3980,613,3988,618,3993,626,3997,643,3997,652,3993,656,3988,660,3980,660,3971,656,3962,648,3950,609,3907,;PU609,3975;PD613,3975,613,3980,618,3988,626,3993,643,3993,652,3988,656,3980,656,3971,652,3962,643,3950,605,3907,;PU609,3911;PD665,3911,665,3907,;PU605,3907;PD665,3907,;PU716,3997;PD703,3993,695,3980,691,3958,691,3945,695,3924,703,3911,716,3907,725,3907,738,3911,746,3924,751,3945,751,3958,746,3980,738,3993,725,3997,716,3997,;PU708,3993;PD699,3980,695,3958,695,3945,699,3924,708,3911,;PU703,3915;PD716,3911,725,3911,738,3915,;PU734,3911;PD742,3924,746,3945,746,3958,742,3980,734,3993,;PU738,3988;PD725,3993,716,3993,703,3988,;PU785,3920;PD781,3915,781,3911,785,3907,789,3907,794,3911,794,3915,789,3920,785,3920,;PU785,3915;PD785,3911,789,3911,789,3915,785,3915,;PU648,4259;PD648,4149,;PU660,4259;PD660,4149,;PU1627,3984;PD1627,3907,1631,3907,;PU1631,3997;PD1631,3907,;PU1631,3997;PD1584,3928,1648,3928,;PU1627,3984;PD1588,3928,;PU1588,3932;PD1648,3932,1648,3928,;PU1696,3997;PD1683,3993,1674,3980,1670,3958,1670,3945,1674,3924,1683,3911,1696,3907,1704,3907,1717,3911,1726,3924,1730,3945,1730,3958,1726,3980,1717,3993,1704,3997,1696,3997,;PU1687,3993;PD1678,3980,1674,3958,1674,3945,1678,3924,1687,3911,;PU1683,3915;PD1696,3911,1704,3911,1717,3915,;PU1713,3911;PD1721,3924,1726,3945,1726,3958,1721,3980,1713,3993,;PU1717,3988;PD1704,3993,1696,3993,1683,3988,;PU1764,3920;PD1760,3915,1760,3911,1764,3907,1769,3907,1773,3911,1773,3915,1769,3920,1764,3920,;PU1764,3915;PD1764,3911,1769,3911,1769,3915,1764,3915,;PU1628,4259;PD1628,4149,;PU1640,4259;PD1640,4149,;PU2610,3993;PD2615,3984,2619,3984,2615,3993,2602,3997,2593,3997,2580,3993,2572,3980,2567,3958,2567,3937,2572,3920,2580,3911,2593,3907,2597,3907,2610,3911,2619,3920,2623,3932,2623,3937,2619,3950,2610,3958,2597,3962,2593,3962,2580,3958,2572,3950,;PU2615,3988;PD2602,3993,2593,3993,2580,3988,;PU2585,3993;PD2576,3980,2572,3958,2572,3937,2576,3920,2589,3911,;PU2572,3928;PD2580,3915,2593,3911,2597,3911,2610,3915,2619,3928,;PU2602,3911;PD2615,3920,2619,3932,2619,3937,2615,3950,2602,3958,;PU2619,3941;PD2610,3954,2597,3958,2593,3958,2580,3954,2572,3941,;PU2589,3958;PD2576,3950,2572,3937,;PU2675,3997;PD2662,3993,2653,3980,2649,3958,2649,3945,2653,3924,2662,3911,2675,3907,2683,3907,2696,3911,2705,3924,2709,3945,2709,3958,2705,3980,2696,3993,2683,3997,2675,3997,;PU2666,3993;PD2658,3980,2653,3958,2653,3945,2658,3924,2666,3911,;PU2662,3915;PD2675,3911,2683,3911,2696,3915,;PU2692,3911;PD2701,3924,2705,3945,2705,3958,2701,3980,2692,3993,;PU2696,3988;PD2683,3993,2675,3993,2662,3988,;PU2744,3920;PD2739,3915,2739,3911,2744,3907,2748,3907,2752,3911,2752,3915,2748,3920,2744,3920,;PU2744,3915;PD2744,3911,2748,3911,2748,3915,2744,3915,;PU2607,4259;PD2607,4149,;PU2619,4259;PD2619,4149,;PU3564,3997;PD3551,3993,3547,3984,3547,3975,3551,3967,3555,3962,3564,3958,3581,3954,3590,3950,3594,3945,3598,3937,3598,3924,3594,3915,3581,3911,3564,3911,3551,3915,3547,3924,3547,3937,3551,3945,3555,3950,3564,3954,3581,3958,3590,3962,3594,3967,3598,3975,3598,3984,3594,3993,3581,3997,3564,3997,;PU3555,3993;PD3551,3984,3551,3975,3555,3967,3564,3962,3581,3958,3590,3954,3598,3945,3602,3937,3602,3924,3598,3915,3594,3911,3581,3907,3564,3907,3551,3911,3547,3915,3542,3924,3542,3937,3547,3945,3555,3954,3564,3958,3581,3962,3590,3967,3594,3975,3594,3984,3590,3993,;PU3594,3988;PD3581,3993,3564,3993,3551,3988,;PU3547,3920;PD3560,3911,;PU3585,3911;PD3598,3920,;PU3654,3997;PD3641,3993,3633,3980,3628,3958,3628,3945,3633,3924,3641,3911,3654,3907,3663,3907,3676,3911,3684,3924,3688,3945,3688,3958,3684,3980,3676,3993,3663,3997,3654,3997,;PU3645,3993;PD3637,3980,3633,3958,3633,3945,3637,3924,3645,3911,;PU3641,3915;PD3654,3911,3663,3911,3676,3915,;PU3671,3911;PD3680,3924,3684,3945,3684,3958,3680,3980,3671,3993,;PU3676,3988;PD3663,3993,3654,3993,3641,3988,;PU3723,3920;PD3718,3915,3718,3911,3723,3907,3727,3907,3731,3911,3731,3915,3727,3920,3723,3920,;PU3723,3915;PD3723,3911,3727,3911,3727,3915,3723,3915,;PU3586,4259;PD3586,4149,;PU3598,4259;PD3598,4149,;PU273,4294;PD261,4290,252,4277,248,4256,248,4243,252,4221,261,4208,273,4204,282,4204,295,4208,304,4221,308,4243,308,4256,304,4277,295,4290,282,4294,273,4294,;PU265,4290;PD256,4277,252,4256,252,4243,256,4221,265,4208,;PU261,4213;PD273,4208,282,4208,295,4213,;PU291,4208;PD299,4221,304,4243,304,4256,299,4277,291,4290,;PU295,4286;PD282,4290,273,4290,261,4286,;PU342,4217;PD338,4213,338,4208,342,4204,347,4204,351,4208,351,4213,347,4217,342,4217,;PU342,4213;PD342,4208,347,4208,347,4213,342,4213,;PU407,4294;PD394,4290,385,4277,381,4256,381,4243,385,4221,394,4208,407,4204,415,4204,428,4208,437,4221,441,4243,441,4256,437,4277,428,4290,415,4294,407,4294,;PU398,4290;PD389,4277,385,4256,385,4243,389,4221,398,4208,;PU394,4213;PD407,4208,415,4208,428,4213,;PU424,4208;PD432,4221,437,4243,437,4256,432,4277,424,4290,;PU428,4286;PD415,4290,407,4290,394,4286,;PU660,4271;PD550,4271,;PU660,4259;PD550,4259,;PU252,4860;PD252,4865,256,4873,261,4878,269,4882,286,4882,295,4878,299,4873,304,4865,304,4856,299,4848,291,4835,252,4792,;PU252,4860;PD256,4860,256,4865,261,4873,269,4878,286,4878,295,4873,299,4865,299,4856,295,4848,286,4835,248,4792,;PU252,4796;PD308,4796,308,4792,;PU248,4792;PD308,4792,;PU342,4805;PD338,4800,338,4796,342,4792,347,4792,351,4796,351,4800,347,4805,342,4805,;PU342,4800;PD342,4796,347,4796,347,4800,342,4800,;PU407,4882;PD394,4878,385,4865,381,4843,381,4830,385,4809,394,4796,407,4792,415,4792,428,4796,437,4809,441,4830,441,4843,437,4865,428,4878,415,4882,407,4882,;PU398,4878;PD389,4865,385,4843,385,4830,389,4809,398,4796,;PU394,4800;PD407,4796,415,4796,428,4800,;PU424,4796;PD432,4809,437,4830,437,4843,432,4865,424,4878,;PU428,4873;PD415,4878,407,4878,394,4873,;PU660,4859;PD550,4859,;PU660,4847;PD550,4847,;PU291,5457;PD291,5379,295,5379,;PU295,5469;PD295,5379,;PU295,5469;PD248,5401,312,5401,;PU291,5457;PD252,5401,;PU252,5405;PD312,5405,312,5401,;PU342,5392;PD338,5388,338,5384,342,5379,347,5379,351,5384,351,5388,347,5392,342,5392,;PU342,5388;PD342,5384,347,5384,347,5388,342,5388,;PU407,5469;PD394,5465,385,5452,381,5431,381,5418,385,5396,394,5384,407,5379,415,5379,428,5384,437,5396,441,5418,441,5431,437,5452,428,5465,415,5469,407,5469,;PU398,5465;PD389,5452,385,5431,385,5418,389,5396,398,5384,;PU394,5388;PD407,5384,415,5384,428,5388,;PU424,5384;PD432,5396,437,5418,437,5431,432,5452,424,5465,;PU428,5461;PD415,5465,407,5465,394,5461,;PU660,5446;PD550,5446,;PU660,5434;PD550,5434,;PU295,6053;PD299,6044,304,6044,299,6053,286,6057,278,6057,265,6053,256,6040,252,6018,252,5997,256,5980,265,5971,278,5967,282,5967,295,5971,304,5980,308,5993,308,5997,304,6010,295,6018,282,6023,278,6023,265,6018,256,6010,;PU299,6048;PD286,6053,278,6053,265,6048,;PU269,6053;PD261,6040,256,6018,256,5997,261,5980,273,5971,;PU256,5988;PD265,5975,278,5971,282,5971,295,5975,304,5988,;PU286,5971;PD299,5980,304,5993,304,5997,299,6010,286,6018,;PU304,6001;PD295,6014,282,6018,278,6018,265,6014,256,6001,;PU273,6018;PD261,6010,256,5997,;PU342,5980;PD338,5975,338,5971,342,5967,347,5967,351,5971,351,5975,347,5980,342,5980,;PU342,5975;PD342,5971,347,5971,347,5975,342,5975,;PU407,6057;PD394,6053,385,6040,381,6018,381,6005,385,5984,394,5971,407,5967,415,5967,428,5971,437,5984,441,6005,441,6018,437,6040,428,6053,415,6057,407,6057,;PU398,6053;PD389,6040,385,6018,385,6005,389,5984,398,5971,;PU394,5975;PD407,5971,415,5971,428,5975,;PU424,5971;PD432,5984,437,6005,437,6018,432,6040,424,6053,;PU428,6048;PD415,6053,407,6053,394,6048,;PU660,6034;PD550,6034,;PU660,6022;PD550,6022,;PU269,6645;PD256,6640,252,6632,252,6623,256,6614,261,6610,269,6606,286,6602,295,6597,299,6593,304,6584,304,6571,299,6563,286,6559,269,6559,256,6563,252,6571,252,6584,256,6593,261,6597,269,6602,286,6606,295,6610,299,6614,304,6623,304,6632,299,6640,286,6645,269,6645,;PU261,6640;PD256,6632,256,6623,261,6614,269,6610,286,6606,295,6602,304,6593,308,6584,308,6571,304,6563,299,6559,286,6554,269,6554,256,6559,252,6563,248,6571,248,6584,252,6593,261,6602,269,6606,286,6610,295,6614,299,6623,299,6632,295,6640,;PU299,6636;PD286,6640,269,6640,256,6636,;PU252,6567;PD265,6559,;PU291,6559;PD304,6567,;PU342,6567;PD338,6563,338,6559,342,6554,347,6554,351,6559,351,6563,347,6567,342,6567,;PU342,6563;PD342,6559,347,6559,347,6563,342,6563,;PU407,6645;PD394,6640,385,6627,381,6606,381,6593,385,6571,394,6559,407,6554,415,6554,428,6559,437,6571,441,6593,441,6606,437,6627,428,6640,415,6645,407,6645,;PU398,6640;PD389,6627,385,6606,385,6593,389,6571,398,6559,;PU394,6563;PD407,6559,415,6559,428,6563,;PU424,6559;PD432,6571,437,6593,437,6606,432,6627,424,6640,;PU428,6636;PD415,6640,407,6640,394,6636,;PU660,6621;PD550,6621,;PU660,6609;PD550,6609,;PU226,7215;PD235,7219,248,7232,248,7142,;PU226,7215;PD226,7211,235,7215,243,7223,243,7142,248,7142,;PU325,7232;PD312,7228,304,7215,299,7193,299,7181,304,7159,312,7146,325,7142,334,7142,347,7146,355,7159,359,7181,359,7193,355,7215,347,7228,334,7232,325,7232,;PU316,7228;PD308,7215,304,7193,304,7181,308,7159,316,7146,;PU312,7150;PD325,7146,334,7146,347,7150,;PU342,7146;PD351,7159,355,7181,355,7193,351,7215,342,7228,;PU347,7223;PD334,7228,325,7228,312,7223,;PU394,7155;PD389,7150,389,7146,394,7142,398,7142,402,7146,402,7150,398,7155,394,7155,;PU394,7150;PD394,7146,398,7146,398,7150,394,7150,;PU458,7232;PD445,7228,437,7215,432,7193,432,7181,437,7159,445,7146,458,7142,467,7142,480,7146,488,7159,493,7181,493,7193,488,7215,480,7228,467,7232,458,7232,;PU450,7228;PD441,7215,437,7193,437,7181,441,7159,450,7146,;PU445,7150;PD458,7146,467,7146,480,7150,;PU475,7146;PD484,7159,488,7181,488,7193,484,7215,475,7228,;PU480,7223;PD467,7228,458,7228,445,7223,;PU660,7209;PD550,7209,;PU660,7197;PD550,7197,;PU;SP2;PU660,4318;PD685,4321,709,4324,734,4328,758,4331,783,4335,807,4338,832,4342,856,4346,881,4350,905,4354,930,4358,954,4362,979,4366,1003,4371,1028,4375,1052,4380,1077,4385,1101,4390,1126,4395,1150,4401,1175,4406,1199,4412,1224,4418,1248,4424,1273,4430,1297,4436,1321,4443,1346,4450,1370,4457,1395,4464,1419,4472,1444,4480,1468,4488,1493,4496,1517,4505,1542,4514,1566,4523,1591,4533,1615,4543,1640,4553,1664,4563,1689,4574,1713,4586,1738,4597,1762,4609,1787,4621,1811,4634,1836,4647,1860,4660,1885,4674,1909,4688,1933,4702,1958,4717,1982,4732,2007,4747,2031,4763,2056,4779,2080,4796,2105,4812,2129,4829,2154,4847,2178,4864,2203,4882,2227,4900,2252,4918,2276,4936,2301,4955,2325,4973,2350,4992,2374,5011,2399,5030,2423,5049,2448,5068,2472,5087,2497,5106,2521,5125,2546,5144,2570,5163,2594,5182,2619,5201,2643,5220,2668,5239,2692,5258,2717,5277,2741,5296,2766,5315,2790,5334,2815,5353,2839,5372,2864,5392,2888,5411,2913,5431,2937,5451,2962,5472,2986,5494,3011,5515,3035,5538,3060,5562,3084,5586,3109,5612,3133,5639,3158,5668,3182,5698,3206,5730,3231,5764,3255,5799,3280,5838,3304,5878,3329,5921,3353,5966,3378,6013,3402,6063,3427,6116,3451,6170,3476,6226,3500,6284,3525,6344,3549,6404,3574,6465,3598,6526,;PU;SP3;PU660,4310;PD685,4314,709,4318,734,4321,758,4325,783,4329,807,4333,832,4337,856,4340,881,4344,905,4348,930,4351,954,4355,979,4358,1003,4362,1028,4365,1052,4369,1077,4372,1101,4376,1126,4379,1150,4383,1175,4386,1199,4390,1224,4394,1248,4397,1273,4401,1297,4404,1321,4408,1346,4412,1370,4415,1395,4419,1419,4423,1444,4427,1468,4431,1493,4434,1517,4439,1542,4443,1566,4447,1591,4451,1615,4455,1640,4460,1664,4465,1689,4469,1713,4474,1738,4479,1762,4484,1787,4489,1811,4495,1836,4500,1860,4506,1885,4512,1909,4518,1933,4524,1958,4530,1982,4537,2007,4544,2031,4551,2056,4558,2080,4565,2105,4572,2129,4580,2154,4588,2178,4596,2203,4604,2227,4613,2252,4621,2276,4630,2301,4639,2325,4648,2350,4657,2374,4667,2399,4676,2423,4686,2448,4696,2472,4706,2497,4716,2521,4727,2546,4737,2570,4748,2594,4758,2619,4769,2643,4780,2668,4791,2692,4803,2717,4814,2741,4826,2766,4838,2790,4850,2815,4863,2839,4876,2864,4889,2888,4903,2913,4917,2937,4932,2962,4947,2986,4963,3011,4980,3035,4997,3060,5016,3084,5036,3109,5057,3133,5079,3158,5103,3182,5128,3206,5156,3231,5185,3255,5216,3280,5249,3304,5284,3329,5322,3353,5362,3378,5404,3402,5448,3427,5494,3451,5543,3476,5592,3500,5644,3525,5696,3549,5749,3574,5803,3598,5857,;PU;SP2;PU4479,4259;PD4504,4325,4528,4326,4553,4327,4577,4329,4602,4331,4626,4332,4651,4334,4675,4336,4700,4338,4724,4340,4749,4342,4773,4345,4798,4347,4822,4350,4847,4352,4871,4355,4896,4358,4920,4361,4945,4364,4969,4368,4994,4371,5018,4375,5043,4378,5067,4382,5092,4386,5116,4390,5140,4395,5165,4399,5189,4404,5214,4409,5238,4414,5263,4419,5287,4424,5312,4430,5336,4436,5361,4441,5385,4447,5410,4454,5434,4460,5459,4466,5483,4473,5508,4480,5532,4486,5557,4493,5581,4500,5606,4508,5630,4515,5655,4522,5679,4529,5704,4536,5728,4543,5752,4550,5777,4557,5801,4564,5826,4571,5850,4577,5875,4584,5899,4590,5924,4596,5948,4601,5973,4607,5997,4612,6022,4616,6046,4620,6071,4624,6095,4628,6120,4631,6144,4633,6169,4636,6193,4637,6218,4639,6242,4640,6267,4641,6291,4641,6316,4641,6340,4641,6365,4641,6389,4640,6413,4639,6438,4639,6462,4638,6487,4637,6511,4637,6536,4637,6560,4637,6585,4638,6609,4640,6634,4642,6658,4645,6683,4649,6707,4655,6732,4661,6756,4670,6781,4680,6805,4692,6830,4706,6854,4722,6879,4741,6903,4763,6928,4787,6952,4815,6977,4846,7001,4880,7025,4916,7050,4956,7074,4999,7099,5044,7123,5091,7148,5139,7172,5187,7197,5235,7221,5282,7246,5326,7270,5366,7295,5402,7319,5432,7344,5456,7368,5473,7393,5482,7417,4259,;PU;SP3;PU4479,4259;PD4504,4337,4528,4336,4553,4336,4577,4335,4602,4334,4626,4334,4651,4333,4675,4333,4700,4332,4724,4332,4749,4331,4773,4331,4798,4330,4822,4330,4847,4330,4871,4330,4896,4330,4920,4329,4945,4329,4969,4329,4994,4330,5018,4330,5043,4330,5067,4330,5092,4331,5116,4331,5140,4332,5165,4333,5189,4333,5214,4334,5238,4335,5263,4337,5287,4338,5312,4339,5336,4341,5361,4342,5385,4344,5410,4346,5434,4348,5459,4350,5483,4352,5508,4354,5532,4357,5557,4360,5581,4362,5606,4365,5630,4368,5655,4371,5679,4375,5704,4378,5728,4381,5752,4385,5777,4388,5801,4392,5826,4396,5850,4399,5875,4403,5899,4407,5924,4411,5948,4414,5973,4418,5997,4422,6022,4426,6046,4429,6071,4433,6095,4436,6120,4440,6144,4443,6169,4446,6193,4449,6218,4452,6242,4455,6267,4458,6291,4461,6316,4464,6340,4467,6365,4470,6389,4472,6413,4475,6438,4478,6462,4482,6487,4485,6511,4488,6536,4492,6560,4497,6585,4502,6609,4507,6634,4513,6658,4520,6683,4528,6707,4537,6732,4548,6756,4559,6781,4572,6805,4587,6830,4604,6854,4623,6879,4644,6903,4667,6928,4693,6952,4721,6977,4752,7001,4786,7025,4822,7050,4861,7074,4902,7099,4944,7123,4989,7148,5033,7172,5078,7197,5122,7221,5164,7246,5204,7270,5239,7295,5270,7319,5295,7344,5315,7368,5327,7393,5333,7417,4259,;PU;SP1;LT4,2.5;PU4479,7197;PD4504,6779,4528,6744,4553,6709,4577,6673,4602,6636,4626,6598,4651,6559,4675,6520,4700,6481,4724,6442,4749,6402,4773,6363,4798,6324,4822,6285,4847,6246,4871,6208,4896,6170,4920,6133,4945,6097,4969,6062,4994,6027,5018,5994,5043,5962,5067,5931,5092,5901,5116,5873,5140,5846,5165,5820,5189,5796,5214,5774,5238,5752,5263,5732,5287,5714,5312,5698,5336,5682,5361,5668,5385,5655,5410,5645,5434,5634,5459,5626,5483,5619,5508,5613,5532,5608,5557,5605,5581,5602,5606,5600,5630,5600,5655,5600,5679,5601,5704,5604,5728,5607,5752,5610,5777,5615,5801,5620,5826,5626,5850,5632,5875,5640,5899,5647,5924,5655,5948,5664,5973,5673,5997,5683,6022,5693,6046,5703,6071,5714,6095,5725,6120,5737,6144,5749,6169,5762,6193,5774,6218,5788,6242,5802,6267,5816,6291,5831,6316,5846,6340,5861,6365,5878,6389,5894,6413,5911,6438,5929,6462,5947,6487,5966,6511,5985,6536,6005,6560,6025,6585,6046,6609,6068,6634,6090,6658,6112,6683,6134,6707,6157,6732,6179,6756,6202,6781,6224,6805,6245,6830,6266,6854,6286,6879,6304,6903,6322,6928,6338,6952,6353,6977,6367,7001,6379,7025,6389,7050,6398,7074,6406,7099,6413,7123,6418,7148,6422,7172,6425,7197,6427,7221,6429,7246,6429,7270,6429,7295,6428,7319,6426,7344,6424,7368,6422,7393,6418,7417,7197,;LT;PU7405,7197;PD7405,4271,4479,4271,;PU7417,7197;PD7417,4259,4479,4259,;PU4428,3975;PD4428,3980,4432,3988,4437,3993,4445,3997,4462,3997,4471,3993,4475,3988,4479,3980,4479,3971,4475,3962,4467,3950,4428,3907,;PU4428,3975;PD4432,3975,4432,3980,4437,3988,4445,3993,4462,3993,4471,3988,4475,3980,4475,3971,4471,3962,4462,3950,4424,3907,;PU4428,3911;PD4484,3911,4484,3907,;PU4424,3907;PD4484,3907,;PU4535,3997;PD4522,3993,4514,3980,4510,3958,4510,3945,4514,3924,4522,3911,4535,3907,4544,3907,4557,3911,4565,3924,4570,3945,4570,3958,4565,3980,4557,3993,4544,3997,4535,3997,;PU4527,3993;PD4518,3980,4514,3958,4514,3945,4518,3924,4527,3911,;PU4522,3915;PD4535,3911,4544,3911,4557,3915,;PU4553,3911;PD4561,3924,4565,3945,4565,3958,4561,3980,4553,3993,;PU4557,3988;PD4544,3993,4535,3993,4522,3988,;PU4604,3920;PD4600,3915,4600,3911,4604,3907,4608,3907,4613,3911,4613,3915,4608,3920,4604,3920,;PU4604,3915;PD4604,3911,4608,3911,4608,3915,4604,3915,;PU4467,4259;PD4467,4149,;PU4479,4259;PD4479,4149,;PU5446,3984;PD5446,3907,5450,3907,;PU5450,3997;PD5450,3907,;PU5450,3997;PD5403,3928,5467,3928,;PU5446,3984;PD5407,3928,;PU5407,3932;PD5467,3932,5467,3928,;PU5515,3997;PD5502,3993,5493,3980,5489,3958,5489,3945,5493,3924,5502,3911,5515,3907,5523,3907,5536,3911,5545,3924,5549,3945,5549,3958,5545,3980,5536,3993,5523,3997,5515,3997,;PU5506,3993;PD5497,3980,5493,3958,5493,3945,5497,3924,5506,3911,;PU5502,3915;PD5515,3911,5523,3911,5536,3915,;PU5532,3911;PD5540,3924,5545,3945,5545,3958,5540,3980,5532,3993,;PU5536,3988;PD5523,3993,5515,3993,5502,3988,;PU5583,3920;PD5579,3915,5579,3911,5583,3907,5588,3907,5592,3911,5592,3915,5588,3920,5583,3920,;PU5583,3915;PD5583,3911,5588,3911,5588,3915,5583,3915,;PU5447,4259;PD5447,4149,;PU5459,4259;PD5459,4149,;PU6429,3993;PD6434,3984,6438,3984,6434,3993,6421,3997,6412,3997,6399,3993,6391,3980,6386,3958,6386,3937,6391,3920,6399,3911,6412,3907,6416,3907,6429,3911,6438,3920,6442,3932,6442,3937,6438,3950,6429,3958,6416,3962,6412,3962,6399,3958,6391,3950,;PU6434,3988;PD6421,3993,6412,3993,6399,3988,;PU6404,3993;PD6395,3980,6391,3958,6391,3937,6395,3920,6408,3911,;PU6391,3928;PD6399,3915,6412,3911,6416,3911,6429,3915,6438,3928,;PU6421,3911;PD6434,3920,6438,3932,6438,3937,6434,3950,6421,3958,;PU6438,3941;PD6429,3954,6416,3958,6412,3958,6399,3954,6391,3941,;PU6408,3958;PD6395,3950,6391,3937,;PU6494,3997;PD6481,3993,6472,3980,6468,3958,6468,3945,6472,3924,6481,3911,6494,3907,6502,3907,6515,3911,6524,3924,6528,3945,6528,3958,6524,3980,6515,3993,6502,3997,6494,3997,;PU6485,3993;PD6477,3980,6472,3958,6472,3945,6477,3924,6485,3911,;PU6481,3915;PD6494,3911,6502,3911,6515,3915,;PU6511,3911;PD6520,3924,6524,3945,6524,3958,6520,3980,6511,3993,;PU6515,3988;PD6502,3993,6494,3993,6481,3988,;PU6563,3920;PD6558,3915,6558,3911,6563,3907,6567,3907,6571,3911,6571,3915,6567,3920,6563,3920,;PU6563,3915;PD6563,3911,6567,3911,6567,3915,6563,3915,;PU6426,4259;PD6426,4149,;PU6438,4259;PD6438,4149,;PU7383,3997;PD7370,3993,7366,3984,7366,3975,7370,3967,7374,3962,7383,3958,7400,3954,7409,3950,7413,3945,7417,3937,7417,3924,7413,3915,7400,3911,7383,3911,7370,3915,7366,3924,7366,3937,7370,3945,7374,3950,7383,3954,7400,3958,7409,3962,7413,3967,7417,3975,7417,3984,7413,3993,7400,3997,7383,3997,;PU7374,3993;PD7370,3984,7370,3975,7374,3967,7383,3962,7400,3958,7409,3954,7417,3945,7421,3937,7421,3924,7417,3915,7413,3911,7400,3907,7383,3907,7370,3911,7366,3915,7361,3924,7361,3937,7366,3945,7374,3954,7383,3958,7400,3962,7409,3967,7413,3975,7413,3984,7409,3993,;PU7413,3988;PD7400,3993,7383,3993,7370,3988,;PU7366,3920;PD7379,3911,;PU7404,3911;PD7417,3920,;PU7473,3997;PD7460,3993,7452,3980,7447,3958,7447,3945,7452,3924,7460,3911,7473,3907,7482,3907,7495,3911,7503,3924,7507,3945,7507,3958,7503,3980,7495,3993,7482,3997,7473,3997,;PU7464,3993;PD7456,3980,7452,3958,7452,3945,7456,3924,7464,3911,;PU7460,3915;PD7473,3911,7482,3911,7495,3915,;PU7490,3911;PD7499,3924,7503,3945,7503,3958,7499,3980,7490,3993,;PU7495,3988;PD7482,3993,7473,3993,7460,3988,;PU7542,3920;PD7537,3915,7537,3911,7542,3907,7546,3907,7550,3911,7550,3915,7546,3920,7542,3920,;PU7542,3915;PD7542,3911,7546,3911,7546,3915,7542,3915,;PU7405,4259;PD7405,4149,;PU7417,4259;PD7417,4149,;PU7417,4247;PD7527,4247,;PU7417,4259;PD7527,4259,;PU7417,4835;PD7527,4835,;PU7417,4847;PD7527,4847,;PU7417,5422;PD7527,5422,;PU7417,5434;PD7527,5434,;PU7417,6010;PD7527,6010,;PU7417,6022;PD7527,6022,;PU7417,6597;PD7527,6597,;PU7417,6609;PD7527,6609,;PU7417,7185;PD7527,7185,;PU7417,7197;PD7527,7197,;PU7417,4271;PD4492,4271,4492,7197,;PU7417,4259;PD4479,4259,4479,7197,;PU4428,3975;PD4428,3980,4432,3988,4437,3993,4445,3997,4462,3997,4471,3993,4475,3988,4479,3980,4479,3971,4475,3962,4467,3950,4428,3907,;PU4428,3975;PD4432,3975,4432,3980,4437,3988,4445,3993,4462,3993,4471,3988,4475,3980,4475,3971,4471,3962,4462,3950,4424,3907,;PU4428,3911;PD4484,3911,4484,3907,;PU4424,3907;PD4484,3907,;PU4535,3997;PD4522,3993,4514,3980,4510,3958,4510,3945,4514,3924,4522,3911,4535,3907,4544,3907,4557,3911,4565,3924,4570,3945,4570,3958,4565,3980,4557,3993,4544,3997,4535,3997,;PU4527,3993;PD4518,3980,4514,3958,4514,3945,4518,3924,4527,3911,;PU4522,3915;PD4535,3911,4544,3911,4557,3915,;PU4553,3911;PD4561,3924,4565,3945,4565,3958,4561,3980,4553,3993,;PU4557,3988;PD4544,3993,4535,3993,4522,3988,;PU4604,3920;PD4600,3915,4600,3911,4604,3907,4608,3907,4613,3911,4613,3915,4608,3920,4604,3920,;PU4604,3915;PD4604,3911,4608,3911,4608,3915,4604,3915,;PU4467,4259;PD4467,4149,;PU4479,4259;PD4479,4149,;PU5446,3984;PD5446,3907,5450,3907,;PU5450,3997;PD5450,3907,;PU5450,3997;PD5403,3928,5467,3928,;PU5446,3984;PD5407,3928,;PU5407,3932;PD5467,3932,5467,3928,;PU5515,3997;PD5502,3993,5493,3980,5489,3958,5489,3945,5493,3924,5502,3911,5515,3907,5523,3907,5536,3911,5545,3924,5549,3945,5549,3958,5545,3980,5536,3993,5523,3997,5515,3997,;PU5506,3993;PD5497,3980,5493,3958,5493,3945,5497,3924,5506,3911,;PU5502,3915;PD5515,3911,5523,3911,5536,3915,;PU5532,3911;PD5540,3924,5545,3945,5545,3958,5540,3980,5532,3993,;PU5536,3988;PD5523,3993,5515,3993,5502,3988,;PU5583,3920;PD5579,3915,5579,3911,5583,3907,5588,3907,5592,3911,5592,3915,5588,3920,5583,3920,;PU5583,3915;PD5583,3911,5588,3911,5588,3915,5583,3915,;PU5447,4259;PD5447,4149,;PU5459,4259;PD5459,4149,;PU6429,3993;PD6434,3984,6438,3984,6434,3993,6421,3997,6412,3997,6399,3993,6391,3980,6386,3958,6386,3937,6391,3920,6399,3911,6412,3907,6416,3907,6429,3911,6438,3920,6442,3932,6442,3937,6438,3950,6429,3958,6416,3962,6412,3962,6399,3958,6391,3950,;PU6434,3988;PD6421,3993,6412,3993,6399,3988,;PU6404,3993;PD6395,3980,6391,3958,6391,3937,6395,3920,6408,3911,;PU6391,3928;PD6399,3915,6412,3911,6416,3911,6429,3915,6438,3928,;PU6421,3911;PD6434,3920,6438,3932,6438,3937,6434,3950,6421,3958,;PU6438,3941;PD6429,3954,6416,3958,6412,3958,6399,3954,6391,3941,;PU6408,3958;PD6395,3950,6391,3937,;PU6494,3997;PD6481,3993,6472,3980,6468,3958,6468,3945,6472,3924,6481,3911,6494,3907,6502,3907,6515,3911,6524,3924,6528,3945,6528,3958,6524,3980,6515,3993,6502,3997,6494,3997,;PU6485,3993;PD6477,3980,6472,3958,6472,3945,6477,3924,6485,3911,;PU6481,3915;PD6494,3911,6502,3911,6515,3915,;PU6511,3911;PD6520,3924,6524,3945,6524,3958,6520,3980,6511,3993,;PU6515,3988;PD6502,3993,6494,3993,6481,3988,;PU6563,3920;PD6558,3915,6558,3911,6563,3907,6567,3907,6571,3911,6571,3915,6567,3920,6563,3920,;PU6563,3915;PD6563,3911,6567,3911,6567,3915,6563,3915,;PU6426,4259;PD6426,4149,;PU6438,4259;PD6438,4149,;PU7383,3997;PD7370,3993,7366,3984,7366,3975,7370,3967,7374,3962,7383,3958,7400,3954,7409,3950,7413,3945,7417,3937,7417,3924,7413,3915,7400,3911,7383,3911,7370,3915,7366,3924,7366,3937,7370,3945,7374,3950,7383,3954,7400,3958,7409,3962,7413,3967,7417,3975,7417,3984,7413,3993,7400,3997,7383,3997,;PU7374,3993;PD7370,3984,7370,3975,7374,3967,7383,3962,7400,3958,7409,3954,7417,3945,7421,3937,7421,3924,7417,3915,7413,3911,7400,3907,7383,3907,7370,3911,7366,3915,7361,3924,7361,3937,7366,3945,7374,3954,7383,3958,7400,3962,7409,3967,7413,3975,7413,3984,7409,3993,;PU7413,3988;PD7400,3993,7383,3993,7370,3988,;PU7366,3920;PD7379,3911,;PU7404,3911;PD7417,3920,;PU7473,3997;PD7460,3993,7452,3980,7447,3958,7447,3945,7452,3924,7460,3911,7473,3907,7482,3907,7495,3911,7503,3924,7507,3945,7507,3958,7503,3980,7495,3993,7482,3997,7473,3997,;PU7464,3993;PD7456,3980,7452,3958,7452,3945,7456,3924,7464,3911,;PU7460,3915;PD7473,3911,7482,3911,7495,3915,;PU7490,3911;PD7499,3924,7503,3945,7503,3958,7499,3980,7490,3993,;PU7495,3988;PD7482,3993,7473,3993,7460,3988,;PU7542,3920;PD7537,3915,7537,3911,7542,3907,7546,3907,7550,3911,7550,3915,7546,3920,7542,3920,;PU7542,3915;PD7542,3911,7546,3911,7546,3915,7542,3915,;PU7405,4259;PD7405,4149,;PU7417,4259;PD7417,4149,;PU4092,4294;PD4080,4290,4071,4277,4067,4256,4067,4243,4071,4221,4080,4208,4092,4204,4101,4204,4114,4208,4123,4221,4127,4243,4127,4256,4123,4277,4114,4290,4101,4294,4092,4294,;PU4084,4290;PD4075,4277,4071,4256,4071,4243,4075,4221,4084,4208,;PU4080,4213;PD4092,4208,4101,4208,4114,4213,;PU4110,4208;PD4118,4221,4123,4243,4123,4256,4118,4277,4110,4290,;PU4114,4286;PD4101,4290,4092,4290,4080,4286,;PU4161,4217;PD4157,4213,4157,4208,4161,4204,4166,4204,4170,4208,4170,4213,4166,4217,4161,4217,;PU4161,4213;PD4161,4208,4166,4208,4166,4213,4161,4213,;PU4226,4294;PD4213,4290,4204,4277,4200,4256,4200,4243,4204,4221,4213,4208,4226,4204,4234,4204,4247,4208,4256,4221,4260,4243,4260,4256,4256,4277,4247,4290,4234,4294,4226,4294,;PU4217,4290;PD4208,4277,4204,4256,4204,4243,4208,4221,4217,4208,;PU4213,4213;PD4226,4208,4234,4208,4247,4213,;PU4243,4208;PD4251,4221,4256,4243,4256,4256,4251,4277,4243,4290,;PU4247,4286;PD4234,4290,4226,4290,4213,4286,;PU4479,4271;PD4369,4271,;PU4479,4259;PD4369,4259,;PU4092,4882;PD4080,4878,4071,4865,4067,4843,4067,4830,4071,4809,4080,4796,4092,4792,4101,4792,4114,4796,4123,4809,4127,4830,4127,4843,4123,4865,4114,4878,4101,4882,4092,4882,;PU4084,4878;PD4075,4865,4071,4843,4071,4830,4075,4809,4084,4796,;PU4080,4800;PD4092,4796,4101,4796,4114,4800,;PU4110,4796;PD4118,4809,4123,4830,4123,4843,4118,4865,4110,4878,;PU4114,4873;PD4101,4878,4092,4878,4080,4873,;PU4161,4805;PD4157,4800,4157,4796,4161,4792,4166,4792,4170,4796,4170,4800,4166,4805,4161,4805,;PU4161,4800;PD4161,4796,4166,4796,4166,4800,4161,4800,;PU4204,4860;PD4204,4865,4208,4873,4213,4878,4221,4882,4239,4882,4247,4878,4251,4873,4256,4865,4256,4856,4251,4848,4243,4835,4204,4792,;PU4204,4860;PD4208,4860,4208,4865,4213,4873,4221,4878,4239,4878,4247,4873,4251,4865,4251,4856,4247,4848,4239,4835,4200,4792,;PU4204,4796;PD4260,4796,4260,4792,;PU4200,4792;PD4260,4792,;PU4479,4859;PD4369,4859,;PU4479,4847;PD4369,4847,;PU4092,5469;PD4080,5465,4071,5452,4067,5431,4067,5418,4071,5396,4080,5384,4092,5379,4101,5379,4114,5384,4123,5396,4127,5418,4127,5431,4123,5452,4114,5465,4101,5469,4092,5469,;PU4084,5465;PD4075,5452,4071,5431,4071,5418,4075,5396,4084,5384,;PU4080,5388;PD4092,5384,4101,5384,4114,5388,;PU4110,5384;PD4118,5396,4123,5418,4123,5431,4118,5452,4110,5465,;PU4114,5461;PD4101,5465,4092,5465,4080,5461,;PU4161,5392;PD4157,5388,4157,5384,4161,5379,4166,5379,4170,5384,4170,5388,4166,5392,4161,5392,;PU4161,5388;PD4161,5384,4166,5384,4166,5388,4161,5388,;PU4243,5457;PD4243,5379,4247,5379,;PU4247,5469;PD4247,5379,;PU4247,5469;PD4200,5401,4264,5401,;PU4243,5457;PD4204,5401,;PU4204,5405;PD4264,5405,4264,5401,;PU4479,5446;PD4369,5446,;PU4479,5434;PD4369,5434,;PU4092,6057;PD4080,6053,4071,6040,4067,6018,4067,6005,4071,5984,4080,5971,4092,5967,4101,5967,4114,5971,4123,5984,4127,6005,4127,6018,4123,6040,4114,6053,4101,6057,4092,6057,;PU4084,6053;PD4075,6040,4071,6018,4071,6005,4075,5984,4084,5971,;PU4080,5975;PD4092,5971,4101,5971,4114,5975,;PU4110,5971;PD4118,5984,4123,6005,4123,6018,4118,6040,4110,6053,;PU4114,6048;PD4101,6053,4092,6053,4080,6048,;PU4161,5980;PD4157,5975,4157,5971,4161,5967,4166,5967,4170,5971,4170,5975,4166,5980,4161,5980,;PU4161,5975;PD4161,5971,4166,5971,4166,5975,4161,5975,;PU4247,6053;PD4251,6044,4256,6044,4251,6053,4239,6057,4230,6057,4217,6053,4208,6040,4204,6018,4204,5997,4208,5980,4217,5971,4230,5967,4234,5967,4247,5971,4256,5980,4260,5993,4260,5997,4256,6010,4247,6018,4234,6023,4230,6023,4217,6018,4208,6010,;PU4251,6048;PD4239,6053,4230,6053,4217,6048,;PU4221,6053;PD4213,6040,4208,6018,4208,5997,4213,5980,4226,5971,;PU4208,5988;PD4217,5975,4230,5971,4234,5971,4247,5975,4256,5988,;PU4239,5971;PD4251,5980,4256,5993,4256,5997,4251,6010,4239,6018,;PU4256,6001;PD4247,6014,4234,6018,4230,6018,4217,6014,4208,6001,;PU4226,6018;PD4213,6010,4208,5997,;PU4479,6034;PD4369,6034,;PU4479,6022;PD4369,6022,;PU4092,6645;PD4080,6640,4071,6627,4067,6606,4067,6593,4071,6571,4080,6559,4092,6554,4101,6554,4114,6559,4123,6571,4127,6593,4127,6606,4123,6627,4114,6640,4101,6645,4092,6645,;PU4084,6640;PD4075,6627,4071,6606,4071,6593,4075,6571,4084,6559,;PU4080,6563;PD4092,6559,4101,6559,4114,6563,;PU4110,6559;PD4118,6571,4123,6593,4123,6606,4118,6627,4110,6640,;PU4114,6636;PD4101,6640,4092,6640,4080,6636,;PU4161,6567;PD4157,6563,4157,6559,4161,6554,4166,6554,4170,6559,4170,6563,4166,6567,4161,6567,;PU4161,6563;PD4161,6559,4166,6559,4166,6563,4161,6563,;PU4221,6645;PD4208,6640,4204,6632,4204,6623,4208,6614,4213,6610,4221,6606,4239,6602,4247,6597,4251,6593,4256,6584,4256,6571,4251,6563,4239,6559,4221,6559,4208,6563,4204,6571,4204,6584,4208,6593,4213,6597,4221,6602,4239,6606,4247,6610,4251,6614,4256,6623,4256,6632,4251,6640,4239,6645,4221,6645,;PU4213,6640;PD4208,6632,4208,6623,4213,6614,4221,6610,4239,6606,4247,6602,4256,6593,4260,6584,4260,6571,4256,6563,4251,6559,4239,6554,4221,6554,4208,6559,4204,6563,4200,6571,4200,6584,4204,6593,4213,6602,4221,6606,4239,6610,4247,6614,4251,6623,4251,6632,4247,6640,;PU4251,6636;PD4239,6640,4221,6640,4208,6636,;PU4204,6567;PD4217,6559,;PU4243,6559;PD4256,6567,;PU4479,6621;PD4369,6621,;PU4479,6609;PD4369,6609,;PU4080,7215;PD4088,7219,4101,7232,4101,7142,;PU4080,7215;PD4080,7211,4088,7215,4097,7223,4097,7142,4101,7142,;PU4161,7155;PD4157,7150,4157,7146,4161,7142,4166,7142,4170,7146,4170,7150,4166,7155,4161,7155,;PU4161,7150;PD4161,7146,4166,7146,4166,7150,4161,7150,;PU4226,7232;PD4213,7228,4204,7215,4200,7193,4200,7181,4204,7159,4213,7146,4226,7142,4234,7142,4247,7146,4256,7159,4260,7181,4260,7193,4256,7215,4247,7228,4234,7232,4226,7232,;PU4217,7228;PD4208,7215,4204,7193,4204,7181,4208,7159,4217,7146,;PU4213,7150;PD4226,7146,4234,7146,4247,7150,;PU4243,7146;PD4251,7159,4256,7181,4256,7193,4251,7215,4243,7228,;PU4247,7223;PD4234,7228,4226,7228,4213,7223,;PU4479,7209;PD4369,7209,;PU4479,7197;PD4369,7197,;PU4470,1967;PD4663,3607,;PU4458,1968;PD4651,3609,;PU4651,3621;PD4555,3621,;PU4651,3609;PD4555,3609,;PU4628,3428;PD4532,3428,;PU4628,3416;PD4532,3416,;PU4605,3228;PD4509,3228,;PU4605,3216;PD4509,3216,;PU4580,3021;PD4484,3021,;PU4580,3009;PD4484,3009,;PU4555,2805;PD4459,2805,;PU4555,2793;PD4459,2793,;PU4529,2581;PD4433,2581,;PU4529,2569;PD4433,2569,;PU4501,2348;PD4405,2348,;PU4501,2336;PD4405,2336,;PU4473,2106;PD4377,2106,;PU4473,2094;PD4377,2094,;PU4058,3651;PD4118,3651,4075,3561,;PU4058,3651;PD4058,3646,4114,3646,;PU4114,3651;PD4071,3561,4075,3561,;PU4191,3646;PD4196,3638,4200,3638,4196,3646,4183,3651,4174,3651,4161,3646,4153,3634,4148,3612,4148,3591,4153,3573,4161,3565,4174,3561,4179,3561,4191,3565,4200,3573,4204,3586,4204,3591,4200,3604,4191,3612,4179,3616,4174,3616,4161,3612,4153,3604,;PU4196,3642;PD4183,3646,4174,3646,4161,3642,;PU4166,3646;PD4157,3634,4153,3612,4153,3591,4157,3573,4170,3565,;PU4153,3582;PD4161,3569,4174,3565,4179,3565,4191,3569,4200,3582,;PU4183,3565;PD4196,3573,4200,3586,4200,3591,4196,3604,4183,3612,;PU4200,3595;PD4191,3608,4179,3612,4174,3612,4161,3608,4153,3595,;PU4170,3612;PD4157,3604,4153,3591,;PU3941,2590;PD3941,2594,3945,2603,3949,2607,3958,2611,3975,2611,3984,2607,3988,2603,3992,2594,3992,2585,3988,2577,3979,2564,3941,2521,;PU3941,2590;PD3945,2590,3945,2594,3949,2603,3958,2607,3975,2607,3984,2603,3988,2594,3988,2585,3984,2577,3975,2564,3936,2521,;PU3941,2525;PD3996,2525,3996,2521,;PU3936,2521;PD3996,2521,;PU4069,2607;PD4074,2598,4078,2598,4074,2607,4061,2611,4052,2611,4039,2607,4031,2594,4026,2573,4026,2551,4031,2534,4039,2525,4052,2521,4057,2521,4069,2525,4078,2534,4082,2547,4082,2551,4078,2564,4069,2573,4057,2577,4052,2577,4039,2573,4031,2564,;PU4074,2603;PD4061,2607,4052,2607,4039,2603,;PU4044,2607;PD4035,2594,4031,2573,4031,2551,4035,2534,4048,2525,;PU4031,2542;PD4039,2530,4052,2525,4057,2525,4069,2530,4078,2542,;PU4061,2525;PD4074,2534,4078,2547,4078,2551,4074,2564,4061,2573,;PU4078,2555;PD4069,2568,4057,2573,4052,2573,4039,2568,4031,2555,;PU4048,2573;PD4035,2564,4031,2551,;PU4532,420;PD4470,1969,;PU4520,419;PD4458,1968,;PU4004,1993;PD4013,1998,4026,2011,4026,1920,;PU4004,1993;PD4004,1989,4013,1993,4021,2002,4021,1920,4026,1920,;PU4086,1933;PD4082,1929,4082,1925,4086,1920,4090,1920,4094,1925,4094,1929,4090,1933,4086,1933,;PU4086,1929;PD4086,1925,4090,1925,4090,1929,4086,1929,;PU4150,2011;PD4137,2006,4129,1993,4125,1972,4125,1959,4129,1938,4137,1925,4150,1920,4159,1920,4172,1925,4180,1938,4185,1959,4185,1972,4180,1993,4172,2006,4159,2011,4150,2011,;PU4142,2006;PD4133,1993,4129,1972,4129,1959,4133,1938,4142,1925,;PU4137,1929;PD4150,1925,4159,1925,4172,1929,;PU4167,1925;PD4176,1938,4180,1959,4180,1972,4176,1993,4167,2006,;PU4172,2002;PD4159,2006,4150,2006,4137,2002,;PU4458,1981;PD4362,1981,;PU4458,1968;PD4362,1968,;PU4030,1690;PD4017,1685,4008,1673,4004,1651,4004,1638,4008,1617,4017,1604,4030,1599,4038,1599,4051,1604,4060,1617,4064,1638,4064,1651,4060,1673,4051,1685,4038,1690,4030,1690,;PU4021,1685;PD4013,1673,4008,1651,4008,1638,4013,1617,4021,1604,;PU4017,1608;PD4030,1604,4038,1604,4051,1608,;PU4047,1604;PD4056,1617,4060,1638,4060,1651,4056,1673,4047,1685,;PU4051,1681;PD4038,1685,4030,1685,4017,1681,;PU4099,1612;PD4094,1608,4094,1604,4099,1599,4103,1599,4107,1604,4107,1608,4103,1612,4099,1612,;PU4099,1608;PD4099,1604,4103,1604,4103,1608,4099,1608,;PU4159,1690;PD4146,1685,4142,1677,4142,1668,4146,1660,4150,1655,4159,1651,4176,1647,4185,1642,4189,1638,4193,1630,4193,1617,4189,1608,4176,1604,4159,1604,4146,1608,4142,1617,4142,1630,4146,1638,4150,1642,4159,1647,4176,1651,4185,1655,4189,1660,4193,1668,4193,1677,4189,1685,4176,1690,4159,1690,;PU4150,1685;PD4146,1677,4146,1668,4150,1660,4159,1655,4176,1651,4185,1647,4193,1638,4197,1630,4197,1617,4193,1608,4189,1604,4176,1599,4159,1599,4146,1604,4142,1608,4137,1617,4137,1630,4142,1638,4150,1647,4159,1651,4176,1655,4185,1660,4189,1668,4189,1677,4185,1685,;PU4189,1681;PD4176,1685,4159,1685,4146,1681,;PU4142,1612;PD4154,1604,;PU4180,1604;PD4193,1612,;PU4471,1660;PD4375,1660,;PU4471,1648;PD4375,1648,;PU4042,1374;PD4029,1370,4021,1357,4017,1336,4017,1323,4021,1301,4029,1289,4042,1284,4051,1284,4064,1289,4072,1301,4077,1323,4077,1336,4072,1357,4064,1370,4051,1374,4042,1374,;PU4034,1370;PD4025,1357,4021,1336,4021,1323,4025,1301,4034,1289,;PU4029,1293;PD4042,1289,4051,1289,4064,1293,;PU4060,1289;PD4068,1301,4072,1323,4072,1336,4068,1357,4060,1370,;PU4064,1366;PD4051,1370,4042,1370,4029,1366,;PU4111,1297;PD4107,1293,4107,1289,4111,1284,4115,1284,4120,1289,4120,1293,4115,1297,4111,1297,;PU4111,1293;PD4111,1289,4115,1289,4115,1293,4111,1293,;PU4197,1370;PD4201,1362,4206,1362,4201,1370,4188,1374,4180,1374,4167,1370,4158,1357,4154,1336,4154,1314,4158,1297,4167,1289,4180,1284,4184,1284,4197,1289,4206,1297,4210,1310,4210,1314,4206,1327,4197,1336,4184,1340,4180,1340,4167,1336,4158,1327,;PU4201,1366;PD4188,1370,4180,1370,4167,1366,;PU4171,1370;PD4163,1357,4158,1336,4158,1314,4163,1297,4176,1289,;PU4158,1306;PD4167,1293,4180,1289,4184,1289,4197,1293,4206,1306,;PU4188,1289;PD4201,1297,4206,1310,4206,1314,4201,1327,4188,1336,;PU4206,1319;PD4197,1332,4184,1336,4180,1336,4167,1332,4158,1319,;PU4176,1336;PD4163,1327,4158,1314,;PU4484,1344;PD4388,1344,;PU4484,1332;PD4388,1332,;PU4055,1065;PD4042,1060,4033,1048,4029,1026,4029,1013,4033,992,4042,979,4055,975,4063,975,4076,979,4085,992,4089,1013,4089,1026,4085,1048,4076,1060,4063,1065,4055,1065,;PU4046,1060;PD4037,1048,4033,1026,4033,1013,4037,992,4046,979,;PU4042,983;PD4055,979,4063,979,4076,983,;PU4072,979;PD4080,992,4085,1013,4085,1026,4080,1048,4072,1060,;PU4076,1056;PD4063,1060,4055,1060,4042,1056,;PU4123,987;PD4119,983,4119,979,4123,975,4128,975,4132,979,4132,983,4128,987,4123,987,;PU4123,983;PD4123,979,4128,979,4128,983,4123,983,;PU4205,1052;PD4205,975,4209,975,;PU4209,1065;PD4209,975,;PU4209,1065;PD4162,996,4226,996,;PU4205,1052;PD4166,996,;PU4166,1000;PD4226,1000,4226,996,;PU4496,1035;PD4400,1035,;PU4496,1023;PD4400,1023,;PU4067,760;PD4054,756,4045,743,4041,722,4041,709,4045,687,4054,675,4067,670,4075,670,4088,675,4097,687,4101,709,4101,722,4097,743,4088,756,4075,760,4067,760,;PU4058,756;PD4050,743,4045,722,4045,709,4050,687,4058,675,;PU4054,679;PD4067,675,4075,675,4088,679,;PU4084,675;PD4092,687,4097,709,4097,722,4092,743,4084,756,;PU4088,752;PD4075,756,4067,756,4054,752,;PU4135,683;PD4131,679,4131,675,4135,670,4140,670,4144,675,4144,679,4140,683,4135,683,;PU4135,679;PD4135,675,4140,675,4140,679,4135,679,;PU4178,739;PD4178,743,4183,752,4187,756,4196,760,4213,760,4221,756,4226,752,4230,743,4230,735,4226,726,4217,713,4178,670,;PU4178,739;PD4183,739,4183,743,4187,752,4196,756,4213,756,4221,752,4226,743,4226,735,4221,726,4213,713,4174,670,;PU4178,675;PD4234,675,4234,670,;PU4174,670;PD4234,670,;PU4508,730;PD4412,730,;PU4508,718;PD4412,718,;PU4079,461;PD4066,457,4057,444,4053,423,4053,410,4057,388,4066,375,4079,371,4087,371,4100,375,4109,388,4113,410,4113,423,4109,444,4100,457,4087,461,4079,461,;PU4070,457;PD4061,444,4057,423,4057,410,4061,388,4070,375,;PU4066,380;PD4079,375,4087,375,4100,380,;PU4096,375;PD4104,388,4109,410,4109,423,4104,444,4096,457,;PU4100,453;PD4087,457,4079,457,4066,453,;PU4147,384;PD4143,380,4143,375,4147,371,4152,371,4156,375,4156,380,4152,384,4147,384,;PU4147,380;PD4147,375,4152,375,4152,380,4147,380,;PU4212,461;PD4199,457,4190,444,4186,423,4186,410,4190,388,4199,375,4212,371,4220,371,4233,375,4242,388,4246,410,4246,423,4242,444,4233,457,4220,461,4212,461,;PU4203,457;PD4195,444,4190,423,4190,410,4195,388,4203,375,;PU4199,380;PD4212,375,4220,375,4233,380,;PU4229,375;PD4238,388,4242,410,4242,423,4238,444,4229,457,;PU4233,453;PD4220,457,4212,457,4199,453,;PU4520,431;PD4424,431,;PU4520,419;PD4424,419,;PU4520,407;PD7256,407,;PU4520,419;PD7256,419,;PU4508,419;PD4508,356,;PU4520,419;PD4520,356,;PU4873,419;PD4873,356,;PU4885,419;PD4885,356,;PU5237,419;PD5237,356,;PU5249,419;PD5249,356,;PU5602,419;PD5602,356,;PU5614,419;PD5614,356,;PU5967,419;PD5967,356,;PU5979,419;PD5979,356,;PU6332,419;PD6332,356,;PU6344,419;PD6344,356,;PU6697,419;PD6697,356,;PU6709,419;PD6709,356,;PU7062,419;PD7062,356,;PU7074,419;PD7074,356,;PU4490,195;PD4477,190,4468,177,4464,156,4464,143,4468,122,4477,109,4490,104,4498,104,4511,109,4520,122,4524,143,4524,156,4520,177,4511,190,4498,195,4490,195,;PU4481,190;PD4472,177,4468,156,4468,143,4472,122,4481,109,;PU4477,113;PD4490,109,4498,109,4511,113,;PU4507,109;PD4515,122,4520,143,4520,156,4515,177,4507,190,;PU4511,186;PD4498,190,4490,190,4477,186,;PU6262,195;PD6258,156,;PU6267,190;PD6262,160,;PU6262,195;PD6305,195,6305,190,;PU6267,190;PD6305,190,;PU6262,160;PD6275,165,6288,165,6301,160,6310,152,6314,139,6314,130,6310,117,6301,109,6288,104,6275,104,6262,109,6258,113,6254,122,6258,122,;PU6258,156;PD6262,156,6271,160,6288,160,6301,156,6310,143,;PU6292,160;PD6305,152,6310,139,6310,130,6305,117,6292,109,;PU6310,126;PD6301,113,6288,109,6275,109,6262,113,6258,122,;PU6271,109;PD6258,117,;PU6365,195;PD6353,190,6344,177,6340,156,6340,143,6344,122,6353,109,6365,104,6374,104,6387,109,6396,122,6400,143,6400,156,6396,177,6387,190,6374,195,6365,195,;PU6357,190;PD6348,177,6344,156,6344,143,6348,122,6357,109,;PU6353,113;PD6365,109,6374,109,6387,113,;PU6383,109;PD6391,122,6396,143,6396,156,6391,177,6383,190,;PU6387,186;PD6374,190,6365,190,6353,186,;PU4527,409;PD7086,2189,;PU4520,419;PD7079,2199,;PU651,1967;PD844,3607,;PU639,1968;PD832,3609,;PU639,1981;PD543,1981,;PU639,1968;PD543,1968,;PU670,2245;PD574,2245,;PU670,2233;PD574,2233,;PU700,2499;PD604,2499,;PU700,2487;PD604,2487,;PU729,2742;PD633,2742,;PU729,2730;PD633,2730,;PU756,2975;PD660,2975,;PU756,2963;PD660,2963,;PU782,3199;PD686,3199,;PU782,3187;PD686,3187,;PU808,3414;PD712,3414,;PU808,3402;PD712,3402,;PU832,3621;PD736,3621,;PU832,3609;PD736,3609,;PU85,1989;PD85,1993,90,2002,94,2006,103,2011,120,2011,128,2006,133,2002,137,1993,137,1985,133,1976,124,1963,85,1920,;PU85,1989;PD90,1989,90,1993,94,2002,103,2006,120,2006,128,2002,133,1993,133,1985,128,1976,120,1963,81,1920,;PU85,1925;PD141,1925,141,1920,;PU81,1920;PD141,1920,;PU193,2011;PD180,2006,171,1993,167,1972,167,1959,171,1938,180,1925,193,1920,201,1920,214,1925,223,1938,227,1959,227,1972,223,1993,214,2006,201,2011,193,2011,;PU184,2006;PD176,1993,171,1972,171,1959,176,1938,184,1925,;PU180,1929;PD193,1925,201,1925,214,1929,;PU210,1925;PD219,1938,223,1959,223,1972,219,1993,210,2006,;PU214,2002;PD201,2006,193,2006,180,2002,;PU262,1933;PD257,1929,257,1925,262,1920,266,1920,270,1925,270,1929,266,1933,262,1933,;PU262,1929;PD262,1925,266,1925,266,1929,262,1929,;PU326,2011;PD313,2006,305,1993,300,1972,300,1959,305,1938,313,1925,326,1920,335,1920,348,1925,356,1938,360,1959,360,1972,356,1993,348,2006,335,2011,326,2011,;PU317,2006;PD309,1993,305,1972,305,1959,309,1938,317,1925,;PU313,1929;PD326,1925,335,1925,348,1929,;PU343,1925;PD352,1938,356,1959,356,1972,352,1993,343,2006,;PU348,2002;PD335,2006,326,2006,313,2002,;PU185,2516;PD185,2439,189,2439,;PU189,2529;PD189,2439,;PU189,2529;PD142,2460,206,2460,;PU185,2516;PD146,2460,;PU146,2465;PD206,2465,206,2460,;PU254,2529;PD241,2525,232,2512,228,2490,228,2478,232,2456,241,2443,254,2439,262,2439,275,2443,284,2456,288,2478,288,2490,284,2512,275,2525,262,2529,254,2529,;PU245,2525;PD237,2512,232,2490,232,2478,237,2456,245,2443,;PU241,2447;PD254,2443,262,2443,275,2447,;PU271,2443;PD279,2456,284,2478,284,2490,279,2512,271,2525,;PU275,2520;PD262,2525,254,2525,241,2520,;PU322,2452;PD318,2447,318,2443,322,2439,327,2439,331,2443,331,2447,327,2452,322,2452,;PU322,2447;PD322,2443,327,2443,327,2447,322,2447,;PU387,2529;PD374,2525,365,2512,361,2490,361,2478,365,2456,374,2443,387,2439,395,2439,408,2443,417,2456,421,2478,421,2490,417,2512,408,2525,395,2529,387,2529,;PU378,2525;PD370,2512,365,2490,365,2478,370,2456,378,2443,;PU374,2447;PD387,2443,395,2443,408,2447,;PU404,2443;PD413,2456,417,2478,417,2490,413,2512,404,2525,;PU408,2520;PD395,2525,387,2525,374,2520,;PU245,3001;PD249,2992,254,2992,249,3001,237,3005,228,3005,215,3001,206,2988,202,2967,202,2945,206,2928,215,2919,228,2915,232,2915,245,2919,254,2928,258,2941,258,2945,254,2958,245,2967,232,2971,228,2971,215,2967,206,2958,;PU249,2997;PD237,3001,228,3001,215,2997,;PU219,3001;PD211,2988,206,2967,206,2945,211,2928,224,2919,;PU206,2936;PD215,2924,228,2919,232,2919,245,2924,254,2936,;PU237,2919;PD249,2928,254,2941,254,2945,249,2958,237,2967,;PU254,2949;PD245,2962,232,2967,228,2967,215,2962,206,2949,;PU224,2967;PD211,2958,206,2945,;PU310,3005;PD297,3001,288,2988,284,2967,284,2954,288,2932,297,2919,310,2915,318,2915,331,2919,340,2932,344,2954,344,2967,340,2988,331,3001,318,3005,310,3005,;PU301,3001;PD292,2988,288,2967,288,2954,292,2932,301,2919,;PU297,2924;PD310,2919,318,2919,331,2924,;PU327,2919;PD335,2932,340,2954,340,2967,335,2988,327,3001,;PU331,2997;PD318,3001,310,3001,297,2997,;PU378,2928;PD374,2924,374,2919,378,2915,383,2915,387,2919,387,2924,383,2928,378,2928,;PU378,2924;PD378,2919,383,2919,383,2924,378,2924,;PU443,3005;PD430,3001,421,2988,417,2967,417,2954,421,2932,430,2919,443,2915,451,2915,464,2919,473,2932,477,2954,477,2967,473,2988,464,3001,451,3005,443,3005,;PU434,3001;PD426,2988,421,2967,421,2954,426,2932,434,2919,;PU430,2924;PD443,2919,451,2919,464,2924,;PU460,2919;PD469,2932,473,2954,473,2967,469,2988,460,3001,;PU464,2997;PD451,3001,443,3001,430,2997,;PU271,3444;PD258,3440,254,3431,254,3423,258,3414,262,3410,271,3405,288,3401,297,3397,301,3392,305,3384,305,3371,301,3362,288,3358,271,3358,258,3362,254,3371,254,3384,258,3392,262,3397,271,3401,288,3405,297,3410,301,3414,305,3423,305,3431,301,3440,288,3444,271,3444,;PU262,3440;PD258,3431,258,3423,262,3414,271,3410,288,3405,297,3401,305,3392,310,3384,310,3371,305,3362,301,3358,288,3354,271,3354,258,3358,254,3362,249,3371,249,3384,254,3392,262,3401,271,3405,288,3410,297,3414,301,3423,301,3431,297,3440,;PU301,3435;PD288,3440,271,3440,258,3435,;PU254,3367;PD267,3358,;PU292,3358;PD305,3367,;PU361,3444;PD348,3440,340,3427,335,3405,335,3392,340,3371,348,3358,361,3354,370,3354,383,3358,391,3371,395,3392,395,3405,391,3427,383,3440,370,3444,361,3444,;PU352,3440;PD344,3427,340,3405,340,3392,344,3371,352,3358,;PU348,3362;PD361,3358,370,3358,383,3362,;PU378,3358;PD387,3371,391,3392,391,3405,387,3427,378,3440,;PU383,3435;PD370,3440,361,3440,348,3435,;PU430,3367;PD426,3362,426,3358,430,3354,434,3354,438,3358,438,3362,434,3367,430,3367,;PU430,3362;PD430,3358,434,3358,434,3362,430,3362,;PU494,3444;PD481,3440,473,3427,468,3405,468,3392,473,3371,481,3358,494,3354,503,3354,516,3358,524,3371,529,3392,529,3405,524,3427,516,3440,503,3444,494,3444,;PU486,3440;PD477,3427,473,3405,473,3392,477,3371,486,3358,;PU481,3362;PD494,3358,503,3358,516,3362,;PU511,3358;PD520,3371,524,3392,524,3405,520,3427,511,3440,;PU516,3435;PD503,3440,494,3440,481,3435,;PU3511,1970;PD3318,3610,;PU3499,1968;PD3306,3609,;PU3499,1956;PD3595,1956,;PU3499,1968;PD3595,1968,;PU3468,2221;PD3563,2221,;PU3468,2233;PD3563,2233,;PU3438,2475;PD3534,2475,;PU3438,2487;PD3534,2487,;PU3409,2718;PD3505,2718,;PU3409,2730;PD3505,2730,;PU3382,2951;PD3478,2951,;PU3382,2963;PD3478,2963,;PU3356,3175;PD3452,3175,;PU3356,3187;PD3452,3187,;PU3330,3390;PD3426,3390,;PU3330,3402;PD3426,3402,;PU3306,3597;PD3402,3597,;PU3306,3609;PD3402,3609,;PU713,420;PD651,1969,;PU701,419;PD639,1968,;PU185,1993;PD194,1998,207,2011,207,1920,;PU185,1993;PD185,1989,194,1993,202,2002,202,1920,207,1920,;PU267,1933;PD263,1929,263,1925,267,1920,271,1920,275,1925,275,1929,271,1933,267,1933,;PU267,1929;PD267,1925,271,1925,271,1929,267,1929,;PU331,2011;PD318,2006,310,1993,306,1972,306,1959,310,1938,318,1925,331,1920,340,1920,353,1925,361,1938,366,1959,366,1972,361,1993,353,2006,340,2011,331,2011,;PU323,2006;PD314,1993,310,1972,310,1959,314,1938,323,1925,;PU318,1929;PD331,1925,340,1925,353,1929,;PU348,1925;PD357,1938,361,1959,361,1972,357,1993,348,2006,;PU353,2002;PD340,2006,331,2006,318,2002,;PU639,1981;PD543,1981,;PU639,1968;PD543,1968,;PU211,1690;PD198,1685,189,1673,185,1651,185,1638,189,1617,198,1604,211,1599,219,1599,232,1604,241,1617,245,1638,245,1651,241,1673,232,1685,219,1690,211,1690,;PU202,1685;PD194,1673,189,1651,189,1638,194,1617,202,1604,;PU198,1608;PD211,1604,219,1604,232,1608,;PU228,1604;PD237,1617,241,1638,241,1651,237,1673,228,1685,;PU232,1681;PD219,1685,211,1685,198,1681,;PU280,1612;PD275,1608,275,1604,280,1599,284,1599,288,1604,288,1608,284,1612,280,1612,;PU280,1608;PD280,1604,284,1604,284,1608,280,1608,;PU340,1690;PD327,1685,323,1677,323,1668,327,1660,331,1655,340,1651,357,1647,366,1642,370,1638,374,1630,374,1617,370,1608,357,1604,340,1604,327,1608,323,1617,323,1630,327,1638,331,1642,340,1647,357,1651,366,1655,370,1660,374,1668,374,1677,370,1685,357,1690,340,1690,;PU331,1685;PD327,1677,327,1668,331,1660,340,1655,357,1651,366,1647,374,1638,378,1630,378,1617,374,1608,370,1604,357,1599,340,1599,327,1604,323,1608,318,1617,318,1630,323,1638,331,1647,340,1651,357,1655,366,1660,370,1668,370,1677,366,1685,;PU370,1681;PD357,1685,340,1685,327,1681,;PU323,1612;PD335,1604,;PU361,1604;PD374,1612,;PU652,1660;PD556,1660,;PU652,1648;PD556,1648,;PU223,1374;PD210,1370,202,1357,198,1336,198,1323,202,1301,210,1289,223,1284,232,1284,245,1289,253,1301,258,1323,258,1336,253,1357,245,1370,232,1374,223,1374,;PU215,1370;PD206,1357,202,1336,202,1323,206,1301,215,1289,;PU210,1293;PD223,1289,232,1289,245,1293,;PU241,1289;PD249,1301,253,1323,253,1336,249,1357,241,1370,;PU245,1366;PD232,1370,223,1370,210,1366,;PU292,1297;PD288,1293,288,1289,292,1284,296,1284,301,1289,301,1293,296,1297,292,1297,;PU292,1293;PD292,1289,296,1289,296,1293,292,1293,;PU378,1370;PD382,1362,387,1362,382,1370,369,1374,361,1374,348,1370,339,1357,335,1336,335,1314,339,1297,348,1289,361,1284,365,1284,378,1289,387,1297,391,1310,391,1314,387,1327,378,1336,365,1340,361,1340,348,1336,339,1327,;PU382,1366;PD369,1370,361,1370,348,1366,;PU352,1370;PD344,1357,339,1336,339,1314,344,1297,357,1289,;PU339,1306;PD348,1293,361,1289,365,1289,378,1293,387,1306,;PU369,1289;PD382,1297,387,1310,387,1314,382,1327,369,1336,;PU387,1319;PD378,1332,365,1336,361,1336,348,1332,339,1319,;PU357,1336;PD344,1327,339,1314,;PU665,1344;PD569,1344,;PU665,1332;PD569,1332,;PU236,1065;PD223,1060,214,1048,210,1026,210,1013,214,992,223,979,236,975,244,975,257,979,266,992,270,1013,270,1026,266,1048,257,1060,244,1065,236,1065,;PU227,1060;PD218,1048,214,1026,214,1013,218,992,227,979,;PU223,983;PD236,979,244,979,257,983,;PU253,979;PD261,992,266,1013,266,1026,261,1048,253,1060,;PU257,1056;PD244,1060,236,1060,223,1056,;PU304,987;PD300,983,300,979,304,975,309,975,313,979,313,983,309,987,304,987,;PU304,983;PD304,979,309,979,309,983,304,983,;PU386,1052;PD386,975,390,975,;PU390,1065;PD390,975,;PU390,1065;PD343,996,407,996,;PU386,1052;PD347,996,;PU347,1000;PD407,1000,407,996,;PU677,1035;PD581,1035,;PU677,1023;PD581,1023,;PU248,760;PD235,756,226,743,222,722,222,709,226,687,235,675,248,670,256,670,269,675,278,687,282,709,282,722,278,743,269,756,256,760,248,760,;PU239,756;PD231,743,226,722,226,709,231,687,239,675,;PU235,679;PD248,675,256,675,269,679,;PU265,675;PD273,687,278,709,278,722,273,743,265,756,;PU269,752;PD256,756,248,756,235,752,;PU316,683;PD312,679,312,675,316,670,321,670,325,675,325,679,321,683,316,683,;PU316,679;PD316,675,321,675,321,679,316,679,;PU359,739;PD359,743,364,752,368,756,377,760,394,760,402,756,407,752,411,743,411,735,407,726,398,713,359,670,;PU359,739;PD364,739,364,743,368,752,377,756,394,756,402,752,407,743,407,735,402,726,394,713,355,670,;PU359,675;PD415,675,415,670,;PU355,670;PD415,670,;PU689,730;PD593,730,;PU689,718;PD593,718,;PU260,461;PD247,457,238,444,234,423,234,410,238,388,247,375,260,371,268,371,281,375,290,388,294,410,294,423,290,444,281,457,268,461,260,461,;PU251,457;PD242,444,238,423,238,410,242,388,251,375,;PU247,380;PD260,375,268,375,281,380,;PU277,375;PD285,388,290,410,290,423,285,444,277,457,;PU281,453;PD268,457,260,457,247,453,;PU328,384;PD324,380,324,375,328,371,333,371,337,375,337,380,333,384,328,384,;PU328,380;PD328,375,333,375,333,380,328,380,;PU393,461;PD380,457,371,444,367,423,367,410,371,388,380,375,393,371,401,371,414,375,423,388,427,410,427,423,423,444,414,457,401,461,393,461,;PU384,457;PD376,444,371,423,371,410,376,388,384,375,;PU380,380;PD393,375,401,375,414,380,;PU410,375;PD419,388,423,410,423,423,419,444,410,457,;PU414,453;PD401,457,393,457,380,453,;PU701,431;PD605,431,;PU701,419;PD605,419,;PU3449,419;PD3511,1968,;PU3437,419;PD3499,1968,;PU3499,1956;PD3595,1956,;PU3499,1968;PD3595,1968,;PU3486,1636;PD3582,1636,;PU3486,1648;PD3582,1648,;PU3473,1320;PD3569,1320,;PU3473,1332;PD3569,1332,;PU3461,1011;PD3557,1011,;PU3461,1023;PD3557,1023,;PU3449,706;PD3545,706,;PU3449,718;PD3545,718,;PU3437,407;PD3533,407,;PU3437,419;PD3533,419,;PU701,407;PD3437,407,;PU701,419;PD3437,419,;PU689,419;PD689,356,;PU701,419;PD701,356,;PU1054,419;PD1054,356,;PU1066,419;PD1066,356,;PU1418,419;PD1418,356,;PU1430,419;PD1430,356,;PU1783,419;PD1783,356,;PU1795,419;PD1795,356,;PU2148,419;PD2148,356,;PU2160,419;PD2160,356,;PU2513,419;PD2513,356,;PU2525,419;PD2525,356,;PU2878,419;PD2878,356,;PU2890,419;PD2890,356,;PU3243,419;PD3243,356,;PU3255,419;PD3255,356,;PU671,195;PD658,190,649,177,645,156,645,143,649,122,658,109,671,104,679,104,692,109,701,122,705,143,705,156,701,177,692,190,679,195,671,195,;PU662,190;PD653,177,649,156,649,143,653,122,662,109,;PU658,113;PD671,109,679,109,692,113,;PU688,109;PD696,122,701,143,701,156,696,177,688,190,;PU692,186;PD679,190,671,190,658,186,;PU2443,195;PD2439,156,;PU2448,190;PD2443,160,;PU2443,195;PD2486,195,2486,190,;PU2448,190;PD2486,190,;PU2443,160;PD2456,165,2469,165,2482,160,2491,152,2495,139,2495,130,2491,117,2482,109,2469,104,2456,104,2443,109,2439,113,2435,122,2439,122,;PU2439,156;PD2443,156,2452,160,2469,160,2482,156,2491,143,;PU2473,160;PD2486,152,2491,139,2491,130,2486,117,2473,109,;PU2491,126;PD2482,113,2469,109,2456,109,2443,113,2439,122,;PU2452,109;PD2439,117,;PU2546,195;PD2534,190,2525,177,2521,156,2521,143,2525,122,2534,109,2546,104,2555,104,2568,109,2577,122,2581,143,2581,156,2577,177,2568,190,2555,195,2546,195,;PU2538,190;PD2529,177,2525,156,2525,143,2529,122,2538,109,;PU2534,113;PD2546,109,2555,109,2568,113,;PU2564,109;PD2572,122,2577,143,2577,156,2572,177,2564,190,;PU2568,186;PD2555,190,2546,190,2534,186,;PU866,2197;PD;PU878,2199;PD;PU3250,2192;PD;PU3260,2199;PD;PU;SP3;PU696,1968;PD735,1968,828,419,865,419,901,419,938,419,974,419,1011,419,1047,419,1040,1968,1097,1262,1143,931,1165,1528,1201,1591,1236,1730,1290,971,1334,683,1372,590,1409,588,1446,556,1483,560,1501,1733,1535,1968,1577,1719,1615,1716,1653,1715,1689,1850,1726,1951,1765,1838,1813,507,1849,520,1886,503,1922,544,1959,533,1995,730,2031,1564,2069,814,2106,821,2143,976,2180,1007,2217,890,2254,886,2295,1583,2333,1570,2370,1552,2408,1518,2448,1778,2484,1612,2522,1601,2561,1686,2592,1260,2629,1233,2668,1349,2690,441,2729,588,2774,1018,2811,983,2847,945,2884,943,2942,1797,2984,1967,3022,1961,3047,1496,3064,777,3101,788,3156,1377,3199,1536,3200,419,3236,419,3273,419,3309,419,3346,419,3382,419,3419,419,3518,1968,;PU731,2276;PD768,2276,858,752,894,752,930,752,965,752,1001,752,1036,752,1072,752,1066,2276,1120,1644,1162,1400,1186,1923,1222,1948,1256,2080,1308,1360,1349,1158,1387,1057,1423,1055,1459,1008,1495,1011,1515,2082,1549,2276,1590,1994,1627,1990,1663,1991,1698,2205,1735,2260,1773,2141,1819,806,1855,809,1891,791,1926,989,1962,881,1997,1038,2032,1850,2069,1071,2105,1087,2141,1178,2178,1379,2213,1247,2249,1240,2290,1939,2327,1946,2364,1943,2401,1985,2439,2167,2475,2028,2509,1821,2546,1850,2579,1598,2615,1560,2654,1689,2675,778,2715,1045,2757,1335,2792,1278,2825,1132,2861,1130,2917,1973,2961,2272,2998,2262,3026,1948,3043,1228,3080,1253,3132,1769,3176,2020,3173,752,3208,752,3244,752,3279,752,3315,752,3351,752,3386,752,3481,2276,;PU764,2569;PD800,2569,887,1069,922,1069,957,1069,991,1069,1026,1069,1061,1069,1096,1071,1090,2569,1139,2079,1179,1908,1205,2307,1241,2312,1275,2420,1323,1836,1361,1699,1398,1606,1434,1603,1470,1535,1505,1537,1528,2411,1562,2569,1602,2230,1638,2225,1674,2229,1707,2520,1743,2555,1780,2444,1825,1158,1860,1118,1895,1099,1928,1505,1964,1213,1999,1326,2033,1979,2069,1326,2104,1356,2139,1407,2176,1839,2210,1697,2246,1685,2285,2276,2321,2300,2357,2308,2394,2385,2431,2507,2466,2393,2496,1930,2532,1923,2566,1789,2600,1745,2638,1881,2661,1111,2704,1577,2743,1781,2777,1697,2805,1349,2840,1347,2892,2087,2939,2561,2974,2546,3005,2321,3023,1653,3060,1703,3106,2097,3152,2432,3147,1071,3181,1069,3216,1069,3251,1069,3286,1069,3320,1069,3355,1069,3446,2569,;PU796,2848;PD831,2848,914,1372,948,1372,982,1372,1016,1371,1050,1371,1084,1371,1118,1378,1114,2847,1157,2521,1195,2414,1224,2683,1259,2679,1293,2746,1335,2395,1372,2307,1408,2237,1443,2234,1479,2150,1514,2150,1540,2734,1574,2848,1613,2516,1648,2511,1683,2519,1716,2813,1751,2839,1787,2741,1829,1634,1865,1481,1899,1461,1930,2094,1967,1551,2001,1625,2034,2002,2069,1575,2103,1625,2137,1654,2174,2365,2208,2213,2243,2202,2280,2591,2315,2635,2350,2650,2386,2735,2422,2811,2457,2727,2483,1972,2517,1937,2551,1873,2585,1835,2621,1970,2647,1441,2694,2167,2731,2322,2764,2217,2787,1620,2821,1619,2869,2237,2918,2837,2953,2818,2984,2645,3005,2106,3041,2179,3084,2449,3128,2783,3122,1378,3156,1371,3190,1371,3224,1372,3257,1372,3291,1372,3325,1372,3413,2848,;PU825,3113;PD860,3113,940,1671,973,1671,1006,1671,1040,1670,1073,1670,1106,1670,1139,1679,1136,3113,1176,2915,1211,2854,1242,3027,1276,3021,1310,3048,1347,2922,1383,2865,1418,2822,1452,2820,1488,2747,1522,2747,1552,3047,1585,3112,1623,2896,1657,2895,1691,2902,1724,3090,1758,3110,1793,3021,1833,2249,1868,1953,1902,1932,1933,2642,1969,1919,2002,1967,2035,2091,2069,1841,2102,1903,2136,1923,2172,2820,2205,2662,2240,2653,2275,2883,2310,2941,2344,2956,2379,3038,2414,3084,2448,3030,2472,2095,2505,2039,2538,2011,2571,1991,2607,2113,2635,1774,2683,2677,2720,2798,2752,2696,2773,1999,2806,1999,2852,2575,2898,3104,2932,3088,2963,2964,2989,2619,3025,2692,3064,2871,3104,3082,3098,1677,3131,1668,3165,1668,3198,1671,3231,1671,3264,1671,3297,1671,3382,3113,;PU854,3367;PD888,3367,961,2077,994,2077,1026,2077,1059,2071,1092,2071,1124,2071,1157,2078,1158,3366,1194,3251,1229,3214,1260,3321,1294,3317,1327,3324,1362,3298,1396,3250,1430,3228,1464,3225,1498,3184,1532,3184,1563,3335,1597,3364,1631,3271,1665,3273,1699,3277,1732,3347,1765,3366,1800,3270,1836,2772,1871,2458,1904,2441,1935,3004,1971,2300,2003,2341,2036,2372,2069,2179,2102,2234,2134,2254,2170,3128,2203,2969,2236,2953,2270,3141,2304,3199,2338,3209,2372,3290,2406,3316,2439,3288,2463,2395,2496,2329,2528,2313,2561,2318,2595,2421,2624,2156,2671,3026,2706,3111,2738,3037,2761,2467,2794,2467,2838,3007,2879,3362,2912,3350,2944,3280,2974,3107,3009,3156,3045,3270,3080,3331,3079,2063,3111,2057,3144,2058,3177,2077,3209,2077,3242,2077,3275,2077,3351,3367,;PU;SP1;PU6024,1288;PD6024,1145,;PU6028,1288;PD6028,1145,6024,1145,;PU5999,1296;PD6053,1296,6053,1288,;PU5999,1296;PD5999,1288,6053,1288,;PU6078,1296;PD6078,1145,;PU6082,1288;PD6082,1152,;PU6078,1296;PD6128,1296,;PU6082,1288;PD6128,1288,6128,1296,;PU6082,1224;PD6107,1224,6107,1217,;PU6082,1217;PD6107,1217,;PU6082,1152;PD6128,1152,6128,1145,;PU6078,1145;PD6128,1145,;PU6158,1296;PD6158,1145,;PU6162,1260;PD6162,1145,6158,1145,;PU6162,1260;PD6191,1145,;PU6158,1296;PD6191,1167,;PU6224,1296;PD6191,1167,;PU6220,1260;PD6191,1145,;PU6220,1260;PD6220,1145,6224,1145,;PU6224,1296;PD6224,1145,;PU6258,1296;PD6258,1145,;PU6262,1288;PD6262,1145,6258,1145,;PU6258,1296;PD6295,1296,6304,1288,6308,1281,6312,1267,6312,1245,6308,1231,6304,1224,6295,1217,6262,1217,;PU6262,1288;PD6295,1288,6304,1281,6308,1267,6308,1245,6304,1231,6295,1224,6262,1224,;PU6341,1296;PD6341,1145,;PU6345,1288;PD6345,1152,;PU6341,1296;PD6391,1296,;PU6345,1288;PD6391,1288,6391,1296,;PU6345,1224;PD6371,1224,6371,1217,;PU6345,1217;PD6371,1217,;PU6345,1152;PD6391,1152,6391,1145,;PU6341,1145;PD6391,1145,;PU6421,1296;PD6421,1145,;PU6425,1288;PD6425,1145,6421,1145,;PU6421,1296;PD6454,1296,6467,1288,6471,1281,6475,1267,6475,1245,6471,1231,6467,1224,6454,1217,6425,1217,;PU6425,1288;PD6454,1288,6467,1281,6471,1267,6471,1245,6467,1231,6454,1224,6425,1224,;PU6446,1217;PD6471,1145,6475,1145,;PU6450,1217;PD6475,1145,;PU6529,1296;PD6496,1145,;PU6529,1274;PD6500,1145,6496,1145,;PU6529,1274;PD6558,1145,6563,1145,;PU6529,1296;PD6563,1145,;PU6508,1188;PD6550,1188,;PU6504,1181;PD6554,1181,;PU6604,1288;PD6604,1145,;PU6609,1288;PD6609,1145,6604,1145,;PU6579,1296;PD6634,1296,6634,1288,;PU6579,1296;PD6579,1288,6634,1288,;PU6659,1296;PD6659,1188,6663,1167,6671,1152,6684,1145,6692,1145,6705,1152,6713,1167,6717,1188,6717,1296,;PU6659,1296;PD6663,1296,6663,1188,6667,1167,6671,1160,6684,1152,6692,1152,6705,1160,6709,1167,6713,1188,6713,1296,6717,1296,;PU6751,1296;PD6751,1145,;PU6755,1288;PD6755,1145,6751,1145,;PU6751,1296;PD6784,1296,6796,1288,6801,1281,6805,1267,6805,1245,6801,1231,6796,1224,6784,1217,6755,1217,;PU6755,1288;PD6784,1288,6796,1281,6801,1267,6801,1245,6796,1231,6784,1224,6755,1224,;PU6776,1217;PD6801,1145,6805,1145,;PU6780,1217;PD6805,1145,;PU6834,1296;PD6834,1145,;PU6838,1288;PD6838,1152,;PU6834,1296;PD6884,1296,;PU6838,1288;PD6884,1288,6884,1296,;PU6838,1224;PD6863,1224,6863,1217,;PU6838,1217;PD6863,1217,;PU6838,1152;PD6884,1152,6884,1145,;PU6834,1145;PD6884,1145,;PU6947,1245;PD7018,1245,7018,1238,;PU6947,1245;PD6947,1238,7018,1238,;PU6947,1188;PD7018,1188,7018,1181,;PU6947,1188;PD6947,1181,7018,1181,;PU7168,1296;PD7156,1288,7151,1274,7151,1260,7156,1245,7160,1238,7168,1231,7185,1224,7193,1217,7197,1210,7201,1195,7201,1174,7197,1160,7185,1152,7168,1152,7156,1160,7151,1174,7151,1195,7156,1210,7160,1217,7168,1224,7185,1231,7193,1238,7197,1245,7201,1260,7201,1274,7197,1288,7185,1296,7168,1296,;PU7160,1288;PD7156,1274,7156,1260,7160,1245,7168,1238,7185,1231,7193,1224,7201,1210,7206,1195,7206,1174,7201,1160,7197,1152,7185,1145,7168,1145,7156,1152,7151,1160,7147,1174,7147,1195,7151,1210,7160,1224,7168,1231,7185,1238,7193,1245,7197,1260,7197,1274,7193,1288,;PU7197,1281;PD7185,1288,7168,1288,7156,1281,;PU7151,1167;PD7164,1152,;PU7189,1152;PD7201,1167,;PU7256,1296;PD7243,1288,7235,1267,7231,1231,7231,1210,7235,1174,7243,1152,7256,1145,7264,1145,7277,1152,7285,1174,7289,1210,7289,1231,7285,1267,7277,1288,7264,1296,7256,1296,;PU7247,1288;PD7239,1267,7235,1231,7235,1210,7239,1174,7247,1152,;PU7243,1160;PD7256,1152,7264,1152,7277,1160,;PU7272,1152;PD7281,1174,7285,1210,7285,1231,7281,1267,7272,1288,;PU7277,1281;PD7264,1288,7256,1288,7243,1281,;PU7323,1167;PD7318,1160,7318,1152,7323,1145,7327,1145,7331,1152,7331,1160,7327,1167,7323,1167,;PU7323,1160;PD7323,1152,7327,1152,7327,1160,7323,1160,;PU7385,1296;PD7373,1288,7364,1267,7360,1231,7360,1210,7364,1174,7373,1152,7385,1145,7394,1145,7406,1152,7414,1174,7419,1210,7419,1231,7414,1267,7406,1288,7394,1296,7385,1296,;PU7377,1288;PD7369,1267,7364,1231,7364,1210,7369,1174,7377,1152,;PU7373,1160;PD7385,1152,7394,1152,7406,1160,;PU7402,1152;PD7410,1174,7414,1210,7414,1231,7410,1267,7402,1288,;PU7406,1281;PD7394,1288,7385,1288,7373,1281,;PU7469,1296;PD7456,1288,7448,1267,7444,1231,7444,1210,7448,1174,7456,1152,7469,1145,7477,1145,7490,1152,7498,1174,7502,1210,7502,1231,7498,1267,7490,1288,7477,1296,7469,1296,;PU7460,1288;PD7452,1267,7448,1231,7448,1210,7452,1174,7460,1152,;PU7456,1160;PD7469,1152,7477,1152,7490,1160,;PU7485,1152;PD7494,1174,7498,1210,7498,1231,7494,1267,7485,1288,;PU7490,1281;PD7477,1288,7469,1288,7456,1281,;PU;SP3;PU4622,1093;PD4622,1093,4654,1069,4686,1044,4719,1019,4752,995,4785,971,4818,946,4851,918,4884,896,4917,870,4951,842,4984,816,5018,791,;PU4624,1118;PD4624,1118,4656,1093,4689,1069,4721,1044,4754,1019,4787,994,4820,971,4853,946,4886,921,4919,893,4953,868,4986,842,5020,816,;PU4638,1264;PD4638,1264,4670,1239,4702,1215,4734,1191,4767,1167,4799,1142,4832,1118,4864,1093,4897,1069,4930,1044,4963,1019,4996,997,5030,972,5063,947,5097,918,5131,893,;PU4650,1382;PD4650,1382,4681,1359,4713,1335,4745,1311,4777,1287,4809,1264,4842,1239,4874,1215,4907,1191,4939,1167,4972,1142,5005,1121,5038,1097,5071,1072,5104,1047,5138,1019,5171,994,5205,969,5234,946,;PU4665,1545;PD4665,1545,4697,1522,4728,1499,4760,1476,4791,1453,4823,1429,4855,1406,4887,1384,4919,1360,4952,1335,4984,1315,5016,1291,5049,1267,5082,1243,5115,1215,5148,1191,5181,1167,5214,1142,5247,1118,5281,1093,5314,1069,5348,1044,;PU4676,1659;PD4676,1659,4708,1637,4739,1614,4770,1591,4801,1568,4833,1545,4865,1522,4896,1499,4928,1476,4960,1453,4992,1429,5024,1406,5057,1382,5089,1359,5122,1335,5152,1410,5185,1413,5218,1389,5251,1365,5284,1341,5318,1317,5353,1167,5387,1142,5420,1118,5445,1099,;PU4681,1704;PD4681,1704,4712,1682,4743,1659,4774,1637,4805,1614,4837,1591,4868,1568,4900,1545,4932,1522,4964,1499,4995,1476,5028,1453,5060,1429,5092,1409,5125,1385,5137,1374,;PU5339,1226;PD5355,1215,5389,1191,5422,1167,5456,1142,5479,1124,;PU4692,1815;PD4692,1815,4722,1793,4753,1771,4784,1749,4815,1726,4846,1704,4877,1682,4909,1659,4940,1637,4972,1614,5004,1591,5035,1581,5067,1558,5099,1535,5131,1512,5164,1476,5196,1453,5229,1429,5261,1406,5294,1382,5327,1359,5360,1335,5393,1311,5427,1287,5460,1264,5493,1239,5527,1215,5561,1191,;PU4694,1837;PD4694,1837,4724,1815,4755,1793,4786,1771,4817,1749,4848,1733,4879,1710,4910,1688,4942,1665,4974,1637,5005,1614,5037,1591,5069,1568,5101,1545,5133,1522,5165,1499,5198,1476,5230,1453,5263,1429,5295,1406,5328,1382,5361,1359,5394,1335,5427,1311,5461,1287,5494,1264,5528,1239,5561,1215,5583,1199,;PU4696,1859;PD4696,1859,4726,1837,4757,1815,4788,1793,4819,1771,4850,1749,4881,1726,4912,1704,4944,1682,4975,1659,5007,1637,5039,1614,5070,1591,5102,1568,5134,1545,5167,1522,5199,1499,5231,1476,5264,1453,5296,1429,5329,1406,5362,1382,5395,1359,5428,1360,5461,1336,5495,1312,5528,1288,5562,1239,5596,1215,;PU4700,1903;PD4700,1903,4731,1881,4761,1859,4792,1837,4823,1815,4854,1793,4885,1771,4916,1749,4947,1726,4978,1704,5010,1682,5042,1659,5073,1637,5105,1614,5137,1591,5169,1568,5201,1545,5234,1522,5266,1505,5298,1483,5331,1460,5364,1436,5397,1406,5430,1382,5463,1359,5496,1335,5530,1311,5563,1287,5597,1264,5631,1239,;PU4717,2074;PD4717,2074,4747,2052,4777,2031,4807,2010,4838,1989,4868,1967,4899,1946,4930,1924,4960,1903,4991,1881,5022,1859,5054,1837,5085,1815,5116,1793,5148,1771,5179,1749,5211,1726,5243,1708,5275,1685,5307,1663,5339,1640,5372,1617,5404,1591,5437,1568,5469,1545,5502,1522,5535,1499,5568,1476,5601,1453,5634,1429,5668,1406,5701,1382,5735,1359,5769,1335,;PU4725,2157;PD4725,2157,4755,2137,4785,2116,4815,2095,4845,2074,4875,2052,4906,2031,4936,2010,4967,1989,4998,1967,5029,1946,5060,1924,5091,1903,5122,1882,5153,1860,5185,1837,5216,1815,5248,1793,5279,1771,5311,1749,5343,1726,5375,1704,5408,1682,5440,1659,5472,1637,5505,1614,5538,1591,5570,1568,5602,1664,5635,1641,5669,1618,5702,1595,5736,1572,5770,1429,5803,1406,5837,1382,;PU4729,2199;PD4729,2199,4759,2178,4789,2157,4819,2137,4849,2116,4879,2095,4909,2074,4940,2052,4970,2031,5001,2010,5031,2019,5062,1997,5093,1946,5125,1924,5156,1903,5187,1881,5218,1859,5250,1837,5282,1815,5313,1793,5345,1771,5377,1749,5409,1726,5441,1704,5474,1682,5506,1659,5539,1637,5571,1614,5582,1606,;PU5756,1485;PD5770,1476,5804,1453,5837,1429,5869,1406,;PU4729,2199;PD4729,2199,4759,2178,4789,2157,4819,2137,4849,2116,4879,2095,4909,2074,4940,2052,4970,2031,5001,2010,5031,2019,5062,1997,5093,1946,5125,1924,5156,1903,5187,1881,5218,1859,5250,1837,5282,1815,5313,1793,5345,1771,5377,1749,5409,1726,5441,1704,5474,1682,5506,1659,5539,1637,5571,1614,5578,1608,;PU5756,1485;PD5770,1476,5804,1453,5837,1429,5869,1406,;PU4761,2199;PD4761,2199,4775,2696,4805,2676,4836,2656,4866,2636,4897,2615,4928,2595,4959,2573,5002,2031,5023,2016,;PU5068,1985;PD5095,1967,5126,1946,5157,1924,5188,1903,5220,1881,5251,1859,5283,1837,5314,1815,5346,1793,5378,1771,5410,1749,5442,1726,5475,1704,5507,1682,5539,1659,5572,1637,5588,1624,;PU5749,1512;PD5770,1499,5804,1476,5837,1453,5871,1429,;PU4999,2077;PD5005,2074,5036,2052,5067,2031,5098,2010,5129,1989,5160,1967,5191,1946,5222,1924,5253,1903,5285,1881,5316,1859,5348,1837,5380,1815,5412,1793,5444,1771,5476,1749,5508,1726,5541,1704,5573,1682,5601,1661,;PU5708,1590;PD5737,1588,5771,1565,5804,1542,5837,1519,5871,1476,5905,1453,;PU4993,2147;PD5010,2137,5041,2116,5071,2095,5102,2074,5133,2052,5163,2031,5194,2010,5225,1989,5257,1967,5288,1946,5319,1924,5351,1903,5383,1881,5414,1859,5446,1838,5478,1816,5510,1794,5543,1772,5575,1749,5607,1726,5639,1764,5672,1759,5705,1736,5738,1705,5771,1683,5804,1660,5838,1568,5871,1545,5905,1522,5938,1499,5968,1478,;PU4989,2193;PD5013,2178,5043,2157,5074,2137,5104,2116,5135,2095,5166,2074,5197,2052,5228,2031,5259,2010,5290,1989,5321,1973,5353,1952,5384,1924,5416,1903,5448,1881,5480,1859,5512,1837,5544,1815,5576,1793,5608,1771,5631,1755,;PU5813,1636;PD5838,1637,5871,1614,5905,1591,5938,1545,5972,1522,6000,1502,;PU5110,2199;PD5110,2199,5140,2178,5171,2157,5202,2137,5232,2116,5263,2098,5294,2077,5325,2056,5357,2035,5388,2010,5419,1991,5451,1969,5483,1946,5514,1924,5546,1903,5578,1881,5610,1859,5643,1837,5675,1815,5707,1793,5740,1771,5771,2340,5804,2319,5838,2297,5871,2276,5905,2254,5939,2229,5971,1614,6005,1591,6038,1568,6065,1549,;PU5142,2199;PD5142,2199,5172,2178,5203,2157,5234,2137,5264,2116,5295,2095,5326,2074,5358,2052,5389,2031,5420,2010,5452,1989,5483,1967,5515,1946,5547,1924,5579,1903,5611,1881,5643,1859,5675,1837,5708,1815,5740,1793,5740,1793,;PU5969,1640;PD5971,1640,6005,1617,6038,1591,6072,1568,;PU5173,2199;PD5173,2199,5204,2178,5235,2157,5265,2137,5296,2116,5327,2095,5358,2074,5390,2052,5421,2031,5452,2018,5484,1997,5516,1975,5547,1946,5579,1924,5611,1903,5642,2138,5674,2210,5706,2189,5740,1847,5743,1842,;PU5969,1660;PD5971,1659,6004,1637,6038,1614,6071,1591,6098,1572,;PU5205,2199;PD5205,2199,5236,2178,5267,2157,5297,2137,5328,2116,5359,2095,5391,2074,5422,2052,5453,2031,5485,2010,5516,1989,5548,1967,5580,1946,5612,1924,5613,1922,;PU5967,1683;PD5971,1682,6004,1659,6038,1637,6071,1614,6105,1591,;PU5269,2199;PD5269,2199,5299,2178,5330,2157,5361,2137,5392,2116,5423,2095,5455,2074,5486,2052,5518,2031,5549,2010,5581,1989,5613,1967,5618,1963,;PU5736,1883;PD5741,1881,5745,1878,;PU5965,1729;PD5970,1726,6004,1756,6037,1734,6071,1711,6104,1639,6138,1614,;PU5364,2199;PD5364,2199,5395,2178,5426,2157,5457,2137,5488,2116,5520,2095,5551,2074,5583,2052,5614,2031,5626,2022,;PU5729,1957;PD5742,1950,5749,1943,;PU5954,1935;PD5970,1925,6003,1903,6037,1881,6070,1726,6103,1704,6136,1682,6170,1659,6195,1642,;PU5491,2199;PD5491,2199,5522,2178,5553,2157,5585,2137,5616,2116,5638,2116,;PU5718,2070;PD5743,2054,5754,2039,;PU6048,1827;PD6068,1815,6101,1793,6135,1771,6168,1749,6202,1726,6235,1704,6258,1688,;PU5523,2199;PD5523,2199,5554,2178,5585,2157,5617,2137,5639,2121,;PU6031,1884;PD6035,1885,6068,1863,6101,1841,6134,1819,6168,1797,6201,1749,6235,1726,6268,1704,;PU5650,2199;PD5650,2199,5663,2189,;PU5709,2158;PD5713,2157,5744,2137,5758,2126,;PU5951,2000;PD5969,1989,6001,1967,6034,1946,6067,1924,6099,1903,6132,1881,6166,1863,6199,1841,6232,1820,6266,1793,6299,1771,6333,1749,;PU5706,2181;PD5713,2178,5745,2157,5759,2146,;PU5949,2022;PD5969,2010,6001,1989,6034,1967,6066,1946,6099,1924,6132,1903,6165,1881,6198,1859,6231,1837,6265,1815,6298,1793,6332,1771,6353,1756,;PU5946,2087;PD5968,2074,6000,2052,6033,2031,6065,2010,6098,1989,6131,1967,6164,1946,6197,1924,6230,1903,6263,1887,6296,1866,6330,1844,6363,1815,6397,1793,;PU5940,2194;PD5967,2178,5999,2157,6032,2137,6064,2116,6096,2095,6129,2074,6161,2052,6194,2036,6227,2014,6260,1989,6293,1967,6326,1946,6359,1924,6392,1903,6426,1881,6459,1859,6478,1846,;PU5967,2199;PD5967,2199,5999,2178,6031,2157,6064,2137,6096,2116,6128,2095,6161,2086,6193,2065,6226,2044,6259,2010,6292,1989,6325,1985,6358,1963,6392,1942,6425,1903,6458,1881,6492,1859,;PU6031,2199;PD6031,2199,6063,2178,6095,2157,6127,2137,6160,2116,6192,2095,6225,2074,6258,2052,6290,2031,6323,2010,6357,1989,6390,1967,6423,1954,6457,1932,6490,1903,6524,1881,;PU6063,2199;PD6063,2199,6095,2178,6127,2157,6159,2137,6192,2116,6224,2095,6257,2074,6290,2052,6323,2057,6356,2038,6389,2017,6423,1995,6456,1974,6489,1924,6523,1903,6556,1881,;PU6094,2199;PD6094,2199,6127,2178,6159,2157,6191,2137,6224,2116,6257,2115,6289,2093,6322,2072,6355,2051,6374,2027,;PU6464,1960;PD6488,1946,6521,1924,6555,1903,;PU6348,2199;PD6348,2199,6381,2178,6414,2157,6447,2141,6480,2122,6513,2101,6546,2079,6579,2058,6612,2031,6646,2010,6680,1989,;PU881,3609;PD914,3609,963,3065,996,3065,1028,3064,1061,3057,1094,3054,1126,3055,1159,3054,1178,3605,1212,3572,1245,3551,1278,3583,1311,3580,1344,3587,1378,3508,1411,3477,1444,3469,1477,3464,1510,3450,1543,3451,1574,3593,1607,3607,1641,3567,1673,3569,1706,3570,1739,3579,1772,3609,1806,3486,1842,3008,1875,2896,1907,2889,1938,3178,1972,2765,2004,2788,2037,2900,2069,2810,2101,2841,2134,2871,2168,3460,2200,3285,2232,3260,2266,3366,2299,3423,2332,3424,2365,3504,2398,3489,2431,3482,2457,2903,2489,2838,2521,2793,2553,2814,2588,2951,2618,2798,2659,3363,2693,3436,2725,3397,2752,3063,2784,3063,2822,3332,2861,3608,2893,3579,2925,3538,2957,3506,2991,3535,3025,3565,3056,3513,3075,2997,3107,2995,3140,3008,3174,3056,3207,3061,3240,3066,3272,3066,3323,3609,;PU0,0;PG;SP; \ No newline at end of file diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/hpgl/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/hpgl/read.t new file mode 100644 index 0000000..7fc2e27 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/hpgl/read.t @@ -0,0 +1,29 @@ +#!/usr/bin/perl +# +# Test Reading HP GL images +# +# Contributed by Bob Friesenhahn +# + +BEGIN { $| = 1; $test=1; print "1..1\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't/hpgl' || die 'Cd failed'; + +# +# 1) Test reading HP GL +# +$image=Image::Magick->new; +$x=$image->ReadImage('input.hpgl'); +if( "$x" ) { + print "ReadImage: $x\n"; + print "not ok $test\n"; +} else { + print "ok $test\n"; +} + +undef $image; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.avs b/ImageMagick-6.9.12-44/PerlMagick/t/input.avs new file mode 100644 index 0000000000000000000000000000000000000000..a6f45747cf202696aeceb2af33776fe41c66d513 GIT binary patch literal 12888 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.bmp b/ImageMagick-6.9.12-44/PerlMagick/t/input.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a714ce3325c16145e979d6d1308d9f413a58d1c9 GIT binary patch literal 6414 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 A6951J literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.bmp24 b/ImageMagick-6.9.12-44/PerlMagick/t/input.bmp24 new file mode 100644 index 0000000000000000000000000000000000000000..622864daeb24a59f5071af4d94fac7dc06df4294 GIT binary patch literal 9806 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 QdiK%+ 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.gif b/ImageMagick-6.9.12-44/PerlMagick/t/input.gif new file mode 100644 index 0000000000000000000000000000000000000000..72b1096823053c8ccdb4ca7a5d3ca2daea94f0d3 GIT binary patch literal 4037 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.ico b/ImageMagick-6.9.12-44/PerlMagick/t/input.ico new file mode 100644 index 0000000000000000000000000000000000000000..f714eea446e4b6bd28f9e0f1c8f75f6c81fba9c6 GIT binary patch literal 766 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.miff b/ImageMagick-6.9.12-44/PerlMagick/t/input.miff new file mode 100644 index 0000000..72e776c --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/input.miff @@ -0,0 +1,14 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=False +columns=70 rows=46 depth=8 +colorspace=sRGB +resolution=72x72 +page=70x46+0+0 +rendering-intent=Perceptual +gamma=1.0 +red-primary=0.64,0.33 green-primary=0.3,0.6 blue-primary=0.15,0.06 +white-point=0.3127,0.329 +date:create=2012-06-16T20:11:10-04:00 +date:modify=2009-09-05T17:47:34-04:00 + +:0/-20.62/83.:3-92-80-91.80-80-7/,5-*4,)5-*5-*1-'1.'41*74-96/?:/F?3JB4LA2NB2UA2tD4C3A5E=DGCF=B<@@;?/?-@-A+@+?.=,=+=*?.?3B3D6F9R:/:5372172/61.30,//-0/-3,-6+-P78IGbn|lpPHnRLauw|z|lYVS/.,0/-50-71-81,80,6/,81-81-81.7.,4-*4,*6/+6.+3/*30*41+63-750>8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WT8-E=2H?1I>.K@/MD3iE4@.<-G.=,=*;*>->3@4D8H;D7,95593162/62.11--1.00.5/.2*,E21xA5Y\}clJ>kK@\]^g~lp_YWS,,,,-+0/,1.+2,(2-*0,+2,+2++2,+2,+1,+1,)3-,3-,3/,31,40,52-750:3,>6-@6-C8-H;/EE5UD4m=+9(E4H=E@<>>=A0@*?->-?,>)>,=-<-;.?/B1@8GDWNFFISIYZO,-/+-/.--/-)/*'-+(,**,**.++.++.++/++/--0,,0-./-*2.,2.+2-,30.82/<4/>4/A5-F91H>7Q<5_70y7-;/A3E9E@HAB/@,>-=/=-=+<+<,<.<2C7G:E@g_yWeWCB875+/1*.1+-0,-0//0.02./2./-24*,gcb~ipY\o`pr|_eQ,/2+/2..0-.--+),*++)+('(**+,*+,*+*))*()-+,.-./,+0,+.*)/++0--811<32;21>0.A2/A73B:6K62h7/=0>5A3D7GUR{rpSZG<@301(-)'2,+2,+0,*0-+0/+2*10)(eqRʳǰYdJ.0.//-/1.21.30-3/,2-*-*+,+,*)-+(,-',+(),*)--+/-,.+*/+)4,)6/*;3.=40;1-;/.>/.>3,59/93,O,'i:-A1@1;-B2>2-:+;*v>)v8,s9-{@4G>NEdVzq{v|egdePfP4=0*&#.$&+**)+,'+/''-)$"W\H~j{j~oo}t~{olLVD782782994<:5@=8B:8A95=73<75:549009//61.62.63.641973?72B90H=1J>4H=4B80@61?62<94C54A50<6*E5'c6-=;BAC;>6A5~:/y;/u>.z4)PL[VpJ9kS@s`IzXf`zr~vxooXiM?;)3)"%+!+/&:&*C))TN:hqRhWk\nckhsttthdNXC8939:4>>8A?:D?:FABCEvC9y:43(G@-e^:w\n\mYsd~{d}_S_G671681==8B@;FA?HC>HC>JD9,E1K;1D:/>=17=0B@K]35;#?5;0>3D7:(>2>88?<JI;MI6IE7MHJH@9E;+C9-?80>83=71>94@=9IA6P@-H?-K81C745=0@?/I@4+4!A&:$6'=2A1@2@48)1+++0)6%5!9,UIUQAK?A;.E;AD>HAQ=V>h>qEwJnWxY]nnd҅un10-/.,43/892>?5GD;OK8MK4XWW|x[ToF?O94462&52):9.B=-K@/P@/C;*:4)040B1-6<;/<';%>,=1;19*:+?23*4,8.1+/(5 4!9,?6CAA>>39(=-E@FKDKDXBbJtK}MzTtCc{_T:8163-30+74,<;2IA6VJ9TH:dar䬲쏏nmLIX@?M<99A=(BC.8A9:EQEUaFSRaG2:#:)@7HFGHFJO\F`JnRzXzUqSg`pKU᪤D@5A=3;6-52(:5/F=7TG6WF7]Ujޫ|f\RLs7:C:97RJNs]{KP<'9#:*;-<3;361>9<78/D9?4))++2,2%<(:*7-LHC@9$9(>2QIE>NIQSTaVnNoUxWoZiWeOTtnOI;MG:F@5?90=60A=8ME5SD.WLS틍ozaeN_OWL]HR;>>>>5>/?2>49/3+7/8/3)3$9">08;052054537+>/PJEI=38+<-C2=-H=NJ\afvPmZurxbp{ueVPAWN?VM?PI:KB4F<1E@7LG5SG.VNQvANC?F>;GF>A?;=1?0;+:.933/4.8*;+;6<99%9!3&5/7+8&=)>5@BUSG=9):*<-<.:*VGmjagbmnqdlWpuiXnE[N>ZN>[N=XMCNBG@5C;41B5;)9%:%8(4+13,3-1.8(>(00'8(;2=4D66&5)75./4*5*J>>16*:+7&H>qrs~r{s{VeDa}}g̮Ưʪǚպ[L<[L<\L^M<^P<[NAYLI^Sdmeě~q@G>+@9<@BJ<79(B8;8D:7$;(8'4'9.4',$)'%26'6UYa7eNd~mpopoqÿ\K7\K6\K6]L7]L9]L;^M=]P=]P=aM:cG>g]quqKU?Q=G<=>4;*>/833+9'MAA3:.792>"/ -!+%7;VcpNS:56$-:086IE;08+8+8/J@3..1-02,4%ME{Yt?a@SIY1p[oq|f~fk~en^M:^M:^M:^M:^M:_L7^N9VNAaXYo`mmdppxꙃ͹v|d\MU9A77B2:+G>B96+6'4.D7<.03DNCG/-,(23>C?C783.OJOQIGUUEAB:<72=7?>:1*20.20.4%H_O=_O=`P7\L9_[a}|}qv|ƚǺȶpRLAHJ79:27.I?fX@32+1,=17)-)55RXJQQVV[@B9?-7JVozfvRN53AcAd\;/L_>u^{coWrXx^y[wVahe|V[M=_P@_RB`RC`R@\OBcYawww|cjzz֯諸ydlgWZ6:63:1OAXI1'><@70%-'3*95SWVbdoag/7(6FS^fT[73648280:5;;655+6*0-/40/9.82wRp`S>e_Xztsp]_iiߝޢ֠֞Εpg}^VR|SHYQys|^Z6-5#;*:07,9/8/<*@1=473PLKB6$/0(:'?:#8.6:5<57535407)9&6&5-5)4'V\Pk8e@X95#AB378!QZ4dyN_AcDlNhGcIcJfIbD47-::4OD;VL=gelljQQ[]y{Ή݌ш͈ҍȇ~Zj\[LpWDSVfkz;-;#;)6+;+6(:-8(:-:/:0?5:.1'/7+=*>$:&95=:6;454486/7)8&6$9&;%=4Wl7cCjk3=#/%/4^Y2s`]>mKpQkHiMeJfHgG*0&+0+975EC=Z\i\][Zy|օ낂ځʃҋۍ~xsWR`_Hd_CWPZcnjK@7&<'8+1(>+:(G;9+:)7(7(0>=4<=2AE*LM:UTAecgzwszyon_WlYGh\Kj^N_OK<5.0+4*8$=$9,;)7&=5IB9':)9-<4;7:886HIZXC=:79284688>6=7;?7;+;';(6#IDUhMX]O39"FO)u_ijIT<VM?VN?VP=\RC`WBbYKmckwj|pdm]W[WUR]VGfZFn_HjdOZORG:,4+7/7.6*9):,<+5"9-<4H:B9>9<<68;8=29*;-<56:6:86929688;=@8;,;(8$6'YZTVYRcK`x;qvYO];;=.23+;C1fGoJjMmRjGqKxUqWcZKe[Ke[Kd[Le[Mg_Jh_Hg^Mg]Lf\I`ZGQN=LH7SP>[ZF__OaYJL40=):*9+8*7*:+=/5?)7*9/496<6;5<648&9&:)>4986785<3>9>>@;8+:(:(7"~:*RJTI\Sn]sScB'258176/9909C0gKwQpSpOoIxUwY`Jh_Pi`Qi`Qi`Qh_PkbTjbSi`PibLibHhbK`ZFLJ6@E4@H8CJ>UM;XODF:,7%8):):(9);/698*;5@E>;61:59->*A+<'6)<5=7?6D9A9838*8'<)};(w3"A3SGZNYSYMAM+'2%7>2@:>3C3HAIEEA=/F2C1yA-:+<,=,8*:.;0?1<.6*7,<,;*{;,s9*v5(H;OBSNVWo_fvIGV4^kQKQ5:;#88/8B/iLwPpNrP}`fNbJbMi`Qi`Qh_PlcTkbSmbWlbUldOldPlbVmbUmcThaQVP@EA18A'K@>@NOimNJCB>A<9/=/<382;/;.:-|:.|:/{91{8/|9.z:.x9/u8.r6+o4*l2'v@6TLQMUMyeOZnJUmDM_:9C(89,;=34;089)Vd>tTx\r\ZC_IeL\GhaQibRjdSibRibRjbSkbSkbSlcTlcTmaTfZPspi}{j7>+3<(<=/?;.^B5HEAE>=4=,~>/9.:+:+:,~:/~:0{90y8/w9/v90t:.q6-n3+k4)e1%s=2RNYR_R_\HES;2?);E0BJ69A04;.49578,LW3rS{^`IZ~CaIaKX|GhbRibRkcSibRibRjbSkbSlcTlcTkbRe]S|ՠ|CJ25?+:72*0+Z?>XU9:@DBDABC?E;B:B8;,=,<+:+}9-}9/}:0|:1w:3s8/p6,o8-n7+n6/k4,g3*`.$p8/UQz\ONO>5@1/5,330.3+4>1;K80>.-2/54+AM/sYnTTu?Z|E_L_IWwHhcShcShcShcShcSjcSlcTmdUmdUlbQlje̝KO1=6)OHFqq=:@<@@>?B=@4fF9cJ5_M5iQYF*1(07,17-06,/3,-2-.3--2,,0+,3,)4--8-2>-2>*6C.DV;H]=^qRZlS,8.heVheVheVifWifWjeVlc\ngZhiQlupԼkS?.6*8,oA3r=7s?9sA;o?8n=6q94l:3d=2^>2P;+UP9]X=]]?nv\2@+27/28.39/28-/5,.3-.3-,1+*/)+0++3+*4,-5,7@59C43>,>J4\hTQ]O+4-gdUheVifWifWifWjeVnc\lhZflShwoìu]yH1e6"e3)j90l?4i>4h>2cA7_D5YG5e]GEF/9C'EI+ppR\`G29'7=57=37>48>38<57;66;5271.3-,1+(.(*.*,1,/2/=D==J81?(BP58>49?59@8;A;:>9:@:9=87;6062,1,+/.)-.)3)6J29L38I1;K8/;.\gO_iRgkWihXlfXlgYkf[hgYelY|ɾmgKRK-UO2SO3PN4LO6HO5EN.LS0]e@aeFVV=WTnXQI4I3et2v)38Yy>t(1uT1v7HngB6+&ymZ=st!LSRtN4 zHsfJ)vY{Ge$mB4KHN+$=v)cfWi1^{-05{!QtNufBSytulrvX(dE4GNv<= zSsv%H%;ZE09&_$JM>M(cAK(AZ@>@ZD%?jGCwTkJ>&@fUc5uJIMBq1Y}NYjIeCpt~0 zey^=QD6y*l!qu4*Ifj}Fl44Zr5F2<*$cRK{g7bZF?30X$eVy1f3dn?YeU<5kwL$_9 z3X%JfDIT+mwG$zD6CzcJRJr&=V3=<gYHddru4}3T*A}t9u@jh0H25&20{E6o=<+ zL8y6f*a&QfUlfniKKkQH<0NwK*9Xs%3j!okVvi{)VxTZRzv>@0_BI_u$8TxgirsFU zylOWB_<}r3tVl_X@B|Y0zN9@uQY5kEdFHmq{n~ESh$`;-9ly03MbU1wY3Y#A*&~KO zsLcuj)ot-3|$ZRltGaSVJBWBt`IoJ%M$aQp0HJM>ya=~F1|MxP{6x47+pl4)Xw04G4 z4kqJCnq}EEKlhAU)NXgX*RK={WH8ZM@=)IrR}&o1Ib?*C<5Y^X&QSKLo6{_T&@k(? zE@W57TIUupkw%$i7TEeIdk|NQU_|zsj!;4T4#Gn%~SV>nO4u|>s;nghCRZ5Fbi-lp?R3ES$9sh8=7ryD^Fo?l&hIRX3 zITaa#Mmi=0KjWg455O`F*5{uVx0g4I(HzD?2I17gryF%YNz*~XB@!ZE#_0sn7b)0! z#6^Db_$r^lmv(e9`thXEz5H+u7Nlcahq=T5lm(Cr_WSWy71Mu-v6nZSrIANg&(p57R5pJI^&d3b3MR*#?kOBDuaU_CkWke@9o8TCnJ`Q zs*jvZv0qS`>}T*0Tbc@DIh*BKX4;#OA)d%l37OR(d=j3F{`v9Z5HblGT`|bs09}fv z%cp&KL!J;zBJyb_nBi84Ca5@u0S?;=!e7>p-d$c_1a9knPAMo~Xv_xGC)ftWf*6A( znPy4VW(FNnZrNRT(6_eZ)}1He@zL?o3)k`EtJwfGL4SZr#2svc9{Q$-ejyIx8DwdK z1H>tpArc^H50S{m)9^+3BB&YF&hW1@>RWJ7&(e07q<9JzwYPA_m@At73TGV>0?i8c zu;Y9aJ`F=e4e7;$9D9fM5&D&ykM=Z@>LE~MERdv=gH_FZ)vXZAPQ|TgC5;)D`|<~3 zsgp;(>KREKkigog(SS-`+}WpG|IEpSEYbp!G}HM z?R&$6rtiKA45sN|L9xFJ9NR}4 z;rW^F=Qv-fK6FsS2hYR$#3e|?tD4+z9<<79HqJ>bcn z;NCXYM|k_ZxUZ`|SZt>ZZjHegsuHm%j$$-f6$fIBJq(Tkv48_C^xAhC=!mf&>;7{@XLVj$SmSSo8xcanJjcF?yt3>N%Y)8cc2|V3f+%7k5gBdSA&EMbz z221=u9FNUMY}-fQ5(lDWL}lmySWf7QT8wJO5#4!zQy2ZRMq3_n6j9QMrMQaC%9>%X zy9TAA(yFyTkjU+IIk=>YYCbxr^1@bCBiM@3G=myap>(kSaGyK${6dFF;Y$FK#mAfZ z<=ad3CV)?GxgZv^3W35G&!+dN!WVjZRiPPv{pV zQ6&zBbJ5k8Ec9-tc$j0X-m|z}nhKF6iIQ6Uqow@t;E8GDT*SI~X;J}}2jHSJL9tMU z$_`i-H>0i+fj=0P(0p`ltNRKL=&S}Qq@hBGKafH1{Ff!TzJ literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.pcx b/ImageMagick-6.9.12-44/PerlMagick/t/input.pcx new file mode 100644 index 0000000000000000000000000000000000000000..c9c0092b44f8d77fe702cce4e32bd07cd1496130 GIT binary patch literal 11613 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 AJpcdz literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.psd b/ImageMagick-6.9.12-44/PerlMagick/t/input.psd new file mode 100644 index 0000000000000000000000000000000000000000..49973f4cbbeafe5cd468979573e6eadaadd30144 GIT binary patch literal 9700 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.rle b/ImageMagick-6.9.12-44/PerlMagick/t/input.rle new file mode 100644 index 0000000000000000000000000000000000000000..fc9f7c6a83fa3424d0834a40e40f9665e1518efd GIT binary patch literal 10516 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 literal 0 HcmV?d00001 diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.sgi b/ImageMagick-6.9.12-44/PerlMagick/t/input.sgi new file mode 100644 index 0000000000000000000000000000000000000000..6a65180810a04c2291576bb299b0a238662bc682 GIT binary patch literal 11683 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